ZGlmZiAtLWdpdCBhLy5jdnNpZ25vcmUgYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI2YzMyLi4wMDAwMDAwCi0tLSBhLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0qLWFsbAotKi1jbwotKi1kaXJzCi0qLWRvbmUKLSotaW5zdGFsbC1pbmZvCi0qLXNyYwotKi1zdGFtcC0qCi0qLXRhZ2dlZAotYmxvY2tpdAotY2ZnLXBhcGVyLmluZm8KLWNvbmZpZy5zdGF0dXMKLWNvbmZpZ3VyZS5hdXgKLWNvbmZpZ3VyZS5jcAotY29uZmlndXJlLmNwcwotY29uZmlndXJlLmR2aQotY29uZmlndXJlLmZuCi1jb25maWd1cmUuZm5zCi1jb25maWd1cmUua3kKLWNvbmZpZ3VyZS5reXMKLWNvbmZpZ3VyZS5sb2cKLWNvbmZpZ3VyZS5wZwotY29uZmlndXJlLnBncwotY29uZmlndXJlLnRvYwotY29uZmlndXJlLnRwCi1jb25maWd1cmUudHBzCi1jb25maWd1cmUudnIKLWNvbmZpZ3VyZS52cnMKLWRpci5pbmZvCi1NYWtlZmlsZQotbG9zdCtmb3VuZApkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTQ5YmUuLjAwMDAwMDAKLS0tIGEvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQwKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCi1hIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCi1tZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgotdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCi1sYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCi10aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KLWlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCi1zb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKLWNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKLW5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKLWFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCi0gICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55Ci0gICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKLSAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5Ci0gICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAotICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KLSAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKLSAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKLSAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCi0gICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKLSAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAotICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KLSAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQwKLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotDAotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotDAotICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKLXRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKLWxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0gIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKLXRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCi1tYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwotb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLVBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAotUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLQkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL0NPUFlJTkcuTElCIGIvQ09QWUlORy5MSUIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWEzZDEuLjAwMDAwMDAKLS0tIGEvQ09QWUlORy5MSUIKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1bVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBHUEwuICBJdCBpcwotIG51bWJlcmVkIDIgYmVjYXVzZSBpdCBnb2VzIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBvcmRpbmFyeSBHUEwuXQotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQotZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgotCi0gIFRoaXMgbGljZW5zZSwgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCi1zcGVjaWFsbHkgZGVzaWduYXRlZCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUsIGFuZCB0byBhbnkKLW90aGVyIGxpYnJhcmllcyB3aG9zZSBhdXRob3JzIGRlY2lkZSB0byB1c2UgaXQuICBZb3UgY2FuIHVzZSBpdCBmb3IKLXlvdXIgbGlicmFyaWVzLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYKLXlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcwotb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoteW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQotY29kZS4gIElmIHlvdSBsaW5rIGEgcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCi1jb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQotd2l0aCB0aGUgbGlicmFyeSwgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCi1pdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotICBPdXIgbWV0aG9kIG9mIHByb3RlY3RpbmcgeW91ciByaWdodHMgaGFzIHR3byBzdGVwczogKDEpIGNvcHlyaWdodAotdGhlIGxpYnJhcnksIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwKLXBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgotCi0gIEFsc28sIGZvciBlYWNoIGRpc3RyaWJ1dG9yJ3MgcHJvdGVjdGlvbiwgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1saWJyYXJ5LiAgSWYgdGhlIGxpYnJhcnkgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsCi12ZXJzaW9uLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uCi10aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0MCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgY29tcGFuaWVzIGRpc3RyaWJ1dGluZyBmcmVlCi1zb2Z0d2FyZSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCB0aHVzIGluIGVmZmVjdAotdHJhbnNmb3JtaW5nIHRoZSBwcm9ncmFtIGludG8gcHJvcHJpZXRhcnkgc29mdHdhcmUuICBUbyBwcmV2ZW50IHRoaXMsCi13ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MKLWZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aGljaCB3YXMgZGVzaWduZWQgZm9yIHV0aWxpdHkgcHJvZ3JhbXMuICBUaGlzCi1saWNlbnNlLCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluCi1kZXNpZ25hdGVkIGxpYnJhcmllcy4gIFRoaXMgbGljZW5zZSBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkKLW9uZTsgYmUgc3VyZSB0byByZWFkIGl0IGluIGZ1bGwsIGFuZCBkb24ndCBhc3N1bWUgdGhhdCBhbnl0aGluZyBpbiBpdCBpcwotdGhlIHNhbWUgYXMgaW4gdGhlIG9yZGluYXJ5IGxpY2Vuc2UuCi0KLSAgVGhlIHJlYXNvbiB3ZSBoYXZlIGEgc2VwYXJhdGUgcHVibGljIGxpY2Vuc2UgZm9yIHNvbWUgbGlicmFyaWVzIGlzIHRoYXQKLXRoZXkgYmx1ciB0aGUgZGlzdGluY3Rpb24gd2UgdXN1YWxseSBtYWtlIGJldHdlZW4gbW9kaWZ5aW5nIG9yIGFkZGluZyB0byBhCi1wcm9ncmFtIGFuZCBzaW1wbHkgdXNpbmcgaXQuICBMaW5raW5nIGEgcHJvZ3JhbSB3aXRoIGEgbGlicmFyeSwgd2l0aG91dAotY2hhbmdpbmcgdGhlIGxpYnJhcnksIGlzIGluIHNvbWUgc2Vuc2Ugc2ltcGx5IHVzaW5nIHRoZSBsaWJyYXJ5LCBhbmQgaXMKLWFuYWxvZ291cyB0byBydW5uaW5nIGEgdXRpbGl0eSBwcm9ncmFtIG9yIGFwcGxpY2F0aW9uIHByb2dyYW0uICBIb3dldmVyLCBpbgotYSB0ZXh0dWFsIGFuZCBsZWdhbCBzZW5zZSwgdGhlIGxpbmtlZCBleGVjdXRhYmxlIGlzIGEgY29tYmluZWQgd29yaywgYQotZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeSwgYW5kIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi10cmVhdHMgaXQgYXMgc3VjaC4KLQotICBCZWNhdXNlIG9mIHRoaXMgYmx1cnJlZCBkaXN0aW5jdGlvbiwgdXNpbmcgdGhlIG9yZGluYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGZvciBsaWJyYXJpZXMgZGlkIG5vdCBlZmZlY3RpdmVseSBwcm9tb3RlIHNvZnR3YXJlCi1zaGFyaW5nLCBiZWNhdXNlIG1vc3QgZGV2ZWxvcGVycyBkaWQgbm90IHVzZSB0aGUgbGlicmFyaWVzLiAgV2UKLWNvbmNsdWRlZCB0aGF0IHdlYWtlciBjb25kaXRpb25zIG1pZ2h0IHByb21vdGUgc2hhcmluZyBiZXR0ZXIuCi0KLSAgSG93ZXZlciwgdW5yZXN0cmljdGVkIGxpbmtpbmcgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgd291bGQgZGVwcml2ZSB0aGUKLXVzZXJzIG9mIHRob3NlIHByb2dyYW1zIG9mIGFsbCBiZW5lZml0IGZyb20gdGhlIGZyZWUgc3RhdHVzIG9mIHRoZQotbGlicmFyaWVzIHRoZW1zZWx2ZXMuICBUaGlzIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0bwotcGVybWl0IGRldmVsb3BlcnMgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgdG8gdXNlIGZyZWUgbGlicmFyaWVzLCB3aGlsZQotcHJlc2VydmluZyB5b3VyIGZyZWVkb20gYXMgYSB1c2VyIG9mIHN1Y2ggcHJvZ3JhbXMgdG8gY2hhbmdlIHRoZSBmcmVlCi1saWJyYXJpZXMgdGhhdCBhcmUgaW5jb3Jwb3JhdGVkIGluIHRoZW0uICAoV2UgaGF2ZSBub3Qgc2VlbiBob3cgdG8gYWNoaWV2ZQotdGhpcyBhcyByZWdhcmRzIGNoYW5nZXMgaW4gaGVhZGVyIGZpbGVzLCBidXQgd2UgaGF2ZSBhY2hpZXZlZCBpdCBhcyByZWdhcmRzCi1jaGFuZ2VzIGluIHRoZSBhY3R1YWwgZnVuY3Rpb25zIG9mIHRoZSBMaWJyYXJ5LikgIFRoZSBob3BlIGlzIHRoYXQgdGhpcwotd2lsbCBsZWFkIHRvIGZhc3RlciBkZXZlbG9wbWVudCBvZiBmcmVlIGxpYnJhcmllcy4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCi0id29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQotZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGlsZSB0aGUgbGF0dGVyIG9ubHkKLXdvcmtzIHRvZ2V0aGVyIHdpdGggdGhlIGxpYnJhcnkuCi0KLSAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIGxpYnJhcnkgdG8gYmUgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmF0aGVyIHRoYW4gYnkgdGhpcyBzcGVjaWFsIG9uZS4KLQwKLQkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgd2hpY2gKLWNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvciBvdGhlciBhdXRob3JpemVkCi1wYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpYnJhcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4gIEVhY2ggbGljZW5zZWUgaXMKLWFkZHJlc3NlZCBhcyAieW91Ii4KLQotICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCi1wcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKLSh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCi0KLSAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKLXdoaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCi1jb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQotcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAotc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcwotaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKLQotICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucwotYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKLWludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgotYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQotICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQotc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgotd3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcwotYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCi0gIAotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKLWNvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Ci15b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgotYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKLWFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Ci13YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQotTGlicmFyeS4KLQotICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAotYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQotZmVlLgotDAotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCi0gICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKLSAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCi0gICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQotICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAotICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgotICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCi0gICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgotCi0gICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKLSAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCi0gICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKLSAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAotICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCi0gICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKLQotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQotaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKLXdpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KLXRoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KLXRoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKLWluc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKLW9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKLXRoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KLXRoZXNlIG5vdGljZXMuCi0MCi0gIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKLXRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCi1zdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgotCi0gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgotdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgotCi0gIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCi1kZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQotdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Ci1pdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCi1tdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KLQotICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKLXNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQotTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgotbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKLXdvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKLXRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQotY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Ci1jb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQotbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi1TZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KLQotICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQotdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCi1kZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KLVdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCi1saW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQotdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KLQotICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQotc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCi1mdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCi13b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQotTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKLQotICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQotZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCi1BbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKLXdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KLQwKLSAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbXBpbGUgb3IKLWxpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCi13b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawotdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAotbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCi1lbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KLQotICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKLUxpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQotdGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yawotZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKLWNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKLWRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKLW9mIHRoZXNlIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCi0gICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCi0gICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKLSAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAotICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAotICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCi0gICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKLSAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAotICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQotICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCi0KLSAgICBiKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAotICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscwotICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKLSAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCi0KLSAgICBjKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQotICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KLQotICAgIGQpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQotICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgotCi0gIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQotTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKLXJlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAotdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseQotZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCi1jb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCi13aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCi10aGUgZXhlY3V0YWJsZS4KLQotICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQotcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQotYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAotdXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQotZGlzdHJpYnV0ZS4KLQwKLSAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKLWZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKLWxpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgotdGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCi1wZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKLSAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5Ci0gICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gICAgU2VjdGlvbnMgYWJvdmUuCi0KLSAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAotICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCi0gICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgotCi0gIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCi10aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQotYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKLXJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKLW9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKLXRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQotc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQwKLSAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCi1hbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKLWFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAotc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCi1leGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgotd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgotU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAotYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5Ci1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKLSJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKLWxpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotDAotICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCi13cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcwotY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKLWRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKLW9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCi1hbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KLVdBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCi1FWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgotT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKLUtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKLUxJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCi1USEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KLVdSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCi1BTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQotRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKLUxJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKLVJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCi1GQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCi1TVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi1EQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0gICAgIEFwcGVuZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0Ci1ldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKLXJlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCi0KLSAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcwotc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQotImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAotICAgIE1BIDAyMTExLTEzMDcsIFVTQQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKLSAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAxYzljMC4uMDAwMDAwMAotLS0gYS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw2NTQxICswLDAgQEAKLTE5OTktMDUtMjQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IEVHQ1MgdmVyc2lvbi4KLQotMTk5OS0wNC0zMCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBsdG1haW4uc2g6IFttb2RlIGxpbmtdIEFsd2F5cyB1c2UgQ0MgZ2l2ZW4gYnkgbHRjb25maWcuCi0KLTE5OTktMDQtMjMgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWcsIGx0bWFpbi5zaDogVXBkYXRlIHRvIGxpYnRvb2wgMS4yZi4KLQotMTk5OS0wNC0yMCAgRHJldyBNb3NlbGV5ICA8ZG1vc2VsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEb24ndCBidWlsZCBsaWJzdHViIGZvciBhcm0tZWxmIHRhcmdldHMuCi0JKG5vY29uZmlnZGlycyk6IERvbid0IGJ1aWxkIGFueSBic3Agc3R1ZmYgZm9yIGZvciBhcm0tb2FiaSB0YXJnZXRzLgotCUJhZCBtZXJnZSByZW1vdmVkIHRoZXNlIHR3byBjaGFuZ2VzLgotCi0xOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGk/ODYtKi1iZW9zKik6IERvIGNvbmZpZyBncGVyZjsgZG9uJ3QgY29uZmlnCi0JZ2RiLCBuZXdsaWIsIG9yIGxpYmdsb3NzLgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBZGQgc3VwcG9ydCBmb3IgbWNvcmUgdGFyZ2V0cy4KLQotMTk5OS0wNC0wNyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qKTogVXNlIGNvbmZpZy9tdC1kMzB2IGFzIG1ha2VmaWxlIGZyYWdtZW50LAotCW5vdCBtdC1vc3BhY2UsIGluIG9yZGVyIHRvIHNodXQgdXAgYXNzZW1ibGVyIHdhcm5pbmcgYWJvdXQgdXNpbmcKLQlzeW1ib2xzIHRoYXQgYXJlIG5hbWVkIHRoZSBzYW1lIGFzIHJlZ2lzdGVycy4KLQotMTk5OS0wNC0wNyAgRHJldyBNb3NlbGV5ICA8ZG1vc2VsZXlAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtY3lnbW9uKTogQWRkZWQgYWxsLXRhcmdldC1ic3AgdG8gdGhlCi0JZGVwZW5kZW5jeSBsaXN0IGZvciBhbGwtdGFyZ2V0LWN5Z21vbi4KLQotMTk5OS0wNC0wNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW46IENoZWNrICRob3N0LCBub3QgJHRhcmdldCwgZm9yIHNlbGVjdGl2ZSBtdWx0aWxpYnMuCi0JKGFybS0qLSopOiBBbGxvdyBkaXNhYmxpbmcgb2YgYmllbmRpYW4sIGgvdyBmcCwgMjYgYml0IGFwY3MsCi0JdGh1bWIgaW50ZXJ3b3JraW5nLCBhbmQgdW5kZXJzY29yZSBwcmVmaXggbXVsdGlsaWJzLgotCi0xOTk5LTA0LTA0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbWlzc2luZzogVXBkYXRlIHRvIHZlcnNpb24gZnJvbSBjdXJyZW50IGF1dG9tYWtlLgotCi1GcmkgQXByICAyIDE1OjExOjMyIDE5OTkgIEguSi4gTHUgIChoamxAZ251Lm9yZykKLQotCSogY29uZmlndXJlIChneHhfaW5jbHVkZV9kaXIpOiBSZW1vdmVkLgotCi0JKiBjb25maWd1cmUuaW4gKGd4eF9pbmNsdWRlX2Rpcik6IEhhbmRsZSBpdC4KLQkqIE1ha2VmaWxlLmluOiBMaWtld2lzZS4KLQotMTk5OS0wMy0yOSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKG1pcHM2NHZyNDExMSxtaXBzNjR2cjQxMTFlbCkgQWRkLgotCi0xOTk5LTAzLTIxICBCZW4gRWxsaXN0b24gIDxiamVAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy5ndWVzczogQ29ycmVjdCB0eXBvIGZvciBkZXRlY3RpbmcgRUxGIG9uIEZyZWVCU0QuCi0KLVRodSBNYXIgMTggMDA6MTc6NTAgMTk5OSAgTWFyayBFbGJyZWNodCA8c25vd2JhbGwzQHVzYS5uZXQ+Ci0KLQkqIGNvbmZpZy9taC1nbzMyOiBEZWxldGUuCi0JKiBjb25maWcvbWgtZGpncHA6IE5ldy4gUmVuYW1lZCBmcm9tIG1oLWdvMzIuCi0JKiBjb25maWd1cmUuaW4gKHBjLW1zZG9zZGpncHApOiBTZXQgaG9zdF9tYWtlZmlsZV9mcmFnIHRvCi0JY29uZmlnL21oLWRqZ3BwLgotCi1UaHUgTWFyIDExIDE4OjM3OjIzIDE5OTkgIERyZXcgTW9zZWxleSAgPGRtb3NlbGV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWJzcCk6IEFkZGVkIGFsbC1nY2MgYWxsLWJpbnV0aWxzIGFuZAotCWFsbC10YXJnZXQtbmV3bGliIHRvIGRlcGVuZGVuY3kgbGlzdCBmb3IgYWxsLXRhcmdldC1ic3AuCi0KLVRodSBNYXIgMTEgMDE6MTk6MzEgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBpMzg2LXV3aW4gc3VwcG9ydC4KLQkqIGNvbmZpZy5ndWVzczogTGlrZXdpc2UuCi0KLVRodSBNYXIgMTEgMDE6MDc6NTUgMTk5OSAgRnJhbnogU2lybCA8RnJhbnouU2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogY2xlYW51cCwgYWRkIG1oLSpwaWMgaGFuZGxpbmcgZm9yIGFybSwgc3BlY2lhbAotCWNhc2UgcG93ZXJwYyotKi1haXgqCi0KLVdlZCBNYXIgMTAgMTg6MzU6MDcgMTk5OSAgSmVmZiBKb2huc3RvbiAgPGpqb2huc3RuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogUmVtb3ZlZCB0YXJnZXQtbGliZ2xvc3Mgc28gbGlibm9zeXMuYQotCWNhbiBiZSBidWlsdC4KLQotV2VkIE1hciAxMCAxNzozOTowOSAxOTk5ICBEcmV3IE1vc2VsZXkgIDxkbW9zZWxleUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIGJzcCBzdXBwb3J0IHRvIGFybS0qLWNvZmYgYW5kIGFybS0qLWVsZgotIAl0YXJnZXRzLgotCi0xOTk5LTAzLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZW5hbWUgQ1lHTlVTIExPQ0FMIHRvIEVHQ1MgTE9DQUwKLQotU3VuIEZlYiAyOCAwMjoyMDowMCAxOTk5ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBDaGVjayBmb3IgImN5Z3dpbioiIHJhdGhlciB0aGFuICJjeWd3aW4zMioiCi0KLTE5OTktMDItMjQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEZpeCB0eXBvIGluIGFybSByZWNvZ25pdGlvbi4KLQotV2VkIEZlYiAyNCAxMzo1MTo0MCAxOTk5ICBEcmV3IE1vc2VsZXkgIDxkbW9zZWxleUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IENoYW5nZWQgdGFyZ2V0X2NvbmZpZ2RpcnMgdG8KLQlpbmNsdWRlIHRhcmdldC1ic3Agb25seSBmb3IgbTY4ay0qLWVsZiogYW5kIG02OGstKi1jb2ZmKgotCXJhdGhlciB0aGFuIG02OGstKi0qIHNpbmNlIGl0IGlzIG5vdCBrbm93biB0byB3b3JrIG9uCi0JbTY4ay1hb3V0LiBEaXR0byBmb3IgYXJtLSotKm9hYmkuCi0KLVdlZCBGZWIgMjQgMTI6NTI6MTcgMTk5OSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKCotKi13aW5kb3dzKik6IFJlbW92ZSwgbm8gbG9uZ2VyIHVzZWQuCi0JKiBjb25maWcvbWgtd2luZG93czogRGl0dG8uCi0KLTE5OTktMDItMTkgIEJlbiBFbGxpc3RvbiA8YmplQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogQXV0b21hdGljYWxseSByZWNvZ25pc2UgRUxGIG9uIEZyZWVCU0QuIEZyb20gTmlhbGwKLQlTbWFydCBhbmQgaW1wcm92ZWQgYnkgQW5kcmV3IENhZ25leS4KLQotVGh1IEZlYiAxOCAxOTo1NTowOSAxOTk5ICBNYXJjIEVzcGllIDxlc3BpZUBjdnMub3BlbmJzZC5vcmc+Ci0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIG9wZW5ic2QtKi1ocHBhLgotCi1XZWQgRmViIDE3IDAxOjM4OjU5IDE5OTkgIEguSi4gTHUgIChoamxAZ251Lm9yZykKLQotCSogTWFrZWZpbGUuaW4gKFJFQUxMWV9TRVRfTElCX1BBVEgpOiBBcHBlbmQgJCQkKFJQQVRIX0VOVlZBUikKLQlvbmx5IGlmIGl0IGlzIG5vdCBlbXB0eS4KLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVBhdGNoIGZyb206IFNjb3R0IEJhbWJyb3VnaCA8c2NvdHRiQGNvcmVsY29tcHV0ZXIuY29tPgotCQotCSogY29uZmlnLmd1ZXNzOiBNb2RpZmllZCB0byByZWNvZ25pemUgdW5hbWUncyBhcm12KiBzeW50YXguIAotCi0JKiBjb25maWcuc3ViOiBNb2RpZmllZCB0byByZWNvZ25pemUgdW5hbWUncyBhcm12KiBzeW50YXguCi0KLTE5OTktMDItMTcgIE1hcmsgU2FsdGVyICA8bXNhbHRlckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIHRhcmdldC1ic3AgZm9yIHNwYXJjbGl0ZS4KLQotTW9uIEZlYiAgOCAxNDoxNzoyNCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgYWxwaGFwY2E1WzY3XSBhbmQgdXAgdG8gYWxwaGFldjguCi0KLTE5OTktMDItMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIHN0cm9uZ2FybSBwb3J0LgotCSogY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIHN0cm9uZ2FybSB0YXJnZXQuCi0KLVN1biBGZWIgIDcgMTg6MDE6NTQgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0JCi0JKiBjb25maWd1cmUuaW4gKCotKi1jeWd3aW4zMiopOiBVc2UgY29uZmlnL21oLWN5Z3dpbiBpbnN0ZWFkIG9mCi0JdGhlIG9sZCBuYW1lIGNvbmZpZy9taC1jeWd3aW4zMi4KLQlFbmFibGUgdGV4aW5mby4KLQotVGh1IEZlYiAgNCAyMDo0MzoyNSAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gYnVpbGQgbGQgZm9yIGl4ODYgU29sYXJpcy4KLQotVHVlIEZlYiAgMiAxOTo0Njo0MCAxOTk5ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChFWFRSQV9HQ0NfRkxBR1MpOiAgU2V0IEFSIHRvICRBUiBpbnN0ZWFkIG9mCi0JJEFSX0ZPUl9UQVJHRVQuICBMaWtld2lzZSBmb3IgUkFOTElCLgotCi1UdWUgRmViICAyIDIwOjA1OjA1IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotIAotICAgICAgICAqIGNvbmZpZy5zdWIgKG9hYmkpOiAgUmVjb2duaXplLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoYXJtLSotb2FiaSk6ICBIYW5kbGUuCi0KLVNhdCBKYW4gMzAgMDY6MDk6MDAgMTk5OSAgUm9iZXJ0IExpcGUgIChyb2JlcnRsaXBlQHVzYS5uZXQpCi0KLQkqIGNvbmZpZy5ndWVzczogSW1wcm92ZSBkZXRlY3Rpb24gb2YgaTY4NiBvbiBVbml4V2FyZSA3LgotCi1TYXQgSmFuIDMwIDA4OjA0OjAwIDE5OTkgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjb25maWcuZ3Vlc3M6IEFkZCBzdXBwb3J0IGZvciBpMzg2LXBjLWludGVyaXguCi0JKiBjb25maWcuc3ViOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0JKiBjb25maWcvbWgtaW50ZXJpeDogTmV3IGZpbGUuCi0KLU1vbiBKYW4gMTggMTM6NTk6MjAgMTk5OSAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSB1bm5lZWRlZCBhbGwtdGFyZ2V0LWxpYmlvIGZyb20KLQlmcm9tIGFsbC10YXJnZXQtd2luc3VwIHRhcmdldCBzaW5jZSBpdCBpcyBub3cgdW5uZWVkZWQuCi0JQWRkIGFsbC10YXJnZXQtbGlidGVybWNhcCBpbiBpdHMgcGxhY2Ugc2luY2UgaXQgaXMgbm93Ci0JbmVlZGVkLgotCi1XZWQgRGVjIDMwIDIwOjM0OjUyIDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogbWFrZWZpbGUgc3R1YiBmb3IgY3lnd2luIHRhcmdldCBpcyBwcm9iYWJseQotCXVubmVjZXNzYXJ5LiAgUmVtb3ZlIGl0IGZvciBub3cuCi0JKiBjb25maWcvbXQtY3lnd2luOiBSZW1vdmUuCi0KLVdlZCBEZWMgMzAgMDE6MTM6MDMgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBsaWJ0ZXJtY2FwLmEgc2hvdWxkIGJlIGJ1aWx0IHdoZW4gY3lnd2luIGlzIHRoZQotCXRhcmdldCBhcyB3ZWxsIGFzIHRoZSBob3N0LgotCSogY29uZmlnLmd1ZXNzOiBBbGxvdyBtaXhlZCBjYXNlIGluIGN5Z3dpbiB1bmFtZSBvdXRwdXQuCi0JKiBNYWtlZmlsZS5pbjogQWRkIGxpYnRlcm1jYXAgdGFyZ2V0LgotCSogY29uZmlnL210LWN5Z3dpbjogTmV3IGZpbGUuICBsaWJ0ZXJtY2FwIHRhcmdldCBpbmZvLgotCi1UdWUgRGVjIDE1IDE3OjAyOjU4IDE5OTggIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBjeWdtb24gZm9yIHg4Ni1jb2ZmIGFuZCB4ODYtZWxmLiBDb25maWd1cmUKLSAJY3lnbW9uIGZvciBhbGwgc3BhcmNsaXRlIHRhcmdldHMsIHJlZ2FyZGxlc3Mgb2Ygb2JqZWN0IGZvcm1hdC4KLQotMTk5OC0xMi0xNSAgTWFyayBTYWx0ZXIgIDxtc2FsdGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgdGFyZ2V0LWJzcCBmb3Igc2V2ZXJhbCB0YXJnZXQgYXJjaGl0ZWN0dXJlcy4KLQotCSogTWFrZWZpbGUuaW46IEFkZGVkIHJ1bGVzIGZvciBic3AuCi0KLVdlZCBEZWMgMjMgMDA6MjA6NTAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBDbGVhbiB1cCBoYW5kbGluZyBvZiBocHBhMi4wLgotCi1UdWUgRGVjIDIyIDIzOjU2OjMxIDE5OTggIFJvZG5leSBCcm93biAgKHJvZG5leWJyb3duQHBtc2MuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFVzZSBDIGNvZGUgdG8gaWRlbnRpZnkgbW9yZSBIUCBtYWNoaW5lcy4KLQotVGh1IERlYyAxNyAwMToyMjozMCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEhhbmRsZSBocHBhMi4wLgotCi1GcmkgRGVjICA0IDAxOjM0OjAyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBJbXByb3ZlIGRldGVjdGlvbiBvZiBocHBhMi4wIHByb2Nlc3NvcnMuCi0KLUZyaSBEZWMgIDQgMDE6MzM6MDUgMTk5OCAgTmlhbGwgU21hcnQgPG5pYWxsc0BldXJpc3RpeC5pZT4KLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgRnJlZUJTRCB1c2luZyBFTEYgYXV0b21hdGljYWxseS4KLQotMTk5OC0xMS0yNiAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWd1cmUgKHNraXAtdGhpcy1kaXIpOiBBZGQgaGFuZGxpbmcgZm9yIG5ldyBzaGVsbCBzY3JpcHQsIHdoaWNoCi0JbWlnaHQgYmUgY3JlYXRlZCBieSBhIHN1Yi1kaXJlY3RvcnkncyBjb25maWd1cmUgdG8gaW5kaWNhdGUsIHRoaXMgcGFydGljdWxhcgotCWRpcmVjdG9yeSBpcyAidW53YW50ZWQiLgotCSogTWFrZWZpbGUuaW4gKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6IExpa2V3aXNlLgotCi0KLVdlZCBOb3YgMTggMTg6Mjg6NDUgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWc6IGltcG9ydCBmcm9tIGxpYnRvb2wsIGFmdGVyIGNoYW5naW5nIGxpYnRvb2wgdG8KLQlhY2NvdW50IGZvciB0aGUgY3lnd2luIG5hbWUgY2hhbmdlLgotCi1XZWQgTm92IDE4IDE4OjA5OjE0IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBDQ19GT1JfVEFSR0VUIGFuZCBDWFhfRk9SX1RBUkdFVCBzaG91bGQgYWxzbwotCWluY2x1ZGUgbmV3bGliL2xpYmMvc3lzL2N5Z3dpbiBhbmQgbmV3bGliL2xpYmMvc3lzL2N5Z3dpbjMyLgotCi1XZWQgTm92IDE4IDIwOjEzOjI5IDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGxpYnRlcm1jYXAgdG8gbGlzdCBvZiBjeWd3aW4gZGVwZW5kZW5jaWVzLgotCi1UdWUgTm92IDE3IDE2OjU3OjUxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogbW9kaWZ5IENDX0ZPUl9UQVJHRVQgYW5kIENYWF9GT1JfVEFSR0VUIHNvIHRoYXQKLSAgICAgICAgdGhleSBpbmNsdWRlIHdpbnN1cC9pbmNsdWRlIHdoZW4gaXQncyBhIGN5Z3dpbiB0YXJnZXQuCi0KLTE5OTgtMTEtMTIgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQWRkZWQgemlwLgotCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtbGliamF2YSk6IERlcGVuZCBvbiBhbGwtemlwLgotCShhbGwtemlwKTogTmV3IHRhcmdldC4KLQkoQUxMX01PRFVMRVMpOiBBZGRlZCBhbGwtemlwLgotCShOQVRJVkVfQ0hFQ0tfTU9EVUxFUyk6IEFkZGVkIGNoZWNrLXppcC4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQWRkZWQgaW5zdGFsbC16aXAuCi0JKENMRUFOX01PRFVMRVMpOiBBZGRlZCBjbGVhbi16aXAuCi0KLVRodSBOb3YgMTIgMTc6Mjc6MjEgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IGxvc2UgIjMyIiBmcm9tIGNvbW1lbnQgYWJvdXQgY3lnd2luLgotCi1UaHUgTm92ICA1IDE1OjAwOjMxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIC1PcyB0byBidWlsZCB0YXJnZXQgbGlicmFyaWVzIGZvciB0aGUgZnIzMC4KLQotV2VkIE5vdiAgNCAxODo0OTo0MyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBmcjMwLgotCi1Nb24gTm92ICAyIDE1OjE5OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IGRyb3AgIjMyIiBmcm9tIGNvbmZpZy9taC1jeWd3aW4zMi4gIENoZWNrCi0JY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKi4KLQkqIGNvbmZpZy5zdWI6IENoZWNrIGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMiouCi0KLTE5OTgtMTAtMjAgIFN5ZCBQb2xrICA8c3BvbGtAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gY29uZmlndXJlLmluOiBBZGQgdGhlIGFiaWxpdHkgdG8gdXNlIHRjbDguMSBhbmQgdGs4LjEKLQlpZiBkZXNpcmVkLgotCi1TdW4gT2N0IDE4IDE4OjM0OjUwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmlmIChjeHhfaW50ZXJmYWNlLCBsaWJzdGRjeHhfaW50ZXJmYWNlKTogRG8gbm90IHRyeSB0byBzZXQKLQl0aGVzZSBpZiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMgYW5kIGZpbGVzIHRvIG5vdCBleGlzdC4KLQotV2VkIE9jdCAxNCAxMDoyOTowNiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBBZGQgY29uZmlnLmlmLgotCi1UdWUgT2N0IDEzIDA5OjE3OjA2IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQnJpbmcgYmFjayBsb3N0IHNwYXJjdjkuCi0KLVdlZCBTZXAgMzAgMjI6MjA6NTAgMTk5OCAgUm9iZXJ0IExpcGUgIDxyb2JlcnRsQGRnaWkuY29tPgotCi0JKiBjb25maWcuc3ViOiBBZGQgc3VwcG9ydCBmb3IgaVszNDU2N104Ni1wYy11ZGsuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCi1XZWQgU2VwIDMwIDE5OjIzOjQ4IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBhZGQgYnppcDIgcGFja2FnZSBidWlsZGluZyBiaXRzIGZvciB1c2VyCi0JdG9vbHMgbW9kdWxlCi0JKiBjb25maWd1cmUuaW46IGRpdHRvCi0KLTE5OTgtMDktMzAgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSAqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X3N1YmRpcik6IFJlbW92ZSBkdXBsaWNhdGUgbGluZS4KLQotVHVlIFNlcCAyOSAyMjo0NTo0MSAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtYXV0b21ha2UpOiBmaXggZGVwZW5kZW5jaWVzLgotCi1Nb24gU2VwIDI4IDA0OjA0OjI3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBNaW5vciBjbGVhbnVwcyBmb3IgYnVpbGRpbmcgaW4gdGhlICQodGFyZ2V0X2FsaWFzKQotCXN1YmRpci4KLQotMTk5OC0wOS0yMiAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYm9vdHN0cmFwKTogU2V0IHIgYW5kIHMgYmVmb3JlIG1ha2UgYWxsLiAgVXNlCi0JQkFTRV9GTEFHU19UT19QQVNTIGluIG1ha2UgYWxsLgotCShjcm9zcyk6IExpa2V3aXNlLgotCi0xOTk4LTA5LTIwICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYm9vdHN0cmFwKTogUGFzcyBUQVJHRVRfRkxBR1NfVE9fUEFTUyB0byBgbWFrZSBhbGwnLgotCi0KLVN1biBTZXAgMjAgMDA6MTM6MDIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogRml4IHR5cG8gaW4gbGFzdCBjaGFuZ2UuCi0KLTE5OTgtMDktMTkgIE1pY2hhZWwgSGF5ZXMgIDxtLmhheWVzQGVsZWMuY2FudGVyYnVyeS5hYy5uej4KLQotCSogY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIEM0eCB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCi0xOTk4LTA5LTEzICBEYXZpZCBTLiBNaWxsZXIgIDxkYXZlbUBwaWVyZG9sLmNvYmFsdG1pY3JvLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIHNwYXJjdjkganVzdCBsaWtlIHNwYXJjNjQuCi0KLVdlZCBTZXAgIDkgMTU6NDQ6NTIgMTk5OCAgUm9iZXJ0IExpcGUgIDxyb2JlcnRsQGRnaWkuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IE1hdGNoICJQZW50IElJIiBvciAiUGVudElJIiBmb3IgT3BlblNlcnZlci4KLQotVHVlIFNlcCAgOCAwMToxODozOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogQ29ycmVjdGx5IGlkZW50aWZ5IFBlbnRpdW0gSUkgc2NvIGJveGVzLgotCi0JKiBjb25maWcuZ3Vlc3M6IEZpeCAidHIiIGNvZGUuICBGcm9tIFdlaXdlbiBMaXUuCi0KLVNhdCBTZXAgIDUgMTM6NTY6NTIgMTk5OCAgSm9obiBIdWdoZXMgIDxqb2huQENhbHZhLkNPTT4KLQotCSogY29uZmlndXJlLmluOiBEbyBub3QgYXNzdW1lIHg4Ni1zdnI0IG9yIHg4Ni11bml4d2FyZSBjYW4gaGFuZGxlCi0Jc3RhYnMuCi0KLVNhdCBTZXAgIDUgMDI6MTI6MDIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVEFSR0VUX0NPTkZJR0RJUlMpOiBBZGQgbGliY2hpbGwuCi0JKEFMTF9UQVJHRVRfTU9EVUxFUyk6IEFkZCBhbGwtdGFyZ2V0LWxpYmNoaWxsLgotCShDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMsIENIRUNLX1RBUkdFVF9NT0RVTEVTKTogU2ltaWxhcmx5LgotCShJTlNUQUxMX1RBUkdFVF9NT0RVTEVTLCBDTEVBTl9UQVJHRVRfTU9EVUxFUyk6IFNpbWlsYXJseS4KLQkoYWxsLXRhcmdldC1saWJjaGlsbCk6IEFkZCBkZXBlbmRlbmNpZXMuCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9saWJzKTogQWRkIGxpYmNoaWxsLgotCi1TdW4gQXVnIDMwIDIyOjI3OjAyIDE5OTggIEx1dHogV29obHJhYiA8bHV0ei53b2hscmFiQGluZm9ybWF0aWsudHUtY2hlbW5pdHouZGU+Ci0KLQkqIGNvbmZpZy5ndWVzczogQXZvaWQgYXNzdW1wdGlvbnMgYWJvdXQgInRyIiBiZWhhdmVzIHdoZW4KLQlMQU5HIGlzIHNldCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBFbmdsaXNoLgotCi1TdW4gQXVnIDMwIDIyOjE0OjQ0IDE5OTggIEguSi4gTHUgIChoamxAZ251Lm9yZykKLQotCSogY29uZmlndXJlIChneHhfaW5jbHVkZV9kaXIpOiBDaGFuZ2VkIHRvCi0JJyR7cHJlZml4fS9pbmNsdWRlL2crKyctJHtsaWJzdGRjeHhfaW50ZXJmYWNlfS4KLQotCSogY29uZmlnLmlmOiBOZXcgdG8gZGV0ZXJtaW5lIHRoZSBpbnRlcmZhY2VzLgotCi1TdW4gQXVnIDMwIDIxOjE1OjE5IDE5OTggIE1hcmsgS2xlaW4gKG1rbGVpbkBkaXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IERldGVjdCBhbmQgaGFuZGxlIE1QRS9JWC4KLQkqIGNvbmZpZy5zdWI6IERlYWwgd2l0aCBNUEUvSVguCi0KLVNhdCBBdWcgMjkgMTQ6MzI6NTUgMTk5OCAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBtaHBjYy5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIG1oLWFpeDQzLgotCi0xOTk4LTA3LTI5ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZ3VyZTogRml4IC0td2l0aG91dC8tLWRpc2FibGUgY2FzZXMgZm9yIGd4eC1pbmNsdWRlLWRpci4KLQotRnJpIEF1ZyAyOCAxMjoyODoyNiAxOTk4ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAY3lnbnVzLmNvbT4KLQotCSogbWRhdGEtc2g6ICBJbXBvcnRlZC4gIE5lZWRlZCBmb3IgYXV0b21ha2Ugc3VwcG9ydC4KLQotVGh1IEF1ZyAxMyAxMjo0OToyOSAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBUcnkgImNobW9kIC1SIG9nPXUgLiIgYmVmb3JlIAotCSJjaG1vZCBvZz11IGBmaW5kIC4gLXByaW50YCIuCi0KLUZyaSBKdWwgMzEgMDk6Mzg6MzMgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IEFkZCBhcm0tZWxmIGFuZCB0aHVtYi1lbGYgc3VwcG9ydC4KLQotTW9uIEp1bCAyNyAxNjoyMzo1OCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogVW5kbyBwcmV2aW91cyBwYXRjaC4KLQotRnJpIEp1bCAyNCAxOTo1NToyNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9UQVJHRVQpOiBNb3ZlIEVYVFJBX1RBUkdFVF9IT1NUX0lOU1RBTExfTU9EVUxFUwotCXRvIGhlcmUgLi4uCi0JKGluc3RhbGwtbm8tZml4ZWRpbmNsdWRlcyk6IGFuZCBoZXJlCi0JKElOU1RBTExfTU9EVUxFUyk6IC4uLiBmcm9tIGhlcmUuCi0KLUZyaSBKdWwgMjQgMTc6MDE6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBNZXJnZSB3aXRoIEZTRi4KLQotCSogY29uZmlnLmd1ZXNzOiBNZXJnZSB3aXRoIEZTRi4KLQotRnJpIEp1bCAyNCAwODo0MzozNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUgKGV4dHJhY29uZmlnZGlycyk6IE5ldyB2YXJpYWJsZS4KLQkoU1VCRElSUyk6IEFkZCBleHRyYWNvbmZpZ2RpcnMgYW5kIHJlY3Vyc2Ugb24gdGhlbSB0b28uCi0JKiBNYWtlZmlsZS5pbiAoYWxsKTogTW92ZSBoaWdoZXIgaW4gZmlsZS4KLQkoRVhUUkFfVEFSR0VUX0hPU1RfQUxMX01PRFVMRVMpOiBOZXcgdmFyaWFibGUuCi0JKEVYVFJBX1RBUkdFVF9IT1NUX3tJTlNUQUxMLENIRUNLfV9NT0RVTEVTKTogTmV3IHZhcmlhYmxlcy4KLQkoQUxMX01PRFVMRVMpOiBBZGQgRVhUUkFfVEFSR0VUX0hPU1RfQUxMX01PRFVMRVMuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBBZGQgRVhUUkFfVEFSR0VUX0hPU1RfQ0hFQ0tfTU9EVUxFUy4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQWRkIEVYVFJBX1RBUkdFVF9IT1NUX0lOU1RBTExfTU9EVUxFUy4KLQotMTk5OC0wNy0yMyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtbGliamF2YSk6IERlcGVuZCBvbiBhbGwtZ2NjIGFuZAotCWFsbC10YXJnZXQtbmV3bGliLgotCShjb25maWd1cmUtdGFyZ2V0LWxpYmphdmEpOiBEZXBlbmQgb24gJChBTExfR0NDKS4KLQotU2F0IEp1bCAxOCAxNDozMjo0MyBDRFQgMTk5OCAgUm9iZXJ0IExpcGUgIDxyb2JlcnRsQGRnaWkuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6ICgqLXBjLXNjbzMuMnY1KSBBZGQgZGV0ZWN0aW9uIGZvciBQZW50aXVtIElJLgotCSgqLXBjLXVuaXh3YXJlNykgQWRkIGRldGVjdGlvbiBmb3IgUGVudGl1bSBJSSwgUGVudGl1bSBQcm8uCi0KLUZyaSBKdWwgMTcgMTM6MzA6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB5bHdyYXA6IENoYW5nZSBhYnNvbHV0ZSBwYXRoIGNoZWNrcyB0byBjaGVjayBmb3IgRE9TIHN0eWxlIHBhdGgKLQluYW1lcy4KLQotCSogeWx3cmFwOiBEb24ndCB1c2UgYSBmdWxsIHBhdGggbmFtZSBpZiB0aGUgc291cmNlIGZpbGUgaXMgaW4gdGhlCi0Jc2FtZSBkaXJlY3RvcnkuICBGcm9tIGhqbEBsdWNvbi5vcmcgKEguSi4gTHUpLgotCi0JKiBjb25maWctbWwuaW46IERlZmF1bHQgdG8gYmVpbmcgdmVyYm9zZSwgdG8gbWF0Y2ggRmViIDE4IGNoYW5nZSB0bwotCWNvbmZpZ3VyZS4KLQotVGh1IEp1bCAxNiAxMjoyOTo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCcm91Z2h0IG92ZXIgZnJvbSBlZ2NzOgotCi0JU2F0IEp1biAyNyAyMjo0NjozMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X3N1YmRpcik6IFNldCB0byAke3RhcmdldF9hbGlhc30gaW5zdGVhZAotCW9mICJsaWJyYXJpZXMiLgotCi0JTW9uIFNlcCAgMSAxNjo0NTo0NCAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X3N1YmRpcik6IFNldCB0byBsaWJyYXJpZXMgaWYgZW5hYmxlX211bHRpbGliLgotCi1XZWQgSnVsIDE1IDAxOjAwOjU0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6IElmIHRoZXJlIGFyZSBhbnkKLQltdWx0aWxpYnMsIGZvcmNlIHJlY29uZmlndXJhdGlvbiB0aGUgZmlyc3QgdGltZSB3ZSBjcmVhdGUKLQltdWx0aWxpYi5vdXQgaW4gYSBzdWJkaXJlY3RvcnksIGluIGNhc2UgVEFSR0VUX1NVQkRJUiBpcyBgLicuCi0KLVR1ZSBKdWwgMTQgMjM6NDE6MDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFN0cmlwIGFueSAtLW5vIG9wdGlvbiBmcm9tIENPTkZJR19BUkdVTUVOVFMsIHRvCi0JYXZvaWQgY29uZnVzaW9uIHdpdGggLS1uby1yZWN1cnNpb24uCi0KLVR1ZSBKdWwgMTQgMTU6Mzc6NDEgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBXaW4zMiBob3N0cyBzaG91bGRuJ3QgdXNlIGluc3RhbGwgLXgKLQkqIGluc3RhbGwtc2g6IHJlbW92ZSAteCBvcHRpb24sIGFuZCBzcGVjaWFsIC5leGUtaGFuZGxpbmcKLQloYWNrLgotCi1UdWUgSnVsIDE0IDE1OjI4OjQxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGk1ODYtcGMtYmVvcy4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgc29tZSBiaXRzIGZvciBiZW9zLgotCi1UdWUgSnVsIDE0IDEzOjIyOjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZiBDQyBpcyBzZXQgYnV0IENGTEFHUyBpcyBub3QsIGFuZCBDQyBpcyBnY2MsIG1ha2UKLQlDRkxBR1MgZGVmYXVsdCB0byAtTzIuCi0KLQkqIGx0bWFpbi5zaDogQWRkIHNvbWUgaGFja3MgdG8gbWFrZSBTdW5PUyAtLWVuYWJsZS1zaGFyZWQgd29yawotCXdoZW4gdXNpbmcgR05VIGxkLgotCi1GcmkgSnVsIDEwIDEzOjE4OjIzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRtYWluLnNoOiBDb3JyZWN0IGluc3RhbGwgd2hlbiB1c2luZyBhIGRpZmZlcmVudCBzaGVsbC4KLQotVHVlIEp1bCAgNyAxNToyNDozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IFVwZGF0ZSB0byBsaWJ0b29sIDEuMmIuCi0KLVRodSBKdWwgIDIgMTM6NTc6MzYgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBybWkuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogVXBkYXRlIHRvIGJ1aWxkIGJpbnV0aWxzL21ha2VmaWxlLnZtcy4gIEFkZCBpbnN0YWxsCi0JdGFyZ2V0LgotCi1XZWQgSnVsICAxIDE2OjQ1OjIxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWc6IFVwZGF0ZSB0byBjb3JyZWN0IEFJWCBoYW5kbGluZy4KLQotU2F0IEp1biAyNyAyMjo0NjozMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBBZGQgVEFSR0VUX1NVQkRJUi4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfc3ViZGlyKTogU2V0IHRvICR7dGFyZ2V0X2FsaWFzfSBpbnN0ZWFkCi0Jb2YgImxpYnJhcmllcyIuCi0KLTE5OTgtMDYtMjYgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IEFkZCBnY2NfdmVyc2lvbl90cmlnZ2VyLgotCShNYWtlZmlsZSk6IERlcGVuZCBvbiAkKGdjY192ZXJzaW9uX3RyaWdnZXIpLgotCi0JKiBjb25maWd1cmUgKGdjY192ZXJzaW9uKTogQ2hhbmdlIGRlZmF1bHQgaW5pdGlhbGl6ZXIgdG8gZW1wdHkKLQlzdHJpbmcuCi0JKGdjY192ZXJzaW9uX3RyaWdnZXIpOiBOZXcgdmFyaWFibGU7IHBhc3MgdGhpcyB2YXJpYWJsZSBkb3duCi0JdG8gc3ViZGlyIGNvbmZpZ3VyZXMgdG8gZW5hYmxlIHRoZW0gY2hlY2tpbmcgZ2NjJ3MgdmVyc2lvbgotCXRoZW1zZWx2ZXMuIEVtaXQgbWFrZSBtYWNyb3MgZm9yIGJvdGggZ2NjX3ZlcnNpb24gdmFycy4KLQkodG9wc3JjZGlyKTogSW5pdGlhbGl6ZSByZWxpYWJseS4KLQkocmVjdXJzaW9uIGxpbmUpOiBSZW1vdmUgLS13aXRoLWdjYy12ZXJzaW9uPSR7Z2NjX3ZlcnNpb259LgotCi0xOTk4LTA2LTI0ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZ3VyZSAoZW5hYmxlX3ZlcnNpb25fc3BlY2lmaWNfcnVudGltZV9saWJzKTogSW1wbGVtZW50IG5ldyBmbGFnCi0JLS1lbmFibGUtdmVyc2lvbi1zcGVjaWZpYy1ydW50aW1lLWxpYnMgd2hpY2ggaW5zdGFsbHMgQysrIHJ1bnRpbWUgc3R1ZmYKLQlpbiAkKGxpYnN1YmRpcik7IGVtaXQgZGVmaW5pdGlvbiBpbiBlYWNoIGdlbmVyYXRlZCBNYWtlZmlsZS4KLQkoZ3h4X2luY2x1ZGVfZGlyKTogSW5pdGlhbGl6ZSBkZXBlbmRpbmcgb24KLQkkZW5hYmxlX3ZlcnNpb25fc3BlY2lmaWNfcnVudGltZV9saWJzLgotCi0xOTk4LTA2LTI0ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZ3VyZSAoZ2NjX3ZlcnNpb24pOiBJbml0aWFsaXplIHByb3Blcmx5IGRlcGVuZGluZyBvbgotCWhvdyBhbmQgd2hlcmUgY29uZmlndXJlIGlzIHN0YXJ0ZWQuCi0JKHJlY3Vyc2lvbiBsaW5lKTogUGFzcyBhIC0td2l0aC1nY2MtdmVyc2lvbj0ke2djY192ZXJzaW9ufQotCXRvIGNvbmZpZ3VyZXMgaW4gc3ViZGlycy4KLQotV2VkIEp1biAyNCAxNjowMTo1OSAxOTk4ICBKb2huIE1ldHpsZXIgIDxqbWV0emxlckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBjb25maWd1cmUgcGF0dGVybiBmb3IgbWlwcyB0eDM5Ci0gCWN5Z21vbgotCi1UdWUgSnVuIDIzIDIyOjQyOjMyIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgY3lnbW9uIGFuZCBsaWJzdHViIHN1cHBvcnQgZm9yIG1uMTAyMDAuCi0KLTE5OTgtMDYtMTkgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlIChnY2NfdmVyc2lvbik6IEFkZCBuZXcgdmFyaWFibGUgZGVzY3JpYmluZyB0aGUKLQlwYXJ0aWN1bGFyIGdjYyB2ZXJzaW9uIHdlJ3JlIGJ1aWxkaW5nLgotCSogTWFrZWZpbGUuaW4gKGxpYnN1YmRpcik6IEFkZCBuZXcgbWFjcm8gZm9yIHRoZSBkaXJlY3RvcnkKLQlpbiB3aGljaCB0aGUgY29tcGlsZXIgZmluZHMgZXhlY3V0YWJsZXMsIGxpYnJhcmllcywgZXRjLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gZ2NjX3ZlcnNpb24sIHRhcmdldF9hbGlhcwotCWFuZCBsaWJzdWJkaXIuCi0KLUZyaSBKdW4gMTkgMDI6MzY6NTkgMTk5OCAgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4KLQotCSogTWFrZWZpbGUuaW4gKGxvY2FsLWNsZWFuKTogcmVtb3ZlICoubG9nCi0JKHdhcm5pbmcubG9nKTogYnVpbHQgd2l0aCB3YXJuX3N1bW1hcnkgZnJvbSBidWlsZC5sb2cKLQkobWFpbC1yZXBvcnQubG9nKTogcnVuIHRlc3Rfc3VtbWFyeQotCShtYWlsLXJlcG9ydC13aXRoLXdhcm5pbmdzLmxvZyk6IHJ1biB0ZXN0X3N1bW1hcnkgaW5jbHVkaW5nCi0Jd2FybmluZy5sb2cgaW4gdGhlIHJlcG9ydAotCi1UaHUgSnVuIDE4IDExOjI2OjAzIDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBEZXRlY3Rpb24gb2YgUGVudGl1bSBJSSBmb3IgKi1zY28tMy4ydjUqLgotCi1Nb24gSnVuIDE1IDE0OjUzOjU0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGdyZXApOiBHcmVwIG5vIGxvbmdlciBkZXBlbmRzIG9uIGxpYmliZXJ0eS4KLQotRnJpIEp1biAxMiAxNDowMzozNCAxOTk4ICBTeWQgUG9sayAgPHNwb2xrQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBhbGwtc25hdmlnYXRvciBuZWVkcyBhbGwtbGliZ3VpLgotCi1UaHUgSnVuIDExIDE5OjQzOjQ3IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgY3lnbW9uIGFuZCBsaWJzdHViIHN1cHBvcnQgZm9yIG1uMTAzMDAuCi0KLVdlZCBKdW4gMTAgMTE6MTk6NDcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXNzaW5nOiBVcGRhdGUgdG8gdmVyc2lvbiBmcm9tIGF1dG9tYWtlIDEuMy4KLQotCSogbHRtYWluLnNoOiBPbiBpbnN0YWxsYXRpb24sIGRvbid0IGdldCBjb25mdXNlZCBpZiB0aGUgc2FtZSBuYW1lCi0JYXBwZWFycyBtb3JlIHRoYW4gb25jZSBpbiB0aGUgbGlzdCBvZiBsaWJyYXJ5IG5hbWVzLgotCi1XZWQgSnVuICAzIDE0OjUxOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWNjZXB0IG02ODA2MCBhbmQgbTUyMDAgYXMgQ1BVIG5hbWVzLgotCi1Nb24gSnVuICAxIDE3OjI1OjE2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBVc2UgJiYgcmF0aGVyIHRoYW4gdXNpbmcgLWEgaW4gdGVzdCwgYmVjYXVzZSBvZGQKLQlzdHJpbmdzIGNhbiBjb25mdXNlIHRlc3QuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCi1UaHUgTWF5IDI4IDE5OjMxOjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWcsIGx0bWFpbi5zaDogQnJpbmcgaW4gVmlzdWFsIEMrKyBzdXBwb3J0LgotCi1TYXQgTWF5IDIzIDIzOjQ0OjEzIDE5OTggIEFsZXhhbmRyZSBPbGl2YSA8b2xpdmFAZGNjLnVuaWNhbXAuYnI+Ci0KLQkqIE1ha2VmaWxlLmluIChib29zdHJhcDItbGVhbiwgYm9vdHN0cmFwMy1sZWFuLAotCWJvb3RzdHJhcDQtbGVhbik6IG5ldyB0YXJnZXRzCi0KLU1vbiBNYXkgMTEgMjM6MTE6MzQgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBDT1BZSU5HLkxJQjogVXBkYXRlIEZTRiBhZGRyZXNzLgotCi1GcmkgTWF5ICA4IDAxOjMwOjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWcsIGx0bWFpbi5zaDogVXBkYXRlIHRvIGxpYnRvb2wgMS4yYS4KLQotCSogTWFrZWZpbGUuaW4gKEdBU0JfU1VQUE9SVF9ESVJTKTogUmVtb3ZlIGludGw7IGFscmVhZHkgaW5jbHVkZWQgdmlhCi0JR0FTX1NVUFBPUlRfRElSUy4KLQotVGh1IE1heSAgNyAxNzoyNzozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IEF2b2lkIHByb2R1Y2luZyBhIHZlcnNpb24gbnVtYmVyIGlmCi0JLXZlcnNpb24taW5mbyB3YXMgbm90IHVzZWQuCi0KLVR1ZSBNYXkgIDUgMTg6MDI6MjQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCAtLXdpdGgtbmV3bGliIHRvIENPTkZJR19BUkdVTUVOVFMgaWYgd2UgYXJlCi0JYnVpbGRpbmcgd2l0aCBuZXdsaWIuCi0KLTE5OTgtMDQtMzAgIFBhdWwgRWdnZXJ0ICA8ZWdnZXJ0QHR3aW5zdW4uY29tPgotCi0gICAgICAgICogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6IFJlbW92ZSBiYWNrc2xhc2ggYXQgZW5kOwotICAgICAgICBTb2xhcmlzIGBtYWtlJyBjYXVzZXMgaXQgdG8gY29udGludWUgdG8gbmV4dCBkZWZpbml0aW9uLiAKLQotVHVlIEFwciAyOCAxODoxMToyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGFscGhhIHRvIGFscGhhKiBpbiBzZXZlcmFsIHBsYWNlcy4KLQotVHVlIEFwciAyOCAwNzo0MjowMCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBzcGFyYzg2eC4KLQotVHVlIEFwciAyOCAwNzozNTowMiAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLSAKLQkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtdGFyZ2V0LW9wdHNwYWNlKTogUmVtb3ZlIGRlYnVnIGVjaG8uCi0KLVRodSBBcHIgMjMgMjE6MzE6MTYgMTk5OCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFNldCBDWFhGTEFHUyBmcm9tIENYWEZMQUdTLCBub3QgQ0ZMQUdTLgotCi1UaHUgQXByIDIzIDEyOjI2OjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWc6IFVwZGF0ZSBjeWd3aW4zMiBzdXBwb3J0LgotCi0JKiBNYWtlZmlsZS5pbiAoR0FTX1NVUFBPUlRfRElSUyk6IEFkZCBpbnRsLgotCShCSU5VVElMU19TVVBQT1JUX0RJUlMsIEdBU0JfU1VQUE9SVF9ESVJTKTogTGlrZXdpc2UuCi0JKEdEQl9TVVBQT1JUX0RJUlMpOiBMaWtld2lzZS4KLQotV2VkIEFwciAyMiAxMjozMDoxMCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfbWFrZWZpbGVfZnJhZyk6IElmIC0tZW5hYmxlLXRhcmdldC1vcHRzcGFjZSwKLQl1c2UgLU9zIHRvIGNvbXBpbGUgdGFyZ2V0IGxpYnJhcmllcyByYXRoZXIgdGhhbiAtTzIuICBEZWZhdWx0IHRvCi0JdXNpbmcgLU9zIGZvciBkMTB2IGFuZCBtMzJyIGlmIC0te2VuYWJsZSxkaXNhYmxlfS10YXJnZXQtb3B0c3BhY2UgaXMKLQlub3QgdXNlZC4KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2NmbGFncyk6IERpdHRvIGZvciBkMzB2LgotCi1UdWUgQXByIDIxIDIzOjA2OjU0IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1iZmQpOiBEZXBlbmQgb24gYWxsLWludGwuCi0JKGFsbC1iaW51dGlscyk6IExpa2V3aXNlLgotCShhbGwtZ2FzKTogTGlrZXdpc2UuCi0JKGFsbC1ncHJvZik6IExpa2V3aXNlLgotCShhbGwtbGQpOiBMaWtld2lzZS4KLQotCi0xOTk4LTA0LTE5ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBGaXggdHlwbywgbGJ0b29sIC0+IGxpYnRvb2wuCi0KLUZyaSBBcHIgMTcgMTY6MjA6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWJmZCk6IERlcGVuZCB1cG9uIGFsbC1saWJpYmVydHkuCi0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IEJyaW5nIGluIG5ld2VyIGN5Z3dpbjMyIHN1cHBvcnQuCi0KLUZyaSBBcHIgMTcgMTI6MjI6MjIgMTk5OCAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgbGlic3R1Yi4KLQotCSogY29uZmlndXJlLmluOiBEaXR0by4gQnVpbGQgbGlic3R1YiBmb3IgdGFyZ2V0cyB0aGF0IGhhdmUgY3lnbW9uCi0Jc3VwcG9ydC4KLQotVHVlIEFwciAxNCAxODowMTo1NSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IFBJQ0ZMQUcgb24gaXg4Ni1jeWd3aW4zMi4KLQotVHVlIEFwciAxNCAxMjoyNDo0NSAxOTk4ICBKLiBLZWFuIEpvaG5zdG9uICA8amtqQHNjby5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXNlIGlbMzQ1Nl05Ni0qLXN5c3Y1KiBhcyBhIHZhbGlkIGhvc3QsIGFuZAotCXVzZSBtaC1zeXN2NSBpZiBzcGVjaWZpZWQuICBTdXBwb3J0IGdwcm9mIG9uIFNDTyBPcGVuIFNlcnZlci4KLQotVHVlIEFwciAxNCAxMTozMzo1MSAxOTk4ICBLcmlzdGVyIFdhbGZyaWRzc29uIDxjYXRvQGRmLmx0aC5zZT4KLQotCSogY29uZmlndXJlOiBEZWZpbmUgREVGQVVMVF9NNCBieSBzZWFyY2hpbmcgUEFUSC4KLQkqIE1ha2ZpbGUuaW46IFVzZSBERUZBVUxUX000LgotCi1Nb24gQXByIDEzIDE1OjM3OjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWc6IEFkZCBjeWd3aW4zMiBzdXBwb3J0LgotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBBZGQgbGlidG9vbCBhcyBhIG5hdGl2ZSBvbmx5IGRpcmVjdG9yeQotIAl0byBjb25maWd1cmUgYW5kIGJ1aWxkLgotCi1XZWQgQXByICA4IDEzOjE4OjU2IDE5OTggIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AbWFjcWVsLmJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhUUkFfR0NDX0ZMQUdTKTogWEZPTyBsaW5lcyBzaG9ydGVuZWQuCi0KLVRodSBBcHIgIDIgMTQ6NDg6NDQgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IGFkZCBhc2ggbWFrZSBydWxlcwotCSogY29uZmlndXJlLmluOiBhZGQgYXNoIHRvIG5hdGl2ZV9vbmx5IGFuZCBob3N0X3Rvb2xzIGxpc3RzCi0KLVRodSBNYXIgMjYgMTI6NTM6MjAgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdldHRleHQsIGFsbC1pbnRsKTogTmV3IHRhcmdldHMuCi0JKEFMTF9NT0RVTEVTKTogQWRkZWQgYWxsLWdldHRleHQsIGFsbC1pbnRsLgotCShDUk9TU19DSEVDS19NT0RVTEVTKTogQWRkZWQgY2hlY2stZ2V0dGV4dCwgY2hlY2staW50bC4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQWRkZWQgaW5zdGFsbC1nZXR0ZXh0LCBpbnN0YWxsLWludGwuCi0JKENMRUFOX01PRFVMRVMpOiBBZGRlZCBjbGVhbi1nZXR0ZXh0LCBjbGVhbi1pbnRsLgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBBZGRlZCBnZXR0ZXh0LgotCShuYXRpdmVfb25seSk6IExpa2V3aXNlLgotCShub2NvbmZpZ2RpcnMpIFt2YXJpb3VzIGNhc2VzXTogTGlrZXdpc2UuCi0JKGhvc3RfbGlicyk6IEFkZGVkIGludGwuCi0KLVdlZCBNYXIgMjUgMTE6NDk6MTIgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZXZlcnQgeWVzdGVyZGF5J3MgY2hhbmdlLgotCShhbGwtdGFyZ2V0LXdpbnN1cCk6ICBhbGwtdGFyZ2V0LWxpYnJ4IHN0YXlzIG91dCBvZiBoZXJlLgotCi1UdWUgTWFyIDI0IDE2OjU4OjI5IDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVEFSR0VUX0NPTkZJR0RJUlMsIEFMTF9UQVJHRVRfTU9EVUxFUywgCi0JQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTLCBDSEVDS19UQVJHRVRfTU9EVUxFUywgCi0JSU5TVEFMTF9UQVJHRVRfTU9EVUxFUywgQ0xFQU5fVEFSR0VUX01PRFVMRVMsIGFsbC10YXJnZXQtd2luc3VwKTogCi0JUmVtb3ZlIHJlZmVyZW5jZXMgdG8gbGlicnggYW5kIGxpYmcrKy4KLQotVHVlIE1hciAyNCAxODoyODoxMiAxOTk4ICBFcmljIE11bXBvd2VyICA8bm9jdHVybmVAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFBhc3MgJChsaXNwZGlyKSBkb3duIHRvCi0JcmVjdXJzaXZlIG1ha2VzCi0KLVR1ZSBNYXIgMjQgMTE6Mzc6NDUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IFVzZSAkKFRBUkdFVF9TVUJESVIpIHdoZW4gcGFzc2luZyAtQgotCWZvciBuZXdsaWIgZGlyZWN0b3J5LgotCShDWFhfRk9SX1RBUkdFVCk6IExpa2V3aXNlLgotCi1Nb24gTWFyIDIzIDExOjMwOjIxIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbHRjb25maWc6IFVwZGF0ZSBhZnRlciBsaWJ0b29sL2x0Y29uZmlnLmluIGNoYW5nZSBmb3IKLQlocHV4MTEuCi0KLUZyaSBNYXIgMjAgMTg6NTE6NDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBVcGRhdGUgdG8gbGlidG9vbCAxLjIuCi0KLUZyaSBNYXIgMjAgMDk6MzI6MTQgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1nY2MpOiBEb24ndCBzcGVjaWZ5IExBTkdVQUdFUyBoZXJlLgotCShpbnN0YWxsLWdjYy1jcm9zcyk6IEluc3RlYWQsIG92ZXJyaWRlIExBTkdVQUdFUyBoZXJlLgotCi0xOTk4LTAzLTE4ICBEYXZlIExvdmUgIDxkLmxvdmVAZGwuYWMudWs+Ci0KLQkqIE1ha2VmaWxlLmluICgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBTZXQgQ09ORklHX1NJVEUgdG8gYQotCW5vbi1leGlzdGVudCBmaWxlIHNpbmNlIC9kZXYvbnVsbCBsb3NlcyB3aXRoIGJhc2ggMi4wL2F1dG9jb25mIDIuMTIuCi0KLVdlZCBNYXIgMTggMDk6MjQ6NTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgVGh1bWItcGUgdGFyZ2V0LgotCi1UdWUgTWFyIDE3IDE2OjU5OjAwIDE5OTggIFN5ZCBQb2xrIDxzcG9sa0BjeWdudXMuY29tPgotCSogTWFrZWZpbGUuaW4gLSBjaGFuZ2VkIHNuIHRhcmdldHMgdG8gc25hdmlnYXRvcgotCSogY29uZmlndXJlLmluIC0gY2hhbmdlZCBzbiB0YXJnZXRzIHRvIHNuYXZpZ2F0b3IKLQotVHVlIE1hciAxNyAxMDozMzoyOCAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZy1tbC5pbjogQWZ0ZXIgYnVpbGRpbmcgc3ltbGluayB0cmVlIGNhbGwgbWFrZSBkaXN0Y2xlYW4KLQlpZiBhIE1ha2VmaWxlIGdvdCBsaW5rZWQgaW50byAke21sX2Rpcn0vJHttbF9saWJkaXJ9OyB0aGlzIGhhcHBlbnMKLQl0byBiZSB0aGUgY2FzZSBmb3IgbGliaWJlcnR5LgotCi1UdWUgTWFyIDE3IDEwOjIyOjM3IDE5OTggIEguSi4gTHUgIChoamxAZ251LmFpLm1pdC5lZHUpCi0KLQkqIGNvbmZpZ3VyZTogV2hlbiBtYWtpbmcgbGluaywgYWxzbyBjaGVjayB0aGUgY3VycmVudAotCWRpcmVjdG9yeS4gVGhlIGNvbmZpZ3VyZSBzY3JpcHRzIG1heSBjcmVhdGUgb25lLgotCi1GcmkgTWFyICA2IDAxOjAyOjAzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCBhbHBoYXBjYTU2IGFuZCBhbHBoYWV2NiBwcm9wZXJseS4KLQotRnJpIE1hciAgNiAwMDoxNDo1NSAxOTk4ICBGcmFueiBTaXJsIDxGcmFuei5TaXJsLWtlcm5lbEBsYXV0ZXJiYWNoLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXZlcnQgMyBKYW4gY2hhbmdlIGZvciBwb3dlcnBjLWxpbnV4LWdudWxpYmMxLgotCi0KLU1vbiBGZWIgMjMgMTU6MDk6MTggMTk5OCAgQnJ1bm8gSGFpYmxlIDxicnVub0BsaW51aXgubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlCi0KLSAgICAgICAgKiBjb25maWcuc3ViIChzY281KTogRml4IHR5cG8uCi0KLU1vbiBGZWIgMjMgMTQ6NDY6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9NT0RVTEVTKTogTW92ZSBpbnN0YWxsLXRjbCBiZWZvcmUKLQlpbnN0YWxsLWl0Y2wuCi0JKGluc3RhbGwtaXRjbCk6IFJlbW92ZSBkZXBlbmRlbmN5IG9uIGluc3RhbGwtdGNsLgotCi1Nb24gRmViIDIzIDA5OjUzOjI4IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgbGliZ2xvc3MgZnJvbSBub2NvbmZpZ2RpcnMgZm9yIE1OMTAzMDAuCi0KLUZyaSBGZWIgMjAgMTY6NDc6MjQgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IERvbid0IGxldCBidWlsZHMgYmUgZG9uZSBpbiBzb3VyY2UgdHJlZS4KLQotVGh1IEZlYiAxOSAxMzo0MDo0MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbGliZ3VpIGZvciBhIGN5Z3dpbjMyIHRhcmdldCB3aGVuIG5vdCBvbgotCWEgY3lnd2luMzIgaG9zdC4KLQotV2VkIEZlYiAxOCAxMjoyOTowMCAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlIChyZWRpcmVjdCk6IFNldCB0byBudWxsLCBzbyBkZWZhdWx0IGJlaGF2aW9yIG9mCi0JY29uZmlndXJlIGlzIG5vdyAtLXZlcmJvc2UuCi0KLTE5OTgtMDItMTYgIERhdmUgTG92ZSAgPGQubG92ZUBkbC5hYy51az4KLQotCSogTWFrZWZpbGUuaW4gKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6IFJ1biBjb25maWd1cmUgd2l0aAotCUNPTkZJR19TSVRFPS9kZXYvbnVsbCB0byBmb3Jlc3RhbGwgbG9zc2FnZSB3aXRoIHNpdGUgY29uZmlndXJhdGlvbi4KLQotTW9uIEZlYiAxNiAxMjoyMzo1MyAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPE1hbmZyZWQuSG9sbHN0ZWluQGtzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTLCBFWFRSQV9UQVJHRVRfRkxBR1MpOiBSZWFsbHkgYWRkCi0JdGhpcyBjaGFuZ2UgdG8gc3luYyBNYWtlZmlsZS5pbiB3aXRoIGl0cyBDaGFuZ2VMb2cgZW50cmllcy4KLQotVGh1IEZlYiAxMiAxNTowMzowOCAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGx0bWFpbi5zaCAobWtkaXIpOiBDaGVjayB0aGF0IHRoZSBkaXJlY3RvcnkgZG9lc24ndCBleGlzdAotCWJlZm9yZSB3ZSBleGl0IHdpdGggZXJyb3IsIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IHJhY2VzIGR1cmluZwotCXBhcmFsbGVsIGJ1aWxkcy4KLQotU2F0IEZlYiAgNyAxNToxOToxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IFVwZGF0ZSBmcm9tIGxpYnRvb2wgMS4waS4KLQotRnJpIEZlYiAgNiAwMTozMzo1MiAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBEb24ndCBwYXNzIFBJQ0ZMQUcgYW5kCi0JUElDRkxBR19GT1JfVEFSR0VULgotCShFWFRSQV9UQVJHRVRfRkxBR1MpOiBEb24ndCBwYXNzIFBJQ0ZMQUdfRk9SX1RBUkdFVC4KLQotCSogY29uZmlndXJlOiBFbWl0IGEgZGVmaW5pdGlvbiBmb3IgdGhlIG5ldyBtYWNybyBlbmFibGVfc2hhcmVkCi0JaW50byBlYWNoIE1ha2VmaWxlLgotCi0JKiBjb25maWcvbWgtc3BhcmNwaWMgKFBJQ0ZMQUcpOiBEZWZpbmUgdG8gcHJvcGVybHkgYWNjb3JkaW5nCi0JdG8gY3VycmVudCBtdWx0aWxpYiBjb25maWd1cmF0aW9uLgotCSogY29uZmlnL210LXNwYXJjcGljIChQSUNGTEFHX0ZPUl9UQVJHRVQpOiBEZWZpbmUgdG8gcHJvcGVybHkKLQlhY2NvcmRpbmcgdG8gY3VycmVudCBtdWx0aWxpYiBjb25maWd1cmF0aW9uLgotCi1UaHUgRmViICA1IDE3OjAxOjEyIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMsIG5hdGl2ZV9vbmx5KTogQWRkIGxpYnRvb2wuCi0KLVdlZCBGZWIgIDQgMTY6NTM6NTggMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBhZGQgdGFyZ2V0LWdwZXJmIHRvIG5vY29uZmlnZGlycyBmb3IgQ3lnd2luMzIuCi0JRml4IHR5cG8gaW4gbWluZyBjb25maWcgY29tbWVudC4KLQotV2VkIEZlYiAgNCAxODo1NjoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IFVwZGF0ZSBmcm9tIGxpYnRvb2wgMS4waC4KLQotTW9uIEZlYiAgMiAxOTozODoxOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCB0aWMzMCBjYXNlcywgYW5kIG1hcCBjMzAgdG8gdGljMzAuCi0KLUZyaSBKYW4gMzAgMTc6MTg6MzIgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGV4cGVjdCBmcm9tIG5vY29uZmlnZGlycyB3aGVuIHRhcmdldAotICAgICAgICBpcyBjeWd3aW4zMi4gIE9LIHRvIGJ1aWxkIGV4cGVjdCBhbmQgZGVqYWdudSB3aXRoIENhbmFkaWFuCi0gICAgICAgIENyb3NzLgotCi1XZWQgSmFuIDI4IDEyOjU4OjQ5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEbyBidWlsZCBleHBlY3QsIGRlamFnbnUsIGFuZCBjdnNzcmMgZm9yIGEgY3lnd2luMzIKLQlob3N0LgotCi0JKiBjb25maWcuZ3Vlc3M6IFVzZSAke1VOQU1FX01BQ0hJTkV9IHJhdGhlciB0aGFuIGkzODYgZm9yIGN5Z3dpbjMyCi0JYW5kIG1pbmd3MzIuCi0KLVdlZCBKYW4gMjggMTA6MjY6MzcgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogUmVtb3ZlIHBhc3NpbmcgJChsb2NhbF9wcmVmaXgpCi0JaGVyZSBhcyBpdCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgdG9wbGV2ZWwgTWFrZWZpbGUuCi0KLVR1ZSBKYW4gMjcgMjM6MjU6MDYgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWd1cmUgKHBhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZyk6IE5ldyB2YXJpYWJsZSwgd2hpY2ggbmFtZXMKLQlhIGZpbGUgd2l0aCBnZW5lcmljIHJ1bGVzLCAuLi4KLQlDaGFuZ2UgY29tbWVudCB0byBtZW50aW9uIHdlIG5vdyBoYXZlIEZJVkUgcGFydHMuCi0JKiBjb25maWd1cmU6IFVuZG8gbGFzdCBjaGFuZ2UuCi0KLVR1ZSBKYW4gMjcgMjM6MTU6NTUgMTk5OCAgTGFzc2kgQS4gVHV1cmEgIDxsYXRAaWtpLmZpPgotCi0JKiBjb25maWcuZ3Vlc3M6IE1vcmUgYWNjdXJhdGUgZGV0ZXJtaW5hdGlvbiBvZiBIUCBwcm9jZXNzb3IgdHlwZXMuCi0JKiBjb25maWcuc3ViOiBNb3JlIGFjY3VyYXRlIGRldGVybWluYXRpb24gb2YgSFAgcHJvY2Vzc29yIHR5cGVzLgotCi1TYXQgSmFuIDI0IDAxOjU5OjQ1IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlIChwYWNrYWdlX21ha2VmaWxlX2ZyYWcpOiBNb3ZlIGluc2VydGluZyB0aGUKLQkke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30gdG8gd2hlcmUgaXQgc2hvdWxkIGJlIGFjY29yZGluZwotCXRvIHRoZSBjb21tZW50LgotCi1GcmkgSmFuIDIzIDAwOjMwOjIxIDE5OTggIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBjb25maWcuZ3Vlc3M6IEFkZCBzdXBwb3J0IGZvciBMaW51eC9BUk0uCi0KLVRodSBKYW4gMjIgMTU6MTQ6MDEgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIC5jdnNpZ25vcmU6IFJlbW92ZSAqLWluZm8gYW5kICotaW5zdGFsbCBzaW5jZSB0aGV5IG1hdGNoCi0JcmVsZWFzZS1pbmZvIGFuZCBtcHctaW5zdGFsbCwgd2hpY2ggd2UgZG9uJ3Qgd2FudCB0byBqdXN0IGlnbm9yZS4KLQotVGh1IEphbiAyMiAwMTozODozMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJldmVydCAzIEphbiBjaGFuZ2UgZm9yIGFscGhhLWxpbnV4LWdudWxpYmMxLgotCi1TYXQgSmFuIDE3IDIxOjI4OjA4IDE5OTggIFBpZXRlciBOYWdlbCA8cG5hZ2VsQGVwaXVzZS5jby56YT4KLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gZ2NjX2luY2x1ZGVfZGlyIGFuZAotCWxvY2FsX3ByZWZpeCB0byBzdWItbWFrZSBpbnZvY2F0aW9ucy4KLQotU2F0IEphbiAxNyAyMTowNDo1OSAxOTk4IEguSi4gTHUgIChoamxAZ251Lm9yZykKLQotCSogY29uZmlndXJlLmluOiBDaGVjayBtYWtlZmlsZSBmcmFnbWVudHMgaW4gdGhlIHNvdXJjZQotCWRpcmVjdG9yeS4KLQotRnJpIEphbiAxNiAwMDo0MTozNyAxOTk4ICBBbGV4YW5kcmUgT2xpdmEgPG9saXZhQGRjYy51bmljYW1wLmJyPgotCi0JKiBjb25maWd1cmUuaW46IGNoZWNrIHdoZXRoZXIgaG9zdCBhbmQgdGFyZ2V0IG1ha2VmaWxlCi0JZnJhZ21lbnRzIGV4aXN0IGJlZm9yZSBhZGRpbmcgdGhlbSB0byAqX21ha2VmaWxlX2ZyYWcKLQotV2VkIEphbiAxNCAyMzozOToxMCAxOTk4ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfY29uZmlnZGlycyk6IEFkZCBjeWdtb24gZm9yIHNwYXJjNjQtZWxmLgotCQotV2VkIEphbiAxNCAxMjo0ODowNyAxOTk4ICBLZWl0aCBTZWl0eiAgPGtlaXRoc0BwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IE1ha2Ugc3VyZSB3ZSBvbmx5IHJlcGxhY2UgUlBBVEhfRU5WVkFSIG9uCi0JbGluZXMgd2hpY2ggYmVnaW4gd2l0aCBSUEFUSF9FTlZWQVIsIGkuZS4gYWRkICJeIiB0byB0aGUKLQlyZWdleHAgdG8gc2VkLgotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyBSUlBBVEhfRU5WVkFSIGRvd24KLQl0byBzdWItbWFrZXMuCi0KLTE5OTgtMDEtMTMgIExlZSBJdmVyc29uICAgKGxlZWlAYWkuc3JpLmNvbSkKLQotCSogY29uZmlnLW1sLmluIChtdWx0aS1kbyk6IExERkxBR1MgbXVzdCBpbmNsdWRlIG11bHRpbGliCi0JZGVzaWduYXRvci4KLQotVHVlIEphbiAxMyAwMToxMzoyNCAxOTk4ICAgUm9iZXJ0IExpcGUgKHJvYmVydGxAZGdpaS5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGlbMzQ1Nl0taTU4Ni1Vbml4V2FyZTctc3lzdjUuCi0KLVN1biBKYW4gIDQgMDE6MDY6NTUgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBtaW5ndzMyIHN1cHBvcnQuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCSogbWgtbWluZ3czMjogTmV3IGZpbGUuCi0KLVNhdCBKYW4gIDMgMTI6MTE6MDUgMTk5OCBGcmFueiBTaXJsIDxmcmFuei5zaXJsLWtlcm5lbEBsYXV0ZXJiYWNoLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBGaW5hbGl6ZSBzdXBwb3J0IGZvciB7YWxwaGF8cG93ZXJwY30qLSotbGludXgtZ251bGliYzEKLQotU3VuIERlYyAyOCAxMToyODo1OCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1RBUkdFVCk6IERvIGluc3RhbGwtZ2NjIGZpcnN0LgotCSogY29uZmlndXJlIChneHhfaW5jbHVkZV9kaXIpOiBQcm92aWRlIGEgZGVmaW5pdGlvbiBmb3Igc3ViZGlycwotCXdoaWNoIGRvIG5vdCB1c2UgYXV0b2NvbmYuCi0KLVdlZCBEZWMgMjQgMjI6NDY6NTUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFN5bmMgd2l0aCBlZ2NzLiAgUGlja3MgdXAgbmV3IGFscGhhIHN1cHBvcnQsCi0JQmVPUyAmIHNvbWUgYWRkaXRpb25hbCBsaW51eCBzdXBwb3J0LgotCi1UdWUgRGVjIDIzIDEyOjQ1OjUwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBIUCA5MDAwLzgwMyBpcyBhIFBBMS4xIG1hY2hpbmUuCi0KLQotU3VuIERlYyAyMSAxNjo1MzoxMiAxOTk3ICBILkouIEx1ICAoaGpsQGdudS5haS5taXQuZWR1KQotCi0gICAgICAgICogY29uZmlndXJlLmluIChob3N0X21ha2VmaWxlX2ZyYWcsIHRhcmdldF9tYWtlZmlsZV9mcmFnKToKLSAgICAgICAgSGFuZGxlIG11bHRpcGxlIGNvbmZpZyBmaWxlcy4KLSAgICAgICAgKGFscGhhLSotbGludXgqKTogVHJlYXQgYWxwaGEtKi1saW51eCogYXMgYWxwaGEtKi1saW51eCogYW5kCi0gICAgICAgIGFscGhhLSotKi4KLQotVGh1IERlYyAxOCAxMzoxMzowMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBta2RlcDogTmV3IGZpbGUuCi0KLVdlZCBEZWMgMTcgMDk6NTM6MDIgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qLSopOiBBbGxvdyBjb25maWd1cmluZyBvZiBsaWJpZGUsIHZtYWtlLCBldGMuCi0KLVR1ZSBEZWMgMTYgMTc6MzY6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGxpYmd1aSBkaXJlY3RvcnkuCi0JKEdEQl9USyk6IEFkZCBhbGwtbGliZ3VpLgotCSogY29uZmlndXJlLmluOiBBZGQgbGliZ3VpIGRpcmVjdG9yeS4KLQkqIGNvbmZpZ3VyZTogQWRkIGFsbC1saWJndWkgdG8gR0RCX1RLLgotCi1Nb24gRGVjIDE1IDE2OjEyOjI4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy1tbC5pbiAobXVsdGlkaXJzKTogQWRkIG0zMnIgdG8gbXVsdGlsaWIgbGlzdC4KLQotRnJpIERlYyAxMiAxMDo0MzozMSAxOTk3ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtZ3BlcmYpOiBDaGFuZ2UgZGVwZW5kZW5jeSB0bwotCWFsbC10YXJnZXQtbGlic3RkYysrLgotCi1UaHUgRGVjIDExIDIzOjMwOjUxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBuaW5lbW9vbnMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IEFkZCBCZU9TIHN1cHBvcnQuCi0KLVdlZCBEZWMgMTAgMTU6MTA6MzggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JU291cmNlIGRpcmVjdG9yeSBjdnMgcmVuYW1lZCB0byBjdnNzcmM6Ci0JKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBDaGFuZ2UgY3ZzIHRvIGN2c3NyYy4KLQkobmF0aXZlX29ubHkpOiBMaWtld2lzZS4KLQkobm9jb25maWdkaXJzKSBbdmFyaW91cyBjYXNlc106IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTKTogQ2hhbmdlIGFsbC1jdnMgdG8gYWxsLWN2c3NyYy4KLQkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IENoYW5nZSBjaGVjay1jdnMgdG8gY2hlY2stY3Zzc3JjLgotCShJTlNUQUxMX01PRFVMRVMpOiBDaGFuZ2UgaW5zdGFsbC1jdnMgdG8gaW5zdGFsbC1jdnNzcmMuCi0JKENMRUFOX01PRFVMRVMpOiBDaGFuZ2UgY2xlYW4tY3ZzIHRvIGNsZWFuLWN2c3NyYy4KLQkoYWxsLWN2c3NyYyk6IFJlbmFtZSB0YXJnZXQgZnJvbSBhbGwtY3ZzLgotCi1XZWQgRGVjICAzIDA3OjU1OjU5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlIChneHhfaW5jbHVkZV9kaXIpOiBGaXggdGhpbmtvLgotCi1UdWUgRGVjICAyIDEwOjU1OjM0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfVEFSR0VUX0NST1NTKTogRGVmaW5lLgotCShpbnN0YWxsLWNyb3NzLCBpbnN0YWxsLWdjYy1jcm9zcyk6IE5ldyB0YXJnZXRzLgotCi1UdWUgRGVjICAyIDEwOjA4OjMxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogQWRkIHN1cHBvcnQgZm9yIFRodW1iIHRhcmdldC4KLQotCSogY29uZmlnLnN1YiAobWF5YmVfb3MpOiBBZGQgc3VwcG9ydCBmb3IgVGh1bWIgdGFyZ2V0LgotCi1TdW4gTm92IDMwIDE2OjEyOjI3IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHJ1bGVzIGZvciBjeWdtb24uCi0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgY3lnbW9uIGZvciBzcGFyYy1lbGYgYW5kIHNwYXJjbGl0ZS1hb3V0LgotCi1UaHUgTm92IDI3IDAxOjMxOjMwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfVEFSR0VUKTogRG8gaW5zdGFsbC1nY2MgZmlyc3QuCi0JKiBjb25maWd1cmUgKGd4eF9pbmNsdWRlX2Rpcik6IFByb3ZpZGUgYSBkZWZpbml0aW9uIGZvciBzdWJkaXJzCi0Jd2hpY2ggZG8gbm90IHVzZSBhdXRvY29uZi4KLQotV2VkIE5vdiAyNiAxMTo1MzozMyAxOTk3ICBLZWl0aCBTZWl0eiAgPGtlaXRoc0BvbmlvbnMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluLCBDaGFuZ2VMb2c6IG1lcmdlIHdpdGggZm91bmRyeSdzCi0JMTEvMTgvOTcgYnVpbGQgCi0KLVdlZCBOb3YgMjYgMTY6MDg6NTAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBGcm9tIEZyYW56IFNpcmwuCi0JKiBjb25maWcuZ3Vlc3MgKHBvd2VycGMqLSotbGludXgpOiBIYW5kbGUgZ2xpYmMyIGJldGEgcmVsZWFzZQotCWZvdW5kIG9uIFJlZEhhdCBMaW51eCBzeXN0ZW1zLgotCi1GcmkgTm92IDIxIDA5OjUxOjAxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzIChhbHBoYSBzdHVmZik6IE1lcmdlIHdpdGggRlNGIHRvIGF2b2lkIGluY29ycmVjdAotCWd1ZXNzZXMuCi0KLVRodSBOb3YgMTMgMTE6Mzg6MzcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1Nl04Ni1uY3Itc3lzdjQuMyopOiBUd2Vhay4KLQotTW9uIE5vdiAxMCAxNToyMzoyMSAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBsdG1haW4uc2g6IElmIG1rZGlyIGZhaWxzLCBjaGVjayB3aGV0aGVyIHRoZSBkaXJlY3Rvcnkgd2FzIGNyZWF0ZWQKLQlhbnlob3cgYnkgc29tZSBvdGhlciBwcm9jZXNzLgotCi1Nb24gTm92IDEwIDE0OjM4OjAzIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYtKi0qKTogQ29uZmlndXJlIGFsbCBkaXJlY3Rvcmllcy4KLQotU3VuIE5vdiAgOSAxNzozNjoyMCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMzB2LSotKik6IENvbmZpZ3VyZSBuZXdsaWIsIGxpYmliZXJ0eSBkaXJlY3RvcmllcwotCWZvciB0aGUgRDMwVi4KLQotU2F0IE5vdiAgOCAxNDo0Mjo1OSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMzB2LSotKik6IENvbmZpZ3VyZSB0YXJnZXQtbGliZ2xvc3Mgb24gdGhlIEQzMFYuCi0KLUZyaSBOb3YgIDcgMTA6MzQ6MDkgMTk5NyAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgotCi0gICAgICAgICogaW5jbHVkZS9saWJpYmVydHkuaDogQWRkIGV4dGVybiAiQyIgeyBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIEMrKwotICAgICAgICBwcm9ncm1zLgotICAgICAgICAqIGluY2x1ZGUvcmVtb3RlLXNpbS5oOiAgQWRkIGV4dGVybiAiQyIgeyBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIEMrKwotICAgICAgICBwcm9ncmFtcy4KLQotVGh1IE9jdCAzMCAxMTowOToyOSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMzB2LSotKik6IENvbmZpZ3VyZSBHQ0Mgbm93LgotCi1Nb24gT2N0IDI3IDEzOjE3OjI0IDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgYSAic2Vjb25kIHBhc3MiIG9mIHR3ZWFraW5nIG5vY29uZmlnZGlycywKLQlpcyBubyBsb25nZXIgbmVlZGVkLgotCi1Nb24gT2N0IDI3IDEyOjAzOjUzIDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IGNoZWNrLXRhcmdldC1saWJpbyBkZXBlbmRzIG9uIGFsbC10YXJnZXQtbGlic3RkYysrLgotCi1TdW4gT2N0IDI2IDExOjQ4OjI3IDE5OTcgIE1hbmZyZWQgSG9sbHN0ZWluICAobWFuZnJlZEBzLWRpcmVrdG5ldC5kZSkKLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcC1sZWFuKTogQ29tYmluZWQgd2l0aCBgbm9ybWFsJyBib290c3RyYXAKLQl0YXJnZXRzIHVzaW5nICIkQCIgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciBzaW1pbGFyIGJ1dCBub3QgaWRlbnRpY2FsCi0JdGFyZ2V0cyB3aXRob3V0IGhhdmluZyB0byBkdXBsaWNhdGUgY29kZS4KLQotTW9uIE9jdCAyMCAxNToyODo0OSAxOTk3ICBLbGF1cyBLImFtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBGaXggdG8gd29yayB3aXRoIERFQyBDLgotCi1UdWUgT2N0ICA3IDIzOjU4OjU3IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBZGQgbWlwcy10eDM5LWVsZiB0byBtYXJrZXRpbmcgbmFtZXMuCi0KLVR1ZSBPY3QgIDcgMTQ6MjQ6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdG1haW4uc2g6IEhhbmRsZSBzeW1saW5rcyBpbiBnZW5lcmF0ZWQgc2NyaXB0LgotCi1XZWQgT2N0ICAxIDEzOjExOjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBIYW5kbGUgYXV0b2NvbmYgc3R5bGUgZGlyZWN0b3J5IG9wdGlvbnM6IC0tYmluZGlyLAotCS0tZGF0YWRpciwgLS1pbmNsdWRlZGlyLCAtLWluZm9kaXIsIC0tbGliZGlyLCAtLWxpYmV4ZWNkaXIsCi0JLS1tYW5kaXIsIC0tb2xkaW5jbHVkZWRpciwgLS1zYmluZGlyLCAtLXNoYXJlZHN0YXRlZGlyLAotCS0tc3lzY29uZmRpci4KLQkqIE1ha2VmaWxlLmluIChzYmluZGlyLCBsaWJleGVjZGlyLCBzeXNjb25mZGlyKTogTmV3IHZhcmlhYmxlcy4KLQkoc2hhcmVkc3RhdGVkaXIsIGxvY2Fsc3RhdGVkaXIsIG9sZGluY2x1ZGVkaXIpOiBOZXcgdmFyaWFibGVzLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gYmluZGlyLCBkYXRhZGlyLCBpbmNsdWRlZGlyLAotCWluZm9kaXIsIGxpYmRpciwgbGliZXhlY2RpciwgbG9jYWxzdGF0ZWRpciwgbWFuZGlyLCBvbGRpbmNsdWRlZGlyLAotCXNiaW5kaXIsIHNoYXJlZHN0YXRlZGlyLCBhbmQgc3lzY29uZmRpci4KLQotTW9uIFNlcCAyOSAwMDozODowOCAxOTk3IEFhcm9uIEphY2tzb24gPGphY2tzb25AbmVncmlsLm1zcmNlLmhvd2FyZC5lZHU+Ci0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXAtbGVhbik6IE5ldyB0YXJnZXQuCi0KLVdlZCBTZXAgMjQgMTg6MDY6MjcgMTk5NyAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmFieWxvbi01LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdik6ICBSZW1vdmUgdGNsLCB0aywgZXhwZWN0LCBnZGIsIGl0Y2wsIHRpeCwgZGIsCi0gCXNuLCBhbmQgZ251c2VydiBmcm9tIG5vY29uZmlnZGlycy4KLQotV2VkIFNlcCAyNCAxNToxODozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0bWFpbi5zaDogVHdlYWsgc2hlbGwgcGF0dGVybiB0byBhdm9pZCBidWcgaW4gTmV0QlNEIC9iaW4vc2guCi0KLVRodSBTZXAgMTggMjM6NTg6MjcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0qIE1ha2VmaWxlLmluIChjcm9zcyk6IE5ldyB0YXJnZXQuCi0KLVRodSBTZXAgMTggMjE6NDM6MjMgMTk5NyAgQWxleGFuZHJlIE9saXZhICA8b2xpdmFAZGNjLnVuaWNhbXAuYnI+Ci0JCQkgIEplZmYgTGF3ICAgICAgICAgPGxhd0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYm9vdHN0cmFwMiwgYm9vdHN0cmFwMyk6IE5ldyB0YXJnZXRzLgotCShhbGwtYm9vdHN0cmFwKTogUmVtb3ZlIG91dGRhdGVkIGFuZCBjb25mdXNpbmcgdGFyZ2V0LgotCShib290c3RyYXAsIGJvb3RzdHJhcDIsIGJvb3RzdHJhcDMpOiBEb24ndCBwYXNzIEJPT1RfQ0ZMQUdTIGRvd24uCi0KLQotMTk5Ny0wOS0xNSAwMjozNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+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+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoKjpMaW51eDoqOiopOiBBZGQgc3VwcG9ydCBmb3IgUG93ZXJQQyBMaW51eC4KLQotVHVlIEp1biAxOCAxNDoyNDoxMiAxOTk2ICBLbGF1cyBLYWVtcGYgIChra2FlbXBmQHByb2dpcy5kZSkKLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIC1vcGVudm1zLgotCSogY29uZmlndXJlLmluIChhbHBoYSotKi0qdm1zKik6IFNldCBub2NvbmZpZ2RpcnMuCi0JKiBtYWtlLWFsbC5jb20sIHNldHVwLmNvbTogTmV3IGZpbGVzLgotCi1Nb24gSnVuIDE3IDE2OjM0OjQ2IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IHRleDNwYXRjaCBtb3ZlZCB0byB0ZXhpbmZvL3V0aWwuCi0KLVNhdCBKdW4gMTUgMTc6MTM6MjUgMTk5NiAgR2VvZmZyZXkgTm9lciA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IHJlbW92ZSBtYWtlIGZyb20gZGlzYWJsZS1pZi1DYW4tQ3Jvc3MgbGlzdAotCQllbmFibGUgZ2RiIGlmICR7aG9zdH0gYW5kICR7dGFyZ2V0fSBhcmUgY3lnd2luMzIKLQotRnJpIEp1biAgNyAxODoxNjo1MiAxOTk2ICBIYXJsYW4gU3Rlbm4gPGhhcmxhbkBwZmNzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzIChpPzg2LW5jci1zeXN2Kik6ICBFbWl0IG1pbm9yIHJlbGVhc2UgbnVtYmVycy4KLQlSZWNvZ25pemUgdGhlIE5DUiA0ODUwIG1hY2hpbmUgYW5kIE5DUiBQZW50aXVtLWJhc2VkIHBsYXRmb3Jtcy4KLQotV2VkIEp1biAgNSAwMDowOToxNyAxOTk2ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAd29tYmF0LmdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcuZ3Vlc3M6ICBDb21iaW5lIG1pcHMtbWlwcy1yaXNjb3MgY2FzZXMsIGFuZCB1c2UgY3BwIHRvCi0JZGlzdGluZ3Vpc2ggc3lzdi9zdnI0L2JzZCB2YXJpYW50cy4KLQlCYXNlZCBvbiBhIHBhdGNoIGZyb20gSGFybGFuIFN0ZW5uIDxoYXJsYW5AcGZjcy5jb20+LgotCi1GcmkgSnVuICA3IDE0OjI0OjQ5IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgY29weXJpZ2h0IG5vdGljZS4KLQkqIG1vdmUtaWYtY2hhbmdlOiBBZGRlZCBjb3B5cmlnaHQgbm90aWNlLgotCi1UaHUgSnVuICA2IDE2OjI3OjA1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChwb3dlcnBjbGUtKi1zb2xhcmlzKik6IFVudGlsIHdlIGdldCBzaGFyZWQKLQlsaWJyYXJpZXMgd29ya2luZywgZG9uJ3QgYnVpbGQgZ2RiLCBzaW0sIG1ha2UsIHRjbCwgdGssIG9yCi0JZXhwZWN0LgotCi1UdWUgSnVuICA0IDIwOjQxOjQ1IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6ICBNZXJnZSB3aXRoIEZTRjoKLQotCU1vbiBKdW4gIDMgMDg6NDk6MTQgMTk5NiAgS2FybCBIZXVlciAgPGt3emhAZ251LmFpLm1pdC5lZHU+Ci0JKiBjb25maWcuZ3Vlc3MgKCo6TGludXg6KjoqKTogQWRkIGd1ZXNzIGZvciBzcGFyYy11bmtub3duLWxpbnV4LgotCi0JRnJpIE1heSAyNCAxODozNDo1MyAxOTk2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEBkZWxhc3lkLmdudS5haS5taXQuZWR1PgotCSogY29uZmlnLmd1ZXNzIChBVmlpT046ZGd1eDoqOiopOiBGaXggdHlwbyBpbiByZWNvZ25pemluZyBtYzg4MTEwLgotCi0JRnJpIEFwciAxMiAyMDowMzo1OSAxOTk2ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAc3BpZmYuZ251LmFpLm1pdC5lZHU+Ci0JKiBjb25maWcuZ3Vlc3M6ICBDb21iaW5lIHR3byBPU0YxIHJ1bGVzLgotCUFsc28gcmVjb2duaXplIGZpZWxkIHRlc3QgdmVyc2lvbnMuICBGcm9tIG1qckB6azMuZGVjLmNvbS4KLQkqIGNvbmZpZy5ndWVzcyAoZGd1eCk6ICBVc2UgL3Vzci9iaW4vdW5hbWUgcmF0aGVyIHRoYW4gdW5hbWUsCi0JYmVjYXVzZSBHTlUgdW5hbWUgZG9lcyBub3Qgc3VwcG9ydCAtcC4gIEZyb20gcG1yQHBhamF0by5jb20uCi0KLVR1ZSBKdW4gIDQgMTE6MDc6MjUgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjc2szLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChNQUtFRElSUyk6IFJlbW92ZWQgJCh0b29sZGlyKS4KLQotVHVlIE1heSAyOCAxMjozMDo1MCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1SRUFETUU6IERvY3VtZW50IEdDQ0luY2x1ZGVzLgotCi1TdW4gTWF5IDI2IDE1OjE2OjI3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhLSotbGludXgqKTogU2V0IGVuYWJsZV9zaGFyZWQgdG8geWVzLgotCi1UdWUgTWF5IDIxIDE1OjQxOjM5IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogSGFuZGxlIC0tZW5hYmxlLUZPTyBhbmQgLS1kaXNhYmxlLUZPTy4KLQotTW9uIE1heSAyMCAxMDoxMjoyOSAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKCotKi1jeWd3aW4zMik6IENvbmZpZ3VyZSBtYWtlLgotCi1UdWUgTWF5ICA3IDE0OjE5OjQyIDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAc251ZmZsZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5ldC1pbnN0YWxsKTogUXVvdGUgdmFsdWUgb2YgSU5TVEFMTF9NT0RVTEVTLgotCi1GcmkgTWF5ICAzIDA4OjU3OjE3IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAbGlzYS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWluZXQpOiBEZXBlbmQgb24gYWxsLXBlcmwuCi0KLQkqIE1ha2VmaWxlLmluIChpbmV0LWluc3RhbGwpOiBOZXcgdGFyZ2V0LgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWluZXQpOiBEZXBlbmQgb24gYWxsLXRjbC4KLQkoYWxsLWluZXQpOiBEZXBlbmQgb24gYWxsLXNlbmQtcHIuCi0KLVR1ZSBBcHIgMzAgMTM6NTU6NTEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHBvd2VycGNsZS0qLXNvbGFyaXMqKTogVHVybiBvZmYgdGsgYW5kIHRjbAotCXRlbXBvcmFyaWx5LgotCi1UaHUgQXByIDI1IDExOjQ4OjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgLS13aXRoLWdudS1sZCBvbiBBSVguCi0KLVRodSBBcHIgMjUgMDY6MzM6MzYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KLQotCSogY29uZmlndXJlLmluIChwb3dlcnBjbGUtKi1zb2xhcmlzKik6IFR1cm4gb2ZmIGdkYiB0ZW1wb3JhcmlseS4KLQotVHVlIEFwciAyMyAwOTowNzozOSAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01PRFVMRVMpOiBBZGRlZCBhbGwtaW5ldC4KLQkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEFkZGVkIGNoZWNrLWluZXQuCi0JKElOU1RBTExfTU9EVUxFUyk6IEFkZGVkIGluc3RhbGwtaW5ldC4KLQkoQ0xFQU5fTU9EVUxFUyk6IEFkZGVkIGNsZWFuLWluZXQuCi0JKGFsbC1pbmRlbnQpOiBOZXcgdGFyZ2V0LgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBBZGRlZCBpbmV0LgotCShuYXRpdmVfb25seSk6IEFkZGVkIGluZXQuCi0JKG5vY29uZmlnZGlycyk6IEFkZGVkIGluZXQuCi0KLUZyaSBBcHIgMTkgMTU6MzU6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGNvbmZpZ3VyZSBsaWJnbG9zcyBpZiB3ZSBhcmUgbm90IGNvbmZpZ3VyaW5nCi0JbmV3bGliLgotCi1XZWQgQXByIDE3IDE5OjMwOjAxIDE5OTYgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY29uZmlndXJlIGxpYmdsb3NzIGZvciB1bnN1cHBvcnRlZAotCWFyY2hpdGVjdHVyZXMuCi0KLVR1ZSBBcHIgMTYgMTE6MTc6MDUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0xFQU5fTU9EVUxFUyk6IEFkZCBjbGVhbi1hcGFjaGUuCi0KLU1vbiBBcHIgMTUgMTU6MDk6MDUgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTKTogSW5jbHVkZSBhbGwtYXBhY2hlLgotCShDUk9TU19DSEVDS19NT0RVTEVTKTogSW5jbHVkZSBjaGVjay1hcGFjaGUuCi0JKElOU1RBTExfTU9EVUxFUyk6IEluY2x1ZGUgaW5zdGFsbC1hcGFjaGUuCi0JKGFsbC1hcGFjaGUpOiBOZXcgdGFyZ2V0LgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIGFwYWNoZSBldmVyeXdoZXJlIHBlcmwgaXMgc2Vlbi4KLQotTW9uIEFwciAxNSAxNDo1OToxMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgc3VwcG9ydCBmb3IgY2xlYW4te21vZHVsZX0gYW5kCi0JY2xlYW4tdGFyZ2V0LXttb2R1bGV9IHJ1bGVzLgotCi1XZWQgQXByIDEwIDIxOjM3OjQxIFBEVCAxOTk2ICBNYXJpbHluIEUuIFNhbmRlciA8bXNhbmRlckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKCotKi1vc2UpIGRvIG5vdCBidWlsZCBsaWJnbG9zcy4KLQotTW9uIEFwciAgOCAxNjoxNjoyMCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzcyAocHJlcCo6U3VuT1M6NS4qOiopOiBUdXJuIGludG8KLQlwb3dlcnBlbGUtdW5rbm93bi1zb2xhcmlzMi4KLQotTW9uIEFwciAgOCAxNDo0NTo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgotCWRpcmVjdG9yaWVzLgotCi1GcmkgQXByICA1IDA4OjE3OjU3IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhvc3Q9PXNvbGFyaXMpOiBQYXNzIG9ubHkgdGhlIGZpcnN0IHdvcmQgb2YgJENDCi0JdG8gL3Vzci9iaW4vd2hpY2ggd2hlbiBjaGVja2luZyBpZiB3ZSdyZSB1c2luZyAvdXNyL2Njcy9iaW4vY2MuCi0KLUZyaSBBcHIgIDUgMDM6MTY6MTMgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBwYXNzIGRvd24gJChNQUtFKS4KLQotVGh1IE1hciAyOCAxNDoxMToxMSAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01PRFVMRVMpOiBJbmNsdWRlIGFsbC1wZXJsLgotCShDUk9TU19DSEVDS19NT0RVTEVTKTogSW5jbHVkZSBjaGVjay1wZXJsLgotCShJTlNUQUxMX01PRFVMRVMpOiBJbmNsdWRlIGluc3RhbGwtcGVybC4KLQkoQUxMX1gxMV9NT0RVTEVTKTogSW5jbHVkZSBhbGwtZ3VpbGUuCi0JKENIRUNLX1gxMV9NT0RVTEVTKTogSW5jbHVkZSBjaGVjay1ndWlsZS4KLQkoSU5TVEFMTF9YMTFfTU9EVUxFUyk6IEluY2x1ZGUgaW5zdGFsbC1ndWlsZS4KLQkoYWxsLXBlcmwpOiBOZXcgdGFyZ2V0LgotCShhbGwtZ3VpbGUpOiBOZXcgdGFyZ2V0LgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBJbmNsdWRlIHBlcmwgYW5kIGd1aWxlLgotCShuYXRpdmVfb25seSk6IEluY2x1ZGUgcGVybCBhbmQgZ3VpbGUuCi0JKG5vY29uZmlnZGlycyk6IERvbid0IGJ1aWxkIGd1aWxlIGFuZCBwZXJsOyBubyBwb3J0cyBoYXZlIGJlZW4KLQlkb25lLgotCi1UdWUgTWFyIDI2IDIxOjE4OjUwIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+Ci0KLSAgICAgICAgKiBjb25maWd1cmUgKC0tZW5hYmxlLSopOiBIYW5kbGUgcXVvdGVkIG9wdGlvbiBsaXN0cyBzdWNoIGFzCi0gICAgICAgIC0tZW5hYmxlLXNpbS1jZmxhZ3M9Jy1nMCAtTycgYmV0dGVyLgotCi1UaHUgTWFyIDIxIDExOjUzOjA4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHssaW5zdH1hbGwtdGFyZ2V0KTogTmV3IHJ1bGUgc28gd2UgY2FuIG1ha2UgYW5kCi0JaW5zdGFsbCBhbGwgb2YgdGhlIHRhcmdldCBkaXJlY3RvcmllcyBlYXNpbHkuCi0KLVdlZCBNYXIgMjAgMTg6MTA6NTcgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG1pc3NpbmcgZ2xvYmFsIGZsYWcgaW4gc2VkIHN1YnN0aXR1dGlvbiB3aGVuCi0JZGVsZXRpbmcgYHRhcmdldC0nIGZyb20gJHtjb25maWdkaXJzfS4KLQotVGh1IE1hciAxNCAxOToxNTowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChET19YKTogRG9uJ3QgZ2V0IGNvbmZ1c2VkIGlmIENDIGNvbnRhaW5zIGA9JyBpbiBhbgotCW9wdGlvbi4KLQotCSogY29uZmlndXJlLmluIChtaXBzKi1uZWMtc3lzdnI0Kik6IFVzZSBhIGhvc3RfbWFrZWZpbGVfZnJhZyBvZgotCWNvbmZpZy9taC1uZWN2NC4KLQotCSogaW5zdGFsbC5zaDogQ29ycmVjdCBtaXNzcGVsbGluZyBvZiB0cmFuc2Zvcm1iYXNlbmFtZS4KLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgbWlwcy0qLXN5c3YqLgotCi1Nb24gTWFyIDExIDE1OjM2OjQyIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3JpdHRlcnMuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIG1vbjk2MC4KLQotU3VuIE1hciAxMCAxMzoxODozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVzdG9yZSBDYW5hZGlhbiBDcm9zcyBoYW5kbGluZyBvZiBCSVNPTiBhbmQgTEVYLAotCXJlbW92ZWQgaW4gRmViIDIwIGNoYW5nZS4KLQotRnJpIE1hciAgOCAyMDowNzowOSAxOTk2ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogUkVBRE1FOiAgU3VnZ2VzdGlvbnMgZnJvbSBUb3Jiam9ybiBHcmFubHVuZCA8dGVnZUBtYXRlbWF0aWsuc3Uuc2U+OgotCU1lbnRpb24gbWFrZSBpbnN0YWxsLiAgUmVtb3ZlIHRoZSBvbGQgY29weXJpZ2h0IGRhdGUgYXMgd2VsbCB0aGUKLQljbHVtc3kgYW5kIHJhdGhlciBwb2ludGxlc3MgY29weXJpZ2h0IG9uIHRoZSBSRUFETUUgZmlsZS4KLQotRnJpIE1hciAgOCAxNzo1MTozNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBJZiB0aGVyZSBpcyBhCi0JTWFrZWZpbGUgYWZ0ZXIgcnVubmluZyBzeW1saW5rLXRyZWUsIHRoZW4gcnVuIGBtYWtlIGRpc3RjbGVhbicgdG8KLQlhdm9pZCBjbG9iYmVyaW5nIGFueSBnZW5lcmF0ZWQgZmlsZXMgaW4gc3JjZGlyLgotCi1UdWUgTWFyICA1IDA4OjIxOjQ0IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtNjhrLSotbmV0YnNkKik6IEJ1aWxkIGV2ZXJ5dGhpbmcgbm93LgotCi1XZWQgRmViIDI4IDEyOjI1OjQ2IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEZpeCBxdW90aW5nLgotCi1UdWUgRmViIDI3IDExOjMzOjU3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjbGV0LSotKik6IEJ1aWxkIGV2ZXJ5dGhpbmcgbm93LgotCi1UdWUgRmViIDI3IDE0OjMxOjUxIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWd1cmUuaW4gKG02OGstKi1saW51eCopOiBOZXcgaG9zdC4KLQotTW9uIEZlYiAyNiAxNDozMjo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQ2hlY2sgZm9yIGJpc29uIGJlZm9yZSBieWFjYy4KLQotVHVlIEZlYiAyMCAyMzoxMjozNSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiBjb25maWd1cmU6ICBDaGFuZ2UgdGhlIHdheSBMRVggYW5kIEJJU09OL1lBQ0MgYXJlCi0Jc2V0LiAgY29uZmlndXJlIG5vdyBkZWZpbmVzIERFRkFVTFRfTEVYIGFuZCBERUZBVUxUX1lBQ0MgYnkKLQlzZWFyY2hpbmcgUEFUSC4gIFRoZXNlIGFyZSB1c2VkIGFzIGZhbGxiYWNrcyBieSBNYWtlZmlsZS5pbiBpZgotCWZsZXgvYmlzb24vYnlhY2MgYXJlbid0IGluIG9iamRpci4KLQotTW9uIEZlYiAxOSAxMTo0NTozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBNYWtlIGV2ZXJ5dGhpbmcgd2hpY2ggZGVwZW5kcyB1cG9uIGFsbC1iZmQgYWxzbwotCWRlcGVuZCB1cG9uIGFsbC1vcGNvZGVzLCBpbiBjYXNlIC0td2l0aC1jb21tb25iZmRsaWIgaXMgdXNlZC4KLQotVGh1IEZlYiAxNSAxOTo1MDo1MCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdCAqLSotY3lnd2luMzIpOiBEb24ndCBidWlsZCBnZGIgaWYgd2UgYXJlCi0JYnVpbGRpbmcgTlQgbmF0aXZlIGNvbXBpbGVycyBvbiBVbml4LgotCi1UaHUgRmViIDE1IDE3OjQyOjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBnZXQgQ0MgZnJvbSB0aGUgaG9zdCBNYWtlZmlsZSBmcmFnbWVudCBpZiB3ZQotCWNhbiBmaW5kIGdjYyBpbiBQQVRILCBvciBpZiB0aGlzIGlzIGEgQ2FuYWRpYW4gQ3Jvc3MuICBNb3ZlIHRoZQotCVNvbGFyaXMgdGVzdCBmb3IgL3Vzci91Y2IvY2MgdG8gdGhlIHBvc3QgdGFyZ2V0IHNjcmlwdCwganVzdCBhZnRlcgotCXRoZSBjb21waWxlciBzYW5pdHkgdGVzdC4KLQotV2VkIEZlYiAxNCAxNjo1Nzo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IE1lcmdlIHdpdGggRlNGLgotCi1UdWUgRmViIDEzIDE0OjI3OjQ4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFJQQVRIX0VOVlZBUik6IE5ldyB2YXJpYWJsZS4KLQkoUkVBTExZX1NFVF9MSUJfUEFUSCk6IFVzZSBpdC4KLQkqIGNvbmZpZ3VyZS5pbjogT24gSFAvVVgsIHNldCBSUEFUSF9FTlZWQVIgdG8gU0hMSUJfUEFUSC4KLQotTW9uIEZlYiAxMiAxNToyODo0OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluOiBSZWNvZ25pemUgc3BhcmNsZXQgY3B1LgotCi1Nb24gRmViIDEyIDE1OjMzOjU5IDE5OTYgIENocmlzdGlhbiBCYXVlcm5mZWluZCA8Y2hyaXNiZmRAdGhlb3JpZTMucGh5c2lrLnVuaS1lcmxhbmdlbi5kZT4KLQotCSogY29uZmlnLmd1ZXNzOiAgU3VwcG9ydCBtNjhrLWNibS1zeXN2NC4KLQotU2F0IEZlYiAxMCAxMjowNjo0MiAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnLmd1ZXNzICgqOkxpbnV4Oio6Kik6IEd1ZXNzIG02OGstdW5rbm93bi1saW51eCBhbmQKLQltNjhrLXVua25vd24tbGludXhhb3V0IGZyb20gbGlua2VyIGhlbHAgc3RyaW5nLiAgUHV0IHF1b3RlcyBhcm91bmQKLQkkbGRfaGVscF9zdHJpbmcuCi0KLVRodSBEZWMgIDcgMDk6MDM6MjQgMTk5NSAgVG9tIEhvcnNsZXkgIDxUb20uSG9yc2xleUBtYWlsLmhjc2MuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKHBvd2VycGMtaGFycmlzLXBvd2VydW5peCk6IEFkZCBndWVzcyBmb3IgcG9ydAotCXRvIG5ldyB0YXJnZXQuCi0KLVRodSBGZWIgIDggMTU6Mzc6NTIgMTk5NiAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKFVOQU1FX1ZFUlNJT04pOiBSZWNvZ25pemUgWDQueCBhcyBhbiBPU0YgdmVyc2lvbi4KLQotTW9uIEZlYiAgNSAxNjozNjo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogSWYgLS1lbmFibGUtc2hhcmVkIHdhcyB1c2VkLCBzZXQgU0VUX0xJQl9QQVRIIHRvCi0JJChSRUFMTFlfU0VUX0xJQl9QQVRIKSBpbiBNYWtlZmlsZS4KLQkqIE1ha2VmaWxlLmluIChTRVRfTElCX1BBVEgpOiBOZXcgdmFyaWFibGUuCi0JKFJFQUxMWV9TRVRfTElCX1BBVEgpOiBOZXcgdmFyaWFibGUuCi0JKCQoRE9fWCkpOiBVc2UgJChTRVRfTElCX1BBVEgpLgotCShpbnN0YWxsLmFsbCwgZ2NjLW5vLWZpeGVkaW5jbHVkZXMsICQoQUxMX01PRFVMRVMpKTogTGlrZXdpc2UuCi0JKCQoTkFUSVZFX0NIRUNLX01PRFVMRVMpLCAkKENST1NTX0NIRUNLX01PRFVMRVMpKTogTGlrZXdpc2UuCi0JKCQoSU5TVEFMTF9NT0RVTEVTKSwgJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogTGlrZXdpc2UuCi0JKCQoQUxMX1RBUkdFVF9NT0RVTEVTKSwgJChDSEVDS19UQVJHRVRfTU9EVUxFUykpOiBMaWtld2lzZS4KLQkoJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSwgJChBTExfWDExX01PRFVMRVMpKTogTGlrZXdpc2UuCi0JKCQoQ0hFQ0tfWDExX01PRFVMRVMpLCAkKElOU1RBTExfWDExX01PRFVMRVMpKTogTGlrZXdpc2UuCi0JKGFsbC1nY2MsIGFsbC1ib290c3RyYXAsIGNoZWNrLWdjYywgaW5zdGFsbC1nY2MpOiBMaWtld2lzZS4KLQkoaW5zdGFsbC1kb3NyZWwpOiBMaWtld2lzZS4KLQkoYWxsLW9wY29kZXMpOiBEZXBlbmQgdXBvbiBhbGwtbGliaWJlcnR5LgotCi1TdW4gRmViICA0IDE2OjUxOjExIDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoKjpDWUdXSU4qKTogTmV3Ci0KLVNhdCBGZWIgIDMgMTA6NDI6MzUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXRhcmdldC13aW5zdXApOiBBbGwgYWxsLXRhcmdldC1saWJpYmVydHkuCi0KLUZyaSBGZWIgIDIgMTc6NTg6NTYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBtaXNzaW5nICMgaW4gZnJvbnQgb2YgY29tbWVudC4KLQotVGh1IEZlYiAgMSAxNDozODoxMyAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGFkZCBzZWNvbmQgcGFzcyB0byB0aGluZ3MgYWRkZWQgdG8gbm9jb25maWdkaXJzCi0Jc28gKi1nbS1tYWdpYyBjYW4gZXhjbHVkZSBsaWJnbG9zcyBwcm9wZXJseS4KLQotVGh1IEZlYiAgMSAxMToxMDoxNiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmUgKGV4dHJhbGlic19uYW1lLCByZXpfbmFtZSk6IFNldCBjb3JyZWN0bHkKLQlmb3IgTVdDNjhLIGNvbXBpbGVyLgotCi0JKiBtcHctUkVBRE1FOiBBZGQgbW9yZSBpbmZvIG9uIHRoZSBuZWNlc3NhcnkgYnVpbGQgdG9vbHMuCi0KLVRodSBGZWIgIDEgMTA6MjI6MzggMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluLCBjb25maWcuc3ViOiBSZWNvZ25pemUgY3lnd2luMzIuCi0KLVdlZCBKYW4gMzEgMTQ6MTc6MTAgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZy5ndWVzcywgY29uZmlnLnN1YjogUmVjb2duaXplIEEvVVguCi0KLVdlZCBKYW4gMzEgMTM6NTI6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBNZXJnZSB3aXRoIGdjYy9jb25maWcuc3ViLgotCi1UaHUgSmFuIDI1IDExOjAxOjEwIDE5OTYgIFJheW1vbmQgSm91ICA8cmpvdUBtZXhpY2FuLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1idWlsZC5pbiAoZG8tYmludXRpbHMpOiBBZGQgYnVpbGQgb2Ygc3RhbXBzLgotCi1UaHUgSmFuIDI1IDE3OjA1OjI2IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnLnN1YjogQWRkIHJlY29nbml0aW9uIGZvciBtaXBzNjR2cjQxMDAqLSogdGFyZ2V0cy4KLQotV2VkIEphbiAyNCAxMjo0Nzo1NSAxOTk2ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIHRlc3QtYnVpbGQubWs6IEFkZCBjaGVja2luZyBvZiBgaHB1eDknIHJhdGhlciB0aGFuIGp1c3QgYGhwdXgnLgotCUFkZCBjcmVhdGlvbiBvZiBnY29uZmlnYXJncyB3aXRoIGAtLWVuYWJsZS1zaGFyZWQnIHR1cm5lZCBvbi4KLQkoJChob3N0KS1zdGFtcC1zdGFnZTItY29uZmlndXJlZCk6IFBhc3MgJChnY29uZmlnYXJncykuCi0JKCQoaG9zdCktc3RhbXAtc3RhZ2UzLWNvbmZpZ3VyZWQpOiBMaWtld2lzZS4KLQkoSE9MRVMpOiBBZGQgY2hhdHIgYW5kIGxkZC4KLQkoaTM4Ni1uY3Itc3lzdjQuMyopOiBBZGQgdXNlIG9mIC91c3IvY2NzL2JpbiBpbiB0aGUgUEFUSCBhbmQgSE9MRV9ESVJTLgotCi1XZWQgSmFuIDI0IDIwOjMyOjMwIDE5OTYgIFRvcmJqb3JuIEdyYW5sdW5kICA8dGVnZUBub2lzeS5tYXRlbWF0aWsuc3Uuc2U+Ci0KLQkqIGNvbmZpZ3VyZTogUGFzcyAtLW5mcCB0byByZWN1cnNpdmUgY29uZmlndXJlcy4KLQotTW9uIEphbiAyMiAxMDo0MTo1NiAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRExMVE9PTCk6IE5ldy4KLQkoRExMVE9PTF9GT1JfVEFSR0VUKTogTmV3LgotCShFWFRSQV9IT1NUX0ZMQUdTKTogUGFzcyBkb3duIERMTFRPT0wuCi0JKEVYVFJBX1RBUkdFVF9GTEFHUyk6IERpdHRvLgotCShFWFRSQV9HQ0NfRkxBR1MpOiBEaXR0by4KLQkoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogRGl0dG8uCi0JKERPX1gpOiBEaXR0by4KLQkqIGNvbmZpZ3VyZTogQWRkIERMTFRPT0wuCi0KLUZyaSBKYW4gMTkgMTM6MzA6MTUgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JU0NPIE9wZW5TZXJ2ZXIgNSBjaGFuZ2VzIGZyb20gUm9iZXJ0IExpcGUgPHJvYmVydGxAZGdpaS5jb20+OgotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLXNjbzMuMnY1Kik6IFVzZSBtaC1zeXN2IGluc3RlYWQgb2YKLQltaC1zY28sIHNpbmNlIG9sZCB3b3JrYXJvdW5kcyBubyBsb25nZXIgbmVlZGVkLCBhbmQgZG9uJ3QKLQlidWlsZCBsZCwgc2luY2UgbGlicmFyaWVzIGhhdmUgd2VhayBzeW1ib2xzIGluIENPRkYuCi0KLVN1biBKYW4gMTQgMjM6MDE6MzEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBBZGQgbWlzc2luZyAnOycuCi0KLUZyaSBKYW4gMTIgMTU6MjU6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IE1ha2Ugc3VyZSB0aGF0ICR7Q0N9IGNhbiBiZSB1c2VkIHRvIGNvbXBpbGUgYW4KLQlleGVjdXRhYmxlLgotCi1XZWQgSmFuICAzIDE3OjU0OjQxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChuZXdsaWIudGFyLmd6KTogRGVsZXRlIGJ1aWxkaW5nIG9mIG5ld2xpYidzIGluZm8gZmlsZXMuCi0KLU1vbiBKYW4gIDEgMTk6MDk6MTQgMTk5NiAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogUHV0IGxkIG9yIGdhcyBpbiB0aGlzIGVhcmx5LCBpZiB0aGUKLQl1c2VyIHNwZWNpZmljYWxseSB1c2VkIC0td2l0aC1nbnUtbGQ9bm8gb3IgLS13aXRoLWdudS1hcz1uby4KLQotU2F0IERlYyAzMCAxNjowODo1NyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW46IEFkZCBzdXBwb3J0IGZvcgotCS0tZGlzYWJsZS17c29mdGZsb2F0LG02ODg4MSxtNjgwMDAsbTY4MDIwfSBvbiBtNjgqLSotKi4KLQlTaW1wbGlmeSBzZXR0aW5nIG9mIG11bHRpZGlycyBmcm9tIC0tZGlzYWJsZS1mb28uCi0KLUZyaSBEZWMgMjkgMDc6NTY6MTEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhUUkFfR0NDX0ZMQUdTKTogSWYgYW55IG9mIHRoZSBtYWtlIHZhcmlhYmxlcwotCUxBTkdVQUdFUywgQk9PVF9DRkxBR1MsIFNUTVBfRklYUFJPVE8sIExJTUlUU19IX1RFU1QsCi0JTElCR0NDMV9URVNULCBMSUJHQ0MyX0NGTEFHUywgTElCR0NDMl9JTkNMVURFUywgYW5kIEVOUVVJUkUgYXJlCi0Jbm9uLWVtcHR5LCBwYXNzIHRoZW0gb24gdG8gdGhlIAlHQ0MgbWFrZS4KLQkoYWxsLWJvb3RzdHJhcCk6IE5ldyBydWxlIHRoYXQgaXMgbGlrZSBhbGwtZ2NjLCBleGNlcHQgaXQgZXhlY3V0ZXMKLQl0aGUgR0NDIGJvb3RzdHJhcCBydWxlIGluc3RlYWQgb2YgdGhlIEdDQyBhbGwgcnVsZS4KLQotV2VkIERlYyAyNyAxNTo1MTo0OCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW4gKG1sX3JlYWxzcmNkaXIpOiBOZXcsIHRvIGFjY291bnQgZm9yICR7c3ViZGlyfS4KLQotVHVlIERlYyAyNiAxMTo0NTozMSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoQVZpaU9OOmRndXg6KjoqKTogVXBkYXRlIGZyb20gRlNGIHRvIGFkZCBwZW50aXVtCi0JREcvVVggc3VwcG9ydC4KLQotRnJpIERlYyAxNSAxMDowMToyNyAxOTk1ICBTdGFuIENveCAgPGNveHNAZGctcnRwLmRnLmNvbT4KLQotCSogY29uZmlnLnN1YiAoaSo4NiopIENoYW5nZSBbMzQ1XSB0byBbMzQ1Nl0KLQotV2VkIERlYyAyMCAxNzo0MTo0MCAxOTk1ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogQWRkIGdhcyBvciBsZCBpZiAtLXdpdGgtZ251LWFzPW5vIG9yCi0JLS13aXRoLWdudS1sZD1uby4KLQotV2VkIERlYyAyMCAxNToxNTozNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy1tbC5pbiAocnM2MDAwKiwgcG93ZXJwYyopOiBBZGQgc3dpdGNoZXMgdG8gY29udHJvbCB3aGljaAotCUFJWCBtdWx0aWxpYnMgZ2V0IGJ1aWx0LgotCi1Nb24gRGVjIDE4IDE3OjU1OjQ2IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtd2luMzIpOiBEb24ndCBidWlsZCBleHBlY3QgaWYgd2UncmUgbm90Ci0JYnVpbGRpbmcgdGhlIHRjbCBzdWJkaXIuCi0KLU1vbiBEZWMgMTggMTE6NDc6MTkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogKGNvbmZpZ3VyZS10YXJnZXQtZXhhbXBsZXMsIGFsbC10YXJnZXQtZXhhbXBsZXMpOgotCU5ldyB0YXJnZXRzLCBjb25maWd1cmUgYW5kIGJ1aWxkIGV4YW1wbGUgcHJvZ3JhbXMuCi0KLUZyaSBEZWMgMTUgMTY6MTM6MDMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlndXJlOiBJZiBhbiBtcHctY29uZmlnLmluIGdlbmVyYXRlZCBhIGZpbGUgbWsuc2VkLAotCXVzZSBpdCBhcyBpbnB1dCB0byBzZWRpdCB0aGUgZ2VuZXJhdGVkIE1QVyBtYWtlZmlsZS4KLQkqIG1wdy1SRUFETUU6IEFkZCBhIHN1Z2dlc3Rpb24gYWJvdXQgR2VzdGFsdC5oLgotCi1XZWQgRGVjIDEzIDE2OjQzOjUxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWNjZXB0ICotKi1pZWVlKi4KLQotVHVlIERlYyAxMiAxMTo1Mjo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChsb2NhbC1kaXN0Y2xlYW4pOiBSZW1vdmUgJChUQVJHRVRfU1VCRElSKS4gIEZyb20KLQlSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+LgotCi1Nb24gRGVjIDExIDE1OjMxOjU4IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhvc3Q9PXBvd2VycGMtcGUpOiBBZGQgbWFueSBkaXJlY3RvcmllcyB0byBub2NvbmZpZ2RpcnMKLQlmb3IgcG93ZXJwYy1wZSBuYXRpdmUuCi0JKHRhcmdldD09aTM4Ni13aW4zMik6IGFkZCB0Y2wsIG1ha2UgdG8gbm9jb25maWdkaXJzIGlmIGNhbmFkaWFuIGNyb3NzLgotCSh0YXJnZXQ9PXBvd2VycGMtcGUpOiBkdXBsaWNhdGUgaTM4Ni13aW4zMiBlbnRyeS4KLQotU2F0IERlYyAgOSAxNDo1ODoyOCAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRXhjbHVkZSB0YXJnZXQtbmV3bGliIGZvciBhbGwgdmVyc2lvbnMKLQlvZiB2eHdvcmtzLCBub3QganVzdCB2eHdvcmtzNS4xLgotCi1Nb24gRGVjICA0IDEyOjA1OjQwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogQWRkIHN1cHBvcnQgZm9yIGV4ZWMtcHJlZml4LgotCi1Nb24gRGVjICA0IDEwOjIyOjUwIDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBIUCBtb2RlbCA4MTYgbWFjaGluZXMgYXMgaGF2aW5nCi0JYSBQQTEuMSBwcm9jZXNzb3IuCi0KLU1vbiBEZWMgIDQgMTI6Mzg6MTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IElnbm9yZSBuZXcgYXV0b2NvbmYgY29uZmlndXJlIG9wdGlvbnMuCi0KLVRodSBOb3YgMzAgMTQ6NDU6MjUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvbXQtdjgxMCAoQ0NfRk9SX1RBUkdFVCk6IEFkZCAtYW5zaSBmbGFnLiAgTkVDIGNvbXBpbGVyCi0gCWRlZmF1bHRzIHRvIEsmUiBtb2RlLCBidXQgZG9lc24ndCBoYXZlIHZhcmFyZ3MuaCwgc28gd2UgaGF2ZSB0byAKLQljb21waWxlIGluIEFOU0kgbW9kZS4KLQotVGh1IE5vdiAzMCAxNjo1NzozMyAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAd29tYmF0LmdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgUGVudGl1bSB1bmRlciBTQ08uCi0JRnJvbSBSb2JlcnQgTGlwZSA8cm9iZXJ0bEBhcm5ldC5jb20+LgotCi1XZWQgTm92IDI5IDEzOjQ5OjA4IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEaXNhYmxlIHRhcmdldC1saWJpbyBvbiB2ODEwLSotKi4KLQkqIGNvbmZpZy9tdC12ODEwIChDQ19GT1JfVEFSR0VULCBBU19GT1JfVEFSR0VULCBBUl9GT1JfVEFSR0VULAotCVJBTkxJQl9GT1JfVEFSR0VUKTogU2V0IGFzIGFwcHJvcHJpYXRlIGZvciBORUMgdjgxMCB0b29sY2hhaW4uCi0KLVdlZCBOb3YgMjkgMTI6MTI6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGNvbmZpZ3VyZSBnYXMgZm9yIGFscGhhLWRlYy1vc2YqLgotCi1UdWUgTm92IDI4IDE3OjE2OjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEZWZhdWx0IHRvIC0td2l0aC1zdGFicyBmb3Igc29tZSB0YXJnZXRzIGZvciB3aGljaAotCWl0IG1ha2VzIHNlbnNlOiBtaXBzKi0qLSosIGFscGhhKi0qLW9zZiosIGlbMzQ1XTg2Ki0qLXN5c3Y0KiBhbmQKLQlpWzM0NV04NiotKi11bml4d2FyZSouCi0KLU1vbiBOb3YgMjcgMTM6NDQ6MTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW46IEdldCBsaXN0IG9mIG11bHRpZGlycyB1c2luZyBnY2MgLS1wcmludC1tdWx0aS1saWIKLQlyYXRoZXIgdGhhbiBiYXNpbmcgaXQgb24gdGhlIHRhcmdldC4gIFNpbXBsaWZ5IGhhbmRsaW5nIG9mIG9wdGlvbnMKLQljb250cm9sbGluZyB3aGljaCBkaXJlY3RvcmllcyB0byBjb25maWd1cmUuICBSZW1vdmUgZXh0cmFuZW91cwotCXNsYXNoIGluIG11bHRpLWNsZWFuIHRhcmdldC4KLQotRnJpIE5vdiAyNCAxNzoyOToyOSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGRlbmViLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy1tbC5pbjogUHJlZml4IG1vcmUgdmFyaWFibGVzIHdpdGggbWxfIHNvIHRoZXkgZG9uJ3QgY29sbGlkZQotCXdpdGggY29uZmlndXJlJ3MuCi0KLVdlZCBOb3YgMjIgMTE6Mjc6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IERvbid0IHR1cm4gLXYgaW50byAtLXYuCi0KLVR1ZSBOb3YgMjEgMTY6NDg6MDIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdhcmdzKTogRml4IHR5cG8uCi0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBBZGQgc3ltbGluay10cmVlLgotCi1UdWUgTm92IDIxIDE0OjA4OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTdHJpcCAtLWhvc3QgYW5kIC0tdGFyZ2V0IG9wdGlvbnMgZnJvbQotCUNPTkZJR19BUkdVTUVOVFMsIGFuZCBhbHdheXMgY29uZmlndXJlIGZvciAtLWhvc3Qgb25seS4gIEFkZAotCS0td2l0aC1jcm9zcy1ob3N0IG9wdGlvbiB3aGVuIGJ1aWxkaW5nIHdpdGggYSBjcm9zcy1jb21waWxlci4KLQkqIGNvbmZpZ3VyZTogQ2Fub25pY2FsaXplIHRoZSBhcmd1bWVudHMgcHV0IGludG8gY29uZmlnLnN0YXR1cyBieQotCWFsd2F5cyB1c2luZyBgPScgZm9yIGFuIG9wdGlvbiB3aXRoIGFuIGFyZ3VtZW50LiAgUGFzcyBhIHByZXN1bWVkCi0JLS1ob3N0IG9yIC0tdGFyZ2V0IGV4cGxpY2l0bHkuCi0KLUZyaSBOb3YgMTcgMTc6NTA6MzAgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBNZXJnZSAtbWFjb3MqLCAtbWFnaWMqLCAtcGUqLCBhbmQgLXdpbjMyIGNhc2VzCi0JaW50byBnZW5lcmFsIE9TIHJlY29nbml0aW9uIGNhc2UuCi0KLUZyaSBOb3YgMTcgMTc6NDI6MjUgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2NvbmZpZ2RpcnMpOiBhZGQgdGFyZ2V0LXdpbnN1cCBvbmx5Ci0JZm9yIHdpbjMyIHRhcmdldCBzeXN0ZW1zLgotCi1UaHUgTm92IDE2IDE0OjA0OjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtbGliZ2xvc3MpOiBEZXBlbmQgdXBvbgotCWNvbmZpZ3VyZS10YXJnZXQtbmV3bGliLCBzaW5jZSB3aGVuIGxpYmdsb3NzIGlzIGJ1aWx0IGl0IGxvb2tzIHRvCi0Jc2VlIGlmIHRoZSBuZXdsaWIgZGlyZWN0b3J5IGV4aXN0cy4KLQotV2VkIE5vdiAxNSAxNDo0Nzo1MiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6IFVzZSBjb25maWctbWwuaW4gaW5zdGVhZCBvZgotCWNmZy1tbC0qLmluLgotCi1XZWQgTm92IDE1IDExOjQ1OjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBIYW5kbGUgTEQgYW5kIExEX0ZPUl9UQVJHRVQgd2hlbiBjb25maWd1cmluZyBhCi0JQ2FuYWRpYW4gQ3Jvc3MuCi0KLVR1ZSBOb3YgMTQgMTU6MDM6MTIgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1pMzg2d2luMzI6IGFkZCBMRF9GT1JfVEFSR0VULgotCi1UdWUgTm92IDE0IDE0OjU2OjExIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9saWJzKTogYWRkIHRhcmdldC13aW5zdXAuCi0JKHRhcmdldD09aTM4Ni13aW4zMik6IGFkZCBwYXRjaCBkaWZmIGZsZXggbWFrZSB0byAkbm9jb25maWdkaXJzLgotCSh0YXJnZXQ9PXBwY2xlLXBlKTogcmVtb3ZlIGxkIGZyb20gJG5vY29uZmlnZGlycy4KLQotVHVlIE5vdiAxNCAwMToyNTo1MCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogUGFzcyAtLXdpdGgtdGFyZ2V0LXN1YmRpci4KLQlQcmVzZXJ2ZSByZWxhdGl2ZSBwYXRoIG5hbWVzIGluICRzcmNkaXIuICBCdWlsZCBzeW1saW5rIHRyZWUgaWYKLQljb25maWd1cmluZyBjcm9zcyB0YXJnZXQgZGlyIGFuZCBzcmNkaXI9LiAoPSBubyBWUEFUSCBzdXBwb3J0KS4KLQkoY29uZmlndXJlLXRhcmdldC1saWJnKyspOiBEZXBlbmQgb24gY29uZmlndXJlLXRhcmdldC1saWJyeC4KLQkqIGNmZy1tbC1jb20uaW4sIGNmZy1tbC1wb3MuaW46IERlbGV0ZWQuCi0JKiBjb25maWctbWwuaW46IE5ldyBmaWxlLgotCSogc3ltbGluay10cmVlOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZTogRW5zdXJlIHNyY2Rpcj0iLiIgaWYgdGhhdCdzIHdoYXQgaXQgaXMuCi0KLU1vbiBOb3YgMTMgMTI6MzQ6MjAgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctUkVBRE1FOiBDbGFyaWZ5IHNvbWUgcGhyYXNpbmcsIGFkZCBub3RlcyBhYm91dCBDb2RlV2FycmlvcgotCWluY2x1ZGVzIGFuZCBGTEVYX1NLRUxFVE9OIHNldHRpbmcuCi0JKiBtcHctY29uZmlndXJlICgtLXdpdGgtZ251LWxkKTogTmV3IG9wdGlvbiwgY29udHJvbHMgd2hldGhlcgotCXRvIHVzZSBQUENMaW5rIG9yIGxkIHdpdGggUG93ZXJNYWMgR0NDLgotCSogbXB3LWJ1aWxkLmluIChhbGwtZ3JleiwgZG8tZ3JleiwgaW5zdGFsbC1ncmV6KTogTmV3IHRhcmdldHMuCi0JKiBtcHctY29uZmlnLmluOiBDb25maWd1cmUgZ3JleiBpZiB0YXJnZXRpbmcgTWFjLgotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgcG1hYyBhbmQgcG1hYy1tcHcgYXMgbmFtZXMgZm9yIFBvd2VyTWFjcywKLSAJYWNjZXB0IG1wdyBhbmQgbWFjLW1wdyBhcyBuYW1lcyBmb3IgbTY4ayBNYWNzLCBjaGFuZ2UgbWFjb3M3IHRvCi0gCWp1c3QgbWFjb3MuCi0JKiBjb25maWd1cmUuaW46IENvbmZpZ3VyZSBncmV6IHJlc291cmNlIGNvbXBpbGVyIGlmIHRhcmdldGluZyBNYWMuCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdyZXosIGluc3RhbGwtZ3Jleik6IE5ldyB0YXJnZXRzLgotCi1XZWQgTm92ICA4IDE3OjMzOjUxIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBDWFggZGVmYXVsdHMgdG8gZ2NjLCBub3QgZysrLiAgSWYgd2UgZmluZAotIAlnY2MgaW4gdGhlIHBhdGgsIHNldCBDQyB0byBnY2MgLU8yLgotCi1UdWUgTm92ICA3IDE1OjQ1OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEZWZhdWx0ICR7YnVpbGR9IGNvcnJlY3RseS4gIEF2b2lkIHBpY2tpbmcgdXAgZXh0cmEKLQlzcGFjZXMgd2hlbiByZWFkaW5nIENDIGFuZCBDWFggZnJvbSBNYWtlZmlsZS4gIFdoZW4gZG9pbmcgYQotCUNhbmFkaWFuIENyb3NzLCB1c2UgcGxhdXNpYmxlIGRlZmF1bHQgdmFsdWVzIGZvciBudW1lcm91cwotCXZhcmlhYmxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogV2hlbiBkb2luZyBhIENhbmFkaWFuIENyb3NzLCBkb24ndCB0cnkgdG8KLQljb25maWd1cmUgdG9vbHMgd2hvc2UgY29uZmlndXJlIHNjcmlwdCBjYW4ndCBoYW5kbGUgaXQuCi0KLU1vbiBOb3YgIDYgMTk6MzI6MTcgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChzaC0qLSopOiBBZGQgbTIgYW5kIG1sL20yIHRvIG11bHRpZGlycy4KLQotU3VuIE5vdiAgNSAwMDoxNTo0MSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiAgUmVtb3ZlIGR1YmlvdXMgYnVnIHJlcG9ydGluZyBhZGRyZXNzLgotCi1GcmkgTm92ICAzIDA4OjE3OjU0IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogIElmIHN1YmRpciBoYXMKLQljb25maWd1cmUgc2NyaXB0LCBydW4gdGhhdCBpbnN0ZWFkIG9mIHRoaXMgZGlyZWN0b3J5J3MgY29uZmlndXJlLgotCUluIGVpdGhlciBjYXNlLCBwcmludCBhIG1lc3NhZ2UgdGhhdCB3ZSdyZSBjb25maWd1cmluZyB0aGUgc3ViLWRpci4KLQotVGh1IE5vdiAgMiAyMzoyMzozNiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBCZWZvcmUgY2hlY2tpbmcgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdmFyaW91cyBmaWxlcywKLQl1c2Ugc2VkIHRvIGZpbHRlciBvdXQgInRhcmdldC0iLgotCi1UaHUgTm92ICAyIDEzOjI0OjU2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERPX1gpOiBTcGxpdCBydWxlIHRvIGRlY3JlYXNlIGNvbW1hbmQgbGluZSBsZW5ndGgKLQlmb3Igc3lzdGVtcyB3aXRoIHNtYWxsIEFSR19NQVggdmFsdWVzLiAgRnJvbSBwaGRtQGluZm8udWNsLmFjLmJlCi0JKFBoaWxpcHBlIERlIE11eXRlcikuCi0KLVdlZCBOb3YgIDEgMTU6MTg6MzUgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtcGF0Y2gpOiBkZXBlbmQgb24gYWxsLWxpYmliZXJ0eS4KLQotV2VkIE5vdiAgMSAxMjoyMzoyMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogSWYgdGhlIG9ubHkgZGlyZWN0b3J5IGluIHRhcmdldF9jb25maWdkaXJzIHdoaWNoCi0JYWN0dWFsbHkgZXhpc3RzIGlzIGxpYmliZXJ0eSwgdGhlbiBzZXQgdGFyZ2V0X2NvbmZpZ2RpcnMgdG8gZW1wdHksCi0JdG8gYXZvaWQgdHJ5aW5nIHRvIGJ1aWxkIGEgdGFyZ2V0IGxpYmliZXJ0eSBpbiBhIGdhcyBvciBnZGIKLQlkaXN0cmlidXRpb24uCi0KLVR1ZSBPY3QgMzEgMTc6NTI6MzkgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHNsYXZlLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF9tYWtlZmlsZV9mcmFnKTogVXNlIG02OGstc3VuLXN1bm9zKiBpbnN0ZWFkCi0gCW9mIG02OGstc3VuLSogd2hlbiBzZWxlY3RpbmcgbWgtc3VuMyB0byBhdm9pZCBtYXRjaGluZyBOZXRCU0Qvc3VuMwotIAlzeXN0ZW1zLgotCi1UdWUgT2N0IDMxIDE2OjU3OjMyIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChjb3B5X2RpcnMpOiBVc2Ugc3lzLWluY2x1ZGUgaW5zdGVhZCBvZiBpbmNsdWRlCi0JZm9yIC0td2l0aC1oZWFkZXJzIG9wdGlvbi4KLQotVHVlIE9jdCAzMSAxMDoyOTozNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBNYWtlIHdpbnN1cCBidWlsZHMgd29yayB3aXRoCi0JbmV3IHNjaGVtZS4KLQotTW9uIE9jdCAzMCAxODo1NzowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgdGhlIGxpbmtlciBvbiBBSVguCi0KLU1vbiBPY3QgMzAgMTI6Mjc6MTYgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VULCBDWFhfRk9SX1RBUkdFVCk6ICBBZGQgJChUQVJHRVRfU1VCRElSKQotCXdoZXJlIG5lZWRlZC4KLQotTW9uIE9jdCAzMCAxMjo0NToyNSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtZ2NjKTogRml4IHR5cG8uCi0KLVNhdCBPY3QgMjggMTA6Mjc6NTkgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKENIRUNLX1RBUkdFVF9NT0RVTEVTKSk6ICBGaXggdHlwby4KLQotRnJpIE9jdCAyNyAyMzoxNDoxMiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiAgUmVuYW1lIGxpYkZPTyB0byB0YXJnZXQtbGliRk9PLCBhbmQgeGliZXJ0eQotCXRvIHRhcmdldC14aWJlcnR5LCB0byBwcm92aWRlIG1vcmUgZmxleGliaWxpdHkuCi0JKHRhcmdldF9zdWJkaXIpOiAgRGVmaW5lLiAgQ3JlYXRlIGlmIGNyb3NzLgotCVNldCBUQVJHRVRfU1VCRElSIGluIE1ha2VmaWxlIHRvICR7dGFyZ2V0X3N1YmRpcn0uCi0JKiBNYWtlZmlsZS5pbjogIFJlbmFtZSBhbGwtbGliRk9PIC0+IGFsbC10YXJnZXQtbGliRk9PLCBhbGwteGliZXJ0eQotCS0+IGFsbC10YXJnZXQtbGliaWJlcnR5LCBjb25maWd1cmUtbGliRk9PIC0+IGNvbmZpZ3VyZS10YXJnZXQtbGliRk9PLAotCWNoZWNrLWxpYkZPTyAtPiBjaGVjay10YXJnZXQtbGliRk9PLCBldGMuCi0JKCQoRE9fWCkpOiAgSXRlcmF0ZSBvdmVyIFRBUkdFVF9DT05GSUdESVJTIGFmdGVyIFNVQkRJUlMuCi0JKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSwgJChDSEVDS19UQVJHRVRfTU9EVUxFUyksCi0JJChBTExfVEFSR0VUX01PRFVMRVMpLCAkKElOU1RBTExfVEFSR0VUX01PRFVMRVMpKTogVXBkYXRlIGFjY29yZGluZ2x5LgotCShjb25maWd1cmUtdGFyZ2V0LVhYWCk6ICBEZXBlbmQgb24gJChBTExfR0NDKSwgbm90IGFsbC1nY2MsIHRvCi0JYWxsb3cgQUxMX0dDQz0iIiB0byBvbmx5IGNvbmZpZ3VyZS4KLQkoREVWT19TVVBQT1JUKTogIEFkZCBjZmctbWwtY29tLmluIGFuZCBjZmctbWwtcG9zLmluLgotCShFVENfU1VQUE9SVCwgRVRDX1NVUFBPUlRfUEZYKTogIE1lcmdlOyAgdXBkYXRlICd0YXonIGFjY29yZGluZ2x5LgotCShMSUJHWFhfU1VQUE9SVF9ESVJTKTogIFJlbW92ZSB4aWJlcnR5LgotCi1TYXQgT2N0IDI4IDAxOjUzOjQ5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogQnVpbGQgImluZm8iIGluIGV0YyBleHBsaWNpdGx5LgotCi1GcmkgT2N0IDI3IDA5OjMyOjMwIDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIE1ha2Ugc3VyZSB0aGF0IENDIGlzIHVuZGVmaW5lZCAoYXMgb3Bwb3NlZCB0bwotCW51bGwpIGlmIHRvcGxldmVsL2NvbmZpZy9taC17aG9zdH0gZG9lc24ndCBkZWZpbmUgaXQuICBGaXhlcyBhCi0JcHJvYmxlbSB3aXRoIGF1dG9jb25mIHRyeWluZyB0byBjb25maWd1cmUgb24gYSBob3N0IHdpdGhvdXQgR0NDLgotCi1UaHUgT2N0IDI2IDIyOjM1OjAxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogU2V0IGhvc3QgYWxpYXMgZnJvbSBjaG9pY2Ugb2YgaG9zdCBjb21waWxlciwKLQlvbmx5IHVzZSBnZW5lcmljIE1QVyBNYWtlZmlsZSBzZWQgaWYgcHJlc2VudCwgZWRpdCBhIGZpbGUKLQluYW1lZCAiaGFja2VkX01ha2VmaWxlLmluIiBpbnN0ZWFkIG9mICJNYWtlZmlsZS5pbiIgaWYgcHJlc2VudC4KLQkqIG1wdy1SRUFETUU6IEFkZCBwcm9ibGVtIG5vdGVzIGFib3V0IENXNiBhbmQgQ1c3LgotCi1UaHUgT2N0IDI2IDA1OjQ1OjEwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1wYy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogVXNlICI7IiBpbnN0ZWFkIG9mICI7OyIuCi0KLVdlZCBPY3QgMjUgMTU6MTg6MjQgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICh0YXopOiAgR3JlcCBmb3IgJ15kaXN0c3R1ZmY6JyBvciAnXmluZm86JyBpbgotCXN1Yi1kaXJlY3RvcnkgTWFrZWZpbGVzLCBpbnN0ZWFkIG9mIHVzaW5nIERJU1RTVFVGRkRJUlMgYW5kCi0JRElTVERPQ0RJUlMuCi0JKERJU1RTVFVGRkRJUlMsIERJU1RET0NESVJTKTogIFJlbW92ZWQgLSBubyBsb25nZXIgdXNlZC4KLQkobmV3bGliLnRhci5neik6ICBEb24ndCBwYXNzIERJU1RET0NESVJTIHRvIHJlY3Vyc2l2ZSBtYWtlLgotCi1XZWQgT2N0IDI1IDE0OjQzOjU1IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVERPQ0RJUlMpOiAgUmVtb3ZlIGxkIGdwcm9mIGJudXRpbHMgZ2FzIGxpYmcrKyBnZGIKLQlhbmQgZ25hdHMsIGJlY2F1c2UgdGhleSBhcmUgbm93IHN1YnN1bWVkIGJ5IERJU1RTVFVGRkRJUlMuCi0JTW92ZSBiZmQgdG8gRElTVFNUVUZGRElSUy4KLQotVHVlIE9jdCAyNCAxODoxOTowOSAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFgxMV9MSUIpOiBSZW1vdmVkLgotCShYMTFfRkxBR1NfVE9fUEFTUyk6IHBhc3Mgb25seSBYMTFfRVhUUkFfQ0ZMQUdTIGFuZCBYMTFfRVhUUkFfTElCUy4KLQotCSogY29uZmlndXJlLmluIChob3N0X21ha2VmaWxlX2ZyYWcpOiBtaC1haXggJiBtaC1zdW4gcmVtb3ZlZC4KLQotU3VuIE9jdCAyMiAxMzowNDo0MiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNmZy1tbC1jb20uaW4gKHBvd2VycGMqKTogU2hvcnRlbiBzb21lIG9mIHRoZSBtdWx0aWxpYiBkaXJlY3RvcnkKLQluYW1lcy4KLQotRnJpIE9jdCAyMCAxODowMjoxMCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNmZy1tbC1jb20uaW4gKHBvd2VycGMqLWVhYmkqKTogQWRkIG1jYWxsLWFpeGRlc2MgdmFyaWVudHMuCi0KLVRodSBPY3QgMTkgMTA6NDA6NTcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLXdpbjMyKTogQWx3YXlzIGJ1aWxkIG5ld2xpYi4KLQlEb24ndCBjb25maWd1cmUgY3ZzLCBhdXRvY29uZiBvciB0ZXhpbmZvLgotCSogTWFrZWZpbGUuaW4gKExEX0ZPUl9UQVJHRVQpOiBOZXcuCi0JKEJBU0VfRkxBR1NfVE9fUEFTUywgRVhUUkFfVEFSR0VUX0ZMQUdTLCBDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOgotCVBhc3MgZG93biBMRF9GT1JfVEFSR0VULgotCi1XZWQgT2N0IDE4IDE1OjUzOjU2IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHdpbnN1cDogTmV3IGRpcmVjdG9yeS4KLQkqIE1ha2VmaWxlLmluOiBCdWlsZCB3aW5zdXAuCi0JKiBjb25maWd1cmUuaW46IFdpbnN1cCBpcyBjb25maWd1cmVkIHdoZW4gdGFyZ2V0IGlzIHdpbjMyLgotCUNhbiBvbmx5IGJ1aWxkIHdpbjMyIHRhcmdldCBHREIgd2hlbiBuYXRpdmUuCi0JCi1Nb24gT2N0IDE2IDA5OjQyOjMxIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgSFAgbW9kZWwgODE5IG1hY2hpbmVzIGFzIGhhdmluZwotCWEgUEEgMS4xIHByb2Nlc3Nvci4KLQotTW9uIE9jdCAxNiAxMDo0OTo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRml4IHNlZCBsb29wIHdoaWNoIHN1YnN0aXR1dGVzIGZvciBDQyBhbmQgQ1hYIHRvCi0JYXZvaWQgYnVnIGZvdW5kIGluIHZhcmlvdXMgc2VkIGltcGxlbWVudGF0aW9ucy4KLQotV2VkIE9jdCAxMSAxNjoxNjoyMCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNmZy1tbC1jb20uaW4gKHBvd2VycGMtKi1lYWJpc2ltKTogRGVsZXRlIHNlcGFyYXRlIHJ1bGUgZm9yCi0Jc2ltdWxhdG9yLiAgVXNlIHN0YW5kYXJkIHBvd2VycGMtKi1lYWJpKi4KLQotTW9uIE9jdCAgOSAxNzoyMTo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU3RvcCBwdXR0aW5nIGdhcyBhbmQgYmludXRpbHMgaW4gbm9jb25maWdkaXJzIGZvcgotCXBvd2VycGMtKi1haXgqIGFuZCByczYwMDAtKi0qLgotCi1Nb24gT2N0ICA5IDEyOjM4OjQwIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjKi0qLWVhYmlzaW0qKTogQWRkIHN1cHBvcnQgZm9yIGJ1aWxkaW5nCi0JLW1jYWxsLWFpeGRlc2MgbGlicmFyaWVzLgotCi1GcmkgT2N0ICA2IDE2OjE3OjU3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnLnN1YiAoYXJtIHwgYXJtZWwgfCBhcm1lYik6IEZpeCBzaGVsbCBzeW50YXguCi0KLUZyaSBPY3QgIDYgMTQ6NDA6MjggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluICh7cG93ZXJwYyxyczYwMDB9LWlibS1haXgqKTogQWRkIG11bHRpbGlicyBmb3IKLQktbXNvZnQtZmxvYXQgYW5kIC1tY3B1PWNvbW1vbiBzdXBwb3J0LgotCShwb3dlcnBjKi0qLWVhYmlzaW0qKTogQWRkIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIC1tY2FsbC1haXgKLQlsaWJyYXJpZXMuCi0KLVRodSBPY3QgIDUgMTM6MjY6MzcgMTk5NSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFsbG93IGNvbmZpZ3VyYXRpb24gYW5kIGJ1aWxkIG9mIGVtYWNzMTkgZm9yIHRoZSBhbHBoYS4KLQotV2VkIE9jdCAgNCAyMjowNTozNiAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChDQyk6IEdldCBeQ0MsIG5vdCBqdXN0IGFueSBvbGQgQ0MsIGZyb20KLQkke2hvc3RfbWFrZWZpbGVfZnJhZ30uCi0KLVdlZCBPY3QgIDQgMjE6NTU6MDAgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoQ0MpOiBUcnkgdG8gZ2V0IENDIGZyb20gCi0JJHtzcmNkaXJ9LyR7aG9zdF9tYWtlZmlsZV9mcmFnfSwgbm90ICR7aG9zdF9tYWtlZmlsZV9mcmFnfS4KLQotV2VkIE9jdCAgNCAyMTo0NDoxMiAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBUkdFVF9DT05GSUdESVJTKTogY29uZmlndXJlIHRhcmdldGRpcnMKLQlvbmx5IGlmIGl0IGV4aXN0cyBpbiAkKHNyY2RpcikuCi0KLVdlZCBPY3QgIDQgMTE6NTI6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IElmIENDIGFuZCBDWFggYXJlIG5vdCBzZXQgaW4gdGhlIGVudmlyb25tZW50LCBzZXQKLQl0aGVtLCBiYXNlZCBvbiBlaXRoZXIgYW4gZXhpc3RpbmcgTWFrZWZpbGUgb3Igb24gc2VhcmNoaW5nIGZvciBnY2MKLQlpbiBQQVRILiAgU3Vic3RpdHV0ZSBmb3IgQ0MgYW5kIENYWCBpbiBNYWtlZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGxpYm0gZnJvbSB0YXJnZXRfbGlicy4gIFNlcGFyYXRlCi0JdGFyZ2V0X2NvbmZpZ2RpcnMgZnJvbSBjb25maWdkaXJzLiAgSWYgQ0MgaXMgbm90IHNldCBpbgotCWVudmlyb25tZW50LCB0cnkgdG8gZ2V0IGl0IGZyb20gYSBob3N0IE1ha2VmaWxlIGZyYWdtZW50LiAgUmV3cml0ZQotCWNoYW5nZXMgb2YgY29uZmlnZGlycyB0byB1c2Ugc2tpcGRpcnMgaW5zdGVhZC4gIEEgZmV3IG1pbm9yCi0JdHdlYWtzLiAgVGFrZSBkaXJlY3RvcmllcyBvdXQgb2YgdGFyZ2V0X2NvbmZpZ2RpcnMgYXMgdGhleSBhcmUKLQl0YWtlbiBvdXQgb2YgY29uZmlnZGlycy4gIFJlbW92ZSBleGlzdGluZyBNYWtlZmlsZSBmaWxlcyBmcm9tCi0Jc3ViZGlyZWN0b3JpZXMuICBTdWJzdGl0dXRlIGZvciBUQVJHRVRfQ09ORklHRElSUyBhbmQKLQlDT05GSUdfQVJHVU1FTlRTIGluIE1ha2VmaWxlLgotCSogTWFrZWZpbGUuaW4gKFRBUkdFVF9DT05GSUdESVJTKTogTmV3IHZhcmlhYmxlLCBhdXRvbWF0aWNhbGx5IHNldAotCWJ5IGNvbmZpZ3VyZS5pbi4KLQkoQ09ORklHX0FSR1VNRU5UUyk6IExpa2V3aXNlLgotCShDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBOZXcgdmFyaWFibGUuCi0JKCQoRE9fWCkpOiBMb29wIG92ZXIgVEFSR0VUX0NPTkZJR0RJUlMgYXMgd2VsbCBhcyBTVUJESVJTLgotCSgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBOZXcgdGFyZ2V0LgotCShjb25maWd1cmUtbGliZysrLCBjb25maWd1cmUtbGliaW8pOiBOZXcgdGFyZ2V0cy4KLQkoYWxsLWxpYmcrKyk6IERlcGVuZCB1cG9uIGNvbmZpZ3VyZS1saWJnKysuCi0JKGFsbC1saWJpbyk6IERlcGVuZCB1cG9uIGNvbmZpZ3VyZS1saWJpby4KLQkoY29uZmlndXJlLWxpYmdsb3NzLCBhbGwtbGliZ2xvc3MpOiBOZXcgdGFyZ2V0cy4KLQkoY29uZmlndXJlLWxpYnN0ZGMrKyk6IE5ldyB0YXJnZXQuCi0JKGFsbC1saWJzdGRjKyspOiBEZXBlbmQgdXBvbiBjb25maWd1cmUtbGlic3RkYysrLgotCShjb25maWd1cmUtbGlicngsIGFsbC1saWJyeCk6IE5ldyB0YXJnZXRzLgotCShjb25maWd1cmUtbmV3bGliKTogTmV3IHRhcmdldC4KLQkoYWxsLW5ld2xpYik6IERlcGVuZCB1cG9uIGNvbmZpZ3VyZS1uZXdsaWIKLQkoY29uZmlndXJlLXhpYmVydHkpOiBOZXcgdGFyZ2V0LgotCShhbGwteGliZXJ0eSk6IERlcGVuZCB1cG9uIGNvbmZpZ3VyZS14aWJlcnR5LgotCi1TYXQgU2VwIDMwIDA0OjMyOjU5IDE5OTUgIEphc29uIE1vbGVuZGEgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdCBpWzM0NV04Ni0qLXdpbjMyKTogIEV4cGFuZCB0aGUKLQlub2NvbmZpZ2RpcnMgYWdhaW4uCi0KLVRodSBTZXAgMjggMjE6MTg6NDkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlndXJlOiBGaXggc2VkIGNvbW1hbmQgZmlsZSBuYW1lLgotCi1UaHUgU2VwIDI4IDE3OjM5OjU2IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdCBpWzM0NV04Ni0qLXdpbjMyKTogUmVkdWNlIHRoZSAKLQlub2NvbmZpZ2RpcnMgYWdhaW4uCi0KLVdlZCBTZXAgMjcgMTI6MjQ6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGNvbmZpZ3VyZSBsZCBhbmQgZ2RiIGZvciBwb3dlcnBjKi0qLXdpbm50KgotCW9yIHBvd2VycGMqLSotcGUqLCBzaW5jZSB0aGV5IGFyZSBub3QgeWV0IHN1cHBvcnRlZC4KLQotVHVlIFNlcCAyNiAxNDozMDowMSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQlBZGQgUG93ZXJNYWMgc3VwcG9ydCBhbmQgbWFueSBvdGhlciBlbmhhbmNlbWVudHMuCi0JKiBtcHctY29uZmlndXJlOiBOZXcgb3B0aW9uIC0tY2MgdG8gc2VsZWN0IGNvbXBpbGVyIHRvIHVzZSwKLQlwYXN0ZSBvcHRpb25zIHNldCBhY2NvcmRpbmcgdG8gLS1jYyBpbnRvIHRoZSBnZW5lcmF0ZWQKLQlNYWtlZmlsZSwgZ2VuZXJhdGUgdGhlIE1ha2VmaWxlIGJ5IHNlZCdpbmcgdGhlIFVuaXggTWFrZWZpbGUuaW4KLQlpZiBtcHctbWFrZS5zZWQgaXMgcHJlc2VudC4KLQkqIG1wdy1jb25maWcuaW46IERvbid0IHRlc3QgZm9yIGdDMSwgdGVzdCBmb3IgbXB3LXRvdWNoLAotCWFkZCBmb3J3YXJkIGluY2x1ZGVzIGZvciBQb3dlclBDIGluY2x1ZGUgZmlsZXMuCi0JKiBtcHctYnVpbGQuaW46IEJ1aWxkIHVzaW5nIE1ha2VmaWxlLlBQQyBpZiBwcmVzZW50LgotCShkby1ieWFjYywgZXRjKTogUmVtb3ZlIHNlcGFyYXRlIHZlcnNpb24gcmVzb3VyY2UgYnVpbGRzLgotCShkby1nYXMpOiBCdWlsZCAic3RhbXBzIiBiZWZvcmUgImFsbCIuCi0JKGRvLWdjYyk6IEJ1aWxkICJzdGFtcHMtaCIgYW5kICJzdGFtcHMtYyIgYmVmb3JlICJhbGwiLgotCSogbXB3LVJFQURNRTogVXBkYXRlIHRvIHJlZmxlY3QgLS1jYyBvcHRpb24sIFBvd2VyTWFjIHN1cHBvcnQsCi0JYW5kIHJlY2VudGx5LXJlcG9ydGVkIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMuCi0KLUZyaSBTZXAgMjIgMTI6MTU6NDIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChtNjgqLSotKik6IE9ubHkgYnVpbGQgbXVsdGlsaWJzIGZvcgotCWVtYmVkZGVkIG02OGsgc3lzdGVtcyAoLWFvdXQsIC1jb2ZmLCAtZWxmLCAtdnh3b3JrcykuCi0JKC0td2l0aC1tdWx0aWxpYi10b3ApOiBQYXNzIHRvIHJlY3Vyc2l2ZSBpbnZvY2F0aW9ucy4KLQotVHVlIFNlcCAxOSAxMzo1MTowNSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAYmx1ZXMuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEaXNhYmxlIGxpYmcrKyBhbmQgbGlic3RkYysrIG9uCi0JdjgxMC0qLSouCi0KLU1vbiBTZXAgMTggMjM6MDg6MjYgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERpc2FibGUgYmZkLCBiaW51dGlscywgZ2FzLCBnY2MsCi0JZ2RiLCBsZCBhbmQgb3Bjb2RlcyBvbiB2ODEwLSotKi4KLQotU2F0IFNlcCAxNiAxODozMTowOCBQRFQgMTk5NSAgQW5nZWxhIE1hcmllIFRob21hcyA8YW5nZWxhQGN5Z251cy5jb20+Ci0JCi0JKiBjb25maWcvbWgtbmNyc3ZyNDM6IFJlbW92ZWQgQVJfRkxBR1MKLQotVHVlIFNlcCAxMiAxODowMzozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChET19YKTogQ2hhbmdlIGRvLXJlYWxjbGVhbiB0byBkby1tYWludGFpbmVyLWNsZWFuLgotCShsb2NhbC1tYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldC4KLQkobWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQuCi0JKHJlYWxjbGVhbik6IEp1c3QgZGVwZW5kIHVwb24gbWFpbnRhaW5lci1jbGVhbi4KLQotRnJpIFNlcCAgOCAxNzoxMToxNCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRGlzYWJsZSBnZGIgb24gbTY4ay0qLW5ldGJzZCouCi0KLUZyaSBTZXAgIDggMTY6NDY6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGxkIGluIG1pcHMqLSotYnNkKiBjYXNlLgotCi1UaHUgU2VwICA3IDIwOjAzOjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgLWxpdGVzKiBPUy4gIEZyb20gSWFuIERhbGwuCi0KLUZyaSBTZXAgIDEgMDg6MDY6NTggMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAYmVhdXR5LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IHJlY29nbmlzZSBtaXBzNjR2cjQzMDAgYW5kIG1pcHM2NHZyNDMwMGVsIGFzIHZhbGlkCi0gCXRhcmdldHMuCi0KLVdlZCBBdWcgMzAgMjE6MDY6NTAgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdHJlYXQgaTM4Ni13aW4zMiBjYW5hZGlhbiBjcm9zcyB0aGUgc2FtZSBhcwotCWkzODYtZ28zMiBjYW5hZGlhbiBjcm9zcy4KLQotVGh1IEF1ZyAyNCAxNDo1MzoyMCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNmZy1tbC1jb20uaW4gKHBvd2VycGMqLSotZWFiaXNpbSk6IEFkZCBzdXBwb3J0IGZvciBQb3dlclBDCi0JcnVubmluZyB1bmRlciB0aGUgc2ltdWxhdG9yIHRvIGJ1aWxkIGEgcmVkdWNlZCBzZXQgb2YgbGlicmFyaWVzLgotCShwb3dlcnBjLSotZWFiaWFpeCk6IEFkZCBmaW5lIGdyYWluZWQgbXVsdGlsaWIgc3VwcG9ydCBhZGRlZCB0bwotCW90aGVyIHBvd2VycGMgdGFyZ2V0cyB5ZXN0ZXJkYXkuCi0KLVdlZCBBdWcgMjMgMDk6NDE6NTYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjKik6IEFkZCBzdXBwb3J0IGZvciAtZGlzYWJsZS1iaWVuZGlhbiwKLQktZGlzYWJsZS1zb2Z0ZmxvYXQsIC1kaXNhYmxlLXJlbG9jYXRhYmxlLCAtZGlzYWJsZS1haXgsIGFuZAotCS1kaXNhYmxlLXN5c3YgdG8gY29udHJvbCB3aGljaCBtdWx0aWxpYiBsaWJyYXJpZXMgZ2V0IGJ1aWx0LgotCi1UaHUgQXVnIDE3IDE2OjAzOjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBBZGQgTWFrZWZpbGUudGVtIHRvIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlIGluIHRyYXAKLQloYW5kbGVyLgotCi1Nb24gQXVnIDE0IDE5OjI3OjU2IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKCpMaW51eCopOiAgQWRkIG1pc3NpbmcgImV4aXQicy4KLQlBbHNvLCBuZWVkIHNwZWNpZmljIGNoZWNrIGZvciBhbHBoYS11bmtub3duLWxpbnV4ICh1c2VzIENPRkYpLgotCi1GcmkgQXVnIDExIDE1OjM4OjIwIDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6ICBNZXJnZSB3aXRoIEZTRjoKLQotCVdlZCBKdW4gMjggMTc6NTc6MjcgMTk5NSAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBtaHBjYy5lZHU+Ci0JKiBjb25maWcuZ3Vlc3MgKEFJWDQpOiBNb3JlIHJvYnVzdCByZWxlYXNlIG51bWJlcmluZyBkaXNjb3ZlcnkuCi0KLQlUaHUgSnVuIDIyIDE5OjAxOjI0IDE5OTUgIEtlbm5ldGggU3RhaWxleSAgKGtzdGFpbGV5QGVhZ2xlLmRvbC1lc2EuZ292KQotCSogY29uZmlnLmd1ZXNzIChpMzg2LXNlcXVlbnQtcHR4KTogUHJvcGVybHkgZ2V0IHZlcnNpb24gbnVtYmVyLgotCi0JVGh1IEp1biAyMiAxODozNjo0MiAxOTk1ICBVd2UgU2VpbWV0ICAoc2VpbWV0QGlyaXMxLmNoZW1pZS51bmkta2wuZGUpCi0JKiBjb25maWcuZ3Vlc3MgKG1pcHM6Kjo0KjpVTUlQUyk6IE5ldyBjYXNlLgotCi1Nb24gQXVnICA3IDA5OjIxOjM1IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni1nbzMyIGhvc3QpOiBGaXggdHlwbyAoZGVqYS1nbnUgLT4gZGVqYWdudSkuCi0JKGkzODYtd2luMzIgaG9zdCk6IExpa2V3aXNlLiAgRG9uJ3QgYnVpbGQgcmVhZGxpbmUuCi0KLUZyaSBBdWcgIDQgMTM6MDQ6MzYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChHREJfU1VQUE9SVF9ESVJTKTogQWRkIHV0aWxzLgotCShERVZPX1NVUFBPUlQpOiBBZGQgbXB3LVJFQURNRSwgbXB3LWJ1aWxkLmluLCBtcHctY29uZmlnLmggYW5kCi0JbXB3LWNvbmZpZ3VyZS4KLQotV2VkIEF1ZyAgMiAxNjozMjo0MCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChhcHBkaXJzKTogVXNlID0sIG5vdCA9PSwgaW4gdGVzdCBleHByZXNzaW9uIHdoZW4KLQl0cnlpbmcgdG8gYnVpbGQgdGhlIHRleHQgdG8gcHJpbnQgaW4gdGhlIHdhcm5pbmcgbWVzc2FnZSBmb3IKLQlTb2xhcmlzIHVzZXJzLgotCi1Nb24gSnVsIDMxIDA5OjU2OjE4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNmZy1tbC1jb20uaW4gKHo4ay0qLWNvZmYpOiBBZGQgJ3N0ZCcgbXVsdGlsaWIgYnVpbGQuCi0KLUZyaSBKdWwgMjggMDA6MTY6MzEgMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGx5bngtMi4zLgotCi1UaHUgSnVsIDI3IDE1OjQ3OjU5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKHo4a3NpbSk6IERlbGV0ZWQKLQkoejhrLSotY29mZik6IE5ldywgdGhpcyBpcyB0aGUgb25lIHRydWUgbmFtZSBvZiB0aGUgdGFyZ2V0LgotCi1UaHUgSnVsIDI3IDE0OjMzOjMzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNmZy1tbC1wb3MuaW4gKGRvdGRvdCk6IFdvcmsgYXJvdW5kIFN1bk9TIHNlZCBidWcuCi0KLVRodSBKdWwgMjcgMTM6MzE6MDUgMTk5NSAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoKjpMaW51eDoqOiopOiBGaXJzdCB0cnkgYXNraW5nIHRoZSBsaW5rZXIgd2hhdCB0aGUKLQlkZWZhdWx0IG9iamVjdCBmaWxlIGZvcm1hdCBpcyAoZWxmLCBhb3V0LCBvciBjb2ZmKS4gIFRoZW4gaWYgdGhpcwotCWZhaWxzLCB0cnkgcHJldmlvdXMgbWV0aG9kcy4KLQotVGh1IEp1bCAyNyAxMToyODoxNyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbmV3bGliIGZvciAqLSotdnh3b3JrczUuMS4KLQotVGh1IEp1bCAyNyAxMToxODo0NyAxOTk1ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbmV3bGliIGZvciBhMjlrLSotdnh3b3JrczUuMS4KLQkqIHRlc3QtYnVpbGQubWs6IEFkZCBzZXR0aW5nIG9mIC0td2l0aC1oZWFkZXJzIGZvciBhMjlrLXZ4d29ya3M1LjEuCi0KLVR1ZSBKdWwgMjUgMjE6MjU6MzkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLXBvcy5pbiAoTVVMVElUT1ApOiBUcmltIGV4Y2VzcyB0cmFpbGluZyAiLy4iLgotCi1GcmkgSnVsIDIxIDEwOjQxOjEyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNmZy1tbC1jb20uaW46IE5ldyBmaWxlLgotCSogY2ZnLW1sLXBvcy5pbjogTmV3IGZpbGUuCi0KLVdlZCBKdWwgMTkgMDA6Mzc6MjcgMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIENPUFlJTkcuTkVXTElCOiBBZGQgSFAgZnJlZSBjb3B5cmlnaHQgdG8gbGlzdC4KLQotVHVlIEp1bCAxOCAxMDo1ODo1MSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSAtZWFiaSogZm9yIHRoZSBzeXN0ZW0sIG5vdCBqdXN0IC1lYWJpLgotCi1Nb24gSnVsICAzIDEzOjQ0OjUxIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIE1ha2ZpbGUuaW4gKERMTFRPT0xfRk9SX1RBUkdFVCk6IE5ldyBuYW1lLCBwYXNzIGl0IGRvd24uCi0JKiBjb25maWcuc3ViLCBjb25maWd1cmUuaW4gKHdpbjMyKTogTmV3IHRhcmdldCBhbmQgaG9zdC4KLQotV2VkIEp1biAyOCAyMzo1NzowOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBpMzg2LXBlIGNvbmZpZ3VyYXRpb24uCi0KLUZyaSBKdW4gMjMgMTQ6Mjg6NDQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctYnVpbGQuaW4gKGluc3RhbGwpOiBJbnN0YWxsIEdEQiBhZnRlciBMRC4KLQotVGh1IEp1biAyMiAxNzoxMDo1MyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW4gKGVsZi9taXBzLmgpOiBBbHdheXMgZm9yd2FyZC1pbmNsdWRlLCBuZWVkZWQKLQlmb3IgR0RCIHRvIGJ1aWxkLgotCi1XZWQgSnVuIDIxIDE1OjE3OjMwIDE5OTUgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KLQotCSogdGVzdHN1aXRlOiBOZXcgZGlyZWN0b3J5IGZvciBjdXN0b21lciBhY2NlcHRhbmNlIGFuZCB3aG9sZSB0b29sCi0JY2hhaW4gdGVzdHMuCi0KLVdlZCBKdW4gMjEgMTY6NTA6MjkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZiBwZXItaG9zdCBsaW5lIGlzbid0IGZvdW5kLCBidXQgQUNfT1VUUFVUIGlzIGZvdW5kCi0JYW5kIGEgY29uZmlndXJlIHNjcmlwdCBleGlzdHMsIHJ1biBpdCBpbnN0ZWFkLgotCi1UaHUgSnVuIDE1IDIxOjA5OjI0IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6ICBVcGRhdGUgZnJvbSBGU0YsIGZvciBhbHBoYS1kZWMtd2lubnQzLjUgYW5kICBDcmF5cy4KLQotVHVlIEp1biAxMyAyMTo0MzoyNyAxOTk1ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogU2V0IGJ1aWxkX3tjcHUsdmVuZG9yLG9zLGFsaWFzfSB0byBob3N0IHZhbHVlcyB3aGVuCi0JLS1idWlsZCBpc24ndCBzcGVjaWZpZWQuCi0KLU1vbiBKdW4gIDUgMTg6MjY6MzYgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChQSUNGTEFHLCBQSUNGTEFHX0ZPUl9UQVJHRVQpOiBOZXcgbWFjcm9zLgotCShGTEFHU19UT19QQVNTKTogUGFzcyB0aGVtLgotCShFWFRSQV9UQVJHRVRfRkxBR1MpOiBEaXR0by4KLQotCSogY29uZmlnL20/LSpwaWM6IERlZmluZSBQSUNGTEFHKiBpbnN0ZWFkIG9mIExJQipGTEFHUyouCi0KLVdlZCBNYXkgMzEgMjI6Mjc6NDIgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWxpYmcrKyk6IERlcGVuZCBvbiBhbGwtbGlic3RkYysrLgotCi1UaHUgTWF5IDI1IDIyOjQwOjU5IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBFbmFibGUgYWxsIHBhY2thZ2VzIGZvcgotCSAgaTM4Ni11bmtub3duLW5ldGJzZC4KLQotU2F0IE1heSAyMCAxMzoyMjozMSAxOTk1ICBBbmdlbGEgTWFyaWUgVGhvbWFzICA8YW5nZWxhQGNpcmRhbi5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERvbid0IGNvbmZpZ3VyZSB0ayBmb3IgaTM4Ni1nbzMyCi0JaG9zdGVkIGJ1aWxkcyAoRE9TIGJ1aWxkcykKLQotVGh1IE1heSAxOCAxODowODo0OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlDaGFuZ2VzIGZvciBBUk0gYmFzZWQgb24gcGF0Y2hlcyBmcm9tIFJpY2hhcmQgRWFybnNoYXc6Ci0JKiBjb25maWcuc3ViOiBIYW5kbGUgYXJtZWIgYW5kIGFybWVsLgotCSogY29uZmlndXJlLmluOiBPbWl0IGFybSBsaW5rZXIgb25seSBmb3IgcmlzY2l4LgotCi1UaHUgTWF5IDExIDE3OjIzOjI2IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6ICBVcGRhdGUgZnJvbSBGU0YuCi0KLVR1ZSBNYXkgIDkgMTU6NTI6MDUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBwb3dlcnBjbGUgYXMgdGhlIGxpdHRsZSBlbmRpYW4gdmFyaWVudCBvZgotCXRoZSBQb3dlclBDLiAgUmVjZ29uaXplIHBwYyBhcyBhIFBvd2VyUEMgdmFyaWFudCwgYW5kIHBwY2xlIGFzIGEKLQlwb3dlcnBjbGUgdmFyaWFudC4gIENvbnZlcnQgcGVudGl1bSBpbnRvIGk1ODYsIG5vdCBpNDg2LiAgQWRkIHA1Ci0JYWxpYXMgZm9yIGk1ODYuICBNYXAgbmV3IHg4NiB2YXJpYW50cyBwNiwgazUsIG5leGdlbiBpbnRvIGk1ODYKLQl0ZW1wb3JhcmlseS4KLQotVHVlIE1heSAgMiAxNjoyOTo0MSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qLWxpdGVzKik6IFRyZWF0IGxpa2UgaHBwYSotKi0qZWxmKi4KLQotU3VuIEFwciAzMCAyMTozODowOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0IC1saXRlcyogYXMgYSBiYXNpYyBzeXN0ZW0gdHlwZS4KLQotVGh1IEFwciAyNyAxMTozMzoyOSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzICgqOkxpbnV4Oio6Kik6IENoZWNrIGZvciB3aGV0aGVyIHRoZSBwcmUtQkZEIGxpbmtlciBpcwotCWluc3RhbGxlZCwgYW5kIGlmIHNvIHJldHVybiBsaW51eG9sZGxkIGFzIHRoZSBzeXN0ZW0gbmFtZS4KLQotV2VkIEFwciAyNiAxMDo1OTowMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgaHBwYTEuMS1ocC1saXRlcyBzdXBwb3J0LgotCi1UdWUgQXByIDI1IDExOjA4OjExIDE5OTUgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBuZXdsaWIgZm9yIG02OGstdnh3b3JrczUuMS4KLQotV2VkIEFwciAxOSAxNzowMjo0MyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1zZ2ktaXJpeDYpOiBVc2UgbWgtaXJpeDUuCi0KLUZyaSBBcHIgMTQgMTU6MjE6MTcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdjYyk6IERlcGVuZCBvbiBhbGwtbGQgKGZvciBsaWJnY2MxLXRlc3QpLgotCi1XZWQgQXByIDEyIDE2OjA2OjAxIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBFbmFibGUgYnVpbGRpbmcgb2Ygc2hhcmVkIGxpYnJhcmllcyBvbiBJUklYIDUgYW5kCi0gICAgICAgIE9TRi8xLiAgRml4IGNvbXBpbGVyIGZsYWdzLgotCSogYnVpbGQtYWxsLm1rOiBTdXBwb3J0IExpbnV4IGFuZCBPU0YvMSAzLjAuICBGaXggY29tcGlsZXIgZmxhZ3MuCi0KLVR1ZSBBcHIgMTEgMTg6NTU6NDAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgLS13aXRoLW5ld2xpYi4KLQkoc3BhcmMtKi1zdW5vczQqKTogQnVpbGQgc2ltLCBkZWphZ251LCBleHBlY3QsIHRjbCBpZiBjcm9zcyB0YXJnZXQuCi0KLU1vbiBBcHIgMTAgMTE6NDI6MjIgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JTWVyZ2UgaW4gc3VwcG9ydCBmb3IgTWFjIE1QVyBhcyBhIGhvc3QuCi0JKE9sZCBjaGFuZ2UgZGVzY3JpcHRpb25zIHJldGFpbmVkIGZvciBpbmZvcm1hdGlvbmFsIHZhbHVlLikKLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIGdlbmVyaWMgaW5jbHVkZSBmb3J3YXJkcyBmb3IgY3B1LXNwZWNpZmljCi0JaW5jbHVkZSBmaWxlcyBpbiBhb3V0IGFuZCBlbGYgZGlyZWN0b3JpZXMuCi0KLQkqIG1wdy1jb25maWd1cmU6IEFkZGVkIGNvcHlyaWdodC4KLQkqIG1wdy1jb25maWcuaW46IENoZWNrIGZvciBwcmVzZW5jZSBvZiByZXF1aXJlZCBidWlsZCB0b29scy4KLQkodGFyZ2V0X2xpYnMpOiBBZGQgbmV3bGliLgotCSh0YXJnZXRfdG9vbHMpOiBBZGQgZXhhbXBsZXMuCi0JKFJlYWQgTWUpOiBHZW5lcmF0ZSBhcyAiUmVhZCBNZSBmb3IgTVBXIiBpbnN0ZWFkLgotCSogbXB3LWJ1aWxkLmluOiBCYXNlIHN1Yi1idWlsZHMgb24gYWxsLWZvbyBpbnN0ZWFkIG9mIGRvLWZvby4KLQkoYWxsLWJ5YWNjLCBkby1ieWFjYywgYWxsLWZsZXgsIGRvLWZsZXgsIGRvLW5ld2xpYik6IE5ldyBhY3Rpb25zLgotCShkby1nYXMsIGRvLWdjYywgZG8tZ2RiLCBkby1sZCk6IEJ1aWxkIFZlcnNpb24uciBmaXJzdC4KLQotCSogbXB3LWNvbmZpZ3VyZTogUmVtb3ZlIHN1YmRpci1zcGVjaWZpYyBtYWtlZmlsZSBoYWNrZXJ5LAotCWRlbGV0ZSBtay50bXAgYWZ0ZXIgdXNpbmcgaXQuCi0KLQkqIG1wdy1idWlsZC5pbiAoYWxsKTogRGlzcGxheSBzdGFydCBhbmQgZW5kIHRpbWVzLgotCi0JKiBtcHctY29uZmlndXJlIChob3N0X2Nhbm9uaWNhbCk6IFNldC4KLQkodGFyZ2V0X2NwdSk6IEFsd2F5cyBhZGQgdG8gbWFrZWZpbGVzLgotCShBUkNIREVGUywgRU1VTCk6IEFkZCB0byBtYWtlZmlsZSBvbmx5IGlmIG5vbmVtcHR5LgotCShUTV9GSUxFLCBYTV9GSUxFLCBOTV9GSUxFKTogTm8gbG9uZ2VyIGFkZCB0byBtYWtlZmlsZS4KLQkobXB3LW1oLW1wdyk6IExvb2sgZm9yIGluIHNyY2RpciBhbmQgc3Jjcm9vdC4KLQlVc2Ugc2VkIGluc3RlYWQgb2YgbXB3LWVkaXQtcHJlZml4IHRvIGVkaXQgcHJlZml4IGRlZmluaXRpb25zLgotCi0JKiBtcHctYnVpbGQuaW46IChpbnN0YWxsLW9ubHkpOiBOZXcgdGFyZ2V0LgotCi0JKiBtcHctY29uZmlndXJlIChob3N0X2FsaWFzLCB0YXJnZXRfYWxpYXMpOiBSZW5hbWUgZnJvbSBob3N0YWxpYXMKLQlhbmQgdGFyZ2V0YWxpYXMsIGFkZCBpbnRvIGdlbmVyYXRlZCBNYWtlZmlsZS4KLQkobWsudG1wKTogSWYgcHJlc2VudCwgYWRkIGludG8gZ2VuZXJhdGVkIE1ha2VmaWxlLgotCSogbXB3LWJ1aWxkLmluIChhbGwtZ2FzKTogQnVpbGQgY29uZmlnLmggZmlyc3QgYmVmb3JlIGdhcyBwcm9wZXIuCi0KLQkqIG1wdy1jb25maWd1cmUgKGNvbmZpZy5zdGF0dXMpOiBXcml0ZSBvbmx5IGlmIGNoYW5nZWQuCi0JKiBtcHctY29uZmlnLmluIChyZWFkbGluZSk6IENvbmZpZ3VyZSBpdCAobm90IGJ1aWx0LCBqdXN0IHVzZWQgZm9yCi0JZGVmaW5pdGlvbnMpLgotCi0JKiBtcHctY29uZmlnLmluIChlbGYvbWlwcy5oKTogQWRkIGEgZm9yd2FyZCBpbmNsdWRlLgotCi0JKiBtcHctY29uZmlnLmluOiBGb3J3YXJkLWluY2x1ZGUgbW9zdCAuaCBmaWxlcyBpbiBpbmNsdWRlIGludG8KLQlleHRyYS1pbmNsdWRlLgotCShyZWFkbGluZSk6IERvbid0IGJ1aWxkLgotCW1wdy1idWlsZC5pbiAoaW5zdGFsbCk6IEluc3RhbGwgR0RCLgotCi0JKiBtcHctY29uZmlndXJlIChwcmVmaXgsIG1wd19wcmVmaXgpOiBIYW5kbGUgaXQuCi0JKiBtcHctY29uZmlnLmluIChtbWFsbG9jLCByZWFkbGluZSk6IERvbid0IGNvbmZpZ3VyZS4KLQkqIG1wdy1idWlsZC5pbiAodGhpc3NjcmlwdCk6IFJlbmFtZSB0byBUaGlzU2NyaXB0LgotCVVzZSBtcHctYnVpbGQgaW5zdGVhZCBvZiBCdWlsZFByb2dyYW0gZXZlcnl3aGVyZS4KLQkobW1hbGxvYywgcmVhZGxpbmUpOiBEb24ndCBidWlsZC4KLQkqIG1wdy1SRUFETUU6IE5ldyBmaWxlLCBiYXNpYyBkb2N1bWVudGF0aW9uIGFib3V0IHRoZSBNUFcgcG9ydC4KLQotCSogbXB3LWNvbmZpZy5pbjogVXNlIGZvcndhcmQtaW5jbHVkZSB0byBjcmVhdGUgaW5jbHVkZSBmaWxlcy4KLQotCSogbXB3LWNvbmZpZ3VyZTogQWRkIG1vcmUgdGhpbmdzIHRvIHRoZSB0b3Agb2YgZWFjaCBjb25maWd1cmVkCi0JTWFrZWZpbGUsIGluY2x1ZGluZyBjb250ZW50cyBvZiBjb25maWcvbXB3LW1oLW1wdy4KLQkqIG1wdy1jb25maWcuaW4gKGV4dHJhLWluY2x1ZGUpOiBDcmVhdGUgdGhpcyBkaXJlY3RvcnkgYW5kIGZpbGwgaXQKLQl3aXRoIFBvc2l4LWxpa2UgaW5jbHVkZSBmaWxlcyB3aGVuIGNvbmZpZ3VyaW5nLgotCi0JKiBjb25maWcuc3ViIChhcHBsZSwgbWFjLCBtcHcpOiBBZGQgdmFyaW91cyBhbGlhc2VzLgotCi0JKiBtcHctYnVpbGQuaW46IE5ldyBmaWxlLCB0b3AtbGV2ZWwgYnVpbGQgc2NyaXB0IGZyYWdtZW50IGZvciBNUFcuCi0JKiBtcHctY29uZmlndXJlOiBOZXcgZmlsZSwgY29uZmlndXJlIHNjcmlwdCBmb3IgTVBXLgotCSogbXB3LWNvbmZpZy5pbjogTmV3IGZpbGUsIGNvbmZpZyBmcmFnbWVudCBmb3IgTVBXLgotCi1GcmkgQXByICA3IDE5OjMzOjE2IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfbGlicyk6IFJlbW92ZSBnbG9iLCBzaW5jZSBpdCBpcyBnb25lIGZyb20gdGhlCi0Jc291cmNlcy4KLQotRnJpIE1hciAzMSAxMTozNjoxNyAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRlZmluZSBlbXB0eSBHREJfTkxNX0RFUFMgdmFyLgotCi0JKiBjb25maWd1cmUuaW4odGFyZ2V0X21ha2VmaWxlX2ZyYWcpOiB1c2UgY29uZmlnL210LW5ldHdhcmUKLQlmb3IgbmV0d2FyZSB0YXJnZXRzLgotCi1UaHUgTWFyIDMwIDEzOjUxOjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTWVyZ2UgaW4gcmVjZW50IEZTRiBjaGFuZ2VzLiAgUmVtb3ZlIGxpbnV4IHNwZWNpYWwKLQljYXNlcy4KLQotVHVlIE1hciAyOCAxNDo0NzozNCAxOTk1ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JYnVpbGQtYWxsLm1rLGNvbmZpZy9taC1zb2xhcmlzOiAgcmV2ZXJ0IHRoZXNlIHR3byBjaGFuZ2VzOgotCi0JVHVlIE1hciAzMCAxMDowMzowOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkJKiBidWlsZC1hbGwubWs6IFVzZSBDQz1jYyAtWHMgb24gU29sYXJpcy4KLQotCU1vbiBNYXIgMjkgMTk6NTk6MjYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JCSogY29uZmlnL21oLXNvbGFyaXM6IFN1blBSTyBDIG5lZWRzIC1YcyB0byBiZSBhYmxlIHRvIGdldCBhCi0JCXdvcmtpbmcgeG1ha2VmaWxlIGZvciBFbWFjcy4KLQotVHVlIE1hciAyMSAxMDo0MzozMiAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogZ2xvYi8qOiBSZW1vdmVkLiAgU2NoYXVlcidzIDI0IEZlYiAxOTk0IHJlYWRsaW5lIGNoYW5nZSBtYWRlIHVzCi0Jc3RvcCB1c2luZyBpdC4KLQkqIE1ha2VmaWxlLmluOiBOdWtlIGFsbCByZWZlcmVuY2VzIHRvIGdsb2Igc3ViZGlyZWN0b3J5LgotCi1UaHUgTWFyIDE2IDEzOjM1OjMwIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEZpeCAtLWVuYWJsZS1zaGFyZWQgbG9naWMgaW4gcGVyLWhvc3QuCi0KLU1vbiBNYXIgMTMgMTI6MzM6MTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKCotaHAtaHB1eFs3OF0qKTogVXNlIG1oLWhwdXg4LgotCi1Nb24gTWFyICA2IDEwOjIxOjU4IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERvbid0IGJ1aWxkIGdhcyBvbiBBSVgsIGZvcgotCXBvd2VycGMqLSotYWl4KiBhcyB3ZWxsIGFzIGZvciByczYwMDAqLSotYWl4Ki4KLQotV2VkIE1hciAgMSAxMjo1MTo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRml4IC0tY2FjaGUtZmlsZSB0byB3b3JrIGlmIHRoZSBmaWxlIGFyZ3VtZW50IGlzIGEKLQlyZWxhdGl2ZSBwYXRoLgotCi1UdWUgRmViIDI4IDE3OjM2OjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZiB0aGUgLS1jYWNoZS1maWxlIGlzIHVzZWQsIHBhc3MgaXQgZG93biB0bwotCWNvbmZpZ3VyZSBpbiBzdWJkaXJlY3Rvcmllcy4KLQotTW9uIEZlYiAyNyAxMjo1Mjo0NiAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBhZGQgdnh3b3JrczI5ayBjb25maWd1cmF0aW9uLgotCi1GcmkgRmViIDEwIDE2OjEyOjI2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBEbyAiZGlzdHN0dWZmIiBwYXJ0IHF1aWV0bHkuCi0KLVN1biBGZWIgIDUgMTQ6MTY6MzUgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTWluaS1tZXJnZSB3aXRoIGdjYy9jb25maWcuc3ViLgotCi1TYXQgRmViICA0IDEyOjExOjM1IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzIChJUklYKTogU2VkIC0gdG8gXy4KLQotRnJpIEZlYiAgMyAxMTo1NDo0MiAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChzb3VyY2UtdmF1bHQsIGJpbmFyeS12YXVsdCk6IE5ldyB0YXJnZXRzLgotCi1UaHUgSmFuIDI2IDEzOjAwOjExIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgLWVhYmkgYXMgYSBiYXNpYyBzeXN0ZW0gdHlwZS4KLQotVGh1IEphbiAxMiAxMzoxMzoyMyAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChlbmFibGVfc2hhcmVkIHN0dWZmKTogRml4IHR5cG8uCi0KLVRodSBKYW4gMTIgMDE6MzY6NTEgMTk5NSAgZGVhbm1AbWVkdWxsYS5MQUJTLlRFSy5DT00gKERlYW4gTWVzc2luZykKLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IEZpeCB0eXBvIGluIHBhc3NpbmcgTElCQ1hYRkxBR1MqLgotCi1XZWQgSmFuIDExIDE2OjI5OjUzIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTElCQ1hYRkxBR1NfRk9SX1RBUkdFVCk6IEFkZCAtZm5vLWltcGxpY2l0LXRlbXBsYXRlcy4KLQotTW9uIEphbiAgOSAxMjo0ODowMSAxOTk1ICBKaW0gS2luZ2RvbiAgPGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChyczYwMDAtKi0qKTogRG9uJ3QgYnVpbGQgZ2FzLgotCi1XZWQgSmFuICA0IDIzOjUzOjQ5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFVzZSAveC94LyBpbnN0ZWFkIG9mIC9icm9rZW5zZWQvYnJva2Vuc2VkLywgdG8KLQlyZWR1Y2UgY29tbWFuZCBsaW5lIGxlbmd0aC4KLQkoQVNfRk9SX1RBUkdFVCk6IENoZWNrIGZvciBhcy5uZXcsIG5vdCBNYWtlZmlsZS4KLQkoTk1fRk9SX1RBUkdFVCk6IENoZWNrIGZvciBubS5uZXcsIG5vdCBNYWtlZmlsZS4KLQotV2VkIEphbiAgNCAxMzowMjozOSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2UgZnJvbSBGU0YuCi0KLVRodSBEZWMgMTUgMTc6MTE6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IERvbid0IHVzZSAkIHdoZW4gaGFuZGxpbmcgcHJvZ3JhbV9zdWZmaXguCi0KLU1vbiBEZWMgMTIgMTI6MDk6MzcgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQ29uZmlndXJlIHRrIGZvciBocHBhL2hwdXguCi0KLUZyaSBEZWMgIDIgMTU6NTU6MzggMTk5NCAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChMSUJHWFhfU1VQUE9SVF9ESVJTKTogIEFkZCBsaWJzdGRjKysuCi0KLVR1ZSBOb3YgMjkgMTk6Mzc6NTYgMTk5NCAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiAgTW92ZSAtZm5vLWltcGxpY2l0LXRlbXBsYXRlIGZyb20gQ1hYRkxBR1MKLQl0byBMSUJDWFhGTEFHUy4gIFRlc3RzIGFyZSBiZXR0ZXIgcnVuIHdpdGhvdXQgaXQuCi0KLVdlZCBOb3YgMjMgMTA6Mjk6MjUgMTk5NCAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWlzcGVsbCk6IERlcGVuZCBvbiBhbGwtZW1hY3MxOSBpbnN0ZWFkIG9mIGFsbC1lbWFjcy4KLQotTW9uIE5vdiAyMSAxMToxNDowMSAxOTk0ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLW5ldHdhcmUqKTogRG9uJ3QgY29uZmlndXJlIHhpYmVydHkuCi0KLU1vbiBOb3YgMTQgMDg6NDk6MTUgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVtb3ZlIHRrIGZyb20gbmF0aXZlX29ubHkgbGlzdC4KLQotRnJpIE5vdiAxMSAxNTozMToyNiAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIGJ1aWxkLWFsbC5tazogQWRkIG1pcHMtbmNkLWVsZiB0YXJnZXQgdG8gc3VuNCB0YXJnZXRzCi0JICBmb3Igc3BlY2lhbCBOQ0QgYnVpbGQuCi0KLU1vbiBOb3YgIDcgMjA6NTg6MTcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6IFJlbW92ZSBjb25maWd1cmUuYmF0IGFuZAotCW1ha2VhbGwuYmF0LCB0aGV5J3JlIG9ubHkgdXNlZnVsIGZvciBiaW51dGlscyBzbmFwc2hvdHMuCi0JKGJpbnV0aWxzLnRhci5neiwgZ2FzK2JpbnV0aWxzLnRhci5neik6IEFkZCBjb25maWd1cmUuYmF0IGFuZAotCW1ha2VhbGwuYmF0IHRvIHNwZWNpZmllZCBTVVBQT1JUX0ZJTEVTLgotCi1Nb24gTm92ICA3IDE3OjI1OjE4IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogYnVpbGQtYWxsLm1rOiBBZGQgRXJpY3Nzb24gdGFyZ2V0cyB0byBzdW40IGFuZCBzb2xhcmlzCi0JICBob3N0cy4gIEFkZCAgQk5SJ3Mgc3VuNCB0YXJnZXQgdG8gc29sYXJpcyBob3N0LCBzbyB0aGVpcgotCSAgYnVpbGQtZnJvbS1zb3VyY2Ugd2lsbCBiZSB0ZXN0ZWQgaW4taG91c2UgZmlyc3QuCi0KLVNhdCBOb3YgIDUgMTg6NDM6MzAgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChMSUJDRkxBR1MpOiBOZXcgdmFyaWFibGUuCi0JKENGTEFHU19GT1JfVEFSR0VUKTogRGl0dG8uCi0JKExJQkNGTEFHU19GT1JfVEFSR0VUKTogRGl0dG8uCi0JKExJQkNYWEZMQUdTKTogRGl0dG8uCi0JKENYWEZMQUdTX0ZPUl9UQVJHRVQpOiBEaXR0by4KLQkoTElCQ1hYRkxBR1NfRk9SX1RBUkdFVCk6IERpdHRvLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBQYXNzIHRoZW0uCi0JKEVYVFJBX1RBUkdFVF9GTEFHUyk6IERpdHRvLgotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy9tW3RoXS0qcGljOiBTdXBwb3J0IC0tZW5hYmxlLXNoYXJlZC4KLQotU2F0IE5vdiAgNSAxNTo0NDowMCAxOTk0ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfbGlicyk6ICBJbmNsdWRlIGxpYnN0ZGMrKyBhZ2Fpbi4KLQkqIGNvbmZpZy5ndWVzczogIFVwZGF0ZSBmcm9tIEZTRiAoZm9yIEZyZWVCU0QpLgotCi1UaHUgTm92ICAzIDE2OjMyOjMwIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBJbmNsdWRlIGNvbmZpZ3VyZS5iYXQgYW5kCi0JbWFrZWFsbC5iYXQuCi0JKERJU1RET0NESVJTKTogQWRkIGBldGMnLgotCShFVENfU1VQUE9SVF9QRlgpOiBOZXcgdmFyaWFibGUuCi0JKHRheik6IEluY2x1ZGUgYW55dGhpbmcgZnJvbSBldGMgc3RhcnRpbmcgd2l0aCBhIHdvcmQgaW4KLQlFVENfU1VQUE9SVF9QRlguCi0KLVdlZCBPY3QgMjYgMTY6MTk6MzUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBVcGRhdGUgZm9yIHJlY2VudCBGU0YgY2hhbmdlcy4gIFJlbW92ZSBvYnNvbGV0ZQotCWg4MzAwaGRzIGVudHJ5LiAgQWRkIC13aW5kb3dzKiBhbmQgLW9zeCBhcyBiYXNpYyBvcy4gIE1pbm9yCi0Jc3BhY2luZyBjaGFuZ2VzLgotCi1UaHUgT2N0IDIwIDE4OjQxOjU2IDE5OTQgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9saWJzKTogIFJlbW92ZSBsaWJzdGRjKysgZm9yIGxpYmcrKy0yLjYuMS4KLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2Ugd2l0aCBGU0YuCi0JKiBjb25maWd1cmUuaW46ICBNYXRjaCBvbiBpPzg2LW5jci1zeXN2NC4zLCBub3QgaT84Ni1uY3Itc3lzdjQzLgotCi1UaHUgT2N0IDIwIDE5OjI2OjU2IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogU2luY2UgdGhlICJ0cmFwIDAiIGhhbmRsZXIgd2lsbCBvdmVycmlkZSB0aGUgZXhpdAotCXN0YXR1cyBvbiBtYW55IHN5c3RlbXMsIG9ubHkgdXNlIGl0IGZvciAiZXhpdCAxIiwgYW5kIG1ha2UgaXQgc2V0Ci0JYSBub24temVybyBleGl0IHN0YXR1czsgcmVzZXQgaXQgYmVmb3JlICJleGl0IDAiLiAgQWxzbywgY2hlY2sKLQlleGl0IHN0YXR1cyBvZiBjb25maWcuc3ViLCBhbmQgZXJyb3Igb3V0IGlmIGl0IGZhaWxlZC4KLQotV2VkIE9jdCAxOSAxODo0OTo1NSAxOTk0ICBSb2IgU2F2b3llICAocm9iQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAoQUxMX1RBUkdFVF9NT0RVTEVTLElOU1RBTExfVEFSR0VUX01PRFVMRVMpIEJ1aWxkCi0JYW5kIGluc3RhbGwgbGliZ2xvc3MuCi0KLVR1ZSBPY3QgMTggMTU6MjU6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWJpbnV0aWxzKTogRGVwZW5kIHVwb24gYWxsLWJ5YWNjLgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIGVtYWNzIG9uIElyaXggNS4KLQotTW9uIE9jdCAxNyAxNjoyMjoxMiAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLW5ldHdhcmUqKTogQWRkIGxpYmlvLgotCi1UaHUgT2N0IDEzIDE1OjUxOjIwIDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX1RBUkdFVF9NT0RVTEVTKTogQWRkIGxpYnN0ZGMrKy4KLQkoQ0hFQ0tfVEFSR0VUX01PRFVMRVMpOiBEaXR0by4KLQkoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUyk6IERpdHRvLgotCShUQVJHRVRfTElCUyk6IERpdHRvLgotCShhbGwtbGlic3RkYysrKTogTm90ZSBkZXBlbmRlbmNpZXMuCi0KLVRodSBPY3QgMTMgMDE6NDM6MDggMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJJTlVUSUxTX1NVUFBPUlRfRElSUyk6IEFkZCBnYXMuCi0KLVR1ZSBPY3QgMTEgMTI6MTI6MjkgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChDWFhGTEFHUyk6IFVzZSAtZm5vLWltcGxpY2l0LXRlbXBsYXRlcyBpbnN0ZWFkIG9mCi0JLWZleHRlcm5hbC10ZW1wbGF0ZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2xpYnMpOiBBZGQgbGlic3RkYysrLgotCShub2NvbmZpZ2RpcnMpOiBBZGQgbGlic3RkYysrIGFzIGFwcHJvcHJpYXRlLgotCi1UaHUgT2N0ICA2IDE4OjAwOjU0IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBVcGRhdGUgZnJvbSBGU0YuCi0KLVR1ZSBPY3QgIDQgMTI6MDU6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFVzZSAke2NvbmZpZ19zaGVsbH0gd2hlbiBydW5uaW5nICR7Y29uZmlnc3VifS4KLQotTW9uIE9jdCAgMyAxNDoyODozNCAxOTk0ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBObyBsb25nZXIgcmVjb2duaXplIGg4MzAwaC4KLQotTW9uIE9jdCAgMyAxMjo0MDo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlbW92ZSBleHRyYW5lb3VzIGRpZmZlcmVuY2VzIGJldHdlZW4gY29uZmlnLnN1YiBhbmQKLQlnY2MvY29uZmlnLnN1Yi4KLQotU2F0IE9jdCAgMSAwMDoyMzoxMiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGRElSUyk6IEFkZCBnYXMuCi0KLVRodSBTZXAgMjIgMTk6MDQ6NTUgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogQ09QWUlORy5ORVdMSUI6IE5ldyBmaWxlLgotCi1Nb24gU2VwIDE5IDE4OjI1OjQwIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3MgKEhQLVVYKTogIFBhdGNoIGZyb20gSGFybGFuIFN0ZW5uCi0JPGhhcmxhbkBsYW5kbWFyay5jb20+IHRvIGFsc28gZW1pdCByZWxlYXNlIGxldmVsLgotCi1XZWQgU2VwICA3IDEzOjE1OjI1IDE5OTQgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzIChzdW40KjpTdW5PUzoqOiopOiBDaGFuZ2UgJy1KTCcgdG8gJ19KTCcuCi0KLVR1ZSBTZXAgIDYgMjM6MjM6MTggMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBNZXJnZSBuZXh0c3RlcCBjbGVhbnVwIGZyb20gRlNGLgotCi1Nb24gU2VwICA1IDA1OjAxOjMwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGFybS0qLSopOiBEb24ndCBjb25maWd1cmUgbGQgZm9yIHRoaXMgdGFyZ2V0LgotCi1UaHUgU2VwICAxIDA5OjM1OjAwIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICgqLSotbmV0d2FyZSk6IGRvbid0IGNvbmZpZ3VyZSBsaWJnKyssIGxpYmlvLAotCSAgbGlicngsIG9yIG5ld2xpYi4KLQotV2VkIEF1ZyAzMSAxMzo1MjowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEtZGVjLW9zZiopOiBVc2Ugb3NmKiwgbm90IG9zZjEqLiAgRG9uJ3QKLQljb25maWd1cmUgbGQtLWl0IHdvcmtzLCBidXQgaXQgZG9lc24ndCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuCi0KLVN1biBBdWcgMjggMTg6MTM6NDUgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoKi11bmtub3duLWZyZWVic2QqKTogIEdldCByaWQgb2YgcG9zc2libGUKLQl0cmFpbGluZyAiKFJlbGVhc2UpIiBpbiB2ZXJzaW9uIHN0cmluZy4KLQlQYXRjaCBmcm9tIFBhdWwgUmljaGFyZHMgPHBhdWxAaXNsLmNmLmFjLnVrPi4KLQotU2F0IEF1ZyAyNyAxNTowMDo0OSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgRml4IGk0ODYtbmNyLXN5c3Y0MyAtPiBpNDg2LW5jci1zeXN2NC4zLgotCUZpeCB0eXBlOiAqLW5leHQtbmVzdHN0ZXAgLT4gKi1uZXh0LW5leHRzdGVwLgotCi0JKiBjb25maWcuZ3Vlc3M6ICBNZXJnZSBmcm9tIEZTRjoKLQotCUZyaSBBdWcgMjYgMTg6NDU6MjUgMTk5NCAgUGhpbGlwcGUgRGUgTXV5dGVyIChwaGRtQGluZm8udWNsLmFjLmJlKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBwb3dlcnBjLWlibS1haXgzLjIuNS4KLQotCVdlZCBBcHIgMjAgMDY6MzY6MzIgMTk5NCAgUGhpbGlwcGUgRGUgTXV5dGVyICAocGhkbUBpbmZvLnVjbC5hYy5iZSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgVW5peFdhcmUgMS4xIChVTkFNRV9TWVNURU0gaXMgU1lTVEVNX1YKLQlpbnN0ZWFkIG9mIFVOSVhfU1YgZm9yIFVuaXhXYXJlIDEuMCkuCi0KLVNhdCBBdWcgMjcgMDE6NTY6MzAgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nZGIpOiAgQWRkIGRlcGVuZGVuY2llcyBvbiBhbGwtZ2NjIGFuZCBhbGwtbGQKLQl0byBtYWtlIGdkYi9ubG0vKiBidWlsZCBhZnRlciB0aGUgY29tcGlsZXIgYW5kIGxpbmtlci4KLQotRnJpIEF1ZyAyNiAxNDozMDowNSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzIChuZXRic2QsIGZyZWVic2QsIGxpbnV4KTogIEFjY2VwdCBhbnkgbWFjaGluZSwKLQlub3QganVzdCBpWzM0XTg2LgotCShtNjhrLWF0YXJpLXN5c3Y0KTogIFJlbG9jYXRlIHRvIG1hdGNoIEZTRiB2ZXJzaW9uLgotCi0JKiBjb25maWcuZ3Vlc3M6ICBNb3JlIG1lcmdlcyBmcm9tIHRoZSBGU0Y6Ci0KLQlBZGQgYSBzcGFjZSBiZWZvcmUgZnVuY3Rpb24gY2FsbCBvciBtYWNybyBpbnZvY2F0aW9uLgotCi0JVHVlIE1heSAxMCAxNjo1Mzo1NSAxOTk0ICBSb2xhbmQgTWNHcmF0aCAocm9sYW5kQGNodXJjaHkuZ251LmFpLm1pdC5lZHUpCi0KLQkqIGNvbmZpZy5ndWVzczogQWRkIHRyYXAgY21kIHRvIHJlbW92ZSBkdW1teS5jIGFuZCBkdW1teSB3aGVuCi0JaW50ZXJydXB0ZWQuCi0KLQlXZWQgQXByIDIwIDE4OjA3OjEzIDE5OTQgIFJvbGFuZCBNY0dyYXRoIChyb2xhbmRAY2h1cmNoeS5nbnUuYWkubWl0LmVkdSkKLQotCSogY29uZmlnLmd1ZXNzIChkdW1teS5jKTogUmVkaXJlY3Qgc3RkZXJyIGZvciBgaG9zdGluZm8nIGNvbW1hbmQuCi0JKGR1bW15KTogUmVkaXJlY3Qgc3RkZXJyIGZyb20gY29tcGlsYXRpb24gb2YgZHVtbXkuYy4KLQotCVNhdCBBcHIgIDkgMTQ6NTk6MjggMTk5NCAgQ2hyaXN0aWFuIEtyYW56ICAoa3JhbnpAc2VudDUudW5pLWR1aXNidXJnLmRlKQotCi0JKiBjb25maWcuZ3Vlc3M6IERpc3Rpbmd1aXNoIGJldHdlZW4gTmVYVFN0ZXAgMi4xIGFuZCAzLnguCi0KLUZyaSBBdWcgMjYgMTM6NDI6MjAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IEFjY2VwdCBhbmQgaWdub3JlIC0tY2FjaGUqLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCi0JbmV3IGF1dG9jb25mLgotCi1GcmkgQXVnIDI2IDEzOjA1OjI3IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBNZXJnZSBmcm9tIEZTRjoKLQotCVRodSBBdWcgMjUgMjA6Mjg6NTEgMTk5NCAgUmljaGFyZCBTdGFsbG1hbiAgPHJtc0Btb2xlLmdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcuZ3Vlc3MgKFB5cmFtaWQqOk9TeCo6KjoqKTogTmV3IGNhc2UuCi0gICAgICAgIChQQVRIKTogQWRkIC8uYXR0YmluIGF0IGVuZCBmb3IgZmluZGluZyB1bmFtZS4KLSAgICAgICAgKGR1bW15LmMpOiBIYW5kbGUgaTg2MC1hbGxpYW50LWJzZC4gIEZvbGxvdyB3aGl0ZXNwYWNlIGNvbnZlbnRpb25zLgotCi0JV2VkIEF1ZyAxNyAxODoyMTowMiAxOTk0ICBUb3IgRWdnZSAgKHRlZ2dlQHB2di51bml0Lm5vKQotCi0gICAgICAgICogY29uZmlnLmd1ZXNzIChNODgqOkRvbHBoaW5PUzoqOiopOiBOZXcgY2FzZS4KLQotCVRodSBBdWcgMTEgMTc6MDA6MTMgMTk5NCAgU3RhbiBDb3ggIChjb3hzQGRnLXJ0cC5kZy5jb20pCi0KLSAgICAgICAgKiBjb25maWcuZ3Vlc3MgKEFWaWlPTjpkZ3V4Oio6Kik6IFVzZSBUQVJHRVRfQklOQVJZX0lOVEVSRkFDRQotICAgICAgICB0byBzZWxlY3Qgd2hldGhlciB0byB1c2UgRUxGIG9yIENPRkYuCi0KLQlTdW4gSnVsIDI0IDE2OjIwOjUzIDE5OTQgIFJpY2hhcmQgU3RhbGxtYW4gIDxybXNAbW9sZS5nbnUuYWkubWl0LmVkdT4KLQotICAgICAgICAqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGk4NjAtc3RhcmRlbnQtc3lzdiBhbmQgaTg2MC11bmtub3duLXN5c3YuCi0KLQlTdW4gTWF5ICAxIDEwOjIzOjEwIDE5OTQgIFJpY2hhcmQgU3RhbGxtYW4gIChybXNAbW9sZS5nbnUuYWkubWl0LmVkdSkKLQotCSogY29uZmlnLmd1ZXNzOiBHdWVzcyB0aGUgT1MgdmVyc2lvbiBmb3IgSFBVWC4KLQotCVR1ZSBNYXIgIDEgMjE6NTM6MDMgMTk5NCAgS2FybCBIZXVlciAgKGt3emhAaGFsLmdudS5haS5taXQuZWR1KQotCi0JKiBjb25maWcuZ3Vlc3MgKFVOQU1FX1ZFUlNJT04pOiBSZWNvZ25pemUgYWl4My4yLjQgYW5kIGFpeDMuMi41LgotCi1GcmkgQXVnIDI2IDExOjE5OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgLS13aXRoLWhlYWRlcnMsIC0td2l0aC1saWJzLCBhbmQKLQktLXdpdGhvdXQtbmV3bGliLgotCSogTWFrZWZpbGUuaW4gKGFsbC14aWJlcnR5KTogRGVwZW5kIHVwb24gYWxsLWxkLgotCi1XZWQgQXVnIDI0IDEyOjM2OjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgaVszNF04NiB0byBpWzM0NV04Ni4KLQotTW9uIEF1ZyAyMiAxMDo1ODozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAodmVyc2lvbik6IEEgZmV3IG1vcmUgdHdlYWtzIHRvIGhlbHAgbWVzc2FnZS4KLQotRnJpIEF1ZyAxOSAxMjo0MDoyNSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZW1vdmUgKGZvciBub3cpIGxpYnJ4IGFzIGEgaG9zdCBsaWJyYXJ5LAotCW5vdyB0aGF0IHdlJ3JlIGJ1aWxkaW5nIGl0IGZvciB0YXJnZXQuCi0KLUZyaSBBdWcgMTkgMTA6NDk6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IEZpeCB1cCBoZWxwIG1lc3NhZ2U7IGZyb20ga2FybEBvd2wuaHEuaWxlYWYuY29tCi0JKEthcmwgQmVycnkpLgotCi1UdWUgQXVnIDE2IDE2OjExOjA4IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBBbHNvIGNvbmZpZ3VyZSBsaWJyeC4KLQotTW9uIEF1ZyAxNSAxNjo1MTo0NSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgdmFyaW91cyBydWxlcyB0byByZWZsZWN0IHRoYXQgbGlicngKLQlpcyBub3cgbmVlZGVkIGZvciBsaWJnKysuCi0KLUZyaSBBdWcgMTIgMTg6MDc6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgbWlwczY0b3Jpb24gYW5kIG1pcHM2NG9yaW9uZWwgYXMgYSBDUFUgbmFtZS4KLQotTW9uIEF1ZyAgOCAxMTozNjoxNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ29uZmlndXJlIHRoZSBleGFtcGxlcyBkaXJlY3RvcnkuCi0KLVRodSBBdWcgIDQgMTY6MTI6MzYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IFNpbXBsaWZ5IEp1biAyIDE5OTQgY2hhbmdlLgotCi1XZWQgQXVnICAzIDA0OjU4OjE2IDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogY2hhbmdlIENDIHRvIC91c3IvbGF0ZXN0L2Jpbi9nY2MgZm9yIGx5bnggaG9zdCBidWlsZHMsIHNpbmNlCi0JL2Jpbi9nY2MgaXNuJ3QgZ29vZCBlbm91Z2ggdG8gYnVpbGQgZ2NjLgotCi1XZWQgSnVsIDI3IDA5OjA3OjE0IDE5OTQgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoR0RCX1NVUFBPUlRfRklMRVMpOiBSZW1vdmUKLQkoc2V0dXAtZGlycy1nZGIsIGdkYi50YXIuZ3osIG1ha2UtZ2RiLnRhci5neik6ICBSZW1vdmUgb2xkIHJ1bGVzLgotCShnZGIudGFyLmd6KTogQWRkIG5ldyBydWxlIHRvIHVzZSBzdGFuZGFyZCBkaXN0cmlidXRpb24gYnVpbGRpbmcKLQltZWNoYW5pc20uCi0KLU1vbiBKdWwgMjUgMTE6MTA6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFdhcm4gYWJvdXQgdXNlIG9mIC91c3IvdWNiL2NjIG9uIFNvbGFyaXMuICBGcm9tCi0JQmlsbCBDb3ggPGJpbGxAY3lnbnVzLmNvbT4uCi0KLVNhdCBKdWwgMjMgMTI6MTk6NDYgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBJU0MuICBQYXRjaCBmcm9tIGt3emhAZ251LmFpLm1pdC5lZHUuCi0KLUZyaSBKdWwgMjIgMTc6NTM6NTkgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgU2VhcmNoIGN1cnJlbnQgZGlyIGZpcnN0IGluIC5nZGJpbml0LgotCi1GcmkgSnVsIDIyIDExOjI4OjMwIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgUmVjb2duaXplIGZyZWVic2QgKG1lcmdlZCBmcm9tIGdjYyBjb25maWcuc3ViKS4KLQotVGh1IEp1bCAyMSAxNDoxMDo1MiAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIFJlZmVyIHRvIE5lWFQncyBvcGVyYXRpbmcgc3lzdGVtIGFzIG5leHRzdGVwLgotCi0JKiBjb25maWcuc3ViIChjYXNlICRiYXNpY19tYWNoaW5lKTogIFJlLW9yZGVyIHRoZSBjYXNlcywgdG8gbWF0Y2gKLQl0aGUgb3JkZXIgaW4gdGhlIEZTRiB2ZXJzaW9uICh3aGljaCBpcyBtb3N0bHkgYWxwaGFiZXRoaWNhbCkuCi0JTWVyZ2UgaW4gc29tZSBhZGRpdGlvbnMgYW5kIGNoYW5nZXMgZnJvbSB0aGUgRlNGLgotCi1TYXQgSnVsIDE2IDEyOjAzOjA4IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgbTY4ay1hdGFyaS1zeXN2NCBhbmQgbTg4ay1oYXJyaXMtY3N1eDcuCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgY3h1eDcuCi0JKiBjb25maWd1cmUuaW46IFVzZSBtaC1jeHV4IGZvciBtODhrLWhhcnJpcy1jeHV4Ki4KLQotTW9uIEp1bCAxMSAxNDozNzozOSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIEZpeCB0eXBvIHBvd2VycGMgLT4gcG93ZXJwYy0qLgotCi1TYXQgSnVsICA5IDEzOjAzOjQzIDE5OTQgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AYmx1ZXMuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGBhbGwtZW1hY3MxOScgZGVwZW5kcyBvbiBgYWxsLWJ5YWNjJy4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBhbGwtZW1hY3MxOSBhbmQgaW5zdGFsbC1lbWFjczE5IHJ1bGVzIChpbgotCXBhcmFsbGVsIHdpdGggYWxsLWVtYWNzIGFuZCBpbnN0YWxsLWVtYWNzKS4gIFRvcC1sZXZlbCBjb21tYW5kCi0JYG1ha2UgYWxsLWVtYWNzMTkgQ0M9Z2NjJyBub3cgYmVoYXZlcyBhcyBgbWFrZSBhbGwtZW1hY3MgQ0M9Z2NjJy4KLQotVGh1IEp1biAzMCAxNjo1Mzo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWsgKCQoaG9zdCktc3RhbXAtc3RhZ2UyLWluc3RhbGxlZCk6IFJlbW92ZQotCSQocmVsYmluZGlyKS9tYWtlIGJlZm9yZSBkb2luZyBgYG1ha2UgaW5zdGFsbCcnLCBhbmQgdXNlCi0JJChHTlVfTUFLRSkgd2hpbGUgZG9pbmcgaXQuICBBdm9pZHMgcHJvYmxlbSBvbiBTdW5PUyB3aXRoCi0JaW5zdGFsbGluZyBvdmVyIHJ1bm5pbmcgbWFrZSBiaW5hcnkuCi0JKCQoaG9zdCktc3RhbXAtc3RhZ2UzLWluc3RhbGxlZCk6IExpa2V3aXNlLgotCi1UdWUgSnVuIDI4IDEzOjQzOjI1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBNYWNoLgotCi1Nb24gSnVuIDI3IDE2OjQxOjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBDaGVjayAke2V4ZWNfcHJlZml4b3B0aW9ufSwgbm90ICR7ZXhlY19wcmVmaXh9LCB0bwotCXNlZSB3aGV0aGVyIC0tZXhlYy1wcmVmaXggd2FzIHVzZWQuCi0KLVN1biBKdW4gMjYgMjE6MTU6NTQgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIFJFQURNRTogIEV4cGxpY2l0bHkgbWVudGlvbiBsaWJnKysvUkVBRE1FLiAgKFpvbydzIGlkZWEuKQotCi1UdWUgSnVuIDIxIDEyOjQ1OjU1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGFsbC1saWJyeCB0YXJnZXQgc2ltaWxhciB0byBhbGwtbGlicHJvYy4KLQotV2VkIEp1biAgOCAyMzoxMTo1NSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWFycmFuZ2UgdGVzdHMgZm9yIEFscGhhLU9TRjEgdG8gcHJvcGVybHkgZGVhbAotCXdpdGggcG9zdCAxLjIgdW5hbWUgYm9nb3NpdHkuCi0KLVRodSBKdW4gIDkgMDA6Mjc6NTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IFJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMgb24gcmVjZWlwdCBvZiBhIHNpZ25hbC4KLQotVHVlIEp1biAgNyAxMjowNjoyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogSWYgdGhlcmUgaXMgYSBwYWNrYWdlX21ha2VmaWxlX2ZyYWcsIHJlbW92ZQotCSR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gYWZ0ZXIgY29weWluZyBpdCBpbi4KLQotTW9uIEp1biAgNiAyMTozNTowMiAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGJ1aWxkX2FsbC5tazogc3VwcG9ydCByczYwMDAgbHlueCBpZGVudGlmaWVzIGl0c2VsZiBhcwotCXJzNjAwMC1seW54LWx5bnhvczIuMi4yLiAgQWxzbywgdXNlIC91c3IvY3lnbnVzL3Byb2dyZXNzaXZlL2Jpbi9nY2MKLQlzaW5jZSAvYmluL2djYyBpcyB0b28gZmVlYmxlIHRvIGNvbXBpbGUgYSBtb2Rlcm4gZ2NjLgotCi1Nb24gSnVuICA2IDE2OjA2OjM0IDE5OTQgIEthcmVuIENocmlzdGlhbnNlbiAoa2FyZW5AY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGJyb3VnaHQgZGV2by90ZXN0LWJ1aWxkLm1rIHVwZGF0ZS10by1kYXRlIHdpdGggcHJvZ3Jlc3NpdmUvCi0JICB0ZXN0LWJ1aWxkLm1rLiBBZGQgbHlueCB0YXJnZXRzIGFuZCBocHBhIGZsYWcgaW5mby4KLQotU2F0IEp1biAgNCAxNzoyMzo1NCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgVXNlIG1oLW5jcnN2cjQzLiAgUGF0Y2ggZnJvbQotCVRvbSBNY0Nvbm5lbGwgPHRtY2Nvbm5lQHNlZG9uYS5pbnRlbC5jb20+LgotCi1GcmkgSnVuICAzIDE3OjQ3OjI0IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3MgKGkzODYtdW5rbm93bi1ic2RpKTogIE5vIGxvbmdlciBuZWVkIHRvCi0JY2hlY2sgI2lmIGRlZmluZWQoX19ic2RpX18pICYmIGRlZmluZWQoX19pMzg2X18pLgotCi1UaHUgSnVuICAyIDE4OjU2OjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBTZXQgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZW9wdGlvbiBjb3JyZWN0bHkuCi0KLVRodSBKdW4gIDIgMTA6NTc6MDYgMTk5NCAgS2FyZW4gQ2hyaXN0aWFuc2VuIChrYXJlbkBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogYnJvdWdodCBidWlsZC1hbGwubWsgdXBkYXRlLXRvLWRhdGUgd2l0aCBwcm9ncmVzc2l2ZSBidWlsZC1hbGwubWssCi0JICBhZGRlZCBuZXcgdGFyZ2V0cyBhbmQgaHBwYSBpbmZvLgotCQotVGh1IEp1biAgMiAwMDoxMjo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogSWYgY29uZmlnLmd1ZXNzIHJlc3VsdCBpcyBhIHByZWZpeCBvZiB0aGUgdXNlcgotCXNwZWNpZmllZCB0YXJnZXQsIGFzc3VtZSBhIG5hdGl2ZSBidWlsZCBhbmQgdXNlIHRoZSB1c2VyIHNwZWNpZmllZAotCXRhcmdldCBhcyB0aGUgaG9zdCBhbGlhcy4gIFJlbW92ZSBTdW5PUyBwYXRjaCBzdWZmaXggcmVtb3ZhbCBoYWNrLgotCSogY29uZmlndXJlLmluOiBSZW1vdmUgU3VuT1MgcGF0Y2ggc3VmZml4IHJlbW92YWwgaGFjay4KLQotCSogTWFrZWZpbGUuaW4gKENST1NTX0NIRUNLX01PRFVMRVMpOiBSZW1vdmUgY2hlY2stZmxleCwgc2luY2UgaXQncwotCWluIE5BVElWRV9DSEVDS19NT0RVTEVTLgotCi1XZWQgSnVuICAxIDEwOjQ5OjQxIDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlbmFtZSBIT1NUX09OTFkgdG8gTkFUSVZFLgotCSogY29uZmlndXJlOiBEZWxldGUgU3VuT3MgcGF0Y2ggc3VmZml4IGZyb20gaG9zdF9jYW5vbmljYWwKLQkgIGFuZCBidWlsZF9jYW5vbmljYWwgdmFyaWFibGVzIHRoYXQgYXJlIHByZXBlbmRlZCB0byBNYWtlZmlsZXMuCi0JKiBjb25maWd1cmUuaW46IEFkZCBjb21tZW50cyBmb3IgZWFzaWVyIG1haW50ZW5hbmNlLgotCi1UdWUgTWF5IDMxIDE5OjM5OjQ3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGFsbC1saWJwcm9jIHRhcmdldCBzaW1pbGFyIHRvIGFsbC1ndWkuCi0KLVR1ZSBNYXkgMzEgMTc6MTY6MzMgMTk5NCAgVG9tIExvcmQgIChsb3JkQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChDSEVDS19NT0RVTEVTKTogc3BsaXQgaW50bwotCUhPU1RfT05MWV9DSEVDS19NT0RVTEVTIGFuZCBDUk9TU19DSEVDS19NT0RVTEVTLgotCi1UdWUgTWF5IDMxIDE2OjM2OjM2IDE5OTQgIFBhdWwgRWdnZXJ0ICAoZWdnZXJ0QHR3aW5zdW4uY29tKQotCi0JKiBjb25maWcuZ3Vlc3MgKGkzODYtdW5rbm93bi1ic2RpKTogTmV3IHN5c3RlbSB0byBndWVzcy4KLQotV2VkIE1heSAyNSAxNjo0NzoxMCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBhbGwtZ3VpIHRhcmdldCAoYnV0IG5vdCB5ZXQgYnVpbGQgYnkgImFsbCIpLgotCi1UaHUgTWF5IDI2IDA4OjUzOjE5IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogTW92ZSBkZWxldGlvbiBvZiBwYXRjaCBzdWZmaXggZnJvbSBoZXJlLi4uCi0JKiBjb25maWd1cmUuaW46IFRvIGhlcmUsIGF0IElhbidzIHN1Z2dlc3Rpb24uICBUaGUgdG9wLQotCSAgbGV2ZWwgc2NyaXB0cyBtaWdodCBuZWVkIHRvIGtub3cgb2YgYSBwYXRjaCBsZXZlbC4KLQotV2VkIE1heSAyNSAwOToxNTo1NCAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IFN0cmlwIG9mZiBwYXRjaCBzdWZmaXggc28gcnRsIGlzIHJlY29nbml6ZWQKLQkgIGFzIGEgc3Vub3M0LjEuMyBtYWNoaW5lLCBldmVuIHRob3VnaCBpdCdzIGJlZW4gcGF0Y2hlZC4KLQotRnJpIE1heSAyMCAwODoyNTo0OSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9MQVNUKTogRGVsZXRlLgotCShJTlNUQUxMX0RPU1JFTCk6IE5ldy4KLQotVGh1IE1heSAxOSAxNzoxMjoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGxkIGZvciBpWzM0XTg2LSotc3lzdjQqIGFuZCBzcGFyYy0qLXNvbGFyaXMyKi4KLQlEb24ndCBzZXQgdXNlX2dudV9sZCB0byBubyBmb3IgKi0qLXN5c3Y0OyB0aGF0IG9ubHkgY29udHJvbHMKLQl3aGV0aGVyIHdlIHBhc3MgZG93biAtLXdpdGgtZ251LWxkIGFueWhvdy4KLQotVGh1IE1heSAxOSAwOToyOToxMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9MQVNUKTogQ2hhbmdlIG9wZXJhdGlvbiBzbyBpdCB3b3JrcwotCW9uIG1vcmUgZmxhdm9ycyBvZiBtYWtlLgotCSogY29uZmlndXJlLmluIChnbzMyKTogRG9uJ3QgYnVpbGQgbGliZysrIG9yIGxpYmlvLgotCi1GcmkgTWF5IDEzIDEzOjI4OjM0IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNb3ZlIEhPU1RfUFJFRklYXzEgYW5kIGZyaWVuZHMgdXAgc28KLQl0aGV5IGNhbiBiZSBvdmVycmlkZW4gYnkgdGVtcGxhdGVzLgotCi1TYXQgTWF5ICA3IDE2OjQ2OjQ0IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0PT1nbzMyKTogRG9uJ3QgYnVpbGQgZ2RiLgotCSogZG9zcmVsOiBOZXcgZGlyZWN0b3J5LgotCi1GcmkgTWF5ICA2IDE0OjE5OjI1IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdD09Z28zMik6IENvbmZpZ3VyZSBkb3NyZWwgdG9vLgotCSogTWFrZWZpbGUuaW4gKElOVEFMTF9UQVJHRVQpOiBDYWxsIElOU1RBTExfTEFTVCBsYXN0LgotCShIT1NUX0NDLCBIT1NUX1BSRUZJWCwgSE9TVF9QUkVGSVhfMSk6IFVuZGVmaW5lLCB0aGV5IHNob3VsZAotCWJlIHNldCBieSBpbmNvbWluZyBuYW1lcyBvciB0ZW1wbGF0ZXMuCi0JKElOU1RBTExfTEFTVCk6IE5ldyBydWxlLgotCSogY29uZmlnL21oLWdvMzI6IE5ldyBmcmFnbWVudC4KLQotVGh1IE1heSAgNSAxNzozNTowNSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKHNwYXJjbGl0ZWZydywgc3BhcmNsaXRlZnJ3Y29tcGF0KTogRG9uJ3Qgc2V0IHRoZSBvcy4KLQotVGh1IE1heSAgNSAyMDowNjo0NSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtbHlueHJzNms6IFJlbmFtZWQgZnJvbSBtaC1seW54b3NyczZrLCB0byBtYWtlIGl0Ci0JdW5pcXVlIGluIDguMyBuYW1pbmcgc2NoZW1lcy4KLQkqIGNvbmZpZ3VyZS5pbiAoYXBwZGlycyk6IE5ldyB2YXJpYWJsZS4gIEN1cnJlbnRseSBlbXB0eSwgYnV0IHdpbGwKLQliZSB1c2VkIGluIGdhcyBkaXN0cmlidXRpb24uICBJZiBub25lbXB0eSwgbGlzdHMgYSBzZXQgb2YKLQlkaXJlY3RvcmllcyBhdCBsZWFzdCBvbmUgb2Ygd2hpY2ggbXVzdCBnZXQgY29uZmlndXJlZCwgb3IgdG9wCi0JbGV2ZWwgY29uZmlndXJhdGlvbiBpcyBjb25zaWRlcmVkIHRvIGhhdmUgZmFpbGVkLgotCShyczYwMDAtKi1seW54b3MqKTogVXNlIG5ldyBmaWxlIG5hbWUuCi0KLVRodSBNYXkgIDUgMTM6Mzg6MzYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JRWxpbWluYXRlIFhUUkFGTEFHUy4KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogSWYgbmV3bGliIGV4aXN0cywgcmVmZXIgdG8gdGhlCi0JbmV3bGliIGluY2x1ZGUgZmlsZXMgdXNpbmcgLWlkaXJhZnRlciwgYW5kIGFsc28gdXNlIC1ub3N0ZGluYy4KLQkoQ1hYX0ZPUl9UQVJHRVQpOiBMaWtld2lzZS4KLQkoWFRSQUZMQUdTKTogUmVtb3ZlZC4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUmVtb3ZlIFhUUkFGTEFHU19GT1JfVEFSR0VULgotCShFWFRSQV9IT1NUX0ZMQUdTKTogUmVtb3ZlIFhUUkFGTEFHUy4KLQkoRVhUUkFfVEFSR0VUX0ZMQUdTLCBFWFRSQV9HQ0NfRkxBR1MpOiBMaWtld2lzZS4KLQkoJChET19YKSk6IERvbid0IHBhc3MgZG93biBYVFJBRkxBR1MuCi0KLVRodSBNYXkgIDUgMDA6MTY6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotZGVjLWJzZCopOiBOZXcgdGFyZ2V0OyBkbyBidWlsZCBsaW5rZXIuCi0JKG1pcHMqLSotYnNkKik6IE5ldyB0YXJnZXQ7IGRvbid0IGJ1aWxkIGxpbmtlci4KLQotV2VkIE1heSAgNCAyMDoxMDoxMCAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogc3VwcG9ydCByczYwMDAtKi1seW54b3MqIGNvbmZpZ3VyYXRpb24uCi0Jc3VwcG9ydCBzdW5vczQgYXMgYSBjcm9zcyB0YXJnZXQuCi0KLQkqIGNvbmZpZy5zdWI6IGxvb2sgZm9yIGx5bngqLCBub3QgbHlueCBzaW5jZSB0aGUgT1MgdmVyc2lvbiBtYXkKLQlsZWdpdGltYXRlbHkgYmUgcGFydCBvZiB0aGUgbmFtZS4KLQotVHVlIE1heSAgMyAyMTo0ODoxMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1zY28qKTogTW92ZSB0byBiZSB3aXRoIG90aGVyIGkzODYKLQl0YXJnZXRzLgotCShyb21wLSotKik6IE5ldyB0YXJnZXQuICBTa2lwIHZhcmlvdXMgYmluYXJ5IHV0aWxpdGllcy4KLQkodmF4LSotKik6IE5ldyB0YXJnZXQuICBEb24ndCBidWlsZCBuZXdsaWIuCi0JKHZheC0qLXZtcyk6IFJlbmFtZWQgZnJvbSAqLSotdm1zLiAgRG9uJ3QgYnVpbGQgb3Bjb2RlcyBvciBuZXdsaWIuCi0KLVRodSBBcHIgMjggMTU6MDM6MDUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IE9ubHkgc2V0IGhvc3RfbWFrZWZpbGVfZnJhZyBpZiBjb25maWcKLQlkaXJlY3RvcnkgZXhpc3RzLgotCi1XZWQgQXByIDI3IDEyOjE0OjMwIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogaW5zdGFsbC5zaDogSWYgJGRzdGRpciBleGlzdHMsIGRvbid0IGNoZWNrIHdoZXRoZXIgZWFjaAotCWNvbXBvbmVudCBkb2VzLgotCi1UdWUgQXByIDI2IDE4OjExOjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tayAoSE9MRVMpOiBBZGQgc2xlZXA7IHVzZWQgYnkgcmNzL3NyYy9jb25mLnNoLgotCi1Nb24gQXByIDI1IDE1OjA2OjM0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotIAkqIGNvbmZpZ3VyZS5pbiAoKi0qLWx5bnhvcyopOiBEb24ndCBjb25maWd1cmUgbmV3bGliIGZvciBlaXRoZXIKLSAJbmF0aXZlIG9yIGNyb3NzIEx5bnguCi0KLVNhdCBBcHIgMTYgMTE6NTg6MTYgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAoc3BhcmM2NC1lbGYpOiBGaXggb3MuCi0JKHo4ayk6IFJlbW92ZSBkdXBsaWNhdGUuCi0KLVRodSBBcHIgMTQgMjM6MzM6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZ2NjLW5vLWZpeGVkaW5jbHVkZXMpOiBUb3VjaCBnY2MvaW5jbHVkZS9maXhlZCwgbm90Ci0JZ2NjL3N0bXAtZml4cHJvdG8sIHRvIHRyeSB0byBwcmV2ZW50IGZpeHByb3RvIGZyb20gYmVpbmcgcnVuLgotCi1XZWQgQXByIDEzIDE1OjE0OjUyIDE5OTQgIEJpbGwgQ294ICAoYmlsbEBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IE1ha2UgZmlsZSBsaW5rcyBjbGVhbmx5IGV2ZW4gaWYgTHlueCBmYWlscyBvbgotICAgICAgICAgIGFuIE5GUyBzeW1saW5rIChhdCBsZWFzdCBmYWlsIGNsZWFubHkpLgotCi1Nb24gQXByIDExIDEwOjU4OjU2IDE5OTQgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tayAoQ0MpOiBGb3IgbWlwcy1zZ2ktaXJpeDQsIGNoYW5nZSAtWE5oMTUwMCB0bwotCS1YTmgyMDAwLgotCi1TYXQgQXByICA5IDE1OjEwOjQ1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBVbmtub3duIG9wdGlvbnMgYXJlIGZhdGFsIGFnYWluLgotCi1GcmkgQXByICA4IDEyOjAxOjQxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IElnbm9yZSAtLXgtaW5jbHVkZXMgYW5kIC0teC1saWJyYXJpZXMsIGZvciBBdXRvY29uZgotCWNvbXBhdGliaWxpdHkuIAotCi1UaHUgQXByICA3IDE3OjMxOjQzIDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGJ1aWxkLWFsbC5tazogQWRkIGBjbGVhbicgdGFyZ2V0LgotCi1XZWQgQXByICA2IDIwOjQ0OjU2IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlnLmd1ZXNzOiAgQWRkIFNJTklYIHN1cHBvcnQuCi0JKiBjb25maWd1cmUuaW46ICBBZGQgbWlwcy0qLXN5c3Y0KiBzdXBwb3J0LgotCi1Nb24gQXByICA0IDE3OjQxOjQ0IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGJ1aWxkLWFsbC5tazogRG9jdW1lbnQgYWxsIHVzZWZ1bCB0YXJnZXRzLgotCUlmIGNhbm9uaG9zdCBpcyBzcGFyYy1zdW4tc29sYXJpczIuMywgY2hhbmdlIGl0IHRvIHNwYXJjLXN1bi1zb2xhcmlzMi4KLQlJZiBjYW5vbmhvc3QgaXMgbWlwcy1zZ2ktaXJpeDQuMC41SCwgY2hhbmdlIGl0IHRvIG1pcHMtc2dpLWlyaXg0LgotCi1UaHUgTWFyIDMxIDA0OjU1OjU3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBTdXBwb3J0IC0tc2lsZW50LCAtLXF1aWV0LgotCi1XZWQgTWFyIDMwIDIxOjM3OjM4IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBTdXBwb3J0IC0tZGlzYWJsZS1GRUFUVVJFLgotCi1UdWUgTWFyIDI5IDE5OjE1OjA1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBOQ1IgcnVubmluZyBTVlI0LjMuCi0KLU1vbiBNYXIgMjggMTQ6NTU6MTUgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIE1ha2UgQlNESSBnZW5lcmF0ZSBpMzg2LXVua25vd24tYnNkMzg2LgotCVBhdGNoIGZyb20gUGF1bCBFZ2dlcnQgPGVnZ2VydEB0d2luc3VuLmNvbT4uCi0KLU1vbiBNYXIgMjggMTI6NTQ6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHBvd2VycGMtKi1haXgqKTogVHJlYXQgbGlrZSByczYwMDAtKi0qLgotCi1TYXQgTWFyIDI2IDExOjI1OjQ4IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBNYWtlIHVucmVjb2duaXplZCBvcHRpb25zIGdpdmUgbm9uZmF0YWwgd2FybmluZ3MKLQlpbnN0ZWFkIG9mIGZhdGFsIGVycm9ycywgYW5kIHBhc3MgdGhlbSB0byBhbnkgc3ViZGlyZWN0b3J5Ci0JY29uZmlndXJlcyBpbiBjYXNlIHRoZXkgcmVjb2duaXplIHRoZW0uCi0JTWFrZSAtLXggZXF1aXZhbGVudCB0byAtLXdpdGgteC4KLQotRnJpIE1hciAyNSAyMTo1MjoxMCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQWRkIC0tZW5hYmxlLSogb3B0aW9ucy4gIENsZWFuIHVwIHVzYWdlIG1lc3NhZ2UgYW5kCi0Jc29tZSBjb21tZW50cy4KLQotVGh1IE1hciAyNCAwOToxMjo1MyAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTk1fRk9SX1RBUkdFVCk6IEJ1aWxkIHRyZWUgdmVyc2lvbiBpcyBub3cgbm0ubmV3LgotCi1TdW4gTWFyIDIwIDExOjI4OjIyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSotKik6IEVuYWJsZSBiaW51dGlscy4KLQotU2F0IE1hciAxOSAxMTo1MDoxNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIGNpc2NvLgotCi1GcmkgTWFyIDE4IDE2OjQyOjMyIDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ1hYRkxBR1MpOiBBZGQgLWZleHRlcm5hbC10ZW1wbGF0ZXMuCi0KLVR1ZSBNYXIgMTUgMTE6MjU6NTUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogYWJvdXQgdGFyZ2V0ICotaGl0YWNoaS1oaXV4d2UyLCBkb24ndCBwcmludCBtb3JlCi0JdGhhbiBvbmUgY29uZmlndXJhdGlvbiBuYW1lLiAgQWRkIGNvbW1lbnQuCi0KLVN1biBNYXIgIDYgMjM6MTM6MzggMTk5NCAgSGlzYXNoaSBNSU5BTUlOTyAgKG1pbmFtaW5vQHNyYS5jby5qcCkKLQotCSogY29uZmlnLmd1ZXNzOiBhYm91dCB0YXJnZXQgKi1oaXRhY2hpLWhpdXh3ZTIsIGZpeGVkCi0JbWFjaGluZSBndWVzc2luZyBvcmRlci4gIFtIaXRhY2hpJ3MgQ1BVX0lTX0hQX01DNjhLCi0JbWFjcm8gaXMgaW5jb3JyZWN0Ll0KLQotU3VuIE1hciAxMyAwOToxMDowOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBR1MpOiBKdXN0IGJ1aWxkIFRBR1MgaW4gZWFjaCBzdWJkaXJlY3RvcnksIHJhdGhlcgotCXRoYW4gdGhlICJtYWtlIGxzIiBzdHVmZiB3aGljaCB1c2VkIHRvIGJlIGhlcmUuCi0KLUZyaSBNYXIgMTEgMTI6NTI6MzkgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBpWzM0XTg2LXVua25vd24tZnJlZWJzZC4KLQlGcm9tIFNoYXduIE0gQ2FyZXkgPHNtY2FyZXlAcm9kYW4uc3lyLmVkdT4uCi0KLVRodSBNYXIgIDMgMTQ6MjQ6MjEgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzIGZvciBhbHBoYSk6IFJlbW92ZSBsaWJnKysgYW5kIGxpYmlvLgotCi1XZWQgTWFyICAyIDEzOjI4OjQ4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IENoZWNrIGZvciBwdHguCi0KLU1vbiBGZWIgMjggMTY6NDY6NTAgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWRkIG9zOWsgY2hlY2tpbmcuCi0KLVRodSBGZWIgMjQgMDc6MDk6MDQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy5ndWVzczogSGFuZGxlIE9TRjEgcnVubmluZyBvbiBIUFBBIHByb2Nlc3NvcnMKLQotRnJpIEZlYiAxOCAxNDoxNDowMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogSWYgc3ViZGlyIGNvbmZpZ3VyZSBmYWlscywgcHJpbnQgb3V0IGEgbWVzc2FnZSB3aXRoCi0Jc3ViZGlyZWN0b3J5IG5hbWUsIGluIGNhc2Ugc3ViZGlyJ3MgY29uZmlndXJlIGNvZGUgZGlkbid0IGlkZW50aWZ5Ci0JaXRzZWxmLgotCi1GcmkgRmViIDE4IDEyOjUwOjE1IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgZW1iZWRkZWQgbmV3bGluZXMgZnJvbSBjb25maWdkaXJzLgotCUF2b2lkIG1pc21hdGNoZXMgb2Ygc3Vic3RyaW5ncy4gIEZpeCBtYXRjaGluZyBzdHJpbmdzIGF0IGVuZAotCW9mIGNvbmZpZ2RpcnMuCi0KLUZyaSBGZWIgMTEgMTU6MzM6MzMgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgQWRkIEx5bngvcnM2MDAwIGNvbmZpZyBzdXBwb3J0LgotCi1UdWUgRmViICA4IDEzOjQxOjA5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChhbHBoYS1kZWMtb3NmMSosIGFscGhhKi0qLSopOiBCdWlsZCBnYXMuCi0KLU1vbiBGZWIgIDcgMTU6NDI6MzYgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qLW9zZiopOiBUcmVhdCB0aGlzIGp1c3QgbGlrZSBtb3N0IG90aGVyCi0JUEEgY29uZmlndXJhdGlvbnMgKGVnIG5vIGJpbnV0aWxzIG9yIGxkKS4KLQkoaHBwYSotKi0qZWxmKik6IFRoZXNlIGNvbmZpZ3VyYXRpb25zIGhhdmUgYmludXRpbHMgYW5kIGxkLgotCi1TdW4gRmViICA2IDE2OjM1OjA3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcuc3ViIChoaXV4KTogRml4IHR5cG8uICBGcm9tIG0ta2FzYWhyQHNyYW1oYy5zcmEuY28uSlAuCi0KLVNhdCBGZWIgIDUgMDE6MDA6MzMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHJzNjAwMC0qLSopOiBCdWlsZCBnYXMuCi0KLVdlZCBGZWIgIDIgMTM6NTc6NTcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogIEF2b2lkIGJ1ZyBpbiBsb3NpbmcgaHB1eCBzZWQuCi0KLVdlZCBGZWIgIDIgMTQ6NTM6MDUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCB0ZXN0LWJ1aWxkLm1rOiBSZW1vdmUgTVVOQ0hfTk07IGl0IHdhcyBvbmx5IG5lZWRlZAotCWZvciBHREIgYW5kIEdEQiBoYXMgYmVlbiBmaXhlZCB0byBub3QgbmVlZCBpdC4KLQotTW9uIEphbiAzMSAxODo0MDo1NSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtbHlueG9zcnM2azogIEFjY291bnQgZm9yIGxhY2sgb2YgcmFubGliIQotCi1TdW4gSmFuIDMwIDE3OjU4OjA2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIHZheCBob3N0cy4KLQotRnJpIEphbiAyOCAxNToyOTozOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUgKHdoaWxlIGxvb3ApOiBEb24ndCB1c2UgImJyZWFrIDIiIGluc2lkZSBjYXNlCi0Jc3RhdGVtZW50IC0tIHRoZSBjYXNlIHN0YXRlbWVudCBpc24ndCBhbiBlbmNsb3NpbmcgbG9vcC4KLQotTW9uIEphbiAyNCAxODo0MDowNiAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgQ2xlYW4gdXAgTmVYVCBzdXBwb3J0LCB0byBhbGxvdyBuZXh0c3RlcAotCW9uIEludGVsIG1hY2hpbmVzLiAgTWFrZSBPUyBiZSBuZXh0c3RlcC4KLQotU3VuIEphbiAyMyAxODo0NzoyMiAxOTk0ICBSaWNoYXJkIEtlbm5lciAgKGtlbm5lckB2bHNpMS51bHRyYS5ueXUuZWR1KQotCi0JKiBjb25maWcuZ3Vlc3M6IEFkZCBhbHRlcm5hdGUgZm9ybXMgZm9yIENvbnZleC4KLQotVGh1IEphbiAyMCAxNjoxMzo0MSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6ICBDb21wbGV0ZWx5IHJld3JpdGUgb3B0aW9uIHByb2Nlc3NpbmcuICBUYWtlCi0JYWR2YW50YWdlIG9mIHBhdHRlcm4tbWF0Y2hpbmcgdG8gYXZvaWQgaW52b2tpbmcgdGVzdCBmcmVxdWVudGx5LgotCUFsc28gY2xlYW4gdXAgaG9zdCBhbmQgdGFyZ2V0IGRlZmF1bHRpbmcgbG9naWMuCi0KLU1vbiBKYW4gMTcgMTU6MDY6NTYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlcGxhY2UgYWxsIG9jY3VycmFuY2VzIG9mICJyb290bWUiIHdpdGggInIiIGFuZAotCSIkJHtyb290bWV9IiB3aXRoICIkJHIiLCB0byBpbmNyZWFzZSB0aGUgbGlrZWxpaG9vZCB0aGF0IHRoZSBkby0qCi0JY29tbWFuZHMgKHBsdXMgdXNlciBlbnZpcm9ubWVudCkgd2lsbCBmaXQgU0NPIGxpbWl0cy4KLQotVGh1IEphbiAgNiAxMToyMDo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgaXNzdWUgd2FybmluZ3MgYWJvdXQgZGlyZWN0b3JpZXMgd2hpY2ggYXJlCi0Jbm90IGJlaW5nIGNvbmZpZ3VyZWQgaWYgLW5vcmVjdXJzaW9uIGlzIHNldC4gIENvcnJlY3QgdGVzdCBmb3IKLQktLXdpdGgtZ251LWFzIGFuZCAtLXdpdGgtZ251LWxkIHRvIG5vdCBnZXQgY29uZnVzZWQgYnkgc3Vic3RyaW5nCi0JbWF0Y2hlcy4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBnYXMgZm9yIGFscGhhLWRlYy1vc2YxKi4KLQotVHVlIEphbiAgNCAxNzoxMDoxOSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6ICBCYWNrIG91dCBQZXIncyBjaGFuZ2Ugb2YgMTIvMTkvMTk5My4gIEl0IGNoYW5nZXMgdGhlCi0JYmVoYXZpb3Igb2YgY29uZmlndXJlIGluIHVuZXhwZWN0ZWQgYW5kIGNvbmZ1c2luZyB3YXlzLgotCi0JQWxzbywgdXNlIGRpZmZlcmVudCBkZWxpbSBjaGFyIHdoZW4gY2FsY3VsYXRpbmcKLQlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIHNvIHRoYXQgdGhlIG5hbWUgY2FuIGNvbnRhaW4gc2xhc2hlcy4KLQotU2F0IEphbiAgMSAxMzo0NTozMSAxOTk0ICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIFZTVGEgbWljcm8ta2VybmVsLgotCi1TYXQgRGVjIDI1IDIwOjAwOjQ3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWd1cmUuaW46IE51a2UgaGFja3Mgd2hpY2ggd2VyZSB1c2VkIHRvIGdldCBhIHNwZWNpYWwKLQl2ZXJzaW9uIG9mIEdBUyBmb3IgSFBQQSBjb25maWd1cmF0aW9ucy4KLQotU3VuIERlYyAxOSAyMDo0MDo0NCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgSWYgb25seSAke3RhcmdldF9hbGlhc30gaXMgZ2l2ZW4sIHVzZSB0aGF0Ci0JYXMgdGhlIGRlZmF1bHQgZm9yICR7aG9zdF9hbGlhc30uCi0JKiBjb25maWd1cmU6ICBBZGQgbWlzc2luZyBiYWNrLXNsYXNoZXMgYmVmb3JlIG5lc3RlZCBxdW90ZXMuCi0KLVdlZCBEZWMgMTUgMTg6MDc6MTggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogYWRkIFlBQ0M9JChCSVNPTikKLQotVHVlIERlYyAxNCAyMToyNTozMyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIHNvbWUgVGVrdHJvbml4IGNvbmZpZ3VyYXRpb25zLgotCUZyb20gS2F2ZWggUi4gR2hhemkgPGdoYXppQG5vYy5ydXRnZXJzLmVkdT4uCi0KLVNhdCBEZWMgMTEgMTE6MTg6MDAgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IE1hdGNoIGFueSBmbGF2b3Igb2YgU0guCi0KLVRodSBEZWMgIDIgMTc6MTY6NTggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEb24ndCB0cnkgdG8gY29uZmlndXJlIG5ld2xpYiBmb3IgQWxwaGEuCi0KLVRodSBEZWMgIDIgMTQ6MzU6NTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIGxkIGZvciBJcml4IDUuICBEb24ndCBidWlsZCBnYXMsCi0JbGliZysrIG9yIGxpYmlvIGZvciBhbnkgQWxwaGEgdGFyZ2V0LgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMqLXNnaS1pcml4NSopOiBOZXcgdGFyZ2V0OyB1c2UgbWgtaXJpeDUuCi0JKiBjb25maWcvbWgtaXJpeDUuIE5ldyBmaWxlIGZvciBJcml4IDUuCi0KLVdlZCBEZWMgIDEgMTc6MDA6MzMgMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChHWklQUFJPRyk6IFJlbmFtZWQgZnJvbSBHWklQLCB3aGljaCBnemlwIHVzZXMgZm9yCi0JZGVmYXVsdCBhcmd1bWVudHMgLS0gc28gaXQgdHJpZWQgdG8gY29tcHJlc3MgaXRzZWxmLgotCi1UdWUgTm92IDMwIDEzOjQ1OjE1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChub3RzdXBwKTogZW5zdXJlIHRoYXQgYSBzcGFjZSBpcyBhbHdheXMgYXQgdGhlIGVuZAotCSAgb2YgdGhlIGNvbmZpZ2RpcnMgbGlzdCwgc2luY2UgdGhlIGdyZXAgY2hlY2tzIGZvciBhbiBleHBsaWNpdCBzcGFjZQotCi1UdWUgTm92IDE2IDE1OjA0OjI3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICh0YXJnZXQgaTM4Ni1zeXN2NC4yKTogZG9uJ3QgYnVpbGQgbGQsIHNpbmNlIHN0YXRpYwotCSAgdmVyc2lvbnMgb2YgbWFueSBsaWJyYXJpZXMgYXJlIG5vdCBhdmFpbGFibGUuCi0KLVR1ZSBOb3YgMTYgMTQ6Mjg6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIEFwb2xsb3MgKHVzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcykuCi0JKiBjb25maWd1cmUuaW46IERvbid0IGNvbmZpZ3VyZSBsZCwgYmludXRpbHMsIG9yIGdwcm9mIGZvciBBcG9sbG8uCi0KLVRodSBOb3YgMTEgMTI6MDM6NTAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIFNvbnkgbmV3cyBtaXBzIHJ1bm5pbmcgbmV3c29zLgotCi1XZWQgTm92IDEwIDE2OjU3OjAwIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtY3lnbnVzLCBidWlsZC1jeWdudXMpOiAiZmkgZWxzZSIgbmVlZHMgdG8gYmUKLQkiZmkgOyBlbHNlIiBmb3IgYmFzaC4KLQotVHVlIE5vdiAgOSAxNTo1NDowMSAxOTkzICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogcGFzcyBTSEVMTC4KLQotRnJpIE5vdiAgNSAwODowNzoyNyAxOTkzICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGJsdWVzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IGFjY2VwdCB1bml4d2FyZSBhcyBhbiBhbGlhcyBmb3Igc3ZyNC4yLgotCUZpeCBzb21lIGluY29uc2lzdGFuY2llcyB3aXRoIHRoZSBnY2MgdmVyc2lvbi4KLQotRnJpIE5vdiAgNSAxNToxNDoxMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERJU1RET0NESVJTKTogIEFkZCBnZGIuCi0KLUZyaSBOb3YgIDUgMTE6NTk6NDIgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChESVNURE9DRElSUyk6ICBBZGQgbGliZysrIGFuZCBsaWJpby4KLQotRnJpIE5vdiAgNSAxMDozNTowNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRheik6IE9ubHkgYnVpbGQgImluZm8iIGluIERJU1RET0NESVJTLgotCShESVNURE9DRElSUyk6IERvbid0IGFzc3VtZSBsaWJnKysgYW5kIGdkYiBmb2xrcyBuZWNlc3NhcmlseSB3YW50Ci0JdGhpcyBub3cuCi0KLVRodSBOb3YgIDQgMTg6NTg6MjMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCBoaXV4KiBhcyBhbiBPUyBuYW1lLgotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIFJVTlRFU1RfRkxBR1MgYmFjayB0byBSVU5URVNURkxBR1MgcGVyCi0JZXRjL21ha2Utc3Rkcy50ZXhpLiAgVGhlIHVuZGVyc2NvcmUgY2FtZSBmcm9tIGdjYywgYW5kIGRqZSBub3cKLQlhZ3JlZXMgdGhhdCBSVU5URVNURkxBR1MgaXMgdGhlIGNvcnJlY3QgbmFtZS4KLQotVGh1IE5vdiAgNCAxMDo0OTowMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogaW5zdGFsbC5zaDogIFJlbW92ZSAnc2V0IC1lJy4gIEl0IG1ha2VzIGFueSBjb25kaXRpb25hbHMKLQlpbiB0aGUgc2NyaXB0IHVzZWxlc3MuCi0KLQkqIGNvbmZpZy5ndWVzczogQXV0b21hdGljYWxseSByZWNvZ25pemUgYXJtLWFjb3JuLXJpc2NpeAotCVBhdGNoIGZyb20gUmljaGFyZCBFYXJuc2hhdyAocndlMTFAY2wuY2FtLmFjLnVrKS4KLQotVGh1IE5vdiAwNCAwODowODowNCAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIFJVTlRFU1RGTEFHUyB0byBSVU5URVNUX0ZMQUdTCi0KLVdlZCBOb3YgIDMgMjI6MDk6NDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRElTVERPQ0RJUlMpOiBOZXcgdmFyaWFibGUuCi0JKHRheik6IEVkaXQgbG9jYWwgTWFrZWZpbGUuaW4gc29vbmVyLCBpbnN0ZWFkIG9mIHByb3RvLXRvcGxldgotCU1ha2VmaWxlLmluIGxhdGVyLiAgQnVpbGQgImluZm8iIGFuZCAiZHZpIiBpbiBESVNURE9DRElSUy4gIAotCi1XZWQgTm92ICAzIDIxOjMxOjUyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChocHBhIHRhcmdldCk6IGNoZWNrIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGZvciB0aGUKLQkgIHBhZ2FzIHN1Yi1kaXJlY3RvcnkKLQotV2VkIE5vdiAgMyAxMToxMjoyMiAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBBbGxvdyAtYW91dCogYW5kIC1lbGYqLgotCi1XZWQgTm92ICAzIDExOjA4OjMzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBsZCBvbiBpMzg2LXNvbGFyaXMyLCBzYW1lIGFzIGZvcgotCXNwYXJjLXNvbGFyaXMyLgotCi1UdWUgTm92ICAyIDE0OjIxOjI1IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogQWRkIHRleGluZm8vbGdwbC50ZXhpbmZvIChmb3IgbGliZysrKS4KLQotVHVlIE5vdiAgMiAxMzozODozMCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5pbjogIENvbmZpZ3VyZSBnZGIgZm9yIGFscGhhLgotCi1Nb24gTm92ICAxIDEwOjQyOjU0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ1hYRkxBR1MpOiBBZGQgLU8uCi0KLVdlZCBPY3QgMjcgMTA6NDU6MDYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IGFkZGVkIHN1cHBvcnQgZm9yIERHIEF2aWlvbgotCi1UdWUgT2N0IDI2IDE0OjM3OjM3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFByb2R1Y2Ugd2FybmluZyBtZXNzYWdlIGZvciBzdWJkaXJlY3RvcmllcyBub3QKLQljb25maWd1cmFibGUgZm9yIHRoaXMgaG9zdC90YXJnZXQgY29tYmluYXRpb24uICBEb24ndCB0cnkgdG8KLQljb25maWd1cmUgZ2RiIGZvciB2bXMuCi0KLU1vbiBPY3QgMjUgMTE6MjI6MTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBSZXBsYWNlICJieWFjYyIgd2l0aCAiYmlzb24gLXkiIGluIHRoZQotCWFwcHJvcHJpYXRlIGZpbGVzIGJlZm9yZSBtYWtpbmcgImRpc3RzdHVmZiIuCi0JKERJU1RCSVNPTkZJTEVTKTogTmV3IHZhcjogbGlzdCBvZiBmaWxlcyB0byBiZSBlZGl0ZWQuCi0JKERJU1RTVFVGRkRJUlMpOiBBZGQgYmludXRpbHMuCi0KLUZyaSBPY3QgMjIgMjA6MzI6MTUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBhbHNvIGhhbmRsZSBtaXBzZWwgYW5kIG1pcHM2NGVsIChmb3IgbGl0dGxlIGVuZGlhbiBtaXBzKQotCi1GcmkgT2N0IDIyIDA3OjU5OjIwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFkZCAqIHRvIGVuZCBvZiBhbGwgT1MgbmFtZXMuCi0KLVRodSBPY3QgMjEgMTE6Mzg6MjggMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIG5ld2xpYiBmb3IgTHlueE9TIG5hdGl2ZS4KLQotV2VkIE9jdCAyMCAwOTo1NjoxMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgc3VwcG9ydCBmb3IgZGVsdGEgODhrIHJ1bm5pbmcgU1ZSMy4KLQotCSogY29uZmlndXJlLmluOiBBZGQgY29tbWVudCBhYm91dCBIUCBjb21waWxlciB2cy4gZW1hY3MuCi0KLVR1ZSBPY3QgMTkgMTY6MDI6MjIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGRvbid0IGJ1aWxkIGxkIG9uIHNvbGFyaXMyIChub3QgYSB2aWFibGUgb3B0aW9uCi0JICBkdWUgdG8gYnVncyBpbiBnZXRwd25hbSAmIGdldHB3dWlkKQotCi1UdWUgT2N0IDE5IDE1OjEzOjU2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBY2NlcHQgYWxwaGEtZGVjLW9zZjEqLCBub3QganVzdCAtb3NmMSwgc2luY2UKLQljb25maWcuZ3Vlc3Mgd2lsbCBwcm9kdWNlIGEgZnVsbCB2ZXJzaW9uIG51bWJlci4KLQotVHVlIE9jdCAxOSAxNTo1ODowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgbGlua2VyIGFuZCBiaW51dGlscyBmb3IgYWxwaGEtZGVjLW9zZjEuCi0KLVR1ZSBPY3QgMTkgMTE6NDE6NTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgLU8gZnJvbSBDWFhGTEFHUyBmb3IgY29uc2lzdGVuY3kgd2l0aCBDRkxBR1MsCi0JYW5kIGdkYi90ZXN0c3VpdGUvTWFrZWZpbGUuaW4uCi0KLVNhdCBPY3QgIDkgMTg6Mzk6MDcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBtaXBzKi0gaW5zdGVhZCBvZiBtaXBzLQotCi1GcmkgT2N0ICA4IDE0OjE1OjM5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgbGludXgqY29mZiBhbmQgbGludXgqZWxmIGFzIG9wZXJhdGluZwotCXN5c3RlbXMuCi0KLVRodSBPY3QgIDcgMTI6NTc6MTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgbWlwczY0LCBhbmQgbWlwczMgYXMgYW4gYWxpYXMgZm9yIGl0LgotCi1XZWQgT2N0ICA2IDEzOjU0OjIxIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgYWxwaGEtZGVjLW9zZiosIG5vIGxvbmdlciBuZWNlc3Nhcnkgbm93IHRoYXQKLQlnZGIga25vd3MgaG93IHRvIGhhbmRsZSBPU0YvMSBzaGFyZWQgbGlicmFyaWVzLgotCi1UdWUgT2N0ICA1IDExOjU1OjA0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBocHBhKi0qLWhpdXgqIChjdXJyZW50bHkgc3lub255bSBmb3IgaHB1eCkuCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBIaXRhY2hpJ3MgSElVWC4KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBoMzA1MHIqIGFuZCBocHBhaGl0YWNoaS4KLQlSZW1vdmUgcmVkdW5kYW50IGNhc2VzIGZvciBocDlrWzIzXSouCi0KLU1vbiBPY3QgIDQgMTY6MTU6MDkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGRlZmF1bHQgdG8gJy0td2l0aC1nbnUtYXMnIGFuZCAnLS13aXRoLWdudS1sZCcKLQlpZiBnYXMgYW5kIGxkIGFyZSBpbiB0aGUgc291cmNlIHRyZWUgYW5kIGFyZSBpbiAke2NvbmZpZ2RpcnN9LgotCUlmICR7dXNlX2dudV9hc30gb3IgJHt1c2VfZ251X2xkfSBhcmUgJ25vJywgdGhlbiBkb24ndCBzZXQgdGhlCi0JdGhlIC0td2l0aCBvcHRpb25zIChidXQgc3RpbGwgcGFzcyB0aGVtIGRvd24gb24gdGhlIGNvbW1hbmQgbGluZSwKLQlpZiB0aGV5IHdlcmUgZXhwbGljaXRseSBzcGVjaWZpZWQpLgotCi1GcmkgU2VwIDI0IDE5OjExOjEzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBzdWJzdGl0dXRlIFNIRUxMIHZhbHVlIGluIE1ha2VmaWxlLmluIHdpdGgKLQkke0NPTkZJR19TSEVMTH0KLQotVGh1IFNlcCAyMyAxODowNToxMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgZ2FzLCBsZCwgYW5kIGJpbnV0aWxzIGZvciAqLSotc3lzdjQqIGFuZAotCSotKi1zb2xhcmlzMiogdGFyZ2V0cy4KLQotU3VuIFNlcCAxOSAxNzowMTo0MSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmUgTTQsIGFuZCBwYXNzIGl0IGRvd24gdG8gc3ViLW1ha2VzOwotCWFsbC1hdXRvY29uZiBub3cgZGVwZW5kcyBvbiBhbGwtbTQKLQotU2F0IFNlcCAxOCAwMDozODoyMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh7QVIsUkFOTElCfV9GT1JfVEFSR0VUKTogbWFrZSBjb250aW5nZW50IG9uCi0JcHJlc2VuY2Ugb2Yge2FyLHJhbmxpYn0gaW5zdGVhZCBvZiBhIGNvbmZpZ3VyZWQgZGlyZWN0b3J5Ci0KLVdlZCBTZXAgMTUgMDg6NDE6NDQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IEFjY2VwdCAzND8/IGFzIHdlbGwgYXMgMzM/PyBmb3IgTkNSLgotCi1Nb24gU2VwIDEzIDEyOjI4OjQzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBncmFiIG10LWhwcGEgZm9yIEhQUEEgdGFyZ2V0czsgdXNlICdnYXMgJyBpbnN0ZWFkCi0Jb2YgJ2dhcycgaW4gc2VkIGNvbW1hbmRzLCBzaW5jZSAnZ2FzaCcgaXMgbm93IGluIHRoZSB0cmVlIGFzIHdlbGwuCi0KLUZyaSBTZXAgMTAgMTE6MjM6NTIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGdyYWIgdmFsdWVzIGZvciAkKENDKSBhbmQgJChDWFgpIGZyb20gdGhlCi0JZW52aXJvbm1lbnQsIHNvIHRoYXQgc29tZW9uZSBjYW4gZG8gIkNDPWdjYyBjb25maWd1cmU7IG1ha2UiIGFuZAotCWhhdmUgaXQgd29yayByaWdodCAobWF0Y2hpbmcgdGhlIHdheSB0aGF0IGF1dG9jb25mIHdvcmtzIG5vdykKLQotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogYWRkIHN1cHBvcnQgZm9yIGdhc2gsIHRoZSB0Y2wKLQlpbnRlcmZhY2UgdG8gR2FsYXh5Ci0KLQkqIGNvbmZpZy5ndWVzczogYWRkIE5ldEJTRCB2YXJpYW50cyAoaHAzMDAsIHg4NikKLQotVGh1IFNlcCAgOSAxNjo0ODo1MiAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogaW5zdGFsbC5zaDogU3VwcG9ydCAtZCBvcHRpb24gKGluIHRoZSBtYW5uZXIgb2YgU3VuT1MgNCBpbnN0YWxsLAotCWFzIGl0IGlzIG1vcmUgZGV0ZXJtaW5pc3RpYyB0aGFuIHRoYXQgb2YgR05VIGluc3RhbGwpCi0JKGNobW9kY21kKTogU2V0IGZpbGUgdG8gbW9kZSA3NTUgYnkgZGVmYXVsdCAoc2hvdWxkIGFsc28gZG8gZGVmYXVsdAotCWNoZ3JwIGFuZCBjaG93biwgYnV0IEkgZG9uJ3QgZmVlbCBsaWtlIGRlYWxpbmcgd2l0aCB0aGF0IG5vdykKLQotVHVlIFNlcCAgNyAxMTo1OTozOSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBSZW1vdmUgaDgzMDBoaG1zIGFsaWFzLgotCi1UdWUgQXVnIDMxIDExOjAwOjA5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IE1hdGNoICotKi1zb2xhcmlzMiogbm90ICotc3VuLXNvbGFyaXMyKi4KLQotTW9uIEF1ZyAzMCAxODoyOToxMCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChnY2Mtbm8tZml4ZWRpbmNsdWRlcyk6IHRvdWNoIHN0bXAtZml4cHJvdG8gYXMgd2VsbAotCWFzIHN0bXAtZml4aW5jCi0KLVdlZCBBdWcgMjUgMTY6MzU6NTkgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiByZWNvZ25pemUgbTg4MTEwLWJ1Zy1jb2ZmLgotCi1UdWUgQXVnIDI0IDEwOjIzOjI0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1saWJpbyk6IGFsbCBkZXBlbmRlbmNpZXMgb24gdGhlIHRvb2xjaGFpbiB1c2VkCi0JdG8gYnVpbGQgdGhpcyAoZ2NjLCBnYXMsIGxkLCBldGMpCi0KLUZyaSBBdWcgMjAgMTc6MjQ6MjQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogRGVhbCB3aXRoIE9TRi8xIDEuMyBvbiBhbHBoYS4KLQotVGh1IEF1ZyAxOSAxMTo0MzowNCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6IGFkZCBzb21lICdlbHNlIHRydWUnIGNsYXVzZXMgZm9yIHBvcnRhYmlsaXR5Ci0KLQkqIGNvbmZpZ3VyZS5pbjogZG9uJ3QgYnVpbGQgbGliaW8gZm9yIGg4WzM1XTAwLSotKiB0YXJnZXRzCi0KLVR1ZSBBdWcgMTcgMTk6MDI6MzEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIHN1cHBvcnQgZm9yIG5ldyBsaWJpby4KLQotU3VuIEF1ZyAxNSAyMDo0ODo1NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaW5zdGFsbC5zaDogSWYgb25lIGNvbW1hbmQgZmFpbHMsIGRvbid0IHRyeSB0aGUgcmVzdC4gIERvbid0IHRyeQotCXRvIHJlbW92ZSAkZHN0dG1wICh2aWEgdHJhcCkgdW5sZXNzIHdlIGhhdmUgYWxyZWFkeSBjcmVhdGVkIGl0LgotCUlmICRzcmMgZG9lc24ndCBleGlzdCwgZGV0ZWN0IGl0IGFuZCBleGl0IHdpdGggYW4gZXJyb3IuCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIEJTRCBvbiBocDMwMC4KLQotV2VkIEF1ZyAxMSAxODozNToxMyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgTWFwICg5MDAwL1szNF0/PzpIUC1VWDoqOiopIHRvIG02OGstaHAtaHB1eC4KLQlCdWcgcmVwb3J0IGZyb20gIkhhbWlzaCAoSC5JLikgTWFjZG9uYWxkIiA8aGFtaXNoQGJuci5jYT4uCi0KLVdlZCBBdWcgMTEgMTU6Mzc6NTEgMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtc2VuZC1wcik6IGRlcGVuZHMgb24gYWxsLXBybXMKLQotV2VkIEF1ZyAxMSAxNjo1NjowMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBGaXggdHlwbyAoOTAwMC84Pz86NC4zYnNkIC0+IDkwMDAvNz8/OjQuM2JzZCkuCi0KLUZyaSBBdWcgIDYgMTQ6NDU6MDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IEZyb20gbWljaGFlbEBtZXJjdXJ5LmNzLm11bi5jYSAoTWljaGFlbCBSZW5kZWxsKToKLQlBZGRlZCB0ZXN0IGZvciBtaXBzLW1pcHMtcmlzY29zNS4KLQotVGh1IEF1ZyAgNSAxNTo0NTowOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdXNlIG1oLWhwMzAwIGZvciA2OGsgSFAgaG9zdHMKLQotTW9uIEF1ZyAgMiAxMTo1Njo1MyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogYWRkIHN1cHBvcnQgZm9yIENPTkZJR19TSEVMTCwgc28gdGhhdCB5b3UgY2FuIHVzZQotCXNvbWUgYWx0ZXJuYXRlIHNoZWxsIGZvciBldmFsdWF0aW5nIGNvbmZpZ3VyZSBzY3JpcHRzCi0KLVN1biBBdWcgIDEgMTE6MzY6MjcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChtYWtlLWdkYi50YXIuZ3opOiAgU2VkIGJ1ZyByZXBvcnRpbmcgYWRkcmVzcwotCWluIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUgd2hlbiBidWlsZGluZwotCWRpc3RyaWJ1dGlvbiBhcmNoaXZlLgotCSogTWFrZWZpbGUuaW4gKENPTVBSRVNTKTogIFJlbW92ZSBkZWYuCi0JKiBNYWtlZmlsZS5pbiAoZ2RiLnRhci5neiwgbWFrZS1nZGIudGFyLmd6KTogIFJlbmFtZWQgZnJvbQotCWdkYi50YXIuWiBhbmQgbWFrZS1nZGIudGFyLlogcmVzcGVjdGl2ZWx5LgotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5neik6ICBOb3cgb25seSBidWlsZCBnemlwJ2QgYXJjaGl2ZS4KLQkqIE1ha2VmaWxlLmluIChtYWtlLWdkYi50YXIuZ3opOiAgTWlub3IgY2hhbmdlcyB0byBtb3ZlIGNsb3NlcgotCXRvIGNvbnZlcmdlbmNlIHdpdGggJ3RheicgdGFyZ2V0IGluIE1ha2VmaWxlLmluLgotCi1GcmkgSnVsIDMwIDEyOjM0OjU3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogaW5zdGFsbC5zaCAoZHN0dG1wKTogdXNlIHRyYXAgdG8gZW5zdXJlIHRoYXQgdG1wIGZpbGVzIGdvCi0JYXdheSBvbiBlcnJvciBjb25kaXRpb25zCi0KLVdlZCBKdWwgMjggMTE6NTc6MzYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogcmVtb3ZlIExPQURMSUJFUwotCi1UdWUgSnVsIDI3IDEyOjQzOjQwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1kaXJzKTogRGVhbCB3aXRoIGEgcHJlZml4IGxpa2UgL2dudTsKLQlpdHMgcGFyZW50IGlzICcvJyBub3QgJycuCi0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBBZGQgY29tbWVudHMgYWJvdXQgQ2hhbmdlTG9nLgotCi1GcmkgSnVsIDIzIDA5OjUzOjM3IDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkB3YWhpbmkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBpZiAke25ld3NyY2Rpcn0vY29uZmlndXJlIGRvZXNuJ3QgZXhpc3QsIGRvbid0IGFzc3VtZQotCXRoYXQgJHtuZXdzcmNkaXJ9L2NvbmZpZ3VyZS5pbiBkb2VzLgotCi1UdWUgSnVsIDIwIDExOjI4OjUwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tazogc3VwcG9ydCBmb3IgQ09ORklHX1NIRUxMCi0KLU1vbiBKdWwgMTkgMjE6NTQ6NDYgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKG5ldHdhcmUpOiAgQWRkIGFzIGEgYmFzaWMgc3lzdGVtIHR5cGUuCi0KLVdlZCBKdWwgMTQgMTI6MDM6MTEgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBkZXBlbmQgb24gY29uZmlndXJlLmluLiAgQWxzbyBkcm9wIHRoZQotCSAgJChzcmNkaXIpLyBmcm9tIHRoZSBkZXBlbmRlbmN5IG9uIE1ha2VmaWxlLmluLgotCi1UdWUgSnVsIDEzIDIwOjEwOjU4IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBoODMwMGhobXMgYXMgaDgzMDBoLWhpdGFjaGktaG1zLgotCShoODMwMGhobXMgaXMgdGVtcG9yYXJ5IHVudGlsIG11bHRpLWxpYnJhcmllcyBhcmUgaW1wbGVtZW50ZWQpLgotCSogY29uZmlndXJlLmluOiBIYW5kbGUgaDgzMDBoIHRvby4KLQotU3VuIEp1bCAxMSAxNzozNToyNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgZHB4LzIgYXMgbTY4ay1idWxsLXN5c3YzLgotCi1UaHUgSnVsICA4IDE4OjI2OjEyIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6ICBSZW1vdmUgZXh0cmFuZW91cyBvdXRwdXQgd2hlbiBndWVzc2luZyBob3N0IHR5cGUuCi0JKiBjb25maWcuZ3Vlc3M6ICBSZW1vdmUgZXh0cmFuZW91cyBvdXRwdXQgd2hlbiBndWVzc2luZyB1c2luZyBDCi0JY29tcGlsZXIgcmF0aGVyIHRoYW4gdW5hbWUsIG9yIHdoZW4gZ3Vlc3NpbmcgZmFpbHMuCi0KLVdlZCBKdWwgIDcgMTc6NTg6MTQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIGFsbC5jcm9zcyBhbmQgaW5zdGFsbC5jcm9zcyB0YXJnZXRzCi0KLQkqIGNvbmZpZ3VyZTogcmVtb3ZlIENST1NTPS1EQ1JPU1NfQ09NUElMRSBhbmQgQUxMPWFsbC5jcm9zcwotCSAgZGVmaW5pdGlvbnMKLQotVHVlIEp1bCAgNiAxMDozOTo0NCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldCBzaCk6IEJ1aWxkIGdwcm9mLgotCi1UaHUgSnVsICAxIDE2OjUyOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogY2hhbmdlIC1zb2xhcmlzIHRvIC1zb2xhcmlzMgotCi1UaHUgSnVsICAxIDE1OjQ2OjE2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFVzZSBjb25maWcvbWgtcmlzY29zIGZvciBtaXBzLSotc3lzdiouCi0KLVdlZCBKdW4gMzAgMDk6MzE6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IENvcnJlY3QgZXJyb3IgbWVzc2FnZSBmb3IgbWlzc2luZyBNYWtlZmlsZS5pbiB0bwotCXByaW50IGNvcnJlY3QgZGlyZWN0b3J5LgotCi1UdWUgSnVuIDI5IDEzOjUyOjE2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogaW5zdGFsbC5zaDoga2x1ZGdlIGFyb3VuZCAzODZCU0Qgc2hlbGwgYnVnCi0KLVR1ZSBKdW4gMjkgMTM6MDY6NDkgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgTmVYVC4KLQkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBpNDg2LW5jci1zeXN2NC4KLQkqIE1ha2VmaWxlLmluICh0YXopOiAgcm0gJChUT09MKS0kJFZFUiBiZWZvcmUgbGlua2luZy4KLQotVHVlIEp1biAyOSAxMjo1MDo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNQUtFSU5GT0ZMQUdTKTogTmV3IHZhcmlhYmxlLgotCShGTEFHU19UT19QQVNTKTogUGFzcyBNQUtFSU5GTyBhcyBNQUtFSU5GTyBNQUtFSU5GT0ZMQUdTLgotCSogYnVpbGQtYWxsLm1rLCB0ZXN0LWJ1aWxkLm1rOiBQYXNzIGRvd24gLS1uby1zcGxpdCBhcwotCU1BS0VJTkZPRkxBR1Mgd2hlbiBob3N0ZWQgb24gRE9TLiAgQ29tcGlsZSBET1MgaG9zdGVkIHdpdGhvdXQgLWcuCi0KLVRodSBKdW4gMjQgMTM6Mzk6MTEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogIEFkZCBDT1BZSU5HIENPUFlJTkcuTElCIGluc3RhbGwuc2guCi0KLVdlZCBKdW4gMjMgMTI6NTk6MjEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobGliZysrLnRhci56KTogIE5ldyBydWxlLgotCSogTWFrZWZpbGUuaW4gKHRheik6ICBSZXBsYWNlICdjb25maWd1cmUgLXJtJyBieSAnbWFrZSBkaXN0Y2xlYW4nLgotCSogTWFrZWZpbGUuaW4gKHRheik6ICBPbmx5IGRvIGEgc2luZ2xlIGNobW9kLgotCi1GcmkgSnVuIDE4IDEyOjAzOjEwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBtYWppcG9vci5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLnNoOiBkb24ndCB1c2UgZGlybmFtZSBhbnltb3JlIChyZXBsYWNlZCB3aXRoIHNlZCB1c2FnZSkKLQotVGh1IEp1biAxNyAxODo0Mzo0MiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBDaGFuZ2UgZXh0ZW5zaW9uIGZvciBnemlwJ2QgZmlsZXMgZnJvbSAnLnonIHRvCi0JJy5neicgcGVyIG5ldyBGU0Ygc3RhbmRhcmQgdXNhZ2UuCi0KLVRodSBKdW4gMTcgMTY6NTg6NTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IG1hamlwb29yLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogcHV0IHF1b3RlcyBhcm91bmQgdGhlIGZpbmFsIHZhbHVlIG9mIHByb2dyYW1fdHJhbnNmb3JtX25hbWUKLQotVHVlIEp1biAxNSAxNjo0ODo1MSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBuZXcgaW5zdGFsbC5zaCBzdXBwb3J0OyB1cGRhdGUgaW5zdGFsbC1pbmZvIHJ1bGVzCi0KLVdlZCBKdW4gIDkgMTI6MzE6MzQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGRpZmYgZm9yIGNyb3NzZXMsIGJ1dCBub3QgZm9yIGdvMzIgaG9zdC4KLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBncHJvZiBvbmx5IGZvciBuYXRpdmUsIGFuZCBkb24ndCBidWlsZCBpdAotCWZvciBtaXBzLSotKiwgcnM2MDAwLSotKiwgb3IgaVszNF04Ni0qLXNjbyouCi0KLU1vbiBKdW4gIDcgMTM6MTI6MTEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZG9uJ3QgYnVpbGQgZ2FzLGxkLGJpbnV0aWxzIG9uIGZvciAqLSotc3lzdjQKLQotTW9uIEp1biAgNyAxMTo0MDoxMSAxOTkzICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF90b29scyk6IEFkZCBwcm1zLgotCi1GcmkgSnVuICA0IDEzOjMwOjQyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluc3RhbGwgZ2NjLCBkbyBpbnN0YWxsYXRpb24gb2YgJChJTlNUQUxMX01PRFVMRVMpCi0Jd2l0aCAkKEZMQUdTX1RPX1BBU1MpIG9uIHRoZSBjb21tYW5kIGxpbmUKLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIGx5bnggYW5kIGx5bnhvcwotCi1GcmkgSnVuICA0IDEwOjU5OjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0IC1lY29mZiosIG5vdCBqdXN0IC1lY29mZi4KLQotVGh1IEp1biAgMyAxNzozODo1NCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBVc2UgLmd6IHN1ZmZpeCBpbnN0ZWFkIG9mIC56LgotCShiaW51dGlscy50YXIuZ3osIGdhcytiaW51dGlscy50YXIuZ3osIGdhcy50YXIuZ3opOiBGaXhlZCB0YXJnZXQKLQluYW1lcy4KLQotVGh1IEp1biAgMyAwMDoyNzowNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh2YXVsdC1pbnN0YWxsKTogYWRkIGFuICdlbHNlIHRydWUnIChmb3IgVWx0cml4KQotCi1XZWQgSnVuICAyIDE4OjE5OjE2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtbm8tZml4ZWRpbmNsdWRlcyk6ICBpbnN0YWxsIGdjYyBsYXN0LCBzbwotCXRoYXQgcmVidWlsZHMgdGhhdCBtaWdodCBoYXBwZW4gZHVyaW5nICdtYWtlIGluc3RhbGwnIGRvbid0IGdldAotCWJvZ3VzIGdjYyBpbmNsdWRlIGZpbGVzCi0KLVdlZCBKdW4gIDIgMTY6MTQ6MTAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JQ2hhbmdlIGZyb20gVXRhaCBmb3IgSFBQQSBzdXBwb3J0OgotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgaHBwYTEueC1ocC1ic2QuCi0KLVdlZCBKdW4gIDIgMTE6NTM6MzMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBBZGQgc3VwcG9ydCBmb3IgTW90b3JvbGEgRGVsdGEgNjhrLCB1cCB0byByM3Y3LgotCVBhdGNoIGZyb20gcG90QGZseS5jbnVjZS5jbnIuaXQgKEZyYW5jZXNjbyBQb3RvcnRpYCkuCi0KLVR1ZSBKdW4gIDEgMTc6NDg6NDIgMTk5MyAgUm9iIFNhdm95ZSAgKHJvYiBhdCBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBBZGQgc3VwcG9ydCBmb3Igcm9tNjhrIGFuZCBidWcgYm9vdCBtb25pdG9ycy4KLQotTW9uIE1heSAzMSAwOTozNjozNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IE1ha2UgYWxsLW9wY29kZXMgZGVwZW5kIG9uIGFsbC1iZmQuCi0KLVRodSBNYXkgMjcgMDg6MDU6MzEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IEFkZGVkIHNwZWNpYWwgY2hlY2sgZm9yIGlbMzRdODYtdW5pdmVsLXN5c3Y0Ki4KLQotV2VkIE1heSAyNiAxNjozMzo0MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogRm9yIGlbMzRdODYtdW5rbm93bi1zeXN2NCB1c2UgVU5BTUVfTUFDSElORSBmb3IKLQl0aGUgcHJvY2Vzc29yIHJhdGhlciB0aGFuIGFzc3VtaW5nIGk0ODYuCi0KLVdlZCBNYXkgMjYgMDk6NDA6MTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIFN1bk9TNiBhcyBTb2xhcmlzMy4KLQotVHVlIE1heSAyNSAyMzowMzoxMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgRml4IHR5cG8uICBBdm9pZCAjZWxpZiAobm90IGluIEsmUiAxKS4KLQlSZWNvZ25pemUgU3VuT1MgNS4qIG9ubHkgKGFuZCBub3QgWzYtOV0uKikgYXMgYmVpbmcgU29sYXJpczIuCi0KLVR1ZSBNYXkgMjUgMTI6NDQ6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWsgKGFsbC1jcm9zcyk6IE5ldyB0YXJnZXQgZm9yIENhbmFkaWFuIENyb3NzLgotCUFkZGVkIFEyIGdvMzIgdGFyZ2V0cy4KLQkqIHRlc3QtYnVpbGQubWs6IENvbmZpZ3VyZSBnbzMyIGNyb3NzIHNwYXJjbGl0ZS1hb3V0IGFuZAotCW1pcHMtaWR0LWVjb2ZmIC13aXRoLWdudS1sZC4gIE1vdmVkIGJ1aWxkIGJpbmFyeSBkaXJlY3RvcnkgZnJvbQotCVBBUlRJQUxfSE9MRV9ESVJTIHRvIEJVSUxEX0hPTEVTX0RJUlMuCi0KLU1vbiBNYXkgMjQgMTU6MzA6MDYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGZpeCBBbHBoYSBHREIgdHlwbzsgYWxzbywgZG9uJ3QgYnVpbGQgRGVqYUdudSBmb3IKLQlHTzMyIGhvc3RlZCB0b29sY2hhaW5zCi0KLU1vbiBNYXkgMjQgMTQ6MTg6NDEgMTk5MyAgUm9iIFNhdm95ZSAgKHJvYiBhdCBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGNoYW5nZSAgc28gIi1leGVjLXByZWZpeCIgZ2V0cyBwYXNzZWQgZG93biByYXRoZXIKLQl0aGFuICItZXhlY19wcmVmaXgiIHNvIGF1dG9jb25mIGdlbmVyYXRlZCBNYWtlZmlsZXMgZ2V0IHRoZQotCWV4ZWNfcHJlZml4IHNldCByaWdodC4KLQotRnJpIE1heSAyMSAxMDo0MjoyNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogZ2V0IHRoZSBTb2xhcmlzMiBtaW5vciB2ZXJzaW9uIG51bWJlcgotCi0JKiBNYWtlZmlsZS5pbjogYWRkIHN0YW5kYXJkcy50ZXhpIGFuZCBtYWtlLXN0ZHMudGV4aSB0byBFVENfU1VQUE9SVAotCi1GcmkgTWF5IDIxIDA2OjIwOjUyIDE5OTMgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgc29tZSBTZXF1ZW50IHBsYXRmb3Jtcy4KLQotVGh1IE1heSAyMCAxNDozMzo0OCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCB0aGUgdmF1bHQtaW5zdGFsbCB0YXJnZXQKLQotCSogY29uZmlndXJlLmluOiBhY3R1YWxseSB1c2UgdGhlIFN1bjMgbWFrZWZpbGUgZnJhZ21lbnQgdGhhdCdzIGluCi0JY29uZmlnLCBhbHNvIGFkZGVkIHRoZSByZWxlYXNlIGRpciB0byBjb25maWdkaXJzCi0KLVRodSBNYXkgMjAgMTQ6MTk6MTggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogRml4IG1vZGVzIG9uIHN0dWZmIGluICQoVE9PTCkgZGlyIGFsc28uCi0KLVR1ZSBNYXkgMTggMjA6MjY6NDEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlbW92ZSBzb21lIHByb2dyYW0gZnJvbSBBbHBoYSB0YXJnZXR0ZWQgdG9vbGNoYWlucwotCi1UdWUgTWF5IDE4IDE1OjIzOjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGRElSUyk6IFJlbmFtZWQgZnJvbSBQUk9UT0RJUlMuICBBZGQgbGQgYW5kCi0JZ3Byb2YuCi0JKHRheik6IFJ1biAibWFrZSBkaXN0c3R1ZmYiIGluIHRob3NlIGRpcmVjdG9yaWVzIGluc3RlYWQgb2YgIm1ha2UKLQlwcm90by1kaXIiLiAgTG9vayBmb3IgIlZFUlNJT049IiBvbmx5IGF0IHN0YXJ0IG9mIGxpbmUgaW4gc3ViZGlyCi0JTWFrZWZpbGUuICBVc2UgImd6aXAgLTkiIGZvciBjb21wcmVzc2lvbi4KLQkoVEVYSU5GT19TVVBQT1JULCBESVNUX1NVUFBPUlQsIEJJTlVUSUxTX1NVUFBPUlRfRElSUyk6IE5ldyB2YXJzLgotCShiaW51dGlscy50YXIueik6IE5ldyB0YXJnZXQuCi0KLU1vbiBNYXkgMTcgMTc6MDE6MTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBJbmNsdWRlIGdwbC50ZXhpbmZvLgotCi1GcmkgTWF5IDE0IDA2OjQ4OjM4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc2V0dXAtZGlycyk6IE1lcmdlZCBpbnRvICJ0YXoiIHRhcmdldC4KLQkodGF6KTogT25seSBkbyBgcHJvdG8tZGlyJyBzdHVmZiBpZiBhIGRpcmVjdG9yeSBpcyBhY3R1YWxseSBuZWVkZWQKLQlmb3IgdGhpcyB0YXJnZXQuCi0KLVdlZCBNYXkgMTIgMTM6MDk6NDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTVVOQ0hfTk0pOiBOZXcgdmFyaWFibGUsIGRlZmluZWQgdG8gYmUgJChOTSkuCi0JKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gTVVOQ0hfTk0uCi0JKEhPU1RfQ0MsIEhPU1RfUFJFRklYLCBIT1NUX1BSRUZJWF8xKTogTmV3IHZhcmlhYmxlcy4KLQkoRVhUUkFfR0NDX0ZMQUdTKTogUGFzcyBkb3duIEhPU1RfKiB2YXJpYWJsZXMuCi0JKGdjYy1uby1maXhlZGluY2x1ZGVzKTogQ29ycmVjdCBmb3IgY3VycmVudCBnY2MgTWFrZWZpbGUuCi0KLVR1ZSBNYXkgMTEgMTA6MTQ6MjUgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChtYWtlLWdkYi50YXIuWik6ICBBZGQgY29uZmlndXJlLCBjb25maWcuZ3Vlc3MsCi0JY29uZmlnLnN1YiwgYW5kIG1vdmUtaWYtY2hhbmdlIHRvIGdkYiB0ZXN0c3VpdGUgZGlzdHJpYnV0aW9uCi0JYXJjaGl2ZSwgc28gdGhlIHRlc3RzdWl0ZSBjYW4gYmUgZXh0cmFjdGVkLCBjb25maWd1cmVkLCBhbmQKLQlydW4gc2VwYXJhdGVseSBmcm9tIHRoZSBnZGIgZGlzdHJpYnV0aW9uLiAgQmxvdyBhd2F5IHRoZSBDaGlsbAotCXRlc3RzIHRoYXQgcmVxdWlyZSBhIENoaWxsIGNvbXBpbGVkIGV4ZWN1dGFibGUsIHNpbmNlIEdOVSBDaGlsbAotCWlzIG5vdCB5ZXQgcHVibGljYWxseSBhdmFpbGFibGUuCi0KLU1vbiBNYXkgMTAgMTc6MjI6MjYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIGEgc2luZ2xlIGNvbW1hbmQsCi0JaW5zdGVhZCBvZiBhIGxpc3Qgb2YgYXNzaWdubWVudHMgYW5kIGV4cG9ydHMKLQotCSogY29uZmlnLmd1ZXNzOiByZWNvZ25pemUgQWxwaGEvT1NGMSBzeXN0ZW1zCi0KLU1vbiBNYXkgMTAgMTQ6NTU6NTEgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IENoYW5nZSBoZWxwIG1lc3NhZ2UgdG8gcHJlZmVyIC0tb3B0aW9ucyByYXRoZXIgdGhhbgotCSAgLW9wdGlvbnMuCi0KLU1vbiBNYXkgMTAgMDU6NTg6MzUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IENvbnZlcmdlbnQgVGVjaC4gIm1pbmlmcmFtZSIgdXNlcyBtNjgwMTAsIHNlegotCXppcHB5QGVjc3QuY3N1Y2hpY28uZWR1LgotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgbWluaWZyYW1lLgotCi1TdW4gTWF5ICA5IDE3OjQ3OjU3IDE5OTMgIFJvYiBTYXZveWUgIChyb2IgYXQgZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotICAgICAgICogTWFrZWZpbGUuaW46IFVzZSBzcmNyb290IHRvIGZpbmQgcnVudGVzdCByYXRoZXIgdGhhbiByb290bWUuCi0gICAgICAgUGFzcyBSVU5URVNURkxBR1MgYW5kIEVYUEVDVCBkb3duIGluIEJBU0VfRkxBR1NfVE9fUEFTUy4KLQotRnJpIE1heSAgNyAxNDo1NTo1OSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IEV4dGVuc2l2ZSBhZGRpdGlvbnMgdG8gc3VwcG9ydCBidWlsZGluZyBvbiBhCi0JbWFjaGluZSBvdGhlciB0aGFuIHRoZSBob3N0LgotCi1XZWQgTWF5ICA1IDA4OjM1OjA0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUgKHRvb2xkaXIpOiBGaXggZm9yIGkzODYtYWl4IGFnYWluLgotCi1Nb24gTWF5ICAzIDE5OjAwOjI3IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiAgQ2hhbmdlIGRlZmluaXRpb24gb2YgJCh0b29sZGlyKQotCXRvIG1hdGNoIHRoZSBGU0YuCi0KLUZyaSBBcHIgMzAgMTU6NTU6MjEgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBpWzM0XTg2L1NWUjQuCi0KLUZyaSBBcHIgMzAgMTU6NTI6NDYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtZ2RiKTogZ2RiIGRlcGVuZHMgb24gc2ltLgotCi1UaHUgQXByIDI5IDIzOjMwOjQ4IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZ2RiLnRhci5aKTogIE1ha2UgcHJvdG90eXBlIGdkYiB0ZXN0c3VpdGUgZGlyZWN0b3J5Ci0JYXQgdGhlIHNhbWUgdGltZSB3ZSBtYWtlIHRoZSBwcm90b3R5cGUgZ2RiIGRpcmVjdG9yeS4KLQkqIE1ha2VmaWxlLmluIChtYWtlLWdkYi50YXIuWik6ICBNYWtlIHRoZSB0ZXN0c3VpdGUgZGlzdHJpYnV0aW9uCi0JZmlsZXMgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgZ2RiIGJhc2UgcmVsZWFzZSBkaXN0cmlidXRpb24uCi0KLVRodSBBcHIgMjkgMTI6NTA6MzcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBVc2UgaW5kaXZpZHVhbCBjaGVjayB0YXJnZXRzIHJhdGhlciB0aGFuCi0JRE9fWCBydWxlLgotCShjaGVjay1nY2MpOiBBZGRlZC4KLQotVGh1IEFwciAyOSAwOTo1MDowNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogVXNlIHN5c3YzLjIgbm90IHN5c3YzMiBmb3IgY2Fub25pY2FsIE9TCi0JZm9yIFN5c3RlbSBWIHJlbGVhc2UgMy4yLgotCi1UaHUgQXByIDI5IDEwOjMzOjIyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIGhwcGFvc2YuCi0JKiBjb25maWd1cmUuaW46IERvIGNvbmZpZ3VyZSBsZC9iaW51dGlscy9nYXMgZm9yIGl0LgotCi1UdWUgQXByIDI3IDA2OjI1OjM0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUgKHRvb2xkaXIpOiBBbHRlciBzeW50YXggdXNlZCB0byBzZXQgdGhpcywgZm9yIHN5c3RlbXMKLQl3aGVyZSAiXCQiIGlzbid0IGhhbmRsZWQgcmlnaHQsIGxpa2UgaTM4Ni1haXguCi0KLVRodSBBcHIgMjIgMDg6MTc6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IFBhc3MgcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSwgbm90Ci0JcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSwgdG8gcmVjdXJzaXZlIGNvbmZpZ3VyZXMuCi0KLVRodSBBcHIgMjIgMDI6NTg6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChnYXMrYmludXRpbHMudGFyLnopOiBOZXcgcnVsZSBmb3IgYnVpbGRpbmcgc25hcHNob3RzCi0Jb2YgZ2FzK2xkK2JpbnV0aWxzLgotCi1Nb24gQXByIDE5IDE3OjQxOjMwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgQUlYMy4yIGFzIGRpc3RpbmN0IGZyb20gMy4xLgotCi1TYXQgQXByIDE3IDE3OjE5OjUwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZW5hbWUgbTg4ay1tb3Rvcm9sYS1tODhrYmNzIHRvIG04OGstbW90b3JvbGEtc3lzdgotCi0JKiBjb25maWcvbWgtZGVsdGE4ODogcmVtb3ZlIGV4dHJhbmVvdXMgR0NDIHJlZmVyZW5jZXMKLQotVHVlIEFwciAxMyAxNjo1MjoxNiAxOTkzICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChQUk1TKTogU2V0IGJhY2sgdG8gYWxsLXBybXMuCi0KLVNhdCBBcHIgMTAgMTI6MDQ6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBQYXNzIC13aXRoLWdudS1hcyBmb3Iga25vd24gTUlQUyBuYXRpdmUgYW5kIE1JUFMKLQl0YXJnZXRzLCByYXRoZXIgdGhhbiBmb3IgTUlQUyBob3N0cy4KLQotRnJpIEFwciAgOSAxMzo1MTowNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIGNvbW1lbnQgZm9yIC0td2l0aC14IGRlZmF1bHQgdmFsdWVzCi0KLQkqIGNvbmZpZy5ndWVzczogaGFuZGxlIE1vdG9yb2xhIERlbHRhODggYm94IGZvciBTVlIzIGFuZCBTVlI0LgotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGNoZWNrLSogdGFyZ2V0cyBmb3IgZWFjaCBvZiB0aGUgZGlyZWN0b3JpZXMgaW4KLQl0aGUgdHJlZS4gIEFkZCBhIGRlZmluaXRpb24gb2YgUlVOVEVTVCB0aGF0IHdpbGwgdXNlIHRoZSBvbmUgd2UKLQlqdXN0IGJ1aWx0LCBpZiBpdCBleGlzdHMuICBQYXNzIHRoaXMgZG93biB2aWEgRkxBR1NfVE9fUEFTUy4KLQotVGh1IEFwciAgOCAwOToyMTozMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlZCBvYnNvbGV0ZSByZWZlcmVuY2VzIHRvIGJmZF90YXJnZXQgYW5kCi0JdGFyZ2V0X21ha2VmaWxlX2ZyYWcuCi0KLQkqIGJ1aWxkLWFsbC5tazogU2V0IGFzc29ydGVkIHRhcmdldHMgZm9yIFEyLgotCSogY29uZmlnLnN1YjogUmVjb2duaXplIHo4ay1zaW0gYW5kIGg4MzAwLWhtcy4KLQkqIHRlc3QtYnVpbGQubWs6IFJlYWxseSBkb24ndCBwYXNzIGhvc3QgdG8gY29uZmlndXJlLgotCShIT0xFUyk6IEFkZGVkIHVuYW1lLgotCi1XZWQgQXByICA3IDE1OjQ4OjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBIYW5kbGUgYW4gZW1wdHkgcHJvZ3JhbS1wcmVmaXgsIHByb2dyYW0tc3VmZml4IG9yCi0JcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBjb3JyZWN0bHkuCi0KLVR1ZSBBcHIgIDYgMTM6NDg6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWs6IC1HIDggbm8gbG9uZ2VyIHJlcXVpcmVkIGZvciBNSVBTIHRhcmdldHMuCi0JKiB0ZXN0LWJ1aWxkLm1rOiBEb24ndCBwYXNzIGhvc3QgYXJndW1lbnQgdG8gY29uZmlndXJlOyBtYWtlIGl0Ci0JZ3Vlc3MuCi0KLVR1ZSBBcHIgIDYgMTA6MzY6NTMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChnZGIudGFyLlopOiAgRml4IGZvciBidWlsZGluZyBnemlwJ2QgZGlzdHJpYnV0aW9uLgotCSogTWFrZWZpbGUuaW4gKENPTVBSRVNTKTogIE5ldyBtYWNybywgbGlrZSBHWklQLgotCi1GcmkgQXByICAyIDA5OjAyOjMxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tazogVXNlIC13aXRoLWdudS1hcyBmb3IgbWlwcy1zZ2ktaXJpeDQgYXMgd2VsbC4KLQotCSogYnVpbGQtYWxsLm1rOiBTZXQgR0NDIHRvIGdjYyAtTyAtRyA4IGZvciBNSVBTIHRhcmdldHMsIHNpbmNlIGdjYwotCXdpdGggZ2FzIGN1cnJlbnRseSBkZWZhdWx0cyB0byAtRyAwLgotCi1UaHUgQXByICAxIDA4OjI1OjQyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1mbGV4KTogZmxleCBkZXBlbmRzIG9uIGJ5YWNjLgotCi0JKiBidWlsZC1hbGwubWs6IElmIGhvc3Qgbm90IHNwZWNpZmllZCwgdXNlIGNvbmZpZy5ndWVzcy4gIFBhc3MgVEFHCi0JdG8gdGVzdC1idWlsZC5tayBhcyBSRUxFQVNFX1RBRy4KLQkqIHRlc3QtYnVpbGQubWsgKGNvbmZpZ2FyZ3MpOiBOZXcgdmFyaWFibGUgY29udGFpbmluZyBhcmd1bWVudHMgdG8KLQlwYXNzIHRvIGNvbmZpZ3VyZS4gIFNldCB0byAtd2l0aC1nbnUtYXMgb24gbWlwcy1kZWMtdWx0cml4LgotCShGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIFJFTEVBU0VfVEFHLgotCi0JKiBjb25maWcuZ3Vlc3M6IFVzZSAvYmluL3VuYW1lIHdoZW4gY2hlY2tpbmcgLVggYXJndW1lbnQgb24gU0NPLAotCXRvIGF2b2lkIGludm9raW5nIEdOVSB1bmFtZSB3aGljaCBkb2Vzbid0IHVuZGVyc3RhbmQgLVguCi0KLQkqIHRlc3QtYnVpbGQubWs6IERvbid0IHVzZSAvdXNyL3Vuc3VwcG9ydGVkL2Jpbi9hcyBvbiBBSVguCi0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgZ2FzIGZvciBtaXBzLSotKi4KLQotV2VkIE1hciAzMSAyMToyMDo1OCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwubm9ybWFsKTogaW5zZXJ0IG1pc3NpbmcgYmFja3NsYXNoLgotCi1XZWQgTWFyIDMxIDEyOjMxOjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYnVpbGQtYWxsLm1rLCBjb25maWcvbWgtaXJpeDQ6IEJ1bXAgLVhOaCB2YWx1ZSB0byAxNTAwIHRvIG1hdGNoCi0JZ2NjIHJlcXVpcmVtZW50cy4KLQotCSogTWFrZWZpbGUuaW46IENvbXBsZXRlIG92ZXJoYXVsIHRvIG1lcmdlIG1hbnkgYWxtb3N0IGlkZW50aWNhbAotCXRhcmdldHMuCi0KLVR1ZSBNYXIgMzAgMjA6MTc6MDEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc2V0dXAtZGlycy1nZGIpOiBSZW5hbWVkIGZyb20gc2V0dXAtZGlycy4KLQkoZ2RiLnRhci5aKTogQWRqdXN0ZWQuCi0KLQkqIE1ha2VmaWxlLmluIChzZXR1cC1kaXJzLCB0YXopOiBOZXcgdGFyZ2V0czsgc2hvdWxkIGJlIGdlbmVyYWwKLQllbm91Z2ggdG8gYWRhcHQgZm9yIGdkYiBzb21ldGltZS4gIEJ1aWxkIG9ubHkgLnogZmlsZS4KLQkoZ2FzLnRhci56KTogTmV3IHRhcmdldC4KLQotVHVlIE1hciAzMCAxMDowMzowOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJ1aWxkLWFsbC5tazogVXNlIENDPWNjIC1YcyBvbiBTb2xhcmlzLgotCi1Nb24gTWFyIDI5IDE5OjU5OjI2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXN1bjM6IGNjIG5lZWRzIC1KIHRvIGNvbXBpbGUgY3AtcGFyc2UuYyBjb3JyZWN0bHkKLQotCSogY29uZmlnL21oLXNvbGFyaXM6IFN1blBSTyBDIG5lZWRzIC1YcyB0byBiZSBhYmxlIHRvIGdldCBhCi0Jd29ya2luZyB4bWFrZWZpbGUgZm9yIEVtYWNzLgotCi1UaHUgTWFyIDI1IDE1OjE0OjMwIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEluY29ycG9yYXRlIGNoYW5nZXMgc3VnZ2VzdGVkIGJ5IHdpbHNvbkBjeWdudXMuY29tCi0JZm9yIGhhbmRsaW5nIEJJU09OIGZvciBGU0YgcmVsZWFzZXMuCi0KLVRodSBNYXIgMjUgMDY6MTk6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQWN0dWFsbHkgaW1wbGVtZW50IHRoZSBjaGFuZ2Ugem9vIGp1c3QgZG9jdW1lbnRlZC4KLQotV2VkIE1hciAyNCAxMzowMjo0NCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiB3aGVuIHVzaW5nIGNvbmZpZy5ndWVzcywgb25seSBzZXQgdGFyZ2V0X2FsaWFzIHdoZW4KLQlpdCdzIG5vdCBhbHJlYWR5IGJlZW4gc2V0IChpZSwgb24gdGhlIGNvbW1hbmQgbGluZSkKLQotTW9uIE1hciAyMiAyMzowNzozOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgaW5zdGFsbGNoZWNrIHRhcmdldCwgc2V0IFBSTVMgdG8gaW5zdGFsbC1wcm1zCi0KLVN1biBNYXIgMjEgMTY6NDY6MTIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGFkZCBzdXBwb3J0IGZvciBwYWNrYWdlX21ha2VmaWxlX2ZyYWdtZW50LCBoYW5kbGUgdGhlCi0JY2FzZSB3aGVyZSBhIGRpcmVjdG9yeSBoYXMgYSBjb25maWd1cmUuaW4gZmlsZSBidXQgbm8gTWFrZWZpbGUuaW4KLQltb3JlIGdyYWNlZnVsbHkgKHdpdGggYW4gYWN0dWFsIHVuZGVyc3RhbmRhYmxlIGVycm9yIG1lc3NhZ2UsIGV2ZW4pOwotCWFkZCBzdXBwb3J0IGZvciAtLXdpdGhvdXQgKGFuZCBhZGQgdGhpcyB0byB0aGUgdXNhZ2UgbWVzc2FnZSk7IGFsc28KLQlleHBsaWNpdGx5IGFkZCBhIC0taG9zdD0ke2hvc3RfYWxpYXN9IHRvIHRoZSBjb21tYW5kIGxpbmUgd2hlbgotCWNvbmZpZy5ndWVzcyBpcyB1c2VkCi0KLVN1biBNYXIgMjEgMTI6MTE6NTggMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IE11c3QgdXNlIGJvdGggLS1ob3N0IGFuZCAtLXRhcmdldCBpbiByZWN1cnNpdmUgY2FsbHMuCi0KLVRodSBNYXIgMTggMTI6MzE6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGRlamEtZ251IHRvIGRlamFnbnUuCi0KLU1vbiBNYXIgMTUgMTU6NDQ6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGg4MzAwLSotKiwgaDg1MDAtKi0qKTogRG9uJ3QgYnVpbGQgbGliZysrLgotCi1GcmkgTWFyIDEyIDE4OjMwOjE0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBjYW5vbmljYWxpemUgYWxsIGluc3RhbmNlcyB0byAqLSotc29sYXJpczIqLAotCWFsc28gc3RyaXAgb3V0IGEgbnVtYmVyIG9mIHRvb2xzIHRvIG5vdCBidWlsZCBmb3IgZ28zMiBob3N0Ci0KLVdlZCBNYXIgMTAgMTI6MDg6MjcgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IGFkZCBHUEwuCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWcuZ3Vlc3MsIGNvbmZpZy5zdWIsIGNvbmZpZ3VyZTogYnVtcAotCSAgY29weXJpZ2h0cyB0byA5My4KLQotV2VkIE1hciAxMCAwNzoxMjo0OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkby1pbmZvKTogUmVtb3ZlZCBvYnNvbGV0ZSBjaGVjayBmb3IgZXhpc3RlbmNlIG9mCi0JbG9jYWxlbnYgZmlsZS4KLQotCSogTWFrZWZpbGUuaW4gKE1BS0VPVkVSUklERVMpOiBEZWZpbmUgdG8gYmUgZW1wdHkuCi0KLVdlZCBNYXIgMTAgMDM6MTE6NTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYSBjb3VwbGUgb2YgJ2Vsc2UgdHJ1ZScgZm9yIGRlY3N0YXRpb24sCi0Jc3VwcG9ydCBmb3IgVGNsWAotCi0JKiBjb25maWd1cmUuaW46IGNvbmZpZ3VyZSB0Y2xYIHRvbzsgZG9uJ3QgcmVtb3ZlIFRrIG9uIFJTLzYwMDAgYW55bW9yZQotCi1UdWUgTWFyICA5IDE2OjA2OjEyIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc2V0dXAtZGlycyk6IGNoYW5nZSBpbnZvY2F0aW9uIG9mIG1ha2UgdG8gJChNQUtFKS4KLQotTW9uIE1hciAgOCAxNDo1MjoxMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBpMzg2LWlibS1haXggKFBTLzIpLgotCSogY29uZmlndXJlLmluOiBVc2UgY29uZmlnL21oLWFpeDM4NiBmaWxlIGZvciBpdC4KLQotTW9uIE1hciAgOCAxMToxMjo0MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChHQ0NfRk9SX1RBUkdFVCk6IEVsaW1pbmF0ZWQgZGVmaW5pdGlvbjsgdXNlCi0JQ0NfRk9SX1RBUkdFVCBpbnN0ZWFkLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBQYXNzIEdDQ19GT1JfVEFSR0VUPSQoQ0NfRk9SX1RBUkdFVCkuCi0KLVdlZCBNYXIgIDMgMTY6MDA6MjggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAb2suY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBzaW0gdG8gbGlzdCBvZiBkaXJlY3RvcmllcyBzZW50IHdpdGggZ2RiCi0KLVdlZCBNYXIgIDMgMTE6NDI6MzkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUHV0IGJhY2sgbWlwcy1kZWMtYnNkKiBjYXNlLgotCi1UdWUgTWFyICAyIDIxOjE1OjU4IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKFVsdHJpeCAyLjIgc3VwcG9ydCBmcm9tIE1pY2hhZWwgUmVuZGVsbCA8bWljaGFlbEBtZXJjdXJ5LmNzLm11bi5jYT4pCi0JKiBjb25maWd1cmUuaW4gKHZheC0qLXVsdHJpeDIqKTogIEFkZCBVbHRyaXggMi4yIHRyaXBsZXQuCi0JKiBjb25maWcuZ3Vlc3M6ICBDaGFuZ2UgJ1ZBWCo6VUxUUklYOio6KicgdG8gJ1ZBWCo6VUxUUklYKjoqOionLgotCSogY29uZmlnL21oLXZheHVsdDI6ICBOZXcgZmlsZS4KLQotVHVlIE1hciAgMiAxODoxMTowMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIG5vLW9wIG1pcHMtZGVjLWJzZCogaW4gImNhc2UgJHRhcmdldCIKLQotCSogTWFrZWZpbGUuaW4gKGRpci5pbmZvKTogb25seSBydW4gZ2VuLWluZm8tZGlyIGlmIGl0IGV4aXN0cywKLQkoaW5zdGFsbC1pbmZvKTogaW5zdGFsbCBkaXIuaW5mbyBvbmx5IGlmIGl0IGV4aXN0cywKLQkoYWxsLWV4cGVjdCwgaW5zdGFsbC1leHBlY3QpOiBwYXNzIGFsb25nIFgxMV9GTEFHU19UT19QQVNTCi0KLVR1ZSBNYXIgIDIgMDk6MDE6MzAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRm9yIHZtcyB0YXJnZXQsIHNraXAgYmZkLCBsZCwgYmludXRpbHMuICBEbyBidWlsZAotCWdhcyBmb3IgbWlwcy1kZWMtYnNkLgotCi1UdWUgTWFyICAyIDA4OjM1OjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlIChtYWtlc3JjZGlyKTogSWYgJHtzcmNkaXJ9IGlzIHJlbGF0aXZlIGFuZCBub3QgIi4iLAotCWFuZCAke3N1YmRpcn0gaXMgbm90ICIuIiwgc2V0IG1ha2VzcmNkaXIgYmFzZWQgb24gJHtpbnZzdWJkaXJ9LgotCi1UdWUgRmViIDIzIDE0OjE4OjI4IDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgImRlamFnbnUiIHRvIGhvc3R0b29scyBsaXN0LgotCi1Nb24gRmViIDIyIDIzOjI4OjM4IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluLCBjb25maWcuZ3Vlc3M6ICBBZGQgc3VwcG9ydAotCWZvciBCb3N4LCBhbiBBSVggdmFyaWFudCBmcm9tIEJ1bGwuCi0JUGF0Y2hlcyBmcm9tIEYuUGllcnJlc3RlZ3V5QGZyY2wuYnVsbC5mci4KLQotU3VuIEZlYiAyMSAxMToxNToyMiAxOTkzICBNaWtlIFdlcm5lciAgKG10d0Bwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBkZXZvL2RlamFnbnU6IEluaXRpYWwgY3JlYXRpb24gb2YgZGV2by9kZWphZ251LgotCU1pZ3JhdGVkIGRlamFnbnUgdGVzdGNhc2VzIGFuZCBzdXBwb3J0IGZpbGVzIGZvciB0ZXN0aW5nIHNvZnR3YXJlCi0JdG9vbHMgdG8gcmVzaWRlIGFzIHN1YmRpcmVjdG9yaWVzLCBjdXJyZW50bHkgY2FsbGVkICJ0ZXN0c3VpdGUiLAotCXdpdGhpbiB0aGUgZGlyZWN0b3J5IG9mIHRoZSBzb2Z0d2FyZSB0b29sLiAgTWlncmF0ZWQgYWxsIHByb2dyYW1zLAotCXN1cHBvcnQgbGlicmFyaWVzLCBldGMuIGJlbG9naW5nIHRvIGRlamFnbnUgcHJvcGVyIGZyb20KLQlkZXZvL2RlamEtZ251IHRvIGRldm8vZGVqYWdudS4JVGhlc2UgZmlsZXMgd2VyZSBtb3ZlZCAiYXMgaXMiCi0Jd2l0aCBubyBtb2RpZmljYXRpb25zLglUaGUgY2hhbmdlcyB0byB0aGVzZSBmaWxlcyB3aGljaCB3aWxsCi0JYWxsb3cgdGhlbSB0byBjb25maWd1cmUsIGJ1aWxkLCBhbmQgZXhlY3V0ZSBwcm9wZXJseSB3aWxsIGJlIG1hZGUKLQlpbiBhIGZ1dHVyZSB1cGRhdGUuCi0KLUZyaSBGZWIgMTkgMjA6MTk6MzkgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIHNlbmRfcHIgdG8gc2VuZC1wci4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0JKiBzZW5kX3ByOiBSZW5hbWVkIGRpcmVjdG9yeSB0byBzZW5kLXByLgotCi1GcmkgRmViIDE5IDE5OjAwOjEzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBzb21lIGV4dHJhIHNlbWktY29sb25zIChuZWVkZWQgaWYgU0hFTEw9YmFzaCkuCi0KLUZyaSBGZWIgMTkgMDA6NTk6MzMgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIFJFQURNRTogIFVwZGF0ZSBmb3IgZ2RiLTQuOCByZWxlYXNlLgotCSogTWFrZWZpbGUuaW4gKGdkYi50YXIuWik6ICBBZGQgdGV4aW5mby90ZXgzcGF0Y2guICBCdWlsZAotCWdkYi14eHgudGFyLnogKGd6aXAnZCkgZmlsZSBhbHNvLgotCi1UaHUgRmViIDE4IDA5OjE2OjE3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG1ha2UgYWxsLWRpZmYgZGVwZW5kIG9uIGFsbC1saWJpYmVydHkKLQotVHVlIEZlYiAxNiAxNjowNjozMSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBhZGQgdmF4LXVsdHJpeCBpbiB0aGUgc3Bpcml0IG9mIG1pcHMtdWx0cml4LgotCi1UdWUgRmViIDE2IDA1OjU3OjE1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogYWRkIGhlbGxvLCB0YXIsIGd6aXAsIHJlY29kZSwgaW5kZW50Ci0KLVR1ZSBGZWIgMTYgMDA6NTg6MjAgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiAgUmVtb3ZlIGV0YyBkaXJlY3RvcnkKLQkoRVRDX1NVUFBPUlQpOiAgT25seSBhZGQgdGhlIGZpbGVzIEdEQiB3YW50cyBmcm9tIGV0Yy8uCi0JKGdkYi50YXIuWik6ICBVc2UgRVRDX1NVUFBPUlQuICBVc2UgYnlhY2Mgd2hlbiBidWlsZGluZyB0aGUgZmlsZS4KLQotVGh1IEZlYiAxMSAyMDoxNDoyOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgbWFrZWluZm8gYmluYXJ5IGlzIGluIGEgbmV3IGxvY2F0aW9uCi0KLVR1ZSBGZWIgIDkgMTI6NDI6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgLWVjb2ZmIGFzIGFuIE9TLgotCi0JKiBNYWtlZmlsZS5pbjogVmFyaW91cyBjaGFuZ2VzIHRvIGVsaW1pbmF0ZSBhIGxldmVsIG9mIG1ha2UKLQlyZWN1cnNpb24gYW5kIHJlZHVjZSB0aGUgcmVxdWlyZWQgY29tbWFuZCBsaW5lIGxlbmd0aC4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogTmV3IHZhcmlhYmxlIGhvbGRpbmcgZmxhZ3MgcGFzc2VkIHRvIGFsbAotCXN1Yi1tYWtlcy4KLQkoRVhUUkFfSE9TVF9GTEFHUywgRVhUUkFfVEFSR0VUX0ZMQUdTLCBFWFRSQV9HQ0NfRkxBR1MpOiBOZXcKLQl2YXJpYWJsZXMgaG9sZGluZyBzZXR0aW5ncyBmb3Igc3BlY2lmaWMgc3ViLW1ha2VzLgotCShGTEFHU19UT19QQVNTLCBUQVJHRVRfRkxBR1NfVE9fUEFTUywgR0NDX0ZMQUdTX1RPX1BBU1MpOiBSZXdyb3RlCi0JaW4gdGVybXMgb2YgQkFTRV9GTEFHU19UT19QQVNTLgotCShUQVJHRVRfTElCUyk6IE5ldyB2YXJpYWJsZSBsaXN0aW5nIGRpcmVjdG9yaWVzIHdoaWNoIHVzZQotCVRBUkdFVF9GTEFHU19UT19QQVNTLgotCShzdWJkaXJfZG8pOiBFbGltaW5hdGVkLgotCShkby0qKTogTmV3IHNldCBvZiB0YXJnZXRzIHRvIHJlcGxhY2Ugc3ViZGlyX2RvLgotCSh2YXJpb3VzKTogQWxsIHRhcmdldHMgd2hpY2ggdXNlZCBzdWJkaXJfZG8gbm93IGRlcGVuZCBvbiBkby0qLgotCShsb2NhbC1jbGVhbik6IFJlbmFtZWQgZnJvbSBkb19jbGVhbi4KLQkobG9jYWwtZGlzdGNsZWFuKTogTmV3IHRhcmdldCwgZGVwZW5kZW5jeSBvZiBkaXN0Y2xlYW4gYW5kCi0JcmVhbGNsZWFuLgotCShpbnN0YWxsLWluZm8pOiBEb24ndCBjcmVhdGUgZGlyZWN0b3JpZXMuICBEZXBlbmQgb24gZGlyLmluZm8KLQlyYXRoZXIgdGhhbiBjYWxsaW5nIG1ha2UgcmVjdXJzaXZlbHkuCi0JKGluc3RhbGwtZGlyLmluZm8pOiBFbGltaW5hdGVkLgotCShpbnN0YWxsLWluZm8tZGlycyk6IENyZWF0ZSBhbGwgaW5mbyBkaXJlY3RvcmllcyBoZXJlLgotCShkaXIuaW5mbyk6IERlcGVuZCB1cG9uIGRvLWluc3RhbGwtaW5mby4KLQotCSogdGVzdC1idWlsZC5tayAoSE9MRVMpOiBBZGRlZCBmYWxzZS4KLQotU2F0IEZlYiAgNiAxNDowNTowOSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBCU0RJIGFuZCBCU0RKIChKb2xpdHogMzg2YnNkKS4KLQotVGh1IEZlYiAgNCAyMDo0OToxOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbmZvKTogcmVtb3ZlIGRlcGVuZGVuY3kgb24gYWxsLXRleGluZm8uICBUaGUKLQlwcm9ibGVtIHdhcyByZWFsbHkgaW4gdGV4aW5mby9DLCBub3QgYXQgdGhpcyBsZXZlbC4KLQotVGh1IEZlYiAgNCAxMzozODo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbmZvKTogQWRkZWQgZGVwZW5kZW5jeSBvbiBhbGwtdGV4aW5mbyAoUFIgMjExMikuCi0KLVRodSBGZWIgIDQgMDE6NTA6NTMgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChtYWtlLWdkYi50YXIuWik6ICBDaGFuZ2UgQklTT04gdG8gJ2Jpc29uIC15JyBmb3IKLQlHREIgcmVsZWFzZXMuCi0KLVdlZCBGZWIgIDMgMTc6MjI6MTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IEluY2x1ZGUgc3JjZGlyIGluIG1lc3NhZ2UgYWJvdXQgdGFyZ2V0IG9mIGxpbmsgbm90Ci0JYmVpbmcgZm91bmQuICBEb24ndCBjb252ZXJ0IGAtJyB0byBgXycgaW4gYHdpdGgnIG9wdGlvbnMgYmVpbmcKLQlwYXNzZWQgdG8gc3ViZGlycy4KLQotVHVlIEZlYiAgMiAxODo1Nzo1OSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIHV1ZGVjb2RlIHRvIGhvc3RfdG9vbHMKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHthbGwsaW5zdGFsbH0tdXVkZWNvZGUgdGFyZ2V0cywgYWRkZWQgdGhlbSB0bwotCXRoZSBhcHByb3ByaWF0ZSBsaXN0cwotCi1UdWUgRmViICAyIDExOjQ1OjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nY2MpOiBBZGRlZCBkZXBlbmRlbmN5IG9uIGFsbC1nYXMuCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLSopOiBCdWlsZCBsZCBhbmQgYmludXRpbHMuCi0KLU1vbiBGZWIgIDEgMTI6MzU6NDEgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGNoZWNrIHJldHVybiBjb2RlIGZyb20gbWtkaXIsIHByaW50IGVycm9yIG1lc3NhZ2UgYW5kCi0JICBleGl0IG9uIGZhaWx1cmUuCi0KLVNhdCBKYW4gMzAgMTY6NDA6MjggMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChtYWtlLWdkYi50YXIuWik6ICBOZXcgbG9jYXRpb24gZm9yIHRleGluZm8udGV4LgotCi1UaHUgSmFuIDI4IDE1OjA5OjU5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tayAoSE9MRVMpOiBBZGRlZCB0YXIsIGNwaW8gYW5kIHV1ZGVjb2RlLgotCi1XZWQgSmFuIDI3IDE2OjUwOjMyIDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAoaDg1MDApOiAgUmVjb2duaXplIHRoaXMgYXMgYSBjcHUgdHlwZS4KLQotU2F0IEphbiAyMyAyMDozMjowMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogc291cmNlIGRpcmVjdG9yeSBtaXNzaW5nIGlzIG5vIGxvbmdlciBhIHdhcm5pbmcKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgaXJpeFszNF0qIGluc3RlYWQgb2YgaXJpeFszNF0KLQotCSogTWFrZWZpbGUuaW46IGRlZmluZSBhbmQgcGFzcyBkb3duIFgxMV9MSUIKLQotCSogY29uZmlnL21oLXNjbzogZGVmaW5lIFgxMV9MSUIgdG8gdGhlIG1lc3MgdGhhdCBTQ08gT0RUIHJlcXVpcmVzCi0KLVNhdCBKYW4gMjMgMTM6NDk6NDAgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGd1ZXNzLXN5c3R5cGU6IFJlbmFtZWQgdG8gLi4uCi0JKiBjb25maWcuZ3Vlc3M6ICAuLi4gYnkgcG9wdWxhciByZXF1ZXN0LgotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogIFVwZGF0ZSBhY2NvcmRpbmdseS4KLQotVGh1IEphbiAyMSAxMjoyMDo1NSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogZ3Vlc3Mtc3lzdHlwZTogIFBhdGNoZXMgZnJvbSBKb2huIEVhdG9uIDxqd2VAY2hlLnV0ZXhhcy5lZHU+OgotCSsgQWRkIENvbnZleCwgQ3JheS9Vbmljb3MsIGFuZCBFbmNvcmUvTXVsdGltYXggc3VwcG9ydC4KLQkrIEV4ZWN1dGUgLi9kdW1teSBpbnN0ZWFkIG9mIGFzc3VtaW5nIC4gaXMgaW4gUEFUSC4KLQotVHVlIEphbiAxOSAxNzoxODowNiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogZ3Vlc3Mtc3lzdHlwZTogIE5ldyBzaGVsbCBzY3JpcHQuICBBdHRlbXB0cyB0byBndWVzcyB0aGUKLQljYW5vbmljYWwgaG9zdCBuYW1lIG9mIHRoZSBleGVjdXRpbmcgaG9zdC4KLQlPbmx5IGEgZmV3IGhvc3RzIGFyZSBzdXBwb3J0ZWQgc28gZmFyLgotCSogY29uZmlndXJlOiAgQ2FsbCBndWVzcy1zeXN0eXBlIGlmIG5vIGhvc3QgaXMgc3BlY2lmaWVkLgotCi1UdWUgSmFuIDE5IDA4OjI2OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGdjYy1uby1maXhlZGluY2x1ZGVzKTogTWFkZSB0byB3b3JrIHdpdGggY3VycmVudAotCWdjYyBNYWtlZmlsZS4KLQotCi1GcmkgSmFuIDE1IDEwOjI3OjAyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEdDQ19GTEFHU19UT19QQVNTKTogTmV3IHZhcmlhYmxlLgotCShhbGwtZ2NjLCBpbnN0YWxsLWdjYywgc3ViZGlyX2RvKTogVXNlIGl0LgotCi1XZWQgSmFuIDEzIDE3OjA2OjQ1IDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlbmFtZSB1bmluc3RhbGxlZCBnY2MgZHJpdmVyIGZyb20gZ2NjIHRvIHhnY2MuCi0KLVdlZCBKYW4gIDYgMjA6Mjk6MTYgMTk5MyAgTWlrZSBXZXJuZXIgIChtdHdAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmVkIGV4cGxpY2l0IHNldHRpbmcgb2YgU1VCRElSUy4gU1VCRElSUyBpcyBub3cKLQkgIHNldCBleGNsdXNpdmVseSBieSBjb25maWd1cmUsIHVzaW5nIGNvbmZpZ3VyZS5pbiAuCi0KLVdlZCBKYW4gIDYgMTM6NDQ6MTEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBzZXQgJFBBVEggZm9yIGFsbCBidWlsZHMKLQotCSogTWFrZWZpbGUuaW46IHBhc3MgVEFSR0VUX0ZMQUdTX1RPX1BBU1MgZm9yIHhpYmVydHkgYW5kIGxpYm0KLQotV2VkIEphbiAgNiAxMTowMjoxMCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEdDQ19GT1JfVEFSR0VUKTogIFN1cHBseSBhIGRlZmF1bHQgdGhhdCBtYXRjaGVzCi0JdGhlIG9uZSB1c2VkIGluIGdjYy9NYWtlZmlsZS5pbiwgc28gdGhhdCBhIG51bGwgZXhwYW5zaW9uIGRvZXNuJ3QKLQlvdmVycmlkZSB0aGUgb25lIG5lZWRlZCB0byBidWlsZCBnY2Mgd2l0aCBhIG5hdGl2ZSBjYy4KLQotCi1UdWUgSmFuICA1IDA3OjU1OjEyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBBY2NlcHQgLXdpdGggYXJndW1lbnRzLgotCi1TdW4gSmFuICAzIDE1OjE1OjA5IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgaDgzMDBzaW0KLQotVHVlIERlYyAyOSAxNTowNjowMCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zY286IERvbid0IG92ZXJyaWRlIEJJU09OIGRlZmluaXRpb24uCi0KLQkqIGJ1aWxkLWFsbC5tazogSWYgY2Fub25ob3N0IGlzIGkzODYtdW5rbm93bi1zY28zLjJ2NCwgY2hhbmdlIGl0Ci0JdG8gaTM4Ni1zY28zLjJ2NC4gIFNldCBUQVJHRVRTIGFuZCBDRkxBR1MgZm9yIGkzODYtc2NvMy4ydjQuCi0JKGFsbC1jeWdudXMsIG5hdGl2ZSwgYnVpbGQtY3lnbnVzKTogTWFrZQotCSQoY2Fub25ob3N0KS1zdGFtcC0zc3RhZ2UtZG9uZSwgbm90ICQoaG9zdCkuLi4uCi0JKiB0ZXN0LWJ1aWxkLm1rIChzdGFtcC0zc3RhZ2UtY29tcGFyZWQpOiBVc2UgdGFpbCArMTBjIGZvcgotCWkzODYtc2NvMy4ydjQuICBBZGRlZCBlbHNlIHRydWUgdG8gaWYgY29tbWFuZC4KLQotTW9uIERlYyAyOCAxMjowODo1NiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogKGZyb20gRlNGKSBTZXF1ZW50IHVzZXMgYSBCU0QtbGlrZSBPUy4KLQotTW9uIERlYyAyOCAwODozMjowNiAxOTkyICBNaW5oIFRyYW4tTGUgIChtdHJhbmxlQHBhcmlzLmludGVsbGljb3JwLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotaXNjKik6IGFkZGVkOyB1c2VzIG1oLXN5c3YuCi0KLVRodSBEZWMgMjQgMTc6MjY6MjQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGRvbid0IHJlbW92ZSBiaW51dGlscyBmcm9tIFNvbGFyaXMgYnVpbGRzCi0KLVRodSBEZWMgMjQgMTQ6MDg6MzggMTk5MiBkYXZpZCBkYHpvbycgenVobiAgKHpvb0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZ2V0IHJpZCBvZiBlYXJsaWVyIGRlZmluaXRpb25zIGZvciAqY2xlYW4sCi0JYWxzbyBoYW5kbGUgdGhlIHJlY3Vyc2l2ZSBpbmZvIHJ1bGUgYmV0dGVyCi0KLVRodSBEZWMgMjQgMTI6NDA6MjEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4sIGRpc3RjbGVhbiwgcmVhbGNsZWFuKTogIEZpeCB0bwotCWRvIG1vcmUtb3ItbGVzcyB0aGUgcmlnaHQgdGhpbmcuCi0KLVdlZCBEZWMgMTYgMTA6MjU6MzEgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGxpbmVzIGRlZmluaW5nIENDIGFuZCBDWFgsIGFuZCB1c2UgQ1hYIHJhdGhlcgotCXRoYW4gZ2NjIGluIGRlZmluaXRpb25zIG9mIENYWF9GT1JfQlVJTEQgYW5kIENYWF9GT1JfVEFSR0VULgotCi1UdWUgRGVjIDE1IDAwOjM0OjMyIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNoYW5nZSBhbGwgJChob3N0X2NwdSktJChob3N0X3ZlbmRvciktJChob3N0X29zKSB0bwotCSQoaG9zdF9jYW5vbmljYWwpLgotCi0JKiBjb25maWd1cmUuaW46IHNwbGl0IHRoZSBjb25maWdkaXJzIGxpc3QgaW50byA0IGNhdGVnb3JpZXMgKG5hdGl2ZQotCXYuIGNyb3NzLCBsaWJyYXJ5IHYuIHRvb2wpIGFuZCBoYW5kbGUgdGhlIGNyb3NzLW9ubHkgYW5kIG5hdGl2ZS0KLQlvbmx5IGluIG1vcmUgcmVhc29uYWJsZSAoYW5kIGNvcnJlY3QhKSB3YXkuCi0KLU1vbiBEZWMgMTQgMTc6MDQ6MjIgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qLSopOiAgRG9uJ3QgcmVtb3ZlIGJmZCBhbmQgZ2RiIGZyb20KLQljb25maWdkaXJzIGFueW1vcmUuCi0KLVN1biBEZWMgMTMgMDA6Mzc6MjYgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZXh0ZW5zaXZlIGNsZWFudXA6OiAgcmVtb3ZlZCBhbGwgb2YgdGhlIGV4cGxpY2l0Ci0JY2xlYW4tKiB0YXJnZXRzLCBjb2xsYXBzZWQgbWFueSB3cmFwcGVycyBhcm91bmQgc3ViZGlyX2RvIGludG8KLQlvbmUsIGFkZGVkIGFkZGl0aW9uYWwgdGFyZ2V0cyB0byBzYXRpc2Z5IHN0YW5kYXJkcy50ZXhpLCBkZWxldGVkCi0Jc29tZSBvbGQgdGFyZ2V0cywgc29tZSBjaGFuZ2VzIGZvciBjb25zaXN0ZW5jeQotCi1GcmkgRGVjIDExIDIwOjE4OjAyIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBoYW5kbGUgc29tZSBwcm9ncmFtcyBhcyBjcm9zcy1vbmx5LCBhbmQgb3RoZXJzIGFzCi0JbmF0aXZlIG9ubHkKLQotCSogdGVzdC1idWlsZC5tazogaGFuZGxlIHBhcnRpYWwgaG9sZXMgaW4gYSBtb3JlIGdlbmVyaWMgbWFubmVyCi0KLQkqIE1ha2VmaWxlLmluOiBtNCBkZXBlbmRzIG9uIGxpYmliZXJ0eQotCi1Nb24gRGVjICA3IDA2OjQzOjI3IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXNjbzogZG9uJ3QgZGVmYXVsdCAkKENDKSB0byBnY2MKLQotVGh1IERlYyAgMyAyMTo1MjoxMSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIG00LCB0ZXh0dXRpbHMsIGZpbGV1dGlscywgc2VkLCBzaGVsbHV0aWxzLAotCXRpbWUsIHdkaWZmLCBhbmQgZmluZCB0byBjb25maWdkaXJzCi0KLQkqIE1ha2VmaWxlLmluOiBhbGwsIGNsZWFuLCBhbmQgaW5zdGFsbCBydWxlcyBmb3IgdGhlIG5ldyBwcm9ncmFtcwotCWFkZGVkIHRvIGNvbmZpZ3VyZS5pbgotCi1Nb24gTm92IDMwIDE0OjU0OjM0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgbWgtc3VuIGZvciBhbGwgKi1zdW4tKiBob3N0cwotCi0JKiBjb25maWcvbWgtc29sYXJpczogcmV3b3JrIHN0YW5kYXJkIFggbG9jYXRpb24gdG8gdXNlCi0JJE9QRU5XSU5IT01FLCBpZiBkZWZpbmVkLgotCi0JKiBjb25maWcvbWgtc3VuOiBoYW5kbGUgWDExIGluY2x1ZGUgbG9jYXRpb25zCi0KLQkqIGNvbmZpZy9taC1kZWNzdGF0aW9uOiBkZWZpbmUgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcyB0byAwLCB0bwotCXdvcmsgYXJvdW5kIGRhaW4tYnJhbWFnZWQgREVDd2luZG93cyBpbmNsdWRlIGZpbGVzCi0KLUZyaSBOb3YgMjcgMTg6MzU6NTQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZGVmaW5lIGZsYWdzIGZvciBYMTEgaW5jbHVkZSBmaWxlcyBhbmQgbGlicmFyeSBmaWxlCi0JbG9jYXRpb25zLCBwYXNzIHRoZW0gZG93biB0byB0aGUgcHJvZ3JhbXMgdGhhdCBuZWVkIHRoaXMgaW5mbwotCi0JKiBidWlsZC1hbGwubWs6IGFkZGVkIGEgJ25hdGl2ZScgdGFyZ2V0LCB0byAzc3RhZ2UgdGhlIG5hdGl2ZSB0b29sY2hhaW4KLQotCSogY29uZmlnL3ttaC1ocHV4LG1oLXNvbGFyaXN9OiBkZWZpbmUgdGhlICJzdGFuZGFyZCIgbG9jYXRpb25zIGZvcgotCXRoZSB2ZW5kb3Igc3VwcGxpZWQgWDExIGhlYWRlcnMgYW5kIGxpYnJhcmllcwotCi1TdW4gTm92IDIyIDE4OjU5OjEzIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBzdGFydCBidWlsZGluZyBsaWJnKysgZm9yIEhQLVVYIHRhcmdldHMKLQotV2VkIE5vdiAxOCAxOTozMzoxMSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogUkVBRE1FOiAgVXBkYXRlIHJlZmVyZW5jZXMgdG8gZmlsZXMgbW92ZWQgaW50byBldGMvLgotCi1TdW4gTm92IDE1IDA5OjM2OjA4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChpMzg2c29sMiwgaTQ4NnNvbDIpOiAgaVszNF04Ni11bmtub3duLXNvbGFyaXMyLgotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotc29sYXJpczIqKTogIFVzZSBjb25maWcvbWgtc3lzdjQuCi0KLVRodSBOb3YgMTIgMDg6NTA6NDIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGFjY2VwdCBkYXNoIGFzIHdlbGwgYXMgdW5kZXJzY29yZSBpbiBsb25nIG9wdGlvbgotCW5hbWVzIGZvciBGU0YgY29tcGF0aWJpbGl0eS4KLQotV2VkIE5vdiAxMSAwODowNDozNyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IGFkZGVkIC1zY28zLjJ2NCBzdXBwb3J0IGZyb20gRlNGLgotCi1TdW4gTm92ICA4IDIxOjE0OjMwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBleHBhbmQgdGhlIHNlY3Rpb24gdGhhdCBhZGRzIG9yIHJlbW92ZXMKLQlkaXJlY3RvcmllcyBmcm9tIHRoZSBsaXN0IG9mIHByb2dyYW1zIHRvIGJ1aWxkLCB0byBoYW5kbGUgbmF0aXZlCi0JdnMuIGNyb3NzIGluIGFkZGl0aW9uIHRvIGhvc3Qgdi4gbmF0aXZlCi0KLVNhdCBOb3YgIDcgMTg6NTI6MjcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFJlcGxhY2UgQysrIGluIG1hY3JvIG5hbWVzIHdpdGggQ1hYLgotCVRoaXMgaXMgbGVzcyBsaWtlbHkgdG8gYnJlYWsgLi4uCi0KLVNhdCBOb3YgIDcgMTU6MTY6NTggMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBhZGQgLXcgdG8gR05VX01BS0UKLQotRnJpIE5vdiAgNiAyMzoxMDozNyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IHJlbW92ZSAnc3BhcmMnLS0+J3NwYXJjLXN1bicgZGVmYXVsdCB0cmFuc2Zvcm1hdGlvbiwKLQlhZGQgJ3NwYXJjJyB0byBsaXN0IG9mIHJlY29nbml6ZWQgY3B1cy4gIFRoaXMgbmVlZGVkIHRvIG1ha2UKLQknc3BhcmMtYW91dCcgZXhwYW5kIHRvICdzcGFyYy11bmtub3duLWFvdXQnIGluc3RlYWQgb2YgJ3NwYXJjLXN1bi1hb3V0Jy4KLQlEZWxldGUgc29tZSByZWR1bmRhbnQgb3NlNjggdmFyaWFudHMuICBSZWNvZ25pemUgLXdycyBhcyBhbiBvcywKLQl0aGVuIGNoYW5nZXMgdGhhdCBpbnRvICRDUFUtd3JzLXZ4d29ya3MuCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIG1vc3QgcmVmZXJlbmNlcyB0byBnZGJ0ZXN0LCByZWd1bGFyaXplCi0JdGFyZ2V0IGJhc2VkIHByb2dyYW0gcmVtb3ZhbAotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBpbXBvcnQgZnJvbSBwMyB0cmVlIChtYW55IGZpeGVzIGFuZCBjaGFuZ2VzKQotCi1GcmkgTm92ICA2IDIwOjU5OjAwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgcnVsZXMgdG8gaGFuZGxlIHRjbCwgdGssIGFuZCBleHBlY3QKLQotCSogY29uZmlndXJlLmluOiBoYW5kbGUgdGhvc2UgZGlyZWN0b3JpZXMgaWYgdGhleSBleGlzdAotCi1UaHUgTm92ICA1IDE0OjM1OjQxIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogcmVtb3ZlZCBib2d1cyBocHBhYnNkIGFuZCBocHBhaHB1eCBuYW1lcywgc2luY2UKLQkiaHBwYSIgaXMgbm90IGEgdmFsaWQgY3B1IChocHBhMS4xIG9yIGhwcGExLjAgYXJlLCB0aG91Z2gpCi0KLVRodSBPY3QgMjkgMDA6MTI6NDEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWxsLWdjYyBub3cgZGVwZW5kcyBvbiBhbGwtYmludXRpbHMuICBhbGwtbGliZysrCi0JZGVwZW5kcyB1cG9uIGFsbC14aWJlcnR5Ci0KLQkqIE1ha2VmaWxlLmluOiBjaGFuZ2VzIGZyb20gcDMsIGluY2x1ZGluZzoKLQotCVRodSBPY3QgIDggMTU6MDA6MTcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoWFRSQUZMQUdTKTogaW5jbHVkZSBuZXdsaWIgZGlyZWN0b3JpZXMgaWYKLQluZXdsaWIvTWFrZWZpbGUgZXhpc3RzLCByYXRoZXIgdGhhbiBpZiBob3N0ICE9IHRhcmdldC4KLQotCUZyaSBTZXAgMjUgMTM6NDE6NTIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgLW5vc3RkaW5jIHRvIFhUUkFGTEFHUyBpZiB3ZSBhcmUgdXNpbmcgZ2NjCi0JZnJvbSB0aGUgc2FtZSBzb3VyY2UgdHJlZSBhbmQgbm90IGJ1aWxkaW5nIGEgY3Jvc3MtY29tcGlsZXIuICBUaGlzCi0JbWF0dGVycyBmb3IgdGhlIGxpYmcrKyBjb25maWd1cmF0aW9uIGlmIHJlY29uZmlndXJpbmcgYSB0cmVlIHRoYXQKLQloYXMgYWxyZWFkeSBiZWVuIGluc3RhbGxlZC4KLQotCVRodSBTZXAgMTAgMTA6MzU6NTEgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgLUkgZm9yIG5ld2xpYi90YXJnLWluY2x1ZGUgdG8gWFRSQUZMQUdTLCB0bwotCXBpY2sgdXAgdGhlIG1hY2hpbmUgYW5kIHN5c3RlbSBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBBU19GT1JfVEFSR0VULCBwYXNzZWQgZG93biBpbgotCVRBUkdFVF9GTEFHU19UT19QQVNTLiAgQWRkZWQgQ0NfRk9SX0JVSUxELCB3aGljaCBpcyBpbnRlbmRlZCB0byBiZQotCXRoZSBDIGNvbXBpbGVyIHRvIHVzZSB0byBjcmVhdGUgcHJvZ3JhbXMgd2hpY2ggYXJlIHJ1biBpbiB0aGUKLQlidWlsZCBlbnZpcm9ubWVudCwgc2V0IGl0IHRvIGRlZmF1bHQgdG8gJChDQyksIGFuZCBwYXNzZWQgaXQgZG93bgotCWluIEZMQUdTX1RPX1BBU1MgYW5kIFRBUkdFVF9GTEFHU19UT19QQVNTLgotCi0JTW9uIFNlcCAgNyAyMjozNDo0MiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkICQoaG9zdCkgPSAkKHRhcmdldCkgdGVzdHMgYmFjayB0byAqX0ZPUl9UQVJHRVQuCi0JV2UgbmVlZCB0aGVtIGZvciB1bnVzdWFsIG5hdGl2ZSBidWlsZHMsIGxpa2Ugc3lzdGVtcyB3aXRob3V0Ci0JcmFubGliLgotCi0JKiBjb25maWd1cmU6IGFsc28gZGVmaW5lICQoaG9zdF9jYW5vbmljYWwpIGFuZAotICAgICAgICAkKHRhcmdldF9jYW5vbmljYWwpLCB3aGljaCBhcmUgdGhlIGZ1bGwsIGNhbm9uaWNhbCBuYW1lcyBmb3IgdGhlCi0gICAgICAgIGdpdmVuIGhvc3QgYW5kIHRhcmdldAotCi1TdW4gTm92ICAxIDE2OjM4OjE3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZGVkIHNlcGFyYXRlIGRlZmluaXRpb25zIGZvciBDKysuCi0KLUZyaSBPY3QgMzAgMTE6Mzc6NTIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoY29uZmlnZGlycyk6ICBBZGQgZGVqYS1nbnUuCi0KLUZyaSBPY3QgMjMgMDA6Mzk6MTggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIFJFQURNRTogIFVwZGF0ZSBmb3IgY29uZmlndXJlLnRleGkgYW5kIGdkYi00LjcgcmVsZWFzZS4KLQotV2VkIE9jdCAyMSAyMTo1NDoyNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBNb3ZlICJhbGwiIHRhcmdldCB0byB0b3Agb2YgZmlsZS4KLQlQcmV2aW91c2x5LCBmaXJzdCB0YXJnZXQgd2FzICIuUEhPTlkiIHdoaWNoIGNhdXNlZCBCU0Q0LjQgbWFrZQotCXRvIGJ1aWxkIC5QSE9OWSB3aGVuIG1ha2Ugd2FzIHJ1biB3aXRob3V0IGFyZ3VtZW50cy4KLQotTW9uIE9jdCAxOSAwMToxNzo1NCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGQgQ09QWUlORy5MSUIgdG8gR0RCIHJlbGVhc2VzLCBub3cgdGhhdCB0aGVyZSdzCi0JTGlicmFyeS1jb3B5bGVmdGVkIGNvZGUgaW4gbGliaWJlcnR5LgotCi1UdWUgT2N0IDEzIDAxOjIyOjMyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgUmVwbGFjZSBtNjhrbW90ZSB3aXRoIHBsYWluIG9sZCBtNjhrLgotCi1GcmkgT2N0ICA5IDAzOjE0OjI0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFJlbW92ZSBzcGFjZSBmcm9tIGJsYW5rIGxpbmUsIGF2b2lkIE1ha2UgY29tcGxhaW50cy4KLQotVGh1IE9jdCAgOCAxODo0MTo0NSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQ29tcGxhaW4gaWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4uICBBZGRlZCBzdXBwb3J0IGZvcgotCTM4NmJzZCBhcyBPUyBhbmQgdGFyZ2V0IGFsaWFzLgotCi1UaHUgT2N0ICA4IDE1OjA3OjIyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFhUUkFGTEFHUyk6IGluY2x1ZGUgbmV3bGliIGRpcmVjdG9yaWVzIGlmCi0JbmV3bGliL01ha2VmaWxlIGV4aXN0cywgcmF0aGVyIHRoYW4gaWYgaG9zdCAhPSB0YXJnZXQuCi0KLU1vbiBPY3QgIDUgMDM6MDA6MDkgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgdHdlZWRsZWR1bWJlci5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiByZWNvZ25pemUgc3BhcmNsaXRlLXdycy12eHdvcmtzLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC14aWJlcnR5KTogYWRkZWQgKi14aWJlcnR5IG1ha2UgcnVsZXMgKGZyb20KLQlwMy4pIEFkZGVkIGNsZWFuLXhpYmVydHkgdG8gY2xlYW4uCi0KLVRodSBPY3QgIDEgMTc6NTk6MTkgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSAqLSotKiBpbnN0ZWFkIG9mIG5lc3RlZCBjYXNlcyBmb3IgaG9zdCBhbmQgdGFyZ2V0Ci0KLVR1ZSBTZXAgMjkgMTQ6MTE6MTggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgLW5vc3RkaW5jIHRvIFhUUkFGTEFHUyBpZiB3ZSBhcmUgdXNpbmcgZ2NjCi0JZnJvbSB0aGUgc2FtZSBzb3VyY2UgdHJlZSBhbmQgbm90IGJ1aWxkaW5nIGEgY3Jvc3MtY29tcGlsZXIuICBUaGlzCi0JbWF0dGVycyBmb3IgdGhlIGxpYmcrKyBjb25maWd1cmF0aW9uIGlmIHJlY29uZmlndXJpbmcgYSB0cmVlIHRoYXQKLQloYXMgYWxyZWFkeSBiZWVuIGluc3RhbGxlZC4KLQotU2VwIDIwIDA4OjUzOjEwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChpNDg2di9pNDg2djQpOiAgTWVyZ2UgaW4gZnJvbSBGU0YgdmVyc2lvbi4KLQotRnJpIFNlcCAxOCAwMDozMjowMCAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IG9ubHkgc2V0IFBXRCBpZiBpdCBpcyBhbHJlYWR5IHNldC4KLQotVGh1IFNlcCAxNyAyMzowNTo1MyAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGp1c3Qgc2V0IFBXRD1gcHdkYCBhdCB0aGUgdG9wLCBzaW5jZSBVbHRyaXggc2gKLQlkb2Vzbid0IGhhdmUgdW5zZXQgYW5kIGFsbCBzdWNjZXNzIHBhdGhzIChhbmQgbW9zdCBlcnJvciBwYXRocykKLQlvdXQgc2V0IGl0IGFueXdheS4gKE5vdGU6IHNob3VsZCBjaGFuZ2UgYWxsIHVzZXMgb2YgJHtQV0Q9YHB3ZGB9Ci0JdG8ganVzdCAke1BXRH0gdG8gYXZvaWQgY29uZnVzaW9uLikKLQotVHVlIFNlcCAxNSAxNjowMDo1NCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogYWx3YXlzIHNldCAkKHRvb2xkaXIpIHRvICQobGliZGlyKS8kKHRhcmdldF9hbGlhcyksCi0JZXZlbiBmb3IgYSBuYXRpdmUgY29tcGlsYXRpb24uCi0KLVR1ZSBTZXAgMTUgMDI6MjI6NTYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQlDaGFuZ2VzIHRvIG1ha2UgdGhlIGdkYi50YXIuWiBydWxlIHdvcmsgYmV0dGVyLgotCi0JKiBNYWtlZmlsZS5pbiAoR0RCX1NVUFBPUlRfRElSUyk6ICBBZGQgb3Bjb2Rlcy4KLQkoREVWT19TVVBQT1JUKTogIEFkZCBjb25maWd1cmUudGV4aS4KLQkoYmZkLWlscnQudGFyLlopOiAgUmVtb3ZlIGFuY2llbnQgcnVsZS4KLQotVGh1IFNlcCAxMCAxMDo0MzoxOSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCAtSSBmb3IgbmV3bGliL3RhcmctaW5jbHVkZSB0byBYVFJBRkxBR1MsIHRvCi0JcGljayB1cCB0aGUgbWFjaGluZSBhbmQgc3lzdGVtIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLQotCSogY29uZmlndXJlLmluLCBjb25maWcuc3ViOiBhZGRlZCBuZXcgdGFyZ2V0IG02ODAxMC1hZG9iZS1zY291dCwKLQl3aXRoIGFsaWFzIG9mIGFkb2JlNjhrLiAgQ2hhbmdlZCBjb25maWd1cmUuaW4gdG8gY2hlY2sgZm9yCi0JLXNjb3V0IGJlZm9yZSAtc2NvKiB0byBhdm9pZCBhIGZhbHNlIG1hdGNoLgotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgQVNfRk9SX1RBUkdFVCwgcGFzc2VkIGRvd24gaW4KLQlUQVJHRVRfRkxBR1NfVE9fUEFTUy4gIEFkZGVkIENDX0ZPUl9CVUlMRCwgd2hpY2ggaXMgaW50ZW5kZWQgdG8gYmUKLQl0aGUgQyBjb21waWxlciB0byB1c2UgdG8gY3JlYXRlIHByb2dyYW1zIHdoaWNoIGFyZSBydW4gaW4gdGhlCi0JYnVpbGQgZW52aXJvbm1lbnQsIHNldCBpdCB0byBkZWZhdWx0IHRvICQoQ0MpLCBhbmQgcGFzc2VkIGl0IGRvd24KLQlpbiBGTEFHU19UT19QQVNTIGFuZCBUQVJHRVRfRkxBR1NfVE9fUEFTUy4KLQotV2VkIFNlcCAgOSAxMjoyMTo0MiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBUQVJHRVRfRkxBR1NfVE9fUEFTUywgQ0NfRk9SX1RBUkdFVCwKLQlBUl9GT1JfVEFSR0VULCBSQU5MSUJfRk9SX1RBUkdFVCwgTk1fRk9SX1RBUkdFVC4gIFBhc3MKLQlUQVJHRVRfRkxBR1NfVE9fUEFTUywgd2hpY2ggZGVmaW5lcyBDQywgQVIsIFJBTkxJQiBhbmQgTk0gYXMgdGhlCi0JRk9SX1RBUkdFVCB2YXJpYW50cywgdG8gbmV3bGliIGFuZCBsaWJnKysuCi0KLVR1ZSBTZXAgIDggMTc6Mjg6MzAgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdhcywgYWxsLWdkYik6IFJlcXVpcmUgYWxsLW9wY29kZXMgdG8gYmUgYnVpbHQKLQlmaXJzdC4KLQotV2VkIFNlcCAgMiAwMjo1MDowNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIEFjY2VwdCBgZWxmJyBhcyBhbiBlbnZpcm9ubWVudC4KLQotVHVlIFNlcCAgMSAxNTo0ODozMCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1vcGNvZGVzKTogIGNkIGludG8gdGhlIHJpZ2h0IGRpcmVjdG9yeQotCi1TdW4gQXVnIDMwIDIxOjEyOjExIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBhZGRlZCAtcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSBvcHRpb24sIHVzZWQgYXMKLQlhcmd1bWVudCB0byBzZWQgd2hlbiBpbnN0YWxsaW5nIHByb2dyYW1zLgotCWNvbmZpZ3VyZS50ZXhpOiBhZGRlZCBkb2N1bWVudGF0aW9uIGZvciAtcHJvZ3JhbV9wcmVmaXgsCi0JLXByb2dyYW1fc3VmZml4IGFuZCAtcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZS4KLQotVGh1IEF1ZyAyNyAyMTo1OTo0NCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIEFjY2VwdCBpNDg2IHdoZXJlIGkzODYgb2suCi0KLVRodSBBdWcgMjcgMTM6MDQ6NDIgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IGFjY2VwdCB3ZTMyawotCi1Nb24gQXVnIDI0IDE0OjA1OjE0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotIAkqIGNvbmZpZy5zdWIsIGNvbmZpZ3VyZS5pbjogYWNjZXB0IE9TRTY4MDAwIGFuZCBPU0U2OGsuCi0KLQkqIE1ha2VmaWxlLmluOiBkb24ndCBjcmVhdGUgYWxsIGRpcmVjdG9yaWVzIGZvciBgYG1ha2UgaW5zdGFsbCcnOwotCWxldCB0aGUgc3ViZGlyZWN0b3JpZXMgY3JlYXRlIHRoZSBvbmVzIHRoZXkgbmVlZC4KLQotVHVlIEF1ZyAxMSAyMzoxMzoxNyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBDT1BZSU5HOiBuZXcgZmlsZSwgR1BMIHYyCi0KLVR1ZSBBdWcgIDQgMDE6MTI6NDMgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogdXNlIHRoZSBuZXcgZ2VuLWluZm8tZGlyLCB3aGljaCBuZWVkcyBhIHRlbXBsYXRlCi0JYXJndW1lbnQgKHdoaWNoIGFsc28gbGl2ZXMgaW4gdGV4aW5mbykKLQotCSogY29uZmlndXJlLnRleGksIHN0YW5kYXJkcy50ZXhpOiBmaXggSU5GTy1ESVItRU5UUlkKLQotTW9uIEF1ZyAgMyAxNTo0MToyOCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zb2xhcmlzOiByZW1vdmVkIHRoZSAteHMgZnJvbSBDRkxBR1MgKGxldCB0aGUgcGVvcGxlCi0Jd2l0aCBTdW4ncyBDIGNvbXBpbGVyIGRlYWwgd2l0aCBpdCB0aGVtc2VsdmVkKQotCi1Nb24gQXVnICAzIDAwOjM0OjE3IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChuY3IzMDAwKTogIENoYW5nZSBpMzg2IHRvIGk0ODYuCi0KLVRodSBKdWwgMjMgMDA6MTI6MTcgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGluc3RhbGwtcmNzLCBpbnN0YWxsLWdyZXAgdG8KLQlpbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXMsIHJlbW92ZWQgaW5zdGFsbC1iaXNvbiBhbmQgaW5zdGFsbC1saWJnY2MKLQotVHVlIEp1bCAyMSAwMTowMTo1MCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGdyYWIgdGhlIEhQVVggbWFrZWZpbGUgZnJhZ21lbnQgaWYgb24gSFBVWAotCi1Nb24gSnVsIDIwIDExOjAyOjA5IDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGVyYWRpY2F0ZSBiaXNvbiBzcG9vciAoZGl0dG8gbGliZ2NjKS4KLQkgY29uZmlndXJlLmluOiByZWNvZ25pc2UgbTY4e2ssMDAwfS1lcmljc3Nvbi1PU0UuCi0JIGVzMTgwMCBpcyBhbGlhcyBmb3IgbTY4ay1lcmljc3Nvbi1PU0UKLQotU3VuIEp1bCAxOSAxNzo0OTowMiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVhcnJhbmdlIHRoZSBwYXJ0cyB0aGF0IHJlbW92ZSBwcm9ncmFtcyBmcm9tCi0JY29uZmlnZGlycywgYmFzZWQgbm93IG9uIEhPU1Q9PVRBUkdFVCBvciBieSBjYW5vbmljYWwgdHJpcGxlLgotCi1GcmkgSnVsIDE3IDIyOjUyOjQ5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tazogcmVjdXJzZSBleHBsaWNpdGx5IHdpdGggLWYgdGVzdC1idWlsZC5tayB3aGVuCi0JICBhcHByb3ByaWF0ZS4gIHByZWRpY2F0ZSBzdGFnZTMgYW5kIGNvbXBhcmlzb24gb24gdGhlIGV4aXN0ZW5jZQotCSAgb2YgZ2NjLiAgVGhhdCBpcywgaWYgZ2NjIGlzbid0IGFyb3VuZCwgd2UgYXJlbid0IHRocmVlLXN0YWdpbmcuCi0JICBPbiB2ZXJ5IGNsZWFuLCBhbHNvIHJlbW92ZSAuLi5zdGFtcC1jby4gIEJ1aWxkIGluLXBsYWNlIGJlZm9yZQotCSAgZG9pbmcgb3RoZXIgYnVpbGRzLgotCi1UaHUgSnVsIDE2IDE4OjMzOjA5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBhZGQgdGdhcwotCi1UaHUgSnVsIDE2IDE2OjA1OjI4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGEgbnVtYmVyIG9mIGNoYW5nZXMgbWVyZ2VkIGluIGZyb20gcHJvZ3Jlc3NpdmUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIGxpYm0uCi0KLQkqIC5jdnNpZ25vcmU6IGlnbm9yZSBzb21lIHN0dWZmIHRoYXQgY29tZXMgZnJvbSB0ZXN0LWJ1aWxkLm1rLgotCi1XZWQgSnVsICA4IDAwOjAxOjMwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zb2xhcmlzOiAgVXNlIC14cyB3aGVuIGNvbXBpbGluZyBzbyB0aGF0IFN1bi1DIHB1dHMKLQlhIHN5bWJvbC10YWJsZSBpbnRvIHRoZSBleGVjdXRhYmxlLgotCi1UdWUgSnVsICA3IDAwOjI0OjUyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgQWRkIGVzMTgwMCAobTY4ay1lcmljc3Nvbi1lczE4MDApLgotCi1UdWUgSnVuIDMwIDIwOjI0OjQxIDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBBZGQgcHJvZ3JhbV9zdWZmaXggKHBhcmFsbGVsIHRvIHByb2dyYW1fcHJlZml4KQotCSogTWFrZWZpbGUuaW46IGFkanVzdCBkaXJlY3RvcnktY3JlYXRpbmcgc2NyaXB0IGZvciBsb3NpbmcgZGVjc3RhdGlvbgotCi1Nb24gSnVuIDIyIDIzOjQzOjQ4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6ICBNaW5vciAkc3ViZGlyLXJlbGF0ZWQgZml4ZXMuCi0KLU1vbiBKdW4gMjIgMTg6MzA6MjYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogZml4IHZhcmlvdXMgcHJvYmxlbXMgd2l0aCBwcm9wb2dhdGluZwotCW1ha2VmaWxlX3RhcmdldF9mcmFnIGluIHN1YmRpcnMuCi0JKiBjb25maWd1cmUuaW46IGNvbmZpZyBsaWJnY2MgaWYgaXRzIHRoZXJlCi0KLUZyaSBKdW4gMTkgMTU6MTk6NDAgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIEhQUEEgbWVyZ2UuCi0KLU1vbiBKdW4gMTUgMTI6MzE6NTIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1uY3IzMDAwIChJTlNUQUxMKTogIERvbid0IHVzZSAvdXNyL3VjYi9pbnN0YWxsLAotCWl0IGlzIGJyb2tlbiBvbiBuY3IgMzAwMCdzLgotCi1TdW4gSnVuIDE0IDEwOjI5OjE5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFJlcGxhY2UgYWxsLWJpc29uIHdpdGggYWxsLWJ5YWNjIGluIGFsbAotCWRlcGVuZGVuY3kgbGluZXMgZm9yIG90aGVyIHRvb2xzICh3aGljaCBub3cgdXNlIGJ5YWNjKS4KLQotRnJpIEp1biAxMiAyMjoyMTo1NyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIEFkZCBzdW40c29sMiA9PiBzcGFyYy1zdW4tc29sYXJpczIuCi0KLVR1ZSBKdW4gIDkgMTc6MTg6MTEgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy97bWgtbmNyMzAwMCwgbWgtc3lzdjR9OiAgQWRkIElOU1RBTEwuCi0KLVRodSBKdW4gIDQgMTI6MDc6MzIgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG1ha2UgZ3Byb2YgcnVsZXMgc2ltaWxhciB0byBieWFjYyBydWxlcyAoaW5zdGVhZCBvZgotCXZlc3RpZ2FsICQodW5zdWJkaXIpIHRoYXQgZGlkbid0IHdvcmsuLi4pCi0KLVRodSBKdW4gIDQgMDA6Mzc6MDUgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgQWRkIHN1cHBvcnQgZm9yIExpbnV4LgotCSogTWFrZWZpbGUuaW46ICBVc2UgJChGTEFHU19UT19QQVNTKSBtb3JlIGNvbnNpc3RlbnRseQotCShhdCBsZWFzdCBmb3IgbGliZysrKS4KLQotVHVlIEp1biAwMiAyMDowMzowMCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUudGV4aTogZml4IGRvYyBmb3IgdGhlIC1uZnAgb3B0aW9uIHRvIGNvbmZpZ3VyZQotCi1UdWUgSnVuICAyIDE3OjIwOjUyIDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1iaW51dGlscyk6IGFyIG5lZWRzIGZsZXgsIHNvIGRlcGVuZCBvbiBhbGwtZmxleC4KLQotU3VuIE1heSAzMSAxNTowNDowOCAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBjaGFuZ2VkIFteLV0rIHRvIFteLV1bXi1dKiBzbyB0aGF0IGl0IHdvcmtzIHVuZGVyCi0JU3VuIHNlZC4gKEJTRCA0LjMgc2VkIGRvZXNuJ3QgaGFuZGxlIFteLV0rIGVpdGhlci4pCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIHNvbGFyaXMqIGhvc3RfbWFrZWZpbGVfZnJhZyBob29rLgotCi1TdW4gTWF5IDMxIDAxOjEwOjM0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogY2hhbmdlZCByZWNvZ25pdGlvbiBvZiBtNjgwMDAgc28gdGhhdCB2YXJpb3VzCi0JbTY4ayB0eXBlcyBjYW4gYmUgc3BlY2lmaWVkIHZpYSBtNjgwWzAxMjM0XTAKLQotU2F0IE1heSAzMCAyMTowMTowNiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKGJhc2ljX21hY2hpbmUpOiBmaXggc2VkIHNvIHRoYXQgJy1mb28nIGlzbid0Ci0JY29tcGxldGVseSBzdWJzdGl0dXRlZCBvdXQgd2hpbGUgLisnLWZvbycgbG9zZXMgdGhlICctZm9vJwotCi1XZWQgTWF5IDI3IDIzOjE4OjUyIDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKCRvcyk6IEFkZCAtYW91dC4KLQotRnJpIE1heSAyMiAxNDowMDowMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgSWYgaG9zdF9tYWtlZmlsZV9mcmFnIGlzIGFic29sdXRlLCBkb24ndAotCXByZWZpeCAke2ludnN1YmRpcn0gKHJlbGV2YW50IHRvIGxpYmcrKyBhdXRvLWNvbmZpZ3VyZSkuCi0KLVRodSBNYXkgMjEgMTg6MDA6MDkgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRvb2xkaXIpOiBEZWZpbmUgaXQuCi0JKGFsbC1sZCk6IERlcGVuZCBvbiBhbGwtZmxleC4KLQotU3VuIE1heSAxMCAyMTo0NTo1OSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6ICBGaXggbGliZysrIHNwZWNpYWwgY2FzZS4KLQotRnJpIE1heSAgOCAwODozMTo0MSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBkbyBub3QgYnVyeSBgcHdkYCBpbnRvIGNvbmZpZy5zdGF0dXMsIHRodXMgZG8gZmV3ZXIKLQkgIHB3ZCdzLgotCi0JKiBjb25maWd1cmU6IHByaW50IHRoZSAiQnVpbGRpbmcgaW4iIG1lc3NhZ2Ugb25seSB3aGVuIGJ1aWxkaW5nIGluCi0JICBvdGhlciB0aGFuICIuIiBBTkQgdmVyYm9zZS4KLQotCSogY29uZmlndXJlOiByZW1vdmUgLXMsIHJld29yayAtdiB0byBiZXR0ZXIgYWNjb21vZGF0ZSBndWVzdGVkCi0JICBjb25maWd1cmVzLgotCi0JKiBzdGFuZGFyZHMudGV4aTogdXBkYXRlZCB0byAzIG1heSwgZml4ZWQgbGlicmlkIDwtPiBsaWJkaXIgdHlwby4KLQotRnJpIE1heSAgMSAxODowMDo1MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG1hY3JvaXplIGZsYWdzIHBhc3NlZCBvbiByZWN1cnNpb24uICByZW1vdmUKLQkgIGZpbGV1dGlscy4KLQotVGh1IEFwciAzMCAwODo1NjoyMCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBnZXQgbWFrZXNyY2RpciByaWdodCBmb3Igc3ViZGlycyBkZWVwZXIgdGhhbiAxLgotCi0JKiBNYWtlZmlsZS5pbjogcGFzcyBJTlNUQUxMLCBJTlNUQUxMX0RBVEEsIElOU1RBTExfUFJPR1JBTSBvbgotCSAgaW5zdGFsbC4KLQotRnJpIEFwciAyNCAxNTo1MTo1MSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRvbid0IHByaW50IHN1YmRpcl9kbyBvciByZWN1cnNpb24gbGluZXMuCi0KLUZyaSBBcHIgMjQgMTU6MjI6MDQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIHN0YW5kYXJkcy50ZXhpOiBhZGRlZCBtZW51IGl0ZW0uCi0KLQkqIE1ha2VmaWxlLmluOiBidWlsZCBhbmQgaW5zdGFsbCBzdGFuZGFyZHMuaW5mby4KLQotCSogc3RhbmRhcmRzLnRleGk6IG5ldyBmaWxlLgotCi1XZWQgQXByIDIyIDE4OjA2OjU1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiB0ZXN0IGZvciBhbmQgbW92ZSBjb25maWcuc3RhdHVzIHBpZWNlcyBmcm9tCi0JICAke3N1YmRpcn0vLgotCi1XZWQgQXByIDIyIDE0OjM4OjM0IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtZGVsdGE4OCwgY29uZmlnL21oLW5jcjMwMDA6ICBSZXBsYWNlIE1JTlVTX0cgd2l0aAotCUNGTEFHUyBwZXIgbmV3IGNvbmZpZ3VyYXRpb24gc3RyYXRlZ3kuCi0JKiBjb25maWd1cmU6ICBUZXN0IGZvciBleGlzdGFuY2Ugb2YgZmlsZXMgYmVmb3JlIHRyeWluZyB0byBtdgotCXRoZW0sIHRvIGF2b2lkIG51bWVyb3VzIG5vbi1leGlzdGFuY2UgbWVzc2FnZXMuCi0KLVR1ZSBBcHIgMjEgMTI6MzE6MzMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogY29ycmVjdCBmaW5hbCBsaW5lIG9mIGNvbmZpZy5zdGF0dXMuCi0KLQkqIGNvbmZpZ3VyZTogcGF0Y2ggZnJvbSBlZ2dlcnQuICBBdm9pZHMgYSBwcm90ZWN0aW9uIHByb2JsZW0gaWYKLQkgIHRoZSBvcmlnaW5hbCBNYWtlZmlsZS5pbiBpcyByZWFkIG9ubHkuCi0KLQkqIGNvbmZpZ3VyZTogdXNlIG1vdmUtaWYtY2hhbmdlIGZyb20gZ2NjIHRvIGNyZWF0ZSBjb25maWcuc3RhdHVzLgotCSAgU29tZSBtYWtlZmlsZXMgZGVwZW5kIG9uIGNvbmZpZy5zdGF0dXMgdG8gdGVsbCBpZiBhIGRpcmVjdG9yeQotCSAgaGFzIGJlZW4gcmVjb25maWd1cmVkIGZvciBhIGRpZmZlcmVudCBob3N0LiAgVGhpcyBjaGFuZ2UKLQkgIHByZXZlbnRzIHRob3NlIGRpcmVjdG9yaWVzIGZyb20gcmVtYWtpbmcgZXZlcnl0aGluZyBpbiB0aGUgY2FzZQotCSAgd2hlcmUgdGhlIHJlY29uZmlnIHdhcyBvbmx5IGludGVuZGVkIHRvIHJlYnVpbGQgYSBNYWtlZmlsZS4KLQotCSogY29uZmlndXJlOiB0ZXN0IGZvciBjb25maWcuc3ViIHdpdGggImNvbmZpZy5zdWIgc3VuNCIgcmF0aGVyCi0JICB0aGFuICJjb25maWcuc3ViICR7aG9zdF9hbGlhc30iLiAgT3RoZXJ3aXNlIHdlIGNhbid0IHRlbGwgYSBiYWQKLQkgIGhvc3QgYWxpYXMgZnJvbSBhIG1pc3NpbmcgY29uZmlnLnN1Yi4KLQotTW9uIEFwciAyMCAxODoxNjozNiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBleHBsaWNpdGx5IHBhc3MgQ0ZMQUdTIG9uIHJlY3Vyc2lvbi4gbm8gbG9uZ2VyIHBhc3MKLQkgIE1JTlVTX0cgKHRoaXMgY2FuIGJlIGRvbmUgd2l0aCBDRkxBR1MpLiAgRGVmYXVsdCBDRkxBR1MgdG8gLWcuCi0KLUZyaSBBcHIgMTcgMTg6Mjc6NTEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogbWtkaXIgJHtzdWJkaXJ9IGFzIG5lZWRlZC4KLQotV2VkIEFwciAxNSAxNzozNzoyMiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sY29uZmlndXJlLmluOiBhZGRlZCBhdXRvY29uZi4KLQotV2VkIEFwciAxNSAxNzoyNzozNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBubyBsb25nZXIgcGFzcyBhZ2FpbnN0IG9uIHJlY3Vyc2lvbi4KLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIC5OT0VYUE9SVDogc28gdGhhdCBzdHJheSBtYWtlZmlsZV9mcmFnCi0JICBkZWZpbml0aW9ucyBhcmUgbm90IGluaGVyaXRlZC4KLQotCSogY29uZmlndXJlOiBjb3JyZWN0IG1ha2VzcmNkaXIgd2hlbiBzdWJkaXIgaXMgLgotCi1UdWUgQXByIDE0IDExOjU2OjA5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6ICBBZGQgc3VwcG9ydCBmb3IgJ3N1YmRpcnMnIHZhcmlhYmxlLCB3aGljaCBpcwotCWxpa2UgJ2NvbmZpZ2RpcnMnLCBleGNlcHQgdGhhdCBjb25maWd1cmUgZG9lc24ndCByZS1pbnZva2UKLQlpdHNlbGYgZm9yIHN1YmRpcnMsIGl0IGp1c3QgY3JlYXRlcyBhIE1ha2VmaWxlIGZvciBlYWNoIHN1YmRpci4KLQkqIGNvbmZpZ3VyZS50ZXhpOiAgRG9jdW1lbnQgc3ViZGlycy4KLQotTW9uIEFwciAxMyAxODo1MDoxNiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgZmxleCB0byBjb25maWdkaXJzCi0KLU1vbiBBcHIgMTMgMTg6NDM6NTUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgY2xlYW4tc3RhbXBzIGZyb20gY2xlYW4uCi0KLVNhdCBBcHIgMTEgMDM6NTI6MDMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBnZGJ0ZXN0IHRvIGNvbmZpZ2RpcnMuCi0KLUZyaSBBcHIgMTAgMjM6MTE6NDkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNSU5VU19HKTogIEFkZCBtYWNybywgZGVmYXVsdCB0byAtZywgcGFzcyBvbgotCXRvIHJlY3Vyc2l2ZSBtYWtlcy4KLQkqIGNvbmZpZ3VyZS5pbjogIFJlY29nbml6ZSBuZXcgbmNyMzAwMCBjb25maWcuCi0KLVdlZCBBcHIgIDggMjM6MDg6MTIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgcmVmZXJlbmNlcyB0byBnZGJtLgotCi1UdWUgQXByICA3IDE2OjQ4OjIwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgRG9uJ3QgY2Fub25pY2FsaXplIG9zIHZhbHVlCi0JbmV3c29zKiB0byBic2QgKHJlYWRsaW5lIG5lZWRzIHRvIGNoZWNrIGZvciBuZXdzb3MpLgotCShUaGlzIGZpeCB3YXMgZWFybGllciBtYWRlIEphbiAzMSwgYnV0IGdvdCByZS1icm9rZW4uKQotCi1Nb24gQXByICA2IDE0OjM0OjA4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIHNjbyBpcyBhbiBvcywgbm90IGEgdmVuZG9yIQotCi0JKiBjb25maWd1cmU6ICBRdW90ZSAkKCBiZXR0ZXIuICBLZWVwIHZhcmlvdXMgc2hlbGxzIGhhcHB5LgotCi1UdWUgTWFyIDMxIDE2OjMyOjU3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZWxpbWluYXRlIHN0YW1wLWZpbGVzLgotCi1Nb24gTWFyIDMwIDIyOjIwOjIzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIHNlbmRfcHIuICByZW1vdmUgImZvcmNlIiBmcm9tIC5zdG1wLWdwcm9mIHJ1bGUuCi0JICBTdXByZXNzIGVjaG9pbmcgb2YgYWxsIHRoZSAiaWYgWyAtZCAuLi4gJChNQUtFKSIgbGluZXMuCi0KLVdlZCBNYXIgMjUgMTU6MjA6MDQgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIGZpeCBpcmlzL2lyaXMzLgotCi1XZWQgTWFyIDI1IDEwOjM0OjE5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IHJlLWFkZCAtcm0uCi0KLVR1ZSBNYXIgMjQgMjM6NTA6MTYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1hc2tlZmlsZS5pbjogYWRkIC5zdG1wLXJjcyB0byBhbGwuCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIGdhcyBmcm9tIHJzNjAwMCBidWlsZCwgdXNlIGFpeCBob3N0IGZyYWdtZW50LgotCi1Nb24gTWFyIDIzIDE5OjQzOjM1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IHBhc3MgZG93biBzaXRlX29wdGlvbiBkdXJpbmcgcmVjdXJzaW9uLgotCi1UaHUgTWFyIDE5IDE2OjQ5OjM2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwuY3Jvc3MpOiAgQWRkIC5zdG1wLWJmZCAuc3RtcC1yZWFkbGluZS4KLQotV2VkIE1hciAxOCAxNToyOTozMyAxOTkyICBNaWtlIFN0dW1wICAobXJzQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQ2hhbmdlIGV4ZWNfcHJlZml4IHNvIHRoYXQgaXQgcmVhbGx5IGRlZmF1bHRzIHRvIHByZWZpeC4KLQotU2F0IE1hciAxNCAxNzoyMDozOCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogIEFkZCBzdXBwb3J0IGZvciBtbWFsbG9jIGxpYnJhcnkuCi0KLUZyaSBNYXIgMTMgMTg6NDQ6MTggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgc3RtcCBkZXBlbmRlbmNpZXMgZm9yIGEgZmV3IG1vcmUgdGhpbmdzLgotCi1UaHUgTWFyIDEyIDA0OjU2OjI0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGFkanVzdGVkIGVycm9yIG1lc3NhZ2Ugb24gb2JqZGlyL3NyY2RpciBjb25maWd1cmUKLQkgIGNvbGxpc2lvbiwgcGVyIGpvaG4ncyBzdWdnZXN0aW9uLgotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGxpYmliZXJ0eSBzdG1wIHRvIGFsbCBhbmQgYWxsLmNyb3NzLgotCi1XZWQgTWFyIDExIDAyOjA3OjUyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIGZvcmNlIGRlcGVuZGVuY2llcywgYWRkIGdyZXAgdG8gYWxsLgotCi1UdWUgTWFyIDEwIDIxOjQ5OjE4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBtYXJzLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkcm9wIGZsZXguICBtYWtlIHN0YW1wIGZpbGVzIHdvcmsuCi0KLQkqIGNvbmZpZ3VyZTogYWRkZWQgdGVzdCBmb3IgY29uZmxpY3RpbmcgY29uZmlndXJhdGlvbiBpbiBzcmNkaXIsCi0JICByZW1vdmUgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4gIE90aGVyd2lzZSBlbWFjcyBnZGIgbW9kZQotCSAgZ2V0cyBjcmFua3kuICB1c2UgcmVsYXRpdmUgcGF0aHMgZm9yIGNvbmZpZ3VyZSBhbmQgc3JjZGlyCi0JICB3aGVuZXZlciBwb3NzaWJsZS4gIFNlbmQgc29tZSBlcnJvciBtZXNzYWdlcyB0byBzdGRlcnIgdGhhdCB3ZXJlCi0JICBnb2luZyB0byBzdGRvdXQuCi0KLVR1ZSBNYXIgMTAgMTg6MDE6NTUgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgRml4IGxpYmcrKyBydWxlIHRvIGNoZWNrIGZvciBnY2MgZGlyZWN0b3J5Ci0JYmVmb3JlIHVzaW5nIGdjYy9nY2MuICBBbHNvIHBhc3MgWFRSQUZMQUdTLgotCi1UaHUgTWFyICA1IDIxOjQ1OjA3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkpCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBzdG1wLWZpbGVzIHNvIHRoYXQgZGlyZWN0b3JpZXMgYXJlbid0IHBvbGxlZAotCSAgd2hlbiB0aGV5IGFyZSBhbHJlYWR5IGJ1aWx0LgotCi0JKiBjb25maWd1cmUudGV4aTogZml4ZWQgYSBub2RlIHBvaW50ZXIgcHJvYmxlbS4KLQotVGh1IE1hciAgNSAxMjowNTo1OCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIGNvbmZpZ3VyZS5pbiBjb25maWcvbWgtaXJpeDQgZ2RiL2NvbmZpZ3VyZS5pbgotCWdkYi9taXBzLXRkZXAuYyBnZGIvbWlwc3JlYWQuYyBnZGIvcHJvY2ZzLmMgZ2RiL3NpZ25hbWUuaAotCWdkYi90bS1pcml4My5oIGdkYi90bS1taXBzLmggZ2RiL3htLWlyaXg0LmggZ2RiL2NvbmZpZy9tdC1pcml4MwotCWdkYi9jb25maWcvbWgtaXJpeDQgdGV4aW5mby9jb25maWd1cmUuaW46ICBQb3J0IHRvIFNHSSBJcml4LTQueC4KLQotV2VkIE1hciAgNCAwMjo1Nzo0NiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogLXJlY3VycmluZyBiZWNvbWVzIC1zaWxlbnQuICBjb3JyZWN0ZWQgaGVscCBtZXNzYWdlCi0JICBmb3IgLXNpdGU9IG9wdGlvbi4KLQotCSogTWFrZWZpbGUuaW46IG1rZGlyICQoZXhlY19wcmVmaXgpIGFuZCAkKHRvb2xkaXIpLgotCi1UdWUgTWFyICAzIDE0OjUxOjIxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiB3aGVuIGJ1aWxkaW5nIE1ha2VmaWxlIGZvciBjcm9zc2VzLCByZXBsYWNlCi0JICB0b29sZGlyIGFuZCBwcm9ncmFtX3ByZWZpeC4gIGRlZmF1bHQgc3JjZGlyIGZyb20gbG9jYXRpb24gb2YKLQkgIGNvbmZpZy5zdWIuICByZW1vdmUgImZvciBob3N0IGluIGhvc3RzIiBhbmQgImZvciB0YXJnZXQgaW4KLQkgIHRhcmdldHMiIGxvb3BzLgotCi1XZWQgRmViIDI2IDE5OjQ4OjI1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IERvIG5vdCBwYXNzIGJpbmRpciBvciBtYW5kaXIgdG8gY3ZzLgotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotCSogY29uZmlndXJlLnRleGk6IHJlbW92ZSBtb3N0IHJlZmVyZW5jZXMgdG8gbXVsdGlwbGUgaG9zdHMsCi0JICBtdWx0aXBsZSB0YXJnZXRzLCBzdWJkaXJzLCBldGMuCi0KLQkqIGNvbmZpZ3VyZS5tYW46IHJlbW92ZWQgcmNzaWQuIHJlZmVyZW5jZSBjb25maWcuc3ViIG5vdAotCSAgY29uZmlnLnN1YnIuCi0KLQkqIE1ha2VmaWxlLmluOiBta2RpciAkKGluZm9kaXIpIG9uIGluc3RhbGwtaW5mby4KLQotV2VkIEZlYiAxOSAxNTo0MToxMyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLnRleGk6ICBFeHBsYWluIGJldHRlciBhYm91dCAuZ2RiaW5pdCBhbmQgYWJvdXQKLQl0aGUgZW52aXJvbm1lbnQgdGhhdCBjb25maWd1cmUuaW4gc2VjdGlvbnMgcnVuIGluLgotCi1GcmkgRmViICA3IDA3OjU1OjAwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBVbHRyaXggaXMgb25seSBhIGRlY3N0YXRpb24gaWYgaXQncyBhIE1JUFMuCi0KLUZyaSBKYW4gMzEgMjE6NTQ6NTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIFJFQURNRTogIERPQy5jb25maWd1cmUgPT4gY2ZnLXBhcGVyLnRleGkuCi0KLUZyaSBKYW4gMzEgMjE6NDg6MTggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAobmVhciBjYXNlICRvcyk6ICBEb24ndCBjb252ZXJ0IG5ld3NvcyogdG8gYnNkIQotCi1GcmkgSmFuIDMxIDAyOjI3OjMyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFJlaW5zdGFsbCBjaGFuZ2UgZnJvbSBnZGItNC4zIHRoYXQgcmVkdWNlcwotCXRoZSBudW1iZXIgb2YgY29waWVzIG9mIENPUFlJTkcgdGhhdCBnbyBpbnRvIHRoZSBHREIgdGFyIGZpbGUuCi0KLVRodSBKYW4gMzAgMTY6MTc6MzAgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkL2NvbmZpZ3VyZS5pbiwgY29uZmlnL21oLXNjbywgZ2RiL2NvbmZpZy9taC1pMzg2c2NvLAotCWdkYi9jb25maWcvbXQtaTM4NnYzMiwgZ2RiL2NvbmZpZ3VyZS5pbiwgcmVhZGxpbmUvY29uZmlndXJlLmluOgotCUZpeCBTQ08gY29uZmlndXJhdGlvbiBzdHVmZi4KLQotVHVlIEphbiAyOCAyMzo1MTowNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBGb3IgbGliZysrLCBtYWtlIHN1cmUgdGhlIC1JIHBvaW50aW5nCi0JdG8gdGhlIGdjYyBkaXJlY3RvcnkgZ29lcyAqYWZ0ZXIqIGFsbCB0aGUgbGliZysrLWxvY2FsIC1JIGZsYWdzLgotCUFsc28sIG1vdmUganVzdC1nY2MgZGVwZW5kZW5jeSBmcm9tIGp1c3QtbGliZysrIHRvIGFsbC1saWJnKysuCi0KLVR1ZSBKYW4gMjggMTI6NTY6MjQgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgQ2hhbmdlIC14IHRvIC1mIHRvIGtlZXAgVWx0cml4IC9iaW4vdGVzdCBoYXBweS4KLQotU2F0IEphbiAxOCAxNzo0NToxMSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLlopOiAgUmVtb3ZlIHRleGluZm8gdGFyZ2V0cy4KLQotU2F0IEphbiAxOCAxNzowMzoyMSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIEFkZCBzdHJhdHVzIGNvbmZpZ3VyYXRpb24gZnJhZ3MuICBBbHNvCi0Jc3VibWl0dGVkIHRvIEZTRi4KLQotU2F0IEphbiAxOCAxNTozNToyOSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoREVWX1NVUFBPUlQpOiAgYWRkIGNvbmZpZ3VyZS5tYW4uCi0KLQkqIGNvbmZpZy5zdWIoRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyk6ICBhZGQgLW5vbmUqLgotCi1GcmkgSmFuIDE3IDE3OjU4OjA1IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgcmVtb3ZlIGZvcm0gZmVlZHMgdG8gbWFrZSBTdW4ncyBtYWtlIGhhcHB5LgotCShERVZPX1NVUFBPUlQpOiAgRE9DLmNvbmZpZ3VyZSA9PiBjZmctcGFwZXIudGV4aS4KLQotU2F0IEphbiAgNCAxNjoxMTo0NCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFSX0ZMQUdTKTogIE1ha2UgcXVpZXRlci4KLQotVGh1IEphbiAgMiAyMjo1NzoxMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQWRkIGxpYmcrKy4KLQkqIGNvbmZpZ3VyZTogIFdoZW4gdmVyYm9zZSwgZG9uJ3Qgb3V0cHV0IHRoZSBjb21tYW5kIGxpbmUgYXQgZWFjaAotCWxldmVsOyBpdCB3aWxsIGJlIHVucmVtYXJrYWJseSB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgdmVyc2lvbiwKLQl3aGljaCB3aWxsIGJlIHRoZSBzYW1lIGFzIHdoYXQgdGhlIHVzZXIgdHlwZWQuCi0KLUZyaSBEZWMgMjcgMTY6MjY6NDcgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IGZpeCBjbGVhbi1pbmZvLCBhZGQgZmxleC4gIGFkZAotCSAgZmlsZXV0aWxzLgotCi0JKiBjb25maWd1cmU6IGJlIGxlc3Mgc2Vuc2l0aXZlIHRvIHNwYWNlcyBpbiBNYWtlZmlsZS5pbi4gIERvIG5vdAotCSAgbG9vayBmb3Igc291cmNlcyBpbiAiLi4iLiAgRG9pbmcgc28gYnJlYWtzIHN1YmRpcmVjdG9yaWVzIHRoYXQKLQkgIG1pZ2h0IGhhdmUgdGhlaXIgb3duIGNvbmZpZ3VyZS4gIElmIGEgc3ViZGlyIGhhcyBpdCdzIG93bgotCSAgY29uZmlndXJlIHNjcmlwdCwgdXNlIGl0LgotCi1UaHUgRGVjIDI2IDE2OjMwOjI2IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQotCi0JKiBjZmctcGFwZXIudGV4aTogc29tZSBjaGFuZ2VzIHN1Z2dlc3RlZCBieSBybXMuCi0KLVRodSBEZWMgMjYgMTA6MTM6MzYgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBNZXJnZSBpbiBzb21lIHNtYWxsIGFkZGl0aW9ucyBmcm9tIHRoZSBGU0YgdmVyc2lvbiwKLQl0YWtlbiBmcm9tIHRoZSBnY2MgZGlzdHJpYnV0aW9uLCB0byBicmluZyB0aGUgQ3lnbnVzIGFuZCBGU0YKLQl2ZXJzaW9ucyBpbnRvIGNsb3NlciBzeW5jLgotCi1GcmkgRGVjIDIwIDExOjM0OjE4IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBDaGFuZ2VkIHN2cjQgcmVmZXJlbmNlcyB0byBzeXN2NC4KLQotVGh1IERlYyAxOSAxNTo1NDoyOSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBhZGRlZCAtViBmb3IgdmVyc2lvbiBudW1iZXIgb3B0aW9uLgotCi1XZWQgRGVjIDE4IDE1OjM5OjM0IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQotCi0JKiBET0MuY29uZmlndXJlLCBjZmctcGFwZXIudGV4aTogcmV2aXNlZCwgdXBkYXRlZCwgYW5kIHRleGluZm8nZC4KLQkgIHJlbmFtZWQgZnJvbSBET0MuY29uZmlndXJlIHRvIGNmZy1wYXBlci50ZXhpLgotCi1Nb24gRGVjIDE2IDIzOjA1OjE5IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLCBjb25maWcuc3ViciwgY29uZmlnLnN1YjogY29uZmlnLnN1YnIgaXMgbm93Ci0JICBjb25maWcuc3ViIGFnYWluLgotCi1GcmkgRGVjIDEzIDAxOjE3OjA2IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUudGV4aTogbmV3IGZpbGUsIGluIHByb2dyZXNzLgotCi0JKiBNYWtlZmlsZS5pbjogYnVpbGQgaW5mbyBmaWxlIGFuZCBpbnN0YWxsIHRoZSBtYW4gcGFnZSBmb3IKLQkgIGNvbmZpZ3VyZS4KLQotCSogY29uZmlndXJlLm1hbjogbmV3IGZpbGUsIGZpcnN0IGN1dC4KLQotCSogY29uZmlndXJlOiBmaW5kIGNvbmZpZy5zdWJyIGFnYWluIG5vdyB0aGF0IGNvbmZpZ3VyYXRpb24gIm5vbmUiCi0JICBoYXMgZ29uZS4gIHJlbW92ZWQgYWxsIHRyYWNlcyBvZiB0aGUgLWFuc2kgb3B0aW9uLiAgcmVtb3ZlZCBhbGwKLQkgIHRyYWNlcyBvZiB0aGUgLWxhbmd1YWdlcyBvcHRpb24uCi0KLQkqIGNvbmZpZy5zdWJyOiByZXN5bmMgZnJvbSBybXMuCi0KLVdlZCBEZWMgMTEgMjI6MjU6MjAgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUsIGNvbmZpZy5zdWIsIGNvbmZpZy5zdWJyOiBtZXJnZSBjb25maWcuc3ViIGludG8KLQkgIGNvbmZpZy5zdWJyLCBjYWxsIHRoZSByZXN1bHQgY29uZmlnLnN1YnIsIHJlbW92ZSBjb25maWcuc3ViLCB1c2UKLQkgIGNvbmZpZy5zdWJyLgotCi0JKiBNYWtlZmlsZS5pbjogcmV2aXNlZCBpbnN0YWxsIGZvciBkaXIuaW5mby4KLQotVHVlIERlYyAxMCAwMDowNDozNSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIGRlY3N0YXRpb24gaG9zdCBtYWtlZmlsZSBmcmFnLgotCi0JKiBNYWtlZmlsZS5pbjogQklTT04gbm93IGJpc29uIC15IGFnYWluLiAgYWxzbyBpbnN0YWxsLWdjYyBvbgotCSAgaW5zdGFsbC4gIGNsZWFuLWdkYm0gb24gY2xlYW4uICBpbmZvZGlyIGJlbG9uZ3MgaW4gZGF0YWRpci4KLQkgIE1ha2UgZGlyZWN0b3JpZXMgZm9yIGluZm8gaW5zdGFsbC4gIEJ1aWxkIGRpci5pbmZvIGhlcmUgdGhlbgotCSAgaW5zdGFsbCBpdC4KLQotTW9uIERlYyAgOSAxNjo0ODozMyAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBmaXggZm9yIGJhZCBkaXJlY3RvcnkgdGVzdHMuCi0KLVNhdCBEZWMgIDcgMDA6MTc6MDEgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IFx7MSwyXH0gYXBwZWFycyB0byBiZSBhIHN5c3YnaXNtLiAgVXNlIGEgZGlmZmVyZW50Ci0JICByZWdleHAuICAtc3JjZGlyIHJlbGF0aXZlIHdhcyBiZWluZyBoYW5kbGVkIGluY29ycmVjdGx5LgotCi0JKiBNYWtlZmlsZS5pbjogdW53cmFwcGVkIHNvbWUgZm9yIGxvb3BzIHNvIHRoYXQgcGFyYWxsZWwgbWFrZXMKLQkgIHdvcmsgYWdhaW4gYW5kIHNvIG9uZSBjYW4gZm9jdXMgb25lJ3MgYXR0ZW50aW9uIG9uIGEgcGFydGljdWxhcgotCSAgcGFja2FnZS4KLQotRnJpIERlYyAgNiAwMDoyMjowOCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogYWRkZWQgUFdEIGFzIGEgc3RhbmQgaW4gZm9yIGBwd2RgIChmb3Igc3BlZWQpLiB1c2UKLQkgIGVsaWYgd2hlcmV2ZXIgcG9zc2libGUuICBtYWtlIC1zcmNkaXIgd29yayB3aXRob3V0IC1vYmpkaXIuCi0JICAtb2JqZGlyPSBjb21tZW50ZWQgb3V0LgotCi1UaHUgRGVjICA1IDIyOjQ2OjUyIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiArb3B0aW9ucyBiZWNvbWUgLS1vcHRpb25zLiAgLXN1YmRpcnMgY29tbWVudGVkIG91dC4KLQkgIGFkZGVkIC1ob3N0LCAtZGF0YWRpci4gIFJlbmFtZWQgLWRlc3RkaXIgdG8gLXByZWZpeC4gIENvbW1lbnQgaW4KLQkgIE1ha2VmaWxlIG5vdyBhdCB0b3Agb2YgZ2VuZXJhdGVkIE1ha2VmaWxlLiAgUmVtb3ZlZCBjdnMgbG9nCi0JICBlbnRyaWVzLiAgYWRkZWQgLXNyY2Rpci4gIGNyZWF0ZSAuZ2RiaW5pdCBvbmx5IGlmIHRoZXJlIGlzIG9uZQotCSAgaW4gJHtzcmNkaXJ9LgotCi0JKiBNYWtlZmlsZS5pbjogaWRlc3RkaXIgYW5kIGRkZXN0ZGlyIGdvIGF3YXkuICBBZGRlZCBjb3B5cmlnaHRzCi0JICBhbmQgc2hpZnQgZ3BsIHRvIHYyLiAgQWRkZWQgQ2hhbmdlTG9nIGlmIGl0IGRpZG4ndCBleGlzdC4gZG9jZGlyCi0JICBhbmQgbWFuZGlyIG5vdyBrZXllZCBvZmYgZGF0YWRpciBieSBkZWZhdWx0LgotCi1GcmkgTm92IDIyIDA3OjM4OjExIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogRnJlc2hseSBjcmVhdGVkIENoYW5nZUxvZy4KLQotDAotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogY2hhbmdlLWxvZwotbGVmdC1tYXJnaW46IDgKLWZpbGwtY29sdW1uOiA3NgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YxYmI4Yy4uMDAwMDAwMAotLS0gYS9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE4MjEgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgZGlyZWN0b3J5IHdpdGggc3ViZGlycyB0byBidWlsZC4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0jICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLQotc3JjZGlyID0gLgotCi1wcmVmaXggPSAvdXNyL2xvY2FsCi1leGVjX3ByZWZpeCA9ICQocHJlZml4KQotCi1iaW5kaXI9JHtleGVjX3ByZWZpeH0vYmluCi1zYmluZGlyPSR7ZXhlY19wcmVmaXh9L3NiaW4KLWxpYmV4ZWNkaXI9JHtleGVjX3ByZWZpeH0vbGliZXhlYwotZGF0YWRpcj0ke3ByZWZpeH0vc2hhcmUKLXN5c2NvbmZkaXI9JHtwcmVmaXh9L2V0Ywotc2hhcmVkc3RhdGVkaXI9JHtwcmVmaXh9L2NvbQotbG9jYWxzdGF0ZWRpcj0ke3ByZWZpeH0vdmFyCi1saWJkaXI9JHtleGVjX3ByZWZpeH0vbGliCi1pbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCi1vbGRpbmNsdWRlZGlyPS91c3IvaW5jbHVkZQotaW5mb2Rpcj0ke3ByZWZpeH0vaW5mbwotbWFuZGlyPSR7cHJlZml4fS9tYW4KLWd4eF9pbmNsdWRlX2Rpcj0ke2luY2x1ZGVkaXJ9L2crKwotCi10b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXQpCi0KLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPQotCi1tYW4xZGlyID0gJChtYW5kaXIpL21hbjEKLW1hbjJkaXIgPSAkKG1hbmRpcikvbWFuMgotbWFuM2RpciA9ICQobWFuZGlyKS9tYW4zCi1tYW40ZGlyID0gJChtYW5kaXIpL21hbjQKLW1hbjVkaXIgPSAkKG1hbmRpcikvbWFuNQotbWFuNmRpciA9ICQobWFuZGlyKS9tYW42Ci1tYW43ZGlyID0gJChtYW5kaXIpL21hbjcKLW1hbjhkaXIgPSAkKG1hbmRpcikvbWFuOAotbWFuOWRpciA9ICQobWFuZGlyKS9tYW45Ci1pbmZvZGlyID0gJChwcmVmaXgpL2luZm8KLWluY2x1ZGVkaXIgPSAkKHByZWZpeCkvaW5jbHVkZQotIyBEaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGNvbXBpbGVyIGZpbmRzIGV4ZWN1dGFibGVzLCBsaWJyYXJpZXMsIGV0Yy4KLWxpYnN1YmRpciA9ICQobGliZGlyKS9nY2MtbGliLyQodGFyZ2V0X2FsaWFzKS8kKGdjY192ZXJzaW9uKQotR0RCX05MTV9ERVBTID0gCi0KLVNIRUxMID0gL2Jpbi9zaAotCi0jIElOU1RBTExfUFJPR1JBTV9BUkdTIGlzIGNoYW5nZWQgYnkgY29uZmlndXJlLmluIHRvIHVzZSAteCBmb3IgYQotIyBjeWd3aW4gaG9zdC4KLUlOU1RBTExfUFJPR1JBTV9BUkdTID0KLQotSU5TVEFMTCA9ICQoU0hFTEwpICQkcy9pbnN0YWxsLXNoIC1jCi1JTlNUQUxMX1BST0dSQU0gPSAkKElOU1RBTEwpICQoSU5TVEFMTF9QUk9HUkFNX0FSR1MpCi1JTlNUQUxMX1NDUklQVCA9ICQoSU5TVEFMTCkKLUlOU1RBTExfREFUQSA9ICQoSU5TVEFMTCkgLW0gNjQ0Ci0KLUlOU1RBTExfRE9TUkVMID0gaW5zdGFsbC1kb3NyZWwtZmFrZQotCi1BUyA9IGFzCi1BUiA9IGFyCi1BUl9GTEFHUyA9IHJjCi1DQyA9IGNjCi0KLSMgU3BlY2lhbCB2YXJpYWJsZXMgcGFzc2VkIGRvd24gaW4gRVhUUkFfR0NDX0ZMQUdTLiAgVGhleSBhcmUgZGVmaW5lZAotIyBoZXJlIHNvIHRoYXQgdGhleSBjYW4gYmUgb3ZlcnJpZGRlbiBieSBNYWtlZmlsZSBmcmFnbWVudHMuCi1IT1NUX0NDID0gJChDQ19GT1JfQlVJTEQpCi1IT1NUX1BSRUZJWCA9IAotSE9TVF9QUkVGSVhfMSA9IGxvc2VyLQotCi0jIFRoZXNlIGZsYWcgdmFsdWVzIGFyZSBub3JtYWxseSBvdmVycmlkZGVuIGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0LgotQ0ZMQUdTID0gLWcKLUNYWEZMQUdTID0gLWcgLU8yCi0KLUxJQkNGTEFHUyA9ICQoQ0ZMQUdTKQotQ0ZMQUdTX0ZPUl9UQVJHRVQgPSAkKENGTEFHUykKLUxERkxBR1NfRk9SX1RBUkdFVCA9IAotTElCQ0ZMQUdTX0ZPUl9UQVJHRVQgPSAkKENGTEFHU19GT1JfVEFSR0VUKQotUElDRkxBRyA9IAotUElDRkxBR19GT1JfVEFSR0VUID0gCi0KLUNISUxMRkxBR1MgPSAkKENGTEFHUykKLUNISUxMX0xJQiA9IC1sY2hpbGwKLUNYWCA9IGMrKwotCi0jIFVzZSAtTzIgdG8gc3RyZXNzIHRlc3QgdGhlIGNvbXBpbGVyLgotTElCQ1hYRkxBR1MgPSAkKENYWEZMQUdTKSAtZm5vLWltcGxpY2l0LXRlbXBsYXRlcyAtZmV4Y2VwdGlvbnMKLUNYWEZMQUdTX0ZPUl9UQVJHRVQgPSAkKENYWEZMQUdTKQotTElCQ1hYRkxBR1NfRk9SX1RBUkdFVCA9ICQoQ1hYRkxBR1NfRk9SX1RBUkdFVCkgLWZuby1pbXBsaWNpdC10ZW1wbGF0ZXMgLWZleGNlcHRpb25zCi0KLVJBTkxJQiA9IHJhbmxpYgotCi1ETExUT09MID0gZGxsdG9vbAotV0lORFJFUyA9IHdpbmRyZXMKLQotTk0gPSBubQotCi1MRCA9IGxkCi0KLSMgTm90IHBsYWluIEdaSVAsIHNpbmNlIGd6aXAgbG9va3MgdGhlcmUgZm9yIGV4dHJhIGNvbW1hbmQtbGluZSBvcHRpb25zLgotR1pJUFBST0cgPSBnemlwCi0KLSMgVGhlc2UgdmFsdWVzIGFyZSBzdWJzdGl0dXRlZCBieSBjb25maWd1cmUuCi1ERUZBVUxUX1lBQ0MgPSB5YWNjCi1ERUZBVUxUX0xFWCA9IGxleAotREVGQVVMVF9NNCA9IG00Ci0KLUJJU09OID0gYGlmIFsgLWYgJCRyL2Jpc29uL2Jpc29uIF0gOyB0aGVuIFwKLQkgICAgZWNobyAkJHIvYmlzb24vYmlzb24gLUwgJCRzL2Jpc29uLyA7IFwKLQkgZWxzZSBcCi0JICAgIGVjaG8gYmlzb24gOyBcCi0JIGZpYAotCi1ZQUNDID0gYGlmIFsgLWYgJCRyL2Jpc29uL2Jpc29uIF0gOyB0aGVuIFwKLQkgICAgZWNobyAkJHIvYmlzb24vYmlzb24gLXkgLUwgJCRzL2Jpc29uLyA7IFwKLQllbGlmIFsgLWYgJCRyL2J5YWNjL2J5YWNjIF0gOyB0aGVuIFwKLQkgICAgZWNobyAkJHIvYnlhY2MvYnlhY2MgOyBcCi0JZWxzZSBcCi0JICAgIGVjaG8gJHtERUZBVUxUX1lBQ0N9IDsgXAotCWZpYAotCi1MRVggPSBgaWYgWyAtZiAkJHIvZmxleC9mbGV4IF0gOyBcCi0JdGhlbiBlY2hvICQkci9mbGV4L2ZsZXggOyBcCi0JZWxzZSBlY2hvICR7REVGQVVMVF9MRVh9IDsgZmlgCi0KLU00ID0gYGlmIFsgLWYgJCRyL200L200IF0gOyBcCi0JdGhlbiBlY2hvICQkci9tNC9tNCA7IFwKLQllbHNlIGVjaG8gJHtERUZBVUxUX000fSA7IGZpYAotCi1NQUtFSU5GTyA9IGBpZiBbIC1mICQkci90ZXhpbmZvL21ha2VpbmZvL01ha2VmaWxlIF0gOyBcCi0JdGhlbiBlY2hvICQkci90ZXhpbmZvL21ha2VpbmZvL21ha2VpbmZvIDsgXAotCWVsc2UgZWNobyBtYWtlaW5mbyA7IGZpYAotCi0jIFRoaXMganVzdCBiZWNvbWVzIHBhcnQgb2YgdGhlIE1BS0VJTkZPIGRlZmluaXRpb24gcGFzc2VkIGRvd24gdG8KLSMgc3ViLW1ha2VzLiAgSXQgbGV0cyBmbGFncyBiZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lIHdoaWxlIHN0aWxsCi0jIHVzaW5nIHRoZSBtYWtlaW5mbyBmcm9tIHRoZSBvYmplY3QgdHJlZS4KLU1BS0VJTkZPRkxBR1MgPQotCi1FWFBFQ1QgPSBgaWYgWyAtZiAkJHIvZXhwZWN0L2V4cGVjdCBdIDsgXAotCXRoZW4gZWNobyAkJHIvZXhwZWN0L2V4cGVjdCA7IFwKLQllbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi0KLVJVTlRFU1QgPSBgaWYgWyAtZiAkJHMvZGVqYWdudS9ydW50ZXN0IF0gOyBcCi0JdGhlbiBlY2hvICQkcy9kZWphZ251L3J1bnRlc3QgOyBcCi0JZWxzZSBlY2hvIHJ1bnRlc3QgOyBmaWAKLQotCi0jIGNvbXBpbGVycyB0byB1c2UgdG8gY3JlYXRlIHByb2dyYW1zIHdoaWNoIG11c3QgYmUgcnVuIGluIHRoZSBidWlsZAotIyBlbnZpcm9ubWVudC4KLUNDX0ZPUl9CVUlMRCA9ICQoQ0MpCi1DWFhfRk9SX0JVSUxEID0gJChDWFgpCi0KLVNVQkRJUlMgPSAidGhpcyBpcyBzZXQgdmlhIGNvbmZpZ3VyZSwgZG9uJ3QgZWRpdCB0aGlzIgotT1RIRVJTID0gCi0KLSMgVGhpcyBpcyBzZXQgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgd2hpY2gKLSMgc2hvdWxkIGJlIGJ1aWx0IHVzaW5nIHRoZSB0YXJnZXQgdG9vbHMuCi0KLQotVEFSR0VUX0NPTkZJR0RJUlMgPSBsaWJpYmVydHkgbGliZ2xvc3MgJChTUEVDSUFMX0xJQlMpIG5ld2xpYiBsaWJpbyBsaWJyeCBsaWJzdGRjKysgbGliZysrIHdpbnN1cCBvcGNvZGVzIGJzcCBsaWJzdHViIGN5Z21vbgotCi0jIFRhcmdldCBsaWJyYXJpZXMgYXJlIHB1dCB1bmRlciB0aGlzIGRpcmVjdG9yeToKLSMgQ2hhbmdlZCBieSBjb25maWd1cmUgdG8gJCh0YXJnZXRfYWxpYXMpIGlmIGNyb3NzLgotVEFSR0VUX1NVQkRJUiA9IC4KLQotIyBUaGlzIGlzIHNldCBieSB0aGUgY29uZmlndXJlIHNjcmlwdCB0byB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byBjb25maWd1cmUuCi1DT05GSUdfQVJHVU1FTlRTID0gCi0KLSMgVGhpcyBpcyBzZXQgYnkgY29uZmlndXJlIHRvIFJFQUxMWV9TRVRfTElCX1BBVEggaWYgLS1lbmFibGUtc2hhcmVkCi0jIHdhcyB1c2VkLgotU0VUX0xJQl9QQVRIID0KLQotIyBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB1c2VkIGZvciB0aGUgcGF0aCB0bwotIyB0aGUgbGlicmFyaWVzLiAgVGhpcyBtYXkgYmUgY2hhbmdlZCBieSBjb25maWd1cmUuaW4uCi1SUEFUSF9FTlZWQVIgPSBMRF9MSUJSQVJZX1BBVEgKLQotIyBjb25maWd1cmUuaW4gc2V0cyBTRVRfTElCX1BBVEggdG8gdGhpcyBpZiAtLWVuYWJsZS1zaGFyZWQgd2FzIHVzZWQuCi1SRUFMTFlfU0VUX0xJQl9QQVRIID0gXAotICBpZiBbIHgiJCQkKFJQQVRIX0VOVlZBUikiICE9IHggXTsgdGhlbiBcCi0gICAgJChSUEFUSF9FTlZWQVIpPSQkci9iZmQ6JCRyL29wY29kZXM6JCQkKFJQQVRIX0VOVlZBUik7IFwKLSAgZWxzZSBcCi0gICAgJChSUEFUSF9FTlZWQVIpPSQkci9iZmQ6JCRyL29wY29kZXM7IFwKLSAgZmk7IFwKLSAgZXhwb3J0ICQoUlBBVEhfRU5WVkFSKTsKLQotQUxMID0gYWxsLm5vcm1hbAotSU5TVEFMTF9UQVJHRVQgPSBpbnN0YWxsZGlycyBcCi0JaW5zdGFsbC1nY2MgXAotCSQoSU5TVEFMTF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1gxMV9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX0RPU1JFTCkKLQotSU5TVEFMTF9UQVJHRVRfQ1JPU1MgPSBpbnN0YWxsZGlycyBcCi0JaW5zdGFsbC1nY2MtY3Jvc3MgXAotCSQoSU5TVEFMTF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1gxMV9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX0RPU1JFTCkKLQotQ0NfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgY2FzZSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgaW4gXAotICAgICAgICBpWzM0NTZdODYtKi1jeWd3aW4qKSBcCi0gICAgICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLyAtQiQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi8gLUwkJHIvJChUQVJHRVRfU1VCRElSKS93aW5zdXAgLWlkaXJhZnRlciAkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL3dpbnN1cC9pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL2luY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvc3lzL2N5Z3dpbiAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9zeXMvY3lnd2luMzIgLW5vc3RkaW5jOyBcCi0gICAgICAgICAgOzsgXAotICAgICAgICAqKSBcCi0gICAgICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLyAtaWRpcmFmdGVyICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLQkgIDs7IFwKLSAgICAgIGVzYWMgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBnY2MgfCBzZWQgLWUgJ3MveC94LycgJCR0OyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLSMgSWYgQ0NfRk9SX1RBUkdFVCBpcyBub3Qgb3ZlcnJpZGVuIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZW4gdGhpcwotIyB2YXJpYWJsZSBpcyBwYXNzZWQgZG93biB0byB0aGUgZ2NjIE1ha2VmaWxlLCB3aGVyZSBpdCBpcyB1c2VkIHRvCi0jIGJ1aWxkIGxpYmdjYzIuYS4gIFdlIGRlZmluZSBpdCBoZXJlIHNvIHRoYXQgaXQgY2FuIGl0c2VsZiBiZQotIyBvdmVycmlkZGVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCi1HQ0NfRk9SX1RBUkdFVCA9ICQkci9nY2MveGdjYyAtQiQkci9nY2MvCi0KLUNISUxMX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGVjaG8gJCRyL2djYy94Z2NjIC1CJCRyL2djYy8gLUwkJHIvZ2NjL2NoL3J1bnRpbWUvOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBnY2MgfCBzZWQgLWUgJ3MveC94LycgJCR0OyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUNYWF9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCi0gICAgICBjYXNlICIkKHRhcmdldF9jYW5vbmljYWwpIiBpbiBcCi0gICAgICAgIGlbMzQ1Nl04Ni0qLWN5Z3dpbiopIFwKLSAgICAgICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvIC1CJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliLyAtTCQkci8kKFRBUkdFVF9TVUJESVIpL3dpbnN1cCAtaWRpcmFmdGVyICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHMvd2luc3VwL2luY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvaW5jbHVkZSAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9zeXMvY3lnd2luIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL3N5cy9jeWd3aW4zMiAtbm9zdGRpbmM7IFwKLSAgICAgICAgICA7OyBcCi0gICAgICAgICopIFwKLSAgICAgICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvIC1pZGlyYWZ0ZXIgJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotCSAgOzsgXAotICAgICAgZXNhYyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvOyBcCi0gICAgZmk7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChDWFgpOyBcCi0gICAgZWxzZSBcCi0gICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBjKysgfCBzZWQgLWUgJ3MveC94LycgJCR0OyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUFTX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvZ2FzL2FzLW5ldyBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvZ2FzL2FzLW5ldyA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChBUyk7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBhcyB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUxEX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvbGQvbGQtbmV3IF0gOyB0aGVuIFwKLSAgICBlY2hvICQkci9sZC9sZC1uZXcgOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoTEQpOyBcCi0gICAgZWxzZSBcCi0gICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gbGQgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1ETExUT09MX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvYmludXRpbHMvZGxsdG9vbCBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvZGxsdG9vbCA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChETExUT09MKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIGRsbHRvb2wgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1XSU5EUkVTX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvYmludXRpbHMvd2luZHJlcyBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvd2luZHJlcyA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChXSU5EUkVTKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIHdpbmRyZXMgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1BUl9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2JpbnV0aWxzL2FyIF0gOyB0aGVuIFwKLSAgICBlY2hvICQkci9iaW51dGlscy9hciA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChBUik7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBhciB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLVJBTkxJQl9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2JpbnV0aWxzL3JhbmxpYiBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvcmFubGliIDsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKFJBTkxJQik7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyByYW5saWIgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1OTV9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2JpbnV0aWxzL25tLW5ldyBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvbm0tbmV3IDsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKE5NKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIG5tIHwgc2VkIC1lICdzL3gveC8nICQkdCA7IFwKLSAgICBmaTsgXAotICBmaWAKLQotIyBUaGUgZmlyc3QgcnVsZSBpbiB0aGUgZmlsZSBoYWQgYmV0dGVyIGJlIHRoaXMgb25lLiAgRG9uJ3QgcHV0IGFueSBhYm92ZSBpdC4KLSMgVGhpcyBsaXZlcyBoZXJlIHRvIGFsbG93IG1ha2VmaWxlIGZyYWdtZW50cyB0byBjb250YWluIGRlcGVuZGVuY2llcy4KLWFsbDogYWxsLm5vcm1hbAotLlBIT05ZOiBhbGwKLQotIyBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSBjb25maWcvbXQtKi4KLSMgVGhlIF9UQVJHRVRfIGlzIGJlY2F1c2UgdGhleSdyZSBzcGVjaWZpZWQgaW4gbXQtZm9vLgotIyBUaGUgX0hPU1RfIGlzIGJlY2F1c2UgdGhleSdyZSBwcm9ncmFtcyB0aGF0IHJ1biBvbiB0aGUgaG9zdC4KLUVYVFJBX1RBUkdFVF9IT1NUX0FMTF9NT0RVTEVTID0KLUVYVFJBX1RBUkdFVF9IT1NUX0lOU1RBTExfTU9EVUxFUyA9Ci1FWFRSQV9UQVJHRVRfSE9TVF9DSEVDS19NT0RVTEVTID0KLQotIyMjIyBob3N0IGFuZCB0YXJnZXQgc3BlY2lmaWMgbWFrZWZpbGUgZnJhZ21lbnRzIGNvbWUgaW4gaGVyZS4KLSMjIwotCi0jIEZsYWdzIHRvIHBhc3MgZG93biB0byBhbGwgc3ViLW1ha2VzLgotIyBQbGVhc2Uga2VlcCB0aGVzZSBpbiBhbHBoYWJldGljYWwgb3JkZXIuCi1CQVNFX0ZMQUdTX1RPX1BBU1MgPSBcCi0JIkFSX0ZMQUdTPSQoQVJfRkxBR1MpIiBcCi0JIkFSX0ZPUl9UQVJHRVQ9JChBUl9GT1JfVEFSR0VUKSIgXAotCSJBU19GT1JfVEFSR0VUPSQoQVNfRk9SX1RBUkdFVCkiIFwKLQkiQklTT049JChCSVNPTikiIFwKLQkiQ0NfRk9SX0JVSUxEPSQoQ0NfRk9SX0JVSUxEKSIgXAotCSJDQ19GT1JfVEFSR0VUPSQoQ0NfRk9SX1RBUkdFVCkiIFwKLQkiQ0ZMQUdTPSQoQ0ZMQUdTKSIgXAotCSJDRkxBR1NfRk9SX1RBUkdFVD0kKENGTEFHU19GT1JfVEFSR0VUKSIgXAotCSJDSElMTEZMQUdTPSQoQ0hJTExGTEFHUykiIFwKLQkiQ0hJTExfRk9SX1RBUkdFVD0kKENISUxMX0ZPUl9UQVJHRVQpIiBcCi0JIkNISUxMX0xJQj0kKENISUxMX0xJQikiIFwKLQkiQ1hYX0ZPUl9CVUlMRD0kKENYWF9GT1JfQlVJTEQpIiBcCi0JIkNYWEZMQUdTPSQoQ1hYRkxBR1MpIiBcCi0JIkNYWEZMQUdTX0ZPUl9UQVJHRVQ9JChDWFhGTEFHU19GT1JfVEFSR0VUKSIgXAotCSJDWFhfRk9SX1RBUkdFVD0kKENYWF9GT1JfVEFSR0VUKSIgXAotCSJETExUT09MX0ZPUl9UQVJHRVQ9JChETExUT09MX0ZPUl9UQVJHRVQpIiBcCi0JIklOU1RBTEw9JChJTlNUQUxMKSIgXAotCSJJTlNUQUxMX0RBVEE9JChJTlNUQUxMX0RBVEEpIiBcCi0JIklOU1RBTExfUFJPR1JBTT0kKElOU1RBTExfUFJPR1JBTSkiIFwKLQkiSU5TVEFMTF9TQ1JJUFQ9JChJTlNUQUxMX1NDUklQVCkiIFwKLQkiTERGTEFHUz0kKExERkxBR1MpIiBcCi0JIkxFWD0kKExFWCkiIFwKLQkiTERfRk9SX1RBUkdFVD0kKExEX0ZPUl9UQVJHRVQpIiBcCi0JIkxJQkNGTEFHUz0kKExJQkNGTEFHUykiIFwKLQkiTElCQ0ZMQUdTX0ZPUl9UQVJHRVQ9JChMSUJDRkxBR1NfRk9SX1RBUkdFVCkiIFwKLQkiTElCQ1hYRkxBR1M9JChMSUJDWFhGTEFHUykiIFwKLQkiTElCQ1hYRkxBR1NfRk9SX1RBUkdFVD0kKExJQkNYWEZMQUdTX0ZPUl9UQVJHRVQpIiBcCi0JIk00PSQoTTQpIiBcCi0JIk1BS0U9JChNQUtFKSIgXAotCSJNQUtFSU5GTz0kKE1BS0VJTkZPKSAkKE1BS0VJTkZPRkxBR1MpIiBcCi0JIk5NX0ZPUl9UQVJHRVQ9JChOTV9GT1JfVEFSR0VUKSIgXAotCSJSQU5MSUJfRk9SX1RBUkdFVD0kKFJBTkxJQl9GT1JfVEFSR0VUKSIgXAotCSJSUEFUSF9FTlZWQVI9JChSUEFUSF9FTlZWQVIpIiBcCi0JIlNIRUxMPSQoU0hFTEwpIiBcCi0JIkVYUEVDVD0kKEVYUEVDVCkiIFwKLQkiUlVOVEVTVD0kKFJVTlRFU1QpIiBcCi0JIlJVTlRFU1RGTEFHUz0kKFJVTlRFU1RGTEFHUykiIFwKLQkiVEFSR0VUX1NVQkRJUj0kKFRBUkdFVF9TVUJESVIpIiBcCi0JIldJTkRSRVNfRk9SX1RBUkdFVD0kKFdJTkRSRVNfRk9SX1RBUkdFVCkiIFwKLQkiWUFDQz0kKFlBQ0MpIiBcCi0JImJpbmRpcj0kKGJpbmRpcikiIFwKLQkiZGF0YWRpcj0kKGRhdGFkaXIpIiBcCi0JImV4ZWNfcHJlZml4PSQoZXhlY19wcmVmaXgpIiBcCi0JImluY2x1ZGVkaXI9JChpbmNsdWRlZGlyKSIgXAotCSJpbmZvZGlyPSQoaW5mb2RpcikiIFwKLQkibGliZGlyPSQobGliZGlyKSIgXAotCSJsaWJleGVjZGlyPSQobGliZXhlY2RpcikiIFwKLQkibGlzcGRpcj0kKGxpc3BkaXIpIiBcCi0JImxvY2Fsc3RhdGVkaXI9JChsb2NhbHN0YXRlZGlyKSIgXAotCSJtYW5kaXI9JChtYW5kaXIpIiBcCi0JIm9sZGluY2x1ZGVkaXI9JChvbGRpbmNsdWRlZGlyKSIgXAotCSJwcmVmaXg9JChwcmVmaXgpIiBcCi0JInNiaW5kaXI9JChzYmluZGlyKSIgXAotCSJzaGFyZWRzdGF0ZWRpcj0kKHNoYXJlZHN0YXRlZGlyKSIgXAotCSJzeXNjb25mZGlyPSQoc3lzY29uZmRpcikiIFwKLQkidG9vbGRpcj0kKHRvb2xkaXIpIiBcCi0JImd4eF9pbmNsdWRlX2Rpcj0kKGd4eF9pbmNsdWRlX2RpcikiIFwKLQkiZ2NjX3ZlcnNpb249JChnY2NfdmVyc2lvbikiIFwKLQkiZ2NjX3ZlcnNpb25fdHJpZ2dlcj0kKGdjY192ZXJzaW9uX3RyaWdnZXIpIiBcCi0JInRhcmdldF9hbGlhcz0kKHRhcmdldF9hbGlhcykiIFwKLQkibGlic3ViZGlyPSQobGlic3ViZGlyKSIKLQotIyBGbGFncyB0byBwYXNzIGRvd24gdG8gbW9zdCBzdWItbWFrZXMsIGluIHdoaWNoIHdlJ3JlIGJ1aWxkaW5nIHdpdGgKLSMgdGhlIGhvc3QgZW52aXJvbm1lbnQuCi0jIElmIGFueSB2YXJpYWJsZXMgYXJlIGFkZGVkIGhlcmUsIHRoZXkgbXVzdCBiZSBhZGRlZCB0byBkby0qLCBiZWxvdy4KLUVYVFJBX0hPU1RfRkxBR1MgPSBcCi0JJ0FSPSQoQVIpJyBcCi0JJ0FTPSQoQVMpJyBcCi0JJ0NDPSQoQ0MpJyBcCi0JJ0NYWD0kKENYWCknIFwKLQknRExMVE9PTD0kKERMTFRPT0wpJyBcCi0JJ0xEPSQoTEQpJyBcCi0JJ05NPSQoTk0pJyBcCi0JJ1JBTkxJQj0kKFJBTkxJQiknIFwKLQknV0lORFJFUz0kKFdJTkRSRVMpJwotCi1GTEFHU19UT19QQVNTID0gJChCQVNFX0ZMQUdTX1RPX1BBU1MpICQoRVhUUkFfSE9TVF9GTEFHUykKLQotIyBGbGFncyB0aGF0IGFyZSBjb25jZXJuZWQgd2l0aCB0aGUgbG9jYXRpb24gb2YgdGhlIFgxMSBpbmNsdWRlIGZpbGVzCi0jIGFuZCBsaWJyYXJ5IGZpbGVzCi0jCi0jIE5PVEU6IHVudGlsIHRoZSB0b3AtbGV2ZWwgaXMgZ2V0dGluZyB0aGUgdmFsdWVzIHZpYSBhdXRvY29uZiwgaXQgb25seQotIyBjYXVzZXMgcHJvYmxlbXMgdG8gaGF2ZSB0aGlzIHRvcC1sZXZlbCBNYWtlZmlsZSBvdmVycmlkaW5nIHRoZSBhdXRvY29uZi1zZXQKLSMgdmFsdWVzIGluIGNoaWxkIGRpcmVjdG9yaWVzLiAgT25seSB2YXJpYWJsZXMgdGhhdCBkb24ndCBjb25mbGljdCB3aXRoCi0jIGF1dG9jb25mJ2VkIG9uZXMgc2hvdWxkIGJlIHBhc3NlZCBieSBYMTFfRkxBR1NfVE9fUEFTUyBmb3Igbm93LgotIwotWDExX0ZMQUdTX1RPX1BBU1MgPSBcCi0JJ1gxMV9FWFRSQV9DRkxBR1M9JChYMTFfRVhUUkFfQ0ZMQUdTKScgXAotCSdYMTFfRVhUUkFfTElCUz0kKFgxMV9FWFRSQV9MSUJTKScKLQotIyBGbGFncyB0byBwYXNzIGRvd24gdG8gbWFrZXMgd2hpY2ggYXJlIGJ1aWx0IHdpdGggdGhlIHRhcmdldCBlbnZpcm9ubWVudC4KLSMgVGhlIGRvdWJsZSAkIGRlY3JlYXNlcyB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tYW5kIGxpbmU7IHRoZSB2YXJpYWJsZXMKLSMgYXJlIHNldCBpbiBCQVNFX0ZMQUdTX1RPX1BBU1MsIGFuZCB0aGUgc3ViLW1ha2Ugd2lsbCBleHBhbmQgdGhlbS4KLSMgSWYgYW55IHZhcmlhYmxlcyBhcmUgYWRkZWQgaGVyZSwgdGhleSBtdXN0IGJlIGFkZGVkIHRvIGRvLSosIGJlbG93LgotRVhUUkFfVEFSR0VUX0ZMQUdTID0gXAotCSdBUj0kJChBUl9GT1JfVEFSR0VUKScgXAotCSdBUz0kJChBU19GT1JfVEFSR0VUKScgXAotCSdDQz0kJChDQ19GT1JfVEFSR0VUKScgXAotCSdDRkxBR1M9JCQoQ0ZMQUdTX0ZPUl9UQVJHRVQpJyBcCi0JJ0NYWD0kJChDWFhfRk9SX1RBUkdFVCknIFwKLQknQ1hYRkxBR1M9JCQoQ1hYRkxBR1NfRk9SX1RBUkdFVCknIFwKLQknRExMVE9PTD0kJChETExUT09MX0ZPUl9UQVJHRVQpJyBcCi0JJ0xEPSQkKExEX0ZPUl9UQVJHRVQpJyBcCi0JJ0xJQkNGTEFHUz0kJChMSUJDRkxBR1NfRk9SX1RBUkdFVCknIFwKLQknTElCQ1hYRkxBR1M9JCQoTElCQ1hYRkxBR1NfRk9SX1RBUkdFVCknIFwKLQknTk09JCQoTk1fRk9SX1RBUkdFVCknIFwKLQknUkFOTElCPSQkKFJBTkxJQl9GT1JfVEFSR0VUKScgXAotCSdXSU5EUkVTPSQkKFdJTkRSRVNfRk9SX1RBUkdFVCknCi0KLVRBUkdFVF9GTEFHU19UT19QQVNTID0gJChCQVNFX0ZMQUdTX1RPX1BBU1MpICQoRVhUUkFfVEFSR0VUX0ZMQUdTKQotCi0jIEZsYWdzIHRvIHBhc3MgZG93biB0byBnY2MuICBnY2MgYnVpbGRzIGEgbGlicmFyeSwgbGliZ2NjLmEsIHNvIGl0Ci0jIHVuZm9ydHVuYXRlbHkgbmVlZHMgdGhlIG5hdGl2ZSBjb21waWxlciBhbmQgdGhlIHRhcmdldCBhciBhbmQKLSMgcmFubGliLgotIyBJZiBhbnkgdmFyaWFibGVzIGFyZSBhZGRlZCBoZXJlLCB0aGV5IG11c3QgYmUgYWRkZWQgdG8gZG8tKiwgYmVsb3cuCi0jIFRoZSBIT1NUXyogdmFyaWFibGVzIGFyZSBhIHNwZWNpYWwgY2FzZSwgd2hpY2ggYXJlIHVzZWQgZm9yIHRoZSBnY2MKLSMgY3Jvc3MtYnVpbGRpbmcgc2NoZW1lLgotRVhUUkFfR0NDX0ZMQUdTID0gXAotCSdBUj0kKEFSKScgXAotCSdBUz0kKEFTKScgXAotCSdDQz0kKENDKScgXAotCSdDWFg9JChDWFgpJyBcCi0JJ0RMTFRPT0w9JCQoRExMVE9PTF9GT1JfVEFSR0VUKScgXAotCSdIT1NUX0NDPSQoQ0NfRk9SX0JVSUxEKScgXAotCSdIT1NUX1BSRUZJWD0kKEhPU1RfUFJFRklYKScgXAotCSdIT1NUX1BSRUZJWF8xPSQoSE9TVF9QUkVGSVhfMSknIFwKLQknTk09JChOTSknIFwKLQknUkFOTElCPSQoUkFOTElCKScgXAotCSdXSU5EUkVTPSQkKFdJTkRSRVNfRk9SX1RBUkdFVCknIFwKLQkiR0NDX0ZPUl9UQVJHRVQ9JChHQ0NfRk9SX1RBUkdFVCkiIFwKLQkiYGVjaG8gJ0xBTkdVQUdFUz0kKExBTkdVQUdFUyknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAotCSJgZWNobyAnU1RNUF9GSVhQUk9UTz0kKFNUTVBfRklYUFJPVE8pJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJTUlUU19IX1RFU1Q9JChMSU1JVFNfSF9URVNUKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCi0JImBlY2hvICdMSUJHQ0MxX1RFU1Q9JChMSUJHQ0MxX1RFU1QpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJQkdDQzJfQ0ZMQUdTPSQoTElCR0NDMl9DRkxBR1MpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJQkdDQzJfREVCVUdfQ0ZMQUdTPSQoTElCR0NDMl9ERUJVR19DRkxBR1MpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJQkdDQzJfSU5DTFVERVM9JChMSUJHQ0MyX0lOQ0xVREVTKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCi0JImBlY2hvICdFTlFVSVJFPSQoRU5RVUlSRSknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAotCSJgZWNobyAnQk9PVF9DRkxBR1M9JChCT09UX0NGTEFHUyknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIKLQotR0NDX0ZMQUdTX1RPX1BBU1MgPSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgJChFWFRSQV9HQ0NfRkxBR1MpCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaCBhcmUgY29tcGlsZWQKLSMgdXNpbmcgJChGTEFHU19UT19QQVNTKS4KLUFMTF9NT0RVTEVTID0gXAotCWFsbC1hcGFjaGUgXAotCWFsbC1hc2ggXAotCWFsbC1hdXRvY29uZiBcCi0JYWxsLWF1dG9tYWtlIFwKLQlhbGwtYmFzaCBcCi0JYWxsLWJmZCBcCi0JYWxsLWJpbnV0aWxzIFwKLQlhbGwtYmlzb24gXAotCWFsbC1ieWFjYyBcCi0JYWxsLWJ6aXAyIFwKLQlhbGwtY3Zzc3JjIFwKLQlhbGwtZGIgXAotCWFsbC1kZWphZ251IFwKLQlhbGwtZGlmZiBcCi0JYWxsLWRvc3V0aWxzIFwKLQlhbGwtZXRjIFwKLQlhbGwtZmlsZXV0aWxzIFwKLQlhbGwtZmluZHV0aWxzIFwKLQlhbGwtZmluZCBcCi0JYWxsLWZsZXggXAotCWFsbC1nYXMgXAotCWFsbC1nYXdrIFwKLQlhbGwtZ2V0dGV4dCBcCi0JYWxsLWdudXNlcnYgXAotCWFsbC1ncHJvZiBcCi0JYWxsLWdyZXAgXAotCWFsbC1ncmV6IFwKLQlhbGwtZ3ppcCBcCi0JYWxsLWhlbGxvIFwKLQlhbGwtaW5kZW50IFwKLQlhbGwtaW5ldCBcCi0JYWxsLWludGwgXAotCWFsbC1pc3BlbGwgXAotCWFsbC1pdGNsIFwKLQlhbGwtbGQgXAotCWFsbC1saWJndWkgXAotCWFsbC1saWJpYmVydHkgXAotCWFsbC1saWJ0b29sIFwKLQlhbGwtbTQgXAotCWFsbC1tYWtlIFwKLQlhbGwtbW1hbGxvYyBcCi0JYWxsLW9wY29kZXMgXAotCWFsbC1wYXRjaCBcCi0JYWxsLXBlcmwgXAotCWFsbC1wcm1zIFwKLQlhbGwtcmNzIFwKLQlhbGwtcmVhZGxpbmUgXAotCWFsbC1yZWxlYXNlIFwKLQlhbGwtcmVjb2RlIFwKLQlhbGwtc2VkIFwKLQlhbGwtc2VuZC1wciBcCi0JYWxsLXNoZWxsdXRpbHMgXAotCWFsbC1zaW0gXAotCWFsbC10YXIgXAotCWFsbC10Y2wgXAotCWFsbC10Y2w4LjEgXAotCWFsbC10ZXhpbmZvIFwKLQlhbGwtdGV4dHV0aWxzIFwKLQlhbGwtdGdhcyBcCi0JYWxsLXRpbWUgXAotCWFsbC11dWRlY29kZSBcCi0JYWxsLXdkaWZmIFwKLQlhbGwtemlwIFwKLQkkKEVYVFJBX1RBUkdFVF9IT1NUX0FMTF9NT0RVTEVTKQotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBjaGVjayB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlCi0jIGNvbXBpbGVkIHVzaW5nICQoRkxBR1NfVE9fUEFTUykuCi0jCi0jIFRoZSBsaXN0IGlzIGluIHR3byBwYXJ0cy4gIFRoZSBmaXJzdCBsaXN0cyB0aG9zZSB0b29scyB3aGljaAotIyBhcmUgdGVzdGVkIGFzIHBhcnQgb2YgdGhlIGhvc3QncyBuYXRpdmUgdG9vbC1jaGFpbiwgYW5kIG5vdAotIyB0ZXN0ZWQgaW4gYSBjcm9zcyBjb25maWd1cmF0aW9uLgotTkFUSVZFX0NIRUNLX01PRFVMRVMgPSBcCi0JY2hlY2stYmlzb24gXAotCWNoZWNrLWJ5YWNjIFwKLQljaGVjay1mbGV4IFwKLQljaGVjay16aXAKLQotQ1JPU1NfQ0hFQ0tfTU9EVUxFUyA9IFwKLQljaGVjay1hcGFjaGUgXAotCWNoZWNrLWFzaCBcCi0JY2hlY2stYXV0b2NvbmYgXAotCWNoZWNrLWF1dG9tYWtlIFwKLQljaGVjay1iYXNoIFwKLQljaGVjay1iZmQgXAotCWNoZWNrLWJpbnV0aWxzIFwKLQljaGVjay1iemlwMiBcCi0JY2hlY2stY3Zzc3JjIFwKLQljaGVjay1kYiBcCi0JY2hlY2stZGVqYWdudSBcCi0JY2hlY2stZGlmZiBcCi0JY2hlY2stZXRjIFwKLQljaGVjay1maWxldXRpbHMgXAotCWNoZWNrLWZpbmR1dGlscyBcCi0JY2hlY2stZmluZCBcCi0JY2hlY2stZ2FzIFwKLQljaGVjay1nYXdrIFwKLQljaGVjay1nZXR0ZXh0IFwKLQljaGVjay1nbnVzZXJ2IFwKLQljaGVjay1ncHJvZiBcCi0JY2hlY2stZ3JlcCBcCi0JY2hlY2stZ3ppcCBcCi0JY2hlY2staGVsbG8gXAotCWNoZWNrLWluZGVudCBcCi0JY2hlY2staW5ldCBcCi0JY2hlY2staW50bCBcCi0JY2hlY2staXNwZWxsIFwKLQljaGVjay1pdGNsIFwKLQljaGVjay1sZCBcCi0JY2hlY2stbGliZ3VpIFwKLQljaGVjay1saWJpYmVydHkgXAotCWNoZWNrLWxpYnRvb2wgXAotCWNoZWNrLW00IFwKLQljaGVjay1tYWtlIFwKLQljaGVjay1tbWNoZWNrb2MgXAotCWNoZWNrLW9wY29kZXMgXAotCWNoZWNrLXBhdGNoIFwKLQljaGVjay1wZXJsIFwKLQljaGVjay1wcm1zIFwKLQljaGVjay1yY3MgXAotCWNoZWNrLXJlYWRsaW5lIFwKLQljaGVjay1yZWNvZGUgXAotCWNoZWNrLXNlZCBcCi0JY2hlY2stc2VuZC1wciBcCi0JY2hlY2stc2hlbGx1dGlscyBcCi0JY2hlY2stc2ltIFwKLQljaGVjay10YXIgXAotCWNoZWNrLXRjbCBcCi0JY2hlY2stdGV4aW5mbyBcCi0JY2hlY2stdGV4dHV0aWxzIFwKLQljaGVjay10Z2FzIFwKLQljaGVjay10aW1lIFwKLQljaGVjay11dWRlY29kZSBcCi0JY2hlY2std2RpZmYgXAotCSQoRVhUUkFfVEFSR0VUX0hPU1RfQ0hFQ0tfTU9EVUxFUykKLQotQ0hFQ0tfTU9EVUxFUz0kKE5BVElWRV9DSEVDS19NT0RVTEVTKSAkKENST1NTX0NIRUNLX01PRFVMRVMpCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGluc3RhbGwgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKEZMQUdTX1RPX1BBU1MpLgotIyBXZSBwdXQgaW5zdGFsbC1vcGNvZGVzIGJlZm9yZSBpbnN0YWxsLWJpbnV0aWxzIGJlY2F1c2UgdGhlIGluc3RhbGxlZAotIyBiaW51dGlscyBtaWdodCBiZSBvbiBQQVRILCBhbmQgdGhleSBtaWdodCBuZWVkIHRoZSBzaGFyZWQgb3Bjb2RlcwotIyBsaWJyYXJ5LgotIyBXZSBwdXQgaW5zdGFsbC10Y2wgYmVmb3JlIGluc3RhbGwtaXRjbCBiZWNhdXNlIGl0Y2wgd2FudHMgdG8gcnVuIGEKLSMgcHJvZ3JhbSBvbiBpbnN0YWxsYXRpb24gd2hpY2ggdXNlcyB0aGUgVGNsIGxpYnJhcmllcy4KLUlOU1RBTExfTU9EVUxFUyA9IFwKLQlpbnN0YWxsLWFwYWNoZSBcCi0JaW5zdGFsbC1hc2ggXAotCWluc3RhbGwtYXV0b2NvbmYgXAotCWluc3RhbGwtYXV0b21ha2UgXAotCWluc3RhbGwtYmFzaCBcCi0JaW5zdGFsbC1iZmQgXAotCWluc3RhbGwtYnppcDIgXAotCWluc3RhbGwtb3Bjb2RlcyBcCi0JaW5zdGFsbC1iaW51dGlscyBcCi0JaW5zdGFsbC1iaXNvbiBcCi0JaW5zdGFsbC1ieWFjYyBcCi0JaW5zdGFsbC1jdnNzcmMgXAotCWluc3RhbGwtZGIgXAotCWluc3RhbGwtZGVqYWdudSBcCi0JaW5zdGFsbC1kaWZmIFwKLQlpbnN0YWxsLWRvc3V0aWxzIFwKLQlpbnN0YWxsLWV0YyBcCi0JaW5zdGFsbC1maWxldXRpbHMgXAotCWluc3RhbGwtZmluZHV0aWxzIFwKLQlpbnN0YWxsLWZpbmQgXAotCWluc3RhbGwtZmxleCBcCi0JaW5zdGFsbC1nYXMgXAotCWluc3RhbGwtZ2F3ayBcCi0JaW5zdGFsbC1nZXR0ZXh0IFwKLQlpbnN0YWxsLWdudXNlcnYgXAotCWluc3RhbGwtZ3Byb2YgXAotCWluc3RhbGwtZ3JlcCBcCi0JaW5zdGFsbC1ncmV6IFwKLQlpbnN0YWxsLWd6aXAgXAotCWluc3RhbGwtaGVsbG8gXAotCWluc3RhbGwtaW5kZW50IFwKLQlpbnN0YWxsLWluZXQgXAotCWluc3RhbGwtaW50bCBcCi0JaW5zdGFsbC1pc3BlbGwgXAotCWluc3RhbGwtdGNsIFwKLQlpbnN0YWxsLXRjbDguMSBcCi0JaW5zdGFsbC1pdGNsIFwKLQlpbnN0YWxsLWxkIFwKLQlpbnN0YWxsLWxpYmd1aSBcCi0JaW5zdGFsbC1saWJpYmVydHkgXAotCWluc3RhbGwtbGlidG9vbCBcCi0JaW5zdGFsbC1tNCBcCi0JaW5zdGFsbC1tYWtlIFwKLQlpbnN0YWxsLW1tYWxsb2MgXAotCWluc3RhbGwtcGF0Y2ggXAotCWluc3RhbGwtcGVybCBcCi0JaW5zdGFsbC1wcm1zIFwKLQlpbnN0YWxsLXJjcyBcCi0JaW5zdGFsbC1yZWFkbGluZSBcCi0JaW5zdGFsbC1yZWNvZGUgXAotCWluc3RhbGwtc2VkIFwKLQlpbnN0YWxsLXNlbmQtcHIgXAotCWluc3RhbGwtc2hlbGx1dGlscyBcCi0JaW5zdGFsbC1zaW0gXAotCWluc3RhbGwtdGFyIFwKLQlpbnN0YWxsLXRleGluZm8gXAotCWluc3RhbGwtdGV4dHV0aWxzIFwKLQlpbnN0YWxsLXRnYXMgXAotCWluc3RhbGwtdGltZSBcCi0JaW5zdGFsbC11dWRlY29kZSBcCi0JaW5zdGFsbC13ZGlmZiBcCi0JaW5zdGFsbC16aXAgXAotCSQoRVhUUkFfVEFSR0VUX0hPU1RfSU5TVEFMTF9NT0RVTEVTKQotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlIGNvbXBpbGVkCi0jIHVzaW5nICQoWDExX0ZMQUdTX1RPX1BBU1MpLgotQUxMX1gxMV9NT0RVTEVTID0gXAotCWFsbC1lbWFjcyBcCi0JYWxsLWVtYWNzMTkgXAotCWFsbC1nZGIgXAotCWFsbC1leHBlY3QgXAotCWFsbC1nYXNoIFwKLQlhbGwtZ3VpbGUgXAotCWFsbC10Y2xYIFwKLQlhbGwtdGsgXAotCWFsbC10azguMSBcCi0JYWxsLXRpeAotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBjaGVjayB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlCi0jIGNvbXBpbGVkIHVzaW5nICQoWDExX0ZMQUdTX1RPX1BBU1MpLgotQ0hFQ0tfWDExX01PRFVMRVMgPSBcCi0JY2hlY2stZW1hY3MgXAotCWNoZWNrLWdkYiBcCi0JY2hlY2stZ3VpbGUgXAotCWNoZWNrLWV4cGVjdCBcCi0JY2hlY2stZ2FzaCBcCi0JY2hlY2stdGNsWCBcCi0JY2hlY2stdGsgXAotCWNoZWNrLXRpeAotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBpbnN0YWxsIHRhcmdldHMgZm9yIGFsbCB0aGUgbW9kdWxlcyB3aGljaCBhcmUKLSMgY29tcGlsZWQgdXNpbmcgJChYMTFfRkxBR1NfVE9fUEFTUykuCi1JTlNUQUxMX1gxMV9NT0RVTEVTID0gXAotCWluc3RhbGwtZW1hY3MgXAotCWluc3RhbGwtZW1hY3MxOSBcCi0JaW5zdGFsbC1nZGIgXAotCWluc3RhbGwtZ3VpbGUgXAotCWluc3RhbGwtZXhwZWN0IFwKLQlpbnN0YWxsLWdhc2ggXAotCWluc3RhbGwtdGNsWCBcCi0JaW5zdGFsbC10ayBcCi0JaW5zdGFsbC10azguMSBcCi0JaW5zdGFsbC10aXgKLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZSBjb21waWxlZAotIyB1c2luZyAkKFRBUkdFVF9GTEFHU19UT19QQVNTKS4KLUFMTF9UQVJHRVRfTU9EVUxFUyA9IFwKLQlhbGwtdGFyZ2V0LWxpYmlvIFwKLQlhbGwtdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JYWxsLXRhcmdldC1saWJyeCBcCi0JYWxsLXRhcmdldC1saWJnKysgXAotCWFsbC10YXJnZXQtbmV3bGliIFwKLQlhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgXAotCWFsbC10YXJnZXQtd2luc3VwIFwKLQlhbGwtdGFyZ2V0LWxpYmdsb3NzIFwKLQlhbGwtdGFyZ2V0LWxpYmliZXJ0eSBcCi0JYWxsLXRhcmdldC1ncGVyZiBcCi0JYWxsLXRhcmdldC1leGFtcGxlcyBcCi0JYWxsLXRhcmdldC1saWJzdHViIFwKLQlhbGwtdGFyZ2V0LWJzcCBcCi0JYWxsLXRhcmdldC1jeWdtb24KLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgY29uZmlndXJlIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaAotIyBhcmUgY29tcGlsZWQgdXNpbmcgdGhlIHRhcmdldCB0b29scy4KLUNPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyA9IFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYmlvIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JY29uZmlndXJlLXRhcmdldC1saWJyeCBcCi0JY29uZmlndXJlLXRhcmdldC1saWJnKysgXAotCWNvbmZpZ3VyZS10YXJnZXQtbmV3bGliIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYnRlcm1jYXAgXAotCWNvbmZpZ3VyZS10YXJnZXQtd2luc3VwIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYmdsb3NzIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYmliZXJ0eSBcCi0JY29uZmlndXJlLXRhcmdldC1ncGVyZiBcCi0JY29uZmlndXJlLXRhcmdldC1leGFtcGxlcyBcCi0JY29uZmlndXJlLXRhcmdldC1saWJzdHViIFwKLQljb25maWd1cmUtdGFyZ2V0LWJzcCBcCi0JY29uZmlndXJlLXRhcmdldC1jeWdtb24KLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgY2hlY2sgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKFRBUkdFVF9GTEFHU19UT19QQVNTKS4KLUNIRUNLX1RBUkdFVF9NT0RVTEVTID0gXAotCWNoZWNrLXRhcmdldC1saWJpbyBcCi0JY2hlY2stdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JY2hlY2stdGFyZ2V0LWxpYmcrKyBcCi0JY2hlY2stdGFyZ2V0LW5ld2xpYiBcCi0JY2hlY2stdGFyZ2V0LXdpbnN1cCBcCi0JY2hlY2stdGFyZ2V0LWxpYmliZXJ0eSBcCi0JY2hlY2stdGFyZ2V0LWdwZXJmCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGluc3RhbGwgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKFRBUkdFVF9GTEFHU19UT19QQVNTKS4KLUlOU1RBTExfVEFSR0VUX01PRFVMRVMgPSBcCi0JaW5zdGFsbC10YXJnZXQtbGliaW8gXAotCWluc3RhbGwtdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JaW5zdGFsbC10YXJnZXQtbGliZysrIFwKLQlpbnN0YWxsLXRhcmdldC1uZXdsaWIgXAotCWluc3RhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgXAotCWluc3RhbGwtdGFyZ2V0LXdpbnN1cCBcCi0JaW5zdGFsbC10YXJnZXQtbGliZ2xvc3MgXAotCWluc3RhbGwtdGFyZ2V0LWxpYmliZXJ0eSBcCi0JaW5zdGFsbC10YXJnZXQtYnNwIFwKLQlpbnN0YWxsLXRhcmdldC1ncGVyZgotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSB0YXJnZXRzIGZvciB3aGljaCB3ZSBjYW4gZG8gYSBjbGVhbi17dGFyZ2V0fS4KLUNMRUFOX01PRFVMRVMgPSBcCi0JY2xlYW4tYXBhY2hlIFwKLQljbGVhbi1hc2ggXAotCWNsZWFuLWF1dG9jb25mIFwKLQljbGVhbi1hdXRvbWFrZSBcCi0JY2xlYW4tYmFzaCBcCi0JY2xlYW4tYmZkIFwKLQljbGVhbi1iaW51dGlscyBcCi0JY2xlYW4tYmlzb24gXAotCWNsZWFuLWJ5YWNjIFwKLQljbGVhbi1iemlwMiBcCi0JY2xlYW4tY3Zzc3JjIFwKLQljbGVhbi1kYiBcCi0JY2xlYW4tZGVqYWdudSBcCi0JY2xlYW4tZGlmZiBcCi0JY2xlYW4tZG9zdXRpbHMgXAotCWNsZWFuLWV0YyBcCi0JY2xlYW4tZmlsZXV0aWxzIFwKLQljbGVhbi1maW5kdXRpbHMgXAotCWNsZWFuLWZpbmQgXAotCWNsZWFuLWZsZXggXAotCWNsZWFuLWdhcyBcCi0JY2xlYW4tZ2F3ayBcCi0JY2xlYW4tZ2V0dGV4dCBcCi0JY2xlYW4tZ251c2VydiBcCi0JY2xlYW4tZ3Byb2YgXAotCWNsZWFuLWdyZXAgXAotCWNsZWFuLWdyZXogXAotCWNsZWFuLWd6aXAgXAotCWNsZWFuLWhlbGxvIFwKLQljbGVhbi1pbmRlbnQgXAotCWNsZWFuLWluZXQgXAotCWNsZWFuLWludGwgXAotCWNsZWFuLWlzcGVsbCBcCi0JY2xlYW4taXRjbCBcCi0JY2xlYW4tbGQgXAotCWNsZWFuLWxpYmd1aSBcCi0JY2xlYW4tbGliaWJlcnR5IFwKLQljbGVhbi1saWJ0b29sIFwKLQljbGVhbi1tNCBcCi0JY2xlYW4tbWFrZSBcCi0JY2xlYW4tbW1hbGxvYyBcCi0JY2xlYW4tb3Bjb2RlcyBcCi0JY2xlYW4tcGF0Y2ggXAotCWNsZWFuLXBlcmwgXAotCWNsZWFuLXBybXMgXAotCWNsZWFuLXJjcyBcCi0JY2xlYW4tcmVhZGxpbmUgXAotCWNsZWFuLXJlbGVhc2UgXAotCWNsZWFuLXJlY29kZSBcCi0JY2xlYW4tc2VkIFwKLQljbGVhbi1zZW5kLXByIFwKLQljbGVhbi1zaGVsbHV0aWxzIFwKLQljbGVhbi1zaW0gXAotCWNsZWFuLXRhciBcCi0JY2xlYW4tdGNsIFwKLQljbGVhbi10ZXhpbmZvIFwKLQljbGVhbi10ZXh0dXRpbHMgXAotCWNsZWFuLXRnYXMgXAotCWNsZWFuLXRpbWUgXAotCWNsZWFuLXV1ZGVjb2RlIFwKLQljbGVhbi13ZGlmZiBcCi0JY2xlYW4temlwCi0KLSMgQWxsIG9mIHRoZSB0YXJnZXQgbW9kdWxlcyB0aGF0IGNhbiBiZSBjbGVhbmVkCi1DTEVBTl9UQVJHRVRfTU9EVUxFUyA9IFwKLQljbGVhbi10YXJnZXQtbGliaW8gXAotCWNsZWFuLXRhcmdldC1saWJzdGRjKysgXAotCWNsZWFuLXRhcmdldC1saWJyeCBcCi0JY2xlYW4tdGFyZ2V0LWxpYmcrKyBcCi0JY2xlYW4tdGFyZ2V0LW5ld2xpYiBcCi0JY2xlYW4tdGFyZ2V0LXdpbnN1cCBcCi0JY2xlYW4tdGFyZ2V0LWxpYmdsb3NzIFwKLQljbGVhbi10YXJnZXQtbGliaWJlcnR5IFwKLQljbGVhbi10YXJnZXQtZ3BlcmYgXAotCWNsZWFuLXRhcmdldC1leGFtcGxlcyBcCi0JY2xlYW4tdGFyZ2V0LWxpYnN0dWIgXAotCWNsZWFuLXRhcmdldC1ic3AgXAotCWNsZWFuLXRhcmdldC1jeWdtb24KLQotIyBBbGwgb2YgdGhlIHgxMSBtb2R1bGVzIHRoYXQgY2FuIGJlIGNsZWFuZWQKLUNMRUFOX1gxMV9NT0RVTEVTID0gXAotCWNsZWFuLWVtYWNzIFwKLQljbGVhbi1lbWFjczE5IFwKLQljbGVhbi1nZGIgXAotCWNsZWFuLWV4cGVjdCBcCi0JY2xlYW4tZ2FzaCBcCi0JY2xlYW4tZ3VpbGUgXAotCWNsZWFuLXRjbFggXAotCWNsZWFuLXRrIFwKLQljbGVhbi10aXgKLQotIyBUaGUgdGFyZ2V0IGJ1aWx0IGZvciBhIG5hdGl2ZSBidWlsZC4KLS5QSE9OWTogYWxsLm5vcm1hbAotYWxsLm5vcm1hbDogXAotCSQoQUxMX01PRFVMRVMpIFwKLQkkKEFMTF9YMTFfTU9EVUxFUykgXAotCSQoQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JYWxsLWdjYwotCi0jIERvIGEgdGFyZ2V0IGZvciBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzLiAgQSBgYG1ha2UgZG8tWCcnIHdpbGwgZG8gYQotIyBgYG1ha2UgWCcnIGluIGFsbCBzdWJkaXJlY3RvcmllcyAoYmVjYXVzZSwgaW4gZ2VuZXJhbCwgdGhlcmUgaXMgYQotIyBkZXBlbmRlbmN5IChiZWxvdykgb2YgWCB1cG9uIGRvLVgsIGEgYGBtYWtlIFgnJyB3aWxsIGFsc28gZG8gdGhpcywKLSMgYnV0IGl0IG1heSBkbyBhZGRpdGlvbmFsIHdvcmsgYXMgd2VsbCkuCi0jIFRoaXMgdGFyZ2V0IGVuc3VyZXMgdGhhdCAkKEJBU0VfRkxBR1NfVE9fUEFTUykgYXBwZWFycyBvbmx5IG9uY2UsCi0jIGJlY2F1c2UgaXQgaXMgc28gbGFyZ2UgdGhhdCBpdCBjYW4gZWFzaWx5IG92ZXJmbG93IHRoZSBjb21tYW5kIGxpbmUKLSMgbGVuZ3RoIGxpbWl0IG9uIHNvbWUgc3lzdGVtcy4KLURPX1ggPSBcCi0JZG8tY2xlYW4gXAotCWRvLWRpc3RjbGVhbiBcCi0JZG8tZHZpIFwKLQlkby1pbmZvIFwKLQlkby1pbnN0YWxsLWluZm8gXAotCWRvLWluc3RhbGxjaGVjayBcCi0JZG8tbW9zdGx5Y2xlYW4gXAotCWRvLW1haW50YWluZXItY2xlYW4gXAotCWRvLVRBR1MKLS5QSE9OWTogJChET19YKQotJChET19YKToKLQlAdGFyZ2V0PWBlY2hvICRAIHwgc2VkIC1lICdzL15kby0vLydgOyBcCi0Jcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JJChTRVRfTElCX1BBVEgpIFwKLQlmb3IgaSBpbiAkKFNVQkRJUlMpIC1kdW1teS07IGRvIFwKLQkgIGlmIFsgLWYgLi8kJGkvTWFrZWZpbGUgXTsgdGhlbiBcCi0JICAgIGNhc2UgJCRpIGluIFwKLQkgICAgZ2NjKSBcCi0JICAgICAgZm9yIGZsYWcgaW4gJChFWFRSQV9HQ0NfRkxBR1MpOyBkbyBcCi0JCWV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJ3wiYDsgXAotCSAgICAgIGRvbmU7IFwKLQkgICAgICA7OyBcCi0JICAgICopIFwKLQkgICAgICBmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpOyBkbyBcCi0JCWV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJ3wiYDsgXAotCSAgICAgIGRvbmU7IFwKLQkgICAgICA7OyBcCi0JICAgIGVzYWMgOyBcCi0JICAgIGV4cG9ydCBBUiBBUyBDQyBDWFggTEQgTk0gUkFOTElCIERMTFRPT0wgV0lORFJFUzsgXAotCSAgICBpZiAoY2QgLi8kJGk7IFwKLQkgICAgICAgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKLQkJCSJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAotCQkJIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCi0JCQkiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKLQkJCSQke3RhcmdldH0pOyBcCi0JICAgIHRoZW4gdHJ1ZTsgZWxzZSBleGl0IDE7IGZpOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCUB0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvXmRvLS8vJ2A7IFwKLQlyPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkkKFNFVF9MSUJfUEFUSCkgXAotCWZvciBpIGluICQoVEFSR0VUX0NPTkZJR0RJUlMpIC1kdW1teS07IGRvIFwKLQkgIGlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJGkvTWFrZWZpbGUgXTsgdGhlbiBcCi0JICAgIGZvciBmbGFnIGluICQoRVhUUkFfVEFSR0VUX0ZMQUdTKTsgZG8gXAotCQlldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMid8ImA7IFwKLQkgICAgZG9uZTsgXAotCSAgICBleHBvcnQgQVIgQVMgQ0MgQ1hYIExEIE5NIFJBTkxJQiBETExUT09MIFdJTkRSRVM7IFwKLQkgICAgaWYgKGNkICQoVEFSR0VUX1NVQkRJUikvJCRpOyBcCi0JICAgICAgICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCi0JCQkiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKLQkJCSJSQU5MSUI9JCR7UkFOTElCfSIgXAotCQkJIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCi0JCQkkJHt0YXJnZXR9KTsgXAotCSAgICB0aGVuIHRydWU7IGVsc2UgZXhpdCAxOyBmaTsgXAotCSAgZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQotIyBIZXJlIGFyZSB0aGUgdGFyZ2V0cyB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBkby1YIHRhcmdldHMuCi0KLS5QSE9OWTogaW5mbyBpbnN0YWxsY2hlY2sgZHZpIGluc3RhbGwtaW5mbwotLlBIT05ZOiBjbGVhbiBkaXN0Y2xlYW4gbW9zdGx5Y2xlYW4gbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4KLS5QSE9OWTogbG9jYWwtY2xlYW4gbG9jYWwtZGlzdGNsZWFuIGxvY2FsLW1haW50YWluZXItY2xlYW4KLWluZm86IGRvLWluZm8KLWluc3RhbGxjaGVjazogZG8taW5zdGFsbGNoZWNrCi1kdmk6IGRvLWR2aQotCi0jIE1ha2Ugc3VyZSBtYWtlaW5mbyBpcyBidWlsdCBiZWZvcmUgd2UgZG8gYSBgbWFrZSBpbmZvJy4KLWRvLWluZm86IGFsbC10ZXhpbmZvCi0KLWluc3RhbGwtaW5mbzogZG8taW5zdGFsbC1pbmZvIGRpci5pbmZvCi0Jcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCWlmIFsgLWYgZGlyLmluZm8gXSA7IHRoZW4gXAotCSAgJChJTlNUQUxMX0RBVEEpIGRpci5pbmZvICQoaW5mb2RpcikvZGlyLmluZm8gOyBcCi0JZWxzZSB0cnVlIDsgZmkKLQotbG9jYWwtY2xlYW46Ci0JLXJtIC1mICouYSBURU1QIGVycnMgY29yZSAqLm8gKn4gXCMqIFRBR1MgKi5FICoubG9nCi0KLWxvY2FsLWRpc3RjbGVhbjoKLQktcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUgbWgtZnJhZyBtdC1mcmFnCi0JLWlmIFsgIiQoVEFSR0VUX1NVQkRJUikiICE9ICIuIiBdOyB0aGVuIFwKLQkgIHJtIC1yZiAkKFRBUkdFVF9TVUJESVIpOyBcCi0JZWxzZSB0cnVlOyBmaQotCi1sb2NhbC1tYWludGFpbmVyLWNsZWFuOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1jbGVhbjogZG8tY2xlYW4gbG9jYWwtY2xlYW4KLW1vc3RseWNsZWFuOiBkby1tb3N0bHljbGVhbiBsb2NhbC1jbGVhbgotZGlzdGNsZWFuOiBkby1kaXN0Y2xlYW4gbG9jYWwtY2xlYW4gbG9jYWwtZGlzdGNsZWFuCi1tYWludGFpbmVyLWNsZWFuOiBsb2NhbC1tYWludGFpbmVyLWNsZWFuIGRvLW1haW50YWluZXItY2xlYW4gbG9jYWwtY2xlYW4gCi1tYWludGFpbmVyLWNsZWFuOiBsb2NhbC1kaXN0Y2xlYW4KLXJlYWxjbGVhbjogbWFpbnRhaW5lci1jbGVhbgotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGNsZWFuIHNwZWNpZmljIG1vZHVsZXMuCi0uUEhPTlk6ICQoQ0xFQU5fTU9EVUxFUykgJChDTEVBTl9YMTFfTU9EVUxFUykgY2xlYW4tZ2NjCi0kKENMRUFOX01PRFVMRVMpICQoQ0xFQU5fWDExX01PRFVMRVMpIGNsZWFuLWdjYzoKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NsZWFuLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgY2xlYW4pOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotLlBIT05ZOiAkKENMRUFOX1RBUkdFVF9NT0RVTEVTKQotJChDTEVBTl9UQVJHRVRfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jbGVhbi10YXJnZXQtLy8nYDsgXAotCXJtIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9tdWx0aWxpYi5vdXQgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dDsgXAotCWlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfTsgJChNQUtFKSAkKFRBUkdFVF9GTEFHU19UT19QQVNTKSBjbGVhbik7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi1jbGVhbi10YXJnZXQ6ICQoQ0xFQU5fVEFSR0VUX01PRFVMRVMpCi0KLSMgQ2hlY2sgdGFyZ2V0LgotCi0uUEhPTlk6IGNoZWNrCi1jaGVjazogJChDSEVDS19NT0RVTEVTKSBcCi0JJChDSEVDS19UQVJHRVRfTU9EVUxFUykgXAotCSQoQ0hFQ0tfWDExX01PRFVMRVMpIFwKLQljaGVjay1nY2MKLQotIyBBdXRvbWF0ZWQgcmVwb3J0aW5nIG9mIHRlc3QgcmVzdWx0cy4KLQotd2FybmluZy5sb2c6IGJ1aWxkLmxvZwotCSQoc3JjZGlyKS9jb250cmliL3dhcm5fc3VtbWFyeSBidWlsZC5sb2cgPiAkQAotCi1tYWlsLXJlcG9ydC5sb2c6Ci0JaWYgdGVzdCB4JyQoQk9PVF9DRkxBR1MpJyAhPSB4Jyc7IHRoZW4gXAotCSAgICBCT09UX0NGTEFHUz0nJChCT09UX0NGTEFHUyknOyBleHBvcnQgQk9PVF9DRkxBR1M7IFwKLQlmaTsgXAotCSQoc3JjZGlyKS9jb250cmliL3Rlc3Rfc3VtbWFyeSAtdCA+JEAKLQljaG1vZCAreCAkQAotCWVjaG8gSWYgeW91IHJlYWxseSB3YW50IHRvIHNlbmQgZS1tYWlsLCBydW4gLi8kQCBub3cKLQotbWFpbC1yZXBvcnQtd2l0aC13YXJuaW5ncy5sb2c6IHdhcm5pbmcubG9nCi0JaWYgdGVzdCB4JyQoQk9PVF9DRkxBR1MpJyAhPSB4Jyc7IHRoZW4gXAotCSAgICBCT09UX0NGTEFHUz0nJChCT09UX0NGTEFHUyknOyBleHBvcnQgQk9PVF9DRkxBR1M7IFwKLQlmaTsgXAotCSQoc3JjZGlyKS9jb250cmliL3Rlc3Rfc3VtbWFyeSAtdCAtaSB3YXJuaW5nLmxvZyA+JEAKLQljaG1vZCAreCAkQAotCWVjaG8gSWYgeW91IHJlYWxseSB3YW50IHRvIHNlbmQgZS1tYWlsLCBydW4gLi8kQCBub3cKLQotIyBJbnN0YWxsYXRpb24gdGFyZ2V0cy4KLQotLlBIT05ZOiBpbnN0YWxsIGluc3RhbGwtY3Jvc3MgdW5pbnN0YWxsIHNvdXJjZS12YXVsdCBiaW5hcnktdmF1bHQgdmF1bHQtaW5zdGFsbAotaW5zdGFsbDogJChJTlNUQUxMX1RBUkdFVCkgCi1pbnN0YWxsLWNyb3NzOiAkKElOU1RBTExfVEFSR0VUX0NST1NTKSAKLQotdW5pbnN0YWxsOgotCUBlY2hvICJ0aGUgdW5pbnN0YWxsIHRhcmdldCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgdHJlZSIKLQotc291cmNlLXZhdWx0OgotCSQoTUFLRSkgLWYgLi9yZWxlYXNlL0J1aWxkLUEtUmVsZWFzZSBcCi0JCWhvc3Q9JChob3N0X2FsaWFzKSBzb3VyY2UtdmF1bHQKLQotYmluYXJ5LXZhdWx0OgotCSQoTUFLRSkgLWYgLi9yZWxlYXNlL0J1aWxkLUEtUmVsZWFzZSBcCi0JCWhvc3Q9JChob3N0X2FsaWFzKSB0YXJnZXQ9JCh0YXJnZXRfYWxpYXMpCi0KLXZhdWx0LWluc3RhbGw6Ci0JQGlmIFsgLWYgLi9yZWxlYXNlL3ZhdWx0LWluc3RhbGwgXSA7IHRoZW4gXAotCSAgLi9yZWxlYXNlL3ZhdWx0LWluc3RhbGwgJChob3N0X2FsaWFzKSAkKHRhcmdldF9hbGlhcykgOyBcCi0JZWxzZSBcCi0JICB0cnVlIDsgXAotCWZpCi0KLS5QSE9OWTogaW5zdGFsbC5hbGwKLWluc3RhbGwuYWxsOiBpbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXMKLQlAaWYgWyAtZiAuL2djYy9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JCXI9YHB3ZGAgOyBleHBvcnQgciA7IFwKLQkJJChTRVRfTElCX1BBVEgpIFwKLQkJKGNkIC4vZ2NjOyBcCi0JCSQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBpbnN0YWxsLWhlYWRlcnMpIDsgXAotCWVsc2UgXAotCQl0cnVlIDsgXAotCWZpCi0KLSMgaW5ldC1pbnN0YWxsIGlzIHVzZWQgYmVjYXVzZSB0aGUgSSpOZXQgd2FudHMgRGVqYUdOVSBpbnN0YWxsZWQgYnV0Ci0jIG5vdCBidWlsdC4gIFNpbWlsYXJseSwgZ3ppcCBpcyBidWlsdCBidXQgbm90IGluc3RhbGxlZC4KLWluZXQtaW5zdGFsbDoKLQkkKE1BS0UpIElOU1RBTExfTU9EVUxFUz0iYGVjaG8gJChJTlNUQUxMX01PRFVMRVMpIHwgc2VkIC1lICdzL2luc3RhbGwtZGVqYWdudS8vJyAtZSAncy9pbnN0YWxsLWd6aXAvLydgIiBpbnN0YWxsCi0KLSMgaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzIGlzIHVzZWQgYmVjYXVzZSBDeWdudXMgY2FuIG5vdCBkaXN0cmlidXRlCi0jIHRoZSBmaXhlZCBoZWFkZXIgZmlsZXMuCi0uUEhPTlk6IGluc3RhbGwtbm8tZml4ZWRpbmNsdWRlcwotaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzOiBcCi0JaW5zdGFsbGRpcnMgXAotCSQoSU5TVEFMTF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1gxMV9NT0RVTEVTKSBcCi0JZ2NjLW5vLWZpeGVkaW5jbHVkZXMgCi0KLSMgSW5zdGFsbCB0aGUgZ2NjIGhlYWRlcnMgZmlsZXMsIGJ1dCBub3QgdGhlIGZpeGVkIGluY2x1ZGUgZmlsZXMsCi0jIHdoaWNoIEN5Z251cyBpcyBub3QgYWxsb3dlZCB0byBkaXN0cmlidXRlLiAgVGhpcyBydWxlIGlzIHZlcnkKLSMgZGVwZW5kZW50IG9uIHRoZSB3b3JraW5ncyBvZiB0aGUgZ2NjIE1ha2VmaWxlLmluLgotLlBIT05ZOiBnY2Mtbm8tZml4ZWRpbmNsdWRlcwotZ2NjLW5vLWZpeGVkaW5jbHVkZXM6Ci0JQGlmIFsgLWYgLi9nY2MvTWFrZWZpbGUgXTsgdGhlbiBcCi0JICBybSAtcmYgZ2NjL3RtcC1pbmNsdWRlOyBcCi0JICBtdiBnY2MvaW5jbHVkZSBnY2MvdG1wLWluY2x1ZGUgMj4vZGV2L251bGw7IFwKLQkgIG1rZGlyIGdjYy9pbmNsdWRlOyBcCi0JICBjcCAkKHNyY2RpcikvZ2NjL2dzeXNsaW1pdHMuaCBnY2MvaW5jbHVkZS9zeXNsaW1pdHMuaDsgXAotCSAgdG91Y2ggZ2NjL3N0bXAtZml4aW5jIGdjYy9pbmNsdWRlL2ZpeGVkOyBcCi0JICBybSAtZiBnY2Mvc3RtcC1oZWFkZXJzIGdjYy9zdG1wLWludC1oZHJzOyBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgIDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgLi9nY2M7IFwKLQkgICAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpIGluc3RhbGwpOyBcCi0JICBybSAtcmYgZ2NjL2luY2x1ZGU7IFwKLQkgIG12IGdjYy90bXAtaW5jbHVkZSBnY2MvaW5jbHVkZSAyPi9kZXYvbnVsbDsgXAotCWVsc2UgdHJ1ZTsgZmkKLQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLiAgVG8KLSMgYnVpbGQgYSB0YXJnZXQgYWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBhbGwuCi0jCi0jIGFsbC1ndWksIGFuZCBhbGwtbGlicHJvYyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYmVjYXVzZQotIyB0aGV5IGFyZSBzdGlsbCBleHBlcmltZW50YWwsIGFuZCBpZiB0aGV5IGZhaWwgdG8gYnVpbGQsIHRoYXQKLSMgc2hvdWxkbid0IHN0b3AgIm1ha2UgYWxsIi4KLS5QSE9OWTogJChBTExfTU9EVUxFUykgYWxsLWd1aSBhbGwtbGlicHJvYwotJChBTExfTU9EVUxFUykgYWxsLWd1aSBhbGwtbGlicHJvYzoKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2FsbC0vLydgOyBcCi0JaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJCR7ZGlyfTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoZXNlIHJ1bGVzIGFyZSB1c2VkIHRvIGNoZWNrIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBjaGVjay1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgY2hlY2suICBTb21lCi0jIG1vZHVsZXMgYXJlIG9ubHkgdGVzdGVkIGluIGEgbmF0aXZlIHRvb2xjaGFpbi4KLQotLlBIT05ZOiAkKENIRUNLX01PRFVMRVMpICQoTkFUSVZFX0NIRUNLX01PRFVMRVMpICQoQ1JPU1NfQ0hFQ0tfTU9EVUxFUykKLSQoTkFUSVZFX0NIRUNLX01PRFVMRVMpOgotCUBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotCSAgZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NoZWNrLS8vJ2A7IFwKLQkgIGlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgICAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgICAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgICAoY2QgJCR7ZGlyfTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGNoZWNrKTsgXAotCSAgZWxzZSBcCi0JICAgIHRydWU7IFwKLQkgIGZpOyBcCi0JZmkKLQotJChDUk9TU19DSEVDS19NT0RVTEVTKToKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NoZWNrLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgY2hlY2spOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBpbnN0YWxsLgotLlBIT05ZOiAkKElOU1RBTExfTU9EVUxFUykKLSQoSU5TVEFMTF9NT0RVTEVTKTogaW5zdGFsbGRpcnMKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2luc3RhbGwtLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBtb2R1bGVzIHdoaWNoIGFyZSBidWlsdCB3aXRoIHRoZQotIyB0YXJnZXQgdG9vbHMuCi0uUEhPTlk6ICQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKQotJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY29uZmlndXJlLXRhcmdldC0vLydgOyBcCi0JaWYgWyAtZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0gXTsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgJChDQ19GT1JfVEFSR0VUKSAtLXByaW50LW11bHRpLWxpYiA+ICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS90bXBtdWx0aS5vdXQgMj4gL2Rldi9udWxsOyBcCi0JICBpZiBbIC1zICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS90bXBtdWx0aS5vdXQgXTsgdGhlbiBcCi0JICAgIGlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dCBdOyB0aGVuIFwKLQkgICAgICBpZiBjbXAgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vdG1wbXVsdGkub3V0ID4gL2Rldi9udWxsOyB0aGVuIFwKLQkJcm0gLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dDsgXAotCSAgICAgIGVsc2UgXAotCQllY2hvICJNdWx0aWxpYnMgY2hhbmdlZCBmb3IgJCR7ZGlyfSwgcmVjb25maWd1cmluZyI7IFwKLQkJcm0gLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vTWFrZWZpbGU7IFwKLQkJbXYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vbXVsdGlsaWIub3V0OyBcCi0JICAgICAgZmk7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgbXYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vbXVsdGlsaWIub3V0OyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWZpOyBleGl0IDAJIyBicmVhayBjb21tYW5kIGludG8gdHdvIHBpZWNlcwotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY29uZmlndXJlLXRhcmdldC0vLydgOyBcCi0JaWYgWyAhIC1kICQoVEFSR0VUX1NVQkRJUikgXTsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxpZiBbIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxpZiBlY2hvICIgJChUQVJHRVRfQ09ORklHRElSUykgIiB8IGdyZXAgIiAkJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGlmIFsgLWQgJChzcmNkaXIpLyQke2Rpcn0gXTsgdGhlbiBcCi0JICAgIFsgLWQgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9IF0gfHwgbWtkaXIgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9O1wKLQkgICAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgICAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgICBBUj0iJChBUl9GT1JfVEFSR0VUKSI7IGV4cG9ydCBBUjsgXAotCSAgICBBUz0iJChBU19GT1JfVEFSR0VUKSI7IGV4cG9ydCBBUzsgXAotCSAgICBDQz0iJChDQ19GT1JfVEFSR0VUKSI7IGV4cG9ydCBDQzsgXAotCSAgICBDRkxBR1M9IiQoQ0ZMQUdTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IENGTEFHUzsgXAotCSAgICBDWFg9IiQoQ1hYX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IENYWDsgXAotCSAgICBDWFhGTEFHUz0iJChDWFhGTEFHU19GT1JfVEFSR0VUKSI7IGV4cG9ydCBDWFhGTEFHUzsgXAotCSAgICBETExUT09MPSIkKERMTFRPT0xfRk9SX1RBUkdFVCkiOyBleHBvcnQgRExMVE9PTDsgXAotCSAgICBMRD0iJChMRF9GT1JfVEFSR0VUKSI7IGV4cG9ydCBMRDsgXAotICAgICAgICAgICAgTERGTEFHUz0iJChMREZMQUdTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IExERkxBR1M7IFwKLQkgICAgTk09IiQoTk1fRk9SX1RBUkdFVCkiOyBleHBvcnQgTk07IFwKLQkgICAgUkFOTElCPSIkKFJBTkxJQl9GT1JfVEFSR0VUKSI7IGV4cG9ydCBSQU5MSUI7IFwKLQkgICAgV0lORFJFUz0iJChXSU5EUkVTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IFdJTkRSRVM7IFwKLQkgICAgZWNobyBDb25maWd1cmluZyBpbiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07IFwKLQkgICAgY2QgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9OyBcCi0JICAgIGNhc2UgJChzcmNkaXIpIGluIFwKLQkgICAgLyopIFwKLQkgICAgICB0b3BkaXI9JChzcmNkaXIpIDs7IFwKLQkgICAgKikgXAotCSAgICAgIGNhc2UgIiQoVEFSR0VUX1NVQkRJUikiIGluIFwKLQkgICAgICAuKSB0b3BkaXI9Ii4uLyQoc3JjZGlyKSIgOzsgXAotCSAgICAgICopIHRvcGRpcj0iLi4vLi4vJChzcmNkaXIpIiA7OyBcCi0JICAgICAgZXNhYyA7OyBcCi0JICAgIGVzYWM7IFwKLQkgICAgaWYgWyAiJChzcmNkaXIpIiA9ICIuIiBdIDsgdGhlbiBcCi0JICAgICAgaWYgWyAiJChUQVJHRVRfU1VCRElSKSIgIT0gIi4iIF0gOyB0aGVuIFwKLQkJaWYgJChTSEVMTCkgJCRzL3N5bWxpbmstdHJlZSAkJHt0b3BkaXJ9LyQke2Rpcn0gIm5vLXN1Y2gtZmlsZSIgOyB0aGVuIFwKLQkJICBpZiBbIC1mIE1ha2VmaWxlIF07IHRoZW4gXAotCQkgICAgaWYgJChNQUtFKSBkaXN0Y2xlYW47IHRoZW4gXAotCQkgICAgICB0cnVlOyBcCi0JCSAgICBlbHNlIFwKLQkJICAgICAgZXhpdCAxOyBcCi0JCSAgICBmaTsgXAotCQkgIGVsc2UgXAotCQkgICAgdHJ1ZTsgXAotCQkgIGZpOyBcCi0JCWVsc2UgXAotCQkgIGV4aXQgMTsgXAotCQlmaTsgXAotCSAgICAgIGVsc2UgXAotCQl0cnVlOyBcCi0JICAgICAgZmk7IFwKLQkgICAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPS4iOyBcCi0JICAgICAgbGlic3JjZGlyPSIuIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPSQke3RvcGRpcn0vJCR7ZGlyfSI7IFwKLQkgICAgICBsaWJzcmNkaXI9IiQkcy8kJHtkaXJ9IjsgXAotCSAgICBmaTsgXAotCSAgICBpZiBbIC1mICQke2xpYnNyY2Rpcn0vY29uZmlndXJlIF0gOyB0aGVuIFwKLQkgICAgICBybSAtZiBuby1zdWNoLWZpbGUgc2tpcC10aGlzLWRpcjsgXAotCSAgICAgIENPTkZJR19TSVRFPW5vLXN1Y2gtZmlsZSAkKFNIRUxMKSAkJHtsaWJzcmNkaXJ9L2NvbmZpZ3VyZSBcCi0JCSQoQ09ORklHX0FSR1VNRU5UUykgJCR7c3JjZGlyb3B0aW9ufSBcCi0JCS0td2l0aC10YXJnZXQtc3ViZGlyPSIkKFRBUkdFVF9TVUJESVIpIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICBybSAtZiBuby1zdWNoLWZpbGUgc2tpcC10aGlzLWRpcjsgXAotCSAgICAgIENPTkZJR19TSVRFPW5vLXN1Y2gtZmlsZSAkKFNIRUxMKSAkJHMvY29uZmlndXJlIFwKLQkJJChDT05GSUdfQVJHVU1FTlRTKSAkJHtzcmNkaXJvcHRpb259IFwKLQkJLS13aXRoLXRhcmdldC1zdWJkaXI9IiQoVEFSR0VUX1NVQkRJUikiOyBcCi0JICAgIGZpOyBcCi0JICAgIGlmIFsgLWYgc2tpcC10aGlzLWRpciBdIDsgdGhlbiBcCi0JICAgICAgc2ggc2tpcC10aGlzLWRpcjsgXAotCSAgICAgIHJtIC1mIHNraXAtdGhpcy1kaXI7IFwKLQkgICAgICBjZCAuLjsgcm1kaXIgJCR7ZGlyfSB8fCB0cnVlOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGVsc2UgXAotCSAgICB0cnVlOyBcCi0JICBmaTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gYnVpbGQgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIFRBUkdFVF9GTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBhbGwtWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGFsbC4KLS5QSE9OWTogJChBTExfVEFSR0VUX01PRFVMRVMpCi0kKEFMTF9UQVJHRVRfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9hbGwtdGFyZ2V0LS8vJ2A7IFwKLQlpZiBbIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07ICQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykgYWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gY2hlY2sgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIFRBUkdFVF9GTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBpbnN0YWxsLgotLlBIT05ZOiAkKENIRUNLX1RBUkdFVF9NT0RVTEVTKQotJChDSEVDS19UQVJHRVRfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jaGVjay10YXJnZXQtLy8nYDsgXAotCWlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfTskKE1BS0UpICQoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpIGNoZWNrKTtcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZQotIyBUQVJHRVRfRkxBR1NfVE9fUEFTUy4gIFRvIGJ1aWxkIGEgdGFyZ2V0IGluc3RhbGwtWCBtZWFucyB0byBjZCB0byBYCi0jIGFuZCBtYWtlIGluc3RhbGwuCi0uUEhPTlk6ICQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUykKLSQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUyk6IGluc3RhbGxkaXJzCi0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9pbnN0YWxsLXRhcmdldC0vLydgOyBcCi0JaWYgWyAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9OyBcCi0JICAgICQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykgaW5zdGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBYMTFfRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgYWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBhbGwuCi0uUEhPTlk6ICQoQUxMX1gxMV9NT0RVTEVTKQotJChBTExfWDExX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvYWxsLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyBcCi0JICAgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpICQoWDExX0ZMQUdTX1RPX1BBU1MpIGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGNoZWNrIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBYMTFfRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgY2hlY2stWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGFsbC4KLS5QSE9OWTogJChDSEVDS19YMTFfTU9EVUxFUykKLSQoQ0hFQ0tfWDExX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY2hlY2stLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07IFwKLQkgICAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgJChYMTFfRkxBR1NfVE9fUEFTUykgY2hlY2spOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBYMTFfRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgaW5zdGFsbC1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgaW5zdGFsbC4KLS5QSE9OWTogJChJTlNUQUxMX1gxMV9NT0RVTEVTKQotJChJTlNUQUxMX1gxMV9NT0RVTEVTKTogaW5zdGFsbGRpcnMKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2luc3RhbGwtLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07IFwKLQkgICAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgJChYMTFfRkxBR1NfVE9fUEFTUykgaW5zdGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIGdjYyBpcyB0aGUgb25seSBtb2R1bGUgd2hpY2ggdXNlcyBHQ0NfRkxBR1NfVE9fUEFTUy4KLS5QSE9OWTogYWxsLWdjYwotYWxsLWdjYzoKLQlAaWYgWyAtZiAuL2djYy9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCBnY2M7ICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgYWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgQnVpbGRpbmcgR0NDIHVzZXMgc29tZSB0b29scyBmb3IgcmVidWlsZGluZyAic291cmNlIiBmaWxlcwotIyBsaWtlIHRleGluZm8sIGJpc29uL2J5YWNjLCBldGMuICBTbyB3ZSBtdXN0IGRlcGVuZCBvbiB0aG9zZS4KLSMKLSMgV2hpbGUgYnVpbGRpbmcgR0NDLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHJ1biB2YXJpb3VzIHRhcmdldAotIyBwcm9ncmFtcyBsaWtlIHRoZSBhc3NlbWJsZXIsIGxpbmtlciwgZXRjLiAgU28gd2UgZGVwZW5kIG9uCi0jIHRob3NlIHRvby4KLSMKLSMgSW4gdGhlb3J5LCBvbiBhbiBTTVAgYWxsIHRob3NlIGRlcGVuZGVuY2llcyBjYW4gYmUgcmVzb2x2ZWQKLSMgaW4gcGFyYWxsZWwuCi0jCi0uUEhPTlk6IGJvb3RzdHJhcCBib290c3RyYXAtbGVhbiBib290c3RyYXAyIGJvb3RzdHJhcDItbGVhbiBib290c3RyYXAzIGJvb3RzdHJhcDMtbGVhbiBib290c3RyYXA0IGJvb3RzdHJhcDQtbGVhbgotYm9vdHN0cmFwIGJvb3RzdHJhcC1sZWFuIGJvb3RzdHJhcDIgYm9vdHN0cmFwMi1sZWFuIGJvb3RzdHJhcDMgYm9vdHN0cmFwMy1sZWFuIGJvb3RzdHJhcDQgYm9vdHN0cmFwNC1sZWFuOiBhbGwtdGV4aW5mbyBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1iaW51dGlscyBhbGwtZ2FzIGFsbC1sZAotCUByPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkkKFNFVF9MSUJfUEFUSCkgXAotCWVjaG8gIkJvb3RzdHJhcHBpbmcgdGhlIGNvbXBpbGVyIjsgXAotCWNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSAkQAotCUByPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQljYXNlICIkQCIgaW4gXAotCSAgKmJvb3RzdHJhcDQtbGVhbiApIFwKLQkJCW1zZz0iQ29tcGFyaW5nIHN0YWdlMyBhbmQgc3RhZ2U0IG9mIHRoZSBjb21waWxlciI7IFwKLQkgIAkJY29tcGFyZT1jb21wYXJlMy1sZWFuIDs7IFwKLQkgICpib290c3RyYXA0ICkgbXNnPSJDb21wYXJpbmcgc3RhZ2UzIGFuZCBzdGFnZTQgb2YgdGhlIGNvbXBpbGVyIjsgXAotCSAgCQljb21wYXJlPWNvbXBhcmUzIDs7IFwKLQkgICotbGVhbiApCW1zZz0iQ29tcGFyaW5nIHN0YWdlMiBhbmQgc3RhZ2UzIG9mIHRoZSBjb21waWxlciI7IFwKLQkgIAkJY29tcGFyZT1jb21wYXJlLWxlYW4gOzsgXAotCSAgKiApCQltc2c9IkNvbXBhcmluZyBzdGFnZTIgYW5kIHN0YWdlMyBvZiB0aGUgY29tcGlsZXIiOyBcCi0JICAJCWNvbXBhcmU9Y29tcGFyZSA7OyBcCi0JZXNhYzsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZWNobyAiJCRtc2ciOyBcCi0JY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpICQkY29tcGFyZQotCUByPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYCA7IGV4cG9ydCBzOyBcCi0JJChTRVRfTElCX1BBVEgpIFwKLQllY2hvICJCdWlsZGluZyBydW50aW1lIGxpYnJhcmllcyI7IFwKLQkkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSBhbGwKLQotLlBIT05ZOiBjcm9zcwotY3Jvc3M6IGFsbC10ZXhpbmZvIGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLWJpbnV0aWxzIGFsbC1nYXMgYWxsLWxkCi0JQHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0Jcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZWNobyAiQnVpbGRpbmcgdGhlIEMgYW5kIEMrKyBjb21waWxlciI7IFwKLQljZCBnY2M7ICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgTEFOR1VBR0VTPSJjIGMrKyIKLQlAcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlzPWBjZCAkKHNyY2Rpcik7IHB3ZGAgOyBleHBvcnQgczsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZWNobyAiQnVpbGRpbmcgcnVudGltZSBsaWJyYXJpZXMiOyBcCi0JJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgYWxsIExBTkdVQUdFUz0iYyBjKysiCi0KLS5QSE9OWTogY2hlY2stZ2NjCi1jaGVjay1nY2M6Ci0JQGlmIFsgLWYgLi9nY2MvTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpIGNoZWNrKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLS5QSE9OWTogaW5zdGFsbC1nY2MKLWluc3RhbGwtZ2NjOgotCUBpZiBbIC1mIC4vZ2NjL01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLS5QSE9OWTogaW5zdGFsbC1nY2MtY3Jvc3MKLWluc3RhbGwtZ2NjLWNyb3NzOgotCUBpZiBbIC1mIC4vZ2NjL01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSBMQU5HVUFHRVM9ImMgYysrIiBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0jIEVYUEVSSU1FTlRBTCBTVFVGRgotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBpbnN0YWxsLgotLlBIT05ZOiBpbnN0YWxsLWRvc3JlbAotaW5zdGFsbC1kb3NyZWw6IGluc3RhbGxkaXJzIGluZm8KLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2luc3RhbGwtLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLWluc3RhbGwtZG9zcmVsLWZha2U6Ci0KLQotIyBUaGlzIGlzIGEgbGlzdCBvZiBpbnRlci1kZXBlbmRlbmNpZXMgYW1vbmcgbW9kdWxlcy4KLWFsbC1hcGFjaGU6Ci1hbGwtYXNoOgotYWxsLWF1dG9jb25mOiBhbGwtbTQgYWxsLXRleGluZm8KLWFsbC1hdXRvbWFrZTogYWxsLW00IGFsbC10ZXhpbmZvCi1hbGwtYmFzaDoKLWFsbC1iZmQ6IGFsbC1saWJpYmVydHkgYWxsLWludGwKLWFsbC1iaW51dGlsczogYWxsLWxpYmliZXJ0eSBhbGwtb3Bjb2RlcyBhbGwtYmZkIGFsbC1mbGV4IGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLWludGwKLWFsbC1iaXNvbjogYWxsLXRleGluZm8KLWNvbmZpZ3VyZS10YXJnZXQtYnNwOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWJzcDogY29uZmlndXJlLXRhcmdldC1ic3AgYWxsLWdjYyBhbGwtYmludXRpbHMgYWxsLXRhcmdldC1uZXdsaWIKLWFsbC1ieWFjYzoKLWFsbC1iemlwMjoKLWFsbC1jdnNzcmM6Ci1jb25maWd1cmUtdGFyZ2V0LWN5Z21vbjogJChBTExfR0NDKQotYWxsLXRhcmdldC1jeWdtb246IGNvbmZpZ3VyZS10YXJnZXQtY3lnbW9uIGFsbC1nYXMgYWxsLWxkIGFsbC1nY2MgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1uZXdsaWIgYWxsLXRhcmdldC1saWJpbyBhbGwtdGFyZ2V0LWxpYnN0dWIgYWxsLXRhcmdldC1ic3AKLWFsbC1kYjoKLWFsbC1kZWphZ251OiBhbGwtdGNsIGFsbC1leHBlY3QgYWxsLXRrCi1hbGwtZGlmZjogYWxsLWxpYmliZXJ0eQotYWxsLWVtYWNzOgotYWxsLWVtYWNzMTk6IGFsbC1iaXNvbiBhbGwtYnlhY2MKLWFsbC1ldGM6Ci1jb25maWd1cmUtdGFyZ2V0LWV4YW1wbGVzOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWV4YW1wbGVzOiBjb25maWd1cmUtdGFyZ2V0LWV4YW1wbGVzCi1hbGwtZXhwZWN0OiBhbGwtdGNsIGFsbC10awotYWxsLWZpbGV1dGlsczogYWxsLWxpYmliZXJ0eQotYWxsLWZpbmR1dGlsczoKLWFsbC1maW5kOgotYWxsLWZsZXg6IGFsbC1saWJpYmVydHkgYWxsLWJpc29uIGFsbC1ieWFjYwotYWxsLWdhczogYWxsLWxpYmliZXJ0eSBhbGwtb3Bjb2RlcyBhbGwtYmZkIGFsbC1pbnRsCi1hbGwtZ2FzaDogYWxsLXRjbAotYWxsLWdhd2s6Ci1BTExfR0NDID0gYWxsLWdjYwotYWxsLWdjYzogYWxsLWJpc29uIGFsbC1ieWFjYyBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtbGQKLWFsbC1ib290c3RyYXA6IGFsbC1saWJpYmVydHkgYWxsLWJpc29uIGFsbC1ieWFjYyBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtbGQKLUdEQl9USyA9IGFsbC10ayBhbGwtdGNsIGFsbC1pdGNsIGFsbC10aXggYWxsLWxpYmd1aQotYWxsLWdkYjogYWxsLWxpYmliZXJ0eSBhbGwtb3Bjb2RlcyBhbGwtYmZkIGFsbC1tbWFsbG9jIGFsbC1yZWFkbGluZSBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1zaW0gJChnZGJubG1yZXF1aXJlbWVudHMpICQoR0RCX1RLKQotYWxsLWdldHRleHQ6Ci1hbGwtZ251c2VydjoKLWNvbmZpZ3VyZS10YXJnZXQtZ3BlcmY6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtZ3BlcmY6IGNvbmZpZ3VyZS10YXJnZXQtZ3BlcmYgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1saWJzdGRjKysKLWFsbC1ncHJvZjogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzIGFsbC1pbnRsCi1hbGwtZ3JlejogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzCi1hbGwtZ3VpOiBhbGwtZ2RiIGFsbC1saWJwcm9jIGFsbC10YXJnZXQtbGlicngKLWFsbC1ndWlsZToKLWFsbC1nemlwOiBhbGwtbGliaWJlcnR5Ci1hbGwtaGVsbG86IGFsbC1saWJpYmVydHkKLWFsbC1pbmRlbnQ6Ci1hbGwtaW5ldDogYWxsLXRjbCBhbGwtc2VuZC1wciBhbGwtcGVybAotYWxsLWludGw6Ci1hbGwtaXNwZWxsOiBhbGwtZW1hY3MxOQotYWxsLWl0Y2w6IGFsbC10Y2wgYWxsLXRrIGFsbC10Y2w4LjEgYWxsLXRrOC4xCi1hbGwtbGQ6IGFsbC1saWJpYmVydHkgYWxsLWJmZCBhbGwtb3Bjb2RlcyBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1mbGV4IGFsbC1pbnRsCi1jb25maWd1cmUtdGFyZ2V0LWxpYmcrKzogJChBTExfR0NDKSBjb25maWd1cmUtdGFyZ2V0LWxpYnJ4Ci1hbGwtdGFyZ2V0LWxpYmcrKzogY29uZmlndXJlLXRhcmdldC1saWJnKysgYWxsLWdhcyBhbGwtbGQgYWxsLWdjYyBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LW5ld2xpYiBhbGwtdGFyZ2V0LWxpYmlvIGFsbC10YXJnZXQtbGlicnggYWxsLXRhcmdldC1saWJzdGRjKysKLWNvbmZpZ3VyZS10YXJnZXQtbGliZ2xvc3M6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbGliZ2xvc3M6IGNvbmZpZ3VyZS10YXJnZXQtbGliZ2xvc3MgY29uZmlndXJlLXRhcmdldC1uZXdsaWIKLWNvbmZpZ3VyZS10YXJnZXQtbGliaW86ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbGliaW86IGNvbmZpZ3VyZS10YXJnZXQtbGliaW8gYWxsLWdhcyBhbGwtbGQgYWxsLWdjYyBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LW5ld2xpYgotY2hlY2stdGFyZ2V0LWxpYmlvOiBhbGwtdGFyZ2V0LWxpYnN0ZGMrKwotYWxsLWxpYmd1aTogYWxsLXRjbCBhbGwtdGsgYWxsLXRjbDguMSBhbGwtdGs4LjEgYWxsLWl0Y2wKLWFsbC1saWJpYmVydHk6Ci1jb25maWd1cmUtdGFyZ2V0LWxpYnJ4OiAkKEFMTF9HQ0MpIGNvbmZpZ3VyZS10YXJnZXQtbmV3bGliCi1hbGwtdGFyZ2V0LWxpYnJ4OiBjb25maWd1cmUtdGFyZ2V0LWxpYnJ4Ci1jb25maWd1cmUtdGFyZ2V0LWxpYnN0ZGMrKzogJChBTExfR0NDKQotYWxsLXRhcmdldC1saWJzdGRjKys6IGNvbmZpZ3VyZS10YXJnZXQtbGlic3RkYysrIGFsbC1nYXMgYWxsLWxkIGFsbC1nY2MgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1uZXdsaWIgYWxsLXRhcmdldC1saWJpbwotY29uZmlndXJlLXRhcmdldC1saWJzdHViOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWxpYnN0dWI6IGNvbmZpZ3VyZS10YXJnZXQtbGlic3R1YgotYWxsLWxpYnRvb2w6Ci1hbGwtbTQ6IGFsbC1saWJpYmVydHkKLWFsbC1tYWtlOiBhbGwtbGliaWJlcnR5Ci1hbGwtbW1hbGxvYzoKLWNvbmZpZ3VyZS10YXJnZXQtbmV3bGliOiAkKEFMTF9HQ0MpCi1jb25maWd1cmUtdGFyZ2V0LWxpYnRlcm1jYXA6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbmV3bGliOiBjb25maWd1cmUtdGFyZ2V0LW5ld2xpYiBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtZ2NjCi1hbGwtdGFyZ2V0LWxpYnRlcm1jYXA6IGNvbmZpZ3VyZS10YXJnZXQtbGlidGVybWNhcCBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtZ2NjCi1hbGwtb3Bjb2RlczogYWxsLWJmZCBhbGwtbGliaWJlcnR5Ci1hbGwtcGF0Y2g6IGFsbC1saWJpYmVydHkKLWFsbC1wZXJsOgotYWxsLXBybXM6IGFsbC1saWJpYmVydHkKLWFsbC1yY3M6Ci1hbGwtcmVhZGxpbmU6Ci1hbGwtcmVjb2RlOiBhbGwtbGliaWJlcnR5Ci1hbGwtc2VkOiBhbGwtbGliaWJlcnR5Ci1hbGwtc2VuZC1wcjogYWxsLXBybXMKLWFsbC1zaGVsbHV0aWxzOgotYWxsLXNpbTogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzIGFsbC1yZWFkbGluZQotYWxsLXRhcjogYWxsLWxpYmliZXJ0eQotYWxsLXRjbDoKLWFsbC10Y2w4LjE6Ci1hbGwtdGNsWDogYWxsLXRjbCBhbGwtdGsKLWFsbC10azogYWxsLXRjbAotYWxsLXRrOC4xOiBhbGwtdGNsOC4xCi1hbGwtdGV4aW5mbzogYWxsLWxpYmliZXJ0eQotYWxsLXRleHR1dGlsczoKLWFsbC10Z2FzOiBhbGwtbGliaWJlcnR5IGFsbC1iZmQgYWxsLW9wY29kZXMKLWFsbC10aW1lOgotYWxsLXRpeDogYWxsLXRjbCBhbGwtdGsgYWxsLXRjbDguMSBhbGwtdGs4LjEKLWFsbC13ZGlmZjoKLWFsbC10YXJnZXQtd2luc3VwOiBhbGwtdGFyZ2V0LW5ld2xpYiBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgY29uZmlndXJlLXRhcmdldC13aW5zdXAKLWNvbmZpZ3VyZS10YXJnZXQtd2luc3VwOiBjb25maWd1cmUtdGFyZ2V0LW5ld2xpYgotYWxsLXV1ZGVjb2RlOiBhbGwtbGliaWJlcnR5Ci1hbGwtemlwOgotY29uZmlndXJlLXRhcmdldC1saWJpYmVydHk6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbGliaWJlcnR5OiBjb25maWd1cmUtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtZ2NjIGFsbC1sZCBhbGwtdGFyZ2V0LW5ld2xpYgotYWxsLXRhcmdldDogJChBTExfVEFSR0VUX01PRFVMRVMpCi1pbnN0YWxsLXRhcmdldDogJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKQotIyMjIG90aGVyIHN1cHBvcnRpbmcgdGFyZ2V0cwotCi1NQUtFRElSUz0gXAotCSQocHJlZml4KSBcCi0JJChleGVjX3ByZWZpeCkKLS5QSE9OWTogaW5zdGFsbGRpcnMKLWluc3RhbGxkaXJzOiBta2luc3RhbGxkaXJzCi0JJChTSEVMTCkgJChzcmNkaXIpL21raW5zdGFsbGRpcnMgJChNQUtFRElSUykKLQotZGlyLmluZm86IGRvLWluc3RhbGwtaW5mbwotCWlmIFsgLWYgJChzcmNkaXIpL3RleGluZm8vZ2VuLWluZm8tZGlyIF0gOyB0aGVuIFwKLQkgICQoc3JjZGlyKS90ZXhpbmZvL2dlbi1pbmZvLWRpciAkKGluZm9kaXIpICQoc3JjZGlyKS90ZXhpbmZvL2Rpci5pbmZvLXRlbXBsYXRlID4gZGlyLmluZm8ubmV3IDsgXAotCSAgbXYgLWYgZGlyLmluZm8ubmV3IGRpci5pbmZvIDsgXAotCWVsc2UgdHJ1ZSA7IFwKLQlmaQotCi1kaXN0OgotCUBlY2hvICJCdWlsZGluZyBhIGZ1bGwgZGlzdHJpYnV0aW9uIG9mIHRoaXMgdHJlZSBpc24ndCBkb25lIgotCUBlY2hvICJ2aWEgJ21ha2UgZGlzdCcuICBDaGVjayBvdXQgdGhlIGV0Yy8gc3ViZGlyZWN0b3J5IiAKLQotZXRhZ3MgdGFnczogVEFHUwotCi0jIFJpZ2h0IG5vdyB0aGlzIGp1c3QgYnVpbGRzIFRBR1MgaW4gZWFjaCBzdWJkaXJlY3RvcnkuICBlbWFjczE5IGhhcyB0aGUKLSMgYWJpbGl0eSB0byB1c2Ugc2V2ZXJhbCB0YWdzIGZpbGVzIGF0IG9uY2UsIHNvIHRoZXJlIGlzIHByb2JhYmx5IG5vIG5lZWQKLSMgdG8gY29tYmluZSB0aGVtIGludG8gb25lIGJpZyBUQUdTIGZpbGUgKGxpa2UgQ1ZTIDEuMyBkb2VzKS4gIFdlIGNvdWxkCi0jIChpZiB3ZSBmZWx0IGxpa2UgaXQpIGhhdmUgdGhpcyBNYWtlZmlsZSB3cml0ZSBhIHBpZWNlIG9mIGVsaXNwIHdoaWNoCi0jIHRoZSB1c2VyIGNvdWxkIGxvYWQgdG8gdGVsbCBlbWFjczE5IHdoZXJlIGFsbCB0aGUgVEFHUyBmaWxlcyB3ZSBqdXN0Ci0jIGJ1aWx0IGFyZS4KLVRBR1M6IGRvLVRBR1MKLQotIyB3aXRoIHRoZSBnbnUgbWFrZSwgdGhpcyBpcyBkb25lIGF1dG9tYXRpY2FsbHkuCi0KLU1ha2VmaWxlOiBNYWtlZmlsZS5pbiBjb25maWd1cmUuaW4gJChob3N0X21ha2VmaWxlX2ZyYWcpICQodGFyZ2V0X21ha2VmaWxlX2ZyYWcpICQoZ2NjX3ZlcnNpb25fdHJpZ2dlcikKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIwotIyBTdXBwb3J0IGZvciBidWlsZGluZyBuZXQgcmVsZWFzZXMKLQotIyBGaWxlcyBpbiBkZXZvIHVzZWQgaW4gYW55IG5ldCByZWxlYXNlLgotIyBDaGFuZ2VMb2cgb21pdHRlZCBiZWNhdXNlIGl0IG1heSByZWZlciB0byBmaWxlcyB3aGljaCBhcmUgbm90IGluIHRoaXMKLSMgZGlzdHJpYnV0aW9uIChwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciB0byBpbmNsdWRlIGl0IGFueXdheSkuCi1ERVZPX1NVUFBPUlQ9IFJFQURNRSBNYWtlZmlsZS5pbiBjb25maWd1cmUgY29uZmlndXJlLmluIFwKLQljb25maWcuZ3Vlc3MgY29uZmlnLmlmIGNvbmZpZy5zdWIgY29uZmlnIG1vdmUtaWYtY2hhbmdlIFwKLQltcHctUkVBRE1FIG1wdy1idWlsZC5pbiBtcHctY29uZmlnLmluIG1wdy1jb25maWd1cmUgbXB3LWluc3RhbGwgXAotCUNPUFlJTkcgQ09QWUlORy5MSUIgaW5zdGFsbC1zaCBjb25maWctbWwuaW4gc3ltbGluay10cmVlIFwKLQlta2luc3RhbGxkaXJzIGx0Y29uZmlnIGx0bWFpbi5zaCBtaXNzaW5nIHlsd3JhcAotCi0jIEZpbGVzIGluIGRldm8vZXRjIHVzZWQgaW4gYW55IG5ldCByZWxlYXNlLgotIyBDaGFuZ2VMb2cgb21pdHRlZCBiZWNhdXNlIGl0IG1heSByZWZlciB0byBmaWxlcyB3aGljaCBhcmUgbm90IGluIHRoaXMKLSMgZGlzdHJpYnV0aW9uIChwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciB0byBpbmNsdWRlIGl0IGFueXdheSkuCi1FVENfU1VQUE9SVD0gTWFrZWZpbGUuaW4gY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBzdGFuZGFyZHMudGV4aSBcCi0JbWFrZS1zdGRzLnRleGkgc3RhbmRhcmRzLmluZm8qCi0KLSMgV2hlbiB5b3UgdXNlIGBtYWtlIHNldHVwLWRpcnMnIG9yIGBtYWtlIHRheicgeW91IHNob3VsZCBhbHdheXMgcmVkZWZpbmUKLSMgdGhpcyBtYWNyby4KLVNVUFBPUlRfRklMRVMgPSBsaXN0LW9mLXN1cHBvcnQtZmlsZXMtZm9yLXRvb2wtaW4tcXVlc3Rpb24KLQotLlBIT05ZOiB0YXoKLQotdGF6OiAkKERFVk9fU1VQUE9SVCkgJChTVVBQT1JUX0ZJTEVTKSBcCi0gIHRleGluZm8vdGV4aW5mby50ZXggdGV4aW5mby9ncGwudGV4aW5mbyB0ZXhpbmZvL2xncGwudGV4aW5mbwotCSMgVGFrZSBvdXQgdGV4aW5mbyBmcm9tIGEgZmV3IHBsYWNlcy4KLQlzZWQgLWUgJy9eYWxsXC5ub3JtYWw6IC9zL1xhbGwtdGV4aW5mbyAvLycgXAotCSAgICAtZSAnL14JaW5zdGFsbC10ZXhpbmZvIC9kJyBcCi0JPE1ha2VmaWxlLmluID50bXAKLQltdiAtZiB0bXAgTWFrZWZpbGUuaW4KLQkjCi0JLi9jb25maWd1cmUgc3VuNAotCVsgLXogIiQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSIgXSBcCi0JICB8fCAkKE1BS0UpICQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSBBTExfR0NDPSIiIFwKLQkgICAgQ0NfRk9SX1RBUkdFVD0iJChDQykiIENYWF9GT1JfVEFSR0VUPSIkKENYWCkiCi0JIyBNYWtlIGxpbmtzLCBhbmQgcnVuICJtYWtlIGRpc3RzdHVmZiIgb3IgIm1ha2UgaW5mbyIgd2hlbiBuZWVkZWQuCi0Jcm0gLXJmIHByb3RvLXRvcGxldiA7IG1rZGlyIHByb3RvLXRvcGxldgotCXNldCAtZSA7IGRpcnM9IiQoVE9PTCkgJChERVZPX1NVUFBPUlQpICQoU1VQUE9SVF9GSUxFUykiIDsgXAotCWZvciBkIGluICQkZGlycyA7IGRvIFwKLQkgIGlmIFsgLWQgJCRkIF07IHRoZW4gXAotCSAgICBpZiBbICEgLWYgJCRkL01ha2VmaWxlIF0gOyB0aGVuIHRydWUgOyBcCi0JICAgIGVsaWYgZ3JlcCAnXmRpc3RzdHVmZjonICQkZC9NYWtlZmlsZSA+L2Rldi9udWxsIDsgdGhlbiBcCi0JCShjZCAkJGQgOyAkKE1BS0UpIGRpc3RzdHVmZiApIHx8IGV4aXQgMSA7IFwKLQkgICAgZWxpZiBncmVwICdeaW5mbzonICQkZC9NYWtlZmlsZSA+L2Rldi9udWxsIDsgdGhlbiBcCi0JICAgICAgICAoY2QgJCRkIDsgJChNQUtFKSBpbmZvICkgfHwgZXhpdCAxIDsgXAotCSAgICBmaSA7IFwKLQkgICAgaWYgWyAtZCAkJGQvcHJvdG8tJCRkLmRpciBdOyB0aGVuIFwKLQkgICAgICBsbiAtcyAuLi8kJGQvcHJvdG8tJCRkLmRpciBwcm90by10b3BsZXYvJCRkIDsgXAotCSAgICBlbHNlIFwKLQkgICAgICBsbiAtcyAuLi8kJGQgcHJvdG8tdG9wbGV2LyQkZCA7IFwKLQkgICAgZmkgOyBcCi0JICBlbHNlIGxuIC1zIC4uLyQkZCBwcm90by10b3BsZXYvJCRkIDsgZmkgOyBcCi0JZG9uZQotCWNkIGV0YyA7ICQoTUFLRSkgaW5mbwotCSQoTUFLRSkgZGlzdGNsZWFuCi0JIwotCW1rZGlyIHByb3RvLXRvcGxldi9ldGMKLQkoY2QgcHJvdG8tdG9wbGV2L2V0YzsgXAotCSBmb3IgaSBpbiAkKEVUQ19TVVBQT1JUKTsgZG8gXAotCQlsbiAtcyAuLi8uLi9ldGMvJCRpIC4gOyBcCi0JIGRvbmUpCi0JIwotCSMgVGFrZSBvdXQgdGV4aW5mbyBmcm9tIGNvbmZpZ3VyYWJsZSBkaXJzCi0Jcm0gcHJvdG8tdG9wbGV2L2NvbmZpZ3VyZS5pbgotCXNlZCAtZSAnL15ob3N0X3Rvb2xzPS9zL3RleGluZm8gLy8nIFwKLQkgICAgPGNvbmZpZ3VyZS5pbiA+cHJvdG8tdG9wbGV2L2NvbmZpZ3VyZS5pbgotCSMKLQlta2RpciBwcm90by10b3BsZXYvdGV4aW5mbwotCWxuIC1zIC4uLy4uL3RleGluZm8vdGV4aW5mby50ZXgJCXByb3RvLXRvcGxldi90ZXhpbmZvLwotCWxuIC1zIC4uLy4uL3RleGluZm8vZ3BsLnRleGluZm8JCXByb3RvLXRvcGxldi90ZXhpbmZvLwotCWxuIC1zIC4uLy4uL3RleGluZm8vbGdwbC50ZXhpbmZvCXByb3RvLXRvcGxldi90ZXhpbmZvLwotCWlmIHRlc3QgLXIgdGV4aW5mby91dGlsL3RleDNwYXRjaCA7IHRoZW4gXAotCSAgbWtkaXIgcHJvdG8tdG9wbGV2L3RleGluZm8vdXRpbCAmJiBcCi0JICBsbiAtcyAuLi8uLi8uLi90ZXhpbmZvL3V0aWwvdGV4M3BhdGNoCXByb3RvLXRvcGxldi90ZXhpbmZvL3V0aWwgOyBcCi0JZWxzZSB0cnVlOyBmaQotCWNobW9kIC1SIG9nPXUgLiB8fCBjaG1vZCBvZz11IGBmaW5kIC4gLXByaW50YAotCWlmIGdyZXAgQU1fSU5JVF9BVVRPTUFLRSAkKFRPT0wpL2NvbmZpZ3VyZS5pbiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgdmVyPWBzZWQgPCAkKFRPT0wpL2NvbmZpZ3VyZS5pbiAtbiAncy9BTV9JTklUX0FVVE9NQUtFW14sXSosICpcKFteKV0qXCkpL1wxL3AnYDsgXAotCWVsc2UgXAotCSAgdmVyPWBzZWQgPCQoVE9PTCkvTWFrZWZpbGUuaW4gLW4gJ3MvXlZFUlNJT04gKj0gKi8vcCdgOyBcCi0JZmk7IFwKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIGRvLXRhci1neiBUT09MPSQoVE9PTCkgVkVSPSQkdmVyCi0KLWRvLXRhci1nejoKLQllY2hvICI9PT4gTWFraW5nICQoVE9PTCktJChWRVIpLnRhci5neiIKLQktcm0gLWYgJChUT09MKS0kKFZFUikKLQlsbiAtcyBwcm90by10b3BsZXYgJChUT09MKS0kKFZFUikKLQl0YXIgY2ZoICQoVE9PTCktJChWRVIpLnRhciAkKFRPT0wpLSQoVkVSKQotCSQoR1pJUFBST0cpIC12IC05ICQoVE9PTCktJChWRVIpLnRhcgotCi1URVhJTkZPX1NVUFBPUlQ9IHRleGluZm8vdGV4aW5mby50ZXggdGV4aW5mby9ncGwudGV4aW5mbyB0ZXhpbmZvL2xncGwudGV4aW5mbwotRElTVF9TVVBQT1JUPSAkKERFVk9fU1VQUE9SVCkgJChURVhJTkZPX1NVUFBPUlQpCi0KLS5QSE9OWTogZ2FzLnRhci5negotR0FTX1NVUFBPUlRfRElSUz0gYmZkIGluY2x1ZGUgbGliaWJlcnR5IG9wY29kZXMgaW50bCBzZXR1cC5jb20gbWFrZWZpbGUudm1zCi1nYXMudGFyLmd6OiAkKERJU1RfU1VQUE9SVCkgJChHQVNfU1VQUE9SVF9ESVJTKSBnYXMKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPWdhcyBcCi0JCVNVUFBPUlRfRklMRVM9IiQoR0FTX1NVUFBPUlRfRElSUykiCi0KLSMgVGhlIEZTRiAiYmludXRpbHMiIHJlbGVhc2UgaW5jbHVkZXMgZ3Byb2YgYW5kIGxkLgotLlBIT05ZOiBiaW51dGlscy50YXIuZ3oKLUJJTlVUSUxTX1NVUFBPUlRfRElSUz0gYmZkIGdhcyBpbmNsdWRlIGxpYmliZXJ0eSBvcGNvZGVzIGxkIGdwcm9mIGludGwgc2V0dXAuY29tIG1ha2VmaWxlLnZtcwotYmludXRpbHMudGFyLmd6OiAkKERJU1RfU1VQUE9SVCkgJChCSU5VVElMU19TVVBQT1JUX0RJUlMpIGJpbnV0aWxzCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiB0YXogVE9PTD1iaW51dGlscyBcCi0JCVNVUFBPUlRfRklMRVM9IiQoQklOVVRJTFNfU1VQUE9SVF9ESVJTKSBtYWtlYWxsLmJhdCBjb25maWd1cmUuYmF0IgotCi0uUEhPTlk6IGdhcytiaW51dGlscy50YXIuZ3oKLUdBU0JfU1VQUE9SVF9ESVJTPSAkKEdBU19TVVBQT1JUX0RJUlMpIGJpbnV0aWxzIGxkIGdwcm9mCi1nYXMrYmludXRpbHMudGFyLmd6OiAkKERJU1RfU1VQUE9SVCkgJChHQVNCX1NVUFBPUlRfRElSUykgZ2FzCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiB0YXogVE9PTD1nYXMgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKEdBU0JfU1VQUE9SVF9ESVJTKSBtYWtlYWxsLmJhdCBjb25maWd1cmUuYmF0IgotCi0uUEhPTlk6IGxpYmcrKy50YXIuZ3oKLUxJQkdYWF9TVVBQT1JUX0RJUlM9aW5jbHVkZSBsaWJzdGRjKysgbGliaW8gbGlicnggbGliaWJlcnR5Ci1saWJnKysudGFyLmd6OiAkKERJU1RfU1VQUE9SVCkgbGliZysrCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiB0YXogVE9PTD1saWJnKysgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKExJQkdYWF9TVVBQT1JUX0RJUlMpIgotCi1HTkFUU19TVVBQT1JUX0RJUlM9aW5jbHVkZSBsaWJpYmVydHkgc2VuZC1wcgotZ25hdHMudGFyLmd6OiAkKERJU1RfU1VQUE9SVCkgJChHTkFUU19TVVBQT1JUX0RJUlMpIGduYXRzCi0JJChNQUtFKSAtZiAgTWFrZWZpbGUuaW4gdGF6IFRPT0w9Z25hdHMgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKEdOQVRTX1NVUFBPUlRfRElSUykiCi0KLS5QSE9OWTogZ2RiLnRhci5negotR0RCX1NVUFBPUlRfRElSUz0gYmZkIGluY2x1ZGUgbGliaWJlcnR5IG1tYWxsb2Mgb3Bjb2RlcyByZWFkbGluZSBzaW0gdXRpbHMgaW50bAotZ2RiLnRhci5nejogJChESVNUX1NVUFBPUlQpICQoR0RCX1NVUFBPUlRfRElSUykgZ2RiCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiB0YXogVE9PTD1nZGIgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKEdEQl9TVVBQT1JUX0RJUlMpIgotCi0uUEhPTlk6IG5ld2xpYi50YXIuZ3oKLU5FV0xJQl9TVVBQT1JUX0RJUlM9bGliZ2xvc3MKLSMgdGF6IGNvbmZpZ3VyZXMgZm9yIHRoZSBzdW40IHRhcmdldCB3aGljaCB3b24ndCBjb25maWd1cmUgbmV3bGliLgotIyBXZSBuZWVkIG5ld2xpYiBjb25maWd1cmVkIHNvIHRoYXQgdGhlIC5pbmZvIGZpbGVzIGFyZSBtYWRlLgotIyBVbmZvcnR1bmF0ZWx5LCBpdCBpcyBub3QgZW5vdWdoIHRvIGp1c3QgY29uZmlndXJlIG5ld2xpYiBzZXBhcmF0ZWx5OgotIyB0YXogd2lsbCBidWlsZCB0aGUgLmluZm8gZmlsZXMgYnV0IHNpbmNlIFNVQkRJUlMgd29uJ3QgY29udGFpbiBuZXdsaWIsCi0jIGRpc3RjbGVhbiB3b24ndCBiZSBydW4gKGxlYXZpbmcgTWFrZWZpbGUsIGNvbmZpZy5zdGF0dXMsIGFuZCB0aGUgdG1wIGZpbGVzCi0jIHVzZWQgaW4gYnVpbGRpbmcgdGhlIC5pbmZvIGZpbGVzLCBlZzogKi5kZWYsICoucmVmKS4KLSMgVGhlIHByb2JsZW0gaXNuJ3Qgc29sdmFibGUgaG93ZXZlciB3aXRob3V0IGEgbG90IG9mIGV4dHJhIHdvcmsgYmVjYXVzZQotIyB0YXJnZXQgbGlicmFyaWVzIGFyZSBidWlsdCBpbiBzdWJkaXIgJCh0YXJnZXRfYWxpYXMpIHdoaWNoIGdldHMgbnVrZWQgZHVyaW5nCi0jIHRoZSBtYWtlIGRpc3RjbGVhbi4gIEZvciBub3cgcHVudCBvbiB0aGUgaXNzdWUgb2Ygc2hpcHBpbmcgbmV3bGliIGluZm8gZmlsZXMKLSMgd2l0aCBuZXdsaWIgbmV0IHJlbGVhc2VzIGFuZCB3YWl0IGZvciBhIGRheSB3aGVuIHNvbWUgbmF0aXZlIHRhcmdldCAoc3VuND8pCi0jIHN1cHBvcnRzIG5ld2xpYiAoaWYgb25seSBtaW5pbWFsbHkpLgotbmV3bGliLnRhci5nejogJChESVNUX1NVUFBPUlQpICQoTkVXTElCX1NVUFBPUlRfRElSUykgbmV3bGliCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiB0YXogVE9PTD1uZXdsaWIgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKE5FV0xJQl9TVVBQT1JUX0RJUlMpIiBcCi0JCURFVk9fU1VQUE9SVD0iJChERVZPX1NVUFBPUlQpIENPUFlJTkcuTkVXTElCIiBuZXdsaWIKLQotLk5PRVhQT1JUOgotTUFLRU9WRVJSSURFUz0KLQotIyBlbmQgb2YgTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwZTQzNi4uMDAwMDAwMAotLS0gYS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0JCSAgIFJFQURNRSBmb3IgR05VIGRldmVsb3BtZW50IHRvb2xzCi0KLVRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHZhcmlvdXMgR05VIGNvbXBpbGVycywgYXNzZW1ibGVycywgbGlua2VycywgCi1kZWJ1Z2dlcnMsIGV0Yy4sIHBsdXMgdGhlaXIgc3VwcG9ydCByb3V0aW5lcywgZGVmaW5pdGlvbnMsIGFuZCBkb2N1bWVudGF0aW9uLgotCi1JZiB5b3UgYXJlIHJlY2VpdmluZyB0aGlzIGFzIHBhcnQgb2YgYSBHREIgcmVsZWFzZSwgc2VlIHRoZSBmaWxlIGdkYi9SRUFETUUuCi1JZiB3aXRoIGEgYmludXRpbHMgcmVsZWFzZSwgc2VlIGJpbnV0aWxzL1JFQURNRTsgIGlmIHdpdGggYSBsaWJnKysgcmVsZWFzZSwKLXNlZSBsaWJnKysvUkVBRE1FLCBldGMuICBUaGF0J2xsIGdpdmUgeW91IGluZm8gYWJvdXQgdGhpcwotcGFja2FnZSAtLSBzdXBwb3J0ZWQgdGFyZ2V0cywgaG93IHRvIHVzZSBpdCwgaG93IHRvIHJlcG9ydCBidWdzLCBldGMuCi0KLUl0IGlzIG5vdyBwb3NzaWJsZSB0byBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZSBhbmQgYnVpbGQgYSB2YXJpZXR5IG9mCi10b29scyB3aXRoIG9uZSBjb21tYW5kLiAgVG8gYnVpbGQgYWxsIG9mIHRoZSB0b29scyBjb250YWluZWQgaGVyZWluLAotcnVuIHRoZSBgYGNvbmZpZ3VyZScnIHNjcmlwdCBoZXJlLCBlLmcuOgotCi0JLi9jb25maWd1cmUgCi0JbWFrZQotCi1UbyBpbnN0YWxsIHRoZW0gKGJ5IGRlZmF1bHQgaW4gL3Vzci9sb2NhbC9iaW4sIC91c3IvbG9jYWwvbGliLCBldGMpLAotdGhlbiBkbzoKLQltYWtlIGluc3RhbGwKLQotKElmIHRoZSBjb25maWd1cmUgc2NyaXB0IGNhbid0IGRldGVybWluZSB5b3VyIHR5cGUgb2YgY29tcHV0ZXIsIGdpdmUgaXQKLXRoZSBuYW1lIGFzIGFuIGFyZ3VtZW50LCBmb3IgaW5zdGFuY2UgYGAuL2NvbmZpZ3VyZSBzdW40JycuICBZb3UgY2FuCi11c2UgdGhlIHNjcmlwdCBgYGNvbmZpZy5zdWInJyB0byB0ZXN0IHdoZXRoZXIgYSBuYW1lIGlzIHJlY29nbml6ZWQ7IGlmCi1pdCBpcywgY29uZmlnLnN1YiB0cmFuc2xhdGVzIGl0IHRvIGEgdHJpcGxldCBzcGVjaWZ5aW5nIENQVSwgdmVuZG9yLAotYW5kIE9TLikKLQotSWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBjb21waWxlciBvbiB5b3VyIHN5c3RlbSwgaXQgaXMgb2Z0ZW4gYmVzdCB0bwotZXhwbGljaXRseSBzZXQgQ0MgaW4gdGhlIGVudmlyb25tZW50IGJlZm9yZSBydW5uaW5nIGNvbmZpZ3VyZSwgYW5kIHRvCi1hbHNvIHNldCBDQyB3aGVuIHJ1bm5pbmcgbWFrZS4gIEZvciBleGFtcGxlIChhc3N1bWluZyBzaC9iYXNoL2tzaCk6Ci0KLQlDQz1nY2MgLi9jb25maWd1cmUKLQltYWtlCi0KLUEgc2ltaWxhciBleGFtcGxlIHVzaW5nIGNzaDoKLQotCXNldGVudiBDQyBnY2MKLQkuL2NvbmZpZ3VyZQotCW1ha2UKLQotTXVjaCBvZiB0aGUgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBlbmNsb3NlZCBpcyBjb3B5cmlnaHQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIG9yCi1DT1BZSU5HLkxJQiBpbiB0aGUgdmFyaW91cyBkaXJlY3RvcmllcywgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0ZXJtcyB1bmRlciB3aGljaCB5b3UgY2FuIGNvcHkgdGhlIGZpbGVzLgotCi1SRVBPUlRJTkcgQlVHUzogQWdhaW4sIHNlZSBnZGIvUkVBRE1FLCBiaW51dGlscy9SRUFETUUsIGV0Yy4sIGZvciBpbmZvCi1vbiB3aGVyZSBhbmQgaG93IHRvIHJlcG9ydCBwcm9ibGVtcy4KZGlmZiAtLWdpdCBhL2JmZC9DT1BZSU5HIGIvYmZkL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTQ5YmUuLjAwMDAwMDAKLS0tIGEvYmZkL0NPUFlJTkcKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotCQkJICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKLXNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwotdXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQotdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCi15b3VyIHByb2dyYW1zLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91Ci1kaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgotZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Ci15b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQotc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgotcmlnaHRzLgotCi0gIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKLSgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCi1kaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgotCi0gIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCi10aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQotc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwotdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKLWF1dGhvcnMnIHJlcHV0YXRpb25zLgotCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCi1wcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCi1wcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKLXBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuCi0MCi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucwotYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKLXJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgotbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKLXRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCi1laXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgotbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgotdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCi1pcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KLVdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncwotc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Ci1jb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCi1jb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCi1ub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7Ci1hbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKLXlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgotICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQotICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCi0gICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQotICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKLSAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCi0gICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCi0gICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCi0gICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgotICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCi0gICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKLSAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCi0gICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0MCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCi13aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAotdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCi1TZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCi0gICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCi0gICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQotICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCi0gICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQotICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQotICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCi0gICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKLSAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQotICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKLSAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKLQotVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKLWNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Ci1hc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KLWNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKLXNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQotYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKLWZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAotaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgotCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCi1hY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50Ci1hY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQwKLSAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi1leGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0Ci1vdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKLXZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KLUhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCi10aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAotcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KLXRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwotdGhpcyBMaWNlbnNlLgotCi0gIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KLWFwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCi1jaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCi1pbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKLWdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKLXRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0Ci1zeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCi10byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKLWltcG9zZSB0aGF0IGNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCi1iZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQwKLSAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCi10aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCi1jb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCi1vZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55Ci1sYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1laXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgotdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbi4KLQotICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCi10byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKLW9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKLW9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKLUZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgotT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUwotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCi1UTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCi1QUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKLVJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKLVJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCi1JTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKLU9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLVRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQotWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKLVBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0JICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKLWZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgotCi0gIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Ci10byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAotdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCi0gICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQotYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCi1tb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9iZmQvQ2hhbmdlTG9nIGIvYmZkL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhjZWE0Ny4uMDAwMDAwMAotLS0gYS9iZmQvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMzIwMSArMCwwIEBACi0xOTk5LTA1LTI1ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZW1pdAotICAgICAgICBiYXNlIGZpbGUgZW50cmllcyBmb3IgcGMtcmVsYXRpdmUgdmFsdWVzLgotICAgICAgICAKLTE5OTktMDUtMjUgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zeW1faW4pOiBXaGVuIHdlIGNyZWF0ZSB0aGUgYWN0dWFsIHNlY3Rpb24KLQl0byByZWZsZWN0IHRoZSBub3QtdGhlcmUgc2VjdGlvbiBDX1NFQ1RJT04gc3ltYm9scyByZWZlciB0bywKLQljaGFuZ2UgdGhlIHN5bWJvbCBjbGFzcyB0byBDX1NUQVQgYXMgdGhlIHNlY3Rpb24gaXMgbm93IHJlYWxseQotCXRoZXJlLgotCi0xOTk5LTA1LTI0ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogVW5kbyBjaGFuZ2Ugb2YKLSAJMTk5OS0wMy0yNS4KLQotTW9uIE1heSAxNyAxMzozNTozNSAxOTk5ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQkqIGNvZmYtYXJtLmMgKF9iZmRfY29mZl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MpOiBDaGFuZ2VkCi0JRl9QSUNfSU5UIHRvIEZfUElDLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBBZGRlZCBGX0FSTV8yYSwgYW5kCi0JRl9BUk1fM00gbGFiZWxzLiAgQ2hhbmdlZCBGX1BJQ19JTlQgdG8gRl9QSUMuCi0JCi0xOTk5LTA1LTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLW1jb3JlLmMgKGluX3JlbG9jX3ApOiBSZWluc3RhdGUuCi0KLTE5OTktMDUtMTUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19NQ09SRV9SVkEpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb2ZmLW1jb3JlLmMgKGluX3JlbG9jX3ApOiBSZW1vdmUgZGVmaW50aW9uLgotCShtY29yZV9jb2ZmX2hvd3RvKTogQWRkIElNQUdFX1JFTF9NQ09SRV9SVkEuCi0JKG1jb3JlX2NvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBNYXAgQkZEX1JFTE9DX1JWQSB0bwotCUlNQUdFX1JFTF9NQ09SRV9SVkEuCi0JKGNvZmZfbWNvcmVfcnR5cGVfdG9faG93dG8pOiBBZGQgc3BlY2lhbCBwcm9jZXNzaW5nIGZvcgotCUlNQUdFX1JFTF9NQ09SRV9SVkEuCi0JKGNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbik6IEFkZCBzdXBwb3J0IGZvcgotCUlNQUdFX1JFTF9NQ09SRV9SVkEuIAotCSogZWxmMzItbWNvcmUgKG1jb3JlX2VsZl9ob3d0b18pOiBBZGQgUl9NQ09SRV9SRUxBVElWRS4KLQkobWNvcmVfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogTWFwIEJGRF9SRUxPQ19SVkEgdG8KLQlSX01DT1JFX1JFTEFUSVZFLgotCShtY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERlbGV0ZSByZWR1bmRhbnQgY2FzZSBsYWJlbHMuIAotCQotRnJpIE1heSAxNCAxMDo1OTo1NSAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IEZpeCBvcGVyYXRvcgotIAlwcmVjZWRlbmNlIGJldHdlZW4gYml0LWFuZCBhbmQgY29tcGFyaXNvbi4KLQotVGh1IE1heSAxMyAwOTo0NToyMyAxOTk5ICBKb2VsIFNoZXJyaWxsIChqb2VsQE9BUmNvcnAuY29tKQotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdODYqLSotcnRlbXMqLCBtNjhrKi0qLXJ0ZW1zKik6IEFkZGVkIHRvCi0JbGlzdCBvZiB0YXJnZXQgZm9ybWF0cyAodGFyZ19zZWx2ZWNzKS4KLQkoaVszNDU2XTg2Ki0qLXJ0ZW1zZWxmKiwgbWlwcyplbC0qLXJ0ZW1zKik6IE5ldyB0YXJnZXRzLgotCShwb3dlcnBjbGUqLSpydGVtcyosIHNoLSotcnRlbXNlbGYqKTogTmV3IHRhcmdldHMuCi0KLTE5OTktMDUtMTAgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3dyaXRlX2FybWFwKTogZ2l2ZSB0aGUgc3ltdGFiIGVsZW1lbnQgYQotCXJlYXNvbmFibGUgbW9kZSB1bnRpbCAiYXIgeCIgaXMgc21hcnQgZW5vdWdoIHRvIHNraXAgaXQgKGZpeGVzCi0JZ2NjL2xpYmdjYy5hIGJ1aWxkcyBvbiBtaXBzLWVjb2ZmIHRhcmdldHMKLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBFeHBsYWluIGhvdyBDT01EQVRzIGFyZSBzdXBwb3NlZAotCXRvIHdvcmsuICBIYWNrIHRvIHN1cHBvcnQgTVMgaW1wb3J0IGxpYnJhcmllcywgd2hpY2ggdXNlIGRpZmZlcmVudAotCUNPTURBVCB0eXBlcyB0aGFuIEdOVS4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBDX1NFQ1RJT04gc3ltYm9scyBhcmUgbG9jYWw7IHRoZXkgcmVmZXIKLQl0byBpbXBsaWVkIHplcm8tbGVuZ3RoIHNlY3Rpb25zIChzZWUgcGVpY29kZSBiZWxvdykKLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBQcm9wZXJseSByZWFkIGxvbmcgTVMKLQlmaWxlbmFtZSBzeW1ib2xzLCB3aGljaCB1c2Ugb25lICpvciBtb3JlKiBhdXhlbnRzLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2F1eF9pbik6IGRpdHRvCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zeW1faW4pOiBCdWlsZCB0aGUgaW1wbGllZCB6ZXJvLWxlbmd0aAotCXNlY3Rpb25zCi0JCi1UdWUgTWF5IDExIDE1OjUxOjU4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9ob3d0b190YWJsZSk6IE1ha2UgcGFydGlhbF9pbnBsYWNlIGZhbHNlCi0JZm9yIGFsbCByZWxvY2F0aW9ucy4KLQotMTk5OS0wNS0xMCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBiZmQtaW4uaCAoYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMpOiAgU3RhdGljCi0gICAgICAgIGlmIENPRkZfSU1BR0VfV0lUSF9QRS4KLSAgICAgICAgKGJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IExpa2V3aXNlLgotICAgICAgICAoYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcpOiBMaWtld2lzZS4KLSAgICAgICAgKiBjb2ZmLWFybS5jOiBMaWtld2lzZS4KLSAgICAgICAgKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0gICAgICAgICogY29uZmlndXJlLmluIChhcm1wZV9saXR0bGVfdmVjKTogUmVtb3ZlIGNvZmYtYXJtLmxvLgotICAgICAgICAoYXJtcGVfYmlnX3ZlYyk6IExpa2V3aXNlLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotMTk5OS0wNS0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2hlY2sgZm9yIC5yZWwuIGFzIHN0YXJ0IG9mIHJlbAotCXNlY3Rpb24sIG5vdCBqdXN0IC5yZWwuICBTYW1lIGZvciAucmVsYS4KLQotMTk5OS0wNS0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jIChjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24pOiBSZXBsYWNlIGFzc2VydCBhYm91dAotCWVuZGlhbmlzbSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuCi0KLVRodSBNYXkgIDYgMTc6MDk6MDkgMTk5OSAgRnJlZCBGaXNoICA8Zm5mQGJlLmNvbT4KLQotCSogZHdhcmYyLmMgKHJlYWRfYWJicmV2cyk6IENoYW5nZSBjYXN0IG9mIGR3YXJmX2FiYnJldl9idWZmZXIKLQlhc3NpZ25tZW50IGZyb20gInVuc2lnbmVkIGNoYXIgKiIgdG8gImNoYXIgKiIuCi0JKGRlY29kZV9saW5lX2luZm8pOiBMaWtld2lzZSBmb3IgZHdhcmZfbGluZV9idWZmZXIgYXNzaWdubWVudC4KLQotMTk5OS0wNS0wNSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogIEFkZCBvbmUgdG8KLSAgICAgICAgYWRkcmVzcyBvZiBBUk1fUlZBMzIgdGh1bWIgZnVuY3Rpb25zLgotIAotMTk5OS0wNS0wNSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0gCi0gICAgICAgICogZWxmMzItbTY4ay5jIChlbGYzMl9tNjhrX3NldF9wcml2YXRlX2ZsYWdzKTogTmV3LgotICAgICAgICAoZWxmMzJfbTY4a19jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0gICAgICAgIChlbGYzMl9tNjhrX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0gICAgICAgIChlbGYzMl9tNjhrX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0gICAgICAgIChDUFUzMl9GTEFHKTogRGVmaW5lLgotICAgICAgICAoUExUX0NQVTMyX0VOVFJZX1NJWkUpOiBEZWZpbmUuCi0gICAgICAgIChlbGZfY3B1MzJfcGx0MF9lbnRyeSk6IERlY2xhcmUuCi0gICAgICAgIChlbGZfY3B1MzJfcGx0X2VudHJ5KTogRGVjbGFyZS4KLSAgICAgICAgKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEdlbmVyYXRlIGNwdTMyIHBsdCBlbnRyaWVzLgotICAgICAgICAoZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0gICAgICAgIChlbGZfbTY4a19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotICAgICAgICAoZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplKTogUmVtb3ZlIGRlZmluaXRpb24uCi0gICAgICAgIChiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZS4KLSAgICAgICAgKGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZS4KLSAgICAgICAgKGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBEZWZpbmUuCi0gICAgICAgIChiZmRfZWxmMzJfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0gCi1Nb24gTWF5ICAzIDA5OjI0OjQ5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9maXh1cF9mb3JtYXRzKTogRml4IGNvbW1lbnRzIGZvciBSX1NIT1JUX1BDUkVMX01PREUKLQlhbmQgUl9MT05HX1BDUkVMX01PREUuCi0KLTE5OTktMDQtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbWNvcmUuYyAoY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHR5cG9zLgotCi1GcmkgQXByIDI4IDE2OjM2OjE5IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zaC5jIChzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEluY2x1ZGUgcmVsb2NhdGlvbiBhZGRlbmQKLQlpbiByZWxvY2F0aW9uIGNhbGN1bGF0aW9uLgotCi0xOTk5LTA0LTI2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogVXBkYXRlZCBmb3IgbmV3IHZlcnNpb24gb2YgbGlidG9vbC4KLQotMTk5OS0wNC0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jOiBBZGQgc3VwcG9ydCBmb3IgbWNvcmUgcmVsb2NzLgotCi0xOTk5LTA0LTIwICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBTY3JhcCB0aGUKLQlpbmNvcnJlY3QgdXNlIEVGX01JUFNfeHhCSVRQVFJTLgotCi0xOTk5LTA0LTE4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQgbG9jYWwKLQl2YXJpYWJsZSBpbnNuLgotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotU2F0IEFwciAxNyAyMDo1NToxNSAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3J0eXBlX3RvX2hvd3RvKTogUmVtb3ZlIEFSTTI2RCB0cmFuc2Zvcm0uCi0JKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiAgQWRkIEFSTTI2RCB0cmFuc2Zvcm0uICBPbmx5Ci0JY2hhbmdlIHRvIEFSTTI2RCBmb3IgcmVsb2NhdGVhYmxlIGxpbmtzLgotCi0xOTk5LTA0LTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQotMTk5OS0wNC0xNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgRm9yIFJfQVJNX1RITV9BQlM1LAotCXJlZmV0Y2ggYWRkZW5kIGlmIFVTRV9SRUwsIGFkZCBtYW55IGNvbW1lbnRzIHJlZ2FyZGluZyBjdXJyZW50IHN0YXRlLgotCUZvciBSX0FSTV9USE1fUEMyMiwgcmVmZXRjaCBhZGRlbmQgaWYgVVNFX1JFTCwgc2ltcGxpZnkuCi0JKiBlbGZhcm0tbmFiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBGb3IgUl9BUk1fVEhNX0FCUzUsIGZpeAotCXNpemUgYW5kIHJpZ2h0c2hpZnQuICBGb3IgUl9BUk1fVEhNX1BDMjIsIGZpeCBiaXRzaXplLgotCSogZWxmYXJtLW9hYmkuYyAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKTogRGl0dG8uCi0KLVdlZCBBcHIgMTQgMTQ6MzM6MDggMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IFplcm8gYGRlYnVnJy4KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbyk6IExpa2V3aXNlLgotCi0xOTk5LTA0LTEzICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotCSogZHdhcmYyLmMgKGRlY29kZV9saW5lX2luZm8pOiBEb24ndCB0cnVuY2F0ZSBhZGRyZXNzIHRvIGxlYXN0Ci0Jc2lnbmlmaWNhbnQgMzIgYml0cyAoYnJlYWtzIDY0IGJpdCB0YXJnZXRzKS4KLQkobG9va3VwX2FkZHJlc3NfaW5fZnVuY3Rpb25fdGFibGUpOiBEaXR0by4KLQkoY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MpOiBEaXR0by4KLQotVHVlIEFwciAxMyAyMToyNzoxOSAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5KTogTmV3IHJvdXRpbmUuCi0JKEEyVDNfT0ZGU0VUKTogRGVmaW5lLgotCShUMkEzX09GRlNFVCk6IERlZmluZS4KLQkoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6ICBFbWl0IGJhc2UgZmlsZSBlbnRyaWVzIGZvciBpbnRlcndvcmtpbmcKLQlzdHVicy4KLQotMTk5OS0wNC0xMyAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KLQotCSogZWxmYXJtLW5hYmkuYyAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKTogQWRkIGR1bW15IGVudHJpZXMgZm9yCi0JcmVsb2NzIDE3IHRocm91Z2ggMTkuCi0KLVN1biBBcHIgMTEgMDE6MjU6MTcgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oOiBSZW1vdmUgZm5tYXRjaC5oLgotCSogZWxmbGluay5oIChlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBDYWxsIGJhY2sgdG8gbGQKLQlpbnN0ZWFkIG9mIGNhbGxpbmcgZm5tYXRjaC4KLQotCSogY29uZmlnLmJmZCAoaT84Ni0qLWJlb3NlbGYpOiBJbmNsdWRlIHBlIHZlY3MuCi0KLVN1biBBcHIgMTEgMDE6MTQ6MDYgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IEFsbG93IC5wbHQKLQl0byBnbyBtaXNzaW5nLgotCi0xOTk5LTA0LTEwICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBNaW5kIG5vX3VuZGVmaW5lZAotCXdoZW4gdHJ5aW5nIHRvIHJlc29sdmUgZHluYW1pYyBzeW1ib2wgcmVmZXJlbmNlcy4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KLQotU2F0IEFwciAxMCAxNToxMjowOSAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzZWN0aW9uLmMgKF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCk6IE5ldyBmdW5jdGlvbiBtb3ZlZCBmcm9tCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0KTogLi4uIGhlcmUuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBpdC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBVcGRhdGUuCi0KLTE5OTktMDQtMDkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGY2NC1zcGFyYy5jOiBGaXggaW5jb3JyZWN0IGNhbGxzIHRvIGJmZF9jaGVja19vdmVyZmxvdy4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jOiBOZXcgRmlsZTogU3VwcG9ydCBmb3IgbWNvcmUtcGUgdGFyZ2V0cy4KLQkqIGNwdS1tY29yZS5jOiBOZXcgRmlsZTogU3VwcG9ydCBmb3IgbWNvcmUgdGFyZ2V0cy4KLQkqIGVsZjMyLW1jb3JlLmM6IE5ldyBGaWxlOiBTdXBwb3J0IGZvciBtY29yZS1lbGYgdGFyZ2V0LgotCSogcGUtbWNvcmUuYzogTmV3IEZpbGU6IERlZmluaXRpb25zIGZvciBtY29yZS1wZSB0YXJnZXQuCi0JKiBwZWktbWNvcmUuYzogTmV3IEZpbGU6IERlZmluaXRpb25zIGZvciBtY29yZS1wZWkgdGFyZ2V0LgotCSogTWFrZWZpbGUuYW06IEFkZCBzdXBwb3J0IGZvciBNQ29yZSB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIHRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBhcmNodXJlcy5jOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgYXJjaGl0ZWN0dXJlLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLiAKLQkqIGNvZmZjb2RlLmg6IEFkZCBzdXBwb3J0IGZvciBtY29yZS1wZSB0YXJnZXRzLgotCSogZWxmLmM6IEFkZCBzdXBwb3J0IGZvciBtY29yZS1lbGYgdGFyZ2V0LgotCSogcmVsb2MuYzogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIHJlbG9jcy4KLQkqIHRhcmdldHMuYzogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIHRhcmdldHMuCi0KLTE5OTktMDQtMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZmFybS1uYWJpLmMgKGVsZjMyX2FybV9ob3d0b190YWJsZSk6IEFkZCBlbnRyaWVzIGZvcgotCVJfQVJNX1hQQzI1IGFuZCBSX0FSTV9USE1fWFBDMjIuCi0JKGVsZjMyX2FybV9yZWxvY19tYXApOiBSZW1vdmUgcmVkdW5kYW50IGVudHJpZXMuCi0KLTE5OTktMDQtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBzeXNkZXAuaCAoTENfTUVTU0FHRVMpOiBOZXZlciBkZWZpbmUuCi0KLTE5OTktMDQtMDYgIENocmlzIFRvcmVrICA8dG9yZWtAYnNkaS5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9jaGVja19vdmVyZmxvdyk6IEFkZCBhZGRyc2l6ZSBwYXJhbWV0ZXIuICBDaGFuZ2UKLQlhbGwgY2FsbGVycy4gIFJld3JpdGUgY29tcGxldGVseS4KLQkoX2JmZF9yZWxvY2F0ZV9jb250ZW50cyk6IFJld3JpdGUgb3ZlcmZsb3cgY2hlY2tpbmcuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLTE5OTktMDQtMDUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBHYWJyaWVsIFBhdWJlcnQgPHBhdWJlcnRAaXJhbS5lcz46Ci0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBTZXQgUl9QUENfR09UMTZfTE8sCi0JUl9QUENfUExUMTZfTE8gYW5kIFJfUFBDX1NFQ1RPRkZfTE8gdG8gYmUgY29tcGxhaW5fb3ZlcmZsb3dfZG9udC4KLQlTZXQgUl9QUENfUExUMTZfSEEsIFJfUFBDX1NFQ1RPRkZfSEEgYW5kIFJfUFBDX0VNQl9OQUREUjE2X0hBIHRvCi0JaGF2ZSBhIHJpZ2h0c2hpZnQgb2YgMTYgYW5kIHVzZSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYy4KLQkqIHBwY2Jvb3QuYyAocHBjYm9vdF92ZWMpOiBVc2UgbGl0dGxlIGVuZGlhbiByb3V0aW5lcyBmb3IKLQloZWFkZXJzLgotCi0JKiBlbGYuYyAoZWxmY29yZV9zdHJuZHVwKTogT25seSBkZWZpbmUgaWYgaXQgd2lsbCBiZSB1c2VkLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsYXhfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIGlyZWwKLQlhbmQgaXJlbGVuZC4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBSZW1vdmUgdW51c2VkIGxvY2FsIGkuCi0JKHBwY19lbGZfZ2NfbWFya19ob29rKTogQWRkIGRlZmF1bHQgY2FzZSB0byBzd2l0Y2guCi0KLQlGcm9tIEJlcm5kIE5pdHpsZXIgPG5pdHpsZXJAa2FnY3BkMDEuYWcwMS5rb2Rhay5DT00+OgotCSogc3JlYy5jIChzcmVjX3NjYW4pOiBBY2NlcHQgXHIgaW4gc3ltYm9sIGRlZmluaXRpb25zLgotCShzcmVjX29iamVjdF9wKTogU2V0IEhBU19TWU1TIGlmIHdlIHNhdyBhbnkgc3ltYm9scy4KLQkoc3ltYm9sc3JlY19vYmplY3RfcCk6IExpa2V3aXNlLgotCi0xOTk5LTA0LTA0ICBEb24gQm93bWFuIDxkb25AcGl4c2NpLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIG1pcHMqZWwtKi12eHdvcmtzKiBhbmQgbWlwcyotKi12eHdvcmtzKi4KLQotMTk5OS0wNC0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGR3YXJmMS5jIChwYXJzZV9saW5lX3RhYmxlKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgbGFzdF9wYyBhbmQKLQlsYXN0X2xpbmUuCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmY29yZV9zZWN0aW9uX2Zyb21fcGhkcik6IERlY2xhcmUuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2djX21hcmtfaG9vayk6IEFkZCBkZWZhdWx0IGNhc2UgdG8KLQlzd2l0Y2guCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogUmVtb3ZlIHVudXNlZAotCWxvY2FsIGkuCi0JKiBzeW1zLmMgKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogUmVtb3ZlIHVudXNlZAotCWxvY2FsIHZhbC4KLQotMTk5OS0wMy0zMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIGFybS1lcG9jLXBlIHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIGFybS1lcG9jLXBlIHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIHRhcmdldHMuYzogQWRkIHN1cHBvcnQgZm9yIGFybS1lcG9jLXBlIHRhcmdldC4KLQkqIGNvZmYtYXJtLmM6IEFsbG93IGhlYWRlciBmaWxlcyB0byBvdmVycmlkZSBkZWZpbml0aW9uIG9mCi0JVEFSR0VUX1VOREVSU0NPUkUgYW5kIFVTRVJfTEFCRUxfUFJFRklYLgotCSogcGUtYXJtLmg6IEFsbG93IHByZXZpb3VzIGhlYWRlciBmaWxlcyB0byBvdmVycmlkZSBkZWZpbml0aW9uIG9mCi0JVEFSR0VUX0xJVFRMRV9TWU0gYW5kIFRBUkdFVF9CSUdfU1lNLgotCSogcGVpLWFybS5oOiBBbGxvdyBwcmV2aW91cyBoZWFkZXIgZmlsZXMgdG8gb3ZlcnJpZGUgZGVmaW5pdGlvbiBvZiAKLQlUQVJHRVRfTElUVExFX1NZTSBhbmQgVEFSR0VUX0JJR19TWU0uCi0JKiBlcG9jLXBlLWFybS5jOiBOZXcgZmlsZS4gIFN1cHBvcnQgYXJtLWVwb2MtcGUgdGFyZ2V0LgotCSogZXBvYy1wZWktYXJtLmM6IE5ldyBmaWxlLiAgU3VwcG9ydCBhcm0tZXBvYy1wZWkgdGFyZ2V0LgotCQotMTk5OS0wMy0zMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGVsZl9tYXBfc3ltYm9scyk6IEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBzZWN0aW9uCi0Jc3ltYm9scyBhcmUgZ2VuZXJhdGVkIGZvciBjb250ZW50LWxlc3Mgc2VjdGlvbnMgd2hpY2ggYXJlCi0Jbm90IG1hcHBlZCB0byB0aGUgb3V0cHV0IGZpbGUuCi0KLQkqIGxpbmtlci5jOiBSZXBsYWNlIGRpcmVjdCByZWZlcmVuY2VzIHRvIGZpZWxkcyBpbiBCRkQgc3RydWN0dXJlCi0Jd2l0aCBhY2Nlc3NvciBtYWNyb3MuCi0KLQkqIGVsZmxpbmsuaDogUmVwbGFjZSBkaXJlY3QgcmVmZXJlbmNlcyB0byBmaWVsZHMgaW4gQkZEIHN0cnVjdHVyZQotCXdpdGggYWNjZXNzb3IgbWFjcm9zLgotCi0xOTk5LTAzLTI1ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogY29uZmlnLmJmZDogRWxpbWluYXRlIHJlZHVuZGFuY3kgaW4gY2hlY2tzIGZvciBMaW51eC9BUk0uCi0JCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBUYWtlIHRoZSByaWdodHNoaWZ0IGludG8gCi0JYWNjb3VudCB3aGVuIGFkanVzdGluZyBzZWN0aW9uIHN5bWJvbHMgZHVyaW5nIGEgcGFydGlhbCBsaW5rLgotCi0xOTk5LTAzLTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNwYXJjLmMgKHN0cnVjdCBjb2ZmX3JlbG9jX21hcCk6IENoYW5nZSB0eXBlIG9mIGZpZWxkCi0JICAnYmZkX3JlbG9jX3ZhbCcgdG8gYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLgotCSogZWxmLW0xMDIwMC5jIChzdHJ1Y3QgbW4xMDIwMF9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZi1tMTAzMDAuYyAoc3RydWN0IG1uMTAzMDBfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1hcmMuYyAoc3RydWN0IGFyY19yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLWQxMHYuYyAoc3RydWN0IGQxMHZfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1kMzB2LmMgKHN0cnVjdCBkMzB2X3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmMzItZnIzMC5jIChzdHJ1Y3QgZnIzMF9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLW0zMnIuYyAoc3RydWN0IG0zMnJfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1zaC5jIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmMzItc3BhcmMuYyAoc3RydWN0IGVsZl9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLXY4NTAuYyAoc3RydWN0IHY4NTBfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGY2NC1zcGFyYy5jIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmYXJtLW5hYmkuYyAoc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZmFybS1vYWJpLmMgKHN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwKTogRGl0dG8uCi0KLTE5OTktMDMtMTcgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBzeW1zLmMgKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2hhbmdlZCB0aGlzCi0JZnVuY3Rpb24gc28gc291cmNlLWxldmVsIGFzc2VtYmx5IHdvcmtzLiAgSWYgbXVsdGlwbGUgTl9TT3MKLQlhcmUgc2VlbiB3aXRob3V0IGFuZCBOX0ZVTnMsIGNyZWF0ZSBhbiBpbmRleHRhYmxlIGVudHJ5IHdpdGgKLQlhIE5VTEwgZnVuY3Rpb24gbmFtZS4KLQotMTk5OS0wMy0xNiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKSBBbGxvdyBtZXJnaW5nCi0Jb2YgY2VydGlhbiBzaW1pbGFyIGNwdXMuCi0KLTE5OTktMDMtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6Ci0JQWRkIHRoZSA1MDAwLiAgQ2hhbmdlIHRoZSBhcmNoaXRlY3R1cmUgZm9yIHRoZSA1NDAwIHRvIG1pcHM0LgotCShlbGZfbWlwc19tYWNoKTogQWRkIHI1MDAwLgotCi0xOTk5LTAzLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNwdS1pOTYwLmMgKHNjYW5faTk2MF9tYWNoKTogUmVjb2duaXplIGk5NjA6a2Ffc2EgYW5kIGk5NjA6a2Jfc2IuCi0KLTE5OTktMDMtMTEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBHZW5lcmF0ZSB3YXJuaW5nIGFib3V0Ci0JaHVnZSBmaWxlIG9mZnNldHMgZm9yIGFueSBzZWN0aW9uIHRoYXQgd2lsbCBvY2N1cHkgZmlsZSBzcGFjZSwgbm90Ci0JanVzdCB0aG9zZSB0aGF0IGFyZSBsb2FkYWJsZS4KLQotMTk5OS0wMi0yNCAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZSBhZnRlciBOaWNrIENsaWZ0b24ncyBGZWIgMTcgY2hhbmdlcy4KLQotMTk5OS0wMi0yMiAgSmltIExlbWtlICA8amxlbWtlQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jOiBBZGQgcHBjX2VsZl9yZWxheF9zZWN0aW9uKCkgZm9yIHRoZSBsZCBvcHRpb24gbXBjODYwYzAuCi0KLU1vbiBGZWIgMjIgMTg6MjY6NTEgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSyk6IERlZmluZS4KLQkqIGVsZmxpbmsuaDogUmV2ZXJ0IGFsbCBjaGFuZ2VzIHNpbmNlIEZlYiAxNi4gIEluc3RlYWQ6Ci0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFNldCBSRUZfUkVHVUxBUl9OT05XRUFLIGZsYWcgaWYKLQlhcHByb3ByaWF0ZS4gIENvcHkgaXQgdG8gdmVyc2lvbiBzeW1ib2xzLgotCShlbGZfZml4X3N5bWJvbF9mbGFncyk6IFNldCBSRUZfUkVHVUxBUl9OT05XRUFLIGZvciBub24gRUxGCi0Jc3ltYm9scyBpZiBhcHByb3ByaWF0ZS4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFNldCBSRUZfUkVHVUxBUl9OT05XRUFLIGZvciB3ZWFrZGVmCi0Jc3ltYm9sIGlmIGFwcHJvcHJpYXRlLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogSWYgc3ltYm9sIGlzIG1hcmtlZCBhcyB1bmRlZmluZWQsIGFuZAotCWhhcyBubyBub253ZWFrIHJlZmVyZW5jZXMsIG1hcmsgaXQgYXMgd2VhayB1bmRlZmluZWQuCi0KLUZyaSBGZWIgMTkgMTY6MDE6MTIgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBXaGVuIG92ZXJyaWRpbmcgYSBkeW5hbWljCi0JZGVmaW5pdGlvbiB3aXRoIGEgd2VhayB1bmRlZmluZWQgc3ltYm9sLCBzZXQgTkVFRFNfUExUIGlmIGl0IGlzIGEKLQlmdW5jdGlvbi4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgY29weSB0aGUgb3RoZXIgZmllbGQgaWYgd2UKLQlhcmUgb3ZlcnJpZGRpbmcuCi0KLVRodSBGZWIgMTggMTg6MDc6NDMgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBEbyBub3QgbWVyZ2UgYW55IHN5bWJvbCBmcm9tIGEKLQlzaGFyZWQgb2JqZWN0IHdpdGggYSB3ZWFrIHVuZGVmaW5lZCBzeW1ib2wuCi0KLTE5OTktMDItMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZmFybS1uYWJpLmM6IFNldCBwYXJ0aWFsX2lucGxhY2UgYmFjayB0byBmYWxzZS4KLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBSZS1lbmFibGUuCi0JKFVTRVJfTEFCRUxfUFJFRklYKTogU2V0IHRvICJfIi4KLQotCVRoZSBmb2xsb3dpbmcgcGF0Y2hlcyBhcmUgZnJvbTogU2NvdHQgQmFtYnJvdWdoCi0JPHNjb3R0YkBjb3JlbGNvbXB1dGVyLmNvbT4KLQkKLQkqIGxpYmFvdXQuaCAoTV9BUk02X05FVEJTRCk6IFNldCB0byAxNDMuCi0KLQkqIHJlbG9jLmM6IEFkZCBBUk0gUElDIHJlbG9jczogICBCRkRfUkVMT0NfQVJNX0dPVDEyLAotCUJGRF9SRUxPQ19BUk1fR09UMzIsIEJGRF9SRUxPQ19BUk1fSlVNUF9TTE9ULCBCRkRfUkVMT0NfQVJNX0NPUFksCi0JQkZEX1JFTE9DX0FSTV9HTE9CX0RBVCwgQkZEX1JFTE9DX0FSTV9QTFQzMiwKLQlCRkRfUkVMT0NfQVJNX1JFTEFUSVZFLCBCRkRfUkVMT0NfQVJNX0dPVE9GRiwgQkZEX1JFTE9DX0FSTV9HT1RQQy4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQotCSogZWxmYXJtLW5hYmkuYyAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKTogU2V0IHBhcnRpYWxfaW5wbGFjZSB0bwotCSd0cnVlJyBhcyBSRUwgcmVsb2NzIGFyZSBub3cgYmVpbmcgdXNlZC4gIEFkZCBuZXcgUElDIHJlbG9jczoKLQlSX0FSTV9DT1BZLCBSX0FSTV9HTE9CX0RBVCwgUl9BUk1fSlVNUF9TTE9ULCBSX0FSTV9SRUxBVElWRSwKLQlSX0FSTV9HT1RPRkYsIFJfQVJNX0dPVFBDLCBSX0FSTV9HT1QzMiwgUl9BUk1fUExUMzIuCi0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENoZWNrIGJ5dGUgb3JkZXIKLQlvZiB0YXJnZXRzLgotCShlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6IENoYW5nZSBwYXJhbWV0ZXJzIHNvIHRoYXQgZW50aXJlCi0JcmVsb2MgaXMgcGFzc2VkLiAgQWRkIHN1cHBvcnQgZm9yIFBJQyByZWxvY3MuCi0JKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogUGFzcyBlbnRpcmUgcmVsb2MgdG8KLQllbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZS4gCi0JKGVsZjMyX2FybV9jaGVja19yZWxvY3MpOiBIYW5kbGUgbmV3IFBJQyByZWxvY3MuCi0JKGVsZjMyX2FybV9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2FybV9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2FybV9kaXNjYXJkX2NvcGllcyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9uLgotCShFTEZfTUFYUEFHRV9TSVpFKTogRGVmaW5lLgotCShiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0KTogRGVmaW5lLgotCShlbGZfYmFja2VuZF93YW50X3BsdF9zeW0pOiBEZWZpbmUuCi0JCi1XZWQgRmViIDE3IDEyOjAyOjI2IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBNYWtlIHJlZ2luZm8KLQlzZWN0aW9ucyBTRUNfTElOS19PTkNFIGFuZCBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRS4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgMTcgMTI6MDc6MjMgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotIAotICAgICAgICAqIGVsZmFybS1vYWJpLmMgKGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zLAotICAgICAgICBiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZywKLSAgICAgICAgYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogRGVmaW5lIHRvIGF2b2lkIGNsYXNoCi0gICAgICAgIHdpdGggZWxmYXJtLW5hYmkuYy4KLSAKLSAgICAgICAgKiBlbGYzMi1hcm0uaDogRG9uJ3QgZGVjbGFyZSBlbGYzMl9hcm1faW5mb190b19ob3d0by4KLSAgICAgICAgKGVsZjMyX3RodW1iX3RvX2FybV9zdHViLCBlbGYzMl9hcm1fdG9fdGh1bWJfc3R1YiwKLSAgICAgICAgZWxmMzJfYXJtX2ZpbmRfbmVhcmVzdF9saW5lKTogTWFrZSB0aGVtIHN0YXRpYy4KLQotVHVlIEZlYiAxNiAyMjo0NDozNyAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IEFkZCBwZmxhZ3MgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBEbyBub3QgbWVyZ2UgYSBkZWZpbml0aW9uIGZyb20gYSBzaGFyZWQgb2JqZWN0IHdpdGggYQotCXdlYWsgdW5kZWZpbmVkIHN5bWJvbC4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG8gbm90IGNoYW5nZSB0aGUgc3ltYm9sIHR5cGUgb3IKLQlzaXplIGlmIHRoZSBvbGQgc3ltYm9sIG92ZXJyaWRlcyB0aGUgbmV3IG9uZS4KLQotMTk5OS0wMi0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIHN0cm9uZ2FybSB0YXJnZXQuCi0KLU1vbiBGZWIgIDggMTE6MTg6MTQgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKHJlbG9jX21hcCk6IFVzZSB0aGUgY29ycmVjdCB0eXBlcyBmb3IgdGhlIHN0cnVjdAotCWZpZWxkcyBpbnN0ZWFkIG9mIHVuc2lnbmVkIGNoYXIuCi0KLUZyaSBGZWIgIDUgMDA6MjI6MzYgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IEZlYiAgNCAyMjozMDoxMyAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIEFDX1BSRVJFUSB0byAyLjEzLiAgUmVtb3ZlIEFNX0NZR1dJTjMyLgotCUNoYW5nZSBBTV9FWEVFWFQgdG8gQUNfRVhFRVhUIGFuZCBBTV9QUk9HX0lOU1RBTEwgdG8KLQlBQ19QUk9HX0lOU1RBTEwuICBBZGQgY29tbWVudHMgdG8gdXNlcyBvZiBBQ19ERUZJTkUuCi0JKiBhY2luY2x1ZGUubTQ6IEFkZCBjb21tZW50cyB0byB1c2VzIG9mIEFDX0RFRklORS4KLQkqIGFjY29uZmlnLmg6IFJlbW92ZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGN1cnJlbnQgYXV0b2NvbmYvYXV0b21ha2UuCi0JKiBhY2xvY2FsLm00OiBMaWtld2lzZS4KLQkqIGNvbmZpZy5pbjogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogTGlrZXdpc2UuCi0KLTE5OTktMDItMDQgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQuYyAocmVhbF9yZWFkKTogZG9uJ3QgY2FsbCBmcmVhZCBmb3IgemVybyBieXRlcy4gIFRoaXMKLQljb3ZlcnMgdXAgYSBidWcgKG9yIG1pc3VzZSBvZiBiZmQpIHRoYXQncyBleHBvc2VkIGJ5IFNvbGFyaXMuCi0KLVRodSBGZWIgIDQgMTI6Mzg6MTAgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEluc3VyZSB0aGF0IHRoZSB0YXJnZXQKLQlvZiBhIGp1bXAgaXMgaW4gdGhlIGN1cnJlbnQgMjU2IE1CIHJlZ2lvbi4KLQotVGh1IEZlYiAgNCAxMjoxNTozOCAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBDaGFuZ2UgbGFzdCBwYXRjaCB0byBvbmx5Ci0JdGFrZSBlZmZlY3QgZm9yIHRoZSBiaW5hcnkgdGFyZ2V0LgotCi1XZWQgRmViICAzIDE5OjQwOjEyIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBCRkRfUkVMT0NfQ1RPUi4KLQotV2VkIEZlYiAgMyAxNTowMjo0NCAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9jaGVja19yZWxvY3MpOiAgTmV3IHJvdXRpbmUuCi0KLVR1ZSBGZWIgIDIgMjE6Mzg6MjggMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogSWYgdGhlIHRhcmdldCB3YXMKLQlwcmV2aW91c2x5IHNwZWNpZmllZCwgZG9uJ3QgY2hlY2sgb3RoZXIgdGFyZ2V0cyB3aGVuIGNoZWNraW5nIGZvcgotCWFuIGFyY2hpdmUgZmlsZS4KLQotVHVlIEZlYiAgMiAxODoxNjo0MyAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fcmVsb2NfbWFwKTogIFJlbW92ZWQuCi0gICAgICAgIChlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXApOiAgUmVtb3ZlZAotICAgICAgICAqIGVsZmFybS1uYWJpLmMgKGVsZjMyX2FybV9yZWxvY19tYXApOiAgTmV3LgotICAgICAgICAoZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwKTogIE5ldy4KLSAgICAgICAgKiBlbGZhcm0tb2FiaS5jIChlbGYzMl9hcm1fcmVsb2NfbWFwKTogIE5ldy4KLSAgICAgICAgKGVsZjMyX2FybV9yZWxvY190eXBlX2xvb2t1cCk6ICBOZXcuCi0KLU1vbiBGZWIgIDEgMTk6NDk6MjEgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGZhcm0tbmFiaS5jOiAgUmVuYW1lZCBmcm9tIGVsZjMyLWFybS1uZXdhYmkuYy4KLSAgICAgICAgKiBlbGZhcm0tb2FiaS5jOiAgUmVuYW1lZCBmcm9tIGVsZjMyLWFybS1vbGRhYmkuYwotICAgICAgICAqIE1ha2VmaWxlLmFtOiAgVXNlIG5ldyBmaWxlcy4KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogIFJlZ2VuZXJhdGUuCi0gICAgICAgICogY29uZmlndXJlLmluOiAgVXNlIG5ldyBmaWxlcy4KLSAgICAgICAgKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlLiAgICAgICAKLQotMTk5OS0wMi0wMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9nY19tYXJrX2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKGZyMzBfZWxmX2djX3N3ZWVwX2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6IERlZmluZS4KLQotTW9uIEZlYiAgMSAxMjoyMTo0NyAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiAgQWRkIGJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWMKLSAgICAgICAgYW5kIGJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMuCi0KLU1vbiBGZWIgIDEgMTE6NDY6MzEgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBNYWtlZmlsZS5hbSAoZWxmMzItYXJtLW9sZGFiaS5sbyk6ICBOZXcuCi0gICAgICAgIChlbGYzMi1hcm0tbmV3YWJpLmxvKTogIE5ldy4KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogIFJlZ2VuZXJhdGUuCi0gICAgICAgICogY29uZmlnLmJmZCAodGh1bWItKi1lbGYpOiAgUmVtb3ZlIGRlZmluaXRpb24gb2YgdGFyZ191bmRlcnNjb3JlLgotICAgICAgICAoYXJtLSotZWxmKTogIExpa2V3aXNlLgotICAgICAgICAoYXJtLSotb2FiaSk6ICBOZXcuCi0gICAgICAgICh0aHVtYi0qLW9hYmkpOiAgTmV3LgotICAgICAgICAqIGNvbmZpZ3VyZTogIFJlZ2VuZXJhdGUuCi0gICAgICAgICogY29uZmlndXJlLmluIChiZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjKTogIE5ldy4KLSAgICAgICAgKGJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMpOiAgTmV3LgotICAgICAgICAqIGVsZjMyLWFybS1uZXdhYmkuYzogIE5ldy4KLSAgICAgICAgKiBlbGYzMi1hcm0tb2xkYWJpLmM6ICBOZXcuCi0gICAgICAgICogZWxmMzItYXJtLmM6ICBSZW1vdmVkLgotICAgICAgICAqIGVsZjMyLWFybS5oOiAgTmV3LgotCi1Nb24gRmViICAxIDExOjUyOjEyIDE5OTkgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBPbWl0IHdhcm5pbmdzIGZvcgotCXVubG9hZGFibGUgc2VjdGlvbnMuCi0KLTE5OTktMDEtMzEgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjeyxsZX0tKi12eHdvcmtzKik6IEFkZCBhbGlhc2VzIHRvCi0JcG93ZXJwY3ssbGV9LSotZWFiaS4KLQotMTk5OS0wMS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmMgKHJlYWRfdW5zaWduZWRfbGViMTI4KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0JKiBkd2FyZjIuYyAocmVhZF9zaWduZWRfbGViMTI4KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0KLUZyaSBKYW4gMjkgMDA6NDc6MjEgMTk5OSAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IE9ubHkgYWRqdXN0Ci0JcF9hbGlnbiB3aGVuIG5lZWRlZC4KLQotVGh1IEphbiAyOCAyMDowNToyMiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEb24ndCByZXR1cm4gZWFybHkgZm9yIGEKLSAJbm9uLWxvYWRhYmxlIHNlY3Rpb24sIGluIGNhc2UgdGhlIGZpcnN0IHNlY3Rpb24gaXMgbm9uLWxvYWRhYmxlLgotICAJRG9uJ3Qgc2V0IHRoZSBsb3cgbG1hIGZvciBhIFNFQ19ORVZFUl9MT0FEIHNlY3Rpb24uICBGcm9tIE1hY2llagotCVcuIFJvenlja2kgPG1hY3JvQGRzMi5wZy5nZGEucGw+LgotCi0xOTk5LTAxLTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfcmVsb2NfbWFwKTogQWRkIFJfRlIzMF9HTlVfVlRJTkhFUklUIGFuZAotCVJfRlIzMF9HTlVfVlRFTlRSWSByZWxvY3MuCi0KLVRodSBKYW4gMjggMTE6MDg6MTYgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X3N5bSk6ICBaZXJvIHN5bXMgd2hpY2ggYXJlCi0gICAgICAgcGFydCBvZiBzZWN0aW9ucyB3aGljaCBoYXZlIGJlZW4gZXhjbHVkZWQuCi0KLVdlZCBKYW4gMjcgMTM6MzU6MzUgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKF9iZmRfY29mZl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MpOiBDaGFuZ2VkIEZfUElDCi0JdG8gRl9QSUNfSU5ULgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBSZW1vdmVkIEZfQVJNXzJhIGFuZAotCUZfQVJNXzNNIGxhYmVscy4gIENoYW5nZWQgRl9QSUMgdG8gRl9QSUNfSU5ULgotCQotMTk5OS0wMS0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9ob3d0b190YWJsZSk6IEZpeCBuYW1lIG9mIFJfRlIzMF80OAotCXJlbG9jYXRpb24uIAotCShmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBVc2UgY29tcHV0ZWQgdmFsdWUgYXMgcmVzdWx0IG9mCi0JcmVsb2NhdGlvbi4gCi0KLTE5OTktMDEtMjYgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBFbWl0IHdhcm5pbmcgZm9yCi0JaHVnZSBmaWxlIG9mZnNldHMgZHVlIHRvIHdpZGVseS1kaXNwZXJzZWQgc2VjdGlvbiBMTUFzLgotCi1Nb24gSmFuIDE4IDAzOjM1OjM1IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBJZiBub3QgRF9QQUdFRCwKLQlhbGlnbiBmaXJzdCBzZWN0aW9uIHRvIGxhcmdlc3Qgc2VjdGlvbiBhbGlnbm1lbnQsIG5vdCBmaXJzdAotCXNlY3Rpb24gYWxpZ25tZW50LgotCi0xOTk5LTAxLTA0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVxdWlyZSBhdXRvY29uZiAyLjEyLjEgb3IgaGlnaGVyLgotCi1UdWUgRGVjIDIyIDE1OjIxOjQxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJjaHVyZXMuYyAoYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCk6ICBEZWZpbmUuCi0gICAgICAgICogYmZkLWluMi5oOiAgTGlrZXdpc2UuCi0gICAgICAgICogY3B1LWkzODYuYyAoYmZkX2kzODZfYXJjaF9pbnRlbF9zeW50YXgpOiAgTmV3LgotCi0xOTk4LTEyLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyxiZmQtaW4yLmggKGJmZF9tYWNoX21pcHM0MTExKTogTmV3LgotCSogY3B1LW1pcHMuYzogQWRkIHN1cHBvcnQgZm9yIGFuZCBpbmRlcGVuZGVudCA0MTExLgotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19tYWNoKTogRV9NSVBTX01BQ0hfNDExMSAtPiBiZmRfbWFjaF9taXBzNDExMS4KLQkoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogCi0JYmZkX21hY2hfbWlwczQxMTEgLT4gRV9NSVBTX0FSQ0hfMyB8IEVfTUlQU19NQUNIXzQxMTEuCi0KLTE5OTgtMTItMTUgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2FiaV9uYW1lKTogTmV3LgotCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDb21wYXJlIEVGX01JUFNfQUJJIGZsYWdzLgotCi0xOTk4LTEyLTEyICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiAKLQlIYW5kbGUgYmZkX21hY2hfbWlwczQzMDAuCi0KLTE5OTgtMTItMTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmM6IFJlbW92ZSBsZWFrZWQgZGV2ZWxvcG1lbnQgY29kZSBmcm9tIHBhdGNoCi0JMTk5OC0xMi0xMCBieSBSaWNoYXJkIEhlbmRlcnNvbi4KLQotMTk5OC0xMi0xMCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZmFpbCByZWxvY2F0aW9ucwotCWluIGRlYnVnIHNlY3Rpb25zIGZvciBzeW1ib2wgZGVmaW5lZCBleHRlcm5hbGx5LgotCi1UaHUgRGVjIDEwIDEwOjU4OjM4IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IFJlbW92ZSBkdXBsaWNhdGUgZW50cnkgZm9yCi0JdGVraGV4X3ZlYy4KLQotMTk5OC0xMi0wOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9ob3d0b190YWJsZSk6IFNldCBzcmNfbWFzayBmaWVsZHMgdG8gMAotCXNpbmNlIHdlIGFyZSB1c2luZyBSRUxBcy4KLQotVHVlIERlYyAgOCAyMjoxNTo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlTQ08gT3BlbiBTZXJ2ZXIgUmVsZWFzZSA1IGNvcmUgZmlsZSBzdXBwb3J0LCBmcm9tIEpvdWtlIE51bWFuCi0JPGpudW1hbkBoaXNjb20ubmw+OgotCSogc2NvNS1jb3JlLmM6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChpWzM0NTZdODYtKi1zY28zLjJ2NSopOiBVc2Ugc2NvNS1jb3JlLmxvLgotCShzY281LWNvcmUubG8pOiBEZWZpbmUgU0NPNV9DT1JFIGluIENPUkVGTEFHLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShPUFRJT05BTF9CQUNLRU5EUyk6IEFkZCBzY281LWNvcmUubG8uCi0JKE9QVElPTkFMX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBzY281LWNvcmUuYy4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZCBzY281X2NvcmVfZGF0YSBmaWVsZCB0byB0ZGF0YS4KLQkqIHRhcmdldHMuYyAoc2NvNV9jb3JlX3ZlYyk6IEFkZCB0byB0YXJnZXQgbGlzdCBpZiBTQ081X0NPUkUuCi0JKiBiZmQtaW4yLmgsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBEZWMgIDggMTk6Mzg6NDIgMTk5OCAgTWFyayBLbGVpbiAgPG1rbGVpbkBkaXMuY29tPgotCi0JKiBjb25maWcuYmZkIChocHBhKi0qLW1wZWl4Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19IRUFERVJfRElSRU5ULgotCShocHBhKi0qLW1wZWl4Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaG9zdCAoaHBwYSotKi1tcGVpeCopOiBOZXcgaG9zdC4KLQkqIGhwdXgtY29yZS5jOiBDaGVjayBIT1NUX0hQUEFNUEVJWC4gIFVzZSBIQVZFX0RJUkVOVF9IIGFuZAotCWZyaWVuZHMgcmF0aGVyIHRoYW4ganVzdCBpbmNsdWRpbmcgPHN5cy9kaXIuaD4uCi0JKiBzb20uaCAoc3RydWN0IHNvbV9zeW1ib2wpOiBBZGQgaHBwYV9wcml2X2xldmVsIGFuZCBhcHRvCi0JdGNfZGF0YS4gIENoYW5nZSBhbGwgdXNlcnMuCi0JKHN0cnVjdCBzb21kYXRhKTogQWRkIGNvbXBfdW5pdCBmaWVsZC4KLQkob2JqX3NvbV9jb21waWxhdGlvbl91bml0KTogRGVmaW5lLgotCShiZmRfc29tX2F0dGFjaF9jb21waWxhdGlvbl91bml4KTogRGVjbGFyZS4KLQkqIHNvbS5jOiBDaGVjayBIT1NUX0hQUEFNUEVJWC4KLQkoc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvKTogQWRkIG5ldyBmaWVsZCBwcml2X2xldmVsLgotCShzb21fb2JqZWN0X3NldHVwKTogQWRkIGN1cnJlbnRfb2Zmc2V0IHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShzZXR1cF9zZWN0aW9ucyk6IExpa2V3aXNlLgotCShzb21fb2JqZWN0X3ApOiBGb3IgRVhFQ0xJQk1BR0lDLCByZWFkIHRoZSBsc3QgaGVhZGVyLgotCShzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MpOiBBZGQgY29tcGlsYXRpb25fdW5pdCBwYXJhbWV0ZXIuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShzb21fZmluaXNoX3dyaXRpbmcpOiBXcml0ZSBvdXQgY29tcGlsYXRpb25fdW5pdC4KLQkoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IFNldCBwcml2X2xldmVsLgotCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IFNldCB4bGVhc3QgZmllbGQgdG8gMy4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCBzeW1ib2wgcHJpdl9sZXZlbC4KLQkoYmZkX3NvbV9hdHRhY2hfY29tcGlsYXRpb25fdW5pdCk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBTZXQgeGxlYXN0IGZpZWxkIHRvIDMuICBTZXQKLQlwcml2X2xldmVsIGludG8gc3ltYm9sX3ZhbHVlLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLVR1ZSBEZWMgIDggMTY6MjE6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBocHV4LWNvcmUuYyAoaHB1eF9jb3JlX2NvcmVfZmlsZV9wKTogQ2hhbmdlIGNhbGwgdG8gbm9uZXhpc3RlbnQKLQl3YXJuaW5nIGZ1bmN0aW9uIHRvIGNhbGwgX2JmZF9lcnJvcl9oYW5kbGVyIGluc3RlYWQuCi0KLQkqIGxpYmJmZC5jIChDT0VSQ0UzMik6IENhc3QgdGhyb3VnaCB1bnNpZ25lZCBsb25nIGFuZCBsb25nIHRvCi0JYXZvaWQgYnVnIGluIG9sZCB2ZXJzaW9uIG9mIGdjYy4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBSZW1vdmUuCi0JKGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogRG9uJ3QgZGVmaW5lLgotCi0xOTk4LTEyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSk6IEZpeCBQQyByZWxhdGl2ZQotCXJlbG9jYXRpb25zIHRvIGluY2x1ZGUgb2Zmc2V0IG9mIDIgaW5jbHVkZWQgaW4gdGhlIGluc25zLCBhbmQgdGhlCi0Jb2Zmc2V0IG9mIHRoZSByZWxvY3Mgd2l0aGluIHRoZSBzZWN0aW9uLgotCi1XZWQgRGVjICAyIDE1OjAzOjU5IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBieSBEYXZpZCBUYXlsb3IKLSAJPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPiwgRWRpdGggRXBzdGVpbgotIAk8ZWVwc3RlaW5Ac29waGlhLmN5Z251cy5jb20+LCBKaW0gQmxhbmR5Ci0gCTxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4sIGFuZCBFbGVuYSBaYW5ub25pCi0gCTxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4gYXMgcGFydCBvZiB0aGUgcHJvamVjdCB0byBtZXJnZSBpbgotIAljaGFuZ2VzIG9yaWdpbmFsbHkgbWFkZSBieSBIUDsgSFAgZGlkIG5vdCBjcmVhdGUgQ2hhbmdlTG9nCi0gCWVudHJpZXMuCi0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbHQgdXNpbmcgbGF0ZXN0Ci0gCWF1dG9tYWtlIG1hY3JvIGxpYnJhcnkuCi0KLQkqIGhwdXgtY29yZS5jIChocHV4X2NvcmVfY29yZV9maWxlX3ApOiB0aGlzIGZ1bmN0aW9uIG5vdwotIAl1bmRlcnN0YW5kcyBIUFVYIDEwLjMwIHRocmVhZCBpbmZvLiBZZXMsIHRoZSB0aHJlYWQgc3RhY2tzIGNhbiBiZQotIAlmb3VuZCBpbiB0aGUgY29yZWZpbGUhIEFsc28sIGluIGhwdXhfY29yZV9jb3JlX2ZpbGVfcCwgaWYgd2UKLSAJZW5jb3VudGVyIGEgc2VjdGlvbiB3aXRoIGFuIHVua25vd24gdHlwZSwgZG9uJ3QgcHVudC4gIEluc3RlYWQsCi0gCWp1c3Qgc2tpcCBpdC4gIEFsc28sIGNvdW50IHRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgb2Yga25vd24gdHlwZQotIAl0aGF0IHdlIGVuY291bnRlci4gIElmIHdlIGVuY291bnRlciBhdCBsZWFzdCBvbmUgZ29vZCBvbmUsIHRoZW4KLSAJd2UnbGwgZGVjbGFyZSB0aGF0IHRoZSBmaWxlIGlzIGEgY29yZSBmaWxlLiAgSWYgd2UgZW5jb3VudGVyIGFueQotIAl1bmtub3duIG9uZXMgYnV0IHNvbWUga25vd24gb25lcywgdGhlbiB3ZSdsbCBpc3N1ZSBhIHdhcm5pbmcgKGJ1dAotIAlzdGlsbCBkZWNsYXJlIGl0IHRvIGJlIGEgY29yZSBmaWxlKS4gQWxzbywgY29ycmVjdGx5IGRlY2lkZSB3aGVuIGEKLSAJZmlsZSBpcyBub3QgYSBjb3JlLgotCShQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCk6IGRlZmluZSBpZiBDT1JFX0FOT05fU0hNRU0gZGVmaW5lZC4KLQkoQ09SRV9BTk9OX1NITUVNKTogZGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShocHV4X2NvcmVfc3RydWN0KTogYWRkIG1lbWJlcnMgbHdwaWQgYW5kIHVzZXJfdGlkLgotCShjb3JlX2tlcm5lbF90aHJlYWRfaWQsIGNvcmVfdXNlcl90aHJlYWRfaWQpOiBuZXcgbWFjcm9zLgotCShtYWtlX2JmZF9hc2VjdGlvbik6IHVzZSBiZmRfYWxsb2MgdG8gYWxsb2NhdGUgcm9vbSBmb3IgYSBjb3B5IG9mCi0gCXRoZSBuYW1lIGJlZm9yZSBzdG9yaW5nIGl0IGluIHRoZSBiZmQuCi0JKGhwdXhfY29yZV9jb3JlX2ZpbGVfcCk6IGhhbmRsZSB0aHJlYWRzLgotCi0JKiBsaWJocHBhLmggKEdFVF9GSUVMRCk6IHByb3RlY3QgYWdhaW5zdCByZWRlZmluaXRpb24uCi0JKEhQUEFfV0lERSk6IGRlZmluZS4KLQkoR0VUX0ZJRUxEKTogZGVmaW5lLgotCShHRVRfQklUKTogZGVmaW5lLgotCShNQVNLKTogZGVmaW5lLgotCShDQVRFTkFURSk6IGRlZmluZS4KLQkoRUxFVkVOKTogZGVmaW5lLgotCShzaWduX2V4dGVuZCk6IHJlZGVmaW5lLgotCShhc3NlbWJsZV82KTogZGVmaW5lLgotCShhc3NlbWJsZV8xMik6IHJld3JpdGUuCi0JKGFzc2VtYmxlXzE2KTogZGVmaW5lLgotCShhc3NlbWJsZV8xNmEpOiBkZWZpbmUuCi0JKGFzc2VtYmxlXzE3KTogcmV3cml0ZS4KLQkoYXNzZW1ibGVfMjIpOiBkZWZpbmUuCi0KLTE5OTgtMTItMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9maW5hbF9saW5rX3JlbG9jYXRlKTogVXNpbmcgc2lnbmVkCi0JcmVsb2NhdGlvbnMgZm9yIHNpZ25lZCB2YWx1ZXMuCi0KLVN1biBEZWMgIDYgMTY6MzA6MzMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzYnNkLmMgKE1ZKHNldF9hcmNoX21hY2gpKTogTWFrZSBzdGF0aWMuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IEZvciBiZmRfYXJjaF9taXBzLCB1c2UKLQliZmRfbWFjaF9taXBzKiBtYWNyb3MgcmF0aGVyIHRoYW4gc2ltcGxlIG51bWJlcnMuCi0KLQlDT0ZGIHdlYWsgc3ltYm9sIHN1cHBvcnQsIGJhc2VkIG9uIHBhdGNoZXMgZnJvbSBNYXJrIEVsYnJlY2h0Ci0JPHNub3diYWxsM0B1c2EubmV0PjoKLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSGFuZGxlIENfV0VBS0VYVC4KLQkqIGNvZmZnZW4uYyAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogSGFuZGxlIHdlYWsgc3ltYm9scy4KLQkoY29mZl93cml0ZV9hbGllbl9zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0pOiBMaWtld2lzZS4KLQotCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IEFsd2F5cyBpbml0aWFsaXplIHRoZQotCWluY2x1ZGVzX3BoZHJzIGZpZWxkLgotCi0JKiBlbGZsaW5rLmggKGVsZl9maXhfc3ltYm9sX2ZsYWdzKTogQ2hlY2sgZm9yIGNhc2Ugd2hlcmUgYSBub24tRUxGCi0JZmlsZSBkZWZpbmVzIGEgc3ltYm9sIGZpcnN0IG1lbnRpb25lZCBpbiBhbiBFTEYgZmlsZS4KLQotCSogYmZkLWluLmg6IEFsd2F5cyBkZWZpbmUgQkZEX0hPU1RfNjRfQklUIGFuZCBCRkRfSE9TVF9VXzY0X0JJVCBpZgotCXBvc3NpYmxlLCByYXRoZXIgdGhhbiBvbmx5IGlmIEJGRDY0LgotCSogZWxmbGluay5oIChjb21wdXRlX2J1Y2tldF9jb3VudCk6IEp1c3QgY2hlY2sgQkZEX0hPU1RfVV82NF9CSVQsCi0Jbm90IF9fR05VQ19fLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiBzcmVjLmMgKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDb3JyZWN0IHRlc3QgdG8gYXZvaWQKLQlzd2l0Y2hpbmcgdG8gNCBieXRlIGFkZHJlc3NlcyBhZnRlciBzZWVpbmcgYSBzZWNvbmQgc2VjdGlvbiB3aGljaAotCXJlcXVpcmVzIDMgYnl0ZSBhZGRyZXNzZXMuICBGcm9tIEpvZWwgU2NoYW50egotCTxqb2VsLnNjaGFudHpAYXJnb3N5cy5ib2VpbmcuY29tPi4KLQotCSogY29uZmlnLmJmZCAobTY4Ki0qLWdudSopOiBOZXcgdGFyZ2V0LiAgRnJvbSBBeW1lcmljIFZpbmNlbnQKLQk8YXltZXJpYy52aW5jZW50QGVtaS51LWJvcmRlYXV4LmZyPi4KLQotMTk5OC0xMi0wNCAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRml4IGxvZ2ljIHRvCi0JZGVjaWRlIHdoZXRoZXIgdGhlIG91dHB1dCBmaWxlIGlzIC1tcmVsb2NhdGFibGUtbGliLAotCS1tcmVsb2NhdGFibGUsIG9yIG5laXRoZXIuICAoZ2RiLmJhc2Uvbm9kZWJ1Zy5leHApCi0KLTE5OTgtMTItMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYzogQWRkIHN1cHBvcnQgZm9yIFJfRlIzMF80OCByZWxvYy4KLQkqIHJlbG9jLmM6IEFkZCBCRkRfUkVMT0NfRlIzMF80OCByZWxvY2F0aW9uLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUKLQotV2VkIERlYyAgMiAwMDo1ODozNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFdhcm4gb24gYW4gYXR0ZW1wdCB0bwotCWxpbmsgYWdhaW5zdCBhIGR5bmFtaWMgc3ltYm9sIHdpdGggbm8gdHlwZSBvciBzaXplLgotCi0xOTk4LTEyLTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChpMzg2X2NoZWNrX3JlbG9jcykgW1JfMzg2XzMyXTogRG9uJ3QgZW1pdAotCXJlbG9jYXRpb24gZm9yIHNlY3Rpb24gd2hpY2ggZG9lcyBub3QgZ2V0IGxvYWRlZC4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbikgW1JfMzg2XzMyXTogTGlrZXdpc2UuCi0KLVR1ZSBEZWMgIDEgMTE6MzM6MzMgMTk5OCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogTWFrZSByZWxvY19zaXplLAotCXJlbG9jX2NvdW50IGFuZCBpIGxvbmcgaW5zdGVhZCBvZiB1bnNpZ25lZCBsb25nLiAgSGFuZGxlIGVycm9yCi0JcmV0dXJuIGZyb20gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQotMTk5OC0xMi0wMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGV0ZWN0IHRoZSBhYnNlbmNlIG9mCi0JYSBoYXNoIHRhYmxlLgotCi1Nb24gTm92IDMwIDE1OjI4OjA5IDE5OTggIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogZWxmMzItc2guYyAoZWxmL3NoLmgpOiBJbmNsdWRlLgotCXNoX3JlbG9jX3R5cGU6IERlbGV0ZS4gIENoYW5nZWQgYWxsIHJlZmVyZW5jZXMgdG8gZWxmX3NoX3JlbG9jX3R5cGUuCi0JKHNoX2VsZl9ob3d0b190YWIpOiBBZGQgSE9XVE8gZm9yIFJfU0hfU1dJVENIOC4KLQkoc2hfcmVsb2NfbWFwKTogTWFwIEJGRF9SRUxPQ184X1BDUkVMIHRvIFJfU0hfU1dJVENIOC4KLQkoc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IEhhbmRsZSBSX1NIX1NXSVRDSDguCi0JKiBNYWtlZmlsZS5pbjogQWRkIGRlcGVuZGVuY3kgb2YgZWxmMzItc2gubG8gb24gJChJTkNESVIpL2VsZi9zaC5oLgotCi1GcmkgTm92IDI3IDE3OjUxOjM4IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGVsZmxpbmsuaCAoY29tcHV0ZV9idWNrZXRfY291bnQpOiBEb24ndCBhbGxvdyBtaW5zaXplPT0wLCBpdAotCWNhdXNlcyBkaXZpc2lvbiBieSB6ZXJvIGxhdGVyIG9uLgotCi1UaHUgTm92IDI2IDExOjE5OjM1IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9wYzlfcmVsb2MsZnIzMF9lbGZfcGMxMl9yZWxvYyk6IE5vdAotCW5lZWRlZC4KLQotMTk5OC0xMS0yNSAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChpM2NvZmZfb2JqZWN0X3ApOiBSZW1vdmUgaGFjay4gIFVzZSBuZXcgZW11bGF0aW9uCi0JaG9vayBub3cuCi0KLVR1ZSBOb3YgMjQgMTA6MjU6MjcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2FsbAotCWZyMzBfZmluYWxfbGlua19yZWxvY2F0ZS4KLQkoZnIzMF9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uOiBIYW5kbGUgSTIwIGFuZCBJMzIKLQlyZWxvY3MuCi0JKGZyMzBfZWxmX2kzMl9yZWxvYyk6IE5ldyBmdW5jdGlvbjogSGFuZGxlIEkzMiByZWxvY3MuCi0JKGZyMzBfZWxmX3BjOV9yZWxvYyk6IE5ldyBmdW5jdGlvbjogSGFuZGxlIDlfUENSRUwgcmVsb2NzLgotCShmcjMwX2VsZl9wYzEyX3JlbG9jKTogTmV3IGZ1bmN0aW9uOiBIYW5kbGUgMTJfUENSRUwgcmVsb2NzLgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZXNldCBoaTE2cyByZWxvYwotCWNoYWluIHRvIGVtcHR5LgotCi0JVGhlIGZvbGxvd2luZyBjaGFuZ2VzIGFyZSBiYXNlZCBvbiBhIHBhdGNoIHN1Ym1pdHRlZCBieSBHaWFubHVjYQotCU1vcm8gPGdsY3RyQGFiYy5pdD46Ci0KLQkodjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogT25seSB1cGRhdGUgYSBoaTE2cyByZWxvYyBpZiBpdCBoYXMKLQlub3QgYWxyZWFkeSBiZWVuIHVwZGF0ZWQuCi0JKGZpbmRfcmVtZW1iZXJlZF9oaTE2c19yZWxvYyk6IE5ldyBwYXJhbWV0ZXIgJ2FscmVhZHlfZm91bmQnCi0JcmV0dXJucyBzdGF0ZSBvZiByZW1lbWJlcmVkIGhpMTZzIHJlbG9jLgotCShyZW1lbWJlcl9oaTE2c19yZWxvYyk6IFNldCAnZm91bmQnIGZpZWxkIHRvIGZhbHNlLgotCShoaTE2c19sb2NhdGlvbik6IEFkZCAnZm91bmQnIGZpZWxkLgotCi0xOTk4LTExLTIzICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGJmZF9wZV9kbGxfbm90X3JlY29nbml6ZWRfaGFjayk6IHRoZSBsaW5rZXIgd2FudHMKLQl0byBzZWUgLkRMTCBmaWxlcyBhcyB1bnJlY29nbml6ZWQuCi0JKGkzY29mZl9vYmplY3RfcCk6IFNvcnJ5LCBoYWQgdG8gaGFjayBpdCB0byBub3QgcmVjb2duaXplIHRoZXNlCi0JZmlsZXMgKHBlaS1pMzg2KSBvbiByZXF1ZXN0LgotCi0xOTk4LTExLTIzICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogb3BuY2xzLmMgKGJmZF9tYWtlX3JlYWRhYmxlKTogbmVlZCBtb3JlIGNsZWFudXAgZm9yIHN5bWJvbHMgYW5kCi0JcmVsZW50cy4gIENhbGwgYmZkX2NoZWNrX2Zvcm1hdCB0byByZWluaXRpYWxpemUuCi0KLUZyaSBOb3YgMjAgMTQ6MjE6MzYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHNwdXJpb3VzCi0Jd2FybmluZ3MuCi0KLVRodSBOb3YgMTkgMTQ6NDI6MTUgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNDogcmVnZW5lcmF0ZQotCSogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLVR1ZSBOb3YgMTcgMjA6MjM6MzUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCB2dGFibGVfZW50cmllc19zaXplLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogQ2xlYXIgaXQuCi0JKiBlbGZsaW5rLmggKGVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZCk6IENvcHkgaXQsIGFuZAotCXJlc3BlY3QgaXQgYXMgYW4gdXBwZXIgYm91bmQgb24gd2hhdCBtZW1vcnkgdG8gcmVmZXJlbmNlLgotCShlbGZfZ2Nfc21hc2hfdW51c2VkX3Z0ZW50cnlfcmVsb2NzKTogTGlrZXdpc2UuCi0JKGVsZl9nY19yZWNvcmRfdnRlbnRyeSk6IEhhbmRsZSBhcy15ZXQgdW5kZWZpbmVkIHZ0YWJsZXMuICBTZXQgYW5kCi0JdXBkYXRlIHZ0YWJsZV9lbnRyaWVzX3NpemUgYXBwcm9wcmlhdGVseS4KLQotVHVlIE5vdiAxNyAxNToyODozMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfcmVsb2NfdHlwZV9sb29rdXApOiBVc2VkIGludGVnZXJzIHRvIGhvbGQKLQlyZWxvYyBudW1iZXIuCi0KLU1vbiBOb3YgMTYgMjI6MTk6MjEgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0pOiBzdXBwb3J0IEJGRF9JTl9NRU1PUlkKLSAJYmZkczsgdGhleSBoYXZlIG5vICJmaWxlIiBzbyB3ZSBmYWtlIGl0LgotCSogYmZkLWluMi5oOiBhZGQgYmZkX21ha2Vfd3JpdGFibGUgYW5kIGJmZF9tYWtlX3JlYWRhYmxlIChyZWdlbikKLQkqIGxpYmJmZC5jIChiZmRfd3JpdGUpOiBBbGxvdyB3cml0aW5nIHRvIEJGRF9JTl9NRU1PUlkgYmZkcyBieQotIAlyZXNpemluZyB0aGUgbWVtb3J5IGJ1ZmZlci4KLQkqIG9wbmNscy5jIChiZmRfbWFrZV93cml0YWJsZSk6IE5ldyBmdW5jdGlvbjsgbGV0cyB5b3Ugd3JpdGUgYQotIAliZmRfY3JlYXRlJ2QgYmZkIHRvIGFuIGluLW1lbW9yeSBidWZmZXIuCi0JKGJmZF9tYWtlX3JlYWRhYmxlKTogTmV3IGZ1bmN0aW9uOyBsZXRzIHlvdSByZWFkIGJhY2sgdGhhdCBidWZmZXIKLSAJYXMgaWYgaXQgd2VyZSBmcm9tIGJmZF9vcGVuci4gIFVzZWQgdG8gYnVpbGQgZ2VuZXJhdGVkIGFyY2hpdmUKLSAJbWVtYmVycyAod2luc3VwJ3MgbGQncyBkbGx0b29sKQotCi1Nb24gTm92IDE2IDE5OjE1OjE5IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vYmZkLnBvdDogUmVnZW5lcmF0ZWQuCi0KLU1vbiBOb3YgMTYgMTA6NTc6MDYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jIChoaTE2c19sb2NhdGlvbik6IFJlcGxhY2VkIGZpeGVkIHNpemUgYXJyYXkgd2l0aAotCWxpbmtlZCBsaXN0LgotCi1TdW4gTm92IDE1IDIwOjI4OjI1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24pOiBTZWFyY2ggZm9yIHRoZSBwcm9wZXIKLQllbGVtZW50IG9mIHRoZSBnb3RlbnRyeSBsaXN0IGZvciBsb2NhbCBzeW1ib2xzIHRvby4KLQkoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IFVuaWZ5IGxvY2FsIGFuZCBnbG9iYWwgaGFuZGxpbmcuCi0JQXNzZXJ0IHRoYXQgZ290ZW50LT51c2VfY291bnQgPiAwLgotCi1TYXQgTm92IDE0IDE1OjE2OjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh2bXNfYWxwaGFfdmVjKTogUmVuYW1lIGZyb20gZXZheF9hbHBoYV92ZWMsIGFuZAotCXVwZGF0ZSBmb3IgZmlsZSBuYW1lIGNoYW5nZXMgb2YgSnVseSAyLCAxOTk4LgotCSh2bXNfdmF4X3ZlYyk6IE5ldy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IE5vdiAxMiAxOToxOTo1NCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL2JmZC5wb3Q6IFJlZ2VuZXJhdGVkLgotCi1UdWUgTm92IDEwIDE2OjE3OjA2IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNCwgY29uZmlnLmJmZDogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMiouCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotVHVlIE5vdiAxMCAxNToxMzo1OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkIHN1cHBvcnQgZm9yIGJmZF9hcmNoX2ZyMzAuCi0KLVR1ZSBOb3YgMTAgMTM6Mzc6MzYgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQgKEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRSwKLSAJQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFX01FTUJFUik6IGRpZG4ndCBkZWZpbmUgbWFjcm8gd2hlbiB2YWx1ZQotIAl3YXMgY2FjaGVkLgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiByZWdlbmVyYXRlZC4KLQotVHVlIE5vdiAxMCAxNDozMTowMSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVsZjMyLWQxMHYuYyAocmVsb2NfdHlwZSk6ICBBZGQgUl9EMTBWX0dOVV9WVElOSEVSSVQgYW5kCi0gICAgICAgIFJfRDEwVl9HTlVfVlRFTlRSWSByZWxvY3MuCi0gICAgICAgIChlbGZfZDEwdl9ob3d0b190YWJsZSk6ICBMaWtld2lzZS4KLSAgICAgICAgKGQxMHZfcmVsb2NfbWFwIGQxMHZfcmVsb2NfbWFwKTogIExpa2V3aXNlLgotICAgICAgICAoZWxmMzJfZDEwdl9nY19tYXJrX2hvb2spOiAgTmV3LgotICAgICAgICAoZWxmMzJfZDEwdl9nY19zd2VlcF9ob29rKTogIE5ldy4KLSAgICAgICAgKGVsZjMyX2QxMHZfY2hlY2tfcmVsb2NzKTogIE5ldy4KLSAgICAgICAgKGVsZjMyX2QxMHZfcmVsb2NhdGVfc2VjdGlvbik6ICBOZXcuCi0gICAgICAgIChlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogIERlZmluZS4KLSAgICAgICAgKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6ICBEZWZpbmUuCi0KLVNhdCBOb3YgIDcgMTg6MDc6NTEgMTk5OCAgUGV0ZXIgU2NoYXVlciAgPHBldGVyLnNjaGF1ZXJAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4KLQotCSogTWFrZWZpbGUuYW0gKEJGRDMyX0JBQ0tFTkRTKTogTW92ZSB2bXMgZmlsZXMgaGVyZS4uLgotCShCRkQ2NF9CQUNLRU5EUyk6IC4uLmZyb20gaGVyZS4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogTW92ZSB2bXMgZmlsZXMgaGVyZS4uLgotCShCRkQ2NF9CQUNLRU5EU19DRklMRVMpOiAuLi5mcm9tIGhlcmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIE5vdiAgNCAxNTo1ODo0OCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogQWRkIEZSMzAgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IEFkZCBGUjMwIHRhcmdldC4KLQkqIGFyY2h1cmVzLmM6IEFkZCBzdXBwb3J0IGZvciBGUjMwLgotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIEZSMzAuCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBGUjMwLgotCSogcmVsb2MuYzogQWRkIHN1cHBvcnQgZm9yIEZSMzAgcmVsb2NhdGlvbnMuCi0JKiB0YXJnZXRzLmM6IEFkZCBzdXBwb3J0IGZvciBGUjMwIHJlbG9jYXRpb25zLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogbGliYmZkLmg6ICBSZWdlbmVyYXRlLgotCSogY3B1LWZyMzAuYzogTmV3IGZpbGUuCi0JKiBlbGYzMi1mcjMwLmM6IE5ldyBmaWxlLgotCi1Nb24gTm92ICAyIDE0OjU5OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMioKLQkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1TdW4gTm92ICAxIDE5OjMyOjI4IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLW0xMDMwMC5jIChtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogRG8gbm90IHVzZSBhbGxvY2EsCi0JdXNlIGJmZF9tYWxsb2MgYW5kIGZyZWUgaW5zdGVhZCBhbmQgY2hlY2sgcmV0dXJuIHZhbHVlIGZyb20gYmZkX21hbGxvYy4KLQotU3VuIE5vdiAgMSAxNjoyMDozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZSk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzKTogQ29tbWVudCBvdXQuCi0JKFNJWkVPRl9NSVBTX0RZTlNZTV9TRUNOQU1FUyk6IExpa2V3aXNlLgotCShNSVBTX1RFWFRfRFlOU1lNX1NFQ04pOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogRG9uJ3Qgc2V0IHNoX2luZm8gZmllbGQgb2YgYSAuaGFzaAotCXNlY3Rpb24uCi0JKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUpOiBSZW1vdmUgZHluc3ltX3NlY19zdHJpbmRleAotCWZpZWxkLgotCShtaXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRG9uJ3QgaW5pdGlhbGl6ZQotCWR5bnN5bV9zZWNfc3RyaW5kZXguCi0JKG1pcHNfZWxmX2djX21hcmtfaG9vayk6IEFkZCBkZWZhdWx0IGNhc2UgdG8gYXZvaWQgd2FybmluZy4KLQkobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogR2VuZXJhdGUgYSBzZWN0aW9uIHN5bWJvbCBmb3IKLQlldmVyeSBvdXRwdXQgc2VjdGlvbi4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBDb3VudCBhbGwgc2VjdGlvbnMgZm9yCi0JRFRfTUlQU19VTlJFRkVYVE5PLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBkeW5hbWljIHN5bWJvbHMgZm9yIGFsbAotCW91dHB1dCBzZWN0aW9ucy4KLQotU3VuIE5vdiAgMSAxMjo0Njo1MyAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBBbGxvY2F0ZSB0d28gc2xvdHMKLQlmb3IgbGF0ZXIgUExUIGVudHJpZXMgaW4gbGFyZ2UgUExUcy4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBBbGxvdyBmb3IgdGhlIGV4dHJhIHNsb3RzLgotCi1TYXQgT2N0IDMxIDIwOjEwOjA5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2FkX3NlY3Rpb24pOiBGaXggdHlwby4KLQotMTk5OC0xMC0yNiAxNTo1OCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgbmV3IGZpZWxkIGVsZl9oYXNoX3ZhbHVlLgotCSogZWxmbGluay5oIChlbGZfY29sbGVjdF9oYXNoX2NvZGVzKTogTmV3IGZ1bmN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcwotCWNhbGxlZCBmb3IgZWFjaCBleHBvcnRlZCBzeW1ib2wgYW5kIHdlIGNvbXB1dGUgdGhlIEVMRiBoYXNoIHZhbHVlIGZvcgotCWl0LgotCShjb21wdXRlX2J1Y2tldF92YWx1ZSk6IE5ldyBmdW5jdGlvbi4gIEl0IGlzIGNhbGxlZCBmcm9tCi0Jc2l6ZV9keW5hbWljX3NlY3Rpb25zIHRvIGRldGVybWluZSB0aGUgaGFzaCB0YWJsZSBzaXplLiAgV2hlbiB3ZSBhcmUKLQlvcHRpbWl6aW5nIGEgYmV0dGVyLCBidXQgc2xvd2VyLCBhbGdvcml0aG0gaXMgdXNlZC4KLQkoc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2FsbCBjb21wdXRlX2J1Y2tldF92YWx1ZS4KLQotCSogZWxmLmMgKGJmZF9lbGZfaGFzaCk6IE9wdGltaXplIHRoZSBoYXNoIGZ1bmN0aW9uIGEgYml0LgotCi1Nb24gT2N0IDE5IDIwOjAzOjIxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZWxmMzItc2guYzogIEFkZCBIT1dUTyBlbnRyaWVzIGZvciBSX1NIX0dOVV9WVElOSEVSSVQgYW5kCi0gICAgICAgIFJfU0hfR05VX1ZURU5UUlkuCi0gICAgICAgIChzaF9lbGZfZ2NfbWFya19ob29rKTogIE5ldy4KLSAgICAgICAgKHNoX2VsZl9nY19zd2VlcF9ob29rKTogIE5ldy4KLSAgICAgICAgKHNoX2VsZl9jaGVja19yZWxvY3MpOiAgTmV3LgotICAgICAgICAoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogIERlZmluZS4KLQotTW9uIE9jdCAxOSAxNjo1NzowNSAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNDogdW5kbyBwcmV2aW91cyBnZXR0ZXh0IGNoYW5nZQotCSogYWNsb2NhbC5tNDogcmVidWlsZCB3aXRoIHJpZ2h0IHZlcnNpb24gb2YgYWNsb2NhbC4KLQotTW9uIE9jdCAxOSAwMTo0NzoyMSAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNCwgYWNsb2NhbC5tNDogbW92ZSBnZXR0ZXh0LXJlbGF0ZWQgZnJhZ21lbnRzIGZyb20KLSAJYWNsb2NhbC5tNCB0byBhY2luY2x1ZGUubTQsIHNvIHRoZXkgZG9uJ3QgZ2V0IGxvc3QuCi0KLQkqIGVsZmNvcmUuaDogcmV3cml0ZSBmb3IgYmV0dGVyIGNvcmVmaWxlIHN1cHBvcnQuCi0JKiBlbGYuYyAoZWxmY29yZV8qKTogbmV3IGZ1bmN0aW9ucy4KLQkqIGVsZi1iZmQuaCAoZWxmX29ial90ZGF0YSk6IG5ldyBzdHJ1Y3R1cmUgbWVtYmVycy4KLQkqIGFjY29uZmlnLmgsIGFjaW5jbHVkZS5tNCwgY29uZmlndXJlLmluOiBhZGQgZmVhdHVyZS10ZXN0cyBmb3IKLSAJZmxhdm9yIG9mIHByb2Nmcy4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZy5pbiwgY29uZmlndXJlLCBNYWtlZmlsZS5pbjogcmVnZW5lcmF0ZWQuCi0KLUZyaSBPY3QgMTYgMTQ6MDc6NDUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGYzMi1tMzJyLmM6ICBBZGQgSE9XVE8gZW50cmllcyBmb3IgUl9NMzJSX0dOVV9WVElOSEVSSVQKLSAgICAgICAgYW5kIFJfTTMyUl9HTlVfVlRFTlRSWS4KLSAgICAgICAgKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6ICBEZWZpbmUuCi0gICAgICAgIChtMzJyX2VsZl9jaGVja19yZWxvY3MpOiAgTmV3LgotICAgICAgICAobTMycl9lbGZfZ2NfbWFya19ob29rKTogIE5ldy4KLSAgICAgICAgKG0zMnJfZWxmX2djX3N3ZWVwX2hvb2spOiAgTmV3LgotICAgICAgICAobTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbik6ICBIYW5kbGUgVlQgcmVsb2NzLgotCi1Nb24gT2N0IDEyIDE0OjE4OjQwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGFybV9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHJlZHVuZGFudCB0ZXN0LgotCi0JKiBiZmQtaW4yLmggKHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QpOiBJbXByb3ZlIGNvbW1lbnQgdG8gbWFrZQotCWNsZWF0IHRoYXQgdGhlICdiaXRzaXplJyBmaWVsZCBpcyB0aGUgc2l6ZSBvZiB0aGUgYml0ZmllbGQgQUZURVIKLQlyZWxvY2F0aW9uIG5vdCBiZWZvcmUuCi0KLQkqIGVsZjMyLW0zMnIuYyAoUl9NMzJSXzE4X1BDUkVMKTogRml4IHNpemUgb2YgYml0ZmllbGQuCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX2hpKTogQ29wZSB3aXRoIG1pc3NpbmcgcmVmaGkgb3IgcmVmbG8KLQlyZWxvY3MuCi0KLVR1ZSBPY3QgIDYgMDk6MjA6NDQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGYzMi1zcGFyYy5jOiAgQWRkIEhPV1RPIGVudHJpZXMgZm9yIFJfU1BBUkNfR05VX1ZUSU5IRVJJVCBhbmQKLSAgICAgICAgUl9TUEFSQ19HTlVfVlRFTlRSWS4KLSAgICAgICAgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6ICBIYW5kbGUgdGhlbS4KLSAgICAgICAgKGVsZjMyX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwKTogIExpa2V3aXNlLgotICAgICAgICAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6ICBMaWtld2lzZS4KLSAgICAgICAgKGVsZjMyX3NwYXJjX2djX21hcmtfaG9vayk6ICBOZXcuCi0gICAgICAgIChlbGYzMl9zcGFyY19nY19zd2VlcF9ob29rKTogIE5ldy4KLQotTW9uIE9jdCAgNSAxNDo1NTozMCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fZmluaXNoX3dyaXRpbmcpOiBQZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcyB3aGVuCi0Jd3JpdGluZyBhbiBleGVjdXRhYmxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCi1Nb24gT2N0ICA1IDEyOjAyOjMxIDE5OTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBkd2FyZjEuYyA6IE5ldyBmaWxlLiAgQWRkcyBfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZS4KLQkqIGNvbmZpZ3VyZS5pbiAoZWxmKTogQWRkIGR3YXJmMS5sby4KLQkqIGVsZl9iZmQuaCAoZWxmX29iX3RkYXRhKTogQWRkIGR3YXJmMV9maW5kX2xpbmVfaW5mby4KLQkqIGVsZi5jIChfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IEFkZCBjYWxsIHRvCi0JX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUuCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOgotCUFkZCBjYWxsIHRvIF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1Nb24gT2N0ICA1IDEwOjA2OjIyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZWxmbGluay5oIChlbGZfZ2Nfc2VjdGlvbnMpOiAgRG8gbm90IGFsbG93IGdhcmJhZ2UKLSAgICAgICAgY29sbGVjdGlvbiBpZiBkeW5hbWljIHNlY3Rpb25zIGhhdmUgYmVlbiBjcmVhdGVkLgotCi1Nb24gT2N0ICA1IDA5OjA3OjM3IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZWxmMzItdjg1MC5jOiBBZGQgSE9XVE8gZW50cmllcyBmb3IgUl9WODUwX0dOVV9WVElOSEVSSVQgYW5kCi0gICAgICAgIFJfVjg1MF9HTlVfVlRFTlRSWS4KLSAgICAgICAgKHY4NTBfZWxmX2NoZWNrX3JlbG9jcyk6ICBIYW5kbGUgVlRJTkhFUklUIGFuZCBWVEVOVFJZIHJlbG9jcy4KLSAgICAgICAgKHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6ICBMaWtld2lzZS4KLSAgICAgICAgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgTGlrZXdpc2UuCi0gICAgICAgICh2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogIExpa2V3aXNlLgotICAgICAgICAodjg1MF9lbGZfZ2Nfc3dlZXBfaG9vayk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKHY4NTBfZWxmX2djX21hcmtfaG9vayk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6ICBEZWZpbmUuCi0KLU1vbiBPY3QgIDUgMDk6MDQ6MjUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2djX3N3ZWVwX2hvb2spOiAgRG9uJ3QgYXNzdW1lCi0gICAgICAgIHRoYXQgZHlub2JqIGV4aXN0cy4KLQotU3VuIE9jdCAgNCAyMzoyOTozNCAxOTk4ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOgotCURlY2xhcmUgc2l6ZSBhcyBiZmRfc2l6ZV90eXBlLgotCShyczYwMDBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVjbGFyZSBjb3VudCBhcyBiZmRfc2l6ZV90eXBlLgotCi1TdW4gT2N0ICA0IDIwOjM4OjI5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY3B1LWhwcGEuYyAoYmZkX2hwcGEyMF9hcmNoKTogRGVmaW5lLiAgTGluayBpdCBpbnRvIHRoZSBiZmRfaHBwYV9hcmNoCi0Jc3RydWN0dXJlLgotCSogc29tLmMgKENQVV9QQV9SSVNDMl8wKTogRGVmaW5lLgotCShfUEFfUklTQzJfMF9JRCk6IExpa2V3aXNlLgotCShzb21fZmluaXNoX3dyaXRpbmcpOiBVc2UgQ1BVX1BBX1JJU0MyXzAgZm9yIHRoZSBzeXN0ZW1faWQgYXMgbmVlZGVkLgotCi1TdW4gT2N0ICA0IDIxOjE5OjA5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBXaGVuIGEgdmVyc2lvbmVkIHN5bWJvbAotCWhhcyBhIGJhc2Ugd2hpY2ggaXMgYWxyZWFkeSBkZWZpbmVkLCBvbmx5IGFkZCB0aGUgcmVmZXJlbmNlZAotCXN5bWJvbCB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgaWYgaXQgaXMgZGVmaW5lZCBvciByZWZlcmVuY2VkCi0JYnkgYSByZWd1bGFyIGZpbGUuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfaW5mb190b19ob3d0b19yZWwpOiBIYW5kbGUgdnRhYmxlIHJlbG9jcwotCWNvcnJlY3RseS4KLQotMTk5OC0wOS0yNyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLSAgICAgICAgKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVuZG8gbGFzdCBjaGFuZ2UuCi0KLVdlZCBTZXAgMjMgMTY6MDk6MzEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgcmVjb3JkIGEgZHluYW1pYwotICAgICAgICBzeW1ib2wgZm9yIHRoZSBpbmRpcmVjdCBhbGlhcyB0byBhIHZlcnNpb25lZCBzeW1ib2wuCi0KLU1vbiBTZXAgMjEgMTI6MTU6MjIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGYzMi1pMzg2LmMgKGVsZjMyX2kzODZfdnRpbmhlcml0X2hvd3RvKTogTmV3LgotICAgICAgICAoZWxmMzJfaTM4Nl92dGVudHJ5X2hvd3RvKTogTmV3LgotICAgICAgICAoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiAgUmV0dXJuIGVsZjMyX2kzODZfdnRlbnRyeV9ob3d0bwotICAgICAgICBvciBlbGYzMl9pMzg2X3Z0aW5oZXJpdF9ob3d0byAgb24gbG9va3VwLgotCi1TdW4gU2VwIDIwIDAwOjQ4OjA3IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmM6IEluY2x1ZGUgImVsZi9tNjhrLmgiLiAgUmVtb3ZlIGRlZmluaXRpb24gb2YgZW51bQotCXJlbG9jX3R5cGUuICBSZW5hbWUgUl82OEtfX21heCB0byBSXzY4S19tYXguCi0JKGhvd3RvX3RhYmxlKTogVXNlIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4gZm9yIGEgVlRFTlRSWQotCXJlbG9jLgotCi1TdW4gU2VwIDIwIDAwOjA5OjI1IDE5OTggIENocmlzIFRvcmVrICA8dG9yZWtAYnNkaS5jb20+Ci0KLQkqIGxpYmJmZC5jIChiZmRfZ2V0YjMyKTogUmV3cml0ZSBleHByZXNzaW9uIHRvIGdldCBiZXR0ZXIgY29kZS4KLQkoYmZkX2dldGwzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfZ2V0bF9zaWduZWRfMzIpOiBMaWtld2lzZS4KLQotCSogbGliYmZkLmMgKGJmZF9sb2cyKTogQ2FzdCB0byBiZmRfdm1hIGJlZm9yZSBzaGlmdGluZywgbm90Ci0JYWZ0ZXIuCi0KLVNhdCBTZXAgMTkgMjI6NDI6MjMgMTk5OCAgRG91ZyBSYWJzb24gIDxkZnJAbmxzeXN0ZW1zLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBFbnN1cmUgdGhhdCB0aGUgd2FybmluZwotCW1lc3NhZ2UgaGFzIGEgbnVsbCBieXRlIHRlcm1pbmF0b3IuCi0KLUZyaSBTZXAgMTggMTQ6MzU6MjkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24pOiBJZ25vcmUgY29udGVudHMgb2YKLQl3b3JkIHN1YmplY3QgdG8gUl9WODUwXzMyIHJlbG9jYXRpb24uCi0KLVRodSBTZXAgMTcgMTc6MjA6MzYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmM6IEFkZCBjb21tZW50IGRlc2NyaWJpbmcgcHJvYmxlbSBjb21wdXRpbmcgbGluZSBudW1iZXJzCi0JZm9yIHVuZGVmaW5lZCBzeW1ib2xzIGF0IGxpbmsgdGltZS4KLQotVGh1IFNlcCAxNyAxNjowMzoyOCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0gICAgICAgICogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QKLSAgICAgICAgdHJhbnNmb3JtIGEgZGVmd2VhayBpbnRvIGEgcGx0IGVudHJ5LgotICAgICAgICAoZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMpOiBBbGxvdyByb29tIGZvciBzZWNvbmRhcnkKLSAgICAgICAgcGx0IGVudHJ5IHJlZmVyZW5jZXMgdG8gcmVjZWl2ZSBhIFJFTEFUSVZFIHJlbG9jLgotICAgICAgICAoZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRmlsbCB0aGVtIGluLgotICAgICAgICAoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IEFzc2VydCB3ZSBkb24ndCBvdmVycnVuCi0gICAgICAgIHRoZSBhbGxvY2F0ZWQgcmVsb2NhdGlvbiBzcGFjZS4KLQotV2VkIFNlcCAxNiAxODowMzoxMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoc3dhcF9vdXRfc3ltcyk6IEFsd2F5cyB0cmVhdCBzZWN0aW9uIHN5bWJvbHMgYXMKLQlzcGVjaWFsLCBldmVuIGlmIHRoZXkgYXJlIGF0dGFjaGVkIHRvIGEgY29tbW9uIHNlY3Rpb24uCi0KLVdlZCBTZXAgMTYgMTA6MzQ6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyk6IE1vdmUgc3ltYm9scyBpbgotCXNlY3Rpb25zIHdpdGggdjg1MCBjb21tb24gc2VjdGlvbiBhdHRyaWJ1dGVzIGludG8gbmFtZWQgdjg1MAotCWNvbW1vbiBzZWN0aW9ucy4KLQkodjg1MF9lbGZfYWRkX3N5bWJvbF9ob29rKTogTW92ZSBzeW1ib2xzIGluIHNlY3Rpb25zIHdpdGggdjg1MAotCWNvbW1vbiBzZWN0aW9uIGF0dHJpYnV0ZXMgaW50byBuYW1lZCB2ODUwIGNvbW1vbiBzZWN0aW9ucy4KLQotV2VkIFNlcCAxNiAxMToyNjo0OSBDRFQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGYzMi1hcm0uYyAoZWxmMzJfYXJtX2djX21hcmtfaG9vayk6ICBSZW1vdmUgcHJpbnQKLSAgICAgICAgc3RhdGVtZW50LgotCi0xOTk4LTA5LTE1ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmV2ZXJzZSBvdXRwdXRfb2Zmc2V0Ci0JcGFydCBvZiBWbGFkaW1pcidzIGNoYW5nZSBvZiAxOTk4LTA4LTE5LiAgTWFrZSBhIFJfUFBDX1NEQVJFTDE2Ci0JcmVsb2MgdG8gdGhlIHdyb25nIHNlY3Rpb24gYSB3YXJuaW5nLCBub3QgYW4gZXJyb3IuICAuZHluc2JzcwotCWlzIG5vdCBhbiBvdXRwdXQgc2VjdGlvbiwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBmb3IgaXQuCi0KLVR1ZSBTZXAgMTUgMTI6NDA6MDUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGVsZi1iZmQuaDogIEFkZCBhcmd1bWVudCB0byBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUuCi0KLVR1ZSBTZXAgMTUgMDg6MzQ6NDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGVsZi5jIChzd2FwX291dF9zeW1zKTogIFBhc3MgdHlwZSB0byBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUuCi0gICAgICAgKiBlbGYzMi1hcm0uYzogIEFkZCBIT1dUTyBlbnRyaWVzIGZvciBSX0FSTV9HTlVfVlRJTkhFUklUIGFuZAotICAgICAgIFJfQVJNX0dOVV9WVEVOVFJZLgotICAgICAgIChlbGYzMl9hcm1fZ2NfbWFya19ob29rKTogTmV3LgotICAgICAgIChlbGYzMl9hcm1fZ2Nfc3dlZXBfaG9vayk6IE5ldy4KLSAgICAgICAoZWxmMzJfYXJtX2NoZWNrX3JlbG9jcyk6IE5ldy4KLSAgICAgICAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgSGFuZGxlIFZUSU5IRVJJVCBhbmQgVlRFTlRSWQotICAgICAgIHJlbG9jYXRpb25zLgotICAgICAgIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBWVElOSEVSSVQgYW5kIFZURU5UUlkKLSAgICAgICByZWxvY2F0aW9ucy4KLQotMTk5OC0wOS0xMCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotICAgICAgICAqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiBkeW5vYmogaXMgTlVMTCwKLSAgICAgICAgYXNzdW1lIHRoZXJlIGlzIG5vIFBMVCBvciBHT1QuCi0KLVdlZCBTZXAgIDkgMTQ6MjQ6MTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmMgKGVsZjMyX2FybV9maW5kX25lYXJlc3RfbGluZSk6IE5ldyBmdW5jdGlvbjogIGp1c3QKLQlsaWtlIF9lbGZfYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkgZXhjZXB0IHRoYXQgU1RUX0FSTV9URlVOQyBpcwotCWFsc28gYWNjZXB0ZWQgYXMgYSBmdW5jdGlvbiBzeW1ib2wgdHlwZS4KLQotTW9uIFNlcCAgNyAxMzoyNDowMyAxOTk4ICBQZXRlciBTY2hhdWVyICA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+Ci0KLQkqIHJzNjAwMC1jb3JlLmMgKF9MT05HX0xPTkcpOiAgRGVmaW5lIGZvciBBSVggNC54IG9ubHkuCi0KLVNhdCBTZXAgIDUgMjA6NDA6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9ub2xpbmtfYmZkX2djX3NlY3Rpb25zKTogQ29ycmVjdCBkZWZpbml0aW9uIHRvCi0JbWF0Y2ggZGVmaW5pdGlvbiBvZiBfYmZkX2djX3NlY3Rpb25zIGZpZWxkLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLUZyaSBTZXAgIDQgMTM6NTQ6MjMgMTk5OCAgRGF2aWQgTWlsbGVyICA8ZGF2ZW1AZG0uY29iYWx0bWljcm8uY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogUHJvcGVybHkgYWRqdXN0Ci0JdGhlIGFkZGVuZCBvZiBhIGR5bmFtaWMgcmVsb2NhdGlvbiByZWZlcmVuY2luZyBhIHNlY3Rpb24uCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEZpeCB0aGUgUExUIHJlbG9jYXRpb24gb2Zmc2V0LgotCi1UaHUgU2VwICAzIDE3OjI4OjUwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoYmZkX2VsZk5OX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFZlcmlmeSB0aGF0IHRoZQotCWJlZCBoYXMgYSBzaXplX2R5bmFtaWNfc2VjdGlvbnMgcm91dGluZSBiZWZvcmUgdHJ5aW5nIHRvIHVzZSBpdC4KLQotTW9uIEF1ZyAzMSAxNDo0OToyMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2dudV92dGVudHJ5X2hvd3RvKTogVXNlCi0JX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbi4KLQotTW9uIEF1ZyAzMSAxMDoyMzo0MCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIE1ha2VmaWxlLmFtOiAgQWRkIGVsZjMyLWFybS5jLgotICAgICAgICAqIE1ha2VmaWxlLmluOiAgUmVidWlsZC4KLSAgICAgICAgKiBlbGYtYmZkLmg6ICBBZGQgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgotICAgICAgICAqIGVsZi5jIChzd2FwX291dF9zeW1zKTogIElmIGRlZmluZWQsIGNhbGwKLSAgICAgICAgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgotICAgICAgICAqIGVsZjMyLWFybS5jOiBEZWZpbmUgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgotICAgICAgICAoZWxmMzJfYXJtX2dldF9zeW1ib2wtdHlwZSk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSk6ICBDaGFuZ2UgdG8gdXNlIFNUVF9BUk1fVEZVTkMuCi0gICAgICAgIChiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiAgQ2hhbmdlIHRvCi0gICAgICAgIGNoZWNrIGZvciBTVFRfQVJNX1RGVU5DLgotICAgICAgICAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgTGlrZXdpc2UuCi0gICAgICAgICogZWxmeHgtdGFyZ2V0Lmg6ICBBZGQgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgotCi1GcmkgQXVnIDI4IDE5OjQ0OjA3IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2FscGhhX2V2WzQ1Nl0pOiBOZXcuCi0JKiBjcHUtYWxwaGEuYzogUmV3b3JrIHRvIG1hdGNoIHRoZXNlIHR5cGVzLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1GcmkgQXVnIDI4IDE5OjM4OjUzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbik6IERlY2xhcmUuCi0JKiBlbGYuYyAoX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbik6IE5ldy4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaG93dG9fdGFibGUpOiBBZGQgdnRhYmxlIHJlbG9jcy4KLQkoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBSZWNvZ25pemUgdGhlbS4KLQkoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogUGFzcyB0aGVtIG9mZiB0byBnZW5lcmljIGNvZGUuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBJZ25vcmUgdGhlbS4KLQkoZWxmX2kzODZfZ2NfbWFya19ob29rLCBlbGZfaTM4Nl9nY19zd2VlcF9ob29rKTogTmV3LgotCShlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiBUcnVlLgotCi1UaHUgQXVnIDIwIDE1OjAzOjQ1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5jIChlbGYzMl90aHVtYl90b19hcm1fc3R1Yik6IENoZWNrIHN5bV9zZWMgaXMgbm90IE5VTEwKLQliZWZvcmUgbG9va2luZyBhdCBvd25lciBmaWVsZC4KLQkoZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIpOiBEaXR0by4KLQkoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBDb21wdXRlIG5hbWUgYmVmb3JlIGNhbGxpbmcKLQllbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSgpLgotCi1UaHUgQXVnIDIwIDExOjMwOjE3IDE5OTggIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+Ci0KLQkqIGVsZi5jOiBjb21tZW50IGFuZCBmb3JtYXR0aW5nIGNsZWFudXBzLgotCSogZWxmY29yZS5oOiBkaXR0by4KLQotV2VkIEF1ZyAxOSAxNTo0MzoyNiAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IFJlamVjdCBmaWxlcyBvZiBoZWFkZXIgdHlwZSBFVF9DT1JFCi0JKGNvcmUgZmlsZXMgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHkgdGhhbiBvYmplY3QgZmlsZXMpLgotCSogZWxmLWJmZC5oIChfYmZkX2VsZl93cml0ZV9jb3JlZmlsZV9jb250ZW50cywKLQliZmRfZWxmX21rY29yZWZpbGUpOiBkZWNsYXJlLgotCSogZWxmeHgtdGFyZ2V0LmggKF9iZmRfZWxmX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzLAotCWJmZF9lbGZfbWtjb3JlZmlsZSk6IGFkZCB0byBiZmRfdGFyZ2V0IHZlY3Rvci4KLQkqIGVsZmNvcmUuaCAoZWxmX2NvcmVfZmlsZV9wKTogc2F2ZSB0aGUgcHJvZ3JhbSBoZWFkZXIgdGFibGUsCi0JYW5kIHNldCB0aGUgYmZkIGFyY2hpdGVjdHVyZSBmcm9tIHRoZSBlbGYgZmlsZSBoZWFkZXIuCi0JKiBlbGYuYyAoYmZkX2VsZl9ta2NvcmVmaWxlKTogbmV3IGZ1bmN0aW9uLgotCShfYmZkX2VsZl93cml0ZV9jb3JlZmlsZV9jb250ZW50cyk6IG5ldyBmdW5jdGlvbi4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IGFkZCBjYXNlcyBmb3IgaGFuZGxpbmcKLQlQVF9OT1RFIHNlZ21lbnRzLiAgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKToKLQljb3JlIGZpbGVzIHNob3VsZCBiZSBoYW5kbGVkIHRoZSBzYW1lIGFzIGV4ZWMgZmlsZXMuCi0JKHByZXBfaGVhZGVycyk6IGlkZW50aWZ5IGNvcmUgZmlsZXMgYXMgdHlwZSBFVF9DT1JFLgotCShjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBpZGVudGlmeSB0aGUgc2VjdGlvbnMgYmVsb25naW5nIHRvCi0JdGhlIFBUX05PVEUgc2VnbWVudC4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6Ci0JYWRkIGJyZWFrIHN0YXRlbWVudCB0byBkZWZhdWx0IGNhc2UuCi0KLTE5OTgtMDgtMTkgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgdGhhdCBvdXRwdXQKLQlzZWN0aW9uIChub3QgaW5wdXQpIHdpbGwgYmUgaW4gc2VjdGlvbnMgIi5zYnNzIiwgIi5zYnNzMiIsCi0JIi5zZGF0YSIsIGFuZCAiLnNkYXRhIiBmb3IgUl9QUENfU0RBUkVMMTYsIFJfUFBDX0VNQl9TREEyUkVMLAotCVJfUFBDX0VNQl9TREEyMSwgUl9QUENfRU1CX1JFTFNEQS4gIEluIGFsbCB0aGVzZSBjYXNlcyBhbHNvIGlnbm9yZQotCW91dHB1dF9vZmZzZXQgZm9yIGNvcnJlY3QgZXZhbHVhdGlvbiBvZiBhZGRlbmQuCi0KLVR1ZSBBdWcgMTggMTE6NDg6MTIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGYzMi1hcm0uYzogQWRkIHByZWZpeCBiZmRfIHRvIGVsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcsCi0gICAgICAgIGVsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgYW5kCi0gICAgICAgIGVsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uLgotCi1UdWUgQXVnIDE4IDExOjQ2OjAwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBiZmQtaW4uaDogQW1tZW5kIHByb3RvdHlwZSBmb3IKLSAgICAgICAgZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gdG8gcmVtb3ZlIHN1cnBsdXMgdGhpcmQKLSAgICAgICAgYXJndW1lbnQuCi0KLSAgICAgICAgKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0KLVNhdCBBdWcgMTUgMjA6NTU6MDggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IEhhbmRsZSBpbmRpcmVjdCBzeW1ib2xzLgotCi1GcmkgQXVnIDE0IDA5OjEyOjI4IDE5OTggIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBVc2UgdGhlIHJlbG9jYXRpb24gYWxyZWFkeQotCWNhbGN1bGF0ZWQgZm9yIFJFTE9DX1NQQVJDX1JFVjMyIGNhc2UuCi0KLVRodSBBdWcgMTMgMTQ6MDI6MDIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGJmZC1pbi5oOiAgQWRkIHByb3RvdHlwZXMgZm9yIGVsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcsCi0gICAgICAgZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBhbmQKLSAgICAgICBlbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbi4KLSAgICAgICAqIGJmZC1pbjIuaDogIFJlZ2VuZXJhdGVkLgotICAgICAgICogZWxmMzItYXJtLmMgRGVmaW5lIGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUuCi0gICAgICAgKGluc2VydF90aHVtYl9icmFuY2gpOiBOZXcgcm91dGluZS4KLSAgICAgICAoZmluZF90aHVtYl9nbHVlKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGZpbmRfYXJtX2dsdWUpOiBOZXcgcm91dGluZS4KLSAgICAgICAocmVjb3JkX2FybV90b190aHVtYl9nbHVlKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSk6IE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGVsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMpIE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbikgTmV3IHJvdXRpbmUuCi0gICAgICAgKGVsZjMyX3RodW1iX3RvX2FybV9zdHViKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGVsZjMyX2FybV90b190aHVtYl9zdHViKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGVsZjMyX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBGaXggdHlwby4KLSAgICAgICAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgQWRkIGFyZ3VtZW50IHN5bV9zZWMuCi0gICAgICAgQ2hlY2sgZm9yIGJyYW5jaGVzIHRvIHRodW1iIHN5bWJvbHMgaW4gY2FzZSBSX0FSTV9QQzI0LgotICAgICAgIENoZWNrIGZvciBicmFuY2hlcyB0byBhcm0gc3ltYm9scyBpbiBjYXNlIFJfQVJNX1RITV9QQzIyLgotICAgICAgIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6ICBQYXNzIHN5bWJvbCBzZWN0aW9uIHRvCi0gICAgICAgZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUuCi0KLVdlZCBBdWcgMTIgMTk6MDA6MzkgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogR2VuZXJhdGUgUExUCi0JZW50cmllcyB1bmxlc3MgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSBleGVjdXRhYmxlOyBpbgotCXBhcnRpY3VsYXIsIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbHMgZ2V0IGEgUExUIGVudHJ5LgotCi1XZWQgQXVnIDEyIDE0OjQ4OjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYW91dC5oOiBSZW1vdmUgbmVzdGVkIGNvbW1lbnQgdG8gYXZvaWQgd2FybmluZy4KLQotV2VkIEF1ZyAxMiAwODoxMDoxMSAxOTk4IENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBlbGYzMi1hcm0uYyAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgUmV3b3JrCi0gICAgICAgUl9BUk1fUEMyNCByZWxvY2F0aW9uLgotCi1UdWUgQXVnIDExIDE0OjQyOjI2IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBlbGYzMi1hcm0uYyAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgUmVtb3ZlIHVudXNlZAotICAgICAgIGFyZ3VtZW50IGlzX2xvY2FsLiAgQWRkIGFyZ3VtZW50IHN5bV9mbGFncy4gIENoZWNrIHN5bV9mbGFncwotICAgICAgIGluIFJfQVJNX0FCUzMyIGNhc2UuICBJbmNsdWRlIGFkZGVuZCBmb3IgUl9BUk1fVEhNX1BDMjIgY2FzZS4KLSAgICAgICAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiAgRG9uJ3QgcGFzcyBsb2NhbCBzeW0gYW5kIHBhc3MKLSAgICAgICBzeW1fZmxhZ3MgdG8gZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUuCi0KLU1vbiBBdWcgMTAgMjA6Mzg6MzkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMpOiBDb3JyZWN0IGxhc3QgY2hhbmdlCi0JdG8gbm90IGNvdW50IHRvbyBmZXcgcmVsb2NzIGZvciBkeW5hbWljbHkgbGlua2VkIGV4ZWN1dGFibGVzLgotCi1Nb24gQXVnIDEwIDE1OjM1OjM0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wKTogTmV2ZXIgY29uc2lkZXIKLQlzeW1ib2xzIHdpdGhvdXQgYSBkeW5hbWljIGluZGV4IGR5bmFtaWMuICBDb25zaWRlciBhbGwgd2VhawotCXN5bWJvbHMgZHluYW1pYy4KLQkoZWxmNjRfYWxwaGFfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCk6IERvbid0IGFzc3VtZSAxLTEKLQljb3JyZXNwb25kYW5jZSBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgc2VjdGlvbnMuCi0KLU1vbiBBdWcgMTAgMTU6MzE6MzkgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IEZvciBiYWNrZW5kcwotCXRoYXQgdXNlIGEgLmdvdC5wbHQgc2VjdGlvbiBzdGFydCB0aGUgZ290IG9mZnNldCBhdCB6ZXJvLgotCi1Nb24gQXVnIDEwIDE3OjMxOjIxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX3Byb2Nlc3Nvcik6IENvcnJlY3QgdGhlIHByb2Nlc3NvciBJRCB3cml0dGVuCi0Jb3V0IGZvciBiZmRfYXJjaF9tNjhrLCBhY2NvbW1vZGF0aW5nIGNoYW5nZSBvZiBNYXJjaCAyNS4KLQotU3VuIEF1ZyAgOSAyMDo1NTo0NCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVsZjMyLWFybS5jIChlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6ICBSZXdvcmsKLSAgICAgICAgUl9BUk1fVEhNX1JQQzIyIHJlbG9jYXRpb25zLgotCi1TYXQgQXVnICA4IDE1OjE1OjMwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wKTogVW5kZWYgd2VhayBzeW1ib2xzCi0JYXJlIGFsd2F5cyBkeW5hbWljLgotCShlbGY2NF9hbHBoYV9jYWxjX2R5bnJlbF9zaXplcyk6IEFsbG93IGVub3VnaCByb29tIGZvciBSRUxBVElWRQotCS5nb3QgcmVsb2NzIGluIC1Cc3ltYm9saWMgc2hhcmVkIG9iamVjdHMuCi0KLVdlZCBBdWcgIDUgMTU6NDg6MDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmM6IEFkZCBwcml2YXRlIGZsYWdzIHRvIEVMRiBoZWFkZXIuCi0JKGVsZjMyX2FybV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3IEZ1bmN0aW9uLgotCShlbGYzMl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MpOiBOZXcgRnVuY3Rpb24uCi0JKGVsZjMyX2FybV9jb3B5X3ByaXZhdGVfZmxhZ3MpOiBOZXcgRnVuY3Rpb24uCi0JKGVsZjMyX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IEZ1bmN0aW9uLgotCi1Nb24gQXVnICAzIDE3OjEwOjE1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogUGVybWl0IFdQTFQzMCBhZ2FpbnN0Ci0JYSBsb2NhbCBzeW1ib2wuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotU3VuIEF1ZyAgMiAwMzoxOToyMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBJbml0IHNnb3QgdG8gTlVMTC4gIENyZWF0ZSB0aGUKLQkuZ290IGlmIGFueSByZWxvY2F0aW9uIHJlZmVycnMgdG8gX0dMT0JBTF9PRkZTRVRfVEFCTEVfLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBQdWxsIHNnb3QgYW5kIHNwbHQgc2VhcmNoIHRvIHRoZSBzdGFydAotCW9mIHRoZSBmdW5jdGlvbi4gIFJlY29nbml6ZSBubyAucGx0IGFzIHN0YXRpYyBsaW5raW5nLgotCi0xOTk4LTA4LTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogRG9uJ3QgcGFzcwotCSIubGlibGlzdCIgc3RyaW5nIHRocm91Z2ggZ2V0dGV4dC4KLQotRnJpIEp1bCAzMSAxNjozODoxNCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgZWxmMzItYXJtLmxvLgotICAgICAgICAqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotICAgICAgICAqIGNvbmZpZy5iZmQgKGFybS0qLWVsZik6ICBEZWZpbmUgdGFyZ19kZWZ2ZWMgYW5kIHRhcmdfc2VsdmVjcy4KLSAgICAgICAgKHRodW1iLSotZWxmKTogRGVmaW5lIHRhcmdfZGVmdmVjIGFuZCB0YXJnX3NlbHZlY3MuCi0gICAgICAgICogY29uZmlndXJlLmluOiAgSGFuZGxlIGJmZF9lbGYzMl9saXR0bGVhcm1fdmVjIGFuZCBiZmRfZWxmMzJfYmlnYXJtX3ZlYy4KLSAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0gICAgICAgICogZWxmLmM6IChwcmVwX2hlYWRlcnMpOiAgU3VwcG9ydCBhcmNoX3R5cGUgb2YgRU1fQVJNLgotICAgICAgICAqIHRhcmdldHMuYzogIFN1cHBvcnQgbmV3IHRhcmdldHMgYmZkX2VsZjMyX2JpZ2FybV92ZWMgYW5kCi0gICAgICAgIGJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMuCi0gICAgICAgICogZWxmMzItYXJtLmM6ICBOZXcgZmlsZS4KLQotVHVlIEp1biAyOCAxOTowNToyOCAxOTk4ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogbGliYW91dC5oIChNX1NQQVJDTElURV9MRSk6IE5ldyBtYWNoaW5lLgotCSogc3Vub3MuYyAoTUFDSFRZUEVfT0spOiBBZGQgbWFjaGluZSBNX1NQQVJDTElURV9MRS4KLQkqIGFvdXRmMS5oIChzdW5vc19zZXRfYXJjaF9tYWNoKTogQWRkIG1hY2hpbmUgTV9TUEFSQ0xJVEVfTEUuCi0JKHN1bm9zX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEFkZCBtYWNoaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZQotCSogYW91dHguaCAoaG93dG9fdGFibGVfZXh0KTogQWRkIHJlbG9jYXRpb24gUl9TUEFSQ19SRVYzMi4KLQkoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpIEFkZCBtYWNoaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZQotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBBZGQgUkVMT0NfU1BBUkNfUkVWMzIgc3VwcG9ydC4KLQkqIGVsZjMyLXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlLCBzcGFyY19yZWxvY19tYXAsCi0JZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbmFtZSBSX1NQQVJDXzMyTEUgdG8gYmUgUl9TUEFSQ19SRVYzMgotCSogbGliYmZkLmggKGJmZF9yZWxvY19jb2RlX3JlYWxfbmFtZXMpOiBSZW5hbWUgQkZEX1JFTE9DX1NQQVJDXzMyTEUgdG8KLQliZSBCRkRfUkVMT0NfU1BBUkNfUkVWMzIuCi0JKiByZWxvYy5jOiBEaXR0by4KLQkqIGNvbmZpZy5iZmQgKHNwYXJjODZ4LSotYW91dCk6IE5ldwotCi1GcmkgSnVsIDI0IDEzOjU0OjE5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IEFsbG9jYXRlIE5VTEwgc3ltYm9sIGJlZm9yZQotCWFjdHVhbGx5IG1hcHBpbmcgdGhlIG91dHB1dCBzZWN0aW9ucy4KLQotRnJpIEp1bCAyNCAxMToyNDoyOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQotCSogZWxmLW0xMDMwMC5jIChtbjEwMzAwX2VsZl9ob3d0byk6IEFkZCBSX01OMTAzMDBfMjQgZW50cnkuCi0JKG1uMTAzMDBfZWxmX3JlbG9jX21hcCk6IFNpbWlsYXJseS4KLQkobW4xMDMwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBSX01OMTAzMDBfMjQuCi0KLUZyaSBKdWwgMjQgMTI6MzY6MDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogQWRkIHJlbG9jIHR5cGVzIHVzZWQgb24KLQlJcml4IDYuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgZGVmYXVsdCBjYXNlLgotCSogZWxmNjQtbWlwcy5jOiBSZXBsYWNlIGFsbCB1c2VzIG9mIG1pcHNfZWxmNjRfcmVsb2NfdHlwZSB3aXRoCi0JZWxmX21pcHNfcmVsb2NfdHlwZSBkZWZpbmVkIGluIGVsZi9taXBzLmguCi0KLTE5OTgtMDctMjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmM6IFJlbW92ZSByZWxvY190eXBlIGRlZmluaXRpb24gY29tcGxldGVseS4gIEl0J3Mgbm93Ci0JaW4gZWxmL21pcHMuaC4KLQotVGh1IEp1bCAyMyAxMzozMzoxOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfcmVsb2NfdHlwZSk6ICNpZiAwIG91dCBtb3JlIHJlbG9jYXRpb25zCi0JYXMgdGhleSBhcmUgZGVmaW5lZCBpbiBlbGYvbWlwcy5oIG5vdy4KLQotVGh1IEp1bCAyMyAxMToyOTo0MyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQotCSogUmUtYWRkIGxvc3QgY2hhbmdlOgotICAgICAgICAqIGVsZi1tMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkpOiBBZGQgbmV3IGZpZWxkCi0gICAgICAgICJtb3ZtX3N0YWNrX3NpemUiLgotICAgICAgICAobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IEluY2x1ZGUgc3RhY2sgc3BhY2UgZm9yIHJlZ2lzdGVyIHNhdmVzCi0gICAgICAgIGluIHRoZSBpbW04IGZpZWxkIG9mIGEgImNhbGwiIGluc3RydWN0aW9uLgotICAgICAgICAoY29tcHV0ZV9mdW5jdGlvbl9pbmZvKTogRGV0ZXJtaW5lIGhvdyBtdWNoIHN0YWNrIGlzIGFsbG9jYXRlZCBieQotICAgICAgICB0aGUgbW92bSBpbnN0cnVjdGlvbi4gIEZpeCB0eXBvLgotICAgICAgICAoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbW92bV9zdGFja19zaXplLgotCi1UaHUgSnVsIDIzIDExOjM4OjA1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplKTogRGVmaW5lIGFzIDQuCi0JKiBlbGY2NC1zcGFyYy5jIChlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUpOiBEZWZpbmUgYXMgOC4KLQotMTk5OC0wNy0yMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jOiBDaGFuZ2UgdXNlIG9mIHBwX3JlbG9jX3R5cGUgdG8gZWxmX3BwY19yZWxvY190eXBlLgotCi1XZWQgSnVsIDIyIDE2OjI3OjE4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWhwcGEuaDogTGV0IEVMRiBoZWFkZXIgZGVmaW5lIHRoZSBlbnVtIGNvbnRhaW5pbmcgdGhlCi0JZXh0ZXJuYWwgcmVsb2MgbnVtYmVycy4KLQkqIGVsZjMyLWkzODYuaDogTGlrZXdpc2UuCi0KLTE5OTgtMDctMjIgMTQ6NTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYtbTEwMzAwLmM6IExldCBFTEYgaGVhZGVyIG5vdyBkZWZpbmUgdGhlIG1hY3JvcyB0byBnZXQgdGhlIGVudW0uCi0JKiBlbGYzMi1taXBzLmM6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmM6IExpa2V3aXNlLgotCi1XZWQgSnVsIDIyIDEzOjUzOjUyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbjIuaDogQ2hhbmdlIHR5cGUgb2YgJ2NsYXNzJyBwYXJhbWV0ZXIgdG8gJ3Vuc2lnbmVkIGludCcgaW4KLQliZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzKCksIGluIG9yZGVyIHRvIGF2b2lkIEsmUiBjb21wYXRhYmlsaXR5Ci0JcHJibGVtcy4KLQkqIGJmZC1pbi5oOiBSZWdlbmVyYXRlLgotCSogY29mZmdlbi5jIChiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzKTogQ2hhbmdlIHR5cGUgb2YgJ2NsYXNzJwotCXBhcmFtZXRlciB0byAndW5zaWduZWQgaW50JyB0byBhdm9pZCBLJlIgY29tcGF0YWJpbGl0eSBwcm9ibGVtcy4KLQotV2VkIEp1bCAyMiAxNjo0MzoyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV9maW5kX25lYXJlc3RfbGluZSk6IENoYW5nZSBmaWxlbmFtZV9wdHIgYW5kCi0JZnVuY3Rpb25uYW1lX3B0ciB0byBiZSBjb25zdC4gIENoYW5nZSBsaW5lX3B0ciB0byBiZSB1bnNpZ25lZC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4pOiBTaW1wbGlmeSBoYW5kbGluZyB3aGVuCi0JbWFjcm8gaXMgbm90IGRlZmluZWQuICBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciBmcm9tIGJmZF9saW5rX2luZm8KLQl0byBjb2ZmX2ZpbmFsX2xpbmtfaW5mby4gIEFkZCBwcm90b3R5cGUuCi0JKGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KTogU2ltcGxpZnkgaGFuZGxpbmcgd2hlbiBtYWNybyBpcyBub3QKLQlkZWZpbmVkLiAgQWRkIHByb3RvdHlwZS4KLQotMTk5OC0wNy0yMiAxMzowOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1tbjEwMzAwLmM6IEJlZm9yZSBpbmNsdWRlIHN5c3RlbSBzcGVjaWZpYyBFTEYgaGVhZGVyIGRlZmluZQotCVNUQVJUX1JFTE9DX05VTUJFUlMsIFJFTE9DX05VTUJFUiwgYW5kIEVORF9SRUxPQ19OVU1CRVJTLgotCSogZWxmMzItbWlwcy5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jOiBMaWtld2lzZS4KLQotV2VkIEp1bCAyMiAxMzo0Njo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19lbGY2NF9yZWxvY190eXBlKTogQ29weSBVbHJpY2gncyBlbGYzMi1taXBzLmMKLQl0ZW1wb3JhcnkgcGF0Y2ggb3ZlciB0byBlbGY2NC1taXBzLmMgYXMgd2VsbC4KLQotMTk5OC0wNy0yMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAocmVsb2NfdHlwZSk6IFRlbXBvcmFyaWx5IGRpc2FibGUgZGVmaW5pdGlvbiBvZgotCXN0YW5kYXJkIHJlbG9jYXRpb24gc2luY2UgdGhleSBhcmUgbm93IGRlZmluZWQgaW4gZWxmL21pcHMuaC4KLQotVHVlIEp1bCAyMSAwOTo0NzowMCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVsZi1tMTAyMDAuYyAobW4xMDIwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6Ci0gICAgICAgIE1vZGlmeSByYW5nZSB0ZXN0IGZvciBjYXNlIFJfTU4xMDIwMF84LgotCi0gICAgICAgICogZWxmLW0xMDMwMC5jIChtbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKToKLSAgICAgICAgTW9kaWZ5IHJhbmdlIHRlc3QgZm9yIGNhc2UgUl9NTjEwMzAwXzguCi0KLU1vbiBKdWwgMjAgMTg6NTA6NTQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBnb3RfICYgcGx0X2hlYWRlcl9zaXplLgotCSogZWxmMzItaTM4Ni5jIChlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSk6IERlZmluZS4KLQkqIGVsZjMyLW02OGsuYywgZWxmMzItbWlwcy5jLCBlbGYzMi1wcGMuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jLCBlbGY2NC1hbHBoYS5jLCBlbGY2NC1zcGFyYy5jOiBMaWtld2lzZS4KLQkqIGVsZnh4LXRhcmdldC5oOiBQcm92aWRlIGEgZGVmYXVsdCBvZiB6ZXJvLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBVc2UgZ290X2hlYWRlcl9zaXplLgotCSogZWxmbGluay5oIChlbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IHJlbW92ZSBhIFBMVAotCWVudHJ5IGZyb20gYW4gZXhlY3V0YWJsZSwgZXZlbiBpZiB0aGUgcGx0IHJlZmNvdW50IGdvZXMgdG8gMC4KLQotTW9uIEp1bCAyMCAxMjo0NzoyNiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IEFsc28gcmVtZW1iZXIgdGhlCi0JZGlyZWN0b3J5IG5hbWUgYXQgdGhlIGxpbmUgbnVtYmVyLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBBbHNvIGNvbnNpZGVyIHN5bWJvbHMKLQl3aXRoIGFuIHVuc3BlY2lmaWVkIHR5cGUuCi0KLVdlZCBKdWwgMTUgMTE6MjA6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jOiBBZGQgdW5kZWYgb2YgdmFsaWQgdG8gYXZvaWQgcHJvYmxlbSBvbiBTdW5PUy4KLQotVHVlIEp1bCAxNCAxNTozMDo1OSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChpPzg2LXBjLWJlb3N7cGUsZWxmLH0qKTogUmVjb2duaXplLgotCi1UdWUgSnVsIDE0IDExOjIyOjIxIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IEFsc28gcmVmZXJlbmNlIGNvdW50Ci0JUl82OEtfUEN4eCBhbmQgUl82OEtfeHggcmVsb2NhdGlvbnMuICBNYWtlIHN1cmUgdGhhdAotCUVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIGlzIGFsd2F5cyBzZXQgZm9yIGEgUExUIHJlbG9jIHJlZmVyZW5jZS4KLQkoZWxmX202OGtfZ2Nfc3dlZXBfaG9vayk6IEFsc28gcmVmZXJlbmNlIGNvdW50IFJfNjhLX1BDeHggYW5kCi0JUl82OEtfeHggcmVsb2NhdGlvbnMuCi0JKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJlc2V0IHRoZSBwbHQgb2Zmc2V0IG9mIGEgc3ltYm9sCi0JdGhhdCBoYXMgbm8gcGx0IGVudHJ5LgotCShlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogSWdub3JlIHRoZSBwbHQgb2Zmc2V0IGluIGEgc3RhdGljCi0JbGluay4KLQkqIGVsZmxpbmsuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJlc2V0IHRoZSBwbHQgb2Zmc2V0IGZvcgotCWFuIGlnbm9yZWQgc3ltYm9sLgotCShlbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzKTogU2V0IHRoZSBnb3Qgb2Zmc2V0cyBhbHNvIGluCi0JYSBzdGF0aWMgbGluay4KLQotCSogZWxmMzItbTY4ay5jIChSXzY4S19HTlVfVlRJTkhFUklULCBSXzY4S19HTlVfVlRFTlRSWSk6IE5ldyByZWxvYwotCXR5cGVzLgotCShob3d0b190YWJsZSwgcmVsb2NfbWFwKTogQWRkIGVudHJpZXMgZm9yIHRoZW0uCi0JKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IEhhbmRsZSB0aGVtLiAgSW1wbGVtZW50IHJlZmVyZW5jZQotCWNvdW50aW5nIGZvciBnb3QgYW5kIHBsdCBlbnRyaWVzLgotCShlbGZfbTY4a19nY19tYXJrX2hvb2ssIGVsZl9tNjhrX2djX3N3ZWVwX2hvb2spOiBOZXcgZnVuY3Rpb25zLgotCShlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBIYW5kbGUgdW5yZWZlcmVuY2VkIHBsdAotCXN5bWJvbHMuCi0JKHJ0eXBlX3RvX2hvd3RvX3JlbCwgZWxmX2luZm9fdG9faG93dG9fcmVsKTogRGVsZXRlLgotCShlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHRoZSBuZXcgcmVsb2MgdHlwZXMuCi0JKGJmZF9lbGYzMl9iZmRfZmluYWxfbGluaywgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rLAotCWVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2ssIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6IERlZmluZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogV2hlbiBjcmVhdGluZyBhbgotCWluZGlyZWN0IHJlZmVyZW5jZSBmb3Igc3ltYm9sIHZlcnNpb25pbmcgYWxzbyBjb3B5IHRoZSBwbHQKLQlvZmZzZXQuCi0JKGVsZl9maXhfc3ltYm9sX2ZsYWdzKTogV2hlbiBjbGVhcmluZyB0aGUgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQKLQlmbGFnIGFsc28gcmVzZXQgdGhlIHBsdCBvZmZzZXQuCi0JKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IExpa2V3aXNlLgotCShlbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzKTogSW5jcmVtZW50IHRoZSBnb3Qgb2Zmc2V0IGJ5Ci0JdGhlIHNpemUgb2YgdGhlIGVudHJ5IGluIGJ5dGVzLgotCShlbGZfZ2NfYWxsb2NhdGVfZ290X29mZnNldHMpOiBMaWtld2lzZS4KLQotVHVlIEp1bCAxNCAxMToxODoxNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2djX3NlY3Rpb25zKTogUmV0dXJuIHRydWUgcmF0aGVyIHRoYW4gZmFsbGluZyBvZmYKLQl0aGUgYm90dG9tLgotCi0JKiBjb2ZmZ2VuLmMgKGJmZF9jb2ZmX3NldF9zeW1ib2xfY2xhc3MpOiBDYWxsIGJmZF9hbGxvYywgbm90Ci0JeG1hbGxvYy4KLQotTW9uIEp1bCAxMyAxMTowNjozMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jOiBTdXByZXNzIGRlZmluaXRpb24gb2YgVEFSR0VUX1VOREVSU0NPUkUgYW5kIGFkZCBhCi0JY29tbWVudCBkZXNjcmliaW5nIHdoZW4gaXQgc2hvdWxkIGJlIGVuYWJsZWQuCi0JQ2hhbmdlZCBkZWZpbml0aW9uIG9mIFVTRVJfTEFCRUxfUFJFRklYIHRvICIiLCB0byBmYWxsIGludG8gbGluZQotCXdpdGggR0NDIHNvdXJjZXMuCi0KLU1vbiBKdWwgMTMgMTM6MDY6NTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scyk6IEhhbmRsZSBjYWxsIG9wdGltaXphdGlvbgotCWluZm9ybWF0aW9uIEFUTiByZWNvcmRzLgotCi1GcmkgSnVsIDEwIDE2OjMxOjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMpOiBTZWxlY3QgYW4gYXBwcm9wcmlhdGUKLQlzZWN0aW9uIGZvciBhbiBhYnNvbHV0ZSBzeW1ib2wgaW4gYSBmdWxseSBsaW5rZWQgZmlsZS4gIEJhc2VkIG9uCi0JcGF0Y2ggZnJvbSBDaHJpc3RpYW4gSG9sbGFuZCA8Q0hvbGxhbmRAZGUubHVjZW50LmNvbT4uCi0KLVdlZCBKdWwgIDggMTE6Mjk6NTYgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb2ZmLW04OGsuYyAobTg4a19zcGVjaWFsX3JlbG9jKTogRG9uJ3QgbG9zZSB0aGUgaW5mb3JtYXRpb24KLQl0aGF0IGEgc3ltYm9sIGlzIHVuZGVmaW5lZC4KLQotVHVlIEp1bCAgNyAyMTo0NzowMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fYmZkX2djX3NlY3Rpb25zKTogRGVmaW5lLgotCi1Nb24gSnVsICA2IDExOjM1OjUwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvKTogRG8gbm90IGNvbXBsYWluIGFib3V0Ci0Jb3ZlcmZsb3dzIGluIEFSTV8yNkQgcGF0Y2hlcywgc2luY2UgdGhleSBoYXZlIGFscmVhZHkgYmVlbgotCWltcGxtZW50ZWQuICBQYXRjaCBzdWJtaXR0ZWQgYnkgRHIuIFIuSi4gQmxhY2sgPHJqYkBkY3MuZ2xhLmFjLnVrPgotCi1TYXQgSnVsICA0IDEyOjI1OjM2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiB3ZSBoYXZlIGFueSBsb25nCi0Jc2VjdGlvbiBuYW1lcywgY2FsbCBjb2ZmX3dyaXRlX3N5bWJvbHMgZXZlbiBpZiB0aGVyZSBhcmUgbm8KLQlzeW1ib2xzLgotCi1GcmkgSnVsICAzIDEzOjExOjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE9ubHkgc2V0IHBoZHJfaW5jbHVkZWQgb25jZSBmb3IgYQotCVBUX0xPQUQgc2VnbWVudCwgcmF0aGVyIHRoYW4gb25seSBzZXR0aW5nIGl0IG9uY2UgZm9yIHRoZSBlbnRpcmUKLQlmaWxlLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IFdoZW4gc2V0dGluZyB0aGUgTE1BLAotCXJhdGhlciB0aGFuIGlnbm9yaW5nIGV2ZXJ5IHBoZHIgd2l0aCBhIHBfcGFkZHIgb2YgMCwgaWdub3JlIGFsbAotCXRoZSBwaGRycyBpZiB0aGV5IGFsbCBoYXZlIGEgcF9wYWRkciBvZiAwLgotCi0JKiBzdGFicy5jIChfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyk6IENoZWNrIHdoZXRoZXIgdGhlIC5zdGFic3RyCi0Jc2VjdGlvbiB3YXMgZGlzY2FyZGVkIGZyb20gdGhlIGxpbmsuCi0KLUZyaSBKdWwgIDMgMTQ6Mzk6MDUgMTk5OCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb2ZmLXNoLmMgKHNoX2luc25fdXNlc19mcmVnKTogSWdub3JlIGxvd2VzdCBiaXQgb2YgcmVnaXN0ZXIgbnVtYmVyLgotCi1GcmkgSnVsICAzIDE0OjM1OjQ4IDE5OTggIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29mZi1zaC5jIChzaF9pbnNuc19jb25mbGljdCk6IExvYWQgb2YgZnBzY3IgY29uZmxpY3RzIHdpdGgKLQlmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zLgotCi1UaHUgSnVsICAyIDE4OjM3OjI1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogU2tpcCB1bmRlZmluZWQgZ2xvYmFsCi0JZnVuY3Rpb24gc3ltYm9scy4KLQotVGh1IEp1bCAgMiAxNDo1OTo0MiAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHJtaS5kZT4KLQotCU1lcmdlIG9mIHZheC92bXMgKHJlYWQtb25seSkgc3VwcG9ydAotCSogY29uZmlndXJlLmNvbTogU3VwcG9ydCBWYXggdGFyZ2V0LgotCSogbWFrZWZpbGUudm1zOiBTdXBwb3J0IFZheCB0YXJnZXQuCi0gICAgICAgICogdm1zLmg6IFJlbmFtZWQgZnJvbSBldmF4LmgsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpIHN1cHBvcnQuCi0JKiB2bXMuYzogUmVuYW1lZCBmcm9tIGV2YXgtYWxwaGEuYywgbWVyZ2VkIHZheC92bXMgKHJlYWQtb25seSkKLQlzdXBwb3J0LgotCSogdm1zLWhkci5jOiBSZW5hbWVkIGZyb20gZXZheC1lbWguYywgbWVyZ2VkIHZheC92bXMgKHJlYWQtb25seSkKLQlzdXBwb3J0LgotCSogdm1zLWdzZC5jOiBSZW5hbWVkIGZyb20gZXZheC1lZ3NkLmMsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpCi0Jc3VwcG9ydC4KLQkqIHZtcy10aXIuYzogUmVuYW1lZCBmcm9tIGV2YXgtZXRpci5jLCBtZXJnZWQgdmF4L3ZtcyAocmVhZC1vbmx5KQotCXN1cHBvcnQuCi0JKiB2bXMtbWlzYy5jOiBSZW5hbWVkIGZyb20gZXZheC1taXNjLmMsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpCi0Jc3VwcG9ydC4KLQkqIGxpYmJmZC5jIChyZWFsX3JlYWQpOiBVc2UgdW5idWZmZXJlZCByZWFkIG9uIFZNUy9WYXguCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfb3ZheF9mbGF2b3VyKTogTmV3IGZsYXZvdXIuCi0JKHZtc19hbHBoYV92ZWMpOiBSZW5hbWVkIGZyb20gZXZheF9hbHBoYV92ZWMuCi0JKHZtc192YXhfdmVjKTogTmV3LgotCSh0YXJnZXRfdmVjdG9yKTogVXBkYXRlIGFjY29yZGluZ2x5LgotCSogY29uZmlnLmJmZCAoYWxwaGEqLSotKnZtcyopOiBVc2Ugdm1zX2FscGhhX3ZlYywgbm90Ci0JZXZheF9hbHBoYV92ZWMuCi0JKHZheCotKi0qdm1zKik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5hbTogVXBkYXRlIGZvciByZW5hbWVkIGZpbGVzLiAgUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkLgotCi1UaHUgSnVsICAyIDEzOjMxOjU1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gTWF0dCBTZW1lcnNreSA8bWF0dHNAc2NkLmhwLmNvbT46Ci0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBGb3JjZSBhIHRyYWlsaW5nIE5VTEwKLQlwb2ludGVyIG9uIGFiZmQtPm91dHN5bWJvbHMuCi0JKGdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wpOiBIYW5kbGUgTlVMTCBzeW0gcGFyYW1ldGVyLgotCi1XZWQgSnVsICAxIDE3OjA1OjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGQgc3VwcG9ydCBmb3IgY2hhbmdpbmcgVk1BIG9yCi0JTE1BIG9mIHNlY3Rpb25zLgotCi1XZWQgSnVsICAxIDE2OjU4OjUwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBDb3JyZWN0IGFkZHJlc3MgY29tcGFyaXNvbnMKLSAJd2hlbiBoYW5kbGluZyAzMiBiaXQgaW1tZWRpYXRlIHJlbG9jcy4KLQkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBMaWtld2lzZS4KLQotVHVlIEp1biAzMCAwOTo1NTowMyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoU1REX1NFQ1RJT04pOiBBY2NvdW50IGZvciByZWNlbnRseSBhZGRlZCBnY19tYXJrCi0JZmllbGQgaW4gc3RydWN0IGFzZWN0aW9uLgotCi0JKiBlbGYtbTEwMzAwLmMgKGJmZF9tbjEwMzAwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0KLVRodSBKdW4gMjUgMTg6MzE6NDEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCUVMRiBTZWN0aW9uLWxldmVsIEdhcmJhZ2UgQ29sbGVjdGlvbjoKLQkqIGJmZC5jIChiZmRfZ2Nfc2VjdGlvbnMpOiBOZXcuCi0JKiBhb3V0LWFkb2JlLmM6IEhvb2sgdG8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KLQkqIGFvdXQtdGFyZ2V0LmgsIGFvdXQtdGljMzAuYywgYmluYXJ5LmMsIGJvdXQuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLWFscGhhLmMsIGNvZmYtbWlwcy5jLCBjb2ZmLXJzNjAwMC5jLCBjb2ZmY29kZS5oOiBMaWtld2lzZS4KLQkqIGV2YXgtYWxwaGEuYywgaTM4Nm1zZG9zLmMsIGkzODZvczlrLmMsIGllZWUuYzogTGlrZXdpc2UuCi0JKiBpaGV4LmMsIG5sbS10YXJnZXQuaCwgb2FzeXMuYywgcHBjYm9vdC5jLCBzcmVjLmM6IExpa2V3aXNlLgotCSogdGVraGV4LmMsIHZlcnNhZG9zLmM6IExpa2V3aXNlLgotCSogbGliYmZkLWluLmggKF9iZmRfbm9saW5rX2JmZF9nY19zZWN0aW9ucyk6IE5ldy4KLQkqIHRhcmdldHMuYyAoQkZEX0pVTVBfVEFCTEVfTElOSyk6IEFkZCBfYmZkX2djX3NlY3Rpb25zLgotCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpOiBOZXcuCi0JKGJmZF9nZW5lcmljX2djX3NlY3Rpb25zKTogTmV3LgotCSogc2VjdGlvbi5jIChTRUNfS0VFUCk6IE5ldy4KLQkoYXNlY3Rpb24pOiBBZGQgZ2NfbWFyayBtZW1iZXIuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2djKik6IE5ldyBuYW1lIHJlbWFwcGluZ3MuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IERvbid0IHNldCBjb250ZW50cyBvbiBzdGFicwotCXNlY3Rpb25zIHRvIGJlIGV4Y2x1ZGVkLgotCShlbGZfZ2NfbWFyaywgZWxmX2djX3N3ZWVwLCBlbGZfZ2Nfc3dlZXBfc3ltYm9sKTogTmV3LgotCShlbGZfZ2NfcHJvcG9nYXRlX3Z0YWJsZV9lbnRyaWVzX3VzZWQpOiBOZXcuCi0JKGVsZl9nY19zbWFzaF91bnVzZWRfdnRlbnRyeV9yZWxvY3MpOiBOZXcuCi0JKGVsZl9nY19zZWN0aW9ucywgZWxmX2djX3JlY29yZF92dGluaGVyaXQsIGVsZl9nY19yZWNvcmRfdnRlbnRyeSk6IE5ldy4KLQkoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IE5ldy4KLQkoZWxmX2djX2FsbG9jYXRlX2dvdF9vZmZzZXRzLCBlbGZfZ2NfY29tbW9uX2ZpbmFsX2xpbmspOiBOZXcuCi0JKiBlbGZ4eC10YXJnZXQuaDogQWRkIGFuZCBkZWZhdWx0IGdjIGhvb2tzLgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogU3dhcCBnb3Rfb2Zmc2V0L3BsdF9vZmZzZXQKLQlmb3IgdW5pb25zLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IExpa2V3aXNlIGZvciBsb2NhbF9nb3Rfb2Zmc2V0cy4KLQkqIGVsZi5jLCBlbGYtaTM4Ni5jLCBlbGYzMi1tNjhrLmMsIGVsZjMyLW1pcHMuYzogVXBkYXRlIGFsbCB1c2VzLgotCSogZWxmMzItcHBjLmMsIGVsZjMyLXNwYXJjLmMsIGVsZjY0LWFscGhhLmM6IExpa2V3aXNlLgotCSogZWxmNjQtc3BhcmMuYywgZWxmbGluay5oOiBMaWtld2lzZS4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCB2dGFibGUgbWVtYmVycy4KLQkoRUxGX0xJTktfSEFTSF9NQVJLKTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBHQyBob29rcy4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IFplcm8gdnRhYmxlIG1lbWJlcnMuCi0KLQkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfY2hlY2tfcmVsb2NzKTogTmV3LgotCShtbjEwMzAwX2VsZl9nY19tYXJrX2hvb2spOiBOZXcuCi0JKFJfTU4xMDMwMF9HTlVfVlRJTkhFUklULCBSX01OMTAzMDBfR05VX1ZURU5UUlkpOiBOZXcuCi0JKGVsZl9tbjEwMzAwX2hvd3RvLCBtbjEwMzAwX3JlbG9jX21hcCk6IEhhbmRsZSB0aGVtLgotCShtbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogTGlrZXdpc2UuCi0JKG1uMTAzMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogRGVmaW5lLgotCSogZWxmMzItbWlwcy5jIChSX01JUFNfR05VX1ZUSU5IRVJJVCwgUl9NSVBTX0dOVV9WVEVOVFJZKTogTmV3LgotCShlbGZfbWlwc19nbnVfdnRpbmhlcml0X2hvd3RvLCBlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0byk6IE5ldy4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSB0aGVtLgotCShtaXBzX2luZm9fdG9faG93dG9fcmVsKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2djX21hcmtfaG9vaywgbWlwc19lbGZfZ2Nfc3dlZXBfaG9vayk6IE5ldy4KLQkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogRGVmaW5lLgotCSogZWxmMzItcHBjLmMgKFJfUFBDX0dOVV9WVElOSEVSSVQsIFJfUFBDX0dOVV9WVEVOVFJZKTogTmV3LgotCShwcGNfZWxmX2hvd3RvX3Jhdyk6IEhhbmRsZSB0aGVtLgotCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogTGlrZXdpc2UuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFJlZmVyZW5jZSBjb3VudCAuZ290IGFuZCAucGx0IGVudGlyZXMuCi0JSGFuZGxlIG5ldyB2dGFibGUgcmVsb2NzLgotCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJlY29nbml6ZSB1bnVzZWQgLnBsdCBlbnRyaWVzLgotCShwcGNfZWxmX2djX21hcmtfaG9vaywgcHBjX2VsZl9nY19zd2VlcF9ob29rKTogTmV3LgotCShlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiBEZWZpbmUuCi0KLUZyaSBKdW4gMjYgMTA6NDg6MjMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9tbjEwMzAwKTogRGVmaW5lLgotCSogZWxmLW0xMDMwMC5jOiBJbmNsdWRlIGVsZi9tbjEwMzAwLmgKLQkoZWxmX21uMTAzMDBfbWFjaCk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9tbjEwMzAwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0JKF9iZmRfbW4xMDMwMF9lbGZfb2JqZWN0X3ApOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRmaW5hbF93cml0ZV9wcm9jZXNzaW5nKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9vYmplY3RfcCk6IExpa2V3aXNlLgotCi1UaHUgSnVuIDI1IDE4OjMxOjA4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogRml4IEhJMTZfUwotCXJlbG9jYXRpb24uCi0KLVdlZCBKdW4gMjQgMTc6MTc6NTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IExvb3Agb3ZlciBpbnB1dF9iZmRzIHVzaW5nIHRoZQotCWxpbmtfbmV4dCBmaWVsZCwgbm90IHRoZSBuZXh0IGZpZWxkLgotCi1TdW4gSnVuIDIxIDE5OjM4OjM5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IENoZWNrIHRoZSBzZWN0aW9uIGFkZHJlc3MKLQlhZ2FpbnN0IHRoZSBwaGRyIHNpemUgYm90aCB3aXRoIGFuZCB3aXRob3V0IGEgbW9kdWxvIG9mCi0JbWF4cGFnZXNpemUuCi0KLUZyaSBKdW4gMTkgMTc6MDg6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgc3RyaXAgYQotCWxpbmtlciBjcmVhdGVkIGVtcHR5IGlucHV0IHNlY3Rpb24gaWYgdGhlIG91dHB1dCBzZWN0aW9uIGhhcyB0aGUKLQlzYW1lIG5hbWUuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFByaW50IGFuIGVycm9yIG1lc3NhZ2UgaWYKLQlfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gZmFpbHMuCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBDYWxsIGJmZF9zZXRfZXJyb3Igb24KLQlmYWlsdXJlLgotCi1UdWUgSnVuIDE2IDExOjU1OjU1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IEltcHJvdmUgaGFuZGxpbmcgb2YgU29sYXJpcwotIAluYXRpdmUgbGlua2VyIG91dHB1dC4gIEF2b2lkIHB1dHRpbmcgYW4gZW1wdHkgc2VjdGlvbiBpbiBtb3JlIHRoYW4KLSAJb25lIHNlZ21lbnQuCi0KLUZyaSBKdW4gMTIgMTM6MzA6MTcgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChhbGwteWVzKTogSWYgbWFpbnRhaW5lciBtb2RlLCBkZXBlbmQgb24gLnBvdCBmaWxlLgotCSgkKFBBQ0tBR0UpLnBvdCk6IFVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gUE9URklMRVMuCi0KLUZyaSBKdW4gMTIgMTM6MzQ6MDIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKHN3YXBfb3V0X3N5bXMpOiBOZXcgYXJnIHJlbG9jYXRhYmxlX3AuCi0JRG9uJ3QgYWRkIHNlY3Rpb24gVk1BIHRvIHN5bWJvbHMgZm9yIHJlbG9jYXRhYmxlIG91dHB1dC4KLQkoX2JmZF9lbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogVXBkYXRlIGNhbGwgdG8KLQlzd2FwX291dF9zeW1zLgotCi1Nb24gSnVuICA4IDE1OjIwOjU3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogTWFrZSBjb21wYXJpc29ucwotCWFnYWluc3QgJ2FkZGVuZCcgYmUgc2lnbmVkIHJhdGhlciB0aGFuIHVuc2lnbmVkLgotCi1TYXQgSnVuICA2IDAwOjMxOjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYzogQWRkIHByb3RvdHlwcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4KLQotCSogY29mZi1hcm0uYzogQWRkIHByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuCi0KLUZyaSBKdW4gIDUgMTc6MjE6NTEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGVsZl9zb3J0X3NlY3Rpb25zKTogU29ydCBieSBMTUEgZmlyc3QgdGhlbiBWTUEsIHNpbmNlIHRoZQotCUxNQSBpcyB1c2VkIHRvIG9yZGVyIHNlY3Rpb25zIGluIGEgc2VnbWVudC4KLQotCSogZWxmMzItdjg1MC5jOiBBZGQgcHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4KLQlDaGFuZ2UgdHlwZSBvZiBhZGRlbmQgcGFyYW1ldGVyIHRvIGJmZF92bWEgaW4gdmFyaW91cyBmdW5jdGlvbnMuCi0KLUZyaSBKdW4gIDUgMTg6MDk6NTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9leHQpOiBDaGFuZ2UgUkVMT0NfQkFTRTEzIHRvIHVzZQotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCBpbnN0ZWFkIG9mIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLgotCi1GcmkgSnVuICA1IDE1OjExOjExIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYuYyAoZWxmX21hcF9zeW1ib2xzKTogRG9uJ3QgYWRkIHNlY3Rpb24gVk1BIHRvIHN5bWJvbCB2YWx1ZQotCXdoZW4gY29tcGFyaW5nIGFnYWluc3QgMC4KLQotV2VkIEp1biAgMyAxNzo1Mjo0OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjb25maWcuc3RhdHVzKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1XZWQgSnVuICAzIDEyOjE4OjI0IDE5OTggIFN0YW4gQ294ICA8c2NveEBlcXVpbm94LmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBHaXZlIGFuCi0JZXJyb3IgaWYgcHJldmlvdXMgb2JqZWN0IGVuZGlhbm5lc3MgZG9lc24ndCBtYXRjaCBjdXJyZW50IG9iamVjdC4KLQotVHVlIEp1biAgMiAxNzo1MDo1OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBDYWxsCi0JX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZSliZmRfZGF0YSAoKS4KLQotVHVlIEp1biAgMiAxNToyOTozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IERvbid0IGFsd2F5cyBzZXQgdHlwZV9jaGFuZ2Vfb2sKLQlhbmQgc2l6ZV9jaGFuZ2Vfb2suCi0gCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBTZXQgdHlwZV9jaGFuZ2Vfb2sgYW5kCi0Jc2l6ZV9jaGFuZ2Vfb2sgYmVmb3JlIGNhbGxpbmcgZWxmX21lcmdlX3N5bWJvbC4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgd2UgaXNzdWUgYW4KLQl1bmRlZmluZWQgc3ltYm9sIGVycm9yLCBkb24ndCBhbHNvIGlzc3VlIGFuIG92ZXJmbG93IGVycm9yLgotCi1UdWUgSnVuICAyIDEzOjUxOjAwIDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBUaGUgdGFyZ2V0IG9mIGFuCi0JUl9QUENfTE9DQUwyNFBDIHJlbG9jYXRpb24gc2hvdWxkIGJlIGxvY2FsOyBpZiBub3QsIHByaW50IGFuIGVycm9yCi0JbWVzc2FnZSBpbnN0ZWFkIG9mIGNyYXNoaW5nLgotCi1Nb24gSnVuICAxIDE4OjIzOjEyIDE5OTggIFl1bGkgQmFyY29oZW4gIDx5dWxpLmJhcmNvaGVuQHRlbHJhZC5jby5pbD4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfY3B1MzIpOiBEZWZpbmUuCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBBZGQgY2FzZSBmb3IgNjgwNjAuICBGaXggNjgzMzIgY2FzZSB0byB1c2UKLQliZmRfbWFjaF9jcHUzMi4KLQkqIGNwdS1tNjhrLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgbTY4azpjcHUzMi4KLQkqIGllZWUuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKGllZWVfb2JqZWN0X3ApOiBQYXJzZSBvdXQgcHJvY2VzcyBJRCBzdHJpbmcgdG8gbWFrZSBpdCBtb3JlCi0JbGlrZWx5IHRvIGJlIGFjY2VwdGFibGUgZm9yIGJmZF9zY2FuX2FyY2guCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLU1vbiBKdW4gIDEgMTE6MTI6MDIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQWxzbyBjYWxsCi0JX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSgpIHNvIHRoYXQgdGhlIHByb2dyYW0gaGVhZGVyIHdpbGwKLQliZSBkaXNwbGF5ZWQuCi0KLU1vbiBKdW4gIDEgMTI6MTQ6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zeW1faW4pOiBDaGVjayBmb3IgQ19TRUNUSU9OIHJhdGhlciB0aGFuCi0JMHg2OC4gIFJlaW5kZW50LiAgQWRkIHNvbWUgY29tbWVudHMuCi0KLUZyaSBNYXkgMjkgMDk6NTg6MDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkanVzdCBwaHlzaWNhbCBhZGRyZXNzIG9mCi0Jc2VnbWVudCBpbiBvdXRwdXQgQkZEIHRvIGNvbnRhaW4gTE1BcyBvZiBpdHMgc2VjdGlvbnMuCi0KLVR1ZSBNYXkgMjYgMTk6Mzc6NDcgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUsIHNwYXJjX3JlbG9jX21hcCwKLQllbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogQWRkZWQgUl9TUEFSQ18zMkxFIGZvciBsaXR0bGUKLQllbmRpYW4gZGF0YSAzMiBiaXQgcmVsb2NhdGlvbnMuCi0JKGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDaGVjayBpZiBsaW5raW5nIGxpdHRsZQotCWVuZGlhbiBvYmplY3RzIHdpdGggYmlnIGVuZGlhbiBvYmplY3RzLgotCShlbGYzMl9zcGFyY19vYmplY3RfcCk6IFNldCBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUuCi0JKGVsZjMyX3NwYXJjX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBTZXQgRUZfU1BBUkNfTEVEQVRBIGluIGVfZmxhZ3MuCi0JKiBsaWJiZmQuaCAoYmZkX3JlbG9jX2NvZGVfcmVhbF9uYW1lcyk6IEFkZGVkIEJGRF9SRUxPQ19TUEFSQ18zMkxFLgotCSogcmVsb2MuYzogU2FtZS4KLQkqIGNwdS1zcGFyYy5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkZWQgc3BhcmM6c3BhcmNsaXRlX2xlCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUpOiBOZXcuCi0JKiBiZmQtaW4yLmggKEJGRF9SRUxPQ19TUEFSQ18zMkxFLCBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUpOiBOZXcuCi0KLVRodSBNYXkgMjEgMTY6NTk6MjggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IEZpeCBwcmVjZWRlbmNlIG9mIG9wZXJhdG9ycyBpbiBpZiAoKQotCXN0YXRlbWVudC4KLQotVHVlIE1heSAxOSAxODo0MToxOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oOiBNb3ZlIG92ZXIgcGF0Y2ggdG8gYmZkLWluMi5oLgotCi0JKiByZWxvYy5jIChiZmRfY2hlY2tfb3ZlcmZsb3cpOiBBZGQgY2FzdHMgYmVmb3JlIHNoaWZ0cyB3aGljaCBtYXkKLSAJbm90IGZpdCBpbiAzMiBiaXRzLgotCShfYmZkX3JlbG9jYXRlX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLU1vbiBNYXkgMTggMTQ6NDQ6MTUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IElmIHRoZSBzZWN0aW9uIGhhcyBubyBwcml2YXRlIGRhdGEKLQl0aGVuIGRvIG5vdCBjcmVhdGUgYSBEYXRhIERpY3Rpb25hcnkgZW50cnkgZm9yIGl0LgotCi1Nb24gTWF5IDE4IDAwOjA5OjI4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24pOiBTZXQgYWdhaW4gb24gY2hhbmdlcy4KLQkoZWxmNjRfYWxwaGFfY2FuX21lcmdlX2dvdHMsIGVsZjY0X2FscGhhX21lcmdlX2dvdHMsCi0JZWxmNjRfYWxwaGFfc2l6ZV9nb3Rfc2VjdGlvbnMpOiBSZXdyaXRlLCBoYW5kbGluZyBtdWx0aXBsZSBnb3QKLQlzdWJzZWN0aW9ucyBkdXJpbmcgcmVsYXhhdGlvbiBtb3JlIGNvcnJlY3RseS4KLQotVGh1IE1heSAxNCAxNDoyMjo1OCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiZmQtaW4yLmg6IEFkZCBuZXcgcHJvdG90eXBlOiBiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzICgpLgotCUFkZCBleHRyYSBhcmd1bWVudCB0byBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKCkuCi0JKiBiZmQtaW4uaDogUmVmbGVjdCBjaGFuZ2VzIG1hZGUgaW4gYmZkLWluMi5oLgotCSogY29mZmdlbi5jIChiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzKTogTmV3IGZ1bmN0aW9uLiAgU2V0IHRoZQotCWNvZmYgY2xhc3Mgb2YgYSBCRkQgc3ltYm9sLgotCSogY29mZi1hcm0uYzogQWRkIHN1cHBvcnQgZm9yIGludGVyd29ya2luZyBiZXR3ZWVuIFRodW1iIGNvZGUgYW5kCi0Jbm9uLWludGVyd29ya2luZyBhd2FyZSBBUk0gY29kZS4KLQotU3VuIE1heSAxMCAyMjozMzo1OSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHBvL01ha2UtaW4gKGluc3RhbGwtaW5mbyk6IE5ldyB0YXJnZXQuCi0KLVRodSBNYXkgIDcgMTc6NDA6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmaWxlbW9kZS5jOiBSZW1vdmU7IG5vdCB1c2VkLgotCi0JSWYgc3lzZGVwLmggaW5jbHVkZXMgYSBoZWFkZXIgZmlsZSwgZG9uJ3QgaW5jbHVkZSBpdCBhZ2FpbjoKLQkqIGFpeDM4Ni1jb3JlLmM6IERvbid0IGluY2x1ZGUgPHN0ZGlvLmg+LCA8c3RkZGVmLmg+LCBvcgotCTxlcnJuby5oPi4KLQkqIGFvdXR4Lmg6IERvbid0IGluY2x1ZGUgPHN0cmluZy5oPi4gIFVzZSAic3lzZGVwLmgiIHJhdGhlciB0aGFuCi0JPHN5c2RlcC5oPi4KLQkqIGFyY2hpdmUuYzogRG9uJ3QgaW5jbHVkZSA8c3RyaW5nLmg+IG9yIDxlcnJuby5oPi4KLQkqIGV2YXgtYWxwaGEuYzsgRG9uJ3QgaW5jbHVkZSA8c3RkaW8uaD4uCi0JKiBldmF4LWVnc2QuYzogTGlrZXdpc2UuCi0JKiBldmF4LWV0aXIuYzogTGlrZXdpc2UuCi0JKiBldmF4LW1pc2MuYzogTGlrZXdpc2UuCi0JKiBldmF4LWVtaC5jOiBMaWtld2lzZS4gIEFsc28sIGRvbid0IGluY2x1ZGUgPHN5cy90eXBlcy5oPi4KLQkqIGhwcGFic2QtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxzdGRpby5oPiwgPHN5cy90eXBlcy5oPiwgb3IKLQk8ZXJybm8uaD4uCi0JKiBocHV4LWNvcmUuYzogTGlrZXdpc2UuCi0JKiBuZXRic2QtY29yZS5jOiBMaWtld2lzZS4KLQkqIHNvbS5jOiBMaWtld2lzZS4KLQkqIGxpYmJmZC5jOiBEb24ndCBpbmNsdWRlIDxzeXMvdHlwZXMuaD4uCi0JKiBubG1jb2RlLmg6IERvbid0IGluY2x1ZGUgPHN0cmluZy5oPi4KLQkqIG9zZi1jb3JlLmM6IERvbid0IGluY2x1ZGUgPHN0cmluZy5oPiBvciA8c3RkaW8uaD4uCi0JKiBwdHJhY2UtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxzdGRpby5oPiwgPHN5cy90eXBlcy5oPiwKLQk8ZXJybm8uaD4sIG9yIDx1bmlzdGQuaD4uCi0JKiB0cmFkLWNvcmUuYzogRG9uJ3QgaW5jbHVkZSA8c3RkaW8uaD4gb3IgPHN5cy90eXBlcy5oPi4KLQotVGh1IE1heSAgNyAxMzoxMjo1MCAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlndXJlLmNvbTogSWYgdGhlIHZlcnNpb24gbnVtYmVyIGNhbiBub3QgYmUgZm91bmQgaW4KLQljb25maWd1cmUuaW4sIHNldCBpdCB0byAidW5rbm93biIgcmF0aGVyIHRoYW4gIjIuOC4xIi4KLQotV2VkIE1heSAgNiAwOTo0NjowNSAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19tYWNoKTogTmV3LgotCShfYmZkX21pcHNfZWxmX29iamVjdF9wKTogVXNlIGVsZl9taXBzX21hY2guCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFVzZSB0aGUgbmFtZXMKLQlvZiBtYWNoaW5lcywgcmF0aGVyIHRoYW4gdGhlIG51bWJlcnMuICBTZXQgYm90aCB0aGUgQVJDSAotCWFuZCBNQUNIIGluIGVfZmxhZ3MuICBIYW5kbGUgYSBmZXcgbW9yZSBzcGVjaWZpYyBtYWNoaW5lcy4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTWVyZ2UgYm90aAotCUVGX01JUFNfQVJDSCBhbmQgRUZfTUlQU19NQUNILgotCi1UdWUgTWF5ICA1IDIxOjAxOjUzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHN5bXMuYyAoYmZkX2lzX2xvY2FsX2xhYmVsKTogUmV2ZXJ0IGxhc3QgY2hhbmdlLgotCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiBEaXNjYXJkIGRlYnVnZ2luZyBzeW1ib2xzLgotCi1UdWUgTWF5ICA1IDIzOjM2OjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc29tLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCSogc29tLmg6IERvbid0IGluY2x1ZGUgc3lzZGVwLmguCi0KLVR1ZSBNYXkgIDUgMTg6Mjk6MjQgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGxpYmJmZC1pbi5oOiBSZW1vdmVkIGdldHRleHQgaW5jbHVkZXMgYW5kIGRlZmluZXMuCi0JKiBzeXNkZXAuaDogTW92ZWQgZ2V0dGV4dC1yZWxhdGVkIGluY2x1ZGVzIGFuZCBkZWZpbmVzIGhlcmUuCi0KLVR1ZSBNYXkgIDUgMTY6NDc6NTQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiBVc2UgYmZkX2lzX2xvY2FsX2xhYmVsIHJhdGhlciB0aGFuCi0JYW4gYWQtaG9jIHRlc3QuICBLaWxsIGJvZ3VzICNpZiAwIGNvZGUuCi0JKiBzeW1zLmMgKGJmZF9pc19sb2NhbF9sYWJlbCk6IENvbnNpZGVyIEJTRl9ERUJVR0dJTkcgc3ltYm9scyBsb2NhbC4KLQotTW9uIE1heSAgNCAxNjoxMDozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MpOiBEb24ndCB1c2UgdGhlIFBMVCBhZGRyZXNzCi0Jd2hlbiBnZW5lcmF0aW5nIGEgbm9ybWFsIGV4ZWN1dGFibGUgZm9yIGEgc3ltYm9sIGRlZmluZWQgaW4gYQotCXJlZ3VsYXIgZmlsZS4gIFdoZW4gY29weWluZyBhIHJlbG9jIGludG8gdGhlIG91dHB1dCBmaWxlLCBhZGp1c3QKLQl0aGUgYWRkZW5kIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLgotCi1Nb24gTWF5ICA0IDEwOjA4OjE4IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQtaW4uaCAoXyk6IERlZmluZSBhcyBkZ2V0dGV4dC4KLQotTW9uIE1heSAgNCAxMTowMjoyMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBDYXN0IHRvIGJmZF9zaWduZWRfdm1hLAotCW5vdCBzaWduZWQuCi0JKiBwZWljb2RlLmggKHBlX3NhdmVkX2NvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBVc2UgUEFSQU1TCi0Jd2hlbiBkZWNsYXJpbmcgcGFyYW1ldGVyIHR5cGVzLgotCShwZV9zYXZlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQotV2VkIEFwciAyOSAxNTozNTowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IElmIHdlIGluY2x1ZGUgYW55IEVMRiB0YXJnZXRzIGluIHRhcmdfZGVmdmVjIGFuZC9vcgotCXRhcmdfc2VsdmVjcywgdGhlbiBhZGQgdGhlIGdlbmVyaWMgRUxGIHRhcmdldHMgdG8gdGFyZ19zZWx2ZWNzLgotCSogZWxmMzItZ2VuLmMgKGR1bW15KTogTmV3IHN0YXRpYyBjb25zdCB2YXJpYWJsZS4KLQkoZWxmX2dlbmVyaWNfaW5mb190b19ob3d0byk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUgYXMgZWxmX2dlbmVyaWNfaW5mb190b19ob3d0by4KLQkoZWxmX2luZm9fdG9faG93dG9fcmVsKTogRGVmaW5lIGFzIGVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsLgotCSogZWxmNjQtZ2VuLmM6IFNhbWUgY2hhbmdlcyBhcyBlbGYzMi1nZW4uYy4KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogRm9yIHRoZSBnZW5lcmljIHRhcmdldCwgaWdub3JlIGEKLQlmYWlsdXJlIG9mIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2guICBGaXggaW5kZW50YXRpb24gYSBiaXQuCi0KLVR1ZSBBcHIgMjggMjA6MDU6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKFdJTjMyTElCQUREKTogQWRkIC1saW50bCBvbiBjeWd3aW4zMi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEFwciAyOCAxMjoxNjo1NyAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogIFVwZGF0ZSBPU1I1L1VuaXh3YXJlIHBhdHRlcm5zLgotCi1Nb24gQXByIDI3IDE4OjAyOjI0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQWxsb3cgZm9yIGhvbGVzCi0JYmV0d2VlbiBzZWN0aW9ucyBhZGRlZCBieSBhIGxpbmsgc2NyaXB0LgotCi1Nb24gQXByIDI3IDExOjQ5OjU1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi45LjQKLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogZWxmLmMgKGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdCk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1TYXQgQXByIDI1IDIwOjA3OjUzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvKTogUmVwbGFjZSBlbGZzeW0gd2l0aCBvdGhlci4KLQlDaGFuZ2UgYWxsIHVzZXJzLgotCi1TYXQgQXByIDI1IDE4OjI5OjA3IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvKTogQWRkIHRzZWMgJiBlbGZzeW0gbWVtYmVycy4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IEZpbGwgdGhlbSBpbi4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfb3B0X2NhbGwpOiBJbXBsZW1lbnQgbW9yZSB0aGFuIGEgc3R1Yi4KLQkoZWxmNjRfYWxwaGFfYWRkX3N5bWJvbF9ob29rKTogRG9uJ3Qgc2V0IFNFQ19MT0FEIG9yIGRlZmF1bHQKLQlhbGlnbm1lbnQgb24gLnNjb21tb24uCi0JKGVsZjY0X2FscGhhX21lcmdlX2dvdHMpOiBNZXJnZSB1c2UgY291bnRzIGFzIHdlbGwuCi0KLVNhdCBBcHIgMjUgMTQ6MDc6MjkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IFVzZSB0aGUgcHJvcGVyIHNlY3Rpb24KLQlmb3IgY2FsY3VsYXRpbmcgYSBsb2NhbCBzeW1ib2wncyBhZGRyZXNzLgotCShlbGY2NF9hbHBoYV9jYWxjX2dvdF9vZmZzZXRzKTogU2tpcCBlbnRyaWVzIHdpdGggMCB1c2UgY291bnQuCi0JU2V0IHRoZSAuZ290J3MgY29va2VkIHNpemUgYXMgd2VsbCBhcyB0aGUgcmF3IHNpemUuCi0KLUZyaSBBcHIgMjQgMDk6MTY6MDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQWRkCi0JaW50ZXJuYXRpb25hbGlzYXRpb24gb2YgcHJpbnRlZCBpbmZvcm1hdGlvbi4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZAotCWludGVybmF0aW9uYWxpc2F0aW9uIG9mIHByaW50ZWQgaW5mb3JtYXRpb24uCi0KLUZyaSBBcHIgMjQgMTI6MDk6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1zLmMgKHN0cnVjdCBpbmRleGVudHJ5KTogQ2hhbmdlIGRpcmVjdG9yeV9uYW1lLCBmaWxlX25hbWUsCi0JYW5kIGZ1bmN0aW9uX25hbWUgZmllbGRzIHRvIGNoYXIgKi4KLQkoc3RydWN0IHN0YWJfZmluZF9pbmZvKTogQ2hhbmdlIGNhY2hlZF9maWxlX25hbWUgZmllbGQgdG8gY2hhciAqLgotCi1UaHUgQXByIDIzIDA4OjEzOjA0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoZGlyX25hbWVzKTogQWRkIG1pc3NpbmcgTl8oKSBtYWNyb3MgdG8gZGlyX25hbWVzIGFycmF5LgotCi1XZWQgQXByIDIyIDEzOjA2OjE1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoTUtJTlNUQUxMRElSUyk6IERvbid0IGxvb2sgaW4gJCh0b3Bfc3JjZGlyKS4KLQotV2VkIEFwciAyMiAxNzo0ODo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWRhdGEtbG9jYWwpOiBNYWtlICQoaW5jbHVkZWRpcikuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIEFwciAyMiAxMzowNjoxNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC1pbi5oOiBVc2UgYGdldHRleHQnIGFuZCBub3QgYGRnZXR0ZXh0JyBmb3Igbm93LgotCi1XZWQgQXByIDIyIDEyOjUzOjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogQWRkIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGJmZC1pbjIuaDogUmVidWlsZCBmb3IgTmljaydzIGNoYW5nZXMuCi0KLVR1ZSBBcHIgMjEgMjM6MTE6NTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnKTogRml4IGxvc3NhZ2UgaW4gbGFzdAotCWNoYW5nZSB3cnQgbGVuZ3RoID09IG1heF9uYW1lbGVuLgotCi1UdWUgQXByIDIxIDIxOjE5OjM2IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAc2NyaWJibGVzLmN5Z251cy5jb20+Ci0KLQkqIE1hbnkgZmlsZXM6IEFkZGVkIGdldHRleHQgaW52b2NhdGlvbnMgYXJvdW5kIHVzZXItdmlzaWJsZQotCXN0cmluZ3MuCi0JKiBsaWJiZmQtaW4uaDogQWRkZWQgZ2V0dGV4dCBpbmNsdWRlcyBhbmQgZGVmaW5lcy4KLQkqIGFjY29uZmlnLmggKEVOQUJMRV9OTFMsIEhBVkVfQ0FUR0VUUywgSEFWRV9HRVRURVhULCBIQVZFX1NUUENQWSwKLQlIQVZFX0xDX01FU1NBR0VTKTogRGVmaW5lLgotCSogY29uZmlndXJlLmluOiBDYWxsIENZX0dOVV9HRVRURVhULiAgQ3JlYXRlIHBvL01ha2VmaWxlLmluIGFuZAotCXBvL01ha2VmaWxlLgotCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBBZGRlZCBwby4KLQkoUE9URklMRVMpOiBOZXcgbWFjcm8uCi0JKHBvL1BPVEZJTEVTLmluKTogTmV3IHRhcmdldC4KLQkoU09VUkNFX0hGSUxFUyk6IE5ldyBtYWNyby4KLQkoSEZJTEVTKTogVXNlIGl0LgotCSogcG8vTWFrZS1pbiwgcG8vUE9URklMRVMuaW4sIHBvL2JmZC5wb3Q6IE5ldyBmaWxlcy4KLQotVHVlIEFwciAyMSAxMzozODoxOCAxOTk4IFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWxmY29yZS5oIChiZmRfcHJzdGF0dXMpOiAgQ29weSBjb3JlX3Byc3RhdHVzIGZyb20gdGhlIGZpcnN0Ci0JTlRfUFJTVEFUVVMgbm90ZSBzZWN0aW9uIGVuY291bnRlcmVkLCBpdCBjb250YWlucyB0aGUgc3RhdHVzIG9mCi0JdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGhyZWFkIHdoZW4gdGhlIGNvcmUgZmlsZSB3YXMgd3JpdHRlbi4KLQotVHVlIEFwciAyMSAxMDowMDoxMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLmg6IEFkZCBleHRyYSBwYXJhbWV0ZXIgdG8KLQliZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gb3ZlcnJpZGVhYmxlIGZ1bmN0aW9uLgotCSogY29mZmxpbmsuYzogUGFzcyBleHRyYSBwYXJhbWV0ZXIgdG8KLQliZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gZnVuY3Rpb24uCi0JKiBiZmQtaW4uaDogQWRkIHByb3RvdHlwZXMgZm9yIGV4cG9ydGVkIEFSTSBpbnRlcndvcmtpbmcKLQlmdW5jdGlvbnMuCi0JKiBwZWljb2RlLmg6IEFSTSBzcGVjaWZpYyBjb2RlIHJlb3JnYW5pc2VkIHRvIGNvbmZvcm0gdG8gQkZECi0JY29kaW5nIGNvbnZlbnRpb25zLgotCSogY29mZmNvZGUuaDogQVJNIHNwZWNpZmljIGNvZGUgcmVvcmdhbmlzZWQgdG8gY29uZm9ybSB0byBCRkQKLQljb2RpbmcgY29udmVudGlvbnMuCi0JKiBjb2ZmLWFybS5jOiBDb2RlIHJlb3JnYW5pc2VkIHRvIGNvbmZvcm0gdG8gdGhlIEJGRCBjb2RpbmcKLQljb252ZW50aW9ucy4gIEdsb2JhbCB2YXJpYWJsZXMgaGF2ZSBiZWVuIG1vdmVkIGludG8gYW4gQVJNCi0Jc3BlY2lmaWMgaGFzaCB0YWJsZSBzdHJ1Y3R1cmUgYW5kIGEgbmV3IGZ1bmN0aW9uOgotCWJmZF9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nKCkgaGFzIGJlZW4gY3JlYXRlZCB3aGljaCBpcwotCWNhbGxlZCBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0cy4KLQotVHVlIEFwciAyMSAwMDoxMTo1MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcpOiBTaW1wbGlmeSBlbmQtb2YtbmFtZSB0ZXN0LgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9maW5kX3JlbG9jX2F0X29mcyk6IFJlbmFtZWQgZnJvbQotCWVsZjY0X2FscGhhX3JlbGF4X2ZpbmRfcmVsb2Nfb2ZzLiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkoZWxmNjRfYWxwaGFfYWRkX3N5bWJvbF9ob29rKTogUHV0IHNtYWxsIGNvbW1vbnMgaW4gLnNjb21tb24gbm90IC5zYnNzLgotCShlbGY2NF9hbHBoYV9zaXplX2dvdF9zZWN0aW9ucyk6IERvbid0IG1lcmdlIC5nb3Qgc2VjdGlvbnMgdHdpY2UuCi0KLVNhdCBBcHIgMTggMDE6MjE6MDQgMTk5OCAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZGVkIHNwYXJjODZ4IHN1cHBvcnQuCi0KLUZyaSBBcHIgMTcgMjI6Mjk6MDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEbyBub3QgY29tcGxhaW4gYWJvdXQKLQlhbiBvdXQgb2YgcmFuZ2UgcGMtcmVsYXRpdmUganVtcC9jYWxsIHRvIGFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbC4KLQotVGh1IEFwciAxNiAxMzo0OTowMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9kb19yZWxvY19ncGRpc3ApOiBEbyBhbGwgZ3BkaXNwCi0JY29tcGFyaXNvbnMgc2lnbmVkLgotCi1UaHUgQXByIDE2IDExOjQzOjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBJZiBhIHNsdXJwIHN1YnJvdXRpbmUgcmV0dXJucwotIAlhbiBlcnJvciBvdGhlciB0aGFuIGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCwgc2V0IHRoZSBlcnJvciB0bwotIAliZmRfZXJyb3Jfd3JvbmdfZm9ybWF0LgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKSBbU0VMRUNUX1ZFQ1Mgbm90IGRlZmluZWRdOiBBZGQKLQliZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYy4KLQotCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IElmIGFsbCB0aGUgcF9wYWRkciBmaWVsZHMgaW4gdGhlCi0JcHJvZ3JhbSBzZWdtZW50cyBhcmUgemVybywgZG9uJ3Qgc2V0IHBfcGFkZHJfdmFsaWQuCi0KLVdlZCBBcHIgMTUgMjI6MTU6MTYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYzogSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvZiByZWxheGF0aW9uIC0tCi0JKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIHVzZV9jb3VudCBtZW1iZXIuCi0JKGVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcyk6IEluaXRpYWxpemUgYW5kIGluY3JlbWVudCBpdC4KLQkoZWxmNjRfYWxwaGFfY2FuX21lcmdlX2dvdHMpOiBDaGVjayBpdCB3aGVuIGNvbnNpZGVyaW5nIG1lcmdpbmcuCi0JKGVsZjY0X2FscGhhX21lcmdlX2dvdHMpOiBEcm9wIGVudHJpZXMgd2l0aCB6ZXJvIHVzZS4KLQkoZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0c19mb3Jfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGVsZjY0X2FscGhhX2Fsd2F5c19zaXplX3NlY3Rpb25zKTogU3BsaXQgb3V0IGdvdCBzaXppbmcgLi4uCi0JKGVsZjY0X2FscGhhX3NpemVfZ290X3NlY3Rpb25zKTogLi4uIGhlcmUuICBOZXcgZnVuY3Rpb24uCi0JKGVsZjY0X2FscGhhX3JlbGF4X2ZpbmRfcmVsb2Nfb2ZzKTogTmV3IGZ1bmN0aW9uLgotCShlbGY2NF9hbHBoYV9yZWxheF93aXRoX2xpdHVzZSk6IExpa2V3aXNlLgotCShlbGY2NF9hbHBoYV9yZWxheF93aXRob3V0X2xpdHVzZSk6IExpa2V3aXNlLgotCShlbGY2NF9hbHBoYV9yZWxheF9vcHRfY2FsbCk6IExpa2V3aXNlLgotCShlbGY2NF9hbHBoYV9yZWxheF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZjY0X2FscGhhX2FkZF9zeW1ib2xfaG9vayk6IExpa2V3aXNlLgotCShlbGY2NF9hbHBoYV9ob3d0b190YWJsZSk6IEltcGxlbWVudCBHUFJFTEhJR0gvTE9XICYgSU1NRURfR1BfMTYuCi0JKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X2JmZF9yZWxheF9zZWN0aW9uKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KLQotV2VkIEFwciAxNSAxNjowODo0NiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogVXNlIG5ldyBFTV9TUEFSQ1Y5IHN5bWJvbC4KLQkqIGVsZjY0LXNwYXJjLmMgKEVMRl9NQUNISU5FX0NPREUpOiBMaWtld2lzZS4KLQkoRUxGX01BQ0hJTkVfQUxUMSk6IE5ldy4gIFNldCB0byBFTV9PTERfU1BBUkM2NC4KLQotV2VkIEFwciAxNSAxMTozNDozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIC1sa2VybmVsMzIgdG8gV0lOMzJMSUJBREQgb24gY3lnd2luMzIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBBcHIgMTMgMTY6NDY6MjcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGliYmZkX2xhX0xJQkFERCk6IEFkZCBAV0lOMzJMSUJBRERALgotCShsaWJiZmRfbGFfTERGTEFHUyk6IEFkZCBAV0lOMzJMREZMQUdTQC4KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIGFuZCBzdWJzdGl0dXRlIFdJTjMyTERGTEFHUyBhbmQKLQlXSU4zMkxJQkFERC4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBcHIgMTAgMTM6NDQ6MjcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE1vdmUgYSBQRSBDT01EQVQgc3ltYm9sCi0JYmVmb3JlIGFueSBvdGhlciBzeW1ib2xzIGluIHRoZSBzYW1lIHNlY3Rpb24uCi0KLVdlZCBBcHIgIDggMTQ6NTA6MjMgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGMqLSotKik6IFJlbW92ZSBQb3dlclBDIE5UIHN1cHBvcnQgZnJvbSBFTEYKLQlzeXN0ZW1zLgotCi1UdWUgQXByICA3IDE2OjI1OjMxIDE5OTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBkd2FyZjIuYyAoY29tcF91bml0KTogTW92ZSBpdCBlYXJsaWVyIGluIHRoZSBzb3VyY2UuIEFkZAotCWFkZHJfc2l6ZS4KLQkocmVhZF9hZGRyZXNzKTogUmVwbGFjZSAnYmRmKicgYXJndW1lbnQgd2l0aCAnY29tcF91bml0KicgYXJndW1lbnQuCi0gICAgICAgIFVzZSBhZGRyX3NpemUgZm9yIGFkZHJlc3Mgc2l6ZSwgcmF0aGVyIHRoYW4gc2l6ZW9mKGJmZF92bWEpLgotCShyZWFkX2F0dHJpYnV0ZSk6IFJlcGxhY2UgYmRmKiBhcmd1bWVudCB3aXRoICdjb21wX3VuaXQqJyBhcmd1bWVudC4KLQlGaXggY2FsbCB0byByZWFkX2FkZHJlc3MuCi0JKGRlY29kZV9saW5lX2luZm8pOiBSZXBsYWNlIGJkZiogYXJndW1lbnQgd2l0aCAnY29tcF91bml0KicgYXJndW1lbnQuCi0JU2NyYXAgb3RoZXIgdW5uZWVkZWQgYXJndW1lbnRzLiAgRml4IGNhbGwgdG8gcmVhZF9hZGRyZXNzLgotCShzY2FuX3VuaXRfZm9yX2Z1bmN0aW9ucyk6IEZpeCBjYWxsIHRvIHJlYWRfYXR0cmlidXRlLgotCShwYXJzZV9jb21wX3VuaXQpOiBXZSBub3cgaGFuZGxlIG1vcmUgdmFsdWVzIGZvciBhZGRyX3NpemUuCi0JU2V0IGFkZHJfc2l6ZSBpbiB1bml0LiAgRml4IGNhbGwgdG8gcmVhZF9hdHRyaWJ1dGUgYW5kCi0JZGVjb2RlX2xpbmVfaW5mby4KLQotVHVlIEFwciAgNyAxNTo0NDo0NyAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBkd2FyZjIuYyAocGFyc2VfY29tcF91bml0KTogRHJvcCB1c2Ugb2YgdW5pdC0+bmFtZSB3aGVuIGl0IGlzIG51bGwuCi0KLVR1ZSBBcHIgIDcgMTI6MzU6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zY2FuKTogQWRkIG02OGsgY2FzZXMgYmFjayB0byBkZWZhdWx0Ci0Jc3dpdGNoLCByZXZlcnRpbmcgcGF0Y2ggb2YgTWFyY2ggMjUsIHNpbmNlIElFRUUgc3VwcG9ydCBkZXBlbmRzCi0JdXBvbiB0aGVtLgotCi1Nb24gQXByICA2IDE0OjA2OjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotU3VuIEFwciAgNSAxNjoyMTo0NCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IEZpeCBjb21wdXRhdGlvbiBvZgotCXNvbV9vZmZzZXQgd2hlbiB3ZSBoYXZlIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUuCi0KLVN1biBBcHIgIDUgMTY6MDQ6MzkgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAoc3RhbXAtbGliKTogQ2hlY2sgdGhhdCAubGlicy9saWJiZmQuYSBleGlzdHMgYmVmb3JlCi0JdHJ5aW5nIHRvIGNvcHkgaXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEFwciAgMyAxMTowOTo0MiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBHZW5lcmF0ZSBzZWN0aW9uCi0Jc3ltYm9scyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKGVsZl9tNjhrX2FkanVzdF9keW5pbmR4KTogTmV3IGZ1bmN0aW9uLCB1c2VkIGJ5IGFib3ZlIGNvZGUuCi0JKGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogSW5pdGlhbGl6ZSB0aGUgc2VjdGlvbgotCXN5bWJvbHMuCi0JKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGFuZ2UgYWJvcnQgdG8gQkZEX0FTU0VSVC4KLQotV2VkIEFwciAgMSAxNjowNDowMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChpbl9yZWxvY19wKTogVXNlIEFSTV9SVkEzMiBpbiBwbGFjZSBvZiBjb25zdGFudAotCXZhbHVlIDExLgotCi1XZWQgQXByICAxIDEzOjM2OjU4IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24sIGNhc2UgUl82OEtfUExUKk8pOiBGaXgKLQlhc3NlcnRpb24uCi0KLVR1ZSBNYXIgMzEgMDA6MTI6MTIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBDb3JyZWN0bHkgaGFuZGxlCi0JYWJzb2x1dGUgc3ltYm9scy4KLQotTW9uIE1hciAzMCAxMjo0NjoxNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IHZlcnNpb24gdG8gMi45LjEuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOS4KLQotTW9uIE1hciAzMCAxMjoyMDo1MCAxOTk4ICBCcmVudCBCYWNjYWxhICA8YmFjY2FsYUBmcmVlc29mdC5vcmc+Ci0KLQkqIHN5bXMuYyAoRU5BQkxFX0NBQ0hJTkcpOiBEZWZpbmUuCi0JKHN0cnVjdCBpbmRleGVudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3Qgc3RhYl9jYWNoZSk6IFJlbW92ZS4KLQkoY21waW5kZXhlbnRyeSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyk6IEFkZCBuZXcgZmllbGRzOiBpbmRleHRhYmxlLAotCWluZGV4dGFibGVzaXplLCBjYWNoZWRfaW5kZXhlbnRyeSwgY2FjaGVkX29mZnNldCwgY2FjaGVkX3N0YWIsIGFuZAotCWNhY2hlZF9maWxlX25hbWUuICBSZW1vdmUgZmllbGRzOiBmaWxlX2NhY2hlLCBmdW5jdGlvbl9jYWNoZSwgYW5kCi0JbGluZV9jYWNoZS4KLQkoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBSZXdyaXRlIHRvIGJ1aWxkIGEgc29ydGVkCi0JaW5kZXggdGFibGUgYW5kIHNlYXJjaCBpdC4KLQotTW9uIE1hciAzMCAxMDozOTozNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogQ2FsbAotCWNvcHlfcHJpdmF0ZV9iZmRfZGF0YSBvbmNlIHdlJ3ZlIHNlZW4gdGhlIGxhc3QgU0VDX0FMTE9DIHNlY3Rpb24uCi0KLQkqIGNwdS1taXBzLmM6IFJlbW92ZSB0cmFpbGluZyBjb21tYSBhdCBlbmQgb2YgZW51bWVyYXRpb24gbGlzdC4KLQotU2F0IE1hciAyOCAxNjozMzowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmM6IERlZmluZSBhbGwgZ2xvYmFsbHkgdmlzaWJsZSB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucwotCW9ubHkgd2hlbiBDT0ZGX1dJVEhfUEUgaXMgbm90IGRlZmluZWQuCi0JKiBjb25maWd1cmUuaW4gKGFybXBlX2xpdHRsZV92ZWMsIGFybXBlX2JpZ192ZWMpOiBBZGQKLQljb2ZmLWFybS5sby4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE1hciAyNyAxNjowNjowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGaXggc29tZSBnY2MgLVdhbGwgd2FybmluZ3M6Ci0JKiBhb3V0LWFybS5jIChNWShmaXhfcGNyZWxfMjYpKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogYXJjaGl2ZS5jIChfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnKTogTGlrZXdpc2UuCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zY2FuKTogTGlrZXdpc2UuCi0JKiBiZmQuYyAoYmZkX3NjYW5fdm1hKTogTGlrZXdpc2UuCi0JKiBiaW5hcnkuYyAobWFuZ2xlX25hbWUpOiBMaWtld2lzZQotCSogY29mZi1hcm0uYyAoYW91dGFybV9maXhfcGNyZWxfMjYpOiBMaWtld2lzZS4KLQkqIGNvZmYtc2guYyAoc2hfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1zdGdvMzIuYyAoY3JlYXRlX2dvMzJfc3R1Yik6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9saW5lX3RhYmxlKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3dyaXRlX2FybWFwKTogTGlrZXdpc2UuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IExpa2V3aXNlLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IExpa2V3aXNlLgotCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIHBwY2Jvb3QuYyAocHBjYm9vdF9vYmplY3RfcCk6IExpa2V3aXNlLgotCShtYW5nbGVfbmFtZSk6IExpa2V3aXNlLgotCSogcmlzY2l4LmMgKHJpc2NpeF9maXhfcGNyZWxfMjYpOiBMaWtld2lzZS4KLQkqIHNyZWMuYyAoc3JlY19zY2FuKTogTGlrZXdpc2UuCi0JKiBzdGFicy5jIChfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGFvdXQtbnMzMmsuYyAoX2JmZF9uczMya19yZWxvY2F0ZV9jb250ZW50cyk6IEFkZCBkZWZhdWx0IGNhc2UgdG8KLQlzd2l0Y2guICBEZWNsYXJlIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzLgotCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfc2Nhbik6IEFkZCBicmFjZXMgdG8gYXZvaWQgYW1iaWd1b3VzIGlmCi0Jd2FybmluZy4KLQkqIGVsZi5jIChlbGZfc29ydF9zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogY29mZi1hcm0uYyAoY29mZl90aHVtYl9wY3JlbF9jb21tb24pOiBJbml0aWFsaXplIHJlbG9jYXRpb24uCi0JQWRkIGRlZmF1bHQgY2FzZXMgdG8gc3dpdGNoZXMuCi0JKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlcy4KLQlBbHdheXMgc2V0IHJzdGF0LgotCShjb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBDaGFuZ2UgZmxhZyB2YXJpYWJsZSB0byB0eXBlCi0JZmxhZ3dvcmQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogSW5pdGlhbGl6ZSB1c2VfbG8uCi0JKiBjb2ZmLXBwYy5jIChwcGNfcmVjb3JkX3RvY19lbnRyeSk6IENoYW5nZSBpIHRvIHVuc2lnbmVkIGludC4KLQkoZHVtcF90b2MpOiBDaGFuZ2UgY2F0IHRvIGNvbnN0LCBhbmQgaW5pdGlhbGl6ZSBpdC4KLQkqIGNvZmYtc2guYyAoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogSW5pdGlhbGl6ZSBzdGFydCBhbmQgdm9mZi4KLQkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBMaWtld2lzZS4KLQkoc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJbml0aWFsaXplIHJfc3ltbmR4LgotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBPbmx5IGRlY2xhcmUKLQlvbGRfc29mYXIgaWYgQUxJR05fU0VDVElPTlNfSU5fRklMRS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJbml0aWFsaXplIGNzeW0uCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcG9pbnRlcml6ZV9hdXgpOiBNYWtlIHR5cGUgYW5kIGNsYXNzIHVuc2lnbmVkLgotCSogY3B1LW5zMzJrLmMgKF9iZmRfbnMzMmtfZ2V0X2Rpc3BsYWNlbWVudCk6IEFkZCBkZWZhdWx0IGNhc2UgdG8KLQlzd2l0Y2guCi0JKiBkd2FyZjIuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkocmVhZF8yX3NpZ25lZF9ieXRlcywgcmVhZF80X3NpZ25lZF9ieXRlcyk6IENvbW1lbnQgb3V0LgotCShkZWNvZGVfbGluZV9pbmZvKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZXMuCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX3NkYTE2X3JlbG9jKTogTGlrZXdpc2UuCi0JKG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfc3RvcmVfYWRkZW5kX2luX2luc24pOiBMaWtld2lzZS4KLQkodjg1MF9lbGZfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGVsZi1iZmQuaCAoZWxmX2xpbmtlcl9zZWN0aW9uX3QpOiBNYWtlIGFsaWdubWVudCB1bnNpZ25lZC4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBNYWtlIGN2ZXJkZWZzIGFuZCBjdmVycmVmcyB1bnNpZ25lZC4KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQWx3YXlzIHNldCBhZGp1c3QuCi0JKiBlbGYzMi1kMzB2LmMgKGJmZF9lbGZfZDMwdl9yZWxvYyk6IEluaXRpYWxpemUgdG1wX2FkZHIuICBGdWxseQotCXBhcmVudGhlc2l6ZSBleHByZXNzaW9uLgotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWx3YXlzIGluaXRpYWxpemUgaC4KLQkobTMycl9lbGZfb2JqZWN0X3ApOiBSZXR1cm4gYSB2YWx1ZS4KLQkobTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZSBmcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIGxhc3QuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogSW5pdGlhbGl6ZSBsYXN0IGFuZCBkaW5keC4KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfb2JqZWN0X3ApOiBSZXR1cm4gYSB2YWx1ZS4KLQkodjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZSBmcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGFuZ2Ugc3ltY291bnQgYW5kIGkgdG8KLQl1bnNpZ25lZCBsb25nLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDaGFuZ2UgdmVybnVtIHRvCi0JdW5zaWduZWQgaW50LCBhbmQgaW5pdGlhbGl6ZSBpdC4gIENoYW5nZSBmcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQ2FzdCAtMSB0byBiZmRfc2l6ZV90eXBlCi0Jd2hlbiBzZXR0aW5nIG9yIGNvbXBhcmluZyB0byBzb25hbWVfaW5keC4KLQkoZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogQ2hhbmdlIG51bV9zeW1ib2xzIHRvCi0JdW5zaWduZWQgaW50LgotCSogbGliY29mZi1pbi5oIChjb2ZmX2RhdGFfdHlwZSk6IENoYW5nZSBmbGFncyB0byBmbGFnd29yZC4KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBJbml0aWFsaXplIGlkeC4gIENoYW5nZSBqIHRvCi0JYmZkX3NpemVfdHlwZS4gIEluaXRpYWxpemUgaGludF9tZW1iZXIuICBSZW1vdmUgdXNlbGVzcyB0ZXN0IHRvCi0JdGltZV9zdGFtcC4KLQkocGVfcHJpbnRfZWRhdGEpOiBDaGFuZ2UgbnVtX2Z1bmN0aW9ucyBhbmQgbnVtX25hbWVzIGluIHN0cnVjdAotCUVEVF90eXBlIHRvIHVuc2lnbmVkIGxvbmcuICBSZW1vdmUgY2FzdC4gIENoYW5nZSBmcHJpbnRmIGZvcm1hdAotCXN0cmluZy4KLQkqIHBwY2Jvb3QuYyAocHBjYm9vdF9vYmplY3RfcCk6IENoYW5nZSBpIHRvIHNpemVfdC4KLQkqIHJlbG9jLmMgKGJmZF9nZXRfcmVsb2Nfc2l6ZSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byB1bnNpZ25lZAotCWludC4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogQ2hhbmdlIHNocmlua3MgdG8KLQlpbnQgKi4gIFVwZGF0ZSB1c2VzLiAgQ2hhbmdlIGogdG8gbG9uZy4KLQkqIGJmZC1pbjIuaCwgbGliY29mZi5oOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDI3IDEwOjEwOjQ2IDE5OTggIENhdGhlcmluZSBNb29yZSA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyBSZW1vdmUgZGVmaW5pdGlvbiBvZiBVU0VfUkVMLgotCSh2ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbGEpOiBOZXcgZnVuY3Rpb24uCi0JKHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6ICBSZW5hbWVkIGZyb20KLQl2ODUwX2VsZl9zdG9yZV9hZGRlbmRfaW5faW5zbi4gIFJlbW92ZWQgcmVwbGFjZSBhcmd1bWVudC4KLQkodjg1MF9lbGZfcmVsb2MpOiBzdG9yZSB0aGUgcmVsb2NhdGlvbiBpbiB0aGUgYWRkZW5kIGZpZWxkIGluc3RlYWQKLQlvZiB0aGUgaW5zbi4KLQkodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6ICBOb3cgY2FsbHMKLQl2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24uCi0JKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiAgUmVtb3ZlIGNvZGUgdG8gZ2VuZXJhdGUgUkVMCi0JcmVsb2NhdGlvbnMuCi0KLVRodSBNYXIgMjYgMTM6MzI6MTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBTZXQgdGhlIHR5cGUgYW5kIHN0b3JhZ2UKLQljbGFzcyBpbiB0aGUgbmF0aXZlIHN5bWJvbCBpbmZvcm1hdGlvbiBhbGxvY2F0ZWQgZm9yIGEgbmV3IHNlY3Rpb24KLQlzeW1ib2wuCi0KLVRodSBNYXIgMjYgMTA6MTM6NDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oOiBDaGFpbiB0b2dldGhlciBjYWxscyB0bwotCWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBhbmQKLQljb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhLgotCi0JKiBjb2ZmLWFybS5jOiBBZGQgcHJvdG90eXBlcyBmb3IKLQljb2ZmX2FybV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBhbmQKLQljb2ZmX2FybV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhLgotCi1XZWQgTWFyIDI1IDE1OjQ1OjU1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IFNldCBwcml2YXRlIGZhbGdzIGV2ZW4gZm9yIGEgUEUKLQlidWlsZC4KLQotCSogcGVpY29kZS5oOiBDYWxsIGFybS1jb2ZmIHByaXZhdGUgZGF0YSBmdW5jdGlvbnMgYWZ0ZXIgaGFuZGxpbmcKLQlwZSBwcml2YXRlIGRhdGEuCi0KLQkqIGNvZmYtYXJtLmM6IFR1cm4gc3RhdGljcyBpbnRvIGdsb2JhbHMgc28gdGhhdCB0aGV5IGNhbiBiZSBzaGFyZWQKLQlib3RoIHBlIGFuZCBwZWkgYmFja2VuZHMuCi0KLVdlZCBNYXIgMjUgMTU6MTk6MzggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0ZjEuaCAoc3Vub3Nfc2V0X2FyY2hfbWFjaCk6IFVzZSBiZmRfbWFjaF9tNjgqIHJhdGhlciB0aGFuCi0JcGxhaW4gbnVtYmVycy4KLQkoc3Vub3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBMaWtld2lzZS4KLQotV2VkIE1hciAyNSAxMzo1OToyNCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfbTY4Kik6IEFkZCBkZWZpbml0aW9ucyBmb3IgdmFyaW91cyBtNjhrCi0JdmFyaWFudHMuCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBSZW1vdmUgbTY4ayBzcGVjaWFsIGNhc2VzLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbWlwc2JzZC5jIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogVXNlIGJmZF9tYWNoX202OCogcmF0aGVyCi0JdGhhbiBwbGFpbiBudW1iZXJzLgotCSogc3BhcmNseW54LmMgKE5BTUUobHlueCxzZXRfYXJjaF9tYWNoKSk6IExpa2V3aXNlLgotCSogY3B1LW02OGsuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IExpa2V3aXNlLiAgQWRkIGVudHJ5IGZvcgotCW02OGs6NjgwMDAuCi0JKGJmZF9tNjhrX2FyY2gpOiBTZXQgbWFjaCBmaWVsZCB0byB6ZXJvIHRvIHNpZ25hbCBubyBleHBsaWNpdAotCXNlbGVjdGlvbiwgY2hhbmdlIHByaW50YWJsZV9uYW1lIHRvIGp1c3QgIm02OGsiIGFuZCBtYWtlIHRoYXQgdGhlCi0JZGVmYXVsdCBpbnN0ZWFkIG9mIG02OGs6NjgwMjAuCi0KLQkqIGFvdXQtdGljMzAuYyAoTkFNRSk6IERlZmluZSB0aGlzIHRvIGF2b2lkIG11bHRpcGxlIGRlZmluaXRpb25zCi0JZnJvbSBhb3V0eC5oLgotCShNWV9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZSBhcyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0JcmF0aGVyIHRoYW4gTkFNRShhb3V0LGdldF9zZWN0aW9uX2NvbnRlbnRzKS4KLQotCSogZWxmLW0xMDMwMC5jIChlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBGaXggY2FzdC4KLQotCSogZXZheC1hbHBoYS5jIChldmF4X3NldF9hcmNoX21hY2gpOiBPbmx5IGFjY2VwdCBiZmRfYXJjaF9hbHBoYQotCWFuZCBjYWxsIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggdG8gZG8gdGhlIHJlYWwgd29yay4KLQotV2VkIE1hciAyNSAxMDo0MTozNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBib3V0LmMgKEJBTFgpOiBJbmNsdWRlIHJldHVybiByZWdpc3RlciBnMTQgYXMgcGFydCBvZiB0aGUgaW5zbi4KLQkoQkFMWF9NQVNLKTogTmV3LgotCShjYWxsanhfY2FsbGJhY2spOiBVc2UgaXQuCi0KLVdlZCBNYXIgMjUgMTE6MTk6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaCAoQkZEX0FMSUdOKTogQ2FzdCB0aGlzIHBhcmFtZXRlciB0byBiZmRfdm1hLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIGVsZi1tMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSk6IENoYW5nZQotCWJ5dGVfY291bnQgdG8gdW5zaWduZWQgaW50LgotCShtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogSW5pdGlhbGl6ZSBpbnRlcm5hbF9yZWxvY3MuICBSZW1vdmUKLQl1bnVzZWQgbG9jYWwgdmFyaWFibGVzLgotCi0JKiBldmF4LWFscGhhLmMgKGV2YXhfY2xvc2VfYW5kX2NsZWFudXApOiBSZW1vdmUgdW51c2VkIGxvY2FsCi0JdmFyaWFibGVzIGVyIGFuZCBlcjEuCi0KLQkqIGNwdS12ODUwLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShzY2FuKTogQ2FzZSBpc2RpZ2l0IGFyZ3VtZW50IHRvIHVuc2lnbmVkIGNoYXIuCi0KLQlGcm9tIFlhbiBNZXJvdGggPFlBTi5NRVJPVEhAc3QuY29tPjoKLQkqIGloZXguYyAoaWhleF9zY2FuKTogQWRkIGV4dGJhc2UgdmFyaWFibGUgc28gdGhhdCBnZXR0aW5nIGFuCi0gCWV4dGVuZGVkIGxpbmVhciBhZGRyZXNzIHJlY29yZCBkb2VzIG5vdCBpZ25vcmUgYW55IHByZXZpb3VzCi0gCWV4dGVuZGVkIGFkZHJlc3MuCi0JKGloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogV2hlbiB3cml0aW5nIG91dCBhbiBleHRlbmRlZCBsaW5lYXIKLSAJYWRkcmVzcyByZWNvcmQsIHplcm8gb3V0IGFueSBwcmV2aW91cyBleHRlbmRlZCBhZGRyZXNzLgotCi1UdWUgTWFyIDI0IDE2OjA5OjQzIDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogaWVlZS5jIChkb19vbmUpOiBDaGVjayBzZWN0aW9uIGJlZm9yZSBkZXJlZmVyZW5jaW5nIGl0LgotCShpZWVlX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlIHdpdGggc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHIuCi0JKGllZWVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogTGlrZXdpc2Ugd2l0aCBhYmZkLT5teV9hcmNoaXZlLgotCi1Nb24gTWFyIDIzIDE4OjUxOjQ3IDE5OTggIEpvZWwgU2hlcnJpbGwgIDxqb2VsQE9BUmNvcnAuY29tPgotCi0JKiBjb25maWcuYmZkOiAoc2gqLSotcnRlbXMqKTogU3dpdGNoZWQgZnJvbSBFTEYgdG8gQ09GRi4KLQotTW9uIE1hciAyMyAxNDoyMzozNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jOiBBZGQgaW50ZXJ3b3JraW5nIGZ1bmN0aW9ucyB0byBwZSBiYWNrZW5kcy4KLQotRnJpIE1hciAyMCAxODo0NzoyMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEFNX0RJU0FCTEVfU0hBUkVELgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbGlidG9vbCAxLjIuCi0KLUZyaSBNYXIgMjAgMTE6MjU6NDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IEJldHRlciBlcnJvciBtZXNzYWdlcwotCXdoZW4gaW50ZXJvd3JraW5nIGNvbmZsdWN0cyBvY2N1ci4gIENvdXJ0ZXN5IG9mIEpvbmF0aGFuIFdhbHRvbgotCWFuZCBUb255IFRob21wc29uLgotCShhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byk6IEZpeGVkIGJpdHNpemUgZmllbGRzIG9mIHJpZ2h0c2hpZnRlZAotCXJlbG9jYXRpb25zLiAgUGF0Y2ggY291cnRlc3kgb2YgSm9uYXRoYW4gV2FsdG9uIGFuZCBUb255Ci0JVGhvbXBzb24uCi0KLUZyaSBNYXIgMjAgMDI6MjY6NDMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogUmV2ZXJ0Ci0JcGFydCBvZiBGZWIgMjIgY2hhbmdlIGNvbnRyb2xpbmcgd2hlbiB0byBvdmVycmlkZSB0aGUgZXhpc3RpbmcKLQlzeW1ib2wgd2l0aCB0aGUgLnBsdCBlbnRyeS4KLQotV2VkIE1hciAxOCAwOToyNjoyNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkICh0YXJnX2NwdSk6IEFkZCB0aHVtYi1wZSB0YXJnZXQuCi0KLQkqIGNvZmZjb2RlLmggKE9USEVSX0dMT0JBTF9DTEFTUyk6IFN1cHBvcnQgdGh1bWIgZXh0ZXJuYWwKLQlmdW5jdGlvbnMgaW4gUEUgYnVpbGQuCi0KLVN1biBNYXIgIDggMjM6Mzc6MjYgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoc3BhcmNsaXRlLSotZWxmKik6IEFkZGVkLgotCi1Nb24gRmViIDIzIDE5OjMxOjE5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgZWxmLmxvIHRvIGVsZiBzaGVsbCB2YXJpYWJsZS4KLQkqIE1ha2VmaWxlLmFtIChCRkRfTElCUyk6IFJlbW92ZSBlbGYubG8uCi0JKEJGRF9MSUJTX0NGSUxFUyk6IFJlbW92ZSBlbGYuYy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmLmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmLmMuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk4LTAyLTIzIDE1OjUzICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBBIHBjLXJlbGF0aXZlCi0JcmVsb2NhdGlvbiBhZ2FpbnN0IGEgbm93LWxvY2FsIHN5bWJvbCBzaG91bGQgbm90IGhhdmUgYSBkeW5hbWljCi0JcmVsb2NhdGlvbi4KLQotTW9uIEZlYiAyMyAxNjoxNzowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2ZpbGVoZHJfaW4pOiBEb24ndCBzZXQgQkZEIGZsYWcgSEFTX1NZTVMgaW4KLQlDT0ZGIGZpbGVoZHIgZmxhZ3MuCi0JKHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBQcmludCBQRSBmbGFncy4gIEZyb20gTWlrZXkKLQk8amVmZmRiQG5ldHpvbmUuY29tPi4KLQotU3VuIEZlYiAyMiAyMDozOTowMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCBjcmVhdGUKLSAJYSBwbHQgZW50cnkgd2hlbiB3ZSBjYW4gZGV0ZXJtaW5lIHRoYXQgd2UgYXV0aG9yaXRhdGl2ZWx5IGRlZmluZQotIAl0aGUgc3ltYm9sLgotCi1TdW4gRmViIDIyIDIwOjMzOjA1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQ09SRUZJTEUgc2VsZWN0aW9uKTogUmVtb3ZlIHNwYXJjLSotbGludXgqLiAgVGhleQotCWRvbid0IGFjdHVhbGx5IHVzZSB0cmFkLWNvcmUsIGJ1dCBhIFN1bk9TLXN0eWxlIGNvcmUgZmlsZSBoYW5kbGVkCi0JYnkgZ2RiIGRpcmVjdGx5LgotCSogaG9zdHMvc3BhcmNsaW51eC5oOiBSZW1vdmUuCi0KLVdlZCBGZWIgMTggMTU6MzE6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogSWYgdGhlcmUgaXMgbm8gLmlkYXRhIHNlY3Rpb24sIGxvb2sKLQlmb3IgdGhlIGltcG9ydCB0YWJsZXMgaW4gc29tZSBvdGhlciBzZWN0aW9uLiAgTWFrZSB0aGUgaW5pdGlhbAotCWxhYmVsIGxpbmUgdXAgYmV0dGVyIHdpdGggdGhlIGRhdGEuICBQcmludCB0aGUgaW1wb3J0IGFkZHJlc3MKLQl0YWJsZSBldmVuIGlmIHRoZXJlIGlzIG5vIGltcG9ydCBuYW1lIHRhYmxlLiAgSWYgdGhlIGltcG9ydAotCWFkZHJlc3MgdGFibGUgaG9sZHMgYWN0dWFsIGFkZHJlc3NlcywgcHJpbnQgdGhlbS4KLQotVHVlIEZlYiAxNyAxMjo1ODozNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC5jIChiZmRfc2Vlayk6IElmIGZzZWVrIGZhaWxzLCBzYXZlIGVycm5vIGFyb3VuZCBjYWxsIHRvCi0JYmZkX3RlbGwuICBJZiBlcnJubyBpcyBFSU5WQUwsIHNldCBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQsIG5vdAotCWJmZF9lcnJvcl9zeXN0ZW1fY2FsbC4KLQotRnJpIEZlYiAxMyAxMzoxMTozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBVVRPTUFLRV9PUFRJT05TKTogRGVmaW5lLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGF1dG9tYWtlIDEuMmUuCi0KLQlGcm9tIEguSi4gTHUgPGhqbEBnbnUub3JnPjoKLQkqIE1ha2VmaWxlLmFtIChsaWJiZmRfbGFfTERGTEFHUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UaHUgRmViIDEyIDE3OjMxOjExIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCU5ldEJTRCBwYXRjaGVzIGZyb20gR29yZG9uIFcuIFJvc3MgPGd3ckBtYy5jb20+OgotCSogbmV0YnNkLmggKE1BQ0hUWVBFX09LKTogRGVmaW5lLgotCShNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogVXNlIERFRkFVTFRfQVJDSCBhbmQgREVGQVVMVF9NSUQgd2hlbgotCWNhbGxpbmcgTl9TRVRfTUFDSFRZUEUsIHJhdGhlciB0aGFuIGhhdmluZyBhIHN3aXRjaC4KLQkqIGxpYmFvdXQuaCAoZW51bSBtYWNoaW5lX3R5cGUpOiBBZGQgTV9QTUFYX05FVEJTRCwgTV9WQVhfTkVUQlNELAotCWFuZCBNX0FMUEhBX05FVEJTRC4KLQkqIGkzODZuZXRic2QuYyAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCi0JKERFRkFVTFRfTUlEKTogRGVmaW5lLgotCSogbTY4azRrbmV0YnNkLmMgKFNFR01FTlRfU0laRSk6IERvbid0IGRlZmluZS4KLQkoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCi0JKERFRkFVTFRfTUlEKTogRGVmaW5lLgotCSogbTY4a25ldGJzZC5jOiAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCi0JKERFRkFVTFRfTUlEKTogRGVmaW5lLgotCSogbnMzMmtuZXRic2QuYyAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCi0JKERFRkFVTFRfTUlEKTogRGVmaW5lLgotCSogc3BhcmNuZXRic2QuYyAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCi0JKERFRkFVTFRfTUlEKTogRGVmaW5lLgotCi0JTmV0QlNEIHBhdGNoZXMgZnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46Ci0JKiB2YXhuZXRic2QuYzogTmV3IGZpbGUuCi0JKiBuZXRic2QtY29yZS5jOiBDbGVhbiB1cC4gIFJlbW92ZSB1bnVzZWQgbWFjcm9zLiAgVXNlIG5ldGJzZAotCXJhdGhlciB0aGFuIG5ldGJzZF9jb3JlLgotCSogdGFyZ2V0cy5jICh2YXhuZXRic2RfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgdmF4bmV0YnNkX3ZlYy4gIElmIE5FVEJTRF9DT1JFIGlzCi0JZGVmaW5lZCwgYWRkIG5ldGJzZF9jb3JlX3ZlYy4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IENPUkVGSUxFIGZvciBhbHBoYSotKi1uZXRic2QqIGFuZAotCXBvd2VycGMtKi1uZXRic2QqIHRvIG5ldGJzZC1jb3JlLmxvLiAgSWYgQ09SRUZJTEUgaXMKLQluZXRic2QtY29yZS5sbywgc2V0IENPUkVGTEFHIHRvIC1ETkVUQlNEX0NPUkUuCi0JKiBjb25maWcuYmZkIChhbHBoYSotKi1uZXRic2QqKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHZheG5ldGJzZC5sby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIHZheG5ldGJzZC5jLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmhvc3Q6IFJlbW92ZSB0aGUgb2xkIHNoYXJlZCBsaWJyYXJ5IGJ1aWxkIHN0dWZmLiAgV2UKLQlub3cgdXNlIGxpYnRvb2wgaW5zdGVhZC4KLQotV2VkIEZlYiAxMSAxNzoxMzowOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0ZWtoZXguYyAodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgdGVraGV4X2luaXQuCi0KLVR1ZSBGZWIgMTAgMTk6MjM6MjggMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb25maWd1cmUuaW46IFRha2Ugc3RhYi1zeW1zLmxvIG91dCBvZiBzcGFyY2xpbnV4X3ZlYyBsaXN0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgRmViIDEwIDE1OjE2OjM4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0JKiBlbGYzMi12ODUwLmMgKHJlbWVtYmVyX2hpMTZzX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShmaW5kX3JlbWVtYmVyZWRfaGkxNnNfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKHY4NTBfZWxmX3N0b3JlX2FkZGVuZF9pbl9pbnNuKTogVXNlIHRoZSBhYm92ZSBuZXcgZnVuY3Rpb25zIHRvCi0JbWF0Y2ggdXAgSEk2UyByZWxvY3Mgd2l0aCBMTzE2IHJlbG9jcy4KLQotVHVlIEZlYiAxMCAxNTowMTozOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC1saW51eCogdG8gLWxpbnV4LWdudSouCi0JKiBjb25maWcuYmZkLCBjb25maWd1cmUuaG9zdDogTGlrZXdpc2UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBGZWIgIDkgMTk6NDA6NTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9zdG9yZV9hZGRlbmRfaW5faW5zbik6IEZpeCBhbm90aGVyCi0JTE8xNi9ISTE2UyBidWcgYW5kIGltcHJvdmUgY29tbWVudHMgYWJvdXQgd2hhdCBpcyBnb2luZyBvbi4KLQotU2F0IEZlYiAgNyAxNToyNzowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1GcmkgRmViICA2IDE0OjQ4OjIwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERvIG5vdCBjb21wbGFpbgotCXdoZW4gbWVyZ2luZyB2ODUwIGNvZGUgaW50byB2ODUwZS92ODUwZWEgY29kZS4gIERvIG5vdCBpbml0aWFsaXNlCi0Jb3V0cHV0IGZsYWdzIGlmIHRoZSBpbnB1dCBpcyB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUuCi0JCi1GcmkgRmViICA2IDExOjUwOjIyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbWlwcy5jIChiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRm9yIEJGRF9SRUxPQ19DVE9SCi0JZ2V0IHRoZSBzaXplIGZyb20gYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyBpbnN0ZWFkIG9mIGRpcmVjdGx5Ci0JZnJvbSB0aGUgaXNhLgotCi1UaHUgRmViICA1IDE0OjIxOjM0IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaCAoQkZEX0FMSUdOKTogSWYgcm91bmRpbmcgdXAgd291bGQgY2F1c2UgdGhlIGFkZHJlc3MKLQl0byB3cmFwLCBqdXN0IHJldHVybiBhbGwgMSdzIGJpdHMgaW5zdGVhZC4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlLgotCi1UaHUgRmViICA1IDExOjUxOjA1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfcGVfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbgotCWlmIENPRkZfV0lUSF9QRS4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgQ09GRl9XSVRIX1BFLCBkZWZpbmUgYXMKLQljb2ZmX3BlX2kzODZfcmVsb2NhdGVfc2VjdGlvbi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgQ09GRl9JTUFHRV9XSVRIX1BFLAotCXNraXAgZW1wdHkgc2VjdGlvbnMsIHRvIG1hdGNoIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLgotCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0KTogU3dhcCBvdXQgcl9hZGRlbmQsCi0gCXJhdGhlciB0aGFuIHN3YXBwaW5nIG91dCByX29mZnNldCB0d2ljZS4gIEZyb20gTHVrZSBEZWxsZXIKLSAJPGx1a2VkQGNzZS51bnN3LmVkdS5hdT4uCi0KLVdlZCBGZWIgIDQgMTk6MTE6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBsaWJ0b29sX2VuYWJsZV9zaGFyZWQgcmF0aGVyIHRoYW4KLQlsaWJ0b29sX3NoYXJlZC4gIFJlbW92ZSBkaXZlcnNpb24gaGFjay4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGRvYy9NYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZAotCXdpdGggbmV3IGxpYnRvb2wuCi0KLVdlZCBGZWIgIDQgMTY6MTA6MjEgMTk5OCAgQnJlbnQgQmFjY2FsYSAgPGJhY2NhbGFAZnJlZXNvZnQub3JnPgotCi0JKiBzeW1zLmMgKHN0cnVjdCBzdGFiX2NhY2hlKTogRGVmaW5lLgotCShzdHJ1Y3Qgc3RhYl9maW5kX2luZm8pOiBSZW1vdmUgY2FjaGVkX29mZnNldCwgY2FjaGVkX3N0YWIsCi0JY2FjaGVkX3N0ciwgYW5kIGNhY2hlZF9zdHJvZmYgZmllbGRzLiAgQWRkIGZpbGVfY2FjaGUsCi0JZnVuY3Rpb25fY2FjaGUsIGFuZCBsaW5lX2NhY2hlIGZpZWxkcy4KLQkoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBVc2UgZXh0ZW5zaXZlIGNhY2hpbmcgdG8KLQlzcGVlZCB1cCBzZWFyY2hlcy4KLQotV2VkIEZlYiAgNCAxMzozNDoyMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBDaGVjayBmb3IgaW1wb3J0IG9mIG9yZGluYWwgcmF0aGVyCi0JdGhhbiBuYW1lLgotCShwZV9wcmludF9lZGF0YSk6IElmIHRoZXJlIGlzIG5vIC5lZGF0YSBzZWN0aW9uLCBsb29rIGZvciB0aGUKLQlleHBvcnQgZGF0YSBpbiBzb21lIG90aGVyIHNlY3Rpb24uCi0KLU1vbiBGZWIgIDIgMjA6MDU6NDIgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIHZlcnNpb24gdG8gMi44LjQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1Nb24gRmViICAyIDE3OjM5OjM5IDE5OTggIFN0ZXZlIEhhd29ydGggIDxzdGV2ZUBwbS5jc2Uucm1pdC5FRFUuQVU+Ci0KLQlBZGQgdG1zMzIwYzMwIHN1cHBvcnQ6Ci0JKiBjcHUtdGljMzAuYzogTmV3IGZpbGUuCi0JKiBhb3V0LXRpYzMwLmM6IE5ldyBmaWxlLgotCSogY29mZi10aWMzMC5jOiBOZXcgZmlsZS4KLQkqIGFyY2h1cmVzLmMgKGJmZF9hcmNoX3RpYzMwKTogRGVmaW5lLgotCShiZmRfdGljMzBfYXJjaCk6IERlY2xhcmUuCi0JKGJmZF9hcmNodXJlc19saXN0KTogQWRkIGJmZF90aWMzMF9hcmNoLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCB0aWMzMF9hb3V0X3ZlYyBhbmQKLQl0aWMzMF9jb2ZmX3ZlYy4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19USUMzMF9MRFApOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEFkZCB0aWMzMCBjYXNlLgotCShjb2ZmX3NldF9mbGFncyk6IExpa2V3aXNlLgotCSogY29uZmlnLmJmZCAodGljMzAtKi0qYW91dCosIHRpYzMwLSotKmNvZmYqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW4gKHRpYzMwX2FvdXRfdmVjLCB0aWMzMF9jb2ZmX3ZlYyk6IE5ldyB2ZWN0b3JzLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShBTExfTUFDSElORVMpOiBBZGQgY3B1LXRpYzMwLmxvLgotCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGNwdS10aWMzMC5jLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBhb3V0LXRpYzMwLmxvIGFuZCBjb2ZmLXRpYzMwLmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgYW91dC10aWMzMC5jIGFuZCBjb2ZmLXRpYzMwLmMuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1Nb24gRmViICAyIDEyOjI1OjEyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfc3RvcmVfYWRkZW5kX2luX2luc24pOiBBbGxvdyBISTE2X1MgcmVsb2MKLQl0byBsYWcgYmVoaW5kIExPMTYgcmVsb2MgYnkgYSBjb3VwbGUgb2YgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gRmViICAyIDE0OjA5OjQ2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKCQoc3JjZGlyKS9iZmQtaW4yLmgpOiBBZGQgZHVtbXkgY29tbWFuZCB0byBmb3JjZQotCW1ha2UgdG8gcmVleGFtaW5lIHRoZSBmaWxlIHRpbWVzdGFtcC4KLQkoJChzcmNkaXIpL2xpYmJmZC5oLCAkKHNyY2RkaXIpL2xpYmNvZmYuaCk6IExpa2V3aXNlLgotCi0JKiBlbGY2NC1hbHBoYS5jIChFTEZfTUFYUEFHRVNJWkUpOiBDaGFuZ2UgdG8gMHgxMDAwMCBmcm9tCi0JMHgxMDAwMDAuCi0KLUZyaSBKYW4gMzAgMTk6MDc6MDcgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgcHJvY2VkdXJlCi0JdG8gY3JlYXRlIC5keW5zYnNzIGFuZCAucmVsYS5zYnNzIHNlY3Rpb25zLgotCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFB1dCBzcGFjZSBmb3Igc21hbGwgZGF0YSB0byBiZQotCWNvcGllZCBmcm9tIGR5bmFtaWMgb2JqZWN0cyBpbnRvIC5zYnNzLgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFN0cmlwIC5yZWxhLnNic3MgaWYgd2UgZG9uJ3QKLQl1c2UgaXQuICBDb3JyZWN0IHR5cG8gb2YgLnJlbGEuc2RhdGEyLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEdlbmVyYXRlIHJlbG9jIHRvIHdoZXJlIHdlCi0JcHV0IHRoZSBkYXRhLCB3aGljaCBtYXkgbm93IGJlIGluIC5zYnNzLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBIFNEQVJFTDE2IHJlbG9jIGNhbiBiZSBpbiBkeW5zYnNzLgotCShlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERlZmluZSBhcwotCXBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IERvbid0IGVtaXQgUl9QUENfUkVMKiByZWxvY3MKLQlhZ2FpbnN0IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy4KLSAJKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGVtaXQgUl9QUENfUkVMMzIgcmVsb2NzIGluCi0Jc2hhcmVkIGxpYnJhcmllcyB3aGljaCByZWZlciB0byBsb2NhbCBzeW1ib2xzLiAgTWFrZSBzdXJlIHRoYXQgdGhlCi0JdGVzdCBmb3IgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSByZWxvYyBpbiBhIHNoYXJlZCBvYmplY3QgaXMgdGhlCi0Jc2FtZSBhcyB0aGUgdGVzdCBmb3IgZW1pdHRpbmcgYSByZWxvYy4KLQotVGh1IEphbiAyOSAxNTo1NTozNSAxOTk4ICBKLkouIHZhbiBkZXIgSGVpamRlbiAgPEouSi52YW5kZXJIZWlqZGVuQHN0dWRlbnQudXR3ZW50ZS5ubD4KLQotCSogY29uZmlnLmJmZCAoaVszNDU2XS0qLW1pbmd3MzIqKTogTmV3IHRhcmdldC4KLQkqIGFjaW5jbHVkZS5tNCAoQkZEX0JJTkFSWV9PUEVOKTogQ2hlY2sgZm9yIG1pbmd3MzIuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBKYW4gMjggMTM6NDE6MjYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfY2xvc2VfYW5kX2NsZWFudXApOiBPbmx5IGNoZWNrIHRoZSBzdHJ0YWIgaWYgd2UKLQloYXZlIGEgYmZkX29iamVjdC4KLQotVHVlIEphbiAyNyAyMTo0Mzo1NSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JU3BhcmMgdjkgQUJJIGNvbXBsaWFudCBQTFQ6Ci0JKiBlbGY2NC1zcGFyYy5jIChQTFRfSEVBREVSX1NJWkUpOiBWOSBBQkkgdXNlcyA0IGVudHJpZXMuCi0JKHBsdF90ZW1wbGF0ZXMsIHNwYXJjNjRfZWxmX2J1aWxkX3BsdF9lbnRyeSk6IERlbGV0ZS4KLQkoTEFSR0VfUExUX1RIUkVTSE9MRCk6IE5ldyBkZWZpbmUuCi0JKEdPVF9SRVNFUlZFRF9FTlRSSUVTKTogVjkgQUJJIG9ubHkgdXNlcyAxLgotCShzcGFyYzY0X2VsZl9idWlsZF9wbHQpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQpOiBMaWtld2lzZS4KLQkoc3BhcmM2NF9lbGZfcGx0X3B0cl9vZmZzZXQpOiBMaWtld2lzZS4KLQkoc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ2hhbmdlIGgtPnBsdF9vZmZzZXQgdG8KLQljb250YWluIHRoZSBpbmRleCBmb3IgY29udmVuaWVuY2UuICBTa2lwIHRoZSBpbml0aWFsIGVudHJpZXMKLQlpbiAucmVsYS5wbHQuCi0JKHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFplcm8gdGhlIGFsbG9jYXRlZCBjb250ZW50cwotCW1lbW9yeSBmb3IgdGhlIGJlbmVmaXQgb2YgLnJlbGEucGx0LgotCShzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2FsbCBzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0LgotCShzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBLaWxsIHRlbXBsYXRlIHN0dWZmLiAgVXNlCi0Jc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldCAmIHNwYXJjNjRfZWxmX3BsdF9wdHJfb2Zmc2V0IGZvciByZWxvYy4KLQkoc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBEVF9QTFRHT1QgcG9pbnRzIHRvIC5wbHQuCi0JQ2FsbCBzcGFyYzY0X2VsZl9idWlsZF9wbHQuCi0JKGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCk6IE5vLgotCShlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkpOiBOby4KLQkoZWxmX2JhY2tlbmRfcGx0X2FsaWdubWVudCk6IDguCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9jbG9zZV9hbmRfY2xlYW51cCk6IE5ldyBmdW5jdGlvbjsgZnJlZSB0aGUgc2hzdHJ0YWIuCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX2Nsb3NlX2FuZF9jbGVhbnVwKTogRGVjbGFyZSBpdC4KLQkqIGVsZnh4LXRhcmdldC5oIChiZmRfZWxmTk5fY2xvc2VfYW5kX2NsZWFudXApOiBBcnJhbmdlIGZvciBpdAotCXRvIGJlIGNhbGxlZC4KLQotVHVlIEphbiAyNyAyMTo0NToxNSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX21pcHMqKTogQWRkIGRlZmluaXRpb25zIGZvciB2YXJpb3VzIE1JUFMKLQlwcm9jZXNzb3JzLgotCSogY3B1LW1pcHMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBtaXBzIHZhcmlhbnRzLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1UdWUgSmFuIDI3IDE1OjA2OjA0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBQcmVzZXJ2ZSB0aGUgY29udGVudHMgb2YKLQl0MmEzX2JfaW5zbi4KLQotVHVlIEphbiAyNyAxMjo0NzoyNyAxOTk4ICBSb2JlcnQgTGlwZSAgPHJvYmVydGxAZGdpaS5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni1zY28zLjJ2NSopOiBFTEYgbm93IHRoZSBkZWZhdWx0LgotCShpWzM0NTZdODZzY28zLjJ2NSpjb2ZmKTogTmV3IHRhcmdldC4KLQotTW9uIEphbiAyNiAxNTo0MTozMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbjIuaDogUmVidWlsZCB3aXRoIGNoYW5nZXMgdG8gY2hldy0tdGFiIGV4cGFuc2lvbi4KLQotVGh1IEphbiAyMiAyMToyNjo0OCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX2dldF9lcnJvcl9oYW5kbGVyKTogQWRkIG9ydGhvZ29uYWwgZnVuY3Rpb24uCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0KLVRodSBKYW4gMjIgMjE6MTM6MzkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGVraGV4LmMgKHRla2hleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayBmb3Igbm8gc3ltYm9scy4KLQotV2VkIEphbiAyMSAyMToxOTowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcnR5cGVfdG9faG93dG8pOiBJZiBDT0ZGX1dJVEhfUEUsIGRvbid0Ci0gCWFkanVzdCBhZGRlbmQgZm9yIGFuIG91dHB1dCBjb21tb24gc3ltYm9sIChmcm9tIEppbW15IEJsYWlyCi0gCTxqaW1teWJAd3JzLmNvbT4pLiAgSWYgQ09GRl9XSVRIX1BFLCBhZGp1c3QgYWRkZW5kIGZvciBQQyByZWxhdGl2ZQotIAlkZWZpbmVkIHN5bWJvbCB0byBjb3VudGVyYWN0IGFkanVzdG1lbnQgbWFkZSBpbiBnZW5lcmljIHJlbG9jYXRpb24KLSAJY29kZS4KLQotCSogZHdhcmYyLmM6IEluY2x1ZGUgc3lzZGVwLmgsIG5vdCBzdGRpby5oIGFuZCBzdGRsaWIuaC4KLQotV2VkIEphbiAyMSAyMToxNjowNiAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvZmYtbTg4ay5jIChHRVRfU0NOREhSX05SRUxPQyk6IEZpeCB0eXBvIGluIG1hY3JvIG5hbWUuCi0JKEdFVF9TQ05ESFJfTkxOTk8pOiBMaWtld2lzZS4KLQotTW9uIEphbiAxOSAxMjo0OTo1MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1zaC5jIChhcmNoX2luZm9fc3RydWN0KTogQ29ycmVjdCBuZXh0IGZpZWxkIG9mIHNoM2UuCi0KLVdlZCBKYW4gMTQgMTc6MjM6MjcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jOiBBZGQgbWFjcm9zIHRvIGhhbmRsZSBOT1AgaW5zZXJ0aW9uLgotCi1XZWQgSmFuIDE0IDE2OjE1OjIyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9tYXJrX3N5bWJvbCk6IERvbid0IG1hcmsgdGhlIGFic29sdXRlIHNlY3Rpb24uCi0JKHhjb2ZmX21hcmspOiBMaWtld2lzZS4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogTWFyayBhYnNvbHV0ZSBzeW1ib2xzLgotCi1XZWQgSmFuIDE0IDE2OjAzOjExIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGJvdXQuYyAoYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU29ydCBzeW1ib2xzIGJlZm9yZSBvdXRwdXQKLQl0byBrZWVwIHtDQUxMLEJBTH1OQU1FIHN5bWJvbHMgYWRqYWNlbnQuCi0JKGJfb3V0X3N5bWJvbF9jbXApOiBOZXcgZnVuY3Rpb24uCi0KLUZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTY5NwotDAotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogY2hhbmdlLWxvZwotbGVmdC1tYXJnaW46IDgKLWZpbGwtY29sdW1uOiA3NAotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvYmZkL0NoYW5nZUxvZy05MTkzIGIvYmZkL0NoYW5nZUxvZy05MTkzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWFmOTMxLi4wMDAwMDAwCi0tLSBhL2JmZC9DaGFuZ2VMb2ctOTE5MworKysgL2Rldi9udWxsCkBAIC0xLDc4NTEgKzAsMCBAQAotRnJpIERlYyAzMSAxNjoyMzo0MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlNaW5vciBjbGVhbnVwcyBzdWdnZXN0ZWQgYnkgQ29kZUNlbnRlci4KLQkqIGFvdXR4LmgsIGNvZmZnZW4uYywgZWNvZmYuYywgZWNvZmZsaW5rLmMsIGVsZi5jLCBsaWJiZmQuYywKLQlsaW5rZXIuYywgcmVsb2MuYywgc2VjdGlvbi5jLCBzcmVjLmM6IEFkZGVkIC8qQVJHU1VTRUQqLyBhcwotCWFwcHJvcHJpYXRlLgotCSogYW91dHguaCAoc3RydWN0IGV4dGVybmFsX2V4ZWMpOiBSZW1vdmVkIHVubmVjZXNzYXJ5IGRlY2xhcmF0aW9uLgotCShOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IFNldCBzb21lIHRkYXRhIHBvaW50ZXJzIHRvIE5VTEwuCi0JKGFkanVzdF96X21hZ2ljKTogUmVtb3ZlZCB1c2VsZXNzIHZhcmlhYmxlIGRhdGFfdm1hLgotCShzdHJpbmd0YWJfaW5pdCk6IEluaXRpYWxpemUgaGFzaF96ZXJvLgotCShhZGRfdG9fc3RyaW5ndGFiKTogUmVtb3ZlZCB1bnVzZWQgZm91cnRoIGFyZ3VtZW50LgotCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KSk6IFJlbW92ZWQgdXNlbGVzcyB2YXJpYWJsZQotCXJfYWRkZW5kLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbik6IEFkZGVkIHNvbWUgY2FzdHMuCi0JKiBhcmNoaXZlLmMgKGdldF9leHRlbmRlZF9hcmVsdF9maWxlbmFtZSwgZG9fc2x1cnBfY29mZl9hcm1hcCwKLQliZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSwgYnNkX3dyaXRlX2FybWFwLCBjb2ZmX3dyaXRlX2FybWFwKToKLQlNaW5vciBjb2RlIHJld3JpdGluZyB0byBtYWtlIGl0IG1vcmUgQyBsaWtlLgotCShkb19zbHVycF9ic2RfYXJtYXApOiBBZGRlZCBzb21lIGNhc3RzLgotCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlZCB1c2VsZXNzIHZhcmlhYmxlCi0Jc2NuX2Jhc2UuCi0JKGVjb2ZmX3dyaXRlX2FybWFwKTogQWRkZWQgc29tZSBjYXN0cy4gIFVzZSAiIiByYXRoZXIgdGhhbiAiXDAiLgotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl93cml0ZV9kZWJ1Zyk6IEFkZGVkIGEgY2FzdC4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGludGVybmFsX2V4ZWMpOiBSZW1vdmVkIHVubmVjZXNzYXJ5Ci0JZGVjbGFyYXRpb24uCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2luZGlyZWN0X2xpbmtfb3JkZXIpOiBBZGRlZCBhIGNhc3QuCi0JKiBvcG5jbHMuYyAobmV3X2JmZCk6IFJlbW92ZWQgYSBjYXN0LgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogQWRkZWQKLQlzb21lIGNhc3RzLgotCSogc3JlYy5jIChpbnRlcm5hbF9zcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZWQgdXNlbGVzcwotCXZhcmlhYmxlIGJ5dGVzX3dyaXR0ZW4uCi0KLUZyaSBEZWMgMzEgMTE6NDY6MTMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpMzg2bWFjaDMuYyAoTl9UWFRBRERSKTogRG9uJ3QgZGVmaW5lIGFmdGVyIGFsbC4KLQkoVEVYVF9TVEFSVF9BRERSKTogRG9uJ3QgaW5jbHVkZSBleGVjIGhlYWRlciBzaXplIGluIHZhbHVlLgotCi1UaHUgRGVjIDMwIDE1OjQ3OjU0IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Nm1hY2gzLmMgKE5fVFhUQUREUik6IERlZmluZS4KLQotVGh1IERlYyAzMCAxMzozNzoyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlFeHRlbnNpdmUgY2hhbmdlcyB0byBtb3ZlIHRoZSBidWxrIG9mIHRoZSBsaW5rZXIgaW50byBCRkQgc28gdGhhdAotCW1vcmUgZWZmaWNpZW50IGJhY2tlbmQgY29kZSBjYW4gYmUgd3JpdHRlbiBmb3Igc3BlY2lmaWMgb2JqZWN0Ci0JZmlsZXMuICBPbmx5IGV4aXN0aW5nIGVmZmljaWVudCBiYWNrZW5kIGlzIGEub3V0LgotCSogc2VjbGV0LmMsIHNlY2xldC5oOiBSZW1vdmVkLgotCSogaGFzaC5jLCBsaW5rZXIuYywgZ2VubGluay5oOiBOZXcgZmlsZXMuCi0JKiBiZmQtaW4uaDogUmVtb3ZlZCBiZmRfZXJyb3JfdmVjdG9yLiAgRGVjbGFyZWQgaGFzaCB0YWJsZQotCXN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucy4KLQkoSlVNUF9UQUJMRSk6IFJlbW92ZWQgYmZkX3NlY2xldF9saW5rLCBhZGRlZAotCWJmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlLCBiZmRfbGlua19hZGRfc3ltYm9scyBhbmQKLQliZmRfZmluYWxfbGluay4KLQkqIEFsbCBiYWNrZW5kczogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZGVkIGxpbmtfbmV4dCBhbmQgYXJjaGl2ZV9wYXNzIGZpZWxkcy4KLQlSZW1vdmVkIGxkX3N5bWJvbHMgZmllbGQuCi0JKGJmZF9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24sIGJmZF91bmRlZmluZWRfc3ltYm9sLAotCWJmZF9yZWxvY192YWx1ZV90cnVuY2F0ZWQsIGJmZF9yZWxvY19pc19kYW5nZXJvdXMsCi0JYmZkX2Vycm9yX3ZlY3Rvcik6IFJlbW92ZWQuCi0JKGJmZF9kZWZhdWx0X2Vycm9yX3RyYXAsIGJmZF9lcnJvcl90cmFwLAotCWJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmx0cmFwKTogUmVtb3ZlZC4KLQkoYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IFBhc3MgbGlua19pbmZvLiAgUGFzcwotCWxpbmtfb3JkZXIgaW5zdGVhZCBvZiBzZWNsZXQuICBQYXNzIHN5bWJvbHMuCi0JKGJmZF9yZWxheF9zZWN0aW9uKTogUGFzcyBsaW5rX2luZm8uCi0JKGJmZF9zZWNsZXRfbGluayk6IFJlbW92ZWQuCi0JKGJmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlLCBiZmRfbGlua19hZGRfc3ltYm9scywKLQliZmRfZmluYWxfbGluayk6IE5ldyBtYWNyb3MuCi0JKiBsaWJiZmQtaW4uaDogSWYgX19HTlVDX18gaXMgZGVmaW5lZCBhbmQgYWxsb2NhIGlzIG5vdCwgZGVmaW5lCi0JYWxsb2NhIGFzIF9fYnVpbHRpbl9hbGxvY2EuICBEZWNsYXJlIGludGVybmFsIGxpbmtpbmcgZnVuY3Rpb25zLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQuYyAoYmZkX3NlZWspOiBDb21tZW50IG91dCBmc2VlayBhc3NlcnRpb24uICBJdCdzIHdvcmtlZAotCWZvciBtb250aHMuCi0JKiByZWxvYy5jIChyZWxvY19ob3d0b190eXBlKTogQWRkZWQgZXJyb3JfbWVzc2FnZSBhcmd1bWVudCB0bwotCXNwZWNpYWxfZnVuY3Rpb24gZmllbGQuICBDaGFuZ2VkIGFsbCBjYWxsZXJzIGFuZCBhbGwgZGVmaW5pdGlvbnMuCi0JKGJmZF9nZXRfcmVsb2Nfc2l6ZSk6IE1ha2UgYXJndW1lbnQgYSBjb25zdCBwb2ludGVyLgotCShiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogQWRkIGVycm9yX21lc3NhZ2UgYXJndW1lbnQgdG8gaG9sZAotCXN0cmluZyBzZXQgaWYgcmV0dXJuIHZhbHVlIGlmIGJmZF9yZWxvY19kYW5nZXJvdXMuICBDaGFuZ2VkIGFsbAotCWNhbGxlcnMuCi0JKF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSwgX2JmZF9yZWxvY2F0ZV9jb250ZW50cyk6IE5ldyBmdW5jdGlvbnMuCi0JKiBzZWN0aW9uLmMgKGFzZWN0aW9uKTogUmVuYW1lZCBzZWNsZXRzX2hlYWQgYW5kIHNlY2xldHNfdGFpbCB0bwotCWxpbmtfb3JkZXJfaGVhZCBhbmQgbGlua19vcmRlcl90YWlsLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogUmVwbGFjZWQgc2VjbGV0IGFyZ3VtZW50IHdpdGggbGlua19pbmZvCi0JYW5kIGxpbmtfb3JkZXIgYW5kIHN5bWJvbHMgYXJndW1lbnRzIGluCi0JYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cy4gIEFkZGVkIHN5bWJvbHMgYXJndW1lbnQgdG8KLQliZmRfcmVsYXhfc2VjdGlvbi4gIFJlbW92ZWQgYmZkX3NlY2xldF9saW5rLiAgQWRkZWQKLQliZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgYmZkX2xpbmtfYWRkX3N5bWJvbHMgYW5kCi0JYmZkX2ZpbmFsX2xpbmsuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZGVkIGV4dGVybmFsX3N5bXMsCi0JZXh0ZXJuYWxfc3ltX2NvdW50LCBleHRlcm5hbF9zdHJpbmdzLCBzeW1faGFzaGVzIGZpZWxkcy4KLQkob2JqX2FvdXRfZXh0ZXJuYWxfc3ltcywgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50LAotCW9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MsIG9ial9hb3V0X3N5bV9oYXNoZXMpOiBOZXcgYWNjZXNzb3IKLQltYWNyb3MuCi0JKFdSSVRFX0hFQURFUlMpOiBPbmx5IG91dHB1dCBzeW1ib2xzIGlmIG91dHN5bWJvbHMgaXMgbm90IE5VTEwuCi0JKiBhb3V0eC5oOiBXcm90ZSBuZXcgYmFjayBlbmQgbGlua2VyIHJvdXRpbmVzLgotCSh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IFJldHVybiBib29sZWFuIHZhbHVlLiAgRG9uJ3QgdXNlCi0JYmZkX2Vycm9yX3ZlY3Rvci4KLQkoTkFNRShhb3V0LHdyaXRlX3N5bXMpKTogUmV0dXJuIGJvb2xlYW4gdmFsdWUuICBDaGVjayByZXR1cm4gdmFsdWUKLQlvZiB0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyBhbmQgYmZkX3dyaXRlLgotCSogYW91dC10YXJnZXQuaCAoZmluYWxfbGlua19jYWxsYmFjayk6IE5ldyBmdW5jdGlvbi4KLQkoTVlfYmZkX2ZpbmFsX2xpbmspOiBOZXcgZnVuY3Rpb24uCi0JKiBhb3V0LWFkb2JlLmMgKGFvdXRfYWRvYmVfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuCi0JdmFsdWUgb2YgYW91dF8zMl93cml0ZV9zeW1zLgotCSogaHAzMDBocHV4LmMgKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBMaWtld2lzZS4KLQkqIGkzODZseW54LmMgKFdSSVRFX0hFQURFUlMpOiBMaWtld2lzZS4KLQkqIGxpYmFvdXQuaCAoV1JJVEVfSEVBREVSUyk6IExpa2V3aXNlLgotCSogYm91dC5jOiBDaGFuZ2VkIGZ1bmN0aW9ucyB0byB1c2UgbGlua19pbmZvLT5jYWxsYmFja3MgcmF0aGVyCi0JdGhhbiBiZmRfZXJyb3JfdmVjdG9yLCBhbmQgbGlua19vcmRlcnMgcmF0aGVyIHRoYW4gc2VjbGV0cy4KLQkqIGNvZmYtYWxwaGEuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLWg4MzAwLmM6IExpa2V3aXNlLgotCSogY29mZi1oODUwMC5jOiBMaWtld2lzZS4KLQkqIGNvZmYtc2guYzogTGlrZXdpc2UuCi0JKiBjb2ZmLXo4ay5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLWhwcGEuYzogTGlrZXdpc2UuCi0JKiByZWxvYzE2LmM6IExpa2V3aXNlLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMb29rCi0JdXAgX2dwIGluIHRoZSBoYXNoIHRhYmxlIHJhdGhlciB0aGFuIGluIG91dHN5bWJvbHMuCi0JKiBjb2ZmLWEyOWsuYyAoYTI5a19yZWxvYyk6IFBhc3MgZXJyb3JzIGJhY2sgaW4gbmV3IGVycm9yX21lc3NhZ2UKLQlhcmd1bWVudCByYXRoZXIgdGhhbiBwcmludGluZyB0aGVtLgotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyk6IFRha2UgbGlua19pbmZvIGFuZAotCWxpbmtfb3JkZXIgYXJndW1lbnRzIHJhdGhlciB0aGFuIHNlY2xldC4gIENoYW5nZWQgYWxsIHVzZXMgYW5kCi0JZGVmaW5pdGlvbnMuCi0JKGJmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUpOiBQYXNzIGxpbmtfaW5mbyBhcmd1bWVudHMuICBDaGFuZ2VkCi0JYWxsIHVzZXMgYW5kIGRlZmluaXRpb25zLgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogZWNvZmYuYyAoZWNvZmZfZ2V0X2V4dHIpOiBJZiBzeW1ib2wgaXMgZGVmaW5lZCBieSBsaW5rZXIsIGJ1dAotCW5vdCBieSBFQ09GRiwgbWFrZSBpdCBzY0Ficy4KLQkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBSZW5hbWVkIGZyb20gZWNvZmZfYmZkX3NlY2xldF9saW5rIGFuZAotCXJld3JpdHRlbi4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IFJlbmFtZWQgZnJvbQotCW1pcHNfZWxmX3NlY2xldF9saW5rIGFuZCByZXdyaXR0ZW4uCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfc3R1Yl9kZXNjcmlwdGlvbik6IEFkZGVkIGxpbmtfaW5mbwotCWZpZWxkLgotCShuZXdfc3R1YiwgYWRkX3N0dWJfYnlfbmFtZSwgaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIsCi0JaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1YiwgaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKToKLQlBZGRlZCBsaW5rX2luZm8gYXJndW1lbnRzLiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHF1aXQgaWYgb3V0c3ltYm9scyBpcwotCW5vdCBOVUxMLgotCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBSZXR1cm4gYm9vbGVhbiB2YWx1ZSByYXRoZXIgdGhhbgotCXVzaW5nIGJmZF9lcnJvcl92ZWN0b3IuCi0JKG9hc3lzX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCW9hc3lzX3dyaXRlX3NlY3Rpb25zLgotCSogaG9zdHMvc3RkLWhvc3QuaDogRG9uJ3QgZGVjbGFyZSBxc29ydCBvciBzdHJ0b2wuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRF9MSUJTKTogUmVtb3ZlZCBzZWNsZXQuby4gIEFkZGVkIGhhc2gubyBhbmQgbGlua2VyLm8uCi0JKENGSUxFUyk6IFJlbW92ZWQgc2VjbGV0LmMuICBBZGRlZCBoYXNoLmMgYW5kIGxpbmtlci5jLgotCShIRklMRVMpOiBSZW1vdmVkIHNlY2xldC5oLiAgQWRkZWQgZ2VubGluay5oLgotCi1UaHUgRGVjIDMwIDA3OjQxOjM2IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogc2VjdGlvbi5jIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiAgUmV0dXJuIHplcm8gZmlsbGVkIGJ1ZmZlcgotCWlmIHNlY3Rpb24gaGFzIG5vIGNvbnRlbnRzLgotCi1UdWUgRGVjIDI4IDEyOjQzOjU0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGJmZF9lbGZfZ2VuZXJpY19yZWxvYyk6IElmIHRoaXMgaXMgbm90IGFuIGlucGxhY2UgcmVsb2MsCi0JdGhlbiBza2lwIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZXZlbiBpZiB0aGUgYWRkZW5kIGlzIG5vbi16ZXJvLgotCi1UdWUgRGVjIDIxIDA5OjIyOjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9yZWxvY3MpIFtTV0FQX09VVF9SRUxPQ19PRkZTRVRdOiBDb3B5Ci0JYWRkZW5kIHRvIHJfb2Zmc2V0IGZpZWxkLgotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkZWQgY29mZi1zcGFyYy5jLiAgUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGNvZmYtc3BhcmMuYyAoU1dBUF9JTl9SRUxPQ19PRkZTRVQsIFNXQVBfT1VUX1JFTE9DX09GRlNFVCwKLQlDQUxDX0FEREVORCk6IERlZmluZS4KLQotCSogYWl4Mzg2LWNvcmUuYyAoYWl4Mzg2X2NvcmVfZmlsZV9wKTogVXNlIGNkX3JlZ3NbMF0gZm9yIGNvbXB1dGluZwotCXRoZSBvZmZzZXRvZiBiZWNhdXNlIEFJWCAvYmluL2NjIGRvZXMgbm90IGxpa2UgdG8gdGFrZSB0aGUgYWRkcmVzcwotCW9mIGFuIGFycmF5LiAgKEZyb20gTWluaCBUcmFuLUxlLikKLQotVGh1IERlYyAxNiAxMzowNjozMiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogVGh1IERlYyAxNiAxNTo0MTowNiAxOTkzICBQZXRlciBIb29nZW5ib29tICAoaG9vZ2VuQGNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogTWFrZSBzdXJlIHRvIGNvcHkKLQl0aGUgcmV0dXJuIHBvaW50ZXIgaW50byAlcjIgaWYgbm8ganVtcC1pbi1jYWxsLWRlbGF5LXNsb3QKLQlvcHRpbWl6YXRpb24gd2FzIGRvbmUuCi0KLQkqIGhvc3RzL2hwMzAwYnNkLmg6IENvcnJlY3RseSBpZGVudGlmeSA0LjNCU0QgdnMgNC40QlNELgotCi1XZWQgRGVjIDE1IDA4OjA0OjE2IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaDogKHRpbWUpOiBEb24ndCBkZWNsYXJlOyBjb25mbGljdHMgb24gTWFjaDMuCi0KLQkqIGhvc3RzL2kzODZtYWNoMy5oIChIT1NUX1BBR0VfU0laRSk6IFNldCB0byAxIHRvIGF2b2lkIHBhZGRpbmcuCi0JKEhPU1RfU0VHTUVOVF9TSVpFKTogU2V0IHRvIDAgZm9yIHNhbWUgcmVhc29uLgotCi0JKiBpMzg2bWFjaDMuYyAoUEFHRV9TSVpFLCBTRUdNRU5UX1NJWkUpOiBTYW1lIGNoYW5nZXMgYXMgYWJvdmUuCi0JKFRFWFRfU1RBUlRfQUREUik6IENvcnJlY3QuCi0JKE1ZX2JhY2tlbmRfZGF0YSk6IERlZmluZS4KLQotCSogYW91dHguaCAoYWRqdXN0X29fbWFnaWMsIGFkanVzdF96X21hZ2ljLCBhZGp1c3Rfbl9tYWdpYyk6Ci0JTmV3IGZ1bmN0aW9uczsgY29kZSBtb3ZlZCBmcm9tIGFvdXRfPHNpemU+X2FkanVzdF9zaXplc19hbmRfdm1hcy4KLQotVHVlIERlYyAxNCAyMTo0ODozMyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotICAgICAgICAqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IEZpeCB0aGlua29zIGluIGF1eGlsaWFyeSBoZWFkZXIKLQlzdXBwb3J0LgotCShiZmRfc29tX2F0dGFjaF9hdXhfaGRyKTogTGlrZXdpc2UuCi0KLU1vbiBEZWMgMTMgMjM6MzQ6NDggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBIYW5kbGUgJ1QnIGZpZWxkCi0Jc2VsZWN0b3JzIGZvciBQSUMgY29kZS4KLQotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogSGFuZGxlICdUJyBmaWVsZCBzZWxlY3RvcnMuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9ETFRfUkVMLCBSX0ZTRUwsIFJfUlNFTCwgUl9MU0VMCi0JcmVsb2NhdGlvbnMgbmVlZGVkIGJ5IFBJQy4KLQotVHVlIERlYyAgNyAxNTo0Nzo1MSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmg6ICBGaXhlcyB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4uLgotCi1UdWUgRGVjICA3IDE1OjEwOjU0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGlibmxtLmggKG5sbV9iYWNrZW5kX2RhdGEpOiBSZW1vdmVkIG1hY3JvIGRlZmluaXRpb24uCi0JKG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEpOiBBZGp1c3RlZCBhY2NvcmRpbmdseS4KLQotU3VuIERlYyAgNSAxOTozMjowOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogRmxlc2ggb3V0IGNvZGUgZm9yIGhhbmRsaW5nIHNpbXBsZQotCWF1eGlsaWFyeSBoZWFkZXJzLgotCShiZmRfc29tX2F0dGFjaF9hdXhfaGRyKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzb20uaCAoc3RydWN0IHNvbWRhdGEpOiBBZGQgZmllbGRzIGZvciBhdHRhY2hpbmcgdmVyc2lvbiBhbmQKLQljb3B5cmlnaHQgaGVhZGVycy4gIEFkZCBhY2Nlc3NvciBtYWNyb3MuCi0KLQkqIHNvbS5jIChSX0RMVF9SRUwsIFJfQVVYX1VOV0lORCwgUl9TRUNfU1RNVCk6IEFkZCBwcm90ZWN0ZWQKLQlkZWZpbml0aW9ucyBmb3Igb2xkIHZlcnNpb25zIG9mIEhQVVggd2hpY2ggZmFpbCB0byBkZWZpbmUgdGhlbS4KLQkoc29tX2hwcGFfaG93dG9fdGFsYmUpOiBBZGQgUl9ETFRfUkVMLCBSX0FVWF9VTldJTkQsIGFuZCBSX1NFQ19TVE1UCi0Jbm93IHRoYXQgdGhleSdyZSBzYWZlLiAgRGVsZXRlIGJvZ3VzIFJfU1RBVEVNRU5UIHJlbG9jYXRpb25zLgotCi0JKiBzb20uYyAoc29tX2hwcGFfaG93dG9fdGFibGUpOiBBZGQgbWlzc2luZyBSX0VORF9UUlkuICBEZWxldGUgCi0JZXh0cmEgUl9EQVRBX09WRVJSSURFLgotCShocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IEdlbmVyYXRlIGEgcmVsb2NhdGlvbiBmb3IgdGhlIHJvdW5kaW5nCi0JbW9kZSBzZWxlY3RvciBpZiBuZWVkZWQuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgcmVxdWVzdHMgZm9yIGEgY2hhbmdlIGluIHRoZSBkZWZhdWx0Ci0Jcm91bmRpbmcgbW9kZS4gIFJvdW5kaW5nIG1vZGVzIGRvIG5vdCBjb25zdW1lIGlucHV0IGJ5dGVzLCBidXQKLQlhcmUganVzdCBtYXJrZXJzIG11Y2ggbGlrZSBSX0VOVFJZIGFuZCBSX0VYSVQuCi0KLVNhdCBEZWMgIDQgMTk6NDA6MzIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQlGcmkgRGVjICAzIDA5OjU1OjE3IDE5OTMgIFBldGUgSG9vZ2VuYm9vbSAgKGhvb2dlbkBjcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jOiAoaHBwYV9lbGZfcmVsb2MpOiAgRG8gbm90IGRvIGNvZGUgcmVvcmRlcmluZyB3aGVuCi0JdGhlIGJyYW5jaCBpbnN0cnVjdGlvbiBhcyBvcmlnaW5hbGx5IGJlZW4gbnVsbGlmaWVkLgotCWhwcGFfZWxmX3JlbG9jKTogIEF2b2lkIHVzZWxlc3MgY2FsbCB0byBiZmRfcHV0XzMyICgpIGluIHRoZQotCWNhc2Ugb2Ygbm8gY29kZSByZW9yZGVyaW5nIGR1ZSB0byBhbiBMRE8gaW5zdHJ1Y3Rpb24gaW4gdGhlCi0JZGVsYXkgc2xvdCBvZiB0aGUgYnJhbmNoLiAgTWFrZSBzdXJlIHRvIHJlbG9jYXRlIHRoZSBjb3JyZWN0Ci0JaW5zdHJ1Y3Rpb24uICBEbyBub3QgcGVyZm9ybSBpbnN0cnVjdGlvbiByZW9yZGVyaW5nIGZvciBtaWxsaWNvZGUKLQljYWxscy4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiAgQ2hhbmdlIHRoZSByZWxvY2F0aW9uIHR5cGUKLQl0byBSX0hQUEFfU1RVQl9DQUxMXzE3IHdoZW4gc3BlY2lhbCBwcm9jZXNzaW5nIG1pZ2h0IGJlIG5lZWRlZC4KLQkoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6IFByZXZlbnQgY29kZSByZW9yZGVyaW5nIG9uCi0JYSBjYWxsIGZyb20gYSBsaW5rZXIgc3R1YiB0byBhbm90aGVyIGxpbmtlciBzdHViIGFuZCBmb3IgbWlsbGljb2RlCi0JY2FsbHMuICBEbyBub3QgdHJhc2ggdGhlIHJldHVybiByZWdpc3RlciBmb3IgY2FsbHMgZnJvbSBvbmUgbGlua2VyCi0Jc3R1YiB0byBhIHNlY29uZCBsaW5rZXIgc3R1Yi4KLQotCSogZWxmMzItaHBwYS5jOiAoZWxmX2hwcGFfaG93dG9fdGFibGUpOiAgUExBQkVMIGFuZCBETFQKLQlyZWxvY2F0aW9ucyBhcmUgbm90IHBjLXJlbGF0aXZlLgotCi0JKiBocHBhX3N0dWJzLmg6IChCTEVfTl9YWFhfMF8zMSk6ICBOZXcgaW5zdHJ1Y3Rpb24gdXNlZCBpbgotCWxpbmtlciBzdHViIGNvZGUuIAotCShDT1BZXzJfMzEpOiAgTGlrZXdpc2UuCi0KLUZyaSBEZWMgIDMgMTg6NDA6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvc29sYXJpczIubWggKEhERUZJTkVTKTogUmVtb3ZlIC1EY29uc3Q9Ci0JKiBob3N0cy9zb2xhcmlzLmg6IElmIG5vdCBfX0dOVUNfXywgZGVmaW5lIGNvbnN0IGFzIGVtcHR5LgotCi1UaHUgRGVjICAyIDE1OjQzOjMyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYzogQWRkZWQgdmFyaW91cyBjYXN0cyBmb3IgMzIvNjQgYml0IGNyb3NzIHRhcmdldGluZy4KLQkoZWNvZmZfbWtvYmplY3RfaG9vayk6IFNldCBTRUNfU0hBUkVEX0xJQlJBUlkgZm9yIHRoZSAucmVnaW5mbwotCXNlY3Rpb24gc28gdGhhdCB0aGUgbGlua2VyIGlnbm9yZXMgaXQuCi0JKiBlY29mZmxpbmsuYzogQWRkZWQgdmFyaW91cyBjYXN0cyBmb3IgMzIvNjQgYml0IGNyb3NzIHRhcmdldGluZy4KLQkoZWNvZmZfYWRkX2J5dGVzKTogQ2hhbmdlZCBuZWVkIGFyZ3VtZW50IHRvIHNpemVfdC4KLQkoYmZkX2Vjb2ZmX2RlYnVnX2xpbmtfb3RoZXIpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQllY29mZl9hZGRfc3RyaW5nLgotCi0JKiBsaWJiZmQtaW4uaCAobmV3X2JmZCk6IFVzZSB2b2lkIHJhdGhlciB0aGFuIGFuIGVtcHR5IHBhcmFtZXRlcgotCWxpc3QuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotCSogbGlibmxtLmggKHN0cnVjdCBubG1fb2JqX3RkYXRhKTogTmV3IGZpZWxkIGJhY2tlbmRfZGF0YS4KLQkobmxtX2JhY2tlbmRfZGF0YSwgbmxtX2FscGhhX2JhY2tlbmRfZGF0YSk6IE5ldyBhY2Nlc3NvciBtYWNyb3MuCi0JKHN0cnVjdCBubG1fYmFja2VuZF9kYXRhKTogTmV3IGZpZWxkIG5vX3VuaW5pdGlhbGl6ZWRfZGF0YS4KLQkobmxtX25vX3VuaW5pdGlhbGl6ZWRfZGF0YSk6IE5ldyBhY2Nlc3NvciBtYWNyby4KLQkqIG5sbWNvZGUuaCAobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEhhbmRsZQotCW5vX3VuaW5pdGlhbGl6ZWRfZGF0YS4KLQkobmxtX2V4dGVybmFsX3JlbG9jX2NvbXBhcmUpOiBTb3J0IHJlbG9jcyBieSBhZGRyZXNzIGZvciBhCi0JcGFydGljdWxhciBzeW1ib2wsIHRvIG1ha2UgdGhlIHNvcnQgbW9yZSBzdGFibGUuCi0JKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBDYXN0IHRoZSBhcmd1bWVudHMgdG8gcXNvcnQuICBHZXQgdGhlCi0JdmFsdWUgb2YgYSBkZWJ1Z2dpbmcgc3ltYm9sIHRoZSBzYW1lIHdheSB3ZSBnZXQgdGhlIHZhbHVlIG9mIGEKLQlub3JtYWwgc3ltYm9sLgotCSogbmxtMzItYWxwaGEuYzogVmFyaW91cyBjaGFuZ2VzLiAgV3JpdGUgb3V0IEdQIGFuZCAubGl0YSByZWxvY3MuCi0JU2V0IG5vX3VuaW5pdGlhbGl6ZWRfZGF0YSB0byB0cnVlLgotCSogbmxtMzItaTM4Ni5jIChubG0zMl9pMzg2X2JhY2tlbmQpLCBubG0zMi1zcGFyYy5jCi0JKG5sbTMyX3NwYXJjX2JhY2tlbmQpOiBTZXQgbm9fdW5pbml0aWFsaXplZF9kYXRhIGZpZWxkIGZhbHNlLgotCSogbmxtc3dhcC5oIChubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0KTogWmVybyBvdXQgZGVzdGluYXRpb24KLQliZWZvcmUgZmlsbGluZyBpdCBpbi4KLQotV2VkIERlYyAgMSAyMTo0Nzo1OCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zZWN0aW9uX3R5cGUsIHNvbV9kZWNvZGVfc3ltY2Fsc3MpOiBOZXcgZnVuY3Rpb25zLgotCShzb21fZ2V0X3N5bWJvbF9pbmZvKTogVXNlIHRoZW0uCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgdGhlIHNlY3Rpb24gb2YgY29tbW9uIGFuZCB1bmRlZmluZWQKLQlzeW1ib2xzIGNvcnJlY3RseS4KLQotV2VkIERlYyAgMSAxNDoxNToxMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oICh3cml0ZV9yZWxvY3MpOiBJbml0aWFsaXplIGxvY2FsIHZhciBMQVNUX1NZTV9JRFgsIHRvCi0JbWFrZSBnY2MgaGFwcHkuCi0KLQkqIG1pcHNic2QuYzogQ2hhbmdlcyBmcm9tIFJhbHBoIENhbXBiZWxsOgotCShtaXBzX2hvd3RvX3RhYmxlX2V4dCk6IE1JUFNfUkVMT0NfTE8xNiBzaG91bGQgdXNlCi0JY29tcGxhaW5fb3ZlcmZsb3dfZG9udC4KLQkoYW91dF9taXBzXypfdmVjKTogTWFrZSBuYW1lIHVzZSAiYS5vdXQiIGluc3RlYWQgb2YgImFvdXQiLCB0bwotCW1ha2UgZ2RiIGhhcHB5LgotCi0JKiBiZmQuYyAoYmZkX2Vycm1zZ3MpOiBSZXdvcmQgaW52YWxpZC10YXJnZXQgbWVzc2FnZS4KLQotCSogY29uZmlnLmJmZDogRm9yIHNwYXJjKi0qLWNvZmYsIHVzZSBzcGFyYy1jb2ZmLgotCSogY29uZmlndXJlLmluOiBIYW5kbGUgc3BhcmNjb2ZmX3ZlYy4KLQkqIHRhcmdldHMuYyAoc3BhcmNjb2ZmX3ZlYyk6IERlY2xhcmUuCi0KLQkqIHJlbG9jLmMgKGJmZF9nZXRfcmVsb2Nfc2l6ZSk6IE5ldyBmdW5jdGlvbi4KLQkoc3RydWN0IHJlbG9jX2hvd3RvX3R5cGUpOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBvZiBzaXplIGZpZWxkLgotCi1XZWQgRGVjICAxIDE0OjM5OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtMzItYWxwaGEuYzogTmV3IGZpbGU7IHByZWxpbWluYXJ5IEFscGhhIE5ldFdhcmUgc3VwcG9ydC4KLQkqIGNvbmZpZy5iZmQgKGFscGhhLSotbmV0d2FyZSopOiBOZXcgdGFyZ2V0OyB1c2UgYWxwaGEtbmxtLgotCSogY29uZmlnL2FscGhhLW5sbS5tdDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKG5sbTMyX2FscGhhX3ZlYyk6IE5ldyB2ZWN0b3I7IHVzZSBubG0zMi1hbHBoYS5vLAotCW5sbTMyLm8sIGFuZCBubG0uby4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZGVkIG5sbTMyLWFscGhhLm8uCi0JKENGSUxFUyk6IEFkZGVkIG5sbTMyLWFscGhhLmMuCi0JUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0JKiB0YXJnZXRzLmMgKG5sbTMyX2FscGhhX3ZlYyk6IERlY2xhcmUuCi0KLQkqIGxpYm5sbS5oIChzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSk6IE5ldyBmaWVsZHMKLQlvcHRpb25hbF9wcmVmaXhfc2l6ZSwgbmxtX2JhY2tlbmRfb2JqZWN0X3AsIG5sbV93cml0ZV9wcmVmaXgsCi0JbmxtX3NldF9wdWJsaWNfc2VjdGlvbiwgbmxtX2dldF9wdWJsaWNfb2Zmc2V0LiAgUmVtb3ZlZCB1bnVzZWQKLQlubG1fd3JpdGVfcmVsb2MgZmllbGQuICBDaGFuZ2VkIG5sbV93cml0ZV9pbXBvcnQgdG8gcmVtb3ZlCi0JdW5uZWNlc3Nhcnkgc3ltYm9sIGFyZ3VtZW50LiAgUmVuYW1lZCBubG1fd3JpdGVfZXh0ZXJuYWxzIHRvCi0JbmxtX3dyaXRlX2V4dGVybmFsLCBhbmQgY2hhbmdlZCBjb3VuZCBhcmd1bWVudCBmcm9tIGJmZF92bWEgdG8KLQliZmRfc2l6ZV90eXBlLgotCShubG1fb3B0aW9uYWxfcHJlZml4X3NpemUsIG5sbV9iYWNrZW5kX29iamVjdF9wX2Z1bmMsCi0JbmxtX3dyaXRlX3ByZWZpeF9mdW5jLCBubG1fc2V0X3B1YmxpY19zZWN0aW9uX2Z1bmMsCi0JbmxtX2dldF9wdWJsaWNfb2Zmc2V0X2Z1bmMpOiBOZXcgYWNjZXNzb3IgbWFjcm9zLgotCShubG1fd3JpdGVfcmVsb2NfZnVuYyk6IFJlbW92ZWQuCi0JKG5sbV93cml0ZV9leHRlcm5hbF9mdW5jKTogQWRqdXN0ZWQgZm9yIGZpZWxkIHJlbmFtaW5nLgotCSogbmxtMzItaTM4Ni5jIChubG1faTM4Nl93cml0ZV9pbXBvcnQpOiBSZW5hbWVkIGZyb20KLQlubG1faTM4Nl93cml0ZV9yZWxvYy4gIFJlbW92ZWQgb2xkIG5sbV9pMzg2X3dyaXRlX2ltcG9ydCB3aGljaAotCWp1c3QgY2FsbGVkIG9sZCBubG1faTM4Nl93cml0ZV9yZWxvYy4KLQkobmxtX2kzODZfd3JpdGVfZXh0ZXJuYWwpOiBSZW5hbWVkIGZyb20gbmxtX2kzODZfd3JpdGVfZXh0ZXJuYWxzLgotCURlY2xhcmVkLiAgQ2hhbmdlZCBzZWNvbmQgYXJndW1lbnQgZnJvbSBiZmRfdm1hIHRvIGJmZF9zaXplX3R5cGUuCi0JKG5sbTMyX2kzODZfYmFja2VuZCk6IEFkanVzdGVkIGZvciBjaGFuZ2VzIHRvIGZpZWxkcyBhbmQgbmFtZXMuCi0JKiBubG0zMi1zcGFyYy5jIChubG1fc3BhcmNfbWFuZ2xlX3JlbG9jcyk6IFJlbW92ZWQgdW51c2VkLAotCWlmZGVmZmVkIG91dCBjb2RlLgotCShubG1fc3BhcmNfd3JpdGVfaW1wb3J0KTogUmVtb3ZlZCBzZWNvbmQgYXJndW1lbnQuCi0JKG5sbV9zcGFyY193cml0ZV9leHRlcm5hbCk6IFJlbmFtZWQgZnJvbQotCW5sbV9zcGFyY193cml0ZV9leHRlcm5hbHMuICBDaGFuZ2VkIHNlY29uZCBhcmd1bWVudCBmcm9tIGJmZF92bWEKLQl0byBiZmRfc2l6ZV90eXBlLgotCShubG0zMl9zcGFyY19iYWNrZW5kKTogQWRqdXN0ZWQgZm9yIGNoYW5nZXMgdG8gZmllbGRzIGFuZCBuYW1lcy4KLQkqIG5sbWNvZGUuaDogUmVtb3ZlZCBzb21lIHVudXNlZCBjb2RlLgotCShubG1fb2JqZWN0X3ApOiBEb24ndCBkZXN0cm95IHRkYXRhIHBvaW50ZXIuICBDYWxsCi0JYmFja2VuZF9vYmplY3RfcCBmdW5jdGlvbiBpZiBpdCBleGlzdHMuCi0JKG5sbV9zbHVycF9zeW1ib2xfdGFibGUpOiBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZSByY291bnQuICBDYWxsCi0Jc2V0X3B1YmxpY19zZWN0aW9uX2Z1bmMgaWYgaXQgZXhpc3RzIGluc3RlYWQgb2YgY2hlY2tpbmcKLQlOTE1fSElCSVQuCi0JKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBY2NvdW50IGZvcgotCW9wdGlvbmFsX3ByZWZpeF9zaXplLgotCShubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQWNjb3VudCBmb3Igb3B0aW9uYWxfcHJlZml4X3NpemUuCi0JUmVtb3ZlZCB1c2VsZXNzIHZhcmlhYmxlIHdyaXRlX3JlbG9jX2Z1bmMuICBDaGFuZ2VkIGRlY2xhcmF0aW9uCi0JYW5kIGNhbGwgb2Ygd3JpdGVfaW1wb3J0X2Z1bmMuICBDYWxsIHdyaXRlX3ByZWZpeF9mdW5jIGlmIGl0Ci0JZXhpc3RzLiAgUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGVzIGxlbiBhbmQgdGVtcC4gIENhbGwKLQlnZXRfcHVibGljX29mZnNldF9mdW5jIGlmIGl0IGV4aXN0cyByYXRoZXIgdGhhbiBzZXR0aW5nIE5MTV9ISUJJVC4KLQkqIG5sbXN3YXAuaDogRGVjbGFyZSBmdW5jdGlvbnMuCi0KLQkqIGJmZC1pbi5oICh1aW50NjRfdHlwZUxPVywgdWludDY0X3R5cGVISUdIKTogRnVsbHkgcGFyZW50aGVzaXplCi0JZm9yIGNsYXJpdHkuCi0JKGZwcmludGZfdm1hLCBzcHJpbnRmX3ZtYSk6IFVzZSAlbHgsIG5vdCAleC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGhvc3RzL2FscGhhb3NmLmggKHVpbnQ2NF90eXBlTE9XLCB1aW50NjRfdHlwZUhJR0gpOiBDYXN0IHJlc3VsdHMKLQl0byB1bnNpZ25lZCBsb25nLgotCi0JKiBjb25maWcuYmZkOiBEb24ndCBzZXQgdGFyZ2V0NjQgaGVyZSwgYXMgdGhlIHNldHRpbmcgaXMgaWdub3JlZC4KLQkqIGNvbmZpZ3VyZS5pbiAoZWNvZmZhbHBoYV9saXR0bGVfdmVjKTogU2V0IHRhcmdldDY0LgotCi0JKiBjb25maWcvYWxwaGFvc2YubXQgKFRERUZJTkVTKTogUmVtb3ZlZDsgc2V0dGluZyBob3N0IHBhcmFtZXRlcnMKLQlpbiBUREVGSU5FUyBpcyB3cm9uZy4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOgotCVJlbW92ZSB1bnVzZWQgdmFyaWFibGUgb3V0cHV0X3NlY3Rpb24uCi0KLVR1ZSBOb3YgMzAgMTY6NDU6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpcml4LWNvcmUuYzogTmV3IGZpbGUgZm9yIElyaXggNCBhbmQgSXJpeCA1IGNvcmUgc3VwcG9ydC4KLQlGdW5jdGlvbnMgdGFrZW4gb3V0IG9mIGNvZmYtbWlwcy5jLiAgSGFuZGxlIHZtYXAgdHlwZSBWTUFQRklMRS4KLQkqIGNvZmYtbWlwcy5jOiBJcml4IDQgY29yZSBmaWxlIHN1cHBvcnQgbW92ZWQgdG8gaXJpeC1jb3JlLmMuCi0JKiB0YXJnZXRzLmM6IElmIElSSVhfQ09SRSBkZWZpbmVkLCBpbmNsdWRlIGlyaXhfY29yZV92ZWMgaW4KLQl0YXJnZXRfdmVjdG9yLgotCSogY29uZmlnL2lyaXg0Lm1oIChIREVGSU5FUyk6IEFkZCAtRElSSVhfQ09SRS4KLQkoSERFUEZJTEVTKTogRGVmaW5lIHRvIGJlIGlyaXgtY29yZS5vLgotCSogY29uZmlnL2lyaXg1Lm1oIChIREVGSU5FUyk6IERlZmluZSB0byBiZSAtRElSSVhfQ09SRS4KLQkoSERFUEZJTEVTKTogRGVmaW5lIHRvIGJlIGlyaXgtY29yZS5vLgotCSogTWFrZWZpbGUuaW4gKE9QVElPTkFMX0JBQ0tFTkRTKTogQWRkZWQgaXJpeC1jb3JlLm8uICBSZW1vdmVkCi0Jc2NvLWNvcmUubywgd2hpY2ggbm8gbG9uZ2VyIGV4aXN0cy4KLQkoQ0ZJTEVTKTogQWRkZWQgYWxsICotY29yZS5jIGZpbGVzLgotCVJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi1XZWQgTm92IDI0IDAyOjAyOjQxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IFJlc3RvcmUgY2hlY2sgb2YgZmlsZV9zaXplICE9Ci0JbWVtX3NpemUsIGJ1dCBvbmx5IGlmIFNIVF9QUk9HQklUUy4KLQotCSogZWNvZmZsaW5rLmM6IE5ldyBmaWxlIHRvIGhvbGQgRUNPRkYgZGVidWcgaW5mb3JtYXRpb24gbGlua2luZwotCXJvdXRpbmVzLgotCSogZWNvZmYuYyAoZWNvZmZfY2xlYXJfb3V0cHV0X2ZsYWdzLCBlY29mZl9yZWwsIGVjb2ZmX2R1bXBfc2VjbGV0LAotCWVjb2ZmX2FkZF9zdHJpbmcsIGVjb2ZmX2dldF9kZWJ1Zyk6IFJlbW92ZWQuICBGdW5jdGlvbmFsaXR5IG5vdyBpbgotCWVjb2ZmbGluay5jLgotCShlY29mZl9nZXRfZXh0ciwgZWNvZmZfc2V0X2luZGV4KTogTmV3IGZ1bmN0aW9ucy4KLQkoZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6IERvbid0IHNhdmUgcmF3X3NpemUuCi0JKGVjb2ZmX2JmZF9zZWNsZXRfbGluayk6IFJld3JvdGUgdG8gdXNlIGVjb2ZmbGluay5jIGZ1bmN0aW9ucy4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRG9uJ3Qgc2V0IEVYRUNfUCBqdXN0Ci0JYmVjYXVzZSB0aGVyZSBpcyBhIHN0YXJ0IGFkZHJlc3MuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEhhbmRsZSBleHRlcm5hbCBzeW1ib2xzIGhlcmUuICBVc2UKLQllY29mZmxpbmsuYyBmdW5jdGlvbnMgdG8gd3JpdGUgb3V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVhZF9lY29mZl9pbmZvLCBtaXBzX2VsZl9nZXRfZXh0ciwKLQltaXBzX2VsZl9zZXRfaW5kZXgpOiBOZXcgZnVuY3Rpb25zLgotCShtaXBzX2VsZl9zZWNsZXRfbGluayk6IERpc2NhcmQgZW1wdHkgc2VjdGlvbnMsIHRoZSAub3B0aW9ucwotCXNlY3Rpb24gYW5kIC5ncHRhYiBzZWN0aW9ucy4gIEhhbmRsZSBsaW5raW5nIC5tZGVidWcgc2VjdGlvbi4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2RhdGFfdHlwZSk6IFJlbW92ZWQgcmF3X3NpemUgYW5kIGlmZGJhc2UuCi0JKiBsaWJlbGYuaCAoZWxmX3N5bWJvbF90eXBlKTogQWRkZWQgbWlwc19leHRyIHRvIHRjX2RhdGEgdW5pb24uCi0JKiBiZmQtaW4uaDogQWRkZWQgcHJvdG90eXBlcyBmb3Igcm91dGluZXMgaW4gZWNvZmZsaW5rLmMgKHNvbWUgYXJlCi0JY2FsbGVkIGJ5IGdhcywgc28gdGhleSBhcmUgcHVibGljKS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IEFkZGVkIGVjb2ZmbGluay5vLgotCShDRklMRVMpOiBBZGRlZCBlY29mZmxpbmsuYy4KLQkoZWNvZmZsaW5rLm8pOiBOZXcgdGFyZ2V0LiAgUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLU1vbiBOb3YgMjIgMjI6MjY6NDIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChocHBhX29iamVjdF9wKTogQWxzbyByZWNvZ25pemUgU0hBUkVEX01BR0lDX0NOWCBhcwotCWEgdmFsaWQgbWFnaWMgbnVtYmVyIGlmIGl0J3MgYmVlbiBkZWZpbmVkLgotCi1Nb24gTm92IDIyIDE0OjE3OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfbWtvYmplY3QpOiBEb24ndCBjcmVhdGUgLnNjb21tb24gc2VjdGlvbjsgbGlua2VyCi0Jbm8gbG9uZ2VyIHJlcXVpcmVzIGl0LgotCShlY29mZl9iZmRfc2VjbGV0X2xpbmssIGVjb2ZmX3NpemVvZl9oZWFkZXJzLAotCWVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHRyZWF0IC5zY29tbW9uIHNlY3Rpb24KLQlzcGVjaWFsbHkuCi0KLU1vbiBOb3YgMjIgMTA6NTQ6MjcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQlNZXJnZWQgY2hhbmdlcyBmcm9tIGtldkBzcHVkcy5nZWcubW90LmNvbSAoS2V2aW4gQS4gQnVldHRuZXIpOgotCSogYmZkL2NvbmZpZy9kZWx0YTg4Lm1oIChIREVGSU5FUyk6IERlZmluZSB0aGlzIHRvIGJlIC1EUFRSQUNFX0NPUkUuCi0JKiBiZmQvY29uZmlnL2RlbHRhODgubWggKEhERVBGSUxFUyk6IERlZmluZWQgdG8gYmUgcHRyYWNlLWNvcmUuby4KLQkqIGJmZC9wdHJhY2UtY29yZS5jOiAgTmV3IGZpbGUgZm9yIGRlYWxpbmcgd2l0aCBjb3JlIGZpbGVzIHdpdGgKLQlzdGFydCB3aXRoIHRoZSBwdHJhY2VfdXNlciBzdHJ1Y3R1cmUgZm91bmQgb24gQkNTIGNvbXBsaWFudCBzeXN0ZW1zLgotCSogYmZkL3RhcmdldHMuYyAocHRyYWNlX2NvcmVfdmVjKTogIE5ldyB2ZWN0b3IuCi0KLU1vbiBOb3YgMjIgMDI6MzM6MTIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1pbmltYWwgc3VwcG9ydCBmb3IgcmVhZGluZyBTT00gZml4dXAgc3RyZWFtcy4gIEFsbG93cwotCW9iamR1bXAgLXIgdG8gZG8gc29tZXRoaW5nIHJlYXNvbmFibGUuCi0JKiBzb20uYyAoc29tX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IEltcGxlbWVudC4KLQkoc29tX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IEltcGxlbWVudC4KLQkoc29tX3NldF9yZWxvY19pbmZvLCBzb21fc2x1cnBfcmVsb2NfdGFibGUpOiBOZXcgZnVuY3Rpb25zLgotCi1TdW4gTm92IDIxIDEzOjQ2OjU1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvbHlueC5oIChGUFJJTlRGX0FMUkVBRFlfREVDTEFSRUQpOiBEZWZpbmUuCi0JKiBob3N0cy9zcGFyY2x5bnguaDogSW5jbHVkZSBseW54LmggaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBpdC4KLQotRnJpIE5vdiAxOSAxNDozNDowNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKTogRm9yIFJfSVJFTCwgZG9uJ3QgbGVmdCBzaGlmdAotCXNpZ25lZF92YWx1ZSBiZWZvcmUgc2lnbiBleHRlbmRpbmcgaXQuICBEb24ndCBzdWJ0cmFjdCBvdXQKLQlyZWxvY19lbnRyeS0+YWRkcmVzcy4gIFRoaXMgbWFrZXMgaXQgY29tcGF0aWJsZSB3aXRoIHdoYXQgZ2FzIGlzCi0JZ2VuZXJhdGluZy4KLQotCSogZWxmY29kZS5oIChlbGZfZmFrZV9zZWN0aW9ucyk6IEFjY2VwdCAuc2JzcyBhcyB0aGUgbmFtZSBmb3IgYQotCVNIVF9OT0JJVFMgc2VjdGlvbnMuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogRG9uJ3QgbGVhdmUgdGhlIGxvb3AgYWZ0ZXIgdGhlIGZpcnN0Ci0JU0hUX05PQklUUyBzZWN0aW9uLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IE9ubHkgZm9yY2Ugc2hfb2Zmc2V0IGFuZAotCXNoX2FkZHIgdG8gbWF0Y2ggbW9kdWxvIG1heHBhZ2VzaXplIGZvciBhIHNlY3Rpb24gd2hpY2ggaXMgbm90Ci0JU0hUX05PQklUUy4gIENoYW5nZWQgdGhlIG1ldGhvZCB1c2VkIHRvIGZvcmNlIHBhZ2UgYWxpZ25tZW50IGFmdGVyCi0JYSBTSFRfTk9CSVRTIHNlY3Rpb24gdG8gb25seSBkbyBpdCBmb3IgdGhlIGxhc3Qgc3VjaCBjb25zZWN1dGl2ZQotCXNlY3Rpb24sIGFuZCB0byByZWFsbHkgZm9yY2UgcGFnZSBhbGlnbm1lbnQuCi0KLUZyaSBOb3YgMTkgMDQ6MDI6MDEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFByaW50IG1vcmUgdmVyYm9zZSBtZXNzYWdlCi0JaW4gdGhlIGNhc2Ugb2YgYW4gdW5rbm93biAob3IgdW5oYW5kbGVkKSBzdG9yYWdlIGNsYXNzLgotCi0JKiBjb25maWcvaTM4Ni1seW54Lm10IChUREVGSU5FUyk6IEZQUklOVEZfQUxSRUFEWV9ERUNMQVJFRCBzaG91bGQKLQlub3QgYmUgZGVmaW5lZCBoZXJlLCBzaW5jZSBpdCBpcyBhIGhvc3QgYXR0cmlidXRlLCBub3QgYSB0YXJnZXQKLQlvbmUuCi0JKiBjb25maWcvbTY4ay1seW54Lm10LCBjb25maWcvc3BhcmMtbHlueC5tdDogRGl0dG8uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkKLQlkZWZpbmVkLgotCi0JKiBjb2ZmLXNwYXJjLmM6IERlZmluZSBzb21lIHJlbG9jYXRpb25zLCBiYXNlZCBvbiBFTEYgcmVsb2NhdGlvbnMuCi0JKGVudW0gcmVsb2NfdHlwZSwgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywgY29mZl9zcGFyY19ob3d0b190YWJsZSwKLQlzdHJ1Y3QgY29mZl9yZWxvY19tYXAsIHNwYXJjX3JlbG9jX21hcCwKLQljb2ZmX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwKTogQm9ycm93ZWQgZnJvbSBlbGYzMi1zcGFyYy5jIGFuZAotCWVsZi5jLCByZW5hbWVkLgotCShjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZSB0byBiZSBjb2ZmX3NwYXJjX3JlbG9jXy4uLi4KLQkocnR5cGUyaG93dG8pOiBJbmRleCBpbnRvIGNvZmZfc3BhcmNfaG93dG9fdGFibGUgdXNpbmcKLQlkc3QtPnJfdHlwZS4KLQotVGh1IE5vdiAxOCAxMTo0NTozOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgKG1pcHMqLSotaXJpeDUqKTogTmV3IHRhcmdldDsgdXNlIG1pcHNiZWxmLgotCSogY29uZmlndXJlLmhvc3QgKG1pcHMtc2dpLWlyaXg1KikgTmV3IGhvc3Q7IHVzZSBpcml4NSAobm8KLQlob3N0cy9pcml4NS5oIGNyZWF0ZWQ7IGp1c3QgdXNlIHN0ZC1ob3N0LmgpLgotCSogY29uZmlnL2lyaXg1Lm1oOiBOZXcgZmlsZTsgbGlrZSBpcml4NC5taCwgYnV0IGRvbid0IHVzZSAtRyBvcgotCS1sbWFsbG9jLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi0JKiBlY29mZnN3YXAuaDogQ2hhbmdlZCB0eXBlIG9mIGludGVybmFsIHBvaW50ZXJzIGZvciBzd2FwIG91dAotCWZ1bmN0aW9ucyB0byBjb25zdCAqLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2dvdDE2X3JlbG9jKTogTmV3IGZ1bmN0aW9uLiAgSGFuZGxlIEdPVDE2Ci0JY29ycmVjdGx5IGZvciBhc3NlbWJsZXIsIGJ1dCBsaW5rZXIgc3VwcG9ydCBub3QgaW1wbGVtZW50ZWQuCi0JKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogVXNlIG1pcHNfZWxmX2dvdDE2X3JlbG9jIGZvciBHT1QxNi4KLQkobWlwc19lbGZfc3ltX2lzX2dsb2JhbCk6IE5ldyBmdW5jdGlvbjsgYXQgbGVhc3Qgb24gSXJpeCA1LCBhbGwKLQlub24gc2VjdGlvbiBzeW1ib2xzIGFyZSBjb25zaWRlcmVkIGdsb2JhbC4KLQkoZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCk6IERlZmluZS4KLQkobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IE5ldyBmdW5jdGlvbi4gIFNldCB0aGUgTUlQUwotCWFyY2hpdGVjdHVyZSBsZXZlbCBjb3JyZWN0bHkuCi0JKGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBEZWZpbmUuCi0JKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogSGFuZGxlIFNIVF9NSVBTX09QVElPTlMuCi0JKG1pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBTZXQgZW50c2l6ZSBvZiAubWRlYnVnIG9yIC5yZWdpbmZvCi0Jc2VjdGlvbiB0byAxLiAgSGFuZGxlIC5vcHRpb25zIHNlY3Rpb24uCi0JKG1pcHNfZWxmX2Fjb21fc2VjdGlvbiwgbWlwc19lbGZfYWNvbV9zeW1ib2wsCi0JbWlwc19lbGZfYWNvbV9zeW1ib2xfcHRyKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMsIHVzZWQgdG8gYnVpbGQgYQotCWdlbmVyaWMgLmFjb21tb24gc2VjdGlvbiB0byBob2xkIFNITl9NSVBTX0FDT01NT04gc3ltYm9scy4KLQkobWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcpOiBIYW5kbGUgU0hOX01JUFNfQUNPTU1PTiBzeW1ib2xzIGJ5Ci0JcHV0dGluZyB0aGVtIGFsbCBpbiBhIGdsb2JhbCAuYWNvbW1vbiBzZWN0aW9uLgotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IERvbid0IGR1bXAgY29yZSBpZiB0YXJnZXQKLQlzZWN0aW9uIGhhcyBubyBFTEYgc2VjdGlvbiBkYXRhLgotCShlbGZfbWFrZV9zZWN0aW9ucyk6IFNldCBhZGRyYWxpZ24gb2YgcmVsb2Mgc2VjdGlvbiB0byA0LgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6CURvbid0IGNvbnNpZGVyIHNlY3Rpb24gMC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBEb24ndCBjb25zaWRlciBzZWN0aW9uIDAuCi0JSW4gdGhlIG1haW4gbG9vcCwgc2tpcCB0aGUgc3ltdGFiIGFuZCBzdHJ0YWIgc2VjdGlvbnMsIHNpbmNlIHRoZWlyCi0JcG9zaXRpb25zIGFyZSBzZXQgZWxzZXdoZXJlLgotCShzd2FwX291dF9zeW1zKTogU2V0IGFkZHJhbGlnbiBvZiBzeW10YWIgc2VjdGlvbiB0byA0LiAgU2V0Ci0JYWRkcmFsaWduIG9mIHN0cnRhYiBzZWN0aW9ucyB0byAxLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyk6IERvbid0IGNvbnNpZGVyIHNlY3Rpb24gMC4KLQkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3Qgd3JpdGUgb3V0IHNlY3Rpb24gMC4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkZWQgZmllbGRzCi0JZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCBhbmQgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4KLQkqIGVsZjMyLXRhcmdldC5oIChlbGYzMl9iZWQpOiBBZGRlZCBjb3JyZXNwb25kaW5nIGluaXRpYWxpemVycy4KLQkqIGVsZjY0LXRhcmdldC5oIChlbGY2NF9iZWQpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoc3ltX2lzX2dsb2JhbCk6IFRha2UgYWJmZCBhcmd1bWVudC4gIENhbGwKLQllbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsIGlmIGl0IGlzIG5vdCBOVUxMLgotCShlbGZfbWFwX3N5bWJvbHMpOiBQYXNzIGFiZmQgdG8gc3ltX2lzX2dsb2JhbC4KLQkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2FsbCBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0JaWYgaXQgaXMgZGVmaW5lZC4KLQotV2VkIE5vdiAxNyAxODo0MzoyOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmVjb2ZmLmg6IEluY2x1ZGUgY29mZi9lY29mZi5oLgotCShzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhKTogTW92ZSBleHRlcm5hbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLQlmaWVsZHMgaW50byBhIHNpbmdsZSBmaWVsZCBwb2ludGluZyB0byBhbiBlY29mZl9kZWJ1Z19zd2FwCi0Jc3RydWN0dXJlLgotCShlY29mZl9kYXRhX3R5cGUpOiBNb3ZlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmaWVsZHMgaW50byBhIHNpbmdsZQotCWZpZWxkIHBvaW50aW5nIHRvIGFuIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLgotCSogY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYywgZWNvZmYuYzogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1XZWQgTm92IDE3IDE3OjM4OjU4IDE5OTMgIFNlYW4gRXJpYyBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQotCi0JKiBubG1zd2FwLmg6IE5ldyBmaWxlIHRvIHN3YXAgZml4ZWQgaGVhZGVyLiAgSW5jbHVkZWQgYnkgTkxNCi0JYmFja2VuZHMuCi0JKiBsaWJubG0uaCAoc3RydWN0IHJlbG9jX2FuZF9zZWMpOiBEZWZpbmUuCi0JKHN0cnVjdCBubG1fYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkcyBmaXhlZF9oZWFkZXJfc2l6ZSwKLQlubG1fcmVhZF9pbXBvcnQsIG5sbV93cml0ZV9pbXBvcnQsIG5sbV9zd2FwX2ZoZHJfaW4sCi0JbmxtX3N3YXBfZmhkcl9vdXQuCi0JKG5sbV9maXhlZF9oZWFkZXJfc2l6ZSwgbmxtX3JlYWRfaW1wb3J0X2Z1bmMsCi0JbmxtX3dyaXRlX2ltcG9ydF9mdW5jLCBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW5fZnVuYywKLQlubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0X2Z1bmMsIG5sbV93cml0ZV9leHRlcm5hbF9mdW5jKTogTmV3Ci0JYWNjZXNzb3IgbWFjcm9zLgotCSogbmxtY29kZS5oOiBVc2UgbmV3IGZ1bmN0aW9ucy4KLQkqIG5sbTMyLWkzODYuYzogUHJvdmlkZSBuZXcgZnVuY3Rpb25zLgotCSogbmxtMzItc3BhcmMuYzogTmV3IGZpbGU7IFNQQVJDIE5MTSBiYWNrZW5kLgotCi1XZWQgTm92IDE3IDEzOjU2OjEwIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogaTM4Nmx5bnguYyAoc3dhcF9zdGRfcmVsb2NfaW4sIHN3YXBfZXh0X3JlbG9jX2luKTogSWdub3JlCi0JZ2FyYmFnZSBiaXRzIGFwcGVhcmluZyBpbiB0aGUgdXBwZXIgZW5kIG9mIHN5bWJvbG51bXMuCi0KLQkqIGNvbmZpZy9zcGFyYy1seW54Lm10IChUREVGSU5FUyk6IEFkZCAtREZQUklOVEZfQUxSRUFEWV9ERUNMQVJFRC4KLQotVHVlIE5vdiAxNiAxNzowMzo0MSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBseW54LWNvcmUuYyAobHlueF9jb3JlX2ZpbGVfcCk6ICBDaGFuZ2UgYmZkX3phbGxvYyB0byBiZmRfYWxsb2MuCi0JKiBtNjhrbHlueC5jOiAgRGVmaW5lIGNvcmUgZmlsZSBtYWNyb3MuCi0JKiBob3N0cy9pMzg2bHlueC5oLCBob3N0cy9tNjhrbHlueC5oLCBob3N0cy9seW54Lmg6ICBNb3ZlIGFsbAotCW5vbi1hcmNoaXRlY3R1cmUgc3BlY2lmaWMgc3R1ZmYgaW50byBseW54LmguCi0KLVR1ZSBOb3YgMTYgMTU6NDU6NTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGkzODZsaW51eC5jOiBEZWZpbmUgbmV3IG1hY3JvIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgdG8gMTAyNCwgYW5kCi0JY2hhbmdlIFBBR0VfU0laRSB0byA0MDk2LgotCi1Nb24gTm92IDE1IDExOjQ4OjA4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQuCi0KLQkqIFZFUlNJT046IFVwZGF0ZWQuCi0KLVN1biBOb3YgMTQgMjM6MzM6MDEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogRG8gbm90IGNyZWF0ZSBkdW1teSAiLnRleHQiLCAiLmRhdGEiLAotCWFuZCAiLmJzcyIgc2VjdGlvbnMuCi0JKHNldHVwX3NlY3Rpb25zKTogRG8gbm90IHNldCBTRUNfSEFTX0NPTlRFTlRTIGlmIGEgc2VjdGlvbidzIHNpemUKLQlpcyB6ZXJvLiAgUmVjb2duaXplIEJTUyB0eXBlIHNlY3Rpb25zIGFuZCB0dXJuIG9mZiBTRUNfTE9BRCBhbmQKLQlTRUNfREFUQSAoc28gYmludXRpbHMvc2l6ZSB3b3JrcykuICBTZXQgdGhlIGNvcnJlY3QgdmFsdWUgZm9yCi0JYSBzZWN0aW9uJ3MgX3Jhd19zaXplLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogUHJvZ3JhbSBlbnRyeSBwb2ludHMsIGFuZCBtaWxsaWNvZGUgYXJlCi0JYWxzbyBmdW5jdGlvbnMuICBNYXJrIHRoZW0gYXMgc3VjaC4gIEFsc28gbWFyayBMJCogc3ltYm9scyBhcwotCWRlYnVnZ2luZyBzeW1ib2xzLgotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLVNhdCBOb3YgMTMgMTU6Mjc6MTUgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIG1pc3NpbmcgcHJvdG90eXBlLiAgUmV0dXJucwotCWEgcG9pbnRlciB0byBjb25zdGFudCBkYXRhLiAgRGVsZXRlIGJvZ3VzICNkZWZpbmUgd2hpY2ggbWFkZSB0aGUgCi0JZnVuY3Rpb24gdXNlbGVzcy4KLQotCSogc29tLmMgKHNvbV9wcmVwX2Zvcl9maXh1cHMpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV93cml0ZV9maXh1cHMpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV93cml0ZV9zcGFjZV9zdHJpbmdzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9iZWdpbl93cml0aW5nKTogTmV3IGZ1bmN0aW9uLgotCi1GcmkgTm92IDEyIDE1OjI5OjM2IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvIG5vdCBhYm9ydC4gIEZsZXNoIG91dC4KLQkoc29tX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRG8gbm90IGFib3J0LiAgRmxlc2ggb3V0LgotCi0JKiBzb20uYyAoc29tX3dyaXRlX2hlYWRlcnMpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9wcmVwX2hlYWRlcnMpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9idWlsZF9hbmRfd3JpdGVfc3ltYm9sX3RhYmxlKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzb20uYyAoc29tX3NpemVvZl9oZWFkZXJzKTogQWRkIG1pc3NpbmcgcHJvdG90eXBlLgotCShzb21fc2V0X2FyY2hfbWFjaCk6IERvIG5vdCBhYm9ydC4KLQotCSogc29tLmMgKHNvbV9jb3VudF9zcGFjZXMpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9jb3VudF9zdWJzcGFjZXMpOiBOZXcgZnVuY3Rpb24uCi0JKGNvbXBhcmVfc3ltcyk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2NvbXB1dGVfY2hlY2tzdW0pOiBOZXcgZnVuY3Rpb24uCi0KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQotCSogc29tLmMgKHRyeV9wcmV2X2ZpeHVwKTogTmV3IGZ1bmN0aW9uLgotCShzb21fcmVsb2Nfc2tpcCk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3JlbG9jX2FkZGVuZCk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3JlbG9jX2NhbGwpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIHNvbS5jIChzb21faW5pdGlhbGl6ZV9yZWxvY19xdWV1ZSk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3JlbG9jX3F1ZXVlX2luc2VydCk6IExpa2V3aXNlLgotCShzb21fcmVsb2NfcXVldWVfZml4KTogTGlrZXdpc2UuCi0JKHNvbV9yZWxvY19xdWV1ZV9maW5kKTogTGlrZXdpc2UuCi0KLQkqIHNvbS5jIChzb21faHBwYV9ob3d0b190YWJsZSk6IFNPTSBob3d0byByZWxvY2F0aW9uIHRhYmxlLgotCShocHBhX3NvbV9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQotCSogc29tLmMgKHN0cnVjdCByZWxvY19xdWV1ZSk6IE5ldyBzdHJ1Y3R1cmUgdG8ga2VlcCB0cmFjayBvZgotCXRoZSBsYXN0IGZvdXIgbXVsdGlieXRlIHJlbG9jYXRpb25zIGVtaXR0ZWQuCi0JKGVudW0gcGFfc3ltYm9sX3R5cGUpOiBUeXBlIHRvIGZ1bGx5IGRlc2NyaWJlIHRoZSBzeW1ib2wgdHlwZXMKLQlhc3NvY2lhdGVkIHdpdGggLmltcG9ydC8uZXhwb3J0IGFzc2VtYmxlciBkaXJlY3RpdmVzLgotCi0JKiBzb20uYzogSW5jbHVkZSBsaWJocHBhLmgKLQotCSogc29tLmMgKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzKTogTGlrZXdpc2UuCi0JKGJmZF9zb21fc2V0X3N5bWJvTF90eXBlKTogTGlrZXdpc2UuCi0JKGJmZF9zb21fYXR0YWNoX3Vud2luZF9pbmZvKTogTGlrZXdpc2UuCi0JKiBzb20uaDogRGVjbGFyZSBuZXcgZXhwb3J0ZWQgZnVuY3Rpb25zLgotCi0JKiBzb20uaCAoc3RydWN0IHNvbV9zeW1ib2wpOiBBZGQgbmV3IGZpZWxkcyB0byBob2xkIGFkZGl0aW9uYWwKLQlpbmZvcm1hdGlvbiBuZWVkZWQgdG8gYnVpbGQvd3JpdGUgc3ltYm9sIHRhYmxlcyBhbmQgZml4dXAgc3RyZWFtcy4KLQkoc3RydWN0IHNvbV9zZWN0aW9uX2RhdGFfc3RydWN0KTogQWRkIG5ldyBmaWVsZHMgdG8gaG9sZCBhZGRpdGlvbmFsCi0JaW5mb3JtYXRpb24gbmVlZGVkIHRvIGJ1aWxkL3dyaXRlIHNwYWNlIGFuZCBzdWJzcGFjZSBoZWFkZXJzLgotCShzb21fc3ltYm9sX2RhdGEpOiBOZXcgYWNjZXNzb3IgbWFjcm8gZm9yIFNPTSBzeW1ib2wgaW5mb3JtYXRpb24uCi0JKFJfSFBQQV8qKTogQmFzaWMgcmVsb2NhdGlvbiB0eXBlcyB0byBiZSB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIuCi0KLUZyaSBOb3YgMTIgMTE6MDA6MjggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBJZiBuZXcgaG9vawotCVRSQURfQ09SRV9BTExPV19BTllfRVhUUkFfU0laRSBkZWZpbmVkLCB0aGVuIHNraXAgdGhlIGNoZWNrIGZvciB0aGUKLQljb3JlZmlsZSBiZWluZyB0b28gYmlnLgotCSogaG9zdHMvaTM4NnNjby5oOiBEZWZpbmUgaXQuCi0KLVRodSBOb3YgMTEgMTU6MTY6MjggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZCBocHBhYnNkX2NvcmVfZGF0YS4KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IEFkZCBocHBhYnNkX2NvcmVfdmVjLgotCSogaHB1eC1jb3JlLmMgKGhwdXhfY29yZV9jb3JlX2ZpbGVfcCk6IEZhaWwgaWYgYW4gdW5rbm93biBjb3JlCi0Jc2VjdGlvbiBpcyBlbmNvdW50ZXJlZCBkdXJpbmcgY29yZSBzZWN0aW9uIHNjYW5uaW5nLgotCSogaHBwYWJzZC1jb3JlLmM6IE5ldyBmaWxlLgotCSogY29uZmlnL2hwcGFic2QubWg6IEVuYWJsZSBIUFBBIEJTRCBjb3JlIGZpbGVzLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3JlbG9jKTogUmVtb3ZlIERFRlVOIGNydWQuICBSZW1vdmUgY29kZQotCXdoaWNoIGlzIGVpdGhlciBjb21tZW50ZWQgb3V0IG9yIGlmZGVmJ2Qgb3V0LiAgQWRkLCB1cGRhdGUgYW5kCi0JY2xlYW4gY29tbWVudHMuICBGaXggdmFyaW91cyBpbmRlbnRpb24gYW5kIHNwYWNpbmcgcHJvYmxlbXMuICBIYW5kbGUKLQlwcm9ibGVtcyByZWxhdGVkIHRvIHVzaW5nICJibGUiIHRvIGp1bXAgdG8gYSBzdHViIHJhdGhlciB0aGFuICJibCIKLQkoJXIzMSBpcyB0cmFzaGVkIGJ5ICJibGUiLCBidXQgbm90IGJ5ICJibCIpLgotCShORVdfSU5TVFJVQ1RJT04pOiBQdXQgaW5zaWRlIGN1cmx5IGJyYWNlcy4KLQkoQ1VSUkVOVF9TVFVCX09GRlNFVCk6IEZpeCBpbmRlbnRpb24gcHJvYmxlbXMuCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogRml4IGluZGVudGlvbiBhbmQgc3BhY2luZyBwcm9ibGVtcy4KLQlBZGQsIHVwZGF0ZSBhbmQgY2xlYW4gY29tbWVudHMuICBIYW5kbGUgImJsZSIgJXIzMSBsb3NzYWdlIHByb2JsZW1zLgotCShocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogTGlrZXdpc2UuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IExpa2V3aXNlLgotCShocHBhX2VsZl9zdHViX2NoZWNrKTogUmVtb3ZlIG9ic29sZXRlIGZ1bmN0aW9uLgotCi0JKiBocHBhX3N0dWJzLmg6IEFkZCBuZXcgaW5zdHJ1Y3Rpb25zIHRvIGRlYWwgd2l0aCAlcjMxIGxvc3NhZ2UKLQlwcm9ibGVtcy4gIERlbGV0ZSB1bnVzZWQgaW5zdHJ1Y3Rpb25zLgotCQotVHVlIE5vdiAgOSAxMTo0MDoyNyAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIG02OGtseW54LmMgKFRBUkdFVF9JU19CSUdfRU5ESUFOX1ApOiBEZWZpbmUuCi0KLVR1ZSBOb3YgIDkgMTE6MjY6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IFJhdGhlciB0aGFuIGxvb2tpbmcgdGhyb3VnaCBhbiBhcnJheQotCW9mIGFyY2hpdGVjdHVyZXMsIGdldCB0aGUgRUxGIEVNX3h4eCBjb2RlIGZyb20gdGhlIGJhY2tlbmQKLQlpbmZvcm1hdGlvbi4gIExldCB0aGUgZ2VuZXJpYyBFTEYgdGFyZ2V0IG1hdGNoIGFueSBFTV94eHggY29kZSBub3QKLQltYXRjaGVkIGJ5IGFub3RoZXIgRUxGIHRhcmdldC4gIENhbGwgZWxmX2JhY2tlbmRfb2JqZWN0X3AgdG8gbGV0Ci0JdGhlIGJhY2tlbmQgZG8gbW9yZSBjaGVja3MgYW5kIHNldCBnbG9iYWwgaW5mb3JtYXRpb24uCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGRlZCBlbGZfbWFjaGluZV9jb2RlIGFuZAotCWVsZl9iYWNrZW5kX29iamVjdF9wIGZpZWxkcy4KLQkoc3RydWN0IGJmZF9lbGZfYXJjaF9tYXApOiBSZW1vdmVkLgotCShiZmRfZWxmX2FyY2hfbWFwLCBiZmRfZWxmX2FyY2hfbWFwX3NpemUpOiBEb24ndCBkZWNsYXJlLgotCSogZWxmMzItdGFyZ2V0LmgsIGVsZjY0LXRhcmdldC5oOiBJbml0aWFsaXplIGVsZl9tYWNoaW5lX2NvZGUKLQlmaWVsZCB3aXRoIEVMRl9NQUNISU5FX0NPREUuICBJbml0aWFsaXplIGVsZl9iYWNrZW5kX29iamVjdF9wCi0JZmllbGQgd2l0aCBlbGZfYmFja2VuZF9vYmplY3RfcCAoaWYgaXQgaXMgZGVmaW5lZCkuCi0JKiBlbGYzMi1nZW4uYywgZWxmMzItaHBwYS5jLCBlbGYzMi1pMzg2LmMsIGVsZjMyLWk4NjAuYywKLQllbGYzMi1tNjhrLmMsIGVsZjMyLW04OGsuYywgZWxmMzItbWlwcy5jLCBlbGYzMi1zcGFyYy5jLAotCWVsZjY0LWdlbi5jIChFTEZfTUFDSElORV9DT0RFKTogRGVmaW5lZC4KLQkqIGVsZjMyLW1pcHMuYzogSW5jbHVkZSBlY29mZnN3YXAuaCB0byBnZXQgRUNPRkYgc3dhcHBpbmcKLQlyb3V0aW5lcy4KLQkobWlwc19lbGZfb2JqZWN0X3ApOiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyLgotCShtaXBzX2VsZl9lY29mZl9kZWJ1Z19zd2FwKTogRGVmaW5lZC4KLQkoZWxmX2JhY2tlbmRfb2JqZWN0X3ApOiBEZWZpbmVkIHRvIGJlIG1pcHNfZWxmX29iamVjdF9wLgotCShlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwKTogRGVmaW5lZCB0byBiZQotCW1pcHNfZWxmX2Vjb2ZmX2RlYnVnX3N3YXAuCi0JKiBlbGYuYyAoYmZkX2VsZl9hcmNoX21hcCwgYmZkX2VsZl9hcmNoX21hcF9zaXplKTogUmVtb3ZlZC4KLQotCSogbGliYmZkLWluLmggKHRhcmdldF92ZWN0b3IsIGRlZmF1bHRfdmVjdG9yKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogZm9ybWF0LmMgKHRhcmdldF92ZWN0b3IsIGRlZmF1bHRfdmVjdG9yKTogRG9uJ3QgZGVjbGFyZS4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19ob3d0b190YWJsZSk6IERvbid0IGNvbXBsYWluIG9uIG92ZXJmbG93Ci0JZm9yIFJfTUlQU18yNi4gIENvcnJlY3Qgb3ZlcmZsb3cgZGV0ZWN0aW9uIHJlcXVpcmVzIG1hdGNoaW5nIHRoZQotCXVwcGVyIGZvdXIgYml0cyBvZiB0aGUgZGVzdGluYXRpb24gYWdhaW5zdCB0aGUgUEMuICBGcm9tIFRlZCBMZW1vbgotCTxtZWxsb25AcGVwcGVyLm5jZC5jb20+LgotCi0JKiBib3V0LmMgKGJfb3V0X3JlbG9jX3R5cGVfbG9va3VwKTogUmV0dXJuIHR5cGUgc2hvdWxkIHBvaW50IHRvCi0JY29uc3QgZGF0YS4KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NfdHlwZV9sb29rdXApOiBMaWtld2lzZS4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXApOiBMaWtld2lzZS4KLQkqIG1pcHNic2QuYyAoTVkocmVsb2NfaG93dG9fdHlwZV9sb29rdXApKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jKTogTWFkZSBob3d0byBjb25zdC4KLQkqIG9hc3lzLmMgKG9hc3lzX3dyaXRlX2RhdGEpOiBNYWRlIGhvdyBjb25zdC4KLQotCSogbGliZWxmLmg6IEFkZGVkIHNvbWUgY29tbWVudHMuCi0JKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkZWQgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcAotCWZpZWxkLiAgUmVtb3ZlZCB1bnVzZWQgd3JpdGVfcmVsb2NzIGZpZWxkLgotCSogZWxmMzItdGFyZ2V0Lmg6IEFkanVzdGVkIGVsZl9iYWNrZW5kX2RhdGEgaW5pdGlhbGl6YXRpb24KLQlhY2NvcmRpbmdseS4KLQkqIGVsZjY0LXRhcmdldC5oOiBDb3JyZWN0ZWQgZWxmX2JhY2tlbmRfZGF0YSBpbml0aWFsaXphdGlvbiB0bwotCWZpbGwgaW4gYWxsIGZpZWxkcyBhbmQgdG8gc2V0IGVsZl82NF9wIHRvIDEuCi0KLU1vbiBOb3YgIDggMTg6MTM6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFJlbW92ZSBkdXBsaWNhdGUgYXNzaWdubWVudAotCXRvIGZpbGVwb3MgaW4gU0hUX1NUUlRBQiBjYXNlLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbik6IFNldCBCRkQgc2VjdGlvbiBmaWxlcG9zIGFzCi0Jd2VsbCBhcyBFTEYgc2VjdGlvbiBzaF9vZmZzZXQuCi0KLQkqIHJlbG9jLmM6IFVzZSBjb25zdCBpbnN0ZWFkIG9mIENPTlNULgotCShiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogTWFrZSB2YXJpYWJsZSBob3d0byBhIGNvbnN0IHBvaW50ZXIuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1Nb24gTm92ICA4IDEyOjE5OjE1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAocmVhbGNsZWFuKTogRG9uJ3QgcmVtb3ZlIGdlbmVyYXRlZCBoZWFkZXJzLiAgUmV2ZXJ0cwotCWNoYW5nZSBvZiAyIEp1bCAxOTkzLgotCi1Nb24gTm92ICA4IDA2OjA4OjMxIDE5OTMgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5iZmQ6IG1ha2UgdW5peHdhcmUgZXF1aXZhbGVudCB0byBzeXN2NC4KLQotCSogY29uZmlnL2kzODYtbmxtLm10OiBicmluZyBpbiBlbGYgY29uZmlnOyBtYWtlIGl0IHRoZSBkZWZhdWx0LgotCi1TdW4gTm92ICA3IDIwOjIxOjM4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBsaWJiZmQuYyAoYmZkX3B1dF84KTogQWRkIHBhcmVucyBhcm91bmQgcmVmZXJlbmNlIHRvICJ2YWwiCi0JYXJndW1lbnQuCi0KLUZyaSBOb3YgIDUgMjE6NDU6MDkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2bWFjaDMuaCAoSE9TVF9TRUdNRU5UX1NJWkUpLAotCWkzODZtYWNoMy5jIChTRUdNRU5UX1NJWkUsIFRFWFRfU1RBUlRfQUREUik6IENvcnJlY3QgdmFsdWVzICg/KS4KLQotRnJpIE5vdiAgNSAxNToxNzo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogWmVybyBvdXQgaW50ZXJuYWxfYS4KLQotRnJpIE5vdiAgNSAxMDo0MTowNyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmgsIGFyY2hpdmUuYywgYXJjaHVyZXMuYywgYmZkLmMsIGNhY2hlLmMsIGNvZmZjb2RlLmgsCi0JY29yZS5jLCBjdG9yLmMsIGZvcm1hdC5jLCBpbml0LmMsIGxpYmJmZC5jLCBvcG5jbHMuYywgcmVsb2MuYywKLQlzZWN0aW9uLmMsIHN5bXMuYywgdGFyZ2V0cy5jOgotCURvYyBjbGVhbnVwIChzcGVsbGluZywgcHVuY3R1YXRpb24sIGdyYW1tYXIsIGZvcm1hdHRpbmcpLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotVGh1IE5vdiAgNCAxNDo0NjoxNCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAcnRsLmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIChiZmRfZ2V0X2NhY2hlYWJsZSwgYmZkX3NldF9jYWNoZWFibGUpOiAgTmV3IGFjY2Vzc29ycy4KLQkqIGJmZC5jLCBvcG5jbHMuYzogIEltcHJvdmUgY29tbWVudHMgb24gZmlsZSBkZXNjcmlwdG9yIGNhY2hlaW5nLgotCi1UaHUgTm92ICA0IDA4OjU0OjMwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBGcm9tIFBldGUgSG9vZ2VuYm9vbSAoaG9vZ2VuQGNzLnV0YWguZWR1KQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IEZpeCBsb2dpYyBlcnJvcgotCWluIGxhc3QgY2hhbmdlLiAgQWx3YXlzIHJlYnVpbGQgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uIHRoZSBmaXJzdAotCXRpbWUgdGhvdWdoIGlmIG91dHB1dCBzZWN0aW9ucyBleGlzdCAoZml4ZXMgbGQgLXIgcHJvYmxlbXMpLgotCi1UaHUgTm92IDA0IDA4OjA4OjQ2IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgLlBIT05ZIGZvciBjaGVjayBhbmQgaW5zdGFsbGNoZWNrIHJ1bGVzLgotCi1UdWUgTm92ICAyIDE0OjQyOjI3IDE5OTMgIEJpbGwgQ294IChiaWxsQHRhcmthcy5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQtaW4uaCAoYXJ0ZGF0YSk6IFVzZSBsb25nLCBub3QgdGltZV90IGZvciBwb3J0YWJpbGl0eSwgYXQKLQkgIGxlYXN0IHRvIEhQVVguICBGaWxlIGJlbG93IGlzIGEgZGVyaXZlZCBmaWxlLgotCi1UdWUgTm92ICAyIDE0OjQyOjI3IDE5OTMgIEJpbGwgQ294IChiaWxsQHRhcmthcy5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQuaCAoYXJ0ZGF0YSk6IFVzZSBsb25nLCBub3QgdGltZV90IGZvciBwb3J0YWJpbGl0eSwgYXQKLQkgIGxlYXN0IHRvIEhQVVguCi0KLVR1ZSBOb3YgIDIgMDk6MzI6MjUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IFVzZSBiaWdtaXBzIGZvciBtaXBzKi0qLWJzZCouCi0KLU1vbiBOb3YgIDEgMTQ6MzA6MDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY2FfdGFibGUsIGVsZl9zbHVycF9yZWxvY190YWJsZSk6Ci0JSGFuZGxlIHN5bWJvbCBudW1iZXIgb2YgemVyby4KLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogQWRkZWQKLQlCRkRfUkVMT0NfTUlQU19MSVRFUkFMLCBCRkRfUkVMT0NfTUlQU19HT1QxNiwKLQlCRkRfUkVMT0NfTUlQU19DQUxMMTYsIEJGRF9SRUxPQ19NSVBTX0dQUkVMMzIuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUKLQlCRkRfUkVMT0NfTUlQU19MSVRFUkFMLgotCSogZWxmMzItbWlwcy5jIChtaXBzX3JlbG9jX21hcCk6IEhhbmRsZSBuZXcgcmVsb2NzLgotCShtaXBzX2VsZl9oaTE2X3JlbG9jLCBtaXBzX2VsZl9sbzE2X3JlbG9jKTogUmVhcnJhbmdlIF9ncF9kaXNwCi0JY2hlY2tzIHNsaWdodGx5LgotCi0JKiBhb3V0LXRhcmdldC5oIChNWV9iZmRfZGVidWdfaW5mb19zdGFydCwgTVlfYmZkX2RlYnVnX2luZm9fZW5kLAotCU1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdCBbc2ljXSk6IFJlbW92ZSB1bnVzZWQgZGVmaW5pdGlvbnMuCi0JKE1ZX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMsIE1ZX2JmZF9yZWxheF9zZWN0aW9uLAotCU1ZX2JmZF9zZWNsZXRfbGluayk6IERlZmluZS4KLQkoTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogUmVuYW1lIGZyb20KLQlNWV9yZWxvY19ob3d0b190eXBlX2xvb2t1cC4KLQkoTVlfYmZkX21ha2VfZGVidWdfc3ltYm9sKTogUmVuYW1lIGZyb20gTVlfbWFrZV9kZWJ1Z19zeW1ib2wuCi0JKE1ZKHZlYykpOiBVc2UgSlVNUF9UQUJMRSByYXRoZXIgdGhhbiBsaXN0aW5nIGZ1bmN0aW9ucy4KLQkqIGhwMzAwaHB1eC5jIChNWV9nZXRfc3ltdGFiLCBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLAotCU1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYywgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgZGVmaW5lIGluCi0JdGVybXMgb2YgTVksIGJlY2F1c2UgdGhhdCBjYXVzZXMgYSByZWN1c2l2ZSBpbnZvY2F0aW9uIG9mIENBVCB3aGVuCi0JZXhwYW5kZWQgd2l0aGluIEpVTVBfVEFCTEUsIGFuZCBBTlNJIGNvbXBpbGVycyBkb24ndCBleHBhbmQKLQlyZWN1cnNpdmUgbWFjcm9zLgotCSogbWlwc2JzZC5jIChNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBSZW5hbWUgZnJvbQotCU1ZX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwLCBhbmQgZG9uJ3QgZGVmaW5lIGluIHRlcm1zIG9mIE1ZLgotCShNWV9jYW5vbmljYWxpemVfcmVsb2MpOiBEb24ndCBkZWZpbmUgaW4gdGVybXMgb2YgTVkuCi0JKGFvdXRfbWlwc19saXR0bGVfdmVjLCBhb3V0X21pcHNfYmlnX3ZlYyk6IFVzZSBKVU1QX1RBQkxFIHJhdGhlcgotCXRoYW4gbGlzdGluZyBmdW5jdGlvbnMuCi0KLU1vbiBOb3YgIDEgMDk6MTI6MjUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IFVzZSBtNjhrLWVsZiBmb3IgbTY4Ki0qLXN5c3Y0Ki4KLQotU3VuIE9jdCAzMSAwOTozNTo0OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jOiBNb3ZlIGVudW0gdGFyZ2V0X2ZsYXZvdXIgb3V0c2lkZSBvZiBzdHJ1Y3QgYW5kIGNoYW5nZQotCXRoZSBuYW1lIHRvIGVudW0gYmZkX2ZsYXZvdXIuICBUaGlzIG1lYW5zIGJmZCBjbGllbnRzIGNhbiB1c2UgaXQuCi0JKiBiZmQtaW4uaDogQWRkIG1hY3JvIGJmZF9nZXRfZmxhdm91ci4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogc29tLmM6IEFkZCBjb21tZW50IGFib3V0IGhvdyBhYm9ydCgpIG9uIGNvcnJ1cHQgZXhlY3V0YWJsZSBpcyBldmlsLgotCi1TYXQgT2N0IDMwIDEyOjI3OjA5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dCxzbHVycF9yZWxvY190YWJsZSk6IEF2b2lkIGEgZ290by4KLQotRnJpIE9jdCAyOSAxNjowNDozMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGdlbi1hb3V0LmMsIGxpYmJmZC5jOiBleGl0KDEpIGluc3RlYWQgb2YgZXhpdCgtMSkuCi0KLUZyaSBPY3QgMjkgMTM6MTc6MjEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogQWRkZWQgY29tbWFuZHMgZm9yIG9iamVjdCBmaWxlIGZsYWcgdmFsdWVzLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBJZiB0eXBlIGlzIEVUX0RZTiwgc2V0IERZTkFNSUMgZmxhZywKLQlub3QgRVhFQ19QLgotCSogYm91dC5jLCBjb2ZmLWg4MzAwLmMsIGNvZmYtc2guYzogQWRkIEJGRF9JU19SRUxBWEFCTEUgdG8KLQlvYmplY3RfZmxhZ3MgZmllbGQgZm9yIHRhcmdldCB2ZWN0b3IuCi0JKiBhaXgzODYtY29yZS5jLCBhb3V0LWFkb2JlLmMsIGFvdXQtdGFyZ2V0LmgsIGJvdXQuYywgY29mZi1hMjlrLmMsCi0JY29mZi1hbHBoYS5jLCBjb2ZmLWFwb2xsby5jLCBjb2ZmLWg4MzAwLmMsIGNvZmYtaDg1MDAuYywKLQljb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jLCBjb2ZmLW04OGsuYywgY29mZi1taXBzLmMsCi0JY29mZi1yczYwMDAuYywgY29mZi1zaC5jLCBjb2ZmLXdlMzJrLmMsIGNvZmYtejhrLmMsIGhwdXgtY29yZS5jLAotCWllZWUuYywgbWlwc2JzZC5jLCBubG0tdGFyZ2V0LmgsIG9hc3lzLmMsIG9zZi1jb3JlLmMsIHNvbS5jLAotCXNyZWMuYywgdGVraGV4LmMsIHRyYWQtY29yZS5jOglSZW1vdmUgRFlOQU1JQyBmcm9tIG9iamVjdF9mbGFncwotCWZpZWxkIGZvciB0YXJnZXQgdmVjdG9yLgotCi1UaHUgT2N0IDI4IDIwOjAyOjMxIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaDogRG9uJ3QgZGVjbGFyZSB0aW1lOyBjYXVzZXMgZXJyb3Igb24gbWFjaDMuCi0JKiBjb25maWd1cmUuaW4gKGkzODZtYWNoM192ZWMpOiBSZXF1aXJlIGFvdXQzMi5vIHN0YWItc3ltcy5vLgotCi1UaHUgT2N0IDI4IDE2OjMzOjI2IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCUx5bnhPUyBhbmQgU3BhcmMgTHlueE9TIGNoYW5nZXM6Ci0JKiBjb25maWcuYmZkOiBSZWNvZ25pemUgc3BhcmMtKi1seW54b3MqLgotCSogY29uZmlndXJlLmhvc3Q6IFJlY29nbml6ZSBzcGFyYy0qLWx5bnhvcyouCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBTcGFyYyBMeW54IHZlY3RvcnMuCi0JKiB0YXJnZXRzLmMgKHNwYXJjbHlueF9hb3V0X3ZlYyk6IERlY2xhcmUuCi0JKHNwYXJjbHlueF9jb2ZmX3ZlYyk6IERlY2xhcmUuCi0JKHRhcmdldF92ZWN0b3IpOiBBZGQgdGhlbS4KLQkqIGNmLWkzODZseW54LmM6IE5ldyBmaWxlLCByZW5hbWVkIGZyb20gaTM4Nmx5bngtY2YuYy4KLQkqIGNmLW02OGtseW54LmM6IE5ldyBmaWxlLCByZW5hbWVkIGZyb20gbTY4a2x5bngtY2YuYy4KLQkqIGNmLXNwYXJjbHlueC5jOiBOZXcgZmlsZSwgc3VwcG9ydCBmb3IgY29mZiBpbiBTcGFyYyBMeW54T1MuCi0JKiBjb2ZmLXNwYXJjLmM6IE5ldyBmaWxlLCBiYXNpYyBTcGFyYyBjb2ZmIHN1cHBvcnQuCi0JKiBzcGFyY2x5bnguYzogTmV3IGZpbGUsIHN1cHBvcnQgZm9yIGEub3V0IGluIFNwYXJjIEx5bnhPUy4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgZmlsZW5hbWVzIGFwcHJvcHJpYXRlbHksIGFkZCBTcGFyYyBydWxlcy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogUmVjb2duaXplIFNwYXJjIG1hZ2ljCi0JbnVtYmVyLgotCShjb2ZmX3NldF9mbGFncyk6IFVzZSBMeW54T1MgbWFnaWMgbnVtYmVyIGZvciBpMzg2LCBtNjhrLCBhbmQKLQlTcGFyYyBMeW54T1MsIHNldCBTcGFyYyBtYWdpYyBudW1iZXIgZm9yIFNwYXJjcy4KLQkqIGNvbmZpZy9tNjhrLWx5bngubXQgKFNFTEVDVF9WRUNTKTogUmVtb3ZlIHJlZHVuZGFudCB2ZWN0b3IuCi0JKiBjb25maWcvc3BhcmMtbHlueC5tdDogTmV3IGZpbGUuCi0JKiBob3N0cy9pMzg2bHlueC5oOiBDb3NtZXRpYyBpbXByb3ZlbWVudHMuCi0JKiBob3N0cy9tNjhrbHlueC5oOiBBZGQgaWZkZWZzLCAjZGVmaW5lIG9mIGNmcmVlLgotCSogaG9zdHMvc3BhcmNseW54Lmg6IE5ldyBmaWxlLgotCi1UaHUgT2N0IDI4IDE2OjIzOjQwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCWdjYyAtV2FsbCBsaW50OgotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogRGVjbGFyZSByZXR1cm4gdHlwZS4KLQlSZW1vdmUgdXNlbGVzcyBzdGF0ZW1lbnQgcHJvYmFibHkgbGVmdCBieSBjb2RlIGNvcHkuCi0JKiBjcHUtaTk2MC5jIChjb21wYXRpYmxlKTogRnVsbHkgYnJhY2tldCBtYXRyaXggaW5pdGlhbGl6ZXIuCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogVXNlIGJmZF94bWFsbG9jCi0JcmF0aGVyIHRoYW4geG1hbGxvYy4gIFVzZSByZWFsbG9jIGFuZCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlCi0JcmF0aGVyIHRoYW4geHJlYWxsb2MuCi0JKGhwcGFfZWxmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogQWRkIHNvbWUgY2FzdHMuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogUmVtb3ZlIHVudXNlZAotCXZhcmlhYmxlLiAgQWRkIGRlZmF1bHQgY2FzZSB0byBzd2l0Y2guCi0JKiBocDMwMGhwdXguYzogRGVjbGFyZSBhb3V0XzMyX3dyaXRlX3N5bXMuCi0JKiBpMzg2YnNkLmMsIGkzODZsaW51eC5jLCBuZXRic2QzODYuYyAoTl9TSEFSRURfTElCKTogRGVmaW5lIGFzIDAKLQkoZGVmaW5pdGlvbiBmcm9tIGFvdXQvYW91dDY0LmggaXMgYWx3YXlzIDAgYW55aG93KS4KLQkqIGkzODZseW54LmMgKHN3YXBfc3RkX3JlbG9jX2luKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9pZCk6IGxlbmd0aCBjYW4gbmV2ZXIgYmUgbmVnYXRpdmUuCi0JKHJlYWRfaWQpOiBMaWtld2lzZS4KLQkoaWVlZV9hcmNoaXZlX3ApOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgotCSogbGliY29mZi1pbi5oIChiZmRfcGVyZm9ybV9zbGlwKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIG9hc3lzLmMgKG9hc3lzX3dyaXRlX3NlY3Rpb25zKTogUmVtb3ZlIHplcm8gaW5pdGlhbGl6YXRpb24gb2YKLQlzdGF0aWMgc3RydWN0dXJlLgotCSogcmVsb2MxNi5jOiBJbmRlbnRhdGlvbiBjaGFuZ2UuCi0KLVdlZCBPY3QgMjcgMTY6NTE6MjkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL2kzODYtbWFjaDMubXQ6IFVwZGF0ZSBmb3IgbmV3IGNvbmZpZ3VyYXRpb24KLQkoLS13aXRoLXRhcmdldHMJYW5kIHNvIG9uKS4KLQkqIGhvc3RzL2kzODZtYWNoMy5oOiBEZWNsYXJlIGVycm5vLgotCSogdGFyZ2V0cy5jOiBEZWNsYXJlIGkzODZtYWNoM192ZWMuCi0KLVdlZCBPY3QgMjcgMTI6MTg6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luLAotCW5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCk6IEhhbmRsZSBzaGFyZWREZWJ1Z1JlY29yZE9mZnNldAotCWFuZCBzaGFyZWREZWJ1Z1JlY29yZENvdW50IGZpZWxkcy4KLQotVHVlIE9jdCAyNiAxNjoyMToxMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogUmVtb3ZlIFNDT19DT1JFLiAgT24gU2VwIDExIDE5OTMsCi0Jd2Ugc3RhcnRlZCB1c2luZyB0cmFkLWNvcmUuYyBmb3IgU0NPIGluc3RlYWQuCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IFJlLWVuYWJsZSBnZW5lcmljIEVMRiBhbmQgTkxNIHRhcmdldHMuCi0KLVR1ZSBPY3QgMjYgMTY6NTM6MTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGFzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uKTogQWxpZ24gc2hfb2Zmc2V0IHRvCi0Jc2hfYWRkcmFsaWduICh0aGlzIGlzIHdoYXQgVW5peFdhcmUgZG9lcywgYW5kIGl0IHNob3VsZG4ndCBodXJ0KS4KLQotVHVlIE9jdCAyNiAxMDoxNjo1NCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCUZyb20gSmVmZiBMYXcgYW5kIFBldGUgSG9vZ2VuYm9vbSBhdCBVdGFoOgotCi0JKiBlbGYzMi1ocHBhLmggKGhwcGFfZWxmX3N0dWJfZmluaXNoKTogQWRkIHByb3RvdHlwZS4KLQkoRUxGMzJfSFBQQV9SX0FSR19SRUxPQyk6IFJlbmFtZWQgd2l0aG91dCB0aGUgRUxGMzIgcHJlZml4Ci0JYW5kIG1vdmVkIGludG8gbGliaHBwYS5oLiAgQWxsIHJlZmVyZW5jZXMgY2hhbmdlZC4KLQkoRUxGMzJfSFBQQV9SX0NPTlNUQU5ULCBFTEYzMl9IUFBBX1JfQURERU5EKTogTGlrZXdpc2UuCi0JKGdldF9vcGNvZGUgYW5kIG9wY29kZSBkZWZpbmVzKTogTW92ZSBpbnRvIGxpYmhwcGEuaAotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9pbnNuMmZtdCk6IFJlbmFtZSBhbmQgbW92ZSBpbmZvCi0JbGliaHBwYS5oLgotCSogbGliaHBwYS5oIChIUFBBX1JfKik6IE1vdmVkIGhlcmUuICBSZWZvcm1hdHRlZCBzbGlnaHRseSB0byBtYWtlCi0JZm9yIGVhc2llciByZWFkaW5nLgotCShnZXRfb3Bjb2RlKTogTW92ZWQgaGVyZS4gIEZJWE1FISB0aGlzIHJlYWxseSBzaG91bGQgYmUgYSBDIGZ1bmN0aW9uCi0JaW5zaWRlIHRoZSBvcGNvZGUgbGlicmFyeSEKLQkoYmZkX2hwcGFfaW5zbjJmbXQpOiBMaWtld2lzZS4KLQotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogRW5hYmxlIGVsZjMyLWhwcGEgdmVjdG9yLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogQWRkIG5ldyBjb21tZW50cwotCWFuZCBjbGFyaWZ5IGV4aXN0aW5nIGNvbW1lbnRzLiAgRG8gbm90IHVzZSBERUZVTiB0byBkZWNsYXJlIHRoaXMKLQlmdW5jdGlvbi4gIEZpeCBudW1lcm91cyBpbmRlbnRpb24gcHJvYmxlbXMuICBDb3JyZWN0bHkgaGFuZGxlIGNhc2VzCi0Jd2hlcmUgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uIG1heSBuZWVkIHRvIGJlIHJlYWQgZnJvbSBkaXNrLCAKLQlyZWFkIGZyb20gbWVtb3J5LCBvciBidWlsdCB0aGVuIHJlYWQgZnJvbSBtZW1vcnkuCi0KLQkqIGVsZjMyLWhwcGEuaDogUmVmb3JtYXQgd2l0aCBnbnUtaW5kZW50IGFuZCBoYW5kIGZpeCBudW1lcm91cwotCWZvcm1hdHRpbmcgYW5kIGluZGVudGlvbiBwcm9ibGVtcyBnbnUtaW5kZW50IGNhbiBub3QgaGFuZGxlLgotCUNsYXJpZnkgc29tZSBjb21tZW50cyBhYm91dCByZWxvY2F0aW9uIHR5cGVzLiAgQ29tbWVudCBiYXNpYwotCXJlbG9jYXRpb24gImNsYXNzZXMiLiAgR3JvdXAgUEFSQU0gZGVjbGFyYXRpb25zIHRvZ2V0aGVyLgotCShIUFBBX1NYVF97TlVMTCwgU1lNTkRYLCBSR19SRUxPQ30pOiBNYWtlIG1lbWJlcnMgb2YgYSBuZXcgCi0JZW51bWVyYXRlZCB0eXBlIHJhdGhlciB0aGFuICNkZWZpbmVzLgotCi1UdWUgT2N0IDI2IDAyOjQwOjQ2IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChocHBhX29iamVjdF9zZXR1cCk6ICBTZXQgU0VDX0NPREUgZm9yIC50ZXh0IHNlY3Rpb24gc28KLQl0aGF0IEdEQiBjYW4gZmlndXJlIG91dCB0ZXh0X3N0YXJ0IGFuZCB0ZXh0X2VuZC4KLQotTW9uIE9jdCAyNSAxNjowNToyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlGaXggdXAgd2FybmluZ3MgZnJvbSBnY2MgLVdhbGw6Ci0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogVXNlICVseCBhbmQgY2FzdCBuX3ZhbHVlIHRvCi0JdW5zaWduZWQgbG9uZy4gIFVzZSAlbGQgZm9yIHRhZ25keC4gIFVzZSAlbHggZm9yIG9mZnNldCArIHZtYSBhbmQKLQljYXN0IGl0IHRvIHVuc2lnbmVkIGxvbmcuCi0JKiBlY29mZi5jIChlY29mZl9lbWl0X2FnZ3JlZ2F0ZSk6IFVzZSAlbGQuCQotCShlY29mZl9wcmludF9zeW1ib2wpOiBVc2UgJWxkLCBhbmQgY2FzdCBpbmR4IGFuZCBzeW1fYmFzZSB0byBsb25nLgotCSogY29mZmNvZGUuaCAoZHVtbXlfcmVsb2MxNl9lc3RpbWF0ZSk6IFNwZWNpZnkgcmV0dXJuIHR5cGUuCi0KLQkqIGxpYmJmZC5jIChiZmRfd3JpdGUpOiBJZiBub3QgZXZlcnl0aGluZyBpcyB3cml0dGVuIG91dCwgc2V0Ci0JYmZkX2Vycm9yIHRvIHN5c3RlbV9jYWxsX2Vycm9yLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcwotCW5vbi1uZWdhdGl2ZSwgc2V0IGVycm5vIHRvIEVOT1NQQyAoaWYgRU5PU1BDIGlzIGRlZmluZWQpLgotCShiZmRfc2Vlayk6IElmIHRoZSBzZWVrIGZhaWxzLCBzZXQgYmZkX2Vycm9yIHRvIHN5c3RlbV9jYWxsX2Vycm9yLgotCShiZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IEZvciBhIGJhZCBvZmZzZXQgKyBjb3VudCwgc2V0Ci0JYmZkX2Vycm9yIHRvIGJhZF92YWx1ZS4KLQkqIHNlY2xldC5jIChyZWwpOiBEb24ndCBhYm9ydC4gIEluc3RlYWQsIHJldHVybiBmYWxzZS4KLQotTW9uIE9jdCAyNSAwOTo1OTozNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAocmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIuCi0KLUZyaSBPY3QgMjIgMjA6MzU6NTQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBoYW5kbGUgbWlwcyotKiBpbnN0ZWFkIG9mIG1pcHMtKiwgdXNlIG1pcHMqZWwKLQkgIGluc3RlYWQgb2YgbWlwcy0qLSpsCi0KLUZyaSBPY3QgMjIgMTQ6MDM6MzMgMTk5MyAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogbTY4ay1seW54Lm10LCBpMzg2LWx5bngubXQgKFRERUZJTkVTKTogc2V0Ci0JRlBSSU5URl9BTFJFQURZX0RFQ0xBUkVEIGJlY2F1c2UgdGhlIG9iamR1bXAuYyBkZWNsYXJhdGlvbiBvZgotCWZwcmludGYgY29sbGlkZXMgd2l0aCB0aGUgbmF0aXZlIG9uZS4KLQotRnJpIE9jdCAyMiAxMTo1MDoyNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IEVuYWJsZSBNSVBTIEVMRiB2ZWN0b3JzLgotCi1GcmkgT2N0IDIyIDA3OjUxOjUxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBVc2UgYmlnbWlwcyBmb3IgbWlwcy1zb255LWJzZCouCi0KLQkqIGNvbmZpZ3VyZS5ob3N0LCBjb25maWcuYmZkOiBBZGQgKiB0byBlbmQgb2YgYWxsIE9TIG5hbWVzLgotCi1UaHUgT2N0IDIxIDEyOjE2OjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKEZJTEVfQUxJR04pOiBSZW5hbWVkIGZyb20gRUFMSUdOLCB0byBhdm9pZCBjb25mbGljdAotCXdpdGggVWx0cml4IGhlYWRlciBmaWxlcy4KLQotCSogc29tLmggKHN0cnVjdCBzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCk6IFJlbmFtZWQgZnJvbQotCXNvbV9zZWN0aW9uX2RhdGEgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBtYWNybyBieSB0aGF0IG5hbWUuCi0KLQlDaGFuZ2VzIGZyb20gSmVmZiBMYXcgYW5kIFBldGVyIEhvb2dlbmJvb20gYXQgVXRhaDoKLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9yZWxvYyk6ICBUYXJnZXQgcmVnaXN0ZXIgZm9yIGEgJ2p1bXAKLQlpbiBkZWxheSBzbG90JyBvcHRpbWl6YXRpb24gaW4gY29tYmluYXRpb24gd2l0aCBhIGxvbmcgY2FsbAotCXN0dWIgc2hvdWxkIGFsd2F5cyBiZSByMzEuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGhwcGFfZWxmX3JlbG9jYXRlX2luc24pOiBUbyBiZSBjb25zaXN0ZW50Ci0JYWNyb3NzIGFsbCByZWxvY2F0aW9uIHR5cGVzLCByZXRyaWV2ZSBpbnN0cnVjdGlvbiBhZGRlbmRzIGZyb20KLQl0aGUgcmVsb2NhdGlvbiBlbnRyeSByYXRoZXIgdGhhbiBmcm9tIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGhwcGFfZWxmX3JlbG9jYXRlX2luc24pOiBGaXggYSByZWxvY2F0aW9uCi0JZXJyb3IgdGhhdCBvbmx5IG9jY3VycmVkIHdoZW4gdGhlIGFkZGVuZCBvZiBhbiAnYWRkaWwnIG9yCi0JJ2xkaWwnIHdhcyBsYXJnZXIgdGhhbiAyMSBiaXRzIGFuZCB2ZXJ5IGNsb3NlIHRvIGEgMksgYnl0ZQotCWJvdW5kYXJ5LgotCi0JKiBlbGYzMi1ocHBhLmM6IChocHBhX2VsZl9yZWxvYyk6ICBIYW5kbGUgdGhlIG9wdGltaXphdGlvbiBpbgotCXdoaWNoIGEganVtcCBpcyBwbGFjZWQgaW4gdGhlIGRlbGF5IHNsb3Qgb2YgYSBmdW5jdGlvbiBjYWxsLgotCVRoZSBqdW1wIHdhcyBiZWluZyBhY2NvbXBsaXNoZWQgdmlhIGFuIGFkanVzdG1lbnQgdG8gdGhlCi0JcmV0dXJuIHBvaW50ZXIuICBUaGlzIG9wdGltaXphdGlvbiB3b3VsZCBicmVhayB0aGUgbG9uZyBjYWxsCi0Jc3R1YiBjb2RlLCBpZiB0aGVyZSB3YXMgYW55LgotCi0JKiBlbGYzMi1ocHBhLmM6IChocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogQ29ycmVjdGlvbnMKLQl0byBsb25nIGJyYW5jaCBzdHVicyB0byBhdm9pZCB1c2Ugb2YgZ2VuZXJhbCByZWdpc3RlciAyLgotCi0JKiBocHBhX3N0dWJzLmg6IE5ldyBzdHViIGluc3RydWN0aW9ucy4KLQotCSogZWxmY29kZS5oOiBEZWNsYXJlIGJmZF9lbGZfZmluZF9zZWN0aW9uLgotCi0JKiBzb20uaCAoc29tX3NlY3Rpb25fZGF0YSk6IEFkZCBuZXcgInN1YnNwYWNlX2luZGV4IiBmaWVsZC4KLQotCSogc29tLmMgKHNldHVwX3NlY3Rpb25zKTogU2F2ZSB0aGUgb3JpZ2luYWwgU09NIHN1YnNwYWNlIGluZGV4Ci0JaW4gdGhlIEJGRCBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHN1YnNwYWNlLiAgCi0JKHNvbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogSW1wbGVtZW50LgotCShzb21fZ2V0X3N5bXRhYik6IEltcGxlbWVudC4KLQkoc29tX3ByaW50X3N5bWJvbCk6IEltcGxlbWVudC4KLQkoc29tX3NsdXJwX3N0cmluZ190YWJsZSk6IE5ldyBmdW5jdGlvbiB0byByZWFkIGEgc3RyaW5nIHRhYmxlCi0JZnJvbSBhIFNPTSBvYmplY3QgZmlsZS4KLQkoc29tX3NlY3Rpb25fZnJvbV9zdWJzcGFjZV9pbmRleCk6IE5ldyBmdW5jdGlvbiB0byByZXR1cm4gdGhlCi0Jc2VjdGlvbiB3aGljaCBjb3JyZXNwb25kcyB0byBhIFNPTSBzdWJzcGFjZSBpbmRleC4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IE5ldyBmdW5jdGlvbiB0byByZWFkIHRoZSBzeW1ib2wKLQl0YWJsZSBmcm9tIGEgU09NIG9iamVjdCBmaWxlLgotCShzb21fbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBmb3IgZXJyb3JzIGZyb20gYmZkX3phbGxvYy4KLQkoc29tX25ld19zZWN0aW9uX2hvb2spOiBJbml0aWFsaXplIHN1YnNwYWNlX2luZGV4IGZpZWxkIHRvCi0JLTEgaW5zdGVhZCBvZiAwLgotCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IEZpeCBwb2xhcml0eSBvZiB0ZXN0IHRvIHNldCBIQVNfUkVMT0MuCi0JU2V0IEVYRUNfUCBmb3IgZXhlY3V0YWJsZXMuCi0JKHNldHVwX3NlY3Rpb25zKTogQ29ycmVjdGx5IGlkZW50aWZ5IHdoZW4gYSBzZWN0aW9uIGhhcwotCXJlbG9jYXRpb25zLgotCShsb2cyKTogTmV3IGZ1bmN0aW9uLgotCShzZXR1cF9zZWN0aW9ucyk6IENvcnJlY3RseSBjb252ZXJ0IGJldHdlZW4gU09NIGFsaWdubWVudHMgYW5kIEJGRAotCWFsaWdubWVudHMuCi0KLQkqIHNvbS5jIChzZXR1cF9zZWN0aW9ucyk6IERvIG5vdCBzZXQgU0VDX0FMTE9DIG9yIFNFQ19MT0FECi0JZm9yIHNlY3Rpb25zIHdoaWNoIGNvcnJlc3BvbmQgdG8gU09NIHNwYWNlcywgZG9pbmcgc28gY29uZnVzZXMKLQltYW55IHV0aWxpdGllcy4gIFNldCBhc3NvcnRlZCBTRUNfKiBmbGFncyBmb3IgU09NIHN1YnNwYWNlcwotCXdoaWNoIGNvcnJlc3BvbmQgdG8gQkZEIHNlY3Rpb25zLgotCi0JKiBlbGYzMi1ocHBhLmM6IChlbGYzMl9ocHBhX2JhY2tlbmRfZmFrZV9zZWN0aW9ucyk6IFRoZSBzdGFiCi0Jc3RyaW5nIHRhYmxlIHNob3VsZCBoYXZlIHNoX3R5cGUgPT0gU0hUX1NUUlRBQi4gIEFkZAotCXByb2Nlc3NpbmcgdG8gbWFrZSBpdCBzby4KLQotCSogZWxmY29kZS5oOiAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogU3RyaW5nIHRhYmxlcyAob3RoZXIKLQl0aGFuIC5zdHJ0YWIpIHdlcmUgbm90IGdldHRpbmcgdGhlIGZpbGUgb2Zmc2V0cyByZWNvcmRlZCwgc28KLQl0aGV5IGNvdWxkIG5vdCBiZSByZWFkIGZyb20gZGlzay4KLQotCSogZWxmY29kZS5oOiAoZWxmX21ha2Vfc2VjdGlvbnMpOiAgTGVhdmUgdGhlIHNoX2FkZHIgZmllbGQgb2YKLQl0aGUgc2VjdGlvbiBoZWFkZXIgYW5kIHRoZSB2bWEgZmllbGQgb2YgYSBzZWN0aW9uIGF0IDAgaWYgdGhlCi0Jc2VjdGlvbiBpcyBub3QgcGFydCBvZiB0aGUgcHJvZ3JhbSBleGVjdXRpb24gaW1hZ2UuIChlLmcuLAotCS5zdGFiKQotCi0JKiBzb20uW2hjXTogQ2hhbmdlIHRhcmdldCB2ZWN0b3IgcHJlZml4IGZyb20gImhwcGEiIHRvICJzb20iLgotCUNvbnNpc3RlbnRseSB1c2Ugb2JqX3NvbSBwcmVmaXggdG8gYWNjZXNzIGZpZWxkcyBpbiBiYWNrZW5kIGRhdGEKLQlzdHJ1Y3R1cmVzLiAgRml4IGFsbCBjYWxsZXJzL3JlZmVyZW5jZXMuCi0KLQkqIHNvbS5oOiBEbyBub3QgaW5jbHVkZSBmaWxlcyBvbmx5IG5lZWRlZCBmb3IgY29yZSBmaWxlIHJlYWRpbmcgaGVyZS4KLQlJbmNsdWRlIGEub3V0IGZvciBib3RoIEhPU1RfSFBQQUhQVVggYW5kIEhPU1RfSFBQQUJTRC4gIERlbGV0ZQotCWZvcndhcmQgc3RydWN0dXJlIGRlY2xhcmF0aW9ucywgdGhleSBhcmUgdW5uZWNlc3NhcnkuCi0JKHN0cnVjdCBzb21kYXRhKTogRGVsZXRlIGF1eF9oZHIsIGFuZCBocF9zeW1ib2xfZW50cnlfc2l6ZSBmaWVsZHMuCi0JQ2hhbmdlICJzeW1ib2xzIiB0byAic3ltdGFiIi4gIEFkZCAic3RyaW5ndGFiIiBhbmQgInJlbG9jX2ZpbGVwb3MiCi0JZmllbGRzIGZvciBmdXR1cmUgdXNlLiAgQ2hhbmdlIG9ial9zb21fKiBtYWNyb3MgYXMgYXBwcm9wcmlhdGUuCi0JKHNvbV9zZWN0aW9uX2RhdGEpOiBOZXcgc3RydWN0dXJlIHRvIGtlZXAgU09NIHNwZWNpZmljIGluZm9ybWF0aW9uCi0JYWJvdXQgQkZEIHNlY3Rpb25zIChmb3IgZnV0dXJlIHVzZSkuCi0KLQkqIHNvbS5jOiBQcm92aWRlIFBBUkFNUyBkZWNsYXJhdGlvbnMgZm9yIGFsbCBmdW5jdGlvbnMgY3VycmVudGx5Ci0JaW4gdGhpcyBmaWxlLgotCShzdHJ1Y3QgY29udGFpbmVyKTogRGVsZXRlIHVud2FudGVkIHN0cnVjdHVyZSBkZWZpbml0aW9uLgotCShzb21fb2JqZWN0X3NldHVwKTogQWRkIGNvbW1lbnRzLiAgVXNlIHNvbV9ta29iamVjdCB0byBhbGxvY2F0ZQotCVNPTSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpbiB0aGUgQkZEOyB1c2UgaW5mb3JtYXRpb24gZnJvbSB0aGUKLQlmaWxlIGFuZCAocG9zc2libHkgZW1wdHkpIGF1eGlsaWFyeSBoZWFkZXJzIHRvIGluaXRpYWxpemUgdGhpcwotCWluZm9ybWF0aW9uLiAgRGVsZXRlIHJlZHVuZGFudCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAiY2FsbHMiLgotCShzZXR1cF9zZWN0aW9ucyk6IFJldHVybiB0eXBlIGlzIG5vdyBib29sZWFuLCBmaXggcmV0dXJuIHN0YXRlbWVudHMuCi0JIkZpeCIgaGFuZGxpbmcgb2YgQlNTIGxpa2Ugc3Vic3BhY2VzIGluIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUKLQljb250YWluaW5nIHNwYWNlJ3Mgc2l6ZS4gIElmIHRoZSBzdWJzcGFjZSBoYXMgcmVsb2NhdGlvbnMsIHNldCB0aGUKLQlhcHByb3ByaWF0ZSBCRkQgc2VjdGlvbiBmbGFncyBhbmQgcmVjb3JkIHRoZSBpbmRleCBpbnRvIGFuZCB0aGUKLQlzaXplIG9mIHRoZSBmaXh1cCBzdHJlYW0uICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0JKHNvbV9vYmplY3RfcCk6IFNldCBiZmRfZXJyb3IgYXBwcm9wcmlhdGVseSBpZiBlcnJvcnMgYXJlIGRldGVjdGVkCi0JZnJvbSBiZmRfe3JlYWQsc2Vla30gZnVuY3Rpb25zLiAgSGFuZGxlIEVYRUNMSUJNQUdJQyB0eXBlIGZpbGVzLgotCURvIG5vdCB0cnkgdG8gcmVhZCBhIG5vbi1leGlzdGFudCBhdXhpbGlhcnkgaGVhZGVyLgotCShzb21fbWtvYmplY3QpOiBGbGVzaCBvdXQuCi0JKHNvbV9zZWN0aW9uX2hvb2spOiBBbGxvY2F0ZSBzcGFjZSB0byBob2xkIFNPTSBzcGVjaWZpYyBpbmZvcm1hdGlvbgotCWFib3V0IHNlY3Rpb25zLgotCi1UaHUgT2N0IDIxIDEyOjQxOjM0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JZ2NjIC1XYWxsIGxpbnQ6Ci0JKiBjb2ZmLWg4MzAwLmMsIGNvZmZjb2RlLmg6IENoYW5nZSBzaHJpbmsgcGFyYW1ldGVyCi0JaW4gKl9yZWxvYzE2X2VzdGltYXRlIHRvIHVuc2lnbmVkIHRvIG1hdGNoIHByb3RvdHlwZS4KLQkqIGFyY2hpdmUuYzogQXZvaWQgIi8qIiBpbiBjb21tZW50LgotCi1UaHUgT2N0IDIxIDEzOjA1OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZGVwLWluLnNlZDogQ3JlYXRlIG91ciBvd24gbGluZSBicmVha3MgZm9yIGEgbW9yZSBhZXN0aGV0aWMKLQlNYWtlZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotCSogZWxmMzItbWlwcy5jOiBJbmNsdWRlICJzZWNsZXQuaCIuCi0JKG1pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBGb3JjZSBzaXplIG9mIC5yZWdpbmZvIHNlY3Rpb24gdG8gc2l6ZW9mCi0JRWxmMzJfRXh0ZXJuYWxfUmVnSW5mby4KLQkobWlwc19lbGZfc2VjbGV0X2xpbmspOiBOZXcgZnVuY3Rpb24uICBMaW5rIHRoZSAucmVnaW5mbyBzZWN0aW9uCi0Jc3BlY2lhbGx5LCBhbmQgcGFzcyBldmVyeXRoaW5nIGVsc2UgdG8gdGhlIGdlbmVyaWMgcm91dGluZS4KLQkoYmZkX2VsZjMyX2JmZF9zZWNsZXRfbGluayk6IERlZmluZSBtYWNyby4KLQkqIGVsZjMyLXRhcmdldC5oOiBJZiBiZmRfZWxmMzJfYmZkX3NlY2xldF9saW5rIGlzIGFscmVhZHkgZGVmaW5lZCwKLQlkb24ndCBvdmVycmlkZSBpdC4KLQotV2VkIE9jdCAyMCAxMjoyMjozNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYm5sbS5oIChubG1fYmFja2VuZF9kYXRhKTogQWRkZWQgc2lnbmF0dXJlIGZpZWxkLgotCShubG1fc2lnbmF0dXJlKTogTmV3IG1hY3JvLgotCSogbmxtY29kZS5oIChubG1fb2JqZWN0X3AsIG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgdGhlIE5MTQotCXNpZ25hdHVyZSBmcm9tIHRoZSBiYWNrZW5kIHJhdGhlciB0aGFuIHRoZSBjb25zdGFudCBOTE1fU0lHTkFUVVJFLgotCSogbmxtMzItaTM4Ni5jIChubG0zMl9pMzg2X2JhY2tlbmQpOiBJbml0aWFsaXplIHNpZ25hdHVyZSBmaWVsZC4KLQotCSogYW91dGYxLmggKE1BQ0hUWVBFX09LKTogQWNjZXB0IE1fVU5LTk9XTi4KLQkoTkFNRShzdW5vcyxzZXRfYXJjaF9tYWNoKSk6IFRyZWF0IE1fVU5LTk9XTiBhcyA2ODAwMCwgbm90IDY4MDIwLgotCi1XZWQgT2N0IDIwIDEwOjI4OjI3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2YnNkLmggW19fYnNkaV9fXTogRGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSLgotCi1XZWQgT2N0IDIwIDEwOjEwOjA3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogTmV3IHZhcmlhYmxlLCBmb3IgdXNlIGluICJtYWtlIGRlcCIuCi0JKC5kZXApOiBEZXBlbmQgb24gJChDRklMRVMpIGFuZCAkKEhGSUxFUykuICBEZWxldGUgLmRlcDEgYW5kCi0JcmVtYWtlIGl0LCBzbyB0aGF0ICIkPyIgaXMgY29tcGxldGUuCi0JKC5kZXAxKTogRG9uJ3QgbmVlZCB0byByZW1vdmUgLmRlcDEgZmlyc3QuCi0JKGRlcC5zZWQpOiBEZXBlbmQgb24gY29uZmlnLnN0YXR1cywgbm90IE1ha2VmaWxlLgotCShDRklMRVMpOiBBZGQgbmxtLmMuCi0KLVR1ZSBPY3QgMTkgMTU6MjY6MjYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWFscGhhLmM6IEltcGxlbWVudGVkIHJlbG9jIGhhbmRsaW5nIGZvciB0aGUgbGlua2VyLCBtYWRlCi0JdmFyaW91cyBvdGhlciByZWxhdGVkIGNoYW5nZXMuCi0JKiBsaWJlY29mZi5oIChlY29mZl9iYWNrZW5kX2RhdGEpOiBBZGRlZCByZGF0YV9pbl90ZXh0IGZpZWxkLgotCVJlbmFtZWQgZmluaXNoX3JlbG9jIHRvIGFkanVzdF9yZWxvY19pbi4gIEFkZGVkIGFkanVzdF9yZWxvY19vdXQKLQlmaWVsZC4KLQkoZWNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0IGRlZmluZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzLCBlY29mZl9zdHlwX3RvX3NlY19mbGFncyk6Ci0JSGFuZGxlIC5saXRhIHNlY3Rpb24uCi0JKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogSGFuZGxlIFJFTE9DX1NFQ1RJT05fRklOSS4KLQlmaW5pc2hfcmVsb2MgYmFja2VuZCBmaWVsZCByZW5hbWVkIHRvIGFkanVzdF9yZWxvY19pbi4KLQkoZWNvZmZfYmZkX3NlY2xldF9saW5rKTogQWRqdXN0IG51bWJlciBvZiBhdXggZW50cmllcyB0bwotCWRlYnVnX2FsaWduIGJvdW5kYXJ5LgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiByZGF0YV9pbl90ZXh0IHB1dAotCS5yZGF0YSBzZWN0aW9uIGluIHRleHQgc2VnbWVudCwgbm90IGRhdGEgc2VnbWVudC4gIFB1dCAucGRhdGEKLQlzZWN0aW9uIGluIHRleHQgc2VnbWVudC4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuICBBbHNvLCBjYWxsCi0JYWRqdXN0X3JlbG9jX291dCwgYW5kIGhhbmRsZSAubGl0YSwgLnhkYXRhLCAucGRhdGEsIC5maW5pIGFuZAotCWFic29sdXRlIHNlY3Rpb25zIHdoZW4gd3JpdGluZyBvdXQgcmVsb2NzLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogRm9yIEFMUEhBRUNPRkYsIG91dHB1dCAyIGZvcgotCWJsZHJldiBmaWVsZCwgYXMgb24gQWxwaGEgT1NGLzEuICBQYWRkaW5nIGZpZWxkIGlzIG5vdyAyIGJ5dGVzLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQpOiBBZGRlZCBhc3NlcnRpb24uCi0JKG1pcHNfYWRqdXN0X3JlbG9jX2luKTogUmVuYW1lZCBmcm9tIG1pcHNfZmluaXNoX3JlbG9jLgotCShtaXBzX2FkanVzdF9yZWxvY19vdXQpOiBOZXcgZnVuY3Rpb24gKGRvZXMgbm90aGluZykuCi0JKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCShlY29mZl9iZmRfZ2V0X3JlbG9jYXRpb25fc2VjdGlvbl9jb250ZW50cyk6IERlZmluZSB0byBiZQotCWJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cy4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEFkZGVkIGNhc3RzIHRvIGF2b2lkIEFscGhhCi0JT1NGLzEgY2MgYnVnLgotCi1UaHUgT2N0IDE0IDAxOjEwOjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEFkZCBjb21tZW50cyBhdHRlbXB0aW5nIHRvCi0JZXhwbGFpbiBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucy4KLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBEb24ndCBzZXQgU0VDX0RFQlVHR0lORyB1bnRpbCBpdAotCWlzIG1hZGUgdG8gd29yay4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBSZW1vdmUgY2hlY2sgZm9yCi0JVVNFX0RJU0NBUkRFRF9TRUNUSU9OU19DT1VOVC4KLQkqIGNvZmYtaTM4Ni5jOiBEb24ndCBkZWZpbmUgVVNFX0RJU0NBUkRFRF9TRUNUSU9OU19DT1VOVC4gIEJhc2luZwotCWl0IG9uIGhvc3QgZGVmaW5lcyBpcyB3cm9uZy4KLQotCSogZWNvZmYuYyAoZWNvZmZfYmZkX3NlY2xldF9saW5rKTogRG9uJ3QgbGluayBhIC5yZWdpbmZvIHNlY3Rpb24uCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHJlcXVpcmUgdGhlIC5yZWdpbmZvIHNlY3Rpb24KLQl0byBiZSBhIHBhcnRpY3VsYXIgc2l6ZS4KLQotV2VkIE9jdCAxMyAxODozOTowMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkZXAtaW4pOiBOZXcgcnVsZSwgZm9yIGVkaXRpbmcgZGVwZW5kZW5jaWVzIGludG8KLQlNYWtlZmlsZS5pbiBpbiAkKHNyY2RpcikuICBVc2UgbW92ZS1pZi1jaGFuZ2UuCi0JKC5kZXAxLCBkZXApOiBVc2UgbW92ZS1pZi1jaGFuZ2UuCi0JKENGSUxFUyk6IEFkZCBjb2ZmLWFwb2xsby5jLgotCi0JU3VuIE9jdCAxMCAxODowMjo1NiAxOTkzICBUcm95IFJvbGxvICh0cm95QGNibWUudW5zdy5FRFUuQVUpCi0KLQkqIE1ha2VmaWxlLmluOiBSZWNvZ25pc2UgbmV3IGZpbGUsIGNvZmYtYXBvbGxvLm8KLQotCSogY29mZi1hcG9sbG8uYzogTmV3IGZpbGUKLQotCSogY29mZmNvZGUuaDogUmVjb2duaXNlIGFwb2xsbyBtYWdpYyBudW1iZXJzIGFuZCB3cml0YWJsZSB0ZXh0Ci0KLQkqIGNvZmZzd2FwLmg6IFN3YXAgQXBvbGxvIG9wdGlvbmFsIGhlYWRlciBlbnRyaWVzCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBsaW5lIGZvciBBcG9sbG8KLQotCSogY29uZmlndXJlLmhvc3Q6IFJlcGxhY2UgYXBvbGxvNjhiIGFuZCBhcG9sbG82OHYgd2l0aCBBcG9sbG8KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pc2UgYXBvbGxvY29mZl92ZWMKLQotCSogdGFyZ2V0cy5jOiBMaWtld2lzZQotCi0JKiBjb25maWcvYXBvbGxvLm1oLCBjb25maWcvYXBvbGxvLm10OiBOZXcgZmlsZXMKLQotCSogaG9zdHMvYXBvbGxvNjguaDogUmVtb3ZlIGluY2x1c2lvbiBvZiBzdHJpbmdzLmgKLQotV2VkIE9jdCAxMyAxNDoyODoxNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTM4Ni5jIChpM2NvZmZfb2JqZWN0X3ApOiBOb3cgc3RhdGljLgotCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlZCBkZXBlbmRlbmNpZXMuCi0JKC5kZXAsIC5kZXAxLCBkZXAuc2VkKTogTmV3IHRhcmdldHMsIHRvIG1ha2UgIm1ha2UgZGVwIiB3b3JrCi0JYmV0dGVyLgotCSogZGVwLWluLnNlZDogTmV3IGZpbGUuCi0KLQkqIG02OGtseW54LWNmLmMgKE9OTFlfREVDTEFSRV9SRUxPQ1MpOiBEZWZpbmUsIHRvIGF2b2lkIG5hbWUKLQljb25mbGljdHMgd2hlbiAiLS13aXRoLXRhcmdldHM9YWxsIi4KLQkqIGNvZmYtbTY4ay5jIChtNjhrY29mZl9ob3d0b190YWJsZSwgbTY4a19ydHlwZTJob3d0bywKLQltNjhrX2hvd3RvMnJ0eXBlKTogUmVuYW1lIHZpYSBtYWNyb3MgdG8ga2VlcCBuYW1lc3BhY2UgY2xlYW4uCi0JKiBjb25maWd1cmUuaW46IEZvciBtNjhrbHlueF9jb2ZmX3ZlYywgaW5jbHVkZSBjb2ZmLW02OGsubyBmb3IKLQlub3cuCi0KLVR1ZSBPY3QgMTIgMTc6MDM6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1taXBzLmM6IEV4dGVuc2l2ZSBhZGRpdGlvbnMgdG8gZG8gcmVsb2NhdGlvbnMgYW5kIHRvCi0JaGFuZGxlIE1JUFMgc3BlY2lmaWMgc2VjdGlvbnMuCi0JKiBsaWJlbGYuaCAoZWxmX2JhY2tlbmRfZGF0YSk6IFBhc3MgZm91cnRoIGFyZ3VtZW50IHRvCi0JZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIHRvIHBlcm1pdCBpdCB0byBjb250cm9sIHRoZQotCXNlY3Rpb24gaW5kZXggdG8gdXNlLgotCShlbGZfb2JqX3RkYXRhKTogQWRkIGdwIGFuZCBncF9zaXplIGZpZWxkcy4KLQkoZWxmX2dwLCBlbGZfZ3Bfc2l6ZSk6IE5ldyBhY2Nlc3NvciBtYWNyb3MuCi0JKiBlbGZjb2RlLmg6IFJlbW92ZWQgYSBudW1iZXIgb2YgdW51c2VkIGxvY2FsIHZhcmlhYmxlcy4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBDbGVhciBzZWN0aW9uIGhlYWRlciBiZWZvcmUgY2FsbGluZwotCWVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMsIG5vdCBhZnRlci4KLQkocHJlcF9oZWFkZXJzKTogUmV0dXJuIHRydWUgYXQgZW5kLgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogUGFzcyByZXR2YWwgYXJndW1lbnQgdG8KLQllbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24uCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOgotCUFjY2VwdCBhbmQgaWdub3JlIG5ldyByZXR2YWwgYXJndW1lbnQuCi0JKiBiZmQuYzogSW5jbHVkZSBsaWJlbGYuaC4KLQkoYmZkX3NldF9ncF9zaXplKTogSGFuZGxlIEVMRiB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW4gKGJmZC5vKTogRGVwZW5kcyB1cG9uIGxpYmVsZi5oLgotCShlbGYzMi1taXBzLm8pOiBEZXBlbmRzIHVwb24gJChJTkNESVIpL2VsZi9taXBzLmguCi0KLU1vbiBPY3QgMTEgMTc6MjU6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9ta29iamVjdCk6IENoZWNrIGJmZF9tYWtlX3NlY3Rpb24gcmV0dXJuIHZhbHVlLgotCShlY29mZl9ta29iamVjdF9ob29rKTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl9uZXdfc2VjdGlvbl9ob29rLCBlY29mZl9zaXplb2ZfaGVhZGVycywKLQllY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsIGVjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzLAotCWVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEhhbmRsZSBkdW1teSBSRUdJTkZPIHNlY3Rpb24uCi0JKGVjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9uIHRvIGhhbmRsZSByZWFkaW5nCi0JUkVHSU5GTyBzZWN0aW9uLgotCSogbGliZWNvZmYuaCAoZWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBDaGFuZ2UgZnJvbSBtYWNybwotCWRlZmluaXRpb24gdG8gZnVuY3Rpb24gcHJvdG90eXBlLgotCShlY29mZl9ta29iamVjdF9ob29rKTogTmV3IHByb3RvdHlwZS4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfbWtvYmplY3RfaG9vayk6IFJlbW92ZWQuCi0JKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IFVzZSBlY29mZl9ta29iamVjdF9ob29rLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfbWtvYmplY3RfaG9vayk6IFJlbW92ZWQuCi0JKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogVXNlIGVjb2ZmX21rb2JqZWN0X2hvb2suCi0KLUZyaSBPY3QgIDggMTU6MjU6MzMgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBsaWJiZmQuYyAoYmZkX2dldCozMiwgYmZkX2dldCo2NCk6ICBQcmV2ZW50IEFOU0kgc2lnbiBleHRlbnNpb24KLQlieSBjYXN0aW5nIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgdG8gYmZkX3ZtYS4KLQotRnJpIE9jdCAgOCAwMjozNDoyMSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5pbjogIERvIG5vdCBkZWZpbmUgU0VMRUNUX1ZFQ1MsIFNFTEVDVF9BUkNISVRFQ1RVUkVTCi0JaWYgY29uZmlndXJpbmcgLS13aXRoLXRhcmdldHM9YWxsLgotCi1UaHUgT2N0ICA3IDE3OjM0OjA3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoaG93dG9fdGFibGVfc3RkKTogQ29ycmVjdCB0aGUgInNpemUiIGZpZWxkIGluIHNvbWUKLQllbnRyaWVzLgotCi0JKiByZWxvYy5jIChyZWxvY19ob3d0b190eXBlKTogQ2hhbmdlIGRvY3VtZW50YXRpb24gdG8gZGlzcGVsIGFueQotCW5vdGlvbiB0aGF0IHRoZSAic2l6ZSIgZmllbGQgaXMgYSBwb3dlci1vZi10d28gaW5kaWNhdG9yLgotCi1UaHUgT2N0ICA3IDEwOjUwOjM4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLSAgICAgICAqIGNvZmZzd2FwLmg6IChiZmRfc3dhcF9yZWxvY19pbik6IGEgc3ltbmR4IGlzIHNpZ25lZC4KLQotCU1ha2Ugc3VwcG9ydCBmb3IgcmVsYXhpbmcgbW9yZSBnZW5lcmljLgotCSogcmVsb2MxNi5jOiBBZGQgbmV3IHRhcmdldCBlbnRyeSAtIGJmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUsCi0JZml4IGJpdCByb3QuCi0JKiBsaWJjb2ZmLmgsIGxpYmNvZmYtaW4uaDogZGVjbGFyYXRpb25zLiBQcm90b3R5cGVzCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEFkZCBjYWxscyB0bwotCWNvZmZfcmVsb2NfMTZfZXh0cmFfY2FzZXMgYW5kIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZS4KLQkoZHVtbXlfcmVsb2MxNl9lc3RpbWF0ZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IE5ldyBmdW5jdGlvbgotCi1UaHUgT2N0ICA3IDE0OjI0OjEzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChFQUxJR04pOiBEZWZpbmUsIGRlcGVuZGVudCBvbiBBUkNIX1NJWkUuCi0JKGFsaWduX2ZpbGVfcG9zaXRpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9sb2NhdGVfc2gpOiBEaXNhYmxlZCBmdW5jdGlvbiBkZWxldGVkLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3N5bXRhYl9hbmRfc3RydGFicyk6IEFsaWduIHBvc2l0aW9uLAotCXRoZW4gcGxhY2Ugc3ltdGFiLCB0aGVuIGRvIG90aGVyIHNlY3Rpb25zLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IEFsaWduIHByb2dyYW0gaGVhZGVyLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEFsaWduIHNlY3Rpb24gaGVhZGVycy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MpOiBBbGlnbiByZWxvY2F0aW9uIHNlY3Rpb25zLgotCi1UdWUgT2N0ICA1IDEwOjQ0OjMyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdDogUmVjb2duaXplIGhwcGEqLSotaGl1eCogKGN1cnJlbnRseSBzeW5vbnltIGZvciBocHV4KS4KLQlDaGFuZ2Ugb3RoZXIgaHBwYSBlbnRyaWVzIHRvIHVzZSAtKi0gbm90IC1ocC0uCi0JKiBjb25maWcuYmZkOiBSZWNvZ25pemUgaHBwYSotKi1oaXV4KiAoY3VycmVudGx5IHN5bm9ueW0gZm9yIGhwdXgpLgotCi0JKiBjb2ZmLXJzNjAwMC5jLCBjcHUtcnM2MDAwLmMsIHJzNjAwMC1jb3JlLmM6IENoYW5nZSBub24tQVNDSUkKLQljaGFyYWN0ZXJzIGluIGNvbW1lbnQgdG8gb2N0YWwgZXNjYXBlcy4KLQotU3VuIE9jdCAgMyAxMjozNToxNSAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTM4Nmx5bnguYzogUmVtb3ZlZCwgbmFtZSB0b28gbG9uZy4KLQkqIGkzODZseW54LWNmLmM6IE5ldyBmaWxlLCB3YXMgY29mZi1pMzg2bHlueC5jLgotCSogY29uZmlndXJlLmluOiBSZWZsZWN0IGZpbGUgbmFtZSBjaGFuZ2VzLgotCSogTWFrZWZpbGUuaW46IE1lbnRpb24gTHlueC1yZWxhdGVkIGZpbGVzLgotCi0JKiBpMzg2bHlueC5jIChseW54XzMyX3N3YXBfZXh0X3JlbG9jX2luKTogZ2V0IHJlbG9jIGJpdHMgaW4gaTM4NgotCUx5bngtc3BlY2lmaWMgd2F5LgotCi0JKiBtNjhrbHlueC1jZi5jOiBOZXcgZmlsZSwgZGVmaW5lcyBjb2ZmIGZvcm1hdCBmb3IgTTY4SyBMeW54T1MuCi0JKiBtNjhrbHlueC5jOiBSZW1vdmUgY29mZiB2ZWN0b3IgZGVmaW5pdGlvbiwgbm93IGluIG02OGtseW54LWNmLmMuCi0KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogU2V0IHNlY3Rpb24gZmxhZyB0byBTVFlQX0lORk8KLQlmb3IgLnN0YWIsIC5zdGFic3RyIGFuZCAuZGVidWcgc2VjdGlvbnMsIGFuZCBzZXQgU0VDX0RFQlVHR0lORyBmb3IKLQlzZWN0aW9ucyBvZiB0eXBlIFNUWVBfSU5GTy4gIChmcm9tIE1pbmggVHJhbi1MZSkKLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBZGQgZGlzY2FyZGVkX3NlY3Rpb25zX2NvdW50Ci0JdG8gYWJmZC0+c2VjdGlvbl9jb3VudCwgd2hpY2ggaGVscHMgYHN0cmlwJyBrZWVwIHRoZSBzaXplCi0Jb2YgdGhlIGV4ZWN1dGFibGUgaGVhZGVyIGNvbnN0YW50LgotCSogY29mZi1pMzg2LmMgKGRpc2NhcmRlZF9zZWN0aW9uc19jb3VudCk6IE5ldyB2YXJpYWJsZSwgaW5pdGlhbGl6ZWQKLQl0byB6ZXJvLiAgRm9yIHVzZSBieSBgc3RyaXAnLiAgQ3VycmVudGx5IGJlaW5nIHVzZWQgb25seSBpbiBhaXgzODYKLQljb2ZmLCBidXQgbWF5IGJlIHVzZWZ1bCBmb3Igb3RoZXIgY29mZiBzeXN0ZW1zLiAgKGZyb20gTWluaCBUcmFuLUxlKQotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfZmlsZWhkcl9vdXQpOiBBZGRlZCBhIG1pc3NpbmcgY2FzdC4KLQotCSogYXJjaGl2ZS5jOiBDb3NtZXRpYyBpbXByb3ZlbWVudHMuCi0JKiBvcG5jbHMuYzogQ29zbWV0aWMgaW1wcm92ZW1lbnRzLgotCShuZXdfYmZkKTogUmVtb3ZlZCByZWR1bmRhbnQgc3RydWN0dXJlIHNsb3QgaW5pdC4KLQotU2F0IE9jdCAgMiAxODo0ODoxNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL25ld3MtbWlwcy5taCwgaG9zdHMvbmV3cy1taXBzLmg6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgbmV3cy1taXBzIGZvciBtaXBzLXNvbnktYnNkKi4KLQotRnJpIE9jdCAgMSAxMzoxNDoxNyAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogaTM4Nmx5bnhfY29mZl92ZWMgcmVxdWlyZXMgY29mZi1pMzg2bHlueC5vLgotCSogY29mZi1pMzg2bHlueC5jOiBOZXcgZmlsZSwgZGVmaW5lcyBMeW54IHRhcmdldCB2ZWN0b3IgYW5kIG5hbWUsCi0JaW5jbHVkZXMgY29mZi1pMzg2LmMuCi0JKiBjb2ZmLWkzODYuYyAoaTM4NmNvZmZfdmVjKTogQWxsb3cgcmVkZWZpbml0aW9uIG9mIHRhcmdldCB2ZWN0b3IKLQlzeW1ib2wgYW5kIG5hbWUsIGlmIFRBUkdFVF9TWU0gYW5kL29yIFRBUkdFVF9OQU1FIGFyZSBkZWZpbmVkLgotCSogaTM4Nmx5bnguYzogUmVtb3ZlIGNvZmYgdmVjdG9yIGRlZmluaXRpb24gZW50aXJlbHkuCi0JKGx5bnhfMzJfc3dhcF9leHRfcmVsb2NfaW4pOiBEZWZpbmUuCi0JKGx5bnhfMzJfc3dhcF9zdGRfcmVsb2NfaW4pOiBEZWZpbmUsIGdldCByZWxvYyBiaXRzIGluIGkzODYKLQlMeW54LXNwZWNpZmljIHdheS4KLQkobHlueF8zMl9zd2FwX2V4dF9yZWxvY19vdXQpOiBEZWZpbmUuCi0JKGx5bnhfMzJfc3dhcF9zdGRfcmVsb2Nfb3V0KTogRGVmaW5lLgotCShseW54XzMyX3NsdXJwX3JlbG9jX3RhYmxlKTogRGVmaW5lLCBjYWxsIEx5bnggc3dhcHBpbmcgZm5zLgotCShseW54XzMyX3NxdWlydF9vdXRfcmVsb2NzKTogRGVmaW5lLCBjYWxsIEx5bnggc3dhcHBpbmcgZm5zLgotCShseW54XzMyX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IERlZmluZSwgY2FsbCBMeW54IHN3YXBwaW5nIGZucy4KLQkoV1JJVEVfSEVBREVSUyk6IERlZmluZSwgY2FsbCBMeW54IHN3YXBwaW5nIGZucy4KLQotCSogY29uZmlnL2kzODYtbHlueC5tdCAoU0VMRUNUX1ZFQ1MpOiBSZW1vdmUgcmVkdW5kYW50IHZlY3Rvci4KLQotVGh1IFNlcCAzMCAxNzo1MDo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3R5cGUpOiBBZGQgbGlua2FnZS10YWJsZSByZWxhdGl2ZQotCXJlbG9jYXRpb25zIG9mIHNpemUgOCwgMTYsIDMyLiAgU29ydCBnZW5lcmljIHJlbG9jcyBieSB0eXBlIHJhdGhlcgotCXRoYW4gc2l6ZS4gIEFkZGVkIGEgbGl0dGxlIGRvY3VtZW50YXRpb24gdG9vLgotCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9zdGQpOiBBZGQgQkFTRTE2IGFuZCBCQVNFMzIgcmVsb2NzLgotCShUQUJMRV9TSVpFKTogTmV3IG1hY3JvLgotCShyZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfezE2LDMyfV9CQVNFUkVMIGZvciBzdGQKLQlyZWxvY3MuCi0JKHN3YXBfc3RkX3JlbG9jX291dCk6IFdyaXRlIGJhc2VyZWwgcmVsb2NzIGNvcnJlY3RseS4KLQkoc3dhcF9zdGRfcmVsb2NfaW4pOiBIYW5kbGUgcl9iYXNlcmVsIGZpZWxkLiAgQXNzZXJ0IHRoYXQKLQlyX2ptcHRhYmxlIGFuZCByX3JlbGF0aXZlIGZpZWxkcyBhcmUgY2xlYXIsIGFuZCB0aGF0IHRoZSBjb21wdXRlZAotCWluZGV4IGRvZXMgcmVmZXIgdG8gYSBkZWZpbmVkIGVudHJ5IG9mIHRoZSBob3d0byB0YWJsZS4KLQotVHVlIFNlcCAyOCAxNDo0Nzo0NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChiZmRfbWFrZV9zZWN0aW9uX2FueXdheSk6IE5ldyBmdW5jdGlvbi4KLQkqIHNlY3Rpb24uYzogQ2hhbmdlIGNvbW1lbnRzIHRvIHNheSBzZXZlcmFsIHNlY3Rpb25zIGNhbiBoYXZlCi0JdGhlIHNhbWUgbmFtZS4KLQkqIGJmZC1pbjIuaDogUmUtZ2VuZXJhdGUgdG8gcmVmbGVjdCBhYm92ZSBjaGFuZ2UuCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IENhbGwgYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkKLQlpZiBzdGlsbCBubyBzZWN0aW9uIGFmdGVyIHRoZSBiZmRfY29mZl9tYWtlX3NlY3Rpb25faG9vay4KLQkqIGNvZmZjb2RlLmg6IEFkZCBjb21tZW50IGFib3V0IFRXT19EQVRBX1NFQ1MuCi0KLVR1ZSBTZXAgMjggMDM6MjI6MjQgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBlY29mZi5jIChlY29mZl9zbHVycF9zeW1ib2xpY19pbmZvKTogIEFsd2F5cyBkZXRlcm1pbmUgcmF3X3NpemUKLQlleHBsaWNpdGx5LgotCSogZWNvZmYuYyAoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MsIGVjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogIEhhbmRsZQotCS5maW5pIHNlY3Rpb24uCi0KLU1vbiBTZXAgMjcgMTg6Mjk6MTggMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIGNvbmZpZ3VyZS5ob3N0OiBNYXRjaCBvbiAqLWx5bnhvcyogZm9yIEx5bnhPUywKLQlhZGQgbTY4Ki0qLWx5bnhvcyouCi0JKiBjb25maWd1cmUuaW4gOiBSZXBsYWNlZCBpMzg2bHlueF92ZWMgd2l0aCBpMzg2bHlueF9hb3V0X3ZlYwotCWFuZCBpMzg2bHlueF9jb2ZmX3ZlYy4KLQlBZGRlZCBtNjhrbHlueF9hb3V0X3ZlYyBhbmQgbTY4a2x5bnhfY29mZl92ZWMuCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBSZW1vdmVkIGkzODZseW54X3ZlYywgYWRkZWQKLQl7aTM4NixtNjhrfWx5bnhfe2FvdXQsY29mZn1fdmVjLgotCSogaTM4Nmx5bnguYzogQWRkZWQgY29weSBvZiBpMzg2Y29mZi5jLCByZW5hbWVkIGJmZCB0YXJnZXQgdG8KLQlpMzg2bHlueF9jb2ZmX3ZlYy4KLQkqIG02OGtseW54LmM6IE5ldyBmaWxlLgotCSogY29uZmlnL2kzODYtbHlueC5tdDogUmVwbGFjZWQgaTM4Nmx5bnhfdmVjIHdpdGggaTM4Nmx5bnhfYW91dF92ZWMKLQlhbmQgaTM4Nmx5bnhfY29mZl92ZWMuCi0JKiBjb25maWcvbTY4ay1seW54Lm10OiBOZXcgZmlsZS4KLQkqIGhvc3RzL2kzODZseW54Lmg6IEFkZGVkIGRlZmluaXRpb24gb2YgY2ZyZWUgYXMgZnJlZSAoZnJvbSBFaWNoaW4pLgotCSogaG9zdHMvbTY4a2x5bnguaDogTmV3IGZpbGUuCi0KLU1vbiBTZXAgMjcgMTg6MDA6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYzogRGVmaW5lIG9mZnNldG9mIGhlcmUuCi0JKiBob3N0cy8qLmg6IERvbid0IGRlZmluZSBpdCBoZXJlLgotCi1Nb24gU2VwIDI3IDE5OjA5OjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBTZXQgZmlsZXBvcyBmb3IgU0hUX1NUUlRBQgotCXNlY3Rpb24uCi0KLUZyaSBTZXAgMjQgMTU6NDc6NDAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhwdXgtY29yZS5jOiBBZGQgY29tbWVudCBhYm91dCBocHV4IHZlcnNpb24gNy4KLQotRnJpIFNlcCAyNCAxNjo1MDoyNiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBseW54LWNvcmUuYyAobHlueF9jb3JlX2ZpbGVfcCk6ICBDaGFuZ2UgcGVyLXRocmVhZCByZWdpc3RlcgotCXNlY3Rpb24gbmFtZXMgZnJvbSAucmVnWFhYIHRvIC5yZWcvWFhYIHRvIGF2b2lkIHBhcnNpbmcgYW1iaWd1aXR5Ci0JaW4gZ2RiL2NvcmVsb3cuYy4gIENyZWF0ZSBhbGlhcyAucmVnIHNlY3Rpb24gZm9yIHRoZSBjdXJyZW50bHkKLQlydW5uaW5nIHRocmVhZC4KLQotRnJpIFNlcCAyNCAxMzoyMjozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZWQgYmlnX21hZ2ljIGFuZAotCWxpdHRsZV9tYWdpYyBmaWVsZHMuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZWQgaW5pdGlhbGl6YXRpb24KLQlvZiBiaWdfbWFnaWMgYW5kIGxpdHRsZV9tYWdpYy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhZF9mb3JtYXRfaG9vayk6IE1ha2Ugc3VyZSBtYWdpYyBudW1iZXIKLQltYXRjaGVzIGVuZGlhbmVzcyBvZiBiZmQuCi0JKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogUmVtb3ZlZCBpbml0aWFsaXphdGlvbiBvZiBiaWdfbWFnaWMgYW5kCi0JbGl0dGxlX21hZ2ljLgotCSogZWNvZmYuYyAoZWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogU2V0IE1JUFMgbWFjaGluZSBudW1iZXIKLQliYXNlZCBvbiBtYWdpYyBudW1iZXIuICBTdXBwb3J0IHI0MDAwIG1hZ2ljIG51bWJlcnMuCi0JKGVjb2ZmX2dldF9tYWdpYyk6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIGVjb2ZmX2dldF9tYWdpYywgbm90IGZpZWxkcyBpbgotCXRoZSBiYWNrZW5kIHN0cnVjdHVyZS4KLQkqIGNwdS1taXBzLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGRlZCBjYXNlIGZvciByNjAwMC4KLQotCUZvciBNSVBTIGNvbmZpZ3VyYXRpb25zIHB1dCBib3RoIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiB2ZXJzaW9ucyBpbgotCXRoZSBsaXN0IG9mIHRhcmdldHM7IHRoZSBjb2RlIGlzIGdldHRpbmcgY29tcGlsZWQgaW4gYW55aG93LgotCSogYmlnbWlwcy5tdCAoU0VMRUNUX1ZFQ1MpOiBEZWZpbmUgdG8gYmUgZWNvZmZfbGl0dGxlX3ZlYy4KLQkqIGRlY3N0YXRpb24ubXQgKFNFTEVDVF9WRUNTKTogRGVmaW5lIHRvIGJlIGVjb2ZmX2JpZ192ZWMuCi0JKiBtaXBzYmVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBEZWZpbmUgdG8gYmUgYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjLgotCSogbWlwc2xlbGYubXQgKFNFTEVDVF9WRUNTKTogRGVmaW5lIHRvIGJlIGJmZF9lbGYzMl9iaXRtaXBzX3ZlYy4KLQkqIHJpc2Nvcy5tdCAoU0VMRUNUX1ZFQ1MpOiBEZWZpbmUgdG8gYmUgZWNvZmZfbGl0dGxlX3ZlYy4KLQotRnJpIFNlcCAyNCAwMDo0MjoyMyAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIG9zZi1jb3JlLmM6ICBOZXcgZmlsZSBmb3IgT1NGLzEgY29yZSBmaWxlIHN1cHBvcnQuCi0JKiBjb25maWcvYWxwaGFvc2YubWggKEhERUZJTkVTKTogIEFkZCAtRE9TRl9DT1JFLgotCShIREVQRklMRVMpOiAgU2V0IHRvIG9zZi1jb3JlLm8uCi0JKiBiZmQtaW4yLmggKHVuaW9uIHRkYXRhKTogIEFkZCBvc2ZfY29yZV9kYXRhIG1lbWJlci4KLQkqIHRhcmdldHMuYzogIElmIE9TRl9DT1JFIGlzIGRlZmluZWQsIGFkZCBvc2ZfY29yZV92ZWMgdG8gdGFyZ2V0IGxpc3QuCi0JKiBNYWtlZmlsZS5pbiAoT1BUSU9OQUxfQkFDS0VORFMpOiAgQWRkIG9zZi1jb3JlLm8uCi0JKG9zZi1jb3JlLm8pOiAgTmV3IGRlcGVuZGVuY3kuCi0KLVRodSBTZXAgMjMgMjE6MDQ6NTMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIFRPRE86IFJlbW92ZSBub3RlIGFib3V0IG1ha2luZyAtLXdpdGgtYmZkLXRhcmdldHMgdXNlIGNhbm9uaWNhbAotCXRhcmdldCBjb25maWd1cmF0aW9uIG5hbWUgKGFscmVhZHkgZG9uZSk7IHJld29yZCBpdGVtIGFib3V0Ci0Jc2VwYXJhdGluZyByZWFkaW5nIGFuZCB3cml0aW5nIHN0dWZmIHRvIG5vdCByZWZlciB0byBhCi0Jbm9uLWV4aXN0ZW50IGl0ZW0uCi0KLQkqIGVjb2ZmLmggKGVjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEFjY2VwdCBNSVBTX01BR0lDX0xJVFRMRTIKLQlhbmQgTUlQU19NQUdJQ19CSUcyLgotCi1UaHUgU2VwIDIzIDExOjA2OjM0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZ2VuLWFvdXQuYyAobWFpbik6IE91dHB1dCBuZXdsaW5lIGFmdGVyIGVuZCBvZiBjb21tZW50LCBub3QKLQliZWZvcmUuICAoUmVwb3J0ZWQgYnkgSm9uYXRoYW4gU3RvbmUsCi0Jam9uYXRoYW5Ab3NjYXIuc3RhbmZvcmQuZWR1KS4KLQotVGh1IFNlcCAyMyAxMDo0ODoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBQdXQgd2VhayBzeW1ib2xzIGluIHRoZQotCWFybWFwLgotCi0JKiBlbGZjb2RlLmggKGZpeF91cF9zdHJ0YWJzKTogU2V0IHNoX2VudHNpemUgZm9yIHRoZSAuc3RhYgotCXNlY3Rpb24sIG5vdCB0aGUgLnN0YWJzdHIgc2VjdGlvbi4gIFNldCB0aGUgdHlwZSBvZiB0aGUgLnN0YWJzdHIKLQlzZWN0aW9uIHRvIFNIVF9TVFJUQUIuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBIYW5kbGUgU0hUX1NUUlRBQiBzZWN0aW9ucy4KLQotCSogc2VjdGlvbi5jIChTRUNfREVCVUdHSU5HKTogTmV3IHNlY3Rpb24gZmxhZy4KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogSWYgc2VjdGlvbiBpcyBTSFRfUFJPR0JJVFMsCi0JYW5kIHRoZSBuYW1lIHN0YXJ0cyB3aXRoIC5kZWJ1ZywgLmxpbmUgb3IgLnN0YWIsIHNldAotCVNFQ19ERUJVR0dJTkcuICBJZiBTSFRfU1RSVEFCLCBjaGVjayBmb3IgLmRlYnVnIGFuZCAuc3RhYi4KLQkqIGVsZjMyLXRhcmdldC5oIChUQVJHRVRfQklHX1NZTSwgVEFSR0VUX0xJVFRMRV9TWU0pOiBBZGRlZAotCVNFQ19ERUJVR0dJTkcgdG8gc2VjdGlvbl9mbGFncy4KLQkqIGVsZjY0LXRhcmdldC5oIChUQVJHRVRfQklHX1NZTSwgVEFSR0VUX0xJVFRMRV9TWU0pOiBBZGRlZAotCVNFQ19ERUJVR0dJTkcgYW5kIFNFQ19DT0RFIHRvIHNlY3Rpb25fZmxhZ3MuCi0JKiBiZmQtaW4yLmg6IFVwZGF0ZWQuCi0KLVdlZCBTZXAgMjIgMTY6MzQ6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmQuYyAodGRhdGEpOiBBZGQgbHlueF9jb3JlX2RhdGEuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFNldCBmaWxlcG9zIGZvcgotCXNlY3Rpb25zIHdpdGggU0VDX0xPQUQgc2V0LCBldmVuIGlmIFNFQ19IQVNfQ09OVEVOVFMgaXMgY2xlYXIuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHNldCBzY25wdHIgdG8gemVybyBqdXN0Ci0JYmVjYXVzZSBzaXplIG9mIHNlY3Rpb24gaXMgemVyby4gIE5lZWRlZCBmb3IgSXJpeCA0LjAuNUYuCi0KLVdlZCBTZXAgMjIgMDk6NDk6MzIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IFVzZSBpOTYwLWJvdXQsIG5vdCBpOTYwLWNvZmYgZm9yIGk5NjAtKi1uaW5keSouCi0KLVdlZCBTZXAgMjIgMDc6MzQ6MDkgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE9QVElPTkFMX0JBQ0tFTkRTKTogIEFkZCBseW54LWNvcmUuby4KLQkqIGJmZC1pbjIuaCAodGRhdGEpOiAgQWRkIGx5bnhfY29yZV9kYXRhOwotCSogY29uZmlnLmJmZCBjb25maWd1cmUuaG9zdDogIEdldCByaWQgb2Ygc3VwZXJmbHVvdXMgbmV0YnNkIGFuZAotCWx5bnhvcyBlbnRyaWVzLgotCSogY29uZmlndXJlLmluOiAgQWRkIGx5bngtY29yZS5vIHRvIEx5bnggY29uZmlnLgotCSogaTM4Nmx5bnguYzogIEFkZCBkZWZzIGZvciBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIGx5bngtY29yZS5jOiAgTmV3IGZpbGUgd2l0aCBMeW54IGNvcmUgZmlsZSBzdXBwb3J0LgotCSogaG9zdHMvaTM4Nmx5bnguaDogIE1vdmUgbG90cyBvZiBob3N0IHNwZWNpZmljIGluY2x1ZGVzIHRvIGhlcmUuCi0JQWRkIGRlZiBvZiBIT1NUX0xZTlguICBSZW1vdmUgdW5uZWNlc3NhcnkgZGVmcy4KLQotTW9uIFNlcCAyMCAxOToxODoxMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogT25seSBzZXQgU0VDX0RBVEEgZm9yIGEKLQlTSEZfUFJPR0JJVFMgb3IgU0hUX1NUUlRBQiBzZWN0aW9uIGlmIFNFQ19BTExPQyBpcyBzZXQuICBOZXZlciBzZXQKLQlTRUNfREFUQSBmb3IgYSBTSEZfTk9CSVRTIHNlY3Rpb24uCi0KLQkqIG5sbTMyLWkzODYuYyAobmxtX2kzODZfbWFuZ2xlX3JlbG9jcyk6IENoZWNrIFNFQ19MT0FEIHJhdGhlcgotCXRoYW4gU0VDX0NPREUgfCBTRUNfREFUQS4gIEFkZCBzb21lIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogbmxtY29kZS5oOiBBZGQgc29tZSBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElnbm9yZSByZWxvY3MgZm9yIHNlY3Rpb25zIHRoYXQgYXJlCi0JbmVpdGhlciBjb2RlIG5vciBkYXRhLiAgSnVzdCB1c2UgdGhlIHN5bWJvbCB2YWx1ZSBmb3IgZGVidWdnaW5nCi0Jc3ltYm9sczsgZG9uJ3Qgb2Zmc2V0IGJ5IHRoZSBzZWN0aW9uIHZtYS4KLQotRnJpIFNlcCAxNyAxODowODo1NSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBEb24ndCByZXR1cm4gYW4gZXJyb3Igd2hlbgotCXBlcmZvcm1pbmcgYSByZWxvYyBhZ2FpbnN0IGFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbC4KLQkqIHN5bXMuYyAoYmZkX3ByaW50X3N5bWJvbF92YW5kZik6IFNob3cgdmFsdWUgb2YgQlNGX1dFQUsgcmF0aGVyCi0JdGhhbiBvYnNvbGV0ZSBCU0ZfRVhQT1JULgotCi1GcmkgU2VwIDE3IDAyOjA0OjMxIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBob3N0cy97YWxwaGFvc2YuaCwgYW1peC5oLCBhcG9sbG82OC5oLCBhcG9sbG92NjguaCwKLQlkZWNzdGF0aW9uLmgsIGRlbHRhODguaCwgZGd1eC5oLCBkb3NlLmgsIGdvMzIuaCwgaGFycmlzLmgsCi0JaHAzMDAuaCwgaHAzMDBic2QuaCwgaHBwYWJzZC5oLCBocHBhaHB1eC5oLCBpMzg2YWl4LmgsIGkzODZic2QuaCwKLQlpMzg2bGludXguaCwgaTM4Nmx5bnguaCwgaTM4NnYuaCwgaTM4NnY0LmgsIGlyaXgzLmgsIGlyaXg0LmgsCi0JbWlwc2JzZC5oLCBuY3IzMDAwLmgsIHJzNjAwMC5oLCBydGJzZC5oLCBzb2xhcmlzMi5oLCBzcGFyYy1sbC5oLAotCXN0ZC1ob3N0LmgsIHN0cmF0dXMuaCwgc3VuMy5oLCBzeXN2NC5oLCB0YWhvZS5oLCB1bHRyYTMuaCwKLQl2YXh1bHQuaCwgdmF4dWx0Mi5oLCB3ZTMyay5ofTogIE1ha2Ugc3VyZSB0aGF0ICJvZmZzZXRvZiIgaXMKLQlkZWZpbmVkIG9uIGFsbCBob3N0cywgbm93IHRoYXQgYXJjaGl2ZS5jIHVzZXMgaXQuCi0KLVRodSBTZXAgMTYgMTg6MjA6MzAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9tYXBfc3ltYm9scyk6IENyZWF0ZSBzZWN0aW9uIHN5bWJvbHMgZm9yIGFsbAotCXNlY3Rpb25zLCBub3QganVzdCBhbGxvY2F0ZWQgc2VjdGlvbnM7IGRlYnVnZ2luZyBzZWN0aW9ucyBjYW4gaGF2ZQotCXJlbG9jcy4KLQkoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBJZiB0aGVyZSBpcyBhbiBvdXRwdXQgc2VjdGlvbiwgdXNlCi0JdGhlIHNlY3Rpb24gaW5kZXggZnJvbSB0aGF0IHJhdGhlciB0aGFuIHRoZSBpbnB1dCBzZWN0aW9uLgotCi1UaHUgU2VwIDE2IDEyOjIwOjUwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBsaWJiZmQtaW4uaCAoYmZkX2ZsdXNoLCBiZmRfc3RhdCk6IFJlZmxlY3QgSm9obidzIGNoYW5nZXMgdG8KLQlsaWJiZmQuaCwgd2hpY2ggaXMgcmVnZW5lcmF0ZWQgZnJvbSB0aGlzIGZpbGUuCi0KLQkqIGJmZC1pbi5oIChzeW10eXBlKTogRGVsZXRlZCB0eXBlZGVmLgotCi1XZWQgU2VwIDE1IDExOjQ4OjM3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmMgKENPRVJDRXh4KTogQ2FzdCB4IHRvIGJmZF9zaWduZWRfdm1hIGJlZm9yZSBkb2luZyB0aGUKLQl4b3IgYW5kIHN1YnRyYWN0LiAgT3RoZXJ3aXNlIGl0IHdpbGwgbm90IHNpZ24gZXh0ZW5kIGlmIHRoZSB0eXBlCi0Jb2YgYmZkX3ZtYSBpcyBsYXJnZXIgdGhhbiBpbnQuCi0KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX3Bkcl9pbik6IEdldCByZWdvZmZzZXQsIGlvcHQsIGZyZWdvZmZzZXQKLQlhbmQgZnJhbWVvZmZzZXQgYXMgc2lnbmVkIG51bWJlcnMuICBGcm9tIFBldGVyIFNjaGF1ZXIuCi0KLVR1ZSBTZXAgMTQgMTg6MjA6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9ob3d0b190YWJsZSk6IEFkZCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MKLQlzcGVjaWFsIGZ1bmN0aW9uIGZvciBhbGwgcmVsb2MgZW50cmllcy4KLQkqIGVsZjMyLXRhcmdldC5oIChUQVJHRVRfTElUVExFX1NZTSk6IEFkZCBTRUNfQ09ERSB0bwotCXNlY3Rpb25fZmxhZ3MuCi0JKiBsaWJlbGYuaCAoZWxmX3N5bWJvbF90eXBlKTogUmVtb3ZlIGRlc2MsIHR5cGUgYW5kIG90aGVyIGZpZWxkcy4KLQkqIE1ha2VmaWxlLmluIChlbGYzMi0qLm8pOiBUaGVzZSBkZXBlbmQgdXBvbiBlbGYzMi10YXJnZXQuaC4KLQotVHVlIFNlcCAxNCAxNDozNDo0NSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQtaW4uaCAoc3RydWN0IGFydGRhdGEpOiAgQWRkIGFybWFwX3RpbWVzdGFtcCBhbmQKLQlhcm1hcF9kYXRlcG9zIGhlcmUgdG9vLgotCi1Nb24gU2VwIDEzIDIxOjAzOjE4IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjYWNvcGhvbnkuY3lnbnVzLmNvbSkKLQotCUltcHJvdmUgdGltZXN0YW1wIHN1cHBvcnQgaW4gQlNEIGFyY2hpdmUgZmlsZXMgdG8gYXZvaWQgbGlua2VyCi0Jd2FybmluZ3MuCi0KLQkqIGxpYmJmZC5oIChzdHJ1Y3QgYXJ0ZGF0YSk6ICBBZGQgYXJtYXBfdGltZXN0YW1wIGFuZCBhcm1hcF9kYXRlcG9zLgotCShiZmRfZmx1c2gsIGJmZF9zdGF0KTogIEFkZCBwcm90b3R5cGVzLgotCSogbGliYmZkLmMgKGJmZF9mbHVzaCk6ICBBZGQsIGRvZXMgZmZsdXNoIG9uIGEgQkZELgotCShiZmRfc3RhdCk6ICBBZGQsIGRvZXMgZnN0YXQgb24gYSBCRkQuCi0KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogQXQgZW5kIG9mIGZpbGUgd3JpdGluZywKLQl2ZXJpZnkgYW5kIHBvc3NpYmx5IHVwZGF0ZSB0aGUgdGltZXN0YW1wIGluIHRoZSBhcm1hcCwgaWYgYSBCU0QKLQlhcmNoaXZlLiAgRklYTUUhICBLbHVkZ2UgcmVjb2duaXplcyBCU0QgYXJjaGl2ZSwgcmF0aGVyIHRoYW4KLQl2ZWN0b3JpbmcgcHJvcGVybHkuICBTaG91bGQgYWRkIHRvIHh2ZWMuCi0JKGNvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogIE1vdmUgcHJvdG90eXBlIHRvIHRvcCwgYXZvaWQgUFJPVE8uCi0JKGJzZF93cml0ZV9hcm1hcCk6IFNhdmUgdGltZXN0YW1wIGFuZCBmaWxlIGxvY2F0aW9uIHRoZXJlb2YsIHdoZW4KLQl3cml0aW5nIHRoZSBhcm1hcCBpbiBhIEJTRCBmaWxlLgotCShic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6ICBOZXcgZnVuY3Rpb24gdG8gY2hlY2sgYW5kCi0JcmV3cml0ZSB0aGUgdGltZXN0YW1wLgotCi0JKiBob3N0cy9zdGQtaG9zdC5oIChvZmZzZXRvZik6ICBEZWZpbmUsIGlmIG5vdCBhbHJlYWR5LCBmb3IgYXJjaGl2ZS5jLgotCi1TYXQgU2VwIDExIDE4OjEzOjQyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2c2NvLmg6IERlZmluZSBhIGJ1bmNoIG9mIHN0dWZmIGZvciBjb3JlIGZpbGVzLgotCSogc2NvLWNvcmUuYzogUmVtb3ZlLCByZXBsYWNlIGJ5IHRyYWQtY29yZS5jLgotCSogdHJhZC1jb3JlLmM6IElmIEhPU1RfU1RBQ0tfU1RBUlRfQUREUiBpcyBkZWZpbmVkLCB1c2UgaXQuCi0JKiBjb25maWcvaTM4NnNjby5taDogVXNlIHRyYWQtY29yZSBub3Qgc2NvLWNvcmUuCi0JKiBob3N0cy9pMzg2aXNjLmgsIGNvbmZpZy9pMzg2aXNjLm1oOiBSZW1vdmUuCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIGkzODZzY28gZm9yIGlzYy4KLQkqIGNvbmZpZy9pMzg2LXNjby5tdDogUmVtb3ZlLCBpZGVudGljYWwgdG8gaTM4Ni1jb2ZmLm10LgotCSogY29uZmlnLmJmZDogVXNlIGkzODYtY29mZiBub3QgaTM4Ni1zY28uCi0KLQkqIGNvbmZpZy5iZmQ6IFJlY29nbml6ZSBpWzM0XTg2LSotc29sYXJpczIqIHNwZWNpZmljYWxseSByYXRoZXIKLQl0aGFuIHVzaW5nICotKi1zb2xhcmlzMiogKGk0ODYtdW5rbm93bi1zb2xhcmlzMiBpcyBpMzg2LWVsZiwgbm90Ci0JaTQ4Ni1lbGYgd2hpY2ggZG9lc24ndCBleGlzdCkuCi0KLUZyaSBTZXAgMTAgMTI6NTY6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBGb3IgQUxQSEFFQ09GRiwgZm9yY2UKLQlwYWRkaW5nIGZpZWxkIHRvIHplcm8uCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzRdODYtKi1uZXRic2QqKTogTmV3IHRhcmdldDsgdXNlIGkzODYtbmV0YnNkLgotCSogY29uZmlndXJlLmluOiBSZW1vdmUgYm9ndXMgbmV0YnNkMzg2IGhhbmRsaW5nLgotCi0JKiBjb2ZmLW1pcHMuYzogRG9uJ3Qgd2FybiBhYm91dCBvdmVyZmxvdyBmb3IgTUlQU19SX0pNUEFERFIgcmVsb2MuCi0JQ29ycmVjdCBvdmVyZmxvdyBkZXRlY3Rpb24gcmVxdWlyZXMgbWF0Y2hpbmcgdGhlIHVwcGVyIGZvdXIgYml0cwotCW9mIHRoZSBkZXN0aW5hdGlvbiBhZ2FpbnN0IHRoZSBQQy4KLQotVGh1IFNlcCAgOSAxNjo1Nzo0NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogTWFrZSA2NC1iaXQgc3R1ZmYgd29yayB3aXRoICItLXdpdGgtdGFyZ2V0cz1hbGwiLgotCi1UdWUgU2VwICA3IDE0OjE3OjAyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmg6IFJlbW92ZWQgc3dhcHBpbmcgcm91dGluZXMgZGVjbGFyYXRpb25zLgotCSogYmZkLWluLmg6IEFkZGVkIHN3YXBwaW5nIHJvdXRpbmUgZGVjbGFyYXRpb25zLCBhbmQgcmVuYW1lZCB0aGVtCi0JZnJvbSBfZG9fKiB0byBiZmRfKi4KLQkqIGxpYmJmZC5jOiBSZW5hbWVkIHN3YXBwaW5nIHJvdXRpbmVzIGZyb20gX2RvXyogdG8gX2JmZF8qLgotCSogQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkqIGxpYmJmZC5oLCBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLU1vbiBTZXAgIDYgMTU6Mjg6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9ob3d0b190YWJsZSk6IFNldCBwY3JlbF9vZmZzZXQgdG8gdHJ1ZSBmb3IKLQlSXzM4Nl9QQzMyLgotCi1GcmkgU2VwICAzIDEzOjA2OjEyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZW9yZ2FuaXplZCBzZXR0aW5nIG9mIG1ha2VmaWxlIHZhcmlhYmxlcyBzbwotCTY0LWJpdCBzdHVmZiB3b3JrcyBhZ2Fpbi4KLQotCSogbGliYmZkLWluLmggKF9kb19nZXQqLCBfZG9fcHV0Kik6IFJlbmFtZWQgdmlhIG1hY3JvcyB0byBjbGVhbiB1cAotCW5hbWVzcGFjZS4KLQotCSogbGliZWxmLmggKGVsZjMyX3N5bWJvbF90eXBlLCBlbGY2NF9zeW1ib2xfdHlwZSk6IERlbGV0ZWQKLQkibmF0aXZlX2VsZl9zeW0iIGZpZWxkLCBtZXJnZWQgdG8gbWFrZSBuZXcgdHlwZSAiZWxmX3N5bWJvbF90eXBlIi4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBGaWVsZCBzeW1ib2xzIGlzIG5vdyBlbGZfc3ltYm9sX3R5cGUqLgotCURlbGV0ZWQgZmllbGQgcmF3X3N5bXMuCi0JKG9ial9zeW1ib2xzKTogUmVtb3ZlIGNhc3QuCi0JKG9ial9yYXdfc3ltcyk6IERlbGV0ZWQuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCBzZXQgcmF3X3N5bXMgb3IKLQluYXRpdmVfZWxmX3N5bSBmaWVsZHMuCi0JKiBlbGYzMi1ocHBhLmM6IENoYW5nZWQgdXNlcyBvZiBlbGYzMl9zeW1ib2xfdHlwZSB0bwotCWVsZl9zeW1ib2xfdHlwZS4KLQotCUZyb20gUGV0ZSBIb29nZW5ib29tIGFuZCBKZWZmIExhdzoKLQotCSogZWxmMzItaHBwYS5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfdGNfc3ltYm9sKTogSWYgdGhlIGFyZ3VtZW50IHJlbG9jYXRpb24KLQliaXRzIGFyZSB6ZXJvIChlLmcuLCB0aGV5IHNwZWNpZnkgbm8gcmVsb2NhdGlvbnMpLCB0aGVuIGRvIG5vdAotCWV2ZW4gYm90aGVyIGFkZGluZyB0aGVpciBlbnRyaWVzIHRvIHRoZSBzeW1leHRuIHNlY3Rpb24uCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfdGNfc3ltYm9sKTogQW55IGZ1bmN0aW9uLCByZWdhcmRsZXNzCi0Jb2Ygc2NvcGUgY2FuIGhhdmUgYW4gYXJndW1lbnQgcmVsb2NhdGlvbiBzdHViLgotCi0JKiBlbGYzMi1ocHBhLmM6IChFbGYzMl9ocHBhX1N0dWJfZGVzY3JpcHRpb24pOiAgUmVuYW1lIHRoaXMKLQlzdHJ1Y3R1cmUgYW5kIHR5cGUgdG8gZWxmMzJfaHBwYV9zdHViX2Rlc2NyaXB0aW9uLiAgVGhpcyBtYWtlcwotCWl0IGNvbnNpc3RlbnQgd2l0aCB0aGUgR05VIGNvZGluZyBjb252ZW50aW9ucy4KLQkoZWxmMzJfaHBwYV9zdHViX2Rlc2NyaXB0aW9uKTogQWRkZWQgYSAnbmV4dCcgZmllbGQgdG8gYWxsb3cKLQlsaW5raW5nIG9mIHN0dWIgZGVzY3JpcHRpb24gc3RydWN0dXJlcy4KLQkoZWxmMzJfaHBwYV9zdHViX2Rlc2NyaXB0aW9uKTogQWRkZWQgYSAnc3R1Yl9saXN0UCcgZmllbGQgdG8KLQlrZWVwIHRyYWNrIG9mIGluZGl2aWR1YWwgc3R1YnMuCi0JKEVsZjMyX2hwcGFfU3R1Yl9saXN0LCBFbGYzMl9ocHBhX1N0dWJfbGlzdF9zdHJ1Y3QpOiAgUmVtb3ZlZC4KLQlDb21iaW5lZCB3aXRoIHRoZSBlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb24gc3RydWN0dXJlLgotCShlbGYzMl9ocHBhX3N0dWJfbmFtZV9saXN0KTogIE5ldyB0eXBlIHRvIGtlZXAgdHJhY2sgb2YKLQlpbmRpdmlkdWFsIHN0dWJzLgotCShhZGRfc3R1Yik6ICBSZW1vdmVkLgotCShhZGRfc3R1Yl9ieV9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShmaW5kX3N0dWJfYnlfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBBbGxvdyByZXVzaW5nIHN0dWJzIHRoYXQKLQlhbHJlYWR5IGV4aXN0LgotCShocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogQWxsb3cgcmV1c2luZyBzdHVicyB0aGF0Ci0JYWxyZWFkeSBleGlzdC4KLQotCSogZWxmMzItaHBwYS5jOiAocmV0dmFsX21pc21hdGNoZXMpOiAgVGhlIGRpcmVjdGlvbiBvZiBhcmd1bWVudAotCXJlbG9jYXRpb24gd2FzIHJldmVyc2VkLgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IFJldHVybiBhZGRyZXNzIHdhcyBub3QgYmVpbmcKLQlyZXN0b3JlZC4KLQkoaHBwYV9lbGZfYXJnX3JlbG9jX25lZWRlZF9wKTogQWRkIGFyZ3VtZW50IGNvbnRhaW5pbmcgY2FsbGVyCi0JYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIHNvIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgaW4gdGhlIGNoZWNrCi0JZm9yIHBsYWJlbCBzdHVicy4KLQkoaHBwYV9lbGZfc3R1Yl9jaGVjayk6IFBhc3MgY2FsbGVyIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBpbnRvCi0JaHBwYV9lbGZfYXJnX3JlbG9jX25lZWRlZF9wKCkuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IEFkZCBjaGVjayBmb3IgcGxhYmVsIHN0dWJzIGFuZAotCXBhc3MgY2FsbGVyIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBpbnRvCi0JaHBwYV9lbGZfYXJnX3JlbG9jX25lZWRlZF9wKCkuCi0KLVRodSBTZXAgIDIgMDA6NTk6NTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaCAoaHBwYV9maWVsZF9hZGp1c3QpOiBSZW1vdmUgdW51c2VkIGBpbml0X3ZhbHVlJyB2YXJpYWJsZS4KLQotCSogaG9zdHMvZGVsdGE4OHY0Lmg6IE5ldyBmb3IgU1ZSNC4KLQkqIGNvbmZpZ3VyZS5ob3N0czogVXNlIGl0LgotCi1XZWQgU2VwICAxIDE0OjIzOjMyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmgsIG5ldGJzZDM4Ni5jOiBDaGFuZ2UgTV9JMzg2IHRvIE1fMzg2X05FVEJTRC4gIE1fSTM4NgotCWlzIGFuIFNDTyBwcmUtZGVmaW5lLgotCi1UdWUgQXVnIDMxIDEyOjUwOjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fb2JqZWN0X3ApOiBTZXQgSEFTX1NZTVMgaWYgdGhlcmUgYXJlIGV4dGVybmFsCi0JcmVmZXJlbmNlcy4KLQkobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfe2luLG91dH0pOiBUaGUgY29weXJpZ2h0IGxlbmd0aCBpcwotCW9ubHkgb25lIGJ5dGUuCi0JKG5sbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogSW5jbHVkZSBkZWJ1Z2dpbmcgc3ltYm9scyBpbiBzeW1ib2wKLQljb3VudC4KLQkobmxtX3NsdXJwX3N5bWJvbF90YWJsZSk6IE1ha2Ugc3ltbGVuZ3RoIHVuc2lnbmVkLiAgUmVhZCBkZWJ1Z2dpbmcKLQlzeW1ib2xzIGFzIEJGRCBsb2NhbCBzeW1ib2xzLgotCShubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgYm90aGVyIHdyaXRpbmcgb3V0IGV4cG9ydGVkCi0Jc3ltYm9scyBtb3JlIHRoYW4gb25jZTsgdGhleSBub3cgYXBwZWFyIGluIHRoZSBzeW1ib2wgdGFibGUgbW9yZQotCXRoYW4gb25jZSAod2l0aCBhbmQgd2l0aG91dCBhIHByZWZpeCkgaWYgbmVjZXNzYXJ5LiAgU2V0IG9mZnNldAotCXZhbHVlcyB0byBiZSBub24temVybyBhcyBOTE1MSU5LIGRvZXMuCi0KLVR1ZSBBdWcgMzEgMTI6MDc6NDMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaDogUmVzdG9yZSAjdW5kZWZzIG9mIGVfZnNlbCBhbmQgb3RoZXIgZV8qIHN5bWJvbHMuCi0KLUZyaSBBdWcgMjcgMTY6NDM6MzUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKHN0cnVjdCBzZWMpOiBNb3ZlIHBvc2l0aW9uIG9mIHVzZXJfc2V0X3ZtYSwgYW5kCi0JZG9jdW1lbnQgaXQuCi0JKFNFQ19CQUxJR04pOiBEaXNhYmxlIGZvciBub3cuICBJIGRvbid0IHRoaW5rIGl0J3MgY3VycmVudGx5IHVzZWQuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfaG93dG9fdGFibGUpOiBOb3cgc3RhdGljLgotCShzeW1leHRfcm9vdFAsIHN5bWV4dF9sYXN0UCwgZ2xvYmFsX3ZhbHVlLCBHT1RfdmFsdWUsCi0JZ2xvYmFsX3N5bWJvbCwgZ2xvYmFsX3N5bV9kZWZpbmVkLCBzeW1leHRuX2NvbnRlbnRzLAotCXN5bWV4dG5fY29udGVudHNfcmVhbF9zaXplLCBlbGZfaHBwYV9zdHViX3Jvb3RQLAotCWVsZjMyX2hwcGFfc3ltZXh0bl9tYXAsIGVsZjMyX2hwcGFfc3ltZXh0bl9tYXBfc2l6ZSk6IFJlbHkgb24KLQlkZWZhdWx0IGluaXRpYWxpemF0aW9uLgotCShocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IE1hY3JvICJVTkRFRklORUQiIGRvZXNuJ3QgbmVlZCBhCi0JdHJhaWxpbmcgc2VtaWNvbG9uLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBJbnRyb2R1Y2UgdGVtcG9yYXJpZXMgdG8gbWFrZQotCWNvZGUgbW9yZSByZWFkYWJsZSBpbiA4MCBjb2x1bW5zLgotCi0JKiBsaWJocHBhLmggKGFsbCBmdW5jdGlvbnMpOiBOb3cgaW5saW5lIHVuZGVyIEdOVSBDLgotCi0JTW9yZSBwYXRjaGVzIGZyb20gSmVmZiBMYXc6Ci0KLQkqIGVsZjMyLWhwcGEuYyAoQVJfV0FSTik6IEdpdmUgYXJndW1lbnQgd2hpY2ggY2F1c2VkIHRoZQotCWludmFsaWQgYXJndW1lbnQgcmVsb2NhdGlvbi4KLQkoQVJfVU5JTVApOiBEZWxldGUgdW51c2VkIG1hY3JvLgotCShocHBhX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3RhYmxlX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZzogTGlrZXdpc2UuCi0KLQkqIHNvbS5jOiBOZXcgZmlsZSBjb250YWluaW5nIFNPTSBzcGVjaWZpYyBjb2RlIGV4dHJhY3RlZAotCWZyb20gaHBwYS5jCi0KLQkqIHNvbS5oOiBOZXcgZmlsZSBjb250YWluaW5nIFNPTSBzcGVjaWZpYyBjb2RlIGV4dHJhY3RlZAotCWZyb20gbGliaHBwYS5oCi0KLQkqIGhwcGEuYzogRGVsZXRlZC4KLQotCSogbGliaHBwYS5oOiBEZWxldGUgU09NIHNwZWNpZmljIGNvZGUuICBBZGQgZ2VuZXJpYyBQQQotCWNvZGUgd2hpY2ggY2FuIGJlIHNoYXJlZCBieSBib3RoIFNPTSBhbmQgRUxGIGJhY2tlbmRzLgotCi0JKiBNYWtlZmlsZS5pbjogUmVwbGFjZSBocHBhLmMgd2l0aCBzb20uYy4gIGVsZjMyLWhwcGEubwotCWRlcGVuZHMgb24gbGliaHBwYS5oIG5vdy4KLQotCSogY29uZmlndXJlLmluIChocHBhX3ZlYyk6IE5lZWRzIHNvbS5vIG1vZHVsZSBpbnN0ZWFkIG9mCi0JaHBwYS5vLgotCi0JKiBlbGYzMi1ocHBhLmM6IEluY2x1ZGUgbGliaHBwYS5oLiAgRG8gbm90IGRlZmluZQotCUJZVEVTX0lOX1dPUkQuCi0KLQkqIGVsZjMyLWhwcGEuaCAoaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlKTogRGVsZXRlCi0Jbm93IGxpdmVzIGluIGxpYmhwcGEuaC4KLQkoaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCk6IExpa2V3aXNlLgotCi0JKiBob3N0cy9ocHBhYnNkLmg6IEluY2x1ZGUgPHN0ZGxpYi5oPiBhbmQgPHVuaXN0ZC5oPi4gIERvIG5vdAotCWRlZmluZSBtYWxsb2Mgb3IgZnJlZS4KLQotCSogY29uZmlnL2hwcGEtZWxmLm10IChTRUxFQ1RfQVJDSElURUNUVVJFUyk6IERvbid0IGRlZmluZQotCVNFTEVDVF9WRUNTLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3JlbG9jYXRlX3Vud2luZF90YWJsZSk6IERlbGV0ZSB1bnVzZWQKLQl2YXJpYWJsZXMuCi0JKGVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwKTogTGlrZXdpc2UuCi0JKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoaHBwYV9lbGZfYXJnX3JlbG9jX25lZWRlZF9wKTogTGlrZXdpc2UuCi0JKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiBMaWtld2lzZS4KLQkoZWxmX3JlbG9jX21hcCk6IERlbGV0ZSwgbm8gbG9uZ2VyIHVzZWQuCi0JKGVsZl9ocHBhX3JlbG9jX21hcCk6IExpa2V3aXNlLgotCShlbGYzMl9ocHBhX3N5bWV4dG5fbWFwX21heF9zaXplKTogTGlrZXdpc2UuCi0JKGVsZjMyX2hwcGFfZ2V0X3N5bV9leHRuKTogQWJvcnQgaWYgdHlwZSBpcyBib2d1cy4KLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JhY2tlbmRfZmFrZV9zZWN0aW9ucyk6IEFkZCBwcm9jZXNzaW5nCi0Jb2YgdGhlIC5ocHBhX3Vud2luZCBzZWN0aW9uLgotCi1XZWQgQXVnIDI1IDE2OjEzOjQ5IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogcmVjb2duaXplIG04ODExMC4KLQotVHVlIEF1ZyAyNCAxNjozMjozNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQlNZXJnZWQgY2hhbmdlcyBmcm9tIEplZmYgTGF3IGFuZCBQZXRlIEhvb2dlbmJvb20gYXQgVXRhaDoKLQotCSogZWxmY29kZS5oIChlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogQWRkIGRldGVjdGlvbiBvZgotCVNIVF9OT1RFIHNlY3Rpb25zLgotCi0JKiBlbGYzMi1ocHBhLmM6Ci0JKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIsaHBwYV9lbGZfbG9uZ19icmFuY2hfbmVlZGVkX3ApOgotCU5ldyBmdW5jdGlvbnMgZm9yIHN1cHBvcnQgb2YgbG9uZyBicmFuY2ggc3R1YnMuCi0JKGhwcGFfZWxmX3N0dWJfY2hlY2ssaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogIEFkZAotCWNoZWNrIGZvciBsb25nIGJyYW5jaCBzdHVicy4KLQkoaHBwYV9sb29rX2Zvcl9zdHVicyk6ICBVbnVzZWQgZnVuY3Rpb24uICBSZW1vdmVkLgotCShocHBhX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEltcGxlbWVudCBhIFBBL0VMRi1zcGVjaWZpYwotCXZlcnNpb24gb2YgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzLgotCShocHBhX2VsZl9sb25nX2JyYW5jaF9uZWVkZWRfcCk6IE9ubHkgb3V0cHV0IGRlYnVnZ2luZyBkaWFnbm9zdGljcwotCXdoZW4gQkZEIGlzIGNvbmZpZ3VyZWQgZm9yIGRlYnVnZ2luZy4KLQotCSogZWxmMzItaHBwYS5jOiAoZWxmMzJfaHBwYV9nZXRfc3ltZXh0bl9jaGFpbik6ICBOZXcgZnVuY3Rpb24KLQl0byByZXR1cm4gYSBsaXN0IG9mIHN5bWJvbHMgdGhhdCBoYXZlIG5vbi16ZXJvIGFyZ3VtZW50Ci0JcmVsb2NhdGlvbiBiaXRzLgotCShocHBhX2VsZl9zdHViX2ZpbmlzaCk6IE1ha2Ugc3VyZSBzdHViIGdlbmVyYXRpb24gaXMgZG9uZSBvbmx5Ci0Jb25jZS4KLQotCSogZWxmMzItaHBwYS5jOiAoaHBwYV9lbGZfc3R1Yl9yZWxvYyk6ICBOZXcgZnVuY3Rpb24gZm9yCi0JZ2VuZXJhdGlvbiByZWxvY2F0aW9uIGVudHJpZXMgd2l0aGluIGEgc3R1Yi4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBDb3JyZWN0aW9ucyB0byBhcmd1bWVudAotCXJlbG9jYXRpb24gc3R1YnMuCi0KLQkqIGVsZjMyLWhwcGEuYzogTmV3ICNkZWZpbmUncyBmb3IgYXJndW1lbnQgcmVsb2NhdGlvbiB0eXBlcy4KLQkobWlzbWF0Y2hlcywgcmV0dmFsX21pc21hdGNoZXMpOiBVcGRhdGVkIHRvIHJlZmxlY3QgbmV3Ci0JYXJndW1lbnQgcmVsb2NhdGlvbiB0eXBlcy4KLQkoQ1VSUkVOVF9TVFVCX09GRlNFVCk6IE5ldyBtYWNyby4KLQotCSogZWxmY29kZS5oIChtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IFNldCB0aGUgUEZfWCBiaXQgZm9yIGRhdGEKLQlzZWdtZW50cy4KLQotCSogZWxmMzItaHBwYS5jOiAoZWxmX2hwcGFfaG93dG9fdGFibGUpOiBBZGQKLQlSX0hQUEFfU1RVQl9DQUxMXzE3IGZvciBzdXBwb3J0IG9mIGxpbmtlciBzdHViIGdlbmVyYXRpb24uCi0JKGhwcGFfZWxmX3JlbG9jKTogQWRkIHN1cHBvcnQgb2YgUl9IUFBBX1NUVUJfQ0FMTF8xNwotCXJlbG9jYXRpb24gdHlwZS4KLQotCSogZWxmMzItaHBwYS5oOiAoZWxmMzJfaHBwYV9yZWxvY190eXBlKTogQWRkCi0JUl9IUFBBX1NUVUJfQ0FMTF8xNyBmb3Igc3VwcG9ydCBvZiBsaW5rZXIgc3R1YiBnZW5lcmF0aW9uLgotCi0JKiBocHBhX3N0dWJzLmg6IEFkZCBuZXcgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIHVzZWQgaW4gbGlua2VyCi0Jc3R1YiBnZW5lcmF0aW9uLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3JlbG9jYXRlX3Vud2luZF90YWJsZSk6IFRoZSBvZmZzZXRzIGluIGFuCi0JdW53aW5kIGRlc2NyaXB0b3Igd2VyZSBpbmNvcnJlY3QuCi0KLQkqIGxpYmVsZi5oIChiZmRfZWxmX2ZpbmRfc2VjdGlvbik6IERlY2xhcmUuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZyk6ICBOZXcKLQlmdW5jdGlvbiBpbiBwbGFjZSBvZiBnbG9iYWxfc3ltIGZpZWxkIGluIGVsZl9iYWNrZW5kX2RhdGEKLQlzdHJ1Y3R1cmUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZywKLQllbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nLAotCWVsZjMyX2hwcGFfYmFja2VuZF9mYWtlX3NlY3Rpb25zLAotCWVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkciwKLQllbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogIE5ldyBmdW5jdGlvbnMgdG8KLQlwcm92aWRlIHN1cHBvcnQgb2Ygc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9ucyBhbmQgYXJndW1lbnQKLQlyZWxvY2F0aW9uIHN0dWJzLgotCShlbGZfaW5mb190b19ob3d0byk6ICBSZW1vdmUgY2FsbCB0byBhYm9ydCgpLgotCi0JKiBlbGYzMi10YXJnZXQuaDogIFN1cHBvcnQgZm9yIHNwZWNpYWwgcHJvY2Vzc2luZyBieSB0aGUgYmFja2VuZC4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiAgQWRkZWQgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcsCi0JZWxmX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcsCi0JZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nLCBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkciwKLQllbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zLCBhbmQKLQllbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gZmllbGRzLgotCSogZWxmY29kZS5oOiAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogQWRkIGEgY2hlY2sgZm9yCi0JcHJvY2Vzc29yLXNwZWNpZmljIHNlY3Rpb24gdHlwZXMuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogIEFkZCBhIGNoZWNrIGZvciBwcm9jZXNzb3Itc3BlY2lmaWMKLQlzZWN0aW9uIHR5cGVzLgotCShiZmRfZWxmMzJfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogIEFkZCBhIGNoZWNrIHRvIHNlZSBpZgotCXRoZXJlIGlzIGFueSBmaW5hbCBzZWN0aW9uIHByb2Nlc3NpbmcgdG8gYmUgZG9uZSBieSB0aGUKLQliYWNrZW5kLgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogIEFkZCBhIGNoZWNrIGZvcgotCXByb2Nlc3Nvci1zcGVjaWZpYyBzZWN0aW9uIHR5cGVzLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIFJlbW92ZSByZWZlcmVuY2UgdG8gZ2xvYmFsX3N5bSBpbiB0aGUKLQllbGZfYmFja2VuZF9kYXRhIHN0cnVjdHVyZS4gIFJlcGxhY2UgaXQgd2l0aCBhIGNhbGwgdG8KLQllbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZy4KLQkqIGxpYmVsZi5oOiBSZW1vdmUgZ2xvYmFsX3N5bSBmaWVsZCBpbiB0aGUgZWxmX2JhY2tlbmRfZGF0YQotCXN0cnVjdHVyZS4gIFJlcGxhY2UgaXQgd2l0aCBhIHNlcmllcyBvZiBiYWNrZW5kLXNwZWNpZmljCi0JZnVuY3Rpb25zLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfYnJhbmNoX3JlbG9jKTogVGhlIGZvcm1hbCBhcmd1bWVudAotCXN0dWJfc3ltIHNob3VsZCBiZSBjYWxsZWQgdGFyZ2V0X3N5bS4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBSZWZlciB0byB0aGUgc3R1YiBiZmQgKGFiZmQpCi0JcmF0aGVyIHRoYW4gdGhlIG91dHB1dCBiZmQgKG91dHB1dF9iZmQpLgotCShocHBhX2VsZl9yZWxvYyk6IEdldCByaWQgb2YgcmVmZXJlbmNlcyB0byB0aGUgZ2xvYmFsX3N5bSBmaWVsZCBpbgotCXRoZSBlbGZfYmFja2VuZF9kYXRhIHN0cnVjdHVyZS4KLQotCSogZWxmY29kZS5oIChlbGZfZmFrZV9zZWN0aW9ucyk6IENoZWNrIHRoZSBjb3JyZWN0IGNvbmRpdGlvbiBmb3IKLQkuYnNzLiAgQWxzbywgZGV0ZWN0IHRoZSBleGlzdGVuY2Ugb2YgYSAubm90ZSBzZWN0aW9uLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3JlbG9jYXRlX2luc24pOiByX2Zvcm1hdCBhcmd1bWVudCBzaG91bGQKLQloYXZlIGJlZW4gcl9maWVsZC4KLQotCSogaG9zdHMvaHBwYWJzZC5oIChIT1NUX01BQ0hJTkVfQVJDSCk6IFJlZmVyZW5jZSB0byBiZmRfYXJjaF9tNjhrCi0Jc2hvdWxkIGJlIGEgcmVmZXJlbmNlIHRvIGJmZF9hcmNoX2hwcGEuCi0KLQkqIGhwcGEuYyAoaHBwYV92ZWMpOiBSZXBsYWNlIGJmZF9mYWxzZSB3aXRoIF9iZmRfZHVtbXlfdGFyZ2V0IGluCi0JdGhlIGJmZF9jaGVja19mb3JtYXQgc3RydWN0dXJlIHRvIGF2b2lkIGEgdHlwZSBtaXNtYXRjaC4KLQotTW9uIEF1ZyAyMyAxOTkzICBTZWFuIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0JCSBhbmQgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQlBZGQgTmV0QlNEIHN1cHBvcnQ6Ci0JKiBuZXRic2QzODYuYzogTmV3IGZpbGUuCi0JKiBhb3V0eC5oOiBNYWtlIHN5bV9pc19kZWJ1Z2dlcl9pbmZvIHRydWUgZm9yIE5fRk4uCi0JKiBNYWtlZmlsZS5pbiwgYW91dC10YXJnZXQuaCwgY29uZmlnLmJmZCwgY29uZmlndXJlLmhvc3QsIGNvbmZpZ3VyZS5pbiwKLQlsaWJhb3V0LmgsIHRhcmdldHMuYzogT3RoZXIgY2hhbmdlcy4KLQotRnJpIEF1ZyAyMCAxNzowNDo1OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL204OGstZWxmLm10OiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5iZmQ6IFVzZSBpdCBmb3IgbTg4Ki0qLXN5c3Y0Ki4KLQotRnJpIEF1ZyAyMCAxNToxNjo1OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2J1aWxkX3BoZHJzKTogVW51c2VkIGZ1bmN0aW9uIGRlbGV0ZWQuCi0JKGJmZF9zaGRyX2Zyb21fc2VjdGlvbik6IERpdHRvLgotCSh3cml0ZV9yZWxvY3MpOiBEb24ndCBjaGFuZ2Ugc2VjdGlvbiBjb250ZW50cyBmb3IgYWRkZW5kLgotCShlbGZfbG9jYXRlX3NoKTogUmV0dXJuIHR5cGUgaXMgbm93IGFsd2F5cyBlbGZfaW50ZXJuYWxfc2hkciwKLQlzaW5jZSB0aGUgb3RoZXIgdHlwZXMgd2VyZSByZWFsbHkgYWxpYXNlcyBmb3IgdGhpcyB0eXBlIGFueXdheXMuCi0JRG9uJ3QgY29tcGlsZSB0aGlzIGZ1bmN0aW9uLCBzaW5jZSBpdCBpcyBzdGF0aWMgYW5kIGRvZXNuJ3QgYXBwZWFyCi0JdG8gYmUgdXNlZCBpbiB0aGlzIGZpbGUuCi0JKHN5bV9pc19nbG9iYWwpOiBSZXR1cm4gbm9uLXplcm8gZm9yIHdlYWsgc3ltYm9scy4gIEFib3J0IGlmCi0Jc2VjdGlvbiBwb2ludGVyIGlzIG51bGwuCi0JKHN3YXBfb3V0X3N5bXMpOiBSZW9yZGVyIHRlc3RzIHNvIGZ1bmN0aW9uIHN5bWJvbHMgY2FuIGJlIHdlYWsuCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCB1c2UgQlNGX0VYUE9SVC4KLQkoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSk6IE1ha2UgUkVMT0NfUFJPQ0VTU0lORyBzZWN0aW9uIHNtYWxsZXIgYnkKLQlleHRyYWN0aW5nIG91dCBzb21lIGNvbW1vbiBjb2RlLiAgQWJvcnQgaWYgQkZEIHNlY3Rpb24gc3ltYm9sIGhhcwotCW51bGwgbmFtZS4KLQkoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogVHJhbnNsYXRlIEVMRiBzZWN0aW9uIHN5bWJvbHMgaW50byBCRkQKLQlzZWN0aW9uIHN5bWJvbHMuICBEb24ndCByZWFkIHNlY3Rpb24gY29udGVudHMgdG8gZmlsbCBpbiBhZGRlbmQKLQlmaWVsZC4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaG93dG9fdGFibGUpOiBBbGwgcGFydGlhbF9pbnBsYWNlIGZpZWxkcwotCXNob3VsZCBiZSAidHJ1ZSIuCi0KLQkqIE1lcmdlZCBmcm9tIE9TRjoKLQotCVR1ZSBKdW4gMTUgMTQ6Mzg6MzIgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgRWxmX1N5bV9FeHRyYSk6IE5ldyBzdHJ1Y3R1cmUgdG8gY29udGFpbiBFTEYKLQlzcGVjaWZpYyBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wuICBQdXQgaW4gZWxmX3N5bV9udW0sIHdoaWNoCi0JZ2l2ZXMgdGhlIGV4dGVybmFsIHN5bWJvbCBudW1iZXIgaW4gdGhlIGVsZiBvYmplY3QgZmlsZSwgc2luY2UKLQlsb2NhbCBzeW1ib2xzIG11c3QgY29tZSBiZWZvcmUgZ2xvYmFsIHN5bWJvbHMuCi0JKGVsZl9zeW1fZXh0cmEpOiBOZXcgbWFjcm8uCi0JKGVsZl9zeW10YWJfbWFwKTogRGVsZXRlLCBpbiBmYXZvciBvZiB1c2luZyBFbGZfU3ltX0V4dHJhLgotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBVc2UgRWxmX1N5bV9FeHRyYSB0byBtYXAgaW50ZXJuYWwKLQlzeW1ib2wgbnVtYmVyIHRvIGV4dGVybmFsIG51bWJlci4gIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZQotCUVsZl9TeW1fRXh0cmEgZmllbGQgZm9yIHRoZSBzeW1ib2wgaW4gdGhlIHVkYXRhIGZpZWxkLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIEVsZl9TeW1fRXh0cmEgdG8gbWFwIG91dCBzeW1ib2xzLgotCi0JU3VuIEp1biAyMCAxNjozMDoxMSAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogZWxmY29kZS5oIChlbGZfb2JqX3RkYXRhKTogQWRkIGZpZWxkIHRvIGNvdW50IHRoZSBzaXplIG9mIHRoZQotCWFycmF5IG9mIHBvaW50ZXJzIHRvIHNlY3Rpb24gc3ltYm9scy4KLQkoZWxmX21hcF9zeW1ib2xzKTogQnVtcCB0aGUgbWF4IGluZGV4IG9mIHRoZSBzZWN0aW9uIHN5bWJvbHMgc28KLQl0aGF0IHdlIGRvbid0IG92ZXJ3cml0ZSBtZW1vcnkuICBTdG9yZSB0aGUgbWF4IGluZGV4IGludG8gdGhlCi0JZWxmX29ial90ZGF0YSBmaWVsZC4KLQotCVNhdCBKdW4gMTkgMTA6MTI6MjcgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29ial90ZGF0YSk6IEFkZCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHBvaW50ZXJzCi0JdG8gdGhlIHNlY3Rpb24gc3ltYm9scyB3ZSBjcmVhdGVkLiAgUmVtb3ZlIHVudXNlZCBmaWVsZAotCWludGVybmFsX3N5bXMuCi0JKGVsZl9tYXBfc3ltYm9scyk6IEZpbGwgaW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2VjdGlvbiBzeW1ib2xzLgotCU9ubHkgY3JlYXRlIHNlY3Rpb24gc3ltYm9scyBmb3Igc2VjdGlvbnMgdGhhdCBoYXZlIFNFQ19BTExPQyBzZXQsCi0JYW5kIGhhdmUgbm9uLXplcm8gc2l6ZS4KLQkoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBJZiB1ZGF0YSBpcyBOVUxMLCBhbmQgdGhpcyBpcyBhCi0Jc2VjdGlvbiBzeW1ib2wsIGxvb2sgdXAgdGhlIHNlY3Rpb24gaW4gdGhlIGxpc3Qgb2Ygc2VjdGlvbgotCXN5bWJvbHMsIGFuZCBzZXQgdGhlIHVkYXRhIHBvaW50ZXIgYXBwcm9wcmlhdGVseS4gIE90aGVyd2lzZSwgaWYKLQl1ZGF0YSBpcyBzdGlsbCBOVUxMLCBmYWlsIGFuIGFzc2VydGlvbiwgYW5kIHVzZSAwLCBpbnN0ZWFkIG9mCi0JZHJvcHBpbmcgY29yZS4KLQotRnJpIEF1ZyAyMCAxMjoxODowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgKG1pcHMtKi1lbGZsKiwgbWlwcy0qLWVsZiopOiBOZXcgdGFyZ2V0cywgdXNpbmcKLQltaXBzbGVsZiBhbmQgbWlwc2JlbGYgcmVzcGVjdGl2ZWx5LgotCSogY29uZmlnL21pcHNsZWxmLm10LCBjb25maWcvbWlwc2JlbGYubXQ6IE5ldyBmaWxlcy4KLQkqIGVsZjMyLW1pcHMuYzogQWRkZWQgc29tZSByZWxvYyBpbmZvcm1hdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbjogRml4ZWQgZXJyb3IgbWVzc2FnZS4KLQotCSogZWNvZmYuYyAoRUNPRkZfTE9OR19TSVpFKTogUmVtb3ZlZC4gIEp1c3QgdXNlIGNvbnN0YW50cy4KLQotVGh1IEF1ZyAxOSAwOTo0NTo1MSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUywgQUxMX01BQ0hJTkVTLCBCRkQzMl9CQUNLRU5EUywgQkZENjRfQkFDS0VORFMsCi0JT1BUSU9OQUxfQkFDS0VORFMpOiBBbHBoYWJldGl6ZSBlbnRyaWVzIGFuZCBhZGQgYSBmZXcgbWlzc2luZyBvbmVzLgotCSogYXJjaHVyZXMuYzogQWxwaGFiZXRpemUgZGVjbHMuCi0KLQkqIGNvbmZpZ3VyZS5pbiwgdGFyZ2V0cy5jOiBBZGQgbWlzc2luZyB2ZWN0b3JzIHRvIHRoZSB0YWJsZXMuCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpIFshU0VMRUNUX1ZFQ1NdOiBBZGQgREVGQVVMVF9WRUNUT1IuCi0JUmVtb3ZlIGhwMzAwYnNkX3ZlYyBkdWUgdG8gY2xhc2ggd2l0aCBzdW5vc19iaWdfdmVjLgotCi1UdWUgQXVnIDE3IDE4OjEyOjMyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2e21hY2gzLG9zZjFta30uaDogTmV3IGZpbGVzLCBmb3IgTWFjaCBob3N0aW5nLgotCSogaG9zdHMvaTM4Nm1hY2guaDogcmVtb3ZlZCwgcmVwbGFjZWQgYnkgaTM4Nm9zZjFtay5oLgotCSogY29uZmlnL2kzODZtYWNoMy5tdCwgaTM4Nm1hY2gzLmM6IE5ldyBmaWxlcywgZm9yIE1hY2ggYS5vdXQgZm9ybWF0LgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5ob3N0LCBjb25maWcuYmZkOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKiBob3N0cy9kZWNzdGF0aW9uLmg6IEluY2x1ZGUgPHN5cy9wYXJhbS5oPiBub3QgPG1hY2hpbmUvcGFyYW0uaD4uCi0KLVR1ZSBBdWcgMTcgMTU6MTk6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfc2VjdGlvbl9zeW1ib2wpOiBJZiBzZWN0aW9uJ3Mgb3V0cHV0X3NlY3Rpb24gaXMKLQlub3QgeWV0IHNldCwgcG9pbnQgdG8gaXRzZWxmLiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGlzIGlzCi0JY2FsbGVkIG9uIHRoZSBvdXRwdXQgZmlsZSwgbm90IHRoZSBpbnB1dCBmaWxlLgotCi0JKiBjb2ZmLXJzNjAwMC5jIChkdW1teV9yZWxvYywgUlRZUEUySE9XVE8pOiBTZXQgaG93dG8gZmllbGQgdG8gYQotCWR1bW15IHZhbHVlLCByYXRoZXIgdGhhbiBsZWF2aW5nIGl0IE5VTEwuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gpOiBTZXQgYmZkX2Vycm9yIG9uCi0JZmFpbHVyZS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzZXRfYXJjaF9tYWNoKSk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2guCi0KLVR1ZSBBdWcgMTcgMDk6NDI6MTYgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIChjcHUpOiBFeHRyYWN0IGZyb20gY2Fub25pY2FsIG5hbWUgd2l0aCBzZWQuCi0JKiBjb25maWd1cmUuaW46IERvbid0IHBhc3MgaXQuCi0KLVN1biBBdWcgMTUgMjA6NDU6NDUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oOiBSZW1vdmUge0JZVEUsV09SRCxMT05HfV9TSVpFOyB0aGV5IGFyZSBwb2ludGxlc3MgYW5kCi0JQllURV9TSVpFIGNvbmZsaWN0cyB3aXRoIGEgTWFjaCBoZWFkZXIuCi0JKiBlY29mZi5jOiBDaGFuZ2UgTE9OR19TSVpFIHRvIEVDT0ZGX0xPTkdfU0laRSBhbmQgZGVmaW5lIGl0LgotCi0JKiBjb25maWd1cmUuaG9zdDogTWFrZSBzdXJlIGFsbCBPUyBmaWVsZHMgZW5kIGluICouCi0KLUZyaSBBdWcgMTMgMTY6MzM6MzMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9zbHVycF9yZWxvY190YWJsZSk6IFVzZSBiZmRfYWJzX3NlY3Rpb24gZm9yCi0JUkVMT0NfU0VDVElPTl9OT05FIGFuZCBSRUxPQ19TRUNUSU9OX0FCUy4gIElmIGEgcmVsb2Mgc2VjdGlvbgotCWRvZXNuJ3QgZXhpc3QsIGRvbid0IHRyeSB0byBjcmVhdGUgaXQuCi0KLQkqIG5sbWNvZGUuaCAobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IHByb2NlZHVyZSBvZmZzZXRzIGFyZQotCWZyb20gc3RhcnQgb2YgY29kZSBzZWdtZW50LCBub3Qgc3RhcnQgb2YgZmlsZS4KLQkqIGNvbmZpZy9pMzg2LW5sbS5tdCAoREVGQVVMVF9WRUNUT1IpOiBJdCdzIG5sbTMyX2kzODZfdmVjLCBub3QKLQliZmRfbmxtMzJfaTM4Nl92ZWMuCi0JKiBjb25maWd1cmUuaW4gKFNFTEVDVF9WRUNTIHN3aXRjaCk6IExpa2V3aXNlLgotCi1UaHUgQXVnIDEyIDEwOjMyOjQ3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXQpOiBJZiB0aGUgdGFyZ2V0IG1hdGNoZXMgdGhlIGRlZmF1bHQKLQl0YXJnZXQsIHNldCBtYXRjaF9jb3VudCB0byAxLCB0byBpZ25vcmUgYW55IHByZXZpb3VzIG1hdGNoZXMuCi0KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IFJlbW92ZSBzcmVjLm8sIGFkZCByZWxvYzE2Lm8uCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHJlbG9jMTYubyB3aGVuIHdlIGFkZAotCWNvZmYtaDgzMDAubywgY29mZi1oODUwMC5vLCBjb2ZmLXNoLm8sIGNvZmYtejhrLm8uCi0JTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogUmVtb3ZlIHJlbG9jMTYuby4KLQotCSogY29uZmlnL3U2OGstY29mZi5tdDogRml4IHR5cG8sIERFRkFVTFRfVEFSR0VUIGZvcgotCURFRkFVTFRfVkVDVE9SLgotCi0JKiBjb25maWcvaDgzMDAtY29mZi5tdCwgaDg1MDAtY29mZi5tdCwgc2gtY29mZi5tdCwgc3QyMDAwLm10LAotCXo4ay1jb2ZmLm10IChERUZBVUxUX1ZFQ1RPUik6IERlZmluZS4gIERvbid0IGV4cGxpY2l0bHkgYWRkCi0JUy1yZWNvcmRzIHZpYSBTRUxFQ1RfVkVDUy4KLQotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKSwgTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogQWx3YXlzCi0Jc3VwcG9ydCBTLXJlY29yZHMsIGZvciBjb252ZW5pZW5jZS4KLQotVGh1IEF1ZyAxMiAwODozMDowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfaG93dG9fdGFibGUsIGFscGhhX2ZpbmlzaF9yZWxvYywKLQlhbHBoYV9lY29mZl9zd2FwX3JlbG9jX3tpbixvdXR9LCBhbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOgotCVJlYWQgYW5kIHdyaXRlIEFscGhhIHJlbG9jcy4gIENhbid0IHByb2Nlc3MgdGhlbSB5ZXQuCi0JKiBlY29mZi5jIChlY29mZl9zbHVycF9yZWxvY190YWJsZSk6IFJlY29nbml6ZSBuZXcgcmVsb2Mgc2VjdGlvbnMuCi0JSWYgdGhlIHNlY3Rpb24gZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgY3JlYXRlIGl0LgotCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9wZHJfe2luLG91dH0pOiBIYW5kbGUgbmV3IGZpZWxkcyBkZWZpbmVkCi0Jb24gdGhlIEFscGhhLgotCi0JKiBsaWJlY29mZi5oIChlY29mZl9iYWNrZW5kX2RhdGEpOiBBZGRlZCBjb25zdHJ1Y3Rvcl9yZWxvYyBhbmQKLQlmaW5pc2hfcmVsb2MgZmllbGRzLgotCSogZWNvZmYuYzogTW92ZSBNSVBTIHJlbG9jIHN1cHBvcnQgZnJvbSBoZXJlLi4uCi0JKiBjb2ZmLW1pcHMuYzogdG8gaGVyZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IEdldCBjb25zdHJ1Y3RvciByZWxvYyBob3d0bwotCWZyb20gYmFja2VuZC4KLQkoZWNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBSZW1vdmVkIE1JUFMgc3BlY2lmaWMgc3R1ZmYuICBDYWxsCi0JZmluaXNoX3JlbG9jIGJhY2tlbmQgZnVuY3Rpb24uCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZWQgTUlQUyBzcGVjaWZpYyBhc3NlcnRpb25zLgotCSogY29mZi1taXBzLmMgKG1pcHNfZmluaXNoX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEZpbGwgaW4gbmV3IGZpZWxkcy4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogVXNlIE5VTEwgZm9yIG5ldwotCWZpZWxkcy4KLQkqIHRhcmdldHMuYzogQWRkZWQgZXh0ZXJuIGZvciBlY29mZmFscGhhX2xpdHRsZV92ZWMuCi0KLQkqIGJmZC5jIChfYmZkX2hvc3RfYmlnX2VuZGlhbik6IFJlbW92ZWQuCi0JKiBiZmQtaW4uaCAoSE9TVF9CWVRFX09SREVSX0JJR19QLCBiZmRfaGVhZGVyX3R3aWRkbGVfcmVxdWlyZWQpOgotCVJlbW92ZWQuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1XZWQgQXVnIDExIDEyOjExOjIzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogTmV3IGZpbGUsIGJyb2tlbiBvdXQgb2YgY29uZmlndXJlLmluLgotCSogY29uZmlndXJlLmluOiBVc2UgaXQsIGFuZCB1c2Ugc3RhbmRhcmQgdGFyZ2V0IG5hbWVzIGZvcgotCS0td2l0aC10YXJnZXRzLCByZXBsYWNpbmcgLS13aXRoLWJmZC10YXJnZXRzLgotCi0JKiBhcmNodXJlcy5jIChhcmNodXJlc19pbml0X3RhYmxlKTogQWRkIGJmZF9zaF9hcmNoLgotCi0JKiBjb25maWd1cmUuaW46IEluY2x1ZGUgY29mZi1tNjhrLm8gZm9yIG02OGtjb2ZmdW5fdmVjLgotCUluY2x1ZGUgbmxtMzIubyBhbmQgbmxtLm8gZm9yIGJmZF9ubG0zMl9pMzg2X3ZlYy4KLQlGaXggZXJyb3IgaW4gZXJyb3IgbWVzc2FnZS4KLQotCSogb2FzeXMuYzogTWFrZSBiZmRfZXJyb3JfdmVjdG9yIGV4dGVybi4KLQotCSogY29uZmlndXJlLmluOiBJbmNsdWRlIHN0YWItc3ltcy5vIGZvciBhLm91dC9iLm91dCB0YXJnZXRzCi0JYW5kIGhwMzAwe2JzZCxocHV4fS4KLQotV2VkIEF1ZyAxMSAwNjo0MDo1MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFkZCB0aGUgLmJzcwotCXNlY3Rpb24gYmVmb3JlIHNldHRpbmcgb3V0cHV0X2hhc19iZWd1bi4KLQkobmxtX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogUmVtb3ZlIGFyZ3VtZW50IG5hbWVzIGZyb20KLQltYW5nbGVfcmVsb2NzX2Z1bmMgcHJvdG90eXBlLgotCShubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlIHNoYWRvd2luZyBsb2NhbCB2YXJpYWJsZS4KLQlEb24ndCB3cml0ZSBvdXQgZGVidWdnaW5nIHN5bWJvbHMgaWYgZGVidWdJbmZvT2Zmc2V0IGlzIC0xLiAgQWRkCi0JdGhlIGNvZGVJbWFnZU9mZnNldCB0byB0aGUgc3RhcnQsIGV4aXQsIGFuZCBjaGVjayBwcm9jZWR1cmUKLQlvZmZzZXRzLgotCSogbmxtMzItaTM4Ni5jIChubG1faTM4Nl93cml0ZV9yZWxvYywgbmxtX2kzODZfbWFuZ2xlX3JlbG9jcyk6Ci0JRG9uJ3QgY2hlY2sgcGFydGlhbF9pbnBsYWNlIGZpZWxkOyBpdHMgdmFsdWUgaXMgaXJyZWxldmFudC4KLQotCSogQmFzZSB1c2Ugb2Ygc2NvLWNvcmUgb24gaG9zdCwgbm90IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0XTg2LSotc2NvKik6IFVzZSBpMzg2c2NvIHJhdGhlciB0aGFuIGkzODZ2LgotCSogY29uZmlnL2kzODYtc2NvLm10IChUREVGSU5FUyk6IFJlbW92ZWQuCi0JKiBjb25maWcvaTM4NnNjby5taDogTmV3IGZpbGUgdG8gdXNlIHNjby1jb3JlLgotCSogaG9zdHMvaTM4NnNjby5oOiBOZXcgZmlsZTsganVzdCBpbmNsdWRlcyBob3N0cy9pMzg2di5oLgotCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF97aGRyLGV4dH1fe2luLG91dH0pOiBVc2Ugc2lnbmVkCi0JY29udmVyc2lvbnMgZm9yIHNvbWUgZmllbGRzLgotCi1UdWUgQXVnIDEwIDEzOjMyOjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfZ3ByZWxfcmVsb2MpOiBJZiBfZ3AgaXMgbm90IGRlZmluZWQsIGdpdmUgYW4KLQllcnJvciByYXRoZXIgdGhhbiBhYm9ydGluZy4KLQotCSogbGlibmxtLmggKHN0cnVjdCBubG1fYmFja2VuZF9kYXRhKTogQWRkZWQgbWFjaCBmaWVsZC4KLQkobmxtX21hY2hpbmUpOiBOZXcgYWNjZXNzb3IgbWFjcm8uCi0JKiBubG0uYyAobmxtX21rb2JqZWN0KTogU2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBmcm9tIGJhY2tlbmQKLQlpbmZvcm1hdGlvbi4KLQkqIG5sbTMyLWkzODYuYyAobmxtMzJfaTM4Nl9iYWNrZW5kKTogSW5pdGlhbGl6ZSBuZXcgbWFjaCBmaWVsZC4KLQotVHVlIEF1ZyAxMCAwOTozMToxOCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVwbGFjZSBjYWxscyB0byBzb3J0IHdpdGggc2hlbGwgY29kZQotCXRvIHVuaXEgdGhlIGxpc3RzLgotCi1UdWUgQXVnIDEwIDA2OjIzOjE2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBJbmNsdWRlIGFvdXQzMi5vIGZvciBhbnkgYS5vdXQvYi5vdXQgZm9ybWF0cy4KLQotTW9uIEF1ZyAgOSAwOTozNzoxOCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9pMzg2LWxpbnV4Lm10IChTRUxFQ1RfVkVDUyk6IFN1cHBvcnQgYmZkX2VsZjMyX2kzODZfdmVjLgotCSogY29uZmlnL202OGstZWxmLm10IChTRUxFQ1RfVkVDUyk6IFN1cHBvcnQgbTY4a2NvZmZfdmVjLgotCSogY29uZmlnL2kzODYtZWxmLm10IChTRUxFQ1RfVkVDUyk6IFN1cHBvcnQgaTM4NmNvZmZfdmVjLgotCSogY29uZmlnL2hwcGEtZWxmLm10IChTRUxFQ1RfVkVDUyk6IFN1cHBvcnQgaHBwYV92ZWMuCi0JKiBjb25maWcvc3BhcmMtZWxmLm10IChTRUxFQ1RfVkVDUyk6IFN1cHBvcnQgc3Vub3NfYmlnX3ZlYy4KLQkqIGNvbmZpZy9pMzg2LXNjby5tdCAoU0VMRUNUX1ZFQ1MpOiBEb24ndCBkZWZpbmU7IElhbiBzYXlzIGl0IHdhcwotCWp1c3QgYSBoYWNrLgotCi1Nb24gQXVnICA5IDEzOjE1OjAwIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL204OGstY29mZi5tdCAoREVGQVVMVF9WRUMgLT4gREVGQVVMVF9WRUNUT1IpOiByZW5hbWVkLgotCi1Nb24gQXVnICA5IDE0OjI2OjQ1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc3ltcy5jIChCU0ZfRVhQT1JUKTogTm93IHNhbWUgYXMgQlNGX0dMT0JBTC4KLQotCSogYmZkLmMgKGJmZF9zY2FuX3ZtYSk6IE5ldyBmdW5jdGlvbi4KLQotTW9uIEF1ZyAgOSAxMToyOTo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIChiZmRfZ2V0X2FyY2hpdGVjdHVyZSwgYmZkX2dldF9tYWNoaW5lKTogUmVtb3ZlZAotCW9ic29sZXRlIG1hY3Jvcy4KLQkqIGJmZC1pbjIuaDogVXBkYXRlZC4KLQotCSogZWNvZmYuYyAoZWNvZmZfc2x1cnBfYXJtYXApOiBDb3JyZWN0IGJ1ZyBpbiBpbml0aWFsaXphdGlvbiBvZgotCXN0cmluZ2Jhc2UuCi0KLVN1biBBdWcgIDggMTI6MjE6MTMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSB1bm5lZWRlZCB0ZXN0LgotCi1TdW4gQXVnICA4IDEyOjQxOjIyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoe2Rpc3QscmVhbH1jbGVhbik6IFVzZSAkKE1BS0UpLCBub3QgbWFrZS4KLQotU2F0IEF1ZyAgNyAwOToxNDoyMSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9zdDIwMDAubXQgKFRERUZJTkVTKTogRG9uJ3QgZGVmaW5lIE1SSTsgbm90IHVzZWQuCi0KLQkqIFBPUlRJTkcsIFRPRE8sIGNvbmZpZy9SRUFETUU6IFVwZGF0ZSB0byByZWZsZWN0IGJlbG93IGNoYW5nZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVwbGFjZSBNSU5JTUlaRSBhbmQgLS13aXRoLW1pbmltYWwtYmZkIHdpdGgKLQktLXdpdGgtYmZkLXRhcmdldHM9InRhcmdldDEsdGFyZ2V0MiwuLi4iIGFuZCB0aGUgc3BlY2lhbCB0YXJnZXQKLQkiYWxsIiB0byBnZXQgdGhlIHByZXZpb3VzIGRlZmF1bHQgYmVoYXZpb3IuCi0JRmlndXJlIG91dCB3aGljaCBhcmNoaXRlY3R1cmUgYW5kIGJhY2tlbmQgLm8gZmlsZXMgYXJlIG5lZWRlZCBmcm9tCi0JREVGQVVMVF9WRUNUT1IsIFNFTEVDVF9WRUNTLCBhbmQgU0VMRUNUX0FSQ0hJVEVDVFVSRVMgYXMgc2V0IGluCi0JdGhlIC5tdCBmaWxlcy4gIERlZmluZSBUREVGQVVMVFMgYmFzZWQgb24gdGhlbSwgYWxzby4KLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSByZWZlcmVuY2VzIHRvIE1JTklNSVpFLgotCSogYXJjaHVyZXMuYywgdGFyZ2V0cy5jOiBEaXR0by4KLQotCSogY29uZmlnLyoubXQ6IERlZmluZSBERUZBVUxUX1ZFQ1RPUiwgU0VMRUNUX1ZFQ1MsIGFuZAotCVNFTEVDVF9BUkNISVRFQ1RVUkVTIGFzIHZhcmlhYmxlcyByYXRoZXIgdGhhbiBhcyAtRCBhcmd1bWVudHMgdG8KLQlUREVGQVVMVFMuCi0KLQkqIGNvbmZpZy9hMjlrLWNvZmYubXQsYWxwaGFvc2YubXQsIGkzODYtc2NvLm10LCBpOTYwLWJvdXQubXQsCi0JaTk2MC1jb2ZmLm10IChUREVGQVVMVFMpOiBEb24ndCBwdXQgdGhlIGRlZmF1bHQgdmVjdG9yIGluCi0JU0VMRUNUX1ZFQ1MgbWFudWFsbHk7IGl0J3MgYXV0b21hdGljIG5vdy4KLQotCSogY29uZmlnL2kzODYtc2NvLm10IChUREVGQVVMVFMpOiBEb24ndCBwdXQgJnNjb19jb3JlX3ZlYyBpbgotCVNFTEVDVF9WRUNTIG1hbnVhbGx5OyAtRFNDT19DT1JFIGRvZXMgaXQgYXV0b21hdGljYWxseSBub3cuCi0KLQkqIGNvbmZpZy9oODMwMC1jb2ZmLm10LGg4NTAwLWNvZmYubXQsc2gtY29mZi5tdCxzdDIwMDAubXQsejhrLWNvZmYubXQKLQkoVERFRkFVTFRTKTogRG9uJ3QgZGVmaW5lIEJGRDsgbm90IHVzZWQuCi0KLQkqIGNvbmZpZy9ocHBhb3NmLm1oIChIREVGSU5FUyk6IERvbid0IGRlZmluZSBTRUxFQ1RfQVJDSElURUNUVVJFUzsKLQl0aGlzIGlzIGEgaG9zdCwgbm90IGEgdGFyZ2V0LgotCi1TYXQgQXVnICA3IDA1OjI4OjAzIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6ICBBZGQgY29tbWVudCBhYm91dCB3aGF0IHRoaXMgZnVuY3Rpb24KLQlkb2VzIGFuZCB0byB3YXRjaCBvdXQgZm9yIHNpZGUgZWZmZWN0cy4gIEFkZCBGSVhNRSBmb3IgbWVtb3J5IGxlYWtzLgotCUZpeCBjb21tZW50IGFib3V0IGNoZWNraW5nIGZvciBtYXRjaGluZyBieXRlIG9yZGVyLiAgUHJlc2VydmUKLQlwb2ludGVyIHRvIG9sZCB0ZGF0YSAoaWYgYW55KSwgYW5kIHJlc3RvcmUgaXQgaWYgd2UgZG9uJ3QgbWF0Y2gKLQlmaWxlIHdpdGggdGFyZ2V0IHZlY3Rvci4gIElmIHdlIGFyZSBnb2luZyB0byB1c2UgZ290bydzLCB1c2UgdGhlbQotCWNvbnNpc3RlbnRseSBhbmQgbWFpbnRhaW5hYmx5LgotCSogbmxtY29kZS5oIChubG1fb2JqZWN0X3ApOiAgRXhwYW5kIGNvbW1lbnRzIGFib3V0IGxlYWtlZCBtZW1vcnkKLQl0byBub3RlIHRoYXQgdGhlIHByb2JsZW0gaXMgZXZlbiBtb3JlIHNlcmlvdXMgdGhhbiBqdXN0IGxlYWtlZAotCW1lbW9yeS4gIFJlcGxhY2UgZ290byB3aXRoIG1vcmUgdHJhZGl0aW9uYWwgcmV0dXJuLgotCi1GcmkgQXVnICA2IDEyOjAwOjAzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCUZpeCBpbmNvcnJlY3Qgb3IgdXNlbGVzcyBtYWtlZmlsZSB2YXJpYWJsZSBkZWZpbml0aW9uczoKLQkqIGNvbmZpZy9uZXdzLm10LCBjb25maWcvdTY4ay1jb2ZmLm10IChUREVGQVVMVFMpOiBVc2UgdGhpcyB0bwotCWRlZmluZSBERUZBVUxUX1ZFQ1RPUiwgaW5zdGVhZCBvZiBUREVGSU5FUy4KLQkqIGNvbmZpZy9pMzg2YWl4Lm1oIChNSU5JTUlaRSk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9ocHBhb3NmLm1oIChNSU5JTUlaRSk6IERvbid0IGNvbmRpdGlvbmFsaXplLgotCSogY29uZmlnL3JzNjAwMC5taCAoQUxMT0NBKSwKLQkqIGNvbmZpZy9pMzg2di5taCAoQUxMT0NBKSwKLQkqIGNvbmZpZy9pMzg2bGludXgubWggKEFMTE9DQSksCi0JKiBjb25maWcvaTM4NmlzYy5taCAoQUxMT0NBKSwKLQkqIGNvbmZpZy9nbzMyLm1oIChFWFRSQUxJQlMpOiBEb24ndCBkZWZpbmU7IG5vdCB1c2VkLgotCSogY29uZmlnL3NvbGFyaXMyLm1oIChIREVGSU5FUyk6IFJlbmFtZWQgZnJvbSBIX0RFRklORVMuCi0JKiBjb25maWcvYWxwaGFvc2YubXQgKFRERUZJTkVTKTogU2V0IGl0LCBub3QgSERFRklORVMuCi0JKiBjb25maWcvejhrLWNvZmYubXQgKENDKTogRG9uJ3QgZGVmaW5lLiAgSXQncyBhIHRhcmdldCwgbm90IGEgaG9zdC4KLQotCSogY29uZmlnL1JFQURNRTogTmV3IGZpbGUsIGV4cGxhaW5pbmcgdGhlIHZhcmlhYmxlcy4KLQotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogQWRkIGhwMzAwX2JzZF92ZWMuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMsIENGSUxFUyk6IEFkZCBocDMwMGJzZC4KLQkoaHAzMDBic2Qubyk6IE5ldyBydWxlLgotCi1GcmkgQXVnICA2IDE1OjEzOjIyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbGliZWxmLmggKE5BTUUpOiBQcm92aWRlIGEgZGVmYXVsdCBkZWZpbml0aW9uLCB0aGF0J3MgbmVpdGhlcgotCWZvciAzMiBiaXRzIG5vciBmb3IgNjQuCi0KLQlUdWUgSnVuIDE1IDE0OjM4OjMyIDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBsaWJlbGYuaCAoZWxmX2hhc2gpOiBDaGFuZ2UgZGVjbGFyYXRpb24gdG8gYmZkX2VsZl9oYXNoLCBzaW5jZQotCXRoYXQgaXMgd2hhdCBpcyBpbiBlbGYuYy4KLQotRnJpIEF1ZyAgNiAxMjoyODozOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IFJlbW92ZWQgc3BlY2lhbCBoYW5kbGluZyBmb3IKLQlzY0JzcyBhbmQgc2NTQnNzIHN5bWJvbHMsIHNpbmNlIGl0IHdhcyB3cm9uZy4KLQotCSogTWFrZWZpbGUuaW4gKGNvZmYtbWlwcy5vLCBjb2ZmLWFscGhhLm8pOiBEb24ndCBkZXBlbmQgb24KLQljb2ZmY29kZS5oLgotCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IEluc3BpcmVkIGJ5IG1iQHR0aS5DT00gKE1pY2hhZWwKLQlCbG9vbSk6IE9ubHkgc2V0IFNUWVBfQlNTIGZvciBTRUNfQUxMT0Mgc2VjdGlvbnMuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NsdXJwX2FybWFwKTogRnJvbSBBcm5lIEhlbnJpayBKdXVsCi0JPGFybmVqQGthcmkuZm0udW5pdC5ubz46IEhhbmRsZSBhIENPRkYgc3R5bGUgYXJtYXAuCi0KLUZyaSBBdWcgIDYgMDk6NTk6NDUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhwdXgtY29yZS5jOiBDYXN0IHJldHVybiB2YWx1ZSBmcm9tIGJmZF96YWxsb2MuCi0KLVRodSBBdWcgIDUgMTM6MjI6NDQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChsb2cyKTogRGVsZXRlIGkzODctc3BlY2lmaWMgY29kZS4KLQotCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogQWx3YXlzIGluY2x1ZGUgZWxmLm8uCi0JKEJGRDMyX0JBQ0tFTkRTKTogRG9uJ3QgaW5jbHVkZSBlbGYubyBoZXJlLgotCShvZmlsZXMpOiBEZWxldGUgcmVmZXJlbmNlcyB0byBvZmlsZXMyIGFuZCBvZmlsZXMzLgotCShkb19jbGVhbik6IERlbGV0ZSBvZmlsZXMuCi0JKEJGRElOX0gpOiBDaGFuZ2VkIHJlZmVyZW5jZXMgdG8gJChzcmNkaXIpL2JmZC1pbjIuaC4KLQkoc3RtcC1iZmQuaCk6IFVzZSBiZmQuaC1uZXcgYXMgdGVtcG9yYXJ5IG5hbWUsIG5vdCBiZmQuaDIuCi0JKGhlYWRlcnMpOiBVc2UgYmZkLWluMi5oLW5ldyBhcyB0ZW1wb3JhcnkgbmFtZSwgbm90IGJmZC5oLW5ldy4KLQotCSogYmZkLWluLmg6IFJld29yZGVkIGNvbW1lbnQgdG8gbWFrZSBpdCBjbGVhciB0aGF0IGJmZC1pbjIuaCBpcyBhCi0JZ2VuZXJhdGVkIGZpbGUuCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IEFkZGVkIGkzODYtZWxmIHJlbG9jIHR5cGVzCi0JKGZyb20gTWVpc3NuZXIncyBhZGRpdGlvbnMgdG8gYmZkLWluMi5oKS4KLQotCSogZWxmMzItaTM4Ni5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0KLQlNZXJnZWQ6Ci0KLQlXZWQgSnVuIDIzIDA2OjA1OjU4IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBlbGZjb2RlLmggKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBkcm9wIGNvcmUgaWYKLQllbGZfc3ltYm9sX2Zyb20gcmV0dXJucyBhIE5VTEwgcG9pbnRlciB3aGVuIHByb2Nlc3NpbmcgYSBub24tZWxmCi0Jc3ltYm9sLCB1c2UgYSAwIHNpemUgaW5zdGVhZC4KLQotCVR1ZSBKdW4gMTUgMTQ6Mzg6MzIgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2hhc2gpOiBEZWxldGUgbWFjcm8gbWFwcGluZyBlbGZfaGFzaCB0bwotCWJmZF9lbGYzMl9oYXNoLCBzaW5jZSB0aGUgaGFzaCB0YWJsZSBpcyBpbmRlcGVuZGVudCBvZiB0aGUgMzIvNjQKLQliaXQgc3lzdGVtLgotCi0JKiBsaWJlbGYuaCAoZWxmX2hhc2gpOiBDaGFuZ2UgZGVjbGFyYXRpb24gdG8gYmZkX2VsZl9oYXNoLCBzaW5jZQotCXRoYXQgaXMgd2hhdCBpcyBpbiBlbGYuYy4KLQotCVNhdCBKdW4gMTkgMTA6MTI6MjcgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGVsZjMyLWkzODYuaCAocmVsb2NfdHlwZSk6IFJlZm9ybWF0IHNwYWNpbmcuCi0JKGVsZl9ob3d0b190YWJsZSk6IEFkZCB0aGUgcmVzdCBvZiB0aGUgMzg2L0VMRiByZWxvY2F0aW9ucy4KLQkoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBEaXR0by4KLQkoZWxmX2kzODZfaW5mb190b19ob3d0byk6IERpdHRvLgotCShlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvX3JlbCk6IERpdHRvLgotCi1UaHUgQXVnICA1IDEwOjA3OjQzIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiAgVGVzdCByZXR1cm4gdmFsdWUKLQlvZiBubG1fc2x1cnBfc3ltYm9sX3RhYmxlIGFzIGJvb2xlYW4sIG5vdCBwb2ludGVyLgotCSogbmxtY29kZS5oIChubG1fY2Fub25pY2FsaXplX3JlbG9jKTogIFRlc3QgcmV0dXJuIHZhbHVlCi0Jb2YgbmxtX3NsdXJwX3JlbG9jX2ZpeHVwcyBhcyBib29sZWFuLCBub3QgcG9pbnRlci4KLQotV2VkIEF1ZyAgNCAxNjoyMjo1NSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9nbzMyLm1oOiByZW1vdmUgSERFRklORVM7IHNpbmNlIF9fTVNET1NfXyBhbmQgX19HTzMyX18KLQlhcmUgbm93IHByZWRlZmluZWQgYnkgR0NDCi0KLVdlZCBBdWcgIDQgMTY6MDY6MjkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogQWRkIHRoZSBzZWN0aW9uIG9mZnNldCB0byB0aGUKLQlsaW5lIG51bWJlciBhZGRyZXNzLCBzbyBpdCdzIHByaW50ZWQgdGhlIHNhbWUgd2F5IGFzIHRoZSBmdW5jdGlvbgotCWFkZHJlc3MuICBPbmx5IHNob3dlZCB1cCBmb3IgbGluZSBudW1iZXJzIHRoYXQgYXJlbid0IGluIHRoZSBmaXJzdAotCXNlY3Rpb24gKC50ZXh0KS4KLQotV2VkIEF1ZyAgNCAwODozMzo1NSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxpYm5sbS5oIChubG1fYmFja2VuZF9kYXRhKTogQWRkZWQgbmxtX21hbmdsZV9yZWxvY3MuCi0JKG5sbV9tYW5nbGVfcmVsb2NzX2Z1bmMpOiBOZXcgbWFjcm8uCi0JKiBubG0zMi1pMzg2LmMgKG5sbV9pMzg2X3dyaXRlX3JlbG9jKTogUmV3cm90ZSBjb3JyZWN0bHkuCi0JKG5sbV9pMzg2X21hbmdsZV9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBubG1jb2RlLmggKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBNb3ZlIGFsbCBjb21tb24KLQlzeW1ib2xzIGludG8gdGhlIC5ic3Mgc2VjdGlvbi4KLQkobmxtX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2FsbCB0aGUgbWFuZ2xlX3JlbG9jcyBmdW5jdGlvbi4KLQkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFRyZWF0IGEgcmVsb2MgYWdhaW5zdCBhbnkgZGVmaW5lZAotCXN5bWJvbCBhcyBhbiBpbnRlcm5hbCByZWxvYy4gIEZpeCBidWcgaW4gZXh0ZXJuYWwgcmVsb2MgY291bnRpbmcuCi0JR2V0IHRoZSBvZmZzZXQgYW5kIGRlYnVnZ2luZyB0eXBlIHJpZ2h0IGZvciAuYnNzIHN5bWJvbHMuICBPbmx5Ci0Jb3V0cHV0IGRlYnVnZ2luZyBzeW1ib2xzIGZvciBkZWZpbmVkIHN5bWJvbHMuCi0KLQkqIGNvZmYtaDg1MDAuYyAocnR5cGUyaG93dG8pOiBEbyBhbiBmcHJpbnRmIHRvIHN0ZGVyciByYXRoZXIgdGhhbgotCXVzaW5nIHByaW50Zi4KLQkqIGNvZmYtejhrLmMgKHJ0eXBlMmhvd3RvKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChkdW1teV9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKFRSQUNFKTogTGlrZXdpc2UuCi0JKiBocDMwMGhwdXguYyAoY29udmVydF9zeW1fdHlwZSwgc3dhcF9zdGRfcmVsb2NfaW4pOiBMaWtld2lzZS4KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBEbyBhbiBmcHJpbnRmIHRvIHRoZSBmaWxlCi0JYXJndW1lbnQgcmF0aGVyIHRoYW4gdXNpbmcgcHJpbnRmLgotCi1UdWUgQXVnICAzIDE4OjE3OjI1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZnN3YXAuaDogQWRkZWQgbWFjcm9zIHVzZWQgd2hlbiBhY2Nlc3Npbmcgc2V2ZXJhbCBmaWVsZHM7Ci0JZGVmYXVsdCBpcyB0aGUgc2FtZSBhcyBiZWZvcmUuCi0JKGNvZmZfc3dhcF9hb3V0aGRyX3tpbixvdXR9KTogSGFuZGxlIHRoZSBBbHBoYSBFQ09GRiBmaWVsZHMuCi0JKiBjb2ZmLWFscGhhLmM6IERlZmluZWQgbWFjcm9zIHRvIHVzZSB0aGUgcmlnaHQgc2l6ZXMgaW4KLQljb2Zmc3dhcC5oLgotCSogbGliZWNvZmYuaDogQmFja2VuZCBpbmZvcm1hdGlvbiBpcyBub3cgaW4gdGFyZ2V0IHZlY3Rvciwgbm90Ci0JQkZELiAgU3RhcnQgb2YgYmFja2VuZCBpbmZvcm1hdGlvbiBpcyBDT0ZGIGJhY2tlbmQgaW5mb3JtYXRpb24uCi0JKiBjb2ZmLWFscGhhLmMsIGNvZmYtbWlwcy5jOiBDaGFuZ2VkIGFjY29yZGluZ2x5LgotCSogZWNvZmYuYyAoZWNvZmZfbWtvYmplY3QpOiBOZXcgZnVuY3Rpb24uCi0JKEFSTUFQX1NUQVJUKTogQ2hhbmdlZCBpbnRvIGJhY2tlbmQgaW5mb3JtYXRpb24sIHNpbmNlIEFscGhhIHVzZXMKLQlhIGRpZmZlcmVudCBuYW1lLgotCShlY29mZl9zbHVycF9hcm1hcCk6IERvbid0IG92ZXJsYXkgYXJjaGl2ZSBoZWFkZXIuCi0JKiBiZmQuYzogSW5jbHVkZSBsaWJjb2ZmLmguCi0KLVR1ZSBBdWcgIDMgMTY6MzM6MTEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEZpeCBzaCBzeW50YXggZXJyb3IuCi0KLQkqIGFvdXRmMS5oOiBNYWtlIGJmZF9lcnJvcl90cmFwIGV4dGVybjsgaXQncyBkZWZpbmVkIGluIGJmZC5jLgotCi1UdWUgQXVnICAzIDE1OjE5OjA5IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBubG1fc2x1cnBfc3ltYm9sX3RhYmxlOiBEb24ndCB1c2UgJyYnIG9uIGFycmF5cy4KLQotVHVlIEF1ZyAgMyAxMTowNjoyOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmM6IE5ldyBmaWxlIGZvciBnZW5lcmljIEVDT0ZGIGZ1bmN0aW9ucy4KLQkqIGVjb2Zmc3dhcC5oOiBOZXcgZmlsZSBmb3IgRUNPRkYgc3dhcHBpbmcgZnVuY3Rpb25zIHdoaWNoIGRpZmZlcgotCW9ubHkgc2xpZ2h0bHkgZm9yIGRpZmZlcmVudCB0YXJnZXRzLgotCSogbGliZWNvZmYuaDogQWRkZWQgcHJvdG90eXBlcyBmb3IgZWNvZmYuYyBmdW5jdGlvbnMuCi0JKGVjb2ZmX2JhY2tlbmRfZGF0YSk6IE5ldyBzdHJ1Y3R1cmUuCi0JKGVjb2ZmX3RkYXRhKTogQWRkZWQgYmFja2VuZF9kYXRhIGZpZWxkLiAgQ2hhbmdlZCBleHRlcm5hbCBkYXRhCi0JcG9pbnRlcnMgdG8gYmUgUFRSIHJhdGhlciB0aGFuIHRvIGEgcGFydGljdWxhciBzdHJ1Y3QuCi0JKGVjb2ZmX3N5bWJvbF9zdHJ1Y3QpOiBNb3ZlZCBpbiBmcm9tIGNvZmYtbWlwcy5jLgotCSogY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYzogTW92ZWQgY29tbW9uIGZ1bmN0aW9ucyBpbnRvIGVjb2ZmLmMuCi0JQWRkZWQgRUNPRkYgYmFja2VuZCBzdHJ1Y3R1cmVzLiAgSW5jbHVkZSBlY29mZnN3YXAuaC4KLQkqIGNvZmYtbXN5bS5jOiBSZW1vdmVkOyBzdXBlcnNlZGVkIGJ5IGVjb2Zmc3dhcC5oLgotCSogYmZkLmM6IEluY2x1ZGUgY29mZi9pbnRlcm5hbC5oLgotCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogUmVtb3ZlZCBjb2ZmLW1pcHMubyBhbmQgY29mZi1tc3ltLm8uCi0JQWRkZWQgZWNvZmYuby4KLQkoQkZENjRfQkFDS0VORFMpOiBBZGRlZCBjb2ZmLWFscGhhLm8uCi0JKENGSUxFUyk6IFJlbW92ZWQgY29mZi1tc3ltLmMuICBBZGRlZCBlY29mZi5jLgotCShiZmQubyk6IEFkZGVkIGRlcGVuZGVuY3kgb24gJChJTkNESVIpL2NvZmYvc3ltLmguCi0JKGNvZmYtbWlwcy5vKTogQWRkZWQgZGVwZW5kZW5jeSBvbiBlY29mZnN3YXAuaCBhbmQgY29mZi9lY29mZi5oLgotCShlY29mZi5vLCBjb2ZmLWFscGhhLm8pOiBOZXcgdGFyZ2V0cy4KLQkoY29mZi1tc3ltLm8pOiBSZW1vdmVkIHRhcmdldC4KLQotTW9uIEF1ZyAgMiAyMzozMzozOCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaHBwYS5oLCBob3N0cy8qOiAgUmVtb3ZlIChvbmUgbW9yZSB0aW1lKSBhbGwgb2NjdXJyYW5jZXMKLQlvZiBFWEZVTiBpbiB0aGUgQkZEIHNvdXJjZXMuICBIZWF2ZSBobyEKLQotTW9uIEF1ZyAgMiAxNjo0NTo1NyAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6ICBBZGQgY2hlY2sgZm9yIEkzODZMWU5YTUFHSUMuCi0KLU1vbiBBdWcgIDIgMTI6MTg6MDMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdW4zLmg6IHJlbW92ZSBzb21lIG1vcmUgY29uZmxpY3RpbmcgZGVjbHMKLQotTW9uIEF1ZyAgMiAxMTo0ODoyMyAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBpMzg2bHlueC5jOiAgUmVtb3ZlIHVubmVjZXNzYXJ5IGRlZiBvZiBOX0hFQURFUl9JTl9URVhULAotCXJlZGVmaW5lIFRFWFRfU1RBUlRfQUREUiB0byBiZSAwLgotCi1TdW4gQXVnICAxIDIyOjU0OjA4IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0LCBjb25maWd1cmUuaW4sIGhvc3RzL2kzODZseW54Lmg6ICBMeW54LzM4NgotCWhvc3QgYW5kIHRhcmdldCBpbmZvLgotCi1GcmkgSnVsIDMwIDE4OjA4OjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtMzItaTM4Ni5jOiBOZXcgZmlsZS4gIEZpcnN0IGN1dCBhdCBpMzg2IE5MTSBjb2RlLgotCSogbGlibmxtLmg6IEFkZGVkIHNvbWUgbW9yZSBwcm90b3R5cGVzLgotCShzdHJ1Y3QgbmxtX3JlbGVudCk6IE5ldyBzdHJ1Y3R1cmUuCi0JKG5sbU5BTUUoc3ltYm9sX3R5cGUpKTogQWRkZWQgcmNudCBhbmQgcmVsb2NzIGZpZWxkcy4KLQkoc3RydWN0IG5sbV9vYmpfdGRhdGEpOiBBZGRlZCBuZXcgZmllbGRzOiBubG1fc3ltYm9scywKLQlubG1fdGV4dF9sb3csIG5sbV9kYXRhX2xvdywgbmxtX3JlbG9jX2ZpeHVwcywKLQlubG1fcmVsb2NfZml4dXBfc2Vjcy4KLQkoc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEpOiBOZXcgc3RydWN0dXJlLCB3aXRoIGFjY2Vzc29yIG1hY3Jvcy4KLQkqIG5sbWNvZGUuaDogVXNlIE5MTV9ISUJJVCByYXRoZXIgdGhhbiBNU0IuCi0JKG5sbV9vYmplY3RfcCk6IFNldCBTRUNfUkVMT0MgZm9yIC50ZXh0IGFuZCAuZGF0YS4gIERvbid0IHNldAotCVNFQ19EQVRBIGZvciAuYnNzLiAgU2V0IEhBU19SRUxPQyBhbmQgSEFTX1NZTVMgZm9yIGFiZmQuICBTZXQgdGhlCi0JYXJjaGl0ZWN0dXJlLgotCShubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0LCBubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfb3V0LAotCWZpbmRfbm9uemVybywgbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0KTogTmV3IG91dGJvdW5kCi0Jc3dhcHBpbmcgZnVuY3Rpb25zLgotCShubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgbmxtX3NsdXJwX3N5bWJvbF90YWJsZSk6IEluY2x1ZGUKLQlleHRlcm5hbCByZWZlcmVuY2VzIGluIHN5bWJvbCB0YWJsZSBhcyB1bmRlZmluZWQgc3ltYm9scy4KLQkobmxtX2dldF9zeW10YWIsIG5sbV9zbHVycF9zeW1ib2xfdGFibGUpOiBGaWxsIGluIGFsb2NhdGlvbgotCWFyZ3VtZW50IGluIGdldF9zeW10YWIgcmF0aGVyIHRoYW4gaW4gc2x1cnBfc3ltYm9sX3RhYmxlLgotCShubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogU2F2ZSBzeW1ib2wgaW5mb3JtYXRpb24gaW4gdGRhdGEuCi0JKG5sbV9wcmludF9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKG5sbV9zbHVycF9yZWxvY19maXh1cHMsIG5sbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQsCi0JbmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IE5ldyBmdW5jdGlvbnMgdG8gcmVhZCByZWxvY3MuCi0JKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsIG5sbV9zZXRfc2VjdGlvbl9jb250ZW50cywKLQlubG1fZXh0ZXJuYWxfcmVsb2NfY29tcGFyZSwgbmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE5ldwotCWZ1bmN0aW9ucyB0byBjcmVhdGUgTkxNIGZpbGVzLgotCSogbmxtLXRhcmdldC5oOiBEZWZpbmUgYWxsIHRoZSBubG0gZnVuY3Rpb25zIGhlcmUgZWl0aGVyIGFzCi0JZGVmYXVsdCB2YWx1ZXMgb3IgaW4gdGVybXMgb2YgbmxtTkFNRS4gIFVzZSBKVU1QX1RBQkxFKG5sbSkuICBTZXQKLQl0aGUgYmFja2VuZF9kYXRhIGZpZWxkIHRvIFRBUkdFVF9CQUNLRU5EX0RBVEEuCi0JKiBubG0zMi1nZW4uYywgbmxtNjQtZ2VuLmM6IERvbid0IGRlZmluZSBmdW5jdGlvbiBtYWNyb3MgaGVyZTsKLQl0aGV5IGFyZSBub3cgaW4gbmxtLXRhcmdldC5oLgotCShUQVJHRVRfQkFDS0VORF9EQVRBKTogRGVmaW5lIGFzIE5VTEwuCi0JKiBubG0uYyAobmxtX21rb2JqZWN0KTogRG8gYWxsb2NhdGUgdGhlIHRkYXRhIGZpZWxkLgotCShubG1fc2V0X2FyY2hfbWFjaCk6IE5ldyBmdW5jdGlvbi4KLQkqIHRhcmdldHMuYzogQWRkZWQgbmxtMzJfaTM4Nl92ZWMuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGRlZCBubG0zMi1pMzg2Lm8uCi0JKENGSUxFUyk6IEFkZGVkIG5sbTMyLWkzODYuYy4KLQkobmxtMzItZ2VuLm8sIG5sbTY0LWdlbi5vKTogRGVwZW5kIG9uIG5sbS10YXJnZXQuaC4KLQkobmxtMzItaTM4Ni5vKTogTmV3IHRhcmdldC4KLQotVGh1IEp1bCAyOSAyMDoyMDozOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N1bjMuaDogcmVtb3ZlIHNvbWUgZnVuY3Rpb24gZGVjbHMgdGhhdCBjb25mbGljdCB3LyBBTlNJCi0JQywgYW5kIGFyZW4ndCBuZWVkZWQgYW55d2F5IChyZXR1cm4gaW50KQotCi1XZWQgSnVsIDI4IDE1OjQ2OjM4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oOiBVc2UgY2FzdHMgd2l0aCBiZmRfYWxsb2MgYW5kIGFsbG9jYS4KLQotVHVlIEp1bCAyNyAxMjo1MTo0MyAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbmxtezMyLDY0fS1nZW4uYyAoSlVNUF9UQUJMRV9QUkVGSVgpOiAgRGVsZXRlLgotCSogbmxtezMyLDY0fS1nZW4uYyAoSlVNUF9UQUJMRV9JTklUKTogIE5ldyBtYWNybyB0aGF0IHdvcmtzIHdpdGgKLQlvbGRlciBjcHAncywgdGhhdCBkb24ndCBkbyBhZGRpdGlvbmFsIHJlcGxhY2VtZW50IG9uIHRoZSBKVU1QX1RBQkxFCi0JbWFjcm8ncyBhcmd1bWVudC4KLQkqIG5sbS10YXJnZXQuaCAoSlVNUF9UQUJMRV9JTklUKTogIFVzZSBuZXcgbWFjcm8gaW4gcGxhY2Ugb2YKLQlKVU1QX1RBQkxFIG1hY3JvLgotCi1Nb24gSnVsIDI2IDE3OjM5OjAxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JWWV0IGFub3RoZXIgdHJhZC1jb3JlIHZhcmlhbnQ6Ci0JKiBjb25maWcvZXNpeC5taCwgaG9zdHMvZXNpeC5oOiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUuaG9zdHM6IFVzZSB0aGVtLgotCi1Nb24gSnVsIDI2IDEzOjIyOjE1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEhhbmRsZSB0aGUgY2FzZSBvZgotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCByaWdodHNoaWZ0ID4gYml0cG9zLCBhbmQgYSBuZWdhdGl2ZQotCW51bWJlci4KLQotTW9uIEp1bCAyNiAxNDo0MDoxMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaDogUmVpbXBsZW1lbnQgc2VnbWVudCB3cml0aW5nLgotCShlbGZfd3JpdGVfcGhkcnMpOiBVc2UgcHJlY29tcHV0ZWQgZV9waG9mZiByYXRoZXIgdGhhbiBtYWtpbmcKLQlhc3N1bXB0aW9ucy4KLQkoZWxmX2J1aWxkX3BoZHJzKTogRGlzYWJsZWQsIGZvciBub3cuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uKTogRG9uJ3QgY2hhbmdlIGZpbGUgb2Zmc2V0IGZvcgotCVNIVF9OT0JJVFMuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc3ltdGFiX2FuZF9zdHJ0YWJzKTogTmV3IGZ1bmN0aW9uLgotCShzdHJ1Y3Qgc2VnX2luZm8pOiBOZXcgdHlwZS4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBOZXcgZnVuY3Rpb24uCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogRm9yIGV4ZWN1dGFibGVzLCBsZWF2ZQotCXNlY3Rpb24gaGVhZGVycyAmYyBmb3IgbGFzdCwgYW5kIHByb3Blcmx5IGFsaWduIGFsbCBzZWN0aW9ucyB3aXRoCi0JZmxhZyBTSEZfQUxMT0Mgc2V0LgotCShwcmVwX2hlYWRlcnMpOiBObyBsb25nZXIgYWJvcnQgd2hlbiBFWEVDX1AgaXMgc2V0LgotCSh3cml0ZV9zaGRyc19hbmRfZWhkcik6IERlbGV0ZWQgYWxsIGNvZGUgcmVsYXRpbmcgdG8gcHJvZ3JhbQotCXNlZ21lbnRzLgotCi0JKiBlbGZjb2RlLmggKHZhcmlvdXMpOiBEZWxldGVkIHNvbWUgdW51c2VkIGNvZGUsIGFuZCBkZWJ1Z2dpbmcKLQkibWFsbG9jKDApIiBjYWxscy4KLQkod3JpdGVfcmVsb2NzKTogQ2FjaGUgdmFsdWUgb2YgbGFzdCBzeW1ib2wgbG9va2VkIHVwLCB0byBzYXZlCi0JdGltZSBpZiB0aGUgc3ltYm9sIGlzIHJlZmVycmVkIHRvIHJlcGVhdGVkbHkuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2hlY2sgb25seSBTRUNfUkVMT0MgZmxhZywgbm90IG51bWJlciBvZgotCXJlbG9jcy4KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IExpa2V3aXNlLgotCi0JKiBNYWtlZmlsZS5pbiAob2ZpbGVzKTogU3RhcnMgaW4gd2lsZGNhcmRzIGJlbG9uZyBvdXRzaWRlIHF1b3Rlcy4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogTmV3IGZpZWxkLCBtYXhwYWdlc2l6ZS4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBOZXcgZmllbGQsIHBoZHIuCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmMzJfYmVkKTogSW5pdGlhbGl6ZSBtYXhwYWdlc2l6ZSBmcm9tCi0JRUxGX01BWFBBR0VTSVpFLgotCShFTEZfTUFYUEFHRVNJWkUpOiBEZWZhdWx0IHRvIDEuCi0JKiBlbGY2NC10YXJnZXQuaCAoZWxmNjRfYmVkLCBFTEZfTUFYUEFHRVNJWkUpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KLQkoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogQWxsIHJlbG9jcyBzaG91bGQgaGF2ZSBwY3JlbF9vZmZzZXQ9dHJ1ZS4KLQlNb3N0IHNob3VsZCBoYXZlIGxlbmd0aCBmaWVsZCBvZiBgMicuCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBIYW5kbGUgNjQtYml0IHJlbG9jcy4KLQotCSogY29uZmlnL3NwYXJjLWFvdXQubXQgKFRBUkdFVF9CQUNLRU5EUyk6IERlZmluZS4KLQotTW9uIEp1bCAyNiAwODo1NjoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgbG9vayBpbiAke3NyY2Rpcn0gZm9yICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9OwotCXRoZSB0b3AgbGV2ZWwgc2NyaXB0IGhhcyBhbHJlYWR5IGFkanVzdGVkIGZvciBpdC4KLQotTW9uIEp1bCAyNiAwODowOToxOSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBzcmVjLmMgKHNyZWNfd3JpdGVfc3ltYm9scyk6ICBHZXQgQ1IgTEYgaW4gdGhlIHJpZ2h0IG9yZGVyLgotCi1Nb24gSnVsIDI2IDAyOjA4OjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy92YXhic2QuaDogSW5jbHVkZSBzdGQtaG9zdC5oLiAgRG9uJ3QgaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPi4KLQotU2F0IEp1bCAyNCAxNjoxMzowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBIYW5kbGUgY2FzZSBvZiByaWdodHNoaWZ0ICE9Ci0JYml0cG9zIHdoZW4gb3ZlcmZsb3cgY2hlY2tpbmcuCi0KLUZyaSBKdWwgMjMgMTA6MjA6MjcgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKGJmZF9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24sIGJmZF91bmRlZmluZWRfc3ltYm9sLAotCWJmZF9yZWxvY192YWx1ZV90cnVuY2F0ZWQsIGJmZF9yZWxvY19pc19kYW5nZXJvdXMsIGJmZF9hc3NlcnQpOgotCVNlbmQgZXJyb3IgbWVzc2FnZXMgdG8gc3RkZXJyLgotCi1UaHUgSnVsIDIyIDE1OjU3OjI5IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBubG17MzIsNjR9LXRhcmdldC5oOiAgUmVtb3ZlLgotCSogbmxtLXRhcmdldC5oOiAgTmV3IGZpbGUsIG1lcmdlZCBmcm9tIG5sbXszMiw2NH0tdGFyZ2V0LmgKLQkqIGxpYm5sbS5oIChOTE1fQVJDSF9TSVpFKTogIERlZmluZSB0byBBUkNIX1NJWkUuCi0JKiBubG0uYyAoQVJDSF9TSVpFKTogIFJlbW92ZSBkZWZpbmUgdG8gemVyby4KLQkqIG5sbTMyLWdlbi5jIChBUkNIX1NJWkUpOiAgRGVmaW5lIHRvIDMyLgotCSogbmxtMzItZ2VuLmMgKEpVTVBfVEFCTEVfUFJFRklYKTogIERlZmluZSB0byBubG0zMi4KLQkqIG5sbXszMiw2NH0tZ2VuLmMgKG5sbS10YXJnZXQuaCk6ICBJbmNsdWRlLgotCSogdGFyZ2V0cy5jLCBsaWJubG0uaCwgbmxtLmMsIG5sbXszMiw2NH0tZ2VuLmMsIG5sbXszMiw2NH0uYywKLQlubG1jb2RlLmg6ICBDb252ZXJ0IHByZWZpeGVzIGZyb20gYmZkX25sbTxzaXplPiB0byBqdXN0Ci0JbmxtPHNpemU+LCBhbmQgdXNlIG1hY3JvcyBzZWxlY3Qgc2l6ZS4KLQotVGh1IEp1bCAyMiAxNTo0MDoxNCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IGFkZCBjb25maWd1cmUuaW4sIGRyb3AgcmVkdW5kYW50Ci0JICAkKHNyY2RpciksIGRyb3AgcmVkdW5kYW50IC4vCi0KLVRodSBKdWwgMjIgMTM6MzQ6NTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBocHV4LWNvcmUuYzogTmV3IGZpbGU7IGJhY2tlbmQgZm9yIEhQL1VYIHN0eWxlIGNvcmUgZmlsZXMuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBSZW5hbWVkIGhwcGFfY29yZV9kYXRhIGZpZWxkIHRvCi0JaHB1eF9jb3JlX2RhdGEuCi0JKiBiZmQtaW4yLmg6IFVwZGF0ZWQuCi0JKiBocHBhLmMgKG1ha2VfYmZkX2FzZWN0aW9uLCBocHBhX2NvcmVfZmlsZV9wLAotCWhwcGFfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCwgaHBwYV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwsCi0JaHBwYV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiBNb3ZlZCBpbnRvIGhwdXgtY29yZS5jLgotCVJlbW92ZWQgZnJvbSB0YXJnZXQgdmVjdG9yLgotCSogbGliaHBwYS5oIChzdHJ1Y3QgaHBwYV9jb3JlX3N0cnVjdCBhbmQgYWNjZXNzb3IgbWFjcm9zKTogTW92ZWQKLQlpbnRvIGhwdXgtY29yZS5jLgotCSogdGFyZ2V0cy5jOiBJZiBIUFVYX0NPUkUgaXMgZGVmaW5lZCwgYWRkIGhwdXhfY29yZV92ZWMgdG8KLQl0YXJnZXQgbGlzdC4KLQkqIGNvbmZpZy9ocDMwMC5taCAoSERFRklORVMpOiBTZXQgdG8gLURIUFVYX0NPUkUuCi0JKEhERVBGSUxFUyk6IFNldCB0byBocHV4LWNvcmUuby4KLQkqIGNvbmZpZy9ocHBhYnNkLm1oLCBjb25maWcvaHBwYWhwdXgubWg6IExpa2V3aXNlLgotCSogaG9zdHMvaHAzMDAuaCAoSE9TVF9IUDMwMEhQVVgpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbiAoT1BUSU9OQUxfQkFDS0VORFMpOiBBZGRlZCBzY28tY29yZS5vLAotCWFpeDM4Ni1jb3JlLm8sIGhwdXgtY29yZS5vLgotCShzY28tY29yZS5vLCBhaXgzODYtY29yZS5vLCBocHV4LWNvcmUubyk6IE5ldyBkZXBlbmRlbmNpZXMuCi0KLQkqIHJlbG9jLmMgKGVudW0gY29tcGxhaW5fb3ZlcmZsb3cpOiBOZXcgZW51bWVyYXRpb24gd2l0aCB0aGUKLQl2YXJpb3VzIGZsYXZvdXJzIG9mIG92ZXJmbG93IGNoZWNraW5nLgotCShzcnR1Y3QgcmVsb2NfaG93dG9fc3RydWN0KTogQ2hhbmdlZCBjb21wbGFpbl9vbl9vdmVyZmxvdyBmaWVsZAotCWZyb20gYm9vbGVhbiB0byBlbXVtIGNvbXBsYWluX292ZXJmbG93LiAgUmVtb3ZlZCBvYnNvbGV0ZSBhYnNvbHV0ZQotCWZpZWxkLgotCShIT1dUTyk6IFJlbW92ZWQgYWJzb2x1dGUgYXJndW1lbnQuCi0JKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBEbyBvdmVyZmxvdyBjaGVja2luZyBvbiBhbGwgdHlwZXMgb2YKLQlmaWVsZHMuCi0JKiBiZmQtaW4yLmg6IFVwZGF0ZWQgYWNjb3JkaW5nbHkuCi0JKiBhbGwgdGFyZ2V0czogVXBkYXRlZCBpbml0aWFsaXphdGlvbiBvZiByZWxvYyBob3d0byB0YWJsZXMuCi0KLVdlZCBKdWwgMjEgMjA6MzQ6MzQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBvcG5jbHMuYyAoYmZkX2NyZWF0ZSk6IERvbid0IHVzZSBDKysga2V5d29yZCAidGVtcGxhdGUiIGFzIGEgQwotCXZhcmlhYmxlIG5hbWUuCi0KLVR1ZSBKdWwgMjAgMTU6MDI6MjMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTY4ay5jIChtNjhrX2hvd3RvMnJ0eXBlKTogIE1ha2UgYXJnIENPTlNUIHRvIG1hdGNoIGNhbGxlcnMuCi0KLQkqIGVsZmNvZGUuaDogIEZpeCBzZXZlcmFsIGlsbGVnYWwgcG9pbnRlciBjb21iaW5hdGlvbiB3YXJuaW5ncyBmb3IKLQl1c2FnZXMgb2YgYmZkX2FsbG9jIGFuZCBhbGxvY2EuCi0KLQkqIGxpYm5sbS5oIChubG1fb2JqX3RkYXRhKTogIFJlbmFtZSBoaWRkZW4gc3RydWN0IG1lbWJlcnMgdG8gYXZvaWQKLQlhcHBhcmVudCBTdW4gQyBwcmVwcm9jZXNzb3IgcmVjdXJzaW9uLiAgRml4IGFjY2VzcyBtYWNyb3MuCi0JKiBubG1jb2RlLmg6ICBSZW1vdmUgc3B1cmlvdXMgJyYnIGJlZm9yZSBzZXZlcmFsIGFycmF5IHJlZmVyZW5jZXMuCi0KLVR1ZSBKdWwgMjAgMTQ6MzY6MjcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIFJlbmFtZSBmb3IgRE9TIHVuaXF1ZW5lc3M6IGNvZmYtbTY4ay11bi5jIC0+IGNvZmYtdTY4ay5jCi0JY29uZmlnL202OGstY29mZnVuLm10IC0+IHU2OGstY29mZi5tdC4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotVHVlIEp1bCAyMCAxNjoyMTo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IERvbid0IHVzZSAiJiIgYmVmb3JlCi0JZnVuY3Rpb24gbmFtZTsgaXQncyB2YWxpZCB3aXRob3V0LCBhbmQgc29tZSBjb21waWxlcnMgZ2l2ZQotCXdhcm5pbmdzIHdpdGggaXQgdGhlcmUuCi0KLVR1ZSBKdWwgMjAgMDg6MjE6MTUgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oOiAgQXBwbHkgc29tZSBvZiB0aGUgY2hhbmdlcyB0aGF0IHdlcmUgbWFkZSB0byBiZmQtaW4yLmguCi0JKiBiZmQuYyAodW5pb24gdGRhdGEpOiAgQWRkIG5sbV9vYmpfZGF0YTsKLQkqIHRhcmdldHMuYyAoZW51bSB0YXJnZXRfZmxhdm91cik6ICBBZGQgYmZkX3RhcmdldF9ubG1fZmxhdm91ci4KLQotTW9uIEp1bCAxOSAyMDo0NjoxOCAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICgqLSotbmV0d2FyZSwgaVszNF04Ni0qLW5ldHdhcmUpOiAgTmV3IGNvbmZpZ3MuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiAgQWRkIG5sbS5vLCBubG0zMi5vLCBubG0zMi1nZW4uby4KLQkqIE1ha2VmaWxlLmluIChCRkQ2NF9CQUNLRU5EUyk6ICBBZGQgbmxtNjQubywgbmxtNjQtZ2VuLm8uCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogIEFkZCBubG17MzIsNjR9LmMsIG5sbXszMiw2NH0tZ2VuLmMuCi0JKiBNYWtlZmlsZS5pbiAobmxtLm8sIG5sbXszMiw2NH0ubywgbmxtezMyLDY0fS1nZW4ubzogIE5ldyB0YXJnZXRzLgotCSogYmZkLWluMi5oIChJTkxJTkUpOiAgRGVmaW5lcyBtb3ZlZCBoZXJlLgotCSoge2FvdXR4LmgsIGVsZi5jLCBlbGZjb2RlLmh9OiAgTW92ZSBJTkxJTkUgZGVmaW5lcyB0byBiZmQtaW4yLmguCi0JKiBsaWJlbGYuaCAoQ0FUNCk6ICBNb3ZlIGRlZmluZSB0byBiZmQtaW4yLmguCi0JKiBiZmQtaW4yLmggKENBVDQpOiAgTWVyZ2UgQ0FUNCBtYWNybyB3aXRoIG90aGVyIENBVCBtYWNyb3MuCi0JKiBiZmQtaW4yLmggKHVuaW9uIHRkYXRhKTogIEFkZCBubG1fb2JqX2RhdGEuCi0JKiBiZmQtaW4yLmggKGVudW0gdGFyZ2V0X2ZsYXZvdXIpOiAgQWRkIGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIuCi0JKiB0YXJnZXRzLmMgKGJmZF9ubG17MzIsNjR9X3tiaWcsbGl0dGxlfV92ZWMpOiAgQWRkIHByb3RvdHlwZXMuCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiAgQWRkIGJmZF9ubG17MzIsNjR9X3tiaWcsbGl0dGxlfV92ZWMuCi0JKiAobGlibmxtLmgsIG5sbS5jLCBubG1jb2RlLmgsIG5sbXszMiw2NH0tZ2VuLmMsCi0JbmxtezMyLDY0fS10YXJnZXQuaCwgbmxtezMyLDY0fS5jLCBjb25maWcvaTM4Ni1ubG0ubXQpOiAgTmV3IGZpbGVzCi0JZm9yIE5MTSBzdXBwb3J0LgotCi1Nb24gSnVsIDE5IDE1OjA5OjAxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLntob3N0cyxpbn06IGFkZCBpWzM0XTg2LSotbHlueG9zKiBzdXBwb3J0Ci0KLU1vbiBKdWwgMTkgMTQ6NTM6MzAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBlbGYuYywgZWxmY29kZS5oLCBsaWJlbGYuaDogU2VyaW91cyByZW9yZ2FuaXphdGlvbi4KLQlEZWxldGVkIGB0aHVuaycgc3RydWN0dXJlLCBtZXJnZWQgaW50byB0ZGF0YSwgZHVwbGljYXRlIGRhdGEKLQllbGltaW5hdGVkLgotCVJlYXJyYW5nZWQgZnVuY3Rpb25zLCBncm91cGluZyBieSBmdW5jdGlvbmFsaXR5LgotCUJyb2tlIHVwIG1hbnkgZnVuY3Rpb25zIGluIGVsZmNvZGUuaCwgcmUtb3JkZXJlZCBtYW55IHBhcnRzIG9mCi0JZmlsZSB3cml0aW5nIHRvIGhhbmRsZSB1bnByZWRpY3RhYmxlIHN0YXRlIG9mIHNlY3Rpb24gcmVsb2NhdGlvbgotCXRhYmxlIGFzIHByb3ZpZGVkIGJ5IHZhcmlvdXMgYXBwbGljYXRpb25zLgotCVN0aWxsIG5lZWRzIGNsZWFudXA6IE1lcmdlIGZ1bmN0aW9ucyBiYWNrIHRvZ2V0aGVyLCBzcGxpdCBvdXQKLQlkYXRhIHN0cnVjdHVyZSB3aXRoIG9ubHkgZGF0YSB0aGF0IGlzIHVzZWQgb25seSB3aGVuIHdyaXRpbmcgb3V0Ci0Jb2JqZWN0IGZpbGUuCi0KLQkqIGVsZi5jIChiZmRfZWxmX2dlbmVyaWNfcmVsb2MpOiBOZXcgZnVuY3Rpb24sIHRha2VuIGZyb20KLQljb2ZmLW1pcHMuYy4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IFVzZSBpdCwgdG8gd29yayBhcm91bmQKLQliZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGxvc3NhZ2UuCi0KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IEluY2x1ZGUgY29mZi1taXBzLm8gYW5kIGNvZmYtbXN5bS5vLCBzbwotCXRoYXQgZ2RiIHdpbGwgbGluay4KLQkob2ZpbGVzKTogRG9uJ3QgdXNlIHNvcnQgb3IgdW5pcTsgZG8gaXQgd2l0aCBzaCBjb25zdHJ1Y3RzLgotCi1TdW4gSnVsIDE4IDE5OjQyOjE0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogUmVjb2duaXplIEkzODZQVFhNQUdJQy4KLQkqIGFvdXRmMS5oLCBsaWJhb3V0Lmg6IEFkZCBNXzM4Nl9EWU5JWC4KLQkqIHRyYWQtY29yZS5jIChUUkFEX0NPUkVfVVNFUl9PRkZTRVQsIFRSQURfQ09SRV9TVEFDS19GSUxFUE9TKToKLQlOZXcgbWFjcm9zOyB1c2UgaXQgaWYgZGVmaW5lZC4KLQkqIGNvbmZpZy9zeW1tZXRyeS5taCwgaG9zdHMvc3ltbWV0cnkuaDogTmV3IGZpbGVzLgotCi1GcmkgSnVsIDE2IDE0OjU2OjMxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBydGwuY3lnbnVzLmNvbSkKLQotCSogUmVuYW1lIGVsZnszMiw2NH0tZ2VuZXJpYy5jIHRvICotZ2VuLmMgZm9yIDE0IGNoYXIgZmlsZW5hbWVzLgotCSogTWFrZWZpbGUuaW46IENoYW5nZSBhY2NvcmRpbmdseS4KLQkoQ0ZJTEVTKTogQWRkIGVsZjY0LWdlbi5jLgotCi1GcmkgSnVsIDE2IDA5OjUzOjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmM6IFVzZSBNSVBTX0FPVVRfe09afU1BR0lDIHJhdGhlciB0aGFuIHtPWn1NQUdJQy4KLQotVGh1IEp1bCAxNSAxNjowMjowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTg4ay5jIChob3d0b190YWJsZSk6IENvcnJlY3RlZCBiaXRzaXplIGZvciBSX1BDUjI2TCBmcm9tCi0JMTYgdG8gMjYuCi0KLVdlZCBKdWwgMTQgMTU6Mjk6NTYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuYyBbSE9TVF9IUFBBQlNEXTogVXNlIGhwdXgtc3R5bGUgY29yZSBmaWxlcy4KLQkqIGxpYmhwcGEuaCBbSE9TVF9IUFBBQlNEXTogSW5jbHVkZSBocHV4IHZlcnNpb24gb2YgY29yZS5oCi0KLVdlZCBKdWwgMTQgMDk6MzA6NDggMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgaDgzMDBoLSotKi4KLQotVHVlIEp1bCAxMyAxMjowMzowMCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4NTAwLmMgKHJlbG9jX3Byb2Nlc3NpbmcsIHJ0eXBlMmhvd3RvKTogTmV3IHJlbG9jYXRpb24KLQl0eXBlIFJfSDg1MDBfSElHSF8xNi4KLQkqIGNvZmYtc2guYyAocl9pbW0zMik6IEdldCB0aGUgd2lkdGggb2YgdGhlIHJlbG9jIHJpZ2h0LgotCi1UdWUgSnVsIDEzIDE2OjQ4OjU2IDE5OTMgIEZyZWRlcmljIFBpZXJyZXN0ZWd1eSAoRi5QaWVycmVzdGVndXlAZnJjbC5idWxsLmZyKQotCi0JKiBjb25maWd1cmUuaW46IEFkZCBuZXcgdGFyZ2V0IG02OGstY29mZnVuIHRvIHRoZSBkcHgvMi4KLQkqIGNvbmZpZy9tNjhrLWNvZmZ1bi5tdDogTmV3IGZpbGUsIHJlbmFtZWQgZnJvbSBjb25maWcvZHB4Mi5tdC4KLQotTW9uIEp1bCAxMiAxMDo0Mjo0OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogTW92ZSBTUEFSQ19CQVNFMTMgcmVsb2MgaW50bwotCXNwYXJjLWFvdXQtc3BlY2lmaWMgbGlzdC4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGZpZWxkIGB0aHVuaycuCi0KLQkqIGNvbmZpZy9zcGFyYy1lbGYubXQgKFRBUkdFVF9CQUNLRU5EUyk6IE5ldyBtYWtlIHZhcmlhYmxlLgotCi1UaHUgSnVsICAxIDE0OjUyOjQ3IDE5OTMgIEZyZWRlcmljIFBpZXJyZXN0ZWd1eSAoRi5QaWVycmVzdGVndXlAZnJjbC5idWxsLmZyKQotCQkJICBhbmQgSmltIEtpbmdkb24gKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oOiBVc2UgbWVtc2V0IG5vdCBiemVyby4KLQkqIHRyYWQtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxzeXMvZmlsZS5oPi4KLQkqIGkzODZsaW51eC5oOiBJbmNsdWRlIDxzeXMvZmlsZS5oPi4KLQkqIGNvZmYtbTY4ay11bi5jOiBuZXcgZmlsZSB0byBoYW5kbGUgbmFtZXMgd2l0aCB1bmRlcnNjb3JlcyBvbgotCXN2cjMgbWFjaGluZXMuCi0JKiBjb2ZmLW02OGsuYyAobTY4a19ydHlwZTJob3d0byk6IGFkZGVkICNpZmRlZiBPTkxZX0RFQ0xBUkVfUkVMT0NTCi0JdG8gbm90IGR1cGxpY2F0ZSB0aGUgZnVuY3Rpb24gaW4gdGhlIGV4ZWN1dGFibGUuCi0JKFRBUkdFVF9TWU0sIFRBUkdFVF9OQU1FLCBOQU1FU19IQVZFX1VOREVSU0NPUkUpOiBuZXcgbWFjcm9zIG5lZWRlZAotCWJ5IGNvZmYtbTY4ay11bi5jLgotCSogY29mZmNvZGUuaCAoTUM2OEtCQ1NNQUdJQyk6IGNhc2UgYWRkZWQuCi0JKiB0YXJnZXRzLmM6IEFkZCBtNjhrY29mZnVuX3ZlYy4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBhZGRlZCBzdXBwb3J0IGZvciBCdWxsIGRweC8yLgotCSogY29uZmlnL2RweDIubWgsIGhvc3RzL2RweDIuaDogbmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW46IGFkZGVkIHRhcmdldCBjb2ZmLW02OGstdW4uCi0KLUZyaSBKdWwgIDkgMDA6NDM6MDYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oOiBBZGQgZGVmaW5pdGlvbiBvZiBNQUNIVFlQRV9PSy4KLQotVGh1IEp1bCAgOCAxNDozNzo0NCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBEb24ndCBzdWJ0cmFjdCB0aGUgYWRkZW5kCi0JYWdhaW4gZm9yIGNvZmYuCi0KLQkqIHN5bXMuYywgYmZkLWluMi5oOiBEb2MgZml4LgotCi0JKiBjb2ZmY29kZS5oIChDQUxDX0FEREVORCk6IENoZWNrIGZvciBjb21tb24gc2VjdGlvbiB1c2luZyB0aGUKLQlzZWN0aW9uIGZsYWcgYXMgd2VsbCBhcyB0aGUgc3ltYm9sIGZsYWcuCi0KLVRodSBKdWwgIDggMTM6NDM6NTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZic2QuaDogQ29uZGl0aW9uYWxpemUgSE9TVF9TVEFDS19FTkRfQUREUiBvbiBfX2JzZGlfXy4KLQlpMzg2YnNkLmM6IFJlbW92ZSBkZWZpbmVzIG9mIE5fVFhUKjsgdGhlIHZlcnNpb25zIGluIGFvdXQ2NC5oIHNob3VsZAotCWJlIHN1ZmZpY2llbnQuICBEZWZpbmUgVEVYVF9TVEFSVF9BRERSLgotCi1XZWQgSnVsICA3IDEwOjU2OjIxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IFJlbW92ZWQgc3RhdGVwCi0JYXJndW1lbnQuICBKdXN0IGxldCBhbiBpbmRpcmVjdCBzeW1ib2wgcG9pbnQgdG8gdGhlIG5leHQgc3ltYm9sCi0Jd2l0aG91dCBmb3JjaW5nIHRoZSBuZXh0IHN5bWJvbCB0byBiZSB1bmRlZmluZWQuICBDaGFuZ2VkIGFsbAotCWNhbGxlcnMuCi0JKiBocDMwMGhwdXguYyAoc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hhbmdlZCBjYWxsIHRvCi0JdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncy4KLQkqIHRhcmdldHMuYzogQWRkZWQgaHAzMDBocHV4X3ZlYy4KLQkqIE1ha2VmaWxlLmluIChocDMwMGhwdXgubyk6IEFkZGVkIGRlcGVuZGVuY2llcy4KLQotVHVlIEp1bCAgNiAxMzoyNDo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IFB1dCBzaW1wbGUgcG93ZXItb2YtdHdvCi0JcmVsb2NzIHRvZ2V0aGVyLCBhbmQgYWRkIDY0LWJpdCB2ZXJzaW9ucy4KLQkoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogQXJndW1lbnQgdG8gYWxsb2NhCi0JaXMgc2l6ZV90LgotCi0JKiBsaWJiZmQuYyAoYmZkX3htYWxsb2NfYnlfc2l6ZV90KTogTmV3IGZ1bmN0aW9uLgotCSogb3BuY2xzLmMgKGJmZF9jYWNoZV9pbml0LCBiZmRfb3Blbl9maWxlKTogQWRkIHByb3RvdHlwZXMgdG8KLQlkZWNsYXJhdGlvbnMuCi0JKG9ic3RhY2tfY2h1bmtfYWxsb2MpOiBVc2UgYmZkX3htYWxsb2NfYnlfc2l6ZV90LgotCShuZXdfYmZkKTogUHJvdG90eXBlLXN0eWxlIGRlZmluaXRpb24sIHVzaW5nIERFRlVOLgotCShiZmRfYWxsb2NfZ3JvdywgYmZkX2FsbG9jLCBiZmRfemFsbG9jLCBiZmRfcmVhbGxvYyk6IFNpemUKLQlhcmd1bWVudCBpcyB0eXBlIHNpemVfdCwgbm90IGJmZF9zaXplX3R5cGUuCi0JKiBpZWVlLmMgKG9ic3RhY2tfY2h1bmtfYWxsb2MpOiBVc2UgYmZkX3htYWxsb2NfYnlfc2l6ZV90LgotCSogYmZkLmMgKGJmZF9kZWZhdWx0X2Vycm9yX3RyYXAsIGJmZF9lcnJvcl90cmFwLAotCWJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmx0cmFwKTogUHJvdG90eXBlcy4KLQkqIGxpYmJmZC1pbi5oIChiZmRfYWxsb2MsIGJmZF96YWxsb2MsIGJmZF9yZWFsbG9jLAotCWJmZF9hbGxvY19ncm93KTogQWRqdXN0ZWQgcHJvdG90eXBlcyBmb3IgYXJnIHR5cGUgY2hhbmdlLgotCSogYXJjaGl2ZS5jIChnZXRfZWx0X2F0X2ZpbGVwb3MsIGRvX3NsdXJwX2JzZF9hcm1hcCwgbm9ybWFsaXplLAotCWRvX3NsdXJwX2NvZmZfYXJtYXAsIGJmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6Ci0JUHJvdG90eXBlcy4KLQkqIGVsZmNvZGUuaCAoZWxmX3N0cmluZ19mcm9tX2VsZl9zdHJ0YWIpOiBQcm90b3R5cGVzLgotCSogbGliZWxmLmggKGVsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiwgZWxmX2dldF9zdHJfc2VjdGlvbik6Ci0JUHJvdG90eXBlcy4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IFJlbmFtZWQgZnJvbSBCRkRfTUFDSElORVMuCi0JKG9maWxlcyk6IE5ldyB0YXJnZXQuICBCdWlsZCBhIGxpc3Qgb2YgdW5pcXVlIGZpbGUgbmFtZXMsIGluIGNhc2UKLQlhbnkgZ290IGR1cGxpY2F0ZWQuCi0JKFRBUkdFVExJQik6IFVzZSBsaXN0IG9mIGZpbGVzIGZyb20gb2ZpbGVzLgotCSogY29uZmlndXJlLmluOiBTZXQgQkZEX01BQ0hJTkVTIGFuZCBCRkRfQkFDS0VORFMgZGVwZW5kaW5nIG9uCi0JbWluaW1hbC1iZmQgZmxhZyBhbmQgdGFyZ2V0IG1ha2VmaWxlIGZyYWcgY29udGVudHMuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3JlYWQpOiBEZWxldGUgc3RhdGljIGRlY2xhcmF0aW9uLCBzaW5jZSBmdW5jdGlvbgotCWhhcyBtb3ZlZC4KLQkoZWxmX21hcF9zeW1ib2xzKTogV3JpdGUgb3V0IHNlY3Rpb24gc3ltYm9scyBmb3IgYWxsIHNlY3Rpb25zLCBmb3IKLQlub3cuCi0JKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogQWxsb3cgbWF0Y2ggaWYgYm90aCBzeW1ib2xzIGFyZQotCXNlY3Rpb24gc3ltYm9scyBmb3IgdGhlIHNhbWUgc2VjdGlvbi4KLQkoZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogRG9uJ3QgcHJpbnQgbWVzc2FnZSwganVzdCByZXR1cm4gZmFsc2UuCi0KLQkqIGxpYmVsZi5oIChiZmRfZWxmX2xvY2F0ZV9zaCk6IERlY2xhcmF0aW9uIGRlbGV0ZWQuCi0KLU1vbiBKdWwgIDUgMTY6NDg6MTEgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY3B1LWg4MzAwLmMgKGg4MzAwX3NjYW4pOiBGaXggcGFyc2luZyBvZiBhcmNoaXRlY3R1cmUgc3RyaW5nLgotCi1GcmkgSnVsICAyIDE4OjI3OjAwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiBSZW1vdmUgYmZkLmggYW5kIHN0bXAtYmZkLmguCi0JKHJlYWxjbGVhbik6IFJlbW92ZSBnZW5lcmF0ZWQgaGVhZGVycy4KLQotRnJpIEp1bCAgMiAxNDo1MTo1MSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHNlY3Rpb24uYyAoYmZkX3NldF9zZWN0aW9uX2NvbnRlbnQpOiAgRGVueSBpZiBmaWxlIGlzIG5vdCBvcGVuZWQgd2l0aAotCXRoZSBwcm9wZXIgbW9kZSwgc2V0IG91dHB1dF9oYXNfYmVndW4gaWYgZmlsZSBpcyBvcGVuZW5lZCBmb3IgdXBkYXRlLgotCSogYW91dHguaCAoYW91dF8qX3NldF9zZWN0aW9uX2NvbnRlbnQpOiAgUmVtb3ZlIGNoZWNrcyB0aGF0IGFyZSBub3cKLQlkb25lIGluIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50LgotCi1GcmkgSnVsICAyIDA5OjI1OjIwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaDogUmVtb3ZlZCBkZWNsYXJhdGlvbnMgb2YgcHJpbnRmLCBmcHJpbnRmLAotCWZjbnRsLCBmcmVhZCBhbmQgZndyaXRlLiAgVGhleSBhcmUgYWxsIGVycm9yIHByb25lIGZvciBvbmUgcmVhc29uCi0Jb3IgYW5vdGhlci4gIENoYW5nZWQgZGVjbGFyYXRpb24gb2YgbWVtY2hyIGZyb20gY2hhciAqIHRvIFBUUi4KLQotCSogY29uZmlndXJlLmluIChtaXBzLSotcmlzY29zKik6IE5ldyB0YXJnZXQ7IHVzZSByaXNjb3MuCi0JKiBjb25maWd1cmUuaG9zdCAobWlwcy0qLXJpc2NvcyopOiBOZXcgaG9zdDsgdXNlIHJpc2Nvcy4KLQkqIGNvbmZpZy9yaXNjb3MubWggKEhERUZJTkVTKTogQWRkIC1HIDQuCi0KLQkqIGxpYmFvdXQuaCAoR0VUX1NXT1JEKTogVXNlIHRoZSBiZmRfaF9nZXRfc2lnbmVkIGVudHJ5IHBvaW50cwotCXJhdGhlciB0aGFuIGNhc3RpbmcgdGhlIHJlc3VsdCBvZiBiZmRfaF9nZXQuCi0KLUZyaSBKdWwgIDIgMTA6MTM6NDggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgaG9zdHMvZGVsdGE2OC5oLCBjb25maWcvZGVsdGE2OC5taDogQWRkIHN0dWZmIGZvcgotCU1vdG9yb2xhIERlbHRhIDY4LgotCi1XZWQgSnVuIDMwIDA2OjAyOjQzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jIChiZmRfZWxmNjRfe2JpZyxsaXR0bGV9X2dlbmVyaWNfdmVjKTogRGVjbGFyZSwgYW5kCi0JaW5jbHVkZSBpbiBzZWFyY2ggbGlzdCBpZiBCRkQ2NCBpcyBkZWZpbmVkLgotCi0JKiBsaWJlbGYuaCAoQ0FUNCk6IEFkZGVkIGEgdmVyc2lvbiBmb3IgU2FiZXItQywgQU5TSSBtb2RlLgotCShiZmRfZWxmNjRfKik6IERlY2xhcmF0aW9ucyBmb3IgNjQtYml0IHZlcnNpb25zIG9mIG1hbnkgcm91dGluZXMuCi0KLVR1ZSBKdW4gMjkgMjI6NTA6NTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGY2NC10YXJnZXQuaCwgZWxmNjQtZ2VuZXJpYy5jOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbiAoQkZENjRfQkFDS0VORFMpOiBJbmNsdWRlIGVsZjY0LWdlbmVyaWMuby4KLQkoZWxmNjQtZ2VuZXJpYy5vKTogTGlzdCBkZXBlbmRlbmNpZXMuCi0KLQkqIE1ha2VmaWxlLmluOiBMaXN0IHRhcmdldCBgYWxsJyBleHBsaWNpdGx5IGJlZm9yZSBob3N0L3RhcmdldAotCW1ha2VmaWxlIGZyYWdtZW50cyBhcmUgaW5jbHVkZWQsIGluIGNhc2UgdGhleSBkZWZpbmUgYW55IG5ldwotCXRhcmdldHMuCi0KLQkqIGVsZmNvZGUuaCAoRUxGX1JfSU5GTywgRUxGX1JfU1lNKTogRGVmaW5lIGFzIDMyLSBvciA2NC1iaXQKLQl2ZXJzaW9ucyBhcyBhcHByb3ByaWF0ZS4gIFVzZXMgdXBkYXRlZC4KLQkoZWxmX2RlYnVnX3NlY3Rpb24pOiBEZWNsYXJlIGJlZm9yZSB1c2UuCi0JKGVsZl9kZWJ1Z19maWxlKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIsIGJmZF9zaGRyX2Zyb21fc2VjdGlvbiwgZWxmX2Zha2Vfc2VjdGlvbnMpOgotCUFsaWdubWVudCB2YWx1ZSBpbiBzZWN0aW9uIGhlYWRlciBpcyBuX2J5dGVzLCBub3QgbG9nMi4KLQkobmV3X3NlY3Rpb25faG9vayk6IERvIG5vdGhpbmcgZm9yIG5vdy4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogVXNlIEVsZl9FeHRlcm5hbF9SZWxbYV0sIG5vdCAzMi1iaXQKLQl2ZXJzaW9uIGV4cGxpY2l0bHkuCi0JKGVsZl9jb3JlX2ZpbGVfcCk6IFNpbXBsaWZ5IGNoZWNrIGZvciBjb3JyZWN0IGNsYXNzICh3b3JkIHNpemUpLgotCShlbGZfbWFrZV9zZWN0aW9ucywgZWxmX2Zha2Vfc2VjdGlvbnMsIGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOgotCUluaXRpYWxpemUgYWxsIGZpZWxkcyB3aGVuIGNyZWF0aW5nIGRhdGEgc3RydWN0dXJlcy4KLQkoZWxmX2xvY2F0ZV9zaCk6IFJlbmFtZWQgZnJvbSBiZmRfZWxmWFhfbG9jYXRlX3NoLCBtYWRlIHN0YXRpYy4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFNldCBjb3JyZWN0IGNsYXNzIGluIG91dHB1dAotCWZpbGUuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZWN0aW9uIHN5bWJvbHMgaGF2ZSBlbXB0eSBuYW1lcyBpbgotCW91dHB1dCBmaWxlLgotCi0JKiBsaWJiZmQuYyAoYmZkX3htYWxsb2MsIHphbGxvYyk6IEJlIHN1cmUgdG8gY2FzdCBtYWxsb2MsIG1lbXNldAotCWFyZ3MgdG8gc2l6ZV90IGJlZm9yZSBjYWxsLgotCShiZmRfYWRkX3RvX3N0cmluZ190YWJsZSk6IENhc3QgemFsbG9jIGFyZyB0byBiZmRfc2l6ZV90eXBlLgotCi1UdWUgSnVuIDI5IDEwOjQ5OjQyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogSWYgcHJvY2VkdXJlIGhhcyBubyBsaW5lCi0JbnVtYmVyIGluZm9ybWF0aW9uLCByZXR1cm4gMCBmb3IgbGluZSBudW1iZXIuCi0KLU1vbiBKdW4gMjggMTA6NDU6MDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6IElmICpvbGRyYXdwdHIgaXMgbm9uLU5VTEwsIGNvcHkgaXQKLQlpbnRvICpyYXdwdHIuCi0KLVN1biBKdW4gMjcgMDk6MDU6MTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3Jpc2Nvcy5oOiBEZWZpbmUgTkJQRyBhbmQgVVBBR0VTLgotCi1TdW4gSnVuIDI3IDE2OjI4OjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCB1c2Ugb2JqX3Jhd19zeW1zIGFzCi0JbHZhbHVlOyBpdCBjb250YWlucyBhIGNhc3QuCi0KLUZyaSBKdW4gMjUgMTc6MDk6NTUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChoYXNoLCBjb21wYXJlLCBzdHJ1Y3Qgc3RyaW5ndGFiX2VudHJ5LCBhZGRfdG9fc3RyaW5ndGFiKToKLQlVc2UgdW5zaWduZWQgaGFzaCB2YWx1ZXMgZm9yIGJldHRlciBoYXNoaW5nLgotCShoYXNoKTogSGFzaCBpbiB0aGUgc3RyaW5nIGxlbmd0aCBmb3IgbG9uZyBzdHJpbmdzLgotCi1UaHUgSnVuIDI0IDE1OjQ3OjUxIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoY29tcGFyZSk6IFJlcGxhY2UgMyBpZidzIHdpdGggYSBzdWJ0cmFjdGlvbi4KLQkodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MsIGFkZF90b19zdHJpbmd0YWIpOiBSZW9yZGVyIHRlc3RzCi0JaW4gZGVjcmVhc2luZyBvcmRlciBvZiBzdWNjZXNzLCBhcyBhbiBvcHRpbWl6YXRpb24uCi0JKGhhc2gpOiBUYWtlIGEgbGVuZ3RoIGFyZzsgaWdub3JlIGNoYXJzIGFmdGVyICMyNSwgZm9yIHNwZWVkLgotCShhZGRfdG9fc3RyaW5ndGFiKTogUGFzcyBsZW5ndGggdG8gaGFzaC4KLQotVGh1IEp1biAyNCAxNzoyNTo1MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogZWxmMzItc3BhcmMuYyAoc3BhcmNfcmVsb2NfbWFwKTogQWRkIFNQQVJDX1dESVNQMjIgcmVsb2MuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX25ld19zZWN0aW9uX2hvb2spOiBEbyBub3RoaW5nIGZvciBub3cuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBPdXRwdXQgY29tbW9uIHN5bWJvbHMgdGhlIHdheSBFTEYKLQl3YW50cyB0aGVtLgotCi1XZWQgSnVuIDIzIDE2OjIwOjA3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEgYW5kIGFzc29jaWF0ZWQgbWFjcm9zKTogTW92ZWQKLQloZXJlIGZyb20gZWxmY29kZS5oLiAgQSBjb3VwbGUgb2Ygc2l6ZS1zcGVjaWZpYyBzdHJ1Y3R1cmUgcG9pbnRlcnMKLQl3ZXJlIGNoYW5nZWQgdG8gUFRSOyB1c2VzIGZpeGVkIGFwcHJvcHJpYXRlbHkuCi0JKGVsZjMyX3N5bWJvbF90eXBlLCBlbGY2NF9zeW1ib2xfdHlwZSk6IFNlcGFyYXRlZCBkZWZpbml0aW9ucy4KLQkoYmZkX2VsZl9ta29iamVjdCk6IFJlbmFtZWQgZnJvbSBiZmRfZWxmMzJfbWtvYmplY3QuCi0JKGJmZF9lbGYzMl9ta29iamVjdCwgYmZkX2VsZjY0X21rb2JqZWN0LCBlbGZfbWtvYmplY3QpOiBOZXcKLQl0ZW1wb3JhcnkgbWFjcm9zIHRvIGVhc2UgbmFtZSBjaGFuZ2UuCi0JKiBlbGYuYyAoZWxmX3JlYWQsIGVsZl9ta29iamVjdCwgZWxmX2dldF9zdHJfc2VjdGlvbiwKLQllbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24sIGJmZF9lbGZfZmluZF9zZWN0aW9uKTogTW92ZWQgaGVyZQotCWZyb20gZWxmY29kZS5oLgotCSogZG9jL01ha2VmaWxlLmluIChsaWJiZmQuaCk6IFByb2Nlc3MgZWxmLmMgdG9vLgotCSogTWFrZWZpbGUuaW4gKGVsZi5vKTogTm90ZSBuZXcgZGVwZW5kZW5jaWVzLgotCi0JKiBlbGZjb2RlLmg6IExvdHMgb2Ygc3R1ZmYgbW92ZWQgZWxzZXdoZXJlLiAgRGVsZXRlZCBzb21lIHVudXNlZAotCWNvZGUsIHR3ZWFrZWQgc29tZSBkZWJ1ZyBob29rcy4KLQkoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSk6IFRyYW5zbGF0ZSBFTEYgc2VjdGlvbiBzeW1ib2xzIGludG8gQkZECi0Jc2VjdGlvbiBzeW1ib2xzLgotCi1XZWQgSnVuIDIzIDExOjM0OjIxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBob3N0cy9yaXNjb3MuaDogTmV3IGZpbGUuCi0KLVR1ZSBKdW4gMjIgMTQ6MzU6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyLCBjYXNlIFNIVF9QUk9HQklUUyk6IEV2ZW4gaWYKLQlzZWN0aW9uIGFscmVhZHkgZXhpc3RzLCB1c2UgaXRzIHBvaW50ZXIgdG8gZmlsbCBpbiByYXdkYXRhIHNsb3QuCi0KLVR1ZSBKdW4gMjIgMTY6MzY6NTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6IFJldHVybiB2YWx1ZSBvZiBwdXRzIGFuZCBmcHV0cyBpcyBpbnQgbm90IHZvaWQuCi0KLVR1ZSBKdW4gMjIgMTQ6MjU6NTggMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9leHQpOiBDb21tZW50IHRoZSBmaWVsZCBuYW1lcy4KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBGaXggbWF4IGFuZCBtaW4gdmFsdWVzLgotCi1Nb24gSnVuIDIxIDE4OjE5OjE0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi10YXJnZXQuaCwgZWxmMzItaHBwYS5jLCBlbGZjb2RlLmg6IFVzZSBuZXcKLQlzaXplLWluZGVwZW5kZW50IGVsZiBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuCi0JKiBlbGZjb2RlLmggKHB1dF93b3JkLCBnZXRfd29yZCk6IERlZmluZSBhcyBhcHByb3ByaWF0ZSBmb3IKLQlhcmNoaXRlY3R1cmUgd29yZCBzaXplLiAgU3RydWN0dXJlIHN3YXBwaW5nIGZ1bmN0aW9ucyBjaGFuZ2VkIHRvCi0JdXNlIHRoZW0gYXMgYXBwcm9wcmlhdGUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogSWYgY29tcGlsaW5nIDY0LWJpdCBiYWNrIGVuZHMsIGRvIHRoZW0gYmVmb3JlCi0JMzItYml0IG9uZXMuCi0KLQkqIGxpYmVsZi5oOiBVc2UgbmV3IHNpemUtaW5kZXBlbmRlbnQgdmVyc2lvbnMgb2YgZWxmIGludGVybmFsIGRhdGEKLQlzdHJ1Y3R1cmVzLgotCShzeW1ib2xfdHlwZSk6IFJlb3JkZXJlZCB0byBwdXQgYW55IGZpZWxkcyBkZXBlbmRlbnQgb24gdGFyZ2V0Ci0Jc2l6ZSBhdCB0aGUgZW5kLgotCShlbGZfYmFja2VuZF9kYXRhKTogUmVuYW1lZCBmcm9tIGVsZiMjX2JhY2tlbmRfZGF0YSBhbmQgbWFkZQotCXNpemUtaW5kZXBlbmRlbnQuCi0JKGVsZl9zZWN0X3RodW5rKTogTm93IHNpemUtaW5kZXBlbmRlbnQuCi0KLQkqIGxpYmJmZC5jIChiZmRfbG9nMik6IE5vdyByZXR1cm5zIHVuc2lnbmVkIGludC4KLQotTW9uIEp1biAyMSAxMjozMDo0NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogUmVuYW1lIGNvbmZpZy9tODhrLWFvdXQubXQgdG8gY29uZmlnL25vb3AubXQuCi0JY29uZmlndXJlLmluOiBVc2UgaXQgZm9yIG1pcHMtKi1ic2QqLgotCi1TdW4gSnVuIDIwIDIwOjMyOjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBjcHUtbTY4ay5jIChhcmNoX2luZm9fc3RydWN0KTogRWxpbWluYXRlICJwYXJ0aWFsbHkgYnJhY2tldGVkCi0JaW5pdGlhbGl6ZXIiIHdhcm5pbmcgZnJvbSBnY2MuCi0JKiBjcHUtaDg1MDAuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IExpa2V3aXNlLgotCSogY3B1LXNoLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBMaWtld2lzZS4KLQotCSogY3B1LWg4MzAwLmMgKGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCwgaG93dG8qX2NhbGxiYWNrLAotCWhvd3RvXyopOiBVbnVzZWQgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgY29tbWVudGVkIG91dC4KLQkqIGNwdS16OGsuYyAobG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwLCBob3d0bypfY2FsbGJhY2ssCi0JaG93dG9fKik6IExpa2V3aXNlLgotCSogY3B1LWg4NTAwLmMgKGNvbXBhdGlibGUpOiBMaWtld2lzZS4KLQkqIGNwdS1zaC5jIChjb21wYXRpYmxlKTogTGlrZXdpc2UuCi0KLQkqIGhwMzAwaHB1eC5jIChzd2FwX3N0ZF9yZWxvY19pbik6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGVzLgotCUFsd2F5cyBzZXQgYSB2YWxpZCBsZW5ndGggdmFsdWUsIGV2ZW4gZm9yIGludmFsaWQgaW5wdXQuCi0KLQkqIHNyZWMuYyAoc3JlY193cml0ZV9zeW1ib2xzKTogVXNlIHNwcmludGZfdm1hLgotCi0JKiBiZmQtaW4uaCAodWludDY0X3R5cGVMT1csIHVpbnQ2NF90eXBlSElHSCwgaW50NjRfdHlwZSwKLQl1aW50NjRfdHlwZSk6IFByb3ZpZGUgZGVmYXVsdCBkZWZpbml0aW9ucy4KLQkqIGhvc3RzL3N0ZC1ob3N0LmggKGludDY0IHN0dWZmKTogUmVtb3ZlIHRoZW0gZnJvbSBoZXJlLgotCi0JKiBiZmQtaW4uaCAoc3ByaW50Zl92bWEpOiBEZWZpbmUgcGFyYWxsZWwgdG8gZnByaW50Zl92bWEuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBEZWxldGUgdW51c2VkCi0JdmFyaWFibGUuICBBZGRlZCBkZWZhdWx0IGNhc2UgdG8gc3dpdGNoLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogQmVmb3JlIGNhc3RpbmcKLQlwb2ludGVycyB0byBpbnRlZ2VycywgbWFrZSBzdXJlIHRoZSBpbnRlZ2VyIHR5cGUgaXMgd2lkZSBlbm91Z2guCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogRGl0dG8uCi0KLQkqIHNlY3Rpb24uYyAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogU2luY2UgYGNvdW50JyBpcyB1bnNpZ25lZCwKLQlkb24ndCBib3RoZXIgY29tcGFyaW5nIGZvciBsZXNzLXRoYW4temVyby4KLQkoYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRGl0dG8uCi0KLQkqIGVsZmNvZGUuaCAoYmZkX2FkZF90b19zdHJ0YWIpOiBOb3cgc3RhdGljLgotCShzeW1faXNfZ2xvYmFsKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfbWFwX3N5bWJvbHMpOiBDYWxsIGl0LiAgTm93IHJldHVybnMgdm9pZC4gIFJlbW92ZWQgdW51c2VkCi0JbG9jYWwgdmFyaWFibGUuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IE1hcmsgc3RyaW5nIHRhYmxlcyBvdGhlciB0aGFuIGZvciBzZWN0aW9uCi0JYW5kIHN5bWJvbCBuYW1lcyBhcyBub3JtYWwgc2VjdGlvbnMgaGF2aW5nIGNvbnRlbnRzLgotCShmaXhfdXBfc3RydGFicyk6IE5ldyBmdW5jdGlvbjsgZml4ZXMgdXAgRUxGIGhlYWRlciBmaWVsZHMgZm9yCi0Jc3RhYiBzZWN0aW9ucyB3aXRoIHN0cmluZyB0YWJsZXMgYXNzb2NpYXRlZC4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE1hcCBmaXhfdXBfc3RydGFicyBvdmVyIGFsbCBCRkQKLQlzZWN0aW9ucy4gIFJlb3JkZXJlZCBjb25kaXRpb24gdGVzdHMgZm9yIHN5bWJvbCBmbGFnczsgZGVmYXVsdCB0bwotCWxvY2FsLW9iamVjdCB2YWx1ZSBpbnN0ZWFkIG9mIGdsb2JhbC1vYmplY3QuCi0JKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogSGlkIGNvbmRpdGlvbmFsbHktdXNlZCB2YXJpYWJsZQotCWluc2lkZSBjb25kaXRpb24gdGVzdC4KLQkoZWxmX3ByaW50X3N5bWJvbCk6IFVzZSBmcHJpbnRmX3ZtYS4KLQkoZWxmX2lkeF9vZl9zeW0sIGJmZF9zaGRyX2Zyb21fc2VjdGlvbik6IFVudXNlZCBmdW5jdGlvbnMKLQljb21tZW50ZWQgb3V0LgotCi0JKiBiZmQtaW4uaCAoaW50NjRfdHlwZSwgdWludDY0X3R5cGUpOiBEZWZpbmUgdGhlc2UgaWYgd2UgZmFsbAotCWJhY2sgdG8gImxvbmcgbG9uZyIgZm9yIEhPU1RfNjRfQklULgotCi0JKiBsaWJlbGYuaCAoZWxmTkFNRSwgRWxmTkFNRSk6IE5ldyB2ZXJzaW9ucyB0byBnZXQgZGVzaXJlZCByZXN1bHRzCi0Jd2l0aG91dCB1c2luZyBpbnZhbGlkIEFOU0kgQyBwcmVwcm9jZXNzaW5nIHRva2Vucy4KLQotCSogZWxmMzItdGFyZ2V0LmggKGJmZF9lbGYzMl9uZXdfc2VjdGlvbl9ob29rKTogRGVsZXRlIG1hY3JvLgotCSogbGliZWxmLmggKGJmZF9lbGYzMl9uZXdfc2VjdGlvbl9ob29rKTogRGVjbGFyZS4KLQkqIGVsZmNvZGUuaCAobmV3X3NlY3Rpb25faG9vayk6IERlZmluZSBoZXJlLgotCi0JKiBob3N0cy9zcGFyYy5oLCBob3N0cy9zdGQtaG9zdC5oLCBob3N0cy9pMzg2YnNkLmg6IFByb3RlY3QKLQlhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbnMuCi0KLQkqIGhvc3RzL25ld3MuaDogSW5jbHVkZSBob3N0cy9zdGQtaG9zdC5oLCBub3QgcGxhaW4gc3RkLWhvc3QuaC4KLQotCSogTWFrZWZpbGUuaW4gKGJmZC5oKTogR2VuZXJhdGUgaW50byBjdXJyZW50IGRpcmVjdG9yeSBieSBncmFiYmluZwotCTY0LWJpdCBkZWZpbml0aW9uIChpZiBhbnkpIGZyb20gc3lzZGVwLmguCi0JKiBiZmQtaW4uaDogUHV0IGluIG1hcmtlciBmb3Igc3lzZGVwLmggaW5jbHVzaW9uLgotCi1GcmkgSnVuIDE4IDE5OjU3OjIzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IENoZWNrIGZvciBvdmVyZmxvdyBvbgotCXBjLXJlbGF0aXZlIHJlbG9jYXRpb25zIGlmIHRoZSBob3d0byBhc2tlZCBmb3IgaXQuCi0KLUZyaSBKdW4gMTggMTY6MDA6MjAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzdG1wLWJmZC5oKTogSWdub3JlIG5vbnplcm8gZXhpdCBzdGF0dXMgZnJvbSBncmVwLgotCi1GcmkgSnVuIDE4IDE2OjU0OjI5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvcmlzY29zLm17aCx0fTogTmV3IGZpbGVzLgotCSogY29uZmlndXJlLntob3N0LGlufTogVXNlIHRoZW0uCi0KLUZyaSBKdW4gMTggMTI6NTU6MTAgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1pcHMuYzogY29tbWVudCBjaGFuZ2UuICBUaGlzIGlzIGEgbWlwcyBmaWxlLCBub3QgODhrLgotCi1Nb24gSnVuIDE0IDE0OjAyOjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBjYWNoZS5jIChiZmRfY2FjaGVfaW5pdCk6IEluY3JlbWVudCBvcGVuX2ZpbGVzIGFuZCBjYWxsIGNsb3NlX29uZQotCWlmIG5lY2Vzc2FyeS4KLQkoYmZkX29wZW5fZmlsZSk6IERvbid0IGluY3JlbWVudCBvcGVuX2ZpbGVzIGhlcmUuCi0KLUZyaSBKdW4gMTggMTA6MDA6MTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9kZWx0YTg4Lm1oOiBEb24ndCBzZXQgQ0MuCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgZWxmMzIte21pcHMsbTg4ayxnZW5lcmljfS4KLQllbGYzMi17bWlwcyxtODhrLGdlbmVyaWN9LmM6IE5ldyBmaWxlcy4KLQl0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBJbmNsdWRlIGJmZF9lbGYzMl97bWlwcyxtODhrLGdlbmVyaWN9X3ZlYy4KLQllbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IE1hdGNoIGVsZjMyLWdlbmVyaWMgZm9yIGFsbCBtYWNoaW5lcyB3aGljaAotCWRvbid0IG1hdGNoIGEgZGlmZmVyZW50IHRhcmdldC4KLQotRnJpIEp1biAxOCAwMzoxMjoxMiAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUVsaW1pbmF0ZSAiaW50OF90eXBlIiwgImludDE2X3R5cGUiLCAiaW50MzJfdHlwZSIsIGFuZCB0aGVpcgotCXZhcmlhbnRzIGZyb20gdGhlIEJGRCB1bml2ZXJzZS4gIExlYXZlIHRoZSA2NC1iaXQgdHlwZXMgZm9yIG5vdywKLQlzaW5jZSB0aGV5IGFyZSBpbiBmbHV4LgotCi0JKiBhb3V0eC5oLCBocDMwMGhwdXguYzogIEVsaW1pbmF0ZSBuZWVkbGVzcyAoaW50MzJfdHlwZSkgY2FzdHMuCi0JKiBsaWJhb3V0LmggKEdFVF9TV09SRCk6ICBDb252ZXJ0IChpbnQzMl90eXBlKSB0byAoaW50KS4KLQkqIGllZWUuYzogIENvbnZlcnQgdWludDhlX3R5cGUgPT4gdW5zaWduZWQgY2hhci4KLQkqIG9hc3lzLmM6ICBFeHRlbnNpdmUgY2hhbmdlcyB0byBlbGltaW5hdGUgb2Jzb2xldGUgdHlwZXMuCi0JVGhlc2UgZGVwZW5kIG9uIGNoYW5nZXMgaW4gLi4vaW5jbHVkZS9vYXN5cy5oIGFzIHdlbGwuCi0JKiBob3N0cy8qLmg6ICBSZW1vdmUgZGVjbGFyYXRpb25zIG9mIGFsbCB0aGVzZSB0eXBlcy4KLQotTW9uIEp1biAxNCAxNDowMjo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvZGVsdGE4OC5oOiAjaWYgMCBvdXQgc29tZSBkZWNsYXJhdGlvbnMgd2hpY2ggY29uZmxpY3Qgd2l0aAotCXN5c3RlbSBoZWFkZXJzLgotCi1Nb24gSnVuIDE0IDE3OjA4OjE4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiByZW1vdmUgcGFyZW50ZGlyIGNydWZ0Ci0KLU1vbiBKdW4gMTQgMTk6MDQ6MDkgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jIChocHBhX2dldF9zeW1ib2xfaW5mbyk6ICBSZW1vdmUgcmVkdW5kYW50IGNvcHkuCi0JKiBFeHB1cmdhdGUgcmFuZG9tIERFRlVOcyB0aGF0IGhhdmUgY3JlcHQgaW4uCi0KLU1vbiBKdW4gMTQgMTA6MjM6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogQ29uc3RydWN0b3Igc2VjdGlvbnMgc2hvdWxkCi0Jb25seSBiZSBhbGlnbmVkIHRvIGEgNCBieXRlIGJvdW5kYXJ5LgotCi1TYXQgSnVuIDEyIDE2OjEzOjE3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oIChzdHJ1Y3QgaW50NjRlX3N0cnVjdCk6IFJlbW92ZSBuZWVkbGVzcyB0eXBlZGVmCi0Ja2V5d29yZC4KLQotRnJpIEp1biAxMSAxNDoyNTozNCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IHNldCBmbGFncyB0byAxLCBicmVha2luZwotCTE5MjcgYnV0IGZpeGluZyBzb21lIG90aGVyIGltcG9ydGFudCB0aGluZ3MuCi0KLVRodSBKdW4gMTAgMjA6MzY6MjIgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaCAoaW50NjRlX3R5cGUpOiBGaXggZGVmaW5pdGlvbi4KLQotVGh1IEp1biAxMCAxMTo0ODoyOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9zZWNfdG9fc3R5cF9mbGFncyk6IFVzZSBTVFlQX01JUFNfSU5JVCBmb3IKLQlzZWN0aW9uIG5hbWVkIF9JTklULiAgRG9uJ3Qgc2V0IFNUWVBfVEVYVCB1bmxlc3MgU0VDX0NPREUgaXMgc2V0LgotCShlY29mZl9zdHlwX3RvX3NlY19mbGFncyk6IFRyZWF0IGEgU1RZUF9NSVBTX0lOSVQgc2VjdGlvbiBsaWtlCi0JYSBTVFlQX1RFWFQgc2VjdGlvbi4KLQotV2VkIEp1biAgOSAxNjo0ODoxMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLCBoZWFkZXJzKTogZG9uJ3QgcHV0IGNvbW1lbnRzIGFmdGVyIGEgdGFiCi0JaW4gdGhlIGFjdGlvbnMgc2VjdGlvbiBvZiBhIHJ1bGUKLQotV2VkIEp1biAgOSAxNTowMDowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9ta29iamVjdF9ob29rKTogTWFyayBaTUFHSUMgZmlsZXMgYXMgRF9QQUdFRC4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgbm90IERfUEFHRUQsIGRvbid0IGFkZCB0aGUKLQlzZWN0aW9uIGhlYWRlcnMgdG8gdGV4dF9zaXplLiAgSWYgbm90IERfUEFHRUQsIHNldCB0aGUgbWFnaWMKLQludW1iZXIgdG8gT01BR0lDIHJhdGhlciB0aGFuIFpNQUdJQy4gIElmIGNyZWF0aW5nIGEgRF9QQUdFRAotCWV4ZWN1dGFibGUsIHRoZSBleGVjdXRhYmxlIG11c3QgZnVsbHkgb2NjdXB5IGFuIGV2ZW4gbnVtYmVyIG9mCi0JcGFnZXMuCi0JKGVjb2ZmX3NldF9zeW1ib2xfaW5mbywgbWFrZV9iZmRfYXNlY3Rpb24sIGVjb2ZmX2xpdHRsZV92ZWMsCi0JZWNvZmZfYmlnX3ZlYyk6IENvbnNpc3RlbnRseSBzZXQgc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIgdG8gNCwKLQlzaW5jZSBFQ09GRiBzZWN0aW9ucyBzaG91bGQgYmUgbXVsdGlwbGVzIG9mIDE2IGJ5dGVzLgotCShlY29mZl9saXR0bGVfdmVjLCBlY29mZl9iaWdfdmVjKTogQWRkZWQgRF9QQUdFRCB0byBvYmplY3RfZmxhZ3MuCi0JTWFkZSBhcl9wYWRfY2hhciBhbmQgYXJfbWF4X25hbWVsZW4gYWdyZWUgZm9yIGJvdGguCi0KLVR1ZSBKdW4gIDggMjA6Mjg6MDIgMTk5MyAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgdHdlZWRsZWR1bWJlcikKLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogc3VidHJhY3Qgc2VjdGlvbiB2bWEgZnJvbQotCXN5bWJvbCB2YWx1ZSwgc2luY2UgYmZkIHN5bWJvbHMgYXJlIHNlY3Rpb24gcmVsYXRpdmUsIGJ1dCBFTEYKLQlzeW1ib2xzIGFyZW4ndC4KLQotVHVlIEp1biAgOCAxMjowODoyNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjcHUtaTk2MC5jLCBjcHUtaDgzMDAuYyAoY29tcGF0aWJsZSk6IE1ha2Ugc3RhdGljLgotCi1UdWUgSnVuICA4IDE0OjI3OjU2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBydGwuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvbmV3cy5oLCBjb25maWcvbmV3cy5taDogTmV3IGZpbGVzLgotCi1UdWUgSnVuICA4IDEyOjA4OjI3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbjIuaCwgYXJjaHVyZXMuYyAoYmZkX21hY2hfaDgzMDBbaF0pOiBuZXcgZGVmaW5lcy4KLQkqIGNvZmYtaDgzMDAuYzogTW9yZSBhZGRyZXNzaW5nIG1vZGVzLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBDb3BlIHdpdGggSDgzMDAgbWFnaWMKLQludW1iZXIuCi0JKiBjcHUtaDgzMDAuYzogUmVtb3ZlZCBkaXNhc3NlbWJsZSBzdHVmZi4gKGg4MzAwX3NjYW4pOiBSZWNvZ25pc2UKLQlIOC8zMDBIIG5hbWUuIChjb21wYXRpYmxlKTogTmV3IGZ1bmN0aW9uLgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjKTogQ29wZSB3aXRoIG1vcmUKLQlhZGRyZXNzaW5nIG1vZGVzLgotCi1UdWUgSnVuICA4IDEwOjMwOjEzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywKLQllY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBPbmx5IHJvdW5kIHRvIHBhZ2UgYm91bmRhcmllcyBpZgotCURfUEFHRUQgZmxhZyBpcyBzZXQgZm9yIHRoZSBvdXRwdXQgQkZELgotCi1GcmkgSnVuICA0IDE1OjQ3OjUyIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGdldF9pbmRleCwgY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBGaXggcG9pbnRlcgotCWNhc3RzIHRvIHdvcmsgb24gbWFjaGluZSB3aGVyZSBzaXplb2YobG9uZykgIT0gc2l6ZW9mKGludCkgIT0KLQlzaXplb2YoY2hhciAqKS4KLSAgICAgICAgKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogRGl0dG8uCi0JKiBjcHUtaDgzMDAuYyBjb2ZmLWg4MzAwLmM6IFN1cHBvcnQgZm9yIEg4LzMwMC1ILgotCi1GcmkgSnVuICA0IDE1OjI0OjI3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3dyaXRlX3N5bWJvbHMpOiBGb3IgZW1wdHkgc3RyaW5nIHRhYmxlLCB3cml0ZQotCW91dCA0IGluIGNvcnJlY3QgYnl0ZSBvcmRlci4gIChmcm9tIG1pbnlhcmRAYm5yLmNhKQotCi0JKiBlbGYzMi1ocHBhLmM6IERvbid0IGluY2x1ZGUgbGliaHBwYS5oIGZvciBub3c7IGRlZmluZQotCUJZVEVTX0lOX1dPUkQgaW5zdGVhZCwgdW50aWwgVXRhaCBzZW5kcyBhIGJldHRlciBmaXguCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogVXNlIHhtYWxsb2MgYW5kIHhyZWFsbG9jIGluc3RlYWQKLQlvZiBtYWxsb2MgYW5kIHJlYWxsb2MuCi0KLUZyaSBKdW4gIDQgMDc6NDk6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1lY29mZmwqKTogTmV3IHRhcmdldDsgdXNlIGRlY3N0YXRpb24uCi0JKG1pcHMtKi1lY29mZiopOiBBZGRlZCB0cmFpbGluZyAnKicuCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9nZXRfZGVidWcpOiBHZXQgdGhlIG9mZnNldCBmcm9tIHRoZSBmaXJzdCBQRFIKLQlmb3IgdGhlIEZEUiwgbm90IGZyb20gdGhlIGZpcnN0IFBEUiBpbiB0aGUgZmlsZS4KLQotVGh1IEp1biAgMyAxNjo0MToxMCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBocHBhLmMgKGhwcGFfZ2V0X3N5bWJvbF9pbmZvKTogIE5ldyBmdW5jIG5lZWRlZCBmb3IgSlVNUF9UQUJMRS4KLQotVGh1IEp1biAgMyAxNTozMzo1NyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuYyAoaHBwYV9nZXRfc3ltYm9sX2luZm8pOiBOZXcgZnVuY3Rpb24uCi0KLVRodSBKdW4gIDMgMTM6MDc6NDIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9tYXBfc3ltYm9scyk6IERvbid0IGNyYXNoIGlmIG5vIHN5bWJvbHMgaGF2ZSBiZWVuCi0JYWxsb2NhdGVkIHlldC4KLQotCUZyb20gUGV0ZXIgSG9vZ2VuYm9vbSAoaG9vZ2VuQHNjaGFmZXIuY3MudXRhaC5lZHUpOgotCSogbGliaHBwYS5oIChNQVhDT01MRU4pOiBEZWZpbmUgdW5jb25kaXRpb25hbGx5LgotCShfUEFfUklTQ19JRCk6IE9ubHkgZGVmaW5lIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKiBlbGYzMi1ocHBhLmM6IEluY2x1ZGUgbGliaHBwYS5oLgotCi0JRnJvbSBSYWxwaCBDYW1wYmVsbDoKLQkqIGhvc3RzL21pcHNic2QuaCAoSE9TVF9EQVRBX1NUQVJUX0FERFIpOiBEZWxldGUgZGVmaW5pdGlvbi4KLQotCSogZWxmMzItaHBwYS5oIChzeW1leHRfcm9vdFAsIHN5bWV4dF9sYXN0UCk6IERlbGV0ZSBkZWNscy4KLQotVGh1IEp1biAgMyAwMDoyMzo1MyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9nbzMyLm1oOiBkZWZpbmUgRVhUUkFMSUJFUyB0byAtbG0gKGZvciBiaW51dGlscyksIGFsc28KLQlyZW1vdmUgZGVmaW5lcyBvZiBfX01TRE9TX18gYW5kIF9fR08zMl9fICh0aGVzZSBhcmUgaW4gdGhlCi0JY29tcGlsZXIgbm93KS4KLQotV2VkIEp1biAgMiAxNzo1NzoxMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQlGcm9tIFV0YWg6Ci0JKiBob3N0cy9ocHBhYnNkLmg6IEVsaW1pbmF0ZSB1c2Ugb2Ygb2Jzb2xldGUgRVhGVU4uCi0JKiBjb25maWcvaHBwYWJzZC5taDogRG9uJ3QgdXNlIHJhbmxpYi4KLQotVHVlIEp1biAgMSAwNDoxNTo1NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6IE5ldyBmaWxlLCBmb3Igd29yZC1zaXplIGluZGVwZW5kZW50IGNvZGUuCi0JKiBlbGZjb2RlLmggKGVsZl9oYXNoKTogTW92ZWQgdG8gdGhlcmUsIHJlbmFtZWQgYmZkX2VsZl9oYXNoLgotCSogTWFrZWZpbGUuaW46IEluY2x1ZGUgZWxmLm8gaW4gc3RhbmRhcmQgb2JqZWN0cy4KLQotCSogYmZkLWluLmggKENBVDMpOiBEZWZpbmUgaGVyZS4KLQkqIGxpYmFvdXQuaCwgbGliZWxmLmg6IE5vdCBoZXJlLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IHN0cnRhYik6IERlZmluZSBoZXJlLgotCShiZmRfZWxmX2xvY2F0ZV9zaCk6IERlY2xhcmUgaGVyZS4KLQkqIGVsZmNvZGUuaCAoc3RydWN0IHN0cnRhYik6IERlZmluaXRpb24gZGVsZXRlZC4KLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogQWRkZWQgSFBQQV9QQ1JFTF9DQUxMXzEyLgotCi0JKiBNYWtlZmlsZS5pbjogTWFrZSAiYWxsIiwgbm90ICJiZmQuaCIsIGJlIHRoZSBkZWZhdWx0IHRhcmdldC4KLQkoc3RtcC1iZmQuaCk6IE5ldyB0YXJnZXQ7IHByZXZlbnRzIHJlYnVpbGRpbmcgd29ybGQgaWYgYmZkLmgKLQloYXNuJ3QgcmVhbGx5IGNoYW5nZWQuCi0KLQlUdWUgTWF5IDI1IDEyOjE1OjE1IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBlbGZjb2RlLmggKGVsZl9oYXNoKTogUHJvdmlkZSBlbGYgc3RhbmRhcmQgaGFzaCBmdW5jdGlvbi4KLQkodmFyaW91cyk6IEtleSBvZmYgb2YgdGhlIG1hY2hpbmVzIHVzZV9yZWxhX3AgZmllbGQgdG8gZGV0ZXJtaW5lCi0Jd2hldGhlciB0byB1c2UgUkVMIG9yIFJFTEEgcmVsb2NhdGlvbnMuCi0JKGVsZl9zd2FwX3JlbG9jX291dCwgZWxmX3N3YXBfcmVsb2NfaW4pOiBOZXcgZnVuY3Rpb25zLgotCShlbGZfbWFrZV9zZWN0aW9ucyk6IEFsbG9jYXRlIGEgcG9pbnRlciB0byBob2xkIGFsbCBkYXRhIGZvciBhCi0JZ2l2ZW4gc2VjdGlvbiwgYW5kIGNvcHkgZWFjaCBmcmFnbWVudCBpbnRvIHRoZSBkYXRhIHJlZ2lvbi4KLQlVcGRhdGUgdGhlIHNlY3Rpb24ncyBwb2ludGVyIHdpdGggdGhlIFJFTCBpbXBsaWNpdCBhZGRlbmRzIGlmIHRoZQotCW1hY2hpbmUgdXNlcyBSRUwgcmVsb2NhdGlvbi4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogUmVuYW1lIHRvCi0JZWxmX2kzODZfYmZkX3JlbG9jX3R5cGVfbG9va3VwLCBhbmQgdXNlIGNwcCB0byBtYXAgdGhlIG5hbWUgYmFjawotCWludG8gd2FzIGVsZjMyLXRhcmdldC5oIGV4cGVjdHMuCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogUmVuYW1lIHRvIGVsZl9pMzg2X2luZm9fdG9faG93dG8uCi0JKGVsZl9pMzg2X2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCByZWxvY2F0aW9uIHN1cHBvcnQuCi0JKGVsZl9pMzg2X2luZm9fdG9faG93dG8pOiBBZGQgbWluaW1hbCByZWxvY2F0aW9uIHN1cHBvcnQuCi0KLQkqIGxpYmVsZi5oIChlbGZfYmFja2VuZF9kYXRhKTogQWRkIHVzZV9yZWxhX3AsIGVsZl82NF9wLAotCWVsZl9pbmZvX3RvX2hvd3RvX3JlbCBmaWVsZHMuCi0KLQkqIGVsZjMyLXRhcmdldC5oIChlbGZfYmVkKTogQWRkIHN1cHBvcnQgZm9yIG5ldyBmaWVsZHMgaW4KLQllbGZfYmFja2VuZF9kYXRhLgotCi0JU3VuIE1heSAzMCAxNjozODoyNCAxOTkzICBQZXRlciBIb29nZW5ib29tICAoaG9vZ2VuQGZhc3QuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYzogQWRkIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbiBzdXBwb3J0LCBmaXgKLQlyZWxvY2F0aW9uIGhvd3RvIHRhYmxlLCBhZGQgc3R1YiBnZW5lcmF0aW9uIHN1cHBvcnQuCi0KLQkqIGVsZjMyLWhwcGEuaDogQWRkIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbiBzdXBwb3J0LCBmaXgKLQlyZWxvY2F0aW9uIGhvd3RvIHRhYmxlLCBhZGQgc3R1YiBnZW5lcmF0aW9uIHN1cHBvcnQuCi0KLQkqIGVsZmNvZGUuaCAoYmZkX2VsZl9sb2NhdGVfc2gpOiBOZXcgZnVuY3Rpb24gdG8gbG9jYXRlIEVMRgotCXNlY3Rpb24gaGVhZGVyLgotCi0JKiBlbGZjb2RlLmggKGJmZF9hZGRfdG9fc3RydGFiKTogTWFkZSBub24tc3RhdGljIGR1ZSB0byBhIGNhbGwKLQlmcm9tIGVsZjMyLWhwcGEuYy4KLQotCSogZWxmY29kZS5oIChlbGZfaWR4X29mX3N5bSk6IFJldHVybiBTVE5fVU5ERUYgaW5zdGVhZCBvZiAwIHdoZW4KLQl0aGUgc3ltYm9sIGlzIG5vdCBmb3VuZC4KLQotCSogZWxmY29kZS5oIChlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTm90IGFsbCBzZWN0aW9uCi0JZmlsZSBwb3NpdGlvbnMgd2VyZSBjb21wdXRlZC4KLQotCSogZWxmY29kZS5oIChlbGZfZ2V0X3NlY3RfdGh1bmspOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGhwcGEuYyAoc2lnbl9leHQpOiBSZWltcGxlbWVudC4KLQotCSogaHBwYS5jIChyb3VuZF9kb3duLHJvdW5kLHJvdW5kX3VwLEwsUixMUyxSUyxMRCxSRCxMUixSUik6IE1ha2UKLQl0aGVzZSBmdW5jdGlvbnMgc3RhdGljLgotCi1UdWUgSnVuICAxIDE0OjQwOjQxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGJmZC5oKTogIE1vdmUgY2xvc2VyIHRvIGhlYWRlcnMgLSBhbmQgYWZ0ZXIgJ2FsbCchCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiAgRG9uJ3Qgc2V0Ci0JQlNGX0RFQlVHR0lORyBmb3IgY29uc3RydWN0b3Igc3ltYm9scywgb25seSBCU0ZfQ09OU1RSVUNUT1IuCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6ICBUcmFuc2xhdGUKLQljb25zdHJ1Y3RvciBzeW1ib2xzIHByb3Blcmx5LgotCi1UaHUgTWF5IDI3IDE2OjA5OjA0IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0KTogdXNlIDQgYnl0ZSBhbGlnbm1lbnQgYXMgYQotCW1pbmltdW0uCi0JKiBhb3V0LXRhcmdldC5oIChtaW5pbXVtX2FsaWdubWVudCk6IDggYnl0ZSBhbGlnbm1lbnQgaXMgcmlnaHQuCi0JKGZpeCBsZC8yNjgwKQotCi1UaHUgTWF5IDI3IDEzOjM4OjQ3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogQnVpbGQgYmZkLWluMi5oIGluIHNvdXJjZSBkaXJlY3RvcnksCi0JZnJvbSBiZmQtaW4uaCBhbmQgLmMgZmlsZXMuICBCdWlsZCBiZmQuaCBpbiBidWlsZCBkaXJlY3RvcnksCi0Jc3Vic3RpdHV0aW5nIGluIHJlcXVlc3RlZCB0YXJnZXQgd29yZCBzaXplLiAgSW5zZXJ0IHdvcmQgc2l6ZSBpbnRvCi0JbWFrZWZpbGUsIGFuZCBtYXliZSBlbmFibGUgNjQtYml0IHRhcmdldHMuCi0KLQkqIGJmZC1pbi5oLCBsaWJiZmQuYywgZGVtbzY0LmMsIHRhcmdldHMuYzogRGVmaW5lIEJGRDY0IGlmIDY0IGJpdHMKLQlhcmUgYXZhaWxhYmxlLiAgQ29uZGl0aW9uYWxpemUgb24gdGhpcy4gIEFzc3VtZSBIT1NUXzY0X0JJVAotCXdpbGwgYmUgZGVmaW5lZCBpZiBuZWVkZWQsIHNvIDY0LWJpdCB0YXJnZXRzIGFyZSBjb25kaXRpb25hbGl6ZWQKLQlvbmx5IGluIHRoZSBNYWtlZmlsZS4KLQotVHVlIE1heSAyNSAxNDowMzo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5jIChDT0VSQ0U2NCk6IFJld3JpdGUgdG8gYXZvaWQgb3V0LW9mLXJhbmdlIHZhbHVlcy4KLQotCSogY29mZi1zaC5jIChydHlwZTJob3d0byk6IFB1dCBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyci4KLQkoZXh0cmFfY2FzZSk6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGUuCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9wcmludF9zeW1ib2wpOiBDYXN0IGJmZF92bWEgdmFsdWVzIHRvIGxvbmcKLQliZWZvcmUgY2FsbGluZyBwcmludGYuCi0KLQkqIGVsZmNvZGUuaDogTmV3IGZpbGUsIGFsbW9zdCBjb21wbGV0ZWx5IGRlcml2ZWQgZnJvbSBvbGQgZWxmMzIuYy4KLQkqIGVsZjMyLmM6IE5vdyBqdXN0IGRlZmluZSBBUkNIX1NJWkUgYW5kIGluY2x1ZGUgZWxmY29kZS5oLgotCSogTWFrZWZpbGUuaW4gKGVsZjY0Lm8pOiBMaXN0IGRlcGVuZGVuY2llcywgZG9uJ3QgYnVpbGQgYnkKLQlkZWZhdWx0LgotCShlbGY2NC5jKTogQWRkIHRvIGxpc3Qgb2Ygc291cmNlcy4KLQkoZWxmMzIubyk6IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0JKiBlbGYzMi0qLmM6IFVwZGF0ZWQgdHlwZS9tYWNyby9zdHJ1Y3R1cmUgbmFtZXMuICBDbGVhbmVkIHVwCi0JbmFtZXNwYWNlIHBvbGx1dGlvbjsgcmVuYW1lIHZlY3RvcnMuCi0JKiB0YXJnZXRzLmMsIGNvbmZpZy8qLWVsZi5tdDogVXBkYXRlZC4KLQkqIEFsbCB1c2VzIG9mIDMyLWJpdCB2ZXJzaW9ucyBvZiBzdHJ1Y3R1cmVzLCByb3V0aW5lcywgYW5kIG1hY3JvcwotCXJlbmFtZWQuCi0KLQkqIE1ha2VmaWxlLmluIChhcmNodXJlcy5vLCB0YXJnZXRzLm8pOiBEZXBlbmQgb24gTWFrZWZpbGUuCi0KLU1vbiBNYXkgMjQgMTU6NTM6MTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWkzODYuYyAoZW51bSByZWxvY190eXBlKTogTm8gY29tbWEgYWZ0ZXIgbGFzdCBlbnVtZXJhdG9yLgotCi0JKiBlbGYzMi5jIChlbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24pOiBIYW5kbGUgaW5kZXggb2YgemVybwotCXNwZWNpYWxseS4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyLCBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3QgbmVlZCB0byBkbwotCXNvIGhlcmUuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEZWxldGVkIG9uZSB1bnVzZWQgdmFyaWFibGUgYW5kCi0JaW5pdGlhbGl6ZWQgYW5vdGhlciB0byBhdm9pZCBnY2Mgd2FybmluZ3MuCi0JKGVsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGUuCi0KLUZyaSBNYXkgMjEgMTk6MDQ6MjEgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogaTM4Nmx5bnguYzogIE5ldyBtb2R1bGUgZm9yIEx5bnggdmFyaWFudCBvZiBhLm91dC4KLQkqIE1ha2VmaWxlLmluIChCRkRfQkFDS0VORFMgQ0ZJTEVTIGRlcGVuZHMpOiAgQWRkIGkzODZseW54LmMuCi0JKiBnZW4tYW91dC5jOiAgR2V0IHJpZCBvZiBkZWZ1bmN0IGVuZGlhbiBzdHVmZiwgcHJpbnQgb3V0IHRydWUKLQlwYWdlc2l6ZS4KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6ICBBZGQgaTM4Nmx5bnhfdmVjLgotCi1GcmkgTWF5IDIxIDE3OjAyOjIyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFVzZSBpMzg2LXNjby5tdCBmb3IgaVszNl04Ni0qLWlzYyouCi0KLUZyaSBNYXkgMjEgMTM6NDQ6MTggMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhaXgzODYtY29yZS5jLCBhb3V0LXRhcmdldC5oLCBhb3V0eC5oLCBjb2ZmLWFscGhhLmMsCi0JY29mZi1taXBzLmMsIGNvZmZnZW4uYywgZWxmMzIuYywgaWVlZS5jLCBsaWJhb3V0LmgsIGxpYmNvZmYtaW4uaCwKLQlsaWJlbGYuaCwgbWlwc2JzZC5jLCBvYXN5cy5jLCBzY28tY29yZS5jLCBzcmVjLmMsIHRla2hleC5jLAotCXRyYWQtY29yZS5jOiBEZWZpbmUgYSBUQVJHRVRfZ2V0X3N5bWJvbF9pbmZvIGZ1bmN0aW9uIG9yIG1hY3JvLgotCVJlbW92ZSB0aGUgYmZkX3ByaW50X3N5bWJvbF9ubSBjYXNlIGZyb20gVEFSR0VUX3ByaW50X3N5bWJvbC4KLQotCSogYmZkLWluLmg6IERvbid0IGRlZmluZSBiZmRfcHJpbnRfc3ltYm9sX25tLgotCURlZmluZSBzeW1ib2xfaW5mbyB0eXBlLgotCShKVU1QX1RBQkxFKTogU2V0IF9nZXRfc3ltYm9sX2luZm8gZWxlbWVudC4KLQotCSogc3ltcy5jIChjb2ZmX3NlY3Rpb25fdHlwZSwgYmZkX3N5bWJvbF9pbmZvKTogTmV3IGZ1bmN0aW9ucy4KLQkoYmZkX2RlY29kZV9zeW1jbGFzcyk6IFVzZSBjb2ZmX3NlY3Rpb25fdHlwZS4KLQotCSogdGFyZ2V0cy5jOiBBZGQgYmZkX2dldF9zeW1ib2xfaW5mbyBjYWxsLgotCi1XZWQgTWF5IDE5IDE1OjMwOjUyIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2MpOiAgVXNlIHVuc2lnbmVkIGNoYXIgdG8gYXZvaWQKLQljb21wbGFpbnRzIGZyb20gYW5jaWVudCBnY2Mncy4KLQotV2VkIE1heSAxOSAxNTo1MToxOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmM6ICBDaGVjayBtYWNybyBUUkFEX0NPUkVfRVhUUkFfU0laRV9BTExPV0VELgotCWhvc3RzL2kzODZsaW51eC5oOiAgRGVmaW5lIGl0LgotCi1Nb24gTWF5IDE3IDE1OjAwOjMzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBWRVJTSU9OLCBiZmQtaW4uaDogQnVtcCB2ZXJzaW9uIG51bWJlciB0byAyLjIuCi0KLQkqIGhwcGEuYyAoYXNzZW1ibGVfMywgZGlzX2Fzc2VtYmxlXzMsIGFzc2VtYmxlXzEyLAotCWRpc19hc3NlbWJsZV8xMiwgYXNzZW1ibGVfMTcsIGRpc19hc3NlbWJsZV8xNywgYXNzZW1ibGVfMjEsCi0JZGlzX2Fzc2VtYmxlXzIxLCBzaWduX2V4dCwgb25lcywgc2lnbl91bmV4dCwgbG93X3NpZ25fZXh0LAotCWxvd19zaWduX3VuZXh0LCByb3VuZF9kb3duLCByb3VuZCwgcm91bmRfdXAsIEwsIFIsIExTLCBSUywgTEQsIFJELAotCUxSLCBSUiwgaHBwYV9maWVsZF9hZGp1c3QpOiBOZXcgZnVuY3Rpb25zLgotCi1Nb24gTWF5IDE3IDEwOjA0OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IEFkZGVkIHN1cHBvcnQgZm9yIGluZGlyZWN0Ci0Jc3RhYnMgc3ltYm9scywgaW5jbHVkaW5nIG5ldyBpbmRpcmVjdF9wdHJfcHRyIGFyZ3VtZW50LgotCShlY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBQYXNzIG5ldyBhcmd1bWVudCBpbiBjYWxscyB0bwotCWVjb2ZmX3NldF9zeW1ib2xfaW5mby4KLQotRnJpIE1heSAxNCAwMDowNTowNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRm9yIG02OGsgc3lzdiBzeXN0ZW1zLCB1c2UgbTY4ay1jb2ZmLgotCi0JKiBjb25maWcvaHBwYS1lbGYubXQgKFRERUZJTkVTKTogRG9uJ3QgZGVmaW5lIERFRkFVTFRfVkVDVE9SIGhlcmUuCi0JKFRERUZBVUxUUyk6IERlZmluZSBpdCBoZXJlLiAgVXNlIHRoZSBuZXcgbmFtZS4KLQotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9iYWNrZW5kX2RhdGEpOiBEZWxldGU7IHJlbHkgb24gZGVmYXVsdAotCXZhbHVlcyBpbnN0ZWFkLgotCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpOiBBZGQgc29tZSBIUFBBIHJlbG9jIHR5cGVzLgotCi0JKiBhaXgzODYtY29yZS5jIChOT19HRVRTKTogRml4IFBST1RPIGludm9jYXRpb24gdG8gaGF2ZSBjb3JyZWN0Ci0JbnVtYmVyIG9mIGFyZ3VtZW50cy4KLQkoYWl4Mzg2X2NvcmVfZmlsZV9wKTogSW5pdGlhbGl6ZSBjb3JlX3NpemUgdG8gY29ycmVjdCB2YWx1ZS4KLQotV2VkIE1heSAxMiAxNDozOTo1OSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfQlVJTEQpOiBOZXcgdmFyaWFibGUsIHNldCB0byAkKENDKS4KLQkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgZG93biBDQ19GT1JfQlVJTEQuCi0KLQkqIGJvdXQuYyAoYW91dDMyX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUgdG8gYmUKLQlfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgcmF0aGVyIHRoYW4gYmZkX3RydWUuCi0KLQkqIGNvZmYtbWlwcy5jOiBJbmNsdWRlIGxpYmFvdXQuaCBhbmQgYW91dC9hb3V0NjQuaCB0byBnZXQKLQlkZWZpbml0aW9ucyBmb3IgTl9TRVRbQVREQl0uCi0JKGVjb2ZmX2hvd3RvX3RhYmxlKTogTW92ZWQgbmVhciB0b3Agb2YgZmlsZS4KLQkoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogSWYgYSBTVEFCUyBzeW1ib2wgb2YgdHlwZSBOX1NFVFtBVERCXSBpcwotCXNlZW4sIGNvb2sgdXAgYSBjb25zdHJ1Y3RvciBzZWN0aW9uIG9mIHRoZSBzYW1lIG5hbWUgYW5kIHB1dCBpbiBhCi0JcmVsb2MgcG9pbnRpbmcgdG8gdGhlIHN5bWJvbC4gIFRoaXMgbGV0cyB0aGUgR05VIGxpbmtlciBidWlsZAotCWdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIHdpdGhvdXQgdXNpbmcgY29sbGVjdC4KLQotVHVlIE1heSAxMSAwMDozMzozMSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29mZi1tODhrLmMgKG04OGtiY3NfdmVjKTogIFN5bWJvbHMgaGF2ZSB1bmRlcmJhcnMuCi0KLU1vbiBNYXkgMTAgMDU6NTU6NDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL21pbmlmcmFtZS5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgaXQuCi0KLVN1biBNYXkgIDkgMTY6MzY6NTkgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1ic2QpOiAgQ2hhbmdlIHRvIGhwcGEqLSotYnNkKgotCSogY29uZmlndXJlLmluIChocHBhKi0qLWhwdXgpOiAgQ2hhbmdlIHRvIGhwcGEqLSotaHB1eCoKLQkqIGNvbmZpZ3VyZS5pbiAobTY4Ki1ocC1ic2QpOiAgQ2hhbmdlIHRvIG02OCotaHAtYnNkKgotCSogY29uZmlndXJlLmluIChtNjgqLSotaHB1eCk6ICBDaGFuZ2UgdG8gbTY4Ki0qLWhwdXgqCi0JKiBjb25maWd1cmUuaW4gKCotKi1ic2QpOiAgQ2hhbmdlIHRvICotKi1ic2QqCi0KLVdlZCBNYXkgIDUgMTY6MDg6MzIgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXApOiAgQ2FzdCBlbnVtcyB0bwotCWludCwgZm9yIHRoZSBzYWtlIG9mIHRoZSBvbGQgUG9ydGFibGUgQyBDb21waWxlci4KLQotTW9uIE1heSAgMyAxNDozNzowMSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogIEFkZCBjcHUtc2guYyBhbmQgY29mZi1zaC5jLgotCi1Nb24gTWF5ICAzIDE0OjAzOjIxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEdldCB0YXJnZXQgbmFtZSByaWdodCBmb3IgbTY4Ki0qLWhwdXguCi0KLVN1biBNYXkgIDIgMTE6Mzk6NDQgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jIChOT19TSUdORURfR0VUKTogIE5ldyBtYWNyby4KLQkqIHRyYWQtY29yZS5jICh0cmFkX2NvcmVfdmVjKTogIFVzZSBuZXcgTk9fU0lHTkVEX0dFVCBpbnN0ZWFkIG9mCi0Jc2lnbmVkIE5PX0dFVCwgd2hlcmUgYXBwcm9wcmlhdGUuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLWxpbnV4Kik6ICBBZGQ7IGJmZF90YXJnZXQgPSBpMzg2LWxpbnV4LgotCSogY29uZmlndXJlLmluICgqLSotbGludXgqKTogIFJlbW92ZSB1bnRpbCBsaW51eCBwb3J0IGZvciBhCi0Jbm9uLWkzODYvaTQ4NiBzeXN0ZW0gaXMgYWN0dWFsbHkgYXZhaWxhYmxlLgotCi1GcmkgQXByIDMwIDIwOjA0OjEwIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaDogICN1bmRlZiBlXyogc3ltYm9scyB3aGljaCBjb21lIGZyb20gPG1hY2hpbmUvc29tLmg+Ci0Jd2hlbiBjb21waWxpbmcgdW5kZXIgSFBVWC4KLQotRnJpIEFwciAzMCAxNzoyNToyMyAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBUaGUgZm9sbG93aW5nIHBhdGNoZXMgYXJlIGZyb20gSmVmZnJleSBMYXcgPGxhd0Bjcy51dGFoLmVkdT4uCi0JKiBocHBhLmMgKGhwcGFfY29yZV9maWxlX3ApOiBQcm92aWRlIGEgdGVtcG9yYXJ5IGR1bW15IHJvdXRpbmUKLQlmb3IgSE9TVF9IUFBBQlNELgotCSogYmZkL2hvc3RzL2hwcGFic2QuaDogRml4IGRlY2xhcmF0aW9ucyBvZiBtYWxsb2MgYW5kIGZyZWUuCi0JKiBiZmQvbGliaHBwYS5oOiBJbmNsdWRlIHN5c2RlcCBoZXJlLiAgQ29uZGl0aW9uYWxpemUKLQlpbmNsdWRlcyBiYXNlZCBvbiBIT1NUX0hQUEFIUFVYIG9yIEhPU1RfSFBQQUJTRC4KLQlQcm92aWRlIGRlZmluaXRpb25zIGZvciBNQVhDT01MRU4gYW5kIF9QQV9SSVNDX0lEIHN1aXRhYmxlCi0JZm9yIEJTRC4KLQotRnJpIEFwciAzMCAxNzozNDoxMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWhwcGEuYzogRG9uJ3QgaW5jbHVkZSBhLm91dC5oLiAgQXBwYXJlbnRseSBub3QgZXZlbiB0aGUKLQlHTlUgdmVyc2lvbiBpcyBuZWVkZWQuCi0KLUZyaSBBcHIgMzAgMDk6Mzg6NTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IHVzZSBkdW1teV9yZWxvYzE2X2V4dHJhX2Nhc2VzIHJhdGhlciB0aGFuIGNhc3RpbmcgYWJvcnQuCi0KLVRodSBBcHIgMjkgMTE6MzA6MzIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBCdWlsZCBlbGYzMi1ocHBhLm8uCi0KLQkqIHN5bXMuYyAoQlNGX0ZVTkNUSU9OKTogTmV3IHN5bWJvbCBmbGFnLgotCi0JKiBlbGYzMi1ocHBhLmM6IEZpeGVkIHRvIHdvcmsgd2l0aCBlbGYzMi10YXJnZXQuaC4KLQotCSogaHAzMDBocHV4LmMgKE5BTUUsIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbik6IEZpeCBmb3IKLQl0cmFkaXRpb25hbCBDLgotCSogbGliYW91dC5oIChOQU1FKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4KLQotCSogbGliZWxmLmg6IFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgotCShlbGZfc3ltYm9sX3R5cGUpOiBNb3ZlZCBoZXJlLCBhZGRlZCBuZXcgZmllbGRzLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IE5ldyBmaWVsZCBgZ2xvYmFsX3N5bSc7IEkgc3VzcGVjdCB0aGlzCi0JbWF5IGJlIG1pc3BsYWNlZC4KLQkqIGVsZjMyLmMgKGVsZl9zeW1ib2xfdHlwZSk6IERlbGV0ZWQgZnJvbSBoZXJlLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IE5ldyBmaWVsZHMgcmF3X3N5bXMgYW5kIGludGVybmFsX3N5bXMsIHRvCi0JcG9pbnQgdG8gYmFja2VuZCB2ZXJzaW9ucyBvZiBzeW1ib2xzLgotCShvYmpfc3ltYm9scywgb2JqX3Jhd19zeW1zLCBvYmpfaW50ZXJuYWxfc3ltcyk6IE5ldyBtYWNyb3MuCi0JKGVsZl9zd2FwX3BoZHJfb3V0LCBlbGZfYnVpbGRfcGhkcnMsIGVsZl93cml0ZV9waGRycyk6IE5ldwotCWZ1bmN0aW9ucy4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFdyaXRlIHByb2dyYW0gaGVhZGVycyBpZiBhcHByb3ByaWF0ZS4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogVW5uYW1lZCBzZWN0aW9ucyBnZXQgZW1wdHkgc3RyaW5nIGZvcgotCW5hbWUsIG5vdCAidW5uYW1lZCIuICBIYW5kbGUgU0hUX05PQklUUyBzZXBhcmF0ZWx5IGZyb20KLQlTSFRfUFJPR0JJVFMsIGFuZCBzZXQgc29tZSBkaWZmZXJlbnQgZmxhZ3MuCi0JKGVsZl9maWxlX3ApOiBOZXcgcm91dGluZS4KLQkoZWxmX29iamVjdF9wLCBlbGZfY29yZV9maWxlX3ApOiBDYWxsIGl0LgotCShlbGZfb2JqZWN0X3ApOiBIYW5kbGUgRU1fSFBQQS4KLQkoZWxmX3N5bWJvbF9mcm9tLCBlbGZfaWR4X29mX3N5bSk6IE5ldyBmdW5jdGlvbnMuCi0JKGVsZl9tYWtlX3NlY3Rpb25zKTogR2V0IHN5bWJvbCBudW1iZXIgcmlnaHQgZm9yIHJlbG9jYXRpb25zLiAgU2V0Ci0JU0hGX0FMTE9DLCBTSEZfV1JJVEUsIFNIRl9FWEVDSU5TVFIgd2hlbiBhcHByb3ByaWF0ZS4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBCU1Mgc2VjdGlvbiBzaG91bGQgYmUgU0hUX05PQklUUywgbm90Ci0JU0hUX1BST0dCSVRTLiAgQWx3YXlzIGdlbmVyYXRlIHN5bXRhYiBhbmQgc3RydGFiLCBub3Qgb25seSBpZgotCXJlbG9jYXRpb25zIGFyZSBuZWVkZWQuICBTZXQgU0hGXyogZmxhZ3MgYXMgYXBwcm9wcmlhdGUuCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBIYW5kbGUgYmZkX2FyY2hfaHBwYS4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEZpeCBvZmYtYnktb25lIGVycm9yIGluIHN5bWJvbCBjb3VudC4KLQlTdG9yZSBhIGNvcnJlY3QgdmFsdWUgZm9yIHRoZSBzeW1ib2w7IHdyaXRlIHRoZSBzaXplIGZpZWxkCi0JcHJvcGVybHk7IG1ha2Ugc29tZSBndWVzc2VzIGFib3V0IHRoZSB0eXBlIGZpZWxkLiAgU2V0IHNlY3Rpb24KLQl0eXBlIGNvcnJlY3RseSBmb3Igc3RyaW5nIHRhYmxlcy4KLQkoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IENoZWNrIGZvciBhYnNvbHV0ZSBhbmQgY29tbW9uIHNlY3Rpb25zCi0JZmlyc3QuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBEaXR0by4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFVzZSBlbGZfc3ltYm9sX3R5cGUgaW5zdGVhZCBvZiBhc3ltYm9sLgotCVVzZSBlbXB0eSBzdHJpbmcgaW5zdGVhZCBvZiAidW5uYW1lZCIgZm9yIG5hbWVsZXNzIHN5bWJvbHMuCi0JSGFuZGxlIFNUVFlfRlVOQyB0eXBlLCBhbmQgd2VpcmRuZXNzIHdpdGggIiRnbG9iYWwkIiBzeW1ib2wgZm9yCi0JSFBQQSAob25seT8pLiAgRG9uJ3QgZnJlZSByYXcgc3ltYm9sczsga2VlcCB0aGUgcG9pbnRlciBhcm91bmQgZm9yCi0JbGF0ZXIuCi0JKGVsZl9zZXRfYXJjaF9tYWNoKTogSGFuZGxlIGJmZF9hcmNoX2hwcGEuCi0JKGVsZl9maW5kX25lYXJlc3RfbGluZSk6IEp1c3QgcmV0dXJuIGZhbHNlLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCBlbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTZXQKLQlvdXRwdXRfaGFzX2JlZ3VuIGZpZWxkIGFmdGVyIGNvbXB1dGluZyBmaWxlIHBvc2l0aW9ucy4KLQkoZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogV3JpdGUgc2VjdGlvbiBjb250ZW50cyBpbW1lZGlhdGVseSwKLQlyYXRoZXIgdGhhbiBjYWNoaW5nIHRoZSB3aG9sZSBmaWxlIGFuZCB3cml0aW5nIGl0IGF0IGNsb3NlIHRpbWUuCi0KLQkqIGxpYmhwcGEuaCAoZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGUsIGVudW0KLQlocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cF9hbHQsIGVudW0gaHBwYV9yZWxvY19leHByX3R5cGUsIGVudW0KLQlocHBhX3JlbG9jX2V4cHJfdHlwZV9hbHQpOiBOZXcgZW51bWVyYXRvciB0eXBlcy4KLQotCSogY29uZmlnL2hwcGEtZWxmLm10LC4gY29uZmlnL2hwcGFvc2YubWg6IEhQIFBBL09TRiBzdXBwb3J0LgotCSogY29uZmlndXJlLmluLCBjb25maWd1cmUuaG9zdDogVXNlIHRoZW0uCi0KLVdlZCBBcHIgMjggMjM6MjE6MDEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGYzMi10YXJnZXQuaDogQWxsb3cgb3ZlcnJpZGVzIG9mIGFybWFwIGRlZmF1bHRzLgotCi0JKiBlbGYzMi1ocHBhLmMsIGVsZjMyLWhwcGEuaDogTmV3IGZpbGVzLgotCi0JKiBjb25maWcvaHAzMDBocHV4Lm10OiBOZXcgZmlsZS4KLQotVHVlIEFwciAyNyAwNTozOTo0MCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogYWl4Mzg2LWNvcmUuYyAoTk9fR0VUUyk6IE5ldyBtYWNybzsgTk9fR0VUIGZvciBzaWduZWQgdmFsdWVzLgotCShhaXgzODZfY29yZV92ZWMpOiBVcGRhdGUgZm9yIG5ldyBmaWVsZHMuCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogQ2FsbCB0YXJnZXQtc3BlY2lmaWMKLQlzbHVycF9hcm1hcCBjb2RlLCBpbnN0ZWFkIG9mIGJmZF9zbHVycF9hcm1hcC4KLQkoYmZkX3NsdXJwX2JzZF9hcm1hcF9mMik6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmJmZC1pbi5oIChiZmRfc2x1cnBfYnNkX2FybWFwX2YyKTogRGVjbGFyZSBpdC4KLQkqIGFvdXQtdGFyZ2V0LmggKEFSX1BBRF9DSEFSKTogRGVmaW5lIGl0IGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKHZlYyk6IFVzZSBpdC4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogTmV3IGZpZWxkIGZvciBzdWJmb3JtYXQsIGZvcgotCWRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIGhpZ2hseSBzaW1pbGFyIGEub3V0IGZvcm1hdHMuCi0JKiBhb3V0eC5oIChOQU1FX3N3YXBfZXhlY19oZWFkZXJfaW4pOiBOZXcgbWFjcm8sIGRlZmF1bHRzIHRvIGxvY2FsCi0JdmVyc2lvbiBvZiBmdW5jdGlvbi4KLQkoc3dhcF9leGVjX2hlYWRlcl9pbik6IERvbid0IGRlZmluZSBpZiBOQU1FX3N3YXBfZXhlY19oZWFkZXJfaW4gaXMKLQlhbHJlYWR5IGRlZmluZWQuCi0JKiBocDMwMGhwdXguYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogSW5jbHVkZSBpdC4KLQotTW9uIEFwciAyNiAxMzoyNDo0MyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGFyY2h1cmVzLmMsIGNvZmZjb2RlLmgsIHRhcmdldHMuYzogU3VwcG9ydCBmb3IKLQlIaXRhY2hpIFNILgotCi1Nb24gQXByIDI2IDEzOjU1OjQyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogQ2hlY2sgdGhlIGZpbGUgc2l6ZS4KLQotTW9uIEFwciAyNiAxMzoyNDo0MyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jOiBSZW1vdmUgZHVwbGljYXRlIGZ1bmN0aW9uIGFuZCBhZGQgd2FybmluZ3MuCi0KLU1vbiBBcHIgMjYgMTE6MjU6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzY28tY29yZS5jIChzY29fY29yZV92ZWMpOiBBZGQgaW5pdGlhbGl6ZXJzIGZvciBuZXcgdGFyZ2V0Ci0JZmllbGRzLgotCi1TYXQgQXByIDI0IDIxOjMzOjQ1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIFtfTElUXTogUmVjb2duaXplIC5saXQgc2VjdGlvbi4KLQotRnJpIEFwciAyMyAxOTowMDozNiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jLCBjcHUtYWxwaGEuYywgY29uZmlnL2FscGhhb3NmLm10LAotCWNvbmZpZy9hbHBoYW9zZi5tdCwgaG9zdHMvYWxwaGFvc2YuaDogIE5ldyBmaWxlcy4KLQotRnJpIEFwciAyMyAxNjo0ODo0NiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBNZXJnZSBpbiBIUFBBL0JTRCBjaGFuZ2VzIGZyb20gVXRhaC4KLQkqIGhwcGEuYzogIFVzZSB0aGlzIGZvciBib3RoIEhQVVggJiBCU0QuCi0JKiB0YXJnZXRzLmM6ICBFbmFibGUgaHBwYV92ZWMgZm9yIGJvdGggSFBVWCAmIEJTRC4KLQkqIGNvbmZpZy9ocHBhYnNkLm10OiAgVERFRklORVMgPT4gVERFRkFVTFRTLgotCSogaG9zdHMvaHBwYWJzZC5oOiAgI2RlZmluZSBIT1NUX0hQUEFCU0QuCi0KLVdlZCBBcHIgMjEgMDE6NTA6MTAgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5jOiAgV2hpdGVzcGFjZSBjaGFuZ2VzIGFyb3VuZCBieXRlc3dhcCBtYWNyb3MuCi0JKiBsaWJiZmQtaW4uaDogIFdoaXRlc3BhY2UgY2hhbmdlcyBhcm91bmQgYnl0ZXN3YXAgZGVjbGFyYXRpb25zLgotCi1UdWUgQXByIDIwIDE1OjU5OjA3IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfY29yZV9maWxlX3ApOiAgRG9uJ3QgZGVmYXVsdCBiZmRfZXJyb3IgdG8KLQlzeXN0ZW1fZXJyb3IgYW55bW9yZS4gIEl0IGNvbmZ1c2VzIGJmZF9jaGVja19mb3JtYXQoKS4KLQotTW9uIEFwciAxOSAyMzowMzowOCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBiZmQuYzogIEFkZCBzZ2lfY29yZV9kYXRhIHRvIHRkYXRhIHVuaW9uLgotCSogY29mZi1taXBzLmM6ICBBZGQgSXJpeCA0LnggY29yZSBmaWxlIHN1cHBvcnQuCi0JKiBob3N0cy9pcml4NC5oOiAgI2RlZmluZSBIT1NUX0lSSVg0LgotCi1Nb24gQXByIDE5IDE4OjUyOjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogQ2hlY2sgdGhhdCB0aGUKLQlzeW1ib2wncyBzZWN0aW9uIGRvZXMgZ2V0IHNldC4KLQkoc2x1cnBfc3ltYm9sX3RhYmxlKTogWmVybyBpbmRleCBtZWFucyBudWxsLXN0cmluZyBuYW1lLgotCi0JKiBhb3V0eC5oIChzdHJ1Y3Qgc3RyaW5ndGFiX2VudHJ5LCBzdHJ1Y3Qgc3RyaW5ndGFiX2RhdGEpOiBOZXcKLQlkYXRhIHN0cnVjdHVyZXMuCi0JKGhhc2gsIHN0cmluZ3RhYl9pbml0LCBhZGRfdG9fc3RyaW5ndGFiLCBlbWl0X3N0cnRhYiwgY29tcGFyZSk6Ci0JTmV3IGZ1bmN0aW9ucy4KLQkod3JpdGVfc3ltcyk6IFVzZSB0aGVtLCB0byByZWR1Y2Ugc3RyaW5nIHRhYmxlIHNpemUuCi0KLU1vbiBBcHIgMTkgMTY6NDU6MTIgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX2NvcmVfdmVjKTogIEFkZCA2IG5ldyBpbml0aWFsaXplcnMgdG8gbWF0Y2gKLQkgIG5ldyBzaWduZWQgZ2V0L3B1dCBmaWVsZHMuICBNaW5vciByZWZvcm1hdHRpbmcgdG8gbGFiZWwKLQkgIHNvbWUgZmllbGRzLgotCi1Nb24gQXByIDE5IDA2OjA5OjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogSW5zZXJ0IGNvbW1lbnQgYWJvdXQgU1ZSMyBjb21waWxlciB3YXJuaW5ncy4KLQotCSogaG9zdHMve2hwMzAwLGkzODZpc2MsaTM4NnZ9Lmg6IFJlbW92ZSB1bnVzZWQgI2RlZmluZXMgb2Yge3IsfWluZGV4Ci0JKGJmZCB1c2VzIHN0cmNociBhbmQgdGhlIGJyb2tlbiBTVlIzLjIgY3BwIGxvc2VzIHdpdGggdGhlIGRlZmluZXMpLgotCi0JKiBsaWJiZmQuYzogYmZkX3B1dCo6IFJlbW92ZSBjYXN0cyB0byBiZmRfdm1hLgotCi1GcmkgQXByIDE2IDE3OjQ5OjI3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoaW50ZXJuYWxfc3Vub3NfY29yZSk6IE1ha2UgY19zdGFja3RvcCBhIGJmZF92bWEuCi0JKHN3YXBjb3JlX3NwYXJjKTogTWFrZSBzcCBhIGJmZF92bWEuCi0KLVRodSBBcHIgMTUgMDk6MDk6MTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5jOiBBZGQgc2lnbmVkIHZlcnNpb25zIG9mIGJmZF97aF8sfXtnZXQscHV0fV9zaWduZWRfPHNpemU+LgotCWxpYmJmZC5jLCBsaWJiZmQtaW4uaDogQWRkIF9kbypzaWduZWQqLgotCXRhcmdldHMuYywgYWxsIHRhcmdldHM6IEFkZCBiZmQqc2lnbmVkKi4KLQliZmQtaW4uaDogQWRkIGJmZF9zaWduZWRfdm1hLiAgQWRkIGNvbW1lbnRzLgotCi0JKiBiZmQtaW4uaCAoYmZkX2Vycm9yKSwgYmZkLmMgKGJmZF9lcnJtc2dzKTogQWRkIGZpbGVfdHJ1bmNhdGVkLgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Vycm9yKTogQ2hlY2sgZXJyb3IgcmV0dXJuIGZyb20KLQlfYmZkX2NoZWNrX2Zvcm1hdCByb3V0aW5lcy4KLQotV2VkIEFwciAxNCAyMzo0ODoyNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiBJbXByb3ZlIGVycm9yIGNoZWNraW5nIGFuZAotCXJlY29nbml6ZSAuZGF0YSBzZWN0aW9uIGlmIHByZXNlbnQuCi0KLVRodSBBcHIgMTUgMDE6MDA6MjkgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfKl9hZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpOiAgQXZvaWQgYHNhbml0eScKLQljaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHVzZXIgc2V0cyB0aGUgYWRkcmVzcyBvZiB0aGUgQlNTCi0Jc2VjdGlvbiAoYW5kIHRoZSBmaWxlIGhlYWRlciBjYW4ndCBzcGVjaWZ5IHRoaXMpLiAgTGV0IHRoZSB1c2VyCi0Jc2V0IGl0IHdoZXJldmVyIHRoZXkgd2FudCwgcmVnYXJkbGVzcyBvZiB3aGF0IGdvZXMgaW4gdGhlIGhlYWRlci4KLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX3NlY3Rpb25zKTogIFBhc3MgYWxsIGllZWUgc2VjdGlvbiBuYW1lcwotCXN0cmFpZ2h0IHRocm91Z2ggaW50byBCRkQgc2VjdGlvbnMuICBBZGQgY29tbWVudHMuCi0KLVdlZCBBcHIgMTQgMjA6MzQ6NTQgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQlDbGVhbnVwIGluIHByZXBhcmF0aW9uIGZvciBiZXR0ZXIgNjQtYml0IGhvc3Qgc3VwcG9ydC4KLQotCSogYmZkLWluLmggKGJmZF82NF90eXBlKTogIFJlbW92ZS4KLQkqIGxpYmJmZC5jIChfZG9fZ2V0YjY0LCBfZG9fcHV0YjY0KTogIFVzZSBiZmRfdm1hLCBub3QgYmZkXzY0X3R5cGUuCi0KLQkqIGJmZC1pbi5oIChiZmRfc2l6ZSk6ICBSZW1vdmUuCi0KLQkqIGJmZC1pbi5oIChiZmRfb2Zmc2V0KTogIFJlbW92ZSwgYWZ0ZXIgZml4aW5nIGxkL2xkbGFuZy5bY2hdLgotCi0JKiBiZmQtaW4uaCAoYmZkX3dvcmQpOiAgUmVtb3ZlLgotCSogcmVsb2MuYyAocmVsb2NfaG93dG9fdHlwZSk6ICBSZXBsYWNlIGJmZF93b3JkIHdpdGggYmZkX3ZtYS4KLQotCSogYmZkLWluLmggKHJhd2RhdGFfb2Zmc2V0KTogIFJlbW92ZS4KLQkqIHJlbG9jLmMgKGFyZWxlbnQpOiAgUmVwbGFjZSByYXdkYXRhX29mZnNldCB3aXRoIGJmZF9zaXplX3R5cGUuCi0JKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiAgTGludC4KLQkoZW51bSBiZmRfcmVsb2Nfc3RhdHVzKTogIENvbW1lbnQgY2xlYW51cC4KLQotCSogYW91dC1hZG9iZS5jLCBjcHUtaDgzMDAuYywgbWlwc2JzZC5jLCBzcmVjLmM6IGxpbnQgLVdhbGwuCi0KLVR1ZSBBcHIgMTMgMTE6MTk6NTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzd2FwY29yZV9zcGFyYyk6IEd1ZXNzIHRoZSByaWdodCB2YWx1ZSBvZiBVU1JTVEFDSy4KLQotTW9uIEFwciAxMiAxNDoxODowMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogZWxmMzIuYzogIENsZWFuIHVwIG9sZCBjb21tZW50cy4KLQotRnJpIEFwciAgOSAxMDo0MzoyMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9zdW4zLmg6IFN0cmluZyBhcmd1bWVudCB0byBmcHJpbnRmIGlzIGNvbnN0LgotCi0JKiBjb2ZmLW1pcHMuYzogUmVuYW1lZCBQQUdFX1NJWkUgdG8gUk9VTkRfU0laRSwgdG8gYXZvaWQgY29uZnVzaW9uCi0Jb24gc3lzdGVtcyB3aGljaCBkZWZpbmUgUEFHRV9TSVpFIGluIDxsaW1pdHMuaD4uCi0KLVRodSBBcHIgIDggMTA6Mjg6MDAgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCk6IFVzZSBuZXcgbWFjcm8KLQlUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMIHRvIGFsbG93IGhvc3QgZmlsZXMgdG8gc3BlY2lmeQotCXRoZSBjb3JlIGZpbGUgZmFpbGluZyBzaWduYWwuCi0JKiBob3N0cy9kZWNzdGF0aW9uLmggKFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwpOiBEZWZpbmUKLQl0byBzdXBwbHkgdGhlIGNvcmUgZmlsZSBmYWlsaW5nIHNpZ25hbC4KLQotVGh1IEFwciAgOCAwOToxNzozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogT25seSBzZXQgU0VDX1NIQVJFRF9MSUJSQVJZIGZvcgotCWEgU1RZUF9OT0xPQUQgfCBTVFlQX0JTUyBzZWN0aW9uIGlmIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLQlpcyBkZWZpbmVkLiAgT24gbWFueSBDT0ZGIHRhcmdldHMgU1RZUF9CU1MgaXMgYWx3YXlzIFNUWVBfTk9MT0FELgotCSogY29mZi1pMzg2LmggKEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkpOiBEZWZpbmUuCi0KLVdlZCBBcHIgIDcgMTE6MzM6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoUEFHRVNJWkUpOiBDb3JyZWN0IHZhbHVlLgotCi1UdWUgQXByICA2IDEyOjA1OjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogQWRkcmVzcyBvZiBmaXJzdCBQRFIgaXMKLQlhbiBvZmZzZXQgKHBhdGNoIGZyb20gSmVhbi1EYW5pZWwgRmVrZXRlIDxqZGZAbHJpLmxyaS5mcj4pLgotCi1Nb24gQXByICA1IDEyOjA3OjEyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBTZXQgU0VDX1NIQVJFRF9MSUJSQVJZIGZvciBhCi0JU1RZUF9OT0xPQUQgfCBTVFlQX0JTUyBzZWN0aW9uLiAgRG9uJ3Qgc2V0IFNFQ19ORVZFUl9MT0FEIGZvciBhCi0JU1RZUF9JTkZPIHNlY3Rpb24uCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRm9yY2Ugdm1hIGFuZCBsbWEgb2YgX0xJQgotCXNlY3Rpb24gdG8gYmUgemVyby4KLQkoY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IENvdW50IG51bWJlciBvZiBlbnRyaWVzIGluIG5ldyBsbWEKLQlmaWVsZCwgbm90IGluIHZtYS4KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogRm9yY2UgbGluZW5vX2NvdW50IG9mCi0JU0VDX1NIQVJFRF9MSUJSQVJZIHNlY3Rpb24gdG8gYmUgemVybywgc2luY2UgaXQgaXMgbm9uLXplcm8gb24gdGhlCi0JU0NPIDMuMnY0IHNoYXJlZCBsaWJyYXJ5LgotCSogc2VjbGV0LmMgKHJlbCk6IENvcHkgb3ZlciBhbnkgc2VjdGlvbiB3aXRoIGNvbnRlbnRzLCBub3QganVzdAotCWxvYWRhYmxlIHNlY3Rpb25zLgotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfbWFrZV9lbXB0eV9zeW1ib2wpOiBaZXJvIG91dCBuZXdseSBhbGxvY2F0ZWQKLQlzeW1ib2wuCi0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2MpOiBOZXcgZnVuY3Rpb24sIHRvIGdlbmVyYXRlCi0JcmVsb2NhdGVhYmxlIG91dHB1dCBjb3JyZWN0bHkuCi0JKGhvd3RvX3RhYmxlKTogVXNlIGNvZmZfaTM4Nl9yZWxvYyBmb3IgYWxsIHJlbG9jIHR5cGVzLgotCShDQUxDX0FEREVORCk6IFVzZSBhIG1vcmUgZWZmaWNpZW50IGhhY2sgdG8gZ2V0IHRoZSBjb3JyZWN0IGFkZGVuZAotCWZvciBhIGNvbW1vbiBzeW1ib2wuCi0JKGkzODZjb21tX3ZhbHVlKTogUmVtb3ZlZDsgbm8gbG9uZ2VyIG5lZWRlZC4KLQotU3VuIEFwciAgNCAxNTowODo0OCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0IHdyaXRlIG91dAotCXNlY3Rpb25zIHdpdGhvdXQgYSBmaWxlcG9zLgotCi1GcmkgQXByICAyIDE0OjM1OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc2VjbGV0LmMgKHNlY2xldF9kdW1wX3NlY2xldCk6IENvcnJlY3QgU0VDX0hBU19DT05URU5UUyB0ZXN0LgotCi1XZWQgTWFyIDMxIDE3OjQxOjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKTogQWRkZWQgQkZEX1JFTE9DX01JUFNfR1BSRUwuCi0JKiBsaWJlY29mZi5oIChlY29mZl9kYXRhX3R5cGUpOiBBZGRlZCBncF9zaXplIGZpZWxkLgotCSogY29mZi1taXBzLmMgKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBJbml0aWFsaXplIGdwX3NpemUgdG8gOC4KLQkoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogQ29tcGFyZSBhZ2FpbnN0IGdwX3NpemUsIG5vdCBoYXJkY29kZWQgOC4KLQlTZXQgZmxhZ3MgdG8gMCBmb3IgbGFyZ2UgY29tbW9uIHN5bWJvbHMuCi0JKGVjb2ZmX2dwcmVsX3JlbG9jKTogSGFuZGxlIG5vbi16ZXJvIGFkZGVuZCBmb3IgZXh0ZXJuYWwgc3ltYm9scywKLQl3aGljaCBjYW4gb2NjdXIgZm9yIGdhcy1nZW5lcmF0ZWQgcmVsb2NzLgotCShlY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBBZGRlZCBCRkRfUkVMT0NfTUlQU19HUFJFTCBjYXNlLgotCSogYmZkLmMgKGJmZF9nZXRfZ3Bfc2l6ZSwgYmZkX3NldF9ncF9zaXplKTogTmV3IGZ1bmN0aW9ucy4KLQkqIE1ha2VmaWxlLmluIChiZmQubyk6IE5vdyBkZXBlbmRzIG9uIGNvZmYvc3ltLmggYW5kIGxpYmVjb2ZmLmguCi0KLVR1ZSBNYXIgMzAgMDk6MzM6MTYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNyZWMuYyAoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IFVzZSBsbWEgZmllbGQgZm9yIGxvYWQKLQlhZGRyZXNzLgotCSogc2VjdGlvbi5jOiBBZGQgZGVjbGFyYXRpb24gb2YgbG1hIGZpZWxkIHRvIHNlY3Rpb24gc3RydWN0dXJlLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgbG1hIGZpZWxkIGZvciBsb2FkCi0JYWRkcmVzcy4KLQkqIGJmZC1pbi5oIChiZmRfc2V0X3NlY3Rpb25fdm1hKTogU2V0IGxtYSBhbG9uZyB3aXRoIHZtYS4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IE5vdyBoYW5kbGVzIGluZGlyZWN0Ci0Jc3ltYm9scyBpbiBhIGJldHRlciB3YXkuICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFnKTogU2V0IHRoZQotCU5fSU5EUiBiaXQgd2hlbiBuZWNlc3NhcnkuIChhb3V0PD5zbHVycF9zeW1ib2xfdGFibGUpOiBNYWludGFpbgotCWluZGlyZWN0IHN0YXRlLgotCSogc2VjdGlvbi5jOiBBZGRlZCBCRkRfSU5EX1NFQ1RJT05fTkFNRSBhbmQgYmZkX2luZF9zZWN0aW9uLgotCShiZmRfbWFrZV9zZWN0aW9uKTogQ29wZSB3aXRoIG5ldyBidWlsdGluIHNlY3Rpb24uCi0JKiBzeW1zLmMgKGJmZF9kZWNvZGVfc3ltY2xhc3MpOiBDYW4gbm93IHByaW50IGluZGlyZWN0IHNlY3Rpb24KLQlpbmZvLgotCi1XZWQgTWFyIDI0IDEzOjM2OjMzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCAoTVkob2JqZWN0X3ApKTogIEZhaWwgaWYgTUFDSFRZUEVfT0sgaXMKLQlkZWZpbmVkLCBhbmQgeWllbGRzIGZhbHNlLgotCSogYW91dC1taXBzYnNkLmMsIGkzODZic2QuYzogIERlZmluZSBNQUNIVFlQRV9PSyBhcHByb3ByaWF0ZWx5LgotCi0JKiBhcmNoaXZlLmMgKHNuYXJmX2FyX2hkcik6ICBBZGQgc3VwcG9ydCBmb3IgcmVhZGluZyAob25seSwKLQlzbyBmYXIpIEJTRC00LjQtc3R5bGUgZXh0ZW5kZWQgaGVhZGVycy4KLQkqIGFyY2hpdmUuYzogIFNvbWUgbW9yZSBjb21tZW50cy4KLQotV2VkIE1hciAyNCAwMjowNToxMCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGZpeCBydWxlIGZvciBkdmkgYW5kIGluZm8sIHNvIHRoYXQgdGhlIHJlY3Vyc2l2ZQotCW1ha2VzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLCBpbnN0ZWFkIG9mIGFsd2F5cyBpbmZvCi0KLVdlZCBNYXIgMjQgMDI6NTY6NDQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYyAoYmZkX3NlZWspOiBEaXNhYmxlIG9wdGltaXplZCBoYW5kbGluZyBmb3IgYXJjaGl2ZXMgYW5kCi0JYXJjaGl2ZSBtZW1iZXJzOyB0aGV5IG5lZWQgbW9yZSBzcGVjaWFsIHJlYXRtZW50LiAgRm9yIG5vdywgdmVyaWZ5Ci0JdGhhdCBjb21wdXRlZCBhbmQgYWN0dWFsIGZpbGUgcG9zaXRpb25zIGNvcnJlc3BvbmQuCi0KLVR1ZSBNYXIgMjMgMDg6NDU6MzMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBtaXBzYnNkLmM6IFJlbmFtZWQgZnJvbSBhb3V0LW1pcHNic2QuYy4KLQkoc2V0X2FyY2hfbWFjaCk6IERlbGV0ZSBub24tTUlQUyBjb2RlLgotCShyZWxvY19ob3d0b190eXBlX2xvb2t1cCk6IERpdHRvLgotCSogTWFrZWZpbGUuaW46IEFkanVzdGVkLgotCi0JKiBsaWJiZmQuYyAoYmZkX3RlbGwpOiBVcGRhdGUgYHdoZXJlJyBmaWVsZC4KLQkoYmZkX3NlZWspOiBEb24ndCBkbyBhbnl0aGluZyBpZiB3ZSdyZSBub3QgY2hhbmdpbmcgdGhlIGZpbGUKLQlwb3NpdGlvbi4gIElmIEZJTEVfT0ZGU0VUX0lTX0NIQVJfSU5ERVggaXMgZGVmaW5lZCwgY2hlY2sgYHdoZXJlJwotCWZpZWxkIGFnYWluc3QgYSBTRUVLX1NFVCByZXF1ZXN0LiAgQ2FsbCBiZmRfdGVsbCB0byByZS11cGRhdGUKLQlgd2hlcmUnIGZpZWxkIHdoZW4gZG9uZS4KLQkoYmZkX3JlYWQsIGJmZF93cml0ZSkgW0ZJTEVfT0ZGU0VUX0lTX0NIQVJfSU5ERVhdOiBNYWludGFpbgotCWB3aGVyZScgZmllbGQuCi0JKiBob3N0cy9zcGFyYy5oOiBEZWZpbmUgRklMRV9PRkZTRVRfSVNfQ0hBUl9JTkRFWC4KLQotTW9uIE1hciAyMiAyMzoxODoxMCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBpbnN0YWxsY2hlY2sgdGFyZ2V0Ci0KLU1vbiBNYXIgMjIgMTQ6NTc6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogUmVsb2NhdGUgZW5jYXBzdWxhdGVkIHN0YWJzCi0JaWYgdGhlIHR5cGUgaXMgbm90IHN0TmlsLgotCi1UdWUgTWFyIDE2IDEwOjM1OjI3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBlbGYzMi5jIChlbGZfbGl0dGxlX3ZlYywgZWxmX2JpZ192ZWMpOiBEZWxldGUgbm93LWludmFsaWQKLQlmb3J3YXJkIGRlY2xhcmF0aW9ucy4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogRG9uJ3QgdXNlIENPTlNUIGhlcmUsCi0JaXQncyBpbXBsaWVkIGJ5IHRoZSB0eXBlLgotCi1GcmkgTWFyIDEyIDE4OjU4OjA4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3Q6IHJlY29nbml6ZSBzcGFyYy1zdW4tc29sYXJpczIqIGluc3RlYWQgb2Ygc3BhcmMtc3VuLXNvbGFyaXMqCi0KLVR1ZSBNYXIgIDkgMDk6MjM6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIHJzNjAwMC1jb3JlLmM6IEFkZCAubGRpbmZvIHNlY3Rpb24uCi0KLUZyaSBNYXIgMTIgMTE6NTc6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUFLRU9WRVJSSURFUyk6IERlZmluZSB0byBiZSBlbXB0eS4KLQotRnJpIE1hciAxMiAwODozMjoxMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChiZmRfc2V0X3NlY3Rpb25fY29udGVudHMpOiB3aGl0ZXNwYWNlCi0JKiBzZWNsZXQuYyAoc2VjbGV0X2R1bXBfc2VjbGV0KTogRG9uJ3QgdHJ5IGFuZCBmaWxsIHNlY3Rpb25zIHdpdGgKLQlubyBjb250ZW50cy4KLQotVGh1IE1hciAxMSAxOToyNjoxNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2dvMzIuaDogZG9uJ3QgZGVmaW5lIFBPU0lYX1VUSU1FCi0KLVR1ZSBNYXIgIDkgMTA6NTI6MDEgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLmMgKGVsZl9vYmplY3RfcCk6ICBVc2UgRUxGX0FSQ0ggc3RvcmVkIGluIHh2ZWMgdG8gbWF0Y2gKLQlhZ2FpbnN0IG1hY2hpbmUgYXJjaGl0ZWN0dXJlIHN0b3JlZCBpbiB0aGUgRUxGIGhlYWRlciwgdG8gcmVzb2x2ZQotCWFtYmlndWl0aWVzLgotCSogZWxmMzIuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIEJmZF9tYWtlX3NlY3Rpb24gY2FuIHJldHVybgotCU5VTEwsIHNvIG9ubHkgdXNlIHJlc3VsdHMgd2hlbiBub24tTlVMTC4KLQkqIHRhcmdldHMuYyAoZWxmMzJfbTY4a192ZWMsIGVsZjMyX2k4NjBfdmVjKTogIEFkZCBleHRlcm4gZGVjbHMKLQlhbmQgYWRkIHRvIHZlY3RvciBvZiB0YXJnZXRzLgotCi1Nb24gTWFyICA4IDE1OjEzOjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IEVuY2Fwc3VsYXRlZCBTVEFCUyBzeW1ib2xzCi0JYXJlIGFsd2F5cyBqdXN0IGRlYnVnZ2luZyBzeW1ib2xzLgotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfW2dzXWV0X3N5bV9pbmRleCk6IE1vdmVkIG1hY3JvcyBmcm9tIGhlcmUuLi4KLQlsaWJlY29mZi5oIChlY29mZl9bZ3NdZXRfc3ltX2luZGV4KTogLi4udG8gaGVyZS4KLQotTW9uIE1hciAgOCAxNDo1NToxMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuYyAoX1BBX1JJU0NfSUQpOiBEZWZpbmVkIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQgKGUuZy4sIGZvcgotCWhwdXggNykuICBQYXRjaCBmcm9tIGZyaWVkbWFuQGdudS5haS5taXQuZWR1LgotCShocHBhX29iamVjdF9wKTogT25seSBjaGVjayBmb3IgRExfTUFHSUMgYW5kIFNITF9NQUdJQyBpZiB0aGV5J3JlCi0JZGVmaW5lZCwgd2hpY2ggdGhleSBhcmVuJ3QgaW4gaHB1eCA3LjAuCi0KLQkqIGFpeDM4Ni1jb3JlLmM6IEluY2x1ZGUgdWluZm8uaCBhbmQgY29yZWR1bXAuaC4gIFBhdGNoIGZyb20gTWluaAotCVRyYW4tTGUsIHRyYW5sZUBpbnRlbGxpY29ycC5jb20uCi0KLUZyaSBNYXIgIDUgMTQ6NTQ6MjEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfZ2VuZXJpY19yZWxvYyk6IElmIHRoZSBhZGRlbmQgaXMgbm9uLXplcm8sIGdvCi0JYWhlYWQgYW5kIGRvIHRoZSByZWxvY2F0aW9uLgotCShlY29mZl9yZWZoaV9yZWxvYyk6IERvbid0IHRvIHRoZSByZWxvY2F0aW9uIGhlcmUsIGp1c3QgcmVtZW1iZXIKLQl3aGF0IG5lZWRzIHRvIGJlIGRvbmUuCi0JKGVjb2ZmX3JlZmxvX3JlbG9jKTogRG8gdGhlIFJFRkhJIHJlbG9jYXRpb24gaGVyZS4KLQotVGh1IE1hciAgNCAxNDo0NDowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEFkZGVkIEJGRF9BU1NFUlQgY2FsbHMgdG8gZW5zdXJlCi0JcmVsb2NzIGFyZSByZWFzb25hYmxlLgotCSogY29mZi1tc3ltLmM6IEVsaW1pbmF0ZWQgdXNlcyBvZiBERUZVTi4KLQkoZWNvZmZfc3dhcF90aXJfb3V0KTogTmV3IGZ1bmN0aW9uLgotCi1UdWUgTWFyICAyIDE3OjUyOjU4IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKFVsdHJpeCAyLjIgc3VwcG9ydCBmcm9tIE1pY2hhZWwgUmVuZGVsbCA8bWljaGFlbEBtZXJjdXJ5LmNzLm11bi5jYT4pCi0JKiBjb25maWd1cmUuaG9zdCAodmF4LSotdWx0cml4MiopOiAgQWRkIHRyaXBsZXQuCi0JKiBob3N0cy92YXh1bHQyLmg6ICBOZXcgZmlsZS4KLQkqIGNvbmZpZy92YXh1bHQyLm1oOiAgTmV3IGZpbGUuCi0KLQkqIGFvdXR4LmggKHN0cmluZy5oKTogIEluY2x1ZGUgZm9yIHN0cmNociBhbmQgZnJpZW5kcy4KLQkqIGFyY2hpdmUuYyAoc3RyaW5nLmgpOiAgSW5jbHVkZSBmb3IgbWVtY2hyIGFuZCBmcmllbmRzLgotCSogZWxmMzIuYyAoc3RyaW5nLmgpOiAgSW5jbHVkZSBmb3Igc3RycmNociBhbmQgZnJpZW5kcy4KLQotU2F0IEZlYiAyNyAwMDo0NDoyNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5jIChzdW5vczRfcmVsb2NfdHlwZV9sb29rdXApOiBVbnVzZWQ7IGRlbGV0ZWQuCi0JKE1ZX3NldF9zaXplcyk6IFVzZSBzdW5vczRfc2V0X3NpemVzLgotCi0JKiBlbGYzMi5jOiBSZW5hbWVkIGZyb20gZWxmLmMuICBTZXZlcmFsIENQVS1zcGVjaWZpYyBmdW5jdGlvbnMKLQlkZWxldGVkLCBhcyB3ZWxsIGFzIGVsZi1iaWcgYW5kIGVsZi1saXR0bGUgdGFyZ2V0cy4KLQkqIGxpYmVsZi5oOiBOZXcgZmlsZS4KLQkqIGVsZjMyLXNwYXJjLmMsIGVsZjMyLWkzODYuYywgZWxmMzItaTg2MC5jLCBlbGYzMi1tNjhrLmM6IE5ldwotCWZpbGVzLCBuZXcgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluLCBjb25maWcvKi1lbGYubXQsIHRhcmdldHMuYzogQWRqdXN0ZWQuCi0KLQkqIGkzODZsaW51eC5jIChUQVJHRVROQU1FKTogVXNlIGh5cGhlbnMgaW5zdGVhZCBvZiBwYXJlbnRoZXNlcy4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBEb24ndCBuZWVkCi0JdmFyaWFibGUgIm9sZF9zb2ZhciIgaWYgY29tcGlsaW5nIGZvciBpOTYwLgotCi0JKiByZWxvYy5jIChiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cCk6IEZpcnN0IGFyZ3VtZW50IGlzIG5vdyBhCi0JYmZkIHBvaW50ZXIuCi0JKiBsaWJiZmQuaDogVXBkYXRlZC4KLQotCSogaWVlZS5jIChleHRlbiwgZW52aSk6ICJzdGF0aWMiIGJlbG9uZ3MgZmlyc3QgaW4gZGVjbGFyYXRpb24uCi0KLUZyaSBGZWIgMjYgMTc6Mzc6MzQgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNyZWMuYzogYWRkIHN1cHBvcnQgZm9yIHN5bWJvbHNyZWMsIHNyZWNvcmRzIHdpdGggc3ltYm9scyBpbgotCXRoZW0uCi0KLVRodSBGZWIgMjUgMTE6NDM6MzAgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGNhY29waG9ueS5jeWdudXMuY29tKQotCi0JKiBpZWVlLmM6ICBjYXN0IGFsbCBhcmd1bWVudHMgb2YgaWVlZV93cml0ZV9ieXRlIHRvIGJmZF9ieXRlCi0JdG8gYXZvaWQgbGludCBjb21wbGFpbnRzLgotCi1UaHUgRmViIDI1IDAyOjE1OjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZWN0aW9uICIuc2hzdHJ0YWIiIHNob3VsZCBiZQotCXR5cGUgU0hUX1NUUlRBQi4gIERvbid0IGFsdGVyIGZpbGUgb2Zmc2V0IGZvciBzZWN0aW9uIDAuCi0JKHJlbG9jX3R5cGVfbmFtZXMpOiBOb3cgYW4gYXJyYXkgaW5zdGVhZCBvZiBhIG1hY3JvLiAgU3RpbGwgaW5zaWRlCi0JIiNpZiAwIiwgc2luY2UgaXQncyB1c2VkIG9ubHkgaW4gZGVidWdnaW5nIGNvZGUgYWxzbyBpbiAiI2lmIDAiLgotCShzdHJ1Y3QgZWxmX3JlbG9jX21hcF9lbHQsIHN0cnVjdCBlbGZfcmVsb2NfbWFwKTogTmV3IHR5cGVzLgotCShzb3J0X3JlbG9jX21hcCk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfcmVsb2NfbWFwKTogTmV3IHZhcmlhYmxlLgotCShlbGZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCi1UdWUgRmViIDIzIDEyOjE3OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmggKEpVTVBfVEFCTEUpOiBBZGRlZCBiZmRfcmVsb2NfdHlwZV9sb29rdXAgYW5kCi0JYmZkX21ha2VfZGVidWdfc3ltYm9sOyB0aGV5IHdlcmUgYWxyZWFkeSBpbiB0aGUgdGFyZ2V0IHN0cnVjdHVyZS4KLQkqIEFkanVzdGVkIGFsbCB1c2VzIG9mIEpVTVBfVEFCTEUuCi0JKiBjb2ZmZ2VuLmMsIGxpYmNvZmYtaW4uaCAoY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpOiBSZW5hbWVkCi0JZnJvbSBjb2ZmX21ha2VfZGVidWdfc3ltYm9sLgotCSogbGliY29mZi5oOiBVcGRhdGVkIGFjY29yZGluZ2x5LgotCi0JKiBNaW5vciBjbGVhbnVwcyBwcm92b2tlZCBieSBnY2Mgd2FybmluZ3M6Ci0JKiBhb3V0eC5oIChOQU1FKGFvdXQsIHJlbG9jX3R5cGVfbG9va3VwKSksCi0JY3B1LWg4MzAwLmMgKGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCksCi0JY3B1LXo4ay5jIChsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBBZGRlZCBkZWZhdWx0IGNhc2UgdG8KLQlzd2l0Y2hlcy4KLQkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfYnNkX2FybWFwLCBkb19zbHVycF9jb2ZmX2FybWFwKSwKLQlpZWVlLmMgKGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKSwKLQllbGYuYyAoZWxmX21ha2Vfc2VjdGlvbnMsIGVsZl9mYWtlX3NlY3Rpb25zLAotCWVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsIGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOgotCVJlbW92ZWQgdW51c2VkIHZhcmlhYmxlcy4KLQkqIGFyY2h1cmVzLmM6IFJlbW92ZWQgLyogZnJvbSB3aXRoaW4gY29tbWVudC4KLQkqIGJvdXQuYyAoYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MpOiBJbml0aWFsaXplIHJfZXh0ZXJuLgotCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfZGF0YSk6IEluaXRpYWxpemUgaS4KLQotTW9uIEZlYiAyMiAxODo0MDowNiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxpYmNvZmYuaCAob2JqX3Jhd19zeW1lbnRfY291bik6ICBOZXcgbWFjcm8uCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogIEluaXRpYWxpemUKLQlyYXdfc3ltZW50X2NvdW50LgotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogIE51bWVyb3VzIGxpdHRsZSBmaXhlcy4KLQotTW9uIEZlYiAyMiAxNTowMzowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBzdEJsb2NrIHN5bWJvbHMgYXJlIGFsd2F5cwotCWRlYnVnZ2luZyBzeW1ib2xzLgotCShlY29mZl9nZXRfZGVidWcpOiBPZmZzZXQgdGhlIGZkciBhZHIgYnkgdGhlIGFkciBvZiB0aGUgZmlyc3QgcGRyLAotCWZvciBjb21wYXRpYmlsaXR5IHdpdGggdG9vbHMgZnJvbSBNSVBTLgotCi0JKiBjb25maWcvYmlnbWlwcy5tdDogTmV3IGZpbGU7IGRlZmF1bHQgdmVjdG9yIGlzIGVjb2ZmX2JpZ192ZWMuCi0JKiBjb25maWcvaXJpeDMubXQsIGNvbmZpZy9pcml4NC5tdDogUmVtb3ZlZC4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWVjb2ZmKTogTmV3IHRhcmdldDsgdXNlcyBiaWdtaXBzLm10LgotCShtaXBzLXNnaS0qLCBtaXBzLWJpZy0qKTogVXNlIGJpZ21pcHMgcmF0aGVyIHRoYW4gaXJpeDMuCi0KLVdlZCBGZWIgMTcgMjM6NDA6NDEgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2hwMzAwYnNkLmg6ICBBZGQgZ3Jvc3MgaGFjayB0byBkZXRlcm1pbmUgd2hldGhlciB3ZQotCWFyZSBydW5uaW5nIG9uIEJTRCA0LjMgb3IgQlNEIDQuNCwgYW5kIHVzZSBhcHByb3ByaWF0ZSBpbmNsdWRlCi0JZmlsZXMgKGFuZCBzZXQgb3RoZXIgcGFyYW1ldGVycykgdG8gbWF0Y2guCi0KLVdlZCBGZWIgMTcgMTI6Mjg6MTMgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfbWFrZV9lbXB0eV9zeW1ib2wpOiB3cmFwIFBBUkFNUyBhcm91bmQgYW4KLQkgIGFuc2kgZGVmaW5pdGlvbiB3aGljaCBvdGhlcndpc2UgY29uZnVzZXMgbm9uLWFuc2kgY29tcGlsZXJzLgotCi0JKiBhb3V0LWFkb2JlLmMgKGFvdXRfYWRvYmVfb2JqZWN0X3ApOiBlbGltaW5hdGUgYSB3YXJuaW5nIGZyb20gdmF4Ci0JICB1bHRyaXggY2MgYnkgZm9yd2FyZCBkZWNsYXJpbmcgZ2V0ZW52IGFzIGlzIGRvbmUgaW4KLQkgIGJmZF9maW5kX3RhcmdldC4KLQotVHVlIEZlYiAxNiAxNzo1Njo1OCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl9pbmZvX3RvX2hvd3RvKTogY2FzdCBhbiBlbnVtIGludG8gdW5zaWduZWQgY2hhcgotCSAgYXZvaWRpbmcgYSBmYXRhbCBlcnJvciBpbiB2YXggdWx0cml4IDQuMiBjYy4KLQotVHVlIEZlYiAxNiAwMDo0NDo1NCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmgsIFZFUlNJT046ICBSb2xsIHRvIHZlcnNpb24gMi4xLgotCi1Nb24gRmViIDE1IDIwOjQzOjUxIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBvYXN5cy5jIChvYXN5c193cml0ZV9vYmplY3RfY29udGVudHMpOiAgTGludC4KLQkqIHNyZWMuYzogIFdoaXRlc3BhY2UgY2xlYW51cC4KLQotRnJpIEZlYiAxMiAxNDoyMzowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBQcmludCBjb3JyZWN0IHRhZ25keCB2YWx1ZTsKLQljbGVhbmVkIHVwIG91dHB1dCBmb3JtYXR0aW5nIGEgYml0LgotCi1GcmkgRmViIDEyIDA4OjI4OjU2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6ICpGSVhNRSogdGhlIEg4LzMwMCBpcyBhbHdheXMKLQlyZWxheGFibGUuICBTaG91bGQgYmUgbW92ZWQgc29tZXdoZXJlIGVsc2UuCi0KLVRodSBGZWIgMTEgMTQ6MDk6NDIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBhb3V0LW1pcHNic2QuYzogRWxpbWluYXRlZCB1c2VzIG9mIERFRlVOLgotCShhb3V0X21pcHNfKl92ZWMpOiBBZGRlZCBzZWNsZXRfbGluayBlbGVtZW50LgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0JBQ0tFTkRTLCBDRklMRVMsIGFvdXQtbWlwc2JzZC5vKTogQWRkZWQKLQlzdXBwb3J0IGZvciBhb3V0LW1pcHNic2QgdGFyZ2V0LgotCi0JKiBib3V0LmMgKGdldF92YWx1ZSk6IERvbid0IHRydW5jYXRlIDMyLWJpdCBhZGRlbmQgdG8gMTYgYml0cy4KLQotRnJpIEZlYiAgNSAwODowODo0MyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY3B1LWg4NTAwLmMgKHNjYW5fbWFjaCk6IHJldHVybiBmYWxzZSBpZiBpdCdzIG5vdCBhbiBIOC81MDAKLQotVGh1IEZlYiAgNCAxMjo1Mjo0MCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCUFkZCBzdXBwb3J0IGZvciB0aGUgSDgvNTAwCi0KLQkqIGNvZmYtaDg1MDAuYywgY3B1LWg4NTAwLmMsIGFyY2h1cmVzLmMsIGNvZmZjb2RlLmgsIHRhcmdldHMuYwotCi1UaHUgRmViICA0IDEyOjM1OjAyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGliZWNvZmYuaDogTmV3IGZpbGUuICBEZWZpbmVzIEVDT0ZGIGJhY2tlbmQgZGF0YSBmb3IgZ2RiLgotCSogY29mZi1taXBzLmM6IE5vdyBpbmNsdWRlcyBsaWJlY29mZi5oLgotCShlY29mZl9kYXRhX3R5cGUpOiBNb3ZlZCB0byBsaWJlY29mZi5oLgotCShlY29mZl9zbHVycF9zeW1ib2xpY19pbmZvKTogTWFkZSBnbG9iYWxseSB2aXNpYmxlIHNvIHRoYXQgZ2RiIGNhbgotCWNhbGwgaXQuICBJZiB0aGVyZSBpcyBldmVyIGFub3RoZXIgRUNPRkYgdGFyZ2V0LCB0aGlzIGFuZCB0aGUKLQlzd2FwcGluZyBmdW5jdGlvbnMgc2hvdWxkIGJlIGFjY2Vzc2VkIHZpYSBhbiBFQ09GRiBzcGVjaWZpYyB0YXJnZXQKLQl2ZWN0b3IuCi0JKiBNYWtlZmlsZS5pbiAoY29mZi1taXBzLm8pOiBEZXBlbmRzIG9uIGxpYmVjb2ZmLmguCi0KLVdlZCBGZWIgIDMgMDk6MTQ6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiBSZW1vdmVkIE1JUFMgc3BlY2lmaWMgaW5mb3JtYXRpb24sIHNpbmNlIGNvZmYtbWlwcy5jCi0Jbm8gbG9uZ2VyIGluY2x1ZGVzIHRoaXMgZmlsZS4KLQotCSogY29mZi1tc3ltLmMgKGVjb2ZmX3N3YXBfZmRyX2luLCBlY29mZl9zd2FwX2V4dF9pbik6IFNldCByZXNlcnZlZAotCWJpdHMgdG8gMCB0byBtYWtlIGNvbXBhcmlzb24gdGVzdCB1c2VmdWwuCi0KLQkqIGNvbmZpZy9pcml4My5taCwgY29uZmlnL2lyaXg0Lm1oIChIREVGSU5FUyk6IFNldCB0byAtRyA0IHRvCi0JYXZvaWQgb3ZlcmZsb3dpbmcgR1AgYWNjZXNzaWJsZSBzZWN0aW9ucyBpbiBiaW51dGlscy9vYmpkdW1wLgotCi1UdWUgRmViICAyIDE1OjM2OjU1IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSk6ICBNYWRlIHN5bWJvbAotCXJlYWRpbmcgbW9yZSByb2J1c3Q6ICBGYWlsIGlmIHN0cmluZyBpbmRleCBpcyBvdXQgb2Ygc3RyaW5nCi0JdGFibGUgcmFuZ2UuCi0KLVR1ZSBGZWIgIDIgMTE6NDM6MjUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cywgY2FzZXMgUENSRUwyNCBhbmQKLQlQQ1JFTDEzKTogRG9uJ3QgdGFrZSBkc3RfYWRkcmVzcyBpbnRvIGFjY291bnQ7IHRoZSBpbnB1dCBmaWxlIGhhcwotCWFscmVhZHkgdGFrZW4gY2FyZSBvZiB0aGF0LgotCi1UdWUgRmViICAyIDExOjQxOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmM6IENvbXBsZXRlZCBzdXBwb3J0IGZvciBsaW5rZXIgYW5kIGJpbnV0aWxzLgotCi1Nb24gRmViICAxIDE0OjQ1OjM4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMsIGNhc2UgQUJTMzIpOiBLZWVwCi0Jb3JpZ2luYWwgYWRkZW5kIGZyb20gc2VjdGlvbiBjb250ZW50cy4KLQotVGh1IEphbiAyOCAyMTowMTozNyAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUZpeCBtaW5vciBidWdzIHJlcG9ydGVkIGJ5IENhcmwgR3JlY28sIDxjZ3JlY29AcGFycm90LmNyZWlnaHRvbi5lZHU+OgotCSogaG9zdHMvZGVsdGE4OC5oIChzdHJ0b2wpOiAgRml4IHByb3RvdHlwZS4KLQkqIGNvbmZpZy9tODhrLWNvZmYubXQgKFNFTEVDVF9BUkNISVRFQ1RVUkVTKTogIEZpeCBuYW1lLgotCi1XZWQgSmFuIDI3IDE3OjE2OjUxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6IEdldCByaWQgb2YgIiNpZmRlZiBzcGFyYyIuCi0JKFJFTE9DX1RZUEVfTkFNRVMpOiBOZXZlciB1c2VkIChjdXJyZW50bHkpLCBzbyBkb24ndCBpbmNsdWRlIGl0LgotCShlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBSZW5hbWVkIGZyb20gZWxmX2hvd3RvX3RhYmxlLCBhbmQgYWx3YXlzCi0JdXNlZC4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBVc2UgcnVudGltZSBjb25kaXRpb25hbHMgb24gQ1BVIHR5cGUsIG5vdAotCWNvbXBpbGUgdHlwZSBjb25kaXRpb25hbHMgb24gaG9zdCBDUFUuCi0JKGVsZl9saXR0bGVfdmVjLCBlbGZfYmlnX3ZlYyk6IFVzZSBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cCwKLQlub3QgbnVsbCBwb2ludGVyLgotCShyZWxvY190eXBlLCBSRUxPQ19UWVBFX05BTUVTKTogSW5jbHVkZSBpMzg2IHZhbHVlcy4KLQotVHVlIEphbiAyNiAxMTo0MzoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoU0VDX0lTX0NPTU1PTik6IE5ldyBzZWN0aW9uIGZsYWcsIG5lZWRlZCBmb3IgTUlQUwotCUVDT0ZGIHdoaWNoIGhhcyB0d28gY29tbW9uIHNlY3Rpb25zLgotCShiZmRfY29tX3NlY3Rpb24pOiBTZXQgU0VDX0lTX0NPTU1PTiBmbGFnLgotCSogYmZkLWluLmggKGJmZF9pc19jb21fc2VjdGlvbik6IE5ldyBtYWNybyB0byB0ZXN0IFNFQ19JU19DT01NT04uCi0JKiBhb3V0eC5oLCBhcmNoaXZlLmMsIGJvdXQuYywgY29mZi1hMjlrLmMsIGNvZmYtbTg4ay5jLAotCWNvZmYtbWlwcy5jLCBjb2ZmZ2VuLmMsIGllZWUuYywgb2FzeXMuYywgcmVsb2MuYywgc3ltcy46IFVzZQotCWJmZF9pc19jb21fc2VjdGlvbiBtYWNybyByYXRoZXIgdGhhbiBjaGVja2luZyBmb3IgZXF1YWxpdHkgdG8KLQliZmRfY29tX3NlY3Rpb24uCi0KLU1vbiBKYW4gMjUgMTU6Mjc6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChfYmZkX2NvZmZfbWtvYmplY3RfaG9vayk6IFBhc3MgYW91dGhkciBhcmd1bWVudC4KLQkoY29mZl9ta29iamVjdF9ob29rKTogQWNjZXB0IGFvdXRoZHIgYXJndW1lbnQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IFBhc3MgYW91dGhkciB0byBta29iamVjdF9ob29rLgotCUhhbmRsZSBOVUxMIGFvdXRoZHIgYXJndW1lbnQuCi0JKGNvZmZfb2JqZWN0X3ApOiBJZiB0aGVyZSBpcyBubyBhb3V0aGRyLCBwYXNzIGl0IGFzIE5VTEwgdG8KLQljb2ZmX3JlYWxfb2JqZWN0X3AuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQgZm9yIG1rb2JqZWN0X2hvb2sgY2hhbmdlcy4KLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2FvdXRoZHJfaW4sIGNvZmZfc3dhcF9hb3V0aGRyX2luKTogU3dhcAotCWFkZGl0aW9uYWwgTUlQUyBFQ09GRiBmaWVsZHMuCi0KLVNhdCBKYW4gMjMgMTg6MzY6MjAgUFNUIDE5OTMgIFJhbHBoIENhbXBiZWxsICAocmFscGhjQHB5cmFtaWQuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdDogYWRkZWQgbWlwcy1kZWMtYnNkKgotCSogY29uZmlndXJlLmluOiBhZGRlZCBtaXBzLWRlYy1ic2QqCi0JKiBhb3V0LW1pcHNic2QuYzogbmV3IGZpbGUgZm9yIG1pcHMtZGVjLWJzZCoKLQkqIGFvdXQtdGFyZ2V0Lmg6IGRvbid0IGRlZmluZSAnJyBpZiAnTVlfQkZEX1RBUkdFVCcgaXMgZGVmaW5lZC4KLQkqIGFvdXR4Lmg6IGFkZGVkIG1pcHMgc3VwcG9ydC4KLQkqIGFyY2h1cmVzLmM6IGFkZGVkIG1pcHMgc3VwcG9ydCB0byBiZmRfZGVmYXVsdF9zY2FuKCkuCi0JKiBjcHUtbWlwcy5jOiBhZGRlZCBzdXBwb3J0IGZvciBSNDAwMCAodW50ZXN0ZWQpLgotCSogbGliYW91dC5oOiBhZGRlZCBNSVBTMSAmIE1JUFMyIG1hZ2ljIG51bWJlcnMuCi0JKiByZWxvYy5jOiBmaXggdHlwbydzIGluIGNvbW1lbnRzLiBBZGRlZCBCRkRfUkVMT0MgZW50cmllcyB3aGljaCBJCi0JCWhvcGUgd2lsbCBtYWtlIGl0IGludG8gaW5jbHVkZS9iZmQuaC4KLQkqIHRhcmdldHMuYzogYWRkZWQgYW91dF9taXBzXypfdmVjLgotCi1XZWQgSmFuIDIwIDE3OjE1OjUyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2RlY3N0YXRpb24ubXQ6IFNldCBERUZBVUxUX1ZFQ1RPUiB0byBlY29mZl9saXR0bGVfdmVjLgotCi1UdWUgSmFuIDE5IDA5OjA2OjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmggKGJmZF9hc3ltYm9sX3ZhbHVlKTogQWRkIG5lZWRlZCBwYXJlbnRoZXNlcy4KLQotCSogbGliY29mZi1pbi5oOiBVcGRhdGUgcHJvdG90eXBlIGZvciBjb2ZmX2NvdW50X2xpbmVudW1iZXJzLgotCi1GcmkgSmFuIDE1IDE4OjEzOjE3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1tc3ltLmMgKGVjb2ZmX3N3YXBfaGRyX291dCwgZWNvZmZfc3dhcF9mZHJfb3V0LAotCWVjb2ZmX3N3YXBfcGRyX291dCwgZWNvZmZfc3dhcF9zeW1fb3V0LCBlY29mZl9zd2FwX2V4dF9vdXQsCi0JZWNvZmZfc3dhcF9ybmR4X291dCwgZWNvZmZfc3dhcF9yZmRfb3V0LCBlY29mZl9zd2FwX29wdF9pbiwKLQllY29mZl9zd2FwX29wdF9vdXQsIGVjb2ZmX3N3YXBfZG5yX2luLCBlY29mZl9zd2FwX2Rucl9vdXQpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKiBjb2Zmc3dhcC5oOiBJZiBOT19DT0ZGX1JFTE9DUyBpcyBkZWZpbmVkLCBkb24ndCBkZWZpbmUKLQliZmRfc3dhcF9yZWxvY19pbiBvciBjb2ZmX3N3YXBfcmVsb2Nfb3V0LgotCSogY29mZi1taXBzLmM6IEFkZGVkIGNvZGUgdG8gbGluayBhbmQgd3JpdGUgb3V0IHN5bWJvbGljIGRlYnVnZ2luZwotCWluZm9ybWF0aW9uLCBhbmQgdG8gc3dhcCByZWxvY3MgaW4gYW5kIG91dC4KLQotVGh1IEphbiAxNCAxNTo1MTo1OCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGliY29mZi5oLCBjb2ZmZ2VuLmMgKGNvZmZfY291bnRfbGluZW51bWJlcnMpLCBjb2ZmY29kZS5oCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogY29mZl9jb3VudF9saW5lbnVtYmVycyByZXR1cm5zIHRoZQotCW51bWJlciBvZiBsaW5lIG51bWJlciByZWNvcmRzIGl0IGZvdW5kLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfd3JpdGVfbGluZW51bWJlcnMpOiBvbmx5IHdyaXRlIG91dCBsaW5lIG51bWJlcnMKLQlpbiB0aGUgc2VjdGlvbiB0aGV5IGJlbG9uZyB0by4KLQotTW9uIEphbiAxMSAxODozMjoyMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZGVkIHJlbG9jYXRlYWJsZSBhcmd1bWVudCB0bwotCV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLiAgQWRkZWQgX2JmZF9zZWNsZXRfbGluawotCXRhcmdldCB2ZWN0b3IgZm9yIGxpbmtlciB1c2UuCi0JKiBiZmQuYyAoYmZkX3NlY2xldF9saW5rKTogTmV3IG1hY3JvLgotCSogYmZkLWluLmggKEpVTVBfVEFCTEUpOiBBZGRlZCBfYmZkX3NlY2xldF9saW5rLgotCSogc2VjbGV0LmMgKHJlbCwgc2VjbGV0X2R1bXBfc2VjbGV0KTogQWRkZWQgcmVsb2NhdGVhYmxlIGFyZ3VtZW50Ci0JYW5kIGJvb2xlYW4gcmV0dXJuIHZhbHVlLiAgTWFkZSBzdGF0aWMuCi0JKGJmZF9nZW5lcmljX3NlY2xldF9saW5rKTogUmVuYW1lZCBmcm9tIHNlY2xldF9kdW1wLiAgQWRkZWQKLQlyZWxvY2F0ZWFibGUgYXJndW1lbnQuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBBZGRlZAotCXJlbG9jYXRlYWJsZSBhcmd1bWVudCAoaWYgcmVsb2NhdGVhYmxlLCBzYXZlcyByZWxvY3MpLgotCSogYm91dC5jIChiX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpLAotCXJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBBZGRlZAotCXJlbG9jYXRlYWJsZSBhcmd1bWVudCAoaWYgcmVsb2NhdGVhYmxlLCBqdXN0IGNhbGxzCi0JYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKS4KLQkqIGxpYmNvZmYtaW4uaCAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUpOiBBZGRlZCByZWxvY2F0ZWFibGUKLQlhcmd1bWVudCB0byBwcm90b3R5cGUuCi0JKiBBbGwgdGFyZ2V0czogU2V0IG5ldyBfYmZkX3NlY2xldF9saW5rIHZlY3RvciB0bwotCWJmZF9nZW5lcmljX3NlY2xldF9saW5rLgotCi1TYXQgSmFuICA5IDIxOjI5OjMyIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYzogICNpbmNsdWRlIHNlY2xldC5oLgotCi1TYXQgSmFuICA5IDE5OjQ4OjE0IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGhwcGEuYyAoaHBwYV9vYmplY3Rfc2V0dXApOiAgR2V0IHJpZCBvZiBhbGwga25vd2xlZGdlIG9mIHN0YWJzCi0JZGVidWcgaW5mby4gIFNldHVwIGluZm8gYWJvdXQgbGlua2VyIHN5bWJvbHMgb25seSwgYW5kIHVzZQotCXN0YW5kYXJkIGJmZCBmaWVsZHMgdG8gaG9sZCB0aGUgaW5mby4KLQkqIChocHBhX29iamVjdF9wKTogIFJlbW92ZSB1bm5lZWRlZCBkZWNscy4KLQkqIChocHBhX25ld19zZWN0aW9uX2hvb2spOiAgR2V0IHJpZCBvZiBtb3N0IG9mIHRoaXMuCi0JKiBsaWJocHBhLmggKHN0cnVjdCBocHBhZGF0YSk6ICBSZW1vdmUgdGVuIHBvdW5kcyBvZiB1c2VsZXNzIHVnbHkKLQlmYXQuICBSZW1vdmUgYWxsIGtub3dsZWRnZSBvZiBzdGFicywgcmVtb3ZlIHJlZHVuZGFudCBrbm93bGVkZ2Ugb2YKLQlsaW5rZXIgc3ltYm9scy4KLQkqIFJlbW92ZSBtYWNyb3MgZm9yIGFjY2Vzc2luZyBmaWVsZHMgd2hpY2ggYXJlIG5vdyBnb25lLgotCi1GcmkgSmFuICA4IDE1OjIwOjAwIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IGFsbG93IFNFQ19ORVZFUl9MT0FEIHRvIHR1cm4gb24KLQlTVFlQX05PTE9BRCBiaXQuCi0JKiBjb2ZmLXo4ay5jOiBkZWxldGUgdW51c2VkIHJlbG9jIGZ1bmN0aW9ucwotCi1GcmkgSmFuICA4IDE1OjQ3OjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkZWQgZWNvZmZfdGRhdGEgdG8gdGRhdGEgdW5pb24uCi0JKiB0YXJnZXRzLmMgKGVudW0gdGFyZ2V0X2ZsYXZvdXIpOiBBZGRlZCBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIuCi0JKiBjb2ZmLW1zeW0uYzogVXNlIERFRlVOIGZvciBmdW5jdGlvbiBkZWZpbml0b25zLgotCSogY29mZi1taXBzLmM6IEFkZGVkIGNvZGUgdG8gcmVhZCBhbmQgcHJpbnQgc3ltYm9scywgYW5kIHRvIGZpbmQKLQlsaW5lIG51bWJlcnMuCi0KLQkqIGNvZmZjb2RlLmg6IE1vdmVkIG1hbnkgZ2VuZXJpYyBmdW5jdGlvbnMgaW50byBjb2ZmZ2VuLmMuICBNb3ZlZAotCXN3YXBwaW5nIGZ1bmN0aW9ucyBpbnRvIGNvZmZzd2FwLmggZm9yIEVDT0ZGIHVzZS4gIE1vdmVkCi0JcmVsb2NhdGlvbiBmdW5jdGlvbnMsIG9ubHkgdXNlZCBieSBoODMwMCBhbmQgejhrLCBpbnRvIHJlbG9jMTYuYy4KLQlBZGRlZCBob29rcyBmb3IgY29mZmdlbi5jIGZ1bmN0aW9ucyB0byBiYWNrZW5kIGRhdGEgc3RydWN0dXJlLCBhbmQKLQlhZGRlZCBob29rIGZ1bmN0aW9ucy4gIFN0aWxsIG1vcmUgY291bGQgYmUgZG9uZS4KLQkqIGNvZmZzd2FwLmg6IE5ldyBmaWxlIHRvIGhvbGQgQ09GRiBzd2FwcGluZyByb3V0aW5lcy4KLQkqIGNvZmZnZW4uYzogTmV3IGZpbGUgdG8gaG9sZCBnZW5lcmljIENPRkYgZnVuY3Rpb25zLgotCSogcmVsb2MxNi5jOiBOZXcgZmlsZSB0byBob2xkIGg4MzAwIGFuZCB6OGsgc3BlY2lmaWMgcmVsb2NhdGlvbgotCWZ1bmN0aW9ucy4KLQkqIGxpYmNvZmYtaW4uaDogQWRkZWQgZGVjbGFyYXRpb25zIGZvciBmdW5jdGlvbnMgaW4gY29mZmdlbi5jLgotCSogbGliY29mZi5oOiBSZWJ1aWx0IHRvIGluY29ycG9yYXRlIGNoYW5nZXMuCi0JKiBjb2ZmLWg4MzAwLmM6IEZ1bmN0aW9uIG5hbWUgY2hhbmdlcy4KLQkqIGNvZmYtejhrLmM6IEZ1bmN0aW9uIG5hbWUgY2hhbmdlcy4gIFVzZSBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMKLQlob29rIHJhdGhlciB0aGFuIGRlZmluaW5nIEVYVFJBX0NBU0VTLgotCSogTWFrZWZpbGUuaW46IEJ1aWxkIG5ldyBmaWxlcyBjb2ZmZ2VuIGFuZCByZWxvYzE2LiAgQWRkZWQKLQlkZXBlbmRlbmNpZXMgb2YgY29mZi0qLm8gb24gY29mZnN3YXAuaCBhbmQgc2VjbGV0LmguCi0KLVRodSBKYW4gIDcgMTY6MTY6MjYgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9zZWN0aW9ucyk6ICBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nCi0JYWJvdXQgZGlzY2FyZGluZyBjb25zdC4KLQotV2VkIEphbiAgNiAwMDoxNjo0OSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYywgc2VjbGV0LmMsIGVsZi5jIHVzZSBiZmRfeG1hbGxvYyBpbnN0ZWFkIG9mIG1hbGxvYwotCi1UdWUgSmFuICA1IDA5OjM1OjU3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChwb3N0LXRhcmdldCk6IElmIC0td2l0aC1taW5pbWFsLWJmZCBpcyBzcGVjaWZpZWQsCi0Jc2V0IE1JTklNSVpFPTEuCi0KLU1vbiBKYW4gIDQgMDc6MjA6MDEgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNyZWMuYyAoc3JlY193cml0ZV9yZWNvcmRzKTogb25lIG9mIG15IGJvYXJkcyB3YW50cyBhIENSIGJldHdlZW4KLQlyZWNvcmRzLgotCi1XZWQgRGVjIDMwIDEyOjQ2OjMwIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChkb19zbHVycF9jb2ZmX2FybWFwKTogc2V0IHN5bWRlZl9jb3VudCBjb3JyZWN0bHkKLQkoaXQgYnJva2UgYSBjb3VwbGUgb2Ygd2Vla3MgYWdvKS4KLQotVHVlIERlYyAyOSAyMTo0MTowNSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChiZmRfZWxmX2ZpbmRfc2VjdGlvbik6IFN3aXRjaCBiYWNrIHRvICJzdHJ1Y3QgLi4uIiBmb3IKLQlyZXR1cm4gdHlwZSwgc28gbGliYmZkLmggZG9lc24ndCByZWZlcmVuY2UgdW5kZWZpbmVkIHR5cGVkZWZuYW1lcy4KLQotVHVlIERlYyAyOSAxMzo1NDozNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfcmVhbF9vYmplY3RfcCk6IHVzZSBuYW1lIEkzODZBSVhNQUdJQyByYXRoZXIKLQl0aGFuIEkzODZTVk1BR0lDLgotCShjb2ZmX3BvaW50ZXJpemVfYXV4KTogZG9uJ3QgcG9pbnRlcml6ZSBhIG5lZ2F0aXZlIHRhZ25keAotCShzb21ldGltZXMgZ2VuZXJhdGVkIGJ5IFNDTyAzLjJ2NCBjYykuCi0KLQkqIGJvdXQuYyAoY2FsbGp4X2NhbGxiYWNrLCBjYWxsal9jYWxsYmFjaywKLQliX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiB3YXJuIGlmIHJlbG9jYXRpbmcgYWdhaW5zdAotCWFuIHVuZGVmaW5lZCBzeW1ib2wuCi0KLU1vbiBEZWMgMjggMTQ6MzA6NTUgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jOiAgR2V0IHJpZCBvZiBERUZVTiwgdXNlIG1vcmUgY29udmVudGlvbmFsIHByb2xvZyBzdHVmZi4KLQlNYWtlIGEgYnVuY2ggbW9yZSByb3V0aW5lcyBiZSBzdGF0aWMuCi0JKiBocHBhLmMgKGZpbGxfc3BhY2VzKTogIEdldCByaWQgb2YgdGhpcywgcmVwbGFjZSB3aXRoIG11Y2ggYmV0dGVyCi0Jd3JpdHRlbiBzZXR1cF9zZWN0aW9ucygpLgotCSogKHNldHVwX3NlY3Rpb25zKTogIE5ldyByb3V0aW5lIHRvIGNyZWF0ZSBCRkQgc2VjdGlvbnMgZm9yIGVhY2gKLQlzcGFjZSBhbmQgc3Vic3BhY2UgaW4gU09NIGZpbGVzLgotCSogKGhwcGFfb2JqZWN0X3NldHVwKTogIFVzZSBCRkQgc2VjdGlvbnMgY3JlYXRlZCBieQotCXNldHVwX3NlY3Rpb25zKCkgdG8gbG9jYXRlIEdEQiBzeW1ib2wgdGFibGUgaW5mby4KLQkqIChtYWtlX3VuaXF1ZV9zZWN0aW9uKTogIE5ldyByb3V0aW5lIHRvIGNyZWF0ZSBhIEJGRCBzZWN0aW9uLiAgSXQKLQllbnN1cmVzIHRoYXQgdGhlIGdpdmVuIG5hbWUgaXMgdW5pcXVlLCBhbmQgd2lsbCBnZW5lcmF0ZSBhIHVuaXF1ZQotCW9uZSBpZiBuZWNlc3NhcnkuCi0JKiAoaHBwYV9vYmplY3RfcCk6ICBCZWNvbWUgbXVjaCBtb3JlIHBhcmFub2lkIGFib3V0IGZpbGUgaGVhZGVyLgotCSogKG1ha2VfYmZkX2FzZWN0aW9uKTogIENhbGwgYmZkX21ha2Vfc2VjdGlvbiB0byBkbyB0aGUgZGlydHkKLQl3b3JrLiAgU2ltcGxpZnkgY29kZSBzb21ld2hhdC4KLQkqIChocHBhX2NvcmVfZmlsZV9wKTogIFVzZSBwcm9wZXIgbmFtZSBmb3Igc3RhY2sgc2VjdGlvbi4KLQkqIGxpYmhwcGEuaDogIFJlbW92ZSBtaWxsaWNvZGVfc3RhcnQsIG1pbGxpY29kZV9lbmQgZGVjbHMuCi0KLU1vbiBEZWMgMjggMTE6MDM6MjIgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjb2ZmLXdlMzJrLm8sIGNvZmYtejhrLm8pOiBOb3RlIGRlcGVuZGVuY2llcy4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEZvciBub3JtYWwgMi0gb3IgNC1ieXRlCi0JcmVsb2NzLCBkb24ndCBib3RoZXIgZG9pbmcgdGhlIGFkanVzdG1lbnQgaWYgdGhlIHZhbHVlIHRvIGFkZCBpcwotCXplcm8uCi0KLVN1biBEZWMgMjcgMTc6NDU6MDUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChiZmRfZ2V0X3NpemUpOiAgTmV3IGZ1bmN0aW9uIHRoYXQgZ2V0cyBhbiB1cHBlciBib3VuZAotCW9uIHRoZSBwb3NzaWJsZSBzaXplIG9mIGFueSBvYmplY3QgaW4gYSBiZmQuCi0JKiBlbGYuYyAoYmZkX2VsZl9maW5kX3NlY3Rpb24sIGVsZl9nZXRfc3RyX3NlY3Rpb24sCi0JZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiAgUmV3cml0ZSB0byBhdm9pZCBOVUxMIHBvaW50ZXIKLQlkZXJlZmVyZW5jZXMuCi0JKiBlbGYuYyAoZWxmX2JpZ192ZWMsIGVsZl9saXR0bGVfdmVjKTogIERvY3VtZW50IGxhc3QgdGhyZWUKLQltZW1iZXJzIGluaXRpYWxpemVkIHRvIE5VTEwuCi0KLVRodSBEZWMgMjQgMTc6NDk6MDkgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBocHBhLmM6IGNoYW5nZSBhICdjb25zdCcgdG8gJ0NPTlNUJywgb3IgZWxzZSBIUCBDIGNvbXBpbGVyIGRpZXMKLQotTW9uIERlYyAyMSAxNjozMzozNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6ICBOZXcgZmlsZS4gIEF0dGVtcHQgYXQgYSBnZW5lcmljL2RlZmF1bHQKLQlzZXQgb2YgZGVmaW5pdGlvbnMsIHRvIGRpc2NvdXJhZ2UgcG9ydGluZyB0byBuZXcgaG9zdHMgYnkgY29weWluZy4KLQkqIGhvc3RzL25ld3MuaDogIFJlbW92ZWQuCi0JKiBob3N0cy9zcGFyYy5oOiAgVXNlIHN0ZC1ob3N0LmguCi0JKiBiZmQtaW4uaDogIE5ldyBtYWNyb3MgYmZkX2FzeW1ib2xfYmZkIGFuZCBiZmRfYXN5bWJvbF9mbGF2b3VyOwotCXBlcmhhcHMgd2UgY2FuIGxhdGVyIHJlbW92ZSB0aGUgdGhlX2JmZCBmaWVsZCBmcm9tIGVhY2ggc3ltYm9sLgotCSogc3ltcy5jIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5KTogIFJlbW92ZSB1bnVzZWQgZmllbGQKLQlhcHBfZGF0YS4gIEFkZCBjb21tZW50IG5vdGluZyB0aGF0IHRoZV9iZmQgaXMgYWxtb3N0IHJlZHVuZGFudCwKLQlidXQgbm90IHF1aXRlLgotCSogYW91dHguaCwgY29mZi1hMjlrLmMsIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZmNvZGUuaDoKLQlVc2UgbmV3IG1hY3JvcyBiZmRfYXN5bWJvbF9iZmQgYW5kIGJmZF9hc3ltYm9sX2ZsYXZvdXIuCi0JKiBocHBhLmMgKGZpbGxfc3BhY2VzKTogIE1ha2Ugc2xpZ2h0bHkgbW9yZSByZWJ1c3QuCi0JKiBjb25maWd1cmUuaW46ICBBbGxvdyBzdGQtaG9zdCBhcyB0aGUgImRlZmF1bHQiIGhvc3QuCi0KLU1vbiBEZWMgMjEgMTc6MjQ6MTMgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmM6ICBBZGQgc3RydWN0IGhwcGFfY29yZV9kYXRhIHRvIHRkYXRhIHVuaW9uLgotCSogaHBwYS5jOiAgQ29uZGl0aW9uYWxpemUgb24gSE9TVF9IUFBBSFBVWCBpbnN0ZWFkIG9mIGhwOTAwMHM4MDAuCi0JR2V0IHJpZCBvZiBIUFBBL0JTRCBzcGVjaWZpYyBjb2RlLiAgVGhhdCB3aWxsIGdvIHNvbWV3aGVyZSBlbHNlCi0Jc29tZWRheS4KLQkqIChmaWxsX3NwYWNlcyk6ICBEb24ndCBzcGluIGZvcmV2ZXIgYW5kIGRpZSBpZiB5b3UgZG9uJ3QgZmluZAotCSRNSUxMSUNPREUkIHN1YnNwYWNlLgotCSogKGhwcGFfb2JqZWN0X3ApOiAgTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIHJlYWwgaG9uZXN0LXRvLWN0aHVsdQotCWV4ZWMgZmlsZSEKLQkqIChocHBhX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCwgaHBwYV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKToKLQlNYWtlIHRoZXNlIHdvcmsgZm9yIEhQVVguCi0JKiAobWFrZV9iZmRfYXNlY3Rpb24pOiAgTmV3IHJvdXRpbmUgdG8gbWFrZSBzZWN0aW9uIGNyZWF0aW9uIGEKLQlsaXR0bGUgZWFzaWVyLgotCSogKGhwcGFfY29yZV9maWxlX3ApOiAgQ29tcGxldGVseSByZXdyaXRlLCBsZWF2ZSBvdXQgYnVncy4KLQkqIGxpYmhwcGEuaDogICNpbmNsdWRlIHRoZSByaWdodCBzeXN0ZW0gZmlsZXMuICBSZWRlZmluZSBhbGwgb2YKLQl0aGUgc3RydWN0cy9tYWNyb3MgZm9yIGhhY2tpbmcgY29yZSBmaWxlcyB0byB1c2UgbW9yZSBzZW5zaWJsZQotCUhQVVggY29yZSBmaWxlIHN0cnVjdHVyZXMuCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiAgQ29uZGl0aW9uYWxpemUgaHBwYV92ZWMgb24KLQlIT1NUX0hQUEFIUFVYLCBub3QgaHA5MDAwczgwMC4KLQkqIGhvc3RzL2hwcGFocHV4Lmg6ICAjaW5jbHVkZSBzdGRsaWIuaCB0byBnZXQgY29ycmVjdCBkZWNscyBmb3IKLQltYWxsb2MgYW5kIHJlYWxsb2MuICAjZGVmaW5lIEhPU1RfSFBQQUhQVVguCi0KLU1vbiBEZWMgMjEgMTI6NDA6MTAgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBQYXRjaGVzIGZyb20gTWluaCBUcmFuLWxlIDxtdHJhbmxlQHBhcmlzLmludGVsbGljb3JwLmNvbT4uCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1pc2MqLCBpMzg2LSotYWl4Kik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmhvc3QgKGkzODYtKi1pc2MqLCBpMzg2LSotYWl4Kik6IE5ldyBob3N0cy4KLQkqIGhvc3RzL2kzODZpc2MuaCwgY29uZmlnL2kzODZpc2MubWg6IE5ldyBmaWxlcyBmb3IgSW50ZXJhY3RpdmUKLQlVbml4LgotCSogaG9zdHMvaTM4NmFpeC5oLCBjb25maWcvaTM4NmFpeC5taDogTmV3IGZpbGVzIGZvciBBSVggb24gUFMvMi4KLQkqIGFpeDM4Ni1jb3JlLmM6IE5ldyBmaWxlIGZvciBoYW5kbGluZyBjb3JlIGZpbGVzIG9uIEFJWCBvbiBQUy8yLgotCSogdGFyZ2V0cy5jOiBpZiBBSVgzODZfQ09SRSwgdXNlIGFpeDM4Nl9jb3JlX3ZlYy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfcmVhbF9vYmplY3RfcCk6IGNoZWNrIGZvciBJMzg2U1ZNQUdJQyBhcyB3ZWxsCi0JYXMgSTM4Nk1BR0lDLgotCi1GcmkgRGVjIDE4IDEwOjIwOjI3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IHNldCBmbGFncyB0byAwLCBmaXhpbmcKLQkxOTI3LgotCi1UaHUgRGVjIDE3IDE5OjM1OjMyIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGR2aSB0YXJnZXQKLQotVGh1IERlYyAxNyAwMDozNjoyNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYmZkLmM6ICBVc2UgcmlnaHQgbmFtZSBmb3IgdGVraGV4IHRkYXRhIHN0cnVjdC4KLQkqIHRla2hleC5jOiAgSW5zZXJ0IGxlYWRpbmdfY2hhciAoMCkgaW50byBiZmRfdGFyZ2V0IHN0cnVjdC4gIFN0eWxlLgotCSogbGliY29mZi5oOiAgVXBkYXRlZCB0byBnZXQgc3BhY2luZyBjaGFuZ2UgZnJvbSBjb2ZmY29kZS5oLgotCSogdHJhZC1jb3JlLmM6ICBsZWFkaW5nX2NoYXIgaXMgMCAobm8gc3ltYm9scyEpLCBub3QgJ18nLgotCi1UdWUgRGVjIDE1IDE1OjQwOjMwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2JzZF9hcm1hcCwgZG9fc2x1cnBfY29mZl9hcm1hcCk6ICBOZXcKLQlmdW5jdGlvbnMsIHdpdGggdGhlICJndXRzIiBvZiB0aGUgb2xkIGJmZF9zbHVycF9ic2RfYXJtYXAKLQlhbmQgYmZkX3NsdXJwX2NvZmZfYXJtYXAsIGJ1dCBhc3N1bWluZyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQKLQlpZiB0aGUgYXJtYXAgaXMgcHJlc2VudCBvciBub3QuCi0JQWxzbywgcmV3cml0ZSBhIGJpdCB0byBhdm9pZCBrZWVwaW5nIGFyb3VuZCBvYnN0YWNrIGRhdGEKLQl0aGF0IHdlIGRvbid0IG5lZWQuCi0JKiBhcmNoaXZlLmMgKHNuYXJmX2FyX2hlYWRlciwgX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKToKLQlWYXJpb3VzIGZpeGVzIHRvIGNvcnJlY3RseSBoYW5kbGUgQ09GRl9zdHlsZSBhcmNoaXZlcyBuYW1lcy4KLQkoTm90ZSB0aGF0IGJlY2F1c2UgdGhlc2UgaGF2ZSBhIHRyYWlsaW5nICcvJywgdGhlIG5hbWVzIGNhbgotCWhhdmUgZW1iZWRkZWQgc3BhY2VzLikKLQkqIGFyY2hpdmUuYyAoYmZkX3NsdXJwX2FybWFwKTogIE5ldyBmdW5jdGlvbiwgcmVwbGFjZXMgb2xkCi0JYmZkX3NsdXJwX2JzZF9hcm1hcCBhbmQgYmZkX3NsdXJwX2NvZmZfYXJtYXAuICBSZWNvZ25pemVzCi0JX2VpdGhlcl8gZm9ybWF0LCBhbmQgY2FsbHMgZG9fc2x1cnBfYnNkX2FybWFwIG9yCi0JZG9fc2x1cnBfY29mZl9hcm1hcCBpZiBlaXRoZXIgZm9ybSBvZiBtYXAgaXMgc2Vlbi4KLQkqIGxpYmJmZC1pbi5oOiAgQ2hhbmdlZCBiZmRfc2x1cnBfYnNkX2FybWFwIGFuZAotCWJmZF9zbHVycF9jb2ZmX2FybWFwIGludG8gbWFjcm8gc3lub255bXMgZm9yIGJmZF9zbHVycF9hcm1hcC4KLQkqIGVsZi5jIChlbGZfc2x1cnBfYXJtYXAsIGVsZl93cml0ZV9hcm1hcCk6ICBGaXguCi0JKiBNYWtlZmlsZS5pbiAoQVJfRkxBR1MpOiAgVXNlIHJjIGluc3RlYWQgb2Ygbm9uLXN0YW5kYXJkIHFjLgotCi1Nb24gRGVjIDE0IDE3OjA4OjA4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGhwcGEuYzogICNpbmNsdWRlICJzeXNkZXAuaCIsIG5vdCA8c3lzZGVwLmg+LgotCSogbGliaHBwYS5oOiAgTWFrZSBtaWxsaWNvZGVfc3RhcnQgYW5kIG1pbGxpY29kZV9lbmQgYmUgdW5zaWduZWQKLQlpbnQgdG8gYmUgc2FtZSB0eXBlIGFzIENPUkVfQUREUiBpbiBHREIuICBXaHkgYXJlIHRoZXNlIGhlcmU/Ci0KLVNhdCBEZWMgMTIgMTU6NTQ6MzYgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLWkzODYuYyAoQ0FMQ19BRERFTkQpOiBpZiByZWxvYyBpcyBQQyByZWxhdGl2ZSwgYWRkIHRoZQotCXZhZGRyIG9mIHRoZSBzZWN0aW9uIHRvIHRoZSBhZGRlbmQuCi0JKiB0YXJnZXRzLmM6IGlmIE1JTklNSVpFIGlzIDEsIGFuZCBTQ09fQ09SRSBpcyBkZWZpbmVkLCBhZGQKLQlTQ09fQ09SRSB0byBTRUxFQ1RfVkVDUy4KLQkodGFyZ2V0X3ZlY3Rvcik6IGFkZCBzY29fY29yZV92ZWMuCi0JKiBzY28tY29yZS5jIChzY29fY29yZV92ZWMpOiBhZGQgbGVhZGluZyB1bmRlcnNjb3JlIGluaXRpYWxpemVyLgotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotc2NvKik6IHVzZSB0YXJnZXQgaTM4Ni1zY28uCi0JKiBjb25maWcvaTM4Ni1zY28ubXQ6IG5ldyBmaWxlOyBkZWZpbmUgU0NPX0NPUkUuCi0KLVRodSBEZWMgMTAgMDI6MTM6MTUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGFvdXQtYWRvYmUuYyAoYW91dF9hZG9iZV9vYmplY3RfcCk6ICBGaXggIXN0cmNtcCB0aGlua28uCi0KLUZyaSBEZWMgIDQgMTQ6MDI6NDkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IE5vdyBzdGF0aWMgYW5kIGNvbnN0LgotCi1UaHUgRGVjICAzIDE2OjU0OjU4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4NmxpbnV4Lmg6IEluY2x1ZGUgdW5pc3RkLmguCi0KLQkqIGFvdXR4LmggKHByaW50X3N5bWJvbCk6IGFvdXRfc3RhYl9uYW1lIHJldHVybnMgYSBjb25zdGFudAotCXN0cmluZy4KLQkqIGxpYmFvdXQuaCAoYW91dF9zdGFiX25hbWUpOiBGaXggcHJvdG90eXBlLgotCSogc3RhYi1zeW1zLmMgKGFvdXRfc3RhYl9uYW1lcyk6IEFycmF5IGlzIG5vdyBjb25zdC4KLQkoYW91dF9zdGFiX25hbWUpOiBSZXR1cm4gdmFsdWUgaXMgbm93IHBvaW50ZXIgdG8gY29uc3QuCi0KLQkqIGFvdXR4LmgsIGFyY2hpdmUuYywgYXJjaHVyZXMuYywgY29mZmNvZGUuaCwgY3Rvci5jLCByZWxvYy5jLAotCXN5bXMuYzogRG9jIGZpeGVzLgotCi0JKiBzeW1zLmMgKGFzeW1ib2wpOiBBZGRlZCBuZXcgZmllbGQgImFwcF9kYXRhIiwgZm9yIGRhdGEKLQlwYXJ0aWN1bGFyIHRvIHRoZSBhcHBsaWNhdGlvbi4gIFNvbWUgb2YgdGhlIGxpbmtlciBmbGFncyBvdWdodCB0bwotCWdldCBtb3ZlZCB0byB0aGlzIGZpZWxkIHNvbWVkYXkuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9kZWZhdWx0X3NjYW4pOiBSZWNvZ25pemUgYSBmZXcgbW9yZSBudW1iZXJzOgotCTgwNDg2LCA4MDk2MCwgYW5kIDk2MC4KLQotCSogYmZkLWluLmggKENPRkZfU1dBUF9UQUJMRSk6IE5ldyBpcyBqdXN0IGFkZHJlc3Mgb2YKLQliZmRfY29mZl9zdGRfc3dhcF90YWJsZSwgY2FzdCB0byBQVFIuCi0JKiBiZmQuYyAoYmZkX2NvZmZfc3dhcF8qKTogRGVsZXRlZCBtYWNyb3MuCi0JKiB0YXJnZXRzLmMgKHN0cnVjdCBiZmRfdGFyZ2V0KTogRGVsZXRlZCBDT0ZGLXNwZWNpZmljIHN3YXBwaW5nCi0Jcm91dGluZSBwb2ludGVycy4KLQkqIGNvZmZjb2RlLmggKHR5cGUgYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogTmV3IHN0cnVjdHVyZSB0eXBlLAotCWNvbnRhaW5zIHBvaW50ZXJzIHRvIHRoZSBDT0ZGLXNwZWNpZmljIHN3YXBwaW5nIHJvdXRpbmVzLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IE5ldyBkYXRhIHN0cnVjdHVyZSwgdG8gYmUgdXNlZCB3aGVuCi0JTk9fQ09GRl9TWU1CT0xTIGFuZCBOT19DT0ZGX0xJTkVOT1MgYXJlIG5vdCBkZWZpbmVkLgotCShiZmRfY29mZl9zd2FwXyopOiBOZXcgbWFjcm9zLgotCSogY29mZi1taXBzLmMgKG1pcHNfY29mZl9zd2FwX3RhYmxlKTogTmV3IGRhdGEgc3RydWN0dXJlLgotCShlY29mZl9iaWdfdmVjKTogVXNlIGl0LgotCSogQWxsIENPRkYgdGFyZ2V0czogTW92ZWQgQ09GRl9TV0FQX1RBQkxFIHRvIHRhcmdldC1zcGVjaWZpYyBkYXRhLgotCSogQWxsIG90aGVyIHRhcmdldHM6IERlbGV0ZWQgY29mZi1zcGVjaWZpYyB2ZWN0b3IgZW50cmllcy4KLQotCSogdHJhZC1jb3JlLmM6IEZpeGVkIHNvbWUgYFBBUkFNUycgdXNlcyB0aGF0IHdlcmUgbWlzc2luZwotCXBhcmVudGhlc2VzLgotCi1TdW4gTm92IDI5IDA4OjM3OjEzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiAgUHJvdGVjdCBhcmcgcHJvdG90eXBlIGluCi0JY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCB3aXRoIFBBUkFNUyBtYWNybyBmb3Igbm9uLUFOU0kgY29tcGlsZXJzLgotCi1TYXQgTm92IDI4IDA0OjAxOjIxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oLCBhb3V0ZjEuaCwgdHJhZC1jb3JlLmMsIGNvZmZjb2RlLmgsIGxpYmFvdXQuaCwKLQlsaWJiZmQtaW4uaCwgYmZkLWluLmg6IEVsaW1pbmF0ZSBhbGwgUFJPVE8gY2FsbHMsIHJlcGxhY2Ugd2l0aAotCVBBUkFNUyBmb3IgcmVhZGFiaWxpdHkuCi0KLQkqIGFvdXR4Lmg6ICBBZGQgdHlwZSB0byBjYWxsYmFjayBwYXJhbWV0ZXIuCi0JKiBjb2ZmLW1pcHMuYzogIERvbid0IGNhbGwgdHJhZC1jb3JlLmgsIG5vdCBuZWVkZWQuCi0JKiB0cmFkLWNvcmUuYzogIEluY29ycG9yYXRlIHRyYWQtY29yZS5oIGRlY2xhcmF0aW9ucy4gIEZpeCBjb21tZW50cy4KLQkqIHRyYWQtY29yZS5oOiAgRWxpbWluYXRlLCB1bnVzZWQuCi0KLVdlZCBOb3YgMTggMTM6MTY6MTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0KTogaWYgZGVmYXVsdCB0YXJnZXQgaXNuJ3QgZm91bmQKLQl0aGVuIGxvb2sgdGhyb3VnaCB0aGUgZW50aXJlIGxpc3QgcmF0aGVyIHRoYW4gcmV0dXJuIGVhcmx5LgotCi1Nb24gTm92IDE2IDE0OjMzOjAzIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2k5NjAtY29mZi5tdDogcmVvcmRlciB2ZWMgdG8gbWF0Y2ggYmZkX2NoZWNrX2Zvcm1hdCAoZnJvbSBQZXIpCi0KLVRodSBOb3YgMTIgMTc6MDE6NDEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcGFzcyBkb3duIHByZWZpeCBhbmQgZXhlY19wcmVmaXggaW4gRkxBR1NfVE9fUEFTUwotCi1UaHUgTm92IDEyIDA5OjQ2OjQ3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLXo4ay5jOiBjaGVja3BvaW50LCBtb3JlIGFkZHJlc3NpbmcgbW9kZXMgaGFuZGxlZAotCSogY29mZmNvZGUuaCAoZ2V0X3ZhbHVlKTogZG9uJ3QgdHJ1bmNhdGUgcmVsb2MtPmFkZGVuZCBmaWVsZCwgaXQncwotCWEgbG9uZyBub3cuCi0KLVdlZCBOb3YgMTEgMjM6NTc6NTUgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AY3lnbnVzLmNvbSkKLQotCSogd2UzMmsubXQgKFRERUZBVUxUUyk6IFVzZSB3ZTMya2NvZmZfdmVjLCBub3QgaTM4NmNvZmZfdmVjLgotCi1UdWUgTm92IDEwIDE0OjA0OjM4IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG1pbm9yIHR3ZWFrcyB0byBtYWtlICQoQ0MpIGNvbW1hbmQgbGluZXMgbW9yZSBjb25zaXN0ZW50Ci0KLU1vbiBOb3YgIDkgMjM6NTg6MTcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVuciwgYmZkX2Nsb3NlKTogIEFkZCBkb2MgYWJvdXQgY2FjaGVpbmcKLQlhbmQgYWJvdXQgd2hlbiBmaWxlIGRlc2NyaXB0b3JzIGFyZSBjbG9zZWQuCi0KLVNhdCBOb3YgIDcgMDA6NDI6MjAgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKTogTWFrZSBzdXJlIGFsaWdubWVudCByZWxvY3MgZ2V0Ci0Jd3JpdHRlbiBvdXQgY29ycmVjdGx5LgotCi1UaHUgTm92ICA1IDE1OjM0OjE5IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jOiBOZXcgc2VjdGlvbiBiaXQgU0VDX1NIQVJFRF9MSUJSQVJZLgotCWNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogaWYgU1RZUF9OT0xPQUQgJiYgKFNUWVBfVEVYVCB8fAotCVNUWVBfREFUQSksIHNldCBTRUNfU0hBUkVEX0xJQlJBUlkuICBUaGlzIHNlZW1zIHRvIGJlIGNvcnJlY3QgZm9yCi0JaTM4Ni1zeXN2LgotCi1UaHUgTm92ICA1IDA0OjQzOjA5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiB0YXJnZXQuYyAoc3RydWN0IGJmZF90YXJnZXQpOiAgRWxpbWluYXRlIHRoZSBTREVGIGFuZCBTREVGX0ZNVAotCW1hY3JvczsgdXNlIFBBUkFNUyB0byBkZWNsYXJlIHRoZSBmdW5jdGlvbiBwb2ludGVycyBpbnZvbHZlZC4KLQotCSogYmZkLWluLmgsIGJmZC5jLCBsaWJiZmQuaCwgcmVsb2MuYywgc2VjbGV0LmgsIHNlY3Rpb24uYywKLQl0YXJnZXRzLmM6IFJlbmFtZSBzdHJ1Y3QgYmZkX3NlY2xldF9zdHJ1Y3QgdG8gc3RydWN0IGJmZF9zZWNsZXQuCi0KLVRodSBOb3YgIDUgMDI6NTk6MDkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQlDbGVhbnVwOiAgUmVwbGFjZSBhbGwgdXNlcyBvZiBFWEZVTiBpbiB0aGUgQkZEIHNvdXJjZXMsIHdpdGggUEFSQU1TLgotCi0JKiBhcmNodXJlcy5jLCByZWxvYy5jLCBzZWN0aW9uLmMsIHRla2hleC5jOiAgVXNlIFBBUkFNUyBpbgotCWRlY2xhcmluZyBwb2ludGVycyB0byBmdW5jdGlvbnMuCi0JKiBjYWNoZS5jLCBlbGYuYzogIE1vdmUgc3RhdGljIGZ1bmN0aW9uIGRlY2xzIHRvIHRvcCwgdXNlIFBBUkFNUy4KLQkqIHNlY2xldC5oOiAgRGVjbGFyZSBleHRlcm5hbCBmdW5jdGlvbiB3aXRoIFBBUkFNUy4KLQotCSogZG9jL2NoZXcuYyAoZXhmdW5zdHVmZik6ICBFbGltaW5hdGUuCi0JKHBhcmFtc3R1ZmYpOiAgUmVwbGFjZSBleGZ1bnN0dWZmIHdpdGggZnVuY3Rpb24gdG8gZ2VuZXJhdGUgUEFSQU1TLgotCSogZG9jL3Byb3RvLnN0cjogIFVzZSBwYXJhbXN0dWZmIHJhdGhlciB0aGFuIGV4ZnVuc3R1ZmYuCi0KLQkqIGxpYmJmZC5oOiAgVXBkYXRlLCBiYXNlZCBvbiBjaGFuZ2VzIGluIHNvdXJjZSBjb2RlIGFuZCBjaGV3LgotCi1XZWQgTm92ICA0IDIyOjQ3OjI5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBsaWJpZWVlLmg6ICBBZGQgRklYTUUgYWJvdXQgcmVtb3ZpbmcgbGltaXQgb24gbnVtYmVyIG9mIHNlY3Rpb25zLgotCSogYmZkLWluLmg6ICBJbXByb3ZlIGNvbW1lbnRzIHRvIG1ha2UgaXQgY2xlYXIgdGhhdCBiZmQuaCBpcwotCXRoZSB3cm9uZyBwbGFjZSB0byBlZGl0IHRoaXMgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogIEluc3RhbGwgYW5zaWRlY2wuaCBhbmQgb2JzdGFjay5oIGluIHRoZQotCXNhbWUgcGxhY2VzIHdoZXJlIHdlIGluc3RhbGwgYmZkLmguCi0KLVdlZCBOb3YgIDQgMTM6NDA6MjMgMTk5MiAgU2VhbiBFcmljIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfb3V0LCBjb2ZmX3N3YXBfYXV4X2luKTogIGNoZWNrIGZvcgotCXN5bWJvbCB0eXBlIGJlZm9yZSBibGluZGx5IG1vZGlmeWluZyB0aGUgYXV4ZW50LiAgU3BlY2lmaWNhbGx5LAotCW9ubHkgbW9kaWZ5IHRoZSBlbmRuZHggZmllbGRzIGZvciB0eXBlcyB0aGF0IG5lZWQgaXQsIGFuZCBkb24ndAotCXNldCB0aGUgYXJyYXkgaW5mb3JtYXRpb24gZm9yIG5vbi1hcnJheXMuCi0KLVdlZCBOb3YgIDQgMDk6MzA6NTAgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6IFNlY3Rpb24gbGlzdCBzaG91bGQgYmUgc2V0IHVwCi0JY29ycmVjdGx5IGFueXdheXM7IGRvbid0IGhhdmUgdG8gc2V0IHVwICJuZXh0IiBwb2ludGVycyBtYW51YWxseS4KLQotTW9uIE5vdiAgMiAxMjozNjoxNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9kZWx0YTg4Lm1oLCBjb25maWcvaHAzMDAubWgsIGNvbmZpZy9ocHBhaHB1eC5taCwKLQljb25maWcvaTM4NnYubWg6IHJlbW92ZWQgLURVU0cgZnJvbSBIREVGSU5FUy4KLQlob3N0cy9kZWx0YTg4LmgsIGhvc3RzL2hwMzAwLmgsIGhvc3RzL2hwcGFocHV4LmgsIGhvc3RzL2kzODZ2Lmg6Ci0JZGVmaW5lZCBVU0VfVVRJTUUuCi0JaG9zdHMvaTM4NnYuaDogZG9uJ3QgZGVmaW5lIFBPU0lYX1VUSU1FLgotCi1GcmkgT2N0IDMwIDE2OjEzOjUyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfc2VjdGlvbnMpOiBtYWtlIGEgcHJpdmF0ZSBjb3B5IG9mIHRoZQotCXNlY3Rpb24ncyBuYW1lIGJlZm9yZSB0cnVuY2F0aW5nIGl0LgotCi1UaHUgT2N0IDI5IDA4OjMwOjUwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBocHBhLmM6IGFkZCBzeW1ib2xfbGVhZGluZ19jaGFyIGVudHJ5IGluIHRyYW5zZmVyIHZlYwotCi0sV2VkIE9jdCAyOCAxNjoxMTo1NyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jIChnZXRfc3ltYm9sKTogY2FuIG5vdyBjb3BlIHdoZW4gdHdvIHN5bWJvbHMgb2YgYQotCWRpZmZlcmVudCBjbGFzcywgYnV0IHRoZSBzYW1lIGluZGV4IG51bWJlciBvY2N1ciBjb25zZWN1dGl2ZWx5LgotCShnZXRfc2VjdGlvbl9lbnRyeSk6IG5pY2VyIG5hbWUgZm9yIHNlY3Rpb25zIGJlaW5nIGZvcndhcmQKLQlyZWZlcmVuY2VkLiAoaWVlZV9hcmNoaXZlX3ApOiBkb24ndCBmcmVlIHRoZSBmaWxlbmFtZSBzdHJpbmcsCi0Jc2luY2UgaXQgd2FzIG5ldmVyIG1hbGxvY2VkLgotCi1XZWQgT2N0IDI4IDEzOjQyOjA5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6ICBaZXJvIHRpbWVzdGFtcCBmaWVsZC4KLQotVHVlIE9jdCAyNyAxMjoyNDozNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfb3V0KTogc2V0IHRoZSBmY25hcnkgaW5mbyBiZWZvcmUKLQlvcHRpb25hbGx5IHNldHRpbmcgdGhlIGRpbWVuIGluZm8sIHNpbmNlIHRoZXkgYXJlIGluIHRoZSBzYW1lCi0JbWVtb3J5IGxvY2F0aW9ucy4gIEFsc28gemVybyBvdXQgZXh0ZXJuYWwgYXV4ZW50LgotCShjb2ZmX3dyaXRlX3N5bWJvbCk6IGRvbid0IHplcm8gZXh0ZXJuYWwgYXV4ZW50OyBub3cgZG9uZSBpbgotCWNvZmZfc3dhcF9hdXhfb3V0LgotCi1GcmkgT2N0IDIzIDEzOjU1OjM1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogQ2hlY2sgZmNsb3NlIHJldHVybiB2YWx1ZSBmb3IgZXJyb3JzLgotCWxpYmJmZC5oOiBiZmRfY2FjaGVfY2xvc2Ugbm93IHJldHVybnMgYSBib29sZWFuLgotCWNhY2hlLmMgKGJmZF9jYWNoZV9kZWxldGUpOiByZXR1cm4gZmNsb3NlIHN1Y2Nlc3MgdmFsdWUuCi0JKGJmZF9jYWNoZV9jbG9zZSk6IHJldHVybiBiZmRfY2FjaGVfZGVsZXRlIHJldHVybiB2YWx1ZS4KLQlvcG5jbHMuYyAoYmZkX2Nsb3NlLCBiZmRfY2xvc2VfYWxsX2RvbmUpOiByZXR1cm4gcmVzdWx0IG9mCi0JYmZkX2NhY2hlX2Nsb3NlLgotCi1GcmkgT2N0IDIzIDEwOjMyOjM2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzZWNsZXQuYyAocmVsKTogZG9uJ3QgbG9hZCBzZWN0aW9ucyB3aXRob3V0IHRoZSBTRUNfTE9BRCBiaXQuCi0KLVRodSBPY3QgMTUgMTA6MTY6MzUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTY4ay5jIChtNjhrX2hvd3RvMnR5cGUsIFNFTEVDVF9SRUxPQyk6IG5ldyBmdW5jdGlvbiB0bwotCXdvcmsgb3V0IGEgY29mZiByZWxvY2F0aW9uIHR5cGUgZnJvbSBhIGhvd3RvJ3MgYXR0cmlidXRlcyByYXRoZXIKLQl0aGFuIHVzaW5nIHRoZSBpbnB1dCByX3R5cGUgZmllbGQuIFRoaXMgZml4ZXMgUFIxNjc3IGFuZCBhbGxvd3MKLQljb252ZXJzaW9uIG9mIGEub3V0IHJlbG9jcyB0byBjb2ZmIHJlbG9jcy4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9yZWxvY3MpOiBpZiBzdXBwbGllZCBhIHJlbG9jYXRpb24KLQlyZWxhdGl2ZSB0byBhbiBhYnNvbHV0ZSBzeW1ib2wsIHVzZSB0aGUgcmlnaHQgc3ltYm9sIGluZGV4LgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogZG8gYSBwYXJ0aWFsIGxpbmsgZm9yIGNvZmYKLQlyZWxvY3MgcmlnaHQuCi0KLUZyaSBPY3QgMjMgMDg6MTU6NTYgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjaGFuZ2VzIHRvIHN1cHBvcnQgaTM4Ni1zeXN2IHdpdGggc2hhcmVkIGxpYnJhcmllczoKLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogaWYgVFdPX0RBVEFfU0VDUyBpcyBkZWZpbmVkLAotCWNoZWNrIGZvciAuZGF0YTI7IGlmIF9MSUIgaXMgZGVmaW5lZCwgY2hlY2sgZm9yIGl0OyBtYXAKLQlTRUNfTkVWRVJfTE9BRCB0byBTVFlQX05PTE9BRC4KLQkoc3R5cF90b19zZWNfZmxhZ3MpOiBtYXAgU1RZUF9OT0xPQUQgdG8gU0VDX05FVkVSX0xPQUQuCi0JKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IGlmIFRXT19EQVRBX1NFQ1MsIGFjY2VwdCAuZGF0YTIuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogZm9yY2UgdmFkZHIgb2YgLmxpYiB0byAwOyBzZXQgc2NucHRyCi0JaWYgc2VjdGlvbiBoYXMgY29udGVudHMsIG5vdCBqdXN0IGlmIGl0IGlzIGxvYWRhYmxlOyBpZgotCVRXT19EQVRBX1NFQ1MsIGNoZWNrIGZvciAuZGF0YTIKLQkoY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IHNldCB2bWEgb2YgLmxpYiBzZWN0aW9uIHRvIG51bWJlciBvZgotCS5saWIgc2VjdGlvbnMuCi0JKiBjb2ZmLWkzODYuYzogZGVmaW5lIFRXT19EQVRBX1NFQ1M7IHVzZSBhIHNwZWNpYWwgQ0FMQ19BRERFTkQ7Ci0JZG9uJ3QgZGVmaW5lIGNvZmZfd3JpdGVfYXJtYXAgdG8gYnNkX3dyaXRlX2FybWFwLgotCSogaG9zdHMvaTM4NnYuaDogZG9uJ3QgaW5jbHVkZSA8dXRpbWUuaD4sIHNpbmNlIGl0IGlzIG5vdCBwcm92aWRlZAotCWJ5IFNWUjMuMi4KLQotVGh1IE9jdCAyMiAyMjo0MDoyMCAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIHNvbGFyaXMyLmg6IEdldCB0aGUgZGVmaW5pdGlvbiBvZiBhbGxvY2EgZnJvbSBhbGxvY2EuaCBpZiB3ZQotCWFyZW4ndCB1c2luZyBnY2MuCi0KLVRodSBPY3QgMjIgMDM6MDc6MjggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTk2MC0qLXthb3V0LGJvdXR9KTogIFN1cHBvcnQgdGhlc2UuCi0KLVdlZCBPY3QgMjEgMDM6NDY6MzQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9hMjlrLWFvdXQubXQgKERFRkFVTFRfVEFSR0VUKTogIFNldCB0byBvbmUgdGhhdCBleGlzdHMuCi0KLVRodSBPY3QgMTUgMTU6MDU6MzkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFwb2xsbzY4LmgsIGFwb2xsb3Y2OC5oLCBocDMwMC5oLCBpMzg2di5oLCBpcml4My5oOiBSZW1vdmUKLQluby1sb25nZXItdXNlZCBkZWZpbml0aW9ucyBvZiBMX1NFVCBhbmQgTF9JTkNSLgotCSogaTM4NmxpbnV4Lmg6ICBUd2Vha3MgdG8gc21vb3RoIExpbnV4IGJ1aWxkLgotCi1UaHUgT2N0IDE1IDAxOjMyOjIyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBzZWNsZXQuaDogIEFkZCBlbnVtIHRhZyB0byBiZmRfc2VjbGV0X2VudW1fdHlwZS4KLQotCSogYmZkLWluLmggKGZpbGVfcHRyKTogIFVwZGF0ZSBjb21tZW50cywgbWFrZSBGSVhNRSByZSBvZmZfdC4KLQotCSogYW91dC1hZG9iZS5jLCBhb3V0ZjEuaCwgYXJjaGl2ZS5jLCBib3V0LmMsIGNvZmYtcnM2MDAwLmMsCi0JY29mZmNvZGUuaCwgZWxmLmMsIGllZWUuYywgbGliYW91dC5oLCBsaWJiZmQuYywgb2FzeXMuYywKLQlzY28tY29yZS5jOiAgTGludDogIFNlY29uZCBhcmd1bWVudCBvZiBiZmRfc2VlayBpcyBhbHdheXMgZmlsZV9wdHIuCi0JVGhpcmQgYXJndW1lbnQgaXMgU0VFS19TRVQgb3IgU0VFS19DVVIuICBSZXN1bHQgaXMgYWx3YXlzIDAgb3IgLTEuCi0KLQkqIGFvdXQtYWRvYmUuYywgYW91dGYxLmgsIGFvdXR4LmgsIGJvdXQuYyBjb2ZmLW02OGsuYywgY29mZi16OGsuYywKLQljb2ZmY29kZS5oLCBlbGYuYywgbGliYW91dC5oLCBsaWJiZmQtaW4uaCwgc3JlYy5jOiAgTGludC4KLQotRnJpIE9jdCAgOSAwMzo0NjozNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3Q6ICBOZXcgZmlsZSwgY29udGFpbnMgbWFwcGluZyBvZiBob3N0IGNvbmZpZ3MKLQl0byBob3N0IHN1cHBvcnQgZmlsZSBuYW1lcyBmb3IgYmZkLCBiaW51dGlscywgb3Bjb2Rlcy4KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBpdC4KLQkqIGkzODZhb3V0LmM6ICBDbGVhbnVwLCBkdW1wIFRBUkdFVF9JU19MSVRUTEVfRU5ESUFOX1AuCi0JKiBpMzg2YnNkLmM6ICBDbGVhbnVwLCByZWZvcm1hdC4KLQkqIGNvbmZpZy9pMzg2LWJzZC5tdDogIENvbW1lbnQgY2hhbmdlcy4KLQkqIGNvbmZpZy9pMzg2YnNkLm1oOiAgTmV3IGZpbGUgZm9yIGNvcmUgZmlsZSBzdXBwb3J0LgotCSogaG9zdHMvaTM4NmJzZC5oOiAgTWVyZ2UgY2hhbmdlcyBmcm9tIFBldGVyIFNjaGF1ZXIuCi0JKiBib3V0LmMgKEFMSUdOKTogIFJlbmFtZSB0byBBTElHTkVSLCBzaW5jZSBzeXN0ZW0gaGVhZGVyIGZpbGVzCi0Jb24gQlNEIDQuNCBkZWZpbmUgQUxJR04gKHNpZ2ghKS4KLQotVGh1IE9jdCAgOCAyMjoxODoxMCAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCB0d2VlZGxlZHVtYmVyLmN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaCAoYW91dF9iYWNrZW5kX2RhdGEpOiBhZGRlZCBleGVjX2hlYWRlcl9ub3RfY291bnRlZAotCWZpZWxkLiBGb3IgWk1BR0lDIGZpbGVzIG9ubHksIHdoZW4gdGV4dF9pbmNsdWRlc19oZWFkZXIgaXMgc2V0LCBieQotCWRlZmF1bHQgdGhlIGxlbmd0aCBvZiB0aGUgZXhlYyBoZWFkZXIgaXMgY291bnRlZCBpbiB0aGUgdGV4dAotCXNlY3Rpb24gc2l6ZS4gRm9yIGdvMzIsIGV4ZWMgaGVhZGVyIGlzIG1hcHBlZCBpbiBidXQgZG9lcyAqbm90KgotCWNvbnRyaWJ1dGUgdG8gdGhlIHNpemUgb2Ygc2VjdGlvbi4KLQkqIGFvdXR4LmggKGFvdXRfYWRqdXN0X3NpemVzX2FuZF92bWFzKTogaWYgZXhlY19oZWFkZXJfbm90X2NvdW50ZWQKLQlpcyBub3Qgc2V0LCBidXQgenRpaCBpcywgYWRkIHRoZSBzaXplIG9mIHRoZSBleGVjIGhlYWRlciB0byB0aGUKLQlyZWNvcmRlZCBzaXplIG9mIHRoZSB0ZXh0IHNlY3Rpb24uCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X2FvdXRfYmFja2VuZCk6IGNsZWFyIGV4ZWNfaGVhZGVyX25vdF9jb3VudGVkLgotCSogaTM4NmFvdXQuYyAoaTM4NmFvdXRfYmFja2VuZF9kYXRhKTogc2V0IGV4ZWNfaGVhZGVyX25vdF9jb3VudGVkLgotCUFsc28gc2V0IHRleHRfaW5jbHVkZXNfaGVhZGVyLgotCSogYW91dC10YXJnZXQuaCAoKl9iYWNrZW5kX2RhdGEpOiBjbGVhcmUgZXhlY19oZWFkZXJfbm90X2NvdW50ZWQKLQlieSBkZWZhdWx0IGluIE1ZKGJhY2tlbmRfZGF0YSkuCi0KLVRodSBPY3QgIDggMTg6MTI6NDkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmggKGNhbGxiYWNrKTogRG9uJ3QgZGVmaW5lIHRoaXMgZnVuY3Rpb24gaWYgaXQgd29uJ3QgYmUKLQl1c2VkLgotCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiBSZXN0b3JlIG9sZCBhb3V0X2RhdGEgdmFsdWUgaWYgdGhpcwotCXR5cGUgZG9lc24ndCBtYXRjaC4gIERvbid0IGxvc2UgaWYgZmlsZSBzZWN0aW9ucyBoYXZlIGFscmVhZHkgYmVlbgotCWNyZWF0ZWQuCi0JKHNldF9hcmNoX21hY2gpOiBTZXQgcmVsb2NfZW50cnlfc2l6ZS4KLQkoc2x1cnBfc3ltYm9sX3RhYmxlKTogVXNlIGJmZF9oX2dldF97MTYsOH0gZm9yIHJlYWVkaW5nIHN5bWJvbCBkYXRhLgotCi0JKiBob3N0cy9pMzg2YnNkLmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgaVszNF04Ni0qLWJzZCBob3N0LgotCi0JKiBhb3V0LXRhcmdldC5oIChjYWxsYmFjaywgd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGVsZXRlIHVudXNlZAotCXZhcmlhYmxlcy4KLQotCSogYW91dHguaCAocmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0JKiBhb3V0LXRhcmdldC5oIChNWV9yZWxvY19ob3d0b190eXBlX2xvb2t1cCk6IFVzZSBpdCBhcyBkZWZhdWx0LgotCSogYW91dGYxLmggKHN1bm9zNF9yZWxvY190eXBlX2xvb2t1cCk6IERlbGV0ZWQuCi0JKE1ZX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwKTogRG9uJ3QgZGVmaW5lIGl0LgotCi0JKiBhb3V0eC5oIChhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpOiBEb24ndCBib3RoZXIgd2l0aCBwYWRkaW5nIGZvcgotCU9NQUdJQyBmaWxlcy4KLQkoc2x1cnBfc3ltYm9sX3RhYmxlKTogVXNlIGhlYWRlciBieXRlIG9yZGVyLCBub3QgdGFyZ2V0IGJ5dGUKLQlvcmRlciwgZm9yIHJlYWRpbmcgc3ltYm9sIGRhdGEuCi0KLVRodSBPY3QgIDggMTc6MzM6MzkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFVuZG8gc29tZSBicmFpbiBkYW1hZ2UgaW4gdGhlIGhvc3Qgc2VjdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbjogIFJlZm9ybWF0IHRoZSB0YXJnZXQgc2VjdGlvbiwgdGVzdCBtYW55IGNvbmZpZ3MuCi0JKiBNYWtlZmlsZS5pbiAobWFrZSk6ICBSZW1vdmUgb2Jzb2xldGUgYG1ha2UgbWFrZScuCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiAgTWFrZSBkZWZpbmVzIGxpbmUgdXAuCi0KLVRodSBPY3QgIDggMDg6NTI6NDggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQlOb3cgYSBiZmQga25vd3Mgd2hldGhlciB1bmRlcnNjb3JlcyBhcmUgbm9ybWFsbHkgcHJlcGVuZGVkCi0JdG8gc3ltYm9scyBpbiBpdHMgZmlsZSBmb3JtYXQuCi0KLQkqIGFvdXQtYWRvYmUuYywgYW91dC10YXJnZXQuaCwgYm91dC5jLCBjb2ZmLWEyOWsuYywgY29mZi1oODMwMC5jLAotCWNvZmYtejhrLmM6IHRhcmdldHMgc2V0IHNvIHRoZXkgaGF2ZSBsZWFkaW5nIHVuZGVyc2NvcmUKLQkqIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZi1tNjhrLmMsIGNvZmYtbWlwcy5jLCBjb2ZmLW04OGsuYywKLQljb2ZmLXJzNjAwMC5jLCBjb2ZmLXdlMzJrLmMsIGVsZi5jLCBpZWVlLmMsIHNyZWMuYzogdGFyZ2V0cyBzZXQKLQl3aXRob3V0IGxlYWRpbmcgdW5kZXJzY29yZSBmbGFnCi0JKiB0YXJnZXRzLmM6IGFkZCBzeW1ib2wgbGVhZGluZyBjaGFyIHRvIHh2ZWMgZGVzY3JpcHRpb24KLQkqIGJmZC1pbi5oIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIpOiBuZXcgbWFjcm8uCi0KLU1vbiBPY3QgIDUgMTQ6MzI6NTUgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYzogIE1ha2UgZXJybm8gZ2xvYmFsLgotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiAgSWYgcmVhZCBmYWlscyAoYW5kCi0JZXJybm8hPTApIHNldCBiZmRfZXJyb3IgdG8gbWFsZm9ybWVkX2FyY2hpdmUgKHNpbmNlIHRoaXMgcHJvYmFibHkKLQlpbmRpY2F0ZXMgYSB0cnVuY2F0ZWQgYXJjaGl2ZSksIHJhdGhlciB0aGFuIHN5c3RlbV9jYWxsX2Vycm9yLgotCi1Nb24gT2N0ICA1IDAzOjMzOjM5IDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IHR3ZWVkbGVkdW1iZXIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHJ1bGVzIGZvciBpMzg2YnNkLmMKLQkqIGkzODZic2QuYzogbmV3IGZpbGUsIHN1cHBvcnRpbmcgMzg2YnNkLgotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgaTM4Ni0qLWJzZCB0YXJnZXQuCi0JKiBjb25maWcvaTM4Ni1ic2QubXQ6IG5ldyBmaWxlIC0gMzg2YnNkIHRhcmdldCBjb25maWd1cmF0aW9uLgotCi1UaHUgT2N0ICAxIDE3OjUxOjA3IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZS1hcnJhbmdlIGhvc3Qgc2VjdGlvbiB0byB1c2UgKi0qLSogbm90YXRpb24sCi0JY2xlYW4gdXAgc29tZSBvZiB0aGUgdGFyZ2V0IHNlY3Rpb24gYXMgd2VsbAotCi0JKiBzZWNsZXQuYzogY2FzdCByZXN1bHQgb2YgYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyB0bwotCWF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzCi0KLVR1ZSBTZXAgMjkgMTM6MjQ6MDkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2VjdGlvbl9zeW1ib2wpOiBDcmVhdGUgc2VjdGlvbiBpZiBpdCBkb2Vzbid0Ci0JYWxyZWFkeSBleGlzdC4KLQotCSogYm91dC5jOiBSZW1vdmVkIHNvbWUgdW51c2VkIHZhcmlhYmxlcy4KLQotVHVlIFNlcCAyOSAwODozMDoyMSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIFBvcnRhYmlsaXR5IGZpeGVzIGZyb20gcDM6Ci0JY29mZmNvZGUuaCAoY29mZl93cml0ZV9yZWxvY3MpOiByZW1vdmVkIHNhbml0eSBjaGVjayB1bnRpbCBpdAotCXdvcmtzIG9uIGFsbCB0YXJnZXRzIChwZXIgYWR2aWNlIGZyb20gc2FjKS4KLQljb25maWcvaHA5MDAwLm1oOiBuZXcgZmlsZSB0byBkZWZpbmUgVVNHLgotCWhwcGEuYzogI3VuZGVmIGhwcGEgYmVmb3JlIHRoZSBKVU1QX1RBQkxFLgotCWhvc3RzL2hwcGFocHV4Lmg6ICNkZWZpbmUgTkFUSVZFX0hQUEFIUFVYX0NPTVBJTEVSIGlmIG5vdAotCV9fU1REQ19fLgotCXRhcmdldHMuYyAoYmZkX3RhcmdldF9saXN0KTogaWYgTkFUSVZFX0hQUEFIUFVYX0NPTVBJTEVSLCBtYWtlCi0JbG9jYWwgdmFyaWFibGUgdGFyZ2V0IHZvbGF0aWxlIHRvIGF2b2lkIG15c3RlcmlvdXMgYnVnIGluCi0JSFA5MDAwLzcwMCBjYy4KLQotU2F0IFNlcCAyNiAwMzo1ODo0OSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hwcGFic2QubWgsIGNvbmZpZy5ocHBhaHB1eC5taDogIFJlbW92ZSB2YXJpb3VzIGJvZ29zaXR5LgotCSogaG9zdHMvaHBwYWhwdXguaDogIFJlbW92ZSBiY29weSBhbmQgaW5kZXggY2lyY3VtdmVudGlvbnMuCi0KLUZyaSBTZXAgMjUgMjI6MzY6NTIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvZmYtejhrLmMgKGZ1bmNfZGEsIGZ1bmNfanIpOiAgTGludC4KLQkqIGNvZmZjb2RlLmg6ICBVc2UgbWVtc2V0IHJhdGhlciB0aGFuIGJ6ZXJvLgotCSogZWxmLmM6ICBVc2UgbWVtY3B5IHJhdGhlciB0aGFuIGJjb3B5LgotCSogdGVraGV4LmM6ICBVc2UgbWVtc2V0IHJhdGhlciB0aGFuIGJ6ZXJvLgotCi1GcmkgU2VwIDI1IDE5OjE0OjQ4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JQWRkIEFkb2JlIGEub3V0IHN1cHBvcnQuCi0KLQkqIGFvdXQtYWRvYmUuYzogIE5ldyBmaWxlLiAgU28gZmFyLCBvbmx5IHJlYWRzIGEub3V0LmFkb2JlLiAgRklYTUUuCi0JKiBjb25maWcvYWRvYmUubXQ6ICBBZGQuCi0JKiBjb25maWd1cmUuaW4gKCotYWRvYmUtKiB0YXJnZXQpOiAgQWRkLgotCSogdGFyZ2V0cy5jIChhX291dF9hZG9iZV92ZWMpOiAgQWRkLgotCSogTWFrZWZpbGUuaW46ICBhZGQgYW91dC1hZG9iZS5jLgotCi0JKiBjb25maWd1cmUuaW46ICBQdXQgdHdvIGRhc2hlcyBpbiBhbGwgZW50cmllcyB0byBiZSBtYXRjaGVkLgotCUFkZCBjb21tZW50cyB0byByZW1pbmQgcGVvcGxlIHRvIGRvIHRoaXMuCi0JUmVvcmRlciBhbGwgZW50cmllcyB0aGF0IG1hdGNoIG1hbnVmYWN0dXJlciBuYW1lcywgdG8gb2NjdXIKLQlsYXN0LCBzbyB0aGV5IHdpbGwgb25seSBiZSBtYXRjaGVkIGlmIG5vIG1vcmUgc3BlY2lmaWMgbWF0Y2gKLQlvY2N1cnMuICBSZW1vdmUgbWFudWZhY3R1cmVycyBgYW91dCcsIGBib3V0JywgYGNvZmYnLCBhbmQgYGVsZicuCi0KLUZyaSBTZXAgMjUgMTU6MDM6MjIgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChzZWN0aW9uX2Zyb21fZWxmX2luZGV4KTogUmV0dXJuIGJmZF9hYnNfc2VjdGlvbiwgbm90IDAsCi0Jc2luY2Ugd2Ugc2hvdWxkIG5ldmVyIGhhdmUgYSBOVUxMIHNlY3Rpb24uCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBzdF9zaG5keCBkb2Vzbid0IG1hdGNoIGFueSBvZiBvdXIKLQl0ZXN0cywgc2V0IHRoZSBzZWN0aW9uIHRvIGJmZF9hYnNfc2VjdGlvbi4KLQotRnJpIFNlcCAyNSAxMToxMTo1NyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi16OGsuYzogZ2V0dGluZyBjbG9zZXIKLQkqIGNvZmZjb2RlLmggKGNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogYWxsb3cKLQlFWFRSQV9DQVNFUyBob29rcyBmb3IgZGlmZmVyZW50IGFyY2hlcyB0byBwcm92aWRlIGRpZmZlcmVudCByZWxvYwotCXR5cGVzLgotCSogc2VjbGV0Lmg6ICNpZm5kZWYgYXJvdW5kIGl0IHRvIGFsbG93IG11bHRpcGxlIGluY2x1c2lvbgotCSogc3JlYy5jOiBtaW5vciBkb2MgZml4Ci0KLU1vbiBTZXAgMjEgMTQ6MzM6NTggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBob3N0cy9ocDkwMDAuaCwgaG9zdHMvaXJpeDMuaDogY2hhbmdlcyBmcm9tIFdSUy4KLQotU3VuIFNlcCAyMCAwODo0ODoyNSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgVXNlIGkzODYtZWxmIGZvciBhbGwgaTM4Ni9pNDg2IHN5c3Y0IGhvc3RzLCBub3QKLQlqdXN0IG5jci4KLQotVGh1IFNlcCAxNyAwNjo0MDo0NiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoYl9vdXRfc2x1cnBfcmVsb2NfdGFibGUpOiBDbGVhciBob3d0byBmaWVsZCBiZWZvcmUKLQlmaWxsaW5nIGluIHJlbG9jLCBpbiBjYXNlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBjb2RlIGRvZXNuJ3Qgc2V0Ci0JaXQuCi0KLUZyaSBTZXAgMTEgMTU6Mzc6MDYgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBzZXQgdGhlIGxhc3QgcmVudW1iZXJlZAotCXN5bWJvbCBwb2ludGVyIHRvIE5VTEwsIGFzIGV4cGVjdGVkIGJ5IGNvZmZfd3JpdGVfbGluZW51bWJlcnMuCi0JKGNvZmZfd3JpdGVfcmVsb2NzKTogYXBwYXJlbnRseSBhIG5vbi16ZXJvIGFkZGVuZCBpcyBPSyBmb3IgcmVsb2MKLQl0eXBlIFJfSUhDT05TVCB1c2VkIG9uIHRoZSAyOWsuCi0KLVRodSBTZXAgMTAgMTM6Mjg6MjQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6ICBEZXRlcm1pbmUgd2hldGhlciB0byBmZG9wZW4gZm9yCi0JdXBkYXRlLCBiYXNlZCBvbiBob3cgdGhlIHVuZGVybHlpbmcgZmlsZSB3YXMgb3BlbmVkLiAgT2Jzb2xldGVzCi0JRkFTQ0lTVF9GRE9QRU4uCi0JKiBob3N0cy9yczYwMDAuaCwgaG9zdHMvdGFob2UuaCwgaG9zdHMvdmF4YnNkLmg6ICBSZW1vdmUKLQlhbGwgRkFTQ0lTVF9GRE9QRU4gY29uZmlnIGRlZmluZXMuCi0KLVR1ZSBTZXAgIDggMjE6Mzc6NTggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1vcGMuYzogTW92ZWQgdG8gb3Bjb2RlcyBsaWJyYXJ5LCBub3cgdGhhdCB3ZSBoYXZlIG9uZS4KLQkqIE1ha2VmaWxlOiBEb24ndCBjb21waWxlIGl0LgotCi1UdWUgU2VwICA4IDEwOjEwOjM0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYW91dHguaDogYWRqdXN0X3NpemVzX2FuZF92bWFzIGRpZCBub3QgcmV0dXJuIGFueXRoaW5nLgotCi1UaHUgU2VwICAzIDE5OjI5OjA0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChiZmRfc2V0X3NlY3Rpb25fZmxhZ3MpOiAgUmVtb3ZlIGEgc2FuaXR5IGNoZWNrLgotCUl0IGlzIHVuZm9ydHVuYXRlbHkgYnJva2VuLCBhbmQgcHJldmVudHMgc3RyaXAgZnJvbSB3b3JraW5nLgotCi1UaHUgU2VwICAzIDE2OjE0OjQwIDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtb3BjLmMgKGNvbmRyKTogUmVtb3ZlIGV4dHJhbmVvdXMsIGJ1dCBoYXJtbGVzcywgYmFja2xhc2gKLQljcmVhdGVkIGJ5IGxhc3QgY2hhbmdlLgotCi1UaHUgU2VwICAzIDEzOjUyOjM4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAocmVsb2NfaG93dG9fc3RydWN0KTogIE1ha2Ugc2l6ZSBmaWVsZCBiZSB1bnNpZ25lZC4KLQkqIGJmZC1pbi5oOiAgQnVtcCB0byB2ZXJzaW9uIDIuMC4KLQotVGh1IFNlcCAgMyAwOTowNTozNyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBib3V0LmMsIGNwdS16OGsuYzogIFVzZSBlbnVtcyB3aGVuIGluaXRpYWxpemluZyBzdHJ1Y3RzIHRvIGtlZXAKLQlicmFpbmRhbWFnZWQgSFAvQXBvbGxvIGNvbXBpbGVyIGhhcHB5LgotCi1XZWQgU2VwICAyIDAyOjUzOjI5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBmb3JtYXQuYzogIEZpeCBkZXNjcmlwdGlvbiBvZiBzZWFyY2ggZm9yIG1hdGNoaW5nIHRhcmdldC4KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6ICBTZXQgU0VDX0NPREUgYW5kIFNFQ19EQVRBLgotCSogdGFyZ2V0cy5jOiAgVXBkYXRlIGRlc2NyaXB0aW9uIG9mIHNlYXJjaCBmb3IgbWF0Y2hpbmcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW4gKGRvX2NsZWFuLCBjbGVhbik6ICBGaXggaW5mYW50IG1vcnRhbGl0eSB0eXBvLgotCShkb2NkaXIpOiAgU2V0IHRvIC4vZG9jLCBub3QgJHtzcmNkaXJ9L2RvYywgd2hpY2ggaGFzIG5vIG1ha2VmaWxlLgotCSh6OGsgYW5kIHdlMzJrIGZpbGVzKTogIGAqLm86ICouYyc6IGF2b2lkIFN1biBNYWtlIGJ1Zy4KLQotV2VkIFNlcCAgMiAwMDoyNjozMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkZWQgbW9zdGx5Y2xlYW4vY2xlYW4vZGlzdGNsZWFuIHJ1bGVzLgotCi1UdWUgU2VwICAxIDEzOjM4OjQwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiAgVGFrZSBvdXQgb2FzeXMgKHVubGVzcyB0aGF0IGlzCi0JdGhlIGRlZmF1bHQpOiAgQmVjYXVzZSB0aGVyZSBpcyBubyBtYWdpYyBudW1iZXIgaW4gYXJjaGl2ZXMsCi0JdGhlcmUgY2FuIGJlIGFubm95aW5nIHRhcmdldCBtaXMtbWF0Y2hlcy4KLQotTW9uIEF1ZyAzMSAxMDoxMTozNyAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLW9wYy5jOiBSaWdvcm91c2x5IHVwZGF0ZWQgdG8gbWF0Y2ggYXJjaGl0ZWN0dXJlIG1hbnVhbC4KLQotTW9uIEF1ZyAzMSAwODowNzo1OCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dDxuPnN3YXBfZXh0X3JlbG9jX291dCksIGJvdXQuYwotCShiX291dF9zcXVpcnRfb3V0X3JlbG9jcyk6IGZpeCBidWcgMTUwNiB3aGVyZSBhYnMgc3ltYm9scyBhdHRhY2hlZAotCXRvIHRoZSBidWlsdC1pbiBhYnNfc2VjdGlvbiB3ZXJlIG5vdCB3cml0dGVuIG91dCBjb3JyZWN0bHkuCi0KLUZyaSBBdWcgMjggMTY6Mjk6MTUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJmZF9zbHVycF9ic2RfYXJtYXApOiBpZiB0aGUgc3ltZGVmX2NvdW50IGlzIHRvbwotCWxhcmdlLCBhc3N1bWUgd2UncmUgdXNpbmcgYSBzd2FwcGVkIGJ5dGUgb3JkZXIgYW5kIGZhaWwgd2l0aAotCXdyb25nX2Zvcm1hdCByYXRoZXIgdGhhbiBkdW1waW5nIGNvcmUuCi0KLUZyaSBBdWcgMjggMTU6Mzg6MDMgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIFJlbmFtZWQgb3BjLXNwYXJjLmMgdG8gc3BhcmMtb3BjLmMgZm9yIHN5c3RlbXMgd2l0aCBzaG9ydAotCWZpbGVuYW1lIGNvbnN0cmFpbnRzLgotCSogTWFrZWZpbGUuaW46IFVwZGF0ZWQgdG8gcmVmbGVjdCBjaGFuZ2UuCi0KLVRodSBBdWcgMjcgMTM6MDU6MjggMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AY3lnbnVzLmNvbSkKLQotCUFkZCBwcmVsaW1pbmFyeSBzdXBwb3J0IGZvciB0aGUgd2UzMms6Ci0KLQkqIE1ha2VmaWxlLmluLCBhcmNodXJlcy5jLCBjb2Zmb2NvZGUuaCwgY29uZmlndXJlLmluLCB0YXJnZXRzLmM6Ci0JTWlub3IgZWRpdHMuCi0JKiBjb2ZmLXdlMzJrLmMsIGNwdS13ZTMyay5jLCBjb25maWcvd2UzMmsubXQsIGhvc3RzL3dlMzJrLmg6IE5ldyBmaWxlcy4KLQotV2VkIEF1ZyAyNiAxNDoyMDoxNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jOiBhZGRlZCBzdXBwb3J0IGZvciByZWxheGFibGUgYWxpZ25tZW50IHJlbG9jcy4KLQotCSogc2VjbGV0LmMgKHJlbCwgc2VjbGV0X2R1bXBfc2VjbGV0LCBzZWNsZXRfZHVtcCk6IGdldCB0aGUgYXBwIHRvCi0JcGFzcyBkb3duIHBvaW50ZXIgdG8gcGxheSBhcmVhIHJhdGhlciB0aGFuIHVzZSBhbGxvY2EKLQotCSogY3B1LXo4ay5jIChjb21wYXRpYmxlKTogbWFkZSBzdGF0aWMgdG8gcmVkdWNlIG5hbWUgc3BhY2UKLQlwb2x1dGlvbi4KLQotVHVlIEF1ZyAyNSAwODozOToxMCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotICAgICAgICBBZGQgYmFzaWMgc3VwcG9ydCBmb3IgdGhlIHo4azoKLQotCSogTWFrZWZpbGUuaW4sIGFyY2h1cmVzLmMsIGNvZmZjb2RlLmgsIGNvbmZpZ3VyZS5pbiwgcmVsb2MuYywKLQlzZWN0aW9uLmMsIHRhcmdldHMuYywKLQotCSogc3ltcy5jOiBtb3ZlIG1pcy1pbnNlcnRlZCBwYXRjaC4KLQotRnJpIEF1ZyAxNCAxNTozOToyOSBQRFQgMTk5MiAgSG93YXJkIENodSAgKGh5Y0BoYW5hdW1hLmpwbC5uYXNhLmdvdikKLQotCURvY3VtZW50YXRpb24gZml4ZXM6Ci0JKiBjdG9ycy5jLCBmb3JtYXQuYywgc2VjdGlvbi5jLCByZWxvYy5jOiBhcHBlbmQgIiAtIiB0byBpdGVtIHRhZ3MuCi0JKiByZWxvYy5jLCBzZWN0aW9uLmMsIHN5bXMuYywgdGFyZ2V0cy5jOiBhZGQgRE9DREQgYmVmb3JlIEBub2RlCi0JCWNvbW1lbnRzLgotCSogcmVsb2MuYzogYnJlYWsgb3V0IGFkZGVuZCBpdGVtIGZyb20gc3Vycm91bmRpbmcgdGV4dC4KLQotCSogZG9jLnN0ciAoRE9DREQpOiBEZWZpbmVkLiBBZGRzIHRleHQgdG8gb3V0cHV0LgotCShib2R5dGV4dCk6IFB1dCBidWxsZXRpemUgYmVmb3JlIGtpbGxfYm9ndXNfbGluZXMuCi0JKiBjaGV3LmMgKGJ1bGxldGl6ZSk6IEVuZCBpdGVtaXphdGlvbiBhZnRlciBhIGJsYW5rIGxpbmUsIHRvCi0JcHJldmVudCBmb2xsb3dpbmcgdGV4dCBmcm9tIGJlaW5nIHN3YWxsb3dlZCB1cCBpbiBhbiBpdGVtLgotCi1Nb24gQXVnIDI0IDIwOjUwOjIyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBzcGFyY2xpdGUgYXMgYSB0YXJnZXQuCi0KLU1vbiBBdWcgMjQgMTI6MDY6MzEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGllZWUuYyAoaWVlZV9nZXRfc3ltdGFiKTogYWx3YXlzIG51bGwgdGVybWluYXRlIHRoZSBzeW1ib2wgbGlzdCwKLQlsaW50LgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMpOiBpZiBzeW1ib2xzIGRvbid0IGNvbWUKLQlmcm9tIGEgY29mZiBmaWxlIChjc3ltIGlzIG51bGwpLCBkb250IGRlcmVmIHRoZW0KLQotCSogaWVlZS5jIChwYXJzZV9leHByZXNzaW9uKTogZ2V0IHRoZSBhbnN3ZXIgcmlnaHQgd2hlbiBhZGRpbmcgYW4KLQlhYnMrKHNlYytvZmYpLCAoaWVlZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQpOiBjYWxsIGllZWVfb2JqZWN0X3AKLQlvbiBlbHRzIHNvIHRoYXQgZmlsZW5hbWUgaXMgZmlsbGVkIGluLgotCi1UaHUgQXVnIDIwIDE5OjA1OjQ4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGhvd3RvX2FsaWduX3RhYmxlKTogTmV3IHNldCBvZiByZWxvY3MsIHdpdGggZW5vdWdoCi0JZGF0YSBmb3IgIm9iamR1bXAgLXIiIHRvIHdvcmsuCi0JKGJfb3V0X3JlbG9jX3R5cGVfbG9va3VwKTogUmVjb2duaXplIGFsaWdubWVudCByZWxvY3MuCi0KLVR1ZSBBdWcgMTggMTI6NTc6NDUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0gCSogTWFrZWZpbGUuaW46IGFkZGVkIEZMQUdTX1RPX1BBU1MsIGFuZCB1c2VkIGl0IGZvciBhbGwgcmVjdXJzaXZlCi0JaW52b2NhdGlvbnMgb2YgbWFrZS4gIEFsc28sIGFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uCi0JZGlyZWN0b3JpZXMuCi0KLQkqIGNvbmZpZy9hcG9sbG92NjgubWg6IHJlbW92ZWQgLWcgZnJvbSBDQyBkZWZpbml0aW9uLgotCi1Nb24gQXVnIDE3IDEzOjQwOjA4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVjc3RhdGlvbi5taCAoSERFRklORVMpOiBTcGVjaWZ5ICItRyA0IiB0byBhdm9pZAotCW92ZXJmbG93aW5nIGdwLW9mZnNldCByYW5nZS4KLQotTW9uIEF1ZyAxNyAxMTo0NDoyOCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jIChzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogZG9uJ3Qgd3JpdGUgb3V0IHNlY3Rpb25zCi0Jd2l0aG91dCB0aGUgTE9BRCBhbmQgQUxMT0MgYXR0cmlidXRlcwotCi1Nb24gQXVnIDE3IDExOjU1OjA3IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYywgY3B1LW02OGsuYywgY3B1LXNwYXJjLmM6IFVuZG8gMTYgSnVuZSBjaGFuZ2VzLgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBOZXcgY2FsbGJhY2sgInNldF9zaXplcyIuCi0JKiBhb3V0LXRhcmdldC5oIChjYWxsYmFjayk6IERvbid0IHNldCBwYWdlL3NlZyBzaXplcy4KLQkobWtvYmplY3QpOiBEaXR0by4KLQkoc2V0X3NpemVzKTogTmV3IHJvdXRpbmUuCi0JKGJhY2tlbmRfZGF0YSk6IFBvaW50IHRvIGl0LgotCSogYW91dGYxLmggKHN1bm9zNF9zZXRfc2l6ZXMpOiBIZWVkIGFyY2hpdGVjdHVyZSB3aGVuIHNldHRpbmcgc2l6ZXMuCi0JKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBQb2ludCB0byBpdC4KLQkqIGFvdXR4LmggKHNldF9hcmNoX21hY2gpOiBDYWxsIHNldF9zaXplcyBjYWxsYmFjay4KLQotRnJpIEF1ZyAxNCAxOToyMjoxOCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaDogIE1ha2UgX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIGJlCi0JdGhlIGRlZmF1bHQuICBHaXZlbiB0aGF0IHdlICp3cml0ZSogdGhlIHN1Y2tlcnMgKGZvciBsb25nCi0JYXJjaGl2ZSBtZW1iZXIgbmFtZXMpLCB3ZSByZWFsbHkgb3VnaHQgdG8gYmUgYWJsZSB0byByZWFkIHRoZW0hCi0JKiB0cmFkLWNvcmUuYzogIERvbid0IGluY2x1ZGUgPG1hY2hpbmUvcmVnLmg+LiAgSXQgZG9lc24ndAotCXNlZW0gdG8gYmUgbmVlZGVkLCBhbmQgbWFueSBtYWNoaW5lcyBkb24ndCBoYXZlIGl0LgotCi1UaHUgQXVnIDEzIDA5OjUzOjM5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW02OGsuYyAodmVjdG9yKTogcmVhZCBhbmQgd3JpdGUgYXJjaGl2ZXMgaW4gY29mZiBmb3JtYXQuCi0KLVR1ZSBBdWcgMTEgMTI6MTk6NDIgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIG9wYy1zcGFyYy5jOiBOZXcgZmlsZS4KLQotU2F0IEF1ZyAgOCAyMzoxNTozNSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiZmRfcmVsb2Nfc3RhdHVzX3R5cGUsIGNhbGxqX2NhbGxiYWNrKTogIENhc3Qgdm9pZCoKLQlwb2ludGVycyB0byBiZmRfYnl0ZSogYmVmb3JlIHBlcmZvcm1pbmcgYXJpdGhtZXRpYyBvbiB0aGVtLiAgU3VjaAotCXVzZSB3aXRoIGJhcmUgdm9pZCogcG9pbnRlcnMgaXMgYSBnY2MgZXh0ZW5zaW9uLgotCSogY2FjaGUuYyAoYmZkX2NhY2hlX2RlbGV0ZSk6ICBGb3J3YXJkIGRlY2wgd2l0aCBwcm90b3R5cGUgZm9ybS4KLQkqIGFyY2hpdmUgKG5vcm1hbGl6ZSk6ICBBZGQgdG8gQ09OU1QgdG8gbWF0Y2ggYWN0dWFsIHVzYWdlcyB3aXRoCi0JQ09OU1QuCi0KLU1vbiBBdWcgIDMgMDA6MzU6MjkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlY29nbml6ZSBpNDg2IGhvc3QgY3B1LCBhbmQgdXNlIGkzODYtZWxmCi0JZm9yIGk0ODYtbmNyLXN5c3Y0LgotCi1TYXQgQXVnICAxIDEzOjQ5OjU5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvc3RyYXR1cy5tdCAoQ0MpOiAgUmVtb3ZlIGRlZmluaXRpb24uCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIFRlc3QgZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0Ci0Jc2VjdGlvbl9mcm9tX2VsZl9pbmRleCByZXR1cm5zIE5VTEwgYW5kIGRvbid0IGRlcmVmZXJlbmNlIGl0LgotCi1Nb24gSnVsIDIwIDAyOjQ2OjA5IDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogYWRkIGhwcGFfZGF0YSB0byBiZmQgdGRhdGEgKGluZGlyZWN0bHkgdmlhIHNlZikuCi0KLQkqIGNvbmZpZy9ocHBhaHB1eC5taDogaHB1eCBpcyAtRFVTRyAocGF0Y2ggYnkgc2VmKQotCi1TYXQgSnVsIDE4IDE1OjUwOjExIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBlcnJvciBtZXNzYWdlcyB0byBzdGRlcnIsIG5vdCBzdGRvdXQKLQotRnJpIEp1bCAxNyAxODozMjo0NiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jLCBjYWNoZS5jLCBjb2ZmLWEyOWsuYywgY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLAotCSAgY29mZi1tNjhrLmMsIGNvZmYtbTg4ay5jLCBkZW1vNjQuYywgbGliYW91dC5oLCBsaWJiZmQuYywKLQkgIG9hc3lzLmMsIG9wbmNscy5jLCBzdW5vcy5jLCB0YXJnZXRzLmM6IHJlbW92ZWQgcmNzaWQncy4KLQotRnJpIEp1bCAxNyAxNzowNjo1NiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIGhwcGEqIGluc3RlYWQgb2YgaHBwYQotCi1UaHUgSnVsIDE2IDE2OjM5OjI1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW02OGsuYzogYWRkZWQgUl9SRUxMT05HX05FRyByZWxvYyB0eXBlLCBhbmQgY2hhbmdlZAotCVJUWVBFMkhPV1RPIHRvIGNvcGUgd2l0aCBzYW1lLgotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IGFkZGVkIHN1cHBvcnQgZm9yIHNpemUgb2YgLTIKLQkoc3VidHJhY3QgYSB3b3JkIHJlbG9jIHR5cGUpLiBVcGRhdGVkIGRvYy4KLQotVGh1IEp1bCAxNiAxNjoyODowOSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtZXJnZWQgY2hhbmdlcyBmcm9tIHByb2dyZXNzaXZlLCByZW1vdmVkIHJjc2lkLgotCi0JKiBhcmNodXJlcy5jLCBhcmNoaXZlLmMsIE1ha2VmaWxlLmRvczogcmVtb3ZlZCByY3NpZC4KLQotVGh1IEp1bCAxNiAwODowODoyNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmggOiBhZGQgQkZEX0lTX1JFTEFYQUJMRSBmbGFnCi0JKiBib3V0LmMgKGJvdXRfc3dhcF9leGVjX2hlYWRlcl9baW5fb3V0XSk6IG5ldyBmaWVsZCBpbiBleGVjCi0JaGVhZGVyIGVfcmVsYXhhYmxlLCBtYWpvciBoYWNrZXJ5IGluIGNhbGxiYWNrcwotCSogbGliYW91dC5oIDogYWRkIHNwYWNlIGZvciBhX3JlbGF4YWJsZS4KLQkqIHNlY2xldC5jIChyZWwpOiBkb24ndCByZWxheCBlbXB0eSBzZWN0aW9ucwotCi0KLVdlZCBKdWwgMTUgMDc6NTc6NDYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoU1REX1NFQ1RJT04pOiBhZGQgc29tZSBjYXN0cyB0byB0aGUgaW5pdGlhbGl6ZXJzIGZvcgotCWR1bWIgY29tcGlsZXJzCi0KLVR1ZSBKdWwgMTQgMTQ6MDY6MjggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiAgR3JlYXRseSBzaW1wbGlmeSBleHByZXNzaW9uLAotCWFuZCBhZGQgYXBwcm9wcmlhdGUgY2FzdHMgdG8ga2VlcCAocGljYXl1bmUpIGFpeC1jYyBoYXBweS4KLQotTW9uIEp1bCAxMyAwNTowNjo1MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgTm93IDJuZCBhcmcgaXMgd2hlcmUgdG8gd3JpdGUKLQlzeW1ib2wgcG9pbnRlcnMuICBQdW50IGV4cGVuc2l2ZSAmIHVzZWxlc3MgYmZkX3JlYWxsb2MuICBVc2UKLQltYWxsb2MgZm9yIHJhdyBzeW1ib2xzLCBhbmQgZnJlZSBpdCBiZWZvcmUgcmV0dXJuaW5nLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiAgRG8gbm90IHNsdXJwIHN5bWJvbCB0YWJsZSB1bnRpbCBwb2xpdGVseQotCWFza2VkLiAJRG8gbm90IGV2ZW4gc2x1cnAgc3RyaW5nIHRhYmxlcy4KLQkoZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiAgQ291bnQgJ2VtIHdpdGhvdXQgcmVhZGluZyB0aGVtLgotCShlbGZfZ2V0X3N5bXRhYik6ICBUaGlzIGlzIGhvdyB0byBwb2xpdGVseSBhc2suICBTY2hsdXJwIQotCVRoaXMgc2hvdWxkIHByb2JhYmx5IGp1c3QgKmJlY29tZSogZWxmX3NsdXJwX3N5bWJvbF90YWJsZSwgRklYTUUuCi0KLVdlZCBKdWwgIDggMTY6MjQ6MzMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYnNkX3dyaXRlX2FybWFwKTogd3JpdGUgdGhlIHRpbWVzdGFtcCBvZiB0aGUKLQlhcmNoaXZlIGhlYWRlciB0byBiZSBqdXN0IGEgbGl0dGxlIGJpdCBsYXRlciB0aGFuIHRoZSB0aW1lc3RhbXAgb2YKLQl0aGUgZmlsZSwgb3RoZXJ3aXNlIHRoZSBsaW5rZXIgd2lsbCBjb21wbGFpbiB0aGF0IHRoZSBpbmRleCBpcwotCW91dCBvZiBkYXRlLgotCi1UdWUgSnVsICA3IDAwOjIzOjIzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFkZCBtNjhrLWVyaWNzc29uLSouCi0KLVNhdCBKdWwgIDQgMDM6Mjk6NDEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN5bXMuaDogIERlZmluZSBCU0ZfRklMRSwgdXBkYXRlIEJTRl9TRUNUSU9OX1NZTSBkZXNjLgotCSogZWxmLmM6ICBSZW1vdmUgdW5jb25kaXRpb25hbCBkZWJ1ZyBwcmludGYncy4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cywgZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBIYW5kbGUKLQlCU0ZfU0VDVElPTl9TWU0gPD0+IFNUVF9TRUNUSU9OLCBCU0ZfRklMRSA8PT4gU1RUX0ZJTEUuCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgSGFuZCBvdXQgc3ltYm9scyBpbiBmb3J3YXJkLCBub3QKLQlyZXZlcnNlIG9yZGVyLiAgU2ltcGxpZnkgZHVwbGljYXRlIGNvZGUuCi0KLUZyaSBKdWwgIDMgMjA6MjM6MzQgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiAgUmVtb3ZlICIodm9pZCkiIGNhc3RzIGZyb20gZnVuY3Rpb24gY2FsbHMgd2hlcmUgdGhlCi0JcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQsIGluIGFjY29yZGFuY2Ugd2l0aCBHTlUgY29kaW5nIHN0YW5kYXJkcy4KLQotVHVlIEp1biAzMCAxNjo0OToxMiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jOiAgQXBwbHkgSm9obidzIHN0YW5kYXJkIGZpeCB0byBhdm9pZCAiZW1wdHkgdHJhbnNsYXRpb24KLQl1bml0IiB3YXJuaW5ncyBmcm9tIHNvbWUgQU5TSS1DIGNvbXBpbGVycy4KLQotVGh1IEp1biAyNSAwNDozOToyNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc29sYXJpczIuaDogIENvbmZpZ3VyZSBzYW1lIGFzIHN5c3Y0LgotCi1UdWUgSnVuIDIzIDIxOjU0OjQ0IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBsaWJiZmQuaCwgbGliYmZkLWluLmggKGJmZF9zZWVrKTogIE1ha2UgcHJvdG90eXBlIG1hdGNoIGRlZmluaXRpb24uCi0JKiByZWxvYy5jIChiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cCk6ICBNYWtlIGNhc3Qgb24gcmV0dXJuCi0JdHlwZSBtYXRjaCBhY3R1YWwgcmV0dXJuIHR5cGUuCi0JKiBlbGZfcHJpbnRfc3ltYm9sIChzZWN0aW9uX25hbWUpOiAgTWFrZSBDT05TVC4KLQotTW9uIEp1biAyMiAxNzozNToyNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogaTM4NmxpbnV4LmMsIGhvc3RzL2kzODZsaW51eC5oLCBjb25maWcvaTM4Ni1saW51eC5tdDoKLQlOZXcgZmlsZXMsIGZvciBMaW51eCAoYSBmcmVlIFVuaXggY2xvbmUgZm9yIDM4NiBtYWNoaW5lcykuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluLCB0YXJnZXRzLmM6ICBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLUZyaSBKdW4gMTkgMjA6MjM6MjEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0JTGludHMgZm9yIGJmZF9yZWxvY19jb2RlX3R5cGUtPmJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwgYW5kCi0JY29ycmVjdCBjYWxsaW5nIG9mIGhvd3RvIHNwZWNpYWwgZnVuY3Rpb25zIGFuZCBmaXhlcyBmcm9tIFJhZWJ1cm4KLQlmb3IgZ2FzPD5iZmRuZXNzCi0JKiBhcmNodXJlcy5jOiBudWtlIGJmZF9yZWxvY19jb2RlX3R5cGUKLQkqIGJvdXQuYywgY3B1LWg4MzAwLmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW04OGsuYzogc3BlY2lhbCBmdW5jdGlvbiBsaW50Ci0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IFNUWVBfSU5GTyBpcyBtYXJrZWQgYXMKLQlTRUNfTkVWRVJfTE9BRCwgdmFyaW91cyBvdGhlciBiZmRnYXMgbmV3bmVzcwotCSogcmVsb2MuYy0+bGliYmZkLmg6IGNoYW5nZSBwcm90eXBlIG9mIGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0JKiB0YXJnZXRzLmM6IGNoYW5nZSBqdW1wIHRhYmxlIHZlY3RvciB0byBhYm92ZQotCi0KLUZyaSBKdW4gMTkgMTk6MDA6NDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChiZmRfZWxmX2ZpbmRfc2VjdGlvbik6ICBNYXJrIGFzIElOVEVSTkFMX0ZVTkNUSU9OIHNvCi0JaXRzIHByb3RvdHlwZSB3aWxsIGJlIGluY2x1ZGVkIGluIGxpYmJmZC5oLiAgQ2hhbmdlIHJlc3VsdCB0eXBlCi0JdG8gc3RydWN0ICogKHJhdGhlciB0aGFuIGVxdWl2YWxlbnQgdHlwZWRlZikgc28gaXQgY2FuIGJlIHVzZWQgaW4KLQl0aGUgcHJvdG90eXBlLCB3aGVyZSB0aGV5IHR5cGVkZWYgd29uJ3QgYmUga25vd24uCi0JKiBsaWJiZmQuaDogIFVwZGF0ZWQgdmVyc2lvbi4KLQotRnJpIEp1biAxOSAxNToyMTo1NiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgYXJjaHVyZXMuYywgY29uZmlndXJlLmluLCBjcHUtaHBwYS5jLCBocHBhLmMsIGxpYmhwcGEuaCwKLQl0YXJnZXRzLmM6ICBIUFBBIG1lcmdlLgotCi1GcmkgSnVuIDE5IDEyOjIxOjM4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBTZXBhcmF0ZSBTb2xhcmlzMiBmcm9tIFNZU1Y0IG9uIFNQQVJDLgotCSogY29uZmlnL3NvbGFyaXMyLm1oOiAgS2x1ZGdlIGFyb3VuZCBTdW4gY29tcGlsZXIgYnVnLgotCi1XZWQgSnVuIDE3IDE0OjAyOjQ2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaCAoYW91dF9iYWNrZW5kX2RhdGEpOiAgQ2hhbmdlIGRlZnMgb2YgdHdvIGJpdGZpZWxkcyB0bwotCWJlIHVuc2lnbmVkIGNoYXJzIGluc3RlYWQgdG8gZ2V0IGFyb3VuZCByczYwMDAgY29tcGlsZXIgcHJvYmxlbS4KLQotV2VkIEp1biAxNyAxMzo1NTozMSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkciwgZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6Ci0JQ29ycmVjdCBtaXNjb25jZXB0aW9uIHRoYXQgdGhlcmUgY2FuIGJlIG9ubHkgb25lIHN5bWJvbCB0YWJsZS4KLQlPbmx5IGNhbGwgZWxmX3NsdXJwX3N5bWJvbF90YWJsZSBvbiB0aGUgZnVsbCBzeW1ib2wgdGFibGUsIG5vdAotCXRoZSBkeW5hbWljIG9uZSB3aGljaCBpcyBvbmx5IGEgc3Vic2V0IG9mIHRoZSBmdWxsIG9uZS4KLQotV2VkIEp1biAxNyAxNTo1NDo1NyAxOTkyICBLZW4gUmFlYnVybiAgKFJhZWJ1cm5AQ3lnbnVzLkNPTSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBGb3IgSTk2MCwKLQlkb24ndCBhbGlnbiBzZWN0aW9ucyBpbiBmaWxlLgotCi1UdWUgSnVuIDE2IDA2OjI4OjIxIDE5OTIgIEtlbiBSYWVidXJuICAoUmFlYnVybkBDeWdudXMuQ09NKQotCi0JKiB0YXJnZXRzLmMgKHN0cnVjdCBiZmRfdGFyZ2V0KTogQWRkZWQgZmllbGQgZm9yIHRhcmdldC1zcGVjaWZpYwotCShidXQgbm90IGZpbGUtc3BlY2lmaWMpIGRhdGEsIGZvciBkaXN0aW5ndWlzaGluZyBtaW5vcgotCWNoYXJhY3RlcmlzdGljcyBiZXR3ZWVuIChlLmcuKSBhLm91dCBmb3JtYXRzLgotCi0JKiBzZWN0aW9uLmMgKHN0cnVjdCBzZWMpOiBOZXcgZmllbGQgdXNlcl9zZXRfdm1hIGluZGljYXRlcyB2bWEKLQlmaWVsZCBzaG91bGQgYmUgaGVlZGVkLCBub3QgYXNzdW1lZCB0byBiZSB1bnNldC4KLQkoU1REX1NFQ1RJT04pOiBJbml0aWFsaXplIHRoYXQgZmllbGQgb2Ygc3RhbmRhcmQgc2VjdGlvbnMgdG8gemVyby4KLQkqIGJmZC1pbi5oIChiZmRfc2V0X3NlY3Rpb25fdm1hKTogU2V0IHVzZXJfc2V0X3ZtYSB0byB0cnVlLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcyk6IFdyaXRlIG91dCBzd2FwcGVkIHJlbG9jLCBub3QKLQlwcmUtc3dhcHBlZCB2ZXJzaW9uLgotCi0JKiBhcmNodXJlcy5jIChzdHJ1Y3QgYmZkX2FyY2hfaW5mbyk6IEZpeGVkIG9yZGVyIG9mIGNvbW1lbnQgYW5kCi0JZmllbGQgZGVjbC4gIE5ldyBmaWVsZHMgaW5kaWNhdGUgc2l6ZSBvZiBwYWdlIGFuZCBzZWdtZW50IGZvcgotCWFyY2hpdGVjdHVyZS4KLQkqIGNwdS1tNjhrLmMgKE4pOiBGaWxsIGluIHZhbHVlcy4KLQkqIGNwdS1zcGFyYy5jIChhcmNoX2luZm9fc3RydWN0KTogRGl0dG8uCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogVmFyaW91cyBiaXRzIG9mIGRhdGEgKG5vdAotCWFsbCB1c2VkIGN1cnJlbnRseSkgd2l0aCBjaGFyYWN0ZXJpc3RpY3Mgb2YgYS5vdXQgaW1wbGVtZW50YXRpb24uCi0JSW1wb3J0YW50IGZpZWxkIGZvciBub3cgaXMgdGV4dF9pbmNsdWRlc19oZWFkZXIsIGluZGljYXRpbmcgdGhhdAotCXRoZSB0ZXh0IHNlY3Rpb24gc3RhcnRzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaWxlIGhlYWRlciwgd2hpY2gKLQlnZXRzIG1hcHBlZCBpbiB3aXRoIGl0LgotCShzdHJ1Y3QgYW91dF9kYXRhKTogTmV3IGZpZWxkcyBpbmRpY2F0ZSB3aGV0aGVyIHZtYSBoYXMgYmVlbgotCWFkanVzdGVkIHlldCAobm90IHlldCB1c2VkKSwgYW5kIHdoYXQgbWFnaWMgbnVtYmVyIHdpbGwgYmUgdXNlZCBpbgotCXRoZSBvdXRwdXQgZmlsZSAoc2hvdWxkIGdvIGF3YXkgaW4gZmF2b3Igb2Ygdm1hX2FkanVzdGVkKS4KLQkoV1JJVEVfSEVBREVSUyk6IENvZGUgZm9yIGRlYWxpbmcgd2l0aCBzZWN0aW9uIHNpemVzIGFuZCByZWxhdGVkCi0JaGVhZGVyIGZpZWxkcyByZXBsYWNlZCB3aXRoIGNhbGwgdG8gYWRqdXN0X3NpemVzX2FuZF92bWFzLgotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogRmlsbCBpbiBtYWdpYyBudW1iZXIgZmllbGQuCi0JU2V0IFdQX1RFWFQgZmxhZyBmb3IgWk1BR0lDIGFzIHdlbGwgYXMgTk1BR0lDIGZpbGVzLgotCShzZXRfYXJjaF9tYWNoKTogU2V0IHBhZ2Ugc2l6ZSBhbmQgc2VnbWVudCBzaXplIG9uY2UgQ1BVCi0JdHlwZSBpcyBrbm93bi4KLQkoYWRqdXN0X3NpemVzX2FuZF92bWFzKTogTmV3IGZ1bmN0aW9uOyBoYXMgbXVjaCBjb2RlIG1vdmVkCi0JZnJvbSBzZXRfc2VjdGlvbl9jb250ZW50cyBhbmQgV1JJVEVfSEVBREVSUy4gIFNldHMgb3IgYWRqdXN0cyB2bWEKLQlhbmQgc2l6ZSBwYXJhbWV0ZXJzLCBhcyB3ZWxsIGFzIG1hbnkgaGVhZGVyIGZpZWxkcywgYWZ0ZXIgZGVjaWRpbmcKLQlvbiBtYWdpYyBudW1iZXIgZm9yIG91dHB1dCBmaWxlLiAgQ2hlY2tzIHRvIGVuc3VyZSB0aGF0IHRoaXMKLQlhZGp1c3RtZW50IGhhcyBvbmx5IGJlZW4gZG9uZSBvbmNlLgotCShzZXRfc2VjdGlvbl9jb250ZW50cyk6IENhbGwgYWRqdXN0X3NpemVzX2FuZF92bWFzIGluc3RlYWQgb2YKLQlkb2luZyBtdWNoIG9mIHRoZSB3b3JrIGhlcmUuCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX21ha2VfZGVidWdfc3ltYm9sLCBNWV9iYWNrZW5kX2RhdGEpOiBQcm92aWRlCi0JZGVmYXVsdCAobnVsbCkgdmFsdWVzIG9mIHRoZXNlIGZpZWxkcy4KLQkqIGFvdXRmMS5oIChzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3Qgb3ZlcnJpZGUgYV90ZXh0Ci0JdmFsdWUgaW4gZXhlYyBoZWFkZXIuCi0JKHN1bm9zNF9hb3V0X2JhY2tlbmQsIE1ZX2JhY2tlbmRfZGF0YSk6IERlZmluZSBiYWNrZW5kIGRhdGEKLQlpbmRpY2F0aW5nIGZpbGUgaGVhZGVyIGlzIGluY2x1ZGVkIGluIHRleHQgc2VjdGlvbi4KLQotCSogYW91dGYxLmggKE1ZX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwKTogRml4IHR5cG8uCi0KLQkqIGhvc3RzL3NwYXJjLmggKGFib3J0LCBleGl0KTogSGlkZSB0aGVzZSBuYW1lcyBpZiBjb21waWxpbmcgd2l0aAotCWdjYyB2ZXJzaW9uIDIsIHRvIGF2b2lkIHdhcm5pbmdzLgotCi1Nb24gSnVuIDE1IDEyOjI2OjU2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbmNyMzAwMC5taCAoSU5TVEFMTCwgUkFOTElCKTogIERvbid0IHVzZSAvdXNyL3VjYi9pbnN0YWxsLAotCWl0J3MgYnJva2VuIG9uIG5jciAzMDAwJ3MuICBVc2Ugc2ltcGxlICJ0cnVlIiBmb3IgUkFOTElCLgotCi1TYXQgSnVuIDEzIDA5OjE2OjQzIDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobTY4MFswMTIzNF0wLXdycy0qKTogRml4IHR5cG8gaW4gbWF0Y2ggcGF0dGVybi4KLQotRnJpIEp1biAxMiAxOTo0ODozNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChTVERfU0VDVElPTik6ICBSZW1vdmUgZXh0cmEgc2VtaWNvbG9uIGluIGRlY2xhcmF0aW9ucy4KLQkqIGNvbmZpZ3VyZS5pbjogIFJld3JpdGUgdGFyZ2V0IHBhcnNpbmcgdG8gdXNlIHNpbXBsZSBmb3JtYXQuCi0JSGFuZGxlIHNwYXJjLXN1bi1zb2xhcmlzMiBjb25maWd1cmF0aW9uLgotCSogYW91dDY0Lmg6ICBBdm9pZCBBTlNJIEMgYnJhaW4gZGVhdGggd2FybmluZy4KLQkqIGVsZi5jOiAgQXZvaWQgdHJpZ3JhcGggKD8/Pykgb3IgLyogaW4gY29tbWVudHMuCi0KLUZyaSBKdW4gMTIgMTQ6NTE6MTQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvc3lzdjQubWg6IG5ldyBmaWxlLCBSQU5MSUI9ZWNobwotCi0JKiBjb25maWd1cmUuaW46IGhhbmRsZSBTb2xhcmlzMiBhcyAtc3lzdjQgb3IgLXNvbGFyaXMyCi0KLVRodSBKdW4gMTEgMDA6NTI6MDMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfb2JqX3RkYXRhKTogIE1lcmdlIGVsZl9vYmpfdGRhdGFfc3RydWN0IGFuZAotCWVsZl9jb3JlX3RkYXRhX3N0cnVjdCBpbnRvIGEgc2luZ2xlIGNvbW1vbiBzdHJ1Y3QuICBDb3JlIGZpbGVzCi0Jd291bGRuJ3QgaGF2ZSB3b3JrZWQgYXQgYWxsIHdpdGhvdXQgdGhpcy4KLQkoYmZkX2VsZl9maW5kX3NlY3Rpb24pOiAgTmV3IGZ1bmN0aW9uIGZvciBHREIncyB1bmRlcmNvdmVyIHVzZQotCXRvIGZpbmQgc3RyaW5nIHNlY3Rpb25zIHRoYXQgQkZEIGhpZGVzIGZyb20gaXQuCi0JKGVsZl9nZXRfc3RyX3NlY3Rpb24pOiAgQXZvaWQgbXVsdGlwbGUgYWxsb2MmcmVhZHMgZm9yIHNhbWUgZGF0YTsKLQlsaW50LgotCShlbGZfb2JqZWN0X3AsIGVsZl9jb3JlX2ZpbGVfcCk6ICBBbGxvY2F0ZSBpbnRlcm5hbCBmaWxlIGhlYWRlcgotCXN0b3JhZ2UgZHluYW1pY2FsbHkuCi0JKiBiZmQuYyAodW5pb24gey4uLn0gdGRhdGEpOiAgUmVtb3ZlIGVsZl9jb3JlX3RkYXRhX3N0cnVjdC4KLQkqIGRlbW82NC5jOiAgUHJldmVudCAiZW1wdHkgdHJhbnNsYXRpb24gdW5pdCIgd2FybmluZ3MgZnJvbSBpZGlvdHMuCi0KLVR1ZSBKdW4gIDkgMTc6MTU6MjYgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy97aTM4NnY0Lm1oLCBuY3IzMDAwLm1ofTogIFVwZGF0ZSBSQU5MSUIsIGFkZCBJTlNUQUxMLgotCi1TYXQgSnVuICA2IDE3OjAyOjUxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBIYW5kbGUgU29sYXJpczIgYXMgKi1zdW4tc3lzdjQgb3IgYXMgKi1zdW4tc3Vub3M1LgotCi1TdW4gTWF5IDMxIDA1OjQ1OjAwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogaGFuZGxlIG02ODBbMDEyMzRdMCBhcyBhbGlhc2VzIGZvciBtNjhrCi0KLVR1ZSBNYXkgMjYgMTY6NTA6NTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYTI5ay5jOiBkbyBieXRlIHJlbG9jcyBjb3JyZWN0bHkKLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogbmV2ZXIgbG9hZCBJTkZPIHNlY3Rpb25zCi0JKiBzZWNsZXQuYyAocmVsKTogZG9uJ3QgcmVsb2NhdGUgSU5GTyBzZWN0aW9ucwotCi1XZWQgTWF5IDIwIDA4OjE4OjE4IDE5OTIgIEtlbiBSYWVidXJuICAoUmFlYnVybkBDeWdudXMuQ09NKQotCi0JKiBzZWN0aW9uLmMgKGJmZF8qX3N5bWJvbCwgYmZkXypfc2VjdGlvbik6IEluaXRpYWxpemUgc3RhdGljYWxseS4KLQlNYWtlIHRoZSBzeW1ib2xzIHVubW9kaWZpYWJsZS4KLQkoYmZkX3NlY3Rpb25faW5pdCk6IERlbGV0ZWQuCi0JKiBpbml0LmMgKGJmZF9pbml0KTogRG9uJ3QgY2FsbCBiZmRfc2VjdGlvbl9pbml0LgotCi0JKiBzZWN0aW9uLmMgKGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEVuc3VyZSB0aGF0IHJhbmdlIHRvIGJlCi0Jd3JpdHRlbiBpcyB3aXRoaW4gc2VjdGlvbiBib3VuZGFyaWVzLgotCShiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4gIERvbid0IGJvdGhlciBkaXNwYXRjaGluZyBpZgotCXNpemUgaXMgemVyby4KLQotCSogbGliYmZkLmMgKGJmZF94bWFsbG9jKTogVGV4dCBvZiBlcnJvciBtZXNzYWdlIHNob3VsZCBiZSBjb25zdC4KLQotCSogY29mZi1pOTYwLmMgKGhvd3RvX3RhYmxlKTogRGVsZXRlZC4KLQkoaG93dG9fcmVsbG9uZywgaG93dG9faXBybWVkLCBob3d0b19vcHRjYWxsKTogTmV3IHZhcnM7Ci0JaW50ZXJlc3RpbmcgZW50cmllcyBmcm9tIG9sZCBob3d0b190YWJsZS4KLQkoUlRZUEUySE9XVE8pOiBBZGp1c3RlZCB0byB1c2Ugc3dpdGNoLgotCShjb2ZmX2k5NjBfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IEFsbG9jYXRlIHN0b3JhZ2UgZm9yIGF1eAotCXJlY29yZHMgZm9yIHNlY3Rpb24gc3ltYm9sLgotCShtYWtlX2Fic19zZWN0aW9uKTogVW51c2VkOyBkZWxldGVkLgotCShyZW51bWJlcl9zeW1ib2xzKTogUmUtb3JkZXIgc3ltYm9scyBzbyB1bmRlZmluZWQgc3ltYm9scyBjb21lCi0JbGFzdCwgYXMgQ09GRiBmb3JtYXQgZGVzaXJlcy4KLQkoY29mZl93cml0ZV9zeW1ib2wpOiBQdXQgQ19GSUxFIHN5bWJvbHMgaW4gZGVidWcgc2VjdGlvbiBhbHdheXMuCi0JKGNvZmZfc2VjdGlvbl9zeW1ib2wpOiBOZXcgZnVuY3Rpb247IGNyZWF0ZXMgYSBzeW1ib2wgd2l0aCB0aGUKLQlzYW1lIG5hbWUgYXMgYSBzZWN0aW9uLCBhbmQgc2V0cyB1cCBhdXggcmVjb3JkcyBmb3IgaXQuCi0JKGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scyk6IE5ldyBmdW5jdGlvbjsgYWRkcyBzZWN0aW9uIHN5bWJvbHMgdG8KLQlzeW1ib2wgdGFibGUgaWYgdGhleSBhcmVuJ3QgdGhlcmUgYWxyZWFkeS4gIFNob3VsZCBzb21lZGF5IGFsc28KLQlhZGQgYSBkdW1teSBDX0ZJTEUgc3ltYm9sIGlmIG5vbmUgaXMgcHJlc2VudC4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBBZGQgbWlzc2luZyBzeW1ib2xzIGJlZm9yZSBwcmVwYXJpbmcKLQlzeW1ib2wgdGFibGUgdG8gYmUgd3JpdHRlbi4KLQkoY29mZl9zbHVycF9yZWxvY190YWJsZSk6IFZlcmlmeSB0aGF0IHN5bWJvbCBpbmRpY2VzIHJlYWQgaW4gYXJlCi0JaW4gYSByZWFzb25hYmxlIHJhbmdlLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl90ZGF0YSk6IE5ldyBmaWVsZCBjb252X3RhYmxlX3NpemUuCi0JKG9ial9jb252X3RhYmxlX3NpemUpOiBBY2Nlc3NvciBtYWNyby4KLQotCSogYm91dC5jIChiX291dF9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4gIEhhbmRsZXMgdGhyZWUKLQlyZWxvYyB0eXBlcyBvbiBpOTYwLgotCi0JKiBiZmQtaW4uaCAoYmZkX2dldF9zZWN0aW9uX25hbWUpOiBOZXcgbWFjcm8uICBMaWtlCi0JYmZkX3NlY3Rpb25fbmFtZSwgYnV0IHJldHVybnMgcnZhbHVlLCBub3QgbHZhbHVlLgotCShiZmRfZ2V0X3NlY3Rpb25fdm1hLCBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50KTogU2ltaWxhci4KLQkoYmZkX2dldF9zZWN0aW9uX2ZsYWdzKTogTm93IHJldHVybnMgcnZhbHVlLgotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBBZGQgc2V2ZXJhbCBuZXcgdmFsdWVzLCBzb21lCi0JZ2VuZXJhbCwgc29tZSBzcGVjaWZpYyB0byBzcGFyYyBvciBpOTYwLgotCi0JKiBhb3V0eC5oIChzZXRfc2VjdGlvbl9jb250ZW50cyk6IFNldCBWTUEgZm9yIGVhY2ggc2VjdGlvbiBiYXNlZAotCW9uIHByZXZpb3VzIHNlY3Rpb24uICBJZiB0ZXh0IHNlY3Rpb24gVk1BIGRvZXNuJ3QgYXBwZWFyIHRvIGhhdmUKLQliZWVuIHNldCwgbWFrZSBhIGJlc3QgZ3Vlc3MgZnJvbSB0aGUgdHlwZSBvZiBmaWxlLgotCi0JKiBhb3V0LXRhcmdldC5oIChNWV9yZWxvY19ob3d0b190eXBlX2xvb2t1cCk6IERlZmluZSBhcyB6ZXJvIGlmCi0Jbm90IGRlZmluZWQuCi0JKE1ZKHZlYykpOiBJbml0aWFsaXplIHJlbG9jX3R5cGVfbG9va3VwIGZpZWxkLgotCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV8qKTogRXhwb3J0IGFzIGFvdXRfI18qX2hvd3RvX3RhYmxlLgotCShiZmRfZXJyb3JfdHJhcCwgYmZkX2Vycm9yX3ZlY3Rvcik6IEV4dGVybiwgbm90IGNvbW1vbi4KLQotCSogYW91dGYxLmggKHN1bm9zNF9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4gIEhhbmRsZXMgYQotCWZldyB0eXBlcyBvZiByZWxvY3MgZm9yIHNwYXJjOyB3aWxsIG5lZWQgZW5oYW5jZW1lbnQuCi0KLQkqIGJvdXQuYyAoY2FsbGpfY2FsbGJhY2spOiBVc2UgREVGVU4gbWFjcm8gaW4gZGVmaW5pdGlvbi4KLQkqIGNvZmYtaTk2MC5jIChvcHRjYWxsX2NhbGxiYWNrKTogTGlrZXdpc2UuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZGVkIGZpZWxkcyByZWxvY190eXBlX2xvb2t1cCBhbmQKLQlfYmZkX21ha2VfZGVidWdfc3ltYm9sLiAgQWxzbyBtaW5vciBjb21tZW50IGNoYW5nZXMuCi0JKiBzeW1zLmMgKGJmZF9tYWtlX2RlYnVnX3N5bWJvbCk6IE5ldyBkaXNwYXRjaGluZyBtYWNyby4KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY190eXBlX2xvb2t1cCk6IFRha2UgYSBCRkQgcHRyIGFzIGFyZyByYXRoZXIKLQl0aGFuIGFyY2ggaW5mbywgYW5kIGRpc3BhdGNoIHdpdGggQkZEX1NFTkQuICBDYWxsZXJzIGNoYW5nZWQuCi0JKiBhcmNodXJlcy5jIChzdHJ1Y3QgYmZkX2FyY2hfaW5mbyk6IERlbGV0ZWQgZmllbGQKLQlyZWxvY190eXBlX2xvb2t1cC4KLQkqIGNwdS0qLmM6IERvbid0IGluaXRpYWxpemUgdGhhdCBmaWVsZC4KLQotCSogYmZkLWluLmggKGVudW0gYmZkX2Vycm9yKTogQWRkIG5ldyB2YWx1ZSAiYmFkX3ZhbHVlIi4KLQkqIGJmZC5jIChiZmRfZXJybXNncyk6IE5vdyBjb25zdDsgYWRkZWQgZW50cnkgZm9yIGJhZF92YWx1ZS4KLQkoYmZkX2Vycm1zZyk6IE5vdyByZXR1cm5zIHB0ciB0byBjb25zdC4KLQkqIGJmZC1pbi5oIChiZmRfZXJybXNnKTogRml4IHByb3RvdHlwZS4KLQotCSogY2FjaGUuYyAoQkZEX0NBQ0hFX01BWF9PUEVOKTogRml4IHR5cG8gaW4gZG9jLgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbik6IERpdHRvLgotCi0JKiBzZWN0aW9uLmMgKFNlY3Rpb24gT3V0cHV0IGRvYyk6IEltcHJvdmUgZGVzY3JpcHRpb24gb2YgdXNlIG9mCi0Jb3V0cHV0X3NlY3Rpb24gYW5kIG91dHB1dF9vZmZzZXQuCi0KLVR1ZSBNYXkgMTkgMjM6NDI6MTAgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBzY28tY29yZS5jOiBuZXcgZmlsZSBmcm9tIG5ldC4KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogYnVnZml4IGZyb20gbmV0OgotCSAgTm93IHdlIGhhdmUgdGhlIGhhaXJ5IGxpbmtlciwgaXQncyBwb3NzaWJsZSB0byBtb3ZlIHN5bWJvbHMgZnJvbQotCSAgb25lIHNlY3Rpb24gaW50byBhbm90aGVyLiAgQWN0dWFsbHkgbWFrZSB0aGF0IHdvcmshCi0KLVNhdCBNYXkgMTYgMTc6NTc6NTkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdW4zLmg6IGZpeCBkZWNsYXJhdGlvbiBvZiBmcmVlLgotCi1UdWUgTWF5IDEyIDE0OjA4OjU5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWEyOWsuYyAocGVyZm9ybV9yZWxvYyk6IGZpeCBidWcgaW4gam1wL2NhbGwgZXZhbHVhdGlvbgotCSogY29mZi1oODMwMC5jIChyZWxvY19wcm9jZXNzaW5nKTogYWxsIHJlbG9jcyBhcmUgcmVsYXRpdmUgdG8KLQlzZWN0aW9uIHN0YXJ0LgotCSogb3BuY2xzLmM6IGRvbid0IHVzZSBmZG9wZW4gb24gRE9TIHN5c3RlbXMKLQotCXNob3J0IHBhdGNoZXMgZnJvbSBHbGVubiBLYXN0ZW4gKGdsZW5uQHJlYWR5LmNvbSkKLQkqIHRhcmdldC5jOiBlbmFibGVkIG9hc3lzIHN1cHBvcnQKLQkqIG9hc3lzLmM6ICBJbnNlcnQgLiB3aGVuIFVOREVSU0NPUkVfSEFDSyBpcyBlbmFibGVkLAotCWZpeCBwcm9ibGVtIHdoZXJlIGEgcmVsb2NhdGlvbiB3aGljaCBjcm9zc2VkIGEgbW9kaWZpY2F0aW9uIGJ5dGUKLQlib3VuZGFyeSBkaWQgbm90IHdvcmsuIEZpeCBwcm9ibGVtIHdoZXJlIGEgcmVsb2NhdGlvbiBuZWFyIHRoZSBlbmQKLQlvZiBhIGRhdGEgcmVjb3JkIGRpZCBub3Qgd29yay4KLQotCi1UdWUgTWF5ICA1IDE4OjExOjI1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJmZF9zbHVycF9jb2ZmX2FybWFwKTogb2xkIHZlcnNpb25zIG9mIEJGRCB3cm90ZQotCWFyY2h2aWUgaGVhZGVyIHN0cmluZyBjb3VudHMgdGhlIGVuZGlhbiB3YXksIHRoaXMgaGV1cmlzdGljIHNlZXMKLQlob3cgYmlnIGFuIGFyY2hpdmUgc3RyaW5nIHRvIHJlYWQgYnkgdHJ5aW5nIGl0IG9uZSB3YXkgYW5kIGlmIHRoZQotCXN0cmluZyB0YWJsZSBpcyB1bnJlYXNvbmFibHkgYmlnLCB0cnlpbmcgaXQgdGhlIG90aGVyLiAqRklYTUUqLgotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogY2FuJ3QgZG8gZmRvcGVucyBvbiBWTVMKLQotVHVlIE1heSAgNSAxNDoxODoyNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oOiAgSW5jcmVhc2UgdmVyc2lvbiBudW1iZXIgdG8gMS45NywgZm9yIGNvbnNpc3RlbmN5Ci0Jd2l0aCAuLi9iaW51dGlscy4KLQkqIE1ha2VmaWxlLmluOiAgZG9jZGlyIGlzIC4vZG9jLCBub3QgJHtzcmNkaXJ9L2RvYy4KLQotTW9uIE1heSAgNCAxMTo0OToxNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGJmZC1pbi5oOiBidW1wIHZlcnNpb24gdG8gMS45NgotICAgICAgICAgTWFqb3IgY2hhbmdlOyBjaGFuZ2VkIGNhbGxpbmcgY29udmVudGlvbiBmb3IKLQkgYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBzbyB0aGF0IGNhbGxlciBhbGxvY2F0ZXMKLQkgbWVtb3J5IGZvciBzZWN0aW9uIGRhdGEuCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpLCByZWxvYy5jLAotCXNlY2xldC5jLCB0YXJnZXRzLmMsIGJmZC5jOiByZWZsZWN0IG5ldyBjb252ZW50aW9uLgotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBpZiBzdHlwX2ZsYWdzIGlzIG5vdCBhIHNwZWNpYWwKLQljYXNlLCB0aGVuIHVzZSByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWVzIGZvciBTRUNfKiBmbGFncy4KLQotRnJpIE1heSAgMSAxMjo1ODozNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiB1c2UgUkVMU1ogdG8gd29yayBvdXQKLQlzaXplIG9mIG91dHB1dCByZWxvYyBzdHJ1Y3QuCi0JKiB0YXJnZXRzLmMsIE1ha2VmaWxlLmluOiBjb21tZW50IG91dCB0ZWtoZXggZm9yIHRoZSBtb21lbnQuCi0JKiBpZWVlLmM6IGlmIHNvbWUgcGxhY2VzIHdoZXJlIG51bGwgcG9pbnRlcnMgd2VyZSB1c2VkIGluc3RlYWQgb2YgJmJmZF9hYnNfc2VjdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbjogdGFuZGVtIHRhcmdldCBpcyBzdDIwMDAKLQkqIGNvZmYtbTY4ay5jOiByZW5hbWUgc3RhdGljIGhvd3RvX3RhYmxlIHRvIGdsb2JhbAotCW02OGtjb2ZmX2hvd3RvX3RhYmxlLgotCSogYm91dC5jOiByZW1vdmUgdW5uZWNlc3NhcnkgYWJvcnQKLQkqIGNvZmYtYTI5ay5jOiB2YXJpb3VzIGNoYW5nZXMgdG8gdGhlIHdheSByZWxvY2F0aW9ucyB3b3JrIHRvIGNvcGUKLQl3aXRoIHRoZSAibmV3IG9yZGVyIiBhbmQgbGF0ZW50IGJ1Z3MuCi0JKiBjb2ZmY29kZS5oOiBsaW50Ci0KLVdlZCBBcHIgMjkgMTI6Mzc6MDcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfc3dhcF9leHRfcmVsb2Nfb3V0LCBhb3V0X3N3YXBfc3RkX3JlbG9jX291dCkKLQlib3V0LmMgKGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKTogdHJlYXQgYWJzIHN1bWJvbHMgdGhlIHJpZ2h0IHdheS4KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtLXJlbG9jYXRpb24pOiBkb24ndCByZWxvY2F0ZSByZWZzIHRvCi0JYWJzb2x1dGUgc3ltYm9scyBpZiBkb2luZyBhIHBhcnRpYWwgbGluay4KLQotRnJpIEFwciAyNCAwNzozNToyNiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgYTI5ay1hbWQtdWRpLgotCi1UaHUgQXByIDIzIDE4OjM3OjU1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0XzxiaXRzPl9zd2FwX2V4ZWNfaGVhZGVyX2luKTogIFplcm8gb3V0IHRoZQotCWludGVybmFsX2V4ZWMgc3RydWN0dXJlIGJlZm9yZSBpbml0aWFsaXppbmcgdGhlIGZpZWxkcyB0aGF0Ci0JYXJlIHVzZWQsIHNvIHRoYXQgdGhlIHVudXNlZCBmaWVsZHMgYXJlIGluIGEga25vd24gc3RhdGUuCi0KLVdlZCBBcHIgMjIgMDk6MzY6MDggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHRla2hleC5jIChzdHJ1Y3QgZGF0YV9zdHJ1Y3QpOiAgQ29udmVydCBmcm9tIHR5cGVkZWYgdGhhdAotCXR5cGVkZWZzIG5vdGhpbmcgdG8gYSBub3JtYWwgc3RydWN0dXJlIGRlY2xhcmF0aW9uLgotCSogdGVraGV4LmMgKHBhc3Nfb3Zlcik6ICBQcm90b3R5cGUgYXJncyBmb3IgZnVuY3Rpb24gdGhhdAotCXNlY29uZCBhcmcgcG9pbnRzIHRvLgotCi1Nb24gQXByIDIwIDIyOjIyOjUxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBvbGQgc3R5bGUgc3RhZ2luZy4gIERvIG5vdCBwcmludCByZWN1cnNpb24KLQkgIGxpbmVzLgotCi0JKiBNYWtlZmlsZS5pbjogcmV3b3JrIENGTEFHUyBzbyB0aGF0IENGTEFHUyBjYW4gYmUgcGFzc2VkIGZyb20gdGhlCi0JICBNYWtlZmlsZSBjb21tYW5kIGxpbmUuICBSZW1vdmUgTUlOVVNfRy4gIERlZmF1bHQgQ0ZMQUdTIHRvIC1nLgotCSAgUGFzcyBDRkxBR1MuCi0KLUZyaSBBcHIgMTcgMDk6MTU6MzEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jLCBNYWtlZmlsZS5pbjogYWRkZWQgdGVraGV4Ci0JKiBhb3V0eC5oIChzZXRfc2VjdGlvbl9jb250ZW50cyk6IHBhZ2VzIHNob3VsZCBiZSBwYWRkZWQgdG8gdGhlCi0Jc2l6ZSBvZiBhIHBhZ2UsIG5vdCB0aGUgc2l6ZSBvZiBhIHNlZ21lbnQuCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIGdvMzIgaG9zdCBhbmQgaTM4Ni1hb3V0IHRhcmdldC4KLQkqIGkzODZhb3V0LmMsIGxpYmFvdXQuaDogbm93IHdvcmtzIGZvciBnbzMyIHRhcmdldAotCSogaWVlZS5jOiBmaXggYml0IHJvdC4KLQkqIHNlY2xldC5jOiBzdXBwb3J0IGZvciBwYWRkaW5nIHNlY2xldCB0eXBlLgotCi1XZWQgQXByIDE1IDE4OjExOjU4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIC5OT0VYUE9SVDoKLQotVHVlIEFwciAxNCAxNDozNDo0MiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGJmZF9hZGRfc3RydGFiLCBiZmRfYWRkXzJfdG9fc3RydGFiKTogIENPTlNUIHNwcmVhZHMKLQlsaWtlIG9vemUuCi0JKiBlbGYuYyAoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywKLQllbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogIFJldHVybiBib29sZWFuLCBub3QgTlVMTCAod2hpY2gKLQljYW4gYmUgdm9pZCAqKS4KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiAgSWZkZWYtb3V0IGRlYnVnZ2luZyBjb2RlLgotCUFsc28gaWZkZWYtb3V0IGNvZGUgdGhhdCBhYm9ydHMgb24gdW5oYW5kbGVkIHNlY3Rpb24gdHlwZXMuCi0KLUZyaSBBcHIgMTAgMjI6Mjk6MTggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlY29nbml6ZSBuY3IzMDAwIGNvbmZpZwotCSogTWFrZWZpbGUuaW4gKE1JTlVTX0cpOiAgUGFzcyBvbiB0byByZWN1cnNpdmUgbWFrZXMuCi0JKiBob3N0cy9uY3IzMDAwLmgsIGNvbmZpZy9uY3IzMDAwLm1oOiAgQWRkIGhvc3QgY29uZmlnIGZpbGVzLgotCi1UaHUgQXByICAyIDE3OjQyOjQ1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIE5vdyB0aGF0IHdlIGhhdmUgc3ltLmggYW5kIHN5bWNvbnN0LmgsIGNvbXBpbGUKLQljb2ZmLW1zeW0uYyBvbiBhbGwgc3lzdGVtcy4KLQkqIGNvbmZpZy97ZGVjc3RhdGlvbi5taCwgaXJpeDMubWgsIGlyaXg0Lm1ofTogIFJlbW92ZSBjb2ZmLW1zeW0ubyBkZXAuCi0JKiBjb2ZmLW1zeW0uYzogIFVwZGF0ZSBpbmNsdWRlIGZpbGVzIGFuZCBjb21tZW50czsgYWRkIHdlYWtleHQgYml0LgotCi1XZWQgQXByICAxIDIzOjE2OjM4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMsIGJmZC5jLCBib3V0LmMsIGNvZmZjb2RlLmgsIGluaXQuYywgcmVsb2MuYywKLQlzZWN0aW9uLmMsIHNyZWMuYywgc3ltcy5jLCBjb2ZmLWg4MzAwLmM6ICBMaW50LgotCi1TdW4gTWFyIDI5IDA5OjM3OjU5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBib3V0LmMsIGNvZmYtYTI5ay5jLCBjb2ZmLWk5NjAuYzogIExpbnQuCi0JKiBjb25maWd1cmUuaW46ICBBZGQgbmV3IGhvc3QgYW5kIHRhcmdldCBjb25maWdzLgotCSogZWxmLmMgKGJmZF9wcnN0YXR1cywgYmZkX2ZwcmVnc2V0KTogIEF2b2lkIHR5cGVuYW1lIG9mIHJlZ2lzdGVyCi0Jc3RydWN0cywgd2hpY2ggdmFyeTsganVzdCB1c2UgbWVtYmVyIG5hbWUuCi0JKGVsZl9vYmplY3RfcCwgZWxmX2NvcmVfZmlsZV9wKTogIExpbnQsIGZpeCBjb21tZW50cy4KLQkqIGNvbmZpZy9zcGFyYy1lbGYubXQsIGhvc3RzL3N5c3Y0Lmg6ICBOZXcgY29uZmlnIGZpbGVzLgotCi1TYXQgTWFyIDI4IDEzOjA3OjAyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoZWxmX29iamVjdF9wLCBlbGZfY29yZV9maWxlX3ApOiAgRml4IHRvIHVzZSBvbmx5IGEgc2luZ2xlCi0JbG9jYWwsIGRpc3Bvc2FibGUsIGNvcHkgb2YgdGhlIGV4dGVybmFsIGZvcm0gb2Ygc2VjdGlvbiBoZWFkZXIKLQl0YWJsZSBhbmQgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllcy4KLQotVGh1IE1hciAyNiAxNjo1OTo1OCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBTZXQgTUlOSU1JWkUgYmFjayB0byAwIGZvciBhIHJlYWwgcmVsZWFzZS4KLQotVHVlIE1hciAyNCAxNTo1NzowMyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBjb25maWcvaXJpeDQubVtodF0sIGhvc3RzL2lyaXg0Lmg6IGFkZCBzdXBwb3J0IGZvcgotCSAgaXJpeDQuCi0KLU1vbiBNYXIgMjMgMjI6Mzc6MzQgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1tc3ltLmMgKGVjb2ZmX3N3YXBfcmZkX2luKTogIHJlbW92ZSAmIGZvciBhcnJheSByZWYuCi0KLVR1ZSBNYXIgMTcgMTQ6MTI6MjUgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGJfb3V0X3NsdXJwX3JlbG9jX3RhYmxlKTogIFVzZSBCRkRfQVNTRVJUIG1hY3JvLAotCW5vdCBpbnRlcm5hbCBiZmRfYXNzZXJ0IGZ1bmN0aW9uICh0d2ljZSkuCi0KLVR1ZSBNYXIgMTcgMTA6NDU6MTIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0Lmg6IGNoYW5nZSBhcl9tYXhfbmFtZWxlbiB0byAxNSAodGhlIHJpZ2h0IHZhbHVlKQotCSogY29mZi1hMjlrLCBjb2ZmY29kZS5oOiBtb3JlIGhhbmdvdmVycyBmcm9tIHRoZSBiZmRfYWJzX3NlY3Rpb24KLQljaGFuZ2UKLQotTW9uIE1hciAxNiAxNDo1NzoyMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BydGwuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBjaGVjayBmb3IgYm91dCBhcmNoaXZlcyB0b28uCi0JKiBib3V0LmM6IG1ha2UgaXQgd29yayBhZ2Fpbi4KLQotU2F0IE1hciAxNCAxNzozMDo0MCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl9jb3JlZmlsZV9ub3RlKTogIENhbGwgYmZkX3htYWxsb2MoKSBpbnN0ZWFkIG9mIGJhcmUKLQltYWxsb2MoKS4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6ICBDYWxsCi0JYmZkX3htYWxsb2MoKSBpbnN0ZWFkIG9mIGJhcmUgbWFsbG9jKCkuCi0KLUZyaSBNYXIgMTMgMTU6NDQ6MzcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBwYXNzIGRvd24gTUFLRUlORk8gb24gaW5mby4KLQotRnJpIE1hciAxMyAwNzo0MToxMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL210LTxmb28+IG5vdyA8Zm9vPi5tdCwgY29uZmlnL21oLTxmb28+IG5vdyA8Zm9vPi5taC4KLQlob3N0L2gtPGZvbz4gbm93IGp1c3QgPGZvbz4uCi0JKiBjb25maWd1cmUuaW46IHJlZmxlY3QgY2hhbmdlcwotCi1UaHUgTWFyIDEyIDExOjE1OjAyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBsaWJiZmQtaW4uaCAoc2V0X3RkYXRhKTogIE1ha2UgY2hhbmdlIG9mIEZlYiAyNyBpbiB0aGUKLQlhY3R1YWwgc291cmNlIGZpbGUsIG5vdCBqdXN0IHRoZSBnZW5lcmF0ZWQgbGliYmZkLmguCi0KLVNhdCBNYXIgIDcgMTA6MzM6NDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTk2MC5jIChpY29mZl9saXR0bGVfdmVjKTogYWRkIENPRkZfU1dBUF9UQUJMRSBzbyB3ZSBjYW4gcnVuCi0JZ2RiIG9uIGxpdHRsZS1lbmRpYW4gOTYwIGNvZGUuCi0JKiBhcmNoaXZlLmMgKGNvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogaW5kaXJlY3Qgc3ltYm9scyBzaG91bGQgZ28KLQlpbnRvIHRoZSBhcmNoaXZlIGhlYWRlciB0b28uCi0KLUZyaSBNYXIgIDYgMjE6NTU6MTYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjaGVjayB0YXJnZXQuCi0KLVRodSBNYXIgIDUgMjM6NTE6NDIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbXN5bS5jOiAgTW92ZSB0aGlzIGZpbGUgZnJvbSBnZGIvZWNvZmYuYy4gIEl0Ci0JaGFuZGxlcyBieXRlLXN3YXBwaW5nIGZvciBFQ09GRiAoTUlQUyBzeW1ib2wpIGZpbGVzLgotCSogY29uZmlnL21oLWRlY3N0YXRpb24sIGNvbmZpZy9taC1pcml4MzogIEFkZCBjb2ZmLW1zeW0ubwotCXRvIHRoZSBmaWxlcyBidWlsdCBvbiBNSVBTLWJhc2VkIGhvc3RzLgotCSogTWFrZWZpbGUuaW46ICBBZGQgcnVsZSBmb3IgY29mZi1tc3ltLgotCi1UaHUgTWFyICA1IDIxOjM2OjA1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2xlYW4taW5mbyB0YXJnZXQuICBNSU5JTUlaRT0xLgotCi1TdW4gTWFyICAxIDIyOjMyOjU4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb2ZmLXJzNjAwMC5jOiAgTW92ZSBjb3JlIGZpbGUgZnVuY3Rpb25zIGludG8gc2VwYXJhdGUKLQluZXcgZmlsZSByczYwMDAtY29yZS5jLiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSByZWFkaW5nCi0JY29yZSBmaWxlcyBkZXBlbmRzIG9uIG5hdGl2ZSBpbmNsdWRlIGZpbGVzIHRoYXQgY29uZmxpY3QKLQl3aXRoIC4uL2luY2x1ZGUvY29mZi9yczYwMDAuaC4KLQkqIGNvbmZpZy9taC1yczYwMDA6ICBBZGQgcnM2MDAwLWNvcmUubyB0byBIREVQRklMRVMuCi0KLVRodSBGZWIgMjcgMjI6MTk6NTUgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxwcmludF9zeW1ib2wpKTogRG9uJ3QgcHJpbnQKLQlzeW1ib2wgYWRkcmVzc3MgZm9yIHVuZGVmaW5lZCBzeW1ib2xzLgotCSogY29mZi1yczYwMDAuYzogIFZhcmlvdXMgdXBkYXRlcyAoZHVlIHRvIHRhcmdldC0KLQlpbmRlcGVuZGVudCBjaGFuZ2VzKS4KLQkqIGxpYmJmZC5oOiAgRGl0dG8gKHRkYXRhIGZpZWxkIGlzIG5vdyBhIHVuaW9uKS4KLQkqIGhvc3RzL2gtc3BhcmMuaDogIFJlbW92ZWQgcHJvdG90eXBlIGZvciBib2d1cyBmdW5jdGlvbgotCSdlbXNldCcgKHByZXN1bWFibHkgc2hvdWxkIGhhdmUgYmVlbiAnbWVtc2V0JyAtIHdoaWNoIGlzIHRoZXJlKS4KLQotVGh1IEZlYiAyNyAxMTo0NjozMyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzLWJpZy0qIHRhcmdldCk6ICBTYW1lIGlzIElyaXMuCi0KLVRodSBGZWIgMjcgMDk6MjQ6NTYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiB3aGVuIGNyZWF0aW5nIGFuCi0JYWxpYXMgc3ltYm9sLCBmaWxsIGluIHRoZSBzZWN0aW9uIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4KLQlsZWF2aW5nIGl0IGJsYW5rLiBJZiBhbiBvdXRwdXQgc2VjdGlvbiBjYW4ndCBiZSBmb3VuZCBmb3IgYQotCXN5bWJvbCwgdGhlbiBkb24ndCBjb3JlIGR1bXAuCi0KLVdlZCBGZWIgMjYgMTg6MDQ6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi1XZWQgRmViIDI2IDE5OjQwOjU5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuYzogbGludAotCSogY29mZi1oODMwMC5jOiBmaXggc3R1cGlkIHJlbG9jIHN1YnRyYWN0aW9uIGJ1ZwotCSogY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9vdXQpOiBvbmx5IHN3YXAgYSB0dm5keCBieSAyIGJ5dGVzLAotCXNpbmNlIHRoYXQncyBob3cgd2lkZSBpdCBpcy4gKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogYWx3YXlzIHplcm8gb3V0Ci0JdGhlIHN5bWJvbC5mbGFncyBhbmQgZG9uZV9saW5lbm8gZmllbGRzLgotCi1UdWUgRmViIDI1IDE0OjI5OjI0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3N5bWJvbCk6IHdyaXRlIG91dCB0aGUgY29ycmVjdCBudW1iZXIgb2YKLQlhdXhlbnRzLgotCSogY3B1LWg4MzAwLmM6IGZpeCBkaXNhc3NlbWJseSBidWcKLQotRnJpIEZlYiAyMSAyMTozOTo1NiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmggKGJmZF9lcnJtc2cpLCBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X2luLAotCXNlY3Rpb25fZnJvbV9iZmRfaW5kZXgpLCBjcHUtaDgzMDAuYyAoaG93dG8qX2NhbGxiYWNrKSwKLQlyZWxvYy5jLCBzZWN0aW9uLmMgKGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyksIHRhcmdldHMuYwotCShiZmRfdGFyZ2V0X2xpc3QpOiAgUHJvdG9saW50LgotCSogbGliYmZkLmg6ICBVcGRhdGUgdG8gbWF0Y2ggYSBsaWJiZmQtaW4uaCBmcm9tIGEgbW9udGggYWdvLgotCi1GcmkgRmViIDIxIDEwOjU3OjU0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X2luKTogbGludCwgKGNvZmZfcHJpbnRfc3ltYm9sKTogcHJpbnRzCi0Jb3V0IHRhZ25keCB0b28uCi0JKiBhb3V0eC5oIChzd2FwX3N0ZF9yZWxvY19vdXQsIHN3YXBfZXh0X3JlbG9jX291dCk6IHVzZSB0aGUgb3V0cHV0Ci0Jc2VjdGlvbiBvZiBhIHN5bWJvbCByYXRoZXIgdGhhbiB0aGUgc2VjdGlvbiBvZiBhIHJlZmZlZCBzeW1ib2wgdG8KLQlkZXRlcm1pbmUgdGhlIHJfaW5kZXggb2YgYW4gZW1taXR0ZWQgcmVsb2MuCi0KLVRodSBGZWIgMjAgMTg6MTA6MzQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIFBPUlRJTkc6IE5ldyAocHJlbGltaW5hcnkpIHBvcnRpbmcgZ3VpZGUuCi0KLVdlZCBGZWIgMTkgMjE6Mzk6MzcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoY2FsbGpfY2FsbGJhY2spLCBjb2ZmLWEyOWsuYyAoYTI5a19yZWxvYyksIGNvZmYtbTg4ay5jCi0JKGhvd3RvX2h2cnQxNik6ICBsaW50LgotCi1Nb24gRmViIDE3IDEyOjAyOjE3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBocDMwMGJzZC5jIChuZXcpLCBjb25maWcvbXQtaHAzMDBic2Q6ICBNYWtlIGhwMzAwYnNkCi0JYSBmdWxsIGNvbmZpZ3VyYXRpb24gKHdpdGggcG9zc2libGUgY3Jvc3MtZGV2ZWxvcG1lbnQpLAotCWluc3RlYWQgb2YgdXNpbmcgaG9zdC1hb3V0LmMuCi0KLVN1biBGZWIgMTYgMTM6MDE6NDkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cyk6Ci0JU2V0IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKS4KLQkqIGdlbi1hb3V0LmM6ICBDaGFuZ2UgdG8gZW1pdCBhIC5jIGZpbGVzLCBub3QgYSAuaCBmaWxlLgotCi1UaHUgRmViIDEzIDIwOjExOjQ3IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBSZW1vdmUgb2Jzb2xldGUgdXNlIG9mCi0JQlNGX0FCU09MVVRFIGFuZCByZXBsYWNlIHdpdGggYmZkX2Fic19zZWN0aW9uIHJlZmVyZW5jZS4KLQotVGh1IEZlYiAxMyAxNzoyMjo0NCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogZml4ZWQgYnVnIHdoZXJlIHN5bWJvbHMKLQl3aXRoIG1vcmUgdGhhbiBvbmUgYXV4ZW50IGNhbiBjYXVzZSBuYXN0eSBjb3JlIGR1bXBzLgotCi0JKiBjb2ZmY29kZS5oLCBsaWJjb2ZmLmM6IGFkZGVkIG5ldyBmaWVsZGVkIHRvIGNvZmZfc3ltYm9sX3N0cnVjdAotCSJkb25lX2xpbmVubyIgc28gdGhhdCBhIHN5bWJvbCB3aGljaCBhcHBlYXJzIHR3aWNlIGluIHRoZSBzeW1ib2wKLQl0YWJsZSBvbmx5IGdldHMgaXQncyBsaW5lbnVtYmVycyByZWxvY2F0ZWQgb25jZS4gTW9kaWZlZAotCShjb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wpIGFuZCAoY29mZl9tYWtlX2VtcHR5X3N5bWJvbCkgdG8gbWFrZQotCXVzZSBvZiBpdC4KLQotVHVlIEZlYiAgNCAxNTozOTo1NSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaDogKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBmaXggY29uc3RydWN0b3IKLQlzdHVmZiB0byB1c2UgdGhlIE5ldyBPcmRlci4KLQotRnJpIEphbiAzMSAwMTozNDo0NSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBpZWVlLmM6ICBDaGFuZ2UgdHlwZSBvZiBlbnZpW10gdG8gdW5zaWduZWQgY2hhci4KLQotCSogY29uZmlndXJlLmluOiAgZml4IHZheCB1bHRyaXggY29uZmlndXJhdGlvbi4KLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBEZWFsIHdpdGggbnVsbCByZXR1cm4gZnJvbQotCWJmZF9tYWtlX3NlY3Rpb24oKS4gIChlbGZfb2JqZWN0X3ApOiAgU2VsZWN0IGVuZGlhbmVzcyBwcm9wZXJseS4KLQotRnJpIEphbiAzMSAwMToxOTo1NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaC10YWhvZS5oLCBoLXZheGJzZC5oOiAgRml4IHN0YWNrIGluIGNvcmUgZmlsZXMuCi0KLVRodSBKYW4gMzAgMjM6NTE6MDcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgaG9zdC1hb3V0LmMgZG9lc24ndCBkZXBlbmQgb24gYW91dC1wYXJhbXMuaC4KLQkqIGFvdXQtdGFyZ2V0Lmg6ICBVc2UgVEFSR0VUX0JJR19FTkRJQU5fUCB0byBzZXQgdXAgdmVjdG9yLgotCSogaG9zdC1hb3V0LmM6ICBEb24ndCB1c2UgYW91dC1wYXJhbXMuaDsgY29uZmlndXJlIHRoZXNlIHN5c3RlbXMKLQlpbiB0aGVpciB4bSBmaWxlcywgbm90IGluIGEgcmFuZG9tbHkgZ2VuZXJhdGVkIGZpbGUuCi0JKiBob3N0cy9oLWhwMzAwYnNkLmgsIGgtdGFob2UuaCwgaC12YXhic2QuaCwgaC12YXh1bHQuaDoKLQlTcGVjaWZ5IGJ5dGUgb3JkZXIuCi0JKiBob3N0cy9oLXZheGJzZC5oOiAgRGVmaW5lIHRoZSBmb3JtIG9mIGV4ZWMgYW5kIGNvcmUgZmlsZXMuCi0KLVRodSBKYW4gMzAgMTM6MDI6NDEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tdC10YWhvZSwgY29uZmlnL210LXZheDogIENoYW5nZSBERUZBVUxUX1ZFQ1RPUiB0bwotCWhvc3RfYW91dF92ZWMgaGVyZSBhcyB3ZWxsLgotCi1UaHUgSmFuIDMwIDExOjQxOjQ1IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3QtYW91dC5jOiAgQ2hhbmdlIFRBUkdFVE5BTUUgdG8gImEub3V0IiB0byBiZSBjb21wYXRpYmxlIHdpdGgKLQlnZGIuICBjb25maWcvbXQtaHAzMDBic2Q6ICBDaGFuZ2UgREVGQVVMVF9WRUNUT1IgdG8gaG9zdF9hb3V0X3ZlYwotCXRvIHByZXZlbnQgdW5kZWZpbmVkIHN5bWJvbC4KLQotVGh1IEphbiAzMCAwNzoyNjo1MyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCVZhcmlvdXMgbGludHMgZm91bmQgb24gUGVyc1NvbnkKLQkqIGFvdXR4Lmg6IGNhc3QgYW4gZW51bQotCSogY29mZi1hMjlrLmM6IG1hbnkgaW50cyBpbiByZWxvYyBzdHJ1Y3R1cmUgdHVybmVkIHRvIGVudW0KLQkqIGNvZmZjb2RlLmg6IG1vcmUgZW51bXMKLQkqIGNwdS1oODMwMC5jOiBtb3JlIGVudW1zCi0JKiBvcG5jbHMuYzogbW9yZSBlbnVtcwotCi1UaHUgSmFuIDMwIDAxOjE5OjU2IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBNYWtlIFRhaG9lIGNvbmZpZ3VyYXRpb24gd29yayBhZ2Fpbi4KLQkqIGJmZC1pbi5oOiAgUmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGZyb20gZW51bSBkZWNsYXJhdGlvbi4KLQkqIGllZWUuYzogIENhbid0IHB1dCBieXRlIHZhbHVlcyA+MHg3RiBpbnRvIGEgc2lnbmVkIGNoYXIuCi0KLVR1ZSBKYW4gMjggMjE6MTA6NTEgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIGRlcGVuZGVuY2llcyBmb3IgdmFyaW91cyBjb2ZmLSoubyBmaWxlcy4KLQotCSogZWxmLmM6ICBSZW1vdmUgZXh0cmFuZW91cyBwYXJlbiBmcm9tIGNvcmVfcHJwc2luZm8gYW5kCi0JY29yZV9wcnBzdGF0dXMgbWFjcm9zLCByZW5hbWUgY29yZV9wcnBzdGF0dXMgdG8gY29yZV9wcnN0YXR1cy4KLQlSZXBsYWNlIHJlZmVyZW5jZXMgdG8gb2xkIHNlY3Rpb24gInNpemUiIG1lbWJlciB3aXRoIG5ldwotCSJfcmF3X3NpemUiIG1lbWJlci4gIEltcGxlbWVudCBlbGZfbWFrZV9lbXB0eV9zeW1ib2wsIHdoaWNoCi0JaXMgbm93IHVzZWQuCi0KLVR1ZSBKYW4gMjggMTQ6NTE6NDAgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMsIGJmZC5jLCAuLi9pbmNsdWRlL2JmZC5oOiAgVmFyaW91cyBmaXhlcyBmb3IgUE1BWAotCWNvcmUgcmVhZGluZy4KLQotVHVlIEphbiAyOCAxMDo0NjozMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfcmVsYXhfc2VjdGlvbik6IG5vdyBzdGF0aWMuCi0JKGJmZF9jb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IHZhcmlvdXMgdHlwZSBsaW50cy4KLQotTW9uIEphbiAyNyAxOTo0NDowOCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCU5ldyBlbnRyeSBwb2ludCBpbiB0aGUgdHJhbnNmZXIgdmVjdG9yIC0gYmZkX3JlbGF4X3NlY3Rpb24uCi0KLQkqIGFvdXQtdGFyZ2V0Lmg6IGFkZCB0byB2ZWN0b3IsIGNhbGwgZ2VuZXJpY19yZWxheAotCSogYmZkLWluLmg6IGFkZCB0byB2ZWN0b3IKLQkqIGJmZC5jOiBhZGQgI2RlZmluZSBmb3IgdmVjdG9yCi0JKiBib3V0LmM6IGFkZCB0byB2ZWN0b3IsIGNhbGwgZ2VuZXJpY19yZWxheAotCSogY29mZmNvZGUuaDogYWRkIHRvIHZlY3RvciwgYWxzbyBub3cgaGFzIGNvZmYgc3BlY2lmaWMgcmVsYXggY29kZQotCWZvciB0aGUgcmVsYXhhYmxlIEg4LzMwMCByZWxvY3MuIEFsc28gY2xlYW4gdXAgYWJzIHNlY3Rpb24gY3J1ZnQuCi0JKiBlbGYuYzogY2FsbCBnZW5lcmljX3JlbGF4Ci0JKiBpZWVlLmM6IGNhbGwgbmV3IHZlY3RvciwgY2xlYW4gdXAgc29tZSBidWdzIGR1ZSB0byB0aGUgY3JlYXRpb24KLQlvZiBiZmRfYWJzX3NlY3Rpb24KLQkqIGxpYmJmZC5oOiBhZGQgYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbiBFWEZVTgotCSogb2FzeXMuYzogY2FsbCBnZW5lcmljX3JlbGF4Ci0JKiByZWxvYy5jOiBpbXBsZW1lbnQgZ2VuZXJpY19yZWxheAotCSogc2VjbGV0LmM6IG1vdmVkIG11Y2ggb2YgdGhpcyBpbnRvIGNvZmZjb2RlLmgKLQkqIHNyZWMuYzogY2FsbCBnZW5lcmljX3JlbGF4Ci0JKiB0YXJnZXRzLmM6IGRlZmluZSBuZXcgdHJhbnNmZXIgdmVjdG9yCi0KLUZyaSBKYW4gMjQgMTQ6NDA6MTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGV2ZXJ5dGhpbmc6IG5vdyBtb2RpZmllZCB0byB1c2Ugc21hbGxlciByZWxvYyB0eXBlLiBTZWxmIGhvc3RzCi0Jb24gc3VuMyAmIHN1bjQuCi0KLVNhdCBKYW4gMTggMTc6MDA6MTYgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zdHJhdHVzLCBjb25maWcvbXQtaTg2MC1lbGYsIGhvc3RzL2gtc3RyYXR1czoKLQlOZXcgZmlsZXMgZm9yIHN0cmF0dXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBjb25maWd1cmF0aW9uIGZyYWdtZW50cyBmb3Igc3RyYXR1cy4KLQotV2VkIEphbiAxNSAxMDowMjo0MyAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IERlY2xhcmUgdmFyaW91cyBmaWxlbmFtZQotCXZhcmlhYmxlcyBhcyBDT05TVCBzaW5jZSB0aGV5IGFyZSBzZXQgdG8gcG9pbnQgdG8gYSBjb25zdCBjaGFyCi0Jc3RyaW5nLiAgRml4ZXMgY29tcGlsZXIgY29tcGxhaW50cy4KLQotRnJpIEphbiAxMCAxNzo0NDo1MyAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaC1hbWl4LmggaG9zdHMvaC1pMzg2djQuaDogIENoYW5nZSBhYm9ydCgpIHRvIGEgZnVuY3Rpb24KLQlyZXR1cm5pbmcgdm9pZC4KLQotRnJpIEphbiAxMCAxNDozMzozMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6ICBSZWNvZ25pemUgTl9TT0wKLQlzeW1ib2xzLCBzbyB0aGF0IHdlIGNhbiBlbWl0IHRoZSBjb3JyZWN0IGZpbGUgbmFtZSBldmVuCi0JaWYgaXQncyBhbiBpbmNsdWRlIGZpbGUuCi0KLVRodSBKYW4gIDIgMTY6NDM6MzQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTk2MC5jOiAgQWRkIENPRkZfU1dBUF9UQUJMRSB0byBsaXR0bGVfdmVjIGFzIHdlbGwgYXMgYmlnX3ZlYy4KLQkoUmVwb3J0ZWQgYnkgam9obkBsYWJ0YW0ubGFidGFtLm96LmF1IChKb2huIENhcmV5KSkuCi0KLVdlZCBKYW4gIDEgMDQ6MjM6MDYgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiAgQ2hhbmdlIGFsbCAnI2lmIEhBVkVfUFJPQ0ZTJyB0byAnI2lmZGVmIEhBVkVfUFJPQ0ZTJy4KLQotCSogY29uZmlnL21oLWFtaXgsIGNvbmZpZy9taC1pMzg2djQ6ICBSZW1vdmUgSERFRklORVMgdGhhdCB3YXMKLQliZWluZyB1c2VkIHRvIC1ESEFWRV9QUk9DRlMuCi0KLQkqIGhvc3RzL2gtYW1peCwgaG9zdHMvaC1pMzg2djQ6ICBBZGQgJyNkZWZpbmUgSEFWRV9QUk9DRlMnLiAgTW92ZQotCScjaW5jbHVkZSAiZm9wZW4tc2FtZS5oIicgdG8gZW5kIG9mIGZpbGUgdG8gbWF0Y2ggb3RoZXIgaC0qIGZpbGVzLgotCi1GcmkgRGVjIDIwIDEyOjA2OjE3IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBDaGFuZ2Ugc3ZyNCByZWZlcmVuY2VzIHRvIHN5c3Y0LiAgQWRkIGNhc2UKLQkidW5rbm93biIgZm9yIHRhcmdldCB2ZW5kb3IgYW5kIGluZmVyIHNvbWUgdGFyZ2V0cyBiYXNlZAotCW9uIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW5nIHN5c3RlbS4KLQotV2VkIERlYyAxOCAxNzoxNzo1OSAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCwgbGliYW91dC5oOiAgQU5TSWZ5IGVudW1zLgotCi1XZWQgRGVjIDE4IDE2OjEyOjI1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKG5vcm1hbGl6ZSk6IGNyZWF0ZWQgdmVyc2lvbiBmb3IgVk1TIHdoaWNoIHJlbW92ZXMgdGhlCi0JVk1TIGRpcmVjdG9yeSBjcmFwIGZyb20gdGhlIGZyb250IGFuZCBlbmQgb2YgYSBmaWxlbmFtZSwgZWcgdHVybgotCVstLmZvb11iYXIub2JqOzEyMyBpbnRvIGJhci5vYmoKLQkoYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogbm93IHdyaXRlcyBpbmRleCBpbnRvIGFuCi0JZXh0ZW5kZWQgbmFtZSB0YWJsZSBpbiBkZWNpbWFsIC0gdGhlIHNhbWUgYmFzZSB1c2VkIHRvIHJlYWQgYW4KLQlleHRlbmRlZCBuYW1lIHRhYmxlLgotCi1XZWQgRGVjIDE4IDE0OjQwOjM5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0LWVuY2FwLmM6ICBGaXggdG8gdXNlIGFvdXQtdGFyZ2V0LmguCi0JKiBhb3V0ZjEuaDogIFVzZSBzdGFuZGFyZCBNWV9vYmplY3RfcCBhbmQgTVlfY2FsbGJhY2sKLQlpbiBhb3V0LXRhcmdldC5oLiAgUmVtb3ZlIHRhcmdldC1zcGVjaWZpYyB2ZXJzaW9ucy4KLQkqIGhvc3QtYW91dC5jOiAgUmUtd3JpdGUgdG8gdXNlIGFvdXQtdGFyZ2V0LmguCi0JKiBnZW4tYW91dC5jOiAgTmV3IGZpbGVzIHVzZSB3aXRoIGhvc3QtYW91dC5jIHRvIGdlbmVyYXRlCi0JaG9zdC1zcGVjaWZpYyBhLm91dC1yZWxhdGVkIHBhcmFtZXRlcnMuCi0JKiBNYWtlZmlsZS5pbjogIGhvc3QtYW91dC5vIGRlcGVuZHMgb24gYW91dC1wYXJhbXMuaCwgd2hpY2ggaXMKLQlnZW5lcmF0ZWQgYnkgZ2VuLWFvdXQuCi0JKiBhb3V0LXRhcmdldC5oOiAgTWFrZSBhIGxpdHRsZSBtb3JlIGZsZXhpYmxlLgotCSogbGliYW91dC5oLCBhb3V0LXRhcmdldC5oOiAgUmVtb3ZlZCBXT1JLX09VVF9GSUxFX1BPU1RJT05TCi0JbWFjcm8uICBJbnN0ZWFkLCBpbmxpbmUgaXQgaW4gYW91dC10YXJnZXQuaC4KLQkqIG5ld3NvczMuYzogIERlZmluZSBOX1NIQVJFRF9MSUIoeCkgYXMgMCB0byBhdm9pZAotCWEgZ2NjIC1XYWxsIHdhcm5pbmcuCi0JKiBhcmNoaXZlLmM6ICBBZGQgbWlzc2luZyBjb21tYXMgaW4gREVGVU4gbWFjcm8gKDIgcGxhY2VzKS4KLQkqIGVsZi5jLCBjb2ZmY29kZS5oLCBhb3V0ZjEuaDogIFVzZSBBTlNJIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mCi0JQmVya2VsZXkgb25lcywgbm93IHRoYXQgbGliaWJlcnR5IGhhcyB0aGVtOgotCWJjb3B5LT5tZW1jcHksIGJ6ZXJvLT5tZW1zZXQsIGJjbXAtPm1lbWNtcC4KLQkqIGFvdXR4Lmg6ICBWYXJpb3VzIHRvdWNoLXVwczogIFJlLWZvcm1hdHRpbmcsIGZpeCBhIGNhc3QsCi0JcmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KLQotVHVlIERlYyAxNyAxOTo0ODo1OSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiAgRW5jbG9zZSBjb3JlbmFtZQotCWFuZCBleGVjbmFtZSBpbnNpZGUgSEFWRV9QUk9DRlMgaWZkZWYgc2luY2UgdGhleSBhcmUgdW51c2VkCi0Jd2hlbiBpdCBpcyBub3QgZGVmaW5lZC4KLQotTW9uIERlYyAxNiAxMjowMDoxMCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6ICBGbGFnIGFsbCBzZWN0aW9ucyBhcyBlaXRoZXIgY29kZSBvciBkYXRhLiAgV2UgY2FuJ3QKLQliZSBzdXJlIHdoYXQgdGhleSBhcmUgYW55d2F5LCBzaW5jZSBFTEYgZG9lc24ndCBmaXQgdGhlCi0JdHJhZGl0aW9uYWwgbW9kZWwgb2YgdGV4dCtkYXRhK2JzcyB2ZXJ5IHdlbGwuICBBZGQgbmV3IGxvY2FsCi0JZnVuY3Rpb24gZWxmX3JlYWQoKSB0byBzaW1wbGlmeSBjb2RlLiAgUmVjb3JkIGVudHJ5IHBvaW50IGluCi0JdGhlIGJmZCBzdHJ1Y3R1cmUuCi0KLVRodSBEZWMgMTIgMjE6MDE6MjIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2gtKi5oOiAgQ29uZmlndXJlIGZvcGVuIHVzaW5nIC4uL2luY2x1ZGUvZm9wZW4tKi5oCi0JcmF0aGVyIHRoYW4gTiBjb3BpZXMgb2YgdGhlIHNhbWUgbGluZXMuCi0KLVdlZCBEZWMgMTEgMTY6Mzk6NDUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNwdS1oODMwMC5jOiBkaXNhc3NlbWJsZSBicmFuY2ggZGlzcGxhY2VtZW50cyBjb3JyZWN0bHkKLQkqIGNvZmYtaDgzMDAuYzogcHV0IHJlbG9jIG9mZnNldHMgb3V0IGluIDMyYml0cwotCi0JKiBtYWtlZmlsZS5kb3MsIGNvbmZpZ2RqLmJhdDogTmV3IGZpbGVzIGZyb20gREoKLQkqIGNhY2hlLmM6IGZvcGVuIHdpdGggbmV3IG1hY3JvcyBpcyBuZWVkZWQgZm9yIERPUy4KLQkqIGllZWUuYzogZW52aXJvbiByZW5hbWVkIHRvIGVudmkgdG8gc3RvcCBhbiBpbmNsdWRlIGZpbGUKLQljb25mbGljdC4KLQkqIG9wbmNscy5jLCBjb2ZmLXJzNjAwMC5jOiBtb3JlIGZvcGVucyB3aXRoIG1hY3Jvcy4KLQotVHVlIERlYyAxMCAwNDowNzoyNCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbmZvZGlyIGJlbG9uZ3MgaW4gZGF0YWRpci4KLQotU2F0IERlYyAgNyAxNjozOToyMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSAqIE1ha2VmaWxlLmluOiBmaXggd2hlcmUgZG9jZGlyIGxpdmVzCi0KLQkgKiBhb3V0eC5oLCBhcmNoaXZlLmMsIGFyY2h1cmVzLmMsIGJmZC5jLCBjYWNoZS5jLCBjb2ZmLW04OGsuYywKLQkgY29mZmNvZGUuaCwgY29yZS5jLCBjdG9yLmMsIGVsZi5jLCBmb3JtYXQuYywgaWVlZS5jLCBpbml0LmMsCi0JIGxpYmJmZC5jLCBsaWJiZmQuaCwgbGliY29mZi5oLCBvcG5jbHMuYywgcmVsb2MuYywgc2VjdGlvbi5jLAotCSBzcmVjLmMsIHN5bXMuYywgdGFyZ2V0cy5jIDogYWxsIG5ldyBkb2N1bWVudGF0aW9uIGFuZCBsaW50Ci0JIHJlbW92YWwuCi0KLQotU2F0IERlYyAgNyAwNzoyMjowOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCwgc3JlYy5jOiAgTGludC4KLQotRnJpIERlYyAgNiAyMjo1ODo0OCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbnN0YWxsIHVzaW5nIElOU1RBTExfREFUQSwgYWRkZWQgc3RhbmRhcmRzLnRleHQKLQkgIHN1cHBvcnQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogbWFyayBkaXJlY3RvcnkgYXMgdGFyZ2V0IGRlcGVuZGVudC4gIGNvbmZpZ3VyZQotCSAgbm93cyB3b3JrcyBpbiBvYmpkaXIgYWx3YXlzIHNvIG1ha2UgZmlsZSBleGlzdGVuY2UgY2hlY2tzCi0JICBhZ2FpbnN0ICR7c3JjZGlyfS4KLQotVGh1IERlYyAgNSAyMjo0NjoxOSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKLQkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKLQkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCi0KLVdlZCBEZWMgIDQgMTA6MTQ6MTcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzdW5vc188c2l6ZT5fb2JqZWN0X3AsIHN1bm9zNF9jYWxsYmFjayk6IG1vdmVkIHRoZQotCWNvbXB1dGF0aW9uIG9mIGFyY2ggYW5kIG1hY2hpbmUgdHlwZSBzbyBpdCdzIHdvcmtlZCBvdXQgYmVmb3JlCi0Jc29tZV9hb3V0X29iamVjdF9wIGlzIGNhbGxlZC4KLQkqIGFvdXR4Lmg6IChzb21lX2FvdXRfb2JqZWN0X3ApOiBkb24ndCBzZXQgYXJjaCBhbmQgbWFjaCB0bwotCXVua25vd24uCi0JKiBhcmNodXJlcy5jOiBhZGQgZXh0cmEgZmllbGQgJ3NlY3Rpb25fYWxpZ25fcG93ZXInIHRvIGhvbGQKLQlkZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50IGluIG9iamVjdCBmaWxlcy4KLQkqIGNwdS1hMjlrLmMsIGNwdS1oODMwMC5jLCBjcHUtaTM4Ni5jLCBjcHUtaTk2MC5jLCBjcHUtbTY4ay5jLAotCWNwdS1tODhrLmMsIGNwdS1taXBzLmMsIGNwdS1yczYwMDAuYywgY3B1LXNwYXJjLmMsIGNwdS12YXguYzoKLQlpbml0aWFsaXplIHRoZSBuZXcgZmllbGQuCi0JKiBib3V0LmMgKGJfb3V0X2NhbGxiYWNrKTogcmVwbGFjZSB0aGUgdGV4dCBzaXplLCBzaW5jZSBhb3V0Ci0JZnJpZXMgdGhlbS4KLQkqIGFvdXR4Lmg6IERvY3VtZW50YXRpb24gaW4gdGhlIG5ldyBzdHlsZQotCi1XZWQgRGVjICA0IDAyOjAwOjMwIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuYyAoYmZkX2dldF9tdGltZSk6ICBEb24ndCBjYWNoZSBtdGltZSBhbnkgbW9yZTsgb25seQotCXVzZSB0aGUgc2F2ZWQgdmFsdWUgaWYgbXRpbWVfc2V0IGlzIGFscmVhZHkgc2V0IChpbnRlbmRlZAotCWZvciBhcmNoaXZlIGZpbGVzLCB0aG91Z2ggYXBwYXJlbnRseSBub3QgdXNlZCB5ZXQpLgotCi1UdWUgRGVjICAzIDIyOjU0OjUwIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmM6ICBSZXZpc2UgY29tbWVudHMgYWJvdXQgaG93IHRvIGNvbmZpZ3VyZSB0aGUgdGFyZ2V0Ci0JdmVjdG9yLCB0byBtYXRjaCByZWFsaXR5LiAgUmVtb3ZlIG1lbnRpb24gb2Ygb2Jzb2xldGUgbWV0aG9kcy4KLQlSZW1vdmUgbG9uZyBsaXN0cyBvZiBjYXBpdGFsaXplZCBtYWNyb3MgdGhhdCB0dXJuIGludG8gdGhlIHNhbWUKLQl0aGluZyBpbiBsb3dlcmNhc2UuICBOb3JtYWwgdmVjdG9yIHNpbXBseSBsaXN0cyBhbGwga25vd24KLQlsb3dlcmNhc2UgeHZlYyBuYW1lczsgYWxsIG90aGVyIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IFNFTEVDVF9WRUNTLgotCi0JKiBjb25maWcvbXQtaTM4Ni1jb2ZmOiAgU2V0IERFRkFVTFRfVkVDVE9SIHRvIHJlYWwgaWRlbnRpZmllciwKLQlub3QgbWFjcm8gbmFtZS4KLQotCSogY29uZmlnL210LWk5NjAte2NvZmYsYm91dH06ICBVc2UgU0VMRUNUX1ZFQ1MgdG8gbWFrZSBhIHNob3J0Ci0JbGlzdCBvZiBzdXBwb3J0ZWQgdGFyZ2V0cy4KLQotVHVlIERlYyAgMyAxNDowNjoxNSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChic2Rfd3JpdGVfYXJtYXApOiAgVGhlIHBhZCBieXRlIHNvbWV0aW1lcyBhZGRlZCB0bwotCXRoZSBzdHJpbmcgdGFibGUgaW4gYSBfXy5TWU1ERUYgbWVtYmVyIGlzIG5vdwotCWNvdW50ZWQgYXMgcGFydCBvZiB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nIHRhYmxlLgotCVRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBvbGQgcmFubGliLCBhcyB3ZWxsIGFzIFN1bidzLgotCi1UdWUgRGVjICAzIDEwOjUzOjMwIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBzcmVjLmM6IFJld3JvdGUgdG8gZml4IG1hbnkgYnVnczsgbm93IGdldHMgdGhlIHJlY29yZCB0eXBlCi0JcmlnaHQsIGRvZXNuJ3QgY2hva2Ugb24gaW5wdXQsIHNldHMgdGhlIHN0YXJ0IGFkZHJlc3MgaW4gYW4gUzkgYW5kCi0JZmlsbHMgaW4gdGhlIGZpbGVuYW1lIG9uIGFuIFMwLgotCi1TYXQgTm92IDMwIDIxOjE5OjE1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjcHUtaDgzMDAuYzogQWRkIHN1cHBvcnQgZm9yIE1FTUlORCBhZGRyZXNzaW5nIG1vZGUKLQotCSogY29mZi1hMjlrLmM6IGRlZmluZWQgUkVMT0NfUFJPQ0VTU0lORyB0byB0YWtlIHRoZSAjaWZkZWYgb3V0IG9mCi0JY29mZmNvZGUuaAotCSogY29mZmNvZGUuaDogdXNlIHRoZSBuZXcgbWFjcm8gaWYgYXZhaWxhYmxlCi0KLQkqIGVsZi5jIChlbGZfY29yZWZpbGVfbm90ZSk6IGNhc3QgbWFsbG9jIHRvIGF2b2lkIHdhcm5pbmcuCi0JKiBNYWtlZmlsZS5pbjogRml4ZWQgZGVwZW5kZW5jaWVzIGR1ZSB0byBmaWxlIHJlbmFtZQotCi0JKiBhb3V0LWVuY2FwLmMsIGFvdXRmMS5oLCBhb3V0eC5oLCBhcmNoaXZlLmMsIGJvdXQuYywgY29mZi1hMjlrLmMsCi0JY29mZi1oODMwMC5jLCBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jLCBjb2ZmLW04OGsuYywKLQljb2ZmLW1pcHMuYywgY29mZi1yczYwMDAuYywgY3B1LWgzMDAuYywgZWxmLmMsIGkzODZhb3V0LmMsCi0JbmV3b3MzLmMsIHN0YWItc3ltcy5jLCBzeW1zLmM6IEFsbCB0aGVzZSBmaWxlcyBoYXZlIGhhZCB0aGVpcgotCSNpbmNsdWRlcyBhbHRlcmVkIHRvIHBvaW50IHRvIHRoZSBuZXcgcGxhY2VzLgotCi1GcmkgTm92IDI5IDIwOjA0OjQ5IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtaTM4NnY0LCBjb25maWcvbWgtaTM4Ni1lbGYsIGhvc3RzL2gtaTM4NnY0Lmg6ICBOZXcgZmlsZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCB2ZW5kb3IgIm5jciIgYXMgc3VwcG9ydGVkIHBlci10YXJnZXQgdmVuZG9yLgotCUFkZCBzdnI0IGNhc2UgZm9yIGkzODYgcGVyLWhvc3QgY2FzZS4KLQotCSogZWxmLmMgKGVsZl9vYmplY3RfcCwgZWxmX2NvcmVfZmlsZV9wKTogIEFkZCBtaXNzaW5nICJicmVhayIgdG8KLQlFTEZEQVRBMkxTQiBjYXNlcy4KLQotRnJpIE5vdiAyOSAxMjoxNjo1MSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogc3ltcy5jIChiZmRfZGVjb2RlX3N5bWNsYXNzKTogIFJldHVybiAnQScKLQlmb3Igc3ltYm9scyB0aGF0IGFyZSBib3RoIGFic29sdXRlIGFuZCBnbG9iYWwuCi0JKiBhcmNoaXZlLmMgKGJmZF9zcGVjaWFsX3VuZG9jdW1lbnRlZF9nbHVlKTogIFJldHVybiBOVUxMCi0JaWYgYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0gcmV0dXJucyBOVUxMLgotCi1UdWUgTm92IDI2IDA5OjEwOjU1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjb2ZmLWg4MzAwCi0JKiBjb25maWd1cmUuaW46IG5vdyBoOCBpcyBhIGNvZmYgdGFyZ2V0Ci0JKiBjcHUtaDgzMDAuYzogZml4IHZhcmlvdXMgZGlzYXNzZW1ibHkgcHJvYmxlbXMKLQkqIGxpYmNvZmYuaDogdG9vayBvdXQgc29tZSBjb2RlIHdoaWNoIGhhcyBiZWVuICMwZWQgZm9yIGEgbG9uZwotCXRpbWUuCi0JKiB0YXJnZXRzLmM6IGFkZGVkIGg4IGNvZmYKLQkqIGNvZmYtYTI5ay5jLCBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jLCBjb2ZmLW04OGsuYwotCWFkZGVkIG5ldyBtYWNybyBSVFlQRTJIT1dUTyB0byB0YWtlIGEgbG9hZCBvZiAjaWZkZWZzIG91dCBvZgotCWNvZmZjb2RlLmgKLQkqIGNvZmZjb2RlLmg6IFN0YXJ0ZWQgdG8gY2hhbmdlIHRoZSB3YXkgbWFjaGluZSBkZXBlbmRlbmNpZXMgYXJlCi0JaGFuZGxlZCwgZnJvbSB0aGUgbmVzdCBvZiAjaWZkZWZzIHRvIG1hY3JvcyBkZWZpbmVkIGluIHRoZQotCWluY2x1ZGluZyBjb2ZmLTxmb28+LmMKLQotRnJpIE5vdiAyMiAwODoxMTo0MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogIFNldCB0aGUgYGV4ZWN1dGFibGUnIGJpdAotCWlmIHRoZSBlbnRyeSBwb2ludCBpcyBjb250YWluZWQgaW4gdGhlIHRleHQgc2VnbWVudCwgZXZlbiBpZiB0aGUKLQl0ZXh0IHNlZ21lbnQgaXMgYXQgbG9jYXRpb24gMC4KLQotCSogY29mZi1taXBzLmMsIGNvZmZjb2RlLmg6ICBQZXRlciBTY2hhdWVyJ3MgcGF0Y2ggdG8ga2x1ZGdlIGluCi0Jbm9uc3RhbmRhcmQgTUlQUyBzZWN0aW9ucyAoLnJkYXRhLCAuc2RhdGEsIGV0YykuCi0KLQkqIGFvdXR4LmgsIGJmZC5jLCBjb2ZmY29kZS5oLCBpZWVlLmMsIG9hc3lzLmMsIHRhcmdldHMuYzogQ09OU1QgbGludC4KLQkqIGxpYmJmZC1pbi5oLCBsaWJiZmQuaCwgYW91dHguaCwgY29mZmNvZGUuaCwgZWxmLmMsIGxpYmFvdXQuaDoKLQlSZW5hbWUgQUxJR04gdG8gQkZEX0FMSUdOIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggQlNEIDxzeXMvcGFyYW0uaD4uCi0JKiBsaWJiZmQuYzogIExpbnQuCi0JKiBob3N0LWFvdXQuYywgdHJhZC1jb3JlLmM6ICBGaXggd3JpdGVfYXJtYXAgcHJvdG90eXBlcy4gIExpbnQuCi0KLVRodSBOb3YgMjEgMTk6NTY6NDAgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHN0YWItc3ltcy5jLCBzeW1zLmM6ICBNb3ZlZCBiZmRfc3RhYl9uYW1lKCkgYW5kIGJmZF9zdGFiX25hbWVzW10KLQlmcm9tIHN5bXMuYyB0byBuZXcgZmlsZSBzdGFiLXN5bXMuYy4gIEFsc28sIHNpbmNlIEdOVSBleHRlbmRlZAotCXR5cGUgY29kZXMgc3VjaCBhcyBOX1NFVFQgYXJlIG5vIGxvbmdlciBpbiAuLi9pbmNsdWRlL3N0YWIuZGVmLAotCWluY2x1ZGUgdGhlbSBtYW51YWxseS4KLQkqIHN0YWItc3ltcy5jLCBhb3V0eC5oOiBSZW5hbWVkIGJmZF9zdGFiX25hbWUoKSBhbmQKLQliZmRfc3RhYl9uYW1lc1tdIHRvIGFvdXRfc3RhYl9uYW1lKCkgYW5kIGFvdXRfc3RhYl9uYW1lc1tdLgotCSogbGliYW91dC5oOiBBZGRlZCBwcm90b3R5cGUgZm9yIGFvdXRfc3RhYl9uYW1lKCkuCi0JKiBNYWtlZmlsZS5pbjogIFVwZGF0ZSBNYWtlZmlsZSBmb3IgbmV3IHN0YWItc3ltcy5bY29dLgotCi1UaHUgTm92IDIxIDExOjUwOjQ5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmggKFdPUktfT1VUX0ZJTEVfUE9TSVRJT05TKTogIE9uZSBtb3JlIHRyeSBhdCB0aGlzCi0JcmF0aGVyIGNvbXBsaWNhdGVkIHNlZW1pbmcgcHJvYmxlbS4gIEVsaW1pbmF0ZSBMT0dJQ0FMXyB2ZXJzaW9ucywKLQlqdXN0IG1ha2UgTl9YWFggd29yayBieSBleGNsdWRpbmcgdGhlIGhlYWRlciBmcm9tIHRoZSB0ZXh0IHNlZ21lbnQuCi0JKiBhb3V0eC5oOiAgRml4IGNvbW1lbnRzIHRvIG1hdGNoLgotCi1UdWUgTm92IDE5IDE4OjQ5OjAxIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmggKFdPUktfT1VUX0ZJTEVfUE9TSVRJT05TKTogIFVzZSBuZXcgTE9HSUNBTF9UWFRBRERSLAotCUxPR0lDQUxfVFhUT0ZGLCBMT0dJQ0FMX1RYVFNJWkUgbWFjcm9zIHRvIGZpZ3VyZSBvdXQgbnVtYmVycwotCWZvciB0aGUgImxvZ2ljYWwiIHRleHQgc2VnbWVudCAoaS5lLiBuZXZlciBjb25zaWRlciB0aGUgZXhlYwotCWhlYWRlciB0byBiZSBwYXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQpLiAgVGhpcyBjaGFuZ2UgaXMKLQluZWVkZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdmFyaW91cyBvdGhlciBwYXJ0cyBvZiBiZmQgYW5kIGxkLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNvZV9hb3V0X29iamVjdF9wKSk6ICBGaXggY29tbWVudCwKLQlhbmQgbW92ZSBjYWxjdWxhdGlvbiBvZiBvYmpfdGV4dHNlYyhhYmZkKS0+c2l6ZSB0byBsaWJhb3V0LmguCi0JKiBiZmQtaW4uaDogIFJlbW92ZWQgYm9ndXMgJzsnLgotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBNSU5JTUlaRSBmbGFnIHRvIHNlbGVjdCBsZWFuCi0Jb3IgYmxvYXRlZCB0YXJnZXRfdmVjdG9yLgotCSogdGFyZ2V0cy5jOiAgVXNlIG5ldyBNSU5JTUlaRSBtYWNybywgYW5kIGFkZCB0cmFkX2NvcmUgaWYgbmVlZGVkLgotCSogbmV3c29zMy5jOiAgRml4ZXMgdG8gLi4vaW5jbHVkZS9hb3V0NjQuaCByZW1vdmUgbmVlZAotCWZvciBzcGVjaWFsIE5fVFhUT0ZGIG1hY3JvLCBidXQgcmVxdWlyZSBOX0hFQURFUl9JTl9URVhULgotCi1Nb24gTm92IDE4IDEyOjAwOjU5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oLCBhb3V0ZjEuaCwgbmV3c29zMy5jOiAgTWFrZSBhb3V0LXRhcmdldC5oCi0JaGFuZGxlIGJvdGggbGl0dGxlIGFuZCBiaWctZW5kaWFuIHRhcmdldHMsIHdpdGggbGl0dGxlCi0JdGhlIGRlZmF1bHQgdW5sZXNzIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AgaXMgZGVmaW5lZC4KLQkqIGhvc3QtYW91dC5jOiAgQWRkIEZJWE1FIG5vdGUuCi0KLVN1biBOb3YgMTcgMTM6Mjk6MzkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYzogIE1ha2UgdGhlIGRlZmF1bHQgdGFyZ2V0X3ZlY3RvciBjb250YWluCi0JanVzdCAmREVGQVVMVF9WRUNUT1IuICBUaGlzIG1ha2VzIGV4ZWN1dGFibGVzIGEgbG90IHNtYWxsZXIuCi0JT2xkIGJlaGF2aW9yIGNhbiBiZSBnb3R0ZW4gYnkgZGVmaW5pbmcgQUxMX1RBUkdFVFMuCi0JKiBhb3V0ZjEuaCwgZGVtbzY0LmMsIGkzODZhb3V0LmMsIG5ld3NvczMuYywgc3Vub3MuYzoKLQlGYWN0b3JlZCBvdXQgY29tbW9uIGNvZGUgaW50byBuZXcgZmlsZSBhb3V0LXRhcmdldC5oLgotCVNhdmVzIGEgbG90IG9mIGR1cGxpY2F0ZSBjb2RlIGZvciBhLm91dCB2YXJpYW50cy4KLQotRnJpIE5vdiAxNSAxMzowMDo0MyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCUdldCAnbWFrZSBoZWFkZXJzJyB0byB3b3JrIHdoZW4gY29uZmlndXJlZCB3aXRoICtzdWJkaXJzLgotCSogTWFrZWZpbGUuaW46IEFkZCAkKHN1YmRpcikgdG8gZG9jZGlyIHBhdGguCi0JKiBkb2MvTWFrZWZpbGUuaW4gKHByb3Rvcyk6IEFkZCAkKHNyY2RpcikgcHJlZml4Ci0JdG8gbmFtZSBvZiBzZWQgc2NyaXB0cy4KLQotVGh1IE5vdiAxNCAxOTo0OToxMCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LHByaW50X3N5bWJvbCkpOiAgRml4IHRoaW5rby4KLQkqIHN5bXMuYyAoYmZkX3N0YWJfbmFtZXMpOiAgVHVybiBvbiBuZXcgR05VX0VYVFJBX1NUQUJTIG1hY3JvCi0JdG8gaW5jbHVkZSBuYW1lcyBvZiBOX1NFVFQgZXRjLgotCi1UaHUgTm92IDE0IDE5OjExOjEzIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0gICAgCSogZWxmLmM6ICBBZGQgbWluaW1hbCBzdXBwb3J0IGZvciBFTEYgc3ltYm9sIHRhYmxlcy4gIEdlbmVyYXRlcwotCWNhbm9uaWNhbCBiZmQgc3ltYm9sIHRhYmxlcyBmcm9tIEVMRiBzeW1ib2wgdGFibGVzLiAgQ2hhbmdlIHRoZQotCW5hbWUgb2Ygc29tZSBmdW5jdGlvbnMgZnJvbSBiZmRfPG5hbWU+IHRvIGVsZl88bmFtZT4uCi0KLQkqIHN5bXMuYzogIFRyaXZpYWwgZml4IHRvIGNvbW1lbnQgdG8gcmVtb3ZlIGEgcmVkdW5kYW50ICJ0byIuCi0KLVdlZCBOb3YgMTMgMTc6MDI6MDEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYte2kzODYsbTY4ayxtODhrfS5jOiAgQ2hhbmdlIG5hbWUgb2YgZmlsZSBmb3JtYXQgdG8gc3RhbmRhcmQKLQlmb3JtIHRoYXQgR0RCIHJlY29nbml6ZXMgYXMgQ09GRi4KLQotV2VkIE5vdiAxMyAwOTowOTo0MSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBpZWVlLmMgKGllZWVfb2JqZWN0X3ApOiAgY2FzdCBOVUxMIGNvcnJlY3RseS4KLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgaGFycmlzIGhvc3QKLQotCSogY29mZi1hMjlrLmM6IExvdHMgb2YgY2hhbmdlcywgbW9zdCBmcm9tIERhdmlkIFdvb2QuCi0KLVR1ZSBOb3YgMTIgMDc6MjE6NDEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTg4ay5jIChjb2ZmX3dyaXRlX2FybWFwKTogIEp1c3QgI3VuZGVmIGl0LgotCi1Nb24gTm92IDExIDIwOjMwOjE4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBzdGFuZGFyZGl6ZSBvbiBNSU5VU19HIHRvIGRpc2FibGUgZGVidWdnaW5nCi0JKiBjb2ZmLW04OGsuYzogY3JlYXRlIGNvZmYgYXJtYXBzIGluc3RlYWQgb2YgYnNkIG9uZXMuCi0JKiBvcG5jbHMuYyAoYmZkX2Nsb3NlX2FsbF9kb25lKSwgKGJmZF9jbG9zZSk6IE1hc2sgb3V0IHJhbmRvbSBiaXRzCi0Jd2hlbiBjYWxsaW5nIGNobW9kLgotCi1Nb24gTm92IDExIDE5OjA3OjMyIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYzogIEFkZGl0aW9ucyB0byBzdXBwb3J0IEVMRiBmb3JtYXQgY29yZSBmaWxlcy4KLQkqIGNvbmZpZy9taC1hbWl4OiAgQWRkIC1ESEFWRV9QUk9DRlMgdG8gSERFRklORVMsIHNpbmNlIGhvc3QKLQloYXMgc3VwcG9ydCBmb3IgL3Byb2MgKGFsbCB0aGUgaW5jbHVkZSBmaWxlcyBpbiBwYXJ0aWN1bGFyKS4KLQotTW9uIE5vdiAxMSAxODozNjo0NyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6ICBIYW5kbGUgdGhlIGNhc2UKLQlvZiB0d28gTl9TTyBzdGFicywgb25lIGZvciBkaXJlY3RvcnksIGFuZCBvbmUgZm9yIGZpbGVuYW1lLgotCi0JKiBiZmQtaW4uaCAocHJpbnRfdm1hKTogIEZhY3RvciBvdXQgZHVwbGljYXRlIGRlZmluaXRpb24uCi0KLQlFeGl0IGEgbGl0dGxlIG1vcmUgZ3JhY2VmdWxseSB3aGVuIG1hbGxvYyByZXR1cm5zIE5VTEwuCi0JKiBsaWJiZmQuYzogTmV3IGZ1bmN0aW9uIGJmZF94bWFsbG9jIChtYWxsb2Mgd3JhcHBlcikuCi0JKiBvcG5jbHMuYywgc3ltcy5jLCBib3V0LmMsIGFvdXR4Lmg6ICBSZXBsYWNlIG1hbGxvYyBieSBiZmRfeG1hbGxvYy4KLQkqIGxpYmJmZC5oOiBScmUtZ2VuZXJhdGVkIGR1ZSB0byBsaWJiZmQuYyB1cGRhdGUuCi0KLVNhdCBOb3YgIDkgMTM6NDU6MDEgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tdC1tNjhrLWVsZjogIERlZmluZSBERUZBVUxUX1ZFQ1RPUiBhcyBlbGZfYmlnX3ZlYy4KLQotCSogZWxmLmMgKGVsZl9vYmplY3RfcCk6ICBEb24ndCB0cnkgdG8gY3JlYXRlIGEgYmZkIHNlY3Rpb24gZm9yCi0JdGhlIGZpcnN0IEVMRiBzZWN0aW9uIGhlYWRlci4gIEl0IGlzIGp1c3QgYSBwbGFjZWhvbGRlci4KLQotU2F0IE5vdiAgOSAwMzowNDoyNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1yczYwMDAuYywgY29uZmlnL21oLXJzNjAwMDogIE1ha2UgaXQgd29yayBvbiBhcmNoaXZlIGFuZAotCWNvcmUgZmlsZXMsIHdoZW4gY29tcGlsaW5nIG5hdGl2ZS4KLQkqIGhvc3RzL2gtcnM2MDAwLmg6ICBEZWZpbmUgRkFTQ0lTVF9GRE9QRU4gZm9yIGJmZF9mZG9wZW5yLgotCi0JRklYTUU6ICBUaGUgYW91dGYxLmggY2hhbmdlIGJlbG93IG5lZWRzIHRvIGJlIHJldmVyc2VkIGJhY2sKLQl0byB0aGUgd2F5IGl0IHdhcy4KLQotVGh1IE5vdiAgNyAxMTowMzo1NSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogRGVmaW5lZCBuZXcgbWFjcm9zIFtQVVR8R0VUXUxJTkVOT19MTk5PIGZvcgotCW1hbmlwdWxhdGlvbiBvZiBsbm5vIGZpZWxkcyBpbiBsaW5lbm8gc3RydWN0cyBpbiBhIGNvZmYtPGY+LmgKLQlpbmRlcGVuZGVudCB3YXkuIE92ZXJyaWRlIGl0IGluIGNvZmYtPGY+LmggdG8geW91ciBmYXZvdXJpdGUKLQludW1iZXIgaWYgeW91IGRvbid0IGhhdmUgYSAxNmJpdCBsbm5vIGZpZWxkLiAoY29mZl9zd2FwX2xpbmVub19pbikKLQkoY29mZl9zd2FwX2xpbmVub19vdXQpOiBtb2RpZmllZCB0byB1c2UgdGhlIG5ldyBtYWNyb3MuCi0KLU1vbiBOb3YgIDQgMTE6Mzg6MzMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN1bm9zNF9jYWxsYmFjayk6IE5vdyBkZWZhdWx0cyB0byA2ODAyMCByYXRoZXIgdGhhbgotCXVua25vd24gYXJjaCB3aGVuIHRoZSBtYWdpYyBudW1iZXIgZG9lc24ndCBzcGVjaWZ5IHRoZQotCWFyY2hpdGVjdHVyZSwgc2luY2Ugc29tZSBPU3MgKGVnIG9sZCBzdW4zcykgZG9uJ3Qgc2V0IHRoZSBudW1iZXIsIGFuZAotCTAyMCBpcyBwcm9iYWJseSB0aGUgcmlnaHQgYW5zd2VyIGFueXdheS4KLQotU3VuIE5vdiAgMyAxMjowNzowOCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaC1uZXdzLmgsIGhvc3RzL2gtcnRic2QuaDoKLQlHZXQgcmlkIG9mIE1JU1NJTkdfVkZQUklOVEYsIHNpbmNlIGxpYmliZXJ0eSBwcm92aWRlcyBvbmUuCi0JKiBiZmQtaW4uaCAoYmZkX3ByaW50X3N5bWJvbF90eXBlX2hvcHcgZW51bSk6ICAgQWRkIG5ldyBvcHRpb24KLQliZmRfcHJpbnRfc3ltYm9sX25tLCBmb3IgdXNlIGJ5IG5tLgotCSogYW91dHguaCAoTkFNRShhb3V0LHByaW50X3N5bWJvbCkpOiAgQWRkIGNvZGUgZm9yIG5ldwotCWJmZF9wcmludF9zeW1ib2xfbm0gb3B0aW9uLCB0byBwcmludCBpbiBubSBmb3JtYXQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3ByaW50X3N5bWJvbCksIGllZWUuYyAoaWVlZV9wcmludF9zeW1ib2wpCi0Jb2FzeXMuYyAob2FzeXNfcHJpbnRfc3ltYm9sKTogIFByb3ZpZGUgc3R1YiBpbXBsZW1lbnRhdGlvbnMKLQlmb3IgYmZkX3ByaW50X3N5bWJvbF9ubS4KLQkqIHN5bXMuYzogIE5ldyBmdW5jdGlvbiBiZmRfZGVjb2RlX3N5bWNsYXNzLCB1c2VkIGJ5IG5tIHByaW50ZXIuCi0JTmV3IGZ1bmN0aW9uIGJmZF9zdGFiX25hbWUgdG8gbG9vayB1cCBzdHJpbmcgbmFtZSBvZiBzdGFiIGNvZGUuCi0KLVNhdCBOb3YgIDIgMTQ6MjY6MDMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkZWQgY3Rvci5jCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdCkgYWRkZWQKLQliZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cC4KLQkqIGNvZmZjb2RlLmg6IHJlbW92ZWQgYSBsb2FkIG9mICNpZiAwZWQgY29kZS4KLQkoY29mZl9jb21wdXRlX2ZpbGVfc2VjdGlvbl9wb3NpdGlvbnMpOiBub3cgd29ya3Mgb3V0IHRoZSBzZWN0aW9uCi0JYWxpZ25tZW50IGFuZCBzaXplIGNvcnJlY3RseSBpbiBhbGwgY2FzZXMuCi0JKGNvZmZfZ2V0X3N5bXRhYik6IGxvb2tzIGZvciBjb25zdHJ1Y3RvciBzeW1ib2xzIGFuZCBjYWxscyB0aGUKLQlyaWdodCBmdW5jdGlvbiB3aGVuIHRoZXkncmUgZm91bmQuIChjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6Ci0Ja25vd3Mgd2hlbiBhIHNlY3Rpb24gaXMgZnVsbCBvZiBjb25zdHJ1Y3RvcnMgYW5kIGRvZXMgdGhlIHJpZ2h0Ci0JdGhpbmcuCi0JKiBjcHUtbTg4ay5jOiBBZGRlZCBkZWZhdWx0X3JlbG9jX3R5cGUgbG9va3VwIHRvIHRoZSBhcmNoaXRlY3R1cmUKLQlkZXNjcmlwdGlvbi4KLQkqIGxpYmJmZC1pbi5oOiAoYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXApIGRlZnVuICBhZGRlZC4KLQkqIGxpYmNvZmYuaDogcmVtb3ZlZCAjaWYgMGVkIGNvZGUKLQkqIHJlbG9jLmM6IChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpIGFkZGVkIEJGRF9SRUxPQ19DVE9SIGZvcgotCWFyY2ggaW5kZXBlbmRlbnQgY29uc3RydWN0b3IgcmVsb2NhdGlvbiB0eXBlLgotCShiZmRfcmVsb2NfdHlwZV9sb29rdXApOiByZW1vdmVkIHRoZSBjb21tZW50ICJ0aGlzIHdpbGwgZ28gYXdheSIKLQlzaW5jZSBpdCB3b24ndC4gKGJmZF9ob3d0b18zMik6IHN0b2xlbiBmcm9tIDg4aywgdGhpcyBpcyBhIDMyYml0Ci0JcmVsb2Mgd2hpY2ggaXMgdXNlZCB3aGVuIEJGRF9SRUxPQ19DVE9SIGZhbGxzIHRocm91Z2ggdG8gZ2l2ZSBhCi0JZGVmYXVsdCAzMmJpdCByZWxvYyBmb3IgY29uc3RydWN0b3JzLgotCShiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cCk6IGFkZGVkLgotCSogYW91dGYxLmg6IGZpeGVkIFNFR01FTlRfU0laRSB0eXBvLgotCi1UaHUgT2N0IDMxIDE4OjIzOjA2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLXJzNjAwMC5jOiAgQ2hhbmdlIG5hbWUgdG8gImFpeGNvZmYtcnM2MDAwIiwgdG8gYXZvaWQKLQltYXRjaGluZyBwcmVmaXggImNvZmYiLgotCSogY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9pbiwgY29mZl9zd2FwX2F1eF9vdXQpOiAgSGFuZGxlCi0JcnMvNjAwMCBjc2VjdCByZWNvcmRzLgotCi1TdW4gT2N0IDI3IDE2OjU2OjU4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1tODhrLmMsIHRhcmdldHMuYzogY2hhbmdlIG5hbWUgb2YgbTg4a19iY3MgdG8gbTg4a2JjcwotCSogY29uZmlndXJlLmluOiBhZGQgbW90b3JvbGEgZGVsdGE4OCBjYXNlcwotCSogbGliYmZkLmgsIGxpYmJmZC1pbi5oLCBhcmNoaXZlLmMsIGllZWUuYywgZWxmLmMsIHNyZWMuYzogZml4Ci0Jd3JpdGVfYXJtYXAgcHJvdG90eXBlCi0JKiBsaWJiZmQuYzogYWRkIGRvYyBvbiBiZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludAotCi1GcmkgT2N0IDI1IDAyOjQ4OjE5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBSZW5hbWUgQ09GRi1yZWxhdGVkIGZpbGVzIGluIGBjb2ZmLUFSQ0guYycgZm9ybS4KLQljb2ZmLWEyOWsuYywgY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZi1tODhrLmMsCi0JY29mZi1taXBzLmMsIGNvZmYtcnM2MDAwLmMgdG8gYmUgZXhhY3QuCi0KLQkqIE1ha2VmaWxlLmluOiAgT25seSBzdXBwbHkgVEFSR0VUX0RFRkFVTFRTIHRvIHRhcmdldHMuYywgcmVkdWNpbmcKLQltYWtlIG91dHB1dCBjbHV0dGVyLgotCSogY29uZmlnL210LSo6ICBEaXR0by4KLQotVGh1IE9jdCAyNCAyMjo0MDowNyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCVJTLzYwMDAgc3VwcG9ydCwgYnkgTWV0aW4gRy4gT3ppc2lrLCBNaW1pIFBo+/RuZy1UaOVvIFb1LCBhbmQKLQlKb2huIEdpbG1vcmUuICBBcmNoaXZlIHN1cHBvcnQgZnJvbSBEYW1vbiBBLiBQZXJtZXplbC4KLQotCSogTWFrZWZpbGUuaW46ICBBZGQgY3B1LXJzNjAwMC5jIGFuZCByczYwMDBjb2ZmLmMuCi0JKiBjb25maWd1cmUuaW46ICBBZGQgcnM2MDAwIGNhc2UuCi0JKiB0YXJnZXRzLmM6ICBBZGQgcnM2MDAwIHZlY3Rvci4KLQkqIGFyY2h1cmVzLmM6ICBBZGQgcnM2MDAwLCBmaXggY29tbWVudCBvbiByb21wLgotCSogYmZkLWluLmggKGVudW0gYmZkX2Vycm9yKTogIEFkZCBub19kZWJ1Z19zZWN0aW9uIGVycm9yLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl90ZGF0YSk6ICBSZW1vdmUgdW51c2VkIHN0cmluZ190YWJsZS4KLQkqIGJmZC5jIChiZmRfZXJybXNncyk6ICBBZGQgbm9fZGVidWdfc2VjdGlvbiBlcnJvciBtZXNzYWdlLgotCSogc2VjdGlvbi5jIChiZmRfbWFrZV9zZWN0aW9uKTogIFJldHVybiBOVUxMIG9uIGF0dGVtcHQgdG8gY3JlYXRlCi0JYSBzZWN0aW9uIHR3aWNlLgotCSogY29mZmNvZGUuaCAoYmZkX3N3YXBfcmVsb2NfaW4pOiAgSGFuZGxlIHJfdHlwZSBhbmQgcl9zaXplLgotCShiZmRfc3dhcF9hb3V0aGRyX2luKTogIEhhbmRsZSBsb3RzIG1vcmUgbWVtYmVycy4KLQkobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogIElmIHNlY3Rpb24gaGFzIGFscmVhZHkgYmVlbiBzZWVuLAotCWp1c3QgcmV0dXJuIGZhbHNlIHJhdGhlciB0aGFuIG92ZXJ3cml0aW5nIGl0LgotCShjb2ZmX3JlYWxfb2JqZWN0X3ApOiAgVW5kZXJzdGFuZCBpbmNvbWluZyBtYWdpYyBudW1iZXJzLgotCShjb2ZmX3NldF9mbGFncyk6ICBVbmRlcnN0YW5kIG91dGdvaW5nIG1hZ2ljIG51bWJlcnMuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogIG91dGdvaW5nIGFvdXRoZHIgbWFnaWMgIy4KLQkoYnVpbGRfZGVidWdfc2VjdGlvbik6ICBBZGQgZm4gZm9yIHJlYWRpbmcgZGVidWcgc3RyaW5nIHNlY3Rpb24uCi0JKGdldF9ub3JtYWxpemVkX3N5bXRhYik6ICBIYW5kbGUgc3ltYm9sIG5hbWVzIGluIGRlYnVnIHN0cmluZyBzZWN0aW9uLgotCVJlbW92ZSB1bnVzZWQgb2JqX3N0cmluZ190YWJsZS4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgSGFuZGxlIHJzNjAwMC1zcGVjaWZpYyBzdG9yYWdlIGNsYXNzZXMuCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzLCBOX1NFVCopOiAgQ2hlY2sgZm9yCi0JZXhpc3Rpbmcgc2VjdGlvbiBiZWZvcmUgbWFraW5nIG9uZS4KLQkqIGNwdS1yczYwMDAuYzogIE5ldyBmaWxlLgotCSogcnM2MDAwY29mZi5jOiAgTmV3IGZpbGUuCi0KLVRodSBPY3QgMjQgMDI6MDM6MjQgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiBBZGQgcGFydGlhbCBzdXBwb3J0IGZvciBFTEYgZm9ybWF0IGNvcmVmaWxlcy4gU3RpbGwgbmVlZHMKLQlzdXBwb3J0IGZvciBleHRyYWN0aW5nIHJlZ2lzdGVycyBmcm9tIGNvcmVmaWxlcy4KLQotCSogY29uZmlnL3QtbTY4ay1lbGY6ICBTZXQgREVGQVVMVF9WRUNUT1IgdG8gZWxmX2JpZ192ZWMuCi0KLQkqIGNvbmZpZy97aC1hbWl4LGgtZGd1eCxoLWlyaXgzLGgtdWx0cmEzfTogRm9yIHN5c3RlbXMgd2hlcmUKLQlSQU5MSUIgaXMgZGVmaW5lZCBhcyBlY2hvLCBzZW5kIHRoZSBvdXRwdXQgdG8gL2Rldi9udWxsIHRvIGhlbHAKLQlyZWR1Y2UgY2x1dHRlciBpbiB0aGUgb3V0cHV0IGZyb20gZG9pbmcgYSBtYWtlLgotCi1Nb24gT2N0IDIxIDE3OjQ4OjQ4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0cy9oLXZheHVsdC5oOiAgUmVtb3ZlIG1hbGxvYy9mcmVlIGRlY2xzIGNvdmVyZWQgaW4gc3RkbGliLmguCi0JRml4IEhPU1RfUEFHRV9TSVpFIGFuZCBIT1NUX1NFR01FTlRfU0laRS4gIEZyb20gRGF2aWQgVGF5bG9yLgotCi1Nb24gT2N0IDIxIDA5OjM0OjExIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogbWFrZSBpdCBwYWQKLQlzZWN0aW9uIHNpemUgb3V0IGlmIHRoZXJlIGFyZSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIHNvIHRoYXQgdGhlCi0JaW1hZ2Ugd2lsbCBiZSBvayBvbiBhIHN5c3RlbSB3aGVyZSBzZWN0aW9uIHBvc2l0aW9ucyBhcmUgd29ya2VkCi0Jb3V0IGJ5IGFjY3VtdWxhdGluZyBzaXplcyByYXRoZXIgdGhhbiBmcm9tIHRoZSBzZWN0aW9uIGhlYWRlcnMuCi0JKiB0YXJnZXRzLmMgKHByb3RvIHdyaXRlX2FybWFwKS4gQ2hhbmdlZCBvcmxfY291bnQgdG8gdW5zaWduZWQuCi0JKiBvcG5jbHMuYyAoYmZkX2Nsb3NlX2FsbF9kb25lKS4gQWRkZWQgc28gdGhhdCBnZW5lcmF0aXZlCi0JcHJvZ3JhbXMgbGlrZSBnYXMgY2FuIGNsb3NlIGEgYmZkIHdpdGhvdXQgY2F1c2luZyBiZmQgY29uZnVzaW9uLgotCSogbGliYmZkLmggKGNoYW5nZWQgYmVjdWFzZSBvZiBwcm90b3MpCi0JKiBhbWRjb2ZmLmM6IG1lc3NlZCB3aXRoIHRoZSB3YXkgdGhhdCBqbXAgZGlzcGxhY2VtZW50cyBhcmUKLQljYWxjdWFsYXRlZC4gVGhpcyBtYXkgbm90IHlldCBiZSB0b3RhbGx5IGNvcnJlY3QuCi0JKiBhcmNoaXZlLmMgKGNvZmZfd3JpdGVfYXJtYXApOiByZXdyb3RlIHRoZSB3YXkgdGhhdCByYW5saWJzIGFyZQotCXdyaXR0ZW4gb3V0LgotCSogY29mZmNvZGUuaCAoZml4dXBfc3ltYm9sX3ZhbHVlKTogbm93IGRvZXNuJ3QgY29yZSBkdW1wIGlmIGEgbm9uCi0JYWJzIHN5bWJvbCBoYXMgbm8gc2VjdGlvbiAobGlrZSBhIHJlZ2lzdGVyIHN5bWJvbCkuCi0JKGNvZmZfd3JpdGVfc3ltYm9sKSBub3cgemVyb3MgYXV4ZW50IGJlZm9yZSBmaWxsaW5nIGl0IHVwIHRvIGhlbHAKLQl3aXRoIHNlbnNpdGl2ZSBhcHBsaWNhdGlvbnMuCi0JKiBsaWJiZmQuYyAoYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQpOiBhZGRlZC4KLQotV2VkIE9jdCAxNiAyMjo1ODo0NSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmM6ICBNYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IGEgbWFjcm8gc3RyZXJyb3IoKS4KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6ICBJZiBGQVNDSVNUX0ZET1BFTiwgdXNlICJyIiwgbm90ICJyKyIuCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpOiAgU3VwcHJlc3MKLQlhdHRlbXB0IHRvIHJlY292ZXIgY29tbWFuZCwgaWZkZWYgTk9fQ09SRV9DT01NQU5ELgotCSogaG9zdHMvaC10YWhvZS5oOiAgQWRkIEZBU0NJU1RfRkRPUEVOIGFuZCBOT19DT1JFX0NPTU1BTkQ7Ci0JcmV2YW1wIEhPU1RfKiwgZXRjLgotCSogaG9zdHMvaC1pMzg2di5oOiAgVXNlIDx1dGltZS5oPiwgbm90IDxzeXMvdXRpbWUuaD4sIHVubGlrZSBQT1NJWC4KLQotV2VkIE9jdCAxNiAxMjo0Mzo0OSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChic2Rfd3JpdGVfYXJnbWFwKTogVGhlIHNpemUgb2YgdGhlIHJhbmxpYiBzdHJ1Y3R1cmVzCi0Jc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSBzaXplIGZpZWxkIGl0c2VsZi4KLQkqIGFvdXR4LmgsIGxpYmFvdXQuaCAoTkFNRShhb3V0LCBzaXplb2ZfaGVhZGVycykpOiAgVXNlCi0JYWRhdGEoYWJmZCktPmV4ZWNfYnl0ZXNfc2l6ZSBmaWVsZCBpbnN0ZWFkIG9mIGNvbnN0YW50IG1hY3JvLAotCWJlY2F1c2UgYW91dHguaCBjb21waWxlcyB0byBhIHNpbXBsZSAubyBmaWxlIHNoYXJlZCBieQotCWFsbCAzMi1iaXRzIGEub3V0IHRhcmdldHMuCi0KLVdlZCBPY3QgMTYgMTE6MTE6MDUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFsbG93IGkzODYtc2NvLXN5c3YuCi0JKiBib3V0LmM6ICBSZW1vdmUgdW51c2VkIGk5NjBfYWxpZ247IGxpbnQgZHVtbXkgY29yZSBmaWxlIGhhbmRsZXJzLgotCSogY3B1LWg4MzAwLmM6ICBsaW50LgotCi0JKiBob3N0LWFvdXQuYzogIE5ldyBzdHJhdGVneS4gIFdlIHVzZSBjb21tb24gY29kZSwgaW5jbHVkZSBmaWxlcywKLQlhbmQgZGF0YSBzdHJ1Y3R1cmVzIHRvIGhhbmRsZSB0aGUgZmlsZSwgYnV0IHNldCBhIGZldyBwYXJhbWV0ZXJzCi0JZnJvbSB0aGUgaG9zdCdzIGNvbmZpZyBmaWxlIChwYWdlIHNpemUsIHRleHQgc3RhcnQgYWRkciwgZXRjKS4KLQkqIGxpYmFvdXQuaDogIERlZmluZSBIUCBCU0QgbWFjaGluZSB0eXBlcy4KLQkqIGFvdXRmMS5oOiAgSGFuZGxlIHJlYWRpbmcgYS5vdXRzIHdpdGggdGhlc2UgdHlwZXMuCi0KLQkqIHRyYWQtY29yZS5jOiAgUGFzcyB0aGUgdS51X2FyMCB2YWx1ZSBhcyB0aGUgbmVnYXRpdmUgb2YgdGhlCi0JdmlydHVhbC1tZW1vcnktYWRkcmVzcyBvZiB0aGUgLnJlZyBzZWN0aW9uLiAgV2UgY2FuJ3QganVzdCBtYWtlIGEKLQlzZWN0aW9uIGZvciAiYWxsIHRoZSByZWdzIGFuZCBub3RoaW5nIGVsc2UiIGJlY2F1c2Ugb25seSBHREIga25vd3MKLQlleGFjdGx5IHdoZXJlIHRoZSByZWdzIGFyZSAoc2NhdHRlcmVkIGFyb3VuZCB0aGUgdXBhZ2UgYW5kIHN0YWNrKS4KLQlDbGVhbiB1cCBtZW1vcnkgYWxsb2NhdGlvbi4gIFJlbW92ZSBiaWctIGFuZCBsaXR0bGUtZW5kaWFuCi0JdmVjdG9ycywgcmVwbGFjZSB3aXRoIHNpbmdsZSB2ZWN0b3I7IHRoaXMgb25seSBydW5zIG9uIHRoZSBob3N0LAotCWluIGhvc3QgYnl0ZSBvcmRlci4gIFJlcGxhY2UgYnl0ZXN3YXAgcm91dGluZXMgd2l0aCBhYm9ydHMgaW4gY2FzZQotCWFueW9uZSBjYWxscyB0aGVtLgotCSogdGFyZ2V0cy5jOiAgVGhlcmUncyBvbmx5IG9uZSB0cmFkX2NvcmVfdmVjIG5vdy4KLQkqIGFvdXRmMS5oIChzdW5vc19jb3JlX2ZpbGVfcCk6ICBWTUEgb2YgLnJlZyogbm93IG5lZWRzIHRvIGJlIDAuCi0KLVR1ZSBPY3QgMTUgMDg6Mjk6MDMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2gtYW1peC5oIChmcmVlKTogIEZpeCBwcm90b3R5cGUuCi0KLQkqIGFvdXR4Lmg6ICBEb24ndCB1c2UgTlVMTCBhcyBhbiBpbnRlZ2VyLCBmb3IgYnJhaW5kZWFkIHN5c3RlbXMKLQl0aGF0IGRlY2xhcmUgaXQgYXMgKHZvaWQgKikwLiAgKEZyb20gUGV0ZXIgU2NoYXVlci4pCi0KLU1vbiBPY3QgMTQgMTc6MjA6NDcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6ICBBZGQgcGFyZW50aGVzZXMgdG8gYXZvaWQgcmVwb3J0ZWQKLQlwcm9ibGVtIHdpdGggYmFkIFVsdHJpeCBzeXN0ZW0gaGVhZGVycy4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cykpOiAgVHJ5IHRvIGhhbmRsZSB0aGUKLQl2YXJpb3VzIGtpbmRzIG9mIGFsaWdubWVudHMgZm9yIHRoZSB2YXJpb3VzIGtpbmRzIG9mCi0JbWFnaWMgbnVtYmVycy4KLQotTW9uIE9jdCAxNCAxNDoyMzoxMCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlOiAgRG9uJ3QgYXNzdW1lIC4gaXMgb24gdGhlIHBhdGggKGZyb20gSmFtZXMgQ2xhcmspLgotCi1GcmkgT2N0IDExIDIyOjQ1OjE0IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEF2b2lkIFN1biBNYWtlIFZQQVRIIGJ1Z3MuCi0JKiB0YXJnZXRzLmM6ICBEZWNsYXJlIHRyYWRfY29yZSB2ZWN0b3JzIGV4dGVybi4KLQotRnJpIE9jdCAxMSAxMzowMzowMiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogTW92ZWQgQUxJR04gbWFjcm8gdG8gbGliYmZkLmguIFJlbW92ZWQgaTk2MF9hbGlnbi4KLQkqIGxpYmJmZC5oOiBNb3ZlZCBBTElHTiBtYWNybyBoZXJlLgotCSogYm91dC5jIChiX291dF9jYWxsYmFjayk6IFJlcGxhY2UgaTk2MF9hbGlnbiBieSBhbGlnbl9wb3dlci4KLQotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiAgQWRkZWQgZmllbGRzIHBhZ2Vfc2l6ZSwKLQlzZWdtZW50X3NpemUgYW5kIGV4ZWNfYnl0ZXNfc2l6ZS4gIFRoZXNlIGhlbHAgZ2VuZXJpYyBjb2RlCi0JKGluIGFvdXR4LmggYW5kIGxpYmFvdXQuaCkgdG8gZmlndXJlIG91dCB3aGVyZSB0byBhbGlnbgotCXRoZSB2YXJpb3VzIHNlZ21lbnRzIGluIGEgZGVtYW5kIHBhZ2VkIGZpbGUuCi0JKiBsaWJhb3V0LmggKFdSSVRFX0hFQURFUik6ICBVc2UgbmV3IChzdHJ1Y3QgYW91dGRhdGEpIGZpZWxkcwotCXRvIGRlY2lkZSBpZiB0aGUgZXhlYyBoZWFkZXIgY291bnRzIGluIGFfdGV4dCAodGV4dCBzZWdtZW50IHNpemUpLgotCUFsc28sIGFzc3VtZSBEX1BBR0VEIGZsYWcgaXMgc2V0OyBkb24ndCBzZXQgaXQgaGVyZS4KLQkqIGJvdXQuYyAoYl9vdXRfY2FsbGJhY2spOiBBZGQgaW5pdGlhbGl6YXRpb24gb2YKLQlhZGF0YSBmaWVsZHMgcGFnZV9zaXplLCBzZWdtZW50X3NpemUsIGFuZCBleGVjX2J5dGVzX3NpemUuCi0JKiBob3N0LWFvdXQuYyAoTkFNRShob3N0X2FvdXQsIGNhbGxiYWNrKSBhbmQKLQlOQU1FKGhvc3RfYW91dCxta29iamVjdCk6IERpdHRvLgotCSogaTM4NmFvdXQuYyAoYW91dDM4Nl9jYWxsYmFjaykgYW5kIG5ldyBhb3V0Mzg2X21rb2JqZWN0KTogRGl0dG8uCi0JKiBuZXdvczMuYyAobmV3c29zM19jYWxsYmFjaykgYW5kIG5ldyBuZXdzb3NfbWtvYmplY3QpOiBEaXR0by4KLQkqIGFvdXRmMS5jIChzdW5vczRfY2FsbGJhY2spIGFuZCBuZXcgc3Vub3NfbWtvYmplY3QpOiBEaXR0by4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogRG9uJ3Qgc3VidHJhY3QKLQlFWEVDX0JZVEVTX1NJWkUgZnJvbSB0aGUgYV90ZXN0IHNpemU7IHRoaXMgaXMgb25seSBhcHByb3ByaWF0ZQotCWZvciBzb21lIHN5c3RlbXMgKG1haW5seSBzdW5vcyksIHNvIGRvIGl0IGluIHRoZSBjYWxsYmFjayBpbnN0ZWFkLgotCVNhbWUgcm91dGluZTogQWRkIHN0dWZmIHRvIHRoZSBUSElTX0lTX09OTFlfRE9DVU1FTlRBVElPTiBjb21tZW50LgotCSogYW91dHguaCAoTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2hhbmdlIHRoZSB3YXkKLQlmaWxlcG9zIGFuZCBzaXplIG9mIHNlY3Rpb25zIGFyZSBjYXJyaWVkIG91dCB0byBzdXBwb3J0Ci0Jb2xkZXIgc3R5bGVzIG9mIGRlbWFuZCBwYWdlZCBleGVjdXRhYmxlcy4KLQotCi1GcmkgT2N0IDExIDEyOjMzOjM2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmg6IEFkZGVkIG1vcmUgbWFjcm9zIHRvIENPRkZfU1dBUF9UQUJMRS4KLQkqIGJmZC5jOiBBZGRlZCBtYWNyb3MgdG8gZW5hYmxlIGdhcyB0byBzd2FwIGNvZmYgcmVjb3Jkcy4KLQkqIGNvZmZjb2RlLmg6IE1ha2UgdGhlIGNvZmZfc3dhcF8qX291dCByb3V0aW5lcyByZXR1cm4gdGhlIG51bWJlcgotCW9mIGJ5dGVzIHN3YXBwZWQsIGFuZCBjbGVhbmVkIHVwIHRoZWlyIHByb3RvdHlwZXMuCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIGVibW9uL2NvZmYgc3VwcG9ydAotCSogZWNvZmYuYzogQ2hhbmdlZCBudWxsIGRlZmluaXRpb25zIG9mIGNvZmZfc3dhcF8qX291dCB0byBjb25mb3JtCi0JdG8gbmV3IHByb3RvdHlwZXMKLQkqIHRhcmdldHMuYzogQWRkZWQgbmV3IGVudHJ5IHBvaW50cyBmb3IgY29mZiBzd2FwcGluZwotCi1GcmkgT2N0IDExIDAzOjAxOjUyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JUmVzdHJ1Y3R1cmUgY29uZmlndXJhdGlvbiBzY2hlbWUgZm9yIGJmZCwgYmludXRpbHMsIGxkLgotCi0JKiBpbmNsdWRlL3N5cy9oLSouaDogIE1vdmUgdG8gYmZkL2hvc3RzL2gtKi5oLgotCSogY29uZmlndXJlLmluOiAgUmV2aXNlIHRvIHN5bWxpbmsgc3lzZGVwLmggdG8gaG9zdHMvaC14eHguaC4KLQlDaGFuZ2Ugc29tZSBjb25maWcgbmFtZXMgdG8gbWF0Y2ggb3RoZXIgZGlycy4KLQkqICouYzogIEluY2x1ZGUgYmZkLmggYmVmb3JlIHN5c2RlcC5oLCBzbyBhbnNpZGVjbCBhbmQgUFJPVE8oKQotCWdldCBkZWZpbmVkIGZpcnN0LgotCSogTWFrZWZpbGUuaW46ICBVc2UgLUkuIHRvIGdldCBzeXNkZXAuaC4gIFJlbW92ZSByZWZzIHRvCi0JLi4vaW5jbHVkZS9zeXNkZXAuaC4KLQkqIGNwdS1pOTYwLmM6ICBTdHJuY21wIG5lZWRlZCBhIGxlbmd0aCBhcmcuCi0JKiBlY29mZi5jOiAgRG9uJ3QgZXZlciBjYWxsIHRyYWRfdW5peF9jb3JlX2ZpbGVfcCBmcm9tIGhlcmUuCi0JKiBpMzg2YW91dC5jOiAgUmVtb3ZlIGRlYWQgTl9UWFRPRkYgb3ZlcnJpZGUuCi0JKiB0cmFkLWNvcmUuYzogIERvbid0IGRpc2FibGUgdGhlIHdob2xlIGZpbGUgaWYgU1VONF9TWVMuCi0JKiBjb25maWcvOiAgUmVuYW1lIHNvbWUgY29uZmlnIGZpbGVzIHRvIG1hdGNoIHVwIGgtKi5oIG5hbWVzLgotCVJlbW92ZSBhbGwgdGhlIEhPU1RfU1lTIGRlZmluaXRpb25zIGZyb20gdGhlIGNvbmZpZyBmaWxlcy4KLQkqIGhvc3RzL2gtYW1peC5oLCBoLWkzODZ2Lmg6ICBEZWZpbmUgUE9TSVhfVVRJTUUsIG5vdCBVU0cuCi0JKiBob3N0cy9oLWhwOTAwMC5oOiAgUmVtb3ZlIFVTRyBjb21tZW50LgotCSogaG9zdHMvaC1yczYwMDAuaDogIEluY2x1ZGUgPHN0ZGxpYi5oPiBmb3IgbWFsbG9jLgotCSogaG9zdHMvaC1uZXdzLmgsIGgtc3BhcmMtNjQuaDogIE5ldyBjb25maWcgZmlsZXMgdGhhdCBoYWQKLQlwcmV2aW91c2x5IGJlZW4ga2x1ZGdlZCBpbiB0aGUgPHN5c2RlcC5oPiBmaWxlLgotCi1UaHUgT2N0IDEwIDE3OjU0OjA4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvKjogIHRyYWQtY29yZSBzdXBwb3J0IGlzIEhPU1QgZGVwZW5kZW50LCBub3QgdGFyZ2V0Ci0JZGVwZW5kZW50LiAgVGFyZ2V0IGNvbmZpZyBmaWxlcyBvbmx5IHNldCBERUZBVUxUX1ZFQ1RPUiBhbmQvb3IKLQlvdGhlciB2ZWN0b3IgZWxlbWVudHMuICBFeGNlcHRpb246ICB3aGVuIGhvc3QtYW91dC5jIGlzIGluIHVzZSwKLQlpbiB3aGljaCBjYXNlIHdlJ3JlIGZvcmNlZCB0byBhc3N1bWUgd2UncmUgbmF0aXZlIChocCwgdmF4LAotCXRhaG9lKS4gIFJlbmFtZSBYREVQRklMRVMgdG8gSERFUEZJTEVTLgotCSogTWFrZWZpbGUuaW46ICBSZW5hbWUgWERFUEZJTEVTLgotCSogY29uZmlnL2gtc3VuKjogIERvbid0IGZvcmNlIHN0YXRpYyBsaW5raW5nLgotCSogdHJhZC1jb3JlLmM6ICBEb2N1bWVudCBob3cgdG8gdXNlIGl0IG5vd2FkYXlzLgotCSogaTM4NmFvdXQuYywgbmV3c29zMy5jOiAgQ2xlYW4gdXAuCi0JKiBpMzg2Y29mZi5jOiAgQWxsb3cgMzg2IGNvZmYgZmlsZXMgdG8gYmUgdXNlZCBhcyBjb3JlIGZpbGVzIHRvbwotCShmb3IgcmVhZGluZyBjb3JlIGZpbGVzIGZyb20gZW1iZWRkZWQgc3lzdGVtcykuCi0KLVR1ZSBPY3QgIDggMTU6MzA6MzkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIEFkZCBpMzg2YW91dC5jIGZvciBhLm91dCBzdXBwb3J0IG9uIHRoZSBpMzg2LgotCi1UdWUgT2N0ICA4IDEyOjE4OjU0IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMsIHNlY3Rpb24uYywgc3ltcy5jLCB0YXJnZXRzLmM6IGNvcnJlY3QgaW5mby1ub2RlCi0Jc3RydWN0dXJlIGluICpkb2MqIGNvbW1lbnRzLgotCWRvYy9NYWtlZmlsZTogc3RvcCBoaWRpbmcgY29tcGxhaW50cyBmcm9tIG1ha2VpbmZvLgotCi1TdW4gT2N0ICA2IDE5OjEwOjA2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICguLi5zb21lX2FvdXRfb2JqZWN0X3ApOiAgVGFrZSBhIHRoaXJkIHBhcmFtZXRlciwKLQl0aGUgaW50ZXJuYWxfZXhlYyBzdHJ1Y3QsIGFuZCBhdm9pZCBldmVyIGxvb2tpbmcgYXQgYW4KLQlleHRlcm5hbF9leGVjLiAgQWxsIGNhbGxlcnMgY2hhbmdlZCB0byByZWFkIHRoZSBlbnRpcmUKLQlleHRlcm5hbF9leGVjIHN0cnVjdCwgc3dhcCBhbmQgY2hlY2sgaXRzIG1hZ2ljIG51bWJlciwKLQlzd2FwIGluIHRoZSB3aG9sZSBzdHJ1Y3R1cmUsIGFuZCBwYXNzIHRoZSBzd2FwcGVkLWluIHZlcnNpb24gdG8KLQlzb21lX2FvdXRfb2JqZWN0X3AuCi0JKiBib3V0LmM6ICBCcmluZyBpbnRvIG1vZGVybiBlcmEuICBVc2Ugc2luZ2xlIF9vYmplY3RfcCByb3V0aW5lCi0JZm9yIGJpZy0gYWFuZCBsaXR0bGUtZW5kaWFuLiAgUHJvdmlkZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwKLQlleGVjIGhlYWRlciBzdHJ1Y3RzLiAgVXNlIHNlcGFyYXRlIHN3YXAtaW4gYW5kIHN3YXAtb3V0IHJvdXRpbmVzLgotCi0JKiBsaWJhb3V0Lmg6ICBNb3ZlIHN0cnVjdCBpbnRlcm5hbF9leGVjIGZyb20gLi4vaW5jbHVkZS9hb3V0NjQuaAotCXRvIGhlcmUuICBBZGQgb2JqX3N5bWJvbF9lbnRyeV9zaXplIHRvIHN0cnVjdCBhb3V0ZGF0YS4KLQkqIGFvdXR4LmggKC4uLnNvbWVfYW91dF9vYmplY3RfcCk6ICBTZXQgb2JqX3N5bWJvbF9lbnRyeV9zaXplLgotCi0JKiAuLi9pbmNsdWRlL2FvdXQ2NC5oOiAgQ2hhbmdlIEVYVEVSTkFMX0xJU1RfU0laRSB0bwotCUVYVEVSTkFMX05MSVNUX1NJWkUuICBDYWxsZXJzIGNoYW5nZWQuCi0KLUZyaSBPY3QgIDQgMTg6MTg6NDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5jOiAgUmVtb3ZlIHN0cmVycm9yKCkgdG8gbGliaWJlcnR5LgotCi0JKiBlbGYuYzogIFJlbW92ZSBlbGZfc2V0X3NlY3Rpb25fY29udGVudHMsIHVzZSBnZW5lcmljIG9uZS4gIExpbnQuCi0JKiBsaWJiZmQtaW4uaCwgbGliYmZkLmM6ICBBZGQgYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMuCi0JKiBsaWJiZmQuYyAoYmZkX2dlbmVyaWNfe2dldCxzZXR9X3NlY3Rpb25fY29udGVudHMpOiAgQ2hlY2sgdGhhdAotCWxhc3QgYnl0ZSBvZiB0cmFuc2Zlciwgbm90IGZpcnN0IGJ5dGUsIGlzIHdpdGhpbiB0aGUgc2VjdGlvbi4KLQotCSogaG9zdC1hb3V0LmM6ICBSZW1vdmUgYEJTRCcgYXJjaGl2ZSBzdXBwb3J0LiAgTGludC4KLQotCSogYXJjaHVyZXMuYzogUmVuYW1lIGBzdHJ1Y3QgYmZkX2FyY2hfaW5mb19zdHJ1Y3QnIHRvIGBzdHJ1Y3QKLQliZmRfYXJjaF9pbmZvJy4gIFJlbmFtZSBgdHlwZWRlZiBiZmRfYXJjaF9pbmZvX3N0cnVjdF90eXBlJyB0bwotCWBiZmRfYXJjaF9pbmZvX3R5cGUnLiAgQWxsIHVzZXMgY2hhbmdlZC4KLQkqIHJlbG9jLmM6ICBSZW5hbWUgYGJmZF9yZWxvY19zdGF0dXNfZW51bV90eXBlJyB0bwotCWBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUnLiAgUmVuYW1lIGBiZmRfcmVsb2NfY29kZV9lbnVtX3JlYWxfdHlwZScKLQl0byBgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlJy4gIChUaGlzIHNlZW1zIHRvIGJlIGEgbWlzbm9tZXIsCi0JaXQgbmVlZHMgYSBiZXR0ZXIgbmFtZS4pICBBbGwgdXNlcyBjaGFuZ2VkLgotCSogdGFyZ2V0cy5jOiAgUmVuYW1lIGBlbnVtIHRhcmdldF9mbGF2b3VyX2VudW0nIHRvIGBlbnVtCi0JdGFyZ2V0X2ZsYXZvdXInLCBhbmQgcmVtb3ZlIHRoZSBgX2VudW0nIGZyb20gYWxsIG9mIHRoZSBlbnVtCi0JdmFsdWVzIHRoZW1zZWx2ZXMuICBBbGwgdXNlcyBjaGFuZ2VkLgotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy9oLWkzODZtYWNoOiAgaTM4NiBtYWNoIGhvc3QuCi0JKiBjb25maWcvdC1pMzg2LWFvdXQ6ICBVc2UgaG9zdC1hb3V0LmMuCi0KLQkqIHRyYWQtY29yZS5jOiAgR2l2ZSBpdCBpdHMgb3duIHh2ZWMncyB0byBtYWtlIGl0IGluZGVwZW5kZW50Ci0Jb2Ygb3RoZXIgZmlsZSBmb3JtYXRzLgotCSogZWNvZmYuYywgaG9zdC1hb3V0LmM6ICBSZW1vdmUgcmVmcyB0byB0cmFkLWNvcmUuCi0JKiBjb25maWcvdC1kZWMzMTAwLCB0LWhwMzAwYnNkLCB0LXRhaG9lLCB0LXZheDogIERlZmluZSBUUkFEX0NPUkUuCi0JKiB0YXJnZXRzLmM6ICAjaWZkZWYgVFJBRF9DT1JFLCBpbmNsdWRlIGl0IGluIHRoZSB2ZWN0b3IuCi0KLUZyaSBPY3QgIDQgMTc6Mzg6MDMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiByZWxvYy5jOiBFeHRlbmRlZCBORVdIT1dUTyBtYWNybwotCSogaWVlZS5jOiBDaGFuZ2VkIHRoZSB3YXkgOGJpdCBwY3JlbCBpcyBkb25lCi0JKiBjcHUtaDgzMDAuYzogZ290IHRoZSByZWdpc3RlcnMgaW4gdGhlIHJpZ2h0IG9yZGVyCi0KLVRodSBPY3QgIDMgMTk6Mzk6NTUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oOiAgZW51bSBib29sZWFuID0+IGVudW0gYmZkX2Jvb2xlYW4gZm9yIFNWUjQuICBHdW1ieSdzCi0JcHJlZGljdGlvbiBpcyB2aW5kaWNhdGVkIQotCi0JKiBiZmQtaW4uaCwgbGliYmZkLWluLmgsIGRvYy9NYWtlZmlsZSwgZG9jL3RvbGliYmZkLCBkb2MvaW50b2JmZDoKLQlSZW1vdmUgcmVmcyB0byBob3d0by5jLCBzaW5jZSBTdGV2ZSBmb3Jnb3QuCi0KLVRodSBPY3QgIDMgMDc6NDk6MjEgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYzogdG9vayB0aGUgYWJvcnQgb3V0IG9mIHNldF9hcmNoX21hY2ggc28gdGhhdCBvYmpkdW1wIC1pIHdpbGwKLQlzdGlsbCB3b3JrLiBOb3cgYWxsb3dzIGFueSBhcmNoaXRlY3R1cmUvbWFjaGluZSB0byBiZSBzZXQuCi0KLVdlZCBPY3QgIDIgMTM6NTA6MzUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBob3d0by5jIGRlbGV0ZWQgYW5kIG1vdmVkIGNvZGUgdG8gcmVsb2MuYwotCi0JKiBsaWJiZmQuaCwgbGliYmZkLWluLmggcmVtb3ZlZCAkaWQgc3R1ZmYgZm9yIHJlYWwKLQotCSogY3B1LWg4MzAwLmMgTWFkZSBpdCBtYXRjaCB2YXJpb3VzIGRpZmZlcmVudCBzcGVsbGluZ3Mgb2YgaDgzMDAuCi0KLQkqIGFyY2h1cmVzLmM6IFRvb2sgb3V0IHRoZSBmaXJzdCBjaGFyIGZpbHRlciB3aGljaCBtYWRlIGl0IG9ubHkKLQlsb29rIGZvciBhIGNwdS9hcmNoIG1hdGNoIHdoZW4gdGhlIGZpcnN0IGNoYXJzIG9mIHN1cHBsaWVkIGFuZAotCXRlc3RlZCBuYW1lcyB3ZXJlIHRoZSBzYW1lLgotCi0JKiB0YXJnZXRzLmMgcmVtb3ZlZCBvYXN5cyBzdHVmZiwgcGVuZGluZyBzb21lb25lIHRvIGZpeCB0aGUgYnVncwotCWluIGl0LgotCi0KLVR1ZSBPY3QgIDEgMTI6Mjk6NDQgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW4sIHRhcmdldHMuYywgZWxmLmM6ICBBZGQgcHJlbGltaW5hcnkKLQlFTEYgc3VwcG9ydCBnb29kIGVub3VnaCBmb3IgR0RCLgotCSogY29uZmlndXJlLmluLCBjb25maWcvaC1hbWl4LCBjb25maWcvdC1tNjhrLWVsZjogIEhhbmRsZQotCW02OGstY2JtLXN2cjQgaG9zdCBhbmQgdGFyZ2V0LgotCSogY29uZmlnL3QtbTY4ay1jb2ZmLCB0LW04OGstY29mZiwgdC1tODhrLWFvdXQ6ICBNYWtlIGZpbGVzIG5vbmVtcHR5Ci0Jc28gYGRpZmYnIGFuZCBgcGF0Y2gnIGNhbiBjb3BlLgotCi1UdWUgT2N0ICAxIDExOjI0OjMxIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYzogcmVtb3ZlZCB0ZXhpbmZvIGVycm9yCi0KLQkqIGluaXQuYzogYWRkZWQgdGV4aW5mbyBob29rcywgYW5kIHJlbW92ZWQgaW5pdGlhbGl6YXRpb24gZXJyb3IKLQltZXNzYWdlLgotCi0JKiBsaWJjb2ZmLWluLmgsIGxpYmJmZC1pbi5oIHJlbW92ZWQgJGlkIGZpZWxkIHNvIGN2cyBjYW4gbWVyZ2UKLQl3aXRob3V0IGNvbXBsYWludHMuCi0KLVR1ZSBPY3QgIDEgMDU6MDI6NTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNwdS1pOTYwLmM6ICBBdm9pZCBudW1lcmljYWwgY291bnQgb2YgaW5pdGlhbGl6ZXJzLgotCi0JVmF4IFVsdHJpeCBjaGFuZ2VzIGZyb20gRGF2aWQgVGF5bG9yIDx0YXlsb3JAdGhpbmsuY29tPjoKLQkqIGhvc3QtYW91dC5jOiAgTWFrZSBsaXR0bGUtZW5kaWFuIHZlY3RvciByZWFsbHkgbGl0dGxlLWVuZGlhbi4KLQkqIGNvbmZpZ3VyZS5pbjogIFNlcGFyYXRlIHZheCBhbmQgdGFob2UgY2FzZXMsIGhhbmRsZSB1bHRyaXguCi0JKiBjb25maWcvdC12YXg6ICBBZGQgdHJhZC1jb3JlLm8uCi0JKiBjb25maWcvaC12YXh1bHQ6ICBOZXcgaG9zdCBzeXN0ZW0uCi0KLU1vbiBTZXAgMzAgMTU6MTM6NDYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCBWRVJTSU9OLCBjaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMC4xOCwgdGhpcyBtYWtlcyBhCi0JZ2FwLCBidXQgbm93IGlzIHRoZSBzYW1lIGFzIHRoZSBsaW5rZXIgdmVyc2lvbiBudW1iZXIuCi0KLQkqIGNwdS1hMjlrLmMsIGNwdS1pMzg2LmMsIGNwdS1tNjhrLmMsIGNwdS1taXBzLmMsIGNwdS12YXguYywKLQljcHUtaDgzMDAuYywgY3B1LWk5NjAuYywgY3B1LW04OGsuYywgY3B1LXNwYXJjLmM6IGFkZGVkLiBUaGVzZQotCWZpbGVzIHdpbGwgZXZlbnR1YWxseSBjb250YWluIHByb2Nlc3NvciBzcGVjaWZpYyBiaXRzIGZvciBiZmQsCi0JbGlrZSBzdHJhbmdlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gYW5kIGRpcy9hc3NlbWJseS4gIFNvIGZhciBvbmx5Ci0JdGhlIEg4IGhhcyBiZWVuIGV2ZW4gcGFydGlhbGx5IGRvbmUuICBUaGlzIHdvcmsgYWxzbyB0aWVzIGluIHdpdGgKLQl0aGUgY2hhbmdlIGluIGhhbmRsaW5nIGFyY2hpdGVjdHVyZXMuCi0KLQkqIGFtZGNvZmYuYzogKGEyOWtfcmVsb2MpIGZpeCBlcnJvciBtZXNzYWdlLgotCi0JKiBhb3V0LWYxLmg6IChjaG9vc2VfcmVsb2Nfc2l6ZSkgbm93IGNhbGxzIGJmZF9nZXRfYXJjaCB0bwotCWRpc2NvdmVyIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIGJmZC4gKHN1bm9zNF9jYWxsYmFjaykgY2FsbHMgdGhlCi0JZnVuY3Rpb24gYmZkX3NldF9hcmNoX21hY2ggcmF0aGVyIHRoYW4gc3R1ZmZpbmcgc3R1ZmYgZGlyZWN0bHkKLQlpbnRvIHRoZSBiZmQuIChzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSwgY2hhbmdlZCBuYW1lcyBvZgotCWFjY2Vzc29yIGZ1bmN0aW9ucy4KLQotCSogYW91dHguaDogKHNldF9hcmNoX21hY2gpIG5vdyBjYWxscyBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIHRvCi0Jc2V0dXAgdGhlIGVudmlyb25tZW50LgotCi0JKiBhcmNoaXZlLmM6IChiZmRfc2x1cnBfY29mZl9hcm1hcCkgY29mZiBhcmNoaXZlcyBhbHdheXMgaGF2ZSB0aGUKLQloZWFkZXJzIGluIGJpZyBlbmRpYW4gZm9ybWF0LCByZWdhcmRsZXNzIG9mIHRoZSBlbmRpYW5lc3Mgb2YgdGhlCi0JaG9zdCBvciB0YXJnZXQuCi0KLQkqIGFyY2h1cmVzLmM6IHRvdGFsbHkgY2hhbmdlZC4gTm93IGFuIGFyY2hpdGVjdHVyZSBpcyByZXByZXNlbnRlZAotCXdpdGggYSBwb2ludGVyIHRvIGFuIGluZm8gc3RydWN0dXJlIHJhdGhlciB0aGFuIGFuIGVudW1lcmF0ZWQgdHlwZQotCWFuZCBhIGxvbmcuIFRoZSBvbGQgaW5mbyBpcyBhdmFpbGFibGUgYXMgdHdvIGVsZW1lbnRzIGluIHRoZQotCXN0cnVjdHVyZS4gIEZ1dHVyZSBlbmhhbmNlbWVudHMgdG8gYXJjaGl0ZWN1cmUgc3VwcG9ydCB3aWxsCi0JaW52b2x2ZSBwb2ludGVycyB0byBtZXRob2RzIGJlaW5nIHBsYWNlZCBpbnRvIHRoZSBpbmZvIHN0cnVjdHVyZS4KLQotCSogYmZkLmM6IGNoYW5nZWQgdGhlIGRlZmluaXRpb24gb2YgdGhlIGJmZCBzdHJ1Y3R1cmUgZm9yIHRoZSBuZXcKLQlhcmNoaXRlY3R1cmUgc3R1ZmYuCi0KLQkqIGJvdXQuYzogKGJfb3V0X3NldF9hcmNoX21hY2gpIGNoYW5nZWQgdG8gdXNlIHRoZSBuZXcKLQlhcmNoaXRlY3R1cmUgbWVjaGFuaXNtLgotCi0JKiBjb2ZmY29kZS5oOiAoY29mZl9zZXRfYXJjaF9tYWNoLCBjb2ZmX3NldF9mbGFncykgY2hhbmdlZCB0byB1c2UKLQl0aGUgbmV3IGFyY2hpdGVjdHVyZSBtZWNoYW5pc20uCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgaDggc3R1ZmYuCi0KLQkqIGllZWUuYzogdG9vIG1hbnkgY2hhbmdlcyB0byBub3RlLiAgTm93IGllZWUgZmlsZXMgd3JpdHRlbiB3aXRoCi0JYmZkIGdhcyBhbmQgbGQgY2FuIGJlIHJlYWQgYnkgZ2xkIGFuZCBpZWVlIG9ubHkgbGlua2VycyBhbmQKLQlzaW11bGF0b3JzLgotCi0JKiBsaWJiZmQuYywgbGliYmZkLmg6IGNoYW5nZWQgcHJvdG90eXBlIG9mIGJmZF93cml0ZS4KLQotCSogbmV3c29zMy5jOiAobmV3b3MzX2NhbGxiYWNrKSBub3cgY2FsbHMgYmZkX3NldF9hcmNoX21hY2ggcmF0aGVyCi0JdGhhbiBmaXhpbmcgdGhlIHN0cnVjdHVyZSBkaXJlY3RseS4KLQotCSogb2FzeXMuYzogKG9hc3lzX29iamVjdF9wKSBub3cgY2FsbHMgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCByYXRoZXIKLQl0aGFuIGZpeGluZyB0aGUgc3RydWN0dXJlIGRpcmVjdGx5LgotCi0JKiBvcG5jbHMuYzogKG5ld19iZmQpIG1ha2VzIHN1cmUgdGhhdCBiZmRfaW5pdCBoYXMgYmVlbiBjYWxsZWQKLQliZWZvcmUgb3BlbmluZyBhIGJmZC4KLQotCSogc3JlYy5jOiAoc3JlY19zZXRfYXJjaF9tYWNoKSBub3cgY2FsbHMgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaAotCXJhdGhlciB0aGFuIGZpeGluZyB0aGUgc3RydWN0dXJlIGRpcmVjdGx5LgotCi0JKiB0YXJnZXRzLmM6ICh0YXJnZXRfdmVjdG9yKSBub3cgYnkgZGVmaW5pbmcgU0VMRUNUX1ZFQ1MgKHBlcmhhcHMKLQlpbiB0aGUgdC9obWFrZSBmaWxlKSBhIHVzZXIgY2FuIHNlbGVjdCB3aGljaCBiYWNrZW5kcyB0aGV5IHdhbnQKLQlsaW5rZWQgd2l0aCBiZmQgd2l0aG91dCBjaGFuZ2luZyB0aGUgc291cmNlLgotCi0JKiBpbml0LmM6IG5ldywgbG9va3MgYWZ0ZXIgaW5pdGlhbGl6aW5nIG1vZHVsZXMuCi0KLQkqIGhvd3RvLmM6IGZvciBmdXR1cmUgdXNlLCB3aWxsIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIHdvcmsgb3V0Ci0Jd2hhdCBjb29raWUgdG8gdXNlIGFzIGEgaGFuZGxlIG9uIGEgcmVsY29hdGlvIGhvd3RvLgotCi1Nb24gU2VwIDMwIDEzOjMxOjE1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzcmVjLmM6ICBCZXR0ZXIgZXJyb3IgY2hlY2tpbmcsIHBhcnRseSBmcm9tIFBldGVyIFNjaGF1ZXIuCi0JKHNyZWNfb2JqZWN0X3ApOiAgQXZvaWQgYXNzdW1pbmcgYW55IGZpbGUgdGhhdCBzdGFydHMgd2l0aCAnUycgaXMKLQlhbiBTLXJlY29yZCBmaWxlISAgKENoZWNrIGZvciAzIHVwcGVyY2FzZS1oZXggZGlnaXRzIGFmdGVyIGl0LikKLQkoSVNIRVgpOiAgRGVmaW5lIG5ldyBtYWNybyBmb3IgY2hlY2tpbmcgc3VwcG9zZWRseSBoZXggY2hhcmFjdGVycy4KLQkocGFzc19vdmVyKTogIFRyZWF0IGFzIEVPRiBhbnkgUy1yZWNvcmQgbGluZSB0aGF0OgotCSAgICAqICBkb2Vzbid0IGhhdmUgaGV4IGluIGVpdGhlciBzaXplIGNoYXJhY3RlcgotCSAgICAqICBwcm9kdWNlcyBhIHNpemUgbGFyZ2VyIHRoYW4gMHg3RgotCSAgICAqICBoYXMgYW4gdW5yZWNvZ25pemVkIHR5cGUgbnVtYmVyCi0KLVRodSBTZXAgMjYgMTU6Mjc6MjkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oLCBhb3V0eC5oLCBib3V0LmMsIGNvZmZjb2RlLmgsIGhvc3QtYW91dC5jLCBvYXN5cy5jLAotCW9wbmNscy5jOiAgTGludCAoc2FiZXIgYWN0dWFsbHkpLgotCi1UaHUgU2VwIDI2IDExOjI0OjI0IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmggKFdSSVRFX0hFQURFUlMpOiBTZXQgaGVhZGVyJ3MgYV90ZXh0IGZpZWxkIGFsd2F5cy4KLQkqIG5ld3NvczMuYzogRml4ZWQgdHdvIHR5cGVzOiBuZXdvczMgLT4gbmV3c29zMy4KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBGaXggcGMtcmVsYXRpdmUgcmVsb2NhdGlvbgotCXRvIHVzZSBjb3JyZWN0IHNlZ21lbnQuCi0KLU1vbiBTZXAgMjMgMTg6MjQ6MzQgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHByaW50X3N5bWJvbCk6ICBIYW5kbGUgbWlzc2luZyBzeW1ib2wtPm5hbWUuCi0KLUZyaSBTZXAgMjAgMTI6MjY6MDEgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN3YXBjb3JlX3NwYXJjKTogIENoYW5nZSBuYW1lIG9mIFVTUlNUQUNLLCBmaXggY29tbWVudAotCWF0IHRvcCBvZiByb3V0aW5lLgotCi1UdWUgU2VwIDE3IDE3OjIzOjQ5IDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIG9hc3lzLmMsIGNvbmZpZ3VyZS5pbiwgY29uZmlnL2gtaXJpeDMsIGNvbmZpZy90LWlyaXgzOgotCWFkZCBzZ2kvaXJpeCBzdXBwb3J0LgotCi1UaHUgU2VwIDEyIDE0OjI5OjA5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgZm9yIHRoZSBBTUQgMjkwMDAgVWx0cmFjb21wdXRlciBwb3J0IGZyb20gRGF2aWQgV29vZC4KLQkod29vZEBueXUuZWR1KS4KLQotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogIEhhbmRsZSBOT19GQ05UTC4KLQotCSogTWFrZWZpbGUuaW46ICBNYWtlIHN1YmRpcnMgd29yayBieSB1c2luZyAkKElOQ0RJUikgaW4gdGhlCi0JY3J1ZGUgZGVwZW5kZW5jaWVzLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiAgUGFzcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQljdXJyZW50IGZpbGUncyBjb2ZmIHN5bWJvbCBmb3JtYXQgdG8gQkZEIHZpYSB0aGUgY29mZl9kYXRhIHN0cnVjdC4KLQkoY29mZl9maW5kX25lYXJlc3RfbGluZSk6ICBvYmpfaWNvZiA9PiBjb2ZmX2RhdGEuCi0JKGNvZmZfc3dhcF9zeW1fe2luLG91dH0pOiAgQ2hlY2sgdGhhdCBTWU1OTUxFTiA9PSBFX1NZTU5NTEVOLgotCShjb2ZmX3N3YXBfYXV4X3tpbixvdXR9KTogIENoZWNrIHRoYXQgRklMTk1MRU4gPT0gRV9GSUxOTUxFTgotCWFuZCBESU1OVU0gPT0gRV9ESU1OVU0uCi0JKiBjb25maWd1cmUuaW46ICBIYW5kbGUgYTI5ay0qLSogaG9zdHMsIGFuZCB0YXJnZXRzCi0JYTI5ay0qLWNvZmYsIGEyOWstKi1hb3V0LCBhbmQgYTI5ay0qLXN5bTEuCi0JKiBsaWJjb2ZmLWluLmg6ICBBZGQgbG9jYWxfbl9idG1hc2ssIGxvY2FsX25fYnRzaGZ0LAotCWxvY2FsX25fdG1hc2ssIGxvY2FsX25fdHNoaWZ0LCBsb2NhbF9zeW1lc3osIGxvY2FsX2F1eGVzeiwKLQlsb2NhbF9saW5lc3ogdG8gYGNvZmZfZGF0YScgKHRkYXRhKSBzdHJ1Y3QuCi0JKGNvZmZfZGF0YSwgY29mZl9kYXRhX3R5cGUsIGNvZmZfdGRhdGEpOiAgUmVuYW1lIHN0cnVjdCBpY29mZGF0YS4KLQkqIGNvbmZpZy9oLXVsdHJhMzogIEhhbmRsZSBhMjlrLSotKiBob3N0cyBhcyBVbHRyYWNvbXB1dGVycy4KLQotVGh1IFNlcCAxMiAxNDowNzoyMiAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICQoTUFLRSkgZm9yIG1ha2UsICQoZG9jZGlyKSBmb3IgZG9jCi0JKiBkb2MvTWFrZWZpbGU6IHJlZHVuZGFudCBkZXBlbmRlbmNpZXMgZm9yIFN1bi1tYWtlIFZQQVRIIGJ1ZwotCi1UdWUgU2VwIDEwIDIwOjM0OjEyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN1bm9zNF9jb3JlX2ZpbGVfcCk6ICBSZWxlYXNlIHRoZSByaWdodCBzdG9yYWdlIGluCi0JZXJyb3IgY2FzZS4KLQkoc3Vub3M0X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6ICBGaXggaGVhZGVyIGNvbXBhcmlzb24uCi0JKiBhb3V0eC5oOiAgQXZvaWQgc2hpZnRzIG9mIDMyIGJpdHMsIHVuZGVmaW5lZCBpbiBDLiAgTGludC4KLQkqIGJvdXQuYywgaWNvZmYuYywgaWVlZS5jLCBsaWJiZmQuYywgb2FzeXMuYzogIGdjYyAtTyAtVyBsaW50LgotCi1XZWQgU2VwICA0IDAwOjQ0OjUyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCUFsbG93IEdEQiB0byBwYXRjaCBvYmplY3QgZmlsZXMuCi0KLQkqIGFvdXRmMS5oIChzdW5vc19jb3JlX2ZpbGVfcCk6ICBTZXQgU0VDX0hBU19DT05URU5UUyBvbiBhbGwgc2VjdGlvbnMuCi0JKiB0cmFkLWNvcmUuaCAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogIERpdHRvLgotCSogYW91dHguaCAoYW91dF9zZXRfc2VjdGlvbl9jb250ZW50cyk6ICBPbiBmaXJzdCBvdXRwdXQsIGNoZWNrCi0JYWJmZC0+ZGlyZWN0aW9uIGFuZCBjb21wbGFpbiBpZiBlcnJvbmVvdXMuCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIGNydWRlIGRlcGVuZGVuY2llcy4KLQotVHVlIFNlcCAgMyAxMzo0NjoxOSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvKiBhb3V0eC5oIGNvbmZpZ3VyZSogc2hvcnRlbmVkIGFsbCB0aGUgaC90bWFrZS14eHh4Ci0JdG8gaC90LXh4eHggZmlsZXMgc28gdGhhdCBldmVyeXRoaW5nIHdpbGwgd29yayBvbiBTeXN0ZW0gVi4KLQotRnJpIEF1ZyAyMyAxMzo1MTowNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGFvdXR4Lmg6ICBBZGQgaW5mb3JtYXRpb24gb24gaG9zdC1hb3V0LmMgYW5kIGhvdyB0byBjb25maWd1cmUKLQl0byB1c2UgaXQsIHRvIHRoZSBtYW51YWwuCi0JKiBjb25maWd1cmUuaW46ICBUaXggdHlwby4KLQkqIGVjb2ZmLmM6ICBJZiBjb21waWxpbmcgZm9yIERFQzMxMDAsIHVzZSB0cmFkX3VuaXggY29yZSBmaWxlcywKLQllbHNlIGR1bW15IG91dCB0aGUgY29yZSBmaWxlIHN1cHBvcnQuCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogIElmIEhPU1RfREFUQV9TVEFSVF9BRERSIGlzCi0Jc3BlY2lmaWVkLCB1c2UgaXQgdG8gbG9jYXRlIHRoZSBkYXRhIHNlY3Rpb24uCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3N5bWJvbHMpOiAgRGVjbGFyZSBidWZmZXIgYXMgYmZkX2J5dGVzCi0JcmF0aGVyIHRoYW4gYXMgY2hhcnMgKGxpbnQpLgotCi1UaHUgQXVnIDIyIDIyOjIwOjE5IDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oLCBjb2ZmY29kZS5oOiAgc2FiZXJpemVkLgotCi1UaHUgQXVnIDIyIDExOjI3OjA2IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbzogc29tZSBjbGVhbnVwLCByZWluY29ycG9yYXRlZCBtb3JlIGludHJvIG1hdHRlciBmcm9tCi0JYmZkLmRvYwotCWJmZC5jLCB0YXJnZXRzLmM6IG1pbm9yIHJld29yZGluZyBvZiBkb2Mgc2VnbWVudHMKLQotCi1XZWQgQXVnIDIxIDE5OjEzOjIyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6ICBVc2UgSE9TVF9URVhUX1NUQVJUX0FERFIsCi0JZXRjLCByYXRoZXIgdGhhbiBURVhUX1NUQVJUX0FERFIuCi0JKiBob3N0LWFvdXQuYzogIFJlbW92ZSAjaWYgMCBhcm91bmQgd2hvbGUgdGhpbmcuCi0JVXBkYXRlIHRvIG1vZGVybiAoMzIvNjQtYml0KSBhLm91dCBuYW1pbmcgY29udmVudGlvbnMuCi0JSW5jbHVkZSBhIGxhcmdlIGNodW5rIG9mIC4uL2luY2x1ZGUvYS5vdXQuZ251LmggdG8gZ2V0IG1hY3JvcyB0aGF0Ci0JYXJlIG5vdCBkZWZpbmVkIGJ5IHRoZSBzeXN0ZW0gaW5jbHVkZSBmaWxlcy4KLQkoaG9zdF9hb3V0X3szMiw2NH1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogIFVzZSB0aGUgV1JJVEVfSEVBREVSUwotCW1hY3JvIHVzZWQgYnkgdGhlIG90aGVyIGEub3V0IGltcGxlbWVudGF0aW9ucy4KLQkqIE1ha2VmaWxlLmluOiAgR2l2ZSBkZXBlbmRlbmNpZXMgdG8gT1BUSU9OQUxfQkFDS0VORFMuCi0KLVdlZCBBdWcgMjEgMTQ6MzM6MDYgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiB1c2UgdGFyZ2V0cyAiYmZkLmR2aSIgYW5kICJiZmQucHMiIGluc3RlYWQgb2YKLQl0ZXhkb2MgYW5kIHBzZG9jOyBtYWtlIHRoZXNlIGRlcGVuZCBvbiBnZW5lcmF0ZWQgLnRleGkncwotCi0JKiBzY2FuaXQsIChuZXcpIHVuUFJPVE86IHR1cm4gUFJPVE8gbWFjcm9zIGludG8gQU5TSSBkZWNsYXJhdGlvbnMgaW4KLQlkb2MKLQotCSogYmZkLmMsIHJlbG9jLmMsIHN5bXMuYzogbWlub3Igc3BlbGxpbmcvd29yZGluZyBmaXhlcyBpbiBkb2MKLQlwb3J0aW9ucwotCi0JKiBNYWtlZmlsZS5pbiwgYXdrc2Nhbi1pcCwgYXdrc2Nhbi1wLCBpbnRvYmZkLAotCWxpYmJmZC5oLCBsaWJjb2ZmLmgsIHRvbGliY29mZjsgbmV3IGJmZC1pbi5oLCBsaWJiZmQtaW4uaCwKLQlsaWJjb2ZmLWluLmg6IChhKSB1c2Ugc2VwYXJhdGUgZmlsZXMgZm9yIGludmFyaWFudCBwYXJ0cyBvZiBiZmQuaCwKLQlsaWJiZmQuaCwgYW5kIGxpYmNvZmYuaDsgKGIpIGluIGdlbmVyYXRlZCBwYXJ0cyBvZiBzYW1lLCB1c2UgbGVzcwotCW9idHJ1c2l2ZSBtYXJrcyBpbmRpY2F0aW5nIC5jIG9yaWdpbnMuCi0KLQkqIGJmZC50ZXhpbmZvOiBnZW5lcmFsaXplIG1vc3QgcmVmZXJlbmNlcyB0byBsaW5rZXIKLQotVHVlIEF1ZyAyMCAxNToxODowMiAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluY2x1ZGUgY29yZS5wIGluIFBST1RPUyAoYnVpbGRpbmcgYmV0dGVyIGJmZC5oKQotCSogYXJjaHVyZXMuYzogcmVtb3ZlIGVtcHR5IGZvbygpIGRlZmluaXRpb24gKGNyZXB0IGluIGF0IHZuMS45KQotCi1Nb24gQXVnIDE5IDEzOjQ4OjIyIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbzogdXNlIEBzZXRjaGFwdGVybmV3cGFnZSBvbiBpbnN0ZWFkIG9mIGxvdHMgb2YKLQlAcGFnZSdzOyBtaW5vciByZXBocmFzaW5nIGluIEludHJvZHVjdGlvbi4KLQotCSogYW91dHguaCwgYXJjaGl2ZS5jLCBhcmNodXJlcy5jLCBiZmQuYywgYmZkLnRleGluZm8sIGNhY2hlLmMsCi0JY29mZmNvZGUuaCwgY29yZS5jLCBmb3JtYXQuYywgaWVlZS5jLCBsaWJiZmQuYywgbGliYmZkLmgsIGxpYmNvZmYuaCwKLQlvYXN5cy5jLCBvcG5jbHMuYywgcmVsb2MuYywgc2VjdGlvbi5jLCBzeW1zLmMsIHRhcmdldHMuYyAoZG9jdW1lbnRhdGlvbgotCXNlZ21lbnRzKTogdXNlZCBCRkQgKGNhcHMpIG1vcmUgY29uc2lzdGVudGx5IGFzIGEgbmFtZSBpbgotCWRpc2NvdXJzZSwgZml4ZWQgYSBmZXcgb3RoZXIgbWlub3IgdHlwb3MgYW5kIHVzZXMgb2YgZm9udHMKLQotCi1UaHUgQXVnICA4IDE2OjQ3OjQzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IGZpeGVkIGJ1ZyB3aGVyZSBzdHJpbmcgdGFibGUgc2l6ZSB3YXNuJ3QgYmVpbmcgc3dhcHBlZC4KLQotVGh1IEF1ZyAgMSAxNjozNToyOCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmM6IGFkZGVkIFNFQ19DT05TVFJVQ1RPUl9URVhUfERBVEF8QlNTIGZsYWdzCi0KLQkqIHN5bXMuYzogYWRkZWQgQlNGX0NPTlNUUlVDVE9SLCBCU0ZfV0FSTklORyBhbmQgQlNGX0lORElSRUNUCi0JZmxhZ3MuIChiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKSBub3cga25vd3Mgd2hhdCB0byBkbyB3aXRoIHRoZQotCWFib3ZlIGZsYWdzLgotCi0JKiBhb3V0eC5oOiBtYWRlIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MgYW5kCi0JdHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MgcHJvZHVjZSB0aGUgYWJvdmUgZmxhZ3MuCi0KLQotV2VkIEp1bCAzMSAwOTo1Mzo1MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGFsbCBmaWxlczogIHVwZGF0ZSBjb3B5cmlnaHQgbm90aWNlcyBmb3IgR1BMIHZlcnNpb24gMi4KLQlJbnN0YWxsIGhlYWRlciBjb21tZW50cyBhbmQgYXR0cmlidXRlIG1vc3QgbW9kdWxlcyB0byB0aGVpcgotCWF1dGhvcnMuICBCRkQncyBuYW1lIGlzIG5vdyBvZmZpY2lhbGx5ICJCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIiwKLQlzbyByZW1vdmUgYW55IGNvbmZsaWN0aW5nIHBlam9yYXRpdmVzLgotCWFyY2h1cmVzLmg6ICBDb25zaXN0cyBzb2xlbHkgb2YgY29tbWVudHM7IHJlbW92ZSBpdC4KLQotRnJpIEp1bCAyNiAxODoxMTozNCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgYmZkLmM6IE1hZGUgaXQgY29tcGlsZSBhZ2Fpbi4KLQotRnJpIEp1bCAxOSAwODoxNzowOSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBuZXdzb3MzLmMsIHRhcmdldHMuYywgY29mZmNvZGUuaDogbmV3IHBhdGNoZXMgZnJvbSBEYXZpZCBXb29kCi0KLQotTW9uIEp1bCAxNSAxNjoyNzo0MiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCBhcmNoaXZlLmMgYmZkLmMgY29mZmNvZGUuaCBjb3JlLmMgZWNvZmYuYyBpZWVlLmMKLQliZmQudGV4aW5mbyBvYXN5cy5jIG9wbmNscy5jIHJlbG9jLmMgc3JlYy5jOiBNb3JlIGRvY3VtZW50YXRpb24gb24KLQlsaW50IGZpeGVzLgotCi0JKiBhbWRjb2ZmLmMgYmZkLnRleGluZm8gTWFrZWZpbGUuaW4gOiBGb2xkZWQgaW4gY2hhbmdlcyBmb3IgYW1kCi0JMjlrIGNvZmYgYnkgRGF2aWQgV29vZCAod29vZEBsYWIudWx0cmEubnl1LmVkdSkuCi0KLVRodSBKdWwgIDQgMDk6NTM6MTYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogRXZlcnl0aGluZzogY3JlYXRlZCBzb21lIG5ldyBmaWxlcywgY29yZS5jIGZvcm1hdC5jLCByZWxvYy5jLAotCXNlY3Rpb24uYyBhbmQgc3ltcy5jIHRvIHNwbGl0IHRoZSBmdW5jdGlvbmFsaXR5IGEgYml0IGJldHRlci4KLQlDbGVhbmVkIHVwIHRoZSByZXN0IG9mIHRoZSBmaWxlcyBhIGJpdCwgYW5kIGFkZGVkIHNvbWUKLQlkb2N1bWVudGF0aW9uLgotCi0KLU1vbiBKdWwgIDEgMTM6Mjk6NDcgMTk5MSAgRGF2aWQgV29vZCAod29vZCBhdCBkYXZpZC51bHRyYS5ueWEuZWR1KQotCi0JKiBvcG5jbHMuYywgLi4vaW5jbHVkZS9zeXMvaC1zdW4zLmggLi4vaW5jbHVkZS9zeXMvaC1zdW40Lmg6IGZjbnRsCi0JcmVhbGx5IHRha2VzIDMgYXJndW1lbnRzLCBwYXRjaGVkIGNvZGUgYW5kIGFtbWVuZGVkIHByb3RvdHlwZXMuCi0KLUZyaSBKdW4gMTQgMTM6MTk6NDAgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogLi4vaW5jbHVkZS9iZmQuaCAoc3RydWN0IGJmZF90YXJnZXQpOiBBZGRlZCBuZXcgZmllbGQKLQkiYWxpZ25fcG93ZXJfbWluIiB3aGljaCBjb250YWlucyB0aGUgbWluaW11bSBhbGlnbm1lbnQgZm9yIGEKLQlzZWN0aW9uLiBUaGlzIGlzIHVzZWQgaW4gY29mZl9uZXdfc2VjdGlvbl9ob29rLiBUaGUgZmllbGQKLQlpbnNlcnRpb24gbmVjZXNzaXRhdGVzIGFuIHVwZGF0ZSBvZiBhbGwgYmFja2VuZHMuLgotCi0JKiBhb3V0ZjEuaCBqdW1wIHRhYmxlIGZpZWxkIGluc2VydGVkCi0KLQkqIGFyY2hpdmUuYyhzbmFyZl9hcl9oZHIpKGJmZF9zbHVycF9jb2ZmX2FybWFwKSBjYW4gbm93IHBhcnNlIGRndXggc3R5bGUgZXh0ZW5kZWQKLQlmaWxlbmFtZXMgdG9vLgotCi0JKiBib3V0LmMoYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MpIGZpeCB0byBhc3NlcnRpb24gdGVzdHMuIEp1bXAKLQl0YWJsZSBmaWVsZCBpbnNlcnRlZC4KLQotCSogY29mZmNvZGUuaChqdXN0IGFib3V0IGV2ZXJ5dGhpbmcpIE5vdyBwYXRjaGVzIHVwIHN5bWJvbCB0YWJsZXMKLQl1c2luZyBhIGRpZmZlcmVudCBtZWNoYW5pc20uIFRoZSBJbnRlbCBtYWpvciBidWcgaGFzIGJlZW4gZml4ZWQsCi0JYW5kIHRoZSBsaW5rZXIgY2FuIHNlbGYgaG9zdCBvbiB0aGUgQXZpaW9uIGFuZCBiZSBkZWJ1Z2dlZCB3aXRoCi0JZ2RiLgotCi0JKiBlY29mZi5jOiBuZXcgaW5jbHVkZSBhbmQganVtcCB0YWJsZSBwYXRjaCwgaTM4NmNvZmYuYzogbmV3Ci0JaW5jbHVkZSBhbmQganVtcCB0YWJsZSBwYXRjaCwgIGljb2ZmLmM6IG5ldyBpbmNsdWRlIGFuZCBqdW1wIHRhYmxlCi0JcGF0Y2gsIGllZWUuYzogY2FuIG5vdyByZWFkIGFyY2hpdmVzIGNvbnRhaW5pbmcgaWVlZSBtb2R1bGVzLiwKLQlsaWJjb2ZmLmg6IGFkZGVkIChjb21iaW5lZF9lbnRyeV90eXBlKSwgbGliaWVlZS5oOiB1cGVkIG1heAotCXNlY3Rpb25zIHRvIDIwLCBtNjhrY29mZi5jOiBuZXcgaW5jbHVkZSBhbmQganVtcCB0YWJsZSBwYXRjaCwKLQltODhrYmNzLmM6IG5ldyBpbmNsdWRlIGFuZCBqdW1wIHRhYmxlIHBhdGNoLCBvYXN5cy5jOiB2YXJpb3VzIGJ1Z3MKLQlmaXhlZC4gb3BuY2xzLmM6IGFkZGVkIGJmZF9hbGxvY19ncm93IGFuZCBiZmRfYWxsb2NfZmluaXNoLgotCXNyZWMuYzoganVtcCB0YWJsZSBwYXRjaC4gdHJhZC1jb2RlLmMgZml4ZWQgI0lGIHR5cGVvCi0KLUZyaSBKdW4gIDcgMTI6MzU6NDYgMTk5MSAgU2VhbiBGYWdhbiAgKHNlZiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotIAkqIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBhZGRlZCBlbHNlIGNhc2UgdG8gZGVhbCB3aXRoCi0gCWZpbGVuYW1lcyBsZXNzIHRoYW4gOSBjaGFyYWN0ZXJzLgotCi0KLVRodSBKdW4gIDYgMTg6Mjc6MzggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogLi4vaW5jbHVkZS9vYXN5cy5oIG9hc3lzLmMgKG9hc3lzX2FyY2hpdmVfcCk6IGZpeGVkIHNvIGl0IHdvcmtzCi0KLQkqIHNyZWMuYzogbm93IGFsbG93cyBhbnkgbnVtYmVyIG9mIHNlY3Rpb25zIHRvIGJlIGNyZWF0ZWQgaW4gYQotCWZpbGUuIE91dHB1dHMgYWRkcmVzc2VzIG9mIHRoZSByaWdodCBsZW5ndGguCi0KLVRodSBNYXkgMzAgMTU6MzA6MTAgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKGJmZF9jaGVja19mb3JtYXQpOiBGaXhlZCBwcm9ibGVtIHdoZXJlIHdoZW4gYSBkZWZhdWx0ZWQKLQl0YXJnZXQgZGlkbid0IG1hdGNoLCB0aGUgZm9ybWF0IGdvdCBzZXQgdG8gdGhlIGF0dGVtcHRlZCBtYXRjaCwKLQlicmVha2luZyBhIGZ1dHVyZSB0ZXN0LgotCi0gICAgICAgICouLi9pbmNsdWRlL2kzODZjb2ZmLmggOiBmaXhlZCB0eXBvIGluIHR5cGUgZmllbGQgd2l0aCBzaXplCi0KLQkqIGkzODZjb2ZmLmMgaWNvZmYuYyBtODhrLWJjcy5jIGVjb2ZmLmMgLi4vaW5jbHVkZS9iZmQuaCA6IEFkZGVkCi0Jc3VwcG9ydCBpbiB0aGUganVtcCB0YWJsZSBmb3IgdGhlIHN3YXBwaW5nIHJvdXRpbmVzIGV4cG9ydGVkIHRvCi0JZ2RiLiBOb3cgZ2RiIHdvcmtzIHdpdGggdGhlIDM4Ni4KLQotVHVlIE1heSAyOCAxNzoyMTo0MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIE1lcmdlIGluIGNoYW5nZXMgZnJvbSBnZGItMy45NSByZWxlYXNlLgotCU1ha2VmaWxlLmluOiAgQWxsb3cgaG1ha2UgYW5kIHRtYWtlIGZpbGVzIHRvIGFkZCBPRklMRVMuCi0JYW91dGYxLmg6Ci0JYmZkLmM6ICBzdXBwb3J0IHNwZWNpZmljIHRhcmdldHMgYXMgd2VsbCBhcyBzZWFyY2hpbmcuICBXaGVuCi0Jc2VhcmNoaW5nLCB0YWtlIGRlZmF1bHQgdGFyZ2V0IGluIHByZWZlcmVuY2UgdG8gb3RoZXJzLgotCWJmZC5kb2M6ICB0eXBvcwotCWllZWUuYywgb2FzeXMuYzogIEF2b2lkIHVzaW5nIHRoZSAidGRhdGEiIG1hY3JvcyBsZWZ0IG9mIGFzc2lnbm1lbnQuCi0JbGliYS5vdXQuaDogIERvbid0IGhhcmQtY29kZSBmaWxlIG9mZnNldHM7IHVzZSBOXyBtYWNyb3MgZm9yIHRoZW0uCi0JbGliYmZkLmg6ICBTdXBwb3J0IHNwZWNpZmljIHRhcmdldHMgYXMgd2VsbCBhcyBzZWFyY2hpbmcuCi0Jb3BuY2xzLmM6ICBTdXBwb3J0IHNwZWNpZmljIHRhcmdldHMgYXMgd2VsbCBhcyBzZWFyY2hpbmcuCi0JdGFyZ2V0cy5jOiAgU2VhcmNoIGlzIHNob3J0LWNpcmN1aXRlZCBpZiBkZWZhdWx0IHRhcmdldCBtYXRjaGVzLgotCWxpYm9hc3lzLmMsIGxpYmllZWUuYzogIFVuZG8gYm90aG5lciBjaGFuZ2VzIHRoYXQgbWFrZSBtYWNyb3MKLQl3b3JrIHRvIHRoZSBsZWZ0IG9mIGFzc2lnbm1lbnQsIGJ1dCB3aGljaCBkZXBlbmQgb24gdGhlCi0JcmVwcmVzZW50YXRpb25zIG9mIGRpZmZlcmVudCBwb2ludGVyIHR5cGVzIGJlaW5nIHRoZSBzYW1lLgotCi1GcmkgTWF5IDI0IDE4OjU2OjUyIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGkzODZjb2ZmLmM6IGNyZWF0ZWQuCi0JKiBjb2ZmY29kZS5oOiBhZGRlZCBzdXBwb3J0IGZvciAzODYuCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgc3VwcG9ydCBmb3IgMzg2LgotCSogLi4vaW5jbHVkZS9pMzg2Y29mZi5oOiBjcmVhdGVkCi0KLVdlZCBNYXkgMjIgMDc6MjY6MzggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogcmVtb3ZlZCBhbGwgcHV0X3hfPHNpemVzPgotCSogbGliYmZkLmM6IENoYW5nZWQgI2lmZGVmIF9fR05VQ19fIHRvICNpZmRlZiBIT1NUXzY0X0JJVCwgQWRkZWQKLQlERUZVTlMKLQotCi1UdWUgTWF5IDIxIDA4OjU4OjU4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0JKGJvdGhuZXIpCi0JKiBvcG5jbHMuYzogQ2hhbmdlZCBvYnN0YWNrX2NodW5rX2FsbG9jIHVzZSB4bWFsbG9jCi0KLU1vbiBNYXkgMjAgMTc6MTI6MTcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogZXZlcnl0aGluZzogUmVtb3ZlZCBzeXNkZXAuaCBmcm9tIGJmZC5oIGFuZCBwdXQgYmFjayBpbnRvIGZpbGVzCi0JZnJvbSB3aGljaCBpdCB3YXMgc3BsaXQgb3V0LiBOb3cgNjQgYml0IHZlcnNpb24gaXMgYnVpbHQgd2l0aCBhCi0JLURIT1NUXzY0X0JJVD0ibG9uZyBsb25nIiBvbiB0aGUgY29tcGlsZSBsaW5lLgotCi1GcmkgTWF5IDE3IDE5OjM1OjI2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQlDaGFuZ2VkIGFsbCB0aGUgW2dldHxwdXRdW25hbWVdIHJvdXRpbmVzIHRvIHVzZSAgW2dldHxwdXRdX1tzaXplCi0JaW4gYnl0ZXNdLgotCi0JUHV0IGluIHN1cHBvcnQgZm9yIDY0IGJpdCB3b3JrLiBOb3cgdHdvIHZlcnNpb25zIG9mIGJmZCBtYXkgYmUKLQlnZW5lcmF0ZWQsIGFjY29yZGluZyB0byB0aGUgc3RhdGUgb2YgVEFSR0VUXzY0X0JJVCwgb25lIHdoaWNoIGlzCi0JMzIgYml0IG9ubHksIGFuZCBvbmUgd2hpY2ggaXMgNjQvMzIgYml0cy4KLQlDcmVhdGVkIG5ldyBiYWNrIGVuZCAnZGVtbzY0JyB0byB0ZXN0IDY0IGJpdCBmdW5jdGlvbmFsaXR5LgotCi0JUmVuYW1lZCBzb21lIGZpbGVzIHRvIHdvcmsgb24gRE9TLgotCi0JKiBhcmNoaXZlLmM6IGxpbnQgKiBiZmQuYzogcHJvdG90eXBlcyBhbmQgbGludC4gKiBlY29mZi5jOiBhZGRlZAotCTY0Yml0IHRyYW5zZmVyIAkqIGljb2ZmLmM6IGFkZGVkIDY0Yml0IHRyYW5zZmVyICogaWVlZS5jOiBuYW1lCi0JY2hhZ2UsIDY0IGJpdCB0cmFuc2Zlci4gKiBsaWJhLm91dC5oOiBTcGxpdCBvdXQgY29tbW9uIGNvZGUgZnJvbQotCXN1bm9zIGFuZCBuZXdzb3MgaW50byBsaWJhLm91dC4gTmFtZSBjaGFuZ2VzIGFuZCBwcm90b3R5cGUgbW9kcy4gKgotCWxpYmJmZC5jOiBsaW50IGFuZCBwcm90b3R5cGVzLCBleHRyYSA2NGJpdCBzd2Fwcy4gKiBsaWJiZmQuaDoKLQlwcm90b3R5cGVzIGZvciBuZXcgZnVuY3Rpb25zLiAqIGxpYmNvZmYuaDogbGludCAqIGxpYmllZWUuaDogbWFrZQotCXdvcmsgb24gRE9TICogbGlib2FzeXMuaDogbWFrZSB3b3JrIG9uIERPUyAqIG04OGstYmNzLmM6IE5hbWUKLQljaGFuZ2UgYW5kIDY0Yml0IHN0dWZmLiogbmV3c29zMy5jOiBjb21tb24gY29kZSByZW1vdmVkLCBuZXcganVtcAotCXRhYmxlLiAqIG9hc3lzLmM6IE5hbWUgY2hhbmdlICogb3BuY2xzLmM6IFBvcnRhYmlsaXR5IGZpeGVzICoKLQlzcmVjLmM6IE5hbWUgY2hhbmdlcyAqIHN1bm9zLmM6IFJlbW92ZWQgY29tb24gY29kZS4gKiB0YXJnZXRzLmM6Ci0JQWRkZWQgZGVtbyAqIGFvdXQzMiwgYW91dDY0LmMgaW5jbHVkZSAgYW91dHguaCAqIGJvdXQuYzogdXNlZCB0bwotCWJlIGNhbGxlZCBiLm91dC5jICogY29mZmNvZGUuaDogdXNlZCB0byBiZSBjYWxsZWQgY29mZi1jb2RlLmgsIG5vdwotCTY0Yml0IGl6ZWQuICogZGVtbzY0LmM6IDY0IGJpdCBhLm91dCBiYWNrIGVuZAotCi1UaHUgTWF5IDE2IDE2OjAyOjA3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0JZnJvbSBib3RobmVyCi0gCSogbGliaWVlZS5oOiBNYWtlIGllZWVfZGF0YSBhbmQgaWVlZV9hcl9kYXRhIG1hY3JvcyB1c2FibGUKLQlvbiBMSFMgb2YgYXNzaWdubWVudCwgZXZlbiB3aGVuIHVzaW5nIG9sZCBjb21waWxlcnMuCi0JKiBsaWJvYXN5cy5oOiBEaXR0byBmb3Igb2FzeXNfZGF0YSBhbmQgb2FzeXNfYXJfZGF0YS4KLQkqIG02OGtjb2ZmLmM6IEFkZCBlbnVtLXRvLWludCBjYXN0cyB0byBhY2NvbW9kYXRlIG9sZCBjb21waWxlcnMuCi0JKiBuZXdzb3MzLmM6IEZpeCBkZWZpbml0aW9ucyBvZiBTRUdNRU5UX1NJWkUgYW5kIFRFWFRfU1RBUlRfQUREUi4KLQkqIG9wbmNscy5jOiBEZWZpbmUgU19JWFVTUiwgU19JWEdSUCwgU19JWE9USCBpZiB1bmRlZmluZWQuCi0JKiB0YXJnZXRzLmM6IEFkZCBkZWNsYXJhdGlvbiBvZiBuZXdzb3MzX3ZlYy4KLQotTW9uIE1heSAxMyAxMDowMzoyOSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhb3V0LmM6IGZpeHhlZCBzb21lIG9mIHRoZSBwcm9ibGVtcyB3aXRoIGZpbGVwb3MgY2FsY3VsYXRpb24uCi0JKHN3YXBfZXh0X3JlbG9jKTogZml4ZWQgcHJvYmxlbSB3aXRoIGNyZWF0aW9uIG9mIHJlbG9jcy4KLQkoYW91dF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IGZpeGVkIGZpbGVwb3MgcHJvYmxlbQotCi0JKiBjb2ZmLWNvZGUuaDogKHN3YXBfZmlsZWhkcl9pbiwgc3dhcF9maWxlaGRyX291dCkgYWRkLgotCShzd2FwX2ZpbGVoZHIpIGRlbGV0ZS4gQ2hhbmdlZCBhbGwgdGhlIHVzYWdlIG9mIGJmZF9oX3B1dF94LgotCShzd2FwX2FvdXRoZHJfaW4sIHN3YXBfYW91dGhkcl9vdXQpIGFkZC4gKHN3YXBfYW91dGhkcikgZGVsZXRlLgotCShjb2ZmX3JlYWxfb2JqZWN0X3ApIGNsZWFuZWQgdXAsIGFkZGVkIE1JUFMuIChjb2ZmX29iamVjdF9wKQotCWNsZWFuZWQgdXAuIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cykgY2xlYW5lZCB1cC4KLQotCSogZWNvZmYuYzogVG90YWxseSBkaWZmZXJlbnQuIE5vdyBzdXBwb3J0cyBlY29mZiBmdWxseS4KLQotCSogaWNvZmYuYzogZml4ZWQgcHJvYmxlbXMgaW4gcmVsb2NhdGlvbiBjYWxsb3V0LgotCi0JKiBsaWJjb2ZmLmg6IChzdHJ1Y3QgaWNvZmRhdGEpIHJlbW92ZWQgaGRyIHN0cnVjdHVyZSBmcm9tIHRkYXRhLgotCi0JKiBtNjhrY29mZi5jOiB1cGRhdGVkIHRhcmdldCB2ZWN0b3IuCi0KLQkqIHN1bm9zLmM6IChjaG9vc2VfcmVsb2Nfc2l6ZSkgYWRkZWQ6IChzdW5vczRfY2FsbGJhY2spIGNhbGxzCi0JY2hvb3NlX3JlbG9jX3NpemUuIChzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSBub3cgY2FsbHMKLQljaG9vc2VfcmVsb2Nfc2l6ZSBzbyBvdXRwdXRzIHJlbG9jcyBjb3JyZWN0bHksIGFsc28gY2FsY3VsYXRlcyB0aGUKLQlzaXplIG9mIHRoZSBzZWN0aW9ucyBjb3JyZWN0bHkuCi0KLQotCi1GcmkgTWF5IDEwIDE2OjU4OjUzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCU1lcmdlIFBlciBCb3RobmVyJ3MgY2hhbmdlcyB0byBtb2R1bGFyaXplIEJGRCBhLm91dCBhIGJpdC4KLQotCSogbGliYmZkLmgsIGxpYmJmZC5jIChiZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cyk6ICBBZGQuCi0JKiBpZWVlLmM6ICBDYXN0IGVudW1zIHRvIGludCBiZWZvcmUgY29tcGFyaW5nIHRoZW0sIGZvciBicmFpbi0KLQlkZWFkIGNvbXBpbGVycy4KLQkqIGNvZmYtY29kZS5oOiAgUmVtb3ZlIGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMsIGFuZCB1c2UgdGhlCi0JZ2VuZXJpYyBvbmUgaW5zdGVhZC4KLQotCSogYW91dC5jOiAgRGVyaXZlIG5ldyBtb2R1bGUgZnJvbSBzdW5vcy5jLCBjb250YWluaW5nIGdlbmVyaWMKLQlzdXBwb3J0IGNvZGUgZm9yIGFsbCBraW5kcyBvZiBhLm91dCBmaWxlcy4KLQotCSogc3Vub3MuYzogUmVtb3ZlIGFsbCBjb2RlIHRoYXQgZ29lcyBpbiBhb3V0LmMuICBTcGxpdCBvdXQKLQltYWNoaW5lIGRlcGVuZGVudCBmb2xsb3d1cCBpbiBzdW5vczRfb2JqZWN0X3AgaW50bwotCXN1bm9zNF9jYWxsYmFjay4gIFVzZSBKVU1QX1RBQkxFKGFvdXQpIGZvciB0aGUgdHJhbnN2ZXIgdmVjdG9yLAotCWFuZCByZWRlZmluZSBvbmx5IHRoZSBuYW1lcyB3ZSBDSEFOR0UsIG5vdCBhbGwgdGhlIG5hbWVzLiAgRHJvcAotCXRoZSBsaXR0bGUtZW5kaWFuIHZlY3RvciwgYW5kIHJlbmFtZSB0aGUgdmVjdG9yIGFzIHN1bm9zNCByYXRoZXIKLQl0aGFuIGdlbmVyaWMuCi0KLQkqIGIub3V0LmM6ICBVc2UgYW91dC5jIHJvdXRpbmVzIGZvciBtb3N0IG9mIHRoZSB3b3JrLiAgU2xpZ2h0Ci0JY2hhbmdlcyBmb3IgdGhlIG5ldyByZWdpbWUuICBSZW1vdmUgY2xvc2VfYW5kX2NsZWFudXAgYW5kCi0JZ2V0X3NlY3Rpb25fY29udGVudHMgaW4gZmF2b3Igb2YgZ2VuZXJpY3MuICBOZXcgdHJhbnNmZXIgdmVjdG9yCi0JcmVnaW1lLgotCi0JKiBuZXdzb3MuYzogIE5ldyBzdXBwb3J0IGZvciBTb255IE5FV1MsIGFub3RoZXIgYS5vdXQgZm9ybWF0LgotCi0JKiBlY29mZi5jOiAgUmVtb3ZlIGNsb3NlX2FuZF9jbGVhbnVwLiAgTmV3IHR2ZWMgcmVnaW1lLgotCSogaWNvZmYuYywgbTg4ay1iY3MuYzogIEFkZCB3cml0ZV9jb250ZW50cyB0byB0dmVjLgotCSogaWVlZS5jLCBvYXN5cy5jOiAgUmVtb3ZlIGNsb3NlX2FuZF9jbGVhbnVwLCBhZGQgd3JpdGVfY29udGVudHMKLQl0byB0dmVjLgotCSogb3BuY2xzLmMgKGJmZF9jbG9zZSk6ICBDYWxsIGZvcm1hdC1kZXBlbmRlbnQgd3JpdGVfY29udGVudHMKLQlyb3V0aW5lLCBpZiB3cml0aW5nLCBiZWZvcmUgY2FsbGluZyB0YXJnZXQtZGVwZW5kZW50Ci0JY2xvc2VfYW5kX2NsZWFudXAgcm91dGluZSAod2hpY2ggaXMgbm93IGFsd2F5cyBnZW5lcmljLCBJIHRoaW5rKS4KLQkqIHNyZWMuYzogIFVzZSBiZmRfYWxsb2MgaW5zdGVhZCBvZiBtYWxsb2MuICBSZW1vdmUKLQljbG9zZV9hbmRfY2xlYW51cCBhbmQgbW92ZSBjb2RlIGZyb20gaXQgdG8KLQlzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cy4gIEFkZCB3cml0ZV9jb250ZW50cyB0byB0dmVjLgotCSogdGFyZ2V0cy5jOiAgUmVtb3ZlIGEub3V0IGxpdHRsZSB2ZWN0b3IsIHJlcGxhY2UgYS5vdXQgYmlnCi0JdmVjdG9yIHdpdGggU3VuT1MgdmVjdG9yLiAgRklYTUU6ICBOZWVkIFZheCBzdXBwb3J0IGFnYWluIG5vdy4KLQotCSogbGliYmZkLmg6ICBBZGQgd3JpdGVfY29udGVudHMgZm9ybWF0LWRlcGVuZGVudC12ZWN0b3IgdG8gdGhlCi0JYmZkX3RhcmdldCB2ZWN0b3IuICBTdXBwbHkgYSBnZW5lcmljIGNsb3NlX2FuZF9jbGVhbnVwIHJvdXRpbmUuCi0JKiBsaWJhLm91dC5oOiAgSGFuZGxlIHRoZSBuZXcgYW91dC5jIHNwbGl0LiAgQWRkIHByb3RvdHlwZXMgZm9yCi0JYWxsIHJvdXRpbmVzIGRlZmluZWQgaW4gYW91dC5jLiAgUmVuYW1lICJzdW5vcyIgdGhpbmdzIHRvICJhb3V0IgotCXRoaW5ncy4gIEFkZCBhIGZldyBmaWVsZHMgd2hlcmUgbmVlZGVkIGZvciB2YXJpb3VzIGZvcm1hdHMuCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBhb3V0LmMgYW5kIG5ld3Nvcy5jLgotCi0JKiBhcmNoaXZlLmMsIGllZWUuYywgb2FzeXMuYzogIExpbnQuCi0KLUZyaSBNYXkgMTAgMTI6MzQ6NDggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogLi4vaW5jbHVkZS9iZmQuaAotCWNoYW5nZWQgZm9yd2FyZCBkZWNsYXJhdGlvbiBzdHJ1Y3Qgc3RhdDsgdG8gcmVkdWNlIHdhcm5pbmdzLiBDaGFuZ2VkCi0JY29tbWVudCBvbiBiZmRfaF88eD5feC4KLQotCSogLi4vaW5jbHVkZS9tNjhrY29mZi5oLCAuLi9pbmNsdWRlL2ludGVsLWNvZmYuaCwKLQkuLi9pbmNsdWRlL204OGstYmNzLmgKLQlOb3cgdGhlcmUgYXJlIHR3byBpbmNhcm5hdGlvbnMgb2YgcmVsb2NzLCBsaW5lbm9zIGFuZCBzeW1lbnRzLiBPbmUgZm9yCi0JaW50ZXJuYWwgZGlnZXN0aW9uLCBhbmQgb25lIGZ1bGwgb2YgY2hhciBhcnJheXMgZm9yIEkvTy4gVGhlIG9yaWdpbmFsCi0JbmFtZXMgaGF2ZSBnb25lIHRvIGRldGVjdCBlcnJvcnMuCi0KLQkqIE1ha2VmaWxlLmluLCBtNjhrY29mZi5jLCB0YXJnZXRzLmMKLQlUZXN0IG5ldyBzdHJ1Y3R1cmUgY29kZSB3aXRoIGEgNjhrIGNvZmYgaW1wbGVtZW50YWlvbgotCi0JKiBjb2ZmLWNvZGUuaCwgaWNvZmYuYywgY29mZnN3YXAuYywgbGliY29mZi5oCi0JRml4ZWQgYWxsIHRoZSBwbGFjZXMgd2hlcmUgdGhlcmUgd2VyZSBwcm9ibGVtcyB3aXRoIHRoZSBzaXplIGFuZAotCWFsaWdubWVudHMgb2Ygc3RydWN0dXJlcyBvbiBkaXNrIGFuZCBzdHJ1Y3R1cmVzIGluIG1lbW9yeS4gI2lmZWQgb3V0Ci0JYWxsIHRoZSBjb2RlIGluIGNvZmZzd2FwLmMsIHNpbmNlIGl0IHNob3VsZCBiZSBkb25lIHVzaW5nIHRoZSB0YXJnZXQKLQlzd2FwIHJvdXRpbmVzIG5vdy4KLQotVGh1IE1heSAgOSAxMTowMDo0NSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBpZWVlLmMgKGRvX29uZSwgaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEpOiBub3cgc3VwcG9ydHMgdGhlIGxvYWQKLQltdWx0aXBsZSByZWxvYyBjb21tYW5kLgotCi0JKiBzdW5vcy5jIChzdW5vczRfc2V0X3NlY3Rpb25fY29udGVudHMpOiBNYWRlIGl0IHNvIHRoYXQgc2VjdGlvbnMKLQlhcmUgYWx3YXlzIHBhZGRlZCB0byB0aGVpciBhbGlnbm1lbnQgc2l6ZS4KLQotU2F0IE1heSAgNCAxNTo0OTo0MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYywgYmZkLmMsIGNvZmYtY29kZS5oLCBvcG5jbHMuYywgc3Vub3MuYywgdHJhZC1jb3JlLmM6Ci0JQ2xlYW4gdXAgdHlwZXMgYW5kIHN1Y2ggKHNhYmVyIEMgcHJvYmxlbXMpLgotCSogZWNvZmYuYzogIENsZWFuIHVwIHR5cGVzIGFuZCBzdWNoLiAgUmVtb3ZlIHJvdXRpbmVzIHRoYXQgYXJlCi0Jbm90IHVzZWQuICBGaXggdXAgcmVhZGluZyBhbmQgc3dhcHBpbmcgb2Ygc2hvcnRzIGZyb20gZmlsZXMuCi0KLSAgIE5vdGVzIG9uIGJmZC0wLjUuMi1wYXRjaDFhLCBmcm9tIFBlciBCb3RobmVyOgotCi0JKiBhLm91dC52YXguYzogUmVtb3ZlIHR3byBib2d1cyAic3RhdGljIiBmcm9tIHByb3RvdHlwZXMuCi0KLQkqIGVjb2ZmLmM6IEdvdCByaWQgb2YgbG90cyBvZiBub24td29ya2luZyBqdW5rICh0aGF0IGhhZAotCWJlZW4gY29waWVkIGRpcmVjdGx5IGZyb20gY29mZi1jb2RlLmgpLgotCVVwZGF0ZWQgdG8gYmUgY29uc2lzdGVudCB3aXRoIHVwZGF0ZXMgdG8gaWNvZmYuYyBhbmQgY29mZi1jb2RlLmguCi0KLQkqIGxpYmJmZC5oOiBBZGRlZCBkZWZpbml0aW9ucyBmb3IgU19JWFVTUiwgU19JWEdSUCwgYW5kIFNfSVhPVEgKLQlpZiB0aGV5J3JlIG1pc3NpbmcgKGFzIHRoZXkgYXJlIGluIChCRFMtNC4zLWJhc2VkKSBOZXdzT1MtMykuCi0KLQkqIHN1bm9zLmMgKG5fdHh0b2ZmKTogKFJlLSlBZGQgc3VwcG9ydCBmb3Igc29ueS4gVGhpcyBpcyBhIGtsdWRnZSwKLQlidXQgdW50aWwgdGhlIHRhcmdldF92ZWN0b3IgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQsCi0JaXQncyBhcyBnb29kIGFzIGFueS4gTm90ZSB0aGF0IHRoZSB0ZXh0IG9mZnNldCBpcyB0aGUgb25seQotCWRpZmZlcmVuY2UgYmV0d2VlbiBOZXdzT1MgYW5kIFN1bk9zIChpbmNsdWRpbmcgbWFnaWMgbnVtYmVycykuCi0JKE1vc3Qgb2YgdGhlIHN1bm9zXyogcm91dGluZXMgc2hvdWxkIHRvIHJlbmFtZWQgYnNkXyoKLQlhbmQgbW92ZSB0byBhIGJzZC5jIGZpbGUuIFRoZW4gKGFuZCB3aGVuIHRoZSB0YXJnZXRfdmVjdG9yCi0JaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQpIGl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gY3JlYXRlCi0JYSBzZXBhcmF0ZSBTb255IHRhcmdldC4pCi0KLQkqIHN5c2RlcC5oOiBEb24ndCBkZWNsYXJlIGZyZWFkIGFuZCBmd3JpdGUuIENhdXNlcyB0cm91YmxlCi0Jb24gc29tZSBzeXN0ZW1zLCBhbmQgZG9lc24ndCBoZWxwIG9uIG90aGVycy4KLQlTaW1pbGFybHksIG9ubHkgZGVmaW5lIFhfT0sgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQotCSogdHJhZC1jb3JlLmM6IERvbid0IGluY2x1ZGUgc3lzL3N0YXQuaCAtIGF0IGxlYXN0Ci0Jb24gTmV3c09TIDMsIGl0IGhhcyBhbHJlYWR5IGJlZW4gaW5jbHVkZWQuCi0KLVR1ZSBNYXIgIDUgMDE6NDc6NTcgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWNvZGUuaCAoYmZkX2NvZmZfc3dhcF9zeW0sIGJmZF9jb2ZmX3N3YXBfYXV4LAotCWJmZF9jb2ZmX3N3YXBfbGluZW5vKTogIEV4cG9ydCB0aGUgcm91dGluZXMgdGhhdCBieXRlLXN3YXAgQ09GRgotCXN5bWJvbCB0YWJsZXMgaWYgbmVjZXNzYXJ5IHdoZW4gcmVhZGluZyB0aGVtIGluLCBzbyBnZGIgY2FuIHVzZQotCXRoZW0uICBBZGQgImJmZF9jb2ZmXyIgdG8gdGhlIG5hbWVzIHNvIHRoZXkgd29uJ3QgY29uZmxpY3Qgd2l0aAotCW5hbWVzIGluIGNhbGxpbmcgcHJvZ3JhbXMuICBGSVhNRS1zb29uOiAgaWYgY29mZi1jb2RlLmggaXMKLQlpbmNsdWRlZCBpbiB0d28gQkZEIG1vZHVsZXMsIHRoaXMgd2lsbCBjYXVzZSBkdXBsaWNhdGUKLQlkZWZpbml0aW9uczsgdGhlIHJvdXRpbmVzIHNob3VsZCBiZSBleHBvcnRlZCB0byBhIHNlcGFyYXRlLAotCWNvbW1vbiwgbW9kdWxlIChwcm9iYWJseSBhbG9uZyB3aXRoIGEgbWVzcyBvZiBvdGhlciBvbmVzKS4KLQotU2F0IE1hciAgMiAxMjoxMToyNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQlJbXByb3ZlIG1vZHRpbWUgc3VwcG9ydC4KLQotCSogYmZkLmg6ICBBZGQgYm9vbGVhbiBtdGltZV9zZXQsIGFuZCBkZWNsYXJlIGJmZF9nZXRfbXRpbWUuCi0JUmVtb3ZlICNkZWZpbmUgZm9yIGJmZF9nZXRfbXRpbWUuICBSZW1vdmUgZ3JhdHVpdG91cyBjb21tZW50LgotCSogYmZkLmMgKGJmZF9nZXRfbXRpbWUpOiAgTmV3IGZuLCBjYWNoZXMgbXRpbWUsIGdldHMgaWYgbm90IGNhY2hlZC4KLQlCVUc6ICBhcmNoaXZlIG1lbWJlcnMgc3RpbGwgZG8gbm90IGdldCBjb3JyZWN0IG1vZCB0aW1lcy4KLQotCUltcHJvdmUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBmb3IgY29yZSBmaWxlcy4KLQotCSogc3Vub3MuYyAoc3RydWN0IGNvcmUpOiAgQ2hhbmdlIHZvaWQgKmZwYV9kdW1teSB0byBkb3VibGUgZnBfc3R1ZmYuCi0JKHN1bm9zNF9jb3JlX2ZpbGVfcCk6ICBDcmVhdGUgYSBzZWNvbmQgcmVnaXN0ZXJzIHNlY3Rpb24gaW4gdGhlCi0JY29yZSBmaWxlLCBjYWxsZWQgIi5yZWcyIiwgZm9yIHRoZSBmbG9hdCByZWdpc3RlcnMuCi0KLVRodSBGZWIgMTQgMTU6NDk6MDYgMTk5MSAgR3VtYnkgVmluYXlhayBXYWxsYWNlICAoZ3VtYnkgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIG1hbnkgY2hhbmdlcyB0byBpbXByb3ZlIGFyY2hpdmUgaGFuZGxpbmc7IGZvdW5kIGEgbG9naWMgZmxhdyBpbgotCSAgYmZkX2NoZWNrX2Zvcm1hdCB3aGljaCBvbmx5IGp1c3QgaGFwcGVuZWQgdG8gd29yayBieSBjb29uY2lkZW5jZS4KLQotVGh1IEZlYiAxNCAwNzo1MzoxNiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBiZmQuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IGZpeGVkIHRvIHVzZSBvdXRwdXRfb2Zmc2V0cwotCWNvcnJlY3RseS4KLQotCSogYmZkLmg6IGNoYW5nZWQgdHlwZSBvZiB1ZGF0YSBpbiBhc3ltYm9sIHRvIHZvaWQgKiwgbGlrZSBpdAotCXNob3VsZCBiZS4gQWRkZWQgYmZkX3JlbG9jX2Rhbmdlcm91cyBlbnVtIG1lbWJlci4KLQotCSogY29mZi1jb2RlLmg6IEZpeGVkIGl0IHNvIHRoYXQgaW50ZXJuYWxseSBnZW5lcmF0ZWQgc3ltYm9scyBnZXQKLQl0aGVpciB2YWx1ZXMgcmVsb2NhdGVkIGNvcnJlY3RseSBpbiBhbGwgY2FzZXMuIFJlbW92ZWQgY2FsbHMgdG8KLQl4bWFsbG9jLgotCi0JKiBpY29mZi5jOiBOb3QgdW5kZXJzdGFuZGluZyB0aGUgZGVzdGluYXRpb24gc3ltYm9sIG9mIGEgcmVsb2MgaXMKLQlub3QgYSBmYWlsdXJlIGFueSBtb3JlLCBqdXN0ICdkYW5nZXJvdXMnLiBUaGlzIGFsbG93cyBsaW5raW5nIG9mCi0JYi5vdXQgYW5kIGNvZmYgaW1hZ2VzLgotCi0JKiBzdW5vcy5jOiBDbGVhbmVkIHVwIHRoZSB3YXkgdGhhdCBaTUFHSUMgc2VjdGlvbiBzaXplcyBhcmUKLQljYWxjdWxhdGVkLgotCi0KLVR1ZSBGZWIgMTIgMTM6MjU6NDYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogc3Vub3MuYyAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBmaXhlZAotCXN5bV9wb2ludGVyLT5uX3ZhbHVlIHNvIHRoYXQgc3ltYm9scyBvbiB0aGUgd2F5IG91dCBnZXQgdGhlaXIKLQlzZWN0aW9uIHJlbGF0aXZlIHZhbHVlcyBjYWxjdWxhdGVkIGNvcnJlY3RseS4KLQotCSogY29mZi1jb2RlLmggKG1hbmdsZV9zeW1ib2xzKTogZml4ZWQgcHJvYmxlbSB3aGVyZSB0YWdzIHdlcmUgbm90Ci0JYmVpbmcgcmVsb2NhdGVkIGZvciBzdHJ1Y3RzLCBlbnVtcywgdW5pb25zLiBBbHNvIHZhcmlvdXMgbGludHMuCi0KLU1vbiBGZWIgMTEgMTk6NTI6MjYgMTk5MSAgR3VtYnkgVmluYXlhayBXYWxsYWNlICAoZ3VtYnkgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoZ2V0X2VsdF9hdF9maWxlcG9zKTogc3lzdGVtX2NhbGxfZXJyb3IgcmV0dXJuZWQKLQkgIGluY29ycmVjdGx5LgotCi1TdW4gRmViIDEwIDIzOjE4OjQwIDE5OTEgIEd1bWJ5IFZpbmF5YWsgV2FsbGFjZSAgKGd1bWJ5IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBSZXNvbHZlIHRoZSB1c2Ugb2Ygbm9fZXJyb3IgYW5kIHN5c3RlbV9jYWxsX2Vycm9yLgotCSAgVGhlIGJmZCBsaWJyYXJ5IGl0c2VsZiBub3cgd2lsbCBuZXZlciBzZXQgYmZkX2Vycm9yIHRvCi0JICBub19lcnJvci4KLQotCSAgVGhlIGNvZGUgc3RpbGwgbmVlZHMgdG8gYmUgY29tYmVkIHRvIG1ha2Ugc3VyZSBhbGwgdGhlIGVycm9yCi0JICBjb2RlcyBhcmUgY29ycmVjdC4gIEkgc3VzcGVjdCB0aGV5IGFyZSBub3QgYWx3YXlzIHNldCBjb3JyZWN0bHkuCi0KLQkqIFRoZSBuYW1lcyBvZiBhbGwgdGhlIG1lc3NhZ2VzIGhhdmUgXyBwcmVwZW5kZWQgYmVjYXVzZSB0aGUgc3VuCi0JICBidW5kbGVkIGNvbXBpbGVyIGNhbid0IGRpc3Rpbmd1aXNoIGZyb20gYSBtYWNybyB3aGljaCB0YWtlcyBhbgotCSAgYXJndW1lbnQgYW5kIHRoZSBzYW1lIGlkZW50aWZpZXIgaW4gYSBub24tbWFjcm8gY29udGV4dC4KLQotCSogVGhlIHJlYXNvbiBmb3IgdGhlIGFib3ZlIGJlaW5nIHRoYXQgZW50cnkgcG9pbnRzIHdoaWNoIHVzZWQgdG8KLQkgIGJlIHRyYW1wb2xpbmUgZnVuY3Rpb25zIGFyZSBub3cganVzdCBtYWNyb3Mgd2hpY2ggZXhwYW5kIHRvIGEKLQkgIGRpcmVjdCBjYWxsIHRocm91Z2ggdGhlIGJmZCdzIHhmZXIgdmVjdG9yLgotCi0JKiAoLi4vaW5jbHVkZS9pbnRlbC1jb2ZmLmgpIEZfQVIzMldSOiBmaXggdGhpcyBjb25zdGFudC4gIFdoeQotCSAgbXVzdCBnYXMgaGF2ZSBpdHMgb3duIHZlcnNpb24gb2YgZXZlcnl0aGluZyAodGhlIGdhcyB2ZXJzaW9uCi0JICBoYWQgdGhlIGNvcnJlY3QgdmFsdWUpCi0KLVR1ZSBGZWIgIDUgMTE6NDY6NTMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYi5vdXQuYzogQWRkZWQgcGF0Y2hlcyBzdXBwbGllZCBieSBjaHJpc2JAbWlwb24yLmludGVsLmNvbSB0bwotCXByb3Blcmx5IHN1cHBvcnQgaTk2MCBhcmNoaXRlY3R1cmUgYW5kIG91dHB1dCBjb3JyZWN0IHJlbG9jIHN0dWZmLgotCi0JKiBiZmQuaDogYWRkZWQgcHJvdG90eXBlIGZvciBiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCwgYWRkZWQKLQlCRkRfRkFJTAotCi0JKiBjb2ZmLWNvZGUuaDogQXBwbGllZCBwYXRjaGVzIGZyb20gY2hyaXNiIHRvIHN1cHBvcnQgaTk2MAotCWFyY2hpdGVjdHVyZSwgemVybyByZWxvY3MgYW5kIHN3YXAgdGhlbSBjb3JyZWNseSBhbmQgY29uZGl0aW9uYWxseQotCWNvbXBpbGVkIHRoZSB0aW1lc3RhbXAuCi0KLQkqIHN1bm9zLmM6IE1hZGUgdGhlIGRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQgMl4zIHNvIHRoYXQgZG91YmxlcwotCWFyZSBkb25lIHByb3Blcmx5LiBGaXhlZCB0aGUgc2FtZSByZWxvYyBidWcgdGhhdCB3YXMgaW4gYi5vdXQuYwotCi0JKiBzeXNkZXAuaDogTm93IGNvbXBpbGVzIG9uIGEgUG9zaXggYm94Ci0KLVdlZCBKYW4gMzAgMjE6MzY6MjYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBpY29mZi5jOiAgRml4IGNvbW1lbnQgb24gYmlnLWVuZGlhbiB2ZXJzaW9uLgotCSogY29mZi1jb2RlLmg6ICBNYWtlIEhBU19SRUxPQyByZWFsbHkgd29yayAoaXQncyBiYWNrd2FyZHMgZnJvbQotCUZfUkVMRkxHKS4gIFNldCBGX0FSMzJXUiBpbiBvdXRwdXQgZmlsZXMgaWYgbGl0dGxlIGVuZGlhbgotCWFyY2hpdGVjdHVyZS4KLQotVHVlIEphbiAyOSAyMDo1NjoxMCBQU1QgMTk5MSBzdGV2ZUBjeWdudXMuY29tCi0KLQkqIGFyY2h1cmVzLmMgZml4ZWQgPS89PSB0eXBvCi0KLQkqIHN1bm9zLmMgYWRkZWQgYXJjaGl0ZWN0dXJlIHN0dWZmIGZvciBvdXRwdXQuIEZpeGVkCi0JYnVnIHdoZXJlIGZpbGVzIHdoZXJlIHZtYShkYXRhKSAhPSBzaXplKHRleHQpCi0Jd2VyZSBwcm9jZXNzZWQgd3JvbmcuCi0KLQkqIGNvZmYtY29kZS5oIGFkZGVkIGEgbGludCBjYXN0Ci0KLQkqICguLi9pbmNsdWRlL2Eub3V0LnN1bjQuaCkgZml4ZWQgaXQgc28gem1hZ2ljCi0Jd29ya2VkCi0KLU1vbiBKYW4gMjggMTk6MTU6MjkgUFNUIDE5OTEgc3RldmVAY3lnbnVzLmNvbQotCi0JKiBhcmNoaXZlLmMgcmVtb3ZlZCBsb2FkcyBvZiBpbmNsdWRlcywgYW5kIGZpeGVkIGJ1ZyB3aGVyZSBzdHJpbmcKLQl0YWJsZSBkaWRuJ3QgaGF2ZSBhIG51bGwgYXQgdGhlIGVuZC4KLQotCSogYmZkLmMgZml4ZWQgaW5jbHVkZXMsIGFkZGVkIHN5bWJvbHMgYXJndW1lbnQgdG8KLQljYW5vbmljYWxpemVfcmVsb2MgZW50cnkgcG9pbnQuCi0KLQkqIGxpYmJmZC5jIGZpeGVkIGluY2x1ZGVzIGFuZCBhZGRlZCBzb21lIGxpbnQgcGF0Y2hlcy4KLQotCSogdGFyZ2V0cy5jIGFkZGVkIGJvdGggc29ydHMgb2YgaW50ZWwgY29mZi4KLQotCSogYi5vdXQuYyBmaXhlZCBpbmNsdWRlZCwgY2hhbmdlZCB3YXMgdGhlIGNhbm9uaWNhbAotCXJlbG9jcyB3ZXJlIGRvbmUuCi0KLQkqIGljb2ZmLmMgYWRkZWQgc3VwcG9ydCBmb3IgY2FsbGogYW5kIGJpZyBhbmQgbGl0dGxlCi0JZW5pZGlhbiB0YWJsZXMuCi0KLQkqIG9wbmNscy5jIGFkZGVkIGNobW9kK3hpbmcgZm9yIGZpbGVzIHdpdGggRVhFQ19QIHNldC4KLQotCSogc3Vub3MuYyBmaXhlZCBpbmNsdWRlcy4gQ2hhbmdlZCBkZWZhdWx0IHNlY3Rpb24KLQlhbGlnbmVtZW50IHRvIHdvcmRzLiBGaXhlZCByZWxvY2F0aW9uIHN0dWZmIHRvIHdvcmsgd2l0aAotCW5ldyBzY2hlbWUKLQotCSogYmZkLmggdmFyaW91cyBuZXcgdHlwZXMgYWRkZWQsIHByb3RvdHlwZSBmb3IgbmV3Ci0JcmVsb2MgY2FsbHMsIGNoYW5nZWQgYmZkLT5pb3N0cmVhbSB0byBhIHZvaWQgKgotCXRvIGluY2x1ZGluZyBmaWxlcyBkb24ndCBuZWVkIHN0ZGlvLmguCi0KLQkqIGxpYmNvZmYuaCBhZGRlZCBjb252ZXJzaW9uIHRhYmxlIHRvIHRpZSByZWxvY3MgdG8KLQljYW5vbmljYWwgc3ltYm9scwotCi0JKiBzeXNkZXAuaCBjcmVhdGVkCi0KLQkqIGNvZmYtY29kZS5oIGZpeGVkIGluY2x1ZGVzLiBBZGRlZCBjb2RlIHRvIHN1cHBvcnQKLQliaWcgYW5kIGxpdHRsZSBlbmRpYW4gZm9ybWF0cy4gVmFyaW91cyBsaW50cy4gQmV0dGVyCi0JcHJvY2Vzc2luZyBvZiBzeW1ib2xzLiBDaGFuZ2VkIHJlbG9jIHN0dWZmIHRvIG5ldwotCW9yZGVyCi0KLQkqIGxpYmJmZC5oIGZpeGVkIGluY2x1ZGVzCi0KLQotTW9uIEphbiAyMSAxMTo1Mzo1MSBQU1QgMTk5MSBzdGV2ZUBjeWdudXMuY29tCi0KLQkqIGJmZC5oCWNoYW5nZWQgbmFtZSBvZiBhbGlnbm1lbnQgZW50cnkgaW4gc2VjX3N0cnVjdCB0bwotCWFsaWdubWVudF9wb3dlciwgYmVjYXVzZSBvZiBjb25mbGljdGluZyB1c2VzIHdpdGhpbiBiZmQuCi0JTm93IGl0IHNob3VsZCBiZSBvYnZpb3VzIHRoYXQgaXQncyBhIDIqKm4gYWxpZ25tZW50Ci0Jc3BlY2lmaWVyLiBSZW1vdmVkIHN0YXJ0X3BhZCwgZW5kX2FsaWdubWVudCwgYmxvY2ssIG1pbnNpemUsCi0Jb3V0cHV0X2ZpbGVfYWxpZ25tZW50LCBzdWJzZWN0aW9uX2FsaWdubWVudCBhbmQgb3JpZ2luYWxfdm1hIGZpZWxkcy4KLQlBZGRlZCBhbGlnbl9wb3dlcigpIG1hY3JvLiBGaXhlZCBiZmRfc2VjdGlvbl9hbGlnbm1lbnQKLQlhY2Vzc29yIG1hY3Jvcy4gQWRkZWQgYmZkX3N5bWJvbF9zYW1lX3RhcmdldCBtYWNyby4KLQotCSogYi5vdXQuYyAoYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSBmaXhlZCB0byB1c2UKLQluZXcgYWxpZ25tZW50IG1lbWJlci4gRml4ZWQgKGNhbGxqX2NhbGxiYWNrKSB0byB1c2Ugc2VjdGlvbgotCXJlbGF0aXZlIHN5bWJvbHMgcHJvcGVybHkuCi0KLQkqIHN1bm9zLmMgKHN1bm9zNF9vYmplY3RfcCkgZml4ZWQgdG8gdXNlIG5ldyBhbGlnbm1lbnRfcG93ZXIuCi0JRml4ZWQgKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpIHRvIGNvcnJlY3RseSBtYWtlCi0Jc3ltYm9scyBzZWN0aW9uIHJlbGF0aXZlLgotCi0JKiBiZmQuYyAoYmZkX2Vycm1zZykgZml4ZWQgdmFyaW91cyBlbnVtIGNhc3QgcHJvYmxlbXMuCi0JKGJmZF9tYWtlX3NlY3Rpb24pIHRvb2sgb3V0IGluaXRpYWxpemF0aW9uIG9mIG9ic29sZXRlIG1lbWJlcnMuCi0JKGJmZF9wcmludF9zeW1ib2xfdmFuZGYpIGFkZGVkCi0KLQkqIG9wbmNscy5jIChiZmRfY3JlYXRlKSBjcmVhdGVkLgotCi0JKiBjb2ZmLWNvZGUuaCAoY29mZl9uZXdfc2VjdGlvbl9ob29rKSB0b29rIGF3YXkgcmVmcwotCXRvIG9ic29sZXRlIG1lbWJlcnMuIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpIGFkZGVkCi0JY29udmVyc2lvbiBiZXR3ZWVuIGFsaWdubWVudCB0eXBlcy4gKGNvZmZfc3ltYm9sX2Zyb20pCi0JYWRkZWQuIChjb2ZmX2NvdW50X2xpbmVudW1iZXJzKSBvbmx5IGNvdW50cyBsaW5lbnVtYmVycwotCWlmIHN5bWJvbCBpcyBvZiBjb2ZmLXR5cGUuIChjb2ZmX21hbmdsZV9zeW1ib2xzKSBvbmx5Ci0JaGVhdmlseSBtYW5nbGVzIHN5bWJvbHMgaWYgc3ltYm9sIGlzIGNvZmYtdHlwZS4KLQkoY29mZl93cml0ZV9zeW1ib2xzKSB2YXJpb3VzIGxpbnRzLiAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpCi0JdmFyaW91cyBsaW50cyBhbmQgbW9kaWZpY2F0aW9uIGZvciBhbGlnbm1lbnQgY29udmVyc2lvbi4KLQkoY29mZl9zbHVycF9yZWxvY3MpIGZpeGVkIGZvciB1c2Ugd2l0aCBuZXcgYXNlY3Rpb24gc2hhcGUuCi0KLVNhdCBKYW4gMTkgMTY6MTA6NDIgUFNUIDE5OTEgc3RldmVAY3lnbnVzLmNvbQotCi0JKiBhcmNoaXZlLmMgbG90cyBvZiBsaW50Ci0KLQkqIGIub3V0LmMgYWRkZWQgY2FsbGogcmVsb2NhdGlvbiBzdXBwb3J0LCB1cGdyYXRlZCByZWxvYyBob3d0by4KLQlGaXhlZCBzbyB0aGF0IGFzeW1ib2wgYW5kIHJlbG9jIHJlY29yZHMgYXJlIG91dHB1dAotCWNvcnJlY3RseS4KLQotCSogYmZkLmMgbG90cyBvZiBsaW50LCBzdXBwb3J0IGZvciBuZXcgYmZkIGVudHJ5IHBvaW50Ci0JYmZkX3ByaW50X3N5bWJvbC4KLQotCSogYmZkLmggY2hhbmdlZCBkZWZpbml0aW9uIG9mIGFzeW1ib2wgdG8gY29udGFpbiBwb2ludGVyIHRvCi0Jb3duaW5nIGJmZCwgcmVtb3ZlZCB0YXJnZXQgZGVwZW5kZW5jaWVzLgotCi0JKiBjYWNoZS5jIHRvb2sgb3V0IHByaW50IHN0YXRlbWVudHMsIHB1dCBpbiBCRkRfQVNTRVJUIGNhbGxzLgotCi0JKiBjb2ZmLWNvZGUuaCB2YXJpb3VzIGxpbnRzLCBjb3JyZWN0ZWQgbGluZW51bWJlciBvdXRwdXQKLQlmdW5jdGlvbmFsaXR5LiBBZGRlZCBzdXBwb3J0IGZvciBuZXcgc3R5bGUgYXN5bWJvbHMgYW5kCi0JYmZkX3ByaW50X3N5bWJvbC4gRml4ZWQgc28gdGhhdCBhc3ltYm9sIGFuZAotCXJlbG9jIHJlY29yZHMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LiBBZGRlZCB0aW1lc3RhbXAuCi0KLQkqIGljb2ZmLmMgQWRkZWQgc3VwcG9ydCBmb3IgbmV3IGhvd3RvIHNoYXBlLgotCi0JKiBsaWJhLm91dC5oIEFkZGVkIHN1cHBvcnQgZm9yIG5ldyBhc3ltYm9sIHNoYXBlCi0KLQkqIGxpYmJmZC5jIHZhcmlvdXMgbGludHMKLQotCSogbGliYmZkLmggdmFyaW91cyBsaW50cwotCi0JKiBsaWJjb2ZmLmggYWRkZWQgc3VwcG9ydCBmb3IgbmV3IGFzeW1ib2wgc2hhcGUuCi0KLQkqIHN1bm9zLmMgIHZhcmlvdXMgbGludHMuIEFkZGVkIHN1cHBvcnQgZm9yIG5ldyBhc3ltYm9sIHNoYXBlCi0JYW5kIGJmZF9wcmludF9zeW1ib2wuCi0KLVdlZCBKYW4gMTYgMjE6Mzg6MDkgUFNUIDE5OTEgc3RldmVAY3lnbnVzLmNvbQotCi0JKiBiLm91dC5jIHJlbW92ZWQgcHJvdG90eXBlIG9mIHN1bm9zNF9lbm5hdGl2YXRlX3N5bXRhYiwgbG90cyBvZgotCXBvaW50ZXIgbGludC4gQWRkZWQgc3VwcG9ydCBmb3IgY2FsbGogcmVsb2NhdGlvbi4gRml4ZWQgYnVnIHdoZXJlCi0JdGhlIGxhc3QgMzIgYnl0ZXMgb2YgdGhlIHRleHQgc2VjdGlvbiB3ZXJlIG92ZXJ3cml0dGVuIGJ5IGRhdGEuIEZpeGVkIGJ1ZwotCXdoZXJlIGFyY2hpdmVzIG9mIGIub3V0IGRpZG4ndCB3b3JrIGR1ZSBiZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotCXJldHVybmluZyBmYWxzZS4KLQotCSogc3Vub3MuYyBhZGRlZCBzdXBwb3J0IGZvciBuX290aGVyIGZpZWxkLiBCcmFjZWQgdGhlIGhvd3RvIHRhYmxlIHNvCi0JdGhhdCBpdCB3b24ndCBiZSBhZmZlY3RlZCBieSBhbnkgbGVuZ3RoaW5nIG9mIHRoZSBob3d0byBzdHJ1Y3QgdHlwZWRlZi4KLQlWYXJpb3VzIGxpbnRzCi0KLQkqIGJmZC5oIGFkZGVkIHN1cHBvcnQgZm9yIG5fb3RoZXIgZmllbGQsIGFkZGVkIHNwZWNpYWxfZnVuY3Rpb24KLQlyZWxvYyB0eXBlLCBtb2RpZmllZCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHByb3RvdHlwZS4gQWRkZWQgYmZkX2hfZ2V0X3gKLQltYWNyb3MuCi0KLQkqIGJmZC5jIHVwZ3JhZGVkIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIHZhcmlvdXMgbGludHMuCi0KLVdlZCBKYW4gMTYgMDE6NTU6NTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IHJ0bCkKLQotCSogQ2hhbmdlTG9nOiAgU3RhcnRlZCBDaGFuZ2VMb2cgZm9yIEJGRC4KLQkqIFRvRG86ICBDcmVhdGUgZmlsZSBmb3Igc3VnZ2VzdGlvbnMuCi0KLQkqIE1ha2VmaWxlOiAgU3VwcG9ydCBlYXN5IGxvYWRpbmcgaW50byBTYWJlciBDLgotCUFkZCBkZXBlbmRlbmNpZXMgZm9yIGljb2ZmLm8gYW5kIGJjczg4a2NvZmYuby4KLQlSZW5hbWUgY29mZi5jIHRvIGNvZmYtY29kZS5oLiAgQ2hhbmdlIGNhbGxlcnMuCi0KLQkqIGJmZC5jIChiZmRfY2hlY2tfZm9ybWF0KTogIEFsbG93IHRoZSBjaGVja19mb3JtYXQgcm91dGluZXMKLQl0byByZXR1cm4gdGhlIGRlc2lyZWQgdGFyZ2V0IHZlY3RvciwgcmF0aGVyIHRoYW4ganVzdCBhIEJvb2xlYW4uCi0JYmZkLmggKGJmZF9jaGVja19mb3JtYXQpOiAgQ2hhbmdlIGZ1bmN0aW9uIHBvaW50ZXIgcmV0dXJuIHR5cGUuCi0JYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiAgY2hhbmdlIGNhbGxlZS4KLQliLm91dC5jIChiX291dF9saXR0bGVfb2JqZWN0X3AsIGJfb3V0X2JpZ19vYmplY3RfcCwKLQliX291dF9yZWFsX29iamVjdF9wKTogIGNoYW5nZSBjYWxsZWUuCi0JbGliYmZkLmMgKF9iZmRfZHVtbXlfdGFyZ2V0KTogIER1bW15IHJvdXRpbmUgcmVwbGFjaW5nIGJmZF9mYWxzZQotCWluIGNoZWNrX2Zvcm1hdCB0cmFuc2ZlciB2ZWN0b3JzIHRoYXQgbmVlZCBhIGZpbGxlci4KLQlsaWJiZmQuaCAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldCk6ICBGaXggZGVjbHMuCi0JYmNzODhrY29mZi5jOiAgY2hhbmdlIGNhbGxlZS4KLQljb2ZmLWNvZGUuaCAoY29mZl9yZWFsX29iamVjdF9wLCBjb2ZmX2JpZ19vYmplY3RfcCk6ICBjaGFuZ2UgY2FsbGVlLgotCWljb2ZmLmM6ICBjaGFuZ2UgY2FsbGVlLgotCXN1bm9zLmMgKHN1bm9zNF9vYmplY3RfcCwgc3Vub3M0X2NvcmVfZmlsZV9wKTogIGNoYW5nZSBjYWxsZWUuCi0KLQkqIGxpYmJmZC5jICh6YWxsb2MpOiAgSXQgc2hvdWxkIGFjdHVhbGx5IHplcm8gdGhlIHN0b3JhZ2UhCi0JVGhpcyB3YXMgY29tbWVudGVkIG91dCBmb3Igc29tZSByZWFzb24uCi0KLQkqIGxpYmJmZC5oOiAgQWRkIG1hbGxvYywgeG1hbGxvYywgbWVtY3B5LCBhbmQgZmF0YWwgZGVjbHMuCi0JVGhpcyBpcyBzbyBjYWxsZXJzIGNhbiBhdm9pZCA8c3RkbGliLmg+IHdoaWNoIGRvZXNuJ3QgZXhpc3QKLQlvbiBvbGRlciBzeXN0ZW1zLgotCi0JKiBiZmQuYyAobWFwX292ZXJfc2VjdGlvbnMpOiAgQWRkIGRlYnVnZ2luZyBjb2RlLCBzaW5jZSBJCi0Jbm90aWNlZCB0aGUgc2VjdGlvbiBjb3VudCBmb3Igc3Vub3MgY29yZSBmaWxlcyB3YXMgYmFkLCBidXQgb25seQotCUdEQiBoYWQgZGV0ZWN0ZWQgdGhlIHByb2JsZW0uCi0JKGJmZF9zZXRfc2VjdGlvbl9saW5lbm9fc2l6ZSwgYmZkX3NldF9zZWN0aW9uX2xpbmVub3MsCi0JYmZkX2dldF9zZWN0aW9uX2xpbmVub3MpOiAgUmVtb3ZlIG9ic29sZXRlIGZ1bmN0aW9ucy4KLQkoYmZkX2FwcGx5X3JlbG9jYXRpb25zKTogIFVzZSBsb25ncywgbm90IGludHMsIGZvciB0aGUgbWF0aC4KLQotCSogYmZkLmg6ICBEZWNsYXJlIGVudW0gYm9vbGVhbiBhbmQgc3RydWN0IGJmZF90YXJnZXQgYXMgd2VsbAotCWFzIHR5cGVkZWZzIGZvciB0aGVtLiAgUmVtb3ZlIG9ic29sZXRlCi0JYmZkX2dldF9zZWN0aW9uX2xpbmVub19zaXplLgotCi0JKiBjYWNoZS5jOiAgTWFrZSB0aGUgImZkb3BlbiIgc3VwcG9ydCB3b3JrLiAgS2VlcCBiZXR0ZXIgdHJhY2sKLQlvZiBob3cgbWFueSBmaWxlcyBhcmUgb3Blbi4gIENlbnRyYWxpemUgdGhlIG9wZW5pbmcgb2YgZmlsZXMKLQlhbmQgYmUgc3VyZSBiZmRfb3Blbltyd10gYWN0dWFsbHkgdHJ5IHRvIG9wZW4gdGhlIGZpbGUuICBFdmFkZQotCWxpbmtlZCBsaXN0IGluaXRpYWxpemF0aW9uIHByb2JsZW1zLgotCi0JKiBiLm91dC5jLCBjb2ZmLWNvZGUuaCwgb3BuY2xzLmMsIHN1bm9zLmM6ICBsaW50LgotCi0JKiBjb2ZmLWNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgTnVsbC10ZXJtaW5hdGUgc3ltdGFiIG5hbWVzLgotCi0JKiBjcGx1cy1kZW0uYzogIERlbGV0ZSBmaWxlLCBzaW5jZSBpdCBpcyBub3QgcGFydCBvZiBCRkQuCi0KLQkqIG9wbmNscy5jIChiZmRfb3BlbnIpOiAgRWxpbWluYXRlIG1pc3BsYWNlZCAjaWYgMCBjb2RlLgotCShiZmRfb3BlbnIsIGJmZF9vcGVudyk6ICBBY3R1YWxseSBvcGVuIHRoZSBmaWxlLCBnaXZlIGVycm9yIG5vdy4KLQotCSogc3Vub3MuYyAoc3Vub3M0X2NvcmVfZmlsZV9wKTogIFNldCBzZWN0aW9uIGNvdW50LgotCShzdW5vczRfc2V0X3NlY3Rpb25fbGluZW5vcywgc3RhYl9uYW1lcywgZnByaW50X25hbWUpOiAgRWxpbWluaWF0ZQotCW9ic29sZXRlIGRlZmluaXRpb25zLgotCShfd3JpdGVfc3ltYm9sX3RhYmxlKTogIEluaXRpYWxpemUgPGlkeD4gY291bnRlci4KLQkoZm9vcCk6ICBFbGltaW5hdGUgZGVidWdnaW5nIGNvZGUuCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBjaGFuZ2UtbG9nCi1sZWZ0LW1hcmdpbjogOAotZmlsbC1jb2x1bW46IDc0Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9iZmQvQ2hhbmdlTG9nLTk0OTUgYi9iZmQvQ2hhbmdlTG9nLTk0OTUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Njg1ODMuLjAwMDAwMDAKLS0tIGEvYmZkL0NoYW5nZUxvZy05NDk1CisrKyAvZGV2L251bGwKQEAgLTEsMTAwNDMgKzAsMCBAQAotVGh1IERlYyAyMSAxMjo0Mzo0OSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IEFkZCBhIHBob255IHJlbG9jIHRvIGhhbmRsZSB0aGUKLQlvbGQgc3R5bGUgVE9DMTYgcmVmZXJlbmNlcyB3aXRob3V0IHVzaW5nIFJfUFBDX0dPVC4KLQkocHBjX3JlbG9jX3R5cGUpOiBEaXR0by4KLQkocHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBzdXBwb3J0IGZvciBUT0MxNi4KLQkocHBjX2VsZl90b2MxNl9pbm5lcik6IFJlbmFtZWQgZnJvbSBwcGNfZWxmX2dvdDE2X2lubmVyLgotCShwcGNfZWxmX3RvYzE2X3JlbG9jKTogUmVuYW1lZCBmcm9tIHBwY19lbGZfdG9jMTZfcmVsb2MuCi0JKHBwY19lbGZfZ290MTZfe2lubmVyLHJlbG9jfSk6IFN0dWJzIGZvciByZWFsIEdPVCBzdXBwb3J0LgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IE5ldyBmdW5jdGlvbiBmb3IgR09UL1BMVCBzdXBwb3J0IHRoYXQgaXMKLQl3b3JrIGluIHByb2dyZXNzLgotCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERpdHRvLgotCShwcGNfZWxmX2FkanVzdF9keW5pbmR4KTogRGl0dG8uCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGl0dG8uCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRGl0dG8uCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBEaXR0by4KLQkoRUxGX0RZTkFNSUNfSU5URVJQUkVURVIpOiBEZWZpbmUuCi0KLVdlZCBEZWMgMjAgMTk6MTQ6MTggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBXaGVuIGF0dGFjaGluZyBzZWN0aW9ucyB0bwotCXNlZ21lbnRzIGlnbm9yZSBzZWN0aW9ucyB0aGF0IHdvbid0IGJlIGFsbG9jYXRlZC4gIFBhdGNoIGZyb20KLQlBbmRyZWFzIFNjaHdhYi4KLQotVHVlIERlYyAxOSAyMDowMTo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogTWF0Y2ggb24gbTY4ay1jYm0tKiBvbmx5IGlmIE9TIGRvZXNuJ3QgbWF0Y2gKLQlhbnl0aGluZyBlbHNlLgotCi1UdWUgRGVjIDE5IDE2OjM4OjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pOTYwLmMgKENBTENfQURERU5EKTogRGVmaW5lLgotCShjb2ZmX2k5NjBfcmVsb2NhdGVfc2VjdGlvbik6IEFkZCB0aGUgaW5wdXQgc2VjdGlvbiBWTUEgdG8gdGhlCi0JYWRkZW5kIGZvciBQQyByZWxhdGl2ZSByZWxvY3MuCi0KLVN1biBEZWMgMTcgMjA6MTE6NTUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfcGRhdGEpOiBNdXN0IHRlc3QgdGhlIGVudGlyZSBlbnRyeSBmb3IgemVybwotCXRvIGNvcnJlY3RseSB0ZXJtaW5hdGUuCi0KLUZyaSBEZWMgMTUgMTI6MDU6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGVudW0gYmZkX2VuZGlhbik6IERlZmluZS4KLQkoYmZkX3RhcmdldCk6IFJlbmFtZSBieXRlb3JkZXJfYmlnX3AgdG8gYnl0ZW9yZGVyLCBhbmQgY2hhbmdlIGl0Ci0JZnJvbSBib29sZWFuIHRvIGVudW0gYmZkX2VuZGlhbi4gIENoYW5nZSBoZWFkZXJfYnl0ZW9yZGVyX2JpZ19wCi0JY29ycmVzcG9uZGluZ2x5LgotCSogYmZkLWluLmggKGJmZF9iaWdfZW5kaWFuLCBiZmRfbGl0dGxlX2VuZGlhbik6IE5ldyBtYWNyb3MuCi0JKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiwgYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuKTogTmV3IG1hY3Jvcy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIEFsbCB0YXJnZXRzOiBDaGFuZ2UgaW5pdGlhbGl6YXRpb24gb2YgYnl0ZW9yZGVyIGFuZAotCWhlYWRlcl9ieXRlb3JkZXIgdG8gdXNlIGVudW0gYmZkX2VuZGlhbiB2YWx1ZXMgcmF0aGVyIHRoYW4KLQlib29sZWFucy4KLQkqIEFsbCBmaWxlczogQ2hhbmdlIGFsbCByZWZlcmVuY2VzIHRvIGJ5dGVvcmRlcl9iaWdfcCBhbmQKLQloZWFkZXJfYnl0ZW9yZGVyX2JpZ19wIHRvIHVzZSBuZXcgYmZkXypfZW5kaWFuIG1hY3Jvcy4KLQotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBTZXQgbG1hIHRvIHNfcGFkZHIsIG5vdAotCXNfdmFkZHIuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBzX3BhZGRyIHRvIGxtYSwgbm90Ci0Jdm1hLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQotRnJpIERlYyAxNSAwNzozMjowOSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBwZVtpXS1pMzg2LmMgKFRBUkdFVF9VTkRFUlNDT1JFKTogRGVmaW5lIHRvICdfJy4KLQotVGh1IERlYyAxNCAxMzo0NTozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYzogTG90cyBvZiBtaW5vciBjbGVhbnVwcy4gIE1ha2UgbWFueSBmdW5jdGlvbnMgcmV0dXJuCi0JZXJyb3JzIHJhdGhlciB0aGFuIGNhbGxpbmcgYWJvcnQuICBBbHNvOgotCShpZWVlX3dyaXRlX3R3b2J5dGUpOiBSZW1vdmU7IGNoYW5nZSBjYWxsZXJzIHRvIGNhbGwgZXhpc3RpbmcKLQlpZWVlX3dyaXRlXzJieXRlcyBmdW5jdGlvbi4KLQkoaWVlZV93cml0ZV9leHByZXNzaW9uKTogRG9uJ3Qgb3V0cHV0IHRoZSBzZWN0aW9uIHR3aWNlIHdoZW4KLQlvdXRwdXR0aW5nIGEgbG9jYWwgc3ltYm9sLiAgRG9uJ3QgZW1pdCBhbiBleHRyYW5lb3VzIHplcm8gaWYgdGhlcmUKLQlpcyBvbmx5IG9uZSB0ZXJtLgotCShpZWVlX3NsdXJwX3NlY3Rpb25zKTogU2V0IHRoZSBsbWEgYXMgd2VsbCBhcyB0aGUgdm1hLgotCShpZWVlX2FyY2hpdmVfcCk6IFVzZSBiZmRfYWxsb2NfZ3JvdyByYXRoZXIgdGhhbiBhbiBvYnN0YWNrLgotCi0JKiBpaGV4LmMgKGloZXhfc2V0X2FyY2hfbWFjaCk6IERvbid0IGFjY2VwdCBhbnkgYXJjaGl0ZWN0dXJlLCBqdXN0Ci0JYSByZWNvZ25pemVkIG9uZSBvciBiZmRfYXJjaF91bmtub3duLgotCShpaGV4X2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBEZWZpbmUgYXMgYmZkXzBsLCB0byBwZXJtaXQgb2JqY29weQotCXRvIHN1Y2NlZWQuCi0JKGloZXhfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCi1XZWQgRGVjIDEzIDE1OjQ0OjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaDogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdGFibGUpOiBEZWZpbmUuCi0JKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdG90YWxzKTogRGVmaW5lLgotCShzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5KTogRGVmaW5lLgotCShhb3V0X2xpbmtfaW5jbHVkZXNfbG9va3VwKTogRGVmaW5lIG1hY3JvLgotCShzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8pOiBBZGQgaW5jbHVkZXMgZmllbGQuCi0JKGFvdXRfbGlua19pbmNsdWRlc19uZXdmdW5jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogSW5pdGlhbGl6ZSBpbmNsdWRlcyBoYXNoIHRhYmxlLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IEVsaW1pbmF0ZSBkdXBsaWNhdGUgTl9CSU5DTCBlbnRyaWVzLgotCi1XZWQgRGVjIDEzIDEwOjUyOjE0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogTWF0Y2ggb24gbWlwcy0qLSogaW5zdGVhZCBvZiBtaXBzLWlkdC1lY29mZi4KLQotV2VkIERlYyAxMyAxMTowNzo0NSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IHJlbW92ZWQgZGVidWdnaW5nIGNvZGUuCi0KLVR1ZSBEZWMgMTIgMTc6NDI6MDYgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfcmVsb2MpOiBOZXcgZnVuY3Rpb24gdG8gZHVtcCB0aGUgLnJlbG9jIHNlY3Rpb24uCi0JKHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBjYWxsIHBlX3ByaW50X3JlbG9jLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiAucmVsb2Mgc2VjdGlvbiBhbGlnbm1lbnQuCi0JKiBjb2ZmLXBwYy5jIChpbl9yZWxvY19wKTogQWRkZWQgbWlzc2luZyBub24tZWxpZ2libGUgcmVsb2NzLiBTcGlmZmVkCi0JdXAgc29tZSBkZWJ1Z2dpbmcgYXMgd2VsbC4KLQotVHVlIERlYyAxMiAxMTozNDoyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEhhbmRsZSBzcGFyYy0qLWVsZiouICBGcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUKLQk8cmZnQG1vbmtleXMuY29tPi4KLQotRnJpIERlYyAgOCAxNzo0NzowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU2V0IHNlY3Rpb25fY291bnQgdG8gMAotCXdoZW4gc2V0dGluZyBzZWN0aW9ucyB0byBOVUxMLgotCi1XZWQgRGVjICA2IDE3OjA1OjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHN0cnVjdCB4Y29mZl9sb2FkZXJfaW5mbyk6IEFkZCBleHBvcnRfZGVmaW5lZHMKLQlmaWVsZC4KLQkoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEFkZCBleHBvcnRfZGVmaW5lZHMgcGFyYW1ldGVyLgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBJZiBleHBvcnRfZGVmaW5lZHMgaXMgc2V0LCBzZXQgWENPRkZfRVhQT1JUCi0JZm9yIGFsbCBzeW1ib2xzLgotCSogYmZkLWluLmggKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLU1vbiBEZWMgIDQgMTY6NDA6NDcgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogUmVtb3ZlZCBzb21lIGRlYnVnZ2luZyBwcmludGYncwotCi1Nb24gRGVjICA0IDExOjI1OjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWhleC5jIChpaGV4X3NjYW4pOiBIYW5kbGUgcmVjb3JkIHR5cGVzIDQgYW5kIDUuCi0JKGloZXhfb2JqZWN0X3ApOiBQZXJtaXQgdHlwZXMgNCBhbmQgNS4KLQkoaWhleF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFJlbW92ZSBjaGVjayBmb3Igb3V0IG9mIHJhbmdlCi0JYWRkcmVzc2VzLgotCShpaGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IEdlbmVyYXRlIHR5cGVzIDQgYW5kIDUuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IEp1c3QgaWdub3JlIHdhcm5pbmcgYW5kCi0JaW5kaXJlY3QgcmVmZXJlbmNlcyB0byBzeW1ib2xzIHdoaWNoIGRvbid0IHJlYWxseSBleGlzdC4KLQotU3VuIERlYyAgMyAxOTowMDoyNyAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IE1pbm9yIGZvcm1hdCBmaXhlcwotCShwZV9wcmludF9lZGF0YSk6IE5ldyBmdW5jdGlvbi4gVW5kZXIgcHJpdmF0ZSBwcmludGluZywgdGhpcyBmb3JtYXRzCi0JdGhlIGVkYXRhIHNlY3Rpb24gb2YgYSBQRSBmaWxlLgotCShwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQWRkZWQgY2FsbCB0byBwZV9wcmludF9lZGF0YS4KLQotU3VuIERlYyAgMyAxNjo0Njo1NCAxOTk1ICBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIGFvdXQtYXJtLmMgKE1ZX3N3YXBfc3RkX3JlbG9jX291dCk6IFVzZSBLRUVQSVQgdG8gZ2V0IHRoZSBzeW1ib2wKLQlpbmRleCwgZG9uJ3QgY2FsbCBzdG9pLgotCi1GcmkgRGVjICAxIDE0OjQ2OjUxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3JlYy5jIChzcmVjX3NjYW4pOiBTZXQgbG1hIGFzIHdlbGwgYXMgdm1hLgotCi0JKiBpaGV4LmM6IE5ldyBmaWxlOyBzdXBwb3J0IGZvciBJbnRlbCBIZXggZm9ybWF0LgotCSogdGFyZ2V0cy5jIChlbnVtIGJmZF9mbGF2b3VyKTogQWRkIGJmZF90YXJnZXRfaWhleF9mbGF2b3VyLgotCShpaGV4X3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWx3YXlzIGluY2x1ZGUgaWhleF92ZWMuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGQgaWhleF9kYXRhIGZpZWxkIHRvIHRkYXRhIHVuaW9uLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkRfTElCUyk6IEFkZCBpaGV4Lm8KLQkoQkZEX0xJQlNfQ0ZJTEVTKTogQWRkIGloZXguYy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBTb3J0IHRoZSBzZWN0aW9ucyBpbgotCWVhY2ggc2VnbWVudC4KLQkoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBSZXR1cm4gdGhlIHJpZ2h0IHNpemUgaWYgc2VnbWVudF9tYXAgaXMKLQlub3QgTlVMTC4KLQkoY29weV9wcml2YXRlX2JmZF9kYXRhKTogRG9uJ3QgYm90aGVyIHRvIHNvcnQgdGhlIHNlY3Rpb25zLgotCi0JKiBiZmQuYyAoYmZkX3JlY29yZF9waGRyKTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9yZWNvcmRfcGhkcik6IERlY2xhcmUuCi0JKiBiZmRfaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgYm9ndXMKLQlCRkRfQVNTRVJULgotCi0JKiBsaWJiZmQuYyAoYmZkX21hbGxvYywgYmZkX3JlYWxsb2MpOiBOZXcgZnVuY3Rpb25zLgotCShiZmRfem1hbGxvYyk6IFJldHVybiBQVFIsIG5vdCBjaGFyICouICBUYWtlIHNpemVfdCwgbm90Ci0JYmZkX3NpemVfdHlwZS4KLQkqIGxpYmJmZC1pbi5oIChiZmRfbWFsbG9jLCBiZmRfcmVhbGxvYyk6IERlY2xhcmUuCi0JKGJmZF96bWFsbG9jKTogQ2hhbmdlIGRlY2xhcmF0aW9uLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBNYW55IGZpbGVzOiBVc2UgYmZkX21hbGxvYyBhbmQgYmZkX3JlYWxsb2MgcmF0aGVyIHRoYW4gbWFsbG9jCi0JYW5kIHJlYWxsb2MuICBEb24ndCBzZXQgYmZkX2Vycm9yX25vX21lbW9yeSBpZiB0aGV5IGZhaWwuCi0KLVRodSBOb3YgMzAgMTk6MzI6MjYgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmM6IEFkZGVkIG1hY3JvcyB0byB0aWR5IHVwIHRvYyBjZWxsIHRyZWF0bWVudC4gTnVtZXJvdXMKLQl1c2VzIGFzIHdlbGwuIEFkZGVkIGEgbmV3IGhvd3RvIHRvIGRlYWwgd2l0aCBUT0NSRUwxNiByZWxvY3MgdGhhdAotCWFyZSBUT0NERUZOIGFzIHdlbGwuCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBFeHBhbmRlZCB0cmVhdG1lbnQgb2YgQUREUjMyTkIgcmVsb2NzCi0JdG8gaGFuZGxlIFJWQSByZWxvY3MgZnJvbSBkbGx0b29sLgotCShwcGNfY29mZl9ydHlwZTJob3d0byk6IFRPQ0RFRk4gcmVsb2MgYWRkaXRpb24uCi0JKGNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvKTogVE9DREVGTiByZWxvYyBhZGRpdGlvbi4KLQkocHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBUT0NERUZOIHJlbG9jIGFkZGl0aW9uLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IGNoZWNrIGlkYXRhJFggc2VjdGlvbnMKLQl0byBnZXQgdGhlIHJpZ2h0IHNlY3Rpb24gYWxpZ25tZW50LgotCi1UaHUgTm92IDMwIDE2OjQ4OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBEb24ndCBzZXQgbG1hIGJhc2VkIG9uCi0JcF9wYWRkciBpZiBwX3BhZGRyIGlzIHplcm8uCi0JKG1ha2VfbWFwcGluZyk6IFNldCBpbmNsdWRlc19maWxlaGRyIGFuZCBpbmNsdWRlc19waGRycyBmb3IgZmlyc3QKLQlQVF9MT0FEIHNlZ21lbnQuCi0JKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IFNldCBpbmNsdWRlc19waGRycyBmb3IgUFRfUEhEUgotCXNlZ21lbnQuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBIYW5kbGUgaW5jbHVkZXNfZmlsZWhkciBhbmQKLQlpbmNsdWRlc19waGRycy4gIFJlbW92ZSBzcGVjaWFsIGhhbmRsaW5nIG9mIFBUX1BIRFIgYW5kIGZpcnN0Ci0JUFRfTE9BRCBzZWdtZW50cy4KLQkoY29weV9wcml2YXRlX2JmZF9kYXRhKTogU2V0IGluY2x1ZGVzX2ZpbGVoZHIgYW5kIGluY2x1ZGVzX3BoZHIKLQl3aGVuIGFwcHJvcHJpYXRlLiAgUmVtb3ZlIHNwZWNpYWwgaGFuZGxpbmcgb2YgUFRfUEhEUiBzZWdtZW50LgotCVVzZSBhIG1vcmUgY29tcGxleCBjb25kaXRpb24gZm9yIHdoZW4gYSBzZWN0aW9uIGlzIGluY2x1ZGVkIGluIGEKLQlzZWdtZW50IHRvIGhhbmRsZSBTb2xhcmlzIGxpbmtlciBvZGRpdGllcy4KLQotVGh1IE5vdiAzMCAxMToxNzozMyAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogY29mZi1tODhrLmMgKGhvd3RvX3RhYmxlKTogUmVmb3JtYXR0ZWQgZm9yIGVhc2llciByZWFkaW5nOwotCXNwZWNpYWxfZnVuY3Rpb24gbm93IHBvaW50cyB0byBuZXcgZnVuY3Rpb24gbTg4a19zcGVjaWFsX3JlbG9jLgotCShob3d0b19odnJ0MTYpOiBGdW5jdGlvbiBwcmV2aW91c2x5IHVzZWQgZm9yIGhhbmRsaW5nIEhWUlQxNiByZWxvY3MKLQlyZW1vdmVkLgotCShydHlwZTJob3d0byk6IERvIG5vdCBhZGQgcmVsb2MncyByX29mZnNldCB0byB0aGUgYWRkZW5kLCB0aGlzIHdpbGwKLQliZSBkb25lIGNvcnJlY3RseSBieSBtODhrX3NwZWNpYWxfcmVsb2MuCi0JKHJlbG9jX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb24gdG8gYmUgdXNlZCBieSBSRUxPQ19QUk9DRVNTSU5HLgotCShSRUxPQ19QUk9DRVNTSU5HKTogRGVmaW5lIHRvIGNhbGwgcmVsb2NfcHJvY2Vzc2luZy4KLQotV2VkIE5vdiAyOSAxMjo0MjozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBDYWxsIG1hbGxvYyByYXRoZXIgdGhhbiB4bWFsbG9jLgotCShwZV9wcmludF9wZGF0YSk6IExpa2V3aXNlLgotCi0JKiBvcG5jbHMuYyAoYmZkX2FsbG9jX2J5X3NpemVfdCk6IFNldCBiZmRfZXJyb3Jfbm9fbWVtb3J5IGlmCi0Jb2JzdGFja19hbGxvYyBmYWlscy4KLQkoYmZkX2FsbG9jX2ZpbmlzaCk6IFNldCBiZmRfZXJyb3Jfbm9fbWVtb3J5IGlmIG9ic3RhY2tfZmluaXNoCi0JZmFpbHMuCi0JKiBsaWJiZmQuYyAoYmZkX3ptYWxsb2MpOiBTZXQgYmZkX2Vycm9yX25vX21lbW9yeSBpZiBtYWxsb2MgZmFpbHMuCi0JKiBNYW55IGZpbGVzOiBkb24ndCBzZXQgYmZkX2Vycm9yX25vX21lbW9yeSBpZiBvbmUgb2YgdGhlIGFib3ZlCi0Jcm91dGluZXMgZmFpbHMuCi0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogRG9uJ3QgYWRqdXN0IHBfcGFkZHIKLQlpZiBwX3BhZGRyX3ZhbGlkIGlzIHNldC4KLQkoY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoX2JmZF9lbGZfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IENhbGwgY29weV9wcml2YXRlX2JmZF9kYXRhLgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEZpeCBjYXNlIHdoZXJlIGV4dHJhCi0JcHJvZ3JhbSBoZWFkZXJzIHdlcmUgYWxsb2NhdGVkLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERlY2xhcmUuCi0JKiBlbGZ4eC10YXJnZXQuaCAoYmZkX2VsZk5OX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lIHRvCi0JX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YS4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9zd2FwX3JlbG9jX2luKTogRG9uJ3QgYWJvcnQgaWYKLQlyX3N5bW5keCBpcyBSRUxPQ19TRUNUSU9OX05PTkUgZm9yIGFuIEFMUEhBX1JfSUdOT1JFIHJlbG9jLgotCUNoYW5nZSBhIFJFTE9DX1NFQ1RJT05fTElUQSBzeW1uZHggdG8gUkVMT0NfU0VDVElPTl9BQlMuCi0JKGFscGhhX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogQ2hhbmdlIFJFTE9DX1NFQ1RJT05fQUJTIHRvCi0JUkVMT0NfU0VDVElPTl9MSVRBIGZvciBBTFBIQV9SX0lHTk9SRS4KLQkoYWxwaGFfYWRqdXN0X3JlbG9jX291dCk6IEZvciBBTFBIQV9SX0lHTk9SRSwgZG9uJ3QgY2hhbmdlCi0JUkVMT0NfU0VDVElPTl9BQlMgdG8gUkVMT0NfU0VDVElPTl9OT05FLgotCi1UdWUgTm92IDI4IDE2OjU5OjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBzZWdtZW50X21hcCBmaWVsZC4KLQkqIGVsZi5jIChtYWtlX21hcHBpbmcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfc29ydF9zZWN0aW9ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IFJlbW92ZS4KLQkoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBSZW1vdmUgc29ydGVkX2hkcnMsIGNvdW50LCBhbmQKLQltYXhwYWdlc2l6ZSBwYXJhbWV0ZXJzLiAgU2ltcGxpZnkuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogV2hlbiBnZW5lcmF0aW5nIGFuCi0JZXhlY3V0YWJsZSwgdXNlIGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMuCi0JKGVsZl9zb3J0X2hkcnMpOiBSZW1vdmUuCi0JKF9iZmRfZWxmX3NpemVvZl9oZWFkZXJzKTogUmVtb3ZlIGVsaW1pbmF0ZWQgcGFyYW1ldGVycyBmcm9tIGNhbGwKLQl0byBnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZS4KLQotTW9uIE5vdiAyNyAxMjoyNzo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGhwMzAwaHB1eC5jIChNWShjYWxsYmFjaykpOiBTZXQgbG1hIGFzIHdlbGwgYXMgdm1hLgotCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mIDIuNy4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkpOiBTZXQgY29ycmVjdGx5LCB0byAxLgotCSogZWxmMzItc3BhcmMuYyAoZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5KTogU2V0IGNvcnJlY3RseSwgdG8gMC4KLQotV2VkIE5vdiAyMiAxMjowMjowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IEhhbmRsZSAucmNvbnN0IHNlY3Rpb24uCi0JKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzKTogTGlrZXdpc2UuCi0JKF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiBIYW5kbGUgU1RZUF9SQ09OU1QuCi0JKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IEhhbmRsZSBzY1JDb25zdC4KLQkoZWNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBIYW5kbGUgUkVMT0NfU0VDVElPTl9SQ09OU1QuCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEhhbmRsZSAucmNvbnN0IHNlY3Rpb24uCi0JKF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogSGFuZGxlIHNjUkNvbnN0LgotCShlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBMaWtld2lzZS4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IEhhbmRsZSAucmNvbnN0IHNlY3Rpb24uCi0JKGVjb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IEhhbmRsZSBzY1JDb25zdC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyk6IEhhbmRsZSAucmNvbnN0Ci0Jc2VjdGlvbi4KLQkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBSRUxPQ19TRUNUSU9OX1JDT05TVC4KLQotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IE9ubHkgc2V0IHdyaXR0ZW4gaWYgdGhlCi0JREVGX0RZTkFNSUMgZmxhZyBpcyBzZXQuCi0KLVR1ZSBOb3YgMjEgMTM6MjU6MjkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGhvc3QtYW91dC5jOiBJZiBUUkFEX0hFQURFUiBpcyBkZWZpbmVkLCBpbmNsdWRlIGl0LgotCi1UdWUgTm92IDIxIDEzOjAzOjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCAoQUNfUFJPR19DQyk6IFJlbW92ZSBsb2NhbCBkZWZpbml0aW9uLgotCShCRkRfQklOQVJZX0ZPUEVOKTogUmVxdWlyZSBBQ19DQU5PTklDQUxfU1lTVEVNLgotCShCRkRfTkVFRF9ERUNMQVJBVElPTik6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEJGRF9ORUVEX0RFQ0xBUkFUSU9OLgotCSogYWNjb25maWcuaDogUHV0IE5FRURfREVDTEFSQVRJT05fKiBpbiBAVE9QQCBzZWN0aW9uLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjYuCi0KLQkqIHhjb2ZmbGluay5jIChiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2xlYXIKLQlzcGVjaWFsX3NlY3Rpb25zIGJlZm9yZSByZXR1cm5pbmcgd2hlbiBjYWxsZWQgd2l0aCBhIG5vbiBYQ09GRgotCUJGRC4KLQotCSogY29mZmdlbi5jIChjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBTb3J0IGNvbW1vbiBzeW1ib2xzIHdpdGgKLQlnbG9iYWwgc3ltYm9scy4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBPbmx5IHBhZCB0aGUKLQlwcmV2aW91cyBzZWN0aW9uIHRvIGZvcmNlIGZpbGUgYWxpZ25tZW50IHdoZW4gY3JlYXRpbmcgYW4KLQlleGVjdXRhYmxlLgotCi1Nb24gTm92IDIwIDE0OjU0OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZgotCVJTNjAwMENPRkZfQywgc2V0IHVwIHRoZSAuZGVidWcgc2VjdGlvbi4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogQWRqdXN0IHRoZSBUT0MgYW5jaG9yIHZhbHVlCi0JaWYgaXQgaXMgbm90IGxhcmdlIGVub3VnaCB0byBhY2NvbW9kYXRlIHRoZSBlbnRpcmUgVE9DIGFyZWEgd2l0aAotCXNpZ25lZCAxNiBiaXQgb2Zmc2V0cy4KLQkoeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IEhhbmRsZSBuZWdhdGl2ZSBUT0Mgb2Zmc2V0cyBpbiBnbG9iYWwKLQlsaW5rYWdlIGNvZGUuCi0JKF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGp1c3QgcmVsb2NhdGlvbnMgYWdhaW5zdCBhCi0JVE9DIGFuY2hvciB0byB1c2UgdGhlIFRPQyB2YWx1ZSB1c2VkIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotU2F0IE5vdiAxOCAxODowMTo0MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzKTogQ2FzdCBtYWxsb2MgcmV0dXJuLgotCShfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBMaWtld2lzZS4KLQotU2F0IE5vdiAxOCAxOTo0MzowNCAxOTk1ICBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIHBlLWFybS5jOiBGaXggdHlwb3MuCi0JKiBjb2ZmLWFybS5jOiBMaWtld2lzZS4KLQotRnJpIE5vdiAxNyAxNjoyMjowNCAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAobGlzdF9lbGUpOiBBZGRlZCAiY2F0ImVnb3J5IG1lbWJlci4KLQkocmVjb3JkX3RvYyk6IE5ldyBjYXRlZ29yeSBwYXJhbWV0ZXIgKHByaXYgb3IgcHViKS4KLQkocHBjX3JlY29yZF90b2NfZW50cnkpOiBDaGVjayB0byBzZWUgaWYgdG9jIGJvdW5kcyBleGNlZWRlZC4KLQkocHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBSZW1vdmVkIGVtYnJpb25pYyBkYXRhLWluLXRvYyBmcm9tCi0JdGhlIG1haW5saW5lLiBJdCBhZGRlcyBleHRyYSB0b2MgY2VsbHMgaW4gZXJyb3IuCi0JKHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2spOiBBZGRlZCBzb21lIGRvY3VtZW50YXRpb24uCi0JKGR1bXBfdG9jKTogQ2FuIG5vdyBkaWFnbm9zZSAidmlydHVhbCB0b2MiIGNoaWNhbmVyeS4KLQotRnJpIE5vdiAxNyAxMDo0MToyNSAxOTk1ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQ2hhbmdlIHR5cGUgb2YKLQlkeW5zeW1jb3VudCBhbmQgYnVja2V0Y291bnQgZmllbGRzIGZyb20gc2l6ZV90IHRvIGJmZF9zaXplX3R5cGUuCi0KLUZyaSBOb3YgMTcgMTA6MDI6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2spOiBJOTYwIHZlcnNpb246IGRvbid0Ci0JcG9pbnRlcml6ZSBDX0xFQUZTVEFUIG9yIENfTEVBRkVYVCBlbnRyaWVzLgotCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogT25seSBjcmVhdGUKLQlEVF9JTklUIGFuZCBEVF9GSU5JIGVudHJpZXMgaWYgdGhlIF9pbml0IG9yIF9maW5pIHN5bWJvbCBpcwotCWRlZmluZWQgb3IgbWVudGlvbmVkIGluIGEgcmVndWxhciBmaWxlLgotCi1UaHUgTm92IDE2IDE1OjE2OjQyIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChwcGNfcmVjb3JkX2RhdGFfaW5fdG9jX2VudHJ5KTogbmV3IGZ1bmN0aW9uCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgVE9DREVGTiBhdHRyaWJ1dGUKLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IENvcnJlY3QgUkVMMjQgaGFuZGxpbmcKLQkocHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBDb3JyZWN0IFRPQ0RFRk4gaGFuZGxpbmcKLQotCSogcGVpY29kZS5oIChkaXJfbmFtZXMpOiBBZGRlZCBuYW1lIGRlc2NyaXB0aW9ucwotCi1UaHUgTm92IDE2IDAzOjM4OjAzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBWRVJTSU9OOiBVcGRhdGVkIHRvIGN5Z251cy0yLjYuCi0KLVdlZCBOb3YgMTUgMTk6MzA6MDcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAobTY4azRrbmV0YnNkX3ZlYyk6IERlY2xhcmUuCi0KLVdlZCBOb3YgMTUgMTg6MDU6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBDaGFuZ2UgdHlwZSBvZiBzZWNvbmQgYXJndW1lbnQgdG8KLQlfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgZnJvbSB2b2lkICogdG8gUFRSLgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IENhc3QKLQl1c2luZyBQVFIgcmF0aGVyIHRoYW4gdm9pZCAqLgotCSogYmZkLWluMiwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBDaGFuZ2UgdmZpbGUgZnJvbSB2b2lkICoKLQl0byBQVFIuCi0JKiBlbGZ4eC10YXJnZXQuaCAoYmZkX2VsZk5OX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lIGFzCi0JX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIHJhdGhlciB0aGFuIGNhc3RpbmcKLQliZmRfdHJ1ZS4KLQotV2VkIE5vdiAxNSAwNDowOToxNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKC5kZXAxKTogRml4IHN0dXBpZCB0eXBvIGluIGxhc3QgY2hhbmdlLiAgUmVtb3ZlIGFueQotCSJETyBOT1QgREVMRVRFIiBsaW5lcyBvciBibGFuayBsaW5lcyB0aGF0IG1rZGVwIHdyaXRlcyBvbiBzb21lCi0Jc3lzdGVtcy4KLQkoQkZEX0xJQlNfQ0ZJTEVTLCBBTExfTUFDSElORVNfQ0ZJTEVTLCBCRkQzMl9CQUNLRU5EU19DRklMRVMsCi0JQkZENjRfQkFDS0VORFNfQ0ZJTEVTKTogTmV3IHZhcmlhYmxlcy4KLQkoQ0ZJTEVTKTogVXNlIHRoZW0uCi0KLVR1ZSBOb3YgMTQgMTE6NTI6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IEZvciBQUEMgUEUsIHN0YXJ0IGlzaXplIGF0IDAsCi0Jbm90IGF0IHRoZSBmaWxlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBzZWN0aW9uLgotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBdm9pZCB1c2luZwotCXVucG9ydGFibGUgI2VsaWYuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogV2hlbiBnZW5lcmF0aW5nIGEgUFBDIFBFIGV4ZWN1dGFibGUKLQl3aXRoIG5vIHN5bWJvbHMsIHJvdW5kIHVwIHRoZSBmaWxlIHNpemUgdG8gYSBDT0ZGX1BBR0VfU0laRQotCWJvdW5kYXJ5LgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scywKLQlkb24ndCB3cml0ZSBvdXQgYSBzdHJpbmcgdGFibGUuCi0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBXaGVuIHVzaW5nIGEgZGlmZmVyZW50IHNlY3Rpb24KLQloZWFkZXIsIHBhc3MgdGhlIG5ldyBvbmUgdG8gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkci4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBEb24ndCBzZXQgc2hfaW5mbyBhbmQgc2hfZW50c2l6ZSBmaWVsZHMuCi0JKGVsZl9tYXBfc3ltYm9scyk6IEFkZCBzZWN0aW9uIFZNQSB0byBzeW1ib2wgdmFsdWUgd2hlbiBjb21wYXJpbmcKLQlhZ2FpbnN0IDAuCi0JKF9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IE9ubHkgYnVpbGQgc3ltYm9sIHRhYmxlCi0JaWYgdGhlcmUgYXJlIHNvbWUgc3ltYm9scy4gIFNldCBmaWxlIG9mZnNldCBvZiBzeW10YWIgYW5kIHN0cnRhYgotCXNlY3Rpb25zLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFJlbW92ZSBkb3N5bXMgcGFyYW1ldGVyLgotCUNoYW5nZSBhbGwgY2FsbGVycy4gIE5ldmVyIHNldCBmaWxlIG9mZnNldCBvZiBzeW10YWIgYW5kIHN0cnRhYgotCXNlY3Rpb25zLgotCShfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogTmV3IGZ1bmN0aW9uLgotCShNQVBfT05FU1lNVEFCLCBNQVBfRFlOU1lNVEFCLCBNQVBfU1RSVEFCLCBNQVBfU0hTVFJUQUIpOiBEZWZpbmUuCi0JKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQkoc3dhcF9vdXRfc3ltcyk6IENoZWNrIGZvciBzcGVjaWFsIG1hcHBpbmcgb2Ygc3Rfc2huZHggY3JlYXRlZCBieQotCWNvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YS4KLQkqIGVsZnh4LXRhcmdldC5oOiBVc2UgbmV3IGNvcHkgcm91dGluZXMuCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBEZWNsYXJlLgotCi0JKiBjb25maWcuYmZkIChzaC0qLSopOiBTZXQgdGFyZ19kZWZ2ZWMgdG8gc2hjb2ZmX3ZlYy4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBDT0ZGX1dJVEhfUEUsIGhhbmRsZQotCUNfTlRfV0VBSy4KLQotCSogY29mZi1zaC5jIChzaGxjb2ZmX3ZlYyk6IFVzZSBfYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBub3QKLQlfYmZkX2R1bW15X3RhcmdldCwgbWF0Y2hpbmcgdGhlIHJlY2VudCBjaGFuZ2UgdG8gYXJjaGl2ZQotCXJlY29nbml0aW9uLgotCi1Nb24gTm92IDEzIDEzOjI0OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmMgKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBVc2UgY2FzdHMgdG8gYXZvaWQgZG9pbmcKLQlhcml0aG1ldGljIG9uIFBUUiB0eXBlcy4KLQotCSogYW91dC10YXJnZXQuaCAoTVkoY2FsbGJhY2spKTogU2V0IHRoZSBsbWEgb2YgdGhlIHNlY3Rpb25zLgotCi0JKiBlY29mZi5jIChlY29mZl9yZWxvY19saW5rX29yZGVyKTogVHVybiBhIHJlbG9jIGFnYWluc3QgYSBkZWZpbmVkCi0Jc3ltYm9sIGludG8gYSByZWxvYyBhZ2FpbnN0IHRoZSBzZWN0aW9uLgotCi1Nb24gTm92IDEzIDA3OjMxOjM1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChwcGNfY29mZl9saW5rX2hhc2hfZW50cnkpOiBhZGRlZCBzdXBwb3J0IGZvciBpbmxpbmUKLQlnbHVlIGZvciB0aGUgcmVsb2NzOiBJTUdMVUUgYW5kIElGR0xVRS4KLQkocmVjb3JkX3RvYyk6IG5ldyBmdW5jdGlvbiAtIHRyYWNrcyB0b2MgY29udGVudHMKLQkocHBjX21hcmtfc3ltYm9sX2FzX2dsdWUpOiBuZXcgZnVuY3Rpb24gLSBzdXBwb3J0cyB0aGUgSU1HTFVFIHJlbG9jCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGRlZCBzdXBwb3J0IGFuZCBmaXhlcyBmb3IgSU1HTFVFL0lGR0xVRQotCShwcGNfY29mZl9ydHlwZTJob3d0byk6IHJlbW92ZWQgaW52YWxpZCBJTUdMVUUgaGFjawotCShjb2ZmX3BwY19ydHlwZV90b19ob3d0byk6IHJlbW92ZWQgaW52YWxpZCBJTUdMVUUgaGFjawotCShwcGNfcmVjb3JkX3RvY19lbnRyeSk6IFJlbW92ZWQgYSBkZWJ1ZyBkZWZpbmUgKGR1aCkKLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IEZpeGVkIGludmFsaWQgc3RyY21wIGZvciAiLnJlbGRhdGEiCi0JKHBlX3ByaW50X2lkYXRhKTogTmV3IGZ1bmN0aW9uIC0gZm9ybWF0cyB0aGUgaWRhdGEgc2VjdGlvbiBkYXRhCi0JKHBlX3ByaW50X3BkYXRhKTogTmV3IGZ1bmN0aW9uIC0gZm9ybWF0cyB0aGUgcGRhdGEgc2VjdGlvbiBkYXRhCi0JKHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBjYWxscyB0byBhYm92ZQotCi1TdW4gTm92IDEyIDEyOjIzOjI0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJmZF9saWJzX2hlcmUsIGV0Yyk6IFByb3ZpZGUgZW1wdHkgZGVmaW5pdGlvbnMuCi0JKiBjb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX3ZlYyk6IEFkZCBjb25kaXRpb25hbCBkZWZpbmVzCi0JVEFSR0VUX1NZTSBhbmQgVEFSR0VUX05BTUUgZm9yIHZlY3RvciBhbmQgQkZEIG5hbWUuCi0JKiBjb2ZmLXBtYWMuYyAocG1hY194Y29mZl92ZWMpOiBSZW1vdmUuCi0JKFRBUkdFVF9TWU0sIFRBUkdFVF9OQU1FKTogRGVmaW5lLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spIFtQT1dFUk1BQ106IFNldCB0aGUKLQltYWNoaW5lIHRvIDAsIG5vdCBhbGwgUG93ZXJNYWNzIGFyZSA2MDFzLgotCi1GcmkgTm92IDEwIDEyOjEwOjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBSZWFkIGluIGFueSBwcm9ncmFtIGhlYWRlcnMuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IEFkanVzdCBzZWN0aW9uIGxtYQotCWJhc2VkIG9uIHRoZSBwcm9ncmFtIGhlYWRlcnMsIGlmIGFueS4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBTZXQgc2hfYWRkciBmcm9tIHRoZSB2bWEsIG5vdCB0aGUgbG1hLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IFNldCBwX3BhZGRyIG9mIHByb2dyYW0gaGVhZGVycyBiYXNlZCBvbgotCXRoZSBsbWEuCi0KLVRodSBOb3YgIDkgMTM6MDE6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6IFByZXNlcnZlIHRkYXRhIGluIGNhc2Ugb2YKLQlmYWlsdXJlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBSZXBvcnQgYSByZWFzb25hYmxlIGVycm9yIHdoZW4KLQl0cnlpbmcgdG8gZG8gYSByZWxvY2F0ZWFibGUgbGluayB3aXRoIGEgbm9uLWEub3V0IG9iamVjdCBmaWxlLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6IENoZWNrIHRoZSBmaXJzdCBvYmplY3QgZmlsZQotCWluIGFuIGFyY2hpdmUgZXZlbiBpZiB0YXJnZXRfZGVmYXVsdGVkIGlzIHNldC4gIElmIHRoZSBvYmplY3QgZmlsZQotCWhhcyB0aGUgd3JvbmcgeHZlYywgcmVqZWN0IGl0LgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpKTogSWYgYSBzZWN0aW9uIGNhbiBub3QKLQliZSByZXByZXNlbnRlZCwgcmVwb3J0IHRoZSBuYW1lIHZpYSBfYmZkX2Vycm9yX2hhbmRsZXIuCi0JKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBMaWtld2lzZS4KLQkqIG9hc3lzLmMgKG9hc3lzX3dyaXRlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogV3JpdGUgUlM2MDAwQ09GRl9DIHZlcnNpb24KLQl3aGljaCBjaGVja3MgZm9yIFNUWVBfT1ZSRkxPIHNlY3Rpb25zLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIFJTNjAwMENPRkZfQywgaGFuZGxlCi0JcmVsb2MgYW5kIGxpbmVubyBjb3VudCBvdmVyZmxvd3MuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2FsbCBjb2ZmX2NvdW50X2xpbmVudW1iZXJzIGJlZm9yZQotCWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLiAgSWYgUlM2MDAwQ09GRl9DLCBoYW5kbGUKLQlyZWxvYyBhbmQgbGluZW5vIGNvdW50IG92ZXJmbG93cy4KLQkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogQ291bnQgbGluZSBudW1iZXJzIGFuZAotCXJlbG9jcyBiZWZvcmUgZGVhbGluZyB3aXRoIC5wYWQgc2VjdGlvbnMuICBDb3VudCBvdmVyZmxvdyBzZWN0aW9uCi0JaGVhZGVycyB3aGVuIGhhbmRsaW5nIC5wYWQgc2VjdGlvbnMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IGEub3V0IHZzdGFtcCB0byAxCi0JaWYgUlM2MDAwQ09GRl9DLgotCi0JKiB4Y29mZmxpbmsuYyAoWENPRkZfREVTQ1JJUFRPUik6IERlZmluZS4KLQkoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBkZXNjcmlwdG9yX3NlY3Rpb24gYW5kCi0Jc3BlY2lhbF9zZWN0aW9ucyBmaWVsZHMuCi0JKF9iZmRfeGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBTZXQgbGlua2FnZSBzZWN0aW9uIGFsaWdubWVudC4gIENyZWF0ZQotCWRlc2NyaXB0b3Igc2VjdGlvbi4gIENoZWNrIGZvciBtYWdpYyBzeW1ib2wgbmFtZXMgKF90ZXh0LCBldGMuKSwKLQlhbmQgcmVjb3JkIHRoZW0gaW4gc3BlY2lhbF9zZWN0aW9ucyBpZiBmb3VuZC4gIFNldAotCVhDT0ZGX0RFU0NSSVBUT1IgZmxhZyBmb3IgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLCBhbmQgc2V0IGl0cwotCWRlc2NyaXB0b3IgZmllbGQgdG8gcG9pbnQgYmFjayB0byB0aGUgZnVuY3Rpb24gY29kZSBzeW1ib2wuCi0JKHhjb2ZmX3N3ZWVwKTogQWx3YXlzIG1hcmsgdGhlIHNwZWNpYWwgZGVzY3JpcHRvcl9zZWN0aW9uLgotCShiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCk6IENoZWNrIHdoZXRoZXIgdGhlIHN5bWJvbCBtaWdodCBiZSBhCi0JZnVuY3Rpb24gZGVzY3JpcHRvciwgYW5kIG1hcmsgaXQgaWYgaXQgaXMuCi0JKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGQgbmV3IHNwZWNpYWxfc2VjdGlvbnMKLQlwYXJhbWV0ZXIsIGFuZCBmaWxsIGl0IGluLiAgQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBkZXNjcmlwdG9yCi0Jc2VjdGlvbi4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogU2V0IFhDT0ZGX0RFRl9SRUdVTEFSIGZsYWcgd2hlbiBkZWZpbmluZwotCWdsb2JhbCBsaW5rYWdlIGNvZGUuICBJZiBhbiB1bmRlZmluZWQgZnVuY3Rpb24gZGVzY3JpcHRvciBpcwotCWV4cG9ydGVkLCBhcnJhbmdlIHRvIGRlZmluZSBpdC4gIFdhcm4gYWJvdXQgYW55IG90aGVyIHVuZGVmaW5lZAotCWV4cG9ydGVkIHN5bWJvbC4KLQkoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IFdyaXRlIG91dCB0aGUgZGVzY3JpcHRvciBzZWN0aW9uLgotCSh4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sKTogQ3JlYXRlIGEgZnVuY3Rpb24gZGVzY3JpcHRvciB3aGVuCi0JbmVjZXNzYXJ5LgotCSogYmZkLWluLmggKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLVRodSBOb3YgIDkgMDg6NDA6MjMgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IG5ldyB0eXBlcyBmb3IgaGFzaGluZwotCShwcGNfY29mZl9saW5rX2hhc2hfdGFibGUpOiBuZXcgdHlwZXMgZm9yIGhhc2hpbmcKLQkocHBjX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBoYXNoIGVudHJ5IGNvbnN0cnVjdG9yCi0JKHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogaGFzaCB0YWJsZSBpbml0aWFsaXplcgotCShwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogaGFzaCB0YWJsZSBjb25zdHJ1Y3RvcgotCShwcGNfcmVjb3JkX3RvY19lbnRyeSk6IGNoYW5nZWQgcmVmZXJlbmNlcyB0byBoYXNoIHRhYmxlCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBjaGFuZ2VkIHJlZmVyZW5jZXMgdG8gaGFzaCB0YWJsZQotCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfbGlua19oYXNoX2VudHJ5KTogcmVtb3ZlZCB0b2Nfb2Zmc2V0Ci0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQKLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogcmVtb3ZlZCB0b2Nfb2Zmc2V0IGluaXQKLQkoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogcmVtb3ZlZCB0b2Nfb2Zmc2V0IGluaXQKLQotVGh1IE5vdiAgOSAwNDowMDozOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKC5kZXAxKTogTWFrZSBzdXJlIHRoZSBmaWxlIG1rZGVwIGlzIHRvIHdyaXRlIGV4aXN0cwotCWZpcnN0LgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIG5ldyBvcHRpb24gLS13aXRoW291dF0tbW1hcC4gIFNldCBVU0VfTU1BUAotCWlmIGl0IGlzIGdpdmVuIGFuZCBtbWVwIGlzIGF2YWlsYWJsZS4KLQkqIGFjY29uZmlnLmg6IFVuZGVmIFVTRV9NTUFQLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlZ2VuZXJhdGVkLgotCSogYW91dHguaDogSWYgVVNFX01NQVAgaXMgbm90IGRlZmluZWQsIGRvIGFsbCBzeW1ib2wgYW5kIHN0cmluZwotCXRhYmxlIGhhbmRsaW5nIHRoZSBvbGQgd2F5LgotCShhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzKTogRG9uJ3QgY29tcGxhaW4gaWYgbGFzdCBieXRlIG9mIHN0cmluZwotCXRhYmxlIGlzIG5vbnplcm8uCi0JKiBsaWJiZmQuYyBbSEFWRV9NQURWSVNFXTogSW5jbHVkZSBzeXMvdHlwZXMuaCBhbmQgc3lzL21tYW4uaC4KLQkoYmZkX2ZyZWVfd2luZG93KSBbISBVU0VfTU1BUF06IERvbid0IGRlZmluZS4KLQkoYmZkX2dldF9maWxlX3dpbmRvdywKLQlfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KSBbISBVU0VfTU1BUF06IEFib3J0LgotCi1XZWQgTm92ICA4IDIwOjAzOjQ0IDE5OTUgIEVyaWMgRnJldWRlbnRoYWwgPGZyZXVkZW50aGFsQG55dS5lZHU+Ci0KLQkqIGNvZmYtYTI5ay5jIChTSUdOX0VYVEVORF9IV09SRCk6IFVzZSB+MHhmZmZmIHJhdGhlciB0aGFuCi0JMHhmZmZmMDAwMC4KLQotV2VkIE5vdiAgOCAxMTozMToxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKTogQ2hhbmdlIGhhbmRsaW5nIG9mIFJfSVJFTCByZWxvYyB0byBiZQotCWNvbXBhdGlibGUgd2l0aCBBTUQgZ2VuZXJhdGVkIENPRkYgZmlsZXMuICBUcnkgdG8gc3VwcG9ydCBib3RoIEFNRAotCWFuZCBHTlUgZm9ybWF0cyBzaW11bHRhbmVvdXNseS4KLQkoY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogbGliYmZkLmMgKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBDaGFuZ2Ugd3JpdGFibGUgcGFyYW1ldGVyIGZyb20KLQlpbnQgdG8gYm9vbGVhbjsgdXBkYXRlIGFsbCBjYWxsZXJzLiAgUGFzcyBNQVBfU0hBUkVEIGlmIG5vdAotCXdyaXRhYmxlLS1pdCdzIHJlcXVpcmVkIG9uIFNvbGFyaXMuICBDYXN0IGZwcmludGYgYXJndW1lbnQgdG8KLQlhdm9pZCB3YXJuaW5nLgotCSogYmZkLWluLmggKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBhb3V0eC5oOiBVcGRhdGUgY2FsbHMgdG8gYmZkX2dldF9maWxlX3dpbmRvdy4KLQotCSogeGNvZmZsaW5rLmMgKFhDT0ZGX0RFRl9EWU5BTUlDKTogUmVuYW1lIGZyb20gWENPRkZfUkVGX0RZTkFNSUMuCi0JQ2hhbmdlIGFsbCB1c2VzLgotCSh4Y29mZl9zd2FwX2xkaGRyX2luKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoeGNvZmZfc3dhcF9sZHN5bV9pbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHhjb2ZmX2ZpbmRfcmVsb2MpOiBIYW5kbGUgdGhlIGNhc2Ugb2YgYSBzaW5nbGUgcmVsb2MgY29ycmVjdGx5LgotCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogSWYgd2UganVzdCBjcmVhdGVkIGEgZGVzY3JpcHRvciwgcGFzcyBpdAotCXRvIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLCB0byBzYXZlIGEgaGFzaCBsb29rdXAuCi0JSGFuZGxlIFhUWV9FUi9YTUNfWE8gc3ltYm9scyBjb3JyZWN0bHkuCi0JKHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scyk6IFJld3JpdGUgdG8gcmVhZCAubG9hZGVyIHN5bWJvbHMKLQlyYXRoZXIgdGhhbiBub3JtYWwgc3ltYm9sIHRhYmxlLgotCShiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCk6IEl0J3Mgbm90IGFuIGVycm9yIGlmIHRoZSBzeW1ib2wgaXMKLQlhbHJlYWR5IGRlZmluZWQgd2l0aCB0aGUgc2FtZSBhYnNvbHV0ZSB2YWx1ZS4KLQkoeGNvZmZfbWFyayk6IFdoZW4gY29uc2lkZXJpbmcgY2FsbGVkIHN5bWJvbHMsIGNoZWNrIHdoZXRoZXIgdGhlCi0JZGVzY3JpcHRvciBpcyBmcm9tIGEgZHluYW1pYyBvYmplY3QsIHJhdGhlciB0aGFuIHRoZSBzeW1ib2wKLQlpdHNlbGYuCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IExpa2V3aXNlLgotCi0JKiBsaWJiZmQuYyAoYmZkX2dldF9maWxlX3dpbmRvdyk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLgotCUNhc3QgcmVhbGxvYyBhbmQgbWFsbG9jIHJldHVybiB2YWx1ZXMuICBJZiBtYWxsb2Mgb3IgcmVhbGxvYyBmYWlsLAotCXNldCBiZmRfZXJyb3Jfbm9fbWVtb3J5LgotCSogYmZkLWluLmggKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBDaGFuZ2UgdHlwZSB0byBib29sZWFuLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1UdWUgTm92ICA3IDExOjUzOjQ4IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChwcGNfcmVjb3JkX3RvY19lbnRyeSk6IG5ldyBmdW5jdGlvbi4KLQkoaW5fcmVsb2NfcCk6IGNoYW5nZWQgcmV0dXJuIHZhbHVlLgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogbXVjaCByZXdvcmsuCi0JKHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbik6IG5ldyBmdW5jdGlvbi4KLQkocHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBuZXcgZnVuY3Rpb24uCi0JKHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2spOiBuZXcgZnVuY3Rpb24uCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IGluaXRpYWxpemUgdG9jX29mZnNldC4KLQkoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogaW5pdGlhbGl6ZSB0b2Nfb2Zmc2V0LgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zeW1faW4pOiBBZGRlZCBjb2ZmX3N3YXBfc3ltX2luX2hvb2sKLQkoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogQWRkZWQgbW9yZSBzZWN0aW9ucyB0byB0aGUgZGF0YQotCWRpY3Rpb25hcnkgZm9yIHRoZSBwZSBmaWxlIGhlYWRlci4gQWxzbyBjaGFuZ2VkIGxpbmtlciB2ZXJzaW9uCi0JbnVtYmVyIG9uIHRoZSBwcGMgc2lkZS4KLQkoZGlyX25hbWVzKTogc21hbGwgaW1wcm92ZW1lbnRzIHRvIHRoZSBkaWN0aW9uYXJ5IHByaW50aW5nLgotCShwZV9ta29iamVjdF9ob29rKTogc2F2ZSB0aGUgZmlsZSBsZXZlbCBmbGFncy4KLQotCSogbGliY29mZi1pbi5oIChjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IGFkZGVkIHRvY19vZmZzZXQgZmllbGQKLQkocGVfdGRhdGEpOiBhZGRlZCByZWFsX2ZsYWdzIGZpZWxkCi0JKGNvZmZfdGRhdGEpOiBhZGRlZCBsb2NhbF90b2Nfc3ltX21hcCBhbmQgYWNjZXNzIG1hY3JvCi0KLQkqIGxpYmNvZmYuaCAoY29mZl9saW5rX2hhc2hfZW50cnkpOiBhZGRlZCB0b2Nfb2Zmc2V0IGZpZWxkCi0JKHBlX3RkYXRhKTogYWRkZWQgcmVhbF9mbGFncyBmaWVsZAotCShjb2ZmX3RkYXRhKTogYWRkZWQgbG9jYWxfdG9jX3N5bV9tYXAgYW5kIGFjY2VzcyBtYWNybwotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IGFkZGVkIGhvb2sgZm9yIFBFLgotCShjb2ZmX21rb2JqZWN0KTogaW5pdCBmb3IgbG9jYWxfdG9jX3N5bV9tYXAKLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBzZXQgdGhlIGludGVybmFsX2EubWFnaWMgdG8KLSAgICAgICAgSU1BR0VfTlRfT1BUSU9OQUxfSERSX01BR0lDIHdoaWNoIGFwcGVhcnMgdG8gYmUgd2hhdCBvdGhlcgotCXBwYyBjb21waWxlcnMgdXNlLgotCi1UdWUgTm92ICA3IDEzOjQ4OjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmZsaW5rLmMgKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUpOiBLZWVwIGxvb2tpbmcgdGhyb3VnaCBzdGFicwotCWVudHJpZXMgdW50aWwgYm90aCB0aGUgbGluZSBudW1iZXIgYWRkcmVzcyBhbmQgdGhlIGZ1bmN0aW9uIG5hbWUKLQlhZGRyZXNzIGFyZSB0b28gbGFyZ2UuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DSEVDS19QUk9HIHRvIGZpbmQgYW5kIGNhY2hlIEFSLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi0JKiBhY2xvY2FsLm00IChCRkRfQ0NfRk9SX0JVSUxEKTogRG9uJ3QgZGVmaW5lIENDX0ZPUl9CVUlMRCBpZiBpdAotCWlzIGRlZmluZWQgaW4gdGhlIGVudmlyb25tZW50LgotCi1UdWUgTm92ICA3IDEwOjU3OjI0IDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpOiBEZWZpbmUgdG8gdXNlCi0JZ2VuZXJpYyB2ZXJzaW9uLgotCi1Nb24gTm92ICA2IDE3OjEzOjE1IDE5OTUgIEhhcnJ5IERvbGFuICA8ZG9sYW5Ac3NkLmludGVsLmNvbT4KLQotCSogY29mZi1pODYwLmM6IE5ldyBmaWxlLCBiYXNlZCBvbiBjb2ZmLWkzODYuYy4KLQkqIGNwdS1pODYwLmM6IE5ldyBmaWxlLCBiYXNlZCBvbiBjcHUtaTM4Ni5jLgotCSogaG9zdHMvaTg2MG1hY2gzLmg6IE5ldyBmaWxlLCBiYXNlZCBvbiBob3N0cy9pMzg2bWFjaDMuaC4KLQkqIGNvbmZpZy5iZmQgKGk4NjAtKi1tYWNoMyosIGk4NjAtKi1vc2YxKiwgaTg2MC0qLWNvZmYqKTogTmV3Ci0JdGFyZ2V0cywgdXNpbmcgaTg2MGNvZmZfdmVjLgotCSogY29uZmlndXJlLmluIChpODYwLSotbWFjaDMqLCBpODYwLSotb3NmMSopOiBOZXcgaG9zdHMsIHVzaW5nCi0JdHJhZC1jb3JlLm8gYW5kIGhvc3RzL2k4NjBtYWNoMy5oLgotCShpODYwY29mZl92ZWMpOiBVc2UgY29mZi1pODYwLm8gYW5kIGNvZmZsaW5rLm8uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtaTg2MC5vLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLWk4NjAuby4KLQkoQ0ZJTEVTKTogQWRkIGNwdS1pODYwLmMgYW5kIGNvZmYtaTg2MC5jLgotCSogdGFyZ2V0cy5jIChpODYwY29mZl92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCAmaTg2MGNvZmZfdmVjLgotCSogYXJjaHVyZXMuYyAoYmZkX2k4NjBfYXJjaCk6IERlY2xhcmUuCi0JKGJmZF9hcmNodXJlc19saXN0KTogQWRkICZiZmRfaTg2MF9hcmNoLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBIYW5kbGUgSTg2MCBtYWdpYyBudW1iZXIuCi0JKGNvZmZfc2V0X2ZsYWdzKTogSGFuZGxlIGJmZF9hcmNoX2k4NjAuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSGFuZGxlIEk4NjAgYS5vdXQgbWFnaWMgbnVtYmVyLgotCi1Nb24gTm92ICA2IDE0OjM0OjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBTZXQgdGhlIGFsaWdubWVudCBwb3dlciBvZgotCXRoZSBjcmVhdGVkIC50YyBzZWN0aW9uIHRvIDIuCi0JKHhjb2ZmX21hcmspOiBEb24ndCBrZWVwIGEgLmxvYWRlciByZWxvYyBmb3IgYSBjYWxsIHRvIGFuCi0JdW5kZWZpbmVkIHN5bWJvbCB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgZ2VuZXJhdGUKLQlnbG9iYWwgbGlua2FnZSBjb2RlIGZvciBhIGNhbGwgdG8gYW4gdW5kZWZpbmVkIHN5bWJvbC4KLQotU3VuIE5vdiAgNSAyMTo0NDoxMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IFJlYnVpbGQgbGlzdCBmcm9tIEJGRF9MSUJTLCBBTExfTUFDSElORVMsCi0JQkZEMzJfQkFDS0VORFMsIEJGRDY0X0JBQ0tFTkRTLgotCSguZGVwMSk6IFB1dCBta2RlcCBvdXRwdXQgaW4gYSBzZXBhcmF0ZSBmaWxlLgotCVJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3NsdXJwX2FybWFwKTogQ2FzdCBfYmZkX3JlYWRfYXJfaGRyIHJldHVybgotCXZhbHVlLgotCi0JUGVybWl0IHVzZSBvZiBtbWFwIHdoZW4gYXZhaWxhYmxlOgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBtbWFwLCBtYWR2aXNlLCBtcHJvdGVjdC4KLQkqIGNvbmZpZy5pbiwgY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotCSogbGliYmZkLmMgKHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCk6IERlZmluZSB0eXBlLgotCShiZmRfaW5pdF93aW5kb3csIGJmZF9mcmVlX3dpbmRvdywgYmZkX2dldF9maWxlX3dpbmRvdyk6IE5ldwotCWZ1bmN0aW9ucy4KLQkob2tfdG9fbWFwKTogTmV3IHN0YXRpYyB2YXJpYWJsZSBmb3IgZGVidWdnaW5nLgotCShfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF93aW5kb3dfaW50ZXJuYWwpOiBEZWNsYXJlIHR5cGUuCi0JKGJmZF93aW5kb3cpOiBEZWZpbmUgdHlwZS4KLQkoYmZkX2luaXRfd2luZG93LCBiZmRfZnJlZV93aW5kb3csIGJmZF9nZXRfZmlsZV93aW5kb3cpOiBEZWNsYXJlLgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpOgotCURlY2xhcmUuCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogQWRkIHR3byB3aW5kb3cgZmllbGRzLgotCShvYmpfYW91dF9zeW1fd2luZG93LCBvYmpfYW91dF9zdHJpbmdfd2luZG93KTogTmV3IG1hY3Jvcy4KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6IEluaXRpYWxpemUgd2luZG93cy4KLQkoYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IEdldCBzeW1ib2wgZGF0YSBhbmQgc3RyaW5ncyBpbgotCXdpbmRvd3MgaW5zdGVhZCBvZiBleHBsaWNpdGx5IGFsbG9jYXRlZCBidWZmZXJzLgotCShzbHVycF9zeW1ib2xfdGFibGUpOiBGcmVlIHdpbmRvdyBpbnN0ZWFkIG9mIG1lbW9yeS4KLQkoYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBSZWxlYXNlIHdpbmRvd3MgaW5zdGVhZCBvZiBmcmVlaW5nIHN0b3JhZ2UKLQlkaXJlY3RseS4KLQkoYW91dF9saW5rX2ZyZWVfc3ltYm9scyk6IERpdHRvLgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGQgbmV3IGZpZWxkIGZvcgotCWdldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdy4KLQkoQkZEX0pVTVBfVEFCTEVfR0VORVJJQyk6IFVwZGF0ZWQuCi0JKiBhb3V0LWFkb2JlLmMsIGFvdXQtdGFyZ2V0LmgsIGJpbmFyeS5jLCBib3V0LmMsIGNvZmYtYWxwaGEuYywKLQljb2ZmLW1pcHMuYywgZWxmeHgtdGFyZ2V0LmgsIGkzODZtc2Rvcy5jLCBpMzg2b3M5ay5jLCBpZWVlLmMsCi0JbGliY29mZi1pbi5oLCBvYXN5cy5jLCBzcmVjLmMsIHRla2hleC5jLCB2ZXJzYWRvcy5jOiBBZGRlZCBuZXcKLQltYWNyb3MgZm9yIGdldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBmaWVsZC4KLQotU2F0IE5vdiAgNCAxMjoyMzoyNiAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29yZS5jOiBSZW5hbWVkIHRvIGNvcmVmaWxlLmMKLQkqIG1ha2VmaWxlLmRvcyAoT0JKUyk6IENoYW5nZSBjb3JlLm8gdG8gY29yZWZpbGUubwotCSogTWFrZWZpbGUuaW4gKENGSUxFUywgQkZEX0xJQlMpOiBVc2UgY29yZWZpbGUuYyBpbnN0ZWFkIG9mIGNvcmUuYwotCi1GcmkgTm92ICAzIDE1OjU0OjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBSZW5hbWUgbG9jYWwgdmFyaWFibGUgc3ViCi0JdG8gby4gIENsb2JiZXIgYW5kIHJlc3RvcmUgdGhlIGxpc3Qgb2YgbmV3IGNzZWN0cyBhcm91bmQgdGhlIGNhbGwKLQl0byBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCwgaW4gY2FzZSBpdCB3YW50cyB0byByZXBvcnQgYQotCWxpbmtlciBlcnJvciBhbmQgdGhlIGxpbmtlciB3YW50cyB0byByZWFkIHRoZSBzeW1ib2wgdGFibGUuICBSZXNldAotCXRoZSBsaW5lIG51bWJlciBjb3VudCBvZiBhIHJlYWwgc2VjdGlvbiBldmVuIGlmIGl0IGhhcyBubyByZWxvY3MuCi0JKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBJZiBzaGFyZWQsIHNldCB0aGUgRFlOQU1JQyBmbGFnLgotCi0JKiBjb2ZmZ2VuLmMgKF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSk6IFdhcm4gaWYgdGhlIHN0cmluZyBzaXplCi0JaXMgdG9vIHNtYWxsLgotCi1UaHUgTm92ICAyIDIzOjE2OjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCB3YXJuIGFib3V0Ci0JYW4gdW5kZWZpbmVkIHN5bWJvbCBpbiBhIHNoYXJlZCBsaW5rLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBDb3JyZWN0IHR5cGUgb2YKLQlvbGR0eXBlIGZyb20gYmZkX2xpbmtfb3JkZXJfdHlwZSB0byBiZmRfbGlua19oYXNoX3R5cGUuICBGcm9tCi0JcGhkbUBpbmZvLnVjbC5hYy5iZSAoUGhpbGlwcGUgRGUgTXV5dGVyKS4KLQotV2VkIE5vdiAgMSAxNDoyNjowMiAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogY29mZi1tODhrLmMgKHJ0eXBlMmhvd3RvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoUlRZUEUySE9XVE8pOiBVc2UgaXQgcmF0aGVyIHRoYW4gYSBtYWNybyBkZWZpbml0aW9uLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IHNldCBpbnRlcm5hbF9hLm1hZ2ljCi0JdG8gUEFHRU1BR0lDUEVYRUNQQUdFRCAjaWYgZGVmaW5lZCAoTTY4KSAmJiAhZGVmaW5lZCAoTFlOWE9TKS4KLQotCSogY29uZmlndXJlLmluOiBtNjgqLW1vdG9yb2xhLXN5c3YqIGRvZXMgbm90IHVzZSBwdHJhY2UtY29yZS5vOwotCWRlZmluZSBUUkFEX0hFQURFUiB0byBuZXcgZmlsZSBob3N0cy9kZWx0YTY4LmguCi0JbTg4Ki1tb3Rvcm9sYS1zeXN2KiwgaG93ZXZlciwgZG9lcyB1c2UgcHRyYWNlLWNvcmUuby4KLQkqIGhvc3RzL2RlbHRhNjguaDogTmV3IGZpbGUuCi0KLQkqIHB0cmFjZS1jb3JlLmMgKHB0cmFjZV91bml4X2NvcmVfZmlsZV9wKTogY2hhbmdlIGJmZF96bWFsbG9jIHRvCi0JYmZkX3phbGxvYzsgcHJvdmlkZSBwcm9wZXIgcGFybSBhYmZkIHRvIGNhbGxzIHRvIGJmZF96YWxsb2MuCi0KLVdlZCBOb3YgIDEgMTM6NTE6NTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGkzODZsaW51eC5jIChNWSh2ZWMpKTogRGVjbGFyZSBiZWZvcmUgdXNlLgotCi1XZWQgTm92ICAxIDExOjQ1OjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6Ci0JUGFzcyBpbnB1dF9iZmQsIG5vdCBpbl9iZmQsIHRvIGJmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMuCi0KLQkqIGVsZi5jIChiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSk6IERvbid0IGRvIGFueXRoaW5nIGlmIHRoZQotCUJGRCBpcyBub3Qgb2YgdGhlIHJpZ2h0IHR5cGUuCi0JKGJmZF9lbGZfZ2V0X25lZWRlZF9saXN0KTogTGlrZXdpc2UuCi0JKiBpMzg2bGludXguYyAoYmZkX2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdCk6IExpa2V3aXNlLgotCSogeGNvZmZsaW5rLmMgKFhDT0ZGX1hWRUNQKTogRGVmaW5lLgotCShiZmRfeGNvZmZfbGlua19yZWNvcmRfc2V0KTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIEJGRCBpcyBub3QKLQlvZiB0aGUgcmlnaHQgdHlwZS4KLQkoYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wpOiBMaWtld2lzZS4KLQkoYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wpOiBMaWtld2lzZS4KLQkoYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MpOiBMaWtld2lzZS4KLQkoYmZkX3hjb2ZmX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBMaWtld2lzZS4KLQkoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBzdW5vcy5jIChzdW5vc19zY2FuX2V4dF9yZWxvY3MpOiBPbmx5IGNoZWNrIHRoZSByZWxvYyBzeW1ib2wKLQl0YWJsZSBpbmRleCBhZ2FpbnN0IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBmb3IgYSBiYXNlIHJlbGF0aXZlCi0JcmVsb2MuCi0KLQkqIGNvZmYtcnM2MDAwLmMgKF9iZmRfeGNvZmZfc2l6ZW9mX2hlYWRlcnMpOiBDaGFuZ2UgZnJvbSBtYWNybyB0bwotCXN0YXRpYyBmdW5jdGlvbi4KLQkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogU2V0Ci0JZnVsbF9hb3V0aGRyIGZsYWcgaGVyZS4uLgotCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogLi4ubm90IGhlcmUuCi0KLVR1ZSBPY3QgMzEgMTI6NTI6MDIgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGxpYmVsZi5oOiAgUmVuYW1lIHRvIGVsZi1iZmQuaCB0byBhdm9pZCBjb25mbGljdCB3aXRoCi0Jc3lzdGVtcyB0aGF0IGhhdmUgYSBzeXN0ZW0gPGxpYmVsZi5oPi4KLQkqIE1ha2VmaWxlLmluOiBHbG9iYWxseSByZXBsYWNlIGxpYmVsZi5oIHdpdGggZWxmLWJmZC5oLgotCSogYmZkLmMsIGVsZi5jLCBlbGYzMi1hcmMuYywgZWxmMzItZ2VuLmMsIGVsZjMyLWhwcGEuYywKLQllbGYzMi1ocHBhLmgsIGVsZjMyLWkzODYuYywgZWxmMzItaTg2MC5jLCBlbGYzMi1tNjhrLmMsCi0JZWxmMzItbTg4ay5jLCBlbGYzMi1taXBzLmMsIGVsZjMyLXBwYy5jLCBlbGYzMi1zcGFyYy5jLAotCWVsZjY0LWdlbi5jLCBlbGY2NC1zcGFyYy5jLCBlbGZjb2RlLmgsIGVsZmxpbmsuYywKLQllbGZ4eC10YXJnZXQuaDogSW5jbHVkZSBlbGYtYmZkLmggcmF0aGVyIHRoYW4gbGliZWxmLmguCi0JKiBlbGZ4eC10YXJnZXQuaDogQ2hhbmdlIGxpYmVsZi5oIHJlZmVyZW5jZSB0byBlbGYtYmZkLmguCi0KLVR1ZSBPY3QgMzEgMTU6MzA6MDcgMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogQWRkIG5ldyBwYXJhbWV0ZXIgd2Vhay4gIElmCi0Jc2V0LCBzZXQgQlNGX1dFQUsgaW4gc3ltYm9sLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShlY29mZl9nZXRfZXh0cik6IFNldCB3ZWFrZXh0IGJhc2VkIG9uIEJTRl9XRUFLLgotCShlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBJZiB3ZWFrZXh0IGlzIHNldCwgcGFzcyBCU0ZfV0VBSyB0bwotCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgotCShlY29mZl9pbmRpcmVjdF9saW5rX29yZGVyKTogQ2hlY2sgdGhhdCB0aGUgc2VjdGlvbiB0ZGF0YSByZWxvY3MKLQlhcmUgbm90IE5VTEwgYmVmb3JlIHVzaW5nIHRoZW0uCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEqLSotbGludXgqKTogU2V0IENPUkVGSUxFIHRvIHRyYWQtY29yZS5vIGFuZAotCWRlZmluZSBUUkFEX0hFQURFUiBhcyBob3N0cy9hbHBoYWxpbnV4LmguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBob3N0cy9hbHBoYWxpbnV4Lmg6IE5ldyBmaWxlLgotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IENhc3QgdS51X2FyMCB0byBiZmRfdm1hLAotCW5vdCBpbnQuCi0KLVR1ZSBPY3QgMzEgMTI6MzQ6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEFjY2VwdCBDX0JDT01NIGFuZAotCUNfRUNPTU0gc3RvcmFnZSBjbGFzc2VzLgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbWFya19zeW1ib2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0Ci0Jb2YgeGNvZmZfbWFyay4KLQkoeGNvZmZfbWFyayk6IENhbGwgeGNvZmZfbWFya19zeW1ib2wuCi0JKGJmZF94Y29mZl9leHBvcnRfc3ltYm9sKTogQ2FsbCB4Y29mZl9tYXJrX3N5bWJvbC4KLQkoYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MpOiBDYWxsIHhjb2ZmX21hcmtfc3ltYm9sIHJhdGhlciB0aGFuCi0JZG9pbmcgaXQgYnkgaGFuZC4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogQnVpbGQgYSAubG9hZGVyIHN5bWJvbCBmb3IgYW4gZXhwb3J0IHN5bWJvbC4KLQotTW9uIE9jdCAzMCAxNDo1Mzo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jIChzdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvKTogQWRkIG5ldyBsaW5lX2ZpbGVwb3MKLQlmaWVsZC4KLQkoeGNvZmZfZmluZF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBVc2UgaXQuCi0JKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBTZXQgZmluZm8ubGluZV9maWxlcG9zLgotCSh4Y29mZl9saW5rX2lucHV0X2JmZCk6IEhhbmRsZSBDX0JJTkNMIGFuZCBDX0VJTkNMLiAgRG9uJ3QKLQlyZWxvY2F0ZSB0aGUgdmFsdWUgb2YgQ19ERUNMLgotCi0JKiBlbGYuYyAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBSZW1vdmUgYm9ndXMgQkZEX0FTU0VSVC4KLQotU2F0IE9jdCAyOCAwMToyNTozNCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogTWFrZQotCWNhbGxiYWNrIGRlY2lkZSB3aGF0IGdvZXMgaW4gLnJlbG9jcy4KLQkqIHBlW2ldLWkzODYuYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBEZWZpbmUuCi0JKiBwZWljb2RlLmggKHBlX21rb2JqZWN0X2hvb2spOiBPbmx5IGNvcHkgYW91dGhkciBpZgotCXRoZXJlIGlzIG9uZS4KLQotU2F0IE9jdCAyOCAwMTo1MTowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogSGFuZGxlIGNzZWN0cyBpbiB0aGUKLQlhYnNvbHV0ZSBzZWN0aW9uLgotCi1GcmkgT2N0IDI3IDE4OjE0OjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmM6IE1vcmUgaW1wcm92ZW1lbnRzLCBtb3N0bHkgdG8gZml4IGhhbmRsaW5nIG9mCi0JY29uc3RydWN0b3JzIGFuZCBhIGZldyBvdGhlciBzcGVjaWFsIGNhc2VzLgotCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl92ZWMpOiBTZXQgc3ltYm9sX2xlYWRpbmdfY2hhciBiYWNrIHRvCi0JemVybywgcmV2ZXJ0aW5nIHllc3RlcmRheSdzIGNoYW5nZS4KLQkqIGJmZC1pbi5oIChiZmRfeGNvZmZfbGlua19yZWNvcmRfc2V0KTogRGVjbGFyZS4KLQkoYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MpOiBEZWNsYXJlLgotCShiZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLUZyaSBPY3QgMjcgMTQ6NDI6MTUgMTk5NSAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BhcHBsaS5zZT4KLQotCSogUE9SVElORywgYW91dC1hcm0uYywgYW91dC1lbmNhcC5jLCBhb3V0LXRhcmdldC5oLAotCWFvdXR4LmgsIGdlbi1hb3V0LmMsIGhvc3QtYW91dC5jLCBocDMwMGJzZC5jLCBpMzg2YW91dC5jCi0JaTM4NmJzZC5jLCBpMzg2ZHluaXguYywgaTM4NmxpbnV4LmMsIGkzODZseW54LmMsIGkzODZtYWNoMy5jLAotCWkzODZuZXRic2QuYywgbTY4a2x5bnguYywgbTg4a21hY2gzLmMsIG1pcHNic2QuYywgbmV3c29zMy5jLAotCW5zMzJrbmV0YnNkLmMsIHBjNTMyLW1hY2guYywgcmlzY2l4LmMsIHNwYXJjbHlueC5jLCBzcGFyY25ldGJzZC5jOgotCUNoYW5nZSBQQUdFX1NJWkUgdG8gVEFSR0VUX1BBR0VfU0laRS4KLQotCSogbTY4a25ldGJzZC5jOiBEaXR0byBhcyB3ZWxsIGFzIGFkZCBzdXBwb3J0IGZvciB0aGUgbTY4azRrIG9iamVjdAotCWZvcm1hdC4KLQotCSogbmV0YnNkLmg6IERvdWJsZSBkaXR0byAoaW5jbC4gbTY4azRrIHN1cHBvcnQpLiAgTmV0QlNEJ3MgdGV4dAotCXNlZ21lbnRzIGluY2x1ZGVzIHRoZSBhLm91dCBoZWFkZXIuICBTZWUgdG8gdGhhdCB0aGUgbWFnaWMgbnVtYmVyCi0JKmFsd2F5cyogaXMgYmlnLWVuZGlhbi4KLQotCSogY29uZmlnLmJmZDogQWRkIG02OCotaHAqLW5ldGJzZCogY2FzZS4gIENyb3NzLXBvbGxpbmF0ZSBtNjhrIGFuZAotCW02OGs0ayBOZXRCU0QgY29uZmlndXJhdGlvbnMuCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlOiBTZXBhcmF0ZSBpMzg2ICYgbWlwcyBOZXRCU0QKLQljb25maWd1cmF0aW9ucyBmcm9tIG90aGVyIEJTRCBvbmVzLiAgRG9uJ3QgYXNzdW1lIERFQyBpcyB0aGUgb25seQotCXRoaW5nIE5ldEJTRC9taXBzIHJ1biBvbi4gIEFkZCB7bTY4ayxuczMyayxzcGFyY30tKi1uZXRic2QqCi0JY29uZmlndXJhdGlvbnMuICBBZGQgc3VwcG9ydCBmb3IgbTY4azRrIE5ldEJTRCBvYmplY3QgZm9ybWF0LgotCi0JKiBsaWJhb3V0Lmg6IEFkZGVkIE1fNjhLNEtfTkVUQlNEIG1hZ2ljLgotCi0JKiBtNjhrNGtuZXRic2QuYzogTmV3IGZpbGUuCi0KLQkqIGhvc3RzL3ttNjhrLHNwYXJjfW5ic2QuaDogRG9uJ3QgZGVmaW5lIEhPU1RfQklHX0VORElBTl9QLgotCi0JKiBob3N0cy9uYnNkLmg6IERlZmluZSBIT1NUX0JJR19FTkRJQU5fUCBhY2NvcmRpbmcgdG8KLQk8bWFjaGluZS9lbmRpYW4uaD4uCi0KLQkqIGhvc3RzL21pcHNuYnNkLmg6IE5ldyBmaWxlLgotCi1UaHUgT2N0IDI2IDE0OjE2OjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmM6IE51bWVyb3VzIGNoYW5nZXMgdG8gZ2V0IGNsb3NlciB0byBhIHdvcmtpbmcgWENPRkYKLQlsaW5rZXIuCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCB4Y29mZl90ZGF0YSk6IEFkZCBmdWxsX2FvdXRoZHIsCi0JdG9jX3NlY3Rpb24sIGFuZCBlbnRyeV9zZWN0aW9uIGZpZWxkcy4KLQkoc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEpOiBSZW1vdmUgbGRyZWxfY291bnQgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBJbml0aWFsaXplIG5ldyB4Y29mZl9kYXRhCi0JZmllbGRzLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIFJTNjAwMENPRkZfQywgZ2VuZXJhdGUKLQlmdWxsIGEub3V0IGhlYWRlciBpZiBmdWxsX2FvdXRoZHIgaXMgc2V0IGluIHhjb2ZmX2RhdGEuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuICBTZXQgb19zbmVudHJ5IGFuZCBvX3NudG9jCi0JYmFzZWQgb24gc2VjdGlvbnMgc3RvcmVkIGluIHhjb2ZmX2RhdGEuCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDb3B5IG5ldyB4Y29mZl9kYXRhCi0JZmllbGRzLgotCSh4Y29mZl9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfQ1RPUi4KLQkocnM2MDAwY29mZl92ZWMpOiBTZXQgc3ltYm9sX2xlYWRpbmdfY2hhciB0byAnLicuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X3N5bWJvbF9pbmZvKTogSWYgZml4X3ZhbHVlIGlzIHNldCwgZml4IHRoZQotCXZhbHVlIHN0b3JlZCBpbiByZXQgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGEgcG9pbnRlciB2YWx1ZS4KLQotV2VkIE9jdCAyNSAyMzoxMDozOSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGN7LGxlfS17ZWxmLHN5c3Y0LGVhYmksc29sYXJpczJ9KTogUmVtb3ZlIE1BQwotCWZvcm1hdCBmb3Igbm93LgotCi1XZWQgT2N0IDI1IDE2OjE5OjI3IDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9zbHVycF9zdHJpbmdfdGFibGUpOiBBbGxvY2F0ZSB0aGUgc3RyaW5ncyB3aXRoIG1hbGxvYwotCXNpbmNlIHRoZXkncmUgZnJlZSdkIGJ5IGZyZWVfY2FjaGVkX2luZm8uCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBTaW1pbGFybHkgZm9yIHRoZSBzeW1ib2wgdGFibGUuCi0KLVdlZCBPY3QgMjUgMTQ6NTk6MjIgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0c3R1ZmYpOiAgRG9uJ3QgbWFrZSBoZWFkZXJzLgotCi1XZWQgT2N0IDI1IDExOjMyOjU0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBzdW5vcy5jIChiZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IERvbid0IGRvIGFueXRoaW5nIGlmCi0Jb3V0cHV0X2JmZCBpcyBub3QgU3VuT1MuCi0JKGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4gIERvbid0IHNjYW4gcmVsb2NzIG9mCi0Jbm9uLVN1bk9TIGlucHV0IGZpbGVzLgotCi0JKiB4Y29mZmxpbmsuYzogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gc3VwcG9ydCBsaW5raW5nIHNoYXJlZCBvYmplY3RzCi0JYW5kIGdlbmVyYXRpbmcgYSAubG9hZGVyIHNlY3Rpb24uCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCB4Y29mZl90ZGF0YSk6IEFkZCBpbXBvcnRfZmlsZV9pZCBmaWVsZC4KLQkoc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEpOiBBZGQgbGluZW5vX2NvdW50LCBmaXJzdF9zeW1uZHgsCi0JbGFzdF9zeW1uZHgsIGFuZCBsZHJlbF9jb3VudCBmaWVsZHMuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9ob3d0b190YWJsZSk6IENvcnJlY3QgcmVsb2MgbmFtZXMuCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IERvbid0IHNldCBhbnkgZmxhZ3MgaWYgU1RZUF9QQUQKLQlpcyBzZXQuCi0JKiBiZmQtaW4uaCAoYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wpOiBEZWNsYXJlLgotCShiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCk6IERlY2xhcmUuCi0JKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1UdWUgT2N0IDI0IDE3OjQ0OjIwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgeGNvZmZsaW5rLm8gdG8gcG1hY194Y29mZl92ZWMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBtcHctY29uZmlnLmluOiBBZGQgeGNvZmZsaW5rLmMubyB0byBwb3dlcnBjLWFwcGxlLW1hY29zLgotCSogY29mZi1wbWFjLmM6IEluY2x1ZGUgY29mZi1yczYwMDAuYyBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIGl0cwotCWNvbnRlbnRzLgotCShwbWFjX3hjb2ZmX3ZlYyk6IFVwZGF0ZSB0byB1c2UgbmV3IHhjb2ZmIHN1cHBvcnQuCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQpOiBNYWtlIHN0YXRpYy4KLQkoeGNvZmZfd3JpdGVfYXJtYXApOiBEZWNsYXJlIGJ1ZiBhcyB1bnNpZ25lZCBjaGFyLgotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBEZWNsYXJlIGEgbG9jYWwgYXMgUFRSLgotCi0JKiBtcHctbWFrZS5zZWQ6IEdlbmVyYWxpemUgc3ViZGlyX2RvIGVkaXQuCi0KLVR1ZSBPY3QgMjQgMTA6MjU6MDEgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhYnNkLWNvcmUuYyAobWFrZV9iZmRfYXNlY3Rpb24pOiBJbml0aWFsaXplIGFzZWN0LT5maWxlcG9zCi0JY29ycmVjdGx5LiAgRG9uJ3QgaW5pdGlhbGl6ZSBhc2VjdC0+dm1hLgotCi1GcmkgT2N0IDIwIDEzOjIzOjQ4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBvcG5jbHMuYyAoX2JmZF9uZXdfYmZkKTogSWYgX2JmZF9jaHVua3NpemUgd2Fzbid0IHByZXNldCwgdXNlCi0Jc29tZXRoaW5nIGEgbGl0dGxlIGxlc3MgdGhhbiB0aGUgcGFnZSBzaXplLgotCi1UaHUgT2N0IDE5IDEzOjA2OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9hZGp1c3Rfc3ltbmR4KTogQ2xlYXIgKmFkanVzdGVkcC4KLQotV2VkIE9jdCAxOCAxNjoyMDowOCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogTmV3LgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiAuYnNzIGlzIGJlZm9yZQotCS5kYXRhIHVzIHRoYXQgYXMgZGF0YV9zdGFydC4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBHZXQgcmVsb2MKLQljYWxjIGNvcnJlY3QuCi0JKiBwZWljb2RlLmggKGFkZF9kYXRhX2VudHJ5KTogVXNlIF9jb29rZWRfc2l6ZSBvZiBkYXRhIGRpcmVjdG9yeS4KLQkoY29mZl9zd2FwX291dGhkcl9vdXQpOiBIYXJkd2lyZSBpbiB2ZXJzaW9uIG51bWJlci4KLQotV2VkIE9jdCAxOCAxNjo1MDo1NCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IFJlbmFtZSBsb2NhbCB2YXJpYWJsZXMKLQltYWpvciBhbmQgbWlub3IgdG8gKl92bm8sIHNpbmNlIHRoZSBmb3JtZXIgYXJlIGFsc28gbWFjcm9zIGluCi0JU3VuT1MgaGVhZGVyIGZpbGVzLiAgQ2FzdCByZXN1bHQgb2YgYmZkX2FsbG9jIHRvIGFwcHJvcHJpYXRlCi0JdHlwZS4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2FzdCB1c2VkX2J5X2JmZCB2YWx1ZQotCWJlZm9yZSBhc3NpZ25pbmcgdG8gc2VjX2RhdGEuCi0KLVdlZCBPY3QgMTggMTM6MjU6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogVGhlIG9mZnNldCBhcmd1bWVudCBpcwotCW5vdyByZWxhdGl2ZSB0byB0aGUgc2VjdGlvbiwgbm90IGFic29sdXRlLgotCSogZWNvZmZsaW5rLmMgKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUpOiBVc2UgdGhlIHJpZ2h0IHN5bWJvbCB0bwotCWdldCB0aGUgZmlsZSBuYW1lIHdoZW4gdGhlcmUgaXMgYSBOX1NPIGRpcmVjdG9yeSBuYW1lLiAgV2hlbgotCWhhbmRsaW5nIHN0YWJzLCByZW1lbWJlciB0aGF0IHNlY3Rpb24tPnZtYSB3YXMgYWRkZWQgdG8gdGhlCi0Jb2Zmc2V0LgotCi1UdWUgT2N0IDE3IDE4OjI0OjU0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBuZWVkZWQgZmllbGQuCi0JKHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBDYWxsIGJmZF9yZWxlYXNlLCBub3QgZnJlZS4KLQkoc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IEluaXRpYWxpemUgbmVlZGVkIGZpZWxkLgotCShzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogUmVjb3JkIG5lZWRlZCBvYmplY3RzLgotCShiZmRfc3Vub3NfZ2V0X25lZWRlZF9saXN0KTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9zdW5vc19nZXRfbmVlZGVkX2xpc3QpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gT2N0IDE2IDE0OjQzOjU5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaCAocGVfZGF0YV90eXBlLmluX3JlbG9jX3ApOiBOZXcuCi0KLU1vbiBPY3QgMTYgMTA6NTI6NTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCAoc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0KTogUmVuYW1lIGZyb20KLQliZmRfZWxmX2xpbmtfbmVlZGVkX2xpc3QuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBlbGYuYywgZWxmbGluay5oLCBsaWJlbGYuaDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi0JQWRkIHN0YXJ0IGF0IEFJWCBsaW5rZXIgc3VwcG9ydDsgbm8gc2hhcmVkIGxpYnJhcmllcyB5ZXQuCi0JKiB4Y29mZmxpbmsuYzogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKHJzNjAwY29mZl92ZWMpOiBVc2UgeGNvZmZsaW5rLm8uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCB4Y29mZl90ZGF0YSk6IEFkZCBjc2VjdHMgYW5kIGRlYnVnX2luZGljZXMKLQlmaWVsZHMuCi0JKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhKTogRGVmaW5lLgotCSh4Y29mZl9zZWN0aW9uX2RhdGEpOiBEZWZpbmUgbWFjcm8uCi0JKF9iZmRfeGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEZWNsYXJlLgotCShfYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRGVjbGFyZS4KLQkoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IERlY2xhcmUuCi0JKF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZi1yczYwMDAuYzogQ2xlYW4gdXAgYSBiaXQuCi0JKHhjb2ZmX21rb2JqZWN0KTogRGVmYXVsdCBtb2R0eXBlIHRvIDFMLCBub3QgUkUuICBJbml0aWFsaXplCi0JY3B1dHlwZSwgY3NlY3RzLCBhbmQgZGVidWdfaW5kaWNlcy4KLQkoeGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSBjcHV0eXBlLgotCSh4Y29mZl9ob3d0b190YWJsZSk6IFJlbmFtZSBmcm9tIHJzNjAwMGNvZmZfaG93dG9fdGFibGUuCi0JKHhjb2ZmX3J0eXBlMmhvd3RvKTogUmVuYW1lIGZyb20gcnM2MDAwY29mZl9ydHlwZTJob3d0by4KLQkoeGNvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBSZW5hbWUgZnJvbQotCXJzNjAwMGNvZmZfcmVsb2NfdHlwZV9sb29rdXAuCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkoX2JmZF94Y29mZl9zaXplb2ZfaGVhZGVycyk6IERlZmluZS4KLQkoX2JmZF94Y29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRGVmaW5lLgotCShfYmZkX3hjb2ZmX2JmZF9yZWxheF9zZWN0aW9uKTogRGVmaW5lLgotCShfYmZkX3hjb2ZmX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pOiBEZWZpbmUuCi0JKHJzNjAwMGNvZmZfdmVjKTogRm9yIEJGRF9KVU1QX1RBQkxFX0xJTkssIHVzZSBfYmZkX3hjb2ZmLCBub3QKLQljb2ZmLgotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiBBSVgsCi0JaW5jcmVtZW50IHNvZmFyIGJ5IFNNQUxMX0FPVVRTWiBpZiBub3QgZXhlY3V0YWJsZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBBSVgsIGFsd2F5cyBvdXRwdXQgYW4gYS5vdXQKLQloZWFkZXI7IGlmIG5vdCBleGVjdXRhYmxlLCBoZWFkZXIgc2l6ZSBvZiBTTUFMTF9BT1VUU1ouCi0JKiBoYXNoLmMgKHN0cnVjdCBiZmRfc3RydGFiX2hhc2gpOiBBZGQgeGNvZmYgZmllbGQuCi0JKF9iZmRfc3RyaW5ndGFiX2luaXQpOiBJbml0aWFsaXplIHhjb2ZmIGZpZWxkLgotCShfYmZkX3hjb2ZmX3N0cmluZ3RhYl9pbml0KTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX3N0cmluZ3RhYl9hZGQpOiBJbiBYQ09GRiBtb2RlLCBsZWF2ZSB0d28gYnl0ZXMgZm9yIGxlbmd0aC4KLQkoX2JmZF9zdHJpbmd0YWJfZW1pdCk6IEluIFhDT0ZGIG1vZGUsIHdyaXRlIG91dCBsZW5ndGguCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF94Y29mZl9zdHJpbmd0YWJfaW5pdCk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgeGNvZmZsaW5rLm8uCi0JKENGSUxFUyk6IEFkZCB4Y29mZmxpbmsuYy4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyk6IFNldCBTRUNfQUxMT0MsIG5vdAotCVNFQ19OT19GTEFHUywgZm9yIC5hY29tbW9uIHNlY3Rpb24uICBGcm9tIFBldGVyIFNjaGF1ZXIKLQk8UGV0ZXIuU2NoYXVlckBSZWdlbnQuRS1UZWNobmlrLlRVLU11ZW5jaGVuLkRFPi4KLQotU2F0IE9jdCAxNCAyMTozNjowMiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKGluX3JlbG9jX3ApOiBBZGQsIGNsb25lIGZyb20gY29mZi1pMzg2LmMuCi0KLUZyaSBPY3QgMTMgMTc6NDg6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGFjY29uZmlnLmggKEhBVkVfU1lTX1BST0NGU19IKTogVW5kZWYsIHdpdGggY29tbWVudC4KLQkqIGNvbmZpZy5pbjogUmVnZW5lcmF0ZWQuCi0KLQkqIG9wbmNscy5jIChnZXRwYWdlc2l6ZSkgWyFIQVZFX0dFVFBBR0VTSVpFXTogRGVmaW5lIGFzIDIwNDguCi0JKF9iZmRfY2h1bmtzaXplKTogTmV3IHZhcmlhYmxlLgotCShfYmZkX25ld19iZmQpOiBTZXQgaXQgdG8gZ2V0cGFnZXNpemUoKSBpZiBuZWdhdGl2ZSwgYW5kIHVzZSBpdAotCWZvciBvYnN0YWNrIGNodW5rIHNpemUuCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBnZXRwYWdlc2l6ZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLQlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiB0cmFkLWNvcmUuYyAocmF3cHRyKTogTWFrZSBpdCBhIGxvY2FsIHZhcmlhYmxlIG9mCi0gCXB0cmFjZV91bml4X2NvcmVfZmlsZV9wLgotCi1GcmkgT2N0IDEzIDExOjIyOjAxIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGluX3JlbG9jX3ApOiBOZXcuCi0JKiBjb2ZmLWkzODYuYyAoaW5fcmVsb2NfcCk6IE5ldy4KLQkqIGNvZmZjb2RlLmg6IEFsbHdheXMgaW5jbHVkZSBwZWljb2RlLmggaWYgQ09GRl9XSVRIX1BFLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE9ubHkgc2V0IGhhc19yZWxvY19zZWN0aW9uCi0JaWYgUEVfSU1BR0UuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogQ2FsbAotCWluX3JlbG9jX3AgdG8gZGVjaWRlIGlmIHJlbG9jIHNob3VsZCBiZSBlbWl0dGVkLgotCSogbGliY29mZi5oIChwZV9kYXRhX3R5cGUuaW5fcmVsb2NfcCk6IE5ldy4KLQkqIHBlaWNvZGUuaCAocGVfbWtvYmplY3QpOiBJbml0aWFsaXplIGluX3JlbG9jX3AuCi0KLVdlZCBPY3QgMTEgMDA6NDk6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUpOiBNb3ZlIHRvIGNvZmZnZW4uYy4KLQkoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBjb2ZmZ2VuLmMgKF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSk6IENvcHkgZnJvbSBjb2ZmZ2VuLmMuCi0JKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyk6IExpa2V3aXNlLgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENvcnJlY3QgY29uZGl0aW9ucwotCXVuZGVyIHdoaWNoIHR5cGUgYW5kIHNpemUgY2hhbmdlIHdhcm5pbmdzIGFyZSBpc3N1ZWQuCi0KLVR1ZSBPY3QgMTAgMTg6MzI6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfY291bnRfbGluZW51bWJlcnMpOiBEb24ndCBjb3VudCBsaW5lIG51bWJlcnMgZm9yCi0JYSBzeW1ib2wgd2hpY2ggaXMgbm90IGluIGEgcmVhbCBzZWN0aW9uLgotCShjb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wpOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogUmVuYW1lIGZyb20KLQljb2ZmX2xpbmtfaGFzaF9uZXdmdW5jIGFuZCBtYWtlIG5vbi1zdGF0aWMuCi0JKF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCV9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlLgotCShfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IFVzZSBpdC4KLQkocHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyk6IE1ha2Ugc3RhdGljLgotCSogbGliY29mZi1pbi5oICgoX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogRGVjbGFyZS4KLQkoX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogSWYgUlM2MDAwQ09GRl9DLCBzZXQgY3B1dHlwZQotCWZpZWxkIGluIFhDT0ZGIHRkYXRhLgotCShjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IENoZWNrIGlmZGVmIFJTNjAwMENPRkZfQywgbm90IGlmZGVmCi0JVTgwMlJPTUFHSUMsIGZvciBjbGFyaXR5LiAgVHJ5IHRvIHNldCBhcmNoIGFuZCBtYWNoaW5lIGNvcnJlY3RseQotCWJhc2VkIG9uIGNwdXR5cGUgc3RvcmVkIGluIGEub3V0IGhlYWRlciwgb3IgaW4gbl90eXBlIG9mIGluaXRpYWwKLQkuZmlsZSBzeW1ib2wuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IGNwdXR5cGUgY29ycmVjdGx5IGluIGEub3V0Ci0JaGVhZGVyLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEFkZCBjYXN0cyB0byBmaWxlX3B0ciB0byBhdm9pZAotCXdhcm5pbmdzLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBTd2FwIGluIGNwdXR5cGUgZmllbGQuCi0JKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IFN3YXAgb3V0IGNwdXR5cGUgZmllbGQuICBEb24ndCBjbGVhcgotCW9sZCByZXN2MSBmaWVsZC4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IHhjb2ZmX3RkYXRhKTogQWRkIGNwdXR5cGUgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGNwdS1yczYwMDAuYyAocnM2MDAwX2NvbXBhdGlibGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfcnM2MDAwX2FyY2gpOiBVc2UgaXQuCi0JKiBjcHUtcG93ZXJwYy5jIChwb3dlcnBjX2NvbXBhdGlibGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhcmNoX2luZm9fc3RydWN0KTogRGVmaW5lIHZhcmlvdXMgZmxhdm91cnMgb2YgUG93ZXJQQy4KLQkoYmZkX3Bvd2VycGNfYXJjaCk6IFVzZSBwb3dlcnBjX2NvbXBhdGlibGUuICBQb2ludCBhdAotCWFyY2hfaW5mb19zdHJ1Y3QuCi0KLVR1ZSBPY3QgMTAgMTA6NTA6NDYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogIFJlbW92ZSBCSVNPTi4KLQotVHVlIE9jdCAxMCAwMToyODoyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3Qgd2FybiBhYm91dAotCWNoYW5naW5nIHRoZSBzaXplIG9yIHR5cGUgaWYgdGhlIG9sZCBkZWZpbml0aW9uIHdhcyB3ZWFrLgotCi1Nb24gT2N0ICA5IDExOjI0OjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29tYmluZWRfZW50cnlfdHlwZSk6IEFkZCBmaXhfbGluZSBmaWVsZC4KLQkoY29mZl9zbHVycF9saW5lX3RhYmxlKTogV2FybiBpZiB3ZSB0cnkgdG8gc2V0IHRoZSBsaW5lbm8gZmllbGQgb2YKLQlhIHN5bWJvbCB0d2ljZS4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBSUzYwMDBDT0ZGX0MsIGhhbmRsZSBDX0JJTkNMIGFuZAotCUNfRUlOQ0wgYnkgc2V0dGluZyBmaXhfbGluZS4gIEZpeCBDX0JTVEFUIHN5bWJvbCB2YWx1ZS4KLQkqIGNvZmZnZW4uYyAoY29mZl9tYW5nbGVfc3ltYm9scyk6IEhhbmRsZSBmaXhfbGluZS4KLQkoY29mZl93cml0ZV9zeW1ib2wpOiBPbmx5IHVzZSBOX0RFQlVHIGlmIHRoZSBzeW1ib2wgaXMgaW4gdGhlCi0JYWJzb2x1dGUgc2VjdGlvbi4KLQkoY29mZl9wcmludF9zeW1ib2wpOiBQcmludCBmaXhfdmFsdWUgc3ltYm9scyBpbiBhIHVzZWZ1bCBmYXNoaW9uLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCB4Y29mZl90ZGF0YSk6IERlZmluZS4KLQkoeGNvZmZfZGF0YSk6IERlZmluZS4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZCB4Y29mZl9vYmpfZGF0YSBmaWVsZCB0byB0ZGF0YSB1bmlvbi4KLQkqIGJmZC1pbjIuaCwgbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfbWtvYmplY3QpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX21rb2JqZWN0KTogRGVmaW5lLgotCSh4Y29mZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0JKHJzNjAwMGNvZmZfaG93dG9fdGFibGUpOiBDaGFuZ2UgUl9UT0MgY29tcGxhaW5fb25fb3ZlcmZsb3cgZnJvbQotCXNpZ25lZCB0byBiaXRmaWVsZC4KLQkocnM2MDAwY29mZl92ZWMpOiBBZGQgRFlOQU1JQyB0byBvYmplY3RfZmxhZ3MuCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IElmIFJTNjAwMENPRkZfQywgaGFuZGxlIC5wYWQgYW5kCi0JLmxvYWRlciBzZWN0aW9ucyBzcGVjaWFsbHkuCi0JKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IElmIFJTNjAwMENPRkZfQywgZ2V0IHRoZSAudGV4dCBhbmQgLmRhdGEKLQlzZWN0aW9uIGFsaWdubWVudCBmcm9tIHRoZSBYQ09GRiB0ZGF0YSBpbmZvcm1hdGlvbi4KLQkoY29mZl9ta29iamVjdF9ob29rKTogSWYgUlM2MDAwQ09GRl9DLCBzZXQgRFlOQU1JQyBiYXNlZCBvbgotCUZfU0hST0JKLCBhbmQgY29weSB0aGUgZXh0cmEgYS5vdXQgaGVhZGVyIGluZm9ybWF0aW9uIGludG8gdGhlCi0JWENPRkYgdGRhdGEgc3RydWN0dXJlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIFJTNjAwMENPRkZfQywgc2V0IEZfU0hST0JKLAotCUZfRFlOTE9BRCBhbmQgdGhlIGV4dHJhIGEub3V0IGhlYWRlciBpbmZvcm1hdGlvbi4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgQlNGX05PVF9BVF9FTkQgZm9yIGEgQ19FWFQgb3IKLQlDX0hJREVYVCBzeW1ib2wgd2l0aCBhdHRhY2hlZCBjc2VjdCBpbmZvcm1hdGlvbi4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hb3V0aGRyX2luKTogSWYgUlM2MDAwQ09GRl9DLCBzd2FwCi0JaW4gdGhlIG9fbWF4ZGF0YSBmaWVsZC4KLQkoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogSWYgUlM2MDAwQ09GRl9DLCBzd2FwIGV4dHJhIFhDT0ZGIGZpZWxkcy4KLQkqIGNvZmZnZW4uYyAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogRG9uJ3QgbW92ZSBhbnkgc3ltYm9sIHRvIHRoZQotCWVuZCBpZiBCU0ZfTk9UX0FUX0VORCBpcyBzZXQuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IFJlbmFtZSBfYmZkX3JlYWRfYXJfaGRyIGZpZWxkIHRvCi0JX2JmZF9yZWFkX2FyX2hkcl9mbi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX3JlYWRfYXJfaGRyKTogVXBkYXRlIGFjY29yZGluZ2x5LgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGFyY2hpdmUuYyAoX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MpOiBDYXN0IF9iZmRfcmVhZF9hcl9oZHIKLQlyZXR1cm4gdmFsdWUuCi0JKGRvX3NsdXJwX2JzZF9hcm1hcCwgZG9fc2x1cnBfY29mZl9hcm1hcCk6IExpa2V3aXNlLgotCShiZmRfc2x1cnBfYnNkX2FybWFwX2YyKTogTGlrZXdpc2UuCi0JKF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IExpa2V3aXNlLgotCi1GcmkgT2N0ICA2IDE2OjE4OjM1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2V0X25leHRfbWFwZW50KTogUmV0dXJuIEJGRF9OT19NT1JFX1NZTUJPTFMKLQl3aGVuIHRoZSBzeW1ib2wgdGFibGUgaXMgZW1wdHkuCi0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgcmVzZXJ2ZQotCXNwYWNlIGZvciBzZWN0aW9uIHN5bWJvbHMsIHNpbmNlIHdlIGRvbid0IG91dHB1dCB0aGVtIGVpdGhlci4KLQkoZWxmX202OGtfYWRqdXN0X2R5bmluZHgpOiBSZW1vdmVkLgotCi0JKiBwdHJhY2UtY29yZS5jIChyYXdwdHIpOiBNYWtlIGl0IGEgbG9jYWwgdmFyaWFibGUgb2YKLSAJcHRyYWNlX3VuaXhfY29yZV9maWxlX3AuCi0KLUZyaSBPY3QgIDYgMTI6MjQ6NDcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogUmV0dXJuIGZhbHNlLCBub3QKLQlOVUxMLgotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjeyxsZX0te2VsZixzeXN2NCxlYWJpLHNvbGFyaXMyfSk6IEFkZCBOVCwgYW5kCi0JTWFjIG9iamVjdCBmaWxlIGZvcm1hdHMuCi0KLUZyaSBPY3QgIDYgMTI6MDQ6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZml4X3N5bWJvbF9uYW1lKTogRG9uJ3QgdHJ5IHRvIHNldCB1cCBmaWxlCi0JYXV4ZW50IGlmIHRoZXJlIGlzbid0IG9uZS4KLQkoY29mZl93cml0ZV9zeW1ib2xzKTogSWYgdGhlcmUgaXMgbm8gZmlsZSBhdXhlbnQsIHVzZSBTWU1OTUxFTgotCXJhdGhlciB0aGFuIEZJTE5NTEVOIGFzIHRoZSBtYXhpbXVtIG5hbWUgbGVuZ3RoLgotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkCi0JX2JmZF9jb2ZmX3ByaW50X2F1eC4KLQkoYmZkX2NvZmZfcHJpbnRfYXV4KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9wb2ludGVyaXplX2F1eF9ob29rIChSUzYwMDBDT0ZGX0MgdmVyc2lvbikpOiBQb2ludGVyaXplIHRoZQotCXNjbmxlbiBmaWVsZCBvZiBhbiBYVFlfTEQgY3NlY3QgYXV4IGVudHJ5LgotCShjb2ZmX3ByaW50X2F1eCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3QgcG9pbnRlcml6ZSBzY25sZW4gZmllbGQ7IG5vdyBkb25lCi0JaW4gY29mZl9wb2ludGVyaXplX2F1eF9ob29rLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IENhbGwgYmZkX2NvZmZfcHJpbnRfYXV4LgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE9uIEFJWCwgY2xlYXIgRl9SRUxGTEcKLQlpZiB0aGVyZSBhcmUgc3ltYm9scywgZm9yIG5hdGl2ZSBBSVggbGQgY29tcGF0aWJpbGl0eS4KLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZAotCV9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rLgotCShjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2spOiBEZWZpbmUgYXMgYSBmdW5jdGlvbiBpZiBSUzYwMDBDT0ZGX0MKLQlvciBJOTYwLCBhbmQgYXMgMCBvdGhlcndpc2UuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcG9pbnRlcml6ZV9hdXgpOiBDaGFuZ2UgcGFyYW1ldGVycyAgdG8gdGFrZQotCXN5bWJvbCBwb2ludGVyIGluc3RlYWQgb2YgdHlwZSBhbmQgY2xhc3MsIGFuZCB0byB0YWtlIGF1eCBpbmRleC4KLQlDYWxsIF9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rIGlmIGl0IGlzIGRlZmluZWQuCi0JKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogQWx3YXlzIGNhbGwgY29mZl9wb2ludGVyaXplX2F1eC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBhbGwgZmllbGRzLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGNvZmYtcnM2MDAwLmM6IEFkZCBmdWxsIHN1cHBvcnQgZm9yIEFJWCBhcmNoaXZlcy4gIFJld3JpdGUgb2xkCi0JcmVhZC1vbmx5L2hvc3Qtb25seSBzdXBwb3J0LgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCBDX0hJREVYVCBzeW1ib2xzIHRvIGJlCi0JQlNGX0xPQ0FMLgotCShPVEhFUl9HTE9CQUxfQ0xBU1MpOiBEbyBub3QgZGVmaW5lIHRvIGJlIENfSElERVhUIGlmCi0JUlM2MDAwQ09GRl9DLgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGQgX2JmZF9yZWFkX2FyX2hkciBmaWVsZC4gIE1vZGlmeQotCUJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgYWNjb3JkaW5nbHkuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9zbmFyZl9hcl9oZHIpOiBEb24ndCBkZWNsYXJlLgotCShfYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogRGVjbGFyZS4KLQkoX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyKTogRGVjbGFyZS4KLQkoX2JmZF9yZWFkX2FyX2hkcik6IERlZmluZS4KLQkoX2JmZF9ub2FyY2hpdmVfcmVhZF9hcl9oZHIpOiBEZWZpbmUuCi0JKF9iZmRfYXJjaGl2ZV9ic2RfcmVhZF9hcl9oZHIpOiBEZWZpbmUuCi0JKF9iZmRfYXJjaGl2ZV9jb2ZmX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCSogYXJjaGl2ZS5jOiBDaGFuZ2UgYWxsIGNhbGxlcnMgb2YgX2JmZF9zbmFyZl9hcl9oZHIgdG8gY2FsbAotCV9iZmRfcmVhZF9hcl9oZHIgaW5zdGVhZC4KLQkoX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyKTogUmVuYW1lIGZyb20gX2JmZF9zbmFyZl9hcl9oZHIuCi0JKF9iZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBSZW5hbWUgZnJvbQotCWNvbXB1dGVfYW5kX3dyaXRlX2FybWFwLiAgTWFrZSBub24tc3RhdGljLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9zbHVycF9hcm1hcCk6IENhbGwgX2JmZF9yZWFkX2FyX2hkciByYXRoZXIKLQl0aGFuIF9iZmRfc25hcmZfYXJfaGRyLgotCSogYW91dC10YXJnZXQuaCAoTVlfcmVhZF9hcl9oZHIpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKiBpZWVlLmMgKGllZWVfcmVhZF9hcl9oZHIpOiBEZWZpbmUuCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCSogb2FzeXMuYyAob2FzeXNfcmVhZF9hcl9oZHIpOiBEZWZpbmUuCi0JKiBzb20uYyAoc29tX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotVGh1IE9jdCAgNSAxNDowNDowNyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmMgKGNvZmZfc3dhcF9maWxlaGRyX2luKTogSWYgc3ltcHRyIGlzCi0JemVybywgdGhlcmUgYXJlbid0IGFueSBzeW1ib2xzLCBldmVuIGlmIG5zeW1zIGlzIHNldC4KLQotVGh1IE9jdCAgNSAxMTo0NTowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmVjb2ZmLmggKHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgYWRqdXN0X2hlYWRlcnMKLQlmaWVsZC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzKTogQ2hlY2sgZm9yIHZhcmlvdXMgQWxwaGEKLQlzZWN0aW9ucywgYW5kIHNldCBzdHlwIGNvcnJlY3RseSBmb3IgdGhlbTogLmdvdCwgLmhhc2gsIC5keW5hbWljLAotCS5saWJsaXN0LCAucmVsLmR5biwgLmNvbmZsaWMsIC5keW5zdHIsIC5keW5zeW0sIC5jb21tZW50LgotCShfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogQ2hlY2sgZm9yIHZhcmlvdXMgQWxwaGEgc2VjdGlvbgotCXR5cGVzLgotCShlY29mZl9zb3J0X2hkcnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBSZXR1cm4gYm9vbGVhbiwgbm90IHZvaWQuCi0JU29ydCB0aGUgc2VjdGlvbnMgYnkgVk1BIGJlZm9yZSBsb29raW5nIHRocm91Z2ggdGhlbS4gIFB1dCB0aGUKLQlmaXJzdCBub24gU0VDX0FMTE9DIHNlY3Rpb24gb24gYSBuZXcgcGFnZS4gIFB1dCBldmVyeSBTRUNfQUxMT0MKLQlzZWN0aW9uIG9uIGFuIGFwcHJvcHJpYXRlIGJvdW5kYXJ5IHdpdGhpbiB0aGUgcGFnZS4KLQkoZWNvZmZfY29tcHV0ZV9yZWxvY19maWxlX3Bvc2l0aW9ucyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4KLQkoX2JmZF9lY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIGZvciB2YXJpb3VzIEFscGhhCi0Jc2VjdGlvbiB0eXBlcyB3aGVuIGluY3JlbWVudGluZyB0ZXh0X3NpemUgYW5kIGRhdGFfc2l6ZS4gIENhbGwKLQlhZGp1c3RfaGVhZGVycyBiYWNrZW5kIGZ1bmN0aW9uIGlmIGl0IGV4aXN0cy4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfYWRqdXN0X2hlYWRlcnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIGFkanVzdF9oZWFkZXJzIGZpZWxkLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGhvc3RzL2kzODZic2QuaDogUmVzdG9yZSBmaWxlIGluY29ycmVjdGx5IGRlbGV0ZWQgb24gU2VwIDYuCi0KLVdlZCBPY3QgIDQgMTg6MTU6MDIgMTk5NSAgSmVmZiBMYXcgIChsYXdAaHVybC5jeWdudXMuY29tKQotCi0JKiByczYwMDAtY29yZS5jIChDT1JFX1ZFUlNJT05fMSk6IFVzZSBDT1JFX1ZFUlNJT05fMSBpbnN0ZWFkCi0Jb2YgQUxURVJOQVRFX0FJWF9DT1JFX0ZPUk1BVC4KLQkqIGNvbmZpZ3VyZS5pbiAoYWl4NCk6IE5vIGxvbmdlciBuZWVkIENPUkVfRkxBR1MuCi0JKiBjb25maWd1cmU6IFVwZGF0ZWQuCi0KLVdlZCBPY3QgIDQgMTU6MzY6MzYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlOUzMyayBjaGFuZ2VzIGZyb20gSWFuIERhbGw6Ci0JKiBhb3V0eC5oIChNWV9maW5hbF9saW5rX3JlbG9jYXRlLCBNWV9yZWxvY2F0ZV9jb250ZW50cyk6IE5ldwotCW1hY3Jvcy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkLCBhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQsCi0JYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiBDYWxsIHRoZW0gaW5zdGVhZCBvZiBfYmZkXyoKLQl2ZXJzaW9ucy4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkKTogTmV3IG1hY3JvLCBkZWZhdWx0cwotCXRvIHplcm8uCi0JKGJhY2tlbmRfZGF0YSk6IFVzZSBpdCBpbnN0ZWFkIG9mIGhhcmRjb2RlZCB6ZXJvLgotCi0JKiBhb3V0LW5zMzJrLmMgKENUT1JfVEFCTEVfUkVMT0NfSE9XVE8pOiBOZXcgbWFjcm8uCi0JKE1ZX3N3YXBfc3RkX3JlbG9jX291dCk6IFVzZSB1ZGF0YS5pIGZvciBLRUVQSVQsIGRvbid0IGNhbGwgc3RvaS4KLQotCSogbnMzMmtuZXRic2QuYzogSW5jbHVkZSBiZmQuaC4KLQkoTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIsIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBtYWNyb3MuCi0JKE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlY2xhcmUgZnVuY3Rpb24gdG9vLgotCSogcGM1MzItbWFjaC5jIChzZXRfc2l6ZXMpOiBEb24ndCBkZWNsYXJlLgotCShNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciwgTVlfZXhlY19oZWFkZXJfbm90X2NvdW50ZWQpOiBEZWZpbmUuCi0JKGJhY2tlbmRfZGF0YSwgTVlfYmFja2VuZF9kYXRhKTogRG9uJ3QgZGVmaW5lLgotCi0JKiBjb25maWcuYmZkOiBUcmVhdCBuczMyay1wYzUzMi11eCogbGlrZSBuczMyay1wYzUzMi1tYWNoKiwgYW5kCi0JbnMzMmstKi1saXRlcyogbGlrZSBuczMyay0qLW5ldGJzZCouCi0KLQkqIGhvc3RzL25ic2QuaDogU3dhcCBvcmRlciBvZiBzeXMvdm1wYXJhbS5oIGFuZCBzeXMvcGFyYW0uaCwgdG8KLQljb21waWxlIG9uIGxpdGVzLgotCi1XZWQgT2N0ICA0IDE0OjE1OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZXN0b3JlIHNldHRpbmcKLQlmX3RpbWRhdCB0byAwLCBkZWxldGVkIG9uIEF1Z3VzdCAyMi4KLQotVHVlIE9jdCAgMyAxNjoyODozMiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEsCi0JY29mZl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSwKLQljb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBpZmRlZiB0byBhbGxvdyBvdmVycmlkZXMuCi0JKiBwZWljb2RlLmggKGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldwotCShwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCShjb2ZmX3N3YXBfc2NuaGRyX2luKTogU3dhcCBic3Mgc2l6ZSBpbnRvIHRoZSByaWdodCBwbGFjZS4KLQkocGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZCBzb21lIG5ld2xpbmVzLgotCi1UdWUgT2N0ICAzIDExOjUzOjA0IDE5OTUgIEplZmYgTGF3ICAobGF3QGh1cmwuY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNldHVwX3NlY3Rpb25zKTogRG9uJ3QgZGllIGlmIGEgc3BhY2UgaGFzIG5vIHN1YnNwYWNlcy4KLQotTW9uIE9jdCAgMiAxNDowODo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgbGV0IGEgd2VhawotCWR5bmFtaWMgc3ltYm9sIG92ZXJyaWRlIGEgY29tbW9uIHN5bWJvbC4gIERvbid0IGNoYW5nZSB0aGUgc2l6ZSBvcgotCXR5cGUgaWYgdGhleSBoYXZlIGJlZW4gc2V0IGFuZCB0aGUgbmV3IHN5bWJvbCBpcyBub3QgYSBkZWZpbml0aW9uLgotCVdhcm4gaWYgdGhlIHNpemUgb3IgdHlwZSBjaGFuZ2VzLgotCi1TdW4gT2N0ICAxIDAxOjM0OjQxIDE5OTUgIEplZmYgTGF3ICAobGF3QGh1cmwuY3lnbnVzLmNvbSkKLQotICAgICAgICAqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IERvbid0IHdyaXRlIHRoZSBzeW1ib2wgdGFibGUgb3IKLQlzeW1ib2wJc3RyaW5ncy4KLQkoc29tX2ZpbmlzaF93cml0aW5nKTogV3JpdGUgdGhlbSBoZXJlLiAgUGxhY2UgdGhlbSBhZnRlciB0aGUKLQlzdWJzcGFjZSBkYXRhLCBidXQgYmVmb3JlIHRoZSByZWxvY3MuCi0KLUZyaSBTZXAgMjkgMTE6MDE6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IEp1c3QgcGFzcyBmYWxzZSwgbm90Ci0JaW5mby0+c2hhcmVkX2xpYnJhcnksIHRvIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCShzdW5vc19zY2FuX2V4dF9yZWxvY3MpOiBEb24ndCB3YXJuIGFib3V0IGEgcmVsb2MgaW4gdGhlIC50ZXh0Ci0Jc2VjdGlvbi4KLQkoc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYyk6IFJlbW92ZSAudGV4dCBzZWN0aW9uIGFzc2VydGlvbi4KLQotVGh1IFNlcCAyOCAxODo0ODo0NyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBwb3dlcnBjLSotbWFjb3MqLCBwb3dlcnBjLSotbXB3Ki4KLQkqIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluOiBBZGQgcG1hY194Y29mZl92ZWMgY2FzZS4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLXBtYWMuby4KLQkqIGNvZmYtcG1hYy5jOiBOZXcgZmlsZSwgUG93ZXJNYWMgWENPRkYgc3VwcG9ydC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogQWRkIFBvd2VyTWFjIGNhc2UuCi0JKiB0YXJnZXRzLmMgKHBtYWNfeGNvZmZfdmVjKTogRGVjbGFyZS4KLQotCSogbXB3LWNvbmZpZy5pbjogVmFyaW91cyBjaGFuZ2VzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUKLQlhdXRvY29uZi1iYXNlZCBjb25maWd1cnkuCi0JKiBtcHctbWFrZS5zZWQ6IE5ldyBmaWxlLCBzZWQgY29tbWFuZHMgdG8gdHJhbnNsYXRlIFVuaXgKLQltYWtlZmlsZSBpbnRvIE1QVyBzeW50YXguCi0JKiBtcHctbWFrZS5pbjogUmVtb3ZlLgotCSogaG9zdHMvbXB3Lmg6IFJlbW92ZS4KLQkqIGJmZC1pbi5oLCBiZmQtaW4yLmg6IElmIE1QVywgaW5jbHVkZSB0aGUgZmlsZSB0aGF0IGRlZmluZXMKLQl0cnVlIGFuZCBmYWxzZSBhcyBlbnVtcywgdGhlbiBkZWZpbmUgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQuCi0KLVRodSBTZXAgMjggMTc6MDY6MjMgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9nZXRfc3ltdGFiKTogUmV0dXJuIGFuIGVtcHR5IHN0cmluZyBvbiBlcnJvci4KLQkqIG9wbmNscy5jIChiZmRfZmRwZW5yKTogQ2hhbmdlIFdJTjMyIHJlc3RyaWN0aW9uIHRvIFdJTkdEQi4KLQotVGh1IFNlcCAyOCAxNTozMDo0NCAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAbmVsbGllPgotCi0JKiBjb2ZmLXBwYy5jOiBSZWZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gZ251IGNvbnZlbnRpb25zCi0JICAgICAgICAgICAgICBSZW1vdmVkIGlycmVsZXZhbnQgImlmIDAiIGNvZGUKLQotVGh1IFNlcCAyOCAxMToxOTo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGhwMzAwaHB1eC5jIChjb252ZXJ0X3N5bV90eXBlKTogVHJlYXQgc2Vjb25kYXJ5IHN5bWJvbHMgYXMgd2VhawotCXN5bWJvbHMgcmF0aGVyIHRoYW4gYXMgaW5kaXJlY3Qgc3ltYm9scy4KLQkoTVkoc2x1cnBfc3ltYm9sX3RhYmxlKSk6IERvbid0IGRvIGFueXRoaW5nIHNwZWNpYWwgYWJvdXQKLQlzZWNvbmRhcnkgc3ltYm9scy4KLQotCSogY29mZmNvZGUuaCAoY29mZl9uZXdfc2VjdGlvbl9ob29rKTogTWFrZSBzdXJlIHRoYXQgdGhlIGFsaWdubWVudAotCW9mIC5jdG9ycyBhbmQgLmR0b3JzIHNlY3Rpb25zIGlzIG5vIGxhcmdlciB0aGFuIDIuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogRG9uJ3QgY2hhbmdlCi0JYmZkX2xpbmtfaGFzaF9jb21tb24gdG8gYmZkX2xpbmtfaGFzaF9uZXcsIHNpbmNlIGl0IG1heSBiZSBvbiB0aGUKLQl1bmRlZiBsaXN0LgotCShiZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IERvbid0IHB1dCBfX0RZTkFNSUMgaW4gdGhlCi0JZHluYW1pYyBzeW1ib2xzIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogSGFuZGxlIHJlbG9jcyBjb3JyZWN0bHkgd2hlbiBjcmVhdGluZyBhCi0Jc2hhcmVkIGxpYnJhcnkuCi0JKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBEb24ndCBtYXJrIHRoZSBfX0RZTkFNSUMgc3ltYm9sIGFzCi0Jd3JpdHRlbiBldmVuIGlmIGl0IGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QuCi0JKHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sKTogVXNlIHBsdF9vZmZzZXQgZm9yIHRoZSBhZGRyZXNzIG9mCi0JdGhlIGp1bXAgdGFibGUgcmVsb2MuICBBZGQgYW4gYXNzZXJ0aW9uLiAgVXNlIFJFTE9DX0pNUF9TTE9UCi0JcmF0aGVyIHRoYW4gdGhlIGNvbnN0YW50IDIyLgotCShzdW5vc19jaGVja19keW5hbWljX3JlbG9jKTogSGFuZGxlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKHN1bm9zX2ZpbmlzaF9keW5hbWljX2xpbmspOiBTZXQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBHT1QgdG8KLQl6ZXJvIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IElmIHRoZXJlIGlzIGEgc3ltYm9sIF9fRFlOQU1JQywKLQl3cml0ZSBpdCBvdXQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzeW1ib2wgdGFibGUuCi0KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLWFybS5vLgotCi1UaHUgU2VwIDI4IDAwOjU4OjA1IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIGFybS0qLWNvZmYuCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZTogQWRkIGFybWNvZmZfe2xpdHRsZSxiaWd9X3ZlYy4KLQkqIHRhcmdldHMuYyAoYXJtY29mZl97bGl0dGxlLGJpZ31fdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgYXJtY29mZl97bGl0dGxlLGJpZ31fdmVjLgotCSogY29mZi1hcm0uYyAoYXJtY29mZl97bGl0dGxlLGJpZ31fdmVjKTogQWx3YXlzIGRlZmluZS4KLQotV2VkIFNlcCAyNyAxMDozNzoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAoYmZkX2ZpbmRfdGFyZ2V0KTogUmVtb3ZlIGRlYnVnZ2luZyBjb2RlLgotCi1XZWQgU2VwIDI3IDA3OjIzOjM5IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BuZWxsaWU+Ci0KLQkqIGNvZmYtcHBjLmMsIHBlLXBwYy5jLCBwZWktcHBjLmM6IEluaXRpYWwgYmZkIGZvciBjb2ZmL1BFCi0gICAgICAgIHN1cHBvcnQgb24gcG93ZXJwYy4KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCAqLXBwYyBmaWxlcwotCSogY29mZmNvZGUuaDogcHBjIE1BR0lDLCBhbmQgdXNlIHBlaWNvZGUuaCByYXRoZXIgdGhhbiBjb2Zmc3dhcC5oIHRvCi0gICAgICAgIGFsbG93IHBlIGJhc2VkIC5vJ3MgdG8gYmUgc2hhcmVkIHdpdGggb3RoZXIgdG9vbHMgb24gcHBjL05UCi0JKiBjb25maWcuYmZkOiBhZGRlZCBwb3dlcnBjW2xlXS1bcGV8d2lubnRdIGNvbmZpZyBzdXBwb3J0Ci0JKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjogYWRkZWQgYmZkX3Bvd2VycGNbbGVdX3BlW2ldX3ZlYwotCSogcGVpY29kZS5oOiBBZGRlZCBtb3JlIHNlY3Rpb24gZmxhZ3MgZm9yIFBFIG9uIHBwYwotCSAgICAgICAgICAgICBBZGRlZCBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgdG8gYWxsb3cgcGVpY29kZS5oIHRvIGJlCi0JCSAgICAgdXNlZCBmb3Igbm9uLWltYWdlIFBFIGZpbGVzIG9uIHBwYy4KLQkJICAgICBDaGVjayBmb3IgaW1hZ2UsIG9yIG5vdCwgYmVmb3JlIGNvcHlpbmcgcGVfb3B0aGRyCi0JKiB0YXJnZXRzLmM6IEFkZGVkIG5ldyBiZmQncwotCSogdGFyZ2V0cy5jOiBSZW1vdmVkIHR3byBpbmFjdGl2ZSBiZmRzIHRoYXQgc2hvdWxkbid0IGhhdmUgbWFkZSBpdCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICBmYXIuCi0KLVR1ZSBTZXAgMjYgMTQ6MDY6NDEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX3JlbG9jX3R5cGUpOiBSZW5hbWUgZnJvbSByZWxvY190eXBlLCBhbmQgdXNlCi0JZXhwbGljaXQgdmFsdWVzIHRvIGluaXRpYWxpemUgYWxsIHJlbG9jcy4gIENoYW5nZSBhbGwgdXNlcnMuCi0JKHBwY19lbGZfYnJ0YWtlbl9pbm5lcik6IE5ldyBmdW5jdGlvbiB0byBoYW5kbGUgYnJhbmNoIHByZWRpY2l0aW9uCi0JcmVsb2NzLgotCShwcGNfZWxmX2JydGFrZW5fcmVsb2MpOiBEaXR0by4KLQkocHBjX2VsZl9ob3d0b19yYXcpOiBVc2UgbmV3IGZ1bmN0aW9ucy4gIE1ha2Ugc3VyZSBhbGwgdW5zdXBwb3J0ZWQKLQlyZWxvY3MgdXNlIHBwY19lbGZfdW5zdXBwb3J0ZWRfcmVsb2MuCi0JKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IEtlZXAgdHJhY2sgb2Ygd2hldGhlciBhbiBlcnJvcgotCW5lZWRzIHRvIGJlIHJlcG9ydGVkLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBTdXBwb3J0IGJyYW5jaCBwcmVkaWN0aW9uIHJlbG9jcy4KLQotVHVlIFNlcCAyNiAxMjo0ODowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfYXNzZXJ0KTogUmVtb3ZlIFxuIGZyb20gc3RyaW5nIHBhc3NlZCB0bwotICAgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIuCi0KLQkqIGNvZmYtaTM4Ni5jOiAoVFdPX0RBVEFfU0VDUyk6IERvbid0IGRlZmluZS4KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZSBfYmZkX21ha2Vfc2VjdGlvbl9ob29rLgotCShiZmRfY29mZl9tYWtlX3NlY3Rpb25faG9vayk6IERvbid0IGRlZmluZS4KLQkoY29mZl9tYWtlX3NlY3Rpb25faG9vayk6IFJlbW92ZS4KLQkoc2VjX3RvX3N0eXBfZmxhZ3MpOiBSZW1vdmUgVFdPX0RBVEFfU0VDUyBjYXNlLgotCShzdHlwX3RvX3NlY19mbGFncyk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IERvbid0IGluaXRpYWxpemUgbWFrZV9zZWN0aW9uX2hvb2sKLQlmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogSnVzdCBjYWxsCi0JYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXksIG5vdCBiZmRfbWFrZV9zZWN0aW9uIG9yCi0JYmZkX2NvZmZfbWFrZV9zZWN0aW9uX2hvb2suCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX21ha2Vfc2VjdGlvbl9ob29rKTogUmVtb3ZlLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9tYWtlX3NlY3Rpb25faG9vayk6IERvbid0IGRlY2xhcmUuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IERvbid0IGluaXRpYWxpemUKLQltYWtlX3NlY3Rpb25faG9vayBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogRG9uJ3QgdHJ5IHRvIHN0dWZmCi0JcG9pbnRlcnMgaW50byB2YWx1ZSBmaWVsZCBmb3Igd2FybmluZyBhbmQgaW5kaXJlY3Qgc3ltYm9sczsganVzdAotCWxlYXZlIHRoZSB2YWx1ZSBmaWVsZCBhbG9uZS4KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogVXNlIG5leHQgc3ltYm9sIGZvcgotCXdhcm5pbmcgYW5kIGluZGlyZWN0IHN5bWJvbHMsIHJhdGhlciB0aGFuIGxvb2tpbmcgaW4gc3ltYm9sIHZhbHVlLgotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogUmVtb3ZlIGluZGlyZWN0X3B0cl9wdHIKLQlwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuICBSZW1vdmUgc3VwcG9ydCBmb3IgaW5kaXJlY3QKLQlzeW1ib2xzOyBpdCBkaWRuJ3Qgd29yayBhbnlob3cuCi0JKF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogUmVtb3ZlIGluZGlyZWN0X3B0ciB2YXJpYWJsZS4KLQkqIHN5bXMuYzogQ2hhbmdlIGNvbW1lbnRzIGFib3V0IEJTRl9XQVJOSU5HIGFuZCBCU0ZfSU5ESVJFQ1QuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLU1vbiBTZXAgMjUgMTY6MDQ6MDkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBGb3IgYWxsIDE0LWJpdCBicmFuY2ggcmVsb2NzLAotCWdvIGJhY2sgdG8gdGVsbGluZyB0aGUgdG9vbHMgdGhpcyByZWxvYyBvcGVyYXRlcyBvbiAzMiBiaXRzLgotCi1Nb24gU2VwIDI1IDExOjQ4OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dC1hZG9iZS5jIChhb3V0X2Fkb2JlX2NhbGxiYWNrKTogVXNlIF9iZmRfZXJyb3JfaGFuZGxlcgotCXJhdGhlciB0aGFuIGEgZGlyZWN0IGZwcmludGYuCi0JKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkocHBjX2VsZl91bnN1cHBvcnRlZF9yZWxvYyk6IExpa2V3aXNlLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGkzODZsaW51eC5jIChsaW51eF90YWxseV9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmspOiBMaWtld2lzZS4KLQkqIG9zZi1jb3JlLmMgKG9zZl9jb3JlX2NvcmVfZmlsZV9wKTogTGlrZXdpc2UuCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBzb20uYyAoc29tX3NpemVvZl9oZWFkZXJzKTogTGlrZXdpc2UuCi0JKiBzcmVjLmMgKHNyZWNfYmFkX2J5dGUpOiBMaWtld2lzZS4KLQkqIGJmZC5jIChiZmRfYXNzZXJ0KTogTGlrZXdpc2UuICBBbHNvIGNoYW5nZSBmaWxlIHRvIGJlIGNvbnN0LgotCSogbGliYmZkLWluLmggKGJmZF9hc3NlcnQpOiBEZWNsYXJlIGZpcnN0IHBhcmFtZXRlciBjb25zdC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogY29mZi1hMjlrLmMgKGEyOWtfcmVsb2MpOiBEb24ndCBib3RoZXIgdG8gZnByaW50ZjsgcmV0dXJuaW5nCi0JYmZkX3JlbG9jX292ZXJmbG93IGlzIGVub3VnaC4KLQkqIGNvZmYtaDgzMDAuYyAocnR5cGUyaG93dG8pOiBEb24ndCBib3RoZXIgdG8gZnByaW50ZjsganVzdCBhYm9ydC4KLQkqIGNvZmYtaDg1MDAuYyAocnR5cGUyaG93dG8pOiBMaWtld2lzZS4KLQkqIGNvZmYtejhrLmMgKHJ0eXBlMmhvd3RvKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChkdW1teV9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogTGlrZXdpc2UuCi0JKiBlbGYuYyAoX2JmZF9lbGZfZ2V0X2xpbmVubyk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvKTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX25vX2luZm9fdG9faG93dG9fcmVsKTogTGlrZXdpc2UuCi0JKiBocDMwMGhwdXguYyAoY29udmVydF9zeW1fdHlwZSk6IExpa2V3aXNlLgotCShNWShzd2FwX3N0ZF9yZWxvY19pbikpOiBMaWtld2lzZS4KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBSZW1vdmUgI2lmIDAgc2VjdGlvbnMuCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogQWRkIGxpbmVfYnVmIGZpZWxkLgotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IFJlbW92ZSBzdGF0aWNzIGJ1ZmZlcgotCWFuZCBmaWxlbmFtZV9idWZmZXIuICBJbnN0ZWFkLCB1c2UgYSBtYWxsb2MgYnVmZmVyIHN0b3JlZCBpbiB0aGUKLQluZXcgbGluZV9idWYgZmllbGQuICBSZW1vdmUgbGVuZ3RoIHJlc3RyaWN0aW9ucy4KLQotCSogY29mZmdlbi5jIChzdHJpbmdfc2l6ZSk6IFJlbW92ZSBzdGF0aWMgdmFyaWFibGUuCi0JKGRlYnVnX3N0cmluZ19zaXplLCBkZWJ1Z19zdHJpbmdfc2VjdGlvbik6IExpa2V3aXNlLgotCShjb2ZmX2ZpeF9zeW1ib2xfbmFtZSk6IEFkZCBzdHJpbmdfc2l6ZV9wLCBkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLAotCWFuZCBkZWJ1Z19zdHJpbmdfc2l6ZV9wIHBhcmFtZXRlcnMuICBVc2UgdGhlbSBpbnN0ZWFkIG9mIHRoZQotCWdsb2JhbCB2YXJpYWJsZXMuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGNvZmZfd3JpdGVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sLCBjb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9zeW1ib2xzKTogQWRkIGxvY2FsIHZhcmlhYmxlcyB0byByZXBsYWNlIHJlbW92ZWQKLQlnbG9iYWwgdmFyaWFibGVzLgotCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpOiBBZGQgb2Zmc2V0LCBpLAotCWZ1bmN0aW9uLCBhbmQgbGluZV9iYXNlIGZpZWxkcy4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IFVzZSBzZWN0aW9uIHRkYXRhIHRvIGNhY2hlCi0JaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIHVzaW5nIHN0YXRpYyB2YXJpYWJsZXMuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3JlYWRfZHluYW1pY19pbmZvKTogQWRqdXN0IG9mZnNldHMgaW4gYW4gTk1BR0lDCi0JZmlsZS4gIEZyb20gUGV0ZXIgRGVXb2xmIDxwbGRAYW10LnRheTEuZGVjLmNvbT4uCi0KLQkqIGluaXQuYyAoaW5pdGlhbGl6ZWQpOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlLgotCShiZmRfaW5pdCk6IERvbid0IGJvdGhlciBzZXR0aW5nIGluaXRpYWxpemVkLgotCShiZmRfY2hlY2tfaW5pdCk6IFJlbW92ZS4KLQkqIG9wbmNscy5jIChfYmZkX25ld19iZmQpOiBEb24ndCBjYWxsIGJmZF9jaGVja19pbml0LgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLVNhdCBTZXAgMjMgMDE6MjI6MjMgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfcCk6ICBEb24ndCBjaGVjayB0aGUgY29yZSBmaWxlCi0Jc2l6ZSBmb3IgZnVsbCBjb3JlIGR1bXBzLiBDb3B5IGNvcmUgZmlsZSBoZWFkZXIgdG8gcHJpdmF0ZSBkYXRhLgotCShyczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQsCi0JcnM2MDAwY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpOiAgTmV3IGZ1bmN0aW9ucyB0byBleHRyYWN0Ci0JdGhlIGZpbGUgbmFtZSBhbmQgdGVybWluYXRpbmcgc2lnbmFsIGZyb20gdGhlIGNvcmUgZmlsZS4KLQkqIGNvZmYtcnM2MDAwLmM6ICBVc2UgdGhlbS4KLQotRnJpIFNlcCAyMiAxNzo0NDo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlDaGFuZ2UgYXJjaCBpbmZvIHRvIGJlIGNvbnN0LCBpbml0aWFsaXplZCBhdCBjb21waWxlIHRpbWUuCi0JKiBhcmNodXJlcy5jOiBSZWluZGVudCBtYW55IGZ1bmN0aW9ucy4gIENoYW5nZSBDT05TVCB0byBjb25zdC4KLQkoYmZkX2FyY2hfaW5mb190eXBlKTogTWFrZSBhcmNoX25hbWUgY29uc3QuICBSZW1vdmUgZGlzYXNzZW1ibGU7Ci0Jbm90aGluZyBzZXQgaXQgYW55aG93LiAgTWFrZSBuZXh0IGNvbnN0LgotCShiZmRfYXJjaF9pbmZvX2xpc3QpOiBSZW1vdmUuCi0JKGJmZF9hcmNodXJlc19saXN0KTogUmVuYW1lIGZyb20gYXJjaHVyZXNfaW5pdF90YWJsZS4gIENoYW5nZSBmcm9tCi0JYSB0YWJsZSBvZiBmdW5jdGlvbiBwb2ludGVycyB0byBhIHRhYmxlIG9mIGJmZF9hcmNoX2luZm9fdHlwZQotCXN0cnVjdHVyZSBhZGRyZXNzZXMuCi0JKGJmZF9zY2FuX2FyY2gpOiBSZXdyaXRlIGFjY29yZGluZ2x5LiAgUmV0dXJuIGEgY29uc3QgcG9pbnRlci4KLQkoYmZkX2xvb2t1cF9hcmNoKTogTGlrZXdpc2UuCi0JKGJmZF9zZXRfYXJjaF9pbmZvKTogUmV3cml0ZSBhY2NvcmRpbmdseS4gIENoYW5nZSBhcmd1bWVudCB0byBiZSBhCi0JY29uc3QgcG9pbnRlci4KLQkoYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3QpOiBNYWtlIGNvbnN0LgotCShiZmRfYXJjaF9pbml0LCBiZmRfYXJjaF9saW5raW4pOiBSZW1vdmUuCi0JKGJmZF9nZXRfYXJjaF9pbmZvKTogUmV0dXJuIGEgY29uc3QgcG9pbnRlci4KLQkqIGluaXQuYyAoYmZkX2luaXQpOiBEb24ndCBjYWxsIGJmZF9hcmNoX2luaXQuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBNYWtlIGFyY2hfaW5mbyBjb25zdC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluOiBQdXQgJiBiZWZvcmUgZXZlcnl0aGluZyBpbiAkc2VsYXJjaHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjcHUtKi5jOiBDaGFuZ2UgYmZkXypfYXJjaCBmcm9tIGEgZnVuY3Rpb24gd2hpY2ggY2FsbHMKLQliZmRfYXJjaF9saW5raW4gdG8gYSBjb25zdCBzdHJ1Y3R1cmUuCi0JKiBpZWVlLmMgKGllZWVfb2JqZWN0X3ApOiBNYWtlIGFyY2ggY29uc3QuCi0KLUZyaSBTZXAgMjIgMTY6MjM6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV90eXBlKTogQWRkIHJlbG9jYXRpb25zIHRvIHN1cHBvcnQgYWxsIG9mCi0JUG93ZXJQQyBWLjQuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZS4KLQotCSogZWxmMzItcHBjLmMgKHJlbG9jX3R5cGUpOiBVcGRhdGUgbmFtZXMgdG8gbWF0Y2ggY3VycmVudCBkcmFmdC4KLQkocHBjX2VsZl9ob3d0b19yYXcpOiBNYXJrIDE0IGJpdCByZWxvY3MgYXMgc2hvcnQgc2l6ZWQgYW5kIFBDCi0JcmVsYXRpdmUuICBVcGRhdGUgbmFtZXMgdG8gY3VycmVudCBWLjQgZHJhZnQuCi0JKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgc3VwcG9ydCBmb3IgbW9yZSByZWxvY2F0aW9ucy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmVuYW1lIHJlbG9jYXRpb25zIHRvIG1hdGNoIGRyYWZ0LgotCi1UaHUgU2VwIDIxIDIxOjUzOjE4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQWxsb3cgbW9kdWxlcwotCWNvbXBpbGVkIHdpdGggLW1yZWxvY2F0YWJsZS1saWIgdG8gYmUgbGlua2VkIHdpdGggZWl0aGVyIG5vcm1hbAotCW1vZHVsZXMgb3IgLW1yZWxvY2F0YWJsZSBtb2R1bGVzLgotCi1XZWQgU2VwIDIwIDEyOjAzOjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDbGVhciB0aGUgdnN0YW1wIGZpZWxkCi0JaW4gdGhlIGEub3V0IGhlYWRlci4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX291dCkpOiBEb24ndCBzZXQgcl9leHRlcm4gZm9yCi0JYSByZWxvYyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLCBldmVuIGlmIGl0J3Mgbm90IGEgc2VjdGlvbi4KLQotVHVlIFNlcCAxOSAxNzowMjoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IFJlbW92ZSB1bnVzZWQgYWxpZ25fcG93ZXJfbWluIGZpZWxkLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogQWxsIGJhY2tlbmRzOiBSZW1vdmUgaW5pdGlhbGl6YXRpb24gb2YgYWxpZ25fcG93ZXJfbWluLgotCi1UdWUgU2VwIDE5IDE0OjAyOjIxIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBHZXQgc2l6ZXMgZm9yIEJTUyByaWdodC4KLQotTW9uIFNlcCAxOCAxNDozNTowMSAxOTk1ICBBcm5lIEguIEp1dWwgIDxhcm5lakBwdnYudW5pdC5ubz4KLQotCSogY29uZmlnLmJmZCAobWlwcy1kZWMtbmV0YnNkKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaG9zdCAobWlwcy1kZWMtbmV0YnNkKik6IE5ldyBob3N0LgotCSogY29uZmlndXJlLmluIChtaXBzLWRlYy1uZXRic2QqKTogTmV3IG5hdGl2ZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIFNlcCAxNSAxMDoyNDozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlNYWtlIHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyIG1lcmdlIGNvbW1vbiB0eXBlczoKLQkqIGNvZmZsaW5rLmMgKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQpOiBEZWZpbmUuCi0JKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUpOiBEZWZpbmUuCi0JKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkpOiBEZWZpbmUuCi0JKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0KTogRGVmaW5lLgotCShjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSk6IERlZmluZS4KLQkoY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2xvb2t1cCk6IERlZmluZS4KLQkoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvKTogQWRkIGRlYnVnX21lcmdlIGZpZWxkLgotCShjb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfY29mZl9maW5hbF9saW5rKTogQWxsb2NhdGUgYW5kIGZyZWUgZGVidWdfbWVyZ2UgdGFibGUuCi0JKGNvZmZfbGlua19pbnB1dF9iZmQpOiBNZXJnZSBpZGVudGljYWwgZW51bSwgc3RydWN0IGFuZCB1bmlvbgotCXR5cGVzLgotCi1UaHUgU2VwIDE0IDE0OjUzOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUNvbnZlcnQgaTk2MCBDT0ZGIHRvIHVzZSBDT0ZGIGJhY2tlbmQgbGlua2VyLgotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY2F0ZSk6IFVzZSBhIGNvZmZfc2VjdGlvbl9kYXRhCi0Jc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBzeW1ib2wgYmVpbmcgdXNlZC4KLQkoY29mZl9pOTYwX3N0YXJ0X2ZpbmFsX2xpbmspOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2k5NjBfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfaTk2MF9hZGp1c3Rfc3ltbmR4KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9zdGFydF9maW5hbF9saW5rKTogRGVmaW5lLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKGNvZmZfYWRqdXN0X3N5bW5keCk6IERlZmluZS4KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgY2FsbGJhY2sgZnVuY3Rpb24KLQlfYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluay4KLQkoYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluayk6IERlZmluZS4KLQkoY29mZl9zdGFydF9maW5hbF9saW5rKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEFkZCBjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUpOiBNYWtlIGdsb2JhbGx5Ci0JdmlzaWJsZS4KLQkoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBDYWxsIGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsgaWYgdGhlCi0JZnVuY3Rpb24gY2FsbGJhY2sgaXMgbm90IE5VTEwuCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpOiBBZGQgdGRhdGEgZmllbGQuCi0JKF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSk6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaW4gKGljb2ZmX2JpZ192ZWMpOiBBZGQgY29mZmxpbmsuby4KLQkoaWNvZmZfbGl0dGxlX3ZlYyk6IExpa2V3aXNlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgU2VwIDEzIDE3OjM4OjIzIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBydGwuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuLWluZm8pOiBSZW1vdmUgZXh0cmFuZW91cyB0YWIgZnJvbSBsaW5lCi0JZm9sbG93aW5nIGFjdGlvbi4KLQotV2VkIFNlcCAxMyAxMzoyNzo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19pbnB1dF9iZmQpOiBGYWlsIGlmIGEgc2VjdGlvbiB3aXRoIG5vCi0JY29udGVudHMgaGFzIHJlbG9jcy4KLQotVGh1IFNlcCAxMiAxMjo0NTozNCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEtlZXAgdGhlCi0JcmF3IHNpemUgc2FmZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1lbWJlciBpZiBpdCdzIGEgcmVsb2NhdGFibGUKLQlmaWxlLgotCSogbGliY29mZi1pbi5oIChwZV9kYXRhX3R5cGUpOiBOZXcgbWVtYmVyICdoYXNfcmVsb2Nfc2VjdGlvbicKLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2ZpbGVoZHJfb3V0KTogQ2xlYXIgbm90LXJlbG9jIGZsYWcKLQlpZiByZWxvY2F0YWJsZSBmaWxlLiBTd2FwIG91dCBzYXZlZCByYXcgc2l6ZS4KLQotVHVlIFNlcCAxMiAxMjoxNDozMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkb19tYWludGFpbmVyX2NsZWFuKTogUmVuYW1lIGZyb20gZG9fcmVhbGNsZWFuLgotCShtYWludGFpbmVyLWNsZWFuKTogUmVuYW1lIGZyb20gcmVhbGNsZWFuLCBwYXNzaW5nCi0JbWFpbnRhaW5lci1jbGVhbiBkb3duIHRvIHN1YmRpcmVjdG9yaWVzLCBidXQgbGVhdmUgcmVhbGNsZWFuIGFzIGEKLQlzeW5vbnltLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBQYXNzIHN5bWJvbCBuYW1lIHRvCi0Jd2FybmluZyBjYWxsYmFjay4KLQotCSogZGVwLWluLnNlZDogUmVtb3ZlIGNvbmZpZy5oIGZyb20gZ2VuZXJhdGVkIGRlcGVuZGVuY2llcy4KLQotCSogc3Vub3MuYyAoc3Vub3Nfc2x1cnBfZHluYW1pY19zeW10YWIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLAotCWJyb2tlbiBvdXQgb2Ygc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiLgotCShzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBDYWxsIG5ldyBmdW5jdGlvbgotCXN1bm9zX3NsdXJwX2R5bmFtaWNfc3ltdGFiLgotCShzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogQWRkIHRocmVlIG5ldyBwYXJhbWV0ZXJzLiAgUmV0dXJuIHRoZQotCWR5bmFtaWMgc3ltYm9sIHRhYmxlIHRvIHRoZSBjYWxsZXIuCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBQZXJtaXQgYWRkX2R5bmFtaWNfc3ltYm9scwotCWNhbGxiYWNrIHRvIG92ZXJyaWRlIHRoZSBzeW1ib2xzIGJlaW5nIHJlYWQuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IEFkZCB0aHJlZSBuZXcgcGFyYW1ldGVycwotCXRvIGFkZF9keW5hbWljX3N5bWJvbHMgY2FsbGJhY2suCi0KLQlFeHRlbnNpdmUgbWlub3IgY2hhbmdlcyB0byBhdm9pZCB2YXJpb3VzIGdjYyB3YXJuaW5ncy4gIEFsc286Ci0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBSZW1vdmUgY29mZi1hcm0uby4KLQkqIGFyY2h1cmVzLmMgKGJmZF9hcmNoX2luZm9fdHlwZSk6IENoYW5nZSBtYWNoIGZpZWxkIGZyb20gbG9uZyB0bwotCXVuc2lnbmVkIGxvbmcuCi0JKGJmZF9sb29rdXBfYXJjaCk6IENoYW5nZSBtYWNoaW5lIHBhcmFtZXRlciBmcm9tIGxvbmcgdG8gdW5zaWduZWQKLQlsb25nLgotCi1Nb24gU2VwIDExIDEwOjU1OjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzKTogRml4IEJGRF9BU1NFUlQ6IGl0J3MgT0sgdG8gZmluZAotCWEgc3ltYm9sIHdpdGggYSBub24temVybyBwbHRfb2Zmc2V0LgotCi1GcmkgU2VwICA4IDExOjQ3OjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChhbGlnbl9maWxlX3Bvc2l0aW9uKTogUmVtb3ZlOyBub3QgdXNlZC4KLQotCSogY29uZmlndXJlLmluOiBPbmx5IGNoZWNrIGZvciA8c3lzL3Byb2Nmcy5oPiBvbiBhIG5hdGl2ZSBzeXN0ZW0sCi0JYW5kIG1ha2Ugc3VyZSBpdCBkZWZpbmVzIHByc3RhdHVzX3QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBTZXAgIDcgMTI6NDg6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCk6IENvcnJlY3QgbTY4ayBhYm9ydCB0ZXN0LgotCi0JKiBjb25maWcuaW46IFJlbmFtZSBmcm9tIGNvbmZpZy5oLmluLgotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NPTkZJR19IRUFERVIgd2l0aCBjb25maWcuaDpjb25maWcuaW4uCi0JQ2hlY2sgZm9yIGNvbmZpZy5oOmNvbmZpZy5pbiB3aGVuIGNyZWF0aW5nIHN0YW1wLWguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoc3RhbXAtaCk6IERlcGVuZCB1cG9uIGNvbmZpZy5pbiByYXRoZXIgdGhhbgotCWNvbmZpZy5oLmluLiAgU2V0IENPTkZJR19IRUFERVJTIHRvIGNvbmZpZy5oOmNvbmZpZy5pbiB3aGVuCi0JY2FsbGluZyBjb25maWcuc3RhdHVzLgotCi0JKiBNYWtlZmlsZS5pbiAoZG9fZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5oIGFuZCBzdGFtcC1oLgotCShNYWtlZmlsZSk6IEp1c3QgcmVidWlsZCBNYWtlZmlsZS4KLQkoY29uZmlnLmgsIHN0YW1wLWgpOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbjogQ3JlYXRlIHN0YW1wLWggd2hlbiByZWJ1aWxkaW5nIGNvbmZpZy5oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgU2VwICA2IDE1OjAwOjMzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NPTkZJR19IRUFERVIuICBTdWJzdGl0dXRlCi0JSE9TVF82NEJJVF9MT05HLiAgQ2hlY2sgdGhhdCB2YXJpb3VzIGhlYWRlciBmaWxlcyBleGlzdC4gIENoZWNrCi0JdGhhdCBmY250bCBleGlzdHMuICBDYWxsIEJGRF9CSU5BUllfRk9QRU4uICBDaGVjayB3aGV0aGVyIG1hbGxvYwotCWFuZC9vciBmcmVlIG5lZWQgdG8gYmUgZGVjbGFyZWQuICBEb24ndCBtYWtlIGEgbGluayB0byBzeXNkZXAuaC4KLQlEZWZpbmUgVFJBRF9IRUFERVIgZm9yIHZhcmlvdXMgaG9zdHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaG9zdDogRG9uJ3Qgc2V0IG15X2hvc3QuICBBZGQgZGVmaW5pdGlvbnMgdGFrZW4gZnJvbQotCWhvc3QgaGVhZGVyIGZpbGVzIGZvciB2YXJpb3VzIGVudHJpZXMuICBSZW1vdmUgZW50cmllcyB3aGljaCBub3cKLQlkbyBub3RoaW5nLgotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBjb25maWcuaC5pbjogTmV3IGZpbGUsIGJ1aWx0IGJ5IGF1dG9oZWFkZXIuCi0JKiBzeXNkZXAuaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoZG9fZGlzdGNsZWFuKTogRG9uJ3QgcmVtb3ZlIHN5c2RlcC5oLgotCShSRUNPTkZJRyk6IFJlbW92ZS4KLQkoTE9DQUxfSF9ERVBTKTogTmV3IHZhcmlhYmxlLgotCSgkKEJGRF9MSUJTKSk6IFVzZSAkKExPQ0FMX0hfREVQUykgcmF0aGVyIHRoYW4gbGliYmZkLmggYW5kCi0JJChSRUNPTkZJRykuCi0JKCQoQkZEX01BQ0hJTkVTKSwgJChCRkRfQkFDS0VORFMpKTogTGlrZXdpc2UuCi0JKCQoT1BUSU9OQUxfQkFDS0VORFMpKTogTGlrZXdpc2UuCi0JKHN0bXAtYmZkLmgpOiBKdXN0IHN1YnN0aXR1dGUgZm9yIEJGRF9IT1NUXzY0QklUX0xPTkcsIHJhdGhlciB0aGFuCi0JbG9va2luZyB0aHJvdWdoIHN5c2RlcC5oLgotCSogYmZkLWluLmggKEJGRF9IT1NUXzY0QklUX0xPTkcpOiBEZWZpbmU7IHNldCBieSBNYWtlZmlsZS4KLQkoQkZEX0hPU1RfNjRfQklUKTogRGVmaW5lIGJhc2VkIG9uIEJGRF9IT1NUXzY0QklUX0xPTkcuCi0JKGZwcmludGZfdm1hLCBzcHJpbnRmX3ZtYSk6IExpa2V3aXNlLgotCShpbnQ2NF90eXBlLCB1aW50NjRfdHlwZSk6IERvbid0IGRlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGFyY2h1cmVzLmMsIGJmZC5jLCBzcmVjLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCSogZWxmY29yZS5oOiBDaGVjayBIQVZFX1NZU19QUk9DRlNfSCByYXRoZXIgdGhhbiBIQVZFX1BST0NGUy4KLQkqIGx5bngtY29yZS5jOiBJbmNsdWRlIHN0dWZmIGZyb20gb2xkIGhvc3RzL2x5bnguaC4KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6IENoZWNrIEhBVkVfRk5DVEwgYW5kIGRlZmluZWQgKEZfR0VURkwpLAotCXJhdGhlciB0aGFuIE5PX0ZDTlRMLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X2xpc3QpOiBDaGVjayBIT1NUX0hQUEFIUFVYIGFuZCAhIF9fU1REQ19fCi0JcmF0aGVyIHRoYW4gTkFUSVZFX0hQUEFIUFVYX0NPTVBJTEVSLgotCSogdHJhZC1jb3JlLmM6IERvbid0IGluY2x1ZGUgPGVycm5vLmg+LiAgSW5jbHVkZSBUUkFEX0hFQURFUiBpZiBpdAotCWlzIGRlZmluZWQuCi0JKiBob3N0cy8qLmg6IFJlbW92ZSBhbGwgaGVhZGVyIGZpbGVzIHdoaWNoIG1lcmVseSBpbmNsdWRlLAotCWRlY2xhcmUsIGFuZCBkZWZpbmUgdGhpbmdzLiAgTGVhdmUgaGVhZGVyIGZpbGVzIHdoaWNoIGRlZmluZQotCWluZm9ybWF0aW9uIG5lZWRlZCBieSB0cmFkLWNvcmUuYy4KLQotCSogYWNsb2NhbC5tNCAoQkZEX0JJTkFSWV9GT1BFTik6IERlZmluZS4KLQkoQkZEX0NDX0ZPUl9CVUlMRCk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEJGRF9DQ19GT1JfQlVJTEQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBTZXAgIDUgMTk6MzU6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00OiBEb24ndCB0cnkgdG8gZ3JlcCAuLi9NYWtlZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb2ZmLXNwYXJjLmMgKENBTENfQURERU5EKTogRG9uJ3Qgc2V0IHRoZSBhZGRlbmQgdG8gdGhlIHZhbHVlIG9mCi0JYSBnbG9iYWwgc3ltYm9sLgotCi1UdWUgU2VwICA1IDEyOjQ4OjI2IDE5OTUgIEphc29uIE1vbGVuZGEgICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogaTM4NnBlX3ZlIC0+IGkzODZwZV92ZWMuCi0KLU1vbiBTZXAgIDQgMTQ6MDI6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogSW5jb3Jwb3JhdGUgaG9zdCBNYWtlZmlsZSBmcmFnbWVudHMgYnkgc2V0dGluZwotCXNoZWxsIHZhcmlhYmxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19QUk9HX0NDLiAgU3Vic3RpdHV0ZSBDRkxBR1MsIEhERUZJTkVTIGFuZAotCUFSLiAgQ2FsbCBBQ19QUk9HX0lOU1RBTEwuICBTdWJzdGl0dXRlIENDX0ZPUl9CVUlMRCwgY2hvb3NpbmcgYQotCXZhbHVlIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGNvZGUgaXMgYmVpbmcgY29tcGlsZWQgYnkgYSBjcm9zcwotCWNvbXBpbGVyLiAgRG9uJ3Qgc3Vic3RpdHV0ZSBob3N0X21ha2VmaWxlX2ZyYWcgb3IgZnJhZ3MuCi0JKiBhY2xvY2FsLm00OiBOZXcgZmlsZSB0byBkZWZpbmUgbG9jYWwgQUNfUFJPR19DQy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogU2V0IHRvIEBJTlNUQUxMQC4KLQkoSU5TVEFMTF9QUk9HUkFNKTogU2V0IHRvIEBJTlNUQUxMX1BST0dSQU1ALgotCShJTlNUQUxMX0RBVEEpOiBTZXQgdG8gQElOU1RBTExfREFUQUAuCi0JKEFSKTogU2V0IHRvIEBBUkAuCi0JKENDKTogRGVmaW5lIGFzIEBDQ0AuCi0JKENGTEFHUyk6IFNldCB0byBAQ0ZMQUdTQC4KLQkoQ0NfRk9SX0JVSUxEKTogU2V0IHRvIEBDQ19GT1JfQlVJTERALgotCShAaG9zdF9tYWtlZmlsZV9mcmFnQCk6IFJlbW92ZS4KLQkoQUxMX0NGTEFHUyk6IENoYW5nZSAkKEhERUZJTkVTKSB0byBASERFRklORVNALiAgTW92ZSAkKENGTEFHUykKLQlhZnRlciBvdGhlciBvcHRpb25zLgotCShjb25maWcuc3RhdHVzKTogUmVtb3ZlIGRlcGVuZGVuY3kgdXBvbiBAZnJhZ3NALgotCSogY29uZmlnLyoubWgsIGNvbmZpZy9SRUFETUU6IFJlbW92ZS4KLQotCSogY29uZmlnLmJmZDogUmV3cml0ZSB0byBpbmNvcnBvcmF0ZSB0aGUgY29udGVudHMgb2YgdGhlIE1ha2VmaWxlCi0JZnJhZ21lbnRzIGJ5IHNldHRpbmcgc2hlbGwgdmFyaWFibGVzLCByYXRoZXIgdGhhbiBtZXJlbHkgcmV0dXJuaW5nCi0JdGhlIG5hbWUgb2YgYSBNYWtlZmlsZSBmcmFnbWVudC4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIHNoZWxsIHZhcmlhYmxlcyBzZXQgYnkgY29uZmlnLmJmZCByYXRoZXIgdGhhbgotCWxvb2tpbmcgYXQgdGhlIHRhcmdldCBNYWtlZmlsZSBmcmFnbWVudCBmaWxlcy4gIERvbid0IHN1YnN0aXR1dGUKLQl0YXJnZXRfbWFrZWZpbGVfZnJhZy4gIERvIHN1YnN0aXR1dGUgVERFRklORVMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoQHRhcmdldF9tYWtlZmlsZV9mcmFnQCk6IFJlbW92ZS4KLQkoQUxMX0NGTEFHUyk6IENoYW5nZSAkKFRERUZJTkVTKSB0byBAVERFRklORVNALgotCSogY29uZmlnLyoubXQ6IFJlbW92ZS4KLQotTW9uIFNlcCAgNCAwMzoxMzoyOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBQdXQgY2hhbmdlcXVvdGUgbGluZXMgYXJvdW5kICJpWzM0NV04NiIgcGF0dGVybnMKLQlzZWN0aW9uIG9mIGNvcmUgZmlsZSBzdXBwb3J0LgotCi1TdW4gU2VwICAzIDExOjMxOjU4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lIHRvIHVzZSB0aGUKLQlnZW5lcmljIHZlcnNpb24uCi0KLUZyaSBTZXAgIDEgMTc6MDg6NDAgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYW91dGhkcl9pbik6IEFkZCBJbWFnZUJhc2UgdG8KLQllbnRyeSwgdGV4dF9zdGFydCBhbmQgZGF0YV9zdGFydC4KLQotRnJpIFNlcCAgMSAxODowNjoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChPRklMRVMpOiBSZW1vdmUgJChUREVQRklMRVMpLgotCSogY29uZmlnL2Fwb2xsby5tdCAoVERFUEZJTEVTKTogUmVtb3ZlLgotCSogY29uZmlnL1JFQURNRTogVXBkYXRlLgotCi0JKiBjb25maWd1cmUuaW46IEZvciBhIG5hdGl2ZSBjb25maWd1cmF0aW9uLCBzZXQgQ09SRUZJTEUgYW5kCi0JQ09SRUZMQUcgYmFzZWQgb24gdGhlIGNhbm9uaWNhbCBob3N0IG5hbWUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEFMTF9DRkxBR1MpOiBBZGQgQENPUkVGTEFHQC4KLQkoT0ZJTEVTKTogUmVwbGFjZSAkKEhERVBGSUxFUykgd2l0aCBAQ09SRUZJTEVALgotCSogY29mZi1yczYwMDAuYzogQ2hlY2sgQUlYX0NPUkUgcmF0aGVyIHRoYW4gSE9TVF9BSVggZm9yIGNvcmUgZmlsZQotCXN1cHBvcnQgcm91dGluZXMuICBDaGVjayBMWU5YX0NPUkUgcmF0aGVyIHRoYW4gSE9TVF9MWU5YLgotCSogbHlueC1jb3JlLmM6IENoZWNrIExZTlhfQ09SRSByYXRoZXIgdGhhbiBIT1NUX0xZTlguCi0JKiBpMzg2bHlueC5jOiBMaWtld2lzZS4KLQkqIG02OGtseW54LmM6IExpa2V3aXNlLgotCSogc3BhcmNseW54LmM6IExpa2V3aXNlLgotCSogcnM2MDAwLWNvcmUuYzogQ2hlY2sgQUlYX0NPUkUgcmF0aGVyIHRoYW4gSE9TVF9BSVguCi0JKiAqLWNvcmUuYzogQ29tbWVudCBjaGFuZ2VzLgotCSogY29uZmlnL2RlY3N0YXRpb24ubWggKEhERVBGSUxFUyk6IFJlbW92ZS4KLQkoSERFRklORVMpOiBSZW1vdmUgLURUUkFEX0NPUkUuCi0JKiBjb25maWcvaXJpeDMubWggKFJBTkxJQik6IFJlbW92ZS4KLQkqIGNvbmZpZy9pcml4NC5taCAoSERFUEZJTEVTLCBSQU5MSUIpOiBSZW1vdmUuCi0JKEhERUZJTkVTKTogUmVtb3ZlIC1ESVJJWF9DT1JFLgotCSogY29uZmlnL3Jpc2Nvcy5taCAoUkFOTElCLCBIREVQRklMRVMpOiBSZW1vdmUuCi0JKEhERUZJTkVTKTogUmVtb3ZlIC1EVFJBRF9DT1JFLgotCSogY29uZmlnL25jcjMwMDAubWggKEFSX0ZMQUdTLCBSQU5MSUIpOiBSZW1vdmUuCi0JKiBjb25maWcvdWx0cmEzLm1oIChSQU5MSUIpOiBSZW1vdmUuCi0JKiBjb25maWcvYWl4NC5taCwgY29uZmlnL2FscGhhb3NmLm1oLCBjb25maWcvYW1peC5taDogUmVtb3ZlLgotCSogY29uZmlnL2Fwb2xsby5taCwgY29uZmlnL2RlbHRhNjgubWgsIGNvbmZpZy9kZWx0YTg4Lm1oOiBSZW1vdmUuCi0JKiBjb25maWcvZHB4Mi5taCwgY29uZmlnL2VzaXgubWgsIGNvbmZpZy9oYXJyaXMubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9ocDMwMC5taCwgY29uZmlnL2hwMzAwYnNkLm1oLCBjb25maWcvaHBwYWJzZC5taDogUmVtb3ZlLgotCSogY29uZmlnL2hwcGFocHV4Lm1oLCBjb25maWcvaHBwYW9zZi5taDogUmVtb3ZlLgotCSogY29uZmlnL2kzODZhaXgubWgsIGNvbmZpZy9pMzg2YnNkLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvaTM4NmxpbnV4Lm1oLCBjb25maWcvaTM4Nm1hY2gzLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvaTM4NnNjby5taCwgY29uZmlnL2kzODZ2Lm1oLCBjb25maWcvaTM4NnY0Lm1oOiBSZW1vdmUuCi0JKiBjb25maWcvaXJpeDUubWgsIGNvbmZpZy9tODhrbWFjaDMubWgsIGNvbmZpZy9taXBzYnNkLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvbWlwc21hY2gzLm1oLCBjb25maWcvbmV3cy1taXBzLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvbmV3cy5taCwgY29uZmlnL3BjNTMybWFjaC5taCwgY29uZmlnL3Jpc2NpeC5taDogUmVtb3ZlLgotCSogY29uZmlnL3JzNjAwLm1oLCBjb25maWcvcnM2MDAwbHlueC5taDogUmVtb3ZlLgotCSogY29uZmlnL3NvbGFyaXMyLm1oLCBjb25maWcvc3RyYXR1cy5taDogUmVtb3ZlLgotCSogY29uZmlnL3N5bW1ldHJ5Lm1oLCBjb25maWcvc3lzdjQubWgsIGNvbmZpZy90YWhvZS5taDogUmVtb3ZlLgotCSogY29uZmlnL3ZheGJzZC5taCwgY29uZmlnL3ZheHVsdC5taCwgY29uZmlnL3ZheHVsdDIubWg6IFJlbW92ZS4KLQotRnJpIFNlcCAgMSAxNToxODo1MCAxOTk1ICBLYXp1bW90byBLb2ppbWEgIDxra29qaW1hQGluZm8ua2FuYWdhd2EtdS5hYy5qcD4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBjaGFuZ2UgYSBEVF9JTklUIG9yCi0JRFRfRklOSSBlbnRyeSBpZiB0aGUgYXBwcm9wcmlhdGUgc3ltYm9sIGlzIG5vdCBpbiB0aGUgaGFzaCB0YWJsZS4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIGNyZWF0ZV9wcm9ncmFtX2hlYWRlcnMKLQlhbmQgd2FudF9oZHJfaW5fc2VnIGZpZWxkcy4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfYmFja2VuZF93YW50X2hkcl9pbl9zZWcpOiBEZWZpbmUgaWYgbm90Ci0JZGVmaW5lZC4KLQkoZWxmX2JhY2tlbmRfY3JlYXRlX3Byb2dyYW1faGVhZGVycyk6IExpa2V3aXNlLgotCShlbGZOTl9iZWQpOiBJbml0aWFsaXplIGNyZWF0ZV9wcm9ncmFtX2hlYWRlcnMgYW5kCi0Jd2FudF9oZHJfaW5fc2VnLgotCSogZWxmLmMgKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogQ2FsbCBjcmVhdGVfcHJvZ3JhbV9oZWFkZXJzCi0JYmFja2VuZCByb3V0aW5lLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IENoZWNrIHdhbnRfaGRyX2luX3NlZyBiYWNrZW5kIGZpZWxkLiAgQ2FsbAotCWNyZWF0ZV9wcm9ncmFtX2hlYWRlcnMgYmFja2VuZCByb3V0aW5lLgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBBbGlnbiBub24gYWxsb2NhdGVkCi0Jc2VjdGlvbnMgd2hlbiBjcmVhdGluZyBhbiBleGVjdXRhYmxlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zd2FwX3BoZHJfaW4pOiBNYWtlIG5vbiBzdGF0aWMuCi0JKGVsZl9zd2FwX3BoZHJfb3V0KTogTWFrZSBub24gc3RhdGljLgotCSogbGliZWxmLmggKGJmZF9lbGYzMl9zd2FwX3BoZHJfaW4pOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfc3dhcF9waGRyX291dCk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zd2FwX3BoZHJfaW4pOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc3dhcF9waGRyX291dCk6IERlY2xhcmUuCi0KLQkqIGVjb2ZmbGluay5jIChlY29mZl9jb2xsZWN0X3NodWZmbGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9wZHIpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3N5bSk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfcGRyKTogRGVjbGFyZS4KLQkoX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltKTogRGVjbGFyZS4KLQkoX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3MpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLUZyaSBTZXAgIDEgMTM6MjA6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRml4IHR5cG8uCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSGFuZGxlIGluZGlyZWN0IGFuZAotCXdhcm5pbmcgc3ltYm9scy4gIElmIGFueSBzZWN0aW9uIGlzIG5hbWVkIC5nbnUud2FybmluZy5YWFgsIHRyZWF0Ci0JdGhlIGNvbnRlbnRzIGFzIGEgd2FybmluZyB0byBiZSBpc3N1ZWQgaWYgdGhlIHN5bWJvbCBYWFggaXMKLQlyZWZlcmVuY2VkLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogRm9yIGFuIGluZGlyZWN0IG9yIHdhcm5pbmcgc3ltYm9sLCBqdXN0Ci0Jb3V0cHV0IHRoZSBzeW1ib2wgaXQgcG9pbnRzIHRvLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyk6IERvbid0IGJvdGhlciB0byBzZXQgYmZkX2Vycm9yCi0JaWYgYmZkX2hhc2hfYWxsb2NhdGUgZmFpbHMsIHNpbmNlIGl0IHdpbGwgYWxyZWFkeSBiZSBzZXQuCi0JKGdlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpOiBMaWtld2lzZS4KLQkoYXJjaGl2ZV9oYXNoX25ld2Z1bmMpOiBMaWtld2lzZS4KLQkoaGFzaF9lbnRyeV9iZmQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFBhc3MgbmV3IGFyZ3VtZW50cyB0byB3YXJuaW5nCi0JY2FsbGJhY2suICBBbGxvY2F0ZSBhIG5ldyB3YXJuaW5nIHVzaW5nIHRoZSBoYXNoIHRhYmxlIG5ld2Z1bmMuCi0JVXNlIGJmZF9oYXNoX3JlcGxhY2UgdG8gdXBkYXRlIHRoZSBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSwgcmF0aGVyCi0JdGhhbiBhc3N1bWluZyB3ZSBjYW4gY29weSB0aGUgZmllbGRzIHdpdGggc3RydWN0dXJlIGFzc2lnbm1lbnQuCi0KLQkqIGhhc2guYyAoYmZkX2hhc2hfcmVwbGFjZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfaGFzaF9yZXBsYWNlKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotRnJpIFNlcCAgMSAwODoxMjo1MCAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBiZWF1dHkuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIG1pcHMqdnI0MzAwLSotZWxmKiB0YXJnZXQuCi0JKiBjb25maWcvbWlwc2J2cjQzMDAubXQ6IEFkZGVkLgotCi1UaHUgQXVnIDMxIDE2OjAwOjUzIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogYW91dC10YXJnZXQuaCAoTVlfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKiBiZmQtaW4uaCAoUEUgU1RVRkYpOiBEZWxldGVkLgotCSogYmZkLmMgKHRkYXRhLT5wZV9vYmpfZGF0YSk6IE5ldy4KLQkoYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKiBjb2ZmLWkzODYuYywgY29mZi1hcm0uYyAoY29mZl8qLXJ0eXBlX3RvX2hvd3RvKTogR2V0IGltYWdlIGJhc2UgZnJvbQotCW5ldyBwbGFjZS4KLQkqIGxpYmNvZmYuaCwgbGliYmZkLmgsIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGNvZmZjb2RlLmggKHBlX3ZhbHVlKTogRGVsZXRlCi0JKGNvZmZfbWtvYmplY3QsIGNvZmZfbWtvYmplY3RfaG9vayk6IENvbmRpdGlvbmFsbHkgYnVpbGQuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTG9vayBpbiBuZXcgcGxhY2UuCi0JKGFkZF9kYXRhX2VudHJ5LCBmaWxsX3BlX2hlYWRlcl9pbmZvKTogRGVsZXRlZC4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmUgUEUgc3R1ZmYuCi0JKGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKiBjb2Zmc3dhcC5oOiBSZW1vdmUgUEUgc3R1ZmYuCi0JKiBlbGZ4eC10YXJnZXQuaCAoYmZkX2VsZk5OX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkqIGxpYmNvZmYtaW4uaCAocGVfZGF0YV90eXBlKTogTmV3LgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkqIHRhcmdldHMuYyAoX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCSogcGVpY29kZS5oOiBOZXcgZmlsZS4KLQotVGh1IEF1ZyAzMSAxMTo0OToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oOiBBZGQgZXh0ZXJuICJDIiBpZiBfX2NwbHVzcGx1cy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGNvbnZlcnQgYSByZWxvYwotCWFnYWluc3QgYW4gYWJzb2x1dGUgc3ltYm9sIGludG8gYSByZWxvYyBhZ2FpbnN0IGEgc2VjdGlvbi4KLQotVGh1IEF1ZyAzMSAwODowMDoxNCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2MpOiBGaXggY29tbW9uIHNpemUgcHJvYmxlbS4KLQkoaTNjb2ZmX29iamVjdF9wKTogRGVsZXRlLgotCi1XZWQgQXVnIDMwIDIwOjQxOjI3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGRlbGV0ZW1lYWNvZmZfYXJtX3JlbG9jKTogRGVsZXRlZC4KLQkoYXJtMjYpOiBOb3QgcGFydGlhbCBpbnBsYWNlLgotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBEb24ndAotCWRvIHBhZ2UgYWxpZ25pbmcgaWYgQ09GRl9QQUdFX1NJWkUgaXNuJ3QgZGVmaW5lZC4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9zY25oZHJfaW4pOiBVcGRhdGUgaW1hZ2UgYmFzZSBjb3JyZWN0bHkuCi0KLVR1ZSBBdWcgMjkgMTM6NTA6MjEgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOgotCUNvbXBpbGUgZXZlbiBpZiBDT0ZGX1BBR0VfU0laRSBpc24ndCBkZWZpbmVkLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyYXRlX3JlbG9jX3NlY3Rpb24pOiBXcml0ZQotCWJhc2UgZmlsZSBpbmZvIGFzIHJ2YXMuCi0JKiBjb2ZmLWFybS5jIChjb2ZmX3J0eXBlX3RvX2hvd3RvKTogRGVhbCB3aXRoIHJlbG9jIDExLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmUgI2lmMGVkIGNvZGUKLQlPbmx5IHJlbW92ZSBlbXB0eSBzZWN0aW9ucyBpbiBQRSBpbm1hZ2UgZmlsZXMuCi0JKiBsaWJiZmQuaCwgYmZkLWluMi5oOiByZWdlbmVyYXRlZC4KLQkqIGNvZmYtYXJtLmMgKGFvdXRhcm1fc3RkX3JlbG8pOiBOZXcgZW50cnkgYXQgMTEuCi0JKGFybV9yZWxvY190eXBlX2xvb2t1cCkgOiBVbmRlcnN0YW5kIHR5cGUgMTEuCi0JKiBjb2ZmLWkzODYuYyAoaG93dG9fdGFibGUpOiBmaXggbmFtZSBvZiBydmEgdHlwZS4KLQkoY29mZi1pMzg2X3J0eXBlX3RvX2hvd3RvKTogVW5kZXJzdGFuZCBSX0lNQUdFQkFTRSB0eXBlLgotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiAuZWRhdGEgaXMgZGF0YS4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBHZXQgcGFnZSBzaXplIHJpZ2h0IGZvciBQRS4KLQlQYWdlc2l6ZSBpbmZvIGlzIG9ubHkgdmFsaWQgaW4gUEUgaW1hZ2UgZmlsZXMuCi0JKGZpbGxfcGVfaGVhZGVyX2luZm8pOiBGaXggZmllbGRzLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZSBlbmRfb2ZfaW1hZ2UgY2FsYy4KLQkoX2JmZF9jb2ZmX2dlbmVyYXRlX3JlbG9jX3NlY3Rpb24pOiBSZW1vdmUgb3JwaGFuZWQgY29tbWVudC4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9zY25oZHJfaW4pOiBEb24ndCBhbHdheXMgYWRkIElNQUdFX0JBU0UuCi0JU3dhcCBpbiBQRSBoZWFkZXIuCi0JKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogU2V0dXAgUEUgZmxhZ3MgY29ycmVjdGx5LgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX1JWQSk6IE5ldyBmaWVsZC4KLQotVGh1IEF1ZyAyNCAxNzo0OTo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBpbmNsdWRlIGxpbmUgbnVtYmVycyBmb3IKLQlhIHNlY3Rpb24gaWYgaXRzIG91dHB1dCBzZWN0aW9uIGhhcyBubyBjb250ZW50cy4KLQotV2VkIEF1ZyAyMyAxNjo0ODo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6IEFkZCBwYXJlbnRoZXNlcyB0byBGSVgKLQlleHByZXNzaW9uIHRvIGF2b2lkIGNvbXBpbGVyIGJ1ZyBvbiBIUC1VWCA5LjAxLgotCi1XZWQgQXVnIDIzIDA5OjQ5OjM5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChwZV92YWx1ZSk6IFVuYW5zaWZ5LgotCi1Nb24gQXVnIDIxIDE3OjQ5OjI4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oIChiZmRfbGlua19zdWJzeXN0ZW0pOiBUdXJuIGVudW0gaW50byAjZGVmaW5lcy4KLQkoYmZkX2xpbmtfcGVfaW5mb19kdmFsKTogTmV3Ci0JKGJmZF9saW5rX3N0YWNrX2hlYXApOiBSZW5hbWVkIGFuZCBtYXNzYWdlZCBpbnRvIGJmZF9saW5rX3BlX2luZm8uCi0JKiBiZmQtaW4yLmg6IHJlYnVpbHQuCi0JKiBiZmQuYyAoTlRfc3Vic3lzdGVtLCBOVF9zdGFja19oZWFwKTogRGVsZXRlZC4KLQkqIGNvZmZjb2RlLmggKHBlX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgotCShmaWxsX3BlX2hlYWRlcl9pbmZvKTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSBuZXcgZnVuY3Rpb24uCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSW5pdGlhbHplIGxpbmtfZGF0YSBpZiBub3Qgc2V0LgotCSogY29mZmxpbmsuYyAoY29mZl9maW5hbF9saW5rX2luZm8pOiBSZW1vdmUgcGUgcmFuZG9tbmVzcy4KLQkoZG9yZXNfY29tKTogVXBkYXRlIGluZm8gaW4gYmZkX2xpbmtfcGVfaW5mb19kdmFsLgotCShwcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzKTogVXNlIHRoZSBiZmRfbGlua19wZV9pbmZvX2R2YWwuCi0JKF9iZmRfY29mZl9maW5hbF9saW5rKTogUmVtb3ZlIFBFIHN0dWZmLCBpbml0aWFsaXplCi0JY29mZl9kYXRhLT5saW5rX2luZm8uCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfW2FvdXR8ZmlsZWhkcl1fb3V0KTogVXNlIGluZGlyZWN0IFBFIHBvaW50ZXIuCi0JKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogVXNlIHJlYWwgaW1hZ2ViYXNlLgotCSogbGliY29mZi1pbi5oIChjb2ZmX2RhdGFfdHlwZS5saW5rX2luZm8pOiBOZXcgZmllbGQuCi0KLU1vbiBBdWcgMjEgMTE6MTA6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAobGlua19hY3Rpb24pOiBJZiBhbiB1bmRlZmluZWQgcmVmZXJlbmNlIGZvbGxvd3MgYW4KLQl1bmRlZmluZWQgd2VhayByZWZlcmVuY2UsIGNoYW5nZSB0aGUgdHlwZSB0byB1bmRlZmluZWQuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBEb24ndCByZWNvcmQgYW4KLQl1bmRlZmluZWQgd2VhayByZWZlcmVuY2UgYXMgZGVmaW5lZCwgaW4gY2FzZSBpdCB0dXJucyBpbnRvIGEgcmVhbAotCXVuZGVmaW5lZCByZWZlcmVuY2UgbGF0ZXIgaW4gdGhlIHNhbWUgYXJjaGl2ZS4KLQotVGh1IEF1ZyAxNyAxNjoyOTowOSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoc2hfcmVsYXhfc2VjdGlvbik6IENhc3QgdmFsdWUgZm9yIHVzZWRfYnlfYmZkIGZpZWxkCi0JdG8gUFRSLCBub3QgY29mZl9zZWN0aW9uX3RkYXRhIHBvaW50ZXIsIHNpbmNlIFBUUiBpcyB0aGUgcmVhbCB0eXBlCi0Jb2YgdGhlIGZpZWxkLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzKTogRGl0dG8uCi0KLVRodSBBdWcgMTcgMTQ6NDQ6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQWRkIHN1cHBvcnQgZm9yIGxpbmtpbmcgU1BBUkMgU3VuT1MgUElDIGNvbXBpbGVkIGNvZGUuCi0JKiBzdW5vcy5jIChTUEFSQ19QTFRfUElDX1dPUkQwKTogRGVmaW5lLgotCShTUEFSQ19QTFRfUElDX1dPUkQxLCBTUEFSQ19QTFRfUElDX1dPUkQyKTogRGVmaW5lLgotCShzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5KTogQWRkIGdvdF9vZmZzZXQgYW5kIHBsdF9vZmZzZXQKLQlmaWVsZHMuCi0JKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUpOiBBZGQgZHluYW1pY19zZWN0aW9uc19jcmVhdGVkIGFuZAotCWR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkIGZpZWxkcy4KLQkoc3Vub3NfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dAotCW9mIHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMuCi0JKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBDYWxsIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCShzdW5vc19hZGRfb25lX3N5bWJvbCk6IENhbGwgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0JKGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDYWxsIHN1bm9zX3NjYW5fcmVsb2NzIGJlZm9yZQotCWNoZWNraW5nIHdoZXRoZXIgd2UgbmVlZCB0byBzZXQgdXAgdGhlIGR5bmFtaWMgbGluayBpbmZvcm1hdGlvbi4KLQlEZWZpbmUgX19HTE9CQUxfT0ZGU0VUX1RBQkxFIGlmIGFueXRoaW5nIHJlZmVycmVkIHRvIGl0LgotCShzdW5vc19zY2FuX3N0ZF9yZWxvY3MpOiBDYWxsIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLiAgVXNlCi0JcGx0X29mZnNldCBmaWVsZDsgb25seSBwdXQgc3ltYm9sIGluIC5wbHQgaWYgaXQgaXMgbm90IGRlZmluZWQgYnkKLQlhIHJlZ3VsYXIgb2JqZWN0LgotCShzdW5vc19zY2FuX2V4dF9yZWxvY3MpOiBMaWtld2lzZS4gIEhhbmRsZSBiYXNlIHJlbGF0aXZlIHJlbG9jcy4KLQkoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IFN0b3JlIGR5bm9iaiBpbiBsb2NhbCB2YXJpYWJsZS4KLQkoc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wpOiBDaGVjayBwbHRfb2Zmc2V0IHJhdGhlciB0aGFuCi0JY2hlY2tpbmcgd2hldGhlciBzeW1ib2wgaXMgaW4gLnBsdCBzZWN0aW9uLiAgSWYgc3ltYm9sIGlzIGRlZmluZWQKLQlpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsIHVzZSBTUEFSQ19QTFRfUElDX1dPUkRbMDEyXSwgYW5kIGRvbid0Ci0JYWRkIGEgSk1QX1RCTCByZWxvYy4KLQkoc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYyk6IEFkZCBjb250ZW50cyBhbmQgcmVsb2NhdGlvbnAgZmllbGRzLgotCUlmIHBsdF9vZmZzZXQgaXMgc2V0LCByZWRpcmVjdCByZWxvY2F0aW9uIHRvIFBMVC4gIElmIHRoaXMgaXMgYQotCWJhc2UgcmVsYXRpdmUgcmVsb2MsIHJlZGlyZWN0IHJlbG9jYXRpb24gdG8gR09ULiAgQ2hlY2sKLQlkeW5hbWljX3NlY3Rpb25zX25lZWRlZCBmaWVsZCByYXRoZXIgdGhhbiB3aGV0aGVyIGR5bm9iaiBpcyBzZXQuCi0JKHN1bm9zX2ZpbmlzaF9keW5hbWljX2xpbmspOiBDaGVjayBkeW5hbWljX3NlY3Rpb25zX25lZWRlZCBmaWVsZAotCXJhdGhlciB0aGFuIHdoZXRoZXIgZHlub2JqIGlzIHNldC4gIERvbid0IGRpZSBpZiAubmVlZCBhbmQgLnJ1bGVzCi0Jc2VjdGlvbnMgd2VyZSBub3QgY3JlYXRlZC4KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX2V4dCk6IE1hcmsgUEMxMCwgUEMyMiwgYW5kIEpNUF9UQkwgZW50cmllcwotCVBDIHJlbGF0aXZlLiAgTWFyayBQQzEwIGNvbXBsYWluX292ZXJmbG93X2RvbnQuICBNYXJrIFBDMjIgYW5kCi0JSk1QX1RCTCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQuCi0JKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IElmIGluZm8tPnNoYXJlZCBpcyBzZXQsIHNldCBEWU5BTUlDLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBDYWxsIGNoZWNrX2R5bmFtaWNfcmVsb2MgZm9yIGFsbAotCXJlbG9jcy4gIFBhc3MgY29udGVudHMgYW5kICZyZWxvY2F0aW9uLiAgRG9uJ3Qgd2FybiBhYm91dCBhbgotCXVuZGVmaW5lZCBzeW1ib2wgdW50aWwgY2hlY2tfZHluYW1pY19yZWxvYyBoYXMgYmVlbiBjYWxsZWQuICBEb24ndAotCXdhcm4gYWJvdXQgYW4gdW5kZWZpbmVkIHN5bWJvbCBmb3IgYSBiYXNlIHJlbGF0aXZlIHJlbG9jLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4gIEZvciBhIGJhc2UgcmVsYXRpdmUKLQlyZWxvYywgYWx3YXlzIHRyZWF0IHJfaW5kZXggYXMgYW4gaW5kZXggaW50byB0aGUgc3ltYm9sIHRhYmxlLgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBBZGQgY29udGVudHMgYW5kCi0JcmVsb2NhdGlvbiBhcmd1bWVudCB0byBjaGVja19keW5hbWljX3JlbG9jIGVudHJ5IHBvaW50LgotCShzdHJ1Y3QgYW91dGRhdGEpOiBBZGQgbG9jYWxfZ290X29mZnNldHMgZmllbGQuCi0KLVdlZCBBdWcgMTYgMDE6MDM6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IEZpeCBidWcgaW4gbGFzdCBjaGFuZ2UuCi0KLU1vbiBBdWcgMTQgMTE6Mzk6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IEhhbmRsZSBhIG1hY2hpbmUgb2YKLQliZmRfbWFjaF9zcGFyYyBvciBiZmRfbWFjaF9zcGFyYzY0LgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGEgc3ltYm9sIGlzIGEgd2VhawotCWRlZmluaXRpb24sIGFkZCBpdCB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgaWYgYW55IGR5bmFtaWMKLQlvYmplY3QgbWVudGlvbnMgaXQuICBJZiB3ZSBkbyBhZGQgaXQsIG1ha2Ugc3VyZSB3ZSBhZGQgdGhlCi0JY29ycmVzcG9uZGluZyByZWFsIHN5bWJvbC4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEFkanVzdCBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgd2hpY2ggd2UKLQlwdXQgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBldmVuIGlmIG5vIHJlZ3VsYXIgb2JqZWN0IHJlZmVycwotCXRvIGl0LgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkCi0JbGlicmFyeSwgZG9uJ3QgYWxsb2NhdGUgc3BhY2UgZm9yIGEgUEMgcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCBhCi0JbG9jYWwgc3ltYm9sLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19jaGVja19yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBDaGFuZ2UgYXNzZXJ0aW9uCi0JdG8gYWNjZXB0IHN5bWJvbCB3aXRoIHdlYWtkZWYgc2V0LgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogV2hlbiBjcmVhdGluZyBhIHNoYXJlZAotCWxpYmFyeSwgZG9uJ3QgY29weSBvdmVyIGEgUEMgcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCBhIGxvY2FsCi0Jc3ltYm9sLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi1TdW4gQXVnIDEzIDAwOjQwOjU4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uaCAoUl9IUFBBX0JFR0lOX0JSVEFCKTogRGVmaW5lLgotCShSX0hQUEFfRU5EX0JSVEFCKTogTGlrZXdpc2UuCi0JKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0JFR0lOX0JSVEFCIGFuZCBSX0VORF9CUlRBQi4KLQotVGh1IEF1ZyAxMCAxNTo1MzoyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBTd2FwIHRoZSBhcnJheSBkaW1lbnNpb25zCi0Jd2hlbmV2ZXIgeF9mY25hcnkgaXMgbm90IGJlaW5nIHVzZWQgZm9yIHNvbWV0aGluZyBlbHNlLCByYXRoZXIKLQl0aGFuIG9ubHkgZm9yIGFuIGFycmF5LgotCShjb2ZmX3N3YXBfYXV4X291dCk6IExpa2V3aXNlLgotCi1UdWUgQXVnICA4IDE2OjM0OjU3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgbW9zdAotCW9mIHNwZWNpYWwgY2FzZSBzdHVmZiBmb3IgUEUuICBOb3cgaGFuZGxlZCBieSByZWxvY3MuCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jKTogU3BlY2lhbCBjYXNlIG9mIFBFIHR5cGUgN3MuCi0JKGhvd3RvX3RhYmxlKTogVHlwZSA3IGlzIGRpcjMyLXJ2YS4KLQotVHVlIEF1ZyAgOCAxMDoxNTo0MyAxOTk1ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFJlY29nbml6ZSBhaXg0IGV4cGxpY2l0bHkuCi0JKiByczYwMDAtY29yZS5jIChDT1JFX0RBVEFfU0laRV9GSUVMRCk6IE5ldyBtYWNybyB0byBnZXQgYSB0aGUgc2l6ZQotCW9mIGEgY29yZSBkdW1wJ3MgZGF0YSBzZWN0aW9uLiAgUHJvdmlkZSBhbHRlcm5hdGUgZGVmaW5pdGlvbiBmb3IgYWl4NC4KLQkoU0FWRV9GSUVMRCk6IFNpbWlsYXJseSBmb3Igc2F2ZSBzdGF0ZSBmaWVsZCAocmVnaXN0ZXIgaW5mbykuCi0JKFNUQUNLX0VORF9BRERSKTogUHJvdmlkZSBkZWZpbml0aW9uIHN1aXRhYmxlIGZvciBhaXg0LgotCSogY29uZmlnL3thaXg0Lm1oLGFpeDQubXR9OiBOZXcgY29uZmlndXJhdGlvbiBmaWxlcy4KLQkqIGhvc3RzL2FpeDQuaDogTGlrZXdpc2UuCi0KLU1vbiBBdWcgIDcgMjM6MDM6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzb20uYyAoc29tX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBDYXN0IGluaXRpYWxpemF0aW9ucwotCXRvIGF2b2lkIHdhcm5pbmdzLgotCi1Nb24gQXVnICA3IDE0OjUxOjA4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2RlY29kZV9zeW1jbGFzcyk6IEhhbmRsZSBhYnNvbHV0ZSBzeW1ib2xzIGJ5IGNoZWNraW5nCi0JdGhlIFNPTSB0eXBlIChzaW5jZSB0aGV5IHdpbGwgcmFyZWx5IGlmIGV2ZXIgYmUgaW4gdGhlIGFic29sdXRlCi0Jc2VjdGlvbikuCi0KLVdlZCBBdWcgIDYgMDk6MTI6NTAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfc3BhcmMsIGJmZF9tYWNoX3NwYXJjNjQpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogY3B1LXNwYXJjLmMgKHNwYXJjX2FyY2hfaW5mbyk6IFJlbmFtZWQgZnJvbSBhcmNoX2luZm9fc3RydWN0LgotCShzcGFyYzY0X2FyY2hfaW5mbyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGJmZF9zcGFyY19hcmNoKTogTGluayBpbiBzcGFyYzY0X2FyY2hfaW5mby4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3h4eCk6IFJlbmFtZWQgZnJvbSBlbGY2NF94eHguCi0JKHNwYXJjNjRfZWxmX29iamVjdF9wKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfb2JqZWN0X3ApOiBEZWZpbmUuCi0JKiBjb25maWcvc3BhcmM2NC1lbGYubXQgKFNFTEVDVF9WRUNTKTogQWRkIGJmZF9lbGYzMl9zcGFyY192ZWMuCi0KLVNhdCBBdWcgIDUgMDA6MDQ6MDggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbSAoc29tX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IFJldHVybiAtMSBvbiBlcnJvci4gIENvbXB1dGUKLQlyZXR1cm4gdmFsdWUgd2l0aCBzaXplb2YgKGFyZWxlbnQgKiksIG5vdCBzaXplb2YgKGFyZWxlbnQpLgotCi1XZWQgQXVnICAyIDEyOjMyOjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IElmIHRoZSBzZWN0aW9uIHBvaW50ZWQgdG8gYnkgdGhlCi0Jc2hfbGluayBmaWVsZCBvZiBhIHJlbG9jIHNlY3Rpb24gaXMgbm90IGEgc3ltYm9sIHRhYmxlLCBhbmQgdGhlCi0JZmlsZSBjb250YWlucyBhIHNpbmdsZSBzeW1ib2wgdGFibGUsIGNsb2JiZXIgdGhlIHNoX2xpbmsgZmllbGQgb2YKLQl0aGUgcmVsb2Mgc2VjdGlvbiB0byBwb2ludCB0byB0aGUgc3ltYm9sIHRhYmxlLgotCi1UdWUgQXVnICAxIDEwOjA5OjAxIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGhvd3RvIHJlbG9jIEFSTTI2KTogQ2hhbmdlIHNpemUgZnJvbSAzIHRvIDIuCi0JKGhvd3RvIHJlbG9jIEFSTTI2RCk6IExpa2V3aXNlLgotCi1Nb24gSnVsIDI0IDE0OjE3OjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IFVzZSB0aGUgbGluZSBqdXN0IGJlZm9yZQotCXRoZSBvZmZzZXQsIG5vdCB0aGUgb25lIGp1c3QgYWZ0ZXIuICBCcmVhayBvdXQgb2YgdGhlIGxvb3AgYWZ0ZXIKLQlmaW5kaW5nIGEgZnVuY3Rpb24gcGFzdCB0aGUgb2Zmc2V0LCBub3QgbWVyZWx5IHdoZW4gZmluZGluZyBhCi0JZnVuY3Rpb24gd2l0aCBhIGxpbmUgZGVmaW5lZC4KLQotCSogZWNvZmZsaW5rLmMgKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUpOiBXaGVuIGhhbmRsaW5nIHN0YWJzOgotCWNvcnJlY3Qgc2V0dGluZyBvZiBzeW1fcHRyX2VuZCB0byBjb25zaWRlciBzeW1ib2xzIHNraXBwZWQgd2hlbgotCXNldHRpbmcgc3ltX3B0cjsgZG9uJ3QgbGVhdmUgbG9vcCBlYXJseSB1bmxlc3MgYW4gTl9GVU4gaXMgZm91bmQKLQl3aXRoIGEgbGFyZ2VyIHZhbHVlLgotCi0JKiBjb2ZmLXNoLmMgKHNoX2NvZmZfaG93dG9zKTogTWFyayBSX1NIX1BDRElTUDhCWTIgYW5kIFJfU0hfUENESVNQCi0JYXMgUEMgcmVsYXRpdmUuICBEZXNjcmliZSBSX1NIX0lNTTE2LiAgQWRkIGVudHJpZXMgZm9yCi0JUl9TSF9TV0lUQ0gxNiwgUl9TSF9TV0lUQ0gzMiwgUl9TSF9VU0VTLCBSX1NIX0NPVU5ULCBhbmQKLQlSX1NIX0FMSUdOLgotCShTV0FQX0lOX1JFTE9DX09GRlNFVCk6IERlZmluZS4KLQkoU1dBUF9PVVRfUkVMT0NfT0ZGU0VUKTogRGVmaW5lLgotCShDQUxDX0FEREVORCk6IERlZmluZS4KLQkoc2hfcmVsb2MpOiBDaGFuZ2Ugc3ltX3ZhbHVlIGFuZCBhZGRyIHRvIHR5cGUgYmZkX3ZtYS4gIFNraXAgcmVsb2MKLQl0eXBlcyBvdGhlciB0aGFuIFJfU0hfSU1NMzIgYW5kIFJfU0hfUENESVNQIG9uIGFuIGV4dGVybmFsIHN5bWJvbC4KLQkoY29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KLQkoY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRGVmaW5lLgotCShzaF9yZWxheF9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc2hfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBSX1NIX1BDRElTUCBvbiBhbiBleHRlcm5hbCBzeW1ib2wuCi0JKHNoX2NvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENhbGwKLQlfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMsIG5vdCBjb2ZmX2xpbmtfZ2V0X3N5bWJvbHMuICBDYWxsCi0JX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scywgbm90IGNvZmZfbGlua19mcmVlX3N5bWJvbHMuICBDYWxsCi0JX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlLCBub3QgY29mZl9yZWFkX3N0cmluZ190YWJsZS4KLQkoY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IExpa2V3aXNlLgotCShjb2ZmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0JKGNvZmZfbGlua19nZXRfc3ltYm9scyk6IE1vdmUgdG8gY29mZmdlbi5jLgotCShjb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogTGlrZXdpc2UuCi0JKGNvZmZfbGlua19mcmVlX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBVc2UgX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lLgotCShjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoY29mZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9saW5rX2lucHV0X2JmZCk6IFVzZSBjYWNoZWQgc2VjdGlvbiBjb250ZW50cyBpZiBhdmFpbGFibGUuCi0JVXNlIF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3QgY2FsbCBiZmRfc2Vlay4KLQkoY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogT25seSBkZWZpbmUgaWYgbm90Ci0JYWxyZWFkeSBkZWZpbmVkLgotCShjb2ZmX2JmZF9yZWxheF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmZ2VuLmMgKGJ1aWxkX3N0cmluZ190YWJsZSk6IFJlbW92ZS4KLQkoX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLCBtb3ZlZCBpbiBmcm9tIG9sZAotCWNvZmZfbGlua19nZXRfc3ltYm9scyBpbiBjb2ZmbGluay5jLgotCShfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBOZXcgZnVuY3Rpb24sIG1vdmVkIGluIGZyb20gb2xkCi0JY29mZl9yZWFkX3N0cmluZ190YWJsZSBpbiBjb2ZmbGluay5jLgotCShfYmZkX2NvZmZfZnJlZV9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLCBtb3ZlZCBpbiBmcm1vIG9sZAotCWNvZmZfbGlua19mcmVlX3N5bWJvbHMgaW4gY29mZmxpbmsuYy4KLQkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBVc2UgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzCi0JcmF0aGVyIHRoYW4gcmVhZGluZyB0aGUgc3ltYm9scyBkaXJlY3RseS4gIFRvIGZyZWUgdGhlbSwgY2FsbAotCV9iZmRfY29mZl9mcmVlX3N5bWJvbHMuICBVc2UgX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIHJhdGhlcgotCXRoYW4gYnVpbGRfc3RyaW5nX3RhYmxlLgotCSogbGliY29mZi1pbi5oIChvYmpfY29mZl9rZWVwX3N5bXMpOiBEZWZpbmUuCi0JKG9ial9jb2ZmX2tlZXBfc3RyaW5ncyk6IERlZmluZS4KLQkoY29mZl9kYXRhX3R5cGUpOiBBZGQgZmllbGRzIGtlZXBfc3ltcyBhbmQga2VlcF9zdHJpbmdzLgotCShjb2ZmX3NlY3Rpb25fdGRhdGEpOiBEZWZpbmUgbmV3IHN0cnVjdHVyZS4KLQkoY29mZl9zZWN0aW9uX2RhdGEpOiBEZWZpbmUuCi0JKF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IERlY2xhcmUuCi0JKF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSk6IERlY2xhcmUuCi0JKF9iZmRfY29mZl9mcmVlX3N5bWJvbHMpOiBEZWNsYXJlLgotCShfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MpOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi1GcmkgSnVsIDIxIDIyOjMyOjU0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBBZGQgc3VwcG9ydCBmb3IgUl9QUENfU0RBUkVMCi0JcmVsb2NhdGlvbi4KLQkocHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IERpdHRvLgotCShwcGNfZWxmX2dvdDE2X2lubmVyKTogRGl0dG8uCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERpdHRvLgotCi1UaHUgSnVsIDIwIDE5OjE5OjA2IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogQWRkIG5ldyAoaWdub3JlZCkKLQlhcmd1bWVudC4KLQkqIGVsZjMyLWhwcGEuaDogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLVRodSBKdWwgMjAgMTk6MDE6MDcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmFvdXQuaCAoc2V0X2FvdXRfc2VjdGlvbl9kYXRhKTogTmV3IG1hY3JvLgotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9yZWxvY3MpOiBVc2UgaXQuCi0KLQkqIGFvdXQtbnMzMmsuYyAoTVlfc3dhcF9zdGRfcmVsb2Nfb3V0KTogVW5kZWYgS0VFUElUIGJlZm9yZQotCWRlZmluaW5nIGl0LgotCi1UaHUgSnVsIDIwIDEzOjQ4OjAwIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBob3N0cy9pMzg2djQuaCAoZ2V0Z2lkLCBnZXR1aWQpOiAgQ2hhbmdlIHByb3RvdHlwZXMgdG8gYmUKLQljb21wYXRpYmxlIHdpdGggVW5peHdhcmUgMS54IGFuZCBVbml4d2FyZSAyLngsIGFuZCBwcm9iYWJseSBvdGhlcgotCWkzODYgc3ZyNCB2ZXJzaW9ucyBhcyB3ZWxsLgotCi1UaHUgSnVsIDIwIDEzOjQxOjIxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogU2luY2UgYXJtcGUgYW5kIGFybXBlaSBoYXZlIGJlZW4KLQlzcGxpdCBpbnRvIGJpZy0gYW5kIGxpdHRsZS1lbmRpYW4gdmFyaWFudHMsIGxpc3QgYWxsIG9mIHRoZW0sCi0JaW5zdGVhZCBvZiB0aGUgbm93LW5vbmV4aXN0YW50IGFybXBlW2ldX3ZlYy4KLQotVGh1IEp1bCAyMCAwMDowNjozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBTZXQgbG1hIGJhc2VkIG9uIHBfcGFkZHIuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogU2V0IHNoX2FkZHIgYmFzZWQgb24gbG1hLCBub3Qgdm1hLgotCi1XZWQgSnVsIDE5IDE1OjUyOjAxIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKFRBUkdFVF9MSVRUTEVfU1lNLCBUQVJHRVRfQklHX1NZTSk6IFJlcGxhY2VzIFRBUkdFVF9TWU0uCi0JKiBjb25maWd1cmUuaW4gKGFybXBlX3ZlYywgYXJtcGVpX3ZlYyk6IEFkZCBiaS1lbmRpYW4gc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZTogInJlZ2VuZXJhdGVkIi4KLQkqIHBlLWFybS5jIChUQVJHRVRfTElUVExFX1NZTSwgVEFSR0VUX0JJR19TWU0pOiBSZXBsYWNlcyBUQVJHRVRfU1lNLgotCShUQVJHRVRfTElUVExFX05BTUUsIFRBUkdFVF9CSUdfTkFNRSk6IFJlcGxhY2VzIFRBUkdFVF9OQU1FLgotCSogcGVpLWFybS5jIChUQVJHRVRfTElUVExFX1NZTSwgVEFSR0VUX0JJR19TWU0pOiBSZXBsYWNlcyBUQVJHRVRfU1lNLgotCShUQVJHRVRfTElUVExFX05BTUUsIFRBUkdFVF9CSUdfTkFNRSk6IFJlcGxhY2VzIFRBUkdFVF9OQU1FLgotCSogdGFyZ2V0cy5jIChhcm1wZV92ZWMsIGFybXBlaV92ZWMpOiBEZWxldGVkLgotCShhcm1wZV9saXR0bGVfdmVjLCBhcm1wZV9iaWdfdmVjLCBhcm1wZWlfbGl0dGxlX3ZlYywgYXJtcGVpX2JpZ192ZWMpOgotCUFkZGVkLgotCSogY29uZmlnL2FybS1wZS5tdCAoREVGQVVMVF9WRUNUT1IpOiBEZWZhdWx0IGlzIGFybXBlX2xpdHRsZV92ZWMuCi0JKFNFTEVDVF9WRUNTKTogQWRkIGJpLWVuZGlhbiBzdXBwb3J0LgotCi1XZWQgSnVsIDE5IDEwOjQ3OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jOiBDbGVhbiB1cCBhbmQgY29tbWVudC4KLQkocl9pbW0zMik6IFJlbW92ZS4KLQkoc2hfY29mZl9ob3d0b3MpOiBOZXcgc3RhdGljIGFycmF5LgotCShTSF9DT0ZGX0hPV1RPX0NPVU5UKTogRGVmaW5lLgotCShnZXRfc3ltYm9sX3ZhbHVlKTogTWFrZSByZWxvY2F0aW9uIGJmZF92bWEgcmF0aGVyIHRoYW4gbG9uZy4KLQkoUlRZUEUySE9XVE8pOiBSZXdyaXRlIHRvIHVzZSBzaF9jb2ZmX2hvd3Rvcy4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lIHRvIHNoX3JlbG9jYXRlX3NlY3Rpb24uCi0JKHNoX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1TYXQgSnVsIDE1IDAxOjAyOjUzIDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlndXJlLmhvc3Q6ICBBZGQgc3VwcG9ydCBmb3IgZ2VuZXJpYyBtNjhrIFNWUjQgaG9zdC4KLQotRnJpIEp1bCAxNCAxMzoxMzo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKEtFRVBJVCk6IENoYW5nZSBkZWZpbml0aW9uIHRvIHVkYXRhLmkuCi0JKEtFRVBJVFRZUEUpOiBSZW1vdmUuCi0JKE5BTUUoYW91dCxyZWxvY190eXBlX2xvb2t1cCkpOiBBZGQgY2FzZXMgdG8gdGhlCi0JZXh0ZW5kZWQgcmVsb2MgdHlwZSBzd2l0Y2g6IFNQQVJDX0dPVDEwLCBTUEFSQ19HT1QxMywgU1BBUkNfR09UMjIsCi0JU1BBUkNfUEMxMCwgU1BBUkNfUEMyMiwgU1BBUkNfV1BMVDMwLgotCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KSk6IERvbid0IGJvdGhlciB0byB1c2Ugc3RvaSB3aGVuCi0JcmV0cmlldmluZyBLRUVQSVQgdmFsdWUuCi0JKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpKTogTGlrZXdpc2UuICBBbHNvLCBvbmx5IGFkZCBpbgotCW91dHB1dCBzZWN0aW9uIFZNQSBmb3Igc2VjdGlvbiBzeW1ib2xzLCBhbmQgY2hlY2sgQlNGX1NFQ1RJT05fU1lNCi0JdG8gY29udHJvbCB3aGV0aGVyIHRvIHNldCByX2V4dGVybiB0byAxLgotCi0JKiBzeW1zLmM6IEZpeCBjb21tZW50cyBzbyB0aGF0IGBtYWtlIGluZm8nIHdvcmtzLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogU2V0IFNFQ19IQVNfQ09OVEVOVFMKLQlpbiAubWRlYnVnIHNlY3Rpb24sIGluIGNhc2UgYmFja2VuZCBsaW5rZXIgaGFzIGNsZWFyZWQgaXQuCi0KLUZyaSBKdWwgMTQgMTE6NTg6MzQgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRyMTZfaGFfaW5uZXIpOiBSZXdyaXRlIHRvIHRha2UganVzdCBvbmUKLQlhcmd1bWVudCwgdGhlIGZpbmFsIHJlbG9jYXRlZCBhZGRyZXNzLgotCShwcGNfZWxmX2FkZHIxNl9oYV9pbm5lcik6IEFkanVzdCBwcGNfZWxmX2FkZHIxNl9oYV9pbm5lciBjYWxsZXIuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERpdHRvLgotCi1UaHUgSnVsIDEzIDE3OjIyOjAzIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBDaG9vc2UgYSByZWFzb25hYmxlIGZpZWxkCi0Jc2VsZWN0b3IgcmVsb2NhdGlvbiBmb3IgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMuCi0KLVRodSBKdWwgMTMgMTA6MzM6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKTogQ2FzdCBhcmd1bWVudCB0byBzaXplX3QKLQlmb3IgbWFsbG9jLgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLCBmb3IgbWVtbW92ZS4KLQkobWlwc19yZWxheF9zZWN0aW9uKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCi0JKiBjb2ZmbGluay5jIChwcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCShlY29mZl9maW5hbF9saW5rX2RlYnVnX2FjY3VtdWxhdGUpOiBMaWtld2lzZS4KLQkoZWNvZmZfaW5kaXJlY3RfbGlua19vcmRlcik6IExpa2V3aXNlLCBmb3IgbWVtY3B5IGFuZCBtYWxsb2MuCi0JKGVjb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkqIGVjb2ZmbGluay5jIChlY29mZl9hbGlnbl9kZWJ1Zyk6IExpa2V3aXNlLCBmb3IgbWVtc2V0LgotCShlY29mZl93cml0ZV9zeW1oZHIpOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvKTogTGlrZXdpc2UuCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBMaWtld2lzZSwgZm9yCi0JcXNvcnQuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IExpa2V3aXNlLCBmb3IgbWFsbG9jLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBMaWtld2lzZS4KLQkqIGVsZmNvcmUuaCAoZWxmX2NvcmVmaWxlX25vdGUpOiBMaWtld2lzZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGVsZl9saW5rX3JlYWRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogTGlrZXdpc2UsIGZvciBtZW1zZXQuCi0JKiBpMzg2bGludXguYyAoYmZkX2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogaWVlZS5jIChkb193aXRoX3JlbG9jcyk6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IExpa2V3aXNlLCBmb3IgbWFsbG9jLgotCSogbmxtY29kZS5oIChubG1fb2JqZWN0X3ApOiBMaWtld2lzZS4KLQkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCSogb2FzeXMuYyAob2FzeXNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZSwgZm9yIG1lbWNweS4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLAotCWZvciBtYWxsb2MuCi0JKiBzZWN0aW9uLmMgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLCBmb3IgbWVtY3B5LgotCSogc3JlYy5jIChzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZSwgZm9yCi0JcmVhbGxvYyBhbmQgbWVtc2V0LgotCShzdW5vc19zY2FuX3JlbG9jcyk6IExpa2V3aXNlLCBmb3IgbWFsbG9jLgotCShzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UsIGZvciByZWFsbG9jLgotCSogc3ltcy5jIChfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyk6IExpa2V3aXNlLCBmb3IgbWFsbG9jLgotCSogdmVyc2Fkb3MuYyAodmVyc2Fkb3NfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZSwgZm9yCi0JbWVtY3B5LgotCi0JKiBsaWJiZmQuYyAocmVhbF9yZWFkKTogQWRkIHByb3RvdHlwZS4gIENoYW5nZSBhcmd1bWVudCB0eXBlcyBmcm9tCi0JaW50IHRvIHNpemVfdC4KLQkoYmZkX3JlYWQpOiBDYXN0IHJlYWxfcmVhZCBhcmd1bWVudCB0byBzaXplX3QsIG5vdCBpbnQuCi0JKGJmZF93cml0ZSk6IENhc3QgZndyaXRlIGFyZ3VtZW50IHRvIHNpemVfdCwgbm90IGludC4KLQotCSogZWxmNjQtZ2VuLmMgKGVsZl9pbmZvX3RvX2hvd3RvKTogRml4IGRlZmluaXRpb24gZm9yIHJlY2VudCBlbGYuYwotCWNoYW5nZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRml4IHR5cG86IGNoYW5nZSB7JGVuYWJsZXZhbH0gdG8gJHtlbmFibGV2YWx9LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmbGluay5vLgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGQgZmllbGRzIF9yZWFkX21pbmlzeW1ib2xzIGFuZAotCV9taW5pc3ltYm9sX3RvX3N5bWJvbC4KLQkoQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyk6IEFkZCBfcmVhZF9taW5pc3ltYm9scyBhbmQKLQlfbWluaXN5bWJvbF90b19zeW1ib2wuCi0JKGJmZF9yZWFkX21pbmlzeW1ib2xzKTogRGVmaW5lLgotCShiZmRfbWluaXN5bWJvbF90b19zeW1ib2wpOiBEZWZpbmUuCi0JKiBzeW1zLmMgKF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzKTogRGVmaW5lLgotCShfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wpOiBEZWZpbmUuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scyk6IERlZmluZS4KLQkoX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wpOiBEZWZpbmUuCi0JKF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzKTogRGVjbGFyZS4KLQkoX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogYW91dHguaCAoTUlOSVNZTV9USFJFU0hPTEQpOiBEZWZpbmUuCi0JKE5BTUUoYW91dCxyZWFkX21pbmlzeW1ib2xzKSk6IE5ldyBmdW5jdGlvbi4KLQkoTkFNRShhb3V0LG1pbmlzeW1ib2xfdG9fc3ltYm9sKSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmFvdXQuaCAoTkFNRShhb3V0LHJlYWRfbWluaXN5bWJvbHMpKTogRGVjbGFyZS4KLQkoTkFNRShhb3V0LG1pbmlzeW1ib2xfdG9fc3ltYm9sKSk6IERlY2xhcmUuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9yZWFkX21pbmlzeW1ib2xzKTogRGVmaW5lLgotCShNWV9taW5pc3ltYm9sX3RvX3N5bWJvbCk6IERlZmluZS4KLQkqIEFsbCB0YXJnZXRzOiBEZWZpbmUgcmVhZF9taW5pc3ltYm9scyBhbmQgbWluaXN5bWJvbF90b19zeW1ib2wuCi0KLVdlZCBKdWwgMTIgMTc6NTU6NTUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbQotCWJmZF9hbGxvYy4KLQotCSogZWxmY29kZS5oIChzaXplX2luZm8pOiBEb24ndCB1c2UgIiYiIGJlZm9yZSBmdW5jdGlvbiBuYW1lcy4KLQotV2VkIEp1bCAxMiAwMDoxNjo0OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbT4KLQotCSogbGliZWxmLmggKGVsZl9iYWNrZW5kX2RhdGEpOiBVc2UgdW5zaWduZWQsIG5vdCB1bnNpZ25lZCBjaGFyLAotCWZvciBiaXRmaWVsZHMuCi0KLVR1ZSBKdWwgMTEgMTU6MTk6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogSW4gY2FzZSBTSFRfUkVMW0FdLCBvbmx5IGdldCB0aGUKLSAgICAgICAgQkZEIHNlY3Rpb24gZm9yIHRoZSBzaF9saW5rIHNlY3Rpb24gaWYgaXQgaXMgYSBTWU1UQUIgc2VjdGlvbi4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpKTogRG9uJ3QgYm90aGVyIHRvIGNoZWNrCi0JdGhhdCBhcmNoaXZlcyBob2xkIGEub3V0IG9iamVjdHMuCi0JKiBjZi1pMzg2bHlueC5jIChjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3QgZGVmaW5lLgotCShseW54X2xpbmtfYWRkX3N5bWJvbHMpOiBSZW1vdmUuCi0JKiBjZi1tNjhrbHlueC5jIChjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3QgZGVmaW5lLgotCShseW54X2xpbmtfYWRkX3N5bWJvbHMpOiBSZW1vdmUuCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGJvdGhlciB0byBjaGVjayB0aGF0Ci0JYXJjaGl2ZXMgaG9sZCBFTEYgb2JqZWN0cy4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBJZiB0aGUgYXJjaGl2ZSBoYXMgYSBtYXAsIGFuZAotCXRoZSB0YXJnZXQgd2FzIGRlZmF1bHRlZCwgYnV0IHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlIGFyY2hpdmUgY2FuCi0Jbm90IGJlIG1hdGNoZWQgd2l0aCB0aGF0IHRhcmdldCwgdGhlbiByZXR1cm4gYSBiYWQgZm9ybWF0IGVycm9yLgotCi0JKiBlbGY2NC1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBTZXQgaG93dG8gZm9yIFdESVNQMTYgdG8KLQllbGY2NF93ZGlzcDE2X3JlbG9jLgotCShlbGY2NF93ZGlzcDE2X3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmNjRfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX3NpemVfaW5mbyk6IENoYW5nZSB0eXBlIG9mIGxhc3QgYXJndW1lbnQgdG8KLQlzd2FwX3N5bWJvbF9vdXQgZnJvbSBjaGFyICogdG8gUFRSLgotCShiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0KTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0KTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9zd2FwX3N5bWJvbF9vdXQpOiBDaGFuZ2UgdHlwZSBvZiBjZHN0IGZyb20gY2hhciAqCi0JdG8gUFRSLgotCSogZWxmLmMgKHN3YXBfb3V0X3N5bXMpOiBDYXN0IHRvIFBUUiwgbm90IGNoYXIgKiwgd2hlbiBjYWxsaW5nCi0Jc3dhcF9zeW1ib2xfb3V0IHJvdXRpbmUuCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogTGlrZXdpc2UuCi0JKGVsZl9saW5rX291dHB1dF9zeW0pOiBMaWtld2lzZS4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotVHVlIEp1bCAxMSAxMjoyOTo0OSAxOTk1ICBSaWNrIFNsYWRrZXkgIDxqcnNAd29ybGQuc3RkLmNvbT4KLQotCSogZWxmLmMgKF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogSGFuZGxlIHRoZSBzaW1wbGUgY2FzZSB3aGVyZQotCXRoZXJlIGlzIG5vIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQotTW9uIEp1bCAxMCAxMTo0NTo1NSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogbWFrZWZpbGUuZG9zIChPQkpTKTogQWRkIGJpbmFyeS5vIGFuZCB0ZWtoZXguby4gIEZyb20gREoKLQlEZWxvcmllLgotCi1Nb24gSnVsIDEwIDExOjA5OjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKHNldF9zeW1ib2xfZnJvbV9oYXNoKTogYmZkX2xpbmtfaGFzaF9uZXcgY2FzZTogRG9uJ3QKLQlhYm9ydDsgaXQgY2FuIGhhcHBlbiBmb3IgY29uc3RydWN0b3Igc3ltYm9scyB3aGVuIG5vdCBidWlsZGluZwotCWNvbnN0cnVjdG9ycy4KLQotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY2F0ZSk6IENvcnJlY3QgdHlwbzogdXNlICEgb24gc3RyY21wLAotCW5vdCBvbiBzdHJpbmcuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHVudXNlZAotCWxvY2FsIGkuCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9ydHlwZV90b19ob3d0byk6IERvbid0IGRlY2xhcmUuCi0JKFBDUkVMT0ZGU0VUKTogRGVmaW5lIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtYXJtLm8KLQkoQ0ZJTEVTKTogQWRkIGNvZmYtYXJtLmMsIHBlLWFybS5jLCBwZWktYXJtLmMuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKSk6IEFsbG9jYXRlIGhhc2ggdGFibGUKLQl1c2luZyBiZmRfYWxsb2MsIG5vdCBtYWxsb2MuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCSogaTM4NmxpbnV4LmMgKGxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFpYi5jb20+OgotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IElmIC1Cc3ltYm9saWMsCi0Jb3V0cHV0IGEgRFRfU1lNQk9MSUMgZHluYW1pYyBlbnRyeS4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIC1Cc3ltYm9saWMsIGRvbid0IHJlcXVpcmUgYSBQTFQKLQllbnRyeSBmb3IgYSBsb2NhbGx5IGRlZmluZWQgc3ltYm9sLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgLUJzeW1ib2xpYywgZG8gd2FybgotCWFib3V0IHVuZGVmaW5lZCBzeW1ib2xzLCBhbmQgZmlsbCBpbiB0aGUgR09UIGVudHJ5IGZvciBhIHN5bWJvbAotCWRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLgotCShlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBJZiAtQnN5bWJvbGljLCBvdXRwdXQgYSBSRUxBVElWRQotCXJlbG9jIHJhdGhlciB0aGFuIGEgR0xPQl9EQVQgcmVsb2MgZm9yIGEgc3ltYm9sIGRlZmluZWQgaW4gYQotCXJlZ3VsYXIgb2JqZWN0IGZpbGUuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiAtQnN5bWJvbGljLCBkbyB3YXJuCi0JYWJvdXQgdW5kZWZpbmVkIHN5bWJvbHMsIGFuZCBmaWxsIGluIHRoZSBHT1QgZW50cnkgZm9yIGEgc3ltYm9sCi0JZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUuCi0JKGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IElmIC1Cc3ltYm9saWMsIG91dHB1dCBhIFJFTEFUSVZFCi0JcmVsb2MgcmF0aGVyIHRoYW4gYSBHTE9CX0RBVCByZWxvYyBmb3IgYSBzeW1ib2wgZGVmaW5lZCBpbiBhCi0JcmVndWxhciBvYmplY3QgZmlsZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiAtQnN5bWJvbGljLCBkbwotCXdhcm4gYWJvdXQgdW5kZWZpbmVkIHN5bWJvbHMsIGFuZCBmaWxsIGluIHRoZSBHT1QgZW50cnkgZm9yIGEKLQlzeW1ib2wgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUuCi0JKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IElmIC1Cc3ltYm9saWMsIG91dHB1dCBhCi0JUkVMQVRJVkUgcmVsb2MgcmF0aGVyIHRoYW4gYSBHTE9CX0RBVCByZWxvYyBmb3IgYSBzeW1ib2wgZGVmaW5lZAotCWluIGEgcmVndWxhciBvYmplY3QgZmlsZS4KLQotCSogY29uZmlnL202OGstY29mZi5tdCAoU0VMRUNUX1ZFQ1MpOiBSZW5hbWUgZnJvbSBTRUxFQ1RfVkVDVE9SUy4KLQlDb3JyZWN0IGVsZW1lbnRzIHRvIGJlIGFjdHVhbCBCRkQgdmVjdG9yIG5hbWVzLgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBEb24ndCBkZXBlbmQgdXBvbiBAZnJhZ3NALgotCShjb25maWcuc3RhdHVzKTogRGVwZW5kIHVwb24gQGZyYWdzQC4KLQotRnJpIEp1bCAgNyAxNzozNjo0NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogU29ydCBkZWZpbmVkIHN5bWJvbHMgdGhhdCBhcmUKLQluZWl0aGVyIEJTRl9GVU5DVElPTiBub3QgQlNGX05PVF9BVF9FTkQganVzdCBiZWZvcmUgdW5kZWZpbmVkCi0Jc3ltYm9scy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IEJTRl9GVU5DVElPTiBhcyB3ZWxsCi0JYXMgQlNGX05PVF9BVF9FTkQuCi0KLUZyaSBKdWwgIDcgMTc6MTY6MTUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkb19tb3N0bHljbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgotCShkb19kaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmNhY2hlLgotCi1UaHUgSnVsICA2IDE0OjM3OjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogUmV2ZXJ0IE1heSAyNCBwYXRjaC4KLSAgICAgICAgRG9uJ3QgY29weSBQQzMyIHJlbG9jIGFnYWluc3Qgc2VjdGlvbiBpbnRvIHNoYXJlZCBvYmplY3QuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkZWQgZWxmbGluay5jLgotCShNYWtlZmlsZSk6IERlcGVuZCB1cG9uIGNvbmZpZy5zdGF0dXMsIG5vdCBjb25maWd1cmUuaW4uCi0JKGNvbmZpZy5zdGF0dXMpOiBOZXcgdGFyZ2V0OyBkZXBlbmQgdXBvbiBjb25maWd1cmUgY29uZmlndXJlLmhvc3QKLQlhbmQgY29uZmlnLmJmZC4KLQotV2VkIEp1bCAgNSAyMDoxNzoxNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29yZS5oLCBlbGZsaW5rLmgsIGVsZmNvZGUuaCwgZWxmLmMsIGVsZmxpbmsuYzogTW92ZWQgc29tZQotIAlwcmltYXJpbHkgc2l6ZS1pbmRlcGVuZGVudCBjb2RlIGZyb20gZWxmY29kZS5oIHRvIGVsZi5jIGFuZCBuZXcKLSAJZmlsZSBlbGZsaW5rLmM7IG1vdmVkIG91dCBvdGhlciBjb3JlLSBvciBsaW5rZXItcmVsYXRlZCByb3V0aW5lcwotIAlpbnRvIG90aGVyIG5ldyAuaCBmaWxlcyBmb3IgY2xhcml0eS4gIFJlbmFtZWQgbWFueSByb3V0aW5lcyB0bwotIAlzdGFydCB3aXRoIGJmZF9lbGYgb3IgX2JmZF9lbGYuICBBZGRlZCBhIHN0cnVjdHVyZSBvZgotIAlzaXplLWRlcGVuZGVudCBidXQgdGFyZ2V0LWluZGVwZW5kZW50IGluZm8gdG8gZWxmY29kZS5oLgotCSogTWFrZWZpbGUuaW46IEJ1aWxkIGVsZmxpbmsuby4gIFVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0JKiBsaWJlbGYuaDogVXBkYXRlZCBzb21lIGRlY2xhcmF0aW9ucy4gIEFkZGVkIGEgZGVmaW5pdGlvbiBmb3IgdGhlCi0JbmV3IHN0cnVjdHVyZSBpbiBlbGZjb2RlLmguICBBZGRlZCBtb3JlIGZpZWxkcyB0byBlbGYgYmFja2VuZCBkYXRhCi0Jc3RydWN0dXJlLgotCSogZWxmeHgtdGFyZ2V0Lmg6IFJlZmVyIHRvIHRoZSBhcHByb3ByaWF0ZSBzaXplLWRlcGVuZGVudCBpbmZvLgotCSogZWxmMzItKi5jOiBDaGFuZ2VkIHNvbWUgZnVuY3Rpb24gbmFtZXMuICBNb3ZlZCBjb21tb24KLQljcmVhdGVfZHluYW1pY19zZWN0aW9ucyBjb2RlIGZyb20gbTY4aywgc3BhcmMsIGFuZCBpMzg2IHN1cHBvcnQKLQlpbnRvIGVsZmxpbmsuYy4gIERlZmluZSBzb21lIG5ldyBtYWNyb3MgdG8gZmlsbCBpbiBuZXcgZmllbGRzIG9mCi0JYmFjayBlbmQgZGF0YS4gIEFsc28gY2xlYW4gdXAgc29tZSAiZ2NjIC1XYWxsIiB3YXJuaW5ncyByZWdhcmRpbmcKLQl1bnVzZWQgb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuCi0KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IE5vLCBkb24ndCBwdXQgZWxmbGluay5vIGhlcmUuCi0JKiBjb25maWd1cmUuaW46IEluY2x1ZGUgaXQgaGVyZSB3aGVuZXZlciBlbGYubyBpcyBzcGVjaWZpZWQuCi0KLVdlZCBKdWwgIDUgMTA6MzE6NDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX29iamVjdF9wKTogVW5jb25kaXRpb25hbGx5IHNldAotCWVsZl9iYWRfc3ltdGFiLCBzaW5jZSBzb21ldGltZXMgdGhlIHN5bWJvbCB0YWJsZSBpcyBtZXNzZWQgdXAgYW5kCi0JdGhlIGxhc3Qgc3ltYm9sIGlzIGdsb2JhbC4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9iZmRfaXNfbG9jYWxfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbCk6IERlY2xhcmUuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2lzX2xvY2FsX2xhYmVsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbCk6IERlZmluZS4KLQotCSogY29uZmlndXJlLmluOiBVc2UgJGFjX2NvbmZpZ19zdWIsIG5vdCAkY29uZmlnc3ViLgotCSogY29uZmlndXJlOiBMaWtld2lzZS4KLQotCVBlcm1pdCAtLWVuYWJsZS10YXJnZXRzPWllZWU6Ci0JKiBjb25maWcuYmZkICgqLSotaWVlZSopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL2llZWUubXQ6IE5ldyBmaWxlLgotCi1XZWQgSnVsICA1IDA0OjE2OjM1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1wYy5jeWdudXMuY29tPgotCi0JKiBjb25maWcvaTM4NmFpeC5taCAoSERFRklORVMpOiBSZW1vdmUgLURGQVNDSVNUX0ZET1BFTi4KLQotCUF1dG9jb25maXNjYXRpb246Ci0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluLCBkb2MvTWFrZWZpbGUuaW46IFN3aXRjaCBmcm9tIEN5Z251cwotCWNvbmZpZ3VyZSB0byBhdXRvY29uZiB3YXlzIG9mIHByb2Nlc3NpbmcgLS1lbmFibGUgYXJndW1lbnRzLAotCXNldHRpbmcgdXAgc3ltbGlua3MsIGluY29ycG9yYXRpbmcgbWFrZWZpbGUgZnJhZ21lbnRzLCBwcmludGluZwotCW1lc3NhZ2VzIGF0IGNvbmZpZ3VyYXRpb24gdGltZSwgc2V0dGluZyB2YXJpYWJsZXMgaW4gTWFrZWZpbGUuCi0JRGVsZXRlZCBzb21lIHVudXNlZCB2YXJpYWJsZXMuICBDaGVjayBmb3IgcmFubGliIHZpYSBhdXRvY29uZi4KLQlGb3Igbm93LCBjb25maWd1cmUgc2NyaXB0IHJlbW92ZXMgZG9jL2NvbmZpZy5zdGF0dXMuCi0JKiBjb25maWd1cmU6IE5ldyBmaWxlLgotCSogZGVwLWluLnNlZDogVXNlIEBTUkNESVJAIGluc3RlYWQgb2YgQHNyY2RpckAsIHNvIE1ha2VmaWxlLmluCi0JbGluZSBkb2Vzbid0IGdldCBicm9rZW4gYnkgY29uZmlndXJlLgotCSogZG9jL2NvbmZpZ3VyZS5pbjogUmVtb3ZlZC4KLQotVHVlIEp1bCAgNCAxMjoyMjoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IElmCi0JQkZEX1RSQURJVElPTkFMX0ZPUk1BVCBpcyBzZXQsIGxpbWl0IHRoZSBsZW5ndGggb2YgYWxsIGZpbGUgbmFtZXMKLQl0byBhcl9tYXhfbmFtZWxlbi4KLQkoYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lKTogSWYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCBpcyBzZXQsIGNhbGwKLQliZmRfYnNkX3RydW5jYXRlX2FybmFtZS4KLQkoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogUmV2ZXJ0IEp1bmUgMSBjaGFuZ2UuCi0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpKTogQWRkIHByb3ZpZGUKLQlhcmd1bWVudC4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKGJmZF9lbGY2NF9yZWNvcmRfbGlua19hc3NpZ25tZW50KTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBuZWVkZWQgZmllbGQuICBSZW1vdmUKLQlzYXdfbmVlZGVkIGZpZWxkLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBlbGZfZHRfbmVlZGVkX25hbWUKLQlpcyBhbiBlbXB0eSBzdHJpbmcsIGRvbid0IG1ha2UgYSBEVF9ORUVERUQgZW50cnkgaW4gdGhlIG91dHB1dAotCWZpbGUuICBSZWNvcmQgYWxsIERUX05FRURFRCBlbnRyaWVzIGZvdW5kIGluIGlucHV0IGR5bmFtaWMKLQlvYmplY3RzLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogRG9uJ3QgY2hlY2sgc2F3X25lZWRlZCB3aGVuIGlzc3VpbmcKLQl3YXJuaW5ncy4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IEluaXRpYWxpemUgbmVlZGVkLCBub3QKLQlzYXdfbmVlZGVkLgotCShiZmRfZWxmX2dldF9uZWVkZWRfbGlzdCk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChzdHJ1Y3QgYmZkX2VsZl9saW5rX25lZWRlZF9saXN0KTogRGVmaW5lLgotCShiZmRfZWxmX2dldF9uZWVkZWRfbGlzdCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IEFsc28gaW5pdGlhbGl6ZQotCWZpbmRfYnVmZmVyIGFuZCBmZHJ0YWJfbGVuIGZpZWxkcyBvZiBuZXdseSBhbGxvY2F0ZWQKLQlmaW5kX2xpbmVfaW5mbyBzdHJ1Y3R1cmUuCi0KLU1vbiBKdWwgIDMgMTc6MDM6NTIgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IE5ldyBhcmd1bWVudCAic3ltX2RpZmYiLAotCW5vbnplcm8gd2hlbiB3ZSdyZSBnZW5lcmF0aW5nIHJlbG9jYXRpb25zIGZvciBhbiBleHByZXNzaW9uCi0JdXNpbmcgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCUhhbmRsZSBkaWZmZXJlbmNlIG9mIHN5bWJvbHMgZm9yIGJvdGggUl9IUFBBIGFuZCBSX0NPTVBMRVgKLQljYXNlcy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0NPTVAxLCBSX0NPTVAyIGFuZCBSX0NPREVfRVhQUgotCWZpeHVwcy4KLQotTW9uIEp1bCAgMyAxMzo1NToxOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkICh3aW4zMik6IE5ldyBjb25maWd1cmF0aW9uLgotCSogY29uZmlndXJlLmhvc3QgKHBlKTogQ2hhbmdlZCB0byBpMzg2d2luMzIuCi0JKiBjb25maWcvaTM4NnBlLm1oOiBEZWxldGVkLgotCSogY29uZmlnL2kzODZ3aW4zMi5taDogTmV3IGZpbGUuCi0KLU1vbiBKdWwgIDMgMTE6MzA6NDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogSWYgd2UgYWxsb2NhdGUKLQlmaW5kX2xpbmVfaW5mbywgY2xlYXIgdGhlIGZkcnRhYiBmaWVsZC4KLQotCSogdGFyZ2V0cy5jIChlbnVtIGJmZF9mbGF2b3VyKTogQWRkIGJmZF90YXJnZXRfbXNkb3NfZmxhdm91ciBoZXJlLAotCXJhdGhlciB0aGFuIGluIGJmZC1pbjIuaC4KLQotCSogYmZkLmMgKGVudW0gYmZkX2Vycm9yKTogRGVmaW5lIGJmZF9lcnJvcl9ub19hcm1hcC4KLQkoYmZkX2Vycm1zZ3MpOiBBZGQgc3RyaW5nIGZvciBiZmRfZXJyb3Jfbm9fYXJtYXAuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBJZiBhbiBhcmNoaXZlIGhhcyBubwotCWFybWFwLCBzZXQgYmZkX2Vycm9yX25vX2FybWFwIHJhdGhlciB0aGFuIGJmZF9lcnJvcl9ub19zeW1ib2xzLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IExpa2V3aXNlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFBlcm1pdCBjb21tb24gYW5kCi0JaW5kaXJlY3Qgc3ltYm9scyBpbiB3ZWFrZGVmcyBCRkRfQVNTRVJULgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBTaW1wbGlmeQotCUJGRF9BU1NFUlQgdG8gcGVybWl0IHNvbWUgbGVnYWwsIGJ1dCBvZGQsIGNhc2VzLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHZlcnNhZG9zLm8uCi0JKENGSUxFUyk6IEFkZCBwZS1pMzg2LmMsIHBlaS1pMzg2LmMsIGFuZCB2ZXJzYWRvcy5jLgotCi1TdW4gSnVsICAyIDE3OjQ5OjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IENhc3QgYmFzZV9maWxlCi0JdG8gRklMRSAqIGJlZm9yZSB1c2luZyBpdC4KLQkqIHN0YWItc3ltcy5jOiBSZXZlcnQgeWVzdGVyZGF5J3MgcGF0Y2guCi0KLVNhdCBKdWwgIDEgMTI6MTA6NDIgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHN0YWItc3ltcy5jIChzdGRpby5oKTogIEluY2x1ZGUgcHJpb3IgdG8gbGliYW91dC5oLCB3aGljaAotCWluY2x1ZGVzIGJmZGxpbmsuaCwgd2hpY2ggbm93IHVzZXMgRklMRS4KLQotU2F0IEp1bCAgMSAwMDoxMTowOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZWxmeHgtdGFyZ2V0Lmg6IE5ldyBmaWxlLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmUgZWxmXzY0X3AgZmllbGQuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmTk5fYmVkKTogRG9uJ3Qgc2V0IGl0LgotCi0JKiBlbGYzMi10YXJnZXQuaCwgZWxmNjQtdGFyZ2V0Lmg6IERlbGV0ZWQuCi0JKiBNYWtlZmlsZS5pbiAoZWxmMzItdGFyZ2V0LmgsIGVsZjY0LXRhcmdldC5oKTogQnVpbGQgdGhlbSBmcm9tCi0JZWxmeHgtdGFyZ2V0LmguCi0KLUZyaSBKdW4gMzAgMTY6MDc6MTggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IENvbXBhcmUKLQl0aGUgZnVsbCB0ZXh0IG9mIC5yZWxvYyBvciAuZWRhdGEgc2VjdGlvbiBuYW1lcy4KLQotRnJpIEp1biAzMCAxNTo0NzozNyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6Ci0JUmVtb3ZlIGV4dHJhICcrJy4KLQotVGh1IEp1biAyOSAxNzoyNDo1MiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWg4MzAwLmMgKENPRkZfTE9OR19GSUxFTkFNRVMpOiBEZWZpbmUuCi0KLVdlZCBKdW4gMjggMTg6MDQ6NDIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IHZlcnNhZG9zLm8gaXMgbm93IGNvbmRpdGlvbmFsbHkgYnVpbHQuCi0JKiBjb2ZmY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDbGVhbiB1cC4gQ2FsY3VsYXRlCi0JZGF0YSBlbnRyaWVzLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6Ci0JLnJlbG9jIGFuZCAuZWRhdGEgc2VjdGlvbnMgYXJlIElNQUdFX0JBU0VEIHRvby4KLQlJZiB0aGVyZSdzIGEgYmFzZV9maWxlIHRoZW4gd3JpdGUgb3V0IGJhc2UgaW5mb3JtYXRpb24uCi0JKiBjb25maWd1cmUuaG9zdCAoaTM4Ni0qLXBlKTogTmV3LgotCSogc3ltcy5jIChjb2ZmX3NlY3Rpb25fdHlwZSk6IE9ubHkgc2NhbiBwcmVmaXhlcy4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBWZXJzYWRvcyBpcyBub3cgY29uZGl0aW9uYWxseQotCWJ1aWx0LgotCSogY29uZmlnL202OGstY29mZi5tdDogQnVpbGQgdmVyc2Fkb3MubwotCSogaG9zdHMvaTM4NnBlLmg6IE5ldyBmaWxlLgotCi1Nb24gSnVuIDI2IDEzOjUzOjQ5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogQ2xvc2UgY29tbWVudCBiZWZvcmUKLQlSX1BBUklTQ19EUFJFTDIxTCBoYW5kbGluZy4KLQotVGh1IEp1biAyMiAxOToyODozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JU3VuIE1heSAgNyAxMTo1Mzo0MSBNRFQgMTk5NSAgQnJ5YW4gRm9yZCAgPGJhZm9yZEBjcy51dGFoLmVkdT4KLQotCSogY29uZmlnL2kzODYtbW9zcy5tdDogY3JlYXRlZC4KLQotVGh1IEp1biAyMiAwODo1NjoxMCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogQWRkIGNhc2UgZm9yIC12ZSB3b3Jkcy4KLQotV2VkIEp1biAyMSAxMzoxMzo0OSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCB0cnkgdG8gYXBwbHkgYQotCXJlbG9jYXRpb24gYWdhaW5zdCBhbiB1bmRlZmluZWQgc3ltYm9scy4KLQotV2VkIEp1biAyMSAxMDoxNjoxMCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB2ZXJzYWRvcy5jOiBTZWNvbmQgcGFzcy9yZXdyaXRlLgotCi1Nb24gSnVuIDE5IDA4OjQwOjQ1IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHN5bXMuYyAoY29mZl9zZWN0aW9uX3R5cGUpOiBDb21wYXJlIG9ubHkgdGhlIGZyb250IHBhcnQKLQlvZiBhIHNlY3Rpb24gbmFtZS4KLQotU2F0IEp1biAxNyAwOTo0MDo0NCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBTZXQgdGhlIHNpemUgb2YgdGhlIHN0dWIKLQlzZWN0aW9uIGlmIHdlIGdldCBhbiBlcnJvci4KLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogRG9uJ3QgbWVzcwotCXdpdGggdGhlIG9wZXJhbmRzIG9mIGFuIFJfUEFSSVNDX0RQUkVMMjFMIHJlbG9jYXRpb24gaWYgdGhlIGluc24KLQlpcyBub3QgImFkZGlsIDxzeW1ib2w+LCVyMjciLgotCi1GcmkgSnVuIDE2IDE1OjA0OjQ3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmggKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IERlY2xhcmUgYnV0IGRvbid0Ci0JZGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogYmZkLmMgKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IERlZmluZS4KLQotRnJpIEp1biAxNiAwMDowNzoyNSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JmZF9saW5rX2xpbmtfcmVsb2NhdGUpOiBVc2UgdGhlIHJpZ2h0Ci0JdHlwZSBmaWVsZCAodGhlcmUgYXJlIHR3byEpIHdoZW4gY2hlY2tpbmcgdG8gc2VlIGlmICRnbG9iYWwkIGlzCi0JZGVmaW5lZC4KLQotVGh1IEp1biAxNSAxNDowMzo0NyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oLCBiZmQtaW4yLmggKGJmZF9ib29sZWFuKTogUmVuYW1lIGJmZF90cnVlLCBiZmRfZmFsc2UKLQl0byBiZmRfdHR0cnVlLCBiZmRfZmZmYWxzZSBzbyBhcyBub3QgdG8gY29uZmxpY3Qgd2l0aCBmdW5jdGlvbnMuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFJlbW92ZSB2ZXJzaW9uIHRoYXQgd2FzCi0JaGFja2VkIGZvciBNUFcgQy4KLQkqIG1wdy1jb25maWcuaW46IFNldCBzaGVsbCB2YXJzIGluc3RlYWQgb2YgcGFzdGluZyB0byBtYWtlZmlsZQotCWZvciBlYWNoIGNvbmZpZ3VyYXRpb24sIGVkaXQgY29mZnN3YXAuaCB0byBtYWtlIE1QVyBDIG5vdCBjaG9rZS4KLQkoaTM4Ni11bmtub3duLWNvZmYsIHNoLWhpdGFjaGktaG1zKTogUmVjb2duaXplLgotCSogbXB3LW1ha2UuaW4gKEJGRF9MSUJTKTogQWRkIHZlcnNhZG9zLmMuby4KLQotCSogdmVyc2Fkb3MuYyAodmVyc2Fkb3Nfc2Nhbik6IFByb3Blcmx5IGNhc3QgcmVzdWx0cyBmcm9tIGJmZF9hbGxvYy4KLQotV2VkIEp1biAxNCAxNToyNzozMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChwcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzKTogTmV3IGZ1bmN0aW9uCi0JcmVhZHMgYW5kIGhhbmRsZXMgLmRyZWN0dmUgc2VjdGlvbnMgZm9yIFBFLgotCShjb2ZmX2xpbmtfaW5wdXRfYmZkKTogQ2FsbCBuZXcgZnVuY3Rpb24gaWYgUEUuCi0KLU1vbiBKdW4gMTIgMTI6MDk6MzkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGJmZC1pbi5oIChiZmRfc2V0X3NlY3Rpb25fdm1hKTogQ2FzZSB0cnVlIHRvIGEgYm9vbGVhbi4KLQkoYmZkX3NldF9jYWNoZWFibGUpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotRnJpIEp1biAgOSAxMjoyMDoyOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BydGwuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc29ydF9oZHJzKTogUmV3cml0ZSB0byBiZSBzeW1tZXRyaWNhbC4KLQotRnJpIEp1biAgOSAxMjo0OTowMCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogdGFyZ2V0cy5jOiBBZGQgY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIGFuZCBsaW5rX3NwbGl0X3NlY3Rpb24KLQl0byB0aGUgdGFyZ2V0IHZlY3Rvci4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IERlZmluZS4KLQkoX2JmZF9ub2xpbmtfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbik6IExpa2V3aXNlLgotCShiZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24pOiBEZWNsYXJlLgotCSogc3ltcy5jIChiZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogRGVmaW5lLgotCSogbGlua2VyLmMgKGJmX2xpbmtfc3BsaXRfc2VjdGlvbik6IExpa2V3aXNlLgotCSogc29tLmMgKHNvbV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogTmV3IGZ1bmN0aW9uCi0JKHNvbV9iZmRfbGlua19zcGxpdF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBBbGwgb3RoZXIgdGFyZ2V0cyB1cGRhdGVkIHdpdGggZGVmYXVsdCB2ZXJzaW9ucyBvZiBuZXcgcm91dGluZXMuCi0KLQkqIFRha2Ugb3V0IG15IGJyYWluZGFtYWdlZCBiZmRfdHJ1ZS9iZmRfZmFsc2UgY2hhbmdlcyBmcm9tIGVhcmxpZXIKLQl0b2RheS4gIFJlcGxhY2Ugd2l0aCBqdXN0OgotCSogYmZkLWluLmg6IChUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRCk6IERlZmluZSB0aGlzIGlmCi0JY29tcGlsaW5nIHdpdGggZysrLTIuNiBvciBsYXRlci4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotRnJpIEp1biAgOSAwNzo1NDoyOSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB2ZXJzYWRvcy5jIChzdHJ1Y3QgZXNkLCBnZXRfNCk6IExpbnQ7IHVzZSB1bnNpZ25lZCBjaGFycy4KLQotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY2F0ZSk6ICBDb21wYXJlIG91dHB1dCBzZWN0aW9uIG5hbWVzCi0Jd2hlbiBjb252ZXJ0aW5nIGZvciB2eHdvcmtzLgotCi1XZWQgSnVuICA3IDE5OjAxOjMwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBQZXJtaXQgLnNjb21tb24gb3IgQ09NTU9OCi0Jc2VjdGlvbnMgYXMgcmFuZG9tIFNIVF9OT0JJVFMgc2VjdGlvbnMsIGluIGNhc2UgYSBsaW5rZXIgc2NyaXB0IGlzCi0Jc3RyYW5nZS4KLQotVHVlIEp1biAgNiAxNzoyOTozMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCAoTlRfc3Vic3lzdGVtLCBOVF9zdGFja19oZWFwKTogTW92ZWQgZnJvbSBwZS5oCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvKTogR2V0IFBFIHJlbG9jcyByaWdodC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3QpOiBTZXQgcGUgdGRhdGEgYml0IHdoZW4gdXNpbmcgUEUuCi0JKiBjb2ZmbGluay5jIChDT0ZGX1dJVEhfUEUgY29kZSk6IFRlc3Qgb24gb2JqX3BlIGJpdCByYXRoZXIKLQl0aGFuIGNvbmRpdGlvbmFsIGNvbXBpbGUuCi0JKiBjb25maWd1cmUuaW46IEZpeCBQRSBkZXBlbmRlbmNpZXMuCi0JKiBsaWJjb2ZmLWluLmggKG9ial9wZSk6IE5ldy4KLQkoY29mZl90ZGF0YSk6IEFkZGVkIHBlIGVudHJ5LgotCSogbGliY29mZi5oOiBSZWdlbmVyYXRlZC4KLQotTW9uIEp1biAgNSAwOTowNzoxMyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWEyOWsuYyAoY29mZl9hMjlrX2FkanVzdF9zeW1uZHgpOiBDb21wbGV0ZWx5IHBhcmVudGhlc2l6ZQotCW1hY3JvLgotCi1Nb24gSnVuICA1IDAyOjE1OjIwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCUxpbmtlciBzdXBwb3J0IGZvciBtNjhrLWVsZiBmcm9tIEFuZHJlYXMgU2Nod2FiCi0JPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT46Ci0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENoZWNrIGZvciBOVUxMIHdoZW4KLQlsb29waW5nIHRocm91Z2ggdGhlIHN5bWJvbCBoYXNoZXMuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IFdoZW4gbG9va2luZyBmb3IgX2luaXQgYW5kIF9maW5pIGRvbid0IHVzZQotCXRoZSBzeW1ib2wgaWYgaXQgaXMgaW1wb3J0ZWQgZnJvbSBhbm90aGVyIG9iamVjdC4KLQkqIGVsZjMyLW02OGsuYzogUmVsb2NhdGlvbiB0eXBlIGNoYW5nZWQgZnJvbSBSRUwgdG8gUkVMQS4gIFJlZ3VsYXIKLQlhbmQgZHluYW1pYyBsaW5raW5nIHN1cHBvcnQgZnVuY3Rpb25zIGFkZGVkLCBzaW1pbGFyIHRvIG90aGVyIGVsZgotCXRhcmdldHMuCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotZ251Kik6IFVzZSBFTEYgY29uZmlndXJhdGlvbi4KLQotRnJpIEp1biAgMiAxODo1NDo1OSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB2ZXJzYWRvcy5jOiBOZXcgZmlsZS4KLQkqIGJmZC1pbjIuaCAoc3RydWN0IF9iZmQpOiBOZXcgZmllbGQuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBOZXcgZmllbGQuCi0JKiBjb25maWd1cmUuaW4gKHZlcnNhZG9zX3ZlYyk6IE5ldyBmaWVsZC4KLQkqIHRhcmdldHMuYyAoYmZkX2ZsYXZvcik6IEFkZGVkIHZlcnNhZG9zLgotCi1UaHUgSnVuICAxIDEzOjUxOjQ5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzLCBzdHlwX3RvX3NlY19mbGFncywgCi0JY29mZl9uZXdfc2VjdGlvbl9ob29rKTogIEFueSBzZWN0aW9uIHRoYXQgc3RhcnRzICIuc3RhYiIKLQlpcyBub3cgbWFya2VkIGFzIGRlYnVnZ2luZy4KLQotVGh1IEp1biAgMSAxNjoxNToxNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IERpc2FibGUgZXh0ZW5kZWQgbmFtZQotCXRhYmxlIHVudGlsIGl0IGNhbiBiZSBtYWRlIG9wdGlvbmFsLCBzbyB0aGF0IG5hdGl2ZSBBUiBoYXMgaGFsZiBhCi0JY2hhbmNlIG9uIFN1bk9TIGFuZCBIUC9VWC4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzLCBjYXNlCi0JYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCk6IEFkZCBjYXN0IHRvIGNvcnJlY3QgcG9pbnRlciB0eXBlcy4KLQotU2F0IE1heSAyNyAyMTozNzozMSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKG02OGstYnVsbC1zeXN2Kik6IEFkZGVkIHN0cmlwX3VuZGVyc2NvcmU9eWVzLgotCSAgKG02OGstZXN0LWNvZmYpOiBSZW1vdmVkLiAgdGFyZ2V0IGRvZXMgbm90IGVmZmVjdCBvYmplY3QgZm9ybWF0LgotCi1XZWQgTWF5IDI0IDEwOjUyOjAxIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IENvcGUgd2l0aAotCWluZGlyZWN0IHN5bWJvbHMuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IEdpdmUgZXJyb3IKLQltZXNzYWdlIHdoZW4gbGlua2luZyB0byBhIHNoYXJlZCByZWxvYyB3aGljaCBpc24ndCB0aGVyZS4KLQotV2VkIE1heSAyNCAxMDo0MDowMCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JU3VwcG9ydCBmb3IgQVJNLVBFLgotCi0JKiBNYWtlZmlsZS5pbiwgY29mZmNvZGUuaCwgY29uZmlnLmJmZCwgY29uZmlndXJlLmluLCBwZS1hcm0uYywKLQkgcGVpLWFybS5jLCBjb2ZmLWFybS5jLCByZWxvYy5jLCB0YXJnZXRzLmMsIGNvbmZpZy9hcm0tcGUubXQ6Ci0JIFN1cHBvcnQgZm9yIEFSTSBDT0ZGL1BFLgotCi1UdWUgTWF5IDIzIDE5OjI0OjU4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTm93IGEgZnVuY3Rpb24sCi0JdHJpZXMgY2FsbGluZyByb3V0aW5lIGZyb20gaW5wdXQgYmZkIHRhcmdldCB2ZWN0b3IgZm9yCi0JYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIuICBQdXQgYSBkZWNsYXJhdGlvbiBpbnRvIHRoZSBoZWFkZXIgZmlsZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBlbGYzMi1taXBzLmMgKGdwcmVsMTZfd2l0aF9ncCk6IE5ldyBmdW5jdGlvbiwgc3BsaXQgb3V0IGZyb20KLQltaXBzX2VsZl9ncHJlbDE2X3JlbG9jLgotCShtaXBzX2VsZl9ncHJlbDE2X3JlbG9jKTogQ2FsbCBpdC4gIElmIG91dHB1dCBiZmQgdGFyZ2V0IHZlY3RvcgotCWlzbid0IGVsZiBmbGF2b3VyZWQsIGFib3J0LCBzaW5jZSBpdCdzIGFzc3VtZWQgdG8gYmUgZWxmIGluIHNvbWUKLQlvZiB0aGlzIGNvZGUsIGluY2x1ZGluZyB0aGUgY29kZSB0aGF0IGxvb2tzIHVwIHRoZSBncCB2YWx1ZS4KLQkoZWxmMzJfbWlwc19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBOZXcgZnVuY3Rpb24sCi0JbW9kaWZpZWQgZnJvbSBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgdG8gZGVhbAotCXdpdGggcGFzc2luZyBncCB0byBncHJlbDE2X3dpdGhfZ3AuCi0JKGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTmV3IG1hY3JvLgotCSogZWxmMzItdGFyZ2V0LmggKGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKToKLQlEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkLgotCi1UdWUgTWF5IDIzIDE1OjU4OjE1IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZS5pbjogSW5zdGFsbCBiZmRsaW5rLmggdG9vLgotCi1TdW4gTWF5IDIxIDIyOjI1OjA5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSB1bmRlZmluZWQgYW5kCi0Jbm90c3VwcG9ydGVkIHJldHVybiBjb2RlcyBmcm9tIGZpbmFsX2xpbmtfcmVsb2NhdGUgKHVzZWQgd2hlbgotCSRnbG9iYWwkIGlzIHVuZGVmaW5lZCBvciBub25leGlzdGFudCkuCi0JKGVsZjMyX2hwcGFfYmZkX2xpbmtfbGlua19yZWxvY2F0ZSk6IElmICRnbG9iYWwkIGV4aXN0cywgYnV0IGlzCi0Jbm90IGRlZmluZWQsdGhlbiByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZC4KLQotRnJpIE1heSAxOSAxMDowMDoxNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29mZnN3YXAuaDogKElNQUdFX0JBU0UpOiBEZWZpbmUgdG8gMCBpZiBub3QuCi0KLVRodSBNYXkgMTggMDQ6MjQ6MDEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JV2VkIE1heSAxMCAxNDoyODoxNiAxOTk1IFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RhbmRhcmQpOiBJZiBkZWZpbmVkLCBjYWxsCi0JTVlfcmVsb2NhdGFibGVfcmVsb2MgYmVmb3JlIGRvaW5nIGEgcGFydGlhbCByZWxvY2F0aW9uLgotCi0JKiBhb3V0LWFybS5jOiAoV1JJVEVfSEVBREVSUyk6IERlbGV0ZS4KLQkoTkFNRSk6IERlZmluZSB2ZXJzaW9uIHRvIG92ZXJyaWRlIGRlZmF1bHQgaW4gYW91dHguaAotCShNWShob3d0b190YWJsZSkpOiBSZWZvcm1hdC4gIEFsdGVyIHNvbWUgZW50cmllcyBzbGlnaHRseS4KLQkoUkVMT0NfQVJNX0JJVFNfTkVHX3tCSUcsTElUVExFfSk6IERlZmluZS4KLQkoTVkocmVsb2NfaG93dG8pLCBNWShwdXRfcmVsb2MpLCBNWShyZWxvY2F0YWJsZV9yZWxvYykpOiBOZXcgZnVuY3Rpb25zLgotCShNWV9yZWxvY19ob3d0bywgTVlfcHV0X3JlbG9jLCBNWV9yZWxvY2F0YWJsZV9yZWxvYyk6IERlZmluZS4KLQkoTVkoZml4X3BjcmVsXzI2KSk6IFJlbmFtZWQgZnJvbSBhb3V0YXJtX2ZpeF9wY3JlbF8yNiwgcmV0dXJuCi0JYmZkX3JlbG9jX29rIG5vdCBiZmRfcmVsb2NfY29udGludWUuCi0JKE1ZKGZpeF9wY3JlbF8yNl9kb25lKSk6IExpa2V3aXNlLgotCShNWShiZmRfcmVsb2NfdHlwZV9sb29rdXApKTogUmVuYW1lZCBmcm9tIGFvdXRhcm1fcmVsb2NfdHlwZV9sb29rdXAuCi0JKE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlLCBNWV9iZmRfbGlua19hZGRfc3ltYm9scywKLQlNWV9iZmRfZmluYWxfbGluayk6IERlbGV0ZS4KLQkoTVlfc3dhcF9zdGRfcmVsb2NfaW4sIE1ZX3N3YXBfc3RkX3JlbG9jX291dCwgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMpOgotCURlZmluZS4KLQkoYW91dHguaCk6IEluY2x1ZGUgaXQuCi0JKE1ZKHN3YXBfc3RkX3JlbG9jX3tpbixvdXR9KSk6IE5ldyBmdW5jdGlvbnMuCi0JVXNlIFJFTE9DX0FSTV9CSVRTX05FR197QklHLExJVFRMRX0gdG8gZXh0cmFjdCBuZWdhdGl2ZSByZWxvYyBiaXQuCi0JKGFvdXRhcm1fc3F1aXJ0X291dF9yZWxvY3MpOiBEZWxldGUuCi0gCi0JRnJvbTogRGF2aWQgVGF5bG9yIChkdGF5bG9yQGFybWx0ZC5jby51aykKLQkqIGNvbmZpZy9hcm1bbGJdLWFvdXQubXQ6IE5ldyBmaWxlcy4KLQkqIGFvdXQtYXJtLmM6IE5ldyBmaWxlLgotCSogY29uZmlnLmJmZDogSGFuZGxlIGFybXssZVtsYl19LSotYW91dAotCSogY29uZmlndXJlLmluOiBBZGQgdmV0b3IgZm9yIGFvdXRfYXJtX3tiaWcsbGl0dGxlfV92ZWMuCi0JKiByZWxvYy5jOiBOZXcgcmVsb2NhdGlvbiB0eXBlcyBmb3IgdGhlIEFSTS4KLQkqIHRhcmdldHMuYyAoYW91dF9hcm1fe2JpZyxsaXR0bGV9X3ZlYyk6IGRlY2xhcmUuCi0KLVR1ZSBNYXkgMTYgMTA6Mjk6NTEgMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGRlbmViLmN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC5jIChiZmRfc3RhdCk6IElmIGJmZF9jYWNoZV9sb29rdXAgcmV0dXJucyBhbiBlcnJvciwKLQlyZXR1cm4gYW4gZXJyb3IgdG8gdGhlIGNhbGxlci4gIENhbGwgYmZkX3NldF9lcnJvciBvbiBlcnJvcnMuCi0KLVR1ZSBNYXkgMTYgMTQ6NDQ6NDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oIChjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBNb2RpZmllZCBwcm90b3R5cGVzIGluCi0JYWNjb3JkYW5jZSB3aXRoIDExIE1heSBsaWJjb2ZmLmggY2hhbmdlLgotCi1UaHUgTWF5IDExIDE2OjQzOjE0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQl0ZWtoZXguYyAoZmlyc3RfcGhhc2UpOiBVbmRlcnN0YW5kIHR5cGUgMCBzeW1ib2xzLgotCSh0ZWtoZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRml4IHR5cG8gaW4gZmluYWwgcmVjb3JkLgotCi1UaHUgTWF5IDExIDE2OjQzOjE0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTk2MC5jIChvcHRjYWxsX2NhbGxiYWNrKTogZG9uJ3QgdHJ5IGFuZCBvcHRpbWl6ZQotCXVuZGVmaW5lZCByZWZzLiAKLQkoY29mZl93cml0ZV9yZWxvY3MpOiBTZWFyY2ggZm9yIGJyb2tlbiByZWxvY3Mgb24gdGhlIHdheQotCW91dCBhbmQgZml4IHRoZW0gdXAuCi0JKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IENhbGN1bGF0ZSBhbmQgcmV0dXJuIGluZGV4IG9mCi0JZmlyc3QgdW5kZWZpbmVkIHN5bWJvbC4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDYWxsIGNvZmZfcmVudW1iZXJfc3ltYm9scyAKLQlhbmQgY29mZl93cml0ZV9yZWxvY3Mgd2l0aCB0aGUgbmV3IGFyZ3MuCi0JKiBsaWJjb2ZmLmg6IChjb2ZmX3JlbnVtYmVyX3N5bWJvbHMsIGNvZmZfcmVudW1iZXJfc3ltYm9scyk6Ci0JTW9kaWZpZWQgcHJvdG90eXBlcy4KLQotVGh1IE1heSAxMSAxNjo0MzoxNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCQkJICBUb20gR3JpZXN0IDxncmllc3RAY3MueWFsZS5lZHU+Ci0KLQlJbml0aWFsIHN1cHBvcnQgZm9yIFBFIGZvcm1hdC4gCi0JCi0JKiBNYWtlZmlsZS5pbiwgdGFyZ2V0cy5jLCBjb25maWd1cmUuaW4sIGNvbmZpZy5iZmQ6Ci0JQWRkIHN1cHBvcnQgZm9yIGkzODYtKi13aW5udCBhbmQgaTM4Ni0qLXBlLgotCSogYXJjaGl2ZS5jIChkb19zbHVycF9jb2ZmX2FybWFwKTogIFVuZGVyc3RhbmQgTlRQRSBmb3JtYXQKLQlhcmNoaXZlcy4KLQkoX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKTogVHVybiBcIGluIGEgZmlsZW5hbWUKLQlpbnRvIC8uCi0JKiBiZmQtaW4uaCAoYmZkX2xpbmtfc3Vic3lzdGVtLCBfYmZkX2xpbmtfc3RhY2tfaGVhcCk6IE5ldy4KLQkqIGNvZmYtaTM4Ni5jICAoaG93dG9fdGFibGUpOiBDb25kaXRpb25hbGl6ZSBQQ1JFTE9GRlNFVC4KLQkqIGNvZmZjb2RlLmggKElNQUdFX0JBU0UpOiBOZXcuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogVGhyb3cgYXdheSAuanVuawotCXNlY3Rpb25zIGZvciBQRSwgYWxpZ24gc3ltYm9scy4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBUaHJvdyBhd2F5IC5qdW5rIHNlY3Rpb25zCi0JZm9yIFBFLiBSZW1lbWJlciBpbmZvIG9uIC5pZGF0YSBhbmQgLnJzcmMgc2VjdGlvbnMuCi0JRmlsbCBpbiB0aGUgUEUgaGVhZGVyLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFBFIHVzZXMgQ19TRUNUSU9OIGNsYXNzLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBLZWVwIFBFIGluZm8gdXAgdG8gZGF0ZS4KLQkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IENvcGUgd2l0aCBQRSByZWxvY3MuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfe2FvdXQvZmlsZS9zY24vc3ltfWhkcl97aW4vb3V0fSk6IAotCU5ldyBjb2RlIGZvciBQRSBoZWFkZXJzLgotCi1UdWUgTWF5ICA5IDE3OjAxOjM4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBzdXBwb3J0LgotCSogY29uZmlndXJlLmluOiBEaXR0by4KLQkqIHRhcmdldHMuYzogRGl0dG8uCi0JKiBjb25maWcvcHBjbGUtZWxmLm10OiBOZXcgZmlsZSwgZm9yIGxpdHRsZSBlbmRpYW4gUG93ZXJQQwotCXN1cHBvcnQuCi0JKiBjb25maWcvcHBjLWVsZi5tdDogQWRkIGxpdHRsZSBlbmRpYW4gcG93ZXJwYyB0byB0aGUgQkZECi0Jc2VsZWN0aW9uIHZlY3RvcnMuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ29tcGxhaW4gaWYKLQlsaW5raW5nIGEgZGlmZmVyZW50IGVuZGlhbiBvYmplY3QgdGhhbiB3ZSBleHBlY3QuCi0JKFRBUkdFVF9MSVRUTEVfU1lNLCBUQVJHRVRfTElUVExFX05BTUUpOiBEZWZpbmUsIHRvIHByb3ZpZGUgbGl0dGxlCi0JZW5kaWFuIHN1cHBvcnQuCi0KLVR1ZSBNYXkgIDIgMTY6MzI6MjQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy5iZmQgKGhwcGEqLSotbGl0ZXMqKTogVHJlYXQganVzdCBsaWtlIGhwcGEqLSotKmVsZiouCi0KLVR1ZSBBcHIgMjUgMTk6Mzg6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBJbml0aWFsaXplIGxtYSBzYW1lIGFzCi0Jdm1hLgotCi1UdWUgQXByIDI1IDExOjAzOjIxIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oOiAjaW5jbHVkZSBhbnNpZGVjbC5oICdjYXVzZSBQVFIgaXMgdXNlZCBpbgotCXN0ZC1ob3N0LmguCi0KLU1vbiBBcHIgMjQgMjM6NTY6NDQgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZsaW51eC5oIChIQVZFX1BST0NGUyk6IERvbid0IGRlZmluZSBpdC4gIEFkZGVkIGxlbmd0aHkKLQljb21tZW50IGV4cGxhaW5pbmcgd2h5LgotCi1Nb24gQXByIDI0IDEwOjM0OjAyIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBob3N0cy9pMzg2bGludXguaCAoSEFWRV9QUk9DRlMpOiBJZiBOT19QUk9DRlMgaXMgZGVmaW5lZCwgZG9uJ3QKLQlkZWZpbmUgSEFWRV9QUk9DRlMuCi0KLU1vbiBBcHIgMjQgMDg6MzM6MTIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEbyBub3QgY29udGludWUKLQlwcm9jZXNzaW5nIHVua25vd24gc3ltYm9scyB0byBwcmV2ZW50IGEgY2FzY2FkZSBvZiBlcnJvcnMuCi0KLUZyaSBBcHIgMjEgMTI6NDg6NDggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCVBhdGNoZXMgZnJvbSBILkouIEx1IGZvciBMaW51eCBFTEYgY29yZSBmaWxlIHN1cHBvcnQuCi0JKiBlbGZjb2RlLmggKGVsZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApIFtIQVZFX1BST0NGU106Ci0JVXNlIHBycHNpbmZvX3QgaW5zdGVhZCBvZiBzdHJ1Y3QgcHJwc2luZm8sIGZvciBjb25zaXN0ZW5jeS4KLQkqIGhvc3RzL2kzODZsaW51eC5oIChIQVZFX1BST0NGUyk6IERlZmluZS4KLQotVGh1IEFwciAyMCAwOTowNzozOSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAobGlua19hY3Rpb24pOiBEbyB0aGUgcmlnaHQgdGhpbmcgd2hlbiBhIHVuZGVmaW5lZAotCXN0cm9uZyBzeW1ib2wgYXBwZWFycyBhZnRlciBhbiB1bmRlZmluZWQgd2VhayBzeW1ib2wuCi0KLUZyaSBBcHIgMTQgMTY6NTE6MTcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uIHRvIHJlbG9jYXRlCi0JYSB3aG9sZSBzZWN0aW9uIGZvciB0aGUgbGlua2VyLCBieXBhc3NpbmcgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4KLQkocHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbiB0byBtYXAgdGhlIEJGRAotCWVudW1lcmF0aW9uIGNvZGUgaW50byBhIGhvd3RvIHN0cnVjdHVyZS4KLQkocHBjX2VsZl9ob3d0b19yYXcpOiBSZW5hbWUgZnJvbSBwcGNfZWxmX2hvd3RvX3RhYmxlLgotCShwcGNfZWxmX2hvd3RvX3RhYmxlKTogTmV3IGFycmF5IHRoYXQgbWFwcyBQb3dlclBDIHJlbG9jYXRpb24KLQludW1iZXJzIHRvIGhvd3RvIHN0cnVjdHVyZXMgd2l0aG91dCBhIGxpbmVhciBzZWFyY2guICBDaGFuZ2UgZnJvbQotCXVzaW5nIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyB0byB1c2UgcHBjX2VsZl9zdGRfcmVsb2MuCi0JKHBwY19lbGZfaG93dG9faW5pdCk6IEluaXRpYWxpemUgcHBjX2VsZl9ob3d0b190YWJsZSBmcm9tCi0JcHBjX2VsZl9ob3d0b19yYXcuCi0JKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBVc2UgYSBjYXNlIHN0YXRlbWVudCBpbnN0ZWFkIG9mIGEKLQlsb29wLgotCShwcGNfZWxmX3N0ZF9yZWxvYyk6IFJlcGxhY2VtZW50IGZvciBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuCi0JKHBwY19lbGZfdW5zdXBwb3J0ZWRfcmVsb2MpOiBQcmludCBhIHJlYWwgZXJyb3IgbWVzc2FnZSwgaW5zdGVhZAotCW9mIGNhbGxpbmcgYWJvcnQuCi0JKHBwY19lbGZfYWRkcjE2X2hhX2lubmVyKTogQWJzdHJhY3QgZ2V0dGluZyBhZGp1c3RtZW50IGZyb20KLQlwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgc28gcHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIGNhbiB1c2UgaXQKLQl0b28uCi0JKHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jKTogQ2FsbCBpdC4KLQkocHBjX2VsZl9nb3QxNl9pbm5lcik6IEFic3RyYWN0IGdldHRpbmcgYWRqdXN0bWVudCBmcm9tCi0JcHBjX2VsZl9nb3QxNl9yZWxvYywgc28gcHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIGNhbiB1c2UgaXQgdG9vLgotCShwcGNfZWxmX2dvdDE2X3JlbG9jKTogQ2FsbCBpdC4KLQkocHBjX2VsZl9pbmZvX3RvX2hvd3RvKTogUmVuYW1lIGZyb20gcG93ZXJwY19pbmZvX3RvX2hvd3RvLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogT21pdCBzcGFjZSBpbiBkZWJ1Z2dpbmcKLQlvdXRwdXQuCi0JKGVsZl9zeW1ib2xfZmxhZ3MpOiBBZGQgZGVidWcgZnVuY3Rpb24gdG8gZGVjb2RlIGZsYWdzIHNvIHRoYXQKLQlkZWZpbmluZyBERUJVRyB0byBiZSA0IHdpbGwgY29tcGlsZSBhZ2Fpbi4KLQkoZWxmX2RlYnVnX3NlY3Rpb24pOiBGaXggdHlwbyBpbiBkZWJ1ZyBvdXRwdXQuCi0KLUZyaSBBcHIgMTQgMTY6MDM6MDQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIG02OCotKi1lbGYqLgotCSogZWxmMzItbTY4ay5jOiBGaWxsZWQgb3V0IGltcGxlbWVudGF0aW9uLCBleGNlcHQgZm9yIGR5bmFtaWMKLQlsaW5raW5nIHN1cHBvcnQuCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBBZGRlZCAqX0dPVF9QQ1JFTCwgKl9HT1RPRkYsCi0JKl9QTFRfUENSRUwsICpfUExUT0ZGLCAqXzY4S18qIHJlbG9jYXRpb25zIGZvciBFTEYuCi0JKiBsaWJiZmQuaCwgYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotVGh1IEFwciAxMyAxNDoyODowNCAxOTk1ICBUb3Jiam9ybiBHcmFubHVuZCAgPHRlZ2VAYWRkZXIuY3lnbnVzLmNvbT4KLQotCSogY29mZi1tNjhrLmMgKENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUik6IENoYW5nZSBmcm9tCi0JMSB0byAyLgotCShiZmRfdGFyZ2V0KTogQ2hhbmdlIG1pbmltdW0gc2VjdGlvbiBhbGlnbm1lbnQgZnJvbSAxIHRvIDIuCi0KLVdlZCBBcHIgMTIgMTI6NDA6MDQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAobWFjaGluZV90eXBlLCBjYXNlIGJmZF9hcmNoX21pcHMpOiBUcmVhdCBSODAwMCBsaWtlCi0JUjYwMDAgYW5kIFI0MDAwIGZvciBub3cuCi0KLVR1ZSBBcHIgIDQgMTI6Mjg6MjUgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgY29uZmlndXJlLmluLgotCSogbXB3LW1ha2UuaW46IE5ldyBmaWxlLCBNUFcgdmVyc2lvbiBvZiBNYWtlZmlsZS5pbi4KLQkqIGhvc3RzL21wdy5oOiBOZXcgZmlsZSwgTVBXIGhvc3QgZGVmaW5pdGlvbnMuCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9wZHJfaW4sIGVjb2ZmX3N3YXBfcGRyX2luKSBbTVBXX0NdOgotCUFsdGVybmF0ZSB2ZXJzaW9ucyB3aXRob3V0IEVDT0ZGXzY0IHRoYXQgY2hva2VzIE1QVyBDLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBBZGQgYWx0ZXJuYXRpdmUgdmVyc2lvbiB3aXRoCi0JcGFydGx5LWV4cGFuZGVkIG1hY3Jvcy4KLQotVGh1IE1hciAzMCAxNDo1NjoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBEb24ndCBib3RoZXIgdG8gY2hlY2sgZm9yCi0Jb3ZlcmZsb3cgaWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuCi0KLVRodSBNYXIgMzAgMTQ6MzI6MjYgMTk5NSAgSC5KLiBMdSAoaGpsQG55bmV4c3QuY29tKQotCi0JKiBjb25maWcuYmZkOiBDaGFuZ2UgbGludXggdG8gZGVmYXVsdCB0byBlbGYuICBVc2luZwotCWlbMzQ1XTg2LSotbGludXhhb3V0IHdpbGwgYnVpbGQgYSBsaWJyYXJ5IHdoaWNoIGRlZmF1bHRzIHRvIGEub3V0LgotCSogY29uZmlnL2kzODYtbGFvdXQubXQ6IFJlbmFtZSBmcm9tIG9sZCBjb25maWcvaTM4Ni1saW51eC5tdC4KLQkqIGNvbmZpZy9pMzg2LWxpbnV4Lm10OiBSZW5hbWUgZnJvbSBvbGQgY29uZmlnL2kzODYtbGVsZi5tdC4KLQlDb21tZW50IG91dCBFWFRSQUxJQlMuCi0JKiBjb25maWcvaTM4Ni1sZWxmLm10OiBSZW1vdmUuCi0KLVdlZCBNYXIgMjkgMTI6MDE6MzAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogQ2FjaGUgdGhlIHNlY3Rpb24gc3ltYm9sIGluCi0JdGhlIHVzZWRfYnlfYmZkIGZpZWxkIG9mIHRoZSBzZWN0aW9uLCB0byBhdm9pZCBsb29waW5nIGZvciBlYWNoCi0JcmVsb2MuCi0KLQkqIGNwdS1oODUwMC5jIChhcmNoX2luZm9fc3RydWN0KTogQ2hhbmdlIG5hbWUgZnJvbSAiSDgvMzAwIiB0bwotCSJoODMwMCIgZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgY3B1LSogZmlsZXMuCi0KLVR1ZSBNYXIgMjggMTU6MTQ6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBib3V0LmMgKGJfb3V0X2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IEhhbmRsZSBTRUNfQ09OU1RSVUNUT1IKLQlzZWN0aW9ucy4KLQkoYl9vdXRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogU2tpcCBjb25zdHJ1Y3RvcgotCXN5bWJvbHMgd2hpY2ggdGhlIG1haW4gbGlua2VyIGNvZGUgZGlkIG5vdCBkbyBhbnl0aGluZyB3aXRoLgotCShfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IFVzZSB1ZGF0YS5wIGlmIGl0IGlzIHNldCwKLQlyYXRoZXIgdGhhbiBsb29raW5nIHRoZSBzeW1ib2wgdXAgaW4gdGhlIGhhc2ggdGFibGUuICBKdXN0IHBhc3MKLQl0aHJvdWdoIGNvbnN0cnVjdG9yIHN5bWJvbHMgZm9yIHdoaWNoIHVkYXRhLnAgaXMgbm90IHNldC4gIElmIHRoZQotCWxpbmtlciBkZWZpbmVkIHRoZSBzeW1ib2wsIGNsZWFyIHRoZSBjb25zdHJ1Y3RvciBmbGFnLgotCi1UdWUgTWFyIDIxIDEwOjUwOjMyIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NldF9yZWxvY19pbmZvKTogU2lnbiBleHRlbmQgY29uc3RhbnRzIGZyb20KLQlSX0RBVEFfT1ZFUlJJREUgZml4dXBzLgotCSogbGliaHBwYS5oIChzaWduX2V4dGVuZCk6IFJlbmFtZWQgZnJvbSBzaWduX2V4dC4gIEZpeC4KLQkobG93X3NpZ25fZXh0ZW5kKTogTGlrZXdpc2UuCi0KLU1vbiBNYXIgMjAgMjI6Mzk6MTAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogVGlnaHRlbiB0ZXN0IHRvIGRldGVybWluZQotCXdoYXQgc3ltYm9scyBhcmUgc2VjdGlvbiBzeW1ib2xzLgotCi1TYXQgTWFyIDE4IDAxOjU0OjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBBbiBlbXB0eSBhcmNoaXZlIGlzIE9LLgotCi1GcmkgTWFyIDE3IDE2OjI5OjAyIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogSnVzdCByZXR1cm4gdHJ1ZSB3aGVuCi0JZWl0aGVyIHRoZSBpbnB1dCBvciBvdXRwdXQgc2VjdGlvbiBpc24ndCBhdHRhY2hlZCB0byBhIFNPTSBCRkQuCi0JKHNvbV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogU2ltaWxhcmx5IGZvciBCRkQgcHJpdmF0ZSBkYXRhLgotCi1GcmkgTWFyIDE3IDExOjUwOjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDaGVjayB3aGV0aGVyIGEgZHluYW1pYwotCW9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIGluY2x1ZGVkLCBhbmQgaWdub3JlIGl0IHRoZSBzZWNvbmQgdGltZS4KLQotV2VkIE1hciAxNSAxMTo1Njo0MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IENoYW5nZSBSX1NQQVJDX0dPVDEzIGZyb20KLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCB0byBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQuCi0KLQkqIGxpYmVsZi5oIChiZmRfZWxmMzJfX3dyaXRlX3JlbG9jcyk6IERvbid0IGRlY2xhcmUuCi0JKGJmZF9lbGY2NF9fd3JpdGVfcmVsb2NzKTogRG9uJ3QgZGVjbGFyZS4KLQotVHVlIE1hciAxNCAwNTo1NDozMyAxOTk1ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogc3RhYi1zeW1zLmMgKGFvdXRfc3RhYl9uYW1lKTogTW92ZWQgYW91dF9zdGFiX25hbWVzIHRvIGJlIGxvY2FsCi0JdG8gdGhpcyBmdW5jdGlvbi4gIFJlY29kZWQgZnVuY3Rpb24gdG8gc3RvcCB1c2luZyB0YWJsZSwgdG8KLQlpbXByb3ZlIHBlcmZvcm1hbmNlIChvbiBpNDg2LW5ldGJzZCBob3N0KS4gIExlZnQgb2xkIHZlcnNpb24KLQlpbnRhY3QgdW5kZXIgIiNpZiAwIiBmb3IgZnVydGhlciBwZXJmb3JtYW5jZSB0ZXN0aW5nLgotCi1Nb24gTWFyIDEzIDEzOjQ4OjQ5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oICh3cml0ZV9yZWxvY3MpOiBNYWtlIHN0YXRpYy4gIFVzZSBQVFIgYXJndW1lbnQgYXMgYQotCXBvaW50ZXIgdG8gYSBib29sZWFuIHZhcmlhYmxlIHNldCB0byB0cnVlIGlmIHNvbWV0aGluZyBmYWlscy4KLQlDYXN0IHRvIFBUUiByYXRoZXIgdGhhbiB2b2lkICouCi0JKHN5bV9pc19nbG9iYWwpOiBSZXdyaXRlIGZvciBjbGFyaXR5LgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IElmIHRoZSBwcm9ncmFtIGhlYWRlciBzaXplIGlzIHRvbyBzbWFsbCwKLQljYWxsIF9iZmRfZXJyb3JfaGFuZGxlciBhbmQgcmV0dXJuIGZhaWx1cmUgcmF0aGVyIHRoYW4gYWJvcnRpbmcuCi0JKE5BTUUoYmZkX2VsZix3cml0ZV9vYmplY3RfY29udGVudHMpKTogUGFzcyBib29sZWFuIHZhcmlhYmxlIHdoZW4KLQljYWxsaW5nIHdyaXRlX3JlbG9jcy4KLQkoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBVc2UgQkZEX0FTU0VSVCByYXRoZXIgdGhhbiBhYm9ydC4KLQkoc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCk6IERlZmluZS4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBEZWNsYXJlIHZhcmlhYmxlcyBpbiBpbm5lcgotCWJsb2Nrcy4gIFBhc3MgZWxmX2luZm9fZmFpbGVkIHN0cnVjdHVyZSB3aGVuIGNhbGxpbmcKLQllbGZfZXhwb3J0X3N5bWJvbCBhbmQgZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbC4KLQkoZWxmX2V4cG9ydF9zeW1ib2wpOiBUcmVhdCBkYXRhIGFyZ3VtZW50IGFzIGVsZl9pbmZvX2ZhaWxlZCByYXRoZXIKLQl0aGFuIGJmZF9saW5rX2luZm8uICBTZXQgZmFpbGVkIGZpZWxkIG9uIGVycm9yLgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKHN0cnVjdCBlbGZfZmluZm9fZmFpbGVkKTogRGVmaW5lLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBQYXNzIGVsZl9maW5mb19mYWlsZWQgc3RydWN0dXJlIHdoZW4gY2FsbGluZwotCWVsZl9saW5rX291dHB1dF9leHRzeW0uICBVc2UgQkZEX0FTU0VSVCByYXRoZXIgdGhhbiBhYm9ydC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFRyZWF0IGRhdGEgYXJndW1lbnQgYXMgZWxmX2ZpbmZvX2ZhaWxlZAotCXJhdGhlciB0aGFuIGVsZl9maW5hbF9saW5rX2luZm8uICBTZXQgZmFpbGVkIGZpZWxkIG9uIGVycm9yLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBVc2UgQkZEX0FTU0VSVCByYXRoZXIgdGhhbiBhYm9ydC4KLQkoZWxmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogT25seSB3cml0ZQotCW91dCBQTFRSRUxTWiwgUExUUkVMIGFuZCBKTVBSRUwgcmVsb2NzIGlmIHRoZXJlIGlzIGEgLnJlbGEucGx0Ci0Jc2VjdGlvbi4gIFNvbGFyaXMgMi40IGFwcGFyZW50bHkgZG9lcyBub3QgaGFuZGxlIGVtcHR5IHJlbG9jCi0JaW5mb3JtYXRpb24gY29ycmVjdGx5LgotCi0JKiBhcmNoaXZlLmMgKGJzZF93cml0ZV9hcm1hcCk6IENhc3QgZ2V0dWlkIGFuZCBnZXRnaWQgcmVzdWx0cyB0bwotCWxvbmcsIGFuZCBwcmludCB3aXRoICVsZC4KLQotRnJpIE1hciAxMCAxNjo0MTowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogQWx3YXlzIHVzZSB0aGUgb3V0cHV0Ci0Jc2VjdGlvbiBpZiBpdCBpcyBub3QgTlVMTC4KLQotVGh1IE1hciAgOSAxNTowNjoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogSWYgdGhlIGxpbmUgbnVtYmVyIGNvdW50IG9yCi0JdGhlIHJlbG9jIGNvdW50IGRvZXMgbm90IGZpdCwgcHJpbnQgYW4gZXJyb3IgYW5kIHJldHVybiAwLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQljb2ZmX3N3YXBfc2NuaGRyX291dC4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlCi0Jb2YgYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0LgotCi0JKiBiZmQuYzogSW5jbHVkZSA8c3RkYXJnLmg+IG9yIDx2YXJhcmdzLmg+LCBkZXBlbmRpbmcgdXBvbgotCUFOU0lfUFJPVE9UWVBFUy4KLQkoYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSk6IE5ldyBnbG9iYWwgdHlwZS4KLQkoX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShfYmZkX2RlZmF1bHRfZXJyb3JfaGFuZGxlcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfZXJyb3JfaGFuZGxlcik6IE5ldyBCRkQgcHJpdmF0ZSBnbG9iYWwgdmFyaWFibGUuCi0JKGJmZF9zZXRfZXJyb3JfaGFuZGxlcik6IE5ldyBnbG9iYWxseSB2aXNpYmxlIGZ1bmN0aW9uLgotCShiZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSk6IE5ldyBnbG9iYWxseSB2aXNpYmxlIGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKF9iZmRfZXJyb3JfaGFuZGxlcik6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2NfaW4pKTogQWRkIHN5bWNvdW50IHBhcmFtZXRlciwKLQlhbmQgdXNlIGl0IGluc3RlYWQgb2YgYmZkX2dldF9zeW1jb3VudC4gIENoZWNrIHJfaW5kZXggYWZ0ZXIKLQlzZXR0aW5nIHJfZXh0ZXJuIGJhc2VkIG9uIHdoZXRoZXIgdGhpcyBpcyBhIGJhc2UgcmVsYXRpdmUgcmVsb2MuCi0JKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19JTikpOiBBZGQgc3ltY291bnQgcGFyYW1ldGVyLCBhbmQgdXNlIGl0Ci0JaW5zdGVhZCBvZiBiZmRfZ2V0X3N5bWNvdW50LgotCShOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKTogUGFzcyBiZmRfZ2V0X3N5bWNvdW50IHRvIHJlbG9jCi0Jc3dhcCByb3V0aW5lcy4KLQkqIGxpYmFvdXQuaCAoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSk6IEFkZCBzeW1jb3VudCBwYXJhbWV0ZXIKLQl0byBkZWNsYXJhdGlvbi4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKSk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBQYXNzCi0JaW5mby0+ZHluc3ltX2NvdW50IHRvIHJlbG9jIHN3YXAgcm91dGluZXMuCi0JKiBhb3V0LW5zMzJrLmMgKE1ZX3N3YXBfc3RkX3JlbG9jX2luKTogQWRkIHN5bWNvdW50IHBhcmFtZXRlci4KLQkqIGhwMzAwaHB1eC5jIChNWShzd2FwX3N0ZF9yZWxvY19pbikpOiBMaWtld2lzZS4KLQkoTVkoc2x1cnBfcmVsb2NfdGFibGUpKTogUGFzcyBiZmRfZ2V0X3N5bWNvdW50IHRvIHJlbG9jIHN3YXAKLQlyb3V0aW5lLgotCSogaTM4Nmx5bnguYyAoTkFNRShseW54LHN3YXBfZXh0X3JlbG9jX2luKSk6IEFkZCBzeW1jb3VudAotCXBhcmFtZXRlci4KLQkoTkFNRShseW54LHN3YXBfc3RkX3JlbG9jX2luKSk6IExpa2V3aXNlLgotCShOQU1FKGx5bngsc2x1cnBfcmVsb2NfdGFibGUpKTogUGFzcyBiZmRfZ2V0X3N5bWNvdW50IHRvIHJlbG9jCi0Jc3dhcCByb3V0aW5lcy4KLQotVGh1IE1hciAgOSAxMjowNDowNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBmdW5jdGlvbiB2ZWN0b3IgdG8gYmUKLQljYWxsZWQgYnkgdGhlIGxpbmtlciB0byBtZXJnZSBhbnkgcHJpdmF0ZSBiZmQgZGF0YSBvZiB0aGUgaW5wdXQKLQlmaWxlcyBhbmQgdGhlIG91dHB1dCBmaWxlLiAgVXNlZCBieSB0aGUgUG93ZXJQQyBFTEYgc3VwcG9ydCB0bwotCWNoZWNrIHdoZXRoZXIgLW1yZWxvY2F0YWJsZSBpcyB1c2VkIGZvciBhbGwgbW9kdWxlcy4KLQkoYmZkX3NldF9wcml2YXRlX2ZsYWdzKTogTmV3IGZ1bmN0aW9uIHZlY3RvciB0byBiZSBjYWxsZWQgYnkgdGhlCi0JYXNzZW1ibGVyIHRvIHNldCBwcml2YXRlIGZsYWdzLiAgVXNlZCBieSB0aGUgUG93ZXJQQyBFTEYgc3VwcG9ydAotCXRvIHNldCB0aGF0IGEgcGFydGljdWxhciBvYmplY3QgZmlsZSB3YXMgYXNzZW1ibGVkIHdpdGggdGhlCi0JLW1yZWxvY2F0YWJsZSBvcHRpb24uCi0KLQkqIHRhcmdldHMuYyAoQkZEX0pVTVBfVEFCTEVfQ09QWSk6IEFkZCBpbnRpaWFsaXphdGlvbiBvZiB0aGUKLQliZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBhbmQgYmZkX3NldF9wcml2YXRlX2ZsYWdzIGZ1bmN0aW9uCi0JdmVjdG9ycy4KLQotCSogYmZkLWluMi5oLCBsaWJiZmQtaW4uaDogUmVidWlsZCB3aXRoIGJmZC5jIGFuZCB0YXJnZXRzLmMKLQljaGFuZ2VzLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyk6IE5ldyBmdW5jdGlvbiB0byBzZXQgdGhlCi0JRUxGIGVfZmxhZ3MgZmllbGQuCi0JKHBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSB0aGUgZV9mbGFncyBmaWVsZCBmcm9tIHRoZQotCWlucHV0IGZpbGUgdG8gdGhlIG91dHB1dCBmaWxlLgotCShwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDaGVjayBmb3IgYSBtaXNtYXRjaCBiZXR3ZWVuIHRoZQotCWVfZmxhZ3MgZmllbGQgb2YgYWxsIG9mIHRoZSBsaW5rZXIgaW5wdXQgZmlsZXMuCi0KLQkqIGxpYmVsZi5oIChlbGZfb2JqX3RkYXRhKTogQWRkIHBwY19mbGFnc19pbml0IGZpZWxkIHNvIHRoYXQgdGhlCi0JUG93ZXJQQyBzdXBwb3J0IGNhbiBjaGVjayBpZiBjb21wYXRhaWJsZSBlX2ZsYWdzIGFyZSBwcmVzZW50LgotCi0JKiBhb3V0LXRhcmdldC5oOiBBZGQgTk9QIGZvciB0aGUgYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLQlhbmQgYmZkX3NldF9wcml2YXRlX2ZsYWdzIGZ1bmN0aW9uIHZlY3RvcnMuCi0JKiBjb2ZmY29kZS5oOiBEaXR0by4KLQkqIGVsZjMyLXRhcmdldC5oOiBEaXR0by4KLQkqIGVsZjY0LXRhcmdldC5oOiBEaXR0by4KLQkqIGxpYmJmZC5oOiBEaXR0by4KLQkqIGxpYmVjb2ZmLmg6IERpdHRvLgotCSogc29tLmM6IERpdHRvLgotCi1XZWQgTWFyICA4IDAwOjUzOjU0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY3B1LW1pcHMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBtaXBzOjgwMDAgZW50cnkuCi0KLQkqIGVsZmNvZGUuaCAoc3dhcF9vdXRfc3ltcyk6IE1hcmsgYW4gdW5kZWZpbmVkIEJTRl9XRUFLIHN5bWJvbCBhcwotCVNUQl9XRUFLIHJhdGhlciB0aGFuIFNUQl9HTE9CQUwuCi0KLVR1ZSBNYXIgIDcgMTI6MjM6NDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkCi0JX2JmZF9jb2ZmX2FkanVzdF9zeW1uZHguCi0JKGJmZF9jb2ZmX2FkanVzdF9zeW1uZHgpOiBEZWZpbmUuCi0JKGNvZmZfYWRqdXN0X3N5bW5keCk6IERlZmluZSBhcyBOVUxMIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQgdG8KLQljb2ZmX2FkanVzdF9zeW1uZHguCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfaW5wdXRfYmZkKTogQ2FsbCBjb2ZmX2FkanVzdF9zeW1uZHggaWYgaXQKLQlpcyBkZWZpbmVkLgotCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19hZGp1c3Rfc3ltbmR4KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9hZGp1c3Rfc3ltbmR4KTogRGVmaW5lIGJlZm9yZSBpbmNsdWRpbmcgY29mZmNvZGUuaC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IFNraXAgYmluYXJ5X3ZlYyB3aGVuCi0Jc2VhcmNoaW5nIHRocm91Z2ggYmZkX3RhcmdldF92ZWN0b3IuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NvcnRfaGRycyk6IENoZWNrIFNIVF9OT0JJVFMgYmVmb3JlIGNoZWNraW5nCi0Jc2hfc2l6ZS4KLQotTW9uIE1hciAgNiAyMzozMTozNiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NvcnRfaGRycyk6IEtlZXAgU0hUX05PQklUUyBzZWN0aW9ucyBhZnRlcgotCSFTSFRfTk9CSVRTIG9uZXMuCi0KLU1vbiBNYXIgIDYgMDk6NTM6MDggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNwdS1ocHBhLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBTdXBwb3J0IGJvdGggUEExLjAgYW5kIFBBMS4xCi0JbWFjaGluZSB0eXBlcy4KLQkoYmZkX2hwcGFfYXJjaCk6IExpbmsgaW4gYm90aCBQQTEuMCBhbmQgUEExLjEgYXJjaGl0ZWN0dXJlIGluZm8KLQlzdHJ1Y3R1cmVzLgotCSogbGliaHBwYS5oIChlbnVtIHBhX2FyY2gpOiBOZXcgZW51bWVyYXRpb24gdG8gZGVzY3JpYmUgdGhlCi0JZGlmZmVyZW50IHZhcmlhbnRzIG9mIHRoZSBQQSBhcmNoaXRlY3R1cmUuCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IFVzZSBuZXcgZW51bWVyYXRpb24gdG8gc2V0IG1hY2hpbmUKLQl0eXBlLgotCShzb21fZmluaXNoX3dyaXRpbmcpOiBJZiB0aGUgbWFjaGluZSB0eXBlIGlzIFBBMS4xLCB0aGVuIHVzZSB0aGUKLQlQQTEuMSBtYWNoaW5lIGlkZW50aWZpZXIgaW4gdGhlIG91dHB1dCBmaWxlLgotCi1UaHUgTWFyICAyIDE1OjU4OjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSk6IFRyZWF0IHRoZSBpbmRleCBvZiBhCi0gICAgICAgIGJhc2UgcmVsYXRpdmUgcmVsb2MgYXMgYW4gaW5kZXggaW50byB0aGUgc3ltYm9sIHRhYmxlLCByZWdhcmRsZXNzCi0gICAgICAgIG9mIHRoZSBzZXR0aW5nIG9mIHJfZXh0ZXJuLgotCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pKTogTGlrZXdpc2UuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cykpOiBEb3VibGUgY2hlY2sgdGhhdCB0aGUKLQljYWxsZXIgaXMgd3JpdGluZyB0byBhIHZhbGlkIHNlY3Rpb24uCi0KLVRodSBNYXIgIDIgMTQ6Mzc6NTcgMTk5NSAgQnJ5YW4gRm9yZCAgPGJhZm9yZEBjcy51dGFoLmVkdT4KLQotCSogYmluYXJ5LmM6IEFkZCBzdXBwb3J0IGZvciByZWFkaW5nIGJpbmFyeSBmaWxlcy4gIExvYWRzIHRoZSByYXcKLQljb250ZW50cyBvZiB0aGUgZmlsZSBpbnRvIGEgZGF0YSBzZWN0aW9uIGFuZCB3cmFwcyBzb21lIHN5bWJvbHMKLQlhcm91bmQgaXQuICBUaGUgc3ltYm9scyBgX2JpbmFyeV88ZmlsZW5hbWU+X3N0YXJ0JyBhbmQKLQlgX2JpbmFyeV88ZmlsZW5hbWU+X2VuZCcgaW5kaWNhdGUgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGRhdGEsCi0Jd2hpbGUgYF9iaW5hcnlfPGZpbGVuYW1lPl9zaXplJyBpcyBhbiBhYnNvbHV0ZSBzeW1ib2wgd2hvc2UgdmFsdWUKLQlpcyB0aGUgc2l6ZSBvZiB0aGUgZGF0YS4gIDxmaWxlbmFtZT4gaXMgdGhlIG5hbWUgb2YgdGhlIGJpbmFyeQotCWlucHV0IGZpbGUsIHdpdGggYWxsIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBjb252ZXJ0ZWQgdG8KLQl1bmRlcnNjb3Jlcy4KLQotCSogYXJjaHVyZXMuYyAoYmZkX2FyY2hfZ2V0X2NvbXBhdGlibGUpOiBBc3N1bWUgdXNlcnMga25vd3Mgd2hhdAotCXRoZXkncmUgZG9pbmcgaWYgb25lIG9mIHRoZSBhcmNoaXRlY3R1cmVzIGlzIGJmZF9hcmNoX3Vua25vd24uCi0KLVdlZCBNYXIgIDEgMTc6MzA6NDYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChlbGZfcG93ZXJwY19ob3d0b190YWJsZSk6IEZvciByZWxvY2F0aW9uCi0JUl9QUENfR09UMTYsIGNoYW5nZSBjb21wbGFpbl9vbl9vdmVyZmxvdyB0byBiZQotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZC4KLQotV2VkIE1hciAgMSAxMTo1Mjo1NSAxOTk1ICBKYXNvbiBNb2xlbmRhICA8Y3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFJlY29nbml6ZSBwb3dlcnBjLSotYWl4Ki4KLQotV2VkIE1hciAgMSAxMTo1NzozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTk2MC5jIChDT0ZGX1BBR0VfU0laRSk6IERlZmluZS4KLQotCSogY29uZmlndXJlLmluOiBSZXdyaXRlIG91dHB1dCBvZiBUREVGQVVMVFMgdG8gYXZvaWQgcmVseWluZyBvbgotCXNlbWFudGljcyBvZiBzaW5nbGUgcXVvdGVzIGluIHBhcmFtZXRlciBzdWJzdGl0dXRpb24uCi0KLVR1ZSBGZWIgMjggMTI6NTM6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zb3J0X2hkcnMpOiBTb3J0IGVtcHR5IHNlY3Rpb25zIGJlZm9yZSBub24tZW1wdHkKLQlzZWN0aW9ucywgaWYgdGhleSBoYXZlIHRoZSBzYW1lIFZNQS4KLQotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi1saW51eGVsZiopOiBOZXcgdGFyZ2V0LiAgVXNlIGkzODYtbGVsZi4KLQkoaVszNDVdODYtKi1nbnVlbGYqKTogTmV3IHRhcmdldC4gIFVzZSBpMzg2LWdlbGYuCi0JKiBjb25maWcvaTM4Ni1sZWxmLm10OiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9pMzg2LWdlbGYubXQ6IE5ldyBmaWxlLgotCi1Nb24gRmViIDI3IDEyOjU4OjI1IDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IGFkZCBhMjlrLSotdnh3b3JrcyBjb25maWd1cmF0aW9uLgotCi1XZWQgRmViIDIyIDE0OjQwOjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYW91dC5oIChOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKTogQ2hhbmdlIGRlY2xhcmF0aW9uIHRvCi0JdXNlIHJlbG9jX2hvd3RvX3R5cGUgcmF0aGVyIHRoYW4gY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdC4KLQotVHVlIEZlYiAyMSAxODoxOToyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJvdXQuYyAoYl9vdXRfc2x1cnBfcmVsb2NfdGFibGUpOiBEb24ndCByZXR1cm4gYW4gZXJyb3IgaWYgYXNrZWQKLQlmb3IgcmVsb2NhdGlvbnMgZm9yIHRoZSAuYnNzIHNlY3Rpb24uCi0KLVR1ZSBGZWIgMjEgMTU6MTM6MDUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IEhhbmRsZSBvYmplY3RzIHdpdGggb2RkCi0JbGVuZ3Rocy4KLQotRnJpIEZlYiAxNyAxMjozNDozNiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfZ290MTZfcmVsb2MpOiBNYWtlIEdPVCBzdHlsZSByZWxvY3MgYWRkCi0JMzI3NjgsIHNvIHRoZSBHT1QgcG9pbnRlciBjYW4gcG9pbnQgdG8gMTYzODQgcG9pbnRlcnMsIGluc3RlYWQgb2YKLQk4MTkyLgotCi1GcmkgRmViIDE3IDExOjQ1OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaG9zdHMvc3lzdjQuaDogSW5jbHVkZSA8dW5pc3RkLmg+LCA8c3RkbGliLmg+LCBhbmQgPHRpbWUuaD4uCi0JT25seSBkZWZpbmUgU0VFS19TRVQgYW5kIFNFRUtfQ1VSIGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JUmVtb3ZlIGFsbCBleHRlcm5hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0KLQkqIHN5bXMuYyAoYmZkX2RlY29kZV9zeW1jbGFzcyk6IFJldHVybiAnVycgZm9yIGEgd2VhayBzeW1ib2wuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogU2V0IHN0YXJ0IGFkZHJlc3MgYW5kIGZsYWdzCi0JYmVmb3JlIGNhbGxpbmcgY29mZl9ta29iamVjdF9ob29rLiAgUmVzdG9yZSB0aGVtIG9uIGZhaWx1cmUuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX21rb2JqZWN0X2hvb2spOiBJZiBub3QgRUNPRkZfQU9VVF9aTUFHSUMsCi0JY2xlYXIgRF9QQUdFRC4KLQotCSogY29mZmdlbi5jOiBSZWluZGVudGVkLgotCi1UaHUgRmViIDE2IDE0OjM3OjIzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IERvbid0IHVzZSBiaXRwb3MgaW4gb3ZlcmZsb3cKLQljYWxjdWxhdGlvbnMuCi0JKGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQotVGh1IEZlYiAxNiAxMzoyMjoyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6IFJlbW92ZSBhbGwgZnVuY3Rpb24gZGVjbGFyYXRpb25zIHdoaWNoIHJldHVybgotCWludCBvciB2b2lkLCBleGNlcHQgdGhlIG9uZSBmb3IgZnJlZS4KLQotV2VkIEZlYiAxNSAxNDo1NDoxOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChlbGZfcG93ZXJwY19ob3d0b190YWJsZSk6IFVzZSBhIGRlc3RpbmF0aW9uIG1hc2sgb2YKLQkweGZmZmZmZmZmIGZvciBSX1BQQ19SRUwzMiwgbm90IDAuCi0JKHBvd2VycGNfcmVsb2NfbWFwKTogQWRkIGxvdyAxNiBiaXQsIGhpZ2ggMTYgYml0LCBhbmQgaGlnaCAxNiBiaXQKLQlhZGp1c3RlZCByZWxvY2F0aW9ucy4KLQotVHVlIEZlYiAxNCAxNzo0NzoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSk6IERlZmluZS4KLQkobWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfZmluZF9uZWFyZXN0X2xpbmUpOiBEZWZpbmUuCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgZmluZF9saW5lX2luZm8gZmllbGQuCi0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfc3dhcF90aXJfaW4pOiBNb3ZlIHRvIGVjb2ZmbGluay5jLgotCShfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCk6IExpa2V3aXNlLgotCShfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbik6IExpa2V3aXNlLgotCShfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQpOiBMaWtld2lzZS4KLQkoY21wX2ZkcnRhYl9lbnRyeSk6IExpa2V3aXNlLgotCShta19mZHJ0YWIpOiBMaWtld2lzZS4KLQkobG9va3VwKTogTGlrZXdpc2UuCi0JKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBKdXN0IGNhbGwgX2JmZF9lY29mZl9sb2NhdGVfbGluZQotCXRvIGRvIG1vc3Qgb2YgdGhlIHdvcmsuICBBbGxvY2F0ZSBmaW5kX2xpbmVfaW5mbyBpZiBuZWNlc3NhcnkuCi0JKiBlY29mZmxpbmsuYzogSW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIi4KLQkoX2JmZF9lY29mZl9zd2FwX3Rpcl9pbik6IE1vdmUgaW4gZnJvbSBlY29mZi5jLgotCShfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCk6IExpa2V3aXNlLgotCShfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbik6IExpa2V3aXNlLgotCShfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQpOiBMaWtld2lzZS4KLQkoY21wX2ZkcnRhYl9lbnRyeSk6IExpa2V3aXNlLiAgVXNlIFBUUiBpbnN0ZWFkIG9mIHZvaWQgKi4KLQkobWtfZmRydGFiKTogTW92ZSBpbiBmcm9tIGVjb2ZmLmMuICBBZGQgZGVidWdfaW5mbywgZGVidWdfc3dhcCwKLQlhbmQgbGluZV9pbmZvIGFyZ3VtZW50cywgYW5kIHVzZSB0aGVtIGluc3RlYWQgb2YgZWNvZmZfZGF0YS4KLQkoZmRydGFiX2xvb2t1cCk6IE1vdmUgaW4gZnJvbSBsb29rdXAgaW4gZWNvZmYuYy4gIFJlbW92ZSBhYmZkCi0JYXJndW1lbnQsIGFkZCBsaW5lX2luZm8gYXJndW1lbnQuICBVc2UgaXQgaW5zdGVhZCBvZiBlY29mZl9kYXRhLgotCShfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogTmV3IGZ1bmN0aW9uLCBtb3N0bHkgZnJvbSB0aGUgb2xkCi0JX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSBpbiBlY29mZi5jLgotCSogbGliZWNvZmYuaCAoZWNvZmZfZGF0YV90eXBlKTogUmVtb3ZlIGZpbmRfYnVmZmVyLCBmZHJ0YWJfbGVuIGFuZAotCWZkcnRhYiBmaWVsZHMsIHJlcGxhY2luZyB0aGVtIGZpbmRfbGluZV9pbmZvIGZpZWxkLgotCShfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luKTogRGVjbGFyZS4KLQkoX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQpOiBEZWNsYXJlLgotCShfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbik6IERlY2xhcmUuCi0JKF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCk6IERlY2xhcmUuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9lY29mZl9sb2NhdGVfbGluZSk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdXNlIGVjb2ZmLm8gZm9yIGJmZF9lbGYzMl9iaWdtaXBzX3ZlYyBvcgotCWJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotVHVlIEZlYiAxNCAxNDowNDoyMiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGxpYmVsZi5oIChlbGZfYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkcyBlbGZfbWFjaGluZV9hbHQxIGFuZAotCWVsZl9tYWNoaW5lX2FsdDIgd2hpY2ggcHJvdmlkZSBhbHRlcm5hdGUgdmVyc2lvbnMgb2YgdGhlIG1hY2hpbmUKLQljb2RlLgotCi0JKiBlbGYzMi1wcGMuYyAoRUxGX01BQ0hJTkVfQUxUMSwgRUxGX01BQ0hJTkVfQUxUMik6IERlZmluZSB0bwotCXJlY29nbml6ZSBvbGQgdmVyc2lvbnMgb2YgdGhlIFBvd2VyUEMgbWFjaGluZSBjb2RlLgotCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmMzJfYmVkKTogSW5pdGlhbGl6ZSBhbHRlcm5hdGUgbWFjaGluZSBjb2RlCi0JZmllbGRzIGRlZmluZWQgYnkgRUxGX01BQ0hJTkVfQUxUMSBhbmQgRUxGX01BQ0hJTkVfQUxUMi4KLQotCSogZWxmNjQtdGFyZ2V0LmggKGVsZjY0X2JlZCk6IEluaXRpYWxpemUgYWx0ZXJuYXRlIG1hY2hpbmUgY29kZQotCWZpZWxkcyBkZWZpbmVkIGJ5IEVMRl9NQUNISU5FX0FMVDEgYW5kIEVMRl9NQUNISU5FX0FMVDIuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wLCBlbGZfY29yZV9maWxlX3ApOiBJbiBhZGRpdGlvbiB0byB0aGUKLQltYWluIG1hY2hpbmUgY29kZSBmaWVsZCwgY2hlY2sgdGhlIHR3byBhbHRlcm5hdGUgbWFjaGluZSBjb2RlCi0JZmllbGRzLgotCi1UdWUgRmViIDE0IDEyOjQ2OjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dGYxLmggKE1BQ0hUWVBFX09LKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4gIERvbid0Ci0JYWNjZXB0IE1fU1BBUkMgaWYgYmZkX2FyY2hfc3BhcmMgaXMgbm90IGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZAotCWFyY2hpdGVjdHVyZXMsIGFuZCBkb24ndCBhY2NlcHQgYSA2ODB4MCBtYWNoaW5lIHR5cGUgaWYKLQliZmRfYXJjaF9tNjhrIGlzIG5vdCBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlcy4KLQkqIGFvdXQwLmMgKE1BQ0hUWVBFX09LKTogRGVmaW5lLgotCi1Nb24gRmViIDEzIDIzOjI1OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSk6IERvbid0IHJldHVybiBhIHBvaW50ZXIKLQl0byBnYXJiYWdlIGlmIHRoZSBzeW1ib2wgaW5kZXggaXMgb3V0IG9mIHJhbmdlLgotCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pKTogTGlrZXdpc2UuCi0KLVRodSBGZWIgIDkgMTg6MzY6NTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGkzODZtc2Rvcy5vLgotCi1UaHUgRmViICA5IDEyOjAyOjM1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4NmxpbnV4LmMgKE5FRURTX1NIUkxJQik6IERlZmluZS4KLQkobGludXhfdGFsbHlfc3ltYm9scyk6IENyYXNoIGlmIGEgTkVFRFNfU0hSTElCIHN5bWJvbCBpcwotCXVuZGVmaW5lZC4gIEZyb20gaGpsQG55bmV4c3QuY29tIChILkouIEx1KS4KLQotV2VkIEZlYiAgOCAxNzoyNjowMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogQWxsb2NhdGUgY29tbW9uCi0Jc3ltYm9sIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gIERvbid0IGJvdGhlciB0byBjaGVjayBmb3IgY29tbW9uCi0Jc3ltYm9sIHNpemUgb3ZlcmZsb3cuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBBZGp1c3QgcmVmZXJlbmNlcwotCXRvIGNvbW1vbiBzeW1ib2wgaW5mb3JtYXRpb24gZm9yIG5ldyBzdHJ1Y3R1cmUuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBMaWtld2lzZS4KLQotV2VkIEZlYiAgOCAwOTo1Mzo0MiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zb3J0X2hkcnMpOiBQdXQgU0hUX05PQklUUyBzZWN0aW9ucyBhZnRlciAhU0hUX05PQklUUy4KLQotVHVlIEZlYiAgNyAxNjoyNzozMyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfZmluZF9uZWFyZXN0X2xpbmUpOiBKdXN0IHJldHVybiBmYWxzZSwgZG9uJ3QKLQlhYm9ydC4KLQotVHVlIEZlYiAgNyAxNDo0MzozMyAxOTk1ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYzogUmVmb3JtYXR0ZWQgc29tZSBjb21tZW50cyBhbmQgYnJhY2UgY29uc3RydWN0cyBpbgotCXJlY2VudCBjaGFuZ2VzIHRvIEdOVSBzdHlsZS4KLQkoY21wX2ZkcnRhYl9lbnRyeSwgbWtfZmRydGFiLCBsb29rdXApOiBVc2Ugb2xkLXN0eWxlIGZ1bmN0aW9uCi0JZGVmaW5pdGlvbnMuCi0KLVR1ZSBGZWIgIDcgMTQ6MjE6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9wZHJfaW4pOiBaZXJvIG91dCBpbnRlcm4gYmVmb3JlIHNldHRpbmcKLQlhbnkgb2YgdGhlIGZpZWxkcy4KLQotTW9uIEZlYiAgNiAyMDowMToyNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JU2F0IEZlYiAgNCAxNDoyMDoyNCAxOTk1ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHU+Ci0KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX3Bkcl9pbiwgZWNvZmZfc3dhcF9wZHJfb3V0KTogYWRkZWQKLQlpbnRlcm5hbGl6aW5nL2V4dGVybmFsaXppbmcgbmV3ICJwcm9mIiBmaWVsZC4KLQotCSogbGliZWNvZmYuaCAoZWNvZmZfdGRhdGEpOiBhZGRlZCBmZHJ0YWIuCi0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBGaXhlZC4KLQotTW9uIEZlYiAgNiAxNDoyNToyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBzYXdfbmVlZGVkIGZpZWxkLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBTZXQgc2F3X25lZWRlZCBpZgotCURUX05FRURFRCBzZWVuIGluIC5keW5hbWljIHNlY3Rpb24uCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBXYXJuIGlmIGFuIHVuZGVmaW5lZCBzeW1ib2wgaXMKLQlvbmx5IHJlZmVyZW5jZWQgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgbm90IG1ha2luZyBhIHNoYXJlZAotCW9iamVjdCwgYW5kIHNhd19uZWVkZWQgaXMgZmFsc2UuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0aWFsaXplIHNhd19uZWVkZWQuCi0KLQkqIGxpYmVsZi5oIChFTEZfTElOS19IQVNIX0RFRklORURfV0VBSyk6IERvbid0IGRlZmluZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgY2xlYXIgb3Igc2V0Ci0JRUxGX0xJTktfSEFTSF9ERUZJTkVEX1dFQUsuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBEb24ndCBjaGVjayBFTEZfTElOS19IQVNIX0RFRklORURfV0VBSy4KLQotCURpc3Rpbmd1aXNoIGEgd2VhayBkZWZpbmVkIHN5bWJvbCBmcm9tIGEgcmVndWxhciBkZWZpbmVkIHN5bWJvbC4KLQkqIGxpbmtlci5jIChlbnVtIGxpbmtfYWN0aW9uKTogQWRkIERFRlcuCi0JKGxpbmtfYWN0aW9uKTogQWRkIGJmZF9saW5rX2hhc2hfZGVmd2VhayBjb2x1bW4uCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogQWRkIERFRlcgY2FzZS4gIEhhbmRsZQotCWJmZF9saW5rX2hhc2hfZGVmd2VhayBpbiBhIGZldyBvdGhlciBjYXNlcy4KLQkqIE1hbnkgZmlsZXMgKGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKTogUmVuYW1lZCBmcm9tCi0JYmZkX2xpbmtfaGFzaF93ZWFrLgotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBIYW5kbGUgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLgotCShhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQkqIGJvdXQuYyAoZ2V0X3ZhbHVlKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWEyOWsuYyAoY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyk6IExpa2V3aXNlLgotCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKG1pcHNfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLgotCShiZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBjb2ZmbGluay5jIChjb2ZmX3dyaXRlX2dsb2JhbF9zeW0pOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiBMSWtld2lzZS4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZjMyX2hwcGFfc2l6ZV9zdHVicyk6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfb3V0cHV0X2V4dHN5bSk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBMaWtld2lzZS4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IExpa2V3aXNlLgotCSogaTM4NmxpbnV4LmMgKGxpbnV4X2FkZF9vbmVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGxpbnV4X3RhbGx5X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkobGludXhfZmluaXNoX2R5bmFtaWNfbGluayk6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKHNldF9zeW1ib2xfZnJvbV9oYXNoKTogTGlrZXdpc2UuCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKTogTGlrZXdpc2UuCi0JKGJmZF9wZXJmb3JtX3NsaXApOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKHN1bm9zX3NjYW5fc3RkX3JlbG9jcyk6IExpa2V3aXNlLgotCShzdW5vc19zY2FuX2V4dF9yZWxvY3MpOiBMaWtld2lzZS4KLQkoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi1Nb24gRmViICA2IDAzOjIwOjE3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlDaGFuZ2VzIGZyb20gQnJ5YW4gRm9yZCwgYmFmb3JkQHNjaGlyZi5jcy51dGFoLmVkdToKLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotbXNkb3MqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Nm1zZG9zX3ZlYyk6IEhhbmRsZSBpdC4KLQkqIGkzODZtc2Rvcy5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9pMzg2LW1zZG9zLm10OiBOZXcgZmlsZS4KLQkqIGJmZC5jIChlbnVtIGJmZF9lcnJvcik6IEFkZGVkIG5ldyB2YWx1ZSBiZmRfZXJyb3JfZmlsZV90b29fYmlnLgotCShiZmRfZXJybXNncyk6IEFkZGVkIHN0cmluZyB0byB0YWJsZS4KLQkqIGxpYmFvdXQuaCAocmVsb2NfdHlwZS1sb29rdXApOiBEZWNsYXJlIGl0LgotCSogdGFyZ2V0cy5jIChlbnVtIGJmZF9mbGF2b3VyKTogQWRkZWQgYmZkX3RhcmdldF9tc2Rvc19mbGF2b3VyLgotCShpMzg2bXNkb3NfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgaXQgdG8gdGhlIGxpc3QuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1XZWQgRmViICAxIDAxOjMyOjE0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NldF9yZWxvY19pbmZvLCBjYXNlIFJfREFUQV9PTkVfU1lNQk9MKTogSWYgdGhlcmUncwotCW5vdGhpbmcgaW4gUl9EQVRBX09WRVJSSURFLCB0aGVuIHRyeSB0byBmaW5kIHRoZSBhZGRlbmQgaW4gdGhlCi0Jc2VjdGlvbidzIGNvbnRlbnRzLgotCShzb21fd3JpdGVfZml4dXBzKTogSWdub3JlIHRoZSBhZGRlbmQgaW4gYSBSX0RBVEFfT05FX1NZTUJPTCBmaXh1cC4KLQotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBNb3JlIGhlcnVpc3RpY3MgdG8gZGV0ZWN0IHRoZQotCWJyYWluZGFtYWdlZCBIUCBPU0YxIGxpbmtlci4gCi0JKHNldHVwX3NlY3Rpb25zKTogRG9uJ3QgZm9yZ2V0IHRvIGZyZWUgc3Vic3BhY2Vfc2VjdGlvbnMgaWYgd2UgZ2V0Ci0JYW4gZXJyb3IuCi0JKHNvbV9zbHVycF9zdHJpbmdfdGFibGUpOiBBbGxvY2F0ZSBzdHJpbmdzIG9uIHRoaXMgYmZkJ3Mgb2JzdGFjawotCXJhdGhlciB0aGFuIGRpcmVjdGx5IG91dCBvZiB0aGUgaGVhcC4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IExpa2V3aXNlIGZvciB0aGUgc2F2ZWQgY29weSBvZiB0aGUKLQljYW5vbmljYWwgc3ltYm9scy4KLQkoc29tX3NsdXJwX3JlbG9jX3RhYmxlKTogTGlrZXdpc2UgZm9yIHRoZSBzYXZlZCBjb3B5IG9mIHRoZQotCWNhbm9uaWNhbCByZWxvY2F0aW9ucy4gIEZyZWUgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucyB3aGVuIHdlJ3JlCi0JZG9uZSB3aXRoIHRoZW0uCi0KLVR1ZSBKYW4gMzEgMjE6NTM6MjggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogTmV3IG1lbWJlciBwcm9ncmFtX2hlYWRlcl9zaXplLgotCSogZWxmY29kZS5oIChnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IE5ldyBwYXJhbWV0ZXJzIHNvcnRlZF9oZHJzLAotCWNvdW50LCBhbmQgbWF4cGFnZXNpemUuICBBbGwgY2FsbGVycyB1cGRhdGVkLgotCUlmIHNvcnRlZF9oZHJzIGlzIG5vbi1OVUxMLCB1c2UgaXQgdG8gY29tcHV0ZSB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzLgotCVNhdmUgcmVzdWx0IGluIGNhc2UgY2FsbGVkIGFnYWluLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFNvcnQgaGVhZGVycyBiZWZvcmUgY2FsbGluZwotCWdldF9wcm9ncmFtX2hlYWRlcl9zaXplLgotCi1UdWUgSmFuIDMxIDE1OjI3OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IEFkZCBzb3J0ZWRfaGRycyBwYXJhbWV0ZXIuCi0JU2VhcmNoIHRocm91Z2ggaXQgcmF0aGVyIHRoYW4gdGhyb3VnaCB1bnNvcnRlZCBzZWN0aW9uIGhlYWRlcnMuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogUGFzcyBzb3J0ZWRfaGRycyB0bwotCW1hcF9wcm9ncmFtX3NlZ21lbnRzLgotCi1Nb24gSmFuIDMwIDIyOjA0OjUzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBGaXggcHJvYmxlbXMgaW4gcmFuZ2UKLQljaGVja2luZy4gIEV4cGVjdCBhcmd1bWVudCBPRkZTRVQgdG8gYmUgc2VjdGlvbi1yZWxhdGl2ZS4gIEZyb20KLQlEYXZpZCBNb3NiZXJnZXItVGFuZywgZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdS4KLQotTW9uIEphbiAzMCAxMToyMjoxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpKTogRG9uJ3QgZG8KLQlhbnl0aGluZyBpZiB3ZSBhcmUgbm90IGxpbmtpbmcgYW4gRUxGIGZpbGUuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogTGlrZXdpc2UuCi0KLVNhdCBKYW4gMjggMTI6NDg6NTcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChjb21wYXJlX3N1YnNwYWNlcyk6IE5ldyBmdW5jdGlvbiB0byBzb3J0IHN1YnNwYWNlcyBieQotCXRoZWlyIGxvY2F0aW9uIGluIHRoZSBvYmplY3QgZmlsZS4KLQkoc2V0dXBfc2VjdGlvbnMpOiBXaGVuIGNvbXB1dGluZyB0aGUgaW5kZXggZm9yIGVhY2ggc3Vic3BhY2UsCi0JaGFuZGxlIGNhc2Ugd2hlcmUgc2V0dXBfc2VjdGlvbnMgcmVhZHMgdGhlIHN1YnNwYWNlcyBpbiBhCi0JZGlmZmVyZW50IG9yZGVyIHRoYXQgdGhleSBhcHBlYXIgaW4gdGhlIG9iamVjdCBmaWxlLgotCShzb21faXNfc3BhY2UpOiBBbHNvIGV4YW1pbmUgdGhlIG91dHB1dCBzZWN0aW9uIGZvciB0aGUgY29udGFpbmluZwotCXNlY3Rpb24uCi0JKHNvbV9pc19zdWJzcGFjZSwgc29tX2lzX2NvbnRhaW5lcik6IExpa2V3aXNlLgotCShzb21fYmVnaW5fd3JpdGluZyk6IERvbid0IHByZXBhcmUgb3Igd3JpdGUgZml4dXBzIGhlcmUuICBXaGVuCi0Jd3JpdGluZyB0aGUgc3ltYm9sIHN0cmluZ3MsIHVzZSB0aGUgdW5zb3J0ZWQgc3ltYm9sIHRhYmxlLgotCShzb21fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3Qgd3JpdGUgdGhlIHN5bWJvbCB0YWJsZSBoZXJlLgotCShzb21fZmluaXNoX3dyaXRpbmcpOiBQcmVwYXJlIGFuZCB3cml0ZSB0aGUgZml4dXBzIGhlcmUuICBMaWtld2lzZQotCWZvciB0aGUgc3ltYm9sIHRhYmxlLgotCShzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvKTogVW5kZWZpbmVkIHN5bWJvbHMgYWx3YXlzIGhhdmUKLQl0eXBlIFNTX1VOU0FUIHJlZ2FyZGxlc3Mgb2YgQlNGX0VYUE9SVC4KLQkoc29tX3NldF9yZWxvY19pbmZvKTogVW5wYWNrIGFuZCBhdHRhY2ggYXJndW1lbnQgbG9jYXRpb24KLQlpbmZvcm1hdGlvbiBmb3IgUl9QQ1JFTF9DQUxMIGFuZCBSX0FCU19DQUxMIHJlbG9jYXRpb25zLgotCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IE5ldyBoZXVyaXN0aWMgdG8gZGV0ZXJtaW5lIGlmIHRoZQotCWVudHJ5IGFuZCBmbGFncyBmaWVsZHMgYXJlIHN3aXRjaGVkIGluIHRoZSBleGVjIGhlYWRlci4KLQotU2F0IEphbiAyOCAwMDoxNjowMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogVXNlICpzeW1faGFzaCBpbnN0ZWFkCi0Jb2YgaCBpZiB3ZSBtaWdodCBub3QgYmUgZG9pbmcgYW4gRUxGIGxpbmsuCi0KLUZyaSBKYW4gMjcgMTY6MTM6NDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBJZiB0aGUgc2l6ZSBvZiBhbiBpbnB1dAotCS5yZWdpbmZvIHNlY3Rpb24gaXMgemVybywgZm9yY2UgaXQgdG8gdGhlIGNvcnJlY3Qgc2l6ZSwgc2luY2UgdGhlCi0JbGlua2VyIGVtdWxhdGlvbiBjb2RlIG1heSBoYXZlIGNsb2JiZXJlZCBpdC4KLQotCSogZWxmY29kZS5oIChlbGZfc29ydF9oZHJzKTogQ29ycmVjdCBTSEZfQUxMT0MgdGVzdC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBGcmVlIHNvcnRlZF9oZHJzLgotCi1UaHUgSmFuIDI2IDA5OjAwOjEyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiBzcmVjLmMgKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBGaXggb2ZmIGJ5Ci0Jb25lIGVuZCBhZGRyZXNzIGNhbGN1bGF0aW9uLgotCi0JKiBjb25maWcuYmZkOiAobTY4Ki1lc3QtY29mZik6IE5ldyBjb25maWd1cmF0aW9uLgotCi1UaHUgSmFuIDI2IDExOjM5OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBPbmx5IGV4YW1pbmUgd2Vha2RlZiBpZgotCXdlIGFyZSB1c2luZyBhbiBFTEYgaGFzaCB0YWJsZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBBbHdheXMgc2V0IEVYRUNfUCBpZgotCXRoZSBzdGFydCBhZGRyZXNzIGlzIGluIHRoZSAudGV4dCBzZWN0aW9uLCBldmVuIGlmIFNUQVRfRk9SX0VYRUMKLQlpcyBzZXQuICBKdXN0IHVzZSBTVEFUX0ZPUl9FWEVDIGFzIGFuIGFkZGl0aW9uYWwgdGVzdC4KLQotVGh1IEphbiAyNiAxMToxMjo1NCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMpOiBVc2UgRU1fUFBDIGluc3RlYWQgb2YKLQlFTV9DWUdOVVNfUE9XRVJQQy4KLQotCSogZWxmMzItcHBjLmMgKHJlbG9jX3R5cGUpOiBBZGQgYWxsIFN5c3RlbSBWLjQgYW5kIGVBQkkKLQlyZWxvY2F0aW9ucyBjdXJyZW50bHkgZGVmaW5lZC4KLQkocG93ZXJwY19yZWxvY19tYXApOiBBZGp1c3QgdG8gbmV3IHJlbG9jYXRpb24gbmFtZXMuCi0JKGVsZl9wb3dlcnBjX2hvd3RvX3RhYmxlKTogQWRkIG1vc3Qgb2YgdGhlIG5ldyByZWxvY2F0aW9ucy4KLQkoRUxGX01BQ0hJTkVfQ09ERSk6IFVzZSBFTV9QUEMgaW5zdGVhZCBvZiBFTV9DWUdOVVNfUE9XRVJQQy4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIHBvd2VycGMtKi1lYWJpLgotCi0JKiBjb25maWcvcHBjLWVsZi5tdDogQWRkIHJzNjAwMCBhcmNoaXRlY3R1cmUgc3VwcG9ydCB0byB0aGUKLQlQb3dlclBDLiAgQWxzbyBhZGQgWENPRkYgc3VwcG9ydC4KLQotV2VkIEphbiAyNSAyMzoyNjoxMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoQ0FMQ19BRERFTkQpOiBEb24ndCBkZWZpbmUuCi0JKGNvZmZfc2hfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZS4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogVXNlIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24uCi0KLVR1ZSBKYW4gMjQgMTQ6MjI6NDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX291dHB1dF9leHRzeW0pOiBTZXQgdGhlIHZhbHVlIG9mIHRoZQotCUVDT0ZGIHN5bWJvbCBmcm9tIHRoZSBoYXNoIHRhYmxlIGVudHJ5LgotCi1Nb24gSmFuIDIzIDE0OjUzOjM1IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiBjb2ZmLXNoLmMgKGNvZmZfc2hfcmVsb2NhdGVfc2VjdGlvbik6ICBEb24ndCBzdWJ0cmFjdAotCXZtYSB0d2ljZS4KLQotTW9uIEphbiAyMyAxMzozMzoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoc2hfcmVsb2MpOiBEb24ndCBpZ25vcmUgdGhlIHByZXZpb3VzIGNvbnRlbnRzIG9mIGFuCi0JUl9TSF9JTU0zMiByZWxvYy4KLQotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi1nbnUqKTogU2V0IGJmZF9uYW1lIHRvIGkzODYtZ251LgotCSogY29uZmlnL2kzODYtZ251Lm10OiBOZXcgZmlsZS4gIEluY2x1ZGUgRUxGIHN1cHBvcnQuCi0KLQkqIG9wbmNscy5jIChiZmRfb3BlbnN0cmVhbXIpOiBDYWxsIGJmZF9jYWNoZV9pbml0LgotCi1GcmkgSmFuIDIwIDExOjQ0OjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBPbmx5IHNldCB0aGUgc3Vub3Mgc3BlY2lmaWMKLQlmaWVsZHMgaWYgd2UgYXJlIGRvaW5nIGEgc3Vub3MgbGluay4KLQotV2VkIEphbiAxOCAxMjoyODoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNwdS1oODMwMC5jIChoODMwMF9pbmZvX3N0cnVjdCk6IENoYW5nZSBuYW1lIGZyb20gIkg4LzMwMCIgdG8KLQkiaDgzMDAiIGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIGNwdS0qIGZpbGVzLgotCShoODMwMGhfaW5mb19zdHJ1Y3QpOiBDaGFuZ2UgbmFtZSBmcm9tICJIOC8zMDBIIiB0byAiaDgzMDBoIi4KLQkqIGNvZmYtaDgzMDAuYyAoc3BlY2lhbCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgZGlmZi4KLQotVHVlIEphbiAxNyAxMDo1MjozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oIChiZmRfYnl0ZSwgcmVsb2NfaG93dG9fdHlwZSk6IERlZmluZSBoZXJlLCBub3QuLi4KLQkqIHJlbG9jLmMgKGJmZF9ieXRlLCByZWxvY19ob3d0b190eXBlKTogaGVyZS4KLQkqIENoYW5nZWQgYWxsIG9jY3VycmVuY2VzIG9mIGBgY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCcnCi0JdG8gYmUgYGByZWxvY19ob3d0b190eXBlJycgaW5zdGVhZC4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmgsIGxpYmNvZmYuaDogUmVidWlsdC4KLQotCSogb3BuY2xzLmMgKGJmZF9vcGVuc3RyZWFtcik6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogZWxmMzItbWlwcy5jIChlbnVtIHJlbG9jX3R5cGUpOiBEZWZpbmUgbmV3IHJlbG9jcyB1c2VkIG9uIElyaXguCi0JKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogQWRkIGVudHJpZXMgZm9yIG5ldyByZWxvY3MuCi0JKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogSGFuZGxlIFNIVF9NSVBTX01TWU0sCi0JU0hUX01JUFNfRFdBUkYsIGFuZCBTSFRfTUlQU19FVkVOVFMuCi0JKG1pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBIYW5kbGUgc2VjdGlvbnMgbmFtZWQgLm1zeW0sIC5kZWJ1Z18qCi0JYW5kIC5NSVBTLmV2ZW50cy4qLgotCi0JKiBzcmVjLmMgKHNyZWNfaW5pdCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgaS4KLQotU2F0IEphbiAxNCAxOTowOTo0OCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bqb25ueT4KLQotCSogYXJjaHVyZXMuYywgTWFrZWZpbGUuaW4sIHRhcmdldHMuYywgYmZkLWluMi5oLCBjb2ZmY29kZS5oLAotCWNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5pbiwgY29uZmlnL3c2NS5tdDogSW5pdGlhbCBzdXBwb3J0IGZvciB0aGUgVzY1LgotCi1TdW4gSmFuIDE1IDEzOjU3OjQ1IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiBDb25maWd1cmUgZm9yIFdJTjMyLgotCi1UaHUgSmFuIDEyIDE2OjMwOjQ3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0c3R1ZmYpOiBJbmNsdWRlIGBoZWFkZXJzJy4KLQotCSogc3Vub3MuYyAobTY4a19wbHRfZmlyc3RfZW50cnksIHNwYXJjX3BsdF9maXJzdF9lbnRyeSk6IE5vdwotCWNvbnN0LgotCSogdGVraGV4LmMgKGRpZ3MpOiBEaXR0by4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcGx0MF9lbnRyeSwgZWxmX2kzODZfcGx0X2VudHJ5KTogRGl0dG8uCi0KLQkqIHNyZWMuYywgdGVraGV4LmM6IEluY2x1ZGUgbGliaWJlcnR5LmguICBEZWxldGUgc3RhdGljIGFycmF5Ci0JaGV4X3ZhbHVlIGFuZCByZXBsYWNlIHJlZmVyZW5jZXMgdG8gaXQgd2l0aCByZWZlcmVuY2VzIHRvCi0JaGV4X2luaXQsIGhleF9wLCBhbmQgaGV4X3ZhbHVlLgotCSogTWFrZWZpbGUuaW46IFVwZGF0ZWQgZGVwZW5kZW5jaWVzLgotCi0JKiBhcmNodXJlcy5jIChhcmNodXJlc19pbml0X3RhYmxlKTogTm93IGNvbnN0LgotCShiZmRfYXJjaF9pbml0KTogQWRqdXN0ZWQgdHlwZSBvZiBsb2NhbCB2YXIgYHB0YWJsZScuCi0KLVRodSBKYW4gMTIgMDk6MzM6MjQgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBob3N0cy9zeW1tZXRyeS5oOiAgUmVkZWZpbmUgYHNoYXJlZCcgdG8gZW5hYmxlIGNvbXBpbGF0aW9uCi0Jd2l0aCB0aGUgbmF0aXZlIER5bml4IGNjIGNvbXBpbGVyLgotCSogaTM4NmR5bml4LmM6ICBJbmNsdWRlIGFvdXR4LmggaW5zdGVhZCBvZiB1c2luZyByb3V0aW5lcwotCWZyb20gYW91dDMyLmMuCi0KLVdlZCBKYW4gMTEgMjE6MzE6NDEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAocmVsb2NfaG93dG9fdHlwZSk6IE1ha2UgdHlwZWRlZiBpbmNsdWRlIGBjb25zdCcuCi0JKiBhb3V0LW5zMzJrLmMsIGFvdXR4LmgsIGJvdXQuYywgY2YtbTY4a2x5bnguYywgY29mZi1pMzg2LmMsCi0JY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jLCBjb2ZmbGluay5jLCBjcHUtbnMzMmsuYywgZWNvZmYuYywKLQllbGYzMi1ocHBhLmMsIGVsZjMyLWkzODYuYywgZWxmMzItbWlwcy5jLCBlbGYzMi1zcGFyYy5jLAotCWVsZmNvZGUuaCwgbGliYmZkLWluLmgsIGxpbmtlci5jLCBtaXBzYnNkLmMsIG5sbTMyLXBwYy5jLCBvYXN5cy5jLAotCXJlbG9jLmMsIHNvbS5jOiBEb24ndCB1c2UgYGNvbnN0JyBpbiBjb21iaW5hdGlvbiB3aXRoCi0JYHJlbG9jX2hvd3RvX3R5cGUnLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3R5cGVfdG9fc3RyaW5nKTogTG9jYWwgdmFyaWFibGUgYGJ1ZmZlcjEnIGRvZXNuJ3QKLQluZWVkIHRvIGJlIHN0YXRpYy4KLQotV2VkIEphbiAxMSAxNDozNjo0MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogRG9uJ3QgY29yZSBkdW1wIGlmIGEgbXVsdGlwbGUKLQlkZWZpbml0aW9uIG9mIGFuIGFic29sdXRlIHN5bWJvbCBpcyBlbmNvdW50ZXJlZC4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogSWdub3JlCi0JcmVkZWZpbml0aW9ucyBvZiBhbiBhYnNvbHV0ZSBzeW1ib2wgdG8gdGhlIHNhbWUgdmFsdWUuCi0KLU1vbiBKYW4gIDkgMTU6NTE6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEl0J3MgcmVhc29uYWJsZSBmb3Igbm8KLQlmbGFncyB0byBiZSBzZXQsIHNvIGRvbid0IGluc2lzdCBvdGhlcndpc2UuCi0KLUZyaSBKYW4gIDYgMTY6Mzk6NDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCBzZXQgQlNGX0dMT0JBTCBmb3IgYW4KLQl1bmRlZmluZWQgb3IgY29tbW9uIHN5bWJvbC4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLVdlZCBKYW4gIDQgMTQ6MTQ6MDUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wpOiBPbmx5IHJldHVybiBzZWN0aW9ucyB3aGljaAotCWNvcnJlc3BvbmQgdG8gc3Vic3BhY2VzLgotCi0JKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBEb24ndCBmb3JnZXQgdG8gYnVtcCB0aGUKLQl0b3RhbF9zdWJzcGFjZXMgd2hlbiB3cml0aW5nIHRoZSB1bmxvYWRhYmxlIHN1YnNwYWNlcy4KLQotV2VkIERlYyAyOCAyMDo1NDo0NyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBVc2UgU0VDX0hBU19DT05URU5UUyB0byBpZGVudGlmeQotCWJzcy1saWtlIHNlY3Rpb25zLgotCShzb21fZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoc29tX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLVR1ZSBEZWMgMjcgMTQ6MDM6NDcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzZXR1cF9zZWN0aW9ucyk6IFR1cm4gb2ZmIFNFQ19IQVNfQ09OVEVOVFMgZm9yIGJzcy1saWtlCi0Jc2VjdGlvbnMuCi0KLVR1ZSBEZWMgMjAgMTU6MzA6MTIgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChiZmRfZGVidWdfc2VjdGlvbik6IERlbGV0ZWQuCi0JKGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCk6IFJldHVybiBhYnNvbHV0ZSBzZWN0aW9uIGZvciBkZWJ1ZwotCXN5bWJvbC4KLQkoY29mZl93cml0ZV9zeW1ib2wpOiBTZXQgQlNGX0RFQlVHR0lORyBmb3IgQ19GSUxFIHN5bWJvbHMuICBJZgotCUJTRl9ERUJVR0dJTkcgaXMgc2V0LCBzZXQgc2VjdGlvbiB0byBOX0RFQlVHLgotCShjb2ZmX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCk6IFVzZSBhYnNvbHV0ZSBzZWN0aW9uLgotCi0JKiBlbGZjb2RlLmggKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogSW4gYXNzZXJ0aW9uLAotCWZvcmNlIGFsbCB2YWx1ZXMgdG8gdGhlIHNhbWUgdHlwZS4KLQotVHVlIERlYyAyMCAxMToxMTo1OCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4MzAwLmMgKGhvd3RvX3RhYmxlKTogQWxsIHJlbG9jcyBnZXQgYSBzcGVjaWFsIGZ1bmN0aW9uLgotCShzcGVjaWFsKTogTmV2ZXIgZG8gYW55dGhpbmcgd2hlbiBsaW5raW5nIC1yLgotCi1UdWUgRGVjIDIwIDEzOjU4OjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogaTM4NmxpbnV4LmMgKGxpbnV4X2FkZF9vbmVfc3ltYm9sKTogRG9uJ3QgZG8gYW55dGhpbmcgTGludXgKLQlzcGVjaWZpYyBpZiB0aGlzIGlzIG5vdCBhIExpbnV4IGhhc2ggdGFibGUuICBGcm9tIEVyaWMgWW91bmdkYWxlCi0JPGVyaWNAYWliLmNvbT4uCi0KLQlQYXRjaGVzIGZyb20ga2tvamltYUBtaXgub3IuanAgKEthenVtb3RvIEtvamltYSk6Ci0JKiBtaXBzYnNkLmMgKG1pcHNfaG93dG9fdGFibGVfZXh0KTogQ2hhbmdlIHNpemVzIG9mIG1lbW9yeSByZWxvY3MKLQlhcHBseSB0byBmcm9tIHR3byBieXRlcyB0byBmb3VyIGJ5dGVzLgotCSogTVkocmVsb2NfaG93dG9fdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX0NUT1IuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IENvcnJlY3QgYW5kIGV4cGFuZCB0aGUKLQlsaXN0IG9mIGNhc2VzIGZvciB3aGljaCByZWxvY2F0aW9uIG5lZWQgbm90IGJlIGNvbXB1dGVkLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi1Nb24gRGVjIDE5IDIzOjA5OjE2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IERlbGV0ZSBkb19sb2NhbHMgYW5kCi0JZG9fZ2xvYmFscyBhcmd1bWVudHMsIGFsd2F5cyByZWFkIHN5bWJvbCBleHRlbnNpb24gaW5mb3JtYXRpb24gZm9yCi0JZ2xvYmFscyBhbmQgbG9jYWxzLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkoZWxmMzJfaHBwYV9zaXplX3N0dWJzKTogUmV3b3JrIHRvIG9ubHkgcmVhZCBzeW1ib2wgZXh0ZW5zaW9uCi0JaW5mb3JtYXRpb24gb25jZSBmb3IgZWFjaCBpbnB1dCBiZmQuICAxMCUgaW1wcm92ZW1lbnQgaW4gbGlua2VyCi0JcGVyZm9ybWFuY2UuCi0KLUZyaSBEZWMgMTYgMTI6Mjg6NDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBDaGVjawotCWJmZF9pc19hYnNfc2VjdGlvbiwgZXRjLiwgb25seSBhZnRlciBjaGVja2luZyBmb3IgdGhlIHNlY3Rpb24gaW4KLQl0aGUgQkZEIGFuZCBhZnRlciBjYWxsaW5nIHRoZSBiYWNrZW5kIHJvdXRpbmUuCi0KLVdlZCBEZWMgMTQgMjA6MjE6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9tYXBfc3ltYm9scyk6IE9ubHkgdXNlIHNlY3Rpb24gc3ltYm9scyB3aG9zZQotCXZhbHVlIGlzIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiwgY2hlY2tpbmcgb3V0cHV0X29mZnNldCB3aGVuCi0JdXNpbmcgb3V0cHV0X3NlY3Rpb24uICBXaGVuIGNyZWF0aW5nIGEgbmV3IHN5bWJvbCwgc2V0IHRoZSB2YWx1ZQotCXRvIDAsIHNpbmNlIEJGRCBzeW1ib2wgdmFsdWVzIGFyZSBzZWN0aW9uIHJlbGF0aXZlLgotCi1UdWUgRGVjIDEzIDEzOjMxOjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY3B1LXo4ay5jIChhcmNoX2luZm9fc3RydWN0KTogTWFrZSB6ODAwMiB0aGUgZGVmYXVsdAotCWFyY2hpdGVjdHVyZS4KLQotRnJpIERlYyAgOSAxMjo0MzowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogSWYgdGhlIGZpcnN0IG9iamVjdCBpbiB0aGUKLQlhcmNoaXZlIGlzIG5vdCBhbiBFTEYgb2JqZWN0LCBwYXNzIHRoZSBhcmNoaXZlIHRvIHRoZSBhZGRfc3ltYm9scwotCWVudHJ5IHBvaW50IGFwcHJvcHJpYXRlIGZvciB0aGUgZmlyc3Qgb2JqZWN0LiAgRnJvbSBFcmljIFlvdW5nZGFsZQotCTxlcmljQGFpYi5jb20+LgotCSogYW91dHguaCAoTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpKTogU2ltaWxhciBjaGFuZ2UgaWYgdGhlCi0JZmlyc3Qgb2JqZWN0IGlzIG5vdCBhbiBhLm91dCBvYmplY3QuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGNvbXB1dGUKLQlyZWxvY2F0aW9uIGluIGNhc2VzIHdoZXJlIHdlIHdvbid0IHVzZSBpdC4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotVGh1IERlYyAgOCAxNDoxOTo0MSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBwYzUzMi1tYWNoLmMgKE5BTUUpOiBEZWZpbmUgdG8gdXNlIG5zMzJrYW91dCBwcmVmaXguCi0JKiBuczMya25ldGJzZC5jIChOQU1FKTogRGl0dG8uCi0JKG5zMzJrYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZSB0byBzdGFuZGFyZCBhb3V0LTMyCi0JdmVyc2lvbi4KLQotRnJpIERlYyAgMiAxMzo1Njo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWFkX3JlbG9jcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQKLQlvZiBtaXBzX3JlbGF4X3NlY3Rpb24uCi0JKG1pcHNfcmVsYXhfc2VjdGlvbik6IENhbGwgbWlwc19yZWFkX3JlbG9jcy4KLQkoYmZkX21pcHNfZWNvZmZfY3JlYXRlX2VtYmVkZGVkX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfbW5pcHNfZWNvZmZfY3JlYXRlX2VtYmVkZGVkX3JlbG9jcyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLVdlZCBOb3YgMzAgMTQ6MTI6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLXNoLmM6IFVzZSBfYmZkX2R1bW15X3RhcmdldCBpbnN0ZWFkIG9mIG5vX2FyY2hpdmUuCi0KLVR1ZSBOb3YgMjkgMTQ6MDA6MTkgMTk5NCAgSi5ULiBDb25rbGluICA8anRjQC5ydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi1mcmVlYnNkKik6IFVzZSBpMzg2LWJzZCBhcyBiZmRfbmFtZS4KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0NV04Ni0qLWZyZWVic2QqKTogVXNlIGkzODZic2QgYXMgbXlfaG9zdC4KLQotTW9uIE5vdiAyOCAxNTozNjowNCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tNjhrLW5ic2QubXQgKERFRkFVTFRfVkVDVE9SKTogc2V0IHRvIG02OGtuZXRic2RfdmVjLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kYW5jaWVzLgotCSAgKENGSUxFUyk6IEFkZGVkIG02OGtuZXRic2QuYy4KLQkgIChIRklMRVMpOiBBZGRlZCBuZXRic2QuaC4KLQotV2VkIE5vdiAyMyAxOToyMTo0MSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLXNoLmMgKHNobGNvZmZfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKG5vX2FyY2hpdmUpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywgY29mZl9zZXRfZmxhZ3MpOiBIYW5kbGUKLQlsaXR0bGUgZW5kaWFuIFNILgotCSogY29uZmlndXJlLmluOiBIYW5kbGUgc2hsLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBzaGxjb2ZmX3ZlYy4KLQkqIGNvbmZpZy9zaC1jb2ZmLm10IChTRUxFQ1RfVkVDUyk6IEhhbmRsZSBzaGxfY29mZl92ZWMuCi0KLVdlZCBOb3YgMjMgMTA6NTA6MTMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogRG8gbm90IHN1YnRyYWN0IHRoZSBzZWN0aW9uJ3Mgdm1hIGZyb20KLQl0aGUgcmVsb2MncyBvZmZzZXQgd2hlbiB3cml0aW5nIC5vJ3MuICBJbnN0ZWFkIGFkZCB0aGUgc2VjdGlvbidzCi0Jdm1hIHRvIHRoZSByZWxvYydzIG9mZnNldCB3aGVuIHdyaXRpbmcgYW4gZXhlY3V0YWJsZSBvciBzaGFyZWQKLQlsaWJyYXJ5LgotCi1UdWUgTm92IDIyIDIzOjM0OjM3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBEbyBub3QgYWRkCi0JaW5wdXRfc2VjdGlvbi0+dm1hIHRvIHRoZSByZWxvY2F0aW9uJ3Mgb2Zmc2V0LgotCi1Nb24gTm92IDIxIDEyOjM3OjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogc3JlYy5jIChzcmVjX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IERlZmluZS4KLQkoc3JlY19jYW5vbmljYWxpemVfcmVsb2MpOiBEZWZpbmUuCi0JKHNyZWNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lLgotCShzcmVjX3ZlYywgc3ltYm9sc3JlY192ZWMpOiBVc2UgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChzcmVjKS4KLQotU2F0IE5vdiAxOSAwMzoxMDo1MSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0NV04Ni0qLXNvbGFyaXMqKTogIFVzZSBzb2xhcmlzMiB0bwotCWVuYWJsZSBleHRyYWN0aW9uIG9mIHByb2NmcyBpbmZvIGZyb20gY29yZSBmaWxlIGZvciBHREIuCi0KLVRodSBOb3YgMTcgMTc6Mzc6MzkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfdHlwZSk6IEFkZCBuZXcgdmFsdWUgQkZEX1JFTE9DXzEyX1BDUkVMLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQotVGh1IE5vdiAxNyAxMzoxMjowOCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmZkL2VsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZWQpOiBVc2UgdGhlCi0Jdm1hIGZyb20gdGhlIG91dHB1dF9zZWN0aW9uIGNvbnRhaW5pbmcgJGdsb2JhbCQgd2hlbiBjb21wdXRpbmcKLQlnbG9iYWxfdmxhdWUuCi0KLVRodSBOb3YgMTcgMTQ6Mjk6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IFJvdW5kIHVwIHRoZSBhcmNoaXZlCi0JaGVhZGVyIHNpemUgb2YgdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUgdG8gYW4gZXZlbiBudW1iZXIuCi0KLVdlZCBOb3YgMTYgMTY6MDg6MDYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jOiBEZWxldGVkIHNvbWUgY29kZSB0aGF0IHdhcyBjb21tZW50ZWQgb3V0IG9yIGluc2lkZQotCSIjaWYgMCIuCi0JKENPRkZfTE9OR19GSUxFTkFNRVMpOiBEZWZpbmUuCi0KLQkqIGNwdS1zaC5jIChhcmNoX2luZm9fc3RydWN0KTogQ29udmVydCBuYW1lIHRvIGxvd2VyY2FzZSwgZm9yCi0JY29uc2lzdGVuY3kgd2l0aCBvdGhlciBhcmNoaXRlY3R1cmVzLgotCi1TYXQgTm92IDEyIDIzOjUwOjEwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfZXhwb3J0X3N5bWJvbCk6IEFsc28gZXhwb3J0IHN5bWJvbHMgd2hpY2ggYXJlCi0JcmVmZXJlbmNlZCBieSBhIHJlZ3VsYXIgZmlsZS4KLQotRnJpIE5vdiAxMSAxNDoyOTozMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBBZGQKLQlleHBvcnRfZHluYW1pYyBhcmd1bWVudCwgYW5kIGhhbmRsZSBpdC4KLQkoZWxmX2V4cG9ydF9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkoYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotRnJpIE5vdiAxMSAxMDozNTozMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHB1eC1jb3JlLmMgKGhwdXhfY29yZV9zdHJ1Y3QpOiBEZWxldGUgaGFuZGxlcyBmb3IgdGhlCi0JZGF0YSwgcmVnIGFuZCBzdGFjayBzZWN0aW9ucy4gIFRoZXkncmUgbmV2ZXIgdXNlZC4gIERlbGV0ZQotCWFjY2Vzc29yIG1hY3Jvcy4KLQkobWFrZV9iZmRfYXNlY3Rpb24pOiBVc2UgYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgc2luY2UgZGVidWdnaW5nCi0JY29yZXMgZnJvbSBkeW5hbWljIGV4ZWN1dGFibGVzIG1heSBoYXZlIHNldmVyYWwgc2VjdGlvbnMgd2l0aCB0aGUKLQlzYW1lIGxvZ2ljYWwgbmFtZS4KLQkoaHB1eF9jb3JlX2NvcmVfZmlsZV9wKTogRG9uJ3Qgc2F2ZSBoYW5kbGVzIHRvIGRhdGEsIHJlZyBhbmQKLQlzdGFjayBzZWN0aW9ucy4gIEhhbmRsZSBDT1JFX1RFWFQsIENPUkVfTU1GIGFuZCBDT1JFX1NITS4KLQotVHVlIE5vdiAgOCAxMzowMzozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGJvdXQuYyAoY2FsbGpfY2FsbGJhY2spOiBBZGQgbmV3IGFyZ3VtZW50IHNocmlua2luZy4gIENoYW5nZSBhbGwKLQljYWxsZXJzLiAgSGFuZGxlIHJlbG9jcyBhZ2FpbnN0IHNlY3Rpb24gc3ltYm9scyBjb3JyZWN0bHkuICBJZiBub3QKLQlzaHJpbmtpbmcsIGRvbid0IHN1YnRyYWN0IG91dCBkc3RpZHg7IHRoZSBzdWJ0cmFjdGlvbiBpcyBhbHJlYWR5Ci0JaW4gdGhlIG9iamVjdCBmaWxlLgotCi1TdW4gTm92ICA2IDEyOjUyOjAwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uaDogQ29uZGl0aW9uYWxseSBpbmNsdWRlIDxzaGwuaD4gYW5kIDxkbC5oPi4KLQotVGh1IE5vdiAgMyAxODoxOToxMyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogSW5jbHVkZSBtNjhrbmV0YnNkLm8uCi0KLQkqIGNvbmZpZy9pMzg2bGludXgubWggKEVYVFJBTElCUyk6IEluY2x1ZGUgLWxtLgotCi0JUGF0Y2hlcyBmcm9tIERKIERlbG9yaWU6Ci0JKiBjb2ZmLWdvMzIuYzogUmVwbGFjZW1lbnQgZmlsZSwgdXNlcyBjb2ZmLWkzODYuYyB3aXRoIG1pbm9yCi0JY2hhbmdlcy4KLQkqIGNvZmYtaTM4Ni5jIChUQVJHRVRfVU5ERVJTQ09SRSk6IGFsbG93IG90aGVyIGZpbGVzIHRvIG92ZXJyaWRlCi0JdW5kZXJzY29yZSBhbHNvCi0JKiBtYWtlZmlsZS5kb3M6IGRlbCBjdG9yLm8sIGFkZCBjb2ZmbGluay5vIGFuZCBlbGYzMi5vCi0KLQkqIGFvdXR4LmggKGFkanVzdF9vX21hZ2ljKTogSWYgdXNlciBzZXQgZGF0YSBzZWN0aW9uIHZtYSwgdXNlIGl0Ci0JdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGJzcyB2bWEuICBQYXRjaCBmcm9tIFRha2FkYSBIaXJvYWtpLAotCWhpcm9AaXMucy51LXRva3lvLmFjLmpwLgotCShtYWNoaW5lX3R5cGUsIGNhc2UgYmZkX2FyY2hfdmF4KTogU2V0ICp1bmtub3duIHRvIGZhbHNlLiAgUGF0Y2gKLQlmcm9tIEpvaG4gRGF2aWQgQW5nbGluIDxkYXZlQGhpYXVseTEuaGlhLm5yYy5jYT4uCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGIpOiBSZW5hbWUgbnMzMmtuZXRic2RfdmVjIHRvIHBjNTMybmV0YnNkX3ZlYywKLQlzaW5jZSB0aGF0J3Mgd2hhdCBpdCdzIGNhbGxlZC4KLQotV2VkIE5vdiAgMiAxNToyNDo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAobm9ybWFsaXplKTogQ2hhbmdlIHRvIHRha2UgYSBCRkQgYXMgYW4gYXJndW1lbnQuCi0JQ2hhbmdlIFZNUyB2ZXJzaW9uIHRvIHVzZSBiZmRfYWxsb2MgcmF0aGVyIHRoYW4gbWFsbG9jLCBzbyB0aGF0IHdlCi0JZG9uJ3QgbG9zZSB0aGUgbWVtb3J5IGZvcmV2ZXIuCi0JKF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBDaGVjayB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlCi0JZW50cnkgd2hpY2ggaXMgbm90IGJlaW5nIGV4dGVuZGVkLCBhbmQgY29ycmVjdCBpdCBpZiBpdCBpcyB3cm9uZy4KLQlUaGlzIGlzIG5lY2Vzc2FyeSBpbiBjYXNlIHRoZSBhcmNoaXZlIHdhcyBjb25zdHJ1Y3RlZCBieSBhbm90aGVyCi0JcHJvZ3JhbSB3aGljaCBwdXQgYW4gZW50cnkgaW4gdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUgd2hpY2ggd2UKLQlkb24ndCBwbGFuIHRvIHB1dCBpbiBvdXJzZWx2ZXMuICBGcm9tIGpqY0BqY2xhcmsuY29tIChKYW1lcwotCUNsYXJrKS4KLQkoYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIG5vcm1hbGl6ZS4KLQotTW9uIE9jdCAzMSAxNDoxOTowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWhwcGEuYyAoRUxGMzJfUEFSSVNDX1NYX1NJWkUpOiBEZWZpbmUuCi0JKEVMRjMyX1BBUklTQ19TWF9HRVQsIEVMRjMyX1BBUklTQ19TWF9QVVQpOiBEZWZpbmUuCi0JKHN5bWV4dG5fZW50cnkpOiBEb24ndCBkZWZpbmUuCi0JKHN5bWV4dF9jaGFpbl9zaXplKTogQ2hhbmdlIHR5cGUgdG8gYmZkX3NpemVfdHlwZS4KLQkoc3ltZXh0bl9jb250ZW50cyk6IENoYW5nZSB0eXBlIHRvIGJmZF9ieXRlICouCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKTogVXNlCi0JRUxGMzJfUEFSSVNDX1NYX1NJWkUgaW5zdGVhZCBvZiBzaXplb2YgKHN5bWV4dF9lbnRyeVMpLgotCShlbGYzMl9ocHBhX3NpemVfc3ltZXh0KTogTGlrZXdpc2UuICBBbHNvLCBjaGFuZ2UgdHlwZSBvZiBzaXplcCB0bwotCWJmZF9zaXplX3R5cGUgKi4KLQkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IENhc3Qgc3ltZXh0bl9jb250ZW50cyBhc3NpZ25tZW50IHRvCi0JYmZkX2J5dGUgKi4gIFVzZSBFTEYzMl9QQVJJU0NfU1hfUFVUIGluc3RlYWQgb2YgZGlyZWN0IGFzc2lnbm1lbnQuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZyk6IFVzZQotCUVMRjMyX1BBUklTQ19TWF9TSVpFIGluc3RlYWQgb2Ygc2l6ZW9mIChzeW1leHRfZW50cnlTKS4gIFVzZQotCUVMRjMyX1BBUklTQ19TWF9HRVQgaW5zZXRhZCBvZiBkaXJlY3QgYXNzaWdubWVudC4KLQkoZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvKTogQ2hhbmdlIHR5cGUgb2YgY29udGVudHMsIGFuZCBpdHMKLQlhc3NpZ25tZW50IGNhc3QsIHRvIGJmZF9ieXRlICouICBVc2UgRUxGMzJfUEFSSVNDX1NYX1NJWkUgaW5zdGVhZAotCW9mIHNpemVvZiAoc3ltZXh0bl9lbnRyeSkuICBVc2Ugc3ltZXh0X2VudHJ5UyBpbnN0ZWFkIG9mCi0Jc3ltZXh0bl9lbnRyeS4gIFVzZSBFTEYzMl9QQVJJU0NfU1hfR0VUIGluc3RlYWQgb2YgZGlyZWN0Ci0JYXNzaWdubWVudC4KLQotCSogYXJjaGl2ZS5jIChiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUpOiBBZGQgdGhlIGFyIHBhZGRpbmcKLQljaGFyYWN0ZXIsIGlmIHRoZXJlIGlzIHJvb20gZm9yIGl0LCBldmVuIGlmIHRoZSBuYW1lIGlzIHRoZQotCW1heGltdW0gbGVuZ3RoLgotCi0JKiBlbGZjb2RlLmggKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogU29ydCB0aGUgRUxGCi0JaGVhZGVycyBieSBzZWN0aW9uIGFkZHJlc3Mgd2hlbiBhc3NpZ25pbmcgZmlsZSBwb3NpdGlvbnMuCi0JKGVsZl9zb3J0X2hkcnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1TdW4gT2N0IDMwIDE4OjU2OjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IENyZWF0ZSBEVF9JTklUCi0JYW5kIERUX0ZJTkkgZHluYW1pYyBlbnRyaWVzIGJhc2VkIG9uIHRoZSBleGlzdGVuY2Ugb2YgX2luaXQgYW5kCi0JX2Zpbmkgc3ltYm9scywgbm90IG9uIHRoZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMuICBUaGlzIGlzCi0JY29tcGF0aWJsZSB3aXRoIHNvbWUgU1ZSNCBsaW5rZXJzLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotU2F0IE9jdCAyOSAxMjoxODoxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgbW92ZSBhCi0Jc3ltYm9sIHdpdGggYSBQTFQgZW50cnkgaW50byB0aGUgLnBsdCBzZWN0aW9uIGlmIGl0IGlzIGRlZmluZWQgaW4KLQlhIHJlZ3VsYXIgZmlsZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IEl0J3Mgbm90IGFuCi0JZXJyb3IgaWYgYW4gZW1wdHkgYXJjaGl2ZSBoYXMgbm8gc3ltYm9sIHRhYmxlLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBMaWtld2lzZS4KLQotRnJpIE9jdCAyOCAxMDowODo0MSAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcnRsLmN5Z251cy5jb20pCi0KLSAgICAgICAgTmV0QlNEL202OGsgc3VwcG9ydCwgYmFzZWQgb24gd29yayBieSBtaWtlYkBzbm93LmRhdGFtZXRyaWNzLmNvbTogCi0JKiBjb25maWcuYmZkIChtNjgqLSotbmV0YnNkKik6IFVzZSBtNjhrLW5ic2QgYXMgYmZkX25hbWUuCi0JKiBjb25maWd1cmUuaW4gKG02OGtuZXRic2RfdmVjKTogQWRkZWQuCi0JKiB0YXJnZXRzLmMgKGJmZF9tNjhrbmV0YnNkX3ZlYyk6IEFkZGVkLgotCSogaG9zdHMvbTY4a25ic2QuaCwgY29uZmlnL202OGstbmJzZC5tdCwgbTY4a25ldGJzZC5jOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMsIENGSUxFUyk6IEFkZCBtNjhrbmV0YnNkLmMuCi0KLQltaXNjZWxsYW5lb3VzIGNsZWFudXAgcmVxdWlyZWQgYnkgYWxsIG5ldGJzZCB0YXJnZXRzLCBiYXNlZCBvbiB3b3JrIAotCWJ5IEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+OgotCSogbmV0YnNkLmggKE5fTUFHSUMsIE5fU0VUX01BR0lDLCBOX0dFVE1BR0lDLCBOX0dFVE1BR0lDMiwgTl9UWFRBRERSLAotCSAgTl9UWFRPRkYsIE5fQUxJR04sIE5fREFUQUREUiwgTl9EQVRPRkYpOiBSZW1vdmVkLiAgR2VuZXJpYyBhLm91dAotCSAgZGVmaW5pdGlvbnMgd29yay4KLQkqIGkzODZuYnNkLmMsIG5zMzJrbmJzZC5jLCBzcGFyY25ic2QuYyAoX19MRFBHU1opOiBSZW1vdmVkLgotCSAgKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBVc2UgTmV0QlNEJ3MgbWFnaWMgbnVtYmVycwotCi1UaHUgT2N0IDI3IDE2OjU5OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGliZWxmLmggKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IEFkZCBmaWVsZCBkeW5pbmR4LgotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IERvbid0IGZpbmFsaXplCi0JdGhlIC5keW5zeW0sIC5keW5zdHIgb3IgLmhhc2ggc2VjdGlvbnMgdW50aWwgYWZ0ZXIgdGhlIGJhY2tlbmQKLQlzaXplX2R5bmFtaWNfc2VjdGlvbnMgcm91dGluZSwgc28gdGhhdCBpdCBjYW4gYWRkIGR5bmFtaWMgc3ltYm9scwotCWlmIGl0IHdhbnRzIHRvLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCBkZWZpbmUgdGhlCi0Jc3ltYm9sIHRvIGJlIGluIHRoZSAucGx0IHNlY3Rpb24gd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnkKLQlpZiBpdCBpcyBhIGRlZmluZWQgc3ltYm9sLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZAotCWxpYnJhcnksIGFsbG9jYXRlIHNwYWNlIGZvciBhIGR5bmFtaWMgc3ltYm9sIGZvciBlYWNoIG91dHB1dAotCXNlY3Rpb24sIHN0b3JpbmcgdGhlIGluZGV4IGluIHRoZSBkeW5pbmR4IGZpZWxkIG9mIHRoZSBFTEYgc2VjdGlvbgotCWRhdGEuICBBZGp1c3QgdGhlIG90aGVyIGR5bmluZHggZmllbGRzIHRvIGFjY291bnQgZm9yIHRoaXMuCi0JKGVsZjMyX3NwYXJjX2FkanVzdF9keW5pbmR4KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFdoZW4gY29weWluZyBhIHJlbG9jIGludG8gYSBzaGFyZWQKLQlsaWJyYXJ5LCB1c2UgdGhlIG9yaWdpbmFsIGFkZGVuZCBhcyBhcHByb3ByaWF0ZS4gIENvbnZlcnQgYW4KLQlSX1NQQVJDXzMyIHJlbG9jIGludG8gYW4gUl9TUEFSQ19SRUxBVElWRSByZWxvYy4gIFVzZSB0aGUgZHluYW1pYwotCXN5bWJvbCBpbmRleCBvZiB0aGUgb3V0cHV0IHNlY3Rpb24sIG5vdCB0aGUgbm9ybWFsIHN5bWJvbCBpbmRleC4KLQkoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBkaWUgaWYgYSBzZWN0aW9uIGRvZXMKLQlub3QgZXhpc3Qgd2hlbiBzZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgZHluYW1pYyB0YWdzLiAgV3JpdGUgb3V0Ci0JYSBkeW5hbWljIHN5bWJvbCBmb3IgZWFjaCBvdXRwdXQgc2VjdGlvbi4KLQotV2VkIE9jdCAyNiAwMToxNTo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uKTogRG9uJ3QgYm90aGVyIHRvIHJlYWQgb3Igd3JpdGUKLQl0aGUgcmVsb2NzIGlmIHRoZXJlIGFyZW4ndCBhbnkuCi0KLVR1ZSBPY3QgMjUgMTE6NDQ6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIHRla2hleC5vLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IElmIFNFTEVDVF9WRUNTIGlzIG5vdCBkZWZpbmVkLAotCWluY2x1ZGUgdGVraGV4X3ZlYy4KLQkqIHRla2hleC5jIChOSUJCTEUsIElTSEVYKTogQ2FzdCBhcnJheSBhcmd1bWVudHMgdG8gdW5zaWduZWQgY2hhci4KLQkoZ2V0dmFsdWUsIGdldHN5bSwgb3V0KTogTGlrZXdpc2UuCi0JKGZpbmRfY2h1bmspOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHMuCi0JKGZpcnN0X3BoYXNlKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBzLgotCShwYXNzX292ZXIpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGFkZHJlc3MuCi0JKHRla2hleF9vYmplY3RfcCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgc2VjdGlvbi4KLQkobW92ZV9zZWN0aW9uX2NvbnRlbnRzKTogQ2hhbmdlIHJldHVybiB0eXBlIGZyb20gYm9vbGVhbiB0byB2b2lkLgotCSh0ZWtoZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgdGRhdGEgYW5kCi0JbGlzdC4KLQotCSogbGlua2VyLmMgKGVudW0gbGlua19hY3Rpb24pOiBBZGQgQ0lORC4KLQkobGlua19hY3Rpb24pOiBDaGFuZ2UgQ09NTU9OX1JPV1xpbmRyIGZyb20gTURFRiB0byBDUkVGLiAgQ2hhbmdlCi0JSU5EUl9ST1dcY29tbW9uIGZyb20gTURFRiB0byBDSU5ELgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IEluIENSRUYgY2FzZSwgaGFuZGxlIGFuCi0JZXhpc3Rpbmcgc3ltYm9sIHdoaWNoIGlzIGluZGlyZWN0IHJhdGhlciB0aGFuIGRlZmluZWQuICBBZGQgbmV3Ci0JQ0lORCBjYXNlLgotCi1Nb24gT2N0IDI0IDE1OjMzOjE2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCUNoYW5nZSBTLXJlY29yZCBiYWNrZW5kIHRvIHVzZSBtdWx0aXBsZSBzZWN0aW9ucyB0byBoYW5kbGUgZ2FwcyBpbgotCWZpbGUuCi0JKiBzcmVjLmMgKHNyZWNfZGF0YV9saXN0X3N0cnVjdCk6IE1vdmUgZmllbGQgbmV4dCBmcm9tIGxhc3QgcGxhY2UKLQl0byBmaXJzdC4gIENoYW5nZSB0eXBlIG9mIGRhdGEgdG8gYmZkX2J5dGUgKi4KLQkoc3RydWN0IHNyZWNfc3ltYm9sKTogRGVmaW5lLgotCSh0ZGF0YV90eXBlKTogUmVtb3ZlIGRvbmVfc3ltYm9sX3JlYWQsIGNvdW50LCBzdHJpbmdzLCBzeW1ib2xfaWR4LAotCXN0cmluZ19zaXplLCBzdHJpbmdfaWR4LiAgQ2hhbmdlIHR5cGUgb2Ygc3ltYm9scyB0byBzdHJ1Y3QKLQlzcmVjX3N5bWJvbCAqLiAgQWRkIHN5bXRhaWwgYW5kIGNzeW1ib2xzLgotCShsb3csIGhpZ2gpOiBSZW1vdmUuCi0JKHNpemVfc3ltYm9scywgZmlsbHVwX3N5bWJvbHMsIHNpemVfc3JlYywgZmlsbHVwKTogUmVtb3ZlLgotCSh3aGl0ZSwgc2tpcHdoaXRlLCBwYXNzX292ZXIsIG9iamVjdF9wKTogUmVtb3ZlLgotCShzcmVjX21rb2JqZWN0KTogQ2FsbCBzcmVjX2luaXQuICBBZGp1c3QgdGRhdGEgaW5pdGlhbGl6YXRpb24gZm9yCi0JZmllbGQgY2hhbmdlcy4KLQkoc3JlY19nZXRfYnl0ZSwgc3JlY19iYWRfYnl0ZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShzcmVjX25ld19zeW1ib2wsIHNyZWNfc2Nhbik6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShzcmVjX29iamVjdF9wKTogQ2hhbmdlIHR5cGUgb2YgYiB0byBiZmRfYnl0ZS4gIEV4cGxpY2l0bHkgc2V0Ci0Jd3JvbmdfZm9ybWF0IGVycm9yLiAgQ2FsbCBzcmVjX21rb2JqZWN0IGFuZCBzcmVjX3NjYW4gaW5zdGVhZCBvZgotCW9iamVjdF9wLgotCShzeW1ib2xzcmVjX29iamVjdF9wKTogTGlrZXdpc2UuICBBbHNvLCBjaGFuZ2UgYiB0byBiZSBvbmx5IHR3bwotCWJ5dGVzLgotCShzcmVjX3JlYWRfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNyZWNfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBDYWxsIHNyZWNfcmVhZF9zZWN0aW9uIHJhdGhlciB0aGFuCi0JcGFzc19vdmVyLiAgSGFuZGxlIHplcm8gbGVuZ3RoIHNlY3Rpb24gY29ycmVjdGx5LgotCShzZXRfc2V0X2FyY2hfbWFjaCk6IENoYW5nZSBmcm9tIGZ1bmN0aW9uIHRvIG1hY3JvLgotCShzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2hhbmdlIGRhdGEgdG8gYmZkX2J5dGUgKi4KLQkoc3JlY193cml0ZV9yZWNvcmQpOiBDaGFuZ2UgZGF0YSwgZW5kIGFuZCBzcmMgdG8gYmZkX2J5dGUgKi4KLQkoc3JlY193cml0ZV9oZWFkZXIpOiBDaGFuZ2UgYnVmZmVyIGFuZCBkc3QgdG8gYmZkX2J5dGUgKi4KLQkoc3JlY193cml0ZV9zZWN0aW9uKTogQ2hhbmdlIGxvY2F0aW9uIHRvIGJmZF9ieXRlICouCi0JKHNyZWNfd3JpdGVfdGVybWluYXRvcik6IENoYW5nZSBidWZmZXIgdG8gYmZkX2J5dGUgKi4KLQkoc3JlY19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogRG9uJ3QgY2FsbAotCXNyZWNfZ2V0X3NlY3Rpb25fY29udGVudHMuCi0JKHNyZWNfZ2V0X3N5bXRhYik6IFJld3JpdGUuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IFNldCB1ZGF0YS5pIHRvIDAsIG5vdCBOVUxMLgotCi1GcmkgT2N0IDIxIDE2OjQzOjEzIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oIChtYWNoaW5lX3R5cGUpOiBhZGRlZCBNXzY4S19ORVRCU0QgYW5kIE1fU1BBUkNfTkVUQlNELgotCSogaTM4Nm5ldGJzZC5jLCBuczMya25ldGJzZC5jLCBzcGFyY25ldGJzZC5jOiByZW1vdmVkIFJDUyBJZCdzLgotCSAgY2hhbmdlZCBob3cgUEFHRV9TSVpFIGFuZCBTRUdNRU5UX1NJWkUgYXJlIGRlZmluZWQgc28gdGhleSBhcmUKLQkgIGNvbnNpc3RhbnQgd2l0aCBlYWNoIG90aGVyLgotCSogbmV0YnNkLmggKE5fSEVBREVSX0lOX1RFWFQsIFRFWFRfU1RBUlRfQUREUik6IE5ldEJTRCBmaXRzIGl0cwotCSAgaGVhZGVyIGludG8gdGhlIHN0YXJ0IG9mIGl0cyB0ZXh0IHNlZ21lbnQuCi0KLUZyaSBPY3QgMjEgMTc6MTM6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUpOiBBZGQgY2FzZSBmb3IKLQlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUuCi0JKGJmZF90YXJnZXQpOiBBZGQgX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZS4KLQkqIGFyY2hpdmUuYyAoX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IE5ldwotCWZ1bmN0aW9uLgotCShfYmZkX2FyY2hpdmVfY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IFJlbmFtZWQgYnkgYWRkaW5nIGEgbGVhZGluZwotCXVuZGVyc2NvcmUsIGFuZCBtYWRlIGV4dGVybmFsbHkgdmlzaWJsZS4gIEFkZGVkIHRyYWlsaW5nX3NsYXNoCi0JYXJndW1lbnQsIGFuZCB1c2VkIGl0IGluc3RlYWQgb2YgZWxmX3N0eWxlLiAgQ2hhbmdlZCB0eXBlIG9mCi0JdGFibGVuIHRvIGJmZF9zaXplX3R5cGUgKi4KLQkoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogVXNlIEJGRF9TRU5EIHRvIGNhbGwKLQljb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZS4gIFVzZSB0aGUgcmV0dXJuZWQgbmFtZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVjbGFyZS4KLQkoX2JmZF9ub2FyY2hpdmVfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUuCi0JKF9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWNsYXJlLgotCShfYmZkX2FyY2hpdmVfY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIHNvbS5jIChzb21fY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogYW91dC10YXJnZXQuaCAoTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUuCi0JKiBjb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKToKLQlEZWZpbmUuCi0JKiBpZWVlLmMgKGllZWVfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUuCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCSogb2FzeXMuYyAob2FzeXNfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUuCi0KLQlGaXggdGhlIEVMRiBsaW5rZXIgdG8gbm90IHJlcXVpcmUgYW4gaW50ZXJwcmV0ZXIgaWYgbm8gZHluYW1pYwotCW9iamVjdHMgd2VyZSBzZWVuLCBldmVuIHdoZW4gbGlua2luZyBQSUMgY29kZS4KLQkqIGxpYmVsZi5oIChFTEZfTElOS19IQVNIX05FRURTX1BMVCk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgZmllbGQgZHluYW1pY19zZWN0aW9uc19jcmVhdGVkLgotCSogZWxmY29kZS5oIChlbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBDcmVhdGUgZHluc3RyIGlmIGl0Ci0JZG9lc24ndCBhbHJlYWR5IGV4aXN0LgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDcmVhdGUgZHluYW1pYyBzZWN0aW9ucyBiYXNlZCBvbgotCWR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCBmaWVsZCwgbm90IGR5bm9iaiBmaWVsZC4gIERvbid0IGJvdGhlciB0bwotCXNldCBkeW5vYmouCi0JKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgZHluYW1pYyBzZWN0aW9ucyB3ZXJlCi0JYWxyZWFkeSBjcmVhdGVkLCBkb24ndCBkbyBhbnl0aGluZy4gIElmIGR5bm9iaiBpcyBhbHJlYWR5IHNldCwgdXNlCi0JaXQ7IG90aGVyd2lzZSwgc2V0IGl0IHRvIHRoZSBiZmQgYXJndW1lbnQuICBEb24ndCBpbml0aWFsaXplCi0JZHluc3ltY291bnQuICBPbmx5IGNyZWF0ZSBkeW5zdHIgaWYgaXQgZG9lcyBub3QgZXhpc3QuICBTZXQKLQlkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgdG8gdHJ1ZS4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBTa2lwIG1vc3Qgb2YgdGhpcyBmdW5jdGlvbgotCWlmIG5vIGR5bmFtaWMgb2JqZWN0cyB3ZXJlIHNlZW4uCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBhIHN5bWJvbCBoYXMgdGhlCi0JRUxGX0xJTktfSEFTSF9ORUVEU19QTFQgZmxhZyBzZXQsIGxldCB0aGUgYmFja2VuZCBhZGp1c3QgaXQuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IENoYW5nZSBtb3N0IGRlY2lzaW9ucyBiYXNlZCBvbiBkeW5vYmogdG8KLQljaGVjayBkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgaW5zdGVhZC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IE9ubHkgaGFuZGxlIGR5bmFtaWMgc3ltYm9scyBpZiBhIGR5bmFtaWMKLQlvYmplY3Qgd2FzIHNlZW4uCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0aWFsaXplIG5ldyBmaWVsZAotCWR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZC4gIFNldCBkeW5zeW1jb3VudCB0byAxLCBub3QgMC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDYWxsCi0JZWxmX2kzODZfY3JlYXRlX2dvdF9zZWN0aW9uIHJhdGhlciB0aGFuIGNyZWF0aW5nIHRoZSAuZ290IGFuZAotCS5nb3QucGx0IHNlY3Rpb25zLgotCShlbGZfaTM4Nl9jcmVhdGVfZ290X3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBKdXN0IGNhbGwgZWxmX2kzODZfY3JlYXRlX2dvdF9zZWN0aW9uIGlmCi0JYSBHT1QgdGFibGUgaXMgbmVlZGVkLCBub3QgYmZkX2VsZjMyX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0JT25seSBjcmVhdGUgdGhlIC5yZWwuZ290IHNlY3Rpb24sIGFuZCBvbmx5IG1ha2Ugc3BhY2UgZm9yIGEgcmVsb2MsCi0JZm9yIGEgZ2xvYmFsIHN5bWJvbCBvciB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LiAgRm9yIGEKLQlSXzM4Nl9QTFQzMiByZWxvYywganVzdCBzZXQgdGhlCUVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIGZsYWcuCi0JKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJld29yayBpbml0aWFsIGFzc2VydGlvbiB0bwotCXBlcm1pdCBFTEZfTElOS19IQVNIX05FRURTX1BMVCBub24gZHluYW1pYyBzeW1ib2xzLiAgQ3JlYXRlIGEKLQlwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeSBmb3Igc3VjaCBzeW1ib2xzLiAgQnV0LCBpZiBubwotCWR5bmFtaWMgb2JqZWN0cyB3ZXJlIHNlZW4sIG5ldmVyIGNyZWF0ZSBhIFBMVCBlbnRyeS4KLQkoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgbm8gZHluYW1pYyBvYmplY3RzIHdlcmUgc2VlbiwKLQlza2lwIG1vc3Qgb2YgdGhpcyBmdW5jdGlvbiwgYW5kIGZvcmNlIHRoZSBzaXplIG9mIHRoZSAucmVsLmdvdAotCXNlY3Rpb24gdG8gemVyby4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IEZvciBhIFJfMzg2X0dPVDMyIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwKLQlzeW1ib2wgd2hlbiBubyBkeW5hbWljIG9iamVjdCB3YXMgc2VlbiwgaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YKLQl0aGUgLmdvdCBzZWN0aW9uLiAgRm9yIGEgUl8zODZfR09UMzIgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCwgb25seQotCWNyZWF0ZSBhIFJfMzg2X1JFTEFUSVZFIHJlbG9jIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QuCi0JVHJlYXQgYSBSXzM4Nl9QTFQzMiByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIGZvciB3aGljaCB3ZSBkaWQgbm90Ci0JY3JlYXRlIGEgUExUIGVudHJ5IGFzIGEgUl8zODZfUEMzMiByZWxvYy4KLQkoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IGZpZGRsZSB3aXRoIHRoZSBkeW5hbWljCi0JZW50cmllcyBhbmQgdGhlIFBMVCBpZiB3ZSBzYXcgYSBkeW5hbWljIG9iamVjdC4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IEZpeCBSX1NQQVJDX1BDMjIgYnkKLQlzZXR0aW5nIHJpZ2h0c2hpZnQgdG8gMTAuICBGaXggUl9TUEFSQ19XUExUMjAgYnkgc2V0dGluZwotCXJpZ2h0c2hpZnQgdG8gMiwgc2l6ZSB0byAyLCBiaXRzaXplIHRvIDMwLCBhbmQgZHN0X21hc2sgdG8KLQkweDNmZmZmZmZmLgotCShlbGYzMl9zcGFyY19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHNldCB0aGUgc2l6ZSBvZiB0aGUKLQkucGx0IHNlY3Rpb24uICBDYWxsIGVsZjMyX3NwYXJjX2NyZWF0ZV9nb3Rfc2VjdGlvbiByYXRoZXIgdGhhbgotCWNyZWF0aW5nIHRoZSAuZ290IHNlY3Rpb24uCi0JKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IENhbGwgZWxmMzJfc3BhcmNfY3JlYXRlX2dvdF9zZWN0aW9uIGlmCi0JYSBHT1QgdGFibGUgaXMgbmVlZGVkLCBub3QgYmZkX2VsZjMyX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0JT25seSBjcmVhdGUgdGhlIC5yZWxhLmdvdCBzZWN0aW9uLCBhbmQgb25seSBtYWtlIHNwYWNlIGZvciBhCi0JcmVsb2MsIGZvciBhIGdsb2JhbCBzeW1ib2wgb3Igd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdC4KLQlTZXQgdGhlIGFsaWdubWVudCBvZiB0aGUgLnJlbGEuZ290IHNlY3Rpb24gdG8gMi4gIEZvciBhCi0JUl9TUEFSQ19XUExUMzAgcmVsb2MsIGp1c3Qgc2V0IHRoZSBFTEZfTElOS19IQVNIX05FRURTX1BMVCBmbGFnLgotCShlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZXdvcmsgaW5pdGlhbCBhc3NlcnRpb24gdG8KLQlwZXJtaXQgRUxGX0xJTktfSEFTSF9ORURTX1BMVCBub24gZHluYW1pYyBzeW1ib2xzLiAgQ3JlYXRlIGEKLQlwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBmb3Igc3VjaCBzeW1ib2xzLiAgQnV0LCBpZiBubyBkeW5hbWljCi0Jb2JqZWN0cyB3ZXJlIHNlZW4sIG5ldmVyIGNyZWF0ZSBhIFBMVCBlbnRyeS4gIEluaXRpYWxpemUgdGhlIHNpemUKLQlvZiB0aGUgLnBsdCBzZWN0aW9uLgotCShlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiBubyBkeW5hbWljIG9iamVjdHMgd2VyZQotCXNlZW4sIHNraXAgbW9zdCBvZiB0aGlzIGZ1bmN0aW9uLCBhbmQgZm9yY2UgdGhlIHNpemUgb2YgdGhlCi0JLnJlbGEuZ290IHNlY3Rpb24gdG8gemVyby4gIFN0cmlwIGVtcHR5IHJlbG9jIHNlY3Rpb25zLCBhbmQgc3RyaXAKLQlhbiBlbXB0eSAucGx0IHNlY3Rpb24uCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBGb3IgYSBHT1QgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbAotCXN5bWJvbCB3aGVuIG5vIGR5bmFtaWMgb2JqZWN0IHdhcyBzZWVuLCBpbml0aWFsaXplIHRoZSBjb250ZW50cyBvZgotCXRoZSAuZ290IHNlY3Rpb24uICBGb3IgYSBHT1QgcmVsb2MgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCwgb25seQotCWNyZWF0ZSBhIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2Mgd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdC4KLQlUcmVhdCBhIFJfU1BBUkNfV1BMVDMwIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wgZm9yIHdoaWNoIHdlIGRpZCBub3QKLQljcmVhdGUgYSBQTFQgZW50cnkgYXMgYSBSX1NQQVJDX1dESVNQMzAgcmVsb2MuCi0JKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogT25seSBmaWRkbGUgd2l0aCB0aGUKLQlkeW5hbWljIGVudHJpZXMgYW5kIHRoZSBQTFQgaWYgd2Ugc2F3IGEgZHluYW1pYyBvYmplY3QuCi0KLVRodSBPY3QgMjAgMTM6Mjg6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9tYXBfc3ltYm9scyk6IERvbid0IHdvcnJ5IGFib3V0IHNlY3Rpb24gc3ltYm9scwotCWluIGEgc2VjdGlvbiBub3Qgb3duZWQgYnkgYW55IEJGRC4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IFNlcGFyYXRlIG91dCBsb29wIHdoaWNoIGNhbGxzCi0JYmFja2VuZCByb3V0aW5lLiAgQ2hlY2sgYmZkX3NlY3Rpb24gYW5kIGNhbGwgdGhlIGJhY2tlbmQgcm91dGluZQotCWV2ZW4gZm9yIGEgc2VjdGlvbiBub3Qgb3duZWQgYnkgYW55IEJGRC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogSGFuZGxlCi0JLmFjb21tb24gc2VjdGlvbi4KLQotV2VkIE9jdCAxOSAxMzoyODoyOSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IE1ha2UgbmFtZXMgZm9yIHNlY3Rpb24gbnVtYmVyIGFuZAotCXN0b3JhZ2UgY2xhc3Mgc2xpZ2h0bHkgbW9yZSB2ZXJib3NlLiAgSXQncyBub3QgY2xlYXIgaG93IG1hbnkKLQljaGFyYWN0ZXJzIEkgY2FuIGp1c3RpZnkgdXNpbmcgdXAsIGJ1dCBiZWZvcmUgdGhpcyBjaGFuZ2UgdGhleQotCWJvdGggd2VyZSBhYmJyZXZpYXRlZCAic2MiIHdoaWNoIGlzIChJTUhPKSBjbGVhcmx5IHVuYWNjZXB0YWJsZS4KLQotV2VkIE9jdCAxOSAwMToyNjozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTZXQgdGhlIGJhc2UgZmlsZQotCXBvc2l0aW9uIGZyb20gdGhlIGxvd2VzdCBzZWN0aW9uIFZNQSwgbm90IHRoZSBzdGFydCBhZGRyZXNzLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSk6IERvbid0IHJldHVybiBhbiBlcnJvcgotCWlmIHRoZXJlIGFyZSBubyBzeW1ib2xzLgotCSogY29mZmdlbi5jIChjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IExpa2V3aXNlLgotCSogaHAzMDBocHV4LmMgKE1ZKHNsdXJwX3N5bWJvbF90YWJsZSkpOiBMaWtld2lzZS4KLQotVHVlIE9jdCAxOCAxMjo1Njo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogT25seSBjb3B5Ci0Jc3ViZm9ybWF0IHRvIGFub3RoZXIgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIgZmlsZS4KLQotCSogYmluYXJ5LmM6IE5ldyBmaWxlIGZvciByYXcgYmluYXJ5IG91dHB1dCBmb3JtYXQuCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBBZGQgYmluYXJ5Lm8uCi0JKENGSUxFUyk6IEFkZCBiaW5hcnkuYy4KLQkqIHRhcmdldHMuYyAoYmluYXJ5X3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogSW5jbHVkZSBiaW5hcnlfdmVjLgotCi0JKiBzcmVjLmMgKHRkYXRhX3R5cGUpOiBBZGQgZmllbGQgdGFpbC4KLQkoc3JlY19ta29iamVjdCk6IEluaXRpYWxpemUgdGFpbC4KLQkoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IFNvcnQgUyByZWNvcmQgbGlzdCBieSBhZGRyZXNzLgotCi1Nb24gT2N0IDE3IDExOjM4OjE2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBTb3J0IHRoZSBzeW1ib2xzIGludG8gYSBuZXcgYXJyYXksCi0JcmF0aGVyIHRoYW4gbWVzc2luZyB3aXRoIEVsZl9TeW1fRXh0cmEuICBTdG9yZSB0aGUgc3ltYm9sIGluZGV4IGluCi0JdGhlIHVkYXRhLmkgZmllbGQuCi0JKHN3YXBfb3V0X3N5bXMpOiBVc2Ugb3V0Ym91bmRfc3ltcyBhcyBhIHBvaW50ZXIgcmF0aGVyIHRoYW4gYXMgYW4KLQlhcnJheS4gIERvbid0IHdvcnJ5IGFib3V0IGVsZl9zeW1fbnVtLgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfc3ltX2V4dHJhKTogRG9uJ3QgZGVmaW5lLgotCShFbGZfU3ltX0V4dHJhKTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IFJlbW92ZSBzeW1fZXh0cmEgZmllbGQuCi0JKGVsZl9zeW1fZXh0cmEpOiBEb24ndCBkZWZpbmUuCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogVXNlCi0JdWRhdGEuaSByYXRoZXIgdGhhbiBlbGZfc3ltX2V4dHJhIGFycmF5LgotCi0JKiBzeW1zLmMgKGFzeW1ib2wpOiBDaGFuZ2UgdWRhdGEgZmllbGQgaW50byBhIHVuaW9uLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogYW91dHguaCAoTkFNRShhb3V0LHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpKTogVXNlIHVkYXRhLnAgcmF0aGVyCi0JdGhhbiBqdXN0IHVkYXRhLgotCSogYm91dC5jIChwZXJmb3JtX3NsaXApOiBMaWtld2lzZS4KLQkqIGhwMzAwaHB1eC5jIChNWShzbHVycF9zeW1ib2xfdGFibGUpKTogTGlrZXdpc2UuCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scyk6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBMaWtld2lzZS4KLQkoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKiBvYXN5cy5jIChvYXN5c19zbHVycF9zeW1ib2xfdGFibGUpOiBMaWtld2lzZS4KLQkqIHJlbG9jMTYuYyAoYmZkX3BlcmZvcm1fc2xpcCk6IExpa2V3aXNlLgotCSogc3JlYy5jIChmaWxsdXBfc3ltYm9scyk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoZ2V0X2luZGV4KTogVXNlIHVkYXRhLmkgcmF0aGVyIHRoYW4ganVzdCB1ZGF0YS4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBMaWtld2lzZS4KLQkqIGNvZmZnZW4uYyAoc2V0X2luZGV4KTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2dldF9zeW1faW5kZXgsIGVjb2ZmX3NldF9zeW1faW5kZXgpOiBMaWtld2lzZS4KLQkqIHNvbS5jIChjb21wYXJlX3N5bXMpOiBMaWtld2lzZS4KLQkoc29tX3ByZXBfZm9yX2ZpeHVwcyk6IExpa2V3aXNlLgotCShzb21fd3JpdGVfZml4dXBzKTogTGlrZXdpc2UuCi0KLQlVc2UgYSBoYXNoIHRhYmxlIHdoZW4gd3JpdGluZyBvdXQgRUxGIHN5bWJvbCBuYW1lcy4KLQkqIGVsZmNvZGUuaCAoZWxmX3N0cmluZ3RhYl9pbml0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX25ld19zdHJ0YWIsIGJmZF9hZGRfdG9fc3RydGFiLCBiZmRfYWRkXzJfdG9fc3RydGFiKTogUmVtb3ZlLgotCUNoYW5nZSBhbGwgY2FsbGVycyB0byB1c2UgZWxmX3N0cmluZ3RhYl9pbml0IG9yCi0JX2JmZF9zdHJpbmd0YWJfYWRkLCBhbmQgZ2V0IHN0cmluZ3RhYiBsZW5ndGhzIHVzaW5nCi0JX2JmZF9zdHJpbmd0YWJfc2l6ZS4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBDaGFuZ2UgaWdub3JlZCBhcmd1bWVudCB0byBwb2ludGVyIHRvCi0JYm9vbGVhbiwgYW5kIHNldCB0aGUgYm9vbGVhbiB0byB0cnVlIGlmIGFuIGVycm9yIG9jY3Vycy4gIElmIGFuCi0JZXJyb3IgaGFzIGFscmVhZHkgb2NjdXJyZWQsIGRvbid0IGRvIGFueXRoaW5nLgotCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogSnVzdCBzZXQgc2hfc2l6ZSwgbm90IGNvbnRlbnRzLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUGFzcyB0aGUgYWRkcmVzcyBvZiBhCi0JYm9vbGVhbiB0byBlbGZfZmFrZV9zZWN0aW9ucy4gIFBhc3MgdGhlIGFkZHJlc3Mgb2YgYQotCWJmZF9zdHJ0YWJfaGFzaCB0byBzd2FwX291dF9zeW1zLiAgV3JpdGUgb3V0IHRoZSAuc3RydGFiIHNlY3Rpb24uCi0JKHByZXBfaGVhZGVycyk6IENoYW5nZSBzaHN0cnRhYiB0byBiZmRfc3RydGFiX2hhc2guCi0JKHN3YXBfb3V0X3N5bXMpOiBUYWtlIGEgcG9pbnRlciB0byBhIGJmZF9zdHJ0YWJfaGFzaCBhcyBhbgotCWFyZ3VtZW50LiAgU2V0IGl0IHRvIHRoZSBzeW1ib2wgbmFtZXMuCi0JKE5BTUUoYmZkX2VsZix3cml0ZV9vYmplY3RfY29udGVudHMpKTogV3JpdGUgb3V0IHRoZSBzZWN0aW9uCi0JaGVhZGVyIG5hbWVzIHVzaW5nIF9iZmRfc3RyaW5ndGFiX2VtaXQuCi0JKGVsZl9kZWJ1Z19zZWN0aW9uKTogUmVtb3ZlIGZpcnN0IGFyZ3VtZW50OyBnZXQgdGhlIHNlY3Rpb24gbmFtZQotCXZpYSB0aGUgYmZkX3NlY3Rpb24gcG9pbnRlci4gIENoYW5nZSBjYWxsZXIuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IFdyaXRlIG91dCB0aGUgc3ltYm9sIG5hbWVzIHVzaW5nCi0JX2JmZF9zdHJpbmd0YWJfZW1pdC4gIExpa2V3aXNlIGZvciB0aGUgLmR5bnN0ciBzZWN0aW9uIGNvbnRlbnRzLgotCUZyZWUgdGhlIHN5bWJvbCBuYW1lcyBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogUmVtb3ZlIHRoZSBsYXN0IGFyZ3VtZW50LCBvdXRwdXRfbmFtZXMsCi0JZnJvbSByZWxvY2F0ZV9zZWN0aW9uLiAgU2F2ZSB0aGUgb2xkIHN5bWJvbCBjb250ZW50cyBiZWZvcmUKLQljYWxsaW5nIGVsZl9saW5rX291dHB1dF9zeW0sIGFuZCByZXN0b3JlIHRoZW0gYWZ0ZXJ3YXJkLgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQ2hhbmdlIGR5bnN0ciBmaWVsZCB0bwotCXN0cnVjdCBiZmRfc3RydGFiX2hhc2guCi0JKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogUmVtb3ZlIGxhc3QgYXJndW1lbnQsIG91dHB1dF9uYW1lcywKLQlmcm9tIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24gZmllbGQuCi0JKHN0cnVjdCBzdHJ0YWIpOiBEb24ndCBkZWZpbmUuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQ2hhbmdlIHN0cnRhYl9wdHIgZmllbGQgdG8gc3RydWN0Ci0JYmZkX3N0cnRhYl9oYXNoLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgbGFzdAotCWFyZ3VtZW50LCBvdXRwdXRfbmFtZXMuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBsaWJiZmQtaW4uaCAoREVGQVVMVF9TVFJJTkdfU1BBQ0VfU0laRSk6IERvbid0IGRlZmluZS4KLQkoYmZkX2FkZF90b19zdHJpbmdfdGFibGUpOiBEb24ndCBkZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQuYyAoYmZkX2FkZF90b19zdHJpbmdfdGFibGUpOiBSZW1vdmUuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3N3YXBfc2hkcl9pbik6IFVzZSBiZmRfc2VjdGlvbiwgbm90IHJhd2RhdGEuCi0JQ2xlYXIgY29udGVudHMgZmllbGQuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEluIFNIVF9TVFJUQUIgY2FzZSwgY2hlY2sgYmZkX3NlY3Rpb24sCi0Jbm90IHJhd2RhdGEuICBEb24ndCBzZXQgcmF3ZGF0YSBpZiBlX3Noc3RybmR4LiAgVXNlIGJmZF9zZWN0aW9uCi0JcmF0aGVyIHRoYW4gcmF3ZGF0YSBpbiBjb21tZW50ZWQgb3V0IGNvZGUuICBJbiBTSFRfUkVMW0FdIGNhc2UsCi0JZG9uJ3QgYm90aGVyIHRvIGNoZWNrIGVsZl9zZWN0aW9uX2RhdGEgb2Ygc2VjdGlvbiByZXR1cm5lZCBieQotCXNlY3Rpb25fZnJvbV9lbGZfaW5kZXguCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogU2V0IGJmZF9zZWN0aW9uLCBub3QgcmF3ZGF0YS4gIERvbid0IHNldAotCXNpemUuCi0JKGVsZl9tYXBfc3ltYm9scyk6IERvbid0IHNldCBlbGZfbnVtX3NlY3Rpb25fc3ltcy4gIERvbid0IGNyZWF0ZQotCXNlY3Rpb24gc3ltYm9scyB0aGF0IGFscmVhZHkgZXhpc3QuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uKTogVXNlIGJmZF9zZWN0aW9uLCBub3QgcmF3ZGF0YS4KLQkoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IEp1c3QgY2hlY2sgYmZkX3NlY3Rpb24gZmllbGQuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2RlYnVnX3NlY3Rpb24pOiBEb24ndCBwcmludCByYXdkYXRhLCBjb250ZW50cywgb3Igc2l6ZS4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgZXJyb3Igb3V0IGlmCi0Jc2VjdGlvbl9mcm9tX2VsZl9pbmRleCByZXR1cm5zIE5VTEwuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IENoZWNrIHJldHVybiB2YWx1ZSBmcm9tCi0Jc2VjdGlvbl9mcm9tX2VsZl9pbmRleCBhZ2FpbnN0IE5VTEwsIG5vdCBiZmRfaXNfYWJzX3NlY3Rpb24uCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IERvbid0IGNoZWNrIHNlY3Rpb25fZnJvbV9lbGZfaW5kZXggcmV0dXJuCi0JdmFsdWUuCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBSZW1vdmUgbnVtX3NlY3Rpb25fc3ltcyBmaWVsZC4KLQkoZWxmX251bV9zZWN0aW9uX3N5bXMpOiBEb24ndCBkZWZpbmUuCi0JKiBlbGYuYyAoZWxmX2dldF9zdHJfc2VjdGlvbik6IFN0b3JlIHNlY3Rpb24gY29udGVudHMgaW4gY29udGVudHMKLQlmaWVsZCByYXRoZXIgdGhhbiByYXdkYXRhIGZpZWxkLgotCShlbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IFN0b3JlIEJGRCBzZWN0aW9uIHBvaW50ZXIgaW4KLQliZmRfc2VjdGlvbiBmaWVsZCByYXRoZXIgdGhhbiByYXdkYXRhIGZpZWxkLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlYWRfc3ltZXh0X2luZm8pOiBVc2UgYmZkX3NlY3Rpb24KLQlyYXRoZXIgdGhhbiByYXdkYXRhLgotCShlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBMaWtld2lzZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKTogRG9uJ3Qgc2V0Ci0Jc3ltZXh0bl9oZHItPnNpemU7IGp1c3QgdXNlIHNoX3NpemUuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBVc2UgYmZkX3NlY3Rpb24KLQlyYXRoZXJuIHRoYW4gcmF3ZGF0YS4KLQkobWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IFJlbW92ZSByYXdkYXRhIGNoZWNrLgotCi0JKiBzcmVjLmMgKHBhc3Nfb3Zlcik6IFNldCB0aGUgc3RhcnQgYWRkcmVzcyBmb3IgUzcsIFM4IG9yIFM5LgotCi1GcmkgT2N0IDE0IDE5OjE1OjQ2IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIFZFUlNJT046IFVwZGF0ZWQgdG8gMi41LgotCi1GcmkgT2N0IDE0IDExOjA3OjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKGJmZF9zY2FuX3ZtYSk6IENhc3QgZW5kIHRvIGJlIG5vbiBjb25zdCBiZWZvcmUgcGFzc2luZyBpdAotCXRvIHN0cnRvdWwuCi0KLVRodSBPY3QgMTMgMTQ6NDA6NDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX3NjYW5fdm1hKTogUGFzcyBlbmQgYXJndW1lbnQgb24gdG8gc3RydG91bC4KLQotV2VkIE9jdCAxMiAxNjo0Njo0MyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBvcG5jbHMuYyAoYmZkX3JlYWxsb2MpOiBEZWxldGVkLCBzaW5jZSBpdCdzIGJyb2tlbiBhbmQgZml4aW5nIGl0Ci0Jd291bGQgbWFrZSBpdCBzbG93LiAgQmVzaWRlcywgaXQgaXNuJ3QgdXNlZCBtdWNoLgotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBBbHdheXMgYWxsb2NhdGUgbmV3IHN0b3JhZ2UgZm9yIHRoZQotCXN5bWJvbCB0YWJsZS4KLQotV2VkIE9jdCAxMiAxMTo1NDozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IE1hcmsgbG9jYWwgc3RQcm9jLCBzdExhYmVsIG9yCi0Jc3RhYnMgc3ltYm9scyBhcyBCU0ZfREVCVUdHSU5HLgotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6IE1ha2UKLQlzdHIxIGFuZCBzdHIyIGNvbnN0IHBvaW50ZXJzLgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFVzZSB0b3AgbGV2ZWwgaW5zdGFsbC5zaCBzY3JpcHQuCi0JKiBjb25maWcvUkVBRE1FIChJTlNUQUxMKTogUmVtb3ZlLgotCSogY29uZmlnL2RlbHRhODgubWggKElOU1RBTEwpOiBSZW1vdmUuCi0JKiBjb25maWcvaTM4NnY0Lm1oIChJTlNUQUxMKTogUmVtb3ZlLgotCSogY29uZmlnL2lyaXg0Lm1oIChJTlNUQUxMKTogUmVtb3ZlLgotCSogY29uZmlnL2lyaXg1Lm1oIChJTlNUQUxMKTogUmVtb3ZlLgotCSogY29uZmlnL25jcnQzMDAwLm1oIChJTlNUQUxMKTogUmVtb3ZlLgotCi1UdWUgT2N0IDExIDEzOjU3OjU2IDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY0BhbmRhbnRlLmFpYi5jb20pCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogTWFrZSBzdXJlIHRoYXQgYSBzeW1ib2wKLQl3aXRoIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeSBvciBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlCi0JZW50cnkgaXMgYWRkZWQgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIGEgc3ltYm9sIGhhcwotCWFscmVhZHkgZ290dGVuIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnksIGNoYW5nZSB0aGUKLQlkZWZpbml0aW9uIHRvIHRoZSBQTFQgZW50cnkuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotVHVlIE9jdCAxMSAxNzoxMjowMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGx5bngtY29yZS5jIChseW54X2NvcmVfZmlsZV9wKTogU1BBUkMgTHlueCBhcHBlYXJzIHRvIHN0YXJ0Ci0JZHVtcGluZyB0aGUgLmRhdGEgc2VjdGlvbiBpbiBhIGNvcmUgZmlsZSBhdCBhIHBhZ2UgYm91bmRhcnkuCi0KLU1vbiBPY3QgMTAgMTY6MjQ6NDQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBDYXN0IGFyZ3VtZW50IHRvIGJmZF9oX3B1dF8zMgotCXRvIGNvcnJlY3QgdHlwZS4KLQkoY29mZl9yZWFkX3N0cmluZ190YWJsZSk6IENhc3QgYXJndW1lbnQgdG8gYmZkX2hfZ2V0XzMyIHRvIGNvcnJlY3QKLQl0eXBlLgotCSogZWxmY29kZS5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogQ2FzdCBhcmd1bWVudCB0bwotCWJmZF9lbGZfaGFzaCB0byBjb3JyZWN0IHR5cGUuCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IFRoZSBQQzEwLCBQQzIyLCBhbmQKLQlXUExUMzAgcmVsb2NhdGlvbnMgYXJlIFBDLXJlbGF0aXZlLgotCi1UaHUgT2N0ICA2IDEyOjU3OjI2IDE5OTQgIFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0KLQkqIGFvdXR4LmggKGFkanVzdF9vX21hZ2ljKTogQ29ycmVjdGx5IGluaXRpYWxpemUgdm1hIGlmIHRoZSB2bWEgb2YKLQl0aGUgdGV4dCBzZWN0aW9uIHdhcyB1c2VyLWRlZmluZWQuCi0KLVdlZCBPY3QgIDUgMTQ6NDI6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKGJmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IFNWUjQgdXNlcyBzbGFzaAotCW5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBuYW1lLCBub3QganVzdCBuZXdsaW5lLgotCi1UdWUgT2N0ICA0IDExOjIzOjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9uZXdfc2VjdGlvbl9ob29rKTogRGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudAotCXBvd2VyIHRvIDQsIHJhdGhlciB0aGFuIHVzaW5nIGFsaWduX3Bvd2VyX21pbi4KLQotCSogY29mZmNvZGUuaCAoY29mZl9uZXdfc2VjdGlvbl9ob29rKTogRG9uJ3QgdXNlIGFsaWduX3Bvd2VyX21pbjsKLQl1c2UgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSIGluc3RlYWQuICBGb3JjZSB0aGUgLnN0YWIKLQlhbmQgLnN0YWJzdHIgc2VjdGlvbnMgdG8gYmUgYWxpZ25lZCB0byBubyBtb3JlIHRoYW4gMi4gIFJlbW92ZQotCUNPRkZfU1BBUkMgc3BlY2lhbCBjYXNlcy4KLQkqIGNvZmYtYTI5ay5jOiBEZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSLgotCSogY29mZi1hcG9sbG8uYywgY29mZi1nbzMyLmMsIGNvZmYtaDgzMDAuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLWg4NTAwLmMsIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZi1tNjhrLmM6IExpa2V3aXNlLgotCSogY29mZi1tODhrLmMsIGNvZmYtcnM2MDAwLmMsIGNvZmYtc2guYywgY29mZi1zcGFyYy5jOiBMaWtld2lzZS4KLQkqIGNvZmYtd2UzMmsuYywgY29mZi16OGsuYzogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Y29uZmlnX3NoZWxsfSB3aGVuIHJ1bm5pbmcgY29uZmlnLmJmZC4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IHRyeSB0byBjb252ZXJ0IGEgbG9uZwotCWZpbGVuYW1lIGlmIHRoZSBvZmZzZXQgZmllbGQgaXMgemVyby4KLQotCSogZWxmY29kZS5oIChzd2FwX291dF9zeW1zKTogSWYgdGhlIGFsaWdubWVudCBvZiBhIGNvbW1vbiBzeW1ib2wKLQl3YXMgbm90IHNldCwgdXNlIGEgc2Vuc2libGUgZGVmYXVsdCByYXRoZXIgdGhhbiB6ZXJvLgotCi1Nb24gT2N0ICAzIDE2OjA0OjI5IDE5OTQgIEguSi4gTHUgKGhqbEBueW5leHN0LmNvbSkKLQotCSogb3BuY2xzLmMgKGJmZF9jbG9zZSk6IEhvbm9yIHVtYXNrIHdoZW4gc2V0dGluZyBleGVjdXRpb24gYml0cy4KLQkoYmZkX2Nsb3NlX2FsbF9kb25lKTogTGlrZXdpc2UuCi0KLU1vbiBPY3QgIDMgMDQ6NDE6NDkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfcCk6ICBTZXQgU0VDX0hBU19DT05URU5UUyBmbGFnCi0JZm9yIC5zdGFjayBhbmQgLmxkaW5mbyBzZWN0aW9ucy4gQ2FzdCBjb3JlZGF0YS5jX3RhYiB0byBhCi0JZmlsZV9wdHIgdG8gYXZvaWQgd2FybmluZ3MgZnJvbSBnY2MuCi0KLUZyaSBTZXAgMzAgMTM6MTE6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9iZmRfZmluYWxfbGluayk6IFJlbW92ZSBhc3NlcnRpb24gd2hlbiBhIG5vbgotICAgICAgICBTRUNfSU5fTUVNT1JZIHNlY3Rpb24gaXMgZm91bmQgaW4gZHlub2JqLiAgVGhpcyBjYW4gaGFwcGVuIHdoZW4KLQlsaW5raW5nIFBJQyBjb21waWxlZCBjb2RlLgotCi1UaHUgU2VwIDI5IDE1OjIxOjQ0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBDaGFuZ2UgdHlwZSBvZiAiZGF0YSIgdG8KLQliZmRfYnl0ZSAqLCB0byBnbyBhbG9uZyB3aXRoIHllc3RlcmRheSdzIGNoYW5nZS4KLQotCSogZWxmLmMgKGJmZF9lbGZfcHJpbnRfc3ltYm9sKTogTW92ZWQgaGVyZSBmcm9tIGVsZl9wcmludF9zeW1ib2wKLQlpbiBlbGZjb2RlLmguICAoY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbCk6IFByaW50IHN5bWJvbCdzIHNpemUKLQlmaWVsZCwgZXhjZXB0IGZvciBjb21tb24gc3ltYm9sczsgcHJpbnQgdGhlaXIgYWxpZ25tZW50LgotCSogZWxmY29kZS5oIChlbGZfcHJpbnRfc3ltYm9sKTogRGVsZXRlZC4KLQkqIGxpYmVsZi5oIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IERlY2xhcmUuCi0JKGJmZF9lbGZ7MzIsNjR9X3ByaW50X3N5bWJvbCk6IFJlcGxhY2UgZGVjbGFyYXRpb25zIHdpdGggbWFjcm9zLgotCi0JKiBzeW1zLmMgKGJmZF9wcmludF9zeW1ib2xfdmFuZGYpOiBTaG93IEJTRl9MT0NBTCBhbmQgQlNGX0dMT0JBTAotCWluIG9uZSBjb2x1bW4uICBVc2UgdGhlIGNvbHVtbiBmcmVlZCB1cCB0byBzaG93IEJTRl9GVU5DVElPTiBhbmQKLQlCU0ZfRklMRS4KLQotVGh1IFNlcCAyOSAxMjoyOTowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHN5bXMuYyAoc3R0KTogQWRkIC5yZGF0YSBhbmQgLnJvZGF0YS4KLQotV2VkIFNlcCAyOCAxMzozNTowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBDYXN0IGRhdGFfc3RhcnQgdG8gYmZkX2J5dGUgKgotCWJlZm9yZSB0cnlpbmcgdG8gYWRkIHZhbHVlcyB0byBpdC4KLQotVHVlIFNlcCAyNyAxNjo0Nzo1OCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogQ2FzdAotCXJldHVybiB2YWx1ZSBmcm9tIGVsZl9zeW1fZXh0cmEuCi0JKGVsZjMyX2hwcGFfYnVpbGRfc3R1YnMpOiBDYXN0IHJldHVybiB2YWx1ZSBmcm9tIGJmZF96YWxsb2MuCi0JKGVsZjMyX2hwcGFfc2l6ZV9zdHVicyk6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20gbWFsbG9jLgotCi0JKiBnZW4tYW91dC5jIChtYWluKTogRGVjbGFyZSBhbmQgaW5pdGlhbGl6ZSAiYXJjaCIuCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IENhc3QgcmV0dXJuIHZhbHVlIG9mCi0JYmZkX2hhc2hfYWxsb2NhdGUuCi0KLQkqIHJpc2NpeC5jIChyaXNjaXhfY2FsbGJhY2spOiBVc2UgUEFSQU1TIG1hY3JvIGluIHByb3RvdHlwZS4KLQotCSogcmVsb2MuYyAoYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IE5ldyBmdW5jdGlvbiwgbW9zdGx5IGNvcGllZAotCWZyb20gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiwgYWRqdXN0ZWQgZm9yIHRoZSBhc3NlbWJsZXIncyBuZWVkcy4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLU1vbiBTZXAgMjYgMTE6MDA6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogQWxpZ24gdGhlCi0Jc2VjdGlvbiBWTUEgYW5kIHRoZSBmaWxlIHBvc2l0aW9uIGV2ZW4gaWYgRF9QQUdFRCBpcyBub3Qgc2V0LgotCi0JKiBiZmQtaW4uaCAoYmZkX3NlZWspOiBDaGFuZ2UgZGVjbGFyYXRpb24gdG8gbm90IG1hcmsgZnAgY29uc3QuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQuYyAoYmZkX3NlZWspOiBEb24ndCBtYXJrIHBhcmFtZXRlcnMgY29uc3QsIHRvIGF2b2lkCi0JY29uZmxpY3RzIHdpdGggZGVjbGFyYXRpb24uCi0KLUZyaSBTZXAgMjMgMTU6MTU6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogRG9uJ3QgYWJvcnQgaWYgd2UgYWxsb2NhdGVkCi0JdG9vIG11Y2ggc3BhY2UgZm9yIHRoZSBwcm9ncmFtIGhlYWRlciwgb25seSBpZiB3ZSBhbGxvY2F0ZWQgdG9vCi0JbGl0dGxlLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFNpbWlsYXIgY2hhbmdlLgotCi1UdWUgU2VwIDIwIDEzOjE3OjA3IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oOiBGaXggY29tbWVudC4KLQkqIG5zMzJrbmJzZC5oOiBDaGFuZ2VkIE1fTlMzMktfTkVUQlNEIHRvIE1fNTMyX05FVEJTRCB0byBtYXRjaAotCSAgbGliYW91dC5oLgotCi1UdWUgU2VwIDIwIDE1OjIzOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBzcGFyY25ldGJzZC5vLgotCShDRklMRVMpOiBBZGQgbnMzMmtuZXRic2QuYyBhbmQgc3BhcmNuZXRic2QuYy4KLQkqIHRhcmdldHMuYzogbnMzMmtuZXRic2RfdmVjIHdhcyByZW5hbWVkIHRvIHBjNTMybmV0YnNkX3ZlYy4KLQotCSogY29mZi1zaC5jIChydHlwZTJob3d0byk6IFJlbW92ZTsgdW51c2VkLgotCShjb2ZmX3NoX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIHJzdGF0LgotCShyZWxvY19wcm9jZXNzaW5nKTogQ29tbWVudCBvdXQ7IHVudXNlZC4KLQotRnJpIFNlcCAxNiAxMjoxMjoyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBJZiBoLT5pbmR4IGlzIC0yLCB0aGVuCi0JYWx3YXlzIHdyaXRlIGl0IG91dCBldmVuIGlmIGl0IHdvdWxkIG5vcm1hbGx5IGJlIHN0cmlwcGVkLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBJZiB3ZSBmaW5kIGEgcmVsb2MgYWdhaW5zdCBhCi0Jc3RyaXBwZWQgZ2xvYmFsIHN5bWJvbCwgZm9yY2UgaXQgdG8gYmUgd3JpdHRlbiBvdXQgcmF0aGVyIHRoYW4KLQltZXJlbHkgY2FsbGluZyB1bmF0dGFjaGVkX3JlbG9jLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQotV2VkIFNlcCAxNCAxNTozNzoxOSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmggKHN0cnVjdCBzb21kYXRhKTogTmV3IGZpZWxkIHNvcnRlZF9zeW1zLgotCShvYmpfc29tX3NvcnRlZF9zeW1zKTogQWNjZXNzb3IgbWFjcm8uCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IEluaXRpYWxpemUgc29ydGVkX3N5bXMgdG8gTlVMTC4KLQkoc29tX3ByZXBfZm9yX2ZpeHVwcyk6IFNvcnQgYSBjb3B5IG9mIHRoZSBCRkQncyBzeW1ib2wgdGFibGU7Ci0Jc3RvcmUgdGhlIHNvcnRlZCBzeW1ib2wgdGFibGUgaW4gc29ydGVkX3N5bXMuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBJbml0YWxpemUgdG1wX3JlbG9jIHRvIE5VTEwgdG8gbWFrZSBHQ0MgaGFwcHkuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogU2ltaWxhcmx5IGZvciBleGVjX2hlYWRlci4gIFBhc3MgdGhlIHNvcnRlZAotCXN5bWJvbCB0YWJsZSB0byBzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MuCi0JKHNvbV9idWlsZF9hbmRfd3JpdGVfc3ltYm9sX3RhYmxlKTogVXNlIHRoZSBzb3J0ZWQgc3ltYm9scyByYXRoZXIKLQl0aGFuIHRoZSBjYW5vbmljYWwgc3ltYm9sIHRhYmxlLgotCi0JKiBzb20uaCAoc29tX3N5bWJvbF90eXBlKTogQWRkICJzdHJpbmd0YWJfb2Zmc2V0IiBmaWVsZC4KLQkqIHNvbS5jIChzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MpOiBVc2UgInN0cmluZ3RhYl9vZmZzZXQiCi0JcmF0aGVyIHRoYW4gZGVzdHJveWluZyB0aGUgIm5hbWUiIGZpZWxkIGluIHRoZSBCRkQgc3ltYm9sLgotCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IExpa2V3aXNlLgotCi1XZWQgU2VwIDE0IDE1OjA2OjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBSZW5hbWUgc2tpcF9pbmRpcmVjdCB0bwotCXNraXBfbmV4dC4gIElmIHdlIGZpbmQgYW4gTl9XQVJOSU5HIHN5bWJvbCB3aGljaCBoYXMgYWxyZWFkeSBiZWVuCi0Jd3JpdHRlbiBvdXQsIHNldCBza2lwX25leHQuCi0KLQkqIGxpYmVjb2ZmLmggKHN0cnVjdCBlY29mZl90ZGF0YSk6IEFkZCBmaWVsZCBmaW5kX2J1ZmZlci4KLQkqIGVjb2ZmLmM6IEluY2x1ZGUgYW91dC9zdGFiX2dudS5oLgotCShlY29mZl9maW5kX25lYXJlc3RfbGluZSk6IEhhbmRsZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IEtlZXAgYSBzeW1ib2wgbWFya2VkIGFzIHdlYWsKLQlldmVuIGlmIGl0IGlzIHJlZmVyZW5jZWQgYnkgYW5vdGhlciBvYmplY3QuCi0KLVR1ZSBTZXAgMTMgMTc6NTc6MDAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fZml4dXBfZm9ybWF0cyk6IENhc2UgUl9FTlRSWSAoMHhiMyksIHNldCBib3RoCi0JJ1QnIGFuZCAnVScgdG8gZ3JhYiBhbGwgdGhlIHVud2luZCBpbmZvcm1hdGlvbi4KLQkoc29tX3NldF9yZWxvY19pbmZvKTogTWFrZSAnVScgdW53aW5kIGJpdHMgcGVyc2lzdCBhY3Jvc3MKLQltdWx0aXBsZSBTT00gcmVsb2NhdGlvbnMuICBTZXQgdGhlIGFkZGVuZCBmaWVsZCBvZiBhbiBSX0VOVFJZCi0JcmVsb2NhdGlvbiB0byB0aGUgdmFsdWUgaW4gJ1QnOyBzZXQgdGhlIGFkZGVuZCBmaWVsZCBvbiBhbgotCVJfRVhJVCByZWxvY2F0aW9uIHRvIHRoZSB2YWx1ZSBpbiAnVScuCi0KLQkqIHNvbS5oIChzb21fc3ltYm9sX3R5cGUpOiBEZWxldGUgdW53aW5kIGZpZWxkLgotCi0JKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcyk6IEZvciBSX0VOVFJZIGZpeHVwcywgZ2V0IDMyYml0cyBvZgotCXVud2luZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhZGRlbmQgZmllbGQgb2YgdGhlIFJfRU5UUlksIGdldCB0aGUKLQlvdGhlciAzMmJpdHMgZnJvbSB0aGUgYWRkZW5kIGZpZWxkIG9mIHRoZSBSX0VYSVQuCi0JKGJmZF9zb21fYXR0YWNoX3Vud2luZF9pbmZvKTogRGVsZXRlIGZ1bmN0aW9uIGFuZCBhbGwgcmVmZXJlbmNlcy4KLQotCSogc29tLmggKHNvbV9zeW1ib2xfdHlwZSk6IERlbGV0ZSB1bnVzZWQgYS5vdXQtcmVsYXRlZCBmaWVsZHMuCi0KLQkqIHNvbS5jIChiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wpOiBVc2UgYmZkX2Fic19zZWN0aW9uX3B0cgotCWluc3RlYWQgb2YgJmJmZF9hYnNfc2VjdGlvbi4KLQotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBIYW5kbGUgZXhlY19lbnRyeSBhbmQgZXhlY19mbGFncyBiZWluZwotCXN3aXRjaGVkIGluIGV4ZWN1dGFibGVzIGNyZWF0ZWQgYnkgdGhlIE9TRjEgbGlua2VyLgotCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfRVhJVCBqdXN0IGxpa2UgdGhlIFJfe0YsTCxSfVNFTAotCWZpeHVwcy4gIFN1cHBvcnQgUl9BTFRfRU5UUlkgKGhhbmRsZSBqdXN0IGxpa2UgUl9FWElUKS4KLQotVHVlIFNlcCAxMyAxNjowNDowNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfaW5wdXRfYmZkKTogc3ltZW50X2Jhc2UgaXMgdW5zaWduZWQKLQlzbyBjYW4ndCBjb21wYXJlIC12ZSBudW1iZXJzIHdpdGggaXQuCi0KLU1vbiBTZXAgMTIgMjA6MzE6MTcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChzaGNvZmZfdmVjKTogVXNlIGNvZmZsaW5rLm8gbm93LgotCSogY29mZi1zaC5jOiBSZXdyaXR0ZW4gdG8gdXNlIG5ldyBmYXN0IGNvZmYgYmFja2VuZC4KLQotVHVlIFNlcCAxMyAxNjoyMzo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IERvbid0IGFzc3VtZSB0aGF0IGFsbCB0aGUgaW5wdXQKLSAgICAgICAgZmlsZXMgYXJlIGEub3V0LgotCi1UdWUgU2VwIDEzIDExOjA5OjM5IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3QgKHNwYXJjLSotbmV0YnNkKTogdXNlIHNwYXJjbmJzZC4KLQkgIChuczMyay0qLW5ldGJzZCk6IHVzZSBuczMya25ic2QuCi0KLQkqIGhvc3RzL3tuYnNkLGkzODZuYnNkLG5zMzJrbmJzZCxzcGFyY25ic2R9Lmg6IE5ldyBmaWxlcywgTmV0QlNECi0JICBob3N0IHN1cHBvcnQuCi0KLQkqIHNwYXJjbmV0YnNkLmM6IE5ldyBmaWxlLCBhZGRzIHN1cHBvcnQgZm9yIE5ldEJTRC9zcGFyYy4KLQkqIGNvbmZpZy9zcGFyYy1uYnNkLm10OiBMaWtld2lzZS4KLQotCSogbmV0YnNkLmg6IE5ldyBmaWxlLCBkZWZpbml0aW9ucyBjb21tb24gdG8gYWxsIG5ldGJzZCBwb3J0cy4KLQkqIGkzODZuZXRic2QuYzogVXNlIGl0LgotICAgICAgICAqIG5zMzJrbmV0YnNkLmM6IFVzZSBpdC4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbiwgdGFyZ2V0cy5jLCBjb25maWcvaTM4Ni1uYnNkLm10LAotCSAgY29uZmlnL25zMzJrLW5ic2QubXQ6IGNhbm9uaWNhbGl6ZSBuZXRic2QgdGFyZ2V0cyB0byBjb25mb3JtIHRvCi0JICBmaWxlL3ZhcmlhYmxlIG5hbWluZyBjb252ZW50aW9ucy4KLQkqIGkzODZuZXRic2QuYzogTmV3IGZpbGUsIHJlbmFtZWQgZnJvbSBuZXRic2QzODYuYy4KLQkqIG5zMzJrbmV0YnNkLmM6IE5ldyBmaWxlLCByZW5hbWVkIGZyb20gbmV0YnNkNTMyLmMuCi0JCi1Nb24gU2VwIDEyIDIxOjU2OjIwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3JlbG9jX3NraXApOiBDb3JyZWN0IG9mZi1ieS1vbmUgZXJyb3IgZm9yIDQtYnl0ZQotCVJfTk9fUkVMT0NBVElPTiBmaXh1cHMuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IFJldHVybiB0aGUgYWJzb2x1dGUgc2VjdGlvbiBpZiB0aGUKLQlzeW1ib2wgaXNuJ3QgY29udGFpbmVkIGluIGFueSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNUX1BSSV9QUk9HIGFuZCBTVF9TRUNfUFJPRyBzeW1ib2xzIGFyZQotCW5vdCBmdW5jdGlvbiBzeW1ib2xzICh0aGV5IGFyZSBtYWdpYyBjb2RlIGxhYmVscyB3aGljaCAqY2FuKiBiZSB0aGUKLQl0YXJnZXRzIG9mIGNyb3NzIHNwYWNlIGJyYW5jaGVzKS4gICRTVEFSVCQgaXMgbm90IGEgc2VjdGlvbiBzeW1ib2wuCi0KLU1vbiBTZXAgMTIgMTE6NDM6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWFscGhhLmMgKGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyk6IEFkZCBTRUNfQ09ERSBhbmQgU0VDX0RBVEEKLQl0byBzZWN0aW9uX2ZsYWdzLgotCSogY29mZi1taXBzLmMgKGVjb2ZmX2xpdHRsZV92ZWMsIGVjb2ZmX2JpZ192ZWMpOiBMaWtld2lzZS4KLQotCSogZWxmY29kZS5oIChzd2FwX291dF9zeW1zKTogU2V0IHRoZSB0eXBlIG9mIGFuIHVuZGVmaW5lZCBzeW1ib2wKLQl0byBTVFRfRlVOQyBpZiB0aGUgQlNGX0ZVTkNUSU9OIGZsYWcgaXMgc2V0LgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfaW5wdXRfYmZkKTogSWYgcl9zeW1uZHggaXMgLTEsIGRvbid0Ci0JY2hhbmdlIGl0LgotCShfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgcl9zeW1uZHggaXMgLTEsIGl0IGlzIGFuCi0JYWJzb2x1dGUgcmVsb2MuICBEb24ndCBkdW1wIGNvcmUgdXNpbmcgcl9zeW1uZHggYXMgYW4gYXJyYXkgaW5kZXguCi0JKiBjZi1tNjhrbHlueC5jIChjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRGVmaW5lLgotCShseW54X2xpbmtfYWRkX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uIChjb3B5IG9mIGZ1bmN0aW9uIGluCi0JY29mZi1pMzg2LmMpLgotCShjb2ZmX202OGtfbHlueHJ0eXBlX3RvX2hvd3RvKTogc3ltIGFyZ3VtZW50IG1heSBiZSBOVUxMLgotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9ydHlwZV90b19ob3d0byk6IExpa2V3aXNlLgotCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIGFuIHJfc3ltbmR4Ci0JdmFsdWUgb2YgLTEsIG1lYW5pbmcgYW4gYWJzb2x1dGUgcmVsb2MuCi0KLQkqIGN0b3IuYzogUmVtb3ZlOyBvYnNvbGV0ZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEX0xJQlMpOiBSZW1vdmUgY3Rvci5vLgotCShDRklMRVMpOiBSZW1vdmUgY3Rvci5jLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLU1vbiBTZXAgMTIgMDE6NTg6NDcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgdGhlcmUgd2FzIGEgbGluawotCWVycm9yIG9mIHNvbWUgc29ydCAoZm9yIGV4YW1wbGUsIHVuZGVmaW5lZCBzeW1ib2xzKSwgdGhlbiBkbyBub3QKLQlhcHBseSBhbnkgcmVsb2NzLCBqdXN0IG5vdGlmeSB0aGUgdXNlciBvZiB0aGUgZXJyb3JzLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IERvIG5vdCBidWlsZCBhIHN5bWJvbAotCWV4dGVuc2lvbiBzZWN0aW9uIGZvciBhbiBleGVjdXRhYmxlIChpdCdzIHVzZWxlc3MpLgotCShlbGYzMl9ocHBhX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogRG8gbm90aGluZyBpZiB0aGVyZSB3YXMgYQotCWxpbmsgZXJyb3Igb2Ygc29tZSBzb3J0IChmb3IgZXhhbXBsZSwgdW5kZWZpbmVkIHN5bWJvbHMpLgotCShlbGYzMl9ocHBhX3JlYWRfc3ltZXh0X2luZm8pOiBLbHVkZ2UuICBUdXJuIG9mZiBTRUNfSEFTX0NPTlRFTlRTCi0JZm9yIGFsbCB0aGUgaW5wdXQgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9ucyB0byBrZWVwIHRoZSBnZW5lcmljCi0JQkZEIGNvZGUgaGFwcHkuICBUZW1wb3JhcmlseSB0dXJuIGl0IG9uIHRvIHJlYWQgdGhlIGNvbnRlbnRzIG9mCi0JdGhlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbi4KLQotU3VuIFNlcCAxMSAyMTo1ODo1OSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL2hwcGFvc2YubWggKFJBTkxJQik6IERvIG5vdCBzZXQuCi0JKiBjb25maWcvaHBwYWJzZC5taCAoUkFOTElCKTogTGlrZXdpc2UuCi0KLVN1biBTZXAgMTEgMjI6NTA6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjZi1pMzg2bHlueC5jOiBSZW1vdmUgI2lmIDAgY29kZS4KLQkoaTM4Nl9seW54b3NfY29mZl9vYmplY3RfcCk6IFJlbW92ZSB1bnVzZWQgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEZWZpbmUuCi0JKGx5bnhfbGlua19hZGRfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSWYKLQljb2ZmX3JlbG9jYXRlX3NlY3Rpb24gaXMgZGVmaW5lZCwgb25seSBkZWZpbmUgdGhpcyBpZiBub3QgYWxyZWFkeQotCWRlZmluZWQuCi0JKGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMsIGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBMaWtld2lzZS4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogSGFuZGxlCi0JYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIgZXhwbGljaXRseSwgcmF0aGVyIHRoYW4gdmlhCi0JX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIuCi0JKHNldF9zeW1ib2xfZnJvbV9oYXNoKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCV9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wuCi0JKF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBTeW1ib2wgc2V0dGluZyBjb2RlIG1vdmVkCi0JdG8gc2V0X3N5bWJvbF9mcm9tX2hhc2g7IGNhbGwgaXQuCi0JKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IEFkZCBnZW5lcmljX2xpbmtlciBhcmd1bWVudC4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuICBJZiBmYWxzZSwgc2V0IHRoZSBnZW5lcmljIHN5bWJvbHMgYmFzZWQgb24KLQl0aGUgaGFzaCB0YWJsZSBlbnRyaWVzLgotCi1GcmkgU2VwICA5IDExOjUxOjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX2dldF9zeW10YWIpOiBSZWluZGVudGVkLiAgUmVtb3ZlZCBjb21tZW50ZWQgb3V0Ci0JY2FsbCB0byBiZmRfY29uc3RydWN0b3JfZW50cnkuCi0KLQlDb252ZXJ0IG02OGsgQ09GRiB0byB1c2UgbmV3IENPRkYgYmFja2VuZCBsaW5rZXIuCi0JKiBjb2ZmLW02OGsuYyAoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCSogY2YtbTY4a2x5bnguYyAoY29mZl9ydHlwZV90b19ob3d0byk6IERlZmluZS4KLQkoY29mZl9tNjhrX2x5bnhfcnR5cGVfdG9faG93dG8pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogY29uZmlndXJlLmluIChtNjhrY29mZl92ZWMpOiBCdWlsZCBjb2ZmbGluay5vLgotCShtNjhrY29mZnVuX3ZlYywgbTY4a2x5bnhfY29mZl92ZWMpOiBMaWtld2lzZS4KLQotVGh1IFNlcCAgOCAxNjoyMDozOCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMsIGNhc2UgUkVMQllURSk6IEZsYWcKLQlvdmVyZmxvd3MgY29ycmVjdGx5LgotCi1XZWQgU2VwICA3IDE5OjAxOjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQ2hhbmdlIHNlY29uZCBhcmd1bWVudCBvZgotCWVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgaG9vayB0byBib29sZWFuLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBsaW5rZXIgZmllbGQuCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZix3cml0ZV9vYmplY3RfY29udGVudHMpKTogUGFzcyB2YWx1ZSBvZgotCXRkYXRhIGxpbmtlciBmaWVsZCB0byBmaW5hbF93cml0ZV9wcm9jZXNzaW5nLCByYXRoZXIgdGhhbiBOVUxMLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBjYWxsIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgaG9vay4gIFNldAotCXRkYXRhIGxpbmtlciBmaWVsZCB0byB0cnVlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogQ2hhbmdlIHR5cGUgb2YKLQlzZWNvbmQgYXJndW1lbnQgdG8gYm9vbGVhbi4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOgotCUxpa2V3aXNlLgotCi0JKiBjb2ZmLWdvMzIuYyAoUlRZUEUySE9XVE8pOiBGdWxseSBwYXJlbnRoZXNpemUgYXJndW1lbnRzLgotCSogY29mZi1pOTYwLmMgKFJUWVBFMkhPV1RPKTogTGlrZXdpc2UuCi0JKiBjb2ZmLW04OGsuYyAoUlRZUEUySE9XVE8pOiBMaWtld2lzZS4KLQkqIGNvZmYtd2UzMmsuYyAoUlRZUEUySE9XVE8pOiBMaWtld2lzZS4KLQotCU1ha2UgaTM4NiBDT0ZGIHVzZSBuZXcgQ09GRiBiYWNrZW5kIGxpbmtlci4KLQkqIGNvZmYtaTM4Ni5jIChSVFlQRTJIT1dUTyk6IEZ1bGx5IHBhcmVudGhlc2l6ZSBhcmd1bWVudHMuCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkoY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlndXJlLmluIChpMzg2Y29mZl92ZWMpOiBVc2UgY29mZmxpbmsuby4KLQkoaTM4Nmx5bnhfY29mZl92ZWMpOiBMaWtld2lzZS4KLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZAotCV9iZmRfY29mZl9ydHlwZV90b19ob3d0by4KLQkoYmZkX2NvZmZfcnR5cGVfdG9faG93dG8pOiBEZWZpbmUuCi0JKGNvZmZfcnR5cGVfdG9faG93dG8pOiBEZWZpbmUgdG8gdXNlIFJUWVBFMkhPV1RPLCBpZiBub3QgYWxyZWFkeQotCWRlZmluZWQuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IEFsbG9jYXRlIHNlY3Rpb25fY291bnQgKyAxCi0Jc2VjdGlvbl9pbmZvIHN0cnVjdHVyZXMsIHNpbmNlIHRoZSB0YXJnZXRfaW5kZXggaXMgMSBiYXNlZC4KLQkoY29mZl9saW5rX2lucHV0X2JmZCk6IFNldCAqc2VjcHAgdG8gYmZkX2NvbV9zZWN0aW9uX3B0ciBmb3IgYQotCWNvbW1vbiBzeW1ib2wuICBBZGp1c3QgcmVsX2hhc2ggYnkgdGhlIG91dHB1dCByZWxvYyBjb3VudC4KLQkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmNvZmYtaW4uaCAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0KLVR1ZSBTZXAgIDYgMjM6Mjg6NTIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvKTogVHJlYXQgdW5kZWZpbmVkIGNvZGUKLQlzeW1ib2xzIGFuZCB1bmRlZmluZWQgc3ltYm9scyB3aGljaCBubyB0eXBlIGluIHRoZSBzYW1lIG1hbm5lcgotCWlmIHRoZSBhc3NvY2lhdGVkIEJGRCBzeW1ib2wgaGFzIEJTRl9GVU5DVElPTiBzZXQuICBGb3IgYSBkZWZpbmVkCi0Jc3ltYm9sIHdoaWNoIG5vIHR5cGUsIHNlbGVjdCBhIFNPTSB0eXBlIGJhc2VkIG9uIHRoZSBmbGFncyBvZiB0aGUKLQlzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIHN5bWJvbC4KLQkoc29tX3NsdXJwX3N5bWJvbF90eXBlKTogU2V0IEJTRl9GVU5DVElPTiBmb3IgdW5kZWZpbmVkIFNUX1NUVUIKLQlvciBTVF9DT0RFIHN5bWJvbHMgKGltcG9ydGluZyBhIG5vbi1mdW5jdGlvbiBjb2RlIHN5bWJvbCBpcwotCW1lYW5pbmdsZXNzIGluIFNPTSkuCi0JKHNvbV9zZXRfcmVsb2NfaW5mbyk6IERvbid0IHNldCAib2Zmc2V0IiB0byB0aGUgc2VjdGlvbidzIHZtYTsgaXQKLQlzaG91bGQgYWx3YXlzIHN0YXJ0IGF0IHplcm8uCi0KLVR1ZSBTZXAgIDYgMTQ6NTE6MTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JQWRkIG5ldyBzdHlsZSBsaW5rZXIgc3VwcG9ydCB0byBDT0ZGIGJhY2tlbmQuICBhMjlrIG9ubHkgZm9yIG5vdy4KLQkqIGNvZmZsaW5rLmM6IE5ldyBmaWxlLgotCSogbGliY29mZi1pbi5oOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkob2JqX2NvZmZfZXh0ZXJuYWxfc3ltcywgb2JqX2NvZmZfc3RyaW5ncyk6IERlZmluZSBhY2Nlc3NvciBtYWNyby4KLQkob2JqX2NvZmZfc3ltX2hhc2hlcyk6IERlZmluZSBhY2Nlc3NvciBtYWNyby4KLQkoc3RydWN0IGNvZmZfdGRhdGEpOiBBZGQgZmllbGRzIGV4dGVybmFsX3N5bXMsIHN0cmluZ3MsIGFuZAotCXN5bV9oYXNoZXMuCi0JKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IERlZmluZS4KLQkoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlKTogRGVmaW5lLgotCShjb2ZmX2xpbmtfaGFzaF9sb29rdXAsIGNvZmZfbGlua19oYXNoX3RyYXZlcnNlKTogRGVmaW5lLgotCShjb2ZmX2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRGVjbGFyZS4KLQkoX2JmZF9jb2ZmX2xpbmtfYWRkX3N5bWJvbHMsIF9iZmRfY29mZl9maW5hbF9saW5rKTogRGVjbGFyZS4KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZHMgX2JmZF9yZWxzeiwKLQlfYmZkX2NvZmZfc3dhcF9yZWxvY19pbiwgX2JmZF9jb2ZmX3N5bV9pc19nbG9iYWwsCi0JX2JmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywKLQlfYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbi4KLQkoYmZkX2NvZmZfcmVsc3osIGJmZF9jb2ZmX3N3YXBfcmVsb2NfaW4pOiBEZWZpbmUuCi0JKGJmZF9jb2ZmX3N5bV9pc19nbG9iYWwpOiBEZWZpbmUuCi0JKGJmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IERlZmluZS4KLQkoYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkoY29mZl9ta29iamVjdF9ob29rKTogSW5pdGlhbGl6ZSBvYmpfcmF3X3N5bWVudF9jb3VudCBhbmQKLQlvYmpfY29udl90YWJsZV9zaXplLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFNldCB0YXJnZXRfaW5kZXggb2YgYWxsCi0Jc2VjdGlvbnMuICBTZXQgb3V0cHV0X2hhc19iZWd1biBmaWVsZC4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBzZXQgdGFyZ2V0X2luZGV4OyBub3cgZG9uZSBieQotCWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLiAgUmVtb3ZlIG9ic29sZXRlIGhhbmRsaW5nIG9mCi0Jc2NuX2Jhc2UgYW5kIGRhdGFfYmFzZS4gIERvbid0IGJvdGhlciB0byBjaGVjayB0aGF0IHRhcmdldF9pbmRleAotCWlzIHBvc2l0aXZlLCBzaW5jZSBpdCBhbHdheXMgaXMuICBSZW1vdmUgdXNlIG9mIHBhZCwgd2hpY2ggaXMKLQlhbHdheXMgemVyby4gIENoZWNrIG9ial9yYXdfc3ltZW50X2NvdW50LCBub3QgYmZkX2dldF9zeW1jb3VudCwKLQlmb3IgdGhlIG51bWJlciBvZiBzeW1ib2xzLCBidXQgb25seSB3cml0ZSB0aGVtIG91dCBpZgotCWJmZF9nZXRfc3ltY291bnQgaXMgbm9uLXplcm8uICBEb24ndCBjaGVjayBvYmpfcmF3X3N5bWVudF9jb3VudAotCXVudGlsIGFmdGVyIGNvZmZfd3JpdGVfc3ltYm9scyBpcyBjYWxsZWQuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogVXNlIG9ial9yYXdfc3ltZW50X2NvdW50LCBub3QKLQliZmRfZ2V0X3N5bWNvdW50IGZvciB0aGUgbnVtYmVyIG9mIHN5bWJvbHMuICBEb24ndCBzZXQKLQlvYmpfY29udl90YWJsZV9zaXplLgotCShjb2ZmX3N5bV9pc19nbG9iYWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uIG9yIG1hY3JvLgotCShjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogQ2FsbCBjb2ZmX3N3YXBfcmVsb2NfaW4sIG5vdAotCWJmZF9zd2FwX3JlbG9jX2luLgotCShjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSWYgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGlzCi0JZGVmaW5lZCwgZGVmaW5lIGFzIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlLgotCShjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogU2ltaWxhciBjaGFuZ2UuCi0JKGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBTaW1pbGFyIGNoYW5nZS4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lIGFzIE5VTEwgaWYgbm90IGRlZmluZWQuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBEb24ndCBzZXQgb2JqX3Jhd19zeW1lbnRfY291bnQKLQlhbmQgb2JqX2NvbnZfdGFibGVfc2l6ZSBoZXJlLgotCShjb2ZmX2NvdW50X2xpbmVudW1iZXJzKTogUmVpbmRlbnQuICBJZiBiZmRfZ2V0X3N5bWNvdW50IGlzIHplcm8sCi0JYWRkIHVwIHRoZSBsaW5lIG51bWJlcnMgZnJvbSB0aGUgc2VjdGlvbnMuCi0JKGNvZmZfd3JpdGVfc3ltYm9scyk6IFNldCBvYmpfcmF3X3N5bWVudF9jb3VudCwgbm90Ci0JYmZkX2dldF9zeW1jb3VudC4KLQkoY29mZl9wb2ludGVyaXplX2F1eCk6IERvbid0IHBvaW50ZXJpemUgYSBub25wb3NpdGl2ZSB4X2VuZG5keAotCWZpZWxkLgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IFVzZSBvYmpfcmF3X3N5bWVudF9jb3VudCwgbm90Ci0JYmZkX2dldF9zeW1jb3VudC4KLQkoY29mZl9wcmludF9zeW1ib2wpOiBJZiBhdXhwLT5maXhfZW5kLCBwcmludCB4X2VuZG5keCB2YWx1ZS4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9yZWxvY19pbik6IFJlbmFtZSBmcm9tIGJmZF9zd2FwX3JlbG9jX2luLgotCVJlaW5kZW50LiAgQ2hhbmdlIGFyZ3VtZW50IHR5cGUgdG8gIFBUUi4KLQkqIGNvZmYtYTI5ay5jIChjb2ZmX2EyOWtfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbiAoYTI5a2NvZmZfYmlnX3ZlYyk6IENvbXBpbGUgY29mZmxpbmsuby4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmZsaW5rLm8uCi0JKENGSUxFUyk6IEFkZCBjb2ZmbGluay5jLgotCi1UdWUgU2VwICA2IDE0OjAwOjQ1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wsIGNhc2UgYmZkX3N5bWJvbF9wcmludF9hbGwpOiBDaGVjawotCWZvciBzZWN0aW9uIHN5bWJvbCwgYW5kIHByaW50IGl0cyBhdXggZmllbGRzIHdpdGggYXBwcm9wcmlhdGUKLQlsYWJlbHMuCi0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGRlZCBjcHUtYXJtLm8uCi0KLVN1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogYW91dHguaCAoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpOiBSZWNvZ25pemUgdGhlIEFSTSBwcm9jZXNzb3IuCi0JKiBhcmNodXJlcy5jLCBjb25maWcuYmZkLCBjb25maWd1cmUuaG9zdCwgbGliYW91dC5oLCByZWxvYy5jLAotCXRhcmdldHMuYzogQWRkIHN1cHBvcnQgZm9yIHRoZSBBUk0uCi0JKiBjcHUtYXJtLmMsIHJpc2NpeC5jLCBjb25maWcvcmlzY2l4Lm1oLCBjb25maWcvcmlzY2l4Lm10OiBOZXcgZmlsZXMuCi0KLQkqIGFvdXR4LmggKGFkZF90b19zdHJpbmd0YWJsZSk6IENoZWNrIHRoYXQgc3RyIGlzbid0IGEgTlVMTCBwb2ludGVyLgotCi1GcmkgU2VwICAyIDE0OjEwOjMwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IFJld3JvdGUgZGVmaW5pdGlvbiB0byB1c2UKLQluZXcgImNoZXciIGNvbW1hbmRzIGZvciBzaW11bHRhbmVvdXMgZGVmaW5pdGlvbiBvZiBlbnVtZXJhdG9yIGFuZAotCWVudW1lcmF0b3IgbmFtZSB0YWJsZS4KLQkoYmZkX2dldF9yZWxvY19jb2RlX25hbWUpOiBOZXcgZnVuY3Rpb24sIGZvciByZXRyaWV2aW5nIGEgc3ltYm9saWMKLQluYW1lIGFzc29jaWF0ZWQgd2l0aCBhbiBlbnVtZXJhdG9yLgotCSogbGliYmZkLmgsIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBBdWcgMzAgMjE6MjQ6NTQgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfZml4dXBzLCBjYXNlIFJfRU5UUlkpOiBIYW5kbGUgY2FzZSB3aGVyZSBubwotCXVud2luZCBkZXNjcmlwdG9yIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KLQotVHVlIEF1ZyAzMCAxMTo0MzozMCAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBBZGQgc29uYW1lCi0JYXJndW1lbnQsIGFuZCB1c2UgaXQgdG8gc2V0IERUX1NPTkFNRSBkeW5hbWljIGVudHJ5LgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgcHJvdG90eXBlLgotCShiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIHByb3RvdHlwZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotRnJpIEF1ZyAyNiAxNTo0Nzo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogU2V0IG9ial9yYXdfc3ltZW50X2NvdW50LgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IFZlcmlmeSBvYmpfcmF3X3N5bWVudF9jb3VudCwgcmF0aGVyCi0JdGhhbiBzZXR0aW5nIGl0LgotCi1UaHUgQXVnIDI1IDEwOjQ0OjUzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChic2Rfd3JpdGVfYXJtYXApOiBSZW1vdmUgaG9zdCBkZXBlbmRlbmNpZXMuCi0KLQkqIGFvdXR4LmggKGFkZF90b19zdHJpbmd0YWIpOiBDaGVjayBmb3IgX2JmZF9zdHJpbmd0YWJfYWRkIGVycm9yCi0JYmVmb3JlIGFkZGluZyBCWVRFU19JTl9XT1JELgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBMb29rIGZvciB0aGUgYmVzdCBDX0ZJTEUsCi0Jbm90IG1lcmVseSB0aGUgZmlyc3QuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl93cml0ZV9hbGllbl9zeW1ib2wpOiBJZiB3ZSBhcmUgbm90IHVzaW5nIHRoZQotCXN5bWJvbCwgY2xlYXIgdGhlIG5hbWUgc28gdGhhdCBpdCBpcyBub3QgcHV0IGluIHRoZSBzdHJpbmcgdGFibGUuCi0JRnJvbSBBbnR0aS5NaWV0dGluZW5AbnRjLm5va2lhLmNvbS4KLQotV2VkIEF1ZyAyNCAxMTo0OToxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBDYXN0IHBvaW50ZXIgZGlmZmVyZW50IHRvIGxvbmcKLQlhbmQgdXNlICVsZCB0byBwcmludCBpdC4KLQkqIG9zZi1jb3JlLmMgKG9zZl9jb3JlX2NvcmVfZmlsZV9wKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZQotCWRzZWNjbnQuCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9leHRfb3V0KTogSWYgRUNPRkZfNjQsIGNsZWFyIHJlbWFpbmluZwotCWJ5dGVzIGluIGJpdHMyLgotCi0JKiBjb25maWd1cmUuaG9zdCwgY29uZmlnLmJmZDogQ2hhbmdlIGlbMzRdODYgdG8gaVszNDVdODYuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IFNldCBvYmpfY29udl90YWJsZV9zaXplIGhlcmUsCi0JcmF0aGVyIHRoYW4gd2FpdGluZyB1bnRpbCBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4KLQkoY29mZl93cml0ZV9hbGllbl9zeW1ib2wpOiBKdXN0IGlnbm9yZSBCU0ZfREVCVUdHSU5HIHN5bWJvbHMuCi0JRnJvbSBBbnR0aS5NaWV0dGluZW5AbnRjLm5va2lhLmNvbS4KLQotCSogc2VjdGlvbi5jIChiZmRfbWFrZV9zZWN0aW9uX2FueXdheSk6IEZpeCBmYWlsdXJlIGNoZWNrIG9mCi0JYmZkX21ha2VfZW1wdHlfc3ltYm9sLiAgRnJvbSBBbnR0aS5NaWV0dGluZW5AbnRjLm5va2lhLmNvbS4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBVc2UgdGhlIG91dHB1dF9zZWN0aW9uCi0JKGFuZCBvdXRwdXRfb2Zmc2V0KSBpZiB0aGVyZSBpcyBvbmUuCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBEaXNjYXJkIHRoZSBzeW1ib2xzCi0JaWYgdGhlIGFyY2hpdmUgZWxlbWVudCB3YXMgbm90IG5lZWRlZC4KLQotCSogYW91dHguaCAoYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IEVuc3VyZSB0aGF0IGEgemVybyBzdHJpbmcKLQlpbmRleCB5aWVsZHMgYW4gZW1wdHkgc3RyaW5nLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IElmIGluZm8tPmtlZXBfbWVtb3J5IGlzIGZhbHNlLCB1c2UgbmFtZQotCWZyb20gb3JpZ2luYWwgaGFzaCB0YWJsZSBlbnRyeSwgbm90IGZyb20gZW50cnkgaW4gKnN5bV9oYXNoLgotCi0JKiBhb3V0eC5oIChzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8pOiBBZGQgZmllbGRzIGNvbnRlbnRzLAotCXJlbG9jcywgc3ltYm9sX21hcCBhbmQgb3V0cHV0X3N5bXMuCi0JKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IFdvcmsgb3V0IHRoZSBsYXJnZXN0IHNlY3Rpb24gc2l6ZSwgcmVsb2MKLQlzaXplLCBhbmQgbnVtYmVyIG9mIHN5bWJvbHMuICBVc2UgdGhlbSB0byBwcmVhbGxvY2F0ZSBidWZmZXJzIHRoYXQKLQlhcmUgbGFyZ2UgZW5vdWdoIGZvciBhbGwgY2FzZXMuCi0JKGFvdXRfbGlua19pbnB1dF9iZmQpOiBVc2UgcHJlYWxsb2NhdGVkIHN5bWJvbF9tYXAuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogUmVtb3ZlIHN5bWJvbF9tYXAgYXJndW1lbnQ7IHVzZQotCXByZWFsbG9jYXRlZCBzeW1ib2xfbWFwIGluc3RlYWQuICBDaGFuZ2UgYWxsIGNhbGxlcnMuICBVc2UKLQlwcmVhbGxvY2F0ZWQgb3V0cHV0X3N5bXMuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uKTogUmVtb3ZlIHN5bWJvbF9tYXAgYXJndW1lbnQuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4gIFVzZSBwcmVhbGxvY2F0ZWQgY29udGVudHMgYW5kIHJlbG9jcy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogUmVtb3ZlIHN5bWJvbF9tYXAgYXJndW1lbnQ7IHVzZQotCXByZWFsbG9jYXRlZCBzeW1ib2xfbWFwIGluc3RlYWQuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCi1UdWUgQXVnIDIzIDEwOjUxOjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBEb24ndCB1cGRhdGUgdGhlCi0Jc3ltYm9sIG1hcCB0aW1lc3RhbXAgaWYgdGhlcmUgaXMgbm8gc3ltYm9sIG1hcC4gIEZyb20KLQlzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGUgKEFuZHJlYXMgU2Nod2FiKS4KLQotTW9uIEF1ZyAyMiAxMjoyNjo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYyAoQkZEX0pVTVBfVEFCTEVfQVJDSElWRSk6IEFkZCBfdXBkYXRlX2FybWFwX3RpbWVzdGFtcC4KLQkoYmZkX3RhcmdldCk6IEFkZCBmaWVsZCBfYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAuCi0JKiBiZmQuYyAoYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9ub2FyY2hpdmVfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkoX2JmZF9hcmNoaXZlX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVjbGFyZS4KLQkoX2JmZF9hcmNoaXZlX2NvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBDYWxsCi0JYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgaW5zdGVhZCBvZiBjaGVja2luZyBmb3IgYSBCU0QgYXJjaGl2ZQotCWFuZCBjYWxsaW5nIGJzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wLgotCShfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBSZW5hbWUgZnJvbQotCV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcC4gIERvbid0IGFzc3VtZSB0aGF0IGFybWFwX2RhdGVwb3MgaXMKLQlhbHJlYWR5IHNldC4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUgaWYgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCSogaWVlZS5jIChpZWVlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKiBvYXN5cy5jIChvYXN5c191cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCSogc29tLmMgKHNvbV91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCi0JKiBoYXNoLmM6IENvcHkgc3RyaW5nIGhhc2ggZnVuY3Rpb25zIGZyb20gYW91dHguaC4KLQkqIGFvdXR4Lmg6IFN0cmluZyBoYXNoIGZ1bmN0aW9ucyBtb3ZlZCB0byBoYXNoLmMuICBSZXRhaW4KLQlzaW1wbGlmaWVkIHZlcnNpb25zIG9mIGFkZF90b19zdHJpbmd0YWIgYW5kIGVtaXRfc3RyaW5ndGFiLgotCUNoYW5nZSBhbGwgY2FsbGVycyB0byB1c2UgbmV3IGZ1bmN0aW9uIGFuZCBzdHJ1Y3R1cmUgbmFtZXMuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9zdHJpbmd0YWJfaW5pdCwgX2JmZF9zdHJpbmd0YWJfZnJlZSk6IERlY2xhcmUuCi0JKF9iZmRfc3RyaW5ndGFiX3NpemUsIF9iZmRfc3RyaW5ndGFiX2FkZCk6IERlY2xhcmUuCi0JKF9iZmRfc3RyaW5ndGFiX2VtaXQpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLU1vbiBBdWcgMjIgMTA6NDk6MzcgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBpMzg2bGludXguYyAobGludXhfYWRkX29uZV9zeW1ib2wpOiBDcmVhdGUgYSBmaXh1cCBmb3IgYW55Ci0JZGVmaW5lZCBhYnNvbHV0ZSBzeW1ib2wsIG5vdCBqdXN0IEdPVCBvciBQTFQgc3ltYm9scy4KLQkobGludXhfdGFsbHlfc3ltYm9scyk6IENvcnJlY3QgaGFuZGxpbmcgb2YgcmVmZXJlbmNlcyB0byBkZWZpbmVkCi0Jc3ltYm9scy4KLQotVGh1IEF1ZyAxOCAxNjoyOTo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQlHZXQgbGQgLXggLXIgdG8gaGFuZGxlIGEub3V0IHNldCBzeW1ib2xzIGNvcnJlY3RseS4KLQkqIGFvdXR4LmggKGFkanVzdF9vX21hZ2ljKTogSWYgdGhlIC5ic3MgVk1BIHdhcyBzZXQgb3V0c2lkZSBvZgotCUJGRCwgcGFkIHRoZSAuZGF0YSBzZWN0aW9uIHVwIHRvIHRoZSBWTUEgb2YgdGhlIC5ic3Mgc2VjdGlvbi4KLQkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogSWYgYSBzZXQgc3ltYm9sIGRvZXMgbm90IGdldCBtb2RpZmllZCwKLQl0cmVhdCBpdCBhcyBhIGxvY2FsIHN5bWJvbC4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBTZXQgdGhlIHZhbHVlIG9mIHNldCBzeW1ib2xzCi0JY29ycmVjdGx5LiAgRG9uJ3QgZGlzY2FyZCBzZXQgc3ltYm9scyBldmVuIGlmIGRpc2NhcmRpbmcgbG9jYWwKLQlzeW1ib2xzLgotCShhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogRG9uJ3QgYWJvcnQgb24gYmZkX2xpbmtfaGFzaF9uZXcsCi0Jc2luY2UgaXQgY2FuIG5vdyBoYXBwZW4gZm9yIHNldCBzeW1ib2xzLgotCi0JKiBlbGZjb2RlLmggKGVsZl9mYWtlX3NlY3Rpb25zKTogSnVzdCBjaGVjayBmb3IgIi5yZWxhIiBhbmQKLQkiLnJlbCIsIG5vdCAiLnJlbGEuIiBhbmQgIi5yZWwuIjsgbWFrZSB0aGlzIHdvcmsgYnkgY2hlY2tpbmcKLQl1c2VfcmVsYV9wLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBKdXN0IGNoZWNrIGZvciAiLnJlbCIsIG5vdAotCSIucmVsLiIKLQkoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IEp1c3QgY2hlY2sgZm9yCi0JIi5yZWxhIiwgbm90ICIucmVsYS4iCi0JKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLVdlZCBBdWcgMTcgMTY6NTQ6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IEluaXRpYWxpemUKLQlQQVNTIHRvIHRoZSBvbGQgdmFsdWUgKyAxLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogSWYgYSBDX0ZJTEUgc3ltYm9sIGhhcwotCW5vIGF1eCBlbnRyaWVzLCB1c2UgdGhlIHN5bWJvbCBuYW1lIGFzIHRoZSBmaWxlIG5hbWUuCi0JKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBMb29rIGZvciB0aGUgcmlnaHQgQ19GSUxFIHN5bWJvbCwgcmF0aGVyCi0JdGhhbiBhbHdheXMgdXNpbmcgdGhlIGZpcnN0IG9uZS4gIElmIHRoZXJlIGlzIGEgZGVidWdnaW5nIHN5bWJvbAotCWFmdGVyIGEgZnVuY3Rpb24gc3ltYm9sLCBza2lwIGl0LiAgQWRkIHRoZSBzZWN0aW9uIFZNQSB0byB0aGUgbGluZQotCW9mZnNldCwgc2luY2UgaXQgd2FzIHN1YnRyYWN0ZWQgb3V0IGluIGNvZmZfc2x1cnBfbGluZV90YWJsZS4KLQotVHVlIEF1ZyAxNiAxNjo1MzowMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9wcmVwX2hlYWRlcnMpOiBJZiB3cml0aW5nIHNvbWUgZm9ybSBvZiBhbiBleGVjdXRhYmxlLAotCWFsbG9jYXRlIGFuZCBhdHRhY2ggYW4gZXhlYyBoZWFkZXIgdG8gdGhlIEJGRCBwcml2YXRlIGRhdGEuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogRG9uJ3QgZmlsbCBmaWVsZHMgb2YgdGhlIGV4ZWMgaGVhZGVyIGJhc2VkCi0Jb24gQkZEIHByaXZhdGUgZGF0YSBoZXJlIChsaWtlIHRoZSBleGVjIGZsYWdzKS4gIERvIG5vdCB3cml0ZQotCXRoZSBleGVjIGhlYWRlciBoZXJlLgotCShzb21fd3JpdGVfaGVhZGVycyk6IEluc3RlYWQgZG8gaXQgaGVyZS4KLQkqIHNvbS5oIChzdHJ1Y3Qgc29tZGF0YSk6IE5ldyBmaWVsZCAiZXhlY19oZHIiIGZvciB0aGUgZXhlY3V0YWJsZQotCWZpbGUgaGVhZGVyLgotCShvYmpfc29tX2V4ZWNfaGRyKTogTmV3IGFjY2Vzc29yIG1hY3JvLgotCi1UdWUgQXVnIDE2IDAwOjEyOjMxIDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogaTM4NmxpbnV4LmMgKGxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDcmVhdGUgc2VjdGlvbgotCW5hbWVkIC5saW51eC1keW5hbWljLCBub3QgLmR5bmFtaWMuCi0JKGxpbnV4X2FkZF9vbmVfc3ltYm9sKTogVXNlIC5saW51eC1keW5hbWljLCBub3QgLmR5bmFtaWMuCi0JKGJmZF9saW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkobGludXhfZmluaXNoX2R5bmFtaWNfbGluayk6IExpa2V3aXNlLgotCi1Nb24gQXVnIDE1IDEyOjE2OjU2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChTVFJJTkdfU0laRV9TSVpFKTogRGVmaW5lLgotCShjb2ZmX2ZpeF9zeW1ib2xfbmFtZSk6IFVzZSBTVFJJTkdfU0laRV9TSVpFLCBub3QgNC4KLQkoY29mZl93cml0ZV9zeW1ib2xzLCBidWlsZF9zdHJpbmdfdGFibGUpOiBMaWtld2lzZS4KLQkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBMaWtld2lzZS4KLQotCSogbGliY29mZi1pbi5oIChvYmpfc3ltYm9sX3NsZXcpOiBEb24ndCBkZWZpbmUuCi0JKHN0cnVjdCBjb2ZmX3RkYXRhKTogUmVtb3ZlIHVudXNlZCBmaWVsZHMgaW5kZXhfc2xldywgcmF3X2xpbmVub3MsCi0JYW5kIGZsYWdzLgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdCk6IERvbid0IGluaXRpYWxpemUgcmF3X2xpbmVub3MuCi0JKGNvZmZfbWtvYmplY3RfaG9vayk6IERvbid0IGluaXRpYWxpemUgZmxhZ3MuCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX3ptYWdpY19jb250aWd1b3VzKTogRGVmaW5lIGFzIDAgaWYgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCShNWShiYWNrZW5kX2RhdGEpKTogVXNlIE1ZX3ptYWdpY19jb250aWd1b3VzLCBub3QgaGFyZGNvZGVkIDAuCi0JKiBpMzg2bGludXguYyAoTVlfem1hZ2ljX2NvbnRpZ3VvdXMpOiBEZWZpbmUuCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogSWYgYSBTSFRfU1lNVEFCIHNlY3Rpb24gaW4gYQotCXNoYXJlZCBvYmplY3QgaGFzIFNIRl9BTExPQyBzZXQsIGNyZWF0ZSBhIEJGRCBzZWN0aW9uIGZvciBpdC4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IFRoZXJlIG1heSBiZSBhIEJGRCBzZWN0aW9uIGZvciBhCi0JU0hUX1NZTVRBQiBzZWN0aW9uLgotCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IEFkZCBuYW1lIGFyZ3VtZW50LiAgSWYgbm8gZmxhZ3MKLQlhcmUgcmVjb2duaXplZCwgY2hvc2Ugc2VjdGlvbiBmbGFncyBiYXNlZCBvbiB0aGUgbmFtZS4KLQkoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogX2JmZF9zdHlwX3RvX3NlY19mbGFnc19ob29rIGZpZWxkOiBBZGQKLQluYW1lIGFyZ3VtZW50LgotCShiZmRfY29mZl9zdHlwX3RvX3NlY19mbGFnc19ob29rKTogQWRkIG5hbWUgYXJndW1lbnQuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRG9uJ3QgYWRqdXN0IHRoZSBzZWN0aW9uCi0JcG9zaXRpb24gYnkgQ09GRl9QQUdFX1NJWkUgdW5sZXNzIFNFQ19BTExPQyBpcyBzZXQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IFBhc3Mgc2VjdGlvbiBuYW1lIHRvCi0JYmZkX2NvZmZfc3R5cF90b19zZWNfZmxhZ3NfaG9vay4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiBBZGQgdW51c2VkIG5hbWUKLQlhcmd1bWVudC4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiBBZGQgbmFtZSBhcmd1bWVudCB0bwotCXByb3RvdHlwZS4KLQotRnJpIEF1ZyAxMiAxMToyMjo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IENvcnJlY3QgY2hlY2sgZm9yIGludmFsaWQKLQlzZWN0aW9uIGluZGV4LgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIHRoZXJlIGlzIG5vIHN5bWJvbAotCXRhYmxlLCB0cnkgdXNpbmcgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgRnJvbSBFcmljIFlvdW5nZGFsZQotCTxlcmljeUBjYWlzLmNhaXMuY29tPi4KLQotCSogY29uZmlndXJlLmhvc3QgKHNwYXJjLSotc29sYXJpczIqKTogVXNlIHNvbGFyaXMyLCBub3Qgc3lzdjQuCi0JVGhlIGxpbmtlciBkZXBlbmRzIHVwb24gY29uZmlndXJpbmcgZm9yIHNvbGFyaXMyLgotCSogaG9zdHMvc29sYXJpczIuaDogTmV3IGZpbGU7IGluY2x1ZGUgaG9zdHMvc3lzdjQuaC4KLQkqIGNvbmZpZy9zb2xhcmlzMi5taDogTmV3IGZpbGU7IGNvcHkgb2YgY29uZmlnL3N5c3Y0Lm1oLgotCi1XZWQgQXVnIDEwIDEzOjA5OjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYWRqdXN0X3pfbWFnaWMpOiBNYWtlIHN1cmUgZGF0YSBzZWN0aW9uIGlzIHBhZGRlZCB0bwotCXBhZ2UgYm91bmRhcnkgd2hlbiB0aGUgVk1BIGlzIHNldCBieSB0aGUgY2FsbGluZyBwcm9ncmFtLiAgRnJvbQotCUVyaWMgWW91bmdkYWxlIDxlcmljeUBjYWlzLmNhaXMuY29tPi4KLQotTW9uIEF1ZyAgOCAxNzoxODo0OSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQlVcGRhdGUgdG8gbnMzMmsgc3VwcG9ydCwgZnJvbSBJYW4gRGFsbCAoZGFsbEBoZnJkLmRzdG8uZ292LmF1KS4KLQkqIGFvdXQtbnMzMmsuYzogQWRkIGRlY2xhcmF0aW9ucyB0aGF0IHdlcmUgaW4gYW91dC1uczMyay5oLCBjaGFuZ2UKLQlkZWNsYXJhdGlvbnMgdG8gdHJhZGl0aW9uYWwgZm9ybS4KLQkoTVlfcmVsb2NfaG93dG8sIE1ZX3B1dF9yZWxvYyk6IENoYW5nZSBmcm9tIG1hY3JvIHRvIGZ1bmN0aW9uLgotCShuczMya19yZWxvY2F0ZV9jb250ZW50cyk6IE5ldyBmdW5jdGlvbi4KLQkqIGFvdXQtbnMzMmsuaDogUmVtb3ZlLgotCSogY3B1LW5zMzJrLmM6IEFkZCBkZWNsYXJhdGlvbnMgdGhhdCB3ZXJlIGluIGFvdXQtbnMzMmsuaCwgY2hhbmdlCi0JZGVjbGFyYXRpb25zIHRvIHRyYWRpdGlvbmFsIGZvcm0uCi0JKG5zMzJrX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDYWxsIG5zMzJrX3JlbG9jYXRlX2NvbnRlbnRzLgotCSogbmV0YnNkNTMyLmM6IFJlZm9ybWF0IHRvIHN0YW5kYXJkcywgYWRkIGNvcHlyaWdodCBub3RpY2UuCi0JKEFSQ0gpOiBEb24ndCBkZWZpbmUuCi0JKGFvdXQtbnMzMmsuaCk6IERvbid0IGluY2x1ZGUuCi0JKiBwYzUzMi1tYWNoLmM6IERpdHRvLgotCi1Nb24gQXVnICA4IDE3OjU1OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY2F0ZSk6IERvbid0IHRyeSB0byBjb252ZXJ0IHJlbG9jcwotCWFnYWluc3QgY29tbW9uIHN5bWJvbHMuCi0KLVNhdCBBdWcgIDYgMjI6Mjc6MzAgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBpcml4LWNvcmUuYyAoaXJpeF9jb3JlX2NvcmVfZmlsZV9wKTogIElnbm9yZSBzZWN0aW9ucyB0aGF0Ci0JYXJlIG5vdCBjb250YWluZWQgaW4gdGhlIGNvcmUgZmlsZS4KLQotVGh1IEF1ZyAgNCAxMTozMjoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTY4ay5jIChtNjhrX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZS4KLQkqIGNmLW02OGtseW54LmMgKF9iZmRfbTY4a2NvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmUuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogRm9yY2UgdGhlIHZtYSBvZiBzZWN0aW9ucyB3aGljaAotCWRvIG5vdCBoYXZlIFNFQ19BTExPQyBzZXQgdG8gYmUgMC4gIFRoaXMgaXMgbmVlZGVkIHRvIGhhbmRsZQotCXJlbG9jcyBhZ2FpbnN0IGRlYnVnZ2luZyBzZWN0aW9ucy4KLQotV2VkIEF1ZyAgMyAxNjo0NTo0MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBSZXdyb3RlIHRvIGNoYW5nZSByZWxvY3MKLQlhZ2FpbnN0IGxvY2FsbHkgZGVmaW5lZCBzeW1ib2xzIGludG8gcmVsb2NzIGFnYWluc3Qgc2VjdGlvbgotCXN5bWJvbHMsIGZvciBWeFdvcmtzIDUuMS4KLQotV2VkIEF1ZyAgMyAxMDozNDozNyAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGkzODZsaW51eC5jIChsaW51eF9hZGRfb25lX3N5bWJvbCk6IE9ubHkgaGFuZGxlCi0JU0hBUkFCTEVfQ09ORkxJQ1RTIHNwZWNpYWxseSBpZiBCU0ZfQ09OU1RSVUNUT1IgaXMgc2V0LiAgU2V0IGhhc2hwCi0JZm9yIGEgR09UIG9yIFBMVCBzeW1ib2wuICBTZXQganVtcCBmaWVsZCBvZiBmaXh1cCBmb3IgYSBQTFQgc3ltYm9sLgotCShsaW51eF90YWxseV9zeW1ib2xzKTogQ2hlY2sgc2VjdGlvbiBvZiByZWFsIHN5bWJvbC4gIFdoZW4gbG9va2luZwotCWZvciBhIGJ1aWx0aW4gZml4dXAsIGNoZWNrIGJ1aWx0aW4gYW5kIGp1bXAgZmxhZ3MuICBDcmVhdGUgbm8gbW9yZQotCXRoYW4gb25lIGZpeHVwLCBhbmQgYWx3YXlzIGNyZWF0ZSBvbmUgaWYgdGhlIHJlYWwgc3ltYm9sIGlzIGluIHRoZQotCWFic29sdXRlIHNlY3Rpb24uICBPbmx5IHN0cmlwIGFic29sdXRlIHN5bWJvbHMuCi0KLVdlZCBBdWcgIDMgMDU6MDg6MjQgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IHNldCBpbnRlcm5hbF9hLm1hZ2ljIHRvCi0JTFlOWENPRkZNQUdJQyB3aGVuZXZlciA2OGssIFNQQVJDIG9yIGkzODYgTHlueE9TCi0JKHllcywgdGhleSBoYXZlIHRoZSBzYW1lIG1hZ2ljIG51bWJlciEpCi0KLVR1ZSBBdWcgIDIgMTA6NDM6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBocDMwMGhwdXguYyAoQk1BR0lDKTogRGVmaW5lIGFzIEhQVVhfRE9UX09fTUFHSUMsIHRvIG1ha2UgdGVzdAotCWluIGFvdXR4Lmggd29yayBjb3JyZWN0bHkuCi0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKGhvd3RvX3JlbGxvbmcsIGhvd3RvX2lwcm1lZCk6IFVzZSBpdCBhcyBzcGVjaWFsX2Z1bmN0aW9uLgotCi0JKiBsaWJiZmQtaW4uaDogTW92ZSBkZWNsYXJhdGlvbnMgb2YgYmZkX3JlYWQsIGJmZF93cml0ZSwgYmZkX3NlZWssCi0JYmZkX3RlbGwsIGJmZF9mbHVzaCwgYW5kIGJmZF9zdGF0IGZyb20gaGVyZS4uLgotCSogYmZkLWluLmg6IC4uLnRvIGhlcmUsIHRvIG1ha2UgdGhlbSB2aXNpYmxlIHRvIHByb2dyYW1zIHdoaWNoCi0Ja25vdyBtb3JlIGFib3V0IHRoZSBvYmplY3QgZmlsZSBmb3JtYXQgdGhhbiBCRkQgZG9lcy4KLQkqIGxpYmJmZC5oLCBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLU1vbiBBdWcgIDEgMTc6NTU6NTMgMTk5NCAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHB0cmFjZS1jb3JlLmMgKHB0cmFjZV91bml4X2NvcmVfZmlsZV9wKTogIENvbnZlcnQgemFsbG9jIHVzYWdlCi0JdG8gYmZkX3phbGxvYy4KLQotTW9uIEF1ZyAgMSAxMjowNDo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVsZjY0LXNwYXJjLmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KLQotCUVMRiBsaW5rZXIgcGF0Y2hlcyBmcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljeUBjYWlzLmNhaXMuY29tPi4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBTZXQgdHlwZSBvZgotCV9EWU5BTUlDIHRvIFNUVF9PQkpFQ1QuCi0JKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IEFsd2F5cyBjcmVhdGUgaGFzaCB0YWJsZQotCWVudHJ5LiAgU2V0IHR5cGUgdG8gU1RUX09CSkVDVC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IERvbid0IHNldCB0eXBlIG9mIHdlYWsgZGVmaW5lZCBzeW1ib2wgdG8KLQlTVEJfV0VBSyBpZiBzeW1ib2wgd2FzIHJlZmVyZW5jZWQuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogQ2hlY2sgRFlOQU1JQyBhcyB3ZWxsIGFzIEVYRUNfUC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBTZXQgdHlwZSBvZgotCV9HTE9CQUxfT0ZGU0VUX1RBQkxFIHRvIFNUVF9PQkpFQ1QuCi0JKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IElnbm9yZSBsb2NhbCBQTFQzMiByZWxvY3MuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBUcmVhdCBsb2NhbCBQTFQzMiByZWxvY3MgYXMgUEMzMi4KLQotCSogZWxmY29kZS5oIChlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ29ycmVjdCB3ZWFrIHN5bWJvbAotCWhhbmRsaW5nIGFnYWluLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IERvbid0IHRyeSB0byByZWFkIHRoZSByZWxvY3MKLQlpZiB0aGVyZSBhcmVuJ3QgYW55LgotCi0JKiBjb25maWd1cmUuaG9zdCAoc3BhcmMtKi1zb2xhcmlzMiopOiBVc2Ugc3lzdjQsIG5vdCBzb2xhcmlzMi4KLQkqIGhvc3RzL3NvbGFyaXMyLmg6IFJlbW92ZS4KLQkqIGNvbmZpZy9zb2xhcmlzMi5taDogUmVtb3ZlLgotCi1TdW4gSnVsIDMxIDE0OjI3OjA0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMsIGVsZjMyLWhwcGEuaDogVXBkYXRlIGNvbW1lbnQgcmVmbGVjdGluZyB3aGljaAotCUhQUEEgRUxGIHNwZWMgdGhlIGNvZGUgaW1wbGVtZW50cy4KLQotVHVlIEp1bCAyNiAxNzozODowMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjcHUtaTk2MC5jIChNQVhfQVJDSCk6IE5ldyBtYWNyby4KLQkoY29tcGF0aWJsZSk6IFVzZSBpdCBpbiBjb21wdXRpbmcgYXJyYXkgYm91bmRzLiAgUHV0IGNvbW1hIGFmdGVyCi0JbGFzdCBlbnRyeSBpbiBhcnJheSwgZm9yIHJlZ3VsYXJpdHkuCi0JKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGp1c3Qgc3BhY2luZyBmb3IgZWFzaWVyIHJlYWRpbmcuCi0KLQkqIGNvZmYtaTk2MC5jIChob3d0b19yZWxsb25nLCBob3d0b19pcHJtZWQsIGhvd3RvX29wdGNhbGwpOiBVc2UKLQlIT1dUTyBtYWNyby4KLQotCSogY3B1LWk5NjAuYyAoSlgpOiBEZWZpbmUgYXMgYmZkX21hY2hfaTk2MF9qeC4KLQkoc2Nhbl85NjBfbWFjaCk6IFJlY29nbml6ZSBqeCBtYWNoaW5lLgotCShNQVhfQVJDSCk6IERlZmluZSB0byBiZSBKWC4KLQkoY29tcGF0aWJsZSk6IEFkZCBKWCByb3cgdG8gYXJyYXkuCi0JKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgSlggZW50cnkuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2k5NjBfangpOiBOZXcgbWFjcm8uCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEZvciBGX0k5NjBKWCwgc2V0IG1hY2hpbmUKLQl0byBiZmRfbWFjaF9pOTYwX2p4LgotCShjb2ZmX3NldF9mbGFncyk6IEZvciBiZmRfbWFjaF9pOTYwX2p4LCBzZXQgRl9JOTYwSlguCi0KLVR1ZSBKdWwgMjYgMTE6MDQ6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBXaGVuIGhhbmRsaW5nIGEgd2VhawotCXN5bWJvbCwgY29ycmVjdCBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgZXF1aXZhbGVudCBub3JtYWwgc3ltYm9sCi0Jd2FzIHJlZmVyZW5jZWQuCi0KLQlBZGQgc3VwcG9ydCBmb3IgY3JlYXRpbmcgc2hhcmVkIGxpYnJhcmllcyB1bmRlciBpMzg2IEVMRiBhbmQgU1BBUkMKLQlFTEYuICBCYXNlZCBvbiBwYXRjaGVzIGJ5IEVyaWMgWW91bmdkYWxlIDxlcmljeUBjYWlzLmNhaXMuY29tPi4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IFJlbW92ZSBjb3B5X29mZnNldCBmaWVsZC4KLQlBZGQgZ290X29mZnNldCBhbmQgcGx0X29mZnNldCBmaWVsZHMuCi0JKEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUNfTVVMVElQTEUpOiBEb24ndCBkZWZpbmUuCi0JKEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUNfTVVMVElQTEUpOiBEb24ndCBkZWZpbmUuCi0JKEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgY2hlY2tfcmVsb2NzIGZpZWxkLgotCShzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBDaGFuZ2UgcmVsb2NzIGZyb20gUFRSIHRvCi0JRWxmX0ludGVybmFsX1JlbGEgKi4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgbG9jYWxfZ290X29mZnNldHMgZmllbGQuCi0JKGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyk6IERlZmluZSBhY2Nlc3NvciBtYWNyby4KLQkoYmZkX2VsZjMyX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCk6IERlY2xhcmUuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IERvbid0IHVzZSB0aGUgc2VjdGlvbiBkYXRhCi0JcmVsb2NzIGZpZWxkLgotCShlbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBNYWtlIGdsb2JhbGx5IHZpc2libGUuICBVc2UKLQltYWNybyB0byByZW5hbWUgdG8gTkFNRShiZmRfZWxmLGxpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKS4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgcHV0Ci0JbWFrZSBhbGwgbG9jYWwgc3ltYm9scyBkeW5hbWljLiAgRG9uJ3QgYm90aGVyIHdpdGggdGhlCi0JRFlOQU1JQ19NVUxUSVBMRSBmbGFncy4gIENhbGwgdGhlIGNoZWNrX3JlbG9jcyBiYWNrZW5kIGZ1bmN0aW9uIGlmCi0JaXQgaXMgZGVmaW5lZC4KLQkoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBNYWtlIGdsb2JhbGx5IHZpc2libGUuICBVc2UKLQltYWNybyB0byByZW5hbWUgdG8gTkFNRShiZmRfZWxmLGxpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpLiAgSWYKLQljcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBtYWtlIHN1cmUgdGhhdCBfRFlOQU1JQyBpcyBhZGRlZCBhcyBhCi0JZHluYW1pYyBzeW1ib2wuCi0JKGVsZl9saW5rX3JlYWRfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCShOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBJZiBjcmVhdGluZyBhIHNoYXJlZAotCWxpYnJhcnksIGFsd2F5cyBjcmVhdGUgc3ltYm9scywgYW5kIGFsd2F5cyBtYWtlIHRoZW0gZHluYW1pYy4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogUGVybWl0IGNyZWF0aW9uIG9mIHNoYXJlZCBsaWJyYXJpZXMuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IFVzZSBlbGZfbGlua19yZWFkX3JlbG9jcyB0byBnZXQgdGhlIHJlbG9jcy4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IERvbid0IGluaXRpYWxpemUKLQljb3B5X29mZnNldC4gIEluaXRpYWxpemUgZ290X29mZnNldCBhbmQgcGx0X29mZnNldC4KLQkqIGVsZjMyLXRhcmdldC5oIChlbGZfYmFja2VuZF9jaGVja19yZWxvY3MpOiBEZWZpbmUgYXMgMCBpZiBub3QKLQlkZWZpbmVkLgotCShlbGYzMl9iZWQpOiBJbml0aWFsaXplIGNoZWNrX3JlbG9jcyBmaWVsZC4KLQkqIGVsZjY0LXRhcmdldC5oIChlbGZfYmFja2VuZF9jaGVja19yZWxvY3MpOiBEZWZpbmUgYXMgMCBpZiBub3QKLQlkZWZpbmVkLgotCShlbGY2NF9iZWQpOiBJbml0aWFsaXplIGNoZWNrX3JlbG9jcyBmaWVsZC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2hvd3RvX3RhYmxlKTogQ2hhbmdlIFJfMzg2X1BMVDMyIGFuZAotCVJfMzg2X0dPVFBDIHRvIGJlIHBjX3JlbGF0aXZlIGFuZCBwY3JlbF9vZmZzZXQuCi0JKGVsZl9pMzg2X3BpY19wbHQwX2VudHJ5KTogRGVmaW5lLgotCShlbGZfaTM4Nl9waWNfcGx0X2VudHJ5KTogRGVmaW5lLgotCShlbGZfaTM4Nl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IENyZWF0ZSBhIC5nb3QucGx0IHNlY3Rpb24sIGFuZAotCWRlZmluZSBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYXQgdGhlIHN0YXJ0IG9mIGl0LiAgSWYgY3JlYXRpbmcgYQotCXNoYXJlZCBsaWJyYXJ5LCBtYWtlIHN1cmUgdGhhdCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYWRkZWQgYXMgYQotCWR5bmFtaWMgc3ltYm9sLiAgRG9uJ3QgY3JlYXRlIC5yZWwuYnNzIGlmIGNyZWF0aW5nIGEgc2hhcmVkCi0JbGlicmFyeS4KLQkoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCBtYWtlIGEgUExUIGVudHJ5IGlmIHRoZQotCXN5bWJvbCBhbHJlYWR5IGhhcyBvbmUuICBXaGVuIG1ha2luZyBhIFBMVCBlbnRyeSwgc2V0IHBsdF9vZmZzZXQuCi0JRG9uJ3QgY3JlYXRlIGEgY29weSByZWxvYyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuICBEb24ndAotCXNldCBjb3B5X29mZnNldCwganVzdCBzZXQgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZLgotCShlbGZfaTM4Nl9hbGxvY2F0ZV9keW5hbWljX3NlY3Rpb24pOiBSZW1vdmUuCi0JKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExvb2sgdGhyb3VnaCBhbGwgdGhlIHNlY3Rpb25zCi0JcmF0aGVyIHRoYW4gYXNzdW1pbmcgd2Uga25vdyB0aGVpciBuYW1lcy4gIFJlbW92ZSBhbnkgZW1wdHkgcmVsb2MKLQlvciBwbHQgc2VjdGlvbnMuICBPbmx5IGFkZCBhIERUX0RFQlVHIGVudHJ5IGlmIG5vdCBjcmVhdGluZyBhCi0Jc2hhcmVkIGxpYnJhcnkuICBPbmx5IGFkZCBhIERUX1BMVEdPVCBlbnRyeSBpZiB0aGVyZSBpcyBhIFBMVC4KLQlBZGQgYSBEVF9URVhUUkVMIGVudHJ5IGlmIHJlcXVpcmVkLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogUGVybWl0IHVuZGVmaW5lZCBzeW1ib2xzIHdoZW4KLQljcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgSGFuZGxlIHRoZSBzcGVjaWFsIHJlbG9jYXRpb24gdHlwZXMKLQlzcGVjaWFsbHkuCi0JKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IENyZWF0ZSBhIFBMVCBlbnRyeSBpZiBwbHRfb2Zmc2V0Ci0JaXMgc2V0LiAgSWYgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgcHJvZHVjZSBhIFBJQyBQTFQgZW50cnkuCi0JT25seSBtYXJrIGEgUExUIHN5bWJvbCBhcyB1bmRlZmluZWQgaWYgaXQgd2FzIG5vdCBkZWZpbmVkIGJ5IGEKLQlyZWd1bGFyIG9iamVjdCBmaWxlLiAgQ3JlYXRlIGEgR09UIGVudHJ5IGlmIGdvdF9vZmZzZXQgaXMgc2V0LgotCUNyZWF0ZSBhIGNvcHkgcmVsb2MgaWYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZIGlzIHNldC4KLQkoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBDaGFuZ2UgdGhlIGhhbmRsaW5nIG9mCi0JRFRfUkVMU1ogdG8gc2ltcGx5IHN1YnRyYWN0IG91dCB0aGUgc2l6ZSBvZiAucmVsLnBsdC4gIElmIGNyZWF0aW5nCi0JYSBzaGFyZWQgbGlicmFyeSwgcHJvZHVjZSBQSUMgUExUIGNvZGUuCi0JKGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyk6IERlZmluZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IENoYW5nZSBSX1NQQVJDX0dPVDEwLAotCVJfU1BBUkNfR09UMjIsIGFuZCBSX1NQQVJDX1BDMTAgdG8gbm90IHdhcm4gYWJvdXQgcmVsb2Mgb3ZlcmZsb3cuCi0JKGVsZjMyX3NwYXJjX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgY3JlYXRpbmcgYSBzaGFyZWQKLQlsaWJyYXJ5LCBtYWtlIHN1cmUgdGhhdCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYWRkZWQgYXMgYQotICAgICAgICBkeW5hbWljIHN5bWJvbCwgYW5kIHNldCB0aGUgdHlwZSB0byBTVFRfT0JKRUNULiAgTGlrZXdpc2UgZm9yCi0gICAgICAgIF9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8uICBEb24ndCBjcmVhdGUgLnJlbC5ic3MgaWYgY3JlYXRpbmcgYQotICAgICAgICBzaGFyZWQgbGlicmFyeS4KLQkoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCBtYWtlIGEgUExUIGVudHJ5IGlmIHRoZQotCXN5bWJvbCBhbHJlYWR5IGhhcyBvbmUuICBXaGVuIG1ha2luZyBhIFBMVCBlbnRyeSwgc2V0IHBsdF9vZmZzZXQuCi0JRG9uJ3QgY3JlYXRlIGEgY29weSByZWxvYyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuICBEb24ndAotCXNldCBjb3B5X29mZnNldCwganVzdCBzZXQgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZLgotCShlbGYzMl9zcGFyY19hbGxvY2F0ZV9keW5hbWljX3NlY3Rpb24pOiBSZW1vdmUuCi0JKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExvb2sgdGhyb3VnaCBhbGwgdGhlIHNlY3Rpb25zCi0JcmF0aGVyIHRoYW4gYXNzdW1pbmcgd2Uga25vdyB0aGVpciBuYW1lcy4gIE9ubHkgYWRkIGEgRFRfREVCVUcKLQllbnRyeSBpZiBub3QgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4gIEFkZCBhIERUX1RFWFRSRUwgZW50cnkgaWYKLQlyZXF1aXJlZC4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFBlcm1pdCB1bmRlZmluZWQgc3ltYm9scyB3aGVuCi0JY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4gIEhhbmRsZSB0aGUgc3BlY2lhbCByZWxvY2F0aW9uIHR5cGVzCi0Jc3BlY2lhbGx5LgotCShlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBDcmVhdGUgYSBQTFQgZW50cnkgaWYgcGx0X29mZnNldAotCWlzIHNldC4gIE9ubHkgbWFyayBhIFBMVCBzeW1ib2wgYXMgdW5kZWZpbmVkIGlmIGl0IHdhcyBub3QgZGVmaW5lZAotCWJ5IGEgcmVndWxhciBvYmplY3QgZmlsZS4gIENyZWF0ZSBhIEdPVCBlbnRyeSBpZiBnb3Rfb2Zmc2V0IGlzCi0Jc2V0LiAgQ3JlYXRlIGEgY29weSByZWxvYyBpZiBFTEZfTElOS19IQVNIX05FRURTX0NPUFkgaXMgc2V0LgotCShlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IFN0b3JlIGR5bm9iaiBpbiBhIGxvY2FsCi0JdmFyaWFibGUuCi0JKGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyk6IERlZmluZS4KLQotTW9uIEp1bCAyNSAxMjoyMTowNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAocGM1MzJtYWNoX3ZlYyk6IENoYW5nZSB0byBwYzUzMm1hY2hhb3V0X3ZlYy4KLQkqIGNvbmZpZy5iZmQgKG5zMzJrLSotbmV0YnNkKik6IFVzZSBuczMyay1uYnNkIGFzIGJmZF9uYW1lLgotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtbnMzMmsuby4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgYW91dC1uczMyay5vLCBuZXRic2Q1MzIubywgbTg4a21hY2gzLm8sCi0JcGM1MzItbWFjaC5vLgotCSogdGFyZ2V0cy5jIChwYzUzMm1hY2hhb3V0X3ZlYyk6IFVzZSBpbnN0ZWFkIG9mIHBjNTMybWFjaF92ZWMuCi0JKiBjb25maWcvcGM1MzItbWFjaC5tdCAoREVGQVVMVF9WRUNUT1IpOiBEaXR0by4KLQkoU0VMRUNUX1ZFQ1MpOiBSZW1vdmUuCi0JKiBjb25maWcvbnMzMmstbmJzZC5tdDogTmV3IGZpbGUsIHdhcyBuczMyay1uZXRic2QubXQuCi0JKiBjb25maWcvbnMzMmstbmV0YnNkLm10OiBSZW1vdmUsIG5hbWUgdG9vIGxvbmcuCi0KLUZyaSBKdWwgMjIgMTE6MDc6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IFdoZW4gY2hhbmdpbmcgYQotCXN5bWJvbCB0byBjb21tb24sIHNldCB0aGUgYWxpZ25tZW50LgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFdoZW4gY3JlYXRpbmcgYSBjb21tb24gc3ltYm9sLAotCXNldCB0aGUgYWxpZ25tZW50LgotCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBXaGVuIGNoYW5naW5nIGEgc3ltYm9sIHRvCi0JY29tbW9uLCBzZXQgdGhlIGFsaWdubWVudC4KLQkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogUmVzdHJpY3QgdGhlIGFsaWdubWVudCBvZiBhIGNvbW1vbiBzeW1ib2wKLQl0byB0aGUgYWxpZ25tZW50IHBvd2VyIGdpdmVuIGJ5IHRoZSBhcmNoaXRlY3R1cmUuCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBSZW1vdmUgYWxpZ24gZmllbGQuICBBZGQKLQljb3B5X29mZnNldCBmaWVsZC4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU3RvcmUgYWxpZ25tZW50IGluCi0JbmV3IGJmZF9saW5rX2hhc2hfZW50cnkgZmllbGQsIG5vdCBpbiBlbGZfbGlua19oYXNoX2VudHJ5IGZpZWxkLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogU2ltaWxhciBjaGFuZ2Ugd2hlbiBnZXR0aW5nIGFsaWdubWVudC4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IERvbid0IGluaXRpYWxpemUgYWxpZ24uICBEbwotCWluaXRpYWxpemUgY29weV9vZmZzZXQuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFVzZSBjb3B5X29mZnNldAotCWZpZWxkIHJhdGhlciB0aGFuIGFsaWduIGZpZWxkLiAgR2V0IGFsaWdubWVudCB1c2luZyBiZmRfbG9nMgotCXJhdGhlciB0aGFuIHN3aXRjaC4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBVc2UgY29weV9vZmZzZXQsCi0Jbm90IGFsaWduLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogSnVzdCBjaGVjawotCVNUQVRfRk9SX0VYRUMsIGRvbid0IGNoZWNrIE1BQ0guCi0JKiBtODhrbWFjaDMuYyAoTUFDSCk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9pMzg2LW1hY2gzLm10IChUREVGSU5FUyk6IERlZmluZSBTVEFUX0ZPUl9FWEVDLgotCSogY29uZmlnL204OGstbWFjaDMubXQgKFRERUZJTkVTKTogTGlrZXdpc2UuCi0JKiBjb25maWcvbWlwcy1tYWNoMy5tdCAoVERFRklORVMpOiBMaWtld2lzZS4KLQotVGh1IEp1bCAyMSAxNzoyNDozMSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGkzODZtYWNoMy5jOiBSZXZlcnRlZCB0byB2ZXJzaW9uIGZyb20gYmVmb3JlIEp1bCA1IDE5OTQgY2hhbmdlcy4KLQotVGh1IEp1bCAyMSAxMjoyNjowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QpOiBSZW1vdmUgc3BlY2lhbF9mdW5jdGlvbjEuCi0JSXQncyB0aGUgd3Jvbmcgd2F5IHRvIGRvIHRoaW5ncy4KLQkoSE9XVE8pOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCi0JKEhPV1RPMik6IFJlbW92ZS4KLQkoX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogUmVtb3ZlIHJlZmVyZW5jZXMgdG8KLQlzcGVjaWFsX2Z1bmN0aW9uMS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IFJlbW92ZSByZWZlcmVuY2VzIHRvCi0Jc3BlY2lhbF9mdW5jdGlvbjEuCi0JKGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0KLVdlZCBKdWwgMjAgMTU6NDY6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkIHJwYXRoCi0JYXJndW1lbnQuICBJZiBpdCBpcyBub3QgTlVMTCwgdXNlIGl0IHRvIHNldCBEVF9SUEFUSC4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIHByb3RvdHlwZS4KLQkoYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1TYXQgSnVsIDE2IDIxOjEwOjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKTogSWYgdGhlcmUgaXMgbm8KLQlkeW5hbWljIHN5bXRhYiwgcmV0dXJuIGVycm9yLgotCi0JKiBsaWJlbGYuaCAoRUxGX0xJTktfSEFTSF9ERUZJTkVEX1dFQUspOiBEZWZpbmUuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIHN5bWJvbCBpcyBkZWZpbmVkIGFzCi0Jd2Vhaywgc2V0IEVMRl9MSU5LX0hBU0hfREVGSU5FRF9XRUFLLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogSWYgc3ltYm9sIGlzIGRlZmluZWQgYXMgd2VhaywgbWFyayBpdAotCVNUQl9XRUFLLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIHJlbG9jcyBmaWVsZC4KLQkoc2hkcl9uYW1lKTogUmVtb3ZlOyB1bnVzZWQuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IFJld3JvdGUgdG8gaGFuZGxlIGJvdGggUkVMCi0JYW5kIFJFTEEgcmVsb2NzLiAgRnJlZSB1cCB0aGUgdW5zd2FwcGVkIHJlbG9jcy4gIFBlcm1pdCB0aGUgcmVsb2NzCi0JdG8gYmUgY2FjaGVkIGluIHRoZSBzZWN0aW9uX2RhdGEuICBDb3JyZWN0IHRoZSByZWxvYyBhZGRyZXNzLgotCShlbGZfc2x1cnBfcmVsb2NhX3RhYmxlKTogUmVtb3ZlLgotCShlbGZfY2Fub25pY2FsaXplX3JlbG9jKTogUmV3cm90ZS4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogUGVybWl0IHRoZSByZWxvY3MgdG8gYmUgY2FjaGVkIGluIHRoZQotCXNlY3Rpb24gZGF0YS4KLQotU2F0IEp1bCAxNiAxMzo1NTozOCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgKG04OCotaGFycmlzLWN4dXgqKTogUmVjb2duaXplLgotCSogaG9zdHMvaGFycmlzLmggKFBPU0lYX1VUSU1FLCBIQVZFX1BST0NGUyk6IERlZmluZS4KLQotCSogY29uZmlndXJlLmhvc3QgKG02OCotYXRhcmktc3lzdjQqKTogTmV3IGhvc3QuCi0JKG02OCotY2JtLXN5c3Y0Kik6IFVzZSBtNjhrdjQgaW5zdGVhZCBvZiBhbWl4LgotCSogaG9zdHMvYW1peC5oOiBSZW1vdmUuCi0JKiBob3N0cy9tNjhrdjQuaDogTmV3IGZpbGUsIHdhcyBhbWl4LmguCi0KLVRodSBKdWwgMTQgMTU6MTI6MjQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsLCBiZmRfdHlwZSwgc3RydWN0Ci0JcmVsb2NfaG93dG9fc3RydWN0LCByZWxvY19ob3d0b190eXBlLCBIT1dUTywgSE9XVE8yKTogQ29waWVkCi0JY2hhbmdlcyBvdmVyIGZyb20gYmZkLWluMi5oIHNvIHRoZXkgZ2V0IGdlbmVyYXRlZCBwcm9wZXJseSBuZXh0Ci0JdGltZSBzb21lb25lIHJ1bnMgIm1ha2UgaGVhZGVycyIuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIHRhcmdldHMuYyAobmV0YnNkNTMyX3ZlYywgcGM1MzJtYWNoX3ZlYyk6IERlY2xhcmUgY29uc3QuCi0JKG04OGttYWNoM192ZWMpOiBSZXN0b3JlIGRlbGV0ZWQgZGVjbGFyYXRpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWxwaGFiZXRpemUgdGFyZ2V0IHZlY3RvciBuYW1lcy4KLQotCSogY29uZmlnL3BjNTMybWFjaC5taDogTmV3IGZpbGUuCi0JKEhERVBGSUxFUywgSERFRklORVMpOiBEZWZpbmUgaGVyZS4KLQkqIGNvbmZpZy9wYzUzMi1tYWNoLm10IChIREVQRklMRVMsIEhERUZJTkVTKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9uczMyay1uZXRic2QubXQgKEhERVBGSUxFUywgSERFRklORVMpOiBEZWxldGVkLgotCi0JU3VuIEp1bCAxMCAwMDowNDoyMCAxOTk0ICBJYW4gRGFsbCAgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSkKLQotCSogcGM1MzItbWFjaC5jOiBOZXcgRmlsZS4gcGM1MzItbWFjaCBhLm91dCBmb3JtYXQuCi0KLQkqIG5ldGJzZDUzMi5jOiBOZXcgZmlsZS4gcGM1MzItbmV0YnNkNTMyIGEub3V0IGZvcm1hdC4KLQotCSogaG9zdHMvcGM1MzJtYWNoLmg6IE5ldyBmaWxlLiBwYzUzMi1tYWNoIGhvc3Qgc3VwcG9ydC4KLQotCSogY3B1LW5zMzJrLmM6IE5ldyBmaWxlLiBuczMyayBzdXBwb3J0IGNwdSBzcGVjaWZpYyBjb2RlIHJhdGhlcgotCXRoYW4gZm9ybWF0IHNwZWNpZmljIGNvZGUuCi0KLQkqIGNvbmZpZy9wYzUzMi1tYWNoLm10OiBOZXcgZmlsZS4gU3VwcG9ydCBmb3IgcGM1MzItbWFjaCB0YXJnZXQuCi0KLQkqIGNvbmZpZy9uczMyay1uZXRic2QubXQ6IE5ldyBmaWxlLiBTdXBwb3J0IGZvciBuZXRic2Q1MzIgdGFyZ2V0LgotCi0JKiBhb3V0LW5zMzJrLmMsIGFvdXQtbnMzMmsuaDogTmV3IGZpbGVzIHN1cHBvcnRpbmcgYW91dCBmb3JtYXQgZm9yCi0JbnMzMmsgc2VyaWVzLiAKLQotCSogdGFyZ2V0cy5jOiBBZGQgbmV0YnNkNTMyX3ZlYyBhbmQgcGM1MzJtYWNoYW91dF92ZWMgaW50bwotCWJmZF90YXJnZXRfdmVjdG9yIGFycmF5LiBNb3ZlIG5ldGJzZDM4Nl92ZWMgdG8gYWxwaGFiZXRpYyBvcmRlcgotCWxvY2F0aW9uLgotCi0JKiByZWxvYy5jIChfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpIEFkZCBzdXBwb3J0IGZvcgotCXNwZWNpYWxfZnVuY3Rpb24xIGluIGhvd3RvLgotCi0JKiBsaWJhb3V0Lmg6IGFkZCBNX05TMzIwMzIsIE1fTlMzMjUzMiwgTV81MzJfTkVUQlNEIGVudHJpZXMgaW4KLQltYWNoaW5lX3R5cGUgZW51bS4KLQotCSogY29uZmlndXJlLmluOiBhZGQgcGM1MzJtYWNoX3ZlYyBhbmQgbmV0YnNkNTMyX3ZlYyBlbnRyaWVzLgotCi0JKiBjb25maWcuYmZkOiBhZGQgcGM1MzJtYWNoIGhvc3QgZW50cmllcy4gVXNlIGZvciBib3RoCi0JbnMzMmstcGM1MzItbWFjaCBhbmQgbnMzMmstcGM1MzItbmV0YnNkLgotCi0JKiBjb25maWcuYmZkOiBpdCBkb2Vzbid0IHdvcmsgdG8gdXNlIGkzODYtbWFjaDMgZm9yIG5zMzJrKi0qLW1hY2guCi0JYWRkIG5zMzJrLXBjNTMyLW1hY2gqIGFuZCBuczMyay0qLW5ldGJzZCogZW50cmllcy4KLQotCSogYmZkLWluMi5oOiBBZGQgbnMzMmsgc3BlY2lmaWMgcmVsb2NhdGlvbnMgdG8gYmZkX3JlbG9jX2NvZGVfcmVhbAotCWVudW0uCi0KLQkqIGJmZC1pbjIuaDogQWRkIHNwZWNpYWxfZnVuY3Rpb24xIHRvIHN0cnVjdCBob3d0by4gQ2hhbmdlIEhPV1RPCi0JYW5kIE5FV0hPV1RPIG1hY3JvcyB0byBtYWtlIHNwZWNpYWxfZnVuY3Rpb24xIE5VTEwuIE5ld3cgSE9XVE8yCi0JbWFjcm8uCi0KLQkqIGJmZC1pbjIuaDogU3BsaXQgZGVmaW5pdGlvbiBvZiBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0Ci0JYW5kIGNvcnJlc3BvbmRpbmcgdHlwZWRlZiBpbnRvIHR3byBzdGF0ZW1lbnRzLgotCi0JKiBiZmQtaW4yLmg6IEFkZCBlbnRyeSBiZmRfYXJjaF9uczMyayB0byBiZmRfYXJjaGl0ZWN0dXJlIGVudW0uCi0KLQkqIGFyY2h1cmVzLmM6IEFkZCBiZmRfbnMzMmtfYXJjaCBwcm90b3R5cGUsIGFuZCBlbnRyeSBpbgotCWFyY2h1cmVzX2luaXRfdGFibGUuIAotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6IEFsbG93IGZvciB0YXJnZXQgZGVwZW5kZW50Ci0JTVlfcHV0X3JlbG9jIG1hY3JvLiBBbGxvdyBmb3IgdGFyZ2V0IGRlcGVuZGVudCBzcGVjaWFsX2Z1bmN0aW9uMQotCXRvIGFwcGx5IHRoZSByZWxvY2F0aW9uLiAKLQotCSogYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogQWxsb3cgZm9yIHRhcmdldAotCWRlcGVuZGVudCBkZXRlcm1pbmF0aW9uIG9mIHJlbG9jIGhvd3RvLiBBbGxvdyBmb3IgdGFyZ2V0IGRlcGVuZGVudAotCXNwZWNpYWxfZnVuY3Rpb24xIHRvIGFwcGx5IHRoZSByZWxvY2F0aW9uLgotCi0JKiBhb3V0eC5oIChnZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBEZXRlY3QgYnNzIGFuZCByZXR1cm4gMC4KLQotCSogYW91dHguaCAoc2x1cnBfcmVsb2NfdGFibGUpOiBEZXRlY3QgYnNzIGFuZCBzdWNjZXNmdWxseSByZWFkCi0JemVybyByZWxvYyBlbnRyaWVzLgotCi0JKiBhb3V0eC5oIChtYWNoaW5lX3R5cGUpOiBBZGQgYmZkX2FyY2hfbnMzMmsgY2FzZS4KLQotCSogYW91dHguaDogU3RhdCB0byBkZXRlcm1pbmUgZXhlY3V0YWJsZSBzdGF0dXMgaWYgU1RBVF9GT1JfRVhFQwotCWlzIGRlZmluZWQgKG5vdCBqdXN0IE1BQ0gpLiBVc2UgZnN0YXQgaW5zdGVhZCBvZiBzdGF0IGFuZCBjaGVjawotCWZvciBmc3RhdCBlcnJvci4KLQotCSogYW91dHguaDogQWxsb3cgdGFyZ2V0IGRlcGVuZGVudCBzd2FwX3N0ZF9yZWxvY197aW4sb3V0fS4KLQotCSogYW91dHguaDogQWxsb3cgQ1RPUlMgcmVsb2MgaW5mbyB0byBiZSBpbiB0YXJnZXQgZGVwZW5kZW50IHJlbG9jCi0JdGFibGUuCi0KLQkqIGFvdXQtdGFyZ2V0Lmg6IEFwcGx5IFNXQVBfTUFHSUMgKGlmIGRlZmluZWQpIGFmdGVyCi0Jc3dhcF9leGVjX2hlYWRlcl9pbiwgb3RoZXJ3aXNlIHdlIGhhdmUgbWFnaWMgaW4gdGhlIHdyb25nIG9yZGVyLgotCi1UaHUgSnVsIDE0IDExOjQ3OjI3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29mZi1zcGFyYy5jIChzcGFyY2NvZmZfdmVjKTogSGF2ZSBsZWFkaW5nIHVuZGVyc2NvcmVzLgotCi1UdWUgSnVsIDEyIDEyOjA4OjEwIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogYWl4Mzg2LWNvcmUuYywgYW91dGYxLmgsIGNpc2NvLWNvcmUuYywgZWxmY29kZS5oLCBocHBhYnNkLWNvcmUuYywKLQlocHV4LWNvcmUuYywgaXJpeC1jb3JlLmMsIGx5bngtY29yZS5jLCBvc2YtY29yZS5jLCBwdHJhY2UtY29yZS5jLAotCXJzNjAwMC1jb3JlLmMsIHRyYWQtY29yZS5jOiAgUmVtb3ZlIFNFQ19BTExPQyBmbGFnIGZyb20gLnJlZwotCXNlY3Rpb25zLCAucmVnIHNlY3Rpb25zIGFyZSBub3QgYWxsb2NhdGVkIGFuZCBjb250YWluIGRlYnVnCi0JaW5mb3JtYXRpb24gb25seS4KLQkqIG9zZi1jb3JlLmMgKG1ha2VfYmZkX2FzZWN0aW9uLCBvc2ZfY29yZV9jb3JlX2ZpbGVfcCk6ICBVc2UKLQliZmRfbWFrZV9zZWN0aW9uX2FueXdheSBpbnN0ZWFkIG9mIGJ1aWxkaW5nIHVuaXF1ZSBzZWN0aW9uIG5hbWVzLgotCi1UdWUgSnVsIDEyIDExOjQxOjIyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGliZWxmLmggKGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbik6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc3dhcF9zeW1ib2xfaW4sIGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9vdXQpOiBEZWNsYXJlLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2FyZ3NfaGFzaF90YWJsZV9pbml0KTogQ29ycmVjdCBjYXN0LgotCi0JKiBhb3V0LWVuY2FwLmMgKEFSQ0gpOiBEb24ndCBkZWZpbmUuICBPYnNvbGV0ZS4KLQkqIGFvdXQwLmMsIGFvdXR4LmgsIGdlbi1hb3V0LmMsIGhwMzAwYnNkLmMsIGhwMzAwaHB1eC5jOiBMaWtld2lzZS4KLQkqIGkzODZhb3V0LmMsIGkzODZic2QuYywgaTM4NmR5bml4LmMsIGkzODZsaW51eC5jOiBMaWtld2lzZS4KLQkqIGkzODZseW54LmMsIG02OGtseW54LmMsIG1pcHNic2QuYywgbmV0YnNkMzg2LmM6IExpa2V3aXNlLgotCSogbmV3c29zMy5jLCBzcGFyY2x5bnguYywgc3Vub3MuYzogTGlrZXdpc2UuCi0KLU1vbiBKdWwgMTEgMjA6MDg6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKFNURF9TRUNUSU9OKTogTWFrZSB0aGUgc2l4dGggYXJndW1lbnQgYm9vbGVhbiwgbm90Ci0JdGhlIHNldmVudGguICBGcm9tIGdhcnlAdHV2YS5wYWNzZW1pLm96LmF1IChnYXJ5IGtvcGZmKS4KLQotU3VuIEp1bCAxMCAwOToxMjowMiAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGJmZF9mcmVlX2NhY2hlZF9pbmZvKTogQ2hhbmdlIG5hbWUgb2YgRlJFRSB0byBCRkNJX0ZSRUUKLQlpbiBvcmRlciBub3QgdG8gY29sbGlkZSB3aXRoIEx5bnhPUydzIGRlZmluaXRpb24gb2YgRlJFRSBpbgotCS91c3IvaW5jbHVkZS9zeXMvcHJvYy5oCi0KLVRodSBKdWwgIDcgMTQ6MTg6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG9uJ3QgY2xvYmJlciB0aGUgcmVsb2NhdGlvbgotCXZhbHVlIGZvciBjb2ZmLUludGVsLWxpdHRsZSBvciBjb2ZmLUludGVsLWJpZy4gIEhhY2sgdXBvbiBoYWNrLgotCi1UaHUgSnVsICA3IDEwOjEwOjM0IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogYW91dHguaCAoaG93dG9fdGFibGVfc3RkKTogIEFkZCBlbnRyeSBmb3IgR09UIHJlbG9jYXRpb25zCi0Jd2hpY2ggYXJlIHByZXNlbnQgaW4gc3VuMyBzaGFyZWQgbGlicmFyaWVzLCB0byBhdm9pZCBhc3NlcnRpb25zCi0Jd2hlbiByZWFkaW5nIHRoZSBkeW5hbWljIHJlbG9jYXRpb25zLgotCi1UaHUgSnVsICA3IDEwOjE5OjIwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uaCAoUl9IUFBBX0NPTVBMRVgpOiBGaXggZHVtYiB0eXBvLiAKLQotV2VkIEp1bCAgNiAxOToyMTo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N5c3Y0LmggKHFzb3J0LCBzdHJ0b2wpOiBEb24ndCBkZWNsYXJlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX291dHB1dF9zeW0pOiBEb24ndCBjYWxsIG91dHB1dF9zeW1ib2xfaG9vawotCWlmIGl0IGlzIE5VTEwuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IEFkZCBpZ25vcmVkIGluZm8KLQlhcmd1bWVudCB0byBjb3JyZXNwb25kIHRvIHJlY2VudCBsaWJlbGYuaCBjaGFuZ2UuCi0KLVdlZCBKdWwgIDYgMDA6NDg6NTcgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX21rb2JqZWN0X2hvb2spOiAgTmV3IGhvb2sgdG8KLQlhZGRpdGlvbmFsbHkgY29weSBvYmplY3QgdHlwZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhbHBoYSBmaWxlCi0JaGVhZGVyIHRvIHRoZSBCRkQgZmxhZ3MuCi0JKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6ICBVc2UgaXQuCi0JKGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyk6ICBBZGQgRFlOQU1JQyB0byBvYmplY3RfZmxhZ3MuCi0JKiBhb3V0NjQuYzogIEZpeCB0eXBvIGluIGNvbmRpdGlvbmFsIFFNQUdJQyBkZWZpbml0aW9uLgotCi1XZWQgSnVsICA2IDAwOjEzOjE3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhYnNkLWNvcmUuYyAoaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9wKTogU2FuaXR5IGNoZWNrIHRoZQotCXZhbHVlIG9mIGNsaWNrc3ogdG8gaGVscCB3ZWVkIG91dCBub24gSFBQQSBCU0QgY29yZSBmaWxlcy4KLQotVHVlIEp1bCAgNSAxMzoyNjowMiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQlNYWNoIDMgc3VwcG9ydC4KLQkqIGNvbmZpZy5iZmQgKG04OCotKi1tYWNoMyosIG1pcHMqLWRlYy1tYWNoMyosIG1pcHMqLSotbWFjaDMqKToKLQlOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0XTg2LSotbWFjaDMqLCBuczMyay0qLW1hY2gzKik6IFJlY29nbml6ZQotCSJtYWNoMyIgaW5zdGVhZCBvZiAibWFjaCIuCi0JKG04OCotKi1tYWNoMyosIG1pcHMqLWRlYy1tYWNoMyosIG1pcHMqLSotbWFjaDMqKTogTmV3IGhvc3RzLgotCSogdGFyZ2V0cy5jIChtODhrbWFjaDNfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGkzODZtYWNoM192ZWMgYW5kIG04OGttYWNoM192ZWMsIGJ1dAotCWluc2lkZSAjaWYgMC4KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCkgW01BQ0hdOiBSZWNvZ25pemUgZXhlY3V0YWJsZXMgYnkKLQljaGVja2luZyBmb3IgZXhlY3V0ZSBwZXJtaXNzaW9uLCBpbnN0ZWFkIG9mIGxvb2tpbmcgYXQgZW50cnkKLQlwb2ludC4KLQkqIGkzODZtYWNoMy5jOiBVcGRhdGUsIGRlZmluZSBNQUNILCBOX1RYVE9GRiwgTl9UWFRBRERSLAotCU5fU0hBUkVEX0xJQiwgZG9uJ3QgaW5jbHVkZSBhb3V0LyouaCBmaWxlcywgZXRjLgotCSogbTg4a21hY2gzLmM6IE5ldyBmaWxlLCBtODhrIE1hY2ggMyB0YXJnZXQuCi0JKiBjb25maWcvbTg4ay1tYWNoMy5tdCwJY29uZmlnL21pcHMtbWFjaDMubXQ6IE5ldyBmaWxlcywgdGFyZ2V0Ci0JbWFrZWZpbGUgZnJhZ21lbnRzLgotCSogY29uZmlnL2kzODZtYWNoMy5taCwgY29uZmlnL204OGttYWNoMy5taCwgY29uZmlnL21pcHNtYWNoMy5taDoKLQlOZXcgZmlsZXMsIGhvc3QJbWFrZWZpbGUgZnJhZ21lbnRzLgotCSogaG9zdHMvbTg4a21hY2gzLmgsIGhvc3RzL21pcHNtYWNoMy5oOiBOZXcgZmlsZXMsIGhvc3QgZGVmaW5pdGlvbnMuCi0KLVR1ZSBKdWwgIDUgMTM6NTY6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKHN3YXBfb3V0X3N5bXMpOiBHZXQgYWxpZ25tZW50IG9mIGNvbW1vbiBzeW1ib2wgZnJvbQotCXN0X3ZhbHVlIGZpZWxkIG9mIHNhdmVkIEVMRiBzeW1ib2wgaW5mb3JtYXRpb24sIGlmIHRoZXJlIGlzIGFueS4KLQotTW9uIEp1bCAgNCAxOToxMzozMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmggKFJfSFBQQV9DT01QTEVYKTogRGVmaW5lLgotCSogZWxmMzItaHBwYS5oIChSX0hQUEFfQ09NUExFWCk6IERlZmluZS4KLQkoZWxmMzJfaHBwYV9yZWxvY190eXBlKTogRGVsZXRlIFJfUEFSSVNDX1NUVUJfQ0FMTF8xNy4KLQotRnJpIEp1bCAgMSAxMjowNzo0MSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogU3VwcG9ydCBjb2RlIGZvciBlbmFibGluZyB0aGUgbmV3IHN0eWxlIGxpbmtlciBmb3IgUEEgRUxGLgotCSogZWxmY29kZS5oIChzd2FwX3N5bWJvbF9pbiwgc3dhcF9zeW1ib2xfb3V0KTogRXh0ZXJuYWxpemUuCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBQYXNzIGxpbmtfaW5mbyB0bwotCXRoZSBiZWdpbl93cml0ZV9wcm9jZXNzaW5nIGhvb2suCi0JKGJmZF9lbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUGFzcyBOVUxMIGZvciBuZXcgbGlua19pbmZvCi0JYXJndW1lbnQgdG8gZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBob29rLgotCShlbGZfbGlua19vdXRwdXRfc3ltKTogQWNjZXB0IG5ldyAiaW5wdXRfc2VjdGlvbiIgYXJndW1lbnQgZm9yCi0JdGhlIHN5bWJvbHMncyBpbnB1dCBzZWN0aW9uLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4gIENhbGwgdGhlCi0JbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgaWYgaXQncyBkZWZpbmVkLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBDYWxsIHRoZSBmaW5hbF93cml0ZV9wcm9jZXNzaW5nIGhvb2sgaWYKLQlpdCdzIGRlZmluZWQuCi0JKiBsaWJlbGYuaCAoZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBEZWNsYXJlLgotCShlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKTogQWRkIG5ldyAiaW5mbyIgYXJndW1lbnQuCi0JKGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXRhcmdldC5oIChlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IFByb3ZpZGUKLQlhIGRlZmF1bHQgZGVmaW5pdGlvbi4KLQkoZWxmMzJfYmVkKTogQWRkIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rLgotCSogZWxmNjQtdGFyZ2V0Lmg6IExpa2V3aXNlLgotCQotCSogTWFqb3IgcmV3b3JrIG9mIHRoZSBQQSBFTEYgY29kZS4gIFVzZXMgdGhlIG5ldyBzdHlsZSBCRkQKLQlsaW5rZXIsIG1ham9yIGNsZWFudXBzLgotCSogaHBwYV9zdHVicy5oOiBSZXdyaXRlIGZyb20gc2NyYXRjaC4gIE11Y2ggc21hbGxlciBhbmQgc2ltcGxlci4KLQkqIGVsZjMyLWhwcGEuaDogRGVsZXRlIGFsbCBzeW1ib2wgZXh0ZW5zaW9uIHJlbGF0ZWQgY29kZS4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogRGVsZXRlIGRlY2wuCi0JKGVsZjMyX2hwcGFfc2l6ZV9zdHVicywgZWxmMzJfaHBwYV9idWlsZF9zdHVicyk6IE5ldyBkZWNscy4KLQkqIGVsZjMyLWhwcGEuYzogU3ltYm9sIGV4dGVuc2lvbiBzdHVmZiBtb3ZlZCBmb3JtIGVsZjMyLWhwcGEuaAotCWludG8gZWxmMzItaHBwYS5jLiAgRG8gbm90IGluY2x1ZGUgYW91dDY0LmguCi0JKHR5cGRlZiBocHBhX3N0dWJfdHlwZSk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9zdHViX25hbWVfbGlzdF9zdHJ1Y3QpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfc3R1Yl9kZXNjcmlwdGlvbl9zdHJ1Y3QpOiBEZWxldGUuCi0JKGFyZ19yZWxvY190eXBlKTogVXNlIHNpbXBsZXIgZW51bWVyYXRpb25zLiAgQWxsIHJlZmVyZW5jZXMgY2hhbmdlZC4KLQkoYXJnX2xvY2F0aW9uLCBhcmdfcmVsb2NfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCShlbGYzMl9ocHBhX3N5bWV4dG5fbWFwX3N0cnVjdCk6IERlbGV0ZS4KLQkoZ2V0X3N5bWJvbF92YWx1ZSk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9nZXRfc3ltX2V4dG4pOiBEZWxldGUuCi0JKGZpbmRfc3R1YnMsIG5ld19zdHVicywgdHlwZV9vZl9taXNtYXRjaCk6IERlbGV0ZS4KLQkoZmluZF9zdHViX2J5X25hbWUsIGFkZF9zdHViX2J5X25hbWUpOiBEZWxldGUuCi0JKGhwcGFfZWxmX3N0dWJfZmluaXNoLCBocHBhX2VsZl9zdHViX3JlbG9jKTogRGVsZXRlLgotCShocHBhX2VsZl9hcmdfcmVsb2NfbmVlZGVkKTogUmVuYW1lZC4gIFNpbXBsaWZ5LgotCShocHBhX2VsZl9idWlsZF9saW5rZXJfc3R1YiwgaHBwYV9lbGZfY3JlYXRlX3N0dWJfc2VjKTogRGVsZXRlLgotCShocHBhX2VsZl9sb25nX2JyYW5jaF9uZWVkZWRfcCk6IERlbGV0ZS4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogRGVsZXRlLgotCShocHBhX2VsZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9mYWtlX3NlY3Rpb25zKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogRGVsZXRlLgotCShORVdfSU5TVFJVQ1RJT04pOiBEZWxldGUuCi0JKENVUlJFTlRfU1RVQl9PRkZTRVQpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9zaXplX3N5bWV4dCk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX2FkZF9zeW1ib2xfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9uYW1lX29mX3N0dWIpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfc2l6ZV9vZl9zdHViKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX2J1aWxkX29uZV9zdWIpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfYnVpbGRfc3R1YnMpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfc2l6ZV9zdHVicyk6IE5ldyBmdW5jdGlvbi4KLQkobGlua2VyLCBzdHViIGFuZCBhcmd1bWVudCBoYXNoIHRhYmxlcyk6IEFkZCBhcHByb3ByaWF0ZQotCXN0cnVjdHVyZXMsIGRlZmluaXRpb25zIGFuZCBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IGFsbCB0aHJlZQotCWhhc2ggdGFibGVzLgotCShocHBhX2VsZl9yZWxvY2F0ZV9pbnNuKTogRG9uJ3QgbmVlZCBhcmd1bWVudCBsb2NhdGlvbiBpbmZvcm1hdGlvbgotCWluIHRoaXMgZnVuY3Rpb24uCi0JKGFkZF9lbnRyeV90b19zeW1leHRfY2hhaW4pOiBBY2NlcHQgYSBzeW1ib2wncyBhcmd1bWVudCBsb2NhdGlvbgotCWluZm9ybWF0aW9uIHJhdGhlciB0aGFuIHRoZSBzeW1ib2wgaXRzZWxmLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBTaW1wbGlmeS4KLQkoaHBwYV9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTdHViIHNlY3Rpb24gaXMgbm8gbG9uZ2VyIHNwZWNpYWwuCi0JKGhwcGFfZWxmX3JlbG9jKTogR3JlYXRseSBzaW1wbGlmeS4KLQkoZWxmMzJfaHBwYV9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKTogQWNjZXB0IGxpbmtfaW5mbyBhcmd1bWVudC4KLQlIYW5kbGUgYmVpbmcgY2FsbGVkIGZyb20gdGhlIEJGRCBiYWNrZW5kIGxpbmtlci4KLQkoZWxmMzJfaHBwYV9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0JKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBObyBsb25nZXIgY2FsbCBzdHViX2ZpbmlzaC4KLQkKLU1vbiBKdW4gMjcgMTg6MDc6MDYgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogUHV0IGluIHBhcmVucyB0byBnZXQKLQlwcmVjZWRlbmNlIHJpZ2h0LgotCi1TdW4gSnVuIDI2IDE4OjA4OjI5IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBsaWJlbGYuaCAocmVsb2NhdGVfc2VjdGlvbik6IE5ldyBhcmd1bWVudCAib3V0cHV0X25hbWVzIiBhZGRlZAotCXRvIHByb3RvdHlwZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogTmV3IGFyZ3VtZW50ICJvdXRwdXRfbmFtZXMiCi0JYWRkZWQgdG8gcHJvdG90eXBlIG9mIHJlbG9jYXRlX3NlY3Rpb24uICBQYXNzIHRoZSBvdXRwdXQgc3ltYm9sCi0JbmFtZXMgdG8gcmVsb2NhdGVfc2VjdGlvbi4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFVzZSAib3V0cHV0X25hbWVzIiB0bwotCWRldGVybWluZSB0aGUgbmFtZSBvZiBhIGxvY2FsIHN5bWJvbC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi1GcmkgSnVuIDI0IDA4OjE1OjQyIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCUFkZCBTb2xhcmlzIEJDUCAodGhlIHBhcnQgb2YgU29sYXJpcyB3aGljaCBhbGxvd3MgaXQgdG8gcnVuCi0JU3VuT1M0IGEub3V0IGZpbGVzKSBjb3JlIGZpbGUgaGFuZGxpbmcuCi0JKiBhb3V0ZjEuaCAoZXh0ZXJuYWxfc29sYXJpc19iY3BfY29yZSwgc3dhcGNvcmVfc29sYXJpc19iY3ApOgotCU5ldyBzdHJ1Y3R1cmUgYW5kIGl0cyBzd2FwIGluIGZ1bmN0aW9uLgotCShpbnRlcm5hbF9zdW5vc19jb3JlKTogIE5ldyBtZW1iZXIgY19kYXRhX2FkZHIsIHRvIHJlY2VpdmUgdGhlCi0Jc3RhcnQgYWRkcmVzcyBvZiB0aGUgZGF0YSBzZWN0aW9uIGluIHRoZSBjb3JlIGZpbGUuCi0JKHN3YXBjb3JlX3N1bjMsIHN3YXBjb3JlX3NwYXJjLCBzdW5vczRfY29yZV9maWxlX3ApOiAgVXNlIGl0LgotCShzdW5vczRfY29yZV9maWxlX3ApOiAgUmVjb2duaXplIFNvbGFyaXMgQkNQIGNvcmUgZmlsZS4KLQkoc3Vub3M0X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6ICBBbHdheXMgaW5kaWNhdGUgbWF0Y2gKLQlmb3IgU29sYXJpcyBCQ1AgY29yZSBmaWxlcy4KLQotVGh1IEp1biAyMyAxNTozMToyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQlQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIHNoYXJlZCBsaWJyYXJpZXMsIGZyb20gRXJpYwotCVlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0JKiBlbGZjb2RlLmggKHByZXBfaGVhZGVycyk6IElmIERZTkFNSUMsIHNldCBlX3R5cGUgdG8gRVRfRFlOLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksCi0JY3JlYXRlIGR5bmFtaWMgc2VjdGlvbnMgZm9yIGZpcnN0IGlucHV0IEJGRCB3aXRoIHRoZSByaWdodCBmb3JtYXQuCi0JKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgY3JlYXRlIC5pbnRlcnAgc2VjdGlvbgotCWlmIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IFNraXAgZHluYW1pYyBzZWN0aW9ucyBpbiBpbnB1dCBmaWxlLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBJZiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBpdCdzIE9LIGZvcgotCWR5bm9iaiB0byBoYXZlIHNlY3Rpb25zIHdoaWNoIGFyZSBub3QgU0VDX0lOX01FTU9SWS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogT25seSBzZXQgLmludGVycAotCXNlY3Rpb24gaWYgbm90IGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogRG9uJ3Qgc2V0IERZTkFNSUMganVzdCBiZWNhdXNlIHRoZXJlCi0JaXMgYW4gU0hUX0RZTkFNSUMgc2VjdGlvbi4KLQotCSogY2YtaTM4Nmx5bnguYyAoaTM4NmNvZmZfdmVjKTogRG9uJ3QgaW5jbHVkZSBEWU5BTUlDIGluCi0Jb2JqZWN0X2ZsYWdzLgotCSogY29mZi1zcGFyYy5jIChzcGFyY2NvZmZfdmVjKTogTGlrZXdpc2UuCi0JKiBocHBhYnNkLWNvcmUuYyAoaHBwYWJzZF9jb3JlX3ZlYyk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IERvbid0IHNldCBTRUNfUkVMT0MKLQlqdXN0IGJlY2F1c2UgRFlOQU1JQyBpcyBzZXQuCi0KLVRodSBKdW4gMjMgMTI6NTM6NDEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSAtLXdpdGgtdGFyZ2V0cyB0byAtLWVuYWJsZS10YXJnZXRzIGFuZAotCS0td2l0aC02NC1iaXQtYmZkIHRvIC0tZW5hYmxlLTY0LWJpdC1iZmQuCi0JKiBNYWtlZmlsZS5pbiwgbXB3LW1ha2UuaW4sIHRhcmdldHMuYzogQ2hhbmdlIGNvbW1lbnRzLgotCi1XZWQgSnVuIDIyIDE3OjU5OjU5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGMtKi1lbGYqKTogTmV3IHRhcmdldCwganVzdCBsaWtlCi0JcG93ZXJwYy0qLXN5c3Y0Ki4KLQotCSogbGlua2VyLmMgKEZBSUwpOiBVbmRlZmluZSBtYWNybyBiZWZvcmUgZGVmaW5pbmcgYXMgZW51bS4KLQotV2VkIEp1biAyMiAxMDo1Mjo0NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogSW5pdGlhbGl6ZQotCXBhc3MgZnJvbSBhYmZkLT5hcmNoaXZlX3Bhc3MsIGFuZCBzYXZlIGl0IHRoZXJlIGFzIHdlbGwuCi0KLQkqIGhhc2guYyAoYmZkX2hhc2hfYWxsb2NhdGUpOiBEb24ndCBjYWxsIGJmZF9zZXRfZXJyb3IgaWYKLQlvYnN0YWNrX2FsbG9jIHJldHVybnMgTlVMTCB1bmxlc3MgdGhlIHNpemUgaXMgbm9uLXplcm8uCi0KLQkqIGxpbmtlci5jIChhcmNoaXZlX2hhc2hfYWxsb2NhdGUpOiBEZWZpbmUuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBVc2UgYXJjaGl2ZV9oYXNoX2FsbG9jYXRlCi0JcmF0aGVyIHRoYW4gb2JzdGFja19hbGxvYywgZm9yIGNsYXJpdHkuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IENvcnJlY3QuCi0KLQkqIGFvdXQ2NC5jIChCTUFHSUMsIFFNQUdJQyk6IERlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLiAgRnJvbQotCVBldGVyIFNjaGF1ZXIgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPi4KLQotCUxpbnV4IFpNQUdJQyBzdXBwb3J0IGZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiBBZGQgZmllbGQgem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZS4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGNhbGxiYWNrKSk6IE9ubHkgc2V0IGFsaWdubWVudCBhY2NvcmRpbmcgdG8KLQlhcmNoaXRlY3R1cmUgaWYgdGhlIHNlY3Rpb24gc2l6ZXMgYXJlIGFsaWduZWQgdG8gdGhhdCBhbGlnbm1lbnQsCi0JZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi0JKE1ZKHNldF9zaXplcykpOiBJbml0aWFsaXplIHptYWdpY19kaXNrX2Jsb2NrX3NpemUgZmllbGQuCi0JKiBhb3V0eC5oIChhZGp1c3Rfel9tYWdpYyk6IFNldCB6dGloIGlmIHVzaW5nIHFfbWFnaWNfZm9ybWF0LiAgU2V0Ci0JdGV4dCBzZWN0aW9uIGZpbGVwb3MgdG8gem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSBpZiBub3QgenRpaC4gIFVzZSBhCi0JZGlmZmVyZW50IHBhZGRpbmcgYWxnb3JpdGhtIGlmIG5vdCB6dGloLgotCSogaTM4NmxpbnV4LmMgKE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyKTogRG9uJ3QgZGVmaW5lLgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IEp1c3Qgc2tpcCBOX1NUQUIgYW5kIE5fRk4KLSAgICAgICAgc3ltYm9sczsgZG9uJ3QgbG9vayB0aGVtIHVwIGluIHRoZSBoYXNoIHRhYmxlLiAgRnJvbQotICAgICAgICByYWxwaGNAcHlyYW1pZC5jb20gKFJhbHBoIENhbXBiZWxsKS4KLQotVHVlIEp1biAyMSAxMTo0NzoyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtZ28zMi5jIChnbzMyY29mZl9hcmNoaXZlX3ApOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9uLgotCi0JKiBzZWN0aW9uLmMgKGJmZF9hYnNfc2VjdGlvbik6IE1ha2UgY29uc3QuCi0JKGJmZF9hYnNfc2VjdGlvbl9wdHIsIGJmZF9pc19hYnNfc2VjdGlvbik6IERlZmluZS4KLQkoYmZkX3VuZF9zZWN0aW9uKTogTWFrZSBjb25zdC4KLQkoYmZkX3VuZF9zZWN0aW9uX3B0ciwgYmZkX2lzX3VuZF9zZWN0aW9uKTogRGVmaW5lLgotCShiZmRfY29tX3NlY3Rpb24pOiBNYWtlIGNvbnN0LgotCShiZmRfY29tX3NlY3Rpb25fcHRyKTogRGVmaW5lLgotCShiZmRfaW5kX3NlY3Rpb24pOiBNYWtlIGNvbnN0LgotCShiZmRfaW5kX3NlY3Rpb25fcHRyLCBiZmRfaXNfaW5kX3NlY3Rpb24pOiBEZWZpbmUuCi0JKGJmZF9hYnNfc3ltYm9sLCBiZmRfY29tX3N5bWJvbCk6IE1ha2UgY29uc3QuCi0JKGJmZF91bmRfc3ltYm9sLCBiZmRfaW5kX3N5bWJvbCk6IExpa2V3aXNlLgotCShnbG9iYWxfc3ltcyk6IENhc3QgaW5pdGlhbGl6YXRpb24gb2Ygc2VjdGlvbiBmaWVsZC4KLQkoU1REX1NFQ1RJT04pOiBEZWZpbmUgYXMgY29uc3QsIGFuZCBjYXN0IGluaXRpYWxpemF0aW9ucy4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIE1hbnkgZmlsZXM6IENoYW5nZSB1c2VzIG9mIGJmZF9hYnNfc2VjdGlvbiwgZXRjLiwgdG8gdXNlCi0JYmZkX2Fic19zZWN0aW9uX3B0ciBvciBiZmRfaXNfYWJzX3NlY3Rpb24sIGV0Yy4KLQotTW9uIEp1biAyMCAxMTowNjoyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIE1hbnkgZmlsZXM6IGNoYW5nZSBhbGwgYmZkX3RhcmdldCB2ZWN0b3JzIHRvIGJlIGNvbnN0LiAgQ2hhbmdlCi0JYWxsIHVzZXMgb2YgYmZkX3RhcmdldCAqIHRvIGJlIGNvbnN0IGJmZF90YXJnZXQgKi4gIENoYW5nZQotCWJmZF90YXJnZXRfdmVjdG9yIGFuZCBiZmRfZGVmYXVsdF92ZWN0b3IgYXJyYXlzIHRvIGJlIGNvbnN0Ci0JYmZkX3RhcmdldCAqIGNvbnN0ICouCi0KLQkqIGVjb2ZmLmMsIGxpYmVjb2ZmLmgsIGVjb2Zmc3dhcC5oLCBjb2ZmLWFscGhhLmMsIGNvZmYtbWlwcy5jLAotCWVsZjMyLW1pcHMuYzogUmVuYW1lZCBhbGwgZXh0ZXJuYWxseSB2aXNpYmxlIEVDT0ZGIHJvdXRpbmVzIHdoaWNoCi0JYXJlIGxvY2FsIHRvIEJGRCB0byBzdGFydCB3aXRoIF9iZmRfZWNvZmYgaW5zdGVhZCBvZiBqdXN0IGVjb2ZmLgotCi0JKiBlY29mZi5jIChlY29mZl9zd2FwX3Rpcl9pbik6IENoYW5nZSBpbnB1dCBhcmd1bWVudCB0byBjb25zdC4KLQkoZWNvZmZfc3dhcF90aXJfb3V0KTogTGlrZXdpc2UuCi0JKGVjb2ZmX3N3YXBfcm5keF9pbiwgZWNvZmZfc3dhcF9ybmR4X291dCk6IExpa2V3aXNlLgotCShlY29mZl9zbHVycF9zeW1ib2xpY19pbmZvKTogQWRkIG5ldyBhcmd1bWVudHMgdG8gY29ycmVzcG9uZCB0bwotCXJlYWRfZGVidWdfaW5mbyBlbnRyeSBwb2ludCBpbiBlY29mZl9kZWJ1Z19zd2FwIHN0cnVjdHVyZS4KLQlDaGFuZ2UgYWxsIGNhbGxzLgotCSogbGliZWNvZmYuaCAoZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6IENoYW5nZSBkZWNsYXJhdGlvbi4KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX3Rpcl9pbiwgZWNvZmZfc3dhcF90aXJfb3V0KTogRGVjbGFyZS4KLQkoZWNvZmZfc3dhcF9ybmR4X2luLCBlY29mZl9zd2FwX3JuZHhfb3V0KTogRGVjbGFyZS4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcKLQllY29mZl9kZWJ1Z19zd2FwIGZpZWxkcy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBVbmRlZmluZSBSRUFELgotCShtaXBzX2VsZl9lY29mZl9kZWJ1Z19zd2FwKTogSW5pdGlhbGl6ZSBuZXcgZWNvZmZfZGVidWdfc3dhcAotCWZpZWxkcy4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX2JpZ21pcHNfdmVjKTogVXNlIGVjb2ZmLm8gYW5kCi0JZWNvZmZsaW5rLm8uCi0JKGJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyk6IExpa2V3aXNlLgotCShlY29mZl9iaWdfdmVjLCBlY29mZl9saXR0bGVfdmVjKTogTGlrZXdpc2UuCi0JKGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogUmVtb3ZlIGVjb2ZmLm8gYW5kIGVjb2ZmbGluay5vLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBlY29mZi5vIGFuZCBlY29mZmxpbmsuby4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogQ2hlY2sgZmxhdm91ciBvZiBzdWIsIG5vdCBhYmZkLAotCXdoZW4gY29tcHV0aW5nIHJlbG9jIHNpemVzLiAgRnJvbSBFcmljIFlvdW5nZGFsZQotCTxlcmljeUBjYWlzLmNhaXMuY29tPi4KLQkqIGVsZmNvZGUuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogRG9uJ3QgdHJ5IHRvIGNvbXB1dGUgbWF4aW11bQotCXJlbG9jIGNvdW50IG9yIHNpemUgZm9yIGEgbm9uLUVMRiBmaWxlLgotCi0JKiBtaXBzYnNkLmMgKE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOiBEZWZpbmUgdG8gYXZvaWQgd2FybmluZy4KLQotCSogaHAzMDBocHV4LmMgKE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOiBEZWZpbmUgdG8gYXZvaWQgd2FybmluZy4KLQkoQk1BR0lDLCBRTUFHSUMpOiBEZWZpbmU7IHVzZWQgYnkgYW91dHguaC4KLQkoTVkoc2x1cnBfc3ltYm9sX3RhYmxlKSk6IENoYW5nZSB0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzCi0JY2FsbHMgdG8gdXNlIG5ldyBwYXJhbWV0ZXJzLgotCi1GcmkgSnVuIDE3IDE0OjQ1OjMyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCAoTVkoY2FsbGJhY2spKTogU2V0IHRoZSBhbGlnbm1lbnRzIG9mIHRoZSB0ZXh0LAotCWRhdGEgYW5kIGJzcyBzZWN0aW9ucyBhZnRlciBkZXRlcm1pbmluZyB0aGUgYXJjaGl0ZWN0dXJlLgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IFRyZWF0IGEgY29tbW9uIHN5bWJvbCBmcm9tIGEKLQlkeW5hbWljIG9iamVjdCBhcyBiZWluZyBpbiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBvYmplY3QsIHJhdGhlcgotCXRoYW4gYXMgYmVpbmcgdW5kZWZpbmVkLgotCi1GcmkgSnVuIDE3IDExOjE2OjUwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBsaWJocHBhLmggKGJmZF9ocHBhX2luc24yZm10LCBocHBhX3JlYnVpbGRfaW5zbik6IE1ha2UgSU5MSU5FLgotCi0JKiBlbGYzMi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcpOiBEZWxldGUgZGVjbC4KLQotVGh1IEp1biAxNiAyMzozNjoyMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmY29kZS5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBEb24ndCB0cnkgdG8gcmVhZCBsb2NhbCBzeW1ib2xzCi0JaWYgdGhlcmUgYXJlbid0IGFueSBpbiB0aGUgaW5wdXQgZmlsZS4KLQotVGh1IEp1biAxNiAxNDoyNToyMiAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGkzODZsaW51eC5jOiBNYW55IG5ldyBmdW5jdGlvbnMgYW5kIGRlZmluaXRpb25zIGZvciBsaW5rZXIKLQlzdXBwb3J0IGZvciBMaW51eCBzaGFyZWQgbGlicmFyaWVzLgotCSogYmZkLWluLmggKGJmZF9saW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1UaHUgSnVuIDE2IDE0OjIzOjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogSWYgc2Vjb25kIGFyZ3VtZW50IGlzIGBgXycnLCB0aGVuLCBpbnN0ZWFkIG9mCi0JZWNob2luZyBjb25maWcgZmlsZSBuYW1lLCBlY2hvIHdoZXRoZXIgdGFyZ2V0IHVzZXMgbGVhZGluZwotCXVuZGVyc2NvcmVzIG9uIHN5bWJvbCBuYW1lcy4gIEFkZCBhcHByb3ByaWF0ZSBzZXR0aW5ncyB0bwotCWRpZmZlcmVudCBjYXNlcy4gIFVzZWQgYnkgYmludXRpbHMvY29uZmlndXJlLmluIHRvIHNldCBkZWZhdWx0IGZvcgotCWMrK2ZpbHQuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogSWYgdHJ5aW5nIHRvIGdlbmVyYXRlIGEgc2hhcmVkCi0Jb2JqZWN0LCB3YXJuIGFuZCByZXR1cm4gZmFsc2UuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogQWNjZXB0IEJNQUdJQyBvYmplY3RzCi0JYW5kIHRyZWF0IHRoZW0gYXMgT01BR0lDLgotCi1XZWQgSnVuIDE1IDE4OjAyOjIxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQlFbmFibGUgc3BhcmMgdjkgc3VwcG9ydCBmb3IgcmVsZWFzZS4gIE5vdGUgdGhhdCB0aGlzIGlzIHN0aWxsIGEKLQl3b3JrIGluIHByb2dyZXNzLCBwZW5kaW5nIHJlbGVhc2Ugb2YgYW4gQUJJIHNwZWNpZmljYXRpb24uCi0JKiBjb25maWcuYmZkLCBjb25maWd1cmUuaW46IEluY2x1ZGUgc3BhcmMgdjkgZWxmIGNvbmZpZy4KLQkqIGVsZmNvZGUuaCAocHJlcF9oZWFkZXJzKTogSGFuZGxlIHNwYXJjIHY5ICg2NCBiaXQpLgotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfcmVhbCk6IE5ldyByZWxvYyB0eXBlcy4KLQkqIGVsZjY0LXNwYXJjLmM6IEltcGxlbWVudCBlbGY2NC1zcGFyYyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbiwgdGFyZ2V0cy5jOiBVcGRhdGVkLgotCi1XZWQgSnVuIDE1IDAxOjM0OjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogTmV3IGZpZWxkIGR0X25lZWRlZF9uYW1lLgotCShlbGZfZHRfbmVlZGVkX25hbWUpOiBOZXcgYWNjZXNzb3IgbWFjcm8uCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGVsZl9kdF9uZWVkZWRfbmFtZQotCWlzIHNldCwgdXNlIHRoYXQgaW5zdGVhZCBvZiB0aGUgZmlsZW5hbWUgZm9yIHRoZSBEVF9ORUVERUQgZHluYW1pYwotCWVudHJ5LgotCSogZWxmLmMgKGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IEFkZCBzaW50ZXJwcHRyCi0JYXJndW1lbnQsIGFuZCBzZXQgaXQgdG8gdGhlIC5pbnRlcnAgc2VjdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIHByb3RvdHlwZS4KLQkoYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBjb2ZmLXNwYXJjLmMgKFNXQVBfT1VUX1JFTE9DX0VYVFJBKTogRGVmaW5lIHRvIGNsZWFyIHRoZSByX3NwYXJlCi0JZmllbGQgb2YgdGhlIHJlbG9jIHJhdGhlciB0aGFuIGxldHRpbmcgaXQgYmUgZ2FyYmFnZS4KLQotCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfYXJtYXApOiBSZWNvZ25pemUgX18uU1lNREVGLyBhcyB3ZWxsIGFzCi0JX18uU1lNREVGOyB0aGUgZm9ybWVyIHdhcyB1c2VkIGluIG9sZCBMaW51eCBhcmNoaXZlcy4gIEZyb20KLQlqcnNAd29ybGQuc3RkLmNvbSAoUmljayBTbGFka2V5KS4KLQotCSogaTM4NmxpbnV4LmMgKGkzODZsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMpOiBEZWZpbmU7IGxpa2UKLQlNWSh3cml0ZV9vYmplY3RfY29udGVudHMpIGluIGFvdXQtdGFyZ2V0LmgsIGJ1dCBzZXQgTUFDSFRZUEUgdG8KLQlNXzM4Ni4gIEZyb20ganJzQHdvcmxkLnN0ZC5jb20gKFJpY2sgU2xhZGtleSkuCi0JKE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERlZmluZS4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IFRyZWF0IE5fU0VUViBzeW1ib2xzCi0JYXMgTl9EQVRBIHN5bWJvbHMuCi0JKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oOiBSZXdyaXRlIHN5bWJvbCBkdXBsaWNhdGUgZWxpbWluYXRpb24gdG8gdXNlIEJGRCBoYXNoCi0JdGFibGVzLgotCShzdHJ1Y3Qgc3RyaW5ndGFiX2VudHJ5LCBzdHJ1Y3Qgc3RyaW5ndGFiX2RhdGEpOiBSZW1vdmUuCi0JKEhBU0hNQVhMRU4sIEhBU0hfQ0hBUiwgaGFzaCwgY29tcGFyZSwgbG9nMiwgZW1pdF9zdHJ0YWIpOiBSZW1vdmUuCi0JKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSwgc3RydWN0IHN0cnRhYl9oYXNoKTogRGVmaW5lLgotCShzdHJ0YWJfaGFzaF9uZXdmdW5jLCBzdHJ0YWJfaGFzaF9sb29rdXApOiBEZWZpbmUuCi0JKHN0cmluZ3RhYl9mcmVlLCBlbWl0X3N0cmluZ3RhYik6IERlZmluZS4KLQkoc3RyaW5ndGFiX2luaXQsIGFkZF90b19zdHJpbmd0YWIpOiBSZXdyaXRlLgotCShOQU1FKGFvdXQsd3JpdGVfc3ltcykpOiBVc2UgbmV3IHN0cmluZ3RhYiBjb2RlLgotCShzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8sIE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scywgYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBiZmQtaW4uaCAoQkZEX1RSQURJVElPTkFMX0ZPUk1BVCk6IERlZmluZSBuZXcgQkZEIGZsYWcgdG8KLQlyZXF1ZXN0IEJGRCB0byB3cml0ZSBvYmplY3QgaW4gdGhlIHRyYWRpdGlvbmFsIGZvcm1hdCwgd2hhdGV2ZXIKLQl0aGF0IG1lYW5zIGZvciB0aGUgcGFydGljdWxhciBiYWNrZW5kLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBoYXNoLmMgKGJmZF9oYXNoX2FsbG9jYXRlKTogSWYgb2JzdGFja19hbGxvYyBmYWlscywgc2V0Ci0JYmZkX2Vycm9yX25vX21lbW9yeS4KLQotVHVlIEp1biAxNCAxMzowMDowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogQWRkIHFfbWFnaWNfZm9ybWF0IHRvIHN1YmZvcm1hdAotCWVudW0uCi0JKiBhb3V0LXRhcmdldC5oIChNWV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lIGFzIGZ1bmN0aW9uCi0JaWYgbm90IGFscmVhZHkgZGVmaW5lZC4gIENvcHkgc3ViZm9ybWF0IGluZm9ybWF0aW9uLgotCShNWV90ZXh0X2luY2x1ZGVzX2hlYWRlcik6IERlZmluZSBhcyAwIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKE1ZKGJhY2tlbmRfZGF0YSkpOiBVc2UgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIgcmF0aGVyIHRoYW4gMC4KLQkoTVlfZmluYWxfbGlua19jYWxsYmFjayk6IFJlbmFtZSBmcm9tIGZpbmFsX2xpbmtfY2FsbGJhY2ssIGFuZAotCWRlZmluZSBvbmx5IGlmIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sgaXMgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkoTVlfYmZkX2ZpbmFsX2xpbmspOiBSZW5hbWUgdXNlIG9mIGZpbmFsX2xpbmtfY2FsbGJhY2sgdG8KLQlNWV9maW5hbF9saW5rX2NhbGxiYWNrLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBIYW5kbGUgUU1BR0lDIGxpa2UKLQlaTUFHSUMsIGJ1dCBzZXQgdGhlIHN1YmZvcm1hdCB0byBxX21hZ2ljX2Zvcm1hdC4gIEFib3J0IGlmIHRoZQotCW1hZ2ljIG51bWJlciBpZiBub3QgcmVjb2duaXplZC4KLQkoYWRqdXN0X3pfbWFnaWMpOiBVc2UgUU1BR0lDIGlmIHFfbWFnaWNfZm9ybWF0LgotCSogaTM4NmxpbnV4LmMgKE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyKTogRGVmaW5lIGFzIDEuCi0JKGkzODZsaW51eF9iZmRfZmluYWxfbGluayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKE1ZX2JmZF9maW5hbF9saW5rKTogRGVmaW5lIGFzIGkzODZsaW51eF9iZmRfZmluYWxfbGluay4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBDaGVjayBib3RoIHNlY3Rpb24gYW5kCi0Jb3V0cHV0X3NlY3Rpb24gYWdhaW5zdCBzZWN0aW9ucyBvZiBhYmZkLgotCi0JKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5KTogQ2hhbmdlIHR5cGUgb2YKLQl3cml0dGVuIGZyb20gYm9vbGVhbiB0byBjaGFyLiAgQWRkIG5ldyBmaWVsZCBzbWFsbC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSB3cml0dGVuIHRvIDAKLQlyYXRoZXIgdGhhbiBmYWxzZS4gIEluaXRpYWxpemUgc21hbGwgdG8gMC4KLQkoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogSWYgRUNPRkYgdHlwZSBpcyBzY1NVbmRlZmluZWQsIHNldAotCXNtYWxsLiAgSWYgc21hbGwgaXMgc2V0LCBhbmQgaGFzaCB0YWJsZSB0eXBlIGlzIGNvbW1vbiwgZm9yY2UgdGhlCi0Jc3ltYm9sIGludG8gYSBzZWN0aW9uIG5hbWVkIFNDT01NT04gYW5kIGNoYW5nZSB0aGUgRUNPRkYgdHlwZSBmcm9tCi0Jc2NDb21tb24gdG8gc2NTQ29tbW9uLgotCShlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogU2V0IHdyaXR0ZW4gdG8gMSByYXRoZXIgdGhhbiB0cnVlLgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IENvcnJlY3QgSk1QQUREUiByZWxvYwotCW92ZXJmbG93IGNoZWNrIHRvIGNvbnNpZGVyIHNlY3Rpb24gVk1BIG9mIGlucHV0IGZpbGUuCi0KLU1vbiBKdW4gMTMgMTQ6MjA6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoYW91dF8zMl9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSGFuZGxlIGEKLQltYWNoaW5lIHR5cGUgb2YgNjgwMDAuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IEFkZCBuZXcgYXJndW1lbnQgdW5rbm93bi4KLQlTZXQgKnVua25vd24gdG8gdHJ1ZSBpZiBtYWNoaW5lIHR5cGUgaXMgcmVhbGx5IHVua25vd24sIGFzIG9wcG9zZWQKLQl0byBNX1VOS05PV04gZm9yIHRoZSA2ODAwMC4KLQkoTkFNRShhb3V0LHNldF9hcmNoX21hY2gpKTogQ2hhbmdlIE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpIGNhbGwKLQlhY2NvcmRpbmdseS4KLQkqIGxpYmFvdXQuaCAoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpOiBBZGQgbmV3IGFyZ3VtZW50IHRvCi0JcHJvdG90eXBlLgotCi1TdW4gSnVuIDEyIDIwOjIxOjAzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoRVhFQ19BVVhfSUQpOiBEZWZpbmUgYmFzZWQgb24gYXZhaWxhYmxpdHkgb2YgSFBVWF9BVVhfSUQKLQlvciBISVVYX0FVWF9JRC4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBVc2UgRVhFQ19BVVhfSUQgaW5zdGVhZCBvZiBIUFVYX0FVWF9JRC4KLQkoc29tX3dyaXRlX2FybWFwKTogVXNlIENQVV9QQV9SSVNDMV8wIGFzIHRoZSBtYWdpYyBudW1iZXIuICBOb3RlCi0Jc29tLmMgaXMgY2FyZWZ1bCB0byBhbHdheXMgZGVmaW5lIENQVV9QQV9SSVNDMV8wLgotCi1TYXQgSnVuIDExIDE2OjMyOjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZCB3ZWFrIHN5bWJvbHMgYXMgYW4gZXh0ZW5zaW9uIHRvIGEub3V0LgotCSogYW91dHguaCAoc3ltX2luX3RleHRfc2VjdGlvbik6IERvbid0IGRlZmluZS4KLQkoc3ltX2luX2RhdGFfc2VjdGlvbiwgc3ltX2luX2Jzc19zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHN5bV9pc191bmRlZmluZWQsIHN5bV9pc19nbG9iYWxfZGVmbik6IExpa2V3aXNlLgotCShzeW1faXNfZGVidWdnZXJfaW5mbywgc3ltX2lzX2ZvcnRyYW5jb21tb24pOiBMaWtld2lzZS4KLQkoc3ltX2lzX2Fic29sdXRlLCBzeW1faXNfaW5kaXJlY3QpOiBMaWtld2lzZS4KLQkodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IFJld3JpdGUgZm9yIGNsYXJpdHkuICBSZWFycmFuZ2UKLQlhcmd1bWVudHMgYW5kIGNoYW5nZSBjYWxsZXIuICBIYW5kbGUgd2VhayBzeW1ib2xzLgotCSh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IERvbid0IGlnbm9yZSB3ZWFrIHN5bWJvbHMuICBQdWxsCi0Jb2JqZWN0IGluIGZyb20gYXJjaGl2ZSBpZiBhIHdlYWsgZGVmaW50aW9uIGlzIGZvdW5kIGZvciBhbgotCWV4aXN0aW5nIHVuZGVmaW5lZCBzeW1ib2wuCi0JKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IFB1dCBhbGwgY2FzZXMgaW4gc3dpdGNoLiAgU2V0IGZsYWdzIG9mIGFuCi0JdW5kZWZpbmVkIHN5bWJvbCB0byAwLiAgSGFuZGxlIHdlYWsgc3ltYm9scy4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBIYW5kbGUgd2VhayBzeW1ib2xzLgotCShhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLUZyaSBKdW4gMTAgMTM6MjU6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSk6IEhhbmRsZSAuYnNzIHNlY3Rpb24uCi0JKE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCi0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgQkZEX1JFTE9DX0NUT1IuCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IERvbid0IGFzc3VtZQotCXRoZSBzZWN0aW9uIG9mIGEgY29tbW9uIHN5bWJvbCBpcyBub3QgTlVMTC4KLQotV2VkIEp1biAgOCAyMzoxNTo1MyAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCk6ICBTZXQgRVhFQ19QIGFuZCBzdGFydCBhZGRyZXNzIGZvciBHREIuCi0KLVdlZCBKdW4gIDggMjM6NTc6MzQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzKTogRG9uJ3QgdHJ5IHRvIHJlYWQgdGhlCi0Jc3RyaW5ncyBpZiB0aGVyZSBhcmUgbm8gc3ltYm9scy4KLQkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IFVzZSB0aGUgb3V0cHV0IHNlY3Rpb24gd2hlbgotCXdvcmtpbmcgb3V0IHRoZSB0eXBlLgotCi1UdWUgSnVuICA3IDEzOjI1OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogUHV0IHNoc3RydGFiLCBzeW10YWIgYW5kCi0Jc3RydGFiIHNlY3Rpb25zIGF0IGVuZCBvZiBmaWxlLiAgQXZvaWRzIGJ1ZyBpbiBzb21lIHZlcnNpb25zIG9mCi0JU1ZSNCBzdHJpcC4gIEZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAdGFudGFsdXMubnJsLm5hdnkubWlsPi4KLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBJZiBDT0ZGX1BBR0VfU0laRSBpcyBkZWZpbmVkLAotCXNldCBTRUNfREVCVUdHSU5HIGZvciBTVFlQX0lORk8gc2VjdGlvbnMuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYgQ09GRl9QQUdFX1NJWkUgaXMKLQlkZWZpbmVkLCBhbmQgRF9QQUdFRCBpcyBzZXQsIHNldCB0aGUgZmlsZSBwb3NpdGlvbiBlcXVhbCB0byB0aGUKLQlzZWN0aW9uIFZNQSBtb2R1bG8gQ09GRl9QQUdFX1NJWkUuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IElmIEZfRVhFQyBpcyBzZXQsIHNldCBEX1BBR0VELgotCSogY29mZi1pMzg2LmM6IFNldCBEX1BBR0VEIGluIEJGRCB0YXJnZXQuCi0JKENPRkZfUEFHRV9TSVpFKTogRGVmaW5lLgotCSogY29mZi1tNjhrLmMsIGNvZmYtc3BhcmMuYzogTGlrZXdpc2UuCi0KLU1vbiBKdW4gIDYgMTA6NTc6MjggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IERvbid0IHR1cm4gYSByZWxvYyBzZWN0aW9uCi0JaW50byBhIEJGRCBzZWN0aW9uIGp1c3QgYmVjYXVzZSBTSEZfQUxMT0MgaXMgc2V0OyByZXF1aXJlIHRoYXQgaXQKLQlub3QgdXNlIHRoZSBub3JtYWwgc3ltYm9sIHRhYmxlLgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLQlCZXR0ZXIgaW5kaXJlY3QgYW5kIHdhcm5pbmcgc3ltYm9sIGhhbmRsaW5nIGluc3BpcmVkIGJ5IFN0dWFydAotCVF1aWNrIDxzdHVja0Bjcy5tYW4uYWMudWs+LgotCSogbGlua2VyLmMgKGVudW0gbGlua19hY3Rpb24pOiBBZGQgUkVGLCBNSU5ELCBDV0FSTiwgUkVGQy4KLQkobGlua19hY3Rpb24pOiBDaGFuZ2UgVU5ERUZfUk9XL2RlZiBhbmQgVU5ERUZXX1JPVy9kZWYgZnJvbSBOT0FDVAotCXRvIFJFRi4gIENoYW5nZSBVTkRFRl9ST1cvaW5kciBhbmQgVU5ERUZXX1JPVy9pbmRyIGZyb20gQ1lDTEUgdG8KLQlSRUZDLiAgQ2hhbmdlIERFRl9ST1cvaW5kciBhbmQgQ09NTU9OX1JPVy9pbmRyIGZyb20gQ1lDTEUgdG8gTURFRi4KLQlDaGFuZ2UgREVGV19ST1cvaW5kciBmcm9tIENZQ0xFIHRvIE5PQUNULiAgQ2hhbmdlIElORFJfUk9XL2luZHIKLQlmcm9tIE1ERUYgdG8gTUlORC4gIENoYW5nZSBJTkRSX1JPVy93YXJuIGZyb20gV0FSTkMgdG8gQ1lDTEUuCi0JQ2hhbmdlIFdBUk5fUk9XL2RlZiBhbmQgV0FSTl9ST1cvaW5kciBmcm9tIE1XQVJOIHRvIENXQVJOLiAgQ2hhbmdlCi0JV0FSTl9ST1cvY29tIGZyb20gTVdBUk4gdG8gV0FSTi4gIENoYW5nZSBXQVJOX1JPVy93YXJuIGZyb20gTk9BQ1QKLQl0byBDWUNMRS4gIENoYW5nZSBTRVRfUk9XL3dhcm4gZnJvbSBXQVJOQyB0byBDWUNMRT4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBIYW5kbGUgUkVGLCBNSU5ELCBDV0FSTiBhbmQKLQlSRUZDLiAgSWYgYSBuZXcgaW5kaXJlY3Qgc3ltYm9sIGhhcyBiZWVuIHJlZmVyZW5jZWQsIHB1c2ggdGhlCi0JcmVmZXJlbmNlIGRvd24gdG8gdGhlIHN5bWJvbCBpdCBwb2ludHMgdG8uICBGSXggaGFuZGxpbmcgb2YgV0FSTi4KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBJZiBOX1dBUk5JTkcsIGRvbid0Ci0JY2xvYmJlciBlX3R5cGUgb2YgbmV4dCBzeW1ib2wuCi0JKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogTG9vcCBvbiBiZmRfbGlua19oYXNoX3dhcm5pbmcgYXMgd2VsbAotCWFzIGJmZF9saW5rX2hhc2hfaW5kaXJlY3QuCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5KTogTmV3IGZpZWxkIHdyaXR0ZW4uCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpKTogSW5pdGlhbGl6ZSB3cml0dGVuLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFVzZSB3cml0dGVuLCBub3Qgcm9vdC53cml0dGVuLgotCShhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5KTogTmV3IGZpZWxkIHdyaXR0ZW4uCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgd3JpdHRlbi4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IHVzZSB3cml0dGVuLCBub3Qgcm9vdC53cml0dGVuLgotCSogZ2VubGluay5oIChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkpOiBOZXcgZmllbGQgd3JpdHRlbi4KLQkqIGxpbmtlci5jIChfYmZkX2xpbmtfaGFzaF9uZXdmdW5jKTogRG9uJ3QgaW5pdGlhbGl6ZSB3cml0dGVuLgotCShnZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSB3cml0dGVuLgotCShfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IFVzZSB3cml0dGVuLCBub3Qgcm9vdC53cml0dGVuLgotCShfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogTGlrZXdpc2UuCi0JKF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2RhdGFfdHlwZSk6IEFkZCBsaW5rZXIgZmllbGQuCi0JKiBlY29mZi5jIChlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayBuZXcgdGRhdGEgbGlua2VyCi0JZmllbGQsIHJhdGhlciB0aGFuIG91dHN5bWJvbHMgYmVpbmcgbm9uLU5VTEwsIHRvIGRlY2lkZSB3aGV0aGVyIHRvCi0Jb3V0cHV0IHRoZSBzeW1ib2xzIGFuZCByZWxvY3MuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogU2V0IG5ldyB0ZGF0YSBsaW5rZXIgZmllbGQgdG8gdHJ1ZS4KLQotCSogZWNvZmYuYyAoZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERvbid0IHRyeSB0byBjb3B5Ci0JZGF0YSB0byBhIG5vbi1FQ09GRiBmaWxlLgotCi0JKiBsaWJiZmQtaW4uaDogQWRkIHdhcm5pbmcgdGhhdCBsaWJiZmQuaCBpcyBhIGdlbmVyYXRlZCBmaWxlLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLVN1biBKdW4gIDUgMTU6MDI6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQ2hhbmdlcyB0byBzdXBwb3J0IEVMRiBzdHJpcCBhbmQgb2JqY29weSBvbiBkeW5hbWljYWxseSBsaW5rZWQKLQlmaWxlcy4KLQkqIGVsZmNvZGUuaCAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBBZGQgcHJvdG90eXBlLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBNYWtlIGEgQkZEIHNlY3Rpb24gZnJvbSBhbiBTSFRfSEFTSAotCXNlY3Rpb24sIGFuZCBmcm9tIGFuIFNIVF9EWU5TWU0gc2VjdGlvbiwgYW5kIGZyb20gdGhlIGR5bmFtaWMKLQlzdHJpbmcgdGFibGUgc2VjdGlvbi4KLQkoZWxmX29iamVjdF9wKTogU2V0IERfUEFHRUQgaWYgdGhlcmUgaXMgYSBwcm9ncmFtIGhlYWRlci4KLQkoZWxmX21ha2Vfc2VjdGlvbnMpOiBSZW1vdmUuCi0JKGZpeF91cF9zdHJ0YWJzKTogUmVtb3ZlLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IFJld3JpdGUuICBOb3cgc2V0cyBzaF9lbnRzaXplLgotCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogUmV3cml0ZS4gIE5vdyBzZXRzIHNoX2xpbmsgYW5kIHNoX2luZm8KLQlmb3IgYWxsIHNlY3Rpb25zLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogIERvbid0IGNhbGwgb2Jzb2xldGUKLQlmdW5jdGlvbnMgZWxmX21ha2Vfc2VjdGlvbnMgb3IgZml4X3VwX3N0cnRhYnMuCi0JKHN3YXBfb3V0X3N5bXMpOiBTZXQgc2hfYWRkcmFsaWduIHRvIEZJTEVfQUxJR04gcmF0aGVyIHRoYW4gNC4KLQkoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBQZXJtaXQgd3JpdGluZyBEWU5BTUlDCi0Jb2JqZWN0cy4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IFRyZWF0IFNIVF9EWU5TWU0gbGlrZSBvdGhlciBub3JtYWwKLQlzZWN0aW9ucy4gIElmIGFuIFNIVF9SRUwgb3IgU0hUX1JFTEEgc2VjdGlvbiBpcyBhbGxvY2F0ZWQgb3IgdXNlcwotCWFuIHVudXN1YWwgc3ltYm9sIHRhYmxlLCBwZXJtaXQgYSBCRkQgc2VjdGlvbiB0byBtYXAgdG8gaXQuCi0JUGVybWl0IG1vc3QgU0hUX1NUUlRBQiBzZWN0aW9ucyB0byBoYXZlIGEgQkZEIHNlY3Rpb24gbWFwcGVkIHRvCi0JdGhlbS4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogRG9uJ3Qgc2V0IHNoX2xpbmssIHNoX2luZm8gb3Igc2hfZW50c2l6ZQotCWZpZWxkcyBvZiBkeW5hbWljIHNlY3Rpb25zIGhlcmU7IGRvIGl0IGluIGFzc2lnbl9zZWN0aW9uX251bWJlcnMuCi0JKiBlbGYzMi10YXJnZXQuaCwgZWxmNjQtdGFyZ2V0Lmg6IEFkZCBEX1BBR0VEIHRvIHBlcm1pdHRlZCBvYmplY3QKLQlmbGFncy4KLQotCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBPbmx5IHNldCBTRUNfREFUQSBpZgotCVNFQ19MT0FEIGlzIHNldCwgcmF0aGVyIHRoYW4gY2hlY2tpbmcgU0VDX0FMTE9DLgotCi0JKiBsaWJiZmQtaW4uaCAoYmZkX3JlYWxsb2MpOiBDaGFuZ2UgbGFzdCBhcmcgdG8gInNpemVfdCBzaXplIi4KLQotRnJpIEp1biAgMyAxMDo1ODowMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBjb21wdXRlIHRoZSBmaWxlIGhlYWRlcidzCi0JY2hlY2tzdW0gaGVyZS4KLQkoc29tX3dyaXRlX2hlYWRlcnMpOiBJbnN0ZWFkIGRvIGl0IGhlcmUuCi0KLQkqIGxpYmJmZC5oIChiZmRfcmVhbGxvYyk6IENoYW5nZSBsYXN0IGFyZyB0byAic2l6ZV90IHNpemUiLgotCi1UaHUgSnVuICAyIDE3OjM5OjIyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3VuMy5oOiBJbmNsdWRlIDxzdGRsaWIuaD4uICBEb24ndCBkZWNsYXJlIGZyZWUsIGV4aXQgb3IKLQlnZXRlbnYuCi0KLQlBZGQgbGlua2VyIHN1cHBvcnQgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBzdW5vcy5jOiBJbmNsdWRlIGJmZGxpbmsuaC4gIEFkZCBtYW55IG5ldyBmdW5jdGlvbnMgYW5kCi0JZGVmaW5pdGlvbnMgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuCi0JKiBiZmQtaW4uaCAoYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEZWNsYXJlLgotCShiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGFvdXR4LmggKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSk6IE1vdmUgdG8gbGliYW91dC5oLgotCShzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2hhc2hfbG9va3VwLCBhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZSk6IExpa2V3aXNlLgotCShhb3V0X2hhc2hfdGFibGUpOiBMaWtld2lzZS4KLQkoTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSk6IFJlbmFtZSBmcm9tIGFvdXRfbGlua19oYXNoX25ld2Z1bmMKLQlhbmQgbWFrZSBleHRlcm5hbGx5IHZpc2libGUuCi0JKE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkpOiBOZXcgZnVuY3Rpb24uCi0JKE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKSk6IENhbGwKLQlOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpLCBub3QgX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdC4KLQkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3QgZmFpbCBpZiBubyBzeW1ib2xzLiAgSWYgaXQgZXhpc3RzLAotCWNhbGwgYWRkX2R5bmFtaWNfc3ltYm9scyBiYWNrZW5kIGVudHJ5IHBvaW50IGZvciBkeW5hbWljIG9iamVjdHMuCi0JVXNlIGFkZF9vbmVfc3ltYm9sIGJhY2tlbmQgZW50cnkgcG9pbnQgaWYgaXQgZXhpc3RzLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBDYWxsIGZpbmlzaF9keW5hbWljX2xpbmsgYmFja2VuZCBlbnRyeQotCXBvaW50LCBpZiBpdCBleGlzdHMuCi0JKGFvdXRfbGlua19pbnB1dF9iZmQpOiBGb3IgYSBkeW5hbWljIG9iamVjdCwgY2FsbAotCWxpbmtfZHluYW1pY19vYmplY3QgYmFja2VuZCBlbnRyeSBwb2ludCwgaWYgaXQgZXhpc3RzLgotCShhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogQ2FsbCB3cml0ZV9keW5hbWljX3N5bWJvbCBiYWNrZW5kCi0JZW50cnkgcG9pbnQsIGlmIGl0IGV4aXN0cy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb24pOiBEb24ndCByZWFkIHRoZSByZWxvY3MgaWYgdGhleSBoYXZlCi0JYWxyZWFkeSBiZWVuIHJlYWQuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IFdoZW4gZG9pbmcgYSBmaW5hbCBsaW5rLCBmb3IgYQotCXJlbG9jIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLCBjYWxsIGNoZWNrX2R5bmFtaWNfcmVsb2MgYmFja2VuZAotCWVudHJ5IHBvaW50LCBpZiBpdCBleGlzdHMuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCSogbGliYW91dC5oOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLiAgSW5jbHVkZQotCWJmZGxpbmsuaC4KLQkoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5KTogTW92ZSBpbiBmcm9tIGFvdXR4LmguCi0JKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfaGFzaF9sb29rdXAsIGFvdXRfbGlua19oYXNoX3RyYXZlcnNlKTogTGlrZXdpc2UuCi0JKGFvdXRfaGFzaF90YWJsZSk6IExpa2V3aXNlLgotCShzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGRzIGFkZF9keW5hbWljX3N5bWJvbHMsCi0JYWRkX29uZV9zeW1ib2wsIGxpbmtfZHluYW1pY19vYmplY3QsIHdyaXRlX2R5bmFtaWNfc3ltYm9sLAotCWNoZWNrX2R5bmFtaWNfcmVsb2MsIGFuZCBmaW5pc2hfZHluYW1pY19saW5rLgotCShzdHJ1Y3QgYW91dF9zZWN0aW9uX2RhdGFfc3RydWN0KTogRGVmaW5lIG5ldyBzdHJ1Y3R1cmUuCi0JKGFvdXRfc2VjdGlvbl9kYXRhKTogRGVmaW5lIG5ldyBhY2Nlc3NvciBtYWNyby4KLQkoTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSk6IERlY2xhcmUuCi0JKE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkpOiBEZWNsYXJlLgotCSogYW91dGYxLmggKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBJbml0aWFsaXplIG5ldyBhb3V0X2JhY2tlbmRfZGF0YQotCWZpZWxkcy4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIGkzODZhb3V0LmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIGkzODZtYWNoMy5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBtaXBzYnNkLmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIHNwYXJjbHlueC5jIChzcGFyY2x5bnhfYW91dF9iYWNrZW5kKTogTGlrZXdpc2UuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogRG9uJ3QgemVybyBvdXQgY2FjaGVkCi0JdW50aWwgd2Uga25vdyBpdCBpcyBub24tTlVMTC4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBEb24ndCBza2lwIGEgd2FybmluZyBzeW1ib2wgZXZlbiBpZiBpdAotCWhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbiBvdXQuICBJZiBza2lwcGluZyBhbiBpbmRpcmVjdCBzeW1ib2wsCi0Jc2tpcCB0aGUgbmV4dCBzeW1ib2wgYXMgd2VsbC4KLQotV2VkIEp1biAgMSAxNDozNzo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N1bjMuaDogRG9uJ3QgZGVjbGFyZSBxc29ydCwgbWFsbG9jIG9yIHJlYWxsb2MuCi0KLVRodSBNYXkgMjYgMTM6NTY6MDMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbik6IENhc3QgYmZkX2J5dGUgcG9pbnRlcgotCXRvIGNoYXIgcG9pbnRlciB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4KLQotCSogZGVwLWluLnNlZDogUmVtb3ZlIHNwYWNlcyBiZWZvcmUgY29sb25zLgotCi0JTWVyZ2VkIGNoYW5nZXMgYmFjayBpbiBmcm9tIEZTRiBnYXMgcmVsZWFzZSAyLjM6Ci0KLQkqIE1ha2VmaWxlLmluIChzdG1wLWJmZC5oKTogV3JhcCBgaWYnIGJsb2NrIGFyb3VuZCBncmVwCi0JaW52b2NhdGlvbiwgdG8gYXZvaWQgYSBidWcgaW4gQlNEIDQuNCBtYWtlLgotCi0JRnJvbSBSYWxwaCBDYW1wYmVsbDoKLQkqIG1pcHNic2QuYyAobWlwc19maXhfam1wX2FkZHIpOiBJZiBzeW1ib2wgaXMgdW5kZWZpbmVkLCByZXR1cm4gYW4KLQllcnJvci4KLQkobWlwc19maXhfaGkxNl9zKTogRGl0dG8uCi0KLQlGcmkgTWF5IDEzIDIxOjIxOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotCSogbWFrZWZpbGUuZG9zOiBkZWZpbmUgYSBkZWZhdWx0IHRhcmdldCwgb3IgYXJjaGl2ZXMgd29uJ3Qgd29yawotCSAgZHVlIHRvIG11bHRpcGxlIG1hdGNoZXMuCi0KLQlXZWQgTWF5IDExIDIyOjMyOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotCSogY29uZmlndXJlLmJhdDogdXBkYXRlIGZvciBsYXRlc3QgZmlsZXMKLQkqIG1ha2VmaWxlLmRvczogdXBkYXRlIGZvciBjb3JyZWN0IHRhcmdldHMgYW5kIHNvdXJjZXMKLQkqIGNvZmYtZ28zMi5jOiBbbmV3XSBnbzMyJ3MgQ09GRiBmb3JtYXQgKGkzODZjb2ZmIHdpdGggdW5kZXJzY29yZXMpCi0JKiB0YXJnZXRzLmM6IGFkZCBnbzMyY29mZiB0YXJnZXQKLQkqIG1ha2VmaWxlLmluOiBhZGQgY29mZi1nbzMyLmMgc3VwcG9ydAotCi1UaHUgTWF5IDI2IDEwOjEwOjIxIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3ByZXBfaGVhZGVycyk6IERvIG5vdCBzZXQgdGhlIHN5c3RlbV9pZCBoZXJlLCBwcml2YXRlCi0JYmZkIGRhdGEgaGFzIG5vdCBiZWVuIGNvcGllZCB5ZXQuCi0JKHNvbV93cml0ZV9oZWFkZXJzKTogSW5zdGVhZCBkbyBpdCBoZXJlLgotCi1UdWUgTWF5IDI0IDE2OjE3OjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCU1ha2UgTUlQUyBFTEYgdXNlIG5ldyBFTEYgYmFja2VuZCBsaW5rZXIuICBObyBzaGFyZWQgbGlicmFyeQotCXN1cHBvcnQgeWV0LgotCSogZWxmMzItbWlwcy5jIChiZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX2luKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX291dCk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lbGZfb2JqZWN0X3ApOiBJZiBsYXN0IHN5bWJvbCBpcyBMT0NBTCwgc2V0IGVsZl9iYWRfc3ltdGFiLgotCShtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogU2V0IHNoX2luZm8gZmllbGQgZm9yIC5ncHRhYi4qCi0Jc2VjdGlvbnMuCi0JKG1pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBTZXQgc2hfZW50c2l6ZSBmb3IgLmdwdGFiLiogc2VjdGlvbnMuCi0JKG1pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IFJlYWQgYW5kIGZyZWUgZXh0ZXJuYWwgc3ltYm9scyBsYXN0LAotCW5vdCBmaXJzdCwgZm9yIGNsYXJpdHkuCi0JKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkpOiBEZWZpbmUgbmV3IHN0cnVjdHVyZS4KLQkoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSk6IERlZmluZSBuZXcgc3RydWN0dXJlLgotCShtaXBzX2VsZl9saW5rX2hhc2hfbG9va3VwKTogRGVmaW5lIG5ldyBtYWNyby4KLQkobWlwc19lbGZfbGlua19oYXNoX3RyYXZlcnNlKTogRGVmaW5lIG5ldyBtYWNyby4KLQkobWlwc19lbGZfaGFzaF90YWJsZSk6IERlZmluZSBuZXcgbWFjcm8uCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN0cnVjdCBleHRzeW1faW5mbyk6IERlZmluZSBuZXcgc3RydWN0dXJlLgotCShtaXBzX2VsZl9nZXRfZXh0ciwgbWlwc19lbGZfc2V0X2luZGV4KTogUmVtb3ZlLgotCShtaXBzX2VsZl9vdXRwdXRfZXh0c3ltKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZ3B0YWJfY29tcGFyZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBSZXdyaXRlIHRvIHVzZSBFTEYgYmFja2VuZCBsaW5rZXIsIGFuZCB0bwotCW1lcmdlIGdwdGFiIGluZm9ybWF0aW9uIGluIGlucHV0IGZpbGVzLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9oaTE2KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERlZmluZSBhcyBtYWNybyBiZWZvcmUKLQlpbmNsdWRpbmcgZWxmMzItdGFyZ2V0LmguCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rKTogTGlrZXdpc2UuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBSZW5hbWUgZnJvbQotCWVsZl9saW5rX2hhc2hfbmV3ZnVuYyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLiAgQ2hhbmdlIGNhbGxlci4KLQkoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQlfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlLgotCShfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogVXNlCi0JX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQuCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgbmV3IGZpZWxkIGJhZF9zeW10YWIuCi0JKGVsZl9iYWRfc3ltdGFiKTogRGVmaW5lIG5ldyBhY2Nlc3NvciBtYWNyby4KLQkoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBEZWNsYXJlLgotCShfYmV3X2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IERlY2xhcmUuCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IENhbGwgYmFja2VuZCBvYmplY3RfcCBob29rIGFmdGVyCi0Jc3dhcHBpbmcgaW4gYWxsIHRoZSBzZWN0aW9uIGhlYWRlcnMuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogQ29ycmVjdCB0eXBvOiBJbnRlcm5hbCBmb3IgRXh0ZXJuYWwuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGVsZl9iYWRfc3ltdGFiIGlzIHNldCwgcmVhZCBhbGwKLQl0aGUgc3ltYm9scy4gIFNraXAgU1RCX0xPQ0FMIHN5bWJvbHMgcmF0aGVyIHRoYW4gZ2l2aW5nIGFuIGVycm9yLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBJZiBlbGZfYmFkX3N5bXRhYiBpcyBzZXQsIGFsbG9jYXRlIHNwYWNlIGZvcgotCWFsbCBzeW1ib2xzLCBub3QganVzdCBsb2NhbHMuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBPbmx5IHNraXAgYSBzeW1ib2wgbm90IG1lbnRpb25lZCBieSBhCi0JcmVndWxhciBmaWxlIGlmIGl0IGlzIG1lbnRpb25lZCBieSBhIGR5bmFtaWMgb2JqZWN0LgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBJZiBlbGZfYmFkX3N5bXRhYiBpcyBzZXQsIHJlYWQgYWxsIHRoZQotCXN5bWJvbHMuCi0KLUZyaSBNYXkgMjAgMTM6Mzg6MjMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2V0X3JlbG9jX2luZm8pOiBEbyBub3Qgc2V0IGFueSByZWxvY2F0aW9uIGluZm8KLQlmb3IgU09NIGZpeHVwcyB3aGljaCBhcmUgbmV2ZXIgcGFzc2VkIHRvIEJGRC4KLQotRnJpIE1heSAyMCAxMTo1NzowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgTUlQU19SX0pNUEFERFIgb3ZlcmZsb3cKLQljaGVja2luZy4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGQgRFRfREVCVUcgdG8KLQl0aGUgZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uIGZvciB0aGUgYmVuZWZpdCBvZiB0aGUgZGVidWdnZXIuCi0JRnJvbSBQZXRlciBTY2hhdWVyLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogTmV3IGZ1bmN0aW9uLCBiYXNlZCBvbgotCWNvZGUgcmVwZWF0ZWQgdGhyZWUgdGltZXMgaW4gYmZkX3NlY3Rpb25fZnJvbV9zaGRyIGluIGVsZmNvZGUuaC4KLQkqIGxpYmVsZi5oIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogRGVjbGFyZS4KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogVXNlIG5ldyBmdW5jdGlvbgotCV9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgdG8gY3JlYXRlIEJGRCBzZWN0aW9ucy4gIElmIGEKLQlyZWxvYyBzZWN0aW9uIGRvZXMgbm90IHVzZSB0aGUgbWFpbiBzeW1ib2wgdGFibGUsIG9yIGl0IGlzIHBhcnQgb2YKLQl0aGUgcHJvY2VzcyBpbWFnZSwgdHJlYXQgaXQgYXMgYSBub3JtYWwgc2VjdGlvbiwgbm90IHJlbG9jcy4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBVc2UgbmV3IGZ1bmN0aW9uCi0JX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkci4KLQotVGh1IE1heSAxOSAxMTozNzoxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXRhcmdldC5oLCBlbGY2NC10YXJnZXQuaDogQ2hhbmdlIGFyX21heF9uYW1lbGVuIHZhbHVlIGZyb20KLQkxNSB0byAxNCB0byBtYXRjaCBTVlI0IGFyLgotCi0JQWRkIHN1cHBvcnQgZm9yIEVMRiBzaGFyZWQgbGlicmFyaWVzLiAgTG9vc2VseSBiYXNlZCBvbiB3b3JrIGJ5Ci0JRXJpYyBZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY29tPi4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGRzIGZvciBkeW5hbWljCi0JbGlua2luZzogZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsCi0JZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotCWVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucywKLQllbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wsCi0JZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMuCi0JKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogQ2hhbmdlIHR5cGUgb2YgYWxpZ24gZmllbGQgdG8KLQliZmRfc2l6ZV90eXBlLiAgQWRkIGZpZWxkcyBkeW5pbmR4LCBkeW5zdHJfaW5kZXgsIHdlYWtkZWYsCi0JZWxmX2xpbmtfaGFzaF9mbGFncy4KLQkoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgZmllbGRzIGR5bm9iaiwgZHluc3ltY291bnQsCi0JZHluc3RyLCBidWNrZXRjb3VudC4KLQkoYmZkX2VsZjMyX3N3YXBfcmVsb2NfaW4sIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9pbiwgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9zd2FwX2R5bl9pbiwgYmZkX2VsZjMyX3N3YXBfZHluX291dCk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zd2FwX3JlbG9jX2luLCBiZmRfZWxmNjRfc3dhcF9yZWxvY19vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc3dhcF9yZWxvY2FfaW4sIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc3dhcF9keW5faW4sIGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkpOiBEZWNsYXJlLgotCSogZWxmY29kZS5oIChFbGZfRXh0ZXJuYWxfRHluKTogRGVmaW5lLgotCShlbGZfc3dhcF9yZWxvY19pbik6IERlZmluZSBhcyBtYWNybyB1c2luZyBOQU1FLiAgTWFrZSBleHRlcm5hbGx5Ci0JdmlzaWJsZS4KLQkoZWxmX3N3YXBfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX3JlbG9jYV9pbiwgZWxmX3N3YXBfcmVsb2NhX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9keW5faW4sIGVsZl9zd2FwX2R5bl9vdXQpOiBEZWZpbmUgYXMgbWFjcm8gdXNpbmcgTkFNRQotCWFuZCBhcyBuZXcgZXh0ZXJuYWxseSB2aXNpYmxlIGZ1bmN0aW9uLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IFNldCBzZWN0aW9uIHR5cGUgb2YgZHluYW1pYyBzZWN0aW9ucyBiYXNlZCBvbgotCXNlY3Rpb24gbmFtZXMuCi0JKGVsZl93cml0ZV9waGRycyk6IFJlbW92ZS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24pOiBBZGQgbmV3IGFsaWduIGFyZ3VtZW50LgotCUNoYW5nZSBhbGwgY2FsbGVycy4KLQkoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdHJ1Y3Qgc2VnX2luZm8pOiBSZW1vdmUuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogQ29tcGxldGVseSByZXdyaXRlLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IENvbXBsZXRlbHkgcmV3cml0ZS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MpOiBEb24ndCBzZXQgYSBmaWxlIHBvc2l0aW9uIGZvcgotCXNlY3Rpb25zIHdoaWNoIGFscmVhZHkgaGF2ZSBvbmUuICBEb24ndCBib3RoZXIgdG8gYWxpZ24gdGhlIGZpbGUKLQlwb3NpdGlvbiBoZXJlLgotCShzZWN0aW9uX2Zyb21fZWxmX2luZGV4KTogSGFuZGxlIFNIVF9IQVNIIGFuZCBTSFRfRFlOQU1JQwotCXNlY3Rpb24gdHlwZXMuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IElmIHNlY3Rpb25fZnJvbV9lbGZfaW5kZXggZmFpbHMsIGp1c3QKLQl1c2UgYmZkX2Fic19zZWN0aW9uIHJhdGhlciB0aGFuIHJldHVybmluZyBhbiBlcnJvci4KLQkoZWxmX3NpemVvZl9oZWFkZXJzKTogTWFrZSB1c2VmdWwuCi0JKGVsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEhhbmRsZSBkeW5hbWljIG9iamVjdHMuCi0JKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2FkZF9keW5hbWljX2VudHJ5KTogRGVmaW5lIGFzIG1hY3JvIHVzaW5nIE5BTUUgYW5kIGFzIG5ldwotCWV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbi4KLQkoTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfYnVja2V0cyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogTmV3IGZ1bmN0aW9uLgotCShzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBkeW5zeW1fc2VjIGFuZCBoYXNoX3NlYyBmaWVsZHMuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IEhhbmRsZSBkeW5hbWljIGxpbmtpbmcuICBDcmVhdGUgYSBzZWN0aW9uCi0Jc3ltYm9sIGZvciBhbGwgRUxGIHNlY3Rpb25zLCBub3QgYWxsIEJGRCBzZWN0aW9ucy4gIFN0b3JlIHNlY3Rpb24KLQlzeW1ib2wgaW5kZXggaW4gdGFyZ2V0X2luZGV4IGZpZWxkLCBub3QgaW5kZXggZmllbGQuICBUcmF2ZXJzZQotCW92ZXIgZ2xvYmFsIHN5bWJvbHMgZXZlbiBpZiBzdHJpcHBpbmcuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBPdXRwdXQgZHluYW1pYyBzeW1ib2xzLiAgTWFyayBzeW1ib2xzCi0JZGVmaW5lZCBieSBkeW5hbWljIG9iamVjdHMgYXMgdW5kZWZpbmVkLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBJZ25vcmUgZHluYW1pYyBvYmplY3RzLiAgVXNlIHRhcmdldF9pbmRleAotCWZpZWxkIGZvciBzZWN0aW9uIHJlbG9jcywgYW5kIG1ha2Ugc3VyZSBpdCBpcyBzZXQuCi0JKGVsZl9yZWxvY19saW5rX29yZGVyKTogVXNlIHRhcmdldF9pbmRleCBmaWVsZCBmb3Igc2VjdGlvbiByZWxvY3MsCi0JYW5kIG1ha2Ugc3VyZSBpdCBpcyBzZXQuCi0JKiBlbGYuYyAoZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBkeW5pbmR4LCBkeW5zdHJfaW5kZXgsCi0Jd2Vha2RlZiBhbmQgZWxmX2xpbmtfaGFzaF9mbGFncyBmaWVsZHMuCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIGR5bm9iaiwgZHluc3ltY291bnQsCi0JZHluc3RyIGFuZCBidWNrZXRjb3VudCBmaWVsZHMuCi0JKiBlbGYzMi10YXJnZXQuaDogSW5pdGlhbGl6ZSBuZXcgZHluYW1pYyBsaW5raW5nIGZpZWxkcy4KLQkqIGVsZjY0LXRhcmdldC5oOiBMaWtld2lzZS4gIAotCSogZWxmMzItaTM4Ni5jOiBOZXcgZnVuY3Rpb25zIGZvciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydC4KLQkqIGVsZjMyLXNwYXJjLmM6IExpa2V3aXNlLgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9yZWNvcmRfbGlua19hc3NpZ25tZW50KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLVdlZCBNYXkgMTggMDg6Mjk6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzb20uYzogRG9uJ3QgaW5jbHVkZSA8c3lzL2Rpci5oPiBvciA8c3lzL3VzZXIuaD4uCi0JKHNvbV9yZWxvY19xdWV1ZV9maW5kKTogQ2FsbCBtZW1jbXAgaW5zdGVhZCBvZiBiY21wLgotCShzb21fYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQ2hhbmdlIGZpcnN0IGFyZ3VtZW50IHRvIGJmZCAqLgotCShjb21wYXJlX3N5bXMpOiBDaGFuZ2UgdHlwZXMgb2YgYXJndW1lbnRzIHRvIGNvbnN0IHZvaWQgKi4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogUmVtb3ZlZCB1bnVzZWQgbG9jYWwgZm91bmQuCi0JKHNvbV93cml0ZV9hcm1hcCk6IEFkZCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCBhbmQgaW50IGFyZ3VtZW50cy4KLQkoc29tX3dyaXRlX2FybWFwKTogVXNlICVsZCBhbmQgY2FzdCB0byBsb25nIGZvciBnZXR1aWQgcmVzdWx0LgotCi1XZWQgTWF5IDE4IDA5OjA5OjMyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmggKFJfSFBQQV9BQlNfQ0FMTCk6IERlZmluZS4KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBIYW5kbGUgYWJzb2x1dGUgY2FsbHMuCi0KLQkqIHNvbS5oIChSX0hQUEFfQUJTX0NBTEwpOiBEZWZpbmUuCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBEZWxldGUgY29tcGxleCByZWxvY2F0aW9uIHR5cGVzLgotCi1UdWUgTWF5IDE3IDE5OjMzOjEyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTk2MC5jIChpY29mZl9saXR0bGVfdmVjLCBpY29mZl9iaWdfdmVjKTogSW5kaWNhdGUgbGVhZGluZwotCXVuZGVyc2NvcmUsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggSW50ZWwgdG9vbCBjaGFpbiAoZ251OTYwdjIpLgotCi1Nb24gTWF5IDE2IDEwOjA5OjIyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIGVsZjMyLWhwcGEuYzogQ2hhbmdlIC5ocHBhX2xpbmtlcl9zdHVicyB0byAuUEFSSVNDLnN0dWJzLAotCWxpa2V3aXNlIGZvciBvdGhlciBQQSBzcGVjaWZpYyBzZWN0aW9ucy4KLQkoaHBwYV9lbGZfcmVsb2NhdGVfdW53aW5kX3RhYmxlKTogRGVsZXRlIHVudXNlZAotCWZ1bmN0aW9uLgotCShlbGZfaHBwYV9ob3d0b190YWJsZSk6IENvbXBsZXRlbHkgbmV3IHRhYmxlIGJhc2VkIG9uIDk0LTAyLTAyCi0JZHJhZnQgUEEgRUxGIHNwZWMuICBDaGFuZ2UgcmVsb2NhdGlvbiB0YWdzIGFwcHJvcHJpYXRlbHkKLQl0aHJvdWdob3V0IGVsZjMyLWhwcGEuYwotCShocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IFJld3JpdGUgYW5kIHNpbXBsaWZ5IGJhc2VkIG9uIDk0LTAyLTAyCi0Jc3BlYy4KLQkoaHBwYV9lbGZfcmVsb2MpOiBMaWtld2lzZS4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogTGlrZXdpc2UKLQkoRUxGX01BQ0hJTkVfQ09ERSk6IENoYW5nZSB0byBFTV9QQVJJU0MuCi0JKiBlbGYzMi1ocHBhLmg6IEluY2x1ZGUgImVsZi9ocHBhLmgiLiAgQ2hhbmdlIHJlbG9jYXRpb24gdGFncyAKLQlhcHByb3ByaWF0ZWx5IHRocm91Z2hvdXQgZWxmMzItaHBwYS5oLgotCShlbGYzMl9ocHBhX3JlbG9jX3R5cGUpOiBOZXcgdGFibGUgYmFzZWQgb24gOTQtMDItMDIgZHJhZnQgUEEgRUxGCi0Jc3BlYy4KLQkoUl9IUFBBX0FCU19DQUxMLCBSX0hQUEFfQ09NUExFWCosIFJfSFBQQV9VTldJTkQpOiBEZWxldGUgZGVmaW5pdGlvbnMuCi0JKiBlbGZjb2RlLmggKHByZXBfaGVhZGVycyk6IFVzZSBFTV9QQVJJU0MgaW5zdGVhZCBvZiBFTV9IUFBBLgotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfcmVhbCk6IERlbGV0ZSB1bnVzZWQgSFBQQSByZWxvY2F0aW9ucy4KLQkqIHNvbS5oIChSX0hQUEFfQUJTX0NBTEwsIFJfSFBQQV9DT01QTEVYKTogRGVsZXRlIGRlZmluaXRpb25zLgotCi0JKiBsaWJocHBhLmggKGhwcGFfZmllbGRfYWRqdXN0KTogQXZvaWQgYWRkaW5nIGNvbnN0YW50X3ZhbHVlIGludG8KLQl0aGUgZmluYWwgdmFsdWUgdHdpY2UgZm9yIExSIGFuZCBSUiBmaWVsZCBzZWxlY3RvcnMuCi0KLVNhdCBNYXkgMTQgMDk6MDk6MTkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFkZF90b19zdHJpbmd0YWIpOiBVc2UgQkZEX0FTU0VSVCBub3QgYXNzZXJ0LiAgVGhpcwotCWF2b2lkcyBfX2VwcmludGYgdHJvdWJsZXMuCi0KLUZyaSBNYXkgMTMgMTA6NTE6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGJfb3V0X2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfQ1RPUi4KLQotCSogY29uZmlnL21pcHNiZWxmLm10IChTRUxFQ1RfVkVDUyk6IEFkZCBlY29mZl9iaWdfdmVjIGFuZAotCWVjb2ZmX2xpdHRsZV92ZWMgc2luY2UgSXJpeCA1IHN1cHBvcnRzIEVDT0ZGIGV4ZWN1dGFibGVzLgotCi1XZWQgTWF5IDExIDAwOjMxOjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBIYW5kbGUgZmRyLmFkciAhPSBwZHIuYWRyCi0JY29ycmVjdGx5LgotCi0JKiBNYWtlZmlsZS5pbiAoc3RtcC1iZmQuaCk6IFVzZSB8fCBpbnN0ZWFkIG9mIDsgdG8gZm9yY2UgU3VuT1MKLQltYWtlIHRvIGludm9rZSB0aGUgc2hlbGwuCi0KLVR1ZSBNYXkgMTAgMTQ6MjM6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZKTogUmVuYW1lZCBmcm9tCi0JU0VDX1NIQVJFRF9MSUJSQVJZIGZvciBjbGFyaXR5LiAgQ2hhbmdlZCBhbGwgdXNlcy4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogSWYgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkgaXMKLQlzZXQsIHNldCBTVFlQX05PTE9BRC4KLQkqIGNvZmZnZW4uYyAoY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4KTogRG9uJ3QgZ2V0IGFuIGFzc2VydGlvbgotCWZhaWx1cmUgYmVjYXVzZSBvZiBhIGJhZCBzaGFyZWQgbGlicmFyeS4KLQotTW9uIE1heSAgOSAxODo1Mzo0MCAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jOiBBZGQgbWlzc2luZyBjb21tZW50IHRlcm1pbmF0b3IuCi0KLU1vbiBNYXkgIDkgMTE6NTM6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBJZiBoYXNocCBhbmQgKmhhc2hwCi0JYXJlIG5vdCBOVUxMLCBhc3N1bWUgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBsb29rZWQgdXAgdGhlIHN5bWJvbAotCWluIHRoZSBoYXNoIHRhYmxlIGFuZCBoYXMgc3RvcmVkIHRoZSBlbnRyeSBpbiAqaGFzaHAuCi0JKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBTZXQgaCB0byBOVUxMIGJlZm9yZSBjYWxsaW5nCi0JX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wuCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBMaWtld2lzZS4KLQotCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IERvbid0IHJlcXVpcmUKLQlwYWdlIHNoYXJlZCBiZXR3ZWVuIC5kYXRhIGFuZCAuYnNzIHNlZ21lbnRzIHRvIGNvbnRhaW4gemVyb2VzLgotCi0JKiBlbGZjb2RlLmg6IEluY2x1ZGUgYmZkbGluay5oLiAgQWRkZWQgc2V2ZXJhbCBuZXcgZnVuY3Rpb25zIHRvIGRvCi0JbGlua2luZy4KLQkoRUxGX1JfVFlQRSk6IERlZmluZS4KLQkoYmZkX2FkZF90b19zdHJ0YWIpOiBSZXR1cm4gdW5zaWduZWQgbG9uZy4gIENoYW5nZSBjaGVjayBmb3IKLQlyZWFsbG9jIGZhaWx1cmUuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9hZGRfdG9fc3RydGFiLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWRkIGxpbmtfaW5mbyBhcmd1bWVudC4KLQlDYWxsIGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcgaG9vayBhbmQgcHJlcF9oZWFkZXJzCi0JaGVyZS4gIE9ubHkgY2FsbCBzd2FwX291dF9zeW1zIGlmIGxpbmtfaW5mbyBpcyBOVUxMLiAgU2V0IHVwCi0JLnNoc3RydGFiIHNlY3Rpb24gaGVyZS4gIFBhc3MgZG9zeW1zIGFyZ3VtZW50IHRvCi0JYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MuICBTZXQgb3V0cHV0X2hhc19iZWd1biBmbGFnLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3N5bXRhYl9hbmRfc3RydGFicyk6IEFkZCBkb3N5bXMKLQlhcmd1bWVudCwgYW5kIHVzZSBpdCB0byBjb250cm9sIHNldHRpbmcgLnN5bXRhYiBhbmQgLnN0cnRhYiBmaWxlCi0JcG9zaXRpb25zLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEFkZCBkb3N5bXMgYXJndW1lbnQsIGFuZAotCXBhc3MgaXQgb24uCi0JKHByZXBfaGVhZGVycyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfYWRkX3RvX3N0cnRhYi4KLQkoc3dhcF9vdXRfc3ltcyk6IExpa2V3aXNlLiAgQWxzbywgZG9uJ3Qgc2V0IHVwIC5zaHN0cnRhYiBoZXJlLgotCShOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFNvbWUgY2FsbHMgbW92ZWQgaW50bwotCWVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuCi0JKGVsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogU0hOX0xPUkVTRVJWIGNvcnJlY3RlZCB0byBTSE5fTE9SRVNFUlZFLgotCSogbGliZWxmLmg6IEluY2x1ZGUgYmZkbGluay5oLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZHMgY29sbGVjdCwKLQllbGZfYWRkX3N5bWJvbF9ob29rLCBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uLgotCShzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgZmllbGQgcmVsX2hhc2hlcy4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBSZW1vdmUgZmllbGRzIGludGVybmFsX3N5bXMgYW5kIHN5bWJvbHMuCi0JQWRkIGZpZWxkIHN5bV9oYXNoZXMuCi0JKG9ial9zeW1ib2xzLCBvYmpfaW50ZXJuYWxfc3ltcyk6IFJlbW92ZSBkZWZpbml0aW9ucy4KLQkoZWxmX3N5bV9oYXNoZXMpOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoZWxmX2xpbmtfaGFzaF9sb29rdXApOiBEZWZpbmUuCi0JKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UpOiBEZWZpbmUuCi0JKGVsZl9oYXNoX3RhYmxlKTogRGVmaW5lLgotCShfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X2JmZF9maW5hbF9saW5rKTogRGVjbGFyZS4KLQkqIGVsZi5jOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkoZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmMzItdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiBub3QgZGVmaW5lZCwKLQlkZWZpbmUgYXMgMCBhbmQgdXNlIGdlbmVyaWMgbGlua2VyLiAgT3RoZXJ3aXNlLCB1c2UgRUxGIGJhY2tlbmQKLQlsaW5rZXIuCi0JKGVsZl9iYWNrZW5kX2NvbGxlY3QpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIGZhbHNlLgotCShlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2spOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIDAuCi0JKGVsZjMyX2JlZCk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkqIGVsZjY0LXRhcmdldC5oOiBTYW1lIGNoYW5nZXMgYXMgZWxmMzItdGFyZ2V0LmguCi0JKiBlbGYzMi1pMzg2LmM6IEluY2x1ZGUgYmZkbGluay5oLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCSogZWxmMzItc3BhcmMuYzogSW5jbHVkZSBiZmRsaW5rLmguCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogQ2hhbmdlIHR5cGUgb2YgZHN0IGZyb20gRWxmMzJfSW50ZXJuYWxfUmVsYQotCXRvIEVsZl9JbnRlcm5hbF9SZWxhICh0aGV5J3JlIHRoZSBzYW1lIHR5cGUgYW55aG93KS4KLQkoZWxmX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9iYWNrZW5kX2NvbGxlY3QpOiBEZWZpbmUuCi0KLQkqIE1ha2VmaWxlLmluIChzdG1wLWJmZC5oKTogQXZvaWQgdXNlbGVzcyBtYWtlIGVycm9yIG1lc3NhZ2UgaW4gYQotCWRpZmZlcmVudCB3YXk7IHRvdWNoIHRha2VzIGEgbnVtZXJpYyBhcmd1bWVudCBvbiBzb21lIHN5c3RlbXMuCi0KLUZyaSBNYXkgIDYgMTM6MzQ6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luKTogUmV3b3JrIGN1c3RvbSBoZWFkZXIKLQloYW5kbGluZyBmb3IgbGF0ZXN0IHN1Z2dlc3RlZCBmb3JtYXQuCi0JKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCk6IExpa2V3aXNlLgotCShubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTGlrZXdpc2UuCi0KLUZyaSBNYXkgIDYgMTE6MTE6NTAgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogaGFuZGxlIGVycmljc3NvbiBjb25maWcgKGZvciBPU0UpLgotCi1UaHUgTWF5ICA1IDE1OjQwOjQ3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQlQYXRjaGVzIGZyb20gUmFscGggQ2FtcGJlbGw6Ci0JKiBtaXBzYnNkLmMgKG1pcHNfZml4X2ptcF9hZGRyKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2ZpeF9oaTE2X3MpOiBVc2UgYmZkX2lzX2NvbV9zZWN0aW9uLgotCShtaXBzX2hvd3RvX3RhYmxlX2V4dCk6IENhbGwgbWlwc19maXhfam1wX2FkZHIgZm9yIE1JUFNfUkVMT0NfSk1QLgotCi1GcmkgTWF5ICA2IDExOjQ4OjU1IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9nbzMyLm1oOiBYWCBzdXBwb3J0LgotCi0JRnJvbSBiaWxsCi0JKiBNYWtlZmlsZS5pbjogQnVpbGQgc3lzZGVwLmggd2l0aG91dCBjYXVzaW5nIHdvcnJ5aW5nIGJ1dAotCWhhcm1sZXNzIGVycm9yIG1lc3NhZ2UuCi0KLVdlZCBNYXkgIDQgMTE6MDk6NTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JQ2hhbmdlZCBtNjhrLWFvdXQgdG8gc2V0IGZsYWdzIHRvIDA7IG02OGstc3Vub3Mgc3RpbGwgdXNlcyAxLgotCSogYW91dDAuYzogTmV3IGZpbGUuCi0JKiB0YXJnZXRzLmMgKGFvdXQwX2JpZ192ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBhb3V0MF9iaWdfdmVjLgotCSogY29uZmlnLmJmZCAobTY4Ki0qLWFvdXQqKTogVXNlIG02OGstMGFvdXQsIG5vdCBtNjhrLWFvdXQuCi0JKiBjb25maWcvbTY4ay1hb3V0Lm10IChTRUxFQ1RfVkVDUyk6IFJlbW92ZWQuCi0JKiBjb25maWcvbTY4ay0wYW91dC5tdDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKGFvdXQwX2JpZ192ZWMpOiBOZXcgdGFyZ2V0IHZlY3RvcjogdXNlIGFvdXQwLm8sCi0JYW91dDMyLm8gYW5kIHN0YWItc3ltcy5vLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBhb3V0MC5vLgotCShDRklMRVMpOiBBZGQgYW91dDAuYy4KLQotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGQgZXhlY19oZHJfZmxhZ3MuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9leGVjX2hkcl9mbGFncyk6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgYXMgMC4KLQlNWShiYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIGV4ZWNfaGRyX2ZsYWdzIGZpZWxkLgotCSogYW91dGYxLmggKHN1bm9zXzMyX3NldF9hcmNoX21hY2gpOiBNYWtlIHN0YXRpYy4KLQkoYW91dDMyX3N1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgZmxhZ3MgZnJvbSBiYWNrZW5kCi0JaW5mby4KLQkoTVlfZXhlY19oZHJfZmxhZ3MpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIDEuCi0JKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBJbml0aWFsaXplIGV4ZWNfaGRyX2ZsYWdzIGZpZWxkLgotCSogYW91dC1lbmNhcC5jIChlbmNhcF93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgZmxhZ3MgZnJvbQotCWJhY2tlbmQgaW5mby4KLQkoTVlfZXhlY19oZHJfZmxhZ3MpOiBEZWZpbmUgYXMgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFLgotCSogaHAzMDBocHV4LmMgKE1ZX2V4ZWNfaGRyX2ZsYWdzKTogRGVmaW5lIGFzIDB4Mi4KLQkoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFNldCBmbGFncyBmcm9tIGJhY2tlbmQgaW5mby4KLQkqIGkzODZhb3V0LmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBJbml0aWFsaXplIGV4ZWNfaGRyX2ZsYWdzIGZpZWxkLgotCSogaTM4Nm1hY2gzLmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIG1pcHNic2QuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogc3BhcmNseW54LmMgKE5BTUUoYW91dCxzcGFyY2x5bnhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFNldAotCWZsYWdzIGZyb20gYmFja2VuZCBpbmZvLgotCShzcGFyY2x5bnhfYW91dF9iYWNrZW5kKTogSW5pdGlhbGl6ZSBleGVjX2hkcl9mbGFncyBmaWVsZC4KLQotV2VkIE1heSAgNCAwMjo1NjowMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCAoaTM4Ni0qLWdudSopOiBUcmVhdCBsaWtlIGkzODYtKi1tYWNoKi4KLQkobTY4Ki1hcG9sbG8tKik6IFRyZWF0IGFsbCBBcG9sbG8gY29uZmlncyB0aGUgc2FtZSwgZG9uJ3QgaGFuZGxlCi0JQlNEIHNwZWNpYWxseS4KLQotVHVlIE1heSAgMyAxOTo0MzoyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNhY2hlLmM6IFJld3JvdGUgdG8gd29yayBjb3JyZWN0bHkuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIG9wbmNscy5jIChiZmRfY2FjaGVfaW5pdCwgYmZkX29wZW5fZmlsZSk6IERvbid0IGRlY2xhcmUuCi0JKGJmZF9mZG9wZW5yKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9jYWNoZV9pbml0LgotCi1GcmkgQXByIDI5IDE1OjA4OjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY2YtbTY4a2x5bnguYyAoQ0FMQ19BRERFTkQpOiBDaGVjayBmb3IgUEMgcmVsYXRpdmUgcmVsb2NzIGJ5Ci0JZW51bWVyYXRpbmcgdGhlbSwgc2luY2UgdGhlIHJlbG9jIHR5cGUgY2FuIG5vdCBzZXJ2ZSBhcyBhbiBpbmRleAotCWludG8gdGhlIG02OGsgQ09GRiBob3d0b190YWJsZS4KLQotRnJpIEFwciAyOSAwOTo0MjozOSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0gICAgICAgICogY29uZmlnLmJmZCAoKi1nbzMyKTogQ2hhbmdlZCB0byBjb2ZmLgotCSogY29mZi1oODMwMC5jIChKTVBMMSk6IEdldCBIT1dUTyByaWdodCBmb3IgMjRiaXQgYnJhbmNoZXMuCi0JKiBzcmVjLmMgKHNyZWNfd3JpdGVfc3ltYm9scyk6IFdyaXRlIG91dCB0aGUgY29ycmVjdCBudW1iZXIgb2YKLQlzeW1ib2xzIGFuZCBkb24ndCBzdGljayBpbiBleHRyYSBudWxscy4KLQotVHVlIEFwciAyNiAxNTowNzoyNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNmLXNwYXJjbHlueC5jIChMWU5YT1MsIENPRkZfTE9OR19GSUxFTkFNRVMpOiBEZWZpbmUuCi0JKiBjb2ZmLXNwYXJjLmMgKEJBRE1BRyk6IFJlY29nbml6ZSBMWU5YQ09GRk1BR0lDLgotCShDT0ZGX1NQQVJDKTogRGVmaW5lLgotCSogY29mZmNvZGUuaCAoY29mZl9uZXdfc2VjdGlvbl9ob29rKTogSWYgQ09GRl9TUEFSQywgc2V0IGFsaWdubWVudAotCXBvd2VyIG9mIGRhdGEgYW5kIGJzcyBzZWN0aW9ucyB0byAzLgotCSogaG9zdHMvbHlueC5oIChfX0xZTlhPUyk6IERlZmluZS4KLQotVHVlIEFwciAyNiAxNTowNDoyNiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9yZWxvYyk6IEFkanVzdCB0aGUgYWRkZW5kIG9mIHJlbG9jYXRpb25zCi0JYWdhaW5zdCBzZWN0aW9uIHN5bWJvbHMgdG8gYXZvaWQgbG9zaW5nIGR1cmluZyBsZCAtci4KLQotVHVlIEFwciAyNiAxMjoxNjo0MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoc2hzdHJ0YWJfbGVuZ3RoX2ZpeGVkKTogUmVtb3ZlIHVzZWxlc3Mgc3RhdGljCi0JdmFyaWFibGUuCi0JKHN0cnVjdCBlbGZfc2VjdF9kYXRhKTogUmVtb3ZlIHVudXNlZCBzdHJ1Y3R1cmUuCi0JKGVsZl9vYmplY3RfcCk6IEZyZWUgbWVtb3J5IGlmIGVycm9yIG9jY3Vycy4gIENoZWNrIHJldHVybiB2YWx1ZQotCW9mIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2guICBJZiBlbGZfZ2V0X3N0cl9zZWN0aW9uIGZhaWxzLAotCXByZXNlcnZlIGVycm9yIGNvZGUgcmF0aGVyIHRoYW4gc2V0dGluZyB3cm9uZ19mb3JtYXQuCi0JKG51bGxfc2hkcik6IFJlbW92ZSBzdGF0aWMgdmFyaWFibGUuCi0JKGFzc2lnbl9zZWN0aW9uX251bWJlcnMpOiBSZW1vdmUgc2hzdHJ0YWJfbGVuZ3RoX2ZpeGVkIGFzc2lnbm1lbnQuCi0JQWxsb2NhdGUgZmlyc3Qgc2VjdGlvbiBoZWFkZXIgb24gQkZEIG9ic3RhY2sgcmF0aGVyIHRoYW4gdXNpbmcKLQludWxsX3NoZHIuCi0JKGJmZF9wcnBzaW5mbyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgbmV3c2VjdC4KLQotTW9uIEFwciAyNSAxNTozMTowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogVW5kbyBwYXRjaCBvZiBBcHIgMTA7IGJyZWFrcyBTb2xhcmlzLgotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFVzZSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheQotCXRvIGNyZWF0ZSBzZWN0aW9ucy4gIENoZWNrIHJldHVybiB2YWx1ZSBvZiByZWN1cnNpdmUgY2FsbHMuCi0JKGJmZF9zZWN0aW9uX2Zyb21fcGhkcik6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfbWFrZV9zZWN0aW9uLgotCShlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IExpa2V3aXNlLgotCShlbGZfb2JqZWN0X3ApOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgYmZkX3NlY3Rpb25fZnJvbV9zaGRyLgotCShzZWN0aW9uX2Zyb21fZWxmX2luZGV4KTogTGlrZXdpc2UuCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQlzZWN0aW9uX2Zyb21fZWxmX2luZGV4LgotCShiZmRfcHJzdGF0dXMpOiBSZXR1cm4gYm9vbGVhbiB2YWx1ZS4gIENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9tYWtlX3NlY3Rpb24uCi0JKGJmZF9mcHJlZ3NldCk6IExpa2V3aXNlLgotCShiZmRfcHJwc2luZm8pOiBSZXR1cm4gYm9vbGVhbiB2YWx1ZS4KLQkoZWxmX2NvcmVmaWxlX25vdGUpOiBDaGVjayByZXR1cm4gdmFsdWVzIG9mIGJmZF9wcnN0YXR1cywKLQliZmRfZnByZWdzZXQsIGFuZCBiZmRfcHJwc2luZm8uCi0JKGVsZl9jb3JlX2ZpbGVfcCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBlbGZfY29yZWZpbGVfbm90ZS4KLQotRnJpIEFwciAyMiAxMTowODozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlHZXQgcmlkIG9mIHRoZSBFQ09GRiAucmVnaW5mbyBzZWN0aW9uIGhhY2suCi0JKiBlY29mZi5jIChlY29mZl9ta29iamVjdF9ob29rKTogRG9uJ3QgY3JlYXRlIGEgLnJlZ2luZm8gc2VjdGlvbi4KLQkoZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IERvbid0IGhhbmRsZSB0aGUgLnJlZ2luZm8gc2VjdGlvbi4KLQkoZWNvZmZfc2l6ZW9mX2hlYWRlcnMpOiBMaWtld2lzZS4KLQkoZWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMpOiBMaWtld2lzZS4KLQkoZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDb3B5IHRoZSBHUCB2YWx1ZSBhbmQgdGhlCi0JcmVnaXN0ZXIgbWFza3MuCi0JKGJmZF9lY29mZl9nZXRfZ3BfdmFsdWUpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9lY29mZl9zZXRfZ3BfdmFsdWUpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9lY29mZl9zZXRfcmVnbWFza3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX2Vjb2ZmX2dldF9ncF92YWx1ZSk6IERlY2xhcmUuCi0JKGJmZF9lY29mZl9zZXRfZ3BfdmFsdWUpOiBEZWNsYXJlLgotCShiZmRfZWNvZmZfc2V0X3JlZ21hc2tzKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCUZpeCBFQ09GRiBvYmpjb3B5IHRvIGFjdHVhbGx5IGNvcHkgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCSogZWNvZmYuYyAoZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfZ2V0X2V4dHIpOiBBc3N1bWUgdGhhdCBhbnkgRUNPRkYgc3ltYm9sIHdpdGggbG9jYWwgY2xlYXIgaXMKLQlhbiBleHRlcm5hbCBzeW1ib2wsIHJhdGhlciB0aGFuIGNoZWNraW5nIHRoZSBzeW1ib2wgZmxhZ3MuICBPbmx5Ci0JY2hlY2sgdGhlIGZsYWdzIGZvciBub24tRUNPRkYgc3ltYm9scy4KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzKTogRG9uJ3QgY3Jhc2ggaWYgdGhlCi0Jb3V0cHV0X3NlY3Rpb24gZmllbGQgb2YgdGhlIHN5bWJvbCBzZWN0aW9uIGlzIE5VTEwuCi0JKiBsaWJlY29mZi5oIChlY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGVjbGFyZSBhcwotCWZ1bmN0aW9uIHJhdGhlciB0aGFuIGRlZmluaW5nIGFzIG1hY3JvLgotCi0JKiBpZWVlLmMgKGllZWVfb2JqZWN0X3ApOiBTZXQgYmZkX2Vycm9yX2dvdF93cm9uZ19mb3JtYXQgaWYKLQlhcHByb3ByaWF0ZS4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBiZmRfZWxmMzJfcG93ZXJwY192ZWMuCi0KLQkqIGFvdXQtYWRvYmUuYyAoYW91dF9hZG9iZV9zZXRfYXJjaF9tYWNoKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaC4gIEFjY2VwdCBiZmRfYXJjaF9tNjhrIGFzIHdlbGwgYXMKLQliZmRfYXJjaF91bmtub3duLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaC4KLQkqIGVsZmNvZGUuaCAoZWxmX3NldF9hcmNoX21hY2gpOiBEb24ndCBjaGVjayBhIGxpc3Qgb2YgRUxGCi0JYXJjaGl0ZWN0dXJlcywganVzdCBzZWUgaWYgdGhlIGRlc2lyZWQgYXJjaGl0ZWN0dXJlIG1hdGNoZXMgd2hhdAotCXRoZSBFTEYgYmFja2VuZCBwZXJtaXRzLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IFJlbmFtZSBTSE1BR0lDIHRvCi0JU0hfQVJDSF9NQUdJQyB0byBtYXRjaCBjaGFuZ2UgaW4gY29mZi9zaC5oLgotCShjb2ZmX3NldF9mbGFncyk6IExpa2V3aXNlLgotCi0JRm9sbG93IGNvbnZlbnRpb24gaW4gd2hpY2ggZWFjaCBOTE0gaGVhZGVyIGhhcyBhbiA4IGJ5dGUgc3RhbXAKLQlmb2xsb3dlZCBieSBhIGZvdXIgYnl0ZSBsZW5ndGguCi0JKiBsaWJubG0uaCAoc3RydWN0IG5sbV9vYmpfdGRhdGEpOiBSZW5hbWUgbmxtX2N5Z251c19zZWN0aW9uX2hkcgotCXRvIG5sbV9jeWdudXNfZXh0X2hlYWRlciwgYW5kIGNoYW5nZSB0eXBlIHRvCi0JTmxtX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyLgotCShubG1fY3lnbnVzX2V4dF9oZWFkZXIpOiBSZW5hbWUgZnJvbSBubG1fY3lnbnVzX3NlY3Rpb25faGVhZGVyLgotCSogbmxtY29kZS5oIChubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbik6IFVzZSBDeUduVXNFeCBpbnN0ZWFkCi0Jb2YgQ3lHblVzU2VDcy4gIFJlbmFtZSBmcm9tIGN5Z251c19zZWN0aW9uIHRvIGN5Z251c19leHQuICBSZXF1aXJlCi0JbGVuZ3RoIHdvcmQgdG8gYmUgOC4KLQkobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0KTogUmVuYW1lIGZyb20gY3lnbnVzX3NlY3Rpb24gdG8KLQljeWdudXNfZXh0LiAgU2V0IGxlbmd0aCB3b3JkIHRvIDguCi0JKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBSZW5hbWUgZnJvbSBjeWdudXNfc2VjdGlvbgotCXRvIGN5Z251c19leHQuCi0KLVRodSBBcHIgMjEgMjI6NTQ6MjIgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbik6ICBLZWVwIHNlY3Rpb24gdGFibGUKLQkoZnJvbSBDeUduVXNTZUNzKSBpbiBtb3JlIHBlcm1hbmVudCBtZW1vcnkgdG8ga2VlcCBzZWN0aW9uIG5hbWVzCi0JZnJvbSBnZXR0aW5nIHRyYXNoZWQuCi0KLVRodSBBcHIgMjEgMDk6Mjk6MzcgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBsaWJlbGYuaCAoZWxmX29ial90ZGF0YSk6ICBBZGQgbWVtYmVycyBmb3IgZHluYW1pYyBzeW1ib2wgdGFibGUKLQloYW5kbGluZy4KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIEhhbmRsZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBUYWtlIGFkZGl0aW9uYWwgcGFyYW1ldGVyCi0JdG8gc2VsZWN0IHN0YXRpYyBvciBkeW5hbWljIHN5bWJvbCB0YWJsZSBhbmQgcmV0dXJuIG51bWJlciBvZgotCXN5bWJvbHMgc2x1cnBlZCBvciAtMSBvbiBlcnJvci4KLQkqIGVsZmNvZGUuaCAoZWxmX2dldF9zeW10YWIpOiAgU2V0IGJmZCBzeW1jb3VudCBmcm9tCi0JZWxmX3NsdXJwX3N5bWJvbF90YWJsZSByZXN1bHQuCi0JKiBlbGZjb2RlLmggKGVsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQsCi0JZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6ICBOZXcgZnVuY3Rpb25zIHRvIGhhbmRsZSBkeW5hbWljCi0Jc3ltYm9sIHRhYmxlLgotCSogZWxmMzItdGFyZ2V0LmgsIGVsZjY0LXRhcmdldC5oIChCRkRfSlVNUF9UQUJMRV9EWU5BTUlDKToKLQlDaGFuZ2UgdG8gaGFuZGxlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBwcm92aWRlIGRlZmF1bHQgZGVmaW5pdGlvbnMKLQlmb3IgZHluYW1pYyByZWxvY3MuCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9zdGQsIE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19vdXQpLAotCU5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbiksIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCwKLQlhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6ICBIYW5kbGUgcl9qbXB0YWJsZSBhbmQgcl9yZWxhdGl2ZQotCXJlbG9jYXRpb25zLgotCi1UaHUgQXByIDIxIDExOjU4OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUNsZWFuIHVwIHVzZXMgb2YgX2JmZF9kdW1teV90YXJnZXQgKGZyb20gUGV0ZXIgU2NoYXVlcikuCi0JKiBsaWJiZmQuYyAoX2JmZF9kdW1teV90YXJnZXQpOiBTZXQgYmZkX2Vycm9yX3dyb25nX2Zvcm1hdC4KLQkqIG5sbS10YXJnZXQuaCAobmxtX2NvcmVfZmlsZV9wKTogRGVmaW5lIGFzIF9iZmRfZHVtbXlfdGFyZ2V0LCBub3QKLQlOVUxMLgotCSogc3JlYy5jIChzcmVjX3ZlYyk6IFVzZSBfYmZkX2R1bW15X3RhcmdldCwgbm90IE5VTEwsIGluCi0JX2JmZF9jaGVja19mb3JtYXQuCi0JKHN5bWJvbHNyZWNfdmVjKTogTGlrZXdpc2UuCi0JKiB0ZWtoZXguYyAodGVraGV4X3ZlYyk6IExpa2V3aXNlLgotCi0JKiBsaWJubG0uaCAoc3RydWN0IG5sbV9vYmpfdGRhdGEpOiBBZGQgbmxtX2N5Z251c19zZWN0aW9uX2hkcgotCWZpZWxkLgotCShubG1fY3lnbnVzX3NlY3Rpb25faGVhZGVyKTogTmV3IGFjY2Vzc29yIG1hY3JvLgotCSogbmxtY29kZS5oIChubG1fb2JqZWN0X3ApOiBGcmVlIG5ldyB0ZGF0YSBzdHJ1Y3R1cmUgaWYgZmFpbHVyZS4KLQlBZGQgZml4ZWQgc2VjdGlvbnMgYmVmb3JlIHN3YXBwaW5nIGluIGF1eGlsaWFyeSBoZWFkZXJzLiAgQWZ0ZXIKLQlhZGRpbmcgc2VjdGlvbnMsIHRyZWF0IGVycm9ycyBhcyByZWFsLCBub3QgYXMgd3JvbmcgZm9ybWF0LgotCShubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbik6IFN3YXAgaW4gdGhlIHNlY3Rpb25zIGhlYWRlcjsgYWRkCi0Jc2VjdGlvbnMgdG8gdGhlIEJGRCBmb3IgZWFjaCBzZWN0aW9uIGl0IGRlc2NyaWJlcy4KLQkobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0KTogU3dhcCBvdXQgdGhlIHNlY3Rpb25zIGhlYWRlci4KLQkobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFjY291bnQgZm9yIHRoZSBzaXplIG9mIHRoZQotCXNlY3Rpb25zIGhlYWRlci4KLQotV2VkIEFwciAyMCAxNjo0NTo1MSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb2ZmLXNwYXJjLmMgKHNwYXJjY29mZl92ZWMpOiBDaGFuZ2UgbWluaW11bSBhbGlnbm1lbnQgcG93ZXIgdG8KLQkyLCBzbyB0aGF0IHN0YWIgc2VjdGlvbnMgY2FuIGJlIG11bHRpcGxlcyBvZiA0IGJ5dGVzIG9ubHkuCi0KLQkqIGhvc3RzL2kzODZhaXguaDogQ2hhbmdlcyB0byBhdm9pZCBwcm90b3R5cGVzIGNvbmZsaWN0cyB3aXRoIHRoZQotCW9uZXMgZGVmaW5lZCBpbiBzdGRsaWIuaC4gIChGcm9tIE1pbmggVHJhbi1MZS4pCi0KLVdlZCBBcHIgMjAgMTQ6MTU6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG0zMi1wcGMuYzogQ29tcGxldGUgcmV3cml0ZSBmb3IgbmV3IHZlcnNpb24gb2YgUG93ZXJQQwotCU5ldFdhcmUuICBPbGQgY29kZSBzdGlsbCBwcmVzZW50LCBidXQgaWZkZWZmZWQgb3V0LgotCi0JKiBubG1jb2RlLmggKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luKTogRG9uJ3QgYXNzdW1lIGEKLQlwYXJ0aWN1bGFyIGZvcm1hdCBmb3IgdGhlIGN1c3RvbWVyIGhlYWRlci4gIEFsbG9jYXRlIGEgYmxvY2sgb2YKLQltZW1vcnkgYW5kIHJlYWQgaXQgaW50byB0aGF0LgotCShubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQpOiBXcml0ZSBvdXQgdGhlIGJsb2NrIG9mIG1lbW9yeS4KLQkobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEluY2x1ZGUgbGVuZ3RoIG9mIGN1c3RvbWVyCi0JaGVhZGVyIHdoZW4gY29tcHV0aW5nIGl0cyBzaXplLgotCi1Nb24gQXByIDE4IDE0OjI3OjE3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3ByZXBfaGVhZGVycyk6IEdldCB0aGUgc3BhY2UncyBudW1iZXIgZnJvbSB0aGUKLQliYWNrZW5kIHByaXZhdGUgc2VjdGlvbiBkYXRhIHJhdGhlciB0aGFuIHRhcmdldF9pbmRleC4KLQkoYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzKTogU3RvcmUgdGhlIHNwYWNlJ3MgbnVtYmVyCi0JaW4gdGhlIGJhY2tlbmQgcHJpdmF0ZSBzZWN0aW9uIGRhdGEgcmF0aGVyIHRoYW4gdGFyZ2V0X2luZGV4LgotCi0JKiBzb20uaCAoc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpOiBBZGQgc3BhY2VfbnVtYmVyLgotCi1GcmkgQXByIDE1IDEyOjIyOjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hMjlrLmMgKHJlbG9jX3Byb2Nlc3NpbmcpOiBBbHdheXMgc2V0IHRoZSBhZGRyZXNzIG9mIGEKLQlSX0lIQ09OU1QgcmVsb2MgdG8gdGhhdCBvZiB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIFJfSUhJSEFMRi4KLQlnYXMgZG9lcyB0aGlzIGFueWhvdywgYnV0IHNvbWUgb3RoZXIgYXNzZW1ibGVycyBzZWVtIHRvIGxlYXZlCi0JZ2FyYmFnZSBpbiB0aGUgUl9JSENPTlNUIGFkZHJlc3MgZmllbGQuCi0KLQkqIGJmZC9hcmNoaXZlLmM6IENvbnNpc3RlbnRseSB1c2UgQVJGTUFHOyBmcm9tCi0Jc2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlIChBbmRyZWFzIFNjaHdhYikuCi0JKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IFVzZSBBUkZNQUcgcmF0aGVyIHRoYW4gJ2AnIGFuZAotCSdcMDEyJy4KLQkoYnNkX3dyaXRlX2FybWFwKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfYXJtYXApOiBMaWtld2lzZS4KLQotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IFdoZW4gcmVsYXhpbmcsIGFkanVzdCBsb2NhbAotCXJlbG9jcyBhZ2FpbnN0IHRoZSAudGV4dCBzZWN0aW9uIGFzIHJlcXVpcmVkLgotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogV2hlbiByZWxheGluZywgYWRqdXN0Ci0JUERSIGFkZHJlc3NlcyBhcyByZXF1aXJlZC4KLQotCSogZWNvZmYuYyAoZWNvZmZfZW1pdF9hZ2dyZWdhdGUpOiBUYWtlIGZkciBhcmd1bWVudC4gIE1hcCBmZHIKLQlpbmRleCB0aHJvdWdoIHJmZCBtYXAgaWYgaXQgZXhpc3RzLiAgQ2hlY2sgZm9yIGEgY291cGxlIG9mIGNhc2VzCi0Jd2hpY2ggZ2RiIGhhbmRsZXMgc3BlY2lhbGx5LiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShlY29mZl90eXBlX3RvX3N0cmluZyk6IFRha2UgZmRyIGFyZ3VtZW50IHJhdGhlciB0aGFuIGF1eF9wdHIgYW5kCi0JYmlnZW5kaWFuIGFyZ3VtZW50LiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShlY29mZl9wcmludF9zeW1ib2wpOiBIYW5kbGUgc3RTdHJ1Y3QsIHN0VW5pb24gYW5kIHN0RW51bS4KLQotVGh1IEFwciAxNCAxMzowNToxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2hvd3RvX3RhYmxlKTogQWRkIGR1bW15IGVudHJpZXMgdG8gYWNjb3VudCBmb3IKLQludW1iZXJpbmcgY2hhbmdlcyBpbiBpbmNsdWRlL2NvZmYvbWlwcy5oLiAgQWRkIGVudHJpZXMgZm9yCi0JTUlQU19SX1JFTEhJIGFuZCBNSVBTX1JfUkVMTE8uCi0JKG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbik6IEhhbmRsZSBhbiBleHRyYSBiaXQgZm9yIHRoZSByZWxvYyB0eXBlCi0Jd2hlbiBsaXR0bGUgZW5kaWFuLiAgVHJlYXQgaW50ZXJuYWwgTUlQU19SX1JFTExPIG9yIE1JUFNfUl9SRUxISQotCXJlbG9jcyBsaWtlIE1JUFNfUl9TV0lUQ0gsIGFuZCBjb252ZXJ0IHJfb2Zmc2V0IGZyb20gMjQgdG8gMzIKLQliaXRzLgotCShtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCi0JKG1pcHNfYWRqdXN0X3JlbG9jX2luKTogSGFuZGxlIGludGVybmFsIE1JUFNfUl9SRUxMTyBvcgotCU1JUFNfUl9SRUxISSByZWxvY3MgbGlrZSBNSVBTX1JfU1dJVENILgotCShtaXBzX2FkanVzdF9yZWxvY19vdXQpOiBMaWtld2lzZS4KLQkobWlwc19yZWxoaV9hZGRyLCBtaXBzX3JlbGhpX2FkZGVuZCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShtaXBzX3JlbGhpX3JlbG9jLCBtaXBzX3JlbGxvX3JlbG9jKTogTmV3IGZ1bmN0aW9ucy4KLQkobWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBUdXJuIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MgaW50bwotCU1JUFNfUl9SRUxISSBhbmQgdHVybiBCRkRfUkVMT0NfUENSRUxfTE8xNiBpbnRvIE1JUFNfUl9SRUxMTy4KLQkobWlwc19yZWxvY2F0ZV9oaSk6IFJlbmFtZSBmcm9tIG1pcHNfcmVsb2NhdGVfcmVmaGksIGFuZCBhZGQgcGNyZWwKLQlhcmd1bWVudC4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbmFtZSBnb3RfcmVmbG8gdG8gZ290X2xvIGFuZAotCXJlZmxvX2ludF9yZWwgdG8gbG9faW50X3JlbC4gIEhhbmRsZSBNSVBTX1JfUkVMTE8gYW5kIE1JUFNfUl9SRUxISQotCXJlbG9jcy4KLQkobWlwc19yZWxheF9zZWN0aW9uKTogQWRqdXN0IE1JUFNfUl9SRUxISS9NSVBTX1JfUkVMTE8gcGFpcnMgd2hlbgotCWV4cGFuZGluZyBhIFBDIHJlbGF0aXZlIGNhbGwuCi0KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSk6IEFkZCBCRkRfUkVMT0NfUENSRUxfSEkxNl9TCi0JYW5kIEJGRF9SRUxPQ19QQ1JFTF9MTzE2LgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1XZWQgQXByIDEzIDExOjUwOjA3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29mZi1zcGFyYy5jIChzcGFyY2NvZmZfdmVjKTogU2V0IG1pbmltdW0gYWxpZ25tZW50IHBvd2VyIHRvIDMuCi0KLVR1ZSBBcHIgMTIgMTM6MzY6MjAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfZml4dXBzKTogQWx3YXlzIGVtaXQgYXQgbGVhc3QKLSAgICAgICAgb25lIHJlbG9jYXRpb24gZm9yIGFueSBub24tYnNzIHNlY3Rpb24uCi0KLU1vbiBBcHIgMTEgMTQ6NDE6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogRG9uJ3QgcmVxdWlyZQotCXRoZSBmaWxlIGFsaWdubWVudCB0byBjb3JyZXNwb25kIHRvIHRoZSBwYWdlIHNpemUgd2hlbiBsaW5raW5nCi0Jd2l0aCAtTi4KLQotU3VuIEFwciAxMCAwMTowMjoyNCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmY29kZS5oICh3cml0ZV9yZWxvY3MpOiBGb3IgcmVsYSByZWxvY2F0aW9ucywgYWRqdXN0IHRoZQotCWFkZGVuZCBmb3IgcmVsb2NhdGlvbnMgaW52b2x2aW5nIHNlY3Rpb24gc3ltYm9scyB0byBhY2NvdW50Ci0JZm9yIHRoZSBsb3NzYWdlIG9mIDE6MSBtYXBwaW5nIGZyb20gaW5wdXQgc2VjdGlvbiBzeW1ib2xzIHRvCi0Jb3V0cHV0IHNlY3Rpb24gc3ltYm9scy4KLQotRnJpIEFwciAgOCAxMjoyMjowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSk6IE5ldyBmdW5jdGlvbi4KLQkoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBDYWxsIE5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKQotCXJhdGhlciB0aGFuIG1ha2luZyBzZWN0aW9ucyBpbmxpbmUuCi0JKE5BTUUoYW91dCxta29iamVjdCkpOiBEb24ndCBtYWtlIGFueSBzZWN0aW9ucy4KLQkoTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykpOiBDYWxsIE5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKS4KLQkoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogRG9uJ3QgZGVyZWZlcmVuY2Ugb2JqX3RleHRzZWMgKGFiZmQpIG9yCi0Jb2JqX2RhdGFzZWMgKGFiZmQpIGlmIHRoZXkgYXJlIE5VTEwuCi0JKiBsaWJhb3V0LmggKE5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSk6IERlY2xhcmUuCi0JKiBib3V0LmMgKGJfb3V0X21rb2JqZWN0KTogRG9uJ3QgbWFrZSBhbnkgc2VjdGlvbnMuCi0JKGJfb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgYW91dF8zMl9tYWtlX3NlY3Rpb25zLgotCShiX291dF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCSogaTM4Nm9zOWsuYyAob3M5a19ta29iamVjdCk6IERvbid0IG1ha2UgYW55IHNlY3Rpb25zLgotCShvczlrX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgYW91dF8zMl9tYWtlX3NlY3Rpb25zLgotCShvczlrX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxuZXdfc2VjdGlvbl9ob29rKSk6IERvbid0IHNldCBOX0VYVCBpbiB0YXJnZXQKLQlpbmRleC4KLQotV2VkIEFwciAgNiAyMDo0NDo1NiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5ob3N0OiAgQWRkIG1pcHMtKi1zeXN2NCogc3VwcG9ydC4KLQotVGh1IEFwciAgNyAxNDoyMzowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2hvd3RvX3RhYmxlKTogQWRkIGVudHJ5IGZvciBNSVBTX1JfU1dJVENILgotCShtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4pOiBGb3IgTUlQU19SX1NXVElDSCwgY29weSByX3N5bW5keCBpbnRvCi0Jcl9vZmZzZXQgYW5kIHNldCByX3N5bW5keCB0byBSRUxPQ19TRUNUSU9OX1RFWFQuCi0JKG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQpOiBGb3IgTUlQU19SX1NXSVRDSCwgZ2V0IHRoZSByX3N5bW5keAotCXZhbHVlIGZyb20gdGhlIHJfb2Zmc2V0IGZpZWxkLgotCShtaXBzX2FkanVzdF9yZWxvY19pbik6IE1heGltdW0gcl90eXBlIHZhbHVlIGlzIG5vdyBNSVBTX1JfU1dJVENILgotCUZvciBNSVBTX1JfU1dJVENILCBjb3B5IHRoZSByX29mZnNldCBmaWVsZCBpbnRvIHRoZSBhZGRlbmQgZmllbGQuCi0JKG1pcHNfYWRqdXN0X3JlbG9jX291dCk6IEZvciBNSVBTX1JfU1dJVENILCBjb3B5IHRoZSBhZGRlbmQgZmllbGQKLQlpbnRvIHRoZSByX29mZnNldCBmaWVsZC4KLQkobWlwc19zd2l0Y2hfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogVHJhbnNsYXRlIEJGRF9SRUxPQ19HUFJFTDMyIGludG8KLQlNSVBTX1JfU1dJVENILgotCShtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgTUlQU19SX1NXSVRDSC4KLQkobWlwc19yZWxheF9zZWN0aW9uKTogQWRqdXN0IE1JUFNfUl9TV0lUQ0ggb2Zmc2V0IGlmIG5lY2Vzc2FyeS4KLQotVGh1IEFwciAgNyAxMToxMDo1MSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmY29kZS5oIChlbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTdXBwb3J0IGNhbGxpbmcgdGhlIGJhY2tlbmQKLQlmdW5jdGlvbiBlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nIHdoZW4ganVzdCBiZWdpbm5pbmcgdG8KLQl3cml0ZSBhbiBvYmplY3QgZmlsZS4KLQotCSogbGliZWxmLmggKGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpOiBEZWNsYXJlLgotCi0JKiBlbGZ7MzIsNjR9LXRhcmdldC5oIChlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKTogUHJvdmlkZQotCWEgZGVmYXVsdCBkZWZpbml0aW9uLgotCShlbGZ7MzIsNjR9X2JlZCk6IEFkZCBlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nLgotCQotCSogZWxmMzItaHBwYS5oIChlbGZfaHBwYV90Y19zeW1ib2wpOiBEZWxldGUgZXh0ZXJuIGRlY2xhcmF0aW9uLgotCShlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLWhwcGEuYyAoc3ltZXh0X2NoYWluX2J1aWx0KTogRGVsZXRlLgotCShzeW1leHRfY2hhaW5fc2l6ZSk6IFJlbmFtZWQgZnJvbSBzeW1leHRuX2NvbnRlbnRzX3JlYWxfc2l6ZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3tiZWdpbixmaW5hbH1fd3JpdGVfcHJvY2Vzc2luZyk6IE5ldyBmdW5jdGlvbnMuCi0JKGFkZF9lbnRyeV90b19zeW1leHRfY2hhaW4pOiBOZXcgZnVuY3Rpb24uCi0JKGhwcGFfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogSWdub3JlIHdyaXRlcyB0byB0aGUgc3ltYm9sIGV4dGVuc2lvbgotCXNlY3Rpb24gdW50aWwgaXQncyBiZWVuIHJlYnVpbHQgaW50ZXJuYWxseS4KLQkoaHBwYV9lbGZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBTeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gaXMgbm8KLQlsb25nZXIgc3BlY2lhbC4KLQkoZWxmX2JhY2tlbmRfe2JlZ2luLGZpbmFsfV93cml0ZV9wcm9jZXNzaW5nKTogRGVmaW5lLgotCShlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogU2ltcGxpZnkgbm93IHRoYXQgbXVjaCBjb2RlIGhhcwotCW1pZ3JhdGVkIGludG8gZWxmMzJfaHBwYV9iYWNrZW5kX3tiZWluZyxmaW5hbH1fd3JpdGVfcHJvY2Vzc2luZy4KLQotV2VkIEFwciAgNiAxNzoyNDoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGQgbmV3IHRhcmdldCB2ZWN0b3JzIHRvIHJlYWQgdGhlIGR5bmFtaWMgc3ltYm9scyBhbmQgZHluYW1pYwotCXJlbG9jcy4gIENoYW5nZSBhLm91dCB0byB1c2UgdGhlc2UgcmF0aGVyIHRoYW4gcmVhZGluZyB0aGUgZHluYW1pYwotCXN5bWJvbHMgYW5kIHJlbG9jcyBhbG9uZyB3aXRoIHRoZSBub3JtYWwgc3ltYm9scyBhbmQgcmVsb2NzLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIGZpZWxkcwotCV9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kLAotCV9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiLAotCV9iZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQsCi0JX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYy4KLQkoQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyk6IERlZmluZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOgotCURlZmluZS4KLQkoX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogRGVmaW5lLgotCShfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IERlZmluZS4KLQkoX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBEZWZpbmUuCi0JKiBiZmQuYyAoYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IERlZmluZS4KLQkoYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IERlZmluZS4KLQkoYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogRGVmaW5lLgotCShiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBEZWZpbmUuCi0JKiBzdW5vcy5jIChNWV9yZWFkX2R5bmFtaWNfc3ltYm9scyk6IERvbid0IGRlZmluZS4KLQkoTVlfcmVhZF9keW5hbWljX3JlbG9jcyk6IERvbid0IGRlZmluZS4KLQkoTVlfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKTogRGVmaW5lLgotCShNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBEZWZpbmUuCi0JKE1ZX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogRGVmaW5lLgotCShNWV9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IERlZmluZS4KLQkoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyk6IENoYW5nZSB0eXBlIG9mIGR5bnN5bV9jb3VudCBhbmQKLQlkeW5yZWxfY291bnQgdG8gbG9uZy4gIEFkZCBmaWVsZHMgY2Fub25pY2FsX2R5bnN5bSBhbmQKLQljYW5vbmljYWxfZHlucmVsLgotCShzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyk6IENoZWNrIHRoYXQgQkZEIGhhZCBEWU5BTUlDIGZsYWcgc2V0LgotCUNsZWFyIGluZm8tPmNhbm9uaWNhbF9keW5zeW0gYW5kIGluZm8tPmNhbm9uaWNhbF9keW5yZWwuCi0JKE1ZKHJlYWRfZHluYW1pY19zeW1ib2xzKSk6IFJlbW92ZWQuCi0JKE1ZKHJlYWRfZHluYW1pY19yZWxvY3MpKTogUmVtb3ZlZC4KLQkoc3Vub3NfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKTogTmV3IGZ1bmN0aW9uLgotCShzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBOZXcgZnVuY3Rpb24uCi0JKHN1bm9zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogTmV3IGZ1bmN0aW9uLgotCShzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmFvdXQuaDogRGVjbGFyZSBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsIGFuZAotCXJlbG9jX3N0ZF9leHRlcm5hbCB0byBhdm9pZCBwcm90b3R5cGUgcHJvYmxlbXMuCi0JKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IFJlbW92ZSBmaWVsZHMgcmVhZF9keW5hbWljX3N5bWJvbHMgYW5kCi0JcmVhZF9keW5hbWljX3JlbG9jcy4KLQkoTkFNRShhb3V0LHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpKTogRGVjbGFyZS4KLQkoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSk6IERlY2xhcmUuCi0JKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikpOiBEZWNsYXJlLgotCSogYW91dHguaCAoTkFNRShhb3V0LHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpKTogUmVuYW1lZCBmcm9tCi0JdHJhbnNsYXRlX3N5bWJvbF90YWJsZSBhbmQgbWFkZSBub24tc3RhdGljLiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiBEb24ndCByZWFkIGR5bmFtaWMgc3ltYm9scy4KLQkoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IERvbid0IHJlYWQgZHluYW1pYyByZWxvY3MuCi0JKE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpKTogRG9uJ3QgY291bnQgZHluYW1pYyByZWxvY3MuCi0JKiBhb3V0ZjEuaCAoYW91dF8zMl9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgYm90aGVyIHRvCi0JcmVtb3ZlIGR5bmFtaWMgc3ltYm9scyBhbmQgcmVsb2NzLiAgVGhleSB3aWxsIG5vIGxvbmdlciBiZQotCXByZXNlbnQuCi0JKE1ZX3JlYWRfZHluYW1pY19zeW1ib2xzKTogRG9uJ3QgZGVmaW5lLgotCShNWV9yZWFkX2R5bmFtaWNfcmVsb2NzKTogRG9uJ3QgZGVmaW5lLgotCShzdW5vczRfYW91dF9iYWNrZW5kKTogRG9uJ3QgaW5pdGlhbGl6ZSBkeW5hbWljIGVudHJ5IHBvaW50cy4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX3JlYWRfZHluYW1pY19zeW1ib2xzKTogRG9uJ3QgZGVmaW5lLgotCShNWV9yZWFkX2R5bmFtaWNfcmVsb2NzKTogRG9uJ3QgZGVmaW5lLgotCShNWShiYWNrZW5kX2RhdGEpKTogRG9uJ3QgaW5pdGlhbGl6ZSBkeW5hbWljIGVudHJ5IHBvaW50cy4KLQkoTVlfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSB0bwotCV9iZmRfbm9keW5hbWljIHZlcnNpb24uCi0JKE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IExpa2V3aXNlLgotCShNWV9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShNWV9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IExpa2V3aXNlLgotCSogQWxsIGJhY2tlbmRzOiBBZGRlZCBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIHRvIHRhcmdldCB2ZWN0b3IuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotCSogY2YtbTY4a2x5bnguYzogSW5jbHVkZSBzeXNkZXAuaC4KLQotCSogaHAzMDBocHV4LmM6IFJlbW92ZWQgc29tZSBzcGFjZXMgaW4gdXNlcyBvZiBOQU1FIHRvIGF2b2lkCi0JcHJvYmxlbXMgd2l0aCB0cmFkaXRpb25hbCBDIGNvbXBpbGVycy4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogUmVhcnJhbmdlZCBmaWVsZHMgaW4gdGFyZ2V0IHZlY3Rvci4KLQlSZW1vdmVkIF9iZmRfZGVidWdfaW5mb19zdGFydCwgX2JmZF9kZWJ1Z19pbmZvX2VuZCBhbmQKLQlfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZSwgd2hpY2ggd2VyZSBuZXZlciB1c2VkLgotCShCRkRfSlVNUF9UQUJMRV9HRU5FUklDLCBCRkRfSlVNUF9UQUJMRV9DT1BZKTogRGVmaW5lZC4KLQkoQkZEX0pVTVBfVEFCTEVfQ09SRSwgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSk6IERlZmluZWQuCi0JKEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMsIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyk6IERlZmluZWQuCi0JKEJGRF9KVU1QX1RBQkxFX1dSSVRFLCBCRkRfSlVNUF9UQUJMRV9MSU5LKTogRGVmaW5lZC4KLQkqIEFsbCBiYWNrZW5kczogQ2hhbmdlZCB0byB1c2UgdGhlIG5ldyBCRkRfSlVNUF9UQUJMRV8qIG1hY3JvcwotCXJhdGhlciB0aGFuIHRoZSBzaW5nbGUgSlVNUF9UQUJMRSBtYWNyby4gIFJlbW92ZWQgbWFueSBvZiB0aGUKLQl3ZWlyZCBtYWNybyBkZWZpbml0aW9ucyBuZWVkZWQgdG8gc3VwcG9ydCB0aGUgbW9ub2xpdGhpYwotCUpVTVBfVEFCTEUuCi0JKiBiZmQtaW4uaCAoSlVNUF9UQUJMRSk6IFJlbW92ZWQuCi0JKiBsaWJiZmQtaW4uaDogRGVmaW5lIGEgYnVuY2ggb2YgbWFjcm9zLCBhbmQgZGVjbGFyZSBhIGZldwotCWZ1bmN0aW9ucywgZm9yIHVzZSB3aXRoIHRoZSBuZXcgQkZEX0pVTVBfVEFCTEVfKiBtYWNyb3MuCi0JKiBsaWJiZmQuYyAoX2JmZF9kdW1teV9uZXdfc2VjdGlvbl9ob29rKTogUmVtb3ZlZC4KLQkoYmZkX2ZhbHNlKTogU2V0IGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbi4KLQkoYmZkX251bGx2b2lkcHRyKTogTGlrZXdpc2UuCi0JKGJmZF9uMSk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9ub2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKTogUmVuYW1lZCBmcm9tCi0JX2JmZF9kdW1teV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AuCi0JKF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpOiBTaW1pbGFyIHJlbmFtZS4gIFNldAotCWJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbi4KLQkoX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKTogTGlrZXdpc2UuCi0JKF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cyk6IFJlbmFtZWQgZnJvbQotCWJmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzLiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkoX2JmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU2ltaWxhciByZW5hbWUuCi0JKiBpZWVlLmM6ICNpZiAwIG91dCBpZWVlX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0LAotCWllZWVfYmZkX2RlYnVnX2luZm9fZW5kLCBpZWVlX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUuICBUaGV5Ci0Jd2VyZSBuZXZlciBjYWxsZWQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotVHVlIEFwciAgNSAyMjoxMDowNCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogQ3J1ZGUgc3VwcG9ydCBmb3IgZXhhbWluaW5nIGR5bmFtaWMgbGlicmFyaWVzLgotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBTZXQgRFlOQU1JQyBmbGFnIGZvciBTSExfTUFHSUMgYW5kCi0JRExfTUFHSUMgb2JqZWN0cy4KLQkoc29tX3ByZXBfaGVhZGVycyk6IFByZXNlcnZlIHRoZSBzeXN0ZW1faWQgZm9yIERZTkFNSUMgb2JqZWN0cy4KLQlVc2UgU0hMX01BR0lDIGFzIHRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIERZTkFNSUMgZmxhZyBpcyBzZXQuCi0JV3JpdGUgZXhlYyBoZWFkZXJzIGZvciBEWU5BTUlDIG9iamVjdHMuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogRFlOQU1JQyBvYmplY3RzIGhhdmUgdGhlIHNhbWUgYWxpZ25tZW50Ci0JcmVzdHJpY3Rpb25zIGFzIERfUEFHRUQgb2JqZWN0cy4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogVHJlYXQgRFlOQU1JQyBvYmplY3RzIGxpa2UgRVhFQ19QCi0Jb2JqZWN0cy4KLQkob2JqZWN0X2ZsYWdzKTogQWRkIERZTkFNSUMuCi0KLVR1ZSBBcHIgIDUgMTc6NDg6NTIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBpMzg2bHlueC5jLCBzcGFyY2x5bnguYyAoTkFNRSk6IFJlbW92ZSBlbWJlZGRlZCB3aGl0ZXNwYWNlIGluCi0JbWFjcm8gdXNlcywgY29uZnVzZXMgc29tZSBub24tQU5TSSBjb21waWxlcnMuCi0KLVR1ZSBBcHIgIDUgMTU6NTA6MDEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBBZGQgbWlzc2luZyBQQVJBTVMgZGVjbC4KLQlEb24ndCBmcmVlIGFueXRoaW5nIGlmIHdlIGRvbid0IGhhdmUgYSBiZmRfb2JqZWN0LgotCShzb21fY2xvc2VfYW5kX2NsZWFudXApOiBDYWxsIHNvbV9iZmRfZnJlZV9jYWNoZWRfaW5mby4KLQotVHVlIEFwciAgNSAxMToyMjozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IERvbid0IHJlbW92ZSBlbXB0eSBzZWN0aW9ucy4KLQlJdCB0dXJucyBvdXQgbm90IHRvIGJlIHJlcXVpcmVkIG9uIElyaXggNSwgYW5kIGl0IGNhdXNlcyBwcm9ibGVtcwotCWlmIHRoZSBzZWN0aW9ucyBoYXBwZW4gdG8gY29udGFpbiBzeW1ib2xzLgotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3NoZHJzX2FuZF9laGRyKTogQ29ycmVjdCBiZmRfd3JpdGUgY2hlY2suCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxjYW5vbmljYWxpemVfcmVsb2MpKTogRG9uJ3QgZXJyb3Igb3V0IGlmCi0Jc2VjdGlvbi0+cmVsb2NhdGlvbiBpcyBOVUxMOyBtYWxsb2MgbWlnaHQgaGF2ZSByZXR1cm5lZCBOVUxMIHdoZW4KLQlnaXZlbiBhIHplcm8gc2l6ZSBpZiB0aGVyZSB3ZXJlIG5vIHJlbG9jYXRpb25zLgotCSogYm91dC5jIChiX291dF9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChlY29mZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogbWlwc2JzZC5jIChNWShjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCi0JKiBpMzg2bHlueC5jIChOQU1FKGx5bngsY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCSogbmxtY29kZS5oIChubG1fY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBzb20uYyAoc29tX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogaHAzMDBocHV4LmMgKE1ZKHNsdXJwX3JlbG9jX3RhYmxlKSk6IExpa2V3aXNlLiAgQWxzbywgaWYgbWFsbG9jCi0JcmV0dXJucyBOVUxMLCBkb24ndCByZXBvcnQgYW4gZXJyb3IgaWYgd2UgYXNrZWQgZm9yIHplcm8gYnl0ZXMuCi0JKiBpMzg2bHlueC5jIChOQU1FKGx5bngsc2x1cnBfcmVsb2NfdGFibGUpKTogSWYgbWFsbG9jIHJldHVybnMKLQlOVUxMLCBkb24ndCByZXBvcnQgYW4gZXJyb3IgaWYgd2UgYXNrZWQgZm9yIHplcm8gYnl0ZXMuCi0JKiBubG1jb2RlLmggKG5sbV9zbHVycF9yZWxvY19maXh1cHMpOiBMaWtld2lzZS4KLQotTW9uIEFwciAgNCAxNTozMDo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxiZmRfZnJlZV9jYWNoZWRfaW5mbykpOiBEb24ndCBmcmVlIGFueXRoaW5nCi0JaWYgd2UgZG9uJ3QgaGF2ZSBhIGJmZF9vYmplY3QuCi0KLQlNYWRlIHN1cmUgdGhhdCBldmVyeSBjYWxsIHRvIGJmZF9yZWFkLCBiZmRfd3JpdGUsIGFuZCBiZmRfc2VlawotCWNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIGFuZCBoYW5kbGVkIGJmZF9lcnJvciBjb3JyZWN0bHkuICBUaGVzZQotCWNoYW5nZXMgYXJlIG5vdCBpdGVtaXNlZC4gIEFsc286Ci0JKiBhb3V0eC5oIChlbWl0X3N0cnRhYik6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLCBhbmQgcmV0dXJuCi0JZXJyb3JzLgotCShOQU1FKGFvdXQsd3JpdGVfc3ltcykpOiBDaGVjayBlbWl0X3N0cnRhYiByZXR1cm4gdmFsdWUuCi0JKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9yZWxvY3MpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbiwKLQlhbmQgcmV0dXJuIGVycm9ycy4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayBjb2ZmX3dyaXRlX3JlbG9jcyByZXR1cm4KLQl2YWx1ZS4KLQkqIGkzODZvczlrLmMgKG9zOWtfc3dhcF9leGVjX2hlYWRlcl9pbik6IENoYW5nZSByZXR1cm4gdHlwZSB0bwotCWJvb2xlYW4uCi0JKG9zOWtfb2JqZWN0X3ApOiBDaGVjayBvczlrX3N3YXBfZXhlY19oZWFkZXJfaW4gcmV0dXJuIHZhbHVlLgotCSogb2FzeXMuYyAob2FzeXNfcmVhZF9yZWNvcmQpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4KLQkob2FzeXNfc2x1cnBfc3ltYm9sX3RhYmxlOiBDaGVjayBvYXN5c19yZWFkX3JlY29yZCByZXR1cm4gdmFsdWUuCi0JKG9hc3lzX29iamVjdF9wLCBvYXN5c19zbHVycF9zZWN0aW9uX2RhdGEpOiBMaWtld2lzZS4KLQkob2FzeXNfd3JpdGVfcmVjb3JkKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JKG9hc3lzX3dyaXRlX3N5bXMpOiBMaWtld2lzZS4gIEFsc28sIGNoZWNrIG9hc3lzX3dyaXRlX3JlY29yZAotCXJldHVybiB2YWx1ZS4KLQkob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBDaGVjayBvYXN5c193cml0ZV9yZWNvcmQgcmV0dXJuIHZhbHVlLgotCShvYXN5c193cml0ZV9oZWFkZXIpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4gIENoZWNrCi0Jb2FzeXNfd3JpdGVfcmVjb3JkIHJldHVybiB2YWx1ZS4KLQkob2FzeXNfd3JpdGVfZW5kLCBvYXN5c193cml0ZV9kYXRhKTogTGlrZXdpc2UuCi0JKG9hc3lzX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZXMgb2YKLQlvYXN5c193cml0ZV9oZWFkZXIsIG9hc3lzX3dyaXRlX3N5bXMsIG9hc3lzX3dyaXRlX2RhdGEsIGFuZAotCW9hc3lzX3dyaXRlX2VuZC4KLQkqIHNyZWMuYyAoc3JlY193cml0ZV9yZWNvcmQpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4KLQkoc3JlY193cml0ZV9oZWFkZXIpOiBMaWtld2lzZS4gIEFsc28sIGNoZWNrIHNyZWNfd3JpdGVfcmVjb3JkCi0JcmV0dXJuIHZhbHVlLgotCShzcmVjX3dyaXRlX3NlY3Rpb24sIHNyZWNfd3JpdGVfdGVybWluYXRvcik6IExpa2V3aXNlLgotCShzcmVjX3dyaXRlX3N5bWJvbHMpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4KLQkoaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQlzcmVjX3dyaXRlX3N5bWJvbHMsIHNyZWNfd3JpdGVfaGVhZGVyLCBzcmVjX3dyaXRlX3NlY3Rpb24sIGFuZAotCXNyZWNfd3JpdGVfdGVybWluYXRvci4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi1Nb24gQXByICA0IDEwOjU2OjQ1IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogYWl4Mzg2LWNvcmUuYyAoYWl4Mzg2X2JmZF9pc19sb2NhbF9sYWJlbCk6ICBDb3JyZWN0IGNhc3QgZnJvbQotCWFzZWN0aW9uIHRvIGFzeW1ib2wuCi0JKiBwdHJhY2UtY29yZS5jIChwdHJhY2VfdW5peF9iZmRfaXNfbG9jYWxfbGFiZWwpOiAgQ29ycmVjdCBjYXN0IGZyb20KLQliZmQgdG8gYXN5bWJvbC4KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfYmZkX2lzX2xvY2FsX2xhYmVsKTogIENvcnJlY3QgY2FzdCBmcm9tCi0JYXNlY3Rpb24gdG8gYXN5bWJvbC4KLQotU3VuIEFwciAgMyAxODoyNzoyOSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zbHVycF9zdHJpbmdfdGFibGUpOiBVc2UgbWFsbG9jIHRvIGFsbG9jYXRlIHNwYWNlCi0JZm9yIHRoZSBjYWNoZWQgY29weSBvZiB0aGUgbmF0aXZlIHN0cmluZyB0YWJsZS4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IExpa2V3aXNlIGZvciB0aGUgbmF0aXZlIHN5bWJvbCB0YWJsZS4KLQkoc29tX3NsdXJwX3JlbG9jX3RhYmxlKTogTGlrZXdpc2UgZm9yIHRoZSBuYXRpdmUgYW5kIGdlbmVyaWMKLQlyZWxvY2F0aW9uIHRhYmxlcy4KLQkoc29tX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogRnJlZSB0aGUgY2FjaGVkIG5hdGl2ZSBzdHJpbmdzLAotCXN5bWJvbHMsIGFuZCByZWxvY2F0aW9ucy4gIEFsc28gZnJlZSB0aGUgY2Fub25pY2FsIGNhY2hlZAotCXJlbG9jYXRpb25zLgotCi1GcmkgQXByICAxIDEyOjQwOjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBJZiBrZWVwX21lbW9yeSBpcyBmYWxzZSwgbWFrZQotCXN1cmUgdGhlIHN5bWJvbCBuYW1lIGlzIHN0b3JlZCBpbiBwZXJtYW5lbnQgbWVtb3J5IGJlZm9yZSBhZGRpbmcKLQlpdCB0byB0aGUgc3RyaW5nIHRhYmxlLgotCi0JKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IE9uY2Ugd2UndmUgZm91bmQgYW4KLQlvYmplY3QsIGRvbid0IGJvdGhlciB0byBsb29rIGZvciBtb3JlIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0bwotCWJ1aWxkIGEgbWFwLgotCShjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IEFmdGVyIGFkZGluZyB0aGUgc3ltYm9scyBmb3IgYSBCRkQsCi0JY2FsbCBiZmRfZnJlZV9jYWNoZWRfaW5mbyBvbiBpdC4KLQotCUFkZCBiZmRfZnJlZV9jYWNoZWRfaW5mbyBzdXBwb3J0IHRvIGEub3V0IGJhY2tlbmRzLgotCSogYW91dHguaCAoYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IFJlbmFtZWQgZnJvbQotCWFvdXRfbGlua19nZXRfc3ltYm9scy4gIFJlYWQgc3RyaW5ncyBldmVuIGlmIHN5bWJvbHMgaGF2ZSBiZWVuCi0JcmVhZC4gIFN0b3JlIHN0cmluZyBzaXplIGluIG9ial9hb3V0X3N0cmluZ19zaXplLgotCShOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSk6IENhbGwgYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyB0bwotCXJlYWQgdGhlIHN5bWJvbHMuICBBbGxvY2F0ZSB0aGUgY2FjaGVkIHN5bWJvbHMgd2l0aCBtYWxsb2MsIG5vdAotCWJmZF9hbGxvYy4KLQkoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IEFsbG9jYXRlIHRoZSBjYWNoZWQgcmVsb2NzIHdpdGgKLQltYWxsb2MsIG5vdCBiZmRfYWxsb2MuCi0JKE5BTUUoYW91dCxiZmRfZnJlZV9jYWNoZWRfaW5mbykpOiBOZXcgZnVuY3Rpb247IGZyZWUgY2FjaGVkCi0Jc3ltYm9scyBhbmQgcmVsb2NzLgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiBBZGQgZXh0ZXJuYWxfc3RyaW5nX3NpemUgZmllbGQuCi0JKG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ19zaXplKTogTmV3IGFjY2Vzc29yIG1hY3JvLgotCShOQU1FKGFvdXQsY2xvc2VfYW5kX2NsZWFudXApKTogRG9uJ3QgZGVjbGFyZS4KLQkoTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKSk6IERlY2xhcmUuCi0JKGFvdXRfMzJfY2xvc2VfYW5kX2NsZWFudXApOiBEb24ndCBkZWZpbmUuCi0JKGFvdXRfNjRfY2xvc2VfYW5kX2NsZWFudXApOiBEb24ndCBkZWZpbmUuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IElmIG5vdCBhbHJlYWR5IGRlZmluZWQsCi0JZGVmaW5lIGFzIE5BTUUoYW91dCxmcmVlX2NhY2hlZF9pbmZvKS4KLQkoTVlfY2xvc2VfYW5kX2NsZWFudXApOiBJZiBub3QgYWxyZWFkeSBkZWZpbmVkLCBkZWZpbmUgYXMKLQlNWV9iZmRfZnJlZV9jYWNoZWRfaW5mby4KLQkqIGFvdXQtYWRvYmUuYyAoYW91dF8zMl9jbG9zZV9hbmRfY2xlYW51cCk6IERlZmluZS4KLQkoYW91dF8zMl9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IERvbid0IGRlZmluZS4KLQkqIGJvdXQuYyAoYW91dF8zMl9jbG9zZV9hbmRfY2xlYW51cCk6IERlZmluZS4KLQkoYW91dF8zMl9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IERvbid0IGRlZmluZS4KLQkqIGhwMzAwaHB1eC5jIChNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IERlZmluZSBhcyBiZmRfdHJ1ZS4KLQkoTVlfY2xvc2VfYW5kX2NsZWFudXApOiBEb24ndCBkZWZpbmUuCi0JKiBpMzg2bHlueC5jIChOQU1FKGx5bngsc2x1cnBfcmVsb2NfdGFibGUpKTogQWxsb2NhdGUgdGhlIGNhY2hlZAotCXJlbG9jcyB3aXRoIG1hbGxvYywgbm90IGJmZF9hbGxvYy4KLQkqIGkzODZvczlrLmMgKGFvdXRfMzJfY2xvc2VfYW5kX2NsZWFudXApOiBEZWZpbmUuCi0JKGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEb24ndCBkZWZpbmUuCi0KLQlBZGQgYSBuZXcgZW50cnkgcG9pbnQgdG8gZnJlZSBtZW1vcnkgY2FjaGVkIGJ5IGEgQkZELgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIF9iZmRfZnJlZV9jYWNoZWRfaW5mbyBmaWVsZC4KLQkqIGJmZC5jIChiZmRfZnJlZV9jYWNoZWRfaW5mbyk6IERlZmluZS4KLQkqIGJmZC1pbi5oIChKVU1QX1RBQkxFKTogQWRkIF9iZmRfZnJlZV9jYWNoZWRfaW5mby4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIEFsbCBiYWNrZW5kczogSW5pdGlhbGl6ZSBiZmRfZnJlZV9jYWNoZWRfaW5mbyBlbnRyeSBwb2ludCB0bwotCWJmZF90cnVlLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwKTogQ29ycmVjdCB0eXBlIG9mCi0JZmlyc3QsIHVudXNlZCwgYXJndW1lbnQuCi0JKGhwcGFfZWxmX2lzX2xvY2FsX2xhYmVsKTogRGVjbGFyZSBpbnN0ZWFkIG9mCi0Jc29tX2JmZF9pc19sb2NhbF9sYWJlbC4KLQotCSogY29mZi1hMjlrLmMgKGEyOWtfcmVsb2MpOiBBZGQgcmVsb2NfZW50cnktPmFkZHJlc3MgdG8gdmFsdWUgb2YKLQlhYnNvbHV0ZSBSX0lSRUwgcmVsb2MuCi0KLVRodSBNYXIgMzEgMTE6NTI6MTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkZWQgc29tZSBzdXBwb3J0IGZvciBJcml4IDQgc2hhcmVkIGxpYnJhcmllcy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBTZXQgU0VDX1NIQVJFRF9MSUJSQVJZIGZvciBhCi0JLmxpYiBzZWN0aW9uLgotCShlY29mZl9zZWNfdG9fc3R5cF9mbGFncyk6IFNldCBTRUNfU0hBUkVEX0xJQlJBUlkgaWYKLQlTVFlQX0VDT0ZGX0xJQiBiaXQgaXMgc2V0LgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBSb3VuZCB0aGUgY29udGVudHMgb2YgYQotCS5saWIgc2VjdGlvbiB1cCB0byB0aGUgbmV4dCBwYWdlIGJvdW5kYXJ5LgotCShlY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IElmIHdlIHNlZSBhIC5saWIgc2VjdGlvbiwgaW5jcmVtZW50Ci0JdGhlIHZtYSBieSBvbmUgdG8gY291bnQgdGhlIG51bWJlciBvZiBzaGFyZWQgbGlicmFyaWVzIHdlIGhhdmUuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGNyYXNoIGlmIHdlIHNlZSBhCi0JU1RZUF9FQ09GRl9MSUIgc2VjdGlvbiwgYW5kIGRvbid0IGFkanVzdCB0ZXh0X3N0YXJ0IG9yIGRhdGFfc3RhcnQKLQlvciBic3Nfc2l6ZSBlaXRoZXIuCi0KLQkqIGNvZmZjb2RlLmggKENBTENfQURERU5EKTogQ2hhbmdlIHRvIGZldGNoIG9yaWdpbmFsIHN5bWJvbCB2YWx1ZQotCWZyb20gb3JpZ2luYWwgQkZELCByYXRoZXIgdGhhbiB1c2luZyB2YWx1ZSBvZiBjdXJyZW50IEJGRCBzeW1ib2wuCi0JTmVlZGVkIGZvciBuZXcgbGlua2VyLgotCSogY29mZi1zcGFyYy5jIChDQUxDX0FEREVORCk6IExpa2V3aXNlLgotCi0JKiBlY29mZi5jIChlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgdGhlIHRleHRfc3RhcnQgYW5kCi0JZGF0YV9zdGFydCBlbnRyaWVzIGluIHRoZSBvcHRpb25hbCBoZWFkZXIgY29ycmVjdGx5IGV2ZW4gaWYgYSB0ZXh0Ci0Jb3IgZGF0YSBzZWN0aW9uIHN0YXJ0cyBhdCBsb2NhdGlvbiB6ZXJvLgotCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpOiBBZGRlZCBCRkRfUkVMT0NfMjYgKGZyb20gc2VmCi0JYW5kIHJhZWJ1cm4pLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBubG0zMi1pMzg2LmMgKG5sbV9pMzg2X3JlYWRfaW1wb3J0KTogTnVsbCB0ZXJtaW5hdGUgdGhlIHN5bWJvbAotCW5hbWUuCi0JKiBubG0zMi1hbHBoYS5jIChubG1fYWxwaGFfcmVhZF9pbXBvcnQpOiBMaWtld2lzZS4KLQkqIG5sbTMyLXNwYXJjLmMgKG5sbV9zcGFyY19yZWFkX2ltcG9ydCk6IExpa2V3aXNlLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfd3JpdGVfc3ltYm9sKTogUmVpbmRlbnRlZC4gIENoYW5nZWQgdG8gcmV0dXJuCi0JYm9vbGVhbiwgYW5kIGNoYW5nZWQgd3JpdHRlbiB0byB1bnNpZ25lZCBpbnQgKi4gIENoZWNrIGVycm9yCi0JcmV0dXJucyBmcm9tIGNhbGxlZCBmdW5jdGlvbnMuCi0JKGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfbmF0aXZlX3N5bWJvbCk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBMaWtld2lzZS4gIFJld29ya2VkIGNoZWNrcyBvbiB3aGV0aGVyIHRvCi0Jd3JpdGUgc3ltYm9sIG5hbWUgdG8gc3RyaW5nIHRhYmxlIGZvciBjbGFyaXR5IGFuZCB0byBhdm9pZCBjb3JlCi0JZHVtcGluZyB3aGVuIGdpdmVuIGEgbm9uIENPRkYgc3ltYm9sLgotCSogbGliY29mZi1pbi5oIChjb2ZmX3dyaXRlX3N5bWJvbHMpOiBEZWNsYXJlIGFzIHJldHVybmluZyBib29sZWFuLgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQljb2ZmX3dyaXRlX3N5bWJvbHMuCi0KLVdlZCBNYXIgMzAgMTY6MjU6NDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQ2hhbmdlcyB0byBsZXQgQkZEIHJldHVybiBhbiBlcnJvciBpbmRpY2F0aW9uIGZyb20KLQlnZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiwKLQliZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLCBhbmQgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4gIFRoZXkgbm93Ci0JcmV0dXJuIGxvbmcgaW5zdGVhZCBvZiB1bnNpZ25lZCBpbnQsIGFuZCB1c2UgLTEgdG8gaW5kaWNhdGUgYW4KLQllcnJvci4gIEFsb25nIHRoZSB3YXksIHJlbmFtZSBnZXRfc3ltdGFiX3VwcGVyX2JvdW5kIHRvCi0JYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQuCi0JKiBiZmQuYyAoYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IFJldHVybiBsb25nLCBhbmQgLTEgb24KLQllcnJvcnMuCi0JKGJmZF9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIHN5bXMuYyAoYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBSZW5hbWVkIGZyb20KLQlnZXRfc3ltdGFiX3VwcGVyX2JvdW5kLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogUmVuYW1lZCBfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCB0bwotCV9iZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgYW5kIGNoYW5nZWQgaXQgYW5kCi0JX2JmZF9jYW5vbmljYWxpemVfc3ltdGFiIGFuZCBfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZAotCV9iZmRfY2Fub25pY2FsaXplX3JlbG9jIHRvIGFsbCByZXR1cm4gbG9uZy4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxnZXRfc3ltdGFiKSk6IFJldHVybiBsb25nLCBhbmQgLTEgb24gZXJyb3JzLgotCShOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCShOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgotCShOQU1FKGFvdXQsZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KLQkqIGJvdXQuYyAoYl9vdXRfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKGJfb3V0X2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGNvZmZfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoZWNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShlY29mZl9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShlbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGVsZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkoZWxmX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkqIGhwMzAwaHB1eC5jIChNWShnZXRfc3ltdGFiKSk6IExpa2V3aXNlLgotCShNWShnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgotCShNWShjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCi0JKiBpMzg2bHlueC5jIChOQU1FKGx5bngsY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCSogaWVlZS5jIChpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8KLQlib29sZWFuLiAgQ2hlY2sgZm9yIGVycm9ycyBmcm9tIGdldF9zeW1ib2wuCi0JKGllZWVfc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uICBDaGVjawotCWZvciBlcnJvcnMgZnJvbSBpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMuCi0JKGllZWVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IFJldHVybiBsb25nLCBhbmQgLTEgb24gZXJyb3JzLgotCShpZWVlX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoaWVlZV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoaWVlZV9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIG1pcHNic2QuYyAoTVkoY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCSogbmxtY29kZS5oIChubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShubG1fZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShubG1fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKG5sbV9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIG9hc3lzLmMgKG9hc3lzX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkob2FzeXNfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShvYXN5c19nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkob2FzeXNfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBzb20uYyAoc29tX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoc29tX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoc29tX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShzb21fY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBzcmVjLmMgKHNyZWNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShzcmVjX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoc3JlY19nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWZpbmUgYXMgYmZkXzBsLgotCShzcmVjX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogdGVraGV4LmMgKHRla2hleF9nZXRfc3ltdGFiKTogUmV0dXJuIGxvbmcsIGFuZCAtMSBvbiBlcnJvcnMuCi0JKHRla2hleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKHRla2hleF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWZpbmUgYXMgYmZkXzBsLgotCSh0ZWtoZXhfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBsaWJhb3V0LmggKE5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSk6IENoYW5nZQotCWRlY2xhcmF0aW9uIHRvIHJldHVybiBsb25nLgotCShOQU1FKGFvdXQsZ2V0X3N5bXRhYikpOiBMaWtld2lzZS4KLQkoTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkoTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGNvZmZfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCSogbGliZWNvZmYuaCAoZWNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShlY29mZl9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogbGliZWxmLmggKGJmZF9lbGYzMl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGxpYm5sbS5oIChubG1OQU1FKGdldF9zeW10YWJfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCi0JKG5sbU5BTUUoZ2V0X3N5bXRhYikpOiBMaWtld2lzZS4KLQkobmxtTkFNRShnZXRfcmVsb2NfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCi0JKG5sbU5BTUUoY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCSogYXJjaGl2ZS5jIChjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IFVzZSBlcnJvcl9yZXR1cm4gYW5kCi0Jbm9fbWVtb3J5X3JldHVybiBsYWJlbHMgcmF0aGVyIHRoYW4gZnJlZWluZyBpbmZvcm1hdGlvbiBpbiB2YXJpb3VzCi0JcGxhY2VzLiAgQ2hhbmdlIHN0b3JhZ2UsIHN5bWNvdW50IGFuZCBzcmNfY291bnQgdG8gbG9uZy4gIENoZWNrCi0JZXJyb3JzIGZyb20gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0JKiBib3V0LmMgKGJfb3V0X3JlbGF4X3NlY3Rpb24pOiBDaGFuZ2UgcmVsb2Nfc2l6ZSB0byBsb25nLiAgQ2hlY2sKLQlmb3IgZXJyb3JzIGZyb20gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCBhbmQKLQliZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCShiX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKToKLQlMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfZmluaXNoKTogTGlrZXdpc2UuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IENoZWNrIGZvciBlcnJvcnMgZnJvbQotCWJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiwgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZV9vdGhlcik6IENoZWNrIGZvciBlcnJvcnMKLQlmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZCBiZmRfY2Fub25pY2FsaXplX3N5bXRhYi4KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogQ2hlY2sgZm9yIGVycm9ycyBmcm9tCi0JYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCBhbmQgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkqIGxpYmJmZC5jIChiZmRfMGwpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoYmZkXzBsKTogRGVjbGFyZS4KLQkqIGFpeDM4Ni1jb3JlLmM6IENoYW5nZSBnZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCBnZXRfc3ltdGFiLAotCWdldF9yZWxvY191cHBlcl9ib3VuZCwgYW5kIGNhbm9uaWNhbGl6ZV9yZWxvYyB0byB1c2UgYmZkXzBsIHJhdGhlcgotCXRoYW4gYmZkXzB1LgotCSogY2lzY28tY29yZS5jLCBocHBhYnNkLWNvcmUuYywgaHB1eC1jb3JlLmM6IExpa2V3aXNlLgotCSogaXJpeC1jb3JlLmMsIG9zZi1jb3JlLmMsIHB0cmFjZS1jb3JlLmMsIHRyYWQtY29yZS5jOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCi0JKiBubG0zMi1zcGFyYy5jIChubG1fc3BhcmNfcmVhZF9yZWxvYyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzCi0JdGVtcCBhbmQgbmFtZS4KLQotV2VkIE1hciAzMCAwODozMzowNCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvZHB4Mi5oOiBEZWZpbmUgUE9TSVhfVVRJTUUuCi0KLVdlZCBNYXIgMzAgMDA6MzE6NDkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBpMzg2ZHluaXguYywgY29uZmlnL2kzODYtZHluaXgubXQ6ICBOZXcgZmlsZXMsIGhhbmRsaW5nIER5bml4Ci0JdmFyaWFudCBvZiBhLm91dC4KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnLmJmZDogIFVzZSB0aGVtIGZvciBEeW5peC4KLQkqIE1ha2VmaWxlLmluOiAgQWRkIGRlcGVuZGVuY2llcyBmb3IgaTM4NmR5bml4Lm8uIAotCSogdGFyZ2V0cy5jOiAgQWRkIGRlZmluaXRpb24gZm9yIGkzODZkeW5peF92ZWMuCi0JKiBob3N0cy9zeW1tZXRyeS5oOiAgRG8gbm90IGRlZmluZSBUUkFEX0NPUkVfVVNFUl9PRkZTRVQgZm9yIER5bml4LgotCURlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUiBhbmQgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTAotCWZvciBEeW5peC4gUmVtb3ZlIGluY2x1c2lvbiBvZiBkeW5peDMuaCwgRHluaXggYmZkIGlzIG5vdyBoYW5kbGVkIGJ5Ci0JaTM4NmR5bml4LmMKLQotTW9uIE1hciAyOCAxMjo1MzoyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLXNwYXJjLm8uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2ZsYWdzKTogSGFuZGxlIGJmZF9hcmNoX3Bvd2VycGMgbGlrZQotCWJmZF9hcmNoX3JzNjAwMC4KLQotCSogY29uZmlnLmJmZCAocG93ZXJwYy0qLWFpeCopOiBOZXcgdGFyZ2V0OyB1c2UgcnM2MDAwLm10LgotCSogY29uZmlnL3JzNjAwMC5tdCAoU0VMRUNUX0FSQ0hJVEVDVFVSRVMpOiBBZGQgYmZkX3Bvd2VycGNfYXJjaC4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IFNldCBTRUNfUkVMT0MgZmxhZwotCWZvciBnZW5lcmF0ZWQgY29uc3RydWN0b3Igc2VjdGlvbi4KLQotU3VuIE1hciAyNyAxNjoyNToyMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogTmV3IGFwcHJvYWNoIGF0IGRlYWxpbmcgd2l0aCBob2xlcwotCWluIGV4ZWN1dGFibGVzIGxlZnQgYnkgdGhlIEhQIGxpbmtlci4gIERvZXMgbm90IHJlbHkgb24gc3Vic3BhY2UKLQlhbGlnbm1lbnRzIGFzIHN1YnNwYWNlcyBhcmUgKk5PVCogZ3VhcmFudGVlZCB0byBiZSBwcm9wZXJseQotCWFsaWduZWQgaW4gYW4gZXhlY3V0YWJsZSAoY2FuIHlvdSBiZWxpZXZlIHRoYXQhKS4KLQotU2F0IE1hciAyNiAxMDoyNTo0MyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9nZXRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBmdW5jdGlvbi4gIERvIG5vdCB0cnkKLQl0byBhY3R1YWxseSByZWFkIGRhdGEgZnJvbSBhIHNlY3Rpb24gdGhhdCBkb2Vzbid0IGhhdmUgZWl0aGVyCi0JU0VDX0xPQUQgb3IgU0VDX0RFQlVHR0lORyBzZXQgKGVnICRCU1MkKSBqdXN0IHJldHVybiB0cnVlLgotCi0gICAgICAgICogbGliYmZkLmMgKGJmZF9yZWFkKTogU2V0IGJmZF9lcnJvciBhcyBhcHByb3ByaWF0ZSBmb3IgYSBzaG9ydAotCXJlYWQuIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwgb3IgYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKS4KLQotCSogc29tLmM6IERvIG5vdCBibGluZGx5IHNldCBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwgYWZ0ZXIgYQotCWZhaWxpbmcgYmZkX3JlYWQsIGJmZF93cml0ZSwgb3IgYmZkX3NlZWsuICBJbiBhIGZldyBwbGFjZXMKLQkobGlrZSBzb21fb2JqZWN0X3ApIG92ZXJyaWRlIHRoZSBlcnJvciBzdGF0dXMgc2V0IGJ5IGJmZF9yZWFkLgotCi0JKiBhaXgzODYtY29yZS5jLCBhb3V0LWVuY2FwLGMgYXJjaGl2ZS5jLCBib3V0LmM6IExpa2V3aXNlLgotCSogY29mZi1yczYwMDAuYywgY29mZmdlbi5jIGVjb2ZmLmMsIGVsZi5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLWhwcGEuYywgZWxmY29kZS5oLCBocDMwMGhwdXguYywgaTM4Nmx5bnguYzogTGlrZXdpc2UuCi0JKiBubG0zMi1hbHBoYS5jLCBubG0zMi1pMzg2LmMsIG5sbTMyLXNwYXJjLmM6IExpa2V3aXNlLgotCi0JKiBzb20uYzogQ2hlY2sgcmV0dXJuIHZhbHVlcyBmcm9tIHNldmVyYWwgYmZkX3tzZWVrLHJlYWQsd3JpdGV9Ci0JY2FsbHMgdGhhdCB3ZSBqdXN0IGFzc3VtZWQgd2VyZSBub3QgZmFpbGluZy4KLQotRnJpIE1hciAyNSAxMTo0NDowNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3lzdjQuaCAoSEFWRV9QUk9DRlMpOiBBZGQgY29tbWVudHMgYWJvdXQgcHR4NC4KLQkqIGNvbmZpZy9zeXN2NC5taDogQWRkIGNvbW1lbnQuCi0JKiBjb25maWcvc3ltbWV0cnkubWg6IENoYW5nZSBjb21tZW50LgotCSogY29uZmlndXJlLmhvc3Q6IFVzZSBzeXN2NCwgbm90IHN5bW1ldHJ5LCBmb3IgaVszNF04Ni1zZXF1ZW50LXN5c3Y0Ki4KLQotRnJpIE1hciAyNSAxNzoxMDo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlDaGFuZ2VzIHRvIHN1cHBvcnQgbGlua2VyIHJlbGF4aW5nIG9mIGVtYmVkZGVkIE1JUFMgUElDIGNvZGUgdG8KLQl1c2UgYSBmaXZlIGluc3RydWN0aW9uIHNlcXVlbmNlIGZvciBmdW5jdGlvbiBjYWxscyB3aGljaCBhcmUgb3V0IG9mCi0JcmFuZ2Ugb2YgdGhlIGJhbCBpbnN0cnVjdGlvbi4KLQkqIGxpYmVjb2ZmLmggKHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhKTogRGVmaW5lLgotCShlY29mZl9zZWN0aW9uX2RhdGEpOiBEZWZpbmUuCi0JKGVjb2ZmX2JmZF9yZWxheF9zZWN0aW9uKTogRG9uJ3QgZGVmaW5lLgotCSogZWNvZmYuYyAoZWNvZmZfZmluYWxfbGlua19kZWJ1Z19hY2N1bXVsYXRlKTogRG9uJ3QgcmVhZCBvciBmcmVlCi0JdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHJlYWQuCi0JKGVjb2ZmX2luZGlyZWN0X2xpbmtfb3JkZXIpOiBIYW5kbGUgX2Nvb2tlZF9zaXplIGJlaW5nIGRpZmZlcmVudAotCWZyb20gX3Jhd19zaXplLiAgRG9uJ3QgcmVyZWFkIHRoZSBjb250ZW50cyBvciB0aGUgcmVsb2NzIGlmIHRoZXkKLQloYXZlIGFscmVhZHkgYmVlbiByZWFkIGluLgotCSogY29mZi1taXBzLmMgKG1pcHNfaG93dG9fdGFibGUpOiBDaGFuZ2UgYml0c2l6ZSBvZiBQQ1JFTDE2IGZyb20KLQkxOCB0byAxNi4KLQkoUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVCk6IERlZmluZS4KLQkobWlwc19yZWxvY2F0ZV9yZWZoaSk6IFRha2UgYWRqdXN0IGFyZ3VtZW50LgotCShtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgcmVsb2Mgb2Zmc2V0cyBzdG9yZWQgaW4gc2VjdGlvbgotCXVzZWRfYnlfYmZkIGZpZWxkLiAgQ2FsbCBtaXBzX3JlbGF4X3BjcmVsMTYgdG8gaGFuZGxlIGRldGFpbHMgb2YKLQlleHBhbmRpbmcgYW4gb3V0IG9mIHJhbmdlIFBDUkVMMTYuICBLZWVwIHRyYWNlIG9mIGFkanVzdG1lbnRzCi0JcmVxdWlyZWQgYnkgZXhwYW5zaW9ucy4gIFNldCBzIGFuZCB1bnNldCBoIHdoZW4gY29udmVydGluZyBhIHJlbG9jCi0JZnJvbSB1bmRlZmluZWQgdG8gc2VjdGlvbi4gIENoYW5nZSBoYW5kbGluZyBvZiBQQyByZWxhdGl2ZSByZWxvY3M6Ci0JaWYgYWdhaW5zdCBhIHNlY3Rpb24sIHRoZXkgYXJlIGNvcnJlY3QgaW4gdGhlIG9iamVjdCBmaWxlLCBpZgotCWFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sIHRoZXkgYXJlIHBjcmVsX29mZnNldC4KLQkobWlwc19yZWxheF9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX3JlbGF4X3BjcmVsMTYpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX2JmZF9yZWxheF9zZWN0aW9uKTogRGVmaW5lLgotCSogY29mZi1hbHBoYS5jIChlY29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IEhhbmRsZSBhZGp1c3RtZW50cwotCWJ1aWx0IGJ5IG1pcHNfcmVsYXhfc2VjdGlvbiB3aGVuIHdyaXRpbmcgb3V0IGFkZHJlc3Nlcy4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogQ2xlYXIgYWRqdXN0IGZpZWxkLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogVGhlIGNhbGxlciBleHBlY3RzCi0JZnVuY3Rpb25uYW1lX3B0ciB0byBiZSBzZXQgdG8gYSBzeW1ib2wgbmFtZSwgc28gcHJlcGVuZAotCXN5bWJvbF9sZWFkaW5nX2NoYXIuCi0KLVRodSBNYXIgMjQgMTE6MzM6NDYgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogQWRkIHJlbGF4aW5nIGluZm8KLQlmb3IgMTZiaXQgcmVsYXRpdmUgYnJhbmNoZXMuCi0JKiBjb2ZmLWg4NTAwLmMgKHJfaGlnaDgsIHJfbG93MTYsIHJfaGlnaDE2KTogRG9uJ3QgY29tcGxhaW4gb24KLQlvdmVyZmxvdy4KLQotVGh1IE1hciAyNCAwOToyMToxMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfcHJlcF9mb3JfYXJfd3JpdGUpOiBJZ25vcmUgbm9uLVNPTSBvYmplY3RzLgotCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZiwgc29tX3dyaXRlX2FybWFwKTogTGlrZXdpc2UuCi0KLVdlZCBNYXIgMjMgMTQ6Mjk6MzEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBuZXRic2QzODYuYyAoTl9TRVRfRkxBR1MpOiBEZWxldGUgdGhlIG9sZCBkZWZpbml0aW9uLgotCi1XZWQgTWFyIDIzIDE0OjU4OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUNsZWFuIHVwIHRoZSByZWxheGluZyBjb2RlIGZvciB0aGUgbmV3IGxpbmtlci4KLQkqIHRhcmdldHMuYyAoX2JmZF9yZWxheF9zZWN0aW9uKTogVGFrZSBib29sZWFuICphZ2FpbiBhcmd1bWVudAotCXJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4KLQkqIGJmZC5jIChiZmRfcmVsYXhfc2VjdGlvbik6IENoYW5nZSBuYW1lIG9mIGZvdXJ0aCBhcmd1bWVudCBmcm9tCi0Jc3ltYm9scyB0byBhZ2Fpbi4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24pOiBUYWtlIGJvb2xlYW4gKmFnYWluCi0JYXJndW1lbnQgcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LiAgQWx3YXlzIHJldHVybiB0cnVlLgotCSogYm91dC5jOiBJbmNsdWRlIGdlbmxpbmsuaC4KLQkoYWxpZ25jb2RlLCBwZXJmb3JtX3NsaXApOiBEZWNsYXJlLgotCShwZXJmb3JtX3NsaXApOiBUYWtlIEJGRCBhcmd1bWVudCByYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuCi0JQ2hhbmdlZCBhbGwgY2FsbGVycy4gIEdldCB0aGUgc3ltYm9scyBmcm9tIHRoZSBCRkQuICBDaGFuZ2UgdGhlCi0JaGFzaCB0YWJsZSBlbnRyeSB2YWx1ZSBhcyB3ZWxsIGFzIHRoZSBzeW1ib2wgdmFsdWUuCi0JKGFiczMyY29kZSk6IFRha2UgQkZEIGFyZ3VtZW50IHJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4gIENoYW5nZWQKLQlhbGwgY2FsbGVycy4KLQkoYWxpZ25jb2RlKTogTGlrZXdpc2UuCi0JKGJfb3V0X3JlbGF4X3NlY3Rpb24pOiBUYWtlIGJvb2xlYW4gKmFnYWluIGFyZ3VtZW50IHJhdGhlciB0aGFuCi0JYXN5bWJvbCBsaXN0LiAgT25seSByZXR1cm4gZmFsc2UgaWYgYW4gZXJyb3Igb2NjdXJyZWQuICBTZXQgKmFnYWluCi0JdG8gZmFsc2UuICBHZXQgc3ltYm9scyBmcm9tIEJGRC4KLQkqIHJlbG9jMTYuYzogSW5jbHVkZSBnZW5saW5rLmguCi0JKGJmZF9wZXJmb3JtX3NsaXApOiBUYWtlIEJGRCBhcmd1bWVudCByYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuCi0JR2V0IHRoZSBzeW1ib2xzIGZyb20gdGhlIEJGRC4gIENoYW5nZSB0aGUgaGFzaCB0YWJsZSBlbnRyeSB2YWx1ZQotCWFzIHdlbGwgYXMgdGhlIHN5bWJvbCB2YWx1ZS4KLQkoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogVGFrZSBib29sZWFuICphZ2FpbiBhcmd1bWVudAotCXJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4gIE9ubHkgcmV0dXJuIGZhbHNlIGlmIGFuIGVycm9yIG9jY3VycmVkLgotCVNldCAqYWdhaW4gdG8gZmFsc2UuICBHZXQgc3ltYm9scyBmcm9tIEJGRC4KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IENoYW5nZQotCV9iZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlIHRvIHRha2UgQkZEIGFyZ3VtZW50IHJhdGhlciB0aGFuCi0JYXN5bWJvbCBsaXN0LgotCShiZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0JKGR1bW15X3JlbG9jMTZfZXN0aW1hdGUpOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQkqIGxpYmNvZmYtaW4uaCAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogQ2hhbmdlCi0JZGVjbGFyYXRpb24gdG8gdGFrZSBib29sZWFuICogcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LgotCShiZmRfcGVyZm9ybV9zbGlwKTogQ2hhbmdlIGRlY2xhcmF0aW9uIHRvIHRha2UgQkZEIHJhdGhlciB0aGFuCi0JYXN5bWJvbCBsaXN0LgotCSogY29mZi1oODMwMC5jIChoMzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBUYWtlIEJGRCBhcmd1bWVudCByYXRoZXIKLQl0aGFuIGFzeW1ib2wgbGlzdC4gIENoYW5nZWQgY2FsbHMgdG8gYmZkX3BlcmZvcm1fc2xpcC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi0JKiBnZW5saW5rLmggKF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzKTogRGVmaW5lLgotCShfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQpOiBEZWZpbmUuCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbi4KLQkoZ2VuZXJpY19saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSBpdC4gIFVzZQotCV9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIGFuZCBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQKLQl0byBnZXQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgQkZELgotCShnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogTGlrZXdpc2UuCi0JKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogTGlrZXdpc2UuCi0JKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IExpa2V3aXNlLgotCShnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogU3RvcmUgcG9pbnRlciB0byBoYXNoIHRhYmxlIGVudHJ5Ci0JaW4gYXN5bWJvbCB1ZGF0YSBmaWVsZC4KLQotVHVlIE1hciAyMiAxMzowOTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2hvd3RvX3RhYmxlKTogQWRkIGVudHJ5IGZvciBuZXcgTUlQU19SX1BDUkVMMTYKLQlyZWxvYywgdXNlZCBpbiBlbWJlZGRlZCBQSUMgY29kZS4KLQkobWlwc19hZGp1c3RfcmVsb2NfaW4pOiBDaGFuZ2Ugc2FuaXR5IGNoZWNrIHRvIHBlcm1pdCBuZXcgcmVsb2MuCi0JKG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogVHVybiBCRkRfUkVMT0NfMTZfUENSRUxfUzIgaW50bwotCU1JUFNfUl9QQ1JFTDE2LgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBBY2NvdW50IGZvciBsaW5rX29yZGVyCi0JcmVsb2NzIHdoZW4gYWxsb2NhdGluZyBzcGFjZSBmb3IgcmVsb2NhdGlvbnMuICBTZXQgU0VDX1JFTE9DIGZsYWcKLQlmb3IgYW55IHNlY3Rpb24gd2hpY2ggaGFzIHJlbG9jcy4gIEhhbmRsZSBsaW5rX29yZGVyIHJlbG9jcyBpbgotCWxpbmtfb3JkZXIgbG9vcC4gIFVzZSBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9sc19jb2xsZWN0IGZvcgotCWFkZF9zeW1ibHMgZW50cnkgcG9pbnQuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IFNldCByZWxvY19jb3VudCB0byAwIGJlZm9yZQotCWNvdW50aW5nIHJlbG9jcy4gIFNldCBTRUNfUkVMT0MgZmxhZyBmb3IgYW55IHNlY3Rpb24gd2hpY2ggaGFzCi0JcmVsb2NzLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIpOiBIYW5kbGUgYmZkX2RhdGFfbGlua19vcmRlci4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzKTogSnVzdCBjYWxsCi0JZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9sc19jb2xsZWN0KTogTmV3IGZ1bmN0aW9uLCBsaWtlCi0JX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgYnV0IGFsc28gY29sbGVjdCBjb25zdHJ1Y3RvcnMgYW5kCi0JZGVzdHJ1Y3RvcnMgYnkgbmFtZSBhcyBjb2xsZWN0MiBkb2VzLgotCShnZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24sIGxpa2Ugb2xkCi0JX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgYnV0IHdpdGggY29sbGVjdCBhcmd1bWVudC4KLQkoZ2VuZXJpY19saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFRha2UgY29sbGVjdCBhcmd1bWVudC4KLQkoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9ub19jb2xsZWN0KTogTmV3IGZ1bmN0aW9uLgotCShnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X2NvbGxlY3QpOiBOZXcgZnVuY3Rpb24uCi0JKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBUYWtlIGNvbGxlY3QgYXJndW1lbnQuCi0JKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBUYWtlIGNvbGxlY3QgYXJndW1lbnQuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogUmVuYW1lIGNvbnN0cnVjdG9yIGFyZ3VtZW50IHRvCi0JY29sbGVjdC4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9sc19jb2xsZWN0KTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1UdWUgTWFyIDIyIDEwOjA0OjAwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBhcmNoaXZlLmMgKGJmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IFVzZSBhcl9wYWRjaGFyCi0JZm9yIGZpcnN0IGNoYXJhY3RlciBpbiBhbiBleHRlbmRlZCBuYW1lLgotCShfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBJZiBhcl9wYWRjaGFyID09ICcvJywgdGhlbiB1c2UKLQkiLy8iIGFzIHRoZSBuYW1lIG9mIHRoZSBzcGVjaWFsIGFyY2hpdmUgbWVtYmVyIGhvbGRpbmcgdGhlCi0JZXh0ZW5kZWQgbmFtZSB0YWJsZS4KLQotTW9uIE1hciAyMSAxMjoyODoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlTdXBwb3J0IGZvciBsaW5rX29yZGVyIHR5cGVzIHdoaWNoIGdlbmVyYXRlIHJlbG9jcyBpbiBvcmRlciB0bwotCXN1cHBvcnQgLVVyIGluIHRoZSBsaW5rZXIuCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFJlbW92ZSBiaXRzaXplIGFyZ3VtZW50Ci0JZnJvbSBjYWxsIHRvIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFJlbW92ZSBiaXRzaXplIGFyZ3VtZW50LgotCURvbid0IHBhc3MgYml0c2l6ZSB0byBjb25zdHJ1Y3RvciBjYWxsIGJhY2suICBQYXNzIEJGRF9SRUxPQ19DVE9SCi0JaW5zdGVhZCBvZiBiaXRzaXplIHRvIGFkZF90b19zZXQgY2FsbCBiYWNrLgotCShfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IEFjY291bnQgZm9yIGxpbmtfb3JkZXIgcmVsb2NzIHdoZW4KLQlhbGxvY2F0aW5nIHNwYWNlIGZvciByZWxvY2F0aW9ucy4gIEhhbmRsZSB0aGVtIGluIGxpbmtfb3JkZXIgbG9vcC4KLQkoX2JmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZGVmYXVsdF9saW5rX29yZGVyKTogSWYgYSByZWxvY19saW5rX29yZGVyIGlzIHNlZW4gaGVyZSwKLQlhYm9ydC4KLQkoX2JmZF9jb3VudF9saW5rX29yZGVyX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFJlbW92ZSBiaXRzaXplCi0JYXJndW1lbnQgZnJvbSBkZWNsYXJhdGlvbi4KLQkoX2JmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIpOiBEZWNsYXJlLgotCShfYmZkX2NvdW50X2xpbmtfb3JkZXJfcmVsb2NzKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogYW91dHguaCAoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogUmVtb3ZlIGJpdHNpemUgYXJndW1lbnQgZnJvbQotCWNhbGwgdG8gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wuCi0JKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IEFjY291bnQgZm9yIGxpbmtfb3JkZXIgcmVsb2NzIHdoZW4KLQlhbGxvY2F0aW5nIHNwYWNlIGZvciByZWxvY2F0aW9ucy4gIEhhbmRsZSB0aGVtIGFmdGVyIGhhbmRsaW5nIGFsbAotCWlucHV0IEJGRHMuCi0JKGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogTmV3IGZ1bmN0aW9uLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogUmVtb3ZlIGJpdHNpemUgYXJndW1lbnQgZnJvbQotCWNhbGwgdG8gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogQWNjb3VudCBmb3IgbGlua19vcmRlciByZWxvY3Mgd2hlbgotCWFsbG9jYXRpbmcgc3BhY2UgZm9yIHJlbG9jYXRpb25zLiAgSGFuZGxlIHRoZW0gaW4gbGlua19vcmRlciBsb29wLgotCShlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogU2V0IHRoZSBzdG9yYWdlIGNsYXNzIG9mIGEgZGVmaW5lZAotCWxpbmtlciBjcmVhdGVkIHN5bWJvbCBiYXNlZCBvbiB0aGUgc2VjdGlvbiBpdCBpcyBpbi4gIENvcnJlY3QKLQliZmRfbGlua19oYXNoX3dlYWsgY2FzZSB0byB1c2UgLnNjIHJhdGhlciB0aGFuIC5zdC4KLQkoZWNvZmZfcmVsb2NfbGlua19vcmRlcik6IE5ldyBmdW5jdGlvbi4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlCi0JQkZEX1JFTE9DX0NUT1IuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBMaWtld2lzZS4KLQotCSogc3Vub3MuYyAoc3Vub3NfcmVhZF9keW5hbWljX2luZm8pOiBSZW1vdmUgdW51c2VkIGxvY2FscyBkeW5zeW0KLQlhbmQgYnVmLgotCi0JKiBjaXNjby1jb3JlLmMgKGNpc2NvX2NvcmVfZmlsZV9wKTogT25seSBwYXNzIG9uZSBhcmd1bWVudCB0bwotCWJmZF96bWFsbG9jLiAgRnJlZSBhIHBvaW50ZXIsIG5vdCBhIHVuaW9uLgotCShjaXNjb19iZmRfaXNfbG9jYWxfbGFiZWwpOiBDb3JyZWN0IGNhc3QgZnJvbSBhc2VjdGlvbiB0byBhc3ltYm9sLgotCi1TdW4gTWFyIDIwIDA5OjI0OjM2IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiZmQvc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogRml4IHRoaW5rbyAob2ZmIGJ5IG9uZSBlcnJvcikuCi0KLQkqIHNvbS5jIChiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wpOiBPbmx5IHRvIGRvIHRoZSB2YWx1ZQotCWNvbXBhcmlzb24gZm9yIGZ1bmN0aW9uIHN5bWJvbHMgd2l0aGluIGV4ZWN1dGFibGVzLgotCi0JKiBzb20uYyAoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogUmVuYW1lZCBmcm9tCi0Jc29tX3NlY3Rpb25fZnJvbV9zdWJzcGFjZV9pbmRleC4gIFBhc3MgaW4gYSBuYXRpdmUgU09NIHN5bWJvbC4KLQlGb3IgZXhlY3V0YWJsZXMsIGl0ZXJhdGUgdGhyb3VnaCB0aGUgc2VjdGlvbnMgdG8gZmluZCBvdXQKLQl3aGljaCBjb250YWlucyB0aGUgc3ltYm9sJ3MgYWRkcmVzcyByYXRoZXIgdGhhbiB1c2luZyB0aGUKLQlzeW1ib2xfaW5mbyBmaWVsZC4gIChzeW1ib2xfaW5mbyBoYXMgYSBkaWZmZXJlbnQgbWVhbmluZyBmb3IKLQlkeW5hbWljbHkgbGlua2VkIGV4ZWN1dGFibGVzLikKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IERvbid0IHBhc3MgYWJmZCB0bwotCWJmZF96bWFsbG9jLgotCi0JKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBGaXggYnJhaW5vIChvbmUgY2FsbCB0byBhbGlnbgotCXNwYWNlL3N1YnNwYWNlIGRhdGEgd2FzIGRvbmUgdW5jb25kaXRpb25hbGx5IHJhdGhlciB0aGFuCi0JanVzdCBmb3IgZXhlY3V0YWJsZXMuKQotCi0JKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBBbGlnbiB0ZXh0IGluIGFsbCBleGVjdXRhYmxlcyB0bwotCW1ha2UgSFBVWCBrZXJuZWwgaGFwcHkuICBGaXhlcyBzdHJpcC9vYmpjb3B5IGZvciBzaGFyZWQKLQlleGVjdXRhYmxlcy4KLQotU2F0IE1hciAxOSAwNzowNjo1OSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogQWNjb3VudCBmb3IgYWxpZ25tZW50IG5lZWRzIG9mCi0Jc3Vic3BhY2VzIHRvbyB3aGVuIHdyaXRpbmcgZXhlY3V0YWJsZXMuICBOZXZlciByZXF1ZXN0IGEgbmVnYXRpdmUKLQlic3Mgc2l6ZS4gIEZpeGVzIHNvbWUgcHJvYmxlbXMgd2l0aCBkZW1hbmQgcGFnZWQgZXhlY3V0YWJsZXMsCi0Jc3RpbGwgaGF2aW5nIHByb2JsZW1zIHdpdGggcHVyZSBleGVjdXRhYmxlcyBhbmQgc2hhcmVkIGV4ZWN1dGFibGVzLgotCi1GcmkgTWFyIDE4IDE5OjEyOjQ3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogQ2FsbCBiZmRfem1hbGxvYyBub3QKLQliZmRfemFsbG9jIGZvciByYXdwdHIsIGJlY2F1c2UgbGF0ZXIgb24gd2UgbWF5IGNhbGwgZnJlZSwgbm90Ci0JYmZkX3JlbGVhc2UsIG9uIGl0LgotCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGQgY2lzY29fY29yZV9zdHJ1Y3QgdG8gdGRhdGEgdW5pb24uCi0JKiBsaWJiZmQuYyAoYmZkX3JlYWQsIGJmZF9zZWVrKTogQWRkIGNvbW1lbnRzIHJlZ2FyZGluZyBlcnJvcnMuCi0JKiBjaXNjby1jb3JlLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IENoYW5nZSBhY2NvcmRpbmdseS4KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGNpc2NvX2NvcmVfdmVjLgotCSogY29uZmlnL202OGstYW91dC5tdCAoU0VMRUNUX1ZFQ1MpOiBBZGQgY2lzY29fY29yZV92ZWMuCi0JKiB0YXJnZXRzLmM6IEFkZCBjaXNjb19jb3JlX3ZlYy4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotRnJpIE1hciAxOCAxODoxMzo0OSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmggKHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0KTogTmV3IHN0cnVjdHVyZQotCWNvbnRhaW5pbmcgYWxsIHRoZSBwcml2YXRlIHNlY3Rpb24gaW5mb3JtYXRpb24gd2hpY2ggbmVlZHMKLQl0byBiZSBjb3BpZWQgZnJvbSBpbnB1dCBzZWN0aW9uIHRvIG91dHB1dCBzZWN0aW9uIGR1cmluZwotCW9iamNvcHkgb3Igc3RyaXAuCi0JKHNvbV9zZWN0aW9uX2RhdGFfc3RydWN0KTogUmVtb3ZlIHNldmVyYWwgZmllbGRzIG5vdyBpbgotCXNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0LiAgTWFrZSB0aGUgc3BhY2UgYW5kIAotCXN1YnNwYWNlIGRpY3Rpb25hcmllcyBiZSBwb2ludGVycyAodG8gc2F2ZSBzcGFjZSB3aGVuCi0Jb25seSByZWFkaW5nIG9iamVjdHMpLgotCi0JKiBzb20uYyAoYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzKTogTm93IHJldHVybnMgYSBib29sZWFuOwotCXNvbWUgcmVmZXJlbmNlcyBjaGFuZ2VkLiAgQWxsb2NhdGUgYSBjb3B5YWJsZSBkYXRhIHN0dWN0dXJlIGlmCi0Jbm9uZSBleGlzdHMuICBTdG9yZSBpbmZvIGludG8gdGhlIGNvcHlhYmxlIGRhdGEgc3RydWN0dXJlLgotCShiZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMpOiBMaWtld2lzZS4KLQkoc29tX2lzX3NwYWNlLCBzb21faXNfc3Vic3BhY2UsIHNvbV9pc19jb250YWluZXIpOiBOZXcgZnVuY3Rpb25zLgotCVVzZSB0aGVzZSBpbnN0ZWFkIG9mIGRpcmVjdGx5IGFjY2Vzc2luZyBwcml2YXRlIGRhdGEuCi0JKHNvbV9wcmVwX2hlYWRlcnMpOiBBbGxvY2F0ZSBzcGFjZSBhbmQgc3Vic3BhY2UgaGVhZGVycyBoZXJlLgotCUZpbGwgaW4gc29tZSBmaWVsZHMgaW4gdGhlIHNwYWNlL3N1YnNwYWNlIGhlYWRlcnMgZnJvbSB0aGUKLQljb3B5YWJsZSBkYXRhLgotCShzb21fYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBPbmx5IGNvcHkgdGhlIHN0dWZmCi0JdGhhdCB3ZSByZWFsbHkgbmVlZCB0byBtYWtlIG9iamNvcHkgYW5kIHN0cmlwIHdvcmsuICBBbGxvY2F0ZQotCXRoZSBjb3B5X2RhdGEgc3RydWN0dXJlIGZvciB0aGUgb3V0cHV0IGJmZCBiZWZvcmUgY29weWluZy4KLQotCSogc29tLmggKHN0cnVjdCBzb21fZXhlY19kYXRhKTogTmV3IHN0cnVjdHVyZSB0byBob2xkIGV4ZWMKLQlpbmZvIHRoYXQgbXVzdCBiZSBwcmVzZXJ2ZWQgd2hlbiBydW5uaW5nIG9iamNvcHkvc3RyaXAuCi0JKHN0cnVjdCBzb21kYXRhKTogQWRkIG5ldyAiZXhlY19kYXRhIiBmaWVsZCBhbmQgYWNjZXNzb3IKLQltYWNyby4gIEFkZCBzb21lIGNvbW1lbnRzIG9uIGhvdyB0aGUgdmFyaW91cyBmaWVsZHMgYXJlIHVzZWQuCi0JKHNvbV9zZWN0aW9uX2RhdGFfc3RydWN0KTogTWFrZSBpc19zcGFjZSBhbmQgaXNfc3Vic3BhY2UgYml0ZmllbGRzLgotCURlbGV0ZSB1bnVzZWQgc3Vic3BhY2VfaW5kZXguICBBbGwgcmVmZXJlbmNlcyBub3cgdXNlIHRoZQotCXRhcmdldF9pbmRleCBmaWVsZCB3aXRoaW4gdGhlIHNlY3Rpb24gc3RydWN0dXJlIGl0c2VsZi4KLQotCSogc29tLmMgKG1ha2VfdW5pcXVlX3NlY3Rpb24pOiBEZWxldGUgdW51c2VkIGRlY2xhcmF0aW9uLgotCShzb21fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX29iamVjdF9zZXR1cCk6IEFsbG9jYXRlIHNwYWNlIGZvciBhbmQgc2F2ZSBleGVjIGluZm9ybWF0aW9uCi0JdGhhdCBuZWVkcyB0byBiZSBjb3BpZWQgZHVyaW5nIG9iamNvcHkvc3RyaXAuCi0JKHNvbV9ta29iamVjdCk6IERvIG5vdCBhbGxvY2F0ZSBzcGFjZSBmb3IgYSBmaWxlIGhlYWRlciBoZXJlLgotCUl0IGlzIG5vdCB1c2VkIHdoZW4gb25seSByZWFkaW5nIFNPTSBvYmplY3RzLgotCShzb21fcHJlcF9oZWFkZXJzKTogQWxsb2NhdGUgc3BhY2UgZm9yIGFuZCBhdHRhY2ggYSBmaWxlIGhlYWRlcgotCXRvIHRoZSBvdXRwdXQgYmZkLiAgRm9yIGV4ZWN1dGFibGVzLCB1c2UgdGhlIHNhdmVkIHN5c3RlbV9pZAotCXZhbHVlIHJhdGhlciB0aGFuIHRyeWluZyB0byBndWVzcyB0aGUgcmlnaHQgdmFsdWUuICBEbyBub3QgYWJvcnQKLQl3d2hlbiBzZXR0aW5nIGZpbGVfaGRyLT5lbnRyeSogZm9yIGV4ZWN1dGFibGVzLgotCShzb21fYmVnaW5fd3JpdGluZyk6IEZvciBleGVjdXRhYmxlcywgc2V0IHRoZSBleGVjX2VudHJ5IGFuZAotCWV4ZWNfZmxhZ3MgZmllbGRzLgotCShzb21fY29weV9wcml2YXRlX2JhY2tlbmRfc2VjdGlvbl9kYXRhKTogQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCi0JKiBsaWJocHBhLmggKFBBX1BBR0VTSVpFKTogRGVmaW5lLgotCi0JKiBzb20uYyAoU09NX0FMSUdOKTogRGVmaW5lLgotCShzb21fYmVnaW5fd3JpdGluZyk6IElmIHdyaXRpbmcgYW4gZXhlY3V0YWJsZSwgaW5pdGlhbGl6ZSBhbGwKLQlmaWVsZHMgaW4gdGhlIGV4ZWMgaGVhZGVyIHRvIHplcm8uICBVcGRhdGUgZmllbGRzIGluIHRoZSBleGVjCi0JaGVhZGVyIGFzIHNpemVzIG9mIGxvYWRhYmxlIHN1YnNwYWNlcyBhcmUgY29tcHV0ZWQuICBDYXJlZnVsbHkKLQlwcmVzZXJ2ZSBhbGlnbm1lbnRzIHdoZW4gYnVpbGRpbmcgZXhlY3V0YWJsZXMuICBBY3R1YWxseSB3cml0ZSB0aGUKLQlleGVjIGFmdGVyIGFsbCB0aGUgZmllbGRzIGFyZSBmaWxsZWQgaW4uCi0KLSAgICAgICAgKiBCZXR0ZXIgbG9uZy1maWxlbmFtZSBoYW5kbGluZy4gIFJlYWRzIFNPTSBBQkkgY29tcGxpYW50IGV4dGVuZGVkCi0JbmFtZXMsIGJ1dCBkb2Vzbid0IHF1aXRlIHdyaXRlIGNvbXBsaWFudCBleHRlbmRlZCBuYW1lcyB5ZXQuCi0JKiBzb20uYyAoc29tX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWxldGUgZnVuY3Rpb24uICBUaGUKLQlnZW5lcmljIGNvZGUgd2lsbCBoYW5kbGUgdGhpbmdzIGNvcnJlY3RseS4KLQkoc29tX3NsdXJwX2FybWFwKTogU2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IG1lbWJlci4KLQkobm9ybWFsaXplKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IFRha2UgdGhlIHNpemUgb2YgdGhlIGV4dGVuZGVkCi0JbmFtZSB0YWJsZSBpbnRvIGFjY291bnQgd2hlbiBjb21wdXRpbmcgdGhlIGZpbGUgb2Zmc2V0cyBpbiB0aGUKLQlTT00gZGljdGlvbmFyeS4gIE1ha2Ugc3VyZSB0byBhbGlnbiB0byBhbiBldmVuIGJvdW5kYXJ5LgotCShzb21fd3JpdGVfYXJtYXApOiBJbml0aWFsaXplIHRoZSBjaGVja3N1bSB0byB6ZXJvLgotCShhcl9tYXhjaGFycyk6IEZpeC4gIE9wcHMuCi0KLUZyaSBNYXIgMTggMjA6MzU6MjQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAocmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX0NUT1Igb24gYSA2NC1iaXQKLQltYWNoaW5lLiAgSGFuZGxlIEJGRF9SRUxPQ19TUEFSQzEzIGFuZCBCRkRfUkVMT0NfU1BBUkNfQkFTRTEzLgotCi1UaHUgTWFyIDE3IDE4OjI2OjQ2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIChCRkRfVkVSU0lPTik6IFVzZSBAVkVSU0lPTkAuCi0JKiBNYWtlZmlsZS5pbiAoYmZkLmgpOiBSZXBsYWNlIGl0IHdpdGggY29udGVudHMgb2YgVkVSU0lPTiBmaWxlLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9iZmRfaXNfbG9jYWxfbGFiZWwpOiBGaXhlZCB0eXBvIHdoZXJlCi0JdGhpcyB3YXMgYWxzbyBuYW1lZCB0cmFkX3VuaXhfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YS4KLQotVGh1IE1hciAxNyAxMDozNzowNyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCwgZWxmY29kZS5oLCBjb2ZmLWFscGhhLmMsIGJvdXQuYywgZWNvZmYuYywgZWNvZmZsaW5rLmMsCi0JZWxmMzItaHBwYS5jLCBlbGYzMi1taXBzLmMsIGxpbmtlci5jLCBzb20uYywgc3Vub3MuYzogSWYgbWFsbG9jKDApCi0JcmV0dXJucyBOVUxMLCBpdCBpcyBub3QgYW4gZXJyb3IuICBJdCdzIHBvc3NpYmxlIHRoYXQgc29tZSBvZgotCXRoZXNlIGNoZWNrcyBhcmUgbm90IG5lY2Vzc2FyeSAoYmVjYXVzZSB0aGUgc2l6ZSBjYW4gbmV2ZXIgYmUKLQl6ZXJvKSwgYnV0IHB1dHRpbmcgaW4gdGhlIGNoZWNrcyBpcyB0aGUgY29uc2VydmF0aXZlIHRoaW5nIHRvIGRvCi0JaW4gbGlnaHQgb2YgdGhlIGZhY3QgdGhhdCBzb21lIG9mIHRoZXNlIG1hbGxvYyBjYWxscyByZXBsYWNlZAotCXVuY2hlY2tlZCBhbGxvY2EgY2FsbHMsIGluIHdoaWNoIGEgemVybyBhcmd1bWVudCB3b3VsZCB3b3JrIGZpbmUuCi0KLVRodSBNYXIgMTcgMTE6NDQ6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvc2YtY29yZS5jIChvc2ZfY29yZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogUmVtb3ZlCi0JZHVwbGljYXRlIGRlZmluaXRpb24uCi0JKG9zZl9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbCk6IERlZmluZS4KLQotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3QgZmFpbAotCWlmIG1hbGxvYyAoMCkgZmFpbHMuICBiZmRfY2Fub25pY2FsaXplX3JlbG9jIHJldHVybmluZyAwIGlzIG5vdCBhCi0JZmFpbHVyZSBpbmRpY2F0aW9uLCBpdCBtZXJlbHkgbWVhbnMgdGhlcmUgYXJlIG5vIHJlbG9jcy4KLQotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IERvbid0IHVzZSBzcGFjZQotCWFmdGVyIE5BTUUsIHNpbmNlIFN1bk9TIC9iaW4vY2MgY2FuJ3QgaGFuZGxlIGl0LgotCi1XZWQgTWFyIDE2IDE2OjQzOjMzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbmV0YnNkMzg2LmMgKE5fU0VUX0ZMQUdTKTogRG9uJ3QgbnVrZSB0aGUgbWFjaGluZSBpZCBmaWVsZC4KLQlGcm9tIHN1a2VzQGdsdWUudW1kLmVkdSAoVGFzdWtpIEhpcmF0YSkuCi0KLVdlZCBNYXIgMTYgMDc6NTU6NTQgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oICg0IHBsYWNlcyk6IFVzZSBhIHNpbXBsZSAjaWYgb24gQVJDSF9TSVpFLCByYXRoZXIgdGhhbgotCWFsbCB0aGF0IGNvbnZvbHV0ZWQgc3R1ZmYgd2l0aCBOQU1FLCBDQVQzLCBldGMuICBUaGUgY29udm9sdXRlZAotCXN0dWZmIGJyb2tlIGZvciBTdW5PUzQgL2Jpbi9jYyAoZHVlIHRvIERFRlVOIGVsaW1pbmF0aW9uLCBJIGd1ZXNzKS4KLQotV2VkIE1hciAxNiAwMDowMjowNSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9wcmVwX2Zvcl9maXh1cHMpOiBEZXRlY3Qgc2VjdGlvbiBzeW1ib2xzIGJhc2VkCi0Jb24gZWl0aGVyIHRoZSBsYWNrIG9mIHByaXZhdGUgZGF0YSBvciB0aGUgc3ltYm9sIGZsYWdzLiAgRG8gbm90Ci0JbXVuZ2Ugc2VjdGlvbiBzeW1ib2wgbmFtZXMgYW55bW9yZSAtLSB0aGV5IG5vIGxvbmdlciBjb25mdXNlIEdEQi4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBMZWF2ZSBzcGFjZSBmb3IgYW4gZXhlYyBoZWFkZXIgaWYgd3JpdGluZwotCWFuIGV4ZWN1dGFibGUuCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBSZWNvZ25pemUgYm90aCBmb3JtcyBvZiBzZWN0aW9uIHN5bWJvbAotCW5hbWVzICJMJDBcMDAyIiBhbmQgIiQ8Rk9PPiQiLiAgQ2hhbmdlIHRoZSBuYW1lIG9mICJMJDBcMDAyIgotCXNlY3Rpb24gc3ltYm9scyB0byBiZSB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbiB0aGV5IHJlcHJlc2VudC4KLQlEZWJ1Z2dpbmcgIHN5bWJvbHMgYmVnaW4gd2l0aCAiTCQwXDAwMSIsIG5vdCBqdXN0ICJMJCIuCi0KLVR1ZSBNYXIgMTUgMjI6NTg6MjggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmgsIGxpYmNvZmYuaDogUmVidWlsdC4KLQotCSogYmZkLWluLmggKEpVTVBfVEFCTEUpOiBBZGQgbmV3IGVudHJpZXMgdG8gdGhlIGp1bXAgdGFibGUKLQlmb3IgYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEsIGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEsCi0JYW5kIGJmZF9pc19sb2NhbF9sYWJlbC4KLQotCSogdGFyZ2V0cy5jOiBBZGQgbmV3IGVudHJpZXMgdG8gdGhlIGJmZF90YXJnZXQgc3RydWN0dXJlLgotCQotCSogYmZkLmMgKGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZGVmaW5pdGlvbi4KLQotCSogc2VjdGlvbi5jIChiZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE5ldyBkZWZpbml0aW9uLgotCi0JKiBzeW1zLmMgKGJmZF9pc19sb2NhbF9sYWJlbCk6IE5ldyBkZWZpbml0aW9uLgotCi0JKiBsaWJiZmQtaW4uaCAoYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWwpOiBEZWNsYXJlLgotCi0JKiBsaWJiZmQuYyAoYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCi0KLQkqICotY29yZS5jOiBQcm92aWRlIGRlZmF1bHQgZGVmaW5pdGlvbnMgZm9yIG5ldyBmdW5jdGlvbnMgaW4KLQl0aGUgdGFyZ2V0IHZlY3RvciB3aGljaCBhbGwgcG9pbnQgdG8gYmZkX2ZhbHNlLgotCi0JKiBhb3V0LXRhcmdldC5oLCBjb2ZmY29kZS5oLCBlbGYzMi10YXJnZXQuaCBlbGY2NC10YXJnZXQuaCwgaWVlZS5jCi0JbGliYW91dC5oLCBsaWJlY29mZi5oLCBubG0tdGFyZ2V0LmgsIG9hc3lzLmMsIHNyZWMuYywgdGVraGV4LmMKLQlEZWZhdWx0IG5ldyB2ZWN0b3JzIGZvciBjb3B5aW5nIHByaXZhdGUgYmFja2VuZCBkYXRhIHRvIGJmZF90cnVlLgotCURlZmF1bHQgbmV3IHZlY3RvciBmb3IgZGV0ZXJtaW5pbmcgaWYgYSBzeW1ib2wgaXMgYSBsb2NhbCBsYWJlbAotCXRvIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsLgotCi0JKiBzb20uYyAoc29tX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmZkX2lzX2xvY2FsX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IEZvciBub3cgZGVmYXVsdCB0byBiZmRfdHJ1ZS4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9pc19sb2NhbF9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQotVHVlIE1hciAxNSAyMzo1NTo0NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNmLW02OGtseW54LmMgKENBTENfQURERU5EKTogVXNlIF9iZmRfbTY4a2x5bnhfaG93dG9fdGFibGUuCi0KLVR1ZSBNYXIgMTUgMDQ6NDE6MTMgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNb3N0IGZpbGVzOgotCVJlcGxhY2UgREVGVU4gYW5kIERFRlVOX1ZPSUQgd2l0aCBLJlItc3R5bGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLQlJbmRlbnQgc29tZSBvZiB0aGVtIHRvIEdOVSBzdGFuZGFyZHMuCi0KLQkqIGFvdXQzMi5jLCBhcmNodXJlcy5jLCBjb3JlLmMsIGNwdS1oODMwMC5jLCBjcHUtaTk2MC5jLAotCWNwdS1tNjhrLmMsIGNwdS1tODhrLmMsIGNwdS1taXBzLmMsIGNwdS12YXguYywgY3Rvci5jLCBkZW1vNjQuYywKLQllbGYzMi1ocHBhLmgsIGdlbi1hb3V0LmMsIGhvc3QtYW91dC5jLCBpbml0LmMsIGxpYmhwcGEuaCwKLQlsaWJpZWVlLmgsIGxpYm9hc3lzLmgsIG5ld3NvczMuYywgc29tLmgsIHN0YWItc3ltcy5jLCBzdW5vcy5jOgotCVVwZGF0ZSBjb3B5cmlnaHQgeWVhcnMuCi0KLU1vbiBNYXIgMTQgMTE6NDE6MjMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fcHJlcF9mb3JfZml4dXBzKTogQSByZWxvY2F0aW9uIGludm9sdmluZyB0aGUgc2VjdGlvbgotCXN5bWJvbCBmb3IgdGhlICpBQlMqIHNlY3Rpb24gaXMgcmVhbGx5IGEgcmVsb2NhdGlvbiBpbnZvbHZpbmcKLQlubyBzeW1ib2wuCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBEbyBub3Qgc2V0IEJTRl9HTE9CQUwgb3IgQlNGX0VYUE9SVCBmb3IKLQl1bmRlZmluZWQgc3ltYm9scy4gIENvcnJlY3RseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRlYnVnZ2VyIHN5bWJvbHMKLQlhbmQgc2VjdGlvbiBzeW1ib2xzLgotCi0JKiBzb20gKHNldHVwX3NlY3Rpb25zKTogU2V0IFNFQ19ERUJVR0dJTkcgYW5kIHRoZSBzZWN0aW9uIGF0dHJpYnV0ZXMKLQlmb3Igc3BhY2VzIGFuZCBzdWJzcGFjZXMuCi0KLQkqIHNvbS5jIChzb21fYmZkX2NvdW50X2FyX3N5bWJvbHMpOiBGaXggdHlwby4KLQotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBTZXQgRVhFQ19QLCBEX1BBR0VELCBXUF9URVhULCBhbmQKLQlIQVNfUkVMT0MgYmFzZWQgb24gdGhlIG9iamVjdCdzIG1hZ2ljIG51bWJlci4KLQkobWFrZV91bmlxdWVfc2VjdGlvbik6IERlbGV0ZSBmdW5jdGlvbi4gIEJGRCBhbmQgaXRzIHVzZXJzIGFyZQotCXByZXBhcmVkIHRvIGhhbmRsZSBtdWx0aXBsZSBzZWN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUuCi0JKHNldHVwX3NlY3Rpb25zKTogQWxsb2NhdGUgc3BhY2Ugb24gdGhlIEJGRCdzIG9ic3RhY2sgdG8gaG9sZAotCXNlY3Rpb24gbmFtZXMuICBVc2UgYmZkX21ha2Vfc2V0aW9uX2FueXdheSByYXRoZXIgdGhhbiB0aGUKLQlvYnNvbGV0ZSBtYWtlX3VuaXF1ZV9zZWN0aW9uLgotCShzb21fcHJlcF9oZWFkZXJzKTogQ2hvb3NlIHRoZSBjb3JyZWN0IFNPTSBtYWdpYyBudW1iZXIgYmFzZWQKLQlvbiB0aGUgQkZEJ3MgZmxhZ3MuCi0JKHNvbV9iZmRfZmlsbF9pbl9hcl9zeW1ib2xzKTogUmV0dXJuIGZhbHNlLCBub3QgTlVMTCBvbiBlcnJvci4KLQotU2F0IE1hciAxMiAwOTo0NjowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXBwYy5jOiBSZW5hbWVkIGZyb20gZWxmMzItcG93ZXJwYy5jLgotCSogbmxtMzItcHBjLmM6IFJlbmFtZWQgZnJvbSBubG0zMi1wb3dlcnBjLmMuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLUZyaSBNYXIgMTEgMjI6Mjc6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1wb3dlcnBjLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHVwZGF0ZSB0byBwcmVsaW1pbmFyeSBBQkkuCi0KLUZyaSBNYXIgMTEgMDA6MzQ6NTkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBzdW5vcy5jIChzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyk6ICBBc3N1bWUgdGhhdCBkeW5hbWljIGluZm8KLQlpcyBhbHdheXMgbG9jYXRlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgc2VjdGlvbiB0byBhbGxvdwotCXJlY292ZXJ5IG9mIHRoZSBkeW5hbWljIGluZm8gZnJvbSBhIHN0cmlwcGVkIGV4ZWN1dGFibGUuCi0JKiBlY29mZi5jIChlY29mZl9zdHlwX3RvX3NlY19mbGFncyk6ICBIYW5kbGUgU1RZUF9QREFUQSwgU1RZUF9YREFUQQotCWFuZCBTVFlQX0NPTU1FTlQuCi0KLVdlZCBNYXIgIDkgMTc6MTc6NTMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC1pbi5oOiBSZW1vdmUgYWxsb2NhIGNydWZ0LiAgSXQgd2FzIG1pc3Npbmcgc29tZSBuZWNlc3NhcnkKLQljcnVmdCAobGlrZSB0aGUgI3ByYWdtYSBhbGxvY2EgZm9yIEFJWCkuCi0JSW4gYWRkaXRpb24gdG8gdGhhdCBwcm9ibGVtLCB0aGUgQyBhbGxvY2EgY2FsbHMgeG1hbGxvYywgd2hpY2gKLQltZWFucyBjaGVja2luZyBmb3IgYmVpbmcgb3V0IG9mIG1lbW9yeSBjYW4ndCB3b3JrIHJpZ2h0LiAgVGhlCi0JZm9sbG93aW5nIGNoYW5nZXMgcmVtb3ZlIGFsbCB1c2VzIG9mIGFsbG9jYSBmcm9tIEJGRC4KLQkqIGhvc3RzL3NvbGFyaXMyLmg6IFJlbW92ZSBhbGxvY2EgY3J1ZnQuCi0JKiBzb20uYzogUmVwbGFjZSBhbGxvY2Egd2l0aCBhIGZpeGVkIHNpemUgYXV0byBhcnJheS4KLQkqIGFvdXR4LmgsIGVsZmNvZGUuaCwgbmxtY29kZS5oLCBib3V0LmMsIGNvZmYtYWxwaGEuYywgZWNvZmYuYywKLQllY29mZmxpbmsuYywgZWxmMzItaHBwYS5jLCBlbGYzMi1taXBzLmMsIGxpbmtlci5jLCByZWxvYy5jLCBzb20uYywKLQlzdW5vcy5jOiBSZXBsYWNlIGFsbG9jYSB3aXRoIG1hbGxvYyBhbmQgYXBwcm9wcmlhdGUgZXJyb3IgY2hlY2tpbmcgYW5kCi0JZnJlZWluZy4KLQkqIGxpbmtlci5jOiBSZXBsYWNlIGFsbG9jYSB3aXRoIG9ic3RhY2tfYWxsb2MuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotVHVlIE1hciAgOCAxMjoxMDozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgTUlQU19SX0xJVEVSQUwgbGlrZQotCU1JUFNfUl9HUFJFTC4KLQotU2F0IE1hciAgNSAxNDowODo1NCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGVsZjMyLWhwcGEuaCwgZWxmY29kZS5oOiAgUmVwbGFjZSB1c2VzIG9mIEVsZipfSGFsZiwgRWxmKl9Xb3JkLAotCUVsZipfT2ZmIHR5cGVkZWZzIGJ5IHRoZWlyIGV4cGFuc2lvbiwgdGhlIHR5cGVkZWZzIGhhdmUgYmVlbgotCXJlbW92ZWQgZnJvbSBpbmNsdWRlL2VsZi9pbnRlcm5hbC5oLgotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiAgSGFuZGxlIFNIVF9EWU5BTUlDIHNlY3Rpb24gbGlrZQotCVNIVF9QUk9HQklUUyBzZWN0aW9uLgotCi1UaHUgTWFyICAzIDIwOjAzOjM5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uaCAoX1BBX1JJU0NfSUQpOiBUcmVhdCBIT1NUX0hQUEFPU0YganVzdCBsaWtlIEhPU1RfSFBQQUJTRC4KLQotV2VkIE1hciAgMiAxMzoyODowNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3Q6IFJlY29nbml6ZSBpWzM0XTg2LXNlcXVlbnQtKi4KLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IEEgbm9uLXplcm8sIG5vdCB6ZXJvLAotCXJldHVybiBmcm9tIGJmZF9zZWVrIGluZGljYXRlcyBhbiBlcnJvci4KLQlOZXcgbWFjcm8gVFJBRF9DT1JFX0RTSVpFX0lOQ0xVREVTX1RTSVpFIHRvIHJlcGxhY2UKLQlUUkFEX0NPUkVfU1RBQ0tfT0ZGU0VULgotCSogaG9zdHMvc3ltbWV0cnkuaDogRGVmaW5lIFRSQURfQ09SRV9EU0laRV9JTkNMVURFU19UU0laRSBhbmQKLQlUUkFEX0NPUkVfVVNFUl9PRkZTRVQgYnV0IG5vdCBIT1NUX1NUQUNLX09GRlNFVC4KLQotV2VkIE1hciAgMiAxMTo1NzowMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLltjaF06IERvIG5vdCBpbmNsdWRlIGxpYmhwcGEuaCBpbiBzb20uYywgaW5zdGVhZCBpbmNsdWRlCi0JaXQgaW4gc29tLmguCi0KLQkqIGVsZjMyLWhwcGEuW2NoXTogRG8gbm90IGluY2x1ZGUgbGliaHBwYS5oIGluIGVsZjMyLWhwcGEuYywgaW5zdGVhZAotCWluY2x1ZGUgaXQgaW4gZWxmMzItaHBwYS5oLgotCi0JKiBzb20uYyAobG9nMik6IFJldHVybiAtMSBvbiBlcnJvciByYXRoZXIgdGhhbiBhYm9ydGluZy4KLQkoc2V0dXBfc2VjdGlvbnMpOiBCdWJibGUgdXAgYW4gZXJyb3IgZnJvbSBsb2cyLgotCi0JKiBDaGFuZ2VzIHRvIG1ha2UgSFAgQyBjb21waWxlciBoYXBweSBpbiBib3RoIHRyYWRpdGlvbmFsCi0JYW5kIEFOU0kgbW9kZS4KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IFVzZSBjb3JyZWN0IGVudW0gdHlwZSBmb3IKLQlmaWVsZCBwYXJhbWV0ZXIuCi0JKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyk6IFVzZSB1bnNpZ25lZCBpbnQgcmF0aGVyIHRoYW4KLQl1bnNpZ25lZCBjaGFyIHRvIGF2b2lkIEdOVS1DIGV4dGVuc2lvbnMuCi0JKGJmZF9zb21fYXR0YWNoX2F1eF9oZHIpOiBSZXR1cm4gYSBib29sZWFuIHRvIGluZGljYXRlIHN1Y2Nlc3MKLQlvciBmYWlsdXJlIHJhdGhlciB0aGFuIGFib3J0aW5nIG9uIGZhaWx1cmUuCi0KLQkqIHNvbS5oIChiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMpOiBGaXggcHJvdG90eXBlIHRvIG1hdGNoCi0Jc29tLmMgY2hhbmdlcy4KLQkoYmZkX3NvbV9hdHRhY2hfYXV4X2hkcik6IEFkZCBwcm90b3R5cGUuCi0JKGhwcGFfc29tLWdlbl9yZWxvY190eXBlKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLWhwcGEuYzogQWRkIGEgY291cGxlIGNhc3RzIHRvIG1ha2UgSFAgY29tcGlsZXIgaGFwcHkuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IERvIG5vdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQotCXVudGlsIHJlc3Qgb2YgY29kZSBpcyByZWFkeSB0byBoYW5kbGUgaXQuICBBYm9ydCBmb3Igbm93LgotCi1UdWUgTWFyICAxIDE4OjMzOjU5IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLVR1ZSBNYXIgIDEgMTM6MDY6NTMgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogaTM4Nm9zOWsuYzogdXNlIG5ldyBmdW5jdGlvbnMgYmZkX3NldF9lcnJvciBhbmQgYmZkX2dldF9lcnJvci4KLQkqIE1ha2VmaWxlLmluOiBkZWxldGUgYW4gZXh0cmEgYmxhbmsuCi0JKiBjb25maWd1cmUuaW4gOiBBZGQgaTM5Nm9zOWtfdmVjLgotCi1Nb24gRmViIDI4IDE1OjQxOjAxIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgOiBBZGQgaTM4Ni1vczlrLgotCSogY29uZmlnL2kzODYtb3M5ay5tdCA6IE5ld2x5IGFkZCBvczlrIHRhcmdldCBtYWtlZmlsZS4KLQotCSogaTM4Nm9zOWsuYyA6IG5ldyBmaWxlIHRvIGhhbmRsZSBvczlrIGZvcm1hdCBiZmQuCi0JKiBNYWtlZmlsZS5pbiA6IEhhbmRsZSBuZXcgZmlsZSBpMzg2b3M5ay5jCi0JKiB0YXJnZXRzLmMgOiBBZGQgYmZkX3RhcmdldF9vczlrX2ZsYXZvdXIgYW5kIGkzODZvczlrX3ZlYy4KLQkqIGNhY2hlLmMgOiBJbml0aWFsaXplIGNhY2hlX3NlbnRpbmVsIHRvIDAuCi0KLVN1biBGZWIgMjcgMTY6MzA6NTUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAobWlzbWF0Y2hlcywgcmV0dmFsX21pc21hdGNoZXMpOiBGaXggbWlzbWF0Y2gKLQlhY3Rpb24gaW4gY2FzZSB3aGVyZSBjYWxsZXIgc3BlY2lmaWVkIG5vIGFyZ3VtZW50IHJlbG9jYXRpb24uCi0JKGhwcGFfZWxmX2J1aWxkX2xpbmtlcl9zdHViKTogVHJ5IGFnYWluIHRvIGdldCB0aGUgc3ltX3B0cl9wdHIKLQlyaWdodCBpbiB0aGUgb3JpZ2luYWwgcmVsb2NhdGlvbiBhbmQgdGhlIHN0dWIncyByZWxvY2F0aW9uLgotCi0gICAgICAgICogZWxmMzItaHBwYS5oIChocHBhX2xvb2tfZm9yX3N0dWJfaW5fc2VjdGlvbik6IEZpeCB0eXBvLiAgRGVsZXRlCi0JdW51c2VkIHN5bWJvbHMgYXJndW1lbnQuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfc3R1Yl9yZWxvYyk6IEFjY2VwdCBhc3ltYm9sICoqIHJhdGhlcgotCXRoYW4gYXN5bWJvbCAqIGZvciBvcmlnaW5hbCB0YXJnZXQgc3ltYm9sLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQlTZXQgcmVsb2MtPnN5bV9wdHJfcHRyIGFwcHJvcHJpYXRlbHkuCi0JKGhwcGFfZWxmX2J1aWxkX2xpbmtlcl9zdHViKTogU2V0IHJlbG9jLT5zeW1fcHRyX3B0ciBjb3JyZWN0bHkuCi0JKGhwcGFfZWxmX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBObyBsb25nZXIgbmVlZCBzeW1ib2xzCi0JYXJndW1lbnQuICBVc2UgdGhlIG91dHB1dCBzeW1ib2xzIHdoZW4gY2Fub25pY2FsaXppbmcgdGhlIHJlbG9jcywKLQljcmVhdGluZyB0aGVtIGlmIG5lY2Vzc2FyeS4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogRG8gbm90Ci0JcmVidWlsZC9jbG9iYmVyIHRoZSBvdXRwdXQgc3ltYm9scyBpZiB0aGV5IGFscmVhZHkgZXhpc3QuCi0KLVN1biBGZWIgMjcgMTU6MjI6MzYgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmMgKEJGRF9TRU5ELCBCRkRfU0VORF9GTVQpOiBBZGQgZGVidWdnaW5nIHZlcnNpb25zIHRoYXQKLQljaGVjayBhbGwgdGhlIHBvaW50ZXIgZGVyZWZlcmVuY2VzLiAgRW5hYmxlZCB2aWEgREVCVUdfQkZEX1NFTkQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIHNyZWMuYyAoaGV4X3ZhbHVlKTogQWx3YXlzIHNldCB0byBhIHNpemUgb2YgMjU2IGJ5dGVzLgotCShzcmVjX2luaXQpOiBDb3NtZXRpYyBjaGFuZ2VzLgotCi1TdW4gRmViIDI3IDExOjE4OjQ3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmM6IFNlY29uZCBoYWxmIG9mIG1ham9yIGNsZWFudXAuICBNb3JlIGNvbW1lbnRzLAotCVBBUkFNaXplIGFuZCBzdGF0aWNpemUgcmVzdCBvZiBmdW5jdGlvbnMuICBEZWxldGUgdW51c2VkCi0JZnVuY3Rpb25zLiAgRGVsZXRlIHVudXNlZC91bm5lY2Vzc2FyeSBhcmd1bWVudHMgdG8gc29tZSBmdW5jdGlvbnMuCi0JR3JvdXAgc3RhdGljIHZhcnMgdG9nZXRoZXIuICBBYm9ydCBmb3IgYmFkIGVycm9ycyB1bnRpbCB3ZSBoYXZlCi0JZXJyb3IgY29kZSBwcm9wb2dhdGlvbiB3b3JraW5nLiAgV29yayBvbiBzcGFjaW5nIGFuZCBpbmRlbnRpb24uCi0JQWRkIEZJWE1FcyBmb3IgdW5yZXNvbHZlZCBwcm9ibGVtcy4gIFVzZSBlbnVtcyByYXRoZXIgdGhhbgotCSNkZWZpbmVzIGZvciBsb3RzIG9mIHRoaW5ncy4gIE1lcmdlIHR3byBmdW5jdGlvbnMgd2hpY2ggYnVpbGQKLQlsaW5rZXIgc3R1YnMgaW50byBhIHNpbmdsZSBmdW5jdGlvbiAoc28gdGhleSBjYW4gZWFzaWx5IHNoYXJlIGEKLQl0b24gb2YgY29tbW9uIGNvZGUpLgotCi1TYXQgRmViIDI2IDEwOjAwOjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoX2JmZF9yZWxvY2F0ZV9jb250ZW50cyk6IEFkanVzdCBoYW5kbGluZyBvZiBvdmVyZmxvdyB0bwotCWF2b2lkIGRlcGVuZGluZyB1cG9uIHJpZ2h0IHNoaWZ0cyBvZiBzaWduZWQgbnVtYmVycywgYW5kIHRvCi0JY29ycmVjdCBoYW5kbGluZyBvZiBzcmNfbWFzayB3aXRoIGxvd2VyIGJpdHMgemVyby4KLQotCSogYW91dHguaCwgYXJjaGl2ZS5jOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MgZnJvbSBTVlI0IGNjLgotCSogZWNvZmYuYywgZWNvZmZsaW5rLmMsIGVjb2Zmc3dhcC5oLCBzcmVjLmM6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogTWFrZSBpIHVuc2lnbmVkOyByZW1vdmUgb2xkCi0JI2lmIDAgY29kZS4KLQkoZWxmX3dyaXRlX3BoZHJzKTogTWFrZSBpIHVuc2lnbmVkLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IE1ha2UgaSBhbmQgbl9sZWZ0IHVuc2lnbmVkLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IE1ha2UgaSB1bnNpZ25lZC4KLQkod3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBNYWtlIGNvdW50IHVuc2lnbmVkLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyk6IE1ha2UgaSB1bnNpZ25lZC4KLQkoTkFNRShiZmQsZWxmX3dyaXRlX29iamVjdF9jb250ZW50cykpOiBNYWtlIGNvdW50IHVuc2lnbmVkLgotCShzZWN0aW9uX2Zyb21fZWxmX2luZGV4KTogTWFrZSBpbmRleCBhcmd1bWVudCB1bnNpZ25lZC4KLQotRnJpIEZlYiAyNSAyMTozNDo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaDogRG9uJ3QgaW5jbHVkZSBhc3NlcnQuaC4KLQkoc3dhcF9vdXRfc3ltcyk6IFVzZSBCRkRfQVNTRVJUIHJhdGhlciB0aGFuIGFzc2VydC4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBBZGQgbWlzc2luZwotCWJyZWFrIGluIHN3aXRjaC4KLQotCSogaG9zdHMvaTM4NnY0LmggKHFzb3J0LCBzdHJ0b2wpOiBSZW1vdmUgaW5jb3JyZWN0IGFuZCB1c2VsZXNzCi0JZGVjbGFyYXRpb25zLgotCi1GcmkgRmViIDI1IDE2OjM1OjU3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBsaWJocHBhLmggKGhwcGFfcmVidWlsZF9pbnNuKTogTW92ZWQgaGVyZSBmcm9tIGVsZjMyLWhwcGEuYy4KLQotCSogZWxmMzItaHBwYS5oIChlbGZfaHBwYV90Y19zeW1ib2wpOiBBZGQgbmV3IGFyZ3VtZW50cy4KLQkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCShlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogQWRkIGV4dGVybiBkZWNsLgotCi0JKiBlbGYzMi1ocHBhLmM6IEZpcnN0IGhhbGYgb2YgbWFqb3IgY2xlYW51cC4gIEFkZC9jbGVhbnVwIGxvdHMgb2YKLQljb21tZW50cy4gIFBBUkFNaXplIHNvbWUgc3RhdGljIGZ1bmN0aW9ucy4gIERlbGV0ZSB1bnVzZWQgZnVuY3Rpb25zLgotCURlbGV0ZSB1bnVzZWQvdW5uZWNlc3NhcnkgYXJndW1lbnRzIHRvIG1hbnkgZnVuY3Rpb25zLiAgR3JvdXAKLQlzdGF0aWMgdmFycyB0b2dldGhlci4gIENvbGxhcHNlIGNvbW1vbiBjYXNlIHN0YXRlbWVudHMgdG9nZXRoZXIKLQlpbiBtYW55IHBsYWNlcy4gIFVzZSBkZWZhdWx0IGNhc2Ugd2hlbiBwb3NzaWJsZSBpbnN0ZWFkIG9mIGxpc3RpbmcKLQllYWNoIGNhc2Ugc2VwYXJhdGVseS4gIEFib3J0IGZvciBiYWQgZXJyb3JzIHVudGlsIHdlIGdldCBlcnJvcgotCWNvZGUgcHJvcG9nYXRpb24gd29ya2luZy4gIFdvcmsgb24gc3BhY2luZyBhbmQgaW5kZW50aW9uIHByb2JsZW1zLgotCUFkZCBGSVhNRXMgZm9yIHNvbWUgdW5yZXNvbHZlZCBwcm9ibGVtcy4gIERlbGV0ZSBob3BlbGVzc2x5IGJyb2tlbiAKLQlDT01QTEVYIHJlbG9jYXRpb24gc3VwcG9ydCAoaXQncyBuZXZlciB1c2VkIGFueXdheSkuCi0JKGhwcGFfZWxmX3JlYnVpbGRfaW5zbik6IERlbGV0ZS4gIE1vdmVkIGludG8gbGliaHBwYS5oLgotCShlbGZfaHBwYV90Y19zeW1ib2wpOiBBY2NlcHQgYW5kIHVzZSBuZXcgYXJndW1lbnRzIChzeW1leHQgY2hhaW5zKS4KLQkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogSW5pdGlhbGl6ZSBtYXRjaGluZ192ZWN0b3IKLQl0byBrZWVwIGdjYyAtV2FsbCBxdWlldC4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NhX3RhYmxlKTogRml4IHR5cG8uCi0KLQkqIHNvbS5jIChzb21fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IFVzZSAic2l6ZW9mIChhc3ltYm9sICopIgotCW5vdCAic2l6ZW9mIChzb21fc3ltYm9sX3R5cGUgKikiLgotCi0JKiBlbGZjb2RlLmggKGVsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogVXNlICJzaXplb2YgKGFzeW1ib2wgKikiCi0Jbm90ICJzaXplb2YgKGFzeW1ib2wiKS4gIE9wcHMuCi0KLUZyaSBGZWIgMjUgMTM6MTk6MDQgMTk5NCAgVGVkIExlbW9uICAobWVsbG9uQHBlcHBlci5uY2QuY29tKQotCi0JKiBiZmQuYyAoYmZkX2dldF9ncF9zaXplKTogQ2FuJ3QgcmV0dXJuIGdwIHZhbHVlIG9uIGFuIGFyY2hpdmUuCi0JKGJmZF9zZXRfZ3Bfc2l6ZSk6ICBDYW4ndCBzZXQgZ3AgdmFsdWUgb24gYW4gYXJjaGl2ZS4KLQotRnJpIEZlYiAyNSAxMjo1NzowMCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBzcmVjLmMgKHBhc3Nfb3Zlcik6IERvbid0IHNraXAgdG9vIG1hbnkgY2hhcmFjdGVycyB3aGVuCi0JZW5kIG9mIGxpbmUgc2Vlbi4KLQotRnJpIEZlYiAyNSAxMTo0MTo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NpemVvZl9oZWFkZXJzKTogQWxpZ24gcmVzdWx0IHRvIDE2IGJ5dGUKLQlib3VuZGFyeS4KLQotVGh1IEZlYiAyNCAwNzoxMzoyMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8pOiBEZXJpdmUgc3ltYm9sX2luZm8KLQlmaWVsZCBmb3IgYWJzb2x1dGUgc3ltYm9scyBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgdW5kZWZpbmVkCi0JYW5kIGNvbW1vbiBzeW1ib2xzLgotCi1UaHUgRmViIDI0IDA0OjI5OjE5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWxmY29kZS5oIChlbGZfY29yZV9maWxlX3ApOiAgQ2hlY2sgZm9yIGNvcmUgZmlsZSBlX21hY2hpbmUgbWF0Y2gKLQlsaWtlIGluIGVsZl9vYmplY3RfcC4KLQotV2VkIEZlYiAyMyAxODoyODozNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmY29kZS5oIChhbGxvY2EpOiBEZWxldGUgZGVjbGFyYXRpb24uCi0KLQkqIHNvbS5jIChzb21fcHJlcF9oZWFkZXJzKTogVXNlIENQVV9QQV9SSVNDMV8wIGZvciBtYWdpYwotCW51bWJlciByYXRoZXIgdGhhbiBIUDkwMDBTODAwX0lELiAgTm90ZSBzb20uYyBpcyBjYXJlZnVsCi0JdG8gbWFrZSBzdXJlIENQVV9QQV9SSVNDMV8wIGlzIGFsd2F5cyBkZWZpbmVkLgotCi1Nb24gRmViIDIxIDEwOjEyOjAyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRhcmdldHMubywgYXJjaHVyZXMubyk6IFVzZSBBTExfQ0ZMQUdTIHRvIHN1cHBseQotCWZsYWdzIHRvIGV4cGxpY2l0IGNvbXBpbGUgYWN0aW9ucy4KLQotTW9uIEZlYiAyMSAwOTo1MDowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogZWNvZmZsaW5rLmMgKGVjb2ZmX3dyaXRlX3N5bWhkcik6IFNldCBzeW1oZHItPm1hZ2ljIGhlcmUuCi0JKiBlY29mZi5jIChlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBNYWtlIHN1cmUgLmJzcyBzZWN0aW9uCi0JZW5kcyBvbiBhIHBhZ2UgYm91bmRhcnkgaWYgdGhlcmUgaXMgbm8gc3ltYm9sIHRhYmxlLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IERvbid0IHNldCBzeW1oZHItPm1hZ2ljIGhlcmUuCi0KLQkqIGhvc3RzL2hwMzAwLmg6IEluY2x1ZGUgPHN0ZGxpYi5oPjsgZG9uJ3QgZGVjbGFyZSBmcmVlLgotCi0JKiBzb20uYyAoc29tX2JmZF9jb3VudF9hcl9zeW1ib2xzKTogVXNlIGEgcG9pbnRlciBhbmQgYWxsb2NhCi0JcmF0aGVyIHRoYW4gYW4gYXJyYXkgb2YgdmFyaWFibGUgc2l6ZS4KLQkoc29tX2JmZF9maWxsX2luX2FyX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBMaWtld2lzZS4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogUmV3cml0ZSBtYXNrIGFuZCBzaGlmdAotCW9wZXJhdGlvbiB0byBhdm9pZCBPU0YgMS4zIGNjIGJ1Zy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE1ha2UgdGV4dF9zaXplLCBkYXRhX3NpemUKLQlhbmQgYnNzX3NpemUgYmZkX3NpemVfdHlwZSBpbnN0ZWFkIG9mIHVuc2lnbmVkIGxvbmcuICBNYWtlCi0JdGV4dF9zdGFydCBhbmQgZGF0YV9zdGFydCBiZmRfdm1hIGluc3RlYWQgb2YgdW5zaWduZWQgbG9uZy4KLQkqIGVjb2ZmbGluay5jIChlY29mZl9hZGRfc3RyaW5nKTogUmVtb3ZlIGluY29ycmVjdCBjYXN0IG9mIHJldHVybgotCXZhbHVlLgotCi1TdW4gRmViIDIwIDE2OjA2OjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IENvbnNpZGVyCi0Jc3ltYm9scyBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIGFyY2hpdmUgbWFwLgotCi1TYXQgRmViIDE5IDAzOjE3OjMyIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29mZi1hbHBoYS5jIChyZWxvY19uaWwpOiAgQWRkIGZvcndhcmQgZGVjbGFyYXRpb24sIGFkZCBtaXNzaW5nCi0JZXJyb3JfbWVzc2FnZSBhcmd1bWVudC4KLQkqIGNvZmYtc3BhcmMuYyAoYmZkX2NvZmZfZ2VuZXJpY19yZWxvYyk6ICBBZGQgZm9yd2FyZCBkZWNsYXJhdGlvbiwKLQlhZGQgbWlzc2luZyBlcnJvcl9tZXNzYWdlIGFyZ3VtZW50LgotCSogbWlwc2JzZC5jIChtaXBzX2ZpeF9oaTE2X3MpOiAgQWRkIGZvcndhcmQgZGVjbGFyYXRpb24sIGFkZCBtaXNzaW5nCi0JZXJyb3JfbWVzc2FnZSBhcmd1bWVudC4KLQotRnJpIEZlYiAxOCAxMTo0MTo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlTdXBwb3J0IGZvciBQb3dlclBDIE5ldFdhcmUuCi0JKiBubG0zMi1wb3dlcnBjLmM6IE5ldyBmaWxlLgotCSogY29uZmlnLmJmZCAocG93ZXJwYy0qLW5ldHdhcmUqKTogTmV3IHRhcmdldDsgdXNlIHBwYy1ubG0uCi0JKiBjb25maWcvcHBjLW5sbS5tdDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKG5sbTMyX3Bvd2VycGNfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3I7IHVzZQotCW5sbTMyLXBvd2VycGMubywgbmxtMzIubywgbmxtLm8uCi0JKiB0YXJnZXRzLmMgKG5sbTMyX3Bvd2VycGNfdmVjKTogRGVjbGFyZS4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBubG0zMi1wb3dlcnBjLm8uCi0JKENGSUxFUyk6IEFkZCBubG0zMi1wb3dlcnBjLmMuCi0KLQlJbml0aWFsIHN1cHBvcnQgZm9yIFBvd2VyUEMgRUxGLiAgRG9uZSB3aXRob3V0IGFuIEFCSSwgYW5kCi0JcHJvYmFibHkgdG8gYmUgY2hhbmdlZCB3aGVuIEkgZ2V0IGFuIEFCSS4KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGMtKi1zeXN2NCopOiBOZXcgdGFyZ2V0OyB1c2UgcHBjLWVsZi4KLQkqIGNvbmZpZy9wcGMtZWxmLm10OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX3Bvd2VycGNfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3I7IHVzZQotCWVsZjMyLXBvd2VycGMubywgZWxmMzIubywgZWxmLm8uCi0JKiBlbGYzMi1wb3dlcnBjLmM6IE5ldyBmaWxlLgotCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMpOiBBZGQgYmZkX2FyY2hfcG93ZXJwYyBjYXNlLgotCShlbGZfc2V0X2FyY2hfbWFjaCk6IExpa2V3aXNlLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfcG93ZXJwY192ZWMpOiBEZWNsYXJlLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZjMyLXBvd2VycGMuby4KLQkoQ0ZJTEVTKTogQWRkIGVsZjMyLXBvd2VycGMuYy4KLQlSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotVGh1IEZlYiAxNyAxNToyOTo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl93cml0ZV9saW5lbnVtYmVycyk6IEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSGFuZGxlIHplcm8gc3ltYm9scwotCXJlYXNvbmFibHkuICBBbGxvY2F0ZSB4X3N5bXAgdXNpbmcgYWxsb2NhLgotCi0JKiBlbGZjb2RlLmggKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogRUxGIHByb2dyYW0gaGVhZGVyIGVudHJpZXMKLQltdXN0IGJlIHNvcnRlZCBieSBsb2FkIGFkZHJlc3MuICBUaGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGVudHJpZXMKLQlpbiByZXZlcnNlIG9yZGVyLgotCi0JKiBzZWN0aW9uLmMgKFNFQ19JTl9NRU1PUlkpOiBEZWZpbmUuCi0JKGFzZWN0aW9uKTogUmVuYW1lIHVudXNlZCBmaWVsZCBvdGhlcnVzZXJkYXRhIHRvIGNvbnRlbnRzLCBhbmQKLQltYWtlIGl0IGNoYXIgKi4KLQkoYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkpOiBJbml0aWFsaXplIGNvbnRlbnRzIGZpZWxkIHRvIE5VTEwuCi0JKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IElmIFNFQ19JTl9NRU1PUlkgaXMgc2V0LCBnZXQgc2VjdGlvbgotCWNvbnRlbnRzIGZyb20gY29udGVudHMgZmllbGQgcmF0aGVyIHRoYW4gZnJvbSBmaWxlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1UaHUgRmViIDE3IDA4OjMwOjUzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKGJmZF9nZXRfZXJyb3IsIGJmZF9zZXRfZXJyb3IpOiBOZXcgZnVuY3Rpb25zLgotCShiZmRfZXJyb3IpOiBNYWtlIHN0YXRpYy4KLQkoYmZkX2Vycm9yX3R5cGUpOiBSZW5hbWVkIGZyb20gYmZkX2VjLiAgUHJlcGVuZCAiYmZkX2Vycm9yXyIgdG8KLQlhbGwgdmFsdWVzLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGFpeDM4Ni1jb3JlLmMsIGFvdXQtYWRvYmUuYywgYW91dC1lbmNhcC5jLCBhb3V0LXRhcmdldC5oLCAKLQlhb3V0ZjEuaCwgYW91dHguaCwgYXJjaGl2ZS5jLCBhcmNodXJlcy5jLCAKLQliZmQuYywgYm91dC5jLCBjYWNoZS5jLCBjb2ZmLWFscGhhLmMsIGNvZmYtbWlwcy5jLCAKLQljb2ZmLXJzNjAwMC5jLCBjb2ZmY29kZS5oLCBjb2ZmZ2VuLmMsIGNvcmUuYywgY3Rvci5jLCAKLQllY29mZi5jLCBlY29mZmxpbmsuYywgZWxmLmMsIGVsZjMyLWhwcGEuYywgZWxmMzItbWlwcy5jLCAKLQllbGZjb2RlLmgsIGZvcm1hdC5jLCBoYXNoLmMsIGhwMzAwaHB1eC5jLCBocHBhYnNkLWNvcmUuYywgCi0JaTM4Nmx5bnguYywgaWVlZS5jLCBsaWJiZmQuYywgbGliZWxmLmgsIGxpbmtlci5jLCAKLQlseW54LWNvcmUuYywgbmxtLmMsIG5sbTMyLWFscGhhLmMsIG5sbTMyLWkzODYuYywgCi0JbmxtMzItc3BhcmMuYywgbmxtY29kZS5oLCBvYXN5cy5jLCBvcG5jbHMuYywgb3NmLWNvcmUuYywgCi0JcHRyYWNlLWNvcmUuYywgcmVsb2MxNi5jLCByczYwMDAtY29yZS5jLCBzZWN0aW9uLmMsIHNvbS5jLCAKLQlzcmVjLmMsIHN1bm9zLmMsIHN5bXMuYywgdGFyZ2V0cy5jLCB0ZWtoZXguYywgCi0JdHJhZC1jb3JlLmM6IENoYW5nZSBjYWxsZXJzLgotCi1UdWUgRmViIDE1IDIyOjI3OjI3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYzogUmVtb3ZlIEZJWE1FcyBmb3IgdGhpbmdzIHdoaWNoIGhhdmUgYmVlbiBkZWFsdCB3aXRoLgotCi1UdWUgRmViIDE1IDE5OjM5OjI0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogU2luY2UgdGhpcyBmdW5jdGlvbiByZWFkcwotCXVucmVsb2NhdGVkIGNvbnRlbnRzLCB0aGUgc2VjdGlvbidzIHJhdyBzaXplIGlzIGFsd2F5cyB0aGUgb25lIHRvCi0JdXNlIGZvciBib3VuZHMgY2hlY2tpbmcuCi0KLQkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBJbiBhc3NlcnRpb24sIGNvbXBhcmUKLQlsaW5rX29yZGVyIHNpemUgZmllbGQgYWdhaW5zdCBjb29rZWQgc2l6ZSwgbm90IHJhdyBzaXplLCBvZiBpbnB1dAotCXNlY3Rpb24uCi0KLQkqIGJvdXQuYyAoYl9vdXRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRm9yIEJTUyBzZWN0aW9uLCBqdXN0Ci0JcmV0dXJuIDAuCi0JKGFsaWduY29kZSk6IFdoZW4gc2hyaW5raW5nLCB0aGUgYWRkZW5kIHNob3VsZCBiZSBzZXQgdG8gdGhlCi0JY3VycmVudCBvZmZzZXQgaW4gdGhlIHNlY3Rpb24gcGx1cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHBhZGRpbmcKLQl0aGF0IHdpbGwgYWN0dWFsbHkgYmUgcmV0YWluZWQuCi0JKGJfb3V0X3JlbGF4X3NlY3Rpb24pOiBJZiBhIHNlY3Rpb24gY29udGFpbnMgbm8gcmVsb2NhdGlvbnMsIGRvbid0Ci0JYm90aGVyIHByb2Nlc3NpbmcgdGhlbS4KLQkoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0IHJlbG9jX2RvbmUuICBBc3NlcnQKLQl0aGF0IGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyByZXR1cm5zIHRydWUuICBDaGVjayB0aGF0IHJlbG9jcyBhcmUKLQlwcm9wZXJseSBvcmRlcmVkLgotCShiX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMsIGNhc2UgQUxJR05ET05FKTogQXNzZXJ0Ci0JdGhhdCByZWxvYy0+YWRkZW5kIGZhbGxzIGJldHdlZW4gdGhlIGN1cnJlbnQgc291cmNlIG9mZnNldCBhbmQgdGhlCi0JcmF3IHNpemUgb2YgdGhlIGlucHV0IHNlY3Rpb24uCi0KLQkqIGNvbmZpZy5iZmQ6IFN1cHBvcnQgaTk2MCB2eHdvcmtzIHZlcnNpb25zID4gNS4wIHdpdGggY29mZiwgbm90Ci0JYm91dC4gIERlZmF1bHQgd2l0aCBubyB2ZXJzaW9uIG51bWJlciBpcyBzdGlsbCBib3V0LiAgU3VwcG9ydAotCWV4cGxpY2l0IGk5NjAtY29mZiB0YXJnZXQgdG9vLgotCi0JKiBib3V0LmM6IENoYW5nZWQgc29tZSBpbmRlbnRhdGlvbiwgZGVsZXRlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLAotCWZpeGVkIHNvbWUgY29tbWVudHMsIHJlbW92ZWQgc29tZSAiI2lmIDEiIGxpbmVzLgotCShvdXRwdXRfYWRkcik6IE5ldyBtYWNyby4KLQkoY2FsbGp4X2NhbGxiYWNrLCBjYWxsal9jYWxsYmFjaywgZ2V0X3ZhbHVlLCBhYnMzMmNvZGUsIGFsaWduY29kZSwKLQliX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBVc2UgaXQgZm9yIHJlYWRhYmlsaXR5LgotCi1UdWUgRmViIDE1IDA5OjAwOjE2IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSk6IEl0ZXJhdGUgdGhyb3VnaCB0aGUgU09NCi0Jc3ltYm9scywgbm90IHRoZSBCRkQgc3ltYm9scy4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBMaWtld2lzZS4KLQotTW9uIEZlYiAxNCAyMjo1NToyMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBEbyBub3QgZGllIGlmIGEgQkZEIGRvZXNuJ3QKLQloYXZlIGFueSBzeW1ib2xzLgotCi0JKiBGaW5pc2ggYmFzaWMgcmVhZC13cml0ZSBzdXBwb3J0IGZvciBTT00gYXJjaGl2ZSBsaWJyYXJpZXMuICBCdWdzCi0Jc3VyZWx5IHJlbWFpbiBhcyB0aGlzIGhhc24ndCBiZWVuIHRlc3RlZCBhbGwgdGhhdCBtdWNoLgotCSogc29tLmMgKFNPTV9MU1RfSEFTSF9TSVpFLCBTT01fTFNUX01PRFVMRV9MSU1JVCk6IERlZmluZS4KLQkoc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvKTogTmV3IHN0cnVjdHVyZSB0byBob2xkIGluZm8gbmVjZXNzYXJ5Ci0JdG8gYnVpbGQgYm90aCBub3JtYWwgYW5kIGxpYnJhcnkgc3ltYm9sIHRhYmxlcy4KLQkoc29tX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvKTogTmV3IGZ1bmN0aW9uIHRvIGRlcml2ZSBpbmZvIG5lY2Vzc2FyeQotCXRvIGJ1aWxkIGJvdGggbm9ybWFsIGFuZCBsaWJyYXJ5IHN5bWJvbCB0YWJsZXMuCi0JKHNvbV9idWlsZF9hbmRfd3JpdGVfc3ltYm9sX3RhYmxlKTogVXNlIG5ldyBmdW5jdGlvbiB0byBkZXJpdmUgbWlzYwotCXN5bWJvbCBpbmZvcm1hdGlvbi4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFVwZGF0ZSBiYWNrZW5kIHByaXZhdGUgZGF0YSBmb3Igc3ltYm9scwotCWFwcHJvcHJpYXRlbHkuCi0JKHNvbV9iZmRfcHJlcF9mb3JfYXJfd3JpdGUpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9iZmRfYXJfc3ltYm9sX2hhc2gpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogTmV3IGZ1bmN0aW9uLgotCShzb21fd3JpdGVfYXJtYXApOiBGbGVzaCBvdXQuCi0JKHNvbV92ZWMpOiBGaXggYXIgcGFkZGluZyBjaGFyYWN0ZXIuCi0KLQkqIHNvbS5jOiBDb25zaXN0ZW50bHkgdXNlIG1lbXNldCByYXRoZXIgdGhhbiBiemVyby4KLQotTW9uIEZlYiAxNCAxNzowMjoyOCAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLXJzNjAwMC5jOiAgQWRkIEx5bnggY29yZSBmaWxlIHN1cHBvcnQsIHVzZSBIT1NUX0FJWCwgd2hlcmUKLQlhcHByb3ByaWF0ZS4KLQkqIHJzNjAwMC1jb3JlLmM6ICBVc2UgSE9TVF9BSVggaW5zdGVhZCBvZiBDT1JFRklMRVNfUExFQVNFLgotCSogY29uZmlnL3JzNjAwMC5taDogIFJlbW92ZSBkZWZzIG9mIEFSQ0hJVkVTX1BMRUFTRSBhbmQKLQlDT1JFRklMRVNfUExFQVNFLgotCSogY29uZmlnL3JzNjAwMGx5bngubWg6ICBUdXJuIG9uIEx5bnggY29yZSBmaWxlIHN1cHBvcnQuCi0JKiBob3N0cy9yczYwMDAuaDogICNkZWZpbmUgSE9TVF9BSVguCi0JKiBob3N0cy9yczYwMDBseW54Lmg6ICBDcmVhdGUgdGhpcyB0byBlbmFibGUgTHlueCBob3N0IHN1cHBvcnQuCi0KLVN1biBGZWIgMTMgMTQ6MzA6MDAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oIChzb21fc3ltYm9sX2RhdGEpOiBTYWZlbHkgYWNjZXNzIGJhY2tlbmQgcHJpdmF0ZSBkYXRhCi0JZm9yIEJGRCBzeW1ib2xzLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQotCSogUmVhZC1vbmx5IFNPTSBhcmNoaXZlIHN1cHBvcnQuCi0JKiBzb20uYyAoc29tX2JmZF9jb3VudF9hcl9zeW1ib2xzKTogTmV3IGhlbHBlciBmdW5jdGlvbi4KLQkoc29tX2JmZF9maWxsX2luX2FyX3N5bWJvbHMpOiBOZXcgaGVscGVyIGZ1bmN0aW9uLgotCShzb21fc2x1cnBfYXJtYXApOiBOZXcgZnVuY3Rpb24gdG8gcmVhZCBhIFNPTSBMU1QuCi0KLQkqIHNvbS5oOiBJbmNsdWRlIDxsc3QuaD4gYW5kIDxhci5oPi4KLQotU2F0IEZlYiAxMiAyMjozNDoxNCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBGaXggdHlwby4KLQkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlcyBmcm9tIHByZXBfaGVhZGVycyBhbmQKLQllbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLgotCShzZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCi1GcmkgRmViIDExIDE2OjU2OjUwIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChub3JtYWxpemUpIFtWTVNdOiBDYWxsIG1hbGxvYywgbm90IGJmZF94bWFsbG9jLgotCShiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBDaGVjayByZXN1bHQgb2Ygbm9ybWFsaXplLgotCi1UdWUgRmViICA4IDA4OjU3OjMxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCU1ha2UgYWxsIGNhbGxlcnMgb2YgbWFsbG9jIG9yIHJlYWxsb2MgKGluY2x1ZGluZyB2aWEgb2JzdGFja3MpCi0JY2hlY2sgdGhlIHJlc3VsdCBmb3IgTlVMTC4gIE1vc3Qgc2V0IGJmZF9lcnJvciB0byBub19tZW1vcnkgYW5kCi0JcmV0dXJuIGluIHRoYXQgY2FzZTsgYSBmZXcgYXJlIGhhcmRlciB0byBmaXgsIGFuZCBhcmUgbWFya2VkCi0Jd2l0aCAiRklYTUUgPHJldHVybiB0eXBlPiIuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIKLQlocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogIENoZWNrIGJmZF9tYWtlX2VtcHR5X3N5bWJvbCByZXR1cm4uCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMKLQlfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogRGl0dG8KLQkqIHNlY3Rpb24uYyAoYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkpOiBEaXR0by4KLQotCSogdGVraGV4LmMgKGZpbmRfY2h1bmsgdGVraGV4X21rb2JqZWN0KTogQ2hlY2sgYmZkX2FsbG9jLgotCShmaXJzdF9waGFzZSk6IERpdHRvLiAgRklYTUUgdm9pZAotCSh0ZWtoZXhfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgotCi0JKiBzdW5vcy5jIChzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyk6IENoZWNrIGJmZF96YWxsb2MuCi0JKE1ZKHJlYWRfZHluYW1pY19zeW1ib2xzKSBNWShyZWFkX2R5bmFtaWNfcmVsb2NzKSk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogc3RyaW5naGFzaC5jIChfYmZkX3N0cmluZ3RhYl9oYXNoX25ld2Z1bmMpOiBDaGVjayBiZmRfaGFzaF9hbGxvY2F0ZS4KLQotCSogc3JlYy5jOiBJbmRlbnQuCi0JKGZpbGx1cF9zeW1ib2xzKTogQ2hlY2sgYmZkX2FsbG9jLiAgRklYTUUgdm9pZAotCShzcmVjX21rb2JqZWN0IHNyZWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLQlzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2hlY2sgYmZkX2FsbG9jLiAKLQkoc3JlY19tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCi0KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IENoZWNrIGJmZF9hbGxvY19ieV9zaXplX3QuCi0JKG1ha2VfdW5pcXVlX3NlY3Rpb24pOiBDaGVjayBiZmRfYWxsb2MuCi0JKHNvbV9uZXdfc2VjdGlvbl9ob29rKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkoYmZkX3NvbV9hdHRhY2hfYXV4X2hkcik6IERpdHRvLiAgRklYTUUgdm9pZAotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfcCk6IENoZWNrIGJmZF96YWxsb2MuCi0KLQkqIG9zZi1jb3JlLmMgKG9zZl9jb3JlX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkob3NmX2NvcmVfY29yZV9maWxlX3ApOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIG9hc3lzLmMgKG9hc3lzX3NsdXJwX3N5bWJvbF90YWJsZSBvYXN5c19hcmNoaXZlX3AKLQlvYXN5c19ta29iamVjdCBvYXN5c19vYmplY3RfcCBvYXN5c19uZXdfc2VjdGlvbl9ob29rCi0Jb2FzeXNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDaGVjayBiZmRfYWxsb2MuCi0JKG9hc3lzX3NsdXJwX3NlY3Rpb25fZGF0YSk6IENoZWNrIGJmZF96YWxsb2MgYW5kIGJmZF9hbGxvYy4KLQkob2FzeXNfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgotCi0JKiBubG1jb2RlLmggKG5sbV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCi0JKG5sbV9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGVjayBiZmRfemFsbG9jIGFuZCBiZmRfYWxsb2MuCi0KLQkqIG5sbTMyLXNwYXJjLmMgKG5sbV9zcGFyY19yZWFkX2ltcG9ydCk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogbmxtMzItaTM4Ni5jIChubG1faTM4Nl9yZWFkX2ltcG9ydCk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogbmxtMzItYWxwaGEuYyAobmxtX2FscGhhX3JlYWRfaW1wb3J0KTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9saW5rX2hhc2hfbmV3ZnVuYwotCShnZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jCi0JKGFyY2hpdmVfaGFzaF9uZXdmdW5jCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogQ2hlY2sgYmZkX2hhc2hfYWxsb2NhdGUuCi0JKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0JKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzCi0JKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IENoZWNrIGJmZF9hbGxvYy4KLQkoYmZkX25ld19saW5rX29yZGVyKTogQ2hlY2sgYmZkX2FsbG9jX2J5X3NpemVfdC4KLQotCSogaXJpeC1jb3JlLmMgKGlyaXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCi0KLQkqIGllZWUuYzogSW5kZW50LgotCShyZWFkX2lkIGdldF9zeW1ib2wgZ2V0X3NlY3Rpb25fZW50cnkgaWVlZV9hcmNoaXZlX3AgaWVlZV9vYmplY3RfcAotCWllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIGllZWVfbmV3X3NlY3Rpb25faG9vayk6IENoZWNrIGJmZF9hbGxvYy4KLQkoZG9fb25lKTogQ2hlY2sgYmZkX2FsbG9jLiAgUmV0dXJuIGEgYm9vbGVhbi4KLQkoaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEpOiBDaGVjayBpdC4KLQkoaW5pdF9mb3Jfb3V0cHV0KTogQ2hlY2sgYmZkX2FsbG9jLiAgUmV0dXJuIGEgYm9vbGVhbi4KLQkoaWVlZV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IENoZWNrIGl0LgotCShkb193aXRoX3JlbG9jcyk6ICBDaGVjayBiZmRfYWxsb2MuICBSZXR1cm4gYSBib29sZWFuLgotCShpZWVlX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUpOiBEaXR0by4gIEZJWE1FIHZvaWQuCi0JKGllZWVfbWtvYmplY3QpOiBDaGVjayBiZmRfemFsbG9jLgotCShpZWVlX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3ptYWxsb2MuCi0KLQkqIGhwdXgtY29yZS5jIChocHV4X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjawotCWJmZF96YWxsb2MuCi0KLQkqIGhwcGFic2QtY29yZS5jIChocHBhYnNkX2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjawotCWJmZF96YWxsb2MuCi0JKGhwcGFic2RfY29yZV9jb3JlX2ZpbGVfcCk6IENoZWNrIGJmZF96YWxsb2MuCi0KLQkqIGhwMzAwaHB1eC5jIChNWShzbHVycF9zeW1ib2xfdGFibGUpKTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBlbGZjb2RlLmggKGVsZl9uZXdfc2VjdGlvbl9ob29rKTogQ2hlY2sgYmZkX2FsbG9jLgotCShiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBEaXR0by4KLQkod3JpdGVfcmVsb2NzKTogRGl0dG8uICBGSVhNRSB2b2lkCi0JKGVsZl9tYXBfc3ltYm9scyBhc3NpZ25fc2VjdGlvbl9udW1iZXJzIG1hcF9wcm9ncmFtX3NlZ21lbnRzKToKLQlEaXR0by4gIFJldHVybiBhIGJvb2xlYW4uIAotCShzd2FwX291dF9zeW1zKTogRGl0dG8uICBDaGVjayBlbGZfbWFwX3N5bWJvbHMuCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGVjayBiZmRfemFsbG9jLgotCShlbGZfc2x1cnBfcmVsb2NhX3RhYmxlKTogQ2hlY2sgYmZkX2FsbG9jLgotCShlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBEaXR0by4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IENoZWNrIGFzc2lnbl9zZWN0aW9uX251bWJlcnMuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogUmV0dXJuIGEgYm9vbGVhbi4KLQlDaGVjayBtYXBfcHJvZ3JhbV9zZWdtZW50cy4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IENoZWNrIGl0LgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfc3R1Yl9icmFuY2hfcmVsb2MpOiBDaGVjayBiZmRfem1hbGxvYyBhbmQKLQlyZWFsbG9jLiAKLQkoaHBwYV9lbGZfc3R1Yl9yZWxvYyk6IERpdHRvLgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IENoZWNrIGJmZF96YWxsb2MuCi0JKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiBEaXR0by4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKTogRGl0dG8uCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IENoZWNrIGJmZF9hbGxvYy4gIFJldHVybiBhIGJvb2xlYW4uCi0JKGVjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IENoZWNrIGl0LgotCShlY29mZl9zbHVycF9hcm1hcCk6IENoZWNrIGJmZF9hbGxvYy4KLQkoZWNvZmZfd3JpdGVfYXJtYXApOiBDaGVjayBiZmRfemFsbG9jLgotCShlY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IENoZWNrIGJmZF9oYXNoX2FsbG9jYXRlIGFuZAotCV9iZmRfbGlua19oYXNoX25ld2Z1bmMuIAotCShlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIGN0b3IuYyAoYmZkX2NvbnN0cnVjdG9yX2VudHJ5KTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IENoZWNrIGJmZF9hbGxvYy4KLQkoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogQ2hlY2sgYmZkX2FsbG9jX2J5X3NpemVfdC4gIFJldHVybiBhIGJvb2xlYW4uCi0JKGNvZmZfd3JpdGVfc3ltYm9sKTogQ2hlY2sgYmZkX2FsbG9jLiAgRklYTUUgaW50Ci0JKGNvZmZfd3JpdGVfbGluZW51bWJlcnMpOiBDaGVjayBiZmRfYWxsb2MuICBSZXR1cm4gYSBib29sZWFuLgotCShjb2ZmX3NlY3Rpb25fc3ltYm9sKTogQ2hlY2sgYmZkX2FsbG9jX2J5X3NpemVfdC4KLQkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBDaGVjayBiZmRfYWxsb2MuCi0JKGNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkqIGxpYmNvZmYtaW4uaDogQ2hhbmdlIGRlY2xzIG9mIGNvZmZfcmVudW1iZXJfc3ltYm9scywKLQljb2ZmX3dyaXRlX2xpbmVudW1iZXJzLgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjawotCWNvZmZfcmVudW1iZXJfc3ltYm9scywgY29mZl93cml0ZV9saW5lbnVtYmVycy4KLQotCSogY29mZmNvZGUuaDogSW5kZW50LgotCShjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMpOiBDaGVjayBiZmRfYWxsb2NfYnlfc2l6ZV90LiAgUmV0dXJuIGEKLQlib29sZWFuLiAKLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayBpdC4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgYmZkX2FsbG9jLgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IERpdHRvLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9zbHVycF9ic2RfYXJtYXBfZjIpOiBDaGVjayBiZmRfYWxsb2MgdmFsdWUuCi0JKGRvX3NsdXJwX2JzZF9hcm1hcCk6IERpdHRvLgotCShjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IENoZWNrIGJmZF9yZWFsbG9jIHZhbHVlLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogQ2hlY2sgYmZkX2FsbG9jCi0JcmV0dXJuIHZhbHVlLiAgUmV0dXJuIGJvb2xlYW4gdmFsdWUuCi0JKE5BTUUoYW91dCxtYWtlX2VtcHR5X3N5bWJvbCkpOiBDaGVjayBiZmRfemFsbG9jIHJldHVybiB2YWx1ZS4KLQkoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiBDaGVjayBiZl9hbGxvYyBhbmQgYmZkX3phbGxvYwotCXJldHVybiB2YWx1ZS4KLQkoYWRkX3RvX3N0cmluZ3RhYik6IERpdHRvLiAgRklYTUUgdm9pZAotCShhb3V0X2xpbmtfaGFzaF9uZXdmdW5jKTogQ2hlY2sgYmZkX2hhc2hfYWxsb2NhdGUgcmV0dXJuIHZhbHVlLgotCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBDaGVjayBiZmRfYWxsb2MgdmFsdWUuCi0JKHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpOiBDaGVjayB0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzLgotCSogaHAzMDBocHV4LmMgKE1ZKHNsdXJwX3N5bWJvbF90YWJsZSkpOiBEaXR0by4KLQkqIGFvdXR4LmggKGFvdXRfbGlua19oYXNoX25ld2Z1bmMpOiBDaGVjayBfYmZkX2xpbmtfaGFzaF9uZXdmdW5jLgotCi0JKiBvcG5jbHMuYyAoYmZkX3phbGxvYyBiZmRfcmVhbGxvYyk6IENoZWNrIHJlc3VsdCBvZiBiZmRfYWxsb2MuCi0KLQkqIG9wbmNscy5jIChvYnN0YWNrX2NodW5rX2FsbG9jKTogRGVmaW5lIGFzIG1hbGxvYywgbm90Ci0JYmZkX3htYWxsb2NfYnlfc2l6ZV90LiAKLQkoX2JmZF9uZXdfYmZkKTogQ2hlY2sgb2JzdGFja19iZWdpbiBmb3IgMCByZXR1cm4uCi0KLQkqIGllZWUuYyAob2JzdGFja19jaHVua19hbGxvYyk6IERlZmluZSBhcyBtYWxsb2MsIG5vdAotCWJmZF94bWFsbG9jX2J5X3NpemVfdC4gCi0JKGllZWVfYXJjaGl2ZV9wKTogQ2hlY2sgb2JzdGFja19iZWdpbiBmb3IgMCByZXR1cm4gYW5kCi0Jb2JzdGFja19maW5pc2ggZm9yIE5VTEwgcmV0dXJuLgotCi0JKiBoYXNoLmMgKG9ic3RhY2tfY2h1bmtfYWxsb2MpOiBEZWZpbmUgYXMgbWFsbG9jLCBub3QKLQliZmRfeG1hbGxvY19ieV9zaXplX3QuIAotCShiZmRfaGFzaF90YWJsZV9pbml0X24pOiBDaGVjayBvYnN0YWNrX2JlZ2luIGZvciAwIHJldHVybiBhbmQKLQlvYnN0YWNrX2ZpbmlzaCBmb3IgTlVMTCByZXR1cm4uCi0JKGJmZF9oYXNoX2xvb2t1cCk6IENoZWNrIG9ic3RhY2tfYWxsb2MgZm9yIE5VTEwgcmV0dXJuLgotCi0JKiBlY29mZmxpbmsuYyAob2JzdGFja19jaHVua19hbGxvYyk6IERlZmluZSBhcyBtYWxsb2MsIG5vdAotCWJmZF94bWFsbG9jX2J5X3NpemVfdC4gCi0JYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUKLQliZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZV9vdGhlcik6IENoZWNrIG9ic3RhY2tfYWxsb2MuCi0JKGFkZF9maWxlX3NodWZmbGUgYWRkX21lbW9yeV9zaHVmZmxlKTogQ2hlY2sgb2JzdGFja19hbGxvYyBmb3IKLQlOVUxMIHJldHVybi4gIFJldHVybiBib29sZWFuLCBub3Qgdm9pZC4KLQkoYmZkX2Vjb2ZmX2RlYnVnX2luaXQpOiBDaGVjayBvYnN0YWNrX2JlZ2luIGZvciAwIHJldHVybi4KLQkoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBDaGVjayBhZGRfZmlsZV9zaHVmZmxlCi0JYW5kIGFkZF9tZW1vcnlfc2h1ZmZsZSByZXR1cm4uIAotCShzdHJpbmdfaGFzaF9uZXdmdW5jKTogQ2hlY2sgYmZkX2hhc2hfYWxsb2NhdGUgYW5kIGJmZF9oYXNoX25ld2Z1bmMuCi0JKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogQ2hlY2sgYmZkX2FsbG9jLgotCShlY29mZl9hZGRfc3RyaW5nKTogQ2hlY2sgYWRkX21lbW9yeV9zaHVmZmxlIHJldHVybi4KLQotCSogbGliYmZkLWluLmggKHhtYWxsb2MsIGJmZF94bWFsbG9jLCBiZmRfeG1hbGxvY19ieV9zaXplX3QpOgotCVJlbW92ZSBkZWNscy4gCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotRnJpIEZlYiAxMSAxNTozNTozMiAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdDogIEFkZCBMeW54L3JzNjAwMCBzdXBwb3J0LgotCSogY29uZmlnL2kzODYtbmxtLm10OiAgRW5hYmxlIGEub3V0IGZpbGUgc3VwcG9ydC4KLQkqIGNvbmZpZy9yczYwMDBseW54Lm1oOiAgTHlueC9yczYwMDAgaG9zdCBzdXBwb3J0LgotCi1GcmkgRmViIDExIDE3OjI1OjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IFJld3JpdGUgc29tZXdoYXQgdG8gaW1wcm92ZQotCW1lbW9yeSB1c2FnZS4KLQotRnJpIEZlYiAxMSAxMzoxMDo0MiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYzogQ2hhbmdlIGFsbCByZWZlcmVuY2VzIHRvICdcbicgaW4gYXJjaGl2ZSBtYWdpYwotCXRvICdcMDEyJywgZm9yIGdyZWF0ZXIgcG9ydGFiaWxpdHkuCi0JKiBlY29mZi5jIChlY29mZl93cml0ZV9hcm1hcCk6IERpdHRvLgotCi1UaHUgRmViIDEwIDEyOjU4OjQ4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IENoZWNrIHN0cmlwIHNldHRpbmdzIHRvCi0Jc2VlIHdoZXRoZXIgc3ltYm9sIHNob3VsZCBiZSBvdXRwdXQuCi0JKiBnZW5saW5rLmggKHN0cnVjdCBnZW5lcmljX3dyaXRlX2dsb2JhbF9zeW1ib2xfaW5mbyk6IEFkZGVkIGluZm8KLQlmaWVsZC4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IEluaXRpYWxpemUgd2dpbmZvLmluZm8uCi0JKF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBDaGVjayBzdHJpcCBzZXR0aW5ncyB0bwotCXNlZSB3aGV0aGVyIHN5bWJvbCBzaG91bGQgYmUgb3V0cHV0LgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogSW5pdGlhbGl6ZSB3Z2luZm8uaW5mby4KLQotV2VkIEZlYiAgOSAyMTozNDo1OCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9yZWxvY19xdWV1ZV9maW5kKTogRG8gbm90IGV4YW1pbmUgYSBOVUxMIHF1ZXVlIGVudHJ5LgotCi0JKiBzb20uYzogQ2FzdCByZXR1cm4gdmFsdWVzIGZyb20gQkZEIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIHRvCi0JYXZvaWQgd2FybmluZ3MgZnJvbSB0aGUgSFAgY29tcGlsZXIuCi0KLVdlZCBGZWIgIDkgMTI6NTU6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBBY2NlcHQgYSBMSVRFUkFMCi0JcmVsb2Mgb24gYW4gImxkbCIgaW5zdHJ1Y3Rpb24gdG9vLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtKTogQ2FzdCBzdGF0dXMgZWxlbWVudHMKLQl3aGVuIHBhc3NpbmcgdGhlbSB0byBzcHJpbnRmLiAgVXNlICVsZCBpbnN0ZWFkIG9mICVkLgotCi0JKiBjb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX21rYXJjaGl2ZSk6IFJldHVybiBmYWxzZS4KLQkocnM2MDAwX2NvZmZfc25hcmZfYXJfaGRyKTogRG9uJ3QgZGVjbGFyZSBlcnJubzsgaXQncyBub3QgdXNlZC4KLQlBbHNvIHJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIG5hbWVsZW4uCi0JKHJzNjAwMGNvZmZfd3JpdGVfYXJtYXApOiBEZWNsYXJlIG9ybF9jb3VudCBhbmQgc3RyaWR4IHBhcmFtZXRlcnMuCi0KLVR1ZSBGZWIgIDggMTg6MDA6MzQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQtaW4uaCAoeG1hbGxvYyk6IERvbid0IGRlY2xhcmUgcGFyYW1ldGVyIHR5cGUsIHRvIGF2b2lkCi0JY29uZmxpY3RzLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLVR1ZSBGZWIgIDggMTU6NTU6NTAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jIChyZWxvY19uaWwpOiBOZXcgZnVuY3Rpb24uCi0JKGFscGhhX2hvd3RvX3RhYmxlKTogVXNlIGl0IGFzIHNwZWNpYWxfZnVuY3Rpb24gdG8gcHJldmVudCBjZXJ0YWluCi0JcmVsb2NzIGZyb20gYmVpbmcgYWRqdXN0ZWQgYnkgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gIElHTk9SRQotCXJlbG9jIHNob3VsZCBiZSBwYXJ0aWFsX2lucGxhY2UuCi0JKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEFjY2VwdCBhIExJVEVSQUwKLQlyZWxvYyBvbiBhbiAibGRsIiBpbnN0cnVjdGlvbiB0b28uCi0KLVR1ZSBGZWIgIDggMDA6MzI6MjggMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBlbGYzMi1ocHBhLmMgKENVUlJFTlRfU1RVQl9PRkZTRVQsIGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViLAotCWhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiAgQ2FzdCB0byBjaGFyICogaW5zdGVhZCBvZiBpbnQKLQliZWZvcmUgcGVyZm9ybWluZyBwb2ludGVyIGFyaXRobWV0aWMuCi0KLU1vbiBGZWIgIDcgMjA6NTY6MjcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy5iZmQgKGhwcGEqLSotb3NmKik6IFVzZSBiZmRfbmFtZSBocHBhb3NmIGZvciB0aGlzCi0JY29uZmlndXJhdGlvbi4KLQkoaHBwYSotKi0qZWxmKik6IFRoaXMgY29uZmlndXJhdGlvbiB1c2VkIGhwcGEtZWxmIG5vdy4KLQotCSogc29tLmM6IFRoaXMgZmlsZSBpcyBhbHNvIHVzZWQgZm9yIEhPU1RfSFBQQU9TRi4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IEVuYWJsZSBzb21fdmVjIGZvciBIT1NUX0hQUEFPU0YuCi0KLQkqIGhvc3RzL2hwcGFvc2YuaDogTmV3IGhvc3QgY29uZmlndXJhdGlvbiBmaWxlLgotCi0JKiBjb25maWcvaHBwYWJzZC5tdCAoU0VMRUNUX1ZFQ1MpOiBBZGQgYmZkX2VsZjMyX2hwcGFfdmVjIGFzCi0JQlNEIGhhbmRsZXMgYm90aCBTT00gYW5kIEVMRiBvYmplY3QgZmlsZXMuCi0KLQkqIGNvbmZpZy9ocHBhb3NmLm1oIChIREVGSU5FUyk6IERlbGV0ZS4gIE5vIGxvbmdlciBuZWVkZWQuCi0JKFJBTkxJQik6IERvZXNuJ3QgZG8gYW55dGhpbmcsIGRlZmluZSBpdCB0byBiZSAiZWNobyIuCi0KLQkqIGNvbmZpZy9ocHBhb3NmLm10OiBOZXcgdGFyZ2V0IG1ha2VmaWxlIGZyYWdtZW50IGZvciBhIFBBIHJ1bm5pbmcKLQlPU0YxLgotCi1Nb24gRmViICA3IDE1OjAyOjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYyAoZW51bSBiZmRfYXJjaGl0ZWN0dXJlKTogQWRkZWQgYmZkX2FyY2hfcG93ZXJwYy4KLQkoYXJjaHVyZXNfaW5pdF90YWJsZSk6IElmIFNFTEVDVF9BUkNISVRFQ1RVUkVTIGlzIG5vdCBkZWZpbmVkLAotCWFkZGVkIGJmZF9wb3dlcnBjX2FyY2guCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBjcHUtcG93ZXJwYy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMsIENGSUxFUyk6IEFkZGVkIGNwdS1wb3dlcnBjLmMuCi0JUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogR2V0IHZtYSBhbmQgYWxpZ25tZW50X3Bvd2VyCi0Jb2YgYW4gU0hUX1NUUlRBQiBzZWN0aW9uIGZyb20gc2hfYWRkciBhbmQgc2hfYWRkcmFsaWduLCByYXRoZXIKLQl0aGFuIGp1c3Qgc2V0dGluZyB0aGVtIHRvIHplcm8uCi0KLVN1biBGZWIgIDYgMjA6MDQ6MTAgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKHByZXBfaGVhZGVycywgc3dhcF9vdXRfc3ltcyk6IENoZWNrIGZvciBOVUxMIHJldHVybgotCWZyb20gYmZkX25ld19zdHJ0YWIuIAotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQ2hlY2sgZm9yIGZhbHNlIHJldHVybiBmcm9tCi0Jc3dhcF9vdXRfc3ltcy4gCi0KLQkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBDaGVjayBmb3IgTlVMTCByZXR1cm4KLQlmcm9tIGJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMuCi0KLQkqIHN5bXMuYzogTWFrZSBleGFtcGxlIGFwcGxpY2F0aW9uIGluIGRvYyBjYWxsIHhtYWxsb2MsIG5vdAotCWJmZF94bWFsbG9jLiAKLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSksCi0JYW91dF9saW5rX2dldF9zeW1ib2xzLCBOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkpOgotCSogYm91dC5jIChiX291dF9zbHVycF9yZWxvY190YWJsZSwgYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MpOgotCSogZWNvZmYuYyAoZWNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiAKLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfaW5pdCk6IAotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IAotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogCi0JKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IAotCShiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IAotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IAotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogCi0JKiBlbGZjb2RlLmggKGJmZF9uZXdfc3RydGFiKTogCi0JKGJmZF9hZGRfMl90b19zdHJ0YWIpOiAKLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IAotCShlbGZfY29yZWZpbGVfbm90ZSk6IAotCSogbGliYmZkLmMgKGJmZF96bWFsbG9jKTogCi0JVXNlIG1hbGxvYyBhbmQgY2hlY2sgdGhlIHJlc3VsdCwgaW5zdGVhZCBvZiBiZmRfeG1hbGxvYy4KLQotU2F0IEZlYiAgNSAxMjozOToyOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogUHV0IG02OCotKi1zeXN2KiBsaW5lIGFmdGVyIG02OCotKi1zeXN2NCouCi0KLVNhdCBGZWIgIDUgMDU6MzI6NDQgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBzcmVjLmMgKHNyZWNfd3JpdGVfcmVjb3JkKTogIFB1dCBDT05TVCBrZXl3b3JkIGZvciAic3JjIiBiZWZvcmUKLQkidW5zaWduZWQiLCBzb21lIGNvbXBpbGVycyBkb24ndCBsaWtlIGl0IGFmdGVyICJ1bnNpZ25lZCIuCi0JKiBsaWJjb2ZmLmgsIGxpYmNvZmYtaW4uaCAoYmZkX3BlcmZvcm1fc2xpcCk6ICBSZW5hbWUgInZhbHVlIiB0bwotCSJ2YWwiIGluIHByb3RvdHlwZSBkZWNsYXJhdGlvbiBiZWNhdXNlIHNvbWUgY29tcGlsZXJzIGRvbid0IGxpa2UKLQlhcmd1bWVudHMgd2hvc2UgbmFtZXMgYXJlIHRoZSBzYW1lIGFzIHR5cGVzLgotCi1TYXQgRmViICA1IDAxOjE0OjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBDb3JyZWN0IHRlc3QgZm9yIHdoZXRoZXIKLQlvYmplY3QgZmlsZSBkZWZpbmVzIHN5bWJvbC4gIEFsc28sIGlmIHNraXBwaW5nIGEgc3ltYm9sLCBza2lwIHRoZQotCXNlY29uZCBzeW1ib2wgb2YgYSBOX1dBUk5JTkcgb3IgTl9JTkRSIHN5bWJvbCBhcyB3ZWxsLgotCi1GcmkgRmViICA0IDIzOjU1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZCBiYXNpYyBzdXBwb3J0IGZvciB3cml0aW5nIFJTLzYwMDAgWENPRkYgZmlsZXMuCi0JKiBjb2ZmLXJzNjAwMC5jIChkdW1teV9yZWxvYyk6IFJlbW92ZWQuCi0JKHJzNjAwMGNvZmZfaG93dG9fdGFibGUpOiBEZWZpbmVkIFhDT0ZGIHJlbG9jcy4KLQkoUlRZUEUySE9XVE8pOiBEZWZpbmVkIHRvIHVzZSByczYwMDBjb2ZmX3J0eXBlMmhvd3RvLgotCShyczYwMDBjb2ZmX3J0eXBlMmhvd3RvKTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZWQgdG8gdXNlCi0JcnM2MDAwY29mZl9yZWxvY190eXBlX2xvb2t1cC4gCi0JKHJzNjAwMGNvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0JKFNFTEVDVF9SRUxPQyk6IERlZmluZWQgdG8gc2V0IHJfdHlwZSBhbmQgcl9zaXplIGZpZWxkcy4KLQkoQ09GRl9MT05HX0ZJTEVOQU1FUyk6IERlZmluZWQuCi0JKiBjb2ZmY29kZS5oIChjb21iaW5lZF9lbnRyeV90eXBlKTogQ2hhbmdlZCBmaXhfdGFnIGFuZCBmaXhfZW5kCi0JZmllbGRzIHRvIGJpdGZpZWxkcy4gIEFkZGVkIGZpZWxkcyBmaXhfdmFsdWUgYW5kIGZpeF9zY25sZW4uCi0JKHNlY190b19zdHlwX2ZsYWdzKTogSWYgU1RZUF9ERUJVRyBpcyBkZWZpbmVkLCB1c2UgaXQgcmF0aGVyIHRoYW4KLQlTVFlQX0lORk8gZm9yIHRoZSB0eXBlIG9mIGEgc2VjdGlvbiBuYW1lZCAuZGVidWcuCi0JKGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scyk6IERvbid0IGRlZmluZSBpZiBSUzYwMDBDT0ZGX0MuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgUlM2MDAwQ09GRl9DLCBkb24ndCBjYWxsCi0JY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IElmIFJTNjAwMENPRkZfQywgdGhlbiBpZiB0aGUgbGFzdCBhdXgKLQllbnRyeSBoYXMgdHlwZSBTVFlfTEQgY2hhbmdlIHRoZSB4X3NjbmxlbiBpbnRvIGEgcG9pbnRlciB0byBhCi0Jc3ltYm9sIGFuZCBzZXQgZml4X3Njbmxlbi4gIEFsc28sIGZvciBhIENfQlNUQVQgc3ltYm9sLCBjaGFuZ2UgdGhlCi0JdmFsdWUgaW50byBhIHBvaW50ZXIgdG8gYSBzeW1ib2wgYW5kIHNldCBmaXhfdmFsdWUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfbWFuZ2xlX3N5bWJvbHMpOiBSZWluZGVudC4gIElmIGZpeF92YWx1ZSBpcyBzZXQsCi0JZ2V0IHRoZSBzeW1ib2wgb2Zmc2V0LiBMaWtld2lzZSBmb3IgZml4X3Njbmxlbi4KLQkoc3RyaW5nX3NpemUpOiBDaGFuZ2UgdHlwZSB0byBiZmRfc2l6ZV90eXBlLgotCShkZWJ1Z19zdHJpbmdfc2l6ZSwgZGVidWdfc3RyaW5nX3NlY3Rpb24pOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoY29mZl9maXhfc3ltYm9sX25hbWUpOiBJZiBiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnIHJldHVybnMgdHJ1ZSwKLQl3cml0ZSB0aGUgc3ltYm9sIG5hbWUgaW50byB0aGUgLmRlYnVnIHNlY3Rpb247IGFzc3VtZSB0aGF0IHRoZQotCXNlY3Rpb24gaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIHdpdGggdGhlIHJpZ2h0IHNpemUuCi0JKGNvZmZfd3JpdGVfc3ltYm9scyk6IEluaXRpYWxpemUgZGVidWdfc3RyaW5nX3NpemUgdG8gMC4gIElmCi0JYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyByZXR1cm5zIHRydWUsIGRvbid0IHB1dCBzeW1ib2wgbmFtZSBpbgotCXVzdWFsIHN0cmluZyB0YWJsZS4gIEFmdGVyIHdyaXRpbmcgb3V0IGFsbCBzeW1ib2xzLCBpZgotCWRlYnVnX3N0cmluZ19zaXplIGlzIG5vdCAwLCBjaGVjayB0aGF0IGl0IG1hdGNoZXMgdGhlIHNpemUgb2YgdGhlCi0JLmRlYnVnIHNlY3Rpb24uCi0JKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogQ2xlYXIgbmV3IGZpeF92YWx1ZSBhbmQgZml4X3NjbmxlbgotCWZpZWxkcy4gIElmIHRoZSBzdHJpbmcgb2Zmc2V0IGlzIDAsIGFsd2F5cyB1c2UgYW4gZW1wdHkgc3RyaW5nIGFzCi0JdGhlIG5hbWUuCi0JKGNvZmZfbWFrZV9lbXB0eV9zeW1ib2wpOiBaZXJvIG91dCB0aGUgc3ltYm9sIHN0cnVjdHVyZS4KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBXb3JrIGFyb3VuZCBvbmUgZ3Jvc3MgaGFjawotCXdpdGggYW5vdGhlcjogYWN0dWFsbHkgbG9vayBhdCB0aGUgdGFyZ2V0IG5hbWUgdG8gYXZvaWQgdGhlIGJyb2tlbgotCUNPRkYgY2hlY2suCi0JKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSk6IEFkZCBCRkRfUkVMT0NfUFBDX0IyNiwKLQlCRkRfUkVMT0NfUFBDX0JBMjYgYW5kIEJGRF9SRUxPQ19QUENfVE9DMTYuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLUZyaSBGZWIgIDQgMTc6Mjg6MzIgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYyAoYmZkX3ptYWxsb2MpOiBDYWxsIGJmZF94bWFsbG9jIGluc3RlYWQgb2YgbWFsbG9jLgotCShiZmRfeG1hbGxvYywgYmZkX3htYWxsb2NfYnlfc2l6ZV90KTogRnVuY3Rpb25zIGRlbGV0ZWQuCi0JKiBsaWJiZmQtaW4uaDogRGVmaW5lIHRoZW0gYXMgbWFjcm9zIGNhbGxpbmcgeG1hbGxvYyBhbmQgZGVjbGFyZQotCXhtYWxsb2MuIAotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLVRodSBGZWIgIDMgMTY6NDk6MzUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscyk6IElmIGEgc21hbGwgdW5kZWZpbmVkCi0Jc3ltYm9sIGhhcyBhIHZhbHVlIGluIHRoZSBFQ09GRiBzeW1ib2wgYnV0IG5vdCBpbiB0aGUgQkZEIHN5bWJvbCwKLQlrZWVwIHRoZSB2YWx1ZSBpbiB0aGUgRUNPRkYgc3ltYm9sLiAgVGhpcyBoZWxwcyBnYXMuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scywKLQlfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogRG9uJ3QgcmVxdWlyZSB0aGF0IGFsbAotCXJlZmVyZW5jZXMgdG8gYSBjb21tb24gc3ltYm9sIGJlIHRoZW1zZWx2ZXMgY29tbW9uIHN5bWJvbHMuCi0KLQkqIGFvdXR4LmggKGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbik6IEhhbmRsZSBOX1VOREYuCi0KLVdlZCBGZWIgIDIgMjA6Mzc6MTkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5jLCBiZmQtaW4uaCwgaG9zdHMvYWxwaGFvc2YuaCwgaG9zdHMvc3BhcmMtbGwuaCwgYW91dGYxLmgsCi0Jc3BhcmNseW54LmMsIE1ha2VmaWxlLmluOiBDaGFuZ2UgSE9TVF82NF9CSVQgdG8gQkZEX0hPU1RfNjRfQklULgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1XZWQgRmViICAyIDEyOjMwOjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3JlbG9jX291dCk6IElmIFJTNjAwMENPRkZfQywgaGFuZGxlIHR5cGUKLQlhbmQgc2l6ZSBjb3JyZWN0bHkuCi0JKGNvZmZfc3dhcF9hdXhfaW4pOiBJZiBSUzYwMDBDT0ZGX0MsIGNoYW5nZSB4X2NzZWN0Lnhfc2NubGVuIHRvCi0JeF9jc2VjdC54X3Njbmxlbi5sIHRvIG1hdGNoIGNoYW5nZSBpbiBjb2ZmL2ludGVybmFsLmguCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogTGlrZXdpc2UuCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSksIGNvZmYtYWxwaGEuYwotCShhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBDaGFuZ2UgY2FzdHMgb2YgYXV4X2luIGFuZCBhdXhfb3V0Ci0JZmllbGRzIHRvIG1hdGNoIHllc3RlcmRheSdzIGNoYW5nZXMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKTogSWYgU0VMRUNUX1JFTE9DIGlzIGRlZmluZWQsIHBhc3MKLQlpbiB0aGUgaW50ZXJuYWxfcmVsb2MgaXRzZWxmLCBub3QgdGhlIHR5cGUuCi0JKiBjb2ZmLWFwb2xsby5jLCBjb2ZmLWg4MzAwLmMsIGNvZmYtaDg1MDAuYywgY29mZi1pMzg2LmMsCi0JY29mZi1tNjhrLmMsIGNvZmYtc2guYywgY29mZi13ZTMyay5jLCBjb2ZmLXo4ay5jOiBDaGFuZ2VkCi0JZGVmaW5pdGlvbiBvZiBTRUxFQ1RfUkVMT0MgYWNjb3JkaW5nbHkuCi0KLVR1ZSBGZWIgIDEgMTI6MDU6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGRlZCBuZXcgYXJndW1lbnRzIHRvCi0JX2JmZF9jb2ZmX3N3YXBfYXV4X2luIGFuZCBfYmZkX2NvZmZfc3dhcF9hdXhfb3V0OiBhdXggaW5kZXggbnVtYmVyCi0JYW5kIG51bWJlciBvZiBhdXggZW50cmllcy4KLQkoYmZkX2NvZmZfc3dhcF9hdXhfaW4sIGJmZF9jb2ZmX3N3YXBfYXV4X291dCk6IENoYW5nZWQKLQlhY2NvcmRpbmdseS4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hdXhfaW4sIGNvZmZfc3dhcF9hdXhfb3V0KTogQWNjZXB0IG5ldwotCWFyZ3VtZW50cy4gIElmIFJTNjAwMENPRkZfQywgb25seSB0cmVhdCBDX0VYVCBhbmQgQ19ISURFWFQKLQlzcGVjaWFsbHkgaWYgdGhpcyBpcyB0aGUgbGFzdCBhdXggZW50cnkuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfd3JpdGVfc3ltYm9sLCBjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IFBhc3MKLQluZXcgYXJndW1lbnRzIHRvIHN3YXBfYXV4IGZ1bmN0aW9ucy4KLQotU3VuIEphbiAzMCAxNToxNDozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBnZW4tYW91dC5jIChtYWluKTogU2V0IERFRkFVTFRfQVJDSCBiYXNlZCBvbiBwcmVwcm9jZXNzb3IgbWFjcm9zCi0JKG9ubHkgdGVzdGluZyBmb3IgbTY4ayBhbmQgdmF4IGF0IHRoZSBtb21lbnQpOyBkbyB2ZXJpZnkgdGhhdCB0aGUKLQlwcmVwcm9jZXNzb3IgZGlkbid0IHRyYXNoIHRoZSBhcmNoIG5hbWUgaW5zaWRlIHRoZSBzdHJpbmcgdmVyc2lvbi4KLQlEb24ndCBwcmludCBvdXQgInBhZ2VzaXplID0iIGxpbmUgdGhhdCBwcmV2ZW50cyBvdXRwdXQgZnJvbQotCWNvbXBpbGluZy4gIERlcml2ZSBCWVRFU19JTl9XT1JEIGFuZCBBUkNIIHZhbHVlcyBmcm9tIHNpemVvZgotCXJlc3VsdHMuCi0JKiBNYWtlZmlsZS5pbiAoYW91dC1wYXJhbXMuaCk6IFBhc3MgZ2VuLWFvdXQgYSBkdW1teSB0YXJnZXQgbmFtZS4KLQkoY2hlY2ssIGluc3RhbGxjaGVjayk6IElkZW50aWZ5IGRpcmVjdG9yeSBpbiAibm8gdGVzdHN1aXRlcyIKLQltZXNzYWdlLgotCi1TdW4gSmFuIDMwIDEzOjI1OjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBXcml0ZSBvdXQgY29ycmVjdCB2YWx1ZSBmb3IKLQlvYmplY3QgZmlsZSBzeW1ib2wuCi0KLUZyaSBKYW4gMjggMTg6MzQ6MDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvdmF4YnNkLmggKEhPU1RfU1RBQ0tfRU5EX0FERFIpOiBWYXggQlNEIGRvZXNuJ3QgZGVmaW5lCi0JS0VSTkJBU0UsIHNvIGhhcmQtY29kZSAweDgwMDAwMDAwIGluc3RlYWQuCi0KLVRodSBKYW4gMjcgMTM6NTQ6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IElmIHN5bWJvbCBpcyBjb21tb24sCi0Jc2V0IHRoZSBCU0ZfT0xEX0NPTU1PTiBmbGFnLgotCi1XZWQgSmFuIDI2IDEzOjQ3OjE1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IFB1dCB0aGUgbmV3IGVudHJ5IGluIHRoZQotCWNvcnJlY3QgZWxlbWVudCBvZiBtYXRjaGluZ192ZWN0b3IuCi0KLVR1ZSBKYW4gMjUgMTE6NDM6MjggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHNvbS5jLCBzb20uaCAoYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzLAotCWJmZF9zb21fc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyk6IENoYW5nZSBwYXJhbWV0ZXJzIGZyb20gY2hhcgotCXRvIGludC4gIEZvbGxvd2luZyBhIHByb3RvdHlwZSB3aXRoIGFuIG9sZC1zdHlsZSBmdW5jdGlvbiBkZWZpbml0aW9uCi0JaW4gdGhlIHByZXNlbmNlIG9mIHdpZGVuZWQgcGFyYW1ldGVycyBpcyBhIEdDQy1pc20gbm90IHN1cHBvcnRlZAotCWJ5IHRoZSBIUCBjb21waWxlciBpbiBBTlNJIG1vZGUuCi0KLVR1ZSBKYW4gMjUgMTE6NDY6NDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfZ2V0X3JlbG9jX3NpemUpOiBTaXplIG9mIHR5cGUgLTIgaXMgNCBieXRlcywgbm90IDIuCi0KLQkqIGhwMzAwaHB1eC5jIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogV3JpdGUgb3V0IHRoZSBzeW1ib2xzCi0JYmVmb3JlIHdyaXRpbmcgb3V0IHRoZSByZWxvY3MsIHNvIHRoYXQgdGhlIHJpZ2h0IHN5bWJvbCBpbmRpY2VzCi0JYXJlIHVzZWQuCi0KLQkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfYnNkX2FybWFwLCBiZmRfc2x1cnBfYnNkX2FybWFwX2YyKTogRG8gbm90Ci0JdHJ5IHRvIG92ZXJsYXkgdGhlIGludGVybmFsIGNhcnN5bXMgb24gdGhlIGV4dGVybmFsIHN5bWRlZnMuICBUaGF0Ci0JY2FuIG5vdCB3b3JrIGlmIHRoZSBzaXplIG9mIGEgaG9zdCBwb2ludGVyIGlzIGxhcmdlciB0aGFuIDQgYnl0ZXMuCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBDYXN0IHJlc3VsdCBvZgotCWJmZF94bWFsbG9jX2J5X3NpemVfdC4KLQkqIG9wbmNscy5jIChfYmZkX25ld19iZmQpOiBBdm9pZCBBTlNJIEMgcHJvdG90eXBlLgotCi0JKiBhcmNoaXZlLmM6IFJlaW5kZW50ZWQgdG8gR05VIHN0YW5kYXJkcy4KLQotTW9uIEphbiAyNCAxNDo0MToyMyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9wbmNscy5jIChfYmZkX25ld19iZmQsIF9iZmRfbmV3X2JmZF9jb250YWluZWRfaW4pOiBBZGQKLQkiX2JmZF8iIHRvIGZ1bmN0aW9uIG5hbWVzLgotCSogYXJjaGl2ZS5jIChfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwpLAotCWxpYmJmZC1pbi5oOiBDaGFuZ2UgY2FsbGVycy4KLQotCSogbGliYmZkLmMgKGJmZF96bWFsbG9jKTogUmVuYW1lZCBmcm9tIHphbGxvYy4KLQkqIGxpYmJmZC5jIChiZmRfYWRkX3RvX3N0cmluZ190YWJsZSksCi0JdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCksCi0JdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X2xpc3QpLAotCXB0cmFjZS1jb3JlLmMgKHB0cmFjZV91bml4X2NvcmVfZmlsZV9wKSwKLQlvcG5jbHMuYyAobmV3X2JmZCksIGxpYmJmZC1pbi5oLAotCWllZWUuYyAoaWVlZV9tYWtlX2VtcHR5X3N5bWJvbCksCi0JZWxmMzItaHBwYS5jIChocHBhX2VsZl9zdHViX2JyYW5jaF9yZWxvYyksCi0JKGhwcGFfZWxmX3N0dWJfcmVsb2MpOiBDaGFuZ2UgY2FsbGVycy4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQotCSogYXJjaGl2ZS5jIChfYmZkX2xvb2tfZm9yX2JmZF9pbl9jYWNoZSk6IEFkZCAiX2JmZF8iIHRvIG5hbWUuCi0JKF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zKSwgCi0JY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MpLCBsaWJiZmQtaW4uaDoKLQlDaGFuZ2UgY2FsbGVycy4KLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyksIGxpYmJmZC1pbi5oLCB0YXJnZXRzLmMsCi0JZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBSZW5hbWUgdGFyZ2V0X3ZlY3RvciB0byBiZmRfdGFyZ2V0X3ZlY3RvcgotCWFuZCBkZWZhdWx0X3ZlY3RvciB0byBiZmRfZGVmYXVsdF92ZWN0b3IuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9jaGVja19mb3JtYXQpOiBDYWxsIGl0LgotCShiZmRfbWF0Y2hpbmdfZm9ybWF0cyk6IEZ1bmN0aW9uIHJlbW92ZWQuCi0JKiB0YXJnZXRzLmM6IFJlcGxhY2UgdGhlIHZlY3RvciBhZGRlZCBvbiBKYW4gMjEgd2l0aCBhIGNvdW50IG9mCi0JZW50cmllcyBpbiBkZWZhdWx0X3ZlY3Rvci4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLU1vbiBKYW4gMjQgMTI6Mzg6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX29iamVjdF9wKTogTmV3IGZ1bmN0aW9uLiAgU2V0IHNpemUgb2YKLQkucGRhdGEgc2VjdGlvbiBiYXNlZCBvbiBsbm5vcHRyIGZpZWxkLCBub3Qgc2VjdGlvbiBoZWFkZXIuCi0JKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBib3RoZXIgdG8gY2hlY2sgaWYgcl9zeW1uZHggPj0gMCwKLQlzaW5jZSBpdCBpcyB1bnNpZ25lZC4KLQkoZWNvZmZhbHBoYV9saXR0bGVfdmVjKTogVXNlIGFscGhhX2Vjb2ZmX29iamVjdF9wIHJhdGhlciB0aGFuCi0JY29mZl9vYmplY3RfcC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBTZXQgYWxpZ25tZW50X3Bvd2VyIGZpZWxkIG9mCi0JLnBkYXRhIHNlY3Rpb24gdG8gMy4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogU2F2ZSB0aGUgc2l6ZSBvZiB0aGUKLQkucGRhdGEgc2VjdGlvbiBpbiB0aGUgbGluZV9maWxlcG9zIGZpZWxkLCBhbmQgYWN0dWFsbHkgYWxpZ24gdGhlCi0JLnBkYXRhIHNlY3Rpb24gdG8gYW4gYWxpZ25tZW50IHBvd2VyIG9mIDQuCi0JKGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMpOiBTZXQgb3V0cHV0X2hhc19iZWd1biBhZnRlcgotCWNhbGxpbmcgZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgc19sbm5vcHRyIGZvciB0aGUgLnBkYXRhCi0Jc2VjdGlvbiBmcm9tIHRoZSBsaW5lX2ZpbGVwb3MgZmllbGQuICBTZXQgdnN0YW1wIGZvciB0aGUgb3B0aW9uYWwKLQloZWFkZXIgZnJvbSB0aGUgdnN0YW1wIG9mIHRoZSBzeW1ib2xpYyBoZWFkZXIuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogU2V0IHZzdGFtcCBvZiB0aGUgc3ltYm9saWMgaGVhZGVyIHRvIHRoZQotCXZzdGFtcCB1c2VkIGJ5IHRoZSBmaXJzdCBvYmplY3QgZmlsZSBpbiB0aGUgbGluay4KLQotCSogZWNvZmZsaW5rLmMgKGVjb2ZmX2FsaWduX2RlYnVnKTogQWxpZ24gUkZEcyB0byBkZWJ1Z19hbGlnbi4KLQotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19jaGVja19hY2hpdmVfZWxlbWVudCk6IFNldCBTRUNfQUxMT0MgZmxhZwotCWZvciBhIGNyZWF0ZWQgY29tbW9uIHNlY3Rpb24uCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIGVsZmNvZGUuaCAoc3dhcF9vdXRfc3ltcyk6IFVzZSBlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIHRvCi0JZ2V0IHRoZSBpbmRleCBvZiBhIGNvbW1vbiBzZWN0aW9uLCByYXRoZXIgdGhhbiBhbHdheXMgdXNpbmcKLQlTSE5fQ09NTU9OIChNSVBTIGhhcyBtdWx0aXBsZSBjb21tb24gc2VjdGlvbnMpLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogVHlwbyAoPT0gZm9yID0pLgotCi0JKiBiZmQvYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkLAotCWFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IFBhc3MgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8KLQlyZWxvY19vdmVyZmxvdyBjYWxsYmFjay4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLAotCWFscGhhX3JlbG9jYXRfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWg4NTAwLmMgKGV4dHJhX2Nhc2UpOiBMaWtld2lzZS4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvZmYtejhrLmMgKGV4dHJhX2Nhc2UpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfc3R1Yl9maW5pc2gpOiBMaWtld2lzZS4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCi0JKiBib3V0LmMgKGNhbGxqeF9jYWxsYmFjaywgY2FsbGpfY2FsbGJhY2spOiBVc2UgZ2V0X3ZhbHVlIHRvIGdldAotCXRoZSBzeW1ib2wgdmFsdWUgYW5kIGNoZWNrIGZvciB1bmRlZmluZWQgc3ltYm9scy4KLQkoZ2V0X3ZhbHVlKTogSWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQsIGxvb2sgaXQgdXAgaW4gdGhlIGxpbmtlcgotCWhhc2ggdGFibGUuCi0JKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEZvciBQQ1JFTDI0IGFuZCBQQ1JFTDEzCi0JdXNlIGdldF92YWx1ZSB0byBnZXQgdGhlIHN5bWJvbCB2YWx1ZSBhbmQgY2hlY2sgZm9yIHVuZGVmaW5lZAotCXN5bWJvbHMuCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKTogSWYgdGhlIHN5bWJvbCBpcwotCXVuZGVmaW5lZCwgbG9vayBpdCB1cCBpbiB0aGUgbGlua2VyIGhhc2ggdGFibGUuCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpOiBUaGUgc3RyaW5nIGluZGV4IDAgaGFzIGEKLQlzcGVjaWFsIG1lYW5pbmcgZm9yIG5vcm1hbCBzeW1ib2xzLCBidXQgbm90IGZvciBkeW5hbWljIHN5bWJvbHMuCi0KLVNhdCBKYW4gMjIgMTI6MjY6MDEgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogc3BhcmNseW54LmM6ICBTZXR1cCBhcHByb3ByaWF0ZSBtYWNyb3MgdG8gZW5hYmxlIGNvcmUgZmlsZQotCXN1cHBvcnQuCi0KLUZyaSBKYW4gMjEgMTY6MjU6MzUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmM6IEFkZCBhIHZlY3RvciBvZiBtYXRjaGluZyBmb3JtYXQgbmFtZXMuCi0JKiBmb3JtYXQuYyAoYmZkX21hdGNoaW5nX2Zvcm1hdHMpOiBOZXcgZnVuY3Rpb24gdG8gcmV0dXJuIGl0LgotCShiZmRfY2hlY2tfZm9ybWF0KTogU2V0IGl0LgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotCSogYmZkLWluLmg6IFJlbW92ZSBkZWNscyBvZiBiZmRfZWMgdHlwZSBhbmQgZXJyb3IgcHJpbnRpbmcgZnVuY3Rpb25zLgotCVJlbW92ZSBkZWNsIG9mIHR5cGUgc3ltY2xhc3M7IHdhc24ndCB1c2VkLgotCSogYmZkLmM6IERvY3VtZW50IGVycm9yIGhhbmRsaW5nLCBpbmNsdWRpbmcgY29kZSBmcmFnbWVudHMKLQljb250YWluaW5nIHRoZSBlcnJvciBkZWNscyB0aGF0IHdlcmUgaW4gYmZkLWluLmguCi0JUmVtb3ZlIERFRlVOcy4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLUZyaSBKYW4gMjEgMTQ6MTE6MTYgMTk5NCAgU2VhbiBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmgsIGxpYmxubS5oLCBubG0zMi1hbHBoYS5jIG5sbTMyLWkzODYuYyBubG0zMi1zcGFyYy5jOgotCVRoZSBzcGFyYyAoYW5kIHBvc3NpYmx5IG90aGVyPykgTkxNIGZvcm1hdCByZXF1aXJlcyBhIGRpZmZlcmVudAotCXdheSB0byB3cml0ZSBleHBvcnRzLCBzbyBhZGQgYSB3cml0ZV9leHBvcnQgZmllbGQgdG8gdGhlIGJhY2tlbmQKLQlkYXRhIChhbmQgc2V0IGl0IHRvIE5VTEwgZm9yIGV2ZXJ5dGhpbmcgYnV0IHRoZSBzcGFyYykuCi0KLUZyaSBKYW4gMjEgMTQ6MTE6MTYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHN1bm9zLmMgKE1ZKHJlYWRfZHluYW1pY19yZWxvY3MpKTogQ29tcGFyZSBpbmZvLT5keW5yZWwgd2l0aCBOVUxMLAotCW5vdCAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIE5VTEwuICBpbmZvLT5keW5yZWwgaXMgYSBQVFIsIG5vdAotCWEgc3RydWN0IGV4dGVybmFsX25saXN0ICouCi0KLUZyaSBKYW4gMjEgMDk6Mjk6MDEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuYzogUmVtb3ZlIGVycm9yIHN0cmluZ3MgZm9yIGVycm9ycyByZW1vdmVkIGJlbG93LgotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpLCBiZmQtaW4uaCAoYmZkX2VjKSwKLQlvYXN5cy5jIChvYXN5c193cml0ZV9zZWN0aW9ucyk6IFJlbmFtZQotCWJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24gdG8gbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uLgotCU5vbmUgb2YgdGhlIG90aGVyIGJmZCBlcnJvciBuYW1lcyBzdGFydCB3aXRoICJiZmRfZXJyb3IiLgotCVJlbW92ZSBlcnJvcnMgc3ltYm9sX25vdF9mb3VuZCBhbmQgbm9fcmVsb2NhdGlvbl9pbmZvLCB3aGljaCBzZWVtCi0JdG8gYmUgdW51c2VkLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotRnJpIEphbiAyMSAwMToxMTo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChiZmRfZ2V0X2dwX3NpemUpOiBBZGRlZCBzdXBwb3J0IGZvciBFTEYuCi0KLQkqIHN5bXMuYyAoQlNGX0RZTkFNSUMpOiBOZXcgc3ltYm9sIGZsYWcuCi0JKGJmZF9wcmludF9zeW1ib2xfdmFuZGYpOiBQcmludCBpdC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogTmV3IHJlYWRfZHluYW1pY19zeW1ib2xzCi0JYW5kIHJlYWRfZHluYW1pY19yZWxvY3MgZmllbGRzLgotCShzdHJ1Y3QgYW91dGRhdGEpOiBOZXcgZHluYW1pY19pbmZvIGZpZWxkLgotCShvYmpfYW91dF9keW5hbWljX2luZm8pOiBOZXcgYWNjZXNzb3IgbWFjcm8uCi0JKiBzdW5vcy5jIChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvKTogTmV3IHN0cnVjdHVyZS4KLQkoc3Vub3NfcmVhZF9keW5hbWljX2luZm8sIE1ZKHJlYWRfZHluYW1pY19zeW1ib2xzKSwKLQlNWShyZWFkX2R5bmFtaWNfcmVsb2NzKSk6IE5ldyBmdW5jdGlvbnMgdG8gcmVhZCBkeW5hbWljIHN5bWJvbHMKLQlhbmQgcmVsb2NzLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBJZiB0aGUgb2JqZWN0IGlzCi0JZHluYW1pY2FsbHkgbGlua2VkLCBzZXQgU0VDX1JFTE9DIGZvciBib3RoIHRoZSAudGV4dCBhbmQgLmRhdGEKLQlzZWN0aW9ucy4KLQkodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IERvbid0IHNldCBCU0ZfTE9DQUwgZm9yIGFuCi0JdW5kZWZpbmVkIHN5bWJvbC4KLQkodHJhbnNsYXRlX3N5bWJvbF90YWJsZSk6IE5ldyBmdW5jdGlvbiwgc3BsaXQgb3V0IG9mCi0Jc2x1cnBfc3ltYm9sX3RhYmxlOyBzZXQgdGhlIEJTRl9EWU5BTUlDIGZsYWcgYXBwcm9wcmlhdGVseS4KLQkoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiBSZWFkIGR5bmFtaWMgc3ltYm9scywgaWYgYW55LgotCShOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKTogUmVhZCBkeW5hbWljIHJlbG9jcywgaWYgYW55LgotCShOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IEluY2x1ZGUgZHluYW1pYyByZWxvYyBjb3VudCBpbgotCXJldHVybiB2YWx1ZS4KLQkqIGFvdXRmMS5oIChOQU1FKGFvdXQsc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cykpOiBEb24ndCB3cml0ZQotCW91dCBkeW5hbWljIHN5bWJvbHMgb3IgcmVsb2NzIGFnYWluc3QgcmVsb2Mgc3ltYm9scywgc2luY2UgdGhleQotCWFyZSBhbHJlYWR5IGluIHRoZSAudGV4dCBzZWN0aW9uIGFuZCB3ZSB3b3VsZG4ndCBrbm93IHdoZXJlIHRvCi0Jd3JpdGUgdGhlbSBhbnlob3cuCi0JKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBJbml0aWFsaXplIHJlYWRfZHluYW1pY19zeW1ib2xzIGFuZAotCXJlYWRfZHluYW1pY19yZWxvY3MgZmllbGRzLgotCSogYW91dC10YXJnZXQuaCAoTVkoYmFja2VuZF9kYXRhKSk6IEluaXRpYWxpemUKLQlyZWFkX2R5bmFtaWNfc3ltYm9scyBhbmQgcmVhZF9keW5hbWljX3JlbG9jcyBmaWVsZHMuCi0KLVRodSBKYW4gMjAgMjA6NTc6MjcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvYWxwaGFvc2YuaCAodWludDY0ZV90eXBlLCB1aW50NjRfdHlwZSwgaW50NjRfdHlwZSk6IERlbGV0ZQotCXR5cGVkZWZzLCBzaW5jZSBIT1NUXzY0X0JJVCB3aWxsIHRha2UgY2FyZSBvZiBkZWZpbmluZyB0aGVtIGluCi0JYmZkLmguCi0KLVdlZCBKYW4gMTkgMTc6Mjg6NTkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2FscGhhb3NmLm1oIChIREVGSU5FUyk6IERvbid0IGRlZmluZSBIT1NUXzY0X0JJVCBoZXJlOwotCXRoYXQncyBkZWFsdCB3aXRoIGVsc2V3aGVyZS4KLQkqIGhvc3RzL2FscGhhb3NmLmggKHNwcmludGZfdm1hLCBmcHJpbnRmX3ZtYSk6IE5ldyBtYWNyb3MuCi0JKHVpbnQ2NF90eXBlSElHSCwgdWludDY0X3R5cGVMT1cpOiBDb21tZW50IHdpdGggSE9TVF82NF9CSVQgc28KLQl0aGV5IGdldCBjb3BpZWQgdG8gYmZkLmguCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IEFkZCBzb21lIEFscGhhIHJlbG9jYXRpb24KLQl0eXBlcy4gIFJlb3JnYW5pemVkIHNvbWUgb2YgdGhlIGV4aXN0aW5nIG9uZXMuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2hvd3RvX3RhYmxlKTogQ29uc3RydWN0IDY0LWJpdCBuZWdhdGl2ZSBvbmUKLQl2YWx1ZXMgaW4gY2FzZSBvZiBjb21waWxhdGlvbiBvbiBhIDMyLWJpdCBtYWNoaW5lLiAgRml4IHBjcmVsCi0JZmllbGRzIG9mIHNvbWUgcmVsb2MgdHlwZXMuCi0JKGFscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBtb3JlIHJlbG9jYXRpb24gdHlwZXMuCi0KLQkqIGJmZC1pbi5oICh1aW50NjRfdHlwZUhJR0gsIHVpbnQ2NF90eXBlTE9XKTogU3VwcGx5IGRlZmF1bHQKLQlkZWZpbml0aW9ucyB3aGVuIG5vdCBkZWZpbmVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdWludDY0X3R5cGUgaXMKLQlhIGRlZmluZWQgbWFjcm8gb3Igbm90LgotCShmcHJpbnRmX3ZtYSwgc3ByaW50Zl92bWEpOiBEZWZpbmUgb25seSBpZiBmcHJpbnRmX3ZtYSBpcyBub3QKLQlhbHJlYWR5IGRlZmluZWQuCi0KLVdlZCBKYW4gMTkgMDA6MDI6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IFNldCB0aGUgdHlwZSBvZiBhCi0JQlNGX1dBUk5JTkcgc3ltYm9sIHRvIE5fV0FSTklORy4KLQotVHVlIEphbiAxOCAxNjo0MzoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IEluY3JlbWVudCBzeW1faGFzaCBhcyB3ZWxsIGFzIHAKLQlmb3IgYW4gaW5kaXJlY3Qgb3Igd2FybmluZyBzeW1ib2wuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogVXBkYXRlIHN5bV9oYXNoIHdpdGggdGhlIHRhcmdldCBvZiBhbgotCWluZGlyZWN0IG9yIHdhcm5pbmcgc3ltYm9sLiAgSWYgYW4gaW5kaXJlY3Qgc3ltYm9sIGlzIGRlZmluZWQsCi0Jb3V0cHV0IHRoZSBjYWxjdWxhdGVkIHZhbHVlIGFuZCBkb24ndCBvdXRwdXQgdGhlIHRhcmdldCBzeW1ib2wuCi0KLVR1ZSBKYW4gMTggMDM6NTQ6NTkgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogR2l2ZSB3YXJuaW5nIHN5bWJvbHMKLQlhbiAodW51c2VkKSBub256ZXJvIHNlY3Rpb24gdmFsdWUsIG5lZWRlZCBmb3IgY2hlY2sgYmVsb3cuCi0KLU1vbiBKYW4gMTcgMTU6MTI6MDcgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzLAotCWFvdXRfbGlua19hZGRfc3ltYm9scyk6IFRyZWF0IE5fU0VUW0FCRFRdIHwgTl9FWFQgbGlrZQotCU5fU0VUW0FCRFRdLgotCi1GcmkgSmFuIDE0IDE2OjQ1OjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBJZiB0aGVyZSBpcyBhIFNIVF9EWU5BTUlDIHNlY3Rpb24sIHNldAotCXRoZSBEWU5BTUlDIGZsYWcgZm9yIHRoZSBCRkQuCi0JKE5BTUUoYmZkX2VsZix3cml0ZV9vYmplY3RfY29udGVudHMpKTogRG9uJ3QgdHJ5IHRvIHdyaXRlIG91dCBhCi0JQkZEIHdpdGggdGhlIERZTkFNSUMgZmxhZyBzZXQsIHNpbmNlIHdlIGRvbid0IGdlbmVyYXRlIHRoZSBwcm9ncmFtCi0JaGVhZGVyIHRhYmxlIGNvcnJlY3RseS4KLQotRnJpIEphbiAxNCAwMTowNDozNiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBGcmVlIHhfc3ltcCBhdCB0aGUgZW5kCi0Jb2YgdGhlIGZ1bmN0aW9uIHRvIGF2b2lkIHN0b3JhZ2UgbGVhay4KLQotVGh1IEphbiAxMyAyMzowNzozMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiBBbiBpZmQgY2FuIGJlIC0xLgotCi1UaHUgSmFuIDEzIDEyOjMzOjI3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NldF9yZWxvY19pbmZvKTogUHJvdmlkZSBhIGRlZmF1bHQgc3ltYm9sIGZvcgotCXJlbG9jYXRpb25zIHdoaWNoIGRvbid0IGFjdHVhbGx5IGhhdmUgYW4gYXNzb2NpYXRlZCBzeW1ib2wuCi0KLQkqIHNvbS5jIChocHBhX3NvbV9yZWxvYyk6IEFkZCBuZXcgImVycm9yIG1lc3NhZ2UiIGFyZ3VtZW50LgotCi1XZWQgSmFuIDEyIDEzOjM2OjQzIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCUVuYWJsZSBnZGIgdG8gd3JpdGUgdG8gY29yZSBmaWxlcyBvbiBtb3JlIGNvcmUgZmlsZSByZWFkZXJzLgotCSogbGliYmZkLmMgKGJmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogIFJlbW92ZSByYW5nZSBjaGVjawotCWZvciBzZWN0aW9uIHNpemUsIGl0IGlzIGFscmVhZHkgZG9uZSBpbiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMKLQl3aXRoIGJmZF9nZXRfc2VjdGlvbl9zaXplX25vdy4KLQkqIGFpeDM4Ni1jb3JlLmMsIGhwcGFic2QtY29yZS5jLCBocHV4LWNvcmUuYywgaXJpeC1jb3JlLmMsCi0Jb3NmLWNvcmUuYywgcHRyYWNlLWNvcmUuYywgdHJhZC1jb3JlLmMgKCpfc2V0X3NlY3Rpb25fY29udGVudHMpOgotCVVzZSBiZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyBpbnN0ZWFkIG9mIGJmZF9mYWxzZS4KLQotV2VkIEphbiAxMiAxNTozMTo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jOiBBZGRlZCBpbml0aWFsIGRvY3VtZW50YXRpb24uCi0KLQkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBEb24ndCBleHBlY3Qgc3BhY2UgZm9yCi0Jb3V0cHV0IHJlbG9jYXRpb25zIGlmIHRoZXJlIGFyZW4ndCBhbnkgaW5wdXQgcmVsb2NhdGlvbnMuCi0KLVR1ZSBKYW4gMTEgMTQ6Mzc6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBTZXQgYV9lbnRyeSBiZWZvcmUgY29tcHV0aW5nCi0JZmlsZSBvZmZzZXRzLgotCi0JKiBlbGZjb2RlLmggKHN3YXBfb3V0X3N5bXMpOiBBIGNvbW1vbiBzeW1ib2wgaXMgU1RUX09CSkVDVCwgbm90Ci0JU1RUX05PVFlQRS4KLQotVHVlIEphbiAxMSAwOToxMDo1NiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogVXNlIEVMRiwgbm90IENPRkYgZm9yIG04OCotKi1kZ3V4Ki4KLQlDb21iaW5lIG04OGstKi0qIGFuZCBtODgxMTAtKi0qIGNhc2VzIGludG8gbTg4Ki0qLSouCi0KLVR1ZSBKYW4gMTEgMDA6MDc6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZmxpbmsuYzogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gY29tcHJlc3MgYW5kIG1lcmdlIGRlYnVnZ2luZwotCWluZm9ybWF0aW9uLCBhbmQgdG8gd3JpdGUgc29tZSBvZiBvdXQgZGlyZWN0bHkgcmF0aGVyIHRoYW4gc2F2aW5nCi0JaXQgaW4gbWVtb3J5LiAgU2V2ZXJhbCBuZXcgZnVuY3Rpb25zIGFuZCBzdHJ1Y3R1cmVzLCBhbmQgbmV3Ci0JYXJndW1lbnRzIHRvIGV4aXN0aW5nIGZ1bmN0aW9ucy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMpOiBDb21wdXRlCi0Jc3ltX2ZpbGVwb3MgYXMgd2VsbC4KLQkoZWNvZmZfZ2V0X2V4dHIpOiBVc2UgaWZkbWFwIGluc3RlYWQgb2YgaWZkYmFzZS4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgY29tcHV0ZSBzeW1fZmlsZXBvcyBoZXJlLgotCU9ubHkgb3V0cHV0IHN5bWJvbHMgaWYgb3V0c3ltYm9scyBpcyBub3QgTlVMTC4KLQkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBBZGp1c3QgZm9yIGNoYW5nZXMgaW4gZWNvZmZfZGVidWdfaW5mbyBhbmQKLQliZmRfZWNvZmZfZGVidWcgZnVuY3Rpb25zLiAgV3JpdGUgb3V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBoZXJlLgotCShlY29mZl9maW5hbF9saW5rX2RlYnVnX2FjY3VtdWxhdGUpOiBBZGp1c3QgZm9yIGNoYW5nZXMgaW4KLQliZmRfZWNvZmZfZGVidWcgZnVuY3Rpb25zLgotCShlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogVXNlIGlmZG1hcCByYXRoZXIgdGhhbiBpZmRiYXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBSZWFkIGV4dGVybmFsIHN5bWJvbHMKLQlmaXJzdCwgdG8gcHV0IHRoZW0gaW4gdGhlIGZpcnN0IG1lbW9yeSBidWZmZXIuICBDbGVhciBmZHIgZmllbGQuCi0JKG1pcHNfZWxmX2dldF9leHRyKTogVXNlIHBvaW50ZXIgdG8gdW5zd2FwcGVkIGV4dGVybmFsIHN5bWJvbC4KLQkobWlwc19lbGZfZmluYWxfbGluayk6IEFkanVzdCBmb3IgY2hhbmdlcyBpbiBiZmRfZWNvZmYgZnVuY3Rpb25zLgotCVByZXNlcnZlIC50ZXh0LCAuZGF0YSBhbmQgLmJzcyBldmVuIGlmIHRoZXkgYXJlIGVtcHR5LiAgU2F2ZQotCXBvaW50ZXIgdG8gdW5zd2FwcGVkIGV4dGVybmFsIHN5bWJvbCByYXRoZXIgdGhhbiBjb3B5aW5nIGl0LgotCURvbid0IGZyZWUgdXAgdGhlIGV4dGVybmFsIHN5bWJvbHMuCi0JKiBsaWJlbGYuaCAoZWxmX3N5bWJvbF90eXBlKTogQ2hhbmdlIG1pcHNfZXh0ciB0byBQVFIuCi0JKiBiZmQtaW4uaCAoYmZkX2Vjb2ZmX2RlYnVnX2luaXQsIGJmZF9lY29mZl9kZWJ1Z19mcmVlKTogRGVjbGFyZS4KLQkoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlX290aGVyKTogUmVuYW1lIGRlY2xhcmF0aW9uIGZyb20KLQliZmRfZWNvZmZfZGVidWdfbGlua19vdGhlciBhbmQgdXBkYXRlLgotCShiZmRfZWNvZmZfd3JpdGVfYWNjdW11bGF0ZWRfZGVidWcpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi1Nb24gSmFuIDEwIDIwOjQ2OjUzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlbW92ZSAiQCIgd2hpY2ggZm9sbG93cyBhIGJhY2tzbGFzaC4gIEluCi0JdGhpcyBwb3NpdGlvbiBpdCBqdXN0IGNhdXNlcyBlcnJvcnMsIG5vdCBzdXBwcmVzc2VzIGVjaG9lcy4KLQotTW9uIEphbiAxMCAwOTowNjoyMSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogRml4IGhhbmRsaW5nIG9mIExUIGFuZCBSVAotCWZpZWxkIHNlbGVjdG9ycy4KLQotU3VuIEphbiAgOSAwNDozMjoyNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2kzODYtbmV0YnNkLm10IChTRUxFQ1RfVkVDUyk6IEluY2x1ZGUgaTM4NmJzZF92ZWMuCi0KLUZyaSBKYW4gIDcgMTA6Mjc6MjcgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhZGp1c3Rfel9tYWdpYyk6IERvbid0IG1lcmdlIHRoZSBzdGFydCBvZiBic3Mgd2l0aCB0aGUKLQllbmQgb2YgZGF0YSBpZiB0aGV5IGFyZSBub3QgY29udGlndW91cy4KLQotCSogYW91dGYxLmggKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBDb21tZW50IHRoZSBmaWVsZHMnIG1lYW5pbmdzLgotCi1GcmkgSmFuICA3IDE1OjQwOjE2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfbWtvYmplY3RfaG9vayk6IERvbid0IHNldCBTRUNfU0hBUkVEX0xJQlJBUlkgZmxhZwotCWZvciAucmVnaW5mbyBzZWN0aW9uIGhlcmUuCi0JKGVjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBTZXQgaXQgaGVyZSBpbnN0ZWFkLgotCi1GcmkgSmFuICA3IDEwOjI5OjI3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotICAgIAkqIGJmZC1pbi5oOiAoYmZkX2Jvb2xlYW4pOiBBZGQgd29ya2Fyb3VuZCBmb3Igc3lzdGVtcyB0aGF0IGFsc28KLQlkZWZpbmUgdHJ1ZSBhbmQgZmFsc2UgYXMgZW51bXMuCi0JKEFMTU9TVF9TVERDKTogQWRkIGFzIGFsdGVybmF0aXZlIHRvIF9fU1REQ19fLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogc3ltcy5jIChiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKTogQ29udmVydCBhIFBUUiB0byBGSUxFKi4KLQotVGh1IEphbiAgNiAxNDoyNDo0NCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogQ2F0Y2ggdGhlIGNhc2Ugd2hlcmUKLQl0aGVyZSBpcyBubyBvdXRwdXQgc2VjdGlvbi4KLQotVGh1IEphbiAgNiAxNDozNzo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogSWYgd2UgY2FuJ3QgcmVhZCB0aGUgZml4ZWQgaGVhZGVyLAotCWNvdW50IGl0IGFzIGEgd3JvbmcgZm9ybWF0IGVycm9yLCBub3QgYSBzeXN0ZW0gY2FsbCBlcnJvciwgc2luY2UKLQl0aGUgb2JqZWN0IGZpbGUgbWlnaHQgc2ltcGx5IGJlIHRvbyBzbWFsbC4KLQotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogQWRkZWQgbmxtMzJfYWxwaGFfdmVjIGluc2lkZSAjaWZkZWYKLQlCRkQ2NC4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IFJlbW92ZSBubG0zMi1hbHBoYS5vLgotCShCRkQ2NF9CQUNLRU5EUyk6IEFkZCBubG0zMi1hbHBoYS5vLiAgSXQgZGVwZW5kcyBvbiA2NCBiaXQKLQlzdXBwb3J0LCBldmVuIHRob3VnaCBpdCBpcyBmb3IgYW4gQWxwaGEgaW4gMzIgYml0IG1vZGUuCi0JKiBjb25maWd1cmUuaW4gKG5sbTMyX2FscGhhX3ZlYyk6IFNldCB0YXJnZXQ2NCB0byB0cnVlLgotCi0JKiBubG0zMi1nZW4uYywgbmxtNjQtZ2VuLmM6IFJlbW92ZWQuICBBbGwgbmxtIHRhcmdldHMgYXJlCi0JZGlmZmVyZW50LCBzbyB0aGVyZSBpcyBubyBwb2ludCB0byBwcm92aWRpbmcgYSBnZW5lcmljIG9uZS4KLQkqIGxpYm5sbS5oOiBEb24ndCBib3RoZXIgdG8gY2hlY2sgZm9yIG5sbV9iYWNrZW5kKGJmZCkgYmVpbmcgTlVMTAotCWluIHRoZSBiYWNrZW5kIGFjY2Vzc29yIG1hY3JvczsgdGhhdCBzaG91bGQgbm8gbG9uZ2VyIGJlIHBvc3NpYmxlLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogUmVtb3ZlZCBubG0zMl9iaWdfZ2VuZXJpY192ZWMsCi0JbmxtNjRfYmlnX2dlbmVyaWNfdmVjLCBubG02NF9saXR0bGVfZ2VuZXJpY192ZWMuCi0JKiBjb25maWd1cmUuaW4gKG5sbTMyX2JpZ19nZW5lcmljX3ZlYywgbmxtMzJfbGl0dGxlX2dlbmVyaWNfdmVjLAotCW5sbTY0X2JpZ19nZW5lcmljX3ZlYywgbmxtNjRfbGl0dGxlX2dlbmVyaWNfdmVjKTogUmVtb3ZlZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcywgYW5kCi0JKEJGRDMyX0JBQ0tFTkRTKTogUmVtb3ZlZCBubG0zMi1nZW4uby4KLQkoQkZENjRfQkFDS0VORFMpOiBSZW1vdmVkIG5sbTY0LWdlbi5vLgotCShDRklMRVMpOiBSZW1vdmVkIG5sbTMyLWdlbi5jIGFuZCBubG02NC1nZW4uYy4KLQotCSogaHAzMDBocHV4LmMgKEFSQ0hfU0laRSk6IERlZmluZSBiZWZvcmUgaW5jbHVkaW5nIGFvdXR4LmguCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IEFkZCBjb25zdHJ1Y3RvciBhbmQKLQliaXRzaXplIGFyZ3VtZW50cy4gIENoYW5nZWQgYWxsIGNhbGxlcnMgKGFvdXR4LmgpLgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogQWRkIGNvbnN0cnVjdG9yCi0JYW5kIGJpdHNpemUgYXJndW1lbnRzIHRvIGRlY2xhcmF0aW9uLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLQkqIGVjb2ZmLmM6IEZpcnN0IGN1dCBhdCBuZXcgc3R5bGUgb2YgbGlua2VyIGJhY2tlbmQgZm9yCi0JRUNPRkYtLWFkZGVkIGEgYnVuY2ggb2YgZnVuY3Rpb25zLiAgQWxzbzoKLQkoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MpOiBTZXQgZmxhZ3MgZm9yIC5wZGF0YSBhbmQgLnhkYXRhLgotCShlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBDYWxsIGVjb2ZmX3NsdXJwX3N5bWJvbGljX2hlYWRlci4KLQkoZWNvZmZfY29tcHV0ZV9yZWxvY19maWxlX3Bvc2l0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBHZXQgb3V0IHF1aWNrbHkgaWYgY291bnQgaXMgemVyby4KLQlDaGVjayBlcnJvcnMgYmV0dGVyLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBQdXQgLnhkYXRhIHNlY3Rpb24gaW4gZGF0YSBzZWdtZW50LgotCUNhbGwgZWNvZmZfY29tcHV0ZV9yZWxvY19maWxlX3Bvc2l0aW9ucy4gIERvbid0IG91dHB1dCByZWxvY3Mgb3IKLQlleHRlcm5hbCBzeW1ib2xzIGlmIG91dHN5bWJvbHMgaXMgTlVMTC4KLQkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBDb21wbGV0ZWx5IHJld3JpdHRlbi4KLQkqIGxpYmVjb2ZmLmg6IEluY2x1ZGUgYmZkbGluay5oLgotCShzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhKTogQWRkIHJlbG9jYXRlX3NlY3Rpb24gZmllbGQuCi0JKGVjb2ZmX2RhdGFfdHlwZSk6IEFkZCBzeW1faGFzaGVzIGFuZCBzeW1uZHhfdG9fc2VjdGlvbiBmaWVsZHMuCi0JKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkpOiBEZWZpbmUuCi0JKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKGVjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRGVjbGFyZSBhcyBmdW5jdGlvbiwgbm90IG1hY3JvLgotCShlY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMpOiBDYWxsIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwuCi0JKiBiZmQtaW4uaCAoYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2hvd3RvX3RhYmxlKTogTWFyayBCUkFERFIgYXMKLQlwYXJ0aWFsX2lucGxhY2UsIGFuZCBzZXQgdGhlIHNyY19tYXNrIHRvIDB4MWZmZmZmLgotCShhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBSZW1vdmUgdW51c2VkCi0JdmFyaWFibGUgZ3Bfd2FybmVkLgotCShhbHBoYV9jb252ZXJ0X2V4dGVybmFsX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgcmVsb2NhdGVfc2VjdGlvbiBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3JlZmhpKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIHJlbG9jYXRlX3NlY3Rpb24gZmllbGQuCi0KLQkqIHJlbG9jLmMgKF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBDb3JyZWN0ZWQgc2lnbmVkIG92ZXJmbG93Ci0JY2hlY2tpbmcgd2hlbiB0aGVyZSBpcyBhbiBhZGRlbmQuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IERvbid0IGFib3J0IHdoZW4gdHJ5aW5nIHRvIGxpbmsKLQlhIG5vbiBhLm91dCBmaWxlLCBqdXN0IHBhc3MgaXQgdG8gX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IFdoZW4gZG9pbmcgYSBmaW5hbCBQQyByZWxhdGl2ZSBsaW5rCi0JYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLCBzdWJ0cmFjdCB0aGUgVk1BIG9mIHRoZSBpbnB1dCBzZWN0aW9uLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQotCSogbGlua2VyLmMgKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IFJlbmFtZWQgZnJvbQotCV9iZmRfZ2VuZXJpY19pbmRpcmVjdF9saW5rX29yZGVyIGFuZCBtYWRlIHN0YXRpYy4KLQkoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBEb24ndCBzd2l0Y2ggb24gbGlua19vcmRlciB0eXBlLCBqdXN0Ci0JY2FsbCBfYmZkX2RlZmF1bHRfbGlua19vcmRlci4KLQkoX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIpOiBIYW5kbGUgYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIgdHlwZS4KLQkqIGdlbmxpbmsuaDogUmVtb3ZlZCBkZWNsYXJhdGlvbiBvZgotCV9iZmRfZ2VuZXJpY19pbmRpcmVjdF9saW5rX29yZGVyLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogRG9uJ3Qgc3dpdGNoIG9uIGxpbmtfb3JkZXIKLQl0eXBlLCBqdXN0IGNhbGwgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIuCi0KLVR1ZSBKYW4gIDQgMjE6MjM6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IEJhc2UgdGhlIG5hbWUgb2YKLQl0aGUgY3JlYXRlZCBjb21tb24gc2VjdGlvbiBvbiB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbiB0aGUgc3ltYm9sCi0JY2FtZSBmcm9tLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IChjYXNlIEJJRyk6IEEgY29tbW9uIHN5bWJvbAotCW11c3QgaGF2ZSBhIHNlY3Rpb24sIHNvIGRvbid0IGJvdGhlciB0byBjcmVhdGUgb25lLgotCi1Nb24gSmFuICAzIDE1OjMyOjE2IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCAoTVkodmVjKSk6IEFkZCBEWU5BTUlDIHRvIG1hc2sgb2Ygb2JqZWN0IGZsYWdzLgotCSogYW91dGYxLmggKE5BTUUoYW91dCxzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6Ci0JSWYgdGhlIERZTkFNSUMgZmxhZyBpcyBzZXQsIHNldCBpdCBpbiB0aGUgZXhlYyBoZWFkZXIuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IElmIHRoZSBvYmplY3QgaXMKLQlkeW5hbWljYWxseSBsaW5rZWQsIHNldCB0aGUgRFlOQU1JQyBmbGFnIGluIHRoZSBCRkQuCi0JKiBsaWJhb3V0LmggKE5fU0VUX0RZTkFNSUMpOiBOZXcgbWFjcm8uCi0JKE5fRFlOQU1JQyk6IEFkZCBtaXNzaW5nIDAgaW4gbWFzay4KLQotTW9uIEphbiAgMyAxMTo0MTo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dldF9leHRyKTogRG9uJ3Qgb3V0cHV0IHNlY3Rpb24gc3ltYm9scyBhcwotCWV4dGVybmFsIHN5bWJvbHMuCi0KLQkqIGJmZC1pbi5oLCBoYXNoLmM6IENoYW5nZSBiZmRfaGFzaF9hbGxvY2F0ZSBhcmd1bWVudCBmcm9tIHNpemVfdAotCXRvIHVuc2lnbmVkIGludCwgYmVjYXVzZSBzaXplX3QgbWF5IG5vdCBiZSBkZWZpbmVkIGluIGJmZC5oLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBiZmQtaW4uaCAoYmZkX2dldHtiLGx9W19zaWduZWRfXXsxNiwzMiw2NH0pOiBEZWNsYXJlIGFyZ3VtZW50IHRvCi0JYmUgYSBjb25zdCBwb2ludGVyLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogbGliYmZkLmMgKGJmZF9nZXR7YixsfVtfc2lnbmVkX117MTYsMzIsNjR9KTogRGVjbGFyZSBhcmd1bWVudCB0bwotCWJlIGEgY29uc3QgcG9pbnRlci4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IENoYW5nZSBzd2FwIGZ1bmN0aW9uIHBvaW50ZXJzCi0JYWNjb3JkaW5nbHkuCi0JKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2NvZmZfYXJtYXApOiBDaGFuZ2Ugc3dhcCBhY2NvcmRpbmdseS4KLQkqIGFpeDM4Ni1jb3JlLmM6IENoYW5nZSBOT19HRVQgYW5kIE5PX0dFVFMgYWNjb3JkaW5nbHkuCi0JKiBocHBhYnNkLWNvcmUuYywgaHB1eC1jb3JlLmMsIGlyaXgtY29yZS5jLCBvc2YtY29yZS5jLAotCXB0cmFjZS1jb3JlLmMsIHRyYWQtY29yZS5jOiBDaGFuZ2UgTk9fR0VUIGFuZCBOT19TSUdORURfR0VUCi0JYWNjb3JkaW5nbHkuCi0KLQkqIGxpYmJmZC1pbi5oIChzdHJ1Y3QgYXJ0ZGF0YSk6IEFkZGVkIHRkYXRhIGZpZWxkLgotCShfYmZkX2FkZF9iZmRfdG9fYXJjaGl2ZV9jYWNoZSk6IERlY2xhcmUuCi0JKF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zKTogRGVjbGFyZS4KLQkoX2JmZF9zbmFyZl9hcl9oZHIpOiBSZW5hbWVkIGZyb20gc25hcmZfYXJfaGRyLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBhcmNoaXZlLmM6IENsZWFuZWQgdXAgc29tZSBtb3JlLgotCShfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBJbml0aWFsaXplCi0JcG9pbnRlciBlbGVtZW50cyBvZiBhcnRkYXRhLgotCShfYmZkX2FkZF9iZmRfdG9fYXJjaGl2ZV9jYWNoZSk6IFJlbmFtZWQgZnJvbSBhZGRfYmZkX3RvX2NhY2hlLgotCShfYmZkX3NuYXJmX2FyX2hkcik6IFJlbmFtZWQgZnJvbSBzbmFyZl9hcl9oZHIuCi0JKF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zKTogUmVuYW1lZCBmcm9tIGdldF9lbHRfYXRfZmlsZXBvcy4KLQkoZ2V0X2V4dGVuZGVkX2FyZWx0X2ZpbGVuYW1lLCBiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUsCi0JYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0sIGNvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogTWFkZSBzdGF0aWMuCi0JKiBlY29mZi5jOiBTb21lIGNvbW1lbnQgY2hhbmdlcy4KLQkoZWNvZmZfc2x1cnBfYXJtYXApOiBIYW5kbGUgcmVuYW1lIG9mIHNuYXJmX2FyX2hkci4gIFNldAotCWFyZGF0YS0+dGRhdGEgdG8gcmF3X2FybWFwLgotCShlY29mZl9hcmNoaXZlX3ApOiBJbml0aWFsaXplIHBvaW50ZXIgZWxlbWVudHMgb2YgYXJ0ZGF0YS4KLQkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zKTogSGFuZGxlIHJlbmFtZSBvZgotCWFkZF9iZmRfdG9fY2FjaGUuCi0KLQkqIGhhc2guYzogQWRkZWQgc29tZSBkb2N1bWVudGF0aW9uLgotCi1Nb24gSmFuICAzIDExOjA5OjI4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oLCBuZXRic2QzODYuYzogUmVwbGFjZSBOT19TV0FQX01BR0lDIHdpdGggU1dBUF9NQUdJQywKLQlhbmQgZG8gdGhlIHN3YXBwaW5nIGhlcmUgcmF0aGVyIHRoYW4gY2FsbGluZyBudG9obCBmcm9tIHRoZSBOXyoKLQltYWNyb3MuICBUaGlzIGNsZWFucyB1cCBhc3N1bXB0aW9ucyBhYm91dCB0aGUgc2l6ZSBvZiBhIGhvc3QgbG9uZywKLQl0aGUgZXhpc3RlbmNlIHRvIG50b2hsLCBldGMuCi0KLVNhdCBKYW4gIDEgMTM6NTA6MDUgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3IgVlNUYSBtaWNyby1rZXJuZWwuIEl0IGN1cnJlbnRseSB1c2VzCi0JaTM4Ni1hb3V0LgotCi1TYXQgSmFuICAxIDEwOjE4OjU0IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4Nm1hY2gzLmggKEhPU1RfU0VHTUVOVF9TSVpFKTogRml4IHZhbHVlLgotCSogaTM4Nm1hY2gzLmMgKFNFR01FTlRfU0laRSk6IEZpeCB2YWx1ZS4KLQotRm9yIG9sZGVyIGNoYW5nZXMgc2VlIENoYW5nZUxvZy05MTkzCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBjaGFuZ2UtbG9nCi1sZWZ0LW1hcmdpbjogOAotZmlsbC1jb2x1bW46IDc0Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9iZmQvQ2hhbmdlTG9nLTk2OTcgYi9iZmQvQ2hhbmdlTG9nLTk2OTcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMjJjOGMuLjAwMDAwMDAKLS0tIGEvYmZkL0NoYW5nZUxvZy05Njk3CisrKyAvZGV2L251bGwKQEAgLTEsNjcxMSArMCwwIEBACi1UdWUgRGVjIDMwIDEyOjQ1OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogSWYgLUJzeW1ib2xpYywgZG9uJ3QKLQlhbGxvY2F0ZSBzcGFjZSBmb3IgYSBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIHdoaWNoIGlzCi0JZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZS4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IElmIC1Cc3ltYm9saWMsIGRvbid0IGNvcHkgYSBQQwotCXJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIKLQlmaWxlLgotCi1Nb24gRGVjIDI5IDE4OjAyOjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gSm9uYXRoYW4gU3RvbmUgPGpvbmF0aGFuQERTRy5TdGFuZm9yZC5FRFU+OgotCSogY29uZmlnLmJmZCAobWlwcy1kZWMtbmV0YnNkKik6IEFkZCBFQ09GRiB2ZWN0b3JzIHRvCi0JdGFyZ19zZWx2ZWNzLgotCShtaXBzKmVsLSotbmV0YnNkKik6IExpa2UgbWlwcy1kZWMtbmV0YnNkKi4KLQkobWlwcyotKi1uZXRic2QqKTogTmV3IHRhcmdldC4KLQotTW9uIERlYyAyOSAxNzoxMzoyOCAxOTk3ICBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogQ2hhbmdlIGVycm9yIG1lc3NhZ2UKLQlmcm9tICJ1bmRlZmluZWQgdmVyc2lvbiBuYW1lIiB0byAidW5kZWZpbmVkIHZlcnNpb25lZCBzeW1ib2wKLQluYW1lIi4KLQotTW9uIERlYyAyOSAxMTo0MToxNiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHR5cG8gZnJvbSBwcmV2aW91cwotCWRlbHRhLgotCi1UdWUgRGVjIDIzIDE3OjAxOjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLWluLmggKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogU2V0IC5yZWxvYyBzZWN0aW9uIHRvIGJlCi0Jc2hhcmVkLiAgU2V0IHN0YWIqIHNlY3Rpb25zIHRvIGJlIHNoYXJlZCBhbmQgcmVhZC4gIFNldCAucnNyYwotCXNlY3Rpb24gdG8gYmUgcmVhZCBhbmQgc2hhcmVkLgotCi1Nb24gRGVjIDIyIDEzOjIwOjU3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBkd2FyZjIubG8uCi0JKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgZHdhcmYyLmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29mZi1hcm0uYzogRG9uJ3QgaW5jbHVkZSBvYnN0YWNrLmguCi0KLU1vbiBEZWMgMjIgMTM6MDQ6MzMgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWcuYmZkIChpWzM0NTZdODYqLWdvMzItcnRlbXMqKTogRml4IHRvIGJlIHRoZSBzYW1lIGFzCi0JaVszNDU2XTg2LWdvMzIuCi0KLVRodSBEZWMgMTggMTY6MDE6MjUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHRvIGdldCBAU0hFTExAIHN1YnN0aXR1dGVkLgotCi1XZWQgRGVjIDE3IDA5OjQ1OjA5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBPbmx5IGxvb2sgYXQgc2VjdGlvbgotCW93bmVyIGlmIHRoZXJlIGlzIG9uZS4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBGYWlsIGlmIHRoZXJlIGlzIG5vdAotCWVub3VnaCByb29tIGZvciB0aGUgcHJvZ3JhbSBoZWFkZXJzLgotCi1UdWUgRGVjIDE2IDA4OjA5OjU2IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBDYWxsCi0JX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUgZmlyc3QuCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBTYW1lLgotCSogZHdhcmYyLmM6IE5ldyBmaWxlOyBpbXBsZW1lbnQgX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUuCi0KLU1vbiBEZWMgMTUgMTY6MDg6NTIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYzogQWRkIGJmZF9tYWNoX20zMnIuCi0KLU1vbiBEZWMgMTUgMTY6MTE6MjIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUpOiBEZWZpbmUgaWYgSTk2MCBub3QgZGVmaW5lZC4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBVc2UgQUxJR05fU0VDVElPTlNfSU5fRklMRQotCXRvIGRlY2lkZSB3aGVuIHRvIGFsaWduIHRoZSBmaWxlIHNlY3Rpb25zIGZvciBwYWdpbmcuCi0JKiBjb2ZmY29kZS5oIChBTElHTl9TRUNUSU9OU19JTl9GSUxFKTogVW5kZWZpbmUgZm9yIFRJQzgwQ09GRi4KLQotTW9uIERlYyAxNSAxNTowMToxNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX29iamVjdF9wKTogTmV3IEZ1bmN0aW9uLgotCShtMzJyX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogIE5ldyBGdW5jdGlvbi4KLQkobTMycl9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MpOiAgTmV3IEZ1bmN0aW9uLgotCShtMzJyX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiAgTmV3IEZ1bmN0aW9uLgotCShtMzJyX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogIE5ldyBGdW5jdGlvbi4KLQkobTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6ICBOZXcgRnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX29iamVjdF9wKTogUG9pbnQgdG8gbTMycl9vYmplY3RfcC4KLQkoZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFBvaW50IHRvCi0JbTMycl9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4KLQkoYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBQb2ludCB0bwotCW0zMnJfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YS4KLQkoYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogUG9pbnQgdG8KLQltMzJyX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhLgotCShiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzKTogUG9pbnQgdG8KLQltMzJyX2VsZl9zZXRfcHJpdmF0ZV9iZmRfZGF0YS4KLQkoYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogUG9pbnQgdG8KLQltMzJyX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhLgotCi0KLQkqIGJmZC1pbjIuaCAoYmZkX21hY2hfbTMycik6IEFkZCBpZGVudGlmaWVyIGZvciBNMzJSIGFyY2hpdGVjdHVyZQotCW1hY2hpbmVzLgotCi1GcmkgRGVjIDEyIDExOjMwOjI4IDE5OTcgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IE9ubHkgYnVpbGQgbGliYmZkIHNoYXJlZCBpZiAtLWVuYWJsZS1zaGFyZWQncyB2YWx1ZQotCXdhcyBgeWVzJywgb3Igd2FzIHNldCB0byBgKmJmZConLgotCSogYWNsb2NhbC5tNDogTGlrZXdpc2UuCi0JKiBOT1RFOiB0aGlzIHJlYWxseSBuZWVkcyB0byBiZSBmaXhlZCBpbiBsaWJ0b29sL2xpYnRvb2wubTQsIHRoZQotCW9yaWdpbmFsIHNvdXJjZSBvZiB0aGlzIGJpdCBvZiBjb2RlLiAgSXQncyBub3QgY2xlYXIgd2hhdCB0aGUgYmVzdCBmaXgKLQl3b3VsZCBiZSwgdGhvdWdoLgotCi1UaHUgRGVjIDExIDE3OjQ4OjExIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogQWx3YXlzIGluaXQgdWRhdGEucCBzbwotCXRoYXQgdGhlIGdlbmVyaWMgcmVsYXhhdGlvbiBjb2RlIGNhbiBmdW5jdGlvbiB3aGVuIGlucHV0IGFuZCBvdXRwdXQKLQlmaWxlIGZvcm1hdHMgYXJlIG1pc21hdGNoZWQuCi0KLVRodSBEZWMgMTEgMDE6MDI6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKGJmZF9jb2ZmX3NtYWxsX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogRm9yIGEgbG9hZGFibGUKLQlzZWN0aW9uLCBtYWtlIHN1cmUgdGhhdCB0aGUgbG9hZCBhZGRyZXNzIGlzIGNvcnJlY3QgcmVsYXRpdmUgdG8KLQl0aGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBzZWdtZW50IHBsdXMgdGhlIHNpemUgb2YgdGhlIHNlZ21lbnQgc28KLQlmYXIuCi0KLQkqIGNvZmZjb2RlLmggKF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bik6IE1ha2Ugc3RhdGljLgotCShfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpOiBMaWtld2lzZS4KLQotV2VkIERlYyAxMCAyMzozNzoxMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogSGFuZGxlIGEgcmVsb2NhdGVhYmxlIGxpbmsgaW4KLQl3aGljaCBhIHJlbG9jYXRpb24gcmVmZXJzIHRvIGFuIGluZGlyZWN0IG9yIHdhcm5pbmcgc3ltYm9sLgotCi1XZWQgRGVjIDEwIDExOjE1OjU1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGJmZF9hcm1fY29mZl9maW5hbF9saW5rKTogRnVuY3Rpb24gZGVsZXRlZC4KLQkoY29mZl9hcm1fZmluYWxfbGlua19wb3N0c2NyaXB0KTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX2FybV9saW5rX291dHB1dF9oYXNfYmVndW4pOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGxpYmNvZmYuaCAoc3RydWN0IGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGRzOgotCV9iZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gYW5kCi0JX2JmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdC4gIEFkZCBuZXcgbWFjcm9zOgotCWJmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bigpIGFuZAotCWJmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCgpLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IEluc2VydCBjYWxscyB0bwotCWJmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bigpIGFuZAotCWJmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCgpLgotCi0JKiBjb2ZmY29kZS5oOiBBZGQgdHdvIG5ldyBmaWVsZHMgdG8gYmZkX2NvZmZfYmFja2VuZF9kYXRhCi0Jc3RydWN0dXJlOiBfYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIGFuZAotCV9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQuICBBZGQgZGVmYXVsdCBpbml0aWFsaXNlcnMgZm9yCi0JdGhlc2UgZmllbGRzLiAgQWRkIG92ZXJyaWRhYmxlIGFsaWFzZXMgZm9yIHRoZSBjb2ZmIHN3YXAgZnVuY3Rpb25zCi0JaW4gdGhlIGJhY2tlbmQgZGF0YSBzdHJ1Y3R1cmUuCi0KLQkqIGVsZjMyLXY4NTAuYzogVXBkYXRlIHdpdGggcGF0Y2hlcyBmcm9tIHRoZSBicmFuY2ggdG8gZml4Ci0JSEkxNl9TL0xPMTYgcmVsb2MgcGFpcnMuCi0KLVdlZCBEZWMgMTAgMTQ6MDY6NDggMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWQzMHYuYyAoZDMwdl9pbmZvX3RvX2hvd3RvX3JlbGEpOiBOZXcgZnVuY3Rpb24gdG8gc3VwcG9ydAotCVJFTEEgcmVsb2NhdGlvbnMuCi0JKFVTRV9SRUwpOiBEb24ndCBkZWZpbmUgYW55IG1vcmUsIHN3aXRjaCB0byB1c2luZyBSRUxBCi0JcmVsb2NhdGlvbnMuCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lIGFzIGQzMHZfaW5mb190b19ob3d0b19yZWxhLgotCi1UdWUgRGVjICA5IDExOjM3OjUzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfbWlwcyopOiBEZWZpbmUuCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBGb3IgMzAwMCBhbmQgNDAwMCByZXBsYWNlIG1hZ2ljIGNvbnN0YW50IHdpdGgKLSAJbWFjcm8uCi0KLQkqIGNwdS1taXBzLmMgKE4pOiBEZWZpbmUuCi0JKGJmZF9taXBzX2FyY2gsIGFyY2hfaW5mb19zdHJ1Y3QpOiBSZS13cml0ZSB1c2luZyBtYWNybyBOLCByZXBsYWNlCi0gCW51bWJlcnMgd2l0aCBiZmRfbWFjaF9taXBzKiBtYWNyb3MuCi0KLUZyaSBEZWMgIDUgMTE6MTM6NDYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvYywgdjg1MF9lbGZfc3RvcmVfYWRkZW5kX2luX2luc24sCi0Jdjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCByZWxvYyBhZGRlbmQgaGFuZGxpbmcuCi0JKHY4NTBfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiwgdjg1MF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcsCi0Jdjg1MF9lbGZfYWRkX3N5bWJvbF9ob29rLCB2ODUwX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vaywKLQl2ODUwX2VsZl9zZWN0aW9uX2Zyb21fc2hkciwgdjg1MF9lbGZfZmFrZV9zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbnMKLQl0byBjcmVhdGUgYW5kIGhhbmRsZSBzcGVjaWFsIGNvbW1vbiBzZWN0aW9ucy4KLQkodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IEZpeCBISTE2IGFuZCBISTE2X1MgcmVsb2NhdGlvbnMKLQl3aGljaCBoYXZlIGRhdGEgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbnMuCi0KLVR1ZSBEZWMgIDIgMTA6MjY6MTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBSZXZlcnQgYmFjayB0byAnXycKLQkoVVNFUl9MQUJFTF9QUkVGSVgpOiBSZXZlcnQgYmFjayB0byAnXycKLQotCSogY29uZmlnLmJmZCAodGFyZ19jcHUpOiBBZGQgc3VwcG9ydCBmb3IgVGh1bWIgdGFyZ2V0LgotCi1Nb24gRGVjICAxIDIwOjI0OjE4IDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29mZi1zaC5jIChzaF9jb2ZmX2hvd3Rvcyk6IEFkZCBSX1NIX1NXSVRDSDggZW50cnkuCi0JKGdldF9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgUl9TSF9TV0lUQ0g4LgotCShzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBMaWtld2lzZS4KLQotV2VkIE5vdiAyNiAxNDoxMzozNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChUQVJHRVRfVU5ERVJTQ09SRSk6IENoYW5nZWQgdG8gbWF0Y2ggZGVmaW5pdGlvbiBpbgotCWdjYy9jb25maWcvYXJtL3NlbWkuaAotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEFkZCBBUk0gYW5kIFRodW1iIHN5bWJvbAotCWNsYXNzZXMuCi0KLVN1biBOb3YgMjMgMTY6MDI6NTggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBmcmVlYnNkLmggKFNXQVBfTUFHSUMpOiBSZWFkIG1hZ2ljIG51bWJlciBsaXR0bGUgYW5kIG5vdCBiaWcKLSAJZW5kaWFuLgotCi1XZWQgTm92IDI2IDA5OjMwOjM3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IE9ubHkgc2V0IHByaXZhdGUgZmxhZ3MgZm9yIG5vbgotCVBFIEFSTSBwb3J0cy4KLQotVHVlIE5vdiAyNSAxNTozMzoyMyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQWxzbyBpZ25vcmUgTkVWRVJfTE9BRAotCXNlY3Rpb25zLgotCi1UdWUgTm92IDI1IDEwOjU1OjM2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRG8gbm90Ci0JY29tcGxhaW4gaWYgaW5vdXQgYW5kIG91dHB1dCBmb3JtYXRzIGRpZmZlci4KLQotVHVlIE5vdiAyNSAxMToyNjoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChCRkQzMl9CQUNLRU5EUyk6IFJlbW92ZSB0ZWtoZXgubG8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IFJlbW92ZSB0ZWtoZXguYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlLCBzcmMvTWFrZWZpbGUuaW46IFJlYnVpbGQgd2l0aCBjdXJyZW50Ci0JYXV0b21ha2UgYW5kIGF1dG9jb25mLgotCi0JKiBjb2ZmLWFybS5jIChhcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zKTogRml4IHR5cG8KLQkoQ09GRl9XSVRIX1BSIHRvIENPRkZfV0lUSF9QRSkuCi0KLU1vbiBOb3YgMjQgMTU6NDc6NDkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYzogTWFrZSB2YXJpYWJsZXMgYW5kIHNvbWUgZnVuY3Rpb25zIHN0YXRpYywgc28gdGhhdAotCXRoaXMgZmlsZSBjYW4gYmUgaW5jbHVkZWQgaW4gbXVsdGlwbGUgb2JqZWN0IGZpbGVzLgotCShjb2ZmX2FybV9iZmRfZmluYWxfbGluayk6IEZpeCBtaW5vciBidWcuCi0KLVNhdCBOb3YgMjIgMTU6MTY6MDAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYzogQWRkIHN1cHBvcnQgZm9yIFBJQyBhbmQgQVBDUy1GTE9BVCB0eXBlIGJpbmFyaWVzLgotCi0JKiBjb2ZmY29kZS5oOiBBZGQgc3VwcG9ydCBmb3IgUElDIGFuZCBBUENTLUZMT0FUIHR5cGUgYmluYXJpZXMuCi0KLVNhdCBOb3YgMjIgMTY6MDY6NTYgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGV2YXgtZW1oLmMgKF9iZmRfZXZheF93cml0ZV9lbWgpOiBVc2UgYWxsb2NhIGluc3RlYWQgb2Ygc3RyZHVwLgotCi1TYXQgTm92IDIyIDEyOjI5OjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBXaGVuIG92ZXJyaWRpbmcgYSBkZWZpbmVkCi0Jc3ltYm9sLCBzZXQgaXQgdG8gdW5kZWZpbmVkLCBub3QgbmV3LgotCi0JKiBlbGYzMi1zaC5jIChzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogRG9uJ3Qga2lsbCBMQUJFTAotCXJlbG9jcy4KLQotRnJpIE5vdiAyMSAxNDoxNDoyMiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbGF4X3NlY3Rpb24pOiBGb3JjZSBzaWduIGV4dGVudGlvbiBvZiBVU0VTIHJfb2Zmc2V0LgotCShzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBEb24ndCBraWxsIExBQkVMIHJlbG9jcy4KLQotTW9uIE5vdiAxNyAxNTowODozOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1tMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSk6IEZpeCB0eXBvLgotCShtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLVNhdCBOb3YgMTUgMTU6MzY6MDcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBDYXN0IHNlY29uZCBhcmcgb2YKLQliZmRfaF9nZXRfKiBjYWxscyB0byAiYmZkX2J5dGUgKiIuCi0KLVR1ZSBOb3YgMTEgMTA6Mzc6MjMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtbTEwMzAwLmMgKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5KTogQWRkIG5ldyBmaWVsZAotCSJtb3ZtX3N0YWNrX3NpemUiLgotCShtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogSW5jbHVkZSBzdGFjayBzcGFjZSBmb3IgcmVnaXN0ZXIgc2F2ZXMKLQlpbiB0aGUgaW1tOCBmaWVsZCBvZiBhICJjYWxsIiBpbnN0cnVjdGlvbi4KLQkoY29tcHV0ZV9mdW5jdGlvbl9pbmZvKTogRGV0ZXJtaW5lIGhvdyBtdWNoIHN0YWNrIGlzIGFsbG9jYXRlZCBieQotCXRoZSBtb3ZtIGluc3RydWN0aW9uLiAgRml4IHR5cG8uCi0JKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG1vdm1fc3RhY2tfc2l6ZS4KLQotTW9uIE5vdiAxMCAxNDozMjo0MCAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IERvbid0IGNyYXNoIGlmCi0JYSB2ZXJzaW9uIGRlcGVuZGVuY3kgY291bGQgbm90IGJlIGZvdW5kLgotCi1UdWUgTm92ICA0IDEyOjA1OjU2IDE5OTcgIEtsYXVzIEsiYW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWd1cmUuY29tOiBHZXQgdmVyc2lvbiBpbmZvIGZyb20gY29uZmlndXJlLmluCi0KLUZyaSBPY3QgMjQgMTE6MTU6NTggMTk5NyAgSmFrdWIgSmVsaW5layAgPGpqQHN1bnNpdGUubWZmLmN1bmkuY3o+Ci0KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOgotCU5ldyBmdW5jdGlvbi4gQXZvaWQgbWl4aW5nIFVTMSBhbmQgSEFMIFIxIGNvZGUuCi0JU2V0IHJlc3VsdGluZyBtZW1vcnkgb3JkZXJpbmcgdG8gdGhlIHN0cm9uZ2VzdCBvbmUgdXNlZC4KLQkoc3BhcmM2NF9lbGZfb2JqZWN0X3ApOiBTZXQgYmZkX21hY2ggY29ycmVjdGx5LgotCi1UaHUgT2N0IDIzIDE0OjA5OjMzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlKTogQWRkIFVBNjQgJiBVQTE2LgotCShzcGFyYzY0X2VsZl9jaGVja19yZWxvY3MpOiBIYW5kbGUgdGhlbS4KLQkoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLiAgQmVmb3JlIGVtaXR0aW5nIGEgZHluIHJlbG9jLAotCWNoZWNrIGFsaWdubWVudCBhbmQgdHJhbnNtdXRlIFJfU1BBUkNfeDwtPlJfU1BBUkNfVUF4LgotCi1UaHUgT2N0IDIzIDAwOjUzOjE0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGRvdC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjKi0qLWxpbnV4Kik6IFVzZSB0cmFkLWNvcmUgYW5kIC4uLgotCSogaG9zdHMvc3BhcmNsaW51eC5oOiBOZXcgZmlsZS4KLQotVGh1IE9jdCAyMyAwMDoyNToyOSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBkb3QuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoc3BhcmM2NC0qLWxpbnV4Kik6IE5ldyB0YXJnZXQuCi0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgcGx0X2FsaWdubWVudCBtZW1iZXIuCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IFNldCAuZ290IGFsaWdubWVudCBiYXNlZAotCW9uIGFyY2hfc2l6ZS4KLQkoX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZSBmb3IgLnJlbCogc2VjdGlvbnMuCi0JU2V0IC5wbHQgYWxpZ25tZW50IGZyb20gbmV3IHBsdF9hbGlnbm1lbnQuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IHZlcnNpb24gc2VjdGlvbgotCWFsaWdubWVudCB0byBMT0dfRklMRV9BTElHTi4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50KTogUHJvdmlkZSBkZWZhdWx0LgotCShlbGZYWF9iZWQpOiBJbml0IHBsdF9hbGlnbm1lbnQuCi0KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX2NoZWNrX3JlbG9jcywKLQlzcGFyYzY0X2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wsIHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucywKLQlzcGFyYzY0X2VsZl9hZGp1c3RfZHluaW5keCwgc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sLAotCXNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9ucy4KLQkoc3BhcmM2NF9lbGZfaG93dG9fdGFibGUpOiBGaXggYSBmZXcgbmFtZSBzdHJpbmdzLgotCShFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUik6IE5ldyBkZWZpbml0aW9uLgotCShzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHNoYXJlZCBsaWJyYXJpZXMuCi0KLQkqIGVsZjY0LXNwYXJjLmMgKHN0cnVjdCBwbHRfdGVtcGxhdGUsIHBsdF8qX2hlYWRlciwgcGx0XypfZW50cnksCi0Jc3BhcmM2NF9lbGZfYnVpbGRfcGx0X2VudHJ5LCBzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOgotCVBMVCBkZWZpbml0aW9ucyBzcGFyYzY0LWxpbnV4IG9yaWdpbmFsbHkgY2hvb3NlLiAgVGhlc2Ugd2lsbCBnbwotCWF3YXkgc29vbiBpbiBmYXZvdXIgb2YgdGhlIG9mZmljaWFsIGFiaSBkZWZpbml0aW9ucy4KLQotV2VkIE9jdCAyMiAxNjowODo0NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoY29mZl9zbWFsbF9vYmplY3RfcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfc21hbGxfbmV3X3NlY3Rpb25faG9vayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9jb2ZmX3NtYWxsX3N3YXBfdGFibGUpOiBOZXcgc3RhdGljIGNvbnN0IHN0cnVjdHVyZS4KLQkoY29mZl9zbWFsbF9jbG9zZV9hbmRfY2xlYW51cCk6IERlZmluZS4KLQkoY29mZl9zbWFsbF9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IERlZmluZS4KLQkoY29mZl9zbWFsbF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZS4KLQkoY29mZl9zbWFsbF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpOiBEZWZpbmUuCi0JKHNoY29mZl9zbWFsbF92ZWMpOiBOZXcgc3RhdGljIHN0cnVjdHVyZS4KLQkoc2hsY29mZl9zbWFsbF92ZWMpOiBOZXcgc3RhdGljIHN0cnVjdHVyZS4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgc2hjb2ZmX3NtYWxsX3ZlYyBhbmQKLQlzaGxjb2ZmX3NtYWxsX3ZlYy4KLQkqIGNvbmZpZy5iZmQgKHNoLSotZWxmKik6IEFkZCBzaGNvZmZfc21hbGxfdmVjIGFuZAotCXNobGNvZmZfc21hbGxfdmVjIHRvIHRhcmdfc2VsdmVjcy4KLQkoc2gtKi0qKTogTGlrZXdpc2UuCi0JKiBjb25maWd1cmUuaW46IEFkZCBzaGNvZmZfc21hbGxfdmVjIGFuZCBzaGxjb2ZmX3NtYWxsX3ZlYyBjYXNlcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIE9jdCAyMCAxNTowMToyNyAxOTk3ICBLbGF1cyBLImFtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogZXZheC1lZ3NkLmM6IFdlYWsgc3ltYm9scyBhcmUgZ2xvYmFsLgotCi0JKiBldmF4LWVtaC5jOiBVc2UgcHJvcGVyIGNhc3RzLgotCi0JKiBldmF4LWVnc2QuYyAoX2JmZF9ldmF4X3dyaXRlX2Vnc2QpOiBSZW1vdmUgdW5uZWVkZWQgdW5hbWUuCi0KLQkqIGV2YXgtZWdzZC5jOiBTZWN0aW9uIG5hbWVzIGFuZCBzeW1ib2xzIGhhdmUgZGlmZmVyZW50Ci0JbGVuZ3RoIHJlc3RyaWN0aW9ucy4gQWRkIGxlbmd0aCBwYXJhbWV0ZXIgdG8KLQlfYmZkX2V2YXhfbGVuZ3RoX2hhc2hfc3ltYm9sLgotCSogZXZheC1ldGlyLmM6IExpa2V3aXNlLgotCSogZXZheC1taXNjLmMgKF9iZmRfZXZheF9sZW5ndGhfaGFzaF9zeW1ib2wpOiBBZGQgbGVuZ3RoCi0JcGFyYW1ldGVyLgotCSogZXZheC5oIChFT0JKX1NfQ19TRUNTSVopOiBEZWZpbmUuCi0KLQkqIGV2YXgtYWxwaGEuYzogUmVtb3ZlIGR1cGxpY2F0ZSB0ZXN0LgotCi0JKiBldmF4LWVtaC5jOiBTWVMkIGZ1bmN0aW9ucyBhcmUgdXBwZXItY2FzZS4KLQotCSogZXZheC1lZ3NkLmM6IENyZWF0ZSBzZXBhcmF0ZSBzZWN0aW9ucyBmb3IgY29tbW9uIHN5bWJvbHMuCi0JKiBldmF4LWV0aXIuYzogRG9uJ3Qgb3V0cHV0IGNvbW1vbiBzZWN0aW9uLgotCSogZXZheC5oOiBCdW1wIHVwIHNlY3Rpb24gY291bnQuCi0KLQkqIGNvbmZpZ3VyZS5jb206IFVzZSA2NGJpdCBpbnRlZ2VycyB3aXRoIERFQyBDLgotCi0JKiBldmF4LWVnc2QuYzogTWFrZSBzZWN0aW9uIGZsYWdzIGRlYyBjIGNvbXBhdGlibGUuCi0KLU1vbiBPY3QgMjAgMDk6Mzg6MzEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAobm9ybWFsaXplKTogRGVsZXRlIGZ1bmN0aW9uLgotCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IE5ldyBwYXJhbWV0ZXIgZWxlbmd0aC4gIEFsbCBjYWxsZXJzCi0JY2hhbmdlZC4gIFVzZSBwYXNzZWQgaW4gZWxlbmd0aCB0byBkZXRlcm1pbmUgc2l6ZSBvZiB0aGUgZXh0ZW5kZWQKLQluYW1lIHRhYmxlIGluc3RlYWQgb2YgY29tcHV0aW5nIGl0IGFnYWluLgotCi1TdW4gT2N0IDE5IDIzOjM2OjIxIDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFVzZSB8PSBub3QgPSB0byBzZXQKLQlJTUFHRV9TQ05fTUVNX1JFQUQgZm9yIGFuIHVucmVjb2duaXplZCBzZWN0aW9uLgotCi1TdW4gT2N0IDE5IDIxOjA0OjU2IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogQWNjb3VudCBmb3IgdHJhaWxpbmcKLQknLycgaW4gdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUuCi0KLUZyaSBPY3QgMTcgMDA6MDQ6MTMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBGb3IgZXhwbGljaXRseSB2ZXJzaW9uZWQKLQlzeW1ib2xzLCBjaGVjayBnbG9iYWxzIGxpc3QgYmVmb3JlIG1hdGNoaW5nIG9uIGxvY2Fscy4KLQotVGh1IE9jdCAxNiAwODoxNzowNiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCxwZV9wcmludF9pZGF0YSk6IEZpeCBtYW5nbGVkCi0JcGF0Y2guCi0KLVdlZCBPY3QgMTUgMTM6NDU6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX21rb2JqZWN0X2hvb2spOiBTZXQgRExMIGZsYWcuCi0JKHBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDb3B5IERMTCBmbGFnLgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogU2V0IElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUKLQlmb3IgLnN0YWIqIHNlY3Rpb25zLiAgUmVwbGFjZSBzdHJsZW4gb2YgY29uc3RhbnQgc3RyaW5ncyB3aXRoCi0JbnVtYmVyLgotCi1UdWUgT2N0IDE0IDE1OjQyOjQ1IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX21lcmdlX2luZF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uIHRvCi0JbWVyZ2UgZ290IGFuZCByZWxvYyBlbnRyaWVzIGZyb20gaW5kIHN5bXMgdG8gdGhlaXIgdGFyZ2V0LgotCShlbGY2NF9hbHBoYV9hbHdheXNfc2l6ZV9zZWN0aW9ucyk6IENhbGwgaXQuCi0JKGVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcyk6IE9wZXJhdGUgb24gdGhlIHRhcmdldCBvZiBpbmRpcmVjdCBzeW1ib2xzLgotCShlbGY2NF9hbHBoYV9jYW5fbWVyZ2VfZ290cyk6IExpa2V3aXNlLgotCShlbGY2NF9hbHBoYV9tZXJnZV9nb3RzKTogTGlrZXdpc2UuCi0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBCYWNrIG91dCBISidzIGNoYW5nZSwKLQlhcyBpdCBpcyBpbnN1ZmZpY2llbnQgdG8gaGFuZGxlIHRoZSByZWxvY2F0aW9uIGNoYW5nZXMgYXMgd2VsbC4KLQotTW9uIE9jdCAxMyAyMzoxMDowOCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9jYWxjX2R5bnJlbF9zaXplcyk6IEFsbG93IGZvciBSRUxBVElWRQotCXJlbG9jcyBmb3Igc3ltYm9scyBpbiBzaGxpYnMgdGhhdCBoYXZlIGJlZW4gZm9yY2VkIGxvY2FsLgotCShlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogT3V0cHV0IFJFTEFUSVZFcyBpbiAuZ290IGZvciBzYW1lLgotCi1Nb24gT2N0IDEzIDIxOjI0OjA0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBVc2UgdGhlCi0JZ290X2VudGllcyBvZiB0aGUgZGVmYXVsdCBzeW1ib2wgZm9yIHRoZSBkZWZhdWx0IHZlcnNpb25lZAotCXN5bWJvbC4gIFBhdGNoIGZyb20gaGpsQGdudS5haS5taXQuZWR1LCBtb2RpZmllZCBub3QgdG8gdXNlCi0JYWxsb2NhIGluIHRoZSBsb29wLgotCi1Nb24gT2N0IDEzIDE3OjM3OjM3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IE9ubHkgdXNlIHRoZSBib3R0b20KLQkyNCBiaXRzIG9mIHRoZSBQQyB3aGVuIGNvbXB1dGluZyBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uCi0KLUZyaSBPY3QgMTAgMTY6MDE6MzAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvYywgdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6Ci0JQ29ycmVjdCB2YWx1ZSBmb3IgbWF4aW11bSBwb3NpdGl2ZSAyMiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4KLQkodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6ICBQcmV2ZW50IG92ZXJmbG93IGZyb20gSEkxNl9TIGFuZAotCUhJXzE2IHJlbG9jYXRpb25zLiAgQ29ycmVjdCBiaXQgYWRqdXN0bWVudCBpbiBUREEgb2Zmc2V0cy4KLQotVGh1IE9jdCAgOSAxNjo0MzozOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyY19lbGZfe2hpeDIyLGxveDEwfV9yZWxvYyk6IE5ldyBmdW5jdGlvbnMuCi0JKHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlKTogVXNlIHRoZW0gZm9yIEhJWDIyLExPWDEwIHJlbG9jcy4KLQotV2VkIE9jdCAgOCAxMTozODo0NSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGZjb3JlLmggKGJmZF9wcnN0YXR1cyk6IFBlZGFudGljbHksIGFsaWdubWVudF9wb3dlciBzaG91bGQKLQliZSBMT0dfRklMRV9BTElHTi4KLQotV2VkIE9jdCAgOCAxMTozNjowMCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBNaXNzZWQgb25lIGFscGhhKiBjaGFuZ2UuCi0KLVR1ZSBPY3QgIDcgMTM6MDA6MTcgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUpOiBSZW1vdmUgQkZENjQgc3VwcG9ydC4KLQkqIGVsZjY0LXNwYXJjLmMgKFNQQVJDNjRfT0xEX1JFTE9DUyk6IFVuZGVmLgotCShNSU5VU19PTkUpOiBOZXcgbWFjcm8uCi0JKHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlKTogQWRkIGVudHJpZXMgZm9yIERJU1A2NCxQTFQ2NCxISVgyMixMT1gxMCwKLQlINDQsTTQ0LEw0NCxSRUdJU1RFUi4KLQkoc3BhcmNfcmVsb2NfbWFwKTogTGlrZXdpc2UuICBNYXAgQkZEX1JFTE9DX0NUT1IgdG8gUl9TUEFSQ182NC4KLQkoaW5pdF9pbnNuX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYyk6IFVzZSBpdC4KLQkoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEFkZCBlbnRyaWVzIGZvciBPTE8xMCxISVgyMixMT1gxMC4KLQotVHVlIE9jdCAgNyAxMTo0MDozNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNvbS5jIChzb21fY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBSZW1vdmUgc3RhdGljCi0JZnVuY3Rpb24sIGFuZCBkZWZpbmUgYXMgbWFjcm8gaW5zdGVhZC4KLQotRnJpIE9jdCAgMyAxNDowMjoxNyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBDaGFuZ2UgYWxwaGEtKi0qIHRvIGFscGhhKi0qLSo7IGNvbmZpZy5ndWVzcyBub3cKLQlyZWNvZ25pemVzIGFscGhhZXY1IGV0Yy4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBMaWtld2lzZS4KLQotRnJpIE9jdCAgMyAxMToyMzo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlNYWtlIGxkIC1zIHdvcmsgb24gQUlYOgotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBjcmVhdGUgdGhlIC5kZWJ1ZwotCXNlY3Rpb24gaWYgd2UgYXJlIHN0cmlwcGluZy4KLQkoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHNldCB0aGUgLmRlYnVnIHNlY3Rpb24KLQlzaXplIGlmIHdlIGFyZSBzdHJpcHBpbmcuCi0JKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBzZXQgU0VDX1JFTE9DIG9yIHJlbF9maWxlcG9zLAotCWFuZCBkb24ndCB3cml0ZSBvdXQgcmVsb2NzLCBpZiB3ZSBhcmUgc3RyaXBwaW5nLgotCSh4Y29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IHNldCB1cCByZWxvYyBpZiB3ZSBhcmUgc3RyaXBwaW5nLgotCSh4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sKTogRG9uJ3Qgd3JpdGUgb3V0IHN5bWJvbCBvciByZWxvYyBpZiB3ZQotCWFyZSBzdHJpcHBpbmcuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgaW5jbHVkZSBlbGYubG8gYWdhaW4gZm9yIEVMRiB0YXJnZXRzOyBpdCdzCi0JYWx3YXlzIGluIHRoZSBsaWJyYXJ5IGFueWhvdy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiBlbGYzMi1zcGFyYy5jIChzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYyk6IENhc3QgdG8gYmZkX2J5dGUgKiwgbm90Ci0JY2hhciAqLCB3aGVuIGNhbGxpbmcgYmZkX2dldF8zMiBhbmQgYmZkX3B1dF8zMi4KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBDYXN0IGNvbnRlbnRzIHRvIGNoYXIgKgotCXdoZW4gY2FsbGluZyBzdHJjcHkuCi0KLVRodSBPY3QgIDIgMTY6MTU6NTAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX2NoZWNrX292ZXJmbG93KTogTmV3IGZ1bmN0aW9uLgotCShiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogVXNlIGl0LgotCShCRkRfUkVMT0NfU1BBUkNfe0RJU1A2NCxQTFQ2NH0pOiBOZXcgcmVsb2NzLgotCShCRkRfUkVMT0NfU1BBUkNfe0hJWDIyLExPWDEwLEg0NCxNNDQsTDQ0LFJFR0lTVEVSfSk6IE5ldyByZWxvY3MuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZS4KLQotVGh1IE9jdCAgMiAxMzoxNzoxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBTZXQgSU1BR0VfU0NOX01FTV9SRUFEIGZvciBhbgotCXVucmVjb2duaXplZCBzZWN0aW9uLiAgRnJvbSBKb24gVGhhY2tyYXkgPGpvbnRAaGFybGVxdWluLmNvLnVrPi4KLQotV2VkIE9jdCAgMSAxNDowMzo0NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtICgkKEJGRF9IKSk6IENoYW5nZSBzdG1wLWJmZC5oIHRvIHN0bXAtYmZkLWguCi0gCShzdG1wLWJmZC1oKTogUmVuYW1lIGZyb20gc3RtcC1iZmQuaC4KLSAJKEJGRF9IX0ZJTEVTLCBMSUJCRkRfSF9GSUxFUywgTElCQ09GRl9IX0ZJTEVTKTogTmV3IHZhcmlhYmxlcy4KLQkoJChzcmNkaXIpL2JmZC1pbjIuaCk6IEp1c3QgZGVwZW5kIHVwb24gc3RtcC1iaW4yLWguCi0JKHN0bXAtYmluMi1oKTogTmV3IHRhcmdldC4KLQkoJChzcmNkaXIpL2xpYmJmZC5oKTogSnVzdCBkZXBlbmQgdXBvbiBzdG1wLWxiZmQtaC4KLQkoc3RtcC1sYmZkLWgpOiBOZXcgdGFyZ2V0LgotCSgkKHNyY2RpcikvbGliY29mZi5oKTogSnVzdCBkZXBlbmQgdXBvbiBzdG1wLWxjb2ZmLWguCi0JKHN0bXAtbGNvZmYtaCk6IE5ldyB0YXJnZXQuCi0JKENMRUFORklMRVMpOiBDaGFuZ2Ugc3RtcC1iZmQuaCB0byBzdG1wLWJmZC1oLiAgQWRkIHN0bXAtYmluMi5oLAotCXN0bXAtbGJmZC1oLCBhbmQgc3RtcC1sY29mZi1oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGEgZGl2ZXJzaW9uIHRvIHNldCBlbmFibGVfc2hhcmVkIGJlZm9yZSB0aGUKLQlhcmd1bWVudHMgYXJlIHBhcnNlZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIFNlcCAzMCAxNDoxODozMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSk6IFJfU1BBUkNfR0xPQl9KTVAKLQlyZW5hbWVkIHRvIFJfU1BBUkNfVU5VU0VEXzQyLgotCShzcGFyY19yZWxvY19tYXApOiBEZWxldGUgUl9TUEFSQ19HTE9CX0pNUCBlbnRyeS4KLQkqIGVsZjY0LXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlKTogUl9TUEFSQ19HTE9CX0pNUAotCXJlbmFtZWQgdG8gUl9TUEFSQ19VTlVTRURfNDIuCi0JKHNwYXJjX3JlbG9jX21hcCk6IERlbGV0ZSBSX1NQQVJDX0dMT0JfSk1QIGVudHJ5LgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX1NQQVJDX0dMT0JfSk1QKTogRGVsZXRlLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQotVGh1IFNlcCAyNSAxMjoxNTowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IERvbid0IGNoZWNrIHRoZSBoYXNoIGNyZWF0b3IgdW50aWwKLQlhZnRlciB3ZSBoYXZlIHNldCAqc3ltX2hhc2guCi0KLVdlZCBTZXAgMjQgMTY6NTI6MjggMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWcuYmZkIChzaCotKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIHNoLSotKmVsZiouCi0KLVdlZCBTZXAgMjQgMTE6Mjc6MjMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGliYmZkX2FfU09VUkNFUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ0hFQ0tfVE9PTCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLgotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgU2VwIDIzIDE5OjAzOjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IEV2ZW4gaWYgd2UgYXJlIG5vdCBkZW1hbmQKLQlwYWdlZCwgZG9uJ3QgcHV0IGEgbG9hZGFibGUgc2VjdGlvbiBhZnRlciBhIG5vbmxvYWRhYmxlIHNlY3Rpb24uCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBJbmNyZW1lbnQgdGhlIGZpbGUgb2Zmc2V0Ci0JZm9yIGEgc2VjdGlvbiB3aXRoIGNvbnRlbnRzLCBldmVuIGlmIGl0IGlzIG5vdCBsb2FkYWJsZS4KLQotU3VuIFNlcCAyMSAxMTowMzoyNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBBZGQgcmV0dXJuIGNvZGUKLQlpbmRpY2F0aW5nIHRoYXQgX19jdGJwIGNvdWxkIG5vdCBiZSBmb3VuZC4KLQotVGh1IFNlcCAxOCAxNTowNDo1NyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2NoZWNrX3JlbG9jcyk6IEltcHJvdmUgZXJyb3IgbWVzc2FnZS4KLQotV2VkIFNlcCAxNyAwOTo1NDo1MSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUsIHY4NTBfZWxmX3JlbG9jLAotCXY4NTBfZWxmX2NoZWNrX3JlbG9jcywgdjg1MF9lbGZfcmVsb2NfbWFwLCB2ODUwX2VsZl9ob3d0b190YWJsZSk6Ci0JQWRkIHN1cHBvcnQgZm9yIHRoZSBDQUxMVCByZWxvY3MuCi0KLQkqIHJlbG9jLmMgKENPTU1FTlQpOiBBZGQgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCBhbmQKLQlCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQuCi0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IEFkZCBjaGVja3MgdG8gY2F0Y2gKLQlyZWxvY2F0aW9ucyBhZ2FpbnN0IG5vbi1leGlzdGFudCBzeW1ib2xzLgotCi1UdWUgU2VwIDE2IDE0OjIwOjI3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmM6IEFkZCBCRlJfUkVMT0NfVjg1MF9UREFfMTZfMTZfT0ZGU0VULgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jLCB2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlLAotCXY4NTBfZWxmX2hvd3RvX3RhYmxlLCB2ODUwX2VsZl9yZWxvY19tYXApOiBBZGQgc3VwcG9ydCBmb3IgYSAxNgotCWJpdCByZWxvYyBpbiB0aGUgdGlueSBkYXRhIGFyZWEuCi0KLU1vbiBTZXAgMTUgMTE6Mjc6MzYgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNZXJnZWQgY2hhbmdlcyBmcm9tIE1hcnRpbiBIdW50OgotCi0JKiBlbGYzMi1kMzB2LmMgKGJmZF9lbGZfZDMwdl9yZWxvYyk6IENoYW5nZSBwYy1yZWxhdGl2ZSByZWxvY3MKLQlvdmVyIDJeMzIgYnl0ZXMgdG8gYmUgYWJzb2x1dGUuICBOZWVkZWQgYmVjYXVzZSBEMzBWIFBDIGRvZXNuJ3QKLQluZWNlc3NhcmlseSB3cmFwLgotCi0JKiByZWxvYy5jLCBlbGYzMi1kMzB2LmMgKEJGRF9SRUxPQ19EMzBWXzlfUENSRUwsCi0JQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTF9SKTogTmV3IHJlbG9jcy4KLQotCSogZWxmMzItZDMwdi5jIChiZmRfZWxmX2QzMHZfcmVsb2NfMjEpOiBOZXcgZnVuY3Rpb24uCi0JRG8gMTUgYW5kIDIxIGJpdCBwYy1yZWxhdGl2ZSByZWxvY2F0aW9ucy4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMX1IsIEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMX1IpOgotCU5ldyByZWxvY2F0aW9ucy4KLQotCSogZWxmMzItZDMwdi5jIChiZmRfZWxmX2QzMHZfcmVsb2MpOiBBZGRlbmQgbmVlZHMgdG8gYmUKLQlhZGRlZCB0byB0aGUgcmVsb2NhdGlvbiwgbm90IG9yJ2QuCi0KLVdlZCBTZXAgMTAgMTU6MTc6MjUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvYyk6IFJlbW92ZSBzcHVyaW91cyBlcnJvciBtZXNzYWdlLgotCi1XZWQgU2VwIDEwIDExOjE3OjUwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfc2Nhbik6IFVzZSBzdHJjYXNlY21wLgotCShiZmRfZGVmYXVsdF9zY2FuKTogVGVzdCBmb3IgbWF0Y2ggd2l0aCBhcmNoX25hbWUgKyAiOiIgKwotIAlwcmludGFibGVfbmFtZS4KLQkoYmZkX2RlZmF1bHRfc2Nhbik6IFRlc3QgZm9yIG1hdGNoIHdpdGggcHJpbnRhYmxlX25hbWUgLSAiOiIuCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBEZWxldGUgdzY1LCBoODMwMCwgaDg1MDAsIHo4aywgaTk2MCBzcGVjaWFsCi0gCWNhc2VzLiAgRWFjaCBpbXBsZW1lbnRzIHRoZWlyIG93biBzY2FuIGZ1bmN0aW9uLgotCShiZmRfZGVmYXVsdF9zY2FuKTogRGVsZXRlIDM4NiwgMjkwMCwgODYwLCBtaXBzIDIwMDAsIG1pcHMgNDQwMAotIAlzcGVjaWFsIGNhc2VzLiAgU2luY2UgaW5mby0+bWFjaCA9PSAwLiAgVGhlIHRlc3QgbWFjaCA9PSBudW1iZXIKLSAJZmFpbHMuCi0JKGJmZF9hcmNoX2xpc3QpOiBOZXcgZnVuY3Rpb24sIHJldHVybiBuYW1lIG9mIGFsbCB0aGUgc3VwcG9ydGVkCi0gCWFyY2hpdGVjdHVyZXMuCi0KLVR1ZSBTZXAgIDkgMTA6MjE6NTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQnJlYWsgYWZ0ZXIKLQlkZWNvZGluZyBhcmNoaXRlY3R1cmUuCi0JKHY4NTBfZWxmX3JlbG9jKTogRG8gbm90IGNvbXBsYWluIGlmIGEgUl9WODUwX0xPMTYgcmVsb2MgaGFzIGJpdAotCTE1IHNldC4KLQotU3VuIFNlcCAgNyAxMjoyNToyMiAxOTk3ICBILkouIEx1ICAoaGpsQGdudS5haS5taXQuZWR1KQotCi0JKiBiZmQvZWxmNjQtYWxwaGEuYyAocmVsb2NfaG93dG9fdHlwZSk6IEZpeCB0aGUgaG93dG8gdGFibGUuCi0KLVRodSBTZXAgIDQgMDk6NDQ6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGNwdS12ODUwLmMuCi0JKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgZWxmMzItdjg1MC5jLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIHJlbG9jLmM6IFJlbW92ZSBleHRyYW5lb3VzIGNvbW1hcyBmcm9tIHJlbG9jYXRpb24gZW50cmllcy4KLQlSZW1vdmUgQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogUHV0IFhUWV9DTS9YTUNfVEQgc3ltYm9scwotCWluIHNlY3Rpb25zIG5hbWVkIC50b2Nic3MgcmF0aGVyIHRoYW4gLmJzcy4KLQotV2VkIFNlcCAgMyAxMToyMzoyMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsaWJiZmQuaCwgYmZkLWluMi5oLCBlbGYzMi12ODUwLmM6IFJlbW92ZWQKLQlCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTC4KLQotVHVlIFNlcCAgMiAyMDo0NDoxMCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBIYW5kbGUgQ19TWVNURU0gc3ltcwotCXRoZSBzYW1lIGFzIENfRVhUIHN5bXMuCi0JKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IERpdHRvLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBEaXR0by4KLQkoX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscyk6IEFkZCBzYXZlX2dsb2JhbF90b19zdGF0aWMuICBVc2UKLQlpdCB0byBwcmVzZXJ2ZSBhbmQgcmVzdG9yZSBzdGF0ZSBvZiBnbG9iYWxfdG9fc3RhdGljIGZsYWcuCi0KLVR1ZSBTZXAgIDIgMTc6NDU6MjIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9vYmplY3RfcCk6IFNldCBtYWNoaW5lIG51bWJlciBiYXNlZCBvbgotCWJpdHMgaW4gZV9mbGFncyBmaWVsZCByYXRoZXIgdGhhbiBtYWdpYyBudW1iZXJzLgotCSh2ODUwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nLCB2ODUwX2VsZl9zZXRfcHJpdmF0ZV9mbGFncywKLQl2ODUwX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEsIHY4NTBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsCi0Jdjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBmdW5jdGlvbnMuCi0KLVR1ZSBTZXAgIDIgMTc6NDM6NDkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IFJlbW92ZSBWODUwRSBtYWdpYyBudW1iZXIuCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogUmVtb3ZlIFY4NTBFQSBtYWdpYyBudW1iZXIuCi0KLVR1ZSBTZXAgIDIgMTc6MzU6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY3B1LWFyYy5jIChhcmNfZ2V0X21hY2gpOiBQcm9wZXJseSBzY2FuIGRlZmluZWQgbWFjaCBlbnRyaWVzLgotCi1UdWUgU2VwICAyIDE4OjI5OjM3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLW0xMDIwMC5jIChtbjEwMjAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogUEMgcmVsYXRpdmUKLQlpbnN0cnVjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uLCBub3QgdGhlCi0JY3VycmVudCBpbnN0cnVjdGlvbi4KLQkobW4xMDIwMF9lbGZfcmVsYXhfc2VjdGlvbik6IFNpbWlsYXJseS4KLQotVHVlIFNlcCAgMiAxNTo0NTo0NSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtdjg1MC5jOiBVc2UgYSBtYWNybyB0byBjb25zdHJ1Y3QgYmZkX2FyY2hfaW5mb190eXBlCi0JZW50cmllcy4KLQotCSogcmVsb2MuYywgbGliYmZkLmgsIGJmZC1pbjIuaCwgZWxmMzItdjg1MC5jOiBSZXBsYWNlCi0JQkZEX1JFTE9DX1Y4NTBfe1NEQS9UREEvWkRBfV9PRkZTRVQgcmVsb2NzIHdpdGggbmV3IGJpdCBwYXR0ZXJuCi0Jc3BlY2lmaWMgdmVyc2lvbnM6IEJGRF9SRUxPQ19WODUwX3thcmVhfV97Yml0c31fT0ZGU0VULgotCi1UaHUgQXVnIDI4IDE3OjAxOjA5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY3B1LXY4NTAuYzogUmVtb3ZlICJwbGFpbiIgZnJvbSB2ODUwIHByaW50YWJsZSBuYW1lLgotCShzY2FuKTogVXNlIHN0cmNhc2VjbXAuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3Y4NTApOiBEZWZpbmUuCi0KLQkqIGNwdS1zaC5jIChzY2FuX21hY2gpOiBDb21wYXJlIHdpdGggdGFibGUgaW5zdGVhZCBvZiBoYXJkd2lyZWQgdG8KLSAJanVzdCBzaC9TSCwgdXNlIHN0cmNhc2VjbXAuCi0JKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgZW50cmllcyBmb3Igc2gzIGV0LmFsLgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9zaCwgLi4uKTogRGVmaW5lLgotCi1XZWQgQXVnIDI3IDE3OjMzOjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX2FyY2h1cmVzX2xpc3QpOiBBbHdheXMgTlVMTCB0ZXJtaW5hdGUgdGhlIGxpc3QuCi0KLVR1ZSBBdWcgMjYgMTc6MjY6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgY3B1LWFyYy5jLgotCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGVsZjMyLWFyYy5jLgotCShlbGYzMi1hcmMubG8pOiBSZW1vdmUgZXhwbGljaXQgZGVwZW5kZW5jeS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBhY2luY2x1ZGUubTQgKEJGRF9DQ19GT1JfQlVJTEQpOiBTZXQgRVhFRVhUX0ZPUl9CVUlMRC4KLQkqIGRvYy9NYWtlZmlsZS5hbSAoTUtET0MpOiBVc2UgRVhFRVhUX0ZPUl9CVUlMRCwgbm90IEVYRUVYVC4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEF1ZyAyNSAxNjoxNDozNCAxOTk3ICBDaHJpc3RvcGhlciBQcm92ZW56YW5vICA8cHJvdmVuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGxhdGVzdCBkZXZvIGF1dG9jb25mIGZvciBOVCBzdXBwb3J0Ci0KLU1vbiBBdWcgMjUgMTY6MTE6MDQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LWFybS5jIChjb21wYXRpYmxlKTogSWYgQiBpcyBhIGRlZmF1bHQgdHlwZSwgcmV0dXJuIEEuCi0KLU1vbiBBdWcgMjUgMTU6MzU6NDYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LXY4NTAuYyAoc2Nhbik6IE5ldyBmdW5jdGlvbi4KLQkoYXJjaF9pbmZvX3N0cnVjdCk6IE5ldyBzdHJ1Y3R1cmUuCi0JKGJmZF92ODUwX2FyY2gpOiBBZGQgbGluayBpbnRvIGFyY2hfaW5mb19zdHJ1Y3R1cmUuCi0KLQkqIGNvbmZpZy5iZmQgKHRhcmdfY3B1KTogQWxsIHY4NTAgdmFyaWFudHMgdXNlIHRoZSBiZmRfYXJjaF92ODUwCi0JYXJjaGl0ZWN0dXJlLgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX29iamVjdF9wKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF92ODUwZSk6IE1hY2hpbmUgdmFsdWUgZm9yIHY4NTBlLgotCi0JKiBiZmQtaW4yLmggKGJmZF9tYWNoX3Y4NTBlKTogTWFjaGluZSB2YWx1ZSBmb3Igdjg1MGUuCi0KLQkqIGVsZjMyLXY4NTAuYyAoRUxGX01BQ0hJTkVfQ09ERSk6IERlZmF1bHQgdG8gdjg1MGUgbWFjaGluZQotCW51bWJlci4KLQotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSBtYWNoaW5lIG51bWJlci4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfdjg1MGVhKTogTWFjaGluZSB2YWx1ZSBmb3Igdjg1MGVhLgotCi0JKiBiZmQtaW4yLmggKGJmZF9tYWNoX3Y4NTBlYSk6IE1hY2hpbmUgdmFsdWUgZm9yIHY4NTBlYS4KLQotCSogZWxmMzItdjg1MC5jIChFTEZfTUFDSElORV9DT0RFKTogRGVmYXVsdCB0byB2ODUwZWEgbWFjaGluZQotCW51bWJlci4KLQotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgbWFjaGluZSBudW1iZXIuCi0KLU1vbiBBdWcgMjUgMTQ6MDc6MzMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1zLmMgKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2xlYXIgdGhlCi0gCWNhY2hlZF9zdGFiIGZpZWxkIGlmIHRoZSBvZmZzZXQgcHJldmVudHMgdXMgZnJvbSB1c2luZyB0aGUgY2FjaGUuCi0KLU1vbiBBdWcgMjUgMTI6MDg6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0LXRhcmdldC5oIChNWSh2ZWMpKTogQWRkIFNFQ19DT0RFIGFuZCBTRUNfREFUQSB0byBzZWN0aW9uCi0JZmxhZ3MuCi0JKiBhb3V0LWFybS5jIChhb3V0X2FybV9saXR0bGVfdmVjKTogTGlrZXdpc2UuCi0JKGFvdXRfYXJtX2JpZ192ZWMpOiBMaWtld2lzZS4KLQkqIGJvdXQuYyAoYl9vdXRfdmVjX2JpZ19ob3N0KTogTGlrZXdpc2UuCi0JKGJfb3V0X3ZlY19saXR0bGVfaG9zdCk6IExpa2V3aXNlLgotCSogbWlwc2JzZC5jIChhb3V0X21pcHNfbGl0dGxlX3ZlYyk6IExpa2V3aXNlLgotCShhb3V0X21pcHNfYmlnX3ZlYyk6IExpa2V3aXNlLgotCi1UdWUgQXVnIDE5IDEwOjA5OjEwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKENPRkZfQUxJR05fSU5fU0ZMQUdTKTogRGVmaW5lIHRvIDEuCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IElnbm9yZSBpbmNvbWluZyBTVFlQX0lORk8KLQliaXQgaW4gc19mbGFncyBpZiBDT0ZGX0FMSUdOX0lOX1NfRkxBR1MgaXMgZGVmaW5lZC4KLQotVHVlIEF1ZyAxOSAwODo0NzoxNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi1pOTYwLmMgKENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIpOiBEZWZpbmUgdG8gMS4KLQkoR0VUX1NDTkhEUl9BTElHTiwgUFVUX1NDTkhEUl9BTElHTik6IERlZmluZS4KLQkqIGNvZmYtbTg4ay5jIChHRVRfU0NOSERSX05SRUxPQywgR0VUX1NDTkhEUl9OTE5OTyk6IERlZmluZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogQ29uZGl0aW9uYWxseSBjb21waWxlIGluIGlmCi0JQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUiBpcyBkZWZpbmVkLiAgQ29udmVydCBhbGlnbm1lbnQgdG8gcG93ZXIKLQlvZiB0d28gZm9yIEk5NjAgb25seS4KLQkqIGNvZmZzd2FwLmggKEdFVF9TQ05IRFJfTlJFTE9DLCBQVVRfU0NOSERSX05SRUxPQywgR0VUX1NDTkRIUl9OTE5OTywKLQlQVVRfU0NOSERSX05MTk5PLCBHRVRfU0NOSERSX0ZMQUdTLCBQVVRfU0NOSERSX0ZMQUdTKTogUHJvdmlkZQotCWRlZmF1bHQgZGVmaW5pdGlvbnMuCi0JKGNvZmZfc3dhcF9zY25oZHJfaW4pOiBVc2UgR0VUX1NDTkhEUl9GTEFHUywgR0VUX1NDTkhEUl9OUkVMT0MsCi0JR0VUX1NDTkhEUl9OTE5OTywgYW5kIEdFVF9TQ05IRFJfQUxJR04uCi0JKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogVXNlIFBVVF9TQ05IRFJfRkxBR1MsIFBVVF9TQ05IRFJfQUxJR04uCi0JKiBNYWtlZmlsZS5pbiAoY29mZi10aWM4MC5vKTogRGVwZW5kcyB1cG9uIGNvZmZzd2FwLmguCi0JKiBjb2ZmLXRpYzgwLmMgKENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIpOiBEZWZpbmUgdG8gMS4KLQkoR0VUX1NDTkhEUl9GTEFHUywgUFVUX1NDTkhEUl9GTEFHUyk6IERlZmluZQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgYWxpZ25tZW50IGZpZWxkIGluCi0gCXNlY3Rpb24gaGVhZGVyIGZvciBUSUM4MENPRkYgZmlsZXMuCi0KLU1vbiBBdWcgMTggMTE6MzY6MTkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9ob3d0b190YWJsZSwgdjg1MF9lbGZfcmVsb2NfbWFwLAotCXY4NTBfZWxmX2NoZWNrX3JlbG9jcywgdjg1MF9lbGZfcmVsb2MsCi0Jdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6ICBBZGQgc3VwcG9ydCBmb3IKLQlCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTCByZWxvY2F0aW9uLgotCi0JKiByZWxvYy5jIChDT01NRU5UKTogQWRkIHN1dXBvcnQgZm9yIEJGRF9SRUxPQ19WODUwXzE2X1BDUkVMCi0JcmVsb2NhdGlvbi4KLQotCSogbGliYmZkLmg6IEFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTCByZWxvY2F0aW9uLgotCi0JKiBiZmQtaW4yLmg6IEFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTCByZWxvY2F0aW9uLgotCi1Nb24gQXVnIDE4IDExOjMzOjU2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwdS12ODUwZTogTmV3IGZpbGUuCi0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgotCi0JKiBiZmQtaW4yLmggKGJmZF9hcmNoaXRlY3R1cmUpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgotCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgotCi0JKiBhcmNodXJlcy5jOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgotCi1Nb24gQXVnIDE4IDExOjMzOjU2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwdS12ODUwZWE6IE5ldyBmaWxlLgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCi0KLQkqIGJmZC1pbjIuaCAoYmZkX2FyY2hpdGVjdHVyZSk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LgotCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KLQotCSogYXJjaHVyZXMuYzogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCi0KLUZyaSBBdWcgMTUgMTI6MDE6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBDb3JyZWN0bHkgaGFuZGxlIHRoZSBvZmZzZXQKLQlhcmd1bWVudCBhcyBzZWN0aW9uIHJlbGF0aXZlLCByYXRoZXIgdGhhbiBhbiBhYnNvbHV0ZSBhZGRyZXNzLgotCUZyb20gSmFuIEhvb2dlbnJhYWQgPGhvb2dlbnJkQG5hdGxhYi5yZXNlYXJjaC5waGlsaXBzLmNvbT4uCi0KLUZyaSBBdWcgMTUgMDQ6NTg6MDIgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoYXJjLSotZWxmKik6IEFkZC4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX3tsaXR0bGUsYmlnfWFyY192ZWMpOiBBZGQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5hbSAoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS1hcmMubG8uCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZjMyLWFyYy5sby4KLQkoY3B1LWFyYy5sbyxlbGYzMi1hcmMubG8pOiBBZGQgcnVsZXMgZm9yLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBhcmNodXJlcy5jIChhcmNoaXRlY3R1cmUgbGlzdCk6IEFkZCBiZmRfYXJjaF9hcmMuCi0JKGJmZF9hcmNodXJlc19saXN0KTogQWRkIGJmZF9hcmNfYXJjaC4KLQkoYmZkX21hY2hfYXJjX2Jhc2UpOiBEZWZpbmUuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfQVJDX0IyMl9QQ1JFTCxCRkRfUkVMT0NfQVJDX0IyNik6IEFkZC4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX3tsaXR0bGUsYmlnfWFyY192ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3QpOiBBZGQgdGhlbS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBjcHUtYXJjLmMsIGVsZjMyLWFyYy5jOiBOZXcgZmlsZXMuCi0JKiBlbGYuYyAocHJlX2hlYWRlcnMpOiBSZWNvZ25pemUgYmZkX2FyY2hfYXJjLgotCi1UdWUgQXVnIDEyIDExOjQ1OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogSWYgbm8gc3ltYm9scywgbWFrZSBzdXJlIHRoZQotCWRhdGEgc2VjdGlvbiBpcyBjb3JyZWN0bHkgcm91bmRlZCB0byBhIHBhZ2UgaW4gdGhlIGZpbGUuCi0KLU1vbiBBdWcgMTEgMTI6NDU6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBEb24ndCBlbWl0IHRoZSBzdHJpbmcgdGFibGUgaWYKLQl0aGVyZSBhcmUgbm8gc3ltYm9scy4KLQotU3VuIEF1ZyAxMCAxNDo0NTo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc3RnbzMyLmM6IFJlbmFtZSBmcm9tIGNvZmYtc3R1YmdvMzIuYyB0byBhdm9pZCBvbGQgU3lzdGVtIFYKLQlmaWxlIHN5c3RlbSAxNCBjaGFyYWN0ZXIgbGltaXQuCi0JKiBNYWtlZmlsZS5hbSwgY29uZmlndXJlLmluOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgQXVnICA4IDE4OjM0OjM2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IChBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGVsZjMyLWQxMHYuYy4KLQlSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1XZWQgQXVnICA2IDE4OjU2OjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGRvY2Rpcik6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgQXVnICA1IDIzOjA1OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMi4xLgotCi1Nb24gQXVnICA0IDEyOjAwOjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbmV3IGF1dG9tYWtlIHBhdGNoZXMuCi0KLVN1biBBdWcgIDMgMDg6MTU6MTIgMTk5NyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiByczYwMDAtY29yZS5jIChtYWtlX2JmZF9hc2VjdGlvbik6ICBOZXcgZnVuY3Rpb24gdG8gYWRkIGEgc2VjdGlvbgotCXRvIHRoZSBjb3JlIGZpbGUgYmZkLgotCShyczYwMDBjb2ZmX2NvcmVfcCk6ICBVc2UgbWFrZV9iZmRfYXNlY3Rpb24gdG8gYWRkIHRoZSBjb3JlIGZpbGUKLQlzZWN0aW9ucy4KLQlVc2UgQkZEIHJvdXRpbmVzIHRvIHNlZWssIHJlYWQgYW5kIHN0YXQgdGhlIGNvcmUgZmlsZS4KLQlIYW5kbGUgLmRhdGEgc2VjdGlvbnMgZnJvbSBsb2FkZWQgb2JqZWN0cyBhbmQgYW5vbnltb3VzbHkgbW1hcHBlZAotCXJlZ2lvbnMsIHRoZXNlIGFyZSBhdmFpbGFibGUgaW4gQUlYIDQgY29yZSBmaWxlcy4KLQotRnJpIEF1ZyAgMSAxMjo1ODozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGVuYWJsZV9zaGFyZWQgYmVmb3JlIEFNX1BST0dfTElCVE9PTC4KLQkqIGFjaW5jbHVkZS5tNDogTW92ZSBhY21hY3Jvcy5tNCBpbiBoZXJlLiAgUmVtb3ZlIEFNX1BST0dfTElCVE9PTAotCWNvcHk7IHVzZSBhIHBhdGNoZXMgbGlidG9vbCBpbnN0ZWFkLgotCSogYWNtYWNyb3MubTQ6IFJlbW92ZS4KLQkqIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBKdWwgMzEgMTk6NTU6MzYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBNYWtlZmlsZS5pbi4KLQkqIGFjbWFjcm9zLm00OiBOZXcgZmlsZSwgY29waWVkIGZyb20gb2xkIGFjbG9jYWwubTQuCi0JKiBhY2luY2x1ZGUubTQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluOiBDYWxsIEFNX1BST0dfTElCVE9PTC4gIFJlbW92ZSBzaGFyZWQgbGlicmFyeQotCWhhbmRsaW5nOyBub3cgaGFuZGxlZCBieSBsaWJ0b29sLiAgUmVwbGFjZSBBQ19DT05GSUdfSEVBREVSIHdpdGgKLQlBTV9DT05GSUdfSEVBREVSLiAgUmVwbGFjZSBBQ19QUk9HX0lOU1RBTEwgd2l0aCBBTV9QUk9HX0lOU1RBTEwuCi0JQ2FsbCBBTV9NQUlOVEFJTkVSX01PREUsIEFNX0NZR1dJTjMyLCBhbmQgQU1fRVhFRVhULiAgQ2hhbmdlIGFsbAotCS5vIGZpbGVzIHRvIC5sby4gIFJlbW92ZSBzdGFtcC1oIGhhbmRsaW5nIGluIEFDX09VVFBVVC4KLQkqIGFjY29uZmlnLmg6IE1lbnRpb24gUEFDS0FHRSBhbmQgVkVSU0lPTi4KLQkqIHN0YW1wLWguaW46IE5ldyBmaWxlLgotCSogZGVwLWluLnNlZDogQ2hhbmdlIC5vIHRvIC5sby4KLQkqIE1ha2VmaWxlLmluOiBOb3cgYnVpbHQgd2l0aCBhdXRvbWFrZS4KLQkqIGFjbG9jYWwubTQ6IE5vdyBidWlsdCB3aXRoIGFjbG9jYWwuCi0JKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIFZFUlNJT046IFJlbW92ZS4KLQotVGh1IEp1bCAzMSAxMjowOToyMCAxOTk3ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBzZXQgVEVYVFJFTAotIAlpZiB0aGVyZSBpcyBvbmx5IGEgcmVsb2NhdGlvbiB0byBhIHJlYWQtb25seSBidXQgbm90IGFsbG9jYXRhYmxlCi0gCXNlY3Rpb24gKGxpa2UgLnN0YWIpLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogQ29ycmVjdCB2YXJpb3VzIGNvbW1lbnRzLgotCShwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IFRoZXNlIHNlY3Rpb25zIGFyZSBub3QKLQljcmVhdGVkIGJ5IHRoZSBsaW5rZXIgKHRoYXQgaXMsIHRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlIHVzZXIKLQlwdXR0aW5nIGRhdGEgaW4gdGhlbSkuIEluIHBhcnRpY3VsYXIsIHRoZXkgY2FuIGJlIHRoZSBzb3VyY2UKLQlhbmQgdGFyZ2V0IG9mIHJlbG9jYXRpb25zLgotCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENoZWNrIHBvc3Rjb25kaXRpb24gb2YKLSAJYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sLiAgQWxpZ24gMTYtYnl0ZSBjb21tb24KLSAJb2JqZWN0cyAoZm9yIGluc3RhbmNlLCAnbG9uZyBkb3VibGUnKSB0byAxNi1ieXRlIGJvdW5kYXJpZXMuCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTWFrZSB0aGUgY29kZSB0aGF0IGdlbmVyYXRlcwotCXNlY3Rpb24gc3ltYm9scyBleGFjdGx5IHRoZSBzYW1lIGFzIGZvciBzcGFyYywgcmVkdWNpbmcgdGhlCi0JbnVtYmVyIG9mIHNlY3Rpb24gc3ltYm9scyBvdXRwdXQuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogQ2hlY2sgcG9zdGNvbmRpdGlvbiBvZgotCWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbC4gIE1ha2UgZGVmYXVsdCBjYXNlIHRoZQotCXNhbWUgYXMgY29ycmVzcG9uZGluZyBjb2RlIGZvciBzcGFyYywgZml4aW5nIGJ1ZyBpbnZvbHZpbmcKLQkucmVsYS5zdGFicy4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBGaXggY2FzZSBpbnZvbHZpbmcgR09UIHN5bWJvbHMKLSAJZm9yY2VkIHRvIGJlIGxvY2FsIGJlY2F1c2Ugb2YgdmVyc2lvbmluZyAoYnkgcmVwbGljYXRpbmcKLSAJY29ycmVzcG9uZGluZyBjaGFuZ2UgaW4gc3BhcmMpLiAgVHJlYXQgUl9QUENfUkVMQVRJVkUgUkVMQSByZWxvY3MKLSAJYXMgdXN1YWwgaW4gRUxGLCBub3QgYXMgcHNldWRvLVJFTCByZWxvY3MgKGFzIHRoZSBzcGFyYyBsaW5rZXIKLSAJZG9lcykuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEFkZCBoYW5keSBkZWJ1Z2dpbmcgY29kZSBmb3Igd2hlbgotIAlhc3NlcnRpb24gZmFpbHMuICBBZGQgc29tZSBtb3JlICdzeW1ib2wgbWFkZSBsb2NhbCBiZWNhdXNlIG9mCi0gCXZlcnNpb25pbmcnIGNhc2VzLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ29wZSB3aXRoIGFkZGVuZCB3aGVuCi0JcHJvY2Vzc2luZyBhIEdPVCByZWxvY2F0aW9uIGFzIHJlcXVpcmVkIGJ5IEFCSS4KLQotV2VkIEp1bCAzMCAyMTozMDozNSAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBSZW1vdmUgYW55Ci0JdmVyc2lvbiBpbmZvIGlmIHRoaXMgc3ltYm9sIGNhbWUgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBTZXQgdGhlIHZlcnNpb24gaW5mbyBvZiBhIHN5bWJvbAotCW9ubHkgaWYgdGhlIG9iamVjdCBhY3R1YWxseSBjb250YWlucyB2ZXJzaW9uIGRlZmluaXRpb25zIGFuZAotCWRlZmluZXMgdGhpcyBzeW1ib2wuCi0KLU1vbiBKdWwgMjggMTg6MDc6NDMgMTk5NyAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNDogQWRkIENZR1dJTiBhbmQgRVhFRVhUIGF1dG9jb25mIG1hY3Jvcy4KLSAgICAgICAgKiBjb25maWd1cmUuaW46IFVzZSBDWUdXSU4gYW5kIEVYRUVYVCBhdXRvY29uZiBtYWNybyB0byBsb29rIGZvcgotICAgICAgICB3aW4zMiBkZXBlbmRlbmNpZXMuCi0gICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0gICAgICAgICogZG9jL01ha2VmaWxlLmluOiBBZGQgJChFWEVFWFQpIHRvIGNoZXcgZXhlY3V0YWJsZS4KLQotTW9uIEp1bCAyOCAwMjo1MDoyOSAxOTk3ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9wKTogIElmIENPUkVfVFJVTkMgaXMgc2V0LCBwcmludAotCWEgd2FybmluZyByYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gZXJyb3IuCi0KLVN1biBKdWwgMjcgMTk6NTQ6MTQgMTk5NyAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luKTogYWRkIHNlbWljb2xvbiB0byBtYWtlIE1TVkMgaGFwcHkuCi0KLUZyaSBKdWwgMjUgMTQ6NTA6MDggMTk5NyAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjaXNjby1jb3JlLmM6IGRlZmluZSBzaWduYWxzIGZvciB3aW5nZGIuCi0KLUZyaSBKdWwgMjUgMTY6Mjc6MDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBPbmx5IG1lcmdlIGZpbGVzIHdpdGgKLQl0aGUgc2FtZSBudW1iZXIgb2YgYXV4IGVudHJpZXMuCi0KLUZyaSBKdWwgMjUgMDg6MjI6MTUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBVc2UgUl9EQVRBX0VYUFIgZm9yIHRoZQotCWRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaWYgdGhlIHJlbG9jYXRpb24gc2l6ZSBpcyAzMiBiaXRzLgotCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfREFUQV9FWFBSLgotCi1XZWQgSnVsIDIzIDE2OjA4OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IERvbid0IG9mZnNldCBhIGNvbW1vbiBzeW1ib2wgYnkKLQlpdHMgdmFsdWUgaWYgQ09GRl9XSVRIX1BFIGlzIGRlZmluZWQuCi0KLVR1ZSBKdWwgMjIgMTc6MTk6NDUgMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBjb2ZmLXN0dWJnbzMyLmM6IE5ldyBmaWxlLgotCSogZ28zMnN0dWIuaDogTmV3IGZpbGUuCi0JKiBjb2ZmLWkzODYuYzogSWYgQ09GRl9HTzMyX0VYRSwgaW5jbHVkZSBjb2ZmL2dvMzJleGUuaC4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9maWxlaGRyX2luKTogSW52b2tlCi0JQ09GRl9BREpVU1RfRklMRUhEUl9JTl9QUkUgYW5kIENPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUE9TVCBpZiB0aGV5Ci0JYXJlIGRlZmluZWQuCi0JKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IEludm9rZSBDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QUkUgYW5kCi0JQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUE9TVCBpZiB0aGV5IGFyZSBkZWZpbmVkLgotCShjb2ZmX3N3YXBfYXV4X2luKTogSW52b2tlIENPRkZfQURKVVNUX0FVWF9JTl9QUkUgYW5kCi0JQ09GRl9BREpVU1RfQVVYX0lOX1BPU1QgaWYgdGhleSBhcmUgZGVmaW5lZC4KLQkoY29mZl9zd2FwX2F1eF9vdXQpOiBJbnZva2UgQ09GRl9BREpVU1RfQVVYX09VVF9QUkUgYW5kCi0JQ09GRl9BREpVU1RfQVVYX09VVF9QT1NUIGlmIHRoZXkgYXJlIGRlZmluZWQuCi0JKGNvZmZfc3dhcF9zY25oZHJfaW4pOiBJbnZva2UgQ09GRl9BREpVU1RfU0NOSERSX0lOX1BSRSBhbmQKLQlDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVCBpZiB0aGV5IGFyZSBkZWZpbmVkLgotCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IEludm9rZSBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BSRSBhbmQKLQlDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BPU1QgaWYgdGhleSBhcmUgZGVmaW5lZC4KLQkqIHRhcmdldHMuYyAoZ28zMnN0dWJiZWRjb2ZmX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGdvMzJzdHViYmVkY29mZl92ZWMuCi0JKiBjb25maWd1cmUuaW4gKGdvMzJjb2ZmX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCShnbzMyc3R1YmJlZGNvZmZfdmVjKTogTGlrZXdpc2UuCi0JKiBjb25maWcuYmZkIChpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKik6IE5ldyB0YXJnZXQuCi0JKGlbMzQ1Nl04Ni0qLWdvMzIqKTogQ2hhbmdlIHRvIGJlIGxpa2UgbmV3IG1zZG9zZGpncHAqLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1zdHViZ28zMi5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgY29mZi1zdHViZ28zMi5jLgotCShIRklMRVMpOiBBZGQgZ28zMnN0dWIuaC4KLQotVHVlIEp1bCAyMiAxNTowOToxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIGZkb3Blbi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogQ2hlY2sgSEFWRV9GRE9QRU4gcmF0aGVyIHRoYW4gVk1TIG9yCi0JX19HTzMyX18uICBSZWluZGVudCBhIGJpdC4KLQotU3VuIEp1bCAyMCAyMDowNToyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IFNFQ19MSU5LRVJfQ1JFQVRFRAotCWZsYWcgZm9yIG5ld2x5IGNyZWF0ZWQgc2VjdGlvbnMuCi0JKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBEb24ndCBkaXNjYXJkIG5ld2x5IGNyZWF0ZWQgc2VjdGlvbnMKLQlpZiBzaGFyZWQgbGlicmFyeSBpcyBkeW5vYmouCi0KLU1vbiBKdWwgMTQgMTU6MzM6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogV2hlbiBjaGVja2luZyB3aGV0aGVyCi0JaW5jbHVkaW5nIGEgc2VjdGlvbiBpbiBhIHNlZ21lbnQgd291bGQgZm9yY2UgdXMgdG8gc2tpcCBhIHBhZ2UsCi0JYWxpZ24gdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgc2VnbWVudCB0byBhdm9pZCB3cmFwYXJvdW5kCi0JcHJvYmxlbXMuCi0KLVR1ZSBKdWwgIDggMTI6MTE6MjkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSW5pdGlhbGl6ZQotIAl0YXJnZXQgaWQgZmllbGQgdG8gVElDODBfVEFSR0VUX0lELgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2ZpbGVoZHJfb3V0KTogU3dhcCBvdXQgdGFyZ2V0IGlkIGZpZWxkCi0gCWlmIHVzZWQuCi0JKGNvZmZfc3dhcF9maWxlaGRyX2luKTogU3dhcCBpbiB0YXJnZXQgaWQgZmllbGQgaWYgdXNlZC4KLQotTW9uIEp1bCAgNyAxNjo0MToyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24KLQlpZiBUQVJHRVRfVU5ERVJTQ09SRS4KLQkoY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZSBpZiBUQVJHRVRfVU5ERVJTQ09SRS4KLQkoaTM4NmNvZmZfdmVjKTogQWRkIFNFQ19DT0RFIGFuZCBTRUNfREFUQSB0byBzZWN0aW9uX2ZsYWdzLgotCi1Nb24gSnVuIDMwIDE0OjI5OjI2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTY4ay5jIChob3d0b190YWJsZSk6IFVzZSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgbm90Ci0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBmb3IgMzIgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zLgotCi1UaHUgSnVuIDI2IDAxOjI2OjMxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBXaGVuIGEgdmVyc2lvbgotCWluZGlyZWN0aW9uIHN5bWJvbCBpcyBvdmVycmlkZGVuLCBtYWtlIHRoZSBvcmlnaW5hbCBzeW1ib2wgcG9pbnQKLQlhdCB0aGUgcmVhbCBvdmVycmlkaW5nIHN5bWJvbC4KLQotCSogZWxmLmMgKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24pOiBDaGVjayBmb3IgYW4gaW52YWxpZAotCXN0cmluZyBpbmRleC4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogVXNlIHRoZSByaWdodCBzZWN0aW9uIGZvciBhCi0JY29tbW9uIHN5bWJvbC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBJZiBhIGNvbW1vbgotCXN5bWJvbCB3YXMgaW4gLnNjb21tb24sIG1hcmsgaXQgYXMgU0hOX01JUFNfU0NPTU1PTi4KLQotV2VkIEp1biAyNSAxMjo0MzoxMCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2xzKTogUmVzb2x2ZSBpbmRpcmVjdCBhbmQgd2FybmluZwotCXN5bWJvbHMgYmVmb3JlIGNoZWNraW5nIGZvciBuZXcgc3ltYm9scy4KLQotCSogZWxmY29yZS5oIChlbGZfY29yZWZpbGVfbm90ZSk6IE1vdmUgb3V0IG9mIEhBVkVfU1lTX1BST0NGU19ILgotCi1UdWUgSnVuIDI0IDExOjIwOjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX29iamVjdF9wKTogUmVhZCB0aGUgZl9vcHRoZHIgYnl0ZXMgZnJvbSB0aGUKLQlmaWxlLCBub3QgYW91dHN6IGJ5dGVzICh0aGV5IGFyZSBkaWZmZXJlbnQgaW4gWENPRkYgLm8gZmlsZXMpLgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFBlcm1pdCBzeW1ib2xzIHRvIGJlCi0JcmVkZWZpbmVkIGJ5IG9iamVjdHMgaW5jbHVkZWQgZnJvbSBhcmNoaXZlcy4KLQotTW9uIEp1biAyMyAxODowMzoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IEluIHRoZSBjYXNlIG9mIGEgbmV3IGRlZmluZWQKLQlzeW1ib2wgb3ZlcnJpZGluZyBhbiBvbGQgZGVmaW5lZCBzeW1ib2wsIHJldHVybiB0aGUgaGFzaCB0YWJsZQotCWVudHJ5IHdoaWNoIHdlIG1vZGlmeSwgZXZlbiBpZiBpdCBpcyB0aGUgdGFyZ2V0IG9mIGFuCi0JaW5kaXJlY3Rpb24uCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIHRoZSByZWFsIG5hbWUgb2YgdGhlIHN5bWJvbCBnZXRzCi0Jb3ZlcnJpZGRlbiwgY29udmVydCB0aGUgdmVyc2lvbmVkIHN5bWJvbCBpbnRvIGFuIGluZGlyZWN0IHN5bWJvbAotCXRvIHRoZSByZWFsIHN5bWJvbC4KLQotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9sKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCWVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scy4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ2FsbCBpdC4KLQotU3VuIEp1biAyMiAxOTo0MDo1NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChpM2NvZmZfb2JqZWN0X3ApOiBJZiBDT0ZGX0lNQUdFX1dJVEhfUEUsIGhhY2sgdG8KLQloYW5kbGUgY2FzZSB3aGVyZSBDT0ZGIGZpbGVoZHIgZG9lcyBub3QgaW1tZWRpYXRlbHkgZm9sbG93IFBFCi0JaGVhZGVyLgotCSogY29mZmdlbi5jIChjb2ZmX29iamVjdF9wKTogUmVtb3ZlIHVzZWxlc3Mgc2VlayB0byBjdXJyZW50Ci0JbG9jYXRpb24uCi0KLVdlZCBKdW4gMTggMTk6MDM6MzggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAobGlua19hY3Rpb24pOiBDaGFuZ2UgQ09NTU9OX1JPVy9pbmRyIHRvIGZyb20gQ1JFRiB0bwotCVJFRkMuCi0KLVR1ZSBKdW4gMTcgMTE6NTU6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBJZiBzdHJpcHBpbmcgZGVidWdnaW5nCi0Jc3ltYm9scywgc2tpcCBOX0FCUyBzeW1ib2xzIHdpdGggZGVidWdnaW5nIHN0b3JhZ2UgY2xhc3Nlcy4KLQotTW9uIEp1biAxNiAxODo1NjoyNyAxOTk3ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZW1pdCBSX1BQQ19SRUwqCi0JcmVsb2NzIGluIHNoYXJlZCBsaWJyYXJpZXMgd2hpY2ggcmVmZXIgdG8gbG9jYWwgc3ltYm9scy4gIENvcGUKLQl3aXRoIGFkZGVuZCB3aGVuIHByb2Nlc3NpbmcgYSBHT1QgcmVsb2NhdGlvbi4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogT25seSBjcmVhdGUgc3ltYm9scwotCWZvciBzZWN0aW9ucyB0aGF0IHRoZSBsaW5rZXIgZGlkbid0IGNyZWF0ZS4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgdHJ5IHRvIHdyaXRlIG91dCBhIHNlY3Rpb24KLQlzeW1ib2wgaWYgaXQgd2FzIGNyZWF0ZWQgaW4gcHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENvbXBsYWluIGlmIHdlIGhhdmUgdG8gZ2VuZXJhdGUgYSByZWxvYwotCXJlbGF0aXZlIHRvIGEgc2VjdGlvbiBmb3Igd2hpY2ggd2UgZGlkbid0IG91dHB1dCBhIHN5bWJvbC4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2xlYW4gdXAuICBQTFQKLQlyZWxvY3MgYXJlICdyZWxhJyByZWxvY3MsIGxpa2UgZXZlcnl0aGluZyBlbHNlLiAgLnJlbGEucGx0IGlzIG5vdAotCWEgcmVhZC1vbmx5IHNlY3Rpb24sIHNvIHdlIGRvbid0IGhhdmUgdG8gc3BlY2lhbC1jYXNlIGl0LgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBFbnRyaWVzIGluIHRoZQotCS5yZWxhLmJzcyBzZWN0aW9uIGFyZSAob2YgY291cnNlKSAncmVsYScgcmVsb2NzIG5vdCAncmVsJyByZWxvY3MuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IEluaXRpYWxpc2Ugc3JlbGdvdC4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQGdvdCBvZmZzZXRzIGFyZSA0IGZyb20gc3RhcnQgb2YgdGhlCi0JYWN0dWFsIC5nb3Qgc2VjdGlvbi4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogVGhlIHRocmVlIHJlc2VydmVkCi0Jd29yZHMgc3RhcnQgZnJvbSB0aGUgc3ltYm9sICdfR0xPQkFMX09GRlNFVF9UQUJMRV8nLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiAnLnJlbGEnIGlzIDUKLQljaGFyYWN0ZXJzLCBub3QgNC4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogVXNlCi0JX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIHRvIGNyZWF0ZSB0aGUgR09UIHJhdGhlciB0aGFuCi0JcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24uIENyZWF0ZSB0aGUgJy5yZWxhLmdvdCcgc2VjdGlvbgotCW91cnNlbHZlcy4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBTZXQgdXAgR09UIHJlbG9jYXRpb25zIHdoZW4gYQotCXN5bWJvbCBoYXMgYSBHT1QgZW50cnkuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJlY29yZCB3aGVuIGEgc3ltYm9sIGlzIHVzZWQgdGhyb3VnaAotCXRoZSBHT1QsIGFuZCBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgR09UIGZvciBlYWNoIHN1Y2ggc3ltYm9sLgotCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERlbGV0ZSB1bnVzZWQgLmdvdC5wbHQgc3R1ZmYuCi0JKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogRGVsZXRlIHVudXNlZCBMSU5LRVJfU0VDVElPTl9HT1QKLQlzdHVmZi4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogR09UMTZfSEEgcmVsb2NzIHNob3VsZCBiZQotCXRyZWF0ZWQgaW4gYSBzaW1pbGFyIHdheSB0byBBRERSMTZfSEEgcmVsb2NzLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBQTFRSRUwyNCByZWxvY3MgZG8gbm90IGdldCBjb3BpZWQgaW50bwotCXNoYXJlZCBvYmplY3RzOyB0aGUgbGlua2VyIG11c3QgZGVhbCB3aXRoIHRoZW0uCi0JKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogU3RvcCBzZXR0aW5nCi0JX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHRvIHRoZSB3cm9uZyB2YWx1ZTsgZGVsZXRlIHVudXNlZAotCUxJTktFUl9TRUNUSU9OX1BMVCBzdHVmZi4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBEZWxldGUgdW51c2VkIExJTktFUl9TRUNUSU9OX1BMVCBzdHVmZi4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBCRkQgY2FsbHMgdG8gZ2V0IEdPVAotCXNlY3Rpb24sIG5vdCBFTEYtc3BlY2lmaWMgY2FsbHMuCi0JKGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkKTogU2V0IHRvIDEuCi0JKGVsZl9iYWNrZW5kX2dvdF9zeW1ib2xfb2Zmc2V0KTogU2V0IHRvIDQuCi0JKiBlbGYtYmZkLmggKGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgJ3BsdF9ub3RfbG9hZGVkJyBtZW1iZXIKLQlmb3Igd2hlbiBsZC5zbyBmaWxscyBpbiB0aGUgUExUOyBhbmQgJ2dvdF9zeW1ib2xfb2Zmc2V0JyBtZW1iZXIuCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQXBwbHkKLQlwbHRfbm90X2xvYWRlZCBtZW1iZXIuCi0JKF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IEFwcGx5IGdvdF9zeW1ib2xfb2Zmc2V0LgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkKTogU2V0IGRlZmF1bHQgdG8KLQknbG9hZGVkJy4KLQkoZWxmX2JhY2tlbmRfR19PX1Rfb2Zmc2V0KTogU2V0IGRlZmF1bHQgdG8gMC4KLQkoZWxmTk5fYmVkKTogU2V0IGFkZGVkIGZpZWxkcy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogV2FzIHNldHRpbmcKLQlEVF9SRUxFTlQgaW4gc2hhcmVkIG9iamVjdHM7IHNob3VsZCBiZSBEVF9SRUxBRU5ULgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUHJvcGFnYXRlCi0JUl9QUENfQUREUjE2X0hBIHJlbG9jcyB0byBzaGFyZWQgb2JqZWN0cy4gQ29wZSB3aXRoIGNhc2Ugd2hlcmUKLQlzdWNoIGEgcmVsb2MgKGluIGEgbm9uLXNoYXJlZCBvYmplY3QpIHJlZmVycyB0byBhIHN5bWJvbCB0aGF0J3MKLQlub3QgZGVmaW5lZC4KLQotTW9uIEp1biAxNiAxNDo0MjoxNCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBlbGZjb2RlLmggKHB1dF9zaWduZWRfd29yZCk6IERlZmluZS4KLQkoZ2V0X3NpZ25lZF93b3JkKTogRGVmaW5lLgotCShlbGZfc3dhcF9yZWxvY2FfaW4pOiBVc2UgZ2V0X3NpZ25lZF93b3JkIGZvciB0aGUgcl9hZGRlbmQgZmllbGQuCi0JKGVsZl9zd2FwX3JlbG9jYV9vdXQpOiBVc2UgcHV0X3NpZ25lZF93b3JkIGZvciB0aGUgcl9hZGRlbmQKLQlmaWVsZC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogVXNlCi0JYmZkX2dldF9zaWduZWRfMzIgdG8gc2V0IHRoZSByX2FkZGVuZCBmaWVsZC4KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19lbGY2NF9zd2FwX3JlbG9jYV9pbik6IFVzZQotCWJmZF9oX2dldF9zaWduZWRfNjQgdG8gc2V0IHRoZSByX2FkZGVuZCBmaWVsZC4KLQotTW9uIEp1biAxNiAxMjozMToyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFdoZW4gZ2VuZXJhdGluZyBhCi0Jc2hhcmVkIGxpYnJhcnksIGRvIHRoZSByZWxvY2F0aW9uIGlmIHRoZSBpbnB1dCBzZWN0aW9uIGlzIG5vdAotCWFsbG9jYXRlZCBpbiBtZW1vcnkuCi0KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBDYWxsCi0JZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uIGJlZm9yZSBlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sLgotCShlbGZfZml4X3N5bWJvbF9mbGFncyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQllbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sLgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ2FsbCBlbGZfZml4X3N5bWJvbF9mbGFncy4KLQkoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogTGlrZXdpc2UuICBQZXJtaXQgYSBzeW1ib2wgdG8gYmUKLQlmb3JjZWQgbG9jYWwgZXZlbiBpZiBORUVEU19QTFQgaXMgc2V0LiAgV2hlbiBmb3JjaW5nIGEgc3ltYm9sIHRvCi0JYmUgbG9jYWwsIGNsZWFyIE5FRURTX1BMVC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgYmVkLgotCi1XZWQgSnVuIDExIDIyOjQ0OjIwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSk6IE5ldyBzdHJ1Y3R1cmUKLQlmb3IgZGVyaXZlZCBlbGYgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gIFJlZmVyZW5jZXMgdG8KLQllbGZfbGlua19oYXNoX2VudHJ5IGNoYW5nZWQgYXBwcm9wcmlhdGVseS4KLQkoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUpOiBOZXcgc3RydWN0dXJlIGZvciBkZXJpdmVkIGVsZgotCWxpbmtlciBoYXNoIHRhYmxlLgotCShlbGYzMl9tbjEwMzAwX2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RyYXZlcnNlKTogTGlrZXdpc2UuCi0JKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCShlbGYzMl9tbjEwMzAwX2ZpbmlzaF9oYXNoX3RhYmxlX2VudHJ5KTogTGlrZXdpc2UuCi0JKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBIYW5kbGUgImNhbGwiIC0+ICJjYWxscyIsIHJlbW92YWwKLQlvZiBwcm9sb2d1ZSBjb2RlLCBhbmQgY2FsbDozMi0+Y2FsbDoxNiByZWxheGluZy4KLQkoY29tcHV0ZV9mdW5jdGlvbl9pbmZvOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9iZmRfaWxpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEZWZpbmUuCi0KLVdlZCBKdW4gMTEgMDA6MDA6MDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBDYWxsIGZpbmlzaF9keW5hbWljX3N5bWJvbAotCWZvciBhIHN5bWJvbCB3aGljaCBpcyBiZWluZyBmb3JjZWQgdG8gYmUgbG9jYWwuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBXcml0ZSBvdXQgdGhlCi0JcmVsb2NhdGlvbiB2YWx1ZSBmb3IgYSBHT1QgcmVsb2MgZm9yIGEgc3ltYm9sIHdoaWNoIGlzIHR1cm5pbmcKLQlpbnRvIGEgbG9jYWwgc3ltYm9sLgotCShlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBJZiBhIHN5bWJvbCBpcyB0dXJuaW5nIGludG8gYQotCWxvY2FsIHN5bWJvbCwgd3JpdGUgb3V0IGEgUkVMQVRJVkUgcmVsb2MgcmF0aGVyIHRoYW4gYSBHTE9CX0RBVAotCXJlbG9jLgotCSogZWxmMzItbTY4ay5jLCBlbGYzMi1zcGFyYy5jOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IEdldCB0aGUgcmVsb2NhdGlvbgotCXZhbHVlIGlmIHRoZSBzeW1ib2wgaXMgdHVybmluZyBpbnRvIGEgbG9jYWwgc3ltYm9sLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLTE5OTctMDYtMTAgMjI6NTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEFsc28gcmVhZCB2ZXJuZWVkCi0JaW5mb3JtYXRpb24gYnkgY2FsbGluZyBgX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMnLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBGb3IgdW5kZWZpbmVkIHN5bWJvbHMgbG9vayBmb3IKLQl2ZXJzaW9uIGluZm9ybWF0aW9uIGluIHRoZSB2ZXJuZWVkIHJlY29yZHMuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSBzb25hbWUgb2Ygc2hhcmVkIG9iamVjdAotCWZvciB2ZXJuZWVkIHJlY29yZCBpZiBpdCBpcyBhdmFpbGFibGUuCi0KLVR1ZSBKdW4gMTAgMTE6MTM6MDMgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogY3B1LWFybS5jOiBBZGQgcHJvdG90eXBlcyBmb3IgY29tcGF0aWJsZSBhbmQgc2Nhbi4KLQkqIGNvZmZsaW5rLmM6IEFkZCBwcm90b3R5cGUgZm9yIG1hcmtfcmVsb2NzLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9zcGVjaWFsX3VuZG9jdW1lbnRlZF9nbHVlKTogQ2hhbmdlIGZpbGVuYW1lIHRvCi0JY29uc3QgcG9pbnRlci4gIEFkZCBwcm90b3R5cGUuCi0KLU1vbiBKdW4gIDkgMTI6MzQ6MjEgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWdub3JlIHJlbG9jYXRpb25zIG9mCi0Jc2VjdGlvbnMgdGhhdCB3aWxsIGJlIGRpc2NhcmRlZC4KLQotMTk5Ny0wNi0wNiAyMjo1OCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcyk6IFdoZW4gc2VhcmNoaW5nCi0JZm9yIGtub3duIHZlcnNpb24gc3ltYm9sIHNraXAgbm9uLW1hdGNoaW5nIHZlcmRlZiByZWNvcmRzLCBub3QKLQltYXRjaGluZyByZWNvcmRzLgotCi1UaHUgSnVuICA1IDE1OjUyOjQ1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IFdyaXRlIGEgbG9uZywKLQlub3QgYSBiZmRfdm1hLCB0byB0aGUgYmFzZSBmaWxlLCB0byBtYXRjaCBob3cgZGxsdG9vbCByZWFkcyBpdC4KLQotVHVlIEp1biAgMyAxNjo1Nzo0NSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy5jOiBBZGQgdGh1bWIgcmVsb2NhdGlvbnMuCi0KLQkqIGJmZC1pbjIuaDogQWRkIFRodW1iIHJlbG9jYXRpb25zLgotCi0JKiBsaWJiZmQuaDogQWRkIFRodW1iIHJlbG9jYXRpb25zLgotCi1Nb24gSnVuICAyIDEwOjQxOjUyIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjcHUtbTY4ay5jIChhcmNoX2luZm9fc3RydWN0KTogRml4IDY4MDYwIGNwdSBuYW1lLgotCi1GcmkgTWF5IDMwIDEyOjQ2OjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IGR5bmluZHgKLQlmb3IgYSBzZWN0aW9uIGV2ZW4gaWYgaXQgaXMgbm90IGxvYWRlZC4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogSWYgUEUgZmlsZSwgZG9uJ3Qgc3VidHJhY3QKLQlzZWN0aW9uIFZNQS4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogU2VwYXJhdGUgc2VjdGlvbiBWTUEgaGFuZGxpbmcgZm9yCi0JaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4KLQkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIHdoZXRoZXIgaW5wdXQgZmlsZSwKLQlub3Qgb3V0cHV0IGZpbGUsIGlzIGEgUEUgZmlsZS4KLQotV2VkIE1heSAyOCAxNTo0ODo0MyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jOiAoY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzKTogTWFrZSBzdGF0aWMuCi0KLVdlZCBNYXkgMjggMTY6MTY6MDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jKTogRG9uJ3QganVzdCBleGl0IGlmIHdlIHNlZSBhbgotCVJfSU1BR0VCQVNFIHJlbG9jLgotCi1XZWQgTWF5IDI4IDA5OjQ4OjQzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1hcm0uYyAoY29tcGF0aWJsZSk6IEFkZCB0ZXN0IGZvciBzdXBlcnNldHMgb2YgQVJNCi0JYXJjaGl0ZWN0dXJlcy4KLQotVHVlIE1heSAyNyAxOTo0MjowMyAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIGdsb2JhbF90b19zdGF0aWMKLQltZW1iZXIuCi0KLVR1ZSBNYXkgMjcgMTQ6MzQ6MDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzKTogTWFrZSBnbG9iYWwuICBJdCBpcwotCWNhbGxlZCBkaXJlY3RseSBieSBnYXMvY29uZmlnL3RjLWFybS5jLgotCi1UdWUgTWF5IDI3IDE1OjU4OjUzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChQTFRfRU5UUllfKik6IFVzZSBhIG5ldyB0aHJlYWQtc2FmZSBmb3JtYXQuCi0JKGVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEZpbGwgaXQgaW4gcHJvcGVybHkuCi0KLU1vbiBNYXkgMjYgMTQ6MDU6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgUEUgZmlsZSwgZG9uJ3QgYWRkCi0Jc2VjdGlvbiBWTUEuCi0KLU1vbiBNYXkgMjYgMTA6NTc6NDggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6ICN1bmRlZiBiZWZvcmUgI2RlZmluZS4KLQkoY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGl0dG8uCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE1ha2Ugc3RhdGljLgotCShjb2ZmX2FybV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERpdHRvLgotCShjb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBEaXR0by4KLQkoY29mZl9hcm1fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERpdHRvLgotCi1GcmkgTWF5IDIzIDE1OjE0OjU4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBib29sZWFuCi0JZ2xvYmFsX3RvX3N0YXRpYyBtZW1iZXIgZm9yIHN1cHBvcnQgb2YgdGFzayBsaW5raW5nLgotCShfYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzKTogQWRkIHByb3RvdHlwZS4KLQkqIGxpYmNvZmYuaDogUmVnZW5lcmF0ZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlICNpZmRlZiB0bwotCWNoZWNrIFJTNjAwMENPRkZfQywgdG8gYmUgY29uc2lzdGVudCB3aXRoIGFsbCBvdGhlciB1c2VzCi0JaW4gdGhpcyBmaWxlLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJZiBkb2luZyB0YXNrIGxpbmtpbmcsCi0JY2FsbCBfYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBJZiBkb2luZyB0YXNrIGxpbmtpbmcsIGNvbnZlcnQKLQlnbG9iYWwgZnVuY3Rpb25zIHRvIHN0YXRpYy4KLQkoX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0pOiBJZiBkb2luZyB0YXNrIGxpbmtpbmcsIGNvbnZlcnQKLQlnbG9iYWwgdmFyaWFibGVzIHRvIHN0YXRpYy4KLQkoX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscyk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvZmYtdGljODAuYyAoVElDODBDT0ZGKTogRGVmaW5lIHRoaXMgaW5zdGVhZCBvZiBqdXN0IFRJQzgwLgotCShDX0FVVE9BUkcpOiAjdW5kZWYgc2luY2UgaXQgY2xhc2hlcyB3aXRoIENfVUVYVC4KLQkoQ19MQVNURU5UKTogI3VuZGVmIHNpbmNlIGl0IGNsYXNoZXMgd2l0aCBDX1NUQVRMQUIuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSBUSUM4MENPRkYKLQlyYXRoZXIgdGhhbiBUSUM4MC4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBVc2UgQ19TWVNURU0uICBIaWRlIENfQVVUT0FSRyB1c2UKLQl3aGVuIFRJQzgwQ09GRiBkZWZpbmVkIChjbGFzaGVzIHdpdGggQ19VRVhUKS4gIEV4cGxpY2l0bHkKLQlyZWNvZ25pemUgQ19VRVhULCBDX1NUQVRMQUIsIGFuZCBDX0VYVExBQiBhcyB1bnN1cHBvcnRlZC4KLQotRnJpIE1heSAyMyAxMjozODoyNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAodGljODBfaG93dG9fdGFibGUpOiBDaGFuZ2Ugb3ZlcmZsb3cgY2hlY2sgZm9yIG1vc3QKLQlQUCByZWxvY2F0aW9ucyB0byBjb21wbGFpbl9vdmVyZmxvd19kb250LgotCi1UaHUgTWF5IDIyIDIwOjIyOjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jICh0aWM4MF9ob3d0b190YWJsZSk6IEFkZCBQUCByZWxvY2F0aW9ucy4gIENoYW5nZQotCW5hbWUgb2YgUl9SRUxMT05HIHRvICJSRUxMT05HIi4gIFNldCByaWdodHNoaWZ0IGFuZCBjb21wbGFpbiBmb3IKLQlNX1BQQ1IuCi0JKHBwYmFzZV9yZWxvYywgZ2xvYjE1X3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKGdsb2IxNl9yZWxvYywgbG9jYWwxNl9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShydHlwZTJob3d0byk6IEhhbmRsZSBhbGwgcmVsb2NhdGlvbiB0eXBlcy4KLQkoY29mZl90aWM4MF9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lIHRvIGNvZmZfdGljODBfcmVsb2NhdGVfc2VjdGlvbi4KLQkqIE1ha2VmaWxlLmluIChjb2ZmLXRpYzgwLm8pOiBEZXBlbmRzIHVwb24gaW5jbHVkZS9jb2ZmL3RpYzgwLmguCi0KLVdlZCBNYXkgMjEgMTc6MTU6NTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IElmIENPRkZfV0lUSF9QRSBvcgotCUNPRkZfSU1BR0VfV0lUSF9QRSwgZG9uJ3Qgc3VidHJhY3QgdGhlIHNlY3Rpb24gVk1BIGZyb20gdGhlIHN5bWJvbAotCXZhbHVlLgotCSogY29mZmdlbi5jIChmaXh1cF9zeW1ib2xfdmFsdWUpOiBBZGQgYWJmZCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4gIElmIFBFIGZpbGUsIGRvbid0IGFkZCBzZWN0aW9uIFZNQS4KLQkoY29mZl93cml0ZV9hbGllbl9zeW1ib2wpOiBJZiBQRSBmaWxlLCBkb24ndCBhZGQgc2VjdGlvbiBWTUEuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0pOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBwZWljb2RlLmg6IEFkZCAmIDB4ZmZmZmZmZmYgd2hlbiB1c2luZyBJbWFnZUJhc2UgaW4gY2FzZSBiZmRfdm1hCi0JaXMgNjQgYml0cy4KLQotV2VkIE1heSAyMSAwOTo1ODoxMCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChtYXJrX3JlbG9jcyk6IEFkZCBuZXcgZnVuY3Rpb24gdG8gbWFyayBzeW1ib2xzIHdoaWNoCi0JYXJlIHVzZWQgYnkgcmVsb2NhdGlvbnMuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IEFkZCBjYWxsIHRvIG1hcmtfcmVsb2NzKCkgYW5kIGNvZGUgdG8KLQlzdXBwcmVzcyB0aGUgc2tpcHBpbmcgb2Ygc3ltYm9scyB0aGF0IGhhdmUgdGh1cyBiZWVuIG1hcmtlZC4KLQotVHVlIE1heSAyMCAxODo0NToyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoc2hfbWVyZ2VfcHJpdmF0ZV9kYXRhKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZS4KLQotTW9uIE1heSAxOSAxNDo0NjowMCAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYzogUmVtb3ZlIHVubmVjZXNzYXJ5ICNpZmRlZnMuCi0JKiBjb25maWcuYmZkOiBTZXQgdGFyZ191bmRlcnNjb3JlIHRvIHllcyBmb3IgdGljODAuCi0KLU1vbiBNYXkgMTkgMTQ6MjY6MzYgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKE5BTUVTX0hBVkVfVU5ERVJTQ09SRSk6IERlZmluZSAoZml4ZXMgcHJvYmxlbQotCXdpdGggdW5yZXNvbHZlZCBleHRlcm5hbCBzeW1ib2xzIGluIEdEQikuCi0KLUZyaSBNYXkgMTYgMTA6MjM6MDMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtbTEwMzAwLmMgKGVsZjMyX21uMTAzMDBfcmVsYXhfc2VjdGlvbik6IFJlYWQgaW4gYWxsCi0JdGhlIHN5bWJvbHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggQkZELgotCShtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBEb24ndCBhZGp1c3QgdGhlIHNhbWUgc3ltYm9sCi0JbW9yZSB0aGFuIG9uY2UuCi0JKiBlbGYtbTEwMjAwLmM6IExpa2V3aXNlLgotCSogZWxmMzItbTMyci5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNoLmM6IExpa2V3aXNlLgotCi1GcmkgTWF5IDE2IDEyOjEwOjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCBkZWNyZWFzZSB0aGUKLQlhbGlnbm1lbnQgb2YgYSBjb21tb24gc3ltYm9sLiAgSWYgdHdvIHN5bWJvbHMgdGhhdCBsb29rIGxpa2UKLQljb21tb24gc3ltYm9scyBhcmUgZm91bmQgaW4gdHdvIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCB0aGUgc2l6ZSBpcwotCWRpZmZlcmVudCwgdXNlIHRoZSBsYXJnZXIgc2l6ZSwgYW5kIHdhcm4gaWYgLS13YXJuLWNvbW1vbi4gIElmIGEKLQljb21tb24gc3ltYm9sIG92ZXJyaWRlcyBhIGRlZmluaXRpb24gaW4gYSBzaGFyZWQgbGlicmFyeSwgc2V0IHRoZQotCXNpemUgdG8gdGhlIGxhcmdlciBzaXplLCBhbmQgd2FybiBpZiAtLXdhcm4tY29tbW9uLgotCi1UaHUgTWF5IDE1IDE0OjMxOjI4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1hcm0uYyAoY29tcGF0aWJsZSk6ICBBbGxvdyBkZWZhdWx0IG1hY2hpbmUgdG8gYmUgcG9seW1vcnBoZWQKLQlpbnRvIGFueSBvdGhlciBtYWNoaW5lIHR5cGUuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2ZsYWdzKTogIEluaXRpYWxpc2UgZmxhZ3MgdmFyaWFibGUgdG8gMC4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiAgV2hlbiBtZXJnaW5nCi0JZGF0YSBpbnRvIGFuIHVuaXRpYWxpc2VkIGRlc3RpbmF0aW9uIHNldCBpdHMgbWFjaGluZSB0eXBlIGFzIHdlbGwuCi0KLVRodSBNYXkgMTUgMTY6NDA6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEZvcmNlIEVMRiBzeW1ib2wgc2l6ZQotCXRvIGNvbW1vbiBzeW1ib2wgc2l6ZS4gIENvbnNpc3RlbnRseSB0cmVhdCB1bmluaXRpYWxpemVkIHN5bWJvbHMKLQlpbiBzaGFyZWQgb2JqZWN0cyBhcyBjb21tb24gc3ltYm9scy4KLQotRnJpIE1heSAgOSAxMDoxNToyNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChjb25zdGFudHMpOiAgQWRkZWQgbmV3IGNvbnN0YW50cyB0byBpZGVudGlmeSB0aGUKLQl0eXBlIG9mIHRoZSBBUk0gYXJjaGl0ZWN0dXJlOiBiZmRfbWFjaF9hcm1fMiwgYmZkX21hY2hfYXJtXzJhLAotCWJmZF9tYWNoX2FybV8zLAliZmRfbWFjaF9hcm1fM00sIGJmZF9tYWNoX2FybV80IGFuZCBiZmRfbWFjaF9hcm1fNFQuCi0KLQkqIGJmZC1pbjIuaCAoY29uc3RhbnRzKTogICBBZGRlZCBuZXcgY29uc3RhbnRzIHRvIGlkZW50aWZ5Ci0JdGhlIHR5cGUgb2YgdGhlIEFSTSBhcmNoaXRlY3R1cmU6IGJmZF9tYWNoX2FybV8yLCBiZmRfbWFjaF9hcm1fMmEsCi0JYmZkX21hY2hfYXJtXzMsIGJmZF9tYWNoX2FybV8zTSwgYmZkX21hY2hfYXJtXzQgYW5kCi0JYmZkX21hY2hfYXJtXzRULiAgVGhpcyBmaWxlIGlzIGF1dG8tbWFnaWNhbGx5IGdlbmVyYXRlZCBmcm9tIHRoZQotCWFyY2h1cmVzLmMgZmlsZS4gIFRoaXMgdXBkYXRlIGlzIGp1c3QgdG8gc2F2ZSB3b3JrLgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwKLQljb2ZmX2FybV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSwKLQljb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MsCi0JY29mZl9hcm1fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZGVkIHRoZXNlIG5ldyBmdW5jdGlvbnMuCi0JKGdsb2JhbCk6IE1hY3JvIHJlZGVmaW5pdGlvbnMgc2V0IHVwIHRvIHVzZSB0aGVzZSBuZXcgZnVuY3Rpb25zLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBBZGRlZCBjYWxsIHRvCi0JY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzKCkuCi0JKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogQWRkZWQgY29kZSB0byBzZXQgbWFjaGluZSB0eXBlIGJhc2VkIG9uCi0JYml0cyBzdG9yZWQgaW4gaW50ZXJuYWwgZmxhZ3MuCi0gIAkoY29mZl9zZXRfZmxhZ3MpOiBBZGRlZCBjb2RlIHRvIHNldCB0aGUgbmV3IGJpdHMgaW4gdGhlIGZsYWdzCi0JZmllbGQgYmFzZWQgb24gdGhlIG1hY2hpbmUgbnVtYmVyLgotCShmdW5jdGlvbiBkZWZpbml0aW9uIG1hY3Jvcyk6IE1hZGUgYWxsIGZ1bmN0aW9uIGRlZmluaXRpb24gbWFjcm9zCi0JY29uZGl0aW9uYWwgc28gdGhhdCB0aGV5IGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRhcmdldCBzcGVjaWZpYwotCWZpbGVzLgotCi0JKiBjcHUtYXJtLmMgKGNvbXBhdGlibGUpOiBBZGRlZCB0aGlzIGZ1bmN0aW9uLiAgKGFyY2hfaW5mb19zdHJ1Y3QpOgotCVN0cnVjdHVyZSBleHRlbmRlZCB0byBpbmNsdWRlIG5ldyB0eXBlcywgb25lIGVhY2ggZm9yIEFSTXYyLAotCUFSTXYyYSwgQVJNdjMsIEFSTXYzTSwgQVJNdjQgYW5kIEFSTXY0VC4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl90ZGF0YSk6ICBBZGRlZCBmbGFncyBmaWVsZC4KLQotRnJpIE1heSAgOSAxNzo0MDowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni0qLWdudSopOiBEb24ndCBpbmNsdWRlIE1hY2ggc3VwcG9ydC4KLQotCSogY29uZmlnLmJmZDogQ2hhbmdlICNpZiAwIGFyb3VuZCB1c2VzIG9mIGhvc3RfYW91dF92ZWMgdG8gI2lmCi0JSEFWRV9ob3N0X2FvdXRfdmVjLgotCi1Nb24gTWF5ICA1IDEzOjU3OjMyIDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBJZiB0aGVyZSBhcmUgbm8gc3ltZW50cywKLQlqdXN0IHJldHVybiBmYWxzZS4KLQotTW9uIE1heSAgNSAxODoxODo0NSAxOTk3ICBQaGlsaXAgQmx1bmRlbGwgIDxwamIyN0BjYW0uYWMudWs+Ci0KLQkqIGNvbmZpZy5iZmQ6IGNvcGUgd2l0aCAnKi0qLWxpbnV4LWdudWFvdXQnIHRhcmdldHMuCi0KLVRodSBNYXkgIDEgMTE6MzE6MTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0YXJnbWF0Y2guc2VkOiBBZGQgZXhwbGljaXQgXG4gY2hhcmFjdGVycyB0byB3b3JrIGFyb3VuZCBidWcgaW4KLQlIUC9VWCAxMC4yMCBzZWQgcHJvZ3JhbS4KLQotV2VkIEFwciAzMCAxMjoyNzowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDYXN0IGNzZWNzIHRvIGF2b2lkIHNpZ24KLQlleHRlbnNpb24gcHJvYmxlbXMuCi0KLVR1ZSBBcHIgMjIgMTI6MDY6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZG9fbWFpbnRhaW5lcl9jbGVhbik6IERvbid0IHJlbW92ZSBiZmQtaW4yLmguCi0KLU1vbiBBcHIgMjEgMTE6MjE6MzEgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZjMyLW02OGsuYzogRm9sbG93IHRoZSBsYXN0IGNoYW5nZXMgaW4gZWxmMzItaTM4Ni5jOgotCShzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCwgc3RydWN0Ci0JZWxmX202OGtfbGlua19oYXNoX2VudHJ5LCBzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX3RhYmxlLAotCWVsZl9tNjhrX2xpbmtfaGFzaF90cmF2ZXJzZSwgZWxmX202OGtfaGFzaF90YWJsZSwKLQllbGZfbTY4a19saW5rX2hhc2hfbmV3ZnVuYywgZWxmX202OGtfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwKLQllbGZfbTY4a19kaXNjYXJkX2NvcGllcywgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKToKLQlOZXcgZGVmaW5pdGlvbnMuCi0JKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IElmIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLCBkb24ndCBjb3B5Ci0JUEMgcmVsYXRpdmUgcmVsb2NzIGZvciBhIGdsb2JhbCBzeW1ib2wgZGVmaW5lZCBpbiBhIHJlZ3VsYXIKLQlvYmplY3QsIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlIHJlbG9jcyBjb3BpZWQgZm9yIGFueQotCWdsb2JhbCBzeW1ib2wuCi0JKGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLAotCXRyYXZlcnNlIHdpdGggZWxmX202OGtfZGlzY2FyZF9jb3BpZXMuCi0KLVNhdCBBcHIgMTkgMjI6NTA6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IE9ubHkgY291bnQgUEMgcmVsYXRpdmUKLQlyZWxvY3MuICBGcm9tIEphbWllIExva2llciA8amFtaWVAcmViZWxsaW9uLmNvLnVrPi4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBGb3JjZSB0aGUKLQlwb3RlbnRpYWwgbGFzdCBieXRlIGluIHRoZSBmaWxlIHRvIGJlIHdyaXR0ZW4gb3V0IHdoZW4KLQlDT0ZGX0lNQUdFX1dJVEhfUEUuCi0KLVRodSBBcHIgMTcgMTM6NDY6NTYgMTk5NyAgUGVyIEZvZ2Vsc3Ryb20gIDxwZWZvQG9wZW5ic2Qub3JnPgotCi0JKiBjb25maWd1cmUuaG9zdCAobWlwcyotKi1vcGVuYnNkKik6IE5ldyBob3N0LgotCi1UaHUgQXByIDE3IDExOjEwOjU0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBPbmx5IHN1YnRyYWN0IHRoZQotCXNlY3Rpb24gVk1BIGZyb20gdGhlIHN5bWJvbCB2YWx1ZSBpZiB0aGlzIGlzIGEgZnVsbHkgbGlua2VkIGZpbGUuCi0KLQkqIGVsZjMyLWkzODYuYyAoc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQpOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkpOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKGVsZl9pMzg2X2xpbmtfaGFzaF90cmF2ZXJzZSk6IERlZmluZS4KLQkoZWxmX2kzODZfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoZWxmX2kzODZfbGlua19oYXNoX25ld2Z1bmMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogSWYgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIGRvbid0IGNvcHkKLQlQQyByZWxhdGl2ZSByZWxvY3MgZm9yIGEgZ2xvYmFsIHN5bWJvbCBkZWZpbmVkIGluIGEgcmVndWxhcgotCW9iamVjdCwgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIGNvcGllZCBmb3IgYW55Ci0JZ2xvYmFsIHN5bWJvbC4KLQkoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsCi0JdHJhdmVyc2Ugd2l0aCBlbGZfaTM4Nl9kaXNjYXJkX2NvcGllcy4KLQkoZWxmX2kzODZfZGlzY2FyZF9jb3BpZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEZWZpbmUuCi0KLQlGcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPjoKLQkqIGFvdXRmMS5oIChNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBVc2UgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzLgotCi1XZWQgQXByIDE2IDEyOjQzOjMyIDE5OTcgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMzB2LmMgKGVsZl9kMzB2X2hvd3RvX3RhYmxlKTogQ2hhbmdlZCBzaXplIG9mCi0JUl9EMzBWXzMyX05PUk1BTCB0byAyICg0IGJ5dGVzKS4KLQotV2VkIEFwciAxNiAxNDowMjoyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPjoKLQkqIG5ldGJzZC5oIChOX1NIQVJFRF9MSUIpOiBEZWZpbmUuCi0JKFNFR01FTlRfU0laRSk6IERvbid0IGRlZmluZS4KLQkqIG02OGtuZXRic2QuYyAoU0VHTUVOVF9TSVpFKTogRG9uJ3QgZGVmaW5lIChyZXZlcnQgY2hhbmdlIG9mCi0JQXByaWwgMTEpLgotCSogc3BhcmNuZXRic2QuYyAoVEFSR0VUX1BBR0VfU0laRSk6IERlZmluZSBhcyAweDIwMDAuCi0JKFNFR01FTlRfU0laRSk6IERvbid0IGRlZmluZS4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogU2V0IC5yZWxhLmJzcyBzaXplCi0JdG8gc2l6ZW9mIFJlbGEgc3RydWN0dXJlLCBub3Qgc2l6ZW9mIFJlbCBzdHJ1Y3R1cmUuICBGcm9tIEdhcnkKLQlUaG9tYXMgPGcudGhvbWFzQG9wZW5ncm91cC5vcmc+LgotCi1UdWUgQXByIDE1IDExOjUwOjM3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dC10YXJnZXQuaCAoTVkoY2FsbGJhY2spKTogSWYgZW50cnlfaXNfdGV4dF9hZGRyZXNzLCBhZGp1c3QKLQl3aGVuZXZlciBlbnRyeSBpcyBsYXJnZXIgdGhhbiB0ZXh0IGFkZHJlc3MsIGJ1dCBvbmx5IGJ5IHdob2xlCi0JcGFnZXMuICBGcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPi4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEZXBlbmQgdXBvbiBpbnN0YWxsZGlycy4gIFVzZQotCW1raW5zdGFsbGRpcnMgdG8gYnVpbGQgJChvbGRpbmNsdWRlZGlyKS4KLQkoaW5zdGFsbGRpcnMpOiBOZXcgdGFyZ2V0LgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGNhbGwgY2hlY2tfcmVsb2NzCi0JaWYgdGhpcyBpcyBhIGRlYnVnZ2luZyBzZWN0aW9uIHdoaWNoIHdlIGFyZSBzdHJpcHBpbmcuCi0KLU1vbiBBcHIgMTQgMTI6Mzk6MzAgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX29iamVjdF9wKTogQWxsb2NhdGUgdGhlCi0JYWxwaGEtc3BlY2lmaWMgdGFyZ2V0IGRhdGEgc3RydWN0LgotCi1Nb24gQXByIDE0IDExOjQ1OjQ2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gVGhvbWFzIEdyYWljaGVuIDxncmFpY2hlbkByenBkLmRlPjoKLQkqIE1ha2VmaWxlLmluOiBBbHdheXMgdXNlICQoU0hFTEwpIHdoZW4gcnVubmluZyBtb3ZlLWlmLWNoYW5nZS4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Q09ORklHX1NIRUxMfSB3aGVuIHJ1bm5pbmcgJGFjX2NvbmZpZ19zdWIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBcHIgMTEgMTU6NDM6MjQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBPbmx5IHN1YnRyYWN0IHRoZSBzZWN0aW9uCi0JVk1BIGlmIHRoaXMgaXMgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIGEgc2hhcmVkIG9iamVjdC4KLQotCSogdGFyZ2V0cy5jIChuZXRic2RfY29yZV92ZWMpOiBEZWNsYXJlLiAgRnJvbSBHb3Jkb24gVy4gUm9zcwotCTxnd3JAbWMuY29tPi4KLQotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBBZGQgZW50cnlfaXNfdGV4dF9hZGRyZXNzCi0JZmllbGQuCi0JKiBhb3V0LXRhcmdldC5oIChTRUdNRU5UX1NJWkUpOiBEZWZpbmUgdG8gVEFSR0VUX1BBR0VfU0laRSBhdCB0aGUKLQlzdGFydCBvZiB0aGUgZmlsZS4gIFJlbW92ZSB1c2VzIGxhdGVyIG9uIHdoaWNoIHN3aXRjaCB1c2luZwotCWlmZGVmLgotCShNWShjYWxsYmFjaykpOiBIYW5kbGUgZW50cnlfaXNfdGV4dF9hZGRyZXNzLgotCShNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKE1ZKGJhY2tlbmRfZGF0YSkpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGFvdXRmMS5oIChzdW5vczRfYW91dF9iYWNrZW5kKTogTGlrZXdpc2UuCi0JKiBpMzg2YW91dC5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBpMzg2bWFjaDMuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogbWlwc2JzZC5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBzcGFyY2x5bnguYyAoc3BhcmNseW54X2FvdXRfYmFja2VuZCk6IExpa2V3aXNlLgotCSogbmV0YnNkLmggKFNFR01FTlRfU0laRSk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzKTogRGVmaW5lLgotCSogbTY4a25ldGJzZC5jIChTRUdNRU5UX1NJWkUpOiBEZWZpbmUgYXMgMHgyMDAwMC4KLQotCSogeGNvZmZsaW5rLmMgKGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sKTogSGFuZGxlIGltcG9ydGluZyBhIHN5bWJvbAotCXdob3NlIG5hbWUgc3RhcnRzIHdpdGggYC4nLgotCi1GcmkgQXByIDExIDExOjU3OjE1IDE5OTcgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqIGNvbmZpZy5iZmQ6IChpWzM0NTZdODYtKi1vcGVuYnNkKiwgbTY4Ki0qLW9wZW5ic2QqLAotCW1pcHMqZWwqLSotb3BlbmJzZCosIG1pcHMqLSotb3BlbmJzZCosIG5zMzJrLSotb3BlbmJzZCosCi0JcG93ZXJwYy0qLSpic2QqLCBzcGFyYy0qLW9wZW5ic2QqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1Nl04Ni0qLW9wZW5ic2QqLCBtaXBzKi0qLW9wZW5ic2QqLAotCW02OCotKi1vcGVuYnNkKiwgbnMzMmstKi1vcGVuYnNkKiwgcG93ZXJwYy0qLSpic2QqLAotCXNwYXJjLSotb3BlbmJzZCopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEFwciAgOCAxODowOToyOSAxOTk3ICBKYW1pZSBMb2tpZXIgIDxqYW1pZUByZWJlbGxpb24uY28udWs+Ci0KLQkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbyk6IE5ldyBmaWVsZAotCWBjdW11bGF0aXZlX3NraXBzJy4KLQkoX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMpOiBGaWxsIHRoZSBhYm92ZSBhcnJheS4KLQkoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0KTogVXNlIGBjdW11bGF0aXZlX3NraXBzJyB0bwotCXNwZWVkIHVwIG9mZnNldCBjYWxjdWxhdGlvbi4KLQotVHVlIEFwciAgOCAwMDowMTozMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBlbGYtbW4xMDMwMC5jIChtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogRG9uJ3QgZm9yZ2V0IHRoZQotICAgICAgICBhZGRlbmQgZm9yIG5vbiBwYy1yZWxhdGl2ZSByZWxvY2F0aW9ucy4KLQotCSogZWxmLW0xMDMwMC5jIChiZmRfZWxmMzJfbW4xMDMwMF9yZWxvYyk6IFJlbW92ZSBwcm90b3R5cGUKLQlmb3Igbm9uLWV4aXN0ZW50IGZ1bmN0aW9uLgotCi0JKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKG1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IExpa2V3aXNlLgotCShtbjEwMzAwX2VsZl9zeW1ib2xfYWRkcmVzc19wKTogTGlrZXdpc2UuCi0JKG1uMTAzMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCi0JKGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLU1vbiBBcHIgIDcgMTY6NDc6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IFNITElCX0xJQlMuCi0JKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgU0hMSUJfTElCUy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChTSExJQl9MSUJTKTogTmV3IHZhcmlhYmxlLgotCSgkKFNITElCKSk6IFVzZSAkKFNITElCX0xJQlMpLgotCi1Nb24gQXByICA3IDEwOjUzOjUyIDE5OTcgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oIGJmZC1pbjIuaDogYWRkIGJmZF9zZWN0aW9uX2xtYSBtYWNybyB0byBjb3JyZXNwb25kCi0Jd2l0aCBiZmRfc2VjdGlvbl92bWEuCi0KLUZyaSBBcHIgIDQgMTE6Mzc6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVwZGF0ZSBmaWxlIG5hbWVzIGZvciBiZmRfZWxmMzJfbW4xMFsyM10wMF92ZWMuCi0JQ29ycmVjdCBDUFUgZmlsZSBuYW1lcyBmb3IgbW4xMFsyM10wMC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogYmZkLmMgKGJmZF9yZWNvcmRfcGhkcik6IENhc3QgY291bnQgdG8gc2l6ZV90IGJlZm9yZQotCXN1YnRyYWN0aW9uLgotCi0JKiBjb2ZmLXBwYy5jIChkdW1wX3RvYyk6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcgZnJvbSBTdW5PUyBjYy4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX3JlYWRfYXJfaGRyKTogTGlrZXdpc2UuCi0JKHhjb2ZmX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBMSWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9jcmVhdGVfcHJvY2VkdXJlX3RhYmxlKTogTGlrZXdpc2UuCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogTGlrZXdpc2UuCi0JKHBlX3ByaW50X2VkYXRhLCBwZV9wcmludF9wZGF0YSwgcGVfcHJpbnRfcmVsb2MpOiBMaWtld2lzZS4KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IExpa2V3aXNlLgotCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQotCSogcHBjYm9vdC5jIChwcGNib290X3NldF9hcmNoX21hY2gpOiBNYWtlIHN0YXRpYy4KLQkocHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2N0b3I2NF9ob3d0byk6IFNldCBjb21wbGFpbl9vbl9vdmVyZmxvdwotCXRvIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZC4KLQotVGh1IEFwciAgMyAxMTo1MTo1NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIFZFUlNJT046IFNldCB0byAyLjguMS4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi44LgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiAgRG9uJ3QgY2hlY2sgU0VDX0FMTE9DIHdoZW4KLQlkZWNpZGluZyB3aGV0aGVyIHRvIGNvcHkgYSByZWxvYyBpbnRvIGEgc2hhcmVkIG9iamVjdC4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuICBSZWxvY2F0ZSBSX1BQQ19SRUxBVElWRQotCXJlbG9jcyBpbiB1bmFsbG9jYXRlZCBzZWN0aW9ucy4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBSZWxvY2F0ZQotCVJfU1BBUkNfUkVMQVRJVkUgcmVsb2NzIGluIHVuYWxsb2NhdGVkIHNlY3Rpb25zLgotCi1XZWQgQXByICAyIDE2OjE5OjQxIDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBVbmRvIE1hcmNoIDI2IGNoYW5nZSBhbmQKLQlhbHdheXMgY3JlYXRlIGdvdCBzZWN0aW9uIHNvIHRoYXQgdGhlIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBsYWJlbAotCWlzIGFsd2F5cyBjcmVhdGVkLgotCi1XZWQgQXByICAyIDEwOjQ5OjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBMZXQgYSBjb21tb24gc3ltYm9sCi0Jb3ZlcnJpZGUgYW4gdW5pbml0aWFsaXplZCBzeW1ib2wgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5IHdpdGggYQotCXNtYWxsZXIgc2l6ZS4KLQotCSogZWxmLW0xMDIwMC5jOiBSZW5hbWUgZnJvbSBlbGYzMi1tbjEwMjAwLmMuCi0JKiBlbGYtbTEwMzAwLmM6IFJlbmFtZSBmcm9tIGVsZjMyLW1uMTAzMDAuYy4KLQkqIGNwdS1tMTAyMDAuYzogUmVuYW1lIGZyb20gY3B1LW1uMTAyMDAuYwotCSogY3B1LW0xMDMwMC5jOiBSZW5hbWUgZnJvbSBjcHUtbW4xMDMwMC5jCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlIGFjY29yZGluZ2x5LgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2N0b3I2NF9ob3d0byk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGVsZl9taXBzX2lzYSk6IE1vdmUgdG8gZWFybGllciBpbiBmaWxlLgotCShtaXBzX3JlbG9jX21hcCk6IFJlbW92ZSBCRkRfUkVMT0NfQ1RPUiBlbnRyeS4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfQ1RPUgotCXNwZWNpYWxseS4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzMTZfanVtcF9yZWxvYyk6IFByaW50IGEgd2FybmluZyByYXRoZXIgdGhhbgotCWNhbGxpbmcgYWJvcnQuCi0KLVR1ZSBBcHIgIDEgMTY6MTg6MDUgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5jb206IE5ldyBmaWxlLgotCSogY29uZmlnLmgtdm1zOiBSZW1vdmUgZmlsZS4KLQkqIG1ha2VmaWxlLnZtczogVXBkYXRlIGZvciBuZXcgY29uZmlndXJlIHNjaGVtZS4KLQotTW9uIE1hciAzMSAyMzoyODozOSAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBsaWJjb2ZmLWluLmggKHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbik6IERlY2xhcmUuCi0JKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogRGVjbGFyZSBpZiBub3QgYSBtYWNyby4KLQotTW9uIE1hciAzMSAxNjoyOTo1MCAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy5iZmQgKGhwcGEqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBocHBhLSotKmVsZiouCi0KLU1vbiBNYXIgMzEgMTY6MTE6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWEyOWsuYyAoY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCB1c2Ugc3ltbmR4IGFzIGEKLQlzeW1ib2wgaW5kZXggZm9yIGEgUl9JSENPTlNUIHJlbG9jLgotCi1Nb24gTWFyIDMxIDE1OjQwOjU5IDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIHRhcmdtYXRjaC5zZWQ6IERvIG5vdCB1c2UgXChcKSByZWN1cnNpdmVseS4KLQotRnJpIE1hciAyOCAxNDo0NDowOCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBtNjhrbGludXguYyAoTUFDSFRZUEVfT0spOiBEZWZpbmUuCi0JKiBpMzg2bGludXguYyAoTUFDSFRZUEVfT0spOiBEZWZpbmUuCi0KLUZyaSBNYXIgMjggMTE6NTY6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGNhaXAucnV0Z2Vycy5lZHU+IGFuZCBILkouIEx1Ci0JPGhqbEBnbnUuYWkubWl0LmVkdT46Ci0JKiBzcGFyY2xpbnV4LmM6IE5ldyBmaWxlLgotCSogYmZkLWluLmggKGJmZF9zcGFyY2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBjb25maWcuYmZkIChzcGFyYy0qLWxpbnV4YW91dCosIHNwYXJjLSotbGludXgqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjbGludXhfdmVjKTogQWRkIHRvIGxpc3Qgb2YgdmVjdG9ycy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIHRhcmdldHMuYyAoc3BhcmNsaW51eF92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBzcGFyY2xpbnV4X3ZlYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgc3BhcmNsaW51eC5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgc3BhcmNsaW51eC5jLgotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldwotCWJmZF9jb2ZmX2JhY2tlbmRfZGF0YSBmaWVsZC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBiZmRfZWxmNjRfe2JpZyxsaXR0bGV9bWlwc192ZWMgdG8gdGFyZ19zZWx2ZWNzCi0JZm9yIG1pcHMqZWwqLSotbGludXgqIGFuZCBtaXBzKi0qLWxpbnV4Ki4gIEZyb20gSC5KLiBMdQotCTxoamxAbHVjb24ub3JnPiBhbmQgUmFsZiBCYWVjaGxlIDxyYWxmQGdudS5haS5taXQuZWR1Pi4KLQotCSogYmZkLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4KLQkoc3RyZXJyb3IpOiBEb24ndCBkZWNsYXJlLgotCShiZmRfZXJybXNnKTogQ2FsbCB4c3RyZXJyb3IgcmF0aGVyIHRoYW4gc3RyZXJyb3IuCi0KLVRodSBNYXIgMjcgMTI6NTU6NDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEdlbmVyYXRlIGEgQ09QWQotCXJlbG9jIGV2ZW4gaWYgdGhlIHN5bWJvbCBpcyBpbiB0aGUgLmJzcyBzZWN0aW9uLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGQKLQlfYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlci4KLQkoYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlcik6IERlZmluZS4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExpbWl0IGFsaWdubWVudCBvZiBhIGNvbW1vbgotCXN5bWJvbCB0byB0aGUgZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudC4KLQotCSogQ09QWUlORzogVXBkYXRlIEZTRiBhZGRyZXNzLgotCi1UaHUgTWFyIDI3IDAwOjQ1OjU3IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMzB2LmMgKGVsZl9kMzB2X2hvd3RvX3RhYmxlKTogRml4IGEgdHlwbyBpbiB0aGUKLQkyMS1iaXQgYWJzb2x1dGUgdGhhdCBtYWRlIGl0IGFjdCBhcyBhIHJlbGF0aXZlLgotCi1XZWQgTWFyIDI2IDE0OjUwOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBEb24ndCBzZXQKLQlic3Nfc2VjdGlvbiBhbmQgcmVsX3NlY3Rpb24gZnJvbSBleGlzdGluZyBzZWN0aW9ucy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogT25seSBjcmVhdGUgdGhlIGdvdCBzZWN0aW9uCi0JaWYgaXQgaXMgbmVlZGVkLgotCi1UdWUgTWFyIDI1IDIyOjI2OjU2IDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6ICBDaGFuZ2UgZXhlY3V0YWJsZSB0ZXN0IHRvIGZpeAotCXByb2JsZW1zIHdpdGggZW1iZWRkZWQgYS5vdXQgc3lzdGVtcy4KLQotVHVlIE1hciAyNSAxNDozNTozNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBBZGp1c3QgdGhlIG9mZnNldCBvZiBhCi0Jc3RhYiByZWxvYy4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIHN0YWJzLmMgKF9iZmRfbGlua19zZWN0aW9uX3N0YWJzKTogQ29weSBvdmVyIHRoZSBmaXJzdCBoZWFkZXIKLQlzeW1ib2wuICBDaGVjayBmb3IgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBvZiAqcHNpbmZvLgotCShfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMpOiBBZGQgcHNpbmZvIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLiAgU2V0IHRoZSB2YWx1ZSBvZiB0aGUgaGVhZGVyIHN5bWJvbC4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotTW9uIE1hciAyNCAyMDowNzoyOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jICh0aWM4MF9ob3d0b190YWJsZSk6IEFkZCBSX0FCUyBlbnRyeS4KLQkocnR5cGUyaG93dG8pOiBIYW5kbGUgUl9BQlMgcmVsb2MgdHlwZS4gIEFsc28gYWJvcnQgb24gdW5oYW5kbGVkCi0JcmVsb2MgdHlwZXMsIHJhdGhlciB0aGFuIHNpbGVudGx5IGZhaWxpbmcgdG8gZ2VuZXJhdGUgYW4gb3V0cHV0IGZpbGUuCi0KLU1vbiBNYXIgMjQgMTM6NDE6MDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0YXJnbWF0Y2guc2VkOiBVc2UgdGhlIGhvbGQgc3BhY2UgdG8gcHV0IHRoZSAjaWZkZWYgYXJvdW5kIHRoZQotCXRoZSBzdHJpbmcgY29uc3RhbnQuCi0JKiB0YXJnZXRzLmMgKFVOU1VQUE9SVEVEX1RBUkdFVCk6IERvbid0IGRlZmluZS4KLQkoZmluZF90YXJnZXQpOiBEb24ndCBjaGVjayBmb3IgVU5TVVBQT1JURURfVEFSR0VULgotCShiZmRfc2V0X2RlZmF1bHRfdGFyZ2V0KTogRG9uJ3QgdHJ5IHRvIG9wdGltaXplIGJ5IGNoZWNraW5nIGZvcgotCWRlZmF1bHQuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgY3B1LW0zMnIuYy4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjMyLW0zMnIuYy4KLQkoZWxmMzItbTMyci5vKTogUmVtb3ZlIGV4cGxpY2l0IHRhcmdldC4KLQotCSogY29uZmlnLmJmZDogRG9uJ3Qgc2V0IHRhcmdfdW5kZXJzY29yZSBmb3IgaVszNDU2XTg2LSotZ251KiBvcgotCWlbMzQ1Nl04Ni0qLWxpbnV4Ki4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QKLQljb3VudCBzZWN0aW9uIHN5bWJvbHMgZm9yIHNlY3Rpb25zIHRoYXQgd2VyZSBjcmVhdGVkIGJ5IHRoZQotCWxpbmtlciwgb3IgYXJlIG5vdCBhbGxvY2F0YWJsZSBvciBub3QgbG9hZGFibGUuCi0JKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogT3V0cHV0IG91dHB1dCBzZWN0aW9uCi0Jc3ltYm9scyBmb3Igc2VjdGlvbiBmb3Igd2hpY2ggd2UgbWFkZSBzcGFjZSBmb3IgdGhlbS4KLQotRnJpIE1hciAyMSAxMzowODoyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIHRoZXJlIGlzCi0Jbm8gLnJlbGEucGx0IHNlY3Rpb24sIGRvbid0IG91dHB1dCBhIERUX1BMVEdPVCBkeW5hbWljIGVudHJ5LgotCi1GcmkgTWFyIDIxIDEyOjM2OjQ2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfaG93dG9fdGFibGUpOiBVc2Ugc3BlY2lhbCBmdW5jdGlvbiBmb3IgTE8xNi4KLQkobTMycl9oaTE2X2xpc3QpOiBOZXcgc3RhdGljIGxvY2FsLgotCShtMzJyX2VsZl9oaTE2X3JlbG9jKTogRG9uJ3QgcGVyZm9ybSByZWxvYywganVzdCBxdWV1ZSBpdCB1cC4KLQkobTMycl9lbGZfZG9faGkxNl9yZWxvYyk6IERlbGV0ZS4KLQkobTMycl9lbGZfcmVsb2NhdGVfaGkxNik6IE5ldyBmdW5jdGlvbi4KLQkobTMycl9lbGZfbG8xNl9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkobTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEZvciBISTE2IHJlbG9jcywgc2NhbiBmb3IgY29ycmVzcG9uZGluZwotCUxPMTYgcmVsb2MuCi0KLQlNb24gTWFyIDEwIDE2OjAzOjMxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IERlbGV0ZS4KLQkobTMycl9lbGZfYWRkX3N5bWJvbF9ob29rKTogUmV3cml0ZSBfU0RBX0JBU0VfIHN1cHBvcnQuCi0JKG0zMnJfZWxmX2ZpbmFsX3NkYV9iYXNlKTogTmV3IGZ1bmN0aW9uLgotCShtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmV3cml0ZSBzZGF0YSBzdXBwb3J0LgotCShtMzJyX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IERlbGV0ZS4KLQotVGh1IE1hciAyMCAxMjozOTowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQGluZm8udWNsLmFjLmJlPi4KLQkqIGNvZmYtc3ZtNjhrLmM6IE5ldyBmaWxlLiAgSnVzdCBkZWZpbmVzIHNvbWUgbWFjcm9zIGFuZCBpbmNsdWRlcwotCWNvZmYtbTY4ay5jLgotCSogY29mZi1tNjhrLmM6IEFkZCBmdW5jdGlvbnMgdG8gaGFuZGxlIGNvbW1vbiBhZGRlbmRzLCBtb3ZlZCBpbgotCWZyb20gY2YtbTY4a2x5bnguYy4gIENvbnRyb2wgdGhlbSB1c2luZyBDT0ZGX0NPTU1PTl9BRERFTkQgbWFjcm8uCi0JQ29udHJvbCB3aGV0aGVyIHJlbG9jcyBhcmUgdmlzaWJsZSB1c2luZyBTVEFUSUNfUkVMT0NTLgotCSogY2YtbTY4a2x5bnguYzogU2ltcGxpZnkgZ3JlYXRseToganVzdCBkZWZpbmUgbWFjcm9zIHRvIGNvbnRyb2wKLQljb2ZmLW02OGsuYy4KLQkqIGNvZmYtYXV4LmM6IExpa2V3aXNlLiAgSnVzdCBsZWF2ZSBhZGRfb25lX3N5bWJvbCByb3V0aW5lLgotCSogdGFyZ2V0cy4gKG02OGtzeXN2Y29mZl92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBtNjhrc3lzdmNvZmZfdmVjLgotCSogY29uZmlnLmJmZCAobTY4Ki1tb3Rvcm9sYS1zeXN2Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKG02OGtzeXN2Y29mZl92ZWMpOiBOZXcgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1zdm02OGsuby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGNvZmYtc3ZtNjhrLmMuCi0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEb24ndCBnZXQgbWlzbGVkIGlmIHRoZQotIAlmaXJzdCBzZWN0aW9uIGlzIG5vdCBsb2FkYWJsZS4gIEZyb20gTWF0dGhldyBMLiBNYXJ0aW4KLSAJPG1sbUB4ZWRpYS5jb20+LgotCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IFNldCB0aGUgdmFsdWUgb2YgYSBzZWN0aW9uCi0Jc3ltYm9sIHRvIHRoZSBzZWN0aW9uIGFkZHJlc3MgdW5sZXNzIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsuCi0KLVR1ZSBNYXIgMTggMjM6MDM6MTcgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IGNyZWF0ZQotCS5wbHQgZW50cnkgaWYgd2UndmUgdGFrZW4gdGhlIGZ1bmN0aW9uJ3MgYWRkcmVzcy4KLQkoZWxmNjRfYWxwaGFfbWVyZ2VfZ290cyk6IE1lcmdlIGNvbGxlY3RlZCBmbGFncyBpbmZvIGFzIHdlbGwuCi0KLVR1ZSBNYXIgMTggMjI6NDA6MDkgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIE1hbnkgZmlsZXM6IEFkZCBmdW5jdGlvbiBwcm90b3R5cGVzLgotCSogY3B1LW02OGsuYyAoYmZkX2RlZmF1bHRfc2Nhbl9udW1fbWFjaCk6IERvbid0IGRlY2xhcmUuCi0JKiBlY29mZmxpbmsuYzogSW5jbHVkZSAibGliY29mZi5oIiBhbmQgImxpYmVjb2ZmLmgiLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfZmFrZV9zZWN0aW9ucyk6IE1ha2Ugc3RhdGljLgotCSogb3BuY2xzLmMgKGJmZF9vcGVuc3RyZWFtcik6IENoYW5nZSBzdHJlYW0gcGFyYW1ldGVyIHRvIFBUUi4KLQkqIHBlaWNvZGUuaDogQ2hhbmdlIHNldmVyYWwgdm9pZCAqIHBhcmFtZXRlcnMgdG8gUFRSLgotCSogc3JlYy5jIChzcmVjX2dldF9zeW1ib2xfaW5mbyk6IE1ha2Ugc3RhdGljLgotCSogc3ltcy5jIChiZmRfc3ltYm9sX2lzX2Fic29sdXRlKTogUmVtb3ZlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi1UdWUgTWFyIDE4IDEyOjU4OjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogUmVtb3ZlLgotCShiZmRfZWxmMzJfYmZkX2lzX2xvY2FsX2xhYmVsKTogRG9uJ3QgZGVmaW5lLgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IENhbGwgYmZkX21hbGxvYyByYXRoZXIKLQl0aGFuIG1hbGxvYy4KLQotTW9uIE1hciAxNyAxMTozMjo1MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oOiBEb24ndCBpbmNsdWRlIG9ic3RhY2suaC4KLQkoc3RydWN0IGJmZF9oYXNoX3RhYmxlKTogQ2hhbmdlIG1lbW9yeSBmaWVsZCB0byBQVFIuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBDaGFuZ2UgbWVtb3J5IGZpZWxkIHRvIFBUUi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGxpYmJmZC1pbi5oIChiZmRfcmVsZWFzZSk6IERlY2xhcmUgYXMgZnVuY3Rpb24sIGRvbid0IGRlZmluZSBhcwotCW1hY3JvLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBvcG5jbHMuYzogSW5jbHVkZSAib2JqYWxsb2MuaCIgcmF0aGVyIHRoYW4gIm9ic3RhY2suaCIuICBVc2UKLQlvYmphbGxvYyByb3V0aW5lcyByYXRoZXIgdGhhbiBvYnN0YWNrIHJvdXRpbmVzLgotCShvYnN0YWNrX2NodW5rX2FsbG9jLCBvYnN0YWNrX2NodW5rX2ZyZWUpOiBEb24ndCBkZWZpbmUuCi0JKGdldHBhZ2VzaXplKTogRG9uJ3QgZGVmaW5lLgotCShfYmZkX25ld19iZmQpOiBEb24ndCBzZXQgX2JmZF9jaHVua3NpemUuCi0JKGJmZF9vcGVucik6IEZyZWUgbmV3IGJmZCBhbmQgb2JqYWxsb2Mgb24gZmFpbHVyZS4KLQkoYmZkX2Zkb3BlbnIsIGJmZF9vcGVuc3RyZWFtciwgYmZkX29wZW53KTogTGlrZXdpc2UuCi0JKGJmZF9hbGxvY19zaXplKTogUmVtb3ZlLgotCShiZmRfcmVsZWFzZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGhhc2guYzogSW5jbHVkZSAib2JqYWxsb2MuaCIgcmF0aGVyIHRoYW4gIm9ic3RhY2suaCIuICBVc2UKLQlvYmphbGxvYyByb3V0aW5lcyByYXRoZXIgdGhhbiBvYnN0YWNrIHJvdXRpbmVzLgotCShvYnN0YWNrX2NodW5rX2FsbG9jLCBvYnN0YWNrX2NodW5rX2ZyZWUpOiBEb24ndCBkZWZpbmUuCi0JKiBlY29mZmxpbmsuYzogSW5jbHVkZSAib2JqYWxsb2MuaCIgcmF0aGVyIHRoYW4gIm9ic3RhY2suaCIuICBVc2UKLQlvYmphbGxvYyByb3V0aW5lcyByYXRoZXIgdGhhbiBvYnN0YWNrIHJvdXRpbmVzLgotCShvYnN0YWNrX2NodW5rX2FsbG9jLCBvYnN0YWNrX2NodW5rX2ZyZWUpOiBEb24ndCBkZWZpbmUuCi0JKHN0cnVjdCBhY2N1bXVsYXRlKTogQ2hhbmdlIG1lbW9yeSB0byBzdHJ1Y3Qgb2JqYWxsb2MgKi4KLQkqIGxpYm9hc3lzLmggKG9hc3lzX2RhdGFfdHlwZSk6IFJlbW92ZSBvYXN5c19vYnN0YWNrIGZpZWxkLgotCSogZGVwLWluLnNlZDogRG9uJ3QgcmVtb3ZlIG9ic3RhY2suaCBmcm9tIGRlcGVuZGVuY3kgbGlzdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEX0hfREVQUyk6IFJlbW92ZSBvYnN0YWNrLmguCi0JKGluc3RhbGwpOiBEb24ndCBpbnN0YWxsIG9ic3RhY2suaC4KLQkqIE1hbnkgZmlsZXM6IERvbid0IGluY2x1ZGUgIm9ic3RhY2suaCIuCi0JKiBWRVJTSU9OOiBCdW1wLgotCi0JKiBvcG5jbHMuYyAoYmZkX2FsbG9jX2dyb3csIGJmZF9hbGxvY19maW5pc2gpOiBSZW1vdmUuCi0JKiBsaWJiZmQtaW4uaCAoYmZkX2FsbG9jX2dyb3csIGJmZF9hbGxvY19maW5pc2gpOiBEb24ndCBkZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBpZWVlLmMgKGllZWVfYXJjaGl2ZV9wKTogUmV3cml0ZSB0byBub3QgdXNlIGJmZF9hbGxvY19ncm93LgotCSogc3Vub3MuYyAoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IExpa2V3aXNlLgotCSogc3JlYy5jIChzcmVjX3NjYW4pOiBSZXdyaXRlIHRvIG5vdCB1c2Ugb2JzdGFja18xZ3Jvdy4KLQotCSogb3BuY2xzLmMgKGJmZF9hbGxvYyk6IFJlbmFtZSBmcm9tIGJmZF9hbGxvY19ieV9zaXplX3QuICBSZW1vdmUKLQlvbGQgdmVyc2lvbiBvZiBiZmRfYWxsb2MuCi0JKiBsaWJiZmQtaW4uaCAoYmZkX2FsbG9jX2J5X3NpemVfdCk6IERvbid0IGRlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIFNldmVyYWwgZmlsZXM6IENhbGwgYmZkX2FsbG9jIHJhdGhlciB0aGFuIGJmZF9hbGxvY19ieV9zaXplX3QuCi0KLVNhdCBNYXIgMTUgMTU6MjQ6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBBY2NlcHQgdGhlIGdlbmVyaWMKLQlFTEYgbG9jYWwgbGFiZWwgc3ludGF4IGFzIHdlbGwuCi0KLVNhdCBNYXIgMTUgMTA6MTY6NDIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGMtKi1iZW9zKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKHBvd2VycGMtKi1iZW9zKik6IEFkZCBjYXNlIHRoYXQgZXhwbGljaXRseQotCWRvZXMgbm90IHNldCBDT1JFRklMRSBmb3Igbm93LiAgQSBmdXR1cmUgQmVPUyB2ZXJzaW9uIGlzCi0JZXhwZWN0ZWQgdG8gc3VwcG9ydCBjb3JlIGZpbGVzLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYuCi0KLUZyaSBNYXIgMTQgMTY6NDM6MjIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IEdpdmUgYW4gZXJyb3IgaWYgQ0FMTDE2IGlzCi0gCXNlZW4gd2l0aCBhIGxvY2FsIHN5bWJvbCwgcmF0aGVyIHRoYW4gY3Jhc2hpbmcuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHRyeSB0byByZWFkIHRoZQotCXZlcnNpb24gc3ltYm9scyBpZiB0aGVyZSBhcmVuJ3QgYW55LgotCi1UaHUgTWFyIDEzIDE2OjM4OjMwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKGNvZmZfcnR5cGVfdG9faG93dG8pOiBEZWZpbmUKLQkoY29mZl90aWM4MF9ydHlwZV90b19ob3d0byk6IENsb25lIGdlbmVyaWMgY29mZiB2ZXJzaW9uIGFuZAotCWFkZCBjb2RlIHRvIGhhbmRsZSB0aGUgZnVua3kgVEkgImludGVybmFsIHJlbG9jYXRpb25zIi4KLQotVGh1IE1hciAxMyAxNDowODo1MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3Qgd2FybiBhYm91dCB0eXBlCi0Jb3Igc2l6ZSBjaGFuZ2VzIGJlY2F1c2Ugb2YgYSB3ZWFrIHN5bWJvbC4KLQotCSogY2lzY28tY29yZS5jIChTSUdFTVQpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0KLVdlZCBNYXIgMTIgMjE6MzY6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSBleHRzeW1vZmYgd2hlbgotCXNldHRpbmcgZXZlci4gIFNhbml0eSBjaGVjayB0aGUgdmVyc2lvbiBudW1iZXIuICBTb3J0IG91dCBjb3B5aW5nCi0JZmxhZ3MgYW5kIG90aGVyIGluZm9ybWF0aW9uIHdoZW4gYWRkaW5nIGFuIGluZGlyZWN0IHN5bWJvbC4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBQcmVzZXJ2ZSBhbnkgZHluYW1pYwotCXN5bWJvbHMgYWRkZWQgYnkgdGhlIGJhY2tlbmQuICBDbGVhciB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZQotCXZlcnN5bSBzZWN0aW9uLgotCShlbGZfZXhwb3J0X3N5bWJvbCk6IElnbm9yZSBpbmRpcmVjdCBzeW1ib2xzLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogQWNjZXB0IGEgc2VjdGlvbiB3aXRob3V0IGFuIG93bmVyIGluIGFuCi0JYXNzZXJ0LgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQWRkIGEgc2FuaXR5IGNoZWNrIG9uIHRoZQotCXZlcnNpb24gY291bnQuICBDb3JyZWN0IHRoZSBhbGxvY2F0aW9uIG9mIHhfdmVyc3ltcC4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBEb24ndCBzZXQgdGhlIG93bmVyIG9mCi0JdGhlIG1hZ2ljIHNlY3Rpb25zIHVzZWQgZm9yIFNITl9NSVBTX1RFWFQgYW5kIFNITl9NSVBTX0RBVEEuCi0JRG9uJ3QgcmV0dXJuIGJmZF91bmRfc2VjdGlvbl9wdHIgd2hlbiBpbmZvLT5zaGFyZWQuCi0JKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBTZXQgdGhlIGFsaWdubWVudCBvZiAucnRwcm9jIHRvIDQsIG5vdCAxMi4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDb3JyZWN0IHR5cGU6IF49IGZvciAmPS4KLQkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogUmVzb2x2ZSBhbiBpbmRpcmVjdCBzeW1ib2wgaW4KLQlzeW1faGFzaGVzLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBEb24ndCBjaGFuZ2UgU0hOX0FCUyBpbnRvCi0JU0hOX01JUFNfVEVYVCBvciBTSE5fTUlQU19EQVRBLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBUd2VhayB2ZXJzaW9uIG91dHB1dCBzbGlnaHRseS4KLQotVHVlIE1hciAxMSAwMTozODozNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBlbGYtYmZkLmggKEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCk6IERlZmluZS4KLQkqIGVsZi5jIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IENvcnJlY3QgZXJyb3JzIGluIGxhc3QgY2hhbmdlLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBIYW5kbGUgY2FzZXMgaW4gd2hpY2ggYQotCXZlcnNpb25lZCBzeW1ib2wgYXBwZWFycyBpbiBib3RoIGEgcmVndWxhciBhbmQgYSBzaGFyZWQgb2JqZWN0LgotCShlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBTZXQgRUxGX0xJTktfRk9SQ0VEX0xPQ0FMIHdoZW4KLQlhcHByb3ByaWF0ZS4gIEltcHJvdmUgZXJyb3IgbWVzc2FnZS4KLQkoc3RydWN0IGVsZl9vdXRleHRfaW5mbyk6IFJlbmFtZSBmcm9tIGVsZl9maW5mb19mYWlsZWQuICBDaGFuZ2UKLQlhbGwgdXNlcy4gIEFkZCBsb2NhbHN5bXMgZmllbGQuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBjYWxsCi0JZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSB0byBvdXRwdXQgYWxsIGxvY2FsIHN5bWJvbHMuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBIYW5kbGUgc3ltYm9scyB3aGljaCB3ZXJlIGZvcmNlZCB0bwotCWJlY29tZSBsb2NhbC4KLQotU3VuIE1hciAgOSAyMzowODo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBlbGYtYmZkLmggKGVsZl9zeW1ib2xfdHlwZSk6IEFkZCB2ZXJzaW9uIGZpZWxkLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IHZlcnNpb24gZmllbGQuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFdoZW4gY3JlYXRpbmcgYW4KLSAJaW5kaXJlY3Qgc3ltYm9sIGZvciBhIGRlZmF1bHQgdmVyc2lvbiBzeW1ib2wsIHNldCBERUZfRFlOQU1JQyBpZgotIAlhcHByb3ByaWF0ZS4gIFNldCB1cCBhbiBpbmRpcmVjdGlvbiBmcm9tIHRoZSBub25kZWZhdWx0IHZlcnNpb24gb2YKLQl0aGUgc3ltYm9sIGFzIHdlbGwuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQ2FsbAotCWVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbiBiZWZvcmUgY2hlY2tpbmcgd2hldGhlciB0aGVyZSBhcmUgYW55Ci0JdmVyc2lvbnMuICBBbHdheXMgcmVjb3JkIHRoZSB2ZXJzaW9uIG5hbWUgYXMgYSBkeW5hbWljIHN5bWJvbC4KLQlJbml0aWFsaXplIGNvdW50ZXJzLgotCShlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBBZnRlciBmaW5kaW5nIGEgdmVyc2lvbiwgc2VlIGlmIGEKLQlzeW1ib2wgc2hvdWxkIGJlIGZvcmNlZCB0byBsb2NhbCBzY29wZS4gIENyZWF0ZSBhIG5ldyB2ZXJzaW9uCi0JZGVmaW5pdGlvbiBpZiBhcHByb3ByaWF0ZS4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IENvcnJlY3QgaW5kaXJlY3Qgc3ltYm9sIGhhbmRsaW5nLgotCSogZWxmLmMgKGJmZF9lbGZfcHJpbnRfc3ltYm9sKTogUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbi4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogVHVybiB2ZXJzaW9uIHNlY3Rpb25zIGludG8gQkZEIHNlY3Rpb25zLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IE9ubHkgY29weSBjdmVyZGVmcyBhbmQgY3ZlcnJlZnMgaW50byBzaF9pbmZvCi0JaWYgc2hfaW5mbyBpcyBub3QgYWxyZWFkeSBzZXQuCi0JKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBDb3B5IHNoX2luZm8gZm9yIHZlcnNpb24KLQlzZWN0aW9ucy4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBUZWxsCi0JX2JmZF9zdHJpbmd0YWJfYWRkIHRvIGNvcHkgdGhlIG5hbWUgaW50byBwZXJtYW5lbnQgbWVtb3J5IGlmCi0JYXBwcm9wcmlhdGUuCi0KLUZyaSBNYXIgIDcgMTE6NTU6MzEgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3ApOiBGdWxseSBwYXJlbnRoZXNpemUuCi0KLUZyaSBNYXIgIDcgMTA6Mzc6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBDaGFuZ2UKLQlfYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIHRvIHJldHVybiBhIGJvb2xlYW4KLQl2YWx1ZS4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8KLQlib29sZWFuLiAgSWYgdGhlIHNpemUgb2YgdGhlIGxhc3Qgc2VjdGlvbiBjaGFuZ2VkLCB0aGVuIG91dHB1dCBhCi0JemVybyBieXRlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogQWx3YXlzIGFsbG9jYXRlIHNwYWNlCi0JZm9yIGF0IGxlYXN0IDYgb3V0cHV0IHN5bWJvbHMuCi0JKHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBXaGVuIGVtaXR0aW5nIFRPQyBlbnRyeSByZWxvY3MsIGFsc28KLQllbWl0IGEgVEMgY3NlY3QgdG8gcmVwcmVzZW50IHRoZSBzcGFjZSB0aGV5IHRha2UgdXAuICBGb3IgYW4gWE8KLQlzeW1ib2wsIGp1c3QgZW1pdCBhIHJlZmVyZW5jZSwgbm90IGEgY3NlY3QuCi0KLQkqIE1ha2VmaWxlLmluICgkKFNITElOSykpOiBKdXN0IHVzZSBsbiAtcywgbm90IGxuIC1zZiwgc2luY2UKLQlTb2xhcmlzIGRvZXNuJ3QgbGlrZSB0aGUgY29tYmluZWQgb3B0aW9ucywgYW5kIHRoZSAtZiBpcwotCXVubmVjZXNzYXJ5LgotCShzdGFtcC10c2hsaW5rLCBpbnN0YWxsKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENvcnJlY3QgUl9NSVBTMTZfMjYKLQloYW5kbGluZyB3aGVuIGxpdHRsZSBlbmRpYW4uCi0KLVRodSBNYXIgIDYgMTM6NTE6NTEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMzAwLmMgKG1uMTAzMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKG1uMTAzMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQotCSogZWxmMzItbW4xMDMwMC5jIChyZWxvY190eXBlKTogUmVtb3ZlIFBDUkVMezgsMTYsMzJ9X3sxLDJ9QllURQotCXJlbG9jcy4gIFJlcGxhY2UgdGhlbSB3aXRoIGdlbmVyaWMgUENSRUxfezgsMTYsMzJ9IHJlbG9jcy4KLQkoZWxmMzJfbW4xMDMwMF9ob3d0b190YWJsZSk6IExpa2V3aXNlLgotCShlbGYzMl9tbjEwMzAwX3JlbG9jX21hcCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfbW4xMDMwMF9yZWxvYyk6IERlbGV0ZSB1bnVzZWQgZnVuY3Rpb24uCi0KLVRodSBNYXIgIDYgMTI6MTk6NTkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAocnR5cGUyaG93dG8pOiBJZiBwYXNzZWQgYSByZWxvY2F0aW9uIHR5cGUgd2UgZG9uJ3QKLQl1bmRlcnN0YW5kLCBqdXN0IHNldCB0aGUgaG93dG8gZmllbGQgdG8gTlVMTCwgYW5kIHRoZSBjYWxsZXIgd2lsbAotCXByaW50IGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogUHVsbCBkdXBsaWNhdGUgZGVjbGFyYXRpb25zIGFuZAotCWNvZGUgZnJhZ21lbnQgb3V0IG9mIGJvdGggbGVncyBvZiAjaWZkZWYgUkVMT0NfUFJPQ0VTU0lORyAuLi4gI2VuZGlmCi0JYmxvY2suICBVc2UgTlVMTCBmb3IgaW5pdGlhbGl6YXRpb25zIG9mICJwdHIiIHJhdGhlciB0aGFuIGJhcmUgMC4KLQkqIGNvZmYtaDgzMDAuYzogRml4IHR5cG8gaW4gY29tbWVudC4KLQkqIGNvZmYtaDg1MDAuYzogRGl0dG8uCi0JKiBjb2ZmLXc2NS5jOiBEaXR0bwotCSogY29mZi16OGsuYzogRGl0dG8uCi0KLVdlZCBNYXIgIDUgMTM6NTk6MDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfZG9fMTBfcGNyZWxfcmVsb2MpOiBGaXggb3ZlcmZsb3cgY2FsYy4KLQkobTMycl9lbGZfcmVsYXhfc2VjdGlvbiwgbTMycl9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzLAotCW0zMnJfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEZpcnN0IHBhc3MgYXQgcmVsYXggc3VwcG9ydC4KLQotTW9uIE1hciAgMyAxMzoyNzowOSAxOTk3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogVXNlIGNvcnJlY3Qgc2hfc2l6ZQotCWVudHJ5IGZvciByZWFkaW5nIHZlcmRlZiByZWNvcmRzLgotCVVzZSBjb3JyZWN0IGJyYWNlcyBmb3IgY29tcHV0aW5nIGluY3JlbWVudHMgb2YgZXh0dmVyZGF1eCBhbmQKLQlleHRldmVyZGVmIHJlY29yZCBwb2ludGVycy4KLQotU3VuIE1hciAgMiAyMjo0Nzo1NCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jIChDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIpOiBTZXQgdGhpcyB0byAyCi0JaW5zdGVhZCBvZiA0LgotCi1TdW4gTWFyICAyIDE2OjI1OjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzKTogQ2hlY2sgdGhhdAotCURFRl9SRUdVTEFSIGlzIG5vdCBzZXQgYXMgd2VsbCBhcyBjaGVja2luZyB0aGF0IERFRl9EWU5BTUlDIGlzCi0Jc2V0LgotCi1GcmkgRmViIDI4IDE2OjUyOjQwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9mbGFncyk6IEFkZCBjYXNlIGZvciBUSUM4MF9BUkNIX01BR0lDLgotCi1GcmkgRmViIDI4IDE1OjA2OjQ1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChiZmRfZGVmYXVsdF92ZWN0b3IpOiBNYWtlIG5vbi1jb25zdC4KLQkoZmluZF90YXJnZXQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JYmZkX2ZpbmRfdGFyZ2V0LgotCShiZmRfc2V0X2RlZmF1bHRfdGFyZ2V0KTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZmluZF90YXJnZXQpOiBDYWxsIGZpbmRfdGFyZ2V0LiAgV2hlbiBkZWZhdWx0aW5nLCB1c2UKLQliZmRfZGVmYXVsdF92ZWN0b3JbMF0gaWYgaXQgaXMgbm90IE5VTEwuCi0JKiBsaWJiZmQtaW4uaCAoYmZkX2RlZmF1bHRfdmVjdG9yKTogQWRqdXN0IGRlY2xhcmF0aW9uLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogc3ltcy5jIChiZmRfaXNfbG9jYWxfbGFiZWwpOiBSZXR1cm4gZmFsc2UgaWYgdGhlIHN5bWJvbCBoYXMgbm8KLQluYW1lLgotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lLgotCSogY29mZi1tNjhrLmMgKG02OGtfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lLgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogVHJlYXQgc3ltYm9scyBiZWdpbm5pbmcKLQl3aXRoIC4uIG9yIF8uTF8gYXMgbG9jYWwuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZS4KLQkqIGV2YXgtYWxwaGEuYyAoZXZheF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IFRyZWF0IHN5bWJvbHMKLQliZWdpbm5pbmcgd2l0aCAkIGFzIGxvY2FsLgotCi1UaHUgRmViIDI3IDE4OjM2OjIzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBVc2UgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLQlyYXRoZXIgdGhhbiBjb21wYXJpbmcgYWdhaW5zdCBpbmZvLT5scHJlZml4LgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZSBhcwotCV9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkqIGVsZi5jIChfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmLWJmZC5oIChfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVjbGFyZS4KLQotCSogY29mZi1tODhrLmMgKGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUuCi0JKG04OGtfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUgYXMKLQlfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCSogY29mZmdlbi5jIChfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmNvZmYtaW4uaCAoX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiB0YXJnZXRzLmMgKEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMpOiBDaGFuZ2UgX2JmZF9pc19sb2NhbF9sYWJlbAotCXRvIF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZS4KLQkoYmZkX3RhcmdldCk6IExpa2V3aXNlLgotCSogc3ltcy5jIChiZmRfaXNfbG9jYWxfbGFiZWwpOiBEZWZpbmUgYXMgZnVuY3Rpb24sIG5vdCBtYWNyby4KLQkoYmZkX2lzX2xvY2FsX25hbWUpOiBEZWZpbmUuCi0JKiBsaWJiZmQuYyAoYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IFJlbmFtZSBmcm9tCi0JYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWwsIGFuZCB0YWtlIGEgc3RyaW5nIHJhdGhlciB0aGFuIGEKLQlzeW1ib2wuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsKTogRG9uJ3QgZGVmaW5lLgotCShfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZS4KLSAJKGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsKTogRG9uJ3QgZGVjbGFyZS4KLQkoYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogQWxsIGJhY2tlbmRzOiBDaGFuZ2UgbG9jYWxfbGFiZWwgdG8gbG9jYWxfbGFiZWxfbmFtZS4KLQotCSogZWxmMzItbWlwcy5jIChzdHJ1Y3QgbWlwc19nb3RfaW5mbyk6IEFkZCBhc3NpZ25lZF9nb3RubyBmaWVsZC4KLQkobWlwc19lbGZfcmVsb2NhdGVfZ290X2xvY2FsKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JRG9uJ3QgYXNzdW1lIHRoYXQgdGhlIGZpcnN0IHplcm8gZW50cnkgaXMgdW5hc3NpZ25lZDsgaW5zdGVhZCwgdXNlCi0JYXNzaWduZWRfZ290bm8uCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQltaXBzX2VsZl9yZWxvY2F0ZV9nb3RfbG9jYWwuCi0JKG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IEluaXRpYWxpemUgYXNzaWduZWRfZ290bm8gZmllbGQuCi0KLVdlZCBGZWIgMjYgMTU6MTk6NTEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWQzMHYuYyAoYmZkX2VsZl9kMzB2X3JlbG9jKTogQWRkIGNvZGUgdG8gZG8gMzItYml0Ci0JcmVsb2NhdGlvbnMuCi0KLVdlZCBGZWIgMjYgMTM6MzM6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IERvbid0IHNraXAgc3ltYm9scyBmcm9tIHNlY3Rpb25zCi0JdGhhdCBoYXZlIG5vIGNvbnRlbnRzIG1lcmVseSBiZWNhdXNlIGxpbmtlcl9tYXJrIGlzIG5vdCBzZXQuCi0KLVR1ZSBGZWIgMjUgMTg6NTE6MzUgMTk5NyAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChtaXBzKi0qLWxuZXdzKik6IE5ldyB0YXJnZXQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogTWFrZSBhc3NlcnQgY29tcGFyZQotCWNvbnRlbnQgYnl0ZW9yZGVyIGluc3RlYWQgb2YgaGVhZGVyIGJ5dGVvcmRlci4KLQkoZWNvZmZfYmlnbGl0dGxlX3ZlYyk6IE5ldyBCRkQsIGJpZy1lbmRpYW4gaGVhZGVycywgbGl0dGxlLWVuZGlhbgotCWRhdGEuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGVjb2ZmX2JpZ2xpdHRsZV92ZWMuCi0JKiBjb25maWd1cmUuaW4gKGVjb2ZmX2JpZ2xpdHRsZV92ZWMpOiBBZGQgY2FzZS4KLQkqIGNvbmZpZ3VyZTogVXBkYXRlLgotCi1UdWUgRmViIDI1IDAwOjMyOjQ5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGVsZl9mYWtlX3NlY3Rpb25zKTogVXNlIFNIVF9OT1RFIGZvciBhbnkgc2VjdGlvbiB3aG9zZQotCW5hbWUgYmVnaW5zIHdpdGggIi5ub3RlIi4KLQkobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogQWRkIGEgUFRfTk9URSBzZWdtZW50IGZvciBhbnkgbG9hZGFibGUKLQlzZWN0aW9uIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggIi5ub3RlIi4KLQkoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgZm9yIG1pc2FsaWduZWQKLQlqYWwgYW5kIGZvciBqYWwgb3ZlcmZsb3cuCi0KLU1vbiBGZWIgMjQgMTc6NTM6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogSWYgYSBkZWZhdWx0IHN5bWJvbCBpcwotCW5vdCBmb3VuZCwgdHJ5IGxvb2tpbmcgaXQgdXAgYWdhaW4gd2l0aG91dCB0aGUgdmVyc2lvbiBuYW1lLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBBbHdheXMgbGluayBhZ2FpbnN0IHRoZSBkeW5hbWljCi0Jc3ltYm9sIHRhYmxlIG9mIGEgZHluYW1pYyBvYmplY3QuICBXaGVuIGxpbmtpbmcgYWdhaW5zdCBhIGR5bmFtaWMKLQlvYmplY3QsIGluY2x1ZGUgdmVyc2lvbiBzdHJpbmdzIGluIHN5bWJvbCBuYW1lcywgYW5kIHNldCB1cAotCXZlcnNpb24gaW5mb3JtYXRpb24uICBBZGQgaW5kaXJlY3Qgc3ltYm9scyBmb3IgZGVmYXVsdCB2ZXJzaW9ucy4KLQkoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGQgc3BlY2lhbCB2ZXJzaW9uIHNlY3Rpb25zLgotCShzdHJ1Y3QgZWxmX2Fzc2lnbl9zeW1fdmVyc2lvbl9pbmZvKTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2ZpbmRfdmVyZGVwX2luZm8pOiBEZWZpbmUuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkIHZlcmRlZnMgcGFyYW1ldGVyLiAgU2V0Ci0JdXAgdmVyc2lvbiBzZWN0aW9ucy4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElnbm9yZSBpbmRpcmVjdCBzeW1ib2xzLgotCShlbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvKTogQWRkIHN5bXZlcl9zZWMgZmllbGQuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IEluaXRpYWxpemUgZmluZm8uc3ltdmVyX3NlYy4gIERvbid0IGNvdW50Ci0JbG9jYWwgc3ltYm9scyBvZiBhIGR5bmFtaWMgb2JqZWN0LiAgSGFuZGxlIERUX1ZFUiogY29uc3RhbnRzLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogU2ltcGxpZnkgQkZEX0FTU0VSVCBjaGVja2luZyBmb3IgYQotCWR5bmFtaWMgb2JqZWN0LiAgU2tpcCBpbmRpcmVjdCBzeW1ib2xzIGZyb20gRUxGIG9iamVjdHMuICBSZW1vdmUKLQl0aGUgdmVyc2lvbiBuYW1lIGJlZm9yZSBjaG9vc2luZyBhIGhhc2ggYnVja2V0LiAgV3JpdGUgb3V0IHRoZQotCXZlcnNpb24gaW5mb3JtYXRpb24gaWYgYXBwcm9wcmlhdGUuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IENoZWNrIGZvciBEWU5BTUlDLCBub3QgRVRfRFlOLgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgdmVyaW5mbyBmaWVsZC4KLQlDaGFuZ2UgZWxmX2xpbmtfaGFzaF9mbGFncyB0byB1bnNpZ25lZCBzaG9ydC4KLQkoRUxGX0xJTktfSElEREVOKTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBmaWVsZHMgZHludmVyc3ltX2hkciwgZHludmVycmVmX2hkciwKLQlkeW52ZXJkZWZfaGRyLCBkeW52ZXJzeW1fc2VjdGlvbiwgZHludmVyZGVmX3NlY3Rpb24sCi0JZHludmVycmVmX3NlY3Rpb24sIGN2ZXJkZWZzLCBjdmVycmVmcywgdmVyZGVmLCB2ZXJyZWYuCi0JKGVsZl9keW52ZXJzeW0sIGVsZl9keW52ZXJkZWYsIGVsZl9keW52ZXJyZWYpOiBEZWZpbmUuCi0JKF9iZmRfZWxmX3N3YXBfdmVyZGVmX2luLCBfYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQpOiBEZWNsYXJlLgotCShfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfaW4sIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQpOiBEZWNsYXJlLgotCShfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfaW4sIF9iZmRfZWxmX3N3YXBfdmVybmVlZF9vdXQpOiBEZWNsYXJlLgotCShfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfaW4sIF9iZmRfZWxmX3N3YXBfdmVybmF1eF9vdXQpOiBEZWNsYXJlLgotCShfYmZkX2VsZl9zd2FwX3ZlcnN5bV9pbiwgX2JmZF9lbGZfc3dhcF92ZXJzeW1fb3V0KTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMpOiBEZWNsYXJlLgotCSogZWxmLmMgKF9iZmRfZWxmX3N3YXBfdmVyZGVmX2luKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJkYXV4X2luLCBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfb3V0KTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX3N3YXBfdmVybmVlZF9pbiwgX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dCk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfaW4sIF9iZmRfZWxmX3N3YXBfdmVybmF1eF9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJzeW1faW4sIF9iZmRfZWxmX3N3YXBfdmVyc3ltX291dCk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQWRkIERUX1ZFUiogY29uc3RhbnRzLiAgUHJpbnQKLQl2ZXJzaW9uIGluZm9ybWF0aW9uIGlmIHRoZXJlIGlzIGFueS4KLQkoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIHZlcmluZm8gZmllbGQuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEhhbmRsZSBTSFRfR05VX3Zlciogc2VjdGlvbiB0eXBlcy4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBIYW5kbGUgLmdudS52ZXJzaW9uKiBzZWN0aW9uIG5hbWVzLgotCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogSGFuZGxlIFNIVF9HTlVfdmVyKiBzZWN0aW9uIHR5cGVzLgotCShfYmZkX2VsZl9zbHVycF92ZXJzaW9uX3RhYmxlcyk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBEb24ndCBpbmNsdWRlCi0JdmVyc2lvbiBuYW1lIGluIHN0cmluZyBlbnRlcmVkIGluIGR5bmFtaWMgaGFzaCB0YWJsZS4KLQkqIGVsZmNvZGUuaDogSW5jbHVkZSBmbm1hdGNoLmguCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgYSBkeW5hbWljCi0Jc3ltYm9sIHdoaWNoIHdhcyBmb3JjZWQgdG8gYmVjb21lIGxvY2FsLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1hbHBoYS5jIChhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCk6IExpa2V3aXNlLgotCi1GcmkgRmViIDIxIDE2OjE1OjE4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDIwMC5jIChtbjEwMjAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogU2ltcGxpZnkKLQlzb21ld2hhdC4KLQkobW4xMDIwMF9lbGZfcmVsYXhfc2VjdGlvbik6IENvcnJlY3RseSBjb21wdXRlIGEgc3ltYm9sJ3MgdmFsdWUKLQl3aGVuIHRoZSBzeW1ib2wgaXMgbG9jYWwsIGJ1dCBub3QgaW4gdGhlIHNhbWUgc2VjdGlvbiBhcyB3ZSBhcmUKLQlyZWxheGluZy4gIEltcGxlbWVudCBhYnMyNCAtPiBhYnMxNiwgaW1tMjQgLT4gaW1tMTYgYW5kIGQyNCAtPiBkMTYKLQlyZWxheGluZy4KLQotRnJpIEZlYiAyMSAxMzo1NToxNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jOiBSZXdyaXRlIHRvIHVzZSBFTEYgYmFja2VuZCBsaW5rZXIuCi0JU3RvcmUgbG93ZXIgMTYgYml0cyBvZiBhZGRlbmQgaW4gUl9NMzJSX0hJMTZfW1NVXUxPIGluc25zLgotCUFkZCBzbWFsbCBkYXRhIGFyZWEgc3VwcG9ydCAoUl9NMzJSX1NEQTE2KS4KLQkqIHJlbG9jLmM6IERvY3VtZW50IEJGRF9SRUxPQ19NMzJSX1NEQTE2LgotCSogYmZkLWluMi5oLGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQotVGh1IEZlYiAyMCAyMzo1MDozMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAobW4xMDIwMF9lbGZfcmVsYXhfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkobW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogTGlrZXdpc2UuCi0JKG1uMTAyMDBfZWxmX3N5bWJvbF9hZGRyZXNzX3ApOiBMaWtld2lzZS4KLQkobW4xMDIwMF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KLQkoYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQotCSogZWxmMzItbW4xMDIwMC5jIChtbjEwMjAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uLgotCShtbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0KLVR1ZSBGZWIgMTggMTc6MjI6NTkgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluLCBhcmNodXJlcy5jLCBjb25maWcuYmZkLCBjb25maWd1cmUuaW4sIGVsZi5jLAotCXJlbG9jLmMsIHRhcmdldHMuYzogTmV3IHRhcmdldCwgZWxmLSotRDMwVi4KLQotCSogYmZkLWluMi5oLCBjb25maWd1cmUsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi0JKiBjcHUtZDMwdi5jLCBlbGYzMi1kMzB2LmM6IE5ldyBmaWxlcy4KLQotVHVlIEZlYiAxOCAxNTozMTo0OCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCk6IEZpeCB0eXBvIGluIGNvbW1lbnQuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogY29mZi10aWM4MC5jIChSVFlQRTJIT1dUTyk6IFJlcGxhY2UgYWJvcnQgd2l0aCByZWFsIGZ1bmN0aW9uLgotCShydHlwZTJob3d0byk6IEFkZCBmdW5jdGlvbi4KLQkodGljODBfaG93dG9fdGFibGUpOiBBZGQuCi0KLVR1ZSBGZWIgMTggMTE6NDE6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBzeXNkZXAuaDogRG9uJ3QgZGVmaW5lIGVycm5vIGluIE1TVkMgaWYgZXJyb3IuaCBpcyBpbmNsdWRlZC4KLQotVHVlIEZlYiAxOCAxMDowNDoxMyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IE1ha2Ugc3VyZSByX3N5bW5keAotCWlzIGluaXRpYWxpemVkIGJlZm9yZSBpdCBpcyB1c2VkLgotCi1Nb24gRmViIDE3IDExOjI4OjQwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaHAzMDBocHV4LmMgKGNvbnZlcnRfc3ltX3R5cGUpOiBEb24ndCBjb252ZXJ0IGEgc2Vjb25kYXJ5IGNvbW1vbgotCXN5bWJvbCBpbnRvIGEgd2VhayB1bmRlZmluZWQgc3ltYm9sOyBsZWF2ZSBpdCBhcyBhIGNvbW1vbiBzeW1ib2wuCi0KLUZyaSBGZWIgMTQgMTk6MDg6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGlzc3VlIGEgd2FybmluZwotCWFib3V0IGEgc3ltYm9sIGRlZmluZWQgaW4gYSBkeW5hbWljIG9iamVjdCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuCi0JZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LgotCi1UaHUgRmViIDEzIDIwOjUzOjIyIDE5OTcgIEtsYXVzIEthZW1wZiAgKGtrYWVtcGZAcHJvZ2lzLmRlKQotCi0JKiBtYWtlZmlsZS52bXM6IEFkZCBnY2MgZmxhZ3MgdG8gYWxsb3cgY29tcGlsaW5nIHdpdGggY3VycmVudCBnY2MKLQlzbmFwc2hvdAotCSh0YXJnbWF0Y2guaCk6IE5ldyBkZXBlbmRlbmN5LgotCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFIpOiBOZXcgcmVsb2NhdGlvbiBmb3IKLQlvcGVuVk1TL0FscGhhLgotCSogZXZheC5oIChBTFBIQV9SX0NPREVBRERSKTogTmV3IHJlbG9jYXRpb24uCi0JKiBldmF4LWFscGhhLmMgKEFMUEhBX1JfQ09ERUFERFIpOiA2NCBiaXQgcHJvY2VkdXJlIHJlbG9jYXRpb24gZm9yCi0Jb3BlblZNUy9BbHBoYS4KLQkqIGV2YXgtZXRpci5jIChBTFBIQV9SX0NPREVBRERSKTogT3V0cHV0IG9iamVjdCBjb2RlIGZvciB0aGlzCi0JcmVsb2NhdGlvbi4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLQlSZXN0cmljdCBzeW1ib2wgbGVuZ3RoIHRvIDY0IGJ5dGVzLCBjYXNlIHByZXNlcnZpbmc6Ci0JKiBldmF4LWVtaC5jIChfYmZkX2V2YXhfd3JpdGVfZW1oKTogUmVtb3ZlIGNhc2UgaGFja2luZy4KLQkqIGV2YXgtbWlzYy5jIChfYmZkX2V2YXhfY2FzZV9oYWNrX3N5bWJvbCk6IFJlbW92ZS4KLQkoX2JmZF9ldmF4X2xlbmd0aF9oYXNoX3N5bWJvbCk6IEFkZGVkLgotCSogZXZheC1ldGlyLmMgKF9iZmRfZXZheF93cml0ZV9ldGlyKTogQ2FsbAotCV9iZmRfZXZheF9sZW5ndGhfaGFzaF9zeW1ib2wgYmVmb3JlIG91dHB1dCBvZiBzeW1ib2wuCi0JKiBldmF4LWVnc2QuYyAoX2JmZF9ldmF4X3dyaXRlX2Vnc2QpOiBMaWtld2lzZS4KLQkqIGV2YXguaCAoZmxhZ19oYXNoX2xvbmdfbmFtZXMsIGZsYWdfc2hvd19hZnRlcl90cnVuYyk6IFJlbW92ZS4KLQotCSogZXZheC1lbWguYzogT3V0cHV0IGZpbGVuYW1lIHRvIG9iamVjdCBmaWxlIHdpdGhvdXQgcGF0aC4KLQotCSogZXZheC1lZ3NkLmM6IE5ldyBzZWN0aW9ucyBmb3IgbG9jYWwgYW5kIGdsb2JhbCBjb21tb25zLgotCi0JKiBldmF4LWFscGhhLmMsIGV2YXgtZW1oLmMsIGV2YXgtZWdzZC5jLCBldmF4LWV0aXIuYywKLQlldmF4LW1pc2MuYywgZXZheC5oOiBSZW1vdmUgOCBiaXQgY2hhcmFjdGVycyBmcm9tIGNvcHlyaWdodAotCW5vdGljZXMuICBSZXBsYWNlIEFYUCB3aXRoIEFscGhhLgotCi1XZWQgRmViIDEyIDE4OjEwOjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBXZSBuZWVkIHRoZSBkeW5hbWljCi0Jc2VjdGlvbnMgaWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0KLVR1ZSBGZWIgMTEgMTU6NDU6NDMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3QgKGkzODYtd2luZG93cyk6IERvbid0IHNldCBob3N0NjQ9dHJ1ZS4KLQotVHVlIEZlYiAxMSAxNToyNzozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAocmVsb2NfdHlwZSk6IEFkZCBSX01JUFMxNl9HUFJFTC4KLQkoZWxmX21pcHMxNl9ncHJlbF9ob3d0byk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1pcHMxNl9ncHJlbF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX01JUFMxNl9HUFJFTC4KLQkobWlwc19pbmZvX3RvX2hvd3RvX3JlbCk6IEhhbmRsZSBSX01JUFMxNl9HUFJFTC4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBSX01JUFMxNl9HUFJFTC4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19NSVBTMTZfR1BSRUwpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1Nb24gRmViIDEwIDIzOjI1OjAwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKGVsZl9tMzJyX2hvd3RvX3RhYmxlKTogQ2hhbmdlIHBhcnRpYWxfaW5wbGFjZSB0byB0cnVlCi0JZm9yIFJfTTMyUl97MTYsMzIsMjQsSEkxNl9VTE8sSEkxNl9TTE8sTE8xNn0uCi0KLUZyaSBGZWIgIDcgMTI6Mzk6MTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IElmIHdlJ3ZlIGRpc2NhcmRlZCBhIHNlY3Rpb24sCi0JdGhlIG91dHB1dCBzZWN0aW9uIHdpbGwgYmUgdGhlIGFic29sdXRlIHNlY3Rpb247IGRvbid0IHByaW50IGFuCi0JYXNzZXJ0aW9uIG1lc3NhZ2UgZm9yIHRoYXQgY2FzZSB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsuCi0KLVRodSBGZWIgIDYgMTY6NTU6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKEZOX1NUVUIsIENBTExfU1RVQiwgQ0FMTF9GUF9TVFVCKTogRGVmaW5lLgotCShzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIG5ldyBmaWVsZHMgZm5fc3R1YiwKLQluZWVkX2ZuX3N1YiwgY2FsbF9zdHViLCBhbmQgY2FsbF9mcF9zdHViLgotCShzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIGZpZWxkIG1pcHMxNl9zdHVic19zZWVuLgotCShtaXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkobWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmVkaXJlY3QgcmVsb2NhdGlvbnMgdG8gdXNlIG1pcHMxNgotCXN0dWJzIHdoZW4gYXBwcm9wcmlhdGUuCi0JKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IEF0dGFjaCBzdHViIHNlY3Rpb25zIHRvIHRoZSBhcHByb3ByaWF0ZQotCXN5bWJvbC4gIFNldCBuZWVkX2ZuX3N0dWIgd2hlbiBhcHByb3ByaWF0ZS4KLQkobWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX2VsZl9jaGVja19taXBzMTZfc3R1YnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucyk6IERlZmluZS4KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgbG9jYWxfc3R1YnMgZmllbGQuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogRGlzY2FyZCBsb2NhbCBzeW1ib2xzIHRoYXQgYXJlCi0JYXR0YWNoZWQgdG8gc2VjdGlvbnMgd2hpY2ggYXJlIG5vdCBiZWluZyBpbmNsdWRlZCBpbiB0aGUgbGluay4KLQotV2VkIEZlYiAgNSAxMzoyMDoxNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBJZ25vcmUgdGhlCi0Jc3ltYm9sIHZhbHVlIHdoZW4gY29tcHV0aW5nIHRoZSBhZGRlbmQgZm9yIGEgcGNfcmVsYXRpdmUKLQlwY3JlbF9vZmZzZXQgcmVsb2MuCi0KLU1vbiBGZWIgIDMgMTE6NTQ6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgZG9pbmcgYQotCXJlbG9jYXRlYWJsZSBsaW5rLCBqdXN0IHNraXAgcGNfcmVsYXRpdmUgcGNyZWxfb2Zmc2V0IHJlbG9jcy4KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3J0eXBlX3RvX2hvd3RvKTogUmV0dXJuIGEgZGlmZmVyZW50IGhvd3RvCi0Jc3RydWN0dXJlIGZvciBhbiBBUk0yNiByZWxvYyB3aGljaCBjYW4gYmUgcmVzb2x2ZWQuCi0JKGNvZmZfYXJtX2FkanVzdF9zeW1uZHgpOiBPbmx5IGNvbnZlcnQgQVJNMjYgdG8gQVJNMjZEIGlmIHRoZQotCXJlbG9jIGNhbiBiZSByZXNvbHZlZC4KLQotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogQ29ycmVjdCBvZmYgYnkgb25lCi0JZXJyb3IgaW4gb3ZlcmZsb3cgY2hlY2sgZm9yIFJfUkVMQllURS4KLQotRnJpIEphbiAzMSAxNDowNzoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEpOiBQaWNrIHVwIHRoZSBzdGFydCBhZGRyZXNzLgotCUZyb20gTWFyayBSYXNpbiA8bWFyay5yYXNpbkB0ZWxyYWQuY28uaWw+LgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IERvbid0IGFwcGx5IGRpc2NhcmRfbCB0bwotCWRlYnVnZ2luZyBzeW1ib2xzLgotCi1XZWQgSmFuIDI5IDAwOjAwOjQ5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDIwMC5jIChyZWxvY190eXBlKTogQWRkIDE2Yml0IHBjLXJlbGF0aXZlIHJlbG9jLgotCShlbGZfbW4xMDIwMF9ob3d0b190YWJsZSk6IExpa2V3aXNlLgotCShtbjEwMjAwX3JlbG9jX21hcCk6IExpa2V3aXNlLgotCi1Nb24gSmFuIDI3IDEyOjA3OjM1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jOiBBZGQgcmVsb2NzIEJGRF9SRUxPQ19NMzJSX3tISTE2X1tVU11MTyxMTzE2fS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCSogZWxmMzItbTMyci5jOiBBZGQgc3VwcG9ydCBmb3IgdGhlbS4KLQotTW9uIEphbiAyNyAxMjoyNTowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXQtYXJtLmMgKE1ZX3N3YXBfc3RkX3JlbG9jX2luKTogUmVtb3ZlIHVudXNlZCByX2xlbmd0aC4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFJlbW92ZSB1bnVzZWQgcGx0LgotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogUmVtb3ZlIHVzZWQKLQlyX2Zvcm1hdCBhbmQgcl9wY3JlbC4gIEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQkqIHJpc2NpeC5jIChNWV9maW5hbF9saW5rX2NhbGxiYWNrKTogRGVmaW5lIHRvIGR1bW15IHZhbHVlLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFdoZW4gY2hlY2tpbmcgZm9yCi0JcmVsb2NhdGlvbnMgYWdhaW5zdCB0aGUgdGV4dCBzZWdtZW50LCBsb29rIHVwIHRoZSBvdXRwdXQgbmFtZSBvZgotCXRoZSByZWxvYyBzZWN0aW9uLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLVdlZCBKYW4gMjIgMTU6NDA6MjggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAodGljODBjb2ZmX3ZlYyk6IFVzZSBjb3JyZWN0IGRhdGEgcHV0L2dldAotCXJvdXRpbmVzIGZvciBsaXR0bGUgZW5kaWFuIGRhdGEuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBtYWdpYyB0bwotIAlUSUM4MF9BUkNIX01BR0lDIGZvciBUSWM4MC4KLQotVHVlIEphbiAyMSAxMjozMjo0MyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jICh0aWM4MGNvZmZfdmVjKTogQ2hhbmdlIHRvIGxpdHRsZSBlbmRpYW4gZGF0YQotCWFzIHRoZSBkZWZhdWx0LgotCi1UaHUgSmFuIDE2IDE3OjQ1OjU3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IENoYW5nZSB0eXBlIG9mCi0JYXV4aWxpYXJ5X2ZpbHRlcnMgcGFyYW1ldGVyIHRvIGJlIGNvbnN0IGNoYXIgKiBjb25zdCAqLiAgQWNjZXB0IGEKLQlOVUxMIHRlcm1pbmF0ZWQgYXJyYXkuCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotV2VkIEphbiAxNSAxMToyMTozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFRyZWF0IGEKLQlOT1RZUEUgc3ltYm9sIGluIGEgdGV4dCBzZWN0aW9uIGFzIGEgRlVOQyBzeW1ib2wuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRm9yY2UKLQlyZWxvY2Jhc2UgdG8gYmUgYWxpZ25lZCB0byBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIuCi0KLVR1ZSBKYW4gMTQgMDg6NDY6MzMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbGliYW91dC5oIChtYWNoaW5lX3R5cGUpOiBSZXNlcnZlIHNldmVyYWwgdmFsdWVzIGZvciBzcGFyY2xldC4KLQotTW9uIEphbiAxMyAyMjozOTowOCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHRpYzgwLSotKik6IERvbid0IHJlcXVpcmUgJ2NvZmYnLgotCi1Nb24gSmFuIDEzIDE5OjM2OjI1IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9ob3d0b190YWJsZSk6IFNldCB0aGUgc3BlY2lhbF9mdW5jdGlvbgotCXRhYmxlIHRvIHY4NTBfZWxmX3JlbG9jIGZvciBhbGwgbm9uLXN0YW5kYXJkIHJlbG9jYXRpb25zLgotCSh2ODUwX2VsZl9jaGVja19yZWxvY3MpOiBBZGQgY2hlY2sgZm9yIGggYmVpbmcgbm9uLW51bGwuCi0JKHY4NTBfZWxmX3JlbG9jKTogQWRkICBSX1Y4NTBfWkRBX09GRlNFVCBzdXBwb3J0LiAgVXNlIHN3aXRjaAotCXN0YXRlbWVudCBpbnN0ZWFkIG9mIG11bHRpcGxlIGlmcy4KLQkodjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCB1cCBlcnJvciBtZXNzYWdlLCBkb24ndCBqdXN0IGNhbGwKLQlhYm9ydC4KLQotTW9uIEphbiAgNiAxMzoyODozNSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAoZWxmX21uMTAyMDBfaG93dG8pOiBEb24ndCBldmVyIHNldCBwYXJ0aWFsLWlucGxhY2UuCi0JVXNlIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyBhcyBzcGVjaWFsIGZ1bmN0aW9uIGZvciBhbGwgcmVsb2NzLgotCShiZmRfZWxmMzJfbW4xMDIwMF9yZWxvYyk6IFJlbW92ZSB1bm5lY2Vzc2FyeSBmdW5jdGlvbi4KLQotCSogZWxmMzItbW4xMDIwMC5jIChlbGZfbW4xMDIwMF9ob3d0byk6IFNldCBwY3JlbF9vZmZzZXQgZm9yCi0JMjRiaXQgcGMtcmVsYXRpdmUgcmVsb2MuCi0KLUZyaSBKYW4gIDMgMTY6MzM6MDAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjb2ZmLXRpYzgwLm8pOiBBZGQgY29mZmNvZGUuaCB0byBkZXBlbmRlbmN5IGxpc3QuCi0JKiBjb2ZmLXRpYzgwLmMgKHRpYzgwY29mZl92ZWMpOiBEYXRhIGJ5dGUgb3JkZXIgaXMgYmlnIGVuZGlhbiBhbmQKLQloZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgZW5kaWFuLiAgVXNlIGNvcnJlY3QgYmZkX2dldCBhbmQKLQliZmRfcHV0IHJvdXRpbmVzIGZvciBsaXR0bGUgZW5kaWFuIGhlYWRlcnMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IFNldCBhcmNoIHRvCi0JYmZkX2FyY2hfdGljODAgZm9yIFRJQzgwX0FSQ0hfTUFHSUMgbnVtYmVyLgotCi1GcmkgSmFuICAzIDE2OjU0OjA4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYzogQWRkIEJGRF9SRUxPQ18yNC4KLQkqIGVsZjMyLW1uMTAyMDAuYyAoZW51bSByZWxvY190eXBlKTogQWRkIDI0Yml0IGFuZCBwY3JlbCByZWxvY3MuCi0JKGVsZl9tbjEwMjAwX2hvd3RvLCBtbjEwMjAwX3JlbG9jX21hcCk6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0KLUZyaSBKYW4gIDMgMTY6NTg6MzEgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQllbGY2NC1hbHBoYSBtdWx0aXBsZSAuZ290IHJld3JpdGU6Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgYWx3YXlzX3NpemVfc2VjdGlvbnMgZW50cnkuCi0JKGJmZF9lbGYqX21rb2JqZWN0KTogRG9uJ3QgZGVmaW5lIGhlcmUgLi4uCi0JKiBlbGZ4eC10YXJnZXQuaDogLi4uIGJ1dCByYXRoZXIgaGVyZS4gIERlZmF1bHQgYWx3YXlzX3NpemVfc2VjdGlvbnMKLQlob29rIHRvIE5VTEwuCi0JKiBlbGYuYyAoZWxmX21rb2JqZWN0KTogUmVuYW1lIHRvIGJmZF9lbGZfbWtvYmplY3QsIHNpbmNlIHRoYXQgd2FzCi0Jd2hhdCB0aGUgI2RlZmluZXMgaW4gZWxmLWJmZC5oIHRyYW5zbXV0ZWQgaXQgdG8gYW55d2F5LgotCi0JKiBzZWN0aW9uLmM6IEFkZCBTRUNfTElOS0VSX0NSRUFURUQgZmxhZy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogQWRkIFNFQ19MSU5LRVJfQ1JFQVRFRCB0bwotCXJlbG9jYXRpb24gc2VjdGlvbiBmbGFncy4KLQkoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIFNFQ19MSU5LRVJfQ1JFQVRFRCBpbnN0ZWFkIG9mCi0JU0VDX0lOX01FTU9SWSB0byByZWNvZ25pemUgZ2VuZXJhdGVkIGJpdHMuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2NoZWNrX3JlbG9jcywgZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKToKLQlMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluaywgbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsCi0JbWlwc19lbGZfY3JlYXRlX2NvbXBhY3RfcmVsX3NlY3Rpb24sIG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiwKLQltaXBzX2VsZl9jaGVja19yZWxvY3MsIG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uLAotCXBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MsCi0JZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IEFkZCBTRUNfTElOS0VSX0NSRUFURUQgdG8KLQlzZWN0aW9uIGZsYWdzLgotCShfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9tYWtlX2xpbmtlcl9zZWN0aW9uX3JlbGEpOiBMaWtld2lzZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDYWxsIHRoZSBhbHdheXNfc2l6ZV9zZWN0aW9ucyBob29rLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBVc2UgU0VDX0xJTktFUl9DUkVBVEVEIGluc3RlYWQgb2YgU0VDX0lOX01FTU9SWQotCXRvIGlkZW50aWZ5IGdlbmVyYXRlZCBiaXRzLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQotCSogZWxmNjQtYWxwaGEuYzogUmV3cml0ZSBldmVyeXRoaW5nIHRvdWNoaW5nIHJlbG9jYXRpb25zLgotCi1GcmkgSmFuICAzIDExOjQyOjUzIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jIChhbGwgZnVuY3Rpb25zIGFuZCBzdGF0aWMgdmFyaWFibGVzKTogR28gdGhyb3VnaAotCWFuZCByZWd1bGFyaXplIG5hbWVzIHRvIGJlIG9mIHRoZSBmb3JtIHY4NTBfZWxmXzx4eHg+LgotCSh0b3BsZXZlbCk6IEluY2x1ZGUgPGVsZi92ODUwLmg+LgotCShlbnVtIHJlbG9jX3R5cGUpOiBNb3ZlIHRvIGluY2x1ZGUvZWxmL3Y4NTAuaC4KLQkodjg1MF9lbGZfY2hlY2tfcmVsb2NzKTogRm9yIGNvbW1vbiB2YXJpYWJsZXMsIGlmIHRoZSB2YXJpYWJsZSBpcwotCXJlZmVyZW5jZWQgYnkgYSBSX1Y4NTBfe1NEQSxaREEsVERBfSByZWxvY2F0aW9uLCBwdXQgdGhlIHZhcmlhYmxlCi0JaW50byB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbi4KLQkoZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzKTogRGVmaW5lLgotCi1UdWUgRGVjIDMxIDE1OjE1OjI4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jIChlbGZfdjg1MF9ob3d0b190YWJsZSk6IEZpeCBzb21lIHNwYWNpbmcuCi0KLVR1ZSBEZWMgMzEgMTQ6NDQ6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChtaXBzKmVsLSotbGludXgqKTogTmV3IHRhcmdldC4KLQkobWlwcyotKi1saW51eCopOiBOZXcgdGFyZ2V0LgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENsZWFuIHVwLgotCVJldHVybiBhIHVzZWZ1bCB2YWx1ZS4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9DRkxBR1MpOiBBZGQgLURfR05VX1NPVVJDRS4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkLCBub3QKLQlhY19jdl9mdW5jX21tYXAuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgaW5zdGVhZCBvZgotCWFjX2N2X2Z1bmNfbW1hcCBpbiBiZmQvY29uZmlndXJlLmhvc3QuCi0KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBBZGQKLQlmaWx0ZXJfc2hsaWIgYW5kIGF1eGlsaWFyeV9maWx0ZXJfc2hsaWIgcGFyYW1ldGVycy4KLQkqIGVsZi5jIChfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogSGFuZGxlIERUX0FVWElMSUFSWSBhbmQKLQlEVF9GSUxURVIuCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkoYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gRGVjIDMwIDE4OjQ4OjUyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IFdoZW4gZXhwb3J0aW5nIGFsbCBkZWZpbmVkCi0Jc3ltYm9scywgZG9uJ3QgZXhwb3J0IGEgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgYnkgYW4gb2JqZWN0IGluIGFuCi0JYXJjaGl2ZSB3aGljaCBjb250YWlucyBzaGFyZWQgb2JqZWN0cy4KLQotTW9uIERlYyAzMCAxNjoxMjo1OCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoZW51bSBiZmRfYXJjaGl0ZWN0dXJlKTogQWRkIGJmZF9hcmNoX3RpYzgwCi0JZm9yIFRJIFRNUzMyMGM4MCAoTVZQKS4KLQkoYmZkX2FyY2h1cmVzX2xpc3QpOiBBZGQgYmZkX3RpYzgwX2FyY2guCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUgYnkgcnVubmluZyAibWFrZSBoZWFkZXJzIi4KLQotU3VuIERlYyAyOSAxNjoxODo1MiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY3B1LXRpYzgwLmMgKGJmZF90aWM4MF9hcmNoKTogQWRkIHN0cnVjdC4KLQkqIGNvbmZpZ3VyZS5pbiAoY2FzZSAkdmVjKTogQ29ycmVjdCB0eXBvLCAidGIiIG5vdCAidHAiLgotCUFsc28gYWRkIGNvZmZsaW5rLm8gZm9yIHRpYzgwY29mZl92ZWMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZi4KLQotTW9uIERlYyAzMCAxMTo1NDo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC5jOiBQYXRjaCB1cCB0aGUgbW1hcCBjb2RlIHNvIHRoYXQgaXQgaXMgb25seSBidWlsdCBpZiBCRkQKLQlpcyBjb25maWd1cmVkIHdpdGggLS13aXRoLW1tYXAuCi0KLVN1biBEZWMgMjkgMTA6NDg6NTcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLXRpYzgwLm8KLQkoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS10aWM4MC5vCi0JKGNwdS10aWM4MC5vLCBjb2ZmLXRpYzgwLm8pOiBBZGQgZGVwZW5kZW5jaWVzLgotCSogY29mZi10aWM4MC5jOiBBZGQgc2tlbGV0b24sIGNsb25lZCBmcm9tIGFub3RoZXIgY29mZiBjb25maWcuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBtYWdpYyB0byBUSUM4ME1BR0lDCi0gCWZvciBUSWM4MC4KLQotRnJpIERlYyAyNyAyMDo1Njo0MSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogVE9ETzogQ29ycmVjdCBhIG1pc3NwZWxsaW5nLgotCSogY29mZi10aWM4MC5jOiBOZXcgZmlsZSBmb3IgVEkgVE1TMzIwQzgwIChNVlApLgotCSogY3B1LXRpYzgwLmM6IE5ldyBmaWxlIGZvciBUSSBUTVMzMjBDODAgKE1WUCkuCi0JKiBjb25maWd1cmUuaW4gKGNhc2UgJHZlYyk6IEFkZCB0aWM4MGNvZmZfdmVjIGVudHJ5LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYuCi0JKiBhcmNodXJlcy5jIChiZmRfdGljODBfYXJjaCk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmggKGVudW0gYmZkX2FyY2hpdGVjdHVyZSk6IEFkZCBiZmRfYXJjaF90aWM4MC4KLQkqIGNvbmZpZy5iZmQgKGNhc2UgJHt0YXJnfSk6IEFkZCB0aWM4MCotKi1jb2ZmKiB0YXJnZXQuCi0JKiB0YXJnZXRzLmMgKHRpYzgwY29mZl92ZWMpOiBBZGQgZGVjbCBhcyBleHRlcm4gYmZkX3RhcmdldC4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgdGljODBjb2ZmX3ZlYyBlbnRyeS4KLQotRnJpIERlYyAyNyAxMTo0ODoxMiAxOTk2ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogZWxmbGluay5oIChlbGZfYnVja2V0cyk6IEFkZCBzb21lIG1vcmUgdmFsdWVzIGZvciBsYXJnZXIKLQliaW5hcmllcy4KLQotVGh1IERlYyAyNiAxODozNjo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogTW92ZSBzdWJkaXJfZG8gb3V0IG9mIGNvbmRpdGlvbmFsLiBGcm9tCi0JRnJlZCBGaXNoIDxmbmZAY3lnbnVzLmNvbT4uCi0KLVdlZCBEZWMgMTggMTA6MDQ6MzAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMjAwLmMgKGVudW0gcmVsb2NfdHlwZSk6IEVuYWJsZSBiYXNpYyA4LCAxNiwgYW5kCi0JMzIgYml0IHJlbG9jcy4KLQkoZWxmX21uMTAyMDBfaG93dG9fdGFibGUpOiBMaWtld2lzZS4KLQkobW4xMDIwMF9yZWxvY19tYXApOiBMaWtld2lzZS4KLQotVHVlIERlYyAxNyAxMTowOTozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfYWRkX3N5bWJvbF9ob29rKTogQWRkIDEgdG8gdGhlIHZhbHVlIG9mIGEKLQltaXBzMTYgc3ltYm9sIGR1cmluZyB0aGUgbGluay4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogU3VidHJhY3QgMSBmcm9tIHRoZSB2YWx1ZSBvZiBhCi0JbWlwczE2IHN5bWJvbC4KLQkobWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IERlZmluZS4KLQotCSogZWxmLmMgKGJmZF9lbGZfcHJpbnRfc3ltYm9sKTogUHJpbnQgdGhlIHN0X290aGVyIGZpZWxkIGlmIGl0IGlzCi0Jbm90IHplcm8uCi0KLU1vbiBEZWMgMTYgMTQ6Mzg6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogRG9uJ3QgY2hlY2sgZm9yIHJlbG9jIHNlY3Rpb25zCi0JYWdhaW5zdCBTRUNfREVCVUdHSU5HIHNlY3Rpb25zIGhlcmUgKHJldmVydCBwYXRjaCBvZiBEZWNlbWJlciA1KS4KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogQ2hlY2sgZm9yIHRoZW0gaGVyZSwgaW5zdGVhZC4KLQotU3VuIERlYyAxNSAxNDo0NjowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogQWRkIGR5bmFtaWMgcGFyYW1ldGVyLgotCSogZWxmLmMgKF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IFBhc3MgbmV3IGFyZ3VtZW50IHRvCi0Jc2x1cnBfcmVsb2NfdGFibGUuCi0JKF9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9zaXplX2luZm8pOiBVcGRhdGUgZGVjbGFyYXRpb24gb2YKLQlzbHVycF9yZWxvY190YWJsZS4KLQkoX2JmZF9lbGZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWNsYXJlLgotCShfYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IERlY2xhcmUuCi0JKiBlbGZ4eC10YXJnZXQuaDogVXNlIG5ldyBkeW5hbWljIHJlbG9jIHJvdXRpbmVzIGJ5IGRlZmF1bHQuCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfc2x1cnBfcmVsb2NfdGFibGUpOiBBZGQgZHluYW1pYwotCXBhcmFtZXRlci4KLQotRnJpIERlYyAxMyAxMzoxODo0OSAxOTk2ICBEYW4gV2lsZGVyICA8ZGFuQGdhc2JveS5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2ZsYWdzKTogVXNlIE1DNjhLQkNTTUFHSUMgZm9yIGJmZF9hcmNoX202OGsKLQlpZiBOQU1FU19IQVZFX1VOREVSU0NPUkUgaXMgZGVmaW5lZC4KLQotRnJpIERlYyAxMyAxMToxMzoyMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsaWJhb3V0LmggKGVudW0gbWFjaGluZV90eXBlKTogQ2hhbmdlIE1fU1BBUkNMRVQgZnJvbSAxNDIgdG8gMTMxLgotCi1UaHUgRGVjIDEyIDE1OjA3OjIwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogTW92ZSBSX1BQQ19QTFRSRUwyNCBpbnRvIHRoZQotCXN1cHBvcnRlZCByZWxvY3MuCi0KLVRodSBEZWMgMTIgMTQ6NTU6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IE9ubHkgYWRkIGEgd2VhawotCXN5bWJvbCBpZiB0aGUgcmVhbCBkZWZpbml0aW9uIGlzIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLQlBZnRlciBmaW5kaW5nIHRoZSByZWFsIGRlZmluaXRpb24sIHRoZW4sIGlmIGl0IGlzIGR5bmFtaWMsIGFkZCB0aGUKLQl3ZWFrIHN5bWJvbCB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0KLQkqIGNvZmYtYXV4LmMgKGNvZmZfbTY4a19hdXhfbGlua19hZGRfb25lX3N5bWJvbCk6IE1ha2Ugc3RhdGljLgotCi0JKiBwcGNib290LmMgKHBwY2Jvb3Rfc2V0X2FyY2hfbWFjaCk6IERvbid0IGRlZmluZTsgaXQncyBhCi0JZnVuY3Rpb24uCi0JKHBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEb24ndCB0YWtlIHRoZSBhZGRyZXNzIG9mIGFuCi0JYXJyYXkuCi0KLVR1ZSBEZWMgMTAgMjM6MjM6NTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMzAwLmMgKHJlbG9jX3R5cGUpOiBSZW1vdmUgYmlnIGVuZGlhbiBtbjEwMzAwIHJlbG9jCi0JdmFyaWFudHMuCi0JKGVsZjMyX21uMTAzMDBfaG93dG9fdGFibGUsIG1uMTAzMDBfcmVsb2NfbWFwKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9tbjEwMzAwX3JlbG9jKTogV3JpdGUgZGF0YSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdC4KLQkqIHJlbG9jLmM6IFJlbW92ZSBtbjEwMzAwIGJpZyBlbmRpYW4gcmVsb2NzLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQotCSogZWxmMzItbW4xMDIwMC5jOiBVcGRhdGUgZnJvbSBlbGYzMi1tbjEwMzAwLmMuCi0KLUZyaSBEZWMgIDYgMTU6MTg6MDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMzAwLmMgKGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyKTogRGVmaW5lLgotCi0JKiBlbGYzMi1tbjEwMzAwLmM6IEFkZCBzb21lIGNvbW1lbnRzLgotCi1GcmkgRGVjICA2IDE3OjE2OjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWhleC5jIChpaGV4X3NjYW4pOiBBbHdheXMgaW5pdGlhbGl6ZSBidWYgYmVmb3JlIGp1bXBpbmcgdG8KLQllcnJvcl9yZXR1cm4uCi0JKGloZXhfcmVhZF9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLVRodSBEZWMgIDUgMjI6Mjk6MTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMzAwLmMgKGVsZl9tbjEwMzAwX2hvd3RvX3RhYmxlKTogRG9uJ3Qgc2V0IHBhcnRpYWwtCi0JaW5wbGFjZSBmb3IgbW9zdCByZWxvY3MuCi0KLVRodSBEZWMgIDUgMTM6MjQ6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENhbGxpbmcgY2hlY2tfcmVsb2NzCi0JZXZlbiBpZiBTRUNfQUxMT0MgaXMgbm90IHNldC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogRG9uJ3QgY2hlY2sgU0VDX0FMTE9DCi0Jd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGNvcHkgYSByZWxvYyBpbnRvIGEgc2hhcmVkIG9iamVjdC4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogRG9uJ3Qgc2V0IFNFQ19BTExPQyBpbiBhCi0JcmVsb2Mgc2VjdGlvbiBpZiBpdCBpcyBub3Qgc2V0IGluIHRoZSBzb3VyY2Ugc2VjdGlvbi4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IExpa2V3aXNlLgotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IE1hcmsgYSByZWxvYyBzZWN0aW9uIGFzc29jaWF0ZWQKLQl3aXRoIGEgU0VDX0RFQlVHR0lORyBzZWN0aW9uIGFzIFNFQ19ERUJVR0dJTkcuCi0KLVdlZCBEZWMgIDQgMTQ6MTg6MTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiAjaWYgMCBjb2RlIHRoYXQKLQlleHBlY3RzIGEgLmdvdC5wbHQgdW50aWwgd2UgYWN0dWFsbHkgY3JlYXRlIGl0LgotCi1Nb24gRGVjICAyIDEyOjEzOjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IFByaW50IGFuIGVycm9yCi0JbWVzc2FnZSBmb3IgYmZkX3JlbG9jX291dG9mcmFuZ2UsIHJhdGhlciB0aGFuIGFib3J0aW5nLiAgRnJvbQotCVBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBpbmZvLnVjbC5hYy5iZT4uCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSWYgdGhlcmUgYXJlbid0IGFueSByZWxvY3MgaW4KLQlhIHJlbG9jYXRlYWJsZSBsaW5rLCBkb24ndCB0cnkgdG8gcHJvY2VzcyB0aGVtLiAgRnJvbSBIZWlueiBXcm9iZWwKLQk8d3JvYmVsQGxwci5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+LgotCi1Nb24gRGVjICAyIDAwOjM5OjI0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChtbjEwMzAwX2luZm9faG93dG8pOiBSZW5hbWVkIGZyb20KLQltbjEwMzAwX2luZm9faG93dG9fcmVsLiAgVHdlYWsgcmVsb2MgYXJndW1lbnQgdG8gYmUgYW4KLQlFbGYzMl9JbnRlcm5hbF9SZWxhLgotCShVU0VfUkVMQSk6IERlZmluZSBpbnN0ZWFkIG9mIFVTRV9SRUwuCi0JKGVsZl9pbmZvX3RvX2hvd3RvLCBlbGZfaW5mb19ob3d0b19yZWwpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVN1biBEZWMgIDEgMDA6MTg6NTkgMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZTogIEhhbmRsZSBtaXBzKi1zZ2ktaXJpeDYqLgotCSogaXJpeC1jb3JlLmMgKGlyaXhfY29yZV9jb3JlX2ZpbGVfcCk6ICBBY2NlcHQgQ09SRV9NQUdJQ04zMgotCWNvcmUgZmlsZXMuCi0KLVdlZCBOb3YgMjcgMTI6MTA6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBXYXJuIGFib3V0IGEKLQlyZWxvY2F0aW9uIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBpbiBhIHNlY3Rpb24gd2l0aCBubyBvdXRwdXQKLQlzZWN0aW9uLgotCi1UdWUgTm92IDI2IDExOjA3OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCAoQkZEX0NDX0ZPUl9CVUlMRCk6IERvbid0IHJlcXVpcmUgQUNfQ19DUk9TUy4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMi4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBvdGhlciBmaWVsZC4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgb3RoZXIgZmllbGQuCi0JKHN3YXBfb3V0X3N5bXMpOiBTZXQgc3Rfb3RoZXIgZnJvbSBleGlzdGluZyBzdF9vdGhlciBmaWVsZC4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU3RvcmUgc3Rfb3RoZXIgaW4gaGFzaAotCXRhYmxlIG90aGVyIGZpZWxkLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogU2V0IHRoZSBvdGhlciBmaWVsZCBmcm9tIHRoZSBnbG9iYWwgaGFzaAotCXRhYmxlIGVudHJ5LgotCSogZWxmMzItbWlwcy5jIChlbnVtIHJlbG9jX3R5cGUpOiBBZGQgUl9NSVBTMTZfMjYuCi0JKGVsZl9taXBzMTZfanVtcF9ob3d0byk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1pcHMxNl9qdW1wX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfTUlQUzE2X0pNUC4KLQkobWlwc19pbmZvX3RvX2hvd3RvX3JlbCk6IEhhbmRsZSBSX01JUFMxNl8yNi4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBSX01JUFMxNl8yNi4gIEhhbmRsZSBSX01JUFNfMjYKLQl0byBhIG1pcHMxNiBzeW1ib2wuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfTUlQUzE2X0pNUCk6IEFkZCB0byBsaXN0IG9mIHJlbG9jcy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBjcHUtbWlwcy5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkIG1pcHM6MTYgZW50cnkuCi0KLU1vbiBOb3YgMjUgMTE6MjM6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIGxvbmcgbG9uZyBmb3IgbWlwcy1zZ2ktaXJpeDYqLgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IE1ha2UgbGluZSBudW1iZXIgb3ZlcmZsb3cKLQlvbmx5IGEgd2FybmluZy4gIEZyb20gUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRlbXV5dEB1bGIuYWMuYmU+LgotCi1Nb24gTm92IDI1IDA4OjUyOjI5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChiZmRfZWxmMzJfbW4xMDMwMF9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkoZW51bSByZWxvY190eXBlKTogQWRkIG1vcmUgcmVsb2MgdHlwZXMuCi0JKGVsZjMyX21uMTAzMDBfaG93dG9fdGFibGUpOiBVcGRhdGUgZm9yIG5ldyByZWxvYyB0eXBlcy4KLQkoZWxmMzJfbW4xMDMwMF9yZWxvY19tYXApOiBVcGRhdGUgZm9yIG5ldyByZWxvYyB0eXBlcy4KLQkqIHJlbG9jLmM6IEFkZCBzb21lIG5ldyByZWxvY3MgZm9yIHRoZSBtbjEwMzAwIHNlcmllcy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0KLVNhdCBOb3YgMjMgMTM6MjY6MTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc2V0dXBfc2VjdGlvbnMpOiBEb24ndCBsb3NlIGZvciBhIHNwYWNlIHdoaWNoIGhhcwotCW5vIGRhdGEsIGJ1dCBzb21lIHN5bWJvbHMuCi0KLUZyaSBOb3YgMjIgMTE6MzI6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlKTogQWRkIGdvdF9uZWVkZWQgZmllbGQuCi0JKHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIGdvdF9uZWVkZWQuCi0JKHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogT25seSBzZXQgLmdvdCBzZWN0aW9uIHNpemUgaWYgaXQKLQlpcyBub3QgYWxyZWFkeSBzZXQuICBTZXQgZ290X25lZWRlZC4KLQkoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENoZWNrIGdvdF9uZWVkZWQuICBPbmx5IHNldAotCXNkeW5wdHIsIGFuZCBvbmx5IGhhbmRsZSBkeW5hbWljIHNlY3Rpb25zLCBpZiBkeW5hbWljIHNlY3Rpb25zIGFyZQotCW5lZWRlZC4KLQkoc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzKTogUGFzcyBmYWxzZSB0byBjcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQlJbml0aWFsaXplIC5nb3Qgc2VjdGlvbi4KLQkoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sKTogU2V0IHVwIFBMVCBlbnRyeSBldmVuIGlmIHRoaXMgaXMgbm90Ci0JYSBkeW5hbWljIHN5bWJvbC4KLQkoc3Vub3NfZmluaXNoX2R5bmFtaWNfbGluayk6IENoZWNrIGdvdF9uZWVkZWQuICBPbmx5IHNldCB1cAotCWR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiBpZiBuZWVkZWQuCi0KLVRodSBOb3YgMjEgMTA6MzE6MzEgMTk5NiAgUm9iIFNhdm95ZSAgKHJvYkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBBZGRlZCBWZXJzYURPUyBmb3JtYXQgdG8gdGhlIEVyaWNzc29uIGNvbmZpZ3VyYXRpb24uCi0KLVdlZCBOb3YgMjAgMTY6MzE6MzEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMzAwLmM6IFJvdWdoIGN1dCBhdCByZWxvY3MgZm9yIHRoZSBtbjEwMzAwLgotCi1XZWQgTm92IDEzIDA4OjEyOjM4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGVsZjMyLWQxMHYubyk6IERvbid0IGRlcGVuZCBvbiBlbGYvZDEwdi5oCi0JYW55bW9yZS4KLQotVHVlIE5vdiAxMiAxMzozMDowMCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGZpbGVtb2RlLmM6IEluY2x1ZGUgc3lzZGVwLmguCi0JKiBpaGV4LmM6IEFkZCBjYXN0cyB0byBlbGltaW5hdGUgY29tcGlsZXIgd2FybmluZ3MuCi0JKiBzdW5vcy5jOiBBZGQgY2FzdHMgdG8gZWxpbWluYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgotCi1Nb24gTm92IDExIDEwOjM3OjAyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ3JlYXRlIC5nb3QucGx0Ci0Jc2VjdGlvbi4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBBZGQgc3VwcG9ydCBmb3IgUl9QUENfTE9DQUwyNFBDLiAgTWFrZQotCWFwcHJvcHJpYXRlIHJlbG9jYXRpb25zIGluIHRoZSAuc28gZmlsZSBpZiBzaGFyZWQuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERpdHRvLgotCi1UdWUgT2N0IDI5IDE1OjAzOjAyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAoZWxmX20zMnJfaG93dG9fdGFibGUsIFJfTTMyUl8yNCk6IFVzZQotCWNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLgotCi1UdWUgT2N0IDI5IDEyOjUzOjQ2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMTB2LmMgKGVsZl9kMTB2X2hvd3RvX3RhYmxlKTogRG9uJ3QgY29tcGxhaW4gb24KLQlvdmVyZmxvd3MgZm9yIFJfRDEwVl8xNiBhbmQgUl9EMTBWXzE4LgotCi1UdWUgT2N0IDI5IDEzOjIzOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX3NlY3Rpb25fcGFydCk6IFVzZSBMTUEgcmF0aGVyIHRoYW4gVk1BLgotCShkb193aXRoX3JlbG9jcyk6IExpa2V3aXNlLgotCShkb19hc19yZXBlYXQpOiBMaWtld2lzZS4KLQkoY29weV9leHByZXNzaW9uKTogTGlrZXdpc2UuCi0KLUZyaSBPY3QgMjUgMTY6NTY6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfZXh0ZXJuYWxfcGFydCk6IENvcnJlY3RseSByZWNvcmQgd2hldGhlcgotCXRoZXJlIGlzIGFuIGV4dGVybmFsIHBhcnQuCi0KLVRodSBPY3QgMjQgMTQ6MzI6NTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGVsZjMyX3Y4NTBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDb3JyZWN0bHkKLQloYW5kbGUgdGRhIG9mZnNldHMgZm9yIHNsZC53IGFuZCBzc3QudyBpbnN0cnVjdGlvbnMuCi0JRml4IGFsaWdubWVudCBjaGVjayBpbiBzbGQudyBhbmQgc3N0LncgdGRhIHJlbG9jIGhhbmRsaW5nLgotCi1UaHUgT2N0IDI0IDA5OjA4OjQ3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogIFNldCBVU0VfQklOQVJZX0ZPUEVOIGZvciAqLSotd2luZG93cy4KLQotV2VkIE9jdCAyMyAwMDo1MzoxNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYzogQWRkIGNvbW1lbnRzIGFib3V0IGFzc3VtcHRpb25zIGFib3V0Ci0JY2hhciwgc2hvcnQgJiBsb25nIHNpemVzLgotCShlbGYzMl92ODUwX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogRml4IHNpZ24gZXh0ZW5zaW9uCi0JcHJvYmxlbXMgZm9yIHNldmVyYWwgcmVsb2NzLgotCi0JKiBlbGYzMi12ODUwLmMgKGVsZjMyX3Y4NTBfaG93dG9fdGFibGUpOiBGaXggdHlwbyBpbgotCVJfVjg1MF9TREFfT0ZGU0VUIGVudHJ5LgotCi1XZWQgT2N0IDIzIDAwOjIwOjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sKTogRG9uJ3QgYWxsb2NhdGUgbGRzeW0uCi0JU3RvcmUgaW1wb3J0IGZpbGUgaW5kZXggaW4gbGRpbmR4LgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBBc3N1bWUgdGhhdCBsZHN5bSB3YXMgbm90IHByZXZpb3VzbHkKLQlhbGxvY2F0ZWQuICBGb3IgYW4gaW1wb3J0ZWQgc3ltYm9sLCBjb3B5IGxkaW5keCBpbnRvIGxfaWZpbGUuCi0KLVR1ZSBPY3QgMjIgMTk6MjA6MzggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGVsZl92ODUwX2hvd3RvX3RhYmxlKTogRml4IG9yZGVyaW5nIG9mCi0JUl9WODUwX1pEQV9PRkZTRVQgYW5kIFJfVjg1MF9UREFfT0ZGU0VULiAgRml4IHZhcmlvdXMKLQlmaWVsZHMgaW4gUl9WODUwX1REQV9PRkZTRVQuCi0JKGVsZjMyX3Y4NTBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBUd2VhayBwYy1yZWxhdGl2ZQotCXJlbG9jcyB0byB3b3JrIG1vcmUgbGlrZSBvdGhlciByZWxvY3MuICBIYW5kbGUgUl9WODUwX1REQV9PRkZTRVQKLQlyZWxvY2F0aW9ucy4KLQotCSogZWxmMzItdjg1MC5jOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkoYmZkX2VsZjMyX3Y4NTBfcmVsb2MpOiBSZXR1cm4gYW4gZXJyb3IgaWYgd2UgZ2V0IGEgcmVsb2MKLQl3ZSBjYW4ndCBoYW5kbGUuCi0JKGVsZjMyX3Y4NTBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKHY4NTBfZWxmX3JlbG9jYXRpb25fc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCi1UdWUgT2N0IDIyIDE3OjIyOjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IElnbm9yZSBzZWN0aW9ucyB3aGljaAotCWRvbid0IGhhdmUgU0VDX0xPQUQgYW5kIFNFQ19BTExPQyBzZXQuCi0KLU1vbiBPY3QgMjEgMTI6MTM6MDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBBdm9pZCBsb3Npbmcgc3RhdGljCi0Jc3ltYm9scyBpbiB0aGUgLmJzcyBzZWN0aW9uLgotCi1Nb24gT2N0IDIxIDEwOjU0OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19ob3d0b190YWJsZSk6IERlc2NyaWJlIFJfTUlQU182NC4KLQkobWlwczMyXzY0Yml0X3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19yZWxvY19tYXApOiBBZGQgZW50cnkgZm9yIEJGRF9SRUxPQ182NC4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBSX01JUFNfNjQuCi0KLQkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBQcmludCBhbiBlcnJvciBtZXNzYWdlCi0Jd2hlbiBhdHRlbXB0aW5nIHRvIGRvIGEgcmVsb2NhdGVhYmxlIGxpbmsgd2l0aCBkaWZmZXJlbnQgb2JqZWN0Ci0JZmlsZSBmb3JtYXRzLCByYXRoZXIgdGhhbiBjYWxsaW5nIGFib3J0LgotCi1UaHUgT2N0IDE3IDEwOjQzOjI5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKG0zMnIgcmVsb2NzKTogUmVuYW1lIHRoZW0uCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQkqIGVsZjMyLW0zMnIuYzogVXBkYXRlLgotCShtMzJyX2VsZl8xMF9wY3JlbF9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX20zMnJfaG93dG9fdGFibGUsIFJfTTMyUl8xMF9QQ1JFTCBlbnRyeSk6IFVzZSBpdC4KLQkoZWxmX20zMnJfaG93dG9fdGFibGUsIFJfTTMyUl8yNCBlbnRyeSk6IEZpeCB7c3JjLGRzdH1fbWFza3MuCi0KLVdlZCBPY3QgMTYgMTE6MjQ6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBTZXQgImxpbmtlcl9tYXJrIiBmb3IKLQlhbGwgc2VjdGlvbnMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZS4KLQkoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBEaXNjYXJkIHN5bWJvbHMgaW4gc2VjdGlvbnMKLQl3aGljaCBhcmUgYmVpbmcgZGlzY2FyZGVkLgotCSogZWxmMzItdjg1MC5jIChlbnVtIHJlbG9jX3R5cGUpOiBBZGQgUl9WODUwX1NEQV9PRkZTRVQsCi0JUl9WODUwX1REQV9PRkZTRVQgYW5kIFJfVjg1MF9aREFfT0ZGU0VULgotCShlbGZfdjg1MF9ob3d0b190YWJsZSk6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkoZWxmX3Y4NTBfcmVsb2NfbWFwKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogcmVsb2MuYzogQWRkIGFkZGl0aW9uYWwgVjg1MCByZWxvY2F0aW9ucy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0KLQkqIGVsZjMyLXY4NTAuYyAoYmZkX2VsZjMyX3Y4NTBfcmVsb2MpOiBNYXNrIG91dCBiaXRzIHdlCi0Jbm8gbG9uZ2VyIHdhbnQgaW4gcGMtcmVsYXRpdmUgcmVsb2NzLgotCi1UdWUgT2N0IDE1IDIyOjE3OjM3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChiZmRfZWxmMzJfdjg1MF9yZWxvYyk6IERvbid0IHNpbGVudGx5Ci0JYWNjZXB0IGEgcmVsb2MgYWdhaW5zdCBhbiB1bmRlZmluZWQgc3libW9sIQotCi1UdWUgT2N0IDE1IDE2OjE3OjI4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYzogIERlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciB0byBiZSAnXycuCi0KLVR1ZSBPY3QgMTUgMTI6NDA6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBWRVJTSU9OOiBCdW1wIGZvciBuZXcgcmVsb2NhdGlvbi4KLQotCSogaG9zdHMvaTM4NmJzZC5oOiBJZiBOQlBHIGlzIG5vdCBkZWZpbmVkLCBkZWZpbmUgaXQgYXMKLQlQQUdFX1NJWkUsIGZvciByZWNlbnQgdmVyc2lvbnMgb2YgRnJlZUJTRC4KLQotTW9uIE9jdCAxNCAxMjozNzoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgYGxvbmcgbG9uZycgYXMgdGhlIDY0IGJpdCB0eXBlIG9uIGEgU29sYXJpcwotCWhvc3QsIHNpbmNlIGJvdGggZ2NjIGFuZCB0aGUgU3VuUFJPIGNvbXBpbGVycyBzdXBwb3J0IGl0LgotCi1Nb24gT2N0IDE0IDExOjE3OjI0IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiByZWxvYy5jOiBDcmVhdGUgYSBuZXcgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMLiAgSXQgd2FzIGEKLQltaXN0YWtlIHRvIGhhdmUgcmV1c2VkIHRoZSBFQ09GRiBMSVRFUkFMIGZvciBFTEYgc2luY2UgdGhleSBoYXZlCi0JZGlmZmVyZW50IHNlbWFudGljcy4KLQkqIGVsZjY0LWFscGhhLmMgKGVsZl9yZWxvY19tYXApOiBNYXAgZnJvbSBFTEZfTElURVJBTC4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFRyYXAgLmdvdAotCXNlY3Rpb24gb3ZlcmZsb3cuCi0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBEbyBub3QgZW1pdCBhCi0JZHluYW1pYyByZWxvY2F0aW9uIGZvciBhbiB1bmRlZndlYWsgc3ltYm9sIHdoZW4gd2UgYXJlIGJ1aWxkaW5nCi0JYSBzdGF0aWMgZXhlY3V0YWJsZS4KLQotVGh1IE9jdCAxMCAxMToxNTowNiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZCAoY29uZmlnLmJmZCwgdGFyZ21hdGNoLnNlZCk6IEVkaXQgcmVmZXJlbmNlcyB0bwotCXBvaW50IGV4cGxpY2l0bHkgdG8gc3JjZGlyLgotCSh0YXJnbWF0Y2guaCk6IEVkaXQgcmVmZXJlbmNlcyB0byBwb2ludCBleHBsaWNpdGx5IHRvIG9iamRpci4KLQotVGh1IE9jdCAxMCAxNDoxNDoyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IFdoZW4gc2V0dGluZyB0YXJnX2NwdSwgZG9uJ3QgZ2V0IGNvbmZ1c2VkIGJ5Ci0JbGludXgtZ251LgotCi1UdWUgT2N0ICA4IDA4OjUxOjE5IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiAgQWRkIHN1cHBvcnQgZm9yIHdpbmRvd3MgaG9zdCAoYSBidWlsZCBkb25lCi0JdW5kZXIgdGhlIE1pY3Jvc29mdCBidWlsZCBlbnZpcm9ubWVudCkuCi0KLVR1ZSBPY3QgIDggMTE6NDA6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGEgc3ltYm9sIGlzIGEgd2VhawotCWRlZmluaXRpb24gaW4gYSBkeW5hbWljIG9iamVjdCwgYWRkIGl0IHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZQotCWlmIGFueSBkeW5hbWljIG9iamVjdCBtZW50aW9ucyBpdC4gIFJldmVydHMgcGFydCBvZiBsYXN0IHBhdGNoLgotCi0JKiBzdW5vcy5jIChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlKTogQWRkIGdvdF9iYXNlIGZpZWxkLgotCShzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBnb3RfYmFzZS4KLQkoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIHRoZSAuZ290IHNlY3Rpb24gaXMgbW9yZQotCXRoYW4gMHgxMDAwIGJ5dGVzLCBzZXQgX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhbmQgZ290X2Jhc2UgdG8KLQkweDEwMDAuCi0JKHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MpOiBTdWJ0cmFjdCBnb3RfYmFzZSBmcm9tIGEgYmFzZQotCXJlbGF0aXZlIHJlbG9jYXRpb24uCi0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfaXNhKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRG9uJ3Qgd2FybiBhYm91dCBsaW5raW5nCi0JLW1pcHMxIGFuZCAtbWlwczIgY29kZSB0b2dldGhlciwgb3IgLW1pcHMzIGFuZCAtbWlwczQgY29kZS4KLQotTW9uIE9jdCAgNyAxMTo0NDoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfY29mZl9hcm1hcCk6IE9ubHkgdHJlYXQgYXJjaGl2ZSBhcyBsaXR0bGUKLQllbmRpYW4gZm9yIGk5NjAgQ09GRi4KLQotRnJpIE9jdCAgNCAxMzo0OTowMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWRqdXN0IHNvZmFyCi0gCWJ5IHRoZSBjaGFuZ2UgaW4gc2l6ZSBvZiB0aGUgc2VjdGlvbiB3aGVuIEVYRUNfUCBpcyBub3Qgc2V0LgotCi0JKiBjb2ZmLW02OGsuYyAoY29mZl9ydHlwZV90b19ob3d0byk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkobTY4a2NvZmZfcnR5cGVfdG9faG93dG8pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogY2YtbTY4a2x5bnguYyAoY29mZl9tNjhrX2x5bnhfcnR5cGVfdG9faG93dG8pOiBBZGQgdGhlIHNlY3Rpb24KLQlWTUEgdG8gdGhlIGFkZGVuZCBmb3IgYSBQQyByZWxhdGl2ZSByZWxvYy4KLQotCSogZGVwLWluLnNlZDogUmV3b3JrIGJhY2tzbGFzaCBsb29wIGEgYml0IHRvIGF2b2lkIGJ1ZyBpbiBzZWQgb24KLQlIUC9VWCAxMC4yMC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogZGVwLWluLnNlZDogUmVtb3ZlIC4uL2JmZC9zeXNkZXAuaCwgc2luY2UgaXQgd2lsbCBhcHBlYXIgd2hlbgotCXNvbS5oIGlzIGluY2x1ZGVkLgotCi1GcmkgT2N0ICA0IDExOjQxOjM5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBleHBsaWNpdCBkZXBlbmRlbmNpZXMgZm9yIG1uMTAyMDAgYW5kCi0JbW4xMDMwMCBmaWxlcy4KLQkoQUxMX01BQ0hJTkVfQ0ZJTEVTKTogQWRkIGNwdS1tbjEwMjAwLmMgYW5kIGNwdS1tbjEwMzAwLmMuCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGYzMi1tbjEwMjAwLmMgYW5kIGVsZjMyLW1uMTAzMDAuYwotCShkZXBlbmRlbmNpZXMpOiBSZWJ1aWx0LgotCi1UaHUgT2N0ICAzIDE2OjU3OjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogU2V0IG9ial9jb2ZmX2tlZXBfc3ltcwotCWR1cmluZyB0aGlzIGZ1bmN0aW9uLgotCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IE9ubHkgdXNlIGFuIGV4aXN0aW5nCi0Jc2VjdGlvbiBpZiB0aGUgZmxhZ3MgYXJlIGNvbXBhdGlibGUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGhhdmV2ZWNzLCBhbmQgcHV0IGl0IGluIHRkZWZhdWx0cy4KLQkqIG1wdy1jb25maWcuaW46IExpa2V3aXNlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogdGFyZ21hdGNoLnNlZDogTmV3IGZpbGU7IGEgc2VkIHNjcmlwdCB0byBidWlsZCB0YXJnbWF0Y2guaCBmcm9tCi0JY29uZmlnLmJmZC4KLQkqIGNvbmZpZy5iZmQ6IEFkZCAjaWYsICNlbmRpZiwgYW5kIGNvbW1lbnRzIGZvciB0YXJnbWF0Y2guaC4KLQkqIHRhcmdldHMuYzogSW5jbHVkZSAiZm5tYXRjaC5oIi4KLQkoc3RydWN0IHRhcmdtYXRjaCk6IERlZmluZS4KLQkoYmZkX3RhcmdldF9tYXRjaCk6IERlZmluZSBieSBpbmNsdWRpbmcgdGFyZ21hdGNoLmguCi0JKGJmZF9maW5kX3RhcmdldCk6IElmIHRoZSB0YXJnZXQgaXMgbm90IGZvdW5kIGJ5IG5hbWUsIHNlYXJjaCBmb3IKLQlpdCBhcyBhIGNvbmZpZ3VyYXRpb24gdHJpcGxldC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGFvdXQtYXJtLm8sIGFvdXQtc3BhcmNsZS5vLCBocDMwMGJzZC5vLAotCWkzODZkeW5peC5vLCBtNjhrNGtuZXRic2QubywgYW5kIHJpc2NpeC5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgYW91dC1hcm0uYywgYW91dC1zcGFyY2xlLmMsCi0JaHAzMDBic2QuYywgaTM4NmR5bml4LmMsIG02OGs0a25ldGJzZC5jLCBhbmQgcmlzY2l4LmMuCi0JKEhGSUxFUyk6IEFkZCB0YXJnbWF0Y2guaC4gIEFsc28sIGFscGhhYmV0aXplIGFuZCByZWluZGVudC4KLQkoQ0ZJTEVTKTogUmVtb3ZlIGkzODZkeW5peC5jIGFuZCBocDMwMGJzZC5jLgotCSh0YXJnbWF0Y2guaCk6IE5ldyB0YXJnZXQuCi0JKGRvX2NsZWFuKTogUmVtb3ZlIHRhcmdtYXRjaC5oLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBCRkRfTkVFRF9ERUNMQVJBVElPTihnZXRlbnYpLgotCSogYWNjb25maWcuaDogQWRkIE5FRURfREVDTEFSQVRJT05fR0VURU5WLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBzeXNkZXAuaDogSWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYsIGRlY2xhcmUgZ2V0ZW52LgotCSogYW91dC1hZG9iZS5jIChhb3V0X2Fkb2JlX29iamVjdF9wKTogRG9uJ3QgZGVjbGFyZSBnZXRlbnYuCi0KLVRodSBPY3QgIDMgMDk6Mjk6MDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjcHUtbW4xMHgwMC5jLCBlbGYzMi1tbjEweDAwOiBSZW1vdmVkLgotCSogY3B1LW1uMTAyMDAuYywgY3B1LW1uMTAzMDAuYzogTmV3IGZpbGVzLgotCSogZWxmMzItbW4xMDIwMC5jLCBlbGYzMi1tbjEwMzAwLmM6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluOiBCcmVhayBtbjEweDAwIHN1cHBvcnQgaW50byB0d28gc2VwYXJhdGUKLQljb25maWd1cmF0aW9ucywgbW4xMDIwMCBhbmQgbW4xMDMwMC4KLQkqIGFyY2h1cmVzLmMsIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5pbiwgZWxmLmMsIHRhcmdldHMuYzogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmgsIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotVGh1IE9jdCAgMyAxNTozODoxOSAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoZG9fY2xlYW4pOiBNb3ZlIGNvbmZpZy5sb2cgdG8gZG9fZGlzdGNsZWFuLgotCi1XZWQgT2N0ICAyIDIxOjQwOjU1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY3B1LW1uMTB4MDAuYywgZWxmMzItbW4xMHgwMC5jOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS1tbjEweDAwLm8uCi0JKEJGRDMyX0JBQ0tFTkRTKTogU2ltaWxhcmx5IGZvciBlbGYzMi1tbjEweDAwLm8uCi0JKGVsZjMyLW1uMTB4MDAubyk6IEFkZCBkZXBlbmRlbmNpZXMuCi0JKiBhcmNodXJlcy5jIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUpOiBBZGQgYmZkX2FyY2hfbW4xMHgwMC4KLQkoYmZkX21uMTB4MDBfYXJjaCk6IERlY2xhcmUuCi0JKGJmZF9hcmNodXJlc19saXN0KTogQWRkIGJmZF9tbjEweDAwX2FyY2guCi0JKiBjb25maWcuYmZkOiBBZGQgbW4xMHgwMC0qLSouCi0JKiBjb25maWd1cmUuaW46IEFkZCBiZmRfZWxmMzJfbW4xMHgwMF92ZWMuCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogSGFuZGxlIGJmZF9hcmNoX21uMTB4MDAuCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGYzMl9tbjEweDAwX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGJmZF9lbGYzMl9tbjEweDAwX3ZlYy4KLQkqIGJmZC1pbjIuaCwgY29uZmlndXJlOiBSZWJ1aWx0LgotCi1XZWQgT2N0ICAyIDE1OjQ2OjQ1IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0Jb3BlblZNUy9BbHBoYTogUHJvdmlkZSBmaWxlbmFtZSBhbmQgY2FzZV9oYWNrIGZsYWdzIHZpYQotCXN5bWJvbCB0YWJsZSBmcm9tIGdhcy4KLQlBZGQgY2FzZV9oYWNrIGNvZGUgZm9yIHN5bWJvbCBvdXRwdXQgZnJvbSB2YXgvdm1zLgotCSogZXZheC1hbHBoYS5jIChldmF4X2luaXRpYWxpemUpOiBSZW1vdmUgZmlsZW5hbWUgaGFuZGxpbmcsCi0JZmlsZW5hbWUgaXMgcHJvdmlkZWQgdmlhIHN5bWJvbCB0YWJsZS4KLQkoZXZheF9nZXRfc3ltdGFiKTogVXNlIGxvY2FsIHN5bWJvbCBjb3VudCB3aGVuIHNldHRpbmcgdXAgdGFibGUuCi0JKiBldmF4LWVnc2QuYyAoX2JmZF9ldmF4X3NsdXJwX2Vnc2QpOiBQcmludCBjb3JyZWN0IG5hbWUgd2hlbgotCWRlYnVnZ2luZy4KLQkoX2JmZF9ldmF4X3dyaXRlX2Vnc2QpOiBTa2lwIGZpbGUgbmFtZSBzeW1ib2wuCi0JKiBldmF4LWVtaC5jIChnZXRfdm1zX3RpbWVfc3RyaW5nKTogTG9jYWwgZnVuY3Rpb24gbm93LgotCShfYmZkX2V2YXhfd3JpdGVfZW1oKTogRXh0cmFjdCBzb3VyY2UgZmlsZW5hbWUgYW5kIGNhc2VfaGFjayBmbGFncwotCWZyb20gc3ltYm9sIHRhYmxlLgotCSogZXZheF93cml0ZV9ldGlyIChfYmZkX2V2YXhfd3JpdGVfZXRpcik6IFBhc3MgYWxsIHN5bWJvbCBuYW1lcwotCXRocm91Z2ggX2JmZF9ldmF4X2Nhc2VfaGFja19zeW1ib2wuCi0JKiBldmF4LW1pc2MuYyAoaGFzaF9zdHJpbmcsIF9iZmRfZXZheF9jYXNlX2hhY2tfc3ltYm9sKTogTmV3Ci0JZnVuY3Rpb25zLgotCShfYmZkX2V2YXhfYmFzZW5hbWUpOiBSZW1vdmVkLgotCShfYmZkX2dldF92bXNfdGltZV9zdHJpbmcpOiBNb3ZlZCB0byBldmF4LWVtaC5jLgotCSogZXZheC5oIChldmF4X3ByaXZhdGVfZGF0YV9zdHJ1Y3QpOiBSZW1vdmUgZmlsZW5hbWUuCi0JKGZsYWdfaGFzaF9sb25nX25hbWVzLCBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMsCi0JZmxhZ19ub19oYXNoX21peGVkX2Nhc2UsIHZtc19uYW1lX21hcHBpbmcpOiBOZXcgZmxhZ3MgZm9yCi0Jdm1zX2Nhc2VfaGFjay4KLQotV2VkIE9jdCAgMiAxMjowMjowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGZyZWVic2QuaCAoTl9HRVRfTUFHSUNfTkVUKTogRG9uJ3QgdXNlIG50b2hsLgotCShOX0dFVE1JRF9ORVQsIE5fR0VURkxBR19ORVQpOiBMaWtld2lzZS4KLQkoTk9fU1dBUF9NQUdJQyk6IERvbid0IGRlZmluZS4KLQkoU1dBUF9NQUdJQyk6IERlZmluZS4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgY3Jhc2ggaWYgdGhlcmUgaXMKLQlubyBoYXNoIHRhYmxlIGVudHJ5IGZvciBhIGdsb2JhbCBzeW1ib2wuCi0KLVR1ZSBPY3QgIDEgMTY6MTQ6MjIgMTk5NiAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKG1pcHMqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBtaXBzKi0qLWVsZiouCi0KLVR1ZSBPY3QgIDEgMTI6MzE6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBvdmVycmlkZSBhIG1lYW5pbmdmdWwKLQlzeW1ib2wgdHlwZSB3aXRoIFRfTlVMTC4gIFdhcm4gaWYgc3ltYm9sIHR5cGUgY2hhbmdlcy4gIEJhc2VkIG9uCi0JcGF0Y2ggZnJvbSBQaGlsaXBwZSBEZSBNdXl0ZXIgPHBoZG1AaW5mby51Y2wuYWMuYmU+LgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IE9ubHkgcHV0IGEgc3ltYm9sIGZyb20KLQlhIGR5bmFtaWMgb2JqZWN0IGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBpZiBpdCBpcyByZWZlcmVuY2VkCi0Jb3IgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0LgotCi1GcmkgU2VwIDI3IDE4OjQxOjA3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAoYmZkX2VsZjMyX3Y4NTBfaXNfbG9jYWxfbGFiZWwpOiAgTmV3IGZ1bmN0aW9uIHRvCi0JcmVtb3ZlIGR3YXJmIGxvY2FsIGxhYmVscy4gIFNocmlua3MgYmluYXJpZXMgYnkgYSBmYWN0b3Igb2YgMyEKLQotTW9uIFNlcCAyMyAxMzozMzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IENyZWF0ZSB0aGUgLnNic3Mgc2VjdGlvbgotCWJ5IGhhbmQsIHJhdGhlciB0aGFuIGJ5IGNhbGxpbmcgYmZkX21ha2Vfc2VjdGlvbi4KLQotTW9uIFNlcCAyMyAwOToyMzo0MSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYzogUmVuYW1lIG0zMnIgcmVsb2NzLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGVsZjMyLW0zMnIuYzogVXBkYXRlLgotCi1GcmkgU2VwIDIwIDExOjQzOjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogV2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZQotCWxpbmssIGFkanVzdCB0aGUgc3ltYm9sIGluZGV4IG9mIGEgYmFzZSByZWxhdGl2ZSByZWxvYy4gIERvbid0Ci0JY2hhbmdlIHRoZSBhZGRlbmQgb2YgYSBQQyByZWxhdGl2ZSByZWxvYyBpZiBwY3JlbF9vZmZzZXQgaXMgc2V0LgotCSogc3Vub3MuYyAoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IGRvIGFueXRoaW5nIGZvcgotCWEgcmVsb2NhdGVhYmxlIGxpbmsuCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBBcHBseSB0aGUgcmVsb2NhdGlvbiBldmVuIGlmCi0JaXQgaXMgemVybywgaW4gY2FzZSBzcmNfbWFzayBtYXR0ZXJzLgotCShiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0KLVRodSBTZXAgMTkgMTE6MDM6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IEFsd2F5cyBpbml0aWFsaXplCi0Ja2VlcF9zeW1zLgotIAkoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IERvbid0IHNldCB0YXJnZXRfaW5kZXgKLQl0byBhbiB1bmluaXRpYWxpemVkIHZhbHVlLgotCi1UdWUgU2VwIDE3IDE0OjE4OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9saW5lX3RhYmxlKTogV2FybiBhYm91dCBpbGxlZ2FsIHN5bWJvbAotCWluZGljZXMsIHJhdGhlciB0aGFuIGNyYXNoaW5nLgotCShjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogTGlrZXdpc2UuICBDaGVjayB3aGV0aGVyIHRoZSBob3d0byBmaWVsZAotCWlzIE5VTEwuCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayBmb3IgYW4gaWxsZWdhbCBzeW1ib2wKLQlpbmRleC4KLQotTW9uIFNlcCAxNiAxMjozOTozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvKTogQ2hhbmdlIGRzdF9tYXNrIGZvciBBUk0yNkQKLSAJcmVsb2MgdG8gMC4KLQkoY29mZl9hcm1fYWRqdXN0X3N5bW5keCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfYWRqdXN0X3N5bW5keCk6IERlZmluZS4KLQotCSogc3JlYy5jIChzcmVjX3NjYW4pOiBBY2NlcHQgbXVsdGlwbGUgc3ltYm9scyBvbiBhIHNpbmdsZSBsaW5lLgotCUZyb20gUGFzY2FsIE1hcnRpbiA8cG1hcnRpbkBhbHN5cy5jb20+LgotCi0JKiBSRUFETUU6IE5ldyBmaWxlLgotCi1GcmkgU2VwIDEzIDE0OjMyOjQyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFvdXRmMS5oIChNWV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZS4KLQkoc3Vub3NfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQotRnJpIFNlcCAxMyAxNTo1MDo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogU3dpdGNoIG9uIG91dHB1dCBCRkQgcmF0aGVyCi0JdGhhbiBpbnB1dCBCRkQuCi0JKGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBzZWN0aW9uLmMgKGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogTGlrZXdpc2UuCi0JKiBzeW1zLmMgKGJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogQ2hlY2sgdGhhdAotCWJvdGggQkZEJ3MgYXJlIHRoZSByaWdodCBmbGF2b3VyLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBlbGYuYyAoX2JmZF9lbGZfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCSogcGVpY29kZS5oIChwZV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogRmlsbCBpbiBzb21lIGZpZWxkcyBmb3IKLQlSX1BBUklTQ19ESVIzMiwgc28gdGhhdCBfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSBwYXNzZXMKLQlpdHMgc2FuaXR5IGNoZWNrLgotCi1UaHUgU2VwIDEyIDExOjQ1OjU3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jOiBBZGQgbTMyciByZWxvY3MuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogY3B1LW0zMnIuYyxlbGYzMi1tMzJyLmM6IE5ldyBmaWxlcy4KLQotVGh1IFNlcCAxMiAxMToxMDowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV92ZWMpOiBTZXQgc3ltYm9sX2xlYWRpbmdfY2hhciBmaWVsZCB0byAnXycuCi0KLVdlZCBTZXAgMTEgMTE6NTc6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0ZWtoZXguYyAoZmlyc3RfcGhhc2UpOiBDaGFuZ2UgdHlwZSBwYXJhbWV0ZXIgZnJvbSBjaGFyIHRvIGludC4KLQkob3V0KTogTGlrZXdpc2UuCi0JKHBhc3Nfb3Zlcik6IENoYW5nZSBmdW5jIHRvIGV4cGVjdCBpbnQsIG5vdCBjaGFyLgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IFRlc3QgU0VDX0FMTE9DCi0JcmF0aGVyIHRoYW4gU0VDX0xPQUQgd2hlbiBhbGlnbmluZyB0aGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBmaXJzdAotCXNlY3Rpb24gaW4gYSBzZWdtZW50LgotCi1UdWUgU2VwIDEwIDE2OjE4OjMwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBzeW1zLmMgKGNvZmZfc2VjdGlvbl90eXBlKTogTWFrZSBhcmcgY29uc3QuCi0JKiBpcml4LWNvcmUuYyAoaXJpeF9jb3JlX2NvcmVfZmlsZV9wKTogUmVtb3ZlIGV4dHJhbmVvdXMgZXh0cmEgYXJnCi0JdG8gbWFrZV9iZmRfYXNlY3Rpb24oKS4KLQkqIGVsZi1iZmQuaCAoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogQWRkIHByb3RvdHlwZS4KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogUmVtb3ZlIHByb3RvdHlwZS4KLQkoX2JmZF9lbGZfc3RyaW5ndGFiX2luaXQpOiBSZW1vdmUgcHJvdG90eXBlLgotCi0JKiBuZXRic2QtY29yZS5jIChzd2FwX2Fib3J0KTogQWRkIHByb3RvdHlwZS4KLQkqIGFpeDM4Ni1jb3JlLmMgKHN3YXBfYWJvcnQpOiBEaXR0byAmIG1ha2Ugc3RhdGljCi0JKiBocHV4LWNvcmUuYyAoc3dhcF9hYm9ydCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKiBpcml4LWNvcmUuYyAoc3dhcF9hYm9ydCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKiBwdHJhY2UtY29yZS5jIChzd2FwX2Fib3J0KTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkqIHRyYWQtY29yZS5jIChzd2FwX2Fib3J0KTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9yZWxvY19pbik6IERpdHRvLgotCShjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogRGl0dG8uCi0JKGNvZmZfc3dhcF9maWxlaGRyX2luKTogRGl0dG8uCi0JKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IERpdHRvLgotCShjb2ZmX3N3YXBfc3ltX2luKTogRGl0dG8uCi0JKGNvZmZfc3dhcF9zeW1fb3V0KTogRGl0dG8uCi0JKGNvZmZfc3dhcF9hdXhfaW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX2F1eF9vdXQpOiBEaXR0by4KLQkoY29mZl9zd2FwX2xpbmVub19pbik6IERpdHRvLgotCShjb2ZmX3N3YXBfbGluZW5vX291dCk6IERpdHRvLgotCShjb2ZmX3N3YXBfYW91dGhkcl9pbik6IERpdHRvLgotCShjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBEaXR0by4KLQkoY29mZl9zd2FwX3Njbmhkcl9pbik6IERpdHRvLgotCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IERpdHRvLgotCSogaWhleC5jIChpaGV4X3NpemVvZl9oZWFkZXJzKTogRGl0dG8uCi0JKiB0ZWtoZXguYyAoZ2V0c3ltKTogRGl0dG8uCi0JKGZpbmRfY2h1bmspOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCShpbnNlcnRfYnl0ZSk6IERpdHRvLgotCShmaXJzdF9waGFzZSk6IERpdHRvLgotCShwYXNzX292ZXIpOiBEaXR0by4KLQkodGVraGV4X2dldF9zeW10YWIpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSh0ZWtoZXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKHRla2hleF9ta29iamVjdCk6IERpdHRvLgotCSh0ZWtoZXhfb2JqZWN0X3ApOiBEaXR0by4KLQkobW92ZV9zZWN0aW9uX2NvbnRlbnRzKTogRGl0dG8uCi0JKHRla2hleF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgotCSh0ZWtoZXhfc2V0X2FyY2hfbWFjaCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKHRla2hleF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgotCSh3cml0ZXZhbHVlKTogRGl0dG8uCi0JKHdyaXRlc3ltKTogRGl0dG8uCi0JKG91dCk6IERpdHRvLgotCSh0ZWtoZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGl0dG8uCi0JKHRla2hleF9zaXplb2ZfaGVhZGVycyk6IERpdHRvLgotCSh0ZWtoZXhfbWFrZV9lbXB0eV9zeW1ib2wpOiBEaXR0by4KLQkodGVraGV4X2dldF9zeW1ib2xfaW5mbyk6IERpdHRvLgotCSh0ZWtoZXhfcHJpbnRfc3ltYm9sKTogRGl0dG8uCi0JKiBpcml4LWNvcmUuYyAobWFrZV9iZmRfYXNlY3Rpb24pOiBEaXR0by4KLQkoaXJpeF9jb3JlX2NvcmVfZmlsZV9wKTogRGl0dG8uCi0JKGlyaXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKTogRGl0dG8uCi0JKGlyaXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpOiBEaXR0by4KLQkoaXJpeF9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6IERpdHRvLgotCShpcml4X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wpOiBEaXR0by4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERpdHRvLgotCSogc3JlYy5jIChzcmVjX25ld19zeW1ib2wpOiBEaXR0by4KLQkoc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgotCShzcmVjX3NldF9hcmNoX21hY2gpOiBEaXR0by4KLQkoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgotCShpbnRlcm5hbF9zcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERpdHRvLgotCShzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERpdHRvLgotCShzeW1ib2xzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERpdHRvLgotCShzcmVjX3NpemVvZl9oZWFkZXJzKTogRGl0dG8uCi0JKHNyZWNfbWFrZV9lbXB0eV9zeW1ib2wpOiBEaXR0by4KLQkoc3JlY19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogRGl0dG8uCi0JKHNyZWNfZ2V0X3N5bXRhYik6IERpdHRvLgotCShzcmVjX3ByaW50X3N5bWJvbCk6IERpdHRvIGFuZCBtYWtlIHN0YXRpYy4KLQkqIGVsZi5jIChlbGZfcmVhZCk6IERpdHRvCi0JKGFzc2lnbl9zZWN0aW9uX251bWJlcnMpOiBEaXR0by4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBEaXR0by4KLQkoc3ltX2lzX2dsb2JhbCk6IERpdHRvLgotCShlbGZfbWFwX3N5bWJvbHMpOiBEaXR0by4KLQkoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBEaXR0by4KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogRGl0dG8uCi0JKGNvZmZfcmVhbF9vYmplY3RfcCk6IERpdHRvLgotCShmaXh1cF9zeW1ib2xfdmFsdWUpOiBEaXR0by4KLQkoYnVpbGRfZGVidWdfc2VjdGlvbik6IERpdHRvLgotCShjb3B5X25hbWUpOiBEaXR0by4KLQkqIHN5bXMuYyAoY29mZl9zZWN0aW9uX3R5cGUpOiBEaXR0by4KLQotTW9uIFNlcCAgOSAyMjozNjowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbjIuaDogUmVidWlsdCBhZnRlciBtMzJyIGNoYW5nZXMuCi0KLU1vbiBTZXAgIDkgMTI6MzE6MjIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCxjb25maWd1cmUuaW4sY29uZmlndXJlOiBBZGQgbTMyciBzdXBwb3J0LgotCSogTWFrZWZpbGUuaW4sYXJjaHVyZXMuYyxlbGYuYyx0YXJnZXRzLmM6IExpa2V3aXNlLgotCSogY29uZmlnLmJmZDogS2VlcCB0YXJnZXQgbGlzdCBhbHBoYWJldGljYWxseSBzb3J0ZWQuCi0KLU1vbiBTZXAgIDkgMTE6NDg6NDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGJmZF9lbGYzMl92ODUwX3JlbG9jLCBjYXNlIFJfVjg1MF9ISTE2KTogRG9uJ3QgZm9yZ2V0Ci0JdG8gYWRkIGluIHRoZSBjb25zdGFudCBwYXJ0IGZvdW5kIGluIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYuCi0JKGNhc2UgUl9WODUwX0hJMTZfUyk6IExpa2V3aXNlLgotCi1GcmkgU2VwICA2IDE3OjA0OjM5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMTB2LmMgKGVsZl9kMTB2X2hvd3RvX3RhYmxlKTogTW9kaWZ5IHRoZSBzaXplIG9mIFJfRDEwVl8xNgotCWFuZCBSX0QxMFZfMTggdG8gYmUgMSAod29yZCkuCi0KLVRodSBTZXAgIDUgMTU6MjM6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyk6IElmIHRoZSBvdXRwdXRfc2VjdGlvbiBmaWVsZAotCW9mIGVpdGhlciBzZWN0aW9uIGlzIGJmZF9hYnNfc2VjdGlvbiwgdGhlbiB0aGUgbGlua2VyIGlzCi0JZGlzY2FyZGluZyB0aGUgc2VjdGlvbiBhbmQgd2Ugc2hvdWxkIG5vdCBvcHRpbWl6ZSBpdC4KLQotVHVlIFNlcCAgMyAxMjoxNjoyMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYW91dC1zcGFyY2xlLm8pOiBOZXcgdGFyZ2V0LgotCSogYW91dGYxLmggKFRBUkdFVF9JU19CSUdfRU5ESUFOX1ApOiBEb24ndCBkZWZpbmUgaWYgbGl0dGxlIGVuZGlhbi4KLQkqIGNvbmZpZy5iZmQgKHNwYXJjbGV0LSotYW91dCopOiBBZGQgY2FzZS4KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmNsZV9hb3V0X3ZlYyk6IEFkZCBjYXNlLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIHRhcmdldHMuYyAoc3BhcmNsZV9hb3V0X3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIHNwYXJjbGVfYW91dF92ZWMuCi0JKiBhb3V0LXNwYXJjbGUuYzogTmV3IGZpbGUuCi0KLVR1ZSBTZXAgIDMgMDA6NTc6MDIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGJmZF9lbGYzMl92ODUwX3JlbG9jKTogRml4IGhhbmRsaW5nIG9mCi0JbG93IG9yZGVyIHNpZ24gYml0IHByb3BvZ2F0aW9uIGZvciBSX1Y4NTBfSEkxNl9TLgotCi0JKiBlbGYzMi12ODUwLmMgKGJmZF9lbGYzMl92ODUwX3JlbG9jKTogTmV3IGZ1bmN0aW9uIGZvcgotCWhhbmRsaW5nIFY4NTAgc3BlY2lmaWMgcmVsb2NzLgotCShlbGZfdjg1MF9ob3d0b190YWJsZSk6IFVzZSB0aGUgbmV3IGZ1bmN0aW9uIGZvciBzb21lCi0JcmVsb2NhdGlvbnMuICBUd2lkZGxlIG1hc2tzICYgc2hpZnRzIGZvciBzb21lIHJlbG9jcy4KLQlTZXQgcGFydGlhbF9pbnBsYWNlIHdoZXJlIG5lZWRlZC4KLQotTW9uIFNlcCAgMiAxMjoxMjozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1taXBzLmM6IEFkZCBhbiBleHBsaWNpdCBtaXBzOjMwMDAgZW50cnksIGFuZCBjaGFuZ2UgdGhlCi0JZGVmYXVsdCBhcmNoaXRlY3R1cmUgdG8gYSBtYWNoaW5lIG51bWJlciBvZiAwLgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX29iamVjdF9wKTogU2V0IHRoZSBtYWNoaW5lIG51bWJlcgotCWZvciBFX01JUFNfQVJDSF8xLgotCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBJZiB0aGUgbWFjaGluZSBudW1iZXIgb2YKLQl0aGUgb3V0cHV0IEJGRCBpcyB0aGUgZGVmYXVsdCwgc2V0IGl0IGZyb20gdGhlIGZpcnN0IGlucHV0IEJGRC4KLQotU3VuIFNlcCAgMSAxODozODowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBBbGwgdGhlIDE2Yml0IHJlbG9jcwotCWluc2VydCBhdCBiaXRwb3MgemVyby4gIFRoZSBISTE2IHJlbG9jcyBhcmUgc2hpZnRlZCByaWdodAotCWJ5IDE2IGJpdHMuICBGaXggc3JjX21hc2sgZm9yIGFsbCByZWxvY3MuCi0JKFRBUkdFVF9MSVRUTEVfU1lNLCBUQVJHRVRfTElUVExFX05BTUUpOiBEZWZpbmUuICBUaGUgVjg1MCBpcwotCWxpdHRsZSBlbmRpYW4hCi0JKFRBUkdFVF9CSUdfU1lNLCBUQVJHRVRfQklHX05BTUUpOiBSZW1vdmUuICBUaGUgVjg1MCBpcyBsaXR0bGUKLQllbmRpYW4hCi0KLVN1biBTZXAgIDEgMTU6NDE6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6Ci0JUmV3cml0ZSB0byB1c2UgQkZEIGZpbGUgcmVhZCByb3V0aW5lcyBhbmQgdG8gYXZvaWQgdXNpbmcgYSBmaXhlZAotCWxlbmd0aCBmb3IgdGhlIGZpbGUgbmFtZS4KLQotU2F0IEF1ZyAzMSAxMDoyMjoyNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAoZW51bSByZWxvY190eXBlKTogQWRkIFJfVjg1MF97MzIsMTYsOH0uCi0JKGVsZl92ODUwX2hvd3RvX3RhYmxlKTogQWRkIHN1cHBvcnQgZm9yIFJfVjg1MF97MzIsMTYsOH0uCi0JKHY4NTBfcmVsb2NfbWFwKTogQWRkIHRyYW5zbGF0aW9uIGZyb20gQkZEX1JFTE9DX3szMiwxNiw4fQotCXRvIFJfVjg1MF97MzIsMTYsOH0uCi0KLUZyaSBBdWcgMzAgMTg6MDY6MDQgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAocmVsb2NfdHlwZSk6IEFkZCBSX1Y4NTBfSEkxNl9TLgotCShlbGZfdjg1MF9ob3d0b190YWJsZSk6IEFkZCBpbmZvIGZvciBISTE2X1MgcmVsb2MuCi0JKHY4NTBfcmVsb2NfbWFwKTogQWRkIEhJXzE2X1MgcmVsb2MuCi0JKiByZWxvYy5jOiBEZWZpbmUgQkZEX1JFTE9DX1Y4NTBfKiByZWxvY3MuCi0KLUZyaSBBdWcgMzAgMTE6NDk6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQWRkIFNIIEVMRiBzdXBwb3J0LgotCSogZWxmMzItc2guYzogTmV3IGZpbGUuCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogSGFuZGxlIGJmZF9hcmNoX3NoLgotCSogZWxmY29kZS5oICh3cml0ZV9yZWxvY3MpOiBIYW5kbGUgYWJzb2x1dGUgc3ltYm9sLgotCSogZWxmLWJmZC5oIChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MpOiBEZWNsYXJlLgotCShfYmZkX2VsZjY0X2xpbmtfcmVhZF9yZWxvY3MpOiBEZWNsYXJlLgotCSogZWxmbGluay5oIChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpKTogUmVuYW1lIGZyb20KLQllbGZfbGlua19yZWFkX3JlbG9jcy4gIE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBHZXQgZXh0ZXJuYWwgc3ltYm9scyBmcm9tIGNhY2hlIGluCi0Jc3ltdGFiX2hkci0+Y29udGVudHMuICBHZXQgY29udGVudHMgZnJvbSBjYWNoZSBpbgotCWVsZl9zZWN0aW9uX2RhdGEuCi0JKiBlbGZ4eC10YXJnZXQuaCAoYmZEX2VsZk5OX2JmZF9yZWxheF9zZWN0aW9uKTogT25seSBkZWZpbmUgaWYgbm90Ci0JYWxyZWFkeSBkZWZpbmVkLgotCSogcmVsb2MuYzogRGVmaW5lIEJGRF9SRUxPQ19TSF8qIHJlbG9jcy4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX3NoX2FsaWduX2xvYWRfc3Bhbik6IERlY2xhcmUuCi0JKiBjb2ZmLXNoLmMgKHNoX2luc25zX2NvbmZsaWN0KTogRml4IGEgcmV0dXJuIHZhbHVlLgotCShfYmZkX3NoX2FsaWduX2xvYWRfc3Bhbik6IE5ldyBnbG9iYWxseSB2aXNpYmxlIGZ1bmN0aW9uLCBicm9rZW4KLQlvdXQgb2Ygc2hfYWxpZ25fbG9hZC4KLQkoc2hfYWxpZ25fbG9hZCk6IENhbGwgX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4uCi0JKHNoX3N3YXBfaW5zbnMpOiBDaGFuZ2UgcmVsb2NzIHBhcmFtZXRlciB0byBQVFIuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfc2hfdmVjKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3NobF92ZWMpOiBEZWNsYXJlLgotCSogY29uZmlnLmJmZCAoc2gtKi1lbGYqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX3NoX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCShiZmRfZWxmMzJfc2hsX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmMzItc2guby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjMyLXNoLmMuCi0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBDaGVjayB0aGF0IExNQSBkb2VzIG5vdCBza2lwIGEKLQlwYWdlIGJlZm9yZSBjaGVja2luZyBEX1BBR0VELgotCi0JKiBpaGV4LmMgKGloZXhfc2Nhbik6IFJlbW92ZWQgdW5uZWNlc3NhcnkgZXh0YmFzZSB2YXJpYWJsZS4KLQkoaWhleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmUgZXh0YmFzZTsgYWx3YXlzIHVzZSBzZWdiYXNlCi0JaW5zdGVhZC4KLQotVGh1IEF1ZyAyOSAxNjo1MjoxNyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi0qKTogUmVjb2duaXplIGk2ODYgZm9yIHBlbnRpdW0gcHJvLgotCSogY29uZmlndXJlLmhvc3QgKGlbMzQ1XTg2LSotKik6IERpdHRvLgotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi0qKTogRGl0dG8uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni0qLWRndXgqKTogUmVjb2duaXplIGFzIGEgc3lub255bSBmb3IgeDg2Ci0JZWxmLgotCi1UdWUgQXVnIDI3IDA5OjE4OjE4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IEFkZCBuZXcgYXJndW1lbnQuCi0JKiBlbGYzMi1ocHBhLmggKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogVXBkYXRlIHByb3RvdHlwZS4KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IEFkZCBuZXcgYXJndW1lbnQuICBJZgotCXdlIGVuY291bnRlciBhbiBSX0RBVEFfT05FX1NZTUJPTCByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIHRoYXQKLQl3aWxsIGhhdmUgYW4gU1RfQ09ERSB0eXBlLCBjaGFuZ2UgdGhlIHN5bWJvbCdzIHR5cGUgdG8gU1RfREFUQS4KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IFVwZGF0ZSBwcm90b3R5cGUuCi0KLVR1ZSBBdWcgMjcgMDA6MTI6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IFNldCBkeW5vYmogaWYgbmVlZGVkIGZvcgotCVJfTUlQU18zMiBhbmQgUl9NSVBTX1JFTDMyLiAgU2V0IHNnb3QgYW5kIGcgYXMgc29vbiBhcyBwb3NzaWJsZS4KLQkobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgcmVxdWlyZSAuZ290IHRvIGV4aXN0LgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi1UaHUgQXVnIDIyIDEwOjU0OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3QgKEhMREVOVik6IE5ldyB2YXJpYWJsZSB0byBzZXQuICBTZXQgaXQgZm9yCi0JKi0qLXN5c3Y0Kiwgc2luY2UgdGhvc2UgbGlua2VycyBtYXkgbm90IHN1cHBvcnQgLVIgYnV0IHRoZXkgYWx3YXlzCi0Jc3VwcG9ydCBMRF9SVU5fUEFUSC4KLQotCSogbGliaWVlZS5oIChOU0VDVElPTlMpOiBEb24ndCBkZWZpbmUuCi0JKGllZWVfZGF0YV9zdHJ1Y3QpOiBDaGFuZ2Ugc2VjdGlvbl90YWJsZSB0byBhc2VjdGlvbiAqKi4gIEFkZAotCXNlY3Rpb25fdGFibGVfc2l6ZS4KLQkqIGllZWUuYyAoZ2V0X3NlY3Rpb25fZW50cnkpOiBJZiB0aGUgdGFibGUgaXNuJ3QgYmlnIGVub3VnaCwgbWFrZQotCWl0IGJpZ2dlci4KLQkoaWVlZV9zbHVycF9zZWN0aW9ucyk6IFJlbW92ZSBhc3NlcnRpb24gYWJvdXQgbnVtYmVyIG9mIHNlY3Rpb25zLgotCShpZWVlX29iamVjdF9wKTogQWRqdXN0IGluaXRpYWxpemF0aW9uIG9mIGllZWUgdG8gbWF0Y2ggY2hhbmdlcyB0bwotCXRoZSBzdHJ1Y3R1cmUuCi0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9tYXJrKTogRG9uJ3QgY29weSByZWxvY3MgZm9yIHVuZGVmaW5lZAotCXN5bWJvbHMgbWVyZWx5IGJlY2F1c2Ugd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogRG9uJ3Qgc2V0IHVwIGdsb2JhbCBsaW5rYWdlIGNvZGUgZm9yIGFuCi0JdW5kZWZpbmVkIHN5bWJvbCBtZXJlbHkgYmVjYXVzZSB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZAotCWxpYnJhcnkuCi0KLVR1ZSBBdWcgMjAgMTU6MDY6MDUgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgY3B1LXY4NTAuby4KLQkoQkZEMzJfQkFDS0VORFMpIEFkZCBlbGYzMi12ODUwLm8uCi0JKiBhcmNodXJlcy5jOiBBZGQgYmZkX3Y4NTBfYXJjaC4KLQkqIGJmZC1pbjIuaDogQWRkIGJmZF92ODUwX2FyY2guCi0JKiBjb25maWcuYmZkICh2ODUwLSotKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IChiZmRfZWxmMzJfdjg1MF92ZWMpIE5ldyB2ZWN0b3IuCi0JKiBjb25maWd1cmUuaW46IChiZmRfZWxmMzJfdjg1MF92ZWMpIE5ldyB2ZWN0b3IuCi0JKiBjcHUtdjg1MC5jOiBOZXcgZmlsZS4KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGRlZCBjYXNlIGJmZF9hcmNoX3Y4NTAuCi0JKiBlbGYzMi12ODUwLmM6IE5ldyBmaWxlLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfdjg1MF92ZWMpOiBOZXcgdmVjdG9yLgotCi1GcmkgQXVnIDE2IDE2OjI1OjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scyk6IENyZWF0ZSBhbmQgZGVmaW5lCi0gCWEgZnVuY3Rpb24gY29kZSBzeW1ib2wgZm9yIGFuIFhNQ19YTyBzeW1ib2wuCi0KLVRodSBBdWcgMTUgMTI6MzM6MjkgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBVcGRhdGUgZWRpdGluZyBvZiBhdXRvY29uZiB2YXJzIHRvIHJlZmxlY3QKLQlKdWwgMTggY29uZmlndXJlLmluIGNoYW5nZS4KLQkqIG1wdy1tYWtlLnNlZDogVXBkYXRlIGVkaXRpbmcgb2YgaW5jbHVkZSBwYXRobmFtZXMgdG8gYmUKLQltb3JlIGdlbmVyYWwsIGFkZCBAREFTSF9DX0ZMQUdAIHRvIGV4cGxpY2l0IGNvbXBpbGUgcnVsZSBlZGl0LgotCi1UaHUgQXVnIDE1IDEwOjM1OjEzIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9vdXRwdXRfZXh0c3ltKTogVGhlIHNlY3Rpb24gZnJvbQotCXdoaWNoIHRvIG9mZnNldCB0byBnZXQgdGhlIC5wbHQgZW50cnkgYWRkcmVzcyBpcyAiLnBsdCIuCi0KLVRodSBBdWcgMTUgMTY6NDA6MzAgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiByZWxvYy5jOiAoQkZEX1JFTE9DX0FSTV9USFVNQl9BREQsIEJGRF9SRUxPQ19BUk1fVEhVTUJfSU1NLAotCUJGRF9SRUxPQ19BUk1fVEhVTUJfU0hJRlQsIEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUKToKLSAJQWRkZWQsIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIEFSTSBnYXMuCi0JKiBsaWJiZmQuaDogUmVidWlsdAotCSogYmZkLWluMi5oOiBSZWJ1aWx0Ci0KLVdlZCBBdWcgMTQgMTc6MDI6MDkgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENvcnJlY3QgdHlwbwotCWluIHNlY3Rpb24gZHluaWR4IHN0YXJ0LgotCi1UdWUgQXVnIDEzIDE0OjM1OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBUcmVhdCBzZWN0aW9ucyB3aG9zZQotCW5hbWUgYmVnaW5zIHdpdGggLmdudS5saW5rb25jZSBhcyBTRUNfTElOS19PTkNFLiAgVGhpcyBpcyBhbgotCW9wdGltaXphdGlvbiBmb3IgZysrLgotCi1UdWUgQXVnIDEzIDE3OjA0OjQwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IElmIG9uZSBtb2R1bGUgaGFzCi0JdGhlIC1tcmVsb2NhdGFibGUtbGliIGJpdCBzZXQgYW5kIHRoZSBvdGhlciBkb2Vzbid0LCBjbGVhciB0aGUKLQktbXJlbG9jYXRhYmxlLWxpYiBiaXQgaW4gdGhlIGhlYWRlci4KLQotU2F0IEF1ZyAxMCAyMjo1OToxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG8gbm90IHJlc29sdmUgYSBjb21tb24KLQlzeW1ib2wgYWdhaW5zdCBhIFNUVF9GVU5DIHN5bWJvbCBpbiBhIHNoYXJlZCBsaWJyYXJ5LgotCi1GcmkgQXVnICA5IDEyOjQ0OjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scyk6IElmIGEgZGVzY3JpcHRvcgotIAlzeW1ib2wgaXMgZm91bmQsIGF1dG9tYXRpY2FsbHkgZGVmaW5lIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCi0gCWNvZGUuCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IE9ubHkgc2V0ICgqc3ltX2hhc2gpLT5udW1hdXgKLQlpZiBzeW0ubl9udW1hdXggaXMgbm90IHplcm8uCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IFBlcm1pdCB0aGUgc3ltYm9sIGFuZCB0aGUgaGFzaCB0YWJsZQotCWVudHJ5IHRvIGRpc2FncmVlIGFib3V0IHRoZSBudW1iZXIgb2YgYXV4IGVudHJpZXMgaWYgdGhlIHN5bWJvbAotCWhhcyB6ZXJvLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IENyZWF0ZSB0aGUgLnJlbC5keW4KLQlzZWN0aW9uIGlmIGl0IG1pZ2h0IGJlIG5lZWRlZCwgbm90IGp1c3QgaWYgaW5mby0+c2hhcmVkLgotCShtaXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBNYWtlIHJvb20gZm9yIGEgbnVsbCBlbGVtZW50IGF0Ci0JdGhlIHN0YXJ0IG9mIC5yZWwuZHluIGlmIHdlIGFyZSBnb2luZyB0byB1c2UgaXQuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogT25seSBjbGVhciB0aGUgZmlyc3QgZWxlbWVudAotCW9mIC5yZWwuZHluIGlmIHRoZSBzaXplIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgotCi1UaHUgQXVnICA4IDE2OjI0OjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogSWYgd2UgYWxyZWFkeSBjYWxsZWQgdGhlCi0JdW5kZWZpbmVkX3N5bWJvbCBjYWxsYmFjayBmb3IgYSBzeW1ib2wsIHRoZW4gZG9uJ3QgaXNzdWUgYW55IG1vcmUKLQl3YXJuaW5ncyBhYm91dCBsb2FkZXIgcmVsb2NzLgotCShfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZG8gYW55IGZ1cnRoZXIgcHJvY2Vzc2luZwotCWFmdGVyIGNhbGxpbmcgdGhlIHVuZGVmaW5lZF9zeW1ib2wgY2FsbGJhY2suCi0KLQkqIHhjb2ZmbGluay5jIChYQ09GRl9NVUxUSVBMWV9ERUZJTkVEKTogRGVmaW5lLgotCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogUGVybWl0IG11bHRpcGxlIGRlZmluaXRpb25zIG9mIGEgc3ltYm9sCi0JYXMgdGhlIEFJWCBsaW5rZXIgc2VlbXMgdG8gZG8uCi0KLVRodSBBdWcgIDggMTI6MjE6NTYgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGV2YXgtYWxwaGEuYyAoZXZheF9hbHBoYV92ZWMpOiBDb3JyZWN0ZWQgZmxhZ3MsIGNsZWFudXAuCi0JKGV2YXhfaW5pdGlhbGl6ZSk6IFJlbW92ZSBldmF4X3JlbG9jX3RhYmxlLgotCShldmF4X2Nsb3NlX2FuZF9jbGVhbnVwKTogRGl0dG8uCi0JKHJlbG9jX25pbCk6IERpdHRvLgotCShhbHBoYV9ob3d0b190YWJsZSk6IFJlbW92ZSBBTFBIQV9SX1NXUkVMMzIgYW5kIEFMUEhBX1JfU1dSRUw2NAotCWVudHJpZXMuCi0JKGV2YXhfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGl0dG8uCi0JKiBldmF4LWVnc2QuYyAoX2JmZF9ldmF4X3NsdXJwX2Vnc2QpOiBBZGQgYSBmZXcgY2FzdHM7IHNldAotCWNvb2tlZF9zaXplID09IHJhd19zaXplLgotCSogZXZheC1lbWguYyAoX2JmZF9ldmF4X3JlZ2lzdGVyX2ZpbGVuYW1lKTogUmVtb3ZlLgotCSogZXZheC1ldGlyLmMgKGV0aXJfc3RjKTogQWxsb3cgRVRJUl9TX0NfU1RDX3h4IGNvbW1hbmRzLgotCSogZXZheC1taXNjLmMgKGFkZF9uZXdfY29udGVudHMpOiBNYWxsb2Mgc2VjdGlvbiBhdCBmdWxsIHNpemUuCi0JKF9iZmRfc2F2ZV9ldmF4X3NlY3Rpb24pOiBNZW1jcHkgc2VjdGlvbiBjb250ZW50cyBkaXJlY3RseS4KLQkqIGV2YXguaCAoQUxQSEFfUl9TV1JFTDMyLCBBTFBIQV9SX1NXUkVMNjQpOiBSZW1vdmUuCi0JKGV2YXhfcmVsb2NfdGFibGUpOiBSZW1vdmUuCi0KLQkqIGhvc3RzL2FscGhhdm1zLmggKE9fQUNDTU9ERSk6IERlZmluZSBpZiBuZWVkZWQuCi0KLQkqIG1ha2VmaWxlLnZtczogQWRkIGJldHRlciBzdXBwb3J0IGZvciBERUMgQyBjb21waWxhdGlvbgotCUFkZCBldmF4LmggZGVwZW5kZW5jaWVzCi0KLQkqIHJlbG9jLmMgKGJmZF9nZXRfcmVsb2Nfc2l6ZSk6IEFkZCBjYXNlIGZvciAxNiBieXRlIHJlbG9jLgotCShCRkRfUkVMT0NfU1dSRUwzMixCRkRfUkVMT0NfU1dSRUw2NCk6IFJlbW92ZS4KLQkoQkZEX1JFTE9DX0FMUEhBX0JBU0VSRUcpOiBSZW1vdmUuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1UaHUgQXVnICA4IDA4OjE3OjMyIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYnNkX3dyaXRlX2FybWFwKTogIElmZGVmIGFyb3VuZCBjYWxscyB0byBnZXR1aWQgYW5kCi0JZ2V0Z2lkIGlmIF9XSU4zMiBpcyBkZWZpbmVkLgotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogIFJlbW92ZSB1bm5lY2Vzc2FyeSBXSU5HREIgaWZkZWYuCi0KLVdlZCBBdWcgIDcgMjM6MTk6MDAgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCBiZmQtaW4uaCBiZmQtaW4yLmggb3BuY2xzLmMgcmlzY2l4LmMgc29tLmMgdGFyZ2V0cy5jOgotCUNoYW5nZSBOT19GTEFHUyB0byBCRkRfTk9fRkxBR1MgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBhbiBIUFVYCi0JaW5jbHVkZSBmaWxlLgotCSogbGliYmZkLmM6ICBDcmVhdGUgZHVtbXkgZ2V0cGFnZXNpemUoKSBtYWNybyBpZiBIQVZFX0dFVFBBR0VTSVpFCi0JaXNuJ3QgZGVmaW5lZC4KLQotV2VkIEF1ZyAgNyAxNDoxMTo0NCAxOTk2ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQkZEX05FRURFRF9ERUNMQVJBVElPTiBvbiBzdHJzdHIgYW5kCi0JcmVhbGxvYy4KLQkqIGFjY29uZmlnLmggKE5FRURfREVDTEFSQVRJT05fU1RSU1RSKTogTmV3IG1hY3JvLgotCShORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MpOiBOZXcgbWFjcm8uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIHN5c2RlcC5oIChzdHJzdHIpOiBEZWNsYXJlIGlmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSLgotCShyZWFsbG9jKTogRGVjbGFyZSBpZiBORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MuCi0KLQkqIGFjbG9jYWwubTQgKEJGRF9ORUVEX0RFQ0xBUkFUSU9OKTogSW5jbHVkZSA8c3RyaW5nLmg+IG9yCi0JPHN0cmluZ3MuaD4gaWYgdGhleSBleGlzdC4KLQotCSogaWVlZS5jIChpZWVlX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2FzdCBiZmRfYWxsb2MgcmV0dXJuLgotCi1XZWQgQXVnICA3IDEyOjEyOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY3B1LWkzODYuYyAoaTgwODZfYXJjaCk6IEFyY2hpdGVjdHVyZSBpbmZvIGZvciB0aGUgaTgwODYuCi0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gRXJpYyBWYWxldHRlIDx2YWxldHRlQGNyZi5jYW5vbi5mcj46Ci0JKiBlbGYzMi1pMzg2LmMgKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBGSVJTVF9JTlZBTElEX1JFTE9DLAotCUxBU1RfSU5WQUxJRF9SRUxPQywgUl8zODZfMTYsIFJfMzg2X1BDMTYsIFJfMzg2XzgsIFJfMzg2X1BDOC4KLQkoZWxmX2hvd3RvX3RhYmxlKTogQWRkIGVudHJpZXMgZm9yIG5ldyByZWxvY3MuCi0JKGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIG5ldyByZWxvY3MuCi0JKGVsZl9pMzg2X2luZm9fdG9faG93dG8pOiBKdXN0IGNhbGwgYWJvcnQuCi0JKGVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsKTogQ2hlY2sgdGhhdCB0aGUgcmVsb2MgdHlwZSBpcyB2YWxpZC4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi1UdWUgQXVnICA2IDEyOjU0OjU2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMTB2LmMgKGVsZl9kMTB2X2hvd3RvX3RhYmxlKTogQWRkZWQgUl9EMTBWXzMyLgotCi1Nb24gQXVnICA1IDEzOjQyOjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBGb3IgYSBsb2FkYWJsZSBzZWN0aW9uLAotCW9ubHkgZ2V0IHRoZSBMTUEgZnJvbSB0aGUgcGhkciBpZiB0aGV5IGFyZSBpbiB0aGUgc2FtZSBwYXJ0IG9mIHRoZQotCWZpbGUuCi0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBSZXdyaXRlIHRlc3RzIGZvciBzdGFydGluZyBhCi0JbmV3IHNlZ21lbnQgdG8gbWFrZSB0aGVtIG1vcmUgY29tcHJlaGVuc2libGUuICBJZiB0aGUgcmVsYXRpb25zaGlwCi0JYmV0d2VlbiB0aGUgTE1BIGFuZCB0aGUgVk1BIGNoYW5nZWQsIHN0YXJ0IGEgbmV3IHNlZ21lbnQuICBEb24ndAotCWNoZWNrIGR5bnNlYyB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gc3RhcnQgYSBuZXcgc2VnbWVudCBmb3IgYQotCXdyaXRlYWJsZSBzZWN0aW9uOyAtTiB3aWxsIG5vdyBoYW5kbGUgdGhpcy4KLQotVGh1IEF1ZyAgMSAyMjo0MzowOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaDogUmVtb3ZlICJlc2VsIiBjaGFuZ2VzLiAgTm90IHRoZSByaWdodCBhcHByb2FjaC4KLQkqIHNvbS5jOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8pOiBVc2UgU1RfREFUQSBmb3Igc3ltYm9scwotCXdoaWNoIGRvbid0IGhhdmUgYSBTT00gc3ltYm9sIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZW0uCi0JUmV2ZXJzZXMgYSAxOTk0IGNoYW5nZS4KLQotV2VkIEp1bCAzMSAxNTo1MDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlNYWtlIGxkIC1OIG1vcmUgcmVhc29uYWJsZSBmb3IgRUxGOgotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IElmIERfUEFHRUQgaXMgbm90IHNldCwgc2V0Ci0JcGhkcl9pbl9zZWN0aW9uIHRvIGZhbHNlLCBhbmQgYWx3YXlzIHVzZSBhIHNpbmdsZSBsb2FkIHNlZ21lbnQuCi0JKGVsZl9zb3J0X3NlY3Rpb25zKTogU29ydCBzZWN0aW9ucyBieSBMTUEgYWZ0ZXIgVk1BLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSWYgRF9QQUdFRCBpcyBub3Qgc2V0LCBkb24ndAotCWFsaWduIHRvIG1heHBhZ2VzaXplLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBJZiBhIHNlY3Rpb24gaXMgbG9hZGVkIGJ1dCBub3QgcGFnZQotCWFsaWduZWQsIGNsZWFyIERfUEFHRUQuCi0KLVdlZCBKdWwgMzEgMTU6MDA6MTIgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiByZWxvYy5jOiAoQkZEX1JFTE9DX0FSTV9PRkZTRVRJTU04LCBCRkRfUkVMT0NfQVJNX0hXTElURVJBTCk6Ci0gCUFkZGVkLCBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBBUk0gZ2FzLgotCSogbGliYmZkLmg6IFJlYnVpbHQKLQkqIGJmZC1pbjIuaDogUmVidWlsdAotCi1UdWUgSnVsIDMwIDE0OjE0OjU3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oIChSX0hQUEFfRVNFTCk6IE5ldyBmaWVsZCBzZWxlY3Rvci4KLQkoZV9lc2VsKTogU2ltaWxhcmx5LgotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogSWYgd2UgZW5jb3VudGVyIGFuIGVfZXNlbCwKLQl0aGVuIGdlbmVyYXRlIFJfQ09NUDIgKFBVU0hfU1lNKSwgUl9EQVRBX0VYUFIgZml4dXAgc3RyZWFtLgotCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfREFUQV9FWFBSIGp1c3QgbGlrZSBSX0NPREVfRVhQUi4KLQotVHVlIEp1bCAzMCAxMzozMToyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRG8gdGhlIHJlZ3VsYXIKLQlhcmNoaXZlIHNlYXJjaCBiZWZvcmUgbG9va2luZyBmb3Igc3RyaXBwZWQgZHluYW1pYyBvYmplY3RzLgotCi1GcmkgSnVsIDI2IDE3OjUxOjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IE1ha2UgZXhwb3J0aW5nIGFuIHVuZGVmaW5lZAotCXN5bWJvbCBhIHdhcm5pbmcgcmF0aGVyIHRoYW4gYW4gZXJyb3IuCi0KLVdlZCBKdWwgMjQgMTI6MDI6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IFRyYWNrIHRoZSB2aXJ0dWFsCi0JbWVtb3J5IHBvc2l0aW9uIHNlcGFyYXRlbHkgZnJvbSB0aGUgZmlsZSBwb3NpdGlvbiwgYW5kIHVzZSBpdCB0bwotCWNvbXB1dGUgdGhlIGFsaWdubWVudCBhZGp1c3RtZW50LgotCi1UdWUgSnVsIDIzIDEwOjQzOjMxIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMTB2LmMgKGVsZl9kMTB2X2hvd3RvX3RhYmxlKTogQ2hhbmdlZCBhbGwgcmVsb2NzIHRvICJsb25nIgotIAlhbmQgZml4ZWQgbWFzayBvbiBSX0QxMFZfMTBfUENSRUxfTC4KLQotTW9uIEp1bCAyMiAxNTozMDozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LW1pcHMuYzogSW5jbHVkZSAiYW91dC9hci5oIi4KLQkobWlwc19lbGY2NF9zbHVycF9hcm1hcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfZWxmNjRfd3JpdGVfYXJtYXApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfZWxmNjRfYXJjaGl2ZV8qKTogRGVmaW5lLgotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9hcmNoaXZlX3ApOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JVXNlIGluc3RlYWQgb2YgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLgotCShiZmRfZWxmTk5fd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4gIFVzZQotCWluc3RlYWQgb2YgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLgotCShiZmRfZWxmTk5fbWtkYXJjaGl2ZSk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4gIFVzZSBpbnN0ZWFkIG9mCi0JX2JmZF9nZW5lcmljX21rYXJjaGl2ZS4KLQkoVEFSR0VUX0JJR19TWU0pOiBJZiBiZmRfZWxmTk5fYXJjaGl2ZV9mdW5jdGlvbnMgaXMgZGVmaW5lZCwgdXNlCi0JYmZkX2VsZk5OX2FyY2hpdmUgaW4gQkZEX0pVTVBfVEFCTEVfQVJDSElWRSByYXRoZXIgdGhhbgotCV9iZmRfYXJjaGl2ZV9jb2ZmLgotCShUQVJHRVRfTElUVExFX1NZTSk6IExpa2V3aXNlLgotCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfYXJtYXApOiBDaGVjayBmb3IgYW5kIHJlamVjdCBhbiBhcmNoaXZlIG1hcAotCW5hbWUgb2YgL1NZTTY0Ly4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBIYW5kbGUKLQlTSFRfTUlQU19MSUJMSVNULCBTSFRfTUlQU19DT05URU5ULCBTSFRfTUlQU19TWU1CT0xfTElCLCBhbmQKLQlTSFRfTUlQU19FVkVOVFMgc2VjdGlvbnMuCi0JKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBIYW5kbGUgU0hUX01JUFNfSUZBQ0UsCi0JU0hUX01JUFNfQ09OVEVOVCwgU0hUX01JUFNfU1lNQk9MX0xJQiwgYW5kIFNIVF9NSVBTX0VWRU5UUwotCXNlY3Rpb25zLgotCShfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogbGliZWNvZmYuaCAoZWNvZmZfZGF0YV90eXBlKTogQWRkIHJkYXRhX2luX3RleHQgZmllbGQuCi0JKiBlY29mZi5jIChlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDb3B5Ci0JcmRhdGFfaW5fdGV4dCBmcm9tIGJhY2tlbmQgaW5mbyB0byB0ZGF0YS4gIENsZWFyIGl0IGlmIGFueSBkYXRhCi0Jc2VjdGlvbiBjb21lcyBiZWZvcmUgLnJkYXRhLgotCShfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSByZGF0YV9pbl90ZXh0IGZpZWxkIGluCi0JdGRhdGEgcmF0aGVyIHRoYW4gYmFja2VuZCBpbmZvLgotCi1GcmkgSnVsIDE5IDE4OjE1OjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBGaXggdGVzdCBmb3Igd2hldGhlciBhIGNvbXBpbGVyIGhhcyBhIDY0IGJpdAotCXR5cGUuICBGcm9tIEppbSBXaWxzb24gPHdpbHNvbkBjeWdudXMuY29tPi4KLQotVGh1IEp1bCAxOCAxNTozOToxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChtaXBzLXNnaS1pcml4NiopOiBOZXcgaG9zdC4KLQotCSogY29uZmlndXJlLmluOiBTZXQgYW5kIHN1YnN0aXR1dGUgVkVSU0lPTiwgQkZEX0hPU1RfNjRCSVRfTE9ORwotCShyZXBsYWNpbmcgSE9TVF82NEJJVExPTkcpLCBCRkRfSE9TVF82NF9CSVRfREVGSU5FRCwKLQlCRkRfSE9TVF82NF9CSVQsIGFuZCBCRkRfSE9TVF9VXzY0X0JJVC4gIEFkZCBiZmQtaW4yLmg6YmZkLWluMi5oCi0JdG8gQUNfT1VUUFVUIGNhbGwuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBiZmQtaW4uaCAoQkZEX0FSQ0hfU0laRSk6IERlZmluZSBhcyBAd29yZHNpemVALCBub3QgQFdPUkRTSVpFQC4KLQkoQkZEX0hPU1RfNjRfQklUKTogRGVmaW5lIGNvbmRpdGlvbmFsbHkuCi0JKEJGRF9IT1NUX1VfNjRfQklUKTogRGVmaW5lIHdoZW4gQkZEX0hPU1RfNjRfQklUIGlzIGRlZmluZWQuCi0JKGJmZF92bWEpOiBUeXBlZGVmIGFzIEJGRF9IT1NUX1VfNjRfQklULgotCShzeW12YWx1ZSwgYmZkX3NpemVfdHlwZSk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKGRvX2NsZWFuKTogUmVtb3ZlIGJmZC10bXAuaC4KLQkoZG9fZGlzdGNsZWFuKTogUmVtb3ZlIGJmZC1pbjMuaC4KLQkoc3RtcC1iZmQuaCk6IEp1c3QgZG8gY29weS1pZi1jaGFuZ2UgYmZkLWluMy5oIGJmZC5oLgotCShiZmQtaW4zLmgpOiBOZXcgdGFyZ2V0LgotCi0JKiBjb25maWcuYmZkIChzcGFyYy0qLXN5c3Y0Kik6IERvbid0IGJ1aWxkIHN1bm9zX2JpZ192ZWMuICBGcm9tCi0JQW5kcmV3IEdpZXJ0aCA8QU5EUkVXR0BtaWNyb2xpc2UuY28udWs+LgotCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IElOU1RBTExfU0hMSUIuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfU1VCU1QgKElOU1RBTExfU0hMSUIpLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBVc2UgQElOU1RBTExfU0hMSUJALgotCi0JKiBjb25maWcuYmZkIChtaXBzKi0qLWlyaXg2Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaG9zdDogSGFuZGxlIElyaXggNiBzaGFyZWQgbGlicmFyeSBsaWtlIElyaXggNS4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBjaGVjayBhbiBYTUNfVEQKLQlzeW1ib2wgZm9yIGEgbWFnaWMgbmFtZS4KLQkoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBjaGFuZ2UgdGhlIHJlbG9jIHN5bWJvbCBmb3IgYW4KLQlYTUNfVEQgc3ltYm9sLgotCShfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZ2V0IHRoZSBUT0Mgb2Zmc2V0IGZvciBhbgotCVhNQ19URCBzeW1ib2wuCi0KLVRodSBKdWwgMTggMTE6MzY6MzEgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBBZGQgRUxGIHN1cHBvcnQgdG8gbWlwcyBjb25maWcsIGNyZWF0ZSB0aGUKLQllbGYzMi10YXJnZXQuaCBmaWxlIGluIHRoZSBvYmplY3QgZGlyLgotCSogbXB3LW1ha2Uuc2VkOiBFZGl0IGVsZlhYLXRhcmdldC5oIHJlZnMgYXQgYmVnaW5uaW5ncyBvZiBsaW5lcy4KLQotV2VkIEp1bCAxNyAxODowMjozMiAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYzogUmVkaWQgZGVidWcgc2NoZW1lIC0gbnVtZXJvdXMgZnByaW50ZidzIGdvbmUuCi0JQWxzbyByZW1vdmVkIG1vc3QgYWJvcnQgY2FsbHMsIGluIGZhdm9yIG9mIHVzaW5nIGJmZCByZXBvcnRpbmcuCi0KLVdlZCBKdWwgMTcgMTQ6NTE6NTIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgY3B1LWQxMHYuby4KLQkoQkZEMzJfQkFDS0VORFMpIEFkZCBlbGYzMi1kMTB2Lm8uCi0JKiBhcmNodXJlcy5jOiBBZGQgYmZkX2QxMHZfYXJjaC4KLQkqIGJmZC1pbjIuaDogQWRkIGJmZF9kMTB2X2FyY2guCi0JKiBjb25maWcuYmZkIChkMTB2LSotKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IChiZmRfZWxmMzJfZDEwdl92ZWMpIE5ldyB2ZWN0b3IuCi0JKiBjb25maWd1cmUuaW46IChiZmRfZWxmMzJfZDEwdl92ZWMpIE5ldyB2ZWN0b3IuCi0JKiBjcHUtZDEwdi5jOiBOZXcgZmlsZS4KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGRlZCBjYXNlIGJmZF9hcmNoX2QxMHYuCi0JKiBlbGYzMi1kMTB2LmM6IE5ldyBmaWxlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SLCBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MLAotIAlCRkRfUkVMT0NfRDEwVl8xOCwgQkZEX1JFTE9DX0QxMFZfMThfUENSRUwpOiBEZWZpbmUuCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGYzMl9kMTB2X3ZlYyk6IE5ldyB2ZWN0b3IuCi0KLVdlZCBKdWwgMTcgMTA6NTg6NTUgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmVkIGJvZ3VzIGZwcmludGYKLQotVHVlIEp1bCAxNiAyMzo0OTowMiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBhcmNodXJlcy5jIGJmZC1pbjIuaDogIEFkZCBiZmRfbWFjaF9pMzg2X2kzODYgYW5kCi0JYmZkX21hY2hfaTM4Nl9pODA4NiBtYWNoaW5lIHR5cGVzLgotCi1XZWQgSnVsIDEwIDEyOjQyOjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9uZXdfc2VjdGlvbl9ob29rKTogU2V0IFNFQ19DT0RFIGZvciBfSU5JVAotCWFuZCBfRklOSSBzZWN0aW9ucy4KLQotV2VkIEp1bCAxMCAxMToxODoyMSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEEvVVggZG9lcyBub3QgcmVxdWlyZQotCXNwZWNpYWwgaGFuZGxpbmcgb2YgdGhlIF9MSUIgc2VjdGlvbi4KLQotVHVlIEp1bCAgOSAxNTo1MjoyMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IFVzZSB0aGUgY29ycmVjdAotCXZhbHVlIGZvciBSX1JFTEJZVEUuCi0KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogT25seSAic2hyaW5rcyIKLQlhcnJheSBpZiBvbmUgd2FzIGFsbG9jYXRlZC4KLQotVHVlIEp1bCAgOSAxMjoyMTo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEthenVtb3RvIEtvamltYSA8a2tvamltYUBray5pbmZvLmthbmFnYXdhLXUuYWMuanA+OgotCSogZWxmMzItbWlwcy5jIChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIG5ldyBmaWVsZHMKLQl1c2VfcmxkX29ial9oZWFkIGFuZCBybGRfdmFsdWUuCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKG1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IE1hcmsgX19ybGRfb2JqX2hlYWQgc3ltYm9sIGFzCi0JZHluYW1pYy4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDcmVhdGUgLnJsZF9tYXAgc2VjdGlvbi4gIElmCi0JX19ybGRfb2JqX2hlYWQgc3ltYm9sIG5vdCBzZWVuLCBjcmVhdGUgYW4gX19ybGRfbWFwIHN5bWJvbC4KLQkobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTWFrZSBzcGFjZSBpbiAucmxkX21hcCBzZWN0aW9uLgotCUNyZWF0ZSBhIERUX01JUFNfUkxEX01BUCBlbnRyeSByYXRoZXIgdGhhbiBhIERUX0RFQlVHIGVudHJ5LgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBTYXZlIHZhbHVlIG9mIF9fcmxkX21hcCBvcgotCV9fcmxkX29ial9oZWFkIHN5bWJvbC4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBIYW5kbGUgRFRfTUlQU19STERfTUFQLgotCi1Nb24gSnVsICA4IDE2OjE4OjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX3JlbG9jX21hcCk6IFJlbW92ZSBCRkRfUkVMT0NfMzJfUENSRUwgZW50cnkuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IEZvciBSX1BQQ19BRERSMTZfSEEsIHVzZQotCXBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLgotCShwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGNvZmYtbWlwcy5jIChzdHJ1Y3QgbWlwc19oaSk6IERlZmluZS4KLQkobWlwc19yZWZoaV9saXN0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLSAJKG1pcHNfcmVmaGlfYWRkciwgbWlwc19yZWZoaV9hZGRlbmQpOiBSZW1vdmUuCi0JKG1pcHNfcmVmaGlfcmVsb2MpOiBNYWludGFpbiBhIGxpc3Qgb2YgdW5tYXRjaGVkIFJFRkhJIHJlbG9jcy4KLQkobWlwc19yZWZsb19yZWxvYyk6IFByb2Nlc3MgbWlwc19yZWZoaV9saXN0LgotCShtaXBzX3JlbGhpX2xpc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtaXBzX3JlbGhpX2FkZHIsIG1pcHNfcmVsaGlfYWRkZW5kKTogUmVtb3ZlLgotCShtaXBzX3JlbGhpX3JlbG9jKTogTWFpbnRhaW4gYSBsaXN0IG9mIHVubWF0Y2hlZCBSRUxISSByZWxvY3MuCi0JKG1pcHNfcmVsbG9fcmVsb2MpOiBQcm9jZXNzIG1pcHNfcmVsaGlfbGlzdC4KLQkobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogUGVybWl0IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgUkVGSEkgb3IKLQlSRUxISSByZWxvY3MgYmVmb3JlIHRoZSBhc3NvY2lhdGVkIFJFRkxPIG9yIFJFTExPIHJlbG9jLgotCi1GcmkgSnVsICA1IDE5OjI3OjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dC10YXJnZXQuaCAoTVkoY2FsbGJhY2spKTogU2V0IHJlbG9jX2NvdW50IGZpZWxkcy4KLQotVGh1IEp1bCAgNCAxMjowMDozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBEb24ndCBjcmVhdGUgZHluYW1pYwotCXNlY3Rpb25zIHVubGVzcyB0aGlzIGlzIGEgU3VuT1MgbGluay4KLQotCSogVkVSU0lPTjogU2V0IHRvIDIuNy4xLgotCi0JKiBSZWxlYXNlZCBiaW51dGlscyAyLjcuCi0KLVdlZCBKdWwgIDMgMTQ6NTk6NDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2YW91dC5jOiBJbmNsdWRlICJhb3V0L2FvdXQ2NC5oIi4KLSAJKGkzODZhb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERlZmluZS4KLQotCSogbmV0YnNkLmggKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBNYWtlIHN1cmUgdGhhdAotCWFkanVzdF9zaXplc19hbmRfdm1hcyBpcyBjYWxsZWQgYmVmb3JlIGZpZGRsaW5nIHdpdGggdGhlIG1hZ2ljCi0JbnVtYmVyLgotCi1UdWUgSnVsICAyIDIzOjMwOjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMpOiBGaXggY2FzdHMgb2YgcHNpbmZvLgotCi1TdW4gSnVuIDMwIDEzOjM0OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLWluLmggKGl0b3MsIHN0b2kpOiBEb24ndCBkZWZpbmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGkzODZseW54LmMgKEtFRVBJVCk6IERlZmluZSBhcyB1ZGF0YS5pLgotCShOQU1FKGx5bngsc3dhcF9zdGRfcmVsb2Nfb3V0KSk6IERvbid0IHVzZSBzdG9pLgotCShOQU1FKGx5bngsc3dhcF9leHRfcmVsb2Nfb3V0KSk6IExpa2V3aXNlLgotCSogcmlzY2l4LmMgKHJpc2NpeF9zd2FwX3N0ZF9yZWxvY19vdXQpOiBVc2UgdWRhdGEuaSByYXRoZXIgdGhhbgotCWZsYWdzLiAgRG9uJ3QgdXNlIHN0b2kuCi0KLQkqIGVsZjMyLW1pcHMuYyAoRUxGX01BR1BBR0VTSVpFKTogQ2hhbmdlIGRlZmluaXRpb24gdG8gMHgxMDAwLgotCi0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogRG9uJ3Qgc3RhcnQgYSBuZXcgc2VnbWVudCBmb3IKLSAJYSB3cml0YWJsZSBzZWN0aW9uIGlmIGl0J3Mgb24gdGhlIHNhbWUgcGFnZSBhcyB0aGUgcHJldmlvdXMKLSAJc2VnbWVudC4gIFJlc2V0IHRoZSB3cml0YWJsZSB2YXJpYWJsZSBmb3IgYSByZWFkb25seSBzZWN0aW9uLgotCi1TYXQgSnVuIDI5IDE2OjE4OjUxIDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hb3V0aGRyX2luKTogTWlzc2luZyBpbml0aWFsaXphdGlvbnMgb2YKLQlmaXJzdF90aHVua19hZGRyZXNzLCB0aHVua19zaXplLCBhbmQgaW1wb3J0X3RhYmxlX3NpemUuCi0JKiBwZWljb2RlLmg6IEltcHJvdmVkIHNvbWUgZGlhZ25vc3RpY3MgcmVnYXJkaW5nIGVkYXRhIHNlY3Rpb25zLgotCi0JKiBjb2ZmLXBwYy5jIChjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogRWFybGllciBlcnJvciBjaGVjawotCW9uIElNR0xVRSByZWxvY3MuCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBJbXByb3ZlZCBkaWFnbm9zdGljIGZvciBsYXJnZSBUT0NERUZOJ3MuCi0JKFRBUkdFVF9MSVRUTEVfU1lNKTogQWRkZWQgbWlzc2luZyBEX1BBR0VELgotCi1GcmkgSnVuIDI4IDEzOjQ4OjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IEFuIHVuZGVmaW5lZCBzeW1ib2wKLQl3aXRoIFhDT0ZGX0RFRl9EWU5BTUlDIHNldCBpcyByZWFsbHkgZGVmaW5lZC4KLQkoeGNvZmZfbGlua19jaGVja19keW5hbWljX2FyX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IE9ubHkgY3JlYXRlIHNwZWNpYWwgc2VjdGlvbnMgaWYgdXNpbmcgYW4KLQlYQ09GRiBoYXNoIHRhYmxlLgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogSGFuZGxlIHhjb2ZmLXBvd2VybWFjIGxpa2UKLQlhaXhjb2ZmLXJzNjAwMC4KLQkoYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCi1GcmkgSnVuIDI4IDExOjE3OjAwIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBmbGFncwotCWZpZWxkLgotCShBTFBIQV9FTEZfTElOS19IQVNIX0xVX0FERFIpOiBEZWZpbmUuCi0JKEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfTUVNKTogRGVmaW5lLgotCShBTFBIQV9FTEZfTElOS19IQVNIX0xVX0ZVTkMpOiBEZWZpbmUuCi0JKGVsZjY0X2FscGhhX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBmbGFncyBmaWVsZC4KLQkoZWxmNjRfYWxwaGFfY2hlY2tfcmVsb2NzKTogUmVjb3JkIHR5cGVzIG9mIExJVFVTRSBlbnRyaWVzIHRoYXQKLQlhcmUgZm91bmQgZm9yIExJVEVSQUwgcmVsb2NzLgotCShlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBhIHN5bWJvbCBoYXMgaXRzIGFkZHJlc3MKLQl0YWtlbiwgd2UgY2Fubm90IGdlbmVyYXRlIGEgLnBsdCBlbnRyeSBmb3IgdGhlIHN5bWJvbC4KLQotVGh1IEp1biAyNyAxMToyNDoyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0lTQ19QT1NJWCwgYW5kIGNoZWNrIGZvciBzZXRpdGltZXIgYW5kCi0Jc3lzY29uZiBmdW5jdGlvbnMgKGZvciBncHJvZikuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotV2VkIEp1biAyNiAxNjoyOTowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfYXJjaGl2ZV9wKTogQ2hlY2sgdGhlIGZpcnN0IG9iamVjdCBmaWxlIGluCi0JYW4gYXJjaGl2ZSBpZiBpdCBoYXMgYSBtYXAuICBJZiB0aGUgb2JqZWN0IGZpbGUgaGFzIHRoZSB3cm9uZwotCXh2ZWMsIHJlamVjdCBpdC4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9hZGp1c3RfcmVsb2NfaW4pOiBTZXQgdGhlIGFkZGVuZCBmb3IgYQotCUJSQUREUiwgU1JFTDE2LCBTUkVMMzIsIG9yIFNSRUw2NCByZWxvYyBhZ2FpbnN0IGFuIGV4dGVybmFsCi0Jc3ltYm9sLgotCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9yZWxvY19vdXQpOiBVc2UgUkVMU1osIG5vdCBzaXplb2YuCi0JKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IFVzZSBGSUxIU1osIG5vdCBzaXplb2YuCi0JKGNvZmZfc3dhcF9zeW1fb3V0KTogVXNlIFNZTUVTWiwgbm90IHNpemVvZi4KLQkoY29mZl9zd2FwX2F1eF9vdXQpOiBVc2UgQVVYRVNaLCBub3Qgc2l6ZW9mLgotCShjb2ZmX3N3YXBfbGluZW5vX291dCk6IFVzZSBMSU5FU1osIG5vdCBzaXplb2YuCi0JKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IFVzZSBBT1VUU1osIG5vdCBzaXplb2YuCi0JKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogVXNlIFNDTkhTWiwgbm90IHNpemVvZi4KLQkqIHBlaWNvZGUuaDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1UdWUgSnVuIDI1IDE1OjI4OjM0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBDb21tZW50IG91dCBjb2RlCi0JZGVhbGluZyB3aXRoIG1ha2luZyBHT1QgcG9pbnRlcnMgbmVnYXRpdmUgb2YgdGhlIEdPVCBzeW1ib2wgZm9yCi0Jbm93LgotCi1UdWUgSnVuIDI1IDExOjQxOjI0IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndAotCWluY3JlbWVudCB0aGUgLnJlbGEucGx0IHNpemUgdW50aWwgYWZ0ZXIgd2UncmUgZG9uZSBjcmVhdGluZyB0aGUKLQkucGx0IGVudHJ5LgotCShlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBDaGFuZ2UgLnBsdCBlbnRyeSB0byBsb2FkIHRoZQotCS5yZWxhLnBsdCBvZmZzZXQgZGlyZWN0bHkgcmF0aGVyIHRoYW4gY2FsY3VsYXRpbmcgaXQuCi0KLU1vbiBKdW4gMjQgMTc6MTU6MTAgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotICAgICAgICAqIE1ha2VmaWxlLmluLCAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgaW5jbHVkZWRpcik6Ci0JVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCi0gICAgICAgICogZG9jL01ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLAotCWluY2x1ZGVkaXIsIElOU1RBTEwsIElOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldAotCXZhbHVlcy4KLSAgICAgICAgKGRvY2Rpcik6IERlbGV0ZWQuCi0gICAgICAgICogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBhdXRvY29uZiB2Mi41IG9yIGhpZ2hlci4KLSAgICAgICAgKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLU1vbiBKdW4gMjQgMjI6NTA6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcyk6IEZpeCB0eXBvIGluIFJfRU5EX1RSWSBmb3IgZXhjZXB0aW9uCi0JaGFuZGxpbmcgY29kZSA+IDFrIGF3YXkuCi0KLU1vbiBKdW4gMjQgMTg6NDE6MDYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IElmIERFQlVHIGlzCi0JZGVmaW5lZCwgb3V0cHV0IHdoZW5ldmVyIHRoZSBzeW1ib2wgaXMgdXBkYXRlZC4KLQotTW9uIEp1biAyNCAxNzo1ODoxMiAxOTk2ICBKb3VrZSBOdW1hbiAgPGpudW1hbkBiYXppcy5ubD4KLQotCSogZWxmLmMgKGVsZl9mYWtlX3NlY3Rpb25zKTogRG9uJ3Qgc2V0IHNoX2FkZHIgb2YgYSBub24gU0VDX0FMTE9DCi0Jc2VjdGlvbiB0byAwIGlmIHVzZXJfc2V0X3ZtYSBpcyBzZXQuCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IExpa2V3aXNlLgotCi1TdW4gSnVuIDIzIDIwOjQyOjUxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQlQYXJ0aWFsbHkgdW5kbyBwYXRjaCBvZiBKdW4gMjAuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IFVzZSBDT0ZGX0lNQUdFX1dJVEhfUEUuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuICBSZS1hZGQgZGVsZXRlZCBjb2RlLCBidXQKLQl1c2UgI2lmZGVmIENPRkZfV0lUSF9QRSwgbm90IENPRkZfT0JKX1dJVEhfUEUuCi0JKiBwZWljb2RlLmggKHBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBSZS1hZGQgI2lmZGVmLgotCi1GcmkgSnVuIDIxIDE3OjM4OjE1IDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG1lcmxpbi5nY3MucmVkc3RvbmUuYXJteS5taWw+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciAqLSotcnRlbXMqIGNvbmZpZ3VyYXRpb25zLgotCi1GcmkgSnVuIDIxIDE1OjE5OjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZCBiZmRfYXJjaF9hbHBoYSBjYXNlLgotCi1GcmkgSnVuIDIxIDEyOjM1OjI3IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5iZmQgKGFscGhhLSotbGludXhlY29mZiopOiBOZXcgdGFyZ2V0LgotCShhbHBoYS0qLWxpbnV4KiwgYWxwaGEtKi1lbGYqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGY2NF9hbHBoYV92ZWMpOiBOZXcgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmNjRfYWxwaGFfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgYmZkX2VsZjY0X2FscGhhX3ZlYyBpZiBCRkQ2NC4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19BTFBIQV9HUERJU1ApOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQkZENjRfQkFDS0VORFMpOiBBZGQgZWxmNjQtYWxwaGEuby4KLQkoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjY0LWFscGhhLmMuCi0KLVRodSBKdW4gMjAgMTg6MTQ6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9hcm1hcF9oYXNoKTogSWYgaGxvZyBpcyAwLCBqdXN0IHJldHVybiAwLCByYXRoZXIKLQl0aGFuIHJlbHlpbmcgb24gYSByaWdodCBzaGlmdCBvZiAzMi4KLQotVGh1IEp1biAyMCAxMTowMDo1NyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IENoYW5nZSBDT0ZGX0lNQUdFX1dJVEhfUEUKLQlpZmRlZiB0byBDT0ZGX1dJVEhfUEUuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuICBEZWxldGUgQ09GRl9PQkpfV0lUSF9QRS4KLQkqIHBlLXthcm0saTM4NixwcGN9LmMgKENPRkZfT0JKX1dJVEhfUEUpOiBEZWxldGUuCi0JKiBwZWljb2RlLmggKHBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWxldGUgaWZkZWYKLQlDT0ZGX0lNQUdFX1dJVEhfUEUsIGFsd2F5cyBpbmNsdWRlLgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogIi5kcmVjdHZlIiBkb2Vzbid0IGhhdmUgdHJhaWxpbmcgMC4KLQotV2VkIEp1biAxOSAxMTozNzo1MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBGaXggdXAgdGhlIHRlc3QgZm9yIC1UdGV4dCB0bwotCWFwcHJveGltYXRlIHRoZSBjb3JyZWN0IGFuc3dlciBpZiBTSVpFT0ZfSEVBREVSUyB3YXMgbm90IHVzZWQuCi0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTZXQgc2VjdGlvbiBmaWxlCi0JcG9zaXRpb24gYmFzZWQgb24gTE1BIHJhdGhlciB0aGFuIFZNQS4KLQotV2VkIEp1biAxOSAxMToxOToyNSAxOTk2ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FSUM1IDYwLzMvMTQyICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBEb24ndCBvdXRwdXQgYW55Ci0Jc3ltYm9scyBpZiBpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwuCi0KLVR1ZSBKdW4gMTggMTU6MTc6MzYgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaDgzMDAuYzogUmVtb3ZlICNpZiAwIGNvZGUuCi0JKGNvbXBhdGFibGUpOiBEb24ndCBhbGxvdyBtaXhpbmcvbWF0Y2hpbmcgb2YgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2g4MzAwcyk6IEFkZC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGNvZmYtaDgzMDAuYyAoZnVuY3ZlY19oYXNoX25ld2Z1bmMpOiBIYW5kbGUgSDgvUyB0b28uCi0JKEJBRE1BRyk6IExpa2V3aXNlLgotCShoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogTGlrZXdpc2UuCi0JKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBMaWtld2lzZS4KLQkoaDgzMDBfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogTGlrZXdpc2UuCi0JKGNvZmZfc2V0X2ZsYWdzKTogTGlrZXdpc2UuCi0JKiBjcHUtaDgzMDAuYyAoaDgzMDBfc2Nhbik6IExpa2V3aXNlLgotCUFkZCBIOC9TIHRvIGJmZF9oODMwMF9hcmNoIGxpc3QuCi0KLVR1ZSBKdW4gMTggMTQ6NDI6NTggMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQlBZGRlZCBzdXBwb3J0IGZvciBBbHBoYSBPcGVuVk1TOgotCSogZXZheC5oLCBldmF4LWFscGhhLmMsIGV2YXgtZWdzZC5jLCBldmF4LWVtaC5jOiBOZXcgZmlsZXMuCi0JKiBldmF4LWV0aXIuYywgZXZheC1taXNjLmMsIGhvc3RzL2FscGhhdm1zLmg6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZy5oLXZtcywgbWFrZWZpbGUudm1zOiBOZXcgZmlsZXMuCi0JKiBjb25maWcuYmZkIChhbHBoYS0qLSp2bXMqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoZXZheF9hbHBoYV92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19TV1JFTDMyLCBCRkRfUkVMT0NfU1dSRUw2NCk6IERlZmluZS4KLQkoQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UsIEJGRF9SRUxPQ19BTFBIQV9CQVNFUkVHKTogRGVmaW5lLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cik6IERlZmluZS4KLQkoZXZheF9hbHBoYV92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBlY29mZmFscGhhX2xpdHRsZV92ZWMgYW5kIGV2YXhfYWxwaGFfdmVjCi0JaWYgQkZENjQgaXMgZGVmaW5lZC4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDY0X0JBQ0tFTkRTKTogQWRkIGV2YXgtYWxwaGEubywgZXZheC1lZ3NkLm8sIGV2YXgtZXRpci5vLAotCWV2YXgtZW1oLm8sIGFuZCBldmF4LW1pc2Muby4KLQkoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGV2YXgtYWxwaGEuYywgZXZheC1lZ3NkLmMsCi0JZXZheC1ldGlyLmMsIGV2YXgtZW1oLmMsIGFuZCBldmF4LW1pc2MuYy4KLQkoSEZJTEVTKTogQWRkIGV2YXguaC4KLQotVHVlIEp1biAxOCAxMzo1NDoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IE1ha2UgbmFtZSBhIGNvbnN0Ci0JcG9pbnRlci4KLQkoaDgzMDBfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQotTW9uIEp1biAxNyAxMDowNjo1MCAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogc29tLmggKFJfSFBQQV9CRUdJTl9UUlksIFJfSFBQQV9FTkRfVFJZKTogRGVmaW5lLgotCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9CRUdJTl9UUlkgYW5kIFJfRU5EX1RSWS4KLQotTW9uIEp1biAxNyAxMjo0OToxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGNyZWF0ZSBhIHJlbG9jCi0JZm9yIFJfTUlQU19SRUwzMiBhbmQgUl9NSVBTXzMyIHJlbG9jcyBpZiBubyBkeW5hbWljIHNlY3Rpb25zIHdlcmUKLQljcmVhdGVkLgotCShtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBPbmx5IGNyZWF0ZSAucmVsLmR5biBmb3IgUl9NSVBTX1JFTDMyIGFuZAotCVJfTUlQU18zMiByZWxvY3MgaWYgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQotVGh1IEp1biAxMyAyMDoxNDo1MSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGFkZF9kYXRhX2VudHJ5KTogVXNlIHBlaV9zZWN0aW9uX2RhdGEgcmF0aGVyIHRoYW4KLQlfY29va2VkX3NpemUuICBDb3JyZXNwb25kcyB0byBNYXkgMTMgY2hhbmdlIGluIGNvZmZjb2RlLmguCi0KLVRodSBKdW4gMTMgMTA6MjM6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIHRoZXJlIGFyZSBsb25nCi0Jc2VjdGlvbiBuYW1lcywgYWx3YXlzIHNldCB0aGUgZl9zeW1wdHIgZmllbGQsIGV2ZW4gaWYgdGhlcmUgYXJlIG5vCi0Jc3ltYm9scy4KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2ZpbGVoZHJfaW4pOiBEb24ndCBjbGVhciB0aGUgZl9zeW1wdHIgZmllbGQKLQlpZiB0aGVyZSBhcmUgbm8gc3ltYm9scy4KLQotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQlfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUuCi0JKGNvZmZfcmVhbF9vYmplY3RfcCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCW1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZS4KLQkoX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogQ2hlY2sgdGhhdCB0aGVyZSBhcmUgc29tZSBzeW1ib2xzCi0JYmVmb3JlIHRyeWluZyB0byByZWFkIHRoZSBzdHJpbmcgdGFibGUgc2l6ZS4KLQotV2VkIEp1biAxMiAxMToxNjozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogV2hlbiBjb25zaWRlcmluZyB3aGV0aGVyCi0JdG8gcmVwbGFjZSBhIHN5bWJvbCBpbiBhIGR5bmFtaWMgb2JqZWN0IHdpdGggYSBzeW1ib2wgZnJvbSBhbm90aGVyCi0JZHluYW1pYyBvYmplY3QsIGRvIHRoZSByZXBsYWNlbWVudCBpZiB0aGUgZXhpc3Rpbmcgc3ltYm9sIGlzCi0JZ2xvYmFsIGxpbmthZ2UgY29kZS4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayBleHBsaWNpdGx5Ci0JZm9yIF9wdHJnbCwgYW5kIHRyZWF0IGl0IGFzIGdsb2JhbCBsaW5rYWdlIGNvZGUuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBOb3RpY2UgaWYgd2UgZmluZCBhCi0JZmlsZW5hbWUgb3IgTl9TTyBzeW1ib2wgcGFzdCB0aGUgb2Zmc2V0LCBhbmQgdXNlIGl0IHRvIGluZGljYXRlCi0JdGhhdCB0aGVyZSBpcyBubyBsaW5lIG51bWJlciBvciBmdW5jdGlvbiB3aGVuIGFwcHJvcHJpYXRlLgotCi1UdWUgSnVuIDExIDE1OjI0OjQ4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IFNldCBYQ09GRl9ERUZfUkVHVUxBUiBmb3IgYQotCWNvbW1vbiBzeW1ib2wgZGVmaW5lZCBieSB0aGUgbGlua2VyLiAgRG9uJ3QgZXhwb3J0IGZ1bmN0aW9uIGNvZGUKLQlldmVuIGlmIGV4cG9ydF9kZWZpbmVkcyBpcyBzZXQuCi0KLU1vbiBKdW4gMTAgMTE6NTc6MjcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4MzAwLmMgKGhvd3RvX3RhYmxlKTogQWRkIG5ldyBlbnRyaWVzIGZvciBSX0JDQ19JTlYKLQlhbmQgUl9KTVBfREVMLgotCShydHlwZTJob3d0byk6IEhhbmRsZSBSX0JDQ19JTlYgYW5kIFJfSk1QX0RFTC4KLQkoaDgzMDBfc3ltYm9sX2FkZHJlc3NfcCk6IE5ldyBmdW5jdGlvbi4KLQkoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IEVsaW1pbmF0ZSBqdW1wcyBtYWRlIHVubmVjZXNzYXJ5IGJ5Ci0JcmVsYXhpbmcuCi0KLVN1biBKdW4gIDkgMTY6MzA6MjAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBGaXggbWFueSBtaW5vciBzcGFjaW5nCi0JcHJvYmxlbXMuCi0JKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUsIGNhc2VzIFJfSk1QMSwgUl9KTVAyKTogQWRqdXN0ICJkb3QiCi0JY29ycmVjdGx5IGZvciB0aGUgdHdvIHZhcmlhbnRzLiAgQWxsb3cgcmVsYXhpbmcgaWYgdGhlIHRhcmdldAotCWlzIDEyOCBieXRlcyBhd2F5IHNpbmNlIGFmdGVyIHJlbGF4YXRpb24gaXQnbGwgYmUgMTI2IGJ5dGVzIGF3YXkuCi0JKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUsIGNhc2UgUl9QQ1JXT1JEKTogQ29ycmVjdGx5IGFkanVzdAotCSJkb3QiIGFuZCAidmFsdWUiLiAgQWxsb3cgcmVsYXhpbmcgaWYgdGhlIHRhcmdldCBpcyAxMjggYnl0ZXMKLQlhd2F5IHNpbmNlIGFmdGVyIHJlbGF4YXRpb24gaXQnbGwgYmUgMTI2IGJ5dGVzIGF3YXkuCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IEtlZXAgcmVsYXhpbmcKLQl0aGUgZ2l2ZW4gc2VjdGlvbiB1bnRpbCBub3RoaW5nIGNoYW5nZXMuCi0KLVRodSBKdW4gIDYgMTU6MjQ6NDUgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IFJlbW92ZSB0aGUgX1BEQVRBCi0gCWFsaWdubWVudCBoYWNrLS13ZSBjYW4gZ2V0IHRoZSBsbm5vcHRyIGluZm8gYW5vdGhlciB3YXkgd2l0aG91dAotIAlzdWRkZW5seSBpbmNyZWFzaW5nIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzLiAgU2V0IHRoZSBmbGFncyBmb3IKLQl0aGUgX1BEQVRBIHNlY3Rpb24uCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IERvIHNvLgotCi1UaHUgSnVuICA2IDExOjI0OjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFB1dCBhIHRpbWVzdGFtcCBpbiB0aGUgZmlsZQotCXRvIGtlZXAgdGhlIEhQIGVtdWxhdG9yIGRhdGFiYXNlIGhhcHB5LgotCi0JKiBjb25maWcuYmZkOiBSZWNvZ25pemUgcG93ZXJwYy0qLWxpbnV4KiBhbmQgcG93ZXJwY2xlLSotbGludXgqLgotCUZyb20gS2V2aW4gQnVldHRuZXIgPGtldkBwcmltZW5ldC5jb20+LgotCi1XZWQgSnVuICA1IDE1OjE2OjA0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBEb24ndCB0cnkgdG8gcHJpbnQgdGhlCi0JbmFtZSBvZiBhIE5VTEwgc2VjdGlvbi4KLQotVHVlIEp1biAgNCAxODo1Mzo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IElmIG5vdGljZV9hbGwgaXMKLQlzZXQsIGFsd2F5cyBjYWxsIHRoZSBub3RpY2UgY2FsbGJhY2suCi0KLQkqIFZFUlNJT046IEluY3JlbWVudCBmb3IgYmZkbGluay5oIGNoYW5nZS4KLQotTW9uIEp1biAgMyAxMTowMTo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSKTogU2V0IHRvIDQuCi0JKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IENvcnJlY3QgaGFuZGxpbmcgb2YgZGlmZmVyZW50bHkgc2l6ZWQKLQl0cmFpbGluZyBhbGlnbm1lbnQgcmVsb2MuCi0KLQkqIGJmZC1pbi5oOiBVc2UgI2Vycm9yIGlmIEJGRF9IT1NUXzY0X0JJVCBjYW4gbm90IGJlIGRlZmluZWQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaW46IFdhcm4gaWYgdGhlcmUgaXMgbm8ga25vd24gNjQgYml0IHR5cGUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHBwY2Jvb3Quby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIHBwY2Jvb3QuYy4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJbml0aWFsaXplIGMuCi0JRnJvbSBQZXIgRm9nZWxzdHJvbSA8cGVyLmZvZ2Vsc3Ryb21AbWFpbGJveDIwMC5zd2lwbmV0LnNlPi4KLQotU2F0IEp1biAgMSAyMTo0OTo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LW1pcHMuYyAoYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX2luKQotCShiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9fb3V0KTogTW92ZSBmcm9tIGhlcmUuLi4KLQkqIGVsZjMyLW1pcHMuYyAoYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX2luKQotCShiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9fb3V0KTogLi4udG8gaGVyZS4KLQotRnJpIE1heSAzMSAxMzo1MToyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LW1pcHMuYzogSW1wcm92ZSByZWxvYyBzcGVjaWFsX2Z1bmN0aW9ucyBhbmQgaGFuZGxpbmcgb2YKLQlTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24uCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYyk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfaGkxNl9yZWxvYyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MpOiBSZW5hbWUgZnJvbSBtaXBzX2VsZl9sbzE2X3JlbG9jIGFuZAotCW1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9nb3QxNl9yZWxvYyk6IFJlbmFtZSBmcm9tIG1pcHNfZWxmX2dvdDE2X3JlbG9jIGFuZAotCW1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jKTogUmVuYW1lIGZyb20gbWlwc19lbGZfZ3ByZWwxNl9yZWxvYwotCWFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKGdwcmVsMTZfd2l0aF9ncCk6IENoZWNrIGhvd3RvLT5zcmNfbWFzayBiZWZvcmUgdXNpbmcgdmFsdWUgaW4KLQlpbnNuLgotCShfYmZkX21pcHNfZWxmX2dwcmVsMzJfcmVsb2MpOiBSZW5hbWUgZnJvbSBtaXBzX2VsZl9ncHJlbDMyX3JlbG9jCi0JYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoZ3ByZWwzMl93aXRoX2dwKTogQ2hlY2sgaG93dG8tPnNyY19tYXNrIGJlZm9yZSBmZXRjaGluZyB2YWx1ZS4KLQkoYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbik6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19vdXQpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBBY2NlcHQgLk1JUFMub3B0aW9ucyBhcyBhIG5hbWUKLQlmb3IgYSBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24uCi0JKG1pcHNfZWxmMzJfc2VjdGlvbl9mcm9tX3NoZHIpOiBIYW5kbGUgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLgotCShfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBDb25zaWRlciAuTUlQUy5vcHRpb25zIHRvIGJlIHRoZQotCW5hbWUgb2YgYSBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZWxmMzJfc2VjdGlvbl9wcm9jZXNzaW5nKTogU2V0IHRoZSBHUCB2YWx1ZSBpbiBhCi0JU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLgotCShfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShiZmRfZWxmMzJfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUuCi0JKiBlbGYtYmZkLmggKF9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfZ290MTZfcmVsb2MpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2dwcmVsMzJfcmVsb2MpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERlY2xhcmUuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9pbmZvX3RvX2hvd3RvKTogUmVuYW1lIGZyb20KLQllbGZfaW5mb190b19ob3d0by4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19pbmZvX3RvX2hvd3RvKTogUmVuYW1lIGZyb20KLQllbGZfaW5mb190b19ob3d0by4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9pbmZvX3RvX2hvd3RvKTogUmVuYW1lIGZyb20KLQllbGZfaW5mb190b19ob3d0by4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUuCi0KLQkqIGNvZmYtdzY1LmMgKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBSZW5hbWUgUl9NT1ZCWzEyXSB0bwotCVJfTU9WMTZCWzEyXSwgdG8gbWF0Y2ggY2hhbmdlIGluIGNvZmYvaW50ZXJuYWwuaC4KLQotVGh1IE1heSAzMCAxMjozODo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LW1pcHMuYzogRXh0ZW5zaXZlIGFkZGl0aW9ucyB0byBwcm92aWRlIGJldHRlciBzdXBwb3J0IGZvcgotCXdyaXRpbmcgZmlsZXMgYW5kIGZvciBnYXMuCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfb2JqZWN0X3ApOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQKLQlvZiBtaXBzX2VsZl9vYmplY3RfcC4KLQkobWlwc19lbGYzMl9vYmplY3RfcCk6IFJlbmFtZSBmcm9tIG1pcHNfZWxmX29iamVjdF9wOyBjYWxsCi0JX2JmZF9taXBzX2VsZl9vYmplY3RfcC4KLQkoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfZmFrZV9zZWN0aW9ucyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nLgotCShtaXBzX2VsZjMyX3NlY3Rpb25fcHJvY2Vzc2luZyk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nOyBjYWxsCi0JX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcuCi0JKF9iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8gYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkobWlwc19lbGYzMl9lY29mZl9kZWJ1Z19zd2FwKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9lY29mZl9kZWJ1Z19zd2FwLgotCSogZWxmLmMgKF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBVc2UgYXN5bWJvbCByYXRoZXIgdGhhbgotCXN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkuCi0JKF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jKTogTmV3IGZ1bmN0aW9uLCBtb3ZlZCBpbiBmcm9tCi0JZWxmY29kZS5oOnZhbGlkYXRlX3JlbG9jLgotCSogZWxmY29kZS5oICh2YWxpZGF0ZV9yZWxvYyk6IFJlbW92ZTsgbW92ZWQgaW50byBlbGYuYyBhbmQgcmVuYW1lZAotCXRvIF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCSogZWxmLWJmZC5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBEZWNsYXJlLgotCShfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX29iamVjdF9wKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IERlY2xhcmUuCi0JKiBlbGZ4eC10YXJnZXQuaCAoYmZkX2VsZk5OX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IERvbid0IGRlZmluZQotCWlmIGFscmVhZHkgZGVmaW5lZC4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9vYmplY3RfcCk6IEhhbmRsZSBFX01JUFNfQVJDSF80LgotCShtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0KLVdlZCBNYXkgMjkgMTY6MTU6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JNjQtYml0IE1JUFMgRUxGIEFCSSBvYmpkdW1wIHN1cHBvcnQ6Ci0JKiBlbGY2NC1taXBzLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQkZENjRfQkFDS0VORFMpOiBBZGQgZWxmNjQtbWlwcy5vLgotCShCRkQ2NF9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmNjQtbWlwcy5jLgotCSogY29uZmlnLmJmZCAobWlwcyplbC0qLWVsZiopIEFkZCBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYW5kCi0JYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIHRvIHRhcmdfc2VsdmVjcy4KLQkobWlwcyotKi1lbGYqKTogTGlrZXdpc2UuCi0JKiBjb25maW5ndXJlLmluOiBBZGQgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGFuZAotCWJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyB0byB2ZWN0b3Igc3dpdGNoLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogTmV3IGZ1bmN0aW9uLAotCWJyb2tlbiBvdXQgb2YgbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIuCi0JKG1pcHNfZWxmMzJfc2VjdGlvbl9mcm9tX3NoZHIpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyLiAgQ2FsbCBuZXcgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyKTogVXBkYXRlIG5hbWUgb2YgcmVuYW1lZCBmdW5jdGlvbi4KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9zaXplX2luZm8pOiBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciBvZgotCXdyaXRlX291dF9waGRycyB0byBiZSBjb25zdC4gIExpa2V3aXNlIGZvciBzZWNvbmQgcGFyYW1ldGVyIG9mCi0Jc3dhcF9zeW1ib2xfb3V0LgotCShzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgcmVsX2hkcjIgZmllbGQuCi0JKGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbik6IENoYW5nZSBzZWNvbmQgcGFyYW1ldGVyIHRvIGJlIGNvbnN0LgotCShiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zd2FwX3JlbG9jX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9yZWxvY2FfaW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9waGRyX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zd2FwX3BoZHJfb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zd2FwX2R5bl9pbik6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9keW5fb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zbHVycF9zeW1ib2xfdGFibGUpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfd3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfd3JpdGVfb3V0X3BoZHJzKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfc3ltYm9sX2luKTogQ2hhbmdlIHNlY29uZCBwYXJhbWV0ZXIgdG8gYmUgY29uc3QuCi0JKGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3N3YXBfcmVsb2NfaW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3N3YXBfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9pbik6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX3BoZHJfaW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3N3YXBfcGhkcl9vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3N3YXBfZHluX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3NsdXJwX3N5bWJvbF90YWJsZSk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF93cml0ZV9zaGRyc19hbmRfZWhkcik6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF93cml0ZV9vdXRfcGhkcnMpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogRGVjbGFyZS4KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBSZW1vdmUgYXNzZXJ0aW9uIHJlcXVpcmluZwotCVNIVF9SRUwvU0hUX1JFTEEgdG8gbWF0Y2ggdXNlX3JlbGFfcC4gIElmIHRoZXJlIGlzIGFscmVhZHkgYSByZWxvYwotCXNlY3Rpb24gZm9yIHRoZSBzZWN0aW9uLCBhZGQgdGhlIG5ldyBvbmUgdG8gcmVsX2hkcjIuICBJbmNyZW1lbnQKLQlyZWxvY19jb3VudCByYXRoZXIgdGhhbiBzZXR0aW5nIGl0LgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRGVmaW5lIG5hbWUgYXMgbWFjcm8uCi0JUmVtb3ZlIHN0YXRpYyBkZWNsYXJhdGlvbi4KLQkoZWxmX3dyaXRlX3NoZHJzX2FuZF9laGRyKTogRGVmaW5lIG5hbWUgYXMgbWFjcm8uCi0JKGVsZl93cml0ZV9vdXRfcGhkcnMpOiBMaWtld2lzZS4KLQkoZWxmX3N3YXBfZWhkcl9pbiwgZWxmX3N3YXBfZWhkcl9vdXQpOiBEZWNsYXJlLgotCShlbGZfc3dhcF9zaGRyX2luLCBlbGZfc3dhcF9zaGRyX291dCk6IERlY2xhcmUuCi0JKGVsZl9zd2FwX3N5bWJvbF9pbik6IENoYW5nZSBzZWNvbmQgcGFyYW1ldGVyIHRvIGJlIGNvbnN0LgotCShlbGZfc3dhcF9zeW1ib2xfb3V0KTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX2VoZHJfaW4sIGVsZl9zd2FwX2VoZHJfb3V0KTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX3NoZHJfaW4sIGVsZl9zd2FwX3NoZHJfb3V0KTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX3BoZHJfaW4sIGVsZl9zd2FwX3BoZHJfb3V0KTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX3JlbG9jX2luLCBlbGZfc3dhcF9yZWxvY19vdXQpOiBMaWtld2lzZS4KLQkoZWxmX3N3YXBfcmVsb2NhX2luLCBlbGZfc3dhcF9yZWxvY2Ffb3V0KTogTGlrZXdpc2UuCi0JKGVsZl93cml0ZV9vdXRfcGhkcnMpOiBSZW5hbWUgZnJvbSB3cml0ZV9vdXRfcGhkcnMuICBDaGFuZ2Ugc2Vjb25kCi0JcGFyYW1ldGVyIHRvIGJlIGNvbnN0LiAgTWFrZSBub24tc3RhdGljLgotCShlbGZfd3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBSZW5hbWUgZnJvbSB3cml0ZV9zaGRyc19hbmRfZWhkci4KLQlNYWtlIG5vbi1zdGF0aWMuCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBNYWtlIG5vbi1zdGF0aWMuCi0JKE5BTUUoX2JmZF9lbGYsc2l6ZV9pbmZvKSk6IFVwZGF0ZSBuYW1lcyBvZiByZW5hbWVkIGZ1bmN0aW9ucy4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfaW5mb190b19ob3d0byk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoZWxmX2JhY2tlbmRfc2l6ZV9pbmZvKTogTGlrZXdpc2UuCi0JKGVsZk5OX2JlZCk6IFVzZSBlbGZfYmFja2VuZF9zaXplX2luZm8uCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyBhbmQKLQliZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMgaWYgQkZENjQgaXMgZGVmaW5lZC4KLQotCSogbGliYmZkLmMgKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBBZGQgY2FzdCB0byBmcHJpbnRmIGFyZ3VtZW50LgotCi1UdWUgTWF5IDI4IDExOjQyOjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBJbnNlcnQgbm9wIGluc3RydWN0aW9ucywgbm90Ci0JemVyb2VzLCBpbiBhbGlnbm1lbnQgaG9sZXMuCi0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTAuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBNYWtlIHJvb20gZm9yIHRoZQotCXBvdGVudGlhbCBsZWFkaW5nIHVuZGVyc2NvcmUgaW4gdGhlIGFsbG9jYXRlZCBidWZmZXIuCi0KLUZyaSBNYXkgMjQgMTQ6Mjg6MzggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBEbyBub3QgcHV0IHNtYWxsIGNvbW1vbgotCXN5bWJvbHMgaW50byAuc2JzcyBpZiB0aGlzIGlzIGEgcmVsb2NhdGFibGUgbGluay4KLQotVGh1IE1heSAyMyAxMjoyNjoyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogV2FybiBhYm91dAotCXVuZGVmaW5lZCBzeW1ib2xzIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQotRnJpIE1heSAxNyAxMzo1NDoxNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYzogQWRkIGEgYnVuY2ggb2YgbmV3IGNvZGUgYW5kIHN0YXRpYyBjb25zdCBhcnJheXMgdG8KLQlzdXBwb3J0IGFsaWduaW5nIGxvYWRzIGFuZCBzdG9yZXMgb24gZm91ciBieXRlIG1lbW9yeSBib3VuZGFyaWVzLgotCUFsc286Ci0JKHNoX2NvZmZfaG93dG9zKTogQWRkIGVudHJpZXMgZm9yIFJfU0hfQ09ERSwgUl9TSF9EQVRBIGFuZAotCVJfU0hfTEFCRUwuCi0JKHNoX3JlbGF4X3NlY3Rpb24pOiBMb29rIGZvciBSX1NIX0NPREUgcmVsb2NzLiAgSWYgd2UgZmluZCBvbmUsCi0JY2FsbCBzaF9hbGlnbl9sb2Fkcy4KLQkoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogRG9uJ3QgbWFyayBSX1NIX0NPREUgb3IgUl9TSF9EQVRBIHJlbG9jcwotCWFzIHVudXNlZC4KLQotVGh1IE1heSAxNiAxNjozNDoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNhY2hlLmMgKGJmZF9vcGVuX2ZpbGUpOiBVbmxpbmsgdGhlIGZpbGUgYmVmb3JlIG9wZW5pbmcgaXQgZm9yCi0Jd3JpdGUuICBGcm9tIE1hcnR5IExlaXNuZXIgPGxlaXNuZXJAc2RzcC5tYy54ZXJveC5jb20+LgotCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiBTZXQgb3BlbmVkX29uY2UuCi0KLVR1ZSBNYXkgMTQgMTI6MzU6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzb20uYyAoc29tX3NsdXJwX3JlbG9jX3RhYmxlKTogQ2xlYXIgZXh0ZXJuYWxfcmVsb2NzIGNhY2hlIGFmdGVyCi0JZnJlZWluZyBpdC4KLQotCSogbGliYmZkLmM6IFJlbW92ZSAjaWZkZWYgRklMRV9PRkZTRVRfSVNfQ0hBUl9JTkRFWCwgYW5kIGNvbXBpbGUKLQl0aGUgY29kZSB1bmNvbmRpdGlvbmFsbHkuCi0KLU1vbiBNYXkgMTMgMTk6NTE6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSk6IERlZmluZSBzdHJ1Y3R1cmUuCi0JKHBlaV9zZWN0aW9uX2RhdGEpOiBEZWZpbmUgbWFjcm8uCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IElmIENPRkZfSU1BR0VfV0lUSF9QRSwKLQlzdG9yZSBzX3BhZGRyIGZpZWxkIGluIHBlaV9zZWN0aW9uX2RhdGEuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogVXNlIHBlaV9zZWN0aW9uX2RhdGEgcmF0aGVyCi0JdGhhbiBfY29va2VkX3NpemUsIGFuZCBkb24ndCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgdmFsdWUuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgQ09GRl9PQkpfV0lUSF9QRSwgc2V0IHNfcGFkZHIgdG8KLQkwLiAgSWYgQ09GRl9JTUFHRV9XSVRIX1BFLCBzZXQgc19wYWRkciB0byBwZWlfc2VjdGlvbl9kYXRhLgotCSogcGVpY29kZS5oIChjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogRGVmaW5lIGlmCi0JQ09GRl9JTUFHRV9XSVRIX1BFLgotIAkocGVfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBOZXcgc3RhdGljIGZ1bmN0aW9uIGlmCi0JQ09GRl9JTUFHRV9XSVRIX1BFLgotCi1XZWQgTWF5ICA4IDE2OjEwOjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3JlYy5jIChzcmVjX3NldF9hcmNoX21hY2gpOiBXcml0ZSBhcyBhIGZ1bmN0aW9uIHJhdGhlciB0aGFuIGEKLQltYWNybyBkZWZpbml0aW9uLgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IElmIGFuIGFyY2hpdmUgaGFzCi0Jbm8gbWFwLCBqdXN0IGNoZWNrIGVhY2ggbWVtYmVyIGluIHR1cm4gdG8gc2VlIHdoZXRoZXIgaXQgaXMKLQlyZXF1aXJlZC4KLQotV2VkIE1heSAgOCAwOToxNzozNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwY2Jvb3QuYyAocHBjYm9vdF9vYmplY3RfcCk6IENoZWNrIGZvciB0eXBlIDB4NDEgaW4gcGFydGl0aW9uCi0JdGFibGUuICBDYWxsIEJGRF9BU1NFUlQgdG8gdmFsaWRhdGUgaGVhZGVyIHNpemUsIGluc3RlYWQgb2YKLQljYWxsaW5nIGZhdGFsLgotCShwcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogUHV0IHF1b3RlcyBhcm91bmQgcGFydGl0aW9uCi0JbmFtZS4KLQotVHVlIE1heSAgNyAxNjoxMDoxOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwY2Jvb3QuYzogTmV3IHRhcmdldCBmb3IgbG9va2luZyBhdCBQUENidWcgYm9vdCByZWNvcmRzLgotCi0JKiBjb25maWd7dXJlLmluLC5iZmR9OiBBZGQgc3VwcG9ydCBmb3IgcHBjYm9vdCB0YXJnZXQuCi0JKiB0YXJnZXRzLmM6IERpdHRvLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1UdWUgTWF5ICA3IDExOjE1OjE5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChob3d0b190YWJsZSk6IFVwZGF0ZSBuYW1lcyB0byBtYXRjaCByZWNlbnQKLQljaGFuZ2VzIHRvIGluY2x1ZGUvY29mZi9pbnRlcm5hbC5oLiAgRml4IG1pbm9yIGVycm9ycyBpbiB0aGUKLQlleGlzdGluZyByZWxvY3MuICBBZGQgUl9NT1ZMMSBhbmQgUl9NT1ZMMi4KLQkocnR5cGUyaG93dG8pOiBTaW1pbGFybHkuCi0JKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBSZXdyaXRlIHRvIHNpbXBsaWZ5LCBmaXggYnVncyBpbiB0aGUKLQlleGlzdGluZyByZWxheGluZyBjb2RlICBhbmQgcGVmb3JtIG1vcmUgcmVsYXhpbmcuCi0JKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBMaWtld2lzZS4KLQotTW9uIE1heSAgNiAxODoyNDowOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUpOiBIYW5kbGUgY29tbW9uCi0Jc3ltYm9scyBjb3JyZWN0bHkuCi0KLVNhdCBNYXkgIDQgMDU6MDg6NDUgMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6ICBSZWplY3QgZ2VuZXJpYyBFTEYgdGFyZ2V0IGlmCi0JZV9tYWNoaW5lIG1hdGNoZXMgYW4gYWx0ZXJuYXRlIG1hY2hpbmUgY29kZSBpbiBhIHNwZWNpZmljIGJhY2tlbmQuCi0KLQkqIG5ldGJzZC1jb3JlLmMgKG5ldGJzZF9jb3JlX3ZlYyk6ICBSZW1vdmUgaW5pdGlhbGl6ZXIgZm9yCi0Jb2Jzb2xldGUgYWxpZ25fcG93ZXJfbWluIGZpZWxkLgotCi1GcmkgTWF5ICAzIDEzOjA3OjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChyZWxvY19ob3d0b190eXBlKTogQWRkIGhvd3RvIGVudHJ5IGZvcgotCVJfUENSV09SRF9CLgotCShydHlwZTJob3d0byk6IEhhbmRsZSBSX1BDUldPUkRfQi4KLQkoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IEhhbmRsZSBSX1BDUldPUkRfQi4KLQkoaDgzMDBfcmVsb2NfMTZfZXN0aW1hdGUpOiBMaWtld2lzZS4gIFRyeSB0byB0dXJuIGEgMTZiaXQKLQlwYy1yZWxhdGl2ZSBicmFuY2ggKFJfUENSV09SRCkgaW50byBhbiA4Yml0IHBjLXJlbGF0aXZlCi0JYnJhbmNoIChSX1BDV09SRF9CKS4KLQotRnJpIE1heSAgMyAxMDo0Nzo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBTZXQgdGhlIHNlY3Rpb24gZm9yCi0JQlNGX0NPTlNUUlVDVE9SIHN5bWJvbHMuCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IENvcnJlY3Qgc2V0dGluZyBvZgotCWxhc3RfYmZfaW5kZXguCi0KLVdlZCBNYXkgIDEgMTg6Mzk6MzIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJbiBjb21kYXQgc2VjdGlvbiBsb29rdXAsCi0Jc3RvcCBsb29raW5nIHdoZW4gc2VjdGlvbiBpcyBmb3VuZC4KLQotV2VkIE1heSAgMSAxNDoxNzo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKFNUUklOR19TSVpFX1NJWkUpOiBEZWZpbmUuCi0JKHN0eXBfdG9fc2VjX2ZsYWdzKTogSGFuZGxlIGxvbmcgc3ltYm9sIG5hbWVzIHdoZW4gbG9va2luZyBmb3IgdGhlCi0Jc2VjdGlvbiBzeW1ib2wuCi0JKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBfYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzIGZpZWxkLgotCShiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMpOiBEZWZpbmUuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcy4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogSGFuZGxlIGxvbmcgc2VjdGlvbgotCW5hbWVzLgotCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCSogcGUtYXJtLmMgKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCSogcGVpLWFybS5jIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQkqIHBlLWkzODYuYyAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0JKiBwZWktaTM4Ni5jIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQkqIHBlLXBwYy5jIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQkqIHBlaS1wcGMuYyAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0KLQkqIGJvdXQuYyAoYl9vdXRfY2FsbGJhY2spOiBTZXQgbG1hIG9mIHNlY3Rpb25zLgotCShiX291dF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogUmVuYW1lIGluX2FiZmQKLQlwYXJhbWV0ZXIgdG8gb3V0cHV0X2JmZC4gIFVzZWQgaW5wdXRfYmZkIGluc3RlYWQgb2Ygb3V0cHV0X2JmZCBpbgotCXNldmVyYWwgcGxhY2VzLgotCi1UdWUgQXByIDMwIDE3OjU2OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IERvbid0IGNyZWF0ZQotCVNFQ19DT05TVFJVQ1RPUiBzZWN0aW9ucy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgZWxmX2dwLgotCUZyb20gRG9uIEJvd21hbiA8Ym93bWFuQHdhdGVybG9vLmhwLmNvbT4uCi0KLVR1ZSBBcHIgMzAgMTc6MDY6MzIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoYXJtY29mZl9saXR0bGVfdmVjKTogSWYgQ09GRl9XSVRIX1BFIGlzIGRlZmluZWQsIGFkZAotCVNFQ19MSU5LX09OQ0UgYW5kIFNFQ19MSU5LX0RVUExJQ0FURVMgdG8gc2VjdGlvbl9mbGFncy4KLQotTW9uIEFwciAyOSAxMzoxNToxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZAotCW1pcHNfMzJfcmVsb2NzIGZpZWxkLgotCShtaXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbWlwc18zMl9yZWxvY3MgZmllbGQuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3B5IFJfTUlQU19SRUwzMiBhbmQgUl9NSVBTXzMyCi0JcmVsb2NzIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sIHdoaWNoIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhcgotCWZpbGUuCi0JKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IEZvciBhIFJfTUlQU19SRUwzMiBvciBSX01JUFNfMzIgcmVsb2MKLQlhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCwgaW5jcmVtZW50IG1pcHNfMzJfcmVsb2NzLgotCShtaXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBtaXBzXzMyX3JlbG9jcyBpcyBzZXQsIGFuZAotCXRoZSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIG1ha2Ugcm9vbSBpbiB0aGUKLQkucmVsLmR5biBzZWN0aW9uLgotCi1GcmkgQXByIDI2IDE4OjAwOjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogVHJhY2sgdGhlIHJlYWwKLQlmaWxlIHBvc2l0aW9uIGFuZCB0aGUgdmlydHVhbCBmaWxlIHBvc2l0aW9uIHNlcGFyYXRlbHkuICBTZXQKLQlmaWxlcG9zIGluZm9ybWF0aW9uIGJzYWVkIG9uIHRoZSByZWFsIGZpbGUgcG9zaXRpb24uCi0JKF9iZmRfZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBIYW5kbGUgLmxpYiBzZWN0aW9ucyBsaWtlIHRoZQotCUphbiAyMyBjaGFuZ2UgdG8gY29mZmNvZGUuaC4KLQotCSogc29tLmMgKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgdGhlIHN5bWJvbCBjb3VudCB0byB0aGUKLQludW1iZXIgb2YgQkZEIHN5bWJvbHMgY3JlYXRlZC4KLQotRnJpIEFwciAyNiAxMjozNDoyOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IEZvcndhcmQgcmVsb2NhdGlvbnMgdG8gdGhlCi0Jb3V0cHV0IGZpbGUgaWYgbGlua2luZyBzaGFyZWQgb2JqZWN0cy4gIExvb3AgdG8gY2hlY2sgYWxsIHJlbG9jcywKLQlyYXRoZXIgdGhhbiByZXR1cm5pbmcgZmFsc2Ugb24gZmlyc3QgZXJyb3IuCi0KLVRodSBBcHIgMjUgMTM6MjU6MTIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBBZGQgUExUIGNhc2UuCi0JKHBwY19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBJZiAuaW50ZXJwIHNlY3Rpb24sIGJ1bXAgIwotCW9mIHByb2dyYW0gaGVhZGVycyBieSAxLgotCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEZsZXNoIG91dCBzdXBwb3J0LgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEFkZCBzdXBwb3J0IGZvciAucGx0IHNlY3Rpb24uCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogUHJpbnQgb3V0IGZpbGVuYW1lIGluIGRlYnVnIGNvZGUuICBFbmFibGUKLQlQTFQgc3VwcG9ydC4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBBZGQgc3VwcG9ydCBmb3IgUExUJ3MsIGJlZWYgdXAKLQlkZWJ1ZyBvdXRwdXQuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IElmIHRoZSBvdXRwdXQgc2VjdGlvbiBpc24ndCBkZWZpbmVkLAotCWRvbid0IGFib3J0LCBqdXN0IGdpdmUgYW4gZXJyb3IgbWVzc2FnZS4KLQotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IElmIHRoZSBzZWN0aW9uCi0JYmVpbmcgY3JlYXRlZCBpcyAuc2RhdGEgb3IgLnNkYXRhMiwgZG9uJ3QgbWFrZSB0aGUgc3ltYm9sIGR5bmFtaWMuCi0KLVdlZCBBcHIgMjQgMTQ6MDQ6MDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IExvb2sgdGhyb3VnaCB0aGUKLQltZW1iZXJzIG9mIGFuIGFyY2hpdmUgZm9yIGR5bmFtaWMgb2JqZWN0cyB3aXRoIG5vIHN5bWJvbHMsIGFuZAotCXBhc3MgdGhlbSBkaXJlY3RseSB0byBjaGVja19hcmNoaXZlX2VsZW1lbnQuCi0JKHhjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IFBhc3MgZHluYW1pYyBvYmplY3RzIHRvCi0JeGNvZmZfbGlua19jaGVja19keW5hbWljX2FyX3N5bWJvbHMuCi0JKHhjb2ZmX2xpbmtfY2hlY2tfZHluYW1pY19hcl9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl92ZWMpOiBDaGFuZ2UgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQwotCWZyb20gX2JmZF9ub2R5bmFtaWMgdG8gX2JmZF94Y29mZi4KLQkqIGxpYmNvZmYtaW4uaCAoX2JmZF94Y29mZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOgotCURlY2xhcmUuCi0JKF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogRGVjbGFyZS4KLQkoX2JmZF94Y29mZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IERlY2xhcmUuCi0JKF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX3N3YXBfbGRyZWxfaW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF94Y29mZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoeGNvZmZfZHluYW1pY19yZWxvYyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scyk6IFVzZSB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cy4KLQotVHVlIEFwciAyMyAxMjo0ODo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc3BhcmMuYyAoYmZkX2NvZmZfZ2VuZXJpY19yZWxvYyk6IFJldHVybiBiZmRfcmVsb2Nfb2sgZXZlbgotCWlmIHJlbG9jX2VudHJ5LT5hZGRlbmQgaXMgbm90IDAuCi0JKENBTENfQURERU5EKTogSnVzdCBzZXQgdGhlIGFkZGVuZCB0byByZWxvYy5yX29mZnNldC4KLQotTW9uIEFwciAyMiAxODoyOTowMSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSk6IEZpeCBzcGVsbGluZyBvZgotCVJfU1BBUkNfR0xPQl9KTVAuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9ob3d0b190YWJsZSk6IExpa2V3aXNlLgotCUFkZCBlbnRyaWVzIGZvciBSX1NQQVJDX1s1Nl0uCi0JKHNwYXJjX3JlbG9jX21hcCk6IEFkZCBlbnRyaWVzIGZvciBSX1NQQVJDX1s1Nl0uCi0KLU1vbiBBcHIgMjIgMTU6MDc6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JT3B0aW1pemUgbGlua2luZyBvZiBzdGFicyBpbiBzZWN0aW9ucyBhcyB1c2VkIGluIEVMRiBhbmQgQ09GRi4KLQkqIHN0YWJzLmM6IE5ldyBmaWxlLgotCSogbGliYmZkLWluLmggKF9iZmRfbGlua19zZWN0aW9uX3N0YWJzKTogRGVjbGFyZS4KLQkoX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzKTogRGVjbGFyZS4KLQkoX2JmZF93cml0ZV9zdGFiX3N0cmluZ3MpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpOiBBZGQgc3RhYl9pbmZvIGZpZWxkLgotCShzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgc3RhYl9pbmZvIGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogSW5pdGlhbGl6ZQotCXN0YWJfaW5mbyBmaWVsZC4KLQkoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogQ2FsbCBfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyBpZgotCWFwcHJvcHJpYXRlLgotCShfYmZkX2NvZmZfZmluYWxfbGluayk6IFdyaXRlIG91dCBzdGFiIHN0cmluZ3MgaGFzaCB0YWJsZS4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogSGFuZGxlIG9wdGltaXplZCBzdGFicyBzZWN0aW9ucy4KLQkqIGNvZmYtcHBjLmMgKHBwY19iZmRfY29mZl9maW5hbF9saW5rKTogV3JpdGUgb3V0IHN0YWIgc3RyaW5ncwotCWhhc2ggdGFibGUuCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIHN0YWJfaW5mbyBmaWVsZC4KLQkoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIHN0YWJfaW5mbyBmaWVsZC4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IEluaXRpYWxpemUgc3RhYl9pbmZvCi0JZmllbGQuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGFwcHJvcHJpYXRlLCBjYWxsCi0JX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IFdyaXRlIG91dCBzdGFiIHN0cmluZ3MgaGFzaCB0YWJsZS4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogSGFuZGxlIG9wdGltaXplZCBzdGFicyBzZWN0aW9ucy4KLQkqIHJlbG9jLmMgKF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IENoZWNrIGFkZHJlc3MgYWdhaW5zdAotCV9yYXdfc2l6ZSByYXRoZXIgdGhhbiBfY29va2VkX3NpemUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRF9MSUJTKTogQWRkIHN0YWJzLm8KLQkoQkZEX0xJQlNfQ0ZJTEVTKTogQWRkIHN0YWJzLmMuCi0KLQkqIFZFUlNJT046IEluY3JlbWVudCBmb3IgYmZkbGluay5oIGNoYW5nZS4KLQotCSogY29mZmdlbi5jIChjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBDb3JyZWN0IGhhbmRsaW5nIG9mCi0JQlNGX05PVF9BVF9FTkQgY29tbW9uIHN5bWJvbHMuCi0KLUZyaSBBcHIgMTkgMTk6MjE6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChyZWNvcmRfdG9jKTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkocHBjX2FsbG9jYXRlX3RvY19zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgQU5TSSBDIHN0cmluZyBjb25jYXRlbmF0aW9uLgotCShwcGNfY29mZl9yZWxvY190eXBlX2xvb2t1cCk6IFJlbW92ZSB1bnJlYWNoZWQgY29kZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgdGFrZSB0aGUgYWRkcmVzcwotCW9mIGFuIGFycmF5LgotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5nLgotCShwZV9wcmludF9lZGF0YSk6IExpa2V3aXNlLgotCShwZV9wcmludF9yZWxvYyk6IFJlbW92ZSBBTlNJIEMgc3RyaW5nIGNvbmNhdGVuYXRpb24uCi0KLVRodSBBcHIgMTggMTg6NTE6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBsYXN0X2JmX2luZGV4Ci0JYW5kIGxhc3RfYmYgZmllbGRzLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2F1eF9pbik6IFN3YXAgZW5kbmR4IGZpZWxkIGZvciBDX0ZDTgotCXN5bWJvbHMuCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogTGlrZXdpc2UuCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBMaWtld2lzZS4KLQkoY29mZl9zd2FwX2F1eF9vdXQpOiBMaWtld2lzZS4KLQkqIGNvZmZnZW4uYyAoY29mZl9wb2ludGVyaXplX2F1eCk6IENoZWNrIGVuZG5keCBmaWVsZCBmb3IgQ19GQ04KLQlzeW1ib2xzLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIGxhc3RfYmZfaW5kZXgKLQlmaWVsZC4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogQ2hlY2sgZW5kbmR4IGZpZWxkIGZvciBDX0ZDTiBzeW1ib2xzLgotCUZpeCB1cCAuYmYgZW5kbmR4IGxpbmsgZmllbGRzLgotCSogY29mZi1wcGMuYyAocHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIGxhc3RfYmZfaW5kZXgKLQlmaWVsZC4KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2lucHV0X2JmZCk6IENoZWNrIGVuZG5keCBmaWVsZCBmb3IgQ19GQ04KLQlzeW1ib2xzLgotCi1XZWQgQXByIDE3IDEyOjA4OjI0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcGV7LGl9LXBwYy5jIChQUENfUEUpOiBEZWZpbmUgaW5zdGVhZCBvZiBQUEMsIHNvIHRoYXQgY29tcGlsaW5nCi0Jb24gU29sYXJpcyBQb3dlclBDIHN5c3RlbXMgZG9lc24ndCBnZXQgY29uZnVzZWQuCi0KLQkqIGNjZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlICNpZmRlZiBQUENfUEUsIG5vdAotCSNpZmRlZiBQUEMuCi0KLQkqIGVsZmNvcmUuaCAoYmZkX3Byc3RhdHVzLCBiZmRfZnByZWdzZXQpOiBBZGQgdGhyZWFkIGFyZ3VtZW50LgotCShlbGZfY29yZWZpbGVfbm90ZSk6IElmIEhBVkVfU1lTX1BST0NGU19IIGlzIG5vdCBkZWZpbmVkLCBkb24ndAotCXVwZGF0ZSBkaWRfcmVnIGFuZCBkaWRfcmVnMi4KLQotV2VkIEFwciAxNyAxMzowNzozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2lucHV0X2JmZCk6IENoZWNrIGZvciBUT0Mgb3ZlcmZsb3cuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFdoZW4gY2FsbGluZyB0aGUKLQljYWxsYmFjayByb3V0aW5lcywgcGFzcyBoLT5yb290LnN0cmluZyByYXRoZXIgdGhhbiBuYW1lLCBpbiBjYXNlCi0JY29weSBpcyB0cnVlIGFuZCBuYW1lIGlzIHRyYW5zaWVudC4KLQotVHVlIEFwciAxNiAxNjozNjozOCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvcmUuaDogIEFkZCBzdXBwb3J0IGZvciBjb3JlIGZpbGVzIHdpdGggbXVsdGlwbGUgdGhyZWFkcy4KLQkoUHJpbWFyaWx5IGZvciBTb2xhcmlzLikKLQotVHVlIEFwciAxNiAxMzo0NDowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykpOiBEb24ndCBkbyBhbnl0aGluZyBpZgotCXNlY3Rpb24tPm9yZWxvY2F0aW9uIGlzIE5VTEwuCi0KLQkqIGNvZmZnZW4uYyAoYmZkX2NvZmZfZ2V0X3N5bWVudCk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2NvZmZfZ2V0X2F1eGVudCk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfY29mZl9nZXRfc3ltZW50KTogRGVjbGFyZS4KLQkoYmZkX2NvZmZfZ2V0X2F1eGVudCk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLU1vbiBBcHIgMTUgMTk6MDY6NTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKHN0cnVjdCBtaXBzX2hpMTYpOiBEZWZpbmUuCi0JKG1pcHNfaGkxNl9hZGRyLCBtaXBzX2hpMTZfYWRkZW5kKTogUmVtb3ZlLgotCShtaXBzX2hpMTZfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1pcHNfZWxmX2hpMTZfcmVsb2MpOiBNYWludGFpbiBhIGxpc3Qgb2YgdW5tYXRjaGVkIEhJMTYgcmVsb2NzLgotCShtaXBzX2VsZl9sbzE2X3JlbG9jKTogUHJvY2VzcyBtaXBzX2hpMTZfbGlzdC4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFBlcm1pdCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIEhJMTYKLQlyZWxvY3MgYmVmb3JlIHRoZSBhc3NvY2lhdGVkIExPMTYgcmVsb2MuCi0KLVdlZCBBcHIgMTAgMDA6MjM6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB2ZXJzYWRvcy5jICh2ZXJzYWRvc19zY2FuKTogQ2hlY2sgYmZkX2FsbG9jIHJldHVybiB2YWx1ZS4KLQkodmVyc2Fkb3Nfb2JqZWN0X3ApOiBDaGVjayBhbGwgYmZkX3JlYWQgcmV0dXJuIHZhbHVlcy4gIFJlcXVpcmUKLQl0aGF0IGxhbmcgZmllbGQgYmUgbGVzcyB0aGFuIDEwLCB0byBhdm9pZCBjb25mdXNpb24gd2l0aCBJbnRlbCBIZXgKLQlmaWxlcy4KLQotCSogbGliYW91dC5oIChXUklURV9IRUFERVJTKTogV3JpdGUgb3V0IHRoZSByZWxvY3MgZXZlbiBpZiB0aGVyZQotCWFyZW4ndCBhbnkgc3ltYm9scy4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19vdXQpKTogU2V0IHJfaW5kZXggdG8gTl9BQlMsCi0Jbm90IDAsIGZvciBhbiBhYnNvbHV0ZSBzeW1ib2wuCi0JKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpKTogTGlrZXdpc2UuCi0KLQkqIGloZXguYyAoaWhleF9zY2FuKTogQWNjZXB0IGEgbGVuZ3RoIG9mIDQgZm9yIHJlY29yZCB0eXBlIDUuCi0JKGloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRm9yIGEgbGFyZ2Ugc3RhcnQgYWRkcmVzcywgb3V0cHV0Ci0JdGhlIGZ1bGwgMzIgYml0IGFkZHJlc3MgaW4gcmVjb3JkIHR5cGUgNS4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX2J5dGUpOiBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciBmcm9tIGJmZF9ieXRlCi0JdG8gaW50IHRvIGF2b2lkIHByb21vdGlvbiBwcm9ibGVtcyBpbiBwcm90b3R5cGUuCi0KLVR1ZSBBcHIgIDkgMTE6NDQ6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogVXNlICR7c3JjZGlyfSB3aGVuIGxvb2tpbmcgZm9yIHBpY2ZyYWcuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTd2l0Y2ggb24gJHtsaWJkaXJ9LCBub3QgJChsaWJkaXIpLiAgRnJvbQotCWFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1IChBbGFuIE1vZHJhKS4KLQotCSogYW91dHguaCAoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogQWx3YXlzIGNhbGwgYWRkX2R5bmFtaWNfc3ltYm9scwotCWVudHJ5IHBvaW50LCBub3QganVzdCBmb3IgRFlOQU1JQyBvYmplY3RzLgotCSogc3Vub3MuYyAoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IEFsd2F5cyBjYWxsCi0Jc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuICBJZiBjYWxsZWQgd2l0aCBhIG5vbiBEWU5BTUlDCi0Jb2JqZWN0LCBkb24ndCBkbyBhbnl0aGluZyBlbHNlLgotCShzdW5vc19hZGRfb25lX3N5bWJvbCk6IERvbid0IGNhbGwgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0KLU1vbiBBcHIgIDggMTI6MDk6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFBlcm1pdCAtLWVuYWJsZS1zaGFyZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YKLQlkaXJlY3Rvcmllcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmhvc3Q6IFNldCBITERGTEFHUyBhbmQgU0hMSUJfQ0ZMQUdTIGZvciAqLWRlYy1vc2YqCi0JaG9zdCB3aGVuIGNvbmZpZ3VyaW5nIHdpdGggLS1lbmFibGUtc2hhcmQuCi0KLUZyaSBBcHIgIDUgMTI6MjQ6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgaVszNDVdODYtKi1mcmVlYnNkZWxmKiB0YXJnZXQ7IGZyb20gSm9obiBQb2xzdHJhCi0JPGpkcEBwb2xzdHJhLmNvbT4uCi0KLQkqIGxpbmtlci5jIChsaW5rX2FjdGlvbik6IEZvciBXQVJOX1JPVy93YXJuLCB1c2UgTVdBUk4sIG5vdCBDWUNMRSwKLQl0byBhdm9pZCBjcmFzaGluZyBpbiBiZmRfaGFzaF9yZXBsYWNlLgotCi0JKiBzeXNkZXAuaDogVXNlICNpZmRlZiwgbm90ICNpZi4KLQotVGh1IEFwciAgNCAyMzozMjoyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5pbjogUmVidWlsZC4KLQotVGh1IEFwciAgNCAxODo0OTowOSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzLXNvbnktYnNkKik6IEZpeCB0eXBvIGluIEFDX0RFRklORS4KLQkoQUNfQ0hFQ0tfSEVBREVSUyk6IENoZWNrIGZvciBzeXMvdGltZS5oCi0JKEFDX0hFQURFUl9USU1FKTogQWRkIG1hY3JvLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogc3lzZGVwLmg6IFVzZSBUSU1FX1dJVEhfU1lTX1RJTUUgYW5kIEhBVkVfU1lTX1RJTUVfSAotCXRvIGNvbnRyb2wgd2hhdCBjb21iaW5hdGlvbiBvZiA8dGltZT4gYW5kIDxzeXMvdGltZS5oPgotCWdldCBpbmNsdWRlZC4KLQotVHVlIEFwciAgMiAxMzoxMTo1MyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhb3V0ZjEuaCAoc3Vub3NfMzJfc2V0X2FyY2hfbWFjaCk6IEhhbmRsZSBNX1NQQVJDTEVULgotCShhb3V0XzMyX3N1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogSGFuZGxlCi0JYmZkX21hY2hfc3BhcmNfe3NwYXJjbGV0LHNwYXJjbGl0ZX0uCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9zcGFyY197c3BhcmNsZXQsc3BhcmNsaXRlfSk6IERlZmluZS4KLQkoYmZkX21hY2hfc3BhcmNfdjlfcCk6IFVwZGF0ZS4KLQkqIGNwdS1zcGFyYy5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkIGVudHJpZXMgZm9yIHNwYXJjbGV0LHNwYXJjbGl0ZS4KLQkqIGxpYmFvdXQuaCAoZW51bSBtYWNoaW5lX3R5cGUpOiBBZGQgTV9TUEFSQ0xFVC4KLQkqIHN1bm9zLmMgKE1BQ0hUWVBFX09LKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotVHVlIEFwciAgMiAwMDozMzoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgaGdvdCBmaWVsZC4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IEluaXRpYWxpemUgaGdvdCBmaWVsZC4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogU3RvcmUgdGhlCi0JX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGhhc2ggdGFibGUgZW50cnkgaW4gdGhlIGhnb3QgZmllbGQuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBJZiB0aGUgc2l6ZSBvZiB0aGUKLQlnbG9iYWwgb2Zmc2V0IHRhYmxlIGdvZXMgb3ZlciAweDEwMDAsIHNldCB0aGUgdmFsdWUgb2YKLQlfR0xPQkFMX09GRlNFVF9UQUJMRV8gdG8gMHgxMDAwIGludG8gdGhlIHNlY3Rpb24uCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBTdWJ0cmFjdCB0aGUgb2Zmc2V0IG9mCi0JX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHdoZW4gaGFuZGxpbmcgR09UIHJlbG9jYXRpb25zLgotCi0JKiBlbGZjb2RlLmg6IERvbid0IGluY2x1ZGUgPHN0cmluZy5oPi4KLQotTW9uIEFwciAgMSAxMDozOToyNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpOiBSZW5hbWVkIGZyb20KLQlnZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jLiAgQWxsIHJlZmVyZW5jZXMgY2hhbmdlZC4KLQkqIGdlbmxpbmsuaCAoX2JmZF9nZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKTogRGVjbGFyYXRpb24KLQltb3ZlZCBoZXJlIGZyb20gbGliYmZkLWluLmguCi0JKiBsaWJiZmQtaW4uaDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCi1Nb24gQXByICAxIDEyOjM1OjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogV2hlbiByZXBvcnRpbmcgYW4KLQlvdmVyZmxvdyBlcnJvciwgdXNlIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUgaWYKLQlhdmFpbGFibGUuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCi0JKiBlbGZsaW5rLmggKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBhIGNvbW1vbiBzeW1ib2wgZ290Ci0JZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgc2V0IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIuCi0KLVN1biBNYXIgMzEgMDE6NTg6NDEgMTk5NiAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBEZWxldGUgdGVzdCBmb3IgLmp1bmsuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCi1GcmkgTWFyIDI5IDEyOjQ0OjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2VjdGlvbi5jIChTRUNfTElOS19PTkNFKTogRGVmaW5lLgotCShTRUNfTElOS19EVVBMSUNBVEVTKTogRGVmaW5lLgotCShTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQpOiBEZWZpbmUuCi0JKFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFkpOiBEZWZpbmUuCi0JKFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFKTogRGVmaW5lLgotCShTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfQ09OVEVOVFMpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IElmIENPRkZfV0lUSF9QRSwgdHVybgotCVNFQ19MSU5LX09OQ0UgaW50byBJTUFHRV9TQ05fTE5LX0NPTURBVC4KLQkoc3R5cF90b19zZWNfZmxhZ3MpOiBJZiBDT0ZGX1dJVEhfUEUsIHR1cm4gSU1BR0VfU0NOX0xOS19SRU1PVkUKLQlpbnRvIFNFQ19FWENMVURFLiAgSWYgSU1BR0VfU0NOX0xOS19DT01EQVQgaXMgc2V0LCBzZXQKLQlTRUNfTElOS19PTkNFLCBhbmQgbG9vayB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUgZm9yIHRoZSBzZXR0aW5nCi0JZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgQ09GRl9XSVRIX1BFLCBpZiBTRUNfTElOS19PTkNFIGlzCi0Jc2V0IGZvciBhIHNlY3Rpb24sIGZpbmQgdGhlIHNlY3Rpb24gc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUsCi0JYW5kIHNldCB0aGUgYXV4IGVudHJ5IGJhc2VkIG9uIFNFQ19MSU5LX0RVUExJQ0FURVMuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogQWRkIGEgc3BhY2UgYmVmb3JlICJjaGVja3N1bSIuCi0JKiBjb2ZmLWFybS5jIChhcm1jb2ZmX2JpZ192ZWMpOiBJZiBDT0ZGX1dJVEhfUEUgaXMgZGVmaW5lZCwgYWRkCi0JU0VDX0xJTktfT05DRSBhbmQgU0VDX0xJTktfRFVQTElDQVRFUyB0byBzZWN0aW9uX2ZsYWdzLgotCSogY29mZi1pMzg2LmMgKGkzODZjb2ZmX3ZlYyk6IExpa2V3aXNlLgotCSogY29mZi1wcGMuYyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9CSUdfU1lNKTogTGlrZXdpc2UuCi0KLQkqIFZFUlNJT046IEJ1bXAgdG8gMi42LjEuCi0JKiBNYWtlZmlsZS5pbiAoc3RhbXAtaCk6IERlcGVuZCB1cG9uIFZFUlNJT04uCi0KLVRodSBNYXIgMjggMjM6NDg6NDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJiZmQtaW4uaCAoZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyk6IEFkZCBkZWNsYXJhdGlvbi4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpOiBObyBsb25nZXIgc3RhdGljLgotCSogY29mZmNvZGUuaCAoY29mZl9iZmRfbGlua19oYXNoX2NyZWF0ZSk6IEFsbG93IHNwZWNpZmljIHRhcmdldHMKLQl0byBvdmVycmlkZS4KLQkqIGNvZmYtaDgzMDAuYzogQWRkIHR3byBkZXJpdmVkIGhhc2ggdGFibGVzIGFuZCB0aGVpciBhc3NvY2lhdGVkCi0JZnVudGlvbnMgYW5kICNkZWZpbmVzIGZvciB1c2UgYnkgdGhlIGg4MzAwIGxpbmtlci4KLQkoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcywgY2FzZSBSX01FTV9JTkRJUkVDVCk6IENyZWF0ZSBlbnRyaWVzIGluCi0JdGhlIGZ1bmN0aW9uIHZlY3RvciBhcyBuZWVkZWQuICBQbGFjZSB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24KLQl2ZWN0b3IgZW50cnkgaW4gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSB0aGUgUl9NRU1fSU5ESVJFQ1QgcmVsb2MuCi0JUmV3cml0ZSB0aGUgdmVjdG9ycyBzZWN0aW9uIGNvbnRlbnRzIGFzIG5lY2Vzc2FyeS4KLQkoaDgzMDBfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24gZm9yIHRoZSBoODMwMCBsaW5rZXIuCi0JKGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEZWZpbmUgdG8gdXNlIGg4MzAwIHNwZWNpZmljIHZlcnNpb24uCi0JKGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQotVGh1IE1hciAyOCAxNzo0NDowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmhwcGEuaDogSWYgZ2NjIDIuNyBvciBoaWdoZXIsIGRlY2xhcmUgYWxsIHRoZSBmdW5jdGlvbnMgd2l0aAotCV9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkgc28gdGhhdCAtV2FsbCBkb2Vzbid0IHdhcm4gYWJvdXQKLQl0aGVtLgotCShocHBhX3JlYnVpbGRfaW5zbik6IFBhc3MgcG9pbnRlciB0byBjb3JyZWN0IHR5cGUgdG8KLQlsb3dfc2lnbl91bmV4dCBhbmQgZGlzX2Fzc2VtYmxlXzIxLgotCi1UaHUgTWFyIDI4IDExOjAwOjM2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHNwYXJjNjQte3N5c3Y0Kixzb2xhcmlzMip9KTogRGVsZXRlLgotCVN0aWNrIHdpdGggc3BhcmMtKi17c3lzdjQqLHNvbGFyaXMyKn0uCi0KLVdlZCBNYXIgMjcgMTA6NDM6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBTd2FwIGluIGV4dHJhIFBFIHhfc2NuIGZpZWxkcy4KLQkoY29mZl9zd2FwX2F1eF9vdXQpOiBTd2FwIG91dCBleHRyYSBQRSB4X3NjbiBmaWVsZHMuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luKTogWmVybyBvdXQgZXh0cmEgUEUgeF9zY24gZmllbGRzLgotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IElmIGFueSBvZiB0aGUgZXh0cmEgUEUgeF9zY24KLQlmaWVsZHMgaXMgbm9uLXplcm8sIHByaW50IHRoZW0uCi0KLQkqIGNvZmYtcHBjLmMgKHBwY19yZWNvcmRfdG9jX2VudHJ5KTogUHV0IGluc2lkZSBDT0ZGX0lNQUdFX1dJVEhfUEUKLQlpZmRlZi4gIFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCShwcGNfcmVjb3JkX2RhdGFfaW5fdG9jX2VudHJ5KTogSWZkZWYgb3V0LiAgUmVtb3ZlZCB1bnVzZWQKLQl2YXJpYWJsZXMuCi0JKHBwY19tYXJrX3N5bWJvbF9hc19nbHVlKTogUHV0IGluc2lkZSBDT0ZGX0lNQUdFX1dJVEhfUEUgaWZkZWYuCi0JKGdldF9zeW1ib2xfdmFsdWUpOiBJZmRlZiBvdXQuCi0JKHBlX3BwY19yZWxvYyk6IElmZGVmIG91dC4gIFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuICBNYWtlCi0JZnByaW50ZiBzdHJpbmdzIGFuZCBhcmd1bWVudCB0eXBlcyBjb3JyZXNwb25kLiAgUHV0IGJlZm9yZV9hZGRyIGluCi0JREVCVUdfUkVMT0MgaWZkZWYuCi0JKGR1bXBfdG9jKTogTWFrZSBmcHJpbnRmIHN0cmluZ3MgYW5kIGFyZ3VtZW50IHR5cGVzIGNvcnJlc3BvbmQuCi0JKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuICBBbHdheXMKLQlyZXR1cm4gYSB2YWx1ZS4KLQkocHBjX3JlZmxvX3JlbG9jKTogSWZkZWYgb3V0LgotCShwcGNfYWRkcjMybmJfcmVsb2MpOiBJZmRlZiBvdXQuCi0JKHBwY19jb2ZmX3J0eXBlMmhvd3RvKTogTWFrZSBmcHJpbnRmIHN0cmluZ3MgYW5kIGFyZ3VtZW50IHR5cGVzCi0JY29ycmVzcG9uZC4KLQkoY29mZl9wcGNfcnR5cGVfdG9faG93dG8pOiBMaWtld2lzZS4KLQkocHBjX2NvZmZfc3dhcF9zeW1faW5faG9vayk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogTW92ZSBvdGhlcndpc2UgdW51c2VkIHZhcmlhYmxlcyBpbnRvCi0JdGhlICNpZmRlZiB3aGVyZSB0aGV5IGFyZSB1c2VkLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCShwZV9wcmludF9lZGF0YSk6IE1ha2UgZnByaW50ZiBzdHJpbmdzIGFuZCBhcmd1bWVudCB0eXBlcwotCWNvcnJlc3BvbmQuICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0JKHBlX3ByaW50X3BkYXRhKTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgYWRkcl92YWx1ZS4gIEFsd2F5cwotCXJldHVybiBhIHZhbHVlLgotCShwZV9wcmludF9yZWxvYyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgb25hbGluZS4gIE1ha2UgZnByaW50ZgotCXN0cmluZ3MgYW5kIGFyZ3VtZW50IHR5cGVzIGNvcnJlc3BvbmQuICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBSZXR1cm4gdHJ1ZS4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBNb3ZlIGRlZmluaXRpb24gb2YgdW51c2VkCi0JdmFyaWFibGUgcmVsYSBpbnNpZGUgI2lmIDAgc2VjdGlvbiB3aGVyZSBpdCBpcyB1c2VkLgotCi0JKiBuczMyay5oOiBOZXcgZmlsZS4KLQkqIGNwdS1uczMyay5oOiBJbmNsdWRlIG5zMzJrLmguICBSZW5hbWUgZXh0ZXJuYWxseSB2aXNpYmxlCi0JZnVuY3Rpb25zIHRvIHN0YXJ0IHdpdGggX2JmZF8uCi0JKiBhb3V0LW5zMzJrLmM6IEluY2x1ZGUgbnMzMmsuaC4gIENoYW5nZSByZWZlcmVuY2VzIHRvIHJlbmFtZWQKLQlmdW5jdGlvbnMgaW4gY3B1LW5zMzJrLmguCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEhGSUxFUyk6IEFkZCBuczMyay5oLgotCi0JKiBzZWN0aW9uLmMgKHN0cnVjdCBzZWMpOiBBZGQgbGlua2VyX21hcmsgZmllbGQuICBDaGFuZ2UKLQl1c2VyX3NldF92bWEgYW5kIHJlbG9jX2RvbmUgdG8gYmUgc2luZ2xlIGJpdCBmaWVsZHMuCi0JKFNURF9TRUNUSU9OKTogVXBkYXRlIGFjY29yZGluZ2x5LgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogTWFyayBzZWN0aW9ucyBpbmNsdWRlZCBpbiB0aGUKLQlsaW5rLgotCShhb3V0X2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgbGluayB1bm1hcmtlZCBzZWN0aW9ucy4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogTWFyayBzZWN0aW9ucyBpbmNsdWRlZCBpbiB0aGUKLQlsaW5rLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBsaW5rIHVubWFya2VkIHNlY3Rpb25zLgotCSogY29mZi1wcGMuYyAocHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBNYXJrIHNlY3Rpb25zIGluY2x1ZGVkIGluCi0JdGhlIGxpbmsuCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IE1hcmsgc2VjdGlvbnMgaW5jbHVkZWQgaW4gdGhlCi0JbGluay4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgbGluayB1bm1hcmtlZCBzZWN0aW9ucy4KLQkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogTWFyayBzZWN0aW9ucyBpbmNsdWRlZAotCWluIHRoZSBsaW5rLgotCSh4Y29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IGxpbmsgdW5tYXJrZWQgc2VjdGlvbnMuCi0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogSW5jbHVkZSBzZWN0aW9uIG5hbWUgaW4KLQlvdmVyZmxvdyBlcnJvciBtZXNzYWdlcy4KLQotVHVlIE1hciAyNiAxNTo0NjoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChfYmZkX2RlZmF1bHRfZXJyb3JfaGFuZGxlcik6IElmIF9iZmRfZXJyb3JfcHJvZ3JhbV9uYW1lCi0JaXMgbm90IHNldCwgcHJpbnQgIkJGRDogIiBiZWZvcmUgdGhlIGVycm9yIG1lc3NhZ2UuCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEFDX0NIRUNLX1RPT0wgdG8gZmluZCBhciBhbmQgcmFubGliLiAgRnJvbQotCU1pbGVzIEJhZGVyIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBNYXIgMjIgMTI6MTc6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBGaXggc2NhbiBmb3IgQ19CSU5DTC9DX0VJTkNMCi0Jc3ltYm9scy4KLQotCSogY29uZmlnLmJmZDogQWRkIGllZWVfdmVjIHRvIHRhcmdfc2VsdmVjcyBmb3IgaTk2MCB0YXJnZXRzIGFuZAotCW02OGstYW91dCwgbTY4ay1jb2ZmLCBhbmQgbTY4ay1lbGYgdGFyZ2V0cy4KLQotRnJpIE1hciAyMiAxMTozMzo0NCAxOTk2ICBNYXJ0aW4gQW5hbnRoYXJhbWFuICA8bWFydGluQGdvb2Z5LmltZWNoLnVuaS1kdWlzYnVyZy5kZT4KLQotCSogaWVlZS5jOiBDaGFuZ2VkICNpZmRlZiBLRUVQTUlOVVNQQ0lOSU5TVCB0byAjaWYgS0VFUE1JTlVTUENJTklOU1QuCi0JKGllZWVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogUmVzdHJ1Y3R1cmVkIHRvIHByZXZlbnQKLQlpZWVlX29iamVjdF9wIGZyb20gYmVpbmcgY2FsbGVkIHJlcGVhdGVkbHkuCi0KLVRodSBNYXIgMjEgMTE6MDA6NDcgMTk5NiAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiAgQWxsb2NhdGUKLQlidWZmZXJzIGxhcmdlIGVub3VnaCBmb3IgYW55IEZJTEVIRFIgb3IgQU9VVEhEUi4KLQotVGh1IE1hciAyMSAxNjoyODoxNyAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBlY29mZmxpbmsuYyAobG9va3VwX2xpbmUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCByZW5hbWVkIGFuZAotCXNsaWdobHkgY2hhbmdlZCBmcm9tIG9sZCBfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lLgotCShfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogQ2FjaGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICBVc2UKLQlsb29rdXBfbGluZSBmb3IgYWN0dWFsIGxvb2t1cC4KLQotVGh1IE1hciAyMSAxNDo1OToxMSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfcGRhdGEpOiBXYXJuIGlmIHRoZSAucGRhdGEgc2VjdGlvbiBpcyBub3QgYQotCW11bHRpcGxlIG9mIDIwIGJ5dGVzLgotCi1UaHUgTWFyIDIxIDEzOjU0OjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IFVzZSBiZmRfemFsbG9jIHRvCi0JYWxsb2NhdGUgZWNvZmZfZmluZF9saW5lLCBhbmQgZG9uJ3QgaW5pdGlhbGl6ZSBieSBoYW5kLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IFVzZSBiZmRfemFsbG9jIGZvcgotCW1pcHNfZWxmX2ZpbmRfbGluZSwgYW5kIGRvbid0IGNhbGwgbWVtc2V0LgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIG5vdAotCXByb2R1Y2luZyBhIGZpbmFsIGV4ZWN1dGFibGUsIGRvbid0IGNvbnNpZGVyIHNvZmFyIHdoZW4gYWxpZ25pbmcKLQl0aGUgc2VjdGlvbiB0byB0aGUgY29ycmVjdCBzaXplLgotCi1XZWQgTWFyIDIwIDE2OjUzOjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzKTogSWZkZWYgb3V0LgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGNhbGwgY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzLgotCSogY29mZmdlbi5jIChjb2ZmX3NlY3Rpb25fc3ltYm9sKTogSWZkZWYgb3V0LgotCi1Nb24gTWFyIDE4IDEyOjU0OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9ncHJlbDMyX3JlbG9jKTogSW5pdGlhbGl6ZSBncCBpZgotCW91dHB1dF9iZmQgaXMgbm90IE5VTEwuCi0KLVRodSBNYXIgMTQgMTc6MTI6MDYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBDYWxsIGJmZF96YWxsb2MgaW5zdGVhZAotCW9mIGJmZF9hbGxvYyAoZml4ZXMgZml4X2xpbmUgbm90IGJlaW5nIGluaXRpYWxpemVkKS4KLQlEZWxldGUgemVyb2luZyBvZiBmaXhfe3ZhbHVlLHRhZyxlbmQsc2NubGVufSBmaWVsZHMuCi0KLVRodSBNYXIgMTQgMTY6MDY6MDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiBBbGxvdyBzcGVjaWZpYyBiYWNrZW5kcyB0byBvdmVycmlkZSB0aGUKLQliZmRfbGlua19hZGRfc3ltYm9scyByb3V0aW5lLgotCi0JKiBjb2ZmLWg4MzAwLmM6IEluY2x1ZGUgZ2VubGluay5oLgotCShob3d0b190YWJsZSk6IEFkZCBSX01FTV9JTkRJUkVDVC4KLQkocnR5cGUyaG93dG8pOiBTdXBwb3J0IFJfTUVNX0lORElSRUNULgotCShoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogSGFuZGxlIFJfTUVNX0lORElSRUNUIGxpa2UgUl9SRUxCWVRFCi0JZm9yIG5vdy4KLQotVHVlIE1hciAxMiAxMjo0MToxNyAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBrb2FsYS5henN0YXJuZXQuY29tPgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBVc2UKLQlpbmZvLT5jYWxsYmFja3Nfd2FybmluZywgcmF0aGVyIHRoYW4gX2JmZF9lcnJvcl9oYW5kbGVyLCBmb3IKLQkibXVsdGlwbGUgZ3AiIHdhcm5pbmcuCi0KLVR1ZSBNYXIgMTIgMTI6MTA6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBSZW1vdmUgQkZEX0FTU0VSVCBvbiBoYXNoCi0JdGFibGUgc3RyaW5nLiAgVXNlIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAuCi0JKF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBSZW1vdmUgQkZEX0FTU0VSVCBvbiBoYXNoCi0JdGFibGUgc3RyaW5nLgotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBVc2UgdGhlIG5hbWUgZnJvbSB0aGUgaGFzaAotCXRhYmxlLCBpZiBhbnksIHdoZW4gd3JpdGluZyBvdXQgc3ltYm9scy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogVXNlIHRoZSBuYW1lIGZyb20gdGhlIGhhc2ggdGFibGUsCi0JaWYgYW55LCB3aGVuIHJlcG9ydGluZyB1bmRlZmluZWQgc3ltYm9scy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogVXNlIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAuCi0JKiBib3V0LmMgKGdldF92YWx1ZSk6IExpa2V3aXNlLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGVsZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoX2JmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MpOiBMaWtld2lzZS4KLQkoeGNvZmZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9mZHJfaW4pOiBJZiBFQ09GRl82NCwgdHVybiAweGZmZmZmZmZmCi0JaW50byAtMSBmb3IgaW50ZXJuLT5yc3MuCi0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuOC4KLQotTW9uIE1hciAxMSAxMjoyODozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWItc3ltcy5jIChfX2RlZmluZV9zdGFiX2R1cGxpY2F0ZSk6IERlZmluZS4KLQkoYmZkX2dldF9zdGFiX25hbWUpOiBSZW5hbWUgZnJvbSBhb3V0X3N0YWJfbmFtZS4gIFJld3JpdGUgdG8gdXNlIGEKLQlzd2l0Y2guCi0JKiBiZmQtaW4uaCAoYmZkX2dldF9zdGFiX25hbWUpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkRfTElCUyk6IEFkZCBzdGFiLXN5bXMuby4KLQkoQkZEX0xJQlNfQ0ZJTEVTKTogQWRkIHN0YWItc3ltcy5jLgotCShCRkQzMl9CQUNLRU5EUyk6IFJlbW92ZSBzdGFiLXN5bXMuby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogUmVtb3ZlIHN0YWItc3ltcy5jLgotCSogY29uZmlndXJlLmluOiBEb24ndCBsaXN0IHN0YWItc3ltcy5vIGluIGJmZF9iYWNrZW5kcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGxpYmFvdXQuaCAoYW91dF9zdGFiX25hbWUpOiBEb24ndCBkZWNsYXJlLgotCSogYW91dHguaCAoTkFNRShhb3V0LGdldF9zeW1ib2xfaW5mbykpOiBDYWxsIGJmZF9nZXRfc3RhYl9uYW1lLAotCW5vdCBhb3V0X3N0YWJfbmFtZS4KLQotRnJpIE1hciAgOCAxMToyNjoyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQWRqdXN0IGZpbGUgb2Zmc2V0Ci0JZm9yIHNlY3Rpb24gYWxpZ25tZW50IGV2ZW4gaWYgU0VDX0xPQUQgaXMgbm90IHNldC4KLQotVHVlIE1hciAgNSAxMjowMjoyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IFNITElCIG9yIFNITElOSyB0byBhbiBlbXB0eSBzdHJpbmcsCi0Jc2luY2UgdGhleSBhcHBlYXIgYXMgdGFyZ2V0cyBpbiBNYWtlZmlsZS5pbi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogSWYgbm90IG1ha2luZyBhIHNoYXJlZCBsaWJyYXJ5LAotCWRvbid0IGZpZGRsZSB3aXRoIGEgc3ltYm9sIHdoaWNoIGlzIG5vdCBkZWZpbmVkIGFueXdoZXJlLgotCi1Nb24gTWFyICA0IDEyOjQ5OjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX21hcmspOiBUcmVhdCB1bmRlZmluZWQgaW1wb3J0ZWQgc3ltYm9scyBhcwotCXRob3VnaCB0aGV5IGFyZSBkZWZpbmVkIGluIGEgc2hhcmVkIGxpYnJhcnkuCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IExpa2V3aXNlLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBEb24ndCBsb29rIGF0IHRoZSBsaW5lCi0JbnVtYmVycyBmb3IgdGhlIHNlY3Rpb24gaWYgc2VjdGlvbi0+bGluZW5vIGlzIE5VTEwuCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogUHJpbnQgYSB1c2VmdWwgZXJyb3IKLQltZXNzYWdlIHJhdGhlciB0aGFuIGNhbGxpbmcgQkZEX0FTU0VSVC4KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbC4KLQotRnJpIE1hciAgMSAwOTo0Mjo1OSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IERvbid0IHNldCBTRUNfTE9BRCBmbGFnCi0JZm9yIC5zYnNzIHNlY3Rpb24uCi0KLVdlZCBGZWIgMjggMTE6MjU6NDcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmggKGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZSk6IEFkZCBSX0hQUEFfTkxTRUwKLQlhbmQgUl9IUFBBX05MUlNFTC4KLQkoZV9uc2VsLCBlX25sc2VsLCBlX25scnNlbCk6IFVuZGVmaW5lLiAgQWRkIHRvCi0JaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdC4KLQkoaHBwYV9maWVsZF9hZGp1c3QpOiBIYW5kbGUgZV9ubHNlbCwgZV9ubHJzZWwuICBGaXggZV9uc2VsIGhhbmRsaW5nLgotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogSGFuZGxlIE4nLCBOTCcgTkxSJyBmaWVsZAotCXNlbGVjdG9ycy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEZpbmlzaCBoYW5kbGluZyBvZiBSX04wU0VMIGFuZCBSX04xU0VMLgotCi1XZWQgRmViIDI4IDExOjAwOjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBBZGp1c3QgdGhlIHNlZ21lbnQKLQltZW1vcnkgc2l6ZSBmb3IgdGhlIGFsaWdubWVudCBvZiBhIFNFQ19BTExPQyBzZWN0aW9uLCBub3QganVzdCBhCi0JU0VDX0xPQUQgc2VjdGlvbi4KLQotVHVlIEZlYiAyNyAxNDoxNzozMSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4a2xpbnV4LmM6IE5ldyBmaWxlLgotCSogaG9zdHMvbTY4a2xpbnV4Lmg6IE5ldyBmaWxlLgotCSogY29uZmlnLmJmZCAobTY4Ki0qLWxpbnV4YW91dCosIG02OCotKi1saW51eCopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4Ki0qLWxpbnV4Kik6IE5ldyBuYXRpdmUgaG9zdC4KLQkobTY4a2xpbnV4X3ZlYyk6IE5ldyB2ZWN0b3IuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiB0YXJnZXRzLmMgKG02OGtsaW51eF92ZWMpOiBEZWNsYXJlLgotCSogaTM4NmxpbnV4LmMgKGJmZF9pMzg2bGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogUmVuYW1lZCBmcm9tCi0JYmZkX2xpbnV4X3NpemVfZHlubWljX3NlY3Rpb25zIHRvIGF2b2lkIGNsYXNoIHdpdGggbTY4a2xpbnV4LmMuCi0JKiBiZmQtaW4uaCAoYmZkX2kzODZsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBSZW5hbWUKLQlkZWNsYXJhdGlvbiBmcm9tIGJmZF9saW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMuCi0JKGJmZF9tNjhrbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgbTY4a2xpbnV4Lm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBtNjhrbGludXguYy4KLQotVHVlIEZlYiAyNyAxMTozMTozNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaCAocGFfYXJjaCk6IEFkZCBwYTIwLgotCShocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGUpOiBBZGQgUl9IUFBBX05TRUwuCi0JKGVfbnNlbCk6IFVuZGVmaW5lLiAgQWRkIHRvIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQuCi0JKGhwcGFfZmllbGRfYWRqdXN0KTogSGFuZGxlIGVfbnNlbC4KLQkqIHNvbS5jOiBQcm92aWRlIGRlZmF1bHQgZGVmaW5pdGlvbnMgZm9yIG1hbnkgbmV3IHJlbG9jcyBmb3VuZCBvbmx5Ci0JaW4gaHB1eDEwIGluY2x1ZGUgZmlsZXMuCi0JKHNvbV9maXh1cF9mb3JtYXRzKTogQWRkIHNldmVyYWwgbmV3IHJlbG9jcyBmcm9tIGhwdXgxMC4KLQkoc29tX2hwcGFfaG93dG9fdGFibGUpOiBBZGQgaHB1eDEwIHJlbG9jcy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX04wU0VMIGFuZCBSX04xU0VMIGhwdXgxMCByZWxvY3MuCi0KLU1vbiBGZWIgMjYgMTI6NTI6NDggMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEVkaXQgb3V0IHJlY2VudCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LCBhbmQKLQlydWxlcyB0byByZWJ1aWxkIC5oIGZpbGVzIHVzaW5nIGRvYy9jaGV3LgotCi1Nb24gRmViIDI2IDE0OjQ4OjM5IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQEFaU3Rhck5ldC5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFkanVzdCB0aGUgZmlsZQotCXNpemUgZXZlbiBvZiBzZWN0aW9ucyB3aXRoIG5vIGNvbnRlbnRzLgotCi1Nb24gRmViIDI2IDE0OjAxOjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogV2hlbiBtZXJnaW5nLCBza2lwIG5hbWVzCi0Jc3RhcnRpbmcgd2l0aCAnJCcgdGhlIHdheSB3ZSBza2lwIG5hbWVzIHN0YXJ0aW5nIHdpdGggJy4nLiAgV2hlbgotCXVwZGF0aW5nIHhfZW5kbmR4LCBkb24ndCBiZSBmb29sZWQgYnkgYW4gaW5kZXggd2hpY2ggaGFzIGJlZW4KLQltZXJnZWQuCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IHRyeSB0byBvcHRpbWl6ZSBhCi0Jc3RydWN0L3VuaW9uL2VudW0gdHlwZSB3aXRoIG5vIGVsZW1lbnRzLgotCi1TYXQgRmViIDI0IDExOjM4OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKGJmZF9lcnJtc2cpOiBIYW5kbGUgYSBOVUxMIHJldHVybiBmcm9tIHN0cmVycm9yLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6IElmIHRoZSBmaXJzdCBmaWxlIGluIHRoZQotCWFyY2hpdmUgY2FuIG5vdCBiZSByZWNvZ25pemVkIGFzIGFuIG9iamVjdCwgZG9uJ3QgYXNzdW1lIHRoYXQgdGhpcwotCWlzIHRoZSB3cm9uZyBmb3JtYXQuCi0KLQkqIGVsZi5jIChiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSk6IERvbid0IGRvIGFueXRoaW5nIGlmIHRoZQotCWZvcm1hdCBpcyBub3QgYmZkX29iamVjdC4KLQkoYmZkX2VsZl9nZXRfZHRfc29uYW1lKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgMjEgMTM6NTg6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IENvcnJlY3QgcmFuZ2Ugb2YgUl9TSF9VU0VTCi0JcmVsb2MuCi0KLVR1ZSBGZWIgMjAgMTY6MjI6NDQgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBiZmQuYyAodGRhdGEpOiBBZGQgbmV0YnNkX2NvcmVfZGF0YS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBGZWIgMjAgMTY6NTA6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChTVU5PU19DT05TVFJVQ1RPUik6IERlZmluZS4KLQkoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBEb24ndCBsZXQgYSBzeW1ib2wgZnJvbSBhIGR5bmFtaWMgb2JqZWN0Ci0Jb3ZlcnJpZGUgYSBjb25zdHJ1Y3RvciBzeW1ib2wuICBTZXQgU1VOT1NfQ09OU1RSVUNUT1Igd2hlbgotCWFwcHJvcHJpYXRlLgotCi0JKiBib3V0LmMgKGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKTogVXNlIHVkYXRhLmkgcmF0aGVyIHRoYW4gZmxhZ3MKLQl0byBnZXQgdGhlIHN5bWJvbCBpbmRleCwgbWF0Y2hpbmcgMTQgSnVsIDk1IGNoYW5nZS4KLQotVHVlIEZlYiAyMCAwODoyNjoyNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOgotCVJlbW92ZSBkdXBsaWNhdGUgZGVmaW5pdGlvbiBvZiBncC4KLQotTW9uIEZlYiAxOSAxMjozNzo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3QKLQlhc3N1bWUgdGhhdCB3ZSBjYW4gc2V0IHRoZSBHUCB2YWx1ZSBhbmQgdGhlbiBnZXQgdGhlIHNhbWUgdmFsdWUsCi0Jc2luY2UgaXQgd29uJ3QgYmUgdHJ1ZSBpZiB0aGUgb3V0cHV0IGZpbGUgaXMgbmVpdGhlciBFTEYgbm9yCi0JRUNPRkYuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19hZGp1c3RfcmVsb2NfaW4pOiBEb24ndCBib3RoZXIgdG8gdXNlCi0JX2JmZF9nZXRfZ3BfdmFsdWUgaGVyZS4KLQkobWlwc19ncHJlbF9yZWxvYyk6IERvbid0IGFzc3VtZSB3ZSBjYW4gc2V0IGFuZCBnZXQgdGhlIEdQIHZhbHVlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9oaTE2X3JlbG9jKTogR2V0IGdwIHZhbHVlIGZyb20KLQltaXBzX2VsZl9maW5hbF9ncC4KLQkobWlwc19lbGZfbG8xNl9yZWxvYyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9maW5hbF9ncCk6IEFkZCBwZ3AgcGFyYW1ldGVyLiAgU2V0IGl0IHRvIHRoZSBHUCB2YWx1ZS4KLQlEb24ndCByZXF1aXJlIHRoYXQgdGhlIEJGRCBiZSBFTEYuCi0JKG1pcHNfZWxmX2dwcmVsMTZfcmVsb2MpOiBHZXQgZ3AgdmFsdWUgZnJvbSBtaXBzX2VsZl9maW5hbF9ncC4KLQkobWlwc19lbGZfZ3ByZWwzMl9yZWxvYyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgYXNzdW1lIHdlIGNhbiBzZXQgYW5kIGdldCB0aGUKLQlHUCB2YWx1ZS4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgYm90aGVyIHRvIHVzZQotCV9iZmRfZ2V0X2dwX3ZhbHVlIGhlcmUuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSk6IEluaXRpYWxpemUgc3YuCi0JRG9uJ3QgY2hhbmdlIGVwZHIgYmV0d2VlbiBtYWxsb2MgYW5kIGZyZWUuICBCZSBjYXJlZnVsIG5vdCB0byBmcmVlCi0JTlVMTCBwb2ludGVycy4gIFplcm8gb3V0IHRoZSBmaXJzdCBSUERSLgotCi0JKiBjb25maWd1cmUuaG9zdDogT24gTGludXgsIG9ubHkgcGFzcyAtcnBhdGggb3B0aW9uIGlmICQobGliZGlyKQotCWlzIG5laXRoZXIgL2xpYiBub3IgL3Vzci9saWIuICBGcm9tIEFsYW4gTW9kcmEKLQk8YWxhbkBtdWxsZXQuTGV2ZWxzLlVuaVNBLkVkdS5BdT4uCi0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBSZW5hbWUgZHRfbmVlZGVkX25hbWUgdG8KLQlkdF9uYW1lLgotCShlbGZfZHRfbmFtZSk6IFJlbmFtZSBmcm9tIGVsZl9kdF9uZWVkZWRfbmFtZS4KLQkqIGVsZi5jIChiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSk6IFVzZSBlbGZfZHRfbmFtZSwgbm90Ci0JZWxmX2R0X25lZWRlZF9uYW1lLgotCShiZmRfZWxmX2dldF9kdF9zb25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSBlbGZfZHRfbmFtZSwgbm90Ci0JZWxmX2R0X25lZWRlZF9uYW1lLiAgU2F2ZSB0aGUgU09OQU1FIGJhY2sgaW4gZWxmX2R0X25hbWUuCi0JKiBiZmQtaW4uaCAoYmZkX2VsZl9nZXRfZHRfc29uYW1lKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotTW9uIEZlYiAxOSAwMjo1MDoyMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXApOiBSZW5hbWVkIGZyb20KLQlfYmZkX3NwYXJjX2VsZl9yZWxvY190eXBlX2xvb2t1cC4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFVwZGF0ZS4KLQkqIGVsZjY0LXNwYXJjLmMgKFNQQVJDNjRfT0xEX1JFTE9DUyk6IERlZmluZS4KLQkoc3BhcmM2NF9lbGZfaG93dG9fdGFibGUpOiBEZWZpbmUuCi0JKHNwYXJjX3JlbG9jX21hcCk6IERlZmluZS4KLQkoc3BhcmM2NF9lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfaW5mb190b19ob3d0byk6IFVzZSBzcGFyYzY0X2VsZl9ob3d0b190YWJsZS4KLQkoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogVXBkYXRlLgotCi1TdW4gRmViIDE4IDE1OjAyOjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IENoZWNrIGZvciAnZG8gbm90IG1peCcgZnJvbSBuYXRpdmUgbGlua2VyIGJlZm9yZQotCXRyeWluZyB0byB1c2UgLXJwYXRoLgotCi1GcmkgRmViIDE2IDEyOjQ2OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKF9iZmRfZ2V0X2dwX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX3NldF9ncF92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dldF9ncF92YWx1ZSk6IERlY2xhcmUuCi0JKF9iZmRfc2V0X2dwX3ZhbHVlKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBVc2UKLQlfYmZkX2dldF9ncF92YWx1ZSBhbmQgX2JmZF9zZXRfZ3BfdmFsdWUgcmF0aGVyIHRoYW4gcmVmZXJyaW5nCi0JZGlyZWN0bHkgdG8gdGhlIGZpZWxkcyBpbiB0aGUgdGRhdGEgaW5mb3JtYXRpb24uCi0JKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2FkanVzdF9yZWxvY19pbik6IExpa2V3aXNlLgotCShtaXBzX2dwcmVsX3JlbG9jKTogTGlrZXdpc2UuCi0JKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9oaTE2X3JlbG9jKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2xvMTZfcmVsb2MpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZmluYWxfZ3ApOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ3ByZWwxNl9yZWxvYyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9ncHJlbDMyX3JlbG9jKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIGJvdXQuYyAoYl9vdXRfc2V0X2FyY2hfbWFjaCk6IFJlY29nbml6ZSBiZmRfbWFjaF9pOTYwX2p4LgotCi1UaHUgRmViIDE1IDExOjI5OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX1BST0dfQ0MgYmVmb3JlIGNvbmZpZ3VyZS5ob3N0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmhvc3Q6IERvbid0IHNldCBpbmZvcm1hdGlvbiB3aGljaCBhdXRvY29uZiBzaG91bGQKLQlmaWd1cmUgb3V0LCBuYW1lbHkgQ0MsIENGTEFHUywgTERGTEFHUywgQVIsIGFuZCBSQU5MSUIuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZW1vdmUgZ28zMiBhbmQgd2luMzIgaG9zdCBpbmZvcm1hdGlvbiwgc2luY2UgaXQKLQlzaG91bGQgbm8gbG9uZ2VyIGJlIG5lZWRlZC4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IElmIHdlIGhhdmUgYSAuZHluYW1pYyBzZWN0aW9uLAotCXRoZW4gc3RhcnQgYSBuZXcgc2VnbWVudCByYXRoZXIgdGhhbiBwdXQgYSB3cml0YWJsZSBzZWN0aW9uIGluIGEKLQlyZWFkb25seSBzZWdtZW50LgotCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IFJQQVRIX0VOVlZBUi4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQKLQl6ZXJvX3NlY3Rpb24gdmFyaWFibGUuCi0KLVRodSBGZWIgMTUgMTA6Mzk6MTcgMTk5NiAgSC5KLiBMdSAgPGhqbEB6b29tLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoc3JjZGlyKS9iZmQtaW4yLmgpOiBSZW5hbWUgdGFyZ2V0IGZyb20gYmZkLWluMi5oLgotCSgkKHNyY2RpcikvbGliYmZkLmgpOiBSZW5hbWUgZnJvbSBsaWJiZmQuaC4KLQkoJChzcmNkaXIpL2xpYmNvZmYuaCk6IFJlbmFtZSBmcm9tIGxpYmNvZmYuaC4KLQotV2VkIEZlYiAxNCAxNjoyOTowNyAxOTk2ICBNYXJ0aW4gQW5hbnRoYXJhbWFuICA8bWFydGluQG1haWwuaW1lY2gudW5pLWR1aXNidXJnLmRlPgotCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfZXhwcmVzc2lvbik6IE9ubHkgdXNlIGFuIFIgdmFyaWFibGUgZm9yIGEKLQlsb2NhbCBzeW1ib2wuICBEb24ndCBvdXRwdXQgYSB6ZXJvIG9mZnNldC4gIEhhbmRsZSBhIHplcm8gYWRkcmVzcy4KLQkoU1JDX01BU0ssIFBDUkVMX09GRlNFVCk6IERlZmluZSBiYXNlZCBvbiBLRUVQTUlOVVNQQ0lOSU5TVC4KLQkocmVsMzJfaG93dG8sIHJlbDE2X2hvd3RvLCByZWw4X2hvd3RvKTogVXNlIFNSQ19NQVNLIGFuZAotCVBDUkVMX09GRlNFVC4KLQkocGFyc2VfZXhwcmVzc2lvbik6IERvbid0IHRyeSB0byBoYW5kbGUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgYQotCVAgdmFyaWFibGUuICBIYW5kbGUgSSB2YXJpYWJsZXMgZGlmZmVyZW50bHkgZnJvbSBYIHZhcmlhYmxlcy4gIEZpeAotCXRoZSBvcmRlciBvZiBtaW51cyBleHByZXNzaW9ucy4KLQkoaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzKTogR2VuZXJhdGUgYW4gSSB2YXJpYWJsZSBmb3IgYW4gTk4KLQlyZWNvcmQuICBGaXggaGFuZGxpbmcgb2YgQVRJIGFuZCBBVFggcmVjb3Jkcy4KLQkoaWVlZV9zbHVycF9zZWN0aW9ucyk6IE9ubHkgc2V0IG1pbmltYWwgc2VjdGlvbiBhdHRyaWJ1dGVzLgotCUFkanVzdCB0aGVtIGxhdGVyLCBiYXNlZCBvbiB0aGUgc2VjdGlvbiBjb250ZW50cy4KLQkoaWVlZV9vYmplY3RfcCk6IFJlYWQgaW4gdGhlIGZpbGUgdW50aWwganVzdCBhZnRlciB0aGUgTUUgcmVjb3JkLgotCUNhbGwgaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEgdG8gc2V0IHRoZSBzZWN0aW9uIGZsYWdzLgotCShkb19vbmUpOiBBZGQgaXRlcmF0aW9ucyBwYXJhbWV0ZXIuICBPbmx5IHJlcGVhdCB0aGUgZmlyc3QgbG9hZAotCWl0ZW0uICBTZXQgdGhlIHNlY3Rpb24gYW5kIGZpbGUgcmVsb2MgZmxhZ3MuCi0JKGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKTogU2V0IHNlY3Rpb24gZmxhZ3MuICBQYXNzIGl0ZXJhdGlvbnMgdG8KLQlkb19vbmUuCi0JKGllZWVfY2Fub25pY2FsaXplX3JlbG9jKTogSGFuZGxlIEkgdmFyaWFibGVzLgotCShkb193aXRoX3JlbG9jcyk6IE9ubHkgZW1pdCByZWxvY2F0aW9uIHNpemUgd2hlbiBuZWNlc3NhcnkuCi0JSW5jcmVhc2UgTUFYUlVOIHRvIDEyNy4gIENoYW5nZSBvdiB0byBiZSBhc3NpZ25lZCwgYW5kIHRha2UKLQlzcmNfbWFzayBhbmQgcGNyZWxfb2Zmc2V0IGludG8gYWNjb3VudC4KLQkoaWVlZV93cml0ZV9kYXRhX3BhcnQpOiBTa2lwIHNlY3Rpb25zIHRoYXQgYXJlIG5vdCBsb2FkZWQuCi0JKGllZWVfd3JpdGVfZXh0ZXJuYWxfcGFydCk6IERvbid0IG91dHB1dCBvcHRpb25hbCBsYXN0IGVudHJ5IG9mIFdYCi0JcmVjb3Jkcy4KLQkoaWVlZV93cml0ZV9tZV9wYXJ0KTogTWFrZSBzZXR0aW5nIG9mIG1lX3JlY29yZCBuZWF0ZXIuCi0JKGllZWVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogR2V0IHRoZSBzaXplIG9mIGFuIGFyY2hpdmUgZWxlbWVudC4KLQotCSogc3ltcy5jIChzdHQpOiBBZGQgZW50cmllcyBmb3IgemVyb3ZhcnMsIHZhcnMsIGFuZCBjb2RlLgotCi0JKiBlbGZjb2RlLmggKHZhbGlkYXRlX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkod3JpdGVfcmVsb2NzKTogQ2FsbCB2YWxpZGF0ZV9yZWxvYyBmb3Igbm9uIEVMRiByZWxvY3MuCi0KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfc3ltYm9sX2xlYWRpbmdfY2hhcik6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoVEFSR0VUX0JJR19TWU0pOiBVc2UgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIuCi0JKFRBUkdFVF9MSVRUTEVfU1lNKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy5iZmQgKG02OCotKi1wc29zKik6IE5ldyB0YXJnZXQuCi0KLVR1ZSBGZWIgMTMgMTU6NTY6MjIgMTk5NiAgQnJ5YW4gRm9yZCAgPGJhZm9yZEBzbmFrZS5jcy51dGFoLmVkdT4KLQotCSogaTM4Nm1zZG9zLmM6IFJlbW92ZSBzb21lICNpZiAwIGNvZGUuCi0JKG1zZG9zX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGluY2x1ZGUgZW1wdHkgc2VjdGlvbnMgaW4gdGhlCi0Jc2l6ZSBjb21wdXRhdGlvbiwgcmVnYXJkbGVzcyBvZiB0aGVpciBhZGRyZXNzLgotCi1UdWUgRmViIDEzIDE1OjM2OjM3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IHNlZ2ZhdWx0IGlmIGR5bmJvagotCWlzIE5VTEwsIGllLCB0aGUgLXIgc3dpdGNoIGlzIHVzZWQuCi0KLVR1ZSBGZWIgMTMgMTQ6MzU6MTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfTUlQU19HT1RfSEkxNik6IERlZmluZS4KLQkoQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpOiBEZWZpbmUuCi0JKEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNiwgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2KTogRGVmaW5lLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19yZWxvY19tYXApOiBNYXAgbmV3IHJlbG9jcy4KLQotCSogY29uZmlndXJlLmhvc3Q6IFNldCBIRExGTEFHUyBmb3IgKi0qLWhwdXggd2l0aCAtLWVuYWJsZS1zaGFyZWQuCi0KLQkqIE1ha2VmaWxlLmluICgkKFNITElOSykpOiBDaGVjayB0cyBhZ2FpbnN0ICQoU0hMSUIpLCBub3QKLQkkKFNITElOSykuCi0KLQkqIGllZWUuYyAoZ2V0X3N5bWJvbCk6IFNldCB0aGUgc2VjdGlvbiB0byBiZmRfYWJzX3NlY3Rpb24uCi0JKGRvX3dpdGhfcmVsb2NzKTogSWYgRVhFQ19QIGlzIHNldCBhbmQgdGhlcmUgYXJlIG5vIHJlbG9jcywgdXNlIGEKLQlzaW1wbGUgbnVtYmVyIGZvciB0aGUgc2VjdGlvbiBhZGRyZXNzLCByYXRoZXIgdGhhbiBhbiBleHByZXNzaW9uLgotCUxpbWl0IHRoZSBudW1iZXIgb2YgYnl0ZXMgYmV0d2VlbiByZWxvY3MgdG8gTUFYUlVOLgotCShpZWVlX3dyaXRlX21lX3BhcnQpOiBTZXQgbWVfcmVjb3JkIHRvIHRoZSBmaWxlIG9mZnNldCBhZnRlciB0aGUKLQlzdGFydCBhZGRyZXNzLgotCShpZWVlX3dyaXRlX3Byb2Nlc3Nvcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGllZWVfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIGllZWVfd3JpdGVfcHJvY2Vzc29yLgotCi1GcmkgRmViICA5IDEwOjUzOjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFVzZSAke0NDLWdjY30gd2hlbiB0ZXN0aW5nIGZvciAtcnBhdGggb24gU3VuT1MuCi0KLQkqIGNvZmYtYXV4LmM6IENoYW5nZSBpbmNsdWRlIG9mIGF1eC5oIHRvIGF1eC1jb2ZmLmguCi0KLVRodSBGZWIgIDggMTQ6MDE6MDMgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IEZvciBhIFJfNjhLX1JFTEFUSVZFCi0JcmVsb2NhdGlvbiBwdXQgdGhlIGFkZGVuZCBib3RoIGluIHRoZSByZWxvYyBlbnRyeSBhbmQgdGhlIGRhdGEuCi0JKGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLiAgTWFzayBvdXQgbWFya2VyIGluCi0JR09UIG9mZnNldCB2YWx1ZS4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgLUJzeW1ib2xpYywgcmVzb2x2ZQotCWEgUl82OEtfUEN4eCByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZCBnbG9iYWwgc3ltYm9sIGRpcmVjdGx5LgotCShlbGZfbTY4a19jaGVja19yZWxvY3MpOiBEb24ndCBjb3VudCBzdWNoIGEgcmVsb2MuCi0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfY2hlY2tfcmVsb2NzKTogRG9uJ3QgcmVjb3JkIGEgc3ltYm9sIHdpdGgKLQlhIFBMVHh4IHJlbG9jIGFzIGR5bmFtaWMuICBEaXNhbGxvdyBQTFR4eE8gcmVsb2MgYWdhaW5zdCBhIGxvY2FsCi0Jc3ltYm9sIGZvciBub3csIG90aGVyd2lzZSBhbHdheXMgcmVjb3JkIHRoZSBzeW1ib2wgYXMgZHluYW1pYy4KLQkoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgd2l0aCBhIFBMVHh4IHJlbG9jCi0JaXMgbm90IHJlZmVyZW5jZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgYW5kIHdlIGFyZSBub3QgbWFraW5nIGEKLQlzaGFyZWQgb2JqZWN0LCB0aGVuIGRvbid0IG1ha2UgYSBQTFQgZW50cnkuICBJZiB3ZSBkbyBtYWtlIGEgUExUCi0JZW50cnksIG1ha2Ugc3VyZSB0aGUgc3ltYm9sIGhhcyBiZWVuIHJlY29yZGVkIGFzIGR5bmFtaWMuCi0KLVdlZCBGZWIgIDcgMTM6NTY6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogV2hlbiBtYWtpbmcgYSBzaGFyZWQgbGlicmFyeSwgc2V0IEhMREZMQUdTIHRvCi0JcGFzcyBhbiBhcHByb3ByaWF0ZSAtcnBhdGggb3B0aW9uLiAgVXNlIHRoZSBtYWtlIHZhcmlhYmxlIFNPTkFNRQotCWFzIHRoZSBzaGFyZWQgbGlicmFyeSBzb25hbWUsIHJhdGhlciB0aGFuIGNvbXB1dGluZyBpdCBoZXJlLiAgT24KLQlTdW5PUywgYnVpbGQgc3RhbXAtdHNobGluayBpbiBwbGFjZSBvZiAkKFNITElOSykuCi0JKiBNYWtlZmlsZS5pbiAoU09OQU1FKTogTmV3IHZhcmlhYmxlLgotCSgkKFNITElOSykpOiBNYWtlIGEgbGluayB0byB0aGUgdHJhbnNmb3JtZWQgbmFtZSwgYXMgd2VsbC4KLQkoc3RhbXAtdHNobGluayk6IE5ldyB0YXJnZXQuCi0JKGluc3RhbGwpOiBTa2lwIHN0YW1wLXRzaGxpbmsgZHVyaW5nIGluc3RhbGwuCi0KLVdlZCBGZWIgIDcgMTM6Mzc6MzkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBEbyBub3QgYXNzdW1lIHRoYXQgdGhlCi0JbGlua2VyIHNlY3Rpb25zIGhhdmUgYmVlbiBzZXQgdXAgeWV0LgotCi0JKiBlbGYuYyAobWFrZV9tYXBwaW5nKTogQWRkIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gc3VwcHJlc3MKLQltYWtpbmcgdGhlIGZpcnN0IHNlY3Rpb24gaW5jbHVkZSB0aGUgcHJvZ3JhbSBoZWFkZXJzLgotCShtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBJZiB0aGUgdXNlciB1c2VkIC1UdGV4dCBzdWNoIHRoYXQgdGhlCi0JcHJvZ3JhbSBoZWFkZXJzIGFyZSBvbiBhIGRpZmZlcmVudCBwYWdlLCBkbyBub3Qgc2V0IHRoZSBmbGFncwotCXNheWluZyB0aGF0IHRoaXMgc2VjdGlvbiBpbmNsdWRlcyB0aGUgcHJvZ3JhbSBoZWFkZXJzLgotCi1UdWUgRmViICA2IDE0OjA0OjQ5IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgqLSotbmV0YnNkKik6IFNldCBDT1JFRklMRSB0byBuZXRic2QtY29yZS5jLgotCWRvbid0IGRlZmluZSBUUkFEX0hFQURFUi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogbmV0YnNkLWNvcmUuYzogTmV3IGZpbGUsIHN1cHBvcnQgZm9yIE5ldEJTRCBjb3JlIGZpbGVzLgotCSogaG9zdHMvKm5ic2QuaDogUmVtb3ZlZC4KLQotVHVlIEZlYiAgNiAxMTo0Nzo0OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoQkZEX1JFTE9DX1NQQVJDX1s1NjddKTogTmV3IHJlbG9jIHR5cGVzLgotCShCRkRfUkVMT0NfU1BBUkNfTE83IHJlbG9jIHR5cGUpOiBEZWxldGVkLgotCSogbGliYmZkLmgsIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBlbGYzMi1zcGFyYy5jIChfYmZkX3NwYXJjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IFJlbmFtZWQgZnJvbQotCWJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAuCi0JKHJlbG9jX3R5cGV7LF9uYW1lc30pOiBEZWxldGVkLgotCShfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSk6IFJlbmFtZWQgZnJvbSBlbGZfc3BhcmNfaG93dG9fdGFibGUuCi0JQWRkIHNwYXJjNjQgcmVsb2NzLgotCShzcGFyY19yZWxvY19tYXApOiBBZGQgc3BhcmM2NCByZWxvY3MuCi0JKHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IEhhbmRsZSBSX1NQQVJDX1dESVNQezE2LDE5fS4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfd2Rpc3AxNl9yZWxvYyk6IERlbGV0ZWQuCi0JKHJlbG9jX3R5cGV7LF9uYW1lc30pOiBEZWxldGVkLgotCShlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBEZWxldGVkLgotCShzcGFyY19yZWxvY19tYXApOiBEZWxldGVkLgotCShfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSk6IFJlbmFtZWQgZnJvbSBlbGZfc3BhcmNfaG93dG9fdGFibGUuCi0JKGJmZF9lbGY2NF9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBDaGFuZ2UgZnJvbSBmdW5jdGlvbiB0byAjZGVmaW5lLgotCi1UdWUgRmViICA2IDEyOjEyOjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IE1ha2UgU0hMSUJfQ0ZMQUdTIGluY2x1ZGUgJChQSUNGTEFHKSBvbiBhCi0JKi0qLWhwdXgqIGhvc3QuCi0KLQkqIE1ha2VmaWxlLmluIChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKTogTmV3IHZhcmlhYmxlLgotCShpbnN0YWxsKTogVHJhbnNmb3JtIGxpYnJhcnkgbmFtZSBiZWZvcmUgaW5zdGFsbGluZyBpdC4KLQotTW9uIEZlYiAgNSAxMDozODoyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2k5NjBfaHgpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBjcHUtaTk2MC5jIChzY2FuXzk2MF9tYWNoKTogQWNjZXB0IG1hY2hpbmUgImh4Ii4KLQkoTUFUUklYKTogRXhwYW5kIGVudHJpZXMgZm9yIEhYLgotCShhcmNoX2luZm9fc3RydWN0KTogQWRkIGk5NjA6aHggZW50cnkuCi0JKiBib3V0LmMgKGJfb3V0X3NldF9hcmNoX21hY2gpOiBIYW5kbGUgYmZkX21hY2hfaTk2MF9oeC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogSGFuZGxlIEZfSTk2MEhYLgotCShjb2ZmX3NldF9mbGFncyk6IEhhbmRsZSBiZmRfbWFjaF9pOTYwX2h4LgotCi0JU3VwcG9ydCBmb3IgYnVpbGRpbmcgYXMgYSBzaGFyZWQgbGlicmFyeSwgYmFzZWQgb24gcGF0Y2hlcyBmcm9tCi0JQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCSogY29uZmlndXJlLmluOiBBZGQgQUNfQVJHX0VOQUJMRSBmb3Igc2hhcmVkIGFuZCBjb21tb25iZmRsaWIuCi0JTmV3IHN1YnN0aXR1dGlvbnM6IEFMTExJQlMsIFBJQ0ZMQUcsIFNITElCLCBTSExJQl9DQywKLQlTSExJQl9DRkxBR1MsIENPTU1PTl9TSExJQiwgUElDTElTVCwgU0hMSU5LLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmhvc3Q6IElmIC0tZW5hYmxlLXNoYXJlZCwgYWRqdXN0IHNoYXJlZCBsaWJyYXJ5IHN0dWZmCi0JYmFzZWQgb24gdGhlIGhvc3QuICBJZiB0aGUgaG9zdCBpcyBTdW5PUywgYW5kIHRoZSBsaW5rZXIgc3VwcG9ydHMKLQktcnBhdGgsIHNldCBITERGTEFHUyB0byB1c2UgaXQuCi0JKiBNYWtlZmlsZS5pbiAoQUxMTElCUyk6IE5ldyB2YXJpYWJsZS4KLQkoUElDRkxBRywgU0hMSUIsIFNITElCX0NDLCBTSExJQl9DRkxBR1MpOiBOZXcgdmFyaWFibGVzLgotCShDT01NT05fU0hMSUIsIFNITElOSyk6IE5ldyB2YXJpYWJsZXMuCi0JKC5jLm8pOiBJZiBQSUNGTEFHIGlzIHNldCwgY29tcGlsZSB0d2ljZSwgb25jZSBQSUMsIG9uY2Ugbm9ybWFsLgotCShTVEFHRVNUVUZGKTogUmVtb3ZlIHZhcmlhYmxlLgotCShhbGwpOiBEZXBlbmQgdXBvbiAkKEFMTExJQlMpIGFuZCBAUElDTElTVEAgcmF0aGVyIHRoYW4KLQkkKFRBUkdFVExJQikuCi0JKHN0YW1wLW9maWxlcyk6IE5ldyB0YXJnZXQsIGxpa2Ugb2xkIG9maWxlcyB0YXJnZXQsIGJ1dCBidWlsZAotCXVzaW5nIGEgdGVtcG9yYXJ5IGZpbGUgYW5kIG1vdmUtaWYtY2hhbmdlLCBhbmQgdG91Y2ggc3RhbXAtb2ZpbGVzCi0Jd2hlbiBkb25lLgotCShvZmlsZXMpOiBKdXN0IGRlcGVuZCB1cG9uIHN0YW1wLW9maWxlcy4KLQkoc3RhbXAtcGljbGlzdCwgcGljbGlzdCk6IE5ldyB0YXJnZXRzLgotCSgkKFNITElCKSwgJChTSExJTkspKTogTmV3IHRhcmdldHMuCi0JKHRhcmdldHMubywgYXJjaHVyZXMubyk6IEJ1aWxkIHR3aWNlIGlmIFBJQ0ZMQUcgaXMgc2V0LgotCShkb19tb3N0bHljbGVhbik6IFJlbW92ZSBwaWMvKi5vLgotCShkb19jbGVhbik6IFJlbW92ZSBzdGFtcC1vZmlsZXMsICQoU0hMSUIpLCAkKFNITElOSyksIHBpY2xpc3QsIGFuZAotCXN0YW1wLXBpY2xpc3QuCi0JKGRvX2Rpc3RjbGVhbik6IFJlbW92ZSBwaWMgYW5kIHN0YW1wLXBpY2Rpci4KLQkoaW5zdGFsbCk6IEluc3RhbGwgc2hhcmVkIGxpYnJhcmllcy4KLQkoJChPRklMRVMpKTogRGVwZW5kIHVwb24gc3RhbXAtcGljZGlyLgotCShzdGFtcC1waWNkaXIpOiBOZXcgdGFyZ2V0LgotCi0JKiBsaWJjb2ZmLWluLmg6IEFkZCBjb21tZW50IHJlbWluZGluZyBwZW9wbGUgdGhhdCBsaWJjb2ZmLmggaXMgYQotCWdlbmVyYXRlZCBmaWxlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBlbGZsaW5rLmggKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCB0cnkgdG8gZ2V0IHRoZQotCWZsYXZvdXIgb2YgYSBzZWN0aW9uIHdpdGggbm8gb3duZXIuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDbGVhcgotCUVMRl9MSU5LX05PTl9FTEYgZmxhZy4KLQkobWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIGVsZi5jOiBSZXZlcnQgbGFzdCBjaGFuZ2UsIHNpbmNlIGl0IGJyZWFrcyBkeW5hbWljIGxpbmtpbmcuCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogUmVtb3ZlIHdhbnRfaGRyX2luX3NlZwotCWZpZWxkLgotCSogZWxmMzItbWlwcy5jIChlbGZfYmFja2VuZF93YW50X2hkcl9pbl9zZWcpOiBEb24ndCBkZWZpbmUuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfd2FudF9oZHJfaW5fc2VnKTogRG9uJ3QgZGVmaW5lLgotCShlbGZOTl9iZWQpOiBEb24ndCBpbml0aWFsaXplIHdhbnRfaGRyX2luX3NlZyBmaWVsZC4KLQotU3VuIEZlYiAgNCAyMDo0NToxMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSWYgdGhlIGJhY2tlbmQgZG9lcwotCW5vdCB3YW50IHRoZSBlbGYgaGVhZGVyIG9yIHRoZSBwcm9ncmFtIGhlYWRlcnMgaW4gdGhlIGFkZHJlc3MKLQlzcGFjZSwgZG8gbm90IGluY2x1ZGUgdGhlbSBpbiB0aGUgY2FsY3VsYXRpb25zLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyk6IE5ldyBob29rCi0JZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgYWRkaXRpb25hbCBwcm9ncmFtIGhlYWRlcnMuCi0JKHBwY19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwKTogRGVmaW5lIGFzIGEgTk9QIGZ1bmN0aW9uIGZvciBub3cuCi0JKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogLnNkYXRhMiBpcyBhIHJlYWQtb25seSBzZWN0aW9uLgotCi1TYXQgRmViICAzIDIzOjAwOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaDogTW92ZSB0b2RheSdzIGxpYmNvZmYuaCBjaGFuZ2UgaW50byBjb2ZmY29kZS5oLgotCi1TYXQgRmViICAzIDE1OjQzOjQ0IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLmggKGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBDb21iaW5lIG1hY3JvIGFyZ3MKLQliYWNrIGludG8gb25lIGxpbmUuICBTb21lIGNvbXBpbGVycyAoc3Vub3MgNC4xLjMgZm9yIGV4YW1wbGUpCi0Jd29uJ3QgYWNjZXB0IGFyZ3Mgc3BsaXQgYWNyb3NzIG1vcmUgdGhhbiBvbmUgbGluZS4KLQotRnJpIEZlYiAgMiAxMTo0MjoxNSAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00IChCRkRfQklOQVJZX0ZPUEVOKTogVW5kZXJzdGFuZCBjeWd3aW4zMi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotRnJpIEZlYiAgMiAxMjoxMjoxNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKTogRG9uJ3QKLQl0cnkgdG8gZG8gYXJpdGhtZXRpYyBvbiBhIHZvaWQgKiwgY2FzdCBpdCB0byBhIHVuc2lnbmVkIGNoYXIgKiBmaXJzdC4KLQotVGh1IEZlYiAgMSAxNjowNDowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoRUxGX0xJTktfTk9OX0VMRik6IERlZmluZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IFNldCBlbGZfbGlua19oYXNoX2ZsYWdzIHRvCi0JRUxGX0xJTktfTk9OX0VMRi4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogUmVzZXQgRUxGX0xJTktfTk9OX0VMRgotCWZsYWcgZm9yIGEgbmV3bHkgZGVmaW5lZCBzeW1ib2wuCi0JKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IExpa2V3aXNlLgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgRUxGX0xJTktfTk9OX0VMRiBpcyBzZXQsIHRyeSB0bwotCXNldCB0aGUgREVGIG9yIFJFRl9SRUdVTEFSIGZsYWdzIGNvcnJlY3RseS4KLQotCSogTWFrZWZpbGUuaW4gKGJmZC1pbjIuaCk6IE1ha2UgYmZkLmgsIG5vdCBwcm90b3MsIGluIGRvY2Rpci4KLQkobGliYmZkLmgsIGxpYmNvZmYuaCk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IERvbid0IHJlY29yZCBhIHN5bWJvbCB3aXRoCi0JYSBQTFQzMiByZWxvYyBhcyBkeW5hbWljLgotCShlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBhIHN5bWJvbCB3aXRoIGEgUExUMzIgcmVsb2MKLQlpcyBub3QgcmVmZXJlbmNlZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgd2UgYXJlIG5vdCBtYWtpbmcgYQotCXNoYXJlZCBvYmplY3QsIHRoZW4gZG9uJ3QgbWFrZSBhIFBMVCBlbnRyeS4gIElmIHdlIGRvIG1ha2UgYSBQTFQKLQllbnRyeSwgbWFrZSBzdXJlIHRoZSBzeW1ib2wgaGFzIGJlZW4gcmVjb3JkZWQgYXMgZHluYW1pYy4KLQotV2VkIEphbiAzMSAxNzoyMzozMiAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIEJGRF9SRUxPQ18zMl9QQ1JFTC4KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotd2luMzIpOiBCZWNvbWVzIGlbMzQ1XTg2LSotY3lnd2luMzIuCi0JKHBvd2VycGNsZS0qLWN5Z3dpbjMyKTogTmV3LgotCSogcGVpY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IEdldCBhZGRyZXNzIGZyb20gdm1hLgotCi1XZWQgSmFuIDMxIDE2OjIzOjU3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBJZiB0aGUgc3ltYm9sCi0JYXR0YWNoZWQgdG8gdGhlIHNlY3Rpb24gaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGFzIGFuIHVuZGVmaW5lZAotCXN5bWJvbCwgdHJlYXQgaXQgYXMgaWYgaXQgaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQuCi0KLVdlZCBKYW4gMzEgMTY6MTY6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IERvbid0IG91dHB1dCBpbml0aWFsIGR1bW15Ci0Jc3ltYm9sIG9yIHNlY3Rpb24gc3ltYm9scyBpZiBzdHJpcHBpbmcgYWxsIHN5bWJvbHMgYW5kIHRoaXMgaXMgbm90Ci0JYSByZWxvY2F0ZWFibGUgbGluay4gIERvbid0IG91dHB1dCB0aGUgc3ltYm9sIHN0cmluZyB0YWJsZSBpZgotCXRoZXJlIGFyZSBubyBzeW1ib2xzLgotCShlbGZfbGlua19mbHVzaF9vdXRwdXRfc3ltcyk6IERvbid0IGRvIGFueXRoaW5nIGlmIHRoZXJlIGFyZSBubwotCXN5bWJvbHMgdG8gZmx1c2guCi0KLVdlZCBKYW4gMzEgMTI6NTU6NDkgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvZmYtYXV4LmM6IE5ldyBmaWxlLgotCSogaG9zdHMvbTY4a2F1eC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5iZmQgKG02OCotYXBwbGUtYXV4Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKG02OCotYXBwbGUtYXV4Kik6IE5ldyBuYXRpdmUgaG9zdC4KLQkobTY4a2F1eF9jb2ZmX3ZlYyk6IE5ldyB2ZWN0b3IuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiB0YXJnZXRzLmMgKG02OGthdXhfY29mZl92ZWMpOiBEZWNsYXJlLgotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkCi0JX2JmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wuCi0JKGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBEZWZpbmUuCi0JKGNvbXBhcmVfYXJlbGVudF9wdHIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uIGlmIFRBUkdfQVVYLgotCShjb2ZmX3dyaXRlX3JlbG9jcyk6IElmIFRBUkdfQVVYLCBzb3J0IHRoZSByZWxvY3MuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IEEvVVggYW91dGhkciBtYWdpYyBudW1iZXIuCi0JKGNvZmZfbGlua19hZGRfb25lX3N5bWJvbCk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IENhbGwKLQliZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sIHJhdGhlciB0aGFuCi0JX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wuCi0JKiBjb2ZmLW02OGsuYyAoQ09GRl9QQUdFX1NJWkUpOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLWF1eC5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgY29mZi1hdXguYy4KLQotV2VkIEphbiAzMSAxMTozNzo0NiAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogRml4IFJfNjhLX0dPVCoKLQlyZWxvY2F0aW9uOyBpZ25vcmUgYWRkZW5kIHdpdGggUl82OEtfe0dPVCxQTFR9Kk8gcmVsb2NhdGlvbi4KLQotVHVlIEphbiAzMCAxMjowOTowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkb19tYWludGFpbmVyX2NsZWFuKTogUmVtb3ZlICQoc3JjZGlyKS9iZmQtaW4yLmgsCi0JJChzcmNkaXIpL2xpYmJmZC5oIGFuZCAkKHNyY2RpcikvbGliY29mZi5oLgotCShtYWludGFpbmVyLWNsZWFuKTogV2FybiBhYm91dCBkZWxldGluZyBzcGVjaWFsIGZpbGVzLgotCShiZmQtaW4yLmgsIGxpYmJmZC5oLCBsaWJjb2ZmLmgpOiBOZXcgdGFyZ2V0cy4KLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgaW5kaXJlY3QgYW5kCi0Jd2FybmluZyBzeW1ib2xzIGNvcnJlY3RseS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogc3ltcy5jIChfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IEFkZCBjYXN0cyB0byBhdm9pZAotCXdhcm5pbmdzLgotCi1Nb24gSmFuIDI5IDE0OjI3OjI0IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLWluLmg6IGFsaWduZWQgbmV3bHkgZXhwb3J0ZWQgbmFtZXMgd2l0aCBiZmQgbmFtaW5nCi0JY29udmVudGlvbnMuIFJlbW92ZWQgYW4gZXJyb25lb3VzIGRlZmluZSBvZiBQT1dFUlBDX0xFX1BFLgotIAkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZsaW5rLmMsIGNvZmYtcHBjLmM6IHRoZSBhYm92ZSBmdW5jdGlvbiBuYW1lIGNoYW5nZXMKLQotTW9uIEphbiAyOSAxMzowNjoyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEJhc2ltIEthZGhpbSA8a2FkaGltQHNwb2NrLmNzLmNvbG9yYWRvLmVkdT46Ci0JKiBlY29mZi5jIChzdHJ1Y3QgZXh0c3ltX2luZm8pOiBEZWZpbmUuCi0JKF9iZmRfZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBQYXNzIGEgcG9pbnRlciB0byBzdHJ1Y3QgZXh0c3ltX2luZm8KLQl0byBlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsLgotCShlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogQWNjZXB0IGEgc3RydWN0IGV4dHN5bV9pbmZvIHBvaW50ZXIuCi0JU3RyaXAgc3ltYm9scyB3aGVuIGFwcHJvcHJpYXRlLgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT46Ci0JKiBzeW1zLmMgKEJTRl9PQkpFQ1QpOiBEZWZpbmUuCi0JKGJmZF9wcmludF9zeW1ib2xfdmFuZGYpOiBQcmludCAnTycgZm9yIEJTRl9PQkpFQ1QuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgQlNGX09CSkVDVCBmb3IgYW4KLQlTVFRfT0JKRUNUIHN5bWJvbC4KLQkqIGVsZi5jIChzd2FwX291dF9zeW1zKTogT25seSBzZXQgdHlwZSB0byBTVFRfT0JKRUNUIGlmIEJTRl9PQkpFQ1QKLQlpcyBzZXQuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IElmIC1Cc3ltYm9saWMsIHdoZW4KLQljb3B5aW5nIHJlbG9jcyBpbnRvIGEgc2hhcmVkIG9iamVjdCwgdHJlYXQgYSBkZWZpbmVkIGdsb2JhbCBzeW1ib2wKLQlhcyBhIGxvY2FsIHN5bWJvbC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogT25seSBzZXQgd2Vha2RlZiB0byBhCi0JcmVhbCBkZWZpbmVkIHN5bWJvbCwgbm90IHRvIGEgd2VhayBkZWZpbmVkIHN5bWJvbC4KLQotTW9uIEphbiAyOSAxMTozNDozNiAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYzogcmVtb3ZlZCB0aGUgUE9XRVJQQ19MRV9QRSBoYWNrLCBwcm9tb3RlZCBzb21lIHR5cGVzCi0JYW5kIG1hZGUgYSBmZXcgc3RhdGljIGZ1bmN0aW9ucyBleHRlcm5zLgotCi0JKiBjb2ZmLXBwYy5jIChwcGNfYmZkX2NvZmZfZmluYWxfbGluayk6IG5ldyBmdW5jdGlvbiwgcmVwbGFjZXMgdGhlCi0JUE9XRVJQQ19MRV9QRSBoYWNrIGluIGNvZmZsaW5rLgotCi0JKiBsaWJjb2ZmLWluLmg6IHByb21vdGVkIHRoZSBmb2xsb3dpbmcgZnJvbSBjb2ZmbGluay5jIHRvIGFsbG93Ci0JX2JmZF9jb2ZmX2ZpbmFsX2xpbmsgdG8gYmUgb3ZlcnJpZGRlbiAtICBTVFJJTkdfU0laRV9TSVpFLAotCWNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCwgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSwKLQljb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnksIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZSwKLQljb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfaW5pdCwgIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlLAotCWNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXAsIGNvZmZfbGlua19zZWN0aW9uX2luZm8sCi0JY29mZl9maW5hbF9saW5rX2luZm8sIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9uZXdmdW5jLAotCWNvZmZfd3JpdGVfZ2xvYmFsX3N5bSwgY29mZl9saW5rX2lucHV0X2JmZCwgY29mZl9yZWxvY19saW5rX29yZGVyLgotCi0JKiBsaWJjb2ZmLmg6IHJlLWdlbidkCi0KLUZyaSBKYW4gMjYgMTg6MzM6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1zLmM6IEluY2x1ZGUgImJmZGxpbmsuaCIuCi0JKHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyk6IERlZmluZS4KLQkoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGxpbmVfaW5mbyBmaWVsZC4KLQkqIGVsZi5jIChfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IFRyeSBjYWxsaW5nCi0JX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgYmVmb3JlIHNlYXJjaGluZyB0aGUgRUxGCi0Jc3ltYm9sIHRhYmxlLiAgRmluZCB0aGUgY2xvc2VzdCBTVFRfRlVOQyBzeW1ib2wsIG5vdCB0aGUgbGFzdCBvbmUuCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfZGF0YV90eXBlKTogQWRkIGxpbmVfaW5mbyBmaWVsZC4KLSAJKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBUcnkgY2FsbGluZwotCV9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIGJlZm9yZSBzZWFyY2hpbmcgdGhlIENPRkYKLQlzeW1ib2wgdGFibGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLUZyaSBKYW4gMjYgMTY6MTE6MTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAoUl9QUENfRU1CX1NEQTIxIHJlbG9jYXRpb25zKTogTWFrZSByZWxvY2F0aW9uIHNpemUKLQk0IGJ5dGVzLCBzbyB3ZSBnZXQgdGhlIGNvcnJlY3QgdmFsdWUgd2hlbiB1cGRhdGluZyB0aGUgcmVnaXN0ZXIKLQlmaWVsZCBpbiBsaXR0bGUgZW5kaWFuIG1vZGUuCi0KLVRodSBKYW4gMjUgMTI6MTQ6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCB4Y29mZl90ZGF0YSk6IFJlbW92ZSB0b2Nfc2VjdGlvbiBhbmQKLQllbnRyeV9zZWN0aW9uIGZpZWxkcy4gIEFkZCBzbnRvYyBhbmQgc25lbnRyeSBmaWVsZHMuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBJbml0aWFsaXplIHNudG9jIGFuZCBzbmVudHJ5LAotCW5vdCB0b2Nfc2VjdGlvbiBhbmQgZW50cnlfc2VjdGlvbiAodGhlIENPRkYgZmlsZSBkb2VzIG5vdCBoYXZlIGFueQotCXNlY3Rpb25zIGF0IHRoaXMgcG9pbnQpLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBvX3NuZW50cnkgYW5kIG9fc250b2MgZnJvbQotCXNuZW50cnkgYW5kIHNudG9jIHJhdGhlciB0aGFuIGVudHJ5X3NlY3Rpb24gYW5kIHRvY19zZWN0aW9uLgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSBzbnRvYyBhbmQKLQlzbmVudHJ5LCBub3QgdG9jX3NlY3Rpb24gYW5kIGVudHJ5X3NlY3Rpb24uCi0JKiB4Y29mZmxpbmsuYyAoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHNldAotCWVudHJ5X3NlY3Rpb24gZnJvbSBoZW50cnkuCi0JKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogSWYgYSBkZWZpbmVkIHN5bWJvbCBoYXMgWENPRkZfRU5UUlkgc2V0LAotCXNldCBzbmVudHkuCi0JKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogU2V0IHNudG9jLCBub3QgdG9jX3NlY3Rpb24uCi0JKHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBHZXQgdG9jX3NlY3Rpb24gZnJvbSBzbnRvYywgcmF0aGVyCi0JdGhhbiB1c2luZyB0b2Nfc2VjdGlvbiBkaXJlY3RseS4KLQotCSogYXJjaHVyZXMuYzogQWRkIG1pc3NpbmcgYC4nIGluIGVudW0gYmZkX2FyY2hpdGVjdHVyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi1zY28qZWxmKik6IFVzZSBiZmRfZWxmMzJfaTM4Nl92ZWMuICBGcm9tCi0JUm9iZXJ0IExpcGUgPHJvYmVydGxAYXJuZXQuY29tPi4KLQotVGh1IEphbiAyNSAxMjowODo1MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEFkZCAucmVsYS5zZGF0YXssMn0KLQl0byBzZWN0aW9ucyB3ZSBhbGxvY2F0ZS4gIFVzZSBiZmRfemFsbG9jIHRvIGFsbG9jYXRlIGluaXRpYWxpYWwKLQlzZWN0aW9ucywgbm90IGJmZF9hbGxvYy4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBSZW1vdmUgQkZEX0FTU0VSVHMgZm9yICFzaGFyZWQgZnJvbQotCVNEQXssMn1JMTYgcmVsb2NhdGlvbnMuCi0JKHBwY19lbGZfYWRkX3N5bWJvbF9ob29rKTogVXNlIHRoZSB2YWx1ZSBvZiAtRyBubiB0byBkZXRlcm1pbmUKLQl3aGV0aGVyIHRvIHB1dCBzb21ldGhpbmcgaW4gLnNic3Mgb3Igbm90LgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgc3VwcG9ydCBmb3IgbW9yZSByZWxvY2F0aW9ucy4gIEFkZAotCWluIHNlYy0+b3V0cHV0X29mZnNldCB3aGVyZSBhcHByb3ByaWF0ZS4gIE1ha2UgZXJyb3IgbWVzc2FnZXMKLQlpbmNsdWRlIHRoZSBzeW1ib2wgbmFtZS4KLQotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBMb29rdXAgc3ltYm9sIGJlZm9yZQotCXRyeWluZyB0byBhZGQgaXQgdG8gdGhlIHN5bWJvbCB0YWJsZSwgc28gX0dMT0JBTF9PRkZTRVRfVEFCTEVfCi0JZG9lc24ndCBnZXQgcmVkZWZpbmVkIG1lc3NhZ2VzIGlmIC1zaGFyZWQuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKSBPbmx5IGJ1bXAgUkVMQQotCXNlY3Rpb24gaWYgdGhlIHJlbF9zZWN0aW9uIGZpZWxkIGhhcyBiZWVuIHNldCB1cC4KLQotV2VkIEphbiAyNCAyMDo0MDoyNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggdHlwbyBpbiBlYWJpCi0JcmVsb2NhdGlvbnMuCi0KLVdlZCBKYW4gMjQgMTA6Mzg6MzQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWxldGUgY2hlY2tpbmcKLQlvZiBmbGFncywgb25seSBmbGFncyB1c2VkIGFyZSBjb250cm9sbGVkIGJ5IG1hY2ggbnVtYmVyLiAgQnVtcCB1cAotCW91dHB1dCBmaWxlIG1hY2ggbnVtYmVyIHRvIGhpZ2hlc3Qgb2YgaW5wdXQgZmlsZSBtYWNoIG51bWJlcnMuCi0JKGVsZjMyX3NwYXJjX29iamVjdF9wKTogV2F0Y2ggZm9yIEVGX1NQQVJDX1NVTl9VUzEuCi0JKGVsZjMyX3NwYXJjX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBTZXQgRUZfU1BBUkNfU1VOX1VTMSBpZiB2OHBsdXNhLgotCi0JKiBjb25maWcuYmZkIChzcGFyYzY0LSote3N5c3Y0Kixzb2xhcmlzMip9KTogQ29tbWVudCBvdXQKLQliZmRfZWxmNjRfc3BhcmNfdmVjIHN1cHBvcnQuCi0KLVR1ZSBKYW4gMjMgMTQ6MzM6MDUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEb24ndCBjb21wbGFpbiBpZgotCXRoZSBlbWJlZGRlZCBiaXQgaXMgc2V0IG9uIHNvbWUgb2JqZWN0cyBhbmQgbm90IG9uIG90aGVycy4gIEp1c3QKLQlvciBpdCB0b2dldGhlci4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSW1wbGVtZW50IFJfUFBDX0VNQl97U0RBMjEsUkVMU0RBfQotCXJlbG9jYXRpb25zLgotCi1UdWUgSmFuIDIzIDE0OjIyOjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9uZXdfc2VjdGlvbl9ob29rKTogRG9uJ3QgdHJ5IHRvIGFsaWduIHRoZQotCS5zdGFic3RyIHNlY3Rpb24uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBGaXggdGhlIGhhbmRsaW5nIG9mIHRoZQotCS5saWIgc2VjdGlvbiB0byB3b3JrIGV2ZW4gaWYgdGhlIGVudGlyZSBzZWN0aW9uIGNvbnRlbnRzIGFyZQotCXdyaXR0ZW4gYXQgb25jZS4gIEZyb20gR3ZyYW4gVWRkZWJvcmcgPGd2cmFuQHVkZGVib3JnLnBwLnNlPiBhbmQKLQlSb2JlcnQgTGlwZSA8cm9iZXJ0bEBhcm5ldC5jb20+LgotCi1Nb24gSmFuIDIyIDE4OjQ1OjUxIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBEb24ndCBhbGxvY2F0ZQotCW1lbW9yeSBoZXJlIGZvciBjb250ZW50cy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEJ1bXAgdXAgX1NEQV9CQVNFXyBhbmQKLQlfU0RBMl9CQVNFXyBieSAzMjc2OC4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiAjaWYgb3V0IFBMVCBjb2RlIHdoaWNoIHdlIGhhdmVuJ3QKLQlzdGFydGVkIHVzaW5nLiAgQWxsb2NhdGUgY29udGVudHMgZm9yIC5zZGF0YSBhbmQgLnNkYXRhMiBzZWN0aW9ucwotCWFsc28uCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogVXNlIGJmZF9nZXRfc2VjdGlvbl9uYW1lIGluIGRlYnVnIG1lc3NhZ2UsCi0JcmF0aGVyIHRoYW4gX25hbWUuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogUmVtb3ZlIGNvZGUgdGhhdCBhdHRlbXB0ZWQgdG8KLQlzaXplIF9TREF7LDJ9X0JBU0VfLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGFuZ2UgaG93IHNkYXRheywyfSByZWxvY2F0aW9ucyBhcmUKLQlkb25lLgotCi1Nb24gSmFuIDIyIDA4OjUyOjA0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IEZpeCB0eXBvLgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9zcGFyY192OSk6IFJlbmFtZWQgZnJvbSBiZmRfbWFjaF9zcGFyYzY0LgotCShiZmRfbWFjaF9zcGFyY197djhwbHVzLHY4cGx1c2F9KTogRGVmaW5lLgotCShiZmRfbWFjaF9zcGFyY192OWEpOiBEZWZpbmUuCi0JKGJmZF9tYWNoX3NwYXJjX3Y5X3ApOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogYW91dHguaCAoYW91dCxtYWNoaW5lX3R5cGUpOiBiZmRfbWFjaF9zcGFyYzY0IHJlbmFtZWQgdG8KLQliZmRfbWFjaF9zcGFyY192OS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX29iamVjdF9wKTogTGlrZXdpc2UuCi0JKiBjb25maWcuYmZkIChzcGFyYzY0LSotc3lzdjQqLHNwYXJjNjQtKi1zb2xhcmlzMiopOiBTZXQgdGFyZ19kZWZ2ZWMKLQl0byBiZmRfZWxmMzJfc3BhcmNfdmVjLgotCSogY3B1LXNwYXJjLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBSZW5hbWVkIGZyb20gc3BhcmNfYXJjaF9pbmZvLgotCUFkZCB2OHBsdXN7LGF9IHN1cHBvcnQuCi0JQWRkIHY5YSBzdXBwb3J0LgotCShzcGFyY19jb21wYXRpYmxlKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmMzItc3BhcmMuaDogI2luY2x1ZGUgImVsZi9zcGFyYy5oIi4KLQkoZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwgZWxmMzJfc3BhcmNfb2JqZWN0X3AsCi0JZWxmMzJfc3BhcmNfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IE5ldyBmdW5jdGlvbnMuCi0JKGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwgZWxmX2JhY2tlbmRfb2JqZWN0X3AsCi0JZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IERlZmluZS4KLQotTW9uIEphbiAyMiAxMToyMTo1MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQKLQlsaW5rZXJfc2VjdGlvbl9wb2ludGVyIGZpZWxkLgotCShlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtKTogRW51bWVyYXRpb24gZm9yIG5ldyB3YXkgb2YKLQljcmVhdGluZyBsaW5rZXIgZHluYW1pYyBzZWN0aW9ucyBhbmQgc3ltYm9scy4KLQkoZWxmX2xpbmtlcl9zZWN0aW9ueyxfcG9pbnRlcnN9KTogTmV3IHN0cnVjdHVyZXMgZm9yIGNyZWF0aW5nCi0JZHluYW1pYyBzZWN0aW9ucyBhbmQgc3ltYm9scy4KLQkoZWxmX29ial90ZGF0YSk6IEFkZCBsaW5rZXJfc2VjdGlvbl9wb2ludGVycyBhbmQgbGlua2VyX3NlY3Rpb24KLQlmaWVsZHMuCi0JKGVsZl9sb2NhbF9wdHJfb2Zmc2V0cyxlbGZfbGlua2VyX3NlY3Rpb24pOiBOZXcgYWNjZXNzb3IgbWFjcm9zLgotCShfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBOZXcgZGVjbGFyYXRpb25zLgotCShfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBEaXR0by4KLQkoYmZkX2VsZnszMiw2NH1fe2NyZWF0ZSxmaW5pc2h9X3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBEaXR0by4KLQkoX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhKTogRGl0dG8uCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWxldGUuCi0JKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUKLQlzZWN0aW9ucyAuZ290LCAuc2RhdGEsIGFuZCAuc2RhdGEyLgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFphcCAucmVsYS57c2RhdGEsc2RhdGEyfSBpZgotCW5lZWRlZC4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBTdXBwb3J0IG1vcmUgb2YgdGhlIGVhYmkgcmVsb2NhdGlvbnMuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERpdHRvLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbHMpOiBBZGp1c3QgX1NEQXssMn1fQkFTRV8gYnkgMzI3NjgKLQlpZiB0aGUgLnNkYXRheywyfSArIC5zYnNzeywyfSBzZWN0aW9uIHNpemUgaXMgPiAzMmsuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uIHRvCi0JY3JlYXRlIGluaXRpYWxpemVkIHBvaW50ZXJzIGluIGR5bmFtaWMgbGlua2VyIHNlY3Rpb25zLgotCShlbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBBY3R1YWxseSBpbnRpYWxpemUgdGhlCi0JcG9pbnRlcnMgY3JlYXRlZCBhYm92ZS4KLQotCSogZWxmY29kZS5oIChiZmRfZWxmezMyLDY0fV9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IE5ldwotCW1hY3JvcyB0byBwcm92aWRlIGJvdGggMzIgYW5kIDY0IGJpdCB2ZXJzaW9ucyBvZgotCWVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbi4KLQkoYmZkX2VsZnszMiw2NH1fZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBOZXcgbWFjcm9zIHRvCi0JcHJvdmlkZSBib3RoIDMyIGFuZCA2NCBiaXQgdmVyc2lvbnMgb2YKLQllbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24uCi0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uIHRvCi0JY3JlYXRlIGEgbGlua2VyIHNlY3Rpb24uCi0JKF9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IEZpbmQgYSB1bmlxdWUgcG9pbnRlciB0byBhCi0JZ2l2ZW4gYWRkcmVzcyBpbiB0aGUgbGlua2VyIHBvaW50ZXIgb2Zmc2V0cyBjcmVhdGVkIGZvciBhIGdpdmVuCi0Jc3ltYm9sLgotCShfYmZkX2VsZl9tYWtlX2xpbmtlcl9zZWN0aW9uX3JlbGEpOiBNYWtlIGEgUkVMQSBzZWN0aW9uCi0JY29ycmVzcG9uZGluZyB0byB0aGUgZ2VuZXJhdGVkIGxpbmtlciBzZWN0aW9uLgotCi1TYXQgSmFuIDIwIDA4OjM2OjEwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKEVMRl9NQUNISU5FX0FMVDEpOiBEZWZpbmUuCi0KLVRodSBKYW4gMTggMTg6MjU6MzQgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBjaGFuZ2VkIFRPQ0RFRk4gcmVsb2NzLgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHNwZWNpYWwgdmFsdWVzIGZvciBnY2MgYnVpbHQgZGxscy4KLQkoZHVtcF90b2MpOiBmaXggZGlhZ25vc2luZyBjb2RlIHRvIGlkZW50aWZ5IG91dC1vZi10b2MtYm91bmRzIGVudHJpZXMuCi0JQWxzbyBiZWdpbiB0aGUgdG9jIGF0IDQgYXMgYW4gZXllIGNhdGNoZXIgKCczMTMxMzEzMScgbWFya3MgdGhlIGZpcnN0Ci0JdG9jIGVudHJ5IGluIGFuIG9iamR1bXApIGZvciBub3cuCi0JKHBwY19kb19sYXN0LCBwcGNfZ2V0X2xhc3QpOiBOZXcgZnVuY3Rpb24gLSBuZWVkZWQgdG8gc2F2ZSBwcm9jZXNzaW5nCi0JdGhlIHRvYyBvd25lciB0byB0aGUgZW5kLgotCShwcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rKTogUmVtb3ZlZCBhbiBpbmNvcnJlY3QgaGFjayBmb3IgZG9pbmcgdGhlCi0JdG9jIG93bmVyIGxhc3QuCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogQWRkZWQgYSBuZXcgaGFjayB0byBrZWVwIHRoZQotCXRvYyBvd25lciBmcm9tIGJlaW5nIGRvbmUgdGlsbCBsYXN0LiBNdXN0IGRlZmluZSBQT1dFUlBDX0xFX1BDCi0JdG8gZW5hYmxlIGl0LgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IGFsaWdubWVudCBzZXR0aW5nIGZvciAuc3RhYgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogc2V0IHNlY3Rpb24gZmxhZ3MgZm9yIHN0YWIvc3RyCi0JdG8gSU5GTy4KLQkoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogUmVtb3ZlZCBhIG5vbi13b3JraW5nIGhhY2sgZm9yIGNvbXB1dGluZyB0aGUKLQlTaXplT2ZJbWFnZSBmb3IgUG93ZXJQQy4gSWdub3JlIHRoZSBzaXplIG9mIHRoZSAuanVuayBzZWN0aW9uLgotCi1UaHUgSmFuIDE4IDE3OjQyOjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29yZS5oOiBJbmNsdWRlIDxzaWduYWwuaD4gYmVmb3JlIDxzeXMvcHJvY2ZzLmg+LgotCi1XZWQgSmFuIDE3IDEyOjQwOjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY3B1LXBvd2VycGMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IENoYW5nZSBsYXN0IGVudHJ5IHRvIG5vdCBwb2ludAotCWJhY2sgdG8gZmlyc3QuCi0JKGJmZF9wb3dlcnBjX2FyY2gpOiBQb2ludCBhdCBmaXJzdCBlbnRyeSBpbiBhcmNoX2luZm9fc3RydWN0LgotCi1UdWUgSmFuIDE2IDE1OjEwOjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBEb24ndCBpbmNyZW1lbnQgZmlsZQotCW9mZnNldCBmb3IgYSBzZWdtZW50IHdoaWNoIGNvbnRhaW5zIG5vIGxvYWRhYmxlIHNlY3Rpb25zLgotCi1Nb24gSmFuIDE1IDE3OjQ2OjI3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYzogQWRkIG5ldyBQb3dlclBDIHJlbG9jYXRpb25zLgotCSoge2JmZC1pbjIsbGliYmZkfS5oOiBSZWdlbmVyYXRlLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBBZGQgbW9yZSBQUEMgcmVsb2NhdGlvbnMuCi0JKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBMb29rdXAgbmV3IHJlbG9jYXRpb25zLgotCi1Nb24gSmFuIDE1IDE0OjI5OjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoaG93dG9fdGFibGVfZXh0KTogRml4IFJFTE9DX0JBU0UxMCBhbmQgUkVMT0NfQkFTRTIyCi0JZW50cmllcy4KLQotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogRG9uJ3QgZmFpbCBhc3NlcnQgaWYKLSAgICAgICAgaW5mby0+c2hhcmVkLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBEb24ndCB0cnkgdG8gY2FjaGUKLQlpbmZvcm1hdGlvbiBpbiBzZWN0aW9ucyB0aGF0IGFyZSBub3Qgb3duZWQgYnkgYSBCRkQuICBGcm9tIFJpY2hhcmQKLQlIZW5kZXJzb24gPHJpY2hhcmRAYXRoZWlzdC50YW11LmVkdT4uCi0KLQkqIGVsZjMyLW1pcHMuYzogTnVtZXJvdXMgY2hhbmdlcyB0byBkeW5hbWljIGxpbmtpbmcgY29kZSwgbW9zdGx5Ci0JZnJvbSBLYXp1bW90byBLb2ppbWEgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPi4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFJlbW92ZSBzcGVjaWFsIGNoZWNrIGZvcgotCV9ybGRfbmV3X2ludGVyZmFjZS4KLQotCSogZWNvZmZzd2FwLmg6IEFkZCBwcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zLgotCi1TdW4gSmFuIDE0IDIxOjM2OjA4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfe3Vuc3VwcG9ydGVkLHN0ZH1fcmVsb2MpOiBSZW1vdmUgZnVuY3Rpb25zLgotCShwcGNfZWxmX2hvd3RvX3Jhdyk6IFJlbW92ZSBwcGNfZWxmX3t1bnN1cHBvcnRlZCxzdGR9X3JlbG9jCi0JcmVmZXJlbmNlcy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogIE5vIGxvbmdlciBhbGxvdyAuc2RhdGEvLnNic3Mgc2VjdGlvbnMKLQl0byBzYXRpc2Z5IGEgVE9DMTYgcmVsb2NhdGlvbi4gCVJld3JpdGUgdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbgotCXN1cHBvcnQuICBCZWdpbiBzdXBwb3J0IGZvciBSX1BQQ19TREF7Mix9UkVMLgotCi1TYXQgSmFuIDEzIDA5OjM2OjUyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb24gdG8KLQljcmVhdGUgdGhlIC5nb3QgYW5kIC5nb3QubmVnIHNlY3Rpb25zLgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENhbGwgaXQuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogQ2FsbCBpdC4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBTdXBwb3J0IC5nb3QubmVnLCBqdXN0IGxpa2UgLmdvdC4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBBZGQgZXJyb3IgbWVzc2FnZXMgZm9yIHJlbG9jYXRpb25zIHdlCi0JZG9uJ3QgeWV0IHN1cHBvcnQuICBEbyBub3QgaW5jbHVkZSBSX1BQQ19TREFSRUwxNiBsaWtlIGEgR09UCi0JcmVsb2NhdGlvbi4KLQotRnJpIEphbiAxMiAxNToyNzo1OSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBEZWZpbmUsIGFuZCBoYW5kbGUgdGhlIG5ldwotCXNlY3Rpb24gZmxhZ3MgZm9yIFYuNCBhbmQgZWFiaS4KLQotRnJpIEphbiAxMiAxMzo1OToxNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSWYgYSBzZWdtZW50Ci0JY29udGFpbnMgbm8gc2VjdGlvbnMsIGRvbid0IG1hcmsgaXQgYXMgcmVhZGFibGUuCi0KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogRGVjbGFyZS4KLQkqIGVsZmNvZGUuaCAoX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogRG9uJ3QgZGVjbGFyZS4KLQotCSogZWxmLmMgKF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEdW1wIGNvbnRlbnRzIG9mCi0JZHluYW1pYyBzZWN0aW9uLCBpZiB0aGVyZSBpcyBvbmUuCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfc2l6ZV9pbmZvKTogQWRkIHN3YXBfZHluX2luIGZpZWxkLgotCShiZmRfZWxmMzJfc3dhcF9keW5faW4pOiBDaGFuZ2UgdHlwZSBvZiBzZWNvbmQgcGFyYW1ldGVyIHRvIFBUUi4KLQkoYmZkX2VsZjY0X3N3YXBfZHluX2luKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9zd2FwX2R5bl9pbik6IENoYW5nZSB0eXBlIG9mIHNlY29uZCBwYXJhbWV0ZXIgdG8KLQlQVFIuCi0JKE5BTUUoX2JmZF9lbGYsc2l6ZV9pbmZvKSk6IEluaXRpYWxpemUgc3dhcF9keW5faW4gZmllbGQuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgY3JlYXRlIGEKLQlEVF9URVhUUkVMIGVudHJ5IGJlY2F1c2Ugb2YgLnJlbC5wbHQuICBGcm9tIE1hcnRpbiBQaXJrZXIKLQk8cGlya2VyQGVpdW5peC50dXdpZW4uYWMuYXQ+LgotCi1UaHUgSmFuIDExIDE3OjA2OjE0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2VjdGlvbi5jIChTRUNfe0VYQ0xVREUsU09SVF9FTlRSSUVTfSk6IE5ldyBzZWN0aW9uIGZsYWdzIGZvcgotCVBvd2VyUEMgVi40IGFuZCBlYWJpLgotIAkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQkqIGxpYmZkLmg6IFJlZ2VuZXJhdGUuCi0KLQkqIGVsZnh4LXRhcmdldC5oIChUQVJHRVRfe0JJRyxMSVRUTEV9X1NZTSk6IEFkZCBuZXcgZmxhZ3MuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogU3VwcG9ydCBTSFRfT1JERVJFRAotCXNlY3Rpb24gdHlwZSBhbmQgU0hGX0VYQ0xVREUgc2VjdGlvbiBmbGFnLCB0dXJuaW5nIHRoZW0gaW50byB0aGUKLQlhcHByb3ByaWF0ZSBiZmQgc2VjdGlvbiBmbGFnLgotCi1UaHUgSmFuIDExIDExOjIzOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBDcmVhdGUgdGhlIHNwZWNpYWwKLQlzZWN0aW9ucyBpZiB3ZSBzZWUgYSBEWU5BTUlDIG9iamVjdCwgaW4gY2FzZSB0aGF0IGlzIHRoZSBvbmx5Ci0JWENPRkYgaW5wdXQgb2JqZWN0IHdlIHNlZS4KLQotCSogZWxmMzItbWlwcy5jOiBFeHRlbnNpdmUgY2hhbmdlcyBmb3IgYSBzdGFydCBhdCBkeW5hbWljIGxpbmtpbmcKLQlzdXBwb3J0LCBmcm9tIEthenVtb3RvIEtvamltYSA8a2tvamltYUBpbmZvLmthbmFnYXdhLXUuYWMuanA+LgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIHR5cGVfY2hhbmdlX29rIGZpZWxkLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZQotCWVsZl9iYWNrZW5kX2NyZWF0ZV9wcm9ncmFtX2hlYWRlcnMgZmllbGQuICBBZGQKLQllbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyBhbmQKLQllbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAgZmllbGRzLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3R5cGVfY2hhbmdlX29rKTogRGVmaW5lIGlmIG5vdAotCWRlZmluZWQuCi0JKGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCk6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9jcmVhdGVfcHJvZ3JhbV9oZWFkZXJzKTogRG9uJ3QgZGVmaW5lLgotCShlbGZOTl9iZWQpOiBDaGFuZ2UgdG8gYWNjb3VudCBmb3IgZmllbGQgY2hhbmdlcy4KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQ2FsbCBuZXcKLQltb2RpZnlfc2VnbWVudF9tYXAgYmFja2VuZCBmdW5jdGlvbi4gIERvbid0IGNhbGwgb2xkCi0JY3JlYXRlX3Byb2dyYW1faGVhZGVycyBiYWNrZW5kIGZ1bmN0aW9uLgotCShnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IENhbGwgYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgcmF0aGVyCi0JdGhhbiBjcmVhdGVfcHJvZ3JhbV9oZWFkZXJzLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJbml0aWFsaXplCi0JdHlwZV9jaGFuZ2Vfb2sgZnJvbSBuZXcgYmFja2VuZCBmaWVsZC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IERvbid0IHdhcm4gaWYgX3JsZF9uZXdfaW50ZXJmYWNlIGlzCi0JZGVmaW5lZC4KLQkoZWxmX3JlbG9jX2xpbmtfb3JkZXIpOiBUcmVhdCBhIHJlbG9jIGFnYWluc3QgYSBkZWZpbmVkIHN5bWJvbCBhcwotCWEgcmVsb2MgYWdhaW5zdCB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbi4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgdGRhdGEgZmllbGQuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogUmVuYW1lIHBwY19mbGFnc19pbml0IGZpZWxkIHRvIGZsYWdzX2luaXQuCi0JKGVsZl9mbGFnc19pbml0KTogUmVuYW1lIGZyb20gZWxmX3BwY19mbGFnc19pbml0LgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MpOiBVc2UgZWxmX2ZsYWdzX2luaXQsIG5vdAotCWVsZl9wcGNfZmxhZ3NfaW5pdC4KLQkocHBjX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLW02OGsuYyAoaG93dG9fdGFibGUpOiBDaGFuZ2Ugc3JjX21hc2sgdG8gMCBmb3IgYWxsCi0JcmVsb2NhdGlvbiBlbnRyaWVzLgotCi1UdWUgSmFuICA5IDE1OjIyOjUzIDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IER1cmluZyBmaW5hbCBsaW5rLCBhbGxvdwotIAlvdXRwdXQgLmxpdGEgc2VjdGlvbiB0byBiZSBiaWdnZXIgdGhhbiA2NGsgYnkgYWRqdXN0aW5nIGdwIHZhbHVlCi0gCW9uIGEgcGVyLWlucHV0IHNlY3Rpb24gYmFzaXMuCi0JKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfdGRhdGEpOiBBZGQgaXNzdWVkX211bHRpcGxlX2dwX3dhcm5pbmcKLQlmaWVsZC4KLQkoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEpOiBBZGQgZ3AgZmllbGQuCi0KLVR1ZSBKYW4gIDkgMTI6MDA6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JSGFuZGxlIEFscGhhIEVDT0ZGIGNoYW5nZXMgaW4gT1NGLzEgMy4yLgotCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBnZXRfZWx0X2F0X2ZpbGVwb3MKLQlmaWVsZC4KLQkqIGNvZmYtYWxwaGEuYzogSW5jbHVkZSAiYW91dC9hci5oIi4KLQkoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3QgcmVxdWlyZSBhbgotCUFMUEhBX1JfSUdOT1JFIHJlbG9jIGFmdGVyIGFuIEFMUEhBX1JfR1BESVNQIHJlbG9jLCBzaW5jZSBPU0YvMQotCTMuMiBkb2Vzbid0IGdlbmVyYXRlIG9uZS4KLQkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShhbHBoYV9lY29mZl9zbHVycF9hcm1hcCk6IERlZmluZS4KLQkoYWxwaGFfZWNvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZS4KLQkoYWxwaGFfZWNvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX3RydW5jYXRlX2FybmFtZSk6IERlZmluZS4KLQkoYWxwaGFfZWNvZmZfd3JpdGVfYXJtYXApOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCk6IERlZmluZS4KLQkoYWxwaGFfZWNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkoQVJGWk1BRyk6IERlZmluZS4KLQkoYWxwaGFfZWNvZmZfcmVhZF9hcl9oZHIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9lY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9lY29mZl9nZXRfZWx0X2F0X2luZGV4KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBnZXRfZWx0X2F0X2ZpbGVwb3MgZmllbGQuCi0JKGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyk6IENoYW5nZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIGZyb20KLQlfYmZkX2Vjb2ZmIHRvIGFscGhhX2Vjb2ZmLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogVXNlIGdldF9lbHRfYXRfZmlsZXBvcwotCWZpZWxkIGZyb20gYmFja2VuZCBzdHJ1Y3R1cmUsIHJhdGhlciB0aGFuIGFsd2F5cyBjYWxsaW5nCi0JX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplCi0JZ2V0X2VsdF9hdF9maWxlcG9zIGZpZWxkLgotCSogYXJjaGl2ZS5jIChfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnKTogTmV3IGZ1bmN0aW9uLCBjb3BpZWQKLQlmcm9tIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkciB3aXRoIG1pbm9yIGNoYW5nZXMuCi0JKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcik6IFVzZSBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnLgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIGJmZC1pbi5oIChCRkRfSU5fTUVNT1JZKTogRGVmaW5lLgotCSogbGliYmZkLWluLmggKHN0cnVjdCBiZmRfaW5fbWVtb3J5KTogRGVmaW5lLgotCSogbGliYmZkLmMgKGJmZF9yZWFkKTogSGFuZGxlIEJGRF9JTl9NRU1PUlkgZmxhZy4KLQkoYmZkX2dldF9maWxlX3dpbmRvdyk6IERvbid0IHRyeSB0byBtYXAgYSBCRkRfSU5fTUVNT1JZIGZpbGUuCi0JKGJmZF93cml0ZSwgYmZkX3N0YXQpOiBBYm9ydCBpZiBCRkRfSU5fTUVNT1JZIGlzIHNldC4KLQkoYmZkX3RlbGwsIGJmZF9mbHVzaCwgYmZkX3NlZWspOiBIYW5kbGUgQkZEX0lOX01FTU9SWSBmbGFnLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQ2hhbmdlIGlvc3RyZWFtIGZpZWxkIGZyb20gY2hhciAqIHRvIFBUUi4KLQkoYmZkX2dldF9zaXplKTogSGFuZGxlIEJGRF9JTl9NRU1PUlkgZmxhZy4KLQkqIGNhY2hlLmMgKGJmZF9jYWNoZV9jbG9zZSk6IElnbm9yZSBCRkRfSU5fTUVNT1JZIGZpbGVzLgotCShiZmRfb3Blbl9maWxlKTogQ2FzdCB0byBQVFIsIG5vdCBjaGFyICosIHdoZW4gc2V0dGluZyBpb3N0cmVhbS4KLQkoYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIpOiBBYm9ydCBpZiBCRkRfSU5fTUVNT1JZIGlzIHNldC4KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6IENhc3QgdG8gUFRSLCBub3QgY2hhciAqLCB3aGVuIHNldHRpbmcKLQlpb3N0cmVhbS4KLQkoYmZkX29wZW5zdHJlYW1yKTogTGlrZXdpc2UuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IE9ubHkgZnN0YXQgaW9zdHJlYW0gaWYKLQlCRkRfSU5fTUVNT1JZIGlzIG5vdCBzZXQuCi0JKiByaXNjaXguYyAocmlzY2l4X3NvbWVfYW91dF9vYmplY3RfcCk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIF9iZmRfZ2V0X2VsdF9hdF9pbmRleCBmaWVsZC4KLQkoQkZEX0pVTVBfVEFCTEVfQVJDSElWRSk6IEFkZCBfZ2V0X2VsdF9hdF9pbmRleC4KLQkoYmZkX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKiBhcmNoaXZlLmMgKF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4KTogUmVuYW1lIGZyb20KLQliZmRfZ2V0X2VsdF9hdF9pbmRleC4gIENoYW5nZSBpbmRleCBwYXJhbWV0ZXIgZnJvbSBpbnQgdG8KLQlzeW1pbmRleC4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleCk6IERlY2xhcmUuCi0JKF9iZmRfbm9hcmNoaXZlX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKF9iZmRfYXJjaGl2ZV9ic2RfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkoX2JmZF9hcmNoaXZlX2NvZmZfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkqIGllZWUuYyAoaWVlZV9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCSogb2FzeXMuYyAob2FzeXNfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkqIHNvbS5jIChzb21fZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IERvbid0IHJlc3RyaWN0IGxpbmUKLQludW1iZXJzIHRvIHRoZSAudGV4dCBzZWN0aW9uLgotCi1Nb24gSmFuICA4IDE3OjAwOjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX2RlYnVnX3BhcnQpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4KLQlJZiB0aGVyZSBpcyBhIFNFQ19ERUJVR0dJTkcgc2VjdGlvbiwgZ2V0IHRoZSBjb250ZW50cyBvZiB0aGUgZGVidWcKLQlpbmZvcm1hdGlvbiBwYXJ0IGZyb20gaXQuCi0JKGllZWVfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTdG9yZSB0aGUgY29udGVudHMgb2YgYSBTRUNfREVCVUdHSU5HCi0Jc2VjdGlvbiBpbiBtZW1vcnkuCi0JKGllZWVfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgaWVlZV93cml0ZV9kZWJ1Z19wYXJ0IHJldHVybi4KLQotVGh1IEphbiAgNCAxNzoxMjozNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi1mcmVlYnNkKik6IEFkZCB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGkzODZmcmVlYnNkX3ZlYyk6IEFkZCB2ZWMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgaTM4NmZyZWVic2Quby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGkzODZmcmVlYnNkLmMuCi0JUmVidWlsZCBkZXBlbmRlbmNpZXMuLgotCSogZnJlZWJzZC5oOiBOZXcgZmlsZS4KLQkqIGkzODZmcmVlYnNkLmM6IE5ldyBmaWxlLgotCSogdGFyZ2V0cy5jIChpMzg2ZnJlZWJzZF92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBpMzg2ZnJlZWJzZF92ZWMuCi0JKiBpMzg2bGludXguYyAoU0VHTUVOVF9TSVpFKTogRGVmaW5lIGFzIFRBUkdFVF9QQUdFX1NJWkUKLQkqIGkzODZuZXRic2QuYyAoU0VHTUVOVF9TSVpFKTogIERlZmluZSBhcyBUQVJHRVRfUEFHRV9TSVpFCi0KLVRodSBKYW4gIDQgMTY6Mjc6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfZGVidWcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShpZWVlX29iamVjdF9wKTogQ2FsbCBpdC4KLQkoaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEpOiBTa2lwIGRlYnVnZ2luZyBzZWN0aW9ucy4KLQkoaWVlZV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoaWVlZV9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShpZWVlX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCShpZWVlX3dyaXRlX3NlY3Rpb25fcGFydCk6IExpa2V3aXNlLgotCShpZWVlX3dyaXRlX2RlYnVnX3BhcnQpOiBMaWtld2lzZS4KLQkoaWVlZV93cml0ZV9kYXRhX3BhcnQpOiBMaWtld2lzZS4KLQkoaW5pdF9mb3Jfb3V0cHV0KTogTGlrZXdpc2UuCi0KLVdlZCBKYW4gIDMgMTk6NDI6NDcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IE1ha2UgQEdPVCByZWxvY2F0aW9ucwotCXdvcmsuCi0JKHBwY19lbGZfaG93dG9fcmF3KTogSnVzdCB1c2UgYmZkX2VsZl9nZW5lcmljX3JlbG9jIGZvciBhbGwgaG93dG8KLQlyZWxvY3MsIHNpbmNlIHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBoYW5kbGVzIHRoZSBsaW5rZXIgY2FzZS4KLQkocHBjX2VsZl97YWRkcjE2X2hhLGdvdDE2LHRvYzE2LGJydGFrZW59X3JlbG9jKTogRGVsZXRlLCBubyBsb25nZXIKLQl1c2VkLgotCShwcGNfZWxmX3thZGRyMTZfaGEsZ290MTYsdG9jMTYsYnJ0YWtlbn1faW5uZXIpOiBNZXJnZSB0aGVzZSBpbnRvCi0JcHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIHNpbmNlIHRoYXQgaXMgbm93IHRoZSBvbmx5IGNhbGxlci4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGl0dG8uCi0KLVdlZCBKYW4gIDMgMTU6MTE6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIHdlIGRvbid0IGtub3cgdGhlCi0Jc2VjdGlvbiBvZiB0aGUgZW50cnkgcG9pbnQgZm9yIGFuIFhDT0ZGIGV4ZWN1dGFibGUsIGFsd2F5cyBzZXQgdGhlCi0JZW50cnkgYWRkcmVzcyB0byAtMS4KLQotVHVlIEphbiAgMiAxNDoxNzoxNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBBZGQgc3VwcG9ydCBmb3Igbm90ZSBzZWN0aW9ucy4KLQotVHVlIEphbiAgMiAxMzoxMDoyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oIChzdHJ1Y3QgX3N5bWJvbF9pbmZvKTogQWRkIHN0YWJfdHlwZSBmaWVsZC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxnZXRfc3ltYm9sX2luZm8pKTogU2V0IHN0YWJfdHlwZS4KLQotCSogZWxmMzItcHBjLmM6IFJlbW92ZSB0cmFpbGluZyBuZXdsaW5lIGZyb20gY2FsbHMgdG8KLSAgICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyLgotCShwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBPbmx5IHdhcm4gYWJvdXQgZW5kaWFubmVzcwotCWRpZmZlcmVuY2UgaWYgdGFyZ2V0IGVuZGlhbm5lc3MgaXMga25vd24uCi0KLUZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTQ5NQotDAotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogY2hhbmdlLWxvZwotbGVmdC1tYXJnaW46IDgKLWZpbGwtY29sdW1uOiA3NAotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvYmZkL01ha2VmaWxlLmFtIGIvYmZkL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTU1MzExLi4wMDAwMDAwCi0tLSBhL2JmZC9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjUgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLUlOQ0RJUiA9ICQoc3JjZGlyKS8uLi9pbmNsdWRlCi1DU0VBUkNIID0gLUkuIC1JJChzcmNkaXIpIC1JJChJTkNESVIpCi1ERVAgPSBta2RlcAotCi1TVUJESVJTID0gZG9jIHBvCi0KLWRvY2RpciA9IGRvYwotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJiZmQubGEKLQotIyBiZmQuaCBnb2VzIGhlcmUsIGZvciBub3cKLUJGRF9IID0gYmZkLmgKLQotIyBKaW0gS2luZ2RvbiBub3RlczoKLSMgV3JpdGluZyBTLXJlY29yZHMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFsbCAob3IgYXQgbGVhc3QgbW9zdCkKLSMgKi0qLWNvZmYsICotKi1hb3V0LCBldGMuLCBjb25maWd1cmF0aW9ucywgYmVjYXVzZSBwZW9wbGUgd2lsbCB3YW50IHRvCi0jIGJlIGFibGUgdG8gdXNlIG9iamNvcHkgdG8gY3JlYXRlIFMtcmVjb3Jkcy4gIChTLXJlY29yZHMgYXJlIG5vdCB1c2VmdWwKLSMgZm9yIHRoZSBkZWJ1Z2dlciwgc28gaWYgeW91IGFyZSBkb3dubG9hZGluZyB0aGluZ3MgYXMgUy1yZWNvcmRzIHlvdQotIyBuZWVkIHR3byBjb3BpZXMgb2YgdGhlIGV4ZWN1dGFibGUsIG9uZSB0byBkb3dubG9hZCBhbmQgb25lIGZvciB0aGUKLSMgZGVidWdnZXIpLgotQkZEX0xJQlMgPSBcCi0JYXJjaGl2ZS5sbyBhcmNodXJlcy5sbyBiZmQubG8gY2FjaGUubG8gY29mZmdlbi5sbyBjb3JlZmlsZS5sbyBcCi0JZm9ybWF0LmxvIGluaXQubG8gbGliYmZkLmxvIG9wbmNscy5sbyByZWxvYy5sbyBcCi0Jc2VjdGlvbi5sbyBzeW1zLmxvIHRhcmdldHMubG8gaGFzaC5sbyBsaW5rZXIubG8gXAotCXNyZWMubG8gYmluYXJ5LmxvIHRla2hleC5sbyBpaGV4LmxvIHN0YWJzLmxvIHN0YWItc3ltcy5sbwotCi1CRkRfTElCU19DRklMRVMgPSBcCi0JYXJjaGl2ZS5jIGFyY2h1cmVzLmMgYmZkLmMgY2FjaGUuYyBjb2ZmZ2VuLmMgY29yZWZpbGUuYyBcCi0JZm9ybWF0LmMgaW5pdC5jIGxpYmJmZC5jIG9wbmNscy5jIHJlbG9jLmMgXAotCXNlY3Rpb24uYyBzeW1zLmMgdGFyZ2V0cy5jIGhhc2guYyBsaW5rZXIuYyBcCi0Jc3JlYy5jIGJpbmFyeS5jIHRla2hleC5jIGloZXguYyBzdGFicy5jIHN0YWItc3ltcy5jCi0KLSMgVGhpcyBsaXN0IGlzIGFscGhhYmV0aXplZCB0byBtYWtlIGl0IGVhc2llciB0byBrZWVwIGluIHN5bmMKLSMgd2l0aCB0aGUgZGVjbHMgYW5kIGluaXRpYWxpemVyIGluIGFyY2h1cmVzLmMuCi1BTExfTUFDSElORVMgPSBcCi0JY3B1LWEyOWsubG8gXAotCWNwdS1hbHBoYS5sbyBcCi0JY3B1LWFyYy5sbyBcCi0JY3B1LWFybS5sbyBcCi0JY3B1LWQxMHYubG8gXAotCWNwdS1kMzB2LmxvIFwKLQljcHUtZnIzMC5sbyBcCi0JY3B1LWg4MzAwLmxvIFwKLQljcHUtaDg1MDAubG8gXAotCWNwdS1ocHBhLmxvIFwKLQljcHUtaTM4Ni5sbyBcCi0JY3B1LWk4NjAubG8gXAotCWNwdS1pOTYwLmxvIFwKLQljcHUtbTMyci5sbyBcCi0JY3B1LW02OGsubG8gXAotCWNwdS1tODhrLmxvIFwKLQljcHUtbTEwMjAwLmxvIFwKLQljcHUtbTEwMzAwLmxvIFwKLQljcHUtbWNvcmUubG8gXAotCWNwdS1taXBzLmxvIFwKLQljcHUtbnMzMmsubG8gXAotCWNwdS1wb3dlcnBjLmxvIFwKLQljcHUtcnM2MDAwLmxvIFwKLQljcHUtc2gubG8gXAotCWNwdS1zcGFyYy5sbyBcCi0JY3B1LXRpYzMwLmxvIFwKLQljcHUtdGljODAubG8gXAotCWNwdS12ODUwLmxvIFwKLQljcHUtdmF4LmxvIFwKLQljcHUtd2UzMmsubG8gXAotCWNwdS13NjUubG8gXAotCWNwdS16OGsubG8KLQotQUxMX01BQ0hJTkVTX0NGSUxFUyA9IFwKLQljcHUtYTI5ay5jIFwKLQljcHUtYWxwaGEuYyBcCi0JY3B1LWFyYy5jIFwKLQljcHUtYXJtLmMgXAotCWNwdS1kMTB2LmMgXAotCWNwdS1kMzB2LmMgXAotCWNwdS1mcjMwLmMgXAotCWNwdS1oODMwMC5jIFwKLQljcHUtaDg1MDAuYyBcCi0JY3B1LWhwcGEuYyBcCi0JY3B1LWkzODYuYyBcCi0JY3B1LWk4NjAuYyBcCi0JY3B1LWk5NjAuYyBcCi0JY3B1LW0zMnIuYyBcCi0JY3B1LW02OGsuYyBcCi0JY3B1LW04OGsuYyBcCi0JY3B1LW0xMDIwMC5jIFwKLQljcHUtbTEwMzAwLmMgXAotCWNwdS1tY29yZS5jIFwKLQljcHUtbWlwcy5jIFwKLQljcHUtbnMzMmsuYyBcCi0JY3B1LXBvd2VycGMuYyBcCi0JY3B1LXJzNjAwMC5jIFwKLQljcHUtc2guYyBcCi0JY3B1LXNwYXJjLmMgXAotCWNwdS10aWMzMC5jIFwKLQljcHUtdGljODAuYyBcCi0JY3B1LXY4NTAuYyBcCi0JY3B1LXZheC5jIFwKLQljcHUtd2UzMmsuYyBcCi0JY3B1LXc2NS5jIFwKLQljcHUtejhrLmMKLQotIyBUaGUgLm8gZmlsZXMgbmVlZGVkIGJ5IGFsbCBvZiB0aGUgMzIgYml0IHZlY3RvcnMgdGhhdCBhcmUgY29uZmlndXJlZCBpbnRvCi0jIHRhcmdldF92ZWN0b3IgaW4gdGFyZ2V0cy5jIGlmIGNvbmZpZ3VyZWQgd2l0aCAtLWVuYWJsZS10YXJnZXRzPWFsbC4KLUJGRDMyX0JBQ0tFTkRTID0gXAotCWFvdXQtYWRvYmUubG8gXAotCWFvdXQtYXJtLmxvIFwKLQlhb3V0LW5zMzJrLmxvIFwKLQlhb3V0LXNwYXJjbGUubG8gXAotCWFvdXQtdGljMzAubG8gXAotCWFvdXQwLmxvIFwKLQlhb3V0MzIubG8gXAotCWJvdXQubG8gXAotCWNmLWkzODZseW54LmxvIFwKLQljZi1tNjhrbHlueC5sbyBcCi0JY2Ytc3BhcmNseW54LmxvIFwKLQljb2ZmLWEyOWsubG8gXAotCWNvZmYtYXBvbGxvLmxvIFwKLQljb2ZmLWFybS5sbyBcCi0JY29mZi1hdXgubG8gXAotCWNvZmYtaDgzMDAubG8gXAotCWNvZmYtaDg1MDAubG8gXAotCWNvZmYtaTM4Ni5sbyBcCi0JY29mZi1nbzMyLmxvIFwKLQljb2ZmLWk4NjAubG8gXAotCWNvZmYtaTk2MC5sbyBcCi0JY29mZi1tNjhrLmxvIFwKLQljb2ZmLW04OGsubG8gXAotCWNvZmYtbWlwcy5sbyBcCi0JY29mZi1wbWFjLmxvIFwKLQljb2ZmLXJzNjAwMC5sbyBcCi0JY29mZi1zaC5sbyBcCi0JY29mZi1zcGFyYy5sbyBcCi0JY29mZi1zdGdvMzIubG8gXAotCWNvZmYtc3ZtNjhrLmxvIFwKLQljb2ZmLXRpYzMwLmxvIFwKLQljb2ZmLXRpYzgwLmxvIFwKLQljb2ZmLXU2OGsubG8gXAotCWNvZmYtd2UzMmsubG8gXAotCWNvZmYtdzY1LmxvIFwKLQljb2ZmLXo4ay5sbyBcCi0JY29mZmxpbmsubG8gXAotCWR3YXJmMi5sbyBcCi0JZWNvZmYubG8gXAotCWVjb2ZmbGluay5sbyBcCi0JZWxmLmxvIFwKLQllbGYzMi1hcmMubG8gXAotCWVsZmFybS1vYWJpLmxvIFwKLQllbGZhcm0tbmFiaS5sbyBcCi0JZWxmMzItZDEwdi5sbyBcCi0JZWxmMzItZDMwdi5sbyBcCi0JZWxmMzItZnIzMC5sbyBcCi0JZWxmMzItZ2VuLmxvIFwKLQllbGYzMi1ocHBhLmxvIFwKLQllbGYzMi1pMzg2LmxvIFwKLQllbGYzMi1pODYwLmxvIFwKLQllbGYzMi1tMzJyLmxvIFwKLQllbGYzMi1tNjhrLmxvIFwKLQllbGYzMi1tODhrLmxvIFwKLQllbGYtbTEwMjAwLmxvIFwKLQllbGYtbTEwMzAwLmxvIFwKLQllbGYzMi1tY29yZS5sbyBcCi0JZWxmMzItbWlwcy5sbyBcCi0JZWxmMzItcHBjLmxvIFwKLQllbGYzMi1zaC5sbyBcCi0JZWxmMzItc3BhcmMubG8gXAotCWVsZjMyLXY4NTAubG8gXAotCWVsZjMyLmxvIFwKLQllbGZsaW5rLmxvIFwKLQlocDMwMGJzZC5sbyBcCi0JaHAzMDBocHV4LmxvIFwKLQlzb20ubG8gXAotCWkzODZhb3V0LmxvIFwKLQlpMzg2YnNkLmxvIFwKLQlpMzg2ZHluaXgubG8gXAotCWkzODZmcmVlYnNkLmxvIFwKLQlpMzg2bGludXgubG8gXAotCWkzODZseW54LmxvIFwKLQlpMzg2bXNkb3MubG8gXAotCWkzODZuZXRic2QubG8gXAotCWkzODZtYWNoMy5sbyBcCi0JaTM4Nm9zOWsubG8gXAotCWllZWUubG8gXAotCW02OGs0a25ldGJzZC5sbyBcCi0JbTY4a2xpbnV4LmxvIFwKLQltNjhrbHlueC5sbyBcCi0JbTY4a25ldGJzZC5sbyBcCi0JbTg4a21hY2gzLmxvIFwKLQltaXBzYnNkLmxvIFwKLQluZXdzb3MzLmxvIFwKLQlubG0ubG8gXAotCW5sbTMyLWkzODYubG8gXAotCW5sbTMyLXNwYXJjLmxvIFwKLQlubG0zMi1wcGMubG8gXAotCW5sbTMyLmxvIFwKLQluczMya25ldGJzZC5sbyBcCi0Jb2FzeXMubG8gXAotCXBjNTMyLW1hY2gubG8gXAotCXBlLWFybS5sbyBcCi0JcGVpLWFybS5sbyBcCi0JcGUtaTM4Ni5sbyBcCi0JcGVpLWkzODYubG8gXAotCXBlLW1jb3JlLmxvIFwKLQlwZWktbWNvcmUubG8gXAotCXBlLXBwYy5sbyBcCi0JcGVpLXBwYy5sbyBcCi0JcHBjYm9vdC5sbyBcCi0JcmVsb2MxNi5sbyBcCi0JcmlzY2l4LmxvIFwKLQlzcGFyY2xpbnV4LmxvIFwKLQlzcGFyY2x5bngubG8gXAotCXNwYXJjbmV0YnNkLmxvIFwKLQlzdW5vcy5sbyBcCi0JdmF4bmV0YnNkLmxvIFwKLQl2ZXJzYWRvcy5sbyBcCi0Jdm1zLmxvIFwKLQl2bXMtZ3NkLmxvIFwKLQl2bXMtaGRyLmxvIFwKLQl2bXMtbWlzYy5sbyBcCi0Jdm1zLXRpci5sbyBcCi0JeGNvZmZsaW5rLmxvCi0KLUJGRDMyX0JBQ0tFTkRTX0NGSUxFUyA9IFwKLQlhb3V0LWFkb2JlLmMgXAotCWFvdXQtYXJtLmMgXAotCWFvdXQtbnMzMmsuYyBcCi0JYW91dC1zcGFyY2xlLmMgXAotCWFvdXQtdGljMzAuYyBcCi0JYW91dDAuYyBcCi0JYW91dDMyLmMgXAotCWJvdXQuYyBcCi0JY2YtaTM4Nmx5bnguYyBcCi0JY2YtbTY4a2x5bnguYyBcCi0JY2Ytc3BhcmNseW54LmMgXAotCWNvZmYtYTI5ay5jIFwKLQljb2ZmLWFwb2xsby5jIFwKLQljb2ZmLWFybS5jIFwKLQljb2ZmLWF1eC5jIFwKLQljb2ZmLWg4MzAwLmMgXAotCWNvZmYtaDg1MDAuYyBcCi0JY29mZi1pMzg2LmMgXAotCWNvZmYtaTg2MC5jIFwKLQljb2ZmLWdvMzIuYyBcCi0JY29mZi1pOTYwLmMgXAotCWNvZmYtbTY4ay5jIFwKLQljb2ZmLW04OGsuYyBcCi0JY29mZi1taXBzLmMgXAotCWNvZmYtcG1hYy5jIFwKLQljb2ZmLXJzNjAwMC5jIFwKLQljb2ZmLXNoLmMgXAotCWNvZmYtc3BhcmMuYyBcCi0JY29mZi1zdGdvMzIuYyBcCi0JY29mZi1zdm02OGsuYyBcCi0JY29mZi10aWMzMC5jIFwKLQljb2ZmLXRpYzgwLmMgXAotCWNvZmYtdTY4ay5jIFwKLQljb2ZmLXdlMzJrLmMgXAotCWNvZmYtdzY1LmMgXAotCWNvZmYtejhrLmMgXAotCWNvZmZsaW5rLmMgXAotCWR3YXJmMi5jIFwKLQllY29mZi5jIFwKLQllY29mZmxpbmsuYyBcCi0JZWxmLmMgXAotCWVsZjMyLWFyYy5jIFwKLQllbGZhcm0tb2FiaS5jIFwKLQllbGZhcm0tbmFiaS5jIFwKLQllbGYzMi1kMTB2LmMgXAotCWVsZjMyLWQzMHYuYyBcCi0JZWxmMzItZnIzMC5jIFwKLQllbGYzMi1nZW4uYyBcCi0JZWxmMzItaHBwYS5jIFwKLQllbGYzMi1pMzg2LmMgXAotCWVsZjMyLWk4NjAuYyBcCi0JZWxmMzItbTMyci5jIFwKLQllbGYzMi1tNjhrLmMgXAotCWVsZjMyLW04OGsuYyBcCi0JZWxmLW0xMDIwMC5jIFwKLQllbGYtbTEwMzAwLmMgXAotCWVsZjMyLW1jb3JlLmMgXAotCWVsZjMyLW1pcHMuYyBcCi0JZWxmMzItcHBjLmMgXAotCWVsZjMyLXNoLmMgXAotCWVsZjMyLXNwYXJjLmMgXAotCWVsZjMyLXY4NTAuYyBcCi0JZWxmMzIuYyBcCi0JZWxmbGluay5jIFwKLQlocDMwMGJzZC5jIFwKLQlocDMwMGhwdXguYyBcCi0Jc29tLmMgXAotCWkzODZhb3V0LmMgXAotCWkzODZic2QuYyBcCi0JaTM4NmR5bml4LmMgXAotCWkzODZmcmVlYnNkLmMgXAotCWkzODZsaW51eC5jIFwKLQlpMzg2bHlueC5jIFwKLQlpMzg2bXNkb3MuYyBcCi0JaTM4Nm5ldGJzZC5jIFwKLQlpMzg2bWFjaDMuYyBcCi0JaTM4Nm9zOWsuYyBcCi0JaWVlZS5jIFwKLQltNjhrNGtuZXRic2QuYyBcCi0JbTY4a2xpbnV4LmMgXAotCW02OGtseW54LmMgXAotCW02OGtuZXRic2QuYyBcCi0JbTg4a21hY2gzLmMgXAotCW1pcHNic2QuYyBcCi0JbmV3c29zMy5jIFwKLQlubG0uYyBcCi0JbmxtMzItaTM4Ni5jIFwKLQlubG0zMi1zcGFyYy5jIFwKLQlubG0zMi1wcGMuYyBcCi0JbmxtMzIuYyBcCi0JbnMzMmtuZXRic2QuYyBcCi0Jb2FzeXMuYyBcCi0JcGM1MzItbWFjaC5jIFwKLQlwZS1hcm0uYyBcCi0JcGVpLWFybS5jIFwKLQlwZS1pMzg2LmMgXAotCXBlaS1pMzg2LmMgXAotCXBlLW1jb3JlLmMgXAotCXBlaS1tY29yZS5jIFwKLQlwZS1wcGMuYyBcCi0JcGVpLXBwYy5jIFwKLQlwcGNib290LmMgXAotCXJlbG9jMTYuYyBcCi0JcmlzY2l4LmMgXAotCXNwYXJjbGludXguYyBcCi0Jc3BhcmNseW54LmMgXAotCXNwYXJjbmV0YnNkLmMgXAotCXN1bm9zLmMgXAotCXZheG5ldGJzZC5jIFwKLQl2ZXJzYWRvcy5jIFwKLQl2bXMuYyBcCi0Jdm1zLWdzZC5jIFwKLQl2bXMtaGRyLmMgXAotCXZtcy1taXNjLmMgXAotCXZtcy10aXIuYyBcCi0JeGNvZmZsaW5rLmMKLQotIyBUaGUgLm8gZmlsZXMgbmVlZGVkIGJ5IGFsbCBvZiB0aGUgNjQgYml0IHZlY3RvcnMgdGhhdCBhcmUgY29uZmlndXJlZCBpbnRvCi0jIHRhcmdldF92ZWN0b3IgaW4gdGFyZ2V0cy5jIGlmIGNvbmZpZ3VyZWQgd2l0aCAtLWVuYWJsZS10YXJnZXRzPWFsbAotIyBhbmQgLS1lbmFibGUtNjQtYml0LWJmZC4KLUJGRDY0X0JBQ0tFTkRTID0gXAotCWFvdXQ2NC5sbyBcCi0JY29mZi1hbHBoYS5sbyBcCi0JZGVtbzY0LmxvIFwKLQllbGY2NC1hbHBoYS5sbyBcCi0JZWxmNjQtZ2VuLmxvIFwKLQllbGY2NC1taXBzLmxvIFwKLQllbGY2NC1zcGFyYy5sbyBcCi0JZWxmNjQubG8gXAotCW5sbTMyLWFscGhhLmxvIFwKLQlubG02NC5sbwotCi1CRkQ2NF9CQUNLRU5EU19DRklMRVMgPSBcCi0JYW91dDY0LmMgXAotCWNvZmYtYWxwaGEuYyBcCi0JZGVtbzY0LmMgXAotCWVsZjY0LWFscGhhLmMgXAotCWVsZjY0LWdlbi5jIFwKLQllbGY2NC1taXBzLmMgXAotCWVsZjY0LXNwYXJjLmMgXAotCWVsZjY0LmMgXAotCW5sbTMyLWFscGhhLmMgXAotCW5sbTY0LmMKLQotT1BUSU9OQUxfQkFDS0VORFMgPSBcCi0JYWl4Mzg2LWNvcmUubG8gXAotCWhwdXgtY29yZS5sbyBcCi0JaXJpeC1jb3JlLmxvIFwKLQlseW54LWNvcmUubG8gXAotCW9zZi1jb3JlLmxvIFwKLQlzY281LWNvcmUubG8gXAotCXRyYWQtY29yZS5sbyBcCi0JY2lzY28tY29yZS5sbwotCi1PUFRJT05BTF9CQUNLRU5EU19DRklMRVMgPSBcCi0JYWl4Mzg2LWNvcmUuYyBcCi0JaHB1eC1jb3JlLmMgXAotCWlyaXgtY29yZS5jIFwKLQlseW54LWNvcmUuYyBcCi0Jb3NmLWNvcmUuYyBcCi0Jc2NvNS1jb3JlLmMgXAotCXRyYWQtY29yZS5jIFwKLQljaXNjby1jb3JlLmMKLQotIyBUaGVzZSBhcmUgZGVmaW5lZCBieSBjb25maWd1cmUuaW46Ci1XT1JEU0laRSA9IEB3b3Jkc2l6ZUAKLUFMTF9CQUNLRU5EUyA9IEBhbGxfYmFja2VuZHNACi1CRkRfQkFDS0VORFMgPSBAYmZkX2JhY2tlbmRzQAotQkZEX01BQ0hJTkVTID0gQGJmZF9tYWNoaW5lc0AKLVRERUZBVUxUUyA9IEB0ZGVmYXVsdHNACi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSBASERFRklORVNAIEBDT1JFRkxBR0AgQFRERUZJTkVTQCAkKENTRUFSQ0gpICQoQ1NXSVRDSEVTKSAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bAotCi0jIEMgc291cmNlIGZpbGVzIHRoYXQgY29ycmVzcG9uZCB0byAubydzLgotQ0ZJTEVTID0gXAotCSQoQkZEX0xJQlNfQ0ZJTEVTKSBcCi0JJChBTExfTUFDSElORVNfQ0ZJTEVTKSBcCi0JJChCRkQzMl9CQUNLRU5EU19DRklMRVMpIFwKLQkkKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUykgXAotCSQoT1BUSU9OQUxfQkFDS0VORFNfQ0ZJTEVTKQotCi0jIyBUaGlzIGlzIGEgbGlzdCBvZiBhbGwgLmggZmlsZXMgd2hpY2ggYXJlIGluIHRoZSBzb3VyY2UgdHJlZS4KLVNPVVJDRV9IRklMRVMgPSBcCi0JYW91dC10YXJnZXQuaCBhb3V0ZjEuaCBhb3V0eC5oIGNvZmZjb2RlLmggY29mZnN3YXAuaCBcCi0JZWNvZmZzd2FwLmggZWxmMzItaHBwYS5oIFwKLQllbGZjb2RlLmggZ2VubGluay5oIGdvMzJzdHViLmggaHBwYV9zdHVicy5oIGxpYmFvdXQuaCBcCi0JbGliYmZkLmggbGliY29mZi5oIGxpYmVjb2ZmLmggZWxmLWJmZC5oIGxpYmhwcGEuaCBsaWJpZWVlLmggXAotCWxpYm5sbS5oIGxpYm9hc3lzLmggbmV0YnNkLmggbmxtLXRhcmdldC5oIG5sbWNvZGUuaCBuczMyay5oIFwKLQlzb20uaCB2bXMuaAotCi1IRklMRVMgPSBcCi0JZWxmMzItdGFyZ2V0LmggZWxmNjQtdGFyZ2V0LmggdGFyZ21hdGNoLmggXAotCSQoU09VUkNFX0hGSUxFUykKLQotUE9URklMRVMgPSAkKENGSUxFUykgJChTT1VSQ0VfSEZJTEVTKQotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1kaXN0c3R1ZmY6IGluZm8KLQotIyBWYXJpb3VzIGtpbmRzIG9mIC5vIGZpbGVzIHRvIHB1dCBpbiBsaWJiZmQuYToKLSMgQkZEX0JBQ0tFTkRTCVJvdXRpbmVzIHRoZSBjb25maWd1cmVkIHRhcmdldHMgbmVlZC4KLSMgQkZEX01BQ0hJTkVTCUFyY2hpdGVjdHVyZS1zcGVjaWZpYyByb3V0aW5lcyB0aGUgY29uZmlndXJlZCB0YXJnZXRzIG5lZWQuCi0jIENPUkVGSUxFCUNvcmUgZmlsZSByb3V0aW5lcyBmb3IgYSBuYXRpdmUgY29uZmlndXJhdGlvbgotT0ZJTEVTID0gJChCRkRfQkFDS0VORFMpICQoQkZEX01BQ0hJTkVTKSBAQ09SRUZJTEVACi0KLXN0YW1wLW9maWxlczogTWFrZWZpbGUKLQlybSAtZiB0b2ZpbGVzCi0JZj0iIjsgXAotCWZvciBpIGluICQoT0ZJTEVTKSA7IGRvIFwKLQkgIGNhc2UgIiAkJGYgIiBpbiBcCi0JICAgICoiICQkaSAiKikgOzsgXAotCSAgICAqKSBmPSIkJGYgJCRpIiA7OyBcCi0JICBlc2FjIDsgXAotCWRvbmUgOyBcCi0JZWNobyAkJGYgPiB0b2ZpbGVzCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRvZmlsZXMgb2ZpbGVzCi0JdG91Y2ggc3RhbXAtb2ZpbGVzCi0KLW9maWxlczogc3RhbXAtb2ZpbGVzIDsgQHRydWUKLQotbGliYmZkX2xhX1NPVVJDRVMgPSAkKEJGRF9MSUJTX0NGSUxFUykKLWxpYmJmZF9sYV9ERVBFTkRFTkNJRVMgPSAkKE9GSUxFUykgb2ZpbGVzCi1saWJiZmRfbGFfTElCQUREID0gYGNhdCBvZmlsZXNgIEBXSU4zMkxJQkFEREAKLWxpYmJmZF9sYV9MREZMQUdTID0gLXJlbGVhc2UgJChWRVJTSU9OKSBAV0lOMzJMREZMQUdTQAotCi0jIGxpYnRvb2wgd2lsbCBidWlsZCAubGlicy9saWJiZmQuYS4gIFdlIGNyZWF0ZSBsaWJiZmQuYSBpbiB0aGUgYnVpbGQKLSMgZGlyZWN0b3J5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb252ZXJ0IGFsbCB0aGUgcHJvZ3JhbXMgdGhhdCB1c2UKLSMgbGliYmZkLmEgc2ltdWx0YW5lb3VzbHkuICBUaGlzIGlzIGEgaGFjayB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZCBpZgotIyBldmVyeXRoaW5nIGVsc2Ugc3RhcnRzIHVzaW5nIGxpYnRvb2wuICBGSVhNRS4KLQotbm9pbnN0X0xJQlJBUklFUyA9IGxpYmJmZC5hCi1saWJiZmRfYV9TT1VSQ0VTID0KLQotc3RhbXAtbGliOiBsaWJiZmQubGEKLQlpZiBbIC1mIC5saWJzL2xpYmJmZC5hIF07IHRoZW4gXAotCSAgY3AgLmxpYnMvbGliYmZkLmEgbGliYmZkLnRtcDsgXAotCSAgJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC50bXAgbGliYmZkLmE7IFwKLQllbHNlIHRydWU7IGZpCi0JdG91Y2ggc3RhbXAtbGliCi0KLWxpYmJmZC5hOiBzdGFtcC1saWIgOyBAdHJ1ZQotCi0jIFRoaXMgZmlsZSBob2xkcyBhbiBhcnJheSBhc3NvY2lhdGluZyBjb25maWd1cmF0aW9uIHRyaXBsZXRzIGFuZAotIyB2ZWN0b3IgbmFtZXMuICBJdCBpcyBidWlsdCBmcm9tIGNvbmZpZy5iZmQuICBJdCBpcyBub3QgY29tcGlsZWQgYnkKLSMgaXRzZWxmLCBidXQgaXMgaW5jbHVkZWQgYnkgdGFyZ2V0cy5jLgotdGFyZ21hdGNoLmg6IGNvbmZpZy5iZmQgdGFyZ21hdGNoLnNlZAotCXJtIC1mIHRhcmdtYXRjaC5oCi0Jc2VkIC1mICQoc3JjZGlyKS90YXJnbWF0Y2guc2VkIDwgJChzcmNkaXIpL2NvbmZpZy5iZmQgPiB0YXJnbWF0Y2gubmV3Ci0JbXYgLWYgdGFyZ21hdGNoLm5ldyB0YXJnbWF0Y2guaAotCi0jIFdoZW4gY29tcGlsaW5nIGFyY2h1cmVzLmMgYW5kIHRhcmdldHMuYywgc3VwcGx5IHRoZSBkZWZhdWx0IHRhcmdldAotIyBpbmZvIGZyb20gY29uZmlndXJlLgotCi10YXJnZXRzLmxvOiB0YXJnZXRzLmMgY29uZmlnLnN0YXR1cwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkKFRERUZBVUxUUykgJChzcmNkaXIpL3RhcmdldHMuYwotCi1hcmNodXJlcy5sbzogYXJjaHVyZXMuYyBjb25maWcuc3RhdHVzCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQoVERFRkFVTFRTKSAkKHNyY2RpcikvYXJjaHVyZXMuYwotCi1lbGYzMi10YXJnZXQuaCA6IGVsZnh4LXRhcmdldC5oCi0Jcm0gLWYgZWxmMzItdGFyZ2V0LmgKLQlzZWQgLWUgcy9OTi8zMi9nIDwgJChzcmNkaXIpL2VsZnh4LXRhcmdldC5oID4gZWxmMzItdGFyZ2V0Lm5ldwotCW12IC1mIGVsZjMyLXRhcmdldC5uZXcgZWxmMzItdGFyZ2V0LmgKLQotZWxmNjQtdGFyZ2V0LmggOiBlbGZ4eC10YXJnZXQuaAotCXJtIC1mIGVsZjY0LXRhcmdldC5oCi0Jc2VkIC1lIHMvTk4vNjQvZyA8ICQoc3JjZGlyKS9lbGZ4eC10YXJnZXQuaCA+IGVsZjY0LXRhcmdldC5uZXcKLQltdiAtZiBlbGY2NC10YXJnZXQubmV3IGVsZjY0LXRhcmdldC5oCi0KLUJGRF9IX0RFUFM9ICQoSU5DRElSKS9hbnNpZGVjbC5oCi1MT0NBTF9IX0RFUFM9IGxpYmJmZC5oIHN5c2RlcC5oIGNvbmZpZy5oCi0kKEJGRF9MSUJTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLSQoQkZEX01BQ0hJTkVTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLSQoQkZEX0JBQ0tFTkRTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLSQoT1BUSU9OQUxfQkFDS0VORFMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotCi0jIEluc3RhbGwgQkZEIGluY2x1ZGUgZmlsZSwgYW5kIG90aGVycyB0aGF0IGl0IG5lZWRzLgotaW5zdGFsbC1kYXRhLWxvY2FsOiAkKEJGRF9IKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChpbmNsdWRlZGlyKQotCSQoSU5TVEFMTF9EQVRBKSAkKEJGRF9IKSAkKGluY2x1ZGVkaXIpL2JmZC5oCi0JJChJTlNUQUxMX0RBVEEpICQoSU5DRElSKS9hbnNpZGVjbC5oICQoaW5jbHVkZWRpcikvYW5zaWRlY2wuaAotCSQoSU5TVEFMTF9EQVRBKSAkKElOQ0RJUikvYmZkbGluay5oICQoaW5jbHVkZWRpcikvYmZkbGluay5oCi0KLSMgSGF2ZSB0byBnZXQgcmlkIG9mIC5kZXAxIGhlcmUgc28gdGhhdCAiJD8iIGxhdGVyIGluY2x1ZGVzIGFsbCBvZiAkKENGSUxFUykuCi0uZGVwOiBkZXAuc2VkICQoQ0ZJTEVTKSAkKEhGSUxFUykgYmZkLmgKLQlybSAtZiAuZGVwMQotCSQoTUFLRSkgREVQPSQoREVQKSAuZGVwMQotCXNlZCAtZiBkZXAuc2VkIDwuZGVwMSA+LmRlcAotCi0jIFRoaXMgcnVsZSByZWFsbHkgd2FudHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotIyBUaGUgTmV0QlNEIG1rZGVwIG92ZXJ3cml0ZXMgYW55IGV4aXN0aW5nIGZpbGUgY29udGVudHMsIGFuZCBkb2Vzbid0IGluc2VydAotIyB0aGUgIkRPIE5PVCBERUxFVEUiIGxpbmUuCi0jIE90aGVyIG1rZGVwIHZlcnNpb25zIHJlcXVpcmUgYSBmaWxlIHRoYXQgYWxyZWFkeSBleGlzdHMsIGFuZCBkbyBpbnNlcnQgaXQuCi0jIEhlbmNlIHRoZSB3ZWlyZG5lc3MuLi4uCi0uZGVwMTogJChDRklMRVMpCi0Jcm0gLWYgLmRlcDIgLmRlcDJhCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiAuZGVwMgotCWVjaG8gPiAuZGVwMmEKLQkkKERFUCkgLWYgLmRlcDJhICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkPwotCXNlZCAtZSAnL0RPIE5PVCBERUxFVEUvZCcgLWUgJy9eJCQvZCcgPCAuZGVwMmEgPj4gLmRlcDIKLQlybSAtZiAuZGVwMmEKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgLmRlcDIgLmRlcDEKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCi0JCS1lICdzIUBCRkRfSEAhJChCRkRfSCkhJwlcCi0JCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKLQotZGVwOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLWhvc3QtYW91dC5sbzogTWFrZWZpbGUKLQotIyBUaGUgZm9sbG93aW5nIHByb2dyYW0gY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBzaW1wbGUgY29uZmlnIGZpbGUKLSMgd2hpY2ggY2FuIGJlIGZvbGRlZCBpbnRvIGFuIGgtWFhYIGZpbGUgZm9yIGEgbmV3IGhvc3QsIHdpdGggc29tZSBlZGl0aW5nLgotYW91dC1wYXJhbXMuaDogZ2VuLWFvdXQKLQkuL2dlbi1hb3V0IGhvc3QgPiBhb3V0LXBhcmFtcy5oCi1nZW4tYW91dDogJChzcmNkaXIpL2dlbi1hb3V0LmMgTWFrZWZpbGUKLQkkKENDKSAtbyBnZW4tYW91dCAkKENGTEFHUykgJChMRkxBR1MpICQoc3JjZGlyKS9nZW4tYW91dC5jCi0KLSQoQkZEX0gpOiBzdG1wLWJmZC1oIDsgQHRydWUKLQotc3RtcC1iZmQtaDogYmZkLWluMy5oCi0Jcm0gLWYgYmZkLXRtcC5oCi0JY3AgYmZkLWluMy5oIGJmZC10bXAuaAotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtdG1wLmggJChCRkRfSCkKLQlybSAtZiBiZmQtdG1wLmgKLQl0b3VjaCBzdG1wLWJmZC1oCi0KLUJGRF9IX0ZJTEVTID0gYmZkLWluLmggaW5pdC5jIG9wbmNscy5jIGxpYmJmZC5jIHNlY3Rpb24uYyBhcmNodXJlcy5jIFwKLQlyZWxvYy5jIHN5bXMuYyBiZmQuYyBhcmNoaXZlLmMgY29yZWZpbGUuYyB0YXJnZXRzLmMgZm9ybWF0LmMKLUxJQkJGRF9IX0ZJTEVTID0gbGliYmZkLWluLmggaW5pdC5jIGxpYmJmZC5jIGNhY2hlLmMgcmVsb2MuYyBhcmNodXJlcy5jIGVsZi5jCi1MSUJDT0ZGX0hfRklMRVMgPSBsaWJjb2ZmLWluLmggY29mZmNvZGUuaAotCi0jIENvdWxkIHJlYWxseSB1c2UgYSAiY29weS1pZi1jaGFuZ2UiLi4uCi1oZWFkZXJzOgotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgcHJvdG9zICQoRkxBR1NfVE9fUEFTUykpCi0JY3AgJChkb2NkaXIpL2JmZC5oIGJmZC1pbjIuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLWluMi5oLW5ldyAkKHNyY2RpcikvYmZkLWluMi5oCi0JY3AgJChkb2NkaXIpL2xpYmJmZC5oIGxpYmJmZC5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJiZmQuaC1uZXcgJChzcmNkaXIpL2xpYmJmZC5oCi0JY3AgJChkb2NkaXIpL2xpYmNvZmYuaCBsaWJjb2ZmLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmNvZmYuaC1uZXcgJChzcmNkaXIpL2xpYmNvZmYuaAotCi0jIFdlIG9ubHkgcmVidWlsZCB0aGUgaGVhZGVyIGZpbGVzIGF1dG9tYXRpY2FsbHkgaWYgd2UgaGF2ZSBiZWVuCi0jIGNvbmZpZ3VyZWQgd2l0aCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUuCi0KLSQoc3JjZGlyKS9iZmQtaW4yLmg6IEBNQUlOVEAgc3RtcC1iaW4yLWggOyBAdHJ1ZQotc3RtcC1iaW4yLWg6ICQoQkZEX0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGJmZC5oKQotCWNwICQoZG9jZGlyKS9iZmQuaCBiZmQtaW4yLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGJmZC1pbjIuaC1uZXcgJChzcmNkaXIpL2JmZC1pbjIuaAotCXRvdWNoIHN0bXAtYmluMi1oCi0KLSQoc3JjZGlyKS9saWJiZmQuaDogQE1BSU5UQCBzdG1wLWxiZmQtaCA7IEB0cnVlCi1zdG1wLWxiZmQtaDogJChMSUJCRkRfSF9GSUxFUykKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgbGliYmZkLmgpCi0JY3AgJChkb2NkaXIpL2xpYmJmZC5oIGxpYmJmZC5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJiZmQuaC1uZXcgJChzcmNkaXIpL2xpYmJmZC5oCi0JdG91Y2ggc3RtcC1sYmZkLWgKLQotJChzcmNkaXIpL2xpYmNvZmYuaDogQE1BSU5UQCBzdG1wLWxjb2ZmLWggOyBAdHJ1ZQotc3RtcC1sY29mZi1oOiAkKExJQkNPRkZfSF9GSUxFUykKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgbGliY29mZi5oKQotCWNwICQoZG9jZGlyKS9saWJjb2ZmLmggbGliY29mZi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJjb2ZmLmgtbmV3ICQoc3JjZGlyKS9saWJjb2ZmLmgKLQl0b3VjaCBzdG1wLWxjb2ZmLWgKLQotTU9TVExZQ0xFQU5GSUxFUyA9IGVsZjMyLXRhcmdldC5oIGVsZjY0LXRhcmdldC5oIG9maWxlcyBzdGFtcC1vZmlsZXMgXAotCXRhcmdtYXRjaC5oCi0KLUNMRUFORklMRVMgPSBiZmQuaCBkZXAuc2VkIHN0bXAtYmZkLWggLmRlcCAuZGVwMSBsaWJiZmQuYSBzdGFtcC1saWIgXAotCXN0bXAtYmluMi1oIHN0bXAtbGJmZC1oIHN0bXAtbGNvZmYtaAotCi0jIFdlIHdhbnQgdG8gcmVydW4gY29uZmlndXJlIGlmIGNvbmZpZy5iZmQgb3IgY29uZmlndXJlLmhvc3QgY2hhbmdlLgotY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKHNyY2RpcikvY29uZmlnLmJmZCAkKHNyY2RpcikvY29uZmlndXJlLmhvc3QKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLQotZWxmYXJtLW9hYmkubG86IGVsZmFybS1vYWJpLmMgZWxmMzItYXJtLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi1lbGZhcm0tbmFiaS5sbzogZWxmYXJtLW5hYmkuYyBlbGYzMi1hcm0uaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotYXJjaGl2ZS5sbzogYXJjaGl2ZS5jICQoSU5DRElSKS9hb3V0L2FyLmggJChJTkNESVIpL2FvdXQvcmFubGliLmgKLWFyY2h1cmVzLmxvOiBhcmNodXJlcy5jCi1iZmQubG86IGJmZC5jICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zeW0uaCBsaWJjb2ZmLmggXAotICBsaWJlY29mZi5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oCi1jYWNoZS5sbzogY2FjaGUuYwotY29mZmdlbi5sbzogY29mZmdlbi5jICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotY29yZWZpbGUubG86IGNvcmVmaWxlLmMKLWZvcm1hdC5sbzogZm9ybWF0LmMKLWluaXQubG86IGluaXQuYwotbGliYmZkLmxvOiBsaWJiZmQuYwotb3BuY2xzLmxvOiBvcG5jbHMuYyAkKElOQ0RJUikvb2JqYWxsb2MuaAotcmVsb2MubG86IHJlbG9jLmMgJChJTkNESVIpL2JmZGxpbmsuaAotc2VjdGlvbi5sbzogc2VjdGlvbi5jICQoSU5DRElSKS9iZmRsaW5rLmgKLXN5bXMubG86IHN5bXMuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotdGFyZ2V0cy5sbzogdGFyZ2V0cy5jICQoSU5DRElSKS9mbm1hdGNoLmggdGFyZ21hdGNoLmgKLWhhc2gubG86IGhhc2guYyAkKElOQ0RJUikvb2JqYWxsb2MuaAotbGlua2VyLmxvOiBsaW5rZXIuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaAotc3JlYy5sbzogc3JlYy5jICQoSU5DRElSKS9saWJpYmVydHkuaAotYmluYXJ5LmxvOiBiaW5hcnkuYwotdGVraGV4LmxvOiB0ZWtoZXguYyAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWloZXgubG86IGloZXguYyAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXN0YWJzLmxvOiBzdGFicy5jICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXN0YWItc3ltcy5sbzogc3RhYi1zeW1zLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotY3B1LWEyOWsubG86IGNwdS1hMjlrLmMKLWNwdS1hbHBoYS5sbzogY3B1LWFscGhhLmMKLWNwdS1hcmMubG86IGNwdS1hcmMuYwotY3B1LWFybS5sbzogY3B1LWFybS5jCi1jcHUtZDEwdi5sbzogY3B1LWQxMHYuYwotY3B1LWQzMHYubG86IGNwdS1kMzB2LmMKLWNwdS1mcjMwLmxvOiBjcHUtZnIzMC5jCi1jcHUtaDgzMDAubG86IGNwdS1oODMwMC5jCi1jcHUtaDg1MDAubG86IGNwdS1oODUwMC5jCi1jcHUtaHBwYS5sbzogY3B1LWhwcGEuYwotY3B1LWkzODYubG86IGNwdS1pMzg2LmMKLWNwdS1pODYwLmxvOiBjcHUtaTg2MC5jCi1jcHUtaTk2MC5sbzogY3B1LWk5NjAuYwotY3B1LW0zMnIubG86IGNwdS1tMzJyLmMKLWNwdS1tNjhrLmxvOiBjcHUtbTY4ay5jCi1jcHUtbTg4ay5sbzogY3B1LW04OGsuYwotY3B1LW0xMDIwMC5sbzogY3B1LW0xMDIwMC5jCi1jcHUtbTEwMzAwLmxvOiBjcHUtbTEwMzAwLmMKLWNwdS1tY29yZS5sbzogY3B1LW1jb3JlLmMKLWNwdS1taXBzLmxvOiBjcHUtbWlwcy5jCi1jcHUtbnMzMmsubG86IGNwdS1uczMyay5jIG5zMzJrLmgKLWNwdS1wb3dlcnBjLmxvOiBjcHUtcG93ZXJwYy5jCi1jcHUtcnM2MDAwLmxvOiBjcHUtcnM2MDAwLmMKLWNwdS1zaC5sbzogY3B1LXNoLmMKLWNwdS1zcGFyYy5sbzogY3B1LXNwYXJjLmMKLWNwdS10aWMzMC5sbzogY3B1LXRpYzMwLmMKLWNwdS10aWM4MC5sbzogY3B1LXRpYzgwLmMKLWNwdS12ODUwLmxvOiBjcHUtdjg1MC5jCi1jcHUtdmF4LmxvOiBjcHUtdmF4LmMKLWNwdS13ZTMyay5sbzogY3B1LXdlMzJrLmMKLWNwdS13NjUubG86IGNwdS13NjUuYwotY3B1LXo4ay5sbzogY3B1LXo4ay5jCi1hb3V0LWFkb2JlLmxvOiBhb3V0LWFkb2JlLmMgJChJTkNESVIpL2FvdXQvYWRvYmUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotYW91dC1hcm0ubG86IGFvdXQtYXJtLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0eC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLWFvdXQtbnMzMmsubG86IGFvdXQtbnMzMmsuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gIG5zMzJrLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLWFvdXQtc3BhcmNsZS5sbzogYW91dC1zcGFyY2xlLmMgJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxpYmFvdXQuaCBhb3V0ZjEuaCAkKElOQ0RJUikvYW91dC9zdW40LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBhb3V0LXRhcmdldC5oCi1hb3V0LXRpYzMwLmxvOiBhb3V0LXRpYzMwLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0eC5oCi1hb3V0MC5sbzogYW91dDAuYyBhb3V0ZjEuaCAkKElOQ0RJUikvYW91dC9zdW40LmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCi1hb3V0MzIubG86IGFvdXQzMi5jIGFvdXR4LmggJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgJChJTkNESVIpL2FvdXQvYXIuaAotYm91dC5sbzogYm91dC5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oICQoSU5DRElSKS9ib3V0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIGxpYmFvdXQuaAotY2YtaTM4Nmx5bngubG86IGNmLWkzODZseW54LmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY2YtbTY4a2x5bngubG86IGNmLW02OGtseW54LmMgY29mZi1tNjhrLmMgJChJTkNESVIpL2NvZmYvbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY2Ytc3BhcmNseW54LmxvOiBjZi1zcGFyY2x5bnguYyBjb2ZmLXNwYXJjLmMgJChJTkNESVIpL2NvZmYvc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYTI5ay5sbzogY29mZi1hMjlrLmMgJChJTkNESVIpL2NvZmYvYTI5ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYXBvbGxvLmxvOiBjb2ZmLWFwb2xsby5jICQoSU5DRElSKS9jb2ZmL2Fwb2xsby5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hcm0ubG86IGNvZmYtYXJtLmMgJChJTkNESVIpL2NvZmYvYXJtLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hdXgubG86IGNvZmYtYXV4LmMgJChJTkNESVIpL2NvZmYvYXV4LWNvZmYuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvbTY4ay5oIGNvZmYtbTY4ay5jIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWg4MzAwLmxvOiBjb2ZmLWg4MzAwLmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggXAotICAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWg4NTAwLmxvOiBjb2ZmLWg4NTAwLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWkzODYubG86IGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWk4NjAubG86IGNvZmYtaTg2MC5jICQoSU5DRElSKS9jb2ZmL2k4NjAuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWdvMzIubG86IGNvZmYtZ28zMi5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaTk2MC5sbzogY29mZi1pOTYwLmMgJChJTkNESVIpL2NvZmYvaTk2MC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtbTY4ay5sbzogY29mZi1tNjhrLmMgJChJTkNESVIpL2NvZmYvbTY4ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtbTg4ay5sbzogY29mZi1tODhrLmMgJChJTkNESVIpL2NvZmYvbTg4ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtbWlwcy5sbzogY29mZi1taXBzLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvbWlwcy5oIGxpYmNvZmYuaCBsaWJlY29mZi5oIGNvZmZzd2FwLmggXAotICBlY29mZnN3YXAuaAotY29mZi1wbWFjLmxvOiBjb2ZmLXBtYWMuYyBjb2ZmLXJzNjAwMC5jICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9yczYwMDAuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1yczYwMDAubG86IGNvZmYtcnM2MDAwLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXNoLmxvOiBjb2ZmLXNoLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9zaC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXNwYXJjLmxvOiBjb2ZmLXNwYXJjLmMgJChJTkNESVIpL2NvZmYvc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtc3RnbzMyLmxvOiBjb2ZmLXN0Z28zMi5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvZ28zMmV4ZS5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oIFwKLSAgZ28zMnN0dWIuaAotY29mZi1zdm02OGsubG86IGNvZmYtc3ZtNjhrLmMgY29mZi1tNjhrLmMgJChJTkNESVIpL2NvZmYvbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi10aWMzMC5sbzogY29mZi10aWMzMC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvdGljMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi10aWM4MC5sbzogY29mZi10aWM4MC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvdGljODAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi11NjhrLmxvOiBjb2ZmLXU2OGsuYyBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXdlMzJrLmxvOiBjb2ZmLXdlMzJrLmMgJChJTkNESVIpL2NvZmYvd2UzMmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdzY1LmxvOiBjb2ZmLXc2NS5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvdzY1LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtejhrLmxvOiBjb2ZmLXo4ay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvejhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmZsaW5rLmxvOiBjb2ZmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaAotZHdhcmYyLmxvOiBkd2FyZjIuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2R3YXJmMi5oCi1lY29mZi5sbzogZWNvZmYuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FyLmggXAotICAkKElOQ0RJUikvYW91dC9yYW5saWIuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICBsaWJjb2ZmLmggbGliZWNvZmYuaAotZWNvZmZsaW5rLmxvOiBlY29mZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYmphbGxvYy5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgbGliY29mZi5oIGxpYmVjb2ZmLmgKLWVsZi5sbzogZWxmLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmgKLWVsZjMyLWFyYy5sbzogZWxmMzItYXJjLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZmFybS1vYWJpLmxvOiBlbGZhcm0tb2FiaS5jICQoSU5DRElSKS9lbGYvYXJtLW9hYmkuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi1hcm0uaCBlbGYzMi10YXJnZXQuaAotZWxmYXJtLW5hYmkubG86IGVsZmFybS1uYWJpLmMgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggZWxmMzItYXJtLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItZDEwdi5sbzogZWxmMzItZDEwdi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWQzMHYubG86IGVsZjMyLWQzMHYuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1mcjMwLmxvOiBlbGYzMi1mcjMwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2ZyMzAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1nZW4ubG86IGVsZjMyLWdlbi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWhwcGEubG86IGVsZjMyLWhwcGEuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gIGVsZjMyLWhwcGEuaCBsaWJocHBhLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGhwcGFfc3R1YnMuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItaTM4Ni5sbzogZWxmMzItaTM4Ni5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9pMzg2LmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItaTg2MC5sbzogZWxmMzItaTg2MC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW0zMnIubG86IGVsZjMyLW0zMnIuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvbTMyci5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW02OGsubG86IGVsZjMyLW02OGsuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvbTY4ay5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW04OGsubG86IGVsZjMyLW04OGsuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYtbTEwMjAwLmxvOiBlbGYtbTEwMjAwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmLW0xMDMwMC5sbzogZWxmLW0xMDMwMC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9tbjEwMzAwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1tY29yZS5sbzogZWxmMzItbWNvcmUuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvbWNvcmUuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW1pcHMubG86IGVsZjMyLW1pcHMuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCBcCi0gIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvZWNvZmYuaCAkKElOQ0RJUikvY29mZi9taXBzLmggZWNvZmZzd2FwLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItcHBjLmxvOiBlbGYzMi1wcGMuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItc2gubG86IGVsZjMyLXNoLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL3NoLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItc3BhcmMubG86IGVsZjMyLXNwYXJjLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi12ODUwLmxvOiBlbGYzMi12ODUwLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL3Y4NTAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi5sbzogZWxmMzIuYyBlbGZjb2RlLmggJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICBlbGZjb3JlLmggZWxmbGluay5oCi1lbGZsaW5rLmxvOiBlbGZsaW5rLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmgKLWhwMzAwYnNkLmxvOiBocDMwMGJzZC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaHAzMDBocHV4LmxvOiBocDMwMGhwdXguYyAkKElOQ0RJUikvYW91dC9ocDMwMGhwdXguaCBcCi0gIGFvdXR4LmggJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBhb3V0LXRhcmdldC5oCi1zb20ubG86IHNvbS5jCi1pMzg2YW91dC5sbzogaTM4NmFvdXQuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZic2QubG86IGkzODZic2QuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZkeW5peC5sbzogaTM4NmR5bml4LmMgJChJTkNESVIpL2FvdXQvZHluaXgzLmggYW91dHguaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotaTM4NmZyZWVic2QubG86IGkzODZmcmVlYnNkLmMgZnJlZWJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4NmxpbnV4LmxvOiBpMzg2bGludXguYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLWkzODZseW54LmxvOiBpMzg2bHlueC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4Nm1zZG9zLmxvOiBpMzg2bXNkb3MuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotaTM4Nm5ldGJzZC5sbzogaTM4Nm5ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4Nm1hY2gzLmxvOiBpMzg2bWFjaDMuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLWkzODZvczlrLmxvOiBpMzg2b3M5ay5jICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL29zOWsuaAotaWVlZS5sbzogaWVlZS5jICQoSU5DRElSKS9pZWVlLmggbGliaWVlZS5oCi1tNjhrNGtuZXRic2QubG86IG02OGs0a25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbTY4a2xpbnV4LmxvOiBtNjhrbGludXguYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLW02OGtseW54LmxvOiBtNjhrbHlueC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbTY4a25ldGJzZC5sbzogbTY4a25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbTg4a21hY2gzLmxvOiBtODhrbWFjaDMuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW1pcHNic2QubG86IG1pcHNic2QuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW5ld3NvczMubG86IG5ld3NvczMuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLW5sbS5sbzogbmxtLmMgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKLW5sbTMyLWkzODYubG86IG5sbTMyLWkzODYuYyAkKElOQ0RJUikvbmxtL2kzODYtZXh0LmggXAotICBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG0zMi1zcGFyYy5sbzogbmxtMzItc3BhcmMuYyAkKElOQ0RJUikvbmxtL3NwYXJjMzItZXh0LmggXAotICBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG0zMi1wcGMubG86IG5sbTMyLXBwYy5jICQoSU5DRElSKS9ubG0vcHBjLWV4dC5oIGxpYm5sbS5oIFwKLSAgJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oIFwKLSAgbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtMzIubG86IG5sbTMyLmMgbmxtY29kZS5oIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggXAotICAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oCi1uczMya25ldGJzZC5sbzogbnMzMmtuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW9hc3lzLmxvOiBvYXN5cy5jICQoSU5DRElSKS9vYXN5cy5oIGxpYm9hc3lzLmgKLXBjNTMyLW1hY2gubG86IHBjNTMyLW1hY2guYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXBlLWFybS5sbzogcGUtYXJtLmMgY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZWktYXJtLmxvOiBwZWktYXJtLmMgY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZS1pMzg2LmxvOiBwZS1pMzg2LmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLXBlaS1pMzg2LmxvOiBwZWktaTM4Ni5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZS1tY29yZS5sbzogcGUtbWNvcmUuYyBjb2ZmLW1jb3JlLmMgJChJTkNESVIpL2NvZmYvbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZWktbWNvcmUubG86IHBlaS1tY29yZS5jIGNvZmYtbWNvcmUuYyAkKElOQ0RJUikvY29mZi9tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLXBlLXBwYy5sbzogcGUtcHBjLmMgY29mZi1wcGMuYyAkKElOQ0RJUikvY29mZi9wb3dlcnBjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAotcGVpLXBwYy5sbzogcGVpLXBwYy5jIGNvZmYtcHBjLmMgJChJTkNESVIpL2NvZmYvcG93ZXJwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLXBwY2Jvb3QubG86IHBwY2Jvb3QuYwotcmVsb2MxNi5sbzogcmVsb2MxNi5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmgKLXJpc2NpeC5sbzogcmlzY2l4LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oCi1zcGFyY2xpbnV4LmxvOiBzcGFyY2xpbnV4LmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1zcGFyY2x5bngubG86IHNwYXJjbHlueC5jICQoSU5DRElSKS9hb3V0L3N1bjQuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLXNwYXJjbmV0YnNkLmxvOiBzcGFyY25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotc3Vub3MubG86IHN1bm9zLmMgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggYW91dGYxLmggXAotICAkKElOQ0RJUikvYW91dC9zdW40LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotdmF4bmV0YnNkLmxvOiB2YXhuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXZlcnNhZG9zLmxvOiB2ZXJzYWRvcy5jICQoSU5DRElSKS9saWJpYmVydHkuaAotdm1zLmxvOiB2bXMuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi12bXMtZ3NkLmxvOiB2bXMtZ3NkLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAotdm1zLWhkci5sbzogdm1zLWhkci5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy1taXNjLmxvOiB2bXMtbWlzYy5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy10aXIubG86IHZtcy10aXIuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi14Y29mZmxpbmsubG86IHhjb2ZmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaAotYW91dDY0LmxvOiBhb3V0NjQuYyBhb3V0eC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmgKLWNvZmYtYWxwaGEubG86IGNvZmYtYWxwaGEuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9hbHBoYS5oICQoSU5DRElSKS9hb3V0L2FyLmggbGliY29mZi5oIFwKLSAgbGliZWNvZmYuaCBjb2Zmc3dhcC5oIGVjb2Zmc3dhcC5oCi1kZW1vNjQubG86IGRlbW82NC5jIGFvdXRmMS5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotZWxmNjQtYWxwaGEubG86IGVsZjY0LWFscGhhLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FscGhhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvYWxwaGEuaCAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgbGliY29mZi5oIGxpYmVjb2ZmLmggZWNvZmZzd2FwLmggZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LWdlbi5sbzogZWxmNjQtZ2VuLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGY2NC10YXJnZXQuaAotZWxmNjQtbWlwcy5sbzogZWxmNjQtbWlwcy5jICQoSU5DRElSKS9hb3V0L2FyLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGdlbmxpbmsuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvYWxwaGEuaCBlY29mZnN3YXAuaCBcCi0gIGVsZjY0LXRhcmdldC5oCi1lbGY2NC1zcGFyYy5sbzogZWxmNjQtc3BhcmMuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvc3BhcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LmxvOiBlbGY2NC5jIGVsZmNvZGUuaCAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gIGVsZmNvcmUuaCBlbGZsaW5rLmgKLW5sbTMyLWFscGhhLmxvOiBubG0zMi1hbHBoYS5jICQoSU5DRElSKS9ubG0vYWxwaGEtZXh0LmggXAotICBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG02NC5sbzogbmxtNjQuYyBubG1jb2RlLmggbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCBcCi0gICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKLWFpeDM4Ni1jb3JlLmxvOiBhaXgzODYtY29yZS5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLWhwdXgtY29yZS5sbzogaHB1eC1jb3JlLmMKLWlyaXgtY29yZS5sbzogaXJpeC1jb3JlLmMKLWx5bngtY29yZS5sbzogbHlueC1jb3JlLmMKLW9zZi1jb3JlLmxvOiBvc2YtY29yZS5jCi1zY281LWNvcmUubG86IHNjbzUtY29yZS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi10cmFkLWNvcmUubG86IHRyYWQtY29yZS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgaG9zdHMvaTM4NmxpbnV4LmgKLWNpc2NvLWNvcmUubG86IGNpc2NvLWNvcmUuYwotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCmRpZmYgLS1naXQgYS9iZmQvTWFrZWZpbGUuaW4gYi9iZmQvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNThkZjEuLjAwMDAwMDAKLS0tIGEvYmZkL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTU5OSArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLVNIRUxMID0gQFNIRUxMQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1iaW5kaXIgPSBAYmluZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1saWJkaXIgPSBAbGliZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLQotREVTVERJUiA9Ci0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi0KLXRvcF9idWlsZGRpciA9IC4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQkZEX0hPU1RfNjRCSVRfTE9ORyA9IEBCRkRfSE9TVF82NEJJVF9MT05HQAotQkZEX0hPU1RfNjRfQklUID0gQEJGRF9IT1NUXzY0X0JJVEAKLUJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEID0gQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQAotQkZEX0hPU1RfVV82NF9CSVQgPSBAQkZEX0hPU1RfVV82NF9CSVRACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1DT1JFRklMRSA9IEBDT1JFRklMRUAKLUNPUkVGTEFHID0gQENPUkVGTEFHQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1FWEVFWFQgPSBARVhFRVhUQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTExJQlMgPSBASU5UTExJQlNACi1JTlRMT0JKUyA9IEBJTlRMT0JKU0AKLUxEID0gQExEQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTUFJTlQgPSBATUFJTlRACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLU1TR0ZNVCA9IEBNU0dGTVRACi1OTSA9IEBOTUAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBPRklMRVMgPSBAUE9GSUxFU0AKLVBPU1VCID0gQFBPU1VCQAotUkFOTElCID0gQFJBTkxJQkAKLVRERUZJTkVTID0gQFRERUZJTkVTQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1WRVJTSU9OID0gQFZFUlNJT05ACi1XSU4zMkxERkxBR1MgPSBAV0lOMzJMREZMQUdTQAotV0lOMzJMSUJBREQgPSBAV0lOMzJMSUJBRERACi1hbGxfYmFja2VuZHMgPSBAYWxsX2JhY2tlbmRzQAotYmZkX2JhY2tlbmRzID0gQGJmZF9iYWNrZW5kc0AKLWJmZF9tYWNoaW5lcyA9IEBiZmRfbWFjaGluZXNACi1sID0gQGxACi10ZGVmYXVsdHMgPSBAdGRlZmF1bHRzQAotd29yZHNpemUgPSBAd29yZHNpemVACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotSU5DRElSID0gJChzcmNkaXIpLy4uL2luY2x1ZGUKLUNTRUFSQ0ggPSAtSS4gLUkkKHNyY2RpcikgLUkkKElOQ0RJUikKLURFUCA9IG1rZGVwCi0KLVNVQkRJUlMgPSBkb2MgcG8KLQotZG9jZGlyID0gZG9jCi0KLWxpYl9MVExJQlJBUklFUyA9IGxpYmJmZC5sYQotCi0jIGJmZC5oIGdvZXMgaGVyZSwgZm9yIG5vdwotQkZEX0ggPSBiZmQuaAotCi0jIEppbSBLaW5nZG9uIG5vdGVzOgotIyBXcml0aW5nIFMtcmVjb3JkcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYWxsIChvciBhdCBsZWFzdCBtb3N0KQotIyAqLSotY29mZiwgKi0qLWFvdXQsIGV0Yy4sIGNvbmZpZ3VyYXRpb25zLCBiZWNhdXNlIHBlb3BsZSB3aWxsIHdhbnQgdG8KLSMgYmUgYWJsZSB0byB1c2Ugb2JqY29weSB0byBjcmVhdGUgUy1yZWNvcmRzLiAgKFMtcmVjb3JkcyBhcmUgbm90IHVzZWZ1bAotIyBmb3IgdGhlIGRlYnVnZ2VyLCBzbyBpZiB5b3UgYXJlIGRvd25sb2FkaW5nIHRoaW5ncyBhcyBTLXJlY29yZHMgeW91Ci0jIG5lZWQgdHdvIGNvcGllcyBvZiB0aGUgZXhlY3V0YWJsZSwgb25lIHRvIGRvd25sb2FkIGFuZCBvbmUgZm9yIHRoZQotIyBkZWJ1Z2dlcikuCi1CRkRfTElCUyA9IFwKLQlhcmNoaXZlLmxvIGFyY2h1cmVzLmxvIGJmZC5sbyBjYWNoZS5sbyBjb2ZmZ2VuLmxvIGNvcmVmaWxlLmxvIFwKLQlmb3JtYXQubG8gaW5pdC5sbyBsaWJiZmQubG8gb3BuY2xzLmxvIHJlbG9jLmxvIFwKLQlzZWN0aW9uLmxvIHN5bXMubG8gdGFyZ2V0cy5sbyBoYXNoLmxvIGxpbmtlci5sbyBcCi0Jc3JlYy5sbyBiaW5hcnkubG8gdGVraGV4LmxvIGloZXgubG8gc3RhYnMubG8gc3RhYi1zeW1zLmxvCi0KLQotQkZEX0xJQlNfQ0ZJTEVTID0gXAotCWFyY2hpdmUuYyBhcmNodXJlcy5jIGJmZC5jIGNhY2hlLmMgY29mZmdlbi5jIGNvcmVmaWxlLmMgXAotCWZvcm1hdC5jIGluaXQuYyBsaWJiZmQuYyBvcG5jbHMuYyByZWxvYy5jIFwKLQlzZWN0aW9uLmMgc3ltcy5jIHRhcmdldHMuYyBoYXNoLmMgbGlua2VyLmMgXAotCXNyZWMuYyBiaW5hcnkuYyB0ZWtoZXguYyBpaGV4LmMgc3RhYnMuYyBzdGFiLXN5bXMuYwotCi0KLSMgVGhpcyBsaXN0IGlzIGFscGhhYmV0aXplZCB0byBtYWtlIGl0IGVhc2llciB0byBrZWVwIGluIHN5bmMKLSMgd2l0aCB0aGUgZGVjbHMgYW5kIGluaXRpYWxpemVyIGluIGFyY2h1cmVzLmMuCi1BTExfTUFDSElORVMgPSBcCi0JY3B1LWEyOWsubG8gXAotCWNwdS1hbHBoYS5sbyBcCi0JY3B1LWFyYy5sbyBcCi0JY3B1LWFybS5sbyBcCi0JY3B1LWQxMHYubG8gXAotCWNwdS1kMzB2LmxvIFwKLQljcHUtZnIzMC5sbyBcCi0JY3B1LWg4MzAwLmxvIFwKLQljcHUtaDg1MDAubG8gXAotCWNwdS1ocHBhLmxvIFwKLQljcHUtaTM4Ni5sbyBcCi0JY3B1LWk4NjAubG8gXAotCWNwdS1pOTYwLmxvIFwKLQljcHUtbTMyci5sbyBcCi0JY3B1LW02OGsubG8gXAotCWNwdS1tODhrLmxvIFwKLQljcHUtbTEwMjAwLmxvIFwKLQljcHUtbTEwMzAwLmxvIFwKLQljcHUtbWNvcmUubG8gXAotCWNwdS1taXBzLmxvIFwKLQljcHUtbnMzMmsubG8gXAotCWNwdS1wb3dlcnBjLmxvIFwKLQljcHUtcnM2MDAwLmxvIFwKLQljcHUtc2gubG8gXAotCWNwdS1zcGFyYy5sbyBcCi0JY3B1LXRpYzMwLmxvIFwKLQljcHUtdGljODAubG8gXAotCWNwdS12ODUwLmxvIFwKLQljcHUtdmF4LmxvIFwKLQljcHUtd2UzMmsubG8gXAotCWNwdS13NjUubG8gXAotCWNwdS16OGsubG8KLQotCi1BTExfTUFDSElORVNfQ0ZJTEVTID0gXAotCWNwdS1hMjlrLmMgXAotCWNwdS1hbHBoYS5jIFwKLQljcHUtYXJjLmMgXAotCWNwdS1hcm0uYyBcCi0JY3B1LWQxMHYuYyBcCi0JY3B1LWQzMHYuYyBcCi0JY3B1LWZyMzAuYyBcCi0JY3B1LWg4MzAwLmMgXAotCWNwdS1oODUwMC5jIFwKLQljcHUtaHBwYS5jIFwKLQljcHUtaTM4Ni5jIFwKLQljcHUtaTg2MC5jIFwKLQljcHUtaTk2MC5jIFwKLQljcHUtbTMyci5jIFwKLQljcHUtbTY4ay5jIFwKLQljcHUtbTg4ay5jIFwKLQljcHUtbTEwMjAwLmMgXAotCWNwdS1tMTAzMDAuYyBcCi0JY3B1LW1jb3JlLmMgXAotCWNwdS1taXBzLmMgXAotCWNwdS1uczMyay5jIFwKLQljcHUtcG93ZXJwYy5jIFwKLQljcHUtcnM2MDAwLmMgXAotCWNwdS1zaC5jIFwKLQljcHUtc3BhcmMuYyBcCi0JY3B1LXRpYzMwLmMgXAotCWNwdS10aWM4MC5jIFwKLQljcHUtdjg1MC5jIFwKLQljcHUtdmF4LmMgXAotCWNwdS13ZTMyay5jIFwKLQljcHUtdzY1LmMgXAotCWNwdS16OGsuYwotCi0KLSMgVGhlIC5vIGZpbGVzIG5lZWRlZCBieSBhbGwgb2YgdGhlIDMyIGJpdCB2ZWN0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW50bwotIyB0YXJnZXRfdmVjdG9yIGluIHRhcmdldHMuYyBpZiBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtdGFyZ2V0cz1hbGwuCi1CRkQzMl9CQUNLRU5EUyA9IFwKLQlhb3V0LWFkb2JlLmxvIFwKLQlhb3V0LWFybS5sbyBcCi0JYW91dC1uczMyay5sbyBcCi0JYW91dC1zcGFyY2xlLmxvIFwKLQlhb3V0LXRpYzMwLmxvIFwKLQlhb3V0MC5sbyBcCi0JYW91dDMyLmxvIFwKLQlib3V0LmxvIFwKLQljZi1pMzg2bHlueC5sbyBcCi0JY2YtbTY4a2x5bngubG8gXAotCWNmLXNwYXJjbHlueC5sbyBcCi0JY29mZi1hMjlrLmxvIFwKLQljb2ZmLWFwb2xsby5sbyBcCi0JY29mZi1hcm0ubG8gXAotCWNvZmYtYXV4LmxvIFwKLQljb2ZmLWg4MzAwLmxvIFwKLQljb2ZmLWg4NTAwLmxvIFwKLQljb2ZmLWkzODYubG8gXAotCWNvZmYtZ28zMi5sbyBcCi0JY29mZi1pODYwLmxvIFwKLQljb2ZmLWk5NjAubG8gXAotCWNvZmYtbTY4ay5sbyBcCi0JY29mZi1tODhrLmxvIFwKLQljb2ZmLW1pcHMubG8gXAotCWNvZmYtcG1hYy5sbyBcCi0JY29mZi1yczYwMDAubG8gXAotCWNvZmYtc2gubG8gXAotCWNvZmYtc3BhcmMubG8gXAotCWNvZmYtc3RnbzMyLmxvIFwKLQljb2ZmLXN2bTY4ay5sbyBcCi0JY29mZi10aWMzMC5sbyBcCi0JY29mZi10aWM4MC5sbyBcCi0JY29mZi11NjhrLmxvIFwKLQljb2ZmLXdlMzJrLmxvIFwKLQljb2ZmLXc2NS5sbyBcCi0JY29mZi16OGsubG8gXAotCWNvZmZsaW5rLmxvIFwKLQlkd2FyZjIubG8gXAotCWVjb2ZmLmxvIFwKLQllY29mZmxpbmsubG8gXAotCWVsZi5sbyBcCi0JZWxmMzItYXJjLmxvIFwKLQllbGZhcm0tb2FiaS5sbyBcCi0JZWxmYXJtLW5hYmkubG8gXAotCWVsZjMyLWQxMHYubG8gXAotCWVsZjMyLWQzMHYubG8gXAotCWVsZjMyLWZyMzAubG8gXAotCWVsZjMyLWdlbi5sbyBcCi0JZWxmMzItaHBwYS5sbyBcCi0JZWxmMzItaTM4Ni5sbyBcCi0JZWxmMzItaTg2MC5sbyBcCi0JZWxmMzItbTMyci5sbyBcCi0JZWxmMzItbTY4ay5sbyBcCi0JZWxmMzItbTg4ay5sbyBcCi0JZWxmLW0xMDIwMC5sbyBcCi0JZWxmLW0xMDMwMC5sbyBcCi0JZWxmMzItbWNvcmUubG8gXAotCWVsZjMyLW1pcHMubG8gXAotCWVsZjMyLXBwYy5sbyBcCi0JZWxmMzItc2gubG8gXAotCWVsZjMyLXNwYXJjLmxvIFwKLQllbGYzMi12ODUwLmxvIFwKLQllbGYzMi5sbyBcCi0JZWxmbGluay5sbyBcCi0JaHAzMDBic2QubG8gXAotCWhwMzAwaHB1eC5sbyBcCi0Jc29tLmxvIFwKLQlpMzg2YW91dC5sbyBcCi0JaTM4NmJzZC5sbyBcCi0JaTM4NmR5bml4LmxvIFwKLQlpMzg2ZnJlZWJzZC5sbyBcCi0JaTM4NmxpbnV4LmxvIFwKLQlpMzg2bHlueC5sbyBcCi0JaTM4Nm1zZG9zLmxvIFwKLQlpMzg2bmV0YnNkLmxvIFwKLQlpMzg2bWFjaDMubG8gXAotCWkzODZvczlrLmxvIFwKLQlpZWVlLmxvIFwKLQltNjhrNGtuZXRic2QubG8gXAotCW02OGtsaW51eC5sbyBcCi0JbTY4a2x5bngubG8gXAotCW02OGtuZXRic2QubG8gXAotCW04OGttYWNoMy5sbyBcCi0JbWlwc2JzZC5sbyBcCi0JbmV3c29zMy5sbyBcCi0JbmxtLmxvIFwKLQlubG0zMi1pMzg2LmxvIFwKLQlubG0zMi1zcGFyYy5sbyBcCi0JbmxtMzItcHBjLmxvIFwKLQlubG0zMi5sbyBcCi0JbnMzMmtuZXRic2QubG8gXAotCW9hc3lzLmxvIFwKLQlwYzUzMi1tYWNoLmxvIFwKLQlwZS1hcm0ubG8gXAotCXBlaS1hcm0ubG8gXAotCXBlLWkzODYubG8gXAotCXBlaS1pMzg2LmxvIFwKLQlwZS1tY29yZS5sbyBcCi0JcGVpLW1jb3JlLmxvIFwKLQlwZS1wcGMubG8gXAotCXBlaS1wcGMubG8gXAotCXBwY2Jvb3QubG8gXAotCXJlbG9jMTYubG8gXAotCXJpc2NpeC5sbyBcCi0Jc3BhcmNsaW51eC5sbyBcCi0Jc3BhcmNseW54LmxvIFwKLQlzcGFyY25ldGJzZC5sbyBcCi0Jc3Vub3MubG8gXAotCXZheG5ldGJzZC5sbyBcCi0JdmVyc2Fkb3MubG8gXAotCXZtcy5sbyBcCi0Jdm1zLWdzZC5sbyBcCi0Jdm1zLWhkci5sbyBcCi0Jdm1zLW1pc2MubG8gXAotCXZtcy10aXIubG8gXAotCXhjb2ZmbGluay5sbwotCi0KLUJGRDMyX0JBQ0tFTkRTX0NGSUxFUyA9IFwKLQlhb3V0LWFkb2JlLmMgXAotCWFvdXQtYXJtLmMgXAotCWFvdXQtbnMzMmsuYyBcCi0JYW91dC1zcGFyY2xlLmMgXAotCWFvdXQtdGljMzAuYyBcCi0JYW91dDAuYyBcCi0JYW91dDMyLmMgXAotCWJvdXQuYyBcCi0JY2YtaTM4Nmx5bnguYyBcCi0JY2YtbTY4a2x5bnguYyBcCi0JY2Ytc3BhcmNseW54LmMgXAotCWNvZmYtYTI5ay5jIFwKLQljb2ZmLWFwb2xsby5jIFwKLQljb2ZmLWFybS5jIFwKLQljb2ZmLWF1eC5jIFwKLQljb2ZmLWg4MzAwLmMgXAotCWNvZmYtaDg1MDAuYyBcCi0JY29mZi1pMzg2LmMgXAotCWNvZmYtaTg2MC5jIFwKLQljb2ZmLWdvMzIuYyBcCi0JY29mZi1pOTYwLmMgXAotCWNvZmYtbTY4ay5jIFwKLQljb2ZmLW04OGsuYyBcCi0JY29mZi1taXBzLmMgXAotCWNvZmYtcG1hYy5jIFwKLQljb2ZmLXJzNjAwMC5jIFwKLQljb2ZmLXNoLmMgXAotCWNvZmYtc3BhcmMuYyBcCi0JY29mZi1zdGdvMzIuYyBcCi0JY29mZi1zdm02OGsuYyBcCi0JY29mZi10aWMzMC5jIFwKLQljb2ZmLXRpYzgwLmMgXAotCWNvZmYtdTY4ay5jIFwKLQljb2ZmLXdlMzJrLmMgXAotCWNvZmYtdzY1LmMgXAotCWNvZmYtejhrLmMgXAotCWNvZmZsaW5rLmMgXAotCWR3YXJmMi5jIFwKLQllY29mZi5jIFwKLQllY29mZmxpbmsuYyBcCi0JZWxmLmMgXAotCWVsZjMyLWFyYy5jIFwKLQllbGZhcm0tb2FiaS5jIFwKLQllbGZhcm0tbmFiaS5jIFwKLQllbGYzMi1kMTB2LmMgXAotCWVsZjMyLWQzMHYuYyBcCi0JZWxmMzItZnIzMC5jIFwKLQllbGYzMi1nZW4uYyBcCi0JZWxmMzItaHBwYS5jIFwKLQllbGYzMi1pMzg2LmMgXAotCWVsZjMyLWk4NjAuYyBcCi0JZWxmMzItbTMyci5jIFwKLQllbGYzMi1tNjhrLmMgXAotCWVsZjMyLW04OGsuYyBcCi0JZWxmLW0xMDIwMC5jIFwKLQllbGYtbTEwMzAwLmMgXAotCWVsZjMyLW1jb3JlLmMgXAotCWVsZjMyLW1pcHMuYyBcCi0JZWxmMzItcHBjLmMgXAotCWVsZjMyLXNoLmMgXAotCWVsZjMyLXNwYXJjLmMgXAotCWVsZjMyLXY4NTAuYyBcCi0JZWxmMzIuYyBcCi0JZWxmbGluay5jIFwKLQlocDMwMGJzZC5jIFwKLQlocDMwMGhwdXguYyBcCi0Jc29tLmMgXAotCWkzODZhb3V0LmMgXAotCWkzODZic2QuYyBcCi0JaTM4NmR5bml4LmMgXAotCWkzODZmcmVlYnNkLmMgXAotCWkzODZsaW51eC5jIFwKLQlpMzg2bHlueC5jIFwKLQlpMzg2bXNkb3MuYyBcCi0JaTM4Nm5ldGJzZC5jIFwKLQlpMzg2bWFjaDMuYyBcCi0JaTM4Nm9zOWsuYyBcCi0JaWVlZS5jIFwKLQltNjhrNGtuZXRic2QuYyBcCi0JbTY4a2xpbnV4LmMgXAotCW02OGtseW54LmMgXAotCW02OGtuZXRic2QuYyBcCi0JbTg4a21hY2gzLmMgXAotCW1pcHNic2QuYyBcCi0JbmV3c29zMy5jIFwKLQlubG0uYyBcCi0JbmxtMzItaTM4Ni5jIFwKLQlubG0zMi1zcGFyYy5jIFwKLQlubG0zMi1wcGMuYyBcCi0JbmxtMzIuYyBcCi0JbnMzMmtuZXRic2QuYyBcCi0Jb2FzeXMuYyBcCi0JcGM1MzItbWFjaC5jIFwKLQlwZS1hcm0uYyBcCi0JcGVpLWFybS5jIFwKLQlwZS1pMzg2LmMgXAotCXBlaS1pMzg2LmMgXAotCXBlLW1jb3JlLmMgXAotCXBlaS1tY29yZS5jIFwKLQlwZS1wcGMuYyBcCi0JcGVpLXBwYy5jIFwKLQlwcGNib290LmMgXAotCXJlbG9jMTYuYyBcCi0JcmlzY2l4LmMgXAotCXNwYXJjbGludXguYyBcCi0Jc3BhcmNseW54LmMgXAotCXNwYXJjbmV0YnNkLmMgXAotCXN1bm9zLmMgXAotCXZheG5ldGJzZC5jIFwKLQl2ZXJzYWRvcy5jIFwKLQl2bXMuYyBcCi0Jdm1zLWdzZC5jIFwKLQl2bXMtaGRyLmMgXAotCXZtcy1taXNjLmMgXAotCXZtcy10aXIuYyBcCi0JeGNvZmZsaW5rLmMKLQotCi0jIFRoZSAubyBmaWxlcyBuZWVkZWQgYnkgYWxsIG9mIHRoZSA2NCBiaXQgdmVjdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIGludG8KLSMgdGFyZ2V0X3ZlY3RvciBpbiB0YXJnZXRzLmMgaWYgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLXRhcmdldHM9YWxsCi0jIGFuZCAtLWVuYWJsZS02NC1iaXQtYmZkLgotQkZENjRfQkFDS0VORFMgPSBcCi0JYW91dDY0LmxvIFwKLQljb2ZmLWFscGhhLmxvIFwKLQlkZW1vNjQubG8gXAotCWVsZjY0LWFscGhhLmxvIFwKLQllbGY2NC1nZW4ubG8gXAotCWVsZjY0LW1pcHMubG8gXAotCWVsZjY0LXNwYXJjLmxvIFwKLQllbGY2NC5sbyBcCi0JbmxtMzItYWxwaGEubG8gXAotCW5sbTY0LmxvCi0KLQotQkZENjRfQkFDS0VORFNfQ0ZJTEVTID0gXAotCWFvdXQ2NC5jIFwKLQljb2ZmLWFscGhhLmMgXAotCWRlbW82NC5jIFwKLQllbGY2NC1hbHBoYS5jIFwKLQllbGY2NC1nZW4uYyBcCi0JZWxmNjQtbWlwcy5jIFwKLQllbGY2NC1zcGFyYy5jIFwKLQllbGY2NC5jIFwKLQlubG0zMi1hbHBoYS5jIFwKLQlubG02NC5jCi0KLQotT1BUSU9OQUxfQkFDS0VORFMgPSBcCi0JYWl4Mzg2LWNvcmUubG8gXAotCWhwdXgtY29yZS5sbyBcCi0JaXJpeC1jb3JlLmxvIFwKLQlseW54LWNvcmUubG8gXAotCW9zZi1jb3JlLmxvIFwKLQlzY281LWNvcmUubG8gXAotCXRyYWQtY29yZS5sbyBcCi0JY2lzY28tY29yZS5sbwotCi0KLU9QVElPTkFMX0JBQ0tFTkRTX0NGSUxFUyA9IFwKLQlhaXgzODYtY29yZS5jIFwKLQlocHV4LWNvcmUuYyBcCi0JaXJpeC1jb3JlLmMgXAotCWx5bngtY29yZS5jIFwKLQlvc2YtY29yZS5jIFwKLQlzY281LWNvcmUuYyBcCi0JdHJhZC1jb3JlLmMgXAotCWNpc2NvLWNvcmUuYwotCi0KLSMgVGhlc2UgYXJlIGRlZmluZWQgYnkgY29uZmlndXJlLmluOgotV09SRFNJWkUgPSBAd29yZHNpemVACi1BTExfQkFDS0VORFMgPSBAYWxsX2JhY2tlbmRzQAotQkZEX0JBQ0tFTkRTID0gQGJmZF9iYWNrZW5kc0AKLUJGRF9NQUNISU5FUyA9IEBiZmRfbWFjaGluZXNACi1UREVGQVVMVFMgPSBAdGRlZmF1bHRzQAotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgQEhERUZJTkVTQCBAQ09SRUZMQUdAIEBUREVGSU5FU0AgJChDU0VBUkNIKSAkKENTV0lUQ0hFUykgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwKLQotIyBDIHNvdXJjZSBmaWxlcyB0aGF0IGNvcnJlc3BvbmQgdG8gLm8ncy4KLUNGSUxFUyA9IFwKLQkkKEJGRF9MSUJTX0NGSUxFUykgXAotCSQoQUxMX01BQ0hJTkVTX0NGSUxFUykgXAotCSQoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKSBcCi0JJChCRkQ2NF9CQUNLRU5EU19DRklMRVMpIFwKLQkkKE9QVElPTkFMX0JBQ0tFTkRTX0NGSUxFUykKLQotCi1TT1VSQ0VfSEZJTEVTID0gXAotCWFvdXQtdGFyZ2V0LmggYW91dGYxLmggYW91dHguaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmggXAotCWVjb2Zmc3dhcC5oIGVsZjMyLWhwcGEuaCBcCi0JZWxmY29kZS5oIGdlbmxpbmsuaCBnbzMyc3R1Yi5oIGhwcGFfc3R1YnMuaCBsaWJhb3V0LmggXAotCWxpYmJmZC5oIGxpYmNvZmYuaCBsaWJlY29mZi5oIGVsZi1iZmQuaCBsaWJocHBhLmggbGliaWVlZS5oIFwKLQlsaWJubG0uaCBsaWJvYXN5cy5oIG5ldGJzZC5oIG5sbS10YXJnZXQuaCBubG1jb2RlLmggbnMzMmsuaCBcCi0Jc29tLmggdm1zLmgKLQotCi1IRklMRVMgPSBcCi0JZWxmMzItdGFyZ2V0LmggZWxmNjQtdGFyZ2V0LmggdGFyZ21hdGNoLmggXAotCSQoU09VUkNFX0hGSUxFUykKLQotCi1QT1RGSUxFUyA9ICQoQ0ZJTEVTKSAkKFNPVVJDRV9IRklMRVMpCi0KLSMgVmFyaW91cyBraW5kcyBvZiAubyBmaWxlcyB0byBwdXQgaW4gbGliYmZkLmE6Ci0jIEJGRF9CQUNLRU5EUwlSb3V0aW5lcyB0aGUgY29uZmlndXJlZCB0YXJnZXRzIG5lZWQuCi0jIEJGRF9NQUNISU5FUwlBcmNoaXRlY3R1cmUtc3BlY2lmaWMgcm91dGluZXMgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cyBuZWVkLgotIyBDT1JFRklMRQlDb3JlIGZpbGUgcm91dGluZXMgZm9yIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24KLU9GSUxFUyA9ICQoQkZEX0JBQ0tFTkRTKSAkKEJGRF9NQUNISU5FUykgQENPUkVGSUxFQAotCi1saWJiZmRfbGFfU09VUkNFUyA9ICQoQkZEX0xJQlNfQ0ZJTEVTKQotbGliYmZkX2xhX0RFUEVOREVOQ0lFUyA9ICQoT0ZJTEVTKSBvZmlsZXMKLWxpYmJmZF9sYV9MSUJBREQgPSBgY2F0IG9maWxlc2AgQFdJTjMyTElCQUREQAotbGliYmZkX2xhX0xERkxBR1MgPSAtcmVsZWFzZSAkKFZFUlNJT04pIEBXSU4zMkxERkxBR1NACi0KLSMgbGlidG9vbCB3aWxsIGJ1aWxkIC5saWJzL2xpYmJmZC5hLiAgV2UgY3JlYXRlIGxpYmJmZC5hIGluIHRoZSBidWlsZAotIyBkaXJlY3Rvcnkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNvbnZlcnQgYWxsIHRoZSBwcm9ncmFtcyB0aGF0IHVzZQotIyBsaWJiZmQuYSBzaW11bHRhbmVvdXNseS4gIFRoaXMgaXMgYSBoYWNrIHdoaWNoIHNob3VsZCBiZSByZW1vdmVkIGlmCi0jIGV2ZXJ5dGhpbmcgZWxzZSBzdGFydHMgdXNpbmcgbGlidG9vbC4gIEZJWE1FLgotCi1ub2luc3RfTElCUkFSSUVTID0gbGliYmZkLmEKLWxpYmJmZF9hX1NPVVJDRVMgPSAKLQotQkZEX0hfREVQUyA9ICQoSU5DRElSKS9hbnNpZGVjbC5oCi1MT0NBTF9IX0RFUFMgPSBsaWJiZmQuaCBzeXNkZXAuaCBjb25maWcuaAotCi1CRkRfSF9GSUxFUyA9IGJmZC1pbi5oIGluaXQuYyBvcG5jbHMuYyBsaWJiZmQuYyBzZWN0aW9uLmMgYXJjaHVyZXMuYyBcCi0JcmVsb2MuYyBzeW1zLmMgYmZkLmMgYXJjaGl2ZS5jIGNvcmVmaWxlLmMgdGFyZ2V0cy5jIGZvcm1hdC5jCi0KLUxJQkJGRF9IX0ZJTEVTID0gbGliYmZkLWluLmggaW5pdC5jIGxpYmJmZC5jIGNhY2hlLmMgcmVsb2MuYyBhcmNodXJlcy5jIGVsZi5jCi1MSUJDT0ZGX0hfRklMRVMgPSBsaWJjb2ZmLWluLmggY29mZmNvZGUuaAotCi1NT1NUTFlDTEVBTkZJTEVTID0gZWxmMzItdGFyZ2V0LmggZWxmNjQtdGFyZ2V0Lmggb2ZpbGVzIHN0YW1wLW9maWxlcyBcCi0JdGFyZ21hdGNoLmgKLQotCi1DTEVBTkZJTEVTID0gYmZkLmggZGVwLnNlZCBzdG1wLWJmZC1oIC5kZXAgLmRlcDEgbGliYmZkLmEgc3RhbXAtbGliIFwKLQlzdG1wLWJpbjItaCBzdG1wLWxiZmQtaCBzdG1wLWxjb2ZmLWgKLQotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSAgYmZkLWluMy5oCi1MSUJSQVJJRVMgPSAgJChub2luc3RfTElCUkFSSUVTKQotCi0KLURFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJTID0gQExJQlNACi1saWJiZmRfYV9MSUJBREQgPSAKLWxpYmJmZF9hX09CSkVDVFMgPSAKLUxUTElCUkFSSUVTID0gICQobGliX0xUTElCUkFSSUVTKQotCi1saWJiZmRfbGFfT0JKRUNUUyA9ICBhcmNoaXZlLmxvIGFyY2h1cmVzLmxvIGJmZC5sbyBjYWNoZS5sbyBjb2ZmZ2VuLmxvIFwKLWNvcmVmaWxlLmxvIGZvcm1hdC5sbyBpbml0LmxvIGxpYmJmZC5sbyBvcG5jbHMubG8gcmVsb2MubG8gc2VjdGlvbi5sbyBcCi1zeW1zLmxvIHRhcmdldHMubG8gaGFzaC5sbyBsaW5rZXIubG8gc3JlYy5sbyBiaW5hcnkubG8gdGVraGV4LmxvIFwKLWloZXgubG8gc3RhYnMubG8gc3RhYi1zeW1zLmxvCi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAKLURJU1RfQ09NTU9OID0gIFJFQURNRSAuL3N0YW1wLWguaW4gQ09QWUlORyBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gXAotTWFrZWZpbGUuaW4gVE9ETyBhY2luY2x1ZGUubTQgYWNsb2NhbC5tNCBiZmQtaW4yLmggY29uZmlnLmluIGNvbmZpZ3VyZSBcCi1jb25maWd1cmUuaW4KLQotCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotCi1UQVIgPSB0YXIKLUdaSVBfRU5WID0gLS1iZXN0Ci1TT1VSQ0VTID0gJChsaWJiZmRfYV9TT1VSQ0VTKSAkKGxpYmJmZF9sYV9TT1VSQ0VTKQotT0JKRUNUUyA9ICQobGliYmZkX2FfT0JKRUNUUykgJChsaWJiZmRfbGFfT0JKRUNUUykKLQotYWxsOiBhbGwtcmVkaXJlY3QKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLlMgLmMgLmxvIC5vIC5zCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluICBhY2luY2x1ZGUubTQKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQotJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0KLWNvbmZpZy5oOiBzdGFtcC1oCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mIHN0YW1wLWg7IFwKLQkJJChNQUtFKSBzdGFtcC1oOyBcCi0JZWxzZSA6OyBmaQotc3RhbXAtaDogJChzcmNkaXIpL2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiBcCi0JICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAotJChzcmNkaXIpL2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQllbHNlIDo7IGZpCi0kKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKLQotbW9zdGx5Y2xlYW4taGRyOgotCi1jbGVhbi1oZHI6Ci0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oCi0KLW1haW50YWluZXItY2xlYW4taGRyOgotYmZkLWluMy5oOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyBiZmQtaW4yLmgKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgQ09ORklHX0ZJTEVTPSRAOmJmZC1pbjIuaCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLW1vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQotY2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCS10ZXN0IC16ICIkKG5vaW5zdF9MSUJSQVJJRVMpIiB8fCBybSAtZiAkKG5vaW5zdF9MSUJSQVJJRVMpCi0KLWRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0KLW1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCi0uYy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLnMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLm8gY29yZSAqLmNvcmUKLQotY2xlYW4tY29tcGlsZToKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlOgotCi0uYy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLnMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1kaXN0Y2xlYW4tbGlidG9vbDoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sOgotCi1tb3N0bHljbGVhbi1saWJMVExJQlJBUklFUzoKLQotY2xlYW4tbGliTFRMSUJSQVJJRVM6Ci0JLXRlc3QgLXogIiQobGliX0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChsaWJfTFRMSUJSQVJJRVMpCi0KLWRpc3RjbGVhbi1saWJMVExJQlJBUklFUzoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUzoKLQotaW5zdGFsbC1saWJMVExJQlJBUklFUzogJChsaWJfTFRMSUJSQVJJRVMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpCi0JQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQkcCAkKERFU1RESVIpJChsaWJkaXIpLyQkcCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkJHAgJChERVNURElSKSQobGliZGlyKS8kJHA7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1saWJMVExJQlJBUklFUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgJChMSUJUT09MKSAgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpLyQkcDsgXAotCWRvbmUKLQotbGliYmZkLmxhOiAkKGxpYmJmZF9sYV9PQkpFQ1RTKSAkKGxpYmJmZF9sYV9ERVBFTkRFTkNJRVMpCi0JJChMSU5LKSAtcnBhdGggJChsaWJkaXIpICQobGliYmZkX2xhX0xERkxBR1MpICQobGliYmZkX2xhX09CSkVDVFMpICQobGliYmZkX2xhX0xJQkFERCkgJChMSUJTKQotCi0jIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAotIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCi0jIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCi0jICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKLSMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7Ci0jICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgotCi1AU0VUX01BS0VACi0KLWFsbC1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLWluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAotY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgZG90X3NlZW49eWVzOyBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKLQlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXJldj0nJzsgbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gIi4iICYmIGRvdF9zZWVuPXllczsgXAotCWRvbmU7IFwKLQl0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyIgJiYgcmV2PSIuICQkcmV2IjsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKLXRhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi0KLXRhZ3M6IFRBR1MKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCWhlcmU9YHB3ZGAgJiYgY2QgJChzcmNkaXIpIFwKLQkgICYmIG1raWQgLWYkJGhlcmUvSUQgJCR1bmlxdWUgJChMSVNQKQotCi1UQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmluICQoVEFHU19ERVBFTkRFTkNJRVMpICQoTElTUCkKLQl0YWdzPTsgXAotCWhlcmU9YHB3ZGA7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLSAgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCi0gICBmaTsgXAotCWRvbmU7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JdGVzdCAteiAiJChFVEFHU19BUkdTKWNvbmZpZy5pbiQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAotCSAgfHwgKGNkICQoc3JjZGlyKSAmJiBldGFncyAkKEVUQUdTX0FSR1MpICQkdGFncyBjb25maWcuaW4gJCR1bmlxdWUgJChMSVNQKSAtbyAkJGhlcmUvVEFHUykKLQotbW9zdGx5Y2xlYW4tdGFnczoKLQotY2xlYW4tdGFnczoKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQKLQotbWFpbnRhaW5lci1jbGVhbi10YWdzOgotCi1kaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCi10b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKLQotIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgotIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgotIyB0YXJmaWxlLgotZGlzdGNoZWNrOiBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgenhmICQoZGlzdGRpcikudGFyLmd6Ci0JbWtkaXIgJChkaXN0ZGlyKS89YnVpbGQKLQlta2RpciAkKGRpc3RkaXIpLz1pbnN0Ci0JZGNfaW5zdGFsbF9iYXNlPWBjZCAkKGRpc3RkaXIpLz1pbnN0ICYmIHB3ZGA7IFwKLQljZCAkKGRpc3RkaXIpLz1idWlsZCBcCi0JICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9JCRkY19pbnN0YWxsX2Jhc2UgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlAYmFubmVyPSIkKGRpc3RkaXIpLnRhci5neiBpcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uIjsgXAotCWRhc2hlcz1gZWNobyAiJCRiYW5uZXIiIHwgc2VkIHMvLi89L2dgOyBcCi0JZWNobyAiJCRkYXNoZXMiOyBcCi0JZWNobyAiJCRiYW5uZXIiOyBcCi0JZWNobyAiJCRkYXNoZXMiCi1kaXN0OiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdC1hbGw6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQktcm0gLXJmICQoZGlzdGRpcikKLQlta2RpciAkKGRpc3RkaXIpCi0JLWNobW9kIDc3NyAkKGRpc3RkaXIpCi0JQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgY3AgLXByICQkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAotCSAgZmk7IFwKLQlkb25lCi0JZm9yIHN1YmRpciBpbiAkKFNVQkRJUlMpOyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1kICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBta2RpciAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICAgIGNobW9kIDc3NyAkKGRpc3RkaXIpLyQkc3ViZGlyOyBcCi0JICAgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0uLi8kKGRpc3RkaXIpIGRpc3RkaXI9Li4vJChkaXN0ZGlyKS8kJHN1YmRpciBkaXN0ZGlyKSBcCi0JICAgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLWluZm8tYW06Ci1pbmZvOiBpbmZvLXJlY3Vyc2l2ZQotZHZpLWFtOgotZHZpOiBkdmktcmVjdXJzaXZlCi1jaGVjay1hbToKLWNoZWNrOiBjaGVjay1yZWN1cnNpdmUKLWluc3RhbGxjaGVjay1hbToKLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbC1pbmZvLWFtOiAKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQotYWxsLXJlY3Vyc2l2ZS1hbTogY29uZmlnLmgKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCi0KLWluc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1saWJMVExJQlJBUklFUwotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCi0KLWluc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1kYXRhLWxvY2FsCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLWluc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCi11bmluc3RhbGwtYW06IHVuaW5zdGFsbC1saWJMVExJQlJBUklFUwotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoTElCUkFSSUVTKSAkKExUTElCUkFSSUVTKSBjb25maWcuaAotYWxsLXJlZGlyZWN0OiBhbGwtcmVjdXJzaXZlLWFtCi1pbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUz0tcyBpbnN0YWxsCi1pbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCi1pbnN0YWxsZGlycy1hbToKLQkkKG1raW5zdGFsbGRpcnMpICAkKERFU1RESVIpJChsaWJkaXIpCi0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChNT1NUTFlDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNT1NUTFlDTEVBTkZJTEVTKQotCi1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCi0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLW1vc3RseWNsZWFuLWFtOiAgbW9zdGx5Y2xlYW4taGRyIG1vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUyBcCi0JCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCi0JCW1vc3RseWNsZWFuLWxpYkxUTElCUkFSSUVTIG1vc3RseWNsZWFuLXRhZ3MgXAotCQltb3N0bHljbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKLQotY2xlYW4tYW06ICBjbGVhbi1oZHIgY2xlYW4tbm9pbnN0TElCUkFSSUVTIGNsZWFuLWNvbXBpbGUgY2xlYW4tbGlidG9vbCBcCi0JCWNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLXRhZ3MgY2xlYW4tZ2VuZXJpYyBcCi0JCW1vc3RseWNsZWFuLWFtCi0KLWNsZWFuOiBjbGVhbi1yZWN1cnNpdmUKLQotZGlzdGNsZWFuLWFtOiAgZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tbm9pbnN0TElCUkFSSUVTIGRpc3RjbGVhbi1jb21waWxlIFwKLQkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYkxUTElCUkFSSUVTIFwKLQkJZGlzdGNsZWFuLXRhZ3MgZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tYW0KLQktcm0gLWYgbGlidG9vbAotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi1tYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotCQltYWludGFpbmVyLWNsZWFuLW5vaW5zdExJQlJBUklFUyBcCi0JCW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgXAotCQltYWludGFpbmVyLWNsZWFuLWxpYkxUTElCUkFSSUVTIG1haW50YWluZXItY2xlYW4tdGFncyBcCi0JCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tYW0KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi0uUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCi1tb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVMgZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUyBcCi1jbGVhbi1ub2luc3RMSUJSQVJJRVMgbWFpbnRhaW5lci1jbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotbW9zdGx5Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tY29tcGlsZSBjbGVhbi1jb21waWxlIFwKLW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJ0b29sIFwKLWNsZWFuLWxpYnRvb2wgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWxpYkxUTElCUkFSSUVTIFwKLWRpc3RjbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi1saWJMVExJQlJBUklFUyBcCi1tYWludGFpbmVyLWNsZWFuLWxpYkxUTElCUkFSSUVTIHVuaW5zdGFsbC1saWJMVExJQlJBUklFUyBcCi1pbnN0YWxsLWxpYkxUTElCUkFSSUVTIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgdW5pbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKLWluc3RhbGwtZXhlYy1yZWN1cnNpdmUgdW5pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBcCi11bmluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmUgXAotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlIHRhZ3MgdGFncy1yZWN1cnNpdmUgbW9zdGx5Y2xlYW4tdGFncyBcCi1kaXN0Y2xlYW4tdGFncyBjbGVhbi10YWdzIG1haW50YWluZXItY2xlYW4tdGFncyBkaXN0ZGlyIGluZm8tYW0gaW5mbyBcCi1kdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgaW5zdGFsbC1pbmZvLWFtIFwKLWluc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMgXAotaW5zdGFsbC1kYXRhLWxvY2FsIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBpbnN0YWxsIFwKLXVuaW5zdGFsbC1hbSB1bmluc3RhbGwgYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gXAotaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIFwKLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi0KLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLWRpc3RzdHVmZjogaW5mbwotCi1zdGFtcC1vZmlsZXM6IE1ha2VmaWxlCi0Jcm0gLWYgdG9maWxlcwotCWY9IiI7IFwKLQlmb3IgaSBpbiAkKE9GSUxFUykgOyBkbyBcCi0JICBjYXNlICIgJCRmICIgaW4gXAotCSAgICAqIiAkJGkgIiopIDs7IFwKLQkgICAgKikgZj0iJCRmICQkaSIgOzsgXAotCSAgZXNhYyA7IFwKLQlkb25lIDsgXAotCWVjaG8gJCRmID4gdG9maWxlcwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0b2ZpbGVzIG9maWxlcwotCXRvdWNoIHN0YW1wLW9maWxlcwotCi1vZmlsZXM6IHN0YW1wLW9maWxlcyA7IEB0cnVlCi0KLXN0YW1wLWxpYjogbGliYmZkLmxhCi0JaWYgWyAtZiAubGlicy9saWJiZmQuYSBdOyB0aGVuIFwKLQkgIGNwIC5saWJzL2xpYmJmZC5hIGxpYmJmZC50bXA7IFwKLQkgICQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJiZmQudG1wIGxpYmJmZC5hOyBcCi0JZWxzZSB0cnVlOyBmaQotCXRvdWNoIHN0YW1wLWxpYgotCi1saWJiZmQuYTogc3RhbXAtbGliIDsgQHRydWUKLQotIyBUaGlzIGZpbGUgaG9sZHMgYW4gYXJyYXkgYXNzb2NpYXRpbmcgY29uZmlndXJhdGlvbiB0cmlwbGV0cyBhbmQKLSMgdmVjdG9yIG5hbWVzLiAgSXQgaXMgYnVpbHQgZnJvbSBjb25maWcuYmZkLiAgSXQgaXMgbm90IGNvbXBpbGVkIGJ5Ci0jIGl0c2VsZiwgYnV0IGlzIGluY2x1ZGVkIGJ5IHRhcmdldHMuYy4KLXRhcmdtYXRjaC5oOiBjb25maWcuYmZkIHRhcmdtYXRjaC5zZWQKLQlybSAtZiB0YXJnbWF0Y2guaAotCXNlZCAtZiAkKHNyY2RpcikvdGFyZ21hdGNoLnNlZCA8ICQoc3JjZGlyKS9jb25maWcuYmZkID4gdGFyZ21hdGNoLm5ldwotCW12IC1mIHRhcmdtYXRjaC5uZXcgdGFyZ21hdGNoLmgKLQotIyBXaGVuIGNvbXBpbGluZyBhcmNodXJlcy5jIGFuZCB0YXJnZXRzLmMsIHN1cHBseSB0aGUgZGVmYXVsdCB0YXJnZXQKLSMgaW5mbyBmcm9tIGNvbmZpZ3VyZS4KLQotdGFyZ2V0cy5sbzogdGFyZ2V0cy5jIGNvbmZpZy5zdGF0dXMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJChUREVGQVVMVFMpICQoc3JjZGlyKS90YXJnZXRzLmMKLQotYXJjaHVyZXMubG86IGFyY2h1cmVzLmMgY29uZmlnLnN0YXR1cwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkKFRERUZBVUxUUykgJChzcmNkaXIpL2FyY2h1cmVzLmMKLQotZWxmMzItdGFyZ2V0LmggOiBlbGZ4eC10YXJnZXQuaAotCXJtIC1mIGVsZjMyLXRhcmdldC5oCi0Jc2VkIC1lIHMvTk4vMzIvZyA8ICQoc3JjZGlyKS9lbGZ4eC10YXJnZXQuaCA+IGVsZjMyLXRhcmdldC5uZXcKLQltdiAtZiBlbGYzMi10YXJnZXQubmV3IGVsZjMyLXRhcmdldC5oCi0KLWVsZjY0LXRhcmdldC5oIDogZWxmeHgtdGFyZ2V0LmgKLQlybSAtZiBlbGY2NC10YXJnZXQuaAotCXNlZCAtZSBzL05OLzY0L2cgPCAkKHNyY2RpcikvZWxmeHgtdGFyZ2V0LmggPiBlbGY2NC10YXJnZXQubmV3Ci0JbXYgLWYgZWxmNjQtdGFyZ2V0Lm5ldyBlbGY2NC10YXJnZXQuaAotJChCRkRfTElCUyk6ICQoQkZEX0gpICQoQkZEX0hfREVQUykgJChMT0NBTF9IX0RFUFMpCi0kKEJGRF9NQUNISU5FUyk6ICQoQkZEX0gpICQoQkZEX0hfREVQUykgJChMT0NBTF9IX0RFUFMpCi0kKEJGRF9CQUNLRU5EUyk6ICQoQkZEX0gpICQoQkZEX0hfREVQUykgJChMT0NBTF9IX0RFUFMpCi0kKE9QVElPTkFMX0JBQ0tFTkRTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLQotIyBJbnN0YWxsIEJGRCBpbmNsdWRlIGZpbGUsIGFuZCBvdGhlcnMgdGhhdCBpdCBuZWVkcy4KLWluc3RhbGwtZGF0YS1sb2NhbDogJChCRkRfSCkKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoaW5jbHVkZWRpcikKLQkkKElOU1RBTExfREFUQSkgJChCRkRfSCkgJChpbmNsdWRlZGlyKS9iZmQuaAotCSQoSU5TVEFMTF9EQVRBKSAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKGluY2x1ZGVkaXIpL2Fuc2lkZWNsLmgKLQkkKElOU1RBTExfREFUQSkgJChJTkNESVIpL2JmZGxpbmsuaCAkKGluY2x1ZGVkaXIpL2JmZGxpbmsuaAotCi0jIEhhdmUgdG8gZ2V0IHJpZCBvZiAuZGVwMSBoZXJlIHNvIHRoYXQgIiQ/IiBsYXRlciBpbmNsdWRlcyBhbGwgb2YgJChDRklMRVMpLgotLmRlcDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpIGJmZC5oCi0Jcm0gLWYgLmRlcDEKLQkkKE1BS0UpIERFUD0kKERFUCkgLmRlcDEKLQlzZWQgLWYgZGVwLnNlZCA8LmRlcDEgPi5kZXAKLQotIyBUaGlzIHJ1bGUgcmVhbGx5IHdhbnRzIGEgbWtkZXAgdGhhdCBydW5zICJnY2MgLU1NIi4KLSMgVGhlIE5ldEJTRCBta2RlcCBvdmVyd3JpdGVzIGFueSBleGlzdGluZyBmaWxlIGNvbnRlbnRzLCBhbmQgZG9lc24ndCBpbnNlcnQKLSMgdGhlICJETyBOT1QgREVMRVRFIiBsaW5lLgotIyBPdGhlciBta2RlcCB2ZXJzaW9ucyByZXF1aXJlIGEgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzLCBhbmQgZG8gaW5zZXJ0IGl0LgotIyBIZW5jZSB0aGUgd2VpcmRuZXNzLi4uLgotLmRlcDE6ICQoQ0ZJTEVTKQotCXJtIC1mIC5kZXAyIC5kZXAyYQotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDIKLQllY2hvID4gLmRlcDJhCi0JJChERVApIC1mIC5kZXAyYSAkKElOQ0xVREVTKSAkKENGTEFHUykgJD8KLQlzZWQgLWUgJy9ETyBOT1QgREVMRVRFL2QnIC1lICcvXiQkL2QnIDwgLmRlcDJhID4+IC5kZXAyCi0Jcm0gLWYgLmRlcDJhCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIC5kZXAyIC5kZXAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFAQkZEX0hAISQoQkZEX0gpIScJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCi0KLWRlcDogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgTWFrZWZpbGUgPiB0bXAtTWFrZWZpbGUKLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmluCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5pbiAkKHNyY2RpcikvTWFrZWZpbGUuaW4KLQotZGVwLWFtOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi1ob3N0LWFvdXQubG86IE1ha2VmaWxlCi0KLSMgVGhlIGZvbGxvd2luZyBwcm9ncmFtIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgc2ltcGxlIGNvbmZpZyBmaWxlCi0jIHdoaWNoIGNhbiBiZSBmb2xkZWQgaW50byBhbiBoLVhYWCBmaWxlIGZvciBhIG5ldyBob3N0LCB3aXRoIHNvbWUgZWRpdGluZy4KLWFvdXQtcGFyYW1zLmg6IGdlbi1hb3V0Ci0JLi9nZW4tYW91dCBob3N0ID4gYW91dC1wYXJhbXMuaAotZ2VuLWFvdXQ6ICQoc3JjZGlyKS9nZW4tYW91dC5jIE1ha2VmaWxlCi0JJChDQykgLW8gZ2VuLWFvdXQgJChDRkxBR1MpICQoTEZMQUdTKSAkKHNyY2RpcikvZ2VuLWFvdXQuYwotCi0kKEJGRF9IKTogc3RtcC1iZmQtaCA7IEB0cnVlCi0KLXN0bXAtYmZkLWg6IGJmZC1pbjMuaAotCXJtIC1mIGJmZC10bXAuaAotCWNwIGJmZC1pbjMuaCBiZmQtdG1wLmgKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLXRtcC5oICQoQkZEX0gpCi0Jcm0gLWYgYmZkLXRtcC5oCi0JdG91Y2ggc3RtcC1iZmQtaAotCi0jIENvdWxkIHJlYWxseSB1c2UgYSAiY29weS1pZi1jaGFuZ2UiLi4uCi1oZWFkZXJzOgotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgcHJvdG9zICQoRkxBR1NfVE9fUEFTUykpCi0JY3AgJChkb2NkaXIpL2JmZC5oIGJmZC1pbjIuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLWluMi5oLW5ldyAkKHNyY2RpcikvYmZkLWluMi5oCi0JY3AgJChkb2NkaXIpL2xpYmJmZC5oIGxpYmJmZC5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJiZmQuaC1uZXcgJChzcmNkaXIpL2xpYmJmZC5oCi0JY3AgJChkb2NkaXIpL2xpYmNvZmYuaCBsaWJjb2ZmLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmNvZmYuaC1uZXcgJChzcmNkaXIpL2xpYmNvZmYuaAotCi0jIFdlIG9ubHkgcmVidWlsZCB0aGUgaGVhZGVyIGZpbGVzIGF1dG9tYXRpY2FsbHkgaWYgd2UgaGF2ZSBiZWVuCi0jIGNvbmZpZ3VyZWQgd2l0aCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUuCi0KLSQoc3JjZGlyKS9iZmQtaW4yLmg6IEBNQUlOVEAgc3RtcC1iaW4yLWggOyBAdHJ1ZQotc3RtcC1iaW4yLWg6ICQoQkZEX0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGJmZC5oKQotCWNwICQoZG9jZGlyKS9iZmQuaCBiZmQtaW4yLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGJmZC1pbjIuaC1uZXcgJChzcmNkaXIpL2JmZC1pbjIuaAotCXRvdWNoIHN0bXAtYmluMi1oCi0KLSQoc3JjZGlyKS9saWJiZmQuaDogQE1BSU5UQCBzdG1wLWxiZmQtaCA7IEB0cnVlCi1zdG1wLWxiZmQtaDogJChMSUJCRkRfSF9GSUxFUykKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgbGliYmZkLmgpCi0JY3AgJChkb2NkaXIpL2xpYmJmZC5oIGxpYmJmZC5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJiZmQuaC1uZXcgJChzcmNkaXIpL2xpYmJmZC5oCi0JdG91Y2ggc3RtcC1sYmZkLWgKLQotJChzcmNkaXIpL2xpYmNvZmYuaDogQE1BSU5UQCBzdG1wLWxjb2ZmLWggOyBAdHJ1ZQotc3RtcC1sY29mZi1oOiAkKExJQkNPRkZfSF9GSUxFUykKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgbGliY29mZi5oKQotCWNwICQoZG9jZGlyKS9saWJjb2ZmLmggbGliY29mZi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJjb2ZmLmgtbmV3ICQoc3JjZGlyKS9saWJjb2ZmLmgKLQl0b3VjaCBzdG1wLWxjb2ZmLWgKLQotIyBXZSB3YW50IHRvIHJlcnVuIGNvbmZpZ3VyZSBpZiBjb25maWcuYmZkIG9yIGNvbmZpZ3VyZS5ob3N0IGNoYW5nZS4KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpL2NvbmZpZy5iZmQgJChzcmNkaXIpL2NvbmZpZ3VyZS5ob3N0Ci0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi0KLWVsZmFybS1vYWJpLmxvOiBlbGZhcm0tb2FiaS5jIGVsZjMyLWFybS5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotZWxmYXJtLW5hYmkubG86IGVsZmFybS1uYWJpLmMgZWxmMzItYXJtLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLWFyY2hpdmUubG86IGFyY2hpdmUuYyAkKElOQ0RJUikvYW91dC9hci5oICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oCi1hcmNodXJlcy5sbzogYXJjaHVyZXMuYwotYmZkLmxvOiBiZmQuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggbGliY29mZi5oIFwKLSAgbGliZWNvZmYuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAotY2FjaGUubG86IGNhY2hlLmMKLWNvZmZnZW4ubG86IGNvZmZnZW4uYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLWNvcmVmaWxlLmxvOiBjb3JlZmlsZS5jCi1mb3JtYXQubG86IGZvcm1hdC5jCi1pbml0LmxvOiBpbml0LmMKLWxpYmJmZC5sbzogbGliYmZkLmMKLW9wbmNscy5sbzogb3BuY2xzLmMgJChJTkNESVIpL29iamFsbG9jLmgKLXJlbG9jLmxvOiByZWxvYy5jICQoSU5DRElSKS9iZmRsaW5rLmgKLXNlY3Rpb24ubG86IHNlY3Rpb24uYyAkKElOQ0RJUikvYmZkbGluay5oCi1zeW1zLmxvOiBzeW1zLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXRhcmdldHMubG86IHRhcmdldHMuYyAkKElOQ0RJUikvZm5tYXRjaC5oIHRhcmdtYXRjaC5oCi1oYXNoLmxvOiBoYXNoLmMgJChJTkNESVIpL29iamFsbG9jLmgKLWxpbmtlci5sbzogbGlua2VyLmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmgKLXNyZWMubG86IHNyZWMuYyAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWJpbmFyeS5sbzogYmluYXJ5LmMKLXRla2hleC5sbzogdGVraGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCi1paGV4LmxvOiBpaGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zdGFicy5sbzogc3RhYnMuYyAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1zdGFiLXN5bXMubG86IHN0YWItc3ltcy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLWNwdS1hMjlrLmxvOiBjcHUtYTI5ay5jCi1jcHUtYWxwaGEubG86IGNwdS1hbHBoYS5jCi1jcHUtYXJjLmxvOiBjcHUtYXJjLmMKLWNwdS1hcm0ubG86IGNwdS1hcm0uYwotY3B1LWQxMHYubG86IGNwdS1kMTB2LmMKLWNwdS1kMzB2LmxvOiBjcHUtZDMwdi5jCi1jcHUtZnIzMC5sbzogY3B1LWZyMzAuYwotY3B1LWg4MzAwLmxvOiBjcHUtaDgzMDAuYwotY3B1LWg4NTAwLmxvOiBjcHUtaDg1MDAuYwotY3B1LWhwcGEubG86IGNwdS1ocHBhLmMKLWNwdS1pMzg2LmxvOiBjcHUtaTM4Ni5jCi1jcHUtaTg2MC5sbzogY3B1LWk4NjAuYwotY3B1LWk5NjAubG86IGNwdS1pOTYwLmMKLWNwdS1tMzJyLmxvOiBjcHUtbTMyci5jCi1jcHUtbTY4ay5sbzogY3B1LW02OGsuYwotY3B1LW04OGsubG86IGNwdS1tODhrLmMKLWNwdS1tMTAyMDAubG86IGNwdS1tMTAyMDAuYwotY3B1LW0xMDMwMC5sbzogY3B1LW0xMDMwMC5jCi1jcHUtbWNvcmUubG86IGNwdS1tY29yZS5jCi1jcHUtbWlwcy5sbzogY3B1LW1pcHMuYwotY3B1LW5zMzJrLmxvOiBjcHUtbnMzMmsuYyBuczMyay5oCi1jcHUtcG93ZXJwYy5sbzogY3B1LXBvd2VycGMuYwotY3B1LXJzNjAwMC5sbzogY3B1LXJzNjAwMC5jCi1jcHUtc2gubG86IGNwdS1zaC5jCi1jcHUtc3BhcmMubG86IGNwdS1zcGFyYy5jCi1jcHUtdGljMzAubG86IGNwdS10aWMzMC5jCi1jcHUtdGljODAubG86IGNwdS10aWM4MC5jCi1jcHUtdjg1MC5sbzogY3B1LXY4NTAuYwotY3B1LXZheC5sbzogY3B1LXZheC5jCi1jcHUtd2UzMmsubG86IGNwdS13ZTMyay5jCi1jcHUtdzY1LmxvOiBjcHUtdzY1LmMKLWNwdS16OGsubG86IGNwdS16OGsuYwotYW91dC1hZG9iZS5sbzogYW91dC1hZG9iZS5jICQoSU5DRElSKS9hb3V0L2Fkb2JlLmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLWFvdXQtYXJtLmxvOiBhb3V0LWFybS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dHguaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCi1hb3V0LW5zMzJrLmxvOiBhb3V0LW5zMzJrLmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICBuczMyay5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1hb3V0LXNwYXJjbGUubG86IGFvdXQtc3BhcmNsZS5jICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsaWJhb3V0LmggYW91dGYxLmggJChJTkNESVIpL2FvdXQvc3VuNC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotYW91dC10aWMzMC5sbzogYW91dC10aWMzMC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmggYW91dHguaAotYW91dDAubG86IGFvdXQwLmMgYW91dGYxLmggJChJTkNESVIpL2FvdXQvc3VuNC5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotYW91dDMyLmxvOiBhb3V0MzIuYyBhb3V0eC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmgKLWJvdXQubG86IGJvdXQuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCAkKElOQ0RJUikvYm91dC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBsaWJhb3V0LmgKLWNmLWkzODZseW54LmxvOiBjZi1pMzg2bHlueC5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNmLW02OGtseW54LmxvOiBjZi1tNjhrbHlueC5jIGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNmLXNwYXJjbHlueC5sbzogY2Ytc3BhcmNseW54LmMgY29mZi1zcGFyYy5jICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWEyOWsubG86IGNvZmYtYTI5ay5jICQoSU5DRElSKS9jb2ZmL2EyOWsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWFwb2xsby5sbzogY29mZi1hcG9sbG8uYyAkKElOQ0RJUikvY29mZi9hcG9sbG8uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYXJtLmxvOiBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYXV4LmxvOiBjb2ZmLWF1eC5jICQoSU5DRElSKS9jb2ZmL2F1eC1jb2ZmLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL202OGsuaCBjb2ZmLW02OGsuYyBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1oODMwMC5sbzogY29mZi1oODMwMC5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaDgzMDAuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1oODUwMC5sbzogY29mZi1oODUwMC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1pMzg2LmxvOiBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1pODYwLmxvOiBjb2ZmLWk4NjAuYyAkKElOQ0RJUikvY29mZi9pODYwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1nbzMyLmxvOiBjb2ZmLWdvMzIuYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWk5NjAubG86IGNvZmYtaTk2MC5jICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLW02OGsubG86IGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLW04OGsubG86IGNvZmYtbTg4ay5jICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLW1pcHMubG86IGNvZmYtbWlwcy5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL21pcHMuaCBsaWJjb2ZmLmggbGliZWNvZmYuaCBjb2Zmc3dhcC5oIFwKLSAgZWNvZmZzd2FwLmgKLWNvZmYtcG1hYy5sbzogY29mZi1wbWFjLmMgY29mZi1yczYwMDAuYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvcnM2MDAwLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtcnM2MDAwLmxvOiBjb2ZmLXJzNjAwMC5jICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9yczYwMDAuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1zaC5sbzogY29mZi1zaC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvc2guaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1zcGFyYy5sbzogY29mZi1zcGFyYy5jICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXN0Z28zMi5sbzogY29mZi1zdGdvMzIuYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2dvMzJleGUuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaCBcCi0gIGdvMzJzdHViLmgKLWNvZmYtc3ZtNjhrLmxvOiBjb2ZmLXN2bTY4ay5jIGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdGljMzAubG86IGNvZmYtdGljMzAuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdGljODAubG86IGNvZmYtdGljODAuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdTY4ay5sbzogY29mZi11NjhrLmMgY29mZi1tNjhrLmMgJChJTkNESVIpL2NvZmYvbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi13ZTMyay5sbzogY29mZi13ZTMyay5jICQoSU5DRElSKS9jb2ZmL3dlMzJrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXc2NS5sbzogY29mZi13NjUuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3c2NS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXo4ay5sbzogY29mZi16OGsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3o4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmbGluay5sbzogY29mZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmgKLWR3YXJmMi5sbzogZHdhcmYyLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9kd2FyZjIuaAotZWNvZmYubG86IGVjb2ZmLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgJChJTkNESVIpL2FvdXQvcmFubGliLmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgbGliY29mZi5oIGxpYmVjb2ZmLmgKLWVjb2ZmbGluay5sbzogZWNvZmZsaW5rLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JqYWxsb2MuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gIGxpYmNvZmYuaCBsaWJlY29mZi5oCi1lbGYubG86IGVsZi5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oCi1lbGYzMi1hcmMubG86IGVsZjMyLWFyYy5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGZhcm0tb2FiaS5sbzogZWxmYXJtLW9hYmkuYyAkKElOQ0RJUikvZWxmL2FybS1vYWJpLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItYXJtLmggZWxmMzItdGFyZ2V0LmgKLWVsZmFybS1uYWJpLmxvOiBlbGZhcm0tbmFiaS5jICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIGVsZjMyLWFybS5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWQxMHYubG86IGVsZjMyLWQxMHYuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1kMzB2LmxvOiBlbGYzMi1kMzB2LmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItZnIzMC5sbzogZWxmMzItZnIzMC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9mcjMwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItZ2VuLmxvOiBlbGYzMi1nZW4uYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1ocHBhLmxvOiBlbGYzMi1ocHBhLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICBlbGYzMi1ocHBhLmggbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBocHBhX3N0dWJzLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWkzODYubG86IGVsZjMyLWkzODYuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvaTM4Ni5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWk4NjAubG86IGVsZjMyLWk4NjAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1tMzJyLmxvOiBlbGYzMi1tMzJyLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL20zMnIuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1tNjhrLmxvOiBlbGYzMi1tNjhrLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL202OGsuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1tODhrLmxvOiBlbGYzMi1tODhrLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmLW0xMDIwMC5sbzogZWxmLW0xMDIwMC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZi1tMTAzMDAubG86IGVsZi1tMTAzMDAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvbW4xMDMwMC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItbWNvcmUubG86IGVsZjMyLW1jb3JlLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL21jb3JlLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1taXBzLmxvOiBlbGYzMi1taXBzLmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggXAotICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvbWlwcy5oIGVjb2Zmc3dhcC5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXBwYy5sbzogZWxmMzItcHBjLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXNoLmxvOiBlbGYzMi1zaC5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9zaC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXNwYXJjLmxvOiBlbGYzMi1zcGFyYy5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9zcGFyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItdjg1MC5sbzogZWxmMzItdjg1MC5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi92ODUwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzIubG86IGVsZjMyLmMgZWxmY29kZS5oICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgZWxmY29yZS5oIGVsZmxpbmsuaAotZWxmbGluay5sbzogZWxmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oCi1ocDMwMGJzZC5sbzogaHAzMDBic2QuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWhwMzAwaHB1eC5sbzogaHAzMDBocHV4LmMgJChJTkNESVIpL2FvdXQvaHAzMDBocHV4LmggXAotICBhb3V0eC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotc29tLmxvOiBzb20uYwotaTM4NmFvdXQubG86IGkzODZhb3V0LmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2YnNkLmxvOiBpMzg2YnNkLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2ZHluaXgubG86IGkzODZkeW5peC5jICQoSU5DRElSKS9hb3V0L2R5bml4My5oIGFvdXR4LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGFvdXQtdGFyZ2V0LmgKLWkzODZmcmVlYnNkLmxvOiBpMzg2ZnJlZWJzZC5jIGZyZWVic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZsaW51eC5sbzogaTM4NmxpbnV4LmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1pMzg2bHlueC5sbzogaTM4Nmx5bnguYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZtc2Rvcy5sbzogaTM4Nm1zZG9zLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLWkzODZuZXRic2QubG86IGkzODZuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZtYWNoMy5sbzogaTM4Nm1hY2gzLmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1pMzg2b3M5ay5sbzogaTM4Nm9zOWsuYyAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9vczlrLmgKLWllZWUubG86IGllZWUuYyAkKElOQ0RJUikvaWVlZS5oIGxpYmllZWUuaAotbTY4azRrbmV0YnNkLmxvOiBtNjhrNGtuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW02OGtsaW51eC5sbzogbTY4a2xpbnV4LmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1tNjhrbHlueC5sbzogbTY4a2x5bnguYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW02OGtuZXRic2QubG86IG02OGtuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW04OGttYWNoMy5sbzogbTg4a21hY2gzLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1taXBzYnNkLmxvOiBtaXBzYnNkLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1uZXdzb3MzLmxvOiBuZXdzb3MzLmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1ubG0ubG86IG5sbS5jIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oCi1ubG0zMi1pMzg2LmxvOiBubG0zMi1pMzg2LmMgJChJTkNESVIpL25sbS9pMzg2LWV4dC5oIFwKLSAgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtMzItc3BhcmMubG86IG5sbTMyLXNwYXJjLmMgJChJTkNESVIpL25sbS9zcGFyYzMyLWV4dC5oIFwKLSAgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtMzItcHBjLmxvOiBubG0zMi1wcGMuYyAkKElOQ0RJUikvbmxtL3BwYy1leHQuaCBsaWJubG0uaCBcCi0gICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBcCi0gIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKLW5sbTMyLmxvOiBubG0zMi5jIG5sbWNvZGUuaCBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL25sbS9pbnRlcm5hbC5oICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaAotbnMzMmtuZXRic2QubG86IG5zMzJrbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1vYXN5cy5sbzogb2FzeXMuYyAkKElOQ0RJUikvb2FzeXMuaCBsaWJvYXN5cy5oCi1wYzUzMi1tYWNoLmxvOiBwYzUzMi1tYWNoLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1wZS1hcm0ubG86IHBlLWFybS5jIGNvZmYtYXJtLmMgJChJTkNESVIpL2NvZmYvYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAotcGVpLWFybS5sbzogcGVpLWFybS5jIGNvZmYtYXJtLmMgJChJTkNESVIpL2NvZmYvYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAotcGUtaTM4Ni5sbzogcGUtaTM4Ni5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZWktaTM4Ni5sbzogcGVpLWkzODYuYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAotcGUtbWNvcmUubG86IHBlLW1jb3JlLmMgY29mZi1tY29yZS5jICQoSU5DRElSKS9jb2ZmL21jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAotcGVpLW1jb3JlLmxvOiBwZWktbWNvcmUuYyBjb2ZmLW1jb3JlLmMgJChJTkNESVIpL2NvZmYvbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZS1wcGMubG86IHBlLXBwYy5jIGNvZmYtcHBjLmMgJChJTkNESVIpL2NvZmYvcG93ZXJwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLXBlaS1wcGMubG86IHBlaS1wcGMuYyBjb2ZmLXBwYy5jICQoSU5DRElSKS9jb2ZmL3Bvd2VycGMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wcGNib290LmxvOiBwcGNib290LmMKLXJlbG9jMTYubG86IHJlbG9jMTYuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oCi1yaXNjaXgubG86IHJpc2NpeC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgJChJTkNESVIpL2FvdXQvYXIuaAotc3BhcmNsaW51eC5sbzogc3BhcmNsaW51eC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotc3BhcmNseW54LmxvOiBzcGFyY2x5bnguYyAkKElOQ0RJUikvYW91dC9zdW40LmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCi1zcGFyY25ldGJzZC5sbzogc3BhcmNuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXN1bm9zLmxvOiBzdW5vcy5jICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIGFvdXRmMS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3VuNC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLXZheG5ldGJzZC5sbzogdmF4bmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi12ZXJzYWRvcy5sbzogdmVyc2Fkb3MuYyAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXZtcy5sbzogdm1zLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAotdm1zLWdzZC5sbzogdm1zLWdzZC5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy1oZHIubG86IHZtcy1oZHIuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi12bXMtbWlzYy5sbzogdm1zLW1pc2MuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi12bXMtdGlyLmxvOiB2bXMtdGlyLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAoteGNvZmZsaW5rLmxvOiB4Y29mZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmgKLWFvdXQ2NC5sbzogYW91dDY0LmMgYW91dHguaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oCi1jb2ZmLWFscGhhLmxvOiBjb2ZmLWFscGhhLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvYWxwaGEuaCAkKElOQ0RJUikvYW91dC9hci5oIGxpYmNvZmYuaCBcCi0gIGxpYmVjb2ZmLmggY29mZnN3YXAuaCBlY29mZnN3YXAuaAotZGVtbzY0LmxvOiBkZW1vNjQuYyBhb3V0ZjEuaCAkKElOQ0RJUikvYW91dC9zdW40LmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGFvdXQtdGFyZ2V0LmgKLWVsZjY0LWFscGhhLmxvOiBlbGY2NC1hbHBoYS5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL2FscGhhLmggJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGxpYmNvZmYuaCBsaWJlY29mZi5oIGVjb2Zmc3dhcC5oIGVsZjY0LXRhcmdldC5oCi1lbGY2NC1nZW4ubG86IGVsZjY0LWdlbi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LW1pcHMubG86IGVsZjY0LW1pcHMuYyAkKElOQ0RJUikvYW91dC9hci5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBnZW5saW5rLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL2FscGhhLmggZWNvZmZzd2FwLmggXAotICBlbGY2NC10YXJnZXQuaAotZWxmNjQtc3BhcmMubG86IGVsZjY0LXNwYXJjLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjY0LXRhcmdldC5oCi1lbGY2NC5sbzogZWxmNjQuYyBlbGZjb2RlLmggJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICBlbGZjb3JlLmggZWxmbGluay5oCi1ubG0zMi1hbHBoYS5sbzogbmxtMzItYWxwaGEuYyAkKElOQ0RJUikvbmxtL2FscGhhLWV4dC5oIFwKLSAgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtNjQubG86IG5sbTY0LmMgbmxtY29kZS5oIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggXAotICAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oCi1haXgzODYtY29yZS5sbzogYWl4Mzg2LWNvcmUuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ocHV4LWNvcmUubG86IGhwdXgtY29yZS5jCi1pcml4LWNvcmUubG86IGlyaXgtY29yZS5jCi1seW54LWNvcmUubG86IGx5bngtY29yZS5jCi1vc2YtY29yZS5sbzogb3NmLWNvcmUuYwotc2NvNS1jb3JlLmxvOiBzY281LWNvcmUuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotdHJhZC1jb3JlLmxvOiB0cmFkLWNvcmUuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGhvc3RzL2kzODZsaW51eC5oCi1jaXNjby1jb3JlLmxvOiBjaXNjby1jb3JlLmMKLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9iZmQvUE9SVElORyBiL2JmZC9QT1JUSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJmZDc3Li4wMDAwMDAwCi0tLSBhL2JmZC9QT1JUSU5HCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotCVByZWxpbWluYXJ5IE5vdGVzIG9uIFBvcnRpbmcgQkZECi0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlICdob3N0JyBpcyB0aGUgc3lzdGVtIGEgdG9vbCBydW5zICpvbiouCi1UaGUgJ3RhcmdldCcgaXMgdGhlIHN5c3RlbSBhIHRvb2wgcnVucyAqZm9yKiwgaS5lLgotYSB0b29sIGNhbiByZWFkL3dyaXRlIHRoZSBiaW5hcmllcyBvZiB0aGUgdGFyZ2V0LgotCi1Qb3J0aW5nIHRvIGEgbmV3IGhvc3QKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotUGljayBhIG5hbWUgZm9yIHlvdXIgaG9zdC4gQ2FsbCB0aGF0IDxob3N0Pi4KLSg8aG9zdD4gbWlnaHQgYmUgc3VuNCwgLi4uKQotQ3JlYXRlIGEgZmlsZSBob3N0cy88aG9zdD4ubWguCi0KLVBvcnRpbmcgdG8gYSBuZXcgdGFyZ2V0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotUGljayBhIG5hbWUgZm9yIHlvdXIgdGFyZ2V0LiBDYWxsIHRoYXQgPHRhcmdldD4uCi1DYWxsIHRoZSBuYW1lIGZvciB5b3VyIENQVSBhcmNoaXRlY3R1cmUgPGNwdT4uCi1Zb3UgbmVlZCB0byBjcmVhdGUgPHRhcmdldD4uYyBhbmQgY29uZmlnLzx0YXJnZXQ+Lm10LAotYW5kIGFkZCBhIGNhc2UgZm9yIGl0IHRvIGEgY2FzZSBzdGF0ZW1lbnRzIGluIGJmZC9jb25maWd1cmUuaG9zdCBhbmQKLWJmZC9jb25maWcuYmZkLCB3aGljaCBhc3NvY2lhdGVzIGVhY2ggY2Fub25pY2FsIGhvc3QgdHlwZSB3aXRoIGEgQkZECi1ob3N0IHR5cGUgKHVzZWQgYXMgdGhlIGJhc2Ugb2YgdGhlIG1ha2VmaWxlIGZyYWdtZW50IG5hbWVzKSwgYW5kIHRvIHRoZQotdGFibGUgaW4gYmZkL2NvbmZpZ3VyZS5pbiB3aGljaCBhc3NvY2lhdGVzIGVhY2ggdGFyZ2V0IHZlY3RvciB3aXRoCi10aGUgLm8gZmlsZXMgaXQgdXNlcy4KLQotY29uZmlnLzx0YXJnZXQ+Lm10IGlzIGEgTWFrZWZpbGUgZnJhZ21lbnQuCi1UaGUgZm9sbG93aW5nIGlzIHVzdWFsbHkgZW5vdWdoOgotREVGQVVMVF9WRUNUT1I9PHRhcmdldD5fdmVjCi1TRUxFQ1RfQVJDSElURUNUVVJFUz1iZmRfPGNwdT5fYXJjaAotCi1TZWUgdGhlIGxpc3Qgb2YgY3B1IHR5cGVzIGluIGFyY2h1cmVzLmMsIG9yICJscyBjcHUtKi5jIi4KLUlmIHlvdXIgYXJjaGl0ZWN0dXJlIGlzIG5ldywgeW91IG5lZWQgdG8gYWRkIGl0IHRvIHRoZSB0YWJsZXMKLWluIGJmZC9hcmNodXJlcy5jLCBvcGNvZGVzL2NvbmZpZ3VyZS5pbiwgYW5kIGJpbnV0aWxzL29iamR1bXAuYy4KLQotRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgLm10IGFuZCAubWggZmlsZXMsIHNlZSBjb25maWcvUkVBRE1FLgotCi1UaGUgZmlsZSA8dGFyZ2V0Pi5jIGlzIHRoZSBoYXJkIHBhcnQuICBJdCBpbXBsZW1lbnRzIHRoZQotYmZkX3RhcmdldCA8dGFyZ2V0Pl92ZWMsIHdoaWNoIGluY2x1ZGVzIHBvaW50ZXJzIHRvCi1mdW5jdGlvbnMgdGhhdCBkbyB0aGUgYWN0dWFsIDx0YXJnZXQ+LXNwZWNpZmljIG1ldGhvZHMuCi0KLVBvcnRpbmcgdG8gYSA8dGFyZ2V0PiB0aGF0IHVzZXMgdGhlIGEub3V0IGJpbmFyeSBmb3JtYXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSW4gdGhpcyBjYXNlLCB0aGUgaW5jbHVkZSBmaWxlIGFvdXQtdGFyZ2V0LmggcHJvYmFieSBkb2VzIG1vc3QKLW9mIHdoYXQgeW91IG5lZWQuIFRoZSBwcm9ncmFtIGdlbi1hb3V0IGdlbmVyYXRlcyA8dGFyZ2V0Pi5jIGZvcgoteW91IGF1dG9tYXRpY2FsbHkgZm9yIG1hbnkgYS5vdXQgc3lzdGVtcy4gIERvOgotCW1ha2UgZ2VuLWFvdXQKLQkuL2dlbi1hb3V0IDx0YXJnZXQ+ID4gPHRhcmdldD4uYwotKFRoaXMgb25seSB3b3JrcyBpZiB5b3UgYXJlIGJ1aWxkaW5nIG9uIHRoZSB0YXJnZXQgKCJuYXRpdmUiKS4KLUlmIHlvdSBtdXN0IG1ha2UgYSBjcm9zcy1wb3J0IGZyb20gc2NyYXRjaCwgY29weSB0aGUgbW9zdAotc2ltaWxhciBleGlzdGluZyBmaWxlIHRoYXQgaW5jbHVkZXMgYW91dC10YXJnZXQuaCwgYW5kIGZpeCB3aGF0IGlzIHdyb25nLikKLQotQ2hlY2sgdGhlIHBhcmFtZXRlcnMgaW4gPHRhcmdldD4uYywgYW5kIGZpeCBhbnl0aGluZyB0aGF0IGlzIHdyb25nLgotKEFsc28gbGV0IHVzIGtub3cgYWJvdXQgaXQ7IHBlcmhhcHMgd2UgY2FuIGltcHJvdmUgZ2VuLWFvdXQuYy4pCi0KLVRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQlTaG91bGQgYmUgZGVmaW5lZCBpZiA8dGFyZ2V0PiBpcyBiaWctZW5kaWFuLgotCi1OX0hFQURFUl9JTl9URVhUKHgpCi0JU2VlIGRpc2N1c3Npb24gaW4gLi4vaW5jbHVkZS9hb3V0L2FvdXQ2NC5oLgotCi1CWVRFU19JTl9XT1JECi0JTnVtYmVyIG9mIGJ5dGVzIHBlciB3b3JkLiAoVXN1YWxseSA0IGJ1dCBjYW4gYmUgOC4pCi0KLUFSQ0gKLQlOdW1iZXIgb2YgYml0cyBwZXIgd29yZC4gIChVc3VhbGx5IDMyLCBidXQgY2FuIGJlIDY0LikKLQotRU5UUllfQ0FOX0JFX1pFUk8KLQlEZWZpbmUgaWYgdGhlIGV4dHJ5IHBvaW50IChzdGFydCBhZGRyZXNzIG9mIGFuCi0JZXhlY3V0YWJsZSBwcm9ncmFtKSBjYW4gYmUgMHgwLgotCi1URVhUX1NUQVJUX0FERFIKLQlUaGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc2VnZW1udCBpbgotCXZpcnR1YWwgbWVtb3J5LiAgTm9ybWFsbHksIHRoZSBzYW1lIGFzIHRoZSBlbnRyeSBwb2ludC4KLQotVEFSR0VUX1BBR0VfU0laRQotCi1TRUdNRU5UX1NJWkUKLSAgICAgICAgVXN1YWxseSwgdGhlIHNhbWUgYXMgdGhlIFRBUkdFVF9QQUdFX1NJWkUuCi0gICAgICAgIEFsaWdubWVudCBuZWVkZWQgZm9yIHRoZSBkYXRhIHNlZ21lbnQuCi0KLVRBUkdFVE5BTUUKLQlUaGUgbmFtZSBvZiB0aGUgdGFyZ2V0LCBmb3IgcnVuLXRpbWUgbG9va3Vwcy4KLQlVc3VhbGx5ICJhLm91dC08dGFyZ2V0PiIKZGlmZiAtLWdpdCBhL2JmZC9SRUFETUUgYi9iZmQvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWNlMTMzLi4wMDAwMDAwCi0tLSBhL2JmZC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1CRkQgaXMgYSBhbiBvYmplY3QgZmlsZSBsaWJyYXJ5LiAgSXQgcGVybWl0cyBhcHBsaWNhdGlvbnMgdG8gdXNlIHRoZQotc2FtZSByb3V0aW5lcyB0byBwcm9jZXNzIG9iamVjdCBmaWxlcyByZWdhcmRsZXNzIG9mIHRoZWlyIGZvcm1hdC4KLQotQkZEIGlzIHVzZWQgYnkgdGhlIEdOVSBkZWJ1Z2dlciwgYXNzZW1ibGVyLCBsaW5rZXIsIGFuZCB0aGUgYmluYXJ5Ci11dGlsaXRpZXMuCi0KLVRoZSBkb2N1bWVudGF0aW9uIG9uIHVzaW5nIEJGRCBpcyBzY2FudHkgYW5kIG1heSBiZSBvY2Nhc2lvbmFsbHkKLWluY29ycmVjdC4gIFBvaW50ZXJzIHRvIGRvY3VtZW50YXRpb24gcHJvYmxlbXMsIG9yIGFuIGVudGlyZWx5Ci1yZXdyaXR0ZW4gbWFudWFsLCB3b3VsZCBiZSBhcHByZWNpYXRlZC4KLQotVGhlcmUgaXMgc29tZSBCRkQgaW50ZXJuYWxzIGRvY3VtZW50YXRpb24gaW4gZG9jL2JmZGludC50ZXhpIHdoaWNoIG1heQotaGVscCBwcm9ncmFtbWVycyB3aG8gd2FudCB0byBtb2RpZnkgQkZELgotCi1CRkQgaXMgbm9ybWFsbHkgYnVpbHQgYXMgcGFydCBvZiBhbm90aGVyIHBhY2thZ2UuICBTZWUgdGhlIGJ1aWxkCi1pbnN0cnVjdGlvbnMgZm9yIHRoYXQgcGFja2FnZSwgcHJvYmFibHkgaW4gYSBSRUFETUUgZmlsZSBpbiB0aGUKLWFwcHJvcHJpYXRlIGRpcmVjdG9yeS4KLQotQkZEIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY29uZmlndXJlIG9wdGlvbnM6Ci0KLSAgLS10YXJnZXQ9VEFSR0VUCi0JVGhlIGRlZmF1bHQgdGFyZ2V0IGZvciB3aGljaCB0byBidWlsZCB0aGUgbGlicmFyeS4gIFRBUkdFVCBpcwotCWEgY29uZmlndXJhdGlvbiB0YXJnZXQgdHJpcGxldCwgc3VjaCBhcyBzcGFyYy1zdW4tc29sYXJpcy4KLSAgLS1lbmFibGUtdGFyZ2V0cz1UQVJHRVQsVEFSR0VULFRBUkdFVC4uLgotCUFkZGl0aW9uYWwgdGFyZ2V0cyB0aGUgbGlicmFyeSBzaG91bGQgc3VwcG9ydC4gIFRvIGluY2x1ZGUKLQlzdXBwb3J0IGZvciBhbGwga25vd24gdGFyZ2V0cywgdXNlIC0tZW5hYmxlLXRhcmdldHM9YWxsLgotICAtLWVuYWJsZS02NC1iaXQtYmZkCi0JSW5jbHVkZSBzdXBwb3J0IGZvciA2NCBiaXQgdGFyZ2V0cy4gIFRoaXMgaXMgYXV0b21hdGljYWxseQotCXR1cm5lZCBvbiBpZiB5b3UgZXhwbGljaXRseSByZXF1ZXN0IGEgNjQgYml0IHRhcmdldCwgYnV0IG5vdAotCWZvciAtLWVuYWJsZS10YXJnZXRzPWFsbC4gIFRoaXMgcmVxdWlyZXMgYSBjb21waWxlciB3aXRoIGEgNjQKLQliaXQgaW50ZWdlciB0eXBlLCBzdWNoIGFzIGdjYy4KLSAgLS1lbmFibGUtc2hhcmVkCi0JQnVpbGQgQkZEIGFzIGEgc2hhcmVkIGxpYnJhcnkuCi0gIC0td2l0aC1tbWFwCi0JVXNlIG1tYXAgd2hlbiBhY2Nlc3NpbmcgZmlsZXMuICBUaGlzIGlzIGZhc3RlciBvbiBzb21lIGhvc3RzLAotCWJ1dCBzbG93ZXIgb24gb3RoZXJzLiAgSXQgbWF5IG5vdCB3b3JrIG9uIGFsbCBob3N0cy4KLQotUmVwb3J0IGJ1Z3Mgd2l0aCBCRkQgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnLgotCi1QYXRjaGVzIGFyZSBlbmNvdXJhZ2VkLiAgV2hlbiBzZW5kaW5nIHBhdGNoZXMsIGFsd2F5cyBzZW5kIHRoZSBvdXRwdXQKLW9mIGRpZmYgLXUgb3IgZGlmZiAtYyBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlIHRvIHRoZSBuZXcgZmlsZS4gIERvIG5vdAotc2VuZCBkZWZhdWx0IGRpZmYgb3V0cHV0LiAgRG8gbm90IG1ha2UgdGhlIGRpZmYgZnJvbSB0aGUgbmV3IGZpbGUgdG8KLXRoZSBvcmlnaW5hbCBmaWxlLiAgUmVtZW1iZXIgdGhhdCBhbnkgcGF0Y2ggbXVzdCBub3QgYnJlYWsgb3RoZXIKLXN5c3RlbXMuICBSZW1lbWJlciB0aGF0IEJGRCBtdXN0IHN1cHBvcnQgY3Jvc3MgY29tcGlsYXRpb24gZnJvbSBhbnkKLWhvc3QgdG8gYW55IHRhcmdldCwgc28gcGF0Y2hlcyB3aGljaCB1c2UgYGAjaWZkZWYgSE9TVCcnIGFyZSBub3QKLWFjY2VwdGFibGUuICBQbGVhc2UgYWxzbyByZWFkIHRoZSBgYFJlcG9ydGluZyBCdWdzJycgc2VjdGlvbiBvZiB0aGUKLWdjYyBtYW51YWwuCi0KLUJ1ZyByZXBvcnRzIHdpdGhvdXQgcGF0Y2hlcyB3aWxsIGJlIHJlbWVtYmVyZWQsIGJ1dCB0aGV5IG1heSBuZXZlciBnZXQKLWZpeGVkIHVudGlsIHNvbWVib2R5IHZvbHVudGVlcnMgdG8gZml4IHRoZW0uCmRpZmYgLS1naXQgYS9iZmQvVE9ETyBiL2JmZC9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTEyNzM1Li4wMDAwMDAwCi0tLSBhL2JmZC9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotVGhpbmdzIHRoYXQgc3RpbGwgbmVlZCB0byBiZSBkb25lOiAtKi0gVGV4dCAtKi0KLQotIG8gLSBBIHNvdXJjZSBvZiBzcGFjZSBsb3NzYWdlIGlzIHRoYXQgYWxsIHRoZSB0YXJnZXQtZGVwZW5kZW50IGNvZGUKLSAgICAgaXMgaW4gYSBzaW5nbGUgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuICBIZW5jZSBhbGwgdGhlIGNvZGUgZm9yCi0gICAgICp3cml0aW5nKiBvYmplY3QgZmlsZXMgaXMgc3RpbGwgcHVsbGVkIGludG8gYWxsIHRoZSBhcHBsaWNhdGlvbnMKLSAgICAgdGhhdCBvbmx5IGNhcmUgYWJvdXQgKnJlYWRpbmcqIChnZGIsIG5tLCBvYmpkdW1wKSwgd2hpbGUgZ2FzIGhhcwotICAgICB0byBjYXJyeSBhbG9uZyBhbGwgdGhlIHVubmVlZGVkIGJhZ2dhZ2UgZm9yIHJlYWRpbmcgb2JqZWN0cy4gIEFuZAotICAgICBzbyBvbi4gIFRoaXMgd291bGQgYmUgYSBzdWJzdGFudGlhbCBjaGFuZ2UsIGFuZCB0aGUgcGF5b2ZmIHdvdWxkCi0gICAgIG5vdCBhbGwgdGhhdCBncmVhdCAoZXNzZW50aWFsbHkgbm9uZSBpZiBiZmQgaXMgdXNlZCBhcyBhIHNoYXJlZAotICAgICBsaWJyYXJ5KS4KLQotIG8gLSBUaGUgc3RvcmFnZSBuZWVkZWQgYnkgQkZEIGRhdGEgc3RydWN0dXJlcyBpcyBhbHNvIGxhcmdlciB0aGFuIHN0cmljdGx5Ci0gICAgIG5lZWRlZC4gIFRoaXMgbWF5IGJlIGRpZmZpY3VsdCB0byBkbyBtdWNoIGFib3V0LgotCi0gbyAtIGltcGxlbWVudCBiZmRfYWJvcnQsIHdoaWNoIHNob3VsZCBjbG9zZSB0aGUgYmZkIGJ1dCBub3QgYWx0ZXIgdGhlCi0gICAgIGZpbGVzeXN0ZW0uCi0KLSBvIC0gdXBkYXRlIHRoZSBiZmQgZG9jOyB3cml0ZSBhIGhvdy10by13cml0ZS1hLWJhY2tlbmQgZG9jLCB0YWtlIG91dAotICAgICB0aGUgc3R1cGlkIHF1aXBzIGFuZCBmaWxsIGluIGFsbCB0aGUgYmxhbmtzLgotCi0gbyAtIHVwZ3JhZGUgdGhlIHJlbG9jIGhhbmRsaW5nIGFzIHBlciBTdGV2ZSdzIHN1Z2dlc3Rpb24uCi0KLQotCi0KZGlmZiAtLWdpdCBhL2JmZC9hY2luY2x1ZGUubTQgYi9iZmQvYWNpbmNsdWRlLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmUxYzMwLi4wMDAwMDAwCi0tLSBhL2JmZC9hY2luY2x1ZGUubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotZG5sIFNlZSB3aGV0aGVyIHdlIG5lZWQgdG8gdXNlIGZvcGVuLWJpbi5oIHJhdGhlciB0aGFuIGZvcGVuLXNhbWUuaC4KLUFDX0RFRlVOKEJGRF9CSU5BUllfRk9QRU4sCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX1NZU1RFTV0pCi1jYXNlICIke2hvc3R9IiBpbgotY2hhbmdlcXVvdGUoLClkbmwKLSotKi1tc2RvcyogfCAqLSotZ28zMiogfCAqLSotbWluZ3czMiogfCAqLSotY3lnd2luKiB8ICotKi13aW5kb3dzKQotY2hhbmdlcXVvdGUoWyxdKWRubAotICBBQ19ERUZJTkUoVVNFX0JJTkFSWV9GT1BFTiwgMSwgW1VzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/XSkgOzsKLWVzYWNdKWRubAotCi1kbmwgR2V0IGEgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIHRvIHB1dCBpbnRvIE1ha2VmaWxlLgotQUNfREVGVU4oQkZEX0NDX0ZPUl9CVUlMRCwKLVsjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0IC16ICIkQ0NfRk9SX0JVSUxEIjsgdGhlbgotICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICAgIENDX0ZPUl9CVUlMRD0nJChDQyknCi0gIGVsc2UKLSAgICBDQ19GT1JfQlVJTEQ9Z2NjCi0gIGZpCi1maQotQUNfU1VCU1QoQ0NfRk9SX0JVSUxEKQotIyBBbHNvIHNldCBFWEVFWFRfRk9SX0JVSUxELgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgRVhFRVhUX0ZPUl9CVUlMRD0nJChFWEVFWFQpJwotZWxzZQotICBBQ19DQUNIRV9DSEVDSyhbZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeF0sIGJmZF9jdl9idWlsZF9leGVleHQsCi0gICAgW2NhdCA+IGFjX2NfdGVzdC5jIDw8ICdFT0YnCi1pbnQgbWFpbigpIHsKLS8qIE5vdGhpbmcgbmVlZGVkIGhlcmUgKi8KLX0KLUVPRgotICAgICR7Q0NfRk9SX0JVSUxEfSAtbyBhY19jX3Rlc3QgYW1fY190ZXN0LmMgMT4mNSAyPiY1Ci0gICAgYmZkX2N2X2J1aWxkX2V4ZWV4dD1gZWNobyBhY19jX3Rlc3QuKiB8IGdyZXAgLXYgYWNfY190ZXN0LmMgfCBzZWQgLWUgcy9hY19jX3Rlc3QvL2AKLSAgICBybSAtZiBhY19jX3Rlc3QqCi0gICAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iID0geCAmJiBiZmRfY3ZfYnVpbGRfZXhlZXh0PW5vXSkKLSAgRVhFRVhUX0ZPUl9CVUlMRD0iIgotICB0ZXN0IHgiJHtiZmRfY3ZfYnVpbGRfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVF9GT1JfQlVJTEQ9JHtiZmRfY3ZfYnVpbGRfZXhlZXh0fQotZmkKLUFDX1NVQlNUKEVYRUVYVF9GT1JfQlVJTEQpXSlkbmwKLQotZG5sIFNlZSB3aGV0aGVyIHdlIG5lZWQgYSBkZWNsYXJhdGlvbiBmb3IgYSBmdW5jdGlvbi4KLUFDX0RFRlVOKEJGRF9ORUVEX0RFQ0xBUkFUSU9OLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciAkMSBtdXN0IGJlIGRlY2xhcmVkXSkKLUFDX0NBQ0hFX1ZBTChiZmRfY3ZfZGVjbF9uZWVkZWRfJDEsCi1bQUNfVFJZX0NPTVBJTEUoWwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmXSwKLVtjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSAkMV0sCi1iZmRfY3ZfZGVjbF9uZWVkZWRfJDE9bm8sIGJmZF9jdl9kZWNsX25lZWRlZF8kMT15ZXMpXSkKLUFDX01TR19SRVNVTFQoJGJmZF9jdl9kZWNsX25lZWRlZF8kMSkKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF8kMSA9IHllczsgdGhlbgotICBBQ19ERUZJTkUoW05FRURfREVDTEFSQVRJT05fXXRyYW5zbGl0KCQxLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgICBbRGVmaW5lIGlmICQxIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLl0pCi1maQotXSlkbmwKLQotZG5sIENoZWNrIGZvciBleGlzdGVuY2Ugb2YgYSB0eXBlICQxIGluIHN5cy9wcm9jZnMuaAotCi1BQ19ERUZVTihCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUsCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDEgaW4gc3lzL3Byb2Nmcy5oXSkKLSBBQ19DQUNIRV9WQUwoYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxLAotICAgW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPl0sCi0gICAgICBbJDEgYXZhcl0sCi0gICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDE9eWVzLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxPW5vCi0gICApXSkKLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDEgPSB5ZXM7IHRoZW4KLSAgIEFDX0RFRklORShbSEFWRV9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIDEsCi0JICAgICBbRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyAkMS5dKQotIGZpCi0gQUNfTVNHX1JFU1VMVCgkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxKQotXSkKLQotCi1kbmwgQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBtZW1iZXIgJDIgaW4gdHlwZSAkMSBpbiBzeXMvcHJvY2ZzLmgKLQotQUNfREVGVU4oQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFX01FTUJFUiwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMS4kMiBpbiBzeXMvcHJvY2ZzLmhdKQotIEFDX0NBQ0hFX1ZBTChiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyLAotICAgW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPl0sCi0gICAgICBbJDEgYXZhcjsgdm9pZCogYXJlZiA9ICh2b2lkKikgJmF2YXIuJDJdLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMj15ZXMsCi0gICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyPW5vCi0gICApXSkKLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyID0geWVzOyB0aGVuCi0gICBBQ19ERUZJTkUoW0hBVkVfXXRyYW5zbGl0KCQxLCBbYS16XSwgW0EtWl0pW19ddHJhbnNsaXQoJDIsIFthLXpdLCBbQS1aXSksIDEsCi0JICAgICBbRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyAkMS4kMi5dKQotIGZpCi0gQUNfTVNHX1JFU1VMVCgkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMikKLV0pCi0KLQpkaWZmIC0tZ2l0IGEvYmZkL2FjbG9jYWwubTQgYi9iZmQvYWNsb2NhbC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM1ODAwMC4uMDAwMDAwMAotLS0gYS9iZmQvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDg2MSArMCwwIEBACi1kbmwgYWNsb2NhbC5tNCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuNAotCi1kbmwgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1kbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLWRubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotZG5sIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotZG5sIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci1kbmwgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotZG5sIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotZG5sIFNlZSB3aGV0aGVyIHdlIG5lZWQgdG8gdXNlIGZvcGVuLWJpbi5oIHJhdGhlciB0aGFuIGZvcGVuLXNhbWUuaC4KLUFDX0RFRlVOKEJGRF9CSU5BUllfRk9QRU4sCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX1NZU1RFTV0pCi1jYXNlICIke2hvc3R9IiBpbgotY2hhbmdlcXVvdGUoLClkbmwKLSotKi1tc2RvcyogfCAqLSotZ28zMiogfCAqLSotbWluZ3czMiogfCAqLSotY3lnd2luKiB8ICotKi13aW5kb3dzKQotY2hhbmdlcXVvdGUoWyxdKWRubAotICBBQ19ERUZJTkUoVVNFX0JJTkFSWV9GT1BFTiwgMSwgW1VzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/XSkgOzsKLWVzYWNdKWRubAotCi1kbmwgR2V0IGEgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIHRvIHB1dCBpbnRvIE1ha2VmaWxlLgotQUNfREVGVU4oQkZEX0NDX0ZPUl9CVUlMRCwKLVsjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0IC16ICIkQ0NfRk9SX0JVSUxEIjsgdGhlbgotICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICAgIENDX0ZPUl9CVUlMRD0nJChDQyknCi0gIGVsc2UKLSAgICBDQ19GT1JfQlVJTEQ9Z2NjCi0gIGZpCi1maQotQUNfU1VCU1QoQ0NfRk9SX0JVSUxEKQotIyBBbHNvIHNldCBFWEVFWFRfRk9SX0JVSUxELgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgRVhFRVhUX0ZPUl9CVUlMRD0nJChFWEVFWFQpJwotZWxzZQotICBBQ19DQUNIRV9DSEVDSyhbZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeF0sIGJmZF9jdl9idWlsZF9leGVleHQsCi0gICAgW2NhdCA+IGFjX2NfdGVzdC5jIDw8ICdFT0YnCi1pbnQgbWFpbigpIHsKLS8qIE5vdGhpbmcgbmVlZGVkIGhlcmUgKi8KLX0KLUVPRgotICAgICR7Q0NfRk9SX0JVSUxEfSAtbyBhY19jX3Rlc3QgYW1fY190ZXN0LmMgMT4mNSAyPiY1Ci0gICAgYmZkX2N2X2J1aWxkX2V4ZWV4dD1gZWNobyBhY19jX3Rlc3QuKiB8IGdyZXAgLXYgYWNfY190ZXN0LmMgfCBzZWQgLWUgcy9hY19jX3Rlc3QvL2AKLSAgICBybSAtZiBhY19jX3Rlc3QqCi0gICAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iID0geCAmJiBiZmRfY3ZfYnVpbGRfZXhlZXh0PW5vXSkKLSAgRVhFRVhUX0ZPUl9CVUlMRD0iIgotICB0ZXN0IHgiJHtiZmRfY3ZfYnVpbGRfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVF9GT1JfQlVJTEQ9JHtiZmRfY3ZfYnVpbGRfZXhlZXh0fQotZmkKLUFDX1NVQlNUKEVYRUVYVF9GT1JfQlVJTEQpXSlkbmwKLQotZG5sIFNlZSB3aGV0aGVyIHdlIG5lZWQgYSBkZWNsYXJhdGlvbiBmb3IgYSBmdW5jdGlvbi4KLUFDX0RFRlVOKEJGRF9ORUVEX0RFQ0xBUkFUSU9OLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciAkMSBtdXN0IGJlIGRlY2xhcmVkXSkKLUFDX0NBQ0hFX1ZBTChiZmRfY3ZfZGVjbF9uZWVkZWRfJDEsCi1bQUNfVFJZX0NPTVBJTEUoWwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmXSwKLVtjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSAkMV0sCi1iZmRfY3ZfZGVjbF9uZWVkZWRfJDE9bm8sIGJmZF9jdl9kZWNsX25lZWRlZF8kMT15ZXMpXSkKLUFDX01TR19SRVNVTFQoJGJmZF9jdl9kZWNsX25lZWRlZF8kMSkKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF8kMSA9IHllczsgdGhlbgotICBBQ19ERUZJTkUoW05FRURfREVDTEFSQVRJT05fXXRyYW5zbGl0KCQxLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgICBbRGVmaW5lIGlmICQxIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLl0pCi1maQotXSlkbmwKLQotZG5sIENoZWNrIGZvciBleGlzdGVuY2Ugb2YgYSB0eXBlICQxIGluIHN5cy9wcm9jZnMuaAotCi1BQ19ERUZVTihCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUsCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDEgaW4gc3lzL3Byb2Nmcy5oXSkKLSBBQ19DQUNIRV9WQUwoYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxLAotICAgW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPl0sCi0gICAgICBbJDEgYXZhcl0sCi0gICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDE9eWVzLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxPW5vCi0gICApXSkKLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDEgPSB5ZXM7IHRoZW4KLSAgIEFDX0RFRklORShbSEFWRV9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIDEsCi0JICAgICBbRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyAkMS5dKQotIGZpCi0gQUNfTVNHX1JFU1VMVCgkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxKQotXSkKLQotCi1kbmwgQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBtZW1iZXIgJDIgaW4gdHlwZSAkMSBpbiBzeXMvcHJvY2ZzLmgKLQotQUNfREVGVU4oQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFX01FTUJFUiwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMS4kMiBpbiBzeXMvcHJvY2ZzLmhdKQotIEFDX0NBQ0hFX1ZBTChiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyLAotICAgW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPl0sCi0gICAgICBbJDEgYXZhcjsgdm9pZCogYXJlZiA9ICh2b2lkKikgJmF2YXIuJDJdLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMj15ZXMsCi0gICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyPW5vCi0gICApXSkKLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyID0geWVzOyB0aGVuCi0gICBBQ19ERUZJTkUoW0hBVkVfXXRyYW5zbGl0KCQxLCBbYS16XSwgW0EtWl0pW19ddHJhbnNsaXQoJDIsIFthLXpdLCBbQS1aXSksIDEsCi0JICAgICBbRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyAkMS4kMi5dKQotIGZpCi0gQUNfTVNHX1JFU1VMVCgkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMikKLV0pCi0KLQotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2ggLS0KLSMgc29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLgotIyBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KLQotIyBzZXJpYWwgMQotCi1kbmwgVXNhZ2U6Ci1kbmwgQU1fSU5JVF9BVVRPTUFLRShwYWNrYWdlLHZlcnNpb24sIFtuby1kZWZpbmVdKQotCi1BQ19ERUZVTihBTV9JTklUX0FVVE9NQUtFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pCi1QQUNLQUdFPVskMV0KLUFDX1NVQlNUKFBBQ0tBR0UpCi1WRVJTSU9OPVskMl0KLUFDX1NVQlNUKFZFUlNJT04pCi1kbmwgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCi1maQotaWZlbHNlKFskM10sLAotQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSkpCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKQotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKQotZG5sIEZJWE1FIFRoaXMgaXMgdHJ1bHkgZ3Jvc3MuCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvLCAkbWlzc2luZ19kaXIpCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSldKQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLgotIwotCi1BQ19ERUZVTihBTV9TQU5JVFlfQ0hFQ0ssCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICJbJF0qIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiWyRdKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICJbJF0qIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCi0gICBmaQotCi0gICB0ZXN0ICJbJF0yIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCi1maQotcm0gLWYgY29uZnRlc3QqCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi1kbmwgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0sIERJUkVDVE9SWSkKLWRubCBUaGUgcHJvZ3JhbSBtdXN0IHByb3Blcmx5IGltcGxlbWVudCAtLXZlcnNpb24uCi1BQ19ERUZVTihBTV9NSVNTSU5HX1BST0csCi1bQUNfTVNHX0NIRUNLSU5HKGZvciB3b3JraW5nICQyKQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKCQyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgJDE9JDIKLSAgIEFDX01TR19SRVNVTFQoZm91bmQpCi1lbHNlCi0gICAkMT0iJDMvbWlzc2luZyAkMiIKLSAgIEFDX01TR19SRVNVTFQobWlzc2luZykKLWZpCi1BQ19TVUJTVCgkMSldKQotCi0KLSMgc2VyaWFsIDI1IEFNX1BST0dfTElCVE9PTAotQUNfREVGVU4oQU1fUFJPR19MSUJUT09MLAotW0FDX1JFUVVJUkUoW0FNX0VOQUJMRV9TSEFSRURdKWRubAotQUNfUkVRVUlSRShbQU1fRU5BQkxFX1NUQVRJQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBTV9QUk9HX0xEXSlkbmwKLUFDX1JFUVVJUkUoW0FNX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKLWRubAotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotQUNfU1VCU1QoTElCVE9PTClkbmwKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ci10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGhvc3QiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ1sjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICA7OwotCi0qLSotY3lnd2luKikKLSAgQU1fU1lTX0xJQlRPT0xfQ1lHV0lOCi0gIDs7Ci0KLWVzYWMKLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCBBQ19NU0dfRVJST1IoW2xpYnRvb2wgY29uZmlndXJlIGZhaWxlZF0pCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLV0pCi0KLSMgQU1fRU5BQkxFX1NIQVJFRCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc2hhcmVkIGZsYWcKLSMgVXNhZ2U6IEFNX0VOQUJMRV9TSEFSRURbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQU1fRU5BQkxFX1NIQVJFRCwKLVtkZWZpbmUoW0FNX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzaGFyZWQsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFNX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zaGFyZWQ9QU1fRU5BQkxFX1NIQVJFRF9ERUZBVUxUKWRubAotXSkKLQotIyBBTV9ESVNBQkxFX1NIQVJFRCAtIHNldCB0aGUgZGVmYXVsdCBzaGFyZWQgZmxhZyB0byAtLWRpc2FibGUtc2hhcmVkCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NIQVJFRCwKLVtBTV9FTkFCTEVfU0hBUkVEKG5vKV0pCi0KLSMgQU1fRElTQUJMRV9TVEFUSUMgLSBzZXQgdGhlIGRlZmF1bHQgc3RhdGljIGZsYWcgdG8gLS1kaXNhYmxlLXN0YXRpYwotQUNfREVGVU4oQU1fRElTQUJMRV9TVEFUSUMsCi1bQU1fRU5BQkxFX1NUQVRJQyhubyldKQotCi0jIEFNX0VOQUJMRV9TVEFUSUMgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnCi0jIFVzYWdlOiBBTV9FTkFCTEVfU1RBVElDWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFNX0VOQUJMRV9TVEFUSUMsCi1bZGVmaW5lKFtBTV9FTkFCTEVfU1RBVElDX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc3RhdGljLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BTV9FTkFCTEVfU1RBVElDX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc3RhdGljPUFNX0VOQUJMRV9TVEFUSUNfREVGQVVMVClkbmwKLV0pCi0KLQotIyBBTV9QUk9HX0xEIC0gZmluZCB0aGUgcGF0aCB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCi1BQ19ERUZVTihBTV9QUk9HX0xELAotW0FDX0FSR19XSVRIKGdudS1sZCwKLVsgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub11dLAotdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzLCB3aXRoX2dudV9sZD1ubykKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSBHQ0NdKQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLWNoYW5nZXF1b3RlKCwpZG5sCi0gIC8qIHwgW0EtWmEtel06XFwqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCi1lbHNlCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQotZmkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX0xELAotW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotICAgICAgICB0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmldKQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRMRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi10ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQotQUNfU1VCU1QoTEQpCi1BTV9QUk9HX0xEX0dOVQotXSkKLQotQUNfREVGVU4oQU1fUFJPR19MRF9HTlUsCi1bQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgYWNfY3ZfcHJvZ19nbnVfbGQsCi1bIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maV0pCi1dKQotCi0jIEFNX1BST0dfTk0gLSBmaW5kIHRoZSBwYXRoIHRvIGEgQlNELWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKLUFDX0RFRlVOKEFNX1BST0dfTk0sCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgQlNELWNvbXBhdGlibGUgbm1dKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTk0sCi1baWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluIC91c3IvdWNiIC91c3IvY2NzL2JpbiAkUEFUSCAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgIGFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0gICAgICBlbHNlCi0gICAgICAgIGFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0iCi0gICAgICBmaQotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmldKQotTk09IiRhY19jdl9wYXRoX05NIgotQUNfTVNHX1JFU1VMVChbJE5NXSkKLUFDX1NVQlNUKE5NKQotXSkKLQotIyBBTV9TWVNfTElCVE9PTF9DWUdXSU4gLSBmaW5kIHRvb2xzIG5lZWRlZCBvbiBjeWd3aW4KLUFDX0RFRlVOKEFNX1NZU19MSUJUT09MX0NZR1dJTiwKLVtBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQotQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQotXSkKLQotIyBMaWtlIEFDX0NPTkZJR19IRUFERVIsIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdGFtcCBmaWxlLgotCi1BQ19ERUZVTihBTV9DT05GSUdfSEVBREVSLAotW0FDX1BSRVJFUShbMi4xMl0pCi1BQ19DT05GSUdfSEVBREVSKFskMV0pCi1kbmwgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KLWRubCBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKLWRubCB0aGF0IGlzIGdlbmVyYXRlZC4gIFdlIG11c3Qgc3RyaXAgZXZlcnl0aGluZyBwYXN0IHRoZSBmaXJzdCAiOiIsCi1kbmwgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgbGFzdCAiLyIuCi1BQ19PVVRQVVRfQ09NTUFORFMoY2hhbmdlcXVvdGUoPDwsPj4pZG5sCi1pZmVsc2UocGF0c3Vic3QoPDwkMT4+LCA8PFteIF0+PiwgPDw+PiksIDw8Pj4sCi08PHRlc3QgLXogIjw8JD4+Q09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gcGF0c3Vic3QoPDwkMT4+LCA8PF5cKFteOl0qL1wpPy4qPj4sIDw8XDE+PilzdGFtcC1oPDw+PmRubD4+LAotPDxhbV9pbmR4PTEKLWZvciBhbV9maWxlIGluIDw8JDE+PjsgZG8KLSAgY2FzZSAiIDw8JD4+Q09ORklHX0hFQURFUlMgIiBpbgotICAqIiA8PCQ+PmFtX2ZpbGUgIio8PCk+PgotICAgIGVjaG8gdGltZXN0YW1wID4gYGVjaG8gPDwkPj5hbV9maWxlIHwgc2VkIC1lICdzJTouKiUlJyAtZSAncyVbXi9dKiQlJSdgc3RhbXAtaCRhbV9pbmR4Ci0gICAgOzsKLSAgZXNhYwotICBhbV9pbmR4PWBleHByICI8PCQ+PmFtX2luZHgiICsgMWAKLWRvbmU8PD4+ZG5sPj4pCi1jaGFuZ2VxdW90ZShbLF0pKV0pCi0KLSMgQWRkIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvcHRpb24gdG8gY29uZmlndXJlLgotIyBGcm9tIEppbSBNZXllcmluZwotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX01BSU5UQUlORVJfTU9ERSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKLSAgZG5sIG1haW50YWluZXItbW9kZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Ci0gIEFDX0FSR19FTkFCTEUobWFpbnRhaW5lci1tb2RlLAotWyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyXSwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbCwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9bm8pCi0gIEFDX01TR19SRVNVTFQoJFVTRV9NQUlOVEFJTkVSX01PREUpCi0gIEFNX0NPTkRJVElPTkFMKE1BSU5UQUlORVJfTU9ERSwgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllcykKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIEFDX1NVQlNUKE1BSU5UKWRubAotXQotKQotCi0jIERlZmluZSBhIGNvbmRpdGlvbmFsLgotCi1BQ19ERUZVTihBTV9DT05ESVRJT05BTCwKLVtBQ19TVUJTVCgkMV9UUlVFKQotQUNfU1VCU1QoJDFfRkFMU0UpCi1pZiAkMjsgdGhlbgotICAkMV9UUlVFPQotICAkMV9GQUxTRT0nIycKLWVsc2UKLSAgJDFfVFJVRT0nIycKLSAgJDFfRkFMU0U9Ci1maV0pCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLUFDX0RFRlVOKENZX1dJVEhfTkxTLAotICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCi0gICAgQUNfQVJHX0VOQUJMRShubHMsCi0gICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCi0gICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKLSAgICBBQ19TVUJTVChVU0VfTkxTKQotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKLSAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMsIDEsIFtEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAotICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCi0gICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0Ci0gICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKLSAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCi0JZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCi0JbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCi0JICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKLQkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAotCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCi0JCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhULCAxLAotCQkJW0RlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0Ll0pCi0JICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKLQkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0JCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLQkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKLQkJICBbQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmVdLAotCQkgIFtDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYl0pCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQldKQotCi0JZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCi0gICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCi0KLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KLQkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KLQkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgotICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCi0gICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLSAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KLSAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQotCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCi0JaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgQUNfTVNHX1JFU1VMVCgKLQkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCi0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCi0gICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncwotICAgIGRubCBpbiBjb25maWd1cmUuaW4uCi0gICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KLSAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKLSAgICBBQ19TVUJTVChDQVRBTE9HUykKLSAgICBBQ19TVUJTVChDQVRPQkpFWFQpCi0gICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCi0gICAgQUNfU1VCU1QoR01PRklMRVMpCi0gICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKLSAgICBBQ19TVUJTVChJTlRMREVQUykKLSAgICBBQ19TVUJTVChJTlRMTElCUykKLSAgICBBQ19TVUJTVChJTlRMT0JKUykKLSAgICBBQ19TVUJTVChQT0ZJTEVTKQotICAgIEFDX1NVQlNUKFBPU1VCKQotICBdKQotCi1BQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKLSAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCi0KLSAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKLSAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb25dKQotICAgZmkKLQotICAgQU1fTENfTUVTU0FHRVMKLSAgIENZX1dJVEhfTkxTCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCi0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQotICAgICBmaQotCi0gICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgotICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQotICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCi0gICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCi0KLSAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKLSAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgotICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKLSAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKLQotCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKLSAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgotCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgotICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCi0gICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0Ci0gICBkbmwgcGFja2FnZXMuCi0gICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgQUNfU1VCU1QoR1RfTk8pCi0gICBBQ19TVUJTVChHVF9ZRVMpCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCi0KLSAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgotICAgbD0KLSAgIEFDX1NVQlNUKGwpCi0KLSAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCi0gICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKLSAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgotICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIF0pCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLWRubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKLWRubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKLUFDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCi1bIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCi1bY2FzZSAiWyRdJDEiIGluCi0gIC8qKQotICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiBbJDNdOyB0aGVuCi0JYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKLWRubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgotaWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKLV0pZG5sCi0gIDs7Ci1lc2FjXSlkbmwKLSQxPSIkYWNfY3ZfcGF0aF8kMSIKLWlmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFskXSQxKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFDX1NVQlNUKCQxKWRubAotXSkKLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQpkaWZmIC0tZ2l0IGEvYmZkL2FpeDM4Ni1jb3JlLmMgYi9iZmQvYWl4Mzg2LWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc1ZmE5NC4uMDAwMDAwMAotLS0gYS9iZmQvYWl4Mzg2LWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFJWCBvbiBQUy8yIGNvcmUgZmlsZXMuCi0gICBUaGlzIHdhcyBiYXNlZCBvbiB0cmFkLWNvcmUuYywgd2hpY2ggd2FzIHdyaXR0ZW4gYnkgSm9obiBHaWxtb3JlIG9mCi0gICAgICAgIEN5Z251cyBTdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5ODgsIDg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1pbmggVHJhbi1MZSA8VFJBTkxFQElOVEVMTElDT1JQLkNPTT4uCi0gICBDb252ZXJ0ZWQgdG8gYmFjayBlbmQgZm9ybSBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaTM4Ni5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2lmIGRlZmluZWQgKF9BSVgpICYmIGRlZmluZWQgKF9JMzg2KQotI2RlZmluZSBOT0NIRUNLUwkJLyogdGhpcyBpcyBmb3IgY29yZWR1bXAuaCAqLwotI2RlZmluZSBfaF9VU0VSCQkJLyogYXZvaWQgaW5jbHVkaW5nIHVzZXIuaCBmcm9tIGNvcmVkdW1wLmggKi8KLSNpbmNsdWRlIDx1aW5mby5oPgotI2luY2x1ZGUgPHN5cy9pMzg2L2NvcmVkdW1wLmg+Ci0jZW5kaWYgLyogX0FJWCAmJiBfSTM4NiAqLwotCi0vKiBtYXliZSB0aGlzIGNvdWxkIHdvcmsgb24gc29tZSBvdGhlciBpMzg2IGJ1dCBJIGhhdmUgbm90IHRyaWVkIGl0Ci0gKiBtdHJhbmxlQHBhcmlzIC0gVHVlIFNlcCAyNCAxMjo0OTozNSAxOTkxCi0gKi8KLQotI2lmbmRlZiBDT1JfTUFHSUMKLSMgZGVmaW5lIENPUl9NQUdJQyAiY29yZSIKLSNlbmRpZgotCi0vKiBuZWVkIHRoaXMgY2FzdCBiZWNhdXNlIHB0ciBpcyByZWFsbHkgdm9pZCAqICovCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgXAotICAgICgoKGJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEpKS0+aGRyKQotI2RlZmluZSBjb3JlX3NlY3Rpb24oYmZkLG4pIFwKLSAgICAoKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YSktPnNlY3Rpb25zW25dKQotI2RlZmluZSBjb3JlX3JlZ3NlYyhiZmQpIFwKLSAgICAoKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YSktPnJlZ19zZWN0aW9uKQotI2RlZmluZSBjb3JlX3JlZzJzZWMoYmZkKSBcCi0gICAgKCgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEpLT5yZWcyX3NlY3Rpb24pCi0KLS8qIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIGJmZCdzIHRkYXRhICovCi1zdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCB7Ci0gIHN0cnVjdCBjb3JlaGRyICpoZHI7CQkvKiBjb3JlIGZpbGUgaGVhZGVyICovCi0gIGFzZWN0aW9uICpyZWdfc2VjdGlvbjsKLSAgYXNlY3Rpb24gKnJlZzJfc2VjdGlvbjsKLSAgYXNlY3Rpb24gKnNlY3Rpb25zW01BWF9DT1JFX1NFR1NdOwotfTsKLQotc3RhdGljIHZvaWQgc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWFpeDM4Nl9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgaSxuOwotICB1bnNpZ25lZCBjaGFyIGxvbmdidWZbNF07CS8qIFJhdyBieXRlcyBvZiB2YXJpb3VzIGhlYWRlciBmaWVsZHMgKi8KLSAgaW50IGNvcmVfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGNvcmVoZHIpOwotICBzdHJ1Y3QgY29yZWhkciAqY29yZTsKLSAgc3RydWN0IG1lcmdlbSB7Ci0gICAgc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgY29yZWRhdGE7Ci0gICAgc3RydWN0IGNvcmVoZHIgaW50ZXJuYWxfY29yZTsKLSAgfSAqbWVyZ2VtOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUilsb25nYnVmLCAxLCBzaXplb2YgKGxvbmdidWYpLCBhYmZkKSAhPSBzaXplb2YgKGxvbmdidWYpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoc3RybmNtcChsb25nYnVmLENPUl9NQUdJQyw0KSkgcmV0dXJuIDA7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwTCwgZmFsc2UpIDwgMCkgcmV0dXJuIDA7Ci0KLSAgbWVyZ2VtID0gKHN0cnVjdCBtZXJnZW0gKiliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBtZXJnZW0pKTsKLSAgaWYgKG1lcmdlbSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIGNvcmUgPSAmbWVyZ2VtLT5pbnRlcm5hbF9jb3JlOwotCi0gIGlmICgoYmZkX3JlYWQgKChQVFIpIGNvcmUsIDEsIGNvcmVfc2l6ZSwgYWJmZCkpICE9IGNvcmVfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKGNoYXIgKiltZXJnZW0pOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHNldF90ZGF0YSAoYWJmZCwgJm1lcmdlbS0+Y29yZWRhdGEpOwotICBjb3JlX2hkciAoYWJmZCkgPSBjb3JlOwotCi0gIC8qIGNyZWF0ZSB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIHJhdW5jaHksIGJ1dCBiZmRfY2xvc2Ugd2FudHMgdG8gcmVjbGFpbQotICAgICB0aGVtICovCi0gIGNvcmVfcmVnc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX3JlZ3NlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgbG9zZXI6Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKGNoYXIgKiltZXJnZW0pOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBjb3JlX3JlZzJzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfcmVnMnNlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgbG9zZXIxOgotICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgY29yZV9yZWdzZWMgKGFiZmQpKTsKLSAgICAgIGdvdG8gbG9zZXI7Ci0gICAgfQotCi0gIGZvciAoaT0wLCBuPTAgOyAoaSA8IE1BWF9DT1JFX1NFR1MpICYmIChjb3JlLT5jZF9zZWdzW2ldLmNzX3R5cGUpIDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChjb3JlLT5jZF9zZWdzW2ldLmNzX29mZnNldCA9PSAwKQotCWNvbnRpbnVlOwotICAgICAgY29yZV9zZWN0aW9uIChhYmZkLG4pID0KLQkoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICAgICAgaWYgKGNvcmVfc2VjdGlvbiAoYWJmZCxuKSA9PSBOVUxMKQotCXsKLQkgIGludCBqOwotCSAgaWYgKG4gPiAwKQotCSAgICB7Ci0JICAgICAgZm9yIChqPTA7IGogPCBuOyBqKyspCi0JCWJmZF9yZWxlYXNlIChhYmZkLCBjb3JlX3NlY3Rpb24oYWJmZCwgaikpOwotCSAgICB9Ci0JICBiZmRfcmVsZWFzZSAoYWJmZCwgKGNoYXIgKiltZXJnZW0pOwotCSAgZ290byBsb3NlcjE7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGNvcmUtPmNkX3NlZ3NbaV0uY3NfdHlwZSkKLQl7Ci0JY2FzZSBDT1JfVFlQRV9EQVRBOgotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmFtZSA9ICIuZGF0YSI7Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5mbGFncyA9IChTRUNfQUxMT0MgKyBTRUNfTE9BRCArCi0JCQkJCSAgIFNFQ19IQVNfQ09OVEVOVFMpOwotCSAgYnJlYWs7Ci0JY2FzZSBDT1JfVFlQRV9TVEFDSzoKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5hbWUgPSAiLnN0YWNrIjsKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZsYWdzID0gKFNFQ19BTExPQyArIFNFQ19MT0FEICsKLQkJCQkJICAgU0VDX0hBU19DT05URU5UUyk7Ci0JICBicmVhazsKLQljYXNlIENPUl9UWVBFX0xJQkRBVEE6Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uYW1lID0gIi5saWJkYXRhIjsKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZsYWdzID0gKFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFMpOwotCSAgYnJlYWs7Ci0JY2FzZSBDT1JfVFlQRV9XUklURToKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5hbWUgPSAiLndyaXRlYWJsZSI7Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5mbGFncyA9IChTRUNfQUxMT0MgKyBTRUNfSEFTX0NPTlRFTlRTKTsKLQkgIGJyZWFrOwotCWNhc2UgQ09SX1RZUEVfTVNDOgotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmFtZSA9ICIubWlzYyI7Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5mbGFncyA9IChTRUNfQUxMT0MgKyBTRUNfSEFTX0NPTlRFTlRTKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uYW1lID0gIi51bmtub3duIjsKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZsYWdzID0gKFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFMpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+X3Jhd19zaXplID0gY29yZS0+Y2Rfc2Vnc1tpXS5jc19sZW47Ci0gICAgICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT52bWEgICAgICAgPSBjb3JlLT5jZF9zZWdzW2ldLmNzX2FkZHJlc3M7Ci0gICAgICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5maWxlcG9zICAgPSBjb3JlLT5jZF9zZWdzW2ldLmNzX29mZnNldDsKLSAgICAgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0gICAgICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uZXh0ICAgICAgPSBOVUxMOwotICAgICAgaWYgKG4gPiAwKQotCWNvcmVfc2VjdGlvbiAoYWJmZCwgKG4tMSkpLT5uZXh0ID0gY29yZV9zZWN0aW9uIChhYmZkLCBuKTsKLQotICAgICAgYWJmZC0+c2VjdGlvbl9jb3VudCA9ICsrbjsKLSAgICB9Ci0KLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5uYW1lID0gIi5yZWciOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5uYW1lID0gIi5yZWcyIjsKLQotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotCi0gIGNvcmVfcmVnc2VjIChhYmZkKS0+X3Jhd19zaXplID0gc2l6ZW9mKGNvcmUtPmNkX3JlZ3MpOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBzaXplb2YoY29yZS0+Y2RfZnByZWdzKTsKLQotICBjb3JlX3JlZ3NlYyAoYWJmZCktPnZtYSA9IC0xOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT52bWEgPSAtMTsKLQotICAvKiBXZSdsbCBhY2Nlc3MgdGhlIHJlZ3MgYWZyZXNoIGluIHRoZSBjb3JlIGZpbGUsIGxpa2UgYW55IHNlY3Rpb246ICovCi0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmlsZXBvcyA9IChmaWxlX3B0cilvZmZzZXRvZihzdHJ1Y3QgY29yZWhkcixjZF9yZWdzWzBdKTsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+ZmlsZXBvcyA9IChmaWxlX3B0cilvZmZzZXRvZihzdHJ1Y3QgY29yZWhkciwKLQkJCQkJCSAgICBjZF9mcHJlZ3MpOwotCi0gIC8qIGFkZCB0aGUgMiByZWcgZmFrZSBzZWN0aW9ucyB0byBhYmZkICovCi0gIGFiZmQtPnNlY3Rpb25fY291bnQgKz0gMjsKLSAgYWJmZC0+c2VjdGlvbnMgPSBjb3JlX3JlZ3NlYyAoYWJmZCk7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfcmVnMnNlYyAoYWJmZCk7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPm5leHQgPSBjb3JlX3NlY3Rpb24gKGFiZmQsIDApOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgY2hhciAqCi1haXgzODZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9oZHIgKGFiZmQpLT5jZF9jb21tOwotfQotCi1zdGF0aWMgaW50Ci1haXgzODZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX2hkciAoYWJmZCktPmNkX2N1cnNpZzsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWFpeDM4Nl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZDsKLSAgICAgYmZkICpleGVjX2JmZDsKLXsKLSAgcmV0dXJuIHRydWU7CQkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcwotCQkJCSAgIHBvaW50ICovCi19Ci0KLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lCU5PX0dFVAkoKFBST1RPKGJmZF92bWEsICgqKSwgKCAgICAgICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZSBOT19HRVRTICgoUFJPVE8oYmZkX3NpZ25lZF92bWEsICgqKSwgKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKFBST1RPKHZvaWQsICAgICAgICAoKiksIChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IGFpeDM4Nl9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAiYWl4Mzg2LWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOR19CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgICAnICcsCQkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19HRVRTLCBOT19QVVQsCi0gICAgTk9fR0VULCBOT19HRVRTLCBOT19QVVQsCi0gICAgTk9fR0VULCBOT19HRVRTLCBOT19QVVQsIC8qIGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX0dFVFMsIE5PX1BVVCwKLSAgICBOT19HRVQsIE5PX0dFVFMsIE5PX1BVVCwKLSAgICBOT19HRVQsIE5PX0dFVFMsIE5PX1BVVCwgLyogaGRycyAqLwotCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBfYmZkX2R1bW15X3RhcmdldCwKLSAgICAgX2JmZF9kdW1teV90YXJnZXQsIGFpeDM4Nl9jb3JlX2ZpbGVfcH0sCi0gICAge2JmZF9mYWxzZSwgYmZkX2ZhbHNlLAkvKiBiZmRfY3JlYXRlX29iamVjdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgYmZkX2ZhbHNlLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGFpeDM4NiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQtYWRvYmUuYyBiL2JmZC9hb3V0LWFkb2JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMTFmZmUuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQtYWRvYmUuYworKysgL2Rldi9udWxsCkBAIC0xLDUyNyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGEub3V0LmFkb2JlIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LiAgQmFzZWQgb24gYm91dC5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImFvdXQvYWRvYmUuaCIKLQotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFfb3V0X2Fkb2JlX3ZlYzsJCS8qIEZvcndhcmQgZGVjbCAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqYW91dF9hZG9iZV9jYWxsYmFjayBQQVJBTVMgKChiZmQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBhb3V0XzMyX3NsdXJwX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBib29sZWFuIGFvdXRfMzJfd3JpdGVfc3ltcyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgYW91dF9hZG9iZV93cml0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VjX3B0ciBzZWN0KSk7Ci0KLS8qIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBleGVjdXRhYmxlIGhlYWRlciB0YWtlbiBmcm9tIGEgcmF3IGJ5dGUKLSAgIHN0cmVhbSBtZW1vcnkgaW1hZ2UsIGludG8gdGhlIGludGVybmFsIGV4ZWNfaGVhZGVyIHN0cnVjdHVyZS4gICovCi0KLXZvaWQgYW91dF9hZG9iZV9zd2FwX2V4ZWNfaGVhZGVyX2luCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcywKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3ApKTsKLQkgCi12b2lkCi1hb3V0X2Fkb2JlX3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+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+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19EQVRBKQl7Ci0gICAgICAgICAgaWYgKCFhb3V0XzMyX3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBzZWN0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hb3V0X2Fkb2JlX3dyaXRlX3NlY3Rpb24gKGFiZmQsIHNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0OwotewotICAvKiBGSVhNRSBYWFggKi8KLX0KLQwKLXN0YXRpYyBib29sZWFuCi1hb3V0X2Fkb2JlX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGZpbGVfcHRyIHNlY3Rpb25fc3RhcnQ7Ci0gIHNlY19wdHIgc2VjdDsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkgeyAvKiBzZXQgYnkgYmZkLmMgaGFuZGxlciAqLwotCi0gICAgLyogQXNzaWduIGZpbGUgb2Zmc2V0cyB0byBzZWN0aW9ucy4gIFRleHQgc2VjdGlvbnMgYXJlIGZpcnN0LCBhbmQKLSAgICAgICBhcmUgY29udGlndW91cy4gIFRoZW4gZGF0YSBzZWN0aW9ucy4gIEV2ZXJ5dGhpbmcgZWxzZSBhdCB0aGUgZW5kLiAgKi8KLQotICAgIHNlY3Rpb25fc3RhcnQgPSBOX1RYVE9GRiAoaWdub3JlPC0tPm1lKTsKLQotICAgIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgewotICAgICAgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0NPREUpCXsKLSAgICAgICAgc2VjdC0+ZmlsZXBvcyA9IHNlY3Rpb25fc3RhcnQ7Ci0JLyogRklYTUU6ICBSb3VuZCB0byBhbGlnbm1lbnQgKi8KLQlzZWN0aW9uX3N0YXJ0ICs9IHNlY3QtPl9yYXdfc2l6ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKLSAgICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19EQVRBKQl7Ci0gICAgICAgIHNlY3QtPmZpbGVwb3MgPSBzZWN0aW9uX3N0YXJ0OwotCS8qIEZJWE1FOiAgUm91bmQgdG8gYWxpZ25tZW50ICovCi0Jc2VjdGlvbl9zdGFydCArPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTICYmCi0JICAhKHNlY3QtPmZsYWdzICYgKFNFQ19DT0RFfFNFQ19EQVRBKSkpCXsKLSAgICAgICAgc2VjdC0+ZmlsZXBvcyA9IHNlY3Rpb25fc3RhcnQ7Ci0JLyogRklYTUU6ICBSb3VuZCB0byBhbGlnbm1lbnQgKi8KLQlzZWN0aW9uX3N0YXJ0ICs9IHNlY3QtPl9yYXdfc2l6ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiByZWdhcmRsZXNzLCBvbmNlIHdlIGtub3cgd2hhdCB3ZSdyZSBkb2luZywgd2UgbWlnaHQgYXMgd2VsbCBnZXQgZ29pbmcgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvdW50ICE9IDApIHsKLSAgICByZXR1cm4gKGJmZF93cml0ZSAoKFBUUilsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpID09IGNvdW50KSA/dHJ1ZTpmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfYWRvYmVfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICBpZiAoISBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bgotICAgICAgfHwgYXJjaCA9PSBiZmRfYXJjaF9tNjhrKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGludCAKLWFvdXRfYWRvYmVfc2l6ZW9mX2hlYWRlcnMgKGlnbm9yZV9hYmZkLCBpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIGJvb2xlYW4gaWdub3JlOwotewotICByZXR1cm4gc2l6ZW9mKHN0cnVjdCBpbnRlcm5hbF9leGVjKTsKLX0KLQotCi0KLQotLyogQnVpbGQgdGhlIHRyYW5zZmVyIHZlY3RvciBmb3IgQWRvYmUgQS5PdXQgZmlsZXMuICAqLwotCi0jZGVmaW5lIGFvdXRfMzJfY2xvc2VfYW5kX2NsZWFudXAgYW91dF8zMl9iZmRfZnJlZV9jYWNoZWRfaW5mbwotCi0jZGVmaW5lIGFvdXRfMzJfYmZkX21ha2VfZGVidWdfc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICosIHZvaWQgKiwgdW5zaWduZWQgbG9uZykpKSBiZmRfbnVsbHZvaWRwdHIpCi0KLSNkZWZpbmUgYW91dF8zMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgXAotICAoKHJlbG9jX2hvd3RvX3R5cGUgKigqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpKSBiZmRfbnVsbHZvaWRwdHIpCi0KLSNkZWZpbmUJYW91dF8zMl9zZXRfYXJjaF9tYWNoCQlhb3V0X2Fkb2JlX3NldF9hcmNoX21hY2gKLSNkZWZpbmUJYW91dF8zMl9zZXRfc2VjdGlvbl9jb250ZW50cwlhb3V0X2Fkb2JlX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0KLSNkZWZpbmUJYW91dF8zMl9zaXplb2ZfaGVhZGVycwkJYW91dF9hZG9iZV9zaXplb2ZfaGVhZGVycwotI2RlZmluZSBhb3V0XzMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotI2RlZmluZSBhb3V0XzMyX2JmZF9yZWxheF9zZWN0aW9uICAgICAgIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYW91dF8zMl9iZmRfZ2Nfc2VjdGlvbnMgICAgICAgICBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBhb3V0XzMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLSAgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYW91dF8zMl9iZmRfbGlua19hZGRfc3ltYm9scwlfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBhb3V0XzMyX2JmZF9maW5hbF9saW5rCQlfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBhb3V0XzMyX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24JX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi1jb25zdCBiZmRfdGFyZ2V0IGFfb3V0X2Fkb2JlX3ZlYyA9Ci17Ci0gICJhLm91dC5hZG9iZSIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyB1bmtub3duIChiaWcgYXNzdW1lZCkgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZHIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCApLAotICAvKiBzZWN0aW9uIGZsYWdzICovCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JFTE9DKSwKLSAgJ18nLAkJCQkvKiAgc3ltYm9sIGxlYWRpbmcgY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotIHtfYmZkX2R1bW15X3RhcmdldCwgYW91dF9hZG9iZV9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0ge2JmZF9mYWxzZSwgYW91dF9hZG9iZV9ta29iamVjdCwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0ge2JmZF9mYWxzZSwgYW91dF9hZG9iZV93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9ic2QpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvYW91dC1hcm0uYyBiL2JmZC9hb3V0LWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWI5MDBiLi4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgcmF3IEFSTSBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0gICAKLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0gICgoTl9NQUdJQyh4KSA9PSBOTUFHSUMpID8gMHg4MDAwIDogXAotICAgKE5fTUFHSUMoeCkgIT0gWk1BR0lDKSA/IDAgOiBcCi0gICAoTl9TSEFSRURfTElCKHgpKSA/ICgoeCkuYV9lbnRyeSAmIH4oVEFSR0VUX1BBR0VfU0laRSAtIDEpKSA6IFwKLSAgIFRFWFRfU1RBUlRfQUREUikKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMHg4MDAwCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMHg4MDAwCi0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9hcm0KLQotI2RlZmluZSBNWShPUCkgQ0FUKGFvdXRhcm1fLE9QKQotI2RlZmluZSBOX0JBRE1BRyh4KSAoKCgoeCkuYV9pbmZvICYgfjAwNzIwMCkgIT0gWk1BR0lDKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAoKCh4KS5hX2luZm8gJiB+MDA2MDAwKSAhPSBPTUFHSUMpICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICgoeCkuYV9pbmZvICE9IE5NQUdJQykpCi0jZGVmaW5lIE5fTUFHSUMoeCkgKCh4KS5hX2luZm8gJiB+MDcyMDApCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2RlZmluZSBNWUFSTShPUCkgQ0FUKGFvdXRhcm1fLE9QKQotcmVsb2NfaG93dG9fdHlwZSAJKk1ZQVJNKGJmZF9yZWxvY190eXBlX2xvb2t1cCkKLQkJCQlQQVJBTVMoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIAkJTVlBUk0od3JpdGVfb2JqZWN0X2NvbnRlbnRzKQlQQVJBTVMoKGJmZCAqKSk7Ci0KLS8qIEF2b2lkIG11bHRpcGxlIGRlZmluaW5pdGlvbnMgZnJvbSBhb3V0eCBpZiBzdXBwb3J0aW5nIHN0YW5kYXJhZCBhLm91dCAKLSAgIGFzIHdlbGwgYXMgb3VyIG93bi4gICovCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQzKGFvdXRhcm0sXzMyXyx5KQotCi0jZGVmaW5lIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCBhb3V0YXJtX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLU1ZKGZpeF9wY3JlbF8yNl9kb25lKQlQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKLQkJCQkgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotTVkoZml4X3BjcmVsXzI2KQkgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCQkJICBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgTVkoc3dhcF9zdGRfcmVsb2NfaW4pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICosCi0JCQkJCSAgIGFyZWxlbnQgKiwgYXN5bWJvbCAqKiwKLQkJCQkJICAgYmZkX3NpemVfdHlwZSkpOwotdm9pZCBNWShzd2FwX3N0ZF9yZWxvY19vdXQpIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIAotCQkJCSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSk7Ci0KLXJlbG9jX2hvd3RvX3R5cGUgTVkoaG93dG9fdGFibGUpW10gPQotewotICAvKiB0eXBlIHJzIHNpemUgYnN6IHBjcmVsIGJpdHBvcyBvdnJmIHNmIG5hbWUgcGFydF9pbnBsIHJlYWRtYXNrIHNldG1hc2sKLSAgICAgcGNkb25lICovCi0gIEhPV1RPICgwLCAwLCAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICI4IiwgdHJ1ZSwKLQkgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoMSwgMCwgMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjE2IiwgdHJ1ZSwKLQkgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMiwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjMyIiwgdHJ1ZSwKLQkgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMywgMiwgMiwgMjYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgTVkoZml4X3BjcmVsXzI2KSwKLQkgIkFSTTI2IiwgdHJ1ZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgdHJ1ZSksCi0gIEhPV1RPICg0LCAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQOCIsIHRydWUsCi0JIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIHRydWUpLAotICBIT1dUTyAoNSwgMCwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1AxNiIsIHRydWUsCi0JIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIHRydWUpLAotICBIT1dUTyAoNiwgMCwgMiwgMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1AzMiIsIHRydWUsCi0JIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIHRydWUpLAotICBIT1dUTyAoNywgMiwgMiwgMjYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIE1ZKGZpeF9wY3JlbF8yNl9kb25lKSwgIkFSTTI2RCIsIHRydWUsIDB4MCwgMHgwLAotCSBmYWxzZSksCi0gIHstMX0sCi0gIEhPV1RPICg5LCAwLCAtMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIk5FRzE2IiwgdHJ1ZSwKLQkgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMTAsIDAsIC0yLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiTkVHMzIiLCB0cnVlLAotCSAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSkKLX07Ci0KLSNkZWZpbmUgUkVMT0NfQVJNX0JJVFNfTkVHX0JJRyAgICAgICgodW5zaWduZWQgaW50KSAweDA4KQotI2RlZmluZSBSRUxPQ19BUk1fQklUU19ORUdfTElUVExFICAgKCh1bnNpZ25lZCBpbnQpIDB4MTApCi0KLXJlbG9jX2hvd3RvX3R5cGUgKgotTVkocmVsb2NfaG93dG8pKGFiZmQsIHJlbCwgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsOwotICAgICBpbnQgKnJfaW5kZXg7Ci0gICAgIGludCAqcl9leHRlcm47Ci0gICAgIGludCAqcl9wY3JlbDsKLXsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICB1bnNpZ25lZCBpbnQgcl9wY3JlbF9kb25lOwotICB1bnNpZ25lZCBpbnQgcl9uZWc7Ci0gIGludCBpbmRleDsKLQotICAqcl9wY3JlbCA9IDA7Ci0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgICpyX2luZGV4ICAgICA9ICAoKHJlbC0+cl9pbmRleFswXSA8PCAxNikKLQkJICAgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICAgICAgfCByZWwtPnJfaW5kZXhbMl0pOwotICAgICAgKnJfZXh0ZXJuICAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRykpOwotICAgICAgcl9wY3JlbF9kb25lID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHKSk7Ci0gICAgICByX25lZyAJICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19BUk1fQklUU19ORUdfQklHKSk7Ci0gICAgICByX2xlbmd0aCAgICAgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRykKLQkJICAgICAgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKnJfaW5kZXggICAgID0gKChyZWwtPnJfaW5kZXhbMl0gPDwgMTYpCi0JCSAgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICAgICB8IHJlbC0+cl9pbmRleFswXSk7Ci0gICAgICAqcl9leHRlcm4gICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7Ci0gICAgICByX3BjcmVsX2RvbmUgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLSAgICAgIHJfbmVnIAkgICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0FSTV9CSVRTX05FR19MSVRUTEUpKTsKLSAgICAgIHJfbGVuZ3RoICAgICA9ICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFKQotCQkgICAgICA+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKTsKLSAgICB9Ci0gIGluZGV4ID0gcl9sZW5ndGggKyA0ICogcl9wY3JlbF9kb25lICsgOCAqIHJfbmVnOwotICBpZiAoaW5kZXggPT0gMykKLSAgICAqcl9wY3JlbCA9IDE7Ci0KLSAgcmV0dXJuIE1ZKGhvd3RvX3RhYmxlKSArIGluZGV4OwotfQotIAotI2RlZmluZSBNWV9yZWxvY19ob3d0byhCRkQsIFJFTCwgSU4sIEVYLCBQQykgXAotCU1ZKHJlbG9jX2hvd3RvKSAoQkZELCBSRUwsICZJTiwgJkVYLCAmUEMpCi0KLXZvaWQKLU1ZKHB1dF9yZWxvYykoYWJmZCwgcl9leHRlcm4sIHJfaW5kZXgsIHZhbHVlLCBob3d0bywgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHJfZXh0ZXJuOwotICAgICBpbnQgcl9pbmRleDsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbG9jOwotewotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg7Ci0gIGludCByX3BjcmVsOwotICBpbnQgcl9uZWc7Ci0KLSAgUFVUX1dPUkQgKGFiZmQsIHZhbHVlLCByZWxvYy0+cl9hZGRyZXNzKTsKLSAgcl9sZW5ndGggPSBob3d0by0+c2l6ZSA7CS8qIFNpemUgYXMgYSBwb3dlciBvZiB0d28gKi8KLQotICAvKiBTcGVjaWFsIGNhc2UgZm9yIGJyYW5jaCByZWxvY2F0aW9ucy4gKi8KLSAgaWYgKGhvd3RvLT50eXBlID09IDMgfHwgaG93dG8tPnR5cGUgPT0gNykKLSAgICByX2xlbmd0aCA9IDM7Ci0KLSAgcl9wY3JlbCAgPSBob3d0by0+dHlwZSAmIDQ7IAkvKiBQQyBSZWxhdGl2ZSBkb25lPyAqLwotICByX25lZyA9IGhvd3RvLT50eXBlICYgODsJLyogTmVnYXRpdmUgcmVsb2NhdGlvbiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICByZWxvYy0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICByZWxvYy0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIHJlbG9jLT5yX2luZGV4WzJdID0gcl9pbmRleDsKLSAgICAgIHJlbG9jLT5yX3R5cGVbMF0gPQotCSgocl9leHRlcm4gPyAgICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRyA6IDApCi0JIHwgKHJfcGNyZWwgPyAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcgOiAwKQotCSB8IChyX25lZyA/CSBSRUxPQ19BUk1fQklUU19ORUdfQklHIDogMCkKLQkgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxvYy0+cl9pbmRleFsyXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICByZWxvYy0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIHJlbG9jLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLSAgICAgIHJlbG9jLT5yX3R5cGVbMF0gPQotCSgocl9leHRlcm4gPyAgICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSA6IDApCi0JIHwgKHJfcGNyZWwgPyAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUgOiAwKQotCSB8IChyX25lZyA/CSBSRUxPQ19BUk1fQklUU19ORUdfTElUVExFIDogMCkKLQkgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpKTsKLSAgICB9Ci19Ci0gCi0jZGVmaW5lIE1ZX3B1dF9yZWxvYyhCRkQsIEVYVCwgSURYLCBWQUwsIEhPV1RPLCBSRUxPQykgXAotICBNWShwdXRfcmVsb2MpKEJGRCwgRVhULCBJRFgsIFZBTCwgSE9XVE8sIFJFTE9DKQotCi12b2lkCi1NWShyZWxvY2F0YWJsZV9yZWxvYykoaG93dG8sIGFiZmQsIHJlbG9jLCBhbW91bnQsIHJfYWRkcikKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsb2M7Ci0gICAgIGJmZF92bWEgKmFtb3VudDsKLSAgICAgYmZkX3ZtYSByX2FkZHI7Ci17Ci0gIGlmIChob3d0by0+dHlwZSA9PSAzKQotICAgIHsKLSAgICAgIGlmIChyZWxvYy0+cl90eXBlWzBdIAotCSAgJiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKQotCSAgICAgPyBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHIDogUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSkpCi0JewotCSAgLyogVGhlIHJlbG9jIGlzIHN0aWxsIGV4dGVybmFsLCBzbyBkb24ndCBtb2RpZnkgYW55dGhpbmcuICovCi0JICAqYW1vdW50ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKmFtb3VudCAtPSByX2FkZHI7Ci0JICAvKiBDaGFuZ2UgdGhlIHJfcGNyZWwgdmFsdWUgLS0gb24gdGhlIEFSTSwgdGhpcyBiaXQgaXMgc2V0IG9uY2UgdGhlCi0JICAgICByZWxvY2F0aW9uIGlzIGRvbmUuICAqLwotCSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JICAgIHJlbG9jLT5yX3R5cGVbMF0gfD0gUkVMT0NfU1REX0JJVFNfUENSRUxfQklHOwotCSAgZWxzZQotCSAgICByZWxvYy0+cl90eXBlWzBdIHw9IFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChob3d0by0+dHlwZSA9PSA3KQotICAgICphbW91bnQgPSAwOwotfQotCi0jZGVmaW5lIE1ZX3JlbG9jYXRhYmxlX3JlbG9jKEhPVywgQkZELCBSRUwsIEFNT1VOVCwgQUREUikgXAotICBNWShyZWxvY2F0YWJsZV9yZWxvYykoSE9XLCBCRkQsIFJFTCwgJihBTU9VTlQpLCBBRERSKQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1NWShmaXhfcGNyZWxfMjZfZG9uZSkgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogVGhpcyBpcyBkZWFkIHNpbXBsZSBhdCBwcmVzZW50LiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotTVkoZml4X3BjcmVsXzI2KSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB0YXJnZXQgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgCi0gIC8qIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgcmV0dXJuIGVycm9yICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbgotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKLSAgICByZXR1cm4gb3V0cHV0X2JmZCA/IGJmZF9yZWxvY19vayA6IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogSWYgdGhlIHNlY3Rpb25zIGFyZSBkaWZmZXJlbnQsIGFuZCB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24sCi0gICAgIGp1c3QgaWdub3JlIGl0IGZvciBub3cuICAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uLT5uYW1lICE9IGlucHV0X3NlY3Rpb24tPm5hbWUKLSAgICAgICYmIG91dHB1dF9iZmQgIT0gKGJmZCAqKU5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICByZWxvY2F0aW9uID0gKHRhcmdldCAmIDB4MDBmZmZmZmYpIDw8IDI7Ci0gIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiBeIDB4MDIwMDAwMDApIC0gMHgwMjAwMDAwMDsgLyogU2lnbiBleHRlbmQgKi8KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnZhbHVlOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gLT0gYWRkcjsKLSAgaWYgKHJlbG9jYXRpb24gJiAzKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gIGlmIChyZWxvY2F0aW9uICYgMHgwMjAwMDAwMCkKLSAgICB7Ci0gICAgICBpZiAoKHJlbG9jYXRpb24gJiB+IChiZmRfdm1hKSAweDAzZmZmZmZmKSAhPSB+IChiZmRfdm1hKSAweDAzZmZmZmZmKQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgfQotICBlbHNlIGlmIChyZWxvY2F0aW9uICYgfjB4MDNmZmZmZmYpCi0gICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICB0YXJnZXQgJj0gfjB4MDBmZmZmZmY7Ci0gIHRhcmdldCB8PSAocmVsb2NhdGlvbiA+PiAyKSAmIDB4MDBmZmZmZmY7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHRhcmdldCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQotICAvKiBOb3cgdGhlIEFSTSBtYWdpYy4uLiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgc28gdGhhdCBpdCBpcyBtYXJrZWQgYXMgZG9uZS4KLSAgICAgU3RyaWN0bHkgdGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24uICAqLwotICByZWxvY19lbnRyeS0+aG93dG8gPSAmTVkoaG93dG9fdGFibGUpWzddOwotICAKLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLXJlbG9jX2hvd3RvX3R5cGUgKgotTVkoYmZkX3JlbG9jX3R5cGVfbG9va3VwKShhYmZkLGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0jZGVmaW5lIEFTVEQoaSxqKSAgICAgICBjYXNlIGk6IHJldHVybiAmTVkoaG93dG9fdGFibGUpW2pdCi0gIGlmIChjb2RlID09IEJGRF9SRUxPQ19DVE9SKQotICAgIHN3aXRjaCAoYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5iaXRzX3Blcl9hZGRyZXNzKQotICAgICAgewotICAgICAgY2FzZSAzMjoKLSAgICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiByZXR1cm4gKENPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKikgMDsKLSAgICAgIH0KLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgICAgQVNURCAoQkZEX1JFTE9DXzE2LCAxKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18zMiwgMik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCwgMyk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfOF9QQ1JFTCwgNCk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMTZfUENSRUwsIDUpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzMyX1BDUkVMLCA2KTsKLSAgICBkZWZhdWx0OiByZXR1cm4gKENPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKikgMDsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2NfaW4gTVkoc3dhcF9zdGRfcmVsb2NfaW4pCi0jZGVmaW5lIE1ZX3N3YXBfc3RkX3JlbG9jX291dCBNWShzd2FwX3N0ZF9yZWxvY19vdXQpCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotLyogI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAqLwotLyogI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scyAqLwotLyogI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluayAqLwotCi0jaW5jbHVkZSAiYW91dHguaCIKLQotc3RhdGljIHZvaWQKLU1ZX3N3YXBfc3RkX3JlbG9jX2luIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpieXRlczsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybjsKLSAgaW50IHJfcGNyZWw7Ci0gIHN0cnVjdCBhb3V0ZGF0YSAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKTsKLQotICBjYWNoZV9wdHItPmhvd3RvID0gTVlfcmVsb2NfaG93dG8gKGFiZmQsIGJ5dGVzLCByX2luZGV4LCByX2V4dGVybiwgcl9wY3JlbCk7Ci0KLSAgTU9WRV9BRERSRVNTICgwKTsKLX0KLQotdm9pZAotTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgYXN5bWJvbCAqc3ltID0gKihnLT5zeW1fcHRyX3B0cik7Ci0gIGludCByX2V4dGVybjsKLSAgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfbmVnID0gMDsJLyogTmVnYXRpdmUgcmVsb2NzIHVzZSB0aGUgQkFTRVJFTCBiaXQuICAqLwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIFBVVF9XT1JEKGFiZmQsIGctPmFkZHJlc3MsIG5hdHB0ci0+cl9hZGRyZXNzKTsKLQotICByX2xlbmd0aCA9IGctPmhvd3RvLT5zaXplIDsgICAvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0gIGlmIChyX2xlbmd0aCA8IDApCi0gICAgewotICAgICAgcl9sZW5ndGggPSAtcl9sZW5ndGg7Ci0gICAgICByX25lZyA9IDE7Ci0gICAgfQotCi0gIHJfcGNyZWwgID0gKGludCkgZy0+aG93dG8tPnBjX3JlbGF0aXZlOyAvKiBSZWxhdGl2ZSB0byBQQz8gKi8KLQotICAvKiBGb3IgUklTQyBpWCwgaW4gcGMtcmVsYXRpdmUgcmVsb2NzIHRoZSByX3BjcmVsIGJpdCBtZWFucyB0aGF0IHRoZQotICAgICByZWxvY2F0aW9uIGhhcyBiZWVuIGRvbmUgYWxyZWFkeSAoT25seSBmb3IgdGhlIDI2LWJpdCBvbmUgSSB0aGluayk/Pz8hISEKLSAgICAgKi8KLQotICBpZiAoZy0+aG93dG8tPnR5cGUgPT0gMykKLSAgICB7Ci0gICAgICByX2xlbmd0aCA9IDM7Ci0gICAgICByX3BjcmVsID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGctPmhvd3RvLT50eXBlID09IDcpCi0gICAgeyAKLSAgICAgIHJfbGVuZ3RoID0gMzsKLSAgICAgIHJfcGNyZWwgPSAxOwotICAgIH0KLSAgCi0KLSNpZiAwCi0gIC8qIEZvciBhIHN0YW5kYXJkIHJlbG9jLCB0aGUgYWRkZW5kIGlzIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIHJfYWRkZW5kID0gZy0+YWRkZW5kICsgKCooZy0+c3ltX3B0cl9wdHIpKS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSNlbmRpZgotCi0gIC8qIG5hbWUgd2FzIGNsb2JiZXJlZCBieSBhb3V0X3dyaXRlX3N5bXMgdG8gYmUgc3ltYm9sIGluZGV4ICovCi0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBjaGVjayBmb3IgdGhhdCBoZXJlCi0gICAgICovCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBvdXRwdXRfc2VjdGlvbiA9PSAmYmZkX2Fic19zZWN0aW9uCi0gICAgICB8fCBvdXRwdXRfc2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGlmIChiZmRfYWJzX3NlY3Rpb24uc3ltYm9sID09IHN5bSkKLQl7Ci0JICAvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiAqLwotCSAgcl9pbmRleCA9IDA7Ci0JICByX2V4dGVybiA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEZpbGwgaW4gc3ltYm9sICovCi0JICByX2V4dGVybiA9IDE7Ci0JICByX2luZGV4ID0gKCooZy0+c3ltX3B0cl9wdHIpKS0+S0VFUElUOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKCAgKHJfZXh0ZXJuID8gICBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHOiAwKQotCSB8IChyX3BjcmVsICA/ICAgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHOiAwKQotCSB8IChyX25lZyAgICA/ICAgUkVMT0NfQVJNX0JJVFNfTkVHX0JJRzogMCkKLQkgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLSAgICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLQkoICAocl9leHRlcm4gPyAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEU6IDApCi0JIHwgKHJfcGNyZWwgID8gICBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEU6IDApCi0JIHwgKHJfbmVnICAgID8gICBSRUxPQ19BUk1fQklUU19ORUdfTElUVExFOiAwKQotCSB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSkpOwotICAgIH0KLX0KLQotI2RlZmluZSBNWV9CRkRfVEFSR0VUCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgotCi1jb25zdCBiZmRfdGFyZ2V0IGFvdXRfYXJtX2xpdHRsZV92ZWMgPQotewotICAiYS5vdXQtYXJtLWxpdHRsZSIsICAgICAgICAgICAvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwgICAgICAgICAgICAvKiB0YXJnZXQgYnl0ZSBvcmRlciAobGl0dGxlKSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwgICAgICAgICAgICAvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyIChsaXR0bGUpICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCAgICAgICAgIC8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBEWU5BTUlDIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIsCi0gIEFSX1BBRF9DSEFSLCAgICAgICAgICAgICAgICAgIC8qIGFyX3BhZF9jaGFyICovCi0gIDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgTVlfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV9ta29iamVjdCwgICAgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChNWSksCi0KLSAgKFBUUikgTVlfYmFja2VuZF9kYXRhLAotfTsKLQotY29uc3QgYmZkX3RhcmdldCBhb3V0X2FybV9iaWdfdmVjID0KLXsKLSAgImEub3V0LWFybS1iaWciLCAgICAgICAgICAgLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsICAgICAgICAgICAgICAgLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKGJpZykgKi8KLSAgQkZEX0VORElBTl9CSUcsICAgICAgICAgICAgICAgLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAoYmlnKSAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgICAgICAgICAvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgRFlOQU1JQyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICBNWV9zeW1ib2xfbGVhZGluZ19jaGFyLAotICBBUl9QQURfQ0hBUiwgICAgICAgICAgICAgICAgICAvKiBhcl9wYWRfY2hhciAqLwotICAxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBNWV9jb3JlX2ZpbGVfcH0sCi0gICAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsICAgIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoTVkpLAotCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YSwKLX07CmRpZmYgLS1naXQgYS9iZmQvYW91dC1lbmNhcC5jIGIvYmZkL2FvdXQtZW5jYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1ZjkwMzcuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQtZW5jYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGEub3V0IGZpbGVzIGVuY2Fwc3VsYXRlZCB3aXRoIENPRkYgaGVhZGVycy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUSElTIE1PRFVMRSBJUyBOT1QgRklOSVNIRUQuICBJVCBQUk9CQUJMWSBET0VTTidUIEVWRU4gQ09NUElMRS4gICovCi0KLSNpZiAwCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNlbmRpZgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSA8c3lzZGVwLmg+Ci0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSA8YW91dC9hb3V0NjQuaD4KLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqZW5jYXBfcmVhbF9jYWxsYmFjayAoKTsKLQotY29uc3QgYmZkX3RhcmdldCAqCi1lbmNhcF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBjaGFyIG1hZ2ljYnVmWzRdOyAvKiBSYXcgYnl0ZXMgb2YgbWFnaWMgbnVtYmVyIGZyb20gZmlsZSAqLwotICB1bnNpZ25lZCBsb25nIG1hZ2ljOwkJLyogU3dhcHBlZCBtYWdpYyBudW1iZXIgKi8KLSAgc2hvcnQgY29mZl9tYWdpYzsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgZXhlYzsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpbWFnaWNidWYsIDEsIHNpemVvZiAobWFnaWNidWYpLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChtYWdpY2J1ZikpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAKLSAgY29mZl9tYWdpYyA9IGJmZF9oX2dldF8xNiAoYWJmZCwgbWFnaWNidWYpOwotICBpZiAoY29mZl9tYWdpYyAhPSBDT0ZGX01BR0lDKQotICAgIHJldHVybiAwOwkJCS8qIE5vdCBhbiBlbmNhcCBjb2ZmIGZpbGUgKi8KLQotICBfX2hlYWRlcl9vZmZzZXRfdGVtcD09Q09GRl9NQUdJQyA/IHNpemVvZihzdHJ1Y3QgY29mZmhlYWRlcikgOiAwKQotICAoZnNlZWsgKChmKSwgSEVBREVSX09GRlNFVCgoZikpLCAxKSkKLQotICBtYWdpYyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgbWFnaWNidWYpOwotCi0gIGlmIChOX0JBRE1BRyAoKigoc3RydWN0IGludGVybmFsX2V4ZWMgKikgJm1hZ2ljKSkpIHJldHVybiAwOwotCi0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLSAgICAgICE9IEVYRUNfQllURVNfU0laRSkgewotICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgIHJldHVybiAwOwotICB9Ci0gIE5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKShhYmZkLCAmZXhlY19ieXRlcywgJmV4ZWMpOwotCi0gIHJldHVybiBhb3V0XzMyX3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgJmV4ZWMsIGVuY2FwX3JlYWxjYWxsYmFjayk7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgcmVhZGluZyBvZiBhIGVuY2Fwc3VsYXRlZC1jb2ZmIGEub3V0IGZpbGUgaGVhZGVyICovCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWVuY2FwX3JlYWxfY2FsbGJhY2sgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICAKLSAgTVkoY2FsbGJhY2spKGFiZmQsIGV4ZWNwKTsKLSAgCi0gIC8qIElmIHdlIGhhdmUgYSBjb2ZmIGhlYWRlciwgaXQgY2FuIGdpdmUgdXMgYmV0dGVyIHZhbHVlcyBmb3IKLSAgICAgdGV4dF9zdGFydCBhbmQgZXhlY19kYXRhX3N0YXJ0LiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsCi0gICAgIGZvciByZW1vdGUgZGVidWdnaW5nIG9mIGVtYmVkZGVkIHN5c3RlbXMuICAqLwotICBpZiAoTl9GTEFHUyhleGVjX2FvdXRoZHIpICYgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFKQotICB7Ci0JICBzdHJ1Y3QgY29mZmhlYWRlciBjaDsKLQkgIGludCB2YWw7Ci0JICB2YWwgPSBsc2VlayAoZXhlY2NoYW4sIC0oc2l6ZW9mIChBT1VUSERSKSArIHNpemVvZiAoY2gpKSwgMSk7Ci0JICBpZiAodmFsID09IC0xKQotCQkgIHBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKLQkgIHZhbCA9IG15cmVhZCAoZXhlY2NoYW4sICZjaCwgc2l6ZW9mIChjaCkpOwotCSAgaWYgKHZhbCA8IDApCi0JCSAgcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOwotCSAgdGV4dF9zdGFydCA9IGNoLnRleHRfc3RhcnQ7Ci0JICBleGVjX2RhdGFfc3RhcnQgPSBjaC5kYXRhX3N0YXJ0OwotICB9IGVsc2UKLQkgewotCSAgdGV4dF9zdGFydCA9Ci0JICAgIElTX09CSkVDVF9GSUxFIChleGVjX2FvdXRoZHIpID8gMCA6IE5fVFhUQUREUiAoZXhlY19hb3V0aGRyKTsKLQkgIGV4ZWNfZGF0YV9zdGFydCA9IElTX09CSkVDVF9GSUxFIChleGVjX2FvdXRoZHIpCi0JICAgID8gZXhlY19hb3V0aGRyLmFfdGV4dCA6IE5fREFUQUREUiAoZXhlY19hb3V0aGRyKTsKLSAgfQotCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChhYmZkLCBiZmRfYXJjaF9tNjhrLCAwKTsgLyogRklYTUUgKi8KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUgaW4gRW5jYXBzdWxhdGVkIENPRkYgZm9ybWF0LgotICAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCi0gICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLwotCi1ib29sZWFuCi1lbmNhcF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX3NpemVfdHlwZSBkYXRhX3BhZCA9IDA7Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotLyoqKioqKiBGSVhNRTogIEZyYWdtZW50cyBmcm9tIHRoZSBvbGQgR05VIExEIHByb2dyYW0gZm9yIGRlYWxpbmcgd2l0aAotICAgICAgICBlbmNhcCBjb2ZmLiAgKi8KLXN0cnVjdCBjb2ZmaGVhZGVyIGNvZmZoZWFkZXI7Ci1pbnQgbmVlZF9jb2ZmX2hlYWRlcjsKLQotICAvKiBEZXRlcm1pbmUgd2hldGhlciB0byBjb3VudCB0aGUgaGVhZGVyIGFzIHBhcnQgb2YKLSAgICAgdGhlIHRleHQgc2l6ZSwgYW5kIGluaXRpYWxpemUgdGhlIHRleHQgc2l6ZSBhY2NvcmRpbmdseS4KLSAgICAgVGhpcyBkZXBlbmRzIG9uIHRoZSBraW5kIG9mIHN5c3RlbSBhbmQgb24gdGhlIG91dHB1dCBmb3JtYXQgc2VsZWN0ZWQuICAqLwotCi0gIE5fU0VUX01BR0lDIChvdXRoZWFkZXIsIG1hZ2ljKTsKLSNpZmRlZiBJTklUSUFMSVpFX0hFQURFUgotICBJTklUSUFMSVpFX0hFQURFUjsKLSNlbmRpZgotCi0gIHRleHRfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGV4ZWMpOwotI2lmZGVmIENPRkZfRU5DQVBTVUxBVEUKLSAgaWYgKHJlbG9jYXRhYmxlX291dHB1dCA9PSAwICYmIGZpbGVfdGFibGVbMF0uanVzdF9zeW1zX2ZsYWcgPT0gMCkKLSAgICB7Ci0gICAgICBuZWVkX2NvZmZfaGVhZGVyID0gMTsKLSAgICAgIC8qIHNldCB0aGlzIGZsYWcgbm93LCBzaW5jZSBpdCB3aWxsIGNoYW5nZSB0aGUgdmFsdWVzIG9mIE5fVFhUT0ZGLCBldGMgKi8KLSAgICAgIE5fU0VUX0ZMQUdTIChvdXRoZWFkZXIsIGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZXhlY19oZHJfZmxhZ3MpOwotICAgICAgdGV4dF9zaXplICs9IHNpemVvZiAoc3RydWN0IGNvZmZoZWFkZXIpOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9FTkNBUFNVTEFURQotICBpZiAobmVlZF9jb2ZmX2hlYWRlcikKLSAgICB7Ci0gICAgICAvKiBXZSBhcmUgZW5jYXBzdWxhdGluZyBCU0QgZm9ybWF0IHdpdGhpbiBDT0ZGIGZvcm1hdC4gICovCi0gICAgICBzdHJ1Y3QgY29mZnNjbiAqdHAsICpkcCwgKmJwOwotCi0gICAgICB0cCA9ICZjb2ZmaGVhZGVyLnNjbnNbMF07Ci0gICAgICBkcCA9ICZjb2ZmaGVhZGVyLnNjbnNbMV07Ci0gICAgICBicCA9ICZjb2ZmaGVhZGVyLnNjbnNbMl07Ci0KLSAgICAgIHN0cmNweSAodHAtPnNfbmFtZSwgIi50ZXh0Iik7Ci0gICAgICB0cC0+c19wYWRkciA9IHRleHRfc3RhcnQ7Ci0gICAgICB0cC0+c192YWRkciA9IHRleHRfc3RhcnQ7Ci0gICAgICB0cC0+c19zaXplID0gdGV4dF9zaXplOwotICAgICAgdHAtPnNfc2NucHRyID0gc2l6ZW9mIChzdHJ1Y3QgY29mZmhlYWRlcikgKyBzaXplb2YgKHN0cnVjdCBleGVjKTsKLSAgICAgIHRwLT5zX3JlbHB0ciA9IDA7Ci0gICAgICB0cC0+c19sbm5vcHRyID0gMDsKLSAgICAgIHRwLT5zX25yZWxvYyA9IDA7Ci0gICAgICB0cC0+c19ubG5ubyA9IDA7Ci0gICAgICB0cC0+c19mbGFncyA9IDB4MjA7Ci0gICAgICBzdHJjcHkgKGRwLT5zX25hbWUsICIuZGF0YSIpOwotICAgICAgZHAtPnNfcGFkZHIgPSBkYXRhX3N0YXJ0OwotICAgICAgZHAtPnNfdmFkZHIgPSBkYXRhX3N0YXJ0OwotICAgICAgZHAtPnNfc2l6ZSA9IGRhdGFfc2l6ZTsKLSAgICAgIGRwLT5zX3NjbnB0ciA9IHRwLT5zX3NjbnB0ciArIHRwLT5zX3NpemU7Ci0gICAgICBkcC0+c19yZWxwdHIgPSAwOwotICAgICAgZHAtPnNfbG5ub3B0ciA9IDA7Ci0gICAgICBkcC0+c19ucmVsb2MgPSAwOwotICAgICAgZHAtPnNfbmxubm8gPSAwOwotICAgICAgZHAtPnNfZmxhZ3MgPSAweDQwOwotICAgICAgc3RyY3B5IChicC0+c19uYW1lLCAiLmJzcyIpOwotICAgICAgYnAtPnNfcGFkZHIgPSBkcC0+c192YWRkciArIGRwLT5zX3NpemU7Ci0gICAgICBicC0+c192YWRkciA9IGJwLT5zX3BhZGRyOwotICAgICAgYnAtPnNfc2l6ZSA9IGJzc19zaXplOwotICAgICAgYnAtPnNfc2NucHRyID0gMDsKLSAgICAgIGJwLT5zX3JlbHB0ciA9IDA7Ci0gICAgICBicC0+c19sbm5vcHRyID0gMDsKLSAgICAgIGJwLT5zX25yZWxvYyA9IDA7Ci0gICAgICBicC0+c19ubG5ubyA9IDA7Ci0gICAgICBicC0+c19mbGFncyA9IDB4ODA7Ci0KLSAgICAgIGNvZmZoZWFkZXIuZl9tYWdpYyA9IENPRkZfTUFHSUM7Ci0gICAgICBjb2ZmaGVhZGVyLmZfbnNjbnMgPSAzOwotICAgICAgLyogc3RvcmUgYW4gdW5saWtlbHkgdGltZSBzbyBwcm9ncmFtcyBjYW4KLSAgICAgICAqIHRlbGwgdGhhdCB0aGVyZSBpcyBhIGJzZCBoZWFkZXIKLSAgICAgICAqLwotICAgICAgY29mZmhlYWRlci5mX3RpbWRhdCA9IDE7Ci0gICAgICBjb2ZmaGVhZGVyLmZfc3ltcHRyID0gMDsKLSAgICAgIGNvZmZoZWFkZXIuZl9uc3ltcyA9IDA7Ci0gICAgICBjb2ZmaGVhZGVyLmZfb3B0aGRyID0gMjg7Ci0gICAgICBjb2ZmaGVhZGVyLmZfZmxhZ3MgPSAweDEwMzsKLSAgICAgIC8qIGFvdXRoZHIgKi8KLSAgICAgIGNvZmZoZWFkZXIubWFnaWMgPSBaTUFHSUM7Ci0gICAgICBjb2ZmaGVhZGVyLnZzdGFtcCA9IDA7Ci0gICAgICBjb2ZmaGVhZGVyLnRzaXplID0gdHAtPnNfc2l6ZTsKLSAgICAgIGNvZmZoZWFkZXIuZHNpemUgPSBkcC0+c19zaXplOwotICAgICAgY29mZmhlYWRlci5ic2l6ZSA9IGJwLT5zX3NpemU7Ci0gICAgICBjb2ZmaGVhZGVyLmVudHJ5ID0gb3V0aGVhZGVyLmFfZW50cnk7Ci0gICAgICBjb2ZmaGVhZGVyLnRleHRfc3RhcnQgPSB0cC0+c192YWRkcjsKLSAgICAgIGNvZmZoZWFkZXIuZGF0YV9zdGFydCA9IGRwLT5zX3ZhZGRyOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9FTkNBUFNVTEFURQotICBpZiAobmVlZF9jb2ZmX2hlYWRlcikKLSAgICBteXdyaXRlICgmY29mZmhlYWRlciwgc2l6ZW9mIGNvZmZoZWFkZXIsIDEsIG91dGRlc2MpOwotI2VuZGlmCi0KLSNpZm5kZWYgQ09GRl9FTkNBUFNVTEFURQotICBwYWRmaWxlIChOX1RYVE9GRiAob3V0aGVhZGVyKSAtIHNpemVvZiBvdXRoZWFkZXIsIG91dGRlc2MpOwotI2VuZGlmCi0KLSAgdGV4dF9zaXplIC09IE5fVFhUT0ZGIChvdXRoZWFkZXIpOwotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnQgZW5jYXBfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0jZGVmaW5lIE1ZX29iamVjdF9wIGVuY2FwX29iamVjdF9wCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0LW5zMzJrLmMgYi9iZmQvYW91dC1uczMyay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTMzNWFhLi4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LW5zMzJrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBuczMyayBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IElhbiBEYWxsIChpZGFsbEBlbGVjZW5nLmFkZWxhaWRlLmVkdS5hdSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAibnMzMmsuaCIKLQotI2RlZmluZSBNWU5TKE9QKSBDQVQobnMzMmthb3V0XyxPUCkKLXJlbG9jX2hvd3RvX3R5cGUgKgotTVlOUyhiZmRfcmVsb2NfdHlwZV9sb29rdXApCi0gIFBBUkFNUygoYmZkICphYmZkIEFORAotCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotYm9vbGVhbgotTVlOUyh3cml0ZV9vYmplY3RfY29udGVudHMpCi0gIFBBUkFNUygoYmZkICphYmZkKSk7Ci0KLS8qIEF2b2lkIG11bHRpcGxlIGRlZmluaXRpb25zIGZyb20gYW91dHggaWYgc3VwcG9ydGluZyBzdGFuZGFyZCBhLm91dCBmb3JtYXQocykKLSAqIGFzIHdlbGwgYXMgdGhpcyBvbmUKLSAqLwotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhuczMya2FvdXQsXzMyXyx5KQotCi12b2lkIGJmZF9uczMya19hcmNoIFBBUkFNUyAoKHZvaWQpKTsKLQotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2RlZmluZSBNWShPUCkgTVlOUyhPUCkKLQotI2RlZmluZSBNWV9zd2FwX3N0ZF9yZWxvY19pbiBNWShzd2FwX3N0ZF9yZWxvY19pbikKLSNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IE1ZKHN3YXBfc3RkX3JlbG9jX291dCkKLQotc3RhdGljIHZvaWQKLU1ZX3N3YXBfc3RkX3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqYnl0ZXMsCi0JCQkgICAgICBhcmVsZW50ICpjYWNoZV9wdHIsIGFzeW1ib2wgKipzeW1ib2xzLAotCQkJICAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudCkpOwotCi1zdGF0aWMgdm9pZAotTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqYWJmZCwgYXJlbGVudCAqZywKLQkJCSAgICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpuYXRwdHIpKTsKLQotLyogVGhlIG5zMzJrIHNlcmllcyBpcyBhaCwgdW51c3VhbCwgd2hlbiBpdCBjb21lcyB0byByZWxvY2F0aW9uLgotICogVGhlcmUgYXJlIHRocmVlIHN0b3JhZ2UgbWV0aG9kcyBmb3IgcmVsb2NhdGVhYmxlIG9iamVjdHMuICBUaGVyZQotICogYXJlIGRpc3BsYWNlbWVudHMsIGltbWVkaWF0ZSBvcGVyYW5kcyBhbmQgb3JkaW5hcnkgdHdvcyBjb21wbGVtZW50Ci0gKiBkYXRhLiBPZiB0aGVzZSwgb25seSB0aGUgbGFzdCBmaXRzIGludG8gdGhlIHN0YW5kYXJkIHJlbG9jYXRpb24KLSAqIHNjaGVtZS4gIEltbWVkaWF0ZSBvcGVyYW5kcyBhcmUgc3RvcmVkIGh1ZmZtYW4gZW5jb2RlZCBhbmQKLSAqIGltbWVkaWF0ZSBvcGVyYW5kcyBhcmUgc3RvcmVkIGJpZyBlbmRpYW4gKHdoZXJlIGFzIHRoZSBuYXR1cmFsIGJ5dGUKLSAqIG9yZGVyIGlzIGxpdHRsZSBlbmRpYW4gZm9yIHRoaXMgYWNoaXRlY3R1cmUpLgotCi0gKiBOb3RlIHRoYXQgdGhlIG5zMzJrIGRpc3BsYWNlbWVudCBzdG9yYWdlIG1ldGhvZCBpcyBvcnRob2dvbmFsIHRvCi0gKiB3aGV0aGVyIHRoZSByZWxvY2F0aW9uIGlzIHBjIHJlbGF0aXZlIG9yIG5vdC4gVGhlICJkaXNwbGFjZW1lbnQiCi0gKiBzdG9yYWdlIHNjaGVtZSBpcyB1c2VkIGZvciBlc3NlbnRpYWxseSBhbGwgYWRkcmVzcyBjb25zdGFudHMuIFRoZQotICogZGlzcGxhY2VtZW50IGNhbiBiZSByZWxhdGl2ZSB0byB6ZXJvIChhYnNvbHV0ZSBkaXNwbGFjZW1lbnQpLAotICogcmVsYXRpdmUgdG8gdGhlIHBjIChwYyByZWxhdGl2ZSksIHRoZSBzdGFjayBwb2ludGVyLCB0aGUgZnJhbWUKLSAqIHBvaW50ZXIsIHRoZSBzdGF0aWMgYmFzZSByZWdpc3RlciBhbmQgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGV0Yy4KLQotICogRm9yIGV4YW1wbGU6Ci0gKgotICogIHN5bTE6IC5sb25nIC4JIyBwYyByZWxhdGl2ZSAyJ3MgY29tcGxlbWVudAotICogIHN5bTE6IC5sb25nIGZvbwkjIDIncyBjb21wbGVtZW50IG5vdCBwYyByZWxhdGl2ZQotICoKLSAqICBzZWxmOiAgbW92ZCBAc2VsZiwgcjAgIyBwYyByZWxhdGl2ZSBkaXNwbGFjZW1lbnQKLSAqCSAgIG1vdmQgZm9vLCByMCAjIG5vbiBwYyByZWxhdGl2ZSBkaXNwbGFjZW1lbnQKLSAqCi0gKiAgc2VsZjogIG1vdmQgc2VsZiwgcjAgIyBwYyByZWxhdGl2ZSBpbW1lZGlhdGUKLSAqICAgICAgICAgbW92ZCBmb28sIHIwICMgbm9uIHBjIHJlbGF0aXZlIGltbWVkaWF0ZQotICoKLSAqIEluIGFkZGl0aW9uLCBmb3IgaGlzdG9yaWNhbCByZWFzb25zIHRoZSBlbmNvZGluZyBvZiB0aGUgcmVsb2NhdGlvbiB0eXBlcwotICogaW4gdGhlIGEub3V0IGZvcm1hdCByZWxvY2F0aW9uIGVudHJpZXMgaXMgc3VjaCB0aGF0IGV2ZW4gdGhlIHJlbG9jYXRpb24KLSAqIG1ldGhvZHMgd2hpY2ggYXJlIHN0YW5kYXJkIGFyZSBub3QgZW5jb2RlZCB0aGUgc3RhbmRhcmQgd2F5LgotICoKLSAqLwotCi1yZWxvY19ob3d0b190eXBlIE1ZKGhvd3RvX3RhYmxlKVtdID0gCi17Ci0gIC8qIG5zMzJrIGltbWVkaWF0ZSBvcGVyYW5kcyAqLwotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0lNTV84LCAwLCAwLCA4LCBmYWxzZSwgMCwgdHJ1ZSwKLQkgX2JmZF9uczMya19yZWxvY19pbW0sICJOUzMyS19JTU1fOCIsCi0JIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0lNTV8xNiwgMCwgMSwgMTYsIGZhbHNlLCAwLCB0cnVlLAotCSBfYmZkX25zMzJrX3JlbG9jX2ltbSwgICJOUzMyS19JTU1fMTYiLAotCSB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19JTU1fMzIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgdHJ1ZSwKLQkgX2JmZF9uczMya19yZWxvY19pbW0sICJOUzMyS19JTU1fMzIiLAotCSB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTCwgMCwgMCwgOCwgdHJ1ZSwgMCwgZmFsc2UsCi0JIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiUENSRUxfTlMzMktfSU1NXzgiLAotCSB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfSU1NXzE2X1BDUkVMLCAwLCAxLCAxNiwgdHJ1ZSwgMCwgZmFsc2UsCi0JIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiUENSRUxfTlMzMktfSU1NXzE2IiwKLQkgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfSU1NXzMyX1BDUkVMLCAwLCAyLCAzMiwgdHJ1ZSwgMCwgZmFsc2UsCi0JIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiUENSRUxfTlMzMktfSU1NXzMyIiwKLQkgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0KLSAgLyogbnMzMmsgZGlzcGxhY2VtZW50cyAqLwotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfOCwgMCwgMCwgOCwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfZGlzcCwgIk5TMzJLX0RJU1BfOCIsCi0JIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwgdHJ1ZSwKLQkgX2JmZF9uczMya19yZWxvY19kaXNwLCAiTlMzMktfRElTUF8xNiIsCi0JIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfZGlzcCwgIk5TMzJLX0RJU1BfMzIiLAotCSB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMLCAwLCAwLCA4LCB0cnVlLCAwLCBmYWxzZSwKLQkgX2JmZF9uczMya19yZWxvY19kaXNwLCAiUENSRUxfTlMzMktfRElTUF84IiwKLQkgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfRElTUF8xNl9QQ1JFTCwgMCwgMSwgMTYsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AsICJQQ1JFTF9OUzMyS19ESVNQXzE2IiwKLQkgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfRElTUF8zMl9QQ1JFTCwgMCwgMiwgMzIsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AsICJQQ1JFTF9OUzMyS19ESVNQXzMyIiwKLQkgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0KLSAgLyogTm9ybWFsIDIncyBjb21wbGVtZW50ICovCi0gIEhPV1RPIChCRkRfUkVMT0NfOCwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsCi0JICI4IiwgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwKLQkgIjE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfMzIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwKLQkgIjMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfOF9QQ1JFTCwgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLAotCSAiUENSRUxfOCIsIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DXzE2X1BDUkVMLCAwLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLAotCSAiUENSRUxfMTYiLCB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ18zMl9QQ1JFTCwgMCwgMiwgMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKLQkgIlBDUkVMXzMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi19OwotCi0KLSNkZWZpbmUgQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTyhCRkQpIChNWShob3d0b190YWJsZSkgKyAxNCkKLQotI2RlZmluZSBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX0JJRyAweDA2Ci0jZGVmaW5lIFJFTE9DX1NURF9CSVRTX05TMzJLX1RZUEVfTElUVExFIDB4NjAKLSNkZWZpbmUgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9TSF9CSUcgMQotI2RlZmluZSBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX1NIX0xJVFRMRSA1Ci0KLXJlbG9jX2hvd3RvX3R5cGUgKgotTVkocmVsb2NfaG93dG8pKGFiZmQsIHJlbCwgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsOwotICAgICBpbnQgKnJfaW5kZXg7Ci0gICAgIGludCAqcl9leHRlcm47Ci0gICAgIGludCAqcl9wY3JlbDsKLXsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9uczMya190eXBlOwotLyogIEJGRF9BU1NFUlQoYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChhYmZkKSk7ICovCi0gICpyX2luZGV4ID0gICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCSAgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkgICAgICAgfCAgcmVsLT5yX2luZGV4WzBdICk7Ci0gICpyX2V4dGVybiAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7Ci0gICpyX3BjcmVsICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLSAgcl9sZW5ndGggID0gICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFKQotCQk+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKTsKLSAgcl9uczMya190eXBlICA9ICAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9MSVRUTEUpCi0JCSAgICA+PiBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX1NIX0xJVFRMRSk7Ci0gIHJldHVybiAoTVkoaG93dG9fdGFibGUpICsgcl9sZW5ndGggKyAzICogKCpyX3BjcmVsKSArIDYgKiByX25zMzJrX3R5cGUpOwotfQotCi0jZGVmaW5lIE1ZX3JlbG9jX2hvd3RvKEJGRCxSRUwsSU4sRVgsUEMpIE1ZKHJlbG9jX2hvd3RvKShCRkQsIFJFTCwgJklOLCAmRVgsICZQQykKLQotdm9pZAotTVkocHV0X3JlbG9jKShhYmZkLCByX2V4dGVybiwgcl9pbmRleCwgdmFsdWUsIGhvd3RvLCByZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgcl9leHRlcm47Ci0gICAgIGludCByX2luZGV4OwotICAgICBsb25nIHZhbHVlOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsb2M7Ci17Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX25zMzJrX3R5cGU7Ci0gIFBVVF9XT1JEIChhYmZkLCB2YWx1ZSwgcmVsb2MtPnJfYWRkcmVzcyk7Ci0gIHJfbGVuZ3RoID0gaG93dG8tPnNpemUgOwkvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0gIHJfcGNyZWwgID0gKGludCkgaG93dG8tPnBjX3JlbGF0aXZlOyAvKiBSZWxhdGl2ZSB0byBQQz8gKi8KLSAgcl9uczMya190eXBlID0gKGhvd3RvIC0gTVkoaG93dG9fdGFibGUpICkvNjsKLS8qICBCRkRfQVNTRVJUIChiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4gKGFiZmQpKTsgKi8KLSAgcmVsb2MtPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICByZWxvYy0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgcmVsb2MtPnJfaW5kZXhbMF0gPSByX2luZGV4OwotICByZWxvYy0+cl90eXBlWzBdID0KLSAgICAocl9leHRlcm4/ICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEU6IDApCi0gICAgICB8IChyX3BjcmVsPyAgICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFOiAwKQotCXwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKQotCSAgfCAocl9uczMya190eXBlIDw8ICBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX1NIX0xJVFRMRSk7Ci19Ci0KLSNkZWZpbmUgTVlfcHV0X3JlbG9jKEJGRCwgRVhULCBJRFgsIFZBTCwgSE9XVE8sIFJFTE9DKSBcCi0gIE1ZKHB1dF9yZWxvYykoQkZELCBFWFQsIElEWCwgVkFMLCBIT1dUTywgUkVMT0MpCi0KLSNkZWZpbmUgU1RBVF9GT1JfRVhFQwotCi0jZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgX2JmZF9uczMya19maW5hbF9saW5rX3JlbG9jYXRlCi0jZGVmaW5lIE1ZX3JlbG9jYXRlX2NvbnRlbnRzIF9iZmRfbnMzMmtfcmVsb2NhdGVfY29udGVudHMKLQotI2luY2x1ZGUgPGFvdXR4Lmg+Ci0KLXJlbG9jX2hvd3RvX3R5cGUgKgotTVkoYmZkX3JlbG9jX3R5cGVfbG9va3VwKShhYmZkLGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0KLSNkZWZpbmUgRU5UUlkoaSxqKQljYXNlIGk6IHJldHVybiAmTVkoaG93dG9fdGFibGUpW2pdCi0KLSAgaW50IGV4dCA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9PSBSRUxPQ19FWFRfU0laRTsKLQotICBCRkRfQVNTRVJUKGV4dCA9PSAwKTsKLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0NUT1IpCi0gICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCi0gICAgICB7Ci0gICAgICBjYXNlIDMyOgotCWNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzgsIDApOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0lNTV8xNiwgMSk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzMyLCAyKTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTCwgMyk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzE2X1BDUkVMLCA0KTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19JTU1fMzJfUENSRUwsIDUpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0RJU1BfOCwgNik7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8xNiwgNyk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8zMiwgOCk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMLCA5KTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2X1BDUkVMLCAxMCk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8zMl9QQ1JFTCwgMTEpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzgsIDEyKTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ18xNiwgMTMpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzMyLCAxNCk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfOF9QQ1JFTCwgMTUpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzE2X1BDUkVMLCAxNik7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfMzJfUENSRUwsIDE3KTsKLSAgICBkZWZhdWx0OiByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICB9Ci0jdW5kZWYgRU5UUlkKLX0KLQotCi1zdGF0aWMgdm9pZAotTVlfc3dhcF9zdGRfcmVsb2NfaW4gKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OwotewotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICBpbnQgcl9wY3JlbDsKLSAgc3RydWN0IGFvdXRkYXRhICAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKTsKLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotCi0gIGNhY2hlX3B0ci0+aG93dG8gPSBNWV9yZWxvY19ob3d0byhhYmZkLCBieXRlcywgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpOwotCi0gIE1PVkVfQUREUkVTUygwKTsKLX0KLQotc3RhdGljIHZvaWQKLU1ZX3N3YXBfc3RkX3JlbG9jX291dCAoYWJmZCwgZywgbmF0cHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmc7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX2FkZGVuZDsKLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICByX2FkZGVuZCA9IGctPmFkZGVuZCArICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgCi0gIC8qIG5hbWUgd2FzIGNsb2JiZXJlZCBieSBhb3V0X3dyaXRlX3N5bXMgdG8gYmUgc3ltYm9sIGluZGV4ICovCi0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZSAKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgQ2hlY2sgZm9yIHRoYXQgaGVyZS4gICovCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBvdXRwdXRfc2VjdGlvbiA9PSAmYmZkX2Fic19zZWN0aW9uCi0gICAgICB8fCBvdXRwdXRfc2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uKSAKLSAgICB7Ci0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uLnN5bWJvbCA9PSBzeW0pCi0JewotCSAgLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSAgICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQkgIHJfaW5kZXggPSAwOwotCSAgcl9leHRlcm4gPSAwOwotCX0KLSAgICAgIGVsc2UgCi0JewotCSAgLyogRmlsbCBpbiBzeW1ib2wgKi8KLQkgIHJfZXh0ZXJuID0gMTsKLSN1bmRlZiBLRUVQSVQKLSNkZWZpbmUgS0VFUElUIHVkYXRhLmkKLQkgIHJfaW5kZXggPSAgKCooZy0+c3ltX3B0cl9wdHIpKS0+S0VFUElUOwotI3VuZGVmIEtFRVBJVCAgICAgCi0JfQotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsgICAgICAKLSAgICB9Ci0KLSAgTVlfcHV0X3JlbG9jIChhYmZkLCByX2V4dGVybiwgcl9pbmRleCwgZy0+YWRkcmVzcywgZy0+aG93dG8sIG5hdHB0cik7Ci19Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9uczMya19yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgbG9jYXRpb24pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICBiZmRfYnl0ZSAqbG9jYXRpb247Ci17Ci0gIGludCByX25zMzJrX3R5cGUgPSAoaG93dG8gLSBNWShob3d0b190YWJsZSkpIC8gNjsKLSAgbG9uZyAoKmdldF9kYXRhKSBQQVJBTVMgKChiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSk7Ci0gIGludCAoKnB1dF9kYXRhKSBQQVJBTVMgKChsb25nLCBiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSk7Ci0KLSAgc3dpdGNoIChyX25zMzJrX3R5cGUpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIGdldF9kYXRhID0gX2JmZF9uczMya19nZXRfaW1tZWRpYXRlOwotICAgICAgcHV0X2RhdGEgPSBfYmZkX25zMzJrX3B1dF9pbW1lZGlhdGU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBnZXRfZGF0YSA9IF9iZmRfbnMzMmtfZ2V0X2Rpc3BsYWNlbWVudDsKLSAgICAgIHB1dF9kYXRhID0gX2JmZF9uczMya19wdXRfZGlzcGxhY2VtZW50OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgcmV0dXJuIF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICAgIGxvY2F0aW9uKTsKLSAgICAgIC8qIE5PVCBSRUFDSEVEICovCi0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotICByZXR1cm4gX2JmZF9kb19uczMya19yZWxvY19jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgICAgICAgbG9jYXRpb24sIGdldF9kYXRhLCBwdXRfZGF0YSk7Ci19CmRpZmYgLS1naXQgYS9iZmQvYW91dC1zcGFyY2xlLmMgYi9iZmQvYW91dC1zcGFyY2xlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwM2IxMzYuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQtc3BhcmNsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIHNwYXJjIGxpdHRsZS1lbmRpYW4gYW91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zcGFyYy1saXR0bGUiCi0jZGVmaW5lIE1ZKE9QKSBDQVQoc3BhcmNsZV9hb3V0XyxPUCkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fU1BBUkMgfHwgKG10eXBlKSA9PSBNX1NQQVJDTEVUKQotCi0vKiBJbmNsdWRlIHRoZSB1c3VhbCBhLm91dCBzdXBwb3J0LiAgKi8KLSNkZWZpbmUgVEFSR0VUX0lTX0xJVFRMRV9FTkRJQU5fUAotI2luY2x1ZGUgImFvdXRmMS5oIgpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQtdGFyZ2V0LmggYi9iZmQvYW91dC10YXJnZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFlZTA3YS4uMDAwMDAwMAotLS0gYS9iZmQvYW91dC10YXJnZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1MCArMCwwIEBACi0vKiBEZWZpbmUgYSB0YXJnZXQgdmVjdG9yIGFuZCBzb21lIHNtYWxsIHJvdXRpbmVzIGZvciBhIHZhcmlhbnQgb2YgYS5vdXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0vKiNpbmNsdWRlICJsaWJhb3V0LmgiKi8KLQotI2lmbmRlZiBTRUdNRU5UX1NJWkUKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNlbmRpZgotCi1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSAqIE5BTUUoYW91dCxyZWxvY190eXBlX2xvb2t1cCkKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotCi0vKiBTZXQgcGFyYW1ldGVycyBhYm91dCB0aGlzIGEub3V0IGZpbGUgdGhhdCBhcmUgbWFjaGluZS1kZXBlbmRlbnQuCi0gICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gc29tZV9hb3V0X29iamVjdF9wIGp1c3QgYmVmb3JlIGl0IHJldHVybnMuICAqLwotI2lmbmRlZiBNWV9jYWxsYmFjawotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqTVkoY2FsbGJhY2spIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLU1ZKGNhbGxiYWNrKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBhcmNoX2FsaWduX3Bvd2VyOwotICB1bnNpZ25lZCBsb25nIGFyY2hfYWxpZ247Ci0KLSAgLyogQ2FsY3VsYXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgcGFydHMgb2YgYSBuZXdseSByZWFkIGFvdXQgaGVhZGVyICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplID0gTl9UWFRTSVpFKCpleGVjcCk7Ci0KLSAgLyogVGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBOX1RYVEFERFIoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBOX0RBVEFERFIoKmV4ZWNwKTsKLSAgb2JqX2Jzc3NlYyAgKGFiZmQpLT52bWEgPSBOX0JTU0FERFIoKmV4ZWNwKTsKLQotICAvKiBGb3Igc29tZSB0YXJnZXRzLCBpZiB0aGUgZW50cnkgcG9pbnQgaXMgbm90IGluIHRoZSBzYW1lIHBhZ2UKLSAgICAgYXMgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0LCB0aGVuIGFkanVzdCB0aGUgVk1BIHNvIHRoYXQgaXQgaXMuCi0gICAgIEZJWE1FOiBEbyB0aGlzIHdpdGggYSBtYWNybyBsaWtlIFNFVF9BUkNIX01BQ0ggaW5zdGVhZD8gICovCi0gIGlmIChhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmVudHJ5X2lzX3RleHRfYWRkcmVzcwotICAgICAgJiYgZXhlY3AtPmFfZW50cnkgPiBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFkanVzdDsKLQotICAgICAgYWRqdXN0ID0gZXhlY3AtPmFfZW50cnkgLSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYTsKLSAgICAgIC8qIEFkanVzdCBvbmx5IGJ5IHdob2xlIHBhZ2VzLiAqLwotICAgICAgYWRqdXN0ICY9IH4oVEFSR0VUX1BBR0VfU0laRSAtIDEpOwotICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgKz0gYWRqdXN0OwotICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgKz0gYWRqdXN0OwotICAgICAgb2JqX2Jzc3NlYyAoYWJmZCktPnZtYSArPSBhZGp1c3Q7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgbG9hZCBhZGRyZXNzZXMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHZpcnR1YWwgYWRkcmVzc2VzLiAgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5sbWEgPSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5sbWEgPSBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYTsKLSAgb2JqX2Jzc3NlYyAoYWJmZCktPmxtYSA9IG9ial9ic3NzZWMgKGFiZmQpLT52bWE7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9UWFRPRkYgKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fREFUT0ZGICgqZXhlY3ApOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHJlbG9jYXRpb24gaW5mbyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9UUkVMT0ZGKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX0RSRUxPRkYoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOwotICAKLSAgLyogRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotI2lmZGVmIFNFVF9BUkNIX01BQ0gKLSAgU0VUX0FSQ0hfTUFDSChhYmZkLCAqZXhlY3ApOwotI2Vsc2UKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChhYmZkLCBERUZBVUxUX0FSQ0gsIDApOwotI2VuZGlmCi0KLSAgLyogVGhlIG51bWJlciBvZiByZWxvY2F0aW9uIHJlY29yZHMuICBUaGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyCi0gICAgIFNFVF9BUkNIX01BQ0guICBJdCBhc3N1bWVzIHRoYXQgU0VUX0FSQ0hfTUFDSCB3aWxsIHNldAotICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSBjb3JyZWN0bHksIGlmIHRoZSByZWxvYyBzaXplIGlzIG5vdAotICAgICBSRUxPQ19TVERfU0laRS4gICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQgPQotICAgIGV4ZWNwLT5hX3Ryc2l6ZSAvIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCA9Ci0gICAgZXhlY3AtPmFfZHJzaXplIC8gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotCi0gIC8qIE5vdyB0aGF0IHdlIGtub3cgdGhlIGFyY2hpdGVjdHVyZSwgc2V0IHRoZSBhbGlnbm1lbnRzIG9mIHRoZQotICAgICBzZWN0aW9ucy4gIFRoaXMgaXMgbm9ybWFsbHkgZG9uZSBieSBOQU1FKGFvdXQsbmV3X3NlY3Rpb25faG9vayksCi0gICAgIGJ1dCB3aGVuIHRoZSBpbml0aWFsIHNlY3Rpb25zIHdlcmUgY3JlYXRlZCB0aGUgYXJjaGl0ZWN0dXJlIGhhZAotICAgICBub3QgeWV0IGJlZW4gc2V0LiAgSG93ZXZlciwgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHdlIGRvbid0Ci0gICAgIHNldCB0aGUgYWxpZ25tZW50IHBvd2VyIGFueSBoaWdoZXIgdGhhbiBhcyByZXF1aXJlZCBieSB0aGUgc2l6ZQotICAgICBvZiB0aGUgc2VjdGlvbi4gICovCi0gIGFyY2hfYWxpZ25fcG93ZXIgPSBiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0gIGFyY2hfYWxpZ24gPSAxIDw8IGFyY2hfYWxpZ25fcG93ZXI7Ci0gIGlmICgoQkZEX0FMSUdOIChvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSwgYXJjaF9hbGlnbikKLSAgICAgICA9PSBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSkKLSAgICAgICYmIChCRkRfQUxJR04gKG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplLCBhcmNoX2FsaWduKQotCSAgPT0gb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUpCi0gICAgICAmJiAoQkZEX0FMSUdOIChvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplLCBhcmNoX2FsaWduKQotCSAgPT0gb2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZSkpCi0gICAgewotICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBhcmNoX2FsaWduX3Bvd2VyOwotICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBhcmNoX2FsaWduX3Bvd2VyOwotICAgICAgb2JqX2Jzc3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGFyY2hfYWxpZ25fcG93ZXI7Ci0gICAgfQotCi0gIC8qIERvbid0IHNldCBzaXplcyBub3cgLS0gY2FuJ3QgYmUgc3VyZSB1bnRpbCB3ZSBrbm93IGFyY2ggJiBtYWNoLgotICAgICBTaXplcyBnZXQgc2V0IGluIHNldF9zaXplcyBjYWxsYmFjaywgbGF0ZXIuICAqLwotI2lmIDAKLSAgYWRhdGEoYWJmZCkucGFnZV9zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKLSAgYWRhdGEoYWJmZCkuc2VnbWVudF9zaXplID0gU0VHTUVOVF9TSVpFOwotICBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0jZW5kaWYKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE1ZX29iamVjdF9wCi0vKiBGaW5pc2ggdXAgdGhlIHJlYWRpbmcgb2YgYW4gYS5vdXQgZmlsZSBoZWFkZXIgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKk1ZKG9iamVjdF9wKSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1NWShvYmplY3RfcCkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsJLyogUmF3IGV4ZWMgaGVhZGVyIGZyb20gZmlsZSAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBleGVjOwkJLyogQ2xlYW5lZC11cCBleGVjIGhlYWRlciAqLwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQ7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQotICAgICAgIT0gRVhFQ19CWVRFU19TSVpFKSB7Ci0gICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotI2lmZGVmIFNXQVBfTUFHSUMKLSAgZXhlYy5hX2luZm8gPSBTV0FQX01BR0lDIChleGVjX2J5dGVzLmVfaW5mbyk7Ci0jZWxzZQotICBleGVjLmFfaW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXhlY19ieXRlcy5lX2luZm8pOwotI2VuZGlmIC8qIFNXQVBfTUFHSUMgKi8KLQotICBpZiAoTl9CQURNQUcgKGV4ZWMpKSByZXR1cm4gMDsKLSNpZmRlZiBNQUNIVFlQRV9PSwotICBpZiAoIShNQUNIVFlQRV9PSyAoTl9NQUNIVFlQRSAoZXhlYykpKSkgcmV0dXJuIDA7Ci0jZW5kaWYKLQotICBOQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikoYWJmZCwgJmV4ZWNfYnl0ZXMsICZleGVjKTsKLQotI2lmZGVmIFNXQVBfTUFHSUMKLSAgLyogc3dhcF9leGVjX2hlYWRlcl9pbiByZWFkIGluIGFfaW5mbyB3aXRoIHRoZSB3cm9uZyBieXRlIG9yZGVyICovCi0gIGV4ZWMuYV9pbmZvID0gU1dBUF9NQUdJQyAoZXhlY19ieXRlcy5lX2luZm8pOwotI2VuZGlmIC8qIFNXQVBfTUFHSUMgKi8KLQotICB0YXJnZXQgPSBOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSAoYWJmZCwgJmV4ZWMsIE1ZKGNhbGxiYWNrKSk7Ci0KLSNpZmRlZiBFTlRSWV9DQU5fQkVfWkVSTwotICAvKiBUaGUgTkVXU09TMyBlbnRyeS1wb2ludCBpcy93YXMgMCwgd2hpY2ggKGFtb25nc3Qgb3RoZXIgbG9zc2FnZSkKLSAgICogbWVhbnMgdGhhdCBpdCBpc24ndCBvYnZpb3VzIGlmIEVYRUNfUCBzaG91bGQgYmUgc2V0LgotICAgKiBBbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWUgZm9yIGFuIGV4ZWN1dGFibGU6Ci0gICAqIFRoZXJlIG11c3QgYmUgbm8gcmVsb2NhdGlvbnMsIHRoZSBiZmQgY2FuIGJlIG5laXRoZXIgYW4KLSAgICogYXJjaGl2ZSBub3IgYW4gYXJjaGl2ZSBlbGVtZW50LCBhbmQgdGhlIGZpbGUgbXVzdCBiZSBleGVjdXRhYmxlLiAqLwotCi0gIGlmIChleGVjLmFfdHJzaXplICsgZXhlYy5hX2Ryc2l6ZSA9PSAwCi0gICAgICAmJiBiZmRfZ2V0X2Zvcm1hdChhYmZkKSA9PSBiZmRfb2JqZWN0ICYmIGFiZmQtPm15X2FyY2hpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0jaWZuZGVmIFNfSVhVU1IKLSNkZWZpbmUgU19JWFVTUiAwMTAwCS8qIEV4ZWN1dGUgYnkgb3duZXIuICAqLwotI2VuZGlmCi0gICAgICBpZiAoc3RhdChhYmZkLT5maWxlbmFtZSwgJmJ1ZikgPT0gMCAmJiAoYnVmLnN0X21vZGUgJiBTX0lYVVNSKSkKLQlhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0gICAgfQotI2VuZGlmIC8qIEVOVFJZX0NBTl9CRV9aRVJPICovCi0KLSAgcmV0dXJuIHRhcmdldDsKLX0KLSNkZWZpbmUgTVlfb2JqZWN0X3AgTVkob2JqZWN0X3ApCi0jZW5kaWYKLQotCi0jaWZuZGVmIE1ZX21rb2JqZWN0Ci0KLXN0YXRpYyBib29sZWFuIE1ZKG1rb2JqZWN0KSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotTVkobWtvYmplY3QpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChOQU1FKGFvdXQsbWtvYmplY3QpKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLSNpZiAwIC8qIFNpemVzIGdldCBzZXQgaW4gc2V0X3NpemVzIGNhbGxiYWNrLCBsYXRlciwgYWZ0ZXIgd2Uga25vdwotCSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lLiAgKi8KLSAgYWRhdGEoYWJmZCkucGFnZV9zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKLSAgYWRhdGEoYWJmZCkuc2VnbWVudF9zaXplID0gU0VHTUVOVF9TSVpFOwotICBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0jZGVmaW5lIE1ZX21rb2JqZWN0IE1ZKG1rb2JqZWN0KQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLQotLyogQ29weSBwcml2YXRlIHNlY3Rpb24gZGF0YS4gIFRoaXMgYWN0dWFsbHkgZG9lcyBub3RoaW5nIHdpdGggdGhlCi0gICBzZWN0aW9ucy4gIEl0IGNvcGllcyB0aGUgc3ViZm9ybWF0IGZpZWxkLiAgV2UgY29weSBpdCBoZXJlLCBiZWNhdXNlCi0gICB3ZSBuZWVkIHRvIGtub3cgd2hldGhlciB0aGlzIGlzIGEgUU1BR0lDIGZpbGUgYmVmb3JlIHdlIHNldCB0aGUKLSAgIHNlY3Rpb24gY29udGVudHMsIGFuZCBjb3B5X3ByaXZhdGVfYmZkX2RhdGEgaXMgbm90IGNhbGxlZCB1bnRpbAotICAgYWZ0ZXIgdGhlIHNlY3Rpb24gY29udGVudHMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyBib29sZWFuIE1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmQgKiwgYXNlY3Rpb24gKikpOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1NWV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlYywgb2JmZCwgb3NlYykKLSAgICAgYmZkICppYmZkOwotICAgICBhc2VjdGlvbiAqaXNlYzsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc2VjdGlvbiAqb3NlYzsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIKLSAgICAgICYmIGJmZF9nZXRfZmxhdm91ciAob2JmZCkgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0gICAgb2JqX2FvdXRfc3ViZm9ybWF0IChvYmZkKSA9IG9ial9hb3V0X3N1YmZvcm1hdCAoaWJmZCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYKLQotLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUuCi0gICBTZWN0aW9uIGNvbnRlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uICBXZSB3cml0ZSB0aGUKLSAgIGZpbGUgaGVhZGVyLCBzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbi4gICovCi0KLSNpZm5kZWYgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi1zdGF0aWMgYm9vbGVhbgotTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSNpZiBDSE9PU0VfUkVMT0NfU0laRQotICBDSE9PU0VfUkVMT0NfU0laRShhYmZkKTsKLSNlbHNlCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotI2VuZGlmCi0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9zZXRfc2l6ZXMKLQotc3RhdGljIGJvb2xlYW4gTVkoc2V0X3NpemVzKSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotTVkoc2V0X3NpemVzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhZGF0YShhYmZkKS5wYWdlX3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOwotICBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUgPSBTRUdNRU5UX1NJWkU7Ci0KLSNpZmRlZiBaTUFHSUNfRElTS19CTE9DS19TSVpFCi0gIGFkYXRhKGFiZmQpLnptYWdpY19kaXNrX2Jsb2NrX3NpemUgPSBaTUFHSUNfRElTS19CTE9DS19TSVpFOwotI2Vsc2UKLSAgYWRhdGEoYWJmZCkuem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0jZW5kaWYKLQotICBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0gIHJldHVybiB0cnVlOwotfQotI2RlZmluZSBNWV9zZXRfc2l6ZXMgTVkoc2V0X3NpemVzKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfZXhlY19oZHJfZmxhZ3MKLSNkZWZpbmUgTVlfZXhlY19oZHJfZmxhZ3MgMAotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmFja2VuZF9kYXRhCi0KLSNpZm5kZWYgTVlfem1hZ2ljX2NvbnRpZ3VvdXMKLSNkZWZpbmUgTVlfem1hZ2ljX2NvbnRpZ3VvdXMgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyCi0jZGVmaW5lIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MKLSNkZWZpbmUgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZAotI2RlZmluZSBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfYWRkX2R5bmFtaWNfc3ltYm9scwotI2RlZmluZSBNWV9hZGRfZHluYW1pY19zeW1ib2xzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfbGlua19keW5hbWljX29iamVjdAotI2RlZmluZSBNWV9saW5rX2R5bmFtaWNfb2JqZWN0IDAKLSNlbmRpZgotI2lmbmRlZiBNWV93cml0ZV9keW5hbWljX3N5bWJvbAotI2RlZmluZSBNWV93cml0ZV9keW5hbWljX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2hlY2tfZHluYW1pY19yZWxvYwotI2RlZmluZSBNWV9jaGVja19keW5hbWljX3JlbG9jIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9maW5pc2hfZHluYW1pY19saW5rCi0jZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgMAotI2VuZGlmCi0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgTVkoYmFja2VuZF9kYXRhKSA9IHsKLSAgTVlfem1hZ2ljX2NvbnRpZ3VvdXMsCi0gIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyLAotICBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MsCi0gIE1ZX2V4ZWNfaGRyX2ZsYWdzLAotICAwLAkJCQkvKiB0ZXh0IHZtYT8gKi8KLSAgTVlfc2V0X3NpemVzLAotICBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCwKLSAgTVlfYWRkX2R5bmFtaWNfc3ltYm9scywKLSAgTVlfYWRkX29uZV9zeW1ib2wsCi0gIE1ZX2xpbmtfZHluYW1pY19vYmplY3QsCi0gIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sLAotICBNWV9jaGVja19keW5hbWljX3JlbG9jLAotICBNWV9maW5pc2hfZHluYW1pY19saW5rCi19OwotI2RlZmluZSBNWV9iYWNrZW5kX2RhdGEgJk1ZKGJhY2tlbmRfZGF0YSkKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sKLQotLyogQ2FsbGJhY2sgZm9yIHRoZSBmaW5hbF9saW5rIHJvdXRpbmUgdG8gc2V0IHRoZSBzZWN0aW9uIG9mZnNldHMuICAqLwotCi1zdGF0aWMgdm9pZCBNWV9maW5hbF9saW5rX2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1NWV9maW5hbF9saW5rX2NhbGxiYWNrIChhYmZkLCBwdHJlbG9mZiwgcGRyZWxvZmYsIHBzeW1vZmYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmlsZV9wdHIgKnB0cmVsb2ZmOwotICAgICBmaWxlX3B0ciAqcGRyZWxvZmY7Ci0gICAgIGZpbGVfcHRyICpwc3ltb2ZmOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgKnB0cmVsb2ZmID0gTl9UUkVMT0ZGICgqZXhlY3ApOwotICAqcGRyZWxvZmYgPSBOX0RSRUxPRkYgKCpleGVjcCk7Ci0gICpwc3ltb2ZmID0gTl9TWU1PRkYgKCpleGVjcCk7Ci19Ci0KLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9maW5hbF9saW5rCi0KLS8qIEZpbmFsIGxpbmsgcm91dGluZS4gIFdlIG5lZWQgdG8gdXNlIGEgY2FsbCBiYWNrIHRvIGdldCB0aGUgY29ycmVjdAotICAgb2Zmc2V0cyBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBNWV9iZmRfZmluYWxfbGluayBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgYm9vbGVhbgotTVlfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBOQU1FKGFvdXQsZmluYWxfbGluaykgKGFiZmQsIGluZm8sIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOwotfQotCi0jZW5kaWYKLQotLyogV2UgYXNzdW1lIEJGRCBnZW5lcmljIGFyY2hpdmUgZmlsZXMuICAqLwotI2lmbmRlZglNWV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUJTVlfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCWJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgTVlfZ2V0X2VsdF9hdF9pbmRleAkJX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNlbmRpZgotI2lmbmRlZglNWV9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUJTVlfZ2VuZXJpY19zdGF0X2FyY2hfZWx0CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNlbmRpZgotI2lmbmRlZglNWV9zbHVycF9hcm1hcAotI2RlZmluZQlNWV9zbHVycF9hcm1hcAkJCWJmZF9zbHVycF9ic2RfYXJtYXAKLSNlbmRpZgotI2lmbmRlZglNWV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lCU1ZX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUJX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZW5kaWYKLSNpZm5kZWYgTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZW5kaWYKLSNpZm5kZWYJTVlfd3JpdGVfYXJtYXAKLSNkZWZpbmUJTVlfd3JpdGVfYXJtYXAJCWJzZF93cml0ZV9hcm1hcAotI2VuZGlmCi0jaWZuZGVmIE1ZX3JlYWRfYXJfaGRyCi0jZGVmaW5lIE1ZX3JlYWRfYXJfaGRyCQlfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKLSNlbmRpZgotI2lmbmRlZglNWV90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUJTVlfdHJ1bmNhdGVfYXJuYW1lCQliZmRfYnNkX3RydW5jYXRlX2FybmFtZQotI2VuZGlmCi0jaWZuZGVmIE1ZX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLSNkZWZpbmUgTVlfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLSNlbmRpZgotCi0vKiBObyBjb3JlIGZpbGUgZGVmaW5lZCBoZXJlIC0tIGNvbmZpZ3VyZSBpbiB0cmFkLWNvcmUuYyBzZXBhcmF0ZWx5LiAgKi8KLSNpZm5kZWYJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNlbmRpZgotI2lmbmRlZglNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AJXAotCQkJCV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9wCQlfYmZkX2R1bW15X3RhcmdldAotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQJCWJmZF92b2lkCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fZW5kCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZAkJYmZkX3ZvaWQKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJXAotCQkJKHZvaWQgKCopIFBBUkFNUyAoKGJmZCosIHN0cnVjdCBzZWMgKikpKSBiZmRfdm9pZAotI2VuZGlmCi0KLSNpZm5kZWYgTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIE5BTUUoYW91dCxjb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgTkFNRShhb3V0LGNvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUgTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIE5BTUUoYW91dCxjb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApCi0jZW5kaWYKLSNpZm5kZWYgTVlfc2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfc2V0X3NlY3Rpb25fY29udGVudHMgTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIE5BTUUoYW91dCxnZXRfc2VjdGlvbl9jb250ZW50cykKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNlbmRpZgotI2lmbmRlZiBNWV9uZXdfc2VjdGlvbl9ob29rCi0jZGVmaW5lIE1ZX25ld19zZWN0aW9uX2hvb2sgTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIE5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zeW10YWIKLSNkZWZpbmUgTVlfZ2V0X3N5bXRhYiBOQU1FKGFvdXQsZ2V0X3N5bXRhYikKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2Fub25pY2FsaXplX3JlbG9jCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKQotI2VuZGlmCi0jaWZuZGVmIE1ZX21ha2VfZW1wdHlfc3ltYm9sCi0jZGVmaW5lIE1ZX21ha2VfZW1wdHlfc3ltYm9sIE5BTUUoYW91dCxtYWtlX2VtcHR5X3N5bWJvbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9wcmludF9zeW1ib2wKLSNkZWZpbmUgTVlfcHJpbnRfc3ltYm9sIE5BTUUoYW91dCxwcmludF9zeW1ib2wpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIE1ZX2dldF9zeW1ib2xfaW5mbyBOQU1FKGFvdXQsZ2V0X3N5bWJvbF9pbmZvKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9saW5lbm8KLSNkZWZpbmUgTVlfZ2V0X2xpbmVubyBOQU1FKGFvdXQsZ2V0X2xpbmVubykKLSNlbmRpZgotI2lmbmRlZiBNWV9zZXRfYXJjaF9tYWNoCi0jZGVmaW5lIE1ZX3NldF9hcmNoX21hY2ggTkFNRShhb3V0LHNldF9hcmNoX21hY2gpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgTVlfZmluZF9uZWFyZXN0X2xpbmUgTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3NpemVvZl9oZWFkZXJzCi0jZGVmaW5lIE1ZX3NpemVvZl9oZWFkZXJzIE5BTUUoYW91dCxzaXplb2ZfaGVhZGVycykKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgTVlfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBNWV9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIE5BTUUoYW91dCxyZWxvY190eXBlX2xvb2t1cCkKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgTVlfYmZkX21ha2VfZGVidWdfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIE1ZX3JlYWRfbWluaXN5bWJvbHMgTkFNRShhb3V0LHJlYWRfbWluaXN5bWJvbHMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfbWluaXN5bWJvbF90b19zeW1ib2wKLSNkZWZpbmUgTVlfbWluaXN5bWJvbF90b19zeW1ib2wgTkFNRShhb3V0LG1pbmlzeW1ib2xfdG9fc3ltYm9sKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgTVlfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2VuZGlmCi0KLQotI2lmbmRlZiBNWV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2RlZmluZSBNWV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBNWV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgTVlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8gTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgTVlfY2xvc2VfYW5kX2NsZWFudXAgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgXAotICBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQKLSNlbmRpZgotI2lmbmRlZiBNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFwKLSAgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgXAotICBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIFwKLSAgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSNlbmRpZgotCi0vKiBBb3V0IHN5bWJvbHMgbm9ybWFsbHkgaGF2ZSBsZWFkaW5nIHVuZGVyc2NvcmVzICovCi0jaWZuZGVmIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIgCi0jZGVmaW5lIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIgJ18nCi0jZW5kaWYKLQotLyogQW91dCBhcmNoaXZlcyBub3JtYWxseSB1c2Ugc3BhY2VzIGZvciBwYWRkaW5nICovCi0jaWZuZGVmIEFSX1BBRF9DSEFSCi0jZGVmaW5lIEFSX1BBRF9DSEFSICcgJwotI2VuZGlmCi0KLSNpZm5kZWYgTVlfQkZEX1RBUkdFVAotY29uc3QgYmZkX3RhcmdldCBNWSh2ZWMpID0KLXsKLSAgVEFSR0VUTkFNRSwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0jaWZkZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyIChiaWcpICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAoYmlnKSAqLwotI2Vsc2UKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAobGl0dGxlKSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGxpdHRsZSkgKi8KLSNlbmRpZgotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBEWU5BTUlDIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIsCi0gIEFSX1BBRF9DSEFSLAkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotI2lmZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0jZWxzZQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLSNlbmRpZgotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgTVlfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChNWSksCi0KLSAgKFBUUikgTVlfYmFja2VuZF9kYXRhLAotfTsKLSNlbmRpZiAvKiBNWV9CRkRfVEFSR0VUICovCmRpZmYgLS1naXQgYS9iZmQvYW91dC10aWMzMC5jIGIvYmZkL2FvdXQtdGljMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlNmNiNy4uMDAwMDAwMAotLS0gYS9iZmQvYW91dC10aWMzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2NSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFRNUzMyMEMzMCBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDEKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAxMDI0Ci0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMTI4Ci0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF90aWMzMAotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotI2RlZmluZSBNWShPUCkgQ0FUKHRpYzMwX2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC10aWMzMCIKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDModGljMzBfYW91dCxfMzJfLHkpCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdGljMzBfYW91dF9maXhfMTYKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHRpYzMwX2FvdXRfZml4XzMyCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB0aWMzMF9hb3V0X2ZpeF9wY3JlbF8xNgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICp0aWMzMF9hb3V0X3JlbG9jX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICosIGludCAqLCBpbnQgKiwgaW50ICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdGljMzBfYW91dF9yZWxvY2F0ZV9jb250ZW50cwotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHRpYzMwX2FvdXRfZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBiZmRfdm1hLAotCSAgIGJmZF92bWEsIGJmZF92bWEpKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICp0aWMzMF9hb3V0X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB0aWMzMF9hb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdGljMzBfYW91dF9zZXRfc2l6ZXMgUEFSQU1TICgoYmZkICopKTsKLQotI2RlZmluZSBNWV9yZWxvY19ob3d0byhCRkQsUkVMLElOLEVYLFBDKSB0aWMzMF9hb3V0X3JlbG9jX2hvd3RvKEJGRCxSRUwsJklOLCZFWCwmUEMpCi0jZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgdGljMzBfYW91dF9maW5hbF9saW5rX3JlbG9jYXRlCi0jZGVmaW5lIE1ZX29iamVjdF9wIHRpYzMwX2FvdXRfb2JqZWN0X3AKLSNkZWZpbmUgTVlfbWtvYmplY3QgTkFNRShhb3V0LG1rb2JqZWN0KQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgdGljMzBfYW91dF93cml0ZV9vYmplY3RfY29udGVudHMKLSNkZWZpbmUgTVlfc2V0X3NpemVzIHRpYzMwX2FvdXRfc2V0X3NpemVzCi0KLSNpZm5kZWYgTVlfZXhlY19oZHJfZmxhZ3MKLSNkZWZpbmUgTVlfZXhlY19oZHJfZmxhZ3MgMQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmFja2VuZF9kYXRhCi0KLSNpZm5kZWYgTVlfem1hZ2ljX2NvbnRpZ3VvdXMKLSNkZWZpbmUgTVlfem1hZ2ljX2NvbnRpZ3VvdXMgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyCi0jZGVmaW5lIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MKLSNkZWZpbmUgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZAotI2RlZmluZSBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCAxCi0jZW5kaWYKLSNpZm5kZWYgTVlfYWRkX2R5bmFtaWNfc3ltYm9scwotI2RlZmluZSBNWV9hZGRfZHluYW1pY19zeW1ib2xzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfbGlua19keW5hbWljX29iamVjdAotI2RlZmluZSBNWV9saW5rX2R5bmFtaWNfb2JqZWN0IDAKLSNlbmRpZgotI2lmbmRlZiBNWV93cml0ZV9keW5hbWljX3N5bWJvbAotI2RlZmluZSBNWV93cml0ZV9keW5hbWljX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2hlY2tfZHluYW1pY19yZWxvYwotI2RlZmluZSBNWV9jaGVja19keW5hbWljX3JlbG9jIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9maW5pc2hfZHluYW1pY19saW5rCi0jZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgMAotI2VuZGlmCi0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgdGljMzBfYW91dF9iYWNrZW5kX2RhdGEgPQotewotICBNWV96bWFnaWNfY29udGlndW91cywKLSAgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIsCi0gIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcywKLSAgTVlfZXhlY19oZHJfZmxhZ3MsCi0gIDAsCQkJCS8qIHRleHQgdm1hPyAqLwotICBNWV9zZXRfc2l6ZXMsCi0gIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkLAotICBNWV9hZGRfZHluYW1pY19zeW1ib2xzLAotICBNWV9hZGRfb25lX3N5bWJvbCwKLSAgTVlfbGlua19keW5hbWljX29iamVjdCwKLSAgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wsCi0gIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MsCi0gIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsKLX07Ci0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmdGljMzBfYW91dF9iYWNrZW5kX2RhdGEKLSNlbmRpZgotCi0vKiBGSVhNRTogVGhpcyBpcyB3cm9uZy4gIGFvdXR4Lmggc2hvdWxkIHJlYWxseSBvbmx5IGJlIGluY2x1ZGVkIGJ5Ci0gICBhb3V0MzIuYy4gICovCi0KLSNpbmNsdWRlICJhb3V0eC5oIgotCi0vKiBUaGlzIHRhYmxlIGxpc3RzIHRoZSByZWxvY2F0aW9uIHR5cGVzIGZvciB0aGUgVE1TMzIwQzMwLiAgVGhlcmUgYXJlCi0gICBvbmx5IGEgZmV3IHJlbG9jYXRpb25zIHJlcXVpcmVkLCBhbmQgYWxsIG11c3QgYmUgZGl2aWRlZCBieSA0ICg+PgotICAgMikgdG8gZ2V0IHRoZSAzMi1iaXQgYWRkcmVzc2VzIGluIHRoZSBmb3JtYXQgdGhlIFRNUzMyMEMzMCBsaWtlcwotICAgaXQuICovCi1yZWxvY19ob3d0b190eXBlIHRpYzMwX2FvdXRfaG93dG9fdGFibGVbXSA9Ci17Ci0gIHstMX0sCi0gIEhPV1RPICgxLCAyLCAxLCAxNiwgZmFsc2UsIDAsIDAsIHRpYzMwX2FvdXRfZml4XzE2LAotCSAiMTYiLCBmYWxzZSwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRiwgZmFsc2UpLAotICBIT1dUTyAoMiwgMiwgMiwgMjQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgTlVMTCwKLQkgIjI0IiwgZmFsc2UsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIGZhbHNlKSwKLSAgSE9XVE8gKDMsIDE4LCAzLCAyNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBOVUxMLAotCSAiTERQIiwgZmFsc2UsIDB4MDBGRjAwMDAsIDB4MDAwMDAwRkYsIGZhbHNlKSwKLSAgSE9XVE8gKDQsIDIsIDQsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHRpYzMwX2FvdXRfZml4XzMyLAotCSAiMzIiLCBmYWxzZSwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgZmFsc2UpLAotICBIT1dUTyAoNSwgMiwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgdGljMzBfYW91dF9maXhfcGNyZWxfMTYsICJQQ1JFTCIsIHRydWUsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYsIHRydWUpLAotICB7LTF9LAotICB7LTF9LAotICB7LTF9LAotICB7LTF9LAotICB7LTF9Ci19OwotCi1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSAqTkFNRSAoYW91dCwgcmVsb2NfdHlwZV9sb29rdXApICgpOwotCi1yZWxvY19ob3d0b190eXBlICoKLXRpYzMwX2FvdXRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICBjYXNlIEJGRF9SRUxPQ19USUMzMF9MRFA6Ci0gICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbM107Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbMV07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjQ6Ci0gICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbMl07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6Ci0gICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbNV07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbNF07Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotdGljMzBfYW91dF9yZWxvY19ob3d0byAoYWJmZCwgcmVsb2NzLCByX2luZGV4LCByX2V4dGVybiwgcl9wY3JlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWxvY3M7Ci0gICAgIGludCAqcl9pbmRleDsKLSAgICAgaW50ICpyX2V4dGVybjsKLSAgICAgaW50ICpyX3BjcmVsOwotewotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg7Ci0gIHVuc2lnbmVkIGludCByX3BjcmVsX2RvbmU7Ci0gIGludCBpbmRleDsKLQotICAqcl9wY3JlbCA9IDA7Ci0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgICpyX2luZGV4ID0gKChyZWxvY3MtPnJfaW5kZXhbMF0gPDwgMTYpIHwgKHJlbG9jcy0+cl9pbmRleFsxXSA8PCA4KSB8IHJlbG9jcy0+cl9pbmRleFsyXSk7Ci0gICAgICAqcl9leHRlcm4gPSAoMCAhPSAocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHKSk7Ci0gICAgICByX3BjcmVsX2RvbmUgPSAoMCAhPSAocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcpKTsKLSAgICAgIHJfbGVuZ3RoID0gKChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpyX2luZGV4ID0gKChyZWxvY3MtPnJfaW5kZXhbMl0gPDwgMTYpIHwgKHJlbG9jcy0+cl9pbmRleFsxXSA8PCA4KSB8IHJlbG9jcy0+cl9pbmRleFswXSk7Ci0gICAgICAqcl9leHRlcm4gPSAoMCAhPSAocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7Ci0gICAgICByX3BjcmVsX2RvbmUgPSAoMCAhPSAocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLSAgICAgIHJfbGVuZ3RoID0gKChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9MSVRUTEUpID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpOwotICAgIH0KLSAgaW5kZXggPSByX2xlbmd0aCArIDQgKiByX3BjcmVsX2RvbmU7Ci0gIHJldHVybiB0aWMzMF9hb3V0X2hvd3RvX3RhYmxlICsgaW5kZXg7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGNhbGxiYWNrIGZvciAxNi1iaXQgcmVsb2NzLiAgVGhpcyBpcwotICAgcmVxdWlyZWQgZm9yIHJlbG9jYXRpb25zIGJldHdlZW4gc2VnbWVudHMuICBBIGxpbmUgaW4gYW91dHguaAotICAgcmVxdWlyZXMgdGhhdCBhbnkgcmVsb2NhdGlvbnMgZm9yIHRoZSBkYXRhIHNlY3Rpb24gc2hvdWxkIHBvaW50IHRvCi0gICB0aGUgZW5kIG9mIHRoZSBhbGlnbmVkIHRleHQgc2VjdGlvbiwgcGx1cyBhbiBvZmZzZXQuICBCeSBkZWZhdWx0LAotICAgdGhpcyBkb2VzIG5vdCBoYXBwZW4sIHRoZXJlZm9yZSB0aGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YKLSAgIHRoYXQuICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXRpYzMwX2FvdXRfZml4XzE2IChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzeW1ib2wncyBzZWN0aW9uIGlzIGRlZmluZWQuICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbiAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX29rIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLSAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzZWN0aW9uIGFuZCB0dXJuIGl0IGludG8gdGhlIFRNUzMyMEMzMAotICAgICAzMi1iaXQgYWRkcmVzcyBmb3JtYXQuICovCi0gIHJlbG9jYXRpb24gPSAoc3ltYm9sLT5zZWN0aW9uLT52bWEgPj4gMik7Ci0gIHJlbG9jYXRpb24gKz0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIHJlbG9jYXRpb24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgdGljMzBfYW91dF9maXhfMTYgZXhjZXB0IGZvciAzMgotICAgYml0IHJlbG9jYXRpb25zLiAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi10aWMzMF9hb3V0X2ZpeF8zMiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc3ltYm9sJ3Mgc2VjdGlvbiBpcyBkZWZpbmVkLiAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24gJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKLSAgICByZXR1cm4gb3V0cHV0X2JmZCA/IGJmZF9yZWxvY19vayA6IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0gIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc2VjdGlvbiBhbmQgdHVybiBpdCBpbnRvIHRoZSBUTVMzMjBDMzAKLSAgICAgMzItYml0IGFkZHJlc3MgZm9ybWF0LiAqLwotICByZWxvY2F0aW9uID0gKHN5bWJvbC0+c2VjdGlvbi0+dm1hID4+IDIpOwotICByZWxvY2F0aW9uICs9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICBiZmRfcHV0XzMyIChhYmZkLCByZWxvY2F0aW9uLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdvcmsgb3V0IHBjLXJlbGF0aXZlIG9mZnNldHMgZm9yIHRoZQotICAgVE1TMzIwQzMwLiAgVGhlIGRhdGEgYWxyZWFkeSBwbGFjZWQgYnkgbWRfcGNyZWxfZnJvbSB3aXRoaW4gZ2FzIGlzCi0gICB1c2VsZXNzIGZvciBhIHJlbG9jYXRpb24sIHNvIHdlIGp1c3QgZ2V0IHRoZSBvZmZzZXQgdmFsdWUgYW5kIHBsYWNlCi0gICBhIHZlcnNpb24gb2YgdGhpcyB3aXRoaW4gdGhlIG9iamVjdCBjb2RlLgotICAgdGljMzBfYW91dF9maW5hbF9saW5rX3JlbG9jYXRlIHdpbGwgdGhlbiBjYWxjdWxhdGUgdGhlIHJlcXVpcmVkCi0gICByZWxvY2F0aW9uIHRvIGFkZCBvbiB0byB0aGUgdmFsdWUgaW4gdGhlIG9iamVjdCBjb2RlLiAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi10aWMzMF9hb3V0X2ZpeF9wY3JlbF8xNiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uID0gMTsKLSAgYmZkX2J5dGUgb2Zmc2V0X2RhdGEgPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MgLSAxKTsKLQotICAvKiBUaGUgYnl0ZSBiZWZvcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXggY29udGFpbnMgYml0cyAyMy0xNiBvZgotICAgICB0aGUgcGNyZWwgaW5zdHJ1Y3Rpb24uICBCaXQgMjEgaXMgc2V0IGZvciBhIGRlbGF5ZWQgaW5zdHJ1Y3Rpb24KLSAgICAgd2hpY2ggcmVxdWlyZXMgb24gb2Zmc2V0IG9mIDMgaW5zdGVhZCBvZiAxLiAqLwotICBpZiAob2Zmc2V0X2RhdGEgJiAweDIwKQotICAgIHJlbG9jYXRpb24gLT0gMzsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gLT0gMTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgcmVsb2NhdGlvbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIFRoZXNlIG1hY3JvcyB3aWxsIGdldCAyNC1iaXQgdmFsdWVzIGZyb20gdGhlIGJmZCBkZWZpbml0aW9uLgotICAgQmlnLWVuZGlhbiBvbmx5LiAqLwotI2RlZmluZSBiZmRfZ2V0Yl8yNChCRkQsQUREUikgKGJmZF9nZXRfOChCRkQsQUREUikgPDwgMTYpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJmZF9nZXRfOChCRkQsQUREUisxKSA8PCA4KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfZ2V0XzgoQkZELEFERFIrMikpCi0KLSNkZWZpbmUgYmZkX3B1dGJfMjQoQkZELERBVEEsQUREUikgYmZkX3B1dF84KEJGRCwoYmZkX2J5dGUpKChEQVRBID4+IDE2KSAmIDB4RkYpLEFERFIpOyBcCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9wdXRfOChCRkQsKGJmZF9ieXRlKSgoREFUQSA+PiA4KSAmIDB4RkYpLEFERFIrMSk7IFwKLQkJICAgICAgICAgCQkJCSAgIGJmZF9wdXRfOChCRkQsKGJmZF9ieXRlKShEQVRBICYgMHhGRiksQUREUisyKQotCi0vKiBTZXQgcGFyYW1ldGVycyBhYm91dCB0aGlzIGEub3V0IGZpbGUgdGhhdCBhcmUgbWFjaGluZS1kZXBlbmRlbnQuCi0gICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gc29tZV9hb3V0X29iamVjdF9wIGp1c3QgYmVmb3JlIGl0IHJldHVybnMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi10aWMzMF9hb3V0X2NhbGxiYWNrIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLSAgdW5zaWduZWQgaW50IGFyY2hfYWxpZ25fcG93ZXI7Ci0gIHVuc2lnbmVkIGxvbmcgYXJjaF9hbGlnbjsKLQotICAvKiBDYWxjdWxhdGUgdGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSBwYXJ0cyBvZiBhIG5ld2x5IHJlYWQgYW91dCBoZWFkZXIgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBOX1RYVFNJWkUgKCpleGVjcCk7Ci0KLSAgLyogVGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBOX1RYVEFERFIgKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSICgqZXhlY3ApOwotICBvYmpfYnNzc2VjIChhYmZkKS0+dm1hID0gTl9CU1NBRERSICgqZXhlY3ApOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+bG1hID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+bG1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGICgqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRiAoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fRFJFTE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOwotCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSNpZmRlZiBTRVRfQVJDSF9NQUNICi0gIFNFVF9BUkNIX01BQ0ggKGFiZmQsICpleGVjcCk7Ci0jZWxzZQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBERUZBVUxUX0FSQ0gsIDApOwotI2VuZGlmCi0KLSAgLyogTm93IHRoYXQgd2Uga25vdyB0aGUgYXJjaGl0ZWN0dXJlLCBzZXQgdGhlIGFsaWdubWVudHMgb2YgdGhlCi0gICAgIHNlY3Rpb25zLiAgVGhpcyBpcyBub3JtYWxseSBkb25lIGJ5IE5BTUUoYW91dCxuZXdfc2VjdGlvbl9ob29rKSwKLSAgICAgYnV0IHdoZW4gdGhlIGluaXRpYWwgc2VjdGlvbnMgd2VyZSBjcmVhdGVkIHRoZSBhcmNoaXRlY3R1cmUgaGFkCi0gICAgIG5vdCB5ZXQgYmVlbiBzZXQuICBIb3dldmVyLCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgd2UgZG9uJ3QKLSAgICAgc2V0IHRoZSBhbGlnbm1lbnQgcG93ZXIgYW55IGhpZ2hlciB0aGFuIGFzIHJlcXVpcmVkIGJ5IHRoZSBzaXplCi0gICAgIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgYXJjaF9hbGlnbl9wb3dlciA9IGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+c2VjdGlvbl9hbGlnbl9wb3dlcjsKLSAgYXJjaF9hbGlnbiA9IDEgPDwgYXJjaF9hbGlnbl9wb3dlcjsKLSAgaWYgKChCRkRfQUxJR04gKG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplLCBhcmNoX2FsaWduKQotICAgICAgID09IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplKQotICAgICAgJiYgKEJGRF9BTElHTiAob2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUsIGFyY2hfYWxpZ24pCi0JICA9PSBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSkKLSAgICAgICYmIChCRkRfQUxJR04gKG9ial9ic3NzZWMgKGFiZmQpLT5fcmF3X3NpemUsIGFyY2hfYWxpZ24pCi0JICA9PSBvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplKSkKLSAgICB7Ci0gICAgICBvYmpfdGV4dHNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGFyY2hfYWxpZ25fcG93ZXI7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGFyY2hfYWxpZ25fcG93ZXI7Ci0gICAgICBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gYXJjaF9hbGlnbl9wb3dlcjsKLSAgICB9Ci0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi10aWMzMF9hb3V0X2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCWFkZHJlc3MsIHZhbHVlLCBhZGRlbmQpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIGlmIChhZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICByZWxvY2F0aW9uID0gdmFsdWUgKyBhZGRlbmQ7Ci0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgewotICAgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JcmVsb2NhdGlvbiAtPSBhZGRyZXNzOwotICAgIH0KLSAgcmV0dXJuIHRpYzMwX2FvdXRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICAgICAgIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci19Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotdGljMzBfYW91dF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgbG9jYXRpb24pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICBiZmRfYnl0ZSAqbG9jYXRpb247Ci17Ci0gIGJmZF92bWEgeDsKLSAgYm9vbGVhbiBvdmVyZmxvdzsKLQotICBpZiAoaG93dG8tPnNpemUgPCAwKQotICAgIHJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQotICBzd2l0Y2ggKGhvd3RvLT5zaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgeCA9IGJmZF9nZXRiXzI0IChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIHggPSBiZmRfZ2V0XzggKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBvdmVyZmxvdyA9IGZhbHNlOwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpCi0gICAgewotICAgICAgYmZkX3ZtYSBjaGVjazsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHNpZ25lZF9jaGVjazsKLSAgICAgIGJmZF92bWEgYWRkOwotICAgICAgYmZkX3NpZ25lZF92bWEgc2lnbmVkX2FkZDsKLQotICAgICAgaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID09IDApCi0JewotCSAgY2hlY2sgPSByZWxvY2F0aW9uOwotCSAgc2lnbmVkX2NoZWNrID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjaGVjayA9IHJlbG9jYXRpb24gPj4gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0JICBpZiAoKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uID49IDApCi0JICAgIHNpZ25lZF9jaGVjayA9IGNoZWNrOwotCSAgZWxzZQotCSAgICBzaWduZWRfY2hlY2sgPSAoY2hlY2sgfCAoKGJmZF92bWEpIC0gMSAmIH4oKGJmZF92bWEpIC0gMSA+PiBob3d0by0+cmlnaHRzaGlmdCkpKTsKLQl9Ci0gICAgICBhZGQgPSB4ICYgaG93dG8tPnNyY19tYXNrOwotICAgICAgc2lnbmVkX2FkZCA9IGFkZDsKLSAgICAgIGlmICgoYWRkICYgKCgofmhvd3RvLT5zcmNfbWFzaykgPj4gMSkgJiBob3d0by0+c3JjX21hc2spKSAhPSAwKQotCXNpZ25lZF9hZGQgLT0gKCgofmhvd3RvLT5zcmNfbWFzaykgPj4gMSkgJiBob3d0by0+c3JjX21hc2spIDw8IDE7Ci0gICAgICBpZiAoaG93dG8tPmJpdHBvcyA9PSAwKQotCXsKLQkgIGNoZWNrICs9IGFkZDsKLQkgIHNpZ25lZF9jaGVjayArPSBzaWduZWRfYWRkOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjaGVjayArPSBhZGQgPj4gaG93dG8tPmJpdHBvczsKLQkgIGlmIChzaWduZWRfYWRkID49IDApCi0JICAgIHNpZ25lZF9jaGVjayArPSBhZGQgPj4gaG93dG8tPmJpdHBvczsKLQkgIGVsc2UKLQkgICAgc2lnbmVkX2NoZWNrICs9ICgoYWRkID4+IGhvd3RvLT5iaXRwb3MpIHwgKChiZmRfdm1hKSAtIDEgJiB+KChiZmRfdm1hKSAtIDEgPj4gaG93dG8tPmJpdHBvcykpKTsKLQl9Ci0gICAgICBzd2l0Y2ggKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdykKLQl7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQ6Ci0JICB7Ci0JICAgIGJmZF9zaWduZWRfdm1hIHJlbG9jX3NpZ25lZF9tYXggPSAoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxOwotCSAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWluID0gfnJlbG9jX3NpZ25lZF9tYXg7Ci0JICAgIGlmIChzaWduZWRfY2hlY2sgPiByZWxvY19zaWduZWRfbWF4IHx8IHNpZ25lZF9jaGVjayA8IHJlbG9jX3NpZ25lZF9taW4pCi0JICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZDoKLQkgIHsKLQkgICAgYmZkX3ZtYSByZWxvY191bnNpZ25lZF9tYXggPSAoKCgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQkgICAgaWYgKGNoZWNrID4gcmVsb2NfdW5zaWduZWRfbWF4KQotCSAgICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQ6Ci0JICB7Ci0JICAgIGJmZF92bWEgcmVsb2NfYml0cyA9ICgoKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCSAgICBpZiAoKGNoZWNrICYgfnJlbG9jX2JpdHMpICE9IDAgJiYgKCgoYmZkX3ZtYSkgc2lnbmVkX2NoZWNrICYgfnJlbG9jX2JpdHMpICE9ICgtMSAmIH5yZWxvY19iaXRzKSkpCi0JICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKLSAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7Ci0gIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spKTsKLSAgc3dpdGNoIChob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgYmZkX3B1dGJfMjQgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gb3ZlcmZsb3cgPyBiZmRfcmVsb2Nfb3ZlcmZsb3cgOiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgcmVhZGluZyBvZiBhbiBhLm91dCBmaWxlIGhlYWRlciAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi10aWMzMF9hb3V0X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7CS8qIFJhdyBleGVjIGhlYWRlciBmcm9tIGZpbGUgKi8KLSAgc3RydWN0IGludGVybmFsX2V4ZWMgZXhlYzsJLyogQ2xlYW5lZC11cCBleGVjIGhlYWRlciAqLwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQ7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLSAgICAgICE9IEVYRUNfQllURVNfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSNpZmRlZiBTV0FQX01BR0lDCi0gIGV4ZWMuYV9pbmZvID0gU1dBUF9NQUdJQyAoZXhlY19ieXRlcy5lX2luZm8pOwotI2Vsc2UKLSAgZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLSNlbmRpZiAvKiBTV0FQX01BR0lDICovCi0KLSAgaWYgKE5fQkFETUFHIChleGVjKSkKLSAgICByZXR1cm4gMDsKLSNpZmRlZiBNQUNIVFlQRV9PSwotICBpZiAoIShNQUNIVFlQRV9PSyAoTl9NQUNIVFlQRSAoZXhlYykpKSkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotCi0gIE5BTUUgKGFvdXQsIHN3YXBfZXhlY19oZWFkZXJfaW4pIChhYmZkLCAmZXhlY19ieXRlcywgJmV4ZWMpOwotCi0jaWZkZWYgU1dBUF9NQUdJQwotICAvKiBzd2FwX2V4ZWNfaGVhZGVyX2luIHJlYWQgaW4gYV9pbmZvIHdpdGggdGhlIHdyb25nIGJ5dGUgb3JkZXIgKi8KLSAgZXhlYy5hX2luZm8gPSBTV0FQX01BR0lDIChleGVjX2J5dGVzLmVfaW5mbyk7Ci0jZW5kaWYgLyogU1dBUF9NQUdJQyAqLwotCi0gIHRhcmdldCA9IE5BTUUgKGFvdXQsIHNvbWVfYW91dF9vYmplY3RfcCkgKGFiZmQsICZleGVjLCB0aWMzMF9hb3V0X2NhbGxiYWNrKTsKLQotI2lmZGVmIEVOVFJZX0NBTl9CRV9aRVJPCi0gIC8qIFRoZSBORVdTT1MzIGVudHJ5LXBvaW50IGlzL3dhcyAwLCB3aGljaCAoYW1vbmdzdCBvdGhlciBsb3NzYWdlKQotICAgKiBtZWFucyB0aGF0IGl0IGlzbid0IG9idmlvdXMgaWYgRVhFQ19QIHNob3VsZCBiZSBzZXQuCi0gICAqIEFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZSBmb3IgYW4gZXhlY3V0YWJsZToKLSAgICogVGhlcmUgbXVzdCBiZSBubyByZWxvY2F0aW9ucywgdGhlIGJmZCBjYW4gYmUgbmVpdGhlciBhbgotICAgKiBhcmNoaXZlIG5vciBhbiBhcmNoaXZlIGVsZW1lbnQsIGFuZCB0aGUgZmlsZSBtdXN0IGJlIGV4ZWN1dGFibGUuICovCi0KLSAgaWYgKGV4ZWMuYV90cnNpemUgKyBleGVjLmFfZHJzaXplID09IDAKLSAgICAgICYmIGJmZF9nZXRfZm9ybWF0IChhYmZkKSA9PSBiZmRfb2JqZWN0ICYmIGFiZmQtPm15X2FyY2hpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0jaWZuZGVmIFNfSVhVU1IKLSNkZWZpbmUgU19JWFVTUiAwMTAwCQkvKiBFeGVjdXRlIGJ5IG93bmVyLiAgKi8KLSNlbmRpZgotICAgICAgaWYgKHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmYnVmKSA9PSAwICYmIChidWYuc3RfbW9kZSAmIFNfSVhVU1IpKQotCWFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgICB9Ci0jZW5kaWYgLyogRU5UUllfQ0FOX0JFX1pFUk8gKi8KLQotICByZXR1cm4gdGFyZ2V0OwotfQotCi0vKiBDb3B5IHByaXZhdGUgc2VjdGlvbiBkYXRhLiAgVGhpcyBhY3R1YWxseSBkb2VzIG5vdGhpbmcgd2l0aCB0aGUKLSAgIHNlY3Rpb25zLiAgSXQgY29waWVzIHRoZSBzdWJmb3JtYXQgZmllbGQuICBXZSBjb3B5IGl0IGhlcmUsIGJlY2F1c2UKLSAgIHdlIG5lZWQgdG8ga25vdyB3aGV0aGVyIHRoaXMgaXMgYSBRTUFHSUMgZmlsZSBiZWZvcmUgd2Ugc2V0IHRoZQotICAgc2VjdGlvbiBjb250ZW50cywgYW5kIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSBpcyBub3QgY2FsbGVkIHVudGlsCi0gICBhZnRlciB0aGUgc2VjdGlvbiBjb250ZW50cyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotLypBUkdTVVNFRCAqLwotc3RhdGljIGJvb2xlYW4KLU1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjLCBvYmZkLCBvc2VjKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICppc2VjOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzZWN0aW9uICpvc2VjOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChvYmZkKSA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikKLSAgICBvYmpfYW91dF9zdWJmb3JtYXQgKG9iZmQpID0gb2JqX2FvdXRfc3ViZm9ybWF0IChpYmZkKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlLgotICAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCi0gICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdGljMzBfYW91dF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0jaWYgQ0hPT1NFX1JFTE9DX1NJWkUKLSAgQ0hPT1NFX1JFTE9DX1NJWkUgKGFiZmQpOwotI2Vsc2UKLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0jZW5kaWYKLSAgewotICAgIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwkvKiBkdW1teSB2YXJzICovCi0gICAgZmlsZV9wdHIgdGV4dF9lbmQ7Ci0gICAgaWYgKGFkYXRhIChhYmZkKS5tYWdpYyA9PSB1bmRlY2lkZWRfbWFnaWMpCi0gICAgICBOQU1FIChhb3V0LCBhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOwotCi0gICAgZXhlY3AtPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogRVhURVJOQUxfTkxJU1RfU0laRTsKLSAgICBleGVjcC0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0KLSAgICBleGVjcC0+YV90cnNpemUgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQpICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLSAgICBleGVjcC0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLSAgICBOQU1FIChhb3V0LCBzd2FwX2V4ZWNfaGVhZGVyX291dCkgKGFiZmQsIGV4ZWNwLCAmZXhlY19ieXRlcyk7Ci0KLSAgICBpZiAoYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA+IDApCi0gICAgICB7Ci0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmIChiZmRfd3JpdGUgKChQVFIpICYgZXhlY19ieXRlcywgMSwgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSwgYWJmZCkgIT0gYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8KLQotICAgIGlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpICE9IChhc3ltYm9sICoqKSBOVUxMCi0JJiYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICAgIHsKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fU1lNT0ZGICgqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApCi0JICByZXR1cm4gZmFsc2U7Ci0KLQlpZiAoIU5BTUUgKGFvdXQsIHdyaXRlX3N5bXMpIChhYmZkKSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoTl9UUkVMT0ZGICgqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFOQU1FIChhb3V0LCBzcXVpcnRfb3V0X3JlbG9jcykgKGFiZmQsIG9ial90ZXh0c2VjIChhYmZkKSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fRFJFTE9GRiAoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICghTkFNRSAoYW91dCwgc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBvYmpfZGF0YXNlYyAoYWJmZCkpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi10aWMzMF9hb3V0X3NldF9zaXplcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKLQotI2lmZGVmIFNFR01FTlRfU0laRQotICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gU0VHTUVOVF9TSVpFOwotI2Vsc2UKLSAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0jZW5kaWYKLQotI2lmZGVmIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUKLSAgYWRhdGEgKGFiZmQpLnptYWdpY19kaXNrX2Jsb2NrX3NpemUgPSBaTUFHSUNfRElTS19CTE9DS19TSVpFOwotI2Vsc2UKLSAgYWRhdGEgKGFiZmQpLnptYWdpY19kaXNrX2Jsb2NrX3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOwotI2VuZGlmCi0KLSAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmbmRlZiBNWV9maW5hbF9saW5rX2NhbGxiYWNrCi0KLS8qIENhbGxiYWNrIGZvciB0aGUgZmluYWxfbGluayByb3V0aW5lIHRvIHNldCB0aGUgc2VjdGlvbiBvZmZzZXRzLiAgKi8KLQotc3RhdGljIHZvaWQgTVlfZmluYWxfbGlua19jYWxsYmFjawotICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKikpOwotCi1zdGF0aWMgdm9pZAotTVlfZmluYWxfbGlua19jYWxsYmFjayAoYWJmZCwgcHRyZWxvZmYsIHBkcmVsb2ZmLCBwc3ltb2ZmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZpbGVfcHRyICpwdHJlbG9mZjsKLSAgICAgZmlsZV9wdHIgKnBkcmVsb2ZmOwotICAgICBmaWxlX3B0ciAqcHN5bW9mZjsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gICpwdHJlbG9mZiA9IG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyArIGV4ZWNwLT5hX2RhdGE7Ci0gICpwZHJlbG9mZiA9ICpwdHJlbG9mZiArIGV4ZWNwLT5hX3Ryc2l6ZTsKLSAgKnBzeW1vZmYgPSAqcGRyZWxvZmYgKyBleGVjcC0+YV9kcnNpemU7OwotfQotCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfZmluYWxfbGluawotCi0vKiBGaW5hbCBsaW5rIHJvdXRpbmUuICBXZSBuZWVkIHRvIHVzZSBhIGNhbGwgYmFjayB0byBnZXQgdGhlIGNvcnJlY3QKLSAgIG9mZnNldHMgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLU1ZX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIGZpbGVfcHRyIHBvczsKLSAgYmZkX3ZtYSB2bWEgPSAwOwotICBpbnQgcGFkOwotCi0gIC8qIFNldCB0aGUgZXhlY3V0YWJsZSBoZWFkZXIgc2l6ZSB0byAwLCBhcyB3ZSBkb24ndCB3YW50IG9uZSBmb3IgYW4KLSAgICAgb3V0cHV0LiAqLwotICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gMDsKLSAgcG9zID0gYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKLSAgLyogVGV4dC4gICovCi0gIHZtYSA9IGluZm8tPmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uLT52bWE7Ci0gIHBvcyArPSB2bWE7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IHBvczsKLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSB2bWE7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+dXNlcl9zZXRfdm1hID0gMTsKLSAgcG9zICs9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICB2bWEgKz0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgLyogRGF0YS4gICovCi0gIGlmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpCi0gICAgewotICAgICAgaWYgKGluZm8tPmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uLT5uZXh0LT52bWEgPiAwKQotCW9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gaW5mby0+Y3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24tPm5leHQtPnZtYTsKLSAgICAgIGVsc2UKLQlvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IEJGRF9BTElHTiAodm1hLCBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IEJGRF9BTElHTiAodm1hLCA0KTsKLSAgICB9Ci0gIGlmIChvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA8IHZtYSkKLSAgICB7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IEJGRF9BTElHTiAodm1hLCA0KTsKLSAgICB9Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dXNlcl9zZXRfdm1hID0gMTsKLSAgdm1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IHZtYSArIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemU7Ci0gIGV4ZWNwLT5hX3RleHQgPSB2bWEgLSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYTsKLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBleGVjcC0+YV90ZXh0OwotCi0gIC8qIFNpbmNlIEJTUyBmb2xsb3dzIGRhdGEgaW1tZWRpYXRlbHksIHNlZSBpZiBpdCBuZWVkcyBhbGlnbm1lbnQuICAqLwotICB2bWEgKz0gb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gIHBhZCA9IGFsaWduX3Bvd2VyICh2bWEsIG9ial9ic3NzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpIC0gdm1hOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSArPSBwYWQ7Ci0gIHBvcyArPSBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY3AtPmFfZGF0YSA9IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplOwotCi0gIC8qIEJTUy4gICovCi0gIG9ial9ic3NzZWMgKGFiZmQpLT52bWEgPSB2bWE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT51c2VyX3NldF92bWEgPSAxOwotCi0gIC8qIFdlIGFyZSBmdWxseSByZXNpemVkLCBzbyBkb24ndCByZWFkanVzdCBpbiBmaW5hbF9saW5rLiAqLwotICBhZGF0YSAoYWJmZCkubWFnaWMgPSB6X21hZ2ljOwotCi0gIHJldHVybiBOQU1FIChhb3V0LCBmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgTVlfZmluYWxfbGlua19jYWxsYmFjayk7Ci19Ci0KLSNlbmRpZgotCi1lbnVtIG1hY2hpbmVfdHlwZQotdGljMzBfYW91dF9tYWNoaW5lX3R5cGUgKGFyY2gsIG1hY2hpbmUsIHVua25vd24pCi0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci0gICAgIGJvb2xlYW4gKnVua25vd247Ci17Ci0gIGVudW0gbWFjaGluZV90eXBlIGFyY2hfZmxhZ3M7Ci0KLSAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKLSAgKnVua25vd24gPSB0cnVlOwotCi0gIHN3aXRjaCAoYXJjaCkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF90aWMzMDoKLSAgICAgICp1bmtub3duID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKLSAgICB9Ci0gIGlmIChhcmNoX2ZsYWdzICE9IE1fVU5LTk9XTikKLSAgICAqdW5rbm93biA9IGZhbHNlOwotICByZXR1cm4gYXJjaF9mbGFnczsKLX0KLQotYm9vbGVhbgotdGljMzBfYW91dF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGlmICghYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYXJjaCAhPSBiZmRfYXJjaF91bmtub3duKQotICAgIHsKLSAgICAgIGJvb2xlYW4gdW5rbm93bjsKLSAgICAgIHRpYzMwX2FvdXRfbWFjaGluZV90eXBlIChhcmNoLCBtYWNoaW5lLCAmdW5rbm93bik7Ci0gICAgICBpZiAodW5rbm93bikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSAgcmV0dXJuICgqYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5zZXRfc2l6ZXMpIChhYmZkKTsKLX0KLQotLyogV2UgYXNzdW1lIEJGRCBnZW5lcmljIGFyY2hpdmUgZmlsZXMuICAqLwotI2lmbmRlZglNWV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUJTVlfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCWJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgTVlfZ2V0X2VsdF9hdF9pbmRleAkJX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNlbmRpZgotI2lmbmRlZglNWV9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUJTVlfZ2VuZXJpY19zdGF0X2FyY2hfZWx0CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNlbmRpZgotI2lmbmRlZglNWV9zbHVycF9hcm1hcAotI2RlZmluZQlNWV9zbHVycF9hcm1hcAkJCWJmZF9zbHVycF9ic2RfYXJtYXAKLSNlbmRpZgotI2lmbmRlZglNWV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lCU1ZX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUJX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZW5kaWYKLSNpZm5kZWYgTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZW5kaWYKLSNpZm5kZWYJTVlfd3JpdGVfYXJtYXAKLSNkZWZpbmUJTVlfd3JpdGVfYXJtYXAJCWJzZF93cml0ZV9hcm1hcAotI2VuZGlmCi0jaWZuZGVmIE1ZX3JlYWRfYXJfaGRyCi0jZGVmaW5lIE1ZX3JlYWRfYXJfaGRyCQlfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKLSNlbmRpZgotI2lmbmRlZglNWV90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUJTVlfdHJ1bmNhdGVfYXJuYW1lCQliZmRfYnNkX3RydW5jYXRlX2FybmFtZQotI2VuZGlmCi0jaWZuZGVmIE1ZX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLSNkZWZpbmUgTVlfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLSNlbmRpZgotCi0vKiBObyBjb3JlIGZpbGUgZGVmaW5lZCBoZXJlIC0tIGNvbmZpZ3VyZSBpbiB0cmFkLWNvcmUuYyBzZXBhcmF0ZWx5LiAgKi8KLSNpZm5kZWYJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNlbmRpZgotI2lmbmRlZglNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AJXAotCQkJCV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9wCQlfYmZkX2R1bW15X3RhcmdldAotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQJCWJmZF92b2lkCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fZW5kCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZAkJYmZkX3ZvaWQKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJXAotCQkJKHZvaWQgKCopIFBBUkFNUyAoKGJmZCosIHN0cnVjdCBzZWMgKikpKSBiZmRfdm9pZAotI2VuZGlmCi0KLSNpZm5kZWYgTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIE5BTUUoYW91dCxjb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgTkFNRShhb3V0LGNvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUgTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIE5BTUUoYW91dCxjb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApCi0jZW5kaWYKLSNpZm5kZWYgTVlfc2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfc2V0X3NlY3Rpb25fY29udGVudHMgTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNlbmRpZgotI2lmbmRlZiBNWV9uZXdfc2VjdGlvbl9ob29rCi0jZGVmaW5lIE1ZX25ld19zZWN0aW9uX2hvb2sgTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIE5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zeW10YWIKLSNkZWZpbmUgTVlfZ2V0X3N5bXRhYiBOQU1FKGFvdXQsZ2V0X3N5bXRhYikKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2Fub25pY2FsaXplX3JlbG9jCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKQotI2VuZGlmCi0jaWZuZGVmIE1ZX21ha2VfZW1wdHlfc3ltYm9sCi0jZGVmaW5lIE1ZX21ha2VfZW1wdHlfc3ltYm9sIE5BTUUoYW91dCxtYWtlX2VtcHR5X3N5bWJvbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9wcmludF9zeW1ib2wKLSNkZWZpbmUgTVlfcHJpbnRfc3ltYm9sIE5BTUUoYW91dCxwcmludF9zeW1ib2wpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIE1ZX2dldF9zeW1ib2xfaW5mbyBOQU1FKGFvdXQsZ2V0X3N5bWJvbF9pbmZvKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9saW5lbm8KLSNkZWZpbmUgTVlfZ2V0X2xpbmVubyBOQU1FKGFvdXQsZ2V0X2xpbmVubykKLSNlbmRpZgotI2lmbmRlZiBNWV9zZXRfYXJjaF9tYWNoCi0jZGVmaW5lIE1ZX3NldF9hcmNoX21hY2ggdGljMzBfYW91dF9zZXRfYXJjaF9tYWNoCi0jZW5kaWYKLSNpZm5kZWYgTVlfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgTVlfZmluZF9uZWFyZXN0X2xpbmUgTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3NpemVvZl9oZWFkZXJzCi0jZGVmaW5lIE1ZX3NpemVvZl9oZWFkZXJzIE5BTUUoYW91dCxzaXplb2ZfaGVhZGVycykKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgTVlfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBNWV9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIHRpYzMwX2FvdXRfcmVsb2NfdHlwZV9sb29rdXAKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgTVlfYmZkX21ha2VfZGVidWdfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIE1ZX3JlYWRfbWluaXN5bWJvbHMgTkFNRShhb3V0LHJlYWRfbWluaXN5bWJvbHMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfbWluaXN5bWJvbF90b19zeW1ib2wKLSNkZWZpbmUgTVlfbWluaXN5bWJvbF90b19zeW1ib2wgTkFNRShhb3V0LG1pbmlzeW1ib2xfdG9fc3ltYm9sKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgTVlfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2VuZGlmCi0KLQotI2lmbmRlZiBNWV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2RlZmluZSBNWV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBNWV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgTVlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8gTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgTVlfY2xvc2VfYW5kX2NsZWFudXAgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgXAotICBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQKLSNlbmRpZgotI2lmbmRlZiBNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFwKLSAgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgXAotICBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIFwKLSAgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSNlbmRpZgotCi0vKiBBb3V0IHN5bWJvbHMgbm9ybWFsbHkgaGF2ZSBsZWFkaW5nIHVuZGVyc2NvcmVzICovCi0jaWZuZGVmIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIKLSNkZWZpbmUgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciAnXycKLSNlbmRpZgotCi0vKiBBb3V0IGFyY2hpdmVzIG5vcm1hbGx5IHVzZSBzcGFjZXMgZm9yIHBhZGRpbmcgKi8KLSNpZm5kZWYgQVJfUEFEX0NIQVIKLSNkZWZpbmUgQVJfUEFEX0NIQVIgJyAnCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9CRkRfVEFSR0VUCi1jb25zdCBiZmRfdGFyZ2V0IHRpYzMwX2FvdXRfdmVjID0KLXsKLSAgVEFSR0VUTkFNRSwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyIChiaWcpICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAoYmlnKSAqLwotICAoSEFTX1JFTE9DIHwJCQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKLSAgQVJfUEFEX0NIQVIsCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKLSAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoTVkpLAotCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YSwKLX07Ci0jZW5kaWYgLyogTVlfQkZEX1RBUkdFVCAqLwpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQwLmMgYi9iZmQvYW91dDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjN2FlMC4uMDAwMDAwMAotLS0gYS9iZmQvYW91dDAuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBTdW5PUyBzdHlsZSBhLm91dCB3aXRoIGZsYWdzIHNldCB0byAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtemVyby1iaWciCi0jZGVmaW5lIE1ZKE9QKSBDQVQoYW91dDBfYmlnXyxPUCkKLQotI2luY2x1ZGUgImJmZC5oIgotCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDAKLQotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgXAotICAoKG10eXBlKSA9PSBNX1VOS05PV04gfHwgKG10eXBlKSA9PSBNXzY4MDEwIHx8IChtdHlwZSkgPT0gTV82ODAyMCkKLQotLyogSW5jbHVkZSB0aGUgdXN1YWwgYS5vdXQgc3VwcG9ydC4gICovCi0jaW5jbHVkZSAiYW91dGYxLmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dDMyLmMgYi9iZmQvYW91dDMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzQwYjQuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciAzMi1iaXQgYS5vdXQgZmlsZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgotCi0jaW5jbHVkZSAiYW91dHguaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0NjQuYyBiL2JmZC9hb3V0NjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQwMzZjOC4uMDAwMDAwMAotLS0gYS9iZmQvYW91dDY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIDY0LWJpdCBhLm91dCBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUgNjQKLQotLyogYW91dHguaCByZXF1aXJlcyBkZWZpbml0aW9ucyBmb3IgQk1BR0lDIGFuZCBRTUFHSUMuICAqLwotI2lmbmRlZiBCTUFHSUMKLSNkZWZpbmUgQk1BR0lDIDAKLSNlbmRpZgotI2lmbmRlZiBRTUFHSUMKLSNkZWZpbmUgUU1BR0lDIDAKLSNlbmRpZgotCi0jaW5jbHVkZSAiYW91dHguaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0ZjEuaCBiL2JmZC9hb3V0ZjEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmOTViNS4uMDAwMDAwMAotLS0gYS9iZmQvYW91dGYxLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NTkgKzAsMCBAQAotLyogQS5vdXQgImZvcm1hdCAxIiBmaWxlIGhhbmRsaW5nIGNvZGUgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImFvdXQvc3VuNC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIJCS8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLQotLyogVGhpcyBpcyBuZWVkZWQgdG8gcmVqZWN0IGEgTmV3c09TIGZpbGUsIGUuZy4gaW4KLSAgIGdkYi90ZXN0c3VpdGUvZ2RiLnQxMC9jcm9zc2xvYWQuZXhwLiA8a2luZ2RvbkBjeWdudXMuY29tPgotICAgSSBuZWVkZWQgdG8gYWRkIE1fVU5LTk9XTiB0byByZWNvZ25pemUgYSA2ODAwMCBvYmplY3QsIHNvIHRoaXMgd2lsbAotICAgcHJvYmFibHkgbm8gbG9uZ2VyIHJlamVjdCBhIE5ld3NPUyBvYmplY3QuICA8aWFuQGN5Z251cy5jb20+LiAqLwotI2lmbmRlZiBNQUNIVFlQRV9PSwotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgXAotICAoKChtdHlwZSkgPT0gTV9TUEFSQyAmJiBiZmRfbG9va3VwX2FyY2ggKGJmZF9hcmNoX3NwYXJjLCAwKSAhPSBOVUxMKSBcCi0gICB8fCAoKChtdHlwZSkgPT0gTV9VTktOT1dOIHx8IChtdHlwZSkgPT0gTV82ODAxMCB8fCAobXR5cGUpID09IE1fNjgwMjApIFwKLSAgICAgICAmJiBiZmRfbG9va3VwX2FyY2ggKGJmZF9hcmNoX202OGssIDApICE9IE5VTEwpKQotI2VuZGlmCi0KLS8qCi1UaGUgZmlsZSBAY29kZXthb3V0ZjEuaH0gY29udGFpbnMgdGhlIGNvZGUgZm9yIEJGRCdzCi1hLm91dCBiYWNrIGVuZC4gQ29udHJvbCBvdmVyIHRoZSBnZW5lcmF0ZWQgYmFjayBlbmQgaXMgZ2l2ZW4gYnkgdGhlc2UKLXR3byBwcmVwcm9jZXNzb3IgbmFtZXM6Ci1AdGFibGUgQGNvZGUKLUBpdGVtIEFSQ0hfU0laRQotVGhpcyB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIDMyIG9yIDY0LCBkZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSBvZiBhbgotaW50IGluIHRoZSB0YXJnZXQgZm9ybWF0LiBJdCBjaGFuZ2VzIHRoZSBzaXplcyBvZiB0aGUgc3RydWN0cyB3aGljaAotcGVyZm9ybSB0aGUgbWVtb3J5L2Rpc2sgbWFwcGluZyBvZiBzdHJ1Y3R1cmVzLgotCi1UaGUgNjQgYml0IGJhY2tlbmQgbWF5IG9ubHkgYmUgdXNlZCBpZiB0aGUgaG9zdCBjb21waWxlciBzdXBwb3J0cyA2NAotaW50cyAoZWcgbG9uZyBsb25nIHdpdGggZ2NjKSwgYnkgZGVmaW5pbmcgdGhlIG5hbWUgQGNvZGV7QkZEX0hPU1RfNjRfQklUfSBpbiBAY29kZXtiZmQuaH0uCi1XaXRoIHRoaXMgbmFtZSBkZWZpbmVkLCBAZW1waHthbGx9IGJmZCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgd2l0aCA2NGJpdAotYXJpdGhtZXRpYywgbm90IGp1c3QgdGhvc2UgdG8gYSA2NGJpdCB0YXJnZXQuCi0KLUBpdGVtIFRBUkdFVE5BTUUKLVRoZSBuYW1lIHB1dCBpbnRvIHRoZSB0YXJnZXQgdmVjdG9yLgotQGl0ZW0KLUBlbmQgdGFibGUKLQotKi8KLQotLypTVVBQUkVTUzU1OCovCi0vKlNVUFBSRVNTNTI5Ki8KLQotI2lmIEFSQ0hfU0laRSA9PSA2NAotI2RlZmluZSBzdW5vc19zZXRfYXJjaF9tYWNoIHN1bm9zXzY0X3NldF9hcmNoX21hY2gKLSNkZWZpbmUgc3Vub3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIGFvdXRfNjRfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cwotI2Vsc2UKLSNkZWZpbmUgc3Vub3Nfc2V0X2FyY2hfbWFjaCBzdW5vc18zMl9zZXRfYXJjaF9tYWNoCi0jZGVmaW5lIHN1bm9zX3dyaXRlX29iamVjdF9jb250ZW50cyBhb3V0XzMyX3N1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiBzdW5vc19tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQgc3Vub3Nfc2V0X2FyY2hfbWFjaCBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBjaG9vc2VfcmVsb2Nfc2l6ZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqc3Vub3M0X2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqc3Vub3M0X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgc3Vub3M0X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3M0X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zNF9zZXRfc2l6ZXMgUEFSQU1TICgoYmZkICopKTsKLQotLyogTWVyZ2UgYmFja2VuZCBkYXRhIGludG8gdGhlIG91dHB1dCBmaWxlLgotICAgVGhpcyBpcyBuZWNlc3Nhcnkgb24gc3BhcmNsZXQtYW91dCB3aGVyZSB3ZSB3YW50IHRoZSByZXN1bHRhbnQgbWFjaGluZQotICAgbnVtYmVyIHRvIGJlIE1fU1BBUkNMRVQgaWYgYW55IGlucHV0IGZpbGUgaXMgTV9TUEFSQ0xFVC4gICovCi0KLSNkZWZpbmUgTVlfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgc3Vub3NfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3NfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkLCAqb2JmZDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2FyY2hfc3BhcmMpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfbWFjaCAob2JmZCkgPCBiZmRfZ2V0X21hY2ggKGliZmQpKQotCWJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfYXJjaF9zcGFyYywgYmZkX2dldF9tYWNoIChpYmZkKSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGVpdGhlciBzdW5vc18zMl9zZXRfYXJjaF9tYWNoIG9yIHN1bm9zXzY0X3NldF9hcmNoX21hY2gsCi0gICBkZXBlbmRpbmcgdXBvbiBBUkNIX1NJWkUuICAqLwotCi1zdGF0aWMgdm9pZAotc3Vub3Nfc2V0X2FyY2hfbWFjaCAoYWJmZCwgbWFjaHR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG1hY2h0eXBlOwotewotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICBsb25nIG1hY2hpbmU7Ci0gIHN3aXRjaCAobWFjaHR5cGUpCi0gICAgewotCi0gICAgY2FzZSBNX1VOS05PV046Ci0gICAgICAvKiBTb21lIFN1bjNzIG1ha2UgbWFnaWMgbnVtYmVycyB3aXRob3V0IGNwdSB0eXBlcyBpbiB0aGVtLCBzbwotCSB3ZSdsbCBkZWZhdWx0IHRvIHRoZSA2ODAwMC4gKi8KLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX202ODAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNXzY4MDEwOgotICAgIGNhc2UgTV9IUDIwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX202ODAxMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNXzY4MDIwOgotICAgIGNhc2UgTV9IUDMwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX202ODAyMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NQQVJDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3NwYXJjOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TUEFSQ0xFVDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zcGFyYzsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9zcGFyY19zcGFyY2xldDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NQQVJDTElURV9MRToKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zcGFyYzsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV8zODY6Ci0gICAgY2FzZSBNXzM4Nl9EWU5JWDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9pMzg2OwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV8yOUs6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfYTI5azsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fSFBVWDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfb2JzY3VyZTsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci19Ci0KLSNkZWZpbmUgU0VUX0FSQ0hfTUFDSChBQkZELCBFWEVDKSBcCi0gIE5BTUUoc3Vub3Msc2V0X2FyY2hfbWFjaCkoQUJGRCwgTl9NQUNIVFlQRSAoRVhFQykpOyBcCi0gIGNob29zZV9yZWxvY19zaXplKEFCRkQpOwotCi0vKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5LCBiYXNlZCBvbiB0aGUgYXJjaGl0ZWN0dXJlICovCi1zdGF0aWMgdm9pZAotY2hvb3NlX3JlbG9jX3NpemUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX0VYVF9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZSBpbiBTdW5PUyBmb3JtYXQuICBTZWN0aW9uIGNvbnRlbnRzIGhhdmUKLSAgIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlIGZpbGUgaGVhZGVyLCBzeW1ib2xzLCBhbmQKLSAgIHJlbG9jYXRpb24uICBUaGUgcmVhbCBuYW1lIG9mIHRoaXMgZnVuY3Rpb24gaXMgZWl0aGVyCi0gICBhb3V0XzY0X3N1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMgb3IKLSAgIGFvdXRfMzJfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cywgZGVwZW5kaW5nIHVwb24gQVJDSF9TSVpFLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgLyogTWFnaWMgbnVtYmVyLCBtYWVzdHJvLCBwbGVhc2UhICAqLwotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JY2FzZSBiZmRfbWFjaF9tNjgwMDA6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1VOS05PV04pOwotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9tNjgwMTA6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzY4MDEwKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfbWFjaF9tNjgwMjA6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzY4MDIwKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0JewotCWNhc2UgYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQ6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1NQQVJDTEVUKTsKLQkgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlOgotCSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9TUEFSQ0xJVEVfTEUpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fU1BBUkMpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV8zODYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV8yOUspOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fVU5LTk9XTik7Ci0gICAgfQotCi0gIGNob29zZV9yZWxvY19zaXplIChhYmZkKTsKLQotICBOX1NFVF9GTEFHUyAoKmV4ZWNwLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKLQotICBOX1NFVF9EWU5BTUlDICgqZXhlY3AsIGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBEWU5BTUlDKTsKLQotICBXUklURV9IRUFERVJTIChhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBjb3JlIGZpbGVzICovCi0KLSNkZWZpbmUgQ09SRV9NQUdJQyAweDA4MDQ1NgotI2RlZmluZSBDT1JFX05BTUVMRU4gMTYKLQotLyogVGhlIGNvcmUgc3RydWN0dXJlIGlzIHRha2VuIGZyb20gdGhlIFN1biBkb2N1bWVudGF0aW9uLgotICBVbmZvcnR1bmF0ZWx5LCB0aGV5IGRvbid0IGRvY3VtZW50IHRoZSBGUEEgc3RydWN0dXJlLCBvciBhdCBsZWFzdCBJCi0gIGNhbid0IGZpbmQgaXQgZWFzaWx5LiAgRm9ydHVuYXRlbHkgdGhlIGNvcmUgaGVhZGVyIGNvbnRhaW5zIGl0cyBvd24KLSAgbGVuZ3RoLiAgU28gdGhpcyBzaG91bGRuJ3QgY2F1c2UgcHJvYmxlbXMsIGV4Y2VwdCBmb3IgY191Y29kZSwgd2hpY2gKLSAgc28gZmFyIHdlIGRvbid0IHVzZSBidXQgaXMgZWFzeSB0byBmaW5kIHdpdGggYSBsaXR0bGUgYXJpdGhtZXRpYy4gKi8KLQotLyogQnV0IHRoZSByZWcgc3RydWN0dXJlIGNhbiBiZSBnb3R0ZW4gZnJvbSB0aGUgU1BBUkMgcHJvY2Vzc29yIGhhbmRib29rLgotICBUaGlzIHJlYWxseSBzaG91bGQgYmUgaW4gYSBHTlUgaW5jbHVkZSBmaWxlIHRob3VnaCBzbyB0aGF0IGdkYiBjYW4gdXNlCi0gIHRoZSBzYW1lIGluZm8uICovCi1zdHJ1Y3QgcmVncwotewotICBpbnQgcl9wc3I7Ci0gIGludCByX3BjOwotICBpbnQgcl9ucGM7Ci0gIGludCByX3k7Ci0gIGludCByX2cxOwotICBpbnQgcl9nMjsKLSAgaW50IHJfZzM7Ci0gIGludCByX2c0OwotICBpbnQgcl9nNTsKLSAgaW50IHJfZzY7Ci0gIGludCByX2c3OwotICBpbnQgcl9vMDsKLSAgaW50IHJfbzE7Ci0gIGludCByX28yOwotICBpbnQgcl9vMzsKLSAgaW50IHJfbzQ7Ci0gIGludCByX281OwotICBpbnQgcl9vNjsKLSAgaW50IHJfbzc7Ci19OwotCi0vKiBUYWtlbiBmcm9tIFN1biBkb2N1bWVudGF0aW9uOiAqLwotCi0vKiBGSVhNRTogIEl0J3Mgd29yc2UgdGhhbiB3ZSBleHBlY3QuICBUaGlzIHN0cnVjdCBjb250YWlucyBUV08gc3Vic3RydWN0cwotICBuZWl0aGVyIG9mIHdob3NlIHNpemUgd2Uga25vdywgV0lUSCBTVFVGRiBJTiBCRVRXRUVOIFRIRU0hICBXZSBjYW4ndAotICBldmVuIHBvcnRhYmx5IGFjY2VzcyB0aGUgc3R1ZmYgaW4gYmV0d2VlbiEgICovCi0KLXN0cnVjdCBleHRlcm5hbF9zcGFyY19jb3JlCi0gIHsKLSAgICBpbnQgY19tYWdpYzsJCS8qIENvcmVmaWxlIG1hZ2ljIG51bWJlciAqLwotICAgIGludCBjX2xlbjsJCQkvKiBTaXplb2YgKHN0cnVjdCBjb3JlKSAqLwotI2RlZmluZQlTUEFSQ19DT1JFX0xFTgk0MzIKLSAgICBpbnQgY19yZWdzWzE5XTsJCS8qIEdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgLS0gTUFDSERFUCBTSVpFICovCi0gICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgY19hb3V0aGRyOwkvKiBBLm91dCBoZWFkZXIgKi8KLSAgICBpbnQgY19zaWdubzsJCS8qIEtpbGxpbmcgc2lnbmFsLCBpZiBhbnkgKi8KLSAgICBpbnQgY190c2l6ZTsJCS8qIFRleHQgc2l6ZSAoYnl0ZXMpICovCi0gICAgaW50IGNfZHNpemU7CQkvKiBEYXRhIHNpemUgKGJ5dGVzKSAqLwotICAgIGludCBjX3NzaXplOwkJLyogU3RhY2sgc2l6ZSAoYnl0ZXMpICovCi0gICAgY2hhciBjX2NtZG5hbWVbQ09SRV9OQU1FTEVOICsgMV07CS8qIENvbW1hbmQgbmFtZSAqLwotICAgIGRvdWJsZSBmcF9zdHVmZlsxXTsJCS8qIGV4dGVybmFsIEZQVSBzdGF0ZSAoc2l6ZSB1bmtub3duIGJ5IHVzKSAqLwotICAgIC8qIFRoZSB0eXBlICJkb3VibGUiIGlzIGNyaXRpY2FsIGhlcmUsIGZvciBhbGlnbm1lbnQuCi0gICAgU3VuT1MgZGVjbGFyZXMgYSBzdHJ1Y3QgaGVyZSwgYnV0IHRoZSBzdHJ1Y3QncyBhbGlnbm1lbnQKLSAgICAgIGlzIGRvdWJsZSBzaW5jZSBpdCBjb250YWlucyBkb3VibGVzLiAgKi8KLSAgICBpbnQgY191Y29kZTsJCS8qIEV4Y2VwdGlvbiBuby4gZnJvbSB1X2NvZGUgKi8KLSAgICAvKiAodGhpcyBtZW1iZXIgaXMgbm90IGFjY2Vzc2libGUgYnkgbmFtZSBzaW5jZSB3ZSBkb24ndAotICAgIHBvcnRhYmx5IGtub3cgdGhlIHNpemUgb2YgZnBfc3R1ZmYuKSAqLwotICB9OwotCi0vKiBDb3JlIGZpbGVzIGdlbmVyYXRlZCBieSB0aGUgQkNQICh0aGUgcGFydCBvZiBTb2xhcmlzIHdoaWNoIGFsbG93cwotICAgaXQgdG8gcnVuIFN1bk9TNCBhLm91dCBmaWxlcykuICAqLwotc3RydWN0IGV4dGVybmFsX3NvbGFyaXNfYmNwX2NvcmUKLSAgewotICAgIGludCBjX21hZ2ljOwkJLyogQ29yZWZpbGUgbWFnaWMgbnVtYmVyICovCi0gICAgaW50IGNfbGVuOwkJCS8qIFNpemVvZiAoc3RydWN0IGNvcmUpICovCi0jZGVmaW5lCVNPTEFSSVNfQkNQX0NPUkVfTEVOCTQ1NgotICAgIGludCBjX3JlZ3NbMTldOwkJLyogR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAtLSBNQUNIREVQIFNJWkUgKi8KLSAgICBpbnQgY19leGRhdGFfdnA7CQkvKiBleGRhdGEgc3RydWN0dXJlICovCi0gICAgaW50IGNfZXhkYXRhX3RzaXplOwotICAgIGludCBjX2V4ZGF0YV9kc2l6ZTsKLSAgICBpbnQgY19leGRhdGFfYnNpemU7Ci0gICAgaW50IGNfZXhkYXRhX2xzaXplOwotICAgIGludCBjX2V4ZGF0YV9uc2hsaWJzOwotICAgIHNob3J0IGNfZXhkYXRhX21hY2g7Ci0gICAgc2hvcnQgY19leGRhdGFfbWFnOwotICAgIGludCBjX2V4ZGF0YV90b2Zmc2V0OwotICAgIGludCBjX2V4ZGF0YV9kb2Zmc2V0OwotICAgIGludCBjX2V4ZGF0YV9sb2Zmc2V0OwotICAgIGludCBjX2V4ZGF0YV90eHRvcmc7Ci0gICAgaW50IGNfZXhkYXRhX2RhdG9yZzsKLSAgICBpbnQgY19leGRhdGFfZW50bG9jOwotICAgIGludCBjX3NpZ25vOwkJLyogS2lsbGluZyBzaWduYWwsIGlmIGFueSAqLwotICAgIGludCBjX3RzaXplOwkJLyogVGV4dCBzaXplIChieXRlcykgKi8KLSAgICBpbnQgY19kc2l6ZTsJCS8qIERhdGEgc2l6ZSAoYnl0ZXMpICovCi0gICAgaW50IGNfc3NpemU7CQkvKiBTdGFjayBzaXplIChieXRlcykgKi8KLSAgICBjaGFyIGNfY21kbmFtZVtDT1JFX05BTUVMRU4gKyAxXTsJLyogQ29tbWFuZCBuYW1lICovCi0gICAgZG91YmxlIGZwX3N0dWZmWzFdOwkJLyogZXh0ZXJuYWwgRlBVIHN0YXRlIChzaXplIHVua25vd24gYnkgdXMpICovCi0gICAgLyogVGhlIHR5cGUgImRvdWJsZSIgaXMgY3JpdGljYWwgaGVyZSwgZm9yIGFsaWdubWVudC4KLSAgICBTdW5PUyBkZWNsYXJlcyBhIHN0cnVjdCBoZXJlLCBidXQgdGhlIHN0cnVjdCdzIGFsaWdubWVudAotICAgICAgaXMgZG91YmxlIHNpbmNlIGl0IGNvbnRhaW5zIGRvdWJsZXMuICAqLwotICAgIGludCBjX3Vjb2RlOwkJLyogRXhjZXB0aW9uIG5vLiBmcm9tIHVfY29kZSAqLwotICAgIC8qICh0aGlzIG1lbWJlciBpcyBub3QgYWNjZXNzaWJsZSBieSBuYW1lIHNpbmNlIHdlIGRvbid0Ci0gICAgcG9ydGFibHkga25vdyB0aGUgc2l6ZSBvZiBmcF9zdHVmZi4pICovCi0gIH07Ci0KLXN0cnVjdCBleHRlcm5hbF9zdW4zX2NvcmUKLSAgewotICAgIGludCBjX21hZ2ljOwkJLyogQ29yZWZpbGUgbWFnaWMgbnVtYmVyICovCi0gICAgaW50IGNfbGVuOwkJCS8qIFNpemVvZiAoc3RydWN0IGNvcmUpICovCi0jZGVmaW5lCVNVTjNfQ09SRV9MRU4JODI2CS8qIEFzIG9mIFN1bk9TIDQuMS4xICovCi0gICAgaW50IGNfcmVnc1sxOF07CQkvKiBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIC0tIE1BQ0hERVAgU0laRSAqLwotICAgIHN0cnVjdCBleHRlcm5hbF9leGVjIGNfYW91dGhkcjsJLyogQS5vdXQgaGVhZGVyICovCi0gICAgaW50IGNfc2lnbm87CQkvKiBLaWxsaW5nIHNpZ25hbCwgaWYgYW55ICovCi0gICAgaW50IGNfdHNpemU7CQkvKiBUZXh0IHNpemUgKGJ5dGVzKSAqLwotICAgIGludCBjX2RzaXplOwkJLyogRGF0YSBzaXplIChieXRlcykgKi8KLSAgICBpbnQgY19zc2l6ZTsJCS8qIFN0YWNrIHNpemUgKGJ5dGVzKSAqLwotICAgIGNoYXIgY19jbWRuYW1lW0NPUkVfTkFNRUxFTiArIDFdOwkvKiBDb21tYW5kIG5hbWUgKi8KLSAgICBkb3VibGUgZnBfc3R1ZmZbMV07CQkvKiBleHRlcm5hbCBGUFUgc3RhdGUgKHNpemUgdW5rbm93biBieSB1cykgKi8KLSAgICAvKiBUaGUgdHlwZSAiZG91YmxlIiBpcyBjcml0aWNhbCBoZXJlLCBmb3IgYWxpZ25tZW50LgotICAgIFN1bk9TIGRlY2xhcmVzIGEgc3RydWN0IGhlcmUsIGJ1dCB0aGUgc3RydWN0J3MgYWxpZ25tZW50Ci0gICAgICBpcyBkb3VibGUgc2luY2UgaXQgY29udGFpbnMgZG91Ymxlcy4gICovCi0gICAgaW50IGNfdWNvZGU7CQkvKiBFeGNlcHRpb24gbm8uIGZyb20gdV9jb2RlICovCi0gICAgLyogKHRoaXMgbWVtYmVyIGlzIG5vdCBhY2Nlc3NpYmxlIGJ5IG5hbWUgc2luY2Ugd2UgZG9uJ3QKLSAgICBwb3J0YWJseSBrbm93IHRoZSBzaXplIG9mIGZwX3N0dWZmLikgKi8KLSAgfTsKLQotc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUKLSAgewotICAgIGludCBjX21hZ2ljOwkJLyogQ29yZWZpbGUgbWFnaWMgbnVtYmVyICovCi0gICAgaW50IGNfbGVuOwkJCS8qIFNpemVvZiAoc3RydWN0IGNvcmUpICovCi0gICAgbG9uZyBjX3JlZ3NfcG9zOwkJLyogZmlsZSBvZmZzZXQgb2YgR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAqLwotICAgIGludCBjX3JlZ3Nfc2l6ZTsJCS8qIHNpemUgb2YgR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAqLwotICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjIGNfYW91dGhkcjsJLyogQS5vdXQgaGVhZGVyICovCi0gICAgaW50IGNfc2lnbm87CQkvKiBLaWxsaW5nIHNpZ25hbCwgaWYgYW55ICovCi0gICAgaW50IGNfdHNpemU7CQkvKiBUZXh0IHNpemUgKGJ5dGVzKSAqLwotICAgIGludCBjX2RzaXplOwkJLyogRGF0YSBzaXplIChieXRlcykgKi8KLSAgICBiZmRfdm1hIGNfZGF0YV9hZGRyOwkvKiBEYXRhIHN0YXJ0IChhZGRyZXNzKSAqLwotICAgIGludCBjX3NzaXplOwkJLyogU3RhY2sgc2l6ZSAoYnl0ZXMpICovCi0gICAgYmZkX3ZtYSBjX3N0YWNrdG9wOwkJLyogU3RhY2sgdG9wIChhZGRyZXNzKSAqLwotICAgIGNoYXIgY19jbWRuYW1lW0NPUkVfTkFNRUxFTiArIDFdOwkvKiBDb21tYW5kIG5hbWUgKi8KLSAgICBsb25nIGZwX3N0dWZmX3BvczsJCS8qIGZpbGUgb2Zmc2V0IG9mIGV4dGVybmFsIEZQVSBzdGF0ZSAocmVncykgKi8KLSAgICBpbnQgZnBfc3R1ZmZfc2l6ZTsJCS8qIFNpemUgb2YgaXQgKi8KLSAgICBpbnQgY191Y29kZTsJCS8qIEV4Y2VwdGlvbiBuby4gZnJvbSB1X2NvZGUgKi8KLSAgfTsKLQotc3RhdGljIHZvaWQgc3dhcGNvcmVfc3VuMwotICBQQVJBTVMgKChiZmQgKiwgY2hhciAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSAqKSk7Ci1zdGF0aWMgdm9pZCBzd2FwY29yZV9zcGFyYwotICBQQVJBTVMgKChiZmQgKiwgY2hhciAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSAqKSk7Ci1zdGF0aWMgdm9pZCBzd2FwY29yZV9zb2xhcmlzX2JjcAotICBQQVJBTVMgKChiZmQgKiwgY2hhciAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSAqKSk7Ci0KLS8qIGJ5dGUtc3dhcCBpbiB0aGUgU3VuLTMgY29yZSBzdHJ1Y3R1cmUgKi8KLXN0YXRpYyB2b2lkCi1zd2FwY29yZV9zdW4zIChhYmZkLCBleHQsIGludGNvcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqZXh0OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSAqaW50Y29yZTsKLXsKLSAgc3RydWN0IGV4dGVybmFsX3N1bjNfY29yZSAqZXh0Y29yZSA9IChzdHJ1Y3QgZXh0ZXJuYWxfc3VuM19jb3JlICopIGV4dDsKLQotICBpbnRjb3JlLT5jX21hZ2ljID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19tYWdpYyk7Ci0gIGludGNvcmUtPmNfbGVuID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19sZW4pOwotICBpbnRjb3JlLT5jX3JlZ3NfcG9zID0gKGxvbmcpICgoKHN0cnVjdCBleHRlcm5hbF9zdW4zX2NvcmUgKikgMCktPmNfcmVncyk7Ci0gIGludGNvcmUtPmNfcmVnc19zaXplID0gc2l6ZW9mIChleHRjb3JlLT5jX3JlZ3MpOwotI2lmIEFSQ0hfU0laRSA9PSA2NAotICBhb3V0XzY0X3N3YXBfZXhlY19oZWFkZXJfaW4KLSNlbHNlCi0gIGFvdXRfMzJfc3dhcF9leGVjX2hlYWRlcl9pbgotI2VuZGlmCi0gICAgKGFiZmQsICZleHRjb3JlLT5jX2FvdXRoZHIsICZpbnRjb3JlLT5jX2FvdXRoZHIpOwotICBpbnRjb3JlLT5jX3NpZ25vID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19zaWdubyk7Ci0gIGludGNvcmUtPmNfdHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3RzaXplKTsKLSAgaW50Y29yZS0+Y19kc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfZHNpemUpOwotICBpbnRjb3JlLT5jX2RhdGFfYWRkciA9IE5fREFUQUREUiAoaW50Y29yZS0+Y19hb3V0aGRyKTsKLSAgaW50Y29yZS0+Y19zc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfc3NpemUpOwotICBtZW1jcHkgKGludGNvcmUtPmNfY21kbmFtZSwgZXh0Y29yZS0+Y19jbWRuYW1lLCBzaXplb2YgKGludGNvcmUtPmNfY21kbmFtZSkpOwotICBpbnRjb3JlLT5mcF9zdHVmZl9wb3MgPSAobG9uZykgKCgoc3RydWN0IGV4dGVybmFsX3N1bjNfY29yZSAqKSAwKS0+ZnBfc3R1ZmYpOwotICAvKiBGUCBzdHVmZiB0YWtlcyB1cCB3aG9sZSByZXN0IG9mIHN0cnVjdCwgZXhjZXB0IGNfdWNvZGUuICovCi0gIGludGNvcmUtPmZwX3N0dWZmX3NpemUgPSBpbnRjb3JlLT5jX2xlbiAtIChzaXplb2YgZXh0Y29yZS0+Y191Y29kZSkgLQotICAgIChmaWxlX3B0cikgKCgoc3RydWN0IGV4dGVybmFsX3N1bjNfY29yZSAqKSAwKS0+ZnBfc3R1ZmYpOwotICAvKiBVY29kZSBpcyB0aGUgbGFzdCB0aGluZyBpbiB0aGUgc3RydWN0IC0tIGp1c3QgYmVmb3JlIHRoZSBlbmQgKi8KLSAgaW50Y29yZS0+Y191Y29kZSA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLAotICAgIGludGNvcmUtPmNfbGVuIC0gc2l6ZW9mIChleHRjb3JlLT5jX3Vjb2RlKSArICh1bnNpZ25lZCBjaGFyICopIGV4dGNvcmUpOwotICBpbnRjb3JlLT5jX3N0YWNrdG9wID0gMHgwRTAwMDAwMDsJLyogQnkgZXhwZXJpbWVudGF0aW9uICovCi19Ci0KLQotLyogYnl0ZS1zd2FwIGluIHRoZSBTcGFyYyBjb3JlIHN0cnVjdHVyZSAqLwotc3RhdGljIHZvaWQKLXN3YXBjb3JlX3NwYXJjIChhYmZkLCBleHQsIGludGNvcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqZXh0OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSAqaW50Y29yZTsKLXsKLSAgc3RydWN0IGV4dGVybmFsX3NwYXJjX2NvcmUgKmV4dGNvcmUgPSAoc3RydWN0IGV4dGVybmFsX3NwYXJjX2NvcmUgKikgZXh0OwotCi0gIGludGNvcmUtPmNfbWFnaWMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX21hZ2ljKTsKLSAgaW50Y29yZS0+Y19sZW4gPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX2xlbik7Ci0gIGludGNvcmUtPmNfcmVnc19wb3MgPSAobG9uZykgKCgoc3RydWN0IGV4dGVybmFsX3NwYXJjX2NvcmUgKikgMCktPmNfcmVncyk7Ci0gIGludGNvcmUtPmNfcmVnc19zaXplID0gc2l6ZW9mIChleHRjb3JlLT5jX3JlZ3MpOwotI2lmIEFSQ0hfU0laRSA9PSA2NAotICBhb3V0XzY0X3N3YXBfZXhlY19oZWFkZXJfaW4KLSNlbHNlCi0gIGFvdXRfMzJfc3dhcF9leGVjX2hlYWRlcl9pbgotI2VuZGlmCi0gICAgKGFiZmQsICZleHRjb3JlLT5jX2FvdXRoZHIsICZpbnRjb3JlLT5jX2FvdXRoZHIpOwotICBpbnRjb3JlLT5jX3NpZ25vID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19zaWdubyk7Ci0gIGludGNvcmUtPmNfdHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3RzaXplKTsKLSAgaW50Y29yZS0+Y19kc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfZHNpemUpOwotICBpbnRjb3JlLT5jX2RhdGFfYWRkciA9IE5fREFUQUREUiAoaW50Y29yZS0+Y19hb3V0aGRyKTsKLSAgaW50Y29yZS0+Y19zc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfc3NpemUpOwotICBtZW1jcHkgKGludGNvcmUtPmNfY21kbmFtZSwgZXh0Y29yZS0+Y19jbWRuYW1lLCBzaXplb2YgKGludGNvcmUtPmNfY21kbmFtZSkpOwotICBpbnRjb3JlLT5mcF9zdHVmZl9wb3MgPSAobG9uZykgKCgoc3RydWN0IGV4dGVybmFsX3NwYXJjX2NvcmUgKikgMCktPmZwX3N0dWZmKTsKLSAgLyogRlAgc3R1ZmYgdGFrZXMgdXAgd2hvbGUgcmVzdCBvZiBzdHJ1Y3QsIGV4Y2VwdCBjX3Vjb2RlLiAqLwotICBpbnRjb3JlLT5mcF9zdHVmZl9zaXplID0gaW50Y29yZS0+Y19sZW4gLSAoc2l6ZW9mIGV4dGNvcmUtPmNfdWNvZGUpIC0KLSAgICAoZmlsZV9wdHIpICgoKHN0cnVjdCBleHRlcm5hbF9zcGFyY19jb3JlICopIDApLT5mcF9zdHVmZik7Ci0gIC8qIFVjb2RlIGlzIHRoZSBsYXN0IHRoaW5nIGluIHRoZSBzdHJ1Y3QgLS0ganVzdCBiZWZvcmUgdGhlIGVuZCAqLwotICBpbnRjb3JlLT5jX3Vjb2RlID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsCi0gICAgaW50Y29yZS0+Y19sZW4gLSBzaXplb2YgKGV4dGNvcmUtPmNfdWNvZGUpICsgKHVuc2lnbmVkIGNoYXIgKikgZXh0Y29yZSk7Ci0KLSAgLyogU3VwcG9zZWRseSB0aGUgdXNlciBzdGFjayBncm93cyBkb3dud2FyZCBmcm9tIHRoZSBib3R0b20gb2Yga2VybmVsIG1lbW9yeS4KLSAgICAgUHJlc3VtaW5nIHRoYXQgdGhpcyByZW1haW5zIHRydWUsIHRoaXMgZGVmaW5pdGlvbiB3aWxsIHdvcmsuICAqLwotICAvKiBOb3cgc3VuIGhhcyBwcm92aWRlZCB1cyB3aXRoIGFub3RoZXIgY2hhbGxlbmdlLiAgVGhlIHZhbHVlIGlzIGRpZmZlcmVudAotICAgICBmb3Igc3BhcmMyIGFuZCBzcGFyYzEwIChib3RoIHJ1bm5pbmcgU3VuT1MgNC4xLjMpLiAgV2UgcGljayBvbmUgb3IKLSAgICAgdGhlIG90aGVyIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzdGFjayBwb2ludGVyLiAgVGhpcwotICAgICBsb3NlcyAoYSkgaWYgdGhlIHN0YWNrIHBvaW50ZXIgaGFzIGJlZW4gY2xvYmJlcmVkLCBvciAoYikgaWYgdGhlIHN0YWNrCi0gICAgIGlzIGxhcmdlciB0aGFuIDEyOCBtZWdhYnl0ZXMuCi0KLSAgICAgSXQncyB0aW1lcyBsaWtlIHRoZXNlIHlvdSdyZSBnbGFkIHRoZXkncmUgc3dpdGNoaW5nIHRvIEVMRi4KLQotICAgICBOb3RlIHRoYXQgdXNpbmcgaW5jbHVkZSBmaWxlcyBvciBubGlzdCBvbiAvdm11bml4IHdvdWxkIGJlIHdyb25nLAotICAgICBiZWNhdXNlIHdlIHdhbnQgdGhlIHZhbHVlIGZvciB0aGlzIGNvcmUgZmlsZSwgbm8gbWF0dGVyIHdoYXQga2luZCBvZgotICAgICBtYWNoaW5lIHdlIHdlcmUgY29tcGlsZWQgb24gb3IgYXJlIHJ1bm5pbmcgb24uICAqLwotI2RlZmluZSBTUEFSQ19VU1JTVEFDS19TUEFSQzIgKChiZmRfdm1hKTB4ZjgwMDAwMDApCi0jZGVmaW5lIFNQQVJDX1VTUlNUQUNLX1NQQVJDMTAgKChiZmRfdm1hKTB4ZjAwMDAwMDApCi0gIHsKLSAgICBiZmRfdm1hIHNwID0gYmZkX2hfZ2V0XzMyCi0gICAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICYoKHN0cnVjdCByZWdzICopICZleHRjb3JlLT5jX3JlZ3NbMF0pLT5yX282KTsKLSAgICBpZiAoc3AgPCBTUEFSQ19VU1JTVEFDS19TUEFSQzEwKQotICAgICAgaW50Y29yZS0+Y19zdGFja3RvcCA9IFNQQVJDX1VTUlNUQUNLX1NQQVJDMTA7Ci0gICAgZWxzZQotICAgICAgaW50Y29yZS0+Y19zdGFja3RvcCA9IFNQQVJDX1VTUlNUQUNLX1NQQVJDMjsKLSAgfQotfQotCi0vKiBieXRlLXN3YXAgaW4gdGhlIFNvbGFyaXMgQkNQIGNvcmUgc3RydWN0dXJlICovCi1zdGF0aWMgdm9pZAotc3dhcGNvcmVfc29sYXJpc19iY3AgKGFiZmQsIGV4dCwgaW50Y29yZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpleHQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlICppbnRjb3JlOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfc29sYXJpc19iY3BfY29yZSAqZXh0Y29yZSA9Ci0gICAgKHN0cnVjdCBleHRlcm5hbF9zb2xhcmlzX2JjcF9jb3JlICopIGV4dDsKLQotICBpbnRjb3JlLT5jX21hZ2ljID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19tYWdpYyk7Ci0gIGludGNvcmUtPmNfbGVuID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19sZW4pOwotICBpbnRjb3JlLT5jX3JlZ3NfcG9zID0gKGxvbmcpICgoKHN0cnVjdCBleHRlcm5hbF9zb2xhcmlzX2JjcF9jb3JlICopIDApLT5jX3JlZ3MpOwotICBpbnRjb3JlLT5jX3JlZ3Nfc2l6ZSA9IHNpemVvZiAoZXh0Y29yZS0+Y19yZWdzKTsKLQotICAvKiBUaGUgU29sYXJpcyBCQ1AgZXhkYXRhIHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFuIGFfc3ltcyBmaWVsZCwKLSAgICAgc28gd2UgYXJlIHVuYWJsZSB0byBzeW50aGVzaXplIGFuIGludGVybmFsIGV4ZWMgaGVhZGVyLgotICAgICBMdWNraWx5IHdlIGFyZSBhYmxlIHRvIGZpZ3VyZSBvdXQgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VjdGlvbiwKLSAgICAgd2hpY2ggaXMgdGhlIG9ubHkgdGhpbmcgbmVlZGVkIGZyb20gdGhlIGludGVybmFsIGV4ZWMgaGVhZGVyLAotICAgICBmcm9tIHRoZSBleGRhdGEgc3RydWN0dXJlLgotCi0gICAgIEFzIG9mIFNvbGFyaXMgMi4zLCBCQ1AgY29yZSBmaWxlcyBmb3Igc3RhdGljYWxseSBsaW5rZWQgZXhlY3V0YWJsZXMKLSAgICAgYXJlIGJ1Z2d5LiBUaGUgZXhkYXRhIHN0cnVjdHVyZSBpcyBub3QgcHJvcGVybHkgZmlsbGVkIGluLCBhbmQKLSAgICAgdGhlIGRhdGEgc2VjdGlvbiBpcyB3cml0dGVuIGZyb20gYWRkcmVzcyB6ZXJvIGluc3RlYWQgb2YgdGhlIGRhdGEKLSAgICAgc3RhcnQgYWRkcmVzcy4gICovCi0gIG1lbXNldCAoKFBUUikgJmludGNvcmUtPmNfYW91dGhkciwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYykpOwotICBpbnRjb3JlLT5jX2RhdGFfYWRkciA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19leGRhdGFfZGF0b3JnKTsKLSAgaW50Y29yZS0+Y19zaWdubyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfc2lnbm8pOwotICBpbnRjb3JlLT5jX3RzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y190c2l6ZSk7Ci0gIGludGNvcmUtPmNfZHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX2RzaXplKTsKLSAgaW50Y29yZS0+Y19zc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfc3NpemUpOwotICBtZW1jcHkgKGludGNvcmUtPmNfY21kbmFtZSwgZXh0Y29yZS0+Y19jbWRuYW1lLCBzaXplb2YgKGludGNvcmUtPmNfY21kbmFtZSkpOwotICBpbnRjb3JlLT5mcF9zdHVmZl9wb3MgPQotICAgIChsb25nKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc29sYXJpc19iY3BfY29yZSAqKSAwKS0+ZnBfc3R1ZmYpOwotICAvKiBGUCBzdHVmZiB0YWtlcyB1cCB3aG9sZSByZXN0IG9mIHN0cnVjdCwgZXhjZXB0IGNfdWNvZGUuICovCi0gIGludGNvcmUtPmZwX3N0dWZmX3NpemUgPSBpbnRjb3JlLT5jX2xlbiAtIChzaXplb2YgZXh0Y29yZS0+Y191Y29kZSkgLQotICAgIChmaWxlX3B0cikgKCgoc3RydWN0IGV4dGVybmFsX3NvbGFyaXNfYmNwX2NvcmUgKikgMCktPmZwX3N0dWZmKTsKLSAgLyogVWNvZGUgaXMgdGhlIGxhc3QgdGhpbmcgaW4gdGhlIHN0cnVjdCAtLSBqdXN0IGJlZm9yZSB0aGUgZW5kICovCi0gIGludGNvcmUtPmNfdWNvZGUgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwKLSAgICBpbnRjb3JlLT5jX2xlbiAtIHNpemVvZiAoZXh0Y29yZS0+Y191Y29kZSkgKyAodW5zaWduZWQgY2hhciAqKSBleHRjb3JlKTsKLQotICAvKiBTdXBwb3NlZGx5IHRoZSB1c2VyIHN0YWNrIGdyb3dzIGRvd253YXJkIGZyb20gdGhlIGJvdHRvbSBvZiBrZXJuZWwgbWVtb3J5LgotICAgICBQcmVzdW1pbmcgdGhhdCB0aGlzIHJlbWFpbnMgdHJ1ZSwgdGhpcyBkZWZpbml0aW9uIHdpbGwgd29yay4gICovCi0gIC8qIE5vdyBzdW4gaGFzIHByb3ZpZGVkIHVzIHdpdGggYW5vdGhlciBjaGFsbGVuZ2UuICBUaGUgdmFsdWUgaXMgZGlmZmVyZW50Ci0gICAgIGZvciBzcGFyYzIgYW5kIHNwYXJjMTAgKGJvdGggcnVubmluZyBTdW5PUyA0LjEuMykuICBXZSBwaWNrIG9uZSBvcgotICAgICB0aGUgb3RoZXIgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN0YWNrIHBvaW50ZXIuICBUaGlzCi0gICAgIGxvc2VzIChhKSBpZiB0aGUgc3RhY2sgcG9pbnRlciBoYXMgYmVlbiBjbG9iYmVyZWQsIG9yIChiKSBpZiB0aGUgc3RhY2sKLSAgICAgaXMgbGFyZ2VyIHRoYW4gMTI4IG1lZ2FieXRlcy4KLQotICAgICBJdCdzIHRpbWVzIGxpa2UgdGhlc2UgeW91J3JlIGdsYWQgdGhleSdyZSBzd2l0Y2hpbmcgdG8gRUxGLgotCi0gICAgIE5vdGUgdGhhdCB1c2luZyBpbmNsdWRlIGZpbGVzIG9yIG5saXN0IG9uIC92bXVuaXggd291bGQgYmUgd3JvbmcsCi0gICAgIGJlY2F1c2Ugd2Ugd2FudCB0aGUgdmFsdWUgZm9yIHRoaXMgY29yZSBmaWxlLCBubyBtYXR0ZXIgd2hhdCBraW5kIG9mCi0gICAgIG1hY2hpbmUgd2Ugd2VyZSBjb21waWxlZCBvbiBvciBhcmUgcnVubmluZyBvbi4gICovCi0jZGVmaW5lIFNQQVJDX1VTUlNUQUNLX1NQQVJDMiAoKGJmZF92bWEpMHhmODAwMDAwMCkKLSNkZWZpbmUgU1BBUkNfVVNSU1RBQ0tfU1BBUkMxMCAoKGJmZF92bWEpMHhmMDAwMDAwMCkKLSAgewotICAgIGJmZF92bWEgc3AgPSBiZmRfaF9nZXRfMzIKLSAgICAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJigoc3RydWN0IHJlZ3MgKikgJmV4dGNvcmUtPmNfcmVnc1swXSktPnJfbzYpOwotICAgIGlmIChzcCA8IFNQQVJDX1VTUlNUQUNLX1NQQVJDMTApCi0gICAgICBpbnRjb3JlLT5jX3N0YWNrdG9wID0gU1BBUkNfVVNSU1RBQ0tfU1BBUkMxMDsKLSAgICBlbHNlCi0gICAgICBpbnRjb3JlLT5jX3N0YWNrdG9wID0gU1BBUkNfVVNSU1RBQ0tfU1BBUkMyOwotICB9Ci19Ci0KLS8qIG5lZWQgdGhpcyBjYXN0IGJlY2F1c2UgcHRyIGlzIHJlYWxseSB2b2lkICogKi8KLSNkZWZpbmUgY29yZV9oZHIoYmZkKSAoKGJmZCktPnRkYXRhLnN1bl9jb3JlX2RhdGEpCi0jZGVmaW5lIGNvcmVfZGF0YXNlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5kYXRhX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfc3RhY2tzZWMoYmZkKSAoY29yZV9oZHIoYmZkKS0+c3RhY2tfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9yZWdzZWMoYmZkKSAoY29yZV9oZHIoYmZkKS0+cmVnX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfcmVnMnNlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5yZWcyX3NlY3Rpb24pCi0KLS8qIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIGJmZCdzIHRkYXRhICovCi1zdHJ1Y3Qgc3VuX2NvcmVfc3RydWN0Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlICpoZHI7CS8qIGNvcmUgZmlsZSBoZWFkZXIgKi8KLSAgYXNlY3Rpb24gKmRhdGFfc2VjdGlvbjsKLSAgYXNlY3Rpb24gKnN0YWNrX3NlY3Rpb247Ci0gIGFzZWN0aW9uICpyZWdfc2VjdGlvbjsKLSAgYXNlY3Rpb24gKnJlZzJfc2VjdGlvbjsKLX07Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXN1bm9zNF9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBjaGFyIGxvbmdidWZbNF07CS8qIFJhdyBieXRlcyBvZiB2YXJpb3VzIGhlYWRlciBmaWVsZHMgKi8KLSAgYmZkX3NpemVfdHlwZSBjb3JlX3NpemU7Ci0gIHVuc2lnbmVkIGxvbmcgY29yZV9tYWc7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlICpjb3JlOwotICBjaGFyICpleHRjb3JlOwotICBzdHJ1Y3QgbWVyZ2VtCi0gICAgewotICAgICAgc3RydWN0IHN1bl9jb3JlX3N0cnVjdCBzdW5jb3JlZGF0YTsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlIGludGVybmFsX3N1bm9zX2NvcmU7Ci0gICAgICBjaGFyIGV4dGVybmFsX2NvcmVbMV07Ci0gICAgfQotICAgKm1lcmdlbTsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIGxvbmdidWYsIDEsIHNpemVvZiAobG9uZ2J1ZiksIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKGxvbmdidWYpKQotICAgIHJldHVybiAwOwotICBjb3JlX21hZyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgbG9uZ2J1Zik7Ci0KLSAgaWYgKGNvcmVfbWFnICE9IENPUkVfTUFHSUMpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogU3VuT1MgY29yZSBoZWFkZXJzIGNhbiB2YXJ5IGluIGxlbmd0aDsgc2Vjb25kIHdvcmQgaXMgc2l6ZTsgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBsb25nYnVmLCAxLCBzaXplb2YgKGxvbmdidWYpLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChsb25nYnVmKSkKLSAgICByZXR1cm4gMDsKLSAgY29yZV9zaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBsb25nYnVmKTsKLSAgLyogU2FuaXR5IGNoZWNrICovCi0gIGlmIChjb3JlX3NpemUgPiAyMDAwMCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gMDsKLQotICBtZXJnZW0gPSAoc3RydWN0IG1lcmdlbSAqKSBiZmRfemFsbG9jIChhYmZkLCBjb3JlX3NpemUgKyBzaXplb2YgKHN0cnVjdCBtZXJnZW0pKTsKLSAgaWYgKG1lcmdlbSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIGV4dGNvcmUgPSBtZXJnZW0tPmV4dGVybmFsX2NvcmU7Ci0KLSAgaWYgKChiZmRfcmVhZCAoKFBUUikgZXh0Y29yZSwgMSwgY29yZV9zaXplLCBhYmZkKSkgIT0gY29yZV9zaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoY2hhciAqKSBtZXJnZW0pOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFZhbGlkYXRlIHRoYXQgaXQncyBhIGNvcmUgZmlsZSB3ZSBrbm93IGhvdyB0byBoYW5kbGUsIGR1ZSB0byBzdW4KLSAgICAgYm90Y2hpbmcgdGhlIHBvc2l0aW9uaW5nIG9mIHJlZ2lzdGVycyBhbmQgb3RoZXIgZmllbGRzIGluIGEgbWFjaGluZQotICAgICBkZXBlbmRlbnQgd2F5LiAgKi8KLSAgY29yZSA9ICZtZXJnZW0tPmludGVybmFsX3N1bm9zX2NvcmU7Ci0gIHN3aXRjaCAoY29yZV9zaXplKQotICAgIHsKLSAgICBjYXNlIFNQQVJDX0NPUkVfTEVOOgotICAgICAgc3dhcGNvcmVfc3BhcmMgKGFiZmQsIGV4dGNvcmUsIGNvcmUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVU4zX0NPUkVfTEVOOgotICAgICAgc3dhcGNvcmVfc3VuMyAoYWJmZCwgZXh0Y29yZSwgY29yZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNPTEFSSVNfQkNQX0NPUkVfTEVOOgotICAgICAgc3dhcGNvcmVfc29sYXJpc19iY3AgKGFiZmQsIGV4dGNvcmUsIGNvcmUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CS8qIEZJWE1FICovCi0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKGNoYXIgKikgbWVyZ2VtKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBhYmZkLT50ZGF0YS5zdW5fY29yZV9kYXRhID0gJm1lcmdlbS0+c3VuY29yZWRhdGE7Ci0gIGFiZmQtPnRkYXRhLnN1bl9jb3JlX2RhdGEtPmhkciA9IGNvcmU7Ci0KLSAgLyogY3JlYXRlIHRoZSBzZWN0aW9ucy4gIFRoaXMgaXMgcmF1bmNoeSwgYnV0IGJmZF9jbG9zZSB3YW50cyB0byByZWNsYWltCi0gICAgIHRoZW0gKi8KLSAgY29yZV9zdGFja3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9zdGFja3NlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgbG9zZXI6Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKGNoYXIgKikgbWVyZ2VtKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgY29yZV9kYXRhc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX2RhdGFzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgIGxvc2VyMToKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBjb3JlX3N0YWNrc2VjIChhYmZkKSk7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLSAgY29yZV9yZWdzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfcmVnc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICBsb3NlcjI6Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgY29yZV9kYXRhc2VjIChhYmZkKSk7Ci0gICAgICBnb3RvIGxvc2VyMTsKLSAgICB9Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9yZWcyc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBjb3JlX3JlZ3NlYyAoYWJmZCkpOwotICAgICAgZ290byBsb3NlcjI7Ci0gICAgfQotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5uYW1lID0gIi5zdGFjayI7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPm5hbWUgPSAiLmRhdGEiOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPm5hbWUgPSAiLnJlZyI7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPm5hbWUgPSAiLnJlZzIiOwotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGNvcmUtPmNfc3NpemU7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGNvcmUtPmNfZHNpemU7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+X3Jhd19zaXplID0gY29yZS0+Y19yZWdzX3NpemU7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGNvcmUtPmZwX3N0dWZmX3NpemU7Ci0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPnZtYSA9IChjb3JlLT5jX3N0YWNrdG9wIC0gY29yZS0+Y19zc2l6ZSk7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPnZtYSA9IGNvcmUtPmNfZGF0YV9hZGRyOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPnZtYSA9IDA7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPnZtYSA9IDA7Ci0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPmZpbGVwb3MgPSBjb3JlLT5jX2xlbiArIGNvcmUtPmNfZHNpemU7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBjb3JlLT5jX2xlbjsKLSAgLyogV2UnbGwgYWNjZXNzIHRoZSByZWdzIGFmcmVzaCBpbiB0aGUgY29yZSBmaWxlLCBsaWtlIGFueSBzZWN0aW9uOiAqLwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZpbGVwb3MgPSAoZmlsZV9wdHIpIGNvcmUtPmNfcmVnc19wb3M7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPmZpbGVwb3MgPSAoZmlsZV9wdHIpIGNvcmUtPmZwX3N0dWZmX3BvczsKLQotICAvKiBBbGlnbiB0byB3b3JkIGF0IGxlYXN0ICovCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgYWJmZC0+c2VjdGlvbnMgPSBjb3JlX3N0YWNrc2VjIChhYmZkKTsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPm5leHQgPSBjb3JlX2RhdGFzZWMgKGFiZmQpOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9yZWdzZWMgKGFiZmQpOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPm5leHQgPSBjb3JlX3JlZzJzZWMgKGFiZmQpOwotCi0gIGFiZmQtPnNlY3Rpb25fY291bnQgPSA0OwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgY2hhciAqCi1zdW5vczRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9oZHIgKGFiZmQpLT5oZHItPmNfY21kbmFtZTsKLX0KLQotc3RhdGljIGludAotc3Vub3M0X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9oZHIgKGFiZmQpLT5oZHItPmNfc2lnbm87Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zdW5vczRfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQ7Ci0gICAgIGJmZCAqZXhlY19iZmQ7Ci17Ci0gIGlmIChjb3JlX2JmZC0+eHZlYyAhPSBleGVjX2JmZC0+eHZlYykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTb2xhcmlzIGNvcmUgZmlsZXMgZG8gbm90IGluY2x1ZGUgYW4gYW91dGhkci4gKi8KLSAgaWYgKChjb3JlX2hkciAoY29yZV9iZmQpLT5oZHIpLT5jX2xlbiA9PSBTT0xBUklTX0JDUF9DT1JFX0xFTikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gKG1lbWNtcCAoKGNoYXIgKikgJigoY29yZV9oZHIgKGNvcmVfYmZkKS0+aGRyKS0+Y19hb3V0aGRyKSwKLQkJICAoY2hhciAqKSBleGVjX2hkciAoZXhlY19iZmQpLAotCQkgIHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpKSA9PSAwKSA/IHRydWUgOiBmYWxzZTsKLX0KLQotI2RlZmluZSBNWV9zZXRfc2l6ZXMgc3Vub3M0X3NldF9zaXplcwotc3RhdGljIGJvb2xlYW4KLXN1bm9zNF9zZXRfc2l6ZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gMHgyMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IDB4MjAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gMHgyMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IDB4MjAwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQotCi0vKiBXZSBkZWZhdWx0IHRvIHNldHRpbmcgdGhlIHRvb2x2ZXJzaW9uIGZpZWxkIHRvIDEsIGFzIGlzIHJlcXVpcmVkIGJ5Ci0gICBTdW5PUy4gICovCi0jaWZuZGVmIE1ZX2V4ZWNfaGRyX2ZsYWdzCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcwotI2RlZmluZSBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMKLSNkZWZpbmUgTVlfYWRkX2R5bmFtaWNfc3ltYm9scyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2xpbmtfZHluYW1pY19vYmplY3QKLSNkZWZpbmUgTVlfbGlua19keW5hbWljX29iamVjdCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgTVlfY2hlY2tfZHluYW1pY19yZWxvYyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfZmluaXNoX2R5bmFtaWNfbGluawotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIDAKLSNlbmRpZgotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhIHN1bm9zNF9hb3V0X2JhY2tlbmQgPQotewotICAwLAkJCQkvKiB6bWFnaWMgZmlsZXMgYXJlIG5vdCBjb250aWd1b3VzICovCi0gIDEsCQkJCS8qIHRleHQgaW5jbHVkZXMgaGVhZGVyICovCi0gIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcywKLSAgTVlfZXhlY19oZHJfZmxhZ3MsCi0gIDAsCQkJCS8qIGRlZmF1bHQgdGV4dCB2bWEgKi8KLSAgc3Vub3M0X3NldF9zaXplcywKLSAgMCwJCQkJLyogaGVhZGVyIGlzIGNvdW50ZWQgaW4gem1hZ2ljIHRleHQgKi8KLSAgTVlfYWRkX2R5bmFtaWNfc3ltYm9scywKLSAgTVlfYWRkX29uZV9zeW1ib2wsCi0gIE1ZX2xpbmtfZHluYW1pY19vYmplY3QsCi0gIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sLAotICBNWV9jaGVja19keW5hbWljX3JlbG9jLAotICBNWV9maW5pc2hfZHluYW1pY19saW5rCi19OwotDAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIAlzdW5vczRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwJc3Vub3M0X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3Agc3Vub3M0X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0CQliZmRfdm9pZAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19lbmQJCWJmZF92b2lkCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJXAotCQkJKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX3ZvaWQKLSNkZWZpbmUgTVlfY29yZV9maWxlX3AJCQlzdW5vczRfY29yZV9maWxlX3AKLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCU5BTUUoYW91dCxzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotI2RlZmluZSBNWV9iYWNrZW5kX2RhdGEJCQkmc3Vub3M0X2FvdXRfYmFja2VuZAotCi0jaWZuZGVmIFRBUkdFVF9JU19MSVRUTEVfRU5ESUFOX1AKLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2VuZGlmCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2FvdXR4LmggYi9iZmQvYW91dHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwNGVlYy4uMDAwMDAwMAotLS0gYS9iZmQvYW91dHguaAorKysgL2Rldi9udWxsCkBAIC0xLDU3MDYgKzAsMCBAQAotLyogQkZEIHNlbWktZ2VuZXJpYyBiYWNrLWVuZCBmb3IgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCWEub3V0IGJhY2tlbmRzCi0KLQotREVTQ1JJUFRJT04KLQotCUJGRCBzdXBwb3J0cyBhIG51bWJlciBvZiBkaWZmZXJlbnQgZmxhdm91cnMgb2YgYS5vdXQgZm9ybWF0LAotCXRob3VnaCB0aGUgbWFqb3IgZGlmZmVyZW5jZXMgYXJlIG9ubHkgdGhlIHNpemVzIG9mIHRoZQotCXN0cnVjdHVyZXMgb24gZGlzaywgYW5kIHRoZSBzaGFwZSBvZiB0aGUgcmVsb2NhdGlvbgotCWluZm9ybWF0aW9uLgotCi0JVGhlIHN1cHBvcnQgaXMgc3BsaXQgaW50byBhIGJhc2ljIHN1cHBvcnQgZmlsZSBAZmlsZXthb3V0eC5ofQotCWFuZCBvdGhlciBmaWxlcyB3aGljaCBkZXJpdmUgZnVuY3Rpb25zIGZyb20gdGhlIGJhc2UuIE9uZQotCWRlcml2YXRpb24gZmlsZSBpcyBAZmlsZXthb3V0ZjEuaH0gKGZvciBhLm91dCBmbGF2b3VyIDEpLCBhbmQKLQlhZGRzIHRvIHRoZSBiYXNpYyBhLm91dCBmdW5jdGlvbnMgc3VwcG9ydCBmb3Igc3VuMywgc3VuNCwgMzg2Ci0JYW5kIDI5ayBhLm91dCBmaWxlcywgdG8gY3JlYXRlIGEgdGFyZ2V0IGp1bXAgdmVjdG9yIGZvciBhCi0Jc3BlY2lmaWMgdGFyZ2V0LgotCi0JVGhpcyBpbmZvcm1hdGlvbiBpcyBmdXJ0aGVyIHNwbGl0IG91dCBpbnRvIG1vcmUgc3BlY2lmaWMgZmlsZXMKLQlmb3IgZWFjaCBtYWNoaW5lLCBpbmNsdWRpbmcgQGZpbGV7c3Vub3MuY30gZm9yIHN1bjMgYW5kIHN1bjQsCi0JQGZpbGV7bmV3c29zMy5jfSBmb3IgdGhlIFNvbnkgTkVXUywgYW5kIEBmaWxle2RlbW82NC5jfSBmb3IgYQotCWRlbW9uc3RyYXRpb24gb2YgYSA2NCBiaXQgYS5vdXQgZm9ybWF0LgotCi0JVGhlIGJhc2UgZmlsZSBAZmlsZXthb3V0eC5ofSBkZWZpbmVzIGdlbmVyYWwgbWVjaGFuaXNtcyBmb3IKLQlyZWFkaW5nIGFuZCB3cml0aW5nIHJlY29yZHMgdG8gYW5kIGZyb20gZGlzayBhbmQgdmFyaW91cwotCW90aGVyIG1ldGhvZHMgd2hpY2ggQkZEIHJlcXVpcmVzLiBJdCBpcyBpbmNsdWRlZCBieQotCUBmaWxle2FvdXQzMi5jfSBhbmQgQGZpbGV7YW91dDY0LmN9IHRvIGZvcm0gdGhlIG5hbWVzCi0JPDxhb3V0XzMyX3N3YXBfZXhlY19oZWFkZXJfaW4+PiwgPDxhb3V0XzY0X3N3YXBfZXhlY19oZWFkZXJfaW4+PiwgZXRjLgotCi0JQXMgYW4gZXhhbXBsZSwgdGhpcyBpcyB3aGF0IGdvZXMgb24gdG8gbWFrZSB0aGUgYmFjayBlbmQgZm9yIGEKLQlzdW40LCBmcm9tIEBmaWxle2FvdXQzMi5jfToKLQotfAkjZGVmaW5lIEFSQ0hfU0laRSAzMgotfAkjaW5jbHVkZSAiYW91dHguaCIKLQotCVdoaWNoIGV4cG9ydHMgbmFtZXM6Ci0KLXwJLi4uCi18CWFvdXRfMzJfY2Fub25pY2FsaXplX3JlbG9jCi18CWFvdXRfMzJfZmluZF9uZWFyZXN0X2xpbmUKLXwJYW91dF8zMl9nZXRfbGluZW5vCi18CWFvdXRfMzJfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi18CS4uLgotCi0JZnJvbSBAZmlsZXtzdW5vcy5jfToKLQotfAkjZGVmaW5lIFRBUkdFVF9OQU1FICJhLm91dC1zdW5vcy1iaWciCi18CSNkZWZpbmUgVkVDTkFNRSAgICBzdW5vc19iaWdfdmVjCi18CSNpbmNsdWRlICJhb3V0ZjEuaCIKLQotCXJlcXVpcmVzIGFsbCB0aGUgbmFtZXMgZnJvbSBAZmlsZXthb3V0MzIuY30sIGFuZCBwcm9kdWNlcyB0aGUganVtcCB2ZWN0b3IKLQotfAlzdW5vc19iaWdfdmVjCi0KLQlUaGUgZmlsZSBAZmlsZXtob3N0LWFvdXQuY30gaXMgYSBzcGVjaWFsIGNhc2UuICBJdCBpcyBmb3IgYSBsYXJnZSBzZXQKLQlvZiBob3N0cyB0aGF0IHVzZSBgYG1vcmUgb3IgbGVzcyBzdGFuZGFyZCcnIGEub3V0IGZpbGVzLCBhbmQKLQlmb3Igd2hpY2ggY3Jvc3MtZGVidWdnaW5nIGlzIG5vdCBpbnRlcmVzdGluZy4gIEl0IHVzZXMgdGhlCi0Jc3RhbmRhcmQgMzItYml0IGEub3V0IHN1cHBvcnQgcm91dGluZXMsIGJ1dCBkZXRlcm1pbmVzIHRoZQotCWZpbGUgb2Zmc2V0cyBhbmQgYWRkcmVzc2VzIG9mIHRoZSB0ZXh0LCBkYXRhLCBhbmQgQlNTCi0Jc2VjdGlvbnMsIHRoZSBtYWNoaW5lIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlLCBhbmQgdGhlCi0JZW50cnkgcG9pbnQgYWRkcmVzcywgaW4gYSBob3N0LWRlcGVuZGVudCBtYW5uZXIuICBPbmNlIHRoZXNlCi0JdmFsdWVzIGhhdmUgYmVlbiBkZXRlcm1pbmVkLCBnZW5lcmljIGNvZGUgaXMgdXNlZCB0byBoYW5kbGUKLQl0aGUgIG9iamVjdCBmaWxlLgotCi0JV2hlbiBwb3J0aW5nIGl0IHRvIHJ1biBvbiBhIG5ldyBzeXN0ZW0sIHlvdSBtdXN0IHN1cHBseToKLQotfCAgICAgICAgSE9TVF9QQUdFX1NJWkUKLXwgICAgICAgIEhPU1RfU0VHTUVOVF9TSVpFCi18ICAgICAgICBIT1NUX01BQ0hJTkVfQVJDSCAgICAgICAob3B0aW9uYWwpCi18ICAgICAgICBIT1NUX01BQ0hJTkVfTUFDSElORSAgICAob3B0aW9uYWwpCi18ICAgICAgICBIT1NUX1RFWFRfU1RBUlRfQUREUgotfCAgICAgICAgSE9TVF9TVEFDS19FTkRfQUREUgotCi0JaW4gdGhlIGZpbGUgQGZpbGV7Li4vaW5jbHVkZS9zeXMvaC1AdmFye1hYWH0uaH0gKGZvciB5b3VyIGhvc3QpLiAgVGhlc2UKLQl2YWx1ZXMsIHBsdXMgdGhlIHN0cnVjdHVyZXMgYW5kIG1hY3JvcyBkZWZpbmVkIGluIEBmaWxle2Eub3V0Lmh9IG9uCi0JeW91ciBob3N0IHN5c3RlbSwgd2lsbCBwcm9kdWNlIGEgQkZEIHRhcmdldCB0aGF0IHdpbGwgYWNjZXNzCi0Jb3JkaW5hcnkgYS5vdXQgZmlsZXMgb24geW91ciBob3N0LiBUbyBjb25maWd1cmUgYSBuZXcgbWFjaGluZQotCXRvIHVzZSBAZmlsZXtob3N0LWFvdXQuY30sIHNwZWNpZnk6Ci0KLXwJVERFRkFVTFRTID0gLURERUZBVUxUX1ZFQ1RPUj1ob3N0X2FvdXRfYmlnX3ZlYwotfAlUREVQRklMRVM9IGhvc3QtYW91dC5vIHRyYWQtY29yZS5vCi0KLQlpbiB0aGUgQGZpbGV7Y29uZmlnL0B2YXJ7WFhYfS5tdH0gZmlsZSwgYW5kIG1vZGlmeSBAZmlsZXtjb25maWd1cmUuaW59Ci0JdG8gdXNlIHRoZQotCUBmaWxle0B2YXJ7WFhYfS5tdH0gZmlsZSAoYnkgc2V0dGluZyAiPDxiZmRfdGFyZ2V0PVhYWD4+Iikgd2hlbiB5b3VyCi0JY29uZmlndXJhdGlvbiBpcyBzZWxlY3RlZC4KLQotKi8KLQotLyogU29tZSBhc3N1bXB0aW9uczoKLSAgICogQW55IEJGRCB3aXRoIERfUEFHRUQgc2V0IGlzIFpNQUdJQywgYW5kIHZpY2UgdmVyc2EuCi0gICAgIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIHNldHRpbmcgb2YgV1BfVEVYVCBpcyBvbiBvdXRwdXQsIGJ1dCBpdCdsbAotICAgICBnZXQgc2V0IG9uIGlucHV0LgotICAgKiBBbnkgQkZEIHdpdGggRF9QQUdFRCBjbGVhciBhbmQgV1BfVEVYVCBzZXQgaXMgTk1BR0lDLgotICAgKiBBbnkgQkZEIHdpdGggYm90aCBmbGFncyBjbGVhciBpcyBPTUFHSUMuCi0gICAoSnVzdCB3YW50IHRvIG1ha2UgdGhlc2UgZXhwbGljaXQsIHNvIHRoZSBjb25kaXRpb25zIHRlc3RlZCBpbiB0aGlzCi0gICBmaWxlIG1ha2Ugc2Vuc2UgaWYgeW91J3JlIG1vcmUgZmFtaWxpYXIgd2l0aCBhLm91dCB0aGFuIHdpdGggQkZELikgICovCi0KLSNkZWZpbmUgS0VFUElUIHVkYXRhLmkKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLQotc3RhdGljIGJvb2xlYW4gYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgYW91dF9zeW1ib2xfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikpOwotc3RhdGljIHZvaWQgYWRqdXN0X29fbWFnaWMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9leGVjICopKTsKLXN0YXRpYyB2b2lkIGFkanVzdF96X21hZ2ljIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqKSk7Ci1zdGF0aWMgdm9pZCBhZGp1c3Rfbl9tYWdpYyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX2V4ZWMgKikpOwotCi0vKgotU1VCU0VDVElPTgotCVJlbG9jYXRpb25zCi0KLURFU0NSSVBUSU9OCi0JVGhlIGZpbGUgQGZpbGV7YW91dHguaH0gcHJvdmlkZXMgZm9yIGJvdGggdGhlIEBlbXBoe3N0YW5kYXJkfQotCWFuZCBAZW1waHtleHRlbmRlZH0gZm9ybXMgb2YgYS5vdXQgcmVsb2NhdGlvbiByZWNvcmRzLgotCi0JVGhlIHN0YW5kYXJkIHJlY29yZHMgY29udGFpbiBvbmx5IGFuCi0JYWRkcmVzcywgYSBzeW1ib2wgaW5kZXgsIGFuZCBhIHR5cGUgZmllbGQuIFRoZSBleHRlbmRlZCByZWNvcmRzCi0JKHVzZWQgb24gMjlrcyBhbmQgc3BhcmNzKSBhbHNvIGhhdmUgYSBmdWxsIGludGVnZXIgZm9yIGFuCi0JYWRkZW5kLgotCi0qLwotI2lmbmRlZiBDVE9SX1RBQkxFX1JFTE9DX0hPV1RPCi0jZGVmaW5lIENUT1JfVEFCTEVfUkVMT0NfSURYIDIKLSNkZWZpbmUgQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTyhCRkQpICgob2JqX3JlbG9jX2VudHJ5X3NpemUoQkZEKSA9PSBSRUxPQ19FWFRfU0laRSBcCi0JICAgICA/IGhvd3RvX3RhYmxlX2V4dCA6IGhvd3RvX3RhYmxlX3N0ZCkgXAotCSAgICArIENUT1JfVEFCTEVfUkVMT0NfSURYKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfc3dhcF9zdGRfcmVsb2NfaW4KLSNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2NfaW4gTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfc3dhcF9zdGRfcmVsb2Nfb3V0Ci0jZGVmaW5lIE1ZX3N3YXBfc3RkX3JlbG9jX291dCBOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfZmluYWxfbGlua19yZWxvY2F0ZQotI2RlZmluZSBNWV9maW5hbF9saW5rX3JlbG9jYXRlIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfcmVsb2NhdGVfY29udGVudHMKLSNkZWZpbmUgTVlfcmVsb2NhdGVfY29udGVudHMgX2JmZF9yZWxvY2F0ZV9jb250ZW50cwotI2VuZGlmCi0KLSNkZWZpbmUgaG93dG9fdGFibGVfZXh0IE5BTUUoYW91dCxleHRfaG93dG9fdGFibGUpCi0jZGVmaW5lIGhvd3RvX3RhYmxlX3N0ZCBOQU1FKGFvdXQsc3RkX2hvd3RvX3RhYmxlKQotCi1yZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlX2V4dFtdID0KLXsKLSAgLyogdHlwZSAgICAgICAgICAgcnMgICBzaXplIGJzeiAgcGNyZWwgYml0cG9zIG92cmYgICAgICAgICAgICAgICAgICBzZiBuYW1lICAgICAgICAgIHBhcnRfaW5wbCByZWFkbWFzayBzZXRtYXNrIHBjZG9uZSAqLwotICBIT1dUTyhSRUxPQ184LCAgICAgIDAsICAwLCAgCTgsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiOCIsICAgICAgICBmYWxzZSwgMCwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DXzE2LCAgICAgMCwgIDEsIAkxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjE2IiwgICAgICAgZmFsc2UsIDAsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ18zMiwgICAgIDAsICAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIzMiIsICAgICAgIGZhbHNlLCAwLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfRElTUDgsICAwLCAgMCwgCTgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIkRJU1A4IiwgCWZhbHNlLCAwLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfRElTUDE2LCAwLCAgMSwgCTE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIkRJU1AxNiIsIAlmYWxzZSwgMCwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0RJU1AzMiwgMCwgIDIsIAkzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJESVNQMzIiLCAJZmFsc2UsIDAsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19XRElTUDMwLDIsICAyLCAJMzAsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiV0RJU1AzMCIsIAlmYWxzZSwgMCwweDNmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX1dESVNQMjIsMiwgIDIsIAkyMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJXRElTUDIyIiwgCWZhbHNlLCAwLDB4MDAzZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfSEkyMiwgICAxMCwgMiwgCTIyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiSEkyMiIsCWZhbHNlLCAwLDB4MDAzZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfMjIsICAgICAwLCAgMiwgCTIyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMjIiLCAgICAgICBmYWxzZSwgMCwweDAwM2ZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DXzEzLCAgICAgMCwgIDIsIAkxMywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjEzIiwgICAgICAgZmFsc2UsIDAsMHgwMDAwMWZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19MTzEwLCAgIDAsICAyLCAJMTAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LDAsIkxPMTAiLCAgICAgZmFsc2UsIDAsMHgwMDAwMDNmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19TRkFfQkFTRSwwLCAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJTRkFfQkFTRSIsIGZhbHNlLCAwLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfU0ZBX09GRjEzLDAsMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiU0ZBX09GRjEzIixmYWxzZSwgMCwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0JBU0UxMCwgMCwgIDIsIAkxMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsMCwiQkFTRTEwIiwgICBmYWxzZSwgMCwweDAwMDAwM2ZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0JBU0UxMywgMCwgIDIsCTEzLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIkJBU0UxMyIsICAgZmFsc2UsIDAsMHgwMDAwMWZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19CQVNFMjIsIDEwLCAyLAkyMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkJBU0UyMiIsICAgZmFsc2UsIDAsMHgwMDNmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19QQzEwLCAgIDAsICAyLAkxMCwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsMCwiUEMxMCIsCWZhbHNlLCAwLDB4MDAwMDAzZmYsIHRydWUpLAotICBIT1dUTyhSRUxPQ19QQzIyLCAgIDEwLCAgMiwJMjIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiUEMyMiIsIGZhbHNlLCAwLDB4MDAzZmZmZmYsIHRydWUpLAotICBIT1dUTyhSRUxPQ19KTVBfVEJMLDIsICAyLCAJMzAsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiSk1QX1RCTCIsIAlmYWxzZSwgMCwweDNmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX1NFR09GRjE2LDAsIDIsCTAsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiU0VHT0ZGMTYiLAlmYWxzZSwgMCwweDAwMDAwMDAwLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0dMT0JfREFULDAsIDIsCTAsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiR0xPQl9EQVQiLAlmYWxzZSwgMCwweDAwMDAwMDAwLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0pNUF9TTE9ULDAsIDIsCTAsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiSk1QX1NMT1QiLAlmYWxzZSwgMCwweDAwMDAwMDAwLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX1JFTEFUSVZFLDAsIDIsCTAsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUkVMQVRJVkUiLAlmYWxzZSwgMCwweDAwMDAwMDAwLCBmYWxzZSksCi0gIEhPV1RPKDAsICAwLCAwLCAgICAwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKDAsICAwLCAwLCAgICAwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0jZGVmaW5lIFJFTE9DX1NQQVJDX1JFVjMyIFJFTE9DX1dESVNQMTkKLSAgSE9XVE8oUkVMT0NfU1BBUkNfUkVWMzIsICAgIDAsICAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LDAsIlJfU1BBUkNfUkVWMzIiLCAgICAgICBmYWxzZSwgMCwweGZmZmZmZmZmLCBmYWxzZSksCi19OwotCi0vKiBDb252ZXJ0IHN0YW5kYXJkIHJlbG9jIHJlY29yZHMgdG8gImFyZWxlbnQiIGZvcm1hdCAoaW5jbCBieXRlIHN3YXApLiAgKi8KLQotcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZV9zdGRbXSA9IHsKLSAgLyogdHlwZSAgICAgICAgICAgICAgcnMgc2l6ZSBic3ogIHBjcmVsIGJpdHBvcyBvdnJmICAgICAgICAgICAgICAgICAgICAgc2YgbmFtZSAgICAgcGFydF9pbnBsIHJlYWRtYXNrICBzZXRtYXNrICAgIHBjZG9uZSAqLwotSE9XVE8oIDAsCSAgICAgICAwLCAgMCwgIAk4LCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjgiLAkJdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi1IT1dUTyggMSwJICAgICAgIDAsICAxLCAJMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIxNiIsCXRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotSE9XVE8oIDIsCSAgICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLUhPV1RPKCAzLAkgICAgICAgMCwgIDQsIAk2NCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjY0IiwJdHJ1ZSwgMHhkZWFkZGVhZCwweGRlYWRkZWFkLCBmYWxzZSksCi1IT1dUTyggNCwJICAgICAgIDAsICAwLCAJOCwgIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQOCIsCXRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotSE9XVE8oIDUsCSAgICAgICAwLCAgMSwgCTE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDE2IiwJdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi1IT1dUTyggNiwJICAgICAgIDAsICAyLCAJMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLUhPV1RPKCA3LAkgICAgICAgMCwgIDQsIAk2NCwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIkRJU1A2NCIsCXRydWUsIDB4ZmVlZGZhY2UsMHhmZWVkZmFjZSwgZmFsc2UpLAotSE9XVE8oIDgsCSAgICAgICAwLCAgMiwgICAgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkdPVF9SRUwiLAlmYWxzZSwgICAgICAgICAwLDB4MDAwMDAwMDAsIGZhbHNlKSwKLUhPV1RPKCA5LAkgICAgICAgMCwgIDEsICAgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJCQVNFMTYiLAlmYWxzZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLUhPV1RPKDEwLAkgICAgICAgMCwgIDIsICAgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJCQVNFMzIiLAlmYWxzZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLSAgSE9XVE8oMTYsCSAgICAgICAwLCAgMiwJIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJKTVBfVEFCTEUiLCBmYWxzZSwgICAgICAgICAwLDB4MDAwMDAwMDAsIGZhbHNlKSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwgeyAtMSB9LCB7IC0xIH0sIHsgLTEgfSwgeyAtMSB9LCB7IC0xIH0sIHsgLTEgfSwgeyAtMSB9LAotICBIT1dUTygzMiwJICAgICAgIDAsICAyLAkgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJFTEFUSVZFIiwgIGZhbHNlLCAgICAgICAgIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAoteyAtMSB9LAoteyAtMSB9LAoteyAtMSB9LAoteyAtMSB9LAoteyAtMSB9LAoteyAtMSB9LAoteyAtMSB9LAotICBIT1dUTyg0MCwJICAgICAgIDAsICAyLAkgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkJBU0VSRUwiLCAgIGZhbHNlLCAgICAgICAgIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotfTsKLQotI2RlZmluZSBUQUJMRV9TSVpFKFRBQkxFKQkoc2l6ZW9mKFRBQkxFKS9zaXplb2YoVEFCTEVbMF0pKQotCi1yZWxvY19ob3d0b190eXBlICoKLU5BTUUoYW91dCxyZWxvY190eXBlX2xvb2t1cCkgKGFiZmQsY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSNkZWZpbmUgRVhUKGksaikJY2FzZSBpOiByZXR1cm4gJmhvd3RvX3RhYmxlX2V4dFtqXQotI2RlZmluZSBTVEQoaSxqKQljYXNlIGk6IHJldHVybiAmaG93dG9fdGFibGVfc3RkW2pdCi0gIGludCBleHQgPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPT0gUkVMT0NfRVhUX1NJWkU7Ci0gIGlmIChjb2RlID09IEJGRF9SRUxPQ19DVE9SKQotICAgIHN3aXRjaCAoYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5iaXRzX3Blcl9hZGRyZXNzKQotICAgICAgewotICAgICAgY2FzZSAzMjoKLQljb2RlID0gQkZEX1JFTE9DXzMyOwotCWJyZWFrOwotICAgICAgY2FzZSA2NDoKLQljb2RlID0gQkZEX1JFTE9DXzY0OwotCWJyZWFrOwotICAgICAgfQotICBpZiAoZXh0KQotICAgIHN3aXRjaCAoY29kZSkKLSAgICAgIHsKLQlFWFQgKEJGRF9SRUxPQ18zMiwgMik7Ci0JRVhUIChCRkRfUkVMT0NfSEkyMiwgOCk7Ci0JRVhUIChCRkRfUkVMT0NfTE8xMCwgMTEpOwotCUVYVCAoQkZEX1JFTE9DXzMyX1BDUkVMX1MyLCA2KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyLCA3KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQzEzLCAxMCk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfR09UMTAsIDE0KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19CQVNFMTMsIDE1KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19HT1QxMywgMTUpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX0dPVDIyLCAxNik7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfUEMxMCwgMTcpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX1BDMjIsIDE4KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19XUExUMzAsIDE5KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19SRVYzMiwgMjYpOwotICAgICAgZGVmYXVsdDogcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgICB9Ci0gIGVsc2UKLSAgICAvKiBzdGQgcmVsb2NzICovCi0gICAgc3dpdGNoIChjb2RlKQotICAgICAgewotCVNURCAoQkZEX1JFTE9DXzE2LCAxKTsKLQlTVEQgKEJGRF9SRUxPQ18zMiwgMik7Ci0JU1REIChCRkRfUkVMT0NfOF9QQ1JFTCwgNCk7Ci0JU1REIChCRkRfUkVMT0NfMTZfUENSRUwsIDUpOwotCVNURCAoQkZEX1JFTE9DXzMyX1BDUkVMLCA2KTsKLQlTVEQgKEJGRF9SRUxPQ18xNl9CQVNFUkVMLCA5KTsKLQlTVEQgKEJGRF9SRUxPQ18zMl9CQVNFUkVMLCAxMCk7Ci0gICAgICBkZWZhdWx0OiByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICAgIH0KLX0KLQotLyoKLVNVQlNFQ1RJT04KLQlJbnRlcm5hbCBlbnRyeSBwb2ludHMKLQotREVTQ1JJUFRJT04KLQlAZmlsZXthb3V0eC5ofSBleHBvcnRzIHNldmVyYWwgcm91dGluZXMgZm9yIGFjY2Vzc2luZyB0aGUKLQljb250ZW50cyBvZiBhbiBhLm91dCBmaWxlLCB3aGljaCBhcmUgZ2F0aGVyZWQgYW5kIGV4cG9ydGVkIGluCi0JdHVybiBieSB2YXJpb3VzIGZvcm1hdCBzcGVjaWZpYyBmaWxlcyAoZWcgc3Vub3MuYykuCi0KLSovCi0KLS8qCi1GVU5DVElPTgotCSBhb3V0X0B2YXJ7c2l6ZX1fc3dhcF9leGVjX2hlYWRlcl9pbgotCi1TWU5PUFNJUwotCXZvaWQgYW91dF9AdmFye3NpemV9X3N3YXBfZXhlY19oZWFkZXJfaW4sCi0gICAgICAgICAgIChiZmQgKmFiZmQsCi0gICAgICAgICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzLAotICAgICAgICAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwKTsKLQotREVTQ1JJUFRJT04KLQlTd2FwIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBleGVjdXRhYmxlIGhlYWRlciBAdmFye3Jhd19ieXRlc30gdGFrZW4KLQlmcm9tIGEgcmF3IGJ5dGUgc3RyZWFtIG1lbW9yeSBpbWFnZSBpbnRvIHRoZSBpbnRlcm5hbCBleGVjIGhlYWRlcgotCXN0cnVjdHVyZSBAdmFye2V4ZWNwfS4KLSovCi0KLSNpZm5kZWYgTkFNRV9zd2FwX2V4ZWNfaGVhZGVyX2luCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikgKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogVGhlIGludGVybmFsX2V4ZWMgc3RydWN0dXJlIGhhcyBzb21lIGZpZWxkcyB0aGF0IGFyZSB1bnVzZWQgaW4gdGhpcwotICAgICBjb25maWd1cmF0aW9uIChJRSBmb3IgaTk2MCksIHNvIGVuc3VyZSB0aGF0IGFsbCBzdWNoIHVuaW5pdGlhbGl6ZWQKLSAgICAgZmllbGRzIGFyZSB6ZXJvJ2Qgb3V0LiAgVGhlcmUgYXJlIHBsYWNlcyB3aGVyZSB0d28gb2YgdGhlc2Ugc3RydWN0cwotICAgICBhcmUgbWVtY21wJ2QsIGFuZCB0aHVzIHRoZSBjb250ZW50cyBkbyBtYXR0ZXIuICovCi0gIG1lbXNldCAoKFBUUikgZXhlY3AsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpKTsKLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9pbmZvKTsKLSAgZXhlY3AtPmFfdGV4dCAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOwotICBleGVjcC0+YV9kYXRhICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGF0YSk7Ci0gIGV4ZWNwLT5hX2JzcyAgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9ic3MpOwotICBleGVjcC0+YV9zeW1zICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc3ltcyk7Ci0gIGV4ZWNwLT5hX2VudHJ5ICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90cnNpemUpOwotICBleGVjcC0+YV9kcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZHJzaXplKTsKLX0KLSNkZWZpbmUgTkFNRV9zd2FwX2V4ZWNfaGVhZGVyX2luIE5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKQotI2VuZGlmCi0KLS8qCi1GVU5DVElPTgotCWFvdXRfQHZhcntzaXplfV9zd2FwX2V4ZWNfaGVhZGVyX291dAotCi1TWU5PUFNJUwotCXZvaWQgYW91dF9AdmFye3NpemV9X3N3YXBfZXhlY19oZWFkZXJfb3V0Ci0JICAoYmZkICphYmZkLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCwKLQkgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzKTsKLQotREVTQ1JJUFRJT04KLQlTd2FwIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBpbnRlcm5hbCBleGVjIGhlYWRlciBzdHJ1Y3R1cmUKLQlAdmFye2V4ZWNwfSBpbnRvIHRoZSBidWZmZXIgQHZhcntyYXdfYnl0ZXN9IHJlYWR5IGZvciB3cml0aW5nIHRvIGRpc2suCi0qLwotdm9pZAotTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsIHJhd19ieXRlcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXM7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKXJhd19ieXRlczsKLQotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIHJhdyBkYXRhLCBmcm9tIHRoZSBmaWVsZHMgaW4gdGhlIGV4ZWMgc3RydWN0LiAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX2luZm8gICwgYnl0ZXMtPmVfaW5mbyk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV90ZXh0ICAsIGJ5dGVzLT5lX3RleHQpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZGF0YSAgLCBieXRlcy0+ZV9kYXRhKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2JzcyAgICwgYnl0ZXMtPmVfYnNzKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3N5bXMgICwgYnl0ZXMtPmVfc3ltcyk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9lbnRyeSAsIGJ5dGVzLT5lX2VudHJ5KTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3Ryc2l6ZSwgYnl0ZXMtPmVfdHJzaXplKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2Ryc2l6ZSwgYnl0ZXMtPmVfZHJzaXplKTsKLX0KLQotLyogTWFrZSBhbGwgdGhlIHNlY3Rpb24gZm9yIGFuIGEub3V0IGZpbGUuICAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKG9ial90ZXh0c2VjIChhYmZkKSA9PSAoYXNlY3Rpb24gKikgTlVMTAotICAgICAgJiYgYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi50ZXh0IikgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAob2JqX2RhdGFzZWMgKGFiZmQpID09IChhc2VjdGlvbiAqKSBOVUxMCi0gICAgICAmJiBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmRhdGEiKSA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChvYmpfYnNzc2VjIChhYmZkKSA9PSAoYXNlY3Rpb24gKikgTlVMTAotICAgICAgJiYgYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5ic3MiKSA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQlhb3V0X0B2YXJ7c2l6ZX1fc29tZV9hb3V0X29iamVjdF9wCi0KLVNZTk9QU0lTCi0JY29uc3QgYmZkX3RhcmdldCAqYW91dF9AdmFye3NpemV9X3NvbWVfYW91dF9vYmplY3RfcAotCSAoYmZkICphYmZkLAotCSAgY29uc3QgYmZkX3RhcmdldCAqKCpjYWxsYmFja190b19yZWFsX29iamVjdF9wKSgpKTsKLQotREVTQ1JJUFRJT04KLQlTb21lIGEub3V0IHZhcmlhbnQgdGhpbmtzIHRoYXQgdGhlIGZpbGUgb3BlbiBpbiBAdmFye2FiZmR9Ci0JY2hlY2tpbmcgaXMgYW4gYS5vdXQgZmlsZS4gIERvIHNvbWUgbW9yZSBjaGVja2luZywgYW5kIHNldCB1cAotCWZvciBhY2Nlc3MgaWYgaXQgcmVhbGx5IGlzLiAgQ2FsbCBiYWNrIHRvIHRoZSBjYWxsaW5nCi0JZW52aXJvbm1lbnQncyAiZmluaXNoIHVwIiBmdW5jdGlvbiBqdXN0IGJlZm9yZSByZXR1cm5pbmcsIHRvCi0JaGFuZGxlIGFueSBsYXN0LW1pbnV0ZSBzZXR1cC4KLSovCi0KLWNvbnN0IGJmZF90YXJnZXQgKgotTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkgKGFiZmQsIGV4ZWNwLCBjYWxsYmFja190b19yZWFsX29iamVjdF9wKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLSAgICAgY29uc3QgYmZkX3RhcmdldCAqKCpjYWxsYmFja190b19yZWFsX29iamVjdF9wKSBQQVJBTVMgKChiZmQgKikpOwotewotICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqcmF3cHRyLCAqb2xkcmF3cHRyOwotICBjb25zdCBiZmRfdGFyZ2V0ICpyZXN1bHQ7Ci0KLSAgcmF3cHRyID0gKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICkpOwotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgb2xkcmF3cHRyID0gYWJmZC0+dGRhdGEuYW91dF9kYXRhOwotICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSByYXdwdHI7Ci0KLSAgLyogQ29weSB0aGUgY29udGVudHMgb2YgdGhlIG9sZCB0ZGF0YSBzdHJ1Y3QuCi0gICAgIEluIHBhcnRpY3VsYXIsIHdlIHdhbnQgdGhlIHN1YmZvcm1hdCwgc2luY2UgZm9yIGhwdXggaXQgd2FzIHNldCBpbgotICAgICBocDMwMGhwdXguYzpzd2FwX2V4ZWNfaGVhZGVyX2luIGFuZCB3aWxsIGJlIHVzZWQgaW4KLSAgICAgaHAzMDBocHV4LmM6Y2FsbGJhY2suICAqLwotICBpZiAob2xkcmF3cHRyICE9IE5VTEwpCi0gICAgKmFiZmQtPnRkYXRhLmFvdXRfZGF0YSA9ICpvbGRyYXdwdHI7Ci0KLSAgYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hLmhkciA9ICZyYXdwdHItPmU7Ci0gICooYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hLmhkcikgPSAqZXhlY3A7CS8qIENvcHkgaW4gdGhlIGludGVybmFsX2V4ZWMgc3RydWN0ICovCi0gIGV4ZWNwID0gYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hLmhkcjsKLQotICAvKiBTZXQgdGhlIGZpbGUgZmxhZ3MgKi8KLSAgYWJmZC0+ZmxhZ3MgPSBCRkRfTk9fRkxBR1M7Ci0gIGlmIChleGVjcC0+YV9kcnNpemUgfHwgZXhlY3AtPmFfdHJzaXplKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19SRUxPQzsKLSAgLyogU2V0dGluZyBvZiBFWEVDX1AgaGFzIGJlZW4gZGVmZXJyZWQgdG8gdGhlIGJvdHRvbSBvZiB0aGlzIGZ1bmN0aW9uICovCi0gIGlmIChleGVjcC0+YV9zeW1zKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfU1lNUyB8IEhBU19MT0NBTFM7Ci0gIGlmIChOX0RZTkFNSUMoKmV4ZWNwKSkKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotCi0gIGlmIChOX01BR0lDICgqZXhlY3ApID09IFpNQUdJQykKLSAgICB7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBEX1BBR0VEIHwgV1BfVEVYVDsKLSAgICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IHpfbWFnaWM7Ci0gICAgfQotICBlbHNlIGlmIChOX01BR0lDICgqZXhlY3ApID09IFFNQUdJQykKLSAgICB7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBEX1BBR0VEIHwgV1BfVEVYVDsKLSAgICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IHpfbWFnaWM7Ci0gICAgICBhZGF0YSAoYWJmZCkuc3ViZm9ybWF0ID0gcV9tYWdpY19mb3JtYXQ7Ci0gICAgfQotICBlbHNlIGlmIChOX01BR0lDICgqZXhlY3ApID09IE5NQUdJQykKLSAgICB7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBXUF9URVhUOwotICAgICAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gbl9tYWdpYzsKLSAgICB9Ci0gIGVsc2UgaWYgKE5fTUFHSUMgKCpleGVjcCkgPT0gT01BR0lDCi0JICAgfHwgTl9NQUdJQyAoKmV4ZWNwKSA9PSBCTUFHSUMpCi0gICAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gb19tYWdpYzsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFNob3VsZCBoYXZlIGJlZW4gY2hlY2tlZCB3aXRoIE5fQkFETUFHIGJlZm9yZSB0aGlzIHJvdXRpbmUKLQkgd2FzIGNhbGxlZC4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IGV4ZWNwLT5hX2VudHJ5OwotCi0gIG9ial9hb3V0X3N5bWJvbHMgKGFiZmQpID0gKGFvdXRfc3ltYm9sX3R5cGUgKilOVUxMOwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IGV4ZWNwLT5hX3N5bXMgLyBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCk7Ci0KLSAgLyogVGhlIGRlZmF1bHQgcmVsb2NhdGlvbiBlbnRyeSBzaXplIGlzIHRoYXQgb2YgdHJhZGl0aW9uYWwgVjcgVW5peC4gICovCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotCi0gIC8qIFRoZSBkZWZhdWx0IHN5bWJvbCBlbnRyeSBzaXplIGlzIHRoYXQgb2YgdHJhZGl0aW9uYWwgVW5peC4gKi8KLSAgb2JqX3N5bWJvbF9lbnRyeV9zaXplIChhYmZkKSA9IEVYVEVSTkFMX05MSVNUX1NJWkU7Ci0KLSNpZmRlZiBVU0VfTU1BUAotICBiZmRfaW5pdF93aW5kb3cgKCZvYmpfYW91dF9zeW1fd2luZG93IChhYmZkKSk7Ci0gIGJmZF9pbml0X3dpbmRvdyAoJm9ial9hb3V0X3N0cmluZ193aW5kb3cgKGFiZmQpKTsKLSNlbmRpZgotICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IE5VTEw7Ci0gIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpID0gTlVMTDsKLSAgb2JqX2FvdXRfc3ltX2hhc2hlcyAoYWJmZCkgPSBOVUxMOwotCi0gIGlmICghIE5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBleGVjcC0+YV9kYXRhOwotICBvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfYnNzOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmxhZ3MgPQotICAgIChleGVjcC0+YV90cnNpemUgIT0gMAotICAgICA/IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUxPQykKLSAgICAgOiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfQ09ERSB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5mbGFncyA9Ci0gICAgKGV4ZWNwLT5hX2Ryc2l6ZSAhPSAwCi0gICAgID8gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFTE9DKQotICAgICA6IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19EQVRBIHwgU0VDX0hBU19DT05URU5UUykpOwotICBvYmpfYnNzc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0KLSNpZmRlZiBUSElTX0lTX09OTFlfRE9DVU1FTlRBVElPTgotICAvKiBUaGUgY29tbW9uIGNvZGUgY2FuJ3QgZmlsbCBpbiB0aGVzZSB0aGluZ3MgYmVjYXVzZSB0aGV5IGRlcGVuZAotICAgICBvbiBlaXRoZXIgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHRleHQgc2VnbWVudCwgdGhlIHJvdW5kaW5nCi0gICAgIHVwIG9mIHZpcnR1YWwgYWRkcmVzc2VzIGJldHdlZW4gc2VnbWVudHMsIG9yIHRoZSBzdGFydGluZyBmaWxlCi0gICAgIHBvc2l0aW9uIG9mIHRoZSB0ZXh0IHNlZ21lbnQgLS0gYWxsIG9mIHdoaWNoIHZhcmllcyBhbW9uZyBkaWZmZXJlbnQKLSAgICAgdmVyc2lvbnMgb2YgYS5vdXQuICAqLwotCi0gIC8qIENhbGwgYmFjayB0byB0aGUgZm9ybWF0LWRlcGVuZGVudCBjb2RlIHRvIGZpbGwgaW4gdGhlIHJlc3Qgb2YgdGhlCi0gICAgIGZpZWxkcyBhbmQgZG8gYW55IGZ1cnRoZXIgY2xlYW51cC4gIFRoaW5ncyB0aGF0IHNob3VsZCBiZSBmaWxsZWQKLSAgICAgaW4gYnkgdGhlIGNhbGxiYWNrOiAgKi8KLQotICBzdHJ1Y3QgZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5zaXplID0gTl9UWFRTSVpFKCpleGVjcCk7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmF3X3NpemUgPSBOX1RYVFNJWkUoKmV4ZWNwKTsKLSAgLyogZGF0YSBhbmQgYnNzIGFyZSBhbHJlYWR5IGZpbGxlZCBpbiBzaW5jZSB0aGV5J3JlIHNvIHN0YW5kYXJkICovCi0KLSAgLyogVGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBOX1RYVEFERFIoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBOX0RBVEFERFIoKmV4ZWNwKTsKLSAgb2JqX2Jzc3NlYyAgKGFiZmQpLT52bWEgPSBOX0JTU0FERFIoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzZWN0aW9ucyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX1RYVE9GRigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRigqZXhlY3ApOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHJlbG9jYXRpb24gaW5mbyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9UUkVMT0ZGKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX0RSRUxPRkYoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBOX1NUUk9GRiAoKmV4ZWNwKTsKLSAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IE5fU1lNT0ZGICgqZXhlY3ApOwotCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgc3dpdGNoIChOX01BQ0hUWVBFICgqZXhlY19oZHIgKGFiZmQpKSkgewotICBkZWZhdWx0OgotICAgIGFiZmQtPm9ial9hcmNoID0gYmZkX2FyY2hfb2JzY3VyZTsKLSAgICBicmVhazsKLSAgfQotCi0gIGFkYXRhKGFiZmQpLT5wYWdlX3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOwotICBhZGF0YShhYmZkKS0+c2VnbWVudF9zaXplID0gU0VHTUVOVF9TSVpFOwotICBhZGF0YShhYmZkKS0+ZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotCi0gIC8qIFRoZSBhcmNoaXRlY3R1cmUgaXMgZW5jb2RlZCBpbiB2YXJpb3VzIHdheXMgaW4gdmFyaW91cyBhLm91dCB2YXJpYW50cywKLSAgICAgb3IgaXMgbm90IGVuY29kZWQgYXQgYWxsIGluIHNvbWUgb2YgdGhlbS4gIFRoZSByZWxvY2F0aW9uIHNpemUgZGVwZW5kcwotICAgICBvbiB0aGUgYXJjaGl0ZWN0dXJlIGFuZCB0aGUgYS5vdXQgdmFyaWFudC4gIEZpbmFsbHksIHRoZSByZXR1cm4gdmFsdWUKLSAgICAgaXMgdGhlIGJmZF90YXJnZXQgdmVjdG9yIGluIHVzZS4gIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIHplcm8gYW5kCi0gICAgIHNldCBiZmRfZXJyb3IgdG8gdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCi0KLSAgICAgRm9ybWF0cyBzdWNoIGFzIGIub3V0LCB3aGljaCBoYXZlIGFkZGl0aW9uYWwgZmllbGRzIGluIHRoZSBhLm91dAotICAgICBoZWFkZXIsIHNob3VsZCBjb3BlIHdpdGggdGhlbSBpbiB0aGlzIGNhbGxiYWNrIGFzIHdlbGwuICAqLwotI2VuZGlmCQkJCS8qIERPQ1VNRU5UQVRJT04gKi8KLQotICByZXN1bHQgPSAoKmNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3ApKGFiZmQpOwotCi0gIC8qIE5vdyB0aGF0IHRoZSBzZWdtZW50IGFkZHJlc3NlcyBoYXZlIGJlZW4gd29ya2VkIG91dCwgdGFrZSBhIGJldHRlcgotICAgICBndWVzcyBhdCB3aGV0aGVyIHRoZSBmaWxlIGlzIGV4ZWN1dGFibGUuICBJZiB0aGUgZW50cnkgcG9pbnQKLSAgICAgaXMgd2l0aGluIHRoZSB0ZXh0IHNlZ21lbnQsIGFzc3VtZSBpdCBpcy4gIChUaGlzIG1ha2VzIGZpbGVzCi0gICAgIGV4ZWN1dGFibGUgZXZlbiBpZiB0aGVpciBlbnRyeSBwb2ludCBhZGRyZXNzIGlzIDAsIGFzIGxvbmcgYXMKLSAgICAgdGhlaXIgdGV4dCBzdGFydHMgYXQgemVyby4pLgotCi0gICAgIFRoaXMgdGVzdCBoYWQgdG8gYmUgY2hhbmdlZCB0byBkZWFsIHdpdGggc3lzdGVtcyB3aGVyZSB0aGUgdGV4dCBzZWdtZW50Ci0gICAgIHJ1bnMgYXQgYSBkaWZmZXJlbnQgbG9jYXRpb24gdGhhbiB0aGUgZGVmYXVsdC4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgdGhlCi0gICAgIGVudHJ5IGFkZHJlc3MgY2FuIGFwcGVhciB0byBiZSBvdXRzaWRlIHRoZSB0ZXh0IHNlZ21lbnQsIHRodXMgY2F1c2luZyBhbgotICAgICBlcnJvbmVvdXMgY29uY2x1c2lvbiB0aGF0IHRoZSBmaWxlIGlzbid0IGV4ZWN1dGFibGUuCi0KLSAgICAgVG8gZml4IHRoaXMsIHdlIG5vdyBhY2NlcHQgYW55IG5vbi16ZXJvIGVudHJ5IHBvaW50IGFzIGFuIGluZGljYXRpb24gb2YKLSAgICAgZXhlY3V0YWJpbGl0eS4gIFRoaXMgd2lsbCB3b3JrIG1vc3Qgb2YgdGhlIHRpbWUsIHNpbmNlIG9ubHkgdGhlIGxpbmtlcgotICAgICBzZXRzIHRoZSBlbnRyeSBwb2ludCwgYW5kIHRoYXQgaXMgbGlrZWx5IHRvIGJlIG5vbi16ZXJvIGZvciBtb3N0IHN5c3RlbXMuICovCi0KLSAgaWYgKGV4ZWNwLT5hX2VudHJ5ICE9IDAKLSAgICAgIHx8IChleGVjcC0+YV9lbnRyeSA+PSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hCi0JICAmJiBleGVjcC0+YV9lbnRyeSA8IG9ial90ZXh0c2VjKGFiZmQpLT52bWEgKyBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplKSkKLSAgICBhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0jaWZkZWYgU1RBVF9GT1JfRVhFQwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IHN0YXQgc3RhdF9idWY7Ci0KLSAgICAgIC8qIFRoZSBvcmlnaW5hbCBoZXVyaXN0aWMgZG9lc24ndCB3b3JrIGluIHNvbWUgaW1wb3J0YW50IGNhc2VzLgotICAgICAgICBUaGUgYS5vdXQgZmlsZSBoYXMgbm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRleHQgc3RhcnQKLSAgICAgICAgYWRkcmVzcy4gIEZvciBmaWxlcyAobGlrZSBrZXJuZWxzKSBsaW5rZWQgdG8gbm9uLXN0YW5kYXJkCi0gICAgICAgIGFkZHJlc3NlcyAobGQgLVR0ZXh0IG5ubikgdGhlIGVudHJ5IHBvaW50IG1heSBub3QgYmUgYmV0d2VlbgotICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IHN0YXJ0IChvYmpfdGV4dHNlYyhhYmZkKS0+dm1hKSBhbmQKLSAgICAgICAgKG9ial90ZXh0c2VjKGFiZmQpLT52bWEpICsgdGV4dCBzaXplLiAgVGhpcyBpcyBub3QganVzdCBhIG1hY2gKLSAgICAgICAgaXNzdWUuICBNYW55IGtlcm5lbHMgYXJlIGxvYWRlZCBhdCBub24gc3RhbmRhcmQgYWRkcmVzc2VzLiAgKi8KLSAgICAgIGlmIChhYmZkLT5pb3N0cmVhbSAhPSBOVUxMCi0JICAmJiAoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSA9PSAwCi0JICAmJiAoZnN0YXQoZmlsZW5vKChGSUxFICopIChhYmZkLT5pb3N0cmVhbSkpLCAmc3RhdF9idWYpID09IDApCi0JICAmJiAoKHN0YXRfYnVmLnN0X21vZGUgJiAwMTExKSAhPSAwKSkKLQlhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0gICAgfQotI2VuZGlmIC8qIFNUQVRfRk9SX0VYRUMgKi8KLQotICBpZiAocmVzdWx0KQotICAgIHsKLSNpZiAwIC8qIFRoZXNlIHNob3VsZCBiZSBzZXQgY29ycmVjdGx5IGFueXdheXMuICAqLwotICAgICAgYWJmZC0+c2VjdGlvbnMgPSBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0gICAgICBvYmpfdGV4dHNlYyAoYWJmZCktPm5leHQgPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPm5leHQgPSBvYmpfYnNzc2VjIChhYmZkKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZyZWUgKHJhd3B0cik7Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSBvbGRyYXdwdHI7Ci0gICAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKgotRlVOQ1RJT04KLQlhb3V0X0B2YXJ7c2l6ZX1fbWtvYmplY3QKLQotU1lOT1BTSVMKLQlib29sZWFuIGFvdXRfQHZhcntzaXplfV9ta29iamVjdCwgKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JSW5pdGlhbGl6ZSBCRkQgQHZhcnthYmZkfSBmb3IgdXNlIHdpdGggYS5vdXQgZmlsZXMuCi0qLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsbWtvYmplY3QpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICAqcmF3cHRyOwotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0KLSAgLyogVXNlIGFuIGludGVybWVkaWF0ZSB2YXJpYWJsZSBmb3IgY2xhcml0eSAqLwotICByYXdwdHIgPSAoc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKiliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICkpOwotCi0gIGlmIChyYXdwdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gcmF3cHRyOwotICBleGVjX2hkciAoYWJmZCkgPSAmKHJhd3B0ci0+ZSk7Ci0KLSAgb2JqX3RleHRzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopTlVMTDsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopTlVMTDsKLSAgb2JqX2Jzc3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKilOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWFvdXRfQHZhcntzaXplfV9tYWNoaW5lX3R5cGUKLQotU1lOT1BTSVMKLQllbnVtIG1hY2hpbmVfdHlwZSAgYW91dF9AdmFye3NpemV9X21hY2hpbmVfdHlwZQotCSAoZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsCi0JICB1bnNpZ25lZCBsb25nIG1hY2hpbmUpKTsKLQotREVTQ1JJUFRJT04KLQlLZWVwIHRyYWNrIG9mIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgZm9yCi0JYS5vdXQncy4gUmV0dXJuIHRoZSA8PG1hY2hpbmVfdHlwZT4+IGZvciBhIHBhcnRpY3VsYXIKLQlhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUsIG9yIDw8TV9VTktOT1dOPj4gaWYgdGhhdCBleGFjdCBhcmNoaXRlY3R1cmUKLQlhbmQgbWFjaGluZSBjYW4ndCBiZSByZXByZXNlbnRlZCBpbiBhLm91dCBmb3JtYXQuCi0KLQlJZiB0aGUgYXJjaGl0ZWN0dXJlIGlzIHVuZGVyc3Rvb2QsIG1hY2hpbmUgdHlwZSAwIChkZWZhdWx0KQotCWlzIGFsd2F5cyB1bmRlcnN0b29kLgotKi8KLQotZW51bSBtYWNoaW5lX3R5cGUKLU5BTUUoYW91dCxtYWNoaW5lX3R5cGUpIChhcmNoLCBtYWNoaW5lLCB1bmtub3duKQotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotICAgICBib29sZWFuICp1bmtub3duOwotewotICBlbnVtIG1hY2hpbmVfdHlwZSBhcmNoX2ZsYWdzOwotCi0gIGFyY2hfZmxhZ3MgPSBNX1VOS05PV047Ci0gICp1bmtub3duID0gdHJ1ZTsKLQotICBzd2l0Y2ggKGFyY2gpIHsKLSAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICBpZiAobWFjaGluZSA9PSAwCi0JfHwgbWFjaGluZSA9PSBiZmRfbWFjaF9zcGFyYwotCXx8IG1hY2hpbmUgPT0gYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlCi0JfHwgbWFjaGluZSA9PSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUKLQl8fCBtYWNoaW5lID09IGJmZF9tYWNoX3NwYXJjX3Y5KQotICAgICAgYXJjaF9mbGFncyA9IE1fU1BBUkM7Ci0gICAgZWxzZSBpZiAobWFjaGluZSA9PSBiZmRfbWFjaF9zcGFyY19zcGFyY2xldCkKLSAgICAgIGFyY2hfZmxhZ3MgPSBNX1NQQVJDTEVUOwotICAgIGJyZWFrOwotCi0gIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICBzd2l0Y2ggKG1hY2hpbmUpIHsKLSAgICBjYXNlIDA6CQkgIGFyY2hfZmxhZ3MgPSBNXzY4MDEwOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAwMDogYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsgKnVua25vd24gPSBmYWxzZTsgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwMTA6IGFyY2hfZmxhZ3MgPSBNXzY4MDEwOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAyMDogYXJjaF9mbGFncyA9IE1fNjgwMjA7IGJyZWFrOwotICAgIGRlZmF1bHQ6CQkgIGFyY2hfZmxhZ3MgPSBNX1VOS05PV047IGJyZWFrOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgaWYgKG1hY2hpbmUgPT0gMCkJYXJjaF9mbGFncyA9IE1fMzg2OwotICAgIGJyZWFrOwotCi0gIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICBpZiAobWFjaGluZSA9PSAwKQlhcmNoX2ZsYWdzID0gTV8yOUs7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBiZmRfYXJjaF9hcm06Ci0gICAgaWYgKG1hY2hpbmUgPT0gMCkJYXJjaF9mbGFncyA9IE1fQVJNOwotICAgIGJyZWFrOwotICAgIAotICBjYXNlIGJmZF9hcmNoX21pcHM6Ci0gICAgc3dpdGNoIChtYWNoaW5lKSB7Ci0gICAgY2FzZSAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczMwMDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzMzkwMDoKLSAgICAgIGFyY2hfZmxhZ3MgPSBNX01JUFMxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNjAwMDoKLSAgICAgIGFyY2hfZmxhZ3MgPSBNX01JUFMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDAwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MDEwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQxMDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDMwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0NDAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQ2MDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDY1MDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM4MDAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczEwMDAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczE2OgotICAgICAgLyogRklYTUU6IFRoZXNlIHNob3VsZCBiZSBNSVBTMyBvciBNSVBTNC4gICovCi0gICAgICBhcmNoX2ZsYWdzID0gTV9NSVBTMjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhcmNoX2ZsYWdzID0gTV9VTktOT1dOOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgYmZkX2FyY2hfbnMzMms6Ci0gICAgc3dpdGNoIChtYWNoaW5lKSB7Ci0gICAgY2FzZSAwOiAgICAJCWFyY2hfZmxhZ3MgPSBNX05TMzI1MzI7IGJyZWFrOwotICAgIGNhc2UgMzIwMzI6CQlhcmNoX2ZsYWdzID0gTV9OUzMyMDMyOyBicmVhazsKLSAgICBjYXNlIDMyNTMyOgkJYXJjaF9mbGFncyA9IE1fTlMzMjUzMjsgYnJlYWs7Ci0gICAgZGVmYXVsdDoJCWFyY2hfZmxhZ3MgPSBNX1VOS05PV047IGJyZWFrOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIGJmZF9hcmNoX3ZheDoKLSAgICAqdW5rbm93biA9IGZhbHNlOwotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6Ci0gICAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKLSAgfQotCi0gIGlmIChhcmNoX2ZsYWdzICE9IE1fVU5LTk9XTikKLSAgICAqdW5rbm93biA9IGZhbHNlOwotCi0gIHJldHVybiBhcmNoX2ZsYWdzOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWFvdXRfQHZhcntzaXplfV9zZXRfYXJjaF9tYWNoCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBhb3V0X0B2YXJ7c2l6ZX1fc2V0X2FyY2hfbWFjaCwKLQkgKGJmZCAqLAotCSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsCi0JICB1bnNpZ25lZCBsb25nIG1hY2hpbmUpKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIGFyY2hpdGVjdHVyZSBhbmQgdGhlIG1hY2hpbmUgb2YgdGhlIEJGRCBAdmFye2FiZmR9IHRvIHRoZQotCXZhbHVlcyBAdmFye2FyY2h9IGFuZCBAdmFye21hY2hpbmV9LiAgVmVyaWZ5IHRoYXQgQHZhcnthYmZkfSdzIGZvcm1hdAotCWNhbiBzdXBwb3J0IHRoZSBhcmNoaXRlY3R1cmUgcmVxdWlyZWQuCi0qLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsc2V0X2FyY2hfbWFjaCkgKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgaWYgKCEgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhcmNoICE9IGJmZF9hcmNoX3Vua25vd24pCi0gICAgewotICAgICAgYm9vbGVhbiB1bmtub3duOwotCi0gICAgICBOQU1FKGFvdXQsbWFjaGluZV90eXBlKSAoYXJjaCwgbWFjaGluZSwgJnVua25vd24pOwotICAgICAgaWYgKHVua25vd24pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5ICovCi0gIHN3aXRjaCAoYXJjaCkgewotICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICBjYXNlIGJmZF9hcmNoX2EyOWs6Ci0gIGNhc2UgYmZkX2FyY2hfbWlwczoKLSAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19FWFRfU0laRTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiAoKmFvdXRfYmFja2VuZF9pbmZvKGFiZmQpLT5zZXRfc2l6ZXMpIChhYmZkKTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9vX21hZ2ljIChhYmZkLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIGZpbGVfcHRyIHBvcyA9IGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemU7Ci0gIGJmZF92bWEgdm1hID0gMDsKLSAgaW50IHBhZCA9IDA7Ci0KLSAgLyogVGV4dC4gICovCi0gIG9ial90ZXh0c2VjKGFiZmQpLT5maWxlcG9zID0gcG9zOwotICBpZiAoIW9ial90ZXh0c2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgb2JqX3RleHRzZWMoYWJmZCktPnZtYSA9IHZtYTsKLSAgZWxzZQotICAgIHZtYSA9IG9ial90ZXh0c2VjKGFiZmQpLT52bWE7Ci0KLSAgcG9zICs9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIHZtYSArPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOwotCi0gIC8qIERhdGEuICAqLwotICBpZiAoIW9ial9kYXRhc2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgewotI2lmIDAJICAgIC8qID8/IERvZXMgYWxpZ25tZW50IGluIHRoZSBmaWxlIGltYWdlIHJlYWxseSBtYXR0ZXI/ICovCi0gICAgICBwYWQgPSBhbGlnbl9wb3dlciAodm1hLCBvYmpfZGF0YXNlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKSAtIHZtYTsKLSNlbmRpZgotICAgICAgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSArPSBwYWQ7Ci0gICAgICBwb3MgKz0gcGFkOwotICAgICAgdm1hICs9IHBhZDsKLSAgICAgIG9ial9kYXRhc2VjKGFiZmQpLT52bWEgPSB2bWE7Ci0gICAgfQotICBlbHNlCi0gICAgdm1hID0gb2JqX2RhdGFzZWMoYWJmZCktPnZtYTsKLSAgb2JqX2RhdGFzZWMoYWJmZCktPmZpbGVwb3MgPSBwb3M7Ci0gIHBvcyArPSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOwotICB2bWEgKz0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAvKiBCU1MuICAqLwotICBpZiAoIW9ial9ic3NzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICB7Ci0jaWYgMAotICAgICAgcGFkID0gYWxpZ25fcG93ZXIgKHZtYSwgb2JqX2Jzc3NlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKSAtIHZtYTsKLSNlbmRpZgotICAgICAgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSArPSBwYWQ7Ci0gICAgICBwb3MgKz0gcGFkOwotICAgICAgdm1hICs9IHBhZDsKLSAgICAgIG9ial9ic3NzZWMoYWJmZCktPnZtYSA9IHZtYTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGUgVk1BIG9mIHRoZSAuYnNzIHNlY3Rpb24gaXMgc2V0IGJ5IHRoZSB0aGUgVk1BIG9mIHRoZQotICAgICAgICAgLmRhdGEgc2VjdGlvbiBwbHVzIHRoZSBzaXplIG9mIHRoZSAuZGF0YSBzZWN0aW9uLiAgV2UgbWF5Ci0gICAgICAgICBuZWVkIHRvIGFkZCBwYWRkaW5nIGJ5dGVzIHRvIG1ha2UgdGhpcyB0cnVlLiAgKi8KLSAgICAgIHBhZCA9IG9ial9ic3NzZWMgKGFiZmQpLT52bWEgLSB2bWE7Ci0gICAgICBpZiAocGFkID4gMCkKLQl7Ci0JICBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSArPSBwYWQ7Ci0JICBwb3MgKz0gcGFkOwotCX0KLSAgICB9Ci0gIG9ial9ic3NzZWMoYWJmZCktPmZpbGVwb3MgPSBwb3M7Ci0KLSAgLyogRml4IHVwIHRoZSBleGVjIGhlYWRlci4gICovCi0gIGV4ZWNwLT5hX3RleHQgPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOwotICBleGVjcC0+YV9kYXRhID0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY3AtPmFfYnNzID0gb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplOwotICBOX1NFVF9NQUdJQyAoKmV4ZWNwLCBPTUFHSUMpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3pfbWFnaWMgKGFiZmQsIGV4ZWNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLXsKLSAgYmZkX3NpemVfdHlwZSBkYXRhX3BhZCwgdGV4dF9wYWQ7Ci0gIGZpbGVfcHRyIHRleHRfZW5kOwotICBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgKmFiZHA7Ci0gIGludCB6dGloOwkJCS8qIE5vbnplcm8gaWYgdGV4dCBpbmNsdWRlcyBleGVjIGhlYWRlci4gICovCi0gIAotICBhYmRwID0gYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpOwotCi0gIC8qIFRleHQuICAqLwotICB6dGloID0gKGFiZHAgIT0gTlVMTAotCSAgJiYgKGFiZHAtPnRleHRfaW5jbHVkZXNfaGVhZGVyCi0JICAgICAgfHwgb2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9PSBxX21hZ2ljX2Zvcm1hdCkpOwotICBvYmpfdGV4dHNlYyhhYmZkKS0+ZmlsZXBvcyA9ICh6dGloCi0JCQkJPyBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemUKLQkJCQk6IGFkYXRhKGFiZmQpLnptYWdpY19kaXNrX2Jsb2NrX3NpemUpOwotICBpZiAoISBvYmpfdGV4dHNlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIHsKLSAgICAgIC8qID8/IERvIHdlIHJlYWxseSBuZWVkIHRvIGNoZWNrIGZvciByZWxvY3MgaGVyZT8gICovCi0gICAgICBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hID0gKChhYmZkLT5mbGFncyAmIEhBU19SRUxPQykKLQkJCQk/IDAKLQkJCQk6ICh6dGloCi0JCQkJICAgPyAoYWJkcC0+ZGVmYXVsdF90ZXh0X3ZtYQotCQkJCSAgICAgICsgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplKQotCQkJCSAgIDogYWJkcC0+ZGVmYXVsdF90ZXh0X3ZtYSkpOwotICAgICAgdGV4dF9wYWQgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoZSAudGV4dCBzZWN0aW9uIGlzIGJlaW5nIGxvYWRlZCBhdCBhbiB1bnVzdWFsIGFkZHJlc3MuICBXZQotICAgICAgICAgbWF5IG5lZWQgdG8gcGFkIGl0IHN1Y2ggdGhhdCB0aGUgLmRhdGEgc2VjdGlvbiBzdGFydHMgYXQgYSBwYWdlCi0gICAgICAgICBib3VuZGFyeS4gICovCi0gICAgICBpZiAoenRpaCkKLQl0ZXh0X3BhZCA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zIC0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWEpCi0JCSAgICAmIChhZGF0YSAoYWJmZCkucGFnZV9zaXplIC0gMSkpOwotICAgICAgZWxzZQotCXRleHRfcGFkID0gKCgtIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hKQotCQkgICAgJiAoYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSAtIDEpKTsKLSAgICB9Ci0KLSAgLyogRmluZCBzdGFydCBvZiBkYXRhLiAgKi8KLSAgaWYgKHp0aWgpCi0gICAgewotICAgICAgdGV4dF9lbmQgPSBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgKyBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgICAgIHRleHRfcGFkICs9IEJGRF9BTElHTiAodGV4dF9lbmQsIGFkYXRhIChhYmZkKS5wYWdlX3NpemUpIC0gdGV4dF9lbmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTm90ZSB0aGF0IGlmIHBhZ2Vfc2l6ZSA9PSB6bWFnaWNfZGlza19ibG9ja19zaXplLCB0aGVuCi0JIGZpbGVwb3MgPT0gcGFnZV9zaXplLCBhbmQgdGhpcyBjYXNlIGlzIHRoZSBzYW1lIGFzIHRoZSB6dGloCi0JIGNhc2UuICAqLwotICAgICAgdGV4dF9lbmQgPSBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgICAgIHRleHRfcGFkICs9IEJGRF9BTElHTiAodGV4dF9lbmQsIGFkYXRhIChhYmZkKS5wYWdlX3NpemUpIC0gdGV4dF9lbmQ7Ci0gICAgICB0ZXh0X2VuZCArPSBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3M7Ci0gICAgfQotICBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplICs9IHRleHRfcGFkOwotICB0ZXh0X2VuZCArPSB0ZXh0X3BhZDsKLQotICAvKiBEYXRhLiAgKi8KLSAgaWYgKCFvYmpfZGF0YXNlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIHsKLSAgICAgIGJmZF92bWEgdm1hOwotICAgICAgdm1hID0gb2JqX3RleHRzZWMoYWJmZCktPnZtYSArIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gICAgICBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hID0gQkZEX0FMSUdOICh2bWEsIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSk7Ci0gICAgfQotICBpZiAoYWJkcCAmJiBhYmRwLT56bWFnaWNfbWFwcGVkX2NvbnRpZ3VvdXMpCi0gICAgewotICAgICAgdGV4dF9wYWQgPSAob2JqX2RhdGFzZWMoYWJmZCktPnZtYQotCQkgIC0gb2JqX3RleHRzZWMoYWJmZCktPnZtYQotCQkgIC0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSk7Ci0gICAgICBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplICs9IHRleHRfcGFkOwotICAgIH0KLSAgb2JqX2RhdGFzZWMoYWJmZCktPmZpbGVwb3MgPSAob2JqX3RleHRzZWMoYWJmZCktPmZpbGVwb3MKLQkJCQkrIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUpOwotICAKLSAgLyogRml4IHVwIGV4ZWMgaGVhZGVyIHdoaWxlIHdlJ3JlIGF0IGl0LiAgKi8KLSAgZXhlY3AtPmFfdGV4dCA9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGlmICh6dGloICYmICghYWJkcCB8fCAoYWJkcCAmJiAhYWJkcC0+ZXhlY19oZWFkZXJfbm90X2NvdW50ZWQpKSkKLSAgICBleGVjcC0+YV90ZXh0ICs9IGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKLSAgaWYgKG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPT0gcV9tYWdpY19mb3JtYXQpCi0gICAgTl9TRVRfTUFHSUMgKCpleGVjcCwgUU1BR0lDKTsKLSAgZWxzZQotICAgIE5fU0VUX01BR0lDICgqZXhlY3AsIFpNQUdJQyk7Ci0KLSAgLyogU3BlYyBzYXlzIGRhdGEgc2VjdGlvbiBzaG91bGQgYmUgcm91bmRlZCB1cCB0byBwYWdlIGJvdW5kYXJ5LiAgKi8KLSAgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZQotICAgID0gYWxpZ25fcG93ZXIgKG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JCSAgIG9ial9ic3NzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlcik7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBCRkRfQUxJR04gKG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JCQkgICAgIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSk7Ci0gIGRhdGFfcGFkID0gZXhlY3AtPmFfZGF0YSAtIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgLyogQlNTLiAgKi8KLSAgaWYgKCFvYmpfYnNzc2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgb2JqX2Jzc3NlYyhhYmZkKS0+dm1hID0gKG9ial9kYXRhc2VjKGFiZmQpLT52bWEKLQkJCSAgICAgKyBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplKTsKLSAgLyogSWYgdGhlIEJTUyBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBkYXRhIHNlY3Rpb24gYW5kIGV4dHJhIHNwYWNlCi0gICAgIGluIHRoZSBwYWdlIGlzIGxlZnQgYWZ0ZXIgdGhlIGRhdGEgc2VjdGlvbiwgZnVkZ2UgZGF0YQotICAgICBpbiB0aGUgaGVhZGVyIHNvIHRoYXQgdGhlIGJzcyBzZWN0aW9uIGxvb2tzIHNtYWxsZXIgYnkgdGhhdAotICAgICBhbW91bnQuICBXZSdsbCBzdGFydCB0aGUgYnNzIHNlY3Rpb24gdGhlcmUsIGFuZCBsaWUgdG8gdGhlIE9TLgotICAgICAoTm90ZSB0aGF0IGEgbGlua2VyIHNjcmlwdCwgYXMgd2VsbCBhcyB0aGUgYWJvdmUgYXNzaWdubWVudCwKLSAgICAgY291bGQgaGF2ZSBleHBsaWNpdGx5IHNldCB0aGUgQlNTIHZtYSB0byBpbW1lZGlhdGVseSBmb2xsb3cKLSAgICAgdGhlIGRhdGEgc2VjdGlvbi4pICAqLwotICBpZiAoYWxpZ25fcG93ZXIgKG9ial9ic3NzZWMoYWJmZCktPnZtYSwgb2JqX2Jzc3NlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKQotICAgICAgPT0gb2JqX2RhdGFzZWMoYWJmZCktPnZtYSArIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUpCi0gICAgZXhlY3AtPmFfYnNzID0gKGRhdGFfcGFkID4gb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplKSA/IDAgOgotICAgICAgb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplIC0gZGF0YV9wYWQ7Ci0gIGVsc2UKLSAgICBleGVjcC0+YV9ic3MgPSBvYmpfYnNzc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfbl9tYWdpYyAoYWJmZCwgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBmaWxlX3B0ciBwb3MgPSBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemU7Ci0gIGJmZF92bWEgdm1hID0gMDsKLSAgaW50IHBhZDsKLSAgCi0gIC8qIFRleHQuICAqLwotICBvYmpfdGV4dHNlYyhhYmZkKS0+ZmlsZXBvcyA9IHBvczsKLSAgaWYgKCFvYmpfdGV4dHNlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEgPSB2bWE7Ci0gIGVsc2UKLSAgICB2bWEgPSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hOwotICBwb3MgKz0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgdm1hICs9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgLyogRGF0YS4gICovCi0gIG9ial9kYXRhc2VjKGFiZmQpLT5maWxlcG9zID0gcG9zOwotICBpZiAoIW9ial9kYXRhc2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgb2JqX2RhdGFzZWMoYWJmZCktPnZtYSA9IEJGRF9BTElHTiAodm1hLCBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUpOwotICB2bWEgPSBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hOwotICAKLSAgLyogU2luY2UgQlNTIGZvbGxvd3MgZGF0YSBpbW1lZGlhdGVseSwgc2VlIGlmIGl0IG5lZWRzIGFsaWdubWVudC4gICovCi0gIHZtYSArPSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOwotICBwYWQgPSBhbGlnbl9wb3dlciAodm1hLCBvYmpfYnNzc2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpIC0gdm1hOwotICBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplICs9IHBhZDsKLSAgcG9zICs9IG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgLyogQlNTLiAgKi8KLSAgaWYgKCFvYmpfYnNzc2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgb2JqX2Jzc3NlYyhhYmZkKS0+dm1hID0gdm1hOwotICBlbHNlCi0gICAgdm1hID0gb2JqX2Jzc3NlYyhhYmZkKS0+dm1hOwotCi0gIC8qIEZpeCB1cCBleGVjIGhlYWRlci4gICovCi0gIGV4ZWNwLT5hX3RleHQgPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOwotICBleGVjcC0+YV9kYXRhID0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY3AtPmFfYnNzID0gb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplOwotICBOX1NFVF9NQUdJQyAoKmV4ZWNwLCBOTUFHSUMpOwotfQotCi1ib29sZWFuCi1OQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgdGV4dF9zaXplLCB0ZXh0X2VuZCkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfc2l6ZV90eXBlICp0ZXh0X3NpemU7Ci0gICAgIGZpbGVfcHRyICp0ZXh0X2VuZDsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIGlmICghIE5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhZGF0YShhYmZkKS5tYWdpYyAhPSB1bmRlY2lkZWRfbWFnaWMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSA9Ci0gICAgYWxpZ25fcG93ZXIob2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkJb2JqX3RleHRzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlcik7Ci0KLSAgKnRleHRfc2l6ZSA9IG9ial90ZXh0c2VjIChhYmZkKS0+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+YV9kcnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpCi0JICAgICAgICsgMSkpOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCi0gICAgcmV0dXJuIChzaXplb2YgKGFyZWxlbnQgKikKLQkgICAgKiAoKGV4ZWNfaGRyKGFiZmQpLT5hX3Ryc2l6ZSAvIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSkKLQkgICAgICAgKyAxKSk7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHJldHVybiBzaXplb2YgKGFyZWxlbnQgKik7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHJldHVybiAwOwotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiAtMTsKLX0KLQotDAotbG9uZwotTkFNRShhb3V0LGdldF9zeW10YWJfdXBwZXJfYm91bmQpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmICghTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkrMSkgKiAoc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlICopKTsKLX0KLQotLypBUkdTVVNFRCovCi0gYWxlbnQgKgotTkFNRShhb3V0LGdldF9saW5lbm8pIChpZ25vcmVfYWJmZCwgaWdub3JlX3N5bWJvbCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgYXN5bWJvbCAqaWdub3JlX3N5bWJvbDsKLXsKLXJldHVybiAoYWxlbnQgKilOVUxMOwotfQotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLU5BTUUoYW91dCxnZXRfc3ltYm9sX2luZm8pIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci0KLSAgaWYgKHJldC0+dHlwZSA9PSAnPycpCi0gICAgewotICAgICAgaW50IHR5cGVfY29kZSA9IGFvdXRfc3ltYm9sKHN5bWJvbCktPnR5cGUgJiAweGZmOwotICAgICAgY29uc3QgY2hhciAqc3RhYl9uYW1lID0gYmZkX2dldF9zdGFiX25hbWUgKHR5cGVfY29kZSk7Ci0gICAgICBzdGF0aWMgY2hhciBidWZbMTBdOwotCi0gICAgICBpZiAoc3RhYl9uYW1lID09IE5VTEwpCi0JewotCSAgc3ByaW50ZihidWYsICIoJWQpIiwgdHlwZV9jb2RlKTsKLQkgIHN0YWJfbmFtZSA9IGJ1ZjsKLQl9Ci0gICAgICByZXQtPnR5cGUgPSAnLSc7Ci0gICAgICByZXQtPnN0YWJfdHlwZSA9IHR5cGVfY29kZTsKLSAgICAgIHJldC0+c3RhYl9vdGhlciA9ICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+b3RoZXIgJiAweGZmKTsKLSAgICAgIHJldC0+c3RhYl9kZXNjID0gKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT5kZXNjICYgMHhmZmZmKTsKLSAgICAgIHJldC0+c3RhYl9uYW1lID0gc3RhYl9uYW1lOwotICAgIH0KLX0KLQotLypBUkdTVVNFRCovCi12b2lkCi1OQU1FKGFvdXQscHJpbnRfc3ltYm9sKSAoaWdub3JlX2FiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgUFRSIGFmaWxlOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKWFmaWxlOwotCi0gIHN3aXRjaCAoaG93KSB7Ci0gIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgIGlmIChzeW1ib2wtPm5hbWUpCi0gICAgICBmcHJpbnRmKGZpbGUsIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgZnByaW50ZihmaWxlLCIlNHggJTJ4ICUyeCIsKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT5kZXNjICYgMHhmZmZmKSwKLQkgICAgKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT5vdGhlciAmIDB4ZmYpLAotCSAgICAodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPnR5cGUpKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICB7Ci0gICBDT05TVCBjaGFyICpzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24tPm5hbWU7Ci0KLQotICAgICAgYmZkX3ByaW50X3N5bWJvbF92YW5kZigoUFRSKWZpbGUsc3ltYm9sKTsKLQotICAgICAgZnByaW50ZihmaWxlLCIgJS01cyAlMDR4ICUwMnggJTAyeCIsCi0JICAgICAgc2VjdGlvbl9uYW1lLAotCSAgICAgICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+ZGVzYyAmIDB4ZmZmZiksCi0JICAgICAgKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT5vdGhlciAmIDB4ZmYpLAotCSAgICAgICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+dHlwZSAgJiAweGZmKSk7Ci0gICAgICBpZiAoc3ltYm9sLT5uYW1lKQotICAgICAgICBmcHJpbnRmKGZpbGUsIiAlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIElmIHdlIGRvbid0IGhhdmUgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIDFNQiB0byBob2xkIHRoZSBnZW5lcmljCi0gICBzeW1ib2xzLCB3ZSB1c2UgdGhlIGdlbmVyaWMgbWluaXN5bWJvbCBtZXRob3JkOiBpdCdzIGZhc3Rlciwgc2luY2UKLSAgIGl0IG9ubHkgdHJhbnNsYXRlcyB0aGUgc3ltYm9scyBvbmNlLCBub3QgbXVsdGlwbGUgdGltZXMuICAqLwotI2RlZmluZSBNSU5JU1lNX1RIUkVTSE9MRCAoMTAwMDAwMCAvIHNpemVvZiAoYXN5bWJvbCkpCi0KLS8qIFJlYWQgbWluaXN5bWJvbHMuICBGb3IgbWluaXN5bWJvbHMsIHdlIHVzZSB0aGUgdW5tb2RpZmllZCBhLm91dAotICAgc3ltYm9scy4gIFRoZSBtaW5pc3ltYm9sX3RvX3N5bWJvbCBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZXNlIGludG8KLSAgIEJGRCBhc3ltYm9sIHN0cnVjdHVyZXMuICAqLwotCi1sb25nCi1OQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zcCwgc2l6ZXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBQVFIgKm1pbmlzeW1zcDsKLSAgICAgdW5zaWduZWQgaW50ICpzaXplcDsKLXsKLSAgaWYgKGR5bmFtaWMpCi0gICAgewotICAgICAgLyogV2UgY291bGQgaGFuZGxlIHRoZSBkeW5hbWljIHN5bWJvbHMgaGVyZSBhcyB3ZWxsLCBidXQgaXQncwotICAgICAgICAgZWFzaWVyIHRvIGhhbmQgdGhlbSBvZmYuICAqLwotICAgICAgcmV0dXJuIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsIHNpemVwKTsKLSAgICB9Ci0KLSAgaWYgKCEgYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpIDwgTUlOSVNZTV9USFJFU0hPTEQpCi0gICAgcmV0dXJuIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsIHNpemVwKTsKLQotICAqbWluaXN5bXNwID0gKFBUUikgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0KLSAgLyogQnkgcGFzc2luZyB0aGUgZXh0ZXJuYWwgc3ltYm9scyBiYWNrIGZyb20gdGhpcyByb3V0aW5lLCB3ZSBhcmUKLSAgICAgZ2l2aW5nIHVwIGNvbnRyb2wgb3ZlciB0aGUgbWVtb3J5IGJsb2NrLiAgQ2xlYXIKLSAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcywgc28gdGhhdCB3ZSBkbyBub3QgdHJ5IHRvIGZyZWUgaXQKLSAgICAgb3Vyc2VsdmVzLiAgKi8KLSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPSBOVUxMOwotCi0gICpzaXplcCA9IEVYVEVSTkFMX05MSVNUX1NJWkU7Ci0gIHJldHVybiBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpOwotfQotCi0vKiBDb252ZXJ0IGEgbWluaXN5bWJvbCB0byBhIEJGRCBhc3ltYm9sLiAgQSBtaW5pc3ltYm9sIGlzIGp1c3QgYW4KLSAgIHVubW9kaWZpZWQgYS5vdXQgc3ltYm9sLiAgVGhlIFNZTSBhcmd1bWVudCBpcyBhIHN0cnVjdHVyZSByZXR1cm5lZAotICAgYnkgYmZkX21ha2VfZW1wdHlfc3ltYm9sLCB3aGljaCB3ZSBmaWxsIGluIGhlcmUuICAqLwotCi1hc3ltYm9sICoKLU5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW0sIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIGNvbnN0IFBUUiBtaW5pc3ltOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIGlmIChkeW5hbWljCi0gICAgICB8fCBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpIDwgTUlOSVNZTV9USFJFU0hPTEQpCi0gICAgcmV0dXJuIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgbWluaXN5bSwgc3ltKTsKLQotICBtZW1zZXQgKHN5bSwgMCwgc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlKSk7Ci0KLSAgLyogV2UgY2FsbCB0cmFuc2xhdGVfc3ltYm9sX3RhYmxlIHRvIHRyYW5zbGF0ZSBhIHNpbmdsZSBzeW1ib2wuICAqLwotICBpZiAoISAoTkFNRShhb3V0LHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpCi0JIChhYmZkLAotCSAgKGFvdXRfc3ltYm9sX3R5cGUgKikgc3ltLAotCSAgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBtaW5pc3ltLAotCSAgKGJmZF9zaXplX3R5cGUpIDEsCi0JICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSwKLQkgIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ19zaXplIChhYmZkKSwKLQkgIGZhbHNlKSkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIHN5bTsKLX0KLQotLyoKLSBwcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiwgY2FsY3VsYXRlCi0gYW5kIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgYW5kIHRoZSBsaW5lIG5lYXJlc3QgdG8gdGhlCi0gd2FudGVkIGxvY2F0aW9uLgotKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKQotICAgICAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIENPTlNUIGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyOwotewotICAvKiBSdW4gZG93biB0aGUgZmlsZSBsb29raW5nIGZvciB0aGUgZmlsZW5hbWUsIGZ1bmN0aW9uIGFuZCBsaW5lbnVtYmVyICovCi0gIGFzeW1ib2wgKipwOwotICBDT05TVCBjaGFyICpkaXJlY3RvcnlfbmFtZSA9IE5VTEw7Ci0gIENPTlNUIGNoYXIgKm1haW5fZmlsZV9uYW1lID0gTlVMTDsKLSAgQ09OU1QgY2hhciAqY3VycmVudF9maWxlX25hbWUgPSBOVUxMOwotICBDT05TVCBjaGFyICpsaW5lX2ZpbGVfbmFtZSA9IE5VTEw7IC8qIFZhbHVlIG9mIGN1cnJlbnRfZmlsZV9uYW1lIGF0IGxpbmUgbnVtYmVyLiAqLwotICBDT05TVCBjaGFyICpsaW5lX2RpcmVjdG9yeV9uYW1lID0gTlVMTDsgLyogVmFsdWUgb2YgZGlyZWN0b3J5X25hbWUgYXQgbGluZSBudW1iZXIuICovCi0gIGJmZF92bWEgbG93X2xpbmVfdm1hID0gMDsKLSAgYmZkX3ZtYSBsb3dfZnVuY192bWEgPSAwOwotICBhc3ltYm9sICpmdW5jID0gMDsKLSAgc2l6ZV90IGZpbGVsZW4sIGZ1bmNsZW47Ci0gIGNoYXIgKmJ1ZjsKLQotICAqZmlsZW5hbWVfcHRyID0gYWJmZC0+ZmlsZW5hbWU7Ci0gICpmdW5jdGlvbm5hbWVfcHRyID0gMDsKLSAgKmxpbmVfcHRyID0gMDsKLSAgaWYgKHN5bWJvbHMgIT0gKGFzeW1ib2wgKiopTlVMTCkgewotICAgIGZvciAocCA9IHN5bWJvbHM7ICpwOyBwKyspIHsKLSAgICAgIGFvdXRfc3ltYm9sX3R5cGUgICpxID0gKGFvdXRfc3ltYm9sX3R5cGUgKikoKnApOwotICAgIG5leHQ6Ci0gICAgICBzd2l0Y2ggKHEtPnR5cGUpewotICAgICAgY2FzZSBOX1RFWFQ6Ci0JLyogSWYgdGhpcyBsb29rcyBsaWtlIGEgZmlsZSBuYW1lIHN5bWJvbCwgYW5kIGl0IGNvbWVzIGFmdGVyCi0gICAgICAgICAgIHRoZSBsaW5lIG51bWJlciB3ZSBoYXZlIGZvdW5kIHNvIGZhciwgYnV0IGJlZm9yZSB0aGUKLSAgICAgICAgICAgb2Zmc2V0LCB0aGVuIHdlIGhhdmUgcHJvYmFibHkgbm90IGZvdW5kIHRoZSByaWdodCBsaW5lCi0gICAgICAgICAgIG51bWJlci4gICovCi0JaWYgKHEtPnN5bWJvbC52YWx1ZSA8PSBvZmZzZXQKLQkgICAgJiYgKChxLT5zeW1ib2wudmFsdWUgPiBsb3dfbGluZV92bWEKLQkJICYmIChsaW5lX2ZpbGVfbmFtZSAhPSBOVUxMCi0JCSAgICAgfHwgKmxpbmVfcHRyICE9IDApKQotCQl8fCAocS0+c3ltYm9sLnZhbHVlID4gbG93X2Z1bmNfdm1hCi0JCSAgICAmJiBmdW5jICE9IE5VTEwpKSkKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqc3ltbmFtZTsKLQotCSAgICBzeW1uYW1lID0gcS0+c3ltYm9sLm5hbWU7Ci0JICAgIGlmIChzdHJjbXAgKHN5bW5hbWUgKyBzdHJsZW4gKHN5bW5hbWUpIC0gMiwgIi5vIikgPT0gMCkKLQkgICAgICB7Ci0JCWlmIChxLT5zeW1ib2wudmFsdWUgPiBsb3dfbGluZV92bWEpCi0JCSAgewotCQkgICAgKmxpbmVfcHRyID0gMDsKLQkJICAgIGxpbmVfZmlsZV9uYW1lID0gTlVMTDsKLQkJICB9Ci0JCWlmIChxLT5zeW1ib2wudmFsdWUgPiBsb3dfZnVuY192bWEpCi0JCSAgZnVuYyA9IE5VTEw7Ci0JICAgICAgfQotCSAgfQotCWJyZWFrOwotCi0gICAgICBjYXNlIE5fU086Ci0JLyogSWYgdGhpcyBzeW1ib2wgaXMgbGVzcyB0aGFuIHRoZSBvZmZzZXQsIGJ1dCBncmVhdGVyIHRoYW4KLSAgICAgICAgICAgdGhlIGxpbmUgbnVtYmVyIHdlIGhhdmUgZm91bmQgc28gZmFyLCB0aGVuIHdlIGhhdmUgbm90Ci0gICAgICAgICAgIGZvdW5kIHRoZSByaWdodCBsaW5lIG51bWJlci4gICovCi0JaWYgKHEtPnN5bWJvbC52YWx1ZSA8PSBvZmZzZXQpCi0JICB7Ci0JICAgIGlmIChxLT5zeW1ib2wudmFsdWUgPiBsb3dfbGluZV92bWEpCi0JICAgICAgewotCQkqbGluZV9wdHIgPSAwOwotCQlsaW5lX2ZpbGVfbmFtZSA9IE5VTEw7Ci0JICAgICAgfQotCSAgICBpZiAocS0+c3ltYm9sLnZhbHVlID4gbG93X2Z1bmNfdm1hKQotCSAgICAgIGZ1bmMgPSBOVUxMOwotCSAgfQotCi0JbWFpbl9maWxlX25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZSA9IHEtPnN5bWJvbC5uYW1lOwotCS8qIExvb2sgYWhlYWQgdG8gbmV4dCBzeW1ib2wgdG8gY2hlY2sgaWYgdGhhdCB0b28gaXMgYW4gTl9TTy4gKi8KLQlwKys7Ci0JaWYgKCpwID09IE5VTEwpCi0JICBicmVhazsKLQlxID0gKGFvdXRfc3ltYm9sX3R5cGUgKikoKnApOwotCWlmIChxLT50eXBlICE9IChpbnQpTl9TTykKLQkgIGdvdG8gbmV4dDsKLQotCS8qIEZvdW5kIGEgc2Vjb25kIE5fU08gIEZpcnN0IGlzIGRpcmVjdG9yeTsgc2Vjb25kIGlzIGZpbGVuYW1lLiAqLwotCWRpcmVjdG9yeV9uYW1lID0gY3VycmVudF9maWxlX25hbWU7Ci0JbWFpbl9maWxlX25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZSA9IHEtPnN5bWJvbC5uYW1lOwotCWlmIChvYmpfdGV4dHNlYyhhYmZkKSAhPSBzZWN0aW9uKQotCSAgZ290byBkb25lOwotCWJyZWFrOwotICAgICAgY2FzZSBOX1NPTDoKLQljdXJyZW50X2ZpbGVfbmFtZSA9IHEtPnN5bWJvbC5uYW1lOwotCWJyZWFrOwotCi0gICAgICBjYXNlIE5fU0xJTkU6Ci0KLSAgICAgIGNhc2UgTl9EU0xJTkU6Ci0gICAgICBjYXNlIE5fQlNMSU5FOgotCS8qIFdlJ2xsIGtlZXAgdGhpcyBpZiBpdCByZXNvbHZlcyBuZWFyZXIgdGhhbiB0aGUgb25lIHdlIGhhdmUKLSAgICAgICAgICAgYWxyZWFkeS4gICovCi0JaWYgKHEtPnN5bWJvbC52YWx1ZSA+PSBsb3dfbGluZV92bWEKLQkgICAgJiYgcS0+c3ltYm9sLnZhbHVlIDw9IG9mZnNldCkKLQkgIHsKLQkgICAgKmxpbmVfcHRyID0gcS0+ZGVzYzsKLQkgICAgbG93X2xpbmVfdm1hID0gcS0+c3ltYm9sLnZhbHVlOwotCSAgICBsaW5lX2ZpbGVfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lOwotCSAgICBsaW5lX2RpcmVjdG9yeV9uYW1lID0gZGlyZWN0b3J5X25hbWU7Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE5fRlVOOgotCXsKLQkgIC8qIFdlJ2xsIGtlZXAgdGhpcyBpZiBpdCBpcyBuZWFyZXIgdGhhbiB0aGUgb25lIHdlIGhhdmUgYWxyZWFkeSAqLwotCSAgaWYgKHEtPnN5bWJvbC52YWx1ZSA+PSBsb3dfZnVuY192bWEgJiYKLQkgICAgICBxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0KSB7Ci0JICAgIGxvd19mdW5jX3ZtYSA9IHEtPnN5bWJvbC52YWx1ZTsKLQkgICAgZnVuYyA9IChhc3ltYm9sICopcTsKLQkgIH0KLQkgIGVsc2UgaWYgKHEtPnN5bWJvbC52YWx1ZSA+IG9mZnNldCkKLQkgICAgZ290byBkb25lOwotCX0KLQlicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotIGRvbmU6Ci0gIGlmICgqbGluZV9wdHIgIT0gMCkKLSAgICB7Ci0gICAgICBtYWluX2ZpbGVfbmFtZSA9IGxpbmVfZmlsZV9uYW1lOwotICAgICAgZGlyZWN0b3J5X25hbWUgPSBsaW5lX2RpcmVjdG9yeV9uYW1lOwotICAgIH0KLQotICBpZiAobWFpbl9maWxlX25hbWUgPT0gTlVMTAotICAgICAgfHwgbWFpbl9maWxlX25hbWVbMF0gPT0gJy8nCi0gICAgICB8fCBkaXJlY3RvcnlfbmFtZSA9PSBOVUxMKQotICAgIGZpbGVsZW4gPSAwOwotICBlbHNlCi0gICAgZmlsZWxlbiA9IHN0cmxlbiAoZGlyZWN0b3J5X25hbWUpICsgc3RybGVuIChtYWluX2ZpbGVfbmFtZSk7Ci0gIGlmIChmdW5jID09IE5VTEwpCi0gICAgZnVuY2xlbiA9IDA7Ci0gIGVsc2UKLSAgICBmdW5jbGVuID0gc3RybGVuIChiZmRfYXN5bWJvbF9uYW1lIChmdW5jKSk7Ci0KLSAgaWYgKGFkYXRhIChhYmZkKS5saW5lX2J1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGFkYXRhIChhYmZkKS5saW5lX2J1Zik7Ci0gIGlmIChmaWxlbGVuICsgZnVuY2xlbiA9PSAwKQotICAgIGFkYXRhIChhYmZkKS5saW5lX2J1ZiA9IGJ1ZiA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBidWYgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChmaWxlbGVuICsgZnVuY2xlbiArIDMpOwotICAgICAgYWRhdGEgKGFiZmQpLmxpbmVfYnVmID0gYnVmOwotICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG1haW5fZmlsZV9uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKG1haW5fZmlsZV9uYW1lWzBdID09ICcvJyB8fCBkaXJlY3RvcnlfbmFtZSA9PSBOVUxMKQotCSpmaWxlbmFtZV9wdHIgPSBtYWluX2ZpbGVfbmFtZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzcHJpbnRmIChidWYsICIlcyVzIiwgZGlyZWN0b3J5X25hbWUsIG1haW5fZmlsZV9uYW1lKTsKLQkgICpmaWxlbmFtZV9wdHIgPSBidWY7Ci0JICBidWYgKz0gZmlsZWxlbiArIDE7Ci0JfQotICAgIH0KLQotICBpZiAoZnVuYykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpmdW5jdGlvbiA9IGZ1bmMtPm5hbWU7Ci0gICAgICBjaGFyICpwOwotCi0gICAgICAvKiBUaGUgY2FsbGVyIGV4cGVjdHMgYSBzeW1ib2wgbmFtZS4gIFdlIGFjdHVhbGx5IGhhdmUgYQotCSBmdW5jdGlvbiBuYW1lLCB3aXRob3V0IHRoZSBsZWFkaW5nIHVuZGVyc2NvcmUuICBQdXQgdGhlCi0JIHVuZGVyc2NvcmUgYmFjayBpbiwgc28gdGhhdCB0aGUgY2FsbGVyIGdldHMgYSBzeW1ib2wgbmFtZS4gICovCi0gICAgICBpZiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSA9PSAnXDAnKQotCXN0cmNweSAoYnVmLCBmdW5jdGlvbik7Ci0gICAgICBlbHNlCi0JewotCSAgYnVmWzBdID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKTsKLQkgIHN0cmNweSAoYnVmICsgMSwgZnVuY3Rpb24pOwotCX0KLSAgICAgIC8qIEhhdmUgdG8gcmVtb3ZlIDogc3R1ZmYgKi8KLSAgICAgIHAgPSBzdHJjaHIgKGJ1ZiwgJzonKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JKnAgPSAnXDAnOwotICAgICAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBidWY7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKkFSR1NVU0VEKi8KLWludAotTkFNRShhb3V0LHNpemVvZl9oZWFkZXJzKSAoYWJmZCwgZXhlY2FibGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjYWJsZTsKLXsKLSAgcmV0dXJuIGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKLX0KLQotLyogRnJlZSBhbGwgaW5mb3JtYXRpb24gd2UgaGF2ZSBjYWNoZWQgZm9yIHRoaXMgQkZELiAgV2UgY2FuIGFsd2F5cwotICAgcmVhZCBpdCBhZ2FpbiBsYXRlciBpZiB3ZSBuZWVkIGl0LiAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqbzsKLQotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSNkZWZpbmUgQkZDSV9GUkVFKHgpIGlmICh4ICE9IE5VTEwpIHsgZnJlZSAoeCk7IHggPSBOVUxMOyB9Ci0gIEJGQ0lfRlJFRSAob2JqX2FvdXRfc3ltYm9scyAoYWJmZCkpOwotI2lmZGVmIFVTRV9NTUFQCi0gIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gMDsKLSAgYmZkX2ZyZWVfd2luZG93ICgmb2JqX2FvdXRfc3ltX3dpbmRvdyAoYWJmZCkpOwotICBiZmRfZnJlZV93aW5kb3cgKCZvYmpfYW91dF9zdHJpbmdfd2luZG93IChhYmZkKSk7Ci0gIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpID0gMDsKLSNlbHNlCi0gIEJGQ0lfRlJFRSAob2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpOwotICBCRkNJX0ZSRUUgKG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpKTsKLSNlbmRpZgotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgQkZDSV9GUkVFIChvLT5yZWxvY2F0aW9uKTsKLSN1bmRlZiBCRkNJX0ZSRUUKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIGEub3V0IGxpbmsgY29kZS4gICovCi0KLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2ZyZWVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKnBuZWVkZWQpKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBhLm91dCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPndyaXR0ZW4gPSBmYWxzZTsKLSAgICAgIHJldC0+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+cmVsX2ZpbGVwb3MpKSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHZXQgdGhlIHNlY3Rpb24gY29ycmVzcG9uZGluZyB0byBhIHJlbG9jIGluZGV4LiAgKi8KLQotc3RhdGljIElOTElORSBhc2VjdGlvbiAqCi1hb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24gKGFiZmQsIGluZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGluZHg7Ci17Ci0gIHN3aXRjaCAoaW5keCAmIE5fVFlQRSkKLSAgICB7Ci0gICAgY2FzZSBOX1RFWFQ6Ci0gICAgICByZXR1cm4gb2JqX3RleHRzZWMgKGFiZmQpOwotICAgIGNhc2UgTl9EQVRBOgotICAgICAgcmV0dXJuIG9ial9kYXRhc2VjIChhYmZkKTsKLSAgICBjYXNlIE5fQlNTOgotICAgICAgcmV0dXJuIG9ial9ic3NzZWMgKGFiZmQpOwotICAgIGNhc2UgTl9BQlM6Ci0gICAgY2FzZSBOX1VOREY6Ci0gICAgICByZXR1cm4gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0vKiBSZWxvY2F0ZSBhbiBhLm91dCBzZWN0aW9uIHVzaW5nIHN0YW5kYXJkIGEub3V0IHJlbG9jcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQgKGZpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jcywKLQkJCSAgICAgcmVsX3NpemUsIGNvbnRlbnRzKQotICAgICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbG9jczsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotewotICBib29sZWFuICgqY2hlY2tfZHluYW1pY19yZWxvYykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICBiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwKLQkJCQkJICBQVFIsIGJmZF9ieXRlICosIGJvb2xlYW4gKiwKLQkJCQkJICBiZmRfdm1hICopKTsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1zOwotICBjaGFyICpzdHJpbmdzOwotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBpbnQgKnN5bWJvbF9tYXA7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2NfY291bnQ7Ci0gIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbDsKLSAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsX2VuZDsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIGNoZWNrX2R5bmFtaWNfcmVsb2MgPSBhb3V0X2JhY2tlbmRfaW5mbyAob3V0cHV0X2JmZCktPmNoZWNrX2R5bmFtaWNfcmVsb2M7Ci0KLSAgQkZEX0FTU0VSVCAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGlucHV0X2JmZCkgPT0gUkVMT0NfU1REX1NJWkUpOwotICBCRkRfQVNTRVJUIChpbnB1dF9iZmQtPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIKLQkgICAgICA9PSBvdXRwdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyKTsKLQotICByZWxvY2F0ZWFibGUgPSBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlOwotICBzeW1zID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKTsKLSAgc3RyaW5ncyA9IG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGlucHV0X2JmZCk7Ci0gIHN5bV9oYXNoZXMgPSBvYmpfYW91dF9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBzeW1ib2xfbWFwID0gZmluZm8tPnN5bWJvbF9tYXA7Ci0KLSAgcmVsb2NfY291bnQgPSByZWxfc2l6ZSAvIFJFTE9DX1NURF9TSVpFOwotICByZWwgPSByZWxvY3M7Ci0gIHJlbF9lbmQgPSByZWwgKyByZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgcl9hZGRyOwotICAgICAgaW50IHJfaW5kZXg7Ci0gICAgICBpbnQgcl9leHRlcm47Ci0gICAgICBpbnQgcl9wY3JlbDsKLSAgICAgIGludCByX2Jhc2VyZWwgPSAwOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfYWRkciA9IEdFVF9TV09SRCAoaW5wdXRfYmZkLCByZWwtPnJfYWRkcmVzcyk7Ci0KLSNpZmRlZiBNWV9yZWxvY19ob3d0bwotICAgICAgaG93dG8gPSBNWV9yZWxvY19ob3d0byhpbnB1dF9iZmQsIHJlbCwgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpOwotI2Vsc2UgICAgICAKLSAgICAgIHsKLQlpbnQgcl9qbXB0YWJsZTsKLQlpbnQgcl9yZWxhdGl2ZTsKLQlpbnQgcl9sZW5ndGg7Ci0JdW5zaWduZWQgaW50IGhvd3RvX2lkeDsKLQotCWlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JICB7Ci0JICAgIHJfaW5kZXggICA9ICAoKHJlbC0+cl9pbmRleFswXSA8PCAxNikKLQkJCSAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCQkgIHwgcmVsLT5yX2luZGV4WzJdKTsKLQkgICAgcl9leHRlcm4gID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRykpOwotCSAgICByX3BjcmVsICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcpKTsKLQkgICAgcl9iYXNlcmVsID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcpKTsKLQkgICAgcl9qbXB0YWJsZT0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHKSk7Ci0JICAgIHJfcmVsYXRpdmU9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRykpOwotCSAgICByX2xlbmd0aCAgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRykKLQkJCSA+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIHJfaW5kZXggICA9ICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkJIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkJIHwgcmVsLT5yX2luZGV4WzBdKTsKLQkgICAgcl9leHRlcm4gID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSkpOwotCSAgICByX3BjcmVsICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLQkgICAgcl9iYXNlcmVsID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdCi0JCQkgICAgICAgJiBSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRSkpOwotCSAgICByX2ptcHRhYmxlPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0KLQkJCSAgICAgICAmIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSkpOwotCSAgICByX3JlbGF0aXZlPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0KLQkJCSAgICAgICAmIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRSkpOwotCSAgICByX2xlbmd0aCAgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRSkKLQkJCSA+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKTsKLQkgIH0KLQotCWhvd3RvX2lkeCA9IChyX2xlbmd0aCArIDQgKiByX3BjcmVsICsgOCAqIHJfYmFzZXJlbAotCQkgICAgICsgMTYgKiByX2ptcHRhYmxlICsgMzIgKiByX3JlbGF0aXZlKTsKLQlCRkRfQVNTRVJUIChob3d0b19pZHggPCBUQUJMRV9TSVpFIChob3d0b190YWJsZV9zdGQpKTsKLQlob3d0byA9IGhvd3RvX3RhYmxlX3N0ZCArIGhvd3RvX2lkeDsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICBpZiAocmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlLCBhbmQgbXVzdAotCSAgICAgbW9kaWZ5IHRoZSByZWxvYyBhY2NvcmRpbmdseS4gICovCi0JICBpZiAocl9leHRlcm4pCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBrbm93IHRoZSBzeW1ib2wgdGhpcyByZWxvY2F0aW9uIGlzIGFnYWluc3QsCi0JCSBjb252ZXJ0IGl0IGludG8gYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgVGhpcwotCQkgaXMgd2hhdCB0aGUgbmF0aXZlIGxpbmtlciBkb2VzLiAgKi8KLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX2luZGV4XTsKLQkgICAgICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJewotCQkgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQotCQkgIC8qIENoYW5nZSB0aGUgcl9leHRlcm4gdmFsdWUuICAqLwotCQkgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKG91dHB1dF9iZmQpKQotCQkgICAgcmVsLT5yX3R5cGVbMF0gJj1+IFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUc7Ci0JCSAgZWxzZQotCQkgICAgcmVsLT5yX3R5cGVbMF0gJj1+IFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEU7Ci0KLQkJICAvKiBDb21wdXRlIGEgbmV3IHJfaW5kZXguICAqLwotCQkgIG91dHB1dF9zZWN0aW9uID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQkJICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX3RleHRzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgcl9pbmRleCA9IE5fVEVYVDsKLQkJICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfZGF0YXNlYyAob3V0cHV0X2JmZCkpCi0JCSAgICByX2luZGV4ID0gTl9EQVRBOwotCQkgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9ic3NzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgcl9pbmRleCA9IE5fQlNTOwotCQkgIGVsc2UKLQkJICAgIHJfaW5kZXggPSBOX0FCUzsKLQotCQkgIC8qIEFkZCB0aGUgc3ltYm9sIHZhbHVlIGFuZCB0aGUgc2VjdGlvbiBWTUEgdG8gdGhlCi0JCSAgICAgYWRkZW5kIHN0b3JlZCBpbiB0aGUgY29udGVudHMuICAqLwotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgb3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFdlIG11c3QgY2hhbmdlIHJfaW5kZXggYWNjb3JkaW5nIHRvIHRoZSBzeW1ib2wKLQkJICAgICBtYXAuICAqLwotCQkgIHJfaW5kZXggPSBzeW1ib2xfbWFwW3JfaW5kZXhdOwotCi0JCSAgaWYgKHJfaW5kZXggPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChoICE9IE5VTEwpCi0JCQl7Ci0JCQkgIC8qIFdlIGRlY2lkZWQgdG8gc3RyaXAgdGhpcyBzeW1ib2wsIGJ1dCBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJucyBvdXQgdGhhdCB3ZSBjYW4ndC4gIE5vdGUgdGhhdCB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NlIHRoZSBvdGhlciBhbmQgZGVzYyBpbmZvcm1hdGlvbiBoZXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIGRvbid0IHRoaW5rIHRoYXQgd2lsbCBldmVyIG1hdHRlciBmb3IgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sLiAgKi8KLQkJCSAgaWYgKGgtPmluZHggPCAwKQotCQkJICAgIHsKLQkJCSAgICAgIGgtPmluZHggPSAtMjsKLQkJCSAgICAgIGgtPndyaXR0ZW4gPSBmYWxzZTsKLQkJCSAgICAgIGlmICghIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wgKGgsCi0JCQkJCQkJCSAgKFBUUikgZmluZm8pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCSAgICB9Ci0JCQkgIHJfaW5kZXggPSBoLT5pbmR4OwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJCSAgbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLAotCQkJCQkJICAgICBzeW1zW3JfaW5kZXhdLmVfc3RyeCk7Ci0JCQkgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkJIChmaW5mby0+aW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgcl9hZGRyKSkpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJICByX2luZGV4ID0gMDsKLQkJCX0KLQkJICAgIH0KLQotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0KLQkgICAgICAvKiBXcml0ZSBvdXQgdGhlIG5ldyByX2luZGV4IHZhbHVlLiAgKi8KLQkgICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkJewotCQkgIHJlbC0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0JCSAgcmVsLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotCQkgIHJlbC0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICByZWwtPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotCQkgIHJlbC0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkJICByZWwtPnJfaW5kZXhbMF0gPSByX2luZGV4OwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotCi0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHNlY3Rpb24uICBXZSBtdXN0Ci0JCSBhZGp1c3QgYnkgdGhlIGFtb3VudCB0aGF0IHRoZSBzZWN0aW9uIG1vdmVkLiAgKi8KLQkgICAgICBzZWN0aW9uID0gYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChpbnB1dF9iZmQsIHJfaW5kZXgpOwotCSAgICAgIHJlbG9jYXRpb24gPSAoc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgIC0gc2VjdGlvbi0+dm1hKTsKLQkgICAgfQotCi0JICAvKiBDaGFuZ2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotCSAgUFVUX1dPUkQgKG91dHB1dF9iZmQsCi0JCSAgICByX2FkZHIgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgcmVsLT5yX2FkZHJlc3MpOwotCi0JICAvKiBBZGp1c3QgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGJ5IHJlbW92aW5nIHRoZSByZWZlcmVuY2UKLQkgICAgIHRvIHRoZSBvcmlnaW5hbCBhZGRyZXNzIGluIHRoZSBzZWN0aW9uIGFuZCBpbmNsdWRpbmcgdGhlCi0JICAgICByZWZlcmVuY2UgdG8gdGhlIG5ldyBhZGRyZXNzLiAgKi8KLQkgIGlmIChyX3BjcmVsKQotCSAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotI2lmZGVmIE1ZX3JlbG9jYXRhYmxlX3JlbG9jCi0JICBNWV9yZWxvY2F0YWJsZV9yZWxvYyAoaG93dG8sIG91dHB1dF9iZmQsIHJlbCwgcmVsb2NhdGlvbiwgcl9hZGRyKTsKLSNlbmRpZgotCi0JICBpZiAocmVsb2NhdGlvbiA9PSAwKQotCSAgICByID0gYmZkX3JlbG9jX29rOwotCSAgZWxzZQotCSAgICByID0gTVlfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLAotCQkJCQlpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJCWNvbnRlbnRzICsgcl9hZGRyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYm9vbGVhbiBodW5kZWY7Ci0KLQkgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIGFuIGV4ZWN1dGFibGUsIGFuZCBtdXN0IGRvIGEgZnVsbAotCSAgICAgcmVsb2NhdGlvbi4gICovCi0JICBodW5kZWYgPSBmYWxzZTsKLQotCSAgaWYgKHJfZXh0ZXJuKQotCSAgICB7Ci0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9pbmRleF07Ci0KLQkgICAgICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJewotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkJICAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJcmVsb2NhdGlvbiA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaHVuZGVmID0gdHJ1ZTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotCSAgICAgIHNlY3Rpb24gPSBhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24gKGlucHV0X2JmZCwgcl9pbmRleCk7Ci0JICAgICAgcmVsb2NhdGlvbiA9IChzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgLSBzZWN0aW9uLT52bWEpOwotCSAgICAgIGlmIChyX3BjcmVsKQotCQlyZWxvY2F0aW9uICs9IGlucHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgfQotCi0JICBpZiAoY2hlY2tfZHluYW1pY19yZWxvYyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYm9vbGVhbiBza2lwOwotCi0JICAgICAgaWYgKCEgKCgqY2hlY2tfZHluYW1pY19yZWxvYykKLQkJICAgICAoZmluZm8tPmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgaCwKLQkJICAgICAgKFBUUikgcmVsLCBjb250ZW50cywgJnNraXAsICZyZWxvY2F0aW9uKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoc2tpcCkKLQkJY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogTm93IHdhcm4gaWYgYSBnbG9iYWwgc3ltYm9sIGlzIHVuZGVmaW5lZC4gIFdlIGNvdWxkIG5vdAotICAgICAgICAgICAgIGRvIHRoaXMgZWFybGllciwgYmVjYXVzZSBjaGVja19keW5hbWljX3JlbG9jIG1pZ2h0IHdhbnQKLSAgICAgICAgICAgICB0byBza2lwIHRoaXMgcmVsb2MuICAqLwotCSAgaWYgKGh1bmRlZiAmJiAhIGZpbmZvLT5pbmZvLT5zaGFyZWQgJiYgISByX2Jhc2VyZWwpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgICAgaWYgKGggIT0gTlVMTCkKLQkJbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgICAgZWxzZQotCQluYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bXNbcl9pbmRleF0uZV9zdHJ4KTsKLQkgICAgICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChmaW5mby0+aW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByX2FkZHIpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIHIgPSBNWV9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywKLQkJCQkgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgY29udGVudHMsIHJfYWRkciwgcmVsb2NhdGlvbiwKLQkJCQkgICAgICAoYmZkX3ZtYSkgMCk7Ci0JfQotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaCAhPSBOVUxMKQotCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQllbHNlIGlmIChyX2V4dGVybikKLQkJICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsCi0JCQkJCSAgICAgc3ltc1tyX2luZGV4XS5lX3N0cngpOwotCQllbHNlCi0JCSAgewotCQkgICAgYXNlY3Rpb24gKnM7Ci0KLQkJICAgIHMgPSBhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24gKGlucHV0X2JmZCwgcl9pbmRleCk7Ci0JCSAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzKTsKLQkJICB9Ci0JCWlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAgKGZpbmZvLT5pbmZvLCBuYW1lLCBob3d0by0+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+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoZmluZm8tPmluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcl9hZGRyKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAocl90eXBlICE9IFJFTE9DX1NQQVJDX1JFVjMyKQotCSAgICByID0gTVlfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG9fdGFibGVfZXh0ICsgcl90eXBlLAotCQkJCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCWNvbnRlbnRzLCByX2FkZHIsIHJlbG9jYXRpb24sCi0JCQkJCXJfYWRkZW5kKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgeDsKLQotCSAgICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcl9hZGRyKTsKLQkgICAgICB4ID0geCArIHJlbG9jYXRpb24gKyByX2FkZGVuZDsKLQkgICAgICBiZmRfcHV0bDMyICgvKmlucHV0X2JmZCwqLyB4LCBjb250ZW50cyArIHJfYWRkcik7Ci0JICAgICAgciA9IGJmZF9yZWxvY19vazsKLQkgICAgfQotCi0JICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKHIpCi0JCXsKLQkJZGVmYXVsdDoKLQkJY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkJICBhYm9ydCAoKTsKLQkJY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JCSAgewotCQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgICAgaWYgKGggIT0gTlVMTCkKLQkJICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCSAgICBlbHNlIGlmIChyX2V4dGVybgotCQkJICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEwCi0JCQkgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTMKLQkJCSAgICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UyMikKLQkJICAgICAgbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLAotCQkJCQkJIHN5bXNbcl9pbmRleF0uZV9zdHJ4KTsKLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJYXNlY3Rpb24gKnM7Ci0KLQkJCXMgPSBhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24gKGlucHV0X2JmZCwgcl9pbmRleCk7Ci0JCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzKTsKLQkJICAgICAgfQotCQkgICAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCQkgICAoZmluZm8tPmluZm8sIG5hbWUsIGhvd3RvX3RhYmxlX2V4dFtyX3R5cGVdLm5hbWUsCi0JCQkgICAgcl9hZGRlbmQsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcl9hZGRyKSkpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBhIGxpbmsgb3JkZXIgd2hpY2ggaXMgc3VwcG9zZWQgdG8gZ2VuZXJhdGUgYSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlciAoZmluZm8sIG8sIHApCi0gICAgIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGFzZWN0aW9uICpvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlcl9yZWxvYyAqcHI7Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICBmaWxlX3B0ciAqcmVsb2ZmX3B0cjsKLSAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCBzcmVsOwotICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsIGVyZWw7Ci0gIFBUUiByZWxfcHRyOwotCi0gIHByID0gcC0+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+cmVsX2ZpbGVwb3MpKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvYXJjaGl2ZS5jIGIvYmZkL2FyY2hpdmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFjNWFhNC4uMDAwMDAwMAotLS0gYS9iZmQvYXJjaGl2ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEyNyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGFyY2hpdmUgZmlsZXMgKGxpYnJhcmllcykuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4gIE1vc3RseSBHdW1ieSBIZW5rZWwtV2FsbGFjZSdzIGZhdWx0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1Ac2V0ZmlsZW5hbWUgYXJjaGl2ZS1pbmZvCi1TRUNUSU9OCi0JQXJjaGl2ZXMKLQotREVTQ1JJUFRJT04KLQlBbiBhcmNoaXZlIChvciBsaWJyYXJ5KSBpcyBqdXN0IGFub3RoZXIgQkZELiAgSXQgaGFzIGEgc3ltYm9sCi0JdGFibGUsIGFsdGhvdWdoIHRoZXJlJ3Mgbm90IG11Y2ggYSB1c2VyIHByb2dyYW0gd2lsbCBkbyB3aXRoIGl0LgotCi0JVGhlIGJpZyBkaWZmZXJlbmNlIGJldHdlZW4gYW4gYXJjaGl2ZSBCRkQgYW5kIGFuIG9yZGluYXJ5IEJGRAotCWlzIHRoYXQgdGhlIGFyY2hpdmUgZG9lc24ndCBoYXZlIHNlY3Rpb25zLiAgSW5zdGVhZCBpdCBoYXMgYQotCWNoYWluIG9mIEJGRHMgdGhhdCBhcmUgY29uc2lkZXJlZCBpdHMgY29udGVudHMuICBUaGVzZSBCRkRzIGNhbgotCWJlIG1hbmlwdWxhdGVkIGxpa2UgYW55IG90aGVyLiAgVGhlIEJGRHMgY29udGFpbmVkIGluIGFuCi0JYXJjaGl2ZSBvcGVuZWQgZm9yIHJlYWRpbmcgd2lsbCBhbGwgYmUgb3BlbmVkIGZvciByZWFkaW5nLiAgWW91Ci0JbWF5IHB1dCBlaXRoZXIgaW5wdXQgb3Igb3V0cHV0IEJGRHMgaW50byBhbiBhcmNoaXZlIG9wZW5lZCBmb3IKLQlvdXRwdXQ7IHRoZXkgd2lsbCBiZSBoYW5kbGVkIGNvcnJlY3RseSB3aGVuIHRoZSBhcmNoaXZlIGlzIGNsb3NlZC4KLQotCVVzZSA8PGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGU+PiB0byBzdGVwIHRocm91Z2gKLQl0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSBvcGVuZWQgZm9yIGlucHV0LiAgWW91IGRvbid0Ci0JaGF2ZSB0byByZWFkIHRoZSBlbnRpcmUgYXJjaGl2ZSBpZiB5b3UgZG9uJ3Qgd2FudAotCXRvISAgUmVhZCBpdCB1bnRpbCB5b3UgZmluZCB3aGF0IHlvdSB3YW50LgotCi0JQXJjaGl2ZSBjb250ZW50cyBvZiBvdXRwdXQgQkZEcyBhcmUgY2hhaW5lZCB0aHJvdWdoIHRoZQotCTw8bmV4dD4+IHBvaW50ZXIgaW4gYSBCRkQuICBUaGUgZmlyc3Qgb25lIGlzIGZpbmRhYmxlIHRocm91Z2gKLQl0aGUgPDxhcmNoaXZlX2hlYWQ+PiBzbG90IG9mIHRoZSBhcmNoaXZlLiAgU2V0IGl0IHdpdGgKLQk8PGJmZF9zZXRfYXJjaGl2ZV9oZWFkPj4gKHEudi4pLiAgQSBnaXZlbiBCRkQgbWF5IGJlIGluIG9ubHkgb25lCi0Jb3BlbiBvdXRwdXQgYXJjaGl2ZSBhdCBhIHRpbWUuCi0KLQlBcyBleHBlY3RlZCwgdGhlIEJGRCBhcmNoaXZlIGNvZGUgaXMgbW9yZSBnZW5lcmFsIHRoYW4gdGhlCi0JYXJjaGl2ZSBjb2RlIG9mIGFueSBnaXZlbiBlbnZpcm9ubWVudC4gIEJGRCBhcmNoaXZlcyBtYXkKLQljb250YWluIGZpbGVzIG9mIGRpZmZlcmVudCBmb3JtYXRzIChlLmcuLCBhLm91dCBhbmQgY29mZikgYW5kCi0JZXZlbiBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcy4gIFlvdSBtYXkgZXZlbiBwbGFjZSBhcmNoaXZlcwotCXJlY3Vyc2l2ZWx5IGludG8gYXJjaGl2ZXMhCi0KLQlUaGlzIGNhbiBjYXVzZSB1bmV4cGVjdGVkIGNvbmZ1c2lvbiwgc2luY2Ugc29tZSBhcmNoaXZlCi0JZm9ybWF0cyBhcmUgbW9yZSBleHByZXNzaXZlIHRoYW4gb3RoZXJzLiAgRm9yIGluc3RhbmNlLCBJbnRlbAotCUNPRkYgYXJjaGl2ZXMgY2FuIHByZXNlcnZlIGxvbmcgZmlsZW5hbWVzOyBTdW5PUyBhLm91dCBhcmNoaXZlcwotCWNhbm5vdC4gIElmIHlvdSBtb3ZlIGEgZmlsZSBmcm9tIHRoZSBmaXJzdCB0byB0aGUgc2Vjb25kCi0JZm9ybWF0IGFuZCBiYWNrIGFnYWluLCB0aGUgZmlsZW5hbWUgbWF5IGJlIHRydW5jYXRlZC4KLQlMaWtld2lzZSwgZGlmZmVyZW50IGEub3V0IGVudmlyb25tZW50cyBoYXZlIGRpZmZlcmVudAotCWNvbnZlbnRpb25zIGFzIHRvIGhvdyB0aGV5IHRydW5jYXRlIGZpbGVuYW1lcywgd2hldGhlciB0aGV5Ci0JcHJlc2VydmUgZGlyZWN0b3J5IG5hbWVzIGluIGZpbGVuYW1lcywgZXRjLiAgV2hlbgotCWludGVyb3BlcmF0aW5nIHdpdGggbmF0aXZlIHRvb2xzLCBiZSBzdXJlIHlvdXIgZmlsZXMgYXJlCi0JaG9tb2dlbmVvdXMuCi0KLQlCZXdhcmU6IG1vc3Qgb2YgdGhlc2UgZm9ybWF0cyBkbyBub3QgcmVhY3Qgd2VsbCB0byB0aGUKLQlwcmVzZW5jZSBvZiBzcGFjZXMgaW4gZmlsZW5hbWVzLiAgV2UgZG8gdGhlIGJlc3Qgd2UgY2FuLCBidXQKLQljYW4ndCBhbHdheXMgaGFuZGxlIHRoaXMgY2FzZSBkdWUgdG8gcmVzdHJpY3Rpb25zIGluIHRoZSBmb3JtYXQgb2YKLQlhcmNoaXZlcy4gIE1hbnkgVW5peCB1dGlsaXRpZXMgYXJlIGJyYWluZGVhZCBpbiByZWdhcmRzIHRvCi0Jc3BhY2VzIGFuZCBzdWNoIGluIGZpbGVuYW1lcyBhbnl3YXksIHNvIHRoaXMgc2hvdWxkbid0IGJlIG11Y2gKLQlvZiBhIHJlc3RyaWN0aW9uLgotCi0JQXJjaGl2ZXMgYXJlIHN1cHBvcnRlZCBpbiBCRkQgaW4gPDxhcmNoaXZlLmM+Pi4KLQotKi8KLQotLyogQXNzdW1lczoKLSAgIG8gLSBhbGwgYXJjaGl2ZSBlbGVtZW50cyBzdGFydCBvbiBhbiBldmVuIGJvdW5kYXJ5LCBuZXdsaW5lIHBhZGRlZDsKLSAgIG8gLSBhbGwgYXJjaCBoZWFkZXJzIGFyZSBjaGFyICo7Ci0gICBvIC0gYWxsIGFyY2ggaGVhZGVycyBhcmUgdGhlIHNhbWUgc2l6ZSAoYWNyb3NzIGFyY2hpdGVjdHVyZXMpLgotKi8KLQotLyogU29tZSBmb3JtYXRzIHByb3ZpZGUgYSB3YXkgdG8gY3JhbSBhIGxvbmcgZmlsZW5hbWUgaW50byB0aGUgc2hvcnQKLSAgICgxNiBjaGFycykgc3BhY2UgcHJvdmlkZWQgYnkgYSBCU0QgYXJjaGl2ZS4gIFRoZSB0cmljayBpczogbWFrZSBhCi0gICBzcGVjaWFsICJmaWxlIiBpbiB0aGUgZnJvbnQgb2YgdGhlIGFyY2hpdmUsIHNvcnQgb2YgbGlrZSB0aGUgU1lNREVGCi0gICBlbnRyeS4gIElmIHRoZSBmaWxlbmFtZSBpcyB0b28gbG9uZyB0byBmaXQsIHB1dCBpdCBpbiB0aGUgZXh0ZW5kZWQKLSAgIG5hbWUgdGFibGUsIGFuZCB1c2UgaXRzIGluZGV4IGFzIHRoZSBmaWxlbmFtZS4gIFRvIHByZXZlbnQKLSAgIGNvbmZ1c2lvbiBwcmVwZW5kIHRoZSBpbmRleCB3aXRoIGEgc3BhY2UuICBUaGlzIG1lYW5zIHlvdSBjYW4ndAotICAgaGF2ZSBmaWxlbmFtZXMgdGhhdCBzdGFydCB3aXRoIGEgc3BhY2UsIGJ1dCB0aGVuIGFnYWluLCBtYW55IFVuaXgKLSAgIHV0aWxpdGllcyBjYW4ndCBoYW5kbGUgdGhhdCBhbnl3YXkuCi0KLSAgIFRoaXMgc2NoZW1lIHVuZm9ydHVuYXRlbHkgcmVxdWlyZXMgdGhhdCB5b3Ugc3RhbmQgb24geW91ciBoZWFkIGluCi0gICBvcmRlciB0byB3cml0ZSBhbiBhcmNoaXZlIHNpbmNlIHlvdSBuZWVkIHRvIHB1dCBhIG1hZ2ljIGZpbGUgYXQgdGhlCi0gICBmcm9udCwgYW5kIG5lZWQgdG8gdG91Y2ggZXZlcnkgZW50cnkgdG8gZG8gc28uICBDJ2VzdCBsYSB2aWUuCi0KLSAgIFdlIHN1cHBvcnQgdHdvIHZhcmlhbnRzIG9mIHRoaXMgaWRlYToKLSAgIFRoZSBTVlI0IGZvcm1hdCAoZXh0ZW5kZWQgbmFtZSB0YWJsZSBpcyBuYW1lZCAiLy8iKSwKLSAgIGFuZCBhbiBleHRlbmRlZCBwc2V1ZG8tQlNEIHZhcmlhbnQgKGV4dGVuZGVkIG5hbWUgdGFibGUgaXMgbmFtZWQKLSAgICJBUkZJTEVOQU1FUy8iKS4gIFRoZSBvcmlnaW4gb2YgdGhlIGxhdHRlciBmb3JtYXQgaXMgdW5jZXJ0YWluLgotCi0gICBCU0QgNC40IHVzZXMgYSB0aGlyZCBzY2hlbWU6ICBJdCB3cml0ZXMgYSBsb25nIGZpbGVuYW1lCi0gICBkaXJlY3RseSBhZnRlciB0aGUgaGVhZGVyLiAgVGhpcyBhbGxvd3MgJ2FyIHEnIHRvIHdvcmsuCi0gICBXZSBjdXJyZW50bHkgY2FuIHJlYWQgQlNEIDQuNCBhcmNoaXZlcywgYnV0IG5vdCB3cml0ZSB0aGVtLgotKi8KLQotLyogU3VtbWFyeSBvZiBhcmNoaXZlIG1lbWJlciBuYW1lczoKLQotIFN5bWJvbCB0YWJsZSAobXVzdCBiZSBmaXJzdCk6Ci0gIl9fLlNZTURFRiAgICAgICAiIC0gU3ltYm9sIHRhYmxlLCBCZXJrZWxleSBzdHlsZSwgcHJvZHVjZWQgYnkgcmFubGliLgotICIvICAgICAgICAgICAgICAgIiAtIFN5bWJvbCB0YWJsZSwgc3lzdGVtIDUgc3R5bGUuCi0KLSBMb25nIG5hbWUgdGFibGUgKG11c3QgYmUgYmVmb3JlIHJlZ3VsYXIgZmlsZSBtZW1iZXJzKToKLSAiLy8gICAgICAgICAgICAgICIgLSBMb25nIG5hbWUgdGFibGUsIFN5c3RlbSA1IFI0IHN0eWxlLgotICJBUkZJTEVOQU1FUy8gICAgIiAtIExvbmcgbmFtZSB0YWJsZSwgbm9uLXN0YW5kYXJkIGV4dGVuZGVkIEJTRCAobm90IEJTRCA0LjQpLgotCi0gUmVndWxhciBmaWxlIG1lbWJlcnMgd2l0aCBzaG9ydCBuYW1lczoKLSAiZmlsZW5hbWUuby8gICAgICIgLSBSZWd1bGFyIGZpbGUsIFN5c3RlbSA1IHN0eWxlIChlbWJlZGRlZCBzcGFjZXMgb2spLgotICJmaWxlbmFtZS5vICAgICAgIiAtIFJlZ3VsYXIgZmlsZSwgQmVya2VsZXkgc3R5bGUgKG5vIGVtYmVkZGVkIHNwYWNlcykuCi0KLSBSZWd1bGFyIGZpbGVzIHdpdGggbG9uZyBuYW1lcyAob3IgZW1iZWRkZWQgc3BhY2VzLCBmb3IgQlNEIHZhcmlhbnRzKToKLSAiLzE4ICAgICAgICAgICAgICIgLSBTVlI0IHN0eWxlLCBuYW1lIGF0IG9mZnNldCAxOCBpbiBuYW1lIHRhYmxlLgotICIjMS8yMyAgICAgICAgICAgIiAtIExvbmcgbmFtZSAob3IgZW1iZWRkZWQgcGFjZXMpIDIzIGNoYXJhY3RlcnMgbG9uZywKLQkJICAgICAgQlNEIDQuNCBzdHlsZSwgZnVsbCBuYW1lIGZvbGxvd3MgaGVhZGVyLgotCQkgICAgICBJbXBsZW1lbnRlZCBmb3IgcmVhZGluZywgbm90IHdyaXRpbmcuCi0gIiAxOCAgICAgICAgICAgICAiIC0gTG9uZyBuYW1lIDE4IGNoYXJhY3RlcnMgbG9uZywgZXh0ZW5kZWQgcHNldWRvLUJTRC4KLSAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImFvdXQvcmFubGliLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2lmbmRlZiBlcnJubwotZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZgotCi0jaWZkZWYgR05VOTYwCi0jZGVmaW5lIEJGRF9HTlU5NjBfQVJNQUcoYWJmZCkJKEJGRF9DT0ZGX0ZJTEVfUCgoYWJmZCkpID8gQVJNQUcgOiBBUk1BR0IpCi0jZW5kaWYKLQotLyogRGVmaW5lIG9mZnNldG9mIGZvciB0aG9zZSBzeXN0ZW1zIHdoaWNoIGxhY2sgaXQgKi8KLQotI2lmbmRlZiBvZmZzZXRvZgotI2RlZmluZSBvZmZzZXRvZihUWVBFLCBNRU1CRVIpICgodW5zaWduZWQgbG9uZykgJigoVFlQRSAqKTApLT5NRU1CRVIpCi0jZW5kaWYKLQotLyogV2Uga2VlcCBhIGNhY2hlIG9mIGFyY2hpdmUgZmlsZXBvaW50ZXJzIHRvIGFyY2hpdmUgZWxlbWVudHMgdG8KLSAgIHNwZWVkIHVwIHNlYXJjaGluZyB0aGUgYXJjaGl2ZSBieSBmaWxlcG9zLiAgV2Ugb25seSBhZGQgYW4gZW50cnkgdG8KLSAgIHRoZSBjYWNoZSB3aGVuIHdlIGFjdHVhbGx5IHJlYWQgb25lLiAgV2UgYWxzbyBkb24ndCBzb3J0IHRoZSBjYWNoZTsKLSAgIGl0J3MgZ2VuZXJhbGx5IHNob3J0IGVub3VnaCB0byBzZWFyY2ggbGluZWFybHkuCi0gICBOb3RlIHRoYXQgdGhlIHBvaW50ZXJzIGhlcmUgcG9pbnQgdG8gdGhlIGZyb250IG9mIHRoZSBhcl9oZHIsIG5vdAotICAgdG8gdGhlIGZyb250IG9mIHRoZSBjb250ZW50cyEKLSovCi1zdHJ1Y3QgYXJfY2FjaGUKLXsKLSAgZmlsZV9wdHIgcHRyOwotICBiZmQgKmFyZWx0OwotICBzdHJ1Y3QgYXJfY2FjaGUgKm5leHQ7Ci19OwotCi0jZGVmaW5lIGFyX3BhZGNoYXIoYWJmZCkgKChhYmZkKS0+eHZlYy0+YXJfcGFkX2NoYXIpCi0jZGVmaW5lIGFyX21heG5hbWVsZW4oYWJmZCkgKChhYmZkKS0+eHZlYy0+YXJfbWF4X25hbWVsZW4pCi0KLSNkZWZpbmUgYXJjaF9lbHRkYXRhKGJmZCkgKChzdHJ1Y3QgYXJlbHRkYXRhICopKChiZmQpLT5hcmVsdF9kYXRhKSkKLSNkZWZpbmUgYXJjaF9oZHIoYmZkKSAoKHN0cnVjdCBhcl9oZHIgKilhcmNoX2VsdGRhdGEoYmZkKS0+YXJjaF9oZWFkZXIpCi0KLXN0YXRpYyBjaGFyICpnZXRfZXh0ZW5kZWRfYXJlbHRfZmlsZW5hbWUgUEFSQU1TICgoYmZkICphcmNoLAotCQkJCQkJICBjb25zdCBjaGFyICpuYW1lKSk7Ci1zdGF0aWMgYm9vbGVhbiBkb19zbHVycF9ic2RfYXJtYXAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiBkb19zbHVycF9jb2ZmX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqZmlsZSkpOwotc3RhdGljIHN0cnVjdCBhcmVsdGRhdGEgKmJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCQkgICAgIGNvbnN0IGNoYXIgKiwKLQkJCQkJCQkgICAgIGJmZCAqbWVtYmVyKSk7Ci0MCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfbWthcmNoaXZlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9ICgoc3RydWN0IGFydGRhdGEgKikKLQkJCSAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFydGRhdGEpKSk7Ci0KLSAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9hcmRhdGEgKGFiZmQpLT5jYWNoZSA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5hcmNoaXZlX2hlYWQgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcyA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfbmV4dF9tYXBlbnQKLQotU1lOT1BTSVMKLQlzeW1pbmRleCBiZmRfZ2V0X25leHRfbWFwZW50KGJmZCAqYWJmZCwgc3ltaW5kZXggcHJldmlvdXMsIGNhcnN5bSAqKnN5bSk7Ci0KLURFU0NSSVBUSU9OCi0JU3RlcCB0aHJvdWdoIGFyY2hpdmUgQHZhcnthYmZkfSdzIHN5bWJvbCB0YWJsZSAoaWYgaXQKLQloYXMgb25lKS4gIFN1Y2Nlc3NpdmVseSB1cGRhdGUgQHZhcntzeW19IHdpdGggdGhlIG5leHQgc3ltYm9sJ3MKLQlpbmZvcm1hdGlvbiwgcmV0dXJuaW5nIHRoYXQgc3ltYm9sJ3MgKGludGVybmFsKSBpbmRleCBpbnRvIHRoZQotCXN5bWJvbCB0YWJsZS4KLQotCVN1cHBseSA8PEJGRF9OT19NT1JFX1NZTUJPTFM+PiBhcyB0aGUgQHZhcntwcmV2aW91c30gZW50cnkgdG8gZ2V0Ci0JdGhlIGZpcnN0IG9uZTsgcmV0dXJucyA8PEJGRF9OT19NT1JFX1NZTUJPTFM+PiB3aGVuIHlvdSd2ZSBhbHJlYWR5Ci0JZ290IHRoZSBsYXN0IG9uZS4KLQotCUEgPDxjYXJzeW0+PiBpcyBhIGNhbm9uaWNhbCBhcmNoaXZlIHN5bWJvbC4gIFRoZSBvbmx5Ci0JdXNlci12aXNpYmxlIGVsZW1lbnQgaXMgaXRzIG5hbWUsIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KLSovCi0KLXN5bWluZGV4Ci1iZmRfZ2V0X25leHRfbWFwZW50IChhYmZkLCBwcmV2LCBlbnRyeSkKLSAgICAgYmZkICphYmZkOwotICAgICBzeW1pbmRleCBwcmV2OwotICAgICBjYXJzeW0gKiplbnRyeTsKLXsKLSAgaWYgKCFiZmRfaGFzX21hcCAoYWJmZCkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBCRkRfTk9fTU9SRV9TWU1CT0xTOwotICAgIH0KLQotICBpZiAocHJldiA9PSBCRkRfTk9fTU9SRV9TWU1CT0xTKQotICAgIHByZXYgPSAwOwotICBlbHNlCi0gICAgKytwcmV2OwotICBpZiAocHJldiA+PSBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmX2NvdW50KQotICAgIHJldHVybiBCRkRfTk9fTU9SRV9TWU1CT0xTOwotCi0gICplbnRyeSA9IChiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcyArIHByZXYpOwotICByZXR1cm4gcHJldjsKLX0KLQotLyogVG8gYmUgY2FsbGVkIGJ5IGJhY2tlbmRzIG9ubHkgKi8KLQotYmZkICoKLV9iZmRfY3JlYXRlX2VtcHR5X2FyY2hpdmVfZWxlbWVudF9zaGVsbCAob2JmZCkKLSAgICAgYmZkICpvYmZkOwotewotICByZXR1cm4gX2JmZF9uZXdfYmZkX2NvbnRhaW5lZF9pbiAob2JmZCk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfYXJjaGl2ZV9oZWFkCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X2FyY2hpdmVfaGVhZChiZmQgKm91dHB1dCwgYmZkICpuZXdfaGVhZCk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBoZWFkIG9mIHRoZSBjaGFpbiBvZgotCUJGRHMgY29udGFpbmVkIGluIHRoZSBhcmNoaXZlIEB2YXJ7b3V0cHV0fSB0byBAdmFye25ld19oZWFkfS4KLSovCi0KLWJvb2xlYW4KLWJmZF9zZXRfYXJjaGl2ZV9oZWFkIChvdXRwdXRfYXJjaGl2ZSwgbmV3X2hlYWQpCi0gICAgIGJmZCAqb3V0cHV0X2FyY2hpdmU7Ci0gICAgIGJmZCAqbmV3X2hlYWQ7Ci17Ci0KLSAgb3V0cHV0X2FyY2hpdmUtPmFyY2hpdmVfaGVhZCA9IG5ld19oZWFkOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYmZkICoKLV9iZmRfbG9va19mb3JfYmZkX2luX2NhY2hlIChhcmNoX2JmZCwgZmlsZXBvcykKLSAgICAgYmZkICphcmNoX2JmZDsKLSAgICAgZmlsZV9wdHIgZmlsZXBvczsKLXsKLSAgc3RydWN0IGFyX2NhY2hlICpjdXJyZW50OwotCi0gIGZvciAoY3VycmVudCA9IGJmZF9hcmRhdGEgKGFyY2hfYmZkKS0+Y2FjaGU7IGN1cnJlbnQgIT0gTlVMTDsKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICBpZiAoY3VycmVudC0+cHRyID09IGZpbGVwb3MpCi0gICAgICByZXR1cm4gY3VycmVudC0+YXJlbHQ7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEtpbmQgb2Ygc3R1cGlkIHRvIGNhbGwgY29ucyBmb3IgZWFjaCBvbmUsIGJ1dCB3ZSBkb24ndCBkbyB0b28gbWFueSAqLwotYm9vbGVhbgotX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUgKGFyY2hfYmZkLCBmaWxlcG9zLCBuZXdfZWx0KQotICAgICBiZmQgKmFyY2hfYmZkLCAqbmV3X2VsdDsKLSAgICAgZmlsZV9wdHIgZmlsZXBvczsKLXsKLSAgc3RydWN0IGFyX2NhY2hlICpuZXdfY2FjaGUgPSAoKHN0cnVjdCBhcl9jYWNoZSAqKQotCQkJCWJmZF96YWxsb2MgKGFyY2hfYmZkLAotCQkJCQkgICAgc2l6ZW9mIChzdHJ1Y3QgYXJfY2FjaGUpKSk7Ci0KLSAgaWYgKG5ld19jYWNoZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuZXdfY2FjaGUtPnB0ciA9IGZpbGVwb3M7Ci0gIG5ld19jYWNoZS0+YXJlbHQgPSBuZXdfZWx0OwotICBuZXdfY2FjaGUtPm5leHQgPSAoc3RydWN0IGFyX2NhY2hlICopIE5VTEw7Ci0gIGlmIChiZmRfYXJkYXRhIChhcmNoX2JmZCktPmNhY2hlID09IE5VTEwpCi0gICAgYmZkX2FyZGF0YSAoYXJjaF9iZmQpLT5jYWNoZSA9IG5ld19jYWNoZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBhcl9jYWNoZSAqY3VycmVudCA9IGJmZF9hcmRhdGEgKGFyY2hfYmZkKS0+Y2FjaGU7Ci0KLSAgICAgIHdoaWxlIChjdXJyZW50LT5uZXh0ICE9IE5VTEwpCi0JY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7Ci0gICAgICBjdXJyZW50LT5uZXh0ID0gbmV3X2NhY2hlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoZSBuYW1lIGJlZ2lucyB3aXRoIHNwYWNlLiAgSGVuY2UgdGhlIHJlc3Qgb2YgdGhlIG5hbWUgaXMgYW4gaW5kZXggaW50bwotICAgdGhlIHN0cmluZyB0YWJsZS4gKi8KLQotc3RhdGljIGNoYXIgKgotZ2V0X2V4dGVuZGVkX2FyZWx0X2ZpbGVuYW1lIChhcmNoLCBuYW1lKQotICAgICBiZmQgKmFyY2g7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5kZXggPSAwOwotCi0gIC8qIFNob3VsZCBleHRyYWN0IHN0cmluZyBzbyB0aGF0IEkgY2FuIGd1YXJhbnRlZSBub3QgdG8gb3ZlcmZsb3cgaW50bwotICAgICB0aGUgbmV4dCByZWdpb24sIGJ1dCBJJ20gdG9vIGxhenkuICovCi0gIGVycm5vID0gMDsKLSAgLyogU2tpcCBmaXJzdCBjaGFyLCB3aGljaCBpcyAnLycgaW4gU1ZSNCBvciAnICcgaW4gc29tZSBvdGhlciB2YXJpYW50cy4gKi8KLSAgaW5kZXggPSBzdHJ0b2wgKG5hbWUgKyAxLCBOVUxMLCAxMCk7Ci0gIGlmIChlcnJubyAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9hcmRhdGEgKGFyY2gpLT5leHRlbmRlZF9uYW1lcyArIGluZGV4OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9ucyByZWFkcyBhbiBhcmNoIGhlYWRlciBhbmQgcmV0dXJucyBhbiBhcmVsdGRhdGEgcG9pbnRlciwgb3IKLSAgIE5VTEwgb24gZXJyb3IuCi0KLSAgIFByZXN1bWVzIHRoZSBmaWxlIHBvaW50ZXIgaXMgYWxyZWFkeSBpbiB0aGUgcmlnaHQgcGxhY2UgKGllIHBvaW50aW5nCi0gICB0byB0aGUgYXJfaGRyIGluIHRoZSBmaWxlKS4gICBNb3ZlcyB0aGUgZmlsZSBwb2ludGVyOyBvbiBzdWNjZXNzIGl0Ci0gICBzaG91bGQgYmUgcG9pbnRpbmcgdG8gdGhlIGZyb250IG9mIHRoZSBmaWxlIGNvbnRlbnRzOyBvbiBmYWlsdXJlIGl0Ci0gICBjb3VsZCBoYXZlIGJlZW4gbW92ZWQgYXJiaXRyYXJpbHkuCi0qLwotCi1QVFIKLV9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyAoYWJmZCwgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci19Ci0KLS8qIEFscGhhIEVDT0ZGIHVzZXMgYW4gb3B0aW9uYWwgZGlmZmVyZW50IEFSRk1BRyB2YWx1ZSwgc28gd2UgaGF2ZSBhCi0gICB2YXJpYW50IG9mIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkciB3aGljaCBhY2NlcHRzIGEgbWFnaWMgc3RyaW5nLiAgKi8KLQotUFRSCi1fYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnIChhYmZkLCBtYWcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbWFnOwotewotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgY2hhciAqaGRycCA9IChjaGFyICopICZoZHI7Ci0gIHVuc2lnbmVkIGludCBwYXJzZWRfc2l6ZTsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqYXJlZDsKLSAgY2hhciAqZmlsZW5hbWUgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgbmFtZWxlbiA9IDA7Ci0gIHVuc2lnbmVkIGludCBhbGxvY3NpemUgPSBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsKLSAgY2hhciAqYWxsb2NwdHIgPSAwOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgaGRycCwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgaWYgKHN0cm5jbXAgKGhkci5hcl9mbWFnLCBBUkZNQUcsIDIpICE9IDAKLSAgICAgICYmIChtYWcgPT0gTlVMTAotCSAgfHwgc3RybmNtcCAoaGRyLmFyX2ZtYWcsIG1hZywgMikgIT0gMCkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBlcnJubyA9IDA7Ci0gIHBhcnNlZF9zaXplID0gc3RydG9sIChoZHIuYXJfc2l6ZSwgTlVMTCwgMTApOwotICBpZiAoZXJybm8gIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIEV4dHJhY3QgdGhlIGZpbGVuYW1lIGZyb20gdGhlIGFyY2hpdmUgLSB0aGVyZSBhcmUgdHdvIHdheXMgdG8KLSAgICAgc3BlY2lmeSBhbiBleHRlbmRlZCBuYW1lIHRhYmxlLCBlaXRoZXIgdGhlIGZpcnN0IGNoYXIgb2YgdGhlCi0gICAgIG5hbWUgaXMgYSBzcGFjZSwgb3IgaXQncyBhIHNsYXNoLiAgKi8KLSAgaWYgKChoZHIuYXJfbmFtZVswXSA9PSAnLycKLSAgICAgICB8fCAoaGRyLmFyX25hbWVbMF0gPT0gJyAnCi0JICAgJiYgbWVtY2hyIChoZHIuYXJfbmFtZSwgJy8nLCBhcl9tYXhuYW1lbGVuIChhYmZkKSkgPT0gTlVMTCkpCi0gICAgICAmJiBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmaWxlbmFtZSA9IGdldF9leHRlbmRlZF9hcmVsdF9maWxlbmFtZSAoYWJmZCwgaGRyLmFyX25hbWUpOwotICAgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0gIC8qIEJTRDQuNC1zdHlsZSBsb25nIGZpbGVuYW1lLgotICAgICBPbmx5IGltcGxlbWVudGVkIGZvciByZWFkaW5nLCBzbyBmYXIhICovCi0gIGVsc2UgaWYgKGhkci5hcl9uYW1lWzBdID09ICcjJwotCSAgICYmIGhkci5hcl9uYW1lWzFdID09ICcxJwotCSAgICYmIGhkci5hcl9uYW1lWzJdID09ICcvJwotCSAgICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBoZHIuYXJfbmFtZVszXSkpCi0gICAgewotICAgICAgLyogQlNELTQuNCBleHRlbmRlZCBuYW1lICovCi0gICAgICBuYW1lbGVuID0gYXRvaSAoJmhkci5hcl9uYW1lWzNdKTsKLSAgICAgIGFsbG9jc2l6ZSArPSBuYW1lbGVuICsgMTsKLSAgICAgIHBhcnNlZF9zaXplIC09IG5hbWVsZW47Ci0KLSAgICAgIGFsbG9jcHRyID0gYmZkX3phbGxvYyAoYWJmZCwgYWxsb2NzaXplKTsKLSAgICAgIGlmIChhbGxvY3B0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgICAgZmlsZW5hbWUgPSAoYWxsb2NwdHIKLQkJICArIHNpemVvZiAoc3RydWN0IGFyZWx0ZGF0YSkKLQkJICArIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICAgICAgaWYgKGJmZF9yZWFkIChmaWxlbmFtZSwgMSwgbmFtZWxlbiwgYWJmZCkgIT0gbmFtZWxlbikKLQl7Ci0JICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIGZpbGVuYW1lW25hbWVsZW5dID0gJ1wwJzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBqdWRnZSB0aGUgZW5kIG9mIHRoZSBuYW1lIGJ5IGxvb2tpbmcgZm9yICcvJyBvciAnICcuCi0JIE5vdGU6ICBUaGUgU1lTViBmb3JtYXQgKHRlcm1pbmF0ZWQgYnkgJy8nKSBhbGxvd3MgZW1iZWRkZWQKLQkgc3BhY2VzLCBzbyBvbmx5IGxvb2sgZm9yICcgJyBpZiB3ZSBkb24ndCBmaW5kICcvJy4gKi8KLQotICAgICAgY2hhciAqZTsKLSAgICAgIGUgPSBtZW1jaHIgKGhkci5hcl9uYW1lLCAnXDAnLCBhcl9tYXhuYW1lbGVuIChhYmZkKSk7Ci0gICAgICBpZiAoZSA9PSBOVUxMKQotCXsKLSAgICAgICAgICBlID0gbWVtY2hyIChoZHIuYXJfbmFtZSwgJy8nLCBhcl9tYXhuYW1lbGVuIChhYmZkKSk7Ci0JICBpZiAoZSA9PSBOVUxMKQotICAgICAgICAgICAgZSA9IG1lbWNociAoaGRyLmFyX25hbWUsICcgJywgYXJfbWF4bmFtZWxlbiAoYWJmZCkpOwotCX0KLQotICAgICAgaWYgKGUgIT0gTlVMTCkKLQluYW1lbGVuID0gZSAtIGhkci5hcl9uYW1lOwotICAgICAgZWxzZQotCXsKLQkgIC8qIElmIHdlIGRpZG4ndCBmaW5kIGEgdGVybWluYXRpb24gY2hhcmFjdGVyLCB0aGVuIHRoZSBuYW1lCi0JICAgICBtdXN0IGJlIHRoZSBlbnRpcmUgZmllbGQuICAqLwotCSAgbmFtZWxlbiA9IGFyX21heG5hbWVsZW4gKGFiZmQpOwotCX0KLQotICAgICAgYWxsb2NzaXplICs9IG5hbWVsZW4gKyAxOwotICAgIH0KLQotICBpZiAoIWFsbG9jcHRyKQotICAgIHsKLSAgICAgIGFsbG9jcHRyID0gYmZkX3phbGxvYyAoYWJmZCwgYWxsb2NzaXplKTsKLSAgICAgIGlmIChhbGxvY3B0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICBhcmVkID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgYWxsb2NwdHI7Ci0KLSAgYXJlZC0+YXJjaF9oZWFkZXIgPSBhbGxvY3B0ciArIHNpemVvZiAoc3RydWN0IGFyZWx0ZGF0YSk7Ci0gIG1lbWNweSAoKGNoYXIgKikgYXJlZC0+YXJjaF9oZWFkZXIsIChjaGFyICopICZoZHIsIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICBhcmVkLT5wYXJzZWRfc2l6ZSA9IHBhcnNlZF9zaXplOwotCi0gIGlmIChmaWxlbmFtZSAhPSBOVUxMKQotICAgIGFyZWQtPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhcmVkLT5maWxlbmFtZSA9IGFsbG9jcHRyICsgKHNpemVvZiAoc3RydWN0IGFyZWx0ZGF0YSkgKwotCQkJCSAgIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICAgICAgaWYgKG5hbWVsZW4pCi0JbWVtY3B5IChhcmVkLT5maWxlbmFtZSwgaGRyLmFyX25hbWUsIG5hbWVsZW4pOwotICAgICAgYXJlZC0+ZmlsZW5hbWVbbmFtZWxlbl0gPSAnXDAnOwotICAgIH0KLQotICByZXR1cm4gKFBUUikgYXJlZDsKLX0KLQwKLS8qIFRoaXMgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb247IGl0J3MgbWFpbmx5IHVzZWQgd2hlbiBpbmRleGluZwotICAgdGhyb3VnaCB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUsIGJ1dCBhbHNvIHVzZWQgdG8gZ2V0IHRoZSBuZXh0Ci0gICBlbGVtZW50LCBzaW5jZSBpdCBoYW5kbGVzIHRoZSBib29ra2VlcGluZyBzbyBuaWNlbHkgZm9yIHVzLiAgKi8KLQotYmZkICoKLV9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIChhcmNoaXZlLCBmaWxlcG9zKQotICAgICBiZmQgKmFyY2hpdmU7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKm5ld19hcmVsZGF0YTsKLSAgYmZkICpuX25mZDsKLQotICBuX25mZCA9IF9iZmRfbG9va19mb3JfYmZkX2luX2NhY2hlIChhcmNoaXZlLCBmaWxlcG9zKTsKLSAgaWYgKG5fbmZkKQotICAgIHJldHVybiBuX25mZDsKLQotICBpZiAoMCA+IGJmZF9zZWVrIChhcmNoaXZlLCBmaWxlcG9zLCBTRUVLX1NFVCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKChuZXdfYXJlbGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhcmNoaXZlKSkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBuX25mZCA9IF9iZmRfY3JlYXRlX2VtcHR5X2FyY2hpdmVfZWxlbWVudF9zaGVsbCAoYXJjaGl2ZSk7Ci0gIGlmIChuX25mZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhcmNoaXZlLCAoUFRSKSBuZXdfYXJlbGRhdGEpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIG5fbmZkLT5vcmlnaW4gPSBiZmRfdGVsbCAoYXJjaGl2ZSk7Ci0gIG5fbmZkLT5hcmVsdF9kYXRhID0gKFBUUikgbmV3X2FyZWxkYXRhOwotICBuX25mZC0+ZmlsZW5hbWUgPSBuZXdfYXJlbGRhdGEtPmZpbGVuYW1lOwotCi0gIGlmIChfYmZkX2FkZF9iZmRfdG9fYXJjaGl2ZV9jYWNoZSAoYXJjaGl2ZSwgZmlsZXBvcywgbl9uZmQpKQotICAgIHJldHVybiBuX25mZDsKLQotICAvKiBodWg/ICovCi0gIGJmZF9yZWxlYXNlIChhcmNoaXZlLCAoUFRSKSBuX25mZCk7Ci0gIGJmZF9yZWxlYXNlIChhcmNoaXZlLCAoUFRSKSBuZXdfYXJlbGRhdGEpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogUmV0dXJuIHRoZSBCRkQgd2hpY2ggaXMgcmVmZXJlbmNlZCBieSB0aGUgc3ltYm9sIGluIEFCRkQgaW5kZXhlZCBieQotICAgSU5ERVguICBJTkRFWCBzaG91bGQgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IGJmZF9nZXRfbmV4dF9tYXBlbnQuICAqLwotCi1iZmQgKgotX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXggKGFiZmQsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN5bWluZGV4IGluZGV4OwotewotICBjYXJzeW0gKmVudHJ5OwotCi0gIGVudHJ5ID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgKyBpbmRleDsKLSAgcmV0dXJuIF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIChhYmZkLCBlbnRyeS0+ZmlsZV9vZmZzZXQpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0KLVNZTk9QU0lTCi0JYmZkICpiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlKGJmZCAqYXJjaGl2ZSwgYmZkICpwcmV2aW91cyk7Ci0KLURFU0NSSVBUSU9OCi0JUHJvdmlkZWQgYSBCRkQsIEB2YXJ7YXJjaGl2ZX0sIGNvbnRhaW5pbmcgYW4gYXJjaGl2ZSBhbmQgTlVMTCwgb3BlbgotCWFuIGlucHV0IEJGRCBvbiB0aGUgZmlyc3QgY29udGFpbmVkIGVsZW1lbnQgYW5kIHJldHVybnMgdGhhdC4KLQlTdWJzZXF1ZW50IGNhbGxzIHNob3VsZCBwYXNzCi0JdGhlIGFyY2hpdmUgYW5kIHRoZSBwcmV2aW91cyByZXR1cm4gdmFsdWUgdG8gcmV0dXJuIGEgY3JlYXRlZAotCUJGRCB0byB0aGUgbmV4dCBjb250YWluZWQgZWxlbWVudC4gTlVMTCBpcyByZXR1cm5lZCB3aGVuIHRoZXJlCi0JYXJlIG5vIG1vcmUuCi0KLSovCi0KLWJmZCAqCi1iZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoaXZlLCBsYXN0X2ZpbGUpCi0gICAgIGJmZCAqYXJjaGl2ZTsKLSAgICAgYmZkICpsYXN0X2ZpbGU7Ci17Ci0gIGlmICgoYmZkX2dldF9mb3JtYXQgKGFyY2hpdmUpICE9IGJmZF9hcmNoaXZlKSB8fAotICAgICAgKGFyY2hpdmUtPmRpcmVjdGlvbiA9PSB3cml0ZV9kaXJlY3Rpb24pKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIEJGRF9TRU5EIChhcmNoaXZlLAotCQkgICBvcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUsCi0JCSAgIChhcmNoaXZlLAotCQkgICAgbGFzdF9maWxlKSk7Ci19Ci0KLWJmZCAqCi1iZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyY2hpdmUsIGxhc3RfZmlsZSkKLSAgICAgYmZkICphcmNoaXZlOwotICAgICBiZmQgKmxhc3RfZmlsZTsKLXsKLSAgZmlsZV9wdHIgZmlsZXN0YXJ0OwotCi0gIGlmICghbGFzdF9maWxlKQotICAgIGZpbGVzdGFydCA9IGJmZF9hcmRhdGEgKGFyY2hpdmUpLT5maXJzdF9maWxlX2ZpbGVwb3M7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IGFyZWx0X3NpemUgKGxhc3RfZmlsZSk7Ci0gICAgICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeS4uLgotCSBOb3RlIHRoYXQgbGFzdF9maWxlLT5vcmlnaW4gY2FuIGJlIG9kZCBpbiB0aGUgY2FzZSBvZgotCSBCU0QtNC40LXN0eWxlIGVsZW1lbnQgd2l0aCBhIGxvbmcgb2RkIHNpemUuICovCi0gICAgICBmaWxlc3RhcnQgPSBsYXN0X2ZpbGUtPm9yaWdpbiArIHNpemU7Ci0gICAgICBmaWxlc3RhcnQgKz0gZmlsZXN0YXJ0ICUgMjsKLSAgICB9Ci0KLSAgcmV0dXJuIF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIChhcmNoaXZlLCBmaWxlc3RhcnQpOwotfQotCi0KLWNvbnN0IGJmZF90YXJnZXQgKgotYmZkX2dlbmVyaWNfYXJjaGl2ZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcnRkYXRhICp0ZGF0YV9ob2xkOwotICBjaGFyIGFybWFnW1NBUk1BRyArIDFdOwotCi0gIHRkYXRhX2hvbGQgPSBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGE7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBhcm1hZywgMSwgU0FSTUFHLCBhYmZkKSAhPSBTQVJNQUcpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0jaWZkZWYgR05VOTYwCi0gIGlmIChzdHJuY21wIChhcm1hZywgQkZEX0dOVTk2MF9BUk1BRyAoYWJmZCksIFNBUk1BRykgIT0gMCkKLSAgICByZXR1cm4gMDsKLSNlbHNlCi0gIGlmIChzdHJuY21wIChhcm1hZywgQVJNQUcsIFNBUk1BRykgIT0gMCAmJgotICAgICAgc3RybmNtcCAoYXJtYWcsIEFSTUFHQiwgU0FSTUFHKSAhPSAwKQotICAgIHJldHVybiAwOwotI2VuZGlmCi0KLSAgLyogV2UgYXJlIHNldHRpbmcgYmZkX2FyZGF0YShhYmZkKSBoZXJlLCBidXQgc2luY2UgYmZkX2FyZGF0YQotICAgICBpbnZvbHZlcyBhIGNhc3QsIHdlIGNhbid0IGRvIGl0IGFzIHRoZSBsZWZ0IG9wZXJhbmQgb2YgYXNzaWdubWVudC4gKi8KLSAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gKChzdHJ1Y3QgYXJ0ZGF0YSAqKQotCQkJICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJ0ZGF0YSkpKTsKLQotICBpZiAoYmZkX2FyZGF0YSAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gU0FSTUFHOwotICBiZmRfYXJkYXRhIChhYmZkKS0+Y2FjaGUgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+YXJjaGl2ZV9oZWFkID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPSBOVUxMOwotCi0gIGlmICghQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2x1cnBfYXJtYXAsIChhYmZkKSkpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGJmZF9hcmRhdGEgKGFiZmQpKTsKLSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9IHRkYXRhX2hvbGQ7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKCFCRkRfU0VORCAoYWJmZCwgX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlLCAoYWJmZCkpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSB0ZGF0YV9ob2xkOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChiZmRfaGFzX21hcCAoYWJmZCkpCi0gICAgewotICAgICAgYmZkICpmaXJzdDsKLQotICAgICAgLyogVGhpcyBhcmNoaXZlIGhhcyBhIG1hcCwgc28gd2UgbWF5IHByZXN1bWUgdGhhdCB0aGUgY29udGVudHMKLQkgYXJlIG9iamVjdCBmaWxlcy4gIE1ha2Ugc3VyZSB0aGF0IGlmIHRoZSBmaXJzdCBmaWxlIGluIHRoZQotCSBhcmNoaXZlIGNhbiBiZSByZWNvZ25pemVkIGFzIGFuIG9iamVjdCBmaWxlLCBpdCBpcyBmb3IgdGhpcwotCSB0YXJnZXQuICBJZiBub3QsIGFzc3VtZSB0aGF0IHRoaXMgaXMgdGhlIHdyb25nIGZvcm1hdC4gIElmCi0JIHRoZSBmaXJzdCBmaWxlIGlzIG5vdCBhbiBvYmplY3QgZmlsZSwgc29tZWJvZHkgaXMgZG9pbmcKLQkgc29tZXRoaW5nIHdlaXJkLCBhbmQgd2UgcGVybWl0IGl0IHNvIHRoYXQgYXIgLXQgd2lsbCB3b3JrLgotCi0JIFRoaXMgaXMgZG9uZSBiZWNhdXNlIGFueSBub3JtYWwgZm9ybWF0IHdpbGwgcmVjb2duaXplIGFueQotCSBub3JtYWwgYXJjaGl2ZSwgcmVnYXJkbGVzcyBvZiB0aGUgZm9ybWF0IG9mIHRoZSBvYmplY3QgZmlsZXMuCi0JIFdlIGRvIGFjY2VwdCBhbiBlbXB0eSBhcmNoaXZlLiAgKi8KLQotICAgICAgZmlyc3QgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhYmZkLCAoYmZkICopIE5VTEwpOwotICAgICAgaWYgKGZpcnN0ICE9IE5VTEwpCi0JewotCSAgYm9vbGVhbiBmYWlsOwotCi0JICBmaXJzdC0+dGFyZ2V0X2RlZmF1bHRlZCA9IGZhbHNlOwotCSAgZmFpbCA9IGZhbHNlOwotCSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGZpcnN0LCBiZmRfb2JqZWN0KQotCSAgICAgICYmIGZpcnN0LT54dmVjICE9IGFiZmQtPnh2ZWMpCi0JICAgIHsKLQkgICAgICAodm9pZCkgYmZkX2Nsb3NlIChmaXJzdCk7Ci0JICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGJmZF9hcmRhdGEgKGFiZmQpKTsKLQkgICAgICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSB0ZGF0YV9ob2xkOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0KLQkgIC8qIFdlIG91Z2h0IHRvIGNsb3NlIGZpcnN0IGhlcmUsIGJ1dCB3ZSBjYW4ndCwgYmVjYXVzZSB3ZQotICAgICAgICAgICAgIGhhdmUgbm8gd2F5IHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBhcmNoaXZlIGNhY2hlLiAgRklYTUUuICAqLwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIFNvbWUgY29uc3RhbnRzIGZvciBhIDMyIGJpdCBCU0QgYXJjaGl2ZSBzdHJ1Y3R1cmUuICBXZSBkbyBub3QKLSAgIHN1cHBvcnQgNjQgYml0IGFyY2hpdmVzIHByZXNlbnRseTsgc28gZmFyIGFzIEkga25vdywgbm9uZSBhY3R1YWxseQotICAgZXhpc3QuICBTdXBwb3J0aW5nIHRoZW0gd291bGQgcmVxdWlyZSBjaGFuZ2luZyB0aGVzZSBjb25zdGFudHMsIGFuZAotICAgY2hhbmdpbmcgc29tZSBiZmRfaF9nZXRfMzIgdG8gYmZkX2hfZ2V0XzY0LiAgKi8KLQotLyogVGhlIHNpemUgb2YgYW4gZXh0ZXJuYWwgc3ltZGVmIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIEJTRF9TWU1ERUZfU0laRSA4Ci0KLS8qIFRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgYSBzeW1kZWYgc3RydWN0dXJlIHRvIHRoZSBmaWxlIG9mZnNldC4gICovCi0jZGVmaW5lIEJTRF9TWU1ERUZfT0ZGU0VUX1NJWkUgNAotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgc3ltZGVmIGNvdW50LiAgKi8KLSNkZWZpbmUgQlNEX1NZTURFRl9DT1VOVF9TSVpFIDQKLQotLyogVGhlIHNpemUgb2YgdGhlIHN0cmluZyBjb3VudC4gICovCi0jZGVmaW5lIEJTRF9TVFJJTkdfQ09VTlRfU0laRSA0Ci0KLS8qIFJldHVybnMgZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlICovCi0KLXN0YXRpYyBib29sZWFuCi1kb19zbHVycF9ic2RfYXJtYXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqbWFwZGF0YTsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXI7Ci0gIGJmZF9ieXRlICpyYXdfYXJtYXAsICpyYmFzZTsKLSAgc3RydWN0IGFydGRhdGEgKmFyZGF0YSA9IGJmZF9hcmRhdGEgKGFiZmQpOwotICBjaGFyICpzdHJpbmdiYXNlOwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7Ci0gIGNhcnN5bSAqc2V0OwotCi0gIG1hcGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKLSAgaWYgKG1hcGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHBhcnNlZF9zaXplID0gbWFwZGF0YS0+cGFyc2VkX3NpemU7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSBtYXBkYXRhKTsJLyogRG9uJ3QgbmVlZCBpdCBhbnkgbW9yZS4gKi8KLQotICByYXdfYXJtYXAgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoYWJmZCwgcGFyc2VkX3NpemUpOwotICBpZiAocmF3X2FybWFwID09IChiZmRfYnl0ZSAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIHJhd19hcm1hcCwgMSwgcGFyc2VkX3NpemUsIGFiZmQpICE9IHBhcnNlZF9zaXplKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgIGJ5ZWJ5ZToKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSByYXdfYXJtYXApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBhcmRhdGEtPnN5bWRlZl9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmF3X2FybWFwKSAvIEJTRF9TWU1ERUZfU0laRTsKLQotICBpZiAoYXJkYXRhLT5zeW1kZWZfY291bnQgKiBCU0RfU1lNREVGX1NJWkUgPgotICAgICAgcGFyc2VkX3NpemUgLSBCU0RfU1lNREVGX0NPVU5UX1NJWkUpCi0gICAgewotICAgICAgLyogUHJvYmFibHkgd2UncmUgdXNpbmcgdGhlIHdyb25nIGJ5dGUgb3JkZXJpbmcuICAqLwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICBnb3RvIGJ5ZWJ5ZTsKLSAgICB9Ci0KLSAgYXJkYXRhLT5jYWNoZSA9IDA7Ci0gIHJiYXNlID0gcmF3X2FybWFwICsgQlNEX1NZTURFRl9DT1VOVF9TSVpFOwotICBzdHJpbmdiYXNlID0gKChjaGFyICopIHJiYXNlCi0JCSsgYXJkYXRhLT5zeW1kZWZfY291bnQgKiBCU0RfU1lNREVGX1NJWkUKLQkJKyBCU0RfU1RSSU5HX0NPVU5UX1NJWkUpOwotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAoYXJkYXRhLT5zeW1kZWZfY291bnQKLQkJCQkJICAgKiBzaXplb2YgKGNhcnN5bSkpKTsKLSAgaWYgKCFhcmRhdGEtPnN5bWRlZnMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoY291bnRlciA9IDAsIHNldCA9IGFyZGF0YS0+c3ltZGVmczsKLSAgICAgICBjb3VudGVyIDwgYXJkYXRhLT5zeW1kZWZfY291bnQ7Ci0gICAgICAgY291bnRlcisrLCBzZXQrKywgcmJhc2UgKz0gQlNEX1NZTURFRl9TSVpFKQotICAgIHsKLSAgICAgIHNldC0+bmFtZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmJhc2UpICsgc3RyaW5nYmFzZTsKLSAgICAgIHNldC0+ZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJiYXNlICsgQlNEX1NZTURFRl9PRkZTRVRfU0laRSk7Ci0gICAgfQotCi0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpOwotICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeSBpZiB5b3UgaGF2ZSB0byAqLwotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyArPSAoYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MpICUgMjsKLSAgLyogRklYTUUsIHdlIHNob3VsZCBwcm92aWRlIHNvbWUgd2F5IHRvIGZyZWUgcmF3X2FyZGF0YSB3aGVuCi0gICAgIHdlIGFyZSBkb25lIHVzaW5nIHRoZSBzdHJpbmdzIGZyb20gaXQuICBGb3Igbm93LCBpdCBzZWVtcwotICAgICB0byBiZSBhbGxvY2F0ZWQgb24gYW4gb2JqYWxsb2MgYW55d2F5Li4uICovCi0gIGJmZF9oYXNfbWFwIChhYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZSAqLwotc3RhdGljIGJvb2xlYW4KLWRvX3NsdXJwX2NvZmZfYXJtYXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqbWFwZGF0YTsKLSAgaW50ICpyYXdfYXJtYXAsICpyYXdwdHI7Ci0gIHN0cnVjdCBhcnRkYXRhICphcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKLSAgY2hhciAqc3RyaW5nYmFzZTsKLSAgdW5zaWduZWQgaW50IHN0cmluZ3NpemU7Ci0gIHVuc2lnbmVkIGludCBwYXJzZWRfc2l6ZTsKLSAgY2Fyc3ltICpjYXJzeW1zOwotICB1bnNpZ25lZCBpbnQgbnN5bXo7CQkvKiBOdW1iZXIgb2Ygc3ltYm9scyBpbiBhcm1hcC4gKi8KLSAgYmZkX3ZtYSAoKnN3YXApIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgY2hhciBpbnRfYnVmW3NpemVvZiAobG9uZyldOwotICB1bnNpZ25lZCBpbnQgY2Fyc3ltX3NpemUsIHB0cnNpemUsIGk7Ci0KLSAgbWFwZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIF9iZmRfcmVhZF9hcl9oZHIgKGFiZmQpOwotICBpZiAobWFwZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcGFyc2VkX3NpemUgPSBtYXBkYXRhLT5wYXJzZWRfc2l6ZTsKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIG1hcGRhdGEpOwkvKiBEb24ndCBuZWVkIGl0IGFueSBtb3JlLiAqLwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgaW50X2J1ZiwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIC8qIEl0IHNlZW1zIHRoYXQgYWxsIG51bWVyaWMgaW5mb3JtYXRpb24gaW4gYSBjb2ZmIGFyY2hpdmUgaXMgYWx3YXlzCi0gICAgIGluIGJpZyBlbmRpYW4gZm9ybWF0LCBub21hdHRlciB0aGUgaG9zdCBvciB0YXJnZXQuICovCi0gIHN3YXAgPSBiZmRfZ2V0YjMyOwotICBuc3lteiA9IGJmZF9nZXRiMzIgKChQVFIpIGludF9idWYpOwotICBzdHJpbmdzaXplID0gcGFyc2VkX3NpemUgLSAoNCAqIG5zeW16KSAtIDQ7Ci0KLSNpZiAxCi0gIC8qIC4uLiBleGNlcHQgdGhhdCBzb21lIGFyY2hpdmUgZm9ybWF0cyBhcmUgYnJva2VuLCBhbmQgaXQgbWF5IGJlIG91cgotICAgICBmYXVsdCAtIHRoZSBpOTYwIGxpdHRsZSBlbmRpYW4gY29mZiBzb21ldGltZXMgaGFzIGJpZyBhbmQgc29tZXRpbWVzCi0gICAgIGxpdHRsZSwgYmVjYXVzZSBvdXIgdG9vbHMgY2hhbmdlZC4gIEhlcmUncyBhIGhvcnJpYmxlIGhhY2sgdG8gY2xlYW4KLSAgICAgdXAgdGhlIGNyYXAuICAqLwotCi0gIGlmIChzdHJpbmdzaXplID4gMHhmZmZmZgotICAgICAgJiYgYmZkX2dldF9hcmNoIChhYmZkKSA9PSBiZmRfYXJjaF9pOTYwCi0gICAgICAmJiBiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgIHsKLSAgICAgIC8qIFRoaXMgbG9va3MgZGFuZ2Vyb3VzLCBsZXQncyBkbyBpdCB0aGUgb3RoZXIgd2F5IGFyb3VuZCAqLwotICAgICAgbnN5bXogPSBiZmRfZ2V0bDMyICgoUFRSKSBpbnRfYnVmKTsKLSAgICAgIHN0cmluZ3NpemUgPSBwYXJzZWRfc2l6ZSAtICg0ICogbnN5bXopIC0gNDsKLSAgICAgIHN3YXAgPSBiZmRfZ2V0bDMyOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIFRoZSBjb2ZmIGFybWFwIG11c3QgYmUgcmVhZCBzZXF1ZW50aWFsbHkuICBTbyB3ZSBjb25zdHJ1Y3QgYQotICAgICBic2Qtc3R5bGUgb25lIGluIGNvcmUgYWxsIGF0IG9uY2UsIGZvciBzaW1wbGljaXR5LiAqLwotCi0gIGNhcnN5bV9zaXplID0gKG5zeW16ICogc2l6ZW9mIChjYXJzeW0pKTsKLSAgcHRyc2l6ZSA9ICg0ICogbnN5bXopOwotCi0gIGFyZGF0YS0+c3ltZGVmcyA9IChjYXJzeW0gKikgYmZkX3phbGxvYyAoYWJmZCwgY2Fyc3ltX3NpemUgKyBzdHJpbmdzaXplICsgMSk7Ci0gIGlmIChhcmRhdGEtPnN5bWRlZnMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGNhcnN5bXMgPSBhcmRhdGEtPnN5bWRlZnM7Ci0gIHN0cmluZ2Jhc2UgPSAoKGNoYXIgKikgYXJkYXRhLT5zeW1kZWZzKSArIGNhcnN5bV9zaXplOwotCi0gIC8qIEFsbG9jYXRlIGFuZCByZWFkIGluIHRoZSByYXcgb2Zmc2V0cy4gKi8KLSAgcmF3X2FybWFwID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHB0cnNpemUpOwotICBpZiAocmF3X2FybWFwID09IE5VTEwpCi0gICAgZ290byByZWxlYXNlX3N5bWRlZnM7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgcmF3X2FybWFwLCAxLCBwdHJzaXplLCBhYmZkKSAhPSBwdHJzaXplCi0gICAgICB8fCBiZmRfcmVhZCAoKFBUUikgc3RyaW5nYmFzZSwgMSwgc3RyaW5nc2l6ZSwgYWJmZCkgIT0gc3RyaW5nc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIGdvdG8gcmVsZWFzZV9yYXdfYXJtYXA7Ci0gICAgfQotCi0gIC8qIE9LLCBidWlsZCB0aGUgY2Fyc3ltcyAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnN5bXo7IGkrKykKLSAgICB7Ci0gICAgICByYXdwdHIgPSByYXdfYXJtYXAgKyBpOwotICAgICAgY2Fyc3ltcy0+ZmlsZV9vZmZzZXQgPSBzd2FwICgoUFRSKSByYXdwdHIpOwotICAgICAgY2Fyc3ltcy0+bmFtZSA9IHN0cmluZ2Jhc2U7Ci0gICAgICBzdHJpbmdiYXNlICs9IHN0cmxlbiAoc3RyaW5nYmFzZSkgKyAxOwotICAgICAgY2Fyc3ltcysrOwotICAgIH0KLSAgKnN0cmluZ2Jhc2UgPSAwOwotCi0gIGFyZGF0YS0+c3ltZGVmX2NvdW50ID0gbnN5bXo7Ci0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpOwotICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeSBpZiB5b3UgaGF2ZSB0byAqLwotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyArPSAoYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MpICUgMjsKLQotCi0gIGJmZF9oYXNfbWFwIChhYmZkKSA9IHRydWU7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSByYXdfYXJtYXApOwotCi0KLSAgLyogQ2hlY2sgZm9yIGEgc2Vjb25kIGFyY2hpdmUgaGVhZGVyIChhcyB1c2VkIGJ5IFBFKSAqLwotICB7Ci0gICAgc3RydWN0IGFyZWx0ZGF0YSAqdG1wOwotCi0gICAgYmZkX3NlZWsgKGFiZmQsICAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MsIFNFRUtfU0VUKTsKLSAgICB0bXAgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKLSAgICBpZiAodG1wICE9IE5VTEwpIAotICAgICAgewotCWlmICh0bXAtPmFyY2hfaGVhZGVyWzBdID09ICcvJwotCSAgICAmJiB0bXAtPmFyY2hfaGVhZGVyWzFdID09ICcgJykgCi0JICB7Ci0JICAgIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zICs9Ci0JICAgICAgKHRtcC0+cGFyc2VkX3NpemUgKyBzaXplb2Yoc3RydWN0IGFyX2hkcikgKyAxKSAmIH4xOwotCSAgfQotCWJmZF9yZWxlYXNlIChhYmZkLCB0bXApOwotICAgICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLXJlbGVhc2VfcmF3X2FybWFwOgotICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLXJlbGVhc2Vfc3ltZGVmczoKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIChhcmRhdGEpLT5zeW1kZWZzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGhhbmRsZSBlaXRoZXIgY29mZi1zdHlsZSBvciBic2Qtc3R5bGUgYXJtYXBzLgotICAgUmV0dXJucyBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UgKi8KLQotYm9vbGVhbgotYmZkX3NsdXJwX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgbmV4dG5hbWVbMTddOwotICBpbnQgaSA9IGJmZF9yZWFkICgoUFRSKSBuZXh0bmFtZSwgMSwgMTYsIGFiZmQpOwotCi0gIGlmIChpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChpICE9IDE2KQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgLSAxNiwgU0VFS19DVVIpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghc3RybmNtcCAobmV4dG5hbWUsICJfXy5TWU1ERUYgICAgICAgIiwgMTYpCi0gICAgICB8fCAhc3RybmNtcCAobmV4dG5hbWUsICJfXy5TWU1ERUYvICAgICAgIiwgMTYpKSAvKiBvbGQgTGludXggYXJjaGl2ZXMgKi8KLSAgICByZXR1cm4gZG9fc2x1cnBfYnNkX2FybWFwIChhYmZkKTsKLSAgZWxzZSBpZiAoIXN0cm5jbXAgKG5leHRuYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSkKLSAgICByZXR1cm4gZG9fc2x1cnBfY29mZl9hcm1hcCAoYWJmZCk7Ci0gIGVsc2UgaWYgKCFzdHJuY21wIChuZXh0bmFtZSwgIi9TWU02NC8gICAgICAgICAiLCAxNikpCi0gICAgewotICAgICAgLyogSXJpeCA2IGFyY2hpdmUtLW11c3QgYmUgcmVjb2duaXplZCBieSBjb2RlIGluIGVsZjY0LW1pcHMuYy4gICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmV0dXJucyBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UgKi8KLS8qIGZsYXZvciAyIG9mIGEgYnNkIGFybWFwLCBzaW1pbGFyIHRvIGJmZF9zbHVycF9ic2RfYXJtYXAgZXhjZXB0IHRoZQotICAgaGVhZGVyIGlzIGluIGEgc2xpZ2h0bHkgZGlmZmVyZW50IG9yZGVyIGFuZCB0aGUgbWFwIG5hbWUgaXMgJy8nLgotICAgVGhpcyBmbGF2b3VyIGlzIHVzZWQgYnkgaHAzMDBocHV4LiAqLwotCi0jZGVmaW5lIEhQVVhfU1lNREVGX0NPVU5UX1NJWkUgMgotCi1ib29sZWFuCi1iZmRfc2x1cnBfYnNkX2FybWFwX2YyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKm1hcGRhdGE7Ci0gIGNoYXIgbmV4dG5hbWVbMTddOwotICB1bnNpZ25lZCBpbnQgY291bnRlcjsKLSAgYmZkX2J5dGUgKnJhd19hcm1hcCwgKnJiYXNlOwotICBzdHJ1Y3QgYXJ0ZGF0YSAqYXJkYXRhID0gYmZkX2FyZGF0YSAoYWJmZCk7Ci0gIGNoYXIgKnN0cmluZ2Jhc2U7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzaXplOwotICBjYXJzeW0gKnNldDsKLSAgaW50IGkgPSBiZmRfcmVhZCAoKFBUUikgbmV4dG5hbWUsIDEsIDE2LCBhYmZkKTsKLQotICBpZiAoaSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoaSAhPSAxNikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIGFyY2hpdmUgaGFzIGF0IGxlYXN0IDE2IGJ5dGVzIGluIGl0ICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgLTE2TCwgU0VFS19DVVIpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghc3RybmNtcCAobmV4dG5hbWUsICJfXy5TWU1ERUYgICAgICAgIiwgMTYpCi0gICAgICB8fCAhc3RybmNtcCAobmV4dG5hbWUsICJfXy5TWU1ERUYvICAgICAgIiwgMTYpKSAvKiBvbGQgTGludXggYXJjaGl2ZXMgKi8KLSAgICByZXR1cm4gZG9fc2x1cnBfYnNkX2FybWFwIChhYmZkKTsKLQotICBpZiAoc3RybmNtcCAobmV4dG5hbWUsICIvICAgICAgICAgICAgICAgIiwgMTYpKQotICAgIHsKLSAgICAgIGJmZF9oYXNfbWFwIChhYmZkKSA9IGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIG1hcGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKLSAgaWYgKG1hcGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmF3X2FybWFwID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGFiZmQsIG1hcGRhdGEtPnBhcnNlZF9zaXplKTsKLSAgaWYgKHJhd19hcm1hcCA9PSBOVUxMKQotICAgIHsKLSAgICBieWVieWU6Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgbWFwZGF0YSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgcmF3X2FybWFwLCAxLCBtYXBkYXRhLT5wYXJzZWRfc2l6ZSwgYWJmZCkgIT0KLSAgICAgIG1hcGRhdGEtPnBhcnNlZF9zaXplKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgIGJ5ZWJ5ZWJ5ZToKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSByYXdfYXJtYXApOwotICAgICAgZ290byBieWVieWU7Ci0gICAgfQotCi0gIGFyZGF0YS0+c3ltZGVmX2NvdW50ID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoUFRSKSByYXdfYXJtYXApOwotCi0gIGlmIChhcmRhdGEtPnN5bWRlZl9jb3VudCAqIEJTRF9TWU1ERUZfU0laRQotICAgICAgPiBtYXBkYXRhLT5wYXJzZWRfc2l6ZSAtIEhQVVhfU1lNREVGX0NPVU5UX1NJWkUpCi0gICAgewotICAgICAgLyogUHJvYmFibHkgd2UncmUgdXNpbmcgdGhlIHdyb25nIGJ5dGUgb3JkZXJpbmcuICAqLwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICBnb3RvIGJ5ZWJ5ZWJ5ZTsKLSAgICB9Ci0KLSAgYXJkYXRhLT5jYWNoZSA9IDA7Ci0KLSAgc3RyaW5nc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmF3X2FybWFwICsgSFBVWF9TWU1ERUZfQ09VTlRfU0laRSk7Ci0gIC8qIHNraXAgc3ltIGNvdW50IGFuZCBzdHJpbmcgc3ogKi8KLSAgc3RyaW5nYmFzZSA9ICgoY2hhciAqKSByYXdfYXJtYXAKLQkJKyBIUFVYX1NZTURFRl9DT1VOVF9TSVpFCi0JCSsgQlNEX1NUUklOR19DT1VOVF9TSVpFKTsKLSAgcmJhc2UgPSAoYmZkX2J5dGUgKikgc3RyaW5nYmFzZSArIHN0cmluZ3NpemU7Ci0gIGFyZGF0YS0+c3ltZGVmcyA9IChjYXJzeW0gKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgIChhcmRhdGEtPnN5bWRlZl9jb3VudAotCQkJCQkgICAqIEJTRF9TWU1ERUZfU0laRSkpOwotICBpZiAoIWFyZGF0YS0+c3ltZGVmcykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChjb3VudGVyID0gMCwgc2V0ID0gYXJkYXRhLT5zeW1kZWZzOwotICAgICAgIGNvdW50ZXIgPCBhcmRhdGEtPnN5bWRlZl9jb3VudDsKLSAgICAgICBjb3VudGVyKyssIHNldCsrLCByYmFzZSArPSBCU0RfU1lNREVGX1NJWkUpCi0gICAgewotICAgICAgc2V0LT5uYW1lID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYmFzZSkgKyBzdHJpbmdiYXNlOwotICAgICAgc2V0LT5maWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmJhc2UgKyBCU0RfU1lNREVGX09GRlNFVF9TSVpFKTsKLSAgICB9Ci0KLSAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIC8qIFBhZCB0byBhbiBldmVuIGJvdW5kYXJ5IGlmIHlvdSBoYXZlIHRvICovCi0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zICs9IChhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcykgJSAyOwotICAvKiBGSVhNRSwgd2Ugc2hvdWxkIHByb3ZpZGUgc29tZSB3YXkgdG8gZnJlZSByYXdfYXJkYXRhIHdoZW4KLSAgICAgd2UgYXJlIGRvbmUgdXNpbmcgdGhlIHN0cmluZ3MgZnJvbSBpdC4gIEZvciBub3csIGl0IHNlZW1zCi0gICAgIHRvIGJlIGFsbG9jYXRlZCBvbiBhbiBvYmphbGxvYyBhbnl3YXkuLi4gKi8KLSAgYmZkX2hhc19tYXAgKGFiZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiogRXh0ZW5kZWQgbmFtZSB0YWJsZS4KLQotICBOb3JtYWxseSBhcmNoaXZlcyBzdXBwb3J0IG9ubHkgMTQtY2hhcmFjdGVyIGZpbGVuYW1lcy4KLQotICBJbnRlbCBoYXMgZXh0ZW5kZWQgdGhlIGZvcm1hdDogbG9uZ2VyIG5hbWVzIGFyZSBzdG9yZWQgaW4gYSBzcGVjaWFsCi0gIGVsZW1lbnQgKHRoZSBmaXJzdCBpbiB0aGUgYXJjaGl2ZSwgb3Igc2Vjb25kIGlmIHRoZXJlIGlzIGFuIGFybWFwKTsKLSAgdGhlIG5hbWUgaW4gdGhlIGFyX2hkciBpcyByZXBsYWNlZCBieSA8c3BhY2U+PGluZGV4IGludG8gZmlsZW5hbWUKLSAgZWxlbWVudD4uICBJbmRleCBpcyB0aGUgUC5SLiBvZiBhbiBpbnQgKGRlY2ltYWwpLiAgRGF0YSBHZW5lcmFsIGhhdmUKLSAgZXh0ZW5kZWQgdGhlIGZvcm1hdCBieSB1c2luZyB0aGUgcHJlZml4IC8vIGZvciB0aGUgc3BlY2lhbCBlbGVtZW50ICovCi0KLS8qIFJldHVybnMgZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlICovCi1ib29sZWFuCi1fYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciBuZXh0bmFtZVsxN107Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKm5hbWVkYXRhOwotCi0gIC8qIEZJWE1FOiAgRm9ybWF0dGluZyBzdWNrcyBoZXJlLCBhbmQgaW4gY2FzZSBvZiBmYWlsdXJlIG9mIEJGRF9SRUFELAotICAgICB3ZSBwcm9iYWJseSBkb24ndCB3YW50IHRvIHJldHVybiB0cnVlLiAgKi8KLSAgYmZkX3NlZWsgKGFiZmQsIGJmZF9hcmRhdGEgKGFiZmQpLT5maXJzdF9maWxlX2ZpbGVwb3MsIFNFRUtfU0VUKTsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBuZXh0bmFtZSwgMSwgMTYsIGFiZmQpID09IDE2KQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAtIDE2LCBTRUVLX0NVUikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJuY21wIChuZXh0bmFtZSwgIkFSRklMRU5BTUVTLyAgICAiLCAxNikgIT0gMCAmJgotCSAgc3RybmNtcCAobmV4dG5hbWUsICIvLyAgICAgICAgICAgICAgIiwgMTYpICE9IDApCi0JewotCSAgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzID0gTlVMTDsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgbmFtZWRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKLSAgICAgIGlmIChuYW1lZGF0YSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzID0KLQliZmRfemFsbG9jIChhYmZkLCBuYW1lZGF0YS0+cGFyc2VkX3NpemUpOwotICAgICAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9PSBOVUxMKQotCXsKLQlieWVieWU6Ci0JICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgbmFtZWRhdGEpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMsIDEsCi0JCSAgICBuYW1lZGF0YS0+cGFyc2VkX3NpemUsIGFiZmQpICE9IG5hbWVkYXRhLT5wYXJzZWRfc2l6ZSkKLQl7Ci0JICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0JICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgKGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcykpOwotCSAgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzID0gTlVMTDsKLQkgIGdvdG8gYnllYnllOwotCX0KLQotICAgICAgLyogU2luY2UgdGhlIGFyY2hpdmUgaXMgc3VwcG9zZWQgdG8gYmUgcHJpbnRhYmxlIGlmIGl0IGNvbnRhaW5zCi0JIHRleHQsIHRoZSBlbnRyaWVzIGluIHRoZSBsaXN0IGFyZSBuZXdsaW5lLXBhZGRlZCwgbm90IG51bGwKLQkgcGFkZGVkLiBJbiBTVlI0LXN0eWxlIGFyY2hpdmVzLCB0aGUgbmFtZXMgYWxzbyBoYXZlIGEKLQkgdHJhaWxpbmcgJy8nLiAgRE9TL05UIGNyZWF0ZWQgYXJjaGl2ZSBvZnRlbiBoYXZlIFwgaW4gdGhlbQotCSBXZSdsbCBmaXggYWxsIHByb2JsZW1zIGhlcmUuLiAgKi8KLSAgICAgIHsKLQljaGFyICp0ZW1wID0gYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzOwotCWNoYXIgKmxpbWl0ID0gdGVtcCArIG5hbWVkYXRhLT5wYXJzZWRfc2l6ZTsKLQlmb3IgKDsgdGVtcCA8IGxpbWl0OyArK3RlbXApIHsKLQkgIGlmICgqdGVtcCA9PSAnXDAxMicpCi0JICAgIHRlbXBbdGVtcFstMV0gPT0gJy8nID8gLTEgOiAwXSA9ICdcMCc7Ci0JICBpZiAoKnRlbXAgPT0gJ1xcJykKLQkgICAgKnRlbXAgPSAnLyc7Ci0JfQotICAgICAgfQotCi0gICAgICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeSBpZiB5b3UgaGF2ZSB0byAqLwotICAgICAgYmZkX2FyZGF0YSAoYWJmZCktPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgICAgIGJmZF9hcmRhdGEgKGFiZmQpLT5maXJzdF9maWxlX2ZpbGVwb3MgKz0KLQkoYmZkX2FyZGF0YSAoYWJmZCktPmZpcnN0X2ZpbGVfZmlsZXBvcykgJSAyOwotCi0gICAgICAvKiBGSVhNRSwgd2UgY2FuJ3QgcmVsZWFzZSBuYW1lZGF0YSBoZXJlIGJlY2F1c2UgaXQgd2FzIGFsbG9jYXRlZAotCSBiZWxvdyBleHRlbmRlZF9uYW1lcyBvbiB0aGUgb2JqYWxsb2MuLi4gKi8KLSAgICAgIC8qIGJmZF9yZWxlYXNlIChhYmZkLCBuYW1lZGF0YSk7ICovCi0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmZGVmIFZNUwotCi0vKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHVmZiBpbiB0aGUgZmlsZW5hbWUgYmV0d2VlbiBhbnkgOl0+IGFuZCBhCi0gICBzZW1pY29sb24gKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKLW5vcm1hbGl6ZSAoYWJmZCwgZmlsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpmaWxlOwotewotICBDT05TVCBjaGFyICpmaXJzdDsKLSAgQ09OU1QgY2hhciAqbGFzdDsKLSAgY2hhciAqY29weTsKLQotICBmaXJzdCA9IGZpbGUgKyBzdHJsZW4gKGZpbGUpIC0gMTsKLSAgbGFzdCA9IGZpcnN0ICsgMTsKLQotICB3aGlsZSAoZmlyc3QgIT0gZmlsZSkKLSAgICB7Ci0gICAgICBpZiAoKmZpcnN0ID09ICc7JykKLQlsYXN0ID0gZmlyc3Q7Ci0gICAgICBpZiAoKmZpcnN0ID09ICc6JyB8fCAqZmlyc3QgPT0gJ10nIHx8ICpmaXJzdCA9PSAnPicpCi0JewotCSAgZmlyc3QrKzsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGZpcnN0LS07Ci0gICAgfQotCi0gIGNvcHkgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIGxhc3QgLSBmaXJzdCArIDEpOwotICBpZiAoY29weSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIG1lbWNweSAoY29weSwgZmlyc3QsIGxhc3QgLSBmaXJzdCk7Ci0gIGNvcHlbbGFzdCAtIGZpcnN0XSA9IDA7Ci0KLSAgcmV0dXJuIGNvcHk7Ci19Ci0KLSNlbHNlCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ub3JtYWxpemUgKGFiZmQsIGZpbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLXsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBzdHJyY2hyIChmaWxlLCAnLycpOwotCi0gIGlmIChmaWxlbmFtZSAhPSAoY2hhciAqKSBOVUxMKQotICAgIGZpbGVuYW1lKys7Ci0gIGVsc2UKLSAgICBmaWxlbmFtZSA9IGZpbGU7Ci0gIHJldHVybiBmaWxlbmFtZTsKLX0KLSNlbmRpZgotCi0vKiBCdWlsZCBhIEJGRCBzdHlsZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCwgdGFibG9jLCB0YWJsZW4sIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqKnRhYmxvYzsKLSAgICAgYmZkX3NpemVfdHlwZSAqdGFibGVuOwotICAgICBjb25zdCBjaGFyICoqbmFtZTsKLXsKLSAgKm5hbWUgPSAiQVJGSUxFTkFNRVMvIjsKLSAgcmV0dXJuIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQsIGZhbHNlLCB0YWJsb2MsIHRhYmxlbik7Ci19Ci0KLS8qIEJ1aWxkIGFuIFNWUjQgc3R5bGUgZXh0ZW5kZWQgbmFtZSB0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0YWJsb2MsIHRhYmxlbiwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICoqdGFibG9jOwotICAgICBiZmRfc2l6ZV90eXBlICp0YWJsZW47Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lOwotewotICAqbmFtZSA9ICIvLyI7Ci0gIHJldHVybiBfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0cnVlLCB0YWJsb2MsIHRhYmxlbik7Ci19Ci0KLS8qIEZvbGxvd3MgYXJjaGl2ZV9oZWFkIGFuZCBwcm9kdWNlcyBhbiBleHRlbmRlZCBuYW1lIHRhYmxlIGlmCi0gICBuZWNlc3NhcnkuICBSZXR1cm5zIChpbiB0YWJsb2MpIGEgcG9pbnRlciB0byBhbiBleHRlbmRlZCBuYW1lCi0gICB0YWJsZSwgYW5kIGluIHRhYmxlbiB0aGUgbGVuZ3RoIG9mIHRoZSB0YWJsZS4gIElmIGl0IG1ha2VzIGFuIGVudHJ5Ci0gICBpdCBjbG9iYmVycyB0aGUgZmlsZW5hbWUgc28gdGhhdCB0aGUgZWxlbWVudCBtYXkgYmUgd3JpdHRlbiB3aXRob3V0Ci0gICBmdXJ0aGVyIG1hc3NhZ2UuICBSZXR1cm5zIHRydWUgaWYgaXQgcmFuIHN1Y2Nlc3NmdWxseSwgZmFsc2UgaWYKLSAgIHNvbWV0aGluZyB3ZW50IHdyb25nLiAgQSBzdWNjZXNzZnVsIHJldHVybiBtYXkgc3RpbGwgaW52b2x2ZSBhCi0gICB6ZXJvLWxlbmd0aCB0YWJsZW4hICAqLwotCi1ib29sZWFuCi1fYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0cmFpbGluZ19zbGFzaCwgdGFibG9jLCB0YWJsZW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiB0cmFpbGluZ19zbGFzaDsKLSAgICAgY2hhciAqKnRhYmxvYzsKLSAgICAgYmZkX3NpemVfdHlwZSAqdGFibGVuOwotewotICB1bnNpZ25lZCBpbnQgbWF4bmFtZSA9IGFiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuOwotICB1bnNpZ25lZCBpbnQgdG90YWxfbmFtZWxlbiA9IDA7Ci0gIGJmZCAqY3VycmVudDsKLSAgY2hhciAqc3RycHRyOwotCi0gICp0YWJsZW4gPSAwOwotCi0gIC8qIEZpZ3VyZSBvdXQgaG93IGxvbmcgdGhlIHRhYmxlIHNob3VsZCBiZSAqLwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbm9ybWFsOwotICAgICAgdW5zaWduZWQgaW50IHRoaXNsZW47Ci0KLSAgICAgIG5vcm1hbCA9IG5vcm1hbGl6ZSAoY3VycmVudCwgY3VycmVudC0+ZmlsZW5hbWUpOwotICAgICAgaWYgKG5vcm1hbCA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgdGhpc2xlbiA9IHN0cmxlbiAobm9ybWFsKTsKLQotICAgICAgaWYgKHRoaXNsZW4gPiBtYXhuYW1lCi0JICAmJiAoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0JdGhpc2xlbiA9IG1heG5hbWU7Ci0KLSAgICAgIGlmICh0aGlzbGVuID4gbWF4bmFtZSkKLQl7Ci0JICAvKiBBZGQgb25lIHRvIGxlYXZlIHJvb20gZm9yIFxuLiAgKi8KLQkgIHRvdGFsX25hbWVsZW4gKz0gdGhpc2xlbiArIDE7Ci0JICBpZiAodHJhaWxpbmdfc2xhc2gpCi0JICAgIHsKLQkgICAgICAvKiBMZWF2ZSByb29tIGZvciB0cmFpbGluZyBzbGFzaC4gICovCi0JICAgICAgKyt0b3RhbF9uYW1lbGVuOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBhcl9oZHIgKmhkciA9IGFyY2hfaGRyIChjdXJyZW50KTsKLQkgIGlmIChzdHJuY21wIChub3JtYWwsIGhkci0+YXJfbmFtZSwgdGhpc2xlbikgIT0gMAotCSAgICAgIHx8ICh0aGlzbGVuIDwgc2l6ZW9mIGhkci0+YXJfbmFtZQotCQkgICYmIGhkci0+YXJfbmFtZVt0aGlzbGVuXSAhPSBhcl9wYWRjaGFyIChjdXJyZW50KSkpCi0JICAgIHsKLQkgICAgICAvKiBNdXN0IGhhdmUgYmVlbiB1c2luZyBleHRlbmRlZCBmb3JtYXQgZXZlbiB0aG91Z2ggaXQKLQkgICAgICAgICBkaWRuJ3QgbmVlZCB0by4gIEZpeCBpdCB0byB1c2Ugbm9ybWFsIGZvcm1hdC4gICovCi0JICAgICAgbWVtY3B5IChoZHItPmFyX25hbWUsIG5vcm1hbCwgdGhpc2xlbik7Ci0JICAgICAgaWYgKHRoaXNsZW4gPCBtYXhuYW1lCi0JCSAgfHwgKHRoaXNsZW4gPT0gbWF4bmFtZSAmJiB0aGlzbGVuIDwgc2l6ZW9mIGhkci0+YXJfbmFtZSkpCi0JCWhkci0+YXJfbmFtZVt0aGlzbGVuXSA9IGFyX3BhZGNoYXIgKGN1cnJlbnQpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAodG90YWxfbmFtZWxlbiA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gICp0YWJsb2MgPSBiZmRfemFsbG9jIChhYmZkLCB0b3RhbF9uYW1lbGVuKTsKLSAgaWYgKCp0YWJsb2MgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKnRhYmxlbiA9IHRvdGFsX25hbWVsZW47Ci0gIHN0cnB0ciA9ICp0YWJsb2M7Ci0KLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+YXJjaGl2ZV9oZWFkOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPQotICAgICAgIGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbm9ybWFsOwotICAgICAgdW5zaWduZWQgaW50IHRoaXNsZW47Ci0KLSAgICAgIG5vcm1hbCA9IG5vcm1hbGl6ZSAoY3VycmVudCwgY3VycmVudC0+ZmlsZW5hbWUpOwotICAgICAgaWYgKG5vcm1hbCA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgdGhpc2xlbiA9IHN0cmxlbiAobm9ybWFsKTsKLSAgICAgIGlmICh0aGlzbGVuID4gbWF4bmFtZSkKLQl7Ci0JICAvKiBXb3JrcyBmb3Igbm93OyBtYXkgbmVlZCB0byBiZSByZS1lbmdpbmVlcmVkIGlmIHdlCi0JICAgICBlbmNvdW50ZXIgYW4gb2RkYmFsbCBhcmNoaXZlIGZvcm1hdCBhbmQgd2FudCB0bwotCSAgICAgZ2VuZXJhbGlzZSB0aGlzIGhhY2suICovCi0JICBzdHJ1Y3QgYXJfaGRyICpoZHIgPSBhcmNoX2hkciAoY3VycmVudCk7Ci0JICBzdHJjcHkgKHN0cnB0ciwgbm9ybWFsKTsKLQkgIGlmICghIHRyYWlsaW5nX3NsYXNoKQotCSAgICBzdHJwdHJbdGhpc2xlbl0gPSAnXDAxMic7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHJwdHJbdGhpc2xlbl0gPSAnLyc7Ci0JICAgICAgc3RycHRyW3RoaXNsZW4gKyAxXSA9ICdcMDEyJzsKLQkgICAgfQotCSAgaGRyLT5hcl9uYW1lWzBdID0gYXJfcGFkY2hhciAoY3VycmVudCk7Ci0JICAvKiBXZSBrbm93IHRoZXJlIHdpbGwgYWx3YXlzIGJlIGVub3VnaCByb29tIChvbmUgb2YgdGhlIGZldwotCSAgICAgY2FzZXMgd2hlcmUgeW91IG1heSBzYWZlbHkgdXNlIHNwcmludGYpLiAqLwotCSAgc3ByaW50ZiAoKGhkci0+YXJfbmFtZSkgKyAxLCAiJS1kIiwgKHVuc2lnbmVkKSAoc3RycHRyIC0gKnRhYmxvYykpOwotCSAgLyogS2luZGEgS2x1ZGd5LiAgV2Ugc2hvdWxkIGp1c3QgdXNlIHRoZSByZXR1cm5lZCB2YWx1ZSBvZgotCSAgICAgc3ByaW50ZiBidXQgbm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgZ2V0IHRoaXMgcmlnaHQgKi8KLQkgIHsKLQkgICAgY2hhciAqdGVtcCA9IGhkci0+YXJfbmFtZSArIDI7Ci0JICAgIGZvciAoOyB0ZW1wIDwgaGRyLT5hcl9uYW1lICsgbWF4bmFtZTsgdGVtcCsrKQotCSAgICAgIGlmICgqdGVtcCA9PSAnXDAnKQotCQkqdGVtcCA9ICcgJzsKLQkgIH0KLQkgIHN0cnB0ciArPSB0aGlzbGVuICsgMTsKLQkgIGlmICh0cmFpbGluZ19zbGFzaCkKLQkgICAgKytzdHJwdHI7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qKiBBIGNvdXBsZSBvZiBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGFyX2hkcnMgKi8KLQotLyogVGFrZXMgYSBmaWxlbmFtZSwgcmV0dXJucyBhbiBhcmVsdF9kYXRhIGZvciBpdCwgb3IgTlVMTCBpZiBpdCBjYW4ndAotICAgbWFrZSBvbmUuICBUaGUgZmlsZW5hbWUgbXVzdCByZWZlciB0byBhIGZpbGVuYW1lIGluIHRoZSBmaWxlc3lzdGVtLgotICAgVGhlIGZpbGVuYW1lIGZpZWxkIG9mIHRoZSBhcl9oZHIgd2lsbCBOT1QgYmUgaW5pdGlhbGl6ZWQuICBJZiBtZW1iZXIKLSAgIGlzIHNldCwgYW5kIGl0J3MgYW4gaW4tbWVtb3J5IGJmZCwgd2UgZmFrZSBpdC4gKi8KLQotc3RhdGljIHN0cnVjdCBhcmVsdGRhdGEgKgotYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0gKGFiZmQsIGZpbGVuYW1lLCBtZW1iZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGJmZCAqbWVtYmVyOwotewotICBzdHJ1Y3Qgc3RhdCBzdGF0dXM7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKmFyZWQ7Ci0gIHN0cnVjdCBhcl9oZHIgKmhkcjsKLSAgY2hhciAqdGVtcCwgKnRlbXAxOwotCi0gIGlmIChtZW1iZXIgJiYgKG1lbWJlci0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIEFzc3VtZSB3ZSBqdXN0ICJtYWRlIiB0aGUgbWVtYmVyLCBhbmQgZmFrZSBpdCAqLwotICAgICAgc3RydWN0IGJmZF9pbl9tZW1vcnkgKmJpbSA9IChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKSBtZW1iZXItPmlvc3RyZWFtOwotICAgICAgdGltZSgmc3RhdHVzLnN0X210aW1lKTsKLSAgICAgIHN0YXR1cy5zdF91aWQgPSBnZXR1aWQoKTsKLSAgICAgIHN0YXR1cy5zdF9naWQgPSBnZXRnaWQoKTsKLSAgICAgIHN0YXR1cy5zdF9tb2RlID0gMDY0NDsKLSAgICAgIHN0YXR1cy5zdF9zaXplID0gYmltLT5zaXplOwotICAgIH0KLSAgZWxzZSBpZiAoc3RhdCAoZmlsZW5hbWUsICZzdGF0dXMpICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBhcmVkID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArCi0JCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgYXJlbHRkYXRhKSk7Ci0gIGlmIChhcmVkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGhkciA9IChzdHJ1Y3QgYXJfaGRyICopICgoKGNoYXIgKikgYXJlZCkgKyBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpKTsKLQotICAvKiBhciBoZWFkZXJzIGFyZSBzcGFjZSBwYWRkZWQsIG5vdCBudWxsIHBhZGRlZCEgKi8KLSAgbWVtc2V0ICgoUFRSKSBoZHIsICcgJywgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0KLSAgc3RybmNweSAoaGRyLT5hcl9mbWFnLCBBUkZNQUcsIDIpOwotCi0gIC8qIEdvZGRhbW5lZCBzcHJpbnRmIGRvZXNuJ3QgcGVybWl0IE1BWElNVU0gZmllbGQgbGVuZ3RocyAqLwotICBzcHJpbnRmICgoaGRyLT5hcl9kYXRlKSwgIiUtMTJsZCIsIChsb25nKSBzdGF0dXMuc3RfbXRpbWUpOwotICBzcHJpbnRmICgoaGRyLT5hcl91aWQpLCAiJWxkIiwgKGxvbmcpIHN0YXR1cy5zdF91aWQpOwotICBzcHJpbnRmICgoaGRyLT5hcl9naWQpLCAiJWxkIiwgKGxvbmcpIHN0YXR1cy5zdF9naWQpOwotICBzcHJpbnRmICgoaGRyLT5hcl9tb2RlKSwgIiUtOG8iLCAodW5zaWduZWQgaW50KSBzdGF0dXMuc3RfbW9kZSk7Ci0gIHNwcmludGYgKChoZHItPmFyX3NpemUpLCAiJS0xMGxkIiwgKGxvbmcpIHN0YXR1cy5zdF9zaXplKTsKLSAgLyogQ29ycmVjdCBmb3IgYSBsb3NzYWdlIGluIHNwcmludGYgd2hlcmVieSBpdCBudWxsLXRlcm1pbmF0ZXMuICBJIGNhbm5vdAotICAgICB1bmRlcnN0YW5kIGhvdyB0aGVzZSBDIGxvc2VycyBjb3VsZCBkZXNpZ24gc3VjaCBhIHJhbXNoYWNrbGUgYnVuY2ggb2YKLSAgICAgSU8gb3BlcmF0aW9ucyAqLwotICB0ZW1wID0gKGNoYXIgKikgaGRyOwotICB0ZW1wMSA9IHRlbXAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpIC0gMjsKLSAgZm9yICg7IHRlbXAgPCB0ZW1wMTsgdGVtcCsrKQotICAgIHsKLSAgICAgIGlmICgqdGVtcCA9PSAnXDAnKQotCSp0ZW1wID0gJyAnOwotICAgIH0KLSAgc3RybmNweSAoaGRyLT5hcl9mbWFnLCBBUkZNQUcsIDIpOwotICBhcmVkLT5wYXJzZWRfc2l6ZSA9IHN0YXR1cy5zdF9zaXplOwotICBhcmVkLT5hcmNoX2hlYWRlciA9IChjaGFyICopIGhkcjsKLQotICByZXR1cm4gYXJlZDsKLX0KLQotLyogVGhpcyBpcyBtYWdpYyByZXF1aXJlZCBieSB0aGUgImFyIiBwcm9ncmFtLiAgU2luY2UgaXQncwotICAgIHVuZG9jdW1lbnRlZCwgaXQncyB1bmRvY3VtZW50ZWQuICBZb3UgbWF5IHRoaW5rIHRoYXQgaXQgd291bGQgdGFrZQotICAgIGEgc3Ryb25nIHN0b21hY2ggdG8gd3JpdGUgdGhpcywgYW5kIGl0IGRvZXMsIGJ1dCBpdCB0YWtlcyBldmVuIGEKLSAgICBzdHJvbmdlciBzdG9tYWNoIHRvIHRyeSB0byBjb2RlIGFyb3VuZCBzdWNoIGEgdGhpbmchICAqLwotCi1zdHJ1Y3QgYXJfaGRyICpiZmRfc3BlY2lhbF91bmRvY3VtZW50ZWRfZ2x1ZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0cnVjdCBhcl9oZHIgKgotYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUgKGFiZmQsIGZpbGVuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBzdHJ1Y3QgYXJlbHRkYXRhICphcl9lbHQgPSBiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSAoYWJmZCwgZmlsZW5hbWUsIDApOwotICBpZiAoYXJfZWx0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiAoc3RydWN0IGFyX2hkciAqKSBhcl9lbHQtPmFyY2hfaGVhZGVyOwotfQotCi0KLS8qIEFuYWxvZ291cyB0byBzdGF0IGNhbGwgKi8KLWludAotYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzdGF0ICpidWY7Ci17Ci0gIHN0cnVjdCBhcl9oZHIgKmhkcjsKLSAgY2hhciAqYWxvc2VyOwotCi0gIGlmIChhYmZkLT5hcmVsdF9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaGRyID0gYXJjaF9oZHIgKGFiZmQpOwotCi0jZGVmaW5lIGZvbyhhcmVsdCwgc3RlbHQsIHNpemUpICBcCi0gIGJ1Zi0+c3RlbHQgPSBzdHJ0b2wgKGhkci0+YXJlbHQsICZhbG9zZXIsIHNpemUpOyBcCi0gIGlmIChhbG9zZXIgPT0gaGRyLT5hcmVsdCkgcmV0dXJuIC0xOwotCi0gIGZvbyAoYXJfZGF0ZSwgc3RfbXRpbWUsIDEwKTsKLSAgZm9vIChhcl91aWQsIHN0X3VpZCwgMTApOwotICBmb28gKGFyX2dpZCwgc3RfZ2lkLCAxMCk7Ci0gIGZvbyAoYXJfbW9kZSwgc3RfbW9kZSwgOCk7Ci0KLSAgYnVmLT5zdF9zaXplID0gYXJjaF9lbHRkYXRhIChhYmZkKS0+cGFyc2VkX3NpemU7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLWJmZF9kb250X3RydW5jYXRlX2FybmFtZSAoYWJmZCwgcGF0aG5hbWUsIGFyaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKnBhdGhuYW1lOwotICAgICBjaGFyICphcmhkcjsKLXsKLSAgLyogRklYTUU6IFRoaXMgaW50ZXJhY3RzIHVucGxlYXNhbnRseSB3aXRoIGFyJ3MgcXVpY2stYXBwZW5kIG9wdGlvbi4KLSAgICAgRm9ydHVuYXRlbHkgaWM5NjAgdXNlcnMgd2lsbCBuZXZlciB1c2UgdGhhdCBvcHRpb24uICBGaXhpbmcgdGhpcwotICAgICBpcyB2ZXJ5IGhhcmQ7IGZvcnR1bmF0ZWx5IEkga25vdyBob3cgdG8gZG8gaXQgYW5kIHdpbGwgZG8gc28gb25jZQotICAgICBpbnRlbCdzIHJlbGVhc2UgaXMgb3V0IHRoZSBkb29yLiAqLwotCi0gIHN0cnVjdCBhcl9oZHIgKmhkciA9IChzdHJ1Y3QgYXJfaGRyICopIGFyaGRyOwotICBzaXplX3QgbGVuZ3RoOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgc2l6ZV90IG1heGxlbiA9IGFyX21heG5hbWVsZW4gKGFiZmQpOwotCi0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0gICAgewotICAgICAgYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUgKGFiZmQsIHBhdGhuYW1lLCBhcmhkcik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGZpbGVuYW1lID0gbm9ybWFsaXplIChhYmZkLCBwYXRobmFtZSk7Ci0gIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgbGVuZ3RoID0gc3RybGVuIChmaWxlbmFtZSk7Ci0KLSAgaWYgKGxlbmd0aCA8PSBtYXhsZW4pCi0gICAgbWVtY3B5IChoZHItPmFyX25hbWUsIGZpbGVuYW1lLCBsZW5ndGgpOwotCi0gIC8qIEFkZCB0aGUgcGFkZGluZyBjaGFyYWN0ZXIgaWYgdGhlcmUgaXMgcm9vbSBmb3IgaXQuICAqLwotICBpZiAobGVuZ3RoIDwgbWF4bGVuCi0gICAgICB8fCAobGVuZ3RoID09IG1heGxlbiAmJiBsZW5ndGggPCBzaXplb2YgaGRyLT5hcl9uYW1lKSkKLSAgICAoaGRyLT5hcl9uYW1lKVtsZW5ndGhdID0gYXJfcGFkY2hhciAoYWJmZCk7Ci19Ci0KLXZvaWQKLWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lIChhYmZkLCBwYXRobmFtZSwgYXJoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqcGF0aG5hbWU7Ci0gICAgIGNoYXIgKmFyaGRyOwotewotICBzdHJ1Y3QgYXJfaGRyICpoZHIgPSAoc3RydWN0IGFyX2hkciAqKSBhcmhkcjsKLSAgaW50IGxlbmd0aDsKLSAgQ09OU1QgY2hhciAqZmlsZW5hbWUgPSBzdHJyY2hyIChwYXRobmFtZSwgJy8nKTsKLSAgaW50IG1heGxlbiA9IGFyX21heG5hbWVsZW4gKGFiZmQpOwotCi0gIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotICAgIGZpbGVuYW1lID0gcGF0aG5hbWU7Ci0gIGVsc2UKLSAgICArK2ZpbGVuYW1lOwotCi0gIGxlbmd0aCA9IHN0cmxlbiAoZmlsZW5hbWUpOwotCi0gIGlmIChsZW5ndGggPD0gbWF4bGVuKQotICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbGVuZ3RoKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHBhdGhuYW1lOiBtZWV0IHByb2NydXN0ZXMgKi8KLSAgICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbWF4bGVuKTsKLSAgICAgIGxlbmd0aCA9IG1heGxlbjsKLSAgICB9Ci0KLSAgaWYgKGxlbmd0aCA8IG1heGxlbikKLSAgICAoaGRyLT5hcl9uYW1lKVtsZW5ndGhdID0gYXJfcGFkY2hhciAoYWJmZCk7Ci19Ci0KLS8qIFN0b3JlIG5hbWUgaW50byBhciBoZWFkZXIuICBUcnVuY2F0ZXMgdGhlIG5hbWUgdG8gZml0LgotICAgMT4gc3RyaXAgcGF0aG5hbWUgdG8gYmUganVzdCB0aGUgYmFzZW5hbWUuCi0gICAyPiBpZiBpdCdzIHNob3J0IGVudWYgdG8gZml0LCBzdHVmZiBpdCBpbi4KLSAgIDM+IElmIGl0IGRvZXNuJ3QgZW5kIHdpdGggLm8sIHRydW5jYXRlIGl0IHRvIGZpdAotICAgND4gdHJ1bmNhdGUgaXQgYmVmb3JlIHRoZSAubywgYXBwZW5kIC5vLCBzdHVmZiBUSEFUIGluLiAgKi8KLQotLyogVGhpcyBpcyB3aGF0IGdudSBhciBkb2VzLiAgSXQncyBiZXR0ZXIgYnV0IGluY29tcGF0aWJsZSB3aXRoIHRoZQotICAgYnNkIGFyLiAqLwotCi12b2lkCi1iZmRfZ251X3RydW5jYXRlX2FybmFtZSAoYWJmZCwgcGF0aG5hbWUsIGFyaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKnBhdGhuYW1lOwotICAgICBjaGFyICphcmhkcjsKLXsKLSAgc3RydWN0IGFyX2hkciAqaGRyID0gKHN0cnVjdCBhcl9oZHIgKikgYXJoZHI7Ci0gIGludCBsZW5ndGg7Ci0gIENPTlNUIGNoYXIgKmZpbGVuYW1lID0gc3RycmNociAocGF0aG5hbWUsICcvJyk7Ci0gIGludCBtYXhsZW4gPSBhcl9tYXhuYW1lbGVuIChhYmZkKTsKLQotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICBmaWxlbmFtZSA9IHBhdGhuYW1lOwotICBlbHNlCi0gICAgKytmaWxlbmFtZTsKLQotICBsZW5ndGggPSBzdHJsZW4gKGZpbGVuYW1lKTsKLQotICBpZiAobGVuZ3RoIDw9IG1heGxlbikKLSAgICBtZW1jcHkgKGhkci0+YXJfbmFtZSwgZmlsZW5hbWUsIGxlbmd0aCk7Ci0gIGVsc2UKLSAgICB7CQkJCS8qIHBhdGhuYW1lOiBtZWV0IHByb2NydXN0ZXMgKi8KLSAgICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbWF4bGVuKTsKLSAgICAgIGlmICgoZmlsZW5hbWVbbGVuZ3RoIC0gMl0gPT0gJy4nKSAmJiAoZmlsZW5hbWVbbGVuZ3RoIC0gMV0gPT0gJ28nKSkKLQl7Ci0JICBoZHItPmFyX25hbWVbbWF4bGVuIC0gMl0gPSAnLic7Ci0JICBoZHItPmFyX25hbWVbbWF4bGVuIC0gMV0gPSAnbyc7Ci0JfQotICAgICAgbGVuZ3RoID0gbWF4bGVuOwotICAgIH0KLQotICBpZiAobGVuZ3RoIDwgMTYpCi0gICAgKGhkci0+YXJfbmFtZSlbbGVuZ3RoXSA9IGFyX3BhZGNoYXIgKGFiZmQpOwotfQotDAotLyogVGhlIEJGRCBpcyBvcGVuIGZvciB3cml0ZSBhbmQgaGFzIGl0cyBmb3JtYXQgc2V0IHRvIGJmZF9hcmNoaXZlICovCi0KLWJvb2xlYW4KLV9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyAoYXJjaCkKLSAgICAgYmZkICphcmNoOwotewotICBiZmQgKmN1cnJlbnQ7Ci0gIGNoYXIgKmV0YWJsZSA9IE5VTEw7Ci0gIGJmZF9zaXplX3R5cGUgZWxlbmd0aCA9IDA7Ci0gIGNvbnN0IGNoYXIgKmVuYW1lID0gTlVMTDsKLSAgYm9vbGVhbiBtYWtlbWFwID0gYmZkX2hhc19tYXAgKGFyY2gpOwotICBib29sZWFuIGhhc29iamVjdHMgPSBmYWxzZTsJLyogaWYgbm8gLm8ncywgZG9uJ3QgYm90aGVyIHRvIG1ha2UgYSBtYXAgKi8KLSAgYmZkX3NpemVfdHlwZSB3cm90ZTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCB0cmllczsKLQotICAvKiBWZXJpZnkgdGhlIHZpYWJpbGl0eSBvZiBhbGwgZW50cmllczsgaWYgYW55IG9mIHRoZW0gbGl2ZSBpbiB0aGUKLSAgICAgZmlsZXN5c3RlbSAoYXMgb3Bwb3NlZCB0byBsaXZpbmcgaW4gYW4gYXJjaGl2ZSBvcGVuIGZvciBpbnB1dCkKLSAgICAgdGhlbiBjb25zdHJ1Y3QgYSBmcmVzaCBhcl9oZHIgZm9yIHRoZW0uICAqLwotICBmb3IgKGN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7IGN1cnJlbnQ7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChiZmRfd3JpdGVfcCAoY3VycmVudCkpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoIWN1cnJlbnQtPmFyZWx0X2RhdGEpCi0JewotCSAgY3VycmVudC0+YXJlbHRfZGF0YSA9Ci0JICAgIChQVFIpIGJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtIChhcmNoLCBjdXJyZW50LT5maWxlbmFtZSwgY3VycmVudCk7Ci0JICBpZiAoIWN1cnJlbnQtPmFyZWx0X2RhdGEpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogUHV0IGluIHRoZSBmaWxlIG5hbWUgKi8KLQkgIEJGRF9TRU5EIChhcmNoLCBfYmZkX3RydW5jYXRlX2FybmFtZSwgKGFyY2gsCi0JCQkJCQkgY3VycmVudC0+ZmlsZW5hbWUsCi0JCQkJCSAgICAgIChjaGFyICopIGFyY2hfaGRyIChjdXJyZW50KSkpOwotCX0KLQotICAgICAgaWYgKG1ha2VtYXAgJiYgISBoYXNvYmplY3RzKQotCXsJCQkvKiBkb24ndCBib3RoZXIgaWYgd2Ugd29uJ3QgbWFrZSBhIG1hcCEgKi8KLQkgIGlmICgoYmZkX2NoZWNrX2Zvcm1hdCAoY3VycmVudCwgYmZkX29iamVjdCkpCi0jaWYgMAkJCQkvKiBGSVhNRSAtLSB0aGVzZSBhcmUgbm90IHNldCBjb3JyZWN0bHkgKi8KLQkgICAgICAmJiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoY3VycmVudCkgJiBIQVNfU1lNUykpCi0jZW5kaWYKLQkgICAgKQotCSAgICBoYXNvYmplY3RzID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIGlmICghQkZEX1NFTkQgKGFyY2gsIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUsCi0JCSAoYXJjaCwgJmV0YWJsZSwgJmVsZW5ndGgsICZlbmFtZSkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFyY2gsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotI2lmZGVmIEdOVTk2MAotICB3cm90ZSA9IGJmZF93cml0ZSAoQkZEX0dOVTk2MF9BUk1BRyAoYXJjaCksIDEsIFNBUk1BRywgYXJjaCk7Ci0jZWxzZQotICB3cm90ZSA9IGJmZF93cml0ZSAoQVJNQUcsIDEsIFNBUk1BRywgYXJjaCk7Ci0jZW5kaWYKLSAgaWYgKHdyb3RlICE9IFNBUk1BRykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG1ha2VtYXAgJiYgaGFzb2JqZWN0cykKLSAgICB7Ci0gICAgICBpZiAoX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCkgIT0gdHJ1ZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGVuZ3RoICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGFyX2hkciBoZHI7Ci0KLSAgICAgIG1lbXNldCAoKGNoYXIgKikgKCZoZHIpLCAwLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgICAgIHN0cmNweSAoaGRyLmFyX25hbWUsIGVuYW1lKTsKLSAgICAgIC8qIFJvdW5kIHNpemUgdXAgdG8gZXZlbiBudW1iZXIgaW4gYXJjaGl2ZSBoZWFkZXIuICAqLwotICAgICAgc3ByaW50ZiAoJihoZHIuYXJfc2l6ZVswXSksICIlLTEwZCIsCi0JICAgICAgIChpbnQpICgoZWxlbmd0aCArIDEpICYgfjEpKTsKLSAgICAgIHN0cm5jcHkgKGhkci5hcl9mbWFnLCBBUkZNQUcsIDIpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGFyX2hkcik7IGkrKykKLQlpZiAoKChjaGFyICopICgmaGRyKSlbaV0gPT0gJ1wwJykKLQkgICgoKGNoYXIgKikgKCZoZHIpKVtpXSkgPSAnICc7Ci0gICAgICBpZiAoKGJmZF93cml0ZSAoKGNoYXIgKikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYXJjaCkKLQkgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotCSAgfHwgYmZkX3dyaXRlIChldGFibGUsIDEsIGVsZW5ndGgsIGFyY2gpICE9IGVsZW5ndGgpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKChlbGVuZ3RoICUgMikgPT0gMSkKLQl7Ci0JICBpZiAoYmZkX3dyaXRlICgiXDAxMiIsIDEsIDEsIGFyY2gpICE9IDEpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGZvciAoY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsgY3VycmVudDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgY2hhciBidWZmZXJbREVGQVVMVF9CVUZGRVJTSVpFXTsKLSAgICAgIHVuc2lnbmVkIGludCByZW1haW5pbmcgPSBhcmVsdF9zaXplIChjdXJyZW50KTsKLSAgICAgIHN0cnVjdCBhcl9oZHIgKmhkciA9IGFyY2hfaGRyIChjdXJyZW50KTsKLQotICAgICAgLyogd3JpdGUgYXIgaGVhZGVyICovCi0gICAgICBpZiAoYmZkX3dyaXRlICgoY2hhciAqKSBoZHIsIDEsIHNpemVvZiAoKmhkciksIGFyY2gpICE9IHNpemVvZiAoKmhkcikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF9zZWVrIChjdXJyZW50LCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHdoaWxlIChyZW1haW5pbmcpCi0JewotCSAgdW5zaWduZWQgaW50IGFtdCA9IERFRkFVTFRfQlVGRkVSU0laRTsKLQkgIGlmIChhbXQgPiByZW1haW5pbmcpCi0JICAgIGFtdCA9IHJlbWFpbmluZzsKLQkgIGVycm5vID0gMDsKLQkgIGlmIChiZmRfcmVhZCAoYnVmZmVyLCBhbXQsIDEsIGN1cnJlbnQpICE9IGFtdCkKLQkgICAgewotCSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGlmIChiZmRfd3JpdGUgKGJ1ZmZlciwgYW10LCAxLCBhcmNoKSAhPSBhbXQpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHJlbWFpbmluZyAtPSBhbXQ7Ci0JfQotICAgICAgaWYgKChhcmVsdF9zaXplIChjdXJyZW50KSAlIDIpID09IDEpCi0JewotCSAgaWYgKGJmZF93cml0ZSAoIlwwMTIiLCAxLCAxLCBhcmNoKSAhPSAxKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAobWFrZW1hcCAmJiBoYXNvYmplY3RzKQotICAgIHsKLSAgICAgIC8qIFZlcmlmeSB0aGUgdGltZXN0YW1wIGluIHRoZSBhcmNoaXZlIGZpbGUuICBJZiBpdCB3b3VsZCBub3QgYmUKLQkgYWNjZXB0ZWQgYnkgdGhlIGxpbmtlciwgcmV3cml0ZSBpdCB1bnRpbCBpdCB3b3VsZCBiZS4gIElmCi0JIGFueXRoaW5nIG9kZCBoYXBwZW5zLCBicmVhayBvdXQgYW5kIGp1c3QgcmV0dXJuLiAgKFRoZQotCSBCZXJrZWxleSBsaW5rZXIgY2hlY2tzIHRoZSB0aW1lc3RhbXAgYW5kIHJlZnVzZXMgdG8gcmVhZCB0aGUKLQkgdGFibGUtb2YtY29udGVudHMgaWYgaXQgaXMgPjYwIHNlY29uZHMgbGVzcyB0aGFuIHRoZSBmaWxlJ3MKLQkgbW9kaWZpZWQtdGltZS4gIFRoYXQgcGFpbmZ1bCBoYWNrIHJlcXVpcmVzIHRoaXMgcGFpbmZ1bCBoYWNrLiAgKi8KLSAgICAgIHRyaWVzID0gMTsKLSAgICAgIGRvCi0JewotCSAgaWYgKGJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIChhcmNoKSkKLQkgICAgYnJlYWs7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIldhcm5pbmc6IHdyaXRpbmcgYXJjaGl2ZSB3YXMgc2xvdzogcmV3cml0aW5nIHRpbWVzdGFtcFxuIikpOwotCX0KLSAgICAgIHdoaWxlICgrK3RyaWVzIDwgNik7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogTm90ZSB0aGF0IHRoZSBuYW1pZHggZm9yIHRoZSBmaXJzdCBzeW1ib2wgaXMgMCAqLwotCi1ib29sZWFuCi1fYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoKQotICAgICBiZmQgKmFyY2g7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOwotewotICBjaGFyICpmaXJzdF9uYW1lID0gTlVMTDsKLSAgYmZkICpjdXJyZW50OwotICBmaWxlX3B0ciBlbHRfbm8gPSAwOwotICBzdHJ1Y3Qgb3JsICptYXAgPSBOVUxMOwotICBpbnQgb3JsX21heCA9IDEwMjQ7CQkvKiBmaW5lIGluaXRpYWwgZGVmYXVsdCAqLwotICBpbnQgb3JsX2NvdW50ID0gMDsKLSAgaW50IHN0cmlkeCA9IDA7CQkvKiBzdHJpbmcgaW5kZXggKi8KLSAgYXN5bWJvbCAqKnN5bXMgPSBOVUxMOwotICBsb25nIHN5bXNfbWF4ID0gMDsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgLyogRHVubm8gaWYgdGhpcyBpcyB0aGUgYmVzdCBwbGFjZSBmb3IgdGhpcyBpbmZvLi4uICovCi0gIGlmIChlbGVuZ3RoICE9IDApCi0gICAgZWxlbmd0aCArPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotICBlbGVuZ3RoICs9IGVsZW5ndGggJSAyOwotCi0gIG1hcCA9IChzdHJ1Y3Qgb3JsICopIGJmZF9tYWxsb2MgKG9ybF9tYXggKiBzaXplb2YgKHN0cnVjdCBvcmwpKTsKLSAgaWYgKG1hcCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdlIHB1dCB0aGUgc3ltYm9sIG5hbWVzIG9uIHRoZSBhcmNoIG9iamFsbG9jLCBhbmQgdGhlbiBkaXNjYXJkCi0gICAgIHRoZW0gd2hlbiBkb25lLiAgKi8KLSAgZmlyc3RfbmFtZSA9IGJmZF9hbGxvYyAoYXJjaCwgMSk7Ci0gIGlmIChmaXJzdF9uYW1lID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogRHJvcCBhbGwgdGhlIGZpbGVzIGNhbGxlZCBfXy5TWU1ERUYsIHdlJ3JlIGdvaW5nIHRvIG1ha2Ugb3VyCi0gICAgIG93biAqLwotICB3aGlsZSAoYXJjaC0+YXJjaGl2ZV9oZWFkICYmCi0JIHN0cmNtcCAoYXJjaC0+YXJjaGl2ZV9oZWFkLT5maWxlbmFtZSwgIl9fLlNZTURFRiIpID09IDApCi0gICAgYXJjaC0+YXJjaGl2ZV9oZWFkID0gYXJjaC0+YXJjaGl2ZV9oZWFkLT5uZXh0OwotCi0gIC8qIE1hcCBvdmVyIGVhY2ggZWxlbWVudCAqLwotICBmb3IgKGN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7Ci0gICAgICAgY3VycmVudCAhPSAoYmZkICopIE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQsIGVsdF9ubysrKQotICAgIHsKLSAgICAgIGlmICgoYmZkX2NoZWNrX2Zvcm1hdCAoY3VycmVudCwgYmZkX29iamVjdCkgPT0gdHJ1ZSkKLQkgICYmICgoYmZkX2dldF9maWxlX2ZsYWdzIChjdXJyZW50KSAmIEhBU19TWU1TKSkpCi0JewotCSAgbG9uZyBzdG9yYWdlOwotCSAgbG9uZyBzeW1jb3VudDsKLQkgIGxvbmcgc3JjX2NvdW50OwotCi0JICBzdG9yYWdlID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGN1cnJlbnQpOwotCSAgaWYgKHN0b3JhZ2UgPCAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKHN0b3JhZ2UgIT0gMCkKLQkgICAgewotCSAgICAgIGlmIChzdG9yYWdlID4gc3ltc19tYXgpCi0JCXsKLQkJICBpZiAoc3ltc19tYXggPiAwKQotCQkgICAgZnJlZSAoc3ltcyk7Ci0JCSAgc3ltc19tYXggPSBzdG9yYWdlOwotCQkgIHN5bXMgPSAoYXN5bWJvbCAqKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc3ltc19tYXgpOwotCQkgIGlmIChzeW1zID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICAgIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGN1cnJlbnQsIHN5bXMpOwotCSAgICAgIGlmIChzeW1jb3VudCA8IDApCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgLyogTm93IG1hcCBvdmVyIGFsbCB0aGUgc3ltYm9scywgcGlja2luZyBvdXQgdGhlIG9uZXMgd2Ugd2FudCAqLwotCSAgICAgIGZvciAoc3JjX2NvdW50ID0gMDsgc3JjX2NvdW50IDwgc3ltY291bnQ7IHNyY19jb3VudCsrKQotCQl7Ci0JCSAgZmxhZ3dvcmQgZmxhZ3MgPSAoc3ltc1tzcmNfY291bnRdKS0+ZmxhZ3M7Ci0JCSAgYXNlY3Rpb24gKnNlYyA9IHN5bXNbc3JjX2NvdW50XS0+c2VjdGlvbjsKLQotCQkgIGlmICgoZmxhZ3MgJiBCU0ZfR0xPQkFMIHx8Ci0JCSAgICAgICBmbGFncyAmIEJTRl9XRUFLIHx8Ci0JCSAgICAgICBmbGFncyAmIEJTRl9JTkRJUkVDVCB8fAotCQkgICAgICAgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQotCQkgICAgICAmJiAhIGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSkKLQkJICAgIHsKLQkJICAgICAgc2l6ZV90IG5hbWVsZW47Ci0JCSAgICAgIHN0cnVjdCBvcmwgKm5ld19tYXA7Ci0KLQkJICAgICAgLyogVGhpcyBzeW1ib2wgd2lsbCBnbyBpbnRvIHRoZSBhcmNoaXZlIGhlYWRlciAqLwotCQkgICAgICBpZiAob3JsX2NvdW50ID09IG9ybF9tYXgpCi0JCQl7Ci0JCQkgIG9ybF9tYXggKj0gMjsKLQkJCSAgbmV3X21hcCA9Ci0JCQkgICAgKChzdHJ1Y3Qgb3JsICopCi0JCQkgICAgIGJmZF9yZWFsbG9jIChtYXAsIG9ybF9tYXggKiBzaXplb2YgKHN0cnVjdCBvcmwpKSk7Ci0JCQkgIGlmIChuZXdfbWFwID09IChzdHJ1Y3Qgb3JsICopIE5VTEwpCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJCSAgbWFwID0gbmV3X21hcDsKLQkJCX0KLQotCQkgICAgICBuYW1lbGVuID0gc3RybGVuIChzeW1zW3NyY19jb3VudF0tPm5hbWUpOwotCQkgICAgICBtYXBbb3JsX2NvdW50XS5uYW1lID0gKChjaGFyICoqKQotCQkJCQkgICAgIGJmZF9hbGxvYyAoYXJjaCwKLQkJCQkJCQlzaXplb2YgKGNoYXIgKikpKTsKLQkJICAgICAgaWYgKG1hcFtvcmxfY291bnRdLm5hbWUgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgICAqKG1hcFtvcmxfY291bnRdLm5hbWUpID0gYmZkX2FsbG9jIChhcmNoLCBuYW1lbGVuICsgMSk7Ci0JCSAgICAgIGlmICgqKG1hcFtvcmxfY291bnRdLm5hbWUpID09IE5VTEwpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQkJICAgICAgc3RyY3B5ICgqKG1hcFtvcmxfY291bnRdLm5hbWUpLCBzeW1zW3NyY19jb3VudF0tPm5hbWUpOwotCQkgICAgICAobWFwW29ybF9jb3VudF0pLnBvcyA9IChmaWxlX3B0cikgY3VycmVudDsKLQkJICAgICAgKG1hcFtvcmxfY291bnRdKS5uYW1pZHggPSBzdHJpZHg7Ci0KLQkJICAgICAgc3RyaWR4ICs9IG5hbWVsZW4gKyAxOwotCQkgICAgICArK29ybF9jb3VudDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIC8qIE5vdyBhc2sgdGhlIEJGRCB0byBmcmVlIHVwIGFueSBjYWNoZWQgaW5mb3JtYXRpb24sIHNvIHdlCi0JICAgICBkb24ndCBmaWxsIGFsbCBvZiBtZW1vcnkgd2l0aCBzeW1ib2wgdGFibGVzLiAgKi8KLQkgIGlmICghIGJmZF9mcmVlX2NhY2hlZF9pbmZvIChjdXJyZW50KSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBPSywgbm93IHdlIGhhdmUgY29sbGVjdGVkIGFsbCB0aGUgZGF0YSwgbGV0J3Mgd3JpdGUgdGhlbSBvdXQgKi8KLSAgcmV0ID0gQkZEX1NFTkQgKGFyY2gsIHdyaXRlX2FybWFwLAotCQkgIChhcmNoLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KSk7Ci0KLSAgaWYgKHN5bXNfbWF4ID4gMCkKLSAgICBmcmVlIChzeW1zKTsKLSAgaWYgKG1hcCAhPSBOVUxMKQotICAgIGZyZWUgKG1hcCk7Ci0gIGlmIChmaXJzdF9uYW1lICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFyY2gsIGZpcnN0X25hbWUpOwotCi0gIHJldHVybiByZXQ7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzeW1zX21heCA+IDApCi0gICAgZnJlZSAoc3ltcyk7Ci0gIGlmIChtYXAgIT0gTlVMTCkKLSAgICBmcmVlIChtYXApOwotICBpZiAoZmlyc3RfbmFtZSAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhcmNoLCBmaXJzdF9uYW1lKTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2xlYW4KLWJzZF93cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphcmNoOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICBpbnQgcGFkaXQgPSBzdHJpZHggJiAxOwotICB1bnNpZ25lZCBpbnQgcmFubGlic2l6ZSA9IG9ybF9jb3VudCAqIEJTRF9TWU1ERUZfU0laRTsKLSAgdW5zaWduZWQgaW50IHN0cmluZ3NpemUgPSBzdHJpZHggKyBwYWRpdDsKLSAgLyogSW5jbHVkZSA4IGJ5dGVzIHRvIHN0b3JlIHJhbmxpYnNpemUgYW5kIHN0cmluZ3NpemUgaW4gb3V0cHV0LiAqLwotICB1bnNpZ25lZCBpbnQgbWFwc2l6ZSA9IHJhbmxpYnNpemUgKyBzdHJpbmdzaXplICsgODsKLSAgZmlsZV9wdHIgZmlyc3RyZWFsOwotICBiZmQgKmN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7Ci0gIGJmZCAqbGFzdF9lbHQgPSBjdXJyZW50OwkvKiBsYXN0IGVsZW1lbnQgYXJjaCBzZWVuICovCi0gIGJmZF9ieXRlIHRlbXBbNF07Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgc3RydWN0IGFyX2hkciBoZHI7Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZpcnN0cmVhbCA9IG1hcHNpemUgKyBlbGVuZ3RoICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArIFNBUk1BRzsKLQotICBzdGF0IChhcmNoLT5maWxlbmFtZSwgJnN0YXRidWYpOwotICBtZW1zZXQgKChjaGFyICopICgmaGRyKSwgMCwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gIHNwcmludGYgKGhkci5hcl9uYW1lLCBSQU5MSUJNQUcpOwotICAvKiBSZW1lbWJlciB0aGUgdGltZXN0YW1wLCB0byBrZWVwIGl0IGhvbHkuICBCdXQgZnVkZ2UgaXQgYSBsaXR0bGUuICAqLwotICBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfdGltZXN0YW1wID0gc3RhdGJ1Zi5zdF9tdGltZSArIEFSTUFQX1RJTUVfT0ZGU0VUOwotICBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfZGF0ZXBvcyA9IChTQVJNQUcKLQkJCQkgICAgICArIG9mZnNldG9mIChzdHJ1Y3QgYXJfaGRyLCBhcl9kYXRlWzBdKSk7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX3RpbWVzdGFtcCk7Ci0jaWZuZGVmIF9XSU4zMgotICBzcHJpbnRmIChoZHIuYXJfdWlkLCAiJWxkIiwgKGxvbmcpIGdldHVpZCAoKSk7Ci0gIHNwcmludGYgKGhkci5hcl9naWQsICIlbGQiLCAobG9uZykgZ2V0Z2lkICgpKTsKLSNlbHNlCi0gIHNwcmludGYgKGhkci5hcl91aWQsICIlbGQiLCAobG9uZykgNjY2KTsKLSAgc3ByaW50ZiAoaGRyLmFyX2dpZCwgIiVsZCIsIChsb25nKSA0Mik7Ci0jZW5kaWYKLSAgc3ByaW50ZiAoaGRyLmFyX3NpemUsICIlLTEwZCIsIChpbnQpIG1hcHNpemUpOwotICBzdHJuY3B5IChoZHIuYXJfZm1hZywgQVJGTUFHLCAyKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGFyX2hkcik7IGkrKykKLSAgICBpZiAoKChjaGFyICopICgmaGRyKSlbaV0gPT0gJ1wwJykKLSAgICAgICgoKGNoYXIgKikgKCZoZHIpKVtpXSkgPSAnICc7Ci0gIGlmIChiZmRfd3JpdGUgKChjaGFyICopICZoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFyY2gpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgYmZkX2hfcHV0XzMyIChhcmNoLCAoYmZkX3ZtYSkgcmFubGlic2l6ZSwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKHRlbXAsIDEsIHNpemVvZiAodGVtcCksIGFyY2gpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IG9ybF9jb3VudDsgY291bnQrKykKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBidWZbQlNEX1NZTURFRl9TSVpFXTsKLQotICAgICAgaWYgKCgoYmZkICopIChtYXBbY291bnRdKS5wb3MpICE9IGxhc3RfZWx0KQotCXsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBmaXJzdHJlYWwgKz0gYXJlbHRfc2l6ZSAoY3VycmVudCkgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotCSAgICAgIGZpcnN0cmVhbCArPSBmaXJzdHJlYWwgJSAyOwotCSAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwotCSAgICB9Ci0JICB3aGlsZSAoY3VycmVudCAhPSAoYmZkICopIChtYXBbY291bnRdKS5wb3MpOwotCX0JCQkvKiBpZiBuZXcgYXJjaGl2ZSBlbGVtZW50ICovCi0KLSAgICAgIGxhc3RfZWx0ID0gY3VycmVudDsKLSAgICAgIGJmZF9oX3B1dF8zMiAoYXJjaCwgbWFwW2NvdW50XS5uYW1pZHgsIGJ1Zik7Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFyY2gsIGZpcnN0cmVhbCwgYnVmICsgQlNEX1NZTURFRl9PRkZTRVRfU0laRSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlIChidWYsIEJTRF9TWU1ERUZfU0laRSwgMSwgYXJjaCkgIT0gQlNEX1NZTURFRl9TSVpFKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogbm93IHdyaXRlIHRoZSBzdHJpbmdzIHRoZW1zZWx2ZXMgKi8KLSAgYmZkX2hfcHV0XzMyIChhcmNoLCBzdHJpbmdzaXplLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgMSwgc2l6ZW9mICh0ZW1wKSwgYXJjaCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IG9ybF9jb3VudDsgY291bnQrKykKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuID0gc3RybGVuICgqbWFwW2NvdW50XS5uYW1lKSArIDE7Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUgKCptYXBbY291bnRdLm5hbWUsIDEsIGxlbiwgYXJjaCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIHNwZWMgc2V6IHRoaXMgc2hvdWxkIGJlIGEgbmV3bGluZS4gIEJ1dCBpbiBvcmRlciB0byBiZQotICAgICBidWctY29tcGF0aWJsZSBmb3Igc3VuJ3MgYXIgd2UgdXNlIGEgbnVsbC4gKi8KLSAgaWYgKHBhZGl0KQotICAgIHsKLSAgICAgIGlmIChiZmRfd3JpdGUgKCIiLCAxLCAxLCBhcmNoKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEF0IHRoZSBlbmQgb2YgYXJjaGl2ZSBmaWxlIGhhbmRsaW5nLCB1cGRhdGUgdGhlIHRpbWVzdGFtcCBpbiB0aGUKLSAgIGZpbGUsIHNvIHRoZSBsaW5rZXIgd2lsbCBhY2NlcHQgaXQuCi0KLSAgIFJldHVybiB0cnVlIGlmIHRoZSB0aW1lc3RhbXAgd2FzIE9LLCBvciBhbiB1bnVzdWFsIHByb2JsZW0gaGFwcGVuZWQuCi0gICBSZXR1cm4gZmFsc2UgaWYgd2UgdXBkYXRlZCB0aGUgdGltZXN0YW1wLiAgKi8KLQotYm9vbGVhbgotX2JmZF9hcmNoaXZlX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIChhcmNoKQotICAgICBiZmQgKmFyY2g7Ci17Ci0gIHN0cnVjdCBzdGF0IGFyY2hzdGF0OwotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogRmx1c2ggd3JpdGVzLCBnZXQgbGFzdC13cml0ZSB0aW1lc3RhbXAgZnJvbSBmaWxlLCBhbmQgY29tcGFyZSBpdAotICAgICB0byB0aGUgdGltZXN0YW1wIElOIHRoZSBmaWxlLiAgKi8KLSAgYmZkX2ZsdXNoIChhcmNoKTsKLSAgaWYgKGJmZF9zdGF0IChhcmNoLCAmYXJjaHN0YXQpID09IC0xKQotICAgIHsKLSAgICAgIHBlcnJvciAoXygiUmVhZGluZyBhcmNoaXZlIGZpbGUgbW9kIHRpbWVzdGFtcCIpKTsKLSAgICAgIHJldHVybiB0cnVlOwkJLyogQ2FuJ3QgcmVhZCBtb2QgdGltZSBmb3Igc29tZSByZWFzb24gKi8KLSAgICB9Ci0gIGlmIChhcmNoc3RhdC5zdF9tdGltZSA8PSBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfdGltZXN0YW1wKQotICAgIHJldHVybiB0cnVlOwkJLyogT0sgYnkgdGhlIGxpbmtlcidzIHJ1bGVzICovCi0KLSAgLyogVXBkYXRlIHRoZSB0aW1lc3RhbXAuICAqLwotICBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfdGltZXN0YW1wID0gYXJjaHN0YXQuc3RfbXRpbWUgKyBBUk1BUF9USU1FX09GRlNFVDsKLQotICAvKiBQcmVwYXJlIGFuIEFTQ0lJIHZlcnNpb24gc3VpdGFibGUgZm9yIHdyaXRpbmcuICAqLwotICBtZW1zZXQgKGhkci5hcl9kYXRlLCAwLCBzaXplb2YgKGhkci5hcl9kYXRlKSk7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX3RpbWVzdGFtcCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGhkci5hcl9kYXRlKTsgaSsrKQotICAgIGlmIChoZHIuYXJfZGF0ZVtpXSA9PSAnXDAnKQotICAgICAgKGhkci5hcl9kYXRlKVtpXSA9ICcgJzsKLQotICAvKiBXcml0ZSBpdCBpbnRvIHRoZSBmaWxlLiAgKi8KLSAgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX2RhdGVwb3MgPSAoU0FSTUFHCi0JCQkJICAgICAgKyBvZmZzZXRvZiAoc3RydWN0IGFyX2hkciwgYXJfZGF0ZVswXSkpOwotICBpZiAoYmZkX3NlZWsgKGFyY2gsIGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF9kYXRlcG9zLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoaGRyLmFyX2RhdGUsIHNpemVvZiAoaGRyLmFyX2RhdGUpLCAxLCBhcmNoKQotCSAgIT0gc2l6ZW9mIChoZHIuYXJfZGF0ZSkpKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBiZmQgY2FuJ3QgY2FsbCBwZXJyb3IuICAqLwotICAgICAgcGVycm9yIChfKCJXcml0aW5nIHVwZGF0ZWQgYXJtYXAgdGltZXN0YW1wIikpOwotICAgICAgcmV0dXJuIHRydWU7CQkvKiBTb21lIGVycm9yIHdoaWxlIHdyaXRpbmcgKi8KLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwkJCS8qIFdlIHVwZGF0ZWQgdGhlIHRpbWVzdGFtcCBzdWNjZXNzZnVsbHkuICAqLwotfQotDAotLyogQSBjb2ZmIGFybWFwIGxvb2tzIGxpa2UgOgotICAgbEFSTUFHCi0gICBzdHJ1Y3QgYXJfaGRyIHdpdGggbmFtZSA9ICcvJwotICAgbnVtYmVyIG9mIHN5bWJvbHMKLSAgIG9mZnNldCBvZiBmaWxlIGZvciBzeW1ib2wgMAotICAgb2Zmc2V0IG9mIGZpbGUgZm9yIHN5bWJvbCAxCi0KLSAgIG9mZnNldCBvZiBmaWxlIGZvciBzeW1ib2wgbi0xCi0gICBzeW1ib2wgbmFtZSAwCi0gICBzeW1ib2wgbmFtZSAxCi0KLSAgIHN5bWJvbCBuYW1lIG4tMQotKi8KLQotYm9vbGVhbgotY29mZl93cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCwgbWFwLCBzeW1ib2xfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphcmNoOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgc3ltYm9sX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICAvKiBUaGUgc2l6ZSBvZiB0aGUgcmFubGliIGlzIHRoZSBudW1iZXIgb2YgZXhwb3J0ZWQgc3ltYm9scyBpbiB0aGUKLSAgICAgYXJjaGl2ZSAqIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBpbnQsICsgYW4gaW50IGZvciB0aGUgY291bnQgKi8KLSAgdW5zaWduZWQgaW50IHJhbmxpYnNpemUgPSAoc3ltYm9sX2NvdW50ICogNCkgKyA0OwotICB1bnNpZ25lZCBpbnQgc3RyaW5nc2l6ZSA9IHN0cmlkeDsKLSAgdW5zaWduZWQgaW50IG1hcHNpemUgPSBzdHJpbmdzaXplICsgcmFubGlic2l6ZTsKLSAgZmlsZV9wdHIgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHI7Ci0gIGJmZCAqY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCBwYWRpdCA9IG1hcHNpemUgJiAxOwotCi0gIGlmIChwYWRpdCkKLSAgICBtYXBzaXplKys7Ci0KLSAgLyogd29yayBvdXQgd2hlcmUgdGhlIGZpcnN0IG9iamVjdCBmaWxlIHdpbGwgZ28gaW4gdGhlIGFyY2hpdmUgKi8KLSAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgPSAobWFwc2l6ZQotCQkJICAgICArIGVsZW5ndGgKLQkJCSAgICAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpCi0JCQkgICAgICsgU0FSTUFHKTsKLQotICBtZW1zZXQgKChjaGFyICopICgmaGRyKSwgMCwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gIGhkci5hcl9uYW1lWzBdID0gJy8nOwotICBzcHJpbnRmIChoZHIuYXJfc2l6ZSwgIiUtMTBkIiwgKGludCkgbWFwc2l6ZSk7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgKGxvbmcpIHRpbWUgKE5VTEwpKTsKLSAgLyogVGhpcywgYXQgbGVhc3QsIGlzIHdoYXQgSW50ZWwgY29mZiBzZXRzIHRoZSB2YWx1ZXMgdG8uOiAqLwotICBzcHJpbnRmICgoaGRyLmFyX3VpZCksICIlZCIsIDApOwotICBzcHJpbnRmICgoaGRyLmFyX2dpZCksICIlZCIsIDApOwotICBzcHJpbnRmICgoaGRyLmFyX21vZGUpLCAiJS03byIsICh1bnNpZ25lZCkgMCk7Ci0gIHN0cm5jcHkgKGhkci5hcl9mbWFnLCBBUkZNQUcsIDIpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOyBpKyspCi0gICAgaWYgKCgoY2hhciAqKSAoJmhkcikpW2ldID09ICdcMCcpCi0gICAgICAoKChjaGFyICopICgmaGRyKSlbaV0pID0gJyAnOwotCi0gIC8qIFdyaXRlIHRoZSBhciBoZWFkZXIgZm9yIHRoaXMgaXRlbSBhbmQgdGhlIG51bWJlciBvZiBzeW1ib2xzICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYXJjaCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50IChhcmNoLCBzeW1ib2xfY291bnQpOwotCi0gIC8qIFR3byBwYXNzZXMsIGZpcnN0IHdyaXRlIHRoZSBmaWxlIG9mZnNldHMgZm9yIGVhY2ggc3ltYm9sIC0KLSAgICAgcmVtZW1iZXJpbmcgdGhhdCBlYWNoIG9mZnNldCBpcyBvbiBhIHR3byBieXRlIGJvdW5kYXJ5LiAgKi8KLQotICAvKiBXcml0ZSBvdXQgdGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggZWFjaAotICAgICBzeW1ib2wsIGFuZCByZW1lbWJlciB0byBrZWVwIHRoZSBvZmZzZXRzIHBhZGRlZCBvdXQuICAqLwotCi0gIGN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7Ci0gIGNvdW50ID0gMDsKLSAgd2hpbGUgKGN1cnJlbnQgIT0gKGJmZCAqKSBOVUxMICYmIGNvdW50IDwgc3ltYm9sX2NvdW50KQotICAgIHsKLSAgICAgIC8qIEZvciBlYWNoIHN5bWJvbCB3aGljaCBpcyB1c2VkIGRlZmluZWQgaW4gdGhpcyBvYmplY3QsIHdyaXRlIG91dAotCSB0aGUgb2JqZWN0IGZpbGUncyBhZGRyZXNzIGluIHRoZSBhcmNoaXZlICovCi0KLSAgICAgIHdoaWxlICgoKGJmZCAqKSAobWFwW2NvdW50XSkucG9zKSA9PSBjdXJyZW50KQotCXsKLQkgIGJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50IChhcmNoLCBhcmNoaXZlX21lbWJlcl9maWxlX3B0cik7Ci0JICBjb3VudCsrOwotCX0KLSAgICAgIC8qIEFkZCBzaXplIG9mIHRoaXMgYXJjaGl2ZSBlbnRyeSAqLwotICAgICAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgKz0gKGFyZWx0X3NpemUgKGN1cnJlbnQpCi0JCQkJICArIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICAgICAgLyogcmVtZW1iZXIgYWJvb3V0IHRoZSBldmVuIGFsaWdubWVudCAqLwotICAgICAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgKz0gYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgJSAyOwotICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7Ci0gICAgfQotCi0gIC8qIG5vdyB3cml0ZSB0aGUgc3RyaW5ncyB0aGVtc2VsdmVzICovCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHN5bWJvbF9jb3VudDsgY291bnQrKykKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuID0gc3RybGVuICgqbWFwW2NvdW50XS5uYW1lKSArIDE7Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUgKCptYXBbY291bnRdLm5hbWUsIDEsIGxlbiwgYXJjaCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIHNwZWMgc2V6IHRoaXMgc2hvdWxkIGJlIGEgbmV3bGluZS4gIEJ1dCBpbiBvcmRlciB0byBiZQotICAgICBidWctY29tcGF0aWJsZSBmb3IgYXJjOTYwIHdlIHVzZSBhIG51bGwuICovCi0gIGlmIChwYWRpdCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgiIiwgMSwgMSwgYXJjaCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2FyY2h1cmVzLmMgYi9iZmQvYXJjaHVyZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0Mzg2Mi4uMDAwMDAwMAotLS0gYS9iZmQvYXJjaHVyZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDg5NiArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciBhcmNoaXRlY3R1cmVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MS05OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBKb2huIEdpbG1vcmUgYW5kIFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0vKgotCi1TRUNUSU9OCi0JQXJjaGl0ZWN0dXJlcwotCi0JQkZEIGtlZXBzIG9uZSBhdG9tIGluIGEgQkZEIGRlc2NyaWJpbmcgdGhlCi0JYXJjaGl0ZWN0dXJlIG9mIHRoZSBkYXRhIGF0dGFjaGVkIHRvIHRoZSBCRkQ6IGEgcG9pbnRlciB0byBhCi0JPDxiZmRfYXJjaF9pbmZvX3R5cGU+Pi4gIAotCi0JUG9pbnRlcnMgdG8gc3RydWN0dXJlcyBjYW4gYmUgcmVxdWVzdGVkIGluZGVwZW5kZW50bHkgb2YgYSBCRkQKLQlzbyB0aGF0IGFuIGFyY2hpdGVjdHVyZSdzIGluZm9ybWF0aW9uIGNhbiBiZSBpbnRlcnJvZ2F0ZWQKLQl3aXRob3V0IGFjY2VzcyB0byBhbiBvcGVuIEJGRC4KLQotCVRoZSBhcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgYnkgZWFjaCBhcmNoaXRlY3R1cmUgcGFja2FnZS4KLQlUaGUgc2V0IG9mIGRlZmF1bHQgYXJjaGl0ZWN0dXJlcyBpcyBzZWxlY3RlZCBieSB0aGUgbWFjcm8KLQk8PFNFTEVDVF9BUkNISVRFQ1RVUkVTPj4uICBUaGlzIGlzIG5vcm1hbGx5IHNldCB1cCBpbiB0aGUKLQlAZmlsZXtjb25maWcvQHZhcnt0YXJnZXR9Lm10fSBmaWxlIG9mIHlvdXIgY2hvaWNlLiAgSWYgdGhlIG5hbWUgaXMgbm90Ci0JZGVmaW5lZCwgdGhlbiBhbGwgdGhlIGFyY2hpdGVjdHVyZXMgc3VwcG9ydGVkIGFyZSBpbmNsdWRlZC4gCi0KLQlXaGVuIEJGRCBzdGFydHMgdXAsIGFsbCB0aGUgYXJjaGl0ZWN0dXJlcyBhcmUgY2FsbGVkIHdpdGggYW4KLQlpbml0aWFsaXplIG1ldGhvZC4gIEl0IGlzIHVwIHRvIHRoZSBhcmNoaXRlY3R1cmUgYmFjayBlbmQgdG8KLQlpbnNlcnQgYXMgbWFueSBpdGVtcyBpbnRvIHRoZSBsaXN0IG9mIGFyY2hpdGVjdHVyZXMgYXMgaXQgd2FudHMgdG87Ci0JZ2VuZXJhbGx5IHRoaXMgd291bGQgYmUgb25lIGZvciBlYWNoIG1hY2hpbmUgYW5kIG9uZSBmb3IgdGhlCi0JZGVmYXVsdCBjYXNlIChhbiBpdGVtIHdpdGggYSBtYWNoaW5lIGZpZWxkIG9mIDApLiAKLQotCUJGRCdzIGlkZWEgb2YgYW4gYXJjaGl0ZWN0dXJlIGlzIGltcGxlbWVudGVkIGluCUBmaWxle2FyY2h1cmVzLmN9LgotKi8KLQotLyoKLQotU1VCU0VDVElPTgotCWJmZF9hcmNoaXRlY3R1cmUKLQotREVTQ1JJUFRJT04KLQlUaGlzIGVudW0gZ2l2ZXMgdGhlIG9iamVjdCBmaWxlJ3MgQ1BVIGFyY2hpdGVjdHVyZSwgaW4gYQotCWdsb2JhbCBzZW5zZS0tLWkuZS4sIHdoYXQgcHJvY2Vzc29yIGZhbWlseSBkb2VzIGl0IGJlbG9uZyB0bz8KLQlBbm90aGVyIGZpZWxkIGluZGljYXRlcyB3aGljaCBwcm9jZXNzb3Igd2l0aGluCi0JdGhlIGZhbWlseSBpcyBpbiB1c2UuICBUaGUgbWFjaGluZSBnaXZlcyBhIG51bWJlciB3aGljaAotCWRpc3Rpbmd1aXNoZXMgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBhcmNoaXRlY3R1cmUsCi0JY29udGFpbmluZywgZm9yIGV4YW1wbGUsIDIgYW5kIDMgZm9yIEludGVsIGk5NjAgS0EgYW5kIGk5NjAgS0IsCi0JYW5kIDY4MDIwIGFuZCA2ODAzMCBmb3IgTW90b3JvbGEgNjgwMjAgYW5kIDY4MDMwLiAKLQotLmVudW0gYmZkX2FyY2hpdGVjdHVyZSAKLS57Ci0uICBiZmRfYXJjaF91bmtub3duLCAgIHsqIEZpbGUgYXJjaCBub3Qga25vd24gKn0KLS4gIGJmZF9hcmNoX29ic2N1cmUsICAgeyogQXJjaCBrbm93biwgbm90IG9uZSBvZiB0aGVzZSAqfQotLiAgYmZkX2FyY2hfbTY4aywgICAgICB7KiBNb3Rvcm9sYSA2OHh4eCAqfQotLiNkZWZpbmUgYmZkX21hY2hfbTY4MDAwIDEKLS4jZGVmaW5lIGJmZF9tYWNoX202ODAwOCAyCi0uI2RlZmluZSBiZmRfbWFjaF9tNjgwMTAgMwotLiNkZWZpbmUgYmZkX21hY2hfbTY4MDIwIDQKLS4jZGVmaW5lIGJmZF9tYWNoX202ODAzMCA1Ci0uI2RlZmluZSBiZmRfbWFjaF9tNjgwNDAgNgotLiNkZWZpbmUgYmZkX21hY2hfbTY4MDYwIDcKLS4jZGVmaW5lIGJmZF9tYWNoX2NwdTMyICA4Ci0uICBiZmRfYXJjaF92YXgsICAgICAgIHsqIERFQyBWYXggKn0gICAKLS4gIGJmZF9hcmNoX2k5NjAsICAgICAgeyogSW50ZWwgOTYwICp9Ci0uICAgIHsqIFRoZSBvcmRlciBvZiB0aGUgZm9sbG93aW5nIGlzIGltcG9ydGFudC4KLS4gICAgICAgbG93ZXIgbnVtYmVyIGluZGljYXRlcyBhIG1hY2hpbmUgdHlwZSB0aGF0IAotLiAgICAgICBvbmx5IGFjY2VwdHMgYSBzdWJzZXQgb2YgdGhlIGluc3RydWN0aW9ucwotLiAgICAgICBhdmFpbGFibGUgdG8gbWFjaGluZXMgd2l0aCBoaWdoZXIgbnVtYmVycy4KLS4gICAgICAgVGhlIGV4Y2VwdGlvbiBpcyB0aGUgImNhIiwgd2hpY2ggaXMKLS4gICAgICAgaW5jb21wYXRpYmxlIHdpdGggYWxsIG90aGVyIG1hY2hpbmVzIGV4Y2VwdCAKLS4gICAgICAgImNvcmUiLiAqfQotLgotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9jb3JlICAgICAgMQotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9rYV9zYSAgICAgMgotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9rYl9zYiAgICAgMwotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9tYyAgICAgICAgNAotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF94YSAgICAgICAgNQotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9jYSAgICAgICAgNgotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9qeAkgNwotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9oeCAgICAgICAgOAotLgotLiAgYmZkX2FyY2hfYTI5aywgICAgICB7KiBBTUQgMjkwMDAgKn0KLS4gIGJmZF9hcmNoX3NwYXJjLCAgICAgeyogU1BBUkMgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjCQkJMQotLnsqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdjhwbHVzIGFuZCB2OSBpcyB0aGF0IHY5IGlzIGEgdHJ1ZSA2NCBiaXQgZW52LiAgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0CTIKLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZQkzCi0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OHBsdXMJCTQKLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EJCTUgeyogd2l0aCB1bHRyYXNwYXJjIGFkZCducyAqfQotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlCTYKLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5CQk3Ci0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OWEJCTggeyogd2l0aCB1bHRyYXNwYXJjIGFkZCducyAqfQotLnsqIE5vbnplcm8gaWYgTUFDSCBoYXMgdGhlIHY5IGluc3RydWN0aW9uIHNldC4gICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OV9wKG1hY2gpIFwKLS4gICgobWFjaCkgPj0gYmZkX21hY2hfc3BhcmNfdjhwbHVzICYmIChtYWNoKSA8PSBiZmRfbWFjaF9zcGFyY192OWEpCi0uICBiZmRfYXJjaF9taXBzLCAgICAgIHsqIE1JUFMgUnh4eHggKn0KLS4jZGVmaW5lIGJmZF9tYWNoX21pcHMzMDAwCQkzMDAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzMzkwMAkJMzkwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQwMDAJCTQwMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0MDEwCQk0MDEwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDEwMAkJNDEwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQxMTEJCTQxMTEKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0MzAwCQk0MzAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDQwMAkJNDQwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQ2MDAJCTQ2MDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0NjUwCQk0NjUwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNTAwMAkJNTAwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczYwMDAJCTYwMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM4MDAwCQk4MDAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzMTAwMDAJCTEwMDAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzMTYJCTE2Ci0uICBiZmRfYXJjaF9pMzg2LCAgICAgIHsqIEludGVsIDM4NiAqfQotLiNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pMzg2IDAKLS4jZGVmaW5lIGJmZF9tYWNoX2kzODZfaTgwODYgMQotLiNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCAyCi0uICBiZmRfYXJjaF93ZTMyaywgICAgIHsqIEFUJlQgV0UzMnh4eCAqfQotLiAgYmZkX2FyY2hfdGFob2UsICAgICB7KiBDQ0kvSGFycmlzIFRhaG9lICp9Ci0uICBiZmRfYXJjaF9pODYwLCAgICAgIHsqIEludGVsIDg2MCAqfQotLiAgYmZkX2FyY2hfcm9tcCwgICAgICB7KiBJQk0gUk9NUCBQQy9SVCAqfQotLiAgYmZkX2FyY2hfYWxsaWFudCwgICB7KiBBbGxpYW50ICp9Ci0uICBiZmRfYXJjaF9jb252ZXgsICAgIHsqIENvbnZleCAqfQotLiAgYmZkX2FyY2hfbTg4aywgICAgICB7KiBNb3Rvcm9sYSA4OHh4eCAqfQotLiAgYmZkX2FyY2hfcHlyYW1pZCwgICB7KiBQeXJhbWlkIFRlY2hub2xvZ3kgKn0KLS4gIGJmZF9hcmNoX2g4MzAwLCAgICAgeyogSGl0YWNoaSBIOC8zMDAgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX2g4MzAwICAgMQotLiNkZWZpbmUgYmZkX21hY2hfaDgzMDBoICAyCi0uI2RlZmluZSBiZmRfbWFjaF9oODMwMHMgIDMKLS4gIGJmZF9hcmNoX3Bvd2VycGMsICAgeyogUG93ZXJQQyAqfQotLiAgYmZkX2FyY2hfcnM2MDAwLCAgICB7KiBJQk0gUlMvNjAwMCAqfQotLiAgYmZkX2FyY2hfaHBwYSwgICAgICB7KiBIUCBQQSBSSVNDICp9Ci0uICBiZmRfYXJjaF9kMTB2LCAgICAgIHsqIE1pdHN1YmlzaGkgRDEwViAqfQotLiAgYmZkX2FyY2hfZDMwdiwgICAgICB7KiBNaXRzdWJpc2hpIEQzMFYgKn0KLS4gIGJmZF9hcmNoX3o4aywgICAgICAgeyogWmlsb2cgWjgwMDAgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX3o4MDAxCQkxCi0uI2RlZmluZSBiZmRfbWFjaF96ODAwMgkJMgotLiAgYmZkX2FyY2hfaDg1MDAsICAgICB7KiBIaXRhY2hpIEg4LzUwMCAqfQotLiAgYmZkX2FyY2hfc2gsICAgICAgICB7KiBIaXRhY2hpIFNIICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9zaCAgICAgICAgICAgIDAKLS4jZGVmaW5lIGJmZF9tYWNoX3NoMyAgICAgICAgMHgzMAotLiNkZWZpbmUgYmZkX21hY2hfc2gzZSAgICAgICAweDNlCi0uICBiZmRfYXJjaF9hbHBoYSwgICAgIHsqIERlYyBBbHBoYSAqfQotLiNkZWZpbmUgYmZkX21hY2hfYWxwaGFfZXY0ICAweDEwCi0uI2RlZmluZSBiZmRfbWFjaF9hbHBoYV9ldjUgIDB4MjAKLS4jZGVmaW5lIGJmZF9tYWNoX2FscGhhX2V2NiAgMHgzMAotLiAgYmZkX2FyY2hfYXJtLCAgICAgICB7KiBBZHZhbmNlZCBSaXNjIE1hY2hpbmVzIEFSTSAqfQotLiNkZWZpbmUgYmZkX21hY2hfYXJtXzIJCTEKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV8yYQkJMgotLiNkZWZpbmUgYmZkX21hY2hfYXJtXzMJCTMKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV8zTSAJNAotLiNkZWZpbmUgYmZkX21hY2hfYXJtXzQgCQk1Ci0uI2RlZmluZSBiZmRfbWFjaF9hcm1fNFQgCTYKLS4gIGJmZF9hcmNoX25zMzJrLCAgICAgeyogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcnMgbnMzMjAwMCAqfQotLiAgYmZkX2FyY2hfdzY1LCAgICAgICB7KiBXREMgNjU4MTYgKn0KLS4gIGJmZF9hcmNoX3RpYzMwLCAgICAgeyogVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzMwICp9Ci0uICBiZmRfYXJjaF90aWM4MCwgICAgIHsqIFRJIFRNUzMyMGM4MCAoTVZQKSAqfQotLiAgYmZkX2FyY2hfdjg1MCwgICAgICB7KiBORUMgVjg1MCAqfQotLiNkZWZpbmUgYmZkX21hY2hfdjg1MCAgICAgICAgICAwCi0uI2RlZmluZSBiZmRfbWFjaF92ODUwZSAJJ0UnCi0uI2RlZmluZSBiZmRfbWFjaF92ODUwZWEJJ0EnCi0uICBiZmRfYXJjaF9hcmMsICAgICAgIHsqIEFyZ29uYXV0IFJJU0MgQ29yZSAqfQotLiNkZWZpbmUgYmZkX21hY2hfYXJjX2Jhc2UgMAotLiAgYmZkX2FyY2hfbTMyciwgICAgICB7KiBNaXRzdWJpc2hpIE0zMlIvRCAqfQotLiNkZWZpbmUgYmZkX21hY2hfbTMycgkJMCB7KiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqfQotLiAgYmZkX2FyY2hfbW4xMDIwMCwgICB7KiBNYXRzdXNoaXRhIE1OMTAyMDAgKn0KLS4gIGJmZF9hcmNoX21uMTAzMDAsICAgeyogTWF0c3VzaGl0YSBNTjEwMzAwICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9tbjEwMzAwCQkzMDAKLS4gIGJmZF9hcmNoX2ZyMzAsCi0uI2RlZmluZSBiZmRfbWFjaF9mcjMwCQkweDQ2NTIzMzMwCi0uICBiZmRfYXJjaF9tY29yZSwKLS4gIGJmZF9hcmNoX2xhc3QKLS4gIH07Ci0KLQotKi8KLQotLyoKLQotU1VCU0VDVElPTgotCWJmZF9hcmNoX2luZm8KLQotREVTQ1JJUFRJT04KLQlUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBhcmNoaXRlY3R1cmVzIGZvciB1c2UKLQl3aXRoaW4gQkZELgotCi0uCi0udHlwZWRlZiBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAKLS57Ci0uICBpbnQgYml0c19wZXJfd29yZDsKLS4gIGludCBiaXRzX3Blcl9hZGRyZXNzOwotLiAgaW50IGJpdHNfcGVyX2J5dGU7Ci0uICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLS4gIHVuc2lnbmVkIGxvbmcgbWFjaDsKLS4gIGNvbnN0IGNoYXIgKmFyY2hfbmFtZTsKLS4gIGNvbnN0IGNoYXIgKnByaW50YWJsZV9uYW1lOwotLiAgdW5zaWduZWQgaW50IHNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0uIHsqIHRydWUgaWYgdGhpcyBpcyB0aGUgZGVmYXVsdCBtYWNoaW5lIGZvciB0aGUgYXJjaGl0ZWN0dXJlICp9Ci0uICBib29sZWFuIHRoZV9kZWZhdWx0OwkKLS4gIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICogKCpjb21wYXRpYmxlKQotLglQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYSwKLS4JICAgICAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmIpKTsKLS4KLS4gIGJvb2xlYW4gKCpzY2FuKSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLS4KLS4gIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICpuZXh0OwotLn0gYmZkX2FyY2hfaW5mb190eXBlOwotKi8KLQotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYTI5a19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYWxwaGFfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2FyY19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYXJtX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMTB2X2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMzB2X2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9oODMwMF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaDg1MDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2hwcGFfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2kzODZfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k4NjBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k5NjBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX20zMnJfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX202OGtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX204OGtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21pcHNfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAyMDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAzMDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3Bvd2VycGNfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3JzNjAwMF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfc2hfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3NwYXJjX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF90aWMzMF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdGljODBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3ZheF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfd2UzMmtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3o4a19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbnMzMmtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3c2NV9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdjg1MF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZnIzMF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbWNvcmVfYXJjaDsKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGNvbnN0IGJmZF9hcmNodXJlc19saXN0W10gPQotewotI2lmZGVmIFNFTEVDVF9BUkNISVRFQ1RVUkVTCi0gIFNFTEVDVF9BUkNISVRFQ1RVUkVTLAotI2Vsc2UKLSAgJmJmZF9hMjlrX2FyY2gsCi0gICZiZmRfYWxwaGFfYXJjaCwKLSAgJmJmZF9hcmNfYXJjaCwKLSAgJmJmZF9hcm1fYXJjaCwKLSAgJmJmZF9kMTB2X2FyY2gsCi0gICZiZmRfZDMwdl9hcmNoLAotICAmYmZkX2g4MzAwX2FyY2gsCi0gICZiZmRfaDg1MDBfYXJjaCwKLSAgJmJmZF9ocHBhX2FyY2gsCi0gICZiZmRfaTM4Nl9hcmNoLAotICAmYmZkX2k4NjBfYXJjaCwKLSAgJmJmZF9pOTYwX2FyY2gsCi0gICZiZmRfbTMycl9hcmNoLAotICAmYmZkX202OGtfYXJjaCwKLSAgJmJmZF9tODhrX2FyY2gsCi0gICZiZmRfbWlwc19hcmNoLAotICAmYmZkX21uMTAyMDBfYXJjaCwKLSAgJmJmZF9tbjEwMzAwX2FyY2gsCi0gICZiZmRfcG93ZXJwY19hcmNoLAotICAmYmZkX3JzNjAwMF9hcmNoLAotICAmYmZkX3NoX2FyY2gsCi0gICZiZmRfc3BhcmNfYXJjaCwKLSAgJmJmZF90aWMzMF9hcmNoLAotICAmYmZkX3RpYzgwX2FyY2gsCi0gICZiZmRfdmF4X2FyY2gsCi0gICZiZmRfd2UzMmtfYXJjaCwKLSAgJmJmZF96OGtfYXJjaCwKLSAgJmJmZF9uczMya19hcmNoLAotICAmYmZkX3c2NV9hcmNoLAotICAmYmZkX3Y4NTBfYXJjaCwKLSAgJmJmZF9mcjMwX2FyY2gsCi0gICYgYmZkX21jb3JlX2FyY2gsCi0jZW5kaWYKLSAgMAotfTsKLQotLyoKLUZVTkNUSU9OCi0JYmZkX3ByaW50YWJsZV9uYW1lCi0KLVNZTk9QU0lTCi0JY29uc3QgY2hhciAqYmZkX3ByaW50YWJsZV9uYW1lKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgcHJpbnRhYmxlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZQotCWZyb20gdGhlIHBvaW50ZXIgdG8gdGhlIGFyY2hpdGVjdHVyZSBpbmZvIHN0cnVjdHVyZS4KLQotKi8KLQotY29uc3QgY2hhciAqCi1iZmRfcHJpbnRhYmxlX25hbWUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGFiZmQtPmFyY2hfaW5mby0+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+dGhlX2RlZmF1bHQ7Ci0gICAgfQotCi0gIG51bWJlciA9IDA7Ci0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnB0cl9zcmMpKQotICAgIHsKLSAgICAgIG51bWJlciA9IG51bWJlciAqIDEwICsgKnB0cl9zcmMgIC0gJzAnOwotICAgICAgcHRyX3NyYysrOwotICAgIH0KLQotICAvKiBOT1RFOiBUaGUgYmVsb3cgaXMgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgb25seS4KLSAgICAgUExFQVNFIERPIE5PVCBBREQgVE8gVEhJUyBDT0RFLiAqLwotCi0gIHN3aXRjaCAobnVtYmVyKSAKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogVGhlc2UgYXJlIG5lZWRlZCB0byBwYXJzZSBJRUVFIG9iamVjdHMuICAqLwotICAgIGNhc2UgNjgwMDA6IAotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDEwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDIwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwMjA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDMwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwMzA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDQwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwNDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDYwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwNjA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MzMyOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9jcHUzMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzMjAwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF93ZTMyazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzMDAwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9taXBzMzAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0MDAwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9taXBzNDAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA2MDAwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3JzNjAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDogIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYXJjaCAhPSBpbmZvLT5hcmNoKSAKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG51bWJlciAhPSBpbmZvLT5tYWNoKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X2FyY2hfaW5mbwotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGJmZF9nZXRfYXJjaF9pbmZvKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBhcmNoaXRlY3R1cmUgaW5mbyBzdHJ1Y3QgaW4gQHZhcnthYmZkfS4KLSovCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1iZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gYWJmZC0+YXJjaF9pbmZvOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9sb29rdXBfYXJjaAotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYmZkX2xvb2t1cF9hcmNoCi0JCShlbnVtIGJmZF9hcmNoaXRlY3R1cmUKLQkJYXJjaCwKLQkJdW5zaWduZWQgbG9uZyBtYWNoaW5lKTsKLQotREVTQ1JJUFRJT04KLQlMb29rIGZvciB0aGUgYXJjaGl0ZWN1cmUgaW5mbyBzdHJ1Y3R1cmUgd2hpY2ggbWF0Y2hlcyB0aGUKLQlhcmd1bWVudHMgQHZhcnthcmNofSBhbmQgQHZhcnttYWNoaW5lfS4gQSBtYWNoaW5lIG9mIDAgbWF0Y2hlcyB0aGUKLQltYWNoaW5lL2FyY2hpdGVjdHVyZSBzdHJ1Y3R1cmUgd2hpY2ggbWFya3MgaXRzZWxmIGFzIHRoZQotCWRlZmF1bHQuCi0qLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiAKLWJmZF9sb29rdXBfYXJjaCAoYXJjaCwgbWFjaGluZSkKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogY29uc3QgKmFwcCwgKmFwOwotCi0gIGZvciAoYXBwID0gYmZkX2FyY2h1cmVzX2xpc3Q7ICphcHAgIT0gTlVMTDsgYXBwKyspCi0gICAgewotICAgICAgZm9yIChhcCA9ICphcHA7IGFwICE9IE5VTEw7IGFwID0gYXAtPm5leHQpCi0JewotCSAgaWYgKGFwLT5hcmNoID09IGFyY2gKLQkgICAgICAmJiAoYXAtPm1hY2ggPT0gbWFjaGluZQotCQkgIHx8IChtYWNoaW5lID09IDAgJiYgYXAtPnRoZV9kZWZhdWx0KSkpCi0JICAgIHJldHVybiBhcDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9wcmludGFibGVfYXJjaF9tYWNoCi0KLVNZTk9QU0lTCi0JY29uc3QgY2hhciAqYmZkX3ByaW50YWJsZV9hcmNoX21hY2gKLQkJKGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLCB1bnNpZ25lZCBsb25nIG1hY2hpbmUpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIHByaW50YWJsZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBhcmNoaXRlY3R1cmUgYW5kCi0JbWFjaGluZSB0eXBlLiAKLQotCVRoaXMgcm91dGluZSBpcyBkZXByZWNpYXRlZC4KLSovCi0KLWNvbnN0IGNoYXIgKgotYmZkX3ByaW50YWJsZV9hcmNoX21hY2ggKGFyY2gsIG1hY2hpbmUpCi0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcCA9IGJmZF9sb29rdXBfYXJjaCAoYXJjaCwgbWFjaGluZSk7Ci0KLSAgICBpZiAoYXApCi0gICAgICByZXR1cm4gYXAtPnByaW50YWJsZV9uYW1lOwotICAgIHJldHVybiAiVU5LTk9XTiEiOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2JmZC1pbi5oIGIvYmZkL2JmZC1pbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjA4NWQwLi4wMDAwMDAwCi0tLSBhL2JmZC9iZmQtaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDczNiArMCwwIEBACi0vKiBNYWluIGhlYWRlciBmaWxlIGZvciB0aGUgYmZkIGxpYnJhcnkgLS0gcG9ydGFibGUgYWNjZXNzIHRvIG9iamVjdCBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSoqIE5PVEU6IGJmZC5oIGFuZCBiZmQtaW4yLmggYXJlIEdFTkVSQVRFRCBmaWxlcy4gIERvbid0IGNoYW5nZSB0aGVtOwotKiogaW5zdGVhZCwgY2hhbmdlIGJmZC1pbi5oIG9yIHRoZSBvdGhlciBCRkQgc291cmNlIGZpbGVzIHByb2Nlc3NlZCB0bwotKiogZ2VuZXJhdGUgdGhlc2UgZmlsZXMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogYmZkLmggLS0gVGhlIG9ubHkgaGVhZGVyIGZpbGUgcmVxdWlyZWQgYnkgdXNlcnMgb2YgdGhlIGJmZCBsaWJyYXJ5IAotCi1UaGUgYmZkLmggZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBiZmQtaW4uaCBhbmQgdmFyaW91cyAuYyBmaWxlczsgaWYgeW91Ci1jaGFuZ2UgaXQsIHlvdXIgY2hhbmdlcyB3aWxsIHByb2JhYmx5IGJlIGxvc3QuCi0KLUFsbCB0aGUgcHJvdG90eXBlcyBhbmQgZGVmaW5pdGlvbnMgZm9sbG93aW5nIHRoZSBjb21tZW50ICJUSEUgRk9MTE9XSU5HCi1JUyBFWFRSQUNURUQgRlJPTSBUSEUgU09VUkNFIiBhcmUgZXh0cmFjdGVkIGZyb20gdGhlIHNvdXJjZSBmaWxlcyBmb3IKLUJGRC4gIElmIHlvdSBjaGFuZ2UgaXQsIHNvbWVvbmUgb25lZGF5IHdpbGwgZXh0cmFjdCBpdCBmcm9tIHRoZSBzb3VyY2UKLWFnYWluLCBhbmQgeW91ciBjaGFuZ2VzIHdpbGwgYmUgbG9zdC4gIFRvIHNhdmUgeW91cnNlbGYgZnJvbSB0aGlzIGJpbmQsCi1jaGFuZ2UgdGhlIGRlZmluaXRpb25zIGluIHRoZSBzb3VyY2UgaW4gdGhlIGJmZCBkaXJlY3RvcnkuICBUeXBlICJtYWtlCi1kb2NzIiBhbmQgdGhlbiAibWFrZSBoZWFkZXJzIiBpbiB0aGF0IGRpcmVjdG9yeSwgYW5kIG1hZ2ljYWxseSB0aGlzIGZpbGUKLXdpbGwgY2hhbmdlIHRvIHJlZmxlY3QgeW91ciBjaGFuZ2VzLgotCi1JZiB5b3UgZG9uJ3QgaGF2ZSB0aGUgdG9vbHMgdG8gcGVyZm9ybSB0aGUgZXh0cmFjdGlvbiwgdGhlbiB5b3UgYXJlCi1zYWZlIGZyb20gc29tZW9uZSBvbiB5b3VyIHN5c3RlbSB0cmFtcGxpbmcgb3ZlciB5b3VyIGhlYWRlciBmaWxlcy4KLVlvdSBzaG91bGQgc3RpbGwgbWFpbnRhaW4gdGhlIGVxdWl2YWxlbmNlIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGhpcwotZmlsZSB0aG91Z2g7IGV2ZXJ5IGNoYW5nZSB5b3UgbWFrZSB0byB0aGUgLmMgZmlsZSBzaG91bGQgYmUgcmVmbGVjdGVkCi1oZXJlLiAgKi8KLQotI2lmbmRlZiBfX0JGRF9IX1NFRU5fXwotI2RlZmluZSBfX0JGRF9IX1NFRU5fXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0vKiBUaGVzZSB0d28gbGluZXMgZ2V0IHN1YnN0aXR1dGlvbnMgZG9uZSBieSBjb21tYW5kcyBpbiBNYWtlZmlsZS5pbi4gICovCi0jZGVmaW5lIEJGRF9WRVJTSU9OICAiQFZFUlNJT05AIgotI2RlZmluZSBCRkRfQVJDSF9TSVpFIEB3b3Jkc2l6ZUAKLSNkZWZpbmUgQkZEX0hPU1RfNjRCSVRfTE9ORyBAQkZEX0hPU1RfNjRCSVRfTE9OR0AKLSNpZiBAQkZEX0hPU1RfNjRfQklUX0RFRklORURACi0jZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBAQkZEX0hPU1RfNjRfQklUQAotI2RlZmluZSBCRkRfSE9TVF9VXzY0X0JJVCBAQkZEX0hPU1RfVV82NF9CSVRACi0jZW5kaWYKLQotI2lmIEJGRF9BUkNIX1NJWkUgPj0gNjQKLSNkZWZpbmUgQkZENjQKLSNlbmRpZgotCi0jaWZuZGVmIElOTElORQotI2lmIF9fR05VQ19fID49IDIKLSNkZWZpbmUgSU5MSU5FIF9faW5saW5lX18KLSNlbHNlCi0jZGVmaW5lIElOTElORQotI2VuZGlmCi0jZW5kaWYKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgX2JmZCBiZmQ7Ci0KLS8qIFRvIHNxdWVsY2ggZXJyb25lb3VzIGNvbXBpbGVyIHdhcm5pbmdzICgiaWxsZWdhbCBwb2ludGVyCi0gICBjb21iaW5hdGlvbiIpIGZyb20gdGhlIFNWUjMgY29tcGlsZXIsIHdlIHdvdWxkIGxpa2UgdG8gdHlwZWRlZgotICAgYm9vbGVhbiB0byBpbnQgKGl0IGRvZXNuJ3QgbGlrZSBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIGJvb2xlYW4uCi0gICBNYWtpbmcgc3VyZSB0aGV5IGFyZSBuZXZlciBpbXBsaWNpdGx5IGRlY2xhcmVkIHRvIHJldHVybiBpbnQKLSAgIGRvZXNuJ3Qgc2VlbSB0byBoZWxwKS4gIEJ1dCB0aGlzIGZpbGUgaXMgbm90IGNvbmZpZ3VyZWQgYmFzZWQgb24KLSAgIHRoZSBob3N0LiAgKi8KLS8qIEdlbmVyYWwgcnVsZXM6IGZ1bmN0aW9ucyB3aGljaCBhcmUgYm9vbGVhbiByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzCi0gICBhbmQgZmFsc2Ugb24gZmFpbHVyZSAodW5sZXNzIHRoZXkncmUgYSBwcmVkaWNhdGUpLiAgIC0tIGJmZC5kb2MgKi8KLS8qIEknbSBzdXJlIHRoaXMgaXMgZ29pbmcgdG8gYnJlYWsgc29tZXRoaW5nIGFuZCBzb21lb25lIGlzIGdvaW5nIHRvCi0gICBmb3JjZSBtZSB0byBjaGFuZ2UgaXQuICovCi0vKiB0eXBlZGVmIGVudW0gYm9vbGVhbiB7ZmFsc2UsIHRydWV9IGJvb2xlYW47ICovCi0vKiBZdXAsIFNWUjQgaGFzIGEgInR5cGVkZWYgZW51bSBib29sZWFuIiBpbiA8c3lzL3R5cGVzLmg+ICAtZm5mICovCi0vKiBJdCBnZXRzIHdvcnNlIGlmIHRoZSBob3N0IGFsc28gZGVmaW5lcyBhIHRydWUvZmFsc2UgZW51bS4uLiAtc3RzICovCi0vKiBBbmQgZXZlbiB3b3JzZSBpZiB5b3VyIGNvbXBpbGVyIGhhcyBidWlsdC1pbiBib29sZWFuIHR5cGVzLi4uIC1sYXcgKi8KLSNpZiBkZWZpbmVkIChfX0dOVUdfXykgJiYgKF9fR05VQ19NSU5PUl9fID4gNSkKLSNkZWZpbmUgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKLSNlbmRpZgotI2lmZGVmIE1QVwotLyogUHJlLWVtcHRpdmUgc3RyaWtlIC0gZ2V0IHRoZSBmaWxlIHdpdGggdGhlIGVudW0uICovCi0jaW5jbHVkZSA8VHlwZXMuaD4KLSNkZWZpbmUgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKLSNlbmRpZiAvKiBNUFcgKi8KLSNpZm5kZWYgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKLXR5cGVkZWYgZW51bSBiZmRfYm9vbGVhbiB7ZmFsc2UsIHRydWV9IGJvb2xlYW47Ci0jZGVmaW5lIEJGRF9UUlVFX0ZBTFNFCi0jZWxzZQotLyogVXNlIGVudW0gbmFtZXMgdGhhdCB3aWxsIGFwcGVhciBub3doZXJlIGVsc2UuICAqLwotdHlwZWRlZiBlbnVtIGJmZF9ib29sZWFuIHtiZmRfZmZmYWxzZSwgYmZkX3R0dHJ1ZX0gYm9vbGVhbjsKLSNlbmRpZgotCi0vKiBBIHBvaW50ZXIgdG8gYSBwb3NpdGlvbiBpbiBhIGZpbGUuICAqLwotLyogRklYTUU6ICBUaGlzIHNob3VsZCBiZSB1c2luZyBvZmZfdCBmcm9tIDxzeXMvdHlwZXMuaD4uCi0gICBGb3Igbm93LCB0cnkgdG8gYXZvaWQgYnJlYWtpbmcgc3R1ZmYgYnkgbm90IGluY2x1ZGluZyA8c3lzL3R5cGVzLmg+IGhlcmUuCi0gICBUaGlzIHdpbGwgYnJlYWsgb24gc3lzdGVtcyB3aXRoIDY0LWJpdCBmaWxlIG9mZnNldHMgKGUuZy4gNC40QlNEKS4KLSAgIFByb2JhYmx5IHRoZSBiZXN0IGxvbmctdGVybSBhbnN3ZXIgaXMgdG8gYXZvaWQgdXNpbmcgZmlsZV9wdHIgQU5EIG9mZl90IAotICAgaW4gdGhpcyBoZWFkZXIgZmlsZSwgYW5kIHRvIGhhbmRsZSB0aGlzIGluIHRoZSBCRkQgaW1wbGVtZW50YXRpb24KLSAgIHJhdGhlciB0aGFuIGluIGl0cyBpbnRlcmZhY2UuICAqLwotLyogdHlwZWRlZiBvZmZfdAlmaWxlX3B0cjsgKi8KLXR5cGVkZWYgbG9uZyBpbnQgZmlsZV9wdHI7Ci0KLS8qIFN1cHBvcnQgZm9yIGRpZmZlcmVudCBzaXplcyBvZiB0YXJnZXQgZm9ybWF0IGludHMgYW5kIGFkZHJlc3Nlcy4KLSAgIElmIHRoZSB0eXBlIGBsb25nJyBpcyBhdCBsZWFzdCA2NCBiaXRzLCBCRkRfSE9TVF82NEJJVF9MT05HIHdpbGwgYmUKLSAgIHNldCB0byAxIGFib3ZlLiAgT3RoZXJ3aXNlLCBpZiBnY2MgaXMgYmVpbmcgdXNlZCwgdGhpcyBjb2RlIHdpbGwKLSAgIHVzZSBnY2MncyAibG9uZyBsb25nIiB0eXBlLiAgT3RoZXJ3aXNlLCBCRkRfSE9TVF82NF9CSVQgbXVzdCBiZQotICAgZGVmaW5lZCBhYm92ZS4gICovCi0KLSNpZm5kZWYgQkZEX0hPU1RfNjRfQklUCi0jIGlmIEJGRF9IT1NUXzY0QklUX0xPTkcKLSMgIGRlZmluZSBCRkRfSE9TVF82NF9CSVQgbG9uZwotIyAgZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIHVuc2lnbmVkIGxvbmcKLSMgZWxzZQotIyAgaWZkZWYgX19HTlVDX18KLSMgICBpZiBfX0dOVUNfXyA+PSAyCi0jICAgIGRlZmluZSBCRkRfSE9TVF82NF9CSVQgbG9uZyBsb25nCi0jICAgIGRlZmluZSBCRkRfSE9TVF9VXzY0X0JJVCB1bnNpZ25lZCBsb25nIGxvbmcKLSMgICBlbmRpZiAvKiBfX0dOVUNfXyA+PSAyICovCi0jICBlbmRpZiAvKiAhIGRlZmluZWQgKF9fR05VQ19fKSAqLwotIyBlbmRpZiAvKiAhIEJGRF9IT1NUXzY0QklUX0xPTkcgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKEJGRF9IT1NUXzY0X0JJVCkgKi8KLQotI2lmZGVmIEJGRDY0Ci0KLSNpZm5kZWYgQkZEX0hPU1RfNjRfQklUCi0gI2Vycm9yIE5vIDY0IGJpdCBpbnRlZ2VyIHR5cGUgYXZhaWxhYmxlCi0jZW5kaWYgLyogISBkZWZpbmVkIChCRkRfSE9TVF82NF9CSVQpICovCi0KLXR5cGVkZWYgQkZEX0hPU1RfVV82NF9CSVQgYmZkX3ZtYTsKLXR5cGVkZWYgQkZEX0hPU1RfNjRfQklUIGJmZF9zaWduZWRfdm1hOwotdHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBiZmRfc2l6ZV90eXBlOwotdHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBzeW12YWx1ZTsKLQotI2lmbmRlZiBmcHJpbnRmX3ZtYQotI2lmIEJGRF9IT1NUXzY0QklUX0xPTkcKLSNkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBzcHJpbnRmIChzLCAiJTAxNmx4IiwgeCkKLSNkZWZpbmUgZnByaW50Zl92bWEoZix4KSBmcHJpbnRmIChmLCAiJTAxNmx4IiwgeCkKLSNlbHNlCi0jZGVmaW5lIF9iZmRfaW50NjRfbG93KHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgJiAweGZmZmZmZmZmKSkpCi0jZGVmaW5lIF9iZmRfaW50NjRfaGlnaCh4KSAoKHVuc2lnbmVkIGxvbmcpICgoKHgpID4+IDMyKSAmIDB4ZmZmZmZmZmYpKQotI2RlZmluZSBmcHJpbnRmX3ZtYShzLHgpIFwKLSAgZnByaW50ZiAoKHMpLCAiJTA4bHglMDhseCIsIF9iZmRfaW50NjRfaGlnaCAoeCksIF9iZmRfaW50NjRfbG93ICh4KSkKLSNkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBcCi0gIHNwcmludGYgKChzKSwgIiUwOGx4JTA4bHgiLCBfYmZkX2ludDY0X2hpZ2ggKHgpLCBfYmZkX2ludDY0X2xvdyAoeCkpCi0jZW5kaWYKLSNlbmRpZgotCi0jZWxzZSAvKiBub3QgQkZENjQgICovCi0KLS8qIFJlcHJlc2VudCBhIHRhcmdldCBhZGRyZXNzLiAgQWxzbyB1c2VkIGFzIGEgZ2VuZXJpYyB1bnNpZ25lZCB0eXBlCi0gICB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGJpZyBlbm91Z2ggdG8gaG9sZCBhbnkgYXJpdGhtZXRpYyB0eXBlcwotICAgd2UgbmVlZCB0byBkZWFsIHdpdGguICAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGJmZF92bWE7Ci0KLS8qIEEgZ2VuZXJpYyBzaWduZWQgdHlwZSB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGJpZyBlbm91Z2ggdG8gaG9sZCBhbnkKLSAgIGFyaXRobWV0aWMgdHlwZXMgd2UgbmVlZCB0byBkZWFsIHdpdGguICBDYW4gYmUgYXNzdW1lZCB0byBiZSBjb21wYXRpYmxlCi0gICB3aXRoIGJmZF92bWEgaW4gdGhlIHNhbWUgd2F5IHRoYXQgc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRzIGFyZSBjb21wYXRpYmxlCi0gICAoYXMgcGFyYW1ldGVycywgaW4gYXNzaWdubWVudCwgZXRjKS4gICovCi10eXBlZGVmIGxvbmcgYmZkX3NpZ25lZF92bWE7Ci0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBzeW12YWx1ZTsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBiZmRfc2l6ZV90eXBlOwotCi0vKiBQcmludCBhIGJmZF92bWEgeCBvbiBzdHJlYW0gcy4gICovCi0jZGVmaW5lIGZwcmludGZfdm1hKHMseCkgZnByaW50ZihzLCAiJTA4bHgiLCB4KQotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIHNwcmludGYocywgIiUwOGx4IiwgeCkKLQotI2VuZGlmIC8qIG5vdCBCRkQ2NCAgKi8KLQotI2RlZmluZSBwcmludGZfdm1hKHgpIGZwcmludGZfdm1hKHN0ZG91dCx4KQotCi10eXBlZGVmIHVuc2lnbmVkIGludCBmbGFnd29yZDsJLyogMzIgYml0cyBvZiBmbGFncyAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGJmZF9ieXRlOwotDAotLyoqIEZpbGUgZm9ybWF0cyAqLwotCi10eXBlZGVmIGVudW0gYmZkX2Zvcm1hdCB7Ci0JICAgICAgYmZkX3Vua25vd24gPSAwLAkvKiBmaWxlIGZvcm1hdCBpcyB1bmtub3duICovCi0JICAgICAgYmZkX29iamVjdCwJLyogbGlua2VyL2Fzc2VtYmVyL2NvbXBpbGVyIG91dHB1dCAqLwotCSAgICAgIGJmZF9hcmNoaXZlLAkvKiBvYmplY3QgYXJjaGl2ZSBmaWxlICovCi0JICAgICAgYmZkX2NvcmUsCQkvKiBjb3JlIGR1bXAgKi8KLQkgICAgICBiZmRfdHlwZV9lbmR9CS8qIG1hcmtzIHRoZSBlbmQ7IGRvbid0IHVzZSBpdCEgKi8KLSAgICAgICAgIGJmZF9mb3JtYXQ7Ci0KLS8qIFZhbHVlcyB0aGF0IG1heSBhcHBlYXIgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIGEgQkZELiAgVGhlc2UgYWxzbwotICAgYXBwZWFyIGluIHRoZSBvYmplY3RfZmxhZ3MgZmllbGQgb2YgdGhlIGJmZF90YXJnZXQgc3RydWN0dXJlLCB3aGVyZQotICAgdGhleSBpbmRpY2F0ZSB0aGUgc2V0IG9mIGZsYWdzIHVzZWQgYnkgdGhhdCBiYWNrZW5kIChub3QgYWxsIGZsYWdzCi0gICBhcmUgbWVhbmluZ2Z1bCBmb3IgYWxsIG9iamVjdCBmaWxlIGZvcm1hdHMpIChGSVhNRTogYXQgdGhlIG1vbWVudCwKLSAgIHRoZSBvYmplY3RfZmxhZ3MgdmFsdWVzIGhhdmUgbW9zdGx5IGp1c3QgYmVlbiBjb3BpZWQgZnJvbSBiYWNrZW5kCi0gICB0byBhbm90aGVyLCBhbmQgYXJlIG5vdCBuZWNlc3NhcmlseSBjb3JyZWN0KS4gICovCi0KLS8qIE5vIGZsYWdzLiAgKi8KLSNkZWZpbmUgQkZEX05PX0ZMQUdTICAgCTB4MDAKLQotLyogQkZEIGNvbnRhaW5zIHJlbG9jYXRpb24gZW50cmllcy4gICovCi0jZGVmaW5lIEhBU19SRUxPQyAgIAkweDAxCi0KLS8qIEJGRCBpcyBkaXJlY3RseSBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgRVhFQ19QICAgICAgCTB4MDIKLQotLyogQkZEIGhhcyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiAoYmFzaWNhbGx5IHVzZWQgZm9yIEZfTE5OTyBpbiBhCi0gICBDT0ZGIGhlYWRlcikuICAqLwotI2RlZmluZSBIQVNfTElORU5PICAJMHgwNAotCi0vKiBCRkQgaGFzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIEhBU19ERUJVRyAgIAkweDA4Ci0KLS8qIEJGRCBoYXMgc3ltYm9scy4gICovCi0jZGVmaW5lIEhBU19TWU1TICAgIAkweDEwCi0KLS8qIEJGRCBoYXMgbG9jYWwgc3ltYm9scyAoYmFzaWNhbGx5IHVzZWQgZm9yIEZfTFNZTVMgaW4gYSBDT0ZGCi0gICBoZWFkZXIpLiAgKi8KLSNkZWZpbmUgSEFTX0xPQ0FMUyAgCTB4MjAKLQotLyogQkZEIGlzIGEgZHluYW1pYyBvYmplY3QuICAqLwotI2RlZmluZSBEWU5BTUlDICAgICAJMHg0MAotCi0vKiBUZXh0IHNlY3Rpb24gaXMgd3JpdGUgcHJvdGVjdGVkIChpZiBEX1BBR0VEIGlzIG5vdCBzZXQsIHRoaXMgaXMKLSAgIGxpa2UgYW4gYS5vdXQgTk1BR0lDIGZpbGUpICh0aGUgbGlua2VyIHNldHMgdGhpcyBieSBkZWZhdWx0LCBidXQKLSAgIGNsZWFycyBpdCBmb3IgLXIgb3IgLU4pLiAgKi8KLSNkZWZpbmUgV1BfVEVYVCAgICAgCTB4ODAKLQotLyogQkZEIGlzIGR5bmFtaWNhbGx5IHBhZ2VkICh0aGlzIGlzIGxpa2UgYW4gYS5vdXQgWk1BR0lDIGZpbGUpICh0aGUKLSAgIGxpbmtlciBzZXRzIHRoaXMgYnkgZGVmYXVsdCwgYnV0IGNsZWFycyBpdCBmb3IgLXIgb3IgLW4gb3IgLU4pLiAgKi8KLSNkZWZpbmUgRF9QQUdFRCAgICAgCTB4MTAwCi0KLS8qIEJGRCBpcyByZWxheGFibGUgKHRoaXMgbWVhbnMgdGhhdCBiZmRfcmVsYXhfc2VjdGlvbiBtYXkgYmUgYWJsZSB0bwotICAgZG8gc29tZXRoaW5nKSAoc29tZXRpbWVzIGJmZF9yZWxheF9zZWN0aW9uIGNhbiBkbyBzb21ldGhpbmcgZXZlbiBpZgotICAgdGhpcyBpcyBub3Qgc2V0KS4gICovCi0jZGVmaW5lIEJGRF9JU19SRUxBWEFCTEUgMHgyMDAKLQotLyogVGhpcyBtYXkgYmUgc2V0IGJlZm9yZSB3cml0aW5nIG91dCBhIEJGRCB0byByZXF1ZXN0IHVzaW5nIGEKLSAgIHRyYWRpdGlvbmFsIGZvcm1hdC4gIEZvciBleGFtcGxlLCB0aGlzIGlzIHVzZWQgdG8gcmVxdWVzdCB0aGF0IHdoZW4KLSAgIHdyaXRpbmcgb3V0IGFuIGEub3V0IG9iamVjdCB0aGUgc3ltYm9scyBub3QgYmUgaGFzaGVkIHRvIGVsaW1pbmF0ZQotICAgZHVwbGljYXRlcy4gICovCi0jZGVmaW5lIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgMHg0MDAKLQotLyogVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBCRkQgY29udGVudHMgYXJlIGFjdHVhbGx5IGNhY2hlZCBpbgotICAgbWVtb3J5LiAgSWYgdGhpcyBpcyBzZXQsIGlvc3RyZWFtIHBvaW50cyB0byBhIGJmZF9pbl9tZW1vcnkgc3RydWN0LiAgKi8KLSNkZWZpbmUgQkZEX0lOX01FTU9SWSAweDgwMAotDAotLyogc3ltYm9scyBhbmQgcmVsb2NhdGlvbiAqLwotCi0vKiBBIGNvdW50IG9mIGNhcnN5bXMgKGNhbm9uaWNhbCBhcmNoaXZlIHN5bWJvbHMpLiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBzeW1pbmRleDsKLQotLyogSG93IHRvIHBlcmZvcm0gYSByZWxvY2F0aW9uLiAgKi8KLXR5cGVkZWYgY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCByZWxvY19ob3d0b190eXBlOwotCi0jZGVmaW5lIEJGRF9OT19NT1JFX1NZTUJPTFMgKChzeW1pbmRleCkgfjApCi0KLS8qIEdlbmVyYWwgcHVycG9zZSBwYXJ0IG9mIGEgc3ltYm9sIFg7Ci0gICB0YXJnZXQgc3BlY2lmaWMgcGFydHMgYXJlIGluIGxpYmNvZmYuaCwgbGliYW91dC5oLCBldGMuICAqLwotCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbih4KSAoKHgpLT5zZWN0aW9uKQotI2RlZmluZSBiZmRfZ2V0X291dHB1dF9zZWN0aW9uKHgpICgoeCktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uKQotI2RlZmluZSBiZmRfc2V0X3NlY3Rpb24oeCx5KSAoKHgpLT5zZWN0aW9uKSA9ICh5KQotI2RlZmluZSBiZmRfYXN5bWJvbF9iYXNlKHgpICgoeCktPnNlY3Rpb24tPnZtYSkKLSNkZWZpbmUgYmZkX2FzeW1ib2xfdmFsdWUoeCkgKGJmZF9hc3ltYm9sX2Jhc2UoeCkgKyAoeCktPnZhbHVlKQotI2RlZmluZSBiZmRfYXN5bWJvbF9uYW1lKHgpICgoeCktPm5hbWUpCi0vKlBlcmhhcHMgZnV0dXJlOiAjZGVmaW5lIGJmZF9hc3ltYm9sX2JmZCh4KSAoKHgpLT5zZWN0aW9uLT5vd25lcikqLwotI2RlZmluZSBiZmRfYXN5bWJvbF9iZmQoeCkgKCh4KS0+dGhlX2JmZCkKLSNkZWZpbmUgYmZkX2FzeW1ib2xfZmxhdm91cih4KSAoYmZkX2FzeW1ib2xfYmZkKHgpLT54dmVjLT5mbGF2b3VyKQotCi0vKiBBIGNhbm9uaWNhbCBhcmNoaXZlIHN5bWJvbC4gICovCi0vKiBUaGlzIGlzIGEgdHlwZSBwdW4gd2l0aCBzdHJ1Y3QgcmFubGliIG9uIHB1cnBvc2UhICovCi10eXBlZGVmIHN0cnVjdCBjYXJzeW0gewotICBjaGFyICpuYW1lOwotICBmaWxlX3B0ciBmaWxlX29mZnNldDsJCS8qIGxvb2sgaGVyZSB0byBmaW5kIHRoZSBmaWxlICovCi19IGNhcnN5bTsJCQkvKiB0byBtYWtlIHRoZXNlIHlvdSBjYWxsIGEgY2Fyc3ltb2dlbiAqLwotCi0gIAotLyogVXNlZCBpbiBnZW5lcmF0aW5nIGFybWFwcyAoYXJjaGl2ZSB0YWJsZXMgb2YgY29udGVudHMpLgotICAgUGVyaGFwcyBqdXN0IGEgZm9yd2FyZCBkZWZpbml0aW9uIHdvdWxkIGRvPyAqLwotc3RydWN0IG9ybCB7CQkJLyogb3V0cHV0IHJhbmxpYiAqLwotICBjaGFyICoqbmFtZTsJCQkvKiBzeW1ib2wgbmFtZSAqLyAKLSAgZmlsZV9wdHIgcG9zOwkJCS8qIGJmZCogb3IgZmlsZSBwb3NpdGlvbiAqLwotICBpbnQgbmFtaWR4OwkJCS8qIGluZGV4IGludG8gc3RyaW5nIHRhYmxlICovCi19OwotDAotCi0vKiBMaW5lbnVtYmVyIHN0dWZmICovCi10eXBlZGVmIHN0cnVjdCBsaW5lbm9fY2FjaGVfZW50cnkgewotICB1bnNpZ25lZCBpbnQgbGluZV9udW1iZXI7CS8qIExpbmVudW1iZXIgZnJvbSBzdGFydCBvZiBmdW5jdGlvbiovICAKLSAgdW5pb24gewotICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bTsgLyogRnVuY3Rpb24gbmFtZSAqLwotICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkvKiBPZmZzZXQgaW50byBzZWN0aW9uICovCi0gIH0gdTsKLX0gYWxlbnQ7Ci0MCi0vKiBvYmplY3QgYW5kIGNvcmUgZmlsZSBzZWN0aW9ucyAqLwotCi0jZGVmaW5lCWFsaWduX3Bvd2VyKGFkZHIsIGFsaWduKQlcCi0JKCAoKGFkZHIpICsgKCgxPDwoYWxpZ24pKS0xKSkgJiAoLTEgPDwgKGFsaWduKSkpCi0KLXR5cGVkZWYgc3RydWN0IHNlYyAqc2VjX3B0cjsKLQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fbmFtZShiZmQsIHB0cikgKChwdHIpLT5uYW1lICsgMCkKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3ZtYShiZmQsIHB0cikgKChwdHIpLT52bWEgKyAwKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50KGJmZCwgcHRyKSAoKHB0ciktPmFsaWdubWVudF9wb3dlciArIDApCi0jZGVmaW5lIGJmZF9zZWN0aW9uX25hbWUoYmZkLCBwdHIpICgocHRyKS0+bmFtZSkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fc2l6ZShiZmQsIHB0cikgKGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyhwdHIpKQotI2RlZmluZSBiZmRfc2VjdGlvbl92bWEoYmZkLCBwdHIpICgocHRyKS0+dm1hKQotI2RlZmluZSBiZmRfc2VjdGlvbl9sbWEoYmZkLCBwdHIpICgocHRyKS0+bG1hKQotI2RlZmluZSBiZmRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIpICgocHRyKS0+YWxpZ25tZW50X3Bvd2VyKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MoYmZkLCBwdHIpICgocHRyKS0+ZmxhZ3MgKyAwKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fdXNlcmRhdGEoYmZkLCBwdHIpICgocHRyKS0+dXNlcmRhdGEpCi0KLSNkZWZpbmUgYmZkX2lzX2NvbV9zZWN0aW9uKHB0cikgKCgocHRyKS0+ZmxhZ3MgJiBTRUNfSVNfQ09NTU9OKSAhPSAwKQotCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl92bWEoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+dm1hID0gKHB0ciktPmxtYT0gKHZhbCkpLCAoKHB0ciktPnVzZXJfc2V0X3ZtYSA9IChib29sZWFuKXRydWUpLCB0cnVlKQotI2RlZmluZSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50KGJmZCwgcHRyLCB2YWwpICgoKHB0ciktPmFsaWdubWVudF9wb3dlciA9ICh2YWwpKSx0cnVlKQotI2RlZmluZSBiZmRfc2V0X3NlY3Rpb25fdXNlcmRhdGEoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+dXNlcmRhdGEgPSAodmFsKSksdHJ1ZSkKLQotdHlwZWRlZiBzdHJ1Y3Qgc3RhdCBzdGF0X3R5cGU7IAotDAotdHlwZWRlZiBlbnVtIGJmZF9wcmludF9zeW1ib2wKLXsgCi0gIGJmZF9wcmludF9zeW1ib2xfbmFtZSwKLSAgYmZkX3ByaW50X3N5bWJvbF9tb3JlLAotICBiZmRfcHJpbnRfc3ltYm9sX2FsbAotfSBiZmRfcHJpbnRfc3ltYm9sX3R5cGU7Ci0gICAgCi0vKiBJbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbCB0aGF0IG5tIG5lZWRzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX3N5bWJvbF9pbmZvCi17Ci0gIHN5bXZhbHVlIHZhbHVlOwotICBjaGFyIHR5cGU7Ci0gIENPTlNUIGNoYXIgKm5hbWU7ICAgICAgICAgICAgLyogU3ltYm9sIG5hbWUuICAqLwotICB1bnNpZ25lZCBjaGFyIHN0YWJfdHlwZTsgICAgIC8qIFN0YWIgdHlwZS4gICovCi0gIGNoYXIgc3RhYl9vdGhlcjsgICAgICAgICAgICAgLyogU3RhYiBvdGhlci4gKi8KLSAgc2hvcnQgc3RhYl9kZXNjOyAgICAgICAgICAgICAvKiBTdGFiIGRlc2MuICAqLwotICBDT05TVCBjaGFyICpzdGFiX25hbWU7ICAgICAgIC8qIFN0cmluZyBmb3Igc3RhYiB0eXBlLiAgKi8KLX0gc3ltYm9sX2luZm87Ci0KLS8qIEdldCB0aGUgbmFtZSBvZiBhIHN0YWJzIHR5cGUgY29kZS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpiZmRfZ2V0X3N0YWJfbmFtZSBQQVJBTVMgKChpbnQpKTsKLQwKLS8qIEhhc2ggdGFibGUgcm91dGluZXMuICBUaGVyZSBpcyBubyB3YXkgdG8gZnJlZSB1cCBhIGhhc2ggdGFibGUuICAqLwotCi0vKiBBbiBlbGVtZW50IGluIHRoZSBoYXNoIHRhYmxlLiAgTW9zdCB1c2VzIHdpbGwgYWN0dWFsbHkgdXNlIGEgbGFyZ2VyCi0gICBzdHJ1Y3R1cmUsIGFuZCBhbiBpbnN0YW5jZSBvZiB0aGlzIHdpbGwgYmUgdGhlIGZpcnN0IGZpZWxkLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5Ci17Ci0gIC8qIE5leHQgZW50cnkgZm9yIHRoaXMgaGFzaCBjb2RlLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpuZXh0OwotICAvKiBTdHJpbmcgYmVpbmcgaGFzaGVkLiAgKi8KLSAgY29uc3QgY2hhciAqc3RyaW5nOwotICAvKiBIYXNoIGNvZGUuICBUaGlzIGlzIHRoZSBmdWxsIGhhc2ggY29kZSwgbm90IHRoZSBpbmRleCBpbnRvIHRoZQotICAgICB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgaGFzaDsKLX07Ci0KLS8qIEEgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF90YWJsZQotewotICAvKiBUaGUgaGFzaCBhcnJheS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKnRhYmxlOwotICAvKiBUaGUgbnVtYmVyIG9mIHNsb3RzIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIC8qIEEgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgbmV3IGVsZW1lbnRzIGluIHRoZSBoYXNoIHRhYmxlLiAgVGhlCi0gICAgIGZpcnN0IGVudHJ5IGlzIGl0c2VsZiBhIHBvaW50ZXIgdG8gYW4gZWxlbWVudC4gIFdoZW4gdGhpcwotICAgICBmdW5jdGlvbiBpcyBmaXJzdCBpbnZva2VkLCB0aGlzIHBvaW50ZXIgd2lsbCBiZSBOVUxMLiAgSG93ZXZlciwKLSAgICAgaGF2aW5nIHRoZSBwb2ludGVyIHBlcm1pdHMgYSBoaWVyYXJjaHkgb2YgbWV0aG9kIGZ1bmN0aW9ucyB0byBiZQotICAgICBidWlsdCBlYWNoIG9mIHdoaWNoIGNhbGxzIHRoZSBmdW5jdGlvbiBpbiB0aGUgc3VwZXJjbGFzcy4gIFRodXMKLSAgICAgZWFjaCBmdW5jdGlvbiBzaG91bGQgYmUgd3JpdHRlbiB0byBhbGxvY2F0ZSBhIG5ldyBibG9jayBvZiBtZW1vcnkKLSAgICAgb25seSBpZiB0aGUgYXJndW1lbnQgaXMgTlVMTC4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJICAgICBjb25zdCBjaGFyICopKTsKLSAgIC8qIEFuIG9iamFsbG9jIGZvciB0aGlzIGhhc2ggdGFibGUuICBUaGlzIGlzIGEgc3RydWN0IG9iamFsbG9jICosCi0gICAgIGJ1dCB3ZSB1c2UgUFRSIHRvIGF2b2lkIHJlcXVpcmluZyB0aGUgaW5jbHVzaW9uIG9mIG9iamFsbG9jLmguICAqLwotICBQVFIgbWVtb3J5OwotfTsKLQotLyogSW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICopKSk7Ci0KLS8qIEluaXRpYWxpemUgYSBoYXNoIHRhYmxlIHNwZWNpZnlpbmcgYSBzaXplLiAgKi8KLWV4dGVybiBib29sZWFuIGJmZF9oYXNoX3RhYmxlX2luaXRfbgotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICopLAotCSAgIHVuc2lnbmVkIGludCBzaXplKSk7Ci0KLS8qIEZyZWUgdXAgYSBoYXNoIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9oYXNoX3RhYmxlX2ZyZWUgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopKTsKLQotLyogTG9vayB1cCBhIHN0cmluZyBpbiBhIGhhc2ggdGFibGUuICBJZiBDUkVBVEUgaXMgdHJ1ZSwgYSBuZXcgZW50cnkKLSAgIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhpcyBzdHJpbmcgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QuICBUaGUKLSAgIENPUFkgYXJndW1lbnQgbXVzdCBiZSB0cnVlIGlmIHRoaXMgcm91dGluZSBzaG91bGQgY29weSB0aGUgc3RyaW5nCi0gICBpbnRvIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgd2hlbiBhZGRpbmcgYW4gZW50cnkuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqYmZkX2hhc2hfbG9va3VwCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4gY3JlYXRlLAotCSAgIGJvb2xlYW4gY29weSkpOwotCi0vKiBSZXBsYWNlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gICovCi1leHRlcm4gdm9pZCBiZmRfaGFzaF9yZXBsYWNlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm9sZCwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm53KSk7Ci0KLS8qIEJhc2UgbWV0aG9kIGZvciBjcmVhdGluZyBhIGhhc2ggdGFibGUgZW50cnkuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqYmZkX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JICAgY29uc3QgY2hhciAqKSk7Ci0KLS8qIEdyYWIgc29tZSBzcGFjZSBmb3IgYSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLWV4dGVybiBQVFIgYmZkX2hhc2hfYWxsb2NhdGUgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgdW5zaWduZWQgaW50KSk7Ci0KLS8qIFRyYXZlcnNlIGEgaGFzaCB0YWJsZSBpbiBhIHJhbmRvbSBvcmRlciwgY2FsbGluZyBhIGZ1bmN0aW9uIG9uIGVhY2gKLSAgIGVsZW1lbnQuICBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlIHRyYXZlcnNhbCBzdG9wcy4gIFRoZQotICAgSU5GTyBhcmd1bWVudCBpcyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9oYXNoX3RyYXZlcnNlIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBib29sZWFuICgqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQkgICAgUFRSKSwKLQkJCQkgICAgICAgUFRSIGluZm8pKTsKLQwKLS8qIFNlbWktcG9ydGFibGUgc3RyaW5nIGNvbmNhdGVuYXRpb24gaW4gY3BwLgotICAgVGhlIENBVDQgaGFjayBpcyB0byBhdm9pZCBhIHByb2JsZW0gd2l0aCBzb21lIHN0cmljdCBBTlNJIEMgcHJlcHJvY2Vzc29ycy4KLSAgIFRoZSBwcm9ibGVtIGlzLCAiMzJfIiBpcyBub3QgYSB2YWxpZCBwcmVwcm9jZXNzaW5nIHRva2VuLCBhbmQgd2UgZG9uJ3QKLSAgIHdhbnQgZXh0cmEgdW5kZXJzY29yZXMgKGUuZy4sICJubG1fMzJfIikuICBUaGUgWENBVDIgbWFjcm8gd2lsbCBjYXVzZSB0aGUKLSAgIGlubmVyIENBVCBtYWNyb3MgdG8gYmUgZXZhbHVhdGVkIGZpcnN0LCBwcm9kdWNpbmcgc3RpbGwtdmFsaWQgcHAtdG9rZW5zLgotICAgVGhlbiB0aGUgZmluYWwgY29uY2F0ZW5hdGlvbiBjYW4gYmUgZG9uZS4gIChTaWdoLikgICovCi0jaWZuZGVmIENBVAotI2lmZGVmIFNBQkVSCi0jZGVmaW5lIENBVChhLGIpCWEjI2IKLSNkZWZpbmUgQ0FUMyhhLGIsYykJYSMjYiMjYwotI2RlZmluZSBDQVQ0KGEsYixjLGQpCWEjI2IjI2MjI2QKLSNlbHNlCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLSNkZWZpbmUgQ0FUKGEsYikgYSMjYgotI2RlZmluZSBDQVQzKGEsYixjKSBhIyNiIyNjCi0jZGVmaW5lIFhDQVQyKGEsYikJQ0FUKGEsYikKLSNkZWZpbmUgQ0FUNChhLGIsYyxkKQlYQ0FUMihDQVQoYSxiKSxDQVQoYyxkKSkKLSNlbHNlCi0jZGVmaW5lIENBVChhLGIpIGEvKiovYgotI2RlZmluZSBDQVQzKGEsYixjKSBhLyoqL2IvKiovYwotI2RlZmluZSBDQVQ0KGEsYixjLGQpCWEvKiovYi8qKi9jLyoqL2QKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX1NXQVBfVEFCTEUgKFBUUikgJmJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlCi0MCi0vKiBVc2VyIHByb2dyYW0gYWNjZXNzIHRvIEJGRCBmYWNpbGl0aWVzICovCi0KLS8qIERpcmVjdCBJL08gcm91dGluZXMsIGZvciBwcm9ncmFtcyB3aGljaCBrbm93IG1vcmUgYWJvdXQgdGhlIG9iamVjdAotICAgZmlsZSB0aGFuIEJGRCBkb2VzLiAgVXNlIGhpZ2hlciBsZXZlbCByb3V0aW5lcyBpZiBwb3NzaWJsZS4gICovCi0KLWV4dGVybiBiZmRfc2l6ZV90eXBlIGJmZF9yZWFkCi0gIFBBUkFNUyAoKFBUUiwgYmZkX3NpemVfdHlwZSBzaXplLCBiZmRfc2l6ZV90eXBlIG5pdGVtcywgYmZkICphYmZkKSk7Ci1leHRlcm4gYmZkX3NpemVfdHlwZSBiZmRfd3JpdGUKLSAgUEFSQU1TICgoY29uc3QgUFRSLCBiZmRfc2l6ZV90eXBlIHNpemUsIGJmZF9zaXplX3R5cGUgbml0ZW1zLCBiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgYmZkX3NlZWsgUEFSQU1TICgoYmZkICphYmZkLCBmaWxlX3B0ciBmcCwgaW50IGRpcmVjdGlvbikpOwotZXh0ZXJuIGxvbmcgYmZkX3RlbGwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gaW50IGJmZF9mbHVzaCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgYmZkX3N0YXQgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0KLQotLyogQ2FzdCBmcm9tIGNvbnN0IGNoYXIgKiB0byBjaGFyICogc28gdGhhdCBjYWxsZXIgY2FuIGFzc2lnbiB0bwotICAgYSBjaGFyICogd2l0aG91dCBhIHdhcm5pbmcuICAqLwotI2RlZmluZSBiZmRfZ2V0X2ZpbGVuYW1lKGFiZmQpICgoY2hhciAqKSAoYWJmZCktPmZpbGVuYW1lKQotI2RlZmluZSBiZmRfZ2V0X2NhY2hlYWJsZShhYmZkKSAoKGFiZmQpLT5jYWNoZWFibGUpCi0jZGVmaW5lIGJmZF9nZXRfZm9ybWF0KGFiZmQpICgoYWJmZCktPmZvcm1hdCkKLSNkZWZpbmUgYmZkX2dldF90YXJnZXQoYWJmZCkgKChhYmZkKS0+eHZlYy0+bmFtZSkKLSNkZWZpbmUgYmZkX2dldF9mbGF2b3VyKGFiZmQpICgoYWJmZCktPnh2ZWMtPmZsYXZvdXIpCi0jZGVmaW5lIGJmZF9iaWdfZW5kaWFuKGFiZmQpICgoYWJmZCktPnh2ZWMtPmJ5dGVvcmRlciA9PSBCRkRfRU5ESUFOX0JJRykKLSNkZWZpbmUgYmZkX2xpdHRsZV9lbmRpYW4oYWJmZCkgKChhYmZkKS0+eHZlYy0+Ynl0ZW9yZGVyID09IEJGRF9FTkRJQU5fTElUVExFKQotI2RlZmluZSBiZmRfaGVhZGVyX2JpZ19lbmRpYW4oYWJmZCkgXAotICAoKGFiZmQpLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyID09IEJGRF9FTkRJQU5fQklHKQotI2RlZmluZSBiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4oYWJmZCkgXAotICAoKGFiZmQpLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyID09IEJGRF9FTkRJQU5fTElUVExFKQotI2RlZmluZSBiZmRfZ2V0X2ZpbGVfZmxhZ3MoYWJmZCkgKChhYmZkKS0+ZmxhZ3MpCi0jZGVmaW5lIGJmZF9hcHBsaWNhYmxlX2ZpbGVfZmxhZ3MoYWJmZCkgKChhYmZkKS0+eHZlYy0+b2JqZWN0X2ZsYWdzKQotI2RlZmluZSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzKGFiZmQpICgoYWJmZCktPnh2ZWMtPnNlY3Rpb25fZmxhZ3MpCi0jZGVmaW5lIGJmZF9teV9hcmNoaXZlKGFiZmQpICgoYWJmZCktPm15X2FyY2hpdmUpCi0jZGVmaW5lIGJmZF9oYXNfbWFwKGFiZmQpICgoYWJmZCktPmhhc19hcm1hcCkKLQotI2RlZmluZSBiZmRfdmFsaWRfcmVsb2NfdHlwZXMoYWJmZCkgKChhYmZkKS0+eHZlYy0+dmFsaWRfcmVsb2NfdHlwZXMpCi0jZGVmaW5lIGJmZF91c3JkYXRhKGFiZmQpICgoYWJmZCktPnVzcmRhdGEpCi0KLSNkZWZpbmUgYmZkX2dldF9zdGFydF9hZGRyZXNzKGFiZmQpICgoYWJmZCktPnN0YXJ0X2FkZHJlc3MpCi0jZGVmaW5lIGJmZF9nZXRfc3ltY291bnQoYWJmZCkgKChhYmZkKS0+c3ltY291bnQpCi0jZGVmaW5lIGJmZF9nZXRfb3V0c3ltYm9scyhhYmZkKSAoKGFiZmQpLT5vdXRzeW1ib2xzKQotI2RlZmluZSBiZmRfY291bnRfc2VjdGlvbnMoYWJmZCkgKChhYmZkKS0+c2VjdGlvbl9jb3VudCkKLQotI2RlZmluZSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIoYWJmZCkgKChhYmZkKS0+eHZlYy0+c3ltYm9sX2xlYWRpbmdfY2hhcikKLQotI2RlZmluZSBiZmRfc2V0X2NhY2hlYWJsZShhYmZkLGJvb2wpICgoKGFiZmQpLT5jYWNoZWFibGUgPSAoYm9vbGVhbikoYm9vbCkpLCB0cnVlKQotCi1leHRlcm4gYm9vbGVhbiBiZmRfcmVjb3JkX3BoZHIKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGxvbmcsIGJvb2xlYW4sIGZsYWd3b3JkLCBib29sZWFuLCBiZmRfdm1hLAotCSAgIGJvb2xlYW4sIGJvb2xlYW4sIHVuc2lnbmVkIGludCwgc3RydWN0IHNlYyAqKikpOwotCi0vKiBCeXRlIHN3YXBwaW5nIHJvdXRpbmVzLiAgKi8KLQotYmZkX3ZtYQkJYmZkX2dldGI2NAkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEgCWJmZF9nZXRsNjQJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0Yl9zaWduZWRfNjQgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0bF9zaWduZWRfNjQgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0YjMyCSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYQkJYmZkX2dldGwzMgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRiX3NpZ25lZF8zMiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRsX3NpZ25lZF8zMiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRiMTYJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0bDE2CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGJfc2lnbmVkXzE2IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGxfc2lnbmVkXzE2IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGI2NAkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRsNjQJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0YjMyCSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGwzMgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRiMTYJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0bDE2CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotDAotLyogRXh0ZXJuYWxseSB2aXNpYmxlIEVDT0ZGIHJvdXRpbmVzLiAgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi1zdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbzsKLXN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwOwotc3RydWN0IGVjb2ZmX2V4dHI7Ci1zdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5Owotc3RydWN0IGJmZF9saW5rX2luZm87Ci1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeTsKLXN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZTsKLSNlbmRpZgotZXh0ZXJuIGJmZF92bWEgYmZkX2Vjb2ZmX2dldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfc2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3ZtYSBncF92YWx1ZSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGxvbmcgZ3BybWFzaywgdW5zaWduZWQgbG9uZyBmcHJtYXNrLAotCSAgIHVuc2lnbmVkIGxvbmcgKmNwcm1hc2spKTsKLWV4dGVybiBQVFIgYmZkX2Vjb2ZmX2RlYnVnX2luaXQKLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWNvZmZfZGVidWdfZnJlZQotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsCi0JICAgYmZkICppbnB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICppbnB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqaW5wdXRfc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZV9vdGhlcgotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLCBiZmQgKmlucHV0X2JmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwLAotCSAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlLAotCSAgIGJvb2xlYW4gKCpnZXRfZXh0cikgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwKLQkJCQlzdHJ1Y3QgZWNvZmZfZXh0ciAqKSwKLQkgICB2b2lkICgqc2V0X2luZGV4KSAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAotCQkJICAgICAgYmZkX3NpemVfdHlwZSkpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsCi0JICAgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGVjb2ZmX2V4dHIgKmVzeW0pKTsKLWV4dGVybiBiZmRfc2l6ZV90eXBlIGJmZF9lY29mZl9kZWJ1Z19zaXplCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfd3JpdGVfZGVidWcKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsIGZpbGVfcHRyIHdoZXJlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfd3JpdGVfYWNjdW11bGF0ZWRfZGVidWcKLSAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGZpbGVfcHRyIHdoZXJlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICosIHN0cnVjdCBzZWMgKiwKLQkgICBjaGFyICoqKSk7Ci0KLS8qIEV4dGVybmFsbHkgdmlzaWJsZSBFTEYgcm91dGluZXMuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QKLXsKLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZXh0OwotICBiZmQgKmJ5OwotICBjb25zdCBjaGFyICpuYW1lOwotfTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICoqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgY29uc3QgY2hhciAqLAotCSAgIGNvbnN0IGNoYXIgKiBjb25zdCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICoqLAotCSAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgY29uc3QgY2hhciAqLAotCSAgIGNvbnN0IGNoYXIgKiBjb25zdCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICoqLAotCSAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqYmZkX2VsZl9nZXRfZHRfc29uYW1lIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIFN1bk9TIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpiZmRfc3Vub3NfZ2V0X25lZWRlZF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICoqLCBzdHJ1Y3Qgc2VjICoqLAotCSAgIHN0cnVjdCBzZWMgKiopKTsKLQotLyogTGludXggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGxpbmtlci4gICovCi0KLWV4dGVybiBib29sZWFuIGJmZF9pMzg2bGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfbTY4a2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3NwYXJjbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIG1tYXAgaGFja3MgKi8KLQotc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsOwotdHlwZWRlZiBzdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWwgYmZkX3dpbmRvd19pbnRlcm5hbDsKLQotdHlwZWRlZiBzdHJ1Y3QgX2JmZF93aW5kb3cgewotICAvKiBXaGF0IHRoZSB1c2VyIGFza2VkIGZvci4gICovCi0gIFBUUiBkYXRhOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIC8qIFRoZSBhY3R1YWwgd2luZG93IHVzZWQgYnkgQkZELiAgU21hbGwgdXNlci1yZXF1ZXN0ZWQgcmVhZC1vbmx5Ci0gICAgIHJlZ2lvbnMgc2hhcmluZyBhIHBhZ2UgbWF5IHNoYXJlIGEgc2luZ2xlIHdpbmRvdyBpbnRvIHRoZSBvYmplY3QKLSAgICAgZmlsZS4gIFJlYWQtd3JpdGUgdmVyc2lvbnMgc2hvdWxkbid0IHVudGlsIEkndmUgZml4ZWQgdGhpbmdzIHRvCi0gICAgIGtlZXAgdHJhY2sgb2Ygd2hpY2ggcG9ydGlvbnMgaGF2ZSBiZWVuIGNsYWltZWQgYnkgdGhlCi0gICAgIGFwcGxpY2F0aW9uOyBkb24ndCB3YW50IHRvIGdpdmUgdGhlIHNhbWUgcmVnaW9uIGJhY2sgd2hlbiB0aGUKLSAgICAgYXBwbGljYXRpb24gd2FudHMgdHdvIHdyaXRhYmxlIGNvcGllcyEgICovCi0gIHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCAqaTsKLX0gYmZkX3dpbmRvdzsKLQotZXh0ZXJuIHZvaWQgYmZkX2luaXRfd2luZG93IFBBUkFNUyAoKGJmZF93aW5kb3cgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2ZyZWVfd2luZG93IFBBUkFNUyAoKGJmZF93aW5kb3cgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2dldF9maWxlX3dpbmRvdwotICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUsIGJmZF93aW5kb3cgKiwgYm9vbGVhbikpOwotCi0vKiBYQ09GRiBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgbGlua2VyLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBiZmRfc2l6ZV90eXBlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKLQkgICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBib29sZWFuLAotCSAgIGludCwgYm9vbGVhbiwgYm9vbGVhbiwgc3RydWN0IHNlYyAqKikpOwotCi0vKiBFeHRlcm5hbGx5IHZpc2libGUgQ09GRiByb3V0aW5lcy4gICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGludGVybmFsX3N5bWVudDsKLXVuaW9uIGludGVybmFsX2F1eGVudDsKLSNlbmRpZgotCi1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9nZXRfc3ltZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9nZXRfYXV4ZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIGludCwgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLCB1bnNpZ25lZCBpbnQpKTsKLQotLyogQVJNIEludGVyd29ya2luZyBzdXBwb3J0LiAgQ2FsbGVkIGZyb20gbGlua2VyLiAgKi8KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYwotI2VuZGlmCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYwotI2VuZGlmCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGludCkpOwotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi1zdGF0aWMKLSNlbmRpZgotZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogRUxGIEFSTSBJbnRlcndvcmtpbmcgc3VwcG9ydC4gIENhbGxlZCBmcm9tIGxpbmtlci4gICovCi0gIGV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0gICAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotIAotICBleHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotIAotICBleHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEFuZCBtb3JlIGZyb20gdGhlIHNvdXJjZS4gICovCmRpZmYgLS1naXQgYS9iZmQvYmZkLWluMi5oIGIvYmZkL2JmZC1pbjIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ0ZTFhNS4uMDAwMDAwMAotLS0gYS9iZmQvYmZkLWluMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAxMyArMCwwIEBACi0vKiBNYWluIGhlYWRlciBmaWxlIGZvciB0aGUgYmZkIGxpYnJhcnkgLS0gcG9ydGFibGUgYWNjZXNzIHRvIG9iamVjdCBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSoqIE5PVEU6IGJmZC5oIGFuZCBiZmQtaW4yLmggYXJlIEdFTkVSQVRFRCBmaWxlcy4gIERvbid0IGNoYW5nZSB0aGVtOwotKiogaW5zdGVhZCwgY2hhbmdlIGJmZC1pbi5oIG9yIHRoZSBvdGhlciBCRkQgc291cmNlIGZpbGVzIHByb2Nlc3NlZCB0bwotKiogZ2VuZXJhdGUgdGhlc2UgZmlsZXMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogYmZkLmggLS0gVGhlIG9ubHkgaGVhZGVyIGZpbGUgcmVxdWlyZWQgYnkgdXNlcnMgb2YgdGhlIGJmZCBsaWJyYXJ5IAotCi1UaGUgYmZkLmggZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBiZmQtaW4uaCBhbmQgdmFyaW91cyAuYyBmaWxlczsgaWYgeW91Ci1jaGFuZ2UgaXQsIHlvdXIgY2hhbmdlcyB3aWxsIHByb2JhYmx5IGJlIGxvc3QuCi0KLUFsbCB0aGUgcHJvdG90eXBlcyBhbmQgZGVmaW5pdGlvbnMgZm9sbG93aW5nIHRoZSBjb21tZW50ICJUSEUgRk9MTE9XSU5HCi1JUyBFWFRSQUNURUQgRlJPTSBUSEUgU09VUkNFIiBhcmUgZXh0cmFjdGVkIGZyb20gdGhlIHNvdXJjZSBmaWxlcyBmb3IKLUJGRC4gIElmIHlvdSBjaGFuZ2UgaXQsIHNvbWVvbmUgb25lZGF5IHdpbGwgZXh0cmFjdCBpdCBmcm9tIHRoZSBzb3VyY2UKLWFnYWluLCBhbmQgeW91ciBjaGFuZ2VzIHdpbGwgYmUgbG9zdC4gIFRvIHNhdmUgeW91cnNlbGYgZnJvbSB0aGlzIGJpbmQsCi1jaGFuZ2UgdGhlIGRlZmluaXRpb25zIGluIHRoZSBzb3VyY2UgaW4gdGhlIGJmZCBkaXJlY3RvcnkuICBUeXBlICJtYWtlCi1kb2NzIiBhbmQgdGhlbiAibWFrZSBoZWFkZXJzIiBpbiB0aGF0IGRpcmVjdG9yeSwgYW5kIG1hZ2ljYWxseSB0aGlzIGZpbGUKLXdpbGwgY2hhbmdlIHRvIHJlZmxlY3QgeW91ciBjaGFuZ2VzLgotCi1JZiB5b3UgZG9uJ3QgaGF2ZSB0aGUgdG9vbHMgdG8gcGVyZm9ybSB0aGUgZXh0cmFjdGlvbiwgdGhlbiB5b3UgYXJlCi1zYWZlIGZyb20gc29tZW9uZSBvbiB5b3VyIHN5c3RlbSB0cmFtcGxpbmcgb3ZlciB5b3VyIGhlYWRlciBmaWxlcy4KLVlvdSBzaG91bGQgc3RpbGwgbWFpbnRhaW4gdGhlIGVxdWl2YWxlbmNlIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGhpcwotZmlsZSB0aG91Z2g7IGV2ZXJ5IGNoYW5nZSB5b3UgbWFrZSB0byB0aGUgLmMgZmlsZSBzaG91bGQgYmUgcmVmbGVjdGVkCi1oZXJlLiAgKi8KLQotI2lmbmRlZiBfX0JGRF9IX1NFRU5fXwotI2RlZmluZSBfX0JGRF9IX1NFRU5fXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0vKiBUaGVzZSB0d28gbGluZXMgZ2V0IHN1YnN0aXR1dGlvbnMgZG9uZSBieSBjb21tYW5kcyBpbiBNYWtlZmlsZS5pbi4gICovCi0jZGVmaW5lIEJGRF9WRVJTSU9OICAiQFZFUlNJT05AIgotI2RlZmluZSBCRkRfQVJDSF9TSVpFIEB3b3Jkc2l6ZUAKLSNkZWZpbmUgQkZEX0hPU1RfNjRCSVRfTE9ORyBAQkZEX0hPU1RfNjRCSVRfTE9OR0AKLSNpZiBAQkZEX0hPU1RfNjRfQklUX0RFRklORURACi0jZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBAQkZEX0hPU1RfNjRfQklUQAotI2RlZmluZSBCRkRfSE9TVF9VXzY0X0JJVCBAQkZEX0hPU1RfVV82NF9CSVRACi0jZW5kaWYKLQotI2lmIEJGRF9BUkNIX1NJWkUgPj0gNjQKLSNkZWZpbmUgQkZENjQKLSNlbmRpZgotCi0jaWZuZGVmIElOTElORQotI2lmIF9fR05VQ19fID49IDIKLSNkZWZpbmUgSU5MSU5FIF9faW5saW5lX18KLSNlbHNlCi0jZGVmaW5lIElOTElORQotI2VuZGlmCi0jZW5kaWYKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgX2JmZCBiZmQ7Ci0KLS8qIFRvIHNxdWVsY2ggZXJyb25lb3VzIGNvbXBpbGVyIHdhcm5pbmdzICgiaWxsZWdhbCBwb2ludGVyCi0gICBjb21iaW5hdGlvbiIpIGZyb20gdGhlIFNWUjMgY29tcGlsZXIsIHdlIHdvdWxkIGxpa2UgdG8gdHlwZWRlZgotICAgYm9vbGVhbiB0byBpbnQgKGl0IGRvZXNuJ3QgbGlrZSBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIGJvb2xlYW4uCi0gICBNYWtpbmcgc3VyZSB0aGV5IGFyZSBuZXZlciBpbXBsaWNpdGx5IGRlY2xhcmVkIHRvIHJldHVybiBpbnQKLSAgIGRvZXNuJ3Qgc2VlbSB0byBoZWxwKS4gIEJ1dCB0aGlzIGZpbGUgaXMgbm90IGNvbmZpZ3VyZWQgYmFzZWQgb24KLSAgIHRoZSBob3N0LiAgKi8KLS8qIEdlbmVyYWwgcnVsZXM6IGZ1bmN0aW9ucyB3aGljaCBhcmUgYm9vbGVhbiByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzCi0gICBhbmQgZmFsc2Ugb24gZmFpbHVyZSAodW5sZXNzIHRoZXkncmUgYSBwcmVkaWNhdGUpLiAgIC0tIGJmZC5kb2MgKi8KLS8qIEknbSBzdXJlIHRoaXMgaXMgZ29pbmcgdG8gYnJlYWsgc29tZXRoaW5nIGFuZCBzb21lb25lIGlzIGdvaW5nIHRvCi0gICBmb3JjZSBtZSB0byBjaGFuZ2UgaXQuICovCi0vKiB0eXBlZGVmIGVudW0gYm9vbGVhbiB7ZmFsc2UsIHRydWV9IGJvb2xlYW47ICovCi0vKiBZdXAsIFNWUjQgaGFzIGEgInR5cGVkZWYgZW51bSBib29sZWFuIiBpbiA8c3lzL3R5cGVzLmg+ICAtZm5mICovCi0vKiBJdCBnZXRzIHdvcnNlIGlmIHRoZSBob3N0IGFsc28gZGVmaW5lcyBhIHRydWUvZmFsc2UgZW51bS4uLiAtc3RzICovCi0vKiBBbmQgZXZlbiB3b3JzZSBpZiB5b3VyIGNvbXBpbGVyIGhhcyBidWlsdC1pbiBib29sZWFuIHR5cGVzLi4uIC1sYXcgKi8KLSNpZiBkZWZpbmVkIChfX0dOVUdfXykgJiYgKF9fR05VQ19NSU5PUl9fID4gNSkKLSNkZWZpbmUgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKLSNlbmRpZgotI2lmZGVmIE1QVwotLyogUHJlLWVtcHRpdmUgc3RyaWtlIC0gZ2V0IHRoZSBmaWxlIHdpdGggdGhlIGVudW0uICovCi0jaW5jbHVkZSA8VHlwZXMuaD4KLSNkZWZpbmUgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKLSNlbmRpZiAvKiBNUFcgKi8KLSNpZm5kZWYgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKLXR5cGVkZWYgZW51bSBiZmRfYm9vbGVhbiB7ZmFsc2UsIHRydWV9IGJvb2xlYW47Ci0jZGVmaW5lIEJGRF9UUlVFX0ZBTFNFCi0jZWxzZQotLyogVXNlIGVudW0gbmFtZXMgdGhhdCB3aWxsIGFwcGVhciBub3doZXJlIGVsc2UuICAqLwotdHlwZWRlZiBlbnVtIGJmZF9ib29sZWFuIHtiZmRfZmZmYWxzZSwgYmZkX3R0dHJ1ZX0gYm9vbGVhbjsKLSNlbmRpZgotCi0vKiBBIHBvaW50ZXIgdG8gYSBwb3NpdGlvbiBpbiBhIGZpbGUuICAqLwotLyogRklYTUU6ICBUaGlzIHNob3VsZCBiZSB1c2luZyBvZmZfdCBmcm9tIDxzeXMvdHlwZXMuaD4uCi0gICBGb3Igbm93LCB0cnkgdG8gYXZvaWQgYnJlYWtpbmcgc3R1ZmYgYnkgbm90IGluY2x1ZGluZyA8c3lzL3R5cGVzLmg+IGhlcmUuCi0gICBUaGlzIHdpbGwgYnJlYWsgb24gc3lzdGVtcyB3aXRoIDY0LWJpdCBmaWxlIG9mZnNldHMgKGUuZy4gNC40QlNEKS4KLSAgIFByb2JhYmx5IHRoZSBiZXN0IGxvbmctdGVybSBhbnN3ZXIgaXMgdG8gYXZvaWQgdXNpbmcgZmlsZV9wdHIgQU5EIG9mZl90IAotICAgaW4gdGhpcyBoZWFkZXIgZmlsZSwgYW5kIHRvIGhhbmRsZSB0aGlzIGluIHRoZSBCRkQgaW1wbGVtZW50YXRpb24KLSAgIHJhdGhlciB0aGFuIGluIGl0cyBpbnRlcmZhY2UuICAqLwotLyogdHlwZWRlZiBvZmZfdAlmaWxlX3B0cjsgKi8KLXR5cGVkZWYgbG9uZyBpbnQgZmlsZV9wdHI7Ci0KLS8qIFN1cHBvcnQgZm9yIGRpZmZlcmVudCBzaXplcyBvZiB0YXJnZXQgZm9ybWF0IGludHMgYW5kIGFkZHJlc3Nlcy4KLSAgIElmIHRoZSB0eXBlIGBsb25nJyBpcyBhdCBsZWFzdCA2NCBiaXRzLCBCRkRfSE9TVF82NEJJVF9MT05HIHdpbGwgYmUKLSAgIHNldCB0byAxIGFib3ZlLiAgT3RoZXJ3aXNlLCBpZiBnY2MgaXMgYmVpbmcgdXNlZCwgdGhpcyBjb2RlIHdpbGwKLSAgIHVzZSBnY2MncyAibG9uZyBsb25nIiB0eXBlLiAgT3RoZXJ3aXNlLCBCRkRfSE9TVF82NF9CSVQgbXVzdCBiZQotICAgZGVmaW5lZCBhYm92ZS4gICovCi0KLSNpZm5kZWYgQkZEX0hPU1RfNjRfQklUCi0jIGlmIEJGRF9IT1NUXzY0QklUX0xPTkcKLSMgIGRlZmluZSBCRkRfSE9TVF82NF9CSVQgbG9uZwotIyAgZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIHVuc2lnbmVkIGxvbmcKLSMgZWxzZQotIyAgaWZkZWYgX19HTlVDX18KLSMgICBpZiBfX0dOVUNfXyA+PSAyCi0jICAgIGRlZmluZSBCRkRfSE9TVF82NF9CSVQgbG9uZyBsb25nCi0jICAgIGRlZmluZSBCRkRfSE9TVF9VXzY0X0JJVCB1bnNpZ25lZCBsb25nIGxvbmcKLSMgICBlbmRpZiAvKiBfX0dOVUNfXyA+PSAyICovCi0jICBlbmRpZiAvKiAhIGRlZmluZWQgKF9fR05VQ19fKSAqLwotIyBlbmRpZiAvKiAhIEJGRF9IT1NUXzY0QklUX0xPTkcgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKEJGRF9IT1NUXzY0X0JJVCkgKi8KLQotI2lmZGVmIEJGRDY0Ci0KLSNpZm5kZWYgQkZEX0hPU1RfNjRfQklUCi0gI2Vycm9yIE5vIDY0IGJpdCBpbnRlZ2VyIHR5cGUgYXZhaWxhYmxlCi0jZW5kaWYgLyogISBkZWZpbmVkIChCRkRfSE9TVF82NF9CSVQpICovCi0KLXR5cGVkZWYgQkZEX0hPU1RfVV82NF9CSVQgYmZkX3ZtYTsKLXR5cGVkZWYgQkZEX0hPU1RfNjRfQklUIGJmZF9zaWduZWRfdm1hOwotdHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBiZmRfc2l6ZV90eXBlOwotdHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBzeW12YWx1ZTsKLQotI2lmbmRlZiBmcHJpbnRmX3ZtYQotI2lmIEJGRF9IT1NUXzY0QklUX0xPTkcKLSNkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBzcHJpbnRmIChzLCAiJTAxNmx4IiwgeCkKLSNkZWZpbmUgZnByaW50Zl92bWEoZix4KSBmcHJpbnRmIChmLCAiJTAxNmx4IiwgeCkKLSNlbHNlCi0jZGVmaW5lIF9iZmRfaW50NjRfbG93KHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgJiAweGZmZmZmZmZmKSkpCi0jZGVmaW5lIF9iZmRfaW50NjRfaGlnaCh4KSAoKHVuc2lnbmVkIGxvbmcpICgoKHgpID4+IDMyKSAmIDB4ZmZmZmZmZmYpKQotI2RlZmluZSBmcHJpbnRmX3ZtYShzLHgpIFwKLSAgZnByaW50ZiAoKHMpLCAiJTA4bHglMDhseCIsIF9iZmRfaW50NjRfaGlnaCAoeCksIF9iZmRfaW50NjRfbG93ICh4KSkKLSNkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBcCi0gIHNwcmludGYgKChzKSwgIiUwOGx4JTA4bHgiLCBfYmZkX2ludDY0X2hpZ2ggKHgpLCBfYmZkX2ludDY0X2xvdyAoeCkpCi0jZW5kaWYKLSNlbmRpZgotCi0jZWxzZSAvKiBub3QgQkZENjQgICovCi0KLS8qIFJlcHJlc2VudCBhIHRhcmdldCBhZGRyZXNzLiAgQWxzbyB1c2VkIGFzIGEgZ2VuZXJpYyB1bnNpZ25lZCB0eXBlCi0gICB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGJpZyBlbm91Z2ggdG8gaG9sZCBhbnkgYXJpdGhtZXRpYyB0eXBlcwotICAgd2UgbmVlZCB0byBkZWFsIHdpdGguICAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGJmZF92bWE7Ci0KLS8qIEEgZ2VuZXJpYyBzaWduZWQgdHlwZSB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGJpZyBlbm91Z2ggdG8gaG9sZCBhbnkKLSAgIGFyaXRobWV0aWMgdHlwZXMgd2UgbmVlZCB0byBkZWFsIHdpdGguICBDYW4gYmUgYXNzdW1lZCB0byBiZSBjb21wYXRpYmxlCi0gICB3aXRoIGJmZF92bWEgaW4gdGhlIHNhbWUgd2F5IHRoYXQgc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRzIGFyZSBjb21wYXRpYmxlCi0gICAoYXMgcGFyYW1ldGVycywgaW4gYXNzaWdubWVudCwgZXRjKS4gICovCi10eXBlZGVmIGxvbmcgYmZkX3NpZ25lZF92bWE7Ci0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBzeW12YWx1ZTsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBiZmRfc2l6ZV90eXBlOwotCi0vKiBQcmludCBhIGJmZF92bWEgeCBvbiBzdHJlYW0gcy4gICovCi0jZGVmaW5lIGZwcmludGZfdm1hKHMseCkgZnByaW50ZihzLCAiJTA4bHgiLCB4KQotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIHNwcmludGYocywgIiUwOGx4IiwgeCkKLQotI2VuZGlmIC8qIG5vdCBCRkQ2NCAgKi8KLQotI2RlZmluZSBwcmludGZfdm1hKHgpIGZwcmludGZfdm1hKHN0ZG91dCx4KQotCi10eXBlZGVmIHVuc2lnbmVkIGludCBmbGFnd29yZDsJLyogMzIgYml0cyBvZiBmbGFncyAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGJmZF9ieXRlOwotDAotLyoqIEZpbGUgZm9ybWF0cyAqLwotCi10eXBlZGVmIGVudW0gYmZkX2Zvcm1hdCB7Ci0JICAgICAgYmZkX3Vua25vd24gPSAwLAkvKiBmaWxlIGZvcm1hdCBpcyB1bmtub3duICovCi0JICAgICAgYmZkX29iamVjdCwJLyogbGlua2VyL2Fzc2VtYmVyL2NvbXBpbGVyIG91dHB1dCAqLwotCSAgICAgIGJmZF9hcmNoaXZlLAkvKiBvYmplY3QgYXJjaGl2ZSBmaWxlICovCi0JICAgICAgYmZkX2NvcmUsCQkvKiBjb3JlIGR1bXAgKi8KLQkgICAgICBiZmRfdHlwZV9lbmR9CS8qIG1hcmtzIHRoZSBlbmQ7IGRvbid0IHVzZSBpdCEgKi8KLSAgICAgICAgIGJmZF9mb3JtYXQ7Ci0KLS8qIFZhbHVlcyB0aGF0IG1heSBhcHBlYXIgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIGEgQkZELiAgVGhlc2UgYWxzbwotICAgYXBwZWFyIGluIHRoZSBvYmplY3RfZmxhZ3MgZmllbGQgb2YgdGhlIGJmZF90YXJnZXQgc3RydWN0dXJlLCB3aGVyZQotICAgdGhleSBpbmRpY2F0ZSB0aGUgc2V0IG9mIGZsYWdzIHVzZWQgYnkgdGhhdCBiYWNrZW5kIChub3QgYWxsIGZsYWdzCi0gICBhcmUgbWVhbmluZ2Z1bCBmb3IgYWxsIG9iamVjdCBmaWxlIGZvcm1hdHMpIChGSVhNRTogYXQgdGhlIG1vbWVudCwKLSAgIHRoZSBvYmplY3RfZmxhZ3MgdmFsdWVzIGhhdmUgbW9zdGx5IGp1c3QgYmVlbiBjb3BpZWQgZnJvbSBiYWNrZW5kCi0gICB0byBhbm90aGVyLCBhbmQgYXJlIG5vdCBuZWNlc3NhcmlseSBjb3JyZWN0KS4gICovCi0KLS8qIE5vIGZsYWdzLiAgKi8KLSNkZWZpbmUgQkZEX05PX0ZMQUdTICAgCTB4MDAKLQotLyogQkZEIGNvbnRhaW5zIHJlbG9jYXRpb24gZW50cmllcy4gICovCi0jZGVmaW5lIEhBU19SRUxPQyAgIAkweDAxCi0KLS8qIEJGRCBpcyBkaXJlY3RseSBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgRVhFQ19QICAgICAgCTB4MDIKLQotLyogQkZEIGhhcyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiAoYmFzaWNhbGx5IHVzZWQgZm9yIEZfTE5OTyBpbiBhCi0gICBDT0ZGIGhlYWRlcikuICAqLwotI2RlZmluZSBIQVNfTElORU5PICAJMHgwNAotCi0vKiBCRkQgaGFzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIEhBU19ERUJVRyAgIAkweDA4Ci0KLS8qIEJGRCBoYXMgc3ltYm9scy4gICovCi0jZGVmaW5lIEhBU19TWU1TICAgIAkweDEwCi0KLS8qIEJGRCBoYXMgbG9jYWwgc3ltYm9scyAoYmFzaWNhbGx5IHVzZWQgZm9yIEZfTFNZTVMgaW4gYSBDT0ZGCi0gICBoZWFkZXIpLiAgKi8KLSNkZWZpbmUgSEFTX0xPQ0FMUyAgCTB4MjAKLQotLyogQkZEIGlzIGEgZHluYW1pYyBvYmplY3QuICAqLwotI2RlZmluZSBEWU5BTUlDICAgICAJMHg0MAotCi0vKiBUZXh0IHNlY3Rpb24gaXMgd3JpdGUgcHJvdGVjdGVkIChpZiBEX1BBR0VEIGlzIG5vdCBzZXQsIHRoaXMgaXMKLSAgIGxpa2UgYW4gYS5vdXQgTk1BR0lDIGZpbGUpICh0aGUgbGlua2VyIHNldHMgdGhpcyBieSBkZWZhdWx0LCBidXQKLSAgIGNsZWFycyBpdCBmb3IgLXIgb3IgLU4pLiAgKi8KLSNkZWZpbmUgV1BfVEVYVCAgICAgCTB4ODAKLQotLyogQkZEIGlzIGR5bmFtaWNhbGx5IHBhZ2VkICh0aGlzIGlzIGxpa2UgYW4gYS5vdXQgWk1BR0lDIGZpbGUpICh0aGUKLSAgIGxpbmtlciBzZXRzIHRoaXMgYnkgZGVmYXVsdCwgYnV0IGNsZWFycyBpdCBmb3IgLXIgb3IgLW4gb3IgLU4pLiAgKi8KLSNkZWZpbmUgRF9QQUdFRCAgICAgCTB4MTAwCi0KLS8qIEJGRCBpcyByZWxheGFibGUgKHRoaXMgbWVhbnMgdGhhdCBiZmRfcmVsYXhfc2VjdGlvbiBtYXkgYmUgYWJsZSB0bwotICAgZG8gc29tZXRoaW5nKSAoc29tZXRpbWVzIGJmZF9yZWxheF9zZWN0aW9uIGNhbiBkbyBzb21ldGhpbmcgZXZlbiBpZgotICAgdGhpcyBpcyBub3Qgc2V0KS4gICovCi0jZGVmaW5lIEJGRF9JU19SRUxBWEFCTEUgMHgyMDAKLQotLyogVGhpcyBtYXkgYmUgc2V0IGJlZm9yZSB3cml0aW5nIG91dCBhIEJGRCB0byByZXF1ZXN0IHVzaW5nIGEKLSAgIHRyYWRpdGlvbmFsIGZvcm1hdC4gIEZvciBleGFtcGxlLCB0aGlzIGlzIHVzZWQgdG8gcmVxdWVzdCB0aGF0IHdoZW4KLSAgIHdyaXRpbmcgb3V0IGFuIGEub3V0IG9iamVjdCB0aGUgc3ltYm9scyBub3QgYmUgaGFzaGVkIHRvIGVsaW1pbmF0ZQotICAgZHVwbGljYXRlcy4gICovCi0jZGVmaW5lIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgMHg0MDAKLQotLyogVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBCRkQgY29udGVudHMgYXJlIGFjdHVhbGx5IGNhY2hlZCBpbgotICAgbWVtb3J5LiAgSWYgdGhpcyBpcyBzZXQsIGlvc3RyZWFtIHBvaW50cyB0byBhIGJmZF9pbl9tZW1vcnkgc3RydWN0LiAgKi8KLSNkZWZpbmUgQkZEX0lOX01FTU9SWSAweDgwMAotDAotLyogc3ltYm9scyBhbmQgcmVsb2NhdGlvbiAqLwotCi0vKiBBIGNvdW50IG9mIGNhcnN5bXMgKGNhbm9uaWNhbCBhcmNoaXZlIHN5bWJvbHMpLiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBzeW1pbmRleDsKLQotLyogSG93IHRvIHBlcmZvcm0gYSByZWxvY2F0aW9uLiAgKi8KLXR5cGVkZWYgY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCByZWxvY19ob3d0b190eXBlOwotCi0jZGVmaW5lIEJGRF9OT19NT1JFX1NZTUJPTFMgKChzeW1pbmRleCkgfjApCi0KLS8qIEdlbmVyYWwgcHVycG9zZSBwYXJ0IG9mIGEgc3ltYm9sIFg7Ci0gICB0YXJnZXQgc3BlY2lmaWMgcGFydHMgYXJlIGluIGxpYmNvZmYuaCwgbGliYW91dC5oLCBldGMuICAqLwotCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbih4KSAoKHgpLT5zZWN0aW9uKQotI2RlZmluZSBiZmRfZ2V0X291dHB1dF9zZWN0aW9uKHgpICgoeCktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uKQotI2RlZmluZSBiZmRfc2V0X3NlY3Rpb24oeCx5KSAoKHgpLT5zZWN0aW9uKSA9ICh5KQotI2RlZmluZSBiZmRfYXN5bWJvbF9iYXNlKHgpICgoeCktPnNlY3Rpb24tPnZtYSkKLSNkZWZpbmUgYmZkX2FzeW1ib2xfdmFsdWUoeCkgKGJmZF9hc3ltYm9sX2Jhc2UoeCkgKyAoeCktPnZhbHVlKQotI2RlZmluZSBiZmRfYXN5bWJvbF9uYW1lKHgpICgoeCktPm5hbWUpCi0vKlBlcmhhcHMgZnV0dXJlOiAjZGVmaW5lIGJmZF9hc3ltYm9sX2JmZCh4KSAoKHgpLT5zZWN0aW9uLT5vd25lcikqLwotI2RlZmluZSBiZmRfYXN5bWJvbF9iZmQoeCkgKCh4KS0+dGhlX2JmZCkKLSNkZWZpbmUgYmZkX2FzeW1ib2xfZmxhdm91cih4KSAoYmZkX2FzeW1ib2xfYmZkKHgpLT54dmVjLT5mbGF2b3VyKQotCi0vKiBBIGNhbm9uaWNhbCBhcmNoaXZlIHN5bWJvbC4gICovCi0vKiBUaGlzIGlzIGEgdHlwZSBwdW4gd2l0aCBzdHJ1Y3QgcmFubGliIG9uIHB1cnBvc2UhICovCi10eXBlZGVmIHN0cnVjdCBjYXJzeW0gewotICBjaGFyICpuYW1lOwotICBmaWxlX3B0ciBmaWxlX29mZnNldDsJCS8qIGxvb2sgaGVyZSB0byBmaW5kIHRoZSBmaWxlICovCi19IGNhcnN5bTsJCQkvKiB0byBtYWtlIHRoZXNlIHlvdSBjYWxsIGEgY2Fyc3ltb2dlbiAqLwotCi0gIAotLyogVXNlZCBpbiBnZW5lcmF0aW5nIGFybWFwcyAoYXJjaGl2ZSB0YWJsZXMgb2YgY29udGVudHMpLgotICAgUGVyaGFwcyBqdXN0IGEgZm9yd2FyZCBkZWZpbml0aW9uIHdvdWxkIGRvPyAqLwotc3RydWN0IG9ybCB7CQkJLyogb3V0cHV0IHJhbmxpYiAqLwotICBjaGFyICoqbmFtZTsJCQkvKiBzeW1ib2wgbmFtZSAqLyAKLSAgZmlsZV9wdHIgcG9zOwkJCS8qIGJmZCogb3IgZmlsZSBwb3NpdGlvbiAqLwotICBpbnQgbmFtaWR4OwkJCS8qIGluZGV4IGludG8gc3RyaW5nIHRhYmxlICovCi19OwotDAotCi0vKiBMaW5lbnVtYmVyIHN0dWZmICovCi10eXBlZGVmIHN0cnVjdCBsaW5lbm9fY2FjaGVfZW50cnkgewotICB1bnNpZ25lZCBpbnQgbGluZV9udW1iZXI7CS8qIExpbmVudW1iZXIgZnJvbSBzdGFydCBvZiBmdW5jdGlvbiovICAKLSAgdW5pb24gewotICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bTsgLyogRnVuY3Rpb24gbmFtZSAqLwotICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkvKiBPZmZzZXQgaW50byBzZWN0aW9uICovCi0gIH0gdTsKLX0gYWxlbnQ7Ci0MCi0vKiBvYmplY3QgYW5kIGNvcmUgZmlsZSBzZWN0aW9ucyAqLwotCi0jZGVmaW5lCWFsaWduX3Bvd2VyKGFkZHIsIGFsaWduKQlcCi0JKCAoKGFkZHIpICsgKCgxPDwoYWxpZ24pKS0xKSkgJiAoLTEgPDwgKGFsaWduKSkpCi0KLXR5cGVkZWYgc3RydWN0IHNlYyAqc2VjX3B0cjsKLQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fbmFtZShiZmQsIHB0cikgKChwdHIpLT5uYW1lICsgMCkKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3ZtYShiZmQsIHB0cikgKChwdHIpLT52bWEgKyAwKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50KGJmZCwgcHRyKSAoKHB0ciktPmFsaWdubWVudF9wb3dlciArIDApCi0jZGVmaW5lIGJmZF9zZWN0aW9uX25hbWUoYmZkLCBwdHIpICgocHRyKS0+bmFtZSkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fc2l6ZShiZmQsIHB0cikgKGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyhwdHIpKQotI2RlZmluZSBiZmRfc2VjdGlvbl92bWEoYmZkLCBwdHIpICgocHRyKS0+dm1hKQotI2RlZmluZSBiZmRfc2VjdGlvbl9sbWEoYmZkLCBwdHIpICgocHRyKS0+bG1hKQotI2RlZmluZSBiZmRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIpICgocHRyKS0+YWxpZ25tZW50X3Bvd2VyKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MoYmZkLCBwdHIpICgocHRyKS0+ZmxhZ3MgKyAwKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fdXNlcmRhdGEoYmZkLCBwdHIpICgocHRyKS0+dXNlcmRhdGEpCi0KLSNkZWZpbmUgYmZkX2lzX2NvbV9zZWN0aW9uKHB0cikgKCgocHRyKS0+ZmxhZ3MgJiBTRUNfSVNfQ09NTU9OKSAhPSAwKQotCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl92bWEoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+dm1hID0gKHB0ciktPmxtYT0gKHZhbCkpLCAoKHB0ciktPnVzZXJfc2V0X3ZtYSA9IChib29sZWFuKXRydWUpLCB0cnVlKQotI2RlZmluZSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50KGJmZCwgcHRyLCB2YWwpICgoKHB0ciktPmFsaWdubWVudF9wb3dlciA9ICh2YWwpKSx0cnVlKQotI2RlZmluZSBiZmRfc2V0X3NlY3Rpb25fdXNlcmRhdGEoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+dXNlcmRhdGEgPSAodmFsKSksdHJ1ZSkKLQotdHlwZWRlZiBzdHJ1Y3Qgc3RhdCBzdGF0X3R5cGU7IAotDAotdHlwZWRlZiBlbnVtIGJmZF9wcmludF9zeW1ib2wKLXsgCi0gIGJmZF9wcmludF9zeW1ib2xfbmFtZSwKLSAgYmZkX3ByaW50X3N5bWJvbF9tb3JlLAotICBiZmRfcHJpbnRfc3ltYm9sX2FsbAotfSBiZmRfcHJpbnRfc3ltYm9sX3R5cGU7Ci0gICAgCi0vKiBJbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbCB0aGF0IG5tIG5lZWRzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX3N5bWJvbF9pbmZvCi17Ci0gIHN5bXZhbHVlIHZhbHVlOwotICBjaGFyIHR5cGU7Ci0gIENPTlNUIGNoYXIgKm5hbWU7ICAgICAgICAgICAgLyogU3ltYm9sIG5hbWUuICAqLwotICB1bnNpZ25lZCBjaGFyIHN0YWJfdHlwZTsgICAgIC8qIFN0YWIgdHlwZS4gICovCi0gIGNoYXIgc3RhYl9vdGhlcjsgICAgICAgICAgICAgLyogU3RhYiBvdGhlci4gKi8KLSAgc2hvcnQgc3RhYl9kZXNjOyAgICAgICAgICAgICAvKiBTdGFiIGRlc2MuICAqLwotICBDT05TVCBjaGFyICpzdGFiX25hbWU7ICAgICAgIC8qIFN0cmluZyBmb3Igc3RhYiB0eXBlLiAgKi8KLX0gc3ltYm9sX2luZm87Ci0KLS8qIEdldCB0aGUgbmFtZSBvZiBhIHN0YWJzIHR5cGUgY29kZS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpiZmRfZ2V0X3N0YWJfbmFtZSBQQVJBTVMgKChpbnQpKTsKLQwKLS8qIEhhc2ggdGFibGUgcm91dGluZXMuICBUaGVyZSBpcyBubyB3YXkgdG8gZnJlZSB1cCBhIGhhc2ggdGFibGUuICAqLwotCi0vKiBBbiBlbGVtZW50IGluIHRoZSBoYXNoIHRhYmxlLiAgTW9zdCB1c2VzIHdpbGwgYWN0dWFsbHkgdXNlIGEgbGFyZ2VyCi0gICBzdHJ1Y3R1cmUsIGFuZCBhbiBpbnN0YW5jZSBvZiB0aGlzIHdpbGwgYmUgdGhlIGZpcnN0IGZpZWxkLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5Ci17Ci0gIC8qIE5leHQgZW50cnkgZm9yIHRoaXMgaGFzaCBjb2RlLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpuZXh0OwotICAvKiBTdHJpbmcgYmVpbmcgaGFzaGVkLiAgKi8KLSAgY29uc3QgY2hhciAqc3RyaW5nOwotICAvKiBIYXNoIGNvZGUuICBUaGlzIGlzIHRoZSBmdWxsIGhhc2ggY29kZSwgbm90IHRoZSBpbmRleCBpbnRvIHRoZQotICAgICB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgaGFzaDsKLX07Ci0KLS8qIEEgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF90YWJsZQotewotICAvKiBUaGUgaGFzaCBhcnJheS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKnRhYmxlOwotICAvKiBUaGUgbnVtYmVyIG9mIHNsb3RzIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIC8qIEEgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgbmV3IGVsZW1lbnRzIGluIHRoZSBoYXNoIHRhYmxlLiAgVGhlCi0gICAgIGZpcnN0IGVudHJ5IGlzIGl0c2VsZiBhIHBvaW50ZXIgdG8gYW4gZWxlbWVudC4gIFdoZW4gdGhpcwotICAgICBmdW5jdGlvbiBpcyBmaXJzdCBpbnZva2VkLCB0aGlzIHBvaW50ZXIgd2lsbCBiZSBOVUxMLiAgSG93ZXZlciwKLSAgICAgaGF2aW5nIHRoZSBwb2ludGVyIHBlcm1pdHMgYSBoaWVyYXJjaHkgb2YgbWV0aG9kIGZ1bmN0aW9ucyB0byBiZQotICAgICBidWlsdCBlYWNoIG9mIHdoaWNoIGNhbGxzIHRoZSBmdW5jdGlvbiBpbiB0aGUgc3VwZXJjbGFzcy4gIFRodXMKLSAgICAgZWFjaCBmdW5jdGlvbiBzaG91bGQgYmUgd3JpdHRlbiB0byBhbGxvY2F0ZSBhIG5ldyBibG9jayBvZiBtZW1vcnkKLSAgICAgb25seSBpZiB0aGUgYXJndW1lbnQgaXMgTlVMTC4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJICAgICBjb25zdCBjaGFyICopKTsKLSAgIC8qIEFuIG9iamFsbG9jIGZvciB0aGlzIGhhc2ggdGFibGUuICBUaGlzIGlzIGEgc3RydWN0IG9iamFsbG9jICosCi0gICAgIGJ1dCB3ZSB1c2UgUFRSIHRvIGF2b2lkIHJlcXVpcmluZyB0aGUgaW5jbHVzaW9uIG9mIG9iamFsbG9jLmguICAqLwotICBQVFIgbWVtb3J5OwotfTsKLQotLyogSW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICopKSk7Ci0KLS8qIEluaXRpYWxpemUgYSBoYXNoIHRhYmxlIHNwZWNpZnlpbmcgYSBzaXplLiAgKi8KLWV4dGVybiBib29sZWFuIGJmZF9oYXNoX3RhYmxlX2luaXRfbgotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICopLAotCSAgIHVuc2lnbmVkIGludCBzaXplKSk7Ci0KLS8qIEZyZWUgdXAgYSBoYXNoIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9oYXNoX3RhYmxlX2ZyZWUgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopKTsKLQotLyogTG9vayB1cCBhIHN0cmluZyBpbiBhIGhhc2ggdGFibGUuICBJZiBDUkVBVEUgaXMgdHJ1ZSwgYSBuZXcgZW50cnkKLSAgIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhpcyBzdHJpbmcgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QuICBUaGUKLSAgIENPUFkgYXJndW1lbnQgbXVzdCBiZSB0cnVlIGlmIHRoaXMgcm91dGluZSBzaG91bGQgY29weSB0aGUgc3RyaW5nCi0gICBpbnRvIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgd2hlbiBhZGRpbmcgYW4gZW50cnkuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqYmZkX2hhc2hfbG9va3VwCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4gY3JlYXRlLAotCSAgIGJvb2xlYW4gY29weSkpOwotCi0vKiBSZXBsYWNlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gICovCi1leHRlcm4gdm9pZCBiZmRfaGFzaF9yZXBsYWNlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm9sZCwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm53KSk7Ci0KLS8qIEJhc2UgbWV0aG9kIGZvciBjcmVhdGluZyBhIGhhc2ggdGFibGUgZW50cnkuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqYmZkX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JICAgY29uc3QgY2hhciAqKSk7Ci0KLS8qIEdyYWIgc29tZSBzcGFjZSBmb3IgYSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLWV4dGVybiBQVFIgYmZkX2hhc2hfYWxsb2NhdGUgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgdW5zaWduZWQgaW50KSk7Ci0KLS8qIFRyYXZlcnNlIGEgaGFzaCB0YWJsZSBpbiBhIHJhbmRvbSBvcmRlciwgY2FsbGluZyBhIGZ1bmN0aW9uIG9uIGVhY2gKLSAgIGVsZW1lbnQuICBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlIHRyYXZlcnNhbCBzdG9wcy4gIFRoZQotICAgSU5GTyBhcmd1bWVudCBpcyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9oYXNoX3RyYXZlcnNlIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBib29sZWFuICgqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQkgICAgUFRSKSwKLQkJCQkgICAgICAgUFRSIGluZm8pKTsKLQwKLS8qIFNlbWktcG9ydGFibGUgc3RyaW5nIGNvbmNhdGVuYXRpb24gaW4gY3BwLgotICAgVGhlIENBVDQgaGFjayBpcyB0byBhdm9pZCBhIHByb2JsZW0gd2l0aCBzb21lIHN0cmljdCBBTlNJIEMgcHJlcHJvY2Vzc29ycy4KLSAgIFRoZSBwcm9ibGVtIGlzLCAiMzJfIiBpcyBub3QgYSB2YWxpZCBwcmVwcm9jZXNzaW5nIHRva2VuLCBhbmQgd2UgZG9uJ3QKLSAgIHdhbnQgZXh0cmEgdW5kZXJzY29yZXMgKGUuZy4sICJubG1fMzJfIikuICBUaGUgWENBVDIgbWFjcm8gd2lsbCBjYXVzZSB0aGUKLSAgIGlubmVyIENBVCBtYWNyb3MgdG8gYmUgZXZhbHVhdGVkIGZpcnN0LCBwcm9kdWNpbmcgc3RpbGwtdmFsaWQgcHAtdG9rZW5zLgotICAgVGhlbiB0aGUgZmluYWwgY29uY2F0ZW5hdGlvbiBjYW4gYmUgZG9uZS4gIChTaWdoLikgICovCi0jaWZuZGVmIENBVAotI2lmZGVmIFNBQkVSCi0jZGVmaW5lIENBVChhLGIpCWEjI2IKLSNkZWZpbmUgQ0FUMyhhLGIsYykJYSMjYiMjYwotI2RlZmluZSBDQVQ0KGEsYixjLGQpCWEjI2IjI2MjI2QKLSNlbHNlCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLSNkZWZpbmUgQ0FUKGEsYikgYSMjYgotI2RlZmluZSBDQVQzKGEsYixjKSBhIyNiIyNjCi0jZGVmaW5lIFhDQVQyKGEsYikJQ0FUKGEsYikKLSNkZWZpbmUgQ0FUNChhLGIsYyxkKQlYQ0FUMihDQVQoYSxiKSxDQVQoYyxkKSkKLSNlbHNlCi0jZGVmaW5lIENBVChhLGIpIGEvKiovYgotI2RlZmluZSBDQVQzKGEsYixjKSBhLyoqL2IvKiovYwotI2RlZmluZSBDQVQ0KGEsYixjLGQpCWEvKiovYi8qKi9jLyoqL2QKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX1NXQVBfVEFCTEUgKFBUUikgJmJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlCi0MCi0vKiBVc2VyIHByb2dyYW0gYWNjZXNzIHRvIEJGRCBmYWNpbGl0aWVzICovCi0KLS8qIERpcmVjdCBJL08gcm91dGluZXMsIGZvciBwcm9ncmFtcyB3aGljaCBrbm93IG1vcmUgYWJvdXQgdGhlIG9iamVjdAotICAgZmlsZSB0aGFuIEJGRCBkb2VzLiAgVXNlIGhpZ2hlciBsZXZlbCByb3V0aW5lcyBpZiBwb3NzaWJsZS4gICovCi0KLWV4dGVybiBiZmRfc2l6ZV90eXBlIGJmZF9yZWFkCi0gIFBBUkFNUyAoKFBUUiwgYmZkX3NpemVfdHlwZSBzaXplLCBiZmRfc2l6ZV90eXBlIG5pdGVtcywgYmZkICphYmZkKSk7Ci1leHRlcm4gYmZkX3NpemVfdHlwZSBiZmRfd3JpdGUKLSAgUEFSQU1TICgoY29uc3QgUFRSLCBiZmRfc2l6ZV90eXBlIHNpemUsIGJmZF9zaXplX3R5cGUgbml0ZW1zLCBiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgYmZkX3NlZWsgUEFSQU1TICgoYmZkICphYmZkLCBmaWxlX3B0ciBmcCwgaW50IGRpcmVjdGlvbikpOwotZXh0ZXJuIGxvbmcgYmZkX3RlbGwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gaW50IGJmZF9mbHVzaCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgYmZkX3N0YXQgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0KLQotLyogQ2FzdCBmcm9tIGNvbnN0IGNoYXIgKiB0byBjaGFyICogc28gdGhhdCBjYWxsZXIgY2FuIGFzc2lnbiB0bwotICAgYSBjaGFyICogd2l0aG91dCBhIHdhcm5pbmcuICAqLwotI2RlZmluZSBiZmRfZ2V0X2ZpbGVuYW1lKGFiZmQpICgoY2hhciAqKSAoYWJmZCktPmZpbGVuYW1lKQotI2RlZmluZSBiZmRfZ2V0X2NhY2hlYWJsZShhYmZkKSAoKGFiZmQpLT5jYWNoZWFibGUpCi0jZGVmaW5lIGJmZF9nZXRfZm9ybWF0KGFiZmQpICgoYWJmZCktPmZvcm1hdCkKLSNkZWZpbmUgYmZkX2dldF90YXJnZXQoYWJmZCkgKChhYmZkKS0+eHZlYy0+bmFtZSkKLSNkZWZpbmUgYmZkX2dldF9mbGF2b3VyKGFiZmQpICgoYWJmZCktPnh2ZWMtPmZsYXZvdXIpCi0jZGVmaW5lIGJmZF9iaWdfZW5kaWFuKGFiZmQpICgoYWJmZCktPnh2ZWMtPmJ5dGVvcmRlciA9PSBCRkRfRU5ESUFOX0JJRykKLSNkZWZpbmUgYmZkX2xpdHRsZV9lbmRpYW4oYWJmZCkgKChhYmZkKS0+eHZlYy0+Ynl0ZW9yZGVyID09IEJGRF9FTkRJQU5fTElUVExFKQotI2RlZmluZSBiZmRfaGVhZGVyX2JpZ19lbmRpYW4oYWJmZCkgXAotICAoKGFiZmQpLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyID09IEJGRF9FTkRJQU5fQklHKQotI2RlZmluZSBiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4oYWJmZCkgXAotICAoKGFiZmQpLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyID09IEJGRF9FTkRJQU5fTElUVExFKQotI2RlZmluZSBiZmRfZ2V0X2ZpbGVfZmxhZ3MoYWJmZCkgKChhYmZkKS0+ZmxhZ3MpCi0jZGVmaW5lIGJmZF9hcHBsaWNhYmxlX2ZpbGVfZmxhZ3MoYWJmZCkgKChhYmZkKS0+eHZlYy0+b2JqZWN0X2ZsYWdzKQotI2RlZmluZSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzKGFiZmQpICgoYWJmZCktPnh2ZWMtPnNlY3Rpb25fZmxhZ3MpCi0jZGVmaW5lIGJmZF9teV9hcmNoaXZlKGFiZmQpICgoYWJmZCktPm15X2FyY2hpdmUpCi0jZGVmaW5lIGJmZF9oYXNfbWFwKGFiZmQpICgoYWJmZCktPmhhc19hcm1hcCkKLQotI2RlZmluZSBiZmRfdmFsaWRfcmVsb2NfdHlwZXMoYWJmZCkgKChhYmZkKS0+eHZlYy0+dmFsaWRfcmVsb2NfdHlwZXMpCi0jZGVmaW5lIGJmZF91c3JkYXRhKGFiZmQpICgoYWJmZCktPnVzcmRhdGEpCi0KLSNkZWZpbmUgYmZkX2dldF9zdGFydF9hZGRyZXNzKGFiZmQpICgoYWJmZCktPnN0YXJ0X2FkZHJlc3MpCi0jZGVmaW5lIGJmZF9nZXRfc3ltY291bnQoYWJmZCkgKChhYmZkKS0+c3ltY291bnQpCi0jZGVmaW5lIGJmZF9nZXRfb3V0c3ltYm9scyhhYmZkKSAoKGFiZmQpLT5vdXRzeW1ib2xzKQotI2RlZmluZSBiZmRfY291bnRfc2VjdGlvbnMoYWJmZCkgKChhYmZkKS0+c2VjdGlvbl9jb3VudCkKLQotI2RlZmluZSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIoYWJmZCkgKChhYmZkKS0+eHZlYy0+c3ltYm9sX2xlYWRpbmdfY2hhcikKLQotI2RlZmluZSBiZmRfc2V0X2NhY2hlYWJsZShhYmZkLGJvb2wpICgoKGFiZmQpLT5jYWNoZWFibGUgPSAoYm9vbGVhbikoYm9vbCkpLCB0cnVlKQotCi1leHRlcm4gYm9vbGVhbiBiZmRfcmVjb3JkX3BoZHIKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGxvbmcsIGJvb2xlYW4sIGZsYWd3b3JkLCBib29sZWFuLCBiZmRfdm1hLAotCSAgIGJvb2xlYW4sIGJvb2xlYW4sIHVuc2lnbmVkIGludCwgc3RydWN0IHNlYyAqKikpOwotCi0vKiBCeXRlIHN3YXBwaW5nIHJvdXRpbmVzLiAgKi8KLQotYmZkX3ZtYQkJYmZkX2dldGI2NAkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEgCWJmZF9nZXRsNjQJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0Yl9zaWduZWRfNjQgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0bF9zaWduZWRfNjQgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0YjMyCSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYQkJYmZkX2dldGwzMgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRiX3NpZ25lZF8zMiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRsX3NpZ25lZF8zMiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRiMTYJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0bDE2CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGJfc2lnbmVkXzE2IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGxfc2lnbmVkXzE2IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGI2NAkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRsNjQJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0YjMyCSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGwzMgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRiMTYJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0bDE2CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotDAotLyogRXh0ZXJuYWxseSB2aXNpYmxlIEVDT0ZGIHJvdXRpbmVzLiAgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi1zdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbzsKLXN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwOwotc3RydWN0IGVjb2ZmX2V4dHI7Ci1zdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5Owotc3RydWN0IGJmZF9saW5rX2luZm87Ci1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeTsKLXN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZTsKLSNlbmRpZgotZXh0ZXJuIGJmZF92bWEgYmZkX2Vjb2ZmX2dldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfc2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3ZtYSBncF92YWx1ZSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGxvbmcgZ3BybWFzaywgdW5zaWduZWQgbG9uZyBmcHJtYXNrLAotCSAgIHVuc2lnbmVkIGxvbmcgKmNwcm1hc2spKTsKLWV4dGVybiBQVFIgYmZkX2Vjb2ZmX2RlYnVnX2luaXQKLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWNvZmZfZGVidWdfZnJlZQotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsCi0JICAgYmZkICppbnB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICppbnB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqaW5wdXRfc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZV9vdGhlcgotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLCBiZmQgKmlucHV0X2JmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwLAotCSAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlLAotCSAgIGJvb2xlYW4gKCpnZXRfZXh0cikgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwKLQkJCQlzdHJ1Y3QgZWNvZmZfZXh0ciAqKSwKLQkgICB2b2lkICgqc2V0X2luZGV4KSAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAotCQkJICAgICAgYmZkX3NpemVfdHlwZSkpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsCi0JICAgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGVjb2ZmX2V4dHIgKmVzeW0pKTsKLWV4dGVybiBiZmRfc2l6ZV90eXBlIGJmZF9lY29mZl9kZWJ1Z19zaXplCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfd3JpdGVfZGVidWcKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsIGZpbGVfcHRyIHdoZXJlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfd3JpdGVfYWNjdW11bGF0ZWRfZGVidWcKLSAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGZpbGVfcHRyIHdoZXJlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICosIHN0cnVjdCBzZWMgKiwKLQkgICBjaGFyICoqKSk7Ci0KLS8qIEV4dGVybmFsbHkgdmlzaWJsZSBFTEYgcm91dGluZXMuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QKLXsKLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZXh0OwotICBiZmQgKmJ5OwotICBjb25zdCBjaGFyICpuYW1lOwotfTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICoqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgY29uc3QgY2hhciAqLAotCSAgIGNvbnN0IGNoYXIgKiBjb25zdCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICoqLAotCSAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgY29uc3QgY2hhciAqLAotCSAgIGNvbnN0IGNoYXIgKiBjb25zdCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICoqLAotCSAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqYmZkX2VsZl9nZXRfZHRfc29uYW1lIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIFN1bk9TIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpiZmRfc3Vub3NfZ2V0X25lZWRlZF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICoqLCBzdHJ1Y3Qgc2VjICoqLAotCSAgIHN0cnVjdCBzZWMgKiopKTsKLQotLyogTGludXggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGxpbmtlci4gICovCi0KLWV4dGVybiBib29sZWFuIGJmZF9pMzg2bGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfbTY4a2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3NwYXJjbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIG1tYXAgaGFja3MgKi8KLQotc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsOwotdHlwZWRlZiBzdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWwgYmZkX3dpbmRvd19pbnRlcm5hbDsKLQotdHlwZWRlZiBzdHJ1Y3QgX2JmZF93aW5kb3cgewotICAvKiBXaGF0IHRoZSB1c2VyIGFza2VkIGZvci4gICovCi0gIFBUUiBkYXRhOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIC8qIFRoZSBhY3R1YWwgd2luZG93IHVzZWQgYnkgQkZELiAgU21hbGwgdXNlci1yZXF1ZXN0ZWQgcmVhZC1vbmx5Ci0gICAgIHJlZ2lvbnMgc2hhcmluZyBhIHBhZ2UgbWF5IHNoYXJlIGEgc2luZ2xlIHdpbmRvdyBpbnRvIHRoZSBvYmplY3QKLSAgICAgZmlsZS4gIFJlYWQtd3JpdGUgdmVyc2lvbnMgc2hvdWxkbid0IHVudGlsIEkndmUgZml4ZWQgdGhpbmdzIHRvCi0gICAgIGtlZXAgdHJhY2sgb2Ygd2hpY2ggcG9ydGlvbnMgaGF2ZSBiZWVuIGNsYWltZWQgYnkgdGhlCi0gICAgIGFwcGxpY2F0aW9uOyBkb24ndCB3YW50IHRvIGdpdmUgdGhlIHNhbWUgcmVnaW9uIGJhY2sgd2hlbiB0aGUKLSAgICAgYXBwbGljYXRpb24gd2FudHMgdHdvIHdyaXRhYmxlIGNvcGllcyEgICovCi0gIHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCAqaTsKLX0gYmZkX3dpbmRvdzsKLQotZXh0ZXJuIHZvaWQgYmZkX2luaXRfd2luZG93IFBBUkFNUyAoKGJmZF93aW5kb3cgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2ZyZWVfd2luZG93IFBBUkFNUyAoKGJmZF93aW5kb3cgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2dldF9maWxlX3dpbmRvdwotICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUsIGJmZF93aW5kb3cgKiwgYm9vbGVhbikpOwotCi0vKiBYQ09GRiBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgbGlua2VyLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBiZmRfc2l6ZV90eXBlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKLQkgICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBib29sZWFuLAotCSAgIGludCwgYm9vbGVhbiwgYm9vbGVhbiwgc3RydWN0IHNlYyAqKikpOwotCi0vKiBFeHRlcm5hbGx5IHZpc2libGUgQ09GRiByb3V0aW5lcy4gICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGludGVybmFsX3N5bWVudDsKLXVuaW9uIGludGVybmFsX2F1eGVudDsKLSNlbmRpZgotCi1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9nZXRfc3ltZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9nZXRfYXV4ZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIGludCwgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLCB1bnNpZ25lZCBpbnQpKTsKLQotLyogQVJNIEludGVyd29ya2luZyBzdXBwb3J0LiAgQ2FsbGVkIGZyb20gbGlua2VyLiAgKi8KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYwotI2VuZGlmCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYwotI2VuZGlmCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGludCkpOwotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi1zdGF0aWMKLSNlbmRpZgotZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogRUxGIEFSTSBJbnRlcndvcmtpbmcgc3VwcG9ydC4gIENhbGxlZCBmcm9tIGxpbmtlci4gICovCi0gIGV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0gICAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotIAotICBleHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotIAotICBleHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEFuZCBtb3JlIGZyb20gdGhlIHNvdXJjZS4gICovCi12b2lkIAotYmZkX2luaXQgUEFSQU1TICgodm9pZCkpOwotCi1iZmQgKgotYmZkX29wZW5yIFBBUkFNUyAoKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQpKTsKLQotYmZkICoKLWJmZF9mZG9wZW5yIFBBUkFNUyAoKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQsIGludCBmZCkpOwotCi1iZmQgKgotYmZkX29wZW5zdHJlYW1yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBQVFIpKTsKLQotYmZkICoKLWJmZF9vcGVudyBQQVJBTVMgKChDT05TVCBjaGFyICpmaWxlbmFtZSwgQ09OU1QgY2hhciAqdGFyZ2V0KSk7Ci0KLWJvb2xlYW4gCi1iZmRfY2xvc2UgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWJvb2xlYW4gCi1iZmRfY2xvc2VfYWxsX2RvbmUgUEFSQU1TICgoYmZkICopKTsKLQotYmZkICoKLWJmZF9jcmVhdGUgUEFSQU1TICgoQ09OU1QgY2hhciAqZmlsZW5hbWUsIGJmZCAqdGVtcGwpKTsKLQotYm9vbGVhbiAKLWJmZF9tYWtlX3dyaXRhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1ib29sZWFuIAotYmZkX21ha2VfcmVhZGFibGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLQotIC8qIEJ5dGUgc3dhcHBpbmcgbWFjcm9zIGZvciB1c2VyIHNlY3Rpb24gZGF0YS4gICovCi0KLSNkZWZpbmUgYmZkX3B1dF84KGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgKCooKHVuc2lnbmVkIGNoYXIgKikocHRyKSkgPSAodW5zaWduZWQgY2hhcikodmFsKSkKLSNkZWZpbmUgYmZkX3B1dF9zaWduZWRfOCBcCi0gICAgICAgICAgICAgICBiZmRfcHV0XzgKLSNkZWZpbmUgYmZkX2dldF84KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgICgqKHVuc2lnbmVkIGNoYXIgKikocHRyKSkKLSNkZWZpbmUgYmZkX2dldF9zaWduZWRfOChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICgoKih1bnNpZ25lZCBjaGFyICopKHB0cikgXiAweDgwKSAtIDB4ODApCi0KLSNkZWZpbmUgYmZkX3B1dF8xNihhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4MTYsICgodmFsKSwocHRyKSkpCi0jZGVmaW5lIGJmZF9wdXRfc2lnbmVkXzE2IFwKLSAgICAgICAgICAgICAgICBiZmRfcHV0XzE2Ci0jZGVmaW5lIGJmZF9nZXRfMTYoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHgxNiwgKHB0cikpCi0jZGVmaW5lIGJmZF9nZXRfc2lnbmVkXzE2KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EIChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfMTYsIChwdHIpKQotCi0jZGVmaW5lIGJmZF9wdXRfMzIoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfcHV0eDMyLCAoKHZhbCksKHB0cikpKQotI2RlZmluZSBiZmRfcHV0X3NpZ25lZF8zMiBcCi0gICAgICAgICAgICAgICAgYmZkX3B1dF8zMgotI2RlZmluZSBiZmRfZ2V0XzMyKGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4MzIsIChwdHIpKQotI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF8zMihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfMzIsIChwdHIpKQotCi0jZGVmaW5lIGJmZF9wdXRfNjQoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfcHV0eDY0LCAoKHZhbCksIChwdHIpKSkKLSNkZWZpbmUgYmZkX3B1dF9zaWduZWRfNjQgXAotICAgICAgICAgICAgICAgIGJmZF9wdXRfNjQKLSNkZWZpbmUgYmZkX2dldF82NChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eDY0LCAocHRyKSkKLSNkZWZpbmUgYmZkX2dldF9zaWduZWRfNjQoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHhfc2lnbmVkXzY0LCAocHRyKSkKLQotCi0gLyogQnl0ZSBzd2FwcGluZyBtYWNyb3MgZm9yIGZpbGUgaGVhZGVyIGRhdGEuICAqLwotCi0jZGVmaW5lIGJmZF9oX3B1dF84KGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICBiZmRfcHV0XzggKGFiZmQsIHZhbCwgcHRyKQotI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzgoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdmFsLCBwdHIpCi0jZGVmaW5lIGJmZF9oX2dldF84KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgYmZkX2dldF84IChhYmZkLCBwdHIpCi0jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfOChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgIGJmZF9nZXRfc2lnbmVkXzggKGFiZmQsIHB0cikKLQotI2RlZmluZSBiZmRfaF9wdXRfMTYoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9wdXR4MTYsKHZhbCxwdHIpKQotI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzE2IFwKLSAgICAgICAgICAgICAgICBiZmRfaF9wdXRfMTYKLSNkZWZpbmUgYmZkX2hfZ2V0XzE2KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHgxNiwocHRyKSkKLSNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF8xNihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF8xNiwgKHB0cikpCi0KLSNkZWZpbmUgYmZkX2hfcHV0XzMyKGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfcHV0eDMyLCh2YWwscHRyKSkKLSNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF8zMiBcCi0gICAgICAgICAgICAgICAgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIGJmZF9oX2dldF8zMihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4MzIsKHB0cikpCi0jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfMzIoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfMzIsIChwdHIpKQotCi0jZGVmaW5lIGJmZF9oX3B1dF82NChhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHg2NCwodmFsLCBwdHIpKQotI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzY0IFwKLSAgICAgICAgICAgICAgICBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgYmZkX2hfZ2V0XzY0KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHg2NCwocHRyKSkKLSNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF82NCwgKHB0cikpCi0KLXR5cGVkZWYgc3RydWN0IHNlYwotewotICAgICAgICAgLyogVGhlIG5hbWUgb2YgdGhlIHNlY3Rpb247IHRoZSBuYW1lIGlzbid0IGEgY29weSwgdGhlIHBvaW50ZXIgaXMKLSAgICAgICAgdGhlIHNhbWUgYXMgdGhhdCBwYXNzZWQgdG8gYmZkX21ha2Vfc2VjdGlvbi4gKi8KLQotICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0KLSAgICAgICAgIC8qIFdoaWNoIHNlY3Rpb24gaXMgaXQ7IDAuLm50aC4gICAgICAqLwotCi0gICBpbnQgaW5kZXg7Ci0KLSAgICAgICAgIC8qIFRoZSBuZXh0IHNlY3Rpb24gaW4gdGhlIGxpc3QgYmVsb25naW5nIHRvIHRoZSBCRkQsIG9yIE5VTEwuICovCi0KLSAgICBzdHJ1Y3Qgc2VjICpuZXh0OwotCi0gICAgICAgICAvKiBUaGUgZmllbGQgZmxhZ3MgY29udGFpbnMgYXR0cmlidXRlcyBvZiB0aGUgc2VjdGlvbi4gU29tZQotICAgICAgICAgICBmbGFncyBhcmUgcmVhZCBpbiBmcm9tIHRoZSBvYmplY3QgZmlsZSwgYW5kIHNvbWUgYXJlCi0gICAgICAgICAgIHN5bnRoZXNpemVkIGZyb20gb3RoZXIgaW5mb3JtYXRpb24uICAqLwotCi0gICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSNkZWZpbmUgU0VDX05PX0ZMQUdTICAgMHgwMDAKLQotICAgICAgICAgLyogVGVsbHMgdGhlIE9TIHRvIGFsbG9jYXRlIHNwYWNlIGZvciB0aGlzIHNlY3Rpb24gd2hlbiBsb2FkaW5nLgotICAgICAgICAgICBUaGlzIGlzIGNsZWFyIGZvciBhIHNlY3Rpb24gY29udGFpbmluZyBkZWJ1ZyBpbmZvcm1hdGlvbgotICAgICAgICAgICBvbmx5LiAqLwotI2RlZmluZSBTRUNfQUxMT0MgICAgICAweDAwMQotCi0gICAgICAgICAvKiBUZWxscyB0aGUgT1MgdG8gbG9hZCB0aGUgc2VjdGlvbiBmcm9tIHRoZSBmaWxlIHdoZW4gbG9hZGluZy4KLSAgICAgICAgICAgVGhpcyBpcyBjbGVhciBmb3IgYSAuYnNzIHNlY3Rpb24uICovCi0jZGVmaW5lIFNFQ19MT0FEICAgICAgIDB4MDAyCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGRhdGEgc3RpbGwgdG8gYmUgcmVsb2NhdGVkLCBzbyB0aGVyZSBpcwotICAgICAgICAgICBzb21lIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG9vLiAqLwotI2RlZmluZSBTRUNfUkVMT0MgICAgICAweDAwNAotCi0jaWYgMCAgICAvKiBPYnNvbGV0ZSA/ICovCi0jZGVmaW5lIFNFQ19CQUxJR04gICAgIDB4MDA4Ci0jZW5kaWYKLQotICAgICAgICAgLyogQSBzaWduYWwgdG8gdGhlIE9TIHRoYXQgdGhlIHNlY3Rpb24gY29udGFpbnMgcmVhZCBvbmx5Ci0gICAgICAgICAgZGF0YS4gKi8KLSNkZWZpbmUgU0VDX1JFQURPTkxZICAgMHgwMTAKLQotICAgICAgICAgLyogVGhlIHNlY3Rpb24gY29udGFpbnMgY29kZSBvbmx5LiAqLwotI2RlZmluZSBTRUNfQ09ERSAgICAgICAweDAyMAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBkYXRhIG9ubHkuICovCi0jZGVmaW5lIFNFQ19EQVRBICAgICAgIDB4MDQwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIHdpbGwgcmVzaWRlIGluIFJPTS4gKi8KLSNkZWZpbmUgU0VDX1JPTSAgICAgICAgMHgwODAKLQotICAgICAgICAgLyogVGhlIHNlY3Rpb24gY29udGFpbnMgY29uc3RydWN0b3IgaW5mb3JtYXRpb24uIFRoaXMgc2VjdGlvbgotICAgICAgICAgICB0eXBlIGlzIHVzZWQgYnkgdGhlIGxpbmtlciB0byBjcmVhdGUgbGlzdHMgb2YgY29uc3RydWN0b3JzIGFuZAotICAgICAgICAgICBkZXN0cnVjdG9ycyB1c2VkIGJ5IDw8ZysrPj4uIFdoZW4gYSBiYWNrIGVuZCBzZWVzIGEgc3ltYm9sCi0gICAgICAgICAgIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluIGEgY29uc3RydWN0b3IgbGlzdCwgaXQgY3JlYXRlcyBhIG5ldwotICAgICAgICAgICBzZWN0aW9uIGZvciB0aGUgdHlwZSBvZiBuYW1lIChlLmcuLCA8PF9fQ1RPUl9MSVNUX18+PiksIGF0dGFjaGVzCi0gICAgICAgICAgIHRoZSBzeW1ib2wgdG8gaXQsIGFuZCBidWlsZHMgYSByZWxvY2F0aW9uLiBUbyBidWlsZCB0aGUgbGlzdHMKLSAgICAgICAgICAgb2YgY29uc3RydWN0b3JzLCBhbGwgdGhlIGxpbmtlciBoYXMgdG8gZG8gaXMgY2F0ZW5hdGUgYWxsIHRoZQotICAgICAgICAgICBzZWN0aW9ucyBjYWxsZWQgPDxfX0NUT1JfTElTVF9fPj4gYW5kIHJlbG9jYXRlIHRoZSBkYXRhCi0gICAgICAgICAgIGNvbnRhaW5lZCB3aXRoaW4gLSBleGFjdGx5IHRoZSBvcGVyYXRpb25zIGl0IHdvdWxkIHBlZm9ybSBvbgotICAgICAgICAgICBzdGFuZGFyZCBkYXRhLiAqLwotI2RlZmluZSBTRUNfQ09OU1RSVUNUT1IgMHgxMDAKLQotICAgICAgICAgLyogVGhlIHNlY3Rpb24gaXMgYSBjb25zdHJ1Y3RvciwgYW5kIHNob3VsZCBiZSBwbGFjZWQgYXQgdGhlCi0gICAgICAgICAgZW5kIG9mIHRoZSB0ZXh0LCBkYXRhLCBvciBic3Mgc2VjdGlvbig/KS4gKi8KLSNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SX1RFWFQgMHgxMTAwCi0jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9EQVRBIDB4MjEwMAotI2RlZmluZSBTRUNfQ09OU1RSVUNUT1JfQlNTICAweDMxMDAKLQotICAgICAgICAgLyogVGhlIHNlY3Rpb24gaGFzIGNvbnRlbnRzIC0gYSBkYXRhIHNlY3Rpb24gY291bGQgYmUKLSAgICAgICAgICAgPDxTRUNfQUxMT0M+PiB8IDw8U0VDX0hBU19DT05URU5UUz4+OyBhIGRlYnVnIHNlY3Rpb24gY291bGQgYmUKLSAgICAgICAgICAgPDxTRUNfSEFTX0NPTlRFTlRTPj4gKi8KLSNkZWZpbmUgU0VDX0hBU19DT05URU5UUyAweDIwMAotCi0gICAgICAgICAvKiBBbiBpbnN0cnVjdGlvbiB0byB0aGUgbGlua2VyIHRvIG5vdCBvdXRwdXQgdGhlIHNlY3Rpb24KLSAgICAgICAgICAgZXZlbiBpZiBpdCBoYXMgaW5mb3JtYXRpb24gd2hpY2ggd291bGQgbm9ybWFsbHkgYmUgd3JpdHRlbi4gKi8KLSNkZWZpbmUgU0VDX05FVkVSX0xPQUQgMHg0MDAKLQotICAgICAgICAgLyogVGhlIHNlY3Rpb24gaXMgYSBDT0ZGIHNoYXJlZCBsaWJyYXJ5IHNlY3Rpb24uICBUaGlzIGZsYWcgaXMKLSAgICAgICAgICAgb25seSBmb3IgdGhlIGxpbmtlci4gIElmIHRoaXMgdHlwZSBvZiBzZWN0aW9uIGFwcGVhcnMgaW4KLSAgICAgICAgICAgdGhlIGlucHV0IGZpbGUsIHRoZSBsaW5rZXIgbXVzdCBjb3B5IGl0IHRvIHRoZSBvdXRwdXQgZmlsZQotICAgICAgICAgICB3aXRob3V0IGNoYW5naW5nIHRoZSB2bWEgb3Igc2l6ZS4gIEZJWE1FOiBBbHRob3VnaCB0aGlzCi0gICAgICAgICAgIHdhcyBvcmlnaW5hbGx5IGludGVuZGVkIHRvIGJlIGdlbmVyYWwsIGl0IHJlYWxseSBpcyBDT0ZGCi0gICAgICAgICAgIHNwZWNpZmljIChhbmQgdGhlIGZsYWcgd2FzIHJlbmFtZWQgdG8gaW5kaWNhdGUgdGhpcykuICBJdAotICAgICAgICAgICBtaWdodCBiZSBjbGVhbmVyIHRvIGhhdmUgc29tZSBtb3JlIGdlbmVyYWwgbWVjaGFuaXNtIHRvCi0gICAgICAgICAgIGFsbG93IHRoZSBiYWNrIGVuZCB0byBjb250cm9sIHdoYXQgdGhlIGxpbmtlciBkb2VzIHdpdGgKLSAgICAgICAgICAgc2VjdGlvbnMuICovCi0jZGVmaW5lIFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZIDB4ODAwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvbW1vbiBzeW1ib2xzIChzeW1ib2xzIG1heSBiZSBkZWZpbmVkCi0gICAgICAgICAgIG11bHRpcGxlIHRpbWVzLCB0aGUgdmFsdWUgb2YgYSBzeW1ib2wgaXMgdGhlIGFtb3VudCBvZgotICAgICAgICAgICBzcGFjZSBpdCByZXF1aXJlcywgYW5kIHRoZSBsYXJnZXN0IHN5bWJvbCB2YWx1ZSBpcyB0aGUgb25lCi0gICAgICAgICAgIHVzZWQpLiAgTW9zdCB0YXJnZXRzIGhhdmUgZXhhY3RseSBvbmUgb2YgdGhlc2UgKHdoaWNoIHdlCi0gICAgICAgICAgIHRyYW5zbGF0ZSB0byBiZmRfY29tX3NlY3Rpb25fcHRyKSwgYnV0IEVDT0ZGIGhhcyB0d28uICovCi0jZGVmaW5lIFNFQ19JU19DT01NT04gMHg4MDAwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGNvbnRhaW5zIG9ubHkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRm9yCi0gICAgICAgICAgIGV4YW1wbGUsIHRoaXMgaXMgc2V0IGZvciBFTEYgLmRlYnVnIGFuZCAuc3RhYiBzZWN0aW9ucy4KLSAgICAgICAgICAgc3RyaXAgdGVzdHMgdGhpcyBmbGFnIHRvIHNlZSBpZiBhIHNlY3Rpb24gY2FuIGJlCi0gICAgICAgICAgIGRpc2NhcmRlZC4gKi8KLSNkZWZpbmUgU0VDX0RFQlVHR0lORyAweDEwMDAwCi0KLSAgICAgICAgIC8qIFRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24gYXJlIGhlbGQgaW4gbWVtb3J5IHBvaW50ZWQgdG8KLSAgICAgICAgICAgYnkgdGhlIGNvbnRlbnRzIGZpZWxkLiAgVGhpcyBpcyBjaGVja2VkIGJ5Ci0gICAgICAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cywgYW5kIHRoZSBkYXRhIGlzIHJldHJpZXZlZCBmcm9tCi0gICAgICAgICAgIG1lbW9yeSBpZiBhcHByb3ByaWF0ZS4gICovCi0jZGVmaW5lIFNFQ19JTl9NRU1PUlkgMHgyMDAwMAotCi0gICAgICAgICAvKiBUaGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uIGFyZSB0byBiZSBleGNsdWRlZCBieSB0aGUKLSAgICAgICAgICAgbGlua2VyIGZvciBleGVjdXRhYmxlIGFuZCBzaGFyZWQgb2JqZWN0cyB1bmxlc3MgdGhvc2UKLSAgICAgICAgICAgb2JqZWN0cyBhcmUgdG8gYmUgZnVydGhlciByZWxvY2F0ZWQuICAqLwotI2RlZmluZSBTRUNfRVhDTFVERSAweDQwMDAwCi0KLSAgICAgICAgLyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgdG8gYmUgc29ydGVkIGJ5IHRoZQotICAgICAgICAgIGJhc2VkIG9uIHRoZSBhZGRyZXNzIHNwZWNpZmllZCBpbiB0aGUgYXNzb2NpYXRlZCBzeW1ib2wKLSAgICAgICAgICB0YWJsZS4gICovCi0jZGVmaW5lIFNFQ19TT1JUX0VOVFJJRVMgMHg4MDAwMAotCi0gICAgICAgIC8qIFdoZW4gbGlua2luZywgZHVwbGljYXRlIHNlY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUgc2hvdWxkIGJlCi0gICAgICAgICAgZGlzY2FyZGVkLCByYXRoZXIgdGhhbiBiZWluZyBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIHNlY3Rpb24gYXMKLSAgICAgICAgICBpcyB1c3VhbGx5IGRvbmUuICBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IGNvbW1vbiBzeW1ib2xzIGFyZQotICAgICAgICAgIGhhbmRsZWQuICBTZWUgU0VDX0xJTktfRFVQTElDQVRFUyBiZWxvdy4gICovCi0jZGVmaW5lIFNFQ19MSU5LX09OQ0UgMHgxMDAwMDAKLQotICAgICAgICAvKiBJZiBTRUNfTElOS19PTkNFIGlzIHNldCwgdGhpcyBiaXRmaWVsZCBkZXNjcmliZXMgaG93IHRoZSBsaW5rZXIKLSAgICAgICAgICBzaG91bGQgaGFuZGxlIGR1cGxpY2F0ZSBzZWN0aW9ucy4gICovCi0jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVMgMHg2MDAwMDAKLQotICAgICAgICAvKiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgZHVwbGljYXRlCi0gICAgICAgICAgc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIHNob3VsZCBzaW1wbHkgYmUgZGlzY2FyZGVkLiAqLwotI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQgMHgwCi0KLSAgICAgICAgLyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IHRoZSBsaW5rZXIKLSAgICAgICAgICBzaG91bGQgd2FybiBpZiB0aGVyZSBhcmUgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucywgYWx0aG91Z2gKLSAgICAgICAgICBpdCBzaG91bGQgc3RpbGwgb25seSBsaW5rIG9uZSBjb3B5LiAgKi8KLSNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19PTkVfT05MWSAweDIwMDAwMAotCi0gICAgICAgIC8qIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0gICAgICAgICAgc2hvdWxkIHdhcm4gaWYgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucyBhcmUgYSBkaWZmZXJlbnQgc2l6ZS4gICovCi0jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFIDB4NDAwMDAwCi0KLSAgICAgICAgLyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IHRoZSBsaW5rZXIKLSAgICAgICAgICBzaG91bGQgd2FybiBpZiBhbnkgZHVwbGljYXRlIHNlY3Rpb25zIGNvbnRhaW4gZGlmZmVyZW50Ci0gICAgICAgICAgY29udGVudHMuICAqLwotI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfQ09OVEVOVFMgMHg2MDAwMDAKLQotICAgICAgICAvKiBUaGlzIHNlY3Rpb24gd2FzIGNyZWF0ZWQgYnkgdGhlIGxpbmtlciBhcyBwYXJ0IG9mIGR5bmFtaWMKLSAgICAgICAgICByZWxvY2F0aW9uIG9yIG90aGVyIGFyY2FuZSBwcm9jZXNzaW5nLiAgSXQgaXMgc2tpcHBlZCB3aGVuCi0gICAgICAgICAgZ29pbmcgdGhyb3VnaCB0aGUgZmlyc3QtcGFzcyBvdXRwdXQsIHRydXN0aW5nIHRoYXQgc29tZW9uZQotICAgICAgICAgIGVsc2UgdXAgdGhlIGxpbmUgd2lsbCB0YWtlIGNhcmUgb2YgaXQgbGF0ZXIuICAqLwotI2RlZmluZSBTRUNfTElOS0VSX0NSRUFURUQgMHg4MDAwMDAKLQotICAgICAgICAvKiBUaGlzIHNlY3Rpb24gc2hvdWxkIG5vdCBiZSBzdWJqZWN0IHRvIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0jZGVmaW5lIFNFQ19LRUVQIDB4MTAwMDAwMAotCi0gICAgICAgIC8qICBFbmQgb2Ygc2VjdGlvbiBmbGFncy4gICovCi0KLSAgICAgICAgLyogU29tZSBpbnRlcm5hbCBwYWNrZWQgYm9vbGVhbiBmaWVsZHMuICAqLwotCi0gICAgICAgIC8qIFNlZSB0aGUgdm1hIGZpZWxkLiAgKi8KLSAgICAgICB1bnNpZ25lZCBpbnQgdXNlcl9zZXRfdm1hIDogMTsKLQotICAgICAgICAvKiBXaGV0aGVyIHJlbG9jYXRpb25zIGhhdmUgYmVlbiBwcm9jZXNzZWQuICAqLwotICAgICAgIHVuc2lnbmVkIGludCByZWxvY19kb25lIDogMTsKLQotICAgICAgICAvKiBBIG1hcmsgZmxhZyB1c2VkIGJ5IHNvbWUgb2YgdGhlIGxpbmtlciBiYWNrZW5kcy4gICovCi0gICAgICAgdW5zaWduZWQgaW50IGxpbmtlcl9tYXJrIDogMTsKLQotICAgICAgICAvKiBBIG1hcmsgZmxhZyB1c2VkIGJ5IHNvbWUgbGlua2VyIGJhY2tlbmRzIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotICAgICAgIHVuc2lnbmVkIGludCBnY19tYXJrIDogMTsKLQotICAgICAgICAvKiBFbmQgb2YgaW50ZXJuYWwgcGFja2VkIGJvb2xlYW4gZmllbGRzLiAgKi8KLQotICAgICAgICAvKiAgVGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gLSB3aGVyZSBpdCB3aWxsIGJlCi0gICAgICAgICAgIGF0IHJ1biB0aW1lLiAgVGhlIHN5bWJvbHMgYXJlIHJlbG9jYXRlZCBhZ2FpbnN0IHRoaXMuICBUaGUKLSAgICAgICAgICAgdXNlcl9zZXRfdm1hIGZsYWcgaXMgbWFpbnRhaW5lZCBieSBiZmQ7IGlmIGl0J3Mgbm90IHNldCwgdGhlCi0gICAgICAgICAgIGJhY2tlbmQgY2FuIGFzc2lnbiBhZGRyZXNzZXMgKGZvciBleGFtcGxlLCBpbiA8PGEub3V0Pj4sIHdoZXJlCi0gICAgICAgICAgIHRoZSBkZWZhdWx0IGFkZHJlc3MgZm9yIDw8LmRhdGE+PiBpcyBkZXBlbmRlbnQgb24gdGhlIHNwZWNpZmljCi0gICAgICAgICAgIHRhcmdldCBhbmQgdmFyaW91cyBmbGFncykuICAqLwotCi0gICBiZmRfdm1hIHZtYTsKLQotICAgICAgICAvKiAgVGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiAtIHdoZXJlIGl0IHdvdWxkIGJlIGluIGEKLSAgICAgICAgICAgcm9tIGltYWdlOyByZWFsbHkgb25seSB1c2VkIGZvciB3cml0aW5nIHNlY3Rpb24gaGVhZGVyCi0gICAgICAgICAgIGluZm9ybWF0aW9uLiAqLwotCi0gICBiZmRfdm1hIGxtYTsKLQotICAgICAgICAgLyogVGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gaW4gYnl0ZXMsIGFzIGl0IHdpbGwgYmUgb3V0cHV0LgotICAgICAgICAgICBjb250YWlucyBhIHZhbHVlIGV2ZW4gaWYgdGhlIHNlY3Rpb24gaGFzIG5vIGNvbnRlbnRzIChlLmcuLCB0aGUKLSAgICAgICAgICAgc2l6ZSBvZiA8PC5ic3M+PikuIFRoaXMgd2lsbCBiZSBmaWxsZWQgaW4gYWZ0ZXIgcmVsb2NhdGlvbiAqLwotCi0gICBiZmRfc2l6ZV90eXBlIF9jb29rZWRfc2l6ZTsKLQotICAgICAgICAgLyogVGhlIG9yaWdpbmFsIHNpemUgb24gZGlzayBvZiB0aGUgc2VjdGlvbiwgaW4gYnl0ZXMuICBOb3JtYWxseSB0aGlzCi0gICAgICAgICAgIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBzaXplLCBidXQgaWYgc29tZSByZWxheGluZyBoYXMKLSAgICAgICAgICAgYmVlbiBkb25lLCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBiaWdnZXIuICAqLwotCi0gICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLQotICAgICAgICAgLyogSWYgdGhpcyBzZWN0aW9uIGlzIGdvaW5nIHRvIGJlIG91dHB1dCwgdGhlbiB0aGlzIHZhbHVlIGlzIHRoZQotICAgICAgICAgICBvZmZzZXQgaW50byB0aGUgb3V0cHV0IHNlY3Rpb24gb2YgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGlucHV0Ci0gICAgICAgICAgIHNlY3Rpb24uIEUuZy4sIGlmIHRoaXMgd2FzIGdvaW5nIHRvIHN0YXJ0IGF0IHRoZSAxMDB0aCBieXRlIGluCi0gICAgICAgICAgIHRoZSBvdXRwdXQgc2VjdGlvbiwgdGhpcyB2YWx1ZSB3b3VsZCBiZSAxMDAuICovCi0KLSAgIGJmZF92bWEgb3V0cHV0X29mZnNldDsKLQotICAgICAgICAgLyogVGhlIG91dHB1dCBzZWN0aW9uIHRocm91Z2ggd2hpY2ggdG8gbWFwIG9uIG91dHB1dC4gKi8KLQotICAgc3RydWN0IHNlYyAqb3V0cHV0X3NlY3Rpb247Ci0KLSAgICAgICAgIC8qIFRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb2YgdGhlIHNlY3Rpb24sIGFzIGFuIGV4cG9uZW50IG9mIDIgLQotICAgICAgICAgICBlLmcuLCAzIGFsaWducyB0byAyXjMgKG9yIDgpLiAqLwotCi0gICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOwotCi0gICAgICAgICAvKiBJZiBhbiBpbnB1dCBzZWN0aW9uLCBhIHBvaW50ZXIgdG8gYSB2ZWN0b3Igb2YgcmVsb2NhdGlvbgotICAgICAgICAgICByZWNvcmRzIGZvciB0aGUgZGF0YSBpbiB0aGlzIHNlY3Rpb24uICovCi0KLSAgIHN0cnVjdCByZWxvY19jYWNoZV9lbnRyeSAqcmVsb2NhdGlvbjsKLQotICAgICAgICAgLyogSWYgYW4gb3V0cHV0IHNlY3Rpb24sIGEgcG9pbnRlciB0byBhIHZlY3RvciBvZiBwb2ludGVycyB0bwotICAgICAgICAgICByZWxvY2F0aW9uIHJlY29yZHMgZm9yIHRoZSBkYXRhIGluIHRoaXMgc2VjdGlvbi4gKi8KLQotICAgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5ICoqb3JlbG9jYXRpb247Ci0KLSAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbiByZWNvcmRzIGluIG9uZSBvZiB0aGUgYWJvdmUgICovCi0KLSAgIHVuc2lnbmVkIHJlbG9jX2NvdW50OwotCi0gICAgICAgICAvKiBJbmZvcm1hdGlvbiBiZWxvdyBpcyBiYWNrIGVuZCBzcGVjaWZpYyAtIGFuZCBub3QgYWx3YXlzIHVzZWQKLSAgICAgICAgICAgb3IgdXBkYXRlZC4gICovCi0KLSAgICAgICAgIC8qIEZpbGUgcG9zaXRpb24gb2Ygc2VjdGlvbiBkYXRhICAgICovCi0KLSAgIGZpbGVfcHRyIGZpbGVwb3M7Ci0KLSAgICAgICAgIC8qIEZpbGUgcG9zaXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvICovCi0KLSAgIGZpbGVfcHRyIHJlbF9maWxlcG9zOwotCi0gICAgICAgICAvKiBGaWxlIHBvc2l0aW9uIG9mIGxpbmUgZGF0YSAgICAgICAqLwotCi0gICBmaWxlX3B0ciBsaW5lX2ZpbGVwb3M7Ci0KLSAgICAgICAgIC8qIFBvaW50ZXIgdG8gZGF0YSBmb3IgYXBwbGljYXRpb25zICovCi0KLSAgIFBUUiB1c2VyZGF0YTsKLQotICAgICAgICAgLyogSWYgdGhlIFNFQ19JTl9NRU1PUlkgZmxhZyBpcyBzZXQsIHRoaXMgcG9pbnRzIHRvIHRoZSBhY3R1YWwKLSAgICAgICAgICAgY29udGVudHMuICAqLwotICAgdW5zaWduZWQgY2hhciAqY29udGVudHM7Ci0KLSAgICAgICAgIC8qIEF0dGFjaGVkIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uICovCi0KLSAgIGFsZW50ICpsaW5lbm87Ci0KLSAgICAgICAgIC8qIE51bWJlciBvZiBsaW5lIG51bWJlciByZWNvcmRzICAgKi8KLQotICAgdW5zaWduZWQgaW50IGxpbmVub19jb3VudDsKLQotICAgICAgICAgLyogV2hlbiBhIHNlY3Rpb24gaXMgYmVpbmcgb3V0cHV0LCB0aGlzIHZhbHVlIGNoYW5nZXMgYXMgbW9yZQotICAgICAgICAgICBsaW5lbnVtYmVycyBhcmUgd3JpdHRlbiBvdXQgKi8KLQotICAgZmlsZV9wdHIgbW92aW5nX2xpbmVfZmlsZXBvczsKLQotICAgICAgICAgLyogV2hhdCB0aGUgc2VjdGlvbiBudW1iZXIgaXMgaW4gdGhlIHRhcmdldCB3b3JsZCAgKi8KLQotICAgaW50IHRhcmdldF9pbmRleDsKLQotICAgUFRSIHVzZWRfYnlfYmZkOwotCi0gICAgICAgICAvKiBJZiB0aGlzIGlzIGEgY29uc3RydWN0b3Igc2VjdGlvbiB0aGVuIGhlcmUgaXMgYSBsaXN0IG9mIHRoZQotICAgICAgICAgICByZWxvY2F0aW9ucyBjcmVhdGVkIHRvIHJlbG9jYXRlIGl0ZW1zIHdpdGhpbiBpdC4gKi8KLQotICAgc3RydWN0IHJlbGVudF9jaGFpbiAqY29uc3RydWN0b3JfY2hhaW47Ci0KLSAgICAgICAgIC8qIFRoZSBCRkQgd2hpY2ggb3ducyB0aGUgc2VjdGlvbi4gKi8KLQotICAgYmZkICpvd25lcjsKLQotICAgICAgICAgLyogQSBzeW1ib2wgd2hpY2ggcG9pbnRzIGF0IHRoaXMgc2VjdGlvbiBvbmx5ICovCi0gICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2w7Ci0gICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9sX3B0cl9wdHI7Ci0KLSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcl9oZWFkOwotICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX3RhaWw7Ci19IGFzZWN0aW9uIDsKLQotICAgICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2xvYmFsLCBhbmQgYXJlIG1hbmFnZWQgYnkgQkZELiAgVGhlIGFwcGxpY2F0aW9uCi0gICAgICAgYW5kIHRhcmdldCBiYWNrIGVuZCBhcmUgbm90IHBlcm1pdHRlZCB0byBjaGFuZ2UgdGhlIHZhbHVlcyBpbgotICAgICAgIHRoZXNlIHNlY3Rpb25zLiAgTmV3IGNvZGUgc2hvdWxkIHVzZSB0aGUgc2VjdGlvbl9wdHIgbWFjcm9zIHJhdGhlcgotICAgICAgIHRoYW4gcmVmZXJyaW5nIGRpcmVjdGx5IHRvIHRoZSBjb25zdCBzZWN0aW9ucy4gIFRoZSBjb25zdCBzZWN0aW9ucwotICAgICAgIG1heSBldmVudHVhbGx5IHZhbmlzaC4gICovCi0jZGVmaW5lIEJGRF9BQlNfU0VDVElPTl9OQU1FICIqQUJTKiIKLSNkZWZpbmUgQkZEX1VORF9TRUNUSU9OX05BTUUgIipVTkQqIgotI2RlZmluZSBCRkRfQ09NX1NFQ1RJT05fTkFNRSAiKkNPTSoiCi0jZGVmaW5lIEJGRF9JTkRfU0VDVElPTl9OQU1FICIqSU5EKiIKLQotICAgICAvKiB0aGUgYWJzb2x1dGUgc2VjdGlvbiAqLwotZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9hYnNfc2VjdGlvbjsKLSNkZWZpbmUgYmZkX2Fic19zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfYWJzX3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9pc19hYnNfc2VjdGlvbihzZWMpICgoc2VjKSA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQotICAgICAvKiBQb2ludGVyIHRvIHRoZSB1bmRlZmluZWQgc2VjdGlvbiAqLwotZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF91bmRfc2VjdGlvbjsKLSNkZWZpbmUgYmZkX3VuZF9zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfdW5kX3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9pc191bmRfc2VjdGlvbihzZWMpICgoc2VjKSA9PSBiZmRfdW5kX3NlY3Rpb25fcHRyKQotICAgICAvKiBQb2ludGVyIHRvIHRoZSBjb21tb24gc2VjdGlvbiAqLwotZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9jb21fc2VjdGlvbjsKLSNkZWZpbmUgYmZkX2NvbV9zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfY29tX3NlY3Rpb24pCi0gICAgIC8qIFBvaW50ZXIgdG8gdGhlIGluZGlyZWN0IHNlY3Rpb24gKi8KLWV4dGVybiBjb25zdCBhc2VjdGlvbiBiZmRfaW5kX3NlY3Rpb247Ci0jZGVmaW5lIGJmZF9pbmRfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2luZF9zZWN0aW9uKQotI2RlZmluZSBiZmRfaXNfaW5kX3NlY3Rpb24oc2VjKSAoKHNlYykgPT0gYmZkX2luZF9zZWN0aW9uX3B0cikKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfYWJzX3N5bWJvbDsKLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICogY29uc3QgYmZkX2NvbV9zeW1ib2w7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF91bmRfc3ltYm9sOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfaW5kX3N5bWJvbDsKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jKHNlY3Rpb24pIFwKLSAgICAgKHNlY3Rpb24tPnJlbG9jX2RvbmUgPyAoYWJvcnQoKSwxKTogKHNlY3Rpb24pLT5fcmF3X3NpemUpCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX2FmdGVyX3JlbG9jKHNlY3Rpb24pIFwKLSAgICAgKChzZWN0aW9uLT5yZWxvY19kb25lKSA/IChzZWN0aW9uKS0+X2Nvb2tlZF9zaXplOiAoYWJvcnQoKSwxKSkKLWFzZWN0aW9uICoKLWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqbmFtZSkpOwotCi1hc2VjdGlvbiAqCi1iZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKSk7Ci0KLWFzZWN0aW9uICoKLWJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqbmFtZSkpOwotCi1hc2VjdGlvbiAqCi1iZmRfbWFrZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICpuYW1lKSk7Ci0KLWJvb2xlYW4gCi1iZmRfc2V0X3NlY3Rpb25fZmxhZ3MgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBmbGFnd29yZCBmbGFncykpOwotCi12b2lkIAotYmZkX21hcF9vdmVyX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICB2b2lkICgqZnVuYykoYmZkICphYmZkLAotICAgIGFzZWN0aW9uICpzZWN0LAotICAgIFBUUiBvYmopLAotICAgIFBUUiBvYmopKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfc2VjdGlvbl9zaXplIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYmZkX3NpemVfdHlwZSB2YWwpKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cwotIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLSAgICBQVFIgZGF0YSwKLSAgICBmaWxlX3B0ciBvZmZzZXQsCi0gICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotCi1ib29sZWFuIAotYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIGxvY2F0aW9uLAotICAgIGZpbGVfcHRyIG9mZnNldCwgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotCi1ib29sZWFuIAotYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgUEFSQU1TICgoYmZkICppYmZkLCBhc2VjdGlvbiAqaXNlYywgYmZkICpvYmZkLCBhc2VjdGlvbiAqb3NlYykpOwotCi0jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikgXAotICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhLCBcCi0gICAgICAgICAgICAgICAoaWJmZCwgaXNlY3Rpb24sIG9iZmQsIG9zZWN0aW9uKSkKLXZvaWQgCi1fYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQKLSBQQVJBTVMgKChhc2VjdGlvbiAqc2VjdGlvbikpOwotCi1lbnVtIGJmZF9hcmNoaXRlY3R1cmUgCi17Ci0gIGJmZF9hcmNoX3Vua25vd24sICAgIC8qIEZpbGUgYXJjaCBub3Qga25vd24gKi8KLSAgYmZkX2FyY2hfb2JzY3VyZSwgICAgLyogQXJjaCBrbm93biwgbm90IG9uZSBvZiB0aGVzZSAqLwotICBiZmRfYXJjaF9tNjhrLCAgICAgICAvKiBNb3Rvcm9sYSA2OHh4eCAqLwotI2RlZmluZSBiZmRfbWFjaF9tNjgwMDAgMQotI2RlZmluZSBiZmRfbWFjaF9tNjgwMDggMgotI2RlZmluZSBiZmRfbWFjaF9tNjgwMTAgMwotI2RlZmluZSBiZmRfbWFjaF9tNjgwMjAgNAotI2RlZmluZSBiZmRfbWFjaF9tNjgwMzAgNQotI2RlZmluZSBiZmRfbWFjaF9tNjgwNDAgNgotI2RlZmluZSBiZmRfbWFjaF9tNjgwNjAgNwotI2RlZmluZSBiZmRfbWFjaF9jcHUzMiAgOAotICBiZmRfYXJjaF92YXgsICAgICAgICAvKiBERUMgVmF4ICovICAgCi0gIGJmZF9hcmNoX2k5NjAsICAgICAgIC8qIEludGVsIDk2MCAqLwotICAgICAvKiBUaGUgb3JkZXIgb2YgdGhlIGZvbGxvd2luZyBpcyBpbXBvcnRhbnQuCi0gICAgICAgbG93ZXIgbnVtYmVyIGluZGljYXRlcyBhIG1hY2hpbmUgdHlwZSB0aGF0IAotICAgICAgIG9ubHkgYWNjZXB0cyBhIHN1YnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb25zCi0gICAgICAgYXZhaWxhYmxlIHRvIG1hY2hpbmVzIHdpdGggaGlnaGVyIG51bWJlcnMuCi0gICAgICAgVGhlIGV4Y2VwdGlvbiBpcyB0aGUgImNhIiwgd2hpY2ggaXMKLSAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXIgbWFjaGluZXMgZXhjZXB0IAotICAgICAgICJjb3JlIi4gKi8KLQotI2RlZmluZSBiZmRfbWFjaF9pOTYwX2NvcmUgICAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfa2Ffc2EgICAgIDIKLSNkZWZpbmUgYmZkX21hY2hfaTk2MF9rYl9zYiAgICAgMwotI2RlZmluZSBiZmRfbWFjaF9pOTYwX21jICAgICAgICA0Ci0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfeGEgICAgICAgIDUKLSNkZWZpbmUgYmZkX21hY2hfaTk2MF9jYSAgICAgICAgNgotI2RlZmluZSBiZmRfbWFjaF9pOTYwX2p4ICAgICAgICA3Ci0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfaHggICAgICAgIDgKLQotICBiZmRfYXJjaF9hMjlrLCAgICAgICAvKiBBTUQgMjkwMDAgKi8KLSAgYmZkX2FyY2hfc3BhcmMsICAgICAgLyogU1BBUkMgKi8KLSNkZWZpbmUgYmZkX21hY2hfc3BhcmMgICAgICAgICAgICAgICAgIDEKLSAvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHY4cGx1cyBhbmQgdjkgaXMgdGhhdCB2OSBpcyBhIHRydWUgNjQgYml0IGVudi4gICovCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0ICAgICAgICAyCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZSAgICAgICAzCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyAgICAgICAgICA0Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EgICAgICAgICA1ICAvKiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICovCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZSAgICA2Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5ICAgICAgICAgICAgICA3Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5YSAgICAgICAgICAgICA4ICAvKiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICovCi0gLyogTm9uemVybyBpZiBNQUNIIGhhcyB0aGUgdjkgaW5zdHJ1Y3Rpb24gc2V0LiAgKi8KLSNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjlfcChtYWNoKSBcCi0gICgobWFjaCkgPj0gYmZkX21hY2hfc3BhcmNfdjhwbHVzICYmIChtYWNoKSA8PSBiZmRfbWFjaF9zcGFyY192OWEpCi0gIGJmZF9hcmNoX21pcHMsICAgICAgIC8qIE1JUFMgUnh4eHggKi8KLSNkZWZpbmUgYmZkX21hY2hfbWlwczMwMDAgICAgICAgICAgICAgIDMwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczM5MDAgICAgICAgICAgICAgIDM5MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQwMDAgICAgICAgICAgICAgIDQwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQwMTAgICAgICAgICAgICAgIDQwMTAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQxMDAgICAgICAgICAgICAgIDQxMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQxMTEgICAgICAgICAgICAgIDQxMTEKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQzMDAgICAgICAgICAgICAgIDQzMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ0MDAgICAgICAgICAgICAgIDQ0MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ2MDAgICAgICAgICAgICAgIDQ2MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ2NTAgICAgICAgICAgICAgIDQ2NTAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczUwMDAgICAgICAgICAgICAgIDUwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczYwMDAgICAgICAgICAgICAgIDYwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczgwMDAgICAgICAgICAgICAgIDgwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczEwMDAwICAgICAgICAgICAgIDEwMDAwCi0jZGVmaW5lIGJmZF9tYWNoX21pcHMxNiAgICAgICAgICAgICAgICAxNgotICBiZmRfYXJjaF9pMzg2LCAgICAgICAvKiBJbnRlbCAzODYgKi8KLSNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pMzg2IDAKLSNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pODA4NiAxCi0jZGVmaW5lIGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXggMgotICBiZmRfYXJjaF93ZTMyaywgICAgICAvKiBBVCZUIFdFMzJ4eHggKi8KLSAgYmZkX2FyY2hfdGFob2UsICAgICAgLyogQ0NJL0hhcnJpcyBUYWhvZSAqLwotICBiZmRfYXJjaF9pODYwLCAgICAgICAvKiBJbnRlbCA4NjAgKi8KLSAgYmZkX2FyY2hfcm9tcCwgICAgICAgLyogSUJNIFJPTVAgUEMvUlQgKi8KLSAgYmZkX2FyY2hfYWxsaWFudCwgICAgLyogQWxsaWFudCAqLwotICBiZmRfYXJjaF9jb252ZXgsICAgICAvKiBDb252ZXggKi8KLSAgYmZkX2FyY2hfbTg4aywgICAgICAgLyogTW90b3JvbGEgODh4eHggKi8KLSAgYmZkX2FyY2hfcHlyYW1pZCwgICAgLyogUHlyYW1pZCBUZWNobm9sb2d5ICovCi0gIGJmZF9hcmNoX2g4MzAwLCAgICAgIC8qIEhpdGFjaGkgSDgvMzAwICovCi0jZGVmaW5lIGJmZF9tYWNoX2g4MzAwICAgMQotI2RlZmluZSBiZmRfbWFjaF9oODMwMGggIDIKLSNkZWZpbmUgYmZkX21hY2hfaDgzMDBzICAzCi0gIGJmZF9hcmNoX3Bvd2VycGMsICAgIC8qIFBvd2VyUEMgKi8KLSAgYmZkX2FyY2hfcnM2MDAwLCAgICAgLyogSUJNIFJTLzYwMDAgKi8KLSAgYmZkX2FyY2hfaHBwYSwgICAgICAgLyogSFAgUEEgUklTQyAqLwotICBiZmRfYXJjaF9kMTB2LCAgICAgICAvKiBNaXRzdWJpc2hpIEQxMFYgKi8KLSAgYmZkX2FyY2hfZDMwdiwgICAgICAgLyogTWl0c3ViaXNoaSBEMzBWICovCi0gIGJmZF9hcmNoX3o4aywgICAgICAgIC8qIFppbG9nIFo4MDAwICovCi0jZGVmaW5lIGJmZF9tYWNoX3o4MDAxICAgICAgICAgMQotI2RlZmluZSBiZmRfbWFjaF96ODAwMiAgICAgICAgIDIKLSAgYmZkX2FyY2hfaDg1MDAsICAgICAgLyogSGl0YWNoaSBIOC81MDAgKi8KLSAgYmZkX2FyY2hfc2gsICAgICAgICAgLyogSGl0YWNoaSBTSCAqLwotI2RlZmluZSBiZmRfbWFjaF9zaCAgICAgICAgICAgIDAKLSNkZWZpbmUgYmZkX21hY2hfc2gzICAgICAgICAweDMwCi0jZGVmaW5lIGJmZF9tYWNoX3NoM2UgICAgICAgMHgzZQotICBiZmRfYXJjaF9hbHBoYSwgICAgICAvKiBEZWMgQWxwaGEgKi8KLSNkZWZpbmUgYmZkX21hY2hfYWxwaGFfZXY0ICAweDEwCi0jZGVmaW5lIGJmZF9tYWNoX2FscGhhX2V2NSAgMHgyMAotI2RlZmluZSBiZmRfbWFjaF9hbHBoYV9ldjYgIDB4MzAKLSAgYmZkX2FyY2hfYXJtLCAgICAgICAgLyogQWR2YW5jZWQgUmlzYyBNYWNoaW5lcyBBUk0gKi8KLSNkZWZpbmUgYmZkX21hY2hfYXJtXzIgICAgICAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX2FybV8yYSAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIGJmZF9tYWNoX2FybV8zICAgICAgICAgMwotI2RlZmluZSBiZmRfbWFjaF9hcm1fM00gICAgICAgIDQKLSNkZWZpbmUgYmZkX21hY2hfYXJtXzQgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgYmZkX21hY2hfYXJtXzRUICAgICAgICA2Ci0gIGJmZF9hcmNoX25zMzJrLCAgICAgIC8qIE5hdGlvbmFsIFNlbWljb25kdWN0b3JzIG5zMzIwMDAgKi8KLSAgYmZkX2FyY2hfdzY1LCAgICAgICAgLyogV0RDIDY1ODE2ICovCi0gIGJmZF9hcmNoX3RpYzMwLCAgICAgIC8qIFRleGFzIEluc3RydW1lbnRzIFRNUzMyMEMzMCAqLwotICBiZmRfYXJjaF90aWM4MCwgICAgICAvKiBUSSBUTVMzMjBjODAgKE1WUCkgKi8KLSAgYmZkX2FyY2hfdjg1MCwgICAgICAgLyogTkVDIFY4NTAgKi8KLSNkZWZpbmUgYmZkX21hY2hfdjg1MCAgICAgICAgICAwCi0jZGVmaW5lIGJmZF9tYWNoX3Y4NTBlICAgICAgICAgJ0UnCi0jZGVmaW5lIGJmZF9tYWNoX3Y4NTBlYSAgICAgICAgJ0EnCi0gIGJmZF9hcmNoX2FyYywgICAgICAgIC8qIEFyZ29uYXV0IFJJU0MgQ29yZSAqLwotI2RlZmluZSBiZmRfbWFjaF9hcmNfYmFzZSAwCi0gIGJmZF9hcmNoX20zMnIsICAgICAgIC8qIE1pdHN1YmlzaGkgTTMyUi9EICovCi0jZGVmaW5lIGJmZF9tYWNoX20zMnIgICAgICAgICAgMCAgLyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KLSAgYmZkX2FyY2hfbW4xMDIwMCwgICAgLyogTWF0c3VzaGl0YSBNTjEwMjAwICovCi0gIGJmZF9hcmNoX21uMTAzMDAsICAgIC8qIE1hdHN1c2hpdGEgTU4xMDMwMCAqLwotI2RlZmluZSBiZmRfbWFjaF9tbjEwMzAwICAgICAgICAgICAgICAgMzAwCi0gIGJmZF9hcmNoX2ZyMzAsCi0jZGVmaW5lIGJmZF9tYWNoX2ZyMzAgICAgICAgICAgMHg0NjUyMzMzMAotICBiZmRfYXJjaF9tY29yZSwKLSAgYmZkX2FyY2hfbGFzdAotICB9OwotCi10eXBlZGVmIHN0cnVjdCBiZmRfYXJjaF9pbmZvIAotewotICBpbnQgYml0c19wZXJfd29yZDsKLSAgaW50IGJpdHNfcGVyX2FkZHJlc3M7Ci0gIGludCBiaXRzX3Blcl9ieXRlOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgdW5zaWduZWQgbG9uZyBtYWNoOwotICBjb25zdCBjaGFyICphcmNoX25hbWU7Ci0gIGNvbnN0IGNoYXIgKnByaW50YWJsZV9uYW1lOwotICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9hbGlnbl9wb3dlcjsKLSAgLyogdHJ1ZSBpZiB0aGlzIGlzIHRoZSBkZWZhdWx0IG1hY2hpbmUgZm9yIHRoZSBhcmNoaXRlY3R1cmUgKi8KLSAgYm9vbGVhbiB0aGVfZGVmYXVsdDsgCi0gIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICogKCpjb21wYXRpYmxlKQotICAgICAgIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICphLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICpiKSk7Ci0KLSAgYm9vbGVhbiAoKnNjYW4pIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICosIGNvbnN0IGNoYXIgKikpOwotCi0gIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICpuZXh0OwotfSBiZmRfYXJjaF9pbmZvX3R5cGU7Ci1jb25zdCBjaGFyICoKLWJmZF9wcmludGFibGVfbmFtZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWJmZF9zY2FuX2FyY2ggUEFSQU1TICgoY29uc3QgY2hhciAqc3RyaW5nKSk7Ci0KLWNvbnN0IGNoYXIgKioKLWJmZF9hcmNoX2xpc3QgUEFSQU1TICgodm9pZCkpOwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2FyY2hfZ2V0X2NvbXBhdGlibGUgUEFSQU1TICgoCi0gICAgY29uc3QgYmZkICphYmZkLAotICAgIGNvbnN0IGJmZCAqYmJmZCkpOwotCi12b2lkIAotYmZkX3NldF9hcmNoX2luZm8gUEFSQU1TICgoYmZkICphYmZkLCBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyZykpOwotCi1lbnVtIGJmZF9hcmNoaXRlY3R1cmUgCi1iZmRfZ2V0X2FyY2ggUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXVuc2lnbmVkIGxvbmcgCi1iZmRfZ2V0X21hY2ggUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXVuc2lnbmVkIGludCAKLWJmZF9hcmNoX2JpdHNfcGVyX2J5dGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXVuc2lnbmVkIGludCAKLWJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIAotYmZkX2dldF9hcmNoX2luZm8gUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1iZmRfbG9va3VwX2FyY2gKLSBQQVJBTVMgKChlbnVtIGJmZF9hcmNoaXRlY3R1cmUKLSAgICBhcmNoLAotICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZSkpOwotCi1jb25zdCBjaGFyICoKLWJmZF9wcmludGFibGVfYXJjaF9tYWNoCi0gUEFSQU1TICgoZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsIHVuc2lnbmVkIGxvbmcgbWFjaGluZSkpOwotCi10eXBlZGVmIGVudW0gYmZkX3JlbG9jX3N0YXR1cwotewotICAgICAgICAvKiBObyBlcnJvcnMgZGV0ZWN0ZWQgKi8KLSAgYmZkX3JlbG9jX29rLAotCi0gICAgICAgIC8qIFRoZSByZWxvY2F0aW9uIHdhcyBwZXJmb3JtZWQsIGJ1dCB0aGVyZSB3YXMgYW4gb3ZlcmZsb3cuICovCi0gIGJmZF9yZWxvY19vdmVyZmxvdywKLQotICAgICAgICAvKiBUaGUgYWRkcmVzcyB0byByZWxvY2F0ZSB3YXMgbm90IHdpdGhpbiB0aGUgc2VjdGlvbiBzdXBwbGllZC4gKi8KLSAgYmZkX3JlbG9jX291dG9mcmFuZ2UsCi0KLSAgICAgICAgLyogVXNlZCBieSBzcGVjaWFsIGZ1bmN0aW9ucyAqLwotICBiZmRfcmVsb2NfY29udGludWUsCi0KLSAgICAgICAgLyogVW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBzaXplIHJlcXVlc3RlZC4gKi8KLSAgYmZkX3JlbG9jX25vdHN1cHBvcnRlZCwKLQotICAgICAgICAvKiBVbnVzZWQgKi8KLSAgYmZkX3JlbG9jX290aGVyLAotCi0gICAgICAgIC8qIFRoZSBzeW1ib2wgdG8gcmVsb2NhdGUgYWdhaW5zdCB3YXMgdW5kZWZpbmVkLiAqLwotICBiZmRfcmVsb2NfdW5kZWZpbmVkLAotCi0gICAgICAgIC8qIFRoZSByZWxvY2F0aW9uIHdhcyBwZXJmb3JtZWQsIGJ1dCBtYXkgbm90IGJlIG9rIC0gcHJlc2VudGx5Ci0gICAgICAgICAgZ2VuZXJhdGVkIG9ubHkgd2hlbiBsaW5raW5nIGk5NjAgY29mZiBmaWxlcyB3aXRoIGk5NjAgYi5vdXQKLSAgICAgICAgICBzeW1ib2xzLiAgSWYgdGhpcyB0eXBlIGlzIHJldHVybmVkLCB0aGUgZXJyb3JfbWVzc2FnZSBhcmd1bWVudAotICAgICAgICAgIHRvIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gd2lsbCBiZSBzZXQuICAqLwotICBiZmRfcmVsb2NfZGFuZ2Vyb3VzCi0gfQotIGJmZF9yZWxvY19zdGF0dXNfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCByZWxvY19jYWNoZV9lbnRyeQotewotICAgICAgICAvKiBBIHBvaW50ZXIgaW50byB0aGUgY2Fub25pY2FsIHRhYmxlIG9mIHBvaW50ZXJzICAqLwotICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltX3B0cl9wdHI7Ci0KLSAgICAgICAgLyogb2Zmc2V0IGluIHNlY3Rpb24gKi8KLSAgYmZkX3NpemVfdHlwZSBhZGRyZXNzOwotCi0gICAgICAgIC8qIGFkZGVuZCBmb3IgcmVsb2NhdGlvbiB2YWx1ZSAqLwotICBiZmRfdm1hIGFkZGVuZDsKLQotICAgICAgICAvKiBQb2ludGVyIHRvIGhvdyB0byBwZXJmb3JtIHRoZSByZXF1aXJlZCByZWxvY2F0aW9uICovCi0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi19IGFyZWxlbnQ7Ci1lbnVtIGNvbXBsYWluX292ZXJmbG93Ci17Ci0gICAgICAgIC8qIERvIG5vdCBjb21wbGFpbiBvbiBvdmVyZmxvdy4gKi8KLSAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLQotICAgICAgICAvKiBDb21wbGFpbiBpZiB0aGUgYml0ZmllbGQgb3ZlcmZsb3dzLCB3aGV0aGVyIGl0IGlzIGNvbnNpZGVyZWQKLSAgICAgICAgICBhcyBzaWduZWQgb3IgdW5zaWduZWQuICovCi0gIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCi0gICAgICAgIC8qIENvbXBsYWluIGlmIHRoZSB2YWx1ZSBvdmVyZmxvd3Mgd2hlbiBjb25zaWRlcmVkIGFzIHNpZ25lZAotICAgICAgICAgIG51bWJlci4gKi8KLSAgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCi0gICAgICAgIC8qIENvbXBsYWluIGlmIHRoZSB2YWx1ZSBvdmVyZmxvd3Mgd2hlbiBjb25zaWRlcmVkIGFzIGFuCi0gICAgICAgICAgdW5zaWduZWQgbnVtYmVyLiAqLwotICBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZAotfTsKLQotc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdAotewotICAgICAgICAvKiAgVGhlIHR5cGUgZmllbGQgaGFzIG1haW5seSBhIGRvY3VtZW50YXJ5IHVzZSAtIHRoZSBiYWNrIGVuZCBjYW4KLSAgICAgICAgICAgZG8gd2hhdCBpdCB3YW50cyB3aXRoIGl0LCB0aG91Z2ggbm9ybWFsbHkgdGhlIGJhY2sgZW5kJ3MKLSAgICAgICAgICAgZXh0ZXJuYWwgaWRlYSBvZiB3aGF0IGEgcmVsb2MgbnVtYmVyIGlzIHN0b3JlZAotICAgICAgICAgICBpbiB0aGlzIGZpZWxkLiBGb3IgZXhhbXBsZSwgYSBQQyByZWxhdGl2ZSB3b3JkIHJlbG9jYXRpb24KLSAgICAgICAgICAgaW4gYSBjb2ZmIGVudmlyb25tZW50IGhhcyB0aGUgdHlwZSAwMjMgLSBiZWNhdXNlIHRoYXQncwotICAgICAgICAgICB3aGF0IHRoZSBvdXRzaWRlIHdvcmxkIGNhbGxzIGEgUl9QQ1JXT1JEIHJlbG9jLiAqLwotICB1bnNpZ25lZCBpbnQgdHlwZTsKLQotICAgICAgICAvKiAgVGhlIHZhbHVlIHRoZSBmaW5hbCByZWxvY2F0aW9uIGlzIHNoaWZ0ZWQgcmlnaHQgYnkuIFRoaXMgZHJvcHMKLSAgICAgICAgICAgdW53YW50ZWQgZGF0YSBmcm9tIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQ7Ci0KLSAgICAgICAgLyogIFRoZSBzaXplIG9mIHRoZSBpdGVtIHRvIGJlIHJlbG9jYXRlZC4gIFRoaXMgaXMgKm5vdCogYQotICAgICAgICAgICBwb3dlci1vZi10d28gbWVhc3VyZS4gIFRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9wZXJhdGVkCi0gICAgICAgICAgIG9uIGJ5IGEgdHlwZSBvZiByZWxvY2F0aW9uLCB1c2UgYmZkX2dldF9yZWxvY19zaXplLiAgKi8KLSAgaW50IHNpemU7Ci0KLSAgICAgICAgLyogIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaXRlbSB0byBiZSByZWxvY2F0ZWQuICBUaGlzIGlzIHVzZWQKLSAgICAgICAgICAgd2hlbiBkb2luZyBvdmVyZmxvdyBjaGVja2luZy4gICovCi0gIHVuc2lnbmVkIGludCBiaXRzaXplOwotCi0gICAgICAgIC8qICBOb3RlcyB0aGF0IHRoZSByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUKLSAgICAgICAgICAgZGF0YSBzZWN0aW9uIG9mIHRoZSBhZGRlbmQuIFRoZSByZWxvY2F0aW9uIGZ1bmN0aW9uIHdpbGwKLSAgICAgICAgICAgc3VidHJhY3QgZnJvbSB0aGUgcmVsb2NhdGlvbiB2YWx1ZSB0aGUgYWRkcmVzcyBvZiB0aGUgbG9jYXRpb24KLSAgICAgICAgICAgYmVpbmcgcmVsb2NhdGVkLiAqLwotICBib29sZWFuIHBjX3JlbGF0aXZlOwotCi0gICAgICAgIC8qICBUaGUgYml0IHBvc2l0aW9uIG9mIHRoZSByZWxvYyB2YWx1ZSBpbiB0aGUgZGVzdGluYXRpb24uCi0gICAgICAgICAgIFRoZSByZWxvY2F0ZWQgdmFsdWUgaXMgbGVmdCBzaGlmdGVkIGJ5IHRoaXMgYW1vdW50LiAqLwotICB1bnNpZ25lZCBpbnQgYml0cG9zOwotCi0gICAgICAgIC8qIFdoYXQgdHlwZSBvZiBvdmVyZmxvdyBlcnJvciBzaG91bGQgYmUgY2hlY2tlZCBmb3Igd2hlbgotICAgICAgICAgIHJlbG9jYXRpbmcuICovCi0gIGVudW0gY29tcGxhaW5fb3ZlcmZsb3cgY29tcGxhaW5fb25fb3ZlcmZsb3c7Ci0KLSAgICAgICAgLyogSWYgdGhpcyBmaWVsZCBpcyBub24gbnVsbCwgdGhlbiB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gaXMKLSAgICAgICAgICBjYWxsZWQgcmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBmdW5jdGlvbi4gVGhpcyBhbGxvd3MgcmVhbGx5Ci0gICAgICAgICAgc3RyYW5nZSByZWxvY2F0aW9uIG1ldGhvZHMgdG8gYmUgYWNjb21vZGF0ZWQgKGUuZy4sIGk5NjAgY2FsbGoKLSAgICAgICAgICBpbnN0cnVjdGlvbnMpLiAqLwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgKCpzcGVjaWFsX2Z1bmN0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUUiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkICpvdXRwdXRfYmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotCi0gICAgICAgIC8qIFRoZSB0ZXh0dWFsIG5hbWUgb2YgdGhlIHJlbG9jYXRpb24gdHlwZS4gKi8KLSAgY2hhciAqbmFtZTsKLQotICAgICAgICAvKiBXaGVuIHBlcmZvcm1pbmcgYSBwYXJ0aWFsIGxpbmssIHNvbWUgZm9ybWF0cyBtdXN0IG1vZGlmeSB0aGUKLSAgICAgICAgICByZWxvY2F0aW9ucyByYXRoZXIgdGhhbiB0aGUgZGF0YSAtIHRoaXMgZmxhZyBzaWduYWxzIHRoaXMuKi8KLSAgYm9vbGVhbiBwYXJ0aWFsX2lucGxhY2U7Ci0KLSAgICAgICAgLyogVGhlIHNyY19tYXNrIHNlbGVjdHMgd2hpY2ggcGFydHMgb2YgdGhlIHJlYWQgaW4gZGF0YQotICAgICAgICAgIGFyZSB0byBiZSB1c2VkIGluIHRoZSByZWxvY2F0aW9uIHN1bS4gIEUuZy4sIGlmIHRoaXMgd2FzIGFuIDggYml0Ci0gICAgICAgICAgYml0IG9mIGRhdGEgd2hpY2ggd2UgcmVhZCBhbmQgcmVsb2NhdGVkLCB0aGlzIHdvdWxkIGJlCi0gICAgICAgICAgMHgwMDAwMDBmZi4gV2hlbiB3ZSBoYXZlIHJlbG9jcyB3aGljaCBoYXZlIGFuIGFkZGVuZCwgc3VjaCBhcwotICAgICAgICAgIHN1bjQgZXh0ZW5kZWQgcmVsb2NzLCB0aGUgdmFsdWUgaW4gdGhlIG9mZnNldCBwYXJ0IG9mIGEKLSAgICAgICAgICByZWxvY2F0aW5nIGZpZWxkIGlzIGdhcmJhZ2Ugc28gd2UgbmV2ZXIgdXNlIGl0LiBJbiB0aGlzIGNhc2UKLSAgICAgICAgICB0aGUgbWFzayB3b3VsZCBiZSAweDAwMDAwMDAwLiAqLwotICBiZmRfdm1hIHNyY19tYXNrOwotCi0gICAgICAgIC8qIFRoZSBkc3RfbWFzayBzZWxlY3RzIHdoaWNoIHBhcnRzIG9mIHRoZSBpbnN0cnVjdGlvbiBhcmUgcmVwbGFjZWQKLSAgICAgICAgICBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gSW4gbW9zdCBjYXNlcyBzcmNfbWFzayA9PSBkc3RfbWFzaywKLSAgICAgICAgICBleGNlcHQgaW4gdGhlIGFib3ZlIHNwZWNpYWwgY2FzZSwgd2hlcmUgZHN0X21hc2sgd291bGQgYmUKLSAgICAgICAgICAweDAwMDAwMGZmLCBhbmQgc3JjX21hc2sgd291bGQgYmUgMHgwMDAwMDAwMC4gICAqLwotICBiZmRfdm1hIGRzdF9tYXNrOwotCi0gICAgICAgIC8qIFdoZW4gc29tZSBmb3JtYXRzIGNyZWF0ZSBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbnMsIHRoZXkgbGVhdmUKLSAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBjIG9mIHRoZSBwbGFjZSBiZWluZyByZWxvY2F0ZWQgaW4gdGhlIG9mZnNldAotICAgICAgICAgIHNsb3Qgb2YgdGhlIGluc3RydWN0aW9uLCBzbyB0aGF0IGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiBjYW4KLSAgICAgICAgICBiZSBtYWRlIGp1c3QgYnkgYWRkaW5nIGluIGFuIG9yZGluYXJ5IG9mZnNldCAoZS5nLiwgc3VuMyBhLm91dCkuCi0gICAgICAgICAgU29tZSBmb3JtYXRzIGxlYXZlIHRoZSBkaXNwbGFjZW1lbnQgcGFydCBvZiBhbiBpbnN0cnVjdGlvbgotICAgICAgICAgIGVtcHR5IChlLmcuLCBtODhrIGJjcyk7IHRoaXMgZmxhZyBzaWduYWxzIHRoZSBmYWN0LiovCi0gIGJvb2xlYW4gcGNyZWxfb2Zmc2V0OwotCi19OwotI2RlZmluZSBIT1dUTyhDLCBSLFMsQiwgUCwgQkksIE8sIFNGLCBOQU1FLCBJTlBMQUNFLCBNQVNLU1JDLCBNQVNLRFNULCBQQykgXAotICB7KHVuc2lnbmVkKUMsUixTLEIsIFAsIEJJLCBPLFNGLE5BTUUsSU5QTEFDRSxNQVNLU1JDLE1BU0tEU1QsUEN9Ci0jZGVmaW5lIE5FV0hPV1RPKCBGVU5DVElPTiwgTkFNRSxTSVpFLFJFTCxJTikgSE9XVE8oMCwwLFNJWkUsMCxSRUwsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LEZVTkNUSU9OLCBOQU1FLGZhbHNlLDAsMCxJTikKLQotI2RlZmluZSBIT1dUT19QUkVQQVJFKHJlbG9jYXRpb24sIHN5bWJvbCkgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKHN5bWJvbCAhPSAoYXN5bWJvbCAqKU5VTEwpIHsgICAgICAgICAgICAgXAotICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpIHsgXAotICAgICAgcmVsb2NhdGlvbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7ICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotdW5zaWduZWQgaW50IAotYmZkX2dldF9yZWxvY19zaXplICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICopKTsKLQotdHlwZWRlZiBzdHJ1Y3QgcmVsZW50X2NoYWluIHsKLSAgYXJlbGVudCByZWxlbnQ7Ci0gIHN0cnVjdCAgIHJlbGVudF9jaGFpbiAqbmV4dDsKLX0gYXJlbGVudF9jaGFpbjsKLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotCi1iZmRfY2hlY2tfb3ZlcmZsb3cKLSBQQVJBTVMgKChlbnVtIGNvbXBsYWluX292ZXJmbG93IGhvdywKLSAgICB1bnNpZ25lZCBpbnQgYml0c2l6ZSwKLSAgICB1bnNpZ25lZCBpbnQgcmlnaHRzaGlmdCwKLSAgICB1bnNpZ25lZCBpbnQgYWRkcnNpemUsCi0gICAgYmZkX3ZtYSByZWxvY2F0aW9uKSk7Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotCi1iZmRfcGVyZm9ybV9yZWxvY2F0aW9uCi0gUEFSQU1TICgoYmZkICphYmZkLAotICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAotICAgIFBUUiBkYXRhLAotICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotICAgIGJmZCAqb3V0cHV0X2JmZCwKLSAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLQotYmZkX2luc3RhbGxfcmVsb2NhdGlvbgotIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICBQVFIgZGF0YSwgYmZkX3ZtYSBkYXRhX3N0YXJ0LAotICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlKSk7Ci0KLWVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCB7Ci0gIF9kdW1teV9maXJzdF9iZmRfcmVsb2NfY29kZV9yZWFsLAotCi0KLS8qIEJhc2ljIGFic29sdXRlIHJlbG9jYXRpb25zIG9mIE4gYml0cy4gKi8KLSAgQkZEX1JFTE9DXzY0LAotICBCRkRfUkVMT0NfMzIsCi0gIEJGRF9SRUxPQ18yNiwKLSAgQkZEX1JFTE9DXzI0LAotICBCRkRfUkVMT0NfMTYsCi0gIEJGRF9SRUxPQ18xNCwKLSAgQkZEX1JFTE9DXzgsCi0KLS8qIFBDLXJlbGF0aXZlIHJlbG9jYXRpb25zLiAgU29tZXRpbWVzIHRoZXNlIGFyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcwotb2YgdGhlIHJlbG9jYXRpb24gaXRzZWxmOyBzb21ldGltZXMgdGhleSBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCi10aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSByZWxvY2F0aW9uLiAgSXQgZGVwZW5kcyBvbiB0aGUgc3BlY2lmaWMgdGFyZ2V0LgotCi1UaGUgMjQtYml0IHJlbG9jYXRpb24gaXMgdXNlZCBpbiBzb21lIEludGVsIDk2MCBjb25maWd1cmF0aW9ucy4gKi8KLSAgQkZEX1JFTE9DXzY0X1BDUkVMLAotICBCRkRfUkVMT0NfMzJfUENSRUwsCi0gIEJGRF9SRUxPQ18yNF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzE2X1BDUkVMLAotICBCRkRfUkVMT0NfMTJfUENSRUwsCi0gIEJGRF9SRUxPQ184X1BDUkVMLAotCi0vKiBGb3IgRUxGLiAqLwotICBCRkRfUkVMT0NfMzJfR09UX1BDUkVMLAotICBCRkRfUkVMT0NfMTZfR09UX1BDUkVMLAotICBCRkRfUkVMT0NfOF9HT1RfUENSRUwsCi0gIEJGRF9SRUxPQ18zMl9HT1RPRkYsCi0gIEJGRF9SRUxPQ18xNl9HT1RPRkYsCi0gIEJGRF9SRUxPQ19MTzE2X0dPVE9GRiwKLSAgQkZEX1JFTE9DX0hJMTZfR09UT0ZGLAotICBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRiwKLSAgQkZEX1JFTE9DXzhfR09UT0ZGLAotICBCRkRfUkVMT0NfMzJfUExUX1BDUkVMLAotICBCRkRfUkVMT0NfMjRfUExUX1BDUkVMLAotICBCRkRfUkVMT0NfMTZfUExUX1BDUkVMLAotICBCRkRfUkVMT0NfOF9QTFRfUENSRUwsCi0gIEJGRF9SRUxPQ18zMl9QTFRPRkYsCi0gIEJGRF9SRUxPQ18xNl9QTFRPRkYsCi0gIEJGRF9SRUxPQ19MTzE2X1BMVE9GRiwKLSAgQkZEX1JFTE9DX0hJMTZfUExUT0ZGLAotICBCRkRfUkVMT0NfSEkxNl9TX1BMVE9GRiwKLSAgQkZEX1JFTE9DXzhfUExUT0ZGLAotCi0vKiBSZWxvY2F0aW9ucyB1c2VkIGJ5IDY4SyBFTEYuICovCi0gIEJGRF9SRUxPQ182OEtfR0xPQl9EQVQsCi0gIEJGRF9SRUxPQ182OEtfSk1QX1NMT1QsCi0gIEJGRF9SRUxPQ182OEtfUkVMQVRJVkUsCi0KLS8qIExpbmthZ2UtdGFibGUgcmVsYXRpdmUuICovCi0gIEJGRF9SRUxPQ18zMl9CQVNFUkVMLAotICBCRkRfUkVMT0NfMTZfQkFTRVJFTCwKLSAgQkZEX1JFTE9DX0xPMTZfQkFTRVJFTCwKLSAgQkZEX1JFTE9DX0hJMTZfQkFTRVJFTCwKLSAgQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMLAotICBCRkRfUkVMT0NfOF9CQVNFUkVMLAotICBCRkRfUkVMT0NfUlZBLAotCi0vKiBBYnNvbHV0ZSA4LWJpdCByZWxvY2F0aW9uLCBidXQgdXNlZCB0byBmb3JtIGFuIGFkZHJlc3MgbGlrZSAweEZGbm4uICovCi0gIEJGRF9SRUxPQ184X0ZGbm4sCi0KLS8qIFRoZXNlIFBDLXJlbGF0aXZlIHJlbG9jYXRpb25zIGFyZSBzdG9yZWQgYXMgd29yZCBkaXNwbGFjZW1lbnRzIC0tCi1pLmUuLCBieXRlIGRpc3BsYWNlbWVudHMgc2hpZnRlZCByaWdodCB0d28gYml0cy4gIFRoZSAzMC1iaXQgd29yZAotZGlzcGxhY2VtZW50ICg8PDMyX1BDUkVMX1MyPj4gLS0gMzIgYml0cywgc2hpZnRlZCAyKSBpcyB1c2VkIG9uIHRoZQotU1BBUkMuICAoU1BBUkMgdG9vbHMgZ2VuZXJhbGx5IHJlZmVyIHRvIHRoaXMgYXMgPDxXRElTUDMwPj4uKSAgVGhlCi1zaWduZWQgMTYtYml0IGRpc3BsYWNlbWVudCBpcyB1c2VkIG9uIHRoZSBNSVBTLCBhbmQgdGhlIDIzLWJpdAotZGlzcGxhY2VtZW50IGlzIHVzZWQgb24gdGhlIEFscGhhLiAqLwotICBCRkRfUkVMT0NfMzJfUENSRUxfUzIsCi0gIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMiwKLSAgQkZEX1JFTE9DXzIzX1BDUkVMX1MyLAotCi0vKiBIaWdoIDIyIGJpdHMgYW5kIGxvdyAxMCBiaXRzIG9mIDMyLWJpdCB2YWx1ZSwgcGxhY2VkIGludG8gbG93ZXIgYml0cyBvZgotdGhlIHRhcmdldCB3b3JkLiAgVGhlc2UgYXJlIHVzZWQgb24gdGhlIFNQQVJDLiAqLwotICBCRkRfUkVMT0NfSEkyMiwKLSAgQkZEX1JFTE9DX0xPMTAsCi0KLS8qIEZvciBzeXN0ZW1zIHRoYXQgYWxsb2NhdGUgYSBHbG9iYWwgUG9pbnRlciByZWdpc3RlciwgdGhlc2UgYXJlCi1kaXNwbGFjZW1lbnRzIG9mZiB0aGF0IHJlZ2lzdGVyLiAgVGhlc2UgcmVsb2NhdGlvbiB0eXBlcyBhcmUKLWhhbmRsZWQgc3BlY2lhbGx5LCBiZWNhdXNlIHRoZSB2YWx1ZSB0aGUgcmVnaXN0ZXIgd2lsbCBoYXZlIGlzCi1kZWNpZGVkIHJlbGF0aXZlbHkgbGF0ZS4gKi8KLSAgQkZEX1JFTE9DX0dQUkVMMTYsCi0gIEJGRF9SRUxPQ19HUFJFTDMyLAotCi0vKiBSZWxvYyB0eXBlcyB1c2VkIGZvciBpOTYwL2Iub3V0LiAqLwotICBCRkRfUkVMT0NfSTk2MF9DQUxMSiwKLQotLyogU1BBUkMgRUxGIHJlbG9jYXRpb25zLiAgVGhlcmUgaXMgcHJvYmFibHkgc29tZSBvdmVybGFwIHdpdGggb3RoZXIKLXJlbG9jYXRpb24gdHlwZXMgYWxyZWFkeSBkZWZpbmVkLiAqLwotICBCRkRfUkVMT0NfTk9ORSwKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIsCi0gIEJGRF9SRUxPQ19TUEFSQzIyLAotICBCRkRfUkVMT0NfU1BBUkMxMywKLSAgQkZEX1JFTE9DX1NQQVJDX0dPVDEwLAotICBCRkRfUkVMT0NfU1BBUkNfR09UMTMsCi0gIEJGRF9SRUxPQ19TUEFSQ19HT1QyMiwKLSAgQkZEX1JFTE9DX1NQQVJDX1BDMTAsCi0gIEJGRF9SRUxPQ19TUEFSQ19QQzIyLAotICBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLAotICBCRkRfUkVMT0NfU1BBUkNfQ09QWSwKLSAgQkZEX1JFTE9DX1NQQVJDX0dMT0JfREFULAotICBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QsCi0gIEJGRF9SRUxPQ19TUEFSQ19SRUxBVElWRSwKLSAgQkZEX1JFTE9DX1NQQVJDX1VBMzIsCi0KLS8qIEkgdGhpbmsgdGhlc2UgYXJlIHNwZWNpZmljIHRvIFNQQVJDIGEub3V0IChlLmcuLCBTdW4gNCkuICovCi0gIEJGRF9SRUxPQ19TUEFSQ19CQVNFMTMsCi0gIEJGRF9SRUxPQ19TUEFSQ19CQVNFMjIsCi0KLS8qIFNQQVJDNjQgcmVsb2NhdGlvbnMgKi8KLSNkZWZpbmUgQkZEX1JFTE9DX1NQQVJDXzY0IEJGRF9SRUxPQ182NAotICBCRkRfUkVMT0NfU1BBUkNfMTAsCi0gIEJGRF9SRUxPQ19TUEFSQ18xMSwKLSAgQkZEX1JFTE9DX1NQQVJDX09MTzEwLAotICBCRkRfUkVMT0NfU1BBUkNfSEgyMiwKLSAgQkZEX1JFTE9DX1NQQVJDX0hNMTAsCi0gIEJGRF9SRUxPQ19TUEFSQ19MTTIyLAotICBCRkRfUkVMT0NfU1BBUkNfUENfSEgyMiwKLSAgQkZEX1JFTE9DX1NQQVJDX1BDX0hNMTAsCi0gIEJGRF9SRUxPQ19TUEFSQ19QQ19MTTIyLAotICBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNiwKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTksCi0gIEJGRF9SRUxPQ19TUEFSQ183LAotICBCRkRfUkVMT0NfU1BBUkNfNiwKLSAgQkZEX1JFTE9DX1NQQVJDXzUsCi0jZGVmaW5lIEJGRF9SRUxPQ19TUEFSQ19ESVNQNjQgQkZEX1JFTE9DXzY0X1BDUkVMCi0gIEJGRF9SRUxPQ19TUEFSQ19QTFQ2NCwKLSAgQkZEX1JFTE9DX1NQQVJDX0hJWDIyLAotICBCRkRfUkVMT0NfU1BBUkNfTE9YMTAsCi0gIEJGRF9SRUxPQ19TUEFSQ19INDQsCi0gIEJGRF9SRUxPQ19TUEFSQ19NNDQsCi0gIEJGRF9SRUxPQ19TUEFSQ19MNDQsCi0gIEJGRF9SRUxPQ19TUEFSQ19SRUdJU1RFUiwKLQotLyogU1BBUkMgbGl0dGxlIGVuZGlhbiByZWxvY2F0aW9uICovCi0gIEJGRF9SRUxPQ19TUEFSQ19SRVYzMiwKLQotLyogQWxwaGEgRUNPRkYgYW5kIEVMRiByZWxvY2F0aW9ucy4gIFNvbWUgb2YgdGhlc2UgdHJlYXQgdGhlIHN5bWJvbCBvcgotImFkZGVuZCIgaW4gc29tZSBzcGVjaWFsIHdheS4KLUZvciBHUERJU1BfSEkxNiAoImdwZGlzcCIpIHJlbG9jYXRpb25zLCB0aGUgc3ltYm9sIGlzIGlnbm9yZWQgd2hlbgotd3JpdGluZzsgd2hlbiByZWFkaW5nLCBpdCB3aWxsIGJlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbC4gIFRoZQotYWRkZW5kIGlzIHRoZSBkaXNwbGFjZW1lbnQgaW4gYnl0ZXMgb2YgdGhlICJsZGEiIGluc3RydWN0aW9uIGZyb20KLXRoZSAibGRhaCIgaW5zdHJ1Y3Rpb24gKHdoaWNoIGlzIGF0IHRoZSBhZGRyZXNzIG9mIHRoaXMgcmVsb2MpLiAqLwotICBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTYsCi0KLS8qIEZvciBHUERJU1BfTE8xNiAoImlnbm9yZSIpIHJlbG9jYXRpb25zLCB0aGUgc3ltYm9sIGlzIGhhbmRsZWQgYXMKLXdpdGggR1BESVNQX0hJMTYgcmVsb2NzLiAgVGhlIGFkZGVuZCBpcyBpZ25vcmVkIHdoZW4gd3JpdGluZyB0aGUKLXJlbG9jYXRpb25zIG91dCwgYW5kIGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBmaWxlJ3MgR1AgdmFsdWUgb24KLXJlYWRpbmcsIGZvciBjb252ZW5pZW5jZS4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2LAotCi0vKiBUaGUgRUxGIEdQRElTUCByZWxvY2F0aW9uIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIEdQRElTUF9ISTE2Ci1yZWxvY2F0aW9uIGV4Y2VwdCB0aGF0IHRoZXJlIGlzIG5vIGFjY29tcGFueWluZyBHUERJU1BfTE8xNgotcmVsb2NhdGlvbi4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0dQRElTUCwKLQotLyogVGhlIEFscGhhIExJVEVSQUwvTElUVVNFIHJlbG9jcyBhcmUgcHJvZHVjZWQgYnkgYSBzeW1ib2wgcmVmZXJlbmNlOwotdGhlIGFzc2VtYmxlciB0dXJucyBpdCBpbnRvIGEgTERRIGluc3RydWN0aW9uIHRvIGxvYWQgdGhlIGFkZHJlc3Mgb2YKLXRoZSBzeW1ib2wsIGFuZCB0aGVuIGZpbGxzIGluIGEgcmVnaXN0ZXIgaW4gdGhlIHJlYWwgaW5zdHJ1Y3Rpb24uCi0KLVRoZSBMSVRFUkFMIHJlbG9jLCBhdCB0aGUgTERRIGluc3RydWN0aW9uLCByZWZlcnMgdG8gdGhlIC5saXRhCi1zZWN0aW9uIHN5bWJvbC4gIFRoZSBhZGRlbmQgaXMgaWdub3JlZCB3aGVuIHdyaXRpbmcsIGJ1dCBpcyBmaWxsZWQKLWluIHdpdGggdGhlIGZpbGUncyBHUCB2YWx1ZSBvbiByZWFkaW5nLCBmb3IgY29udmVuaWVuY2UsIGFzIHdpdGggdGhlCi1HUERJU1BfTE8xNiByZWxvYy4KLQotVGhlIEVMRl9MSVRFUkFMIHJlbG9jIGlzIHNvbWV3aGVyZSBiZXR3ZWVuIDE2X0dPVE9GRiBhbmQgR1BESVNQX0xPMTYuCi1JdCBzaG91bGQgcmVmZXIgdG8gdGhlIHN5bWJvbCB0byBiZSByZWZlcmVuY2VkLCBhcyB3aXRoIDE2X0dPVE9GRiwKLWJ1dCBpdCBnZW5lcmF0ZXMgb3V0cHV0IG5vdCBiYXNlZCBvbiB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSAuZ290Ci1zZWN0aW9uLCBidXQgcmVsYXRpdmUgdG8gdGhlIEdQIHZhbHVlIGNob3NlbiBmb3IgdGhlIGZpbGUgZHVyaW5nIHRoZQotZmluYWwgbGluayBzdGFnZS4KLQotVGhlIExJVFVTRSByZWxvYywgb24gdGhlIGluc3RydWN0aW9uIHVzaW5nIHRoZSBsb2FkZWQgYWRkcmVzcywgZ2l2ZXMKLWluZm9ybWF0aW9uIHRvIHRoZSBsaW5rZXIgdGhhdCBpdCBtaWdodCBiZSBhYmxlIHRvIHVzZSB0byBvcHRpbWl6ZQotYXdheSBzb21lIGxpdGVyYWwgc2VjdGlvbiByZWZlcmVuY2VzLiAgVGhlIHN5bWJvbCBpcyBpZ25vcmVkIChyZWFkCi1hcyB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wpLCBhbmQgdGhlICJhZGRlbmQiIGluZGljYXRlcyB0aGUgdHlwZQotb2YgaW5zdHJ1Y3Rpb24gdXNpbmcgdGhlIHJlZ2lzdGVyOgotMSAtICJtZW1vcnkiIGZtdCBpbnNuCi0yIC0gYnl0ZS1tYW5pcHVsYXRpb24gKGJ5dGUgb2Zmc2V0IHJlZykKLTMgLSBqc3IgKHRhcmdldCBvZiBicmFuY2gpCi0KLVRoZSBHTlUgbGlua2VyIGN1cnJlbnRseSBkb2Vzbid0IGRvIGFueSBvZiB0aGlzIG9wdGltaXppbmcuICovCi0gIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMLAotICBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUwsCi0gIEJGRF9SRUxPQ19BTFBIQV9MSVRVU0UsCi0KLS8qIFRoZSBISU5UIHJlbG9jYXRpb24gaW5kaWNhdGVzIGEgdmFsdWUgdGhhdCBzaG91bGQgYmUgZmlsbGVkIGludG8gdGhlCi0iaGludCIgZmllbGQgb2YgYSBqbXAvanNyL3JldCBpbnN0cnVjdGlvbiwgZm9yIHBvc3NpYmxlIGJyYW5jaC0KLXByZWRpY3Rpb24gbG9naWMgd2hpY2ggbWF5IGJlIHByb3ZpZGVkIG9uIHNvbWUgcHJvY2Vzc29ycy4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0hJTlQsCi0KLS8qIFRoZSBMSU5LQUdFIHJlbG9jYXRpb24gb3V0cHV0cyBhIGxpbmthZ2UgcGFpciBpbiB0aGUgb2JqZWN0IGZpbGUsCi13aGljaCBpcyBmaWxsZWQgYnkgdGhlIGxpbmtlci4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UsCi0KLS8qIFRoZSBDT0RFQUREUiByZWxvY2F0aW9uIG91dHB1dHMgYSBTVE9fQ0EgaW4gdGhlIG9iamVjdCBmaWxlLAotd2hpY2ggaXMgZmlsbGVkIGJ5IHRoZSBsaW5rZXIuICovCi0gIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUiwKLQotLyogQml0cyAyNy4uMiBvZiB0aGUgcmVsb2NhdGlvbiBhZGRyZXNzIHNoaWZ0ZWQgcmlnaHQgMiBiaXRzOwotc2ltcGxlIHJlbG9jIG90aGVyd2lzZS4gKi8KLSAgQkZEX1JFTE9DX01JUFNfSk1QLAotCi0vKiBUaGUgTUlQUzE2IGp1bXAgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19NSVBTMTZfSk1QLAotCi0vKiBNSVBTMTYgR1AgcmVsYXRpdmUgcmVsb2MuICovCi0gIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUwsCi0KLS8qIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWU7IHNpbXBsZSByZWxvYy4gKi8KLSAgQkZEX1JFTE9DX0hJMTYsCi0KLS8qIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWUgYnV0IHRoZSBsb3cgMTYgYml0cyB3aWxsIGJlIHNpZ24KLWV4dGVuZGVkIGFuZCBhZGRlZCB0byBmb3JtIHRoZSBmaW5hbCByZXN1bHQuICBJZiB0aGUgbG93IDE2Ci1iaXRzIGZvcm0gYSBuZWdhdGl2ZSBudW1iZXIsIHdlIG5lZWQgdG8gYWRkIG9uZSB0byB0aGUgaGlnaCB2YWx1ZQotdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGJvcnJvdyB3aGVuIHRoZSBsb3cgYml0cyBhcmUgYWRkZWQuICovCi0gIEJGRF9SRUxPQ19ISTE2X1MsCi0KLS8qIExvdyAxNiBiaXRzLiAqLwotICBCRkRfUkVMT0NfTE8xNiwKLQotLyogTGlrZSBCRkRfUkVMT0NfSEkxNl9TLCBidXQgUEMgcmVsYXRpdmUuICovCi0gIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MsCi0KLS8qIExpa2UgQkZEX1JFTE9DX0xPMTYsIGJ1dCBQQyByZWxhdGl2ZS4gKi8KLSAgQkZEX1JFTE9DX1BDUkVMX0xPMTYsCi0KLS8qIFJlbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGdsb2JhbCBwb2ludGVyLiAqLwotI2RlZmluZSBCRkRfUkVMT0NfTUlQU19HUFJFTCBCRkRfUkVMT0NfR1BSRUwxNgotCi0vKiBSZWxvY2F0aW9uIGFnYWluc3QgYSBNSVBTIGxpdGVyYWwgc2VjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX01JUFNfTElURVJBTCwKLQotLyogTUlQUyBFTEYgcmVsb2NhdGlvbnMuICovCi0gIEJGRF9SRUxPQ19NSVBTX0dPVDE2LAotICBCRkRfUkVMT0NfTUlQU19DQUxMMTYsCi0jZGVmaW5lIEJGRF9SRUxPQ19NSVBTX0dQUkVMMzIgQkZEX1JFTE9DX0dQUkVMMzIKLSAgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYsCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2LAotICBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYsCi0gIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNiwKLQotCi0vKiBpMzg2L2VsZiByZWxvY2F0aW9ucyAqLwotICBCRkRfUkVMT0NfMzg2X0dPVDMyLAotICBCRkRfUkVMT0NfMzg2X1BMVDMyLAotICBCRkRfUkVMT0NfMzg2X0NPUFksCi0gIEJGRF9SRUxPQ18zODZfR0xPQl9EQVQsCi0gIEJGRF9SRUxPQ18zODZfSlVNUF9TTE9ULAotICBCRkRfUkVMT0NfMzg2X1JFTEFUSVZFLAotICBCRkRfUkVMT0NfMzg2X0dPVE9GRiwKLSAgQkZEX1JFTE9DXzM4Nl9HT1RQQywKLQotLyogbnMzMmsgcmVsb2NhdGlvbnMgKi8KLSAgQkZEX1JFTE9DX05TMzJLX0lNTV84LAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzE2LAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzMyLAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzhfUENSRUwsCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMTZfUENSRUwsCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMzJfUENSRUwsCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzgsCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2LAotICBCRkRfUkVMT0NfTlMzMktfRElTUF8zMiwKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfOF9QQ1JFTCwKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwsCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyX1BDUkVMLAotCi0vKiBQb3dlcihyczYwMDApIGFuZCBQb3dlclBDIHJlbG9jYXRpb25zLiAqLwotICBCRkRfUkVMT0NfUFBDX0IyNiwKLSAgQkZEX1JFTE9DX1BQQ19CQTI2LAotICBCRkRfUkVMT0NfUFBDX1RPQzE2LAotICBCRkRfUkVMT0NfUFBDX0IxNiwKLSAgQkZEX1JFTE9DX1BQQ19CMTZfQlJUQUtFTiwKLSAgQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU4sCi0gIEJGRF9SRUxPQ19QUENfQkExNiwKLSAgQkZEX1JFTE9DX1BQQ19CQTE2X0JSVEFLRU4sCi0gIEJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTiwKLSAgQkZEX1JFTE9DX1BQQ19DT1BZLAotICBCRkRfUkVMT0NfUFBDX0dMT0JfREFULAotICBCRkRfUkVMT0NfUFBDX0pNUF9TTE9ULAotICBCRkRfUkVMT0NfUFBDX1JFTEFUSVZFLAotICBCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQywKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMiwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNiwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9MTywKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9ISSwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9IQSwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBSTE2LAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2LAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREEyUkVMLAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREEyMSwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTVJLUkVGLAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTRUMxNiwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfTE8sCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJLAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9IQSwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfQklUX0ZMRCwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0RBLAotCi0vKiBUaGUgdHlwZSBvZiByZWxvYyB1c2VkIHRvIGJ1aWxkIGEgY29udHJ1Y3RvciB0YWJsZSAtIGF0IHRoZSBtb21lbnQKLXByb2JhYmx5IGEgMzIgYml0IHdpZGUgYWJzb2x1dGUgcmVsb2NhdGlvbiwgYnV0IHRoZSB0YXJnZXQgY2FuIGNob29zZS4KLUl0IGdlbmVyYWxseSBkb2VzIG1hcCB0byBvbmUgb2YgdGhlIG90aGVyIHJlbG9jYXRpb24gdHlwZXMuICovCi0gIEJGRF9SRUxPQ19DVE9SLAotCi0vKiBBUk0gMjYgYml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gIFRoZSBsb3dlc3QgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvIGFuZCBhcmUKLW5vdCBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCwKLQotLyogVGhlc2UgcmVsb2NzIGFyZSBvbmx5IHVzZWQgd2l0aGluIHRoZSBBUk0gYXNzZW1ibGVyLiAgVGhleSBhcmUgbm90Ci0oYXQgcHJlc2VudCkgd3JpdHRlbiB0byBhbnkgb2JqZWN0IGZpbGVzLiAqLwotICBCRkRfUkVMT0NfQVJNX0lNTUVESUFURSwKLSAgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NLAotICBCRkRfUkVMT0NfQVJNX1NISUZUX0lNTSwKLSAgQkZEX1JFTE9DX0FSTV9TV0ksCi0gIEJGRF9SRUxPQ19BUk1fTVVMVEksCi0gIEJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTSwKLSAgQkZEX1JFTE9DX0FSTV9BRFJfSU1NLAotICBCRkRfUkVMT0NfQVJNX0xEUl9JTU0sCi0gIEJGRF9SRUxPQ19BUk1fTElURVJBTCwKLSAgQkZEX1JFTE9DX0FSTV9JTl9QT09MLAotICBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04LAotICBCRkRfUkVMT0NfQVJNX0hXTElURVJBTCwKLSAgQkZEX1JFTE9DX0FSTV9USFVNQl9BREQsCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfSU1NLAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZULAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCwKLSAgQkZEX1JFTE9DX0FSTV9HT1QxMiwKLSAgQkZEX1JFTE9DX0FSTV9HT1QzMiwKLSAgQkZEX1JFTE9DX0FSTV9KVU1QX1NMT1QsCi0gIEJGRF9SRUxPQ19BUk1fQ09QWSwKLSAgQkZEX1JFTE9DX0FSTV9HTE9CX0RBVCwKLSAgQkZEX1JFTE9DX0FSTV9QTFQzMiwKLSAgQkZEX1JFTE9DX0FSTV9SRUxBVElWRSwKLSAgQkZEX1JFTE9DX0FSTV9HT1RPRkYsCi0gIEJGRF9SRUxPQ19BUk1fR09UUEMsCi0KLS8qIEhpdGFjaGkgU0ggcmVsb2NzLiAgTm90IGFsbCBvZiB0aGVzZSBhcHBlYXIgaW4gb2JqZWN0IGZpbGVzLiAqLwotICBCRkRfUkVMT0NfU0hfUENESVNQOEJZMiwKLSAgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyLAotICBCRkRfUkVMT0NfU0hfSU1NNCwKLSAgQkZEX1JFTE9DX1NIX0lNTTRCWTIsCi0gIEJGRF9SRUxPQ19TSF9JTU00Qlk0LAotICBCRkRfUkVMT0NfU0hfSU1NOCwKLSAgQkZEX1JFTE9DX1NIX0lNTThCWTIsCi0gIEJGRF9SRUxPQ19TSF9JTU04Qlk0LAotICBCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyLAotICBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0LAotICBCRkRfUkVMT0NfU0hfU1dJVENIMTYsCi0gIEJGRF9SRUxPQ19TSF9TV0lUQ0gzMiwKLSAgQkZEX1JFTE9DX1NIX1VTRVMsCi0gIEJGRF9SRUxPQ19TSF9DT1VOVCwKLSAgQkZEX1JFTE9DX1NIX0FMSUdOLAotICBCRkRfUkVMT0NfU0hfQ09ERSwKLSAgQkZEX1JFTE9DX1NIX0RBVEEsCi0gIEJGRF9SRUxPQ19TSF9MQUJFTCwKLQotLyogVGh1bWIgMjMtLCAxMi0gYW5kIDktYml0IHBjLXJlbGF0aXZlIGJyYW5jaGVzLiAgVGhlIGxvd2VzdCBiaXQgbXVzdAotYmUgemVybyBhbmQgaXMgbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5LAotICBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTIsCi0gIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMywKLQotLyogQXJnb25hdXQgUklTQyBDb3JlIChBUkMpIHJlbG9jcy4KLUFSQyAyMiBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgVGhlIGxvd2VzdCB0d28gYml0cyBtdXN0IGJlIHplcm8gYW5kIGFyZQotbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCAyMCBiaXRzIGFyZSBpbnN0YWxsZWQgaW4gYml0cyAyNgotdGhyb3VnaCA3IG9mIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX0FSQ19CMjJfUENSRUwsCi0KLS8qIEFSQyAyNiBiaXQgYWJzb2x1dGUgYnJhbmNoLiAgVGhlIGxvd2VzdCB0d28gYml0cyBtdXN0IGJlIHplcm8gYW5kIGFyZSBub3QKLXN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCAyNCBiaXRzIGFyZSBpbnN0YWxsZWQgaW4gYml0cyAyMwotdGhyb3VnaCAwLiAqLwotICBCRkRfUkVMT0NfQVJDX0IyNiwKLQotLyogTWl0c3ViaXNoaSBEMTBWIHJlbG9jcy4KLVRoaXMgaXMgYSAxMC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCi1hc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IsCi0KLS8qIE1pdHN1YmlzaGkgRDEwViByZWxvY3MuCi1UaGlzIGlzIGEgMTAtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotYXNzdW1lZCB0byBiZSAwLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgcmVsb2MKLWV4Y2VwdCBpdCBpcyBpbiB0aGUgbGVmdCBjb250YWluZXIsIGkuZS4sCi1zaGlmdGVkIGxlZnQgMTUgYml0cy4gKi8KLSAgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfTCwKLQotLyogVGhpcyBpcyBhbiAxOC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCi1hc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMTBWXzE4LAotCi0vKiBUaGlzIGlzIGFuIDE4LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLWFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QxMFZfMThfUENSRUwsCi0KLS8qIE1pdHN1YmlzaGkgRDMwViByZWxvY3MuCi1UaGlzIGlzIGEgNi1iaXQgYWJzb2x1dGUgcmVsb2MuICovCi0gIEJGRF9SRUxPQ19EMzBWXzYsCi0KLS8qIFRoaXMgaXMgYSA2LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMzBWXzlfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSA2LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuIFNhbWUKLWFzIHRoZSBwcmV2aW91cyByZWxvYyBidXQgb24gdGhlIHJpZ2h0IHNpZGUKLW9mIHRoZSBjb250YWluZXIuICovCi0gIEJGRF9SRUxPQ19EMzBWXzlfUENSRUxfUiwKLQotLyogVGhpcyBpcyBhIDEyLWJpdCBhYnNvbHV0ZSByZWxvYyB3aXRoIHRoZSAKLXJpZ2h0IDMgYml0c2Fzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMTUsCi0KLS8qIFRoaXMgaXMgYSAxMi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKLXRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDEyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuIFNhbWUKLWFzIHRoZSBwcmV2aW91cyByZWxvYyBidXQgb24gdGhlIHJpZ2h0IHNpZGUKLW9mIHRoZSBjb250YWluZXIuICovCi0gIEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMX1IsCi0KLS8qIFRoaXMgaXMgYW4gMTgtYml0IGFic29sdXRlIHJlbG9jIHdpdGggCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMjEsCi0KLS8qIFRoaXMgaXMgYW4gMTgtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUwsCi0KLS8qIFRoaXMgaXMgYW4gMTgtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gU2FtZQotYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQotb2YgdGhlIGNvbnRhaW5lci4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUxfUiwKLQotLyogVGhpcyBpcyBhIDMyLWJpdCBhYnNvbHV0ZSByZWxvYy4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMzIsCi0KLS8qIFRoaXMgaXMgYSAzMi1iaXQgcGMtcmVsYXRpdmUgcmVsb2MuICovCi0gIEJGRF9SRUxPQ19EMzBWXzMyX1BDUkVMLAotCi0vKiBNaXRzdWJpc2hpIE0zMlIgcmVsb2NzLgotVGhpcyBpcyBhIDI0IGJpdCBhYnNvbHV0ZSBhZGRyZXNzLiAqLwotICBCRkRfUkVMT0NfTTMyUl8yNCwKLQotLyogVGhpcyBpcyBhIDEwLWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfTTMyUl8xMF9QQ1JFTCwKLQotLyogVGhpcyBpcyBhbiAxOC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX00zMlJfMThfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSAyNi1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX00zMlJfMjZfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgaGlnaCAxNiBiaXRzIG9mIGFuIGFkZHJlc3MKLXVzZWQgd2hlbiB0aGUgbG93ZXIgMTYgYml0cyBhcmUgdHJlYXRlZCBhcyB1bnNpZ25lZC4gKi8KLSAgQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8sCi0KLS8qIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgaGlnaCAxNiBiaXRzIG9mIGFuIGFkZHJlc3MKLXVzZWQgd2hlbiB0aGUgbG93ZXIgMTYgYml0cyBhcmUgdHJlYXRlZCBhcyBzaWduZWQuICovCi0gIEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPLAotCi0vKiBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIGxvd2VyIDE2IGJpdHMgb2YgYW4gYWRkcmVzcy4gKi8KLSAgQkZEX1JFTE9DX00zMlJfTE8xNiwKLQotLyogVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBzbWFsbCBkYXRhIGFyZWEgb2Zmc2V0IGZvciB1c2UgaW4KLWFkZDMsIGxvYWQsIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMuICovCi0gIEJGRF9SRUxPQ19NMzJSX1NEQTE2LAotCi0vKiBUaGlzIGlzIGEgOS1iaXQgcmVsb2MgKi8KLSAgQkZEX1JFTE9DX1Y4NTBfOV9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDIyLWJpdCByZWxvYyAqLwotICBCRkRfUkVMT0NfVjg1MF8yMl9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDE1IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlCi1zaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgMTUgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUKLXplcm8gZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1pEQV8xNV8xNl9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYW4gOCBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDYgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUKLXRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1REQV82XzhfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGFuIDhiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDcgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUgdGlueQotZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1REQV83XzhfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgNyBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1REQV83XzdfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9UREFfMTZfMTZfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgNSBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDQgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUgdGlueQotZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1REQV80XzVfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgNCBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1REQV80XzRfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlciwgd2l0aCB0aGUKLWJpdHMgcGxhY2VkIG5vbi1jb250aWdvdXNseSBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIsIHdpdGggdGhlCi1iaXRzIHBsYWNlZCBub24tY29udGlnb3VzbHkgaW4gdGhlIGluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9DQUxMVF82XzdfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSBjYWxsIHRhYmxlIGJhc2UgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULAotCi0KLS8qIFRoaXMgaXMgYSAzMmJpdCBwY3JlbCByZWxvYyBmb3IgdGhlIG1uMTAzMDAsIG9mZnNldCBieSB0d28gYnl0ZXMgaW4gdGhlCi1pbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX01OMTAzMDBfMzJfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSAxNmJpdCBwY3JlbCByZWxvYyBmb3IgdGhlIG1uMTAzMDAsIG9mZnNldCBieSB0d28gYnl0ZXMgaW4gdGhlCi1pbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX01OMTAzMDBfMTZfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSA4Yml0IERQIHJlbG9jIGZvciB0aGUgdG1zMzIwYzMwLCB3aGVyZSB0aGUgbW9zdAotc2lnbmlmaWNhbnQgOCBiaXRzIG9mIGEgMjQgYml0IHdvcmQgYXJlIHBsYWNlZCBpbnRvIHRoZSBsZWFzdAotc2lnbmlmaWNhbnQgOCBiaXRzIG9mIHRoZSBvcGNvZGUuICovCi0gIEJGRF9SRUxPQ19USUMzMF9MRFAsCi0KLS8qIFRoaXMgaXMgYSA0OCBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIDMyIGJpdHMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzQ4LAotCi0vKiBUaGlzIGlzIGEgMzIgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyAyMCBiaXRzIHNwbGl0IHVwIGludG8KLXR3byBzZWN0aW9ucy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfMjAsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgNiBiaXQgd29yZCBvZmZzZXQgaW4KLTQgYml0cy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfNl9JTl80LAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhbiA4IGJpdCBieXRlIG9mZnNldAotaW50byA4IGJpdHMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzhfSU5fOCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSA5IGJpdCBzaG9ydCBvZmZzZXQKLWludG8gOCBiaXRzLiAqLwotICBCRkRfUkVMT0NfRlIzMF85X0lOXzgsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgMTAgYml0IHdvcmQgb2Zmc2V0Ci1pbnRvIDggYml0cy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfMTBfSU5fOCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSA5IGJpdCBwYyByZWxhdGl2ZQotc2hvcnQgb2Zmc2V0IGludG8gOCBiaXRzLiAqLwotICBCRkRfUkVMT0NfRlIzMF85X1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDEyIGJpdCBwYyByZWxhdGl2ZQotc2hvcnQgb2Zmc2V0IGludG8gMTEgYml0cy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfMTJfUENSRUwsCi0KLS8qIE1vdG9yb2xhIE1jb3JlIHJlbG9jYXRpb25zLiAqLwotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNCwKLSAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyLAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMiwKLSAgQkZEX1JFTE9DX01DT1JFX1BDUkVMXzMyLAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyLAotICBCRkRfUkVMT0NfTUNPUkVfUlZBLAotCi0vKiBUaGVzZSB0d28gcmVsb2NhdGlvbnMgYXJlIHVzZWQgYnkgdGhlIGxpbmtlciB0byBkZXRlcm1pbmUgd2hpY2ggb2YgCi10aGUgZW50cmllcyBpbiBhIEMrKyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGFyZSBhY3R1YWxseSB1c2VkLiAgV2hlbgotdGhlIC0tZ2Mtc2VjdGlvbnMgb3B0aW9uIGlzIGdpdmVuLCB0aGUgbGlua2VyIHdpbGwgemVybyBvdXQgdGhlIGVudHJpZXMKLXRoYXQgYXJlIG5vdCB1c2VkLCBzbyB0aGF0IHRoZSBjb2RlIGZvciB0aG9zZSBmdW5jdGlvbnMgbmVlZCBub3QgYmUKLWluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCi0KLVZUQUJMRV9JTkhFUklUIGlzIGEgemVyby1zcGFjZSByZWxvY2F0aW9uIHVzZWQgdG8gZGVzY3JpYmUgdG8gdGhlCi1saW5rZXIgdGhlIGluaGVyaXRlbmNlIHRyZWUgb2YgYSBDKysgdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gIFRoZQotcmVsb2NhdGlvbidzIHN5bWJvbCBzaG91bGQgYmUgdGhlIHBhcmVudCBjbGFzcycgdnRhYmxlLCBhbmQgdGhlCi1yZWxvY2F0aW9uIHNob3VsZCBiZSBsb2NhdGVkIGF0IHRoZSBjaGlsZCB2dGFibGUuCi0KLVZUQUJMRV9FTlRSWSBpcyBhIHplcm8tc3BhY2UgcmVsb2NhdGlvbiB0aGF0IGRlc2NyaWJlcyB0aGUgdXNlIG9mIGEKLXZpcnR1YWwgZnVuY3Rpb24gdGFibGUgZW50cnkuICBUaGUgcmVsb2MncyBzeW1ib2wgc2hvdWxkIHJlZmVyIHRvIHRoZQotdGFibGUgb2YgdGhlIGNsYXNzIG1lbnRpb25lZCBpbiB0aGUgY29kZS4gIE9mZiBvZiB0aGF0IGJhc2UsIGFuIG9mZnNldAotZGVzY3JpYmVzIHRoZSBlbnRyeSB0aGF0IGlzIGJlaW5nIHVzZWQuICBGb3IgUmVsYSBob3N0cywgdGhpcyBvZmZzZXQgCi1pcyBzdG9yZWQgaW4gdGhlIHJlbG9jJ3MgYWRkZW5kLiAgRm9yIFJlbCBob3N0cywgd2UgYXJlIGZvcmNlZCB0byBwdXQKLXRoaXMgb2Zmc2V0IGluIHRoZSByZWxvYydzIHNlY3Rpb24gb2Zmc2V0LiAqLwotICBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsCi0gIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksCi0gIEJGRF9SRUxPQ19VTlVTRUQgfTsKLXR5cGVkZWYgZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZTsKLXJlbG9jX2hvd3RvX3R5cGUgKgotCi1iZmRfcmVsb2NfdHlwZV9sb29rdXAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotY29uc3QgY2hhciAqCi1iZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAgUEFSQU1TICgoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotCi10eXBlZGVmIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkKLXsKLSAgICAgICAgLyogQSBwb2ludGVyIHRvIHRoZSBCRkQgd2hpY2ggb3ducyB0aGUgc3ltYm9sLiBUaGlzIGluZm9ybWF0aW9uCi0gICAgICAgICAgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgYSBiYWNrIGVuZCBjYW4gd29yayBvdXQgd2hhdCBhZGRpdGlvbmFsCi0gICAgICAgICAgaW5mb3JtYXRpb24gKGludmlzaWJsZSB0byB0aGUgYXBwbGljYXRpb24gd3JpdGVyKSBpcyBjYXJyaWVkCi0gICAgICAgICAgd2l0aCB0aGUgc3ltYm9sLgotCi0gICAgICAgICAgVGhpcyBmaWVsZCBpcyAqYWxtb3N0KiByZWR1bmRhbnQsIHNpbmNlIHlvdSBjYW4gdXNlIHNlY3Rpb24tPm93bmVyCi0gICAgICAgICAgaW5zdGVhZCwgZXhjZXB0IHRoYXQgc29tZSBzeW1ib2xzIHBvaW50IHRvIHRoZSBnbG9iYWwgc2VjdGlvbnMKLSAgICAgICAgICBiZmRfe2Ficyxjb20sdW5kfV9zZWN0aW9uLiAgVGhpcyBjb3VsZCBiZSBmaXhlZCBieSBtYWtpbmcKLSAgICAgICAgICB0aGVzZSBnbG9iYWxzIGJlIHBlci1iZmQgKG9yIHBlci10YXJnZXQtZmxhdm9yKS4gIEZJWE1FLiAqLwotCi0gIHN0cnVjdCBfYmZkICp0aGVfYmZkOyAgLyogVXNlIGJmZF9hc3ltYm9sX2JmZChzeW0pIHRvIGFjY2VzcyB0aGlzIGZpZWxkLiAqLwotCi0gICAgICAgIC8qIFRoZSB0ZXh0IG9mIHRoZSBzeW1ib2wuIFRoZSBuYW1lIGlzIGxlZnQgYWxvbmUsIGFuZCBub3QgY29waWVkOyB0aGUKLSAgICAgICAgICBhcHBsaWNhdGlvbiBtYXkgbm90IGFsdGVyIGl0LiAqLwotICBDT05TVCBjaGFyICpuYW1lOwotCi0gICAgICAgIC8qIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgVGhpcyByZWFsbHkgc2hvdWxkIGJlIGEgdW5pb24gb2YgYQotICAgICAgICAgIG51bWVyaWMgdmFsdWUgd2l0aCBhIHBvaW50ZXIsIHNpbmNlIHNvbWUgZmxhZ3MgaW5kaWNhdGUgdGhhdAotICAgICAgICAgIGEgcG9pbnRlciB0byBhbm90aGVyIHN5bWJvbCBpcyBzdG9yZWQgaGVyZS4gICovCi0gIHN5bXZhbHVlIHZhbHVlOwotCi0gICAgICAgIC8qIEF0dHJpYnV0ZXMgb2YgYSBzeW1ib2w6ICovCi0KLSNkZWZpbmUgQlNGX05PX0ZMQUdTICAgIDB4MDAKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIGhhcyBsb2NhbCBzY29wZTsgPDxzdGF0aWM+PiBpbiA8PEM+Pi4gVGhlIHZhbHVlCi0gICAgICAgICAgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqLwotI2RlZmluZSBCU0ZfTE9DQUwgICAgICAweDAxCi0KLSAgICAgICAgLyogVGhlIHN5bWJvbCBoYXMgZ2xvYmFsIHNjb3BlOyBpbml0aWFsaXplZCBkYXRhIGluIDw8Qz4+LiBUaGUKLSAgICAgICAgICB2YWx1ZSBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICovCi0jZGVmaW5lIEJTRl9HTE9CQUwgICAgIDB4MDIKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIGhhcyBnbG9iYWwgc2NvcGUgYW5kIGlzIGV4cG9ydGVkLiBUaGUgdmFsdWUgaXMKLSAgICAgICAgICB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICovCi0jZGVmaW5lIEJTRl9FWFBPUlQgICAgIEJTRl9HTE9CQUwgIC8qIG5vIHJlYWwgZGlmZmVyZW5jZSAqLwotCi0gICAgICAgIC8qIEEgbm9ybWFsIEMgc3ltYm9sIHdvdWxkIGJlIG9uZSBvZjoKLSAgICAgICAgICA8PEJTRl9MT0NBTD4+LCA8PEJTRl9GT1JUX0NPTU0+PiwgIDw8QlNGX1VOREVGSU5FRD4+IG9yCi0gICAgICAgICAgPDxCU0ZfR0xPQkFMPj4gKi8KLQotICAgICAgICAvKiBUaGUgc3ltYm9sIGlzIGEgZGVidWdnaW5nIHJlY29yZC4gVGhlIHZhbHVlIGhhcyBhbiBhcmJpdGFyeQotICAgICAgICAgIG1lYW5pbmcuICovCi0jZGVmaW5lIEJTRl9ERUJVR0dJTkcgIDB4MDgKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIGRlbm90ZXMgYSBmdW5jdGlvbiBlbnRyeSBwb2ludC4gIFVzZWQgaW4gRUxGLAotICAgICAgICAgIHBlcmhhcHMgb3RoZXJzIHNvbWVkYXkuICAqLwotI2RlZmluZSBCU0ZfRlVOQ1RJT04gICAgMHgxMAotCi0gICAgICAgIC8qIFVzZWQgYnkgdGhlIGxpbmtlci4gKi8KLSNkZWZpbmUgQlNGX0tFRVAgICAgICAgIDB4MjAKLSNkZWZpbmUgQlNGX0tFRVBfRyAgICAgIDB4NDAKLQotICAgICAgICAvKiBBIHdlYWsgZ2xvYmFsIHN5bWJvbCwgb3ZlcnJpZGFibGUgd2l0aG91dCB3YXJuaW5ncyBieQotICAgICAgICAgIGEgcmVndWxhciBnbG9iYWwgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUuICAqLwotI2RlZmluZSBCU0ZfV0VBSyAgICAgICAgMHg4MAotCi0gICAgICAgIC8qIFRoaXMgc3ltYm9sIHdhcyBjcmVhdGVkIHRvIHBvaW50IHRvIGEgc2VjdGlvbiwgZS5nLiBFTEYncwotICAgICAgICAgIFNUVF9TRUNUSU9OIHN5bWJvbHMuICAqLwotI2RlZmluZSBCU0ZfU0VDVElPTl9TWU0gMHgxMDAKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIHVzZWQgdG8gYmUgYSBjb21tb24gc3ltYm9sLCBidXQgbm93IGl0IGlzCi0gICAgICAgICAgYWxsb2NhdGVkLiAqLwotI2RlZmluZSBCU0ZfT0xEX0NPTU1PTiAgMHgyMDAKLQotICAgICAgICAvKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgY29tbW9uIGRhdGEuICovCi0jZGVmaW5lIEJGRF9GT1JUX0NPTU1fREVGQVVMVF9WQUxVRSAwCi0KLSAgICAgICAgLyogSW4gc29tZSBmaWxlcyB0aGUgdHlwZSBvZiBhIHN5bWJvbCBzb21ldGltZXMgYWx0ZXJzIGl0cwotICAgICAgICAgIGxvY2F0aW9uIGluIGFuIG91dHB1dCBmaWxlIC0gaWUgaW4gY29mZiBhIDw8SVNGQ04+PiBzeW1ib2wKLSAgICAgICAgICB3aGljaCBpcyBhbHNvIDw8Q19FWFQ+PiBzeW1ib2wgYXBwZWFycyB3aGVyZSBpdCB3YXMKLSAgICAgICAgICBkZWNsYXJlZCBhbmQgbm90IGF0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLiAgVGhpcyBiaXQgaXMgc2V0Ci0gICAgICAgICAgYnkgdGhlIHRhcmdldCBCRkQgcGFydCB0byBjb252ZXkgdGhpcyBpbmZvcm1hdGlvbi4gKi8KLQotI2RlZmluZSBCU0ZfTk9UX0FUX0VORCAgICAweDQwMAotCi0gICAgICAgIC8qIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgdGhlIGxhYmVsIG9mIGNvbnN0cnVjdG9yIHNlY3Rpb24uICovCi0jZGVmaW5lIEJTRl9DT05TVFJVQ1RPUiAgIDB4ODAwCi0KLSAgICAgICAgLyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyBhIHdhcm5pbmcgc3ltYm9sLiAgVGhlIG5hbWUgaXMgYQotICAgICAgICAgIHdhcm5pbmcuICBUaGUgbmFtZSBvZiB0aGUgbmV4dCBzeW1ib2wgaXMgdGhlIG9uZSB0byB3YXJuIGFib3V0OwotICAgICAgICAgIGlmIGEgcmVmZXJlbmNlIGlzIG1hZGUgdG8gYSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBuZXh0Ci0gICAgICAgICAgc3ltYm9sLCBhIHdhcm5pbmcgaXMgaXNzdWVkIGJ5IHRoZSBsaW5rZXIuICovCi0jZGVmaW5lIEJTRl9XQVJOSU5HICAgICAgIDB4MTAwMAotCi0gICAgICAgIC8qIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgaW5kaXJlY3QuICBUaGlzIHN5bWJvbCBpcyBhbiBpbmRpcmVjdAotICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG5leHQgc3ltYm9sLiAqLwotI2RlZmluZSBCU0ZfSU5ESVJFQ1QgICAgICAweDIwMDAKLQotICAgICAgICAvKiBCU0ZfRklMRSBtYXJrcyBzeW1ib2xzIHRoYXQgY29udGFpbiBhIGZpbGUgbmFtZS4gIFRoaXMgaXMgdXNlZAotICAgICAgICAgIGZvciBFTEYgU1RUX0ZJTEUgc3ltYm9scy4gICovCi0jZGVmaW5lIEJTRl9GSUxFICAgICAgICAgIDB4NDAwMAotCi0gICAgICAgIC8qIFN5bWJvbCBpcyBmcm9tIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIEJTRl9EWU5BTUlDICAgICAgIDB4ODAwMAotCi0gICAgICAgIC8qIFRoZSBzeW1ib2wgZGVub3RlcyBhIGRhdGEgb2JqZWN0LiAgVXNlZCBpbiBFTEYsIGFuZCBwZXJoYXBzCi0gICAgICAgICAgb3RoZXJzIHNvbWVkYXkuICAqLwotI2RlZmluZSBCU0ZfT0JKRUNUICAgICAgICAweDEwMDAwCi0KLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgICAgICAgLyogQSBwb2ludGVyIHRvIHRoZSBzZWN0aW9uIHRvIHdoaWNoIHRoaXMgc3ltYm9sIGlzCi0gICAgICAgICAgcmVsYXRpdmUuICBUaGlzIHdpbGwgYWx3YXlzIGJlIG5vbiBOVUxMLCB0aGVyZSBhcmUgc3BlY2lhbAotICAgICAgICAgIHNlY3Rpb25zIGZvciB1bmRlZmluZWQgYW5kIGFic29sdXRlIHN5bWJvbHMuICAqLwotICBzdHJ1Y3Qgc2VjICpzZWN0aW9uOwotCi0gICAgICAgIC8qIEJhY2sgZW5kIHNwZWNpYWwgZGF0YS4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgUFRSIHA7Ci0gICAgICBiZmRfdm1hIGk7Ci0gICAgfSB1ZGF0YTsKLQotfSBhc3ltYm9sOwotI2RlZmluZSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZChhYmZkKSBcCi0gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQsIChhYmZkKSkKLWJvb2xlYW4gCi1iZmRfaXNfbG9jYWxfbGFiZWwgUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICpzeW0pKTsKLQotYm9vbGVhbiAKLWJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgY29uc3QgY2hhciAqbmFtZSkpOwotCi0jZGVmaW5lIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lKGFiZmQsIG5hbWUpIFwKLSAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSwgKGFiZmQsIG5hbWUpKQotI2RlZmluZSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYihhYmZkLCBsb2NhdGlvbikgXAotICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfc3ltdGFiLFwKLSAgICAgICAgICAgICAgICAgIChhYmZkLCBsb2NhdGlvbikpCi1ib29sZWFuIAotYmZkX3NldF9zeW10YWIgIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKmxvY2F0aW9uLCB1bnNpZ25lZCBpbnQgY291bnQpKTsKLQotdm9pZCAKLWJmZF9wcmludF9zeW1ib2xfdmFuZGYgUEFSQU1TICgoUFRSIGZpbGUsIGFzeW1ib2wgKnN5bWJvbCkpOwotCi0jZGVmaW5lIGJmZF9tYWtlX2VtcHR5X3N5bWJvbChhYmZkKSBcCi0gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX21ha2VfZW1wdHlfc3ltYm9sLCAoYWJmZCkpCi0jZGVmaW5lIGJmZF9tYWtlX2RlYnVnX3N5bWJvbChhYmZkLHB0cixzaXplKSBcCi0gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX21ha2VfZGVidWdfc3ltYm9sLCAoYWJmZCwgcHRyLCBzaXplKSkKLWludCAKLWJmZF9kZWNvZGVfc3ltY2xhc3MgUEFSQU1TICgoYXN5bWJvbCAqc3ltYm9sKSk7Ci0KLXZvaWQgCi1iZmRfc3ltYm9sX2luZm8gUEFSQU1TICgoYXN5bWJvbCAqc3ltYm9sLCBzeW1ib2xfaW5mbyAqcmV0KSk7Ci0KLWJvb2xlYW4gCi1iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIFBBUkFNUyAoKGJmZCAqaWJmZCwgYXN5bWJvbCAqaXN5bSwgYmZkICpvYmZkLCBhc3ltYm9sICpvc3ltKSk7Ci0KLSNkZWZpbmUgYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YShpYmZkLCBpc3ltYm9sLCBvYmZkLCBvc3ltYm9sKSBcCi0gICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSwgXAotICAgICAgICAgICAgICAgKGliZmQsIGlzeW1ib2wsIG9iZmQsIG9zeW1ib2wpKQotc3RydWN0IF9iZmQgCi17Ci0gICAgIC8qIFRoZSBmaWxlbmFtZSB0aGUgYXBwbGljYXRpb24gb3BlbmVkIHRoZSBCRkQgd2l0aC4gICovCi0gICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7ICAgICAgICAgICAgICAgIAotCi0gICAgIC8qIEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGp1bXAgdGFibGUuICAgICAgICAgICAgICovCi0gICAgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKnh2ZWM7Ci0KLSAgICAgLyogVG8gYXZvaWQgZHJhZ2dpbmcgdG9vIG1hbnkgaGVhZGVyIGZpbGVzIGludG8gZXZlcnkgZmlsZSB0aGF0Ci0gICAgICAgaW5jbHVkZXMgYDw8YmZkLmg+PicsIElPU1RSRUFNIGhhcyBiZWVuIGRlY2xhcmVkIGFzIGEgImNoYXIKLSAgICAgICAqIiwgYW5kIE1USU1FIGFzIGEgImxvbmciLiAgVGhlaXIgY29ycmVjdCB0eXBlcywgdG8gd2hpY2ggdGhleQotICAgICAgIGFyZSBjYXN0IHdoZW4gdXNlZCwgYXJlICJGSUxFICoiIGFuZCAidGltZV90Ii4gICAgVGhlIGlvc3RyZWFtCi0gICAgICAgaXMgdGhlIHJlc3VsdCBvZiBhbiBmb3BlbiBvbiB0aGUgZmlsZW5hbWUuICBIb3dldmVyLCBpZiB0aGUKLSAgICAgICBCRkRfSU5fTUVNT1JZIGZsYWcgaXMgc2V0LCB0aGVuIGlvc3RyZWFtIGlzIGFjdHVhbGx5IGEgcG9pbnRlcgotICAgICAgIHRvIGEgYmZkX2luX21lbW9yeSBzdHJ1Y3QuICAqLwotICAgIFBUUiBpb3N0cmVhbTsKLQotICAgICAvKiBJcyB0aGUgZmlsZSBkZXNjcmlwdG9yIGJlaW5nIGNhY2hlZD8gIFRoYXQgaXMsIGNhbiBpdCBiZSBjbG9zZWQgYXMKLSAgICAgICBuZWVkZWQsIGFuZCByZS1vcGVuZWQgd2hlbiBhY2Nlc3NlZCBsYXRlcj8gICovCi0KLSAgICBib29sZWFuIGNhY2hlYWJsZTsKLQotICAgICAvKiBNYXJrcyB3aGV0aGVyIHRoZXJlIHdhcyBhIGRlZmF1bHQgdGFyZ2V0IHNwZWNpZmllZCB3aGVuIHRoZQotICAgICAgIEJGRCB3YXMgb3BlbmVkLiBUaGlzIGlzIHVzZWQgdG8gc2VsZWN0IHdoaWNoIG1hdGNoaW5nIGFsZ29yaXRobQotICAgICAgIHRvIHVzZSB0byBjaG9vc2UgdGhlIGJhY2sgZW5kLiAqLwotCi0gICAgYm9vbGVhbiB0YXJnZXRfZGVmYXVsdGVkOwotCi0gICAgIC8qIFRoZSBjYWNoaW5nIHJvdXRpbmVzIHVzZSB0aGVzZSB0byBtYWludGFpbiBhCi0gICAgICAgbGVhc3QtcmVjZW50bHktdXNlZCBsaXN0IG9mIEJGRHMgKi8KLQotICAgIHN0cnVjdCBfYmZkICpscnVfcHJldiwgKmxydV9uZXh0OwotCi0gICAgIC8qIFdoZW4gYSBmaWxlIGlzIGNsb3NlZCBieSB0aGUgY2FjaGluZyByb3V0aW5lcywgQkZEIHJldGFpbnMKLSAgICAgICBzdGF0ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZmlsZSBoZXJlOiAqLwotCi0gICAgZmlsZV9wdHIgd2hlcmU7ICAgICAgICAgICAgICAKLQotICAgICAvKiBhbmQgaGVyZTogKGBgb25jZScnIG1lYW5zIGF0IGxlYXN0IG9uY2UpICovCi0KLSAgICBib29sZWFuIG9wZW5lZF9vbmNlOwotCi0gICAgIC8qIFNldCBpZiB3ZSBoYXZlIGEgbG9jYWxseSBtYWludGFpbmVkIG10aW1lIHZhbHVlLCByYXRoZXIgdGhhbgotICAgICAgIGdldHRpbmcgaXQgZnJvbSB0aGUgZmlsZSBlYWNoIHRpbWU6ICovCi0KLSAgICBib29sZWFuIG10aW1lX3NldDsKLQotICAgICAvKiBGaWxlIG1vZGlmaWVkIHRpbWUsIGlmIG10aW1lX3NldCBpcyB0cnVlOiAqLwotCi0gICAgbG9uZyBtdGltZTsgICAgICAgICAgCi0KLSAgICAgLyogUmVzZXJ2ZWQgZm9yIGFuIHVuaW1wbGVtZW50ZWQgZmlsZSBsb2NraW5nIGV4dGVuc2lvbi4qLwotCi0gICAgaW50IGlmZDsKLQotICAgICAvKiBUaGUgZm9ybWF0IHdoaWNoIGJlbG9uZ3MgdG8gdGhlIEJGRC4gKG9iamVjdCwgY29yZSwgZXRjLikgKi8KLQotICAgIGJmZF9mb3JtYXQgZm9ybWF0OwotCi0gICAgIC8qIFRoZSBkaXJlY3Rpb24gdGhlIEJGRCB3YXMgb3BlbmVkIHdpdGgqLwotCi0gICAgZW51bSBiZmRfZGlyZWN0aW9uIHtub19kaXJlY3Rpb24gPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9kaXJlY3Rpb24gPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZGlyZWN0aW9uID0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhfZGlyZWN0aW9uID0gM30gZGlyZWN0aW9uOwotCi0gICAgIC8qIEZvcm1hdF9zcGVjaWZpYyBmbGFncyovCi0KLSAgICBmbGFnd29yZCBmbGFnczsgICAgICAgICAgICAgIAotCi0gICAgIC8qIEN1cnJlbnRseSBteV9hcmNoaXZlIGlzIHRlc3RlZCBiZWZvcmUgYWRkaW5nIG9yaWdpbiB0bwotICAgICAgIGFueXRoaW5nLiBJIGJlbGlldmUgdGhhdCB0aGlzIGNhbiBiZWNvbWUgYWx3YXlzIGFuIGFkZCBvZgotICAgICAgIG9yaWdpbiwgd2l0aCBvcmlnaW4gc2V0IHRvIDAgZm9yIG5vbiBhcmNoaXZlIGZpbGVzLiAgICovCi0KLSAgICBmaWxlX3B0ciBvcmlnaW47ICAgICAgICAgICAgIAotCi0gICAgIC8qIFJlbWVtYmVyIHdoZW4gb3V0cHV0IGhhcyBiZWd1biwgdG8gc3RvcCBzdHJhbmdlIHRoaW5ncwotICAgICAgIGZyb20gaGFwcGVuaW5nLiAqLwotICAgIGJvb2xlYW4gb3V0cHV0X2hhc19iZWd1bjsKLQotICAgICAvKiBQb2ludGVyIHRvIGxpbmtlZCBsaXN0IG9mIHNlY3Rpb25zKi8KLSAgICBzdHJ1Y3Qgc2VjICAqc2VjdGlvbnM7Ci0KLSAgICAgLyogVGhlIG51bWJlciBvZiBzZWN0aW9ucyAqLwotICAgIHVuc2lnbmVkIGludCBzZWN0aW9uX2NvdW50OwotCi0gICAgIC8qIFN0dWZmIG9ubHkgdXNlZnVsIGZvciBvYmplY3QgZmlsZXM6IAotICAgICAgIFRoZSBzdGFydCBhZGRyZXNzLiAqLwotICAgIGJmZF92bWEgc3RhcnRfYWRkcmVzczsKLQotICAgICAvKiBVc2VkIGZvciBpbnB1dCBhbmQgb3V0cHV0Ki8KLSAgICB1bnNpZ25lZCBpbnQgc3ltY291bnQ7Ci0KLSAgICAgLyogU3ltYm9sIHRhYmxlIGZvciBvdXRwdXQgQkZEICh3aXRoIHN5bWNvdW50IGVudHJpZXMpICovCi0gICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAgKipvdXRzeW1ib2xzOyAgICAgICAgICAgICAKLQotICAgICAvKiBQb2ludGVyIHRvIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24qLwotICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICphcmNoX2luZm87Ci0KLSAgICAgLyogU3R1ZmYgb25seSB1c2VmdWwgZm9yIGFyY2hpdmVzOiovCi0gICAgUFRSIGFyZWx0X2RhdGE7ICAgICAgICAgICAgICAKLSAgICBzdHJ1Y3QgX2JmZCAqbXlfYXJjaGl2ZTsgICAgICAvKiBUaGUgY29udGFpbmluZyBhcmNoaXZlIEJGRC4gICovCi0gICAgc3RydWN0IF9iZmQgKm5leHQ7ICAgICAgICAgICAgLyogVGhlIG5leHQgQkZEIGluIHRoZSBhcmNoaXZlLiAgKi8KLSAgICBzdHJ1Y3QgX2JmZCAqYXJjaGl2ZV9oZWFkOyAgICAvKiBUaGUgZmlyc3QgQkZEIGluIHRoZSBhcmNoaXZlLiAgKi8KLSAgICBib29sZWFuIGhhc19hcm1hcDsgICAgICAgICAgIAotCi0gICAgIC8qIEEgY2hhaW4gb2YgQkZEIHN0cnVjdHVyZXMgaW52b2x2ZWQgaW4gYSBsaW5rLiAgKi8KLSAgICBzdHJ1Y3QgX2JmZCAqbGlua19uZXh0OwotCi0gICAgIC8qIEEgZmllbGQgdXNlZCBieSBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzLiAgVGhpcyB3aWxsCi0gICAgICAgYmUgdXNlZCBvbmx5IGZvciBhcmNoaXZlIGVsZW1lbnRzLiAgKi8KLSAgICBpbnQgYXJjaGl2ZV9wYXNzOwotCi0gICAgIC8qIFVzZWQgYnkgdGhlIGJhY2sgZW5kIHRvIGhvbGQgcHJpdmF0ZSBkYXRhLiAqLwotCi0gICAgdW5pb24gCi0gICAgICB7Ci0gICAgICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqYW91dF9kYXRhOwotICAgICAgc3RydWN0IGFydGRhdGEgKmFvdXRfYXJfZGF0YTsKLSAgICAgIHN0cnVjdCBfb2FzeXNfZGF0YSAqb2FzeXNfb2JqX2RhdGE7Ci0gICAgICBzdHJ1Y3QgX29hc3lzX2FyX2RhdGEgKm9hc3lzX2FyX2RhdGE7Ci0gICAgICBzdHJ1Y3QgY29mZl90ZGF0YSAqY29mZl9vYmpfZGF0YTsKLSAgICAgIHN0cnVjdCBwZV90ZGF0YSAqcGVfb2JqX2RhdGE7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfdGRhdGEgKnhjb2ZmX29ial9kYXRhOwotICAgICAgc3RydWN0IGVjb2ZmX3RkYXRhICplY29mZl9vYmpfZGF0YTsKLSAgICAgIHN0cnVjdCBpZWVlX2RhdGFfc3RydWN0ICppZWVlX2RhdGE7Ci0gICAgICBzdHJ1Y3QgaWVlZV9hcl9kYXRhX3N0cnVjdCAqaWVlZV9hcl9kYXRhOwotICAgICAgc3RydWN0IHNyZWNfZGF0YV9zdHJ1Y3QgKnNyZWNfZGF0YTsKLSAgICAgIHN0cnVjdCBpaGV4X2RhdGFfc3RydWN0ICppaGV4X2RhdGE7Ci0gICAgICBzdHJ1Y3QgdGVraGV4X2RhdGFfc3RydWN0ICp0ZWtoZXhfZGF0YTsKLSAgICAgIHN0cnVjdCBlbGZfb2JqX3RkYXRhICplbGZfb2JqX2RhdGE7Ci0gICAgICBzdHJ1Y3QgbmxtX29ial90ZGF0YSAqbmxtX29ial9kYXRhOwotICAgICAgc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKmJvdXRfZGF0YTsKLSAgICAgIHN0cnVjdCBzdW5fY29yZV9zdHJ1Y3QgKnN1bl9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdCAqc2NvNV9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqdHJhZF9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3Qgc29tX2RhdGFfc3RydWN0ICpzb21fZGF0YTsKLSAgICAgIHN0cnVjdCBocHV4X2NvcmVfc3RydWN0ICpocHV4X2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCBocHBhYnNkX2NvcmVfc3RydWN0ICpocHBhYnNkX2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QgKnNnaV9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3QgbHlueF9jb3JlX3N0cnVjdCAqbHlueF9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3Qgb3NmX2NvcmVfc3RydWN0ICpvc2ZfY29yZV9kYXRhOwotICAgICAgc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0ICpjaXNjb19jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3QgdmVyc2Fkb3NfZGF0YV9zdHJ1Y3QgKnZlcnNhZG9zX2RhdGE7Ci0gICAgICBzdHJ1Y3QgbmV0YnNkX2NvcmVfc3RydWN0ICpuZXRic2RfY29yZV9kYXRhOwotICAgICAgUFRSIGFueTsKLSAgICAgIH0gdGRhdGE7Ci0gIAotICAgICAvKiBVc2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBob2xkIHByaXZhdGUgZGF0YSovCi0gICAgUFRSIHVzcmRhdGE7Ci0KLSAgIC8qIFdoZXJlIGFsbCB0aGUgYWxsb2NhdGVkIHN0dWZmIHVuZGVyIHRoaXMgQkZEIGdvZXMuICBUaGlzIGlzIGEKLSAgICAgc3RydWN0IG9iamFsbG9jICosIGJ1dCB3ZSB1c2UgUFRSIHRvIGF2b2lkIHJlcXVpcmluZyB0aGUgaW5jbHVzaW9uIG9mCi0gICAgIG9iamFsbG9jLmguICAqLwotICAgIFBUUiBtZW1vcnk7Ci19OwotCi10eXBlZGVmIGVudW0gYmZkX2Vycm9yCi17Ci0gIGJmZF9lcnJvcl9ub19lcnJvciA9IDAsCi0gIGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCwKLSAgYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0LAotICBiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0LAotICBiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24sCi0gIGJmZF9lcnJvcl9ub19tZW1vcnksCi0gIGJmZF9lcnJvcl9ub19zeW1ib2xzLAotICBiZmRfZXJyb3Jfbm9fYXJtYXAsCi0gIGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzLAotICBiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUsCi0gIGJmZF9lcnJvcl9maWxlX25vdF9yZWNvZ25pemVkLAotICBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkLAotICBiZmRfZXJyb3Jfbm9fY29udGVudHMsCi0gIGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24sCi0gIGJmZF9lcnJvcl9ub19kZWJ1Z19zZWN0aW9uLAotICBiZmRfZXJyb3JfYmFkX3ZhbHVlLAotICBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQsCi0gIGJmZF9lcnJvcl9maWxlX3Rvb19iaWcsCi0gIGJmZF9lcnJvcl9pbnZhbGlkX2Vycm9yX2NvZGUKLX0gYmZkX2Vycm9yX3R5cGU7Ci0KLWJmZF9lcnJvcl90eXBlIAotYmZkX2dldF9lcnJvciAgUEFSQU1TICgodm9pZCkpOwotCi12b2lkIAotYmZkX3NldF9lcnJvciAgUEFSQU1TICgoYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnKSk7Ci0KLUNPTlNUIGNoYXIgKgotYmZkX2Vycm1zZyAgUEFSQU1TICgoYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnKSk7Ci0KLXZvaWQgCi1iZmRfcGVycm9yICBQQVJBTVMgKChDT05TVCBjaGFyICptZXNzYWdlKSk7Ci0KLXR5cGVkZWYgdm9pZCAoKmJmZF9lcnJvcl9oYW5kbGVyX3R5cGUpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0KLWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgCi1iZmRfc2V0X2Vycm9yX2hhbmRsZXIgIFBBUkFNUyAoKGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUpKTsKLQotdm9pZCAKLWJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lICBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSAKLWJmZF9nZXRfZXJyb3JfaGFuZGxlciAgUEFSQU1TICgodm9pZCkpOwotCi1sb25nIAotYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0KSk7Ci0KLWxvbmcgCi1iZmRfY2Fub25pY2FsaXplX3JlbG9jCi0gUEFSQU1TICgoYmZkICphYmZkLAotICAgIGFzZWN0aW9uICpzZWMsCi0gICAgYXJlbGVudCAqKmxvYywKLSAgICBhc3ltYm9sICoqc3ltcykpOwotCi12b2lkIAotYmZkX3NldF9yZWxvYwotIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYXJlbGVudCAqKnJlbCwgdW5zaWduZWQgaW50IGNvdW50KQotICAgIAotICAgICk7Ci0KLWJvb2xlYW4gCi1iZmRfc2V0X2ZpbGVfZmxhZ3MgUEFSQU1TICgoYmZkICphYmZkLCBmbGFnd29yZCBmbGFncykpOwotCi1ib29sZWFuIAotYmZkX3NldF9zdGFydF9hZGRyZXNzIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3ZtYSB2bWEpKTsKLQotbG9uZyAKLWJmZF9nZXRfbXRpbWUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWxvbmcgCi1iZmRfZ2V0X3NpemUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWludCAKLWJmZF9nZXRfZ3Bfc2l6ZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotdm9pZCAKLWJmZF9zZXRfZ3Bfc2l6ZSBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBpKSk7Ci0KLWJmZF92bWEgCi1iZmRfc2Nhbl92bWEgUEFSQU1TICgoQ09OU1QgY2hhciAqc3RyaW5nLCBDT05TVCBjaGFyICoqZW5kLCBpbnQgYmFzZSkpOwotCi1ib29sZWFuIAotYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKmliZmQsIGJmZCAqb2JmZCkpOwotCi0jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEoaWJmZCwgb2JmZCkgXAotICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEsIFwKLSAgICAgICAgICAgICAgIChpYmZkLCBvYmZkKSkKLWJvb2xlYW4gCi1iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKmliZmQsIGJmZCAqb2JmZCkpOwotCi0jZGVmaW5lIGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKGliZmQsIG9iZmQpIFwKLSAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwgXAotICAgICAgICAgICAgICAgKGliZmQsIG9iZmQpKQotYm9vbGVhbiAKLWJmZF9zZXRfcHJpdmF0ZV9mbGFncyBQQVJBTVMgKChiZmQgKmFiZmQsIGZsYWd3b3JkIGZsYWdzKSk7Ci0KLSNkZWZpbmUgYmZkX3NldF9wcml2YXRlX2ZsYWdzKGFiZmQsIGZsYWdzKSBcCi0gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3NldF9wcml2YXRlX2ZsYWdzLCBcCi0gICAgICAgICAgICAgICAoYWJmZCwgZmxhZ3MpKQotI2RlZmluZSBiZmRfc2l6ZW9mX2hlYWRlcnMoYWJmZCwgcmVsb2MpIFwKLSAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2l6ZW9mX2hlYWRlcnMsIChhYmZkLCByZWxvYykpCi0KLSNkZWZpbmUgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKGFiZmQsIHNlYywgc3ltcywgb2ZmLCBmaWxlLCBmdW5jLCBsaW5lKSBcCi0gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2ZpbmRfbmVhcmVzdF9saW5lLCAgKGFiZmQsIHNlYywgc3ltcywgb2ZmLCBmaWxlLCBmdW5jLCBsaW5lKSkKLQotICAgICAgICAvKiBEbyB0aGVzZSB0aHJlZSBkbyBhbnl0aGluZyB1c2VmdWwgYXQgYWxsLCBmb3IgYW55IGJhY2sgZW5kPyAgKi8KLSNkZWZpbmUgYmZkX2RlYnVnX2luZm9fc3RhcnQoYWJmZCkgXAotICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0LCAoYWJmZCkpCi0KLSNkZWZpbmUgYmZkX2RlYnVnX2luZm9fZW5kKGFiZmQpIFwKLSAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19lbmQsIChhYmZkKSkKLQotI2RlZmluZSBiZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlKGFiZmQsIHNlY3Rpb24pIFwKLSAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlLCAoYWJmZCwgc2VjdGlvbikpCi0KLQotI2RlZmluZSBiZmRfc3RhdF9hcmNoX2VsdChhYmZkLCBzdGF0KSBcCi0gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3N0YXRfYXJjaF9lbHQsKGFiZmQsIHN0YXQpKQotCi0jZGVmaW5lIGJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKGFiZmQpIFwKLSAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCwgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9zZXRfYXJjaF9tYWNoKGFiZmQsIGFyY2gsIG1hY2gpXAotICAgICAgICBCRkRfU0VORCAoIGFiZmQsIF9iZmRfc2V0X2FyY2hfbWFjaCwgKGFiZmQsIGFyY2gsIG1hY2gpKQotCi0jZGVmaW5lIGJmZF9yZWxheF9zZWN0aW9uKGFiZmQsIHNlY3Rpb24sIGxpbmtfaW5mbywgYWdhaW4pIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9yZWxheF9zZWN0aW9uLCAoYWJmZCwgc2VjdGlvbiwgbGlua19pbmZvLCBhZ2FpbikpCi0KLSNkZWZpbmUgYmZkX2djX3NlY3Rpb25zKGFiZmQsIGxpbmtfaW5mbykgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2djX3NlY3Rpb25zLCAoYWJmZCwgbGlua19pbmZvKSkKLQotI2RlZmluZSBiZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZShhYmZkKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9saW5rX2FkZF9zeW1ib2xzKGFiZmQsIGluZm8pIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9saW5rX2FkZF9zeW1ib2xzLCAoYWJmZCwgaW5mbykpCi0KLSNkZWZpbmUgYmZkX2ZpbmFsX2xpbmsoYWJmZCwgaW5mbykgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2ZpbmFsX2xpbmssIChhYmZkLCBpbmZvKSkKLQotI2RlZmluZSBiZmRfZnJlZV9jYWNoZWRfaW5mbyhhYmZkKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZnJlZV9jYWNoZWRfaW5mbywgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQoYWJmZCkgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCwgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKGFiZmQsIGZpbGUpXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEsIChhYmZkLCBmaWxlKSkKLQotI2RlZmluZSBiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKGFiZmQsIGFzeW1ib2xzKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiLCAoYWJmZCwgYXN5bWJvbHMpKQotCi0jZGVmaW5lIGJmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZChhYmZkKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQsIChhYmZkKSkKLQotI2RlZmluZSBiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MoYWJmZCwgYXJlbHMsIGFzeW1zKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MsIChhYmZkLCBhcmVscywgYXN5bXMpKQotCi1leHRlcm4gYmZkX2J5dGUgKmJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgICAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLSAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICosIGJmZF9ieXRlICosCi0gICAgICAgICAgICAgICAgIGJvb2xlYW4sIGFzeW1ib2wgKiopKTsKLQotc3ltaW5kZXggCi1iZmRfZ2V0X25leHRfbWFwZW50IFBBUkFNUyAoKGJmZCAqYWJmZCwgc3ltaW5kZXggcHJldmlvdXMsIGNhcnN5bSAqKnN5bSkpOwotCi1ib29sZWFuIAotYmZkX3NldF9hcmNoaXZlX2hlYWQgUEFSQU1TICgoYmZkICpvdXRwdXQsIGJmZCAqbmV3X2hlYWQpKTsKLQotYmZkICoKLWJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgUEFSQU1TICgoYmZkICphcmNoaXZlLCBiZmQgKnByZXZpb3VzKSk7Ci0KLUNPTlNUIGNoYXIgKgotYmZkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWludCAKLWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWJvb2xlYW4gCi1jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLCBiZmQgKmV4ZWNfYmZkKSk7Ci0KLSNkZWZpbmUgQkZEX1NFTkQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCi0gICAgICAgICAgICAgICAoKCooKGJmZCktPnh2ZWMtPm1lc3NhZ2UpKSBhcmdsaXN0KQotCi0jaWZkZWYgREVCVUdfQkZEX1NFTkQKLSN1bmRlZiBCRkRfU0VORAotI2RlZmluZSBCRkRfU0VORChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLSAgKCgoYmZkKSAmJiAoYmZkKS0+eHZlYyAmJiAoYmZkKS0+eHZlYy0+bWVzc2FnZSkgPyBcCi0gICAgKCgqKChiZmQpLT54dmVjLT5tZXNzYWdlKSkgYXJnbGlzdCkgOiBcCi0gICAgKGJmZF9hc3NlcnQgKF9fRklMRV9fLF9fTElORV9fKSwgTlVMTCkpCi0jZW5kaWYKLSNkZWZpbmUgQkZEX1NFTkRfRk1UKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotICAgICAgICAgICAgKCgoYmZkKS0+eHZlYy0+bWVzc2FnZVsoaW50KSgoYmZkKS0+Zm9ybWF0KV0pIGFyZ2xpc3QpCi0KLSNpZmRlZiBERUJVR19CRkRfU0VORAotI3VuZGVmIEJGRF9TRU5EX0ZNVAotI2RlZmluZSBCRkRfU0VORF9GTVQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCi0gICgoKGJmZCkgJiYgKGJmZCktPnh2ZWMgJiYgKGJmZCktPnh2ZWMtPm1lc3NhZ2UpID8gXAotICAgKCgoYmZkKS0+eHZlYy0+bWVzc2FnZVsoaW50KSgoYmZkKS0+Zm9ybWF0KV0pIGFyZ2xpc3QpIDogXAotICAgKGJmZF9hc3NlcnQgKF9fRklMRV9fLF9fTElORV9fKSwgTlVMTCkpCi0jZW5kaWYKLWVudW0gYmZkX2ZsYXZvdXIgewotICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfaWVlZV9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X29hc3lzX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfdGVraGV4X2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyLAotICBiZmRfdGFyZ2V0X2loZXhfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9zb21fZmxhdm91ciwKLSAgYmZkX3RhcmdldF9vczlrX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfdmVyc2Fkb3NfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9tc2Rvc19mbGF2b3VyLAotICBiZmRfdGFyZ2V0X292YXhfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIKLX07Ci0KLWVudW0gYmZkX2VuZGlhbiB7IEJGRF9FTkRJQU5fQklHLCBCRkRfRU5ESUFOX0xJVFRMRSwgQkZEX0VORElBTl9VTktOT1dOIH07Ci0KLSAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0IGJmZF9saW5rX2luZm8gX2JmZF9saW5rX2luZm87Ci0KLXR5cGVkZWYgc3RydWN0IGJmZF90YXJnZXQKLXsKLSAgY2hhciAqbmFtZTsKLSAgZW51bSBiZmRfZmxhdm91ciBmbGF2b3VyOwotICBlbnVtIGJmZF9lbmRpYW4gYnl0ZW9yZGVyOwotICBlbnVtIGJmZF9lbmRpYW4gaGVhZGVyX2J5dGVvcmRlcjsKLSAgZmxhZ3dvcmQgb2JqZWN0X2ZsYWdzOyAgICAgICAKLSAgZmxhZ3dvcmQgc2VjdGlvbl9mbGFnczsKLSAgY2hhciBzeW1ib2xfbGVhZGluZ19jaGFyOwotICBjaGFyIGFyX3BhZF9jaGFyOyAgICAgICAgICAgIAotICB1bnNpZ25lZCBzaG9ydCBhcl9tYXhfbmFtZWxlbjsKLSAgYmZkX3ZtYSAgICAgICgqYmZkX2dldHg2NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9nZXR4X3NpZ25lZF82NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICB2b2lkICAgICAgICAgKCpiZmRfcHV0eDY0KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF92bWEgICAgICAoKmJmZF9nZXR4MzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgYmZkX3NpZ25lZF92bWEgKCpiZmRfZ2V0eF9zaWduZWRfMzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgdm9pZCAgICAgICAgICgqYmZkX3B1dHgzMikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotICBiZmRfdm1hICAgICAgKCpiZmRfZ2V0eDE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF9zaWduZWRfdm1hICgqYmZkX2dldHhfc2lnbmVkXzE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIHZvaWQgICAgICAgICAoKmJmZF9wdXR4MTYpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLSAgYmZkX3ZtYSAgICAgICgqYmZkX2hfZ2V0eDY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF9zaWduZWRfdm1hICgqYmZkX2hfZ2V0eF9zaWduZWRfNjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgdm9pZCAgICAgICAgICgqYmZkX2hfcHV0eDY0KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF92bWEgICAgICAoKmJmZF9oX2dldHgzMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9oX2dldHhfc2lnbmVkXzMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIHZvaWQgICAgICAgICAoKmJmZF9oX3B1dHgzMikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotICBiZmRfdm1hICAgICAgKCpiZmRfaF9nZXR4MTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgYmZkX3NpZ25lZF92bWEgKCpiZmRfaF9nZXR4X3NpZ25lZF8xNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICB2b2lkICAgICAgICAgKCpiZmRfaF9wdXR4MTYpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLSAgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKigqX2JmZF9jaGVja19mb3JtYXRbYmZkX3R5cGVfZW5kXSkgUEFSQU1TICgoYmZkICopKTsKLSAgYm9vbGVhbiAgICAgICAgICAgICAoKl9iZmRfc2V0X2Zvcm1hdFtiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOwotICBib29sZWFuICAgICAgICAgICAgICgqX2JmZF93cml0ZV9jb250ZW50c1tiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOwotCi0gICAvKiBHZW5lcmljIGVudHJ5IHBvaW50cy4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMoTkFNRSlcCi1DQVQoTkFNRSxfY2xvc2VfYW5kX2NsZWFudXApLFwKLUNBVChOQU1FLF9iZmRfZnJlZV9jYWNoZWRfaW5mbyksXAotQ0FUKE5BTUUsX25ld19zZWN0aW9uX2hvb2spLFwKLUNBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50cyksXAotQ0FUKE5BTUUsX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdykKLQotICAgLyogQ2FsbGVkIHdoZW4gdGhlIEJGRCBpcyBiZWluZyBjbG9zZWQgdG8gZG8gYW55IG5lY2Vzc2FyeSBjbGVhbnVwLiAgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9jbG9zZV9hbmRfY2xlYW51cCkgUEFSQU1TICgoYmZkICopKTsKLSAgIC8qIEFzayB0aGUgQkZEIHRvIGZyZWUgYWxsIGNhY2hlZCBpbmZvcm1hdGlvbi4gICovCi0gIGJvb2xlYW4gKCpfYmZkX2ZyZWVfY2FjaGVkX2luZm8pIFBBUkFNUyAoKGJmZCAqKSk7Ci0gICAvKiBDYWxsZWQgd2hlbiBhIG5ldyBzZWN0aW9uIGlzIGNyZWF0ZWQuICAqLwotICBib29sZWFuICAgICAgICgqX25ld19zZWN0aW9uX2hvb2spIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyKSk7Ci0gICAvKiBSZWFkIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICAqLwotICBib29sZWFuICAgICAgICgqX2JmZF9nZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0gIGJvb2xlYW4gICAgICAgKCpfYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIGJmZF93aW5kb3cgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotICAgLyogRW50cnkgcG9pbnRzIHRvIGNvcHkgcHJpdmF0ZSBkYXRhLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09QWShOQU1FKVwKLUNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKSxcCi1DQVQoTkFNRSxfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpLFwKLUNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSksXAotQ0FUKE5BTUUsX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpLFwKLUNBVChOQU1FLF9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpLFwKLUNBVChOQU1FLF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSlcCi0gICAvKiBDYWxsZWQgdG8gY29weSBCRkQgZ2VuZXJhbCBwcml2YXRlIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLSAgICAgdG8gYW5vdGhlci4gICovCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0gICAvKiBDYWxsZWQgdG8gbWVyZ2UgQkZEIGdlbmVyYWwgcHJpdmF0ZSBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0gICAgIHRvIGEgY29tbW9uIG91dHB1dCBmaWxlIHdoZW4gbGlua2luZy4gICovCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotICAgLyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc2VjdGlvbiBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0gICAgIHRvIGFub3RoZXIuICAqLwotICBib29sZWFuICAgICAgICgqX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKiwgc2VjX3B0cikpOwotICAgLyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc3ltYm9sIGRhdGEgZnJvbSBvbmUgc3ltYm9sIAotICAgICB0byBhbm90aGVyLiAgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZCAqLCBhc3ltYm9sICopKTsKLSAgIC8qIENhbGxlZCB0byBzZXQgcHJpdmF0ZSBiYWNrZW5kIGZsYWdzICovCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX3NldF9wcml2YXRlX2ZsYWdzKSBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLQotICAgLyogQ2FsbGVkIHRvIHByaW50IHByaXZhdGUgQkZEIGRhdGEgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi0gICAvKiBDb3JlIGZpbGUgZW50cnkgcG9pbnRzLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09SRShOQU1FKVwKLUNBVChOQU1FLF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKSxcCi1DQVQoTkFNRSxfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKSxcCi1DQVQoTkFNRSxfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKQotICBjaGFyICogICAoKl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKSBQQVJBTVMgKChiZmQgKikpOwotICBpbnQgICAgICAoKl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGJvb2xlYW4gICgqX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0KLSAgIC8qIEFyY2hpdmUgZW50cnkgcG9pbnRzLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQVJDSElWRShOQU1FKVwKLUNBVChOQU1FLF9zbHVycF9hcm1hcCksXAotQ0FUKE5BTUUsX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpLFwKLUNBVChOQU1FLF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSksXAotQ0FUKE5BTUUsX3RydW5jYXRlX2FybmFtZSksXAotQ0FUKE5BTUUsX3dyaXRlX2FybWFwKSxcCi1DQVQoTkFNRSxfcmVhZF9hcl9oZHIpLFwKLUNBVChOQU1FLF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpLFwKLUNBVChOQU1FLF9nZXRfZWx0X2F0X2luZGV4KSxcCi1DQVQoTkFNRSxfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KSxcCi1DQVQoTkFNRSxfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCkKLSAgYm9vbGVhbiAgKCpfYmZkX3NsdXJwX2FybWFwKSBQQVJBTVMgKChiZmQgKikpOwotICBib29sZWFuICAoKl9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSkgUEFSQU1TICgoYmZkICopKTsKLSAgYm9vbGVhbiAgKCpfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKQotICAgICAgICAgICAgIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKTsKLSAgdm9pZCAgICAgKCpfYmZkX3RydW5jYXRlX2FybmFtZSkgUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKiwgY2hhciAqKSk7Ci0gIGJvb2xlYW4gICgqd3JpdGVfYXJtYXApIFBBUkFNUyAoKGJmZCAqYXJjaCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcmwgKm1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkeCkpOwotICBQVFIgKCpfYmZkX3JlYWRfYXJfaGRyX2ZuKSBQQVJBTVMgKChiZmQgKikpOwotICBiZmQgKiAgICAoKm9wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSkgUEFSQU1TICgoYmZkICphcmNoLCBiZmQgKnByZXYpKTsKLSNkZWZpbmUgYmZkX2dldF9lbHRfYXRfaW5kZXgoYixpKSBCRkRfU0VORChiLCBfYmZkX2dldF9lbHRfYXRfaW5kZXgsIChiLGkpKQotICBiZmQgKiAgICAoKl9iZmRfZ2V0X2VsdF9hdF9pbmRleCkgUEFSQU1TICgoYmZkICosIHN5bWluZGV4KSk7Ci0gIGludCAgICAgICgqX2JmZF9zdGF0X2FyY2hfZWx0KSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOwotICBib29sZWFuICAoKl9iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCkgUEFSQU1TICgoYmZkICopKTsKLQotICAgLyogRW50cnkgcG9pbnRzIHVzZWQgZm9yIHN5bWJvbHMuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTKE5BTUUpXAotQ0FUKE5BTUUsX2dldF9zeW10YWJfdXBwZXJfYm91bmQpLFwKLUNBVChOQU1FLF9nZXRfc3ltdGFiKSxcCi1DQVQoTkFNRSxfbWFrZV9lbXB0eV9zeW1ib2wpLFwKLUNBVChOQU1FLF9wcmludF9zeW1ib2wpLFwKLUNBVChOQU1FLF9nZXRfc3ltYm9sX2luZm8pLFwKLUNBVChOQU1FLF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSksXAotQ0FUKE5BTUUsX2dldF9saW5lbm8pLFwKLUNBVChOQU1FLF9maW5kX25lYXJlc3RfbGluZSksXAotQ0FUKE5BTUUsX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCksXAotQ0FUKE5BTUUsX3JlYWRfbWluaXN5bWJvbHMpLFwKLUNBVChOQU1FLF9taW5pc3ltYm9sX3RvX3N5bWJvbCkKLSAgbG9uZyAgKCpfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfc3ltdGFiKSBQQVJBTVMgKChiZmQgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKLSAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAgKgotICAgICAgICAgICAgICAgICgqX2JmZF9tYWtlX2VtcHR5X3N5bWJvbCkgUEFSQU1TICgoYmZkICopKTsKLSAgdm9pZCAgICAgICAgICAoKl9iZmRfcHJpbnRfc3ltYm9sKSBQQVJBTVMgKChiZmQgKiwgUFRSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotI2RlZmluZSBiZmRfcHJpbnRfc3ltYm9sKGIscCxzLGUpIEJGRF9TRU5EKGIsIF9iZmRfcHJpbnRfc3ltYm9sLCAoYixwLHMsZSkpCi0gIHZvaWQgICAgICAgICAgKCpfYmZkX2dldF9zeW1ib2xfaW5mbykgUEFSQU1TICgoYmZkICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sX2luZm8gKikpOwotI2RlZmluZSBiZmRfZ2V0X3N5bWJvbF9pbmZvKGIscCxlKSBCRkRfU0VORChiLCBfYmZkX2dldF9zeW1ib2xfaW5mbywgKGIscCxlKSkKLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSkgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotCi0gIGFsZW50ICogICAgKCpfZ2V0X2xpbmVubykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKikpOwotICBib29sZWFuICAgICgqX2JmZF9maW5kX25lYXJlc3RfbGluZSkgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VjICpzZWN0aW9uLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9scywKLSAgICAgICAgICAgICAgICAgICAgYmZkX3ZtYSBvZmZzZXQsIENPTlNUIGNoYXIgKipmaWxlLCBDT05TVCBjaGFyICoqZnVuYywKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpsaW5lKSk7Ci0gIC8qIEJhY2stZG9vciB0byBhbGxvdyBmb3JtYXQtYXdhcmUgYXBwbGljYXRpb25zIHRvIGNyZWF0ZSBkZWJ1ZyBzeW1ib2xzCi0gICAgd2hpbGUgdXNpbmcgQkZEIGZvciBldmVyeXRoaW5nIGVsc2UuICBDdXJyZW50bHkgdXNlZCBieSB0aGUgYXNzZW1ibGVyCi0gICAgd2hlbiBjcmVhdGluZyBDT0ZGIGZpbGVzLiAgKi8KLSAgYXN5bWJvbCAqICAoKl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCwKLSAgICAgICB2b2lkICpwdHIsCi0gICAgICAgdW5zaWduZWQgbG9uZyBzaXplKSk7Ci0jZGVmaW5lIGJmZF9yZWFkX21pbmlzeW1ib2xzKGIsIGQsIG0sIHMpIFwKLSAgQkZEX1NFTkQgKGIsIF9yZWFkX21pbmlzeW1ib2xzLCAoYiwgZCwgbSwgcykpCi0gIGxvbmcgICgqX3JlYWRfbWluaXN5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICopKTsKLSNkZWZpbmUgYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sKGIsIGQsIG0sIGYpIFwKLSAgQkZEX1NFTkQgKGIsIF9taW5pc3ltYm9sX3RvX3N5bWJvbCwgKGIsIGQsIG0sIGYpKQotICBhc3ltYm9sICooKl9taW5pc3ltYm9sX3RvX3N5bWJvbCkgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW1ib2wgKikpOwotCi0gICAvKiBSb3V0aW5lcyBmb3IgcmVsb2NzLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfUkVMT0NTKE5BTUUpXAotQ0FUKE5BTUUsX2dldF9yZWxvY191cHBlcl9ib3VuZCksXAotQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9yZWxvYyksXAotQ0FUKE5BTUUsX2JmZF9yZWxvY190eXBlX2xvb2t1cCkKLSAgbG9uZyAgKCpfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0cikpOwotICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX3JlbG9jKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgYXJlbGVudCAqKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotICAgLyogU2VlIGRvY3VtZW50YXRpb24gb24gcmVsb2MgdHlwZXMuICAqLwotICByZWxvY19ob3d0b190eXBlICoKLSAgICAgICAoKnJlbG9jX3R5cGVfbG9va3VwKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotICAgLyogUm91dGluZXMgdXNlZCB3aGVuIHdyaXRpbmcgYW4gb2JqZWN0IGZpbGUuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9XUklURShOQU1FKVwKLUNBVChOQU1FLF9zZXRfYXJjaF9tYWNoKSxcCi1DQVQoTkFNRSxfc2V0X3NlY3Rpb25fY29udGVudHMpCi0gIGJvb2xlYW4gICAgKCpfYmZkX3NldF9hcmNoX21hY2gpIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcpKTsKLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfc2V0X3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLSAgIC8qIFJvdXRpbmVzIHVzZWQgYnkgdGhlIGxpbmtlci4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0xJTksoTkFNRSlcCi1DQVQoTkFNRSxfc2l6ZW9mX2hlYWRlcnMpLFwKLUNBVChOQU1FLF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSxcCi1DQVQoTkFNRSxfYmZkX3JlbGF4X3NlY3Rpb24pLFwKLUNBVChOQU1FLF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSksXAotQ0FUKE5BTUUsX2JmZF9saW5rX2FkZF9zeW1ib2xzKSxcCi1DQVQoTkFNRSxfYmZkX2ZpbmFsX2xpbmspLFwKLUNBVChOQU1FLF9iZmRfbGlua19zcGxpdF9zZWN0aW9uKSxcCi1DQVQoTkFNRSxfYmZkX2djX3NlY3Rpb25zKQotICBpbnQgICAgICAgICgqX2JmZF9zaXplb2ZfaGVhZGVycykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLSAgYmZkX2J5dGUgKiAoKl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKiwKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0gICAgICAgICAgICAgICAgICAgIGJmZF9ieXRlICpkYXRhLCBib29sZWFuIHJlbG9jYXRlYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotCi0gIGJvb2xlYW4gICAgKCpfYmZkX3JlbGF4X3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICosCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKmFnYWluKSk7Ci0KLSAgIC8qIENyZWF0ZSBhIGhhc2ggdGFibGUgZm9yIHRoZSBsaW5rZXIuICBEaWZmZXJlbnQgYmFja2VuZHMgc3RvcmUKLSAgICAgZGlmZmVyZW50IGluZm9ybWF0aW9uIGluIHRoaXMgdGFibGUuICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKCpfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLSAgIC8qIEFkZCBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QgZmlsZSBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgYm9vbGVhbiAoKl9iZmRfbGlua19hZGRfc3ltYm9scykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotICAgLyogRG8gYSBsaW5rIGJhc2VkIG9uIHRoZSBsaW5rX29yZGVyIHN0cnVjdHVyZXMgYXR0YWNoZWQgdG8gZWFjaAotICAgICBzZWN0aW9uIG9mIHRoZSBCRkQuICAqLwotICBib29sZWFuICgqX2JmZF9maW5hbF9saW5rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0gICAvKiBTaG91bGQgdGhpcyBzZWN0aW9uIGJlIHNwbGl0IHVwIGludG8gc21hbGxlciBwaWVjZXMgZHVyaW5nIGxpbmtpbmcuICAqLwotICBib29sZWFuICgqX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKTsKLQotICAgLyogUmVtb3ZlIHNlY3Rpb25zIHRoYXQgYXJlIG5vdCByZWZlcmVuY2VkIGZyb20gdGhlIG91dHB1dC4gICovCi0gIGJvb2xlYW4gKCpfYmZkX2djX3NlY3Rpb25zKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0gICAvKiBSb3V0aW5lcyB0byBoYW5kbGUgZHluYW1pYyBzeW1ib2xzIGFuZCByZWxvY3MuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDKE5BTUUpXAotQ0FUKE5BTUUsX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCksXAotQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiksXAotQ0FUKE5BTUUsX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKSxcCi1DQVQoTkFNRSxfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpCi0gICAvKiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2xzLiAqLwotICBsb25nICAoKl9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotICAgLyogUmVhZCBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYikKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotICAgLyogR2V0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgdGhlIGR5bmFtaWMgcmVsb2NzLiAgKi8KLSAgbG9uZyAgKCpfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotICAgLyogUmVhZCBpbiB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpCi0gICAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKLQotIFBUUiBiYWNrZW5kX2RhdGE7Ci19IGJmZF90YXJnZXQ7Ci1ib29sZWFuIAotYmZkX3NldF9kZWZhdWx0X3RhcmdldCAgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWJmZF9maW5kX3RhcmdldCBQQVJBTVMgKChDT05TVCBjaGFyICp0YXJnZXRfbmFtZSwgYmZkICphYmZkKSk7Ci0KLWNvbnN0IGNoYXIgKioKLWJmZF90YXJnZXRfbGlzdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWJvb2xlYW4gCi1iZmRfY2hlY2tfZm9ybWF0IFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX2Zvcm1hdCBmb3JtYXQpKTsKLQotYm9vbGVhbiAKLWJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9mb3JtYXQgZm9ybWF0LCBjaGFyICoqKm1hdGNoaW5nKSk7Ci0KLWJvb2xlYW4gCi1iZmRfc2V0X2Zvcm1hdCBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9mb3JtYXQgZm9ybWF0KSk7Ci0KLUNPTlNUIGNoYXIgKgotYmZkX2Zvcm1hdF9zdHJpbmcgUEFSQU1TICgoYmZkX2Zvcm1hdCBmb3JtYXQpKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2JmZC5jIGIvYmZkL2JmZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTdlOGYwLi4wMDAwMDAwCi0tLSBhL2JmZC9iZmQuYworKysgL2Rldi9udWxsCkBAIC0xLDExNTkgKzAsMCBAQAotLyogR2VuZXJpYyBCRkQgbGlicmFyeSBpbnRlcmZhY2UgYW5kIHN1cHBvcnQgcm91dGluZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQk8PHR5cGVkZWYgYmZkPj4KLQotCUEgQkZEIGhhcyB0eXBlIDw8YmZkPj47IG9iamVjdHMgb2YgdGhpcyB0eXBlIGFyZSB0aGUKLQljb3JuZXJzdG9uZSBvZiBhbnkgYXBwbGljYXRpb24gdXNpbmcgQkZELiBVc2luZyBCRkQKLQljb25zaXN0cyBvZiBtYWtpbmcgcmVmZXJlbmNlcyB0aG91Z2ggdGhlIEJGRCBhbmQgdG8gZGF0YSBpbiB0aGUgQkZELgotCi0JSGVyZSBpcyB0aGUgc3RydWN0dXJlIHRoYXQgZGVmaW5lcyB0aGUgdHlwZSA8PGJmZD4+LiAgSXQKLQljb250YWlucyB0aGUgbWFqb3IgZGF0YSBhYm91dCB0aGUgZmlsZSBhbmQgcG9pbnRlcnMKLQl0byB0aGUgcmVzdCBvZiB0aGUgZGF0YS4KLQotQ09ERV9GUkFHTUVOVAotLgotLnN0cnVjdCBfYmZkIAotLnsKLS4gICAgeyogVGhlIGZpbGVuYW1lIHRoZSBhcHBsaWNhdGlvbiBvcGVuZWQgdGhlIEJGRCB3aXRoLiAgKn0KLS4gICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7ICAgICAgICAgICAgICAgIAotLgotLiAgICB7KiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBqdW1wIHRhYmxlLiAgICAgICAgICAgICAqfQotLiAgICBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqeHZlYzsKLS4KLS4gICAgeyogVG8gYXZvaWQgZHJhZ2dpbmcgdG9vIG1hbnkgaGVhZGVyIGZpbGVzIGludG8gZXZlcnkgZmlsZSB0aGF0Ci0uICAgICAgIGluY2x1ZGVzIGA8PGJmZC5oPj4nLCBJT1NUUkVBTSBoYXMgYmVlbiBkZWNsYXJlZCBhcyBhICJjaGFyCi0uICAgICAgICoiLCBhbmQgTVRJTUUgYXMgYSAibG9uZyIuICBUaGVpciBjb3JyZWN0IHR5cGVzLCB0byB3aGljaCB0aGV5Ci0uICAgICAgIGFyZSBjYXN0IHdoZW4gdXNlZCwgYXJlICJGSUxFICoiIGFuZCAidGltZV90Ii4gICAgVGhlIGlvc3RyZWFtCi0uICAgICAgIGlzIHRoZSByZXN1bHQgb2YgYW4gZm9wZW4gb24gdGhlIGZpbGVuYW1lLiAgSG93ZXZlciwgaWYgdGhlCi0uICAgICAgIEJGRF9JTl9NRU1PUlkgZmxhZyBpcyBzZXQsIHRoZW4gaW9zdHJlYW0gaXMgYWN0dWFsbHkgYSBwb2ludGVyCi0uICAgICAgIHRvIGEgYmZkX2luX21lbW9yeSBzdHJ1Y3QuICAqfQotLiAgICBQVFIgaW9zdHJlYW07Ci0uCi0uICAgIHsqIElzIHRoZSBmaWxlIGRlc2NyaXB0b3IgYmVpbmcgY2FjaGVkPyAgVGhhdCBpcywgY2FuIGl0IGJlIGNsb3NlZCBhcwotLiAgICAgICBuZWVkZWQsIGFuZCByZS1vcGVuZWQgd2hlbiBhY2Nlc3NlZCBsYXRlcj8gICp9Ci0uCi0uICAgIGJvb2xlYW4gY2FjaGVhYmxlOwotLgotLiAgICB7KiBNYXJrcyB3aGV0aGVyIHRoZXJlIHdhcyBhIGRlZmF1bHQgdGFyZ2V0IHNwZWNpZmllZCB3aGVuIHRoZQotLiAgICAgICBCRkQgd2FzIG9wZW5lZC4gVGhpcyBpcyB1c2VkIHRvIHNlbGVjdCB3aGljaCBtYXRjaGluZyBhbGdvcml0aG0KLS4gICAgICAgdG8gdXNlIHRvIGNob29zZSB0aGUgYmFjayBlbmQuICp9Ci0uCi0uICAgIGJvb2xlYW4gdGFyZ2V0X2RlZmF1bHRlZDsKLS4KLS4gICAgeyogVGhlIGNhY2hpbmcgcm91dGluZXMgdXNlIHRoZXNlIHRvIG1haW50YWluIGEKLS4gICAgICAgbGVhc3QtcmVjZW50bHktdXNlZCBsaXN0IG9mIEJGRHMgKn0KLS4KLS4gICAgc3RydWN0IF9iZmQgKmxydV9wcmV2LCAqbHJ1X25leHQ7Ci0uCi0uICAgIHsqIFdoZW4gYSBmaWxlIGlzIGNsb3NlZCBieSB0aGUgY2FjaGluZyByb3V0aW5lcywgQkZEIHJldGFpbnMKLS4gICAgICAgc3RhdGUgaW5mb3JtYXRpb24gb24gdGhlIGZpbGUgaGVyZTogKn0KLS4KLS4gICAgZmlsZV9wdHIgd2hlcmU7ICAgICAgICAgICAgICAKLS4KLS4gICAgeyogYW5kIGhlcmU6IChgYG9uY2UnJyBtZWFucyBhdCBsZWFzdCBvbmNlKSAqfQotLgotLiAgICBib29sZWFuIG9wZW5lZF9vbmNlOwotLgotLiAgICB7KiBTZXQgaWYgd2UgaGF2ZSBhIGxvY2FsbHkgbWFpbnRhaW5lZCBtdGltZSB2YWx1ZSwgcmF0aGVyIHRoYW4KLS4gICAgICAgZ2V0dGluZyBpdCBmcm9tIHRoZSBmaWxlIGVhY2ggdGltZTogKn0KLS4KLS4gICAgYm9vbGVhbiBtdGltZV9zZXQ7Ci0uCi0uICAgIHsqIEZpbGUgbW9kaWZpZWQgdGltZSwgaWYgbXRpbWVfc2V0IGlzIHRydWU6ICp9Ci0uCi0uICAgIGxvbmcgbXRpbWU7ICAgICAgICAgIAotLgotLiAgICB7KiBSZXNlcnZlZCBmb3IgYW4gdW5pbXBsZW1lbnRlZCBmaWxlIGxvY2tpbmcgZXh0ZW5zaW9uLip9Ci0uCi0uICAgIGludCBpZmQ7Ci0uCi0uICAgIHsqIFRoZSBmb3JtYXQgd2hpY2ggYmVsb25ncyB0byB0aGUgQkZELiAob2JqZWN0LCBjb3JlLCBldGMuKSAqfQotLgotLiAgICBiZmRfZm9ybWF0IGZvcm1hdDsKLS4KLS4gICAgeyogVGhlIGRpcmVjdGlvbiB0aGUgQkZEIHdhcyBvcGVuZWQgd2l0aCp9Ci0uCi0uICAgIGVudW0gYmZkX2RpcmVjdGlvbiB7bm9fZGlyZWN0aW9uID0gMCwKLS4gICAgICAgICAgICAgICAgICAgICAgICByZWFkX2RpcmVjdGlvbiA9IDEsCi0uICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZGlyZWN0aW9uID0gMiwKLS4gICAgICAgICAgICAgICAgICAgICAgICBib3RoX2RpcmVjdGlvbiA9IDN9IGRpcmVjdGlvbjsKLS4KLS4gICAgeyogRm9ybWF0X3NwZWNpZmljIGZsYWdzKn0KLS4KLS4gICAgZmxhZ3dvcmQgZmxhZ3M7ICAgICAgICAgICAgICAKLS4KLS4gICAgeyogQ3VycmVudGx5IG15X2FyY2hpdmUgaXMgdGVzdGVkIGJlZm9yZSBhZGRpbmcgb3JpZ2luIHRvCi0uICAgICAgIGFueXRoaW5nLiBJIGJlbGlldmUgdGhhdCB0aGlzIGNhbiBiZWNvbWUgYWx3YXlzIGFuIGFkZCBvZgotLiAgICAgICBvcmlnaW4sIHdpdGggb3JpZ2luIHNldCB0byAwIGZvciBub24gYXJjaGl2ZSBmaWxlcy4gICAqfQotLgotLiAgICBmaWxlX3B0ciBvcmlnaW47ICAgICAgICAgICAgIAotLgotLiAgICB7KiBSZW1lbWJlciB3aGVuIG91dHB1dCBoYXMgYmVndW4sIHRvIHN0b3Agc3RyYW5nZSB0aGluZ3MKLS4gICAgICAgZnJvbSBoYXBwZW5pbmcuICp9Ci0uICAgIGJvb2xlYW4gb3V0cHV0X2hhc19iZWd1bjsKLS4KLS4gICAgeyogUG9pbnRlciB0byBsaW5rZWQgbGlzdCBvZiBzZWN0aW9ucyp9Ci0uICAgIHN0cnVjdCBzZWMgICpzZWN0aW9uczsKLS4KLS4gICAgeyogVGhlIG51bWJlciBvZiBzZWN0aW9ucyAqfQotLiAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9jb3VudDsKLS4KLS4gICAgeyogU3R1ZmYgb25seSB1c2VmdWwgZm9yIG9iamVjdCBmaWxlczogCi0uICAgICAgIFRoZSBzdGFydCBhZGRyZXNzLiAqfQotLiAgICBiZmRfdm1hIHN0YXJ0X2FkZHJlc3M7Ci0uCi0uICAgIHsqIFVzZWQgZm9yIGlucHV0IGFuZCBvdXRwdXQqfQotLiAgICB1bnNpZ25lZCBpbnQgc3ltY291bnQ7Ci0uCi0uICAgIHsqIFN5bWJvbCB0YWJsZSBmb3Igb3V0cHV0IEJGRCAod2l0aCBzeW1jb3VudCBlbnRyaWVzKSAqfQotLiAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICAqKm91dHN5bWJvbHM7ICAgICAgICAgICAgIAotLgotLiAgICB7KiBQb2ludGVyIHRvIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24qfQotLiAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYXJjaF9pbmZvOwotLgotLiAgICB7KiBTdHVmZiBvbmx5IHVzZWZ1bCBmb3IgYXJjaGl2ZXM6Kn0KLS4gICAgUFRSIGFyZWx0X2RhdGE7ICAgICAgICAgICAgICAKLS4gICAgc3RydWN0IF9iZmQgKm15X2FyY2hpdmU7ICAgICB7KiBUaGUgY29udGFpbmluZyBhcmNoaXZlIEJGRC4gICp9Ci0uICAgIHN0cnVjdCBfYmZkICpuZXh0OyAgICAgICAgICAgeyogVGhlIG5leHQgQkZEIGluIHRoZSBhcmNoaXZlLiAgKn0KLS4gICAgc3RydWN0IF9iZmQgKmFyY2hpdmVfaGVhZDsgICB7KiBUaGUgZmlyc3QgQkZEIGluIHRoZSBhcmNoaXZlLiAgKn0KLS4gICAgYm9vbGVhbiBoYXNfYXJtYXA7ICAgICAgICAgICAKLS4KLS4gICAgeyogQSBjaGFpbiBvZiBCRkQgc3RydWN0dXJlcyBpbnZvbHZlZCBpbiBhIGxpbmsuICAqfQotLiAgICBzdHJ1Y3QgX2JmZCAqbGlua19uZXh0OwotLgotLiAgICB7KiBBIGZpZWxkIHVzZWQgYnkgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scy4gIFRoaXMgd2lsbAotLiAgICAgICBiZSB1c2VkIG9ubHkgZm9yIGFyY2hpdmUgZWxlbWVudHMuICAqfQotLiAgICBpbnQgYXJjaGl2ZV9wYXNzOwotLgotLiAgICB7KiBVc2VkIGJ5IHRoZSBiYWNrIGVuZCB0byBob2xkIHByaXZhdGUgZGF0YS4gKn0KLS4KLS4gICAgdW5pb24gCi0uICAgICAgewotLiAgICAgIHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICphb3V0X2RhdGE7Ci0uICAgICAgc3RydWN0IGFydGRhdGEgKmFvdXRfYXJfZGF0YTsKLS4gICAgICBzdHJ1Y3QgX29hc3lzX2RhdGEgKm9hc3lzX29ial9kYXRhOwotLiAgICAgIHN0cnVjdCBfb2FzeXNfYXJfZGF0YSAqb2FzeXNfYXJfZGF0YTsKLS4gICAgICBzdHJ1Y3QgY29mZl90ZGF0YSAqY29mZl9vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgcGVfdGRhdGEgKnBlX29ial9kYXRhOwotLiAgICAgIHN0cnVjdCB4Y29mZl90ZGF0YSAqeGNvZmZfb2JqX2RhdGE7Ci0uICAgICAgc3RydWN0IGVjb2ZmX3RkYXRhICplY29mZl9vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgaWVlZV9kYXRhX3N0cnVjdCAqaWVlZV9kYXRhOwotLiAgICAgIHN0cnVjdCBpZWVlX2FyX2RhdGFfc3RydWN0ICppZWVlX2FyX2RhdGE7Ci0uICAgICAgc3RydWN0IHNyZWNfZGF0YV9zdHJ1Y3QgKnNyZWNfZGF0YTsKLS4gICAgICBzdHJ1Y3QgaWhleF9kYXRhX3N0cnVjdCAqaWhleF9kYXRhOwotLiAgICAgIHN0cnVjdCB0ZWtoZXhfZGF0YV9zdHJ1Y3QgKnRla2hleF9kYXRhOwotLiAgICAgIHN0cnVjdCBlbGZfb2JqX3RkYXRhICplbGZfb2JqX2RhdGE7Ci0uICAgICAgc3RydWN0IG5sbV9vYmpfdGRhdGEgKm5sbV9vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCAqYm91dF9kYXRhOwotLiAgICAgIHN0cnVjdCBzdW5fY29yZV9zdHJ1Y3QgKnN1bl9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IHNjbzVfY29yZV9zdHJ1Y3QgKnNjbzVfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0ICp0cmFkX2NvcmVfZGF0YTsKLS4gICAgICBzdHJ1Y3Qgc29tX2RhdGFfc3RydWN0ICpzb21fZGF0YTsKLS4gICAgICBzdHJ1Y3QgaHB1eF9jb3JlX3N0cnVjdCAqaHB1eF9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IGhwcGFic2RfY29yZV9zdHJ1Y3QgKmhwcGFic2RfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QgKnNnaV9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QgKmx5bnhfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBvc2ZfY29yZV9zdHJ1Y3QgKm9zZl9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0ICpjaXNjb19jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IHZlcnNhZG9zX2RhdGFfc3RydWN0ICp2ZXJzYWRvc19kYXRhOwotLiAgICAgIHN0cnVjdCBuZXRic2RfY29yZV9zdHJ1Y3QgKm5ldGJzZF9jb3JlX2RhdGE7Ci0uICAgICAgUFRSIGFueTsKLS4gICAgICB9IHRkYXRhOwotLiAgCi0uICAgIHsqIFVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIGhvbGQgcHJpdmF0ZSBkYXRhKn0KLS4gICAgUFRSIHVzcmRhdGE7Ci0uCi0uICB7KiBXaGVyZSBhbGwgdGhlIGFsbG9jYXRlZCBzdHVmZiB1bmRlciB0aGlzIEJGRCBnb2VzLiAgVGhpcyBpcyBhCi0uICAgICBzdHJ1Y3Qgb2JqYWxsb2MgKiwgYnV0IHdlIHVzZSBQVFIgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZSBpbmNsdXNpb24gb2YKLS4gICAgIG9iamFsbG9jLmguICAqfQotLiAgICBQVFIgbWVtb3J5OwotLn07Ci0uCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0jdW5kZWYgb2JqX3N5bWJvbHMKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotDAotLyogcHJvdmlkZSBzdG9yYWdlIGZvciBzdWJzeXN0ZW0sIHN0YWNrIGFuZCBoZWFwIGRhdGEgd2hpY2ggbWF5IGhhdmUgYmVlbgotICAgcGFzc2VkIGluIG9uIHRoZSBjb21tYW5kIGxpbmUuICBMZCBwdXRzIHRoaXMgZGF0YSBpbnRvIGEgYmZkX2xpbmtfaW5mbwotICAgc3RydWN0IHdoaWNoIHVsdGltYXRlbHkgZ2V0cyBwYXNzZWQgaW4gdG8gdGhlIGJmZC4gIFdoZW4gaXQgYXJyaXZlcywgY29weQotICAgaXQgdG8gdGhlIGZvbGxvd2luZyBzdHJ1Y3Qgc28gdGhhdCB0aGUgZGF0YSB3aWxsIGJlIGF2YWlsYWJsZSBpbiBjb2ZmY29kZS5oCi0gICB3aGVyZSBpdCBpcyBuZWVkZWQuICBUaGUgdHlwZWRlZidzIHVzZWQgYXJlIGRlZmluZWQgaW4gYmZkLmggKi8KLQotCi0MCi0vKgotU0VDVElPTgotCUVycm9yIHJlcG9ydGluZwotCi0JTW9zdCBCRkQgZnVuY3Rpb25zIHJldHVybiBub256ZXJvIG9uIHN1Y2Nlc3MgKGNoZWNrIHRoZWlyCi0JaW5kaXZpZHVhbCBkb2N1bWVudGF0aW9uIGZvciBwcmVjaXNlIHNlbWFudGljcykuICBPbiBhbiBlcnJvciwKLQl0aGV5IGNhbGwgPDxiZmRfc2V0X2Vycm9yPj4gdG8gc2V0IGFuIGVycm9yIGNvbmRpdGlvbiB0aGF0IGNhbGxlcnMKLQljYW4gY2hlY2sgYnkgY2FsbGluZyA8PGJmZF9nZXRfZXJyb3I+Pi4KLSAgICAgICAgSWYgdGhhdCByZXR1cm5zIDw8YmZkX2Vycm9yX3N5c3RlbV9jYWxsPj4sIHRoZW4gY2hlY2sKLQk8PGVycm5vPj4uCi0KLQlUaGUgZWFzaWVzdCB3YXkgdG8gcmVwb3J0IGEgQkZEIGVycm9yIHRvIHRoZSB1c2VyIGlzIHRvCi0JdXNlIDw8YmZkX3BlcnJvcj4+LgotCi1TVUJTRUNUSU9OCi0JVHlwZSA8PGJmZF9lcnJvcl90eXBlPj4KLQotCVRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgPDxiZmRfZ2V0X2Vycm9yPj4gYXJlIGRlZmluZWQgYnkgdGhlCi0JZW51bWVyYXRlZCB0eXBlIDw8YmZkX2Vycm9yX3R5cGU+Pi4KLQotQ09ERV9GUkFHTUVOVAotLgotLnR5cGVkZWYgZW51bSBiZmRfZXJyb3IKLS57Ci0uICBiZmRfZXJyb3Jfbm9fZXJyb3IgPSAwLAotLiAgYmZkX2Vycm9yX3N5c3RlbV9jYWxsLAotLiAgYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0LAotLiAgYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCwKLS4gIGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbiwKLS4gIGJmZF9lcnJvcl9ub19tZW1vcnksCi0uICBiZmRfZXJyb3Jfbm9fc3ltYm9scywKLS4gIGJmZF9lcnJvcl9ub19hcm1hcCwKLS4gIGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzLAotLiAgYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlLAotLiAgYmZkX2Vycm9yX2ZpbGVfbm90X3JlY29nbml6ZWQsCi0uICBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkLAotLiAgYmZkX2Vycm9yX25vX2NvbnRlbnRzLAotLiAgYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbiwKLS4gIGJmZF9lcnJvcl9ub19kZWJ1Z19zZWN0aW9uLAotLiAgYmZkX2Vycm9yX2JhZF92YWx1ZSwKLS4gIGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCwKLS4gIGJmZF9lcnJvcl9maWxlX3Rvb19iaWcsCi0uICBiZmRfZXJyb3JfaW52YWxpZF9lcnJvcl9jb2RlCi0ufSBiZmRfZXJyb3JfdHlwZTsKLS4KLSovCi0KLXN0YXRpYyBiZmRfZXJyb3JfdHlwZSBiZmRfZXJyb3IgPSBiZmRfZXJyb3Jfbm9fZXJyb3I7Ci0KLUNPTlNUIGNoYXIgKkNPTlNUIGJmZF9lcnJtc2dzW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTm8gZXJyb3IiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJTeXN0ZW0gY2FsbCBlcnJvciIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkludmFsaWQgYmZkIHRhcmdldCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkZpbGUgaW4gd3JvbmcgZm9ybWF0IiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiSW52YWxpZCBvcGVyYXRpb24iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJNZW1vcnkgZXhoYXVzdGVkIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTm8gc3ltYm9scyIpLAotCQkJTl8oIkFyY2hpdmUgaGFzIG5vIGluZGV4OyBydW4gcmFubGliIHRvIGFkZCBvbmUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJObyBtb3JlIGFyY2hpdmVkIGZpbGVzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTWFsZm9ybWVkIGFyY2hpdmUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkZpbGUgZm9ybWF0IGlzIGFtYmlndW91cyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIlNlY3Rpb24gaGFzIG5vIGNvbnRlbnRzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTm9ucmVwcmVzZW50YWJsZSBzZWN0aW9uIG9uIG91dHB1dCIpLAotCQkJTl8oIlN5bWJvbCBuZWVkcyBkZWJ1ZyBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGV4aXN0IiksCi0JCQlOXygiQmFkIHZhbHVlIiksCi0JCQlOXygiRmlsZSB0cnVuY2F0ZWQiKSwKLQkJCU5fKCJGaWxlIHRvbyBiaWciKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCIjPEludmFsaWQgZXJyb3IgY29kZT4iKQotICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X2Vycm9yCi0KLVNZTk9QU0lTCi0JYmZkX2Vycm9yX3R5cGUgYmZkX2dldF9lcnJvciAodm9pZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBjdXJyZW50IEJGRCBlcnJvciBjb25kaXRpb24uCi0qLwotCi1iZmRfZXJyb3JfdHlwZQotYmZkX2dldF9lcnJvciAoKQotewotICByZXR1cm4gYmZkX2Vycm9yOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2Vycm9yCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfdHlwZSBlcnJvcl90YWcpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgQkZEIGVycm9yIGNvbmRpdGlvbiB0byBiZSBAdmFye2Vycm9yX3RhZ30uCi0qLwotCi12b2lkCi1iZmRfc2V0X2Vycm9yIChlcnJvcl90YWcpCi0gICAgIGJmZF9lcnJvcl90eXBlIGVycm9yX3RhZzsKLXsKLSAgYmZkX2Vycm9yID0gZXJyb3JfdGFnOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZXJybXNnCi0KLVNZTk9QU0lTCi0JQ09OU1QgY2hhciAqYmZkX2Vycm1zZyAoYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IgQHZhcntlcnJvcl90YWd9LCBvcgotCXRoZSBzeXN0ZW0gZXJyb3IgaWYgQHZhcntlcnJvcl90YWd9IGlzIDw8YmZkX2Vycm9yX3N5c3RlbV9jYWxsPj4uCi0qLwotCi1DT05TVCBjaGFyICoKLWJmZF9lcnJtc2cgKGVycm9yX3RhZykKLSAgICAgYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnOwotewotI2lmbmRlZiBlcnJubwotICBleHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0gIGlmIChlcnJvcl90YWcgPT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotICAgIHJldHVybiB4c3RyZXJyb3IgKGVycm5vKTsKLQotICBpZiAoKCgoaW50KWVycm9yX3RhZyA8KGludCkgYmZkX2Vycm9yX25vX2Vycm9yKSB8fAotICAgICAgICgoaW50KWVycm9yX3RhZyA+IChpbnQpYmZkX2Vycm9yX2ludmFsaWRfZXJyb3JfY29kZSkpKQotICAgIGVycm9yX3RhZyA9IGJmZF9lcnJvcl9pbnZhbGlkX2Vycm9yX2NvZGU7Lyogc2FuaXR5IGNoZWNrICovCi0KLSAgcmV0dXJuIF8oYmZkX2Vycm1zZ3MgWyhpbnQpZXJyb3JfdGFnXSk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9wZXJyb3IKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9wZXJyb3IgKENPTlNUIGNoYXIgKm1lc3NhZ2UpOwotCi1ERVNDUklQVElPTgotCVByaW50IHRvIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUKLQlsYXN0IEJGRCBlcnJvciB0aGF0IG9jY3VycmVkLCBvciB0aGUgbGFzdCBzeXN0ZW0gZXJyb3IgaWYKLQl0aGUgbGFzdCBCRkQgZXJyb3Igd2FzIGEgc3lzdGVtIGNhbGwgZmFpbHVyZS4gIElmIEB2YXJ7bWVzc2FnZX0KLQlpcyBub24tTlVMTCBhbmQgbm9uLWVtcHR5LCB0aGUgZXJyb3Igc3RyaW5nIHByaW50ZWQgaXMgcHJlY2VkZWQKLQlieSBAdmFye21lc3NhZ2V9LCBhIGNvbG9uLCBhbmQgYSBzcGFjZS4gIEl0IGlzIGZvbGxvd2VkIGJ5IGEgbmV3bGluZS4KLSovCi0KLXZvaWQKLWJmZF9wZXJyb3IgKG1lc3NhZ2UpCi0gICAgIENPTlNUIGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICBwZXJyb3IoKGNoYXIgKiltZXNzYWdlKTsgICAgICAgICAgICAvKiBtdXN0IGJlIHN5c3RlbSBlcnJvciB0aGVuLi4uICovCi0gIGVsc2UgewotICAgIGlmIChtZXNzYWdlID09IE5VTEwgfHwgKm1lc3NhZ2UgPT0gJ1wwJykKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgZWxzZQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBtZXNzYWdlLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gIH0KLX0KLQotLyoKLVNVQlNFQ1RJT04KLQlCRkQgZXJyb3IgaGFuZGxlcgotCi0JU29tZSBCRkQgZnVuY3Rpb25zIHdhbnQgdG8gcHJpbnQgbWVzc2FnZXMgZGVzY3JpYmluZyB0aGUKLQlwcm9ibGVtLiAgVGhleSBjYWxsIGEgQkZEIGVycm9yIGhhbmRsZXIgZnVuY3Rpb24uICBUaGlzCi0JZnVuY3Rpb24gbWF5IGJlIG92ZXJyaWRlbiBieSB0aGUgcHJvZ3JhbS4KLQotCVRoZSBCRkQgZXJyb3IgaGFuZGxlciBhY3RzIGxpa2UgcHJpbnRmLgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0udHlwZWRlZiB2b2lkICgqYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSkgUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKTsKLS4KLSovCi0KLS8qIFRoZSBwcm9ncmFtIG5hbWUgdXNlZCB3aGVuIHByaW50aW5nIEJGRCBlcnJvciBtZXNzYWdlcy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZTsKLQotLyogVGhpcyBpcyB0aGUgZGVmYXVsdCByb3V0aW5lIHRvIGhhbmRsZSBCRkQgZXJyb3IgbWVzc2FnZXMuICAqLwotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0KLXN0YXRpYyB2b2lkIF9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnMsIC4uLikpOwotCi1zdGF0aWMgdm9pZAotX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXIgKGNvbnN0IGNoYXIgKnMsIC4uLikKLXsKLSAgdmFfbGlzdCBwOwotCi0gIGlmIChfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZSAhPSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsICJCRkQ6ICIpOwotCi0gIHZhX3N0YXJ0IChwLCBzKTsKLQotICB2ZnByaW50ZiAoc3RkZXJyLCBzLCBwKTsKLQotICB2YV9lbmQgKHApOwotCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci19Ci0KLSNlbHNlIC8qICEgZGVmaW5lZCAoQU5TSV9QUk9UT1RZUEVTKSAqLwotCi1zdGF0aWMgdm9pZCBfYmZkX2RlZmF1bHRfZXJyb3JfaGFuZGxlciAoKTsKLQotc3RhdGljIHZvaWQKLV9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi17Ci0gIHZhX2xpc3QgcDsKLSAgY29uc3QgY2hhciAqczsKLQotICBpZiAoX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUpOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiQkZEOiAiKTsKLQotICB2YV9zdGFydCAocCk7Ci0KLSAgcyA9IHZhX2FyZyAocCwgY29uc3QgY2hhciAqKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgcywgcCk7Ci0KLSAgdmFfZW5kIChwKTsKLQotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotfQotCi0jZW5kaWYgLyogISBkZWZpbmVkIChBTlNJX1BST1RPVFlQRVMpICovCi0KLS8qIFRoaXMgaXMgYSBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSByb3V0aW5lIHdoaWNoIHNob3VsZCBoYW5kbGUgQkZECi0gICBlcnJvciBtZXNzYWdlcy4gIEl0IGlzIGNhbGxlZCB3aGVuIGEgQkZEIHJvdXRpbmUgZW5jb3VudGVycyBhbgotICAgZXJyb3IgZm9yIHdoaWNoIGl0IHdhbnRzIHRvIHByaW50IGEgbWVzc2FnZS4gIEdvaW5nIHRocm91Z2ggYQotICAgZnVuY3Rpb24gcG9pbnRlciBwZXJtaXRzIGEgcHJvZ3JhbSBsaW5rZWQgYWdhaW5zdCBCRkQgdG8gaW50ZXJjZXB0Ci0gICB0aGUgbWVzc2FnZXMgYW5kIGRlYWwgd2l0aCB0aGVtIGl0c2VsZi4gICovCi0KLWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgX2JmZF9lcnJvcl9oYW5kbGVyID0gX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXI7Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfZXJyb3JfaGFuZGxlcgotCi1TWU5PUFNJUwotCWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgYmZkX3NldF9lcnJvcl9oYW5kbGVyIChiZmRfZXJyb3JfaGFuZGxlcl90eXBlKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIEJGRCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLiAgUmV0dXJucyB0aGUgcHJldmlvdXMKLQlmdW5jdGlvbi4KLSovCi0KLWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUKLWJmZF9zZXRfZXJyb3JfaGFuZGxlciAocG5ldykKLSAgICAgYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSBwbmV3OwotewotICBiZmRfZXJyb3JfaGFuZGxlcl90eXBlIHBvbGQ7Ci0KLSAgcG9sZCA9IF9iZmRfZXJyb3JfaGFuZGxlcjsKLSAgX2JmZF9lcnJvcl9oYW5kbGVyID0gcG5ldzsKLSAgcmV0dXJuIHBvbGQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSAoY29uc3QgY2hhciAqKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIHByb2dyYW0gbmFtZSB0byB1c2Ugd2hlbiBwcmludGluZyBhIEJGRCBlcnJvci4gIFRoaXMKLQlpcyBwcmludGVkIGJlZm9yZSB0aGUgZXJyb3IgbWVzc2FnZSBmb2xsb3dlZCBieSBhIGNvbG9uIGFuZAotCXNwYWNlLiAgVGhlIHN0cmluZyBtdXN0IG5vdCBiZSBjaGFuZ2VkIGFmdGVyIGl0IGlzIHBhc3NlZCB0bwotCXRoaXMgZnVuY3Rpb24uCi0qLwotCi12b2lkCi1iZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUgPSBuYW1lOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfZXJyb3JfaGFuZGxlcgotCi1TWU5PUFNJUwotCWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgYmZkX2dldF9lcnJvcl9oYW5kbGVyICh2b2lkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIEJGRCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLgotKi8KLQotYmZkX2Vycm9yX2hhbmRsZXJfdHlwZQotYmZkX2dldF9lcnJvcl9oYW5kbGVyICgpCi17Ci0gIHJldHVybiBfYmZkX2Vycm9yX2hhbmRsZXI7Ci19Ci0MCi0vKgotU0VDVElPTgotCVN5bWJvbHMKLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLQotU1lOT1BTSVMKLQlsb25nIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlCi0JcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggc2VjdGlvbiBAdmFye3NlY3R9Ci0JYXR0YWNoZWQgdG8gYmZkIEB2YXJ7YWJmZH0uICBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybiAtMS4KLQotKi8KLQotCi1sb25nCi1iZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHJldHVybiBCRkRfU0VORCAoYWJmZCwgX2dldF9yZWxvY191cHBlcl9ib3VuZCwgKGFiZmQsIGFzZWN0KSk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jYW5vbmljYWxpemVfcmVsb2MKLQotU1lOT1BTSVMKLQlsb25nIGJmZF9jYW5vbmljYWxpemVfcmVsb2MKLSAgICAgICAgCShiZmQgKmFiZmQsCi0JCWFzZWN0aW9uICpzZWMsCi0JCWFyZWxlbnQgKipsb2MsCi0JCWFzeW1ib2wJKipzeW1zKTsKLQotREVTQ1JJUFRJT04KLQlDYWxsIHRoZSBiYWNrIGVuZCBhc3NvY2lhdGVkIHdpdGggdGhlIG9wZW4gQkZECi0JQHZhcnthYmZkfSBhbmQgdHJhbnNsYXRlIHRoZSBleHRlcm5hbCBmb3JtIG9mIHRoZSByZWxvY2F0aW9uCi0JaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gQHZhcntzZWN9IGludG8gdGhlIGludGVybmFsIGNhbm9uaWNhbAotCWZvcm0uICBQbGFjZSB0aGUgdGFibGUgaW50byBtZW1vcnkgYXQgQHZhcntsb2N9LCB3aGljaCBoYXMKLQliZWVuIHByZWFsbG9jYXRlZCwgdXN1YWxseSBieSBhIGNhbGwgdG8KLQk8PGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQ+Pi4gIFJldHVybnMgdGhlIG51bWJlciBvZiByZWxvY3MsIG9yCi0JLTEgb24gZXJyb3IuCi0KLQlUaGUgQHZhcntzeW1zfSB0YWJsZSBpcyBhbHNvIG5lZWRlZCBmb3IgaG9ycmlibGUgaW50ZXJuYWwgbWFnaWMKLQlyZWFzb25zLgotCi0KLSovCi1sb25nCi1iZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBhc2VjdCwgbG9jYXRpb24sIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLSAgICAgYXJlbGVudCAqKmxvY2F0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCBfYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYywKLQkJICAgKGFiZmQsIGFzZWN0LCBsb2NhdGlvbiwgc3ltYm9scykpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X3JlbG9jCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X3JlbG9jCi0JICAoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBhcmVsZW50ICoqcmVsLCB1bnNpZ25lZCBpbnQgY291bnQpCi0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSByZWxvY2F0aW9uIHBvaW50ZXIgYW5kIGNvdW50IHdpdGhpbgotCXNlY3Rpb24gQHZhcntzZWN9IHRvIHRoZSB2YWx1ZXMgQHZhcntyZWx9IGFuZCBAdmFye2NvdW50fS4KLQlUaGUgYXJndW1lbnQgQHZhcnthYmZkfSBpcyBpZ25vcmVkLgotCi0qLwotLypBUkdTVVNFRCovCi12b2lkCi1iZmRfc2V0X3JlbG9jIChpZ25vcmVfYWJmZCwgYXNlY3QsIGxvY2F0aW9uLCBjb3VudCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLSAgICAgYXJlbGVudCAqKmxvY2F0aW9uOwotICAgICB1bnNpZ25lZCBpbnQgY291bnQ7Ci17Ci0gIGFzZWN0LT5vcmVsb2NhdGlvbiA9IGxvY2F0aW9uOwotICBhc2VjdC0+cmVsb2NfY291bnQgPSBjb3VudDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9maWxlX2ZsYWdzCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X2ZpbGVfZmxhZ3MoYmZkICphYmZkLCBmbGFnd29yZCBmbGFncyk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBmbGFnIHdvcmQgaW4gdGhlIEJGRCBAdmFye2FiZmR9IHRvIHRoZSB2YWx1ZSBAdmFye2ZsYWdzfS4KLQotCVBvc3NpYmxlIGVycm9ycyBhcmU6Ci0JbyA8PGJmZF9lcnJvcl93cm9uZ19mb3JtYXQ+PiAtIFRoZSB0YXJnZXQgYmZkIHdhcyBub3Qgb2Ygb2JqZWN0IGZvcm1hdC4KLQlvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLSBUaGUgdGFyZ2V0IGJmZCB3YXMgb3BlbiBmb3IgcmVhZGluZy4KLQlvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLQotCVRoZSBmbGFnIHdvcmQgY29udGFpbmVkIGEgYml0IHdoaWNoIHdhcyBub3QgYXBwbGljYWJsZSB0byB0aGUKLQl0eXBlIG9mIGZpbGUuICBFLmcuLCBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIHNldCB0aGUgPDxEX1BBR0VEPj4gYml0Ci0Jb24gYSBCRkQgZm9ybWF0IHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgZGVtYW5kIHBhZ2luZy4KLQotKi8KLQotYm9vbGVhbgotYmZkX3NldF9maWxlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICphYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGJmZF9yZWFkX3AgKGFiZmQpKSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpID0gZmxhZ3M7Ci0gIGlmICgoZmxhZ3MgJiBiZmRfYXBwbGljYWJsZV9maWxlX2ZsYWdzIChhYmZkKSkgIT0gZmxhZ3MpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi1yZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZAotYmZkX2Fzc2VydCAoZmlsZSwgbGluZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLSAgICAgaW50IGxpbmU7Ci17Ci0gICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiYmZkIGFzc2VydGlvbiBmYWlsICVzOiVkIiksIGZpbGUsIGxpbmUpOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfc3RhcnRfYWRkcmVzcwotCi1TWU5PUFNJUwotIAlib29sZWFuIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyhiZmQgKmFiZmQsIGJmZF92bWEgdm1hKTsKLQotREVTQ1JJUFRJT04KLQlNYWtlIEB2YXJ7dm1hfSB0aGUgZW50cnkgcG9pbnQgb2Ygb3V0cHV0IEJGRCBAdmFye2FiZmR9LgotCi1SRVRVUk5TCi0JUmV0dXJucyA8PHRydWU+PiBvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb3RoZXJ3aXNlLgotKi8KLQotYm9vbGVhbgotYmZkX3NldF9zdGFydF9hZGRyZXNzKGFiZmQsIHZtYSkKLWJmZCAqYWJmZDsKLWJmZF92bWEgdm1hOwotewotICBhYmZkLT5zdGFydF9hZGRyZXNzID0gdm1hOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X210aW1lCi0KLVNZTk9QU0lTCi0JbG9uZyBiZmRfZ2V0X210aW1lKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lIChhcyByZWFkIGZyb20gdGhlIGZpbGUgc3lzdGVtLCBvcgotCWZyb20gdGhlIGFyY2hpdmUgaGVhZGVyIGZvciBhcmNoaXZlIG1lbWJlcnMpLgotCi0qLwotCi1sb25nCi1iZmRfZ2V0X210aW1lIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEZJTEUgKmZwOwotICBzdHJ1Y3Qgc3RhdCBidWY7Ci0KLSAgaWYgKGFiZmQtPm10aW1lX3NldCkKLSAgICByZXR1cm4gYWJmZC0+bXRpbWU7Ci0KLSAgZnAgPSBiZmRfY2FjaGVfbG9va3VwIChhYmZkKTsKLSAgaWYgKDAgIT0gZnN0YXQgKGZpbGVubyAoZnApLCAmYnVmKSkKLSAgICByZXR1cm4gMDsKLQotICBhYmZkLT5tdGltZSA9IGJ1Zi5zdF9tdGltZTsJCS8qIFNhdmUgdmFsdWUgaW4gY2FzZSBhbnlvbmUgd2FudHMgaXQgKi8KLSAgcmV0dXJuIGJ1Zi5zdF9tdGltZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9zaXplCi0KLVNZTk9QU0lTCi0JbG9uZyBiZmRfZ2V0X3NpemUoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIGZpbGUgc2l6ZSAoYXMgcmVhZCBmcm9tIGZpbGUgc3lzdGVtKSBmb3IgdGhlIGZpbGUKLQlhc3NvY2lhdGVkIHdpdGggQkZEIEB2YXJ7YWJmZH0uCi0KLQlUaGUgaW5pdGlhbCBtb3RpdmF0aW9uIGZvciwgYW5kIHVzZSBvZiwgdGhpcyByb3V0aW5lIGlzIG5vdAotCXNvIHdlIGNhbiBnZXQgdGhlIGV4YWN0IHNpemUgb2YgdGhlIG9iamVjdCB0aGUgQkZEIGFwcGxpZXMgdG8sIHNpbmNlCi0JdGhhdCBtaWdodCBub3QgYmUgZ2VuZXJhbGx5IHBvc3NpYmxlIChhcmNoaXZlIG1lbWJlcnMgZm9yIGV4YW1wbGUpLgotCUl0IHdvdWxkIGJlIGlkZWFsIGlmIHNvbWVvbmUgY291bGQgZXZlbnR1YWxseSBtb2RpZnkKLQlpdCBzbyB0aGF0IHN1Y2ggcmVzdWx0cyB3ZXJlIGd1YXJhbnRlZWQuCi0KLQlJbnN0ZWFkLCB3ZSB3YW50IHRvIGFzayBxdWVzdGlvbnMgbGlrZSAiaXMgdGhpcyBOTk4gYnl0ZSBzaXplZAotCW9iamVjdCBJJ20gYWJvdXQgdG8gdHJ5IHJlYWQgZnJvbSBmaWxlIG9mZnNldCBZWVkgcmVhc29uYWJsZT8iCi0JQXMgYXMgZXhhbXBsZSBvZiB3aGVyZSB3ZSBtaWdodCBkbyB0aGlzLCBzb21lIG9iamVjdCBmb3JtYXRzCi0JdXNlIHN0cmluZyB0YWJsZXMgZm9yIHdoaWNoIHRoZSBmaXJzdCA8PHNpemVvZihsb25nKT4+IGJ5dGVzIG9mIHRoZQotCXRhYmxlIGNvbnRhaW4gdGhlIHNpemUgb2YgdGhlIHRhYmxlIGl0c2VsZiwgaW5jbHVkaW5nIHRoZSBzaXplIGJ5dGVzLgotCUlmIGFuIGFwcGxpY2F0aW9uIHRyaWVzIHRvIHJlYWQgd2hhdCBpdCB0aGlua3MgaXMgb25lIG9mIHRoZXNlCi0Jc3RyaW5nIHRhYmxlcywgd2l0aG91dCBzb21lIHdheSB0byB2YWxpZGF0ZSB0aGUgc2l6ZSwgYW5kIGZvcgotCXNvbWUgcmVhc29uIHRoZSBzaXplIGlzIHdyb25nIChieXRlIHN3YXBwaW5nIGVycm9yLCB3cm9uZyBsb2NhdGlvbgotCWZvciB0aGUgc3RyaW5nIHRhYmxlLCBldGMuKSwgdGhlIG9ubHkgY2x1ZSBpcyBsaWtlbHkgdG8gYmUgYSByZWFkCi0JZXJyb3Igd2hlbiBpdCB0cmllcyB0byByZWFkIHRoZSB0YWJsZSwgb3IgYSAidmlydHVhbCBtZW1vcnkKLQlleGhhdXN0ZWQiIGVycm9yIHdoZW4gaXQgdHJpZXMgdG8gYWxsb2NhdGUgMTUgYmF6aWxsb24gYnl0ZXMKLQlvZiBzcGFjZSBmb3IgdGhlIDE1IGJhemlsbG9uIGJ5dGUgdGFibGUgaXQgaXMgYWJvdXQgdG8gcmVhZC4KLQlUaGlzIGZ1bmN0aW9uIGF0IGxlYXN0IGFsbG93cyB1cyB0byBhbnN3ZXIgdGhlIHF1ZXNpb24sICJpcyB0aGUKLQlzaXplIHJlYXNvbmFibGU/Ii4KLSovCi0KLWxvbmcKLWJmZF9nZXRfc2l6ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBGSUxFICpmcDsKLSAgc3RydWN0IHN0YXQgYnVmOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQotICAgIHJldHVybiAoKHN0cnVjdCBiZmRfaW5fbWVtb3J5ICopIGFiZmQtPmlvc3RyZWFtKS0+c2l6ZTsKLQotICBmcCA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICBpZiAoMCAhPSBmc3RhdCAoZmlsZW5vIChmcCksICZidWYpKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiBidWYuc3Rfc2l6ZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9ncF9zaXplCi0KLVNZTk9QU0lTCi0JaW50IGJmZF9nZXRfZ3Bfc2l6ZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbWF4aW11bSBzaXplIG9mIG9iamVjdHMgdG8gYmUgb3B0aW1pemVkIHVzaW5nIHRoZSBHUAotCXJlZ2lzdGVyIHVuZGVyIE1JUFMgRUNPRkYuICBUaGlzIGlzIHR5cGljYWxseSBzZXQgYnkgdGhlIDw8LUc+PgotCWFyZ3VtZW50IHRvIHRoZSBjb21waWxlciwgYXNzZW1ibGVyIG9yIGxpbmtlci4KLSovCi0KLWludAotYmZkX2dldF9ncF9zaXplIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT5mb3JtYXQgPT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0JcmV0dXJuIGVjb2ZmX2RhdGEgKGFiZmQpLT5ncF9zaXplOwotICAgICAgZWxzZSBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXJldHVybiBlbGZfZ3Bfc2l6ZSAoYWJmZCk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9ncF9zaXplCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X2dwX3NpemUoYmZkICphYmZkLCBpbnQgaSk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBtYXhpbXVtIHNpemUgb2Ygb2JqZWN0cyB0byBiZSBvcHRpbWl6ZWQgdXNpbmcgdGhlIEdQCi0JcmVnaXN0ZXIgdW5kZXIgRUNPRkYgb3IgTUlQUyBFTEYuICBUaGlzIGlzIHR5cGljYWxseSBzZXQgYnkKLQl0aGUgPDwtRz4+IGFyZ3VtZW50IHRvIHRoZSBjb21waWxlciwgYXNzZW1ibGVyIG9yIGxpbmtlci4KLSovCi0KLXZvaWQKLWJmZF9zZXRfZ3Bfc2l6ZSAoYWJmZCwgaSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgaTsKLXsKLSAgLyogRG9uJ3QgdHJ5IHRvIHNldCBHUCBzaXplIG9uIGFuIGFyY2hpdmUgb3IgY29yZSBmaWxlISAqLwotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuOwotICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0gICAgZWNvZmZfZGF0YSAoYWJmZCktPmdwX3NpemUgPSBpOwotICBlbHNlIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgZWxmX2dwX3NpemUgKGFiZmQpID0gaTsKLX0KLQotLyogR2V0IHRoZSBHUCB2YWx1ZS4gIFRoaXMgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBieSBzb21lIG9mIHRoZQotICAgcmVsb2NhdGlvbiBzcGVjaWFsX2Z1bmN0aW9uIHJvdXRpbmVzIG9uIHRhcmdldHMgd2hpY2ggc3VwcG9ydCBhIEdQCi0gICByZWdpc3Rlci4gICovCi0KLWJmZF92bWEKLV9iZmRfZ2V0X2dwX3ZhbHVlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT5mb3JtYXQgPT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0JcmV0dXJuIGVjb2ZmX2RhdGEgKGFiZmQpLT5ncDsKLSAgICAgIGVsc2UgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQlyZXR1cm4gZWxmX2dwIChhYmZkKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBTZXQgdGhlIEdQIHZhbHVlLiAgKi8KLQotdm9pZAotX2JmZF9zZXRfZ3BfdmFsdWUgKGFiZmQsIHYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3ZtYSB2OwotewotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuOwotICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0gICAgZWNvZmZfZGF0YSAoYWJmZCktPmdwID0gdjsKLSAgZWxzZSBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIGVsZl9ncCAoYWJmZCkgPSB2OwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2Nhbl92bWEKLQotU1lOT1BTSVMKLQliZmRfdm1hIGJmZF9zY2FuX3ZtYShDT05TVCBjaGFyICpzdHJpbmcsIENPTlNUIGNoYXIgKiplbmQsIGludCBiYXNlKTsKLQotREVTQ1JJUFRJT04KLQlDb252ZXJ0LCBsaWtlIDw8c3RydG91bD4+LCBhIG51bWVyaWNhbCBleHByZXNzaW9uCi0JQHZhcntzdHJpbmd9IGludG8gYSA8PGJmZF92bWE+PiBpbnRlZ2VyLCBhbmQgcmV0dXJuIHRoYXQgaW50ZWdlci4KLQkoVGhvdWdoIHdpdGhvdXQgYXMgbWFueSBiZWxscyBhbmQgd2hpc3RsZXMgYXMgPDxzdHJ0b3VsPj4uKQotCVRoZSBleHByZXNzaW9uIGlzIGFzc3VtZWQgdG8gYmUgdW5zaWduZWQgKGkuZS4sIHBvc2l0aXZlKS4KLQlJZiBnaXZlbiBhIEB2YXJ7YmFzZX0sIGl0IGlzIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGNvbnZlcnNpb24uCi0JQSBiYXNlIG9mIDAgY2F1c2VzIHRoZSBmdW5jdGlvbiB0byBpbnRlcnByZXQgdGhlIHN0cmluZwotCWluIGhleCBpZiBhIGxlYWRpbmcgIjB4IiBvciAiMFgiIGlzIGZvdW5kLCBvdGhlcndpc2UKLQlpbiBvY3RhbCBpZiBhIGxlYWRpbmcgemVybyBpcyBmb3VuZCwgb3RoZXJ3aXNlIGluIGRlY2ltYWwuCi0KLQlPdmVyZmxvdyBpcyBub3QgZGV0ZWN0ZWQuCi0qLwotCi1iZmRfdm1hCi1iZmRfc2Nhbl92bWEgKHN0cmluZywgZW5kLCBiYXNlKQotICAgICBDT05TVCBjaGFyICpzdHJpbmc7Ci0gICAgIENPTlNUIGNoYXIgKiplbmQ7Ci0gICAgIGludCBiYXNlOwotewotICBiZmRfdm1hIHZhbHVlOwotICBpbnQgZGlnaXQ7Ci0KLSAgLyogTGV0IHRoZSBob3N0IGRvIGl0IGlmIHBvc3NpYmxlLiAgKi8KLSAgaWYgKHNpemVvZihiZmRfdm1hKSA8PSBzaXplb2YodW5zaWduZWQgbG9uZykpCi0gICAgcmV0dXJuIChiZmRfdm1hKSBzdHJ0b3VsIChzdHJpbmcsIChjaGFyICoqKSBlbmQsIGJhc2UpOwotCi0gIC8qIEEgbmVnYXRpdmUgYmFzZSBtYWtlcyBubyBzZW5zZSwgYW5kIHdlIG9ubHkgbmVlZCB0byBnbyBhcyBoaWdoIGFzIGhleC4gICovCi0gIGlmICgoYmFzZSA8IDApIHx8IChiYXNlID4gMTYpKQotICAgIHJldHVybiAoYmZkX3ZtYSkgMDsKLQotICBpZiAoYmFzZSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChzdHJpbmdbMF0gPT0gJzAnKQotCXsKLQkgIGlmICgoc3RyaW5nWzFdID09ICd4JykgfHwgKHN0cmluZ1sxXSA9PSAnWCcpKQotCSAgICBiYXNlID0gMTY7Ci0JICAvKiBYWFggc2hvdWxkIHdlIGFsc28gYWxsb3cgIjBiIiBvciAiMEIiIHRvIHNldCBiYXNlIHRvIDI/ICovCi0JICBlbHNlCi0JICAgIGJhc2UgPSA4OwotCX0KLSAgICAgIGVsc2UKLQliYXNlID0gMTA7Ci0gICAgfQotICBpZiAoKGJhc2UgPT0gMTYpICYmCi0gICAgICAoc3RyaW5nWzBdID09ICcwJykgJiYgKChzdHJpbmdbMV0gPT0gJ3gnKSB8fCAoc3RyaW5nWzFdID09ICdYJykpKQotICAgIHN0cmluZyArPSAyOwotICAvKiBYWFggc2hvdWxkIHdlIGFsc28gc2tpcCBvdmVyICIwYiIgb3IgIjBCIiBpZiBiYXNlIGlzIDI/ICovCi0gICAgCi0vKiBTcGVlZCBjb3VsZCBiZSBpbXByb3ZlZCB3aXRoIGEgdGFibGUgbGlrZSBoZXhfdmFsdWVbXSBpbiBnYXMuICAqLwotI2RlZmluZSBIRVhfVkFMVUUoYykgXAotICAoaXN4ZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBjKQkJCQkJXAotICAgPyAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpCQkJCVwKLSAgICAgID8gKGMgLSAnMCcpCQkJCQkJXAotICAgICAgOiAoMTAgKyBjIC0gKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSBjKSA/ICdhJyA6ICdBJykpKQlcCi0gICA6IDQyKQotCi0gIGZvciAodmFsdWUgPSAwOyAoZGlnaXQgPSBIRVhfVkFMVUUoKnN0cmluZykpIDwgYmFzZTsgc3RyaW5nKyspCi0gICAgewotICAgICAgdmFsdWUgPSB2YWx1ZSAqIGJhc2UgKyBkaWdpdDsKLSAgICB9Ci0KLSAgaWYgKGVuZCkKLSAgICAqZW5kID0gc3RyaW5nOwotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YShiZmQgKmliZmQsIGJmZCAqb2JmZCk7Ci0KLURFU0NSSVBUSU9OCi0JQ29weSBwcml2YXRlIEJGRCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCRkQgQHZhcntpYmZkfSB0byB0aGUgCi0JdGhlIEJGRCBAdmFye29iZmR9LiAgUmV0dXJuIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4KLQlQb3NzaWJsZSBlcnJvciByZXR1cm5zIGFyZToKLQotCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotCU5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29iZmR9LgotCi0uI2RlZmluZSBiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKGliZmQsIG9iZmQpIFwKLS4gICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSwgXAotLgkJKGliZmQsIG9iZmQpKQotCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEoYmZkICppYmZkLCBiZmQgKm9iZmQpOwotCi1ERVNDUklQVElPTgotCU1lcmdlIHByaXZhdGUgQkZEIGluZm9ybWF0aW9uIGZyb20gdGhlIEJGRCBAdmFye2liZmR9IHRvIHRoZSAKLQl0aGUgb3V0cHV0IGZpbGUgQkZEIEB2YXJ7b2JmZH0gd2hlbiBsaW5raW5nLiAgUmV0dXJuIDw8dHJ1ZT4+Ci0Jb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLiAgUG9zc2libGUgZXJyb3IgcmV0dXJucyBhcmU6Ci0KLQlvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KLQlOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvYmZkfS4KLQotLiNkZWZpbmUgYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEoaWJmZCwgb2JmZCkgXAotLiAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwgXAotLgkJKGliZmQsIG9iZmQpKQotCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyhiZmQgKmFiZmQsIGZsYWd3b3JkIGZsYWdzKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgcHJpdmF0ZSBCRkQgZmxhZyBpbmZvcm1hdGlvbiBpbiB0aGUgQkZEIEB2YXJ7YWJmZH0uCi0JUmV0dXJuIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yCi0JcmV0dXJucyBhcmU6Ci0KLQlvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KLQlOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvYmZkfS4KLQotLiNkZWZpbmUgYmZkX3NldF9wcml2YXRlX2ZsYWdzKGFiZmQsIGZsYWdzKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9zZXRfcHJpdmF0ZV9mbGFncywgXAotLgkJKGFiZmQsIGZsYWdzKSkKLQotKi8KLQotLyoKLUZVTkNUSU9OCi0Jc3R1ZmYKLQotREVTQ1JJUFRJT04KLQlTdHVmZiB3aGljaCBzaG91bGQgYmUgZG9jdW1lbnRlZDoKLQotLiNkZWZpbmUgYmZkX3NpemVvZl9oZWFkZXJzKGFiZmQsIHJlbG9jKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9zaXplb2ZfaGVhZGVycywgKGFiZmQsIHJlbG9jKSkKLS4KLS4jZGVmaW5lIGJmZF9maW5kX25lYXJlc3RfbGluZShhYmZkLCBzZWMsIHN5bXMsIG9mZiwgZmlsZSwgZnVuYywgbGluZSkgXAotLiAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZmluZF9uZWFyZXN0X2xpbmUsICAoYWJmZCwgc2VjLCBzeW1zLCBvZmYsIGZpbGUsIGZ1bmMsIGxpbmUpKQotLgotLiAgICAgICB7KiBEbyB0aGVzZSB0aHJlZSBkbyBhbnl0aGluZyB1c2VmdWwgYXQgYWxsLCBmb3IgYW55IGJhY2sgZW5kPyAgKn0KLS4jZGVmaW5lIGJmZF9kZWJ1Z19pbmZvX3N0YXJ0KGFiZmQpIFwKLS4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2RlYnVnX2luZm9fc3RhcnQsIChhYmZkKSkKLS4KLS4jZGVmaW5lIGJmZF9kZWJ1Z19pbmZvX2VuZChhYmZkKSBcCi0uICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9kZWJ1Z19pbmZvX2VuZCwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZShhYmZkLCBzZWN0aW9uKSBcCi0uICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUsIChhYmZkLCBzZWN0aW9uKSkKLS4KLS4KLS4jZGVmaW5lIGJmZF9zdGF0X2FyY2hfZWx0KGFiZmQsIHN0YXQpIFwKLS4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3N0YXRfYXJjaF9lbHQsKGFiZmQsIHN0YXQpKQotLgotLiNkZWZpbmUgYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAoYWJmZCkgXAotLiAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX3NldF9hcmNoX21hY2goYWJmZCwgYXJjaCwgbWFjaClcCi0uICAgICAgICBCRkRfU0VORCAoIGFiZmQsIF9iZmRfc2V0X2FyY2hfbWFjaCwgKGFiZmQsIGFyY2gsIG1hY2gpKQotLgotLiNkZWZpbmUgYmZkX3JlbGF4X3NlY3Rpb24oYWJmZCwgc2VjdGlvbiwgbGlua19pbmZvLCBhZ2FpbikgXAotLiAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9yZWxheF9zZWN0aW9uLCAoYWJmZCwgc2VjdGlvbiwgbGlua19pbmZvLCBhZ2FpbikpCi0uCi0uI2RlZmluZSBiZmRfZ2Nfc2VjdGlvbnMoYWJmZCwgbGlua19pbmZvKSBcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX2djX3NlY3Rpb25zLCAoYWJmZCwgbGlua19pbmZvKSkKLS4KLS4jZGVmaW5lIGJmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKGFiZmQpIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2xpbmtfYWRkX3N5bWJvbHMoYWJmZCwgaW5mbykgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9saW5rX2FkZF9zeW1ib2xzLCAoYWJmZCwgaW5mbykpCi0uCi0uI2RlZmluZSBiZmRfZmluYWxfbGluayhhYmZkLCBpbmZvKSBcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX2ZpbmFsX2xpbmssIChhYmZkLCBpbmZvKSkKLS4KLS4jZGVmaW5lIGJmZF9mcmVlX2NhY2hlZF9pbmZvKGFiZmQpIFwKLS4gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZnJlZV9jYWNoZWRfaW5mbywgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZChhYmZkKSBcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEoYWJmZCwgZmlsZSlcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEsIChhYmZkLCBmaWxlKSkKLS4KLS4jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIoYWJmZCwgYXN5bWJvbHMpIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiLCAoYWJmZCwgYXN5bWJvbHMpKQotLgotLiNkZWZpbmUgYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKGFiZmQpIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQsIChhYmZkKSkKLS4KLS4jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyhhYmZkLCBhcmVscywgYXN5bXMpIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MsIChhYmZkLCBhcmVscywgYXN5bXMpKQotLgotLmV4dGVybiBiZmRfYnl0ZSAqYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotLglQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLS4JCSAgc3RydWN0IGJmZF9saW5rX29yZGVyICosIGJmZF9ieXRlICosCi0uCQkgIGJvb2xlYW4sIGFzeW1ib2wgKiopKTsKLS4KLQotKi8KLQotYmZkX2J5dGUgKgotYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCBkYXRhLAotCQkJCSAgICByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBiZmQgKmFiZmQyOwotICBiZmRfYnl0ZSAqKCpmbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgYmZkX2J5dGUgKiwgYm9vbGVhbiwKLQkJCSAgIGFzeW1ib2wgKiopKTsKLQotICBpZiAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLSAgICB7Ci0gICAgICBhYmZkMiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0gICAgICBpZiAoYWJmZDIgPT0gMCkKLQlhYmZkMiA9IGFiZmQ7Ci0gICAgfQotICBlbHNlCi0gICAgYWJmZDIgPSBhYmZkOwotICBmbiA9IGFiZmQyLT54dmVjLT5fYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50czsKLQotICByZXR1cm4gKCpmbikgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKTsKLX0KLQotLyogUmVjb3JkIGluZm9ybWF0aW9uIGFib3V0IGFuIEVMRiBwcm9ncmFtIGhlYWRlci4gICovCi0KLWJvb2xlYW4KLWJmZF9yZWNvcmRfcGhkciAoYWJmZCwgdHlwZSwgZmxhZ3NfdmFsaWQsIGZsYWdzLCBhdF92YWxpZCwgYXQsCi0JCSBpbmNsdWRlc19maWxlaGRyLCBpbmNsdWRlc19waGRycywgY291bnQsIHNlY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbG9uZyB0eXBlOwotICAgICBib29sZWFuIGZsYWdzX3ZhbGlkOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYm9vbGVhbiBhdF92YWxpZDsKLSAgICAgYmZkX3ZtYSBhdDsKLSAgICAgYm9vbGVhbiBpbmNsdWRlc19maWxlaGRyOwotICAgICBib29sZWFuIGluY2x1ZGVzX3BoZHJzOwotICAgICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gICAgIGFzZWN0aW9uICoqc2VjczsKLXsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbSwgKipwbTsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKLSAgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCSAgKHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkKLQkJICAgKyAoKHNpemVfdCkgY291bnQgLSAxKSAqIHNpemVvZiAoYXNlY3Rpb24gKikpKSk7Ci0gIGlmIChtID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG0tPm5leHQgPSBOVUxMOwotICBtLT5wX3R5cGUgPSB0eXBlOwotICBtLT5wX2ZsYWdzID0gZmxhZ3M7Ci0gIG0tPnBfcGFkZHIgPSBhdDsKLSAgbS0+cF9mbGFnc192YWxpZCA9IGZsYWdzX3ZhbGlkOwotICBtLT5wX3BhZGRyX3ZhbGlkID0gYXRfdmFsaWQ7Ci0gIG0tPmluY2x1ZGVzX2ZpbGVoZHIgPSBpbmNsdWRlc19maWxlaGRyOwotICBtLT5pbmNsdWRlc19waGRycyA9IGluY2x1ZGVzX3BoZHJzOwotICBtLT5jb3VudCA9IGNvdW50OwotICBpZiAoY291bnQgPiAwKQotICAgIG1lbWNweSAobS0+c2VjdGlvbnMsIHNlY3MsIGNvdW50ICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0KLSAgZm9yIChwbSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgKnBtICE9IE5VTEw7IHBtID0gJigqcG0pLT5uZXh0KQotICAgIDsKLSAgKnBtID0gbTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9iaW5hcnkuYyBiL2JmZC9iaW5hcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2M2ZmZi4uMDAwMDAwMAotLS0gYS9iZmQvYmluYXJ5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBiaW5hcnkgb2JqZWN0cy4KLSAgIENvcHlyaWdodCAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIDxpYW5AY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGlzIGEgQkZEIGJhY2tlbmQgd2hpY2ggbWF5IGJlIHVzZWQgdG8gd3JpdGUgYmluYXJ5IG9iamVjdHMuCi0gICBJdCBtYXkgb25seSBiZSB1c2VkIGZvciBvdXRwdXQsIG5vdCBpbnB1dC4gIFRoZSBpbnRlbnRpb24gaXMgdGhhdAotICAgdGhpcyBtYXkgYmUgdXNlZCBhcyBhbiBvdXRwdXQgZm9ybWF0IGZvciBvYmpjb3B5IGluIG9yZGVyIHRvCi0gICBnZW5lcmF0ZSByYXcgYmluYXJ5IGRhdGEuCi0KLSAgIFRoaXMgaXMgdmVyeSBzaW1wbGUuICBUaGUgb25seSBjb21wbGljYXRpb24gaXMgdGhhdCB0aGUgcmVhbCBkYXRhCi0gICB3aWxsIHN0YXJ0IGF0IHNvbWUgYWRkcmVzcyBYLCBhbmQgaW4gc29tZSBjYXNlcyB3ZSB3aWxsIG5vdCB3YW50IHRvCi0gICBpbmNsdWRlIFggemVyb2VzIGp1c3QgdG8gZ2V0IHRvIHRoYXQgcG9pbnQuICBTaW5jZSB0aGUgc3RhcnQKLSAgIGFkZHJlc3MgaXMgbm90IG1lYW5pbmdmdWwgZm9yIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0LCB3ZSB1c2UgaXQKLSAgIGluc3RlYWQgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiB6ZXJvZXMgdG8gc2tpcCBhdCB0aGUgc3RhcnQgb2YKLSAgIHRoZSBmaWxlLiAgb2JqY29weSBjb29wZXJhdGVzIGJ5IHNwZWNpYWxseSBzZXR0aW5nIHRoZSBzdGFydAotICAgYWRkcmVzcyB0byB6ZXJvIGJ5IGRlZmF1bHQuICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKiBBbnkgYmZkIHdlIGNyZWF0ZSBieSByZWFkaW5nIGEgYmluYXJ5IGZpbGUgaGFzIHRocmVlIHN5bWJvbHM6Ci0gICBhIHN0YXJ0IHN5bWJvbCwgYW4gZW5kIHN5bWJvbCwgYW5kIGFuIGFic29sdXRlIGxlbmd0aCBzeW1ib2wuICAqLwotI2RlZmluZSBCSU5fU1lNUyAzCi0KLXN0YXRpYyBib29sZWFuIGJpbmFyeV9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmJpbmFyeV9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gYmluYXJ5X2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgbG9uZyBiaW5hcnlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNoYXIgKm1hbmdsZV9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjaGFyICopKTsKLXN0YXRpYyBsb25nIGJpbmFyeV9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgYXN5bWJvbCAqYmluYXJ5X21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBiaW5hcnlfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGludCBiaW5hcnlfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLQotLyogQ3JlYXRlIGEgYmluYXJ5IG9iamVjdC4gIEludm9rZWQgdmlhIGJmZF9zZXRfZm9ybWF0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWJpbmFyeV9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQW55IGZpbGUgbWF5IGJlIGNvbnNpZGVyZWQgdG8gYmUgYSBiaW5hcnkgZmlsZSwgcHJvdmlkZWQgdGhlIHRhcmdldAotICAgd2FzIG5vdCBkZWZhdWx0ZWQuICBUaGF0IGlzLCBpdCBtdXN0IGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGFzCi0gICBiZWluZyBiaW5hcnkuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1iaW5hcnlfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICBpZiAoYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBhYmZkLT5zeW1jb3VudCA9IEJJTl9TWU1TOwotCi0gIC8qIEZpbmQgdGhlIGZpbGUgc2l6ZS4gICovCi0gIGlmIChiZmRfc3RhdCAoYWJmZCwgJnN0YXRidWYpIDwgMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE9uZSBkYXRhIHNlY3Rpb24uICAqLwotICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmRhdGEiKTsKLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBzZWMtPmZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHNlYy0+dm1hID0gMDsKLSAgc2VjLT5fcmF3X3NpemUgPSBzdGF0YnVmLnN0X3NpemU7Ci0gIHNlYy0+ZmlsZXBvcyA9IDA7Ci0KLSAgYWJmZC0+dGRhdGEuYW55ID0gKFBUUikgc2VjOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi0jZGVmaW5lIGJpbmFyeV9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgYmluYXJ5X2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBiaW5hcnlfbmV3X3NlY3Rpb25faG9vayBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vawotCi0vKiBHZXQgY29udGVudHMgb2YgdGhlIG9ubHkgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1iaW5hcnlfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgbmVlZGVkIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1iaW5hcnlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKEJJTl9TWU1TICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKik7Ci19Ci0KLS8qIENyZWF0ZSBhIHN5bWJvbCBuYW1lIGJhc2VkIG9uIHRoZSBiZmQncyBmaWxlbmFtZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLW1hbmdsZV9uYW1lIChhYmZkLCBzdWZmaXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqc3VmZml4OwotewotICBpbnQgc2l6ZTsKLSAgY2hhciAqYnVmOwotICBjaGFyICpwOwotCi0gIHNpemUgPSAoc3RybGVuIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSkKLQkgICsgc3RybGVuIChzdWZmaXgpCi0JICArIHNpemVvZiAiX2JpbmFyeV9fIik7Ci0KLSAgYnVmID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKGJ1ZiA9PSBOVUxMKQotICAgIHJldHVybiAiIjsKLQotICBzcHJpbnRmIChidWYsICJfYmluYXJ5XyVzXyVzIiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN1ZmZpeCk7Ci0KLSAgLyogQ2hhbmdlIGFueSBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgdG8gdW5kZXJzY29yZXMuICAqLwotICBmb3IgKHAgPSBidWY7ICpwOyBwKyspCi0gICAgaWYgKCEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpwKSkKLSAgICAgICpwID0gJ18nOwotCi0gIHJldHVybiBidWY7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLWJpbmFyeV9nZXRfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKLXsKLSAgYXNlY3Rpb24gKnNlYyA9IChhc2VjdGlvbiAqKSBhYmZkLT50ZGF0YS5hbnk7Ci0gIGFzeW1ib2wgKnN5bXM7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIHN5bXMgPSAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIEJJTl9TWU1TICogc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChzeW1zID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFN0YXJ0IHN5bWJvbC4gICovCi0gIHN5bXNbMF0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMF0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAic3RhcnQiKTsKLSAgc3ltc1swXS52YWx1ZSA9IDA7Ci0gIHN5bXNbMF0uZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICBzeW1zWzBdLnNlY3Rpb24gPSBzZWM7Ci0gIHN5bXNbMF0udWRhdGEucCA9IE5VTEw7Ci0KLSAgLyogRW5kIHN5bWJvbC4gICovCi0gIHN5bXNbMV0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMV0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAiZW5kIik7Ci0gIHN5bXNbMV0udmFsdWUgPSBzZWMtPl9yYXdfc2l6ZTsKLSAgc3ltc1sxXS5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gIHN5bXNbMV0uc2VjdGlvbiA9IHNlYzsKLSAgc3ltc1sxXS51ZGF0YS5wID0gTlVMTDsKLQotICAvKiBTaXplIHN5bWJvbC4gICovCi0gIHN5bXNbMl0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMl0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAic2l6ZSIpOwotICBzeW1zWzJdLnZhbHVlID0gc2VjLT5fcmF3X3NpemU7Ci0gIHN5bXNbMl0uZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICBzeW1zWzJdLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICBzeW1zWzJdLnVkYXRhLnAgPSBOVUxMOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCSU5fU1lNUzsgaSsrKQotICAgICphbG9jYXRpb24rKyA9IHN5bXMrKzsKLSAgKmFsb2NhdGlvbiA9IE5VTEw7Ci0KLSAgcmV0dXJuIEJJTl9TWU1TOwotfQotCi0vKiBNYWtlIGFuIGVtcHR5IHN5bWJvbC4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLWJpbmFyeV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKGFzeW1ib2wgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLX0KLQotI2RlZmluZSBiaW5hcnlfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAotCi0vKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotYmluYXJ5X2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotfQotCi0jZGVmaW5lIGJpbmFyeV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGJpbmFyeV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgYmluYXJ5X2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIGJpbmFyeV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIGJpbmFyeV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIGJpbmFyeV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBiaW5hcnlfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfMGwpCi0jZGVmaW5lIGJpbmFyeV9jYW5vbmljYWxpemVfcmVsb2MgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIGJmZF8wbCkKLSNkZWZpbmUgYmluYXJ5X2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSBvZiBhIGJpbmFyeSBmaWxlLiAgKi8KLSNkZWZpbmUgYmluYXJ5X3NldF9hcmNoX21hY2ggX2JmZF9nZW5lcmljX3NldF9hcmNoX21hY2gKLQotLyogV3JpdGUgc2VjdGlvbiBjb250ZW50cyBvZiBhIGJpbmFyeSBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotewotICBpZiAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQotICAgIHsKLSAgICAgIGJvb2xlYW4gZm91bmRfbG93OwotICAgICAgYmZkX3ZtYSBsb3c7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgLyogVGhlIGxvd2VzdCBzZWN0aW9uIExNQSBzZXRzIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0Ci0gICAgICAgICBvZiB0aGUgZmlsZS4gIFdlIHVzZSB0aGlzIHRvIHNldCB0aGUgZmlsZSBwb3NpdGlvbiBvZiBhbGwgdGhlCi0gICAgICAgICBzZWN0aW9ucy4gICovCi0gICAgICBmb3VuZF9sb3cgPSBmYWxzZTsKLSAgICAgIGxvdyA9IDA7Ci0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQlpZiAoKChzLT5mbGFncwotCSAgICAgICYgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19ORVZFUl9MT0FEKSkKLQkgICAgID09IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MpKQotCSAgICAmJiAoISBmb3VuZF9sb3cgfHwgcy0+bG1hIDwgbG93KSkKLQkgIHsKLQkgICAgbG93ID0gcy0+bG1hOwotCSAgICBmb3VuZF9sb3cgPSB0cnVlOwotCSAgfQotCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBzLT5maWxlcG9zID0gcy0+bG1hIC0gbG93OwotCi0JICAvKiBTa2lwIGZvbGxvd2luZyB3YXJuaW5nIGNoZWNrIGZvciBzZWN0aW9ucyB0aGF0IHdpbGwgbm90Ci0JICAgICBvY2N1cHkgZmlsZSBzcGFjZS4gICovIAotCSAgaWYgKChzLT5mbGFncwotCSAgICAgICAmIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX05FVkVSX0xPQUQpKQotCSAgICAgICE9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIGF0dGVtcHRpbmcgdG8gZ2VuZXJhdGUgYSBiaW5hcnkgZmlsZSBmcm9tIGEgYmZkIHdpdGgKLQkgICAgIExNQSdzIGFsbCBvdmVyIHRoZSBwbGFjZSwgaHVnZSAoc3BhcnNlPykgYmluYXJ5IGZpbGVzIG1heQotCSAgICAgcmVzdWx0LiAgVGhpcyBjb25kaXRpb24gYXR0ZW1wdHMgdG8gZGV0ZWN0IHRoaXMgc2l0dWF0aW9uCi0JICAgICBhbmQgcHJpbnQgYSB3YXJuaW5nLiAgQmV0dGVyIGhldXJpc3RpY3Mgd291bGQgYmUgbmljZSB0bwotCSAgICAgaGF2ZS4gKi8KLQotCSAgaWYgKHMtPmZpbGVwb3MgPCAwKQotCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAoXygiV2FybmluZzogV3JpdGluZyBzZWN0aW9uIGAlcycgdG8gaHVnZSAoaWUgbmVnYXRpdmUpIGZpbGUgb2Zmc2V0IDB4JWx4LiIpLAotCSAgICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgcyksCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBzLT5maWxlcG9zKTsKLQl9Ci0KLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgIH0KLQotICAvKiBXZSBkb24ndCB3YW50IHRvIG91dHB1dCBhbnl0aGluZyBmb3IgYSBzZWN0aW9uIHRoYXQgaXMgbmVpdGhlcgotICAgICBsb2FkZWQgbm9yIGFsbG9jYXRlZC4gIFRoZSBjb250ZW50cyBvZiBzdWNoIGEgc2VjdGlvbiBhcmUgbm90Ci0gICAgIG1lYW5pbmdmdWwgaW4gdGhlIGJpbmFyeSBmb3JtYXQuICAqLwotICBpZiAoKHNlYy0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gX2JmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLS8qIE5vIHNwYWNlIGlzIHJlcXVpcmVkIGZvciBoZWFkZXIgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgaW50Ci1iaW5hcnlfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjOwotewotICByZXR1cm4gMDsKLX0KLQotI2RlZmluZSBiaW5hcnlfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiaW5hcnlfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBiaW5hcnlfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIGJpbmFyeV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBiaW5hcnlfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgYmluYXJ5X2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIGJpbmFyeV9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgYmluYXJ5X2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotY29uc3QgYmZkX3RhcmdldCBiaW5hcnlfdmVjID0KLXsKLSAgImJpbmFyeSIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwJLyogZmxhdm91ciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiBieXRlb3JkZXIgKi8KLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogaGVhZGVyX2J5dGVvcmRlciAqLwotICBFWEVDX1AsCQkJLyogb2JqZWN0X2ZsYWdzICovCi0gIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUFET05MWSB8IFNFQ19DT0RFIHwgU0VDX0RBVEEKLSAgIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMpLCAvKiBzZWN0aW9uX2ZsYWdzICovCi0gIDAsCQkJCS8qIHN5bWJvbF9sZWFkaW5nX2NoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0gIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIGJpbmFyeV9vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBiaW5hcnlfbWtvYmplY3QsCi0gICAgYmZkX2ZhbHNlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX3RydWUsCi0gICAgYmZkX2ZhbHNlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChiaW5hcnkpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYmluYXJ5KSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChiaW5hcnkpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYmluYXJ5KSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoYmluYXJ5KSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwKLX07CmRpZmYgLS1naXQgYS9iZmQvYm91dC5jIGIvYmZkL2JvdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmMTBmNS4uMDAwMDAwMAotLS0gYS9iZmQvYm91dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUzNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDk2MCBiLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0jaW5jbHVkZSAiYm91dC5oIgotCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIJCS8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotCi1zdGF0aWMgaW50IGFsaWduY29kZSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJICAgICAgYXJlbGVudCAqciwgdW5zaWduZWQgaW50IHNocmluaykpOwotc3RhdGljIHZvaWQgcGVyZm9ybV9zbGlwIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IHNsaXAsCi0JCQkJICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgYmZkX3ZtYSB2YWx1ZSkpOwotc3RhdGljIGJvb2xlYW4gYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmJfb3V0X2NhbGxiYWNrIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNhbGxqeF9jYWxsYmFjawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXJlbGVudCAqLCBQVFIgc3JjLCBQVFIgZHN0LAotCSAgIGFzZWN0aW9uICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY2FsbGpfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFyZWxlbnQgKiwgUFRSIGRhdGEsCi0JICAgdW5zaWduZWQgaW50IHNyY2lkeCwgdW5zaWduZWQgaW50IGRzdGlkeCwgYXNlY3Rpb24gKiwgYm9vbGVhbikpOwotc3RhdGljIGJmZF92bWEgZ2V0X3ZhbHVlIFBBUkFNUyAoKGFyZWxlbnQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgIGFzZWN0aW9uICopKTsKLXN0YXRpYyBpbnQgYWJzMzJjb2RlIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICosCi0JCQkgICAgICB1bnNpZ25lZCBpbnQsIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGJfb3V0X2JmZF9yZWxheF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJCWJvb2xlYW4gKikpOwotc3RhdGljIGJmZF9ieXRlICpiX291dF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqLCBib29sZWFuLCBhc3ltYm9sICoqKSk7Ci0KLS8qIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBleGVjdXRhYmxlIGhlYWRlciB0YWtlbiBmcm9tIGEgcmF3IGJ5dGUKLSAgIHN0cmVhbSBtZW1vcnkgaW1hZ2UsIGludG8gdGhlIGludGVybmFsIGV4ZWNfaGVhZGVyIHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLWJvdXRfc3dhcF9leGVjX2hlYWRlcl9pbiAoYWJmZCwgcmF3X2J5dGVzLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKXJhd19ieXRlczsKLQotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIGV4ZWNwLCBmcm9tIHRoZSBieXRlcyBpbiB0aGUgcmF3IGRhdGEuICAqLwotICBleGVjcC0+YV9pbmZvICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX2luZm8pOwotICBleGVjcC0+YV90ZXh0ICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdGV4dCk7Ci0gIGV4ZWNwLT5hX2RhdGEgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kYXRhKTsKLSAgZXhlY3AtPmFfYnNzICAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Jzcyk7Ci0gIGV4ZWNwLT5hX3N5bXMgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9zeW1zKTsKLSAgZXhlY3AtPmFfZW50cnkgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2VudHJ5KTsKLSAgZXhlY3AtPmFfdHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIGV4ZWNwLT5hX2Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kcnNpemUpOwotICBleGVjcC0+YV90bG9hZCAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdGxvYWQpOwotICBleGVjcC0+YV9kbG9hZCAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGxvYWQpOwotICBleGVjcC0+YV90YWxpZ24gPSBieXRlcy0+ZV90YWxpZ25bMF07Ci0gIGV4ZWNwLT5hX2RhbGlnbiA9IGJ5dGVzLT5lX2RhbGlnblswXTsKLSAgZXhlY3AtPmFfYmFsaWduID0gYnl0ZXMtPmVfYmFsaWduWzBdOwotICBleGVjcC0+YV9yZWxheGFibGUgPSBieXRlcy0+ZV9yZWxheGFibGVbMF07Ci19Ci0KLS8qIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBpbnRlcm5hbCBleGVjIGhlYWRlciBzdHJ1Y3R1cmUgaW50byB0aGUKLSAgIHN1cHBsaWVkIGJ1ZmZlciByZWFkeSBmb3Igd3JpdGluZyB0byBkaXNrLiAgKi8KLQotUFJPVE8odm9pZCwgYm91dF9zd2FwX2V4ZWNfaGVhZGVyX291dCwKLQkgIChiZmQgKmFiZmQsCi0JICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwLAotCSAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXMpKTsKLXZvaWQKLWJvdXRfc3dhcF9leGVjX2hlYWRlcl9vdXQgKGFiZmQsIGV4ZWNwLCByYXdfYnl0ZXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSByYXcgZGF0YSwgZnJvbSB0aGUgZmllbGRzIGluIHRoZSBleGVjIHN0cnVjdC4gKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9pbmZvICAsIGJ5dGVzLT5lX2luZm8pOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfdGV4dCAgLCBieXRlcy0+ZV90ZXh0KTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2RhdGEgICwgYnl0ZXMtPmVfZGF0YSk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9ic3MgICAsIGJ5dGVzLT5lX2Jzcyk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9zeW1zICAsIGJ5dGVzLT5lX3N5bXMpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZW50cnkgLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV90cnNpemUsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9kcnNpemUsIGJ5dGVzLT5lX2Ryc2l6ZSk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV90bG9hZCAsIGJ5dGVzLT5lX3Rsb2FkKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2Rsb2FkICwgYnl0ZXMtPmVfZGxvYWQpOwotICBieXRlcy0+ZV90YWxpZ25bMF0gPSBleGVjcC0+YV90YWxpZ247Ci0gIGJ5dGVzLT5lX2RhbGlnblswXSA9IGV4ZWNwLT5hX2RhbGlnbjsKLSAgYnl0ZXMtPmVfYmFsaWduWzBdID0gZXhlY3AtPmFfYmFsaWduOwotICBieXRlcy0+ZV9yZWxheGFibGVbMF0gPSBleGVjcC0+YV9yZWxheGFibGU7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotYl9vdXRfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgYW5leGVjOwotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLSAgICAgICE9IEVYRUNfQllURVNfU0laRSkgewotICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgYW5leGVjLmFfaW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXhlY19ieXRlcy5lX2luZm8pOwotCi0gIGlmIChOX0JBRE1BRyAoYW5leGVjKSkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgYm91dF9zd2FwX2V4ZWNfaGVhZGVyX2luIChhYmZkLCAmZXhlY19ieXRlcywgJmFuZXhlYyk7Ci0gIHJldHVybiBhb3V0XzMyX3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgJmFuZXhlYywgYl9vdXRfY2FsbGJhY2spOwotfQotCi0KLS8qIEZpbmlzaCB1cCB0aGUgb3BlbmluZyBvZiBhIGIub3V0IGZpbGUgZm9yIHJlYWRpbmcuICBGaWxsIGluIGFsbCB0aGUKLSAgIGZpZWxkcyB0aGF0IGFyZSBub3QgaGFuZGxlZCBieSBjb21tb24gY29kZS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWJfb3V0X2NhbGxiYWNrIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLSAgdW5zaWduZWQgbG9uZyBic3Nfc3RhcnQ7Ci0KLSAgLyogQXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgKi8KLSAgYmZkX3NldF9hcmNoX21hY2goYWJmZCwKLQkJICAgIGJmZF9hcmNoX2k5NjAsIC8qIEIub3V0IG9ubHkgdXNlZCBvbiBpOTYwICovCi0JCSAgICBiZmRfbWFjaF9pOTYwX2NvcmUgLyogRGVmYXVsdCAqLwotCQkgICAgKTsKLQotICAvKiBUaGUgcG9zaXRpb25zIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBOX1NUUk9GRiAoKmV4ZWNwKTsKLSAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IE5fU1lNT0ZGICgqZXhlY3ApOwotCi0gIC8qIFRoZSBhbGlnbm1lbnRzIG9mIHRoZSBzZWN0aW9ucyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGV4ZWNwLT5hX3RhbGlnbjsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBleGVjcC0+YV9kYWxpZ247Ci0gIG9ial9ic3NzZWMgIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gZXhlY3AtPmFfYmFsaWduOwotCi0gIC8qIFRoZSBzdGFydGluZyBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zLiAgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBleGVjcC0+YV90bG9hZDsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBleGVjcC0+YV9kbG9hZDsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCktPmxtYSA9IG9ial90ZXh0c2VjIChhYmZkKS0+dm1hOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmxtYSA9IG9ial9kYXRhc2VjIChhYmZkKS0+dm1hOwotCi0gIC8qIEFuZCByZWxvYWQgdGhlIHNpemVzLCBzaW5jZSB0aGUgYW91dCBtb2R1bGUgemFwcyB0aGVtICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfdGV4dDsKLQotICBic3Nfc3RhcnQgPSBleGVjcC0+YV9kbG9hZCArIGV4ZWNwLT5hX2RhdGE7IC8qIEJTUyA9IGVuZCBvZiBkYXRhIHNlY3Rpb24gKi8KLSAgb2JqX2Jzc3NlYyAoYWJmZCktPnZtYSA9IGFsaWduX3Bvd2VyIChic3Nfc3RhcnQsIGV4ZWNwLT5hX2JhbGlnbik7Ci0KLSAgb2JqX2Jzc3NlYyAoYWJmZCktPmxtYSA9IG9ial9ic3NzZWMgKGFiZmQpLT52bWE7Ci0KLSAgLyogVGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSBzZWN0aW9ucyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX1RYVE9GRigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRigqZXhlY3ApOwotCi0gIC8qIFRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgcmVsb2NhdGlvbiBpbmZvICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX1RST0ZGKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSAgTl9EUk9GRigqZXhlY3ApOwotCi0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IDE7CS8qIE5vdCBhcHBsaWNhYmxlLiAqLwotICBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUgPSAxOyAvKiBOb3QgYXBwbGljYWJsZS4gKi8KLSAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotCi0gIGlmIChleGVjcC0+YV9yZWxheGFibGUpCi0gICBhYmZkLT5mbGFncyB8PSBCRkRfSVNfUkVMQVhBQkxFOwotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgewotICAgIHN0cnVjdCBhb3V0ZGF0YSBhOwotICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjIGU7Ci19OwotCi1zdGF0aWMgYm9vbGVhbgotYl9vdXRfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKnJhd3B0cjsKLQotICByYXdwdHIgPSAoc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCkpOwotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFiZmQtPnRkYXRhLmJvdXRfZGF0YSA9IHJhd3B0cjsKLSAgZXhlY19oZHIgKGFiZmQpID0gJnJhd3B0ci0+ZTsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKilOVUxMOwotICBvYmpfZGF0YXNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKilOVUxMOwotICBvYmpfYnNzc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKU5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQKLWJfb3V0X3N5bWJvbF9jbXAgKGEsIGIpCi0gICAgIHN0cnVjdCBhb3V0X3N5bWJvbCAqKmEsICoqYjsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkX3ZtYSBhdiwgYnY7Ci0KLSAgLyogUHJpbWFyeSBrZXkgaXMgYWRkcmVzcyAqLwotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKCYoKmEpLT5zeW1ib2wpOwotICBhdiA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCArICgqYSktPnN5bWJvbC52YWx1ZTsKLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uICgmKCpiKS0+c3ltYm9sKTsKLSAgYnYgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQgKyAoKmIpLT5zeW1ib2wudmFsdWU7Ci0KLSAgaWYgKGF2IDwgYnYpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoYXYgPiBidikKLSAgICByZXR1cm4gMTsKLQotICAvKiBTZWNvbmRhcnkga2V5IHB1dHMgQ0FMTE5BTUUgc3ltcyBsYXN0IGFuZCBCQUxOQU1FIHN5bXMgZmlyc3QsIHNvCi0gICAgIHRoYXQgdGhleSBoYXZlIHRoZSBiZXN0IGNoYW5jZSBvZiBiZWluZyBjb250aWd1b3VzLiAgKi8KLSAgaWYgKElTX0JBTE5BTUUgKCgqYSktPm90aGVyKSB8fCBJU19DQUxMTkFNRSAoKCpiKS0+b3RoZXIpKQotICAgIHJldHVybiAtMTsKLSAgaWYgKElTX0NBTExOQU1FICgoKmEpLT5vdGhlcikgfHwgSVNfQkFMTkFNRSAoKCpiKS0+b3RoZXIpKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbGVhbgotYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIHN3YXBwZWRfaGRyOwotCi0gIGlmICghIGFvdXRfMzJfbWFrZV9zZWN0aW9ucyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV9pbmZvID0gQk1BR0lDOwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90ZXh0ID0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9kYXRhID0gb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9ic3MgPSBvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogc2l6ZW9mIChzdHJ1Y3Qgbmxpc3QpOwotICBleGVjX2hkciAoYWJmZCktPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICBleGVjX2hkciAoYWJmZCktPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSk7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pKTsKLQotICBleGVjX2hkciAoYWJmZCktPmFfdGFsaWduID0gb2JqX3RleHRzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXI7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9kYWxpZ24gPSBvYmpfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlcjsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2JhbGlnbiA9IG9ial9ic3NzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXI7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX3Rsb2FkID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9kbG9hZCA9IG9ial9kYXRhc2VjIChhYmZkKS0+dm1hOwotCi0gIGJvdXRfc3dhcF9leGVjX2hlYWRlcl9vdXQgKGFiZmQsIGV4ZWNfaGRyIChhYmZkKSwgJnN3YXBwZWRfaGRyKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICZzd2FwcGVkX2hkciwgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQotCSAgIT0gRVhFQ19CWVRFU19TSVpFKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdyaXRlIG91dCByZWxvYyBpbmZvLCBmb2xsb3dlZCBieSBzeW1zIGFuZCBzdHJpbmdzICovCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIE1ha2Ugc3VyZSB7Q0FMTCxCQUx9TkFNRSBzeW1ib2xzIHJlbWFpbiBhZGphY2VudCBvbiBvdXRwdXQKLQkgYnkgc29ydGluZy4gIFRoaXMgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCBzdGFicyBhcmUKLQkgYWxzbyBvcmRlcmVkLiAgU29sdmUgdGhpcyBieSBzaGlmdGluZyBhbGwgc3RhYnMgdG8gdGhlIGVuZAotCSBpbiBvcmRlciwgdGhlbiBzb3J0aW5nIHRoZSByZXN0LiAgKi8KLQotICAgICAgYXN5bWJvbCAqKm91dHN5bXMsICoqcCwgKipxOwotCi0gICAgICBvdXRzeW1zID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgICAgIHAgPSBvdXRzeW1zICsgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0KLSAgICAgIGZvciAocSA9IHAtLTsgcCA+PSBvdXRzeW1zOyBwLS0pCi0JewotCSAgaWYgKCgqcCktPmZsYWdzICYgQlNGX0RFQlVHR0lORykKLQkgICAgewotCSAgICAgIGFzeW1ib2wgKnQgPSAqLS1xOwotCSAgICAgICpxID0gKnA7Ci0JICAgICAgKnAgPSB0OwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocSA+IG91dHN5bXMpCi0JcXNvcnQgKG91dHN5bXMsIHEgLSBvdXRzeW1zLCBzaXplb2YoYXN5bWJvbCopLCBiX291dF9zeW1ib2xfY21wKTsKLQotICAgICAgLyogQmFjayB0byB5b3VyIHJlZ3VsYXJseSBzY2hlZHVsZWQgcHJvZ3JhbS4gICovCi0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1NZTU9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYW91dF8zMl93cml0ZV9zeW1zIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1RST0ZGKCpleGVjX2hkcihhYmZkKSkpLCBTRUVLX1NFVCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIG9ial90ZXh0c2VjIChhYmZkKSkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX0RST0ZGKCpleGVjX2hkcihhYmZkKSkpLCBTRUVLX1NFVCkKLQkgICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoIWJfb3V0X3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBvYmpfZGF0YXNlYyAoYWJmZCkpKSByZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qKiBTb21lIHJlbG9jIGhhY2tlcnkgKi8KLQotI2RlZmluZSBDQUxMUwkgIDB4NjYwMDM4MDAJLyogVGVtcGxhdGUgZm9yICdjYWxscycgaW5zdHJ1Y3Rpb24JKi8KLSNkZWZpbmUgQkFMCSAgMHgwYjAwMDAwMAkvKiBUZW1wbGF0ZSBmb3IgJ2JhbCcgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgQkFMX01BU0sgIDB4MDBmZmZmZmYKLSNkZWZpbmUgQkFMWAkgIDB4ODVmMDAwMDAJLyogVGVtcGxhdGUgZm9yICdiYWx4JyBpbnN0cnVjdGlvbgkqLwotI2RlZmluZSBCQUxYX01BU0sgMHgwMDA3ZmZmZgotI2RlZmluZSBDQUxMICAgICAgMHgwOTAwMDAwMAotI2RlZmluZSBQQ1JFTDEzX01BU0sgMHgxZmZmCi0KLQotI2RlZmluZSBvdXRwdXRfYWRkcihzZWMpICgoc2VjKS0+b3V0cHV0X29mZnNldCsoc2VjKS0+b3V0cHV0X3NlY3Rpb24tPnZtYSkKLQotLyogTWFnaWMgdG8gdHVybiBjYWxseCBpbnRvIGNhbGxqeCAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY2FsbGp4X2NhbGxiYWNrIChhYmZkLCBsaW5rX2luZm8sIHJlbG9jX2VudHJ5LCBzcmMsIGRzdCwgaW5wdXRfc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgUFRSIHNyYzsKLSAgICAgUFRSIGRzdDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci17Ci0gIGludCB3b3JkID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjKTsKLSAgYXN5bWJvbCAqc3ltYm9sX2luID0gKihyZWxvY19lbnRyeS0+c3ltX3B0cl9wdHIpOwotICBhb3V0X3N5bWJvbF90eXBlICpzeW1ib2wgPSBhb3V0X3N5bWJvbCAoc3ltYm9sX2luKTsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICB2YWx1ZSA9IGdldF92YWx1ZSAocmVsb2NfZW50cnksIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgaWYgKElTX0NBTExOQU1FIChzeW1ib2wtPm90aGVyKSkKLSAgICB7Ci0gICAgICBhb3V0X3N5bWJvbF90eXBlICpiYWxzeW0gPSBzeW1ib2wrMTsKLSAgICAgIGludCBpbnN0ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy00KTsKLSAgICAgIC8qIFRoZSBuZXh0IHN5bWJvbCBzaG91bGQgYmUgYW4gTl9CQUxOQU1FICovCi0gICAgICBCRkRfQVNTRVJUIChJU19CQUxOQU1FIChiYWxzeW0tPm90aGVyKSk7Ci0gICAgICBpbnN0ICY9IEJBTFhfTUFTSzsKLSAgICAgIGluc3QgfD0gQkFMWDsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc3QsIChiZmRfYnl0ZSAqKSBkc3QtNCk7Ci0gICAgICBzeW1ib2wgPSBiYWxzeW07Ci0gICAgICB2YWx1ZSA9IChzeW1ib2wtPnN5bWJvbC52YWx1ZQotCSAgICAgICArIG91dHB1dF9hZGRyIChzeW1ib2wtPnN5bWJvbC5zZWN0aW9uKSk7Ci0gICAgfQotCi0gIHdvcmQgKz0gdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGJmZF9wdXRfMzIoYWJmZCwgd29yZCwgZHN0KTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi0vKiBNYWdpYyB0byB0dXJuIGNhbGwgaW50byBjYWxsaiAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY2FsbGpfY2FsbGJhY2sgKGFiZmQsIGxpbmtfaW5mbywgcmVsb2NfZW50cnksICBkYXRhLCBzcmNpZHgsIGRzdGlkeCwKLQkJaW5wdXRfc2VjdGlvbiwgc2hyaW5raW5nKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBQVFIgZGF0YTsKLSAgICAgdW5zaWduZWQgaW50IHNyY2lkeDsKLSAgICAgdW5zaWduZWQgaW50IGRzdGlkeDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJvb2xlYW4gc2hyaW5raW5nOwotewotICBpbnQgd29yZCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgc3JjaWR4KTsKLSAgYXN5bWJvbCAqc3ltYm9sX2luID0gKihyZWxvY19lbnRyeS0+c3ltX3B0cl9wdHIpOwotICBhb3V0X3N5bWJvbF90eXBlICpzeW1ib2wgPSBhb3V0X3N5bWJvbCAoc3ltYm9sX2luKTsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICB2YWx1ZSA9IGdldF92YWx1ZSAocmVsb2NfZW50cnksIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgaWYgKElTX09USEVSKHN5bWJvbC0+b3RoZXIpKQotICAgIHsKLSAgICAgIC8qIENhbGwgdG8gYSBzeXN0ZW0gcHJvY2VkdXJlIC0gcmVwbGFjZSBjb2RlIHdpdGggc3lzdGVtCi0JIHByb2NlZHVyZSBudW1iZXIuICAqLwotICAgICAgd29yZCA9IENBTExTIHwgKHN5bWJvbC0+b3RoZXIgLSAxKTsKLSAgICB9Ci0gIGVsc2UgaWYgKElTX0NBTExOQU1FKHN5bWJvbC0+b3RoZXIpKQotICAgIHsKLSAgICAgIGFvdXRfc3ltYm9sX3R5cGUgKmJhbHN5bSA9IHN5bWJvbCsxOwotCi0gICAgICAvKiBUaGUgbmV4dCBzeW1ib2wgc2hvdWxkIGJlIGFuIE5fQkFMTkFNRS4gICovCi0gICAgICBCRkRfQVNTRVJUKElTX0JBTE5BTUUoYmFsc3ltLT5vdGhlcikpOwotICAgICAgCi0gICAgICAvKiBXZSBhcmUgY2FsbGluZyBhIGxlYWYsIHNvIHJlcGxhY2UgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gd2l0aCBhCi0JIGJhbC4gICovCi0gICAgICB3b3JkID0gQkFMIHwgKCh3b3JkCi0JCSAgICAgKyBvdXRwdXRfYWRkciAoYmFsc3ltLT5zeW1ib2wuc2VjdGlvbikKLQkJICAgICArIGJhbHN5bS0+c3ltYm9sLnZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZAotCQkgICAgIC0gZHN0aWR4Ci0JCSAgICAgLSBvdXRwdXRfYWRkciAoaW5wdXRfc2VjdGlvbikpCi0JCSAgICAmIEJBTF9NQVNLKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChzeW1ib2wtPnN5bWJvbC5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBBIGNhbGxqIGFnYWluc3QgYSBzeW1ib2wgaW4gdGhlIHNhbWUgc2VjdGlvbiBpcyBhIGZ1bGx5Ci0gICAgICAgICByZXNvbHZlZCByZWxhdGl2ZSBjYWxsLiAgV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlLgotICAgICAgICAgSWYgdGhlIHN5bWJvbCBpcyBub3QgaW4gdGhlIHNhbWUgc2VjdGlvbiwgSSdtIG5vdCBzdXJlIHdoYXQKLSAgICAgICAgIHRvIGRvOyBmb3J0dW5hdGVseSwgdGhpcyBjYXNlIHdpbGwgcHJvYmFibHkgbmV2ZXIgYXJpc2UuICAqLwotICAgICAgQkZEX0FTU0VSVCAoISBzaHJpbmtpbmcpOwotICAgICAgQkZEX0FTU0VSVCAoc3ltYm9sLT5zeW1ib2wuc2VjdGlvbiA9PSBpbnB1dF9zZWN0aW9uKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3b3JkID0gQ0FMTCB8ICgoKHdvcmQgJiBCQUxfTUFTSykKLQkJICAgICAgKyB2YWx1ZQotCQkgICAgICArIHJlbG9jX2VudHJ5LT5hZGRlbmQKLQkJICAgICAgLSAoc2hyaW5raW5nID8gZHN0aWR4IDogMCkKLQkJICAgICAgLSBvdXRwdXRfYWRkciAoaW5wdXRfc2VjdGlvbikpCi0JCSAgICAgJiBCQUxfTUFTSyk7Ci0gICAgfQotICBiZmRfcHV0XzMyKGFiZmQsIHdvcmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgZHN0aWR4KTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogdHlwZSByc2hpZnQgc2l6ZSAgYml0c2l6ZSAgCXBjcmVsCWJpdHBvcyAgYWJzb2x1dGUgb3ZlcmZsb3cgY2hlY2sqLwotCi0jZGVmaW5lIEFCUzMyQ09ERSAwCi0jZGVmaW5lIEFCUzMyQ09ERV9TSFJVTksgMQotI2RlZmluZSBQQ1JFTDI0IDIKLSNkZWZpbmUgQ0FMTEogMwotI2RlZmluZSBBQlMzMiA0Ci0jZGVmaW5lIFBDUkVMMTMgNQotI2RlZmluZSBBQlMzMl9NQVlCRV9SRUxBWEFCTEUgMQotI2RlZmluZSBBQlMzMl9XQVNfUkVMQVhBQkxFIDIKLQotI2RlZmluZSBBTElHTkVSIDEwCi0jZGVmaW5lIEFMSUdORE9ORSAxMQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfY2FsbGogPQotSE9XVE8oQ0FMTEosIDAsIDIsIDI0LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsImNhbGxqIiwgdHJ1ZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZixmYWxzZSk7Ci1zdGF0aWMgIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfYWJzMzIgPQotSE9XVE8oQUJTMzIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiYWJzMzIiLCB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfcGNyZWwyNCA9Ci1IT1dUTyhQQ1JFTDI0LCAwLCAyLCAyNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsInBjcmVsMjQiLCB0cnVlLCAweDAwZmZmZmZmLDB4MDBmZmZmZmYsZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19yZWxvY19wY3JlbDEzID0KLUhPV1RPKFBDUkVMMTMsIDAsIDIsIDEzLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwicGNyZWwxMyIsIHRydWUsIDB4MDAwMDFmZmYsMHgwMDAwMWZmZixmYWxzZSk7Ci0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfYWJzMzJjb2Rlc2hydW5rID0KLUhPV1RPKEFCUzMyQ09ERV9TSFJVTkssIDAsIDIsIDI0LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsImNhbGx4LT5jYWxsaiIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsZmFsc2UpOwotCi1zdGF0aWMgIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfYWJzMzJjb2RlID0KLUhPV1RPKEFCUzMyQ09ERSwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJjYWxseCIsIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZixmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX2FsaWduX3RhYmxlW10gPSB7Ci0gIEhPV1RPIChBTElHTkVSLCAwLCAweDEsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiYWxpZ24xNiIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCi0gIEhPV1RPIChBTElHTkVSLCAwLCAweDMsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiYWxpZ24zMiIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCi0gIEhPV1RPIChBTElHTkVSLCAwLCAweDcsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiYWxpZ242NCIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCi0gIEhPV1RPIChBTElHTkVSLCAwLCAweGYsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiYWxpZ24xMjgiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fZG9uZV9hbGlnbl90YWJsZVtdID0gewotICBIT1dUTyAoQUxJR05ET05FLCAweDEsIDB4MSwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJkb25lYWxpZ24xNiIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCi0gIEhPV1RPIChBTElHTkRPTkUsIDB4MywgMHgzLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImRvbmVhbGlnbjMyIiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLSAgSE9XVE8gKEFMSUdORE9ORSwgMHg3LCAweDcsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiZG9uZWFsaWduNjQiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05ET05FLCAweGYsIDB4ZiwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJkb25lYWxpZ24xMjgiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYl9vdXRfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIEJGRF9SRUxPQ19JOTYwX0NBTExKOgotICAgICAgcmV0dXJuICZob3d0b19yZWxvY19jYWxsajsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgcmV0dXJuICZob3d0b19yZWxvY19hYnMzMjsKLSAgICBjYXNlIEJGRF9SRUxPQ18yNF9QQ1JFTDoKLSAgICAgIHJldHVybiAmaG93dG9fcmVsb2NfcGNyZWwyNDsKLSAgICB9Ci19Ci0KLS8qIEFsbG9jYXRlIGVub3VnaCByb29tIGZvciBhbGwgdGhlIHJlbG9jIGVudHJpZXMsIHBsdXMgcG9pbnRlcnMgdG8gdGhlbSBhbGwgKi8KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqcnB0cjsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXIgOwotICBhcmVsZW50ICpjYWNoZV9wdHIgOwotICBpbnQgZXh0ZXJuX21hc2ssIHBjcmVsX21hc2ssIGNhbGxqX21hc2ssIGxlbmd0aF9zaGlmdDsKLSAgaW50IGluY29kZV9tYXNrOwotICBpbnQgc2l6ZV9tYXNrOwotICBiZmRfdm1hIHByZXZfYWRkciA9IDA7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgc2l6ZV90ICByZWxvY19zaXplOwotICBzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICpyZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbG9jX2NhY2hlOwotCi0gIGlmIChhc2VjdC0+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/dHJ1ZTpmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLQotICBpZiAoYXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQkvKiBVbmtub3duIG1hY2hpbmUgYXJjaCBpcyBPSyAqLwotICAgIHJldHVybiB0cnVlOwotICBpZiAoYXJjaCA9PSBiZmRfYXJjaF9pOTYwKQkvKiBpOTYwIGRlZmF1bHQgaXMgT0sgKi8KLSAgICBzd2l0Y2ggKG1hY2hpbmUpIHsKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfY29yZToKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfa2Jfc2I6Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX21jOgotICAgIGNhc2UgYmZkX21hY2hfaTk2MF94YToKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfY2E6Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX2thX3NhOgotICAgIGNhc2UgYmZkX21hY2hfaTk2MF9qeDoKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfaHg6Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50Ci1iX291dF9zaXplb2ZfaGVhZGVycyAoaWdub3JlX2FiZmQsIGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgYm9vbGVhbiBpZ25vcmU7Ci17Ci0gIHJldHVybiBzaXplb2Yoc3RydWN0IGludGVybmFsX2V4ZWMpOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBiZmRfdm1hCi1nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pCi0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgYXN5bWJvbCAqc3ltYm9sID0gKihyZWxvYy0+c3ltX3B0cl9wdHIpOwotCi0gIC8qIEEgc3ltYm9sIGhvbGRzIGEgcG9pbnRlciB0byBhIHNlY3Rpb24sIGFuZCBhbiBvZmZzZXQgZnJvbSB0aGUKLSAgICAgYmFzZSBvZiB0aGUgc2VjdGlvbi4gIFRvIHJlbG9jYXRlLCB3ZSBmaW5kIHdoZXJlIHRoZSBzZWN0aW9uIHdpbGwKLSAgICAgbGl2ZSBpbiB0aGUgb3V0cHV0IGFuZCBhZGQgdGhhdCBpbiAqLwotCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIGluIHRoaXMgQkZELiAgTG9vayBpdCB1cCBpbiB0aGUKLQkgZ2xvYmFsIGxpbmtlciBoYXNoIHRhYmxlLiAgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgd2hlbgotCSB3ZSBjb252ZXJ0IGIub3V0IHRvIHVzZSBhIHNwZWNpZmljIGZpbmFsX2xpbmsgZnVuY3Rpb24gYW5kCi0JIGNoYW5nZSB0aGUgaW50ZXJmYWNlIHRvIGJmZF9yZWxheF9zZWN0aW9uIHRvIG5vdCByZXF1aXJlIHRoZQotCSBnZW5lcmljIHN5bWJvbHMuICAqLwotICAgICAgaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGlucHV0X3NlY3Rpb24tPm93bmVyLCBsaW5rX2luZm8sCi0JCQkJCWJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksCi0JCQkJCWZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgJiYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXZhbHVlID0gaC0+dS5kZWYudmFsdWUgKyBvdXRwdXRfYWRkciAoaC0+dS5kZWYuc2VjdGlvbik7Ci0gICAgICBlbHNlIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgICAgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JdmFsdWUgPSBoLT51LmMuc2l6ZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksCi0JCSAgaW5wdXRfc2VjdGlvbi0+b3duZXIsIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotCSAgdmFsdWUgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWx1ZSA9IHN5bWJvbC0+dmFsdWUgKyBvdXRwdXRfYWRkciAoc3ltYm9sLT5zZWN0aW9uKTsKLSAgICB9Ci0KLSAgLyogQWRkIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIHJlbG9jYXRpb24gKi8KLSAgdmFsdWUgKz0gcmVsb2MtPmFkZGVuZDsKLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wZXJmb3JtX3NsaXAgKGFiZmQsIHNsaXAsIGlucHV0X3NlY3Rpb24sIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBzbGlwOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgYXN5bWJvbCAqKnM7Ci0KLSAgcyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgQkZEX0FTU0VSVCAocyAhPSAoYXN5bWJvbCAqKikgTlVMTCk7Ci0KLSAgLyogRmluZCBhbGwgc3ltYm9scyBwYXN0IHRoaXMgcG9pbnQsIGFuZCBtYWtlIHRoZW0ga25vdwotICAgICB3aGF0J3MgaGFwcGVuZWQgKi8KLSAgd2hpbGUgKCpzKQotICB7Ci0gICAgYXN5bWJvbCAqcCA9ICpzOwotICAgIGlmIChwLT5zZWN0aW9uID09IGlucHV0X3NlY3Rpb24pCi0gICAgewotICAgICAgLyogVGhpcyB3YXMgcG9pbnRpbmcgaW50byB0aGlzIHNlY3Rpb24sIHNvIG1hbmdsZSBpdCAqLwotICAgICAgaWYgKHAtPnZhbHVlID4gdmFsdWUpCi0gICAgICB7Ci0JcC0+dmFsdWUgLT1zbGlwOwotCWlmIChwLT51ZGF0YS5wICE9IE5VTEwpCi0JICB7Ci0JICAgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICBoID0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBwLT51ZGF0YS5wOwotCSAgICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKTsKLQkgICAgaC0+cm9vdC51LmRlZi52YWx1ZSAtPSBzbGlwOwotCSAgICBCRkRfQVNTRVJUIChoLT5yb290LnUuZGVmLnZhbHVlID09IHAtPnZhbHVlKTsKLQkgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcysrOwotCi0gIH0KLX0KLQotLyogVGhpcyByb3V0aW5lIHdvcmtzIG91dCBpZiB0aGUgdGhpbmcgd2Ugd2FudCB0byBnZXQgdG8gY2FuIGJlCi0gICByZWFjaGVkIHdpdGggYSAyNGJpdCBvZmZzZXQgaW5zdGVhZCBvZiBhIDMyIGJpdCBvbmUuCi0gICBJZiBpdCBjYW4sIHRoZW4gaXQgY2hhbmdlcyB0aGUgYW1vZGUgKi8KLQotc3RhdGljIGludAotYWJzMzJjb2RlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCByLCBzaHJpbmssIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqcjsKLSAgICAgdW5zaWduZWQgaW50IHNocmluazsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgYmZkX3ZtYSB2YWx1ZSA9IGdldF92YWx1ZSAociwgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLSAgYmZkX3ZtYSBkb3QgPSBvdXRwdXRfYWRkciAoaW5wdXRfc2VjdGlvbikgKyByLT5hZGRyZXNzOwotICBiZmRfdm1hIGdhcDsKLQotICAvKiBTZWUgaWYgdGhlIGFkZHJlc3Mgd2UncmUgbG9va2luZyBhdCB3aXRoaW4gMl4yMyBieXRlcyBvZiB3aGVyZQotICAgICB3ZSBhcmUsIGlmIHNvIHRoZW4gd2UgY2FuIHVzZSBhIHNtYWxsIGJyYW5jaCByYXRoZXIgdGhhbiB0aGUKLSAgICAganVtcCB3ZSB3ZXJlIGdvaW5nIHRvICovCi0KLSAgZ2FwID0gdmFsdWUgLSAoZG90IC0gc2hyaW5rKTsKLQotCi0gIGlmICgtMTw8MjMgPCAobG9uZylnYXAgJiYgKGxvbmcpZ2FwIDwgMTw8MjMgKQotICB7Ci0gICAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlIGZyb20gMzJiaXRjb2RlIHBvc3NpYmxlIDI0LCB0byAyNGJpdAotICAgICAgIHBvc3NpYmxlIDMyICovCi0KLSAgICByLT5ob3d0byA9ICZob3d0b19yZWxvY19hYnMzMmNvZGVzaHJ1bms7Ci0gICAgLyogVGhlIHBsYWNlIHRvIHJlbGMgbW92ZXMgYmFjayBieSBmb3VyIGJ5dGVzICovCi0gICAgci0+YWRkcmVzcyAtPTQ7Ci0KLSAgICAvKiBUaGlzIHdpbGwgYmUgZm91ciBieXRlcyBzbWFsbGVyIGluIHRoZSBsb25nIHJ1biAqLwotICAgIHNocmluayArPSA0IDsKLSAgICBwZXJmb3JtX3NsaXAgKGFiZmQsIDQsIGlucHV0X3NlY3Rpb24sIHItPmFkZHJlc3Mtc2hyaW5rICsgNCk7Ci0gIH0KLSAgcmV0dXJuIHNocmluazsKLX0KLQotc3RhdGljIGludAotYWxpZ25jb2RlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCByLCBzaHJpbmspCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGFyZWxlbnQgKnI7Ci0gICAgIHVuc2lnbmVkIGludCBzaHJpbms7Ci17Ci0gIGJmZF92bWEgZG90ID0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pICsgci0+YWRkcmVzczsKLSAgYmZkX3ZtYSBnYXA7Ci0gIGJmZF92bWEgb2xkX2VuZDsKLSAgYmZkX3ZtYSBuZXdfZW5kOwotICBpbnQgc2hyaW5rX2RlbHRhOwotICBpbnQgc2l6ZSA9IHItPmhvd3RvLT5zaXplOwotCi0gIC8qIFJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgYWxpZ25tZW50IHNvIHRoYXQgaXQncyBzdGlsbCBhbGlnbmVkIGJ1dAotICAgICBzbWFsbGVyICAtIHRoZSBjdXJyZW50IHNpemUgaXMgYWxyZWFkeSB0aGUgc2FtZSBzaXplIGFzIG9yIGJpZ2dlcgotICAgICB0aGFuIHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAqLwotCi0gIC8qIGNhbGN1bGF0ZSB0aGUgZmlyc3QgYnl0ZSBmb2xsb3dpbmcgdGhlIHBhZGRpbmcgYmVmb3JlIHdlIG9wdGltaXplICovCi0gIG9sZF9lbmQgPSAoKGRvdCArIHNpemUgKSAmIH5zaXplKSArIHNpemUrMTsKLSAgLyogd29yayBvdXQgd2hlcmUgdGhlIG5ldyBlbmQgd2lsbCBiZSAtIHJlbWVtYmVyIHRoYXQgd2UncmUgc21hbGxlcgotICAgICB0aGFuIHdlIHVzZWQgdG8gYmUgKi8KLSAgbmV3X2VuZCA9ICgoZG90IC0gc2hyaW5rICsgc2l6ZSkgJiB+c2l6ZSk7Ci0KLSAgLyogVGhpcyBpcyB0aGUgbmV3IGVuZCAqLwotICBnYXAgPSBvbGRfZW5kIC0gKChkb3QgKyBzaXplKSAmIH5zaXplKTsKLQotICBzaHJpbmtfZGVsdGEgPSAob2xkX2VuZCAtIG5ld19lbmQpIC0gc2hyaW5rOwotCi0gIGlmIChzaHJpbmtfZGVsdGEpCi0gIHsKLSAgICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHNvIHRoYXQgaXQga25vd3MgaG93IGZhciB0byBhbGlnbiB0byAqLwotICAgIHItPmhvd3RvID0gaG93dG9fZG9uZV9hbGlnbl90YWJsZSArIChyLT5ob3d0byAtIGhvd3RvX2FsaWduX3RhYmxlKTsKLQotICAgIC8qIEVuY29kZSB0aGUgc3R1ZmYgaW50byB0aGUgYWRkZW5kIC0gZm9yIGZ1dHVyZSB1c2Ugd2UgbmVlZCB0bwotICAgICAgIGtub3cgaG93IGJpZyB0aGUgcmVsb2MgdXNlZCB0byBiZSAqLwotICAgIHItPmFkZGVuZCA9IG9sZF9lbmQgLSBkb3QgKyByLT5hZGRyZXNzOwotCi0gICAgLyogVGhpcyB3aWxsIGJlIE4gYnl0ZXMgc21hbGxlciBpbiB0aGUgbG9uZyBydW4sIGFkanVzdCBhbGwgdGhlIHN5bWJvbHMgKi8KLSAgICBwZXJmb3JtX3NsaXAgKGFiZmQsIHNocmlua19kZWx0YSwgaW5wdXRfc2VjdGlvbiwgci0+YWRkcmVzcyAtIHNocmluayk7Ci0gICAgc2hyaW5rICs9IHNocmlua19kZWx0YTsKLSAgfQotICByZXR1cm4gc2hyaW5rOwotfQotCi1zdGF0aWMgYm9vbGVhbgotYl9vdXRfYmZkX3JlbGF4X3NlY3Rpb24gKGFiZmQsIGksIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmk7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICAvKiBHZXQgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBzdHVmZiAqLwotICBiZmQgKmlucHV0X2JmZCA9IGktPm93bmVyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGk7Ci0gIGludCBzaHJpbmsgPSAwIDsKLSAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7Ci0gIGxvbmcgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQoaW5wdXRfYmZkLAotCQkJCQkgICAgICBpbnB1dF9zZWN0aW9uKTsKLQotICBpZiAocmVsb2Nfc2l6ZSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFdlIG9ubHkgcnVuIHRoaXMgcmVsYXhhdGlvbiBvbmNlLiAgSXQgbWlnaHQgd29yayB0byBydW4gaXQKLSAgICAgbXVsdGlwbGUgdGltZXMsIGJ1dCBpdCBoYXNuJ3QgYmVlbiB0ZXN0ZWQuICAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICBpZiAocmVsb2Nfc2l6ZSkKLSAgICB7Ci0gICAgICBsb25nIHJlbG9jX2NvdW50OwotCi0gICAgICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gICAgICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBHZXQgdGhlIHJlbG9jcyBhbmQgdGhpbmsgYWJvdXQgdGhlbSAqLwotICAgICAgcmVsb2NfY291bnQgPQotCWJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2NfdmVjdG9yLAotCQkJCV9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChpbnB1dF9iZmQpKTsKLSAgICAgIGlmIChyZWxvY19jb3VudCA8IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAocmVsb2NfY291bnQgPiAwKQotCXsKLQkgIGFyZWxlbnQgKipwYXJlbnQ7Ci0JICBmb3IgKHBhcmVudCA9IHJlbG9jX3ZlY3RvcjsgKnBhcmVudDsgcGFyZW50KyspCi0JICAgIHsKLQkgICAgICBhcmVsZW50ICpyID0gKnBhcmVudDsKLQkgICAgICBzd2l0Y2ggKHItPmhvd3RvLT50eXBlKQotCQl7Ci0JCWNhc2UgQUxJR05FUjoKLQkJICAvKiBBbiBhbGlnbm1lbnQgcmVsb2MgKi8KLQkJICBzaHJpbmsgPSBhbGlnbmNvZGUgKGFiZmQsIGlucHV0X3NlY3Rpb24sIHIsIHNocmluayk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTMzJDT0RFOgotCQkgIC8qIEEgMzJiaXQgcmVsb2MgaW4gYW4gYWRkcmVzc2luZyBtb2RlICovCi0JCSAgc2hyaW5rID0gYWJzMzJjb2RlIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHIsIHNocmluaywKLQkJCQkgICAgICBsaW5rX2luZm8pOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzMyQ09ERV9TSFJVTks6Ci0JCSAgc2hyaW5rKz00OwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUgLSBzaHJpbms7Ci0KLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJmZF9ieXRlICoKLWJfb3V0X2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKLQkJCQkJICBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICAvKiBHZXQgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBzdHVmZiAqLwotICBiZmQgKmlucHV0X2JmZCA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsCi0JCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLSAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7Ci0gIGxvbmcgcmVsb2NfY291bnQ7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIElmIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBkb24ndCBib3RoZXIgdG8gcmVsYXguICAqLwotICBpZiAocmVsb2NhdGVhYmxlKQotICAgIHJldHVybiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBsaW5rX29yZGVyLAotCQkJCQkJICAgICAgIGRhdGEsIHJlbG9jYXRlYWJsZSwKLQkJCQkJCSAgICAgICBzeW1ib2xzKTsKLQotICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gIGlmIChyZWxvY192ZWN0b3IgPT0gTlVMTCAmJiByZWxvY19zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaW5wdXRfc2VjdGlvbi0+cmVsb2NfZG9uZSA9IDE7Ci0KLSAgLyogcmVhZCBpbiB0aGUgc2VjdGlvbiAqLwotICBCRkRfQVNTRVJUICh0cnVlID09IGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLAotCQkJCQkJaW5wdXRfc2VjdGlvbiwKLQkJCQkJCWRhdGEsCi0JCQkJCQkwLAotCQkJCQkJaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKSk7Ci0KLSAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsCi0JCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCXJlbG9jX3ZlY3RvciwKLQkJCQkJc3ltYm9scyk7Ci0gIGlmIChyZWxvY19jb3VudCA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmIChyZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgYXJlbGVudCAqKnBhcmVudCA9IHJlbG9jX3ZlY3RvcjsKLSAgICAgIGFyZWxlbnQgKnJlbG9jIDsKLQotICAgICAgdW5zaWduZWQgaW50IGRzdF9hZGRyZXNzID0gMDsKLSAgICAgIHVuc2lnbmVkIGludCBzcmNfYWRkcmVzcyA9IDA7Ci0gICAgICB1bnNpZ25lZCBpbnQgcnVuOwotICAgICAgdW5zaWduZWQgaW50IGlkeDsKLQotICAgICAgLyogRmluZCBob3cgbG9uZyBhIHJ1biB3ZSBjYW4gZG8gKi8KLSAgICAgIHdoaWxlIChkc3RfYWRkcmVzcyA8IGxpbmtfb3JkZXItPnNpemUpCi0JewotCSAgcmVsb2MgPSAqcGFyZW50OwotCSAgaWYgKHJlbG9jKQotCSAgICB7Ci0JICAgICAgLyogTm90ZSB0aGF0IHRoZSByZWxheGluZyBkaWRuJ3QgdGllIHVwIHRoZSBhZGRyZXNzZXMgaW4gdGhlCi0JCSByZWxvY2F0aW9uLCBzbyB3ZSB1c2UgdGhlIG9yaWdpbmFsIGFkZHJlc3MgdG8gd29yayBvdXQgdGhlCi0JCSBydW4gb2Ygbm9uLXJlbG9jYXRlZCBkYXRhICovCi0JICAgICAgQkZEX0FTU0VSVCAocmVsb2MtPmFkZHJlc3MgPj0gc3JjX2FkZHJlc3MpOwotCSAgICAgIHJ1biA9IHJlbG9jLT5hZGRyZXNzIC0gc3JjX2FkZHJlc3M7Ci0JICAgICAgcGFyZW50Kys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJ1biA9IGxpbmtfb3JkZXItPnNpemUgLSBkc3RfYWRkcmVzczsKLQkgICAgfQotCSAgLyogQ29weSB0aGUgYnl0ZXMgKi8KLQkgIGZvciAoaWR4ID0gMDsgaWR4IDwgcnVuOyBpZHgrKykKLQkgICAgewotCSAgICAgIGRhdGFbZHN0X2FkZHJlc3MrK10gPSBkYXRhW3NyY19hZGRyZXNzKytdOwotCSAgICB9Ci0KLQkgIC8qIE5vdyBkbyB0aGUgcmVsb2NhdGlvbiAqLwotCi0JICBpZiAocmVsb2MpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKHJlbG9jLT5ob3d0by0+dHlwZSkKLQkJewotCQljYXNlIEFCUzMyQ09ERToKLQkJICBjYWxsanhfY2FsbGJhY2sgKGlucHV0X2JmZCwgbGlua19pbmZvLCByZWxvYywKLQkJCQkgICBzcmNfYWRkcmVzcyArIGRhdGEsIGRzdF9hZGRyZXNzICsgZGF0YSwKLQkJCQkgICBpbnB1dF9zZWN0aW9uKTsKLQkJICBzcmNfYWRkcmVzcys9NDsKLQkJICBkc3RfYWRkcmVzcys9NDsKLQkJICBicmVhazsKLQkJY2FzZSBBQlMzMjoKLQkJICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsCi0JCQkgICAgICAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBkYXRhICsgc3JjX2FkZHJlc3MpCi0JCQkgICAgICAgKyBnZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pKSwKLQkJCSAgICAgIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JCSAgc3JjX2FkZHJlc3MrPTQ7Ci0JCSAgZHN0X2FkZHJlc3MrPTQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQ0FMTEo6Ci0JCSAgY2FsbGpfY2FsbGJhY2sgKGlucHV0X2JmZCwgbGlua19pbmZvLCByZWxvYywgZGF0YSwKLQkJCQkgIHNyY19hZGRyZXNzLCBkc3RfYWRkcmVzcywgaW5wdXRfc2VjdGlvbiwKLQkJCQkgIGZhbHNlKTsKLQkJICBzcmNfYWRkcmVzcys9NDsKLQkJICBkc3RfYWRkcmVzcys9NDsKLQkJICBicmVhazsKLQkJY2FzZSBBTElHTkRPTkU6Ci0JCSAgQkZEX0FTU0VSVCAocmVsb2MtPmFkZGVuZCA+PSBzcmNfYWRkcmVzcyk7Ci0JCSAgQkZEX0FTU0VSVCAocmVsb2MtPmFkZGVuZCA8PSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCQkgIHNyY19hZGRyZXNzID0gcmVsb2MtPmFkZGVuZDsKLQkJICBkc3RfYWRkcmVzcyA9ICgoZHN0X2FkZHJlc3MgKyByZWxvYy0+aG93dG8tPnNpemUpCi0JCQkJICYgfnJlbG9jLT5ob3d0by0+c2l6ZSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTMzJDT0RFX1NIUlVOSzoKLQkJICAvKiBUaGlzIHVzZWQgdG8gYmUgYSBjYWxseCwgYnV0IHdlJ3ZlIGZvdW5kIG91dCB0aGF0IGEKLQkJICAgICBjYWxsaiB3aWxsIHJlYWNoLCBzbyBkbyB0aGUgcmlnaHQgdGhpbmcuICAqLwotCQkgIGNhbGxqX2NhbGxiYWNrIChpbnB1dF9iZmQsIGxpbmtfaW5mbywgcmVsb2MsIGRhdGEsCi0JCQkJICBzcmNfYWRkcmVzcyArIDQsIGRzdF9hZGRyZXNzLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgdHJ1ZSk7Ci0JCSAgZHN0X2FkZHJlc3MrPTQ7Ci0JCSAgc3JjX2FkZHJlc3MrPTg7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUENSRUwyNDoKLQkJICB7Ci0JCSAgICBsb25nIGludCB3b3JkID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJCQkJZGF0YSArIHNyY19hZGRyZXNzKTsKLQkJICAgIGJmZF92bWEgdmFsdWU7Ci0KLQkJICAgIHZhbHVlID0gZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQkJICAgIHdvcmQgPSAoKHdvcmQgJiB+QkFMX01BU0spCi0JCQkgICAgfCAoKCh3b3JkICYgQkFMX01BU0spCi0JCQkJKyB2YWx1ZQotCQkJCS0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pCi0JCQkJKyByZWxvYy0+YWRkZW5kKQotCQkJICAgICAgICYgQkFMX01BU0spKTsKLQotCQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB3b3JkLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCQkgICAgZHN0X2FkZHJlc3MrPTQ7Ci0JCSAgICBzcmNfYWRkcmVzcys9NDsKLQotCQkgIH0KLQkJICBicmVhazsKLQotCQljYXNlIFBDUkVMMTM6Ci0JCSAgewotCQkgICAgbG9uZyBpbnQgd29yZCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkJCWRhdGEgKyBzcmNfYWRkcmVzcyk7Ci0JCSAgICBiZmRfdm1hIHZhbHVlOwotCi0JCSAgICB2YWx1ZSA9IGdldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0JCSAgICB3b3JkID0gKCh3b3JkICYgflBDUkVMMTNfTUFTSykKLQkJCSAgICB8ICgoKHdvcmQgJiBQQ1JFTDEzX01BU0spCi0JCQkJKyB2YWx1ZQotCQkJCSsgcmVsb2MtPmFkZGVuZAotCQkJCS0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pKQotCQkJICAgICAgICYgUENSRUwxM19NQVNLKSk7Ci0KLQkJICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgd29yZCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQkJICAgIGRzdF9hZGRyZXNzKz00OwotCQkgICAgc3JjX2FkZHJlc3MrPTQ7Ci0KLQkJICB9Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBhYm9ydCgpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIGRhdGE7Ci0gZXJyb3JfcmV0dXJuOgotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEJ1aWxkIHRoZSB0cmFuc2ZlciB2ZWN0b3JzIGZvciBCaWcgYW5kIExpdHRsZS1FbmRpYW4gQi5PVVQgZmlsZXMuICAqLwotCi0jZGVmaW5lIGFvdXRfMzJfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwIGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBiX291dF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBiX291dF9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBiX291dF9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBiX291dF9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0jZGVmaW5lIGJfb3V0X2JmZF9nY19zZWN0aW9ucyAgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLQotI2RlZmluZSBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotY29uc3QgYmZkX3RhcmdldCBiX291dF92ZWNfYmlnX2hvc3QgPQotewotICAiYi5vdXQuYmlnIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZHIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEJGRF9JU19SRUxBWEFCTEUgKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICAnXycsCQkJCS8qIHN5bWJvbCBsZWFkaW5nIGNoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLSB7X2JmZF9kdW1teV90YXJnZXQsIGJfb3V0X29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBiX291dF9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0ge2JmZF9mYWxzZSwgYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYl9vdXQpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYl9vdXQpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiX291dCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAwLAotfTsKLQotCi1jb25zdCBiZmRfdGFyZ2V0IGJfb3V0X3ZlY19saXR0bGVfaG9zdCA9Ci17Ci0gICJiLm91dC5saXR0bGUiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFICksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgJ18nLAkJCQkvKiBzeW1ib2wgbGVhZGluZyBjaGFyICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBiX291dF9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgYl9vdXRfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGJfb3V0X3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYl9vdXQpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYl9vdXQpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiX291dCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NhY2hlLmMgYi9iZmQvY2FjaGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4ZGU0Yi4uMDAwMDAwMAotLS0gYS9iZmQvY2FjaGUuYworKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKiBCRkQgbGlicmFyeSAtLSBjYWNoaW5nIG9mIGZpbGUgZGVzY3JpcHRvcnMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0IChzdGV2ZUBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCUZpbGUgY2FjaGluZwotCi0JVGhlIGZpbGUgY2FjaGluZyBtZWNoYW5pc20gaXMgZW1iZWRkZWQgd2l0aGluIEJGRCBhbmQgYWxsb3dzCi0JdGhlIGFwcGxpY2F0aW9uIHRvIG9wZW4gYXMgbWFueSBCRkRzIGFzIGl0IHdhbnRzIHdpdGhvdXQKLQlyZWdhcmQgdG8gdGhlIHVuZGVybHlpbmcgb3BlcmF0aW5nIHN5c3RlbSdzIGZpbGUgZGVzY3JpcHRvcgotCWxpbWl0IChvZnRlbiBhcyBsb3cgYXMgMjAgb3BlbiBmaWxlcykuICBUaGUgbW9kdWxlIGluCi0JPDxjYWNoZS5jPj4gbWFpbnRhaW5zIGEgbGVhc3QgcmVjZW50bHkgdXNlZCBsaXN0IG9mCi0JPDxCRkRfQ0FDSEVfTUFYX09QRU4+PiBmaWxlcywgYW5kIGV4cG9ydHMgdGhlIG5hbWUKLQk8PGJmZF9jYWNoZV9sb29rdXA+Piwgd2hpY2ggcnVucyBhcm91bmQgYW5kIG1ha2VzIHN1cmUgdGhhdAotCXRoZSByZXF1aXJlZCBCRkQgaXMgb3Blbi4gSWYgbm90LCB0aGVuIGl0IGNob29zZXMgYSBmaWxlIHRvCi0JY2xvc2UsIGNsb3NlcyBpdCBhbmQgb3BlbnMgdGhlIG9uZSB3YW50ZWQsIHJldHVybmluZyBpdHMgZmlsZQotCWhhbmRsZS4gCi0KLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotc3RhdGljIHZvaWQgaW5zZXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzbmlwIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjbG9zZV9vbmUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gYmZkX2NhY2hlX2RlbGV0ZSBQQVJBTVMgKChiZmQgKikpOwotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQlCRkRfQ0FDSEVfTUFYX09QRU4gbWFjcm8KLQotREVTQ1JJUFRJT04KLQlUaGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZXMgd2hpY2ggdGhlIGNhY2hlIHdpbGwga2VlcCBvcGVuIGF0Ci0Jb25lIHRpbWUuCi0KLS4jZGVmaW5lIEJGRF9DQUNIRV9NQVhfT1BFTiAxMAotCi0qLwotCi0vKiBUaGUgbnVtYmVyIG9mIEJGRCBmaWxlcyB3ZSBoYXZlIG9wZW4uICAqLwotCi1zdGF0aWMgaW50IG9wZW5fZmlsZXM7Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9sYXN0X2NhY2hlCi0KLVNZTk9QU0lTCi0JZXh0ZXJuIGJmZCAqYmZkX2xhc3RfY2FjaGU7Ci0KLURFU0NSSVBUSU9OCi0JWmVybywgb3IgYSBwb2ludGVyIHRvIHRoZSB0b3Btb3N0IEJGRCBvbiB0aGUgY2hhaW4uICBUaGlzIGlzCi0JdXNlZCBieSB0aGUgPDxiZmRfY2FjaGVfbG9va3VwPj4gbWFjcm8gaW4gQGZpbGV7bGliYmZkLmh9IHRvCi0JZGV0ZXJtaW5lIHdoZW4gaXQgY2FuIGF2b2lkIGEgZnVuY3Rpb24gY2FsbC4KLSovCi0KLWJmZCAqYmZkX2xhc3RfY2FjaGU7Ci0KLS8qCi0gIElOVEVSTkFMX0ZVTkNUSU9OCi0gIAliZmRfY2FjaGVfbG9va3VwCi0gCi0gIERFU0NSSVBUSU9OCi0gCUNoZWNrIHRvIHNlZSBpZiB0aGUgcmVxdWlyZWQgQkZEIGlzIHRoZSBzYW1lIGFzIHRoZSBsYXN0IG9uZQotIAlsb29rZWQgdXAuIElmIHNvLCB0aGVuIGl0IGNhbiB1c2UgdGhlIHN0cmVhbSBpbiB0aGUgQkZEIHdpdGgKLSAJaW1wdW5pdHksIHNpbmNlIGl0IGNhbid0IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBsb29rdXA7Ci0gCW90aGVyd2lzZSwgaXQgaGFzIHRvIHBlcmZvcm0gdGhlIGNvbXBsaWNhdGVkIGxvb2t1cCBmdW5jdGlvbi4KLSAKLSAgLiNkZWZpbmUgYmZkX2NhY2hlX2xvb2t1cCh4KSBcCi0gIC4gICAgKCh4KT09YmZkX2xhc3RfY2FjaGU/IFwKLSAgLiAgICAgIChGSUxFKikoYmZkX2xhc3RfY2FjaGUtPmlvc3RyZWFtKTogXAotICAuICAgICAgIGJmZF9jYWNoZV9sb29rdXBfd29ya2VyKHgpKQotIAotIAotICovCi0KLS8qIEluc2VydCBhIEJGRCBpbnRvIHRoZSBjYWNoZS4gICovCi0KLXN0YXRpYyBJTkxJTkUgdm9pZAotaW5zZXJ0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChiZmRfbGFzdF9jYWNoZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFiZmQtPmxydV9uZXh0ID0gYWJmZDsKLSAgICAgIGFiZmQtPmxydV9wcmV2ID0gYWJmZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhYmZkLT5scnVfbmV4dCA9IGJmZF9sYXN0X2NhY2hlOwotICAgICAgYWJmZC0+bHJ1X3ByZXYgPSBiZmRfbGFzdF9jYWNoZS0+bHJ1X3ByZXY7Ci0gICAgICBhYmZkLT5scnVfcHJldi0+bHJ1X25leHQgPSBhYmZkOwotICAgICAgYWJmZC0+bHJ1X25leHQtPmxydV9wcmV2ID0gYWJmZDsKLSAgICB9Ci0gIGJmZF9sYXN0X2NhY2hlID0gYWJmZDsKLX0KLQotLyogUmVtb3ZlIGEgQkZEIGZyb20gdGhlIGNhY2hlLiAgKi8KLQotc3RhdGljIElOTElORSB2b2lkCi1zbmlwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFiZmQtPmxydV9wcmV2LT5scnVfbmV4dCA9IGFiZmQtPmxydV9uZXh0OwotICBhYmZkLT5scnVfbmV4dC0+bHJ1X3ByZXYgPSBhYmZkLT5scnVfcHJldjsKLSAgaWYgKGFiZmQgPT0gYmZkX2xhc3RfY2FjaGUpCi0gICAgewotICAgICAgYmZkX2xhc3RfY2FjaGUgPSBhYmZkLT5scnVfbmV4dDsKLSAgICAgIGlmIChhYmZkID09IGJmZF9sYXN0X2NhY2hlKQotCWJmZF9sYXN0X2NhY2hlID0gTlVMTDsKLSAgICB9Ci19Ci0KLS8qIFdlIG5lZWQgdG8gb3BlbiBhIG5ldyBmaWxlLCBhbmQgdGhlIGNhY2hlIGlzIGZ1bGwuICBGaW5kIHRoZSBsZWFzdAotICAgcmVjZW50bHkgdXNlZCBjYWNoZWFibGUgQkZEIGFuZCBjbG9zZSBpdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jbG9zZV9vbmUgKCkKLXsKLSAgcmVnaXN0ZXIgYmZkICpraWxsOwotCi0gIGlmIChiZmRfbGFzdF9jYWNoZSA9PSBOVUxMKQotICAgIGtpbGwgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgZm9yIChraWxsID0gYmZkX2xhc3RfY2FjaGUtPmxydV9wcmV2OwotCSAgICEga2lsbC0+Y2FjaGVhYmxlOwotCSAgIGtpbGwgPSBraWxsLT5scnVfcHJldikKLQl7Ci0JICBpZiAoa2lsbCA9PSBiZmRfbGFzdF9jYWNoZSkKLQkgICAgewotCSAgICAgIGtpbGwgPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoa2lsbCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGFyZSBubyBvcGVuIGNhY2hlYWJsZSBCRkQncy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAga2lsbC0+d2hlcmUgPSBmdGVsbCAoKEZJTEUgKikga2lsbC0+aW9zdHJlYW0pOwotCi0gIHJldHVybiBiZmRfY2FjaGVfZGVsZXRlIChraWxsKTsKLX0KLQotLyogQ2xvc2UgYSBCRkQgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBjYWNoZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1iZmRfY2FjaGVfZGVsZXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJvb2xlYW4gcmV0OwotCi0gIGlmIChmY2xvc2UgKChGSUxFICopIGFiZmQtPmlvc3RyZWFtKSA9PSAwKQotICAgIHJldCA9IHRydWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXQgPSBmYWxzZTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgfQotCi0gIHNuaXAgKGFiZmQpOwotCi0gIGFiZmQtPmlvc3RyZWFtID0gTlVMTDsKLSAgLS1vcGVuX2ZpbGVzOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9jYWNoZV9pbml0Ci0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY2FjaGVfaW5pdCAoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlBZGQgYSBuZXdseSBvcGVuZWQgQkZEIHRvIHRoZSBjYWNoZS4KLSovCi0KLWJvb2xlYW4KLWJmZF9jYWNoZV9pbml0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEJGRF9BU1NFUlQgKGFiZmQtPmlvc3RyZWFtICE9IE5VTEwpOwotICBpZiAob3Blbl9maWxlcyA+PSBCRkRfQ0FDSEVfTUFYX09QRU4pCi0gICAgewotICAgICAgaWYgKCEgY2xvc2Vfb25lICgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGluc2VydCAoYWJmZCk7Ci0gICsrb3Blbl9maWxlczsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9jYWNoZV9jbG9zZQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NhY2hlX2Nsb3NlIChiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJlbW92ZSB0aGUgQkZEIEB2YXJ7YWJmZH0gZnJvbSB0aGUgY2FjaGUuIElmIHRoZSBhdHRhY2hlZCBmaWxlIGlzIG9wZW4sCi0JdGhlbiBjbG9zZSBpdCB0b28uCi0KLVJFVFVSTlMKLQk8PGZhbHNlPj4gaXMgcmV0dXJuZWQgaWYgY2xvc2luZyB0aGUgZmlsZSBmYWlscywgPDx0cnVlPj4gaXMKLQlyZXR1cm5lZCBpZiBhbGwgaXMgd2VsbC4KLSovCi0KLWJvb2xlYW4KLWJmZF9jYWNoZV9jbG9zZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+aW9zdHJlYW0gPT0gTlVMTAotICAgICAgfHwgKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gYmZkX2NhY2hlX2RlbGV0ZSAoYWJmZCk7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9vcGVuX2ZpbGUKLQotU1lOT1BTSVMKLQlGSUxFKiBiZmRfb3Blbl9maWxlKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JQ2FsbCB0aGUgT1MgdG8gb3BlbiBhIGZpbGUgZm9yIEB2YXJ7YWJmZH0uICBSZXR1cm4gdGhlIDw8RklMRSAqPj4KLQkocG9zc2libHkgPDxOVUxMPj4pIHRoYXQgcmVzdWx0cyBmcm9tIHRoaXMgb3BlcmF0aW9uLiAgU2V0IHVwIHRoZQotCUJGRCBzbyB0aGF0IGZ1dHVyZSBhY2Nlc3NlcyBrbm93IHRoZSBmaWxlIGlzIG9wZW4uIElmIHRoZSA8PEZJTEUgKj4+Ci0JcmV0dXJuZWQgaXMgPDxOVUxMPj4sIHRoZW4gaXQgd29uJ3QgaGF2ZSBiZWVuIHB1dCBpbiB0aGUKLQljYWNoZSwgc28gaXQgd29uJ3QgaGF2ZSB0byBiZSByZW1vdmVkIGZyb20gaXQuCi0qLwotCi1GSUxFICoKLWJmZF9vcGVuX2ZpbGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYWJmZC0+Y2FjaGVhYmxlID0gdHJ1ZTsJLyogQWxsb3cgaXQgdG8gYmUgY2xvc2VkIGxhdGVyLiAqLwotCi0gIGlmIChvcGVuX2ZpbGVzID49IEJGRF9DQUNIRV9NQVhfT1BFTikKLSAgICB7Ci0gICAgICBpZiAoISBjbG9zZV9vbmUgKCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHN3aXRjaCAoYWJmZC0+ZGlyZWN0aW9uKQotICAgIHsKLSAgICBjYXNlIHJlYWRfZGlyZWN0aW9uOgotICAgIGNhc2Ugbm9fZGlyZWN0aW9uOgotICAgICAgYWJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmb3BlbiAoYWJmZC0+ZmlsZW5hbWUsIEZPUEVOX1JCKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYm90aF9kaXJlY3Rpb246Ci0gICAgY2FzZSB3cml0ZV9kaXJlY3Rpb246Ci0gICAgICBpZiAoYWJmZC0+b3BlbmVkX29uY2UgPT0gdHJ1ZSkKLQl7Ci0JICBhYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZvcGVuIChhYmZkLT5maWxlbmFtZSwgRk9QRU5fUlVCKTsKLQkgIGlmIChhYmZkLT5pb3N0cmVhbSA9PSBOVUxMKQotCSAgICBhYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZvcGVuIChhYmZkLT5maWxlbmFtZSwgRk9QRU5fV1VCKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ3JlYXRlIHRoZSBmaWxlLiAgVW5saW5rIGl0IGZpcnN0LCBmb3IgdGhlIGNvbnZlbmllbmNlIG9mCi0gICAgICAgICAgICAgb3BlcmF0aW5nIHN5c3RlbXMgd2hpY2ggd29ycnkgYWJvdXQgb3ZlcndyaXRpbmcgcnVubmluZwotICAgICAgICAgICAgIGJpbmFyaWVzLiAgKi8KLQkgIHVubGluayAoYWJmZC0+ZmlsZW5hbWUpOwotCSAgYWJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmb3BlbiAoYWJmZC0+ZmlsZW5hbWUsIEZPUEVOX1dCKTsKLQkgIGFiZmQtPm9wZW5lZF9vbmNlID0gdHJ1ZTsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGFiZmQtPmlvc3RyZWFtICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYmZkX2NhY2hlX2luaXQgKGFiZmQpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKEZJTEUgKikgYWJmZC0+aW9zdHJlYW07Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9jYWNoZV9sb29rdXBfd29ya2VyCi0KLVNZTk9QU0lTCi0JRklMRSAqYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlDYWxsZWQgd2hlbiB0aGUgbWFjcm8gPDxiZmRfY2FjaGVfbG9va3VwPj4gZmFpbHMgdG8gZmluZCBhCi0JcXVpY2sgYW5zd2VyLiAgRmluZCBhIGZpbGUgZGVzY3JpcHRvciBmb3IgQHZhcnthYmZkfS4gIElmCi0JbmVjZXNzYXJ5LCBpdCBvcGVuIGl0LiAgSWYgdGhlcmUgYXJlIGFscmVhZHkgbW9yZSB0aGFuCi0JPDxCRkRfQ0FDSEVfTUFYX09QRU4+PiBmaWxlcyBvcGVuLCBpdCB0cmllcyB0byBjbG9zZSBvbmUgZmlyc3QsIHRvCi0JYXZvaWQgcnVubmluZyBvdXQgb2YgZmlsZSBkZXNjcmlwdG9ycy4gIAotKi8KLQotRklMRSAqCi1iZmRfY2FjaGVfbG9va3VwX3dvcmtlciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoYWJmZC0+bXlfYXJjaGl2ZSkgCi0gICAgYWJmZCA9IGFiZmQtPm15X2FyY2hpdmU7Ci0KLSAgaWYgKGFiZmQtPmlvc3RyZWFtICE9IE5VTEwpCi0gICAgewotICAgICAgLyogTW92ZSB0aGUgZmlsZSB0byB0aGUgc3RhcnQgb2YgdGhlIGNhY2hlLiAgKi8KLSAgICAgIGlmIChhYmZkICE9IGJmZF9sYXN0X2NhY2hlKQotCXsKLQkgIHNuaXAgKGFiZmQpOwotCSAgaW5zZXJ0IChhYmZkKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGJmZF9vcGVuX2ZpbGUgKGFiZmQpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBpZiAoZnNlZWsgKChGSUxFICopIGFiZmQtPmlvc3RyZWFtLCBhYmZkLT53aGVyZSwgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoRklMRSAqKSBhYmZkLT5pb3N0cmVhbTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9jZi1pMzg2bHlueC5jIGIvYmZkL2NmLWkzODZseW54LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMTRiZGUuLjAwMDAwMDAKLS0tIGEvYmZkL2NmLWkzODZseW54LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDM4NiBDT0ZGIEx5bnhPUyBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQlpMzg2bHlueF9jb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkiY29mZi1pMzg2LWx5bngiCi0KLSNkZWZpbmUgTFlOWE9TCi0KLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotCi0jaW5jbHVkZSAiY29mZi1pMzg2LmMiCmRpZmYgLS1naXQgYS9iZmQvY2YtbTY4a2x5bnguYyBiL2JmZC9jZi1tNjhrbHlueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njc0ZjFiLi4wMDAwMDAwCi0tLSBhL2JmZC9jZi1tNjhrbHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSBNNjhLIENPRkYgTHlueE9TIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQltNjhrbHlueF9jb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkiY29mZi1tNjhrLWx5bngiCi0jZGVmaW5lIExZTlhPUwotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0jZGVmaW5lIFNUQVRJQ19SRUxPQ1MKLSNkZWZpbmUgQ09GRl9DT01NT05fQURERU5ECi0KLSNpbmNsdWRlICJjb2ZmLW02OGsuYyIKZGlmZiAtLWdpdCBhL2JmZC9jZi1zcGFyY2x5bnguYyBiL2JmZC9jZi1zcGFyY2x5bnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0YTA5OS4uMDAwMDAwMAotLS0gYS9iZmQvY2Ytc3BhcmNseW54LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFNwYXJjIENPRkYgTHlueE9TIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQlzcGFyY2x5bnhfY29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtc3BhcmMtbHlueCIKLQotI2RlZmluZSBMWU5YT1MKLQotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0KLSNpbmNsdWRlICJjb2ZmLXNwYXJjLmMiCmRpZmYgLS1naXQgYS9iZmQvY2lzY28tY29yZS5jIGIvYmZkL2Npc2NvLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjOWJiZC4uMDAwMDAwMAotLS0gYS9iZmQvY2lzY28tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQ0lTQ08gY3Jhc2ggZHVtcHMuCi0KLUNvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLS8qIGNvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCByZXR1cm5zIGEgaG9zdCBzaWduYWwgKHRoaXMgcHJvYmFibHkgc2hvdWxkCi0gICBiZSBmaXhlZCkuICAqLwotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0vKiBmb3IgTVNWQyBidWlsZHMgKi8KLSNpZm5kZWYgU0lHVFJBUAotIyBkZWZpbmUgU0lHVFJBUCA1Ci0jZW5kaWYKLSNpZm5kZWYgU0lHRU1UCi0jIGRlZmluZSBTSUdFTVQgNgotI2VuZGlmCi0jaWZuZGVmIFNJR0JVUwotIyBkZWZpbmUgU0lHQlVTIDEwCi0jZW5kaWYKLQwKLSNkZWZpbmUgQ1JBU0hfSU5GTyAoMHhmZmMpCi0jZGVmaW5lIENSQVNIX01BR0lDIDB4ZGVhZDEyMzQKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBDUkFTSF9SRUFTT05fTk9UQ1JBU0hFRCA9IDAsCi0gICAgQ1JBU0hfUkVBU09OX0VYQ0VQVElPTiA9IDEsCi0gICAgQ1JBU0hfUkVBU09OX0NPUlJVUFQgPSAyLAotICB9IGNyYXNocmVhc29uOwotCi1zdHJ1Y3QgY3Jhc2hpbmZvX2V4dGVybmFsCi17Ci0gIGNoYXIgbWFnaWNbNF07CQkJLyogTWFnaWMgbnVtYmVyICovCi0gIGNoYXIgdmVyc2lvbls0XTsJCS8qIFZlcnNpb24gbnVtYmVyICovCi0gIGNoYXIgcmVhc29uWzRdOwkJLyogQ3Jhc2ggcmVhc29uICovCi0gIGNoYXIgY3B1X3ZlY3Rvcls0XTsJCS8qIENQVSB2ZWN0b3IgZm9yIGV4Y2VwdGlvbnMgKi8KLSAgY2hhciByZWdpc3RlcnNbNF07CQkvKiBQb2ludGVyIHRvIHNhdmVkIHJlZ2lzdGVycyAqLwotICBjaGFyIHJhbWJhc2VbNF07CQkvKiBCYXNlIG9mIFJBTSAobm90IGluIFYxIGNyYXNoIGluZm8pICovCi19OwotDAotc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0Ci17Ci0gIGludCBzaWc7Ci19OwotDAotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotY2lzY29fY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciBidWZbNF07Ci0gIHVuc2lnbmVkIGludCBjcmFzaGluZm9fb2Zmc2V0OwotICBzdHJ1Y3QgY3Jhc2hpbmZvX2V4dGVybmFsIGNyYXNoaW5mbzsKLSAgaW50IG5yZWFkOwotICB1bnNpZ25lZCBpbnQgcmFtYmFzZTsKLSAgc2VjX3B0ciBhc2VjdDsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIENSQVNIX0lORk8sIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIG5yZWFkID0gYmZkX3JlYWQgKGJ1ZiwgMSwgNCwgYWJmZCk7Ci0gIGlmIChucmVhZCAhPSA0KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgY3Jhc2hpbmZvX29mZnNldCA9IGJmZF9nZXRfMzIgKGFiZmQsIGJ1Zik7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBjcmFzaGluZm9fb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBucmVhZCA9IGJmZF9yZWFkICgmY3Jhc2hpbmZvLCAxLCBzaXplb2YgKGNyYXNoaW5mbyksIGFiZmQpOwotICBpZiAobnJlYWQgIT0gc2l6ZW9mIChjcmFzaGluZm8pKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX2dldF8zMiAoYWJmZCwgY3Jhc2hpbmZvLm1hZ2ljKSAhPSBDUkFTSF9NQUdJQykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBzd2l0Y2ggKGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby52ZXJzaW9uKSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICBjYXNlIDE6Ci0gICAgICByYW1iYXNlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAyOgotICAgICAgcmFtYmFzZSA9IGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5yYW1iYXNlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUuICAqLwotCi0gIGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YSA9Ci0gICAgKChzdHJ1Y3QgY2lzY29fY29yZV9zdHJ1Y3QgKikKLSAgICAgYmZkX3ptYWxsb2MgKHNpemVvZiAoc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0KSkpOwotICBpZiAoYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3dpdGNoICgoY3Jhc2hyZWFzb24pIGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5yZWFzb24pKQotICAgIHsKLSAgICBjYXNlIENSQVNIX1JFQVNPTl9OT1RDUkFTSEVEOgotICAgICAgLyogQ3Jhc2ggZmlsZSBwcm9iYWJseSBjYW1lIGZyb20gd3JpdGUgY29yZS4gICovCi0gICAgICBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENSQVNIX1JFQVNPTl9DT1JSVVBUOgotICAgICAgLyogVGhlIGNyYXNoIGNvbnRleHQgYXJlYSB3YXMgY29ycnVwdCAtLSBwcm9jZWVkIHdpdGggY2F1dGlvbi4KLQkgV2UgaGF2ZSBubyB3YXkgb2YgcGFzc2luZyB0aGlzIGluZm9ybWF0aW9uIGJhY2sgdG8gdGhlIGNhbGxlci4gICovCi0gICAgICBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENSQVNIX1JFQVNPTl9FWENFUFRJT046Ci0gICAgICAvKiBDcmFzaCBvY2N1cmVkIGR1ZSB0byBDUFUgZXhjZXB0aW9uLiAgKi8KLQotICAgICAgLyogVGhpcyBpcyA2OGstc3BlY2lmaWM7IGZvciBNSVBTIHdlJ2xsIG5lZWQgdG8gaW50ZXJwcmV0Ci0JIGNwdV92ZWN0b3IgZGlmZmVyZW50bHkgYmFzZWQgb24gdGhlIHRhcmdldCBjb25maWd1cmF0aW9uCi0JIChzaW5jZSBDSVNDTyBjb3JlIGZpbGVzIGRvbid0IHNlZW0gdG8gaGF2ZSB0aGUgcHJvY2Vzc29yCi0JIGVuY29kZWQgaW4gdGhlbSkuICAqLwotCi0gICAgICBzd2l0Y2ggKGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5jcHVfdmVjdG9yKSkKLQl7Ci0JICAgLyogYnVzIGVycm9yICAgICAgICAgICAqLwotCWNhc2UgMiA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHQlVTOyBicmVhazsKLQkgICAvKiBhZGRyZXNzIGVycm9yICAgICAgICovCi0JY2FzZSAzIDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdCVVM7IGJyZWFrOwotCSAgIC8qIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gKi8KLQljYXNlIDQgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0lMTDsgIGJyZWFrOwotCSAgIC8qIHplcm8gZGl2aWRlICAgICAgICAgKi8KLQljYXNlIDUgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgIC8qIGNoayBpbnN0cnVjdGlvbiAgICAgKi8KLQljYXNlIDYgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgYnJlYWs7Ci0JICAgLyogdHJhcHYgaW5zdHJ1Y3Rpb24gICAqLwotCWNhc2UgNyA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyBicmVhazsKLQkgICAvKiBwcml2aWxlZ2UgdmlvbGF0aW9uICovCi0JY2FzZSA4IDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdTRUdWOyBicmVhazsKLQkgICAvKiB0cmFjZSB0cmFwICAgICAgICAgICovCi0JY2FzZSA5IDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdUUkFQOyAgYnJlYWs7Ci0JICAgLyogbGluZSAxMDEwIGVtdWxhdG9yICAqLwotCWNhc2UgMTA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHSUxMOyAgYnJlYWs7Ci0JICAgLyogbGluZSAxMTExIGVtdWxhdG9yICAqLwotCWNhc2UgMTE6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHSUxMOyAgYnJlYWs7Ci0KLQkgIC8qIENvcHJvY2Vzc29yIHByb3RvY29sIHZpb2xhdGlvbi4gIFVzaW5nIGEgc3RhbmRhcmQgTU1VIG9yIEZQVQotCSAgICAgdGhpcyBjYW5ub3QgYmUgdHJpZ2dlcmVkIGJ5IHNvZnR3YXJlLiAgQ2FsbCBpdCBhIFNJR0JVUy4gICovCi0JY2FzZSAxMzogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdCVVM7ICBicmVhazsKLQotCSAgLyogaW50ZXJydXB0ICAgICAgICAgICAqLwotCWNhc2UgMzE6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHSU5UOyAgYnJlYWs7Ci0JICAvKiBicmVha3BvaW50ICAgICAgICAgICovCi0JY2FzZSAzMzogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdUUkFQOyAgYnJlYWs7Ci0KLQkgIC8qIGZsb2F0aW5nIHBvaW50IGVyciAgKi8KLQljYXNlIDQ4OiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgLyogZmxvYXRpbmcgcG9pbnQgZXJyICAqLwotCWNhc2UgNDk6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAvKiB6ZXJvIGRpdmlkZSAgICAgICAgICovCi0JY2FzZSA1MDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKLQkgIC8qIHVuZGVyZmxvdyAgICAgICAgICAgKi8KLQljYXNlIDUxOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgLyogb3BlcmFuZCBlcnJvciAgICAgICAqLwotCWNhc2UgNTI6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAgLyogb3ZlcmZsb3cgICAgICAgICAgICAqLwotCWNhc2UgNTM6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAvKiBOQU4gICAgICAgICAgICAgICAgICovCi0JY2FzZSA1NDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKLQlkZWZhdWx0OgotI2lmbmRlZiBTSUdFTVQKLSNkZWZpbmUgU0lHRU1UIFNJR1RSQVAKLSNlbmRpZgotCSAgLyogInNvZnR3YXJlIGdlbmVyYXRlZCIqLwotCSAgYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdFTVQ7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFVua25vd24gY3Jhc2ggcmVhc29uLiAgKi8KLSAgICAgIGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBhYmZkLT5zZWN0aW9ucyA9IE5VTEw7Ci0gIGFiZmQtPnNlY3Rpb25fY291bnQgPSAwOwotCi0gIGFzZWN0ID0gKGFzZWN0aW9uICopIGJmZF96bWFsbG9jIChzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChhc2VjdCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBhc2VjdC0+bmFtZSA9ICIucmVnIjsKLSAgYXNlY3QtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLSAgLyogVGhpcyBjYW4gYmUgYmlnZ2VyIHRoYW4gdGhlIHJlYWwgc2l6ZS4gIFNldCBpdCB0byB0aGUgc2l6ZSBvZiB0aGUgd2hvbGUKLSAgICAgY29yZSBmaWxlLiAgKi8KLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IHN0YXRidWYuc3Rfc2l6ZTsKLSAgYXNlY3QtPnZtYSA9IDA7Ci0gIGFzZWN0LT5maWxlcG9zID0gYmZkX2dldF8zMiAoYWJmZCwgY3Jhc2hpbmZvLnJlZ2lzdGVycykgLSByYW1iYXNlOwotICBhc2VjdC0+bmV4dCA9IGFiZmQtPnNlY3Rpb25zOwotICBhYmZkLT5zZWN0aW9ucyA9IGFzZWN0OwotICArK2FiZmQtPnNlY3Rpb25fY291bnQ7Ci0KLSAgLyogVGhlcmUgaXMgb25seSBvbmUgc2VjdGlvbiBjb250YWluaW5nIGRhdGEgZnJvbSB0aGUgdGFyZ2V0IHN5c3RlbSdzIFJBTS4KLSAgICAgV2UgY2FsbCBpdCAuZGF0YS4gICovCi0gIGFzZWN0ID0gKGFzZWN0aW9uICopIGJmZF96bWFsbG9jIChzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChhc2VjdCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBhc2VjdC0+bmFtZSA9ICIuZGF0YSI7Ci0gIGFzZWN0LT5mbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUzsKLSAgLyogVGhlIHNpemUgb2YgbWVtb3J5IGlzIHRoZSBzaXplIG9mIHRoZSBjb3JlIGZpbGUgaXRzZWxmLiAgKi8KLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IHN0YXRidWYuc3Rfc2l6ZTsKLSAgYXNlY3QtPnZtYSA9IHJhbWJhc2U7Ci0gIGFzZWN0LT5maWxlcG9zID0gMDsKLSAgYXNlY3QtPm5leHQgPSBhYmZkLT5zZWN0aW9uczsKLSAgYWJmZC0+c2VjdGlvbnMgPSBhc2VjdDsKLSAgKythYmZkLT5zZWN0aW9uX2NvdW50OwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotCi0gZXJyb3JfcmV0dXJuOgotICB7Ci0gICAgc2VjX3B0ciBuZXh0c2VjdDsKLSAgICBmb3IgKGFzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IGFzZWN0ICE9IE5VTEw7KQotICAgICAgewotCW5leHRzZWN0ID0gYXNlY3QtPm5leHQ7Ci0JZnJlZSAoYXNlY3QpOwotCWFzZWN0ID0gbmV4dHNlY3Q7Ci0gICAgICB9Ci0gICAgZnJlZSAoYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi1jaGFyICoKLWNpc2NvX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWludAotY2lzY29fY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZzsKLX0KLQotYm9vbGVhbgotY2lzY29fY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQ7Ci0gICAgIGJmZCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotDAotY29uc3QgYmZkX3RhcmdldCBjaXNjb19jb3JlX3ZlYyA9Ci0gIHsKLSAgICAidHJhZC1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICAgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBjaXNjb19jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGNpc2NvKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1hMjlrLmMgYi9iZmQvY29mZi1hMjlrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZjIzZWUuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtYTI5ay5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQU1EIDI5MDAwIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgV29vZCBhdCBOZXcgWW9yayBVbml2ZXJzaXR5IDcvOC85MS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEEyOUsgMQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9hMjlrLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotc3RhdGljIGxvbmcgZ2V0X3N5bWJvbF92YWx1ZSBQQVJBTVMgKChhc3ltYm9sICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYTI5a19yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hMjlrX2FkanVzdF9zeW1uZHgKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBib29sZWFuICopKTsKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDIpCi0KLSNkZWZpbmUgSU5TRVJUX0hXT1JEKFdPUkQsSFdPUkQpCVwKLSAgICAoKChXT1JEKSAmIDB4ZmYwMGZmMDApIHwgKCgoSFdPUkQpICYgMHhmZjAwKSA8PCA4KSB8ICgoSFdPUkQpJiAweGZmKSkKLSNkZWZpbmUgRVhUUkFDVF9IV09SRChXT1JEKSBcCi0gICAgKCgoKFdPUkQpICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKFdPUkQpJiAweGZmKSkKLSNkZWZpbmUgU0lHTl9FWFRFTkRfSFdPUkQoSFdPUkQpIFwKLSAgICAoKEhXT1JEKSAmIDB4ODAwMCA/IChIV09SRCl8KH4weGZmZmZMKSA6IChIV09SRCkpCi0KLS8qIFByb3ZpZGVkIHRoZSBzeW1ib2wsIHJldHVybnMgdGhlIHZhbHVlIHJlZmZlZCAqLwotc3RhdGljIGxvbmcKLWdldF9zeW1ib2xfdmFsdWUgKHN5bWJvbCkgICAgICAgCi0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICB7Ci0gICAgcmVsb2NhdGlvbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0KLSAgZWxzZSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWUgKwotICAgICBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotICAgICAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHJldHVybihyZWxvY2F0aW9uKTsKLX0KLQotLyogdGhpcyBmdW5jdGlvbiBpcyBpbiBjaGFyZ2Ugb2YgcGVyZm9ybWluZyBhbGwgdGhlIDI5ayByZWxvY2F0aW9ucyAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1hMjlrX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogdGhlIGNvbnN0aCByZWxvY2F0aW9uIGNvbWVzIGluIHR3byBwYXJ0cywgd2UgaGF2ZSB0byByZW1lbWJlcgotICAgICB0aGUgc3RhdGUgYmV0d2VlbiBjYWxscywgaW4gdGhlc2UgdmFyaWFibGVzICovCi0gIHN0YXRpYyBib29sZWFuIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFydDFfY29uc3RoX3ZhbHVlOwotCi0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyBzeW1fdmFsdWU7Ci0gIHVuc2lnbmVkIGxvbmcgdW5zaWduZWRfdmFsdWU7Ci0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZTsKLSAgbG9uZyBzaWduZWRfdmFsdWU7Ci0KLSAgdW5zaWduZWQgbG9uZyBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3MgOyAvKisgaW5wdXRfc2VjdGlvbi0+dm1hKi8KLSAgYmZkX2J5dGUgICpoaXRfZGF0YSA9YWRkciArIChiZmRfYnl0ZSAqKShkYXRhKTsKLQkKLSAgcl90eXBlID0gcmVsb2NfZW50cnktPmhvd3RvLT50eXBlOwotCi0gIGlmIChvdXRwdXRfYmZkKSB7Ci0gICAgLyogUGFydGlhbCBsaW5raW5nIC0gZG8gbm90aGluZyAqLwotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICB9Ci0KLSAgaWYgKHN5bWJvbF9pbiAhPSBOVUxMCi0gICAgICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9pbi0+c2VjdGlvbikpCi0gIHsKLSAgICAvKiBLZWVwIHRoZSBzdGF0ZSBtYWNoaW5lIGhhcHB5IGluIGNhc2Ugd2UncmUgY2FsbGVkIGFnYWluICovCi0gICAgaWYgKHJfdHlwZSA9PSBSX0lISUhBTEYpIAotICAgIHsKLSAgICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSB0cnVlOwotICAgICAgcGFydDFfY29uc3RoX3ZhbHVlICA9IDA7Ci0gICAgfQotICAgIHJldHVybihiZmRfcmVsb2NfdW5kZWZpbmVkKTsKLSAgfQotCi0gIGlmICgocGFydDFfY29uc3RoX2FjdGl2ZSkgJiYgKHJfdHlwZSAhPSBSX0lIQ09OU1QpKSAKLSAgewotICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKLSAgICAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIF8oIk1pc3NpbmcgSUhDT05TVCIpOwotICAgIHJldHVybihiZmRfcmVsb2NfZGFuZ2Vyb3VzKTsKLSAgfQotCi0KLSAgc3ltX3ZhbHVlID0gZ2V0X3N5bWJvbF92YWx1ZShzeW1ib2xfaW4pOwotCi0gIHN3aXRjaCAocl90eXBlKSAKLSAgewotICAgY2FzZSBSX0lSRUw6IAkKLSAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAotICAgIC8qIFRha2UgdGhlIHZhbHVlIGluIHRoZSBmaWVsZCBhbmQgc2lnbiBleHRlbmQgaXQgKi8KLSAgICBzaWduZWRfdmFsdWUgPSBFWFRSQUNUX0hXT1JEKGluc24pOwotICAgIHNpZ25lZF92YWx1ZSA9IFNJR05fRVhURU5EX0hXT1JEKHNpZ25lZF92YWx1ZSk7Ci0gICAgc2lnbmVkX3ZhbHVlIDw8PSAyOwotCi0gICAgLyogU2VlIHRoZSBub3RlIG9uIHRoZSBSX0lSRUwgcmVsb2MgaW4gY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24uICAqLwotICAgIGlmIChzaWduZWRfdmFsdWUgPT0gLSAobG9uZykgcmVsb2NfZW50cnktPmFkZHJlc3MpCi0gICAgICBzaWduZWRfdmFsdWUgPSAwOwotCi0gICAgc2lnbmVkX3ZhbHVlICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgaWYgKChzaWduZWRfdmFsdWUgJiB+MHgzZmZmZikgPT0gMCkKLSAgICB7CQkJCS8qIEFic29sdXRlIGptcC9jYWxsICovCi0gICAgICBpbnNuIHw9ICgxPDwyNCk7CQkvKiBNYWtlIGl0IGFic29sdXRlICovCi0gICAgICAvKiBGSVhNRTogU2hvdWxkIHdlIGNoYW5nZSByX3R5cGUgdG8gUl9JQUJTICovCi0gICAgfSAKLSAgICBlbHNlIAotICAgIHsKLSAgICAgIC8qIFJlbGF0aXZlIGptcC9jYWxsLCBzbyBzdWJ0cmFjdCBmcm9tIHRoZSB2YWx1ZSB0aGUKLQkgYWRkcmVzcyBvZiB0aGUgcGxhY2Ugd2UncmUgY29taW5nIGZyb20gKi8KLSAgICAgIHNpZ25lZF92YWx1ZSAtPSAocmVsb2NfZW50cnktPmFkZHJlc3MKLQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGlmIChzaWduZWRfdmFsdWU+MHgxZmZmZiB8fCBzaWduZWRfdmFsdWU8LTB4MjAwMDApIAotICAgICAgIHJldHVybihiZmRfcmVsb2Nfb3ZlcmZsb3cpOwotICAgIH0KLSAgICBzaWduZWRfdmFsdWUgPj49IDI7Ci0gICAgaW5zbiA9IElOU0VSVF9IV09SRChpbnNuLCBzaWduZWRfdmFsdWUpOwotICAgIGJmZF9wdXRfMzIoYWJmZCwgaW5zbiAsaGl0X2RhdGEpOyAKLSAgICBicmVhazsKLSAgIGNhc2UgUl9JTE9IQUxGOiAKLSAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAotICAgIHVuc2lnbmVkX3ZhbHVlID0gRVhUUkFDVF9IV09SRChpbnNuKTsKLSAgICB1bnNpZ25lZF92YWx1ZSArPSAgc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICBpbnNuID0gSU5TRVJUX0hXT1JEKGluc24sIHVuc2lnbmVkX3ZhbHVlKTsKLSAgICBiZmRfcHV0XzMyKGFiZmQsIGluc24sIGhpdF9kYXRhKTsgCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfSUhJSEFMRjoKLSAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAotICAgIC8qIGNvbnN0aCwgcGFydCAxIAotICAgICAgIEp1c3QgZ2V0IHRoZSBzeW1ib2wgdmFsdWUgdGhhdCBpcyByZWZlcmVuY2VkICovCi0gICAgcGFydDFfY29uc3RoX2FjdGl2ZSA9IHRydWU7Ci0gICAgcGFydDFfY29uc3RoX3ZhbHVlID0gc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICAvKiBEb24ndCBtb2RpZnkgaW5zbiB1bnRpbCBSX0lIQ09OU1QgKi8KLSAgICBicmVhazsKLSAgIGNhc2UgUl9JSENPTlNUOgkKLSAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAotICAgIC8qIGNvbnN0aCwgcGFydCAyIAotICAgICAgIE5vdyByZWxvY2F0ZSB0aGUgcmVmZXJlbmNlICovCi0gICAgaWYgKHBhcnQxX2NvbnN0aF9hY3RpdmUgPT0gZmFsc2UpIHsKLSAgICAgICplcnJvcl9tZXNzYWdlID0gKGNoYXIgKikgXygiTWlzc2luZyBJSElIQUxGIik7Ci0gICAgICByZXR1cm4oYmZkX3JlbG9jX2Rhbmdlcm91cyk7Ci0gICAgfQotICAgIC8qIHN5bV9wdHJfcHRyID0gcl9zeW1uZHgsIGluIGNvZmZfc2x1cnBfcmVsb2NfdGFibGUoKSAqLwotICAgIHVuc2lnbmVkX3ZhbHVlID0gMDsJCS8qRVhUUkFDVF9IV09SRChpbnNuKSA8PCAxNjsqLwotICAgIHVuc2lnbmVkX3ZhbHVlICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7IC8qIHJfc3ltbmR4ICovCi0gICAgdW5zaWduZWRfdmFsdWUgKz0gcGFydDFfY29uc3RoX3ZhbHVlOwotICAgIHVuc2lnbmVkX3ZhbHVlID0gdW5zaWduZWRfdmFsdWUgPj4gMTY7Ci0gICAgaW5zbiA9IElOU0VSVF9IV09SRChpbnNuLCB1bnNpZ25lZF92YWx1ZSk7Ci0gICAgcGFydDFfY29uc3RoX2FjdGl2ZSA9IGZhbHNlOwotICAgIGJmZF9wdXRfMzIoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOyAKLSAgICBicmVhazsKLSAgIGNhc2UgUl9CWVRFOgotICAgIGluc24gPSBiZmRfZ2V0XzgoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICB1bnNpZ25lZF92YWx1ZSA9IGluc24gKyBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwkKLSAgICBpZiAodW5zaWduZWRfdmFsdWUgJiAweGZmZmZmZjAwKQotICAgICAgcmV0dXJuKGJmZF9yZWxvY19vdmVyZmxvdyk7Ci0gICAgYmZkX3B1dF84KGFiZmQsIHVuc2lnbmVkX3ZhbHVlLCBoaXRfZGF0YSk7IAotICAgIGJyZWFrOwotICAgY2FzZSBSX0hXT1JEOgotICAgIGluc24gPSBiZmRfZ2V0XzE2KGFiZmQsIGhpdF9kYXRhKTsgCi0gICAgdW5zaWduZWRfdmFsdWUgPSBpbnNuICsgc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsJCi0gICAgaWYgKHVuc2lnbmVkX3ZhbHVlICYgMHhmZmZmMDAwMCkKLSAgICAgIHJldHVybihiZmRfcmVsb2Nfb3ZlcmZsb3cpOwotICAgIGJmZF9wdXRfMTYoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOyAKLSAgICBicmVhazsKLSAgIGNhc2UgUl9XT1JEOgotICAgIGluc24gPSBiZmRfZ2V0XzMyKGFiZmQsIGhpdF9kYXRhKTsgCi0gICAgaW5zbiArPSBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOyAgCi0gICAgYmZkX3B1dF8zMihhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICplcnJvcl9tZXNzYWdlID0gXygiVW5yZWNvZ25pemVkIHJlbG9jIik7Ci0gICAgcmV0dXJuIChiZmRfcmVsb2NfZGFuZ2Vyb3VzKTsKLSAgfQotCi0KLSAgcmV0dXJuKGJmZF9yZWxvY19vayk7CQotfQotCi0vKiAgICAgIHR5cGUJICAgcmlnaHRzaGlmdAotCQkgICAgICAgc2l6ZQotCQkJICBiaXRzaXplCi0JCQkgICAgICAgcGMtcmVsYXRpdmUKLQkJCQkgICAgIGJpdHBvcwotCQkJCQkgYWJzb2x1dGUKLQkJCQkJICAgICBjb21wbGFpbl9vbl9vdmVyZmxvdwotCQkJCQkJICBzcGVjaWFsX2Z1bmN0aW9uCi0JCQkJCQkgICAgcmVsb2NhdGlvbiBuYW1lCi0JCQkJCQkJICAgICAgIHBhcnRpYWxfaW5wbGFjZSAKLQkJCQkJCQkJICAgICAgc3JjX21hc2sKLSovCi0KLS8qRklYTUU6IEknbSBub3QgcmVhbCBzdXJlIGFib3V0IHRoaXMgdGFibGUgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSAKLXsKLSAge1JfQUJTLCAgICAgMCwgMywgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxhMjlrX3JlbG9jLCJBQlMiLCAgICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZX0sCi0gIHsxfSwgIHsyfSwgIHszfSwgICB7NH0sICB7NX0sICB7Nn0sICB7N30sICB7OH0sICB7OX0sIHsxMH0sCi0gIHsxMX0sIHsxMn0sIHsxM30sIHsxNH0sIHsxNX0sIHsxNn0sIHsxN30sIHsxOH0sIHsxOX0sIHsyMH0sCi0gIHsyMX0sIHsyMn0sIHsyM30sCi0gIHtSX0lSRUwsICAgIDAsIDMsIDMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLGEyOWtfcmVsb2MsIklSRUwiLCAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlfSwKLSAge1JfSUFCUywgICAgMCwgMywgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYTI5a19yZWxvYywiSUFCUyIsICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2V9LAotICB7Ul9JTE9IQUxGLCAwLCAzLCAxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgYTI5a19yZWxvYywiSUxPSEFMRiIsIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2V9LAotICB7Ul9JSElIQUxGLCAwLCAzLCAxNiwgdHJ1ZSwgIDE2LCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIGEyOWtfcmVsb2MsIklISUhBTEYiLCB0cnVlLCAweGZmZmYwMDAwLDB4ZmZmZjAwMDAsIGZhbHNlfSwKLSAge1JfSUhDT05TVCwgMCwgMywgMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIGEyOWtfcmVsb2MsIklIQ09OU1QiLCB0cnVlLCAweGZmZmYwMDAwLDB4ZmZmZjAwMDAsIGZhbHNlfSwKLSAge1JfQllURSwgICAgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBhMjlrX3JlbG9jLCJCWVRFIiwgICAgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZX0sCi0gIHtSX0hXT1JELCAgIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGEyOWtfcmVsb2MsIkhXT1JEIiwgICB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlfSwKLSAge1JfV09SRCwgICAgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYTI5a19yZWxvYywiV09SRCIsICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2V9LAotfTsKLQotI2RlZmluZSBCQURNQUcoeCkgQTI5S0JBRE1BRyh4KQotCi0jZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikgXAotIHJlbG9jX3Byb2Nlc3NpbmcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLQotc3RhdGljIHZvaWQKLXJlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCxyZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLSAgICAgYXJlbGVudCAqcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgICBzdGF0aWMgYmZkX3ZtYSBpaGloYWxmX3ZhZGRyID0gKGJmZF92bWEpIC0xOwotCi0gICAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7CQkKLSAgICByZWxlbnQtPmhvd3RvID0gaG93dG9fdGFibGUgKyByZWxvYy0+cl90eXBlOwotICAgIGlmIChyZWxvYy0+cl90eXBlID09IFJfSUhDT05TVCkgCi0gICAgewkJCi0gICAgICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBSX0lIQ09OU1Qgc2hvdWxkIGFsd2F5cyBiZSB0aGUgYWRkcmVzcyBvZgotCSB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIFJfSUhJSEFMRi4gIHJlbG9jcyBnZW5lcmF0ZWQgYnkgZ2FzCi0JIGFyZSBjb3JyZWN0LCBidXQgcmVsb2NzIGdlbmVyYXRlZCBieSBIaWdoIEMgYXJlIGRpZmZlcmVudCAoSQotCSBjYW4ndCBmaWd1cmUgb3V0IHdoYXQgdGhlIGFkZHJlc3MgbWVhbnMgZm9yIEhpZ2ggQykuICBXZSBjYW4KLQkgaGFuZGxlIGJvdGggZ2FzIGFuZCBIaWdoIEMgYnkgaWdub3JpbmcgdGhlIGFkZHJlc3MgaGVyZSwgYW5kCi0JIHNpbXBseSByZXVzaW5nIHRoZSBhZGRyZXNzIHNhdmVkIGZvciBSX0lISUhBTEYuICAqLwotICAgICAgICBpZiAoaWhpaGFsZl92YWRkciA9PSAoYmZkX3ZtYSkgLTEpCi0JICBhYm9ydCAoKTsKLQlyZWxlbnQtPmFkZHJlc3MgPSBpaGloYWxmX3ZhZGRyOwotCWloaWhhbGZfdmFkZHIgPSAoYmZkX3ZtYSkgLTE7Ci0JcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9zeW1uZHg7CQkKLQlyZWxlbnQtPnN5bV9wdHJfcHRyPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICBhc3ltYm9sICpwdHI7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0KGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0KLSAgICAgIHB0ciA9ICoocmVsZW50LT5zeW1fcHRyX3B0cik7Ci0KLSAgICAgIGlmIChwdHIgCi0JICAmJiBiZmRfYXN5bWJvbF9iZmQocHRyKSA9PSBhYmZkCQkKLQotCSAgJiYgKChwdHItPmZsYWdzICYgQlNGX09MRF9DT01NT04pPT0gMCkpCQotICAgICAgewkJCQkJCQotCSAgcmVsZW50LT5hZGRlbmQgPSAwOwotICAgICAgfQkJCQkJCQotICAgICAgZWxzZQotICAgICAgewkJCQkJCi0JICByZWxlbnQtPmFkZGVuZCA9IDA7CQkJCi0gICAgICB9CQkJCi0gICAgICByZWxlbnQtPmFkZHJlc3MtPSBzZWN0aW9uLT52bWE7Ci0gICAgICBpZiAocmVsb2MtPnJfdHlwZSA9PSBSX0lISUhBTEYpCi0JaWhpaGFsZl92YWRkciA9IHJlbGVudC0+YWRkcmVzczsKLSAgICAgIGVsc2UgaWYgKGloaWhhbGZfdmFkZHIgIT0gKGJmZF92bWEpIC0xKQotCWFib3J0ICgpOwotICB9Ci19Ci0KLS8qIFRoZSByZWxvYyBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIHRoZSBvcHRpbWl6ZWQgQ09GRiBsaW5rZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICBjb250ZW50cywgcmVsb2NzLCBzeW1zLCBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7Ci0gIGJvb2xlYW4gaGloYWxmOwotICBiZmRfdm1hIGhpaGFsZl92YWw7Ci0KLSAgLyogSWYgd2UgYXJlIHBlcmZvcm1pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgd2UgZG9uJ3QgbmVlZCB0byBkbyBhCi0gICAgIHRoaW5nLiAgVGhlIGNhbGxlciB3aWxsIHRha2UgY2FyZSBvZiBhZGp1c3RpbmcgdGhlIHJlbG9jCi0gICAgIGFkZHJlc3NlcyBhbmQgc3ltYm9sIGluZGljZXMuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGhpaGFsZiA9IGZhbHNlOwotICBoaWhhbGZfdmFsID0gMDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIGJmZF9ieXRlICpsb2M7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICBib29sZWFuIG92ZXJmbG93OwotICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICAgbG9uZyBzaWduZWRfdmFsdWU7Ci0gICAgICB1bnNpZ25lZCBsb25nIHVuc2lnbmVkX3ZhbHVlOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotICAgICAgbG9jID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEgfHwgcmVsLT5yX3R5cGUgPT0gUl9JSENPTlNUKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCWggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0KLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgdmFsID0gMDsKLQotICAgICAgLyogQW4gUl9JSENPTlNUIHJlbG9jIGRvZXMgbm90IGhhdmUgYSBzeW1ib2wuICBJbnN0ZWFkLCB0aGUKLSAgICAgICAgIHN5bWJvbCBpbmRleCBpcyBhbiBhZGRlbmQuICBSX0lIQ09OU1QgaXMgYWx3YXlzIHVzZWQgaW4KLSAgICAgICAgIGNvbmp1bmN0aW9uIHdpdGggUl9JSEhBTEYuICAqLwotICAgICAgaWYgKHJlbC0+cl90eXBlICE9IFJfSUhDT05TVCkKLQl7Ci0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkJc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCQkgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0JCSAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgKyBzeW0tPm5fdmFsdWUKLQkJCSAtIHNlYy0+dm1hKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCXsKLQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChoaWhhbGYpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAoaW5mbywgXygibWlzc2luZyBJSENPTlNUIHJlbG9jIiksIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBoaWhhbGYgPSBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgb3ZlcmZsb3cgPSBmYWxzZTsKLQotICAgICAgc3dpdGNoIChyZWwtPnJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCi0JY2FzZSBSX0lSRUw6Ci0JICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOwotCi0JICAvKiBFeHRyYWN0IHRoZSBhZGRlbmQuICAqLwotCSAgc2lnbmVkX3ZhbHVlID0gRVhUUkFDVF9IV09SRCAoaW5zbik7Ci0JICBzaWduZWRfdmFsdWUgPSBTSUdOX0VYVEVORF9IV09SRCAoc2lnbmVkX3ZhbHVlKTsKLQkgIHNpZ25lZF92YWx1ZSA8PD0gMjsKLQotCSAgLyogVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgQ09GRgotCSAgICAgYTI5ay4gIEluIHRoZSBvcmlnaW5hbCBBTUQgdmVyc2lvbiwgdGhlIHZhbHVlIHN0b3JlZCBpbgotCSAgICAgdGhlIGZpZWxkIGZvciB0aGUgUl9JUkVMIHJlbG9jIGlzIGEgc2ltcGxlIGFkZGVuZC4gIEluCi0JICAgICB0aGUgR05VIHZlcnNpb24sIHRoZSB2YWx1ZSBpcyB0aGUgbmVnYXRpdmUgb2YgdGhlIGFkZHJlc3MKLQkgICAgIG9mIHRoZSByZWxvYyB3aXRoaW4gc2VjdGlvbi4gIFdlIHRyeSB0byBjb3BlIGhlcmUgYnkKLQkgICAgIGFzc3VtaW5nIHRoZSBBTUQgdmVyc2lvbiwgdW5sZXNzIHRoZSBhZGRlbmQgaXMgZXhhY3RseQotCSAgICAgdGhlIG5lZ2F0aXZlIG9mIHRoZSBhZGRyZXNzOyBpbiB0aGUgbGF0dGVyIGNhc2Ugd2UgYXNzdW1lCi0JICAgICB0aGUgR05VIHZlcnNpb24uICBUaGlzIG1lYW5zIHRoYXQgc29tZXRoaW5nIGxpa2UKLQkgICAgICAgICAudGV4dAotCQkgbm9wCi0JCSBqbXAgaS00Ci0JICAgICB3aWxsIGZhaWwsIGJlY2F1c2UgdGhlIGFkZGVuZCBvZiAtNCB3aWxsIGhhcHBlbiB0byBlcXVhbAotCSAgICAgdGhlIG5lZ2F0aXZlIG9mIHRoZSBhZGRyZXNzIHdpdGhpbiB0aGUgc2VjdGlvbi4gIFRoZQotCSAgICAgY29tcGlsZXIgd2lsbCBuZXZlciBnZW5lcmF0ZSBjb2RlIGxpa2UgdGhpcy4KLQotCSAgICAgQXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlIHdlIG1heSB3YW50IHRvIHRha2Ugb3V0IHRoaXMKLQkgICAgIGNoZWNrLiAgKi8KLQotCSAgaWYgKHNpZ25lZF92YWx1ZSA9PSAtIChsb25nKSAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkKLQkgICAgc2lnbmVkX3ZhbHVlID0gMDsKLQotCSAgLyogRGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUganVtcC4gICovCi0JICBzaWduZWRfdmFsdWUgKz0gdmFsOwotCi0JICBpZiAoKHNpZ25lZF92YWx1ZSAmIH4weDNmZmZmKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogV2UgY2FuIHVzZSBhbiBhYnNvbHV0ZSBqdW1wLiAgKi8KLQkgICAgICBpbnNuIHw9ICgxIDw8IDI0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogTWFrZSB0aGUgZGVzdGluYXRpb24gUEMgcmVsYXRpdmUuICAqLwotCSAgICAgIHNpZ25lZF92YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgICsgKHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCSAgICAgIGlmIChzaWduZWRfdmFsdWUgPiAweDFmZmZmIHx8IHNpZ25lZF92YWx1ZSA8IC0gMHgyMDAwMCkKLQkJewotCQkgIG92ZXJmbG93ID0gdHJ1ZTsKLQkJICBzaWduZWRfdmFsdWUgPSAwOwotCQl9Ci0JICAgIH0KLQotCSAgLyogUHV0IHRoZSBhZGp1c3RlZCB2YWx1ZSBiYWNrIGludG8gdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgIHNpZ25lZF92YWx1ZSA+Pj0gMjsKLQkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHNpZ25lZF92YWx1ZSk7Ci0KLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24sIGxvYyk7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lMT0hBTEY6Ci0JICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOwotCSAgdW5zaWduZWRfdmFsdWUgPSBFWFRSQUNUX0hXT1JEIChpbnNuKTsKLQkgIHVuc2lnbmVkX3ZhbHVlICs9IHZhbDsKLQkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHVuc2lnbmVkX3ZhbHVlKTsKLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgbG9jKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lISUhBTEY6Ci0JICAvKiBTYXZlIHRoZSB2YWx1ZSBmb3IgdGhlIFJfSUhDT05TVCByZWxvYy4gICovCi0JICBoaWhhbGYgPSB0cnVlOwotCSAgaGloYWxmX3ZhbCA9IHZhbDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lIQ09OU1Q6Ci0JICBpZiAoISBoaWhhbGYpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAoaW5mbywgXygibWlzc2luZyBJSElIQUxGIHJlbG9jIiksIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBoaWhhbGZfdmFsID0gMDsKLQkgICAgfQotCi0JICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOwotCSAgdW5zaWduZWRfdmFsdWUgPSByZWwtPnJfc3ltbmR4ICsgaGloYWxmX3ZhbDsKLQkgIHVuc2lnbmVkX3ZhbHVlID4+PSAxNjsKLQkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHVuc2lnbmVkX3ZhbHVlKTsKLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24sIGxvYyk7Ci0KLQkgIGhpaGFsZiA9IGZhbHNlOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9CWVRFOgotCWNhc2UgUl9IV09SRDoKLQljYXNlIFJfV09SRDoKLQkgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG9fdGFibGUgKyByZWwtPnJfdHlwZSwKLQkJCQkJICBpbnB1dF9iZmQsIHZhbCwgbG9jKTsKLQkgIGlmIChyc3RhdCA9PSBiZmRfcmVsb2Nfb3ZlcmZsb3cpCi0JICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkgIGVsc2UgaWYgKHJzdGF0ICE9IGJmZF9yZWxvY19vaykKLQkgICAgYWJvcnQgKCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChvdmVyZmxvdykKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgZWxzZSBpZiAoc3ltID09IE5VTEwpCi0JICAgIG5hbWUgPSAiKnVua25vd24qIjsKLQkgIGVsc2UgaWYgKHN5bS0+X24uX25fbi5fbl96ZXJvZXMgPT0gMAotCQkgICAmJiBzeW0tPl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCi0JICAgIG5hbWUgPSBvYmpfY29mZl9zdHJpbmdzIChpbnB1dF9iZmQpICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cm5jcHkgKGJ1Ziwgc3ltLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7Ci0JICAgICAgYnVmW1NZTU5NTEVOXSA9ICdcMCc7Ci0JICAgICAgbmFtZSA9IGJ1ZjsKLQkgICAgfQotCi0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGluZm8sIG5hbWUsIGhvd3RvX3RhYmxlW3JlbC0+cl90eXBlXS5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfSAgICAgCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uCi0KLS8qIFdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBzeW1uZHggb2YgYSBSX0lIQ09OU1QgcmVsb2MsIHNpbmNlIGl0Ci0gICBpcyBhY3R1YWxseSBhbiBhZGRlbmQsIG5vdCBhIHN5bWJvbCBpbmRleCBhdCBhbGwuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2EyOWtfYWRqdXN0X3N5bW5keCAob2JmZCwgaW5mbywgaWJmZCwgc2VjLCBpcmVsLCBhZGp1c3RlZHApCi0gICAgIGJmZCAqb2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICAgICBib29sZWFuICphZGp1c3RlZHA7Ci17Ci0gIGlmIChpcmVsLT5yX3R5cGUgPT0gUl9JSENPTlNUKQotICAgICphZGp1c3RlZHAgPSB0cnVlOwotICBlbHNlCi0gICAgKmFkanVzdGVkcCA9IGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBjb2ZmX2FkanVzdF9zeW1uZHggY29mZl9hMjlrX2FkanVzdF9zeW1uZHgKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLWNvbnN0IGJmZF90YXJnZXQgYTI5a2NvZmZfYmlnX3ZlYyA9Ci17Ci0gICJjb2ZmLWEyOWstYmlnIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgIAotICAgfCBTRUNfUkVBRE9OTFkgKSwKLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgICBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0gIC8qIGhkcnMgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsICAgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAotCi0gewotCSAgICAKLSAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgY29mZl9vYmplY3RfcCwKLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwKLSAgIF9iZmRfZHVtbXlfdGFyZ2V0Ci0gIH0sCi0gewotICAgYmZkX2ZhbHNlLAotICAgY29mZl9ta29iamVjdCwKLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICBiZmRfZmFsc2UKLSAgfSwKLSB7Ci0gICBiZmRfZmFsc2UsCi0gICBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgIGJmZF9mYWxzZQotICB9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgQ09GRl9TV0FQX1RBQkxFCi0gfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWFscGhhLmMgYi9iZmQvY29mZi1hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODQxNjYzLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWFscGhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAyICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQUxQSEEgRXh0ZW5kZWQtQ29mZiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgTW9kaWZpZWQgZnJvbSBjb2ZmLW1pcHMuYyBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+IGFuZAotICAgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLSNpbmNsdWRlICJjb2ZmL2FscGhhLmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLSNpbmNsdWRlICJsaWJlY29mZi5oIgotDAotLyogUHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICphbHBoYV9lY29mZl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gYWxwaGFfZWNvZmZfYmFkX2Zvcm1hdF9ob29rIFBBUkFNUyAoKGJmZCAqYWJmZCwgUFRSIGZpbGVoZHIpKTsKLXN0YXRpYyBQVFIgYWxwaGFfZWNvZmZfbWtvYmplY3RfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVoZHIsIFBUUiBhb3V0aGRyKSk7Ci1zdGF0aWMgdm9pZCBhbHBoYV9lY29mZl9zd2FwX3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgdm9pZCBhbHBoYV9lY29mZl9zd2FwX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCQkgICAgICAgUFRSKSk7Ci1zdGF0aWMgdm9pZCBhbHBoYV9hZGp1c3RfcmVsb2NfaW4gUEFSQU1TICgoYmZkICosCi0JCQkJCSAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCQkgICBhcmVsZW50ICopKTsKLXN0YXRpYyB2b2lkIGFscGhhX2FkanVzdF9yZWxvY19vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IGFyZWxlbnQgKiwKLQkJCQkJICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIGJmZF9ieXRlICphbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqZGF0YSwgYm9vbGVhbiByZWxvY2F0ZWFibGUsIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgYmZkX3ZtYSBhbHBoYV9jb252ZXJ0X2V4dGVybmFsX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgc3RydWN0IGV4dGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgICAgYmZkICosIGFzZWN0aW9uICosCi0JCQkJCSAgICAgICBiZmRfYnl0ZSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGFscGhhX2FkanVzdF9oZWFkZXJzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqLCBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKSk7Ci1zdGF0aWMgUFRSIGFscGhhX2Vjb2ZmX3JlYWRfYXJfaGRyIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkICphbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyKSk7Ci1zdGF0aWMgYmZkICphbHBoYV9lY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYmZkICphbHBoYV9lY29mZl9nZXRfZWx0X2F0X2luZGV4IFBBUkFNUyAoKGJmZCAqLCBzeW1pbmRleCkpOwotDAotLyogRUNPRkYgaGFzIENPRkYgc2VjdGlvbnMsIGJ1dCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbgotICAgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBmb3JtYXQuICBFQ09GRiB0YXJnZXRzIHVzZSBzb21lIG9mIHRoZQotICAgc3dhcHBpbmcgcm91dGluZXMgZnJvbSBjb2Zmc3dhcC5oLCBhbmQgc29tZSBvZiB0aGUgZ2VuZXJpYyBDT0ZGCi0gICByb3V0aW5lcyBpbiBjb2ZmZ2VuLmMsIGJ1dCwgdW5saWtlIHRoZSByZWFsIENPRkYgdGFyZ2V0cywgZG8gbm90Ci0gICB1c2UgY29mZmNvZGUuaCBpdHNlbGYuCi0KLSAgIEdldCB0aGUgZ2VuZXJpYyBDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLCBleGNlcHQgZm9yIHRoZSByZWxvYywKLSAgIHN5bWJvbCwgYW5kIGxpbmVubyBvbmVzLiAgR2l2ZSB0aGVtIGVjb2ZmIG5hbWVzLiAgRGVmaW5lIHNvbWUKLSAgIGFjY2Vzc29yIG1hY3JvcyBmb3IgdGhlIGxhcmdlIHNpemVzIHVzZWQgZm9yIEFscGhhIEVDT0ZGLiAgKi8KLQotI2RlZmluZSBHRVRfRklMRUhEUl9TWU1QVFIgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfVFNJWkUgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9BT1VUSERSX1RTSVpFIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfQU9VVEhEUl9EU0laRSBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfRFNJWkUgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9BT1VUSERSX0JTSVpFIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfQU9VVEhEUl9CU0laRSBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfRU5UUlkgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9BT1VUSERSX0VOVFJZIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfQU9VVEhEUl9URVhUX1NUQVJUIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfQU9VVEhEUl9URVhUX1NUQVJUIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1BBRERSIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfU0NOSERSX1BBRERSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1ZBRERSIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfU0NOSERSX1ZBRERSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1NJWkUgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9TQ05IRFJfU0laRSBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX1NDTkhEUl9TQ05QVFIgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9TQ05IRFJfU0NOUFRSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1JFTFBUUiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX1NDTkhEUl9SRUxQVFIgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX1NDTkhEUl9MTk5PUFRSIGJmZF9oX3B1dF82NAotCi0jZGVmaW5lIEFMUEhBRUNPRkYKLQotI2RlZmluZSBOT19DT0ZGX1JFTE9DUwotI2RlZmluZSBOT19DT0ZGX1NZTUJPTFMKLSNkZWZpbmUgTk9fQ09GRl9MSU5FTk9TCi0jZGVmaW5lIGNvZmZfc3dhcF9maWxlaGRyX2luIGFscGhhX2Vjb2ZmX3N3YXBfZmlsZWhkcl9pbgotI2RlZmluZSBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgYWxwaGFfZWNvZmZfc3dhcF9maWxlaGRyX291dAotI2RlZmluZSBjb2ZmX3N3YXBfYW91dGhkcl9pbiBhbHBoYV9lY29mZl9zd2FwX2FvdXRoZHJfaW4KLSNkZWZpbmUgY29mZl9zd2FwX2FvdXRoZHJfb3V0IGFscGhhX2Vjb2ZmX3N3YXBfYW91dGhkcl9vdXQKLSNkZWZpbmUgY29mZl9zd2FwX3Njbmhkcl9pbiBhbHBoYV9lY29mZl9zd2FwX3Njbmhkcl9pbgotI2RlZmluZSBjb2ZmX3N3YXBfc2NuaGRyX291dCBhbHBoYV9lY29mZl9zd2FwX3Njbmhkcl9vdXQKLSNpbmNsdWRlICJjb2Zmc3dhcC5oIgotCi0vKiBHZXQgdGhlIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgKi8KLSNkZWZpbmUgRUNPRkZfNjQKLSNpbmNsdWRlICJlY29mZnN3YXAuaCIKLQwKLS8qIEhvdyB0byBwcm9jZXNzIHRoZSB2YXJpb3VzIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmVsb2NfbmlsIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAotCQkgICBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1yZWxvY19uaWwgKGFiZmQsIHJlbG9jLCBzeW0sIGRhdGEsIHNlYywgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGFscGhhX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBSZWxvYyB0eXBlIDAgaXMgaWdub3JlZCBieSBpdHNlbGYuICBIb3dldmVyLCBpdCBhcHBlYXJzIGFmdGVyIGEKLSAgICAgR1BESVNQIHJlbG9jIHRvIGlkZW50aWZ5IHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgbG93IG9yZGVyIDE2IGJpdHMKLSAgICAgb2YgdGhlIGdwIHJlZ2lzdGVyIGFyZSBsb2FkZWQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9JR05PUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklHTk9SRSIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wuICAqLwotICBIT1dUTyAoQUxQSEFfUl9SRUZMT05HLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkxPTkciLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1JFRlFVQUQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGUVVBRCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IEdQIHJlbGF0aXZlIG9mZnNldC4gIFRoaXMgaXMganVzdCBsaWtlIFJFRkxPTkcgZXhjZXB0Ci0gICAgIHRoYXQgd2hlbiB0aGUgdmFsdWUgaXMgdXNlZCB0aGUgdmFsdWUgb2YgdGhlIGdwIHJlZ2lzdGVyIHdpbGwgYmUKLSAgICAgYWRkZWQgaW4uICAqLwotICBIT1dUTyAoQUxQSEFfUl9HUFJFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQUkVMMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFVzZWQgZm9yIGFuIGluc3RydWN0aW9uIHRoYXQgcmVmZXJzIHRvIG1lbW9yeSBvZmYgdGhlIEdQCi0gICAgIHJlZ2lzdGVyLiAgVGhlIG9mZnNldCBpcyAxNiBiaXRzIG9mIHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24uICBUaGlzCi0gICAgIHJlbG9jIGFsd2F5cyBzZWVtcyB0byBiZSBhZ2FpbnN0IHRoZSAubGl0YSBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTElURVJBTCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoaXMgcmVsb2Mgb25seSBhcHBlYXJzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhIExJVEVSQUwgcmVsb2MuCi0gICAgIEl0IGlkZW50aWZpZXMgYSB1c2Ugb2YgdGhlIGxpdGVyYWwuICBJdCBzZWVtcyB0aGF0IHRoZSBsaW5rZXIgY2FuCi0gICAgIHVzZSB0aGlzIHRvIGVsaW1pbmF0ZSBhIHBvcnRpb24gb2YgdGhlIC5saXRhIHNlY3Rpb24uICBUaGUgc3ltYm9sCi0gICAgIGluZGV4IGlzIHNwZWNpYWw6IDEgbWVhbnMgdGhlIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgYmFzZQotICAgICByZWdpc3RlciBvZiBhIG1lbW9yeSBmb3JtYXQgaW5zdHJ1Y3Rpb247IDIgbWVhbnMgdGhlIGxpdGVyYWwKLSAgICAgYWRkcmVzcyBpcyBpbiB0aGUgYnl0ZSBvZmZzZXQgcmVnaXN0ZXIgb2YgYSBieXRlLW1hbmlwdWxhdGlvbgotICAgICBpbnN0cnVjdGlvbjsgMyBtZWFucyB0aGUgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSB0YXJnZXQKLSAgICAgcmVnaXN0ZXIgb2YgYSBqc3IgaW5zdHJ1Y3Rpb24uICBUaGlzIGRvZXMgbm90IGFjdHVhbGx5IGRvIGFueQotICAgICByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfTElUVVNFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJVFVTRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG9hZCB0aGUgZ3AgcmVnaXN0ZXIuICBUaGlzIGlzIGFsd2F5cyB1c2VkIGZvciBhIGxkYWggaW5zdHJ1Y3Rpb24KLSAgICAgd2hpY2ggbG9hZHMgdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhlIGdwIHJlZ2lzdGVyLiAgVGhlIG5leHQgcmVsb2MKLSAgICAgd2lsbCBiZSBhbiBJR05PUkUgcmVsb2Mgd2hpY2ggaWRlbnRpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIGxkYQotICAgICBpbnN0cnVjdGlvbiB3aGljaCBsb2FkcyB0aGUgbG93ZXIgMTYgYml0cy4gIFRoZSBzeW1ib2wgaW5kZXggb2YKLSAgICAgdGhlIEdQRElTUCBpbnN0cnVjdGlvbiBhcHBlYXJzIHRvIGFjdHVhbGx5IGJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICAgYmV0d2VlbiB0aGUgbGRhaCBhbmQgbGRhIGluc3RydWN0aW9ucy4gIFRoaXMgZ2l2ZXMgdHdvIGRpZmZlcmVudAotICAgICB3YXlzIHRvIGRldGVybWluZSB3aGVyZSB0aGUgbGRhIGluc3RydWN0aW9uIGlzOyBJIGRvbid0IGtub3cgd2h5Ci0gICAgIGJvdGggYXJlIHVzZWQuICBUaGUgdmFsdWUgdG8gdXNlIGZvciB0aGUgcmVsb2NhdGlvbiBpcyB0aGUKLSAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBHUCB2YWx1ZSBhbmQgdGhlIGN1cnJlbnQgbG9jYXRpb247IHRoZQotICAgICBsb2FkIHdpbGwgYWx3YXlzIGJlIGRvbmUgYWdhaW5zdCBhIHJlZ2lzdGVyIGhvbGRpbmcgdGhlIGN1cnJlbnQKLSAgICAgYWRkcmVzcy4gICovCi0gIEhPV1RPIChBTFBIQV9SX0dQRElTUCwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUERJU1AiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDIxIGJpdCBicmFuY2guICBUaGUgbmF0aXZlIGFzc2VtYmxlciBnZW5lcmF0ZXMgdGhlc2UgZm9yCi0gICAgIGJyYW5jaGVzIHdpdGhpbiB0aGUgdGV4dCBzZWdtZW50LCBhbmQgYWxzbyBmaWxscyBpbiB0aGUgUEMKLSAgICAgcmVsYXRpdmUgb2Zmc2V0IGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0JSQUREUiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJCUkFERFIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBoaW50IGZvciBhIGp1bXAgdG8gYSByZWdpc3Rlci4gICovCi0gIEhPV1RPIChBTFBIQV9SX0hJTlQsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJISU5UIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUwxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUwzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDY0LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUw2NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFB1c2ggYSB2YWx1ZSBvbiB0aGUgcmVsb2MgZXZhbHVhdGlvbiBzdGFjay4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BVU0gsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BVU0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjayBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIFN0b3JlIGl0IGluCi0gICAgIGEgYml0ZmllbGQgb2Ygc2l6ZSByX3NpemUgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHJfb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfU1RPUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9TVE9SRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN1YnRyYWN0IHRoZSByZWxvYyBhZGRyZXNzIGZyb20gdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlCi0gICAgIHJlbG9jYXRpb24gc3RhY2suICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9QU1VCLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QU1VCIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTaGlmdCB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUgcmVsb2NhdGlvbiBzdGFjayByaWdodCBieSB0aGUKLSAgICAgZ2l2ZW4gdmFsdWUuICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9QUlNISUZULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QUlNISUZUIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBZGp1c3QgdGhlIEdQIHZhbHVlIGZvciBhIG5ldyByYW5nZSBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBIT1dUTyAoQUxQSEFfUl9HUFZBTFVFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFZBTFVFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0MCi0vKiBSZWNvZ25pemUgYW4gQWxwaGEgRUNPRkYgZmlsZS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWFscGhhX2Vjb2ZmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpyZXQ7Ci0KLSAgcmV0ID0gY29mZl9vYmplY3RfcCAoYWJmZCk7Ci0KLSAgaWYgKHJldCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIC8qIEFscGhhIEVDT0ZGIGhhcyBhIC5wZGF0YSBzZWN0aW9uLiAgVGhlIGxubm9wdHIgZmllbGQgb2YgdGhlCi0JIC5wZGF0YSBzZWN0aW9uIGlzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpdCBjb250YWlucy4gIEVhY2gKLQkgZW50cnkgdGFrZXMgdXAgOCBieXRlcy4gIFRoZSBudW1iZXIgb2YgZW50cmllcyBpcyByZXF1aXJlZAotCSBzaW5jZSB0aGUgc2VjdGlvbiBpcyBhbGlnbmVkIHRvIGEgMTYgYnl0ZSBib3VuZGFyeS4gIFdoZW4gd2UKLQkgbGluayAucGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHdlIGRvIG5vdCB3YW50IHRvIGluY2x1ZGUgdGhlCi0JIGFsaWdubWVudCBieXRlcy4gIFdlIGhhbmRsZSB0aGlzIG9uIGlucHV0IGJ5IGZha2luZyB0aGUgc2l6ZQotCSBvZiB0aGUgLnBkYXRhIHNlY3Rpb24gdG8gcmVtb3ZlIHRoZSB1bndhbnRlZCBhbGlnbm1lbnQgYnl0ZXMuCi0JIE9uIG91dHB1dCB3ZSB3aWxsIHNldCB0aGUgbG5ub3B0ciBmaWVsZCBhbmQgZm9yY2UgdGhlCi0JIGFsaWdubWVudC4gICovCi0gICAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgX1BEQVRBKTsKLSAgICAgIGlmIChzZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0JICBzaXplID0gc2VjLT5saW5lX2ZpbGVwb3MgKiA4OwotCSAgQkZEX0FTU0VSVCAoc2l6ZSA9PSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpCi0JCSAgICAgIHx8IHNpemUgKyA4ID09IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYykpOwotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYywgc2l6ZSkpCi0JICAgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogU2VlIHdoZXRoZXIgdGhlIG1hZ2ljIG51bWJlciBtYXRjaGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFscGhhX2Vjb2ZmX2JhZF9mb3JtYXRfaG9vayAoYWJmZCwgZmlsZWhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLQotICBpZiAoQUxQSEFfRUNPRkZfQkFETUFHICgqaW50ZXJuYWxfZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGEgaG9vayBjYWxsZWQgYnkgY29mZl9yZWFsX29iamVjdF9wIHRvIGNyZWF0ZSBhbnkgYmFja2VuZAotICAgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgUFRSCi1hbHBoYV9lY29mZl9ta29iamVjdF9ob29rIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotICAgICBQVFIgYW91dGhkcjsKLXsKLSAgUFRSIGVjb2ZmOwotCi0gIGVjb2ZmID0gX2JmZF9lY29mZl9ta29iamVjdF9ob29rIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKTsKLQotICBpZiAoZWNvZmYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotCi0gICAgICAvKiBTZXQgYWRkaXRpb25hbCBCRkQgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZSBvYmplY3QgdHlwZSBmcm9tIHRoZQotCSBtYWNoaW5lIHNwZWNpZmljIGZpbGUgaGVhZGVyIGZsYWdzLiAgKi8KLSAgICAgIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfQUxQSEFfT0JKRUNUX1RZUEVfTUFTSykKLQl7Ci0JY2FzZSBGX0FMUEhBX1NIQVJBQkxFOgotCSAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLQkgIGJyZWFrOwotCWNhc2UgRl9BTFBIQV9DQUxMX1NIQVJFRDoKLQkgIC8qIEFsd2F5cyBleGVjdXRhYmxlIGlmIHVzaW5nIHNoYXJlZCBsaWJyYXJpZXMgYXMgdGhlIHJ1biB0aW1lCi0JICAgICBsb2FkZXIgbWlnaHQgcmVzb2x2ZSB1bmRlZmluZWQgcmVmZXJlbmNlcy4gICovCi0JICBhYmZkLT5mbGFncyB8PSAoRFlOQU1JQyB8IEVYRUNfUCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gZWNvZmY7Ci19Ci0MCi0vKiBSZWxvYyBoYW5kbGluZy4gICovCi0KLS8qIFN3YXAgYSByZWxvYyBpbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hbHBoYV9lY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCBleHRfcHRyLCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotewotICBjb25zdCBSRUxPQyAqZXh0ID0gKFJFTE9DICopIGV4dF9wdHI7Ci0KLSAgaW50ZXJuLT5yX3ZhZGRyID0gYmZkX2hfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5yX3ZhZGRyKTsKLSAgaW50ZXJuLT5yX3N5bW5keCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+cl9zeW1uZHgpOwotCi0gIEJGRF9BU1NFUlQgKGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAoYWJmZCkpOwotCi0gIGludGVybi0+cl90eXBlID0gKChleHQtPnJfYml0c1swXSAmIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFKQotCQkgICAgPj4gUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUpOwotICBpbnRlcm4tPnJfZXh0ZXJuID0gKGV4dC0+cl9iaXRzWzFdICYgUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRSkgIT0gMDsKLSAgaW50ZXJuLT5yX29mZnNldCA9ICgoZXh0LT5yX2JpdHNbMV0gJiBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFKQotCQkgICAgICA+PiBSRUxPQ19CSVRTMV9PRkZTRVRfU0hfTElUVExFKTsKLSAgLyogSWdub3JlZCB0aGUgcmVzZXJ2ZWQgYml0cy4gICovCi0gIGludGVybi0+cl9zaXplID0gKChleHQtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1NJWkVfTElUVExFKQotCQkgICAgPj4gUkVMT0NfQklUUzNfU0laRV9TSF9MSVRUTEUpOwotCi0gIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBBTFBIQV9SX0xJVFVTRQotICAgICAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gQUxQSEFfUl9HUERJU1ApCi0gICAgewotICAgICAgLyogSGFuZGxlIHRoZSBMSVRVU0UgYW5kIEdQRElTUCByZWxvY3Mgc3BlY2lhbGx5LiAgSXRzIHN5bW5keAotCSB2YWx1ZSBpcyBub3QgYWN0dWFsbHkgYSBzeW1ib2wgaW5kZXgsIGJ1dCBpcyBpbnN0ZWFkIGEKLQkgc3BlY2lhbCBjb2RlLiAgV2UgcHV0IHRoZSBjb2RlIGluIHRoZSByX3NpemUgZmllbGQsIGFuZAotCSBjbG9iYmVyIHRoZSBzeW1uZHguICAqLwotICAgICAgaWYgKGludGVybi0+cl9zaXplICE9IDApCi0JYWJvcnQgKCk7Ci0gICAgICBpbnRlcm4tPnJfc2l6ZSA9IGludGVybi0+cl9zeW1uZHg7Ci0gICAgICBpbnRlcm4tPnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9OT05FOwotICAgIH0KLSAgZWxzZSBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gQUxQSEFfUl9JR05PUkUpCi0gICAgewotICAgICAgLyogVGhlIElHTk9SRSByZWxvYyBnZW5lcmFsbHkgZm9sbG93cyBhIEdQRElTUCByZWxvYywgYW5kIGlzCi0JIGFnYWluc3QgdGhlIC5saXRhIHNlY3Rpb24uICBUaGUgc2VjdGlvbiBpcyBpcnJlbGV2YW50LiAgKi8KLSAgICAgIGlmICghIGludGVybi0+cl9leHRlcm4gJiYKLQkgIGludGVybi0+cl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9BQlMpCi0JYWJvcnQgKCk7Ci0gICAgICBpZiAoISBpbnRlcm4tPnJfZXh0ZXJuICYmIGludGVybi0+cl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9MSVRBKQotCWludGVybi0+cl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0FCUzsKLSAgICB9Ci19Ci0KLS8qIFN3YXAgYSByZWxvYyBvdXQuICAqLwotCi1zdGF0aWMgdm9pZAotYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsIGludGVybiwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotICAgICBQVFIgZHN0OwotewotICBSRUxPQyAqZXh0ID0gKFJFTE9DICopIGRzdDsKLSAgbG9uZyBzeW1uZHg7Ci0gIHVuc2lnbmVkIGNoYXIgc2l6ZTsKLQotICAvKiBVbmRvIHRoZSBoYWNrZXJ5IGRvbmUgaW4gc3dhcF9yZWxvY19pbi4gICovCi0gIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBBTFBIQV9SX0xJVFVTRQotICAgICAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gQUxQSEFfUl9HUERJU1ApCi0gICAgewotICAgICAgc3ltbmR4ID0gaW50ZXJuLT5yX3NpemU7Ci0gICAgICBzaXplID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGludGVybi0+cl90eXBlID09IEFMUEhBX1JfSUdOT1JFCi0JICAgJiYgISBpbnRlcm4tPnJfZXh0ZXJuCi0JICAgJiYgaW50ZXJuLT5yX3N5bW5keCA9PSBSRUxPQ19TRUNUSU9OX0FCUykKLSAgICB7Ci0gICAgICBzeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVEE7Ci0gICAgICBzaXplID0gaW50ZXJuLT5yX3NpemU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltbmR4ID0gaW50ZXJuLT5yX3N5bW5keDsKLSAgICAgIHNpemUgPSBpbnRlcm4tPnJfc2l6ZTsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAoaW50ZXJuLT5yX2V4dGVybgotCSAgICAgIHx8IChpbnRlcm4tPnJfc3ltbmR4ID49IDAgJiYgaW50ZXJuLT5yX3N5bW5keCA8PSAxNCkpOwotCi0gIGJmZF9oX3B1dF82NCAoYWJmZCwgaW50ZXJuLT5yX3ZhZGRyLCAoYmZkX2J5dGUgKikgZXh0LT5yX3ZhZGRyKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzeW1uZHgsIChiZmRfYnl0ZSAqKSBleHQtPnJfc3ltbmR4KTsKLQotICBCRkRfQVNTRVJUIChiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4gKGFiZmQpKTsKLQotICBleHQtPnJfYml0c1swXSA9ICgoaW50ZXJuLT5yX3R5cGUgPDwgUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUpCi0JCSAgICAmIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFKTsKLSAgZXh0LT5yX2JpdHNbMV0gPSAoKGludGVybi0+cl9leHRlcm4gPyBSRUxPQ19CSVRTMV9FWFRFUk5fTElUVExFIDogMCkKLQkJICAgIHwgKChpbnRlcm4tPnJfb2Zmc2V0IDw8IFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUpCi0JCSAgICAgICAmIFJFTE9DX0JJVFMxX09GRlNFVF9MSVRUTEUpKTsKLSAgZXh0LT5yX2JpdHNbMl0gPSAwOwotICBleHQtPnJfYml0c1szXSA9ICgoc2l6ZSA8PCBSRUxPQ19CSVRTM19TSVpFX1NIX0xJVFRMRSkKLQkJICAgICYgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUpOwotfQotCi0vKiBGaW5pc2ggY2Fub25pY2FsaXppbmcgYSByZWxvYy4gIFBhcnQgb2YgdGhpcyBpcyBnZW5lcmljIHRvIGFsbAotICAgRUNPRkYgdGFyZ2V0cywgYW5kIHRoYXQgcGFydCBpcyBpbiBlY29mZi5jLiAgVGhlIHJlc3QgaXMgZG9uZSBpbgotICAgdGhpcyBiYWNrZW5kIHJvdXRpbmUuICBJdCBtdXN0IGZpbGwgaW4gdGhlIGhvd3RvIGZpZWxkLiAgKi8KLQotc3RhdGljIHZvaWQKLWFscGhhX2FkanVzdF9yZWxvY19pbiAoYWJmZCwgaW50ZXJuLCBycHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotICAgICBhcmVsZW50ICpycHRyOwotewotICBpZiAoaW50ZXJuLT5yX3R5cGUgPiBBTFBIQV9SX0dQVkFMVUUpCi0gICAgYWJvcnQgKCk7Ci0KLSAgc3dpdGNoIChpbnRlcm4tPnJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBBTFBIQV9SX0JSQUREUjoKLSAgICBjYXNlIEFMUEhBX1JfU1JFTDE2OgotICAgIGNhc2UgQUxQSEFfUl9TUkVMMzI6Ci0gICAgY2FzZSBBTFBIQV9SX1NSRUw2NDoKLSAgICAgIC8qIFRoaXMgcmVsb2NzIGFwcGVhciB0byBiZSBmdWxseSByZXNvbHZlZCB3aGVuIHRoZXkgYXJlIGFnYWluc3QKLSAgICAgICAgIGludGVybmFsIHN5bWJvbHMuICBBZ2FpbnN0IGV4dGVybmFsIHN5bWJvbHMsIEJSQUREUiBhdCBsZWFzdAotICAgICAgICAgYXBwZWFycyB0byBiZSByZXNvbHZlZCBhZ2FpbnN0IHRoZSBuZXh0IGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGlmICghIGludGVybi0+cl9leHRlcm4pCi0JcnB0ci0+YWRkZW5kID0gMDsKLSAgICAgIGVsc2UKLQlycHRyLT5hZGRlbmQgPSAtIChpbnRlcm4tPnJfdmFkZHIgKyA0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX0dQUkVMMzI6Ci0gICAgY2FzZSBBTFBIQV9SX0xJVEVSQUw6Ci0gICAgICAvKiBDb3B5IHRoZSBncCB2YWx1ZSBmb3IgdGhpcyBvYmplY3QgZmlsZSBpbnRvIHRoZSBhZGRlbmQsIHRvCi0JIGVuc3VyZSB0aGF0IHdlIGFyZSBub3QgY29uZnVzZWQgYnkgdGhlIGxpbmtlci4gICovCi0gICAgICBpZiAoISBpbnRlcm4tPnJfZXh0ZXJuKQotCXJwdHItPmFkZGVuZCArPSBlY29mZl9kYXRhIChhYmZkKS0+Z3A7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9MSVRVU0U6Ci0gICAgY2FzZSBBTFBIQV9SX0dQRElTUDoKLSAgICAgIC8qIFRoZSBMSVRVU0UgYW5kIEdQRElTUCByZWxvY3MgZG8gbm90IHVzZSBhIHN5bWJvbCwgb3IgYW4KLQkgYWRkZW5kLCBidXQgdGhleSBkbyB1c2UgYSBzcGVjaWFsIGNvZGUuICBQdXQgdGhpcyBjb2RlIGluIHRoZQotCSBhZGRlbmQgZmllbGQuICAqLwotICAgICAgcnB0ci0+YWRkZW5kID0gaW50ZXJuLT5yX3NpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9PUF9TVE9SRToKLSAgICAgIC8qIFRoZSBTVE9SRSByZWxvYyBuZWVkcyB0aGUgc2l6ZSBhbmQgb2Zmc2V0IGZpZWxkcy4gIFdlIHN0b3JlCi0JIHRoZW0gaW4gdGhlIGFkZGVuZC4gICovCi0gICAgICBCRkRfQVNTRVJUIChpbnRlcm4tPnJfb2Zmc2V0IDw9IDI1NiAmJiBpbnRlcm4tPnJfc2l6ZSA8PSAyNTYpOwotICAgICAgcnB0ci0+YWRkZW5kID0gKGludGVybi0+cl9vZmZzZXQgPDwgOCkgKyBpbnRlcm4tPnJfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX09QX1BVU0g6Ci0gICAgY2FzZSBBTFBIQV9SX09QX1BTVUI6Ci0gICAgY2FzZSBBTFBIQV9SX09QX1BSU0hJRlQ6Ci0gICAgICAvKiBUaGUgUFVTSCwgUFNVQiBhbmQgUFJTSElGVCByZWxvY3MgZG8gbm90IGFjdHVhbGx5IHVzZSBhbgotCSBhZGRyZXNzLiAgSSBiZWxpZXZlIHRoYXQgdGhlIGFkZHJlc3Mgc3VwcGxpZWQgaXMgcmVhbGx5IGFuCi0JIGFkZGVuZC4gICovCi0gICAgICBycHRyLT5hZGRlbmQgPSBpbnRlcm4tPnJfdmFkZHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9HUFZBTFVFOgotICAgICAgLyogU2V0IHRoZSBhZGRlbmQgZmllbGQgdG8gdGhlIG5ldyBHUCB2YWx1ZS4gICovCi0gICAgICBycHRyLT5hZGRlbmQgPSBpbnRlcm4tPnJfc3ltbmR4ICsgZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfSUdOT1JFOgotICAgICAgLyogSWYgdGhlIHR5cGUgaXMgQUxQSEFfUl9JR05PUkUsIG1ha2Ugc3VyZSB0aGlzIGlzIGEgcmVmZXJlbmNlCi0JIHRvIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHNvIHRoYXQgdGhlIHJlbG9jIGlzIGlnbm9yZWQuICBGb3IKLQkgc29tZSByZWFzb24gdGhlIGFkZHJlc3Mgb2YgdGhpcyByZWxvYyB0eXBlIGlzIG5vdCBhZGp1c3RlZCBieQotCSB0aGUgc2VjdGlvbiB2bWEuICBXZSByZWNvcmQgdGhlIGdwIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlCi0JIGhlcmUsIGZvciBjb252ZW5pZW5jZSB3aGVuIGRvaW5nIHRoZSBHUERJU1AgcmVsb2NhdGlvbi4gICovCi0gICAgICBycHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgICAgcnB0ci0+YWRkcmVzcyA9IGludGVybi0+cl92YWRkcjsKLSAgICAgIHJwdHItPmFkZGVuZCA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5ncDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBycHRyLT5ob3d0byA9ICZhbHBoYV9ob3d0b190YWJsZVtpbnRlcm4tPnJfdHlwZV07Ci19Ci0KLS8qIFdoZW4gd3JpdGluZyBvdXQgYSByZWxvYyB3ZSBuZWVkIHRvIHB1bGwgc29tZSB2YWx1ZXMgYmFjayBvdXQgb2YKLSAgIHRoZSBhZGRlbmQgZmllbGQgaW50byB0aGUgcmVsb2MuICBUaGlzIGlzIHJvdWdobHkgdGhlIHJldmVyc2Ugb2YKLSAgIGFscGhhX2FkanVzdF9yZWxvY19pbiwgZXhjZXB0IHRoYXQgdGhlcmUgYXJlIHNldmVyYWwgY2hhbmdlcyB3ZSBkbwotICAgbm90IG5lZWQgdG8gdW5kby4gICovCi0KLXN0YXRpYyB2b2lkCi1hbHBoYV9hZGp1c3RfcmVsb2Nfb3V0IChhYmZkLCByZWwsIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBhcmVsZW50ICpyZWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotewotICBzd2l0Y2ggKGludGVybi0+cl90eXBlKQotICAgIHsKLSAgICBjYXNlIEFMUEhBX1JfTElUVVNFOgotICAgIGNhc2UgQUxQSEFfUl9HUERJU1A6Ci0gICAgICBpbnRlcm4tPnJfc2l6ZSA9IHJlbC0+YWRkZW5kOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfT1BfU1RPUkU6Ci0gICAgICBpbnRlcm4tPnJfc2l6ZSA9IHJlbC0+YWRkZW5kICYgMHhmZjsKLSAgICAgIGludGVybi0+cl9vZmZzZXQgPSAocmVsLT5hZGRlbmQgPj4gOCkgJiAweGZmOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfT1BfUFVTSDoKLSAgICBjYXNlIEFMUEhBX1JfT1BfUFNVQjoKLSAgICBjYXNlIEFMUEhBX1JfT1BfUFJTSElGVDoKLSAgICAgIGludGVybi0+cl92YWRkciA9IHJlbC0+YWRkZW5kOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfSUdOT1JFOgotICAgICAgaW50ZXJuLT5yX3ZhZGRyID0gcmVsLT5hZGRyZXNzOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgc3RhY2sgZm9yIHRoZSByZWxvY2F0aW9uIGV2YWx1YXRvci4gICovCi0jZGVmaW5lIFJFTE9DX1NUQUNLU0laRSAoMTApCi0KLS8qIEFscGhhIEVDT0ZGIHJlbG9jcyBoYXZlIGEgYnVpbHQgaW4gZXhwcmVzc2lvbiBldmFsdWF0b3IgYXMgd2VsbCBhcwotICAgb3RoZXIgaW50ZXJkZXBlbmRlbmNpZXMuICBSYXRoZXIgdGhhbiB1c2UgYSBidW5jaCBvZiBzcGVjaWFsCi0gICBmdW5jdGlvbnMgYW5kIGdsb2JhbCB2YXJpYWJsZXMsIHdlIHVzZSBhIHNpbmdsZSByb3V0aW5lIHRvIGRvIGFsbAotICAgdGhlIHJlbG9jYXRpb24gZm9yIGEgc2VjdGlvbi4gIEkgaGF2ZW4ndCB5ZXQgd29ya2VkIG91dCBob3cgdGhlCi0gICBhc3NlbWJsZXIgaXMgZ29pbmcgdG8gaGFuZGxlIHRoaXMuICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCSAgICBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBiZmQgKmlucHV0X2JmZCA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotICBhcmVsZW50ICoqcmVsb2NfdmVjdG9yID0gTlVMTDsKLSAgbG9uZyByZWxvY19jb3VudDsKLSAgYmZkICpvdXRwdXRfYmZkID0gcmVsb2NhdGVhYmxlID8gYWJmZCA6IChiZmQgKikgTlVMTDsKLSAgYmZkX3ZtYSBncDsKLSAgYm9vbGVhbiBncF91bmRlZmluZWQ7Ci0gIGJmZF92bWEgc3RhY2tbUkVMT0NfU1RBQ0tTSVpFXTsKLSAgaW50IHRvcyA9IDA7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gIGlmIChyZWxvY192ZWN0b3IgPT0gTlVMTCAmJiByZWxvY19zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGRhdGEsCi0JCQkJICAoZmlsZV9wdHIpIDAsIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhlIHNlY3Rpb24gc2l6ZSBpcyBub3QgZ29pbmcgdG8gY2hhbmdlLiAgKi8KLSAgaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplOwotICBpbnB1dF9zZWN0aW9uLT5yZWxvY19kb25lID0gdHJ1ZTsKLQotICByZWxvY19jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJcmVsb2NfdmVjdG9yLCBzeW1ib2xzKTsKLSAgaWYgKHJlbG9jX2NvdW50IDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKHJlbG9jX2NvdW50ID09IDApCi0gICAgZ290byBzdWNjZXNzZnVsX3JldHVybjsKLQotICAvKiBHZXQgdGhlIEdQIHZhbHVlIGZvciB0aGUgb3V0cHV0IEJGRC4gICovCi0gIGdwX3VuZGVmaW5lZCA9IGZhbHNlOwotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChhYmZkKTsKLSAgaWYgKGdwID09IDApCi0gICAgewotICAgICAgaWYgKHJlbG9jYXRlYWJsZSAhPSBmYWxzZSkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCSAgYmZkX3ZtYSBsbzsKLQotCSAgLyogTWFrZSB1cCBhIHZhbHVlLiAgKi8KLQkgIGxvID0gKGJmZF92bWEpIC0xOwotCSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChzZWMtPnZtYSA8IGxvCi0JCSAgJiYgKHN0cmNtcCAoc2VjLT5uYW1lLCAiLnNic3MiKSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoc2VjLT5uYW1lLCAiLnNkYXRhIikgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKHNlYy0+bmFtZSwgIi5saXQ0IikgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKHNlYy0+bmFtZSwgIi5saXQ4IikgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKHNlYy0+bmFtZSwgIi5saXRhIikgPT0gMCkpCi0JCWxvID0gc2VjLT52bWE7Ci0JICAgIH0KLQkgIGdwID0gbG8gKyAweDgwMDA7Ci0JICBfYmZkX3NldF9ncF92YWx1ZSAoYWJmZCwgZ3ApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8tPmhhc2gsICJfZ3AiLCBmYWxzZSwgZmFsc2UsCi0JCQkJICAgIHRydWUpOwotCSAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgICB8fCBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQkgICAgZ3BfdW5kZWZpbmVkID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGdwID0gKGgtPnUuZGVmLnZhbHVlCi0JCSAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKGFiZmQsIGdwKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgZm9yICg7ICpyZWxvY192ZWN0b3IgIT0gKGFyZWxlbnQgKikgTlVMTDsgcmVsb2NfdmVjdG9yKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcmVsOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0gICAgICBjaGFyICplcnI7Ci0KLSAgICAgIHJlbCA9ICpyZWxvY192ZWN0b3I7Ci0gICAgICByID0gYmZkX3JlbG9jX29rOwotICAgICAgc3dpdGNoIChyZWwtPmhvd3RvLT50eXBlKQotCXsKLQljYXNlIEFMUEhBX1JfSUdOT1JFOgotCSAgcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9SRUZMT05HOgotCWNhc2UgQUxQSEFfUl9SRUZRVUFEOgotCWNhc2UgQUxQSEFfUl9CUkFERFI6Ci0JY2FzZSBBTFBIQV9SX0hJTlQ6Ci0JY2FzZSBBTFBIQV9SX1NSRUwxNjoKLQljYXNlIEFMUEhBX1JfU1JFTDMyOgotCWNhc2UgQUxQSEFfUl9TUkVMNjQ6Ci0JICBpZiAocmVsb2NhdGVhYmxlCi0JICAgICAgJiYgKCgqcmVsLT5zeW1fcHRyX3B0ciktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotCSAgICB7Ci0JICAgICAgcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHIgPSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsIHJlbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBvdXRwdXRfYmZkLCAmZXJyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX0dQUkVMMzI6Ci0JICAvKiBUaGlzIHJlbG9jYXRpb24gaXMgdXNlZCBpbiBhIHN3aXRjaCB0YWJsZS4gIEl0IGlzIGEgMzIKLQkgICAgIGJpdCBvZmZzZXQgZnJvbSB0aGUgY3VycmVudCBHUCB2YWx1ZS4gIFdlIG11c3QgYWRqdXN0IGl0Ci0JICAgICBieSB0aGUgZGlmZmVyZW50IGJldHdlZW4gdGhlIG9yaWdpbmFsIEdQIHZhbHVlIGFuZCB0aGUKLQkgICAgIGN1cnJlbnQgR1AgdmFsdWUuICBUaGUgb3JpZ2luYWwgR1AgdmFsdWUgaXMgc3RvcmVkIGluIHRoZQotCSAgICAgYWRkZW5kLiAgV2UgYWRqdXN0IHRoZSBhZGRlbmQgYW5kIGxldAotCSAgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmaW5pc2ggdGhlIGpvYi4gICovCi0JICByZWwtPmFkZGVuZCAtPSBncDsKLQkgIHIgPSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsIHJlbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBvdXRwdXRfYmZkLCAmZXJyKTsKLQkgIGlmIChyID09IGJmZF9yZWxvY19vayAmJiBncF91bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICByID0gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQkgICAgICBlcnIgPSAoY2hhciAqKSBfKCJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHVzZWQgd2hlbiBHUCBub3QgZGVmaW5lZCIpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9MSVRFUkFMOgotCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIGxpdGVyYWwgdmFsdWUsIGdlbmVyYWxseQotCSAgICAgKGFsd2F5cz8pIGluIHRoZSAubGl0YSBzZWN0aW9uLiAgVGhpcyBpcyBhIDE2IGJpdCBHUAotCSAgICAgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFNvbWV0aW1lcyB0aGUgc3Vic2VxdWVudCByZWxvYyBpcyBhCi0JICAgICBMSVRVU0UgcmVsb2MsIHdoaWNoIGluZGljYXRlcyBob3cgdGhpcyByZWxvYyBpcyB1c2VkLgotCSAgICAgVGhpcyBzb21ldGltZXMgcGVybWl0cyByZXdyaXRpbmcgdGhlIHR3byBpbnN0cnVjdGlvbnMKLQkgICAgIHJlZmVycmVkIHRvIGJ5IHRoZSBMSVRFUkFMIGFuZCB0aGUgTElUVVNFIGludG8gZGlmZmVyZW50Ci0JICAgICBpbnN0cnVjdGlvbnMgd2hpY2ggZG8gbm90IHJlZmVyIHRvIC5saXRhLiAgVGhpcyBjYW4gc2F2ZQotCSAgICAgYSBtZW1vcnkgcmVmZXJlbmNlLCBhbmQgcGVybWl0cyByZW1vdmluZyBhIHZhbHVlIGZyb20KLQkgICAgIC5saXRhIHRodXMgc2F2aW5nIEdQIHJlbGF0aXZlIHNwYWNlLgotCi0JICAgICBXZSBkbyBub3QgdGhlc2Ugb3B0aW1pemF0aW9ucy4gIFRvIGRvIHRoZW0gd2Ugd291bGQgbmVlZAotCSAgICAgdG8gYXJyYW5nZSB0byBsaW5rIHRoZSAubGl0YSBzZWN0aW9uIGZpcnN0LCBzbyB0aGF0IGJ5Ci0JICAgICB0aGUgdGltZSB3ZSBnb3QgaGVyZSB3ZSB3b3VsZCBrbm93IHRoZSBmaW5hbCB2YWx1ZXMgdG8KLQkgICAgIHVzZS4gIFRoaXMgd291bGQgbm90IGJlIHBhcnRpY3VsYXJseSBkaWZmaWN1bHQsIGJ1dCBpdCBpcwotCSAgICAgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4gICovCi0KLQkgIHsKLQkgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotCi0JICAgIC8qIEkgYmVsaWV2ZSB0aGF0IHRoZSBMSVRFUkFMIHJlbG9jIHdpbGwgb25seSBhcHBseSB0byBhCi0JICAgICAgIGxkcSBvciBsZGwgaW5zdHJ1Y3Rpb24sIHNvIGNoZWNrIG15IGFzc3VtcHRpb24uICAqLwotCSAgICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBkYXRhICsgcmVsLT5hZGRyZXNzKTsKLQkgICAgQkZEX0FTU0VSVCAoKChpbnNuID4+IDI2KSAmIDB4M2YpID09IDB4MjkKLQkJCXx8ICgoaW5zbiA+PiAyNikgJiAweDNmKSA9PSAweDI4KTsKLQotCSAgICByZWwtPmFkZGVuZCAtPSBncDsKLQkgICAgciA9IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGlucHV0X2JmZCwgcmVsLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJCQlvdXRwdXRfYmZkLCAmZXJyKTsKLQkgICAgaWYgKHIgPT0gYmZkX3JlbG9jX29rICYmIGdwX3VuZGVmaW5lZCkKLQkgICAgICB7Ci0JCXIgPSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCQllcnIgPQotCQkgIChjaGFyICopIF8oIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gdXNlZCB3aGVuIEdQIG5vdCBkZWZpbmVkIik7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfTElUVVNFOgotCSAgLyogU2VlIEFMUEhBX1JfTElURVJBTCBhYm92ZSBmb3IgdGhlIHVzZXMgb2YgdGhpcyByZWxvYy4gIEl0Ci0JICAgICBkb2VzIG5vdCBjYXVzZSBhbnl0aGluZyB0byBoYXBwZW4sIGl0c2VsZi4gICovCi0JICByZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIGJyZWFrOwotCSAgICAKLQljYXNlIEFMUEhBX1JfR1BESVNQOgotCSAgLyogVGhpcyBtYXJrcyB0aGUgbGRhaCBvZiBhbiBsZGFoL2xkYSBwYWlyIHdoaWNoIGxvYWRzIHRoZQotCSAgICAgZ3AgcmVnaXN0ZXIgd2l0aCB0aGUgZGlmZmVyZW5jZSBvZiB0aGUgZ3AgdmFsdWUgYW5kIHRoZQotCSAgICAgY3VycmVudCBsb2NhdGlvbi4gIFRoZSBzZWNvbmQgb2YgdGhlIHBhaXIgaXMgcl9zaXplIGJ5dGVzCi0JICAgICBhaGVhZDsgaXQgdXNlZCB0byBiZSBtYXJrZWQgd2l0aCBhbiBBTFBIQV9SX0lHTk9SRSByZWxvYywKLQkgICAgIGJ1dCB0aGF0IG5vIGxvbmdlciBoYXBwZW5zIGluIE9TRi8xIDMuMi4gICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaW5zbjEsIGluc24yOwotCSAgICBiZmRfdm1hIGFkZGVuZDsKLQotCSAgICAvKiBHZXQgdGhlIHR3byBpbnN0cnVjdGlvbnMuICAqLwotCSAgICBpbnNuMSA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgZGF0YSArIHJlbC0+YWRkcmVzcyk7Ci0JICAgIGluc24yID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBkYXRhICsgcmVsLT5hZGRyZXNzICsgcmVsLT5hZGRlbmQpOwotCi0JICAgIEJGRF9BU1NFUlQgKCgoaW5zbjEgPj4gMjYpICYgMHgzZikgPT0gMHgwOSk7IC8qIGxkYWggKi8KLQkgICAgQkZEX0FTU0VSVCAoKChpbnNuMiA+PiAyNikgJiAweDNmKSA9PSAweDA4KTsgLyogbGRhICovCi0KLQkgICAgLyogR2V0IHRoZSBleGlzdGluZyBhZGRlbmQuICBXZSBtdXN0IGFjY291bnQgZm9yIHRoZSBzaWduCi0JICAgICAgIGV4dGVuc2lvbiBkb25lIGJ5IGxkYSBhbmQgbGRhaC4gICovCi0JICAgIGFkZGVuZCA9ICgoaW5zbjEgJiAweGZmZmYpIDw8IDE2KSArIChpbnNuMiAmIDB4ZmZmZik7Ci0JICAgIGlmIChpbnNuMSAmIDB4ODAwMCkKLQkgICAgICB7Ci0JCWFkZGVuZCAtPSAweDgwMDAwMDAwOwotCQlhZGRlbmQgLT0gMHg4MDAwMDAwMDsKLQkgICAgICB9Ci0JICAgIGlmIChpbnNuMiAmIDB4ODAwMCkKLQkgICAgICBhZGRlbmQgLT0gMHgxMDAwMDsKLQotCSAgICAvKiBUaGUgZXhpc3RpbmcgYWRkZW5kIGluY2x1ZGVzIHRoZSBkaWZmZXJlbnQgYmV0d2VlbiB0aGUKLQkgICAgICAgZ3Agb2YgdGhlIGlucHV0IEJGRCBhbmQgdGhlIGFkZHJlc3MgaW4gdGhlIGlucHV0IEJGRC4KLQkgICAgICAgU3VidHJhY3QgdGhpcyBvdXQuICAqLwotCSAgICBhZGRlbmQgLT0gKGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwCi0JCSAgICAgICAtIChpbnB1dF9zZWN0aW9uLT52bWEgKyByZWwtPmFkZHJlc3MpKTsKLQotCSAgICAvKiBOb3cgYWRkIGluIHRoZSBmaW5hbCBncCB2YWx1ZSwgYW5kIHN1YnRyYWN0IG91dCB0aGUKLQkgICAgICAgZmluYWwgYWRkcmVzcy4gICovCi0JICAgIGFkZGVuZCArPSAoZ3AKLQkJICAgICAgIC0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICsgcmVsLT5hZGRyZXNzKSk7Ci0KLQkgICAgLyogQ2hhbmdlIHRoZSBpbnN0cnVjdGlvbnMsIGFjY291bnRpbmcgZm9yIHRoZSBzaWduCi0JICAgICAgIGV4dGVuc2lvbiwgYW5kIHdyaXRlIHRoZW0gb3V0LiAgKi8KLQkgICAgaWYgKGFkZGVuZCAmIDB4ODAwMCkKLQkgICAgICBhZGRlbmQgKz0gMHgxMDAwMDsKLQkgICAgaW5zbjEgPSAoaW5zbjEgJiAweGZmZmYwMDAwKSB8ICgoYWRkZW5kID4+IDE2KSAmIDB4ZmZmZik7Ci0JICAgIGluc24yID0gKGluc24yICYgMHhmZmZmMDAwMCkgfCAoYWRkZW5kICYgMHhmZmZmKTsKLQotCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIChiZmRfdm1hKSBpbnNuMSwgZGF0YSArIHJlbC0+YWRkcmVzcyk7Ci0JICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24yLAotCQkJZGF0YSArIHJlbC0+YWRkcmVzcyArIHJlbC0+YWRkZW5kKTsKLQotCSAgICByZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBBTFBIQV9SX09QX1BVU0g6Ci0JICAvKiBQdXNoIGEgdmFsdWUgb24gdGhlIHJlbG9jIGV2YWx1YXRpb24gc3RhY2suICAqLwotCSAgewotCSAgICBhc3ltYm9sICpzeW1ib2w7Ci0JICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotCSAgICBpZiAocmVsb2NhdGVhYmxlKQotCSAgICAgIHsKLQkJcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICAvKiBGaWd1cmUgb3V0IHRoZSByZWxvY2F0aW9uIG9mIHRoaXMgc3ltYm9sLiAgKi8KLQkgICAgc3ltYm9sID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLQkgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgICByID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotCSAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICBlbHNlCi0JICAgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0JICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgICAgcmVsb2NhdGlvbiArPSByZWwtPmFkZGVuZDsKLQotCSAgICBpZiAodG9zID49IFJFTE9DX1NUQUNLU0laRSkKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICBzdGFja1t0b3MrK10gPSByZWxvY2F0aW9uOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfT1BfU1RPUkU6Ci0JICAvKiBTdG9yZSBhIHZhbHVlIGZyb20gdGhlIHJlbG9jIHN0YWNrIGludG8gYSBiaXRmaWVsZC4gICovCi0JICB7Ci0JICAgIGJmZF92bWEgdmFsOwotCSAgICBpbnQgb2Zmc2V0LCBzaXplOwotCi0JICAgIGlmIChyZWxvY2F0ZWFibGUpCi0JICAgICAgewotCQlyZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIGlmICh0b3MgPT0gMCkKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICAvKiBUaGUgb2Zmc2V0IGFuZCBzaXplIGZvciB0aGlzIHJlbG9jIGFyZSBlbmNvZGVkIGludG8gdGhlCi0JICAgICAgIGFkZGVuZCBmaWVsZCBieSBhbHBoYV9hZGp1c3RfcmVsb2NfaW4uICAqLwotCSAgICBvZmZzZXQgPSAocmVsLT5hZGRlbmQgPj4gOCkgJiAweGZmOwotCSAgICBzaXplID0gcmVsLT5hZGRlbmQgJiAweGZmOwotCi0JICAgIHZhbCA9IGJmZF9nZXRfNjQgKGFiZmQsIGRhdGEgKyByZWwtPmFkZHJlc3MpOwotCSAgICB2YWwgJj1+ICgoKDEgPDwgc2l6ZSkgLSAxKSA8PCBvZmZzZXQpOwotCSAgICB2YWwgfD0gKHN0YWNrWy0tdG9zXSAmICgoMSA8PCBzaXplKSAtIDEpKSA8PCBvZmZzZXQ7Ci0JICAgIGJmZF9wdXRfNjQgKGFiZmQsIHZhbCwgZGF0YSArIHJlbC0+YWRkcmVzcyk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9PUF9QU1VCOgotCSAgLyogU3VidHJhY3QgYSB2YWx1ZSBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KLQkgIHsKLQkgICAgYXN5bWJvbCAqc3ltYm9sOwotCSAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLQkgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQkgICAgICB7Ci0JCXJlbC0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgLyogRmlndXJlIG91dCB0aGUgcmVsb2NhdGlvbiBvZiB0aGlzIHN5bWJvbC4gICovCi0JICAgIHN5bWJvbCA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0JICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JICAgICAgciA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLQkgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCSAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICAgIHJlbG9jYXRpb24gKz0gcmVsLT5hZGRlbmQ7Ci0KLQkgICAgaWYgKHRvcyA9PSAwKQotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIHN0YWNrW3RvcyAtIDFdIC09IHJlbG9jYXRpb247Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9PUF9QUlNISUZUOgotCSAgLyogU2hpZnQgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KLQkgIHsKLQkgICAgYXN5bWJvbCAqc3ltYm9sOwotCSAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLQkgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQkgICAgICB7Ci0JCXJlbC0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgLyogRmlndXJlIG91dCB0aGUgcmVsb2NhdGlvbiBvZiB0aGlzIHN5bWJvbC4gICovCi0JICAgIHN5bWJvbCA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0JICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JICAgICAgciA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLQkgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCSAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICAgIHJlbG9jYXRpb24gKz0gcmVsLT5hZGRlbmQ7Ci0KLQkgICAgaWYgKHRvcyA9PSAwKQotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIHN0YWNrW3RvcyAtIDFdID4+PSByZWxvY2F0aW9uOwotCSAgfQotCSAgYnJlYWs7Ci0JICAgIAotCWNhc2UgQUxQSEFfUl9HUFZBTFVFOgotCSAgLyogSSByZWFsbHkgZG9uJ3Qga25vdyBpZiB0aGlzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLiAgKi8KLQkgIGdwID0gcmVsLT5hZGRlbmQ7Ci0JICBncF91bmRlZmluZWQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQl7Ci0JICBhc2VjdGlvbiAqb3MgPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgLyogQSBwYXJ0aWFsIGxpbmssIHNvIGtlZXAgdGhlIHJlbG9jcy4gICovCi0JICBvcy0+b3JlbG9jYXRpb25bb3MtPnJlbG9jX2NvdW50XSA9IHJlbDsKLQkgIG9zLT5yZWxvY19jb3VudCsrOwotCX0KLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKSAKLQl7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWwtPnN5bV9wdHJfcHRyKSwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPmFkZHJlc3MpKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czogCi0JICAgICAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAobGlua19pbmZvLCBlcnIsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5hZGRyZXNzKSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbC0+c3ltX3B0cl9wdHIpLAotCQkgICAgICByZWwtPmhvd3RvLT5uYW1lLCByZWwtPmFkZGVuZCwgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPmFkZHJlc3MpKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICh0b3MgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotIHN1Y2Nlc3NmdWxfcmV0dXJuOgotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogR2V0IHRoZSBob3d0byBzdHJ1Y3R1cmUgZm9yIGEgZ2VuZXJpYyByZWxvYyB0eXBlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBpbnQgYWxwaGFfdHlwZTsKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfUkVGTE9ORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzY0OgotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9SRUZRVUFEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0dQUkVMMzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfTElURVJBTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRToKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0xJVFVTRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfR1BESVNQOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTY6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9JR05PUkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18yM19QQ1JFTF9TMjoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0JSQUREUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0hJTlQ6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9ISU5UOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzY0X1BDUkVMOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfU1JFTDY0OwotICAgICAgYnJlYWs7Ci0jaWYgMAotICAgIGNhc2UgPz8/OgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfT1BfUFVTSDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgPz8/OgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfT1BfU1RPUkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlID8/PzoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX09QX1BTVUI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlID8/PzoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX09QX1BSU0hJRlQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlID8/PzoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0dQVkFMVUU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICZhbHBoYV9ob3d0b190YWJsZVthbHBoYV90eXBlXTsKLX0KLQwKLS8qIEEgaGVscGVyIHJvdXRpbmUgZm9yIGFscGhhX3JlbG9jYXRlX3NlY3Rpb24gd2hpY2ggY29udmVydHMgYW4KLSAgIGV4dGVybmFsIHJlbG9jIHdoZW4gZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgUmV0dXJucyB0aGUKLSAgIHJlbG9jYXRpb24gYW1vdW50LiAgKi8KLQotc3RhdGljIGJmZF92bWEKLWFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MgKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgZXh0X3JlbCwgaCkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3JlbDsKLSAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIEJGRF9BU1NFUlQgKGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgewotICAgICAgYXNlY3Rpb24gKmhzZWM7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSBvdXRwdXQuICBDb252ZXJ0IHRoZSByZWxvYyBmcm9tCi0JIGJlaW5nIGFnYWluc3QgdGhlIHN5bWJvbCB0byBiZWluZyBhZ2FpbnN0IHRoZSBzZWN0aW9uLiAgKi8KLQotICAgICAgLyogQ2xlYXIgdGhlIHJfZXh0ZXJuIGJpdC4gICovCi0gICAgICBleHRfcmVsLT5yX2JpdHNbMV0gJj1+IFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEU7Ci0KLSAgICAgIC8qIENvbXB1dGUgYSBuZXcgcl9zeW1uZHggdmFsdWUuICAqLwotICAgICAgaHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgaHNlYy0+b3V0cHV0X3NlY3Rpb24pOwotCi0gICAgICByX3N5bW5keCA9IC0xOwotICAgICAgc3dpdGNoIChuYW1lWzFdKQotCXsKLQljYXNlICdBJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIqQUJTKiIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9BQlM7Ci0JICBicmVhazsKLQljYXNlICdiJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0RBVEE7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9GSU5JOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5saXRhIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVEE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ4OwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUNDsKLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5wZGF0YSIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9QREFUQTsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SREFUQTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yY29uc3QiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkNPTlNUOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NEQVRBOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0JTUzsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1RFWFQ7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIueGRhdGEiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fWERBVEE7Ci0JICBicmVhazsKLQl9Ci0JCSAgICAgIAotICAgICAgaWYgKHJfc3ltbmR4ID09IC0xKQotCWFib3J0ICgpOwotCi0gICAgICAvKiBBZGQgdGhlIHNlY3Rpb24gVk1BIGFuZCB0aGUgc3ltYm9sIHZhbHVlLiAgKi8KLSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGhzZWMtPm91dHB1dF9vZmZzZXQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIENoYW5nZSB0aGUgc3ltbmR4IHZhbHVlIHRvIHRoZSByaWdodCBvbmUgZm9yCi0JIHRoZSBvdXRwdXQgQkZELiAgKi8KLSAgICAgIHJfc3ltbmR4ID0gaC0+aW5keDsKLSAgICAgIGlmIChyX3N5bW5keCA9PSAtMSkKLQl7Ci0JICAvKiBDYWxsZXIgbXVzdCBnaXZlIGFuIGVycm9yLiAgKi8KLQkgIHJfc3ltbmR4ID0gMDsKLQl9Ci0gICAgICByZWxvY2F0aW9uID0gMDsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBuZXcgcl9zeW1uZHggdmFsdWUuICAqLwotICBiZmRfaF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIHJfc3ltbmR4LAotCQkoYmZkX2J5dGUgKikgZXh0X3JlbC0+cl9zeW1uZHgpOwotCi0gIHJldHVybiByZWxvY2F0aW9uOwotfQotCi0vKiBSZWxvY2F0ZSBhIHNlY3Rpb24gd2hpbGUgbGlua2luZyBhbiBBbHBoYSBFQ09GRiBmaWxlLiAgVGhpcyBpcwotICAgcXVpdGUgc2ltaWxhciB0byBnZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMuICBQZXJoYXBzIHRoZXkKLSAgIGNvdWxkIGJlIGNvbWJpbmVkIHNvbWVob3cuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYWxwaGFfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJY29udGVudHMsIGV4dGVybmFsX3JlbG9jcykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci17Ci0gIGFzZWN0aW9uICoqc3ltbmR4X3RvX3NlY3Rpb24sICpsaXRhX3NlYzsKLSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgZ3A7Ci0gIGJvb2xlYW4gZ3BfdW5kZWZpbmVkOwotICBiZmRfdm1hIHN0YWNrW1JFTE9DX1NUQUNLU0laRV07Ci0gIGludCB0b3MgPSAwOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWw7Ci0gIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3JlbF9lbmQ7Ci0KLSAgLyogV2Uga2VlcCBhIHRhYmxlIG1hcHBpbmcgdGhlIHN5bW5keCBmb3VuZCBpbiBhbiBpbnRlcm5hbCByZWxvYyB0bwotICAgICB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbi4gIFRoaXMgaXMgZmFzdGVyIHRoYW4gbG9va2luZyB1cCB0aGUKLSAgICAgc2VjdGlvbiBieSBuYW1lIGVhY2ggdGltZS4gICovCi0gIHN5bW5keF90b19zZWN0aW9uID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+c3ltbmR4X3RvX3NlY3Rpb247Ci0gIGlmIChzeW1uZHhfdG9fc2VjdGlvbiA9PSAoYXNlY3Rpb24gKiopIE5VTEwpCi0gICAgewotICAgICAgc3ltbmR4X3RvX3NlY3Rpb24gPSAoKGFzZWN0aW9uICoqKQotCQkJICAgYmZkX2FsbG9jIChpbnB1dF9iZmQsCi0JCQkJICAgICAgKE5VTV9SRUxPQ19TRUNUSU9OUwotCQkJCSAgICAgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpKSk7Ci0gICAgICBpZiAoIXN5bW5keF90b19zZWN0aW9uKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9OT05FXSA9IE5VTEw7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1RFWFRdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnRleHQiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fUkRBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnJkYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0RBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmRhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fU0RBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnNkYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1NCU1NdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnNic3MiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fQlNTXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5ic3MiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fSU5JVF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuaW5pdCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9MSVQ4XSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5saXQ4Iik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVDRdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdDQiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fWERBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnhkYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1BEQVRBXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5wZGF0YSIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9GSU5JXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5maW5pIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fQUJTXSA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1JDT05TVF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIucmNvbnN0Iik7Ci0KLSAgICAgIGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnN5bW5keF90b19zZWN0aW9uID0gc3ltbmR4X3RvX3NlY3Rpb247Ci0gICAgfQotCi0gIHN5bV9oYXNoZXMgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1faGFzaGVzOwotCi0gIC8qIE9uIHRoZSBBbHBoYSwgdGhlIC5saXRhIHNlY3Rpb24gbXVzdCBiZSBhZGRyZXNzYWJsZSBieSB0aGUgZ2xvYmFsCi0gICAgIHBvaW50ZXIuICBUbyBzdXBwb3J0IGxhcmdlIHByb2dyYW1zLCB3ZSBuZWVkIHRvIGFsbG93IG11bHRpcGxlCi0gICAgIGdsb2JhbCBwb2ludGVycy4gIFRoaXMgd29ya3MgYXMgbG9uZyBhcyBlYWNoIGlucHV0IC5saXRhIHNlY3Rpb24KLSAgICAgaXMgPDY0S0IgYmlnLiAgVGhpcyBpbXBsaWVzIHRoYXQgd2hlbiBwcm9kdWNpbmcgcmVsb2NhdGFibGUKLSAgICAgb3V0cHV0LCB0aGUgLmxpdGEgc2VjdGlvbiBpcyBsaW1pdGVkIHRvIDY0S0IuIC4gKi8KLQotICBsaXRhX3NlYyA9IHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fTElUQV07Ci0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUgJiYgbGl0YV9zZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqbGl0YV9zZWNfZGF0YTsKLQotICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBzZWN0aW9uIGRhdGEgc3RydWN0dXJlIHRvIHdoaWNoIHdlIGNhbgotCSBoYW5nIG9uIHRvIHRoZSBncCB2YWx1ZSB3ZSBwaWNrIGZvciB0aGUgc2VjdGlvbi4gICovCi0gICAgICBsaXRhX3NlY19kYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGxpdGFfc2VjKTsKLSAgICAgIGlmIChsaXRhX3NlY19kYXRhID09IE5VTEwpCi0JewotCSAgbGl0YV9zZWNfZGF0YSA9ICgoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikKLQkJCSAgIGJmZF96YWxsb2MgKGlucHV0X2JmZCwKLQkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSkpKTsKLQkgIGVjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBsaXRhX3NlYykgPSBsaXRhX3NlY19kYXRhOwotCX0KLQotICAgICAgaWYgKGxpdGFfc2VjX2RhdGEtPmdwICE9IDApCi0JewotCSAgLyogSWYgd2UgYWxyZWFkeSBhc3NpZ25lZCBhIGdwIHRvIHRoaXMgc2VjdGlvbiwgd2UgYmV0dGVyCi0JICAgICBzdGljayB3aXRoIHRoYXQgdmFsdWUuICAqLwotCSAgZ3AgPSBsaXRhX3NlY19kYXRhLT5ncDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSBsaXRhX3ZtYTsKLQkgIGJmZF9zaXplX3R5cGUgbGl0YV9zaXplOwotCi0JICBsaXRhX3ZtYSA9IGxpdGFfc2VjLT5vdXRwdXRfb2Zmc2V0ICsgbGl0YV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICBsaXRhX3NpemUgPSBsaXRhX3NlYy0+X2Nvb2tlZF9zaXplOwotCSAgaWYgKGxpdGFfc2l6ZSA9PSAwKQotCSAgICBsaXRhX3NpemUgPSBsaXRhX3NlYy0+X3Jhd19zaXplOwotCi0JICBpZiAoZ3AgPT0gMAotCSAgICAgIHx8IGxpdGFfdm1hIDwgIGdwIC0gMHg4MDAwCi0JICAgICAgfHwgbGl0YV92bWEgKyBsaXRhX3NpemUgPj0gZ3AgKyAweDgwMDApCi0JICAgIHsKLQkgICAgICAvKiBFaXRoZXIgZ3AgaGFzbid0IGJlZW4gc2V0IGF0IGFsbCBvciB0aGUgY3VycmVudCBncAotCQkgY2Fubm90IGFkZHJlc3MgdGhpcyAubGl0YSBzZWN0aW9uLiAgSW4gYm90aCBjYXNlcyB3ZQotCQkgcmVzZXQgdGhlIGdwIHRvIHBvaW50IGludG8gdGhlICJtaWRkbGUiIG9mIHRoZQotCQkgY3VycmVudCBpbnB1dCAubGl0YSBzZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoZ3AgJiYgIWVjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5pc3N1ZWRfbXVsdGlwbGVfZ3Bfd2FybmluZykKLQkJewotCQkgICgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKSAoaW5mbywKLQkJCQkJICAgICAgIF8oInVzaW5nIG11bHRpcGxlIGdwIHZhbHVlcyIpLAotCQkJCQkgICAgICAgKGNoYXIgKikgTlVMTCwgb3V0cHV0X2JmZCwKLQkJCQkJICAgICAgIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCk7Ci0JCSAgZWNvZmZfZGF0YSAob3V0cHV0X2JmZCktPmlzc3VlZF9tdWx0aXBsZV9ncF93YXJuaW5nID0gdHJ1ZTsKLQkJfQotCSAgICAgIGlmIChsaXRhX3ZtYSA8IGdwIC0gMHg4MDAwKQotCQlncCA9IGxpdGFfdm1hICsgbGl0YV9zaXplIC0gMHg4MDAwOwotCSAgICAgIGVsc2UKLQkJZ3AgPSBsaXRhX3ZtYSArIDB4ODAwMDsKLQotCSAgICB9Ci0KLQkgIGxpdGFfc2VjX2RhdGEtPmdwID0gZ3A7Ci0JfQotCi0gICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotICAgIH0KLQotICBncF91bmRlZmluZWQgPSAoZ3AgPT0gMCk7Ci0KLSAgQkZEX0FTU0VSVCAoYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChvdXRwdXRfYmZkKSk7Ci0gIEJGRF9BU1NFUlQgKGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAoaW5wdXRfYmZkKSk7Ci0KLSAgZXh0X3JlbCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgZXh0ZXJuYWxfcmVsb2NzOwotICBleHRfcmVsX2VuZCA9IGV4dF9yZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IGV4dF9yZWwgPCBleHRfcmVsX2VuZDsgZXh0X3JlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgcl92YWRkcjsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgaW50IHJfZXh0ZXJuOwotICAgICAgaW50IHJfb2Zmc2V0OwotICAgICAgaW50IHJfc2l6ZTsKLSAgICAgIGJvb2xlYW4gcmVsb2NhdGVwOwotICAgICAgYm9vbGVhbiBhZGp1c3RfYWRkcnA7Ci0gICAgICBib29sZWFuIGdwX3VzZWRwOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0KLSAgICAgIHJfdmFkZHIgPSBiZmRfaF9nZXRfNjQgKGlucHV0X2JmZCwgKGJmZF9ieXRlICopIGV4dF9yZWwtPnJfdmFkZHIpOwotICAgICAgcl9zeW1uZHggPSBiZmRfaF9nZXRfMzIgKGlucHV0X2JmZCwgKGJmZF9ieXRlICopIGV4dF9yZWwtPnJfc3ltbmR4KTsKLQotICAgICAgcl90eXBlID0gKChleHRfcmVsLT5yX2JpdHNbMF0gJiBSRUxPQ19CSVRTMF9UWVBFX0xJVFRMRSkKLQkJPj4gUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUpOwotICAgICAgcl9leHRlcm4gPSAoZXh0X3JlbC0+cl9iaXRzWzFdICYgUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRSkgIT0gMDsKLSAgICAgIHJfb2Zmc2V0ID0gKChleHRfcmVsLT5yX2JpdHNbMV0gJiBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFKQotCQkgID4+IFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUpOwotICAgICAgLyogSWdub3JlZCB0aGUgcmVzZXJ2ZWQgYml0cy4gICovCi0gICAgICByX3NpemUgPSAoKGV4dF9yZWwtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1NJWkVfTElUVExFKQotCQk+PiBSRUxPQ19CSVRTM19TSVpFX1NIX0xJVFRMRSk7Ci0KLSAgICAgIHJlbG9jYXRlcCA9IGZhbHNlOwotICAgICAgYWRqdXN0X2FkZHJwID0gdHJ1ZTsKLSAgICAgIGdwX3VzZWRwID0gZmFsc2U7Ci0gICAgICBhZGRlbmQgPSAwOwotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCi0JY2FzZSBBTFBIQV9SX0lHTk9SRToKLQkgIC8qIFRoaXMgcmVsb2MgYXBwZWFycyBhZnRlciBhIEdQRElTUCByZWxvYy4gIE9uIGVhcmxpZXIKLQkgICAgIHZlcnNpb25zIG9mIE9TRi8xLCBJdCBtYXJrZWQgdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWNvbmQKLQkgICAgIGluc3RydWN0aW9uIHRvIGJlIGFsdGVyZWQgYnkgdGhlIEdQRElTUCByZWxvYywgYnV0IGl0IGlzCi0JICAgICBub3Qgb3RoZXJ3aXNlIHVzZWQgZm9yIGFueXRoaW5nLiAgRm9yIHNvbWUgcmVhc29uLCB0aGUKLQkgICAgIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24gZG9lcyBub3QgYXBwZWFyIHRvIGluY2x1ZGUgdGhlCi0JICAgICBzZWN0aW9uIFZNQSwgdW5saWtlIHRoZSBvdGhlciByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLQkgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIGJmZF9oX3B1dF82NCAoaW5wdXRfYmZkLAotCQkJICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsgcl92YWRkciwKLQkJCSAgKGJmZF9ieXRlICopIGV4dF9yZWwtPnJfdmFkZHIpOwotCSAgYWRqdXN0X2FkZHJwID0gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9SRUZMT05HOgotCWNhc2UgQUxQSEFfUl9SRUZRVUFEOgotCWNhc2UgQUxQSEFfUl9ISU5UOgotCSAgcmVsb2NhdGVwID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX0JSQUREUjoKLQljYXNlIEFMUEhBX1JfU1JFTDE2OgotCWNhc2UgQUxQSEFfUl9TUkVMMzI6Ci0JY2FzZSBBTFBIQV9SX1NSRUw2NDoKLQkgIGlmIChyX2V4dGVybikKLQkgICAgYWRkZW5kICs9IC0gKHJfdmFkZHIgKyA0KTsKLQkgIHJlbG9jYXRlcCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9HUFJFTDMyOgotCSAgLyogVGhpcyByZWxvY2F0aW9uIGlzIHVzZWQgaW4gYSBzd2l0Y2ggdGFibGUuICBJdCBpcyBhIDMyCi0JICAgICBiaXQgb2Zmc2V0IGZyb20gdGhlIGN1cnJlbnQgR1AgdmFsdWUuICBXZSBtdXN0IGFkanVzdCBpdAotCSAgICAgYnkgdGhlIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBHUCB2YWx1ZSBhbmQgdGhlCi0JICAgICBjdXJyZW50IEdQIHZhbHVlLiAgKi8KLQkgIHJlbG9jYXRlcCA9IHRydWU7Ci0JICBhZGRlbmQgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5ncCAtIGdwOwotCSAgZ3BfdXNlZHAgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfTElURVJBTDoKLQkgIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBsaXRlcmFsIHZhbHVlLCBnZW5lcmFsbHkKLQkgICAgIChhbHdheXM/KSBpbiB0aGUgLmxpdGEgc2VjdGlvbi4gIFRoaXMgaXMgYSAxNiBiaXQgR1AKLQkgICAgIHJlbGF0aXZlIHJlbG9jYXRpb24uICBTb21ldGltZXMgdGhlIHN1YnNlcXVlbnQgcmVsb2MgaXMgYQotCSAgICAgTElUVVNFIHJlbG9jLCB3aGljaCBpbmRpY2F0ZXMgaG93IHRoaXMgcmVsb2MgaXMgdXNlZC4KLQkgICAgIFRoaXMgc29tZXRpbWVzIHBlcm1pdHMgcmV3cml0aW5nIHRoZSB0d28gaW5zdHJ1Y3Rpb25zCi0JICAgICByZWZlcnJlZCB0byBieSB0aGUgTElURVJBTCBhbmQgdGhlIExJVFVTRSBpbnRvIGRpZmZlcmVudAotCSAgICAgaW5zdHJ1Y3Rpb25zIHdoaWNoIGRvIG5vdCByZWZlciB0byAubGl0YS4gIFRoaXMgY2FuIHNhdmUKLQkgICAgIGEgbWVtb3J5IHJlZmVyZW5jZSwgYW5kIHBlcm1pdHMgcmVtb3ZpbmcgYSB2YWx1ZSBmcm9tCi0JICAgICAubGl0YSB0aHVzIHNhdmluZyBHUCByZWxhdGl2ZSBzcGFjZS4KLQotCSAgICAgV2UgZG8gbm90IHRoZXNlIG9wdGltaXphdGlvbnMuICBUbyBkbyB0aGVtIHdlIHdvdWxkIG5lZWQKLQkgICAgIHRvIGFycmFuZ2UgdG8gbGluayB0aGUgLmxpdGEgc2VjdGlvbiBmaXJzdCwgc28gdGhhdCBieQotCSAgICAgdGhlIHRpbWUgd2UgZ290IGhlcmUgd2Ugd291bGQga25vdyB0aGUgZmluYWwgdmFsdWVzIHRvCi0JICAgICB1c2UuICBUaGlzIHdvdWxkIG5vdCBiZSBwYXJ0aWN1bGFybHkgZGlmZmljdWx0LCBidXQgaXQgaXMKLQkgICAgIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuICAqLwotCi0JICAvKiBJIGJlbGlldmUgdGhhdCB0aGUgTElURVJBTCByZWxvYyB3aWxsIG9ubHkgYXBwbHkgdG8gYSBsZHEKLQkgICAgIG9yIGxkbCBpbnN0cnVjdGlvbiwgc28gY2hlY2sgbXkgYXNzdW1wdGlvbi4gICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQotCSAgICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJICAgICAgIGNvbnRlbnRzICsgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgIEJGRF9BU1NFUlQgKCgoaW5zbiA+PiAyNikgJiAweDNmKSA9PSAweDI5Ci0JCQl8fCAoKGluc24gPj4gMjYpICYgMHgzZikgPT0gMHgyOCk7Ci0JICB9Ci0KLQkgIHJlbG9jYXRlcCA9IHRydWU7Ci0JICBhZGRlbmQgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5ncCAtIGdwOwotCSAgZ3BfdXNlZHAgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfTElUVVNFOgotCSAgLyogU2VlIEFMUEhBX1JfTElURVJBTCBhYm92ZSBmb3IgdGhlIHVzZXMgb2YgdGhpcyByZWxvYy4gIEl0Ci0JICAgICBkb2VzIG5vdCBjYXVzZSBhbnl0aGluZyB0byBoYXBwZW4sIGl0c2VsZi4gICovCi0JICBicmVhazsKLQkgICAgCi0JY2FzZSBBTFBIQV9SX0dQRElTUDoKLQkgIC8qIFRoaXMgbWFya3MgdGhlIGxkYWggb2YgYW4gbGRhaC9sZGEgcGFpciB3aGljaCBsb2FkcyB0aGUKLQkgICAgIGdwIHJlZ2lzdGVyIHdpdGggdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIGdwIHZhbHVlIGFuZCB0aGUKLQkgICAgIGN1cnJlbnQgbG9jYXRpb24uICBUaGUgc2Vjb25kIG9mIHRoZSBwYWlyIGlzIHJfc3ltbmR4Ci0JICAgICBieXRlcyBhaGVhZC4gIEl0IHVzZWQgdG8gYmUgbWFya2VkIHdpdGggYW4gQUxQSEFfUl9JR05PUkUKLQkgICAgIHJlbG9jLCBidXQgT1NGLzEgMy4yIG5vIGxvbmdlciBkb2VzIHRoYXQuICAqLwotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIGluc24xLCBpbnNuMjsKLQotCSAgICAvKiBHZXQgdGhlIHR3byBpbnN0cnVjdGlvbnMuICAqLwotCSAgICBpbnNuMSA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQljb250ZW50cyArIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCSAgICBpbnNuMiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkoY29udGVudHMKLQkJCQkgKyByX3ZhZGRyCi0JCQkJIC0gaW5wdXRfc2VjdGlvbi0+dm1hCi0JCQkJICsgcl9zeW1uZHgpKTsKLQotCSAgICBCRkRfQVNTRVJUICgoKGluc24xID4+IDI2KSAmIDB4M2YpID09IDB4MDkpOyAvKiBsZGFoICovCi0JICAgIEJGRF9BU1NFUlQgKCgoaW5zbjIgPj4gMjYpICYgMHgzZikgPT0gMHgwOCk7IC8qIGxkYSAqLwotCi0JICAgIC8qIEdldCB0aGUgZXhpc3RpbmcgYWRkZW5kLiAgV2UgbXVzdCBhY2NvdW50IGZvciB0aGUgc2lnbgotCSAgICAgICBleHRlbnNpb24gZG9uZSBieSBsZGEgYW5kIGxkYWguICAqLwotCSAgICBhZGRlbmQgPSAoKGluc24xICYgMHhmZmZmKSA8PCAxNikgKyAoaW5zbjIgJiAweGZmZmYpOwotCSAgICBpZiAoaW5zbjEgJiAweDgwMDApCi0JICAgICAgewotCQkvKiBUaGlzIGlzIGFkZGVuZCAtPSAweDEwMDAwMDAwMCB3aXRob3V0IGNhdXNpbmcgYW4KLQkJICAgaW50ZWdlciBvdmVyZmxvdyBvbiBhIDMyIGJpdCBob3N0LiAgKi8KLQkJYWRkZW5kIC09IDB4ODAwMDAwMDA7Ci0JCWFkZGVuZCAtPSAweDgwMDAwMDAwOwotCSAgICAgIH0KLQkgICAgaWYgKGluc24yICYgMHg4MDAwKQotCSAgICAgIGFkZGVuZCAtPSAweDEwMDAwOwotCi0JICAgIC8qIFRoZSBleGlzdGluZyBhZGRlbmQgaW5jbHVkZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKLQkgICAgICAgZ3Agb2YgdGhlIGlucHV0IEJGRCBhbmQgdGhlIGFkZHJlc3MgaW4gdGhlIGlucHV0IEJGRC4KLQkgICAgICAgV2Ugd2FudCB0byBjaGFuZ2UgdGhpcyB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQotCSAgICAgICBmaW5hbCBHUCBhbmQgdGhlIGZpbmFsIGFkZHJlc3MuICAqLwotCSAgICBhZGRlbmQgKz0gKGdwCi0JCSAgICAgICAtIGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwCi0JCSAgICAgICArIGlucHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgLSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpKTsKLQotCSAgICAvKiBDaGFuZ2UgdGhlIGluc3RydWN0aW9ucywgYWNjb3VudGluZyBmb3IgdGhlIHNpZ24KLQkgICAgICAgZXh0ZW5zaW9uLCBhbmQgd3JpdGUgdGhlbSBvdXQuICAqLwotCSAgICBpZiAoYWRkZW5kICYgMHg4MDAwKQotCSAgICAgIGFkZGVuZCArPSAweDEwMDAwOwotCSAgICBpbnNuMSA9IChpbnNuMSAmIDB4ZmZmZjAwMDApIHwgKChhZGRlbmQgPj4gMTYpICYgMHhmZmZmKTsKLQkgICAgaW5zbjIgPSAoaW5zbjIgJiAweGZmZmYwMDAwKSB8IChhZGRlbmQgJiAweGZmZmYpOwotCi0JICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24xLAotCQkJY29udGVudHMgKyByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAoYmZkX3ZtYSkgaW5zbjIsCi0JCQljb250ZW50cyArIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEgKyByX3N5bW5keCk7Ci0KLQkgICAgZ3BfdXNlZHAgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JICAKLQljYXNlIEFMUEhBX1JfT1BfUFVTSDoKLQljYXNlIEFMUEhBX1JfT1BfUFNVQjoKLQljYXNlIEFMUEhBX1JfT1BfUFJTSElGVDoKLQkgIC8qIE1hbmlwdWxhdGUgdmFsdWVzIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgVGhlCi0JICAgICByX3ZhZGRyIGZpZWxkIGlzIG5vdCBhbiBhZGRyZXNzIGluIGlucHV0X3NlY3Rpb24sIGl0IGlzCi0JICAgICB0aGUgY3VycmVudCB2YWx1ZSAoaW5jbHVkaW5nIGFueSBhZGRlbmQpIG9mIHRoZSBvYmplY3QKLQkgICAgIGJlaW5nIHVzZWQuICAqLwotCSAgaWYgKCEgcl9leHRlcm4pCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQotCSAgICAgIHMgPSBzeW1uZHhfdG9fc2VjdGlvbltyX3N5bW5keF07Ci0JICAgICAgaWYgKHMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JCWFib3J0ICgpOwotCSAgICAgIGFkZGVuZCA9IHMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0IC0gcy0+dm1hOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHhdOwotCSAgICAgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCWFib3J0ICgpOwotCi0JICAgICAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCQl7Ci0JCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJICAgIGFkZGVuZCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogTm90ZSB0aGF0IHdlIHBhc3MgdGhlIGFkZHJlc3MgYXMgMCwgc2luY2Ugd2UKLQkJCSBkbyBub3QgaGF2ZSBhIG1lYW5pbmdmdWwgbnVtYmVyIGZvciB0aGUKLQkJCSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24gdGhhdCBpcyBiZWluZwotCQkJIHJlbG9jYXRlZC4gICovCi0JCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIChiZmRfdm1hKSAwKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGFkZGVuZCA9IDA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCSAgICAgICYmIGgtPmluZHggPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIG5vdCBiZWluZyB3cml0dGVuIG91dC4gIFBhc3MKLQkJCSB0aGUgYWRkcmVzcyBhcyAwLCBhcyB3aXRoIHVuZGVmaW5lZF9zeW1ib2wsCi0JCQkgYWJvdmUuICAqLwotCQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLCAoYmZkX3ZtYSkgMCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCi0JCSAgYWRkZW5kID0gYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyAob3V0cHV0X2JmZCwgaW5mbywKLQkJCQkJCQkgaW5wdXRfYmZkLAotCQkJCQkJCSBleHRfcmVsLCBoKTsKLQkJfQotCSAgICB9Ci0KLQkgIGFkZGVuZCArPSByX3ZhZGRyOwotCi0JICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgLyogQWRqdXN0IHJfdmFkZHIgYnkgdGhlIGFkZGVuZC4gICovCi0JICAgICAgYmZkX2hfcHV0XzY0IChpbnB1dF9iZmQsIGFkZGVuZCwKLQkJCSAgICAoYmZkX2J5dGUgKikgZXh0X3JlbC0+cl92YWRkcik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN3aXRjaCAocl90eXBlKQotCQl7Ci0JCWNhc2UgQUxQSEFfUl9PUF9QVVNIOgotCQkgIGlmICh0b3MgPj0gUkVMT0NfU1RBQ0tTSVpFKQotCQkgICAgYWJvcnQgKCk7Ci0JCSAgc3RhY2tbdG9zKytdID0gYWRkZW5kOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgQUxQSEFfUl9PUF9QU1VCOgotCQkgIGlmICh0b3MgPT0gMCkKLQkJICAgIGFib3J0ICgpOwotCQkgIHN0YWNrW3RvcyAtIDFdIC09IGFkZGVuZDsKLQkJICBicmVhazsKLQotCQljYXNlIEFMUEhBX1JfT1BfUFJTSElGVDoKLQkJICBpZiAodG9zID09IDApCi0JCSAgICBhYm9ydCAoKTsKLQkJICBzdGFja1t0b3MgLSAxXSA+Pj0gYWRkZW5kOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgYWRqdXN0X2FkZHJwID0gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9PUF9TVE9SRToKLQkgIC8qIFN0b3JlIGEgdmFsdWUgZnJvbSB0aGUgcmVsb2Mgc3RhY2sgaW50byBhIGJpdGZpZWxkLiAgSWYKLQkgICAgIHdlIGFyZSBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGFsbCB3ZSBkbyBpcwotCSAgICAgYWRqdXN0IHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvYy4gICovCi0JICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG1hc2s7Ci0JICAgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgICBpZiAodG9zID09IDApCi0JCWFib3J0ICgpOwotCi0JICAgICAgLyogR2V0IHRoZSByZWxvY2F0aW9uIG1hc2suICBUaGUgc2VwYXJhdGUgc3RlcHMgYW5kIHRoZQotCQkgY2FzdHMgdG8gYmZkX3ZtYSBhcmUgYXR0ZW1wdHMgdG8gYXZvaWQgYSBidWcgaW4gdGhlCi0JCSBBbHBoYSBPU0YgMS4zIEMgY29tcGlsZXIuICBTZWUgcmVsb2MuYyBmb3IgbW9yZQotCQkgZGV0YWlscy4gICovCi0JICAgICAgbWFzayA9IDE7Ci0JICAgICAgbWFzayA8PD0gKGJmZF92bWEpIHJfc2l6ZTsKLQkgICAgICBtYXNrIC09IDE7Ci0KLQkgICAgICAvKiBGSVhNRTogSSBkb24ndCBrbm93IHdoYXQga2luZCBvZiBvdmVyZmxvdyBjaGVja2luZywKLQkJIGlmIGFueSwgc2hvdWxkIGJlIGRvbmUgaGVyZS4gICovCi0JICAgICAgdmFsID0gYmZkX2dldF82NCAoaW5wdXRfYmZkLAotCQkJCWNvbnRlbnRzICsgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgdmFsICY9fiBtYXNrIDw8IChiZmRfdm1hKSByX29mZnNldDsKLQkgICAgICB2YWwgfD0gKHN0YWNrWy0tdG9zXSAmIG1hc2spIDw8IChiZmRfdm1hKSByX29mZnNldDsKLQkgICAgICBiZmRfcHV0XzY0IChpbnB1dF9iZmQsIHZhbCwKLQkJCSAgY29udGVudHMgKyByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfR1BWQUxVRToKLQkgIC8qIEkgcmVhbGx5IGRvbid0IGtub3cgaWYgdGhpcyBkb2VzIHRoZSByaWdodCB0aGluZy4gICovCi0JICBncCA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwICsgcl9zeW1uZHg7Ci0JICBncF91bmRlZmluZWQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHJlbG9jYXRlcCkKLQl7Ci0JICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQkgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotCSAgYXNlY3Rpb24gKnMgPSBOVUxMOwotCSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLQkgIC8qIFBlcmZvcm0gYSByZWxvY2F0aW9uLiAgKi8KLQotCSAgaG93dG8gPSAmYWxwaGFfaG93dG9fdGFibGVbcl90eXBlXTsKLQotCSAgaWYgKHJfZXh0ZXJuKQotCSAgICB7Ci0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHhdOwotCSAgICAgIC8qIElmIGggaXMgTlVMTCwgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGlzIGEgcmVsb2MKLQkJIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sIHdoaWNoIHdlIHRob3VnaHQgd2FzIGp1c3QKLQkJIGEgZGVidWdnaW5nIHN5bWJvbC4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uICAqLwotCSAgICAgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCWFib3J0ICgpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAocl9zeW1uZHggPj0gTlVNX1JFTE9DX1NFQ1RJT05TKQotCQlzID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCXMgPSBzeW1uZHhfdG9fc2VjdGlvbltyX3N5bW5keF07Ci0KLQkgICAgICBpZiAocyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkJYWJvcnQgKCk7Ci0JICAgIH0KLQotCSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGFuZCBtdXN0Ci0JCSBjb252ZXJ0IHRoZSBleGlzdGluZyByZWxvYy4gICovCi0JICAgICAgaWYgKHJfZXh0ZXJuKQotCQl7Ci0JCSAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkgICAgICAmJiBoLT5pbmR4ID09IC0xKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIHN5bWJvbCBpcyBub3QgYmVpbmcgd3JpdHRlbiBvdXQuICAqLwotCQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLCByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICByZWxvY2F0aW9uID0gYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyAob3V0cHV0X2JmZCwKLQkJCQkJCQkgICAgIGluZm8sCi0JCQkJCQkJICAgICBpbnB1dF9iZmQsCi0JCQkJCQkJICAgICBleHRfcmVsLAotCQkJCQkJCSAgICAgaCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIEFkanVzdAotCQkgICAgIHRoZSB2YWx1ZSBieSB0aGUgYW1vdW50IHRoZSBzZWN0aW9uIG1vdmVkLiAgKi8KLQkJICByZWxvY2F0aW9uID0gKHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIHMtPm91dHB1dF9vZmZzZXQKLQkJCQktIHMtPnZtYSk7Ci0JCX0KLQotCSAgICAgIC8qIElmIHRoaXMgaXMgUEMgcmVsYXRpdmUsIHRoZSBleGlzdGluZyBvYmplY3QgZmlsZQotCQkgYXBwZWFycyB0byBhbHJlYWR5IGhhdmUgdGhlIHJlbG9jIHdvcmtlZCBvdXQuICBXZQotCQkgbXVzdCBzdWJ0cmFjdCBvdXQgdGhlIG9sZCB2YWx1ZSBhbmQgYWRkIGluIHRoZSBuZXcKLQkJIG9uZS4gICovCi0JICAgICAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLQkJcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotCSAgICAgIC8qIFB1dCBpbiBhbnkgYWRkZW5kLiAgKi8KLQkgICAgICByZWxvY2F0aW9uICs9IGFkZGVuZDsKLQotCSAgICAgIC8qIEFkanVzdCB0aGUgY29udGVudHMuICAqLwotCSAgICAgIHIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCQkgIChjb250ZW50cwotCQkJCQkgICArIHJfdmFkZHIKLQkJCQkJICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UgYXJlIHByb2R1Y2luZyBhIGZpbmFsIGV4ZWN1dGFibGUuICAqLwotCSAgICAgIGlmIChyX2V4dGVybikKLQkJewotCQkgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sLiAgKi8KLQkJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqaHNlYzsKLQotCQkgICAgICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkgICAgKyBoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICsgaHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc2VjdGlvbi4gICovCi0JCSAgcmVsb2NhdGlvbiA9IChzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBzLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJLSBzLT52bWEpOwotCi0JCSAgLyogQWRqdXN0IGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiBieSByZW1vdmluZyB0aGUKLQkJICAgICByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBzZWN0aW9uLiAgKi8KLQkJICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotCQkgICAgcmVsb2NhdGlvbiArPSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JCX0KLQotCSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLAotCQkJCQkgICAgaW5wdXRfYmZkLAotCQkJCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgIGNvbnRlbnRzLAotCQkJCQkgICAgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLQkJCQkJICAgIHJlbG9jYXRpb24sCi0JCQkJCSAgICBhZGRlbmQpOwotCSAgICB9Ci0KLQkgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQkgICAgewotCSAgICAgIHN3aXRjaCAocikKLQkJewotCQlkZWZhdWx0OgotCQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCQkgIGFib3J0ICgpOwotCQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkJICB7Ci0JCSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgICBpZiAocl9leHRlcm4pCi0JCSAgICAgIG5hbWUgPSBzeW1faGFzaGVzW3Jfc3ltbmR4XS0+cm9vdC5yb290LnN0cmluZzsKLQkJICAgIGVsc2UKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwKLQkJCQkJICAgICAgIHN5bW5keF90b19zZWN0aW9uW3Jfc3ltbmR4XSk7Ci0JCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkJICAgKGluZm8sIG5hbWUsIGFscGhhX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwKLQkJCSAgICAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlICYmIGFkanVzdF9hZGRycCkKLQl7Ci0JICAvKiBDaGFuZ2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotCSAgYmZkX2hfcHV0XzY0IChpbnB1dF9iZmQsCi0JCQkoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJIC0gaW5wdXRfc2VjdGlvbi0+dm1hCi0JCQkgKyByX3ZhZGRyKSwKLQkJCShiZmRfYnl0ZSAqKSBleHRfcmVsLT5yX3ZhZGRyKTsKLQl9Ci0KLSAgICAgIGlmIChncF91c2VkcCAmJiBncF91bmRlZmluZWQpCi0JewotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCSAoaW5mbywgXygiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aGVuIEdQIG5vdCBkZWZpbmVkIiksCi0JCSAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIE9ubHkgZ2l2ZSB0aGUgZXJyb3Igb25jZSBwZXIgbGluay4gICovCi0JICBncCA9IDQ7Ci0JICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotCSAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAodG9zICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBEbyBmaW5hbCBhZGp1c3RtZW50cyB0byB0aGUgZmlsZWhkciBhbmQgdGhlIGFvdXRoZHIuICBUaGlzIHJvdXRpbmUKLSAgIHNldHMgdGhlIGR5bmFtaWMgYml0cyBpbiB0aGUgZmlsZSBoZWFkZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1hbHBoYV9hZGp1c3RfaGVhZGVycyAoYWJmZCwgZmhkciwgYWhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmhkcjsKLSAgICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmFoZHI7Ci17Ci0gIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRFlOQU1JQyB8IEVYRUNfUCkpID09IChEWU5BTUlDIHwgRVhFQ19QKSkKLSAgICBmaGRyLT5mX2ZsYWdzIHw9IEZfQUxQSEFfQ0FMTF9TSEFSRUQ7Ci0gIGVsc2UgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgZmhkci0+Zl9mbGFncyB8PSBGX0FMUEhBX1NIQVJBQkxFOwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEFyY2hpdmUgaGFuZGxpbmcuICBJbiBPU0YvMSAob3IgRGlnaXRhbCBVbml4KSB2My4yLCBEaWdpdGFsCi0gICBpbnRyb2R1Y2VkIGFyY2hpdmUgcGFja2luZywgaW4gd2hpY2ggdGhlIGVsZW1lbnRzIGluIGFuIGFyY2hpdmUgYXJlCi0gICBvcHRpb25hbGx5IGNvbXByZXNzZWQgdXNpbmcgYSBzaW1wbGUgZGljdGlvbmFyeSBzY2hlbWUuICBXZSBrbm93Ci0gICBob3cgdG8gcmVhZCBzdWNoIGFyY2hpdmVzLCBidXQgd2UgZG9uJ3Qgd3JpdGUgdGhlbS4gICovCi0KLSNkZWZpbmUgYWxwaGFfZWNvZmZfc2x1cnBfYXJtYXAgX2JmZF9lY29mZl9zbHVycF9hcm1hcAotI2RlZmluZSBhbHBoYV9lY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9lY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIGFscGhhX2Vjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9lY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBhbHBoYV9lY29mZl90cnVuY2F0ZV9hcm5hbWUgX2JmZF9lY29mZl90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgYWxwaGFfZWNvZmZfd3JpdGVfYXJtYXAgX2JmZF9lY29mZl93cml0ZV9hcm1hcAotI2RlZmluZSBhbHBoYV9lY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgX2JmZF9lY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgYWxwaGFfZWNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBfYmZkX2Vjb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLQotLyogQSBjb21wcmVzc2VkIGZpbGUgdXNlcyB0aGlzIGluc3RlYWQgb2YgQVJGTUFHLiAgKi8KLQotI2RlZmluZSBBUkZaTUFHICJaXDAxMiIKLQotLyogUmVhZCBhbiBhcmNoaXZlIGhlYWRlci4gIFRoaXMgaXMgbGlrZSB0aGUgc3RhbmRhcmQgcm91dGluZSwgYnV0IGl0Ci0gICBhbHNvIGFjY2VwdHMgQVJGWk1BRy4gICovCi0KLXN0YXRpYyBQVFIKLWFscGhhX2Vjb2ZmX3JlYWRfYXJfaGRyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKnJldDsKLSAgc3RydWN0IGFyX2hkciAqaDsKLQotICByZXQgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnIChhYmZkLCBBUkZaTUFHKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGggPSAoc3RydWN0IGFyX2hkciAqKSByZXQtPmFyY2hfaGVhZGVyOwotICBpZiAoc3RybmNtcCAoaC0+YXJfZm1hZywgQVJGWk1BRywgMikgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBhYls4XTsKLQotICAgICAgLyogVGhpcyBpcyBhIGNvbXByZXNzZWQgZmlsZS4gIFdlIG11c3Qgc2V0IHRoZSBzaXplIGNvcnJlY3RseS4KLSAgICAgICAgIFRoZSBzaXplIGlzIHRoZSBlaWdodCBieXRlcyBhZnRlciB0aGUgZHVtbXkgZmlsZSBoZWFkZXIuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBGSUxIU1osIFNFRUtfQ1VSKSAhPSAwCi0JICB8fCBiZmRfcmVhZCAoYWIsIDEsIDgsIGFiZmQpICE9IDgKLQkgIHx8IGJmZF9zZWVrIChhYmZkLCAtIChGSUxIU1ogKyA4KSwgU0VFS19DVVIpICE9IDApCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIHJldC0+cGFyc2VkX3NpemUgPSBiZmRfaF9nZXRfNjQgKGFiZmQsIGFiKTsKLSAgICB9Ci0KLSAgcmV0dXJuIChQVFIpIHJldDsKLX0KLQotLyogR2V0IGFuIGFyY2hpdmUgZWxlbWVudCBhdCBhIHNwZWNpZmllZCBmaWxlIHBvc2l0aW9uLiAgVGhpcyBpcyB3aGVyZQotICAgd2UgdW5jb21wcmVzcyB0aGUgYXJjaGl2ZSBlbGVtZW50IGlmIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBiZmQgKgotYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zIChhcmNoaXZlLCBmaWxlcG9zKQotICAgICBiZmQgKmFyY2hpdmU7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIGJmZCAqbmJmZCA9IE5VTEw7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKnRkYXRhOwotICBzdHJ1Y3QgYXJfaGRyICpoZHI7Ci0gIGJmZF9ieXRlIGFiWzhdOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGJmZF9ieXRlICpidWYsICpwOwotICBzdHJ1Y3QgYmZkX2luX21lbW9yeSAqYmltOwotCi0gIG5iZmQgPSBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXBvcyk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKChuYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IGV4cGFuZGVkIHRoaXMgQkZELiAgKi8KLSAgICAgIHJldHVybiBuYmZkOwotICAgIH0KLQotICB0ZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIG5iZmQtPmFyZWx0X2RhdGE7Ci0gIGhkciA9IChzdHJ1Y3QgYXJfaGRyICopIHRkYXRhLT5hcmNoX2hlYWRlcjsKLSAgaWYgKHN0cm5jbXAgKGhkci0+YXJfZm1hZywgQVJGWk1BRywgMikgIT0gMCkKLSAgICByZXR1cm4gbmJmZDsKLQotICAvKiBXZSBtdXN0IHVuY29tcHJlc3MgdGhpcyBlbGVtZW50LiAgV2UgZG8gdGhpcyBieSBjb3B5aW5nIGl0IGludG8gYQotICAgICBtZW1vcnkgYnVmZmVyLCBhbmQgbWFraW5nIGJmZF9yZWFkIGFuZCBiZmRfc2VlayB1c2UgdGhhdCBidWZmZXIuCi0gICAgIFRoaXMgY2FuIHVzZSBhIGxvdCBvZiBtZW1vcnksIGJ1dCBpdCdzIHNpbXBsZXIgdGhhbiBnZXR0aW5nIGEKLSAgICAgdGVtcG9yYXJ5IGZpbGUsIG1ha2luZyB0aGF0IHdvcmsgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGNhY2hpbmcKLSAgICAgY29kZSwgYW5kIG1ha2luZyBzdXJlIHRoYXQgaXQgaXMgZGVsZXRlZCBhdCBhbGwgYXBwcm9wcmlhdGUKLSAgICAgdGltZXMuICBJdCBjYW4gYmUgY2hhbmdlZCBpZiBpdCBldmVyIGJlY29tZXMgaW1wb3J0YW50LiAgKi8KLQotICAvKiBUaGUgY29tcHJlc3NlZCBmaWxlIHN0YXJ0cyB3aXRoIGEgZHVtbXkgRUNPRkYgZmlsZSBoZWFkZXIuICAqLwotICBpZiAoYmZkX3NlZWsgKG5iZmQsIEZJTEhTWiwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhlIG5leHQgZWlnaHQgYnl0ZXMgYXJlIHRoZSByZWFsIGZpbGUgc2l6ZS4gICovCi0gIGlmIChiZmRfcmVhZCAoYWIsIDEsIDgsIG5iZmQpICE9IDgpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIHNpemUgPSBiZmRfaF9nZXRfNjQgKG5iZmQsIGFiKTsKLQotICBpZiAoc2l6ZSA9PSAwKQotICAgIGJ1ZiA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGxlZnQ7Ci0gICAgICBiZmRfYnl0ZSBkaWN0WzQwOTZdOwotICAgICAgdW5zaWduZWQgaW50IGg7Ci0gICAgICBiZmRfYnl0ZSBiOwotCi0gICAgICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChuYmZkLCBzaXplKTsKLSAgICAgIGlmIChidWYgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHAgPSBidWY7Ci0KLSAgICAgIGxlZnQgPSBzaXplOwotCi0gICAgICAvKiBJIGRvbid0IGtub3cgd2hhdCB0aGUgbmV4dCBlaWdodCBieXRlcyBhcmUgZm9yLiAqLwotICAgICAgaWYgKGJmZF9yZWFkIChhYiwgMSwgOCwgbmJmZCkgIT0gOCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogVGhpcyBpcyB0aGUgdW5jb21wcmVzc2lvbiBhbGdvcml0aG0uICBJdCdzIGEgc2ltcGxlCi0JIGRpY3Rpb25hcnkgYmFzZWQgc2NoZW1lIGluIHdoaWNoIGVhY2ggY2hhcmFjdGVyIGlzIHByZWRpY3RlZAotCSBieSBhIGhhc2ggb2YgdGhlIHByZXZpb3VzIHRocmVlIGNoYXJhY3RlcnMuICBBIGNvbnRyb2wgYnl0ZQotCSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIHByZWRpY3RlZCBvciB3aGV0aGVyIGl0Ci0JIGFwcGVhcnMgaW4gdGhlIGlucHV0IHN0cmVhbTsgZWFjaCBjb250cm9sIGJ5dGUgbWFuYWdlcyB0aGUKLQkgbmV4dCBlaWdodCBieXRlcyBpbiB0aGUgb3V0cHV0IHN0cmVhbS4gICovCi0gICAgICBtZW1zZXQgKGRpY3QsIDAsIHNpemVvZiBkaWN0KTsKLSAgICAgIGggPSAwOwotICAgICAgd2hpbGUgKGJmZF9yZWFkICgmYiwgMSwgMSwgbmJmZCkgPT0gMSkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgZm9yIChpID0gMDsgaSA8IDg7IGkrKywgYiA+Pj0gMSkKLQkgICAgewotCSAgICAgIGJmZF9ieXRlIG47Ci0KLQkgICAgICBpZiAoKGIgJiAxKSA9PSAwKQotCQluID0gZGljdFtoXTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISBiZmRfcmVhZCAoJm4sIDEsIDEsIG5iZmQpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgZGljdFtoXSA9IG47Ci0JCX0KLQotCSAgICAgICpwKysgPSBuOwotCi0JICAgICAgLS1sZWZ0OwotCSAgICAgIGlmIChsZWZ0ID09IDApCi0JCWJyZWFrOwotCi0JICAgICAgaCA8PD0gNDsKLQkgICAgICBoIF49IG47Ci0JICAgICAgaCAmPSBzaXplb2YgZGljdCAtIDE7Ci0JICAgIH0KLQotCSAgaWYgKGxlZnQgPT0gMCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgdGhlIHVuY29tcHJlc3NlZCBmaWxlIGNvbnRlbnRzIGFyZSBpbiBidWYuICAqLwotICBiaW0gPSAoKHN0cnVjdCBiZmRfaW5fbWVtb3J5ICopCi0JIGJmZF9hbGxvYyAobmJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2luX21lbW9yeSkpKTsKLSAgaWYgKGJpbSA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBiaW0tPnNpemUgPSBzaXplOwotICBiaW0tPmJ1ZmZlciA9IGJ1ZjsKLQotICBuYmZkLT5tdGltZV9zZXQgPSB0cnVlOwotICBuYmZkLT5tdGltZSA9IHN0cnRvbCAoaGRyLT5hcl9kYXRlLCAoY2hhciAqKikgTlVMTCwgMTApOwotCi0gIG5iZmQtPmZsYWdzIHw9IEJGRF9JTl9NRU1PUlk7Ci0gIG5iZmQtPmlvc3RyZWFtID0gKFBUUikgYmltOwotICBCRkRfQVNTRVJUICghIG5iZmQtPmNhY2hlYWJsZSk7Ci0KLSAgcmV0dXJuIG5iZmQ7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChuYmZkICE9IE5VTEwpCi0gICAgYmZkX2Nsb3NlIChuYmZkKTsKLSAgcmV0dXJuIE5VTEw7ICAKLX0KLQotLyogT3BlbiB0aGUgbmV4dCBhcmNoaXZlZCBmaWxlLiAgKi8KLQotc3RhdGljIGJmZCAqCi1hbHBoYV9lY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyY2hpdmUsIGxhc3RfZmlsZSkKLSAgICAgYmZkICphcmNoaXZlOwotICAgICBiZmQgKmxhc3RfZmlsZTsKLXsKLSAgZmlsZV9wdHIgZmlsZXN0YXJ0OwotCi0gIGlmIChsYXN0X2ZpbGUgPT0gTlVMTCkKLSAgICBmaWxlc3RhcnQgPSBiZmRfYXJkYXRhIChhcmNoaXZlKS0+Zmlyc3RfZmlsZV9maWxlcG9zOwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGFyZWx0ZGF0YSAqdDsKLSAgICAgIHN0cnVjdCBhcl9oZHIgKmg7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLSAgICAgIC8qIFdlIGNhbid0IHVzZSBhcmVsdF9zaXplIGhlcmUsIGJlY2F1c2UgdGhhdCB1c2VzIHBhcnNlZF9zaXplLAotICAgICAgICAgd2hpY2ggaXMgdGhlIHVuY29tcHJlc3NlZCBzaXplLiAgV2UgbmVlZCB0aGUgY29tcHJlc3NlZCBzaXplLiAgKi8KLSAgICAgIHQgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBsYXN0X2ZpbGUtPmFyZWx0X2RhdGE7Ci0gICAgICBoID0gKHN0cnVjdCBhcl9oZHIgKikgdC0+YXJjaF9oZWFkZXI7Ci0gICAgICBzaXplID0gc3RydG9sIChoLT5hcl9zaXplLCAoY2hhciAqKikgTlVMTCwgMTApOwotCi0gICAgICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeS4uLgotCSBOb3RlIHRoYXQgbGFzdF9maWxlLT5vcmlnaW4gY2FuIGJlIG9kZCBpbiB0aGUgY2FzZSBvZgotCSBCU0QtNC40LXN0eWxlIGVsZW1lbnQgd2l0aCBhIGxvbmcgb2RkIHNpemUuICovCi0gICAgICBmaWxlc3RhcnQgPSBsYXN0X2ZpbGUtPm9yaWdpbiArIHNpemU7Ci0gICAgICBmaWxlc3RhcnQgKz0gZmlsZXN0YXJ0ICUgMjsKLSAgICB9Ci0KLSAgcmV0dXJuIGFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXN0YXJ0KTsKLX0KLQotLyogT3BlbiB0aGUgYXJjaGl2ZSBmaWxlIGdpdmVuIGFuIGluZGV4IGludG8gdGhlIGFybWFwLiAgKi8KLQotc3RhdGljIGJmZCAqCi1hbHBoYV9lY29mZl9nZXRfZWx0X2F0X2luZGV4IChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBzeW1pbmRleCBpbmRleDsKLXsKLSAgY2Fyc3ltICplbnRyeTsKLQotICBlbnRyeSA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzICsgaW5kZXg7Ci0gIHJldHVybiBhbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFiZmQsIGVudHJ5LT5maWxlX29mZnNldCk7Ci19Ci0MCi0vKiBUaGlzIGlzIHRoZSBFQ09GRiBiYWNrZW5kIHN0cnVjdHVyZS4gIFRoZSBiYWNrZW5kIGZpZWxkIG9mIHRoZQotICAgdGFyZ2V0IHZlY3RvciBwb2ludHMgdG8gdGhpcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhIGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSA9Ci17Ci0gIC8qIENPRkYgYmFja2VuZCBzdHJ1Y3R1cmUuICAqLwotICB7Ci0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixpbnQsaW50LGludCxpbnQsUFRSKSkpIGJmZF92b2lkLCAvKiBhdXhfaW4gKi8KLSAgICAodm9pZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogc3ltX2luICovCi0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIGxpbmVub19pbiAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLGludCxpbnQsaW50LGludCxQVFIpKSliZmRfdm9pZCwvKmF1eF9vdXQqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogc3ltX291dCAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogbGluZW5vX291dCAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogcmVsb2Nfb3V0ICovCi0gICAgYWxwaGFfZWNvZmZfc3dhcF9maWxlaGRyX291dCwgYWxwaGFfZWNvZmZfc3dhcF9hb3V0aGRyX291dCwKLSAgICBhbHBoYV9lY29mZl9zd2FwX3Njbmhkcl9vdXQsCi0gICAgRklMSFNaLCBBT1VUU1osIFNDTkhTWiwgMCwgMCwgMCwgMCwgdHJ1ZSwgZmFsc2UsIDQsCi0gICAgYWxwaGFfZWNvZmZfc3dhcF9maWxlaGRyX2luLCBhbHBoYV9lY29mZl9zd2FwX2FvdXRoZHJfaW4sCi0gICAgYWxwaGFfZWNvZmZfc3dhcF9zY25oZHJfaW4sIE5VTEwsCi0gICAgYWxwaGFfZWNvZmZfYmFkX2Zvcm1hdF9ob29rLCBfYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywKLSAgICBhbHBoYV9lY29mZl9ta29iamVjdF9ob29rLCBfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzLAotICAgIF9iZmRfZWNvZmZfc2V0X2FsaWdubWVudF9ob29rLCBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCi0gIH0sCi0gIC8qIFN1cHBvcnRlZCBhcmNoaXRlY3R1cmUuICAqLwotICBiZmRfYXJjaF9hbHBoYSwKLSAgLyogSW5pdGlhbCBwb3J0aW9uIG9mIGFybWFwIHN0cmluZy4gICovCi0gICJfX19fX19fXzY0IiwKLSAgLyogVGhlIHBhZ2UgYm91bmRhcnkgdXNlZCB0byBhbGlnbiBzZWN0aW9ucyBpbiBhIGRlbWFuZC1wYWdlZAotICAgICBleGVjdXRhYmxlIGZpbGUuICBFLmcuLCAweDEwMDAuICAqLwotICAweDIwMDAsCi0gIC8qIFRydWUgaWYgdGhlIC5yZGF0YSBzZWN0aW9uIGlzIHBhcnQgb2YgdGhlIHRleHQgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIEFscGhhLiAgRmFsc2UgaWYgLnJkYXRhIGlzIHBhcnQgb2YgdGhlIGRhdGEgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIE1JUFMuICAqLwotICB0cnVlLAotICAvKiBCaXRzaXplIG9mIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLwotICA2NCwKLSAgLyogUmVsb2MgdG8gdXNlIGZvciBjb25zdHJ1Y3RvciBlbnRyaWVzLiAgKi8KLSAgJmFscGhhX2hvd3RvX3RhYmxlW0FMUEhBX1JfUkVGUVVBRF0sCi0gIHsKLSAgICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgICBtYWdpY1N5bTIsCi0gICAgLyogQWxpZ25tZW50IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEUuZy4sIDQuICAqLwotICAgIDgsCi0gICAgLyogU2l6ZXMgb2YgZXh0ZXJuYWwgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICAgIHNpemVvZiAoc3RydWN0IGhkcl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IGRucl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IHBkcl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IHN5bV9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IG9wdF9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IGZkcl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IHJmZF9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IGV4dF9leHQpLAotICAgIC8qIEZ1bmN0aW9ucyB0byBzd2FwIGluIGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICAgIGVjb2ZmX3N3YXBfaGRyX2luLAotICAgIGVjb2ZmX3N3YXBfZG5yX2luLAotICAgIGVjb2ZmX3N3YXBfcGRyX2luLAotICAgIGVjb2ZmX3N3YXBfc3ltX2luLAotICAgIGVjb2ZmX3N3YXBfb3B0X2luLAotICAgIGVjb2ZmX3N3YXBfZmRyX2luLAotICAgIGVjb2ZmX3N3YXBfcmZkX2luLAotICAgIGVjb2ZmX3N3YXBfZXh0X2luLAotICAgIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4sCi0gICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4sCi0gICAgLyogRnVuY3Rpb25zIHRvIHN3YXAgb3V0IGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICAgIGVjb2ZmX3N3YXBfaGRyX291dCwKLSAgICBlY29mZl9zd2FwX2Rucl9vdXQsCi0gICAgZWNvZmZfc3dhcF9wZHJfb3V0LAotICAgIGVjb2ZmX3N3YXBfc3ltX291dCwKLSAgICBlY29mZl9zd2FwX29wdF9vdXQsCi0gICAgZWNvZmZfc3dhcF9mZHJfb3V0LAotICAgIGVjb2ZmX3N3YXBfcmZkX291dCwKLSAgICBlY29mZl9zd2FwX2V4dF9vdXQsCi0gICAgX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQsCi0gICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0LAotICAgIC8qIEZ1bmN0aW9uIHRvIHJlYWQgaW4gc3ltYm9saWMgZGF0YS4gICovCi0gICAgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvCi0gIH0sCi0gIC8qIEV4dGVybmFsIHJlbG9jIHNpemUuICAqLwotICBSRUxTWiwKLSAgLyogUmVsb2Mgc3dhcHBpbmcgZnVuY3Rpb25zLiAgKi8KLSAgYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19pbiwKLSAgYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19vdXQsCi0gIC8qIEJhY2tlbmQgcmVsb2MgdHdlYWtpbmcuICAqLwotICBhbHBoYV9hZGp1c3RfcmVsb2NfaW4sCi0gIGFscGhhX2FkanVzdF9yZWxvY19vdXQsCi0gIC8qIFJlbG9jYXRlIHNlY3Rpb24gY29udGVudHMgd2hpbGUgbGlua2luZy4gICovCi0gIGFscGhhX3JlbG9jYXRlX3NlY3Rpb24sCi0gIC8qIERvIGZpbmFsIGFkanVzdG1lbnRzIHRvIGZpbGVoZHIgYW5kIGFvdXRoZHIuICAqLwotICBhbHBoYV9hZGp1c3RfaGVhZGVycywKLSAgLyogUmVhZCBhbiBlbGVtZW50IGZyb20gYW4gYXJjaGl2ZSBhdCBhIGdpdmVuIGZpbGUgcG9zaXRpb24uICAqLwotICBhbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MKLX07Ci0KLS8qIExvb2tpbmcgdXAgYSByZWxvYyB0eXBlIGlzIEFscGhhIHNwZWNpZmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLS8qIFNvIGlzIGdldHRpbmcgcmVsb2NhdGVkIHNlY3Rpb24gY29udGVudHMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLQotLyogSGFuZGxpbmcgZmlsZSB3aW5kb3dzIGlzIGdlbmVyaWMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotLyogUmVsYXhpbmcgc2VjdGlvbnMgaXMgZ2VuZXJpYy4gICovCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotCi1jb25zdCBiZmRfdGFyZ2V0IGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyA9Ci17Ci0gICJlY29mZi1saXR0bGVhbHBoYSIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgRFlOQU1JQyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGFscGhhX2Vjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZWNvZmZfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIF9iZmRfZWNvZmZfbWtvYmplY3QsICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoYWxwaGFfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpICZhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1hcG9sbG8uYyBiL2JmZC9jb2ZmLWFwb2xsby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTNlYzg5Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWFwb2xsby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQXBvbGxvIDY4MDAwIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQnkgVHJveSBSb2xsbyAodHJveUBjYm1lLnVuc3cuZWR1LmF1KQotICAgQmFzZWQgb24gbTY4ayBzdGFuZGFyZCBDT0ZGIHZlcnNpb24gV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9hcG9sbG8uaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKLQotI2lmZGVmIE9OTFlfREVDTEFSRV9SRUxPQ1MKLWV4dGVybiByZWxvY19ob3d0b190eXBlIGFwb2xsb2NvZmZfaG93dG9fdGFibGVbXTsKLSNlbHNlCi1yZWxvY19ob3d0b190eXBlIGFwb2xsb2NvZmZfaG93dG9fdGFibGVbXSA9IAotewotICBIT1dUTyhSX1JFTEJZVEUsCSAgICAgICAwLCAgMCwgIAk4LCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiOCIsCXRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTFdPUkQsCSAgICAgICAwLCAgMSwgCTE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIxNiIsCXRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTExPTkcsCSAgICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIzMiIsCXRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUkJZVEUsCSAgICAgICAwLCAgMCwgCTgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDgiLCAgICB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1AxNiIsICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSTE9ORywJICAgICAgIDAsICAyLCAJMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMzIiLCAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTExPTkdfTkVHLAkgICAgICAgMCwgIC0yLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIi0zMiIsCXRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotfTsKLSNlbmRpZiAvKiBub3QgT05MWV9ERUNMQVJFX1JFTE9DUyAqLwotCi0jaWZuZGVmIEJBRE1BRwotI2RlZmluZSBCQURNQUcoeCkgTTY4S0JBRE1BRyh4KQotI2VuZGlmCi0jZGVmaW5lIEFQT0xMT19NNjggMQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotI2lmZGVmIE9OTFlfREVDTEFSRV9SRUxPQ1MKLWV4dGVybiB2b2lkIGFwb2xsb19ydHlwZTJob3d0byBQQVJBTVMgKChhcmVsZW50ICppbnRlcm5hbCwgaW50IHJlbG9jZW50cnkpKTsKLWV4dGVybiBpbnQgYXBvbGxvX2hvd3RvMnJ0eXBlIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKikpOwotI2Vsc2UKLXZvaWQKLWFwb2xsb19ydHlwZTJob3d0byhpbnRlcm5hbCwgcmVsb2NlbnRyeSkKLSAgICAgYXJlbGVudCAqaW50ZXJuYWw7Ci0gICAgIGludCByZWxvY2VudHJ5OwotewotICBzd2l0Y2ggKHJlbG9jZW50cnkpIAotICB7Ci0gICBjYXNlIFJfUkVMQllURToJaW50ZXJuYWwtPmhvd3RvID0gYXBvbGxvY29mZl9ob3d0b190YWJsZSArIDA7IGJyZWFrOwotICAgY2FzZSBSX1JFTFdPUkQ6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyAxOyBicmVhazsKLSAgIGNhc2UgUl9SRUxMT05HOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgMjsgYnJlYWs7Ci0gICBjYXNlIFJfUENSQllURToJaW50ZXJuYWwtPmhvd3RvID0gYXBvbGxvY29mZl9ob3d0b190YWJsZSArIDM7IGJyZWFrOwotICAgY2FzZSBSX1BDUldPUkQ6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyA0OyBicmVhazsKLSAgIGNhc2UgUl9QQ1JMT05HOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgNTsgYnJlYWs7Ci0gICBjYXNlIFJfUkVMTE9OR19ORUc6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyA2OyBicmVhazsKLSAgfQotfQotCi1pbnQgCi1hcG9sbG9faG93dG8ycnR5cGUgKGludGVybmFsKQotICAgICByZWxvY19ob3d0b190eXBlICppbnRlcm5hbDsKLXsKLSAgaWYgKGludGVybmFsLT5wY19yZWxhdGl2ZSkgCi0gIHsKLSAgICBzd2l0Y2ggKGludGVybmFsLT5iaXRzaXplKSAKLSAgICB7Ci0gICAgIGNhc2UgMzI6IHJldHVybiBSX1BDUkxPTkc7Ci0gICAgIGNhc2UgMTY6IHJldHVybiBSX1BDUldPUkQ7Ci0gICAgIGNhc2UgODogcmV0dXJuIFJfUENSQllURTsKLSAgICB9Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgc3dpdGNoIChpbnRlcm5hbC0+Yml0c2l6ZSkKLSAgICAgewotICAgICAgY2FzZSAzMjogcmV0dXJuIFJfUkVMTE9ORzsKLSAgICAgIGNhc2UgMTY6IHJldHVybiBSX1JFTFdPUkQ7Ci0gICAgICBjYXNlIDg6IHJldHVybiBSX1JFTEJZVEU7Ci0gICAgIH0KLSAgfQotICByZXR1cm4gUl9SRUxMT05HOyAgICAKLX0KLSNlbmRpZiAvKiBub3QgT05MWV9ERUNMQVJFX1JFTE9DUyAqLwotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGludGVybmFsLCByZWxvY2VudHJ5KSBcCi0gIGFwb2xsb19ydHlwZTJob3d0byhpbnRlcm5hbCwgKHJlbG9jZW50cnkpLT5yX3R5cGUpCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKGV4dGVybmFsLCBpbnRlcm5hbCkgXAotICBleHRlcm5hbC5yX3R5cGUgPSBhcG9sbG9faG93dG8ycnR5cGUoaW50ZXJuYWwpOwotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotY29uc3QgYmZkX3RhcmdldCAKLSNpZmRlZiBUQVJHRVRfU1lNCi0gIFRBUkdFVF9TWU0gPQotI2Vsc2UKLSAgYXBvbGxvY29mZl92ZWMgPQotI2VuZGlmCi17Ci0jaWZkZWYgVEFSR0VUX05BTUUKLSAgVEFSR0VUX05BTUUsCi0jZWxzZQotICAiYXBvbGxvLW02OGsiLAkJCS8qIG5hbWUgKi8KLSNlbmRpZgotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSNpZmRlZiBOQU1FU19IQVZFX1VOREVSU0NPUkUKLSAgJ18nLAotI2Vsc2UKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0jZW5kaWYKLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBiZmRfZmFsc2V9LAotIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRQotIH07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1hcm0uYyBiL2JmZC9jb2ZmLWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmJhYTg1Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU1NyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFSTSBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImNvZmYvYXJtLmgiCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogTWFjcm9zIGZvciBtYW5pcHVsYXRpb24gdGhlIGJpdHMgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIHRoZSBjb2ZmIGRhdGEKLSAgIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIEFQQ1NfMjZfRkxBRyggICAgICAgYWJmZCApCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIEZfQVBDU18yNikKLSNkZWZpbmUgQVBDU19GTE9BVF9GTEFHKCAgICBhYmZkICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9BUENTX0ZMT0FUKQotI2RlZmluZSBQSUNfRkxBRyggICAgICAgICAgIGFiZmQgKQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiBGX1BJQykKLSNkZWZpbmUgQVBDU19TRVQoICAgICAgICAgICBhYmZkICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9BUENTX1NFVCkKLSNkZWZpbmUgU0VUX0FQQ1NfRkxBR1MoICAgICBhYmZkLCBmbGdzKQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgPSBcCi0JCQkJCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIH4gKEZfQVBDU18yNiB8IEZfQVBDU19GTE9BVCB8IEZfUElDKSkgXAotCQkJCQkgfCAoZmxncyB8IEZfQVBDU19TRVQpKQotI2RlZmluZSBJTlRFUldPUktfRkxBRyggICAgIGFiZmQgKSAJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9JTlRFUldPUkspCi0jZGVmaW5lIElOVEVSV09SS19TRVQoICAgICAgYWJmZCApIAkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiBGX0lOVEVSV09SS19TRVQpCi0jZGVmaW5lIFNFVF9JTlRFUldPUktfRkxBRyggYWJmZCwgZmxnICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzID0gXAotCQkJCQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiB+IEZfSU5URVJXT1JLKSBcCi0JCQkJCSB8IChmbGcgfCBGX0lOVEVSV09SS19TRVQpKQotICAgICAKLXR5cGVkZWYgZW51bSB7YnVua25vd24sIGI5LCBiMTIsIGIyM30gdGh1bWJfcGNyZWxfYnJhbmNodHlwZTsKLS8qIHNvbWUgdHlwZWRlZnMgZm9yIGhvbGRpbmcgaW5zdHJ1Y3Rpb25zICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IGluc24zMjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IGluc24xNjsKLQotCi0gICAgIC8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBzdHVwaWQgY29tcGlsZXJzLiAgKi8KLXN0YXRpYyBib29sZWFuIGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotICAgICAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBhb3V0YXJtX2ZpeF9wY3JlbF8yNl9kb25lCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBhb3V0YXJtX2ZpeF9wY3JlbF8yNgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF8yMwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF8xMgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF85Ci0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb2ZmX2FybV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYXJtX2FkanVzdF9zeW1uZHgKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLAotCSAgIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAlib29sZWFuICopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogY29mZl9hcm1fcnR5cGVfdG9faG93dG8gCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF9jb21tb24KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqLAotCSAgIHRodW1iX3BjcmVsX2JyYW5jaHR5cGUpKTsKLXN0YXRpYyBDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICogY29mZl9hcm1fcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICogY29mZl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGluc24zMiBpbnNlcnRfdGh1bWJfYnJhbmNoCi0gIFBBUkFNUyAoKGluc24zMiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogZmluZF90aHVtYl9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIENPTlNUIGNoYXIgKiwgYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiBmaW5kX2FybV9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIENPTlNUIGNoYXIgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIHJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIHZvaWQgcmVjb3JkX3RodW1iX3RvX2FybV9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1faXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9saW5rX291dHB1dF9oYXNfYmVndW4KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIFRoZSBsaW5rZXIgc2NyaXB0IGtub3dzIHRoZSBzZWN0aW9uIG5hbWVzIGZvciBwbGFjZW1lbnQuCi0gICBUaGUgZW50cnlfbmFtZXMgYXJlIHVzZWQgdG8gZG8gc2ltcGxlIG5hbWUgbWFuZ2xpbmcgb24gdGhlIHN0dWJzLgotICAgR2l2ZW4gYSBmdW5jdGlvbiBuYW1lLCBhbmQgaXRzIHR5cGUsIHRoZSBzdHViIGNhbiBiZSBmb3VuZC4gVGhlCi0gICBuYW1lIGNhbiBiZSBjaGFuZ2VkLiBUaGUgb25seSByZXF1aXJlbWVudCBpcyB0aGUgJXMgYmUgcHJlc2VudC4KLSAgICovCi0gICAKLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FICIuZ2x1ZV83dCIKLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSAgICJfXyVzX2Zyb21fdGh1bWIiCi0KLSNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FICIuZ2x1ZV83IgotI2RlZmluZSBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FICAgIl9fJXNfZnJvbV9hcm0iCi0KLS8qIFVzZWQgYnkgdGhlIGFzc2VtYmxlci4gKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfYXJtX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHN5bXZhbHVlIGRpZmY7Ci0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGRpZmYgPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIGRpZmYpICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICAgIGlmIChkaWZmICE9IDApCi0gICAgICB7Ci0JcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0JdW5zaWduZWQgY2hhciAqYWRkciA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotCXN3aXRjaCAoaG93dG8tPnNpemUpCi0JICB7Ci0JICBjYXNlIDA6Ci0JICAgIHsKLQkgICAgICBjaGFyIHggPSBiZmRfZ2V0XzggKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMToKLQkgICAgewotCSAgICAgIHNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAyOgotCSAgICB7Ci0JICAgICAgbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotICAgICAgfQotCi0gIC8qIE5vdyBsZXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmaW5pc2ggZXZlcnl0aGluZyB1cC4gICovCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLS8qIElmIFVTRVJfTEFCRUxfUFJFRklYIGlzIGRlZmluZWQgYXMgIl8iIChzZWUgY29mZl9hcm1faXNfbG9jYWxfbGFiZWxfbmFtZSgpCi0gICBpbiB0aGlzIGZpbGUpLCB0aGVuIFRBUkdFVF9VTkRFUlNDT1JFIHNob3VsZCBiZSBkZWZpbmVkLCBvdGhlcndpc2UgaXQKLSAgIHNob3VsZCBub3QuICAqLwotI2lmbmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAnXycKLSNlbmRpZgotCi0jaWZuZGVmIFBDUkVMT0ZGU0VUCi0jZGVmaW5lIFBDUkVMT0ZGU0VUIHRydWUKLSNlbmRpZgotCi0vKiBUaGVzZSBtb3N0IGNlcnRhaW5seSBiZWxvbmcgc29tZXdoZXJlIGVsc2UuIEp1c3QgaGFkIHRvIGdldCByaWQgb2YKLSAgIHRoZSBtYW5pZmVzdCBjb25zdGFudHMgaW4gdGhlIGNvZGUuICovCi0KLSNkZWZpbmUgQVJNXzggICAgICAgIDAKLSNkZWZpbmUgQVJNXzE2ICAgICAgIDEKLSNkZWZpbmUgQVJNXzMyICAgICAgIDIKLSNkZWZpbmUgQVJNXzI2ICAgICAgIDMKLSNkZWZpbmUgQVJNX0RJU1A4ICAgIDQKLSNkZWZpbmUgQVJNX0RJU1AxNiAgIDUKLSNkZWZpbmUgQVJNX0RJU1AzMiAgIDYKLSNkZWZpbmUgQVJNXzI2RCAgICAgIDcKLS8qIDggaXMgdW51c2VkICovCi0jZGVmaW5lIEFSTV9ORUcxNiAgICA5Ci0jZGVmaW5lIEFSTV9ORUczMiAgIDEwCi0jZGVmaW5lIEFSTV9SVkEzMiAgIDExCi0jZGVmaW5lIEFSTV9USFVNQjkgIDEyCi0jZGVmaW5lIEFSTV9USFVNQjEyIDEzCi0jZGVmaW5lIEFSTV9USFVNQjIzIDE0Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvW10gPSAKLXsKLSAgLyogdHlwZSAgICAgICAgICAgICAgcnMgc2l6ZSBic3ogIHBjcmVsIGJpdHBvcyBvdnJmICAgICAgICAgICAgICAgICAgICAgc2YgbmFtZSAgICAgcGFydF9pbnBsIHJlYWRtYXNrICBzZXRtYXNrICAgIHBjZG9uZSAqLwotICBIT1dUTyhBUk1fOCwJCQkvKiB0eXBlICovCi0JMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JMCwJCQkvKiBzaXplICovCi0JOCwJCQkvKiBiaXRzaXplICovCi0JZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkwLAkJCS8qIGJpdHBvcyAqLwotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCWNvZmZfYXJtX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSJBUk1fOCIsCQkvKiBuYW1lICovCi0gICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JUENSRUxPRkZTRVQJCS8qIHBjcmVsX29mZnNldCAqLyksCi0gIEhPV1RPKEFSTV8xNiwgIAotCTAsIAotCTEsIAotCTE2LCAKLQlmYWxzZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fMTYiLCAKLQl0cnVlLAotCTB4MDAwMGZmZmYsCi0JMHgwMDAwZmZmZiwgCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyhBUk1fMzIsIAotCTAsCi0JMiwgCi0JMzIsCi0JZmFsc2UsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNXzMyIiwKLSAgICAgICAgdHJ1ZSwKLQkweGZmZmZmZmZmLAotCTB4ZmZmZmZmZmYsCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyhBUk1fMjYsCi0JMiwKLQkyLAotCTI0LAotCXRydWUsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JYW91dGFybV9maXhfcGNyZWxfMjYgLAotCSJBUk1fMjYiLAotCWZhbHNlLAotCTB4MDBmZmZmZmYsCi0JMHgwMGZmZmZmZiwgCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyhBUk1fRElTUDgsICAgICAgICAKLQkwLAotCTAsCi0JOCwgCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9ESVNQOCIsICAKLQl0cnVlLAotCTB4MDAwMDAwZmYsCi0JMHgwMDAwMDBmZiwKLQl0cnVlKSwKLSAgSE9XVE8oIEFSTV9ESVNQMTYsIAotCTAsCi0JMSwKLQkxNiwKLQl0cnVlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNX0RJU1AxNiIsCi0JdHJ1ZSwKLQkweDAwMDBmZmZmLAotCTB4MDAwMGZmZmYsCi0JdHJ1ZSksCi0gIEhPV1RPKCBBUk1fRElTUDMyLAotCTAsCi0JMiwKLQkzMiwKLQl0cnVlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAKLSAJY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9ESVNQMzIiLAotCXRydWUsCi0JMHhmZmZmZmZmZiwKLQkweGZmZmZmZmZmLAotCXRydWUpLAotICBIT1dUTyggQVJNXzI2RCwgIAotCTIsIAotCTIsCi0JMjQsCi0JZmFsc2UsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19kb250LAotCWFvdXRhcm1fZml4X3BjcmVsXzI2X2RvbmUsIAotCSJBUk1fMjZEIiwKLQl0cnVlLAotCTB4MDBmZmZmZmYsCi0JMHgwLAotCWZhbHNlKSwKLSAgLyogOCBpcyB1bnVzZWQgKi8KLSAgey0xfSwKLSAgSE9XVE8oIEFSTV9ORUcxNiwKLQkwLAotCS0xLAotCTE2LAotCWZhbHNlLAotCTAsIAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fTkVHMTYiLAotICAgICAgICB0cnVlLCAKLQkweDAwMDBmZmZmLAotCTB4MDAwMGZmZmYsIAotCWZhbHNlKSwKLSAgSE9XVE8oIEFSTV9ORUczMiwgCi0JMCwgCi0JLTIsCi0JMzIsCi0JZmFsc2UsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNX05FRzMyIiwKLSAgICAgICAgdHJ1ZSwKLQkweGZmZmZmZmZmLAotCTB4ZmZmZmZmZmYsCi0JZmFsc2UpLAotICBIT1dUTyggQVJNX1JWQTMyLCAKLQkwLAotCTIsIAotCTMyLAotCWZhbHNlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9SVkEzMiIsCi0gICAgICAgIHRydWUsCi0JMHhmZmZmZmZmZiwKLQkweGZmZmZmZmZmLAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8oIEFSTV9USFVNQjksCi0JMSwKLQkxLAotCTgsCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQljb2ZmX3RodW1iX3BjcmVsXzkgLAotCSJBUk1fVEhVTUI5IiwKLQlmYWxzZSwKLQkweDAwMDAwMGZmLAotCTB4MDAwMDAwZmYsIAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8oIEFSTV9USFVNQjEyLAotCTEsCi0JMSwKLQkxMSwKLQl0cnVlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCWNvZmZfdGh1bWJfcGNyZWxfMTIgLAotCSJBUk1fVEhVTUIxMiIsCi0JZmFsc2UsCi0JMHgwMDAwMDdmZiwKLQkweDAwMDAwN2ZmLCAKLQlQQ1JFTE9GRlNFVCksCi0gIEhPV1RPKCBBUk1fVEhVTUIyMywKLQkxLAotCTIsCi0JMjIsCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQljb2ZmX3RodW1iX3BjcmVsXzIzICwKLQkiQVJNX1RIVU1CMjMiLAotCWZhbHNlLAotCTB4MDdmZjA3ZmYsCi0JMHgwN2ZmMDdmZiwgCi0JUENSRUxPRkZTRVQpLAotfTsKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotLyogUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0aW9uIHNob3VsZAotICAgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jIHNlY3Rpb24uICovCi0KLXN0YXRpYyBib29sZWFuCi1pbl9yZWxvY19wIChhYmZkLCBob3d0bykKLSAgICAgYmZkICogYWJmZDsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqIGhvd3RvOwotewotICByZXR1cm4gIWhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+dHlwZSAhPSBBUk1fUlZBMzI7Ci19ICAgICAKLSNlbmRpZgotCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIFwKLQkgICAgKGNhY2hlX3B0ciktPmhvd3RvID0gYW91dGFybV9zdGRfcmVsb2NfaG93dG8gKyAoZHN0KS0+cl90eXBlOwotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gY29mZl9hcm1fcnR5cGVfdG9faG93dG8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9hcm1fcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICBiZmRfdm1hICphZGRlbmRwOwotewotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotICBob3d0byA9IGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvICsgcmVsLT5yX3R5cGU7Ci0KLSAgaWYgKHJlbC0+cl90eXBlID09IEFSTV9SVkEzMikKLSAgICB7Ci0gICAgICAqYWRkZW5kcCAtPSBwZV9kYXRhKHNlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGhvd3RvOwotCi19Ci0vKiBVc2VkIGJ5IHRoZSBhc3NlbWJsZXIuICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWFvdXRhcm1fZml4X3BjcmVsXzI2X2RvbmUgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiBUaGlzIGlzIGRlYWQgc2ltcGxlIGF0IHByZXNlbnQuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBVc2VkIGJ5IHRoZSBhc3NlbWJsZXIuICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWFvdXRhcm1fZml4X3BjcmVsXzI2IChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHRhcmdldCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICAKLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX2NvbnRpbnVlIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJZiB0aGUgc2VjdGlvbnMgYXJlIGRpZmZlcmVudCwgYW5kIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwKLSAgICAganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4gICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUgIT0gaW5wdXRfc2VjdGlvbi0+bmFtZQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJlbG9jYXRpb24gPSAodGFyZ2V0ICYgMHgwMGZmZmZmZikgPDwgMjsKLSAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uIF4gMHgwMjAwMDAwMCkgLSAweDAyMDAwMDAwOyAvKiBTaWduIGV4dGVuZCAqLwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+dmFsdWU7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiAtPSBhZGRyOwotICAKLSAgaWYgKHJlbG9jYXRpb24gJiAzKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gIGlmIChyZWxvY2F0aW9uICYgMHgwMjAwMDAwMCkKLSAgICB7Ci0gICAgICBpZiAoKHJlbG9jYXRpb24gJiB+IChiZmRfdm1hKSAweDAzZmZmZmZmKSAhPSB+IChiZmRfdm1hKSAweDAzZmZmZmZmKQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgfQotICBlbHNlIGlmIChyZWxvY2F0aW9uICYgfjB4MDNmZmZmZmYpCi0gICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICB0YXJnZXQgJj0gfjB4MDBmZmZmZmY7Ci0gIHRhcmdldCB8PSAocmVsb2NhdGlvbiA+PiAyKSAmIDB4MDBmZmZmZmY7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHRhcmdldCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQotICAvKiBOb3cgdGhlIEFSTSBtYWdpYy4uLiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgc28gdGhhdCBpdCBpcyBtYXJrZWQgYXMgZG9uZS4KLSAgICAgU3RyaWN0bHkgdGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24uICAqLwotICByZWxvY19lbnRyeS0+aG93dG8gPSAmYW91dGFybV9zdGRfcmVsb2NfaG93dG9bQVJNXzI2RF07Ci0KLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfdGh1bWJfcGNyZWxfY29tbW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UsIGJ0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLSAgICAgdGh1bWJfcGNyZWxfYnJhbmNodHlwZSBidHlwZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uID0gMDsKLSAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgdGFyZ2V0ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF92bWEgZHN0bXNrOwotICBiZmRfdm1hIG9mZm1zazsKLSAgYmZkX3ZtYSBzaWduYml0OwotCi0gIC8qIE5PVEU6IFRoaXMgcm91dGluZSBpcyBjdXJyZW50bHkgdXNlZCBieSBHQVMsIGJ1dCBub3QgYnkgdGhlIGxpbmsKLSAgICAgcGhhc2UuICAqLwotCi0gIHN3aXRjaCAoYnR5cGUpCi0gICAgewotICAgIGNhc2UgYjk6Ci0gICAgICBkc3Rtc2sgID0gMHgwMDAwMDBmZjsKLSAgICAgIG9mZm1zayAgPSAweDAwMDAwMWZlOwotICAgICAgc2lnbmJpdCA9IDB4MDAwMDAxMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYjEyOgotICAgICAgZHN0bXNrICA9IDB4MDAwMDA3ZmY7Ci0gICAgICBvZmZtc2sgID0gMHgwMDAwMGZmZTsKLSAgICAgIHNpZ25iaXQgPSAweDAwMDAwODAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGIyMzoKLSAgICAgIGRzdG1zayAgPSAweDA3ZmYwN2ZmOwotICAgICAgb2ZmbXNrICA9IDB4MDA3ZmZmZmY7Ci0gICAgICBzaWduYml0ID0gMHgwMDQwMDAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgCi0gIC8qIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgcmV0dXJuIGVycm9yICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbgotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKLSAgICByZXR1cm4gb3V0cHV0X2JmZCA/IGJmZF9yZWxvY19jb250aW51ZSA6IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogSWYgdGhlIHNlY3Rpb25zIGFyZSBkaWZmZXJlbnQsIGFuZCB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24sCi0gICAgIGp1c3QgaWdub3JlIGl0IGZvciBub3cuICAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uLT5uYW1lICE9IGlucHV0X3NlY3Rpb24tPm5hbWUKLSAgICAgICYmIG91dHB1dF9iZmQgIT0gKGJmZCAqKU5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICBzd2l0Y2ggKGJ0eXBlKQotICAgIHsKLSAgICBjYXNlIGI5OgotICAgIGNhc2UgYjEyOgotICAgICAgcmVsb2NhdGlvbiA9ICgodGFyZ2V0ICYgZHN0bXNrKSA8PCAxKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiMjM6Ci0gICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotCXJlbG9jYXRpb24gPSAoKHRhcmdldCAmIDB4N2ZmKSA8PCAxKSAgfCAoKHRhcmdldCAmIDB4MDdmZjAwMDApID4+IDQpOwotICAgICAgZWxzZQotCXJlbG9jYXRpb24gPSAoKHRhcmdldCAmIDB4N2ZmKSA8PCAxMikgfCAoKHRhcmdldCAmIDB4MDdmZjAwMDApID4+IDE1KTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZWxvY2F0aW9uID0gKHJlbG9jYXRpb24gXiBzaWduYml0KSAtIHNpZ25iaXQ7IC8qIFNpZ24gZXh0ZW5kICovCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT52YWx1ZTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uIC09IGFkZHI7Ci0KLSAgaWYgKHJlbG9jYXRpb24gJiAxKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gIGlmIChyZWxvY2F0aW9uICYgc2lnbmJpdCkKLSAgICB7Ci0gICAgICBpZiAoKHJlbG9jYXRpb24gJiB+b2ZmbXNrKSAhPSB+b2ZmbXNrKQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgfQotICBlbHNlIGlmIChyZWxvY2F0aW9uICYgfm9mZm1zaykKLSAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHRhcmdldCAmPSB+ZHN0bXNrOwotICBzd2l0Y2ggKGJ0eXBlKQotICAgewotICAgY2FzZSBiOToKLSAgIGNhc2UgYjEyOgotICAgICB0YXJnZXQgfD0gKHJlbG9jYXRpb24gPj4gMSk7Ci0gICAgIGJyZWFrOwotCi0gICBjYXNlIGIyMzoKLSAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICAgICB0YXJnZXQgfD0gKChyZWxvY2F0aW9uICYgMHhmZmYpID4+IDEpICB8ICgocmVsb2NhdGlvbiA8PCA0KSAgJiAweDA3ZmYwMDAwKTsKLSAgICAgZWxzZQotICAgICAgIHRhcmdldCB8PSAoKHJlbG9jYXRpb24gJiAweGZmZSkgPDwgMTUpIHwgKChyZWxvY2F0aW9uID4+IDEyKSAmIDB4N2ZmKTsKLSAgICAgYnJlYWs7Ci0KLSAgIGRlZmF1bHQ6Ci0gICAgIGFib3J0ICgpOwotICAgfQotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHRhcmdldCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQotICAvKiBOb3cgdGhlIEFSTSBtYWdpYy4uLiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgc28gdGhhdCBpdCBpcyBtYXJrZWQgYXMgZG9uZS4KLSAgICAgU3RyaWN0bHkgdGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24uICAqLwotICByZWxvY19lbnRyeS0+aG93dG8gPSAmIGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvIFtBUk1fMjZEXTsKLSAgCi0gIC8qIFRPRE86IFdlIHNob3VsZCBwb3NzaWJseSBoYXZlIERPTkUgZW50cmllcyBmb3IgdGhlIFRIVU1CIFBDUkVMIHJlbG9jYXRpb25zICovCi0gIHJldHVybiBmbGFnOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1jb2ZmX3RodW1iX3BjcmVsXzIzIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gY29mZl90aHVtYl9wY3JlbF9jb21tb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwgYjIzKTsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY29mZl90aHVtYl9wY3JlbF8xMiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGNvZmZfdGh1bWJfcGNyZWxfY29tbW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UsIGIxMik7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfdGh1bWJfcGNyZWxfOSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGNvZmZfdGh1bWJfcGNyZWxfY29tbW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UsIGI5KTsKLX0KLQotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqCi1jb2ZmX2FybV9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgIGJmZCAqIGFiZmQ7Ci0gICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSNkZWZpbmUgQVNURChpLGopICAgICAgIGNhc2UgaTogcmV0dXJuICZhb3V0YXJtX3N0ZF9yZWxvY19ob3d0b1tqXQotICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfQ1RPUikKLSAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+Yml0c19wZXJfYWRkcmVzcykKLSAgICAgIHsKLSAgICAgIGNhc2UgMzI6Ci0gICAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogcmV0dXJuIChDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICopIDA7Ci0gICAgICB9Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ184LCAgICAgICAgICAgICAgICAgICAgQVJNXzgpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzE2LCAgICAgICAgICAgICAgICAgICBBUk1fMTYpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzMyLCAgICAgICAgICAgICAgICAgICBBUk1fMzIpOwotICAgICAgQVNURCAoQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gsICAgICBBUk1fMjYpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzhfUENSRUwsICAgICAgICAgICAgICBBUk1fRElTUDgpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzE2X1BDUkVMLCAgICAgICAgICAgICBBUk1fRElTUDE2KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18zMl9QQ1JFTCwgICAgICAgICAgICAgQVJNX0RJU1AzMik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfUlZBLCAgICAgICAgICAgICAgICAgIEFSTV9SVkEzMik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOSwgIEFSTV9USFVNQjkpOwotICAgICAgQVNURCAoQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyLCBBUk1fVEhVTUIxMik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMsIEFSTV9USFVNQjIzKTsKLSAgICBkZWZhdWx0OiByZXR1cm4gKENPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKikgMDsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAweDEwMDAKLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgIG51bm1iZXIgKi8KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeyB4LnJfdHlwZSA9IGhvd3RvLT50eXBlOyB9Ci0jZGVmaW5lIEJBRE1BRyh4KSBBUk1CQURNQUcoeCkKLSNkZWZpbmUgQVJNIDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotCi0vKiBFeHRlbmQgdGhlIGNvZmZfbGlua19oYXNoX3RhYmxlIHN0cnVjdHVyZSB3aXRoIGEgZmV3IEFSTSBzcGVjaWZpYyBmaWVsZHMuCi0gICBUaGlzIGFsbG93cyB1cyB0byBzdG9yZSBnbG9iYWwgZGF0YSBoZXJlIHdpdGhvdXQgYWN0dWFsbHkgY3JlYXRpbmcgYW55Ci0gICBnbG9iYWwgdmFyaWFibGVzLCB3aGljaCBpcyBhIG5vLW5vIGluIHRoZSBCRkQgd29ybGQuICAqLwotc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZQotewotICAvKiBUaGUgb3JpZ2luYWwgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlLiAgTVVTVCBiZSBmaXJzdCBmaWVsZC4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZQlyb290OwotICAKLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHNlY3Rpb24gY29udGFpbmcgdGhlIFRodW1iLXRvLUFSTSBnbHVlLiAgKi8KLSAgbG9uZyBpbnQgCQkJdGh1bWJfZ2x1ZV9zaXplOwotICAKLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHNlY3Rpb24gY29udGFpbmcgdGhlIEFSTS10by1UaHVtYiBnbHVlLiAgKi8KLSAgbG9uZyBpbnQgCQkJYXJtX2dsdWVfc2l6ZTsKLQotICAvKiBBbiBhcmJpdGFyeSBpbnB1dCBCRkQgY2hvc2VuIHRvIGhvbGQgdGhlIGdsdWUgc2VjdGlvbnMuICAqLwotICBiZmQgKgkJCQliZmRfb2ZfZ2x1ZV9vd25lcjsKLQotICAvKiBTdXBwb3J0IGludGVyd29ya2luZyB3aXRoIG9sZCwgbm9uLWludGVyd29ya2luZyBhd2FyZSBBUk0gY29kZS4gKi8KLSAgaW50IAkJCQlzdXBwb3J0X29sZF9jb2RlOwotfTsKLQotLyogR2V0IHRoZSBBUk0gY29mZiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIGNvZmZfYXJtX2hhc2hfdGFibGUoaW5mbykgXAotICAoKHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKikgKChpbmZvKS0+aGFzaCkpCi0KLS8qIENyZWF0ZSBhbiBBUk0gY29mZiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1jb2ZmX2FybV9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdAotICAgICAgKCYgcmV0LT5yb290LCBhYmZkLCBfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPnRodW1iX2dsdWVfc2l6ZSAgID0gMDsKLSAgcmV0LT5hcm1fZ2x1ZV9zaXplICAgICA9IDA7Ci0gIHJldC0+YmZkX29mX2dsdWVfb3duZXIgPSBOVUxMOwotCi0gIHJldHVybiAmIHJldC0+cm9vdC5yb290OwotfQotCi1zdGF0aWMKLWFybV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSAoaW5mbywgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2Nfb2Zmc2V0KQotICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgIGJmZF92bWEgcmVsb2Nfb2Zmc2V0OwotewotICBiZmRfdm1hIGFkZHIgPSByZWxvY19vZmZzZXQKLSAgICAgICAgICAgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYQotICAgICAgICAgICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotICAgICAgICAgICAgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIGlmIChjb2ZmX2RhdGEob3V0cHV0X2JmZCktPnBlKQotICAgICBhZGRyIC09IHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0gIGZ3cml0ZSAoJmFkZHIsIDEsIHNpemVvZiAoYWRkciksIChGSUxFICopIGluZm8tPmJhc2VfZmlsZSk7Ci0KLX0KLQwKLS8qIFRoZSB0aHVtYiBmb3JtIG9mIGEgbG9uZyBicmFuY2ggaXMgYSBiaXQgZmluaWNreSwgYmVjYXVzZSB0aGUgb2Zmc2V0Ci0gICBlbmNvZGluZyBpcyBzcGxpdCBvdmVyIHR3byBmaWVsZHMsIGVhY2ggaW4gaXQncyBvd24gaW5zdHJ1Y3Rpb24uIFRoZXkKLSAgIGNhbiBvY2N1ciBpbiBhbnkgb3JkZXIuIFNvIGdpdmVuIGEgdGh1bWIgZm9ybSBvZiBsb25nIGJyYW5jaCwgYW5kIGFuIAotICAgb2Zmc2V0LCBpbnNlcnQgdGhlIG9mZnNldCBpbnRvIHRoZSB0aHVtYiBicmFuY2ggYW5kIHJldHVybiBmaW5pc2hlZAotICAgaW5zdHJ1Y3Rpb24uIAotCi0gICBJdCB0YWtlcyB0d28gdGh1bWIgaW5zdHJ1Y3Rpb25zIHRvIGVuY29kZSB0aGUgdGFyZ2V0IGFkZHJlc3MuIEVhY2ggaGFzIAotICAgMTEgYml0cyB0byBpbnZlc3QuIFRoZSB1cHBlciAxMSBiaXRzIGFyZSBzdG9yZWQgaW4gb25lIChpZGVudGlmZWQgYnkKLSAgIEgtMC4uIHNlZSBiZWxvdyksIHRoZSBsb3dlciAxMSBiaXRzIGFyZSBzdG9yZWQgaW4gdGhlIG90aGVyIChpZGVudGlmaWVkIAotICAgYnkgSC0xKS4gCi0KLSAgIENvbWJpbmUgdG9nZXRoZXIgYW5kIHNoaWZ0ZWQgbGVmdCBieSAxIChpdCdzIGEgaGFsZiB3b3JkIGFkZHJlc3MpIGFuZCAKLSAgIHRoZXJlIHlvdSBoYXZlIGl0LgotCi0gICAgIE9wOiAxMTExID0gRiwKLSAgICAgSC0wLCB1cHBlciBhZGRyZXNzLTAgPSAwMDAKLSAgICAgT3A6IDExMTEgPSBGLAotICAgICBILTEsIGxvd2VyIGFkZHJlc3MtMCA9IDgwMAotCi0gICBUaGV5IGNhbiBiZSBvcmRlcmVkIGVpdGhlciB3YXksIGJ1dCB0aGUgYXJtIHRvb2xzIEkndmUgc2VlbiBhbHdheXMgcHV0IAotICAgdGhlIGxvd2VyIG9uZSBmaXJzdC4gSXQgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIuIGtya0BjeWdudXMuY29tCi0KLSAgIFhYWDogIEFjdHVhbGx5IHRoZSBvcmRlciBkb2VzIG1hdHRlci4gIFRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gKEgtMSkKLSAgIG1vdmVzIHRoZSBjb21wdXRlZCBhZGRyZXNzIGludG8gdGhlIFBDLCBzbyBpdCBtdXN0IGJlIHRoZSBzZWNvbmQgb25lCi0gICBpbiB0aGUgc2VxdWVuY2UuICBUaGUgcHJvYmxlbSwgaG93ZXZlciBpcyB0aGF0IHdoaWxzdCBsaXR0bGUgZW5kaWFuIGNvZGUKLSAgIHN0b3JlcyB0aGUgaW5zdHJ1Y3Rpb25zIGluIEhJIHRoZW4gTE9XIG9yZGVyLCBiaWcgZW5kaWFuIGNvZGUgZG9lcyB0aGUKLSAgIHJldmVyc2UuICBuaWNrY0BjeWdudXMuY29tICAqLwotCi0jZGVmaW5lIExPV19ISV9PUkRFUiAweEY4MDBGMDAwCi0jZGVmaW5lIEhJX0xPV19PUkRFUiAweEYwMDBGODAwCi0KLXN0YXRpYyBpbnNuMzIKLWluc2VydF90aHVtYl9icmFuY2ggKGJyX2luc24sIHJlbF9vZmYpCi0gICAgIGluc24zMiBicl9pbnNuOwotICAgICBpbnQgcmVsX29mZjsKLXsKLSAgdW5zaWduZWQgaW50IGxvd19iaXRzOwotICB1bnNpZ25lZCBpbnQgaGlnaF9iaXRzOwotCi0KLSAgQkZEX0FTU0VSVCgocmVsX29mZiAmIDEpICE9IDEpOwotCi0gIHJlbF9vZmYgPj49IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGFsZiB3b3JkIGFsaWduZWQgYWRkcmVzcyAqLwotICBsb3dfYml0cyA9IHJlbF9vZmYgJiAweDAwMDAwN0ZGOyAgICAgICAgICAgIC8qIHRoZSBib3R0b20gMTEgYml0cyAqLwotICBoaWdoX2JpdHMgPSAocmVsX29mZiA+PiAxMSkgJiAweDAwMDAwN0ZGOyAgIC8qIHRoZSB0b3AgMTEgYml0cyAqLwotCi0gIGlmICgoYnJfaW5zbiAmIExPV19ISV9PUkRFUikgPT0gTE9XX0hJX09SREVSKQotICAgIGJyX2luc24gPSBMT1dfSElfT1JERVIgfCAobG93X2JpdHMgPDwgMTYpIHwgaGlnaF9iaXRzOwotICBlbHNlIGlmICgoYnJfaW5zbiAmIEhJX0xPV19PUkRFUikgPT0gSElfTE9XX09SREVSKQotICAgIGJyX2luc24gPSBISV9MT1dfT1JERVIgfCAoaGlnaF9iaXRzIDw8IDE2KSB8IGxvd19iaXRzOwotICBlbHNlCi0gICAgYWJvcnQoKTsgLyogZXJyb3IgLSBub3QgYSB2YWxpZCBicmFuY2ggaW5zdHJ1Y3Rpb24gZm9ybSAqLwotCi0gIC8qIEZJWE1FOiBhYm9ydCBpcyBwcm9iYWJseSBub3QgdGhlIHJpZ2h0IGNhbGwuIGtya0BjeWdudXMuY29tICovCi0KLSAgcmV0dXJuIGJyX2luc247Ci19Ci0KLQwKLXN0YXRpYyBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKgotZmluZF90aHVtYl9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgQ09OU1QgY2hhciAqICAgICAgICAgICBuYW1lOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLXsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgdG1wX25hbWU7Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIG15aDsKLQotICB0bXBfbmFtZSA9ICgoY2hhciAqKQotCSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FKSArIDEpKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotICAKLSAgbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAKLSAgaWYgKG15aCA9PSBOVUxMKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogdW5hYmxlIHRvIGZpbmQgVEhVTUIgZ2x1ZSAnJXMnIGZvciBgJXMnIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCB0bXBfbmFtZSwgbmFtZSk7Ci0gIAotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgcmV0dXJuIG15aDsKLX0KLQotc3RhdGljIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqCi1maW5kX2FybV9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgQ09OU1QgY2hhciAqICAgICAgICAgICBuYW1lOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLXsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgdG1wX25hbWU7Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIG15aDsKLQotICB0bXBfbmFtZSA9ICgoY2hhciAqKQotCSAgICAgIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUpICsgMSkpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0gIAotICBteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAKLSAgICAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgaWYgKG15aCA9PSBOVUxMKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogdW5hYmxlIHRvIGZpbmQgQVJNIGdsdWUgJyVzJyBmb3IgYCVzJyIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgdG1wX25hbWUsIG5hbWUpOwotICAKLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIHJldHVybiBteWg7Ci19Ci0KLS8qCi0gIEFSTS0+VGh1bWIgZ2x1ZToKLQotICAgICAgIC5hcm0KLSAgICAgICBfX2Z1bmNfZnJvbV9hcm06Ci0JICAgICBsZHIgcjEyLCBfX2Z1bmNfYWRkcgotCSAgICAgYnggIHIxMgotICAgICAgIF9fZnVuY19hZGRyOgotICAgICAgICAgICAgLndvcmQgZnVuYyAgICBAIGJlaGF2ZSBhcyBpZiB5b3Ugc2F3IGEgQVJNXzMyIHJlbG9jCi0qLwotCi0jZGVmaW5lIEFSTTJUSFVNQl9HTFVFX1NJWkUgMTIKLXN0YXRpYyBjb25zdCBpbnNuMzIgYTJ0MV9sZHJfaW5zbiAgICAgICA9IDB4ZTU5ZmMwMDA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIGEydDJfYnhfcjEyX2luc24gICAgPSAweGUxMmZmZjFjOwotc3RhdGljIGNvbnN0IGluc24zMiBhMnQzX2Z1bmNfYWRkcl9pbnNuID0gMHgwMDAwMDAwMTsKLQotLyoKLSAgIFRodW1iLT5BUk06CQkJCVRodW1iLT4obm9uLWludGVyd29ya2luZyBhd2FyZSkgQVJNCi0KLSAgIC50aHVtYgkJCQkudGh1bWIKLSAgIC5hbGlnbiAyCQkJCS5hbGlnbiAyCi0gICAgICBfX2Z1bmNfZnJvbV90aHVtYjoJCSAgIF9fZnVuY19mcm9tX3RodW1iOgotCSAgIGJ4IHBjCQkJCXB1c2gge3I2LCBscn0KLQkgICBub3AJCQkJCWxkciAgcjYsIF9fZnVuY19hZGRyCi0gICAuYXJtCQkJCQkJbW92ICBsciwgcGMKLSAgICAgIF9fZnVuY19jaGFuZ2VfdG9fYXJtOgkJCWJ4ICAgcjYKLQkgICBiIGZ1bmMgICAJCQkuYXJtCi0JCQkJCSAgIF9fZnVuY19iYWNrX3RvX3RodW1iOgotICAgCQkgIAkJCQlsZG1pYSByMTMhIHtyNiwgbHJ9Ci0gICAJCQkJCSAgICAgICAgYnggICAgbHIKLSAgIAkJCQkJICAgX19mdW5jX2FkZHI6Ci0JCQkJCSAgICAgICAgLndvcmQJZnVuYyAKLSovCi0KLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfU0laRSAoZ2xvYmFscy0+c3VwcG9ydF9vbGRfY29kZSA/IDIwIDogOCkKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMV9ieF9wY19pbnNuID0gMHg0Nzc4Owotc3RhdGljIGNvbnN0IGluc24xNiB0MmEyX25vb3BfaW5zbiAgPSAweDQ2YzA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIHQyYTNfYl9pbnNuICAgICA9IDB4ZWEwMDAwMDA7Ci0KLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMV9wdXNoX2luc24gID0gMHhiNTQwOwotc3RhdGljIGNvbnN0IGluc24xNiB0MmEyX2xkcl9pbnNuICAgPSAweDRlMDM7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTNfbW92X2luc24gICA9IDB4NDZmZTsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhNF9ieF9pbnNuICAgID0gMHg0NzMwOwotc3RhdGljIGNvbnN0IGluc24zMiB0MmE1X3BvcF9pbnNuICAgPSAweGU4YmQ0MDQwOwotc3RhdGljIGNvbnN0IGluc24zMiB0MmE2X2J4X2luc24gICAgPSAweGUxMmZmZjFlOwotCi0vKiBUT0RPOgotICAgICBXZSBzaG91bGQgcmVhbGx5IGNyZWF0ZSBuZXcgbG9jYWwgKHN0YXRpYykgc3ltYm9scyBpbiBkZXN0aW5hdGlvbgotICAgICBvYmplY3QgZm9yIGVhY2ggc3R1YiB3ZSBjcmVhdGUuICBXZSBzaG91bGQgYWxzbyBjcmVhdGUgbG9jYWwKLSAgICAgKHN0YXRpYykgc3ltYm9scyB3aXRoaW4gdGhlIHN0dWJzIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gQVJNIGFuZAotICAgICBUaHVtYiBjb2RlLiAgVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBkZWJ1Z2dlciBhbmQgZGlzYXNzZW1ibGVyCi0gICAgIGNhbiBwcmVzZW50IGEgYmV0dGVyIHZpZXcgb2Ygc3R1YnMuCi0KLSAgICAgV2UgY2FuIHRyZWF0IHN0dWJzIGxpa2UgbGl0ZXJhbCBzZWN0aW9ucywgYW5kIGZvciB0aGUgVEhVTUI5IG9uZXMKLSAgICAgKHNob3J0IGFkZHJlc3NpbmcgcmFuZ2UpIHdlIHNob3VsZCBiZSBhYmxlIHRvIGluc2VydCB0aGUgc3R1YnMKLSAgICAgYmV0d2VlbiBzZWN0aW9ucy4gaS5lLiB0aGUgc2ltcGxlc3QgYXBwcm9hY2ggKHNpbmNlIHJlbG9jYXRpb25zCi0gICAgIGFyZSBkb25lIG9uIGEgc2VjdGlvbiBiYXNpcykgaXMgdG8gZHVtcCB0aGUgc3R1YnMgYXQgdGhlIGVuZCBvZgotICAgICBwcm9jZXNzaW5nIGEgc2VjdGlvbi4gVGhhdCB3YXkgd2UgY2FuIGFsd2F5cyB0cnkgYW5kIG1pbmltaXNlIHRoZQotICAgICBvZmZzZXQgdG8gYW5kIGZyb20gYSBzdHViLiBIb3dldmVyLCB0aGlzIGRvZXMgbm90IG1hcCB3ZWxsIG9udG8KLSAgICAgdGhlIHdheSB0aGF0IHRoZSBsaW5rZXIvQkZEIGRvZXMgaXRzIHdvcms6IG1hcHBpbmcgYWxsIGlucHV0Ci0gICAgIHNlY3Rpb25zIHRvIG91dHB1dCBzZWN0aW9ucyB2aWEgdGhlIGxpbmtlciBzY3JpcHQgYmVmb3JlIGRvaW5nCi0gICAgIGFsbCB0aGUgcHJvY2Vzc2luZy4KLQotICAgICBVbmZvcnR1bmF0ZWx5IGl0IG1heSBiZSBlYXNpZXIgdG8ganVzdCB0byBkaXNhbGxvdyBzaG9ydCByYW5nZQotICAgICBUaHVtYi0+QVJNIHN0dWJzIChpLmUuIG5vIGNvbmRpdGlvbmFsIGludGVyLXdvcmtpbmcgYnJhbmNoZXMsCi0gICAgIG9ubHkgYnJhbmNoLWFuZC1saW5rIChCTCkgY2FsbHMuICBUaGlzIHdpbGwgc2ltcGxpZnkgdGhlIHByb2Nlc3NpbmcKLSAgICAgc2luY2Ugd2UgY2FuIHRoZW4gcHV0IGFsbCBvZiB0aGUgc3R1YnMgaW50byB0aGVpciBvd24gc2VjdGlvbi4KLQotICBUT0RPOgotICAgICBPbiBhIGRpZmZlcmVudCBzdWJqZWN0LCByYXRoZXIgdGhhbiBjb21wbGFpbmluZyB3aGVuIGEKLSAgICAgYnJhbmNoIGNhbm5vdCBmaXQgaW4gdGhlIG51bWJlciBvZiBiaXRzIGF2YWlsYWJsZSBmb3IgdGhlCi0gICAgIGluc3RydWN0aW9uIHdlIHNob3VsZCBnZW5lcmF0ZSBhIHRyYW1wb2xpbmUgc3R1YiAobmVlZGVkIHRvCi0gICAgIGFkZHJlc3MgdGhlIGNvbXBsZXRlIDMyYml0IGFkZHJlc3Mgc3BhY2UpLiAgKi8KLQotLyogVGhlIHN0YW5kYXJkIENPRkYgYmFja2VuZCBsaW5rZXIgZG9lcyBub3QgY29wZSB3aXRoIHRoZSBzcGVjaWFsIAotICAgVGh1bWIgQlJBTkNIMjMgcmVsb2NhdGlvbi4gIFRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byBzcGxpdCB0aGUKLSAgIEJSQU5DSDIzIGludG8gc2VwZXJhdGUgSEkyMyBhbmQgTE8yMyByZWxvY2F0aW9ucy4gSG93ZXZlciwgaXQgaXMgYQotICAgYml0IHNpbXBsZXIgc2ltcGx5IHByb3ZpZGluZyBvdXIgb3duIHJlbG9jYXRpb24gZHJpdmVyLiAqLwotCi0vKiBUaGUgcmVsb2MgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGUgQVJNL1RodW1iIENPRkYgbGlua2VyLiAgTk9URToKLSAgIFRoaXMgY29kZSBpcyBhIHZlcnkgc2xpZ2h0bHkgbW9kaWZpZWQgY29weSBvZgotICAgX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbi4gIEl0IHdvdWxkIGJlIGEgbXVjaCBtb3JlCi0gICBtYWludGFpbmFibGUgc29sdXRpb24gdG8gaGF2ZSBhIE1BQ1JPIHRoYXQgY291bGQgYmUgZXhwYW5kZWQgd2l0aGluCi0gICBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uIHRoYXQgd291bGQgb25seSBiZSBwcm92aWRlZCBmb3IKLSAgIEFSTS9UaHVtYiBidWlsZHMuICBJdCBpcyBvbmx5IHRoZSBjb2RlIG1hcmtlZCBUSFVNQkVYVEVOU0lPTiB0aGF0Ci0gICBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICogcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWxlbmQ7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLQotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IDA7Ci0gICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbmR4OwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogIGg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICogICAgICAgc3ltOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZDsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgICB2YWw7Ci0gICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgICAgaG93dG87Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgICAgICAgICAgcnN0YXQ7Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICAgaF92YWw7Ci0KLSAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7ICAgIAotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JfQotCi0gICAgICAvKiBDT0ZGIHRyZWF0cyBjb21tb24gc3ltYm9scyBpbiBvbmUgb2YgdHdvIHdheXMuICBFaXRoZXIgdGhlCi0gICAgICAgICBzaXplIG9mIHRoZSBzeW1ib2wgaXMgaW5jbHVkZWQgaW4gdGhlIHNlY3Rpb24gY29udGVudHMsIG9yIGl0Ci0gICAgICAgICBpcyBub3QuICBXZSBhc3N1bWUgdGhhdCB0aGUgc2l6ZSBpcyBub3QgaW5jbHVkZWQsIGFuZCBmb3JjZQotICAgICAgICAgdGhlIHJ0eXBlX3RvX2hvd3RvIGZ1bmN0aW9uIHRvIGFkanVzdCB0aGUgYWRkZW5kIGFzIG5lZWRlZC4gICovCi0KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQlhZGRlbmQgPSAtIHN5bS0+bl92YWx1ZTsKLSAgICAgIGVsc2UKLQlhZGRlbmQgPSAwOwotCi0KLSAgICAgIGhvd3RvID0gY29mZl9ydHlwZV90b19ob3d0byAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwsIGgsCi0JCQkJICAgICAgIHN5bSwgJmFkZGVuZCk7Ci0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSByZWxvY2F0aW9uX3NlY3Rpb24gZnVuY3Rpb24gd2lsbCBza2lwIHBjcmVsX29mZnNldCByZWxvY3MKLSAgICAgICAgIHdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluay4gIEhvd2V2ZXIsIHdlIHdhbnQgdG8gY29udmVydAotICAgICAgICAgQVJNMjYgdG8gQVJNMjZEIHJlbG9jcyBpZiBwb3NzaWJsZS4gIFdlIHJldHVybiBhIGZha2UgaG93dG8gaW4KLSAgICAgICAgIHRoaXMgY2FzZSB3aXRob3V0IHBjcmVsX29mZnNldCBzZXQsIGFuZCBhZGp1c3QgdGhlIGFkZGVuZCB0bwotICAgICAgICAgY29tcGVuc2F0ZS4gICovCi0gICAgICBpZiAocmVsLT5yX3R5cGUgPT0gQVJNXzI2Ci0gICAgICAgICAgJiYgaCAhPSBOVUxMCi0gICAgICAgICAgJiYgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgICAgICYmIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBmYWtlX2FybTI2X3JlbG9jID0gCi0JICAgIEhPV1RPIChBUk1fMjYsCi0gICAgCSAgICAgICAyLAotICAgIAkgICAgICAgMiwKLSAgICAJICAgICAgIDI0LAotICAgIAkgICAgICAgdHJ1ZSwKLSAgICAJICAgICAgIDAsCi0gICAgCSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0gICAgCSAgICAgICBhb3V0YXJtX2ZpeF9wY3JlbF8yNiAsCi0gICAgCSAgICAgICAiQVJNXzI2IiwKLSAgICAJICAgICAgIGZhbHNlLAotICAgIAkgICAgICAgMHgwMGZmZmZmZiwKLSAgICAJICAgICAgIDB4MDBmZmZmZmYsIAotICAgIAkgICAgICAgZmFsc2UpOwotCi0gICAgICAgICAgYWRkZW5kIC09IHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLSAgICAgICAgICBob3d0byA9ICZmYWtlX2FybTI2X3JlbG9jOwotICAgICAgICB9Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB0aGVuIHdlIGNhbiBqdXN0IGlnbm9yZQotICAgICAgICAgYSBQQyByZWxhdGl2ZSByZWxvYyB0aGF0IGlzIHBjcmVsX29mZnNldC4gIEl0IHdpbGwgYWxyZWFkeQotICAgICAgICAgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZS4gIElmIHRoaXMgaXMgbm90IGEgcmVsb2NhdGVhYmxlIGxpbmssCi0gICAgICAgICB0aGVuIHdlIHNob3VsZCBpZ25vcmUgdGhlIHN5bWJvbCB2YWx1ZS4gICovCi0gICAgICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlICYmIGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotICAgICAgICAgICAgYWRkZW5kICs9IHN5bS0+bl92YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICB2YWwgPSAwOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0gICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlCi0JCSAgICAgLSBzZWMtPnZtYSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotI2lmIDEgLyogVEhVTUJFWFRFTlNJT04gKi8KLSAgICAgICAgICAvKiBXZSBkb24ndCBvdXRwdXQgdGhlIHN0dWJzIGlmIHdlIGFyZSBnZW5lcmF0aW5nIGEKLSAgICAgICAgICAgICByZWxvY2F0YWJsZSBvdXRwdXQgZmlsZSwgc2luY2Ugd2UgbWF5IGFzIHdlbGwgbGVhdmUgdGhlCi0gICAgICAgICAgICAgc3R1YiBnZW5lcmF0aW9uIHRvIHRoZSBmaW5hbCBsaW5rZXIgcGFzcy4gSWYgd2UgZmFpbCB0bwotCSAgICAgdmVyaWZ5IHRoYXQgdGhlIG5hbWUgaXMgZGVmaW5lZCwgd2UnbGwgdHJ5IHRvIGJ1aWxkIHN0dWJzCi0JICAgICBmb3IgYW4gdW5kZWZpbmVkIG5hbWUuLi4gKi8KLSAgICAgICAgICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLQkgICAgICAmJiAoICAgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgICAgICAgICAgewotCSAgICAgIGFzZWN0aW9uICogICBoX3NlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBjb25zdCBjaGFyICogbmFtZSAgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICAgIAotCSAgICAgIC8qIGggbG9jYXRlcyB0aGUgc3ltYm9sIHJlZmVyZW5jZWQgaW4gdGhlIHJlbG9jLiAgKi8KLQkgICAgICBoX3ZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIGhfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIGhfc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQotICAgICAgICAgICAgICBpZiAoaG93dG8tPnR5cGUgPT0gQVJNXzI2KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICggICBoLT5jbGFzcyA9PSBDX1RIVU1CU1RBVEZVTkMKLQkJICAgICAgfHwgaC0+Y2xhc3MgPT0gQ19USFVNQkVYVEZVTkMpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEFybSBjb2RlIGNhbGxpbmcgYSBUaHVtYiBmdW5jdGlvbiAqLwotCQkgICAgICB1bnNpZ25lZCBsb25nIGludCAgICAgICAgICAgICAgICAgdG1wOwotCQkgICAgICBsb25nIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfb2Zmc2V0OwotCQkgICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICAgICAgczsKLQkJICAgICAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHJldF9vZmZzZXQ7Ci0JCSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqICAgICBteWg7IAotCQkgICAgICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQkJICAgICAgCi0JCSAgICAgIG15aCA9IGZpbmRfYXJtX2dsdWUgKGluZm8sIG5hbWUsIGlucHV0X2JmZCk7Ci0JCSAgICAgIGlmIChteWggPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkgICAgICBnbG9iYWxzID0gY29mZl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0KLQkJICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLQkJICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0JCQkKLQkJICAgICAgbXlfb2Zmc2V0ID0gbXloLT5yb290LnUuZGVmLnZhbHVlOwotCQkgICAgICAKLQkJICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgCi0JCQkJCQkgIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHMtPmNvbnRlbnRzICE9IE5VTEwpOwotCQkgICAgICBCRkRfQVNTRVJUIChzLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKTsKLQotCQkgICAgICBpZiAoKG15X29mZnNldCAmIDB4MDEpID09IDB4MDEpCi0JCQl7Ci0JCQkgIGlmIChoX3NlYy0+b3duZXIgIT0gTlVMTAotCQkJICAgICAgJiYgSU5URVJXT1JLX1NFVCAoaF9zZWMtPm93bmVyKQotCQkJICAgICAgJiYgISBJTlRFUldPUktfRkxBRyAoaF9zZWMtPm93bmVyKSkKLQkJCSAgICB7Ci0JCQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJCShfKCIlcyglcyk6IHdhcm5pbmc6IGludGVyd29ya2luZyBub3QgZW5hYmxlZC4iKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaF9zZWMtPm93bmVyKSwgbmFtZSk7Ci0JCQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJCShfKCIgIGZpcnN0IG9jY3VycmVuY2U6ICVzOiBhcm0gY2FsbCB0byB0aHVtYiIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLQkJCSAgICB9Ci0KLQkJCSAgLS1teV9vZmZzZXQ7Ci0JCQkgIG15aC0+cm9vdC51LmRlZi52YWx1ZSA9IG15X29mZnNldDsKLQotCQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBhMnQxX2xkcl9pbnNuLAotCQkJCSAgICAgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0KTsKLQkJCSAgCi0JCQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGEydDJfYnhfcjEyX2luc24sCi0JCQkJICAgICAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA0KTsKLQkJCSAgCi0JCQkgIC8qIEl0J3MgYSB0aHVtYiBhZGRyZXNzLiAgQWRkIHRoZSBsb3cgb3JkZXIgYml0LiAgKi8KLQkJCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaF92YWwgfCBhMnQzX2Z1bmNfYWRkcl9pbnNuLAotCQkJCSAgICAgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgOCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJhc2VfZmlsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1fZW1pdF9iYXNlX2ZpbGVfZW50cnkgKGluZm8sIG91dHB1dF9iZmQsIHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfb2Zmc2V0ICsgOCk7Ci0KLQkJCX0KLQotCQkgICAgICBCRkRfQVNTRVJUIChteV9vZmZzZXQgPD0gZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSk7Ci0KLQkJICAgICAgdG1wID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl92YWRkcgotCQkJCQktIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JCSAgICAgIAotCQkgICAgICB0bXAgPSB0bXAgJiAweEZGMDAwMDAwOwotCi0JCSAgICAgIC8qIFNvbWVob3cgdGhlc2UgYXJlIGJvdGggNCB0b28gZmFyLCBzbyBzdWJ0cmFjdCA4LiAqLwotCQkgICAgICByZXRfb2Zmc2V0ID0KLQkJCXMtPm91dHB1dF9vZmZzZXQKLQkJCSsgbXlfb2Zmc2V0IAotCQkJKyBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQktIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgCi0JCQkgICArIHJlbC0+cl92YWRkcikKLQkJCS0gODsKLQotCQkgICAgICB0bXAgPSB0bXAgfCAoKHJldF9vZmZzZXQgPj4gMikgJiAweDAwRkZGRkZGKTsKLQkJICAgICAgCi0JCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHRtcCwgY29udGVudHMgKyByZWwtPnJfdmFkZHIKLQkJCQkgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQkJICAgICAgZG9uZSA9IDE7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgfQotCSAgICAgIAotCSAgICAgIC8qIE5vdGU6IFdlIHVzZWQgdG8gY2hlY2sgZm9yIEFSTV9USFVNQjkgYW5kIEFSTV9USFVNQjEyICovCi0gICAgICAgICAgICAgIGVsc2UgaWYgKGhvd3RvLT50eXBlID09IEFSTV9USFVNQjIzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICggICBoLT5jbGFzcyA9PSBDX0VYVCAKLQkJICAgICAgfHwgaC0+Y2xhc3MgPT0gQ19TVEFUCi0JCSAgICAgIHx8IGgtPmNsYXNzID09IENfTEFCRUwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRodW1iIGNvZGUgY2FsbGluZyBhbiBBUk0gZnVuY3Rpb24gKi8KLQkJICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gMDsKLQkJICAgICAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9vZmZzZXQ7Ci0JCSAgICAgIHVuc2lnbmVkIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgdG1wOwotCQkgICAgICBsb25nIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldF9vZmZzZXQ7Ci0JCSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqICAgICAgbXloOwotCQkgICAgICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogIGdsb2JhbHM7Ci0KLQkJICAgICAgbXloID0gZmluZF90aHVtYl9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpOwotCQkgICAgICBpZiAobXloID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJICAgICAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCQkgICAgICAKLQkJICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLQkJICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0JCSAgICAgIAotCQkgICAgICBteV9vZmZzZXQgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0JCSAgICAgIAotCQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCAKLQkJCQkJCSAgIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0JCSAgICAgIAotCQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCQkgICAgICBCRkRfQVNTRVJUIChzLT5jb250ZW50cyAhPSBOVUxMKTsKLQkJICAgICAgQkZEX0FTU0VSVCAocy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCk7Ci0JCSAgICAgIAotCQkgICAgICBpZiAoKG15X29mZnNldCAmIDB4MDEpID09IDB4MDEpCi0JCQl7Ci0JCQkgIGlmIChoX3NlYy0+b3duZXIgIT0gTlVMTAotCQkJICAgICAgJiYgSU5URVJXT1JLX1NFVCAoaF9zZWMtPm93bmVyKQotCQkJICAgICAgJiYgISBJTlRFUldPUktfRkxBRyAoaF9zZWMtPm93bmVyKQotCQkJICAgICAgJiYgISBnbG9iYWxzLT5zdXBwb3J0X29sZF9jb2RlKQotCQkJICAgIHsKLQkJCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQkJKF8oIiVzKCVzKTogd2FybmluZzogaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkLiIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChoX3NlYy0+b3duZXIpLCBuYW1lKTsKLQkJCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQkJKF8oIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IHRodW1iIGNhbGwgdG8gYXJtIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotCQkJICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JCQkJKF8oIiAgY29uc2lkZXIgcmVsaW5raW5nIHdpdGggLS1zdXBwb3J0LW9sZC1jb2RlIGVuYWJsZWQiKSk7Ci0JCQkgICAgfQotCQkJICAKLQkJCSAgLS0gbXlfb2Zmc2V0OwotCQkJICBteWgtPnJvb3QudS5kZWYudmFsdWUgPSBteV9vZmZzZXQ7Ci0KLQkJCSAgaWYgKGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUpCi0JCQkgICAgewotCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMV9wdXNoX2luc24sCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQpOwotCQkJICAgICAgCi0JCQkgICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmEyX2xkcl9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgMik7Ci0KLQkJCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTNfbW92X2luc24sCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA0KTsKLQotCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhNF9ieF9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNik7Ci0JCQkgICAgICAKLQkJCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHQyYTVfcG9wX2luc24sCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA4KTsKLQkJCSAgICAgIAotCQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdDJhNl9ieF9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgMTIpOwotCQkJICAgICAgCi0JCQkgICAgICAvKiBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGxhc3Qgd29yZCBvZiB0aGUgc3R1Yi4gICovCi0JCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBoX3ZhbCwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJhc2VfZmlsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5IChpbmZvLCBvdXRwdXRfYmZkLCBzLCBteV9vZmZzZXQgKyAxNik7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMV9ieF9wY19pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0KTsKLQkJICAgICAgCi0JCQkgICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmEyX25vb3BfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDIpOwotCQkgICAgICAKLQkJCSAgICAgIHJldF9vZmZzZXQgPQotCQkJCSgoYmZkX3NpZ25lZF92bWEpIGhfdmFsKQkvKiBBZGRyZXNzIG9mIGRlc3RpbmF0aW9uIG9mIHRoZSBzdHViICovCi0JCQkJLSAoKGJmZF9zaWduZWRfdm1hKQotCQkJCSAgIChzLT5vdXRwdXRfb2Zmc2V0IAkJLyogT2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24gdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHVicy4gICovCi0JCQkJICAgICsgbXlfb2Zmc2V0CQkJLyogT2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB0aGlzIHN0dWIgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHN0dWJzLiAgKi8KLQkJCQkgICAgKyBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hKSAJLyogQWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCi0JCQkJICAgKyA0CQkJCS8qIFRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gaXMgNCBieXRlcyBpbnRvIHRoZSBzdHViLiAgKi8KLQkJCQkgICArIDgpOwkJCS8qIEFSTSBicmFuY2hlcyB3b3JrIGZyb20gdGhlIHBjIG9mIHRoZSBpbnN0cnVjdGlvbiArIDguICAqLwotCQkJICAgICAgCi0JCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJCQkgIHQyYTNfYl9pbnNuIHwgKChyZXRfb2Zmc2V0ID4+IDIpICYgMHgwMEZGRkZGRiksCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA0KTsKLQotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICBCRkRfQVNTRVJUIChteV9vZmZzZXQgPD0gZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplKTsKLQotCQkgICAgICAvKiBOb3cgZ28gYmFjayBhbmQgZml4IHVwIHRoZSBvcmlnaW5hbCBCTCBpbnNuIHRvIHBvaW50Ci0JCQkgdG8gaGVyZS4gICovCi0JCSAgICAgIHJldF9vZmZzZXQgPQotCQkJcy0+b3V0cHV0X29mZnNldAotCQkJKyBteV9vZmZzZXQKLQkJCS0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICsgcmVsLT5yX3ZhZGRyKQotCQkJLTQ7Ci0JCSAgICAgIAotCQkgICAgICB0bXAgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyCi0JCQkJCS0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJCSAgaW5zZXJ0X3RodW1iX2JyYW5jaCAodG1wLCByZXRfb2Zmc2V0KSwKLQkJCQkgIGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyCi0JCQkJICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JCSAgICAgIAotCQkgICAgICBkb25lID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQkgIAotICAgICAgICAgIC8qIElmIHRoZSByZWxvY2F0aW9uIHR5cGUgYW5kIGRlc3RpbmF0aW9uIHN5bWJvbCBkb2VzIG5vdAotICAgICAgICAgICAgIGZhbGwgaW50byBvbmUgb2YgdGhlIGFib3ZlIGNhdGVnb3JpZXMsIHRoZW4gd2UgY2FuIGp1c3QKLSAgICAgICAgICAgICBwZXJmb3JtIGEgZGlyZWN0IGxpbmsuICovCi0KLQkgIGlmIChkb25lKQotCSAgICByc3RhdCA9IGJmZF9yZWxvY19vazsKLQkgIGVsc2UgCi0jZW5kaWYgLyogVEhVTUJFWFRFTlNJT04gKi8KLQkgICAgaWYgKCAgIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB9Ci0KLQkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5iYXNlX2ZpbGUpCi0JewotCSAgLyogRW1pdCBhIHJlbG9jIGlmIHRoZSBiYWNrZW5kIHRoaW5rcyBpdCBuZWVkcyBpdC4gKi8KLQkgIGlmIChzeW0gJiYgcGVfZGF0YShvdXRwdXRfYmZkKS0+aW5fcmVsb2NfcChvdXRwdXRfYmZkLCBob3d0bykpCi0gICAgICAgICAgICBhcm1fZW1pdF9iYXNlX2ZpbGVfZW50cnkgKGluZm8sIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkcik7Ci0JfQotICAKLSNpZiAxIC8qIFRIVU1CRVhURU5TSU9OICovCi0gICAgICBpZiAoZG9uZSkKLQlyc3RhdCA9IGJmZF9yZWxvY19vazsKLSAgICAgIC8qIE9ubHkgcGVyZm9ybSB0aGlzIGZpeCBkdXJpbmcgdGhlIGZpbmFsIGxpbmssIG5vdCBhIHJlbG9jYXRhYmxlIGxpbmsuICBuaWNrY0BjeWdudXMuY29tICAqLwotICAgICAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLQkgICAgICAgJiYgaG93dG8tPnR5cGUgPT0gQVJNX1RIVU1CMjMpCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBUaGlzIGlzIHByZXR0eSBtdWNoIGEgY29weSBvZiB3aGF0IHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIGFuZCBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzCi0gICAgICAgICAgICAgcm91dGluZXMgZG8gdG8gcGVyZm9ybSBhIHJlbG9jYXRpb24sIHdpdGggc3BlY2lhbAotICAgICAgICAgICAgIHByb2Nlc3NpbmcgZm9yIHRoZSBzcGxpdCBhZGRyZXNzaW5nIG9mIHRoZSBUaHVtYiBCTAotICAgICAgICAgICAgIGluc3RydWN0aW9uLiAgQWdhaW4sIGl0IHdvdWxkIHByb2JhYmx5IGJlIHNpbXBsZXIgYWRkaW5nIGEKLSAgICAgICAgICAgICBUaHVtYkJSQU5DSDIzIHNwZWNpZmljIG1hY3JvIGV4cGFuc2lvbiBpbnRvIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgY29kZS4gICovCi0JICAKLSAgICAgICAgICBiZmRfdm1hIGFkZHJlc3MgPSByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JICAKLSAgICAgICAgICBpZiAoYWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkKLQkgICAgcnN0YXQgPSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJmZF92bWEgICAgICAgICByZWxvY2F0aW9uICAgICAgID0gdmFsICsgYWRkZW5kOwotCSAgICAgIGludCAgICAgICAgICAgICBzaXplICAgICAgICAgICAgID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7Ci0JICAgICAgYm9vbGVhbiAgICAgICAgIG92ZXJmbG93ICAgICAgICAgPSBmYWxzZTsKLQkgICAgICBiZmRfYnl0ZSAqICAgICAgbG9jYXRpb24gICAgICAgICA9IGNvbnRlbnRzICsgYWRkcmVzczsKLQkgICAgICBiZmRfdm1hICAgICAgICAgeCAgICAgICAgICAgICAgICA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotCSAgICAgIGJmZF92bWEgICAgICAgICBzcmNfbWFzayAgICAgICAgID0gMHgwMDdGRkZGRTsKLQkgICAgICBiZmRfc2lnbmVkX3ZtYSAgcmVsb2Nfc2lnbmVkX21heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDE7Ci0JICAgICAgYmZkX3NpZ25lZF92bWEgIHJlbG9jX3NpZ25lZF9taW4gPSB+cmVsb2Nfc2lnbmVkX21heDsKLQkgICAgICBiZmRfdm1hICAgICAgICAgY2hlY2s7Ci0JICAgICAgYmZkX3NpZ25lZF92bWEgIHNpZ25lZF9jaGVjazsKLQkgICAgICBiZmRfdm1hICAgICAgICAgYWRkOwotCSAgICAgIGJmZF9zaWduZWRfdm1hICBzaWduZWRfYWRkOwotCi0JICAgICAgQkZEX0FTU0VSVCAoc2l6ZSA9PSA0KTsKLQkgICAgICAKLSAgICAgICAgICAgICAgLyogaG93dG8tPnBjX3JlbGF0aXZlIHNob3VsZCBiZSBUUlVFIGZvciB0eXBlIDE0IEJSQU5DSDIzICovCi0gICAgICAgICAgICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICAKLSAgICAgICAgICAgICAgLyogaG93dG8tPnBjcmVsX29mZnNldCBzaG91bGQgYmUgVFJVRSBmb3IgdHlwZSAxNCBCUkFOQ0gyMyAqLwotICAgICAgICAgICAgICByZWxvY2F0aW9uIC09IGFkZHJlc3M7Ci0JICAgICAgCi0JICAgICAgLyogTm8gbmVlZCB0byBuZWdhdGUgdGhlIHJlbG9jYXRpb24gd2l0aCBCUkFOQ0gyMy4gKi8KLQkgICAgICAvKiBob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgPT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkIGZvciBCUkFOQ0gyMy4gICovCi0JICAgICAgLyogaG93dG8tPnJpZ2h0c2hpZnQgPT0gMSAqLwotCSAgICAgIC8qIERyb3AgdW53YW50ZWQgYml0cyBmcm9tIHRoZSB2YWx1ZSB3ZSBhcmUgcmVsb2NhdGluZyB0by4gICovCi0JICAgICAgCi0JICAgICAgY2hlY2sgPSByZWxvY2F0aW9uID4+IGhvd3RvLT5yaWdodHNoaWZ0OwotCQkKLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgc2lnbmVkIHZhbHVlLCB0aGUgcmlnaHRzaGlmdCBqdXN0IGRyb3BwZWQKLQkJIGxlYWRpbmcgMSBiaXRzIChhc3N1bWluZyB0d29zIGNvbXBsZW1lbnQpLiAgKi8KLQkgICAgICBpZiAoKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uID49IDApCi0JCXNpZ25lZF9jaGVjayA9IGNoZWNrOwotCSAgICAgIGVsc2UKLQkJc2lnbmVkX2NoZWNrID0gKGNoZWNrCi0JCQkJfCAoKGJmZF92bWEpIC0gMQotCQkJCSAgICYgfigoYmZkX3ZtYSkgLSAxID4+IGhvd3RvLT5yaWdodHNoaWZ0KSkpOwotCSAgICAgIAotCSAgICAgIC8qIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IGZpbGUuICAqLwotCSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQkJewotCQkgIGFkZCA9ICgoKHgpICYgMHgwN2ZmMDAwMCkgPj4gNCkgfCAoKCh4KSAmIDB4N2ZmKSA8PCAxKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFkZCA9ICgoKCh4KSAmIDB4N2ZmKSA8PCAxMikgfCAoKCh4KSAmIDB4MDdmZjAwMDApID4+IDE1KSk7Ci0JCX0KLQotCSAgICAgIC8qIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IGZpbGUgd2l0aCBhbiBhcHByb3ByaWF0ZSBzaWduLgotCQkgVGhlIGV4cHJlc3Npb24gaW52b2x2aW5nIGhvd3RvLT5zcmNfbWFzayBpc29sYXRlcyB0aGUgdXBwZXIKLQkJIGJpdCBvZiBzcmNfbWFzay4gIElmIHRoYXQgYml0IGlzIHNldCBpbiB0aGUgdmFsdWUgd2UgYXJlCi0JCSBhZGRpbmcsIGl0IGlzIG5lZ2F0aXZlLCBhbmQgd2Ugc3VidHJhY3Qgb3V0IHRoYXQgbnVtYmVyIHRpbWVzCi0JCSB0d28uICBJZiBzcmNfbWFzayBpbmNsdWRlcyB0aGUgaGlnaGVzdCBwb3NzaWJsZSBiaXQsIHRoZW4gd2UKLQkJIGNhbiBub3QgZ2V0IHRoZSB1cHBlciBiaXQsIGJ1dCB0aGF0IGRvZXMgbm90IG1hdHRlciBzaW5jZQotCQkgc2lnbmVkX2FkZCBuZWVkcyBubyBhZGp1c3RtZW50IHRvIGJlY29tZSBuZWdhdGl2ZSBpbiB0aGF0Ci0JCSBjYXNlLiAgKi8KLQkgICAgICAKLQkgICAgICBzaWduZWRfYWRkID0gYWRkOwotCSAgICAgIAotCSAgICAgIGlmICgoYWRkICYgKCgofiBzcmNfbWFzaykgPj4gMSkgJiBzcmNfbWFzaykpICE9IDApCi0JCXNpZ25lZF9hZGQgLT0gKCgofiBzcmNfbWFzaykgPj4gMSkgJiBzcmNfbWFzaykgPDwgMTsKLQkgICAgICAKLQkgICAgICAvKiBBZGQgdGhlIHZhbHVlIGZyb20gdGhlIG9iamVjdCBmaWxlLCBzaGlmdGVkIHNvIHRoYXQgaXQgaXMgYQotCQkgc3RyYWlnaHQgbnVtYmVyLiAgKi8KLQkgICAgICAvKiBob3d0by0+Yml0cG9zID09IDAgKi8KLQkgICAgICAKLQkgICAgICBzaWduZWRfY2hlY2sgKz0gc2lnbmVkX2FkZDsKLQkgICAgICByZWxvY2F0aW9uICs9IHNpZ25lZF9hZGQ7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgPT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkKTsKLQotCSAgICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gICovCi0JICAgICAgaWYgKCAgIHNpZ25lZF9jaGVjayA+IHJlbG9jX3NpZ25lZF9tYXgKLQkJICB8fCBzaWduZWRfY2hlY2sgPCByZWxvY19zaWduZWRfbWluKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgCi0JICAgICAgLyogUHV0IFJFTE9DQVRJT04gaW50byB0aGUgY29ycmVjdCBiaXRzOiAgKi8KLQkgICAgICAKLQkgICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JCXsKLQkJICByZWxvY2F0aW9uID0gKCgocmVsb2NhdGlvbiAmIDB4ZmZlKSA+PiAxKSAgfCAoKHJlbG9jYXRpb24gPDwgNCkgJiAweDA3ZmYwMDAwKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICByZWxvY2F0aW9uID0gKCgocmVsb2NhdGlvbiAmIDB4ZmZlKSA8PCAxNSkgfCAoKHJlbG9jYXRpb24gPj4gMTIpICYgMHg3ZmYpKTsKLQkJfQotCSAgICAgIAotCSAgICAgIC8qIEFkZCBSRUxPQ0FUSU9OIHRvIHRoZSBjb3JyZWN0IGJpdHMgb2YgWDogICovCi0JICAgICAgeCA9ICgoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgcmVsb2NhdGlvbik7Ci0KLQkgICAgICAvKiBQdXQgdGhlIHJlbG9jYXRlZCB2YWx1ZSBiYWNrIGluIHRoZSBvYmplY3QgZmlsZTogICovCi0JICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7Ci0KLQkgICAgICByc3RhdCA9IG92ZXJmbG93ID8gYmZkX3JlbG9jX292ZXJmbG93IDogYmZkX3JlbG9jX29rOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBlbHNlCi0jZW5kaWYgLyogVEhVTUJFWFRFTlNJT04gKi8KLSAgICAgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgYWRkZW5kKTsKLSNpZiAxIC8qIFRIVU1CRVhURU5TSU9OICovCi0gICAgICAvKiBGSVhNRTogCi0JIElzIHRoaXMgdGhlIGJlc3Qgd2F5IHRvIGZpeCB1cCB0aHVtYiBhZGRyZXNzZXM/IGtya0BjeWdudXMuY29tCi0JIFByb2JhYmx5IG5vdCwgYnV0IGl0IHdvcmtzLCBhbmQgaWYgaXQgd29ya3MgaXQgZG9uJ3QgbmVlZCBmaXhpbmchICBuaWNrY0BjeWdudXMuY29tICovCi0gICAgICAvKiBPbmx5IHBlcmZvcm0gdGhpcyBmaXggZHVyaW5nIHRoZSBmaW5hbCBsaW5rLCBub3QgYSByZWxvY2F0YWJsZSBsaW5rLiAgbmlja2NAY3lnbnVzLmNvbSAgKi8KLSAgICAgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQotCSAgJiYgKHJlbC0+cl90eXBlID09IEFSTV8zMiB8fCByZWwtPnJfdHlwZSA9PSBBUk1fUlZBMzIpKQotCXsKLQkgIC8qIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIHNldCB0aGUgYm90dG9tIGJpdCBvZiBhIHJlbG9jYXRlZCBhZGRyZXNzCi0JICAgICBiZWNhdXNlIHRoZSBhZGRyZXNzIGlzIHRoZSBhZGRyZXNzIG9mIGEgVGh1bWIgY29kZSBzeW1ib2wuICAqLwotCSAgICAgCi0JICBpbnQgcGF0Y2hpdCA9IGZhbHNlOwotCSAgCi0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgKCAgIGgtPmNsYXNzID09IENfVEhVTUJTVEFURlVOQwotCQkgIHx8IGgtPmNsYXNzID09IENfVEhVTUJFWFRGVU5DKSkKLQkgICAgewotCSAgICAgIHBhdGNoaXQgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzeW0gIT0gTlVMTAotCQkgICAmJiBzeW0tPm5fc2NudW0gPiBOX1VOREVGKQotCSAgICB7Ci0JICAgICAgLyogTm8gaGFzaCBlbnRyeSAtIHVzZSB0aGUgc3ltYm9sIGluc3RlYWQuICAqLwotCi0JICAgICAgaWYgKCAgIHN5bS0+bl9zY2xhc3MgPT0gQ19USFVNQlNUQVRGVU5DCi0JCSAgfHwgc3ltLT5uX3NjbGFzcyA9PSBDX1RIVU1CRVhURlVOQykKLQkJcGF0Y2hpdCA9IHRydWU7Ci0JICAgIH0KLQotCSAgaWYgKHBhdGNoaXQpCi0JICAgIHsKLQkgICAgICBiZmRfYnl0ZSAqIGxvY2F0aW9uID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JICAgICAgYmZkX3ZtYSAgICB4ICAgICAgICA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotCi0JICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4IHwgMSwgbG9jYXRpb24pOwotCSAgICB9Ci0JfQotI2VuZGlmIC8qIFRIVU1CRVhURU5TSU9OICovICAgICAgCi0gICAgICAKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBiYWQgcmVsb2MgYWRkcmVzcyAweCVseCBpbiBzZWN0aW9uIGAlcyciKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JICAgICAodW5zaWduZWQgbG9uZykgcmVsLT5yX3ZhZGRyLAotCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCSAgcmV0dXJuIGZhbHNlOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICAgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBzeW0sIGJ1Zik7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotc3RhdGljCi0jZW5kaWYKLWJvb2xlYW4KLWJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIChpbmZvKSAKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotewotICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICAgICAgczsKLSAgYmZkX2J5dGUgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvbzsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0jaWYgMAotICBzdGF0aWMgY2hhciAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jaGFyID0gJzEnOwotI2VuZGlmCi0KLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotICAKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLQotICBpZiAoZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotICAgICAgCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICAKLSAgICAgIGZvbyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOwotI2lmIDAKLSAgICAgIG1lbXNldCAoZm9vLCB0ZXN0X2NoYXIsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOwotI2VuZGlmCi0gICAgICAKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IHMtPl9jb29rZWRfc2l6ZSA9IGdsb2JhbHMtPmFybV9nbHVlX3NpemU7Ci0gICAgICBzLT5jb250ZW50cyA9IGZvbzsKLSAgICB9Ci0KLSAgaWYgKGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotICAgICAgCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICAKLSAgICAgIGZvbyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSk7Ci0jaWYgMAotICAgICAgbWVtc2V0IChmb28sIHRlc3RfY2hhciwgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplKTsKLSNlbmRpZgotICAgICAgCi0gICAgICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemU7Ci0gICAgICBzLT5jb250ZW50cyA9IGZvbzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgICAgIGluZm87Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci17Ci0gIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKiAgICAgICAgICAgICAgIHM7Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfbmFtZTsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogICAgIG15aDsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotICAgIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIHRtcF9uYW1lID0gKChjaGFyICopCi0JICAgICAgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLSAgCi0gIG15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cAotICAgIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgCi0gIGlmIChteWggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlICh0bXBfbmFtZSk7Ci0gICAgICByZXR1cm47IC8qIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGd1eSAqLwotICAgIH0KLQotICAvKiBUaGUgb25seSB0cmljayBoZXJlIGlzIHVzaW5nIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgYXMgdGhlIHZhbHVlLiBFdmVuCi0gICAgIHRob3VnaCB0aGUgc2VjdGlvbiBpc24ndCBhbGxvY2F0ZWQgeWV0LCB0aGlzIGlzIHdoZXJlIHdlIHdpbGwgYmUgcHV0dGluZwotICAgICBpdC4gICovCi0KLSAgYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIHRtcF9uYW1lLAotCQkJCUJTRl9HTE9CQUwsIAotCQkJCXMsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgKyAxLAotCQkJCU5VTEwsIHRydWUsIGZhbHNlLCAKLQkJCQkoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICYgbXloKTsKLSAgCi0gIGZyZWUgKHRtcF9uYW1lKTsKLSAgCi0gIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgKz0gQVJNMlRIVU1CX0dMVUVfU0laRTsKLQotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgICAgIGluZm87Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci17Ci0gIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICogICAgICAgICAgICAgICAgczsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfbmFtZTsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogICAgICBteWg7Ci0gIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiAgZ2xvYmFsczsKLQotICAKLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotICAKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0gICAgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgdG1wX25hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FKSArIDEpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0KLSAgbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAKLSAgaWYgKG15aCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHRtcF9uYW1lKTsKLSAgICAgIHJldHVybjsgLyogd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZ3V5ICovCi0gICAgfQotCi0gIGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKLQkJCQlCU0ZfR0xPQkFMLCBzLCBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUgKyAxLAotCQkJCU5VTEwsIHRydWUsIGZhbHNlLCAKLQkJCQkoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICYgbXloKTsKLSAgCi0gIC8qIElmIHdlIG1hcmsgaXQgJ3RodW1iJywgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIGRvIGEgYmV0dGVyIGpvYi4gICovCi0gIG15aC0+Y2xhc3MgPSBDX1RIVU1CRVhURlVOQzsKLQotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgLyogQWxsb2NhdGUgYW5vdGhlciBzeW1ib2wgdG8gbWFyayB3aGVyZSB3ZSBzd2l0Y2ggdG8gYXJtIG1vZGUuICAqLwotICAgICAgCi0jZGVmaW5lIENIQU5HRV9UT19BUk0gIl9fJXNfY2hhbmdlX3RvX2FybSIKLSNkZWZpbmUgQkFDS19GUk9NX0FSTSAiX18lc19iYWNrX2Zyb21fYXJtIgotICAKLSAgdG1wX25hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChDSEFOR0VfVE9fQVJNKSArIDEpOwotICAKLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotICAKLSAgc3ByaW50ZiAodG1wX25hbWUsIGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUgPyBCQUNLX0ZST01fQVJNIDogQ0hBTkdFX1RPX0FSTSwgbmFtZSk7Ci0KLSAgbXloID0gTlVMTDsKLSAgCi0gIGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKLQkJCQlCU0ZfTE9DQUwsIHMsIGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZQotCQkJCSsgKGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUgPyA4IDogNCksCi0JCQkJTlVMTCwgdHJ1ZSwgZmFsc2UsIAotCQkJCShzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJiBteWgpOwotCi0gIGZyZWUgKHRtcF9uYW1lKTsgIAotICAKLSAgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplICs9IFRIVU1CMkFSTV9HTFVFX1NJWkU7Ci0KLSAgcmV0dXJuOwotfQotCi0vKiBTZWxlY3QgYSBCRkQgdG8gYmUgdXNlZCB0byBob2xkIHRoZSBzZWN0aW9ucyB1c2VkIGJ5IHRoZSBnbHVlIGNvZGUuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0cyBpbiBsZC9lbXVsdGVtcGwvCi0gICB7YXJtY29mZi9wZX0uZW0gICovCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi1zdGF0aWMKLSNlbmRpZgotYm9vbGVhbgotYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqIAkJICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLXsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0gIGZsYWd3b3JkICAgCQkJICAgIGZsYWdzOwotICBhc2VjdGlvbiAqIAkJCSAgICBzZWM7Ci0gICAgCi0gIC8qIElmIHdlIGFyZSBvbmx5IHBlcmZvcm1pbmcgYSBwYXJ0aWFsIGxpbmsgZG8gbm90IGJvdGhlcgotICAgICBnZXR0aW5nIGEgYmZkIHRvIGhvbGQgdGhlIGdsdWUuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotICAKLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotICAKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLQotICBpZiAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotICAKLSAgaWYgKHNlYyA9PSBOVUxMKSAKLSAgICB7Ci0gICAgICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7Ci0gICAgICAKLSAgICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0gICAgICAKLSAgICAgIGlmIChzZWMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywgZmxhZ3MpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlYywgMikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBpZiAoc2VjID09IE5VTEwpIAotICAgIHsKLSAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWTsKLSAgICAgIAotICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLSAgICAgIAotICAgICAgaWYgKHNlYyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLCBmbGFncykKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAKLSAgLyogU2F2ZSB0aGUgYmZkIGZvciBsYXRlciB1c2UuICAqLwotICBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciA9IGFiZmQ7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotc3RhdGljCi0jZW5kaWYKLWJvb2xlYW4KLWJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoYWJmZCwgaW5mbywgc3VwcG9ydF9vbGRfY29kZSkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgaW5mbzsKLSAgICAgaW50CQkgICAgIHN1cHBvcnRfb2xkX2NvZGU7Ci17Ci0gIGFzZWN0aW9uICogc2VjOwotICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQotICAvKiBJZiB3ZSBhcmUgb25seSBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rIGRvIG5vdCBib3RoZXIKLSAgICAgdG8gY29uc3RydWN0IGFueSBnbHVlLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIC8qIEhlcmUgd2UgaGF2ZSBhIGJmZCB0aGF0IGlzIHRvIGJlIGluY2x1ZGVkIG9uIHRoZSBsaW5rLiAgV2UgaGF2ZSBhIGhvb2sKLSAgICAgdG8gZG8gcmVsb2MgcnVtbWFnaW5nLCBiZWZvcmUgc2VjdGlvbiBzaXplcyBhcmUgbmFpbGVkIGRvd24uICAqLwotCi0gIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCk7Ci0KLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotICAKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgZ2xvYmFscy0+c3VwcG9ydF9vbGRfY29kZSA9IHN1cHBvcnRfb2xkX2NvZGU7Ci0gIAotICAvKiBSdW1tYWdlIGFyb3VuZCBhbGwgdGhlIHJlbG9jcyBhbmQgbWFwIHRoZSBnbHVlIHZlY3RvcnMuICAqLwotICBzZWMgPSBhYmZkLT5zZWN0aW9uczsKLQotICBpZiAoc2VjID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZm9yICg7IHNlYyAhPSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICogaTsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbDsKLQotICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPT0gMCkgCi0JY29udGludWU7Ci0KLSAgICAgIC8qIExvYWQgdGhlIHJlbG9jcy4gICovCi0gICAgICAvKiBGSVhNRTogdGhlcmUgbWF5IGJlIGEgc3RvcmFnZSBsZWFrIGhlcmUuICovCi0gICAgICAKLSAgICAgIGkgPSBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKGFiZmQsIHNlYywgMSwgMCwgMCwgMCk7Ci0gICAgCi0gICAgICBCRkRfQVNTRVJUIChpICE9IDApOwotCi0gICAgICBmb3IgKHJlbCA9IGk7IHJlbCA8IGkgKyBzZWMtPnJlbG9jX2NvdW50OyArK3JlbCkgCi0JewotCSAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgIHJfdHlwZSAgPSByZWwtPnJfdHlwZTsKLQkgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1uZHg7Ci0JICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiAgaDsKLQotCSAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotCSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgbm90IGFnYWluc3QgYSBzeW1ib2wgaXQgY2Fubm90IGNvbmNlcm4gdXMuICovCi0JICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICBjb250aW51ZTsKLQotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGFiZmQpW3N5bW5keF07Ci0KLQkgIC8qIElmIHRoZSByZWxvY2F0aW9uIGlzIGFnYWluc3QgYSBzdGF0aWMgc3ltYm9sIGl0IG11c3QgYmUgd2l0aGluCi0JICAgICB0aGUgY3VycmVudCBzZWN0aW9uIGFuZCBzbyBjYW5ub3QgYmUgYSBjcm9zcyBBUk0vVGh1bWIgcmVsb2NhdGlvbi4gICovCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgc3dpdGNoIChyX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBBUk1fMjY6Ci0JICAgICAgLyogVGhpcyBvbmUgaXMgYSBjYWxsIGZyb20gYXJtIGNvZGUuICBXZSBuZWVkIHRvIGxvb2sgdXAKLQkJIHRoZSB0YXJnZXQgb2YgdGhlIGNhbGwuIElmIGl0IGlzIGEgdGh1bWIgdGFyZ2V0LCB3ZQotCQkgaW5zZXJ0IGdsdWUuICAqLwotCSAgICAgIAotCSAgICAgIGlmIChoLT5jbGFzcyA9PSBDX1RIVU1CRVhURlVOQykKLQkJcmVjb3JkX2FybV90b190aHVtYl9nbHVlIChpbmZvLCBoKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBBUk1fVEhVTUIyMzoKLQkgICAgICAvKiBUaGlzIG9uZSBpcyBhIGNhbGwgZnJvbSB0aHVtYiBjb2RlLiAgV2UgdXNlZCB0byBsb29rCi0JCSBmb3IgQVJNX1RIVU1COSBhbmQgQVJNX1RIVU1CMTIgYXMgd2VsbC4gIFdlIG5lZWQgdG8gbG9vawotCQkgdXAgdGhlIHRhcmdldCBvZiB0aGUgY2FsbC4gSWYgaXQgaXMgYW4gYXJtIHRhcmdldCwgd2UKLQkJIGluc2VydCBnbHVlLiAgSWYgdGhlIHN5bWJvbCBkb2VzIG5vdCBleGlzdCBpdCB3aWxsIGJlCi0JCSBnaXZlbiBhIGNsYXNzIG9mIENfRVhUIGFuZCBzbyB3ZSB3aWxsIGdlbmVyYXRlIGEgc3R1YgotCQkgZm9yIGl0LiAgVGhpcyBpcyBub3QgcmVhbGx5IGEgcHJvYmxlbSwgc2luY2UgdGhlIGxpbmsKLQkJIGlzIGRvb21lZCBhbnl3YXkuICAqLwotCi0JICAgICAgc3dpdGNoIChoLT5jbGFzcykKLQkJewotCQljYXNlIENfRVhUOgotCQljYXNlIENfU1RBVDoKLQkJY2FzZSBDX0xBQkVMOgotCQkgIHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSAoaW5mbywgaCk7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIAkJY29mZl9hcm1fcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIAkJCWNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAJCWNvZmZfYXJtX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgY29mZl9hZGp1c3Rfc3ltbmR4CQkJY29mZl9hcm1fYWRqdXN0X3N5bW5keAotI2RlZmluZSBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biAJCWNvZmZfYXJtX2xpbmtfb3V0cHV0X2hhc19iZWd1bgotI2RlZmluZSBjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdAkJY29mZl9hcm1fZmluYWxfbGlua19wb3N0c2NyaXB0Ci0jZGVmaW5lIGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEJCWNvZmZfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQkJY29mZl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyAgICAgICAgICAgICAgX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgICAgICAgICAgY29mZl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUJCWNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLQotCi0vKiBXaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdlIHdhbnQgdG8gY29udmVydCBBUk0yNiByZWxvY3MKLSAgIGludG8gQVJNMjZEIHJlbG9jcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9hZGp1c3Rfc3ltbmR4IChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIGlyZWwsIGFkanVzdGVkcCkKLSAgICAgYmZkICpvYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gICAgIGJvb2xlYW4gKmFkanVzdGVkcDsKLXsKLSAgaWYgKGlyZWwtPnJfdHlwZSA9PSAzKQotICAgIHsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGliZmQpW2lyZWwtPnJfc3ltbmR4XTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gc2VjLT5vdXRwdXRfc2VjdGlvbikKLQlpcmVsLT5yX3R5cGUgPSA3OwotICAgIH0KLSAgKmFkanVzdGVkcCA9IGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2FsbGVkIHdoZW4gbWVyZ2luZyB0aGUgcHJpdmF0ZSBkYXRhIGFyZWFzIG9mIHR3byBCRkRzLgotICAgVGhpcyBpcyBpbXBvcnRhbnQgYXMgaXQgYWxsb3dzIHVzIHRvIGRldGVjdCBpZiB3ZSBhcmUKLSAgIGF0dGVtcHRpbmcgdG8gbWVyZ2UgYmluYXJpZXMgY29tcGlsZWQgZm9yIGRpZmZlcmVudCBBUk0KLSAgIHRhcmdldHMsIGVnIGRpZmZlcmVudCBDUFVzIG9yIGRpZmZlcmVudHMgQVBDUydzLiAgICAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqICAgaWJmZDsKLSAgICAgYmZkICogICBvYmZkOwotewotICBCRkRfQVNTRVJUIChpYmZkICE9IE5VTEwgJiYgb2JmZCAhPSBOVUxMKTsKLQotICBpZiAoaWJmZCA9PSBvYmZkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZSB0d28gZm9ybWF0cyBhcmUgZGlmZmVyZW50IHdlIGNhbm5vdCBtZXJnZSBhbnl0aGluZy4KLSAgICAgVGhpcyBpcyBub3QgYW4gZXJyb3IsIHNpbmNlIGl0IGlzIHBlcm1pc3NhYmxlIHRvIGNoYW5nZSB0aGUKLSAgICAgaW5wdXQgYW5kIG91dHB1dCBmb3JtYXRzLiAgKi8KLSAgaWYgKCAgIGliZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IG9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVmVyaWZ5IHRoYXQgdGhlIEFQQ1MgaXMgdGhlIHNhbWUgZm9yIHRoZSB0d28gQkZEcyAqLwotICBpZiAoQVBDU19TRVQgKGliZmQpKQotICAgIHsKLSAgICAgIGlmIChBUENTX1NFVCAob2JmZCkpCi0JewotCSAgLyogSWYgdGhlIHNyYyBhbmQgZGVzdCBoYXZlIGRpZmZlcmVudCBBUENTIGZsYWcgYml0cyBzZXQsIGZhaWwuICAqLwotCSAgaWYgKEFQQ1NfMjZfRkxBRyAob2JmZCkgIT0gQVBDU18yNl9GTEFHIChpYmZkKSkKLQkgICAgewotCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQkJKF8oIiVzOiBFUlJPUjogY29tcGlsZWQgZm9yIEFQQ1MtJWQgd2hlcmVhcyB0YXJnZXQgJXMgdXNlcyBBUENTLSVkIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwgQVBDU18yNl9GTEFHIChpYmZkKSA/IDI2IDogMzIsCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwgQVBDU18yNl9GTEFHIChvYmZkKSA/IDI2IDogMzIKLQkJICk7Ci0KLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIAotCSAgaWYgKEFQQ1NfRkxPQVRfRkxBRyAob2JmZCkgIT0gQVBDU19GTE9BVF9GTEFHIChpYmZkKSkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm1zZzsKLQotCSAgICAgIGlmIChBUENTX0ZMT0FUX0ZMQUcgKGliZmQpKQotCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQkJbXNnID0gXygiJXM6IEVSUk9SOiBwYXNzZXMgZmxvYXRzIGluIGZsb2F0IHJlZ2lzdGVycyB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIGludGVnZXIgcmVnaXN0ZXJzIik7Ci0JICAgICAgZWxzZQotCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQkJbXNnID0gXygiJXM6IEVSUk9SOiBwYXNzZXMgZmxvYXRzIGluIGludGVnZXIgcmVnaXN0ZXJzIHdoZXJlYXMgdGFyZ2V0ICVzIHVzZXMgZmxvYXQgcmVnaXN0ZXJzIik7Ci0JICAgICAgCi0JICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyIChtc2csIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCQkJCSAgYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICAKLQkgIGlmIChQSUNfRkxBRyAob2JmZCkgIT0gUElDX0ZMQUcgKGliZmQpKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqIG1zZzsKLQotCSAgICAgIGlmIChQSUNfRkxBRyAoaWJmZCkpCi0JCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCQltc2cgPSBfKCIlczogRVJST1I6IGNvbXBpbGVkIGFzIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHdoZXJlYXMgdGFyZ2V0ICVzIGlzIGFic29sdXRlIHBvc2l0aW9uIik7Ci0JICAgICAgZWxzZQotCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQkJbXNnID0gXygiJXM6IEVSUk9SOiBjb21waWxlZCBhcyBhYnNvbHV0ZSBwb3NpdGlvbiBjb2RlLCB3aGVyZWFzIHRhcmdldCAlcyBpcyBwb3NpdGlvbiBpbmRlcGVuZGVudCIpOwotCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlciAobXNnLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkJCQkgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBTRVRfQVBDU19GTEFHUyAob2JmZCwgQVBDU18yNl9GTEFHIChpYmZkKSB8IEFQQ1NfRkxPQVRfRkxBRyAoaWJmZCkgfCBQSUNfRkxBRyAoaWJmZCkpOwotCSAgCi0JICAvKiBTZXQgdXAgdGhlIGFyY2ggYW5kIGZpZWxkcyBhcyB3ZWxsIGFzIHRoZXNlIGFyZSBwcm9iYWJseSB3cm9uZy4gICovCi0JICBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwgYmZkX2dldF9tYWNoIChpYmZkKSk7Ci0JfQotICAgIH0KLQotICAvKiBDaGVjayB0aGUgaW50ZXJ3b3JraW5nIHN1cHBvcnQuICAqLwotICBpZiAoSU5URVJXT1JLX1NFVCAoaWJmZCkpCi0gICAgewotICAgICAgaWYgKElOVEVSV09SS19TRVQgKG9iZmQpKQotCXsKLQkgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgZGlmZmVyIGluIHRoZWlyIGludGVyd29ya2luZyBpc3N1ZSBhIHdhcm5pbmcuICAqLwotCSAgaWYgKElOVEVSV09SS19GTEFHIChvYmZkKSAhPSBJTlRFUldPUktfRkxBRyAoaWJmZCkpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICogbXNnOwotCi0JICAgICAgaWYgKElOVEVSV09SS19GTEFHIChpYmZkKSkKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCW1zZyA9IF8oIldhcm5pbmc6IGlucHV0IGZpbGUgJXMgc3VwcG9ydHMgaW50ZXJ3b3JraW5nLCB3aGVyZWFzICVzIGRvZXMgbm90LiIpOwotCSAgICAgIGVsc2UKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCW1zZyA9IF8oIldhcm5pbmc6IGlucHV0IGZpbGUgJXMgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcndvcmtpbmcsIHdoZXJlYXMgJXMgZG9lcy4iKTsKLQkgICAgICAKLQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKG1zZywgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgU0VUX0lOVEVSV09SS19GTEFHIChvYmZkLCBJTlRFUldPUktfRkxBRyAoaWJmZCkpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKQotICAgICBiZmQgKiAgIGFiZmQ7Ci0gICAgIFBUUiAgICAgcHRyOwotewotICBGSUxFICogZmlsZSA9IChGSUxFICopIHB0cjsKLSAgCi0gIEJGRF9BU1NFUlQgKGFiZmQgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCk7Ci0gIAotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfKCJwcml2YXRlIGZsYWdzID0gJXg6IiksIGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzKTsKLSAgCi0gIGlmIChBUENTX1NFVCAoYWJmZCkpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6IEFQQ1MgaXMgQVJNIFByb2RlY3VyZSBDYWxsIFN0YW5kYXJkLCBpdCBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQuICAqLwotICAgICAgZnByaW50ZiAoZmlsZSwgIiBbQVBDUy0lZF0iLCBBUENTXzI2X0ZMQUcgKGFiZmQpID8gMjYgOiAzMik7Ci0KLSAgICAgIGlmIChBUENTX0ZMT0FUX0ZMQUcgKGFiZmQpKQotCWZwcmludGYgKGZpbGUsIF8oIiBbZmxvYXRzIHBhc3NlZCBpbiBmbG9hdCByZWdpc3RlcnNdIikpOwotICAgICAgZWxzZQotCWZwcmludGYgKGZpbGUsIF8oIiBbZmxvYXRzIHBhc3NlZCBpbiBpbnRlZ2VyIHJlZ2lzdGVyc10iKSk7Ci0KLSAgICAgIGlmIChQSUNfRkxBRyAoYWJmZCkpCi0JZnByaW50ZiAoZmlsZSwgXygiIFtwb3NpdGlvbiBpbmRlcGVuZGVudF0iKSk7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoZmlsZSwgXygiIFthYnNvbHV0ZSBwb3NpdGlvbl0iKSk7Ci0gICAgfQotICAKLSAgaWYgKCEgSU5URVJXT1JLX1NFVCAoYWJmZCkpCi0gICAgZnByaW50ZiAoZmlsZSwgXygiIFtpbnRlcndvcmtpbmcgZmxhZyBub3QgaW5pdGlhbGlzZWRdIikpOwotICBlbHNlIGlmIChJTlRFUldPUktfRkxBRyAoYWJmZCkpCi0gICAgZnByaW50ZiAoZmlsZSwgXygiIFtpbnRlcndvcmtpbmcgc3VwcG9ydGVkXSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8oIiBbaW50ZXJ3b3JraW5nIG5vdCBzdXBwb3J0ZWRdIikpOwotICAKLSAgZnB1dGMgKCdcbicsIGZpbGUpOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQ29waWVzIHRoZSBnaXZlbiBmbGFncyBpbnRvIHRoZSBjb2ZmX3RkYXRhLmZsYWdzIGZpZWxkLgotICAgVHlwaWNhbGx5IHRoZXNlIGZsYWdzIGNvbWUgZnJvbSB0aGUgZl9mbGFnc1tdIGZpZWxkIG9mCi0gICB0aGUgQ09GRiBmaWxlaGRyIHN0cnVjdHVyZSwgd2hpY2ggY29udGFpbnMgaW1wb3J0YW50LAotICAgdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uLgotICAgTm90ZTogQWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBpcyBzdGF0aWMsIGl0IGlzIGV4cGxpY2l0bHkKLSAgIGNhbGxlZCBmcm9tIGJvdGggY29mZmNvZGUuaCBhbmQgcGVpY29kZS5oLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLV9iZmRfY29mZl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotCWJmZCAqCSAgIGFiZmQ7Ci0JZmxhZ3dvcmQgICBmbGFnczsKLXsKLSAgZmxhZ3dvcmQgZmxhZzsKLQotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwpOwotCi0gIGZsYWcgPSAoZmxhZ3MgJiBGX0FQQ1MyNikgPyBGX0FQQ1NfMjYgOiAwOwotICAKLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIEFQQ1MgZmllbGQgaGFzIG5vdCBiZWVuIGluaXRpYWxpc2VkIHRvIHRoZSBvcHBvc2l0ZQotICAgICB2YWx1ZS4gICovCi0gIGlmIChBUENTX1NFVCAoYWJmZCkKLSAgICAgICYmICggICAoQVBDU18yNl9GTEFHICAgIChhYmZkKSAhPSBmbGFnKQotCSAgfHwgKEFQQ1NfRkxPQVRfRkxBRyAoYWJmZCkgIT0gKGZsYWdzICYgRl9BUENTX0ZMT0FUKSkKLQkgIHx8IChQSUNfRkxBRyAgICAgICAgKGFiZmQpICE9IChmbGFncyAmIEZfUElDKSkKLQkgICkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZsYWcgfD0gKGZsYWdzICYgKEZfQVBDU19GTE9BVCB8IEZfUElDKSk7Ci0gIAotICBTRVRfQVBDU19GTEFHUyAoYWJmZCwgZmxhZyk7Ci0KLSAgZmxhZyA9IChmbGFncyAmIEZfSU5URVJXT1JLKTsKLSAgCi0gIC8qIElmIHRoZSBCRkQgaGFzIGFscmVhZHkgaGFkIGl0cyBpbnRlcndvcmtpbmcgZmxhZyBzZXQsIGJ1dCBpdAotICAgICBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgdmFsdWUgdGhhdCB3ZSBoYXZlIGJlZW4gYXNrZWQgdG8gc2V0LAotICAgICB0aGVuIGFzc3VtZSB0aGF0IHRoYXQgbWVyZ2VkIGNvZGUgd2lsbCBub3Qgc3VwcG9ydCBpbnRlcndvcmtpbmcKLSAgICAgYW5kIHNldCB0aGUgZmxhZyBhY2NvcmRpbmdseS4gICovCi0gIGlmIChJTlRFUldPUktfU0VUIChhYmZkKSAmJiAoSU5URVJXT1JLX0ZMQUcgKGFiZmQpICE9IGZsYWcpKQotICAgIHsKLSAgICAgIGlmIChmbGFnKQotCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCV9iZmRfZXJyb3JfaGFuZGxlciAoXygiV2FybmluZzogTm90IHNldHRpbmcgaW50ZXJ3b3JraW5nIGZsYWcgb2YgJXMsIHNpbmNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkIGFzIG5vbi1pbnRlcndvcmtpbmciKSwKLQkJCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBlbHNlCi0JLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JX2JmZF9lcnJvcl9oYW5kbGVyIChfKCJXYXJuaW5nOiBDbGVhcmluZyB0aGUgaW50ZXJ3b3JraW5nIGZsYWcgb2YgJXMgZHVlIHRvIG91dHNpZGUgcmVxdWVzdCIpLAotCQkJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGZsYWcgPSAwOwotICAgIH0KLQotICBTRVRfSU5URVJXT1JLX0ZMQUcgKGFiZmQsIGZsYWcpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIENvcHkgdGhlIGltcG9ydGFudCBwYXJ0cyBvZiB0aGUgdGFyZ2V0IHNwZWNpZmljIGRhdGEKLSAgIGZyb20gb25lIGluc3RhbmNlIG9mIGEgQkZEIHRvIGFub3RoZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhIChzcmMsIGRlc3QpCi0gICAgIGJmZCAqICBzcmM7Ci0gICAgIGJmZCAqICBkZXN0OwotewotICBCRkRfQVNTRVJUIChzcmMgIT0gTlVMTCAmJiBkZXN0ICE9IE5VTEwpOwotIAotICBpZiAoc3JjID09IGRlc3QpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhlIGRlc3RpbmF0aW9uIGlzIG5vdCBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHNvdXJjZSwgZG8gbm90IGRvCi0gICAgIHRoZSBjb3B5LiAgKi8KLSAgaWYgKHNyYy0+eHZlYyAhPSBkZXN0LT54dmVjKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIGNvcHkgdGhlIGZsYWdzIGZpZWxkICovCi0gIGlmIChBUENTX1NFVCAoc3JjKSkKLSAgICB7Ci0gICAgICBpZiAoQVBDU19TRVQgKGRlc3QpKQotCXsKLQkgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgaGF2ZSBkaWZmZXJlbnQgQVBDUyBmbGFnIGJpdHMgc2V0LCBmYWlsLiAgKi8KLQkgIGlmIChBUENTXzI2X0ZMQUcgKGRlc3QpICE9IEFQQ1NfMjZfRkxBRyAoc3JjKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgCi0JICBpZiAoQVBDU19GTE9BVF9GTEFHIChkZXN0KSAhPSBBUENTX0ZMT0FUX0ZMQUcgKHNyYykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIAotCSAgaWYgKFBJQ19GTEFHIChkZXN0KSAhPSBQSUNfRkxBRyAoc3JjKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQlTRVRfQVBDU19GTEFHUyAoZGVzdCwgQVBDU18yNl9GTEFHIChzcmMpIHwgQVBDU19GTE9BVF9GTEFHIChzcmMpCi0JCQl8IFBJQ19GTEFHIChzcmMpKTsKLSAgICB9Ci0KLSAgaWYgKElOVEVSV09SS19TRVQgKHNyYykpCi0gICAgewotICAgICAgaWYgKElOVEVSV09SS19TRVQgKGRlc3QpKQotCXsKLQkgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgaGF2ZSBkaWZmZXJlbnQgaW50ZXJ3b3JraW5nIGZsYWdzIHRoZW4gdHVybgotCSAgICAgb2ZmIHRoZSBpbnRlcndvcmtpbmcgYml0LiAgKi8KLQkgIGlmIChJTlRFUldPUktfRkxBRyAoZGVzdCkgIT0gSU5URVJXT1JLX0ZMQUcgKHNyYykpCi0JICAgIHsKLQkgICAgICBpZiAoSU5URVJXT1JLX0ZMQUcgKGRlc3QpKQotCQl7Ci0JCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJICBfYmZkX2Vycm9yX2hhbmRsZXIgKCgiV2FybmluZzogQ2xlYXJpbmcgdGhlIGludGVyd29ya2luZyBiaXQgb2YgJXMsIGJlY2F1c2UgdGhlIG5vbi1pbnRlcndvcmtpbmcgY29kZSBpbiAlcyBoYXMgYmVlbiBjb3BpZWQgaW50byBpdCIpLAotCQkJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGRlc3QpLAotCQkJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKHNyYykpOwotCQl9Ci0JICAgICAgCi0JICAgICAgU0VUX0lOVEVSV09SS19GTEFHIChkZXN0LCAwKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBTRVRfSU5URVJXT1JLX0ZMQUcgKGRlc3QsIElOVEVSV09SS19GTEFHIChzcmMpKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBOb3RlOiAgdGhlIGRlZmluaXRpb25zIGhlcmUgb2YgTE9DQUxfTEFCRUxfUFJFRklYIGFuZCBVU0VSX0xBQkVMX1BSRUlGWAotICptdXN0KiBtYXRjaCB0aGUgZGVmaW5pdGlvbnMgaW4gZ2NjL2NvbmZpZy9hcm0vY29mZi5oIGFuZCBzZW1pLmggKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxfUFJFRklYICIuIgotI2lmbmRlZiBVU0VSX0xBQkVMX1BSRUZJWAotI2RlZmluZSBVU0VSX0xBQkVMX1BSRUZJWCAiXyIKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hcm1faXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICogICAgICAgIGFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKiBuYW1lOwotewotI2lmZGVmIExPQ0FMX0xBQkVMX1BSRUZJWAotICAvKiBJZiB0aGVyZSBpcyBhIHByZWZpeCBmb3IgbG9jYWwgbGFiZWxzIHRoZW4gbG9vayBmb3IgdGhpcy4KLSAgICAgSWYgdGhlIHByZWZpeCBleGlzdHMsIGJ1dCBpdCBpcyBlbXB0eSwgdGhlbiBpZ25vcmUgdGhlIHRlc3QuICovCi0gIAotICBpZiAoTE9DQUxfTEFCRUxfUFJFRklYWzBdICE9IDApCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsIExPQ0FMX0xBQkVMX1BSRUZJWCwgc3RybGVuIChMT0NBTF9MQUJFTF9QUkVGSVgpKSA9PSAwKQotCXJldHVybiB0cnVlOwotICAgIH0KLSNlbmRpZgotI2lmZGVmIFVTRVJfTEFCRUxfUFJFRklYCi0gIGlmIChVU0VSX0xBQkVMX1BSRUZJWFswXSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCBVU0VSX0xBQkVMX1BSRUZJWCwgc3RybGVuIChVU0VSX0xBQkVMX1BSRUZJWCkpID09IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotICAKLSAgLyogZGV2by9nY2MvY29uZmlnL2RieGNvZmYuaCBkZWZpbmVzIEFTTV9PVVRQVVRfU09VUkNFX0xJTkUgdG8gZ2VuZXJhdGUKLSAgICAgbG9jYWwgbGluZSBudW1iZXJzIGFzIC5MTTxudW1iZXI+LCBzbyB0cmVhdCB0aGVzZSBhcyBsb2NhbC4gICovCi0gIAotICBzd2l0Y2ggKG5hbWVbMF0pCi0gICAgewotICAgIGNhc2UgJ0wnOiByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlICcuJzogcmV0dXJuIChuYW1lWzFdID09ICdMJyAmJiBuYW1lWzJdID09ICdNJykgPyB0cnVlIDogZmFsc2U7Ci0gICAgZGVmYXVsdDogIHJldHVybiBmYWxzZTsgICAgIC8qIENhbm5vdCBtYWtlIG91ciBtaW5kcyB1cCAtIGRlZmF1bHQgdG8KLQkJCQkgICBmYWxzZSBzbyB0aGF0IGl0IHdpbGwgbm90IGJlIHN0cmlwcGVkCi0JCQkJICAgYnkgYWNjaWRlbnQuICAqLyAKLSAgICB9Ci19Ci0KLS8qIFRoaXMgcGllY2Ugb2YgbWFjaGluZXJ5IGV4aXN0cyBvbmx5IHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBiZmQgdGhhdCBob2xkcwotICAgdGhlIGdsdWUgc2VjdGlvbiBpcyB3cml0dGVuIGxhc3QuIAotCi0gICBUaGlzIGRvZXMgZGVwZW5kIG9uIGJmZF9tYWtlX3NlY3Rpb24gYXR0YWNoaW5nIGEgbmV3IHNlY3Rpb24gdG8gdGhlCi0gICBlbmQgb2YgdGhlIHNlY3Rpb24gbGlzdCBmb3IgdGhlIGJmZC4gCi0KLSAgIGtya0BjeWdudXMuY29tICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hcm1fbGlua19vdXRwdXRfaGFzX2JlZ3VuIChzdWIsIGluZm8pCi0gICAgIGJmZCAqIHN1YjsKLSAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogaW5mbzsKLXsKLSAgcmV0dXJuIChzdWItPm91dHB1dF9oYXNfYmVndW4KLQkgIHx8IHN1YiA9PSBjb2ZmX2FybV9oYXNoX3RhYmxlIChpbmZvLT5pbmZvKS0+YmZkX29mX2dsdWVfb3duZXIpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hcm1fZmluYWxfbGlua19wb3N0c2NyaXB0IChhYmZkLCBwZmluZm8pCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbzsKLXsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKHBmaW5mby0+aW5mbyk7Ci0gIAotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICAKLSAgaWYgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkIChwZmluZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgICAgIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICB9Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmIDAKLSNkZWZpbmUgY29mZl9TV0FQX3N5bV9pbiAgYXJtX2JmZF9jb2ZmX3N3YXBfc3ltX2luCi0KLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9zeW1faW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci0KLS8qIFNlcGNpYWwgdmVyc2lvbiBvZiBzeW1ib2wgc3dhcHBlciwgdXNlZCB0byBncmFiIGEgYmZkCi0gICBvbnRvIHdoaWNoIHRoZSBnbHVlIHNlY3Rpb25zIGNhbiBiZSBhdHRhY2hlZC4gICovCi1zdGF0aWMgdm9pZAotYXJtX2JmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCBleHQxLCBpbjEpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIFBUUiAgIGV4dDE7Ci0gICAgIFBUUiAgIGluMTsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICogczsKLQotICAvKiBEbyB0aGUgbm9ybWFsIHN3YXAgaW4uICAqLwotICBjb2ZmX3N3YXBfc3ltX2luIChhYmZkLCBleHQxLCBpbjEpOwotCi0gIGlmIChiZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKSAvKiB3ZSBhbHJlYWR5IGhhdmUgYSB0b2MsIHNvIGdvIGhvbWUgKi8KLSAgICByZXR1cm47Ci0KLSAgLyogU2F2ZSB0aGUgYmZkIGZvciBsYXRlciBhbGxvY2F0aW9uLiAgKi8KLSAgYmZkX29mX2dsdWVfb3duZXIgPSBhYmZkOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYmZkX29mX2dsdWVfb3duZXIgLCAKLQkJCSAgICAgICBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIGlmIChzID09IE5VTEwpIAotICAgIHsKLSAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSA7Ci0gICAgICAKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChiZmRfb2ZfZ2x1ZV9vd25lciwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYmZkX29mX2dsdWVfb3duZXIsIHMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGJmZF9vZl9nbHVlX293bmVyLCBzLCAyKSkKLQl7Ci0JICAvKiBGSVhNRTogc2V0IGFwcHJvcHJpYXRlIGJmZCBlcnJvciAqLwotCSAgYWJvcnQoKTsKLQl9Ci0gICAgfQotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYmZkX29mX2dsdWVfb3duZXIsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgaWYgKHMgPT0gTlVMTCkgCi0gICAgewotICAgICAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZIDsKLSAgICAgIAotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGJmZF9vZl9nbHVlX293bmVyLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotICAgICAgCi0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChiZmRfb2ZfZ2x1ZV9vd25lciwgcywgZmxhZ3MpCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYmZkX29mX2dsdWVfb3duZXIsIHMsIDIpKQotCXsKLQkgIC8qIEZJWE1FOiBzZXQgYXBwcm9wcmlhdGUgYmZkIGVycm9yIGtya0BjeWdudXMuY29tICovCi0JICBhYm9ydCgpOwotCX0KLSAgICB9Ci0gIAotICByZXR1cm47Ci19Ci0jZW5kaWYKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLWNvbnN0IGJmZF90YXJnZXQKLSNpZmRlZiBUQVJHRVRfTElUVExFX1NZTQotVEFSR0VUX0xJVFRMRV9TWU0gPQotI2Vsc2UKLWFybWNvZmZfbGl0dGxlX3ZlYyA9Ci0jZW5kaWYKLXsKLSNpZmRlZiBUQVJHRVRfTElUVExFX05BTUUKLSAgVEFSR0VUX0xJVFRMRV9OQU1FLAotI2Vsc2UKLSAgImNvZmYtYXJtLWxpdHRsZSIsCi0jZW5kaWYKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSNlbHNlCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLwotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0jZW5kaWYKLQotI2lmZGVmIFRBUkdFVF9VTkRFUlNDT1JFCi0gIFRBUkdFVF9VTkRFUlNDT1JFLAkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0jZWxzZQotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSNlbmRpZgotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0vKiBOb3RlIHRoYXQgd2UgYWxsb3cgYW4gb2JqZWN0IGZpbGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvcmUgZmlsZSBhcyB3ZWxsLiAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgY29mZl9vYmplY3RfcH0sCi0gICAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAmIGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlLAotfTsKLQotY29uc3QgYmZkX3RhcmdldAotI2lmZGVmIFRBUkdFVF9CSUdfU1lNCi1UQVJHRVRfQklHX1NZTSA9Ci0jZWxzZQotYXJtY29mZl9iaWdfdmVjID0KLSNlbmRpZgotewotI2lmZGVmIFRBUkdFVF9CSUdfTkFNRQotICBUQVJHRVRfQklHX05BTUUsCi0jZWxzZQotICAiY29mZi1hcm0tYmlnIiwKLSNlbmRpZgotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotI2Vsc2UKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAvKiBzZWN0aW9uIGZsYWdzICovCi0gICB8IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKSwKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX1VOREVSU0NPUkUKLSAgVEFSR0VUX1VOREVSU0NPUkUsCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSNlbHNlCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotI2VuZGlmCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLS8qIE5vdGUgdGhhdCB3ZSBhbGxvdyBhbiBvYmplY3QgZmlsZSB0byBiZSB0cmVhdGVkIGFzIGEgY29yZSBmaWxlIGFzIHdlbGwuICovCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBjb2ZmX29iamVjdF9wfSwKLSAgICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpICYgYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtYXV4LmMgYi9iZmQvY29mZi1hdXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk2NjM5Mi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1hdXguYworKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFwcGxlIE02OEsgQ09GRiBBL1VYIDMueCBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1Pi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JbTY4a2F1eF9jb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkiY29mZi1tNjhrLWF1eCIKLQotI2lmbmRlZiBUQVJHX0FVWAotI2RlZmluZSBUQVJHX0FVWAotI2VuZGlmCi0KLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotCi0vKiA0ayBwYWdlcyAqLwotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAweDEwMDAKLQotLyogT24gQVVYLCBhIFNUWVBfTk9MT0FEfFNUWVBfQlNTIHNlY3Rpb24gaXMgcGFydCBvZiBhIHNoYXJlZCBsaWJyYXJ5LiAqLwotI2RlZmluZSBCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZCi0KLSNkZWZpbmUgU1RBVElDX1JFTE9DUwotCi0jZGVmaW5lIENPRkZfQ09NTU9OX0FEREVORAotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfbTY4a19hdXhfbGlua19hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgCi0gICAgICAgICAgIGFzZWN0aW9uICosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwgCi0gICAgICAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci0KLSNkZWZpbmUgY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sIGNvZmZfbTY4a19hdXhfbGlua19hZGRfb25lX3N5bWJvbAotCi0jaW5jbHVkZSAiY29mZi9hdXgtY29mZi5oIiAgLyogb3ZlcnJpZGUgY29mZi9pbnRlcm5hbC5oIGFuZCBjb2ZmL202OGsuaCAqLwotI2luY2x1ZGUgImNvZmYtbTY4ay5jIgotCi0vKiBXZSBuZWVkIG5vbi1hYnNvbHV0ZSBzeW1ib2xzIHRvIG92ZXJyaWRlIGFic29sdXRlIHN5bWJvbHMuICBUaGlzCi0gICBtaXJyb3JzIEFwcGxlJ3MgInNvbHV0aW9uIiB0byBsZXQgYSBzdGF0aWMgbGlicmFyeSBzeW1ib2wgb3ZlcnJpZGUKLSAgIGEgc2hhcmVkIGxpYnJhcnkgc3ltYm9sLiAgT24gdGhlIHdob2xlIG5vdCBhIGdvb2QgdGhpbmcsIGdpdmVuIGhvdwotICAgc2hhcmVkIGxpYnJhcmllcyB3b3JrIGhlcmUsIGJ1dCBjYW4gd29yayBpZiB5b3UgYXJlIGNhcmVmdWwgd2l0aAotICAgd2hhdCB5b3UgaW5jbHVkZSBpbiB0aGUgc2hhcmVkIG9iamVjdC4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfbTY4a19hdXhfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLAotCQkJCSAgIHN0cmluZywgY29weSwgY29sbGVjdCwgaGFzaHApCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNvcHk7Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocDsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgaWYgKChmbGFncyAmIChCU0ZfV0FSTklORyB8IEJTRl9DT05TVFJVQ1RPUiB8IEJTRl9XRUFLKSkgPT0gMCAmJgotICAgICAgIWJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikgJiYKLSAgICAgICFiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIFRoZSBuZXcgc3ltYm9sIGlzIGEgZGVmaW5pdGlvbiBvciBhbiBpbmRpcmVjdCBkZWZpbml0aW9uICovCi0KLSAgICAgIC8qIFRoaXMgYml0IGNvcGllZCBmcm9tIGxpbmtlci5jICovCi0gICAgICBpZiAoaGFzaHAgIT0gTlVMTCAmJiAqaGFzaHAgIT0gTlVMTCkKLQl7Ci0JICBoID0gKmhhc2hwOwotCSAgQkZEX0FTU0VSVCAoc3RyY21wIChoLT5yb290LnN0cmluZywgbmFtZSkgPT0gMCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbmFtZSwgdHJ1ZSwgY29weSwgZmFsc2UpOwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChoYXNocCAhPSBOVUxMKQotCQkqaGFzaHAgPSBOVUxMOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGluZm8tPm5vdGljZV9oYXNoICE9IChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikgTlVMTAotCSAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoaW5mby0+bm90aWNlX2hhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSkKLQkgICAgICAhPSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwpKQotCXsKLQkgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5ub3RpY2UpIChpbmZvLCBuYW1lLCBhYmZkLCBzZWN0aW9uLCB2YWx1ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChoYXNocCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopIE5VTEwpCi0JKmhhc2hwID0gaDsKLSAgICAgIC8qIGVuZCBkdXBsaWNhdGlvbiBmcm9tIGxpbmtlci5jICovCi0KLSAgICAgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotCXsKLQkgIGFzZWN0aW9uICptc2VjOwotCi0JICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JICAgIG1zZWMgPSBoLT51LmRlZi5zZWN0aW9uOwotCSAgZWxzZQotCSAgICBtc2VjID0gYmZkX2luZF9zZWN0aW9uX3B0cjsKLQotCSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAobXNlYykgJiYgIWJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikpCi0JICAgIHsKLQkgICAgICBoLT51LmRlZi5zZWN0aW9uID0gc2VjdGlvbjsKLQkgICAgICBoLT51LmRlZi52YWx1ZSA9IHZhbHVlOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24pICYmICFiZmRfaXNfYWJzX3NlY3Rpb24gKG1zZWMpKQotCSAgICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGRpZG4ndCBleGl0IGVhcmx5LCBmaW5pc2ggcHJvY2Vzc2luZyBpbiB0aGUgZ2VuZXJpYyByb3V0aW5lICovCi0gIHJldHVybiBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sCi0JCQkJCSAgIHZhbHVlLCBzdHJpbmcsIGNvcHksIGNvbGxlY3QsCi0JCQkJCSAgIGhhc2hwKTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWdvMzIuYyBiL2JmZC9jb2ZmLWdvMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0YWRiMi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1nbzMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDM4NiBDT0ZGIGZpbGVzIChnbzMyIHZhcmlhbnQpLgotICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IERKIERlbG9yaWUuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfU1lNCQlnbzMyY29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJCSJjb2ZmLWdvMzIiCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFCSdfJwotCi0jaW5jbHVkZSAiY29mZi1pMzg2LmMiCmRpZmYgLS1naXQgYS9iZmQvY29mZi1oODMwMC5jIGIvYmZkL2NvZmYtaDgzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRhNGVjMy4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1oODMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM4OCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhpdGFjaGkgSDgvMzAwIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4sIDxzYWNAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0jaW5jbHVkZSAiY29mZi9oODMwMC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgxKQotCi0vKiBXZSBkZXJpdmUgYSBoYXNoIHRhYmxlIGZyb20gdGhlIGJhc2ljIEJGRCBoYXNoIHRhYmxlIHRvCi0gICBob2xkIGVudHJpZXMgaW4gdGhlIGZ1bmN0aW9uIHZlY3Rvci4gIEFzaWRlIGZyb20gdGhlIAotICAgaW5mbyBzdG9yZWQgYnkgdGhlIGJhc2ljIGhhc2ggdGFibGUsIHdlIG5lZWQgdGhlIG9mZnNldAotICAgb2YgYSBwYXJ0aWN1bGFyIGVudHJ5IHdpdGhpbiB0aGUgaGFzaCB0YWJsZSBhcyB3ZWxsIGFzCi0gICB0aGUgb2Zmc2V0IHdoZXJlIHdlJ2xsIGFkZCB0aGUgbmV4dCBlbnRyeS4gICovCi0KLXN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkKLXsKLSAgLyogVGhlIGJhc2ljIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgdmVjdG9ycyBzZWN0aW9uIHdoZXJlCi0gICAgIHRoaXMgZW50cnkgbGl2ZXMuICAqLwotICBiZmRfdm1hIG9mZnNldDsKLX07Ci0KLXN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIGJhc2ljIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLQotICBiZmQgKmFiZmQ7Ci0KLSAgLyogT2Zmc2V0IGF0IHdoaWNoIHdlJ2xsIGFkZCB0aGUgbmV4dCBlbnRyeS4gICovCi0gIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWZ1bmN2ZWNfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1mdW5jdmVjX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICosIGJmZCAqLAotICAgICAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKikpKSk7Ci0KLS8qIFRvIGxvb2t1cCBhIHZhbHVlIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IgaGFzaCB0YWJsZS4gICovCi0jZGVmaW5lIGZ1bmN2ZWNfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIFRoZSBkZXJpdmVkIGg4MzAwIENPRkYgbGlua2VyIHRhYmxlLiAgTm90ZSBpdCdzIGRlcml2ZWQgZnJvbQotICAgdGhlIGdlbmVyaWMgbGlua2VyIGhhc2ggdGFibGUsIG5vdCB0aGUgQ09GRiBiYWNrZW5kIGxpbmtlciBoYXNoCi0gICB0YWJsZSEgIFdlIHVzZSB0aGlzIHRvIGF0dGFjaCBhZGRpdGlvbmFsIGRhdGEgc3RydWN0dXJlcyB3ZQotICAgbmVlZCB3aGlsZSBsaW5raW5nIG9uIHRoZSBoODMwMC4gICovCi1zdHJ1Y3QgaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIFNlY3Rpb24gZm9yIHRoZSB2ZWN0b3JzIHRhYmxlLiAgVGhpcyBnZXRzIGF0dGFjaGVkIHRvIGEKLSAgICAgcmFuZG9tIGlucHV0IGJmZCwgd2Uga2VlcCBpdCBoZXJlIGZvciBlYXN5IGFjY2Vzcy4gICovCi0gIGFzZWN0aW9uICp2ZWN0b3JzX3NlYzsKLQotICAvKiBIYXNoIHRhYmxlIG9mIHRoZSBmdW5jdGlvbnMgd2UgbmVlZCB0byBlbnRlciBpbnRvIHRoZSBmdW5jdGlvbgotICAgICB2ZWN0b3IuICAqLwotICBzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICpmdW5jdmVjX2hhc2hfdGFibGU7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBHZXQgdGhlIEg4LzMwMCBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBoODMwMF9jb2ZmX2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBoODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSAoKGNvZmZfaGFzaF90YWJsZSAocCkpKSkKLQotLyogSW5pdGlhbGl6ZSBmaWVsZHMgd2l0aGluIGEgZnVuY3ZlYyBoYXNoIHRhYmxlIGVudHJ5LiAgQ2FsbGVkIHdoZW5ldmVyCi0gICBhIG5ldyBlbnRyeSBpcyBhZGRlZCB0byB0aGUgZnVuY3ZlYyBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1mdW5jdmVjX2hhc2hfbmV3ZnVuYyAoZW50cnksIGdlbl90YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKmdlbl90YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICpyZXQ7Ci0gIHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKnRhYmxlOwotCi0gIHJldCA9IChzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICopIGVudHJ5OwotICB0YWJsZSA9IChzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICopIGdlbl90YWJsZTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqKQotICAgICAgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoZ2VuX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkgKikKLSAgICAgICAgIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCBnZW5fdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBOb3RlIHdoZXJlIHRoaXMgZW50cnkgd2lsbCByZXNpZGUgaW4gdGhlIGZ1bmN0aW9uIHZlY3RvciB0YWJsZS4gICovCi0gIHJldC0+b2Zmc2V0ID0gdGFibGUtPm9mZnNldDsKLQotICAvKiBCdW1wIHRoZSBvZmZzZXQgYXQgd2hpY2ggd2Ugc3RvcmUgZW50cmllcyBpbiB0aGUgZnVuY3Rpb24KLSAgICAgdmVjdG9yLiAgV2UnZCBsaWtlIHRvIGJ1bXAgdXAgdGhlIHNpemUgb2YgdGhlIHZlY3RvcnMgc2VjdGlvbiwKLSAgICAgYnV0IGl0J3Mgbm90IGVhc2lseSBhdmFpbGFibGUgaGVyZS4gICovCi0gIGlmIChiZmRfZ2V0X21hY2ggKHRhYmxlLT5hYmZkKSA9PSBiZmRfbWFjaF9oODMwMCkKLSAgICB0YWJsZS0+b2Zmc2V0ICs9IDI7Ci0gIGVsc2UgaWYgKGJmZF9nZXRfbWFjaCAodGFibGUtPmFiZmQpID09IGJmZF9tYWNoX2g4MzAwaAotCSAgIHx8IGJmZF9nZXRfbWFjaCAodGFibGUtPmFiZmQpID09IGJmZF9tYWNoX2g4MzAwcykKLSAgICB0YWJsZS0+b2Zmc2V0ICs9IDQ7Ci0gIGVsc2UKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBFdmVyeXRoaW5nIHdlbnQgT0suICAqLwotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIGZ1bmN0aW9uIHZlY3RvciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWZ1bmN2ZWNfaGFzaF90YWJsZV9pbml0ICh0YWJsZSwgYWJmZCwgbmV3ZnVuYykKLSAgICAgc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICopKTsKLXsKLSAgLyogSW5pdGlhbGl6ZSBvdXIgbG9jYWwgZmllbGRzLCB0aGVuIGNhbGwgdGhlIGdlbmVyaWMgaW5pdGlhbGl6YXRpb24KLSAgICAgcm91dGluZS4gICovCi0gIHRhYmxlLT5vZmZzZXQgPSAwOwotICB0YWJsZS0+YWJmZCA9IGFiZmQ7Ci0gIHJldHVybiAoYmZkX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT5yb290LCBuZXdmdW5jKSk7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgZGVyaXZlZCBsaW5rZXIgaGFzaCB0YWJsZS4gIFdlIHVzZSBhIGRlcml2ZWQgaGFzaCB0YWJsZQotICAgYmFzaWNhbGx5IHRvIGhvbGQgInN0YXRpYyIgaW5mb3JtYXRpb24gZHVyaW5nIGFuIGg4LzMwMCBjb2ZmIGxpbmsKLSAgIHdpdGhvdXQgdXNpbmcgc3RhdGljIHZhcmlhYmxlcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1oODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0gIHJldCA9ICgoc3RydWN0IGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlICopCi0gICAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmICghX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdC5yb290LCBhYmZkLCBfYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIEluaXRpYWxpemUgb3VyIGRhdGEuICAqLwotICByZXQtPnZlY3RvcnNfc2VjID0gTlVMTDsKLSAgcmV0LT5mdW5jdmVjX2hhc2hfdGFibGUgPSBOVUxMOwotCi0gIC8qIE9LLiAgRXZlcnl0aGluZydzIGludGlhbGl6ZWQsIHJldHVybiB0aGUgYmFzZSBwb2ludGVyLiAgKi8KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogc3BlY2lhbCBoYW5kbGluZyBmb3IgSDgvMzAwIHJlbG9jcy4KLSAgIFdlIG9ubHkgY29tZSBoZXJlIGZvciBwY3JlbCBzdHVmZiBhbmQgcmV0dXJuIG5vcm1hbGx5IGlmIG5vdCBhbiAtciBsaW5rLgotICAgV2hlbiBkb2luZyAtciwgd2UgY2FuJ3QgZG8gYW55IGFyaXRobWV0aWMgZm9yIHRoZSBwY3JlbCBzdHVmZiwgYmVjYXVzZQotICAgdGhlIGNvZGUgaW4gcmVsb2MuYyBhc3N1bWVzIHRoYXQgd2UgY2FuIG1hbmlwdWxhdGUgdGhlIHRhcmdldHMgb2YKLSAgIHRoZSBwY3JlbCBicmFuY2hlcy4gIFRoaXMgaXNuJ3Qgc28sIHNpbmNlIHRoZSBIOC8zMDAgY2FuIGRvIHJlbGF4aW5nLCAKLSAgIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGdhcCBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBlbm91Z2ggdG8KLSAgIGNvbnRhaW4gdGhlIG9mZnNldCByZXF1aXJlZCBmb3IgdGhlIGJyYW5jaCwgc28gd2UgaGF2ZSB0byB1c2UgdGhlIG9ubHkKLSAgIHRoZSBhZGRlbmQgdW50aWwgdGhlIGZpbmFsIGxpbmsgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc3BlY2lhbCAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8gKFJfUkVMQllURSwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiOCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1JFTFdPUkQsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIxNiIsIGZhbHNlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1JFTExPTkcsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIzMiIsIGZhbHNlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1BDUkJZVEUsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgc3BlY2lhbCwgIkRJU1A4IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIHRydWUpLAotICBIT1dUTyAoUl9QQ1JXT1JELCAwLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBzcGVjaWFsLCAiRElTUDE2IiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIHRydWUpLAotICBIT1dUTyAoUl9QQ1JMT05HLCAwLCAyLCAzMiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBzcGVjaWFsLCAiRElTUDMyIiwgZmFsc2UsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIHRydWUpLAotICBIT1dUTyAoUl9NT1YxNkIxLCAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicmVsYXhhYmxlIG1vdi5iOjE2IiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfTU9WMTZCMiwgMCwgMSwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicmVsYXhlZCBtb3YuYjoxNiIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChSX0pNUDEsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIxNi9wY3JlbCIsIGZhbHNlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX0pNUDIsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInBjcmVjbC8xNiIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChSX0pNUEwxLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiMjQvcGNyZWxsIiwgZmFsc2UsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfSk1QTDIsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInBjOC8yNCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChSX01PVjI0QjEsIDAsIDEsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICJyZWxheGFibGUgbW92LmI6MjQiLCBmYWxzZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9NT1YyNEIyLCAwLCAxLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICJyZWxheGVkIG1vdi5iOjI0IiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLQotICAvKiBBbiBpbmRpcmVjdCByZWZlcmVuY2UgdG8gYSBmdW5jdGlvbi4gIFRoaXMgY2F1c2VzIHRoZSBmdW5jdGlvbidzIGFkZHJlc3MKLSAgICAgdG8gYmUgYWRkZWQgdG8gdGhlIGZ1bmN0aW9uIHZlY3RvciBpbiBsby1tZW0gYW5kIHB1dHMgdGhlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIGZ1bmN0aW9uIHZlY3RvcidzIGVudHJ5IGluIHRoZSBqc3IgaW5zdHJ1Y3Rpb24uICAqLwotICBIT1dUTyAoUl9NRU1fSU5ESVJFQ1QsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgIjgvaW5kaXJlY3QiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotCi0gIC8qIEludGVybmFsIHJlbG9jIGZvciByZWxheGluZy4gIFRoaXMgaXMgY3JlYXRlZCB3aGVuIGEgMTZiaXQgcGMtcmVsYXRpdmUKLSAgICAgYnJhbmNoIGlzIHR1cm5lZCBpbnRvIGFuIDhiaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKFJfUENSV09SRF9CLCAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInJlbGF4ZWQgYkNDOjE2IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLQotICBIT1dUTyAoUl9NT1ZMMSwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxzcGVjaWFsLCAiMzIvMjQgcmVsYXhhYmxlIG1vdmUiLCBmYWxzZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotCi0gIEhPV1RPIChSX01PVkwyLCAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiMzIvMjQgcmVsYXhlZCBtb3ZlIiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLQotICBIT1dUTyAoUl9CQ0NfSU5WLCAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIHNwZWNpYWwsICJESVNQOCBpbnZlcnRlZCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCB0cnVlKSwKLQotICBIT1dUTyAoUl9KTVBfREVMLCAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIHNwZWNpYWwsICJEZWxldGVkIGp1bXAiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgdHJ1ZSksCi19OwotCi0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIFwKLSAgeyB4LnJfdHlwZSA9IHNlbGVjdF9yZWxvYyhob3d0byk7IH0KLQotI2RlZmluZSBCQURNQUcoeCkgKEg4MzAwQkFETUFHKHgpICYmIEg4MzAwSEJBRE1BRyh4KSAmJiBIODMwMFNCQURNQUcoeCkpCi0jZGVmaW5lIEg4MzAwIDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLQotCi0KLS8qIENvZGUgdG8gc3dhcCBpbiB0aGUgcmVsb2MgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgICBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkgXAotICBkc3QtPnJfc3R1ZmZbMF0gPSAnUyc7IFwKLSAgZHN0LT5yX3N0dWZmWzFdID0gJ0MnOwotCi0KLXN0YXRpYyBpbnQKLXNlbGVjdF9yZWxvYyAoaG93dG8pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICByZXR1cm4gaG93dG8tPnR5cGU7Ci19Ci0KLS8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZQotICAgKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChpbnRlcm5hbCwgZHN0KQotICAgICBhcmVsZW50ICppbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIHN3aXRjaCAoZHN0LT5yX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9SRUxCWVRFOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1JFTFdPUkQ6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfUkVMTE9ORzoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9QQ1JCWVRFOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1BDUldPUkQ6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfUENSTE9ORzoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgNTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NT1YxNkIxOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyA2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01PVjE2QjI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSk1QMToKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9KTVAyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyA5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0pNUEwxOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9KTVBMMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTU9WMjRCMToKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTU9WMjRCMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTUVNX0lORElSRUNUOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9QQ1JXT1JEX0I6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDE1OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01PVkwxOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NT1ZMMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfQkNDX0lOVjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSk1QX0RFTDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCi0KLQotLyogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IG1hZ2ljIHRvIHRoZSBhZGRlbmQgaW4gYSByZWxvYyBlbnRyeSAqLwotCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgc3ltYm9sLCBleHRfcmVsb2MsIGNhY2hlX3B0cikgXAotIGNhY2hlX3B0ci0+YWRkZW5kID0gIGV4dF9yZWxvYy5yX29mZnNldDsKLQotCi0jZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LHJlbG9jLHN5bWJvbHMsYWJmZCxzZWN0aW9uKSBcCi0gcmVsb2NfcHJvY2Vzc2luZyhyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotCi1zdGF0aWMgdm9pZAotcmVsb2NfcHJvY2Vzc2luZyAocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLSAgICAgYXJlbGVudCAqIHJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKiBzeW1ib2xzOwotICAgICBiZmQgKiBhYmZkOwotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci17Ci0gIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwotICBydHlwZTJob3d0byAocmVsZW50LCByZWxvYyk7Ci0KLSAgaWYgKCgoaW50KSByZWxvYy0+cl9zeW1uZHgpID4gMCkKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0IChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0KLQotCi0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotCi0gIHJlbGVudC0+YWRkcmVzcyAtPSBzZWN0aW9uLT52bWE7Ci0gIC8qICByZWxlbnQtPnNlY3Rpb24gPSAwOyovCi19Ci0KLXN0YXRpYyBib29sZWFuCi1oODMwMF9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci17Ci0gIGFzeW1ib2wgKipzOwotCi0gIHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCk7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gKGFzeW1ib2wgKiopIE5VTEwpOwotCi0gIC8qIFNlYXJjaCBhbGwgdGhlIHN5bWJvbHMgZm9yIG9uZSBpbiBJTlBVVF9TRUNUSU9OIHdpdGgKLSAgICAgYWRkcmVzcyBBRERSRVNTLiAgKi8KLSAgd2hpbGUgKCpzKSAKLSAgICB7Ci0gICAgICBhc3ltYm9sICpwID0gKnM7Ci0gICAgICBpZiAocC0+c2VjdGlvbiA9PSBpbnB1dF9zZWN0aW9uCi0JICAmJiAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCSAgICAgICsgcC0+dmFsdWUpID09IGFkZHJlc3MpCi0JcmV0dXJuIHRydWU7Ci0gICAgICBzKys7Ci0gICAgfSAgICAKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qIElmIFJFTE9DIHJlcHJlc2VudHMgYSByZWxheGFibGUgaW5zdHJ1Y3Rpb24vcmVsb2MsIGNoYW5nZSBpdCBpbnRvCi0gICB0aGUgcmVsYXhlZCByZWxvYywgbm90aWZ5IHRoZSBsaW5rZXIgdGhhdCBzeW1ib2wgYWRkcmVzc2VzCi0gICBoYXZlIGNoYW5nZWQgKGJmZF9wZXJmb3JtX3NsaXApIGFuZCByZXR1cm4gaG93IG11Y2ggdGhlIGN1cnJlbnQKLSAgIHNlY3Rpb24gaGFzIHNocnVuayBieS4KLQotICAgRklYTUU6IE11Y2ggb2YgdGhpcyBjb2RlIGhhcyBrbm93bGVkZ2Ugb2YgdGhlIG9yZGVyaW5nIG9mIGVudHJpZXMKLSAgIGluIHRoZSBob3d0byB0YWJsZS4gIFRoaXMgbmVlZHMgdG8gYmUgZml4ZWQuICAqLwotCi1zdGF0aWMgaW50Ci1oODMwMF9yZWxvYzE2X2VzdGltYXRlKGFiZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jLCBzaHJpbmssIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIHVuc2lnbmVkIGludCBzaHJpbms7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIGJmZF92bWEgdmFsdWU7ICAKLSAgYmZkX3ZtYSBkb3Q7Ci0gIGJmZF92bWEgZ2FwOwotICBzdGF0aWMgYXNlY3Rpb24gKmxhc3RfaW5wdXRfc2VjdGlvbiA9IE5VTEw7Ci0gIHN0YXRpYyBhcmVsZW50ICpsYXN0X3JlbG9jID0gTlVMTDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgdGhpbmcgdG8gYmUgcmVsb2NhdGVkIHdpbGwgaGF2ZSBtb3ZlZCBiYWNrIGJ5IAotICAgICB0aGUgc2l6ZSBvZiB0aGUgc2hyaW5rIC0gYnV0IHdlIGRvbid0IGNoYW5nZSByZWxvYy0+YWRkcmVzcyBoZXJlLAotICAgICBzaW5jZSB3ZSBuZWVkIGl0IHRvIGtub3cgd2hlcmUgdGhlIHJlbG9jYXRpb24gbGl2ZXMgaW4gdGhlIHNvdXJjZQotICAgICB1bmNvb2tlZCBzZWN0aW9uLiAgKi8KLSAgYmZkX3ZtYSBhZGRyZXNzID0gcmVsb2MtPmFkZHJlc3MgLSBzaHJpbms7Ci0KLSAgaWYgKGlucHV0X3NlY3Rpb24gIT0gbGFzdF9pbnB1dF9zZWN0aW9uKQotICAgIGxhc3RfcmVsb2MgPSBOVUxMOwotCi0gIC8qIE9ubHkgZXhhbWluZSB0aGUgcmVsb2NzIHdoaWNoIG1pZ2h0IGJlIHJlbGF4YWJsZS4gICovCi0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsgICAgIAotCi0gICAgLyogVGhpcyBpcyB0aGUgMTYvMjQgYml0IGFic29sdXRlIGJyYW5jaCB3aGljaCBjb3VsZCBiZWNvbWUgYW4gOCBiaXQKLSAgICAgICBwYy1yZWxhdGl2ZSBicmFuY2guICAqLwotICAgIGNhc2UgUl9KTVAxOgotICAgIGNhc2UgUl9KTVBMMToKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBpbnN0cnVjdGlvbiAobm90IHRoZSByZWxvYykuICAqLwotICAgICAgZG90ID0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIGFkZHJlc3MpOwotCi0gICAgICAvKiBBZGp1c3QgZm9yIFJfSk1QMSB2cyBSX0pNUEwxLiAgKi8KLSAgICAgIGRvdCArPSAocmVsb2MtPmhvd3RvLT50eXBlID09IFJfSk1QMSA/IDEgOiAyKTsKLQotICAgICAgLyogQ29tcHV0ZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIGluc24gdG8gdGhlIGJyYW5jaCB0YXJnZXQuICAqLwotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0gIAotICAgICAgLyogSWYgdGhlIGRpc3RhbmNlIGlzIHdpdGhpbiAtMTI4Li4rMTI4IGluY2x1c2l2ZSwgdGhlbiB3ZSBjYW4gcmVsYXgKLQkgdGhpcyBqdW1wLiAgKzEyOCBpcyB2YWxpZCBzaW5jZSB0aGUgdGFyZ2V0IHdpbGwgbW92ZSB0d28gYnl0ZXMKLQkgY2xvc2VyIGlmIHdlIGRvIHJlbGF4IHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIGlmICgoaW50KWdhcCA+PSAtMTI4ICYmIChpbnQpZ2FwIDw9IDEyOCApCi0JeyAKLQotCSAgLyogSXQncyBwb3NzaWJsZSB3ZSBtYXkgYmUgYWJsZSB0byBlbGltaW5hdGUgdGhpcyBicmFuY2ggZW50aXJlbHk7Ci0JICAgICBpZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgYSBicmFuY2ggYXJvdW5kIHRoaXMgaW5zdHJ1Y3Rpb24sCi0JICAgICBhbmQgdGhlcmUncyBubyBsYWJlbCBhdCB0aGlzIGluc3RydWN0aW9uLCB0aGVuIHdlIGNhbiByZXZlcnNlCi0JICAgICB0aGUgY29uZGl0aW9uIG9uIHRoZSBwcmV2aW91cyBicmFuY2ggYW5kIGVsaW1pbmF0ZSB0aGlzIGp1bXAuCi0KLQkgICAgICAgb3JpZ2luYWw6CQkJbmV3OgotCQkgYkNDIGxhYjEJCQliQ0MnIGxhYjIKLQkJIGptcCBsYWIyCi0JCWxhYjE6CQkJCWxhYjE6Ci0JCi0JICAgICBUaGlzIHNhdmVzIDQgYnl0ZXMgaW5zdGVhZCBvZiB0d28sIGFuZCBzaG91bGQgYmUgcmVsYXRpdmVseQotCSAgICAgY29tbW9uLiAgKi8KLQotCSAgaWYgKGdhcCA8PSAxMjYKLQkgICAgICAmJiBsYXN0X3JlbG9jCi0JICAgICAgJiYgbGFzdF9yZWxvYy0+aG93dG8tPnR5cGUgPT0gUl9QQ1JCWVRFKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBsYXN0X3ZhbHVlOwotCSAgICAgIGxhc3RfdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAobGFzdF9yZWxvYywgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pICsgMTsKLQotCSAgICAgIGlmIChsYXN0X3ZhbHVlID09IGRvdCArIDIKLQkJICAmJiBsYXN0X3JlbG9jLT5hZGRyZXNzICsgMSA9PSByZWxvYy0+YWRkcmVzcwotCQkgICYmICEgaDgzMDBfc3ltYm9sX2FkZHJlc3NfcCAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgZG90IC0gMikpCi0JCXsKLQkJICByZWxvYy0+aG93dG8gPSBob3d0b190YWJsZSArIDE5OwotCQkgIGxhc3RfcmVsb2MtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxODsKLQkJICBsYXN0X3JlbG9jLT5zeW1fcHRyX3B0ciA9IHJlbG9jLT5zeW1fcHRyX3B0cjsKLQkJICBsYXN0X3JlbG9jLT5hZGRlbmQgPSByZWxvYy0+YWRkZW5kOwotCQkgIHNocmluayArPSA0OwotCQkgIGJmZF9wZXJmb3JtX3NsaXAgKGFiZmQsIDQsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KLQkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7CSAgCi0KLQkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgdHdvIGJ5dGVzLiAgKi8KLQkgIHNocmluayArPSAyOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIC8qIFRoaXMgaXMgdGhlIDE2IGJpdCBwYy1yZWxhdGl2ZSBicmFuY2ggd2hpY2ggY291bGQgYmVjb21lIGFuIDggYml0Ci0gICAgICAgcGMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgICBjYXNlIFJfUENSV09SRDoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLCBhZGQgb25lIHRvIHRoZSB2YWx1ZQotICAgICAgICAgYmVjYXVzZSB0aGUgYWRkZW5kIGZpZWxkIGluIFBDcmVsIGp1bXBzIGlzIG9mZiBieSAtMS4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pICsgMTsKLQkKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpZiB3ZSB3ZXJlIHRvIHJlbGF4LiAgKi8KLSAgICAgIGRvdCA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotCWlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyBhZGRyZXNzOwotICAKLSAgICAgIC8qIENvbXB1dGUgdGhlIGRpc3RhbmNlIGZyb20gdGhpcyBpbnNuIHRvIHRoZSBicmFuY2ggdGFyZ2V0LiAgKi8KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBJZiB0aGUgZGlzdGFuY2UgaXMgd2l0aGluIC0xMjguLisxMjggaW5jbHVzaXZlLCB0aGVuIHdlIGNhbiByZWxheAotCSB0aGlzIGp1bXAuICArMTI4IGlzIHZhbGlkIHNpbmNlIHRoZSB0YXJnZXQgd2lsbCBtb3ZlIHR3byBieXRlcwotCSBjbG9zZXIgaWYgd2UgZG8gcmVsYXggdGhpcyBicmFuY2guICAqLwotICAgICAgaWYgKChpbnQpZ2FwID49IC0xMjggJiYgKGludClnYXAgPD0gMTI4ICkKLQl7IAotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KLQkgIHJlbG9jLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTU7Ci0KLQkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgdHdvIGJ5dGVzLiAgKi8KLQkgIHNocmluayArPSAyOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIC8qIFRoaXMgaXMgYSAxNiBiaXQgYWJzb2x1dGUgYWRkcmVzcyBpbiBhIG1vdi5iIGluc24sIHdoaWNoIGNhbgotICAgICAgIGJlY29tZSBhbiA4IGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGlmIGl0J3MgaW4gdGhlIHJpZ2h0IHJhbmdlLiAgKi8KLSAgICBjYXNlIFJfTU9WMTZCMToKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IHRoaXMgbW92LmIgaW5zbi4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBUaGUgYWRkcmVzcyBpcyBpbiAweGZmMDAuLjB4ZmZmZiBpbmNsdXNpdmUgb24gdGhlIGg4MzAwIG9yCi0JIDB4ZmZmZjAwLi4weGZmZmZmZiBpbmNsdXNpdmUgb24gdGhlIGg4MzAwaCwgdGhlbiB3ZSBjYW4KLQkgcmVsYXggdGhpcyBtb3YuYiAgKi8KLSAgICAgIGlmICgoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMAotCSAgICYmIHZhbHVlID49IDB4ZmYwMAotCSAgICYmIHZhbHVlIDw9IDB4ZmZmZikKLQkgIHx8ICgoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMGgKLQkgICAgICAgfHwgYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMHMpCi0JICAgICAgJiYgdmFsdWUgPj0gMHhmZmZmMDAKLQkgICAgICAmJiB2YWx1ZSA8PSAweGZmZmZmZikpCi0JewotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KLQkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7Ci0KLQkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgdHdvIGJ5dGVzLiAgKi8KLQkgIHNocmluayArPSAyOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIC8qIFNpbWlsYXJseSBmb3IgYSAyNCBiaXQgYWJzb2x1dGUgYWRkcmVzcyBpbiBhIG1vdi5iLiAgTm90ZSB0aGF0Ci0gICAgICAgaWYgd2UgY2FuJ3QgcmVsYXggdGhpcyBpbnRvIGFuIDggYml0IGFic29sdXRlLCB3ZSdsbCBmYWxsIHRocm91Z2gKLSAgICAgICBhbmQgdHJ5IHRvIHJlbGF4IGl0IGludG8gYSAxNmJpdCBhYnNvbHV0ZS4gICovCi0gICAgY2FzZSBSX01PVjI0QjE6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgcmVmZXJlbmNlZCBieSB0aGlzIG1vdi5iIGluc24uICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogVGhlIGFkZHJlc3MgaXMgaW4gMHhmZmZmMDAuLjB4ZmZmZmZmIGluY2x1c2l2ZSBvbiB0aGUgaDgzMDBoLAotCSB0aGVuIHdlIGNhbiByZWxheCB0aGlzIG1vdi5iICAqLwotICAgICAgaWYgKChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwaAotCSAgIHx8IGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBzKQotCSAgJiYgdmFsdWUgPj0gMHhmZmZmMDAKLQkgICYmIHZhbHVlIDw9IDB4ZmZmZmZmKQotCXsKLQkgIC8qIENoYW5nZSB0aGUgcmVsb2MgdHlwZS4gICovCi0JICByZWxvYy0+aG93dG8gPSByZWxvYy0+aG93dG8gKyAxOwotCi0JICAvKiBUaGlzIHNocmlua3MgdGhpcyBzZWN0aW9uIGJ5IGZvdXIgYnl0ZXMuICAqLwotCSAgc2hyaW5rICs9IDQ7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDQsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCi0JICAvKiBEb25lIHdpdGggdGhpcyByZWxvYy4gICovCi0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIEZBTExUSFJPVUdIIGFuZCB0cnkgdG8gdHVybiB0aGUgMzIvMjQgYml0IHJlbG9jIGludG8gYSAxNiBiaXQKLQkgcmVsb2MuICAqLwotCi0gICAgLyogVGhpcyBpcyBhIDI0LzMyIGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGluIGEgbW92IGluc24sIHdoaWNoIGNhbgotICAgICAgIGJlY29tZSBhbiAxNiBiaXQgYWJzb2x1dGUgYWRkcmVzcyBpZiBpdCdzIGluIHRoZSByaWdodCByYW5nZS4gICovCi0gICAgY2FzZSBSX01PVkwxOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHJlZmVyZW5jZWQgYnkgdGhpcyBtb3YgaW5zbi4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBJZiB0aGlzIGFkZHJlc3MgaXMgaW4gMHgwMDAwLi4weDdmZmYgaW5jbHVzaXZlIG9yCi0gICAgICAgICAweGZmODAwMC4uMHhmZmZmZmYgaW5jbHVzaXZlLCB0aGVuIGl0IGNhbiBiZSByZWxheGVkLiAgKi8KLSAgICAgIGlmICh2YWx1ZSA8PSAweDdmZmYgfHwgdmFsdWUgPj0gMHhmZjgwMDApCi0JewotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KLQkgIHJlbG9jLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTc7Ci0KLQkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgdHdvIGJ5dGVzLiAgKi8KLQkgIHNocmluayArPSAyOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogTm8gb3RoZXIgcmVsb2MgdHlwZXMgcmVwcmVzZW50IHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMuICAqLwotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICB9Ci0KLSAgbGFzdF9yZWxvYyA9IHJlbG9jOwotICBsYXN0X2lucHV0X3NlY3Rpb24gPSBpbnB1dF9zZWN0aW9uOwotICByZXR1cm4gc2hyaW5rOwotfQotCi0KLS8qIEhhbmRsZSByZWxvY2F0aW9ucyBmb3IgdGhlIEg4LzMwMCwgaW5jbHVkaW5nIHJlbG9jcyBmb3IgcmVsYXhlZAotICAgaW5zdHJ1Y3Rpb25zLgotCi0gICBGSVhNRTogTm90IGFsbCByZWxvY2F0aW9ucyBjaGVjayBmb3Igb3ZlcmZsb3chICAqLwotCi1zdGF0aWMgdm9pZAotaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwKLQkJCSAgIGRzdF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGludCAqc3JjX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyOwotewotICB1bnNpZ25lZCBpbnQgc3JjX2FkZHJlc3MgPSAqc3JjX3B0cjsKLSAgdW5zaWduZWQgaW50IGRzdF9hZGRyZXNzID0gKmRzdF9wdHI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBiZmRfdm1hIHZhbHVlOwotICBiZmRfdm1hIGRvdDsKLSAgaW50IGdhcCx0bXA7Ci0KLSAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCi0gICAgewotCi0gICAgLyogR2VuZXJpYyA4Yml0IHBjLXJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICAgIGNhc2UgUl9QQ1JCWVRFOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldCAKLQkgICAgICsgZHN0X2FkZHJlc3MgCi0JICAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGdhcCA8IC0xMjggfHwgZ2FwID4gMTI2KQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBFdmVyeXRoaW5nIGxvb2tzIE9LLiAgQXBwbHkgdGhlIHJlbG9jYXRpb24gYW5kIHVwZGF0ZSB0aGUKLQkgc3JjL2RzdCBhZGRyZXNzIGFwcHJvcHJpYXRlbHkuICAqLwotCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLSAgICAgIGRzdF9hZGRyZXNzKys7Ci0gICAgICBzcmNfYWRkcmVzcysrOwotCi0gICAgICAvKiBBbGwgZG9uZS4gICovCi0gICAgICBicmVhazsKLQotICAgIC8qIEdlbmVyaWMgMTZiaXQgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gICAgY2FzZSBSX1BDUldPUkQ6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIChub3QgdGhlIHJlbG9jKS4gICovCi0gICAgICBkb3QgPSAobGlua19vcmRlci0+b2Zmc2V0IAotCSAgICAgKyBkc3RfYWRkcmVzcyAKLQkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMSk7Ci0KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGdhcCA+IDMyNzY2IHx8IGdhcCA8IC0zMjc2OCkKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogRXZlcnl0aGluZyBsb29rcyBPSy4gIEFwcGx5IHRoZSByZWxvY2F0aW9uIGFuZCB1cGRhdGUgdGhlCi0JIHNyYy9kc3QgYWRkcmVzcyBhcHByb3ByaWF0ZWx5LiAgKi8KLQotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotICAgICAgZHN0X2FkZHJlc3MgKz0gMjsKLSAgICAgIHNyY19hZGRyZXNzICs9IDI7Ci0KLSAgICAgIC8qIEFsbCBkb25lLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgLyogR2VuZXJpYyA4Yml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICAgIGNhc2UgUl9SRUxCWVRFOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QgcmVmZXJlbmNlZCBieSB0aGlzIGluc24uICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAodmFsdWUgPD0gMHhmZgotCSAgfHwgKHZhbHVlID49IDB4MDAwMGZmMDAgJiYgdmFsdWUgPD0gMHgwMDAwZmZmZikKLSAgCSAgfHwgKHZhbHVlID49IDB4MDBmZmZmMDAgJiYgdmFsdWUgPD0gMHgwMGZmZmZmZikKLQkgIHx8ICh2YWx1ZSA+PSAweGZmZmZmZjAwICYmIHZhbHVlIDw9IDB4ZmZmZmZmZmYpKQotCXsKLQkgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgT0suICBBcHBseSB0aGUgcmVsb2NhdGlvbiBhbmQgdXBkYXRlIHRoZQotCSAgICAgc3JjL2RzdCBhZGRyZXNzIGFwcHJvcHJpYXRlbHkuICAqLwotCi0JICBiZmRfcHV0XzggKGFiZmQsIHZhbHVlICYgMHhmZiwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQkgIGRzdF9hZGRyZXNzICs9IDE7Ci0JICBzcmNfYWRkcmVzcyArPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogQWxsIGRvbmUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBWYXJpb3VzIHNpbXBsZSAxNmJpdCBhYnNvbHV0ZSByZWxvY2F0aW9ucy4gICovCi0gICAgY2FzZSBSX01PVjE2QjE6Ci0gICAgY2FzZSBSX0pNUDE6Ci0gICAgY2FzZSBSX1JFTFdPUkQ6Ci0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgdmFsdWUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0gICAgICBkc3RfYWRkcmVzcyArPSAyOwotICAgICAgc3JjX2FkZHJlc3MgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogVmFyaW91cyBzaW1wbGUgMjQvMzJiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbnMuICAqLwotICAgIGNhc2UgUl9NT1YyNEIxOgotICAgIGNhc2UgUl9NT1ZMMToKLSAgICBjYXNlIFJfUkVMTE9ORzoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsdWUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0gICAgICBkc3RfYWRkcmVzcyArPSA0OwotICAgICAgc3JjX2FkZHJlc3MgKz0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogQW5vdGhlciAyNC8zMmJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgICBjYXNlIFJfSk1QTDE6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgdmFsdWUgPSAoKHZhbHVlICYgMHgwMGZmZmZmZikKLQkgICAgICAgfCAoYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIHNyY19hZGRyZXNzKSAmIDB4ZmYwMDAwMDApKTsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbHVlLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotICAgICAgZHN0X2FkZHJlc3MgKz0gNDsKLSAgICAgIHNyY19hZGRyZXNzICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIC8qIEEgMTZiaXQgYWJvbHV0ZSByZWxvY2F0aW9uIHRoYXQgd2FzIGZvcm1lcmxseSBhIDI0LzMyYml0Ci0gICAgICAgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gICAgY2FzZSBSX01PVkwyOgotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAodmFsdWUgPCAweDgwMDAgfHwgdmFsdWUgPiAweGZmODAwMCkKLQl7Ci0JICAvKiBJbnNlcnQgdGhlIDE2Yml0IHZhbHVlIGludG8gdGhlIHByb3BlciBsb2NhdGlvbi4gICovCi0JICBiZmRfcHV0XzE2IChhYmZkLCB2YWx1ZSwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQotCSAgLyogRml4IHRoZSBvcGNvZGUuICBGb3IgYWxsIHRoZSBtb3ZlIGluc25zLCB3ZSBzaW1wbHkKLQkgICAgIG5lZWQgdG8gdHVybiBvZmYgYml0IDB4MjAgaW4gdGhlIHByZXZpb3VzIGJ5dGUuICAqLwotICAgICAgICAgIGRhdGFbZHN0X2FkZHJlc3MgLSAxXSAmPSB+MHgyMDsKLQkgIGRzdF9hZGRyZXNzICs9IDI7Ci0JICBzcmNfYWRkcmVzcyArPSA0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIC8qIEEgMTZiaXQgYWJzb2x1dGUgYnJhbmNoIHRoYXQgaXMgbm93IGFuIDgtYml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gICovCi0gICAgY2FzZSBSX0pNUDI6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQKLQkgICAgICsgZHN0X2FkZHJlc3MKLQkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMSk7Ci0KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGdhcCA8IC0xMjggfHwgZ2FwID4gMTI2KQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBOb3cgZml4IHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYuICAqLwotICAgICAgc3dpdGNoIChkYXRhW2RzdF9hZGRyZXNzIC0gMV0pCi0JewotCWNhc2UgMHg1ZToKLQkgIC8qIGpzciAtPiBic3IgKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg1NSwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMSk7Ci0JICBicmVhazsKLQljYXNlIDB4NWE6Ci0JICAvKiBqbXAgLT5icmEgKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg0MCwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMSk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgOGJpdCB2YWx1ZS4gICovCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQotICAgICAgZHN0X2FkZHJlc3MgKz0gMTsKLSAgICAgIHNyY19hZGRyZXNzICs9IDM7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogQSAxNmJpdCBwYy1yZWxhdGl2ZSBicmFuY2ggdGhhdCBpcyBub3cgYW4gOC1iaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgICBjYXNlIFJfUENSV09SRF9COgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKG5vdCB0aGUgcmVsb2MpLiAgKi8KLSAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQKLQkgICAgICsgZHN0X2FkZHJlc3MKLQkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hIC0gMSk7Ci0KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGdhcCA8IC0xMjggfHwgZ2FwID4gMTI2KQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBOb3cgZml4IHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbZHN0X2FkZHJlc3MgLSAyXSkKLQl7Ci0JY2FzZSAweDU4OgotCSAgLyogYkNDOjE2IC0+IGJDQzo4ICovCi0JICAvKiBHZXQgdGhlIGNvbmRpdGlvbiBjb2RlIGZyb20gdGhlIG9yaWdpbmFsIGluc24uICAqLwotCSAgdG1wID0gZGF0YVtkc3RfYWRkcmVzcyAtIDFdOwotCSAgdG1wICY9IDB4ZjA7Ci0JICB0bXAgPj49IDQ7Ci0KLQkgIC8qIE5vdyBvciBpbiB0aGUgaGlnaCBuaWJibGUgb2YgdGhlIG9wY29kZS4gICovCi0JICB0bXAgfD0gMHg0MDsKLQotCSAgLyogV3JpdGUgaXQuICAqLwotCSAgYmZkX3B1dF84IChhYmZkLCB0bXAsIGRhdGEgKyBkc3RfYWRkcmVzcyAtIDIpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0JLyogT3V0cHV0IHRoZSB0YXJnZXQuICAqLwotCWJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLQotCS8qIFdlIGRvbid0IGFkdmFuY2UgZHN0X2FkZHJlc3MgLS0gdGhlIDhiaXQgcmVsb2MgaXMgYXBwbGllZCBhdAotCSAgIGRzdF9hZGRyZXNzIC0gMSwgc28gdGhlIG5leHQgaW5zbiBzaG91bGQgYmVnaW4gYXQgZHN0X2FkZHJlc3MuICAqLwotCXNyY19hZGRyZXNzICs9IDI7Ci0KLQlicmVhazsKLSAgICAgIAotICAgIC8qIFNpbWlsYXJseSBmb3IgYSAyNGJpdCBhYnNvbHV0ZSB0aGF0IGlzIG5vdyA4IGJpdHMuICAqLwotICAgIGNhc2UgUl9KTVBMMjoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIChub3QgdGhlIHJlbG9jKS4gICovCi0gICAgICBkb3QgPSAobGlua19vcmRlci0+b2Zmc2V0Ci0JICAgICArIGRzdF9hZGRyZXNzCi0JICAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIDIpOwotCi0gICAgICBnYXAgPSB2YWx1ZSAtIGRvdDsKLQotICAgICAgLyogRml4IHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbc3JjX2FkZHJlc3NdKQotCXsKLQljYXNlIDB4NWU6Ci0JICAvKiBqc3IgLT4gYnNyICovCi0JICBiZmRfcHV0XzggKGFiZmQsIDB4NTUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JICBicmVhazsKLQljYXNlIDB4NWE6Ci0JICAvKiBqbXAgLT5icmEgKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg0MCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MgKyAxKTsKLSAgICAgIGRzdF9hZGRyZXNzICs9IDI7Ci0gICAgICBzcmNfYWRkcmVzcyArPSA0OwotCi0gICAgICBicmVhazsKLQotICAgIC8qIEEgMTZiaXQgYWJzb2x1dGUgbW92LmIgdGhhdCBpcyBub3cgYW4gOGJpdCBhYnNvbHV0ZSBtb3YuYi4gICovCi0gICAgY2FzZSBSX01PVjE2QjI6Ci0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmIChkYXRhW2RzdF9hZGRyZXNzIC0gMl0gIT0gMHg2YSkKLQlhYm9ydCAoKTsKLQotICAgICAgLyogRml4IHVwIHRoZSBvcGNvZGUuICAqLwotICAgICAgc3dpdGNoIChkYXRhW3NyY19hZGRyZXNzLTFdICYgMHhmMCkKLQl7Ci0JY2FzZSAweDAwOgotCSAgZGF0YVtkc3RfYWRkcmVzcyAtIDJdID0gKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYpIHwgMHgyMDsKLQkgIGJyZWFrOwotCWNhc2UgMHg4MDoKLQkgIGRhdGFbZHN0X2FkZHJlc3MgLSAyXSA9IChkYXRhW3NyY19hZGRyZXNzLTFdICYgMHhmKSB8IDB4MzA7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIHZhbHVlICYgMHhmZiwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMSk7Ci0gICAgICBzcmNfYWRkcmVzcyArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBTaW1pbGFybHkgZm9yIGEgMjRiaXQgbW92LmIgICovCi0gICAgY2FzZSBSX01PVjI0QjI6Ci0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmIChkYXRhW2RzdF9hZGRyZXNzIC0gMl0gIT0gMHg2YSkKLQlhYm9ydCAoKTsKLQotICAgICAgLyogRml4IHVwIHRoZSBvcGNvZGUuICAqLwotICAgICAgc3dpdGNoIChkYXRhW3NyY19hZGRyZXNzLTFdICYgMHhmMCkKLQl7Ci0JY2FzZSAweDIwOgotCSAgZGF0YVtkc3RfYWRkcmVzcyAtIDJdID0gKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYpIHwgMHgyMDsKLQkgIGJyZWFrOwotCWNhc2UgMHhhMDoKLQkgIGRhdGFbZHN0X2FkZHJlc3MgLSAyXSA9IChkYXRhW3NyY19hZGRyZXNzLTFdICYgMHhmKSB8IDB4MzA7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIHZhbHVlICYgMHhmZiwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMSk7Ci0gICAgICBzcmNfYWRkcmVzcyArPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfQkNDX0lOVjoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQgCi0JICAgICArIGRzdF9hZGRyZXNzIAotCSAgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpICsgMTsKLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAoZ2FwIDwgLTEyOCB8fCBnYXAgPiAxMjYpCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgT0suICBGaXggdGhlIGNvbmRpdGlvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24sIGFwcGx5Ci0JIHRoZSByZWxvY2F0aW9uLCBhbmQgdXBkYXRlIHRoZSBzcmMvZHN0IGFkZHJlc3MgYXBwcm9wcmlhdGVseS4gICovCi0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX2dldF84IChhYmZkLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKSBeIDEsCi0JCSBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotICAgICAgZHN0X2FkZHJlc3MrKzsKLSAgICAgIHNyY19hZGRyZXNzKys7Ci0KLSAgICAgIC8qIEFsbCBkb25lLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0pNUF9ERUw6Ci0gICAgICBzcmNfYWRkcmVzcyArPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBBbiA4Yml0IG1lbW9yeSBpbmRpcmVjdCBpbnN0cnVjdGlvbiAoam1wL2pzcikuCi0KLSAgICAgICBUaGVyZSdzIHNldmVyYWwgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSBkb25lIHRvIGhhbmRsZQotICAgICAgIHRoaXMgcmVsb2NhdGlvbi4KLQotICAgICAgIElmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSBzeW1ib2wsIHRoZW4KLSAgICAgICB3ZSBzaG91bGQgaGFuZGxlIGl0IGp1c3QgUl9SRUxCWVRFLiAgTGlrZXdpc2UgaWYgaXQncwotICAgICAgIGZvciBhIHN5bWJvbCB3aXRoIGEgdmFsdWUgZ2UgMCBhbmQgbGUgMHhmZi4KLQotICAgICAgIE90aGVyd2lzZSBpdCdzIGEganVtcC9jYWxsIHRocm91Z2ggdGhlIGZ1bmN0aW9uIHZlY3RvciwKLSAgICAgICBhbmQgdGhlIGxpbmtlciBpcyBleHBlY3RlZCB0byBzZXQgdXAgdGhlIGZ1bmN0aW9uIHZlY3RvcgotICAgICAgIGFuZCBwdXQgdGhlIHJpZ2h0IHZhbHVlIGludG8gdGhlIGp1bXAvY2FsbCBpbnN0cnVjdGlvbi4gICovCi0gICAgY2FzZSBSX01FTV9JTkRJUkVDVDoKLSAgICAgIHsKLQkvKiBXZSBuZWVkIHRvIGZpbmQgdGhlIHN5bWJvbCBzbyB3ZSBjYW4gZGV0ZXJtaW5lIGl0J3MKLQkgICBhZGRyZXNzIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IgdGFibGUuICAqLwotCWFzeW1ib2wgKnN5bWJvbDsKLQliZmRfdm1hIHZhbHVlOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0Jc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqaDsKLQlhc2VjdGlvbiAqdmVjdG9yc19zZWMgPSBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGxpbmtfaW5mbyktPnZlY3RvcnNfc2VjOwotCi0JLyogRmlyc3Qgc2VlIGlmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSBzeW1ib2wKLQkgICBvciBhZ2FpbnN0IGEgc3ltYm9sIHdpdGggYSBub25uZWdhdGl2ZSB2YWx1ZSA8PSAweGZmLiAgKi8KLQlzeW1ib2wgPSAqKHJlbG9jLT5zeW1fcHRyX3B0cik7Ci0JdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0JaWYgKHN5bWJvbCA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2wKLQkgICAgfHwgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMHhmZikpCi0JICB7Ci0JICAgIC8qIFRoaXMgc2hvdWxkIGJlIGhhbmRsZWQgaW4gYSBtYW5uZXIgdmVyeSBzaW1pbGFyIHRvCi0JICAgICAgIFJfUkVMQllURVMuICAgSWYgdGhlIHZhbHVlIGlzIGluIHJhbmdlLCB0aGVuIGp1c3Qgc2xhbQotCSAgICAgICB0aGUgdmFsdWUgaW50byB0aGUgcmlnaHQgbG9jYXRpb24uICBFbHNlIHRyaWdnZXIgYQotCSAgICAgICByZWxvYyBvdmVyZmxvdyBjYWxsYmFjay4gICovCi0JICAgIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDB4ZmYpCi0JICAgICAgewotCQliZmRfcHV0XzggKGFiZmQsIHZhbHVlLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCQlkc3RfYWRkcmVzcyArPSAxOwotCQlzcmNfYWRkcmVzcyArPSAxOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCQlyZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkJaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkJICBhYm9ydCAoKTsKLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JLyogVGhpcyBpcyBhIGp1bXAvY2FsbCB0aHJvdWdoIGEgZnVuY3Rpb24gdmVjdG9yLCBhbmQgd2UncmUKLQkgICBleHBlY3RlZCB0byBjcmVhdGUgdGhlIGZ1bmN0aW9uIHZlY3RvciBvdXJzZWx2ZXMuIAotCi0JICAgRmlyc3QgbG9vayB1cCB0aGlzIHN5bWJvbCBpbiB0aGUgbGlua2VyIGhhc2ggdGFibGUgLS0gd2UgbmVlZAotCSAgIHRoZSBkZXJpdmVkIGxpbmtlciBzeW1ib2wgd2hpY2ggaG9sZHMgdGhpcyBzeW1ib2wncyBpbmRleAotCSAgIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IuICAqLwotCW5hbWUgPSBzeW1ib2wtPm5hbWU7Ci0JaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfTE9DQUwpCi0JICB7Ci0JICAgIGNoYXIgKm5ld19uYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDkpOwotCSAgICBpZiAobmV3X25hbWUgPT0gTlVMTCkKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICBzdHJjcHkgKG5ld19uYW1lLCBuYW1lKTsKLQkgICAgc3ByaW50ZiAobmV3X25hbWUgKyBzdHJsZW4gKG5hbWUpLCAiXyUwOHgiLAotCQkgICAgIChpbnQpc3ltYm9sLT5zZWN0aW9uKTsKLQkgICAgbmFtZSA9IG5ld19uYW1lOwotCSAgfQotCi0JaCA9IGZ1bmN2ZWNfaGFzaF9sb29rdXAgKGg4MzAwX2NvZmZfaGFzaF90YWJsZSAobGlua19pbmZvKS0+ZnVuY3ZlY19oYXNoX3RhYmxlLAotCQkJCSBuYW1lLCBmYWxzZSwgZmFsc2UpOwotCi0JLyogVGhpcyBzaG91bGRuJ3QgZXZlciBoYXBwZW4uICBJZiBpdCBkb2VzIHRoYXQgbWVhbnMgd2UndmUgZ290Ci0JICAgZGF0YSBjb3JydXB0aW9uIG9mIHNvbWUga2luZC4gIEFib3J0aW5nIHNlZW1zIGxpa2UgYSByZWFzb25hYmxlCi0JICAgdGhpbmsgdG8gZG8gaGVyZS4gICovCi0JaWYgKGggPT0gTlVMTCB8fCB2ZWN0b3JzX3NlYyA9PSBOVUxMKQotCSAgYWJvcnQgKCk7Ci0KLQkvKiBQbGFjZSB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gdmVjdG9yIGVudHJ5IGludG8gdGhlCi0JICAgcmVsb2MncyBhZGRyZXNzLiAgKi8KLQliZmRfcHV0XzggKGFiZmQsCi0JCSAgIHZlY3RvcnNfc2VjLT5vdXRwdXRfb2Zmc2V0ICsgaC0+b2Zmc2V0LAotCQkgICBkYXRhICsgZHN0X2FkZHJlc3MpOwotCi0JZHN0X2FkZHJlc3MrKzsKLQlzcmNfYWRkcmVzcysrOwotCi0JLyogTm93IGNyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgZnVuY3Rpb24gdmVjdG9yIGl0c2VsZi4gICovCi0JaWYgKGJmZF9nZXRfbWFjaCAoaW5wdXRfc2VjdGlvbi0+b3duZXIpID09IGJmZF9tYWNoX2g4MzAwKQotCSAgYmZkX3B1dF8xNiAoYWJmZCwKLQkJICAgICAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLAotCQkJCQkJICBsaW5rX2luZm8sCi0JCQkJCQkgIGlucHV0X3NlY3Rpb24pLAotCQkgICAgICB2ZWN0b3JzX3NlYy0+Y29udGVudHMgKyBoLT5vZmZzZXQpOwotCWVsc2UgaWYgKGJmZF9nZXRfbWFjaCAoaW5wdXRfc2VjdGlvbi0+b3duZXIpID09IGJmZF9tYWNoX2g4MzAwaAotCQkgfHwgYmZkX2dldF9tYWNoIChpbnB1dF9zZWN0aW9uLT5vd25lcikgPT0gYmZkX21hY2hfaDgzMDBzKQotCSAgYmZkX3B1dF8zMiAoYWJmZCwKLQkJICAgICAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLAotCQkJCQkJICBsaW5rX2luZm8sCi0JCQkJCQkgIGlucHV0X3NlY3Rpb24pLAotCQkgICAgICB2ZWN0b3JzX3NlYy0+Y29udGVudHMgKyBoLT5vZmZzZXQpOwotCWVsc2UKLQkgIGFib3J0ICgpOwotCi0JLyogR3Jvc3MuICBXZSd2ZSBhbHJlYWR5IHdyaXR0ZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSB2ZWN0b3Igc2VjdGlvbgotCSAgIGJlZm9yZSB3ZSBnZXQgaGVyZS4uLiAgU28gd2Ugd3JpdGUgaXQgYWdhaW4gd2l0aCB0aGUgbmV3IGRhdGEuICAqLwotCWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAodmVjdG9yc19zZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lciwKLQkJCQkgIHZlY3RvcnNfc2VjLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkgIHZlY3RvcnNfc2VjLT5jb250ZW50cywKLQkJCQkgIHZlY3RvcnNfc2VjLT5vdXRwdXRfb2Zmc2V0LAotCQkJCSAgdmVjdG9yc19zZWMtPl9yYXdfc2l6ZSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLQotICAgIH0KLQotICAqc3JjX3B0ciA9IHNyY19hZGRyZXNzOwotICAqZHN0X3B0ciA9IGRzdF9hZGRyZXNzOwotfQotCi0KLS8qIFJvdXRpbmUgZm9yIHRoZSBoODMwMCBsaW5rZXIuCi0KLSAgIFRoaXMgcm91dGluZSBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIHRoZSBzcGVjaWFsIFJfTUVNX0lORElSRUNUCi0gICByZWxvY3Mgb24gdGhlIGg4MzAwLiAgSXQncyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyBhIHZlY3RvcnMKLSAgIHNlY3Rpb24gYW5kIGF0dGFjaGluZyBpdCB0byBhbiBpbnB1dCBiZmQgYXMgd2VsbCBhcyBzaXppbmcKLSAgIHRoZSB2ZWN0b3JzIHNlY3Rpb24uICBJdCBhbHNvIGNyZWF0ZXMgb3VyIHZlY3RvcnMgaGFzaCB0YWJsZS4KLQotICAgSXQgdXNlcyB0aGUgZ2VuZXJpYyBsaW5rZXIgcm91dGluZXMgdG8gYWN0dWFsbHkgYWRkIHRoZSBzeW1ib2xzLgotICAgZnJvbSB0aGlzIEJGRCB0byB0aGUgYmZkIGxpbmtlciBoYXNoIHRhYmxlLiAgSXQgbWF5IGFkZCBhIGZldwotICAgc2VsZWN0ZWQgc3RhdGljIHN5bWJvbHMgdG8gdGhlIGJmZCBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1oODMwMF9iZmRfbGlua19hZGRfc3ltYm9scyhhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqc2VjOwotICBzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICpmdW5jdmVjX2hhc2hfdGFibGU7Ci0KLSAgLyogSWYgd2UgaGF2ZW4ndCBjcmVhdGVkIGEgdmVjdG9ycyBzZWN0aW9uLCBkbyBzbyBub3cuICAqLwotICBpZiAoIWg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjKQotICAgIHsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhlIGFwcHJvcHJpYXRlIGZsYWdzIGFyZSBzZXQsIGluY2x1ZGluZyBTRUNfSU5fTUVNT1JZLiAgKi8KLSAgICAgIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JICAgICAgIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfUkVBRE9OTFkpOwotICAgICAgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLAotCQkJCQkJCQkgICAgIi52ZWN0b3JzIik7Ci0KLSAgICAgIC8qIElmIHRoZSBzZWN0aW9uIHdhc24ndCBjcmVhdGVkLCBvciB3ZSBjb3VsZG4ndCBzZXQgdGhlIGZsYWdzLAotCSBxdWl0IHF1aWNrbHkgbm93LCByYXRoZXIgdGhhbiBkaWVpbmcgYSBwYWluZnVsIGRlYXRoIGxhdGVyLiAgKi8KLSAgICAgIGlmICghIGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwKLQkJCQkgICAgICBoODMwMF9jb2ZmX2hhc2hfdGFibGUoaW5mbyktPnZlY3RvcnNfc2VjLAotCQkJCSAgICAgIGZsYWdzKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEFsc28gY3JlYXRlIHRoZSB2ZWN0b3IgaGFzaCB0YWJsZS4gICovCi0gICAgICBmdW5jdmVjX2hhc2hfdGFibGUgPSAoKHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKikKLQliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSkpKTsKLQotICAgICAgaWYgKCFmdW5jdmVjX2hhc2hfdGFibGUpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBBbmQgaW5pdGlhbGl6ZSB0aGUgZnVuY3ZlYyBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGlmICghZnVuY3ZlY19oYXNoX3RhYmxlX2luaXQgKGZ1bmN2ZWNfaGFzaF90YWJsZSwgYWJmZCwKLQkJCQkgICAgZnVuY3ZlY19oYXNoX25ld2Z1bmMpKQotCXsKLQkgIGJmZF9yZWxlYXNlIChhYmZkLCBmdW5jdmVjX2hhc2hfdGFibGUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogU3RvcmUgYXdheSBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN2ZWMgaGFzaCB0YWJsZS4gICovCi0gICAgICBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5mdW5jdmVjX2hhc2hfdGFibGUgPSBmdW5jdmVjX2hhc2hfdGFibGU7Ci0gICAgfQotCi0gIC8qIExvYWQgdXAgdGhlIGZ1bmN0aW9uIHZlY3RvciBoYXNoIHRhYmxlLiAgKi8KLSAgZnVuY3ZlY19oYXNoX3RhYmxlID0gaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZnVuY3ZlY19oYXNoX3RhYmxlOwotCi0gIC8qIEFkZCB0aGUgc3ltYm9scyB1c2luZyB0aGUgZ2VuZXJpYyBjb2RlLiAgKi8KLSAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pOwotCi0gIC8qIE5vdyBzY2FuIHRoZSByZWxvY3MgZm9yIGFsbCB0aGUgc2VjdGlvbnMgaW4gdGhpcyBiZmQ7IGNyZWF0ZQotICAgICBhZGRpdGlvbmFsIHNwYWNlIGluIHRoZSAudmVjdG9ycyBzZWN0aW9uIGFzIG5lZWRlZC4gICovCi0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYzsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIGxvbmcgcmVsb2Nfc2l6ZSwgcmVsb2NfY291bnQsIGk7Ci0gICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgIGFyZWxlbnQgKipyZWxvY3M7Ci0KLSAgICAgIC8qIFN1Y2sgaW4gdGhlIHJlbG9jcywgc3ltYm9scyAmIGNhbm9uaWNhbGl6ZSB0aGVtLiAgKi8KLSAgICAgIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpOwotICAgICAgaWYgKHJlbG9jX3NpemUgPD0gMCkKLQljb250aW51ZTsKLQotICAgICAgcmVsb2NzID0gKGFyZWxlbnQgKiopYmZkX21hbGxvYyAoKHNpemVfdClyZWxvY19zaXplKTsKLSAgICAgIGlmICghcmVsb2NzKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIHN5bWJvbHMgc2hvdWxkIGhhdmUgYmVlbiByZWFkIGluIGJ5IF9iZmRfZ2VuZXJpYyBsaW5rX2FkZF9zeW1ib2xzCi0JIGNhbGwgYWJvdmVjLCBzbyB3ZSBjYW4gY2hlYXQgYW5kIHVzZSB0aGUgcG9pbnRlciB0byB0aGVtIHRoYXQgd2FzCi0JIHNhdmVkIGluIHRoZSBhYm92ZSBjYWxsLiAgKi8KLSAgICAgIHN5bWJvbHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyhhYmZkKTsKLSAgICAgIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWxvY3MsIHN5bWJvbHMpOwotICAgICAgaWYgKHJlbG9jX2NvdW50IDw9IDApCi0JewotCSAgZnJlZSAocmVsb2NzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTm93IHdhbGsgdGhyb3VnaCBhbGwgdGhlIHJlbG9jYXRpb25zIGluIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgcmVsb2NfY291bnQ7IGkrKykKLQl7Ci0JICBhcmVsZW50ICpyZWxvYyA9IHJlbG9jc1tpXTsKLQkgIGFzeW1ib2wgKnN5bWJvbCA9ICoocmVsb2MtPnN5bV9wdHJfcHRyKTsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgIC8qIFdlJ3ZlIGdvdCBhbiBpbmRpcmVjdCByZWxvYy4gIFNlZSBpZiB3ZSBuZWVkIHRvIGFkZCBpdAotCSAgICAgdG8gdGhlIGZ1bmN0aW9uIHZlY3RvciB0YWJsZS4gICBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlCi0JICAgICB0byBhZGQgYSBuZXcgZW50cnkgZm9yIGVhY2ggdW5pcXVlIHN5bWJvbCByZWZlcmVuY2VkCi0JICAgICBieSBhbiBSX01FTV9JTkRJUkVDVCByZWxvY2F0aW9uIGV4Y2VwdCBmb3IgYSByZWxvYwotCSAgICAgYWdhaW5zdCB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wuICAqLwotCSAgaWYgKHJlbG9jLT5ob3d0by0+dHlwZSA9PSBSX01FTV9JTkRJUkVDVAotCSAgICAgICYmIHN5bWJvbCAhPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2wpCi0KLQkgICAgewotCSAgICAgIHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgICBuYW1lID0gc3ltYm9sLT5uYW1lOwotCSAgICAgIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0xPQ0FMKQotCQl7Ci0JCSAgY2hhciAqbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgOSk7Ci0KLQkJICBpZiAobmV3X25hbWUgPT0gTlVMTCkKLQkJICAgIGFib3J0ICgpOwotCi0JCSAgc3RyY3B5IChuZXdfbmFtZSwgbmFtZSk7Ci0JCSAgc3ByaW50ZiAobmV3X25hbWUgKyBzdHJsZW4gKG5hbWUpLCAiXyUwOHgiLAotCQkJICAgKGludClzeW1ib2wtPnNlY3Rpb24pOwotCQkgIG5hbWUgPSBuZXdfbmFtZTsKLQkJfQotCi0JICAgICAgLyogTG9vayB0aGlzIHN5bWJvbCB1cCBpbiB0aGUgZnVuY3Rpb24gdmVjdG9yIGhhc2ggdGFibGUuICAqLwotCSAgICAgIGggPSBmdW5jdmVjX2hhc2hfbG9va3VwIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5mdW5jdmVjX2hhc2hfdGFibGUsCi0JCQkJICAgICAgIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0KLQotCSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzbid0IGFscmVhZHkgaW4gdGhlIGhhc2ggdGFibGUsIGFkZAotCQkgaXQgYW5kIGJ1bXAgdXAgdGhlIHNpemUgb2YgdGhlIGhhc2ggdGFibGUuICAqLwotCSAgICAgIGlmIChoID09IE5VTEwpCi0JCXsKLQkJICBoID0gZnVuY3ZlY19oYXNoX2xvb2t1cCAoaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZnVuY3ZlY19oYXNoX3RhYmxlLAotCQkJCQkgICBuYW1lLCB0cnVlLCB0cnVlKTsKLQkJICBpZiAoaCA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBmcmVlIChyZWxvY3MpOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICAvKiBCdW1wIHRoZSBzaXplIG9mIHRoZSB2ZWN0b3JzIHNlY3Rpb24uICBFYWNoIHZlY3RvcgotCQkgICAgIHRha2VzIDIgYnl0ZXMgb24gdGhlIGg4MzAwIGFuZCA0IGJ5dGVzIG9uIHRoZSBoODMwMGguICAqLwotCQkgIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwKQotCQkgICAgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPl9yYXdfc2l6ZSArPSAyOwotCQkgIGVsc2UgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBoCi0JCQkgICB8fCBiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwcykKLQkJICAgIGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjLT5fcmF3X3NpemUgKz0gNDsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXZSdyZSBkb25lIHdpdGggdGhlIHJlbG9jYXRpb25zLCByZWxlYXNlIHRoZW0uICAqLwotICAgICAgZnJlZSAocmVsb2NzKTsKLSAgICB9Ci0KLSAgLyogTm93IGFjdHVhbGx5IGFsbG9jYXRlIHNvbWUgc3BhY2UgZm9yIHRoZSBmdW5jdGlvbiB2ZWN0b3IuICBJdCdzCi0gICAgIHdhc3RlZnVsIHRvIGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UsIGJ1dCB0aGlzIGlzIGVhc2llci4gICovCi0gIGlmIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+X3Jhd19zaXplICE9IDApCi0gICAgewotICAgICAgLyogRnJlZSB0aGUgb2xkIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+Y29udGVudHMpCi0JZnJlZSAoaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPmNvbnRlbnRzKTsKLQotICAgICAgLyogQWxsb2NhdGUgbmV3IGNvbnRlbnRzLiAgKi8KLSAgICAgIGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjLT5jb250ZW50cwotCT0gYmZkX21hbGxvYyAoaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPl9yYXdfc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyBoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZSBoODMwMF9yZWxvYzE2X2VzdGltYXRlCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMgaDgzMDBfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBoODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLQotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotCi0jdW5kZWYgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jdW5kZWYgY29mZl9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgotCi0KLQotY29uc3QgYmZkX3RhcmdldCBoODMwMGNvZmZfdmVjID0KLXsKLSAgImNvZmYtaDgzMDAiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFICksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyBjaGFyICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaDg1MDAuYyBiL2JmZC9jb2ZmLWg4NTAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMTA5ZWEuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtaDg1MDAuYworKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhpdGFjaGkgSDgvNTAwIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiY29mZi9oODUwMC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgxKQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2ltbTggPQotSE9XVE8gKFJfSDg1MDBfSU1NOCwgMCwgMSwgOCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2ltbTgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tMTYgPQotSE9XVE8gKFJfSDg1MDBfSU1NMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tMjQgPQotSE9XVE8gKFJfSDg1MDBfSU1NMjQsIDAsIDEsIDI0LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tMjQiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tMzIgPQotSE9XVE8gKFJfSDg1MDBfSU1NMzIsIDAsIDEsIDMyLCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tMzIiLCB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSk7Ci0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9oaWdoOCA9Ci1IT1dUTyAoUl9IODUwMF9ISUdIOCwgMCwgMSwgOCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgInJfaGlnaDgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfbG93MTYgPQotSE9XVE8gKFJfSDg1MDBfTE9XMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAicl9sb3cxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9wY3JlbDggPQotSE9XVE8gKFJfSDg1MDBfUENSRUw4LCAwLCAxLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJyX3BjcmVsOCIsIHRydWUsIDAsIDAsIHRydWUpOwotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfcGNyZWwxNiA9Ci1IT1dUTyAoUl9IODUwMF9QQ1JFTDE2LCAwLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAicl9wY3JlbDE2IiwgdHJ1ZSwgMCwgMCwgdHJ1ZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaGlnaDE2ID0KLUhPV1RPIChSX0g4NTAwX0hJR0gxNiwgMCwgMSwgOCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgInJfaGlnaDE2IiwgdHJ1ZSwgMHgwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSk7Ci0KLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotc3RhdGljIGludCAKLWNvZmZfaDg1MDBfc2VsZWN0X3JlbG9jIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiBob3d0by0+dHlwZTsKLX0KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeC5yX3R5cGUgPSBjb2ZmX2g4NTAwX3NlbGVjdF9yZWxvYyhob3d0bykKLQotCi0jZGVmaW5lIEJBRE1BRyh4KSBIODUwMEJBRE1BRyh4KQotI2RlZmluZSBIODUwMCAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBcCi0gIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsgXAotICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7Ci0KLS8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZQotICAgKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvKGludGVybmFsLCBkc3QpCi0gICAgIGFyZWxlbnQgKiBpbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIHN3aXRjaCAoZHN0LT5yX3R5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU04OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU0xNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0lNTTI0OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tMjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMzI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9pbW0zMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9QQ1JFTDg6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9wY3JlbDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfUENSRUwxNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX3BjcmVsMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSElHSDg6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9oaWdoODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9ISUdIMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9oaWdoMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfTE9XMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9sb3cxNjsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKLQotCi0vKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgbWFnaWMgdG8gdGhlIGFkZGVuZCBpbiBhIHJlbG9jIGVudHJ5ICovCi0KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBzeW1ib2wsIGV4dF9yZWxvYywgY2FjaGVfcHRyKSBcCi0gY2FjaGVfcHRyLT5hZGRlbmQgPSAgZXh0X3JlbG9jLnJfb2Zmc2V0OwotCi0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkIHJlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKiByZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKiogc3ltYm9sczsKLSAgICAgYmZkICogYWJmZDsKLSAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOwotewotICByZWxlbnQtPmFkZHJlc3MgPSByZWxvYy0+cl92YWRkcjsKLSAgcnR5cGUyaG93dG8gKHJlbGVudCwgcmVsb2MpOwotCi0gIGlmIChyZWxvYy0+cl9zeW1uZHggPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLQotCi0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotICByZWxlbnQtPmFkZHJlc3MgLT0gc2VjdGlvbi0+dm1hOwotfQotCi1zdGF0aWMgdm9pZAotZXh0cmFfY2FzZSAoaW5fYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwgZHN0X3B0cikKLSAgICAgYmZkICppbl9hYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHI7Ci17Ci0gIGJmZF9ieXRlICpkID0gZGF0YSsqZHN0X3B0cjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSDg1MDBfSU1NODoKLSAgICAgIGJmZF9wdXRfOCAoaW5fYWJmZCwKLQkJIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJIGQpOwotICAgICAgKCpkc3RfcHRyKSArPSAxOwotICAgICAgKCpzcmNfcHRyKSArPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSDg1MDBfSElHSDg6Ci0gICAgICBiZmRfcHV0XzggKGluX2FiZmQsCi0JCSAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pCi0JCSAgPj4gMTYpLAotCQkgZCApOwotICAgICAgKCpkc3RfcHRyKSArPSAxOwotICAgICAgKCpzcmNfcHRyKSArPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSDg1MDBfSU1NMTY6Ci0gICAgICBiZmRfcHV0XzE2IChpbl9hYmZkLAotCQkgIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJICBkICApOwotICAgICAgKCpkc3RfcHRyKSArPSAyOwotICAgICAgKCpzcmNfcHRyKSArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSDg1MDBfTE9XMTY6Ci0gICAgICBiZmRfcHV0XzE2IChpbl9hYmZkLAotCQkgIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJICBkKTsKLQotICAgICAgKCpkc3RfcHRyKSArPSAyOwotICAgICAgKCpzcmNfcHRyKSArPSAyOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfSDg1MDBfSElHSDE2OgotICAgICAgYmZkX3B1dF8xNiAoaW5fYWJmZCwKLQkJICAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pCi0JCSAgID4+MTYpLAotCQkgIGQpOwotCi0gICAgICAoKmRzdF9wdHIpICs9IDI7Ci0gICAgICAoKnNyY19wdHIpICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9IODUwMF9JTU0yNDoKLSAgICAgIHsKLQlpbnQgdiA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCWludCBvID0gYmZkX2dldF8zMihpbl9hYmZkLCBkYXRhKyAqZHN0X3B0ciAtMSk7Ci0JdiA9ICh2ICYgMHgwMGZmZmZmZikgfCAobyAmIDB4ZmYwMDAwMCk7Ci0JYmZkX3B1dF8zMiAoaW5fYWJmZCwgdiwgZGF0YSAgKyAqZHN0X3B0ciAtMSk7Ci0JKCpkc3RfcHRyKSArPTM7Ci0JKCpzcmNfcHRyKSs9Mzs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMzI6Ci0gICAgICB7Ci0JaW50IHYgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQliZmRfcHV0XzMyIChpbl9hYmZkLCB2LCBkYXRhICArICpkc3RfcHRyKTsKLQkoKmRzdF9wdHIpICs9NDsKLQkoKnNyY19wdHIpKz00OzsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIFJfSDg1MDBfUENSRUw4OgotICAgICAgewotCWJmZF92bWEgZHN0ID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgIGlucHV0X3NlY3Rpb24pOwotCWJmZF92bWEgZG90ID0gbGlua19vcmRlci0+b2Zmc2V0Ci0JICArICpkc3RfcHRyCi0JICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCWludCBnYXAgPSBkc3QgLSBkb3QgLSAxOyAvKiAtMSBzaW5jZSB3ZXJlIGluIHRoZSBvZGQgYnl0ZSBvZiB0aGUKLQkJCQkgICAgd29yZCBhbmQgdGhlIHBjJ3MgYmVlbiBpbmNyZW1lbnRlZCAqLwotCi0JaWYgKGdhcCA+IDEyOCB8fCBnYXAgPCAtMTI4KQotCSAgewotCSAgICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgICAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgICAgYWJvcnQgKCk7Ci0JICB9Ci0JYmZkX3B1dF84IChpbl9hYmZkLCBnYXAsIGRhdGEgKyAqZHN0X3B0cik7Ci0JKCpkc3RfcHRyKSsrOwotCSgqc3JjX3B0cikrKzsKLQlicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIFJfSDg1MDBfUENSRUwxNjoKLSAgICAgIHsKLQliZmRfdm1hIGRzdCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfdm1hIGRvdCA9IGxpbmtfb3JkZXItPm9mZnNldAotCSAgKyAqZHN0X3B0cgotCSAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQlpbnQgZ2FwID0gZHN0IC0gZG90IC0gMTsgLyogLTEgc2luY2Ugd2VyZSBpbiB0aGUgb2RkIGJ5dGUgb2YgdGhlCi0JCQkJICAgIHdvcmQgYW5kIHRoZSBwYydzIGJlZW4gaW5jcmVtZW50ZWQgKi8KLQotCWlmIChnYXAgPiAzMjc2NyB8fCBnYXAgPCAtMzI3NjgpCi0JICB7Ci0JICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgICBhYm9ydCAoKTsKLQkgIH0KLQliZmRfcHV0XzE2IChpbl9hYmZkLCBnYXAsIGRhdGEgKyAqZHN0X3B0cik7Ci0JKCpkc3RfcHRyKSs9MjsKLQkoKnNyY19wdHIpKz0yOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMgZXh0cmFfY2FzZQotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotCi0jdW5kZWYgIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI3VuZGVmIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgY29mZl9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24KLQotY29uc3QgYmZkX3RhcmdldCBoODUwMGNvZmZfdmVjID0KLXsKLSAgImNvZmYtaDg1MDAiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgQ09GRl9TV0FQX1RBQkxFLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWkzODYuYyBiL2JmZC9jb2ZmLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5OGNjMS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1pMzg2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzcgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImNvZmYvaTM4Ni5oIgotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0jaW5jbHVkZSAiY29mZi9wZS5oIgotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0dPMzJfRVhFCi0jaW5jbHVkZSAiY29mZi9nbzMyZXhlLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb2ZmX2kzODZfcmVsb2MgCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmNvZmZfaTM4Nl9ydHlwZV90b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwKLQotCSAgIGJmZF92bWEgKikpOwotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKLS8qIFRoZSBwYWdlIHNpemUgaXMgYSBndWVzcyBiYXNlZCBvbiBFTEYuICAqLwotCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAotCi0vKiBGb3Igc29tZSByZWFzb24gd2hlbiB1c2luZyBpMzg2IENPRkYgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgLnRleHQKLSAgIHNlY3Rpb24gZm9yIGEgcmVmZXJlbmNlIHRvIGEgY29tbW9uIHN5bWJvbCBpcyB0aGUgdmFsdWUgaXRzZWxmIHBsdXMKLSAgIGFueSBkZXNpcmVkIG9mZnNldC4gIElhbiBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LiAgKi8KLQotLyogSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBuZWVkIHRvIGRvIHNvbWUKLSAgIGFkanVzdG1lbnRzIHRvIHRoZSBvYmplY3QgZmlsZSB0aGF0IGFyZSBub3QgZG9uZSBieSB0aGUKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBldmVyeQotICAgcmVsb2MgdHlwZSB0byBtYWtlIGFueSByZXF1aXJlZCBhZGp1c3RtZW50cy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfaTM4Nl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBzeW12YWx1ZSBkaWZmOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIC8qIFdlIGFyZSByZWxvY2F0aW5nIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBjdXJyZW50IHZhbHVlIGluIHRoZQotCSBvYmplY3QgZmlsZSBpcyBPUklHICsgT0ZGU0VULCB3aGVyZSBPUklHIGlzIHRoZSB2YWx1ZSBvZiB0aGUKLQkgY29tbW9uIHN5bWJvbCBhcyBzZWVuIGJ5IHRoZSBvYmplY3QgZmlsZSB3aGVuIGl0IHdhcyBjb21waWxlZAotCSAodGhpcyBtYXkgYmUgemVybyBpZiB0aGUgc3ltYm9sIHdhcyB1bmRlZmluZWQpIGFuZCBPRkZTRVQgaXMKLQkgdGhlIG9mZnNldCBpbnRvIHRoZSBjb21tb24gc3ltYm9sIChub3JtYWxseSB6ZXJvLCBidXQgbWF5IGJlCi0JIG5vbi16ZXJvIHdoZW4gcmVmZXJyaW5nIHRvIGEgZmllbGQgaW4gYSBjb21tb24gc3RydWN0dXJlKS4KLQkgT1JJRyBpcyB0aGUgbmVnYXRpdmUgb2YgcmVsb2NfZW50cnktPmFkZGVuZCwgd2hpY2ggaXMgc2V0IGJ5Ci0JIHRoZSBDQUxDX0FEREVORCBtYWNybyBiZWxvdy4gIFdlIHdhbnQgdG8gcmVwbGFjZSB0aGUgdmFsdWUgaW4KLQkgdGhlIG9iamVjdCBmaWxlIHdpdGggTkVXICsgT0ZGU0VULCB3aGVyZSBORVcgaXMgdGhlIHZhbHVlIG9mCi0JIHRoZSBjb21tb24gc3ltYm9sIHdoaWNoIHdlIGFyZSBnb2luZyB0byBwdXQgaW4gdGhlIGZpbmFsCi0JIG9iamVjdCBmaWxlLiAgTkVXIGlzIHN5bWJvbC0+dmFsdWUuICAqLwotICAgICAgZGlmZiA9IHN5bWJvbC0+dmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotI2Vsc2UKLSAgICAgIC8qIEluIFBFIG1vZGUsIHdlIGRvIG5vdCBvZmZzZXQgdGhlIGNvbW1vbiBzeW1ib2wuICAqLwotICAgICAgZGlmZiA9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb24gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBhbHdheXMgZWZmZWN0aXZlbHkKLQkgaWdub3JlcyB0aGUgYWRkZW5kIGZvciBhIENPRkYgdGFyZ2V0IHdoZW4gcHJvZHVjaW5nCi0JIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGlzIHNlZW1zIHRvIGJlIGFsd2F5cyB3cm9uZyBmb3IgMzg2Ci0JIENPRkYsIHNvIHdlIGhhbmRsZSB0aGUgYWRkZW5kIGhlcmUgaW5zdGVhZC4gICovCi0gICAgICBkaWZmID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgLyogRklYTUU6IEhvdyBzaG91bGQgdGhpcyBjYXNlIGJlIGhhbmRsZWQ/ICAqLwotICBpZiAocmVsb2NfZW50cnktPmhvd3RvLT50eXBlID09IFJfSU1BR0VCQVNFICYmIGRpZmYgIT0gMCkKLSAgICBhYm9ydCAoKTsKLSNlbmRpZgotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIGRpZmYpICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICAgIGlmIChkaWZmICE9IDApCi0gICAgICB7Ci0JcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0JdW5zaWduZWQgY2hhciAqYWRkciA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotCXN3aXRjaCAoaG93dG8tPnNpemUpCi0JICB7Ci0JICBjYXNlIDA6Ci0JICAgIHsKLQkgICAgICBjaGFyIHggPSBiZmRfZ2V0XzggKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMToKLQkgICAgewotCSAgICAgIHNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAyOgotCSAgICB7Ci0JICAgICAgbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotICAgICAgfQotCi0gIC8qIE5vdyBsZXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmaW5pc2ggZXZlcnl0aGluZyB1cC4gICovCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLS8qIFJldHVybiB0cnVlIGlmIHRoaXMgcmVsb2NhdGlvbiBzaG91bGQKLSAgIGFwcGVhciBpbiB0aGUgb3V0cHV0IC5yZWxvYyBzZWN0aW9uLiAqLwotCi1zdGF0aWMgYm9vbGVhbiBpbl9yZWxvY19wKGFiZmQsIGhvd3RvKQotICAgICBiZmQgKiBhYmZkOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLXsKLSAgcmV0dXJuICEgaG93dG8tPnBjX3JlbGF0aXZlICYmIGhvd3RvLT50eXBlICE9IFJfSU1BR0VCQVNFOwotfSAgICAgCi0jZW5kaWYKLQotI2lmbmRlZiBQQ1JFTE9GRlNFVAotI2RlZmluZSBQQ1JFTE9GRlNFVCBmYWxzZQotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSAKLXsKLSAgezB9LAotICB7MX0sCi0gIHsyfSwKLSAgezN9LAotICB7NH0sCi0gIHs1fSwKLSAgSE9XVE8gKFJfRElSMzIsICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLCAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJkaXIzMiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogezd9LCAqLwotICBIT1dUTyAoUl9JTUFHRUJBU0UsICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLCAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJydmEzMiIsCSAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIHswMTB9LAotICB7MDExfSwKLSAgezAxMn0sCi0gIHswMTN9LAotICB7MDE0fSwKLSAgezAxNX0sCi0gIHswMTZ9LAotICBIT1dUTyAoUl9SRUxCWVRFLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDgsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiOCIsCQkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEhPV1RPIChSX1JFTFdPUkQsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiMTYiLAkJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9SRUxMT05HLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIjMyIiwJCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgSE9XVE8gKFJfUENSQllURSwJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSA4LAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkRJU1A4IiwJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9QQ1JXT1JELAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkRJU1AxNiIsCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgSE9XVE8gKFJfUENSTE9ORywJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJESVNQMzIiLAkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgIG51bm1iZXIgKi8KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeyB4LnJfdHlwZSA9IGhvd3RvLT50eXBlOyB9Ci0jZGVmaW5lIEJBRE1BRyh4KSBJMzg2QkFETUFHKHgpCi0jZGVmaW5lIEkzODYgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIFwKLQkgICAgKGNhY2hlX3B0ciktPmhvd3RvID0gaG93dG9fdGFibGUgKyAoZHN0KS0+cl90eXBlOwotCi0vKiBGb3IgMzg2IENPRkYgYSBTVFlQX05PTE9BRCB8IFNUWVBfQlNTIHNlY3Rpb24gaXMgcGFydCBvZiBhIHNoYXJlZAotICAgbGlicmFyeS4gIE9uIHNvbWUgb3RoZXIgQ09GRiB0YXJnZXRzIFNUWVBfQlNTIGlzIG5vcm1hbGx5Ci0gICBTVFlQX05PTE9BRC4gICovCi0jZGVmaW5lIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLQotLyogQ29tcHV0ZSB0aGUgYWRkZW5kIG9mIGEgcmVsb2MuICBJZiB0aGUgcmVsb2MgaXMgdG8gYSBjb21tb24gc3ltYm9sLAotICAgdGhlIG9iamVjdCBmaWxlIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgY29tbW9uIHN5bWJvbC4gIEJ5IHRoZQotICAgdGltZSB0aGlzIGlzIGNhbGxlZCwgdGhlIGxpbmtlciBtYXkgYmUgdXNpbmcgYSBkaWZmZXJlbnQgc3ltYm9sCi0gICBmcm9tIGEgZGlmZmVyZW50IG9iamVjdCBmaWxlIHdpdGggYSBkaWZmZXJlbnQgdmFsdWUuICBUaGVyZWZvcmUsIHdlCi0gICBoYWNrIHdpbGRseSB0byBsb2NhdGUgdGhlIG9yaWdpbmFsIHN5bWJvbCBmcm9tIHRoaXMgZmlsZSBzbyB0aGF0IHdlCi0gICBjYW4gbWFrZSB0aGUgY29ycmVjdCBhZGp1c3RtZW50LiAgVGhpcyBtYWNybyBzZXRzIGNvZmZzeW0gdG8gdGhlCi0gICBzeW1ib2wgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZSwgYW5kIHVzZXMgaXQgdG8gc2V0IHRoZSBhZGRlbmQgdmFsdWUKLSAgIGNvcnJlY3RseS4gIElmIHRoaXMgaXMgbm90IGEgY29tbW9uIHN5bWJvbCwgdGhlIHVzdWFsIGFkZGVuZAotICAgY2FsY3VsYXRpb24gaXMgZG9uZSwgZXhjZXB0IHRoYXQgYW4gYWRkaXRpb25hbCB0d2VhayBpcyBuZWVkZWQgZm9yCi0gICBQQyByZWxhdGl2ZSByZWxvY3MuCi0gICBGSVhNRTogVGhpcyBtYWNybyByZWZlcnMgdG8gc3ltYm9scyBhbmQgYXNlY3Q7IHRoZXNlIGFyZSBmcm9tIHRoZQotICAgY2FsbGluZyBmdW5jdGlvbiwgbm90IHRoZSBtYWNybyBhcmd1bWVudHMuICAqLwotCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikJCVwKLSAgewkJCQkJCQkJXAotICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZzeW0gPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwlcCi0gICAgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgIT0gYWJmZCkJCQlcCi0gICAgICBjb2Zmc3ltID0gKG9ial9zeW1ib2xzIChhYmZkKQkJCQlcCi0JICAgICAgICAgKyAoY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAtIHN5bWJvbHMpKTsJCVwKLSAgICBlbHNlIGlmIChwdHIpCQkJCQkJXAotICAgICAgY29mZnN5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHB0cik7CQkJXAotICAgIGlmIChjb2Zmc3ltICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwJCQlcCi0JJiYgY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID09IDApCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlOwlcCi0gICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkCQlcCi0JICAgICAmJiBwdHItPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gKHB0ci0+c2VjdGlvbi0+dm1hICsgcHRyLT52YWx1ZSk7CVwKLSAgICBlbHNlCQkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsJCQkJCVwKLSAgICBpZiAocHRyICYmIGhvd3RvX3RhYmxlW3JlbG9jLnJfdHlwZV0ucGNfcmVsYXRpdmUpCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCArPSBhc2VjdC0+dm1hOwkJCQlcCi0gIH0KLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIuICBGb3Igbm9ybWFsIGkzODYgQ09GRiwgd2UKLSAgIGNhbiB1c2UgdGhlIGdlbmVyaWMgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgRm9yIFBFLCB3ZSBuZWVkIG91cgotICAgb3duIHJvdXRpbmUuICAqLwotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uCi0KLSNlbHNlIC8qIENPRkZfV0lUSF9QRSAqLwotCi0vKiBUaGUgUEUgcmVsb2NhdGUgc2VjdGlvbiByb3V0aW5lLiAgVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMKLSAgIGFuZCB0aGUgcmVndWxhciByb3V0aW5lIGlzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZyBmb3IgYQotICAgcmVsb2NhdGVhYmxlIGxpbmsuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX3BlX2kzODZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfcGVfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsCi0JCQkgICAgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbG9jcywgc3ltcywKLQkJCSAgICAgICBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsCi0JCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsCi0JCQkJCSAgICAgcmVsb2NzLCBzeW1zLCBzZWN0aW9ucyk7Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGNvZmZfcGVfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uCi0KLSNlbmRpZiAvKiBDT0ZGX1dJVEhfUEUgKi8KLQotLyogQ29udmVydCBhbiBydHlwZSB0byBob3d0byBmb3IgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX2kzODZfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICBiZmRfdm1hICphZGRlbmRwOwotewotCi0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gIGhvd3RvID0gaG93dG9fdGFibGUgKyByZWwtPnJfdHlwZTsKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotICAqYWRkZW5kcCA9IDA7Ci0jZW5kaWYKLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgICphZGRlbmRwICs9IHNlYy0+dm1hOwotCi0gIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gPT0gMCAmJiBzeW0tPm5fdmFsdWUgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBzZWN0aW9uIGNvbnRlbnRzIGluY2x1ZGUgdGhlCi0JIHNpemUgKHN5bS0+bl92YWx1ZSkgYXMgYW4gYWRkZW5kLiAgVGhlIHJlbG9jYXRlX3NlY3Rpb24KLQkgZnVuY3Rpb24gd2lsbCBiZSBhZGRpbmcgaW4gdGhlIGZpbmFsIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBXZQotCSBuZWVkIHRvIHN1YnRyYWN0IG91dCB0aGUgY3VycmVudCBzaXplIGluIG9yZGVyIHRvIGdldCB0aGUKLQkgY29ycmVjdCByZXN1bHQuICAqLwotIAotICAgICAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIC8qIEkgdGhpbmsgd2UgKmRvKiB3YW50IHRvIGJ5cGFzcyB0aGlzLiAgSWYgd2UgZG9uJ3QsIEkgaGF2ZQotCSBzZWVuIHNvbWUgZGF0YSBwYXJhbWV0ZXJzIGdldCB0aGUgd3JvbmcgcmVsb2NhdGlvbiBhZGRyZXNzLgotCSBJZiBJIGxpbmsgdHdvIHZlcnNpb25zIHdpdGggYW5kIHdpdGhvdXQgdGhpcyBzZWN0aW9uIGJ5cGFzc2VkCi0JIGFuZCB0aGVuIGRvIGEgYmluYXJ5IGNvbXBhcmlzb24sIHRoZSBhZGRyZXNzZXMgd2hpY2ggYXJlCi0JIGRpZmZlcmVudCBjYW4gYmUgbG9va2VkIHVwIGluIHRoZSBtYXAuICBUaGUgY2FzZSBpbiB3aGljaAotCSB0aGlzIHNlY3Rpb24gaGFzIGJlZW4gYnlwYXNzZWQgaGFzIGFkZHJlc3NlcyB3aGljaCBjb3JyZXNwb25kCi0JIHRvIHZhbHVlcyBJIGNhbiBmaW5kIGluIHRoZSBtYXAuICAqLwotICAgICAgKmFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOwotI2VuZGlmCi0gICAgfQotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAvKiBJZiB0aGUgb3V0cHV0IHN5bWJvbCBpcyBjb21tb24gKGluIHdoaWNoIGNhc2UgdGhpcyBtdXN0IGJlIGEKLSAgICAgcmVsb2NhdGVhYmxlIGxpbmspLCB3ZSBuZWVkIHRvIGFkZCBpbiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUKLSAgICAgY29tbW9uIHN5bWJvbC4gICovCi0gIGlmIChoICE9IE5VTEwgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKSAKLSAgICAqYWRkZW5kcCArPSBoLT5yb290LnUuYy5zaXplOwotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICB7Ci0gICAgICAqYWRkZW5kcCAtPSA0OwotCi0gICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQsIHRoZW4gdGhlIGdlbmVyaWMgY29kZSBpcyBnb2luZyB0bwotICAgICAgICAgYWRkIGJhY2sgdGhlIHN5bWJvbCB2YWx1ZSBpbiBvcmRlciB0byBjYW5jZWwgb3V0IGFuCi0gICAgICAgICBhZGp1c3RtZW50IGl0IG1hZGUgdG8gdGhlIGFkZGVuZC4gIEhvd2V2ZXIsIHdlIHNldCB0aGUgYWRkZW5kCi0gICAgICAgICB0byAwIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uLiAgV2UgbmVlZCB0byBhZGp1c3QgaGVyZSwKLSAgICAgICAgIHRvIGF2b2lkIHRoZSBhZGp1c3RtZW50IHRoZSBnZW5lcmljIGNvZGUgd2lsbCBtYWtlLiAgRklYTUU6Ci0gICAgICAgICBUaGlzIGlzIGdldHRpbmcgYSBiaXQgaGFja2lzaC4gICovCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JKmFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOwotICAgIH0KLQotICBpZiAocmVsLT5yX3R5cGUgPT0gUl9JTUFHRUJBU0UpCi0gICAgewotICAgICAgKmFkZGVuZHAgLT0gcGVfZGF0YShzZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lciktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIGhvd3RvOwotfQotCi0KLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgY29mZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwCi0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX1JWQToKLSAgICAgIHJldHVybiBob3d0b190YWJsZSArUl9JTUFHRUJBU0U7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICByZXR1cm4gaG93dG9fdGFibGUgKyBSX0RJUjMyOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOgotICAgICAgcmV0dXJuIGhvd3RvX3RhYmxlICsgUl9QQ1JMT05HOwotICAgIGRlZmF1bHQ6Ci0gICAgICBCRkRfRkFJTCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIGNvZmZfaTM4Nl9ydHlwZV90b19ob3d0bwotCi0jaWZkZWYgVEFSR0VUX1VOREVSU0NPUkUKLQotLyogSWYgaTM4NiBnY2MgdXNlcyB1bmRlcnNjb3JlcyBmb3Igc3ltYm9sIG5hbWVzLCB0aGVuIGl0IGRvZXMgbm90IHVzZQotICAgYSBsZWFkaW5nIGRvdCBmb3IgbG9jYWwgbGFiZWxzLCBzbyBpZiBUQVJHRVRfVU5ERVJTQ09SRSBpcyBkZWZpbmVkCi0gICB3ZSB0cmVhdCBhbGwgc3ltYm9scyBzdGFydGluZyB3aXRoIEwgYXMgbG9jYWwuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX2kzODZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2kzODZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAobmFtZVswXSA9PSAnTCcpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIF9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKTsKLX0KLQotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGNvZmZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lCi0KLSNlbmRpZiAvKiBUQVJHRVRfVU5ERVJTQ09SRSAqLwotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotaTNjb2ZmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gIC8qIFdlIG5lZWQgdG8gaGFjayBiYWRseSB0byBoYW5kbGUgYSBQRSBpbWFnZSBjb3JyZWN0bHkuICBJbiBQRQotICAgICBpbWFnZXMgY3JlYXRlZCBieSB0aGUgR05VIGxpbmtlciwgdGhlIG9mZnNldCB0byB0aGUgQ09GRiBoZWFkZXIKLSAgICAgaXMgYWx3YXlzIHRoZSBzaXplLiAgSG93ZXZlciwgdGhpcyBpcyBub3QgdGhlIGNhc2UgaW4gaW1hZ2VzCi0gICAgIGdlbmVyYXRlZCBieSBvdGhlciBQRSBsaW5rZXJzLiAgVGhlIFBFIGZvcm1hdCBzdG9yZXMgYSBmb3VyIGJ5dGUKLSAgICAgb2Zmc2V0IHRvIHRoZSBQRSBzaWduYXR1cmUganVzdCBiZWZvcmUgdGhlIENPRkYgaGVhZGVyIGF0Ci0gICAgIGxvY2F0aW9uIDB4M2Mgb2YgdGhlIGZpbGUuICBXZSBwaWNrIHVwIHRoYXQgb2Zmc2V0LCB2ZXJpZnkgdGhhdAotICAgICB0aGUgUEUgc2lnbmF0dXJlIGlzIHRoZXJlLCBhbmQgdGhlbiBzZXQgb3Vyc2VsdmVzIHVwIHRvIHJlYWQgaW4KLSAgICAgdGhlIENPRkYgaGVhZGVyLiAgKi8KLSAgewotICAgIGJmZF9ieXRlIGV4dF9vZmZzZXRbNF07Ci0gICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgIGJmZF9ieXRlIGV4dF9zaWduYXR1cmVbNF07Ci0gICAgdW5zaWduZWQgbG9uZyBzaWduYXR1cmU7Ci0KLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIDB4M2MsIFNFRUtfU0VUKSAhPSAwCi0JfHwgYmZkX3JlYWQgKGV4dF9vZmZzZXQsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgICB7Ci0JaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHRfb2Zmc2V0KTsKLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IDAKLQl8fCBiZmRfcmVhZCAoZXh0X3NpZ25hdHVyZSwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICAgIHsKLQlpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICBzaWduYXR1cmUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dF9zaWduYXR1cmUpOwotCi0gICAgaWYgKHNpZ25hdHVyZSAhPSAweDQ1NTApCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0KLSAgICAvKiBIZXJlIGlzIHRoZSBoYWNrLiAgY29mZl9vYmplY3RfcCB3YW50cyB0byByZWFkIGZpbGhzeiBieXRlcyB0bwotICAgICAgIHBpY2sgdXAgdGhlIENPRkYgaGVhZGVyLiAgV2UgYWRqdXN0IHNvIHRoYXQgdGhhdCB3aWxsIHdvcmsuICAyMAotICAgICAgIGlzIHRoZSBzaXplIG9mIHRoZSBpMzg2IENPRkYgZmlsZWhkci4gICovCi0KLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgKGJmZF90ZWxsIChhYmZkKQotCQkgICAtIGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCkKLQkJICAgKyAyMCksCi0JCSAgU0VFS19TRVQpCi0JIT0gMCkKLSAgICAgIHsKLQlpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIGNvZmZfb2JqZWN0X3AgKGFiZmQpOwotfQotCi1jb25zdCBiZmRfdGFyZ2V0Ci0jaWZkZWYgVEFSR0VUX1NZTQotICBUQVJHRVRfU1lNID0KLSNlbHNlCi0gIGkzODZjb2ZmX3ZlYyA9Ci0jZW5kaWYKLXsKLSNpZmRlZiBUQVJHRVRfTkFNRQotICBUQVJHRVRfTkFNRSwKLSNlbHNlCi0gICJjb2ZmLWkzODYiLAkJCS8qIG5hbWUgKi8KLSNlbmRpZgotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0jZWxzZQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgIHwgU0VDX0NPREUgfCBTRUNfREFUQQotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0jZW5kaWYKLQotI2lmZGVmIFRBUkdFVF9VTkRFUlNDT1JFCi0gIFRBUkdFVF9VTkRFUlNDT1JFLAkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0jZWxzZQotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSNlbmRpZgotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0vKiBOb3RlIHRoYXQgd2UgYWxsb3cgYW4gb2JqZWN0IGZpbGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvcmUgZmlsZSBhcyB3ZWxsLiAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgaTNjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBpM2NvZmZfb2JqZWN0X3B9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgQ09GRl9TV0FQX1RBQkxFLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWk4NjAuYyBiL2JmZC9jb2ZmLWk4NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI5ZmE0Mi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1pODYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCA4NjAgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDcmVhdGVkIG1vc3RseSBieSBzdWJzdGl0dXRpbmcgIjg2MCIgZm9yICIzODYiIGluIGNvZmYtaTM4Ni5jCi0gICBIYXJyeSBEb2xhbiA8ZG9sYW5Ac3NkLmludGVsLmNvbT4sIE9jdG9iZXIgMTk5NQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImNvZmYvaTg2MC5oIgotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfaTg2MF9yZWxvYyAKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqY29mZl9pODYwX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKLS8qIFRoZSBwYWdlIHNpemUgaXMgYSBndWVzcyBiYXNlZCBvbiBFTEYuICAqLwotCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAotCi0vKiBGb3Igc29tZSByZWFzb24gd2hlbiB1c2luZyBpODYwIENPRkYgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgLnRleHQKLSAgIHNlY3Rpb24gZm9yIGEgcmVmZXJlbmNlIHRvIGEgY29tbW9uIHN5bWJvbCBpcyB0aGUgdmFsdWUgaXRzZWxmIHBsdXMKLSAgIGFueSBkZXNpcmVkIG9mZnNldC4gIElhbiBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LiAgKi8KLQotLyogSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBuZWVkIHRvIGRvIHNvbWUKLSAgIGFkanVzdG1lbnRzIHRvIHRoZSBvYmplY3QgZmlsZSB0aGF0IGFyZSBub3QgZG9uZSBieSB0aGUKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBldmVyeQotICAgcmVsb2MgdHlwZSB0byBtYWtlIGFueSByZXF1aXJlZCBhZGp1c3RtZW50cy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfaTg2MF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBzeW12YWx1ZSBkaWZmOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBXZSBhcmUgcmVsb2NhdGluZyBhIGNvbW1vbiBzeW1ib2wuICBUaGUgY3VycmVudCB2YWx1ZSBpbiB0aGUKLQkgb2JqZWN0IGZpbGUgaXMgT1JJRyArIE9GRlNFVCwgd2hlcmUgT1JJRyBpcyB0aGUgdmFsdWUgb2YgdGhlCi0JIGNvbW1vbiBzeW1ib2wgYXMgc2VlbiBieSB0aGUgb2JqZWN0IGZpbGUgd2hlbiBpdCB3YXMgY29tcGlsZWQKLQkgKHRoaXMgbWF5IGJlIHplcm8gaWYgdGhlIHN5bWJvbCB3YXMgdW5kZWZpbmVkKSBhbmQgT0ZGU0VUIGlzCi0JIHRoZSBvZmZzZXQgaW50byB0aGUgY29tbW9uIHN5bWJvbCAobm9ybWFsbHkgemVybywgYnV0IG1heSBiZQotCSBub24temVybyB3aGVuIHJlZmVycmluZyB0byBhIGZpZWxkIGluIGEgY29tbW9uIHN0cnVjdHVyZSkuCi0JIE9SSUcgaXMgdGhlIG5lZ2F0aXZlIG9mIHJlbG9jX2VudHJ5LT5hZGRlbmQsIHdoaWNoIGlzIHNldCBieQotCSB0aGUgQ0FMQ19BRERFTkQgbWFjcm8gYmVsb3cuICBXZSB3YW50IHRvIHJlcGxhY2UgdGhlIHZhbHVlIGluCi0JIHRoZSBvYmplY3QgZmlsZSB3aXRoIE5FVyArIE9GRlNFVCwgd2hlcmUgTkVXIGlzIHRoZSB2YWx1ZSBvZgotCSB0aGUgY29tbW9uIHN5bWJvbCB3aGljaCB3ZSBhcmUgZ29pbmcgdG8gcHV0IGluIHRoZSBmaW5hbAotCSBvYmplY3QgZmlsZS4gIE5FVyBpcyBzeW1ib2wtPnZhbHVlLiAgKi8KLSAgICAgIGRpZmYgPSBzeW1ib2wtPnZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb24gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBhbHdheXMgZWZmZWN0aXZlbHkKLQkgaWdub3JlcyB0aGUgYWRkZW5kIGZvciBhIENPRkYgdGFyZ2V0IHdoZW4gcHJvZHVjaW5nCi0JIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGlzIHNlZW1zIHRvIGJlIGFsd2F5cyB3cm9uZyBmb3IgODYwCi0JIENPRkYsIHNvIHdlIGhhbmRsZSB0aGUgYWRkZW5kIGhlcmUgaW5zdGVhZC4gICovCi0gICAgICBkaWZmID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0KLQotI2RlZmluZSBET0lUKHgpIFwKLSAgeCA9ICgoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyBkaWZmKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgICBpZiAoZGlmZiAhPSAwKQotICAgICAgewotCXJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotCXVuc2lnbmVkIGNoYXIgKmFkZHIgPSAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0KLQlzd2l0Y2ggKGhvd3RvLT5zaXplKQotCSAgewotCSAgY2FzZSAwOgotCSAgICB7Ci0JICAgICAgY2hhciB4ID0gYmZkX2dldF84IChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDE6Ci0JICAgIHsKLQkgICAgICBzaG9ydCB4ID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMjoKLQkgICAgewotCSAgICAgIGxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBkZWZhdWx0OgotCSAgICBhYm9ydCAoKTsKLQkgIH0KLSAgICAgIH0KLQotICAvKiBOb3cgbGV0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZmluaXNoIGV2ZXJ5dGhpbmcgdXAuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0jaWZuZGVmIFBDUkVMT0ZGU0VUCi0jZGVmaW5lIFBDUkVMT0ZGU0VUIGZhbHNlCi0jZW5kaWYKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9IAotewotICB7MH0sCi0gIHsxfSwKLSAgezJ9LAotICB7M30sCi0gIHs0fSwKLSAgezV9LAotICBIT1dUTyAoUl9ESVIzMiwgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgImRpcjMyIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAvKiB7N30sICovCi0gIEhPV1RPIChSX0lNQUdFQkFTRSwgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgInJ2YTMyIiwJICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgezAxMH0sCi0gIHswMTF9LAotICB7MDEyfSwKLSAgezAxM30sCi0gIHswMTR9LAotICB7MDE1fSwKLSAgezAxNn0sCi0gIEhPV1RPIChSX1JFTEJZVEUsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgOCwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICI4IiwJCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgSE9XVE8gKFJfUkVMV09SRCwJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICIxNiIsCQkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEhPV1RPIChSX1JFTExPTkcsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiMzIiLAkJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9QQ1JCWVRFLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDgsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiRElTUDgiLAkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEhPV1RPIChSX1BDUldPUkQsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiRElTUDE2IiwJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9QQ1JMT05HLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkRJU1AzMiIsCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyAgbnVubWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB7IHgucl90eXBlID0gaG93dG8tPnR5cGU7IH0KLSNkZWZpbmUgQkFETUFHKHgpIEk4NjBCQURNQUcoeCkKLSNkZWZpbmUgSTg2MCAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAotCSAgICAoY2FjaGVfcHRyKS0+aG93dG8gPSBob3d0b190YWJsZSArIChkc3QpLT5yX3R5cGU7Ci0KLS8qIEZvciA4NjAgQ09GRiBhIFNUWVBfTk9MT0FEIHwgU1RZUF9CU1Mgc2VjdGlvbiBpcyBwYXJ0IG9mIGEgc2hhcmVkCi0gICBsaWJyYXJ5LiAgT24gc29tZSBvdGhlciBDT0ZGIHRhcmdldHMgU1RZUF9CU1MgaXMgbm9ybWFsbHkKLSAgIFNUWVBfTk9MT0FELiAgKi8KLSNkZWZpbmUgQlNTX05PTE9BRF9JU19TSEFSRURfTElCUkFSWQotCi0vKiBDb21wdXRlIHRoZSBhZGRlbmQgb2YgYSByZWxvYy4gIElmIHRoZSByZWxvYyBpcyB0byBhIGNvbW1vbiBzeW1ib2wsCi0gICB0aGUgb2JqZWN0IGZpbGUgY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBjb21tb24gc3ltYm9sLiAgQnkgdGhlCi0gICB0aW1lIHRoaXMgaXMgY2FsbGVkLCB0aGUgbGlua2VyIG1heSBiZSB1c2luZyBhIGRpZmZlcmVudCBzeW1ib2wKLSAgIGZyb20gYSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZS4gIFRoZXJlZm9yZSwgd2UKLSAgIGhhY2sgd2lsZGx5IHRvIGxvY2F0ZSB0aGUgb3JpZ2luYWwgc3ltYm9sIGZyb20gdGhpcyBmaWxlIHNvIHRoYXQgd2UKLSAgIGNhbiBtYWtlIHRoZSBjb3JyZWN0IGFkanVzdG1lbnQuICBUaGlzIG1hY3JvIHNldHMgY29mZnN5bSB0byB0aGUKLSAgIHN5bWJvbCBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlLCBhbmQgdXNlcyBpdCB0byBzZXQgdGhlIGFkZGVuZCB2YWx1ZQotICAgY29ycmVjdGx5LiAgSWYgdGhpcyBpcyBub3QgYSBjb21tb24gc3ltYm9sLCB0aGUgdXN1YWwgYWRkZW5kCi0gICBjYWxjdWxhdGlvbiBpcyBkb25lLCBleGNlcHQgdGhhdCBhbiBhZGRpdGlvbmFsIHR3ZWFrIGlzIG5lZWRlZCBmb3IKLSAgIFBDIHJlbGF0aXZlIHJlbG9jcy4KLSAgIEZJWE1FOiBUaGlzIG1hY3JvIHJlZmVycyB0byBzeW1ib2xzIGFuZCBhc2VjdDsgdGhlc2UgYXJlIGZyb20gdGhlCi0gICBjYWxsaW5nIGZ1bmN0aW9uLCBub3QgdGhlIG1hY3JvIGFyZ3VtZW50cy4gICovCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgcHRyLCByZWxvYywgY2FjaGVfcHRyKQkJXAotICB7CQkJCQkJCQlcCi0gICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7CVwKLSAgICBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSAhPSBhYmZkKQkJCVwKLSAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpCQkJCVwKLQkgICAgICAgICArIChjYWNoZV9wdHItPnN5bV9wdHJfcHRyIC0gc3ltYm9scykpOwkJXAotICAgIGVsc2UgaWYgKHB0cikJCQkJCQlcCi0gICAgICBjb2Zmc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgcHRyKTsJCQlcCi0gICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTAkJCVwKLQkmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWU7CVwKLSAgICBlbHNlIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpID09IGFiZmQJCVwKLQkgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsJXAotICAgIGVsc2UJCQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOwkJCQkJXAotICAgIGlmIChwdHIgJiYgaG93dG9fdGFibGVbcmVsb2Mucl90eXBlXS5wY19yZWxhdGl2ZSkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kICs9IGFzZWN0LT52bWE7CQkJCVwKLSAgfQotCi0vKiBXZSB1c2UgdGhlIHNwZWNpYWwgQ09GRiBiYWNrZW5kIGxpbmtlci4gICovCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfaTg2MF9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0KLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgaG93dG8gPSBob3d0b190YWJsZSArIHJlbC0+cl90eXBlOwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgKmFkZGVuZHAgKz0gc2VjLT52bWE7Ci0KLSAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSA9PSAwICYmIHN5bS0+bl92YWx1ZSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgVGhlIHNlY3Rpb24gY29udGVudHMgaW5jbHVkZSB0aGUKLQkgc2l6ZSAoc3ltLT5uX3ZhbHVlKSBhcyBhbiBhZGRlbmQuICBUaGUgcmVsb2NhdGVfc2VjdGlvbgotCSBmdW5jdGlvbiB3aWxsIGJlIGFkZGluZyBpbiB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFdlCi0JIG5lZWQgdG8gc3VidHJhY3Qgb3V0IHRoZSBjdXJyZW50IHNpemUgaW4gb3JkZXIgdG8gZ2V0IHRoZQotCSBjb3JyZWN0IHJlc3VsdC4gICovCi0gCi0gICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCi0KLSAgICAgIC8qIEkgdGhpbmsgd2UgKmRvKiB3YW50IHRvIGJ5cGFzcyB0aGlzLiAgSWYgd2UgZG9uJ3QsIEkgaGF2ZSBzZWVuIHNvbWUgZGF0YQotCSBwYXJhbWV0ZXJzIGdldCB0aGUgd3JvbmcgcmVsY2F0aW9uIGFkZHJlc3MuICBJZiBJIGxpbmsgdHdvIHZlcnNpb25zCi0JIHdpdGggYW5kIHdpdGhvdXQgdGhpcyBzZWN0aW9uIGJ5cGFzc2VkIGFuZCB0aGVuIGRvIGEgYmluYXJ5IGNvbXBhcmlzb24sCi0JIHRoZSBhZGRyZXNzZXMgd2hpY2ggYXJlIGRpZmZlcmVudCBjYW4gYmUgbG9va2VkIHVwIGluIHRoZSBtYXAuICBUaGUgCi0JIGNhc2UgaW4gd2hpY2ggdGhpcyBzZWN0aW9uIGhhcyBiZWVuIGJ5cGFzc2VkIGhhcyBhZGRyZXNzZXMgd2hpY2ggY29ycmVzcG9uZAotCSB0byB2YWx1ZXMgSSBjYW4gZmluZCBpbiB0aGUgbWFwICovCi0gICAgICAqYWRkZW5kcCAtPSBzeW0tPm5fdmFsdWU7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBvdXRwdXQgc3ltYm9sIGlzIGNvbW1vbiAoaW4gd2hpY2ggY2FzZSB0aGlzIG11c3QgYmUgYQotICAgICByZWxvY2F0ZWFibGUgbGluayksIHdlIG5lZWQgdG8gYWRkIGluIHRoZSBmaW5hbCBzaXplIG9mIHRoZQotICAgICBjb21tb24gc3ltYm9sLiAgKi8KLSAgaWYgKGggIT0gTlVMTCAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pIAotICAgICphZGRlbmRwICs9IGgtPnJvb3QudS5jLnNpemU7Ci0KLSAgcmV0dXJuIGhvd3RvOwotfQotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gY29mZl9pODYwX3J0eXBlX3RvX2hvd3RvCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1pM2NvZmZfb2JqZWN0X3AoYSkKLSAgICAgYmZkICphOwotewotICByZXR1cm4gY29mZl9vYmplY3RfcChhKTsKLX0KLQotY29uc3QgYmZkX3RhcmdldAotI2lmZGVmIFRBUkdFVF9TWU0KLSAgVEFSR0VUX1NZTSA9Ci0jZWxzZQotICBpODYwY29mZl92ZWMgPQotI2VuZGlmCi17Ci0jaWZkZWYgVEFSR0VUX05BTUUKLSAgVEFSR0VUX05BTUUsCi0jZWxzZQotICAiY29mZi1pODYwIiwJCQkvKiBuYW1lICovCi0jZW5kaWYKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0vKiBOb3RlIHRoYXQgd2UgYWxsb3cgYW4gb2JqZWN0IGZpbGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvcmUgZmlsZSBhcyB3ZWxsLiAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgaTNjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBpM2NvZmZfb2JqZWN0X3B9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgQ09GRl9TV0FQX1RBQkxFLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWk5NjAuYyBiL2JmZC9jb2ZmLWk5NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU0NTVkOS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1pOTYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MDMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCA5NjAgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEk5NjAgMQotI2RlZmluZSBCQURNQUcoeCkgSTk2MEJBRE1BRyh4KQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pOTYwLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIJCS8qIHRvIGFsbG93IGVhc2llciBhYnN0cmFjdGlvbi1icmVha2luZyAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX2k5NjBfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG9wdGNhbGxfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfaTk2MF9yZWxvY2F0ZQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpjb2ZmX2k5NjBfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gY29mZl9pOTYwX3N0YXJ0X2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfaTk2MF9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9pOTYwX2FkanVzdF9zeW1uZHgKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBib29sZWFuICopKTsKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0jZGVmaW5lIENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIgMQotCi0jZGVmaW5lIEdFVF9TQ05IRFJfQUxJR04gYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIFBVVF9TQ05IRFJfQUxJR04gYmZkX2hfcHV0XzMyCi0KLS8qIFRoZSBpOTYwIGRvZXMgbm90IHN1cHBvcnQgYW4gTU1VLCBzbyBDT0ZGX1BBR0VfU0laRSBjYW4gYmUKLSAgIGFyYml0cmFyaWx5IHNtYWxsLiAgKi8KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMQotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotLyogVGhpcyBzZXQgb2YgbG9jYWwgbGFiZWwgbmFtZXMgaXMgdGFrZW4gZnJvbSBnYXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9pOTYwX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIChuYW1lWzBdID09ICdMJwotCSAgfHwgKG5hbWVbMF0gPT0gJy4nCi0JICAgICAgJiYgKG5hbWVbMV0gPT0gJ0MnCi0JCSAgfHwgbmFtZVsxXSA9PSAnSScKLQkJICB8fCBuYW1lWzFdID09ICcuJykpKTsKLX0KLQotLyogVGhpcyBpcyBqdXN0IGxpa2UgdGhlIHVzdWFsIENBTENfQURERU5ELCBidXQgaXQgaW5jbHVkZXMgdGhlCi0gICBzZWN0aW9uIFZNQSBmb3IgUEMgcmVsYXRpdmUgcmVsb2NzLiAgKi8KLSNpZm5kZWYgQ0FMQ19BRERFTkQKLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgcHRyLCByZWxvYywgY2FjaGVfcHRyKSAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZzeW0gPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOyAgICAgIFwKLSAgICBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSAhPSBhYmZkKSAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb2Zmc3ltID0gKG9ial9zeW1ib2xzIChhYmZkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICArIChjYWNoZV9wdHItPnN5bV9wdHJfcHRyIC0gc3ltYm9scykpOyAgICAgICAgIFwKLSAgICBlbHNlIGlmIChwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb2Zmc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgcHRyKTsgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChjb2Zmc3ltICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgJiYgY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID09IDApICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgPT0gYWJmZCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAmJiBwdHItPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gKHB0ci0+c2VjdGlvbi0+dm1hICsgcHRyLT52YWx1ZSk7ICAgXAotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHB0ciAmJiAocmVsb2Mucl90eXBlID09IDI1IHx8IHJlbG9jLnJfdHlwZSA9PSAyNykpCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kICs9IGFzZWN0LT52bWE7CQkJCVwKLSAgfQotI2VuZGlmCi0KLSNkZWZpbmUgQ0FMTFMJIDB4NjYwMDM4MDAJLyogVGVtcGxhdGUgZm9yICdjYWxscycgaW5zdHJ1Y3Rpb24JKi8KLSNkZWZpbmUgQkFMCSAweDBiMDAwMDAwCS8qIFRlbXBsYXRlIGZvciAnYmFsJyBpbnN0cnVjdGlvbgkqLwotI2RlZmluZSBCQUxfTUFTSyAweDAwZmZmZmZmCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCi1vcHRjYWxsX2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiBUaGlzIGl0ZW0gaGFzIGFscmVhZHkgYmVlbiByZWxvY2F0ZWQgY29ycmVjdGx5LCBidXQgd2UgbWF5IGJlCi0gICAqIGFibGUgdG8gcGF0Y2ggaW4geWV0IGJldHRlciBjb2RlIC0gZG9uZSBieSBkaWdnaW5nIG91dCB0aGUKLSAgICogY29ycmVjdCBpbmZvIG9uIHRoaXMgc3ltYm9sICovCi0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXN1bHQ7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKmNzID0gY29mZnN5bWJvbChzeW1ib2xfaW4pOwotCi0gIC8qIERvbid0IGRvIGFueXRoaW5nIHdpdGggc3ltYm9scyB3aGljaCBhcmVuJ3QgdGllZCB1cCB5ZXQsCi0gICAgIGV4Y2VwdCBtb3ZlIHRoZSByZWxvYy4gKi8KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoY3MtPnN5bWJvbC5zZWN0aW9uKSkgewotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgfQotICAgIAotICAvKiBTbyB0aGUgdGFyZ2V0IHN5bWJvbCBoYXMgdG8gYmUgb2YgY29mZiB0eXBlLCBhbmQgdGhlIHN5bWJvbCAKLSAgICAgaGFzIHRvIGhhdmUgdGhlIGNvcnJlY3QgbmF0aXZlIGluZm9ybWF0aW9uIHdpdGhpbiBpdCAqLwotICBpZiAoKGJmZF9hc3ltYm9sX2ZsYXZvdXIoJmNzLT5zeW1ib2wpICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgICAgfHwgKGNzLT5uYXRpdmUgPT0gKGNvbWJpbmVkX2VudHJ5X3R5cGUgKilOVUxMKSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGludGVyZXN0aW5nLCBjb25zaWRlciB0aGUgY2FzZSB3aGVyZSB3ZSdyZSBvdXRwdXR0aW5nIGNvZmYKLQkgZnJvbSBhIG1peCBuIG1hdGNoIGlucHV0LCBsaW5raW5nIGZyb20gY29mZiB0byBhIHN5bWJvbCBkZWZpbmVkIGluIGEKLQkgYm91dCBmaWxlIHdpbGwgY2F1c2UgdGhpcyBtYXRjaCB0byBiZSB0cnVlLiBTaG91bGQgSSBjb21wbGFpbj8gIFRoaXMKLQkgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIGJvdXQgc3ltYm9sIGlzIG5vbiBsZWFmLiAgKi8KLSAgICAgICplcnJvcl9tZXNzYWdlID0KLQkoY2hhciAqKSBfKCJ1bmNlcnRhaW4gY2FsbGluZyBjb252ZW50aW9uIGZvciBub24tQ09GRiBzeW1ib2wiKTsKLSAgICAgIHJlc3VsdCA9IGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgIHN3aXRjaCAoY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MpIAotICAgICAgewotICAgICAgY2FzZSBDX0xFQUZTVEFUOgotICAgICAgY2FzZSBDX0xFQUZFWFQ6Ci0gIAkvKiBUaGlzIGlzIGEgY2FsbCB0byBhIGxlYWYgcHJvY2VkdXJlLCByZXBsYWNlIGluc3RydWN0aW9uIHdpdGggYSBiYWwKLQkgICB0byB0aGUgY29ycmVjdCBsb2NhdGlvbi4gICovCi0JewotCSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXggPSAmKChjcy0+bmF0aXZlKzIpLT51LmF1eGVudCk7Ci0JICBpbnQgd29yZCA9IGJmZF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQkgIGludCBvbGYgPSAoYXV4LT54X2JhbC54X2JhbG50cnkgLSBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgIEJGRF9BU1NFUlQoY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXg9PTIpOwotCi0JICAvKiBXZSByZXBsYWNlIHRoZSBvcmlnaW5hbCBjYWxsIGluc3RydWN0aW9uIHdpdGggYSBiYWwgdG8KLQkgICAgIHRoZSBiYWwgZW50cnkgcG9pbnQgLSB0aGUgb2Zmc2V0IG9mIHdoaWNoIGlzIGRlc2NyaWJlZCBpbgotCSAgICAgdGhlIDJuZCBhdXhlbnQgb2YgdGhlIG9yaWdpbmFsIHN5bWJvbC4gV2Uga2VlcCB0aGUgbmF0aXZlCi0JICAgICBzeW0gYW5kIGF1eGVudHMgdW50b3VjaGVkLCBzbyB0aGUgZGVsdGEgYmV0d2VlbiB0aGUgdHdvCi0JICAgICBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBiYWwgZW50cnkgcG9pbnQuICAqLwotCSAgd29yZCA9ICgod29yZCArICBvbGYpICAmIEJBTF9NQVNLKSB8IEJBTDsKLSAgCSAgYmZkX3B1dF8zMihhYmZkLCB3b3JkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgCX0KLQlyZXN1bHQgPSBiZmRfcmVsb2Nfb2s7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIENfU0NBTEw6Ci0JLyogVGhpcyBpcyBhIGNhbGwgdG8gYSBzeXN0ZW0gY2FsbCwgcmVwbGFjZSB3aXRoIGEgY2FsbHMgdG8gIyAqLwotCUJGRF9BU1NFUlQoMCk7Ci0JcmVzdWx0ID0gYmZkX3JlbG9jX29rOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlyZXN1bHQgPSBiZmRfcmVsb2Nfb2s7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogaTk2MCBDT0ZGIGlzIHVzZWQgYnkgVnhXb3JrcyA1LjEuICBIb3dldmVyLCBWeFdvcmtzIDUuMSBkb2VzIG5vdAotICAgYXBwZWFyIHRvIGNvcnJlY3RseSBoYW5kbGUgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIGRlZmluZWQgaW4gdGhlCi0gICBzYW1lIG9iamVjdCBmaWxlLiAgSXQgYXBwZWFycyB0byBzaW1wbHkgZGlzY2FyZCBzdWNoIHJlbG9jcywgcmF0aGVyCi0gICB0aGFuIGFkZGluZyB0aGVpciB2YWx1ZXMgaW50byB0aGUgb2JqZWN0IGZpbGUuICBXZSBoYW5kbGUgdGhpcyBoZXJlCi0gICBieSBjb252ZXJ0aW5nIGFsbCByZWxvY3MgYWdhaW5zdCBkZWZpbmVkIHN5bWJvbHMgaW50byByZWxvY3MKLSAgIGFnYWluc3QgdGhlIHNlY3Rpb24gc3ltYm9sLCB3aGVuIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb3V0cHV0Ci0gICBmaWxlLgotCi0gICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB3ZSBhcmUgbm90IHVzaW5nIHRoZSBDT0ZGCi0gICBzcGVjaWZpYyBiYWNrZW5kIGxpbmtlci4gIEl0IG9ubHkgZG9lcyBzb21ldGhpbmcgd2hlbiBkb2luZyBhCi0gICByZWxvY2F0ZWFibGUgbGluaywgd2hpY2ggd2lsbCBhbG1vc3QgY2VydGFpbmx5IGZhaWwgd2hlbiBub3QKLSAgIGdlbmVyYXRpbmcgQ09GRiBpOTYwIG91dHB1dCwgc28gdGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSBubyBsb25nZXIKLSAgIHVzZWZ1bC4gIEl0IHdhcyB1c2VkIGJlZm9yZSB0aGlzIHRhcmdldCB3YXMgY29udmVydGVkIHRvIHVzZSB0aGUKLSAgIENPRkYgc3BlY2lmaWMgYmFja2VuZCBsaW5rZXIuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIAotY29mZl9pOTYwX3JlbG9jYXRlIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGFzZWN0aW9uICpvc2VjOwotCi0gIGlmIChvdXRwdXRfYmZkID09IE5VTEwpCi0gICAgewotICAgICAgLyogTm90IGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlLiAgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltYm9sKSkpCi0gICAgewotICAgICAgLyogU3ltYm9sIGlzIG5vdCBkZWZpbmVkLCBzbyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IGl0LiAgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltYm9sKSkpCi0gICAgewotICAgICAgLyogSSBkb24ndCByZWFsbHkga25vdyB3aGF0IHRoZSByaWdodCBhY3Rpb24gaXMgZm9yIGEgY29tbW9uCi0gICAgICAgICBzeW1ib2wuICAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgLyogQ29udmVydCB0aGUgcmVsb2MgdG8gdXNlIHRoZSBzZWN0aW9uIHN5bWJvbC4gIEZJWE1FOiBUaGlzIG1ldGhvZAotICAgICBpcyByaWRpY3Vsb3VzLiAgKi8KLSAgb3NlYyA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltYm9sKS0+b3V0cHV0X3NlY3Rpb247Ci0gIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAob3V0cHV0X2JmZCwgb3NlYykgIT0gTlVMTAotICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9iZmQsIG9zZWMpLT50ZGF0YSAhPSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5zeW1fcHRyX3B0ciA9Ci0gICAgICAoYXN5bWJvbCAqKikgY29mZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9iZmQsIG9zZWMpLT50ZGF0YTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlY19uYW1lOwotICAgICAgYXN5bWJvbCAqKnN5bXMsICoqc3ltX2VuZDsKLQotICAgICAgc2VjX25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgb3NlYyk7Ci0gICAgICBzeW1zID0gYmZkX2dldF9vdXRzeW1ib2xzIChvdXRwdXRfYmZkKTsKLSAgICAgIHN5bV9lbmQgPSBzeW1zICsgYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCk7Ci0gICAgICBmb3IgKDsgc3ltcyA8IHN5bV9lbmQ7IHN5bXMrKykKLQl7Ci0JICBpZiAoYmZkX2FzeW1ib2xfbmFtZSAoKnN5bXMpICE9IE5VTEwKLQkgICAgICAmJiAoKnN5bXMpLT52YWx1ZSA9PSAwCi0JICAgICAgJiYgc3RyY21wICgoKnN5bXMpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwKLQkJCSBzZWNfbmFtZSkgPT0gMCkKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc3ltcyA+PSBzeW1fZW5kKQotCWFib3J0ICgpOwotCi0gICAgICByZWxvY19lbnRyeS0+c3ltX3B0cl9wdHIgPSBzeW1zOwotCi0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9iZmQsIG9zZWMpID09IE5VTEwpCi0JewotCSAgb3NlYy0+dXNlZF9ieV9iZmQgPQotCSAgICAoKFBUUikgYmZkX3phbGxvYyAoYWJmZCwKLQkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7Ci0JICBpZiAob3NlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQl9Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAob3V0cHV0X2JmZCwgb3NlYyktPnRkYXRhID0gKFBUUikgc3ltczsKLSAgICB9Ci0KLSAgLyogTGV0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZG8gaXRzIHRoaW5nLCB3aGljaCB3aWxsIGluY2x1ZGUKLSAgICAgc3R1ZmZpbmcgdGhlIHN5bWJvbCBhZGRlbmQgaW50byB0aGUgb2JqZWN0IGZpbGUuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19yZWxsb25nID0KLSAgSE9XVE8gKCh1bnNpZ25lZCBpbnQpIFJfUkVMTE9ORywgMCwgMiwgMzIsZmFsc2UsIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBjb2ZmX2k5NjBfcmVsb2NhdGUsInJlbGxvbmciLCB0cnVlLAotCSAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAwKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX2lwcm1lZCA9Ci0gIEhPV1RPIChSX0lQUk1FRCwgMCwgMiwgMjQsdHJ1ZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIGNvZmZfaTk2MF9yZWxvY2F0ZSwgImlwcm1lZCAiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLCAwKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX29wdGNhbGwgPQotICBIT1dUTyAoUl9PUFRDQUxMLCAwLDIsMjQsdHJ1ZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIG9wdGNhbGxfY2FsbGJhY2ssICJvcHRjYWxsIiwgdHJ1ZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgMCk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSTk2MF9DQUxMSjoKLSAgICAgIHJldHVybiAmaG93dG9fb3B0Y2FsbDsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgcmV0dXJuICZob3d0b19yZWxsb25nOwotICAgIGNhc2UgQkZEX1JFTE9DXzI0X1BDUkVMOgotICAgICAgcmV0dXJuICZob3d0b19pcHJtZWQ7Ci0gICAgfQotfQotCi0vKiBUaGUgcmVhbCBjb2RlIGlzIGluIGNvZmZjb2RlLmggKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAotewkJCQkJCQlcCi0gICByZWxvY19ob3d0b190eXBlICpob3d0b19wdHI7CQkJCVwKLSAgIHN3aXRjaCAoKGRzdCktPnJfdHlwZSkgewkJCQlcCi0gICAgIGNhc2UgMTc6IGhvd3RvX3B0ciA9ICZob3d0b19yZWxsb25nOyBicmVhazsJXAotICAgICBjYXNlIDI1OiBob3d0b19wdHIgPSAmaG93dG9faXBybWVkOyBicmVhazsJCVwKLSAgICAgY2FzZSAyNzogaG93dG9fcHRyID0gJmhvd3RvX29wdGNhbGw7IGJyZWFrOwlcCi0gICAgIGRlZmF1bHQ6IGhvd3RvX3B0ciA9IDA7IGJyZWFrOwkJCVwKLSAgICAgfQkJCQkJCQlcCi0gICAoY2FjaGVfcHRyKS0+aG93dG8gPSBob3d0b19wdHI7CQkJXAotIH0KLQotLyogaTk2MCBDT0ZGIGlzIHVzZWQgYnkgVnhXb3JrcyA1LjEuICBIb3dldmVyLCBWeFdvcmtzIDUuMSBkb2VzIG5vdAotICAgYXBwZWFyIHRvIGNvcnJlY3RseSBoYW5kbGUgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIGRlZmluZWQgaW4gdGhlCi0gICBzYW1lIG9iamVjdCBmaWxlLiAgSXQgYXBwZWFycyB0byBzaW1wbHkgZGlzY2FyZCBzdWNoIHJlbG9jcywgcmF0aGVyCi0gICB0aGFuIGFkZGluZyB0aGVpciB2YWx1ZXMgaW50byB0aGUgb2JqZWN0IGZpbGUuICBXZSBoYW5kbGUgdGhpcyBieQotICAgY29udmVydGluZyBhbGwgcmVsb2NzIGFnYWluc3QgZ2xvYmFsIHN5bWJvbHMgaW50byByZWxvY3MgYWdhaW5zdAotICAgaW50ZXJuYWwgc3ltYm9scyBhdCB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24uICBUaGlzIHJvdXRpbmUgaXMKLSAgIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmtpbmcgcHJvY2VzcywgYW5kIGl0IGNyZWF0ZXMgdGhlCi0gICBuZWNlc3Nhcnkgc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2k5NjBfc3RhcnRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBhc2VjdGlvbiAqbzsKLSAgYmZkX2J5dGUgKmVzeW07Ci0KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGVzeW0gPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc3ltZXN6KTsKLSAgaWYgKGVzeW0gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotCi0gICAgICBzdHJuY3B5IChpc3ltLl9uLl9uX25hbWUsIG8tPm5hbWUsIFNZTU5NTEVOKTsKLSAgICAgIGlzeW0ubl92YWx1ZSA9IDA7Ci0gICAgICBpc3ltLm5fc2NudW0gPSBvLT50YXJnZXRfaW5kZXg7Ci0gICAgICBpc3ltLm5fdHlwZSA9IFRfTlVMTDsKLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX1NUQVQ7Ci0gICAgICBpc3ltLm5fbnVtYXV4ID0gMDsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgZXN5bSk7Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUgKGVzeW0sIHN5bWVzeiwgMSwgYWJmZCkgIT0gc3ltZXN6KQotCXsKLQkgIGZyZWUgKGVzeW0pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICs9IDE7Ci0gICAgfQotCi0gIGZyZWUgKGVzeW0pOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGUgcmVsb2MgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGUgb3B0aW1pemVkIENPRkYgbGlua2VyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfaTk2MF9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsZW5kOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGxvbmcgc3ltbmR4OwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0ID0gYmZkX3JlbG9jX29rOwotICAgICAgYm9vbGVhbiBkb25lOwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotCi0gICAgICBpZiAoc3ltbmR4ID09IC0xKQotCXsKLQkgIGggPSBOVUxMOwotCSAgc3ltID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JeyAgICAKLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCX0KLQotICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCWFkZGVuZCA9IC0gc3ltLT5uX3ZhbHVlOwotICAgICAgZWxzZQotCWFkZGVuZCA9IDA7Ci0KLSAgICAgIHN3aXRjaCAocmVsLT5yX3R5cGUpCi0JewotCWNhc2UgMTc6IGhvd3RvID0gJmhvd3RvX3JlbGxvbmc7IGJyZWFrOwotCWNhc2UgMjU6IGhvd3RvID0gJmhvd3RvX2lwcm1lZDsgYnJlYWs7Ci0JY2FzZSAyNzogaG93dG8gPSAmaG93dG9fb3B0Y2FsbDsgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgdmFsID0gMDsKLQotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICB2YWwgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOwotICAgICAgICAgICAgICB2YWwgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICArIHN5bS0+bl92YWx1ZQotCQkgICAgIC0gc2VjLT52bWEpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgZG9uZSA9IGZhbHNlOwotCi0gICAgICBpZiAoaG93dG8tPnR5cGUgPT0gUl9PUFRDQUxMICYmICEgaW5mby0+cmVsb2NhdGVhYmxlICYmIHN5bW5keCAhPSAtMSkKLQl7Ci0JICBpbnQgY2xhc3M7Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIGNsYXNzID0gaC0+Y2xhc3M7Ci0JICBlbHNlCi0JICAgIGNsYXNzID0gc3ltLT5uX3NjbGFzczsKLQotCSAgc3dpdGNoIChjbGFzcykKLQkgICAgewotCSAgICBjYXNlIENfTlVMTDoKLQkgICAgICAvKiBUaGlzIHN5bWJvbCBpcyBhcHBhcmVudGx5IG5vdCBmcm9tIGEgQ09GRiBpbnB1dCBmaWxlLgotICAgICAgICAgICAgICAgICBXZSB3YXJuLCBhbmQgdGhlbiBhc3N1bWUgdGhhdCBpdCBpcyBub3QgYSBsZWFmCi0gICAgICAgICAgICAgICAgIGZ1bmN0aW9uLiAgKi8KLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAoaW5mbywKLQkJICAgICAgXygidW5jZXJ0YWluIGNhbGxpbmcgY29udmVudGlvbiBmb3Igbm9uLUNPRkYgc3ltYm9sIiksCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDX0xFQUZTVEFUOgotCSAgICBjYXNlIENfTEVBRkVYVDoKLQkgICAgICAvKiBUaGlzIGlzIGEgY2FsbCB0byBhIGxlYWYgcHJvY2VkdXJlOyB1c2UgdGhlIGJhbAotICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgewotCQlsb25nIG9sZjsKLQkJdW5zaWduZWQgbG9uZyB3b3JkOwotCi0JCWlmIChoICE9IE5VTEwpCi0JCSAgewotCQkgICAgQkZEX0FTU0VSVCAoaC0+bnVtYXV4ID09IDIpOwotCQkgICAgb2xmID0gaC0+YXV4WzFdLnhfYmFsLnhfYmFsbnRyeTsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBiZmRfYnl0ZSAqZXN5bXM7Ci0JCSAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OwotCi0JCSAgICBCRkRfQVNTRVJUIChzeW0tPm5fbnVtYXV4ID09IDIpOwotCQkgICAgZXN5bXMgPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKTsKLQkJICAgIGVzeW1zICs9IChzeW1uZHggKyAyKSAqIGJmZF9jb2ZmX3N5bWVzeiAoaW5wdXRfYmZkKTsKLQkJICAgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIChQVFIpIGVzeW1zLCBzeW0tPm5fdHlwZSwKLQkJCQkJICBzeW0tPm5fc2NsYXNzLCAxLCBzeW0tPm5fbnVtYXV4LAotCQkJCQkgIChQVFIpICZhdXgpOwotCQkgICAgb2xmID0gYXV4LnhfYmFsLnhfYmFsbnRyeTsKLQkJICB9Ci0KLQkJd29yZCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkgICAoY29udGVudHMKLQkJCQkgICAgKyAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpOwotCQl3b3JkID0gKCh3b3JkICsgb2xmIC0gdmFsKSAmIEJBTF9NQVNLKSB8IEJBTDsKLQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCQkJICAgIHdvcmQsCi0JCQkgICAgKGNvbnRlbnRzCi0JCQkgICAgICsgKHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKTsKLQkJZG9uZSA9IHRydWU7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENfU0NBTEw6Ci0JICAgICAgQkZEX0FTU0VSVCAoMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghIGRvbmUpCi0JewotCSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLQkgICAgYWRkZW5kICs9IGlucHV0X3NlY3Rpb24tPnZtYTsKLQkgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgY29udGVudHMsCi0JCQkJCSAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEsCi0JCQkJCSAgICB2YWwsIGFkZGVuZCk7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgc3ltLCBidWYpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkanVzdCB0aGUgc3ltYm9sIGluZGV4IG9mIGFueSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB0bwotICAgaW5zdGVhZCBiZSBhIHJlbG9jIGFnYWluc3QgdGhlIGludGVybmFsIHN5bWJvbCB3ZSBjcmVhdGVkIHNwZWNpYWxseQotICAgZm9yIHRoZSBzZWN0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotY29mZl9pOTYwX2FkanVzdF9zeW1uZHggKG9iZmQsIGluZm8sIGliZmQsIHNlYywgaXJlbCwgYWRqdXN0ZWRwKQotICAgICBiZmQgKm9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLSAgICAgYm9vbGVhbiAqYWRqdXN0ZWRwOwotewotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgKmFkanVzdGVkcCA9IGZhbHNlOwotCi0gIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpYmZkKVtpcmVsLT5yX3N5bW5keF07Ci0gIGlmIChoID09IE5VTEwKLSAgICAgIHx8IChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpcmVsLT5yX3N5bW5keCA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleCAtIDE7Ci0gICphZGp1c3RlZHAgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgY29mZl9pOTYwX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotI2RlZmluZSBjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsgY29mZl9pOTYwX3N0YXJ0X2ZpbmFsX2xpbmsKLQotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24KLQotI2RlZmluZSBjb2ZmX2FkanVzdF9zeW1uZHggY29mZl9pOTYwX2FkanVzdF9zeW1uZHgKLQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCBjb2ZmX2k5NjBfcmVsb2NfdHlwZV9sb29rdXAKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLWNvbnN0IGJmZF90YXJnZXQgaWNvZmZfbGl0dGxlX3ZlYyA9Ci17Ci0gICJjb2ZmLUludGVsLWxpdHRsZSIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0ge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUsCi19OwotCi0KLWNvbnN0IGJmZF90YXJnZXQgaWNvZmZfYmlnX3ZlYyA9Ci17Ci0gICJjb2ZmLUludGVsLWJpZyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi1iZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi1iZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1tNjhrLmMgYi9iZmQvY29mZi1tNjhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMDZiMTcuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtbTY4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsNDgwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgNjgwMDAgQ09GRiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9tNjhrLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogVGhpcyBzb3VyY2UgZmlsZSBpcyBjb21waWxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgdmFyaW91cyBtNjhrIENPRkYKLSAgIHZhcmlhbnRzLiAgVGhlIGZvbGxvd2luZyBtYWNyb3MgY29udHJvbCBpdHMgYmVoYXZpb3VyOgotCi0gICBUQVJHRVRfU1lNCi0gICAgIFRoZSBDIG5hbWUgb2YgdGhlIEJGRCB0YXJnZXQgdmVjdG9yLiAgVGhlIGRlZmF1bHQgaXMgbTY4a2NvZmZfdmVjLgotICAgVEFSR0VUX05BTUUKLSAgICAgVGhlIHVzZXIgdmlzaWJsZSB0YXJnZXQgbmFtZS4gIFRoZSBkZWZhdWx0IGlzICJjb2ZmLW02OGsiLgotICAgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCi0gICAgIFdoZXRoZXIgc3ltYm9sIG5hbWVzIGhhdmUgYW4gdW5kZXJzY29yZS4KLSAgIE9OTFlfREVDTEFSRV9SRUxPQ1MKLSAgICAgT25seSBkZWNsYXJlIHRoZSByZWxvY2F0aW9uIGhvd3RvIGFycmF5LiAgRG9uJ3QgYWN0dWFsbHkgY29tcGlsZQotICAgICBpdC4gIFRoZSBhY3R1YWwgYXJyYXkgd2lsbCBiZSBwaWNrZWQgdXAgaW4gYW5vdGhlciB2ZXJzaW9uIG9mIHRoZQotICAgICBmaWxlLgotICAgU1RBVElDX1JFTE9DUwotICAgICBNYWtlIHRoZSByZWxvY2F0aW9uIGhvd3RvIGFycmF5LCBhbmQgYXNzb2NpYXRlZCBmdW5jdGlvbnMsIHN0YXRpYy4KLSAgIENPRkZfQ09NTU9OX0FEREVORAotICAgICBJZiB0aGlzIGlzIGRlZmluZWQsIHRoZW4sIGZvciBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIGNvbW1vbgotICAgICBzeW1ib2wsIHRoZSBvYmplY3QgZmlsZSBob2xkcyB0aGUgdmFsdWUgKHRoZSBzaXplKSBvZiB0aGUgY29tbW9uCi0gICAgIHN5bWJvbC4gIElmIHRoaXMgaXMgbm90IGRlZmluZWQsIHRoZW4sIGZvciBhIHJlbG9jYXRpb24gYWdhaW5zdCBhCi0gICAgIGNvbW1vbiBzeW1ib2wsIHRoZSBvYmplY3QgZmlsZSBob2xkcyB6ZXJvLiAgKi8KLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDIpCi0KLSNpZm5kZWYgQ09GRl9QQUdFX1NJWkUKLS8qIFRoZSBwYWdlIHNpemUgaXMgYSBndWVzcyBiYXNlZCBvbiBFTEYuICAqLwotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAweDIwMDAKLSNlbmRpZgotCi0jaWZuZGVmIENPRkZfQ09NTU9OX0FEREVORAotI2RlZmluZSBSRUxPQ19TUEVDSUFMX0ZOIDAKLSNlbHNlCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG02OGtjb2ZmX2NvbW1vbl9hZGRlbmRfc3BlY2lhbF9mbgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICptNjhrY29mZl9jb21tb25fYWRkZW5kX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotI2RlZmluZSBSRUxPQ19TUEVDSUFMX0ZOIG02OGtjb2ZmX2NvbW1vbl9hZGRlbmRfc3BlY2lhbF9mbgotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIG02OGtfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotLyogT24gdGhlIGRlbHRhLCBhIHN5bWJvbCBzdGFydGluZyB3aXRoIEwlIGlzIGxvY2FsLiAgV2Ugd29uJ3Qgc2VlCi0gICBzdWNoIGEgc3ltYm9sIG9uIG90aGVyIHBsYXRmb3Jtcywgc28gaXQgc2hvdWxkIGJlIHNhZmUgdG8gYWx3YXlzCi0gICBjb25zaWRlciBpdCBsb2NhbCBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW02OGtfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChuYW1lWzBdID09ICdMJyAmJiBuYW1lWzFdID09ICclJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpOwotfQotCi0jaWZuZGVmIFNUQVRJQ19SRUxPQ1MKLS8qIENsZWFuIHVwIG5hbWVzcGFjZS4gICovCi0jZGVmaW5lIG02OGtjb2ZmX2hvd3RvX3RhYmxlCV9iZmRfbTY4a2NvZmZfaG93dG9fdGFibGUKLSNkZWZpbmUgbTY4a19ydHlwZTJob3d0bwlfYmZkX202OGtjb2ZmX3J0eXBlMmhvd3RvCi0jZGVmaW5lIG02OGtfaG93dG8ycnR5cGUJX2JmZF9tNjhrY29mZl9ob3d0bzJydHlwZQotI2RlZmluZSBtNjhrX3JlbG9jX3R5cGVfbG9va3VwCV9iZmRfbTY4a2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSNlbmRpZgotCi0jaWZkZWYgT05MWV9ERUNMQVJFX1JFTE9DUwotZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgbTY4a2NvZmZfaG93dG9fdGFibGVbXTsKLSNlbHNlCi0jaWZkZWYgU1RBVElDX1JFTE9DUwotc3RhdGljCi0jZW5kaWYKLXJlbG9jX2hvd3RvX3R5cGUgbTY4a2NvZmZfaG93dG9fdGFibGVbXSA9IAotewotICBIT1dUTyhSX1JFTEJZVEUsCSAgICAgICAwLCAgMCwgIAk4LCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiOCIsCXRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTFdPUkQsCSAgICAgICAwLCAgMSwgCTE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIFJFTE9DX1NQRUNJQUxfRk4sICIxNiIsCXRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTExPTkcsCSAgICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIFJFTE9DX1NQRUNJQUxfRk4sICIzMiIsCXRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUkJZVEUsCSAgICAgICAwLCAgMCwgCTgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiRElTUDgiLCAgICB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIkRJU1AxNiIsICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSTE9ORywJICAgICAgIDAsICAyLCAJMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIFJFTE9DX1NQRUNJQUxfRk4sICJESVNQMzIiLCAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTExPTkdfTkVHLAkgICAgICAgMCwgIC0yLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIi0zMiIsCXRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotfTsKLSNlbmRpZiAvKiBub3QgT05MWV9ERUNMQVJFX1JFTE9DUyAqLwotCi0jaWZuZGVmIEJBRE1BRwotI2RlZmluZSBCQURNQUcoeCkgTTY4S0JBRE1BRyh4KQotI2VuZGlmCi0jZGVmaW5lIE02OCAxCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jIG51bWJlciAqLwotCi0jaWZkZWYgT05MWV9ERUNMQVJFX1JFTE9DUwotZXh0ZXJuIHZvaWQgbTY4a19ydHlwZTJob3d0byBQQVJBTVMgKChhcmVsZW50ICppbnRlcm5hbCwgaW50IHJlbG9jZW50cnkpKTsKLWV4dGVybiBpbnQgbTY4a19ob3d0bzJydHlwZSBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICopKTsKLWV4dGVybiByZWxvY19ob3d0b190eXBlICptNjhrX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLSNlbHNlCi0jaWZkZWYgU1RBVElDX1JFTE9DUwotc3RhdGljCi0jZW5kaWYKLXZvaWQKLW02OGtfcnR5cGUyaG93dG8oaW50ZXJuYWwsIHJlbG9jZW50cnkpCi0gICAgIGFyZWxlbnQgKmludGVybmFsOwotICAgICBpbnQgcmVsb2NlbnRyeTsKLXsKLSAgc3dpdGNoIChyZWxvY2VudHJ5KSAKLSAgewotICAgY2FzZSBSX1JFTEJZVEU6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMDsgYnJlYWs7Ci0gICBjYXNlIFJfUkVMV09SRDoJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAxOyBicmVhazsKLSAgIGNhc2UgUl9SRUxMT05HOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDI7IGJyZWFrOwotICAgY2FzZSBSX1BDUkJZVEU6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMzsgYnJlYWs7Ci0gICBjYXNlIFJfUENSV09SRDoJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyA0OyBicmVhazsKLSAgIGNhc2UgUl9QQ1JMT05HOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDU7IGJyZWFrOwotICAgY2FzZSBSX1JFTExPTkdfTkVHOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDY7IGJyZWFrOwotICB9Ci19Ci0KLSNpZmRlZiBTVEFUSUNfUkVMT0NTCi1zdGF0aWMKLSNlbmRpZgotaW50IAotbTY4a19ob3d0bzJydHlwZSAoaW50ZXJuYWwpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmludGVybmFsOwotewotICBpZiAoaW50ZXJuYWwtPnBjX3JlbGF0aXZlKSAKLSAgewotICAgIHN3aXRjaCAoaW50ZXJuYWwtPmJpdHNpemUpIAotICAgIHsKLSAgICAgY2FzZSAzMjogcmV0dXJuIFJfUENSTE9ORzsKLSAgICAgY2FzZSAxNjogcmV0dXJuIFJfUENSV09SRDsKLSAgICAgY2FzZSA4OiByZXR1cm4gUl9QQ1JCWVRFOwotICAgIH0KLSAgfQotICBlbHNlIAotICB7Ci0gICAgc3dpdGNoIChpbnRlcm5hbC0+Yml0c2l6ZSkgCi0gICAgIHsKLSAgICAgIGNhc2UgMzI6IHJldHVybiBSX1JFTExPTkc7Ci0gICAgICBjYXNlIDE2OiByZXR1cm4gUl9SRUxXT1JEOwotICAgICAgY2FzZSA4OiByZXR1cm4gUl9SRUxCWVRFOwotICAgICB9Ci0gIH0KLSAgcmV0dXJuIFJfUkVMTE9ORzsgICAgCi19Ci0KLSNpZmRlZiBTVEFUSUNfUkVMT0NTCi1zdGF0aWMKLSNlbmRpZgotcmVsb2NfaG93dG9fdHlwZSAqCi1tNjhrX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6CQkJcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBCRkRfUkVMT0NfODoJCXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDA7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6CQlyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAxOwotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6CQlyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAyOwotICAgIGNhc2UgQkZEX1JFTE9DXzhfUENSRUw6CXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDM7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6CXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDQ7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6CXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDU7Ci0gICAgICAvKiBGSVhNRTogVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgY29kZSBmb3IgUl9SRUxMT05HX05FRy4gICovCi0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0jZW5kaWYgLyogbm90IE9OTFlfREVDTEFSRV9SRUxPQ1MgKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgXAotICBtNjhrX3J0eXBlMmhvd3RvKGludGVybmFsLCAocmVsb2NlbnRyeSktPnJfdHlwZSkKLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoZXh0ZXJuYWwsIGludGVybmFsKSBcCi0gIGV4dGVybmFsLnJfdHlwZSA9IG02OGtfaG93dG8ycnR5cGUgKGludGVybmFsKQotCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIG02OGtfcmVsb2NfdHlwZV9sb29rdXAKLQotI2lmbmRlZiBDT0ZGX0NPTU1PTl9BRERFTkQKLSNpZm5kZWYgY29mZl9ydHlwZV90b19ob3d0bwotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gbTY4a2NvZmZfcnR5cGVfdG9faG93dG8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKm02OGtjb2ZmX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLW02OGtjb2ZmX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgYXJlbGVudCByZWxlbnQ7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gIFJUWVBFMkhPV1RPICgmcmVsZW50LCByZWwpOwotCi0gIGhvd3RvID0gcmVsZW50Lmhvd3RvOwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgKmFkZGVuZHAgKz0gc2VjLT52bWE7Ci0KLSAgcmV0dXJuIGhvd3RvOwotfQotCi0jZW5kaWYgLyogISBkZWZpbmVkIChjb2ZmX3J0eXBlX3RvX2hvd3RvKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoQ09GRl9DT01NT05fQURERU5EKSAqLwotDAotI2lmZGVmIENPRkZfQ09NTU9OX0FEREVORAotCi0vKiBJZiBDT0ZGX0NPTU1PTl9BRERFTkQgaXMgZGVmaW5lZCwgdGhlbiB3aGVuIHVzaW5nIG02OGsgQ09GRiB0aGUKLSAgIHZhbHVlIHN0b3JlZCBpbiB0aGUgLnRleHQgc2VjdGlvbiBmb3IgYSByZWZlcmVuY2UgdG8gYSBjb21tb24KLSAgIHN5bWJvbCBpcyB0aGUgdmFsdWUgaXRzZWxmIHBsdXMgYW55IGRlc2lyZWQgb2Zmc2V0LiAgKHRha2VuIGZyb20KLSAgIHdvcmsgZG9uZSBieSBJYW4gVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgZm9yIEkzODYgQ09GRikuICAqLwotCi0vKiBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIG5lZWQgdG8gZG8gc29tZQotICAgYWRqdXN0bWVudHMgdG8gdGhlIG9iamVjdCBmaWxlIHRoYXQgYXJlIG5vdCBkb25lIGJ5IHRoZQotICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGV2ZXJ5Ci0gICByZWxvYyB0eXBlIHRvIG1ha2UgYW55IHJlcXVpcmVkIGFkanVzdG1lbnRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9zcGVjaWFsX2ZuIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJCSAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBzeW12YWx1ZSBkaWZmOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgLyogV2UgYXJlIHJlbG9jYXRpbmcgYSBjb21tb24gc3ltYm9sLiAgVGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlCi0JIG9iamVjdCBmaWxlIGlzIE9SSUcgKyBPRkZTRVQsIHdoZXJlIE9SSUcgaXMgdGhlIHZhbHVlIG9mIHRoZQotCSBjb21tb24gc3ltYm9sIGFzIHNlZW4gYnkgdGhlIG9iamVjdCBmaWxlIHdoZW4gaXQgd2FzIGNvbXBpbGVkCi0JICh0aGlzIG1heSBiZSB6ZXJvIGlmIHRoZSBzeW1ib2wgd2FzIHVuZGVmaW5lZCkgYW5kIE9GRlNFVCBpcwotCSB0aGUgb2Zmc2V0IGludG8gdGhlIGNvbW1vbiBzeW1ib2wgKG5vcm1hbGx5IHplcm8sIGJ1dCBtYXkgYmUKLQkgbm9uLXplcm8gd2hlbiByZWZlcnJpbmcgdG8gYSBmaWVsZCBpbiBhIGNvbW1vbiBzdHJ1Y3R1cmUpLgotCSBPUklHIGlzIHRoZSBuZWdhdGl2ZSBvZiByZWxvY19lbnRyeS0+YWRkZW5kLCB3aGljaCBpcyBzZXQgYnkKLQkgdGhlIENBTENfQURERU5EIG1hY3JvIGJlbG93LiAgV2Ugd2FudCB0byByZXBsYWNlIHRoZSB2YWx1ZSBpbgotCSB0aGUgb2JqZWN0IGZpbGUgd2l0aCBORVcgKyBPRkZTRVQsIHdoZXJlIE5FVyBpcyB0aGUgdmFsdWUgb2YKLQkgdGhlIGNvbW1vbiBzeW1ib2wgd2hpY2ggd2UgYXJlIGdvaW5nIHRvIHB1dCBpbiB0aGUgZmluYWwKLQkgb2JqZWN0IGZpbGUuICBORVcgaXMgc3ltYm9sLT52YWx1ZS4gICovCi0gICAgICBkaWZmID0gc3ltYm9sLT52YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogRm9yIHNvbWUgcmVhc29uIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gYWx3YXlzIGVmZmVjdGl2ZWx5Ci0JIGlnbm9yZXMgdGhlIGFkZGVuZCBmb3IgYSBDT0ZGIHRhcmdldCB3aGVuIHByb2R1Y2luZwotCSByZWxvY2F0ZWFibGUgb3V0cHV0LiAgVGhpcyBzZWVtcyB0byBiZSBhbHdheXMgd3JvbmcgZm9yIDM4NgotCSBDT0ZGLCBzbyB3ZSBoYW5kbGUgdGhlIGFkZGVuZCBoZXJlIGluc3RlYWQuICAqLwotICAgICAgZGlmZiA9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgfQotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIGRpZmYpICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICBpZiAoZGlmZiAhPSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotICAgICAgdW5zaWduZWQgY2hhciAqYWRkciA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotICAgICAgc3dpdGNoIChob3d0by0+c2l6ZSkKLQl7Ci0JY2FzZSAwOgotCSAgewotCSAgICBjaGFyIHggPSBiZmRfZ2V0XzggKGFiZmQsIGFkZHIpOwotCSAgICBET0lUICh4KTsKLQkgICAgYmZkX3B1dF84IChhYmZkLCB4LCBhZGRyKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAxOgotCSAgewotCSAgICBzaG9ydCB4ID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcik7Ci0JICAgIERPSVQgKHgpOwotCSAgICBiZmRfcHV0XzE2IChhYmZkLCB4LCBhZGRyKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAyOgotCSAgewotCSAgICBsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyKTsKLQkgICAgRE9JVCAoeCk7Ci0JICAgIGJmZF9wdXRfMzIgKGFiZmQsIHgsIGFkZHIpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgbGV0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZmluaXNoIGV2ZXJ5dGhpbmcgdXAuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0vKiBDb21wdXRlIHRoZSBhZGRlbmQgb2YgYSByZWxvYy4gIElmIHRoZSByZWxvYyBpcyB0byBhIGNvbW1vbiBzeW1ib2wsCi0gICB0aGUgb2JqZWN0IGZpbGUgY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBjb21tb24gc3ltYm9sLiAgQnkgdGhlCi0gICB0aW1lIHRoaXMgaXMgY2FsbGVkLCB0aGUgbGlua2VyIG1heSBiZSB1c2luZyBhIGRpZmZlcmVudCBzeW1ib2wKLSAgIGZyb20gYSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZS4gIFRoZXJlZm9yZSwgd2UKLSAgIGhhY2sgd2lsZGx5IHRvIGxvY2F0ZSB0aGUgb3JpZ2luYWwgc3ltYm9sIGZyb20gdGhpcyBmaWxlIHNvIHRoYXQgd2UKLSAgIGNhbiBtYWtlIHRoZSBjb3JyZWN0IGFkanVzdG1lbnQuICBUaGlzIG1hY3JvIHNldHMgY29mZnN5bSB0byB0aGUKLSAgIHN5bWJvbCBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlLCBhbmQgdXNlcyBpdCB0byBzZXQgdGhlIGFkZGVuZCB2YWx1ZQotICAgY29ycmVjdGx5LiAgSWYgdGhpcyBpcyBub3QgYSBjb21tb24gc3ltYm9sLCB0aGUgdXN1YWwgYWRkZW5kCi0gICBjYWxjdWxhdGlvbiBpcyBkb25lLCBleGNlcHQgdGhhdCBhbiBhZGRpdGlvbmFsIHR3ZWFrIGlzIG5lZWRlZCBmb3IKLSAgIFBDIHJlbGF0aXZlIHJlbG9jcy4KLSAgIEZJWE1FOiBUaGlzIG1hY3JvIHJlZmVycyB0byBzeW1ib2xzIGFuZCBhc2VjdDsgdGhlc2UgYXJlIGZyb20gdGhlCi0gICBjYWxsaW5nIGZ1bmN0aW9uLCBub3QgdGhlIG1hY3JvIGFyZ3VtZW50cy4gICovCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgcHRyLCByZWxvYywgY2FjaGVfcHRyKQkJXAotICB7CQkJCQkJCQlcCi0gICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7CVwKLSAgICBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSAhPSBhYmZkKQkJCVwKLSAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpCQkJCVwKLQkgICAgICAgICArIChjYWNoZV9wdHItPnN5bV9wdHJfcHRyIC0gc3ltYm9scykpOwkJXAotICAgIGVsc2UgaWYgKHB0cikJCQkJCQlcCi0gICAgICBjb2Zmc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgcHRyKTsJCQlcCi0gICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTAkJCVwKLQkmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWU7CVwKLSAgICBlbHNlIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpID09IGFiZmQJCVwKLQkgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsJXAotICAgIGVsc2UJCQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOwkJCQkJXAotICAgIGlmIChwdHIgJiYgKHJlbG9jLnJfdHlwZSA9PSBSX1BDUkJZVEUJCQlcCi0JCXx8IHJlbG9jLnJfdHlwZSA9PSBSX1BDUldPUkQJCQlcCi0JCXx8IHJlbG9jLnJfdHlwZSA9PSBSX1BDUkxPTkcpKQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kICs9IGFzZWN0LT52bWE7CQkJCVwKLSAgfQotCi0jaWZuZGVmIGNvZmZfcnR5cGVfdG9faG93dG8KLQotLyogY29mZi1tNjhrLmMgdXNlcyB0aGUgc3BlY2lhbCBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgV2UgbmVlZCB0bwotICAgYWRqdXN0IGNvbW1vbiBzeW1ib2xzLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1tNjhrY29mZl9jb21tb25fYWRkZW5kX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgYXJlbGVudCByZWxlbnQ7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gIFJUWVBFMkhPV1RPICgmcmVsZW50LCByZWwpOwotCi0gIGhvd3RvID0gcmVsZW50Lmhvd3RvOwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgKmFkZGVuZHAgKz0gc2VjLT52bWE7Ci0KLSAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSA9PSAwICYmIHN5bS0+bl92YWx1ZSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgVGhlIHNlY3Rpb24gY29udGVudHMgaW5jbHVkZSB0aGUKLQkgc2l6ZSAoc3ltLT5uX3ZhbHVlKSBhcyBhbiBhZGRlbmQuICBUaGUgcmVsb2NhdGVfc2VjdGlvbgotCSBmdW5jdGlvbiB3aWxsIGJlIGFkZGluZyBpbiB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFdlCi0JIG5lZWQgdG8gc3VidHJhY3Qgb3V0IHRoZSBjdXJyZW50IHNpemUgaW4gb3JkZXIgdG8gZ2V0IHRoZQotCSBjb3JyZWN0IHJlc3VsdC4gICovCi0gICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotICAgICAgKmFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOwotICAgIH0KLQotICAvKiBJZiB0aGUgb3V0cHV0IHN5bWJvbCBpcyBjb21tb24gKGluIHdoaWNoIGNhc2UgdGhpcyBtdXN0IGJlIGEKLSAgICAgcmVsb2NhdGVhYmxlIGxpbmspLCB3ZSBuZWVkIHRvIGFkZCBpbiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUKLSAgICAgY29tbW9uIHN5bWJvbC4gICovCi0gIGlmIChoICE9IE5VTEwgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgICphZGRlbmRwICs9IGgtPnJvb3QudS5jLnNpemU7Ci0KLSAgcmV0dXJuIGhvd3RvOwotfQotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9ydHlwZV90b19ob3d0bwotCi0jZW5kaWYgLyogISBkZWZpbmVkIChjb2ZmX3J0eXBlX3RvX2hvd3RvKSAqLwotCi0jZW5kaWYgLyogQ09GRl9DT01NT05fQURERU5EICovCi0MCi0jZGVmaW5lIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgbTY4a19jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbgotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotI2lmbmRlZiBUQVJHRVRfU1lNCi0jZGVmaW5lIFRBUkdFVF9TWU0gbTY4a2NvZmZfdmVjCi0jZW5kaWYKLQotI2lmbmRlZiBUQVJHRVRfTkFNRQotI2RlZmluZSBUQVJHRVRfTkFNRSAiY29mZi1tNjhrIgotI2VuZGlmCi0KLWNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX1NZTSA9Ci17Ci0gIFRBUkdFVF9OQU1FLAotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0jaWZkZWYgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCi0gICdfJywKLSNlbHNlCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotI2VuZGlmCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0ge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgYmZkX2ZhbHNlfSwKLSB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1tODhrLmMgYi9iZmQvY29mZi1tODhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYTBiMDUuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtbTg4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgODgwMDAgQ09GRiAiQmluYXJ5IENvbXBhdGFiaWxpdHkgU3RhbmRhcmQiIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgTTg4IDEJCS8qIEN1c3RvbWl6ZSB2YXJpb3VzIGluY2x1ZGUgZmlsZXMgKi8KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL204OGsuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1zdGF0aWMgYm9vbGVhbiBtODhrX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtODhrX3NwZWNpYWxfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBydHlwZTJob3d0byBQQVJBTVMgKChhcmVsZW50ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgdm9pZCByZWxvY19wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGFyZWxlbnQgKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosIGFzeW1ib2wgKiosIGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi0jZGVmaW5lIEdFVF9TQ05IRFJfTlJFTE9DIGJmZF9oX2dldF8zMgotI2RlZmluZSBHRVRfU0NOSERSX05MTk5PIGJmZF9oX2dldF8zMgotCi0vKiBPbiBjb2ZmLW04OGssIGxvY2FsIGxhYmVscyBzdGFydCB3aXRoICdAJy4gICovCi0KLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBtODhrX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotc3RhdGljIGJvb2xlYW4KLW04OGtfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gbmFtZVswXSA9PSAnQCc7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCi1tODhrX3NwZWNpYWxfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0KLSAgc3dpdGNoIChob3d0by0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0hWUlQxNjoKLSAgICBjYXNlIFJfTFZSVDE2OgotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZQotCSAgICAgcmVsb2NhdGlvbiB0byB0aGUgcmVsb2MgZW50cnkgcmF0aGVyIHRoYW4gdGhlIHJhdyBkYXRhLgotCSAgICAgTW9kaWZ5IHRoZSByZWxvYyBpbnBsYWNlIHRvIHJlZmxlY3Qgd2hhdCB3ZSBub3cga25vdy4gICovCi0KLQkgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOwotCSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0JICBiZmRfdm1hIHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCSAgYXNlY3Rpb24gKnJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbjsKLQkgIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0KLQkgIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLQkgICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KLQotCSAgLyogR2V0IHN5bWJvbCB2YWx1ZS4gIChDb21tb24gc3ltYm9scyBhcmUgc3BlY2lhbC4pICAqLwotCSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0JICByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24gPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0JICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlLiAgKi8KLQkgIGlmIChvdXRwdXRfYmZkKQotCSAgICBvdXRwdXRfYmFzZSA9IDA7Ci0JICBlbHNlCi0JICAgIG91dHB1dF9iYXNlID0gcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uLT52bWE7Ci0KLQkgIHJlbG9jYXRpb24gKz0gb3V0cHV0X2Jhc2UgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLQkgIC8qIEFkZCBpbiBzdXBwbGllZCBhZGRlbmQuICAqLwotCSAgcmVsb2NhdGlvbiArPSAoKHJlbG9jX2VudHJ5LT5hZGRlbmQgPDwgaG93dG8tPmJpdHNpemUpICsgeCk7Ci0KLQkgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOwotCi0JICByZWxvY2F0aW9uID4+PSAoYmZkX3ZtYSkgaG93dG8tPnJpZ2h0c2hpZnQ7Ci0KLQkgIC8qIFNoaWZ0IGV2ZXJ5dGhpbmcgdXAgdG8gd2hlcmUgaXQncyBnb2luZyB0byBiZSB1c2VkICovCi0KLQkgIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBob3d0by0+Yml0cG9zOwotCi0JICBpZiAocmVsb2NhdGlvbikKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCByZWxvY2F0aW9uLCAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgYWRkcik7Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBhcmUgbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCByZXR1cm4gYW4gZXJyb3IgaWYKLQkgdGhlIHN5bWJvbCBpcyBub3QgZGVmaW5lZC4gICovCi0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotCXJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBhbmQgd2Ugd2FudCB0byBhcHBseSB0aGUKLQkgICAgIHJlbG9jYXRpb24gdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4KLQkgICAgIE1vZGlmeSB0aGUgcmVsb2MgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotCi0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9IAotewotICBIT1dUTyAoUl9QQ1IxNkwsCQkJLyogdHlwZSAqLwotCSAwMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTg4a19zcGVjaWFsX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUENSMTZMIiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QQ1IyNkwsCQkJLyogdHlwZSAqLwotCSAwMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTg4a19zcGVjaWFsX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUENSMjZMIiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwM2ZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAzZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9WUlQxNiwJCQkvKiB0eXBlICovCi0JIDAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtODhrX3NwZWNpYWxfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJWUlQxNiIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfSFZSVDE2LAkJCS8qIHR5cGUgKi8KLQkgMTYsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTg4a19zcGVjaWFsX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSFZSVDE2IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9MVlJUMTYsCQkJLyogdHlwZSAqLwotCSAwMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtODhrX3NwZWNpYWxfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJMVlJUMTYiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1ZSVDMyLAkJCS8qIHR5cGUgKi8KLQkgMDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG04OGtfc3BlY2lhbF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlZSVDMyIiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLS8qIENvZGUgdG8gdHVybiBhbiBleHRlcm5hbCByX3R5cGUgaW50byBhIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlCi0gICBhYm92ZSBob3d0byB0YWJsZS4gICovCi1zdGF0aWMgdm9pZAotcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OwotewotICBpZiAoZHN0LT5yX3R5cGUgPj0gUl9QQ1IxNkwgJiYgZHN0LT5yX3R5cGUgPD0gUl9WUlQzMikKLSAgICB7Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gaG93dG9fdGFibGUgKyBkc3QtPnJfdHlwZSAtIFJfUENSMTZMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKDApOwotICAgIH0KLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQotCi0KLS8qIENvZGUgdG8gc3dhcCBpbiB0aGUgcmVsb2Mgb2Zmc2V0ICovCi0jZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUICBiZmRfaF9nZXRfMTYKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8xNgotCi0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pCVwKLSAgcmVsb2NfcHJvY2Vzc2luZyhyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotCi1zdGF0aWMgdm9pZAotcmVsb2NfcHJvY2Vzc2luZyAocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLSAgICAgYXJlbGVudCAqcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7Ci0gIHJ0eXBlMmhvd3RvIChyZWxlbnQsIHJlbG9jKTsKLQotICBpZiAoKChpbnQpIHJlbG9jLT5yX3N5bW5keCkgPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLQotICByZWxlbnQtPmFkZGVuZCA9IHJlbG9jLT5yX29mZnNldDsKLSAgcmVsZW50LT5hZGRyZXNzIC09IHNlY3Rpb24tPnZtYTsKLX0KLQotI2RlZmluZSBCQURNQUcoeCkgTUM4OEJBRE1BRyh4KQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLSN1bmRlZiBjb2ZmX3dyaXRlX2FybWFwCi0KLWNvbnN0IGJmZF90YXJnZXQgbTg4a2Jjc192ZWMgPQotewotICAiY29mZi1tODhrYmNzIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gICAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtbWNvcmUuYyBiL2JmZC9jb2ZmLW1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZWZlYmYuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtbWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDczMyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE1vdG9yb2xsYSBNQ29yZSBDT0ZGL1BFCi0gICBDb3B5cmlnaHQgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL21jb3JlLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvcGUuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNpZmRlZiBCQURNQUcKLSN1bmRlZiBCQURNQUcKLSNlbmRpZgotI2RlZmluZSBCQURNQUcoeCkgTUNPUkVCQURNQUcoeCkKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShBKSAoc2l6ZW9mIChBKSAvIHNpemVvZiAoQSlbMF0pCi0jZW5kaWYKLQotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIG1vcmUgdGhhbiBvbmNlLCBidXQgd2Ugb25seSBjb21waWxlIHRoZQotICAgZmluYWxfbGluayByb3V0aW5lIG9uY2UuICAqLwotZXh0ZXJuIGJvb2xlYW4gbWNvcmVfYmZkX2NvZmZfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiBjb2ZmX21jb3JlX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgICAgICAgIG1jb3JlX2NvZmZfdW5zdXBwb3J0ZWRfcmVsb2MgCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgbWNvcmVfY29mZl9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICBjb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICogICAgICAgICAgIHBlX29iamVjdF9wCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLQotDAotLyogVGhlIE5UIGxvYWRlciBwb2ludHMgdGhlIHRvYyByZWdpc3RlciB0byAmdG9jICsgMzI3NjgsIGluIG9yZGVyIHRvCi0gICB1c2UgdGhlIGNvbXBsZXRlIHJhbmdlIG9mIGEgMTYtYml0IGRpc3BsYWNlbWVudC4gV2UgaGF2ZSB0byBhZGp1c3QKLSAgIGZvciB0aGlzIHdoZW4gd2UgZml4IHVwIGxvYWRzIGRpc3BsYWNlZCBvZmYgdGhlIHRvYyByZWcuICAqLwotI2RlZmluZSBUT0NfTE9BRF9BREpVU1RNRU5UICgtMzI3NjgpCi0jZGVmaW5lIFRPQ19TRUNUSU9OX05BTUUgIi5wcml2YXRlLnRvYyIKLQotLyogVGhlIG1haW4gYm9keSBvZiBjb2RlIGlzIGluIGNvZmZjb2RlLmguICAqLwotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0KLS8qIEluIGNhc2Ugd2UncmUgb24gYSAzMi1iaXQgbWFjaGluZSwgY29uc3RydWN0IGEgNjQtYml0ICItMSIgdmFsdWUKLSAgIGZyb20gc21hbGxlciB2YWx1ZXMuICBTdGFydCB3aXRoIHplcm8sIHdpZGVuLCAqdGhlbiogZGVjcmVtZW50LiAgKi8KLSNkZWZpbmUgTUlOVVNfT05FCSgoKGJmZF92bWEpMCkgLSAxKQotCi0MCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtY29yZV9jb2ZmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfQUJTT0xVVEUsLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDAsCSAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogZG9udCBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUJTT0xVVEUiLCAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMCwJIAkgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAsICAgICAgICAJCSAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9BRERSMzIsLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjMyIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogOCBiaXRzICsgMiB6ZXJvIGJpdHM7IGptcGkvanNyaS9scncgaW5zdHJ1Y3Rpb25zLgotICAgICBTaG91bGQgbm90IGFwcGVhciBpbiBvYmplY3QgZmlsZXMuICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NOEJZNCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1jb3JlX2NvZmZfdW5zdXBwb3J0ZWRfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTThCWTQiLCAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogYnNyL2J0L2JmL2JyIGluc3RydWN0aW9uczsgMTEgYml0cyArIDEgemVybyBiaXQgCi0gICAgIFNwYW4gMmsgaW5zdHJ1Y3Rpb25zID09IDRrIGJ5dGVzLgotICAgICBPbmx5IHVzZWZ1bCBwaWVjZXMgYXQgdGhlIHJlbG9jYXRlZCBhZGRyZXNzIGFyZSB0aGUgb3Bjb2RlICg1IGJpdHMpICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NMTFCWTIsLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTTExQlkyIiwgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNCBiaXRzICsgMSB6ZXJvIGJpdDsgJ2xvb3B0JyBpbnN0cnVjdGlvbiBvbmx5OyB1bnN1cHBvcnRlZC4gKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU00QlkyLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWNvcmVfY29mZl91bnN1cHBvcnRlZF9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSU1NNEJZMiIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IHBjLXJlbGF0aXZlLiBFdmVudHVhbGx5IHRoaXMgd2lsbCBoZWxwIHN1cHBvcnQgUElDIGNvZGUuICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfMzIsLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUENSRUxfMzIiLAkgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBQQ1JFTF9JTU0xMUJZMiwgdGhpcyByZWxvY2F0aW9uIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEKLSAgICAgJ2pzcmknIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gVGhlcmUgaXMgYSBzZXBhcmF0ZSByZWxvY2F0aW9uCi0gICAgIGVudHJ5IGZvciB0aGUgbGl0ZXJhbCBwb29sIGVudHJ5IHRoYXQgaXQgcmVmZXJlbmNlcywgYnV0IHdlIAotICAgICBtaWdodCBiZSBhYmxlIHRvIGNoYW5nZSB0aGUganNyaSB0byBhIGJzciBpZiB0aGUgdGFyZ2V0IHR1cm5zIG91dAotICAgICB0byBiZSBjbG9zZSBlbm91Z2ggW2V2ZW4gdGhvdWdoIHdlIHdvbid0IHJlY2xhaW0gdGhlIGxpdGVyYWwgcG9vbAotICAgICBlbnRyeSwgd2UnbGwgZ2V0IHNvbWUgcnVudGltZSBlZmZpY2llbmN5IGJhY2tdLiBOb3RlIHRoYXQgdGhpcwotICAgICBpcyBhIHJlbG9jYXRpb24gdGhhdCB3ZSBhcmUgYWxsb3dlZCB0byBzYWZlbHkgaWdub3JlLiAgKi8gCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyLC8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDExLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCSAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJKU1JfSU1NMTFCWTIiLCAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9SVkEsICAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTUNPUkVfUlZBIiwgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQwKLS8qIEV4dGVuZCB0aGUgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlIHdpdGggYSBmZXcgTSpDb3JlIHNwZWNpZmljIGZpZWxkcy4KLSAgIFRoaXMgYWxsb3dzIHVzIHRvIHN0b3JlIGdsb2JhbCBkYXRhIGhlcmUgd2l0aG91dCBhY3R1YWxseSBjcmVhdGluZyBhbnkKLSAgIGdsb2JhbCB2YXJpYWJsZXMsIHdoaWNoIGlzIGEgbm8tbm8gaW4gdGhlIEJGRCB3b3JsZC4gICovCi10eXBlZGVmIHN0cnVjdCBjb2ZmX21jb3JlX2xpbmtfaGFzaF90YWJsZQotewotICAvKiBUaGUgb3JpZ2luYWwgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlLiAgTVVTVCBiZSBmaXJzdCBmaWVsZC4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZQlyb290OwotCi0gIGJmZCAqICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9vZl90b2Nfb3duZXI7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90b2Nfc2l6ZTsKLSAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0X3RhYmxlX3NpemU7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3RodW5rX2FkZHJlc3M7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIHRodW5rX3NpemU7Ci19Ci1tY29yZV9oYXNoX3RhYmxlOwotCi0vKiBHZXQgdGhlIE1Db3JlIGNvZmYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBjb2ZmX21jb3JlX2hhc2hfdGFibGUoaW5mbykgXAotICAoKG1jb3JlX2hhc2hfdGFibGUgKikgKChpbmZvKS0+aGFzaCkpCi0KLS8qIENyZWF0ZSBhbiBNQ29yZSBjb2ZmIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1jb2ZmX21jb3JlX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIG1jb3JlX2hhc2hfdGFibGUgKiByZXQ7Ci0KLSAgcmV0ID0gKChtY29yZV9oYXNoX3RhYmxlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqIHJldCkpKTsKLSAgaWYgKHJldCA9PSAobWNvcmVfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdAotICAgICAgKCYgcmV0LT5yb290LCBhYmZkLCBfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmJmZF9vZl90b2Nfb3duZXIgPSBOVUxMOwotICByZXQtPmdsb2JhbF90b2Nfc2l6ZSAgPSAwOwotICByZXQtPmltcG9ydF90YWJsZV9zaXplID0gMDsKLSAgcmV0LT5maXJzdF90aHVua19hZGRyZXNzID0gMDsKLSAgcmV0LT50aHVua19zaXplID0gMDsKLQotICByZXR1cm4gJiByZXQtPnJvb3Qucm9vdDsKLX0KLQwKLS8qQVJHU1VTRUQqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWNvcmVfY29mZl91bnN1cHBvcnRlZF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiByZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqIHN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICogb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKiBlcnJvcl9tZXNzYWdlOwotewotICBCRkRfQVNTRVJUIChyZWxvY19lbnRyeS0+aG93dG8gIT0gKHJlbG9jX2hvd3RvX3R5cGUgKikwKTsKLSAgCi0gIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IFJlbG9jYXRpb24gJXMgKCVkKSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIpLAotCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJICAgICAgcmVsb2NfZW50cnktPmhvd3RvLT5uYW1lLAotCQkgICAgICByZWxvY19lbnRyeS0+aG93dG8tPnR5cGUpOwotICAKLSAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci19Ci0KLQwKLS8qIEEgY2hlZXN5IGxpdHRsZSBtYWNybyB0byBtYWtlIHRoZSBjb2RlIGEgbGl0dGxlIG1vcmUgcmVhZGFibGUuICovCi0jZGVmaW5lIEhPVzJNQVAoYmZkX3J0eXBlLCBtY29yZV9ydHlwZSkgIFwKLSBjYXNlIGJmZF9ydHlwZTogcmV0dXJuICYgbWNvcmVfY29mZl9ob3d0b190YWJsZSBbbWNvcmVfcnR5cGVdCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLW1jb3JlX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgeyAKLSAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ18zMiwgICAgICAgICAgICAgICAgICAgICAgIElNQUdFX1JFTF9NQ09SRV9BRERSMzIpOwotICAgICAgSE9XMk1BUCAoQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQsICAgICAgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTThCWTQpOwotICAgICAgSE9XMk1BUCAoQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyLCAgICAgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTTExQlkyKTsKLSAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyLCAgICAgIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU00QlkyKTsKLSAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ18zMl9QQ1JFTCwgICAgICAgICAgICAgICAgIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF8zMik7Ci0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyLCBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyKTsKLSAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ19SVkEsICAgICAgICAgICAgICAgICAgICAgIElNQUdFX1JFTF9NQ09SRV9SVkEpOwotICAgZGVmYXVsdDogCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLSN1bmRlZiBIT1cyTUFQCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIFwKLSAgKGNhY2hlX3B0ciktPmhvd3RvID0gbWNvcmVfY29mZl9ob3d0b190YWJsZSArIChkc3QpLT5yX3R5cGU7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfbWNvcmVfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiBzeW07Ci0gICAgIGJmZF92bWEgKiBhZGRlbmRwOwotewotICByZWxvY19ob3d0b190eXBlICogaG93dG87Ci0KLQotICBpZiAocmVsLT5yX3R5cGUgPj0gTlVNX0VMRU0gKG1jb3JlX2NvZmZfaG93dG9fdGFibGUpKQotICAgIHJldHVybiBOVUxMOwotICAKLSAgaG93dG8gPSBtY29yZV9jb2ZmX2hvd3RvX3RhYmxlICsgcmVsLT5yX3R5cGU7Ci0KLSAgaWYgKHJlbC0+cl90eXBlID09IElNQUdFX1JFTF9NQ09SRV9SVkEpCi0gICAgKiBhZGRlbmRwIC09IHBlX2RhdGEgKHNlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLSAgCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgewotICAgICAgKiBhZGRlbmRwID0gc2VjLT52bWEgLSAyOyAvKiBYWFggZ3Vlc3MgLSBpcyB0aGlzIHJpZ2h0ID8gKi8KLSAgICAgIAotICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCB0aGVuIHRoZSBnZW5lcmljIGNvZGUgaXMgZ29pbmcgdG8KLSAgICAgICAgIGFkZCBiYWNrIHRoZSBzeW1ib2wgdmFsdWUgaW4gb3JkZXIgdG8gY2FuY2VsIG91dCBhbgotICAgICAgICAgYWRqdXN0bWVudCBpdCBtYWRlIHRvIHRoZSBhZGRlbmQuICBIb3dldmVyLCB3ZSBzZXQgdGhlIGFkZGVuZAotICAgICAgICAgdG8gMCBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmdW5jdGlvbi4gIFdlIG5lZWQgdG8gYWRqdXN0IGhlcmUsCi0gICAgICAgICB0byBhdm9pZCB0aGUgYWRqdXN0bWVudCB0aGUgZ2VuZXJpYyBjb2RlIHdpbGwgbWFrZS4gIEZJWE1FOgotICAgICAgICAgVGhpcyBpcyBnZXR0aW5nIGEgYml0IGhhY2tpc2guICAqLwotICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCSogYWRkZW5kcCAtPSBzeW0tPm5fdmFsdWU7Ci0gICAgfQotICBlbHNlCi0gICAgKiBhZGRlbmRwID0gMDsKLSAgCi0gIHJldHVybiBob3d0bzsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0aW9uIHNob3VsZCBhcHBlYXIgaW4gdGhlIG91dHB1dCAucmVsb2Mgc2VjdGlvbi4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVmZXJlbmNlZCBpbiBwZV9ta29iamVjdCBpbiBwZWljb2RlLmguICAqLwotc3RhdGljIGJvb2xlYW4KLWluX3JlbG9jX3AgKGFiZmQsIGhvd3RvKQotICAgICBiZmQgKiBhYmZkOwotICAgICByZWxvY19ob3d0b190eXBlICogaG93dG87Ci17Ci0gIHJldHVybiAhIGhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfTUNPUkVfUlZBOwotfSAgICAgCi0KLQwKLS8qIFRoZSByZWxvYyBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIHRoZSBvcHRpbWl6ZWQgQ09GRiBsaW5rZXIuICAqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqIG91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgYmZkICogaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqIHN5bXM7Ci0gICAgIGFzZWN0aW9uICoqIHNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbGVuZDsKLSAgYm9vbGVhbiBoaWhhbGY7Ci0gIGJmZF92bWEgaGloYWxmX3ZhbDsKLSAgCi0gIC8qIElmIHdlIGFyZSBwZXJmb3JtaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdlIGRvbid0IG5lZWQgdG8gZG8gYQotICAgICB0aGluZy4gIFRoZSBjYWxsZXIgd2lsbCB0YWtlIGNhcmUgb2YgYWRqdXN0aW5nIHRoZSByZWxvYwotICAgICBhZGRyZXNzZXMgYW5kIHN5bWJvbCBpbmRpY2VzLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmICggICBpbnB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBvdXRwdXRfYmZkLT54dmVjLT5ieXRlb3JkZXIKLSAgICAgICYmIG91dHB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBCRkRfRU5ESUFOX1VOS05PV04pCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjb21waWxlZCBmb3IgYSAlcyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgJXMgZW5kaWFuLlxuIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSA/ICJiaWciIDogImxpdHRsZSIsCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkgPyAiYmlnIiA6ICJsaXR0bGUiKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGhpaGFsZiA9IGZhbHNlOwotICBoaWhhbGZfdmFsID0gMDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICAKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICAgIHRvY19zZWN0aW9uID0gTlVMTDsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uOwotICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW5keDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiAgICAgICBzeW07Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICAgdmFsOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgICByc3RhdDsKLSAgICAgIGJmZF9ieXRlICogICAgICAgICAgICAgICAgICAgICBsb2M7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgcl90eXBlID0gcmVsLT5yX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgICAgaG93dG8gPSBOVUxMOwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogIGg7Ci0gICAgICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgICAgbXlfbmFtZTsKLSAgCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotICAgICAgbG9jID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgaG93dG8gYW5kIGluaXRpYWxpc2UgdGhlIGFkZGVuZC4gICovCi0gICAgICBob3d0byA9IGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbCwgaCwKLQkJCQkgICAgICAgc3ltLCAmIGFkZGVuZCk7Ci0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHZhbCA9IDA7Ci0gICAgICAKLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgbXlfbmFtZSA9ICIqQUJTKiI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0JICAgICAgCi0JICAgICAgdmFsID0gKHN5bS0+bl92YWx1ZSAKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQkJbXlfbmFtZSA9ICIqdW5rbm93bioiOwotCSAgICAgIGVsc2UgaWYgKCAgIHN5bS0+X24uX25fbi5fbl96ZXJvZXMgPT0gMAotCQkgICAgICAgJiYgc3ltLT5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQotCQlteV9uYW1lID0gb2JqX2NvZmZfc3RyaW5ncyAoaW5wdXRfYmZkKSArIHN5bS0+X24uX25fbi5fbl9vZmZzZXQ7Ci0JICAgICAgZWxzZSAKLQkJewotCQkgIHN0YXRpYyBjaGFyIGJ1ZiBbU1lNTk1MRU4gKyAxXTsKLQkJICAKLQkJICBzdHJuY3B5IChidWYsIHN5bS0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotCQkgIGJ1ZltTWU1OTUxFTl0gPSAnXDAnOwotCQkgIG15X25hbWUgPSBidWY7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoICAgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICAKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgCi0JICBteV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQl9CQotCi0gICAgICByc3RhdCA9IGJmZF9yZWxvY19vazsKLSAgICAgIAotICAgICAgLyogRWFjaCBjYXNlIG11c3QgZG8gaXRzIG93biByZWxvY2F0aW9uLCBzZXR0aW5nIHJzdGF0IGFwcHJvcHJpYXRlbHkuICAqLwotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUgMHglMDJ4IiksCi0JCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCByX3R5cGUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JICAKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9BQlNPTFVURToKLQkgIGZwcmludGYgKHN0ZGVyciwgCi0JCSAgIF8oIldhcm5pbmc6IHVuc3VwcG9ydGVkIHJlbG9jICVzIDxmaWxlICVzLCBzZWN0aW9uICVzPlxuIiksIAotCQkgICBob3d0by0+bmFtZSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJICAgaW5wdXRfc2VjdGlvbi0+bmFtZSk7Ci0JICAKLQkgIGZwcmludGYgKHN0ZGVyciwic3ltICVsZCAoJXMpLCByX3ZhZGRyICVsZCAoJWx4KVxuIiwgCi0JCSAgIHJlbC0+cl9zeW1uZHgsIG15X25hbWUsIChsb25nKSByZWwtPnJfdmFkZHIsCi0JCSAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIpOyAgCi0JICBicmVhazsKLQkgIAotCWNhc2UgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTThCWTQ6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NMTFCWTI6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NNEJZMjoKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF8zMjoKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTI6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfQUREUjMyOgotCWNhc2UgSU1BR0VfUkVMX01DT1JFX1JWQToKLQkgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgdmFsLCBsb2MpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JICAKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGluZm8sIG15X25hbWUsIGhvd3RvLT5uYW1lLCAKLQkJICAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0gICAgIAotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBUYWlsb3IgY29mZmNvZGUuaCAtLSBtYWNybyBoZWF2ZW4uICovCi0KLS8qIFdlIHVzZSB0aGUgc3BlY2lhbCBDT0ZGIGJhY2tlbmQgbGlua2VyLCB3aXRoIG91ciBvd24gc3BlY2lhbCB0b3VjaC4gICovCi0KLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgICBtY29yZV9jb2ZmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiAgICAgICAgY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gICAgICAgICAgY29mZl9tY29yZV9ydHlwZV90b19ob3d0bwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyhpbnRlcm5hbCwgaG93dG8pIHtpbnRlcm5hbC5yX3R5cGUgPSBob3d0by0+dHlwZTt9Ci0KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgICAgICAgICAgICAgICAweDEwMDAKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0MCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1wZV9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgLyogV2UgbmVlZCB0byBoYWNrIGJhZGx5IHRvIGhhbmRsZSBhIFBFIGltYWdlIGNvcnJlY3RseS4gIEluIFBFCi0gICAgIGltYWdlcyBjcmVhdGVkIGJ5IHRoZSBHTlUgbGlua2VyLCB0aGUgb2Zmc2V0IHRvIHRoZSBDT0ZGIGhlYWRlcgotICAgICBpcyBhbHdheXMgdGhlIHNpemUuICBIb3dldmVyLCB0aGlzIGlzIG5vdCB0aGUgY2FzZSBpbiBpbWFnZXMKLSAgICAgZ2VuZXJhdGVkIGJ5IG90aGVyIFBFIGxpbmtlcnMuICBUaGUgUEUgZm9ybWF0IHN0b3JlcyBhIGZvdXIgYnl0ZQotICAgICBvZmZzZXQgdG8gdGhlIFBFIHNpZ25hdHVyZSBqdXN0IGJlZm9yZSB0aGUgQ09GRiBoZWFkZXIgYXQKLSAgICAgbG9jYXRpb24gMHgzYyBvZiB0aGUgZmlsZS4gIFdlIHBpY2sgdXAgdGhhdCBvZmZzZXQsIHZlcmlmeSB0aGF0Ci0gICAgIHRoZSBQRSBzaWduYXR1cmUgaXMgdGhlcmUsIGFuZCB0aGVuIHNldCBvdXJzZWx2ZXMgdXAgdG8gcmVhZCBpbgotICAgICB0aGUgQ09GRiBoZWFkZXIuICAqLwotICB7Ci0gICAgYmZkX2J5dGUgZXh0X29mZnNldFs0XTsKLSAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgYmZkX2J5dGUgZXh0X3NpZ25hdHVyZVs0XTsKLSAgICB1bnNpZ25lZCBsb25nIHNpZ25hdHVyZTsKLQotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgMHgzYywgU0VFS19TRVQpICE9IDAKLQl8fCBiZmRfcmVhZCAoZXh0X29mZnNldCwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICAgIHsKLQlpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICAKLSAgICBvZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dF9vZmZzZXQpOwotICAgIAotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCXx8IGJmZF9yZWFkIChleHRfc2lnbmF0dXJlLCAxLCA0LCBhYmZkKSAhPSA0KQotICAgICAgewotCWlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCQotCXJldHVybiBOVUxMOwotICAgICAgfQotICAgIAotICAgIHNpZ25hdHVyZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0X3NpZ25hdHVyZSk7Ci0KLSAgICBpZiAoc2lnbmF0dXJlICE9IDB4NDU1MCkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLQotICAgIC8qIEhlcmUgaXMgdGhlIGhhY2suICBjb2ZmX29iamVjdF9wIHdhbnRzIHRvIHJlYWQgZmlsaHN6IGJ5dGVzIHRvCi0gICAgICAgcGljayB1cCB0aGUgQ09GRiBoZWFkZXIuICBXZSBhZGp1c3Qgc28gdGhhdCB0aGF0IHdpbGwgd29yay4gIDIwCi0gICAgICAgaXMgdGhlIHNpemUgb2YgdGhlIG1pcHMgQ09GRiBmaWxlaGRyLiAgKi8KLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChiZmRfdGVsbCAoYWJmZCkgLSBiZmRfY29mZl9maWxoc3ogKGFiZmQpICsgMjApLAotCQkgIFNFRUtfU0VUKSAhPSAwKQotICAgICAgewotCWlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCQotCXJldHVybiBOVUxMOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICByZXR1cm4gY29mZl9vYmplY3RfcCAoYWJmZCk7Ci19Ci0MCi0vKiBUaGUgdHJhbnNmZXIgdmVjdG9ycyB0aGF0IGxlYWQgdGhlIG91dHNpZGUgd29ybGQgdG8gYWxsIG9mIHRoZSBhYm92ZS4gKi8KLQotY29uc3QgYmZkX3RhcmdldAotVEFSR0VUX0JJR19TWU0gPQotewotICBUQVJHRVRfQklHX05BTUUsCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAkKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLwotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0KLSAgMCwJCQkJLyogbGVhZGluZyBjaGFyICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotICB7IF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIHBlX29iamVjdF9wLCAJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIAkvKiBfYmZkX2R1bW15X3RhcmdldCAqLwotICAgIHBlX29iamVjdF9wCi0gIH0sCi0gIHsgYmZkX2ZhbHNlLAotICAgIGNvZmZfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0gIHsgYmZkX2ZhbHNlLAotICAgIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUsCi19OwotCi1jb25zdCBiZmRfdGFyZ2V0Ci1UQVJHRVRfTElUVExFX1NZTSA9Ci17Ci0gIFRBUkdFVF9MSVRUTEVfTkFNRSwKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgIHwgU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVMpLAotICAKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICAKLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0vKiBOb3RlIHRoYXQgd2UgYWxsb3cgYW4gb2JqZWN0IGZpbGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvcmUgZmlsZSBhcyB3ZWxsLiAqLwotICB7Ci0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgcGVfb2JqZWN0X3AsIAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwKLSAgICBwZV9vYmplY3RfcAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIGNvZmZfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07Ci0KZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLW1pcHMuYyBiL2JmZC9jb2ZmLW1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUxZWI4Ni4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzI2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTUlQUyBFeHRlbmRlZC1Db2ZmIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIE9yaWdpbmFsIHZlcnNpb24gYnkgUGVyIEJvdGhuZXIuCi0gICBGdWxsIHN1cHBvcnQgYWRkZWQgYnkgSWFuIExhbmNlIFRheWxvciwgaWFuQGN5Z251cy5jb20uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCi0jaW5jbHVkZSAiY29mZi9lY29mZi5oIgotI2luY2x1ZGUgImNvZmYvbWlwcy5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLSNpbmNsdWRlICJsaWJlY29mZi5oIgotDAotLyogUHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuIG1pcHNfZWNvZmZfYmFkX2Zvcm1hdF9ob29rIFBBUkFNUyAoKGJmZCAqYWJmZCwgUFRSIGZpbGVoZHIpKTsKLXN0YXRpYyB2b2lkIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwgUFRSLAotCQkJCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotc3RhdGljIHZvaWQgbWlwc19lY29mZl9zd2FwX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCQkgICAgICAgUFRSKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2FkanVzdF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkJICBhcmVsZW50ICopKTsKLXN0YXRpYyB2b2lkIG1pcHNfYWRqdXN0X3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgYXJlbGVudCAqLAotCQkJCQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX2dlbmVyaWNfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJCSBhcmVsZW50ICpyZWxvYywKLQkJCQkJCQkgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJCSBQVFIgZGF0YSwKLQkJCQkJCQkgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkJIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCQkgY2hhciAqKmVycm9yKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfcmVmaGlfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfcmVmbG9fcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfZ3ByZWxfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfcmVsaGlfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfcmVsbG9fcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfc3dpdGNoX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCQlhcmVsZW50ICpyZWxvYywKLQkJCQkJCQlhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkJUFRSIGRhdGEsCi0JCQkJCQkJYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkJYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJCWNoYXIgKiplcnJvcikpOwotc3RhdGljIHZvaWQgbWlwc19yZWxvY2F0ZV9oaSBQQVJBTVMgKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlZmhpLAotCQkJCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVmbG8sCi0JCQkJICAgICAgYmZkICppbnB1dF9iZmQsCi0JCQkJICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLAotCQkJCSAgICAgIHNpemVfdCBhZGp1c3QsCi0JCQkJICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uLAotCQkJCSAgICAgIGJvb2xlYW4gcGNyZWwpKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgICAgYmZkICosIGFzZWN0aW9uICosCi0JCQkJCSAgICAgIGJmZF9ieXRlICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19yZWFkX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19yZWxheF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfcmVsYXhfcGNyZWwxNiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKLQkJCQkJICAgYXNlY3Rpb24gKiwKLQkJCQkJICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLAotCQkJCQkgICBiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqbWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotCi0MCi0vKiBFQ09GRiBoYXMgQ09GRiBzZWN0aW9ucywgYnV0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluCi0gICBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGZvcm1hdC4gIEVDT0ZGIHRhcmdldHMgdXNlIHNvbWUgb2YgdGhlCi0gICBzd2FwcGluZyByb3V0aW5lcyBmcm9tIGNvZmZzd2FwLmgsIGFuZCBzb21lIG9mIHRoZSBnZW5lcmljIENPRkYKLSAgIHJvdXRpbmVzIGluIGNvZmZnZW4uYywgYnV0LCB1bmxpa2UgdGhlIHJlYWwgQ09GRiB0YXJnZXRzLCBkbyBub3QKLSAgIHVzZSBjb2ZmY29kZS5oIGl0c2VsZi4KLQotICAgR2V0IHRoZSBnZW5lcmljIENPRkYgc3dhcHBpbmcgcm91dGluZXMsIGV4Y2VwdCBmb3IgdGhlIHJlbG9jLAotICAgc3ltYm9sLCBhbmQgbGluZW5vIG9uZXMuICBHaXZlIHRoZW0gRUNPRkYgbmFtZXMuICAqLwotI2RlZmluZSBNSVBTRUNPRkYKLSNkZWZpbmUgTk9fQ09GRl9SRUxPQ1MKLSNkZWZpbmUgTk9fQ09GRl9TWU1CT0xTCi0jZGVmaW5lIE5PX0NPRkZfTElORU5PUwotI2RlZmluZSBjb2ZmX3N3YXBfZmlsZWhkcl9pbiBtaXBzX2Vjb2ZmX3N3YXBfZmlsZWhkcl9pbgotI2RlZmluZSBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgbWlwc19lY29mZl9zd2FwX2ZpbGVoZHJfb3V0Ci0jZGVmaW5lIGNvZmZfc3dhcF9hb3V0aGRyX2luIG1pcHNfZWNvZmZfc3dhcF9hb3V0aGRyX2luCi0jZGVmaW5lIGNvZmZfc3dhcF9hb3V0aGRyX291dCBtaXBzX2Vjb2ZmX3N3YXBfYW91dGhkcl9vdXQKLSNkZWZpbmUgY29mZl9zd2FwX3Njbmhkcl9pbiBtaXBzX2Vjb2ZmX3N3YXBfc2NuaGRyX2luCi0jZGVmaW5lIGNvZmZfc3dhcF9zY25oZHJfb3V0IG1pcHNfZWNvZmZfc3dhcF9zY25oZHJfb3V0Ci0jaW5jbHVkZSAiY29mZnN3YXAuaCIKLQotLyogR2V0IHRoZSBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gICovCi0jZGVmaW5lIEVDT0ZGXzMyCi0jaW5jbHVkZSAiZWNvZmZzd2FwLmgiCi0MCi0vKiBIb3cgdG8gcHJvY2VzcyB0aGUgdmFyaW91cyByZWxvY3MgdHlwZXMuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtaXBzX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBSZWxvYyB0eXBlIDAgaXMgaWdub3JlZC4gIFRoZSByZWxvYyByZWFkaW5nIGNvZGUgZW5zdXJlcyB0aGF0Ci0gICAgIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gdGhlIC5hYnMgc2VjdGlvbiwgd2hpY2ggd2lsbCBjYXVzZQotICAgICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHRvIGRvIG5vdGhpbmcuICAqLwotICBIT1dUTyAoTUlQU19SX0lHTk9SRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSUdOT1JFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDE2IGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wsIG5vcm1hbGx5IGZyb20gYSBkYXRhIHNlY3Rpb24uICAqLwotICBIT1dUTyAoTUlQU19SX1JFRkhBTEYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGSEFMRiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbCwgbm9ybWFsbHkgZnJvbSBhIGRhdGEgc2VjdGlvbi4gICovCi0gIEhPV1RPIChNSVBTX1JfUkVGV09SRCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWlwc19nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZXT1JEIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDI2IGJpdCBhYnNvbHV0ZSBqdW1wIGFkZHJlc3MuICAqLwotICBIT1dUTyAoTUlQU19SX0pNUEFERFIsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgCQkJLyogVGhpcyBuZWVkcyBjb21wbGV4IG92ZXJmbG93Ci0JCQkJICAgZGV0ZWN0aW9uLCBiZWNhdXNlIHRoZSB1cHBlciBmb3VyCi0JCQkJICAgYml0cyBtdXN0IG1hdGNoIHRoZSBQQy4gICovCi0JIG1pcHNfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSk1QQUREUiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIDE2IGJpdHMgb2YgYSBzeW1ib2wgdmFsdWUuICBIYW5kbGVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICBtaXBzX3JlZmhpX3JlbG9jLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUZISSwJCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX3JlZmhpX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZISSIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBsb3cgMTYgYml0cyBvZiBhIHN5bWJvbCB2YWx1ZS4gICovCi0gIEhPV1RPIChNSVBTX1JfUkVGTE8sCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfcmVmbG9fcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkxPIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWZlcmVuY2UgdG8gYW4gb2Zmc2V0IGZyb20gdGhlIGdwIHJlZ2lzdGVyLiAgSGFuZGxlZCBieSB0aGUKLSAgICAgZnVuY3Rpb24gbWlwc19ncHJlbF9yZWxvYy4gICovCi0gIEhPV1RPIChNSVBTX1JfR1BSRUwsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWlwc19ncHJlbF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BSRUwiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlZmVyZW5jZSB0byBhIGxpdGVyYWwgdXNpbmcgYW4gb2Zmc2V0IGZyb20gdGhlIGdwIHJlZ2lzdGVyLgotICAgICBIYW5kbGVkIGJ5IHRoZSBmdW5jdGlvbiBtaXBzX2dwcmVsX3JlbG9jLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWlwc19ncHJlbF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTElURVJBTCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIHsgOCB9LAotICB7IDkgfSwKLSAgeyAxMCB9LAotICB7IDExIH0sCi0KLSAgLyogVGhpcyByZWxvYyBpcyBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcgcG9zaXRpb24KLSAgICAgaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIEl0IHJlcHJlc2VudHMgYSAxNiBiaXQgUEMKLSAgICAgcmVsYXRpdmUgcmVsb2MgcmlnaHRzaGlmdGVkIHR3aWNlIGFzIHVzZWQgaW4gdGhlIE1JUFMgYnJhbmNoCi0gICAgIGluc3RydWN0aW9ucy4gICovCi0gIEhPV1RPIChNSVBTX1JfUENSRUwxNiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWlwc19nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQQ1JFTDE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhpcyByZWxvYyBpcyBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcgcG9zaXRpb24KLSAgICAgaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIEl0IHJlcHJlc2VudHMgdGhlIGhpZ2ggMTYKLSAgICAgYml0cyBvZiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgVGhlIG5leHQgcmVsb2MgbXVzdCBiZQotICAgICBNSVBTX1JfUkVMTE8sIGFuZCB0aGUgYWRkZW5kIGlzIGZvcm1lZCBmcm9tIHRoZSBhZGRlbmRzIG9mIHRoZQotICAgICB0d28gaW5zdHJ1Y3Rpb25zLCBqdXN0IGFzIGluIE1JUFNfUl9SRUZISSBhbmQgTUlQU19SX1JFRkxPLiAgVGhlCi0gICAgIGZpbmFsIHZhbHVlIGlzIGFjdHVhbGx5IFBDIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUKLSAgICAgTUlQU19SX1JFTExPIHJlbG9jLCBub3QgdGhlIE1JUFNfUl9SRUxISSByZWxvYy4gICovCi0gIEhPV1RPIChNSVBTX1JfUkVMSEksCQkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX3JlbGhpX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUxISSIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoaXMgcmVsb2MgaXMgYSBDeWdudXMgZXh0ZW5zaW9uIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHBvc2l0aW9uCi0gICAgIGluZGVwZW5kZW50IGNvZGUgZm9yIGVtYmVkZGVkIHN5c3RlbXMuICBJdCByZXByZXNlbnRzIHRoZSBsb3cgMTYKLSAgICAgYml0cyBvZiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUxMTywJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX3JlbGxvX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUxMTyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIHsgMTUgfSwKLSAgeyAxNiB9LAotICB7IDE3IH0sCi0gIHsgMTggfSwKLSAgeyAxOSB9LAotICB7IDIwIH0sCi0gIHsgMjEgfSwKLQotICAvKiBUaGlzIHJlbG9jIGlzIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbgotICAgICBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgSXQgcmVwcmVzZW50cyBhbiBlbnRyeSBpbgotICAgICBhIHN3aXRjaCB0YWJsZSwgd2hpY2ggaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gc3ltYm9scyBpbgotICAgICB0aGUgLnRleHQgc2VjdGlvbi4gIFRoZSBzeW1uZHggaXMgYWN0dWFsbHkgdGhlIG9mZnNldCBmcm9tIHRoZQotICAgICByZWxvYyBhZGRyZXNzIHRvIHRoZSBzdWJ0cmFoZW5kLiAgU2VlIGluY2x1ZGUvY29mZi9taXBzLmggZm9yCi0gICAgIG1vcmUgZGV0YWlscy4gICovCi0gIEhPV1RPIChNSVBTX1JfU1dJVENILAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfc3dpdGNoX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTV0lUQ0giLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpCQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0jZGVmaW5lIE1JUFNfSE9XVE9fQ09VTlQgXAotICAoc2l6ZW9mIG1pcHNfaG93dG9fdGFibGUgLyBzaXplb2YgbWlwc19ob3d0b190YWJsZVswXSkKLQotLyogV2hlbiB0aGUgbGlua2VyIGlzIGRvaW5nIHJlbGF4aW5nLCBpdCBtYXkgY2hhbmdlIGEgZXh0ZXJuYWwgUENSRUwxNgotICAgcmVsb2MuICBUaGlzIHR5cGljYWxseSByZXByZXNlbnRzIGFuIGluc3RydWN0aW9uIGxpa2UKLSAgICAgICBiYWwgZm9vCi0gICBXZSBjaGFuZ2UgaXQgdG8KLSAgICAgICAuc2V0ICBub3Jlb3JkZXIKLSAgICAgICBiYWwgICAkTDEKLSAgICAgICBsdWkgICAkYXQsJWhpKGZvbyAtICRMMSkKLSAgICAgJEwxOgotICAgICAgIGFkZGl1ICRhdCwlbG8oZm9vIC0gJEwxKQotICAgICAgIGFkZHUgICRhdCwkYXQsJDMxCi0gICAgICAgamFsciAgJGF0Ci0gICBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5UIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhpcyBjaGFuZ2VzIHRoZQotICAgaW5zdHJ1Y3Rpb24gYnkuICAqLwotCi0jZGVmaW5lIFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQgKDQgKiA0KQotDAotLyogU2VlIHdoZXRoZXIgdGhlIG1hZ2ljIG51bWJlciBtYXRjaGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWNvZmZfYmFkX2Zvcm1hdF9ob29rIChhYmZkLCBmaWxlaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotCi0gIHN3aXRjaCAoaW50ZXJuYWxfZi0+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+aG93dG8gPSAmbWlwc19ob3d0b190YWJsZVtpbnRlcm4tPnJfdHlwZV07Ci19Ci0KLS8qIE1ha2UgYW55IGFkanVzdG1lbnRzIG5lZWRlZCB0byBhIHJlbG9jIGJlZm9yZSB3cml0aW5nIGl0IG91dC4gIE5vbmUKLSAgIGFyZSBuZWVkZWQgZm9yIE1JUFMuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19hZGp1c3RfcmVsb2Nfb3V0IChhYmZkLCByZWwsIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBhcmVsZW50ICpyZWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotewotICAvKiBGb3IgYSBNSVBTX1JfU1dJVENIIHJlbG9jLCBvciBhbiBpbnRlcm5hbCBNSVBTX1JfUkVMSEkgb3IKLSAgICAgTUlQU19SX1JFTExPIHJlbG9jLCB3ZSBtdXN0IGNvcHkgcmVsLT5hZGRlbmQgaW50bwotICAgICBpbnRlcm4tPnJfb2Zmc2V0LiAgVGhpcyB3aWxsIHRoZW4gYmUgd3JpdHRlbiBvdXQgYXMgdGhlIHN5bWJvbAotICAgICBpbmRleCBieSBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0LiAgVGhpcyBvcGVyYXRpb24gcGFyYWxsZWxzIHRoZQotICAgICBhY3Rpb24gb2YgbWlwc19hZGp1c3RfcmVsb2NfaW4uICAqLwotICBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1NXSVRDSAotICAgICAgfHwgKCEgaW50ZXJuLT5yX2V4dGVybgotCSAgJiYgKGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxISQotCSAgICAgIHx8IGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxMTykpKQotICAgIGludGVybi0+cl9vZmZzZXQgPSByZWwtPmFkZGVuZDsKLX0KLQotLyogRUNPRkYgcmVsb2NzIGFyZSBlaXRoZXIgYWdhaW5zdCBleHRlcm5hbCBzeW1ib2xzLCBvciBhZ2FpbnN0Ci0gICBzZWN0aW9ucy4gIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgYW5kIHRoZSByZWxvYwotICAgaXMgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wsIGFuZCBub3RoaW5nIGhhcyBnaXZlbiB1cyBhbnkKLSAgIGFkZGl0aW9uYWwgYWRkZW5kLCB0aGUgcmVzdWx0aW5nIHJlbG9jIHdpbGwgYWxzbyBiZSBhZ2FpbnN0IHRoZQotICAgc2FtZSBzeW1ib2wuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgYW55dGhpbmcKLSAgIGFib3V0IHRoZSB3YXkgdGhlIHJlbG9jIGlzIGhhbmRsZWQsIHNpbmNlIGl0IHdpbGwgYWxsIGJlIGRvbmUgYXQKLSAgIGZpbmFsIGxpbmsgdGltZS4gIFJhdGhlciB0aGFuIHB1dCBzcGVjaWFsIGNhc2UgY29kZSBpbnRvCi0gICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCBhbGwgdGhlIHJlbG9jIHR5cGVzIHVzZSB0aGlzIGhvd3RvCi0gICBmdW5jdGlvbi4gIEl0IGp1c3Qgc2hvcnQgY2lyY3VpdHMgdGhlIHJlbG9jIGlmIHByb2R1Y2luZwotICAgcmVsb2NhdGVhYmxlIG91dHB1dCBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfZ2VuZXJpY19yZWxvYyAoYWJmZCwKLQkJICAgIHJlbG9jX2VudHJ5LAotCQkgICAgc3ltYm9sLAotCQkgICAgZGF0YSwKLQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICBvdXRwdXRfYmZkLAotCQkgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotLyogRG8gYSBSRUZISSByZWxvY2F0aW9uLiAgVGhpcyBoYXMgdG8gYmUgZG9uZSBpbiBjb21iaW5hdGlvbiB3aXRoIGEKLSAgIFJFRkxPIHJlbG9jLCBiZWNhdXNlIHRoZXJlIGlzIGEgY2FycnkgZnJvbSB0aGUgUkVGTE8gdG8gdGhlIFJFRkhJLgotICAgSGVyZSB3ZSBqdXN0IHNhdmUgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQ7IHdlIGRvIHRoZSBhY3R1YWwKLSAgIHJlbG9jYXRpb24gd2hlbiB3ZSBzZWUgdGhlIFJFRkxPLiAgTUlQUyBFQ09GRiByZXF1aXJlcyB0aGF0IHRoZQotICAgUkVGTE8gaW1tZWRpYXRlbHkgZm9sbG93IHRoZSBSRUZISS4gIEFzIGEgR05VIGV4dGVuc2lvbiwgd2UgcGVybWl0Ci0gICBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIEhJIHJlbG9jcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgTE8KLSAgIHJlbG9jLiAgVGhpcyBleHRlbnNpb24gcGVybWl0cyBnY2MgdG8gb3V0cHV0IHRoZSBISSBhbmQgTE8gcmVsb2NzCi0gICBpdHNlbGYuICAqLwotCi1zdHJ1Y3QgbWlwc19oaQotewotICBzdHJ1Y3QgbWlwc19oaSAqbmV4dDsKLSAgYmZkX2J5dGUgKmFkZHI7Ci0gIGJmZF92bWEgYWRkZW5kOwotfTsKLQotLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBhIHN0YXRpYyB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19oaSAqbWlwc19yZWZoaV9saXN0OwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX3JlZmhpX3JlbG9jIChhYmZkLAotCQkgIHJlbG9jX2VudHJ5LAotCQkgIHN5bWJvbCwKLQkJICBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sCi0JCSAgb3V0cHV0X2JmZCwKLQkJICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBzdHJ1Y3QgbWlwc19oaSAqbjsKLQotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvbid0IHdhbnQKLSAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldCA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogU2F2ZSB0aGUgaW5mb3JtYXRpb24sIGFuZCBsZXQgUkVGTE8gZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KLSAgbiA9IChzdHJ1Y3QgbWlwc19oaSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKm4pOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgbi0+YWRkciA9IChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIG4tPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gIG4tPm5leHQgPSBtaXBzX3JlZmhpX2xpc3Q7Ci0gIG1pcHNfcmVmaGlfbGlzdCA9IG47Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRG8gYSBSRUZMTyByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCAxNiBiaXQgaW5wbGFjZQotICAgcmVsb2NhdGlvbjsgdGhpcyBmdW5jdGlvbiBleGlzdHMgaW4gb3JkZXIgdG8gZG8gdGhlIFJFRkhJCi0gICByZWxvY2F0aW9uIGRlc2NyaWJlZCBhYm92ZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfcmVmbG9fcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAobWlwc19yZWZoaV9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG1pcHNfaGkgKmw7Ci0KLSAgICAgIGwgPSBtaXBzX3JlZmhpX2xpc3Q7Ci0gICAgICB3aGlsZSAobCAhPSBOVUxMKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKLQkgIHN0cnVjdCBtaXBzX2hpICpuZXh0OwotCi0JICAvKiBEbyB0aGUgUkVGSEkgcmVsb2NhdGlvbi4gIE5vdGUgdGhhdCB3ZSBhY3R1YWxseSBkb24ndAotCSAgICAgbmVlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBSRUZMTyBpdHNlbGYsIGV4Y2VwdAotCSAgICAgd2hlcmUgdG8gZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlCi0JICAgICBSRUZISS4gICovCi0JICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgbC0+YWRkcik7Ci0JICB2YWxsbyA9IChiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKQotCQkgICAmIDB4ZmZmZik7Ci0JICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOwotCSAgdmFsICs9IGwtPmFkZGVuZDsKLQotCSAgLyogVGhlIGxvdyBvcmRlciAxNiBiaXRzIGFyZSBhbHdheXMgdHJlYXRlZCBhcyBhIHNpZ25lZAotCSAgICAgdmFsdWUuICBUaGVyZWZvcmUsIGEgbmVnYXRpdmUgdmFsdWUgaW4gdGhlIGxvdyBvcmRlciBiaXRzCi0JICAgICByZXF1aXJlcyBhbiBhZGp1c3RtZW50IGluIHRoZSBoaWdoIG9yZGVyIGJpdHMuICBXZSBuZWVkCi0JICAgICB0byBtYWtlIHRoaXMgYWRqdXN0bWVudCBpbiB0d28gd2F5czogb25jZSBmb3IgdGhlIGJpdHMgd2UKLQkgICAgIHRvb2sgZnJvbSB0aGUgZGF0YSwgYW5kIG9uY2UgZm9yIHRoZSBiaXRzIHdlIGFyZSBwdXR0aW5nCi0JICAgICBiYWNrIGluIHRvIHRoZSBkYXRhLiAgKi8KLQkgIGlmICgodmFsbG8gJiAweDgwMDApICE9IDApCi0JICAgIHZhbCAtPSAweDEwMDAwOwotCSAgaWYgKCh2YWwgJiAweDgwMDApICE9IDApCi0JICAgIHZhbCArPSAweDEwMDAwOwotCi0JICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICgodmFsID4+IDE2KSAmIDB4ZmZmZik7Ci0JICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBsLT5hZGRyKTsKLQotCSAgbmV4dCA9IGwtPm5leHQ7Ci0JICBmcmVlIChsKTsKLQkgIGwgPSBuZXh0OwotCX0KLQotICAgICAgbWlwc19yZWZoaV9saXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogTm93IGRvIHRoZSBSRUZMTyByZWxvYyBpbiB0aGUgdXN1YWwgd2F5LiAgKi8KLSAgcmV0dXJuIG1pcHNfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotfQotCi0vKiBEbyBhIEdQUkVMIHJlbG9jYXRpb24uICBUaGlzIGlzIGEgMTYgYml0IHZhbHVlIHdoaWNoIG11c3QgYmVjb21lCi0gICB0aGUgb2Zmc2V0IGZyb20gdGhlIGdwIHJlZ2lzdGVyLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19ncHJlbF9yZWxvYyAoYWJmZCwKLQkJICByZWxvY19lbnRyeSwKLQkJICBzeW1ib2wsCi0JCSAgZGF0YSwKLQkJICBpbnB1dF9zZWN0aW9uLAotCQkgIG91dHB1dF9iZmQsCi0JCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBiZmRfdm1hIGdwOwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8KLSAgICAgYWRkZW5kLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZy4gIFdlIHdpbGwgb25seSBoYXZlIGFuCi0gICAgIGFkZGVuZCBpZiB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCByZWxvYywgbm90IHJlYWQgZnJvbSBhbiBFQ09GRgotICAgICBmaWxlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgcmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOwotICAgICAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotICAgIH0KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiByZWxvY2F0ZWFibGUgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogV2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSBncCB2YWx1ZSwgc28gdGhhdCB3ZSBjYW4gYWRqdXN0IHRoZQotICAgICBzeW1ib2wgdmFsdWUgY29ycmVjdGx5LiAgV2UgbG9vayB1cCB0aGUgc3ltYm9sIF9ncCBpbiB0aGUgb3V0cHV0Ci0gICAgIEJGRC4gIElmIHdlIGNhbid0IGZpbmQgaXQsIHdlJ3JlIHN0dWNrLiAgV2UgY2FjaGUgaXQgaW4gdGhlIEVDT0ZGCi0gICAgIHRhcmdldCBkYXRhLiAgV2UgZG9uJ3QgbmVlZCB0byBhZGp1c3QgdGhlIHN5bWJvbCB2YWx1ZSBmb3IgYW4KLSAgICAgZXh0ZXJuYWwgc3ltYm9sIGlmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gICovCi0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoZ3AgPT0gMAotICAgICAgJiYgKHJlbG9jYXRlYWJsZSA9PSBmYWxzZQotCSAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApKQotICAgIHsKLSAgICAgIGlmIChyZWxvY2F0ZWFibGUgIT0gZmFsc2UpCi0JewotCSAgLyogTWFrZSB1cCBhIHZhbHVlLiAgKi8KLQkgIGdwID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMHg0MDAwOwotCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgaW50IGNvdW50OwotCSAgYXN5bWJvbCAqKnN5bTsKLQkgIHVuc2lnbmVkIGludCBpOwotCi0JICBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpOwotCSAgc3ltID0gYmZkX2dldF9vdXRzeW1ib2xzIChvdXRwdXRfYmZkKTsKLQotCSAgaWYgKHN5bSA9PSAoYXN5bWJvbCAqKikgTlVMTCkKLQkgICAgaSA9IGNvdW50OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHN5bSsrKQotCQl7Ci0JCSAgcmVnaXN0ZXIgQ09OU1QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgqc3ltKTsKLQkJICBpZiAoKm5hbWUgPT0gJ18nICYmIHN0cmNtcCAobmFtZSwgIl9ncCIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGdwID0gYmZkX2FzeW1ib2xfdmFsdWUgKCpzeW0pOwotCQkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmIChpID49IGNvdW50KQotCSAgICB7Ci0JICAgICAgLyogT25seSBnZXQgdGhlIGVycm9yIG9uY2UuICAqLwotCSAgICAgIGdwID0gNDsKLQkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotCSAgICAgICplcnJvcl9tZXNzYWdlID0KLQkJKGNoYXIgKikgXygiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aGVuIF9ncCBub3QgZGVmaW5lZCIpOwotCSAgICAgIHJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIC8qIFNldCB2YWwgdG8gdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9yIHN5bWJvbC4gICovCi0gIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgKyByZWxvY19lbnRyeS0+YWRkZW5kKSAmIDB4ZmZmZjsKLSAgaWYgKHZhbCAmIDB4ODAwMCkKLSAgICB2YWwgLT0gMHgxMDAwMDsKLQotICAvKiBBZGp1c3QgdmFsIGZvciB0aGUgZmluYWwgc2VjdGlvbiBsb2NhdGlvbiBhbmQgR1AgdmFsdWUuICBJZiB3ZQotICAgICBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBmb3IKLSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZSA9PSBmYWxzZQotICAgICAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgdmFsICs9IHJlbG9jYXRpb24gLSBncDsKLQotICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICh2YWwgJiAweGZmZmYpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAocmVsb2NhdGVhYmxlICE9IGZhbHNlKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogTWFrZSBzdXJlIGl0IGZpdCBpbiAxNiBiaXRzLiAgKi8KLSAgaWYgKHZhbCA+PSAweDgwMDAgJiYgdmFsIDwgMHhmZmZmODAwMCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIERvIGEgUkVMSEkgcmVsb2NhdGlvbi4gIFdlIGRvIHRoaXMgaW4gY29uanVuY3Rpb24gd2l0aCBhIFJFTExPCi0gICByZWxvYywganVzdCBhcyBSRUZISSBhbmQgUkVGTE8gYXJlIGRvbmUgdG9nZXRoZXIuICBSRUxISSBhbmQgUkVMTE8KLSAgIGFyZSBDeWdudXMgZXh0ZW5zaW9ucyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbiBpbmRlcGVuZGVudAotICAgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gICovCi0KLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgYSBzdGF0aWMgdmFyaWFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IG1pcHNfaGkgKm1pcHNfcmVsaGlfbGlzdDsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19yZWxoaV9yZWxvYyAoYWJmZCwKLQkJICByZWxvY19lbnRyeSwKLQkJICBzeW1ib2wsCi0JCSAgZGF0YSwKLQkJICBpbnB1dF9zZWN0aW9uLAotCQkgIG91dHB1dF9iZmQsCi0JCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgc3RydWN0IG1pcHNfaGkgKm47Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwgdGhlbiBpdCBpcyBjb3JyZWN0Ci0gICAgIGluIHRoZSBvYmplY3QgZmlsZS4gIFRoZSBvbmx5IHRpbWUgd2Ugd2FudCB0byBjaGFuZ2UgdGhpcyBjYXNlIGlzCi0gICAgIHdoZW4gd2UgYXJlIHJlbGF4aW5nLCBhbmQgdGhhdCBpcyBoYW5kbGVkIGVudGlyZWx5IGJ5Ci0gICAgIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiBhbmQgbmV2ZXIgY2FsbHMgdGhpcyBmdW5jdGlvbi4gICovCi0gIGlmICgoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0JcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgSWYgd2UncmUgcmVsb2NhdGluZywgd2UgZG9uJ3Qgd2FudAotICAgICB0byBjaGFuZ2UgYW55dGhpbmcuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIHJldCA9IGJmZF9yZWxvY19vazsKLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0ID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBTYXZlIHRoZSBpbmZvcm1hdGlvbiwgYW5kIGxldCBSRUxMTyBkbyB0aGUgYWN0dWFsIHJlbG9jYXRpb24uICAqLwotICBuID0gKHN0cnVjdCBtaXBzX2hpICopIGJmZF9tYWxsb2MgKHNpemVvZiAqbik7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICBuLT5hZGRyID0gKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbi0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLSAgbi0+bmV4dCA9IG1pcHNfcmVsaGlfbGlzdDsKLSAgbWlwc19yZWxoaV9saXN0ID0gbjsKLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBEbyBhIFJFTExPIHJlbG9jYXRpb24uICBUaGlzIGlzIGEgc3RyYWlnaHRmb3J3YXJkIDE2IGJpdCBQQwotICAgcmVsYXRpdmUgcmVsb2NhdGlvbjsgdGhpcyBmdW5jdGlvbiBleGlzdHMgaW4gb3JkZXIgdG8gZG8gdGhlIFJFTEhJCi0gICByZWxvY2F0aW9uIGRlc2NyaWJlZCBhYm92ZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfcmVsbG9fcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAobWlwc19yZWxoaV9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG1pcHNfaGkgKmw7Ci0KLSAgICAgIGwgPSBtaXBzX3JlbGhpX2xpc3Q7Ci0gICAgICB3aGlsZSAobCAhPSBOVUxMKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKLQkgIHN0cnVjdCBtaXBzX2hpICpuZXh0OwotCi0JICAvKiBEbyB0aGUgUkVMSEkgcmVsb2NhdGlvbi4gIE5vdGUgdGhhdCB3ZSBhY3R1YWxseSBkb24ndAotCSAgICAgbmVlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBSRUxMTyBpdHNlbGYsIGV4Y2VwdAotCSAgICAgd2hlcmUgdG8gZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlCi0JICAgICBSRUxISS4gICovCi0JICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgbC0+YWRkcik7Ci0JICB2YWxsbyA9IChiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKQotCQkgICAmIDB4ZmZmZik7Ci0JICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOwotCSAgdmFsICs9IGwtPmFkZGVuZDsKLQotCSAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCBtYWtlIHZhbCBQQyByZWxhdGl2ZS4gIElmIHRoZQotCSAgICAgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcywgYmVjYXVzZQotCSAgICAgd2UgZG9uJ3Qgd2FudCB0aGUgdmFsdWUgaW4gdGhlIG9iamVjdCBmaWxlIHRvIGluY29ycG9yYXRlCi0JICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2MuICAqLwotCSAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bWJvbCkpCi0JICAgICAgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltYm9sKSkpCi0JICAgIHZhbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotCSAgLyogVGhlIGxvdyBvcmRlciAxNiBiaXRzIGFyZSBhbHdheXMgdHJlYXRlZCBhcyBhIHNpZ25lZAotCSAgICAgdmFsdWUuICBUaGVyZWZvcmUsIGEgbmVnYXRpdmUgdmFsdWUgaW4gdGhlIGxvdyBvcmRlciBiaXRzCi0JICAgICByZXF1aXJlcyBhbiBhZGp1c3RtZW50IGluIHRoZSBoaWdoIG9yZGVyIGJpdHMuICBXZSBuZWVkCi0JICAgICB0byBtYWtlIHRoaXMgYWRqdXN0bWVudCBpbiB0d28gd2F5czogb25jZSBmb3IgdGhlIGJpdHMgd2UKLQkgICAgIHRvb2sgZnJvbSB0aGUgZGF0YSwgYW5kIG9uY2UgZm9yIHRoZSBiaXRzIHdlIGFyZSBwdXR0aW5nCi0JICAgICBiYWNrIGluIHRvIHRoZSBkYXRhLiAgKi8KLQkgIGlmICgodmFsbG8gJiAweDgwMDApICE9IDApCi0JICAgIHZhbCAtPSAweDEwMDAwOwotCSAgaWYgKCh2YWwgJiAweDgwMDApICE9IDApCi0JICAgIHZhbCArPSAweDEwMDAwOwotCi0JICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICgodmFsID4+IDE2KSAmIDB4ZmZmZik7Ci0JICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBsLT5hZGRyKTsKLQotCSAgbmV4dCA9IGwtPm5leHQ7Ci0JICBmcmVlIChsKTsKLQkgIGwgPSBuZXh0OwotCX0KLQotICAgICAgbWlwc19yZWxoaV9saXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwgdGhlbiBpdCBpcyBjb3JyZWN0Ci0gICAgIGluIHRoZSBvYmplY3QgZmlsZS4gIFRoZSBvbmx5IHRpbWUgd2Ugd2FudCB0byBjaGFuZ2UgdGhpcyBjYXNlIGlzCi0gICAgIHdoZW4gd2UgYXJlIHJlbGF4aW5nLCBhbmQgdGhhdCBpcyBoYW5kbGVkIGVudGlyZWx5IGJ5Ci0gICAgIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiBhbmQgbmV2ZXIgY2FsbHMgdGhpcyBmdW5jdGlvbi4gICovCi0gIGlmICgoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0JcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZG9lcyBub3QgaGFuZGxlIHBjcmVsX29mZnNldCByZWxvY2F0aW9ucwotICAgICBjb3JyZWN0bHkgd2hlbiBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIGZpbGUsIHNvIGhhbmRsZSB0aGVtCi0gICAgIGRpcmVjdGx5IGhlcmUuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIE5vdyBkbyB0aGUgUkVMTE8gcmVsb2MgaW4gdGhlIHVzdWFsIHdheS4gICovCi0gIHJldHVybiBtaXBzX2dlbmVyaWNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKLX0KLQotLyogVGhpcyBpcyB0aGUgc3BlY2lhbCBmdW5jdGlvbiBmb3IgdGhlIE1JUFNfUl9TV0lUQ0ggcmVsb2MuICBUaGlzCi0gICBzcGVjaWFsIHJlbG9jIGlzIG5vcm1hbGx5IGNvcnJlY3QgaW4gdGhlIG9iamVjdCBmaWxlLCBhbmQgb25seQotICAgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZyB3aGVuIHJlbGF4aW5nLiAgV2UgZG9uJ3Qgd2FudAotICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiB0byB0YW1wZXIgd2l0aCBpdCBhdCBhbGwuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfc3dpdGNoX3JlbG9jIChhYmZkLAotCQkgICByZWxvY19lbnRyeSwKLQkJICAgc3ltYm9sLAotCQkgICBkYXRhLAotCQkgICBpbnB1dF9zZWN0aW9uLAotCQkgICBvdXRwdXRfYmZkLAotCQkgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogR2V0IHRoZSBob3d0byBzdHJ1Y3R1cmUgZm9yIGEgZ2VuZXJpYyByZWxvYyB0eXBlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIGludCBtaXBzX3R5cGU7Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUZIQUxGOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUZXT1JEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19KTVA6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfSk1QQUREUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUZISTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfUkVGTE87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0dQUkVMOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX0dQUkVMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX0xJVEVSQUw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9QQ1JFTDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUENSRUxfSEkxNl9TOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFTEhJOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUENSRUxfTE8xNjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUxMTzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0dQUkVMMzI6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfU1dJVENIOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gJm1pcHNfaG93dG9fdGFibGVbbWlwc190eXBlXTsKLX0KLQwKLS8qIEEgaGVscGVyIHJvdXRpbmUgZm9yIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiB3aGljaCBoYW5kbGVzIHRoZSBSRUZISQotICAgYW5kIFJFTEhJIHJlbG9jYXRpb25zLiAgVGhlIFJFRkhJIHJlbG9jYXRpb24gbXVzdCBiZSBmb2xsb3dlZCBieSBhCi0gICBSRUZMTyByZWxvY2F0aW9uIChhbmQgUkVMSEkgYnkgYSBSRUxMTyksIGFuZCB0aGUgYWRkZW5kIHVzZWQgaXMKLSAgIGZvcm1lZCBmcm9tIHRoZSBhZGRlbmRzIG9mIGJvdGggaW5zdHJ1Y3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfcmVsb2NhdGVfaGkgKHJlZmhpLCByZWZsbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgYWRqdXN0LAotCQkgIHJlbG9jYXRpb24sIHBjcmVsKQotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlZmhpOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlZmxvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc2l6ZV90IGFkanVzdDsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICBib29sZWFuIHBjcmVsOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotICB1bnNpZ25lZCBsb25nIHZhbGxvOwotCi0gIGlmIChyZWZoaSA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgCi0gIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCSAgICAgY29udGVudHMgKyBhZGp1c3QgKyByZWZoaS0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0gIGlmIChyZWZsbyA9PSBOVUxMKQotICAgIHZhbGxvID0gMDsKLSAgZWxzZQotICAgIHZhbGxvID0gKGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCSBjb250ZW50cyArIGFkanVzdCArIHJlZmxvLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKQotCSAgICAgJiAweGZmZmYpOwotIAotICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOwotICB2YWwgKz0gcmVsb2NhdGlvbjsKLQotICAvKiBUaGUgbG93IG9yZGVyIDE2IGJpdHMgYXJlIGFsd2F5cyB0cmVhdGVkIGFzIGEgc2lnbmVkIHZhbHVlLgotICAgICBUaGVyZWZvcmUsIGEgbmVnYXRpdmUgdmFsdWUgaW4gdGhlIGxvdyBvcmRlciBiaXRzIHJlcXVpcmVzIGFuCi0gICAgIGFkanVzdG1lbnQgaW4gdGhlIGhpZ2ggb3JkZXIgYml0cy4gIFdlIG5lZWQgdG8gbWFrZSB0aGlzCi0gICAgIGFkanVzdG1lbnQgaW4gdHdvIHdheXM6IG9uY2UgZm9yIHRoZSBiaXRzIHdlIHRvb2sgZnJvbSB0aGUgZGF0YSwKLSAgICAgYW5kIG9uY2UgZm9yIHRoZSBiaXRzIHdlIGFyZSBwdXR0aW5nIGJhY2sgaW4gdG8gdGhlIGRhdGEuICAqLwotICBpZiAoKHZhbGxvICYgMHg4MDAwKSAhPSAwKQotICAgIHZhbCAtPSAweDEwMDAwOwotCi0gIGlmIChwY3JlbCkKLSAgICB2YWwgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JICAgICsgKHJlZmxvLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hICsgYWRqdXN0KSk7Ci0KLSAgaWYgKCh2YWwgJiAweDgwMDApICE9IDApCi0gICAgdmFsICs9IDB4MTAwMDA7Ci0KLSAgaW5zbiA9IChpbnNuICZ+IDB4ZmZmZikgfCAoKHZhbCA+PiAxNikgJiAweGZmZmYpOwotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIChiZmRfdm1hKSBpbnNuLAotCSAgICAgIGNvbnRlbnRzICsgYWRqdXN0ICsgcmVmaGktPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotfQotCi0vKiBSZWxvY2F0ZSBhIHNlY3Rpb24gd2hpbGUgbGlua2luZyBhIE1JUFMgRUNPRkYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgIGNvbnRlbnRzLCBleHRlcm5hbF9yZWxvY3MpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzOwotewotICBhc2VjdGlvbiAqKnN5bW5keF90b19zZWN0aW9uOwotICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSBncDsKLSAgYm9vbGVhbiBncF91bmRlZmluZWQ7Ci0gIHNpemVfdCBhZGp1c3Q7Ci0gIGxvbmcgKm9mZnNldHM7Ci0gIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3JlbDsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsX2VuZDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJvb2xlYW4gZ290X2xvOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgbG9faW50X3JlbDsKLQotICBCRkRfQVNTRVJUIChpbnB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgotCSAgICAgID09IG91dHB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlcik7Ci0KLSAgLyogV2Uga2VlcCBhIHRhYmxlIG1hcHBpbmcgdGhlIHN5bW5keCBmb3VuZCBpbiBhbiBpbnRlcm5hbCByZWxvYyB0bwotICAgICB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbi4gIFRoaXMgaXMgZmFzdGVyIHRoYW4gbG9va2luZyB1cCB0aGUKLSAgICAgc2VjdGlvbiBieSBuYW1lIGVhY2ggdGltZS4gICovCi0gIHN5bW5keF90b19zZWN0aW9uID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+c3ltbmR4X3RvX3NlY3Rpb247Ci0gIGlmIChzeW1uZHhfdG9fc2VjdGlvbiA9PSAoYXNlY3Rpb24gKiopIE5VTEwpCi0gICAgewotICAgICAgc3ltbmR4X3RvX3NlY3Rpb24gPSAoKGFzZWN0aW9uICoqKQotCQkJICAgYmZkX2FsbG9jIChpbnB1dF9iZmQsCi0JCQkJICAgICAgKE5VTV9SRUxPQ19TRUNUSU9OUwotCQkJCSAgICAgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpKSk7Ci0gICAgICBpZiAoIXN5bW5keF90b19zZWN0aW9uKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9OT05FXSA9IE5VTEw7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1RFWFRdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnRleHQiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fUkRBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnJkYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0RBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmRhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fU0RBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnNkYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1NCU1NdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnNic3MiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fQlNTXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5ic3MiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fSU5JVF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuaW5pdCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9MSVQ4XSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5saXQ4Iik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVDRdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdDQiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fWERBVEFdID0gTlVMTDsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fUERBVEFdID0gTlVMTDsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fRklOSV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuZmluaSIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9MSVRBXSA9IE5VTEw7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0FCU10gPSBOVUxMOwotCi0gICAgICBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1uZHhfdG9fc2VjdGlvbiA9IHN5bW5keF90b19zZWN0aW9uOwotICAgIH0KLQotICBzeW1faGFzaGVzID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+c3ltX2hhc2hlczsKLQotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgaWYgKGdwID09IDApCi0gICAgZ3BfdW5kZWZpbmVkID0gdHJ1ZTsKLSAgZWxzZQotICAgIGdwX3VuZGVmaW5lZCA9IGZhbHNlOwotCi0gIGdvdF9sbyA9IGZhbHNlOwotCi0gIGFkanVzdCA9IDA7Ci0KLSAgaWYgKGVjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSA9PSBOVUxMKQotICAgIG9mZnNldHMgPSBOVUxMOwotICBlbHNlCi0gICAgb2Zmc2V0cyA9IGVjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKS0+b2Zmc2V0czsKLQotICBleHRfcmVsID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSBleHRlcm5hbF9yZWxvY3M7Ci0gIGV4dF9yZWxfZW5kID0gZXh0X3JlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKGkgPSAwOyBleHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGV4dF9yZWwrKywgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbnRfcmVsOwotICAgICAgYm9vbGVhbiB1c2VfbG8gPSBmYWxzZTsKLSAgICAgIGJmZF92bWEgYWRkZW5kOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSAgICAgIGFzZWN0aW9uICpzID0gTlVMTDsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICBpZiAoISBnb3RfbG8pCi0JbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIChpbnB1dF9iZmQsIChQVFIpIGV4dF9yZWwsICZpbnRfcmVsKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpbnRfcmVsID0gbG9faW50X3JlbDsKLQkgIGdvdF9sbyA9IGZhbHNlOwotCX0KLQotICAgICAgQkZEX0FTU0VSVCAoaW50X3JlbC5yX3R5cGUKLQkJICA8IHNpemVvZiBtaXBzX2hvd3RvX3RhYmxlIC8gc2l6ZW9mIG1pcHNfaG93dG9fdGFibGVbMF0pOwotCi0gICAgICAvKiBUaGUgUkVGSEkgYW5kIFJFTEhJIHJlbG9jcyByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nLiAgdGhleQotCSBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgUkVGTE8gb3IgUkVMTE8gcmVsb2MsIHJlc3BlY3RpdmVseSwgYW5kCi0JIHRoZSBhZGRlbmQgaXMgZm9ybWVkIGZyb20gYm90aCByZWxvY3MuICAqLwotICAgICAgaWYgKGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUZISQotCSAgfHwgaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKQotCXsKLQkgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqbG9fZXh0X3JlbDsKLQotCSAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCBwZXJtaXQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBSRUZISQotICAgICAgICAgICAgIG9yIFJFTEhJIHJlbG9jcyBiZWZvcmUgdGhlIFJFRkxPIG9yIFJFTExPIHJlbG9jLiAgVGhpcwotICAgICAgICAgICAgIHBlcm1pdHMgZ2NjIHRvIGVtaXQgdGhlIEhJIGFuZCBMTyByZWxvY3MgaXRzZWxmLiAgKi8KLQkgIGZvciAobG9fZXh0X3JlbCA9IGV4dF9yZWwgKyAxOwotCSAgICAgICBsb19leHRfcmVsIDwgZXh0X3JlbF9lbmQ7Ci0JICAgICAgIGxvX2V4dF9yZWwrKykKLQkgICAgewotCSAgICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoaW5wdXRfYmZkLCAoUFRSKSBsb19leHRfcmVsLAotCQkJCQkmbG9faW50X3JlbCk7Ci0JICAgICAgaWYgKGxvX2ludF9yZWwucl90eXBlICE9IGludF9yZWwucl90eXBlKQotCQlicmVhazsKLQkgICAgfQotCi0JICBpZiAobG9fZXh0X3JlbCA8IGV4dF9yZWxfZW5kCi0JICAgICAgJiYgKGxvX2ludF9yZWwucl90eXBlCi0JCSAgPT0gKGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUZISQotCQkgICAgICA/IE1JUFNfUl9SRUZMTwotCQkgICAgICA6IE1JUFNfUl9SRUxMTykpCi0JICAgICAgJiYgaW50X3JlbC5yX2V4dGVybiA9PSBsb19pbnRfcmVsLnJfZXh0ZXJuCi0JICAgICAgJiYgaW50X3JlbC5yX3N5bW5keCA9PSBsb19pbnRfcmVsLnJfc3ltbmR4KQotCSAgICB7Ci0JICAgICAgdXNlX2xvID0gdHJ1ZTsKLQkgICAgICBpZiAobG9fZXh0X3JlbCA9PSBleHRfcmVsICsgMSkKLQkJZ290X2xvID0gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgaG93dG8gPSAmbWlwc19ob3d0b190YWJsZVtpbnRfcmVsLnJfdHlwZV07Ci0KLSAgICAgIC8qIFRoZSBTV0lUQ0ggcmVsb2MgbXVzdCBiZSBoYW5kbGVkIHNwZWNpYWxseS4gIFRoaXMgcmVsb2MgaXMKLQkgbWFya3MgdGhlIGxvY2F0aW9uIG9mIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBwb3J0aW9ucyBvZiBhbgotCSBvYmplY3QgZmlsZS4gIFRoZSBzeW1ib2wgaW5kZXggZG9lcyBub3QgcmVmZXJlbmNlIGEgc3ltYm9sLAotCSBidXQgaXMgYWN0dWFsbHkgdGhlIG9mZnNldCBmcm9tIHRoZSByZWxvYyB0byB0aGUgc3VidHJhaGVuZAotCSBvZiB0aGUgZGlmZmVyZW5jZS4gIFRoaXMgcmVsb2MgaXMgY29ycmVjdCBpbiB0aGUgb2JqZWN0IGZpbGUsCi0JIGFuZCBuZWVkcyBubyBmdXJ0aGVyIGFkanVzdG1lbnQsIHVubGVzcyB3ZSBhcmUgcmVsYXhpbmcuICBJZgotCSB3ZSBhcmUgcmVsYXhpbmcsIHdlIG1heSBoYXZlIHRvIGFkZCBpbiBhbiBvZmZzZXQuICBTaW5jZSBubwotCSBzeW1ib2xzIGFyZSBpbnZvbHZlZCBpbiB0aGlzIHJlbG9jLCB3ZSBoYW5kbGUgaXQgY29tcGxldGVseQotCSBoZXJlLiAgKi8KLSAgICAgIGlmIChpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfU1dJVENIKQotCXsKLQkgIGlmIChvZmZzZXRzICE9IE5VTEwKLQkgICAgICAmJiBvZmZzZXRzW2ldICE9IDApCi0JICAgIHsKLQkgICAgICByID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwKLQkJCQkJICAoYmZkX3ZtYSkgb2Zmc2V0c1tpXSwKLQkJCQkJICAoY29udGVudHMKLQkJCQkJICAgKyBhZGp1c3QKLQkJCQkJICAgKyBpbnRfcmVsLnJfdmFkZHIKLQkJCQkJICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKLQkgICAgICBCRkRfQVNTRVJUIChyID09IGJmZF9yZWxvY19vayk7Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoaW50X3JlbC5yX2V4dGVybikKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tpbnRfcmVsLnJfc3ltbmR4XTsKLQkgIC8qIElmIGggaXMgTlVMTCwgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGlzIGEgcmVsb2MgYWdhaW5zdCBhbgotCSAgICAgZXh0ZXJuYWwgc3ltYm9sIHdoaWNoIHdlIHRob3VnaHQgd2FzIGp1c3QgYSBkZWJ1Z2dpbmcKLQkgICAgIHN5bWJvbC4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uICAqLwotCSAgaWYgKGggPT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkgICAgYWJvcnQgKCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChpbnRfcmVsLnJfc3ltbmR4IDwgMCB8fCBpbnRfcmVsLnJfc3ltbmR4ID49IE5VTV9SRUxPQ19TRUNUSU9OUykKLQkgICAgcyA9IE5VTEw7Ci0JICBlbHNlCi0JICAgIHMgPSBzeW1uZHhfdG9fc2VjdGlvbltpbnRfcmVsLnJfc3ltbmR4XTsKLQotCSAgaWYgKHMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogVGhlIEdQUkVMIHJlbG9jIHVzZXMgYW4gYWRkZW5kOiB0aGUgZGlmZmVyZW5jZSBpbiB0aGUgR1AKLQkgdmFsdWVzLiAgKi8KLSAgICAgIGlmIChpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfR1BSRUwKLQkgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9MSVRFUkFMKQotCWFkZGVuZCA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGdwX3VuZGVmaW5lZCkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQotCQkgICAgIChpbmZvLCBfKCJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gR1Agbm90IGRlZmluZWQiKSwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICBpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIC8qIE9ubHkgZ2l2ZSB0aGUgZXJyb3Igb25jZSBwZXIgbGluay4gICovCi0JICAgICAgZ3AgPSA0OwotCSAgICAgIF9iZmRfc2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkLCBncCk7Ci0JICAgICAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7Ci0JICAgIH0KLQkgIGlmICghIGludF9yZWwucl9leHRlcm4pCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIFRoZSBjdXJyZW50Ci0JCSBhZGRlbmQgaW4gdGhlIGluc3RydWN0aW9uIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLQkJIElOUFVUX1NFQ1RJT04tPnZtYSBhbmQgdGhlIEdQIHZhbHVlIG9mIElOUFVUX0JGRC4gIFdlCi0JCSBtdXN0IGNoYW5nZSB0aGlzIHRvIGJlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCi0JCSBmaW5hbCBkZWZpbml0aW9uICh3aGljaCB3aWxsIGVuZCB1cCBpbiBSRUxPQ0FUSU9OKQotCQkgYW5kIHRoZSBHUCB2YWx1ZSBvZiBPVVRQVVRfQkZEICh3aGljaCBpcyBpbiBHUCkuICAqLwotCSAgICAgIGFkZGVuZCA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwIC0gZ3A7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0JCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBkZWZpbmVkIHN5bWJvbC4gIFRoZQotCQkgY3VycmVudCBhZGRlbmQgaW4gdGhlIGluc3RydWN0aW9uIGlzIHNpbXBseSB0aGUKLQkJIGRlc2lyZWQgb2Zmc2V0IGludG8gdGhlIHN5bWJvbCAobm9ybWFsbHkgemVybykuICBXZQotCQkgYXJlIGdvaW5nIHRvIGNoYW5nZSB0aGlzIGludG8gYSByZWxvY2F0aW9uIGFnYWluc3QgYQotCQkgZGVmaW5lZCBzeW1ib2wsIHNvIHdlIHdhbnQgdGhlIGluc3RydWN0aW9uIHRvIGhvbGQKLQkJIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGZpbmFsIGRlZmluaXRpb24gb2YgdGhlCi0JCSBzeW1ib2wgKHdoaWNoIHdpbGwgZW5kIHVwIGluIFJFTE9DQVRJT04pIGFuZCB0aGUgR1AKLQkJIHZhbHVlIG9mIE9VVFBVVF9CRkQgKHdoaWNoIGlzIGluIEdQKS4gICovCi0JICAgICAgYWRkZW5kID0gLSBncDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhbiB1bmRlZmluZWQgb3IgY29tbW9uCi0JCSBzeW1ib2wuICBUaGUgY3VycmVudCBhZGRlbmQgaW4gdGhlIGluc3RydWN0aW9uIGlzCi0JCSBzaW1wbHkgdGhlIGRlc2lyZWQgb2Zmc2V0IGludG8gdGhlIHN5bWJvbCAobm9ybWFsbHkKLQkJIHplcm8pLiAgV2UgYXJlIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgYW5kIHdlCi0JCSBhcmVuJ3QgZ29pbmcgdG8gZGVmaW5lIHRoaXMgc3ltYm9sLCBzbyB3ZSBqdXN0IGxlYXZlCi0JCSB0aGUgaW5zdHJ1Y3Rpb24gYWxvbmUuICAqLwotCSAgICAgIGFkZGVuZCA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIHdlIGFyZSByZWxheGluZywgbWlwc19yZWxheF9zZWN0aW9uIG1heSBoYXZlIHNldAotCSBvZmZzZXRzW2ldIHRvIHNvbWUgdmFsdWUuICBBIHZhbHVlIG9mIDEgbWVhbnMgd2UgbXVzdCBleHBhbmQKLQkgYSBQQyByZWxhdGl2ZSBicmFuY2ggaW50byBhIG11bHRpLWluc3RydWN0aW9uIG9mIHNlcXVlbmNlLAotCSBhbmQgYW55IG90aGVyIHZhbHVlIGlzIGFuIGFkZGVuZC4gICovCi0gICAgICBpZiAob2Zmc2V0cyAhPSBOVUxMCi0JICAmJiBvZmZzZXRzW2ldICE9IDApCi0JewotCSAgQkZEX0FTU0VSVCAoISBpbmZvLT5yZWxvY2F0ZWFibGUpOwotCSAgQkZEX0FTU0VSVCAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1BDUkVMMTYKLQkJICAgICAgfHwgaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJCi0JCSAgICAgIHx8IGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUxMTyk7Ci0JICBpZiAob2Zmc2V0c1tpXSAhPSAxKQotCSAgICBhZGRlbmQgKz0gb2Zmc2V0c1tpXTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF9ieXRlICpoZXJlOwotCi0JICAgICAgQkZEX0FTU0VSVCAoaW50X3JlbC5yX2V4dGVybgotCQkJICAmJiBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUENSRUwxNik7Ci0KLQkgICAgICAvKiBNb3ZlIHRoZSByZXN0IG9mIHRoZSBpbnN0cnVjdGlvbnMgdXAuICAqLwotCSAgICAgIGhlcmUgPSAoY29udGVudHMKLQkJICAgICAgKyBhZGp1c3QKLQkJICAgICAgKyBpbnRfcmVsLnJfdmFkZHIKLQkJICAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCSAgICAgIG1lbW1vdmUgKGhlcmUgKyBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5ULCBoZXJlLAotCQkgICAgICAgKHNpemVfdCkgKGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZQotCQkJCSAtIChpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSk7Ci0JCSAgICAgICAKLQkgICAgICAvKiBHZW5lcmF0ZSB0aGUgbmV3IGluc3RydWN0aW9ucy4gICovCi0JICAgICAgaWYgKCEgbWlwc19yZWxheF9wY3JlbDE2IChpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCWgsIGhlcmUsCi0JCQkJCShpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCQkJICsgKGludF9yZWwucl92YWRkcgotCQkJCQkgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpCi0JCQkJCSArIGFkanVzdCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAvKiBXZSBtdXN0IGFkanVzdCBldmVyeXRoaW5nIGVsc2UgdXAgYSBub3RjaC4gICovCi0JICAgICAgYWRqdXN0ICs9IFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQ7Ci0KLQkgICAgICAvKiBtaXBzX3JlbGF4X3BjcmVsMTYgaGFuZGxlcyBhbGwgdGhlIGRldGFpbHMgb2YgdGhpcwotCQkgcmVsb2NhdGlvbi4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIHdlIGFyZSByZWxheGluZywgYW5kIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSAudGV4dAotCSBzZWdtZW50LCB3ZSBtYXkgbmVlZCB0byBhZGp1c3QgaXQgaWYgc29tZSBicmFuY2hlcyBoYXZlIGJlZW4KLQkgZXhwYW5kZWQuICBUaGUgcmVsb2MgdHlwZXMgd2hpY2ggYXJlIGxpa2VseSB0byBvY2N1ciBpbiB0aGUKLQkgLnRleHQgc2VjdGlvbiBhcmUgaGFuZGxlZCBlZmZpY2llbnRseSBieSBtaXBzX3JlbGF4X3NlY3Rpb24sCi0JIGFuZCB0aHVzIGRvIG5vdCBuZWVkIHRvIGJlIGhhbmRsZWQgaGVyZS4gICovCi0gICAgICBpZiAoZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZGVidWdfaW5mby5hZGp1c3QgIT0gTlVMTAotCSAgJiYgISBpbnRfcmVsLnJfZXh0ZXJuCi0JICAmJiBpbnRfcmVsLnJfc3ltbmR4ID09IFJFTE9DX1NFQ1RJT05fVEVYVAotCSAgJiYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiksCi0JCSAgICAgICIudGV4dCIpICE9IDAKLQkgICAgICB8fCAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1BDUkVMMTYKLQkJICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfU1dJVENICi0JCSAgJiYgaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJCi0JCSAgJiYgaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTExPKSkpCi0JewotCSAgYmZkX3ZtYSBhZHI7Ci0JICBzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICphOwotCi0JICAvKiBXZSBuZWVkIHRvIGdldCB0aGUgYWRkZW5kIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIHdlIG5lZWQKLQkgICAgIHRvIGFkanVzdCB0aGUgYWRkcmVzcy4gICovCi0JICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVGV09SRCk7Ci0KLQkgIGFkciA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCSAgICAoY29udGVudHMKLQkJCSAgICAgKyBhZGp1c3QKLQkJCSAgICAgKyBpbnRfcmVsLnJfdmFkZHIKLQkJCSAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKLQotCSAgZm9yIChhID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZGVidWdfaW5mby5hZGp1c3Q7Ci0JICAgICAgIGEgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTDsKLQkgICAgICAgYSA9IGEtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoYWRyID49IGEtPnN0YXJ0ICYmIGFkciA8IGEtPmVuZCkKLQkJYWRkZW5kICs9IGEtPmFkanVzdDsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBXZSBhcmUgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgbXVzdCBjb252ZXJ0Ci0JICAgICB0aGUgZXhpc3RpbmcgcmVsb2MuICAqLwotCSAgaWYgKGludF9yZWwucl9leHRlcm4pCi0JICAgIHsKLQkgICAgICBpZiAoKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJICAmJiAhIGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uKSkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICAvKiBUaGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSBvdXRwdXQuICBDb252ZXJ0Ci0JCSAgICAgdGhlIHJlbG9jIGZyb20gYmVpbmcgYWdhaW5zdCB0aGUgc3ltYm9sIHRvIGJlaW5nCi0JCSAgICAgYWdhaW5zdCB0aGUgc2VjdGlvbi4gICovCi0KLQkJICAvKiBDbGVhciB0aGUgcl9leHRlcm4gYml0LiAgKi8KLQkJICBpbnRfcmVsLnJfZXh0ZXJuID0gMDsKLQotCQkgIC8qIENvbXB1dGUgYSBuZXcgcl9zeW1uZHggdmFsdWUuICAqLwotCQkgIHMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkgICAgICAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCi0JCSAgaW50X3JlbC5yX3N5bW5keCA9IC0xOwotCQkgIHN3aXRjaCAobmFtZVsxXSkKLQkJICAgIHsKLQkJICAgIGNhc2UgJ2InOgotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLmJzcyIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9CU1M7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnZCc6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuZGF0YSIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9EQVRBOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2YnOgotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLmZpbmkiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fRklOSTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdpJzoKLQkJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5pbml0IikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0lOSVQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnbCc6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ4OwotCQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ0OwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3InOgotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJkYXRhIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1JEQVRBOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3MnOgotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NEQVRBOwotCQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TQlNTOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3QnOgotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnRleHQiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fVEVYVDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICAgIAotCQkgIGlmIChpbnRfcmVsLnJfc3ltbmR4ID09IC0xKQotCQkgICAgYWJvcnQgKCk7Ci0KLQkJICAvKiBBZGQgdGhlIHNlY3Rpb24gVk1BIGFuZCB0aGUgc3ltYm9sIHZhbHVlLiAgKi8KLQkJICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkrIHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIHMtPm91dHB1dF9vZmZzZXQpOwotCi0JCSAgLyogRm9yIGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiwgdGhlIG9iamVjdCBmaWxlCi0JCSAgICAgY3VycmVudGx5IGhvbGRzIGp1c3QgdGhlIGFkZGVuZC4gIFdlIG11c3QgYWRqdXN0Ci0JCSAgICAgYnkgdGhlIGFkZHJlc3MgdG8gZ2V0IHRoZSByaWdodCB2YWx1ZS4gICovCi0JCSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLQkJICAgIHsKLQkJICAgICAgcmVsb2NhdGlvbiAtPSBpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLQkJICAgICAgLyogSWYgd2UgYXJlIGNvbnZlcnRpbmcgYSBSRUxISSBvciBSRUxMTyByZWxvYwotCQkJIGZyb20gYmVpbmcgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wgdG8KLQkJCSBiZWluZyBhZ2FpbnN0IGEgc2VjdGlvbiwgd2UgbXVzdCBwdXQgYQotCQkJIHNwZWNpYWwgdmFsdWUgaW50byB0aGUgcl9vZmZzZXQgZmllbGQuICBUaGlzCi0JCQkgdmFsdWUgaXMgdGhlIG9sZCBhZGRlbmQuICBUaGUgcl9vZmZzZXQgZm9yCi0JCQkgYm90aCB0aGUgUkVMSEkgYW5kIFJFTExPIHJlbG9jcyBhcmUgdGhlIHNhbWUsCi0JCQkgYW5kIHdlIHNldCBib3RoIHdoZW4gd2Ugc2VlIFJFTEhJLiAgKi8KLQkJICAgICAgaWYgKGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUxISSkKLQkJCXsKLQkJCSAgbG9uZyBhZGRoaSwgYWRkbG87Ci0KLQkJCSAgYWRkaGkgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCQkJCSAgICAgIChjb250ZW50cwotCQkJCQkgICAgICAgKyBhZGp1c3QKLQkJCQkJICAgICAgICsgaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCQkJICBhZGRoaSAmPSAweGZmZmY7Ci0JCQkgIGlmIChhZGRoaSAmIDB4ODAwMCkKLQkJCSAgICBhZGRoaSAtPSAweDEwMDAwOwotCQkJICBhZGRoaSA8PD0gMTY7Ci0KLQkJCSAgaWYgKCEgdXNlX2xvKQotCQkJICAgIGFkZGxvID0gMDsKLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGFkZGxvID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJCQkJICAoY29udGVudHMKLQkJCQkJCSAgICsgYWRqdXN0Ci0JCQkJCQkgICArIGxvX2ludF9yZWwucl92YWRkcgotCQkJCQkJICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKLQkJCSAgICAgIGFkZGxvICY9IDB4ZmZmZjsKLQkJCSAgICAgIGlmIChhZGRsbyAmIDB4ODAwMCkKLQkJCQlhZGRsbyAtPSAweDEwMDAwOwotCi0JCQkgICAgICBsb19pbnRfcmVsLnJfb2Zmc2V0ID0gYWRkaGkgKyBhZGRsbzsKLQkJCSAgICB9Ci0KLQkJCSAgaW50X3JlbC5yX29mZnNldCA9IGFkZGhpICsgYWRkbG87Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBoID0gTlVMTDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIENoYW5nZSB0aGUgc3ltbmR4IHZhbHVlIHRvIHRoZSByaWdodCBvbmUgZm9yIHRoZQotCQkgICAgIG91dHB1dCBCRkQuICAqLwotCQkgIGludF9yZWwucl9zeW1uZHggPSBoLT5pbmR4OwotCQkgIGlmIChpbnRfcmVsLnJfc3ltbmR4ID09IC0xKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIHN5bWJvbCBpcyBub3QgYmVpbmcgd3JpdHRlbiBvdXQuICAqLwotCQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgaW50X3JlbC5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGludF9yZWwucl9zeW1uZHggPSAwOwotCQkgICAgfQotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgQWRqdXN0IHRoZQotCQkgdmFsdWUgYnkgdGhlIGFtb3VudCB0aGUgc2VjdGlvbiBtb3ZlZC4gICovCi0JICAgICAgcmVsb2NhdGlvbiA9IChzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgLSBzLT52bWEpOwotCSAgICB9Ci0KLQkgIHJlbG9jYXRpb24gKz0gYWRkZW5kOwotCSAgYWRkZW5kID0gMDsKLQotCSAgLyogQWRqdXN0IGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiBieSByZW1vdmluZyB0aGUgcmVmZXJlbmNlCi0JICAgICB0byB0aGUgb3JpZ2luYWwgYWRkcmVzcyBpbiB0aGUgc2VjdGlvbiBhbmQgaW5jbHVkaW5nIHRoZQotCSAgICAgcmVmZXJlbmNlIHRvIHRoZSBuZXcgYWRkcmVzcy4gIEhvd2V2ZXIsIGV4dGVybmFsIFJFTEhJCi0JICAgICBhbmQgUkVMTE8gcmVsb2NzIGFyZSBQQyByZWxhdGl2ZSwgYnV0IGRvbid0IGluY2x1ZGUgYW55Ci0JICAgICByZWZlcmVuY2UgdG8gdGhlIGFkZHJlc3MuICBUaGUgYWRkZW5kIGlzIG1lcmVseSBhbgotCSAgICAgYWRkZW5kLiAgKi8KLQkgIGlmIChob3d0by0+cGNfcmVsYXRpdmUKLQkgICAgICAmJiAoISBpbnRfcmVsLnJfZXh0ZXJuCi0JCSAgfHwgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxISQotCQkgICAgICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVMTE8pKSkKLQkgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkgIC8qIEFkanVzdCB0aGUgY29udGVudHMuICAqLwotCSAgaWYgKHJlbG9jYXRpb24gPT0gMCkKLQkgICAgciA9IGJmZF9yZWxvY19vazsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVGSEkKLQkJICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVMSEkpCi0JCXIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCQkgICAgKGNvbnRlbnRzCi0JCQkJCSAgICAgKyBhZGp1c3QKLQkJCQkJICAgICArIGludF9yZWwucl92YWRkcgotCQkJCQkgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbWlwc19yZWxvY2F0ZV9oaSAoJmludF9yZWwsCi0JCQkJICAgIHVzZV9sbyA/ICZsb19pbnRfcmVsIDogTlVMTCwKLQkJCQkgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQkgICAgYWRqdXN0LCByZWxvY2F0aW9uLAotCQkJCSAgICBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkpOwotCQkgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBBZGp1c3QgdGhlIHJlbG9jIGFkZHJlc3MuICAqLwotCSAgaW50X3JlbC5yX3ZhZGRyICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotCSAgLyogU2F2ZSB0aGUgY2hhbmdlZCByZWxvYyBpbmZvcm1hdGlvbi4gICovCi0JICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0IChpbnB1dF9iZmQsICZpbnRfcmVsLCAoUFRSKSBleHRfcmVsKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgYXJlIHByb2R1Y2luZyBhIGZpbmFsIGV4ZWN1dGFibGUuICAqLwotCSAgaWYgKGludF9yZWwucl9leHRlcm4pCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQl7Ci0JCSAgYXNlY3Rpb24gKmhzZWM7Ci0KLQkJICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgaHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgaHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCQkgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJCSAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgaW50X3JlbC5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uLiAgKi8KLQkgICAgICByZWxvY2F0aW9uID0gKHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICAtIHMtPnZtYSk7Ci0KLQkgICAgICAvKiBBIFBDIHJlbGF0aXZlIHJlbG9jIGlzIGFscmVhZHkgY29ycmVjdCBpbiB0aGUgb2JqZWN0Ci0JCSBmaWxlLiAgTWFrZSBpdCBsb29rIGxpa2UgYSBwY3JlbF9vZmZzZXQgcmVsb2NhdGlvbiBieQotCQkgYWRkaW5nIGluIHRoZSBzdGFydCBhZGRyZXNzLiAgKi8KLQkgICAgICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotCQl7Ci0JCSAgaWYgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxISSB8fCAhIHVzZV9sbykKLQkJICAgIHJlbG9jYXRpb24gKz0gaW50X3JlbC5yX3ZhZGRyICsgYWRqdXN0OwotCQkgIGVsc2UKLQkJICAgIHJlbG9jYXRpb24gKz0gbG9faW50X3JlbC5yX3ZhZGRyICsgYWRqdXN0OwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUZISQotCSAgICAgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxISSkKLQkgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sCi0JCQkJCSAgaW5wdXRfYmZkLAotCQkJCQkgIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgY29udGVudHMsCi0JCQkJCSAgKGludF9yZWwucl92YWRkcgotCQkJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYQotCQkJCQkgICArIGFkanVzdCksCi0JCQkJCSAgcmVsb2NhdGlvbiwKLQkJCQkJICBhZGRlbmQpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWlwc19yZWxvY2F0ZV9oaSAoJmludF9yZWwsCi0JCQkJdXNlX2xvID8gJmxvX2ludF9yZWwgOiBOVUxMLAotCQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIGFkanVzdCwKLQkJCQlyZWxvY2F0aW9uLAotCQkJCWludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUxISSk7Ci0JICAgICAgciA9IGJmZF9yZWxvY19vazsKLQkgICAgfQotCX0KLQotICAgICAgLyogTUlQU19SX0pNUEFERFIgcmVxdWlyZXMgcGVjdWxpYXIgb3ZlcmZsb3cgZGV0ZWN0aW9uLiAgVGhlCi0JIGluc3RydWN0aW9uIHByb3ZpZGVzIGEgMjggYml0IGFkZHJlc3MgKHRoZSB0d28gbG93ZXIgYml0cyBhcmUKLQkgaW1wbGljaXQgemVyb2VzKSB3aGljaCBpcyBjb21iaW5lZCB3aXRoIHRoZSB1cHBlciBmb3VyIGJpdHMKLQkgb2YgdGhlIGluc3RydWN0aW9uIGFkZHJlc3MuICAqLwotICAgICAgaWYgKHIgPT0gYmZkX3JlbG9jX29rCi0JICAmJiBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfSk1QQUREUgotCSAgJiYgKCgocmVsb2NhdGlvbgotCQkrIGFkZGVuZAotCQkrIChpbnRfcmVsLnJfZXh0ZXJuID8gMCA6IHMtPnZtYSkpCi0JICAgICAgICYgMHhmMDAwMDAwMCkKLQkgICAgICAhPSAoKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgKGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkKLQkJICAgKyBhZGp1c3QpCi0JCSAgJiAweGYwMDAwMDAwKSkpCi0JciA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJaWYgKGludF9yZWwucl9leHRlcm4pCi0JCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWVsc2UKLQkJICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzKTsKLQkJaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQlpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJlYWQgaW4gdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfcmVhZF9yZWxvY3MgKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKLQotICBzZWN0aW9uX3RkYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpOwotICBpZiAoc2VjdGlvbl90ZGF0YSA9PSAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgTlVMTCkKLSAgICB7Ci0gICAgICBzZWMtPnVzZWRfYnlfYmZkID0KLQkoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLSAgICAgIGlmIChzZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzZWN0aW9uX3RkYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpOwotICAgICAgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICAgIHNlY3Rpb25fdGRhdGEtPmNvbnRlbnRzID0gTlVMTDsKLSAgICAgIHNlY3Rpb25fdGRhdGEtPm9mZnNldHMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY3Nfc2l6ZTsKLQotICAgICAgZXh0ZXJuYWxfcmVsb2NzX3NpemUgPSAoZWNvZmZfYmFja2VuZCAoYWJmZCktPmV4dGVybmFsX3JlbG9jX3NpemUKLQkJCSAgICAgICogc2VjLT5yZWxvY19jb3VudCk7Ci0KLSAgICAgIHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jcyA9Ci0JKFBUUikgYmZkX2FsbG9jIChhYmZkLCBleHRlcm5hbF9yZWxvY3Nfc2l6ZSk7Ci0gICAgICBpZiAoc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgZXh0ZXJuYWxfcmVsb2NzX3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgIHx8IChiZmRfcmVhZCAoc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzLCAxLAotCQkJZXh0ZXJuYWxfcmVsb2NzX3NpemUsIGFiZmQpCi0JICAgICAgIT0gZXh0ZXJuYWxfcmVsb2NzX3NpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbGF4IGEgc2VjdGlvbiB3aGVuIGxpbmtpbmcgYSBNSVBTIEVDT0ZGIGZpbGUuICBUaGlzIGlzIHVzZWQgZm9yCi0gICBlbWJlZGRlZCBQSUMgY29kZSwgd2hpY2ggYWx3YXlzIHVzZXMgUEMgcmVsYXRpdmUgYnJhbmNoZXMgd2hpY2gKLSAgIG9ubHkgaGF2ZSBhbiAxOCBiaXQgcmFuZ2Ugb24gTUlQUy4gIElmIGEgYnJhbmNoIGlzIG5vdCBpbiByYW5nZSwgd2UKLSAgIGdlbmVyYXRlIGEgbG9uZyBpbnN0cnVjdGlvbiBzZXF1ZW5jZSB0byBjb21wZW5zYXRlLiAgRWFjaCB0aW1lIHdlCi0gICBmaW5kIGEgYnJhbmNoIHRvIGV4cGFuZCwgd2UgaGF2ZSB0byBjaGVjayBhbGwgdGhlIG90aGVycyBhZ2FpbiB0bwotICAgbWFrZSBzdXJlIHRoZXkgYXJlIHN0aWxsIGluIHJhbmdlLiAgVGhpcyBpcyBzbG93LCBidXQgaXQgb25seSBoYXMKLSAgIHRvIGJlIGRvbmUgd2hlbiAtcmVsYXggaXMgcGFzc2VkIHRvIHRoZSBsaW5rZXIuCi0KLSAgIFRoaXMgcm91dGluZSBmaWd1cmVzIG91dCB3aGljaCBicmFuY2hlcyBuZWVkIHRvIGV4cGFuZDsgdGhlIGFjdHVhbAotICAgZXhwYW5zaW9uIGlzIGRvbmUgaW4gbWlwc19yZWxvY2F0ZV9zZWN0aW9uIHdoZW4gdGhlIHNlY3Rpb24KLSAgIGNvbnRlbnRzIGFyZSByZWxvY2F0ZWQuICBUaGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSBvZmZzZXRzCi0gICBmaWVsZCBvZiB0aGUgZWNvZmZfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICBBbiBvZmZzZXQgb2YgMSBtZWFucwotICAgdGhhdCB0aGUgYnJhbmNoIG11c3QgYmUgZXhwYW5kZWQgaW50byBhIG11bHRpLWluc3RydWN0aW9uIFBDCi0gICByZWxhdGl2ZSBicmFuY2ggKHN1Y2ggYW4gb2Zmc2V0IHdpbGwgb25seSBvY2N1ciBmb3IgYSBQQyByZWxhdGl2ZQotICAgYnJhbmNoIHRvIGFuIGV4dGVybmFsIHN5bWJvbCkuICBBbnkgb3RoZXIgb2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZQotICAgb2YgZm91ciwgYW5kIGlzIHRoZSBhbW91bnQgdG8gY2hhbmdlIHRoZSBicmFuY2ggYnkgKHN1Y2ggYW4gb2Zmc2V0Ci0gICB3aWxsIG9ubHkgb2NjdXIgZm9yIGEgUEMgcmVsYXRpdmUgYnJhbmNoIHdpdGhpbiB0aGUgc2FtZSBzZWN0aW9uKS4KLQotICAgV2UgZG8gbm90IG1vZGlmeSB0aGUgc2VjdGlvbiByZWxvY3Mgb3IgY29udGVudHMgdGhlbXNlbHZlcyBzbyB0aGF0Ci0gICBpZiBtZW1vcnkgdXNhZ2UgYmVjb21lcyBhbiBpc3N1ZSB3ZSBjYW4gZGlzY2FyZCB0aGVtIGFuZCByZWFkIHRoZW0KLSAgIGFnYWluLiAgVGhlIG9ubHkgaW5mb3JtYXRpb24gd2UgbXVzdCBzYXZlIGluIG1lbW9yeSBiZXR3ZWVuIHRoaXMKLSAgIHJvdXRpbmUgYW5kIHRoZSBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gcm91dGluZSBpcyB0aGUgdGFibGUgb2YKLSAgIG9mZnNldHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19yZWxheF9zZWN0aW9uIChhYmZkLCBzZWMsIGluZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKnNlY3Rpb25fdGRhdGE7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGxvbmcgKm9mZnNldHM7Ci0gIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3JlbDsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsX2VuZDsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogQXNzdW1lIHdlIGFyZSBub3QgZ29pbmcgdG8gbmVlZCBhbm90aGVyIHBhc3MuICAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICAvKiBJZiB3ZSBhcmUgbm90IGdlbmVyYXRpbmcgYW4gRUNPRkYgZmlsZSwgdGhpcyBpcyBtdWNoIHRvbwotICAgICBjb25mdXNpbmcgdG8gZGVhbCB3aXRoLiAgKi8KLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgIT0gYmZkX2dldF9mbGF2b3VyIChhYmZkKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGVyZSBhcmUgbm8gcmVsb2NzLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAgKi8KLSAgaWYgKHNlYy0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIFBDIHJlbGF0aXZlIHJlbG9jcywgYW5kIHdoeSB3b3VsZCB0aGVyZQotICAgICBldmVyIGJlIG9uZSBmcm9tIGFueXRoaW5nIGJ1dCB0aGUgLnRleHQgc2VjdGlvbj8gICovCi0gIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLnRleHQiKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFJlYWQgaW4gdGhlIHJlbG9jcywgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGdvdCB0aGVtLiAgKi8KLSAgc2VjdGlvbl90ZGF0YSA9IGVjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKTsKLSAgaWYgKHNlY3Rpb25fdGRhdGEgPT0gKHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhICopIE5VTEwKLSAgICAgIHx8IHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIG1pcHNfcmVhZF9yZWxvY3MgKGFiZmQsIHNlYykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBzZWN0aW9uX3RkYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpOwotICAgIH0KLQotICBpZiAoc2VjLT5fY29va2VkX3NpemUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBXZSBtdXN0IGluaXRpYWxpemUgX2Nvb2tlZF9zaXplIG9ubHkgdGhlIGZpcnN0IHRpbWUgd2UgYXJlCi0JIGNhbGxlZC4gICovCi0gICAgICBzZWMtPl9jb29rZWRfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotICAgIH0KLQotICBjb250ZW50cyA9IHNlY3Rpb25fdGRhdGEtPmNvbnRlbnRzOwotICBvZmZzZXRzID0gc2VjdGlvbl90ZGF0YS0+b2Zmc2V0czsKLQotICAvKiBMb29rIGZvciBhbnkgZXh0ZXJuYWwgUEMgcmVsYXRpdmUgcmVsb2NzLiAgSW50ZXJuYWwgUEMgcmVsYXRpdmUKLSAgICAgcmVsb2NzIGFyZSBhbHJlYWR5IGNvcnJlY3QgaW4gdGhlIG9iamVjdCBmaWxlLCBzbyB0aGV5IGNlcnRhaW5seQotICAgICBjYW4gbm90IG92ZXJmbG93LiAgKi8KLSAgZXh0X3JlbCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzOwotICBleHRfcmVsX2VuZCA9IGV4dF9yZWwgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGkgPSAwOyBleHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGV4dF9yZWwrKywgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbnRfcmVsOwotICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGFzZWN0aW9uICpoc2VjOwotICAgICAgYmZkX3NpZ25lZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqYWRqX2V4dF9yZWw7Ci0gICAgICB1bnNpZ25lZCBpbnQgYWRqX2k7Ci0gICAgICB1bnNpZ25lZCBsb25nIGV4dF9jb3VudDsKLSAgICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiphZGpfaF9wdHI7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqYWRqX2hfcHRyX2VuZDsKLSAgICAgIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKmFkanVzdDsKLQotICAgICAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGV4cGFuZGVkIHRoaXMgcmVsb2MsIHdlIGNlcnRhaW5seSBkb24ndAotCSBuZWVkIHRvIGRvIGl0IGFnYWluLiAgKi8KLSAgICAgIGlmIChvZmZzZXRzICE9IChsb25nICopIE5VTEwgJiYgb2Zmc2V0c1tpXSA9PSAxKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBRdWlja2x5IGNoZWNrIHRoYXQgdGhpcyByZWxvYyBpcyBleHRlcm5hbCBQQ1JFTDE2LiAgKi8KLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotCXsKLQkgIGlmICgoZXh0X3JlbC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfRVhURVJOX0JJRykgPT0gMAotCSAgICAgIHx8ICgoKGV4dF9yZWwtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1RZUEVfQklHKQotCQkgICA+PiBSRUxPQ19CSVRTM19UWVBFX1NIX0JJRykKLQkJICAhPSBNSVBTX1JfUENSRUwxNikpCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKGV4dF9yZWwtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX0VYVEVSTl9MSVRUTEUpID09IDAKLQkgICAgICB8fCAoKChleHRfcmVsLT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19UWVBFX0xJVFRMRSkKLQkJICAgPj4gUkVMT0NfQklUUzNfVFlQRV9TSF9MSVRUTEUpCi0JCSAgIT0gTUlQU19SX1BDUkVMMTYpKQotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKFBUUikgZXh0X3JlbCwgJmludF9yZWwpOwotCi0gICAgICBoID0gZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9oYXNoZXNbaW50X3JlbC5yX3N5bW5keF07Ci0gICAgICBpZiAoaCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCWFib3J0ICgpOwotCi0gICAgICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQl7Ci0JICAvKiBKdXN0IGlnbm9yZSB1bmRlZmluZWQgc3ltYm9scy4gIFRoZXNlIHdpbGwgcHJlc3VtYWJseQotCSAgICAgZ2VuZXJhdGUgYW4gZXJyb3IgbGF0ZXIgaW4gdGhlIGxpbmsuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICAqLwotICAgICAgaHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGhzZWMtPm91dHB1dF9vZmZzZXQpOwotCi0gICAgICAvKiBTdWJ0cmFjdCBvdXQgdGhlIGN1cnJlbnQgYWRkcmVzcy4gICovCi0gICAgICByZWxvY2F0aW9uIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgKGludF9yZWwucl92YWRkciAtIHNlYy0+dm1hKSk7Ci0KLSAgICAgIC8qIFRoZSBhZGRlbmQgaXMgc3RvcmVkIGluIHRoZSBvYmplY3QgZmlsZS4gIEluIHRoZSBub3JtYWwgY2FzZQotCSBvZiBgYGJhbCBzeW1ib2wnJywgdGhlIGFkZGVuZCB3aWxsIGJlIC00LiAgSXQgd2lsbCBvbmx5IGJlCi0JIGRpZmZlcmVudCBpbiB0aGUgY2FzZSBvZiBgYGJhbCBzeW1ib2wrY29uc3RhbnQnJy4gIFRvIGF2b2lkCi0JIGFsd2F5cyByZWFkaW5nIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCB3ZSBkb24ndCBjaGVjayB0aGUKLQkgYWRkZW5kIGluIHRoZSBvYmplY3QgZmlsZSAod2UgY291bGQgZWFzaWx5IGNoZWNrIHRoZSBjb250ZW50cwotCSBpZiB3ZSBoYXBwZW4gdG8gaGF2ZSBhbHJlYWR5IHJlYWQgdGhlbSBpbiwgYnV0IEkgZmVhciB0aGF0Ci0JIHRoaXMgY291bGQgYmUgY29uZnVzaW5nKS4gIFRoaXMgbWVhbnMgd2Ugd2lsbCBzY3JldyB1cCBpZgotCSB0aGVyZSBpcyBhIGJyYW5jaCB0byBhIHN5bWJvbCB0aGF0IGlzIGluIHJhbmdlLCBidXQgYWRkZWQgdG8KLQkgYSBjb25zdGFudCB3aGljaCBwdXRzIGl0IG91dCBvZiByYW5nZTsgaW4gc3VjaCBhIGNhc2UgdGhlCi0JIGxpbmsgd2lsbCBmYWlsIHdpdGggYSByZWxvYyBvdmVyZmxvdyBlcnJvci4gIFNpbmNlIHRoZQotCSBjb21waWxlciB3aWxsIG5ldmVyIGdlbmVyYXRlIHN1Y2ggY29kZSwgaXQgc2hvdWxkIGJlIGVhc3kKLQkgZW5vdWdoIHRvIHdvcmsgYXJvdW5kIGl0IGJ5IGNoYW5naW5nIHRoZSBhc3NlbWJseSBjb2RlIGluIHRoZQotCSBzb3VyY2UgZmlsZS4gICovCi0gICAgICByZWxvY2F0aW9uIC09IDQ7Ci0KLSAgICAgIC8qIE5vdyBSRUxPQ0FUSU9OIGlzIHRoZSBudW1iZXIgd2Ugd2FudCB0byBwdXQgaW4gdGhlIG9iamVjdAotCSBmaWxlLiAgU2VlIHdoZXRoZXIgaXQgZml0cy4gICovCi0gICAgICBpZiAocmVsb2NhdGlvbiA+PSAtMHgyMDAwMCAmJiByZWxvY2F0aW9uIDwgMHgyMDAwMCkKLQljb250aW51ZTsKLQotICAgICAgLyogTm93IHRoYXQgd2Uga25vdyB0aGlzIHJlbG9jIG5lZWRzIHdvcmssIHdoaWNoIHdpbGwgcmFyZWx5Ci0JIGhhcHBlbiwgZ28gYWhlYWQgYW5kIGdyYWIgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IChiZmRfYnl0ZSAqKSBOVUxMKQotCXsKLQkgIGlmIChpbmZvLT5rZWVwX21lbW9yeSkKLQkgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBzZWMtPl9yYXdfc2l6ZSk7Ci0JICBlbHNlCi0JICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKChzaXplX3QpIHNlYy0+X3Jhd19zaXplKTsKLQkgIGlmIChjb250ZW50cyA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgKFBUUikgY29udGVudHMsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKGluZm8tPmtlZXBfbWVtb3J5KQotCSAgICBzZWN0aW9uX3RkYXRhLT5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLQotICAgICAgLyogV2Ugb25seSBzdXBwb3J0IGNoYW5naW5nIHRoZSBiYWwgaW5zdHJ1Y3Rpb24uICBJdCB3b3VsZCBiZQotCSBwb3NzaWJsZSB0byBoYW5kbGUgb3RoZXIgUEMgcmVsYXRpdmUgYnJhbmNoZXMsIGJ1dCBzb21lIG9mCi0JIHRoZW0gKHRoZSBjb25kaXRpb25hbCBicmFuY2hlcykgd291bGQgcmVxdWlyZSBhIGRpZmZlcmVudAotCSBsZW5ndGggaW5zdHJ1Y3Rpb24gc2VxdWVuY2Ugd2hpY2ggd291bGQgY29tcGxpY2F0ZSBib3RoIHRoaXMKLQkgcm91dGluZSBhbmQgbWlwc19yZWxheF9wY3JlbDE2LiAgSXQgY291bGQgYmUgd3JpdHRlbiBpZgotCSBzb21lYm9keSBmZWx0IGl0IHdlcmUgaW1wb3J0YW50LiAgSWdub3JpbmcgdGhpcyByZWxvYyB3aWxsCi0JIHByZXN1bWFibHkgY2F1c2UgYSByZWxvYyBvdmVyZmxvdyBlcnJvciBsYXRlciBvbi4gICovCi0gICAgICBpZiAoYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyBpbnRfcmVsLnJfdmFkZHIgLSBzZWMtPnZtYSkKLQkgICE9IDB4MDQxMWZmZmYpIC8qIGJnZXphbCAkMCwuID09IGJhbCAuICovCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEJvdGhlci4gIFdlIG5lZWQgdG8gZXhwYW5kIHRoaXMgcmVsb2MsIGFuZCB3ZSB3aWxsIG5lZWQgdG8KLQkgbWFrZSBhbm90aGVyIHJlbGF4YXRpb24gcGFzcyBzaW5jZSB0aGlzIGNoYW5nZSBtYXkgcHV0IG90aGVyCi0JIHJlbG9jcyBvdXQgb2YgcmFuZ2UuICBXZSBuZWVkIHRvIGV4YW1pbmUgdGhlIGxvY2FsIGJyYW5jaGVzCi0JIGFuZCB3ZSBuZWVkIHRvIGFsbG9jYXRlIG1lbW9yeSB0byBob2xkIHRoZSBvZmZzZXRzIHdlIG11c3QKLQkgYWRkIHRvIHRoZW0uICBXZSBhbHNvIG5lZWQgdG8gYWRqdXN0IHRoZSB2YWx1ZXMgb2YgYWxsCi0JIHN5bWJvbHMgaW4gdGhlIG9iamVjdCBmaWxlIGZvbGxvd2luZyB0aGlzIGxvY2F0aW9uLiAgKi8KLQotICAgICAgc2VjLT5fY29va2VkX3NpemUgKz0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLSAgICAgICphZ2FpbiA9IHRydWU7Ci0KLSAgICAgIGlmIChvZmZzZXRzID09IChsb25nICopIE5VTEwpCi0JewotCSAgc2l6ZV90IHNpemU7Ci0KLQkgIHNpemUgPSBzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChsb25nKTsKLQkgIG9mZnNldHMgPSAobG9uZyAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotCSAgaWYgKG9mZnNldHMgPT0gKGxvbmcgKikgTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBtZW1zZXQgKG9mZnNldHMsIDAsIHNpemUpOwotCSAgc2VjdGlvbl90ZGF0YS0+b2Zmc2V0cyA9IG9mZnNldHM7Ci0JfQotCi0gICAgICBvZmZzZXRzW2ldID0gMTsKLQotICAgICAgLyogTm93IGxvb2sgZm9yIGFsbCBQQyByZWxhdGl2ZSByZWZlcmVuY2VzIHRoYXQgY3Jvc3MgdGhpcyByZWxvYwotCSBhbmQgYWRqdXN0IHRoZWlyIG9mZnNldHMuICAqLwotICAgICAgYWRqX2V4dF9yZWwgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jczsKLSAgICAgIGZvciAoYWRqX2kgPSAwOyBhZGpfZXh0X3JlbCA8IGV4dF9yZWxfZW5kOyBhZGpfZXh0X3JlbCsrLCBhZGpfaSsrKQotCXsKLQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBhZGpfaW50X3JlbDsKLQkgIGJmZF92bWEgc3RhcnQsIHN0b3A7Ci0JICBpbnQgY2hhbmdlOwotCi0JICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChQVFIpIGFkal9leHRfcmVsLCAmYWRqX2ludF9yZWwpOwotCi0JICBpZiAoYWRqX2ludF9yZWwucl90eXBlID09IE1JUFNfUl9QQ1JFTDE2KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotCi0JICAgICAgLyogV2Ugb25seSBjYXJlIGFib3V0IGxvY2FsIHJlZmVyZW5jZXMuICBFeHRlcm5hbCBvbmVzCi0JCSB3aWxsIGJlIHJlbG9jYXRlZCBjb3JyZWN0bHkgYW55aG93LiAgKi8KLQkgICAgICBpZiAoYWRqX2ludF9yZWwucl9leHRlcm4pCi0JCWNvbnRpbnVlOwotCi0JICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBhIFBDIHJlbGF0aXZlIHJlbG9jIHdpdGhpbgotCQkgdGhpcyBzZWN0aW9uLiAgRklYTUU6IENyb3NzIHNlY3Rpb24gUEMgcmVsYXRpdmUKLQkJIHJlbG9jcyBtYXkgbm90IGJlIGhhbmRsZWQgY29ycmVjdGx5OyBkb2VzIGFueWJvZHkKLQkJIGNhcmU/ICAqLwotCSAgICAgIGlmIChhZGpfaW50X3JlbC5yX3N5bW5keCAhPSBSRUxPQ19TRUNUSU9OX1RFWFQpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgc3RhcnQgPSBhZGpfaW50X3JlbC5yX3ZhZGRyOwotCi0JICAgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsCi0JCQkJIGNvbnRlbnRzICsgYWRqX2ludF9yZWwucl92YWRkciAtIHNlYy0+dm1hKTsKLQotCSAgICAgIHN0b3AgPSAoaW5zbiAmIDB4ZmZmZikgPDwgMjsKLQkgICAgICBpZiAoKHN0b3AgJiAweDIwMDAwKSAhPSAwKQotCQlzdG9wIC09IDB4NDAwMDA7Ci0JICAgICAgc3RvcCArPSBhZGpfaW50X3JlbC5yX3ZhZGRyICsgNDsKLQkgICAgfQotCSAgZWxzZSBpZiAoYWRqX2ludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUxISSkKLQkgICAgewotCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyByZWxsbzsKLQkgICAgICBsb25nIGFkZGhpLCBhZGRsbzsKLQotCSAgICAgIC8qIFRoZSBuZXh0IHJlbG9jIG11c3QgYmUgTUlQU19SX1JFTExPLCBhbmQgd2UgaGFuZGxlCi0JCSB0aGVtIHRvZ2V0aGVyLiAgKi8KLQkgICAgICBCRkRfQVNTRVJUIChhZGpfZXh0X3JlbCArIDEgPCBleHRfcmVsX2VuZCk7Ci0KLQkgICAgICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChQVFIpIChhZGpfZXh0X3JlbCArIDEpLCAmcmVsbG8pOwotCi0JICAgICAgQkZEX0FTU0VSVCAocmVsbG8ucl90eXBlID09IE1JUFNfUl9SRUxMTyk7Ci0JICAgICAgCi0JICAgICAgYWRkaGkgPSBiZmRfZ2V0XzMyIChhYmZkLAotCQkJCSAgIGNvbnRlbnRzICsgYWRqX2ludF9yZWwucl92YWRkciAtIHNlYy0+dm1hKTsKLQkgICAgICBhZGRoaSAmPSAweGZmZmY7Ci0JICAgICAgaWYgKGFkZGhpICYgMHg4MDAwKQotCQlhZGRoaSAtPSAweDEwMDAwOwotCSAgICAgIGFkZGhpIDw8PSAxNjsKLQotCSAgICAgIGFkZGxvID0gYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyByZWxsby5yX3ZhZGRyIC0gc2VjLT52bWEpOwotCSAgICAgIGFkZGxvICY9IDB4ZmZmZjsKLQkgICAgICBpZiAoYWRkbG8gJiAweDgwMDApCi0JCWFkZGxvIC09IDB4MTAwMDA7Ci0KLQkgICAgICBpZiAoYWRqX2ludF9yZWwucl9leHRlcm4pCi0JCXsKLQkJICAvKiBUaGUgdmFsdWUgd2Ugd2FudCBoZXJlIGlzCi0JCSAgICAgICBzeW0gLSBSRUxMT2FkZHIgKyBhZGRlbmQKLQkJICAgICB3aGljaCB3ZSBjYW4gZXhwcmVzcyBhcwotCQkgICAgICAgc3ltIC0gKFJFTExPYWRkciAtIGFkZGVuZCkKLQkJICAgICBUaGVyZWZvcmUgaWYgd2UgYXJlIGV4cGFuZGluZyB0aGUgYXJlYSBiZXR3ZWVuCi0JCSAgICAgUkVMTE9hZGRyIGFuZCBSRUxMT2FkZHIgLSBhZGRlbmQgd2UgbXVzdCBhZGp1c3QKLQkJICAgICB0aGUgYWRkZW5kLiAgVGhpcyBpcyBhZG1pdHRlZGx5IGFtYmlndW91cywgc2luY2UKLQkJICAgICB3ZSBtaWdodCBtZWFuIChzeW0gKyBhZGRlbmQpIC0gUkVMTE9hZGRyLCBidXQgaW4KLQkJICAgICBwcmFjdGljZSB3ZSBkb24ndCwgYW5kIHRoZXJlIGlzIG5vIHdheSB0byBoYW5kbGUKLQkJICAgICB0aGF0IGNhc2UgY29ycmVjdGx5IHNpbmNlIGF0IHRoaXMgcG9pbnQgd2UgaGF2ZQotCQkgICAgIG5vIGlkZWEgd2hldGhlciBhbnkgcmVsb2MgaXMgYmVpbmcgZXhwYW5kZWQKLQkJICAgICBiZXR3ZWVuIHN5bSBhbmQgc3ltICsgYWRkZW5kLiAgKi8KLQkJICBzdGFydCA9IHJlbGxvLnJfdmFkZHIgLSAoYWRkaGkgKyBhZGRsbyk7Ci0JCSAgc3RvcCA9IHJlbGxvLnJfdmFkZHI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBBbiBpbnRlcm5hbCBSRUxISS9SRUxMTyBwYWlyIHJlcHJlc2VudHMgdGhlCi0JCSAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBhZGRyZXNzZXMsICRMQzAgLSBmb28uCi0JCSAgICAgVGhlIHN5bW5keCB2YWx1ZSBpcyBhY3R1YWxseSB0aGUgZGlmZmVyZW5jZQotCQkgICAgIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kICRMQzAuICBUaGlzIGxldHMgdXMKLQkJICAgICBjb21wdXRlICRMQzAsIGFuZCwgYnkgY29uc2lkZXJpbmcgdGhlIGFkZGVuZCwKLQkJICAgICBmb28uICBJZiB0aGUgcmVsb2Mgd2UgYXJlIGV4cGFuZGluZyBmYWxscyBiZXR3ZWVuCi0JCSAgICAgdGhvc2UgdHdvIHJlbG9jcywgd2UgbXVzdCBhZGp1c3QgdGhlIGFkZGVuZC4gIEF0Ci0JCSAgICAgdGhpcyBwb2ludCwgdGhlIHN5bW5keCB2YWx1ZSBpcyBhY3R1YWxseSBpbiB0aGUKLQkJICAgICByX29mZnNldCBmaWVsZCwgd2hlcmUgaXQgd2FzIHB1dCBieQotCQkgICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbi4gICovCi0JCSAgc3RhcnQgPSByZWxsby5yX3ZhZGRyIC0gYWRqX2ludF9yZWwucl9vZmZzZXQ7Ci0JCSAgc3RvcCA9IHN0YXJ0ICsgYWRkaGkgKyBhZGRsbzsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChhZGpfaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1NXSVRDSCkKLQkgICAgewotCSAgICAgIC8qIEEgTUlQU19SX1NXSVRDSCByZWxvYyByZXByZXNlbnRzIGEgd29yZCBvZiB0aGUgZm9ybQotCQkgICAud29yZCAkTDMtJExTMTIKLQkJIFRoZSB2YWx1ZSBpbiB0aGUgb2JqZWN0IGZpbGUgaXMgY29ycmVjdCwgYXNzdW1pbmcgdGhlCi0JCSBvcmlnaW5hbCB2YWx1ZSBvZiAkTDMuICBUaGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5Ci0JCSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZWxvYyBhZGRyZXNzIGFuZCAkTFMxMi4KLQkJIFRoaXMgbGV0cyB1cyBjb21wdXRlIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiAkTFMxMiBhcwotCQkgICB2YWRkciAtIHN5bW5keAotCQkgYW5kIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiAkTDMgYXMKLQkJICAgdmFkZHIgLSBzeW1uZHggKyBhZGRlbmQKLQkJIHdoZXJlIGFkZGVuZCBpcyB0aGUgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IGZpbGUuICBBdAotCQkgdGhpcyBwb2ludCwgdGhlIHN5bW5keCB2YWx1ZSBpcyBhY3R1YWxseSBmb3VuZCBpbiB0aGUKLQkJIHJfb2Zmc2V0IGZpZWxkLCBzaW5jZSBpdCB3YXMgbW92ZWQgYnkKLQkJIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbi4gICovCi0JICAgICAgc3RhcnQgPSBhZGpfaW50X3JlbC5yX3ZhZGRyIC0gYWRqX2ludF9yZWwucl9vZmZzZXQ7Ci0JICAgICAgc3RvcCA9IHN0YXJ0ICsgYmZkX2dldF8zMiAoYWJmZCwKLQkJCQkJIChjb250ZW50cwotCQkJCQkgICsgYWRqX2ludF9yZWwucl92YWRkcgotCQkJCQkgIC0gc2VjLT52bWEpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBjb250aW51ZTsKLQotCSAgLyogSWYgdGhlIHJhbmdlIGV4cHJlc3NlZCBieSB0aGlzIHJlbG9jLCB3aGljaCBpcyB0aGUKLQkgICAgIGRpc3RhbmNlIGJldHdlZW4gU1RBUlQgYW5kIFNUT1AgY3Jvc3NlcyB0aGUgcmVsb2Mgd2UgYXJlCi0JICAgICBleHBhbmRpbmcsIHdlIG11c3QgYWRqdXN0IHRoZSBvZmZzZXQuICBUaGUgc2lnbiBvZiB0aGUKLQkgICAgIGFkanVzdG1lbnQgZGVwZW5kcyB1cG9uIHRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdGhlIHJhbmdlCi0JICAgICBjcm9zc2VzIHRoZSByZWxvYyBiZWluZyBleHBhbmRlZC4gICovCi0JICBpZiAoc3RhcnQgPD0gaW50X3JlbC5yX3ZhZGRyICYmIHN0b3AgPiBpbnRfcmVsLnJfdmFkZHIpCi0JICAgIGNoYW5nZSA9IFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQ7Ci0JICBlbHNlIGlmIChzdGFydCA+IGludF9yZWwucl92YWRkciAmJiBzdG9wIDw9IGludF9yZWwucl92YWRkcikKLQkgICAgY2hhbmdlID0gLSBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5UOwotCSAgZWxzZQotCSAgICBjaGFuZ2UgPSAwOwotCi0JICBvZmZzZXRzW2Fkal9pXSArPSBjaGFuZ2U7Ci0KLQkgIGlmIChhZGpfaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKQotCSAgICB7Ci0JICAgICAgYWRqX2V4dF9yZWwrKzsKLQkgICAgICBhZGpfaSsrOwotCSAgICAgIG9mZnNldHNbYWRqX2ldICs9IGNoYW5nZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogRmluZCBhbGwgc3ltYm9scyBpbiB0aGlzIHNlY3Rpb24gZGVmaW5lZCBieSB0aGlzIG9iamVjdCBmaWxlCi0JIGFuZCBhZGp1c3QgdGhlaXIgdmFsdWVzLiAgTm90ZSB0aGF0IHdlIGRlY2lkZSB3aGV0aGVyIHRvCi0JIGFkanVzdCB0aGUgdmFsdWUgYmFzZWQgb24gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgRUNPRkYgRVhUUgotCSBzdHJ1Y3R1cmUsIGJlY2F1c2UgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgaGFzaCB0YWJsZSBtYXkKLQkgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgYW4gZWFybGllciBleHBhbmRlZCByZWxvYyBhbmQgdGh1cyBtYXkKLQkgbm8gbG9uZ2VyIGNvcnJlY3RseSBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBzeW1ib2wgaXMgYmVmb3JlIG9yCi0JIGFmdGVyIHRoZSBleHBhbmRlZCByZWxvYy4gICovCi0gICAgICBleHRfY291bnQgPSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heDsKLSAgICAgIGFkal9oX3B0ciA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1faGFzaGVzOwotICAgICAgYWRqX2hfcHRyX2VuZCA9IGFkal9oX3B0ciArIGV4dF9jb3VudDsKLSAgICAgIGZvciAoOyBhZGpfaF9wdHIgPCBhZGpfaF9wdHJfZW5kOyBhZGpfaF9wdHIrKykKLQl7Ci0JICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICphZGpfaDsKLQotCSAgYWRqX2ggPSAqYWRqX2hfcHRyOwotCSAgaWYgKGFkal9oICE9IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgICAmJiAoYWRqX2gtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBhZGpfaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgICAmJiBhZGpfaC0+cm9vdC51LmRlZi5zZWN0aW9uID09IHNlYwotCSAgICAgICYmIGFkal9oLT5lc3ltLmFzeW0udmFsdWUgPiBpbnRfcmVsLnJfdmFkZHIpCi0JICAgIGFkal9oLT5yb290LnUuZGVmLnZhbHVlICs9IFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQ7Ci0JfQotCi0gICAgICAvKiBBZGQgYW4gZW50cnkgdG8gdGhlIHN5bWJvbCB2YWx1ZSBhZGp1c3QgbGlzdC4gIFRoaXMgaXMgdXNlZAotCSBieSBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSB0byBhZGp1c3QgdGhlIHZhbHVlcyBvZgotCSBpbnRlcm5hbCBzeW1ib2xzIGFuZCBGRFIncy4gICovCi0gICAgICBhZGp1c3QgPSAoKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikKLQkJYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QpKSk7Ci0gICAgICBpZiAoYWRqdXN0ID09IChzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICopIE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGFkanVzdC0+c3RhcnQgPSBpbnRfcmVsLnJfdmFkZHI7Ci0gICAgICBhZGp1c3QtPmVuZCA9IHNlYy0+dm1hICsgc2VjLT5fcmF3X3NpemU7Ci0gICAgICBhZGp1c3QtPmFkanVzdCA9IFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQ7Ci0KLSAgICAgIGFkanVzdC0+bmV4dCA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmFkanVzdDsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmFkanVzdCA9IGFkanVzdDsKLSAgICB9Ci0KLSAgaWYgKGNvbnRlbnRzICE9IChiZmRfYnl0ZSAqKSBOVUxMICYmICEgaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZnJlZSAoY29udGVudHMpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoY29udGVudHMgIT0gKGJmZF9ieXRlICopIE5VTEwgJiYgISBpbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiB3aGVuIGEgUEMKLSAgIHJlbGF0aXZlIHJlbG9jIG11c3QgYmUgZXhwYW5kZWQgaW50byB0aGUgZml2ZSBpbnN0cnVjdGlvbiBzZXF1ZW5jZS4KLSAgIEl0IGhhbmRsZXMgYWxsIHRoZSBkZXRhaWxzIG9mIHRoZSBleHBhbnNpb24sIGluY2x1ZGluZyByZXNvbHZpbmcKLSAgIHRoZSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX3JlbGF4X3BjcmVsMTYgKGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgaCwgbG9jYXRpb24sIGFkZHJlc3MpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGJmZF9ieXRlICpsb2NhdGlvbjsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgLyogMHgwNDExZmZmZiBpcyBiZ2V6YWwgJDAsLiA9PSBiYWwgLiAgKi8KLSAgQkZEX0FTU0VSVCAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2NhdGlvbikgPT0gMHgwNDExZmZmZik7Ci0KLSAgLyogV2UgbmVlZCB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2wgYW5kIHRoZQotICAgICBjdXJyZW50IGFkZHJlc3MgcGx1cyBlaWdodC4gICovCi0gIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gIHJlbG9jYXRpb24gLT0gYWRkcmVzcyArIDg7Ci0KLSAgLyogSWYgdGhlIGxvd2VyIGhhbGYgaXMgbmVnYXRpdmUsIGluY3JlbWVudCB0aGUgdXBwZXIgMTYgaGFsZi4gICovCi0gIGlmICgocmVsb2NhdGlvbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZWxvY2F0aW9uICs9IDB4MTAwMDA7Ci0KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDA0MTEwMDAxLCBsb2NhdGlvbik7IC8qIGJhbCAuKzggKi8KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCSAgICAgIDB4M2MwMTAwMDAgfCAoKHJlbG9jYXRpb24gPj4gMTYpICYgMHhmZmZmKSwgLyogbHVpICRhdCxYWCAqLwotCSAgICAgIGxvY2F0aW9uICsgNCk7Ci0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwKLQkgICAgICAweDI0MjEwMDAwIHwgKHJlbG9jYXRpb24gJiAweGZmZmYpLCAvKiBhZGRpdSAkYXQsJGF0LFhYICovCi0JICAgICAgbG9jYXRpb24gKyA4KTsKLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDAwM2YwODIxLCBsb2NhdGlvbiArIDEyKTsgLyogYWRkdSAkYXQsJGF0LCRyYSAqLwotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIDB4MDAyMGY4MDksIGxvY2F0aW9uICsgMTYpOyAvKiBqYWxyICRhdCAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHaXZlbiBhIC5zZGF0YSBzZWN0aW9uIGFuZCBhIC5yZWwuc2RhdGEgaW4tbWVtb3J5IHNlY3Rpb24sIHN0b3JlCi0gICByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGludG8gdGhlIC5yZWwuc2RhdGEgc2VjdGlvbiB3aGljaCBjYW4gYmUKLSAgIHVzZWQgYXQgcnVudGltZSB0byByZWxvY2F0ZSB0aGUgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZQotICAgbGlua2VyIHdoZW4gdGhlIC0tZW1iZWRkZWQtcmVsb2NzIHN3aXRjaCBpcyB1c2VkLiAgVGhpcyBpcyBjYWxsZWQKLSAgIGFmdGVyIHRoZSBhZGRfc3ltYm9scyBlbnRyeSBwb2ludCBoYXMgYmVlbiBjYWxsZWQgZm9yIGFsbCB0aGUKLSAgIG9iamVjdHMsIGFuZCBiZWZvcmUgdGhlIGZpbmFsX2xpbmsgZW50cnkgcG9pbnQgaXMgY2FsbGVkLiAgVGhpcwotICAgZnVuY3Rpb24gcHJlc3VtZXMgdGhhdCB0aGUgb2JqZWN0IHdhcyBjb21waWxlZCB1c2luZwotICAgLW1lbWJlZGRlZC1waWMuICAqLwotCi1ib29sZWFuCi1iZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzIChhYmZkLCBpbmZvLCBkYXRhc2VjLCByZWxzZWMsIGVycm1zZykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKmRhdGFzZWM7Ci0gICAgIGFzZWN0aW9uICpyZWxzZWM7Ci0gICAgIGNoYXIgKiplcnJtc2c7Ci17Ci0gIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOwotICBiZmRfYnl0ZSAqcDsKLQotICBCRkRfQVNTRVJUICghIGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0KLSAgKmVycm1zZyA9IE5VTEw7Ci0KLSAgaWYgKGRhdGFzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltX2hhc2hlcyA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1faGFzaGVzOwotCi0gIGlmICghIG1pcHNfcmVhZF9yZWxvY3MgKGFiZmQsIGRhdGFzZWMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZWxzZWMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgZGF0YXNlYy0+cmVsb2NfY291bnQgKiA0KTsKLSAgaWYgKHJlbHNlYy0+Y29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcCA9IHJlbHNlYy0+Y29udGVudHM7Ci0KLSAgc2VjdGlvbl90ZGF0YSA9IGVjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZGF0YXNlYyk7Ci0gIGV4dF9yZWwgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jczsKLSAgZXh0X3JlbF9lbmQgPSBleHRfcmVsICsgZGF0YXNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyBleHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGV4dF9yZWwrKywgcCArPSA0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbnRfcmVsOwotICAgICAgYm9vbGVhbiB0ZXh0X3JlbGF0aXZlOwotCi0gICAgICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChQVFIpIGV4dF9yZWwsICZpbnRfcmVsKTsKLQotICAgICAgLyogV2UgYXJlIGdvaW5nIHRvIHdyaXRlIGEgZm91ciBieXRlIHdvcmQgaW50byB0aGUgcnVudGltZSByZWxvYwotCSBzZWN0aW9uLiAgVGhlIHdvcmQgd2lsbCBiZSB0aGUgYWRkcmVzcyBpbiB0aGUgZGF0YSBzZWN0aW9uCi0JIHdoaWNoIG11c3QgYmUgcmVsb2NhdGVkLiAgVGhpcyBtdXN0IGJlIG9uIGEgd29yZCBib3VuZGFyeSwKLQkgd2hpY2ggbWVhbnMgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4gIFdlIHVzZSB0aGUKLQkgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIGluZGljYXRlIGhvdyB0aGUgdmFsdWUgaW4gdGhlIGRhdGEKLQkgc2VjdGlvbiBtdXN0IGJlIHJlbG9jYXRlZC4gIEEgMCBtZWFucyB0aGF0IHRoZSB2YWx1ZSBpcwotCSByZWxhdGl2ZSB0byB0aGUgdGV4dCBzZWN0aW9uLCB3aGlsZSBhIDEgaW5kaWNhdGVzIHRoYXQgdGhlCi0JIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBkYXRhIHNlY3Rpb24uICBHaXZlbiB0aGF0IHdlIGFyZQotCSBhc3N1bWluZyB0aGUgY29kZSB3YXMgY29tcGlsZWQgdXNpbmcgLW1lbWJlZGRlZC1waWMsIHRoZXJlCi0JIHNob3VsZCBub3QgYmUgYW55IG90aGVyIHBvc3NpYmlsaXRpZXMuICAqLwotCi0gICAgICAvKiBXZSBjYW4gb25seSByZWxvY2F0ZSBSRUZXT1JEIHJlbG9jcyBhdCBydW4gdGltZS4gICovCi0gICAgICBpZiAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFRldPUkQpCi0JewotCSAgKmVycm1zZyA9IF8oInVuc3VwcG9ydGVkIHJlbG9jIHR5cGUiKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGludF9yZWwucl9leHRlcm4pCi0JewotCSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IHN5bV9oYXNoZXNbaW50X3JlbC5yX3N5bW5keF07Ci0JICAvKiBJZiBoIGlzIE5VTEwsIHRoYXQgbWVhbnMgdGhhdCB0aGVyZSBpcyBhIHJlbG9jIGFnYWluc3QgYW4KLQkgICAgIGV4dGVybmFsIHN5bWJvbCB3aGljaCB3ZSB0aG91Z2h0IHdhcyBqdXN0IGEgZGVidWdnaW5nCi0JICAgICBzeW1ib2wuICBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiAgKi8KLQkgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIGFib3J0ICgpOwotCSAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLQkgICAgdGV4dF9yZWxhdGl2ZSA9IHRydWU7Ci0JICBlbHNlCi0JICAgIHRleHRfcmVsYXRpdmUgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChpbnRfcmVsLnJfc3ltbmR4KQotCSAgICB7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9URVhUOgotCSAgICAgIHRleHRfcmVsYXRpdmUgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0RBVEE6Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9TQlNTOgotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUODoKLQkgICAgICB0ZXh0X3JlbGF0aXZlID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogTm8gb3RoZXIgc2VjdGlvbnMgc2hvdWxkIGFwcGVhciBpbiAtbWVtYmVkZGVkLXBpYwotICAgICAgICAgICAgICAgICBjb2RlLiAgKi8KLQkgICAgICAqZXJybXNnID0gXygicmVsb2MgYWdhaW5zdCB1bnN1cHBvcnRlZCBzZWN0aW9uIik7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoKGludF9yZWwucl9vZmZzZXQgJiAzKSAhPSAwKQotCXsKLQkgICplcnJtc2cgPSBfKCJyZWxvYyBub3QgcHJvcGVybHkgYWxpZ25lZCIpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLAotCQkgIChpbnRfcmVsLnJfdmFkZHIgLSBkYXRhc2VjLT52bWEgKyBkYXRhc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgKHRleHRfcmVsYXRpdmUgPyAwIDogMSkpLAotCQkgIHApOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgaXMgdGhlIEVDT0ZGIGJhY2tlbmQgc3RydWN0dXJlLiAgVGhlIGJhY2tlbmQgZmllbGQgb2YgdGhlCi0gICB0YXJnZXQgdmVjdG9yIHBvaW50cyB0byB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgbWlwc19lY29mZl9iYWNrZW5kX2RhdGEgPQotewotICAvKiBDT0ZGIGJhY2tlbmQgc3RydWN0dXJlLiAgKi8KLSAgewotICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsaW50LGludCxpbnQsaW50LFBUUikpKSBiZmRfdm9pZCwgLyogYXV4X2luICovCi0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHN5bV9pbiAqLwotICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsUFRSKSkpIGJmZF92b2lkLCAvKiBsaW5lbm9faW4gKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixpbnQsaW50LGludCxpbnQsUFRSKSkpYmZkX3ZvaWQsLyphdXhfb3V0Ki8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHN5bV9vdXQgKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIGxpbmVub19vdXQgKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHJlbG9jX291dCAqLwotICAgIG1pcHNfZWNvZmZfc3dhcF9maWxlaGRyX291dCwgbWlwc19lY29mZl9zd2FwX2FvdXRoZHJfb3V0LAotICAgIG1pcHNfZWNvZmZfc3dhcF9zY25oZHJfb3V0LAotICAgIEZJTEhTWiwgQU9VVFNaLCBTQ05IU1osIDAsIDAsIDAsIDAsIHRydWUsIGZhbHNlLCA0LAotICAgIG1pcHNfZWNvZmZfc3dhcF9maWxlaGRyX2luLCBtaXBzX2Vjb2ZmX3N3YXBfYW91dGhkcl9pbiwKLSAgICBtaXBzX2Vjb2ZmX3N3YXBfc2NuaGRyX2luLCBOVUxMLAotICAgIG1pcHNfZWNvZmZfYmFkX2Zvcm1hdF9ob29rLCBfYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywKLSAgICBfYmZkX2Vjb2ZmX21rb2JqZWN0X2hvb2ssIF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MsCi0gICAgX2JmZF9lY29mZl9zZXRfYWxpZ25tZW50X2hvb2ssIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLAotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKLSAgfSwKLSAgLyogU3VwcG9ydGVkIGFyY2hpdGVjdHVyZS4gICovCi0gIGJmZF9hcmNoX21pcHMsCi0gIC8qIEluaXRpYWwgcG9ydGlvbiBvZiBhcm1hcCBzdHJpbmcuICAqLwotICAiX19fX19fX19fXyIsCi0gIC8qIFRoZSBwYWdlIGJvdW5kYXJ5IHVzZWQgdG8gYWxpZ24gc2VjdGlvbnMgaW4gYSBkZW1hbmQtcGFnZWQKLSAgICAgZXhlY3V0YWJsZSBmaWxlLiAgRS5nLiwgMHgxMDAwLiAgKi8KLSAgMHgxMDAwLAotICAvKiBUcnVlIGlmIHRoZSAucmRhdGEgc2VjdGlvbiBpcyBwYXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQsIGFzIG9uIHRoZQotICAgICBBbHBoYS4gIEZhbHNlIGlmIC5yZGF0YSBpcyBwYXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQsIGFzIG9uIHRoZQotICAgICBNSVBTLiAgKi8KLSAgZmFsc2UsCi0gIC8qIEJpdHNpemUgb2YgY29uc3RydWN0b3IgZW50cmllcy4gICovCi0gIDMyLAotICAvKiBSZWxvYyB0byB1c2UgZm9yIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLwotICAmbWlwc19ob3d0b190YWJsZVtNSVBTX1JfUkVGV09SRF0sCi0gIHsKLSAgICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgICBtYWdpY1N5bSwKLSAgICAvKiBBbGlnbm1lbnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRS5nLiwgNC4gICovCi0gICAgNCwKLSAgICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gICAgc2l6ZW9mIChzdHJ1Y3QgaGRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZG5yX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgcGRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3Qgc3ltX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3Qgb3B0X2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZmRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgcmZkX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZXh0X2V4dCksCi0gICAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gICAgZWNvZmZfc3dhcF9oZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9kbnJfaW4sCi0gICAgZWNvZmZfc3dhcF9wZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9zeW1faW4sCi0gICAgZWNvZmZfc3dhcF9vcHRfaW4sCi0gICAgZWNvZmZfc3dhcF9mZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9yZmRfaW4sCi0gICAgZWNvZmZfc3dhcF9leHRfaW4sCi0gICAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiwKLSAgICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gICAgZWNvZmZfc3dhcF9oZHJfb3V0LAotICAgIGVjb2ZmX3N3YXBfZG5yX291dCwKLSAgICBlY29mZl9zd2FwX3Bkcl9vdXQsCi0gICAgZWNvZmZfc3dhcF9zeW1fb3V0LAotICAgIGVjb2ZmX3N3YXBfb3B0X291dCwKLSAgICBlY29mZl9zd2FwX2Zkcl9vdXQsCi0gICAgZWNvZmZfc3dhcF9yZmRfb3V0LAotICAgIGVjb2ZmX3N3YXBfZXh0X291dCwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQsCi0gICAgLyogRnVuY3Rpb24gdG8gcmVhZCBpbiBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgICBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8KLSAgfSwKLSAgLyogRXh0ZXJuYWwgcmVsb2Mgc2l6ZS4gICovCi0gIFJFTFNaLAotICAvKiBSZWxvYyBzd2FwcGluZyBmdW5jdGlvbnMuICAqLwotICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4sCi0gIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQsCi0gIC8qIEJhY2tlbmQgcmVsb2MgdHdlYWtpbmcuICAqLwotICBtaXBzX2FkanVzdF9yZWxvY19pbiwKLSAgbWlwc19hZGp1c3RfcmVsb2Nfb3V0LAotICAvKiBSZWxvY2F0ZSBzZWN0aW9uIGNvbnRlbnRzIHdoaWxlIGxpbmtpbmcuICAqLwotICBtaXBzX3JlbG9jYXRlX3NlY3Rpb24sCi0gIC8qIERvIGZpbmFsIGFkanVzdG1lbnRzIHRvIGZpbGVoZHIgYW5kIGFvdXRoZHIuICAqLwotICBOVUxMLAotICAvKiBSZWFkIGFuIGVsZW1lbnQgZnJvbSBhbiBhcmNoaXZlIGF0IGEgZ2l2ZW4gZmlsZSBwb3NpdGlvbi4gICovCi0gIF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zCi19OwotCi0vKiBMb29raW5nIHVwIGEgcmVsb2MgdHlwZSBpcyBNSVBTIHNwZWNpZmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgbWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogR2V0dGluZyByZWxvY2F0ZWQgc2VjdGlvbiBjb250ZW50cyBpcyBnZW5lcmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0KLS8qIEhhbmRsaW5nIGZpbGUgd2luZG93cyBpcyBnZW5lcmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLS8qIFJlbGF4aW5nIHNlY3Rpb25zIGlzIE1JUFMgc3BlY2lmaWMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIG1pcHNfcmVsYXhfc2VjdGlvbgotCi0vKiBHQyBvZiBzZWN0aW9ucyBpcyBub3QgZG9uZS4gICovCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0KLWNvbnN0IGJmZF90YXJnZXQgZWNvZmZfbGl0dGxlX3ZlYyA9Ci17Ci0gICJlY29mZi1saXR0bGVtaXBzIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZWNvZmZfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIF9iZmRfZWNvZmZfbWtvYmplY3QsICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgJm1pcHNfZWNvZmZfYmFja2VuZF9kYXRhCi19OwotCi1jb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ192ZWMgPQotewotICAiZWNvZmYtYmlnbWlwcyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0ge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9lY29mZl9hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX21rb2JqZWN0LCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0ge2JmZF9mYWxzZSwgX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgJm1pcHNfZWNvZmZfYmFja2VuZF9kYXRhCi19OwotCi1jb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ2xpdHRsZV92ZWMgPQotewotICAiZWNvZmYtYmlnbGl0dGxlbWlwcyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2Vjb2ZmX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX21rb2JqZWN0LCAgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpICZtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YQotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXBtYWMuYyBiL2JmZC9jb2ZmLXBtYWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMzMzJkOS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1wbWFjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFwcGxlIGV0IGFsIFBvd2VyUEMgTWFjICJYQ09GRiIgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JcG1hY194Y29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJInhjb2ZmLXBvd2VybWFjIgotCi0vKiBUd2VhayBjb2ZmY29kZS5oIGJhc2VkIG9uIHRoaXMgYmVpbmcgYSBQb3dlck1hYyBpbnN0ZWFkIG9mIFJTLzYwMDAuICovCi0KLSNkZWZpbmUgUE9XRVJNQUMKLQotI2luY2x1ZGUgImNvZmYtcnM2MDAwLmMiCmRpZmYgLS1naXQgYS9iZmQvY29mZi1wcGMuYyBiL2JmZC9jb2ZmLXBwYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjQ1MDQ0Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXBwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkzNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFBvd2VyUEMgTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBPcmlnaW5hbCB2ZXJzaW9uIHBpZWNlZCB0b2dldGhlciBieSBLaW0gS251dHRpbGEgKGtya0BjeWdudXMuY29tKQotCi0gICBUaGVyZSBpcyBub3RoaW5nIG5ldyB1bmRlciB0aGUgc3VuLiBUaGlzIGZpbGUgZHJhd3MgYSBsb3Qgb24gb3RoZXIKLSAgIGNvZmYgZmlsZXMsIGluIHBhcnRpY3VsYXIsIHRob3NlIGZvciB0aGUgcnMvNjAwMCwgYWxwaGEsIG1pcHMsIGFuZCAKLSAgIGludGVsIGJhY2tlbmRzLCBhbmQgdGhlIFBFIHdvcmsgZm9yIHRoZSBhcm0uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEN1cnJlbnQgU3RhdGU6Ci0gICAtIG9iamR1bXAgd29ya3MKLSAgIC0gcmVsb2NzIGdlbmVyYXRlZCBieSBnYXMKLSAgIC0gbGQgd2lsbCBsaW5rIGZpbGVzLCBidXQgdGhleSBkbyBub3QgcnVuLgotICAgLSBkbGx0b29sIHdpbGwgbm90IHByb2R1Y2UgY29ycmVjdCBvdXRwdXQgaW4gc29tZSAucmVsb2MgY2FzZXMsIGFuZCB3aWxsIAotICAgICBub3QgcHJvZHVjZSB0aGUgcmlnaHQgZ2x1ZSBjb2RlIGZvciBkbGwgZnVuY3Rpb24gY2FsbHMuCi0qLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAiY29mZi9wb3dlcnBjLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSAiY29mZi9wZS5oIgotCi0jaWZkZWYgQkFETUFHCi0jdW5kZWYgQkFETUFHCi0jZW5kaWYKLQotI2RlZmluZSBCQURNQUcoeCkgUFBDQkFETUFHKHgpCi0KLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLS8qIFRoaXMgZmlsZSBpcyBjb21waWxlZCBtb3JlIHRoYW4gb25jZSwgYnV0IHdlIG9ubHkgY29tcGlsZSB0aGUKLSAgIGZpbmFsX2xpbmsgcm91dGluZSBvbmNlLiAgKi8KLWV4dGVybiBib29sZWFuIHBwY19iZmRfY29mZl9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gdm9pZCBkdW1wX3RvYyBQQVJBTVMgKChQVFIpKTsKLQotLyogVGhlIHRvYyBpcyBhIHNldCBvZiBiZmRfdm1hIGZpZWxkcy4gV2UgdXNlIHRoZSBmYWN0IHRoYXQgdmFsaWQgICAgICAgICAqLwotLyogYWRkcmVzc2VzIGFyZSBldmVuIChpLmUuIHRoZSBiaXQgcmVwcmVzZW50aW5nICIxIiBpcyBvZmYpIHRvIGFsbG93ICAgICAqLwotLyogdXMgdG8gZW5jb2RlIGEgbGl0dGxlIGV4dHJhIGluZm9ybWF0aW9uIGluIHRoZSBmaWVsZCAgICAgICAgICAgICAgICAgICAqLwotLyogLSBVbmFsbG9jYXRlZCBhZGRyZXNzZXMgYXJlIGludGlhbGl6ZWQgdG8gMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLSBBbGxvY2F0ZWQgYWRkcmVzc2VzIGFyZSBldmVuIG51bWJlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIGZpcnN0IHRpbWUgd2UgYWN0dWFsbHkgd3JpdGUgYSByZWZlcmVuY2UgdG8gdGhlIHRvYyBpbiB0aGUgYmZkLCAgICAqLwotLyogd2Ugd2FudCB0byByZWNvcmQgdGhhdCBmYWN0IGluIGEgZml4dXAgZmlsZSAoaWYgaXQgaXMgYXNrZWQgZm9yKSwgc28gICAqLwotLyogd2Uga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCBhbiBhZGRyZXNzIGhhcyBiZWVuIHdyaXR0ZW4gYnkgbWFya2luZyAqLwotLyogdGhlIGxvdyBvcmRlciBiaXQgd2l0aCBhICIxIiB1cG9uIHdyaXRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIFNFVF9VTkFMTE9DQVRFRCh4KSAgKCh4KSA9IDEpCi0jZGVmaW5lIElTX1VOQUxMT0NBVEVEKHgpICAgKCh4KSA9PSAxKQotCi0jZGVmaW5lIElTX1dSSVRURU4oeCkgICAgICAgKCh4KSAmIDEpCi0jZGVmaW5lIE1BUktfQVNfV1JJVFRFTih4KSAgKCh4KSB8PSAxKQotI2RlZmluZSBNQUtFX0FERFJfQUdBSU4oeCkgICgoeCkgJj0gfjEpCi0KLQotLyogVHVybiBvbiB0aGlzIGNoZWNrIGlmIHlvdSBzdXNwZWN0IHNvbWV0aGluZyBhbWlzcyBpbiB0aGUgaGFzaCB0YWJsZXMgKi8KLSNpZmRlZiBERUJVR19IQVNICi0KLS8qIE5lZWQgYSA3IGNoYXIgc3RyaW5nIGZvciBhbiBleWUgY2F0Y2hlciAqLwotI2RlZmluZSBFWUUgImtya2p1bmsiCi0KLSNkZWZpbmUgSEFTSF9DSEVDS19EQ0wgY2hhciBleWVfY2F0Y2hlcls4XTsKLSNkZWZpbmUgSEFTSF9DSEVDS19JTklUKHJldCkgICAgICBzdHJjcHkocmV0LT5leWVfY2F0Y2hlciwgRVlFKQotI2RlZmluZSBIQVNIX0NIRUNLKGFkZHIpIFwKLSBpZiAoc3RyY21wKGFkZHItPmV5ZV9jYXRjaGVyLCBFWUUpICE9IDApIFwKLSAgeyBcCi0gICAgZnByaW50ZihzdGRlcnIsXAotICAgIF8oIkZpbGUgJXMsIGxpbmUgJWQsIEhhc2ggY2hlY2sgZmFpbHVyZSwgYmFkIGV5ZSAlOHNcbiIpLCBcCi0gICAgX19GSUxFX18sIF9fTElORV9fLCBhZGRyLT5leWVfY2F0Y2hlcik7IFwKLSAgICBhYm9ydCgpOyBcCi0gfQotCi0KLSNlbHNlCi0KLSNkZWZpbmUgSEFTSF9DSEVDS19EQ0wKLSNkZWZpbmUgSEFTSF9DSEVDS19JTklUKHJldCkKLSNkZWZpbmUgSEFTSF9DSEVDSyhhZGRyKQotCi0jZW5kaWYKLQotLyogSW4gb3JkZXIgbm90IHRvIGFkZCBhbiBpbnQgdG8gZXZlcnkgaGFzaCB0YWJsZSBpdGVtIGZvciBldmVyeSBjb2ZmCi0gICBsaW5rZXIsIHdlIGRlZmluZSBvdXIgb3duIGhhc2ggdGFibGUsIGRlcml2ZWQgZnJvbSB0aGUgY29mZiBvbmUgKi8KLQotLyogUEUgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gKi8KLQotc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgcm9vdDsgLyogRmlyc3QgZW50cnksIGFzIHJlcXVpcmVkICAqLwotCi0gIC8qIEFzIHdlIHdvbmRlciBhcm91bmQgdGhlIHJlbG9jcywgd2UnbGwga2VlcCB0aGUgYXNzaWduZWQgdG9jX29mZnNldAotICAgICBoZXJlICovCi0gIGJmZF92bWEgdG9jX29mZnNldDsgICAgICAgICAgICAgICAvKiBPdXIgYWRkaXRpb24sIGFzIHJlcXVpcmVkICovCi0gIGludCBzeW1ib2xfaXNfZ2x1ZTsKLSAgdW5zaWduZWQgbG9uZyBpbnQgZ2x1ZV9pbnNuOwotCi0gIEhBU0hfQ0hFQ0tfRENMCi19OwotCi0KLS8qIFBFIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgcm9vdDsgLyogRmlyc3QgZW50cnksIGFzIHJlcXVpcmVkICovCi19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpwcGNfY29mZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JICAgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpjb2ZmX3BwY19ydHlwZV90b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwKLQkgICBiZmRfdm1hICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gdGhlIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotcHBjX2NvZmZfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKnJldCA9IAotICAgIChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikKLSAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgCi0JCQkgc2l6ZW9mIChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5KSk7Ci0KLSAgaWYgKHJldCA9PSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIAotCQkJCSAgICAgIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCi0gICAgICBTRVRfVU5BTExPQ0FURUQocmV0LT50b2Nfb2Zmc2V0KTsKLSAgICAgIHJldC0+c3ltYm9sX2lzX2dsdWUgPSAwOwotICAgICAgcmV0LT5nbHVlX2luc24gPSAwOwotCi0gICAgICBIQVNIX0NIRUNLX0lOSVQocmV0KTsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBJbml0aWFsaXplIGEgUEUgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICByZXR1cm4gX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnJvb3QsIGFiZmQsIG5ld2Z1bmMpOwotfQotCi0vKiBDcmVhdGUgYSBQRSBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1wcGNfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKCEgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQgKHJldCwgYWJmZCwKLQkJCQkJcHBjX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogTm93LCB0YWlsb3IgY29mZmNvZGUuaCB0byB1c2Ugb3VyIGhhc2ggc3R1ZmYgKi8KLQotI2RlZmluZSBjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLQotDAotLyogVGhlIG50IGxvYWRlciBwb2ludHMgdGhlIHRvYyByZWdpc3RlciB0byAmdG9jICsgMzI3NjgsIGluIG9yZGVyIHRvICovCi0vKiB1c2UgdGhlIGNvbXBsZXRlIHJhbmdlIG9mIGEgMTYtYml0IGRpc3BsYWNlbWVudC4gV2UgaGF2ZSB0byBhZGp1c3QgKi8KLS8qIGZvciB0aGlzIHdoZW4gd2UgZml4IHVwIGxvYWRzIGRpc3BsYWNlZCBvZmYgdGhlIHRvYyByZWcuICAgICAgICAgICAqLwotI2RlZmluZSBUT0NfTE9BRF9BREpVU1RNRU5UICgtMzI3NjgpCi0jZGVmaW5lIFRPQ19TRUNUSU9OX05BTUUgIi5wcml2YXRlLnRvYyIKLQotLyogVGhlIG1haW4gYm9keSBvZiBjb2RlIGlzIGluIGNvZmZjb2RlLmguICAqLwotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLS8qIHRoZXNlIHNob3VsZCBkZWZpbml0ZWx5IGdvIGluIGEgaGVhZGVyIGZpbGUgc29tZXdoZXJlLi4uICovCi0KLS8qIE5PUCAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FCU09MVVRFICAgICAgICAgIDB4MDAwMAotCi0vKiA2NC1iaXQgYWRkcmVzcyAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFI2NCAgICAgICAgICAgIDB4MDAwMQotCi0vKiAzMi1iaXQgYWRkcmVzcyAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIzMiAgICAgICAgICAgIDB4MDAwMgotCi0vKiAyNi1iaXQgYWRkcmVzcywgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCBhYnNvbHV0ZSkgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSMjQgICAgICAgICAgICAweDAwMDMKLQotLyogMTYtYml0IGFkZHJlc3MgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSMTYgICAgICAgICAgICAweDAwMDQKLQotLyogMTYtYml0IGFkZHJlc3MsIHNoaWZ0ZWQgbGVmdCAyIChsb2FkIGRvdWJsZXdvcmQpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjE0ICAgICAgICAgICAgMHgwMDA1Ci0KLS8qIDI2LWJpdCBQQy1yZWxhdGl2ZSBvZmZzZXQsIHNoaWZ0ZWQgbGVmdCAyIChicmFuY2ggcmVsYXRpdmUpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUkVMMjQgICAgICAgICAgICAgMHgwMDA2Ci0KLS8qIDE2LWJpdCBQQy1yZWxhdGl2ZSBvZmZzZXQsIHNoaWZ0ZWQgbGVmdCAyIChiciBjb25kIHJlbGF0aXZlKSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1JFTDE0ICAgICAgICAgICAgIDB4MDAwNwotCi0vKiAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNiAgICAgICAgICAweDAwMDgKLQotLyogMTYtYml0IG9mZnNldCBmcm9tIFRPQyBiYXNlLCBzaGlmdGVkIGxlZnQgMiAobG9hZCBkb3VibGV3b3JkKSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE0ICAgICAgICAgIDB4MDAwOQotCi0vKiAzMi1iaXQgYWRkciB3L28gaW1hZ2UgYmFzZSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIzMk5CICAgICAgICAgIDB4MDAwQQotCi0vKiB2YSBvZiBjb250YWluaW5nIHNlY3Rpb24gKGFzIGluIGFuIGltYWdlIHNlY3Rpb25oZHIpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfU0VDUkVMICAgICAgICAgICAgMHgwMDBCCi0KLS8qIHNlY3Rpb25oZWFkZXIgbnVtYmVyICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfU0VDVElPTiAgICAgICAgICAgMHgwMDBDCi0KLS8qIHN1YnN0aXR1dGUgVE9DIHJlc3RvcmUgaW5zdHJ1Y3Rpb24gaWZmIHN5bWJvbCBpcyBnbHVlIGNvZGUgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19JRkdMVUUgICAgICAgICAgICAweDAwMEQKLQotLyogc3ltYm9sIGlzIGdsdWUgY29kZTsgdmlydHVhbCBhZGRyZXNzIGlzIFRPQyByZXN0b3JlIGluc3RydWN0aW9uICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfSU1HTFVFICAgICAgICAgICAgMHgwMDBFCi0KLS8qIHZhIG9mIGNvbnRhaW5pbmcgc2VjdGlvbiAobGltaXRlZCB0byAxNiBiaXRzKSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1NFQ1JFTDE2ICAgICAgICAgIDB4MDAwRgotCi0vKiBzdHVmZiB0byBoYW5kbGUgaW1tZWRpYXRlIGRhdGEgd2hlbiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlICovCi0vKiBkYXRhIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGltbWVkaWF0ZSBmaWVsZCAqLwotLyogV2UgbmVlZCB0byBkbyAodXN1YWxseSkgMzIgYml0IGFyaXRobWV0aWMgb24gMTYgYml0IGNodW5rcyAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1JFRkhJICAgICAgICAgICAgIDB4MDAxMAotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1JFRkxPICAgICAgICAgICAgIDB4MDAxMQotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1BBSVIgICAgICAgICAgICAgIDB4MDAxMgotCi0vKiBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIHRvY3JlbDE2LCB3aXRoIFRPQ0RFRk4gYXNzdW1lZCAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2X0RFRk4gICAgIDB4MDAxMwotCi0vKiAgRmxhZyBiaXRzIGluIElNQUdFX1JFTE9DQVRJT04uVFlQRSAqLwotCi0vKiBzdWJ0cmFjdCByZWxvYyB2YWx1ZSByYXRoZXIgdGhhbiBhZGRpbmcgaXQgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19ORUcgICAgICAgICAgICAgICAweDAxMDAKLQotLyogZml4IGJyYW5jaCBwcmVkaWN0aW9uIGJpdCB0byBwcmVkaWN0IGJyYW5jaCB0YWtlbiAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0JSVEFLRU4gICAgICAgICAgIDB4MDIwMAotCi0vKiBmaXggYnJhbmNoIHByZWRpY3Rpb24gYml0IHRvIHByZWRpY3QgYnJhbmNoIG5vdCB0YWtlbiAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0JSTlRBS0VOICAgICAgICAgIDB4MDQwMAotCi0vKiB0b2Mgc2xvdCBkZWZpbmVkIGluIGZpbGUgKG9yLCBkYXRhIGluIHRvYykgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19UT0NERUZOICAgICAgICAgICAweDA4MDAKLQotLyogbWFza3MgdG8gaXNvbGF0ZSBhYm92ZSB2YWx1ZXMgaW4gSU1BR0VfUkVMT0NBVElPTi5UeXBlICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfVFlQRU1BU0sgICAgICAgICAgMHgwMEZGCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfRkxBR01BU0sgICAgICAgICAgMHgwRjAwCi0KLSNkZWZpbmUgRVhUUkFDVF9UWVBFKHgpICAgICAgICAgICAgICAgICAoKHgpICYgSU1BR0VfUkVMX1BQQ19UWVBFTUFTSykKLSNkZWZpbmUgRVhUUkFDVF9GTEFHUyh4KSAoKHgpICYgSU1BR0VfUkVMX1BQQ19GTEFHTUFTSykKLSNkZWZpbmUgRVhUUkFDVF9KVU5LKHgpICBcCi0gICAgICAgICAgICgoeCkgJiB+KElNQUdFX1JFTF9QUENfVFlQRU1BU0sgfCBJTUFHRV9SRUxfUFBDX0ZMQUdNQVNLKSkKLQotDAotLyogc3RhdGljIGhlbHBlciBmdW5jdGlvbnMgdG8gbWFrZSByZWxvY2F0aW9uIHdvcmsgKi8KLS8qIChXb3JrIEluIFByb2dyZXNzKSAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19yZWZoaV9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICBjaGFyICoqZXJyb3IpKTsKLSNpZiAwCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19yZWZsb19yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICBjaGFyICoqZXJyb3IpKTsKLSNlbmRpZgotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwcGNfcGFpcl9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICBjaGFyICoqZXJyb3IpKTsKLQotDAotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwcGNfdG9jMTZfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgY2hhciAqKmVycm9yKSk7Ci0KLSNpZiAwCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19hZGRyMzJuYl9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkJIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJCSBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkJIFBUUiBkYXRhLAotCQkJCQkJCSBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCQkgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJCSBjaGFyICoqZXJyb3IpKTsKLSNlbmRpZgotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwcGNfc2VjdGlvbl9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkJYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkJYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJCVBUUiBkYXRhLAotCQkJCQkJCWFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJCWJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCQljaGFyICoqZXJyb3IpKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwcGNfc2VjcmVsX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19pbWdsdWVfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7Ci0KLQotCi1zdGF0aWMgYm9vbGVhbiBpbl9yZWxvY19wIFBBUkFNUygoYmZkICphYmZkLCByZWxvY19ob3d0b190eXBlICpob3d0bykpOwotCi0MCi0vKiBGSVhNRTogSXQnbGwgdGFrZSBhIHdoaWxlIHRvIGdldCB0aHJvdWdoIGFsbCBvZiB0aGVzZS4gSSBvbmx5IG5lZWQgYSBmZXcgdG8KLSAgIGdldCB1cyBzdGFydGVkLCBzbyB0aG9zZSBJJ2xsIG1ha2Ugc3VyZSB3b3JrLiBUaG9zZSBtYXJrZWQgRklYTUUgYXJlIGVpdGhlcgotICAgY29tcGxldGVseSB1bnZlcmlmaWVkIG9yIGhhdmUgYSBzcGVjaWZpYyB1bmtub3duIG1hcmtlZCBpbiB0aGUgY29tbWVudCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZWxvY2F0aW9uIGVudHJpZXMgZm9yIFdpbmRvd3MvTlQgb24gUG93ZXJQQy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGcm9tIHRoZSBkb2N1bWVudCAiIiB3ZSBmaW5kIHRoZSBmb2xsb3dpbmcgbGlzdGVkIGFzIHVzZWQgcmVsb2NzOiAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEFCU09MVVRFICAgICAgIDogVGhlIG5vb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEFERFJbNjR8MzJ8MTZdIDogZmllbGRzIHRoYXQgaG9sZCBhZGRyZXNzZXMgaW4gZGF0YSBmaWVsZHMgb3IgdGhlICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgMTYgYml0IGRpc3BsYWNlbWVudCBmaWVsZCBvbiBhIGxvYWQvc3RvcmUuICAgICAgICAgICAgICovCi0vKiAgIEFERFJbMjR8MTRdICAgIDogZmllbGRzIHRoYXQgaG9sZCBhZGRyZXNzZXMgaW4gYnJhbmNoIGFuZCBjb25kICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYnJhbmNoZXMuIFRoZXNlIHJlcHJlc2VudCBbMjZ8MTZdIGJpdCBhZGRyZXNzZXMuICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgVGhlIGxvdyBvcmRlciAyIGJpdHMgYXJlIHByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFJFTFsyNHwxNF0gICAgIDogYnJhbmNoZXMgcmVsYXRpdmUgdG8gdGhlIEluc3RydWN0aW9uIEFkZHJlc3MgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIuIFRoZXNlIHJlcHJlc2VudCBbMjZ8MTZdIGJpdCBhZGRyZXNzZXMsICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYXMgYmVmb3JlLiBUaGUgaW5zdHJ1Y3Rpb24gZmllbGQgd2lsbCBiZSB6ZXJvLCBhbmQgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIFNZTSB3aWxsIGJlIGluc2VydGVkIGF0IGxpbmsgdGltZS4gICovCi0vKiAgIFRPQ1JFTDE2ICAgICAgIDogMTYgYml0IGRpc3BsYWNlbWVudCBmaWVsZCByZWZlcnJpbmcgdG8gYSBzbG90IGluICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgdG9jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFRPQ1JFTDE0ICAgICAgIDogMTYgYml0IGRpc3BsYWNlbWVudCBmaWVsZCwgc2ltaWxhciB0byBSRUwxNCBvciBBRERSMTQuICovCi0vKiAgIEFERFIzMk5CICAgICAgIDogMzIgYml0IGFkZHJlc3MgcmVsYXRpdmUgdG8gdGhlIHZpcnR1YWwgb3JpZ2luLiAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgKE9uIHRoZSBhbHBoYSwgdGhpcyBpcyBhbHdheXMgYSBsaW5rZXIgZ2VuZXJhdGVkIHRodW5rKSovCi0vKiAgICAgICAgICAgICAgICAgICAgKGkuZS4gMzJiaXQgYWRkciByZWxhdGl2ZSB0byB0aGUgaW1hZ2UgYmFzZSkgICAgICAgICAgICovCi0vKiAgIFNFQ1JFTCAgICAgICAgIDogVGhlIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZyB0aGUgc3ltYm9sLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFNFQ1RJT04gICAgICAgIDogYWNjZXNzIHRvIHRoZSBoZWFkZXIgY29udGFpbmluZyB0aGUgaXRlbS4gU3VwcG9ydHMgdGhlICovCi0vKiAgICAgICAgICAgICAgICAgICAgY29kZXZpZXcgZGVidWdnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJbiBwYXJ0aWN1bGFyLCBub3RlIHRoYXQgdGhlIGRvY3VtZW50IGRvZXMgbm90IGluZGljYXRlIHRoYXQgdGhlICAgICAgICAgICovCi0vKiByZWxvY2F0aW9ucyBsaXN0ZWQgaW4gdGhlIGhlYWRlciBmaWxlIGFyZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHBwY19jb2ZmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBJTUFHRV9SRUxfUFBDX0FCU09MVVRFIDB4MDAwMCAgIE5PUCAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FCU09MVVRFLCAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBkb250IGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJBQlNPTFVURSIsICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwLAkgCSAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMCwgICAgICAgIAkJIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX0FERFI2NCAweDAwMDEgIDY0LWJpdCBhZGRyZXNzICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8oSU1BR0VfUkVMX1BQQ19BRERSNjQsICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkwLAkgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkzLAkgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQk2NCwJICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCWZhbHNlLAkgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkwLAkgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgCSAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCTAsCQkgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JIkFERFI2NCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLwotCXRydWUsCSAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCU1JTlVTX09ORSwJIAkgLyogc3JjX21hc2sgKi8KLQlNSU5VU19PTkUsICAgICAgICAJIC8qIGRzdF9tYXNrICovCi0JZmFsc2UpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19BRERSMzIgMHgwMDAyICAzMi1iaXQgYWRkcmVzcyAqLwotICAvKiBVc2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BRERSMzIsCS8qIHR5cGUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFERFIzMiIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfQUREUjI0IDB4MDAwMyAgMjYtYml0IGFkZHJlc3MsIHNoaWZ0ZWQgbGVmdCAyIChicmFuY2ggYWJzb2x1dGUpICovCi0gIC8qIHRoZSBMSSBmaWVsZCBpcyBpbiBiaXQgNiB0aHJvdWdoIGJpdCAyOSBpcyAyNCBiaXRzLCArIDIgZm9yIHRoZSBzaGlmdCAqLwotICAvKiBPZiBjb3Vyc2UsIFRoYXQncyB0aGUgSUJNIGFwcHJvdmVkIGJpdCBudW1iZXJpbmcsIHdoaWNoIGlzIG5vdCB3aGF0ICovCi0gIC8qIGFueW9uZSBlbHNlIHVzZXMuLi4uIFRoZSBsaSBmaWVsZCBpcyBpbiBiaXQgMiB0aHJ1IDI1ICovIAotICAvKiBVc2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BRERSMjQsICAvKiB0eXBlICovCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDI2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFERFIyNCIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDdmZmZmZmMsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDA3ZmZmZmZjLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfQUREUjE2IDB4MDAwNCAgMTYtYml0IGFkZHJlc3MgKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfQUREUjE2LCAgLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJBRERSMTYiLCAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19BRERSMTQgMHgwMDA1ICovCi0gIC8qICAxNi1iaXQgYWRkcmVzcywgc2hpZnRlZCBsZWZ0IDIgKGxvYWQgZG91Ymxld29yZCkgKi8KLSAgLyogRklYTUU6IHRoZSBtYXNrIGlzIGxpa2VseSB3cm9uZywgYW5kIHRoZSBiaXQgcG9zaXRpb24gbWF5IGJlIGFzIHdlbGwgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BRERSMTQsICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFERFIxNiIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX1JFTDI0IDB4MDAwNiAqLwotICAvKiAgIDI2LWJpdCBQQy1yZWxhdGl2ZSBvZmZzZXQsIHNoaWZ0ZWQgbGVmdCAyIChicmFuY2ggcmVsYXRpdmUpICovCi0gIC8qIFVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX1JFTDI0LCAgIC8qIHR5cGUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJFTDI0IiwgICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX1JFTDE0IDB4MDAwNyAqLwotICAvKiAgIDE2LWJpdCBQQy1yZWxhdGl2ZSBvZmZzZXQsIHNoaWZ0ZWQgbGVmdCAyIChiciBjb25kIHJlbGF0aXZlKSAqLwotICAvKiBGSVhNRTogdGhlIG1hc2sgaXMgbGlrZWx5IHdyb25nLCBhbmQgdGhlIGJpdCBwb3NpdGlvbiBtYXkgYmUgYXMgd2VsbCAqLwotICAvKiBGSVhNRTogaG93IGRvZXMgaXQga25vdyBob3cgZmFyIHRvIHNoaWZ0PyAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIxNCwgIC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjE2IiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfVE9DUkVMMTYgMHgwMDA4ICovCi0gIC8qICAgMTYtYml0IG9mZnNldCBmcm9tIFRPQyBiYXNlICovCi0gIC8qIFVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2LC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY190b2MxNl9yZWxvYywgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiVE9DUkVMMTYiLCAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE0IDB4MDAwOSAqLwotICAvKiAgIDE2LWJpdCBvZmZzZXQgZnJvbSBUT0MgYmFzZSwgc2hpZnRlZCBsZWZ0IDIgKGxvYWQgZG91Ymxld29yZCkgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19UT0NSRUwxNCwvKiB0eXBlICovICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlRPQ1JFTDE0IiwgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19BRERSMzJOQiAweDAwMEEgKi8KLSAgLyogICAzMi1iaXQgYWRkciB3LyBpbWFnZSBiYXNlICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfQUREUjMyTkIsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFERFIzMk5CIiwgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX1NFQ1JFTCAweDAwMEIgKi8KLSAgLyogICB2YSBvZiBjb250YWluaW5nIHNlY3Rpb24gKGFzIGluIGFuIGltYWdlIHNlY3Rpb25oZHIpICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfU0VDUkVMLC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX3NlY3JlbF9yZWxvYywgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJTRUNSRUwiLCAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19TRUNUSU9OIDB4MDAwQyAqLwotICAvKiAgIHNlY3Rpb25oZWFkZXIgbnVtYmVyICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfU0VDVElPTiwvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19zZWN0aW9uX3JlbG9jLCAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiU0VDVElPTiIsICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIElNQUdFX1JFTF9QUENfSUZHTFVFIDB4MDAwRCAqLwotICAvKiAgIHN1YnN0aXR1dGUgVE9DIHJlc3RvcmUgaW5zdHJ1Y3Rpb24gaWZmIHN5bWJvbCBpcyBnbHVlIGNvZGUgKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfSUZHTFVFLC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiSUZHTFVFIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIElNQUdFX1JFTF9QUENfSU1HTFVFIDB4MDAwRSAqLwotICAvKiAgIHN5bWJvbCBpcyBnbHVlIGNvZGU7IHZpcnR1YWwgYWRkcmVzcyBpcyBUT0MgcmVzdG9yZSBpbnN0cnVjdGlvbiAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0lNR0xVRSwvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfaW1nbHVlX3JlbG9jLCAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIklNR0xVRSIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIElNQUdFX1JFTF9QUENfU0VDUkVMMTYgMHgwMDBGICovCi0gIC8qICAgdmEgb2YgY29udGFpbmluZyBzZWN0aW9uIChsaW1pdGVkIHRvIDE2IGJpdHMpICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfU0VDUkVMMTYsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJTRUNSRUwxNiIsICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIElNQUdFX1JFTF9QUENfUkVGSEkgICAgICAgICAgICAgMHgwMDEwICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfUkVGSEksICAgLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfcmVmaGlfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJFRkhJIiwgICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19SRUZMTyAgICAgICAgICAgICAweDAwMTEgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19SRUZMTywgICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19yZWZoaV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUkVGTE8iLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIElNQUdFX1JFTF9QUENfUEFJUiAgICAgICAgICAgICAgMHgwMDEyICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfUEFJUiwgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfcGFpcl9yZWxvYywgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlBBSVIiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2X0RFRk4gMHgwMDEzICovCi0gIC8qICAgMTYtYml0IG9mZnNldCBmcm9tIFRPQyBiYXNlLCB3aXRob3V0IGNhdXNpbmcgYSBkZWZpbml0aW9uICovCi0gIC8qIFVzZWQ6ICovCi0gIEhPV1RPICggKElNQUdFX1JFTF9QUENfVE9DUkVMMTYgfCBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pLCAvKiB0eXBlICovIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlRPQ1JFTDE2LCBUT0NERUZOIiwgICAvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi0KLQwKLQotLyogU29tZSByZWFsbHkgY2hlZXp5IG1hY3JvcyB0aGF0IGNhbiBiZSB0dXJuZWQgb24gdG8gdGVzdCBzdGRlcnIgOi0pICovCi0KLSNpZmRlZiBERUJVR19SRUxPQwotI2RlZmluZSBVTl9JTVBMKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBzdGF0aWMgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgaWYgKGkgPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgaSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGZwcmludGYoc3RkZXJyLF8oIlVuaW1wbGVtZW50ZWQgUmVsb2NhdGlvbiAtLSAlc1xuIikseCk7IFwKLSAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgRFVNUF9SRUxPQyhuLHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBmcHJpbnRmKHN0ZGVyciwiJXMgc3ltICVkLCBhZGRyICVkLCBhZGRlbmQgJWRcbiIsIFwKLQkgICBuLCAoKihyLT5zeW1fcHRyX3B0cikpLT5uYW1lLCAgICAgICAgICAgICBcCi0JICAgci0+YWRkcmVzcywgci0+YWRkZW5kKTsgICAgICAgICAgICAgICAgICAgXAotfQotCi0vKiBHaXZlbiBhIHJlbG9jIG5hbWUsIG4sIGFuZCBhIHBvaW50ZXIgdG8gYW4gaW50ZXJuYWxfcmVsb2MsIAotICAgZHVtcCBvdXQgaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24gb24gdGhlIGNvbnRlbnRzIAotCi0jZGVmaW5lIG5fbmFtZQkJX24uX25fbmFtZQotI2RlZmluZSBuX3plcm9lcwlfbi5fbl9uLl9uX3plcm9lcwotI2RlZmluZSBuX29mZnNldAlfbi5fbl9uLl9uX29mZnNldAotCi0qLwotCi0jZGVmaW5lIERVTVBfUkVMT0MyKG4scikgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBmcHJpbnRmKHN0ZGVyciwiJXMgc3ltICVkLCByX3ZhZGRyICVkICVzXG4iLCBcCi0JICAgbiwgci0+cl9zeW1uZHgsIHItPnJfdmFkZHIsXAotCSAgICgoKHItPnJfdHlwZSkgJiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pID09IDApIFwKLQkgICA/IiAiOiIgVE9DREVGTiIgICk7ICAgICAgXAotfQotCi0jZWxzZQotI2RlZmluZSBVTl9JTVBMKHgpCi0jZGVmaW5lIERVTVBfUkVMT0MobixyKQotI2RlZmluZSBEVU1QX1JFTE9DMihuLHIpCi0jZW5kaWYKLQotCi0MCi0vKiB0b2MgY29uc3RydWN0aW9uIGFuZCBtYW5hZ2VtZW50IHJvdXRpbmVzICovCi0KLS8qIFRoaXMgZmlsZSBpcyBjb21waWxlZCB0d2ljZSwgYW5kIHRoZXNlIHZhcmlhYmxlcyBhcmUgZGVmaW5lZCBpbiBvbmUKLSAgIG9mIHRoZSBjb21waWxhdGlvbnMuICBGSVhNRTogVGhpcyBpcyBjb25mdXNpbmcgYW5kIHdlaXJkLiAgQWxzbywKLSAgIEJGRCBzaG91bGQgbm90IHVzZSBnbG9iYWwgdmFyaWFibGVzLiAgKi8KLWV4dGVybiBiZmQqIGJmZF9vZl90b2Nfb3duZXI7Ci1leHRlcm4gbG9uZyBpbnQgZ2xvYmFsX3RvY19zaXplOwotCi1leHRlcm4gbG9uZyBpbnQgaW1wb3J0X3RhYmxlX3NpemU7Ci1leHRlcm4gbG9uZyBpbnQgZmlyc3RfdGh1bmtfYWRkcmVzczsKLWV4dGVybiBsb25nIGludCB0aHVua19zaXplOwotCi1lbnVtIHRvY190eXBlCi17Ci0gIGRlZmF1bHRfdG9jLAotICB0b2NfMzIsCi0gIHRvY182NAotfTsKLQotZW51bSByZWZfY2F0ZWdvcnkKLXsKLSAgcHJpdiwKLSAgcHViLAotICBkYXRhCi19OwotCi1zdHJ1Y3QgbGlzdF9lbGUKLXsKLSAgc3RydWN0IGxpc3RfZWxlICpuZXh0OwotICBiZmRfdm1hIGFkZHI7Ci0gIGVudW0gcmVmX2NhdGVnb3J5IGNhdDsKLSAgaW50IG9mZnNldDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgbGlzdF9lbGUgKmhlYWQ7Ci1leHRlcm4gc3RydWN0IGxpc3RfZWxlICp0YWlsOwotCi1zdGF0aWMgdm9pZCByZWNvcmRfdG9jCi0gIFBBUkFNUyAoKGFzZWN0aW9uICosIGludCwgZW51bSByZWZfY2F0ZWdvcnksIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotcmVjb3JkX3RvYyAodG9jX3NlY3Rpb24sIG91cl90b2Nfb2Zmc2V0LCBjYXQsIG5hbWUpCi0gICAgIGFzZWN0aW9uICp0b2Nfc2VjdGlvbjsKLSAgICAgaW50IG91cl90b2Nfb2Zmc2V0OwotICAgICBlbnVtIHJlZl9jYXRlZ29yeSBjYXQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIC8qIGFkZCB0aGlzIGVudHJ5IHRvIG91ciB0b2MgYWRkci1vZmZzZXQtbmFtZSBsaXN0ICovCi0gIHN0cnVjdCBsaXN0X2VsZSAqdDsKLSAgdCA9IChzdHJ1Y3QgbGlzdF9lbGUgKikgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbGlzdF9lbGUpKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICBhYm9ydCAoKTsKLSAgdC0+bmV4dCA9IDA7Ci0gIHQtPm9mZnNldCA9IG91cl90b2Nfb2Zmc2V0OwotICB0LT5uYW1lID0gbmFtZTsKLSAgdC0+Y2F0ID0gY2F0OwotICB0LT5hZGRyID0gdG9jX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyBvdXJfdG9jX29mZnNldDsKLQotICBpZiAoaGVhZCA9PSAwKQotICAgIHsKLSAgICAgIGhlYWQgPSB0OwotICAgICAgdGFpbCA9IHQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdGFpbC0+bmV4dCA9IHQ7Ci0gICAgICB0YWlsID0gdDsKLSAgICB9Ci19Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLQotc3RhdGljIGJvb2xlYW4gcHBjX3JlY29yZF90b2NfZW50cnkKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosIGludCwgZW51bSB0b2NfdHlwZSkpOwotc3RhdGljIHZvaWQgcHBjX21hcmtfc3ltYm9sX2FzX2dsdWUKLSAgUEFSQU1TICgoYmZkICosIGludCwgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLQotLyogcmVjb3JkIGEgdG9jIG9mZnNldCBhZ2FpbnN0IGEgc3ltYm9sICovCi1zdGF0aWMgYm9vbGVhbgotcHBjX3JlY29yZF90b2NfZW50cnkoYWJmZCwgaW5mbywgc2VjLCBzeW0sIHRvY19raW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBpbnQgc3ltOwotICAgICBlbnVtIHRvY190eXBlIHRvY19raW5kOwotewotICBzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGludCAqbG9jYWxfc3ltczsKLQotICBoID0gMDsKLQotICBoID0gKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikgKG9ial9jb2ZmX3N5bV9oYXNoZXMgKGFiZmQpW3N5bV0pOwotICBpZiAoaCAhPSAwKQotICAgIHsKLSAgICAgIEhBU0hfQ0hFQ0soaCk7Ci0gICAgfQotCi0gIGlmIChoID09IDApIAotICAgIHsgCi0gICAgICBsb2NhbF9zeW1zID0gb2JqX2NvZmZfbG9jYWxfdG9jX3RhYmxlKGFiZmQpOwotICAgICAgaWYgKGxvY2FsX3N5bXMgPT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQkgIC8qIGFsbG9jYXRlIGEgdGFibGUgKi8KLQkgIGxvY2FsX3N5bXMgPSAKLQkgICAgKGludCAqKSBiZmRfemFsbG9jIChhYmZkLCAKLQkJCQlvYmpfcmF3X3N5bWVudF9jb3VudChhYmZkKSAqIHNpemVvZihpbnQpKTsKLQkgIGlmIChsb2NhbF9zeW1zID09IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIG9ial9jb2ZmX2xvY2FsX3RvY190YWJsZShhYmZkKSA9IGxvY2FsX3N5bXM7Ci0JICBmb3IgKGkgPSAwOyBpIDwgb2JqX3Jhd19zeW1lbnRfY291bnQoYWJmZCk7ICsraSkKLQkgICAgewotCSAgICAgIFNFVF9VTkFMTE9DQVRFRChsb2NhbF9zeW1zW2ldKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKElTX1VOQUxMT0NBVEVEKGxvY2FsX3N5bXNbc3ltXSkpIAotCXsKLQkgIGxvY2FsX3N5bXNbc3ltXSA9IGdsb2JhbF90b2Nfc2l6ZTsKLQkgIGdsb2JhbF90b2Nfc2l6ZSArPSA0OwotCi0JICAvKiBUaGUgc2l6ZSBtdXN0IGZpdCBpbiBhIDE2Yml0IGRpc3BsYWNtZW50ICovCi0JICBpZiAoZ2xvYmFsX3RvY19zaXplID4gNjU1MzUpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRPQyBvdmVyZmxvdyIpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90b29fYmlnKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQotICAgICAgLyogY2hlY2sgdG8gc2VlIGlmIHRoZXJlJ3MgYSB0b2Mgc2xvdCBhbGxvY2F0ZWQuIElmIG5vdCwgZG8gaXQKLQkgaGVyZS4gSXQgd2lsbCBiZSB1c2VkIGluIHJlbG9jYXRlX3NlY3Rpb24gKi8KLSAgICAgIGlmIChJU19VTkFMTE9DQVRFRChoLT50b2Nfb2Zmc2V0KSkKLQl7Ci0JICBoLT50b2Nfb2Zmc2V0ID0gZ2xvYmFsX3RvY19zaXplOwotCSAgZ2xvYmFsX3RvY19zaXplICs9IDQ7Ci0KLQkgIC8qIFRoZSBzaXplIG11c3QgZml0IGluIGEgMTZiaXQgZGlzcGxhY21lbnQgKi8KLQkgIGlmIChnbG9iYWxfdG9jX3NpemUgPj0gNjU1MzUpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRPQyBvdmVyZmxvdyIpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90b29fYmlnKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiByZWNvcmQgYSB0b2Mgb2Zmc2V0IGFnYWluc3QgYSBzeW1ib2wgKi8KLXN0YXRpYyB2b2lkCi1wcGNfbWFya19zeW1ib2xfYXNfZ2x1ZShhYmZkLCBzeW0sIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgc3ltOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLXsKLSAgc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBoID0gKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikgKG9ial9jb2ZmX3N5bV9oYXNoZXMgKGFiZmQpW3N5bV0pOwotCi0gIEhBU0hfQ0hFQ0soaCk7Ci0KLSAgaC0+c3ltYm9sX2lzX2dsdWUgPSAxOwotICBoLT5nbHVlX2luc24gPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgJnJlbC0+cl92YWRkcik7Ci0KLSAgcmV0dXJuOwotfQotCi0jZW5kaWYgLyogQ09GRl9JTUFHRV9XSVRIX1BFICovCi0MCi0KLS8qIFJldHVybiB0cnVlIGlmIHRoaXMgcmVsb2NhdGlvbiBzaG91bGQKLSAgIGFwcGVhciBpbiB0aGUgb3V0cHV0IC5yZWxvYyBzZWN0aW9uLiAqLwotCi1zdGF0aWMgYm9vbGVhbiBpbl9yZWxvY19wKGFiZmQsIGhvd3RvKQotICAgICBiZmQgKiBhYmZkOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLXsKLSAgcmV0dXJuIAotICAgICghIGhvd3RvLT5wY19yZWxhdGl2ZSkgCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19BRERSMzJOQikKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2KQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfSU1HTFVFKQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfSUZHTFVFKSAKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1NFQ1JFTCkKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1NFQ1RJT04pCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19TRUNSRUwxNikKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1JFRkhJKQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfUkVGTE8pCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19QQUlSKQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTikgOwotfSAgICAgCi0KLSNpZiAwCi0KLS8qIHRoaXMgZnVuY3Rpb24gaXMgaW4gY2hhcmdlIG9mIHBlcmZvcm1pbmcgYWxsIHRoZSBwcGMgUEUgcmVsb2NhdGlvbnMgKi8KLS8qIERvbid0IHlldCBrbm93IGlmIHdlIHdhbnQgdG8gZG8gdGhpcyB0aGlzIHBhcnRpY3VsYXIgd2F5IC4uLiAoa3JrKSAgKi8KLS8qIEZJWE1FOiAoaXQgaXMgbm90IHlldCBlbmFibGVkKSAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wZV9wcGNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIHRoZSBjb25zdGggcmVsb2NhdGlvbiBjb21lcyBpbiB0d28gcGFydHMsIHdlIGhhdmUgdG8gcmVtZW1iZXIKLSAgICAgdGhlIHN0YXRlIGJldHdlZW4gY2FsbHMsIGluIHRoZXNlIHZhcmlhYmxlcyAqLwotICBzdGF0aWMgYm9vbGVhbiBwYXJ0MV9jb25zdGhfYWN0aXZlID0gZmFsc2U7Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBhcnQxX2NvbnN0aF92YWx1ZTsKLQotICB1bnNpZ25lZCBsb25nIHN5bV92YWx1ZTsKLSAgdW5zaWduZWQgc2hvcnQgcl90eXBlOwotICB1bnNpZ25lZCBsb25nIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzcyA7IC8qKyBpbnB1dF9zZWN0aW9uLT52bWEqLwotCQotICByX3R5cGUgPSByZWxvY19lbnRyeS0+aG93dG8tPnR5cGU7Ci0KLSAgaWYgKG91dHB1dF9iZmQpIAotICAgIHsKLSAgICAgIC8qIFBhcnRpYWwgbGlua2luZyAtIGRvIG5vdGhpbmcgKi8KLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOyAKLSAgICB9Ci0KLSAgaWYgKHN5bWJvbF9pbiAhPSBOVUxMCi0gICAgICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9pbi0+c2VjdGlvbikpCi0gICAgewotICAgICAgLyogS2VlcCB0aGUgc3RhdGUgbWFjaGluZSBoYXBweSBpbiBjYXNlIHdlJ3JlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgaWYgKHJfdHlwZSA9PSBJTUFHRV9SRUxfUFBDX1JFRkhJKSAKLQl7Ci0JICBwYXJ0MV9jb25zdGhfYWN0aXZlID0gdHJ1ZTsKLQkgIHBhcnQxX2NvbnN0aF92YWx1ZSAgPSAwOwotCX0KLSAgICAgIHJldHVybihiZmRfcmVsb2NfdW5kZWZpbmVkKTsKLSAgICB9Ci0gIAotICBpZiAoKHBhcnQxX2NvbnN0aF9hY3RpdmUpICYmIChyX3R5cGUgIT0gSU1BR0VfUkVMX1BQQ19QQUlSKSkgCi0gICAgewotICAgICAgcGFydDFfY29uc3RoX2FjdGl2ZSA9IGZhbHNlOwotICAgICAgKmVycm9yX21lc3NhZ2UgPSAoY2hhciAqKSBfKCJNaXNzaW5nIFBBSVIiKTsKLSAgICAgIHJldHVybihiZmRfcmVsb2NfZGFuZ2Vyb3VzKTsKLSAgICB9Ci0KLQotICBzeW1fdmFsdWUgPSBnZXRfc3ltYm9sX3ZhbHVlKHN5bWJvbF9pbik7Ci0gIAotICByZXR1cm4oYmZkX3JlbG9jX29rKTsJCi19Ci0KLSNlbmRpZiAvKiAwICovCi0KLS8qIFRoZSByZWxvYyBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIHRoZSBvcHRpbWl6ZWQgQ09GRiBsaW5rZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsZW5kOwotICBib29sZWFuIGhpaGFsZjsKLSAgYmZkX3ZtYSBoaWhhbGZfdmFsOwotICBhc2VjdGlvbiAqdG9jX3NlY3Rpb24gPSAwOwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gMDsKLSAgCi0gIC8qIElmIHdlIGFyZSBwZXJmb3JtaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdlIGRvbid0IG5lZWQgdG8gZG8gYQotICAgICB0aGluZy4gIFRoZSBjYWxsZXIgd2lsbCB0YWtlIGNhcmUgb2YgYWRqdXN0aW5nIHRoZSByZWxvYwotICAgICBhZGRyZXNzZXMgYW5kIHN5bWJvbCBpbmRpY2VzLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIGhpaGFsZiA9IGZhbHNlOwotICBoaWhhbGZfdmFsID0gMDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgICBiZmRfdm1hIHZhbDsKLQotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJmZF9ieXRlICpsb2M7Ci0KLSAgICAgIHVuc2lnbmVkIHNob3J0IHJfdHlwZSAgPSBFWFRSQUNUX1RZUEUgKHJlbC0+cl90eXBlKTsKLSAgICAgIHVuc2lnbmVkIHNob3J0IHJfZmxhZ3MgPSBFWFRSQUNUX0ZMQUdTKHJlbC0+cl90eXBlKTsKLSAgCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotICAgICAgbG9jID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIC8qIEZJWE1FOiBjaGVjayBib3VuZHMgb24gcl90eXBlICovCi0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotCi0gICAgICBpZiAoc3ltbmR4ID09IC0xKQotCXsKLQkgIGggPSBOVUxMOwotCSAgc3ltID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICopIAotCSAgICAob2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdKTsKLQkgIGlmIChoICE9IDApIAotCSAgICB7Ci0JICAgICAgSEFTSF9DSEVDSyhoKTsKLQkgICAgfQotCi0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCX0KLQotICAgICAgaWYgKHJfdHlwZSA9PSBJTUFHRV9SRUxfUFBDX0lNR0xVRSAmJiBoID09IDApCi0JewotCSAgLyogQW4gSU1HTFVFIHJlbG9jIG11c3QgaGF2ZSBhIG5hbWUuIFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiAqLwotCSAgYWJvcnQoKTsKLQl9Ci0KLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICB2YWwgPSAwOwotCi0gICAgICAvKiBGSVhNRTogUEFJUiB1bnN1cHBvcnRlZCBpbiB0aGUgZm9sbG93aW5nIGNvZGUgKi8KLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0JICAgICAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyBzeW0tPm5fdmFsdWUpOwotCSAgICAgIGlmICghIG9ial9wZSAob3V0cHV0X2JmZCkpCi0JCXZhbCAtPSBzZWMtPnZtYTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBIQVNIX0NIRUNLKGgpOwotCi0JICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgdmFsID0gKGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICByc3RhdCA9IGJmZF9yZWxvY19vazsKLSAgICAgIAotICAgICAgLyogRWFjaCBjYXNlIG11c3QgZG8gaXRzIG93biByZWxvY2F0aW9uLCBzZXR0aW5nIHJzdGF0IGFwcHJvcHJpYXRlbHkgKi8KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlIDB4JTAyeCIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgcl90eXBlKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCWNhc2UgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjoKLQkgIHsKLQkgICAgYmZkX3ZtYSBvdXJfdG9jX29mZnNldDsKLQkgICAgaW50IGZpeGl0OwotCi0JICAgIERVTVBfUkVMT0MyKGhvd3RvLT5uYW1lLCByZWwpOwotCi0JICAgIGlmICh0b2Nfc2VjdGlvbiA9PSAwKSAKLQkgICAgICB7Ci0JCXRvY19zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGJmZF9vZl90b2Nfb3duZXIsIAotCQkJCQkJICAgICAgIFRPQ19TRUNUSU9OX05BTUUpOwotCi0JCWlmICggdG9jX3NlY3Rpb24gPT0gTlVMTCApIAotCQkgIHsKLQkJICAgIC8qIFRoZXJlIGlzIG5vIHRvYyBzZWN0aW9uLiBTb21ldGhpbmcgaXMgdmVyeSB3cm9uZy4gKi8KLQkJICAgIGFib3J0KCk7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICAvKiAKLQkgICAgICogIEFtYXppbmcgYml0IHRyaWNrcyBwcmVzZW50LiBBcyB3ZSBtYXkgaGF2ZSBzZWVuIGVhcmxpZXIsIHdlCi0JICAgICAqICB1c2UgdGhlIDEgYml0IHRvIHRlbGwgdXMgd2hldGhlciBvciBub3QgYSB0b2Mgb2Zmc2V0IGhhcyBiZWVuCi0JICAgICAqICBhbGxvY2F0ZWQuIE5vdyB0aGF0IHRoZXkndmUgYWxsIGJlZW4gYWxsb2NhdGVkLCB3ZSB3aWxsIHVzZQotCSAgICAgKiAgdGhlIDEgYml0IHRvIHRlbGwgdXMgaWYgd2UndmUgd3JpdHRlbiB0aGlzIHBhcnRpY3VsYXIgdG9jCi0JICAgICAqICBlbnRyeSBvdXQuCi0JICAgICAqLwotCSAgICBmaXhpdCA9IGZhbHNlOwotCSAgICBpZiAoaCA9PSAwKQotCSAgICAgIHsgLyogaXQgaXMgYSBmaWxlIGxvY2FsIHN5bWJvbCAqLwotCQlpbnQgKmxvY2FsX3RvY190YWJsZTsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlzeW0gPSBzeW1zICsgc3ltbmR4OwotCQluYW1lID0gc3ltLT5fbi5fbl9uYW1lOwotCi0JCWxvY2FsX3RvY190YWJsZSA9IG9ial9jb2ZmX2xvY2FsX3RvY190YWJsZShpbnB1dF9iZmQpOwotCQlvdXJfdG9jX29mZnNldCA9IGxvY2FsX3RvY190YWJsZVtzeW1uZHhdOwotCi0JCWlmIChJU19XUklUVEVOKG91cl90b2Nfb2Zmc2V0KSkKLQkJICB7Ci0JCSAgICAvKiBpZiBpdCBoYXMgYmVlbiB3cml0dGVuIG91dCwgaXQgaXMgbWFya2VkIHdpdGggdGhlIAotCQkgICAgICAgMSBiaXQuIEZpeCB1cCBvdXIgb2Zmc2V0LCBidXQgZG8gbm90IHdyaXRlIGl0IG91dAotCQkgICAgICAgYWdhaW4uCi0JCSAgICAgKi8KLQkJICAgIE1BS0VfQUREUl9BR0FJTihvdXJfdG9jX29mZnNldCk7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgLyogd3JpdGUgb3V0IHRoZSB0b2MgZW50cnkgKi8KLQkJICAgIHJlY29yZF90b2ModG9jX3NlY3Rpb24sIAotCQkJICAgICAgIG91cl90b2Nfb2Zmc2V0LCAKLQkJCSAgICAgICBwcml2LCAKLQkJCSAgICAgICBzdHJkdXAobmFtZSkpOwotCi0JCSAgICBiZmRfcHV0XzMyKG91dHB1dF9iZmQsCi0JCQkgICAgICAgdmFsLAotCQkJICAgICAgIHRvY19zZWN0aW9uLT5jb250ZW50cyArIG91cl90b2Nfb2Zmc2V0KTsKLQotCQkgICAgTUFSS19BU19XUklUVEVOKGxvY2FsX3RvY190YWJsZVtzeW1uZHhdKTsKLQkJICAgIGZpeGl0ID0gdHJ1ZTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCQlvdXJfdG9jX29mZnNldCA9IGgtPnRvY19vZmZzZXQ7Ci0KLQkJaWYgKChyX2ZsYWdzICYgSU1BR0VfUkVMX1BQQ19UT0NERUZOKSAKLQkJICAgID09IElNQUdFX1JFTF9QUENfVE9DREVGTiApCi0JCSAgewotCQkgICAgLyogVGhpcyBpcyB1bmJlbGlldmFibGUgY2hlZXNlLiBTb21lIGtub3dsZWRnYWJsZSBhc20gCi0JCSAgICAgICBoYWNrZXIgaGFzIGRlY2lkZWQgdG8gdXNlIHIyIGFzIGEgYmFzZSBmb3IgbG9hZGluZyAKLQkJICAgICAgIGEgdmFsdWUuIEhlL1NoZSBkb2VzIHRoaXMgYnkgc2V0dGluZyB0aGUgdG9jZGVmbiBiaXQsIAotCQkgICAgICAgYW5kIG5vdCBzdXBwbHlpbmcgYSB0b2MgZGVmaW5pdGlvbi4gVGhlIGJlaGF2aW91ciBpcyAKLQkJICAgICAgIHRoZW4gdG8gdXNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHZhbHVlIG9mIHRoZSAKLQkJICAgICAgIHN5bWJvbCBhbmQgdGhlIGFjdHVhbCBsb2NhdGlvbiBvZiB0aGUgdG9jIGFzIHRoZSB0b2MgCi0JCSAgICAgICBpbmRleC4gCi0KLQkJICAgICAgIEluIGZhY3QsIHdoYXQgaXMgdXN1YWxseSBoYXBwZW5pbmcgaXMsIGJlY2F1c2UgdGhlCi0JCSAgICAgICBJbXBvcnQgQWRkcmVzcyBUYWJsZSBpcyBtYXBwZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nCi0JCSAgICAgICB0aGUgdG9jLCBzb21lIHRyaXBweSBsaWJyYXJ5IGNvZGUgdHJ5aW5nIGZvciBzcGVlZCBvbgotCQkgICAgICAgZGxsIGxpbmthZ2UsIHRha2VzIGFkdmFudGFnZSBvZiB0aGF0IGFuZCBjb25zaWRlcnMgCi0JCSAgICAgICB0aGUgSUFUIHRvIGJlIHBhcnQgb2YgdGhlIHRvYywgdGh1cyBzYXZpbmcgYSBsb2FkLgotCQkgICAgKi8KLQotCQkgICAgb3VyX3RvY19vZmZzZXQgPSB2YWwgLSAKLQkJICAgICAgKHRvY19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgCi0JCSAgICAgICB0b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkJICAgIC8qIFRoZSBzaXplIG11c3Qgc3RpbGwgZml0IGluIGEgMTZiaXQgZGlzcGxhY21lbnQgKi8KLQkJICAgIGlmIChvdXJfdG9jX29mZnNldCA+PSA2NTUzNSkKLQkJICAgICAgewotCQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkgIChfKCIlczogUmVsb2NhdGlvbiBmb3IgJXMgb2YgJXggZXhjZWVkcyBUb2Mgc2l6ZSBsaW1pdCIpLCAKLQkJCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIG5hbWUsIG91cl90b2Nfb2Zmc2V0KTsKLQkJCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICB9Ci0KLQkJICAgIHJlY29yZF90b2ModG9jX3NlY3Rpb24sIG91cl90b2Nfb2Zmc2V0LCBwdWIsIHN0cmR1cChuYW1lKSk7Ci0JCSAgfQotCQllbHNlIGlmIChJU19XUklUVEVOKG91cl90b2Nfb2Zmc2V0KSkKLQkJICB7Ci0JCSAgICAvKiBpZiBpdCBoYXMgYmVlbiB3cml0dGVuIG91dCwgaXQgaXMgbWFya2VkIHdpdGggdGhlIAotCQkgICAgICAgMSBiaXQuIEZpeCB1cCBvdXIgb2Zmc2V0LCBidXQgZG8gbm90IHdyaXRlIGl0IG91dAotCQkgICAgICAgYWdhaW4uCi0JCSAgICAgKi8KLQkJICAgIE1BS0VfQUREUl9BR0FJTihvdXJfdG9jX29mZnNldCk7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgcmVjb3JkX3RvYyh0b2Nfc2VjdGlvbiwgb3VyX3RvY19vZmZzZXQsIHB1Yiwgc3RyZHVwKG5hbWUpKTsKLQotCQkgICAgLyogd3JpdGUgb3V0IHRoZSB0b2MgZW50cnkgKi8KLQkJICAgIGJmZF9wdXRfMzIob3V0cHV0X2JmZCwKLQkJCSAgICAgICB2YWwsCi0JCQkgICAgICAgdG9jX3NlY3Rpb24tPmNvbnRlbnRzICsgb3VyX3RvY19vZmZzZXQpOwotCi0JCSAgICBNQVJLX0FTX1dSSVRURU4oaC0+dG9jX29mZnNldCk7Ci0JCSAgICAvKiBUaGUgdHJpY2t5IHBhcnQgaXMgdGhhdCB0aGlzIGlzIHRoZSBhZGRyZXNzIHRoYXQgKi8KLQkJICAgIC8qIG5lZWRzIGEgLnJlbG9jIGVudHJ5IGZvciBpdCAqLwotCQkgICAgZml4aXQgPSB0cnVlOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgaWYgKGZpeGl0ICYmIGluZm8tPmJhc2VfZmlsZSkgCi0JICAgICAgewotCQkvKiBTbyBpZiB0aGlzIGlzIG5vbiBwY3JlbGF0aXZlLCBhbmQgaXMgcmVmZXJlbmNlZAotCQkgICB0byBhIHNlY3Rpb24gb3IgYSBjb21tb24gc3ltYm9sLCB0aGVuIGl0IG5lZWRzIGEgcmVsb2MgKi8KLQotCQkvKiByZWxvY2F0aW9uIHRvIGEgc3ltYm9sIGluIGEgc2VjdGlvbiB3aGljaAotCQkgICBpc24ndCBhYnNvbHV0ZSAtIHdlIG91dHB1dCB0aGUgYWRkcmVzcyBoZXJlIAotCQkgICB0byBhIGZpbGUgKi8KLQotCQliZmRfdm1hIGFkZHIgPSAgdG9jX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICArIHRvY19zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsgb3VyX3RvY19vZmZzZXQ7Ci0JCSAgICAKLQkJaWYgKGNvZmZfZGF0YShvdXRwdXRfYmZkKS0+cGUpCi0JCSAgYWRkciAtPSBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotCi0JCWZ3cml0ZSAoJmFkZHIsIDEsNCwgKEZJTEUgKikgaW5mby0+YmFzZV9maWxlKTsKLQkgICAgICB9Ci0KLQotCSAgICAvKiBGSVhNRTogdGhpcyB0ZXN0IGlzIGNvbnNlcnZhdGl2ZSAqLwotCSAgICBpZiAoIChyX2ZsYWdzICYgSU1BR0VfUkVMX1BQQ19UT0NERUZOKSAhPSBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4gJiYKLQkJb3VyX3RvY19vZmZzZXQgPiB0b2Nfc2VjdGlvbi0+X3Jhd19zaXplKQotCSAgICAgIHsKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgKF8oIiVzOiBSZWxvY2F0aW9uIGV4Y2VlZHMgYWxsb2NhdGVkIFRPQyAoJXgpIiksIAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkgICB0b2Nfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgLyogTm93IHdlIGtub3cgdGhlIHJlbG9jYXRpb24gZm9yIHRoaXMgdG9jIHJlZmVyZW5jZSAqLwotCSAgICByZWxvY2F0aW9uID0gIG91cl90b2Nfb2Zmc2V0ICsgVE9DX0xPQURfQURKVVNUTUVOVDsKLQkgICAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywKLQkJCQkJICAgIGlucHV0X2JmZCwgCi0JCQkJCSAgICByZWxvY2F0aW9uLCAKLQkJCQkJICAgIGxvYyk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIElNQUdFX1JFTF9QUENfSUZHTFVFOgotCSAgewotCSAgICAvKiBUbyBzb2x2ZSB0aGlzLCB3ZSBuZWVkIHRvIGtub3cgd2hldGhlciBvciBub3QgdGhlIHN5bWJvbCAqLwotCSAgICAvKiBhcHBlYXJpbmcgb24gdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gaXMgYSBnbHVlIGZ1bmN0aW9uIG9yIG5vdC4gKi8KLQkgICAgLyogQSBnbHVlIGZ1bmN0aW9uIG11c3QgYW5ub3VuY2UgaXRzZWxmIHZpYSBhIElNR0xVRSByZWxvYywgYW5kICovCi0JICAgIC8qIHRoZSByZWxvYyBjb250YWlucyB0aGUgcmVxdWlyZWQgdG9jIHJlc3RvcmUgaW5zdHJ1Y3Rpb24gKi8KLQkgIAotCSAgICBiZmRfdm1hIHg7Ci0JICAgIGNvbnN0IGNoYXIgKm15X25hbWU7Ci0JICAgIERVTVBfUkVMT0MyKGhvd3RvLT5uYW1lLCByZWwpOwotCi0JICAgIGlmIChoICE9IDApCi0JICAgICAgewotCQlteV9uYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCQlpZiAoaC0+c3ltYm9sX2lzX2dsdWUgPT0gMSkgCi0JCSAgewotCQkgICAgeCA9IGJmZF9nZXRfMzIoaW5wdXRfYmZkLCBsb2MpOwotCQkgICAgYmZkX3B1dF8zMihpbnB1dF9iZmQsIGgtPmdsdWVfaW5zbiwgbG9jKTsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX1NFQ1JFTDoKLQkgIC8qIFVuaW1wbGVtZW50ZWQ6IGNvZGV2aWV3IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAqLwotCSAgLyogRm9yIGZhc3QgYWNjZXNzIHRvIHRoZSBoZWFkZXIgb2YgdGhlIHNlY3Rpb24gCi0JICAgICBjb250YWluaW5nIHRoZSBpdGVtLiAqLwotCSAgYnJlYWs7Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX1NFQ1RJT046Ci0JICAvKiBVbmltcGxlbWVudGVkOiBjb2RldmlldyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKi8KLQkgIC8qIElzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdmFsdWUgc2hvdWxkIGJlIHJlbGF0aXZlCi0JICAgICB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlCi0JICAgICBzeW1ib2wgKi8KLQkgIGJyZWFrOwotCWNhc2UgSU1BR0VfUkVMX1BQQ19BQlNPTFVURToKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbXlfbmFtZTsKLQkgICAgaWYgKGggPT0gMCkKLQkJbXlfbmFtZSA9IChzeW1zK3N5bW5keCktPl9uLl9uX25hbWU7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW15X25hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgICAgfQotCi0JICAgIGZwcmludGYoc3RkZXJyLCAKLQkJICAgIF8oIldhcm5pbmc6IHVuc3VwcG9ydGVkIHJlbG9jICVzIDxmaWxlICVzLCBzZWN0aW9uICVzPlxuIiksIAotCQkgICAgaG93dG8tPm5hbWUsCi0JCSAgICBiZmRfZ2V0X2ZpbGVuYW1lKGlucHV0X2JmZCksCi0JCSAgICBpbnB1dF9zZWN0aW9uLT5uYW1lKTsKLQotCSAgICBmcHJpbnRmKHN0ZGVyciwic3ltICVsZCAoJXMpLCByX3ZhZGRyICVsZCAoJWx4KVxuIiwgCi0JCSAgICByZWwtPnJfc3ltbmR4LCBteV9uYW1lLCAobG9uZykgcmVsLT5yX3ZhZGRyLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl92YWRkcik7ICAKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgSU1BR0VfUkVMX1BQQ19JTUdMVUU6Ci0JICB7Ci0JICAgIC8qIFRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gbm93LiBUaGlzIHJlbG9jIHdhcyBub3RlZCBpbiB0aGUgZmlyc3QKLQkgICAgICAgcGFzcyBvdmVyIHRoZSByZWxvY3MsIGFuZCB0aGUgZ2x1ZSBpbnN0cnVjdGlvbiBleHRyYWN0ZWQgKi8KLQkgICAgY29uc3QgY2hhciAqbXlfbmFtZTsKLQkgICAgaWYgKGgtPnN5bWJvbF9pc19nbHVlID09IDEpIAotCSAgICAgIGJyZWFrOwotCSAgICBteV9uYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCi0JICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgIChfKCIlczogT3V0IG9mIG9yZGVyIElNR0xVRSByZWxvYyBmb3IgJXMiKSwgCi0JICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIG15X25hbWUpOwotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCi0JY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMk5COgotCSAgewotCSAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKm15aCA9IDA7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWUgPSAwOwotCSAgICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKLQotCSAgICBpZiAoc3RybmNtcCgiLmlkYXRhJDIiLGlucHV0X3NlY3Rpb24tPm5hbWUsOCkgPT0gMCAmJiBmaXJzdF90aHVua19hZGRyZXNzID09IDApCi0JICAgICAgewotCQkvKiBzZXQgbWFnaWMgdmFsdWVzICovCi0JCWludCBpZGF0YTVvZmZzZXQ7Ci0JCXN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqbXloID0gMDsKLQkJbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkgICAgICJfX2lkYXRhNV9tYWdpY19fIiwKLQkJCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlmaXJzdF90aHVua19hZGRyZXNzID0gbXloLT5yb290LnUuZGVmLnZhbHVlICsgCi0JCSAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgCi0JCSAgICBzZWMtPm91dHB1dF9vZmZzZXQgLSAKLQkJICAgICAgcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQkJCi0JCWlkYXRhNW9mZnNldCA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkgICAgICJfX2lkYXRhNl9tYWdpY19fIiwKLQkJCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkKLQkJdGh1bmtfc2l6ZSA9IG15aC0+cm9vdC51LmRlZi52YWx1ZSAtIGlkYXRhNW9mZnNldDsKLQkJbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkgICAgICJfX2lkYXRhNF9tYWdpY19fIiwKLQkJCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlpbXBvcnRfdGFibGVfc2l6ZSA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGggPT0gMCkKLQkgICAgICB7IC8qIGl0IGlzIGEgZmlsZSBsb2NhbCBzeW1ib2wgKi8KLQkJc3ltID0gc3ltcyArIHN5bW5keDsKLQkJbmFtZSA9IHN5bS0+X24uX25fbmFtZTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWNoYXIgKnRhcmdldCA9IDA7Ci0KLQkJbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkJaWYgKHN0cmNtcCgiLmlkYXRhJDIiLCBuYW1lKSA9PSAwKQotCQkgIHRhcmdldCA9ICJfX2lkYXRhMl9tYWdpY19fIjsKLQkJZWxzZSBpZiAoc3RyY21wKCIuaWRhdGEkNCIsIG5hbWUpID09IDApCi0JCSAgdGFyZ2V0ID0gIl9faWRhdGE0X21hZ2ljX18iOwotCQllbHNlIGlmIChzdHJjbXAoIi5pZGF0YSQ1IiwgbmFtZSkgPT0gMCkKLQkJICB0YXJnZXQgPSAiX19pZGF0YTVfbWFnaWNfXyI7Ci0KLQkJaWYgKHRhcmdldCAhPSAwKQotCQkgIHsKLQkJICAgIG15aCA9IDA7Ci0KLQkJICAgIG15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSB0YXJnZXQsCi0JCQkJCQkgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJICAgIGlmIChteWggPT0gMCkgCi0JCSAgICAgIHsKLQkJCS8qIE1pc3NpbmcgbWFnaWMgY29va2llcy4gU29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuICovCi0JCQlhYm9ydCgpOwotCQkgICAgICB9Ci0JCSAgICAKLQkJICAgIHZhbCA9IG15aC0+cm9vdC51LmRlZi52YWx1ZSArIAotCQkgICAgICBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0JCSAgICBpZiAoZmlyc3RfdGh1bmtfYWRkcmVzcyA9PSAwKQotCQkgICAgICB7Ci0JCQlpbnQgaWRhdGE1b2Zmc2V0OwotCQkJbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgICAiX19pZGF0YTVfbWFnaWNfXyIsCi0JCQkJCQkgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlmaXJzdF90aHVua19hZGRyZXNzID0gbXloLT5yb290LnUuZGVmLnZhbHVlICsgCi0JCQkgIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIAotCQkJICAgIHNlYy0+b3V0cHV0X29mZnNldCAtIAotCQkJICAgICAgcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQkJCQotCQkJaWRhdGE1b2Zmc2V0ID0gbXloLT5yb290LnUuZGVmLnZhbHVlOwotCQkJbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgICAiX19pZGF0YTZfbWFnaWNfXyIsCi0JCQkJCQkgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkKLQkJCXRodW5rX3NpemUgPSBteWgtPnJvb3QudS5kZWYudmFsdWUgLSBpZGF0YTVvZmZzZXQ7Ci0JCQlteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCQkgICAgICJfX2lkYXRhNF9tYWdpY19fIiwKLQkJCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJCWltcG9ydF90YWJsZV9zaXplID0gbXloLT5yb290LnUuZGVmLnZhbHVlOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLAotCQkgICAgICAJICAgICAgaW5wdXRfYmZkLCAKLQkJCSAgICAgIHZhbCAtIAotCQkJICAgICAgcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZSwKLQkJCSAgICAgIGxvYyk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgSU1BR0VfUkVMX1BQQ19SRUwyNDoKLQkgIERVTVBfUkVMT0MyKGhvd3RvLT5uYW1lLCByZWwpOwotCSAgdmFsIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywKLQkJCQkJICBpbnB1dF9iZmQsIAotCQkJCQkgIHZhbCwgCi0JCQkJCSAgbG9jKTsKLQkgIGJyZWFrOwotCWNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMTY6Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIyNDoKLQljYXNlIElNQUdFX1JFTF9QUENfQUREUjMyOgotCSAgRFVNUF9SRUxPQzIoaG93dG8tPm5hbWUsIHJlbCk7Ci0JICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLAotCQkJCQkgIGlucHV0X2JmZCwgCi0JCQkJCSAgdmFsLCAKLQkJCQkJICBsb2MpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoIGluZm8tPmJhc2VfZmlsZSApCi0JewotCSAgLyogU28gaWYgdGhpcyBpcyBub24gcGNyZWxhdGl2ZSwgYW5kIGlzIHJlZmVyZW5jZWQKLQkgICAgIHRvIGEgc2VjdGlvbiBvciBhIGNvbW1vbiBzeW1ib2wsIHRoZW4gaXQgbmVlZHMgYSByZWxvYyAqLwotCSAgaWYgKHN5bSAmJiBwZV9kYXRhKG91dHB1dF9iZmQpLT5pbl9yZWxvY19wKG91dHB1dF9iZmQsIGhvd3RvKSkKLQkgICAgewotCSAgICAgIC8qIHJlbG9jYXRpb24gdG8gYSBzeW1ib2wgaW4gYSBzZWN0aW9uIHdoaWNoCi0JCSBpc24ndCBhYnNvbHV0ZSAtIHdlIG91dHB1dCB0aGUgYWRkcmVzcyBoZXJlIAotCQkgdG8gYSBmaWxlICovCi0JICAgICAgYmZkX3ZtYSBhZGRyID0gcmVsLT5yX3ZhZGRyIAotCQktIGlucHV0X3NlY3Rpb24tPnZtYSAKLQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0IAotCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotCSAgICAgIGlmIChjb2ZmX2RhdGEob3V0cHV0X2JmZCktPnBlKQotCQl7Ci0JCSAgYWRkciAtPSBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotCQl9Ci0JICAgICAgZndyaXRlICgmYWRkciwgMSw0LCAoRklMRSAqKSBpbmZvLT5iYXNlX2ZpbGUpOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZSBpZiAoc3ltID09IE5VTEwpCi0JICAgICAgbmFtZSA9ICIqdW5rbm93bioiOwotCSAgICBlbHNlIGlmIChzeW0tPl9uLl9uX24uX25femVyb2VzID09IDAKLQkJICAgICAmJiBzeW0tPl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCi0JICAgICAgbmFtZSA9IG9ial9jb2ZmX3N0cmluZ3MgKGlucHV0X2JmZCkgKyBzeW0tPl9uLl9uX24uX25fb2Zmc2V0OwotCSAgICBlbHNlCi0JICAgICAgewotCQlzdHJuY3B5IChidWYsIHN5bS0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotCQlidWZbU1lNTk1MRU5dID0gJ1wwJzsKLQkJbmFtZSA9IGJ1ZjsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAKLQkJICAgIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkgICAgICB7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICB9Ci0JfQotCi0gICAgfSAgICAgCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLQotLyogRklYTUU6IEJGRCBzaG91bGQgbm90IHVzZSBnbG9iYWwgdmFyaWFibGVzLiAgVGhpcyBmaWxlIGlzIGNvbXBpbGVkCi0gICB0d2ljZSwgYW5kIHRoZXNlIHZhcmlhYmxlcyBhcmUgc2hhcmVkLiAgVGhpcyBpcyBjb25mdXNpbmcgYW5kCi0gICB3ZWlyZC4gICovCi0KLWxvbmcgaW50IGdsb2JhbF90b2Nfc2l6ZSA9IDQ7Ci0KLWJmZCogYmZkX29mX3RvY19vd25lciA9IDA7Ci0KLWxvbmcgaW50IGltcG9ydF90YWJsZV9zaXplOwotbG9uZyBpbnQgZmlyc3RfdGh1bmtfYWRkcmVzczsKLWxvbmcgaW50IHRodW5rX3NpemU7Ci0KLXN0cnVjdCBsaXN0X2VsZSAqaGVhZDsKLXN0cnVjdCBsaXN0X2VsZSAqdGFpbDsKLQotc3RhdGljIGNoYXIgKgotaDEgPSBOXygiXG5cdFx0XHRUT0MgTUFQUElOR1xuXG4iKTsKLXN0YXRpYyBjaGFyICoKLWgyID0gTl8oIiBUT0MgICAgZGlzYXNzZW1ibHkgIENvbW1lbnRzICAgICAgIE5hbWVcbiIpOwotc3RhdGljIGNoYXIgKgotaDMgPSBOXygiIE9mZnNldCAgc3BlbGxpbmcgICAgICAgICAgICAgICAgICAgKGlmIHByZXNlbnQpXG4iKTsKLQotdm9pZAotZHVtcF90b2MgKHZmaWxlKQotICAgICBQVFIgdmZpbGU7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSB2ZmlsZTsKLSAgc3RydWN0IGxpc3RfZWxlICp0OwotCi0gIGZwcmludGYoZmlsZSwgXyhoMSkpOwotICBmcHJpbnRmKGZpbGUsIF8oaDIpKTsKLSAgZnByaW50ZihmaWxlLCBfKGgzKSk7Ci0KLSAgZm9yKHQgPSBoZWFkOyB0ICE9IDA7IHQ9dC0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpjYXQgPSAiIjsKLQotICAgICAgaWYgKHQtPmNhdCA9PSBwcml2KQotCWNhdCA9IF8oInByaXZhdGUgICAgICAgIik7Ci0gICAgICBlbHNlIGlmICh0LT5jYXQgPT0gcHViKQotCWNhdCA9IF8oInB1YmxpYyAgICAgICAgIik7Ci0gICAgICBlbHNlIGlmICh0LT5jYXQgPT0gZGF0YSkKLQljYXQgPSBfKCJkYXRhLWluLXRvYyAgICIpOwotCi0gICAgICBpZiAodC0+b2Zmc2V0ID4gZ2xvYmFsX3RvY19zaXplKQotCXsKLQkgIGlmICh0LT5vZmZzZXQgPD0gZ2xvYmFsX3RvY19zaXplICsgdGh1bmtfc2l6ZSkKLQkgICAgY2F0ID0gXygiSUFUIHJlZmVyZW5jZSAiKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZwcmludGYoZmlsZSwKLQkJICAgICAgXygiKioqKiBnbG9iYWxfdG9jX3NpemUgJWxkKCVseCksIHRodW5rX3NpemUgJWxkKCVseClcbiIpLAotCQkgICAgICBnbG9iYWxfdG9jX3NpemUsIGdsb2JhbF90b2Nfc2l6ZSwgdGh1bmtfc2l6ZSwgdGh1bmtfc2l6ZSk7Ci0JICAgICAgY2F0ID0gXygiT3V0IG9mIGJvdW5kcyEiKTsKLQkgICAgfQotCX0KLQotICAgICAgZnByaW50ZihmaWxlLAotCSAgICAgICIgJTA0bHggICAgKCVkKSIsICh1bnNpZ25lZCBsb25nKSB0LT5vZmZzZXQsIHQtPm9mZnNldCAtIDMyNzY4KTsKLSAgICAgIGZwcmludGYoZmlsZSwKLQkgICAgICAiICAgICVzICVzXG4iLAotCSAgICAgIGNhdCwgdC0+bmFtZSk7Ci0KLSAgICB9Ci0KLSAgZnByaW50ZihmaWxlLCAiXG4iKTsKLX0KLQotYm9vbGVhbgotcHBjX2FsbG9jYXRlX3RvY19zZWN0aW9uIChpbmZvKSAKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzOwotICBiZmRfYnl0ZSAqZm9vOwotICBzdGF0aWMgY2hhciB0ZXN0X2NoYXIgPSAnMSc7Ci0KLSAgaWYgKCBnbG9iYWxfdG9jX3NpemUgPT0gMCApIC8qIEZJWE1FOiBkb2VzIHRoaXMgZ2V0IG1lIGluIHRyb3VibGU/ICovCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9vZl90b2Nfb3duZXIgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBObyB0b2Mgb3duZXI/IFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiAqLwotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lICggYmZkX29mX3RvY19vd25lciAsIFRPQ19TRUNUSU9OX05BTUUpOwotICBpZiAocyA9PSBOVUxMKSAKLSAgICB7Ci0gICAgICAvKiBObyB0b2Mgc2VjdGlvbj8gU29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuICovCi0gICAgICBhYm9ydCgpOwotICAgIH0KLQotICBmb28gPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jKGJmZF9vZl90b2Nfb3duZXIsIGdsb2JhbF90b2Nfc2l6ZSk7Ci0gIG1lbXNldChmb28sIHRlc3RfY2hhciwgZ2xvYmFsX3RvY19zaXplKTsKLQotICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxfdG9jX3NpemU7Ci0gIHMtPmNvbnRlbnRzID0gZm9vOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1wcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppLCAqcmVsOwotCi0gIC8qIGhlcmUgd2UgaGF2ZSBhIGJmZCB0aGF0IGlzIHRvIGJlIGluY2x1ZGVkIG9uIHRoZSBsaW5rLiBXZSBoYXZlIGEgaG9vawotICAgICB0byBkbyByZWxvYyBydW1tYWdpbmcsIGJlZm9yZSBzZWN0aW9uIHNpemVzIGFyZSBuYWlsZWQgZG93bi4gKi8KLQotICBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMoYWJmZCk7Ci0KLSAgLyogcnVtbWFnZSBhcm91bmQgYWxsIHRoZSByZWxvY3MgYW5kIG1hcCB0aGUgdG9jICovCi0gIHNlYyA9IGFiZmQtPnNlY3Rpb25zOwotCi0gIGlmIChzZWMgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgZm9yICg7IHNlYyAhPSAwOyBzZWMgPSBzZWMtPm5leHQpCi0gIHsKLSAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKSAKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgLyogbG9hZCB0aGUgcmVsb2NzICovCi0gICAgLyogRklYTUU6IHRoZXJlIG1heSBiZSBhIHN0b3JhZ2UgbGVhayBoZXJlICovCi0gICAgaT1fYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MoYWJmZCxzZWMsMSwwLDAsMCk7Ci0gICAgCi0gICAgaWYgKGkgPT0gMCkKLSAgICAgIGFib3J0KCk7Ci0KLSAgICBmb3IgKHJlbD1pO3JlbDxpK3NlYy0+cmVsb2NfY291bnQ7KytyZWwpIAotICAgICAgewotCXVuc2lnbmVkIHNob3J0IHJfdHlwZSAgPSBFWFRSQUNUX1RZUEUgKHJlbC0+cl90eXBlKTsKLQl1bnNpZ25lZCBzaG9ydCByX2ZsYWdzID0gRVhUUkFDVF9GTEFHUyhyZWwtPnJfdHlwZSk7Ci0JYm9vbGVhbiBvayA9IHRydWU7Ci0KLQlEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIHJlbCk7Ci0KLQlzd2l0Y2gocl90eXBlKSAKLQkgIHsKLQkgIGNhc2UgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjoKLQkgICAgLyogaWYgVE9DREVGTiBpcyBvbiwgaWdub3JlIGFzIHNvbWVvbmUgZWxzZSBoYXMgYWxsb2NhdGVkIHRoZQotCSAgICAgICB0b2MgZW50cnkgKi8KLQkgICAgaWYgKCAocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgIT0gSU1BR0VfUkVMX1BQQ19UT0NERUZOICkKLQkgICAgICBvayA9IHBwY19yZWNvcmRfdG9jX2VudHJ5KGFiZmQsIGluZm8sIHNlYywgCi0JCQkJCXJlbC0+cl9zeW1uZHgsIGRlZmF1bHRfdG9jKTsKLQkgICAgaWYgKCFvaykKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLQkgICAgcHBjX21hcmtfc3ltYm9sX2FzX2dsdWUoYWJmZCwgcmVsLT5yX3N5bW5keCwgcmVsKTsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYKLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfcmVmaGlfcmVsb2MgKGFiZmQsCi0JCSByZWxvY19lbnRyeSwKLQkJIHN5bWJvbCwKLQkJIGRhdGEsCi0JCSBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBVTl9JTVBMKCJSRUZISSIpOwotICBEVU1QX1JFTE9DKCJSRUZISSIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotfQotCi0jaWYgMAotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfcmVmbG9fcmVsb2MgKGFiZmQsCi0JCSByZWxvY19lbnRyeSwKLQkJIHN5bWJvbCwKLQkJIGRhdGEsCi0JCSBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBVTl9JTVBMKCJSRUZMTyIpOwotICBEVU1QX1JFTE9DKCJSRUZMTyIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotfQotCi0jZW5kaWYKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3BhaXJfcmVsb2MgKGFiZmQsCi0JCXJlbG9jX2VudHJ5LAotCQlzeW1ib2wsCi0JCWRhdGEsCi0JCWlucHV0X3NlY3Rpb24sCi0JCW91dHB1dF9iZmQsCi0JCWVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBVTl9JTVBMKCJQQUlSIik7Ci0gIERVTVBfUkVMT0MoIlBBSVIiLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLX0KLQotDAotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3RvYzE2X3JlbG9jIChhYmZkLAotCQkgcmVsb2NfZW50cnksCi0JCSBzeW1ib2wsCi0JCSBkYXRhLAotCQkgaW5wdXRfc2VjdGlvbiwKLQkJIG91dHB1dF9iZmQsCi0JCSBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgVU5fSU1QTCgiVE9DUkVMMTYiKTsKLSAgRFVNUF9SRUxPQygiVE9DUkVMMTYiLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotI2lmIDAKLQotLyogQUREUjMyTkIgOiAzMiBiaXQgYWRkcmVzcyByZWxhdGl2ZSB0byB0aGUgdmlydHVhbCBvcmlnaW4uICAgICAgICAgKi8KLS8qICAgICAgICAgICAgKE9uIHRoZSBhbHBoYSwgdGhpcyBpcyBhbHdheXMgYSBsaW5rZXIgZ2VuZXJhdGVkIHRodW5rKSovCi0vKiAgICAgICAgICAgIChpLmUuIDMyYml0IGFkZHIgcmVsYXRpdmUgdG8gdGhlIGltYWdlIGJhc2UpICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19hZGRyMzJuYl9yZWxvYyAoYWJmZCwKLQkJICAgIHJlbG9jX2VudHJ5LAotCQkgICAgc3ltYm9sLAotCQkgICAgZGF0YSwKLQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICBvdXRwdXRfYmZkLAotCQkgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIFVOX0lNUEwoIkFERFIzMk5CIik7Ci0gIERVTVBfUkVMT0MoIkFERFIzMk5CIixyZWxvY19lbnRyeSk7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19zZWNyZWxfcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBVTl9JTVBMKCJTRUNSRUwiKTsKLSAgRFVNUF9SRUxPQygiU0VDUkVMIixyZWxvY19lbnRyeSk7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3NlY3Rpb25fcmVsb2MgKGFiZmQsCi0JCSAgIHJlbG9jX2VudHJ5LAotCQkgICBzeW1ib2wsCi0JCSAgIGRhdGEsCi0JCSAgIGlucHV0X3NlY3Rpb24sCi0JCSAgIG91dHB1dF9iZmQsCi0JCSAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBVTl9JTVBMKCJTRUNUSU9OIik7Ci0gIERVTVBfUkVMT0MoIlNFQ1RJT04iLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfaW1nbHVlX3JlbG9jIChhYmZkLAotCQkgIHJlbG9jX2VudHJ5LAotCQkgIHN5bWJvbCwKLQkJICBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sCi0JCSAgb3V0cHV0X2JmZCwKLQkJICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgVU5fSU1QTCgiSU1HTFVFIik7Ci0gIERVTVBfUkVMT0MoIklNR0xVRSIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQwKLQotI2RlZmluZSBNQVhfUkVMT0NfSU5ERVggIFwKLSAgICAgIChzaXplb2YocHBjX2NvZmZfaG93dG9fdGFibGUpIC8gc2l6ZW9mKHBwY19jb2ZmX2hvd3RvX3RhYmxlWzBdKSAtIDEpCi0KLQotLyogRklYTUU6IFRoZXJlIGlzIGEgcG9zc2libGl0eSB0aGF0IHdoZW4gd2UgcmVhZCBpbiBhIHJlbG9jIGZyb20gYSBmaWxlLAotICAgICAgICAgIHRoYXQgdGhlcmUgYXJlIHNvbWUgYml0cyBlbmNvZGVkIGluIHRoZSB1cHBlciBwb3J0aW9uIG9mIHRoZSAKLQkgIHR5cGUgZmllbGQuIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi0qLwotc3RhdGljIHZvaWQgcHBjX2NvZmZfcnR5cGUyaG93dG8gUEFSQU1TICgoYXJlbGVudCAqcmVsZW50LAotCQkJCQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWwpKTsKLQotc3RhdGljIHZvaWQKLXBwY19jb2ZmX3J0eXBlMmhvd3RvIChyZWxlbnQsIGludGVybmFsKQotICAgICBhcmVsZW50ICpyZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWw7Ci17ICAKLQotICAvKiBXZSBjYW4gZW5jb2RlIG9uZSBvZiB0aHJlZSB0aGluZ3MgaW4gdGhlIHR5cGUgZmllbGQsIGFzaWRlIGZyb20gdGhlCi0gICAgIHR5cGU6Ci0gICAgIDEuIElNQUdFX1JFTF9QUENfTkVHIC0gaW5kaWNhdGVzIHRoZSB2YWx1ZSBmaWVsZCBpcyBhIHN1YnRyYWN0aW9uCi0gICAgICAgIHZhbHVlLCByYXRoZXIgdGhhbiBhbiBhZGRpdGlvbiB2YWx1ZQotICAgICAyLiBJTUFHRV9SRUxfUFBDX0JSVEFLRU4sIElNQUdFX1JFTF9QUENfQlJOVEFLRU4gLSBpbmRpY2F0ZXMgdGhhdAotICAgICAgICB0aGUgYnJhbmNoIGlzIGV4cGVjdGVkIHRvIGJlIHRha2VuIG9yIG5vdC4KLSAgICAgMy4gSU1BR0VfUkVMX1BQQ19UT0NERUZOIC0gdG9jIHNsb3QgZGVmaW5pdGlvbiBpbiB0aGUgZmlsZQotICAgICBGb3Igbm93LCB3ZSBqdXN0IHN0cmlwIHRoaXMgc3R1ZmYgdG8gZmluZCB0aGUgdHlwZSwgYW5kIGlnbm9yZSBpdCBvdGhlcgotICAgICB0aGFuIHRoYXQuCi0gICovCi0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICB1bnNpZ25lZCBzaG9ydCByX3R5cGUgID0gRVhUUkFDVF9UWVBFIChpbnRlcm5hbC0+cl90eXBlKTsKLSAgdW5zaWduZWQgc2hvcnQgcl9mbGFncyA9IEVYVFJBQ1RfRkxBR1MoaW50ZXJuYWwtPnJfdHlwZSk7Ci0gIHVuc2lnbmVkIHNob3J0IGp1bmsgICAgPSBFWFRSQUNUX0pVTksgKGludGVybmFsLT5yX3R5cGUpOwotCi0gIC8qIHRoZSBtYXNraW5nIHByb2Nlc3Mgb25seSBzbGljZXMgb2ZmIHRoZSBib3R0b20gYnl0ZSBmb3Igcl90eXBlLiAqLwotICBpZiAoIHJfdHlwZSA+IE1BWF9SRUxPQ19JTkRFWCApIAotICAgIGFib3J0KCk7Ci0KLSAgLyogY2hlY2sgZm9yIGFic29sdXRlIGNyYXAgKi8KLSAgaWYgKCBqdW5rICE9IDAgKQotICAgIGFib3J0KCk7Ci0KLSAgc3dpdGNoKHJfdHlwZSkgCi0gICAgewotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMTY6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1JFTDI0OgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMjQ6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfSUZHTFVFOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMzJOQjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfU0VDVElPTjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfU0VDUkVMOgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCBpbnRlcm5hbCk7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgaW50ZXJuYWwpOwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjoKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgaW50ZXJuYWwpOwotICAgICAgaWYgKHJfZmxhZ3MgJiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pCi0JaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTjsKLSAgICAgIGVsc2UKLQlob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgCi0JICAgICAgXygiV2FybmluZzogVW5zdXBwb3J0ZWQgcmVsb2MgJXMgWyVkXSB1c2VkIC0tIGl0IG1heSBub3Qgd29yay5cbiIpLAotCSAgICAgIHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwKLQkgICAgICByX3R5cGUpOwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsgICAgICAKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIHJlbGVudC0+aG93dG8gPSBob3d0bzsKLSAgCi19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgLyogV2UgY2FuIGVuY29kZSBvbmUgb2YgdGhyZWUgdGhpbmdzIGluIHRoZSB0eXBlIGZpZWxkLCBhc2lkZSBmcm9tIHRoZQotICAgICB0eXBlOgotICAgICAxLiBJTUFHRV9SRUxfUFBDX05FRyAtIGluZGljYXRlcyB0aGUgdmFsdWUgZmllbGQgaXMgYSBzdWJ0cmFjdGlvbgotICAgICAgICB2YWx1ZSwgcmF0aGVyIHRoYW4gYW4gYWRkaXRpb24gdmFsdWUKLSAgICAgMi4gSU1BR0VfUkVMX1BQQ19CUlRBS0VOLCBJTUFHRV9SRUxfUFBDX0JSTlRBS0VOIC0gaW5kaWNhdGVzIHRoYXQKLSAgICAgICAgdGhlIGJyYW5jaCBpcyBleHBlY3RlZCB0byBiZSB0YWtlbiBvciBub3QuCi0gICAgIDMuIElNQUdFX1JFTF9QUENfVE9DREVGTiAtIHRvYyBzbG90IGRlZmluaXRpb24gaW4gdGhlIGZpbGUKLSAgICAgRm9yIG5vdywgd2UganVzdCBzdHJpcCB0aGlzIHN0dWZmIHRvIGZpbmQgdGhlIHR5cGUsIGFuZCBpZ25vcmUgaXQgb3RoZXIKLSAgICAgdGhhbiB0aGF0LgotICAqLwotCi0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZSAgPSBFWFRSQUNUX1RZUEUgKHJlbC0+cl90eXBlKTsKLSAgdW5zaWduZWQgc2hvcnQgcl9mbGFncyA9IEVYVFJBQ1RfRkxBR1MocmVsLT5yX3R5cGUpOwotICB1bnNpZ25lZCBzaG9ydCBqdW5rICAgID0gRVhUUkFDVF9KVU5LIChyZWwtPnJfdHlwZSk7Ci0KLSAgLyogdGhlIG1hc2tpbmcgcHJvY2VzcyBvbmx5IHNsaWNlcyBvZmYgdGhlIGJvdHRvbSBieXRlIGZvciByX3R5cGUuICovCi0gIGlmICggcl90eXBlID4gTUFYX1JFTE9DX0lOREVYICkgCi0gICAgYWJvcnQoKTsKLSAgCi0gIC8qIGNoZWNrIGZvciBhYnNvbHV0ZSBjcmFwICovCi0gIGlmICgganVuayAhPSAwICkKLSAgICBhYm9ydCgpOwotICAgIAotICBzd2l0Y2gocl90eXBlKSAKLSAgICB7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMk5COgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCByZWwpOwotICAgICAgKmFkZGVuZHAgLT0gcGVfZGF0YShzZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lciktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2OgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCByZWwpOwotICAgICAgaWYgKHJfZmxhZ3MgJiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pCi0JaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTjsKLSAgICAgIGVsc2UKLQlob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMTY6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1JFTDI0OgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMjQ6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfSUZHTFVFOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19TRUNUSU9OOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19TRUNSRUw6Ci0gICAgICBEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIHJlbCk7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgcmVsKTsKLSAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZihzdGRlcnIsIAotCSAgICAgIF8oIldhcm5pbmc6IFVuc3VwcG9ydGVkIHJlbG9jICVzIFslZF0gdXNlZCAtLSBpdCBtYXkgbm90IHdvcmsuXG4iKSwKLQkgICAgICBwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsCi0JICAgICAgcl90eXBlKTsKLSAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICByZXR1cm4gaG93dG87Ci19Ci0KLQotLyogYSBjaGVlc3kgbGl0dGxlIG1hY3JvIHRvIG1ha2UgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSByZWFkYWJsZSAqLwotI2RlZmluZSBIT1cyTUFQKGJmZF9ydHlwZSxwcGNfcnR5cGUpICBcCi0gY2FzZSBiZmRfcnR5cGU6IHJldHVybiAmcHBjX2NvZmZfaG93dG9fdGFibGVbcHBjX3J0eXBlXQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqcHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLVBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotcHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ18zMl9HT1RPRkYsICAgIElNQUdFX1JFTF9QUENfSU1HTFVFKTsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTCwgSU1BR0VfUkVMX1BQQ19JRkdMVUUpOwotICAgICAgSE9XMk1BUChCRkRfUkVMT0NfMTYsICAgICAgICAgICBJTUFHRV9SRUxfUFBDX0FERFIxNik7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ19QUENfQjI2LCAgICAgIElNQUdFX1JFTF9QUENfUkVMMjQpOwotICAgICAgSE9XMk1BUChCRkRfUkVMT0NfUFBDX0JBMjYsICAgICBJTUFHRV9SRUxfUFBDX0FERFIyNCk7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ19QUENfVE9DMTYsICAgIElNQUdFX1JFTF9QUENfVE9DUkVMMTYpOwotICAgICAgSE9XMk1BUChCRkRfUkVMT0NfMTZfR09UT0ZGLCAgICBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2X0RFRk4pOwotICAgICAgSE9XMk1BUChCRkRfUkVMT0NfMzIsICAgICAgICAgICBJTUFHRV9SRUxfUFBDX0FERFIzMik7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ19SVkEsICAgICAgICAgIElNQUdFX1JFTF9QUENfQUREUjMyTkIpOwotICAgIGRlZmF1bHQ6IAotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0jdW5kZWYgSE9XMk1BUAotCi0MCi0vKiBUYWlsb3IgY29mZmNvZGUuaCAtLSBtYWNybyBoZWF2ZW4uICovCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpICBwcGNfY29mZl9ydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0KLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi1zdGF0aWMgdm9pZCBwcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotI2VuZGlmCi0KLS8qIFdlIHVzZSB0aGUgc3BlY2lhbCBDT0ZGIGJhY2tlbmQgbGlua2VyLCB3aXRoIG91ciBvd24gc3BlY2lhbCB0b3VjaC4gICovCi0KLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgICBwcGNfY29mZl9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvICAgICAgICAgIGNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiAgICAgICAgY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBjb2ZmX2JmZF9maW5hbF9saW5rICAgICAgICAgIHBwY19iZmRfY29mZl9maW5hbF9saW5rIAotCi0jaWZuZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBjb2ZmX3N3YXBfc3ltX2luX2hvb2sgICAgICAgIHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2sKLSNlbmRpZgotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyhpbnRlcm5hbCwgaG93dG8pIHtpbnRlcm5hbC5yX3R5cGU9aG93dG8tPnR5cGU7fQotCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKLQotI2RlZmluZSBQT1dFUlBDX0xFX1BFCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0MCi0KLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0vKiBGSVhNRToKLSAgIFdoYXQgd2UncmUgdHJ5aW5nIHRvIGRvIGhlcmUgaXMgYWxsb2NhdGUgYSB0b2Mgc2VjdGlvbiAoZWFybHkpLCBhbmQgYXR0YWNoIAotICAgaXQgdG8gdGhlIGxhc3QgYmZkIHRvIGJlIHByb2Nlc3NlZC4gVGhpcyBhdm9pZHMgdGhlIHByb2JsZW0gb2YgaGF2aW5nIGEgdG9jCi0gICB3cml0dGVuIG91dCBiZWZvcmUgYWxsIGZpbGVzIGhhdmUgYmVlbiBwcm9jZXNzZWQuIFRoaXMgY29kZSBhbGxvY2F0ZXMKLSAgIGEgdG9jIHNlY3Rpb24gZm9yIGV2ZXJ5IGZpbGUsIGFuZCByZWNvcmRzIHRoZSBsYXN0IG9uZSBzZWVuLiBUaGVyZSBhcmUKLSAgIGF0IGxlYXN0IHR3byBwcm9ibGVtcyB3aXRoIHRoaXMgYXBwcm9hY2g6Ci0gICAxLiBXZSBhbGxvY2F0ZSB3aG9sZSBidW5jaGVzIG9mIHRvYyBzZWN0aW9ucyB0aGF0IGFyZSBpZ25vcmVkLCBidXQgYXQKLSAgICAgIGF0IGxlYXN0IHdlIHdpbGwgbm90IGFsbG9jYXRlIGEgdG9jIGlmIG5vIC50b2MgaXMgcHJlc2VudC4KLSAgIDIuIEl0J3Mgbm90IGNsZWFyIHRvIG1lIHRoYXQgYmVpbmcgdGhlIGxhc3QgYmZkIHJlYWQgbmVjZXNzYXJpbHkgbWVhbnMKLSAgICAgIHRoYXQgeW91IGFyZSB0aGUgbGFzdCBiZmQgY2xvc2VkLgotICAgMy4gRG9pbmcgaXQgb24gYSAic3dhcCBpbiIgaG9vayBkZXBlbmRzIG9uIHdoZW4gdGhlICJzd2FwIGluIiBpcyBjYWxsZWQsCi0gICAgICBhbmQgaG93IG9mdGVuLCBldGMuIEl0J3Mgbm90IGNsZWFyIHRvIG1lIHRoYXQgdGhlcmUgaXNuJ3QgYSBob2xlIGhlcmUuCi0qLwotCi1zdGF0aWMgdm9pZAotcHBjX2NvZmZfc3dhcF9zeW1faW5faG9vayAoYWJmZCwgZXh0MSwgaW4xKQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSIGV4dDE7Ci0gICAgIFBUUiBpbjE7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgICAgICAqaW4gPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKWluMTsKLQotICBpZiAoYmZkX29mX3RvY19vd25lciAhPSAwKSAvKiB3ZSBhbHJlYWR5IGhhdmUgYSB0b2MsIHNvIGdvIGhvbWUgKi8KLSAgICByZXR1cm47Ci0KLSAgaWYgKHN0cmNtcChpbi0+X24uX25fbmFtZSwgIi50b2MiKSA9PSAwKQotICAgIHsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoIGFiZmQgLCBUT0NfU0VDVElPTl9OQU1FKTsKLSAgICAgIGlmIChzICE9IE5VTEwpIAotCXsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSA7Ci0KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBUT0NfU0VDVElPTl9OQU1FKTsKLQotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0JewotCSAgLyogRklYTUU6IHNldCBhcHByb3ByaWF0ZSBiZmQgZXJyb3IgKi8KLQkgIGFib3J0KCk7Ci0JfQotCi0gICAgICAvKiBzYXZlIHRoZSBiZmQgZm9yIGxhdGVyIGFsbG9jYXRpb24gKi8KLSAgICAgIGJmZF9vZl90b2Nfb3duZXIgPSBhYmZkOwotICAgIH0KLQotICByZXR1cm47Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLQotc3RhdGljIGJvb2xlYW4gcHBjX2RvX2xhc3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBiZmQgKnBwY19nZXRfbGFzdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1wcGNfZG9fbGFzdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZCA9PSBiZmRfb2ZfdG9jX293bmVyKQotICAgIHJldHVybiB0cnVlOwotICBlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYmZkICoKLXBwY19nZXRfbGFzdCgpCi17Ci0gIHJldHVybiBiZmRfb2ZfdG9jX293bmVyOwotfQotCi0vKiB0aGlzIHBpZWNlIG9mIG1hY2hpbmVyeSBleGlzdHMgb25seSB0byBndWFyYW50ZWUgdGhhdCB0aGUgYmZkIHRoYXQgaG9sZHMKLSAgIHRoZSB0b2Mgc2VjdGlvbiBpcyB3cml0dGVuIGxhc3QuIAotCi0gICBUaGlzIGRvZXMgZGVwZW5kIG9uIGJmZF9tYWtlX3NlY3Rpb24gYXR0YWNoaW5nIGEgbmV3IHNlY3Rpb24gdG8gdGhlCi0gICBlbmQgb2YgdGhlIHNlY3Rpb24gbGlzdCBmb3IgdGhlIGJmZC4gCi0KLSAgIFRoaXMgaXMgb3RoZXJ3aXNlIGludGVuZGVkIHRvIGJlIGZ1bmN0aW9uYWxseSB0aGUgc2FtZSBhcyAKLSAgIGNvZmZsaW5rLmM6X2JmZF9jb2ZmX2ZpbmFsX2xpbmsoKS4gSXQgaXMgc3BlY2lmaWNhbGx5IGRpZmZlcmVudCBvbmx5IAotICAgd2hlcmUgdGhlIFBPV0VSUENfTEVfUEUgbWFjcm8gbW9kaWZpZXMgdGhlIGNvZGUuIEl0IGlzIGxlZnQgaW4gYXMgYSAKLSAgIHByZWNpc2UgZm9ybSBvZiBjb21tZW50LiBrcmtAY3lnbnVzLmNvbQotKi8KLSNkZWZpbmUgUE9XRVJQQ19MRV9QRQotCi0KLS8qIERvIHRoZSBmaW5hbCBsaW5rIHN0ZXAuICAqLwotCi1ib29sZWFuCi1wcGNfYmZkX2NvZmZfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyBmaW5mbzsKLSAgYm9vbGVhbiBkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQ7Ci0gIGFzZWN0aW9uICpvOwotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci0gIHNpemVfdCBtYXhfc3ltX2NvdW50OwotICBzaXplX3QgbWF4X2xpbmVub19jb3VudDsKLSAgc2l6ZV90IG1heF9yZWxvY19jb3VudDsKLSAgc2l6ZV90IG1heF9vdXRwdXRfcmVsb2NfY291bnQ7Ci0gIHNpemVfdCBtYXhfY29udGVudHNfc2l6ZTsKLSAgZmlsZV9wdHIgcmVsX2ZpbGVwb3M7Ci0gIHVuc2lnbmVkIGludCByZWxzejsKLSAgZmlsZV9wdHIgbGluZV9maWxlcG9zOwotICB1bnNpZ25lZCBpbnQgbGluZXN6OwotICBiZmQgKnN1YjsKLSAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGNoYXIgc3RyYnVmW1NUUklOR19TSVpFX1NJWkVdOwotCi0gIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0KLSAgZmluZm8uaW5mbyA9IGluZm87Ci0gIGZpbmZvLm91dHB1dF9iZmQgPSBhYmZkOwotICBmaW5mby5zdHJ0YWIgPSBOVUxMOwotICBmaW5mby5zZWN0aW9uX2luZm8gPSBOVUxMOwotICBmaW5mby5sYXN0X2ZpbGVfaW5kZXggPSAtMTsKLSAgZmluZm8ubGFzdF9iZl9pbmRleCA9IC0xOwotICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgZmluZm8uc2VjX3B0cnMgPSBOVUxMOwotICBmaW5mby5zeW1faW5kaWNlcyA9IE5VTEw7Ci0gIGZpbmZvLm91dHN5bXMgPSBOVUxMOwotICBmaW5mby5saW5lbm9zID0gTlVMTDsKLSAgZmluZm8uY29udGVudHMgPSBOVUxMOwotICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQgPSBmYWxzZTsKLQotICBjb2ZmX2RhdGEgKGFiZmQpLT5saW5rX2luZm8gPSBpbmZvOwotCi0gIGZpbmZvLnN0cnRhYiA9IF9iZmRfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIGlmIChmaW5mby5zdHJ0YWIgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoISBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfaW5pdCAoJmZpbmZvLmRlYnVnX21lcmdlKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgZGVidWdfbWVyZ2VfYWxsb2NhdGVkID0gdHJ1ZTsKLQotICAvKiBDb21wdXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgYWxsIHRoZSBzZWN0aW9ucy4gICovCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgaWYgKCEgYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIENvdW50IHRoZSBsaW5lIG51bWJlcnMgYW5kIHJlbG9jYXRpb24gZW50cmllcyByZXF1aXJlZCBmb3IgdGhlCi0gICAgIG91dHB1dCBmaWxlLiAgU2V0IHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIHJlbG9jcy4gICovCi0gIHJlbF9maWxlcG9zID0gb2JqX3JlbG9jYmFzZSAoYWJmZCk7Ci0gIHJlbHN6ID0gYmZkX2NvZmZfcmVsc3ogKGFiZmQpOwotICBtYXhfY29udGVudHNfc2l6ZSA9IDA7Ci0gIG1heF9saW5lbm9fY291bnQgPSAwOwotICBtYXhfcmVsb2NfY291bnQgPSAwOwotCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIG8tPmxpbmVub19jb3VudCA9IDA7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCi0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLQkgICAgICAvKiBNYXJrIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCi0JCSBsaW5rLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlIGV2ZXJ5IHNlY3Rpb24uICBXZSBuZWVkCi0JCSB0byBkbyB0aGlzIHNvIHRoYXQgd2UgY2FuIGlkZW50aWZ5IGFueSBzZWN0aW9ucyB3aGljaAotCQkgdGhlIGxpbmtlciBoYXMgZGVjaWRlZCB0byBub3QgaW5jbHVkZS4gICovCi0JICAgICAgc2VjLT5saW5rZXJfbWFyayA9IHRydWU7Ci0KLQkgICAgICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZQotCQkgIHx8IGluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUpCi0JCW8tPmxpbmVub19jb3VudCArPSBzZWMtPmxpbmVub19jb3VudDsKLQotCSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JCW8tPnJlbG9jX2NvdW50ICs9IHNlYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICBpZiAoc2VjLT5fcmF3X3NpemUgPiBtYXhfY29udGVudHNfc2l6ZSkKLQkJbWF4X2NvbnRlbnRzX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQkgICAgICBpZiAoc2VjLT5saW5lbm9fY291bnQgPiBtYXhfbGluZW5vX2NvdW50KQotCQltYXhfbGluZW5vX2NvdW50ID0gc2VjLT5saW5lbm9fY291bnQ7Ci0JICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPiBtYXhfcmVsb2NfY291bnQpCi0JCW1heF9yZWxvY19jb3VudCA9IHNlYy0+cmVsb2NfY291bnQ7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGluZm8tPnJlbG9jYXRlYWJsZQotCQkgICAmJiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgICAgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikpCi0JICAgICsrby0+cmVsb2NfY291bnQ7Ci0JfQotICAgICAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCi0Jby0+cmVsX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG8tPmZsYWdzIHw9IFNFQ19SRUxPQzsKLQkgIG8tPnJlbF9maWxlcG9zID0gcmVsX2ZpbGVwb3M7Ci0JICByZWxfZmlsZXBvcyArPSBvLT5yZWxvY19jb3VudCAqIHJlbHN6OwotCX0KLSAgICB9Ci0KLSAgLyogSWYgZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBwb2ludGVycyB3ZQotICAgICBuZWVkIHRvIGtlZXAuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICAvKiBXZSB1c2Ugc2VjdGlvbl9jb3VudCArIDEsIHJhdGhlciB0aGFuIHNlY3Rpb25fY291bnQsIGJlY2F1c2UKLSAgICAgICAgIHRoZSB0YXJnZXRfaW5kZXggZmllbGRzIGFyZSAxIGJhc2VkLiAgKi8KLSAgICAgIGZpbmZvLnNlY3Rpb25faW5mbyA9Ci0JKChzdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbyAqKQotCSBiZmRfbWFsbG9jICgoYWJmZC0+c2VjdGlvbl9jb3VudCArIDEpCi0JCSAgICAgKiBzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvKSkpOwotICAgICAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgZm9yIChpID0gMDsgaSA8PSBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0JewotCSAgZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyA9IE5VTEw7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyA9IE5VTEw7Ci0JfQotICAgIH0KLQotICAvKiBXZSBub3cga25vdyB0aGUgc2l6ZSBvZiB0aGUgcmVsb2NzLCBzbyB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSBmaWxlCi0gICAgIHBvc2l0aW9ucyBvZiB0aGUgbGluZSBudW1iZXJzLiAgKi8KLSAgbGluZV9maWxlcG9zID0gcmVsX2ZpbGVwb3M7Ci0gIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCk7Ci0gIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPSAwOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoby0+bGluZW5vX2NvdW50ID09IDApCi0Jby0+bGluZV9maWxlcG9zID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBvLT5saW5lX2ZpbGVwb3MgPSBsaW5lX2ZpbGVwb3M7Ci0JICBsaW5lX2ZpbGVwb3MgKz0gby0+bGluZW5vX2NvdW50ICogbGluZXN6OwotCX0KLQotICAgICAgaWYgKG8tPnJlbG9jX2NvdW50ICE9IDApCi0JewotCSAgLyogV2UgZG9uJ3Qga25vdyB0aGUgaW5kaWNlcyBvZiBnbG9iYWwgc3ltYm9scyB1bnRpbCB3ZSBoYXZlCi0gICAgICAgICAgICAgd3JpdHRlbiBvdXQgYWxsIHRoZSBsb2NhbCBzeW1ib2xzLiAgRm9yIGVhY2ggc2VjdGlvbiBpbgotICAgICAgICAgICAgIHRoZSBvdXRwdXQgZmlsZSwgd2Uga2VlcCBhbiBhcnJheSBvZiBwb2ludGVycyB0byBoYXNoCi0gICAgICAgICAgICAgdGFibGUgZW50cmllcy4gIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IGNvcnJlc3BvbmRzIHRvIGEKLSAgICAgICAgICAgICByZWxvYy4gIFdoZW4gd2UgZmluZCBhIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLCB3ZQotICAgICAgICAgICAgIHNldCB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpbiB0aGlzIGFycmF5IHNvIHRoYXQgd2UgY2FuCi0gICAgICAgICAgICAgZml4IHVwIHRoZSBzeW1ib2wgaW5kZXggYWZ0ZXIgd2UgaGF2ZSB3cml0dGVuIG91dCBhbGwgdGhlCi0gICAgICAgICAgICAgbG9jYWwgc3ltYm9scy4KLQotCSAgICAgQmVjYXVzZSBvZiB0aGlzIHByb2JsZW0sIHdlIGFsc28ga2VlcCB0aGUgcmVsb2NzIGluCi0JICAgICBtZW1vcnkgdW50aWwgdGhlIGVuZCBvZiB0aGUgbGluay4gIFRoaXMgd2FzdGVzIG1lbW9yeSwKLQkgICAgIGJ1dCBvbmx5IHdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgd2hpY2ggaXMgbm90IHRoZQotCSAgICAgY29tbW9uIGNhc2UuICAqLwotCSAgQkZEX0FTU0VSVCAoaW5mby0+cmVsb2NhdGVhYmxlKTsKLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcyA9Ci0JICAgICgoc3RydWN0IGludGVybmFsX3JlbG9jICopCi0JICAgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudCAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSkpOwotCSAgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcyA9Ci0JICAgICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgYmZkX21hbGxvYyAoby0+cmVsb2NfY291bnQKLQkJICAgICAqIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopKSk7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzID09IE5VTEwKLQkgICAgICB8fCBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoby0+cmVsb2NfY291bnQgPiBtYXhfb3V0cHV0X3JlbG9jX2NvdW50KQotCSAgICBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ID0gby0+cmVsb2NfY291bnQ7Ci0JfQotCi0gICAgICAvKiBSZXNldCB0aGUgcmVsb2MgYW5kIGxpbmVubyBjb3VudHMsIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGVtIHRvCi0JIGNvdW50IHRoZSBudW1iZXIgb2YgZW50cmllcyB3ZSBoYXZlIG91dHB1dCBzbyBmYXIuICAqLwotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotICAgICAgby0+bGluZW5vX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IGxpbmVfZmlsZXBvczsKLQotICAvKiBGaWd1cmUgb3V0IHRoZSBsYXJnZXN0IG51bWJlciBvZiBzeW1ib2xzIGluIGFuIGlucHV0IEJGRC4gIFRha2UKLSAgICAgdGhlIG9wcG9ydHVuaXR5IHRvIGNsZWFyIHRoZSBvdXRwdXRfaGFzX2JlZ3VuIGZpZWxkcyBvZiBhbGwgdGhlCi0gICAgIGlucHV0IEJGRCdzLiAgKi8KLSAgbWF4X3N5bV9jb3VudCA9IDA7Ci0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIHNpemVfdCBzejsKLQotICAgICAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gZmFsc2U7Ci0gICAgICBzeiA9IG9ial9yYXdfc3ltZW50X2NvdW50IChzdWIpOwotICAgICAgaWYgKHN6ID4gbWF4X3N5bV9jb3VudCkKLQltYXhfc3ltX2NvdW50ID0gc3o7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIHNvbWUgYnVmZmVycyB1c2VkIHdoaWxlIGxpbmtpbmcuICAqLwotICBmaW5mby5pbnRlcm5hbF9zeW1zID0gKChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopCi0JCQkgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudAotCQkJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQpKSk7Ci0gIGZpbmZvLnNlY19wdHJzID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50Ci0JCQkJCSAgICAgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgZmluZm8uc3ltX2luZGljZXMgPSAobG9uZyAqKSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50ICogc2l6ZW9mIChsb25nKSk7Ci0gIGZpbmZvLm91dHN5bXMgPSAoKGJmZF9ieXRlICopCi0JCSAgIGJmZF9tYWxsb2MgKChzaXplX3QpICgobWF4X3N5bV9jb3VudCArIDEpICogc3ltZXN6KSkpOwotICBmaW5mby5saW5lbm9zID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9saW5lbm9fY291bnQKLQkJCQkgICAgICAgKiBiZmRfY29mZl9saW5lc3ogKGFiZmQpKTsKLSAgZmluZm8uY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2NvbnRlbnRzX3NpemUpOwotICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X3JlbG9jX2NvdW50ICogcmVsc3opOwotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgZmluZm8uaW50ZXJuYWxfcmVsb2NzID0gKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikKLQkJCSAgICAgYmZkX21hbGxvYyAobWF4X3JlbG9jX2NvdW50Ci0JCQkJCSAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSkpOwotICBpZiAoKGZpbmZvLmludGVybmFsX3N5bXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ID4gMCkKLSAgICAgIHx8IChmaW5mby5zZWNfcHRycyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQotICAgICAgfHwgKGZpbmZvLnN5bV9pbmRpY2VzID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCi0gICAgICB8fCBmaW5mby5vdXRzeW1zID09IE5VTEwKLSAgICAgIHx8IChmaW5mby5saW5lbm9zID09IE5VTEwgJiYgbWF4X2xpbmVub19jb3VudCA+IDApCi0gICAgICB8fCAoZmluZm8uY29udGVudHMgPT0gTlVMTCAmJiBtYXhfY29udGVudHNfc2l6ZSA+IDApCi0gICAgICB8fCAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgbWF4X3JlbG9jX2NvdW50ID4gMCkKLSAgICAgIHx8ICghIGluZm8tPnJlbG9jYXRlYWJsZQotCSAgJiYgZmluZm8uaW50ZXJuYWxfcmVsb2NzID09IE5VTEwKLQkgICYmIG1heF9yZWxvY19jb3VudCA+IDApKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdlIG5vdyBrbm93IHRoZSBwb3NpdGlvbiBvZiBldmVyeXRoaW5nIGluIHRoZSBmaWxlLCBleGNlcHQgdGhhdAotICAgICB3ZSBkb24ndCBrbm93IHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgdGFibGUgYW5kIHRoZXJlZm9yZSB3ZSBkb24ndAotICAgICBrbm93IHdoZXJlIHRoZSBzdHJpbmcgdGFibGUgc3RhcnRzLiAgV2UganVzdCBidWlsZCB0aGUgc3RyaW5nCi0gICAgIHRhYmxlIGluIG1lbW9yeSBhcyB3ZSBnbyBhbG9uZy4gIFdlIHByb2Nlc3MgYWxsIHRoZSByZWxvY2F0aW9ucwotICAgICBmb3IgYSBzaW5nbGUgaW5wdXQgZmlsZSBhdCBvbmNlLiAgKi8KLSAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpID0gMDsKLQotICBpZiAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluaykKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfY29mZl9zdGFydF9maW5hbF9saW5rIChhYmZkLCBpbmZvKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyCi0JICAgICAgJiYgKGJmZF9nZXRfZmxhdm91ciAocC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcikKLQkJICA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikpCi0JICAgIHsKLQkgICAgICBzdWIgPSBwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotI2lmZGVmIFBPV0VSUENfTEVfUEUKLQkgICAgICBpZiAoISBzdWItPm91dHB1dF9oYXNfYmVndW4gJiYgIXBwY19kb19sYXN0KHN1YikpCi0jZWxzZQotCSAgICAgIGlmICghIHN1Yi0+b3V0cHV0X2hhc19iZWd1bikKLSNlbmRpZgotCQl7Ci0JCSAgaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkICgmZmluZm8sIHN1YikpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIGlmICghIF9iZmRfY29mZl9yZWxvY19saW5rX29yZGVyIChhYmZkLCAmZmluZm8sIG8sIHApKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0gIHsKLSAgICBiZmQqIGxhc3Rfb25lID0gcHBjX2dldF9sYXN0KCk7Ci0gICAgaWYgKGxhc3Rfb25lKQotICAgICAgewotCWlmICghIF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCAoJmZpbmZvLCBsYXN0X29uZSkpCi0JICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIH0KLSAgICBsYXN0X29uZS0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0gIH0KLSNlbmRpZgotCi0gIC8qIEZyZWUgdXAgdGhlIGJ1ZmZlcnMgdXNlZCBieSBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQuICAqLwotCi0gIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlICgmZmluZm8uZGVidWdfbWVyZ2UpOwotICBkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQgPSBmYWxzZTsKLQotICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOwotICAgICAgZmluZm8uaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uc2VjX3B0cnMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5zZWNfcHRycyk7Ci0gICAgICBmaW5mby5zZWNfcHRycyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uc3ltX2luZGljZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5zeW1faW5kaWNlcyk7Ci0gICAgICBmaW5mby5zeW1faW5kaWNlcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8ubGluZW5vcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmxpbmVub3MpOwotICAgICAgZmluZm8ubGluZW5vcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5jb250ZW50cyk7Ci0gICAgICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGZpbmZvLmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIFRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBDX0ZJTEUgc3ltYm9sIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzeW1ib2wKLSAgICAgaW5kZXggb2YgdGhlIGZpcnN0IGV4dGVybmFsIHN5bWJvbC4gIFdyaXRlIGl0IG91dCBhZ2FpbiBpZgotICAgICBuZWNlc3NhcnkuICAqLwotICBpZiAoZmluZm8ubGFzdF9maWxlX2luZGV4ICE9IC0xCi0gICAgICAmJiAodW5zaWduZWQgaW50KSBmaW5mby5sYXN0X2ZpbGUubl92YWx1ZSAhPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkpCi0gICAgewotICAgICAgZmluZm8ubGFzdF9maWxlLm5fdmFsdWUgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsIChQVFIpICZmaW5mby5sYXN0X2ZpbGUsCi0JCQkgICAgIChQVFIpIGZpbmZvLm91dHN5bXMpOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkKLQkJICAgICArIGZpbmZvLmxhc3RfZmlsZV9pbmRleCAqIHN5bWVzeiksCi0JCSAgICBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3dyaXRlIChmaW5mby5vdXRzeW1zLCBzeW1lc3osIDEsIGFiZmQpICE9IHN5bWVzeikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgZ2xvYmFsIHN5bWJvbHMuICAqLwotICBmaW5mby5mYWlsZWQgPSBmYWxzZTsKLSAgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltLAotCQkJICAgKFBUUikgJmZpbmZvKTsKLSAgaWYgKGZpbmZvLmZhaWxlZCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBUaGUgb3V0c3ltcyBidWZmZXIgaXMgdXNlZCBieSBfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bS4gICovCi0gIGlmIChmaW5mby5vdXRzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8ub3V0c3ltcyk7Ci0gICAgICBmaW5mby5vdXRzeW1zID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAvKiBOb3cgdGhhdCB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUgZ2xvYmFsIHN5bWJvbHMsIHdlIGtub3cKLQkgdGhlIHN5bWJvbCBpbmRpY2VzIHRvIHVzZSBmb3IgcmVsb2NzIGFnYWluc3QgdGhlbSwgYW5kIHdlIGNhbgotCSBmaW5hbGx5IHdyaXRlIG91dCB0aGUgcmVsb2NzLiAgKi8KLSAgICAgIGV4dGVybmFsX3JlbG9jcyA9ICgoYmZkX2J5dGUgKikKLQkJCSBiZmRfbWFsbG9jIChtYXhfb3V0cHV0X3JlbG9jX2NvdW50ICogcmVsc3opKTsKLSAgICAgIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsZW5kOwotCSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2g7Ci0JICBiZmRfYnl0ZSAqZXJlbDsKLQotCSAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICBpcmVsID0gZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzOwotCSAgaXJlbGVuZCA9IGlyZWwgKyBvLT5yZWxvY19jb3VudDsKLQkgIHJlbF9oYXNoID0gZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlczsKLQkgIGVyZWwgPSBleHRlcm5hbF9yZWxvY3M7Ci0JICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKywgcmVsX2hhc2grKywgZXJlbCArPSByZWxzeikKLQkgICAgewotCSAgICAgIGlmICgqcmVsX2hhc2ggIT0gTlVMTCkKLQkJewotCQkgIEJGRF9BU1NFUlQgKCgqcmVsX2hhc2gpLT5pbmR4ID49IDApOwotCQkgIGlyZWwtPnJfc3ltbmR4ID0gKCpyZWxfaGFzaCktPmluZHg7Ci0JCX0KLQkgICAgICBiZmRfY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgKFBUUikgaXJlbCwgKFBUUikgZXJlbCk7Ci0JICAgIH0KLQotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfd3JpdGUgKChQVFIpIGV4dGVybmFsX3JlbG9jcywgcmVsc3osIG8tPnJlbG9jX2NvdW50LAotCQkJICAgIGFiZmQpICE9IHJlbHN6ICogby0+cmVsb2NfY291bnQpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIEZyZWUgdXAgdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24uICAqLwotICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0JewotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyk7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMpOwotCX0KLSAgICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mbyk7Ci0gICAgICBmaW5mby5zZWN0aW9uX2luZm8gPSBOVUxMOwotICAgIH0KLQotICAvKiBJZiB3ZSBoYXZlIG9wdGltaXplZCBzdGFicyBzdHJpbmdzLCBvdXRwdXQgdGhlbS4gICovCi0gIGlmIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyAoYWJmZCwgJmNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIHN0cmluZyB0YWJsZS4gICovCi0gIGlmIChvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgICAgICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6KSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotI2lmIFNUUklOR19TSVpFX1NJWkUgPT0gNAotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLAotCQkgICAgX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZmluZm8uc3RydGFiKSArIFNUUklOR19TSVpFX1NJWkUsCi0JCSAgICAoYmZkX2J5dGUgKikgc3RyYnVmKTsKLSNlbHNlCi0gI2Vycm9yIENoYW5nZSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotCi0gICAgICBpZiAoYmZkX3dyaXRlIChzdHJidWYsIDEsIFNUUklOR19TSVpFX1NJWkUsIGFiZmQpICE9IFNUUklOR19TSVpFX1NJWkUpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCBmaW5mby5zdHJ0YWIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3RydGFiKTsKLQotICAvKiBTZXR0aW5nIGJmZF9nZXRfc3ltY291bnQgdG8gMCB3aWxsIGNhdXNlIHdyaXRlX29iamVjdF9jb250ZW50cyB0bwotICAgICBub3QgdHJ5IHRvIHdyaXRlIG91dCB0aGUgc3ltYm9scy4gICovCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGRlYnVnX21lcmdlX2FsbG9jYXRlZCkKLSAgICBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSAoJmZpbmZvLmRlYnVnX21lcmdlKTsKLSAgaWYgKGZpbmZvLnN0cnRhYiAhPSBOVUxMKQotICAgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN0cnRhYik7Ci0gIGlmIChmaW5mby5zZWN0aW9uX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyk7Ci0JfQotICAgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvKTsKLSAgICB9Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChmaW5mby5zZWNfcHRycyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLnNlY19wdHJzKTsKLSAgaWYgKGZpbmZvLnN5bV9pbmRpY2VzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc3ltX2luZGljZXMpOwotICBpZiAoZmluZm8ub3V0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLm91dHN5bXMpOwotICBpZiAoZmluZm8ubGluZW5vcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmxpbmVub3MpOwotICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5jb250ZW50cyk7Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICBpZiAoZmluZm8uaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLSNlbmRpZgotDAotCi0vKiBUaGUgdHJhbnNmZXIgdmVjdG9ycyB0aGF0IGxlYWQgdGhlIG91dHNpZGUgd29ybGQgdG8gYWxsIG9mIHRoZSBhYm92ZS4gKi8KLQotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi1jb25zdCBiZmRfdGFyZ2V0Ci1UQVJHRVRfTElUVExFX1NZTSA9Ci17Ci0gIFRBUkdFVF9MSVRUTEVfTkFNRSwJCS8qIG5hbWUgb3IgY29mZi1hcm0tbGl0dGxlICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIEZJWE1FOiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAKLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0jZWxzZQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgIHwgU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVMpLAotI2VuZGlmCi0KLSAgMCwJCQkJLyogbGVhZGluZyBjaGFyICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuPz8/IEZJWE1FbWdvICovCi0KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLSAgCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCAvKiBfYmZkX2R1bW15X3RhcmdldCAqLyBjb2ZmX29iamVjdF9wIH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotICAKLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLSAgCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07Ci0jZW5kaWYKLQotI2lmZGVmIFRBUkdFVF9CSUdfU1lNCi1jb25zdCBiZmRfdGFyZ2V0Ci1UQVJHRVRfQklHX1NZTSA9Ci17Ci0gIFRBUkdFVF9CSUdfTkFNRSwKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCQotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIEZJWE1FOiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotI2Vsc2UKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAvKiBzZWN0aW9uIGZsYWdzICovCi0gICB8IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKSwKLSNlbmRpZgotCi0gIDAsCQkJCS8qIGxlYWRpbmcgY2hhciAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbj8/PyBGSVhNRW1nbyAqLwotCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLQotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIC8qIF9iZmRfZHVtbXlfdGFyZ2V0ICovIGNvZmZfb2JqZWN0X3AgfSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUsCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXJzNjAwMC5jIGIvYmZkL2NvZmYtcnM2MDAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNGNkNDQuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtcnM2MDAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDE4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSUJNIFJTLzYwMDAgIlhDT0ZGIiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgRklYTUU6IENhbiBzb21lb25lIHByb3ZpZGUgYSB0cmFuc2xpdGVyYXRpb24gb2YgdGhpcyBuYW1lIGludG8gQVNDSUk/Ci0gICBVc2luZyB0aGUgZm9sbG93aW5nIGNoYXJzIGNhdXNlZCBhIGNvbXBpbGVyIHdhcm5pbmcgb24gSElVWCAoc28gSSByZXBsYWNlZAotICAgdGhlbSB3aXRoIG9jdGFsIGVzY2FwZXMpLCBhbmQgaXNuJ3QgdXNlZnVsIHdpdGhvdXQgYW4gdW5kZXJzdGFuZGluZyBvZiB3aGF0Ci0gICBjaGFyYWN0ZXIgc2V0IGl0IGlzLgotICAgV3JpdHRlbiBieSBNZXRpbiBHLiBPemlzaWssIE1pbWkgUGhcMzczXDM2NG5nLVRoXDM0NW8gVlwzNjUsIAotICAgICBhbmQgSm9obiBHaWxtb3JlLgotICAgQXJjaGl2ZSBzdXBwb3J0IGZyb20gRGFtb24gQS4gUGVybWV6ZWwuCi0gICBDb250cmlidXRlZCBieSBJQk0gQ29ycG9yYXRpb24gYW5kIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEludGVybmFsY29mZi5oIGFuZCBjb2ZmY29kZS5oIG1vZGlmeSB0aGVtc2VsdmVzIGJhc2VkIG9uIHRoaXMgZmxhZy4gICovCi0jZGVmaW5lIFJTNjAwMENPRkZfQyAxCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9yczYwMDAuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLS8qIFRoZSBtYWluIGJvZHkgb2YgY29kZSBpcyBpbiBjb2ZmY29kZS5oLiAgKi8KLQotc3RhdGljIGJvb2xlYW4geGNvZmZfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgeGNvZmZfcnR5cGUyaG93dG8KLSAgUEFSQU1TICgoYXJlbGVudCAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnhjb2ZmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqeGNvZmZfYXJjaGl2ZV9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgUFRSIHhjb2ZmX3JlYWRfYXJfaGRyIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkICp4Y29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgaW50IHhjb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOwotc3RhdGljIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZV9maWxlbmFtZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfd3JpdGVfYXJtYXAKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBfYmZkX3hjb2ZmX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci0MCi0vKiBXZSB1c2Ugb3VyIG93biB0ZGF0YSB0eXBlLiAgSXRzIGZpcnN0IGZpZWxkIGlzIHRoZSBDT0ZGIHRkYXRhIHR5cGUsCi0gICBzbyB0aGUgQ09GRiByb3V0aW5lcyBhcmUgY29tcGF0aWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb2ZmX2RhdGFfdHlwZSAqY29mZjsKLQotICBhYmZkLT50ZGF0YS54Y29mZl9vYmpfZGF0YSA9Ci0gICAgKChzdHJ1Y3QgeGNvZmZfdGRhdGEgKikKLSAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfdGRhdGEpKSk7Ci0gIGlmIChhYmZkLT50ZGF0YS54Y29mZl9vYmpfZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgY29mZiA9IGNvZmZfZGF0YSAoYWJmZCk7Ci0gIGNvZmYtPnN5bWJvbHMgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwotICBjb2ZmLT5jb252ZXJzaW9uX3RhYmxlID0gKHVuc2lnbmVkIGludCAqKSBOVUxMOwotICBjb2ZmLT5yYXdfc3ltZW50cyA9IChzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICopIE5VTEw7Ci0gIGNvZmYtPnJlbG9jYmFzZSA9IDA7Ci0KLSAgeGNvZmZfZGF0YSAoYWJmZCktPm1vZHR5cGUgPSAoJzEnIDw8IDgpIHwgJ0wnOwotCi0gIC8qIFdlIHNldCBjcHV0eXBlIHRvIC0xIHRvIGluZGljYXRlIHRoYXQgaXQgaGFzIG5vdCBiZWVuCi0gICAgIGluaXRpYWxpemVkLiAgKi8KLSAgeGNvZmZfZGF0YSAoYWJmZCktPmNwdXR5cGUgPSAtMTsKLQotICB4Y29mZl9kYXRhIChhYmZkKS0+Y3NlY3RzID0gTlVMTDsKLSAgeGNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZGljZXMgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IFhDT0ZGIGRhdGEgZnJvbSBvbmUgQkZEIHRvIGFub3RoZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgc3RydWN0IHhjb2ZmX3RkYXRhICppeCwgKm94OwotICBhc2VjdGlvbiAqc2VjOwotCi0gIGlmIChpYmZkLT54dmVjICE9IG9iZmQtPnh2ZWMpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGl4ID0geGNvZmZfZGF0YSAoaWJmZCk7Ci0gIG94ID0geGNvZmZfZGF0YSAob2JmZCk7Ci0gIG94LT5mdWxsX2FvdXRoZHIgPSBpeC0+ZnVsbF9hb3V0aGRyOwotICBveC0+dG9jID0gaXgtPnRvYzsKLSAgaWYgKGl4LT5zbnRvYyA9PSAwKQotICAgIG94LT5zbnRvYyA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzZWMgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGliZmQsIGl4LT5zbnRvYyk7Ci0gICAgICBpZiAoc2VjID09IE5VTEwpCi0Jb3gtPnNudG9jID0gMDsKLSAgICAgIGVsc2UKLQlveC0+c250b2MgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotICBpZiAoaXgtPnNuZW50cnkgPT0gMCkKLSAgICBveC0+c25lbnRyeSA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzZWMgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGliZmQsIGl4LT5zbmVudHJ5KTsKLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLQlveC0+c25lbnRyeSA9IDA7Ci0gICAgICBlbHNlCi0Jb3gtPnNuZW50cnkgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotICBveC0+dGV4dF9hbGlnbl9wb3dlciA9IGl4LT50ZXh0X2FsaWduX3Bvd2VyOwotICBveC0+ZGF0YV9hbGlnbl9wb3dlciA9IGl4LT5kYXRhX2FsaWduX3Bvd2VyOwotICBveC0+bW9kdHlwZSA9IGl4LT5tb2R0eXBlOwotICBveC0+Y3B1dHlwZSA9IGl4LT5jcHV0eXBlOwotICBveC0+bWF4ZGF0YSA9IGl4LT5tYXhkYXRhOwotICBveC0+bWF4c3RhY2sgPSBpeC0+bWF4c3RhY2s7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJIGRvbid0IHRoaW5rIFhDT0ZGIHJlYWxseSBoYXMgYSBub3Rpb24gb2YgbG9jYWwgbGFiZWxzIGJhc2VkIG9uCi0gICBuYW1lLiAgVGhpcyB3aWxsIG1lYW4gdGhhdCBsZCAtWCBkb2Vzbid0IGFjdHVhbGx5IHN0cmlwIGFueXRoaW5nLgotICAgVGhlIEFJWCBuYXRpdmUgbGlua2VyIGRvZXMgbm90IGhhdmUgYSAtWCBvcHRpb24sIGFuZCBpdCBpZ25vcmVzIHRoZQotICAgLXggb3B0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogVGhlIFhDT0ZGIHJlbG9jIHRhYmxlLiAgQWN0dWFsbHksIFhDT0ZGIHJlbG9jYXRpb25zIHNwZWNpZnkgdGhlCi0gICBiaXRzaXplIGFuZCB3aGV0aGVyIHRoZXkgYXJlIHNpZ25lZCBvciBub3QsIGFsb25nIHdpdGggYQotICAgY29udmVudGlvbmFsIHR5cGUuICBUaGlzIHRhYmxlIGlzIGZvciB0aGUgdHlwZXMsIHdoaWNoIGFyZSB1c2VkIGZvcgotICAgZGlmZmVyZW50IGFsZ29yaXRobXMgZm9yIHB1dHRpbmcgaW4gdGhlIHJlbG9jLiAgTWFueSBvZiB0aGVzZQotICAgcmVsb2NzIG5lZWQgc3BlY2lhbF9mdW5jdGlvbiBlbnRyaWVzLCB3aGljaCBJIGhhdmUgbm90IHdyaXR0ZW4uICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSB4Y29mZl9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogU3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUE9TIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgcmVsb2NhdGlvbiwgYnV0IHN0b3JlIG5lZ2F0aXZlIHZhbHVlLiAgKi8KLSAgSE9XVE8gKDEsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIC0yLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9ORUciLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKDIsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiAxNiBiaXQgVE9DIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVE9DIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhpcyBpcy4gICovCi0gIEhPV1RPICg0LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SVEIiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogRXh0ZXJuYWwgVE9DIHJlbGF0aXZlIHN5bWJvbC4gICovCi0gIEhPV1RPICg1LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9HTCIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIExvY2FsIFRPQyByZWxhdGl2ZSBzeW1ib2wuICAqLwotICBIT1dUTyAoNiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVENMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICB7IDcgfSwKLSAgCi0gIC8qIE5vbiBtb2RpZmlhYmxlIGFic29sdXRlIGJyYW5jaC4gICovCi0gIEhPV1RPICg4LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9CQSIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIHsgOSB9LAotCi0gIC8qIE5vbiBtb2RpZmlhYmxlIHJlbGF0aXZlIGJyYW5jaC4gICovCi0gIEhPV1RPICgweGEsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDI2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX0JSIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDNmZmZmZmMsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDNmZmZmZmMsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgeyAweGIgfSwKLQotICAvKiBJbmRpcmVjdCBsb2FkLiAgKi8KLSAgSE9XVE8gKDB4YywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkwiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBMb2FkIGFkZHJlc3MuICAqLwotICBIT1dUTyAoMHhkLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9STEEiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIHsgMHhlIH0sCi0gIAotICAvKiBOb24tcmVsb2NhdGluZyByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoMHhmLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SRUYiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwgICAgIAkgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgeyAweDEwIH0sCi0gIHsgMHgxMSB9LAotICAKLSAgLyogVE9DIHJlbGF0aXZlIGluZGlyZWN0IGxvYWQuICAqLwotICBIT1dUTyAoMHgxMiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVFJMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBUT0MgcmVsYXRpdmUgbG9hZCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKDB4MTMsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1RSTEEiLCAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSByZWxhdGl2ZSBicmFuY2guICAqLwotICBIT1dUTyAoMHgxNCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUlJUQkkiLCAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYWJzb2x1dGUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4MTUsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JSVEJBIiwgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGNhbGwgYWJzb2x1dGUgaW5kaXJlY3QuICAqLwotICBIT1dUTyAoMHgxNiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQ0FJIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGNhbGwgcmVsYXRpdmUuICAqLwotICBIT1dUTyAoMHgxNywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQ1JFTCIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCBhYnNvbHV0ZS4gICovCi0gIEhPV1RPICgweDE4LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SQkEiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYnJhbmNoIGFic29sdXRlLiAgKi8KLSAgSE9XVE8gKDB4MTksCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JCQUMiLCAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggcmVsYXRpdmUuICAqLwotICBIT1dUTyAoMHgxYSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JCUiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggYWJzb2x1dGUuICAqLwotICBIT1dUTyAoMHgxYiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkJSQyIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi1zdGF0aWMgdm9pZAoteGNvZmZfcnR5cGUyaG93dG8gKHJlbGVudCwgaW50ZXJuYWwpCi0gICAgIGFyZWxlbnQgKnJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbDsKLXsKLSAgcmVsZW50LT5ob3d0byA9IHhjb2ZmX2hvd3RvX3RhYmxlICsgaW50ZXJuYWwtPnJfdHlwZTsKLQotICAvKiBUaGUgcl9zaXplIGZpZWxkIG9mIGFuIFhDT0ZGIHJlbG9jIGVuY29kZXMgdGhlIGJpdHNpemUgb2YgdGhlCi0gICAgIHJlbG9jYXRpb24sIGFzIHdlbGwgYXMgaW5kaWNhdGluZyB3aGV0aGVyIGl0IGlzIHNpZ25lZCBvciBub3QuCi0gICAgIERvdWJsZWNoZWNrIHRoYXQgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUKLSAgICAgdHlwZSBtYXRjaGVzIHRoaXMgaW5mb3JtYXRpb24uICAqLwotICBpZiAocmVsZW50LT5ob3d0by0+Yml0c2l6ZSAhPSAoKHVuc2lnbmVkIGludCkgaW50ZXJuYWwtPnJfc2l6ZSAmIDB4MWYpICsgMSkKLSAgICBhYm9ydCAoKTsKLSNpZiAwCi0gIGlmICgoaW50ZXJuYWwtPnJfc2l6ZSAmIDB4ODApICE9IDAKLSAgICAgID8gKHJlbGVudC0+aG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCkKLSAgICAgIDogKHJlbGVudC0+aG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkKSkKLSAgICBhYm9ydCAoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi14Y29mZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQjI2OgotICAgICAgcmV0dXJuICZ4Y29mZl9ob3d0b190YWJsZVsweGFdOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19CQTI2OgotICAgICAgcmV0dXJuICZ4Y29mZl9ob3d0b190YWJsZVs4XTsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfVE9DMTY6Ci0gICAgICByZXR1cm4gJnhjb2ZmX2hvd3RvX3RhYmxlWzNdOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICByZXR1cm4gJnhjb2ZmX2hvd3RvX3RhYmxlWzBdOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKGludGVybmFsLCBob3d0bykJCQkJCVwKLSAgewkJCQkJCQkJCVwKLSAgICBpbnRlcm5hbC5yX3R5cGUgPSBob3d0by0+dHlwZTsJCQkJCVwKLSAgICBpbnRlcm5hbC5yX3NpemUgPQkJCQkJCQlcCi0gICAgICAoKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyA9PSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQJCVwKLQk/IDB4ODAJCQkJCQkJCVwKLQk6IDApCQkJCQkJCQlcCi0gICAgICAgfCAoaG93dG8tPmJpdHNpemUgLSAxKSk7CQkJCQkJXAotICB9Ci0MCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKLQotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIHhjb2ZmX3J0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLQotI2RlZmluZSBjb2ZmX21rb2JqZWN0IHhjb2ZmX21rb2JqZWN0Ci0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSB4Y29mZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSB4Y29mZl9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIHhjb2ZmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotDAotLyogWENPRkYgYXJjaGl2ZSBzdXBwb3J0LiAgVGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcyBjb2RlIHdhcyBieQotICAgRGFtb24gQS4gUGVybWV6ZWwuICBJdCB3YXMgZW5oYW5jZWQgdG8gcGVybWl0IGNyb3NzIHN1cHBvcnQsIGFuZAotICAgd3JpdGluZyBhcmNoaXZlIGZpbGVzLCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgWENPRkYgdXNlcyBpdHMgb3duIGFyY2hpdmUgZm9ybWF0LiAgRXZlcnl0aGluZyBpcyBob29rZWQgdG9nZXRoZXIKLSAgIHdpdGggZmlsZSBvZmZzZXQgbGlua3MsIHNvIGl0IGlzIHBvc3NpYmxlIHRvIHJhcGlkbHkgdXBkYXRlIGFuCi0gICBhcmNoaXZlIGluIHBsYWNlLiAgT2YgY291cnNlLCB3ZSBkb24ndCBkbyB0aGF0LiAgQW4gWENPRkYgYXJjaGl2ZQotICAgaGFzIGEgcmVhbCBmaWxlIGhlYWRlciwgbm90IGp1c3QgYW4gQVJNQUcgc3RyaW5nLiAgVGhlIHN0cnVjdHVyZSBvZgotICAgdGhlIGZpbGUgaGVhZGVyIGFuZCBvZiBlYWNoIGFyY2hpdmUgaGVhZGVyIGFwcGVhciBiZWxvdy4KLQotICAgQW4gWENPRkYgYXJjaGl2ZSBhbHNvIGhhcyBhIG1lbWJlciB0YWJsZSwgd2hpY2ggaXMgYSBsaXN0IG9mCi0gICBlbGVtZW50cyBpbiB0aGUgYXJjaGl2ZSAoeW91IGNhbiBnZXQgdGhhdCBieSBsb29raW5nIHRocm91Z2ggdGhlCi0gICBsaW5rZWQgbGlzdCwgYnV0IHlvdSBoYXZlIHRvIHJlYWQgYSBsb3QgbW9yZSBvZiB0aGUgZmlsZSkuICBUaGUKLSAgIG1lbWJlciB0YWJsZSBoYXMgYSBub3JtYWwgYXJjaGl2ZSBoZWFkZXIgd2l0aCBhbiBlbXB0eSBuYW1lLiAgSXQgaXMKLSAgIG5vcm1hbGx5IChhbmQgcGVyaGFwcyBtdXN0IGJlKSB0aGUgc2Vjb25kIHRvIGxhc3QgZW50cnkgaW4gdGhlCi0gICBhcmNoaXZlLiAgVGhlIG1lbWJlciB0YWJsZSBkYXRhIGlzIGFsbW9zdCBwcmludGFibGUgQVNDSUkuICBJdAotICAgc3RhcnRzIHdpdGggYSAxMiBjaGFyYWN0ZXIgZGVjaW1hbCBzdHJpbmcgd2hpY2ggaXMgdGhlIG51bWJlciBvZgotICAgZW50cmllcyBpbiB0aGUgdGFibGUuICBGb3IgZWFjaCBlbnRyeSBpdCBoYXMgYSAxMiBjaGFyYWN0ZXIgZGVjaW1hbAotICAgc3RyaW5nIHdoaWNoIGlzIHRoZSBvZmZzZXQgaW4gdGhlIGFyY2hpdmUgb2YgdGhhdCBtZW1iZXIuICBUaGVzZQotICAgZW50cmllcyBhcmUgZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3Mgd2hpY2gKLSAgIGFyZSB0aGUgbWVtYmVyIG5hbWVzIGZvciBlYWNoIGVudHJ5LgotCi0gICBGaW5hbGx5LCBhbiBYQ09GRiBhcmNoaXZlIGhhcyBhIGdsb2JhbCBzeW1ib2wgdGFibGUsIHdoaWNoIGlzIHdoYXQKLSAgIHdlIGNhbGwgdGhlIGFybWFwLiAgVGhlIGdsb2JhbCBzeW1ib2wgdGFibGUgaGFzIGEgbm9ybWFsIGFyY2hpdmUKLSAgIGhlYWRlciB3aXRoIGFuIGVtcHR5IG5hbWUuICBJdCBpcyBub3JtYWxseSAoYW5kIHBlcmhhcHMgbXVzdCBiZSkKLSAgIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcmNoaXZlLiAgVGhlIGNvbnRlbnRzIHN0YXJ0IHdpdGggYSBmb3VyIGJ5dGUKLSAgIGJpbmFyeSBudW1iZXIgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzLiAgVGhpcyBpcyBmb2xsb3dlZCBieQotICAgYSB0aGF0IG1hbnkgZm91ciBieXRlIGJpbmFyeSBudW1iZXJzOyBlYWNoIGlzIHRoZSBmaWxlIG9mZnNldCBvZiBhbgotICAgZW50cnkgaW4gdGhlIGFyY2hpdmUuICBUaGVzZSBudW1iZXJzIGFyZSBmb2xsb3dlZCBieSBhIHNlcmllcyBvZgotICAgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3MsIHdoaWNoIGFyZSBzeW1ib2wgbmFtZXMuICAqLwotCi0vKiBYQ09GRiBhcmNoaXZlcyB1c2UgdGhpcyBhcyBhIG1hZ2ljIHN0cmluZy4gICovCi0KLSNkZWZpbmUgWENPRkZBUk1BRyAiPGFpYWZmPlwwMTIiCi0jZGVmaW5lIFNYQ09GRkFSTUFHIDgKLQotLyogVGhpcyB0ZXJtaW5hdGVzIGFuIFhDT0ZGIGFyY2hpdmUgbWVtYmVyIG5hbWUuICAqLwotCi0jZGVmaW5lIFhDT0ZGQVJGTUFHICJgXDAxMiIKLSNkZWZpbmUgU1hDT0ZGQVJGTUFHIDIKLQotLyogWENPRkYgYXJjaGl2ZXMgc3RhcnQgd2l0aCB0aGlzIChwcmludGFibGUpIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCB4Y29mZl9hcl9maWxlX2hkcgotewotICAvKiBNYWdpYyBzdHJpbmcuICAqLwotICBjaGFyIG1hZ2ljW1NYQ09GRkFSTUFHXTsKLQotICAvKiBPZmZzZXQgb2YgdGhlIG1lbWJlciB0YWJsZSAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBtZW1vZmZbMTJdOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgZ2xvYmFsIHN5bWJvbCB0YWJsZSAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBzeW1vZmZbMTJdOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgZmlyc3QgbWVtYmVyIGluIHRoZSBhcmNoaXZlIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIGZpcnN0bWVtb2ZmWzEyXTsKLQotICAvKiBPZmZzZXQgb2YgdGhlIGxhc3QgbWVtYmVyIGluIHRoZSBhcmNoaXZlIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIGxhc3RtZW1vZmZbMTJdOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgZmlyc3QgbWVtYmVyIG9uIHRoZSBmcmVlIGxpc3QgKGRlY2ltYWwgQVNDSUkKLSAgICAgc3RyaW5nKS4gICovCi0gIGNoYXIgZnJlZW9mZlsxMl07Ci19OwotCi0jZGVmaW5lIFNJWkVPRl9BUl9GSUxFX0hEUiAoNSAqIDEyICsgU1hDT0ZGQVJNQUcpCi0KLS8qIEVhY2ggWENPRkYgYXJjaGl2ZSBtZW1iZXIgc3RhcnRzIHdpdGggdGhpcyAocHJpbnRhYmxlKSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgeGNvZmZfYXJfaGRyCi17Ci0gIC8qIEZpbGUgc2l6ZSBub3QgaW5jbHVkaW5nIHRoZSBoZWFkZXIgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgc2l6ZVsxMl07Ci0KLSAgLyogRmlsZSBvZmZzZXQgb2YgbmV4dCBhcmNoaXZlIG1lbWJlciAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBuZXh0b2ZmWzEyXTsKLQotICAvKiBGaWxlIG9mZnNldCBvZiBwcmV2aW91cyBhcmNoaXZlIG1lbWJlciAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBwcmV2b2ZmWzEyXTsKLQotICAvKiBGaWxlIG10aW1lIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIGRhdGVbMTJdOwotCi0gIC8qIEZpbGUgVUlEIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIHVpZFsxMl07Ci0KLSAgLyogRmlsZSBHSUQgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgZ2lkWzEyXTsKLQotICAvKiBGaWxlIG1vZGUgKG9jdGFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIG1vZGVbMTJdOwotCi0gIC8qIExlbmd0aCBvZiBmaWxlIG5hbWUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbmFtbGVuWzRdOwotCi0gIC8qIFRoaXMgc3RydWN0dXJlIGlzIGZvbGxvd2VkIGJ5IHRoZSBmaWxlIG5hbWUuICBUaGUgbGVuZ3RoIG9mIHRoZQotICAgICBuYW1lIGlzIGdpdmVuIGluIHRoZSBuYW1sZW4gZmllbGQuICBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBuYW1lIGlzCi0gICAgIG9kZCwgdGhlIG5hbWUgaXMgZm9sbG93ZWQgYnkgYSBudWxsIGJ5dGUuICBUaGUgbmFtZSBhbmQgb3B0aW9uYWwKLSAgICAgbnVsbCBieXRlIGFyZSBmb2xsb3dlZCBieSBYQ09GRkFSRk1BRywgd2hpY2ggaXMgbm90IGluY2x1ZGVkIGluCi0gICAgIG5hbWxlbi4gIFRoZSBjb250ZW50cyBvZiB0aGUgYXJjaGl2ZSBtZW1iZXIgZm9sbG93OyB0aGUgbnVtYmVyIG9mCi0gICAgIGJ5dGVzIGlzIGdpdmVuIGluIHRoZSBzaXplIGZpZWxkLiAgKi8KLX07Ci0KLSNkZWZpbmUgU0laRU9GX0FSX0hEUiAoNyAqIDEyICsgNCkKLQotLyogV2Ugc3RvcmUgYSBjb3B5IG9mIHRoZSB4Y29mZl9hcl9maWxlX2hkciBpbiB0aGUgdGRhdGEgZmllbGQgb2YgdGhlCi0gICBhcnRkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIHhjb2ZmX2FyZGF0YShhYmZkKSBcCi0gICgoc3RydWN0IHhjb2ZmX2FyX2ZpbGVfaGRyICopIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSkKLQotLyogV2Ugc3RvcmUgYSBjb3B5IG9mIHRoZSB4Y29mZl9hcl9oZHIgaW4gdGhlIGFyZWx0X2RhdGEgZmllbGQgb2YgYW4KLSAgIGFyY2hpdmUgZWxlbWVudC4gICovCi0jZGVmaW5lIGFyY2hfZWx0ZGF0YShiZmQpICgoc3RydWN0IGFyZWx0ZGF0YSAqKSAoKGJmZCktPmFyZWx0X2RhdGEpKQotI2RlZmluZSBhcmNoX3hoZHIoYmZkKSBcCi0gICgoc3RydWN0IHhjb2ZmX2FyX2hkciAqKSBhcmNoX2VsdGRhdGEgKGJmZCktPmFyY2hfaGVhZGVyKQotCi0vKiBYQ09GRiBhcmNoaXZlcyBkbyBub3QgaGF2ZSBhbnl0aGluZyB3aGljaCBjb3JyZXNwb25kcyB0byBhbgotICAgZXh0ZW5kZWQgbmFtZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgeGNvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZmRfZmFsc2UKLSNkZWZpbmUgeGNvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSB4Y29mZl90cnVuY2F0ZV9hcm5hbWUgYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lCi0KLS8qIFdlIGNhbiB1c2UgdGhlIHN0YW5kYXJkIGdldF9lbHRfYXRfaW5kZXggcm91dGluZS4gICovCi0KLSNkZWZpbmUgeGNvZmZfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotCi0vKiBYQ09GRiBhcmNoaXZlcyBkbyBub3QgaGF2ZSBhIHRpbWVzdGFtcC4gICovCi0KLSNkZWZpbmUgeGNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQotCi0vKiBSZWFkIGluIHRoZSBhcm1hcCBvZiBhbiBYQ09GRiBhcmNoaXZlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX3NsdXJwX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGZpbGVfcHRyIG9mZjsKLSAgc3RydWN0IHhjb2ZmX2FyX2hkciBoZHI7Ci0gIHNpemVfdCBuYW1sZW47Ci0gIGJmZF9zaXplX3R5cGUgc3o7Ci0gIGJmZF9ieXRlICpjb250ZW50cywgKmNlbmQ7Ci0gIHVuc2lnbmVkIGludCBjLCBpOwotICBjYXJzeW0gKmFyc3ltOwotICBiZmRfYnl0ZSAqcDsKLQotICBpZiAoeGNvZmZfYXJkYXRhIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9oYXNfbWFwIChhYmZkKSA9IGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIG9mZiA9IHN0cnRvbCAoeGNvZmZfYXJkYXRhIChhYmZkKS0+c3ltb2ZmLCAoY2hhciAqKikgTlVMTCwgMTApOwotICBpZiAob2ZmID09IDApCi0gICAgewotICAgICAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmYsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgc3ltYm9sIHRhYmxlIHN0YXJ0cyB3aXRoIGEgbm9ybWFsIGFyY2hpdmUgaGVhZGVyLiAgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmaGRyLCBTSVpFT0ZfQVJfSERSLCAxLCBhYmZkKSAhPSBTSVpFT0ZfQVJfSERSKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTa2lwIHRoZSBuYW1lIChub3JtYWxseSBlbXB0eSkuICAqLwotICBuYW1sZW4gPSBzdHJ0b2wgKGhkci5uYW1sZW4sIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKChuYW1sZW4gKyAxKSAmIH4xKSArIFNYQ09GRkFSRk1BRywgU0VFS19DVVIpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFJlYWQgaW4gdGhlIGVudGlyZSBzeW1ib2wgdGFibGUuICAqLwotICBzeiA9IHN0cnRvbCAoaGRyLnNpemUsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgc3opOwotICBpZiAoY29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgY29udGVudHMsIDEsIHN6LCBhYmZkKSAhPSBzeikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIHN5bWJvbCB0YWJsZSBzdGFydHMgd2l0aCBhIGZvdXIgYnl0ZSBjb3VudC4gICovCi0gIGMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzKTsKLQotICBpZiAoYyAqIDQgPj0gc3opCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzID0gKChjYXJzeW0gKikKLQkJCQliZmRfYWxsb2MgKGFiZmQsIGMgKiBzaXplb2YgKGNhcnN5bSkpKTsKLSAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEFmdGVyIHRoZSBjb3VudCBjb21lcyBhIGxpc3Qgb2YgZm91ciBieXRlIGZpbGUgb2Zmc2V0cy4gICovCi0gIGZvciAoaSA9IDAsIGFyc3ltID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMsIHAgPSBjb250ZW50cyArIDQ7Ci0gICAgICAgaSA8IGM7Ci0gICAgICAgKytpLCArK2Fyc3ltLCBwICs9IDQpCi0gICAgYXJzeW0tPmZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBwKTsKLQotICAvKiBBZnRlciB0aGUgZmlsZSBvZmZzZXRzIGNvbWUgbnVsbCB0ZXJtaW5hdGVkIHN5bWJvbCBuYW1lcy4gICovCi0gIGNlbmQgPSBjb250ZW50cyArIHN6OwotICBmb3IgKGkgPSAwLCBhcnN5bSA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzOwotICAgICAgIGkgPCBjOwotICAgICAgICsraSwgKythcnN5bSwgcCArPSBzdHJsZW4gKChjaGFyICopIHApICsgMSkKLSAgICB7Ci0gICAgICBpZiAocCA+PSBjZW5kKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGFyc3ltLT5uYW1lID0gKGNoYXIgKikgcDsKLSAgICB9Ci0KLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZl9jb3VudCA9IGM7Ci0gIGJmZF9oYXNfbWFwIChhYmZkKSA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlZSBpZiB0aGlzIGlzIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi14Y29mZl9hcmNoaXZlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHhjb2ZmX2FyX2ZpbGVfaGRyIGhkcjsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIsIFNJWkVPRl9BUl9GSUxFX0hEUiwgMSwgYWJmZCkKLSAgICAgICE9IFNJWkVPRl9BUl9GSUxFX0hEUikKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKHN0cm5jbXAgKGhkci5tYWdpYywgWENPRkZBUk1BRywgU1hDT0ZGQVJNQUcpICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogV2UgYXJlIHNldHRpbmcgYmZkX2FyZGF0YShhYmZkKSBoZXJlLCBidXQgc2luY2UgYmZkX2FyZGF0YQotICAgICBpbnZvbHZlcyBhIGNhc3QsIHdlIGNhbid0IGRvIGl0IGFzIHRoZSBsZWZ0IG9wZXJhbmQgb2YKLSAgICAgYXNzaWdubWVudC4gICovCi0gIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9Ci0gICAgKHN0cnVjdCBhcnRkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFydGRhdGEpKTsKLQotICBpZiAoYmZkX2FyZGF0YSAoYWJmZCkgPT0gKHN0cnVjdCBhcnRkYXRhICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYmZkX2FyZGF0YSAoYWJmZCktPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IHN0cnRvbCAoaGRyLmZpcnN0bWVtb2ZmLAotCQkJCQkJICAoY2hhciAqKikgTlVMTCwgMTApOwotICBiZmRfYXJkYXRhIChhYmZkKS0+Y2FjaGUgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+YXJjaGl2ZV9oZWFkID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOwotCi0gIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9IGJmZF96YWxsb2MgKGFiZmQsIFNJWkVPRl9BUl9GSUxFX0hEUik7Ci0gIGlmIChiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBtZW1jcHkgKGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSwgJmhkciwgU0laRU9GX0FSX0ZJTEVfSERSKTsKLQotICBpZiAoISB4Y29mZl9zbHVycF9hcm1hcCAoYWJmZCkpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGJmZF9hcmRhdGEgKGFiZmQpKTsKLSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9IChzdHJ1Y3QgYXJ0ZGF0YSAqKSBOVUxMOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi0vKiBSZWFkIHRoZSBhcmNoaXZlIGhlYWRlciBpbiBhbiBYQ09GRiBhcmNoaXZlLiAgKi8KLQotc3RhdGljIFBUUgoteGNvZmZfcmVhZF9hcl9oZHIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHhjb2ZmX2FyX2hkciBoZHI7Ci0gIHNpemVfdCBuYW1sZW47Ci0gIHN0cnVjdCB4Y29mZl9hcl9oZHIgKmhkcnA7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKnJldDsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIsIFNJWkVPRl9BUl9IRFIsIDEsIGFiZmQpICE9IFNJWkVPRl9BUl9IRFIpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbmFtbGVuID0gc3RydG9sIChoZHIubmFtbGVuLCAoY2hhciAqKikgTlVMTCwgMTApOwotICBoZHJwID0gKHN0cnVjdCB4Y29mZl9hcl9oZHIgKikgYmZkX2FsbG9jIChhYmZkLCBTSVpFT0ZfQVJfSERSICsgbmFtbGVuICsgMSk7Ci0gIGlmIChoZHJwID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG1lbWNweSAoaGRycCwgJmhkciwgU0laRU9GX0FSX0hEUik7Ci0gIGlmIChiZmRfcmVhZCAoKGNoYXIgKikgaGRycCArIFNJWkVPRl9BUl9IRFIsIDEsIG5hbWxlbiwgYWJmZCkgIT0gbmFtbGVuKQotICAgIHJldHVybiBOVUxMOwotICAoKGNoYXIgKikgaGRycClbU0laRU9GX0FSX0hEUiArIG5hbWxlbl0gPSAnXDAnOwotCi0gIHJldCA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJlbHRkYXRhKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0LT5hcmNoX2hlYWRlciA9IChjaGFyICopIGhkcnA7Ci0gIHJldC0+cGFyc2VkX3NpemUgPSBzdHJ0b2wgKGhkci5zaXplLCAoY2hhciAqKikgTlVMTCwgMTApOwotICByZXQtPmZpbGVuYW1lID0gKGNoYXIgKikgaGRycCArIFNJWkVPRl9BUl9IRFI7Ci0KLSAgLyogU2tpcCBvdmVyIHRoZSBYQ09GRkFSRk1BRyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIG5hbWUuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChuYW1sZW4gJiAxKSArIFNYQ09GRkFSRk1BRywgU0VFS19DVVIpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIChQVFIpIHJldDsKLX0KLQotLyogT3BlbiB0aGUgbmV4dCBlbGVtZW50IGluIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgYmZkICoKLXhjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaGl2ZSwgbGFzdF9maWxlKQotICAgICBiZmQgKmFyY2hpdmU7Ci0gICAgIGJmZCAqbGFzdF9maWxlOwotewotICBmaWxlX3B0ciBmaWxlc3RhcnQ7Ci0KLSAgaWYgKHhjb2ZmX2FyZGF0YSAoYXJjaGl2ZSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChsYXN0X2ZpbGUgPT0gTlVMTCkKLSAgICBmaWxlc3RhcnQgPSBiZmRfYXJkYXRhIChhcmNoaXZlKS0+Zmlyc3RfZmlsZV9maWxlcG9zOwotICBlbHNlCi0gICAgZmlsZXN0YXJ0ID0gc3RydG9sIChhcmNoX3hoZHIgKGxhc3RfZmlsZSktPm5leHRvZmYsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0KLSAgaWYgKGZpbGVzdGFydCA9PSAwCi0gICAgICB8fCBmaWxlc3RhcnQgPT0gc3RydG9sICh4Y29mZl9hcmRhdGEgKGFyY2hpdmUpLT5tZW1vZmYsCi0JCQkgICAgICAoY2hhciAqKikgTlVMTCwgMTApCi0gICAgICB8fCBmaWxlc3RhcnQgPT0gc3RydG9sICh4Y29mZl9hcmRhdGEgKGFyY2hpdmUpLT5zeW1vZmYsCi0JCQkgICAgICAoY2hhciAqKikgTlVMTCwgMTApKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFyY2hpdmUsIGZpbGVzdGFydCk7Ci19Ci0KLS8qIFN0YXQgYW4gZWxlbWVudCBpbiBhbiBYQ09GRiBhcmNoaXZlLiAgKi8KLQotc3RhdGljIGludAoteGNvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IChhYmZkLCBzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzdGF0ICpzOwotewotICBzdHJ1Y3QgeGNvZmZfYXJfaGRyICpoZHJwOwotCi0gIGlmIChhYmZkLT5hcmVsdF9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaGRycCA9IGFyY2hfeGhkciAoYWJmZCk7Ci0KLSAgcy0+c3RfbXRpbWUgPSBzdHJ0b2wgKGhkcnAtPmRhdGUsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIHMtPnN0X3VpZCA9IHN0cnRvbCAoaGRycC0+dWlkLCAoY2hhciAqKikgTlVMTCwgMTApOwotICBzLT5zdF9naWQgPSBzdHJ0b2wgKGhkcnAtPmdpZCwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgcy0+c3RfbW9kZSA9IHN0cnRvbCAoaGRycC0+bW9kZSwgKGNoYXIgKiopIE5VTEwsIDgpOwotICBzLT5zdF9zaXplID0gYXJjaF9lbHRkYXRhIChhYmZkKS0+cGFyc2VkX3NpemU7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIE5vcm1hbGl6ZSBhIGZpbGUgbmFtZSBmb3IgaW5jbHVzaW9uIGluIGFuIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ub3JtYWxpemVfZmlsZW5hbWUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3QgY2hhciAqZmlsZTsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0KLSAgZmlsZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICBmaWxlbmFtZSA9IHN0cnJjaHIgKGZpbGUsICcvJyk7Ci0gIGlmIChmaWxlbmFtZSAhPSBOVUxMKQotICAgIGZpbGVuYW1lKys7Ci0gIGVsc2UKLSAgICBmaWxlbmFtZSA9IGZpbGU7Ci0gIHJldHVybiBmaWxlbmFtZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIFhDT0ZGIGFybWFwLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfd3JpdGVfYXJtYXAgKGFiZmQsIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50LCBzdHJpZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGg7Ci0gICAgIHN0cnVjdCBvcmwgKm1hcDsKLSAgICAgdW5zaWduZWQgaW50IG9ybF9jb3VudDsKLSAgICAgaW50IHN0cmlkeDsKLXsKLSAgc3RydWN0IHhjb2ZmX2FyX2hkciBoZHI7Ci0gIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGNoYXIgYnVmWzRdOwotICBiZmQgKnN1YjsKLSAgZmlsZV9wdHIgZmlsZW9mZjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgbWVtc2V0ICgmaGRyLCAwLCBzaXplb2YgaGRyKTsKLSAgc3ByaW50ZiAoaGRyLnNpemUsICIlbGQiLCAobG9uZykgKDQgKyBvcmxfY291bnQgKiA0ICsgc3RyaWR4KSk7Ci0gIHNwcmludGYgKGhkci5uZXh0b2ZmLCAiJWQiLCAwKTsKLSAgbWVtY3B5IChoZHIucHJldm9mZiwgeGNvZmZfYXJkYXRhIChhYmZkKS0+bWVtb2ZmLCAxMik7Ci0gIHNwcmludGYgKGhkci5kYXRlLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoaGRyLnVpZCwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGhkci5naWQsICIlZCIsIDApOwotICBzcHJpbnRmIChoZHIubW9kZSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGhkci5uYW1sZW4sICIlZCIsIDApOwotCi0gIC8qIFdlIG5lZWQgc3BhY2VzLCBub3QgbnVsbCBieXRlcywgaW4gdGhlIGhlYWRlci4gICovCi0gIGZvciAocCA9IChjaGFyICopICZoZHI7IHAgPCAoY2hhciAqKSAmaGRyICsgU0laRU9GX0FSX0hEUjsgcCsrKQotICAgIGlmICgqcCA9PSAnXDAnKQotICAgICAgKnAgPSAnICc7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmhkciwgU0laRU9GX0FSX0hEUiwgMSwgYWJmZCkgIT0gU0laRU9GX0FSX0hEUgotICAgICAgfHwgYmZkX3dyaXRlIChYQ09GRkFSRk1BRywgMSwgU1hDT0ZGQVJGTUFHLCBhYmZkKSAhPSBTWENPRkZBUkZNQUcpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBvcmxfY291bnQsIGJ1Zik7Ci0gIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3ViID0gYWJmZC0+YXJjaGl2ZV9oZWFkOwotICBmaWxlb2ZmID0gU0laRU9GX0FSX0ZJTEVfSERSOwotICBpID0gMDsKLSAgd2hpbGUgKHN1YiAhPSBOVUxMICYmIGkgPCBvcmxfY291bnQpCi0gICAgewotICAgICAgc2l6ZV90IG5hbWxlbjsKLQotICAgICAgd2hpbGUgKCgoYmZkICopIChtYXBbaV0pLnBvcykgPT0gc3ViKQotCXsKLQkgIGJmZF9oX3B1dF8zMiAoYWJmZCwgZmlsZW9mZiwgYnVmKTsKLQkgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgNCwgYWJmZCkgIT0gNCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgKytpOwotCX0KLSAgICAgIG5hbWxlbiA9IHN0cmxlbiAobm9ybWFsaXplX2ZpbGVuYW1lIChzdWIpKTsKLSAgICAgIG5hbWxlbiA9IChuYW1sZW4gKyAxKSAmfiAxOwotICAgICAgZmlsZW9mZiArPSAoU0laRU9GX0FSX0hEUgotCQkgICsgbmFtbGVuCi0JCSAgKyBTWENPRkZBUkZNQUcKLQkJICArIGFyZWx0X3NpemUgKHN1YikpOwotICAgICAgZmlsZW9mZiA9IChmaWxlb2ZmICsgMSkgJn4gMTsKLSAgICAgIHN1YiA9IHN1Yi0+bmV4dDsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IG9ybF9jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzaXplX3QgbmFtbGVuOwotCi0gICAgICBuYW1lID0gKm1hcFtpXS5uYW1lOwotICAgICAgbmFtbGVuID0gc3RybGVuIChuYW1lKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKG5hbWUsIDEsIG5hbWxlbiArIDEsIGFiZmQpICE9IG5hbWxlbiArIDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoKHN0cmlkeCAmIDEpICE9IDApCi0gICAgewotICAgICAgY2hhciBiOwotCi0gICAgICBiID0gJ1wwJzsKLSAgICAgIGlmIChiZmRfd3JpdGUgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBYQ09GRiBhcmNoaXZlLiAgV2UgYWx3YXlzIHdyaXRlIGFuIGVudGlyZSBhcmNoaXZlLAotICAgcmF0aGVyIHRoYW4gZnVzc2luZyB3aXRoIHRoZSBmcmVlbGlzdCBhbmQgc28gZm9ydGguICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgeGNvZmZfYXJfZmlsZV9oZHIgZmhkcjsKLSAgc2l6ZV90IGNvdW50OwotICBzaXplX3QgdG90YWxfbmFtbGVuOwotICBmaWxlX3B0ciAqb2Zmc2V0czsKLSAgYm9vbGVhbiBtYWtlbWFwOwotICBib29sZWFuIGhhc29iamVjdHM7Ci0gIGZpbGVfcHRyIHByZXZvZmYsIG5leHRvZmY7Ci0gIGJmZCAqc3ViOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgc3RydWN0IHhjb2ZmX2FyX2hkciBhaGRyOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgZGVjYnVmWzEzXTsKLQotICBtZW1zZXQgKCZmaGRyLCAwLCBzaXplb2YgZmhkcik7Ci0gIHN0cm5jcHkgKGZoZHIubWFnaWMsIFhDT0ZGQVJNQUcsIFNYQ09GRkFSTUFHKTsKLSAgc3ByaW50ZiAoZmhkci5maXJzdG1lbW9mZiwgIiVkIiwgU0laRU9GX0FSX0ZJTEVfSERSKTsKLSAgc3ByaW50ZiAoZmhkci5mcmVlb2ZmLCAiJWQiLCAwKTsKLQotICBjb3VudCA9IDA7Ci0gIHRvdGFsX25hbWxlbiA9IDA7Ci0gIGZvciAoc3ViID0gYWJmZC0+YXJjaGl2ZV9oZWFkOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5uZXh0KQotICAgIHsKLSAgICAgICsrY291bnQ7Ci0gICAgICB0b3RhbF9uYW1sZW4gKz0gc3RybGVuIChub3JtYWxpemVfZmlsZW5hbWUgKHN1YikpICsgMTsKLSAgICB9Ci0gIG9mZnNldHMgPSAoZmlsZV9wdHIgKikgYmZkX2FsbG9jIChhYmZkLCBjb3VudCAqIHNpemVvZiAoZmlsZV9wdHIpKTsKLSAgaWYgKG9mZnNldHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBTSVpFT0ZfQVJfRklMRV9IRFIsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtYWtlbWFwID0gYmZkX2hhc19tYXAgKGFiZmQpOwotICBoYXNvYmplY3RzID0gZmFsc2U7Ci0gIHByZXZvZmYgPSAwOwotICBuZXh0b2ZmID0gU0laRU9GX0FSX0ZJTEVfSERSOwotICBmb3IgKHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZCwgaSA9IDA7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPm5leHQsIGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc2l6ZV90IG5hbWxlbjsKLSAgICAgIHN0cnVjdCB4Y29mZl9hcl9oZHIgKmFoZHJwOwotICAgICAgYmZkX3NpemVfdHlwZSByZW1haW5pbmc7Ci0KLSAgICAgIGlmIChtYWtlbWFwICYmICEgaGFzb2JqZWN0cykKLQl7Ci0JICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoc3ViLCBiZmRfb2JqZWN0KSkKLQkgICAgaGFzb2JqZWN0cyA9IHRydWU7Ci0JfQotCi0gICAgICBuYW1lID0gbm9ybWFsaXplX2ZpbGVuYW1lIChzdWIpOwotICAgICAgbmFtbGVuID0gc3RybGVuIChuYW1lKTsKLQotICAgICAgaWYgKHN1Yi0+YXJlbHRfZGF0YSAhPSBOVUxMKQotCWFoZHJwID0gYXJjaF94aGRyIChzdWIpOwotICAgICAgZWxzZQotCWFoZHJwID0gTlVMTDsKLQotICAgICAgaWYgKGFoZHJwID09IE5VTEwpCi0JewotCSAgc3RydWN0IHN0YXQgczsKLQotCSAgbWVtc2V0ICgmYWhkciwgMCwgc2l6ZW9mIGFoZHIpOwotCSAgYWhkcnAgPSAmYWhkcjsKLQkgIGlmIChzdGF0IChiZmRfZ2V0X2ZpbGVuYW1lIChzdWIpLCAmcykgIT0gMCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIHNwcmludGYgKGFoZHJwLT5zaXplLCAiJWxkIiwgKGxvbmcpIHMuc3Rfc2l6ZSk7Ci0JICBzcHJpbnRmIChhaGRycC0+ZGF0ZSwgIiVsZCIsIChsb25nKSBzLnN0X210aW1lKTsKLQkgIHNwcmludGYgKGFoZHJwLT51aWQsICIlbGQiLCAobG9uZykgcy5zdF91aWQpOwotCSAgc3ByaW50ZiAoYWhkcnAtPmdpZCwgIiVsZCIsIChsb25nKSBzLnN0X2dpZCk7Ci0JICBzcHJpbnRmIChhaGRycC0+bW9kZSwgIiVvIiwgKHVuc2lnbmVkIGludCkgcy5zdF9tb2RlKTsKLQotCSAgaWYgKHN1Yi0+YXJlbHRfZGF0YSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3ViLT5hcmVsdF9kYXRhID0gYmZkX2FsbG9jIChzdWIsIHNpemVvZiAoc3RydWN0IGFyZWx0ZGF0YSkpOwotCSAgICAgIGlmIChzdWItPmFyZWx0X2RhdGEgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGFyY2hfZWx0ZGF0YSAoc3ViKS0+cGFyc2VkX3NpemUgPSBzLnN0X3NpemU7Ci0JfQotCi0gICAgICBzcHJpbnRmIChhaGRycC0+cHJldm9mZiwgIiVsZCIsIChsb25nKSBwcmV2b2ZmKTsKLSAgICAgIHNwcmludGYgKGFoZHJwLT5uYW1sZW4sICIlbGQiLCAobG9uZykgbmFtbGVuKTsKLQotICAgICAgLyogSWYgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZSBpcyBvZGQsIHdlIHdyaXRlIG91dCB0aGUgbnVsbCBieXRlCi0gICAgICAgICBhZnRlciB0aGUgbmFtZSBhcyB3ZWxsLiAgKi8KLSAgICAgIG5hbWxlbiA9IChuYW1sZW4gKyAxKSAmfiAxOwotCi0gICAgICByZW1haW5pbmcgPSBhcmVsdF9zaXplIChzdWIpOwotICAgICAgc2l6ZSA9IChTSVpFT0ZfQVJfSERSCi0JICAgICAgKyBuYW1sZW4KLQkgICAgICArIFNYQ09GRkFSRk1BRwotCSAgICAgICsgcmVtYWluaW5nKTsKLQotICAgICAgQkZEX0FTU0VSVCAobmV4dG9mZiA9PSBiZmRfdGVsbCAoYWJmZCkpOwotCi0gICAgICBvZmZzZXRzW2ldID0gbmV4dG9mZjsKLQotICAgICAgcHJldm9mZiA9IG5leHRvZmY7Ci0gICAgICBuZXh0b2ZmICs9IHNpemUgKyAoc2l6ZSAmIDEpOwotCi0gICAgICBzcHJpbnRmIChhaGRycC0+bmV4dG9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKLQotICAgICAgLyogV2UgbmVlZCBzcGFjZXMsIG5vdCBudWxsIGJ5dGVzLCBpbiB0aGUgaGVhZGVyLiAgKi8KLSAgICAgIGZvciAocCA9IChjaGFyICopIGFoZHJwOyBwIDwgKGNoYXIgKikgYWhkcnAgKyBTSVpFT0ZfQVJfSERSOyBwKyspCi0JaWYgKCpwID09ICdcMCcpCi0JICAqcCA9ICcgJzsKLQotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgYWhkcnAsIDEsIFNJWkVPRl9BUl9IRFIsIGFiZmQpICE9IFNJWkVPRl9BUl9IRFIKLQkgIHx8IGJmZF93cml0ZSAoKFBUUikgbmFtZSwgMSwgbmFtbGVuLCBhYmZkKSAhPSBuYW1sZW4KLQkgIHx8IChiZmRfd3JpdGUgKChQVFIpIFhDT0ZGQVJGTUFHLCAxLCBTWENPRkZBUkZNQUcsIGFiZmQpCi0JICAgICAgIT0gU1hDT0ZGQVJGTUFHKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoc3ViLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHdoaWxlIChyZW1haW5pbmcgIT0gMCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGFtdDsKLQkgIGJmZF9ieXRlIGJ1ZmZlcltERUZBVUxUX0JVRkZFUlNJWkVdOwotCi0JICBhbXQgPSBzaXplb2YgYnVmZmVyOwotCSAgaWYgKGFtdCA+IHJlbWFpbmluZykKLQkgICAgYW10ID0gcmVtYWluaW5nOwotCSAgaWYgKGJmZF9yZWFkIChidWZmZXIsIDEsIGFtdCwgc3ViKSAhPSBhbXQKLQkgICAgICB8fCBiZmRfd3JpdGUgKGJ1ZmZlciwgMSwgYW10LCBhYmZkKSAhPSBhbXQpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHJlbWFpbmluZyAtPSBhbXQ7Ci0JfQotCi0gICAgICBpZiAoKHNpemUgJiAxKSAhPSAwKQotCXsKLQkgIGJmZF9ieXRlIGI7Ci0KLQkgIGIgPSAnXDAnOwotCSAgaWYgKGJmZF93cml0ZSAoJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHNwcmludGYgKGZoZHIubGFzdG1lbW9mZiwgIiVsZCIsIChsb25nKSBwcmV2b2ZmKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIG1lbWJlciB0YWJsZS4gICovCi0KLSAgQkZEX0FTU0VSVCAobmV4dG9mZiA9PSBiZmRfdGVsbCAoYWJmZCkpOwotICBzcHJpbnRmIChmaGRyLm1lbW9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKLQotICBtZW1zZXQgKCZhaGRyLCAwLCBzaXplb2YgYWhkcik7Ci0gIHNwcmludGYgKGFoZHIuc2l6ZSwgIiVsZCIsIChsb25nKSAoMTIgKyBjb3VudCAqIDEyICsgdG90YWxfbmFtbGVuKSk7Ci0gIHNwcmludGYgKGFoZHIucHJldm9mZiwgIiVsZCIsIChsb25nKSBwcmV2b2ZmKTsKLSAgc3ByaW50ZiAoYWhkci5kYXRlLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoYWhkci51aWQsICIlZCIsIDApOwotICBzcHJpbnRmIChhaGRyLmdpZCwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGFoZHIubW9kZSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGFoZHIubmFtbGVuLCAiJWQiLCAwKTsKLQotICBzaXplID0gKFNJWkVPRl9BUl9IRFIKLQkgICsgMTIKLQkgICsgY291bnQgKiAxMgotCSAgKyB0b3RhbF9uYW1sZW4KLQkgICsgU1hDT0ZGQVJGTUFHKTsKLQotICBwcmV2b2ZmID0gbmV4dG9mZjsKLSAgbmV4dG9mZiArPSBzaXplICsgKHNpemUgJiAxKTsKLQotICBpZiAobWFrZW1hcCAmJiBoYXNvYmplY3RzKQotICAgIHNwcmludGYgKGFoZHIubmV4dG9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKLSAgZWxzZQotICAgIHNwcmludGYgKGFoZHIubmV4dG9mZiwgIiVkIiwgMCk7Ci0KLSAgLyogV2UgbmVlZCBzcGFjZXMsIG5vdCBudWxsIGJ5dGVzLCBpbiB0aGUgaGVhZGVyLiAgKi8KLSAgZm9yIChwID0gKGNoYXIgKikgJmFoZHI7IHAgPCAoY2hhciAqKSAmYWhkciArIFNJWkVPRl9BUl9IRFI7IHArKykKLSAgICBpZiAoKnAgPT0gJ1wwJykKLSAgICAgICpwID0gJyAnOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZhaGRyLCAxLCBTSVpFT0ZfQVJfSERSLCBhYmZkKSAhPSBTSVpFT0ZfQVJfSERSCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSBYQ09GRkFSRk1BRywgMSwgU1hDT0ZGQVJGTUFHLCBhYmZkKQotCSAgIT0gU1hDT0ZGQVJGTUFHKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3ByaW50ZiAoZGVjYnVmLCAiJS0xMmxkIiwgKGxvbmcpIGNvdW50KTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgZGVjYnVmLCAxLCAxMiwgYWJmZCkgIT0gMTIpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBzcHJpbnRmIChkZWNidWYsICIlLTEybGQiLCAobG9uZykgb2Zmc2V0c1tpXSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBkZWNidWYsIDEsIDEyLCBhYmZkKSAhPSAxMikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBmb3IgKHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZDsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc2l6ZV90IG5hbWxlbjsKLQotICAgICAgbmFtZSA9IG5vcm1hbGl6ZV9maWxlbmFtZSAoc3ViKTsKLSAgICAgIG5hbWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBuYW1lLCAxLCBuYW1sZW4gKyAxLCBhYmZkKSAhPSBuYW1sZW4gKyAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICgoc2l6ZSAmIDEpICE9IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgYjsKLQotICAgICAgYiA9ICdcMCc7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmYiwgMSwgMSwgYWJmZCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgYXJtYXAsIGlmIGFwcHJvcHJpYXRlLiAgKi8KLQotICBpZiAoISBtYWtlbWFwIHx8ICEgaGFzb2JqZWN0cykKLSAgICBzcHJpbnRmIChmaGRyLnN5bW9mZiwgIiVkIiwgMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChuZXh0b2ZmID09IGJmZF90ZWxsIChhYmZkKSk7Ci0gICAgICBzcHJpbnRmIChmaGRyLnN5bW9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKLSAgICAgIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9IChQVFIpICZmaGRyOwotICAgICAgaWYgKCEgX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCAoYWJmZCwgMCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGFyY2hpdmUgZmlsZSBoZWFkZXIuICAqLwotCi0gIC8qIFdlIG5lZWQgc3BhY2VzLCBub3QgbnVsbCBieXRlcywgaW4gdGhlIGhlYWRlci4gICovCi0gIGZvciAocCA9IChjaGFyICopICZmaGRyOyBwIDwgKGNoYXIgKikgJmZoZHIgKyBTSVpFT0ZfQVJfRklMRV9IRFI7IHArKykKLSAgICBpZiAoKnAgPT0gJ1wwJykKLSAgICAgICpwID0gJyAnOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgJmZoZHIsIFNJWkVPRl9BUl9GSUxFX0hEUiwgMSwgYWJmZCkgIT0KLQkgIFNJWkVPRl9BUl9GSUxFX0hEUikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogV2UgY2FuJ3QgdXNlIHRoZSB1c3VhbCBjb2ZmX3NpemVvZl9oZWFkZXJzIHJvdXRpbmUsIGJlY2F1c2UgQUlYCi0gICBhbHdheXMgdXNlcyBhbiBhLm91dCBoZWFkZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLV9iZmRfeGNvZmZfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gcmVsb2M7Ci17Ci0gIGludCBzaXplOwotCi0gIHNpemUgPSBGSUxIU1o7Ci0gIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotICAgIHNpemUgKz0gQU9VVFNaOwotICBlbHNlCi0gICAgc2l6ZSArPSBTTUFMTF9BT1VUU1o7Ci0gIHNpemUgKz0gYWJmZC0+c2VjdGlvbl9jb3VudCAqIFNDTkhTWjsKLSAgcmV0dXJuIHNpemU7Ci19Ci0MCi0jZGVmaW5lIENPUkVfRklMRV9QIF9iZmRfZHVtbXlfdGFyZ2V0Ci0KLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFwKLSAgX2JmZF9ub2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0KLSNpZmRlZiBBSVhfQ09SRQotI3VuZGVmIENPUkVfRklMRV9QCi0jZGVmaW5lIENPUkVfRklMRV9QIHJzNjAwMGNvZmZfY29yZV9wCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqIHJzNjAwMGNvZmZfY29yZV9wICgpOwotZXh0ZXJuIGJvb2xlYW4gcnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoKTsKLWV4dGVybiBib29sZWFuIHJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICgpOwotCi0jdW5kZWYJY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgIFwKLQkJCQkgICAgIHJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0KLWV4dGVybiBjaGFyICpyczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jdW5kZWYgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCByczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLQotZXh0ZXJuIGludCByczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSN1bmRlZiBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCByczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotCi0jdW5kZWYJY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZQljb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzCXJzNjAwMGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNlbmRpZiAvKiBBSVhfQ09SRSAqLwotCi0jaWZkZWYgTFlOWF9DT1JFCi0KLSN1bmRlZiBDT1JFX0ZJTEVfUAotI2RlZmluZSBDT1JFX0ZJTEVfUCBseW54X2NvcmVfZmlsZV9wCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqbHlueF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotZXh0ZXJuIGJvb2xlYW4gbHlueF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICpjb3JlX2JmZCwKLQkJCQkJCQkgICAgYmZkICpleGVjX2JmZCkpOwotI3VuZGVmCWNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0KLWV4dGVybiBjaGFyICpseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jdW5kZWYgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLQotZXh0ZXJuIGludCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSN1bmRlZiBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotCi0jZW5kaWYgLyogTFlOWF9DT1JFICovCi0KLSNkZWZpbmUgX2JmZF94Y29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIF9iZmRfeGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gY29mZl9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBfYmZkX3hjb2ZmX2JmZF9nY19zZWN0aW9ucyBjb2ZmX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBfYmZkX3hjb2ZmX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gY29mZl9iZmRfbGlua19zcGxpdF9zZWN0aW9uCi0KLS8qIFRoZSB0cmFuc2ZlciB2ZWN0b3IgdGhhdCBsZWFkcyB0aGUgb3V0c2lkZSB3b3JsZCB0byBhbGwgb2YgdGhlIGFib3ZlLiAqLwotCi1jb25zdCBiZmRfdGFyZ2V0Ci0jaWZkZWYgVEFSR0VUX1NZTQotICBUQVJHRVRfU1lNID0KLSNlbHNlCi0gIHJzNjAwMGNvZmZfdmVjID0KLSNlbmRpZgotewotI2lmZGVmIFRBUkdFVF9OQU1FCi0gIFRBUkdFVF9OQU1FLAotI2Vsc2UKLSAgImFpeGNvZmYtcnM2MDAwIiwJCS8qIG5hbWUgKi8KLSNlbmRpZgotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwJCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgRFlOQU1JQyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4/Pz8gRklYTUVtZ28gKi8KLQotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIHhjb2ZmX2FyY2hpdmVfcCwgQ09SRV9GSUxFX1B9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LAkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICB4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKHhjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF94Y29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfeGNvZmYpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1zaC5jIGIvYmZkL2NvZmYtc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNkNmVlYy4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1zaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk1OSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhpdGFjaGkgU3VwZXItSCBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCA8c2FjQGN5Z251cy5jb20+LgotICAgUmVsYXhpbmcgY29kZSB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIDxpYW5AY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJjb2ZmL3NoLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogSW50ZXJuYWwgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc2hfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBnZXRfc3ltYm9sX3ZhbHVlIFBBUkFNUyAoKGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gc2hfbWVyZ2VfcHJpdmF0ZV9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc2hfcmVsYXhfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKnNoX2luc25faW5mbyBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNoX2FsaWduX2xvYWRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYmZkX2J5dGUgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9zd2FwX2luc25zCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF9ieXRlICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHNoX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYmZkX2J5dGUgKnNoX2NvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqLCBib29sZWFuLCBhc3ltYm9sICoqKSk7Ci0KLS8qIERlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQgdG8gMioqNC4gICovCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoNCkKLQotLyogR2VuZXJhdGUgbG9uZyBmaWxlIG5hbWVzLiAgKi8KLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotCi0vKiBUaGUgc3VwcG9ydGVkIHJlbG9jYXRpb25zLiAgVGhlcmUgYXJlIGEgbG90IG9mIHJlbG9jYXRpb25zIGRlZmluZWQKLSAgIGluIGNvZmYvaW50ZXJuYWwuaCB3aGljaCB3ZSBkbyBub3QgZXhwZWN0IHRvIGV2ZXIgc2VlLiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHNoX2NvZmZfaG93dG9zW10gPQotewotICB7IDAgfSwKLSAgeyAxIH0sCi0gIHsgMiB9LAotICB7IDMgfSwgLyogUl9TSF9QQ1JFTDggKi8KLSAgeyA0IH0sIC8qIFJfU0hfUENSRUwxNiAqLwotICB7IDUgfSwgLyogUl9TSF9ISUdIOCAqLwotICB7IDYgfSwgLyogUl9TSF9JTU0yNCAqLwotICB7IDcgfSwgLyogUl9TSF9MT1cxNiAqLwotICB7IDggfSwKLSAgeyA5IH0sIC8qIFJfU0hfUENESVNQOEJZNCAqLwotCi0gIEhPV1RPIChSX1NIX1BDRElTUDhCWTIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX3BjZGlzcDhieTIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICB7IDExIH0sIC8qIFJfU0hfUENESVNQOCAqLwotCi0gIEhPV1RPIChSX1NIX1BDRElTUCwJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9wY2Rpc3AxMmJ5MiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgeyAxMyB9LAotCi0gIEhPV1RPIChSX1NIX0lNTTMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2ltbTMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICB7IDE1IH0sCi0gIHsgMTYgfSwgLyogUl9TSF9JTU04ICovCi0gIHsgMTcgfSwgLyogUl9TSF9JTU04QlkyICovCi0gIHsgMTggfSwgLyogUl9TSF9JTU04Qlk0ICovCi0gIHsgMTkgfSwgLyogUl9TSF9JTU00ICovCi0gIHsgMjAgfSwgLyogUl9TSF9JTU00QlkyICovCi0gIHsgMjEgfSwgLyogUl9TSF9JTU00Qlk0ICovCi0KLSAgSE9XVE8gKFJfU0hfUENSRUxJTU04QlkyLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX3BjcmVsaW1tOGJ5MiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX1BDUkVMSU1NOEJZNCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9wY3JlbGltbThieTQiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9JTU0xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9pbW0xNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX1NXSVRDSDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX3N3aXRjaDE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfU1dJVENIMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfc3dpdGNoMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX1VTRVMsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfdXNlcyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX0NPVU5ULAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2NvdW50IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9BTElHTiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9hbGlnbiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfQ09ERSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9jb2RlIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9EQVRBLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2RhdGEiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX0xBQkVMLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2xhYmVsIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9TV0lUQ0g4LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfc3dpdGNoOCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLSNkZWZpbmUgU0hfQ09GRl9IT1dUT19DT1VOVCAoc2l6ZW9mIHNoX2NvZmZfaG93dG9zIC8gc2l6ZW9mIHNoX2NvZmZfaG93dG9zWzBdKQotCi0vKiBDaGVjayBmb3IgYSBiYWQgbWFnaWMgbnVtYmVyLiAgKi8KLSNkZWZpbmUgQkFETUFHKHgpIFNIQkFETUFHKHgpCi0KLS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICh0aGlzIGlzIG5vdCBjdXJyZW50bHkgdXNlZCkuICAqLwotI2RlZmluZSBTSCAxCi0KLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgc2V0IGhlcmUuICAqLwotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLQotLyogU3dhcCB0aGUgcl9vZmZzZXQgZmllbGQgaW4gYW5kIG91dC4gICovCi0jZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUICBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8zMgotCi0vKiBTd2FwIG91dCBleHRyYSBpbmZvcm1hdGlvbiBpbiB0aGUgcmVsb2Mgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCwgc3JjLCBkc3QpCVwKLSAgZG8JCQkJCQlcCi0gICAgewkJCQkJCVwKLSAgICAgIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsJCQlcCi0gICAgICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7CQkJXAotICAgIH0JCQkJCQlcCi0gIHdoaWxlICgwKQotCi0vKiBHZXQgdGhlIHZhbHVlIG9mIGEgc3ltYm9sLCB3aGVuIHBlcmZvcm1pbmcgYSByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGxvbmcKLWdldF9zeW1ib2xfdmFsdWUgKHN5bWJvbCkgICAgICAgCi0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGVsc2UgCi0gICAgcmVsb2NhdGlvbiA9IChzeW1ib2wtPnZhbHVlICsKLQkJICBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotCQkgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLSAgcmV0dXJuIHJlbG9jYXRpb247Ci19Ci0KLS8qIFRoaXMgbWFjcm8gaXMgdXNlZCBpbiBjb2ZmY29kZS5oIHRvIGdldCB0aGUgaG93dG8gY29ycmVzcG9uZGluZyB0bwotICAgYW4gaW50ZXJuYWwgcmVsb2MuICAqLwotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKHJlbGVudCwgaW50ZXJuYWwpCQlcCi0gICgocmVsZW50KS0+aG93dG8gPQkJCQlcCi0gICAoKGludGVybmFsKS0+cl90eXBlIDwgU0hfQ09GRl9IT1dUT19DT1VOVAlcCi0gICAgPyAmc2hfY29mZl9ob3d0b3NbKGludGVybmFsKS0+cl90eXBlXQlcCi0gICAgOiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKSkKLQotLyogVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgbWFjcm8gaW4gY29mZmNvZGUuaCwgZXhjZXB0IHRoYXQgaXQgY29waWVzCi0gICByX29mZnNldCBpbnRvIHJlbG9jX2VudHJ5LT5hZGRlbmQgZm9yIHNvbWUgcmVsb2NzLiAgKi8KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgcHRyLCByZWxvYywgY2FjaGVfcHRyKSAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZzeW0gPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOyAgICAgIFwKLSAgICBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSAhPSBhYmZkKSAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb2Zmc3ltID0gKG9ial9zeW1ib2xzIChhYmZkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICArIChjYWNoZV9wdHItPnN5bV9wdHJfcHRyIC0gc3ltYm9scykpOyAgICAgICAgIFwKLSAgICBlbHNlIGlmIChwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb2Zmc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgcHRyKTsgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChjb2Zmc3ltICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgJiYgY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID09IDApICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgPT0gYWJmZCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAmJiBwdHItPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gKHB0ci0+c2VjdGlvbi0+dm1hICsgcHRyLT52YWx1ZSk7ICAgXAotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKChyZWxvYykucl90eXBlID09IFJfU0hfU1dJVENIOAkJCQlcCi0JfHwgKHJlbG9jKS5yX3R5cGUgPT0gUl9TSF9TV0lUQ0gxNgkJCVwKLQl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX1NXSVRDSDMyCQkJXAotCXx8IChyZWxvYykucl90eXBlID09IFJfU0hfVVNFUwkJCQlcCi0JfHwgKHJlbG9jKS5yX3R5cGUgPT0gUl9TSF9DT1VOVAkJCQlcCi0JfHwgKHJlbG9jKS5yX3R5cGUgPT0gUl9TSF9BTElHTikJCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IChyZWxvYykucl9vZmZzZXQ7CQkJXAotICB9Ci0KLS8qIFRoaXMgaXMgdGhlIGhvd3RvIGZ1bmN0aW9uIGZvciB0aGUgU0ggcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zaF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGJmZF92bWEgc3ltX3ZhbHVlOwotICB1bnNpZ25lZCBzaG9ydCByX3R5cGU7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBhZGRyICsgKGJmZF9ieXRlICopIGRhdGE7Ci0KLSAgcl90eXBlID0gcmVsb2NfZW50cnktPmhvd3RvLT50eXBlOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgLyogUGFydGlhbCBsaW5raW5nLS1kbyBub3RoaW5nLiAgKi8KLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBBbG1vc3QgYWxsIHJlbG9jcyBoYXZlIHRvIGRvIHdpdGggcmVsYXhpbmcuICBJZiBhbnkgd29yayBtdXN0IGJlCi0gICAgIGRvbmUgZm9yIHRoZW0sIGl0IGhhcyBiZWVuIGRvbmUgaW4gc2hfcmVsYXhfc2VjdGlvbi4gICovCi0gIGlmIChyX3R5cGUgIT0gUl9TSF9JTU0zMgotICAgICAgJiYgKHJfdHlwZSAhPSBSX1NIX1BDRElTUAotCSAgfHwgKHN5bWJvbF9pbi0+ZmxhZ3MgJiBCU0ZfTE9DQUwpICE9IDApKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgaWYgKHN5bWJvbF9pbiAhPSBOVUxMCi0gICAgICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9pbi0+c2VjdGlvbikpCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgc3ltX3ZhbHVlID0gZ2V0X3N5bWJvbF92YWx1ZSAoc3ltYm9sX2luKTsKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1NIX0lNTTMyOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGhpdF9kYXRhKTsKLSAgICAgIGluc24gKz0gc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGhpdF9kYXRhKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9TSF9QQ0RJU1A6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgaGl0X2RhdGEpOwotICAgICAgc3ltX3ZhbHVlICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgICBzeW1fdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICAgKyBhZGRyCi0JCSAgICArIDQpOwotICAgICAgc3ltX3ZhbHVlICs9IChpbnNuICYgMHhmZmYpIDw8IDE7Ci0gICAgICBpZiAoaW5zbiAmIDB4ODAwKQotCXN5bV92YWx1ZSAtPSAweDEwMDA7Ci0gICAgICBpbnNuID0gKGluc24gJiAweGYwMDApIHwgKHN5bV92YWx1ZSAmIDB4ZmZmKTsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGhpdF9kYXRhKTsKLSAgICAgIGlmIChzeW1fdmFsdWUgPCAoYmZkX3ZtYSkgLTB4MTAwMCB8fCBzeW1fdmFsdWUgPj0gMHgxMDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogVGhpcyByb3V0aW5lIGNoZWNrcyBmb3IgbGlua2luZyBiaWcgYW5kIGxpdHRsZSBlbmRpYW4gb2JqZWN0cwotICAgdG9nZXRoZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfbWVyZ2VfcHJpdmF0ZV9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgaWYgKGliZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBvYmZkLT54dmVjLT5ieXRlb3JkZXIKLSAgICAgICYmIG9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBCRkRfRU5ESUFOX1VOS05PV04pCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKCIlczogY29tcGlsZWQgZm9yIGEgJXMgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzICVzIGVuZGlhbiIsCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCSBiZmRfYmlnX2VuZGlhbiAoaWJmZCkgPyAiYmlnIiA6ICJsaXR0bGUiLAotCSBiZmRfYmlnX2VuZGlhbiAob2JmZCkgPyAiYmlnIiA6ICJsaXR0bGUiKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgc2hfbWVyZ2VfcHJpdmF0ZV9kYXRhCi0KLS8qIFdlIGNhbiBkbyByZWxheGluZy4gICovCi0jZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gc2hfcmVsYXhfc2VjdGlvbgotCi0vKiBXZSB1c2UgdGhlIHNwZWNpYWwgQ09GRiBiYWNrZW5kIGxpbmtlci4gICovCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBzaF9yZWxvY2F0ZV9zZWN0aW9uCi0KLS8qIFdoZW4gcmVsYXhpbmcsIHdlIG5lZWQgdG8gdXNlIHNwZWNpYWwgY29kZSB0byBnZXQgdGhlIHJlbG9jYXRlZAotICAgc2VjdGlvbiBjb250ZW50cy4gICovCi0jZGVmaW5lIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIHNoX2NvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotDAotLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlbGF4aW5nIG9uIHRoZSBTSC4KLQotICAgRnVuY3Rpb24gY2FsbHMgb24gdGhlIFNIIGxvb2sgbGlrZSB0aGlzOgotCi0gICAgICAgbW92bCAgTDEscjAKLSAgICAgICAuLi4KLSAgICAgICBqc3IgICBAcjAKLSAgICAgICAuLi4KLSAgICAgTDE6Ci0gICAgICAgLmxvbmcgZnVuY3Rpb24KLQotICAgVGhlIGNvbXBpbGVyIGFuZCBhc3NlbWJsZXIgd2lsbCBjb29wZXJhdGUgdG8gY3JlYXRlIFJfU0hfVVNFUwotICAgcmVsb2NzIG9uIHRoZSBqc3IgaW5zdHJ1Y3Rpb25zLiAgVGhlIHJfb2Zmc2V0IGZpZWxkIG9mIHRoZQotICAgUl9TSF9VU0VTIHJlbG9jIGlzIHRoZSBQQyByZWxhdGl2ZSBvZmZzZXQgdG8gdGhlIGluc3RydWN0aW9uIHdoaWNoCi0gICBsb2FkcyB0aGUgcmVnaXN0ZXIgKHRoZSByX29mZnNldCBmaWVsZCBpcyBjb21wdXRlZCBhcyB0aG91Z2ggaXQKLSAgIHdlcmUgYSBqdW1wIGluc3RydWN0aW9uLCBzbyB0aGUgb2Zmc2V0IHZhbHVlIGlzIGFjdHVhbGx5IGZyb20gZm91cgotICAgYnl0ZXMgcGFzdCB0aGUgaW5zdHJ1Y3Rpb24pLiAgVGhlIGxpbmtlciBjYW4gdXNlIHRoaXMgcmVsb2MgdG8KLSAgIGRldGVybWluZSBqdXN0IHdoaWNoIGZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZCwgYW5kIHRodXMgZGVjaWRlCi0gICB3aGV0aGVyIGl0IGlzIHBvc3NpYmxlIHRvIHJlcGxhY2UgdGhlIGpzciB3aXRoIGEgYnNyLgotCi0gICBJZiBtdWx0aXBsZSBmdW5jdGlvbiBjYWxscyBhcmUgYWxsIGJhc2VkIG9uIGEgc2luZ2xlIHJlZ2lzdGVyIGxvYWQKLSAgIChpLmUuLCB0aGUgc2FtZSBmdW5jdGlvbiBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMpLCB0aGUgY29tcGlsZXIKLSAgIGd1YXJhbnRlZXMgdGhhdCBlYWNoIGZ1bmN0aW9uIGNhbGwgd2lsbCBoYXZlIGFuIFJfU0hfVVNFUyByZWxvYy4KLSAgIFRoZXJlZm9yZSwgaWYgdGhlIGxpbmtlciBpcyBhYmxlIHRvIGNvbnZlcnQgZWFjaCBSX1NIX1VTRVMgcmVsb2MKLSAgIHdoaWNoIHJlZmVycyB0byB0aGF0IGFkZHJlc3MsIGl0IGNhbiBzYWZlbHkgZWxpbWluYXRlIHRoZSByZWdpc3RlcgotICAgbG9hZC4KLQotICAgV2hlbiB0aGUgYXNzZW1ibGVyIGNyZWF0ZXMgYW4gUl9TSF9VU0VTIHJlbG9jLCBpdCBleGFtaW5lcyBpdCB0bwotICAgZGV0ZXJtaW5lIHdoaWNoIGFkZHJlc3MgaXMgYmVpbmcgbG9hZGVkIChMMSBpbiB0aGUgYWJvdmUgZXhhbXBsZSkuCi0gICBJdCB0aGVuIGNvdW50cyB0aGUgbnVtYmVyIG9mIHJlZmVyZW5jZXMgdG8gdGhhdCBhZGRyZXNzLCBhbmQKLSAgIGNyZWF0ZXMgYW4gUl9TSF9DT1VOVCByZWxvYyBhdCB0aGF0IGFkZHJlc3MuICBUaGUgcl9vZmZzZXQgZmllbGQgb2YKLSAgIHRoZSBSX1NIX0NPVU5UIHJlbG9jIHdpbGwgYmUgdGhlIG51bWJlciBvZiByZWZlcmVuY2VzLiAgSWYgdGhlCi0gICBsaW5rZXIgaXMgYWJsZSB0byBlbGltaW5hdGUgYSByZWdpc3RlciBsb2FkLCBpdCBjYW4gdXNlIHRoZQotICAgUl9TSF9DT1VOVCByZWxvYyB0byBzZWUgd2hldGhlciBpdCBjYW4gYWxzbyBlbGltaW5hdGUgdGhlIGZ1bmN0aW9uCi0gICBhZGRyZXNzLgotCi0gICBTSCByZWxheGluZyBhbHNvIGhhbmRsZXMgYW5vdGhlciwgdW5yZWxhdGVkLCBtYXR0ZXIuICBPbiB0aGUgU0gsIGlmCi0gICBhIGxvYWQgb3Igc3RvcmUgaW5zdHJ1Y3Rpb24gaXMgbm90IGFsaWduZWQgb24gYSBmb3VyIGJ5dGUgYm91bmRhcnksCi0gICB0aGUgbWVtb3J5IGN5Y2xlIGludGVyZmVyZXMgd2l0aCB0aGUgMzIgYml0IGluc3RydWN0aW9uIGZldGNoLAotICAgY2F1c2luZyBhIG9uZSBjeWNsZSBidWJibGUgaW4gdGhlIHBpcGVsaW5lLiAgVGhlcmVmb3JlLCB3ZSB0cnkgdG8KLSAgIGFsaWduIGxvYWQgYW5kIHN0b3JlIGluc3RydWN0aW9ucyBvbiBmb3VyIGJ5dGUgYm91bmRhcmllcyBpZiB3ZQotICAgY2FuLCBieSBzd2FwcGluZyB0aGVtIHdpdGggb25lIG9mIHRoZSBhZGphY2VudCBpbnN0cnVjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbiAKLXNoX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlYywgbGlua19pbmZvLCBhZ2FpbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBib29sZWFuIGhhdmVfY29kZTsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotCi0gICphZ2FpbiA9IGZhbHNlOwotCi0gIGlmIChsaW5rX2luZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLSAgICAgIHx8IHNlYy0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc2VjdGlvbiwKLSAgICAgaW5pdGlhbGl6ZSB0aGUgY29va2VkIHNpemUuICAqLwotICBpZiAoc2VjLT5fY29va2VkX3NpemUgPT0gMCkKLSAgICBzZWMtPl9jb29rZWRfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCi0gIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKLQkJICAgICAoYWJmZCwgc2VjLCBsaW5rX2luZm8tPmtlZXBfbWVtb3J5LAotCQkgICAgICAoYmZkX2J5dGUgKikgTlVMTCwgZmFsc2UsCi0JCSAgICAgIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgTlVMTCkpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgaGF2ZV9jb2RlID0gZmFsc2U7Ci0KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIGxhZGRyLCBwYWRkciwgc3ltdmFsOwotICAgICAgdW5zaWduZWQgc2hvcnQgaW5zbjsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbGZuLCAqaXJlbHNjYW4sICppcmVsY291bnQ7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLSAgICAgIGJmZF9zaWduZWRfdm1hIGZvZmY7Ci0KLSAgICAgIGlmIChpcmVsLT5yX3R5cGUgPT0gUl9TSF9DT0RFKQotCWhhdmVfY29kZSA9IHRydWU7Ci0KLSAgICAgIGlmIChpcmVsLT5yX3R5cGUgIT0gUl9TSF9VU0VTKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwKLQkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgIT0gTlVMTCkKLQkgICAgY29udGVudHMgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUaGUgcl9vZmZzZXQgZmllbGQgb2YgdGhlIFJfU0hfVVNFUyByZWxvYyB3aWxsIHBvaW50IHVzIHRvCi0gICAgICAgICB0aGUgcmVnaXN0ZXIgbG9hZC4gIFRoZSA0IGlzIGJlY2F1c2UgdGhlIHJfb2Zmc2V0IGZpZWxkIGlzCi0gICAgICAgICBjb21wdXRlZCBhcyB0aG91Z2ggaXQgd2VyZSBhIGp1bXAgb2Zmc2V0LCB3aGljaCBhcmUgYmFzZWQKLSAgICAgICAgIGZyb20gNCBieXRlcyBhZnRlciB0aGUganVtcCBpbnN0cnVjdGlvbi4gICovCi0gICAgICBsYWRkciA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSArIDQ7Ci0gICAgICAvKiBDYXJlZnVsIHRvIHNpZ24gZXh0ZW5kIHRoZSAzMi1iaXQgb2Zmc2V0LiAgKi8KLSAgICAgIGxhZGRyICs9ICgoaXJlbC0+cl9vZmZzZXQgJiAweGZmZmZmZmZmKSBeIDB4ODAwMDAwMDApIC0gMHg4MDAwMDAwMDsKLSAgICAgIGlmIChsYWRkciA+PSBzZWMtPl9yYXdfc2l6ZSkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgb2Zmc2V0IiwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkJICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX3ZhZGRyKTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGxhZGRyKTsKLQotICAgICAgLyogSWYgdGhlIGluc3RydWN0aW9uIGlzIG5vdCBtb3YubCBOTixyTiwgd2UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvLiAgKi8KLSAgICAgIGlmICgoaW5zbiAmIDB4ZjAwMCkgIT0gMHhkMDAwKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoIiVzOiAweCVseDogd2FybmluZzogUl9TSF9VU0VTIHBvaW50cyB0byB1bnJlY29nbml6ZWQgaW5zbiAweCV4IiwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX3ZhZGRyLCBpbnNuKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBmcm9tIHdoaWNoIHRoZSByZWdpc3RlciBpcyBiZWluZyBsb2FkZWQuICBUaGUKLSAgICAgIAkgZGlzcGxhY2VtZW50IGluIHRoZSBtb3YubCBpbnN0cnVjdGlvbiBpcyBxdWFkcnVwbGVkLiAgSXQgaXMgYQotICAgICAgCSBkaXNwbGFjZW1lbnQgZnJvbSBmb3VyIGJ5dGVzIGFmdGVyIHRoZSBtb3ZsIGluc3RydWN0aW9uLCBidXQsCi0gICAgICAJIGJlZm9yZSBhZGRpbmcgaW4gdGhlIFBDIGFkZHJlc3MsIHR3byBsZWFzdCBzaWduaWZpY2FudCBiaXRzCi0gICAgICAJIG9mIHRoZSBQQyBhcmUgY2xlYXJlZC4gIFdlIGFzc3VtZSB0aGF0IHRoZSBzZWN0aW9uIGlzIGFsaWduZWQKLSAgICAgIAkgb24gYSBmb3VyIGJ5dGUgYm91bmRhcnkuICAqLwotICAgICAgcGFkZHIgPSBpbnNuICYgMHhmZjsKLSAgICAgIHBhZGRyICo9IDQ7Ci0gICAgICBwYWRkciArPSAobGFkZHIgKyA0KSAmfiAzOwotICAgICAgaWYgKHBhZGRyID49IHNlYy0+X3Jhd19zaXplKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoIiVzOiAweCVseDogd2FybmluZzogYmFkIFJfU0hfVVNFUyBsb2FkIG9mZnNldCIsCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl92YWRkcikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHJlbG9jIGZvciB0aGUgYWRkcmVzcyBmcm9tIHdoaWNoIHRoZSByZWdpc3RlciBpcwotICAgICAgICAgYmVpbmcgbG9hZGVkLiAgVGhpcyByZWxvYyB3aWxsIHRlbGwgdXMgd2hpY2ggZnVuY3Rpb24gaXMKLSAgICAgICAgIGFjdHVhbGx5IGJlaW5nIGNhbGxlZC4gICovCi0gICAgICBwYWRkciArPSBzZWMtPnZtYTsKLSAgICAgIGZvciAoaXJlbGZuID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsZm4gPCBpcmVsZW5kOyBpcmVsZm4rKykKLQlpZiAoaXJlbGZuLT5yX3ZhZGRyID09IHBhZGRyCi0JICAgICYmIGlyZWxmbi0+cl90eXBlID09IFJfU0hfSU1NMzIpCi0JICBicmVhazsKLSAgICAgIGlmIChpcmVsZm4gPj0gaXJlbGVuZCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKCIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIHJlbG9jIiwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgdGhlIHJlbG9jLiAgKi8KLSAgICAgIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwKLQkJCSAgICAoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpCi0JCQkgICAgICsgKGlyZWxmbi0+cl9zeW1uZHgKLQkJCQkqIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCkpKSwKLQkJCSAgICAmc3ltKTsKLSAgICAgIGlmIChzeW0ubl9zY251bSAhPSAwICYmIHN5bS5uX3NjbnVtICE9IHNlYy0+dGFyZ2V0X2luZGV4KQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoIiVzOiAweCVseDogd2FybmluZzogc3ltYm9sIGluIHVuZXhwZWN0ZWQgc2VjdGlvbiIsCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0VYVCkKLQl7Ci0JICBzeW12YWwgPSAoc3ltLm5fdmFsdWUKLQkJICAgIC0gc2VjLT52bWEKLQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGFiZmQpW2lyZWxmbi0+cl9zeW1uZHhdOwotCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQkgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgYXBwZWFycyB0byBiZSBhIHJlZmVyZW5jZSB0byBhbiB1bmRlZmluZWQKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgSnVzdCBpZ25vcmUgaXQtLWl0IHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZQotICAgICAgICAgICAgICAgICByZWd1bGFyIHJlbG9jIHByb2Nlc3NpbmcuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIHN5bXZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCX0KLQotICAgICAgc3ltdmFsICs9IGJmZF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzICsgcGFkZHIgLSBzZWMtPnZtYSk7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIGZ1bmN0aW9uIGNhbGwgY2FuIGJlIHNob3J0ZW5lZC4gICovCi0gICAgICBmb2ZmID0gKHN5bXZhbAotCSAgICAgIC0gKGlyZWwtPnJfdmFkZHIKLQkJIC0gc2VjLT52bWEKLQkJICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgKyA0KSk7Ci0gICAgICBpZiAoZm9mZiA8IC0weDEwMDAgfHwgZm9mZiA+PSAweDEwMDApCi0JewotCSAgLyogQWZ0ZXIgYWxsIHRoYXQgd29yaywgd2UgY2FuJ3Qgc2hvcnRlbiB0aGlzIGZ1bmN0aW9uIGNhbGwuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBTaG9ydGVuIHRoZSBmdW5jdGlvbiBjYWxsLiAgKi8KLQotICAgICAgLyogRm9yIHNpbXBsaWNpdHkgb2YgY29kaW5nLCB3ZSBhcmUgZ29pbmcgdG8gbW9kaWZ5IHRoZSBzZWN0aW9uCi0JIGNvbnRlbnRzLCB0aGUgc2VjdGlvbiByZWxvY3MsIGFuZCB0aGUgQkZEIHN5bWJvbCB0YWJsZS4gIFdlCi0JIG11c3QgdGVsbCB0aGUgcmVzdCBvZiB0aGUgY29kZSBub3QgdG8gZnJlZSB1cCB0aGlzCi0JIGluZm9ybWF0aW9uLiAgSXQgd291bGQgYmUgcG9zc2libGUgdG8gaW5zdGVhZCBjcmVhdGUgYSB0YWJsZQotCSBvZiBjaGFuZ2VzIHdoaWNoIGhhdmUgdG8gYmUgbWFkZSwgYXMgaXMgZG9uZSBpbiBjb2ZmLW1pcHMuYzsKLQkgdGhhdCB3b3VsZCBiZSBtb3JlIHdvcmssIGJ1dCB3b3VsZCByZXF1aXJlIGxlc3MgbWVtb3J5IHdoZW4KLQkgdGhlIGxpbmtlciBpcyBydW4uICAqLwotCi0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgPT0gTlVMTCkKLQl7Ci0JICBzZWMtPnVzZWRfYnlfYmZkID0KLQkgICAgKChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpKTsKLQkgIGlmIChzZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5rZWVwX3JlbG9jcyA9IHRydWU7Ci0gICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyA9IGNvbnRlbnRzOwotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmtlZXBfY29udGVudHMgPSB0cnVlOwotICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLSAgICAgIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkgPSB0cnVlOwotCi0gICAgICAvKiBSZXBsYWNlIHRoZSBqc3Igd2l0aCBhIGJzci4gICovCi0KLSAgICAgIC8qIENoYW5nZSB0aGUgUl9TSF9VU0VTIHJlbG9jIGludG8gYW4gUl9TSF9QQ0RJU1AgcmVsb2MsIGFuZAotICAgICAgICAgcmVwbGFjZSB0aGUganNyIHdpdGggYSBic3IuICAqLwotICAgICAgaXJlbC0+cl90eXBlID0gUl9TSF9QQ0RJU1A7Ci0gICAgICBpcmVsLT5yX3N5bW5keCA9IGlyZWxmbi0+cl9zeW1uZHg7Ci0gICAgICBpZiAoc3ltLm5fc2NsYXNzICE9IENfRVhUKQotCXsKLQkgIC8qIElmIHRoaXMgbmVlZHMgdG8gYmUgY2hhbmdlZCBiZWNhdXNlIG9mIGZ1dHVyZSByZWxheGluZywKLSAgICAgICAgICAgICBpdCB3aWxsIGJlIGhhbmRsZWQgaGVyZSBsaWtlIG90aGVyIGludGVybmFsIFBDRElTUAotICAgICAgICAgICAgIHJlbG9jcy4gICovCi0JICBiZmRfcHV0XzE2IChhYmZkLAotCQkgICAgICAweGIwMDAgfCAoKGZvZmYgPj4gMSkgJiAweGZmZiksCi0JCSAgICAgIGNvbnRlbnRzICsgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgY2FuJ3QgZnVsbHkgcmVzb2x2ZSB0aGlzIHlldCwgYmVjYXVzZSB0aGUgZXh0ZXJuYWwKLSAgICAgICAgICAgICBzeW1ib2wgdmFsdWUgbWF5IGJlIGNoYW5nZWQgYnkgZnV0dXJlIHJlbGF4aW5nLiAgV2UgbGV0Ci0gICAgICAgICAgICAgdGhlIGZpbmFsIGxpbmsgcGhhc2UgaGFuZGxlIGl0LiAgKi8KLQkgIGJmZF9wdXRfMTYgKGFiZmQsIDB4YjAwMCwgY29udGVudHMgKyBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEpOwotCX0KLQotICAgICAgLyogU2VlIGlmIHRoZXJlIGlzIGFub3RoZXIgUl9TSF9VU0VTIHJlbG9jIHJlZmVycmluZyB0byB0aGUgc2FtZQotICAgICAgICAgcmVnaXN0ZXIgbG9hZC4gICovCi0gICAgICBmb3IgKGlyZWxzY2FuID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsc2NhbiA8IGlyZWxlbmQ7IGlyZWxzY2FuKyspCi0JaWYgKGlyZWxzY2FuLT5yX3R5cGUgPT0gUl9TSF9VU0VTCi0JICAgICYmIGxhZGRyID09IGlyZWxzY2FuLT5yX3ZhZGRyIC0gc2VjLT52bWEgKyA0ICsgaXJlbHNjYW4tPnJfb2Zmc2V0KQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbHNjYW4gPCBpcmVsZW5kKQotCXsKLQkgIC8qIFNvbWUgb3RoZXIgZnVuY3Rpb24gY2FsbCBkZXBlbmRzIHVwb24gdGhpcyByZWdpc3RlciBsb2FkLAotCSAgICAgYW5kIHdlIGhhdmUgbm90IHlldCBjb252ZXJ0ZWQgdGhhdCBmdW5jdGlvbiBjYWxsLgotCSAgICAgSW5kZWVkLCB3ZSBtYXkgbmV2ZXIgYmUgYWJsZSB0byBjb252ZXJ0IGl0LiAgVGhlcmUgaXMKLQkgICAgIG5vdGhpbmcgZWxzZSB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIExvb2sgZm9yIGEgUl9TSF9DT1VOVCByZWxvYyBvbiB0aGUgbG9jYXRpb24gd2hlcmUgdGhlCi0gICAgICAgICBmdW5jdGlvbiBhZGRyZXNzIGlzIHN0b3JlZC4gIERvIHRoaXMgYmVmb3JlIGRlbGV0aW5nIGFueQotICAgICAgICAgYnl0ZXMsIHRvIGF2b2lkIGNvbmZ1c2lvbiBhYm91dCB0aGUgYWRkcmVzcy4gICovCi0gICAgICBmb3IgKGlyZWxjb3VudCA9IGludGVybmFsX3JlbG9jczsgaXJlbGNvdW50IDwgaXJlbGVuZDsgaXJlbGNvdW50KyspCi0JaWYgKGlyZWxjb3VudC0+cl92YWRkciA9PSBwYWRkcgotCSAgICAmJiBpcmVsY291bnQtPnJfdHlwZSA9PSBSX1NIX0NPVU5UKQotCSAgYnJlYWs7Ci0KLSAgICAgIC8qIERlbGV0ZSB0aGUgcmVnaXN0ZXIgbG9hZC4gICovCi0gICAgICBpZiAoISBzaF9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgbGFkZHIsIDIpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIGp1c3QgaW4gY2FzZSBpdCBwZXJtaXRzIHNvbWUKLSAgICAgICAgIG90aGVyIGZ1bmN0aW9uIGNhbGwgdG8gY29tZSB3aXRoaW4gcmFuZ2UsIHdlIHNob3VsZCByZWxheAotICAgICAgICAgYWdhaW4uICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0gICAgICAqYWdhaW4gPSB0cnVlOwotCi0gICAgICAvKiBOb3cgY2hlY2sgd2hldGhlciB3ZSBnb3QgYSBDT1VOVCByZWxvYy4gICovCi0gICAgICBpZiAoaXJlbGNvdW50ID49IGlyZWxlbmQpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBjb3VsZCBub3QgZmluZCBleHBlY3RlZCBDT1VOVCByZWxvYyIsCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhlIG51bWJlciBvZiB1c2VzIGlzIHN0b3JlZCBpbiB0aGUgcl9vZmZzZXQgZmllbGQuICBXZSd2ZQotICAgICAgICAganVzdCBkZWxldGVkIG9uZS4gICovCi0gICAgICBpZiAoaXJlbGNvdW50LT5yX29mZnNldCA9PSAwKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBjb3VudCIsCi0JCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAtLWlyZWxjb3VudC0+cl9vZmZzZXQ7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGFyZSBubyBtb3JlIHVzZXMsIHdlIGNhbiBkZWxldGUgdGhlIGFkZHJlc3MuICBSZWxvYWQKLSAgICAgICAgIHRoZSBhZGRyZXNzIGZyb20gaXJlbGZuLCBpbiBjYXNlIGl0IHdhcyBjaGFuZ2VkIGJ5IHRoZQotICAgICAgICAgcHJldmlvdXMgY2FsbCB0byBzaF9yZWxheF9kZWxldGVfYnl0ZXMuICAqLwotICAgICAgaWYgKGlyZWxjb3VudC0+cl9vZmZzZXQgPT0gMCkKLQl7Ci0JICBpZiAoISBzaF9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkgICAgICAgaXJlbGZuLT5yX3ZhZGRyIC0gc2VjLT52bWEsIDQpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIC8qIFdlJ3ZlIGRvbmUgYWxsIHdlIGNhbiB3aXRoIHRoYXQgZnVuY3Rpb24gY2FsbC4gICovCi0gICAgfQotCi0gIC8qIExvb2sgZm9yIGxvYWQgYW5kIHN0b3JlIGluc3RydWN0aW9ucyB0aGF0IHdlIGNhbiBhbGlnbiBvbiBmb3VyCi0gICAgIGJ5dGUgYm91bmRhcmllcy4gICovCi0gIGlmIChoYXZlX2NvZGUpCi0gICAgewotICAgICAgYm9vbGVhbiBzd2FwcGVkOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwKLQkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgIT0gTlVMTCkKLQkgICAgY29udGVudHMgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISBzaF9hbGlnbl9sb2FkcyAoYWJmZCwgc2VjLCBpbnRlcm5hbF9yZWxvY3MsIGNvbnRlbnRzLCAmc3dhcHBlZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChzd2FwcGVkKQotCXsKLQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2VjLT51c2VkX2J5X2JmZCA9Ci0JCSgoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7Ci0JICAgICAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5rZWVwX3JlbG9jcyA9IHRydWU7Ci0JICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmtlZXBfY29udGVudHMgPSB0cnVlOwotCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkgPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGNvZmZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZWMtPnVzZWRfYnlfYmZkID0KLQkJKChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpKTsKLQkgICAgICBpZiAoc2VjLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzID0gTlVMTDsKLQkgICAgfQotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIERlbGV0ZSBzb21lIGJ5dGVzIGZyb20gYSBzZWN0aW9uIHdoaWxlIHJlbGF4aW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBhZGRyLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWwsICppcmVsZW5kOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxhbGlnbjsKLSAgYmZkX3ZtYSB0b2FkZHI7Ci0gIGJmZF9ieXRlICplc3ltLCAqZXN5bWVuZDsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBhc2VjdGlvbiAqbzsKLQotICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50czsKLQotICAvKiBUaGUgZGVsZXRpb24gbXVzdCBzdG9wIGF0IHRoZSBuZXh0IEFMSUdOIHJlbG9jIGZvciBhbiBhbGlnbWVudAotICAgICBwb3dlciBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGFyZSBkZWxldGluZy4gICovCi0KLSAgaXJlbGFsaWduID0gTlVMTDsKLSAgdG9hZGRyID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLSAgaXJlbCA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3M7Ci0gIGlyZWxlbmQgPSBpcmVsICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX0FMSUdOCi0JICAmJiBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPiBhZGRyCi0JICAmJiBjb3VudCA8ICgxIDw8IGlyZWwtPnJfb2Zmc2V0KSkKLQl7Ci0JICBpcmVsYWxpZ24gPSBpcmVsOwotCSAgdG9hZGRyID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KLSAgbWVtbW92ZSAoY29udGVudHMgKyBhZGRyLCBjb250ZW50cyArIGFkZHIgKyBjb3VudCwgdG9hZGRyIC0gYWRkciAtIGNvdW50KTsKLSAgaWYgKGlyZWxhbGlnbiA9PSBOVUxMKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplIC09IGNvdW50OwotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSNkZWZpbmUgTk9QX09QQ09ERSAoMHgwMDA5KQotCi0gICAgICBCRkRfQVNTRVJUICgoY291bnQgJiAxKSA9PSAwKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSArPSAyKQotCWJmZF9wdXRfMTYgKGFiZmQsIE5PUF9PUENPREUsIGNvbnRlbnRzICsgdG9hZGRyIC0gY291bnQgKyBpKTsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IGFsbCB0aGUgcmVsb2NzLiAgKi8KLSAgZm9yIChpcmVsID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIG5yYWRkciwgc3RvcDsKLSAgICAgIGJmZF92bWEgc3RhcnQgPSAwOwotICAgICAgaW50IGluc24gPSAwOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0gICAgICBpbnQgb2ZmLCBhZGp1c3QsIG9pbnNuOwotICAgICAgYmZkX3NpZ25lZF92bWEgdm9mZiA9IDA7Ci0gICAgICBib29sZWFuIG92ZXJmbG93OwotCi0gICAgICAvKiBHZXQgdGhlIG5ldyByZWxvYyBhZGRyZXNzLiAgKi8KLSAgICAgIG5yYWRkciA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLSAgICAgIGlmICgoaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hID4gYWRkcgotCSAgICYmIGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA8IHRvYWRkcikKLQkgIHx8IChpcmVsLT5yX3R5cGUgPT0gUl9TSF9BTElHTgotCSAgICAgICYmIGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA9PSB0b2FkZHIpKQotCW5yYWRkciAtPSBjb3VudDsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgcmVsb2Mgd2FzIGZvciB0aGUgYnl0ZXMgd2UgaGF2ZSBkZWxldGVkLCBpbiB3aGljaAotCSBjYXNlIHdlIG5vIGxvbmdlciBjYXJlIGFib3V0IGl0LiAgRG9uJ3QgZGVsZXRlIHJlbG9jcyB3aGljaAotCSByZXByZXNlbnQgYWRkcmVzc2VzLCB0aG91Z2guICAqLwotICAgICAgaWYgKGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA+PSBhZGRyCi0JICAmJiBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPCBhZGRyICsgY291bnQKLQkgICYmIGlyZWwtPnJfdHlwZSAhPSBSX1NIX0FMSUdOCi0JICAmJiBpcmVsLT5yX3R5cGUgIT0gUl9TSF9DT0RFCi0JICAmJiBpcmVsLT5yX3R5cGUgIT0gUl9TSF9EQVRBCi0JICAmJiBpcmVsLT5yX3R5cGUgIT0gUl9TSF9MQUJFTCkKLQlpcmVsLT5yX3R5cGUgPSBSX1NIX1VOVVNFRDsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jLCBzZWUgaWYgdGhlIHJhbmdlIGl0IGNvdmVycwotICAgICAgICAgaW5jbHVkZXMgdGhlIGJ5dGVzIHdlIGhhdmUgZGVsZXRlZC4gICovCi0gICAgICBzd2l0Y2ggKGlyZWwtPnJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1BDRElTUDhCWTI6Ci0JY2FzZSBSX1NIX1BDRElTUDoKLQljYXNlIFJfU0hfUENSRUxJTU04QlkyOgotCWNhc2UgUl9TSF9QQ1JFTElNTThCWTQ6Ci0JICBzdGFydCA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLQkgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoaXJlbC0+cl90eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgc3RhcnQgPSBzdG9wID0gYWRkcjsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX0lNTTMyOgotCSAgLyogSWYgdGhpcyByZWxvYyBpcyBhZ2FpbnN0IGEgc3ltYm9sIGRlZmluZWQgaW4gdGhpcwotICAgICAgICAgICAgIHNlY3Rpb24sIGFuZCB0aGUgc3ltYm9sIHdpbGwgbm90IGJlIGFkanVzdGVkIGJlbG93LCB3ZQotICAgICAgICAgICAgIG11c3QgY2hlY2sgdGhlIGFkZGVuZCB0byBzZWUgaXQgd2lsbCBwdXQgdGhlIHZhbHVlIGluCi0gICAgICAgICAgICAgcmFuZ2UgdG8gYmUgYWRqdXN0ZWQsIGFuZCBoZW5jZSBtdXN0IGJlIGNoYW5nZWQuICAqLwotCSAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsCi0JCQkJKChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKQotCQkJCSArIChpcmVsLT5yX3N5bW5keAotCQkJCSAgICAqIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCkpKSwKLQkJCQkmc3ltKTsKLQkgIGlmIChzeW0ubl9zY2xhc3MgIT0gQ19FWFQKLQkgICAgICAmJiBzeW0ubl9zY251bSA9PSBzZWMtPnRhcmdldF9pbmRleAotCSAgICAgICYmICgoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgPD0gYWRkcgotCQkgIHx8IChiZmRfdm1hKSBzeW0ubl92YWx1ZSA+PSB0b2FkZHIpKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgdmFsICs9IHN5bS5uX3ZhbHVlOwotCSAgICAgIGlmICh2YWwgPiBhZGRyICYmIHZhbCA8IHRvYWRkcikKLQkJYmZkX3B1dF8zMiAoYWJmZCwgdmFsIC0gY291bnQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgfQotCSAgc3RhcnQgPSBzdG9wID0gYWRkcjsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1BDRElTUDhCWTI6Ci0JICBvZmYgPSBpbnNuICYgMHhmZjsKLQkgIGlmIChvZmYgJiAweDgwKQotCSAgICBvZmYgLT0gMHgxMDA7Ci0JICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0ICsgNCArIG9mZiAqIDIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfUENESVNQOgotCSAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsCi0JCQkJKChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKQotCQkJCSArIChpcmVsLT5yX3N5bW5keAotCQkJCSAgICAqIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCkpKSwKLQkJCQkmc3ltKTsKLQkgIGlmIChzeW0ubl9zY2xhc3MgPT0gQ19FWFQpCi0JICAgIHN0YXJ0ID0gc3RvcCA9IGFkZHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvZmYgPSBpbnNuICYgMHhmZmY7Ci0JICAgICAgaWYgKG9mZiAmIDB4ODAwKQotCQlvZmYgLT0gMHgxMDAwOwotCSAgICAgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyA0ICsgb2ZmICogMik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1BDUkVMSU1NOEJZMjoKLQkgIG9mZiA9IGluc24gJiAweGZmOwotCSAgc3RvcCA9IHN0YXJ0ICsgNCArIG9mZiAqIDI7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9QQ1JFTElNTThCWTQ6Ci0JICBvZmYgPSBpbnNuICYgMHhmZjsKLQkgIHN0b3AgPSAoc3RhcnQgJn4gKGJmZF92bWEpIDMpICsgNCArIG9mZiAqIDQ7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9TV0lUQ0g4OgotCWNhc2UgUl9TSF9TV0lUQ0gxNjoKLQljYXNlIFJfU0hfU1dJVENIMzI6Ci0JICAvKiBUaGVzZSByZWxvY3MgdHlwZXMgcmVwcmVzZW50Ci0JICAgICAgIC53b3JkIEwyLUwxCi0JICAgICBUaGUgcl9vZmZzZXQgZmllbGQgaG9sZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVsb2MKLQkgICAgIGFkZHJlc3MgYW5kIEwxLiAgVGhhdCBpcyB0aGUgc3RhcnQgb2YgdGhlIHJlbG9jLCBhbmQKLQkgICAgIGFkZGluZyBpbiB0aGUgY29udGVudHMgZ2l2ZXMgdXMgdGhlIHRvcC4gIFdlIG11c3QgYWRqdXN0Ci0JICAgICBib3RoIHRoZSByX29mZnNldCBmaWVsZCBhbmQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotCi0JICBzdGFydCA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgLSAobG9uZykgaXJlbC0+cl9vZmZzZXQpOwotCi0JICBpZiAoc3RhcnQgPiBhZGRyCi0JICAgICAgJiYgc3RhcnQgPCB0b2FkZHIKLQkgICAgICAmJiAoc3RvcCA8PSBhZGRyIHx8IHN0b3AgPj0gdG9hZGRyKSkKLQkgICAgaXJlbC0+cl9vZmZzZXQgKz0gY291bnQ7Ci0JICBlbHNlIGlmIChzdG9wID4gYWRkcgotCQkgICAmJiBzdG9wIDwgdG9hZGRyCi0JCSAgICYmIChzdGFydCA8PSBhZGRyIHx8IHN0YXJ0ID49IHRvYWRkcikpCi0JICAgIGlyZWwtPnJfb2Zmc2V0IC09IGNvdW50OwotCi0JICBzdGFydCA9IHN0b3A7Ci0KLQkgIGlmIChpcmVsLT5yX3R5cGUgPT0gUl9TSF9TV0lUQ0gxNikKLQkgICAgdm9mZiA9IGJmZF9nZXRfc2lnbmVkXzE2IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBlbHNlIGlmIChpcmVsLT5yX3R5cGUgPT0gUl9TSF9TV0lUQ0g4KQotCSAgICB2b2ZmID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBlbHNlCi0JICAgIHZvZmYgPSBiZmRfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIHZvZmYpOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9TSF9VU0VTOgotCSAgc3RhcnQgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0JICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0Ci0JCQkgICAgKyAobG9uZykgaXJlbC0+cl9vZmZzZXQKLQkJCSAgICArIDQpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc3RhcnQgPiBhZGRyCi0JICAmJiBzdGFydCA8IHRvYWRkcgotCSAgJiYgKHN0b3AgPD0gYWRkciB8fCBzdG9wID49IHRvYWRkcikpCi0JYWRqdXN0ID0gY291bnQ7Ci0gICAgICBlbHNlIGlmIChzdG9wID4gYWRkcgotCSAgICAgICAmJiBzdG9wIDwgdG9hZGRyCi0JICAgICAgICYmIChzdGFydCA8PSBhZGRyIHx8IHN0YXJ0ID49IHRvYWRkcikpCi0JYWRqdXN0ID0gLSBjb3VudDsKLSAgICAgIGVsc2UKLQlhZGp1c3QgPSAwOwotCi0gICAgICBpZiAoYWRqdXN0ICE9IDApCi0JewotCSAgb2luc24gPSBpbnNuOwotCSAgb3ZlcmZsb3cgPSBmYWxzZTsKLQkgIHN3aXRjaCAoaXJlbC0+cl90eXBlKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1BDRElTUDhCWTI6Ci0JICAgIGNhc2UgUl9TSF9QQ1JFTElNTThCWTI6Ci0JICAgICAgaW5zbiArPSBhZGp1c3QgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfUENESVNQOgotCSAgICAgIGluc24gKz0gYWRqdXN0IC8gMjsKLQkgICAgICBpZiAoKG9pbnNuICYgMHhmMDAwKSAhPSAoaW5zbiAmIDB4ZjAwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1BDUkVMSU1NOEJZNDoKLQkgICAgICBCRkRfQVNTRVJUIChhZGp1c3QgPT0gY291bnQgfHwgY291bnQgPj0gNCk7Ci0JICAgICAgaWYgKGNvdW50ID49IDQpCi0JCWluc24gKz0gYWRqdXN0IC8gNDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoKGlyZWwtPnJfdmFkZHIgJiAzKSA9PSAwKQotCQkgICAgKytpbnNuOwotCQl9Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9TV0lUQ0g4OgotCSAgICAgIHZvZmYgKz0gYWRqdXN0OwotCSAgICAgIGlmICh2b2ZmIDwgMCB8fCB2b2ZmID49IDB4ZmYpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHZvZmYsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfU1dJVENIMTY6Ci0JICAgICAgdm9mZiArPSBhZGp1c3Q7Ci0JICAgICAgaWYgKHZvZmYgPCAtIDB4ODAwMCB8fCB2b2ZmID49IDB4ODAwMCkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfc2lnbmVkXzE2IChhYmZkLCB2b2ZmLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1NXSVRDSDMyOgotCSAgICAgIHZvZmYgKz0gYWRqdXN0OwotCSAgICAgIGJmZF9wdXRfc2lnbmVkXzMyIChhYmZkLCB2b2ZmLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1VTRVM6Ci0JICAgICAgaXJlbC0+cl9vZmZzZXQgKz0gYWRqdXN0OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChvdmVyZmxvdykKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKCIlczogMHglbHg6IGZhdGFsOiByZWxvYyBvdmVyZmxvdyB3aGlsZSByZWxheGluZyIsCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl92YWRkcikpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgaXJlbC0+cl92YWRkciA9IG5yYWRkciArIHNlYy0+dm1hOwotICAgIH0KLQotICAvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBvdGhlciBzZWN0aW9ucy4gIElmIHRoZXJlIGNvbnRhaW4gYW55IElNTTMyCi0gICAgIHJlbG9jcyBhZ2FpbnN0IGludGVybmFsIHN5bWJvbHMgd2hpY2ggd2UgYXJlIG5vdCBnb2luZyB0byBhZGp1c3QKLSAgICAgYmVsb3csIHdlIG1heSBuZWVkIHRvIGFkanVzdCB0aGUgYWRkZW5kcy4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsc2NhbiwgKmlyZWxzY2FuZW5kOwotICAgICAgYmZkX2J5dGUgKm9jb250ZW50czsKLQotICAgICAgaWYgKG8gPT0gc2VjCi0JICB8fCAoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkgIHx8IG8tPnJlbG9jX2NvdW50ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIGFsd2F5cyBjYWNoZSB0aGUgcmVsb2NzLiAgUGVyaGFwcywgaWYgaW5mby0+a2VlcF9tZW1vcnkgaXMKLSAgICAgICAgIGZhbHNlLCB3ZSBzaG91bGQgZnJlZSB0aGVtLCBpZiB3ZSBhcmUgcGVybWl0dGVkIHRvLCB3aGVuIHdlCi0gICAgICAgICBsZWF2ZSBzaF9jb2ZmX3JlbGF4X3NlY3Rpb24uICAqLwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotCQkJIChhYmZkLCBvLCB0cnVlLCAoYmZkX2J5dGUgKikgTlVMTCwgZmFsc2UsCi0JCQkgIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgTlVMTCkpOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgb2NvbnRlbnRzID0gTlVMTDsKLSAgICAgIGlyZWxzY2FuZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgby0+cmVsb2NfY291bnQ7Ci0gICAgICBmb3IgKGlyZWxzY2FuID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsc2NhbiA8IGlyZWxzY2FuZW5kOyBpcmVsc2NhbisrKQotCXsKLQkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotCi0JICBpZiAoaXJlbHNjYW4tPnJfdHlwZSAhPSBSX1NIX0lNTTMyKQotCSAgICBjb250aW51ZTsKLQotCSAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsCi0JCQkJKChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKQotCQkJCSArIChpcmVsc2Nhbi0+cl9zeW1uZHgKLQkJCQkgICAgKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSksCi0JCQkJJnN5bSk7Ci0JICBpZiAoc3ltLm5fc2NsYXNzICE9IENfRVhUCi0JICAgICAgJiYgc3ltLm5fc2NudW0gPT0gc2VjLT50YXJnZXRfaW5kZXgKLQkgICAgICAmJiAoKGJmZF92bWEpIHN5bS5uX3ZhbHVlIDw9IGFkZHIKLQkJICB8fCAoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgPj0gdG9hZGRyKSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgdmFsOwotCi0JICAgICAgaWYgKG9jb250ZW50cyA9PSBOVUxMKQotCQl7Ci0JCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+Y29udGVudHMgIT0gTlVMTCkKLQkJICAgIG9jb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+Y29udGVudHM7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBXZSBhbHdheXMgY2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGVyaGFwcywgaWYgaW5mby0+a2VlcF9tZW1vcnkgaXMgZmFsc2UsIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGZyZWUgdGhlbSwgaWYgd2UgYXJlIHBlcm1pdHRlZCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHdlIGxlYXZlIHNoX2NvZmZfcmVsYXhfc2VjdGlvbi4gICovCi0JCSAgICAgIG9jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChvLT5fcmF3X3NpemUpOwotCQkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbywgb2NvbnRlbnRzLAotCQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCQkJICAgICAgby0+X3Jhd19zaXplKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5jb250ZW50cyA9IG9jb250ZW50czsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgb2NvbnRlbnRzICsgaXJlbHNjYW4tPnJfdmFkZHIgLSBvLT52bWEpOwotCSAgICAgIHZhbCArPSBzeW0ubl92YWx1ZTsKLQkgICAgICBpZiAodmFsID4gYWRkciAmJiB2YWwgPCB0b2FkZHIpCi0JCWJmZF9wdXRfMzIgKGFiZmQsIHZhbCAtIGNvdW50LAotCQkJICAgIG9jb250ZW50cyArIGlyZWxzY2FuLT5yX3ZhZGRyIC0gby0+dm1hKTsKLQotCSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+a2VlcF9jb250ZW50cyA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFkanVzdGluZyB0aGUgaW50ZXJuYWwgc3ltYm9scyB3aWxsIG5vdCB3b3JrIGlmIHNvbWV0aGluZyBoYXMKLSAgICAgYWxyZWFkeSByZXRyaWV2ZWQgdGhlIGdlbmVyaWMgc3ltYm9scy4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvCi0gICAgIG1ha2UgdGhpcyB3b3JrIGJ5IGFkanVzdGluZyB0aGUgZ2VuZXJpYyBzeW1ib2xzIGF0IHRoZSBzYW1lIHRpbWUuCi0gICAgIEhvd2V2ZXIsIHRoaXMgY2FzZSBzaG91bGQgbm90IGFyaXNlIGluIG5vcm1hbCB1c2FnZS4gICovCi0gIGlmIChvYmpfc3ltYm9scyAoYWJmZCkgIT0gTlVMTAotICAgICAgfHwgb2JqX3Jhd19zeW1lbnRzIChhYmZkKSAhPSBOVUxMKQotICAgIHsKLSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAoIiVzOiBmYXRhbDogZ2VuZXJpYyBzeW1ib2xzIHJldHJpZXZlZCBiZWZvcmUgcmVsYXhpbmciLAotCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBBZGp1c3QgYWxsIHRoZSBzeW1ib2xzLiAgKi8KLSAgc3ltX2hhc2ggPSBvYmpfY29mZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKTsKLSAgZXN5bWVuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3o7Ci0gIHdoaWxlIChlc3ltIDwgZXN5bWVuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSAmaXN5bSk7Ci0KLSAgICAgIGlmIChpc3ltLm5fc2NudW0gPT0gc2VjLT50YXJnZXRfaW5kZXgKLQkgICYmIChiZmRfdm1hKSBpc3ltLm5fdmFsdWUgPiBhZGRyCi0JICAmJiAoYmZkX3ZtYSkgaXN5bS5uX3ZhbHVlIDwgdG9hZGRyKQotCXsKLQkgIGlzeW0ubl92YWx1ZSAtPSBjb3VudDsKLQotCSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgZXN5bSk7Ci0KLQkgIGlmICgqc3ltX2hhc2ggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQgKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgIHx8ICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLQkgICAgICBCRkRfQVNTRVJUICgoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA+PSBhZGRyCi0JCQkgICYmICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIDwgdG9hZGRyKTsKLQkgICAgICAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSAtPSBjb3VudDsKLQkgICAgfQotCX0KLQotICAgICAgZXN5bSArPSAoaXN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OwotICAgICAgc3ltX2hhc2ggKz0gaXN5bS5uX251bWF1eCArIDE7Ci0gICAgfQotCi0gIC8qIFNlZSBpZiB3ZSBjYW4gbW92ZSB0aGUgQUxJR04gcmVsb2MgZm9yd2FyZC4gIFdlIGhhdmUgYWRqdXN0ZWQKLSAgICAgcl92YWRkciBmb3IgaXQgYWxyZWFkeS4gICovCi0gIGlmIChpcmVsYWxpZ24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFsaWdudG8sIGFsaWduYWRkcjsKLQotICAgICAgYWxpZ250byA9IEJGRF9BTElHTiAodG9hZGRyLCAxIDw8IGlyZWxhbGlnbi0+cl9vZmZzZXQpOwotICAgICAgYWxpZ25hZGRyID0gQkZEX0FMSUdOIChpcmVsYWxpZ24tPnJfdmFkZHIgLSBzZWMtPnZtYSwKLQkJCSAgICAgMSA8PCBpcmVsYWxpZ24tPnJfb2Zmc2V0KTsKLSAgICAgIGlmIChhbGlnbnRvICE9IGFsaWduYWRkcikKLQl7Ci0JICAvKiBUYWlsIHJlY3Vyc2lvbi4gICovCi0JICByZXR1cm4gc2hfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFsaWduYWRkciwKLQkJCQkJYWxpZ250byAtIGFsaWduYWRkcik7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgaXMgeWV0IGFub3RoZXIgdmVyc2lvbiBvZiB0aGUgU0ggb3Bjb2RlIHRhYmxlLCB1c2VkIHRvIHJhcGlkbHkKLSAgIGdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgaW5zdHJ1Y3Rpb24uICAqLwotCi0vKiBUaGUgb3Bjb2RlIG1hcCBpcyByZXByZXNlbnRlZCBieSBhbiBhcnJheSBvZiB0aGVzZSBzdHJ1Y3R1cmVzLiAgVGhlCi0gICBhcnJheSBpcyBpbmRleGVkIGJ5IHRoZSBoaWdoIG9yZGVyIGZvdXIgYml0cyBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdHJ1Y3Qgc2hfbWFqb3Jfb3Bjb2RlCi17Ci0gIC8qIEEgcG9pbnRlciB0byB0aGUgaW5zdHJ1Y3Rpb24gbGlzdC4gIFRoaXMgaXMgYW4gYXJyYXkgd2hpY2gKLSAgICAgY29udGFpbnMgYWxsIHRoZSBpbnN0cnVjdGlvbnMgd2l0aCB0aGlzIG1ham9yIG9wY29kZS4gICovCi0gIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgKm1pbm9yX29wY29kZXM7Ci0gIC8qIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gbWlub3Jfb3Bjb2Rlcy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGNvdW50OwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gZm9yIGEgc2V0IG9mIFNIIG9wY29kZXMuICBUaGUKLSAgIGluc3RydWN0aW9uIGNvZGUgaXMgYW5kZWQgd2l0aCB0aGUgbWFzayB2YWx1ZSwgYW5kIHRoZSByZXN1bHRpbmcKLSAgIHZhbHVlIGlzIHVzZWQgdG8gc2VhcmNoIHRoZSBvcmRlciBvcGNvZGUgbGlzdC4gICovCi0KLXN0cnVjdCBzaF9taW5vcl9vcGNvZGUKLXsKLSAgLyogVGhlIHNvcnRlZCBvcGNvZGUgbGlzdC4gICovCi0gIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wY29kZXM7Ci0gIC8qIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gb3Bjb2Rlcy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGNvdW50OwotICAvKiBUaGUgbWFzayB2YWx1ZSB0byB1c2Ugd2hlbiBzZWFyY2hpbmcgdGhlIG9wY29kZSBsaXN0LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgbWFzazsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGZvciBhbiBTSCBpbnN0cnVjdGlvbi4gIEFuIGFycmF5Ci0gICBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzIHNvcnRlZCBpbiBvcmRlciBieSBvcGNvZGUuICAqLwotCi1zdHJ1Y3Qgc2hfb3Bjb2RlCi17Ci0gIC8qIFRoZSBjb2RlIGZvciB0aGlzIGluc3RydWN0aW9uLCBhZnRlciBpdCBoYXMgYmVlbiBhbmRlZCB3aXRoIHRoZQotICAgICBtYXNrIHZhbHVlIGluIHRoZSBzaF9tYWpvcl9vcGNvZGUgc3RydWN0dXJlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgb3Bjb2RlOwotICAvKiBGbGFncyBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCi0gIHVuc2lnbmVkIHNob3J0IGZsYWdzOwotfTsKLQotLyogRmxhZyB3aGljaCBhcHBlYXIgaW4gdGhlIHNoX29wY29kZSBzdHJ1Y3R1cmUuICAqLwotCi0vKiBUaGlzIGluc3RydWN0aW9uIGxvYWRzIGEgdmFsdWUgZnJvbSBtZW1vcnkuICAqLwotI2RlZmluZSBMT0FEICgweDEpCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gc3RvcmVzIGEgdmFsdWUgdG8gbWVtb3J5LiAgKi8KLSNkZWZpbmUgU1RPUkUgKDB4MikKLQotLyogVGhpcyBpbnN0cnVjdGlvbiBpcyBhIGJyYW5jaC4gICovCi0jZGVmaW5lIEJSQU5DSCAoMHg0KQotCi0vKiBUaGlzIGluc3RydWN0aW9uIGhhcyBhIGRlbGF5IHNsb3QuICAqLwotI2RlZmluZSBERUxBWSAoMHg4KQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHVzZXMgdGhlIHZhbHVlIGluIHRoZSByZWdpc3RlciBpbiB0aGUgZmllbGQgYXQKLSAgIG1hc2sgMHgwZjAwIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFVTRVMxICgweDEwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHVzZXMgdGhlIHZhbHVlIGluIHRoZSByZWdpc3RlciBpbiB0aGUgZmllbGQgYXQKLSAgIG1hc2sgMHgwMGYwIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFVTRVMyICgweDIwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHVzZXMgdGhlIHZhbHVlIGluIHJlZ2lzdGVyIDAuICAqLwotI2RlZmluZSBVU0VTUjAgKDB4NDApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gc2V0cyB0aGUgdmFsdWUgaW4gdGhlIHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAotICAgbWFzayAweDBmMDAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0VUUzEgKDB4ODApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gc2V0cyB0aGUgdmFsdWUgaW4gdGhlIHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAotICAgbWFzayAweDAwZjAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0VUUzIgKDB4MTAwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHNldHMgcmVnaXN0ZXIgMC4gICovCi0jZGVmaW5lIFNFVFNSMCAoMHgyMDApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gc2V0cyBhIHNwZWNpYWwgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBTRVRTU1AgKDB4NDAwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHVzZXMgYSBzcGVjaWFsIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgVVNFU1NQICgweDgwMCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiB0aGUgZmllbGQgYXQKLSAgIG1hc2sgMHgwZjAwIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFVTRVNGMSAoMHgxMDAwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHVzZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAotICAgbWFzayAweDAwZjAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVVNFU0YyICgweDIwMDApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyBmbG9hdGluZyBwb2ludCByZWdpc3RlciAwLiAgKi8KLSNkZWZpbmUgVVNFU0YwICgweDQwMDApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gc2V0cyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MGYwMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTRVRTRjEgKDB4ODAwMCkKLQotc3RhdGljIGJvb2xlYW4gc2hfaW5zbl91c2VzX3JlZwotICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9pbnNuX3VzZXNfZnJlZwotICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9pbnNuc19jb25mbGljdAotICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKiwgdW5zaWduZWQgaW50LAotCSAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKikpOwotc3RhdGljIGJvb2xlYW4gc2hfbG9hZF91c2UKLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICosIHVuc2lnbmVkIGludCwKLQkgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICopKTsKLQotLyogVGhlIG9wY29kZSBtYXBzLiAgKi8KLQotI2RlZmluZSBNQVAoYSkgYSwgc2l6ZW9mIGEgLyBzaXplb2YgYVswXQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGUwMFtdID0KLXsKLSAgeyAweDAwMDgsIFNFVFNTUCB9LAkJCS8qIGNscnQgKi8KLSAgeyAweDAwMDksIDAgfSwJCQkvKiBub3AgKi8KLSAgeyAweDAwMGIsIEJSQU5DSCB8IERFTEFZIHwgVVNFU1NQIH0sCS8qIHJ0cyAqLwotICB7IDB4MDAxOCwgU0VUU1NQIH0sCQkJLyogc2V0dCAqLwotICB7IDB4MDAxOSwgU0VUU1NQIH0sCQkJLyogZGl2MHUgKi8KLSAgeyAweDAwMWIsIDAgfSwJCQkvKiBzbGVlcCAqLwotICB7IDB4MDAyOCwgU0VUU1NQIH0sCQkJLyogY2xybWFjICovCi0gIHsgMHgwMDJiLCBCUkFOQ0ggfCBERUxBWSB8IFNFVFNTUCB9LAkvKiBydGUgKi8KLSAgeyAweDAwMzgsIFVTRVNTUCB8IFNFVFNTUCB9LAkJLyogbGR0bGIgKi8KLSAgeyAweDAwNDgsIFNFVFNTUCB9LAkJCS8qIGNscnMgKi8KLSAgeyAweDAwNTgsIFNFVFNTUCB9CQkJLyogc2V0cyAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlMDFbXSA9Ci17Ci0gIHsgMHgwMDAyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyBzcixybiAqLwotICB7IDB4MDAwMywgQlJBTkNIIHwgREVMQVkgfCBVU0VTMSB8IFNFVFNTUCB9LAkvKiBic3JmIHJuICovCi0gIHsgMHgwMDBhLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0cyBtYWNoLHJuICovCi0gIHsgMHgwMDEyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyBnYnIscm4gKi8KLSAgeyAweDAwMWEsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIG1hY2wscm4gKi8KLSAgeyAweDAwMjIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHZicixybiAqLwotICB7IDB4MDAyMywgQlJBTkNIIHwgREVMQVkgfCBVU0VTMSB9LAkJLyogYnJhZiBybiAqLwotICB7IDB4MDAyOSwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBtb3Z0IHJuICovCi0gIHsgMHgwMDJhLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0cyBwcixybiAqLwotICB7IDB4MDAzMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgc3NyLHJuICovCi0gIHsgMHgwMDQyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyBzcGMscm4gKi8KLSAgeyAweDAwNWEsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIGZwdWwscm4gKi8KLSAgeyAweDAwNmEsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIGZwc2NyLHJuICovCi0gIHsgMHgwMDgyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByMF9iYW5rLHJuICovCi0gIHsgMHgwMDgzLCBMT0FEIHwgVVNFUzEgfSwJCQkvKiBwcmVmIEBybiAqLwotICB7IDB4MDA5MiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgcjFfYmFuayxybiAqLwotICB7IDB4MDBhMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgcjJfYmFuayxybiAqLwotICB7IDB4MDBiMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgcjNfYmFuayxybiAqLwotICB7IDB4MDBjMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgcjRfYmFuayxybiAqLwotICB7IDB4MDBkMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgcjVfYmFuayxybiAqLwotICB7IDB4MDBlMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgcjZfYmFuayxybiAqLwotICB7IDB4MDBmMiwgU0VUUzEgfCBVU0VTU1AgfQkJCS8qIHN0YyByN19iYW5rLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGUwMltdID0KLXsKLSAgeyAweDAwMDQsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YuYiBybSxAKHIwLHJuKSAqLwotICB7IDB4MDAwNSwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi53IHJtLEAocjAscm4pICovCi0gIHsgMHgwMDA2LCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92Lmwgcm0sQChyMCxybikgKi8KLSAgeyAweDAwMDcsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIG11bC5sIHJtLHJuICovCi0gIHsgMHgwMDBjLCBMT0FEIHwgU0VUUzEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YuYiBAKHIwLHJtKSxybiAqLwotICB7IDB4MDAwZCwgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92LncgQChyMCxybSkscm4gKi8KLSAgeyAweDAwMGUsIExPQUQgfCBTRVRTMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi5sIEAocjAscm0pLHJuICovCi0gIHsgMHgwMDBmLCBMT0FEfFNFVFMxfFNFVFMyfFNFVFNTUHxVU0VTMXxVU0VTMnxVU0VTU1AgfSwgLyogbWFjLmwgQHJtKyxAcm4rICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGUwW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlMDApLCAweGZmZmYgfSwKLSAgeyBNQVAgKHNoX29wY29kZTAxKSwgMHhmMGZmIH0sCi0gIHsgTUFQIChzaF9vcGNvZGUwMiksIDB4ZjAwZiB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGUxMFtdID0KLXsKLSAgeyAweDEwMDAsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB9CS8qIG1vdi5sIHJtLEAoZGlzcCxybikgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTFbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGUxMCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGUyMFtdID0KLXsKLSAgeyAweDIwMDAsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogbW92LmIgcm0sQHJuICovCi0gIHsgMHgyMDAxLCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIG1vdi53IHJtLEBybiAqLwotICB7IDB4MjAwMiwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBtb3YubCBybSxAcm4gKi8KLSAgeyAweDIwMDQsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCS8qIG1vdi5iIHJtLEAtcm4gKi8KLSAgeyAweDIwMDUsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCS8qIG1vdi53IHJtLEAtcm4gKi8KLSAgeyAweDIwMDYsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCS8qIG1vdi5sIHJtLEAtcm4gKi8KLSAgeyAweDIwMDcsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfCBVU0VTU1AgfSwJLyogZGl2MHMgKi8KLSAgeyAweDIwMDgsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIHRzdCBybSxybiAqLwotICB7IDB4MjAwOSwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBhbmQgcm0scm4gKi8KLSAgeyAweDIwMGEsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogeG9yIHJtLHJuICovCi0gIHsgMHgyMDBiLCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIG9yIHJtLHJuICovCi0gIHsgMHgyMDBjLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBjbXAvc3RyIHJtLHJuICovCi0gIHsgMHgyMDBkLCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIHh0cmN0IHJtLHJuICovCi0gIHsgMHgyMDBlLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBtdWx1Lncgcm0scm4gKi8KLSAgeyAweDIwMGYsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfQkJLyogbXVscy53IHJtLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGUyW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlMjApLCAweGYwMGYgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlMzBbXSA9Ci17Ci0gIHsgMHgzMDAwLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBjbXAvZXEgcm0scm4gKi8KLSAgeyAweDMwMDIsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGNtcC9ocyBybSxybiAqLwotICB7IDB4MzAwMywgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogY21wL2dlIHJtLHJuICovCi0gIHsgMHgzMDA0LCBTRVRTU1AgfCBVU0VTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCS8qIGRpdjEgcm0scm4gKi8KLSAgeyAweDMwMDUsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGRtdWx1Lmwgcm0scm4gKi8KLSAgeyAweDMwMDYsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGNtcC9oaSBybSxybiAqLwotICB7IDB4MzAwNywgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogY21wL2d0IHJtLHJuICovCi0gIHsgMHgzMDA4LCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIHN1YiBybSxybiAqLwotICB7IDB4MzAwYSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIHwgVVNFU1NQIH0sIC8qIHN1YmMgcm0scm4gKi8KLSAgeyAweDMwMGIsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkvKiBzdWJ2IHJtLHJuICovCi0gIHsgMHgzMDBjLCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGFkZCBybSxybiAqLwotICB7IDB4MzAwZCwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogZG11bHMubCBybSxybiAqLwotICB7IDB4MzAwZSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIHwgVVNFU1NQIH0sIC8qIGFkZGMgcm0scm4gKi8KLSAgeyAweDMwMGYsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9CS8qIGFkZHYgcm0scm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTNbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGUzMCksIDB4ZjAwZiB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU0MFtdID0KLXsKLSAgeyAweDQwMDAsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHNobGwgcm4gKi8KLSAgeyAweDQwMDEsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHNobHIgcm4gKi8KLSAgeyAweDQwMDIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdHMubCBtYWNoLEAtcm4gKi8KLSAgeyAweDQwMDMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCBzcixALXJuICovCi0gIHsgMHg0MDA0LCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiByb3RsIHJuICovCi0gIHsgMHg0MDA1LCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiByb3RyIHJuICovCi0gIHsgMHg0MDA2LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZHMubCBAcm0rLG1hY2ggKi8KLSAgeyAweDQwMDcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSssc3IgKi8KLSAgeyAweDQwMDgsIFNFVFMxIHwgVVNFUzEgfSwJCQkvKiBzaGxsMiBybiAqLwotICB7IDB4NDAwOSwgU0VUUzEgfCBVU0VTMSB9LAkJCS8qIHNobHIyIHJuICovCi0gIHsgMHg0MDBhLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkcyBybSxtYWNoICovCi0gIHsgMHg0MDBiLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVMxIH0sCQkvKiBqc3IgQHJuICovCi0gIHsgMHg0MDBlLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkYyBybSxzciAqLwotICB7IDB4NDAxMCwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogZHQgcm4gKi8KLSAgeyAweDQwMTEsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogY21wL3B6IHJuICovCi0gIHsgMHg0MDEyLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RzLmwgbWFjbCxALXJuICovCi0gIHsgMHg0MDEzLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgZ2JyLEAtcm4gKi8KLSAgeyAweDQwMTUsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogY21wL3BsIHJuICovCi0gIHsgMHg0MDE2LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZHMubCBAcm0rLG1hY2wgKi8KLSAgeyAweDQwMTcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSssZ2JyICovCi0gIHsgMHg0MDE4LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hsbDggcm4gKi8KLSAgeyAweDQwMTksIFNFVFMxIHwgVVNFUzEgfSwJCQkvKiBzaGxyOCBybiAqLwotICB7IDB4NDAxYSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZHMgcm0sbWFjbCAqLwotICB7IDB4NDAxYiwgTE9BRCB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiB0YXMuYiBAcm4gKi8KLSAgeyAweDQwMWUsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRjIHJtLGdiciAqLwotICB7IDB4NDAyMCwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogc2hhbCBybiAqLwotICB7IDB4NDAyMSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogc2hhciBybiAqLwotICB7IDB4NDAyMiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0cy5sIHByLEAtcm4gKi8KLSAgeyAweDQwMjMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCB2YnIsQC1ybiAqLwotICB7IDB4NDAyNCwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiByb3RjbCBybiAqLwotICB7IDB4NDAyNSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiByb3RjciBybiAqLwotICB7IDB4NDAyNiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyxwciAqLwotICB7IDB4NDAyNywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyx2YnIgKi8KLSAgeyAweDQwMjgsIFNFVFMxIHwgVVNFUzEgfSwJCQkvKiBzaGxsMTYgcm4gKi8KLSAgeyAweDQwMjksIFNFVFMxIHwgVVNFUzEgfSwJCQkvKiBzaGxyMTYgcm4gKi8KLSAgeyAweDQwMmEsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRzIHJtLHByICovCi0gIHsgMHg0MDJiLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVMxIH0sCQkvKiBqbXAgQHJuICovCi0gIHsgMHg0MDJlLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkYyBybSx2YnIgKi8KLSAgeyAweDQwMzMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCBzc3IsQC1ybiAqLwotICB7IDB4NDAzNywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyxzc3IgKi8KLSAgeyAweDQwM2UsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRjIHJtLHNzciAqLwotICB7IDB4NDA0MywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIHNwYyxALXJuICovCi0gIHsgMHg0MDQ3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLHNwYyAqLwotICB7IDB4NDA0ZSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZGMgcm0sc3BjICovCi0gIHsgMHg0MDUyLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RzLmwgZnB1bCxALXJuICovCi0gIHsgMHg0MDU2LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZHMubCBAcm0rLGZwdWwgKi8KLSAgeyAweDQwNWEsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRzLmwgcm0sZnB1bCAqLwotICB7IDB4NDA2MiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0cy5sIGZwc2NyLEAtcm4gKi8KLSAgeyAweDQwNjYsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkcy5sIEBybSssZnBzY3IgKi8KLSAgeyAweDQwNmEsIFNFVFNTUCB8IFVTRVMxIH0JCQkvKiBsZHMgcm0sZnBzY3IgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTQxW10gPQotewotICB7IDB4NDA4MywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIHJ4X2JhbmssQC1ybiAqLwotICB7IDB4NDA4NywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyxyeF9iYW5rICovCi0gIHsgMHg0MDhlLCBTRVRTU1AgfCBVU0VTMSB9CQkJLyogbGRjIHJtLHJ4X2JhbmsgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTQyW10gPQotewotICB7IDB4NDAwYywgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkJLyogc2hhZCBybSxybiAqLwotICB7IDB4NDAwZCwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkJLyogc2hsZCBybSxybiAqLwotICB7IDB4NDAwZiwgTE9BRHxTRVRTMXxTRVRTMnxTRVRTU1B8VVNFUzF8VVNFUzJ8VVNFU1NQIH0sIC8qIG1hYy53IEBybSssQHJuKyAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlNFtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTQwKSwgMHhmMGZmIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU0MSksIDB4ZjA4ZiB9LAotICB7IE1BUCAoc2hfb3Bjb2RlNDIpLCAweGYwMGYgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlNTBbXSA9Ci17Ci0gIHsgMHg1MDAwLCBMT0FEIHwgU0VUUzEgfCBVU0VTMiB9CS8qIG1vdi5sIEAoZGlzcCxybSkscm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTVbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGU1MCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU2MFtdID0KLXsKLSAgeyAweDYwMDAsIExPQUQgfCBTRVRTMSB8IFVTRVMyIH0sCQkvKiBtb3YuYiBAcm0scm4gKi8KLSAgeyAweDYwMDEsIExPQUQgfCBTRVRTMSB8IFVTRVMyIH0sCQkvKiBtb3YudyBAcm0scm4gKi8KLSAgeyAweDYwMDIsIExPQUQgfCBTRVRTMSB8IFVTRVMyIH0sCQkvKiBtb3YubCBAcm0scm4gKi8KLSAgeyAweDYwMDMsIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBtb3Ygcm0scm4gKi8KLSAgeyAweDYwMDQsIExPQUQgfCBTRVRTMSB8IFNFVFMyIHwgVVNFUzIgfSwJLyogbW92LmIgQHJtKyxybiAqLwotICB7IDB4NjAwNSwgTE9BRCB8IFNFVFMxIHwgU0VUUzIgfCBVU0VTMiB9LAkvKiBtb3YudyBAcm0rLHJuICovCi0gIHsgMHg2MDA2LCBMT0FEIHwgU0VUUzEgfCBTRVRTMiB8IFVTRVMyIH0sCS8qIG1vdi5sIEBybSsscm4gKi8KLSAgeyAweDYwMDcsIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBub3Qgcm0scm4gKi8KLSAgeyAweDYwMDgsIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBzd2FwLmIgcm0scm4gKi8KLSAgeyAweDYwMDksIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBzd2FwLncgcm0scm4gKi8KLSAgeyAweDYwMGEsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzIgfCBVU0VTU1AgfSwJLyogbmVnYyBybSxybiAqLwotICB7IDB4NjAwYiwgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIG5lZyBybSxybiAqLwotICB7IDB4NjAwYywgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIGV4dHUuYiBybSxybiAqLwotICB7IDB4NjAwZCwgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIGV4dHUudyBybSxybiAqLwotICB7IDB4NjAwZSwgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIGV4dHMuYiBybSxybiAqLwotICB7IDB4NjAwZiwgU0VUUzEgfCBVU0VTMiB9CQkJLyogZXh0cy53IHJtLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGU2W10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlNjApLCAweGYwMGYgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlNzBbXSA9Ci17Ci0gIHsgMHg3MDAwLCBTRVRTMSB8IFVTRVMxIH0JCS8qIGFkZCAjaW1tLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGU3W10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlNzApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlODBbXSA9Ci17Ci0gIHsgMHg4MDAwLCBTVE9SRSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi5iIHIwLEAoZGlzcCxybikgKi8KLSAgeyAweDgxMDAsIFNUT1JFIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92LncgcjAsQChkaXNwLHJuKSAqLwotICB7IDB4ODQwMCwgTE9BRCB8IFNFVFNSMCB8IFVTRVMyIH0sCS8qIG1vdi5iIEAoZGlzcCxybSkscjAgKi8KLSAgeyAweDg1MDAsIExPQUQgfCBTRVRTUjAgfCBVU0VTMiB9LAkvKiBtb3YudyBAKGRpc3Ascm4pLHIwICovCi0gIHsgMHg4ODAwLCBTRVRTU1AgfCBVU0VTUjAgfSwJCS8qIGNtcC9lcSAjaW1tLHIwICovCi0gIHsgMHg4OTAwLCBCUkFOQ0ggfCBVU0VTU1AgfSwJCS8qIGJ0IGxhYmVsICovCi0gIHsgMHg4YjAwLCBCUkFOQ0ggfCBVU0VTU1AgfSwJCS8qIGJmIGxhYmVsICovCi0gIHsgMHg4ZDAwLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVNTUCB9LAkvKiBidC9zIGxhYmVsICovCi0gIHsgMHg4ZjAwLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVNTUCB9CS8qIGJmL3MgbGFiZWwgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZThbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGU4MCksIDB4ZmYwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU5MFtdID0KLXsKLSAgeyAweDkwMDAsIExPQUQgfCBTRVRTMSB9CS8qIG1vdi53IEAoZGlzcCxwYykscm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTlbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGU5MCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGVhMFtdID0KLXsKLSAgeyAweGEwMDAsIEJSQU5DSCB8IERFTEFZIH0JLyogYnJhIGxhYmVsICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGVhW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlYTApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlYjBbXSA9Ci17Ci0gIHsgMHhiMDAwLCBCUkFOQ0ggfCBERUxBWSB9CS8qIGJzciBsYWJlbCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlYltdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZWIwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWMwW10gPQotewotICB7IDB4YzAwMCwgU1RPUkUgfCBVU0VTUjAgfCBVU0VTU1AgfSwJCS8qIG1vdi5iIHIwLEAoZGlzcCxnYnIpICovCi0gIHsgMHhjMTAwLCBTVE9SRSB8IFVTRVNSMCB8IFVTRVNTUCB9LAkJLyogbW92LncgcjAsQChkaXNwLGdicikgKi8KLSAgeyAweGMyMDAsIFNUT1JFIHwgVVNFU1IwIHwgVVNFU1NQIH0sCQkvKiBtb3YubCByMCxAKGRpc3AsZ2JyKSAqLwotICB7IDB4YzMwMCwgQlJBTkNIIHwgVVNFU1NQIH0sCQkJLyogdHJhcGEgI2ltbSAqLwotICB7IDB4YzQwMCwgTE9BRCB8IFNFVFNSMCB8IFVTRVNTUCB9LAkJLyogbW92LmIgQChkaXNwLGdicikscjAgKi8KLSAgeyAweGM1MDAsIExPQUQgfCBTRVRTUjAgfCBVU0VTU1AgfSwJCS8qIG1vdi53IEAoZGlzcCxnYnIpLHIwICovCi0gIHsgMHhjNjAwLCBMT0FEIHwgU0VUU1IwIHwgVVNFU1NQIH0sCQkvKiBtb3YubCBAKGRpc3AsZ2JyKSxyMCAqLwotICB7IDB4YzcwMCwgU0VUU1IwIH0sCQkJCS8qIG1vdmEgQChkaXNwLHBjKSxyMCAqLwotICB7IDB4YzgwMCwgU0VUU1NQIHwgVVNFU1IwIH0sCQkJLyogdHN0ICNpbW0scjAgKi8KLSAgeyAweGM5MDAsIFNFVFNSMCB8IFVTRVNSMCB9LAkJCS8qIGFuZCAjaW1tLHIwICovCi0gIHsgMHhjYTAwLCBTRVRTUjAgfCBVU0VTUjAgfSwJCQkvKiB4b3IgI2ltbSxyMCAqLwotICB7IDB4Y2IwMCwgU0VUU1IwIHwgVVNFU1IwIH0sCQkJLyogb3IgI2ltbSxyMCAqLwotICB7IDB4Y2MwMCwgTE9BRCB8IFNFVFNTUCB8IFVTRVNSMCB8IFVTRVNTUCB9LAkvKiB0c3QuYiAjaW1tLEAocjAsZ2JyKSAqLwotICB7IDB4Y2QwMCwgTE9BRCB8IFNUT1JFIHwgVVNFU1IwIHwgVVNFU1NQIH0sCS8qIGFuZC5iICNpbW0sQChyMCxnYnIpICovCi0gIHsgMHhjZTAwLCBMT0FEIHwgU1RPUkUgfCBVU0VTUjAgfCBVU0VTU1AgfSwJLyogeG9yLmIgI2ltbSxAKHIwLGdicikgKi8KLSAgeyAweGNmMDAsIExPQUQgfCBTVE9SRSB8IFVTRVNSMCB8IFVTRVNTUCB9CS8qIG9yLmIgI2ltbSxAKHIwLGdicikgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZWNbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGVjMCksIDB4ZmYwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGVkMFtdID0KLXsKLSAgeyAweGQwMDAsIExPQUQgfCBTRVRTMSB9CQkvKiBtb3YubCBAKGRpc3AscGMpLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGVkW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlZDApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlZTBbXSA9Ci17Ci0gIHsgMHhlMDAwLCBTRVRTMSB9CQkvKiBtb3YgI2ltbSxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlZVtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZWUwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWYwW10gPQotewotICB7IDB4ZjAwMCwgU0VUU0YxIHwgVVNFU0YxIHwgVVNFU0YyIH0sCQkvKiBmYWRkIGZtLGZuICovCi0gIHsgMHhmMDAxLCBTRVRTRjEgfCBVU0VTRjEgfCBVU0VTRjIgfSwJCS8qIGZzdWIgZm0sZm4gKi8KLSAgeyAweGYwMDIsIFNFVFNGMSB8IFVTRVNGMSB8IFVTRVNGMiB9LAkJLyogZm11bCBmbSxmbiAqLwotICB7IDB4ZjAwMywgU0VUU0YxIHwgVVNFU0YxIHwgVVNFU0YyIH0sCQkvKiBmZGl2IGZtLGZuICovCi0gIHsgMHhmMDA0LCBTRVRTU1AgfCBVU0VTRjEgfCBVU0VTRjIgfSwJCS8qIGZjbXAvZXEgZm0sZm4gKi8KLSAgeyAweGYwMDUsIFNFVFNTUCB8IFVTRVNGMSB8IFVTRVNGMiB9LAkJLyogZmNtcC9ndCBmbSxmbiAqLwotICB7IDB4ZjAwNiwgTE9BRCB8IFNFVFNGMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIGZtb3YucyBAKHIwLHJtKSxmbiAqLwotICB7IDB4ZjAwNywgU1RPUkUgfCBVU0VTMSB8IFVTRVNGMiB8IFVTRVNSMCB9LAkvKiBmbW92LnMgZm0sQChyMCxybikgKi8KLSAgeyAweGYwMDgsIExPQUQgfCBTRVRTRjEgfCBVU0VTMiB9LAkJLyogZm1vdi5zIEBybSxmbiAqLwotICB7IDB4ZjAwOSwgTE9BRCB8IFNFVFMyIHwgU0VUU0YxIHwgVVNFUzIgfSwJLyogZm1vdi5zIEBybSssZm4gKi8KLSAgeyAweGYwMGEsIFNUT1JFIHwgVVNFUzEgfCBVU0VTRjIgfSwJCS8qIGZtb3YucyBmbSxAcm4gKi8KLSAgeyAweGYwMGIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNGMiB9LAkvKiBmbW92LnMgZm0sQC1ybiAqLwotICB7IDB4ZjAwYywgU0VUU0YxIHwgVVNFU0YyIH0sCQkJLyogZm1vdiBmbSxmbiAqLwotICB7IDB4ZjAwZSwgU0VUU0YxIHwgVVNFU0YxIHwgVVNFU0YyIHwgVVNFU0YwIH0JLyogZm1hYyBmMCxmbSxmbiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlZjFbXSA9Ci17Ci0gIHsgMHhmMDBkLCBTRVRTRjEgfCBVU0VTU1AgfSwJLyogZnN0cyBmcHVsLGZuICovCi0gIHsgMHhmMDFkLCBTRVRTU1AgfCBVU0VTRjEgfSwJLyogZmxkcyBmbixmcHVsICovCi0gIHsgMHhmMDJkLCBTRVRTRjEgfCBVU0VTU1AgfSwJLyogZmxvYXQgZnB1bCxmbiAqLwotICB7IDB4ZjAzZCwgU0VUU1NQIHwgVVNFU0YxIH0sCS8qIGZ0cmMgZm4sZnB1bCAqLwotICB7IDB4ZjA0ZCwgU0VUU0YxIHwgVVNFU0YxIH0sCS8qIGZuZWcgZm4gKi8KLSAgeyAweGYwNWQsIFNFVFNGMSB8IFVTRVNGMSB9LAkvKiBmYWJzIGZuICovCi0gIHsgMHhmMDZkLCBTRVRTRjEgfCBVU0VTRjEgfSwJLyogZnNxcnQgZm4gKi8KLSAgeyAweGYwN2QsIFNFVFNTUCB8IFVTRVNGMSB9LAkvKiBmdHN0L25hbiBmbiAqLwotICB7IDB4ZjA4ZCwgU0VUU0YxIH0sCQkvKiBmbGRpMCBmbiAqLwotICB7IDB4ZjA5ZCwgU0VUU0YxIH0JCS8qIGZsZGkxIGZuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGVmW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlZjApLCAweGYwMGYgfSwKLSAgeyBNQVAgKHNoX29wY29kZWYxKSwgMHhmMGZmIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWFqb3Jfb3Bjb2RlIHNoX29wY29kZXNbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGUwKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlMSkgfSwKLSAgeyBNQVAgKHNoX29wY29kZTIpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGUzKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlNCkgfSwKLSAgeyBNQVAgKHNoX29wY29kZTUpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU2KSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlNykgfSwKLSAgeyBNQVAgKHNoX29wY29kZTgpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU5KSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlYSkgfSwKLSAgeyBNQVAgKHNoX29wY29kZWIpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGVjKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlZCkgfSwKLSAgeyBNQVAgKHNoX29wY29kZWUpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGVmKSB9Ci19OwotCi0vKiBHaXZlbiBhbiBpbnN0cnVjdGlvbiwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZwotICAgc2hfb3Bjb2RlIHN0cnVjdHVyZS4gIFJldHVybiBOVUxMIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBub3QKLSAgIHJlY29nbml6ZWQuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqCi1zaF9pbnNuX2luZm8gKGluc24pCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotewotICBjb25zdCBzdHJ1Y3Qgc2hfbWFqb3Jfb3Bjb2RlICptYWo7Ci0gIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgKm1pbiwgKm1pbmVuZDsKLQotICBtYWogPSAmc2hfb3Bjb2Rlc1soaW5zbiAmIDB4ZjAwMCkgPj4gMTJdOwotICBtaW4gPSBtYWotPm1pbm9yX29wY29kZXM7Ci0gIG1pbmVuZCA9IG1pbiArIG1hai0+Y291bnQ7Ci0gIGZvciAoOyBtaW4gPCBtaW5lbmQ7IG1pbisrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBsOwotICAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3AsICpvcGVuZDsKLQotICAgICAgbCA9IGluc24gJiBtaW4tPm1hc2s7Ci0gICAgICBvcCA9IG1pbi0+b3Bjb2RlczsKLSAgICAgIG9wZW5kID0gb3AgKyBtaW4tPmNvdW50OwotCi0gICAgICAvKiBTaW5jZSB0aGUgb3Bjb2RlcyB0YWJsZXMgYXJlIHNvcnRlZCwgd2UgY291bGQgdXNlIGEgYmluYXJ5Ci0gICAgICAgICBzZWFyY2ggaGVyZSBpZiB0aGUgY291bnQgd2VyZSBhYm92ZSBzb21lIGN1dG9mZiB2YWx1ZS4gICovCi0gICAgICBmb3IgKDsgb3AgPCBvcGVuZDsgb3ArKykKLQlpZiAob3AtPm9wY29kZSA9PSBsKQotCSAgcmV0dXJuIG9wOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsgIAotfQotCi0vKiBTZWUgd2hldGhlciBhbiBpbnN0cnVjdGlvbiB1c2VzIGEgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2luc25fdXNlc19yZWcgKGluc24sIG9wLCByZWcpCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDsKLSAgICAgdW5zaWduZWQgaW50IHJlZzsKLXsKLSAgdW5zaWduZWQgaW50IGY7Ci0KLSAgZiA9IG9wLT5mbGFnczsKLQotICBpZiAoKGYgJiBVU0VTMSkgIT0gMAotICAgICAgJiYgKChpbnNuICYgMHgwZjAwKSA+PiA4KSA9PSByZWcpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZiAmIFVTRVMyKSAhPSAwCi0gICAgICAmJiAoKGluc24gJiAweDAwZjApID4+IDQpID09IHJlZykKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmICYgVVNFU1IwKSAhPSAwCi0gICAgICAmJiByZWcgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIGFuIGluc3RydWN0aW9uIHVzZXMgYSBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9pbnNuX3VzZXNfZnJlZyAoaW5zbiwgb3AsIGZyZWcpCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDsKLSAgICAgdW5zaWduZWQgaW50IGZyZWc7Ci17Ci0gIHVuc2lnbmVkIGludCBmOwotCi0gIGYgPSBvcC0+ZmxhZ3M7Ci0KLSAgLyogV2UgY2FuJ3QgdGVsbCBpZiB0aGlzIGlzIGEgZG91YmxlLXByZWNpc2lvbiBpbnNuLCBzbyBqdXN0IHBsYXkgc2FmZQotICAgICBhbmQgYXNzdW1lIHRoYXQgaXQgbWlnaHQgYmUuICBTbyBub3Qgb25seSBoYXZlIHdlIHRlc3QgRlJFRyBhZ2FpbnN0Ci0gICAgIGl0c2VsZiwgYnV0IGFsc28gZXZlbiBGUkVHIGFnYWluc3QgRlJFRysxIC0gaWYgdGhlIHVzaW5nIGluc24gdXNlcwotICAgICBqdXN0IHRoZSBsb3cgcGFydCBvZiBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgLSBidXQgYWxzbyBhbiBvZGQKLSAgICAgRlJFRyBhZ2FpbnN0IEZSRUctMSAtICBpZiB0aGUgc2V0dGluZyBpbnNuIHNldHMganVzdCB0aGUgbG93IHBhcnQKLSAgICAgb2YgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlLgotICAgICBTbyB3aGF0IHRoaXMgYWxsIGJvaWxzIGRvd24gdG8gaXMgdGhhdCB3ZSBoYXZlIHRvIGlnbm9yZSB0aGUgbG93ZXN0Ci0gICAgIGJpdCBvZiB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLSAgICAgCi0gIGlmICgoZiAmIFVTRVNGMSkgIT0gMAotICAgICAgJiYgKChpbnNuICYgMHgwZTAwKSA+PiA4KSA9PSAoZnJlZyAmIDB4ZSkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZiAmIFVTRVNGMikgIT0gMAotICAgICAgJiYgKChpbnNuICYgMHgwMGUwKSA+PiA0KSA9PSAoZnJlZyAmIDB4ZSkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZiAmIFVTRVNGMCkgIT0gMAotICAgICAgJiYgZnJlZyA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU2VlIHdoZXRoZXIgaW5zdHJ1Y3Rpb25zIEkxIGFuZCBJMiBjb25mbGljdCwgYXNzdW1pbmcgSTEgY29tZXMKLSAgIGJlZm9yZSBJMi4gIE9QMSBhbmQgT1AyIGFyZSB0aGUgY29ycmVzcG9uZGluZyBzaF9vcGNvZGUgc3RydWN0dXJlcy4KLSAgIFRoaXMgc2hvdWxkIHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgY29uZmxpY3QsIG9yIGZhbHNlIGlmIHRoZQotICAgaW5zdHJ1Y3Rpb25zIGNhbiBiZSBzd2FwcGVkIHNhZmVseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9pbnNuc19jb25mbGljdCAoaTEsIG9wMSwgaTIsIG9wMikKLSAgICAgdW5zaWduZWQgaW50IGkxOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDE7Ci0gICAgIHVuc2lnbmVkIGludCBpMjsKLSAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3AyOwotewotICB1bnNpZ25lZCBpbnQgZjEsIGYyOwotCi0gIGYxID0gb3AxLT5mbGFnczsKLSAgZjIgPSBvcDItPmZsYWdzOwotCi0gIC8qIExvYWQgb2YgZnBzY3IgY29uZmxpY3RzIHdpdGggZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucy4KLSAgICAgRklYTUU6IHNob3VsZG4ndCB0ZXN0IHJhdyBvcGNvZGVzIGhlcmUuICAqLwotICBpZiAoKChpMSAmIDB4ZjBmZikgPT0gMHg0MDY2ICYmIChpMiAmIDB4ZjAwMCkgPT0gMHhmMDAwKQotICAgICAgfHwgKChpMiAmIDB4ZjBmZikgPT0gMHg0MDY2ICYmIChpMSAmIDB4ZjAwMCkgPT0gMHhmMDAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGYxICYgKEJSQU5DSCB8IERFTEFZKSkgIT0gMAotICAgICAgfHwgKGYyICYgKEJSQU5DSCB8IERFTEFZKSkgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGYxICYgU0VUU1NQKSAhPSAwICYmIChmMiAmIFVTRVNTUCkgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmMiAmIFNFVFNTUCkgIT0gMCAmJiAoZjEgJiBVU0VTU1ApICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChmMSAmIFNFVFMxKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMiwgb3AyLCAoaTEgJiAweDBmMDApID4+IDgpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYxICYgU0VUUzIpICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19yZWcgKGkyLCBvcDIsIChpMSAmIDB4MDBmMCkgPj4gNCkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZjEgJiBTRVRTUjApICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19yZWcgKGkyLCBvcDIsIDApKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYxICYgU0VUU0YxKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfZnJlZyAoaTIsIG9wMiwgKGkxICYgMHgwZjAwKSA+PiA4KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGYyICYgU0VUUzEpICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19yZWcgKGkxLCBvcDEsIChpMiAmIDB4MGYwMCkgPj4gOCkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZjIgJiBTRVRTMikgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX3JlZyAoaTEsIG9wMSwgKGkyICYgMHgwMGYwKSA+PiA0KSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmMiAmIFNFVFNSMCkgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX3JlZyAoaTEsIG9wMSwgMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZjIgJiBTRVRTRjEpICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19mcmVnIChpMSwgb3AxLCAoaTIgJiAweDBmMDApID4+IDgpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRoZSBpbnN0cnVjdGlvbnMgZG8gbm90IGNvbmZsaWN0LiAgKi8KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBJMSBpcyBhIGxvYWQgaW5zdHJ1Y3Rpb24sIGFuZCBJMiBpcyBzb21lIG90aGVyIGluc3RydWN0aW9uLiAgUmV0dXJuCi0gICB0cnVlIGlmIEkxIGxvYWRzIGEgcmVnaXN0ZXIgd2hpY2ggSTIgdXNlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9sb2FkX3VzZSAoaTEsIG9wMSwgaTIsIG9wMikKLSAgICAgdW5zaWduZWQgaW50IGkxOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDE7Ci0gICAgIHVuc2lnbmVkIGludCBpMjsKLSAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3AyOwotewotICB1bnNpZ25lZCBpbnQgZjE7Ci0KLSAgZjEgPSBvcDEtPmZsYWdzOwotCi0gIGlmICgoZjEgJiBMT0FEKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiBib3RoIFNFVFMxIGFuZCBTRVRTU1AgYXJlIHNldCwgdGhhdCBtZWFucyBhIGxvYWQgdG8gYSBzcGVjaWFsCi0gICAgIHJlZ2lzdGVyIHVzaW5nIHBvc3RpbmNyZW1lbnQgYWRkcmVzc2luZyBtb2RlLCB3aGljaCB3ZSBkb24ndCBjYXJlCi0gICAgIGFib3V0IGhlcmUuICAqLwotICBpZiAoKGYxICYgU0VUUzEpICE9IDAKLSAgICAgICYmIChmMSAmIFNFVFNTUCkgPT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX3JlZyAoaTIsIG9wMiwgKGkxICYgMHgwZjAwKSA+PiA4KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGYxICYgU0VUU1IwKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMiwgb3AyLCAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGYxICYgU0VUU0YxKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfZnJlZyAoaTIsIG9wMiwgKGkxICYgMHgwZjAwKSA+PiA4KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRyeSB0byBhbGlnbiBsb2FkcyBhbmQgc3RvcmVzIHdpdGhpbiBhIHNwYW4gb2YgbWVtb3J5LiAgVGhpcyBpcwotICAgY2FsbGVkIGJ5IGJvdGggdGhlIEVMRiBhbmQgdGhlIENPRkYgc2ggdGFyZ2V0cy4gIEFCRkQgYW5kIFNFQyBhcmUKLSAgIHRoZSBCRkQgYW5kIHNlY3Rpb24gd2UgYXJlIGV4YW1pbmluZy4gIENPTlRFTlRTIGlzIHRoZSBjb250ZW50cyBvZgotICAgdGhlIHNlY3Rpb24uICBTV0FQIGlzIHRoZSByb3V0aW5lIHRvIGNhbGwgdG8gc3dhcCB0d28gaW5zdHJ1Y3Rpb25zLgotICAgUkVMT0NTIGlzIGEgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiwgdG8gYmUKLSAgIHBhc3NlZCB0byBTV0FQLiAgUExBQkVMIGlzIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBsYWJlbCBpbiBhCi0gICBzb3J0ZWQgbGlzdCBvZiBsYWJlbHM7IExBQkVMX0VORCBpcyB0aGUgZW5kIG9mIHRoZSBsaXN0LiAgU1RBUlQgYW5kCi0gICBTVE9QIGFyZSB0aGUgcmFuZ2Ugb2YgbWVtb3J5IHRvIGV4YW1pbmUuICBJZiBhIHN3YXAgaXMgbWFkZSwKLSAgICpQU1dBUFBFRCBpcyBzZXQgdG8gdHJ1ZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuIChhYmZkLCBzZWMsIGNvbnRlbnRzLCBzd2FwLCByZWxvY3MsCi0JCQkgcGxhYmVsLCBsYWJlbF9lbmQsIHN0YXJ0LCBzdG9wLCBwc3dhcHBlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJvb2xlYW4gKCpzd2FwKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7Ci0gICAgIFBUUiByZWxvY3M7Ci0gICAgIGJmZF92bWEgKipwbGFiZWw7Ci0gICAgIGJmZF92bWEgKmxhYmVsX2VuZDsKLSAgICAgYmZkX3ZtYSBzdGFydDsKLSAgICAgYmZkX3ZtYSBzdG9wOwotICAgICBib29sZWFuICpwc3dhcHBlZDsKLXsKLSAgYmZkX3ZtYSBpOwotCi0gIC8qIEluc3RydWN0aW9ucyBzaG91bGQgYmUgYWxpZ25lZCBvbiAyIGJ5dGUgYm91bmRhcmllcy4gICovCi0gIGlmICgoc3RhcnQgJiAxKSA9PSAxKQotICAgICsrc3RhcnQ7Ci0KLSAgLyogTm93IGxvb2sgdGhyb3VnaCB0aGUgdW5hbGlnbmVkIGFkZHJlc3Nlcy4gICovCi0gIGkgPSBzdGFydDsKLSAgaWYgKChpICYgMikgPT0gMCkKLSAgICBpICs9IDI7Ci0gIGZvciAoOyBpIDwgc3RvcDsgaSArPSA0KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3A7Ci0gICAgICB1bnNpZ25lZCBpbnQgcHJldl9pbnNuID0gMDsKLSAgICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKnByZXZfb3AgPSBOVUxMOwotCi0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpKTsKLSAgICAgIG9wID0gc2hfaW5zbl9pbmZvIChpbnNuKTsKLSAgICAgIGlmIChvcCA9PSBOVUxMCi0JICB8fCAob3AtPmZsYWdzICYgKExPQUQgfCBTVE9SRSkpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBsb2FkIG9yIHN0b3JlIHdoaWNoIGlzIG5vdCBvbiBhIGZvdXIgYnl0ZSBib3VuZGFyeS4gICovCi0KLSAgICAgIHdoaWxlICgqcGxhYmVsIDwgbGFiZWxfZW5kICYmICoqcGxhYmVsIDwgaSkKLQkrKypwbGFiZWw7Ci0KLSAgICAgIGlmIChpID4gc3RhcnQpCi0JewotCSAgcHJldl9pbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpIC0gMik7Ci0JICBwcmV2X29wID0gc2hfaW5zbl9pbmZvIChwcmV2X2luc24pOwotCi0JICAvKiBJZiB0aGUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbiBpcyBpbiBhIGRlbGF5IHNsb3QsIHdlCi0JICAgICBjYW4ndCBzd2FwLiAgKi8KLQkgIGlmIChwcmV2X29wID09IE5VTEwKLQkgICAgICB8fCAocHJldl9vcC0+ZmxhZ3MgJiBERUxBWSkgIT0gMCkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgaWYgKGkgPiBzdGFydAotCSAgJiYgKCpwbGFiZWwgPj0gbGFiZWxfZW5kIHx8ICoqcGxhYmVsICE9IGkpCi0JICAmJiBwcmV2X29wICE9IE5VTEwKLQkgICYmIChwcmV2X29wLT5mbGFncyAmIChMT0FEIHwgU1RPUkUpKSA9PSAwCi0JICAmJiAhIHNoX2luc25zX2NvbmZsaWN0IChwcmV2X2luc24sIHByZXZfb3AsIGluc24sIG9wKSkKLQl7Ci0JICBib29sZWFuIG9rOwotCi0JICAvKiBUaGUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBoYXZlIGEgbGFiZWwsIGFuZAotCSAgICAgdGhlcmUgaXMgYSBwcmV2aW91cyBpbnN0cnVjdGlvbjsgUFJFVl9JTlNOIGlzIG5vdAotCSAgICAgaXRzZWxmIGEgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbiwgYW5kIFBSRVZfSU5TTiBhbmQKLQkgICAgIElOU04gZG8gbm90IGNvbmZsaWN0LiAgKi8KLQotCSAgb2sgPSB0cnVlOwotCi0JICBpZiAoaSA+PSBzdGFydCArIDQpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgcHJldjJfaW5zbjsKLQkgICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpwcmV2Ml9vcDsKLQotCSAgICAgIHByZXYyX2luc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGkgLSA0KTsKLQkgICAgICBwcmV2Ml9vcCA9IHNoX2luc25faW5mbyAocHJldjJfaW5zbik7Ci0KLQkgICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gYmVmb3JlIFBSRVZfSU5TTiBoYXMgYSBkZWxheQotCQkgc2xvdC0tdGhhdCBpcywgUFJFVl9JTlNOIGlzIGluIGEgZGVsYXkgc2xvdC0td2UKLQkJIGNhbiBub3Qgc3dhcC4gICovCi0JICAgICAgaWYgKHByZXYyX29wID09IE5VTEwKLQkJICB8fCAocHJldjJfb3AtPmZsYWdzICYgREVMQVkpICE9IDApCi0JCW9rID0gZmFsc2U7Ci0KLQkgICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gYmVmb3JlIFBSRVZfSU5TTiBpcyBhIGxvYWQsCi0JCSBhbmQgaXQgc2V0cyBhIHJlZ2lzdGVyIHdoaWNoIElOU04gdXNlcywgdGhlbgotCQkgcHV0dGluZyBJTlNOIGltbWVkaWF0ZWx5IGFmdGVyIFBSRVZfSU5TTiB3aWxsCi0JCSBjYXVzZSBhIHBpcGVsaW5lIGJ1YmJsZSwgc28gdGhlcmUgaXMgbm8gcG9pbnQgdG8KLQkJIG1ha2luZyB0aGUgc3dhcC4gICovCi0JICAgICAgaWYgKG9rCi0JCSAgJiYgKHByZXYyX29wLT5mbGFncyAmIExPQUQpICE9IDAKLQkJICAmJiBzaF9sb2FkX3VzZSAocHJldjJfaW5zbiwgcHJldjJfb3AsIGluc24sIG9wKSkKLQkJb2sgPSBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAob2spCi0JICAgIHsKLQkgICAgICBpZiAoISAoKnN3YXApIChhYmZkLCBzZWMsIHJlbG9jcywgY29udGVudHMsIGkgLSAyKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgICpwc3dhcHBlZCA9IHRydWU7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHdoaWxlICgqcGxhYmVsIDwgbGFiZWxfZW5kICYmICoqcGxhYmVsIDwgaSArIDIpCi0JKysqcGxhYmVsOwotCi0gICAgICBpZiAoaSArIDIgPCBzdG9wCi0JICAmJiAoKnBsYWJlbCA+PSBsYWJlbF9lbmQgfHwgKipwbGFiZWwgIT0gaSArIDIpKQotCXsKLQkgIHVuc2lnbmVkIGludCBuZXh0X2luc247Ci0JICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpuZXh0X29wOwotCi0JICAvKiBUaGVyZSBpcyBhbiBpbnN0cnVjdGlvbiBhZnRlciB0aGUgbG9hZC9zdG9yZQotCSAgICAgaW5zdHJ1Y3Rpb24sIGFuZCBpdCBkb2VzIG5vdCBoYXZlIGEgbGFiZWwuICAqLwotCSAgbmV4dF9pbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpICsgMik7Ci0JICBuZXh0X29wID0gc2hfaW5zbl9pbmZvIChuZXh0X2luc24pOwotCSAgaWYgKG5leHRfb3AgIT0gTlVMTAotCSAgICAgICYmIChuZXh0X29wLT5mbGFncyAmIChMT0FEIHwgU1RPUkUpKSA9PSAwCi0JICAgICAgJiYgISBzaF9pbnNuc19jb25mbGljdCAoaW5zbiwgb3AsIG5leHRfaW5zbiwgbmV4dF9vcCkpCi0JICAgIHsKLQkgICAgICBib29sZWFuIG9rOwotCi0JICAgICAgLyogTkVYVF9JTlNOIGlzIG5vdCBpdHNlbGYgYSBsb2FkL3N0b3JlIGluc3RydWN0aW9uLAotCQkgYW5kIGl0IGRvZXMgbm90IGNvbmZsaWN0IHdpdGggSU5TTi4gICovCi0KLQkgICAgICBvayA9IHRydWU7Ci0KLQkgICAgICAvKiBJZiBQUkVWX0lOU04gaXMgYSBsb2FkLCBhbmQgaXQgc2V0cyBhIHJlZ2lzdGVyCi0JCSB3aGljaCBORVhUX0lOU04gdXNlcywgdGhlbiBwdXR0aW5nIE5FWFRfSU5TTgotCQkgaW1tZWRpYXRlbHkgYWZ0ZXIgUFJFVl9JTlNOIHdpbGwgY2F1c2UgYSBwaXBlbGluZQotCQkgYnViYmxlLCBzbyB0aGVyZSBpcyBubyByZWFzb24gdG8gbWFrZSB0aGlzIHN3YXAuICAqLwotCSAgICAgIGlmIChwcmV2X29wICE9IE5VTEwKLQkJICAmJiAocHJldl9vcC0+ZmxhZ3MgJiBMT0FEKSAhPSAwCi0JCSAgJiYgc2hfbG9hZF91c2UgKHByZXZfaW5zbiwgcHJldl9vcCwgbmV4dF9pbnNuLCBuZXh0X29wKSkKLQkJb2sgPSBmYWxzZTsKLQotCSAgICAgIC8qIElmIElOU04gaXMgYSBsb2FkLCBhbmQgaXQgc2V0cyBhIHJlZ2lzdGVyIHdoaWNoCi0JCSB0aGUgaW5zbiBhZnRlciBORVhUX0lOU04gdXNlcywgdGhlbiBkb2luZyB0aGUKLQkJIHN3YXAgd2lsbCBjYXVzZSBhIHBpcGVsaW5lIGJ1YmJsZSwgc28gdGhlcmUgaXMgbm8KLQkJIHJlYXNvbiB0byBtYWtlIHRoZSBzd2FwLiAgSG93ZXZlciwgaWYgdGhlIGluc24KLQkJIGFmdGVyIE5FWFRfSU5TTiBpcyBpdHNlbGYgYSBsb2FkIG9yIHN0b3JlCi0JCSBpbnN0cnVjdGlvbiwgdGhlbiBpdCBpcyBtaXNhbGlnbmVkLCBzbwotCQkgb3B0aW1pc3RpY2FsbHkgaG9wZSB0aGF0IGl0IHdpbGwgYmUgc3dhcHBlZAotCQkgaXRzZWxmLCBhbmQganVzdCBsaXZlIHdpdGggdGhlIHBpcGVsaW5lIGJ1YmJsZSBpZgotCQkgaXQgaXNuJ3QuICAqLwotCSAgICAgIGlmIChvawotCQkgICYmIGkgKyA0IDwgc3RvcAotCQkgICYmIChvcC0+ZmxhZ3MgJiBMT0FEKSAhPSAwKQotCQl7Ci0JCSAgdW5zaWduZWQgaW50IG5leHQyX2luc247Ci0JCSAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqbmV4dDJfb3A7Ci0KLQkJICBuZXh0Ml9pbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpICsgNCk7Ci0JCSAgbmV4dDJfb3AgPSBzaF9pbnNuX2luZm8gKG5leHQyX2luc24pOwotCQkgIGlmICgobmV4dDJfb3AtPmZsYWdzICYgKExPQUQgfCBTVE9SRSkpID09IDAKLQkJICAgICAgJiYgc2hfbG9hZF91c2UgKGluc24sIG9wLCBuZXh0Ml9pbnNuLCBuZXh0Ml9vcCkpCi0JCSAgICBvayA9IGZhbHNlOwotCQl9Ci0KLQkgICAgICBpZiAob2spCi0JCXsKLQkJICBpZiAoISAoKnN3YXApIChhYmZkLCBzZWMsIHJlbG9jcywgY29udGVudHMsIGkpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgICpwc3dhcHBlZCA9IHRydWU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgZm9yIGxvYWRzIGFuZCBzdG9yZXMgd2hpY2ggd2UgY2FuIGFsaWduIHRvIGZvdXIgYnl0ZQotICAgYm91bmRhcmllcy4gIFNlZSB0aGUgbG9uZ2VyIGNvbW1lbnQgYWJvdmUgc2hfcmVsYXhfc2VjdGlvbiBmb3Igd2h5Ci0gICB0aGlzIGlzIGRlc2lyYWJsZS4gIFRoaXMgc2V0cyAqUFNXQVBQRUQgaWYgc29tZSBpbnN0cnVjdGlvbiB3YXMKLSAgIHN3YXBwZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfYWxpZ25fbG9hZHMgKGFiZmQsIHNlYywgaW50ZXJuYWxfcmVsb2NzLCBjb250ZW50cywgcHN3YXBwZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYm9vbGVhbiAqcHN3YXBwZWQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF92bWEgKmxhYmVscyA9IE5VTEw7Ci0gIGJmZF92bWEgKmxhYmVsLCAqbGFiZWxfZW5kOwotCi0gICpwc3dhcHBlZCA9IGZhbHNlOwotCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotCi0gIC8qIEdldCBhbGwgdGhlIGFkZHJlc3NlcyB3aXRoIGxhYmVscyBvbiB0aGVtLiAgKi8KLSAgbGFiZWxzID0gKGJmZF92bWEgKikgYmZkX21hbGxvYyAoc2VjLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYmZkX3ZtYSkpOwotICBpZiAobGFiZWxzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGxhYmVsX2VuZCA9IGxhYmVsczsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGlmIChpcmVsLT5yX3R5cGUgPT0gUl9TSF9MQUJFTCkKLQl7Ci0JICAqbGFiZWxfZW5kID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotCSAgKytsYWJlbF9lbmQ7Ci0JfQotICAgIH0KLQotICAvKiBOb3RlIHRoYXQgdGhlIGFzc2VtYmxlciBjdXJyZW50bHkgYWx3YXlzIG91dHB1dHMgcmVsb2NzIGluCi0gICAgIGFkZHJlc3Mgb3JkZXIuICBJZiB0aGF0IGV2ZXIgY2hhbmdlcywgdGhpcyBjb2RlIHdpbGwgbmVlZCB0byBzb3J0Ci0gICAgIHRoZSBsYWJlbCB2YWx1ZXMgYW5kIHRoZSByZWxvY3MuICAqLwotCi0gIGxhYmVsID0gbGFiZWxzOwotCi0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHN0YXJ0LCBzdG9wOwotCi0gICAgICBpZiAoaXJlbC0+cl90eXBlICE9IFJfU0hfQ09ERSkKLQljb250aW51ZTsKLQotICAgICAgc3RhcnQgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0KLSAgICAgIGZvciAoaXJlbCsrOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotCWlmIChpcmVsLT5yX3R5cGUgPT0gUl9TSF9EQVRBKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbCA8IGlyZWxlbmQpCi0Jc3RvcCA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLSAgICAgIGVsc2UKLQlzdG9wID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLSAgICAgIGlmICghIF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuIChhYmZkLCBzZWMsIGNvbnRlbnRzLCBzaF9zd2FwX2luc25zLAotCQkJCSAgICAgKFBUUikgaW50ZXJuYWxfcmVsb2NzLCAmbGFiZWwsCi0JCQkJICAgICBsYWJlbF9lbmQsIHN0YXJ0LCBzdG9wLCBwc3dhcHBlZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGZyZWUgKGxhYmVscyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChsYWJlbHMgIT0gTlVMTCkKLSAgICBmcmVlIChsYWJlbHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFN3YXAgdHdvIFNIIGluc3RydWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9zd2FwX2luc25zIChhYmZkLCBzZWMsIHJlbG9jcywgY29udGVudHMsIGFkZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHJlbG9jczsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzID0gKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSByZWxvY3M7Ci0gIHVuc2lnbmVkIHNob3J0IGkxLCBpMjsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsLCAqaXJlbGVuZDsKLQotICAvKiBTd2FwIHRoZSBpbnN0cnVjdGlvbnMgdGhlbXNlbHZlcy4gICovCi0gIGkxID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBhZGRyKTsKLSAgaTIgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGFkZHIgKyAyKTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgaTIsIGNvbnRlbnRzICsgYWRkcik7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIGkxLCBjb250ZW50cyArIGFkZHIgKyAyKTsKLQotICAvKiBBZGp1c3QgYWxsIHJlbG9jIGFkZHJlc3Nlcy4gICovCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgaW50IHR5cGUsIGFkZDsKLQotICAgICAgLyogVGhlcmUgYXJlIGEgZmV3IHNwZWNpYWwgdHlwZXMgb2YgcmVsb2NzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0bwotICAgICAgICAgYWRqdXN0LiAgVGhlc2UgcmVsb2NzIGRvIG5vdCBhcHBseSB0byB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmLAotICAgICAgICAgYnV0IGFyZSBvbmx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWRkcmVzcy4gICovCi0gICAgICB0eXBlID0gaXJlbC0+cl90eXBlOwotICAgICAgaWYgKHR5cGUgPT0gUl9TSF9BTElHTgotCSAgfHwgdHlwZSA9PSBSX1NIX0NPREUKLQkgIHx8IHR5cGUgPT0gUl9TSF9EQVRBCi0JICB8fCB0eXBlID09IFJfU0hfTEFCRUwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIGFuIFJfU0hfVVNFUyByZWxvYyBwb2ludHMgdG8gb25lIG9mIHRoZSBhZGRyZXNzZXMgYmVpbmcKLSAgICAgICAgIHN3YXBwZWQsIHdlIG11c3QgYWRqdXN0IGl0LiAgSXQgd291bGQgYmUgaW5jb3JyZWN0IHRvIGRvIHRoaXMKLSAgICAgICAgIGZvciBhIGp1bXAsIHRob3VnaCwgc2luY2Ugd2Ugd2FudCB0byBleGVjdXRlIGJvdGgKLSAgICAgICAgIGluc3RydWN0aW9ucyBhZnRlciB0aGUganVtcC4gIChXZSBoYXZlIGF2b2lkZWQgc3dhcHBpbmcKLSAgICAgICAgIGFyb3VuZCBhIGxhYmVsLCBzbyB0aGUganVtcCB3aWxsIG5vdCB3aW5kIHVwIGV4ZWN1dGluZyBhbgotICAgICAgICAgaW5zdHJ1Y3Rpb24gaXQgc2hvdWxkbid0KS4gICovCi0gICAgICBpZiAodHlwZSA9PSBSX1NIX1VTRVMpCi0JewotCSAgYmZkX3ZtYSBvZmY7Ci0KLQkgIG9mZiA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSArIDQgKyBpcmVsLT5yX29mZnNldDsKLQkgIGlmIChvZmYgPT0gYWRkcikKLQkgICAgaXJlbC0+cl9vZmZzZXQgKz0gMjsKLQkgIGVsc2UgaWYgKG9mZiA9PSBhZGRyICsgMikKLQkgICAgaXJlbC0+cl9vZmZzZXQgLT0gMjsKLQl9Ci0KLSAgICAgIGlmIChpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPT0gYWRkcikKLQl7Ci0JICBpcmVsLT5yX3ZhZGRyICs9IDI7Ci0JICBhZGQgPSAtMjsKLQl9Ci0gICAgICBlbHNlIGlmIChpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPT0gYWRkciArIDIpCi0JewotCSAgaXJlbC0+cl92YWRkciAtPSAyOwotCSAgYWRkID0gMjsKLQl9Ci0gICAgICBlbHNlCi0JYWRkID0gMDsKLQotICAgICAgaWYgKGFkZCAhPSAwKQotCXsKLQkgIGJmZF9ieXRlICpsb2M7Ci0JICB1bnNpZ25lZCBzaG9ydCBpbnNuLCBvaW5zbjsKLQkgIGJvb2xlYW4gb3ZlcmZsb3c7Ci0KLQkgIGxvYyA9IGNvbnRlbnRzICsgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotCSAgb3ZlcmZsb3cgPSBmYWxzZTsKLQkgIHN3aXRjaCAodHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9QQ0RJU1A4QlkyOgotCSAgICBjYXNlIFJfU0hfUENSRUxJTU04QlkyOgotCSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBsb2MpOwotCSAgICAgIG9pbnNuID0gaW5zbjsKLQkgICAgICBpbnNuICs9IGFkZCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgbG9jKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfUENESVNQOgotCSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBsb2MpOwotCSAgICAgIG9pbnNuID0gaW5zbjsKLQkgICAgICBpbnNuICs9IGFkZCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZjAwMCkgIT0gKGluc24gJiAweGYwMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgbG9jKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfUENSRUxJTU04Qlk0OgotCSAgICAgIC8qIFRoaXMgcmVsb2MgaWdub3JlcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgMyBiaXRzIG9mCi0gICAgICAgICAgICAgICAgIHRoZSBwcm9ncmFtIGNvdW50ZXIgYmVmb3JlIGFkZGluZyBpbiB0aGUgb2Zmc2V0LgotICAgICAgICAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgaWYgQUREUiBpcyBhdCBhbiBldmVuIGFkZHJlc3MsIHRoZQotICAgICAgICAgICAgICAgICBzd2FwIHdpbGwgbm90IGFmZmVjdCB0aGUgb2Zmc2V0LiAgSWYgQUREUiBpcyBhbiBhdCBhbgotICAgICAgICAgICAgICAgICBvZGQgYWRkcmVzcywgdGhlbiB0aGUgaW5zdHJ1Y3Rpb24gd2lsbCBiZSBjcm9zc2luZyBhCi0gICAgICAgICAgICAgICAgIGZvdXIgYnl0ZSBib3VuZGFyeSwgYW5kIG11c3QgYmUgYWRqdXN0ZWQuICAqLwotCSAgICAgIGlmICgoYWRkciAmIDMpICE9IDApCi0JCXsKLQkJICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgbG9jKTsKLQkJICBvaW5zbiA9IGluc247Ci0JCSAgaW5zbiArPSBhZGQgLyAyOwotCQkgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkJICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBsb2MpOwotCQl9Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAob3ZlcmZsb3cpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgICgiJXM6IDB4JWx4OiBmYXRhbDogcmVsb2Mgb3ZlcmZsb3cgd2hpbGUgcmVsYXhpbmciLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfdmFkZHIpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogVGhpcyBpcyBhIG1vZGlmaWNhdGlvbiBvZiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uLCB3aGljaAotICAgd2lsbCBoYW5kbGUgU0ggcmVsYXhpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJICAgICByZWxvY3MsIHN5bXMsIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgIGJmZF92bWEgYWRkZW5kOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLQotICAgICAgLyogQWxtb3N0IGFsbCByZWxvY3MgaGF2ZSB0byBkbyB3aXRoIHJlbGF4aW5nLiAgSWYgYW55IHdvcmsgbXVzdAotICAgICAgICAgYmUgZG9uZSBmb3IgdGhlbSwgaXQgaGFzIGJlZW4gZG9uZSBpbiBzaF9yZWxheF9zZWN0aW9uLiAgKi8KLSAgICAgIGlmIChyZWwtPnJfdHlwZSAhPSBSX1NIX0lNTTMyCi0JICAmJiByZWwtPnJfdHlwZSAhPSBSX1NIX1BDRElTUCkKLQljb250aW51ZTsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsgICAgCi0JICBpZiAoc3ltbmR4IDwgMAotCSAgICAgIHx8ICh1bnNpZ25lZCBsb25nKSBzeW1uZHggPj0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKCIlczogaWxsZWdhbCBzeW1ib2wgaW5kZXggJWxkIGluIHJlbG9jcyIsCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBzeW1uZHgpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JfQotCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0gICAgICBlbHNlCi0JYWRkZW5kID0gMDsKLQotICAgICAgaWYgKHJlbC0+cl90eXBlID09IFJfU0hfUENESVNQKQotCWFkZGVuZCAtPSA0OwotCi0gICAgICBpZiAocmVsLT5yX3R5cGUgPj0gU0hfQ09GRl9IT1dUT19DT1VOVCkKLQlob3d0byA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaG93dG8gPSAmc2hfY29mZl9ob3d0b3NbcmVsLT5yX3R5cGVdOwotCi0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHZhbCA9IDA7Ci0KLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgLyogVGhlcmUgaXMgbm90aGluZyB0byBkbyBmb3IgYW4gaW50ZXJuYWwgUENESVNQIHJlbG9jLiAgKi8KLQkgIGlmIChyZWwtPnJfdHlwZSA9PSBSX1NIX1BDRElTUCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0gICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlCi0JCSAgICAgLSBzZWMtPnZtYSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsCi0JCQkJCXJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLQkJCQkJdmFsLCBhZGRlbmQpOwotCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UgaWYgKHN5bS0+X24uX25fbi5fbl96ZXJvZXMgPT0gMAotCQkgICAgICYmIHN5bS0+X24uX25fbi5fbl9vZmZzZXQgIT0gMCkKLQkgICAgICBuYW1lID0gb2JqX2NvZmZfc3RyaW5ncyAoaW5wdXRfYmZkKSArIHN5bS0+X24uX25fbi5fbl9vZmZzZXQ7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0gCQlzdHJuY3B5IChidWYsIHN5bS0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotCQlidWZbU1lNTk1MRU5dID0gJ1wwJzsKLQkJbmFtZSA9IGJ1ZjsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICAgd2hpY2ggdXNlcyBzaF9yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF9ieXRlICoKLXNoX2NvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCWRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBiZmQgKmlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqKnNlY3Rpb25zID0gTlVMTDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbnRlcm5hbF9zeW1zID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlbGF4aW5nLCBvciBvZiBoYXZpbmcgYQotICAgICBwYXJ0aWN1bGFyIHNldCBvZiBzZWN0aW9uIGNvbnRlbnRzLCBzcGVjaWFsbHkuICAqLwotICBpZiAocmVsb2NhdGVhYmxlCi0gICAgICB8fCBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSA9PSBOVUxMCi0gICAgICB8fCBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKS0+Y29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJCSAgICAgICByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgbWVtY3B5IChkYXRhLCBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKS0+Y29udGVudHMsCi0JICBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLSAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoaW5wdXRfYmZkKTsKLSAgICAgIGJmZF9ieXRlICplc3ltLCAqZXN5bWVuZDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzeW1wOwotICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLQotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChpbnB1dF9iZmQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0JCQkgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgZmFsc2UsIChiZmRfYnl0ZSAqKSBOVUxMLAotCQkJICBmYWxzZSwgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBOVUxMKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGludGVybmFsX3N5bXMgPSAoKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpCi0JCQkJICAgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQpKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAob2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkKLQkJCQkJICAgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgICAgIGlmIChzZWN0aW9ucyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpc3ltcCA9IGludGVybmFsX3N5bXM7Ci0gICAgICBzZWNwcCA9IHNlY3Rpb25zOwotICAgICAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICAgICAgZXN5bWVuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIHN5bWVzejsKLSAgICAgIHdoaWxlIChlc3ltIDwgZXN5bWVuZCkKLQl7Ci0JICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoaW5wdXRfYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSBpc3ltcCk7Ci0KLQkgIGlmIChpc3ltcC0+bl9zY251bSAhPSAwKQotCSAgICAqc2VjcHAgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGlucHV0X2JmZCwgaXN5bXAtPm5fc2NudW0pOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGlzeW1wLT5uX3ZhbHVlID09IDApCi0JCSpzZWNwcCA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICAgICAgZWxzZQotCQkqc2VjcHAgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgICB9Ci0KLQkgIGVzeW0gKz0gKGlzeW1wLT5uX251bWF1eCArIDEpICogc3ltZXN6OwotCSAgc2VjcHAgKz0gaXN5bXAtPm5fbnVtYXV4ICsgMTsKLQkgIGlzeW1wICs9IGlzeW1wLT5uX251bWF1eCArIDE7Ci0JfQotCi0gICAgICBpZiAoISBzaF9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGlucHV0X2JmZCwKLQkJCQkgaW5wdXRfc2VjdGlvbiwgZGF0YSwgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSBpbnRlcm5hbF9zeW1zLCBzZWN0aW9ucykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGZyZWUgKHNlY3Rpb25zKTsKLSAgICAgIHNlY3Rpb25zID0gTlVMTDsKLSAgICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBUaGUgdGFyZ2V0IHZlY3RvcnMuICAqLwotCi1jb25zdCBiZmRfdGFyZ2V0IHNoY29mZl92ZWMgPQotewotICAiY29mZi1zaCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEJGRF9JU19SRUxBWEFCTEUpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAotICAnXycsCQkJCS8qIGxlYWRpbmcgc3ltYm9sIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl92ZWMgPQotewotICAiY29mZi1zaGwiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSBlbmRpYW4gdG9vKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgQkZEX0lTX1JFTEFYQUJMRSksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCi0gICdfJywJCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sICAgCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgQ09GRl9TV0FQX1RBQkxFLAotfTsKLQotLyogU29tZSBwZW9wbGUgd2FudCB2ZXJzaW9ucyBvZiB0aGUgU0ggQ09GRiB0YXJnZXQgd2hpY2ggZG8gbm90IGFsaWduCi0gICB0byAxNiBieXRlIGJvdW5kYXJpZXMuICBXZSBpbXBsZW1lbnQgdGhhdCBieSBhZGRpbmcgYSBjb3VwbGUgb2YgbmV3Ci0gICB0YXJnZXQgdmVjdG9ycy4gIFRoZXNlIGFyZSBqdXN0IGxpa2UgdGhlIG9uZXMgYWJvdmUsIGJ1dCB0aGV5Ci0gICBjaGFuZ2UgdGhlIGRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQuICBUbyBnZW5lcmF0ZSB0aGVtIGluIHRoZQotICAgYXNzZW1ibGVyLCB1c2UgLXNtYWxsLiAgVG8gdXNlIHRoZW0gaW4gdGhlIGxpbmtlciwgdXNlIC1iCi0gICBjb2ZmLXNoe2x9LXNtYWxsIGFuZCAtb2Zvcm1hdCBjb2ZmLXNoe2x9LXNtYWxsLgotCi0gICBZZXMsIHRoaXMgaXMgYSBob3JyaWJsZSBoYWNrLiAgQSBnZW5lcmFsIHNvbHV0aW9uIGZvciBzZXR0aW5nCi0gICBzZWN0aW9uIGFsaWdubWVudCBpbiBDT0ZGIGlzIHJhdGhlciBjb21wbGV4LiAgRUxGIGhhbmRsZXMgdGhpcwotICAgY29ycmVjdGx5LiAgKi8KLQotLyogT25seSByZWNvZ25pemUgdGhlIHNtYWxsIHZlcnNpb25zIGlmIHRoZSB0YXJnZXQgd2FzIG5vdCBkZWZhdWx0ZWQuCi0gICBPdGhlcndpc2Ugd2Ugd29uJ3QgcmVjb2duaXplIHRoZSBub24gZGVmYXVsdCBlbmRpYW5uZXNzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotY29mZl9zbWFsbF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmV0dXJuIGNvZmZfb2JqZWN0X3AgKGFiZmQpOwotfQotCi0vKiBTZXQgdGhlIHNlY3Rpb24gYWxpZ25tZW50IGZvciB0aGUgc21hbGwgdmVyc2lvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zbWFsbF9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBpZiAoISBjb2ZmX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIHNlY3Rpb24pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXZSBtdXN0IGFsaWduIHRvIGF0IGxlYXN0IGEgZm91ciBieXRlIGJvdW5kYXJ5LCBiZWNhdXNlIGxvbmd3b3JkCi0gICAgIGFjY2Vzc2VzIG11c3QgYmUgb24gYSBmb3VyIGJ5dGUgYm91bmRhcnkuICAqLwotICBpZiAoc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID09IENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUikKLSAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNvcGllZCBmcm9tIGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlIHNvIHRoYXQgd2UgY2FuIGNoYW5nZQotICAgdGhlIGRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2NvZmZfYmFja2VuZF9kYXRhIGJmZF9jb2ZmX3NtYWxsX3N3YXBfdGFibGUgPQotewotICBjb2ZmX3N3YXBfYXV4X2luLCBjb2ZmX3N3YXBfc3ltX2luLCBjb2ZmX3N3YXBfbGluZW5vX2luLAotICBjb2ZmX3N3YXBfYXV4X291dCwgY29mZl9zd2FwX3N5bV9vdXQsCi0gIGNvZmZfc3dhcF9saW5lbm9fb3V0LCBjb2ZmX3N3YXBfcmVsb2Nfb3V0LAotICBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQsIGNvZmZfc3dhcF9hb3V0aGRyX291dCwKLSAgY29mZl9zd2FwX3Njbmhkcl9vdXQsCi0gIEZJTEhTWiwgQU9VVFNaLCBTQ05IU1osIFNZTUVTWiwgQVVYRVNaLCBSRUxTWiwgTElORVNaLAotI2lmZGVmIENPRkZfTE9OR19GSUxFTkFNRVMKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0gIDIsCi0gIGNvZmZfc3dhcF9maWxlaGRyX2luLCBjb2ZmX3N3YXBfYW91dGhkcl9pbiwgY29mZl9zd2FwX3Njbmhkcl9pbiwKLSAgY29mZl9zd2FwX3JlbG9jX2luLCBjb2ZmX2JhZF9mb3JtYXRfaG9vaywgY29mZl9zZXRfYXJjaF9tYWNoX2hvb2ssCi0gIGNvZmZfbWtvYmplY3RfaG9vaywgc3R5cF90b19zZWNfZmxhZ3MsIGNvZmZfc2V0X2FsaWdubWVudF9ob29rLAotICBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSwgc3ltbmFtZV9pbl9kZWJ1Z19ob29rLCBjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2ssCi0gIGNvZmZfcHJpbnRfYXV4LCBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMsIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZSwKLSAgY29mZl9zeW1faXNfZ2xvYmFsLCBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywKLSAgY29mZl9zdGFydF9maW5hbF9saW5rLCBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24sIGNvZmZfcnR5cGVfdG9faG93dG8sCi0gIGNvZmZfYWRqdXN0X3N5bW5keCwgY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sLAotICBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biwgY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLX07Ci0KLSNkZWZpbmUgY29mZl9zbWFsbF9jbG9zZV9hbmRfY2xlYW51cCBcCi0gIGNvZmZfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgY29mZl9zbWFsbF9iZmRfZnJlZV9jYWNoZWRfaW5mbyBcCi0gIGNvZmZfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgY29mZl9zbWFsbF9nZXRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgY29mZl9zbWFsbF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi1jb25zdCBiZmRfdGFyZ2V0IHNoY29mZl9zbWFsbF92ZWMgPQotewotICAiY29mZi1zaC1zbWFsbCIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgQkZEX0lTX1JFTEFYQUJMRSksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCi0gICdfJywJCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfc21hbGxfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmZfc21hbGwpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgJmJmZF9jb2ZmX3NtYWxsX3N3YXBfdGFibGUKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl9zbWFsbF92ZWMgPQotewotICAiY29mZi1zaGwtc21hbGwiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlIGVuZGlhbiB0b28qLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwKLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9zbWFsbF9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwgICAKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZl9zbWFsbCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAmYmZkX2NvZmZfc21hbGxfc3dhcF90YWJsZQotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXNwYXJjLmMgYi9iZmQvY29mZi1zcGFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzJjZjE1Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXNwYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBTcGFyYyBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL3NwYXJjLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0KLSNkZWZpbmUgQkFETUFHKHgpICgoeCkuZl9tYWdpYyAhPSBTUEFSQ01BR0lDICYmICh4KS5mX21hZ2ljICE9IExZTlhDT0ZGTUFHSUMpCi0KLS8qIFRoZSBwYWdlIHNpemUgaXMgYSBndWVzcyBiYXNlZCBvbiBFTEYuICAqLwotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAweDEwMDAwCi0KLWVudW0gcmVsb2NfdHlwZQotICB7Ci0gICAgUl9TUEFSQ19OT05FID0gMCwKLSAgICBSX1NQQVJDXzgsCQlSX1NQQVJDXzE2LAkJUl9TUEFSQ18zMiwgCi0gICAgUl9TUEFSQ19ESVNQOCwJUl9TUEFSQ19ESVNQMTYsCQlSX1NQQVJDX0RJU1AzMiwgCi0gICAgUl9TUEFSQ19XRElTUDMwLAlSX1NQQVJDX1dESVNQMjIsCi0gICAgUl9TUEFSQ19ISTIyLAlSX1NQQVJDXzIyLAotICAgIFJfU1BBUkNfMTMsCQlSX1NQQVJDX0xPMTAsCi0gICAgUl9TUEFSQ19HT1QxMCwJUl9TUEFSQ19HT1QxMywJCVJfU1BBUkNfR09UMjIsCi0gICAgUl9TUEFSQ19QQzEwLAlSX1NQQVJDX1BDMjIsCi0gICAgUl9TUEFSQ19XUExUMzAsCi0gICAgUl9TUEFSQ19DT1BZLAotICAgIFJfU1BBUkNfR0xPQl9EQVQsCVJfU1BBUkNfSk1QX1NMT1QsCi0gICAgUl9TUEFSQ19SRUxBVElWRSwKLSAgICBSX1NQQVJDX1VBMzIsCi0gICAgUl9TUEFSQ19tYXgKLSAgfTsKLQotI2lmIDAKLXN0YXRpYyBDT05TVCBjaGFyICpDT05TVCByZWxvY190eXBlX25hbWVzW10gPQotewotICAiUl9TUEFSQ19OT05FIiwKLSAgIlJfU1BBUkNfOCIsCQkiUl9TUEFSQ18xNiIsCQkiUl9TUEFSQ18zMiIsCi0gICJSX1NQQVJDX0RJU1A4IiwJIlJfU1BBUkNfRElTUDE2IiwJIlJfU1BBUkNfRElTUDMyIiwKLSAgIlJfU1BBUkNfV0RJU1AzMCIsCSJSX1NQQVJDX1dESVNQMjIiLAotICAiUl9TUEFSQ19ISTIyIiwJIlJfU1BBUkNfMjIiLAotICAiUl9TUEFSQ18xMyIsCQkiUl9TUEFSQ19MTzEwIiwKLSAgIlJfU1BBUkNfR09UMTAiLAkiUl9TUEFSQ19HT1QxMyIsCSJSX1NQQVJDX0dPVDIyIiwKLSAgIlJfU1BBUkNfUEMxMCIsCSJSX1NQQVJDX1BDMjIiLAotICAiUl9TUEFSQ19XUExUMzAiLAotICAiUl9TUEFSQ19DT1BZIiwKLSAgIlJfU1BBUkNfR0xPQl9EQVQiLAkiUl9TUEFSQ19KTVBfU0xPVCIsCi0gICJSX1NQQVJDX1JFTEFUSVZFIiwKLSAgIlJfU1BBUkNfVUEzMiIsCi19OwotI2VuZGlmCi0KLS8qIFRoaXMgaXMgc3RvbGVuIHByZXR0eSBkaXJlY3RseSBmcm9tIGVsZi5jLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCQkJYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX2NvZmZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCW91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBjb2ZmX3NwYXJjX2hvd3RvX3RhYmxlW10gPSAKLXsKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfOCwgICAgICAgMCwwLCA4LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ184IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzE2LCAgICAgIDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfMTYiLCAgICAgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18zMiwgICAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDXzMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDgsICAgMCwwLCA4LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19ESVNQOCIsICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AxNiwgIDAsMSwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfRElTUDE2IiwgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMzIsICAwLDIsMzIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0RJU1AzMiIsICBmYWxzZSwwLDB4MDBmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AzMCwgMiwyLDMwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19XRElTUDMwIiwgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMjIsIDIsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfV0RJU1AyMiIsIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISTIyLCAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0hJMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMjIsICAgICAgMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ18yMiIsICAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzEzLCAgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfMTMiLCAgICAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MTzEwLCAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0xPMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTAsICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19HT1QxMCIsICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEzLCAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfR09UMTMiLCAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QyMiwgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0dPVDIyIiwgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMxMCwgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19QQzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMjIsICAgIDAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfUEMyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XUExUMzAsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX1dQTFQzMCIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfQ09QWSwgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19DT1BZIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dMT0JfREFULDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfR0xPQl9EQVQiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19KTVBfU0xPVCwwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0pNUF9TTE9UIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVMQVRJVkUsMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19SRUxBVElWRSIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMzIsICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfVUEzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLX07Ci0KLXN0cnVjdCBjb2ZmX3JlbG9jX21hcCB7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGNvZmZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBjb2ZmX3JlbG9jX21hcCBzcGFyY19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfU1BBUkNfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfU1BBUkNfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfU1BBUkNfOCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NQQVJDX0RJU1A4IH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfU1BBUkNfMzIgfSwgLyogQEAgQXNzdW1lcyAzMiBiaXRzLiAgKi8KLSAgeyBCRkRfUkVMT0NfMzIsIFJfU1BBUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfU1BBUkNfRElTUDMyIH0sCi0gIHsgQkZEX1JFTE9DX0hJMjIsIFJfU1BBUkNfSEkyMiB9LAotICB7IEJGRF9SRUxPQ19MTzEwLCBSX1NQQVJDX0xPMTAsIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLCBSX1NQQVJDX1dESVNQMzAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkMyMiwgUl9TUEFSQ18yMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQzEzLCBSX1NQQVJDXzEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEwLCBSX1NQQVJDX0dPVDEwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEzLCBSX1NQQVJDX0dPVDEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDIyLCBSX1NQQVJDX0dPVDIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1BDMTAsIFJfU1BBUkNfUEMxMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19QQzIyLCBSX1NQQVJDX1BDMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLCBSX1NQQVJDX1dQTFQzMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19DT1BZLCBSX1NQQVJDX0NPUFkgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQsIFJfU1BBUkNfR0xPQl9EQVQgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QsIFJfU1BBUkNfSk1QX1NMT1QgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUsIFJfU1BBUkNfUkVMQVRJVkUgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwgUl9TUEFSQ19XRElTUDIyIH0sCi0gIC8qICB7IEJGRF9SRUxPQ19TUEFSQ19VQTMyLCBSX1NQQVJDX1VBMzIgfSwgbm90IHVzZWQ/PyAqLwotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9zcGFyY19yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHNwYXJjX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBjb2ZmX3JlbG9jX21hcCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3BhcmNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmNvZmZfc3BhcmNfaG93dG9fdGFibGVbKGludCkgc3BhcmNfcmVsb2NfbWFwW2ldLmNvZmZfcmVsb2NfdmFsXTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cAljb2ZmX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwCi0KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIEJGRF9BU1NFUlQgKGRzdC0+cl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9TUEFSQ19tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJmNvZmZfc3BhcmNfaG93dG9fdGFibGVbZHN0LT5yX3R5cGVdOwotfQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGludGVybmFsLCByZWxvY2VudHJ5KSBydHlwZTJob3d0byhpbnRlcm5hbCxyZWxvY2VudHJ5KQotCi0jZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUCWJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQJYmZkX2hfcHV0XzMyCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikgXAotICBjYWNoZV9wdHItPmFkZGVuZCA9IHJlbG9jLnJfb2Zmc2V0OwotCi0vKiBDbGVhciB0aGUgcl9zcGFyZSBmaWVsZCBpbiByZWxvY3MuICAqLwotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLHNyYyxkc3QpIFwKLSAgZG8geyBcCi0gICAgICAgZHN0LT5yX3NwYXJlWzBdID0gMDsgXAotICAgICAgIGRzdC0+cl9zcGFyZVsxXSA9IDA7IFwKLSAgICAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLQotLyogRW5hYmxlIFNwYXJjLXNwZWNpZmljIGhhY2tzIGluIGNvZmZjb2RlLmguICovCi0KLSNkZWZpbmUgQ09GRl9TUEFSQwotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotY29uc3QgYmZkX3RhcmdldAotI2lmZGVmIFRBUkdFVF9TWU0KLSAgVEFSR0VUX1NZTSA9Ci0jZWxzZQotICBzcGFyY2NvZmZfdmVjID0KLSNlbmRpZgotewotI2lmZGVmIFRBUkdFVF9OQU1FCi0gIFRBUkdFVF9OQU1FLAotI2Vsc2UKLSAgImNvZmYtc3BhcmMiLAkJCS8qIG5hbWUgKi8KLSNlbmRpZgotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgQkZEX0VORElBTl9CSUcsCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0vKiBOb3RlIHRoYXQgd2UgYWxsb3cgYW4gb2JqZWN0IGZpbGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvcmUgZmlsZSBhcyB3ZWxsLiAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgY29mZl9vYmplY3RfcH0sCi0gICAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtc3RnbzMyLmMgYi9iZmQvY29mZi1zdGdvMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE3MjRmZS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1zdGdvMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2NCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDM4NiBDT0ZGIGZpbGVzIChnbzMyIHZhcmlhbnQgd2l0aCBhIHN0dWIpLgotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFJvYmVydCBIb2VobmUuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhhbmRsZXMgbm93IGFsc28gc3R1YmJlZCBjb2ZmIGltYWdlcy4gVGhlIHN0dWIgaXMgYSBzbWFsbAotICAgRE9TIGV4ZWN1dGFibGUgcHJvZ3JhbSBiZWZvcmUgdGhlIGNvZmYgaW1hZ2UgdG8gbG9hZCBpdCBpbiBtZW1vcnkKLSAgIGFuZCBleGVjdXRlIGl0LiBUaGlzIGlzIG5lZWRlZCwgYmVjYXVzZSBET1MgY2Fubm90IHJ1biBjb2ZmIGZpbGVzLgotCi0gICBBbGwgdGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgY2FsbGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9ucwotICAgZnJvbSBjb2Zmc3dhcC5oLgotICAgVGhlIG9ubHkgdGhpbmcgd2hhdCB0aGV5IGRvIGlzIHRvIGFkanVzdCB0aGUgaW5mb3JtYXRpb24gc3RvcmVkIGluCi0gICB0aGUgQ09GRiBmaWxlIHdoaWNoIGFyZSBvZmZzZXQgaW50byB0aGUgZmlsZS4KLSAgIFRoaXMgaXMgbmVlZGVkLCBiZWNhdXNlIERKR1BQIHVzZXMgYSB2ZXJ5IHNwZWNpYWwgd2F5IHRvIGxvYWQgYW5kIHJ1bgotICAgdGhlIGNvZmYgaW1hZ2UuIEl0IGxvYWRzIHRoZSBpbWFnZSBpbiBtZW1vcnkgYW5kIGFzc3VtZXMgdGhlbiwgdGhhdCB0aGUKLSAgIGltYWdlIGhhZCBubyBzdHViIGJ5IHVzaW5nIHRoZSBmaWxlcG9pbnRlcnMgYXMgcG9pbnRlcnMgaW4gdGhlIGNvZmYKLSAgIGltYWdlIGFuZCBOT1QgaW4gdGhlIGZpbGUuCi0KLSAgIFRvIGJlIGNvbXBhdGlibGUgd2l0aCBhbnkgZXhpc3RpbmcgZXhlY3V0YWJsZXMgSSBoYXZlIGZpeGVkIHRoaXMKLSAgIGhlcmUgYW5kIE5PVCBpbiB0aGUgREpHUFAgc3RhcnR1cCBjb2RlLgotICovCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQkJZ28zMnN0dWJiZWRjb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkJImNvZmYtZ28zMi1leGUiCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFCSdfJwotI2RlZmluZSBDT0ZGX0dPMzJfRVhFCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotLyogQXQgZmlyc3QgdGhlIHByb3RvdHlwZXMgKi8KLQotc3RhdGljIHZvaWQKLWFkanVzdF9maWxlaGRyX2luX3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIHNyYywgUFRSIGRzdCkpOwotc3RhdGljIHZvaWQKLWFkanVzdF9maWxlaGRyX291dF9wcmUgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGluLCBQVFIgb3V0KSk7Ci1zdGF0aWMgdm9pZAotYWRqdXN0X2ZpbGVoZHJfb3V0X3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGluLCBQVFIgb3V0KSk7Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc2NuaGRyX2luX3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGV4dCwgUFRSIGluKSk7Ci1zdGF0aWMgdm9pZAotYWRqdXN0X3Njbmhkcl9vdXRfcHJlIFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBpbiwgUFRSIG91dCkpOwotc3RhdGljIHZvaWQKLWFkanVzdF9zY25oZHJfb3V0X3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGluLCBQVFIgb3V0KSk7Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X2luX3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGV4dDEsIGludCB0eXBlLCBpbnQgY2xhc3MsIGludCBpbmR4LAotCQkJICAgIGludCBudW1hdXgsIFBUUiBpbjEpKTsKLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X291dF9wcmUgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGlucCwgaW50IHR5cGUsIGludCBjbGFzcywgaW50IGluZHgsCi0JCQkgICAgaW50IG51bWF1eCwgUFRSIGV4dHApKTsKLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X291dF9wb3N0IFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBpbnAsIGludCB0eXBlLCBpbnQgY2xhc3MsIGludCBpbmR4LAotCQkJICAgICBpbnQgbnVtYXV4LCBQVFIgZXh0cCkpOwotCi1zdGF0aWMgdm9pZAotY3JlYXRlX2dvMzJfc3R1YiBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci0KLS8qCi0gICBBbGwgdGhhdCAuLi5fUFJFIGFuZCAuLi5QT1NUIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcKLSAgIGNvZmZfc3dhcC4uLiBmdW5jdGlvbnMuIFRoZSAuLi5QUkUgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZwotICAgb2YgdGhlIGZ1bmN0aW9uIGFuZCB0aGUgLi4uUE9TVCBmdW5jdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgc3dhcCByb3V0aW5lcy4KLSAqLwotCi0jZGVmaW5lIENPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUE9TVCBhZGp1c3RfZmlsZWhkcl9pbl9wb3N0Ci0jZGVmaW5lIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BSRSBhZGp1c3RfZmlsZWhkcl9vdXRfcHJlCi0jZGVmaW5lIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BPU1QgYWRqdXN0X2ZpbGVoZHJfb3V0X3Bvc3QKLQotI2RlZmluZSBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVCBhZGp1c3Rfc2NuaGRyX2luX3Bvc3QKLSNkZWZpbmUgQ09GRl9BREpVU1RfU0NOSERSX09VVF9QUkUgYWRqdXN0X3Njbmhkcl9vdXRfcHJlCi0jZGVmaW5lIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUE9TVCBhZGp1c3Rfc2NuaGRyX291dF9wb3N0Ci0KLSNkZWZpbmUgQ09GRl9BREpVU1RfQVVYX0lOX1BPU1QgYWRqdXN0X2F1eF9pbl9wb3N0Ci0jZGVmaW5lIENPRkZfQURKVVNUX0FVWF9PVVRfUFJFIGFkanVzdF9hdXhfb3V0X3ByZQotI2RlZmluZSBDT0ZGX0FESlVTVF9BVVhfT1VUX1BPU1QgYWRqdXN0X2F1eF9vdXRfcG9zdAotCi1zdGF0aWMgYm9vbGVhbgotICBnbzMyX3N0dWJiZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqIGliZmQsIGJmZCAqIG9iZmQpKTsKLQotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgZ28zMl9zdHViYmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotCi0jaW5jbHVkZSAiY29mZi1pMzg2LmMiCi0KLS8qIEkgaG9sZCBpbiB0aGUgdXNyZGF0YSB0aGUgc3R1YiAqLwotI2RlZmluZSBiZmRfY29mZl9nbzMyc3R1YiBiZmRfdXNyZGF0YQotCi0vKiBUaGlzIG1hY3JvIGlzIHVzZWQsIGJlY2F1c2UgSSBjYW5ub3QgYXNzdW1lIHRoZSBlbmRpYW5lc3Mgb2YgdGhlCi0gICBob3N0IHN5c3RlbSAqLwotI2RlZmluZSBfSChpbmRleCkgKGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikoaGVhZGVyK2luZGV4KjIpKSkKLQotLyogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGJmZCBpcyBhIHN0dWJiZWQgY29mZiBpbWFnZSAqLwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotZ28zMl9zdHViYmVkX2NvZmZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgY2hhciBoZWFkZXJbMTBdOwotICBjaGFyIG1hZ2ljWzhdOwotICB1bnNpZ25lZCBsb25nIGNvZmZfc3RhcnQsIGV4ZV9zdGFydDsKLQotICBpZiAoYmZkX3JlYWQgKCZoZWFkZXIsIDEsIHNpemVvZiAoaGVhZGVyKSwgYWJmZCkgIT0gc2l6ZW9mIChoZWFkZXIpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKF9IICgwKSAhPSAweDVhNGQpCQkvKiBpdCBpcyBub3QgYW4gZXhlIGZpbGUuIG1heWJlIGEgY29mZi1pbWFnZSAqLwotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgY29mZl9zdGFydCA9IChsb25nKSBfSCAoMikgKiA1MTJMOwotICBpZiAoX0ggKDEpKQotICAgIGNvZmZfc3RhcnQgKz0gKGxvbmcpIF9IICgxKSAtIDUxMkw7Ci0KLSAgLyogV2UgY2FuIGhhbmRsZSBvbmx5IGEgc3R1YiB3aXRoIGEgbGVuZ3RoIG9mIFNUVUJTSVpFICovCi0gIGlmIChjb2ZmX3N0YXJ0ICE9IFNUVUJTSVpFKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBleGVfc3RhcnQgPSBfSCAoNCkgKiAxNjsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBleGVfc3RhcnQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiAwOwotICBpZiAoYmZkX3JlYWQgKCZtYWdpYywgMSwgOCwgYWJmZCkgIT0gOCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChtZW1jbXAgKG1hZ2ljLCAiZ28zMnN0dWIiLCA4KSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiAwOwotCi0gIC8qIENhbGwgdGhlIG5vcm1hbCBDT0ZGIGRldGVjdGlvbiByb3V0aW5lICovCi0gIHJldHVybiBjb2ZmX29iamVjdF9wIChhYmZkKTsKLX0KLQotLyogVGhlc2UgYnl0ZXMgYXJlIGEgMjA0OC1ieXRlIERPUyBleGVjdXRhYmxlLCB3aGljaCBsb2FkcyB0aGUgQ09GRgotICAgaW1hZ2UgaW50byBtZW1vcnkgYW5kIHRoZW4gcnVucyBpdC4gSXQgaXMgY2FsbGVkICdzdHViJyAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzdHViX2J5dGVzW1NUVUJTSVpFXSA9Ci17Ci0jaW5jbHVkZSAiZ28zMnN0dWIuaCIKLX07Ci0KLS8qCi0gICBJIGhhdmUgbm90IGNvbW1lbnRlZCBlYWNoIHN3YXAgZnVuY3Rpb24gYmVsb3csIGJlY2F1c2UgdGhlCi0gICB0ZWNobmlxdWUgaXMgaW4gYW55IGZ1bmN0aW9uIHRoZSBzYW1lLiBGb3IgdGhlIC4uLmluIGZ1bmN0aW9uLAotICAgYWxsIHRoZSBwb2ludGVycyBhcmUgYWRqdXN0ZWQgYnkgYWRkaW5nIFNUVUJTSVpFIGFuZCBmb3IgdGhlCi0gICAuLi5vdXQgZnVuY3Rpb24sIGl0IGlzIHN1YnRyYWN0ZWQgZmlyc3QgYW5kIGFmdGVyIGNhbGxpbmcgdGhlCi0gICBzdGFuZGFyZCBzd2FwIGZ1bmN0aW9uIGl0IGlzIHJlc2V0IHRvIHRoZSBvbGQgdmFsdWUgKi8KLQotLyogVGhpcyBtYWNybyBpcyB1c2VkIGZvciBhZGp1c3RpbmcgdGhlIGZpbGVwb2ludGVycywgd2hpY2gKLSAgIGlzIGRvbmUgb25seSwgaWYgdGhlIHBvaW50ZXIgaXMgbm9uemVybyAqLwotCi0jZGVmaW5lIEFESlVTVF9WQUwodmFsLGRpZmYpIFwKLSAgaWYgKHZhbCAhPSAwKSB2YWwgKz0gZGlmZgotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2ZpbGVoZHJfaW5fcG9zdCAgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBzcmM7Ci0gICAgIFBUUiBkc3Q7Ci17Ci0gIEZJTEhEUiAqZmlsZWhkcl9zcmMgPSAoRklMSERSICopIHNyYzsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGRzdDsKLQotICBBREpVU1RfVkFMIChmaWxlaGRyX2RzdC0+Zl9zeW1wdHIsIFNUVUJTSVpFKTsKLQotICAvKiBTYXZlIG5vdyB0aGUgc3R1YiB0byBiZSB1c2VkIGxhdGVyICovCi0gIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgU1RVQlNJWkUpOwotCi0gIC8qIFNpbmNlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBubyBzdGF0dXMsIEkgZG8gbm90IHNldCBoZXJlCi0gICAgIGFueSBiZmRfZXJyb3JfLi4uCi0gICAgIFRoYXQgbWVhbnMsIGJlZm9yZSB0aGUgdXNlIG9mIGJmZF9jb2ZmX2dvMzJzdHViICgpLCB0aGlzIHZhbHVlCi0gICAgIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzICE9IE5VTEwgKi8KLSAgaWYgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgbWVtY3B5IChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCksIGZpbGVoZHJfc3JjLT5zdHViLCBTVFVCU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfZmlsZWhkcl9vdXRfcHJlICAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgaW47Ci0gICAgIFBUUiBvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2luID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGluOwotICBGSUxIRFIgKmZpbGVoZHJfb3V0ID0gKEZJTEhEUiAqKSBvdXQ7Ci0KLSAgLyogR2VuZXJhdGUgdGhlIHN0dWIgKi8KLSAgY3JlYXRlX2dvMzJfc3R1YiAoYWJmZCk7Ci0KLSAgLyogQ29weSB0aGUgc3R1YiB0byB0aGUgZmlsZSBoZWFkZXIgKi8KLSAgaWYgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSAhPSBOVUxMKQotICAgIG1lbWNweSAoZmlsZWhkcl9vdXQtPnN0dWIsIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSwgU1RVQlNJWkUpOwotICBlbHNlCi0gICAgLyogdXNlIHRoZSBkZWZhdWx0ICovCi0gICAgbWVtY3B5IChmaWxlaGRyX291dC0+c3R1Yiwgc3R1Yl9ieXRlcywgU1RVQlNJWkUpOwotCi0gIEFESlVTVF9WQUwgKGZpbGVoZHJfaW4tPmZfc3ltcHRyLCAtU1RVQlNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2ZpbGVoZHJfb3V0X3Bvc3QgIChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBpbjsKLSAgICAgUFRSIG91dDsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgaW47Ci0gIC8qIHVuZG8gdGhlIGFib3ZlIGNoYW5nZSAqLwotICBBREpVU1RfVkFMIChmaWxlaGRyX2luLT5mX3N5bXB0ciwgU1RVQlNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3Njbmhkcl9pbl9wb3N0ICAoYWJmZCwgZXh0LCBpbikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0OwotICAgICBQVFIgaW47Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnNjbmhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBpbjsKLQotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX3NjbnB0ciwgU1RVQlNJWkUpOwotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX3JlbHB0ciwgU1RVQlNJWkUpOwotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX2xubm9wdHIsIFNUVUJTSVpFKTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9zY25oZHJfb3V0X3ByZSAgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGluOwotICAgICBQVFIgb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaW47Ci0KLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19zY25wdHIsIC1TVFVCU0laRSk7Ci0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfcmVscHRyLCAtU1RVQlNJWkUpOwotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX2xubm9wdHIsIC1TVFVCU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc2NuaGRyX291dF9wb3N0IChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBpbjsKLSAgICAgUFRSIG91dDsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGluOwotCi0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfc2NucHRyLCBTVFVCU0laRSk7Ci0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfcmVscHRyLCBTVFVCU0laRSk7Ci0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfbG5ub3B0ciwgU1RVQlNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2F1eF9pbl9wb3N0ICAoYWJmZCwgZXh0MSwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgaW4xKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHQxOwotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IGNsYXNzOwotICAgICBpbnQgaW5keDsKLSAgICAgaW50IG51bWF1eDsKLSAgICAgUFRSIGluMTsKLXsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikgaW4xOwotCi0gIGlmIChjbGFzcyA9PSBDX0JMT0NLIHx8IGNsYXNzID09IENfRkNOIHx8IElTRkNOICh0eXBlKSB8fCBJU1RBRyAoY2xhc3MpKQotICAgIHsKLSAgICAgIEFESlVTVF9WQUwgKGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsIFNUVUJTSVpFKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X291dF9wcmUgIChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGlucDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGludCBjbGFzczsKLSAgICAgaW50IGluZHg7Ci0gICAgIGludCBudW1hdXg7Ci0gICAgIFBUUiBleHRwOwotewotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKSBpbnA7Ci0KLSAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCi0gICAgewotICAgICAgQURKVVNUX1ZBTCAoaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwgLVNUVUJTSVpFKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X291dF9wb3N0IChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGlucDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGludCBjbGFzczsKLSAgICAgaW50IGluZHg7Ci0gICAgIGludCBudW1hdXg7Ci0gICAgIFBUUiBleHRwOwotewotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKSBpbnA7Ci0KLSAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCi0gICAgewotICAgICAgQURKVVNUX1ZBTCAoaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwgU1RVQlNJWkUpOwotICAgIH0KLX0KLQotLyoKLSAgIFRoYXQncyB0aGUgZnVuY3Rpb24sIHdoaWNoIGNyZWF0ZXMgdGhlIHN0dWIuIFRoZXJlIGFyZQotICAgZGlmZmVyZW50IGNhc2VzIGZyb20gd2hlcmUgdGhlIHN0dWIgaXMgdGFrZW4uCi0gICBBdCBmaXJzdCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJChHTzMyU1RVQikgaXMgY2hlY2tlZCBhbmQgdGhlbgotICAgJChTVFVCKSBpZiBpdCB3YXMgbm90IHNldC4KLSAgIElmIGl0IGV4aXN0cyBhbmQgcG9pbnRzIHRvIGEgdmFsaWQgc3R1YiB0aGUgc3R1YiBpcyB0YWtlbiBmcm9tCi0gICB0aGF0IGZpbGUuIFRoaXMgZmlsZSBjYW4gYmUgYWxzbyBhIHdob2xlIGV4ZWN1dGFibGUgZmlsZSwgYmVjYXVzZQotICAgdGhlIHN0dWIgaXMgY29tcHV0ZWQgZnJvbSB0aGUgZXhlIGluZm9ybWF0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGF0Ci0gICBmaWxlLgotCi0gICBJZiB0aGVyZSB3YXMgYW55IGVycm9yLCB0aGUgc3RhbmRhcmQgc3R1YiAoY29tcGlsZWQgaW4gdGhpcyBmaWxlKQotICAgaXMgdGFrZW4uCi0gKi8KLQotc3RhdGljIHZvaWQKLWNyZWF0ZV9nbzMyX3N0dWIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogRG8gaXQgb25seSBvbmNlICovCi0gIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpzdHViOwotICAgICAgc3RydWN0IHN0YXQgc3Q7Ci0gICAgICBpbnQgZjsKLSAgICAgIHVuc2lnbmVkIGNoYXIgaGVhZGVyWzEwXTsKLSAgICAgIGNoYXIgbWFnaWNbOF07Ci0gICAgICB1bnNpZ25lZCBsb25nIGNvZmZfc3RhcnQsIGV4ZV9zdGFydDsKLQotICAgICAgLyogQ2hlY2sgYXQgZmlyc3QgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICQoR08zMlNUVUIpICovCi0gICAgICBzdHViID0gZ2V0ZW52ICgiR08zMlNUVUIiKTsKLSAgICAgIC8qIE5vdyBjaGVjayB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJChTVFVCKSAqLwotICAgICAgaWYgKHN0dWIgPT0gTlVMTCkKLQlzdHViID0gZ2V0ZW52ICgiU1RVQiIpOwotICAgICAgaWYgKHN0dWIgPT0gTlVMTCkKLQlnb3RvIHN0dWJfZW5kOwotICAgICAgaWYgKHN0YXQgKHN0dWIsICZzdCkgIT0gMCkKLQlnb3RvIHN0dWJfZW5kOwotI2lmZGVmIE9fQklOQVJZCi0gICAgICBmID0gb3BlbiAoc3R1YiwgT19SRE9OTFkgfCBPX0JJTkFSWSk7Ci0jZWxzZQotICAgICAgZiA9IG9wZW4gKHN0dWIsIE9fUkRPTkxZKTsKLSNlbmRpZgotICAgICAgaWYgKGYgPCAwKQotCWdvdG8gc3R1Yl9lbmQ7Ci0gICAgICBpZiAocmVhZCAoZiwgJmhlYWRlciwgc2l6ZW9mIChoZWFkZXIpKSA8IDApCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICBpZiAoX0ggKDApICE9IDB4NWE0ZCkJLyogaXQgaXMgbm90IGFuIGV4ZSBmaWxlICovCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICAvKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBzdHViIChpdCBpcyBldmVyeSB0aGluZyB1cAotICAgICAgICAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29mZiBpbWFnZSkgKi8KLSAgICAgIGNvZmZfc3RhcnQgPSAobG9uZykgX0ggKDIpICogNTEyTDsKLSAgICAgIGlmIChfSCAoMSkpCi0JY29mZl9zdGFydCArPSAobG9uZykgX0ggKDEpIC0gNTEyTDsKLQotICAgICAgLyogQ3VycmVudGx5IHRoZXJlIGlzIG9ubHkgYSBmaXhlZCBzdHViIHNpemUgb2YgMjA0OCBieXRlcwotICAgICAgICAgc3VwcG9ydGVkICovCi0gICAgICBpZiAoY29mZl9zdGFydCAhPSAyMDQ4KQotCXsKLQkgIGNsb3NlIChmKTsKLQkgIGdvdG8gc3R1Yl9lbmQ7Ci0JfQotICAgICAgZXhlX3N0YXJ0ID0gX0ggKDQpICogMTY7Ci0gICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGxzZWVrIChmLCBleGVfc3RhcnQsIFNFRUtfU0VUKSAhPSBleGVfc3RhcnQpCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICBpZiAocmVhZCAoZiwgJm1hZ2ljLCA4KSAhPSA4KQotCXsKLQkgIGNsb3NlIChmKTsKLQkgIGdvdG8gc3R1Yl9lbmQ7Ci0JfQotICAgICAgaWYgKG1lbWNtcCAobWFnaWMsICJnbzMyc3R1YiIsIDgpICE9IDApCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICAvKiBOb3cgd2UgZm91bmQgYSBjb3JyZWN0IHN0dWIgKGhvcGVmdWxseSkgKi8KLSAgICAgIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgY29mZl9zdGFydCk7Ci0gICAgICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID09IE5VTEwpCi0JewotCSAgY2xvc2UgKGYpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGxzZWVrIChmLCAwTCwgU0VFS19TRVQpOwotICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSByZWFkIChmLCBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCksIGNvZmZfc3RhcnQpCi0JICAhPSBjb2ZmX3N0YXJ0KQotCXsKLQkgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkpOwotCSAgYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID0gTlVMTDsKLQl9Ci0gICAgICBjbG9zZSAoZik7Ci0gICAgfQotc3R1Yl9lbmQ6Ci0gIC8qIFRoZXJlIHdhcyBzb21ldGhpbmcgd3JvbmcgYWJvdmUsIHNvIHVzZSBub3cgdGhlIHN0YW5kYXJkIGJ1aWx0aW4KLSAgICAgc3R1YiAqLwotICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBTVFVCU0laRSk7Ci0gICAgICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID09IE5VTEwpCi0JewotCSAgcmV0dXJuOwotCX0KLQotICAgICAgbWVtY3B5IChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCksIHN0dWJfYnl0ZXMsIFNUVUJTSVpFKTsKLSAgICB9Ci19Ci0KLS8qIElmIGliZmQgd2FzIGEgc3R1YmJlZCBjb2ZmIGltYWdlLCBjb3B5IHRoZSBzdHViIGZyb20gdGhhdCBiZmQKLSAgIHRvIHRoZSBuZXcgb2JmZC4KLSAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ28zMl9zdHViYmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICAvKiBjaGVjayBpZiBib3RoIGFyZSB0aGUgc2FtZSB0YXJnZXRzICovCi0gIGlmIChpYmZkLT54dmVjICE9IG9iZmQtPnh2ZWMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogY2hlY2sgaWYgYm90aCBoYXZlIGEgdmFsaWQgc3R1YiAqLwotICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGliZmQpID09IE5VTEwKLSAgICAgIHx8IGJmZF9jb2ZmX2dvMzJzdHViIChvYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE5vdyBjb3B5IHRoZSBzdHViICovCi0gIG1lbWNweSAoYmZkX2NvZmZfZ28zMnN0dWIgKG9iZmQpLCBiZmRfY29mZl9nbzMyc3R1YiAoaWJmZCksIFNUVUJTSVpFKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXN2bTY4ay5jIGIvYmZkL2NvZmYtc3ZtNjhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMmE1YTcuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtc3ZtNjhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE1vdG9yb2xhIHN5c3Y2OAotICAgQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBpbmZvLnVjbC5hYy5iZT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfU1lNCW02OGtzeXN2Y29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtbTY4ay1zeXN2IgotI2RlZmluZSBTVEFUSUNfUkVMT0NTCi0jZGVmaW5lIENPRkZfQ09NTU9OX0FEREVORAotCi0jaW5jbHVkZSAiY29mZi1tNjhrLmMiCmRpZmYgLS1naXQgYS9iZmQvY29mZi10aWMzMC5jIGIvYmZkL2NvZmYtdGljMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmOGM1OS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi10aWMzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgVE1TMzIwQzMwIGNvZmYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImNvZmYvdGljMzAuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMSkKLQotcmVsb2NfaG93dG9fdHlwZSB0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlW10gPQotewotICBIT1dUTyAoUl9USUMzMF9BQlMxNiwgMiwgMSwgMTYsIGZhbHNlLCAwLCAwLCBOVUxMLAotCSAiMTYiLCBmYWxzZSwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRiwgZmFsc2UpLAotICBIT1dUTyAoUl9USUMzMF9BQlMyNCwgMiwgMiwgMjQsIGZhbHNlLCA4LCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgTlVMTCwKLQkgIjI0IiwgZmFsc2UsIDB4RkZGRkZGMDAsIDB4RkZGRkZGMDAsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVElDMzBfTERQLCAxOCwgMCwgMjQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgTlVMTCwKLQkgIkxEUCIsIGZhbHNlLCAweDAwRkYwMDAwLCAweDAwMDAwMEZGLCBmYWxzZSksCi0gIEhPV1RPIChSX1RJQzMwX0FCUzMyLCAyLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBOVUxMLAotCSAiMzIiLCBmYWxzZSwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgZmFsc2UpLAotICBIT1dUTyAoUl9USUMzMF9QQzE2LCAyLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBOVUxMLAotCSAiUENSRUwiLCBmYWxzZSwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRiwgZmFsc2UpLAotICB7LTF9Ci19OwotCi0jaWZuZGVmIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIHRpYzMwX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogRm9yIHRoZSBjYXNlIHN0YXRlbWVudCB1c2UgdGhlIGNvZGUgdmFsdWVzIHVzZWQgaW4gdGNfZ2VuX3JlbG9jIHRvCi0gICBtYXAgdG8gdGhlIGhvd3RvIHRhYmxlIGVudHJpZXMgdGhhdCBtYXRjaCB0aG9zZSBpbiBib3RoIHRoZSBhb3V0Ci0gICBhbmQgY29mZiBpbXBsZW1lbnRhdGlvbnMuICovCi1yZWxvY19ob3d0b190eXBlICoKLXRpYzMwX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICBjYXNlIEJGRF9SRUxPQ19USUMzMF9MRFA6Ci0gICAgICByZXR1cm4gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbMl07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICByZXR1cm4gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbMF07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjQ6Ci0gICAgICByZXR1cm4gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbMV07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6Ci0gICAgICByZXR1cm4gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbNF07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICByZXR1cm4gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbM107Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgIH0KLX0KLQotI2VuZGlmCi0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCi0KLXN0YXRpYyBpbnQKLWNvZmZfdGljMzBfc2VsZWN0X3JlbG9jIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiBob3d0by0+dHlwZTsKLX0KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeC5yX3R5cGUgPSBjb2ZmX3RpYzMwX3NlbGVjdF9yZWxvYyhob3d0bykKLQotCi0jZGVmaW5lIEJBRE1BRyh4KSBUSUMzMEJBRE1BRyh4KQotI2RlZmluZSBUSUMzMCAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0KLS8qIENvZGUgdG8gc3dhcCBpbiB0aGUgcmVsb2MgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBkc3QtPnJfc3R1ZmZbMF0gPSAnUyc7IFwKLWRzdC0+cl9zdHVmZlsxXSA9ICdDJzsKLQotLyogQ29kZSB0byB0dXJuIGEgcl90eXBlIGludG8gYSBob3d0byBwdHIsIHVzZXMgdGhlIGFib3ZlIGhvd3RvIHRhYmxlLiAqLwotCi1zdGF0aWMgdm9pZAotcnR5cGUyaG93dG8gKGludGVybmFsLCBkc3QpCi0gICAgIGFyZWxlbnQgKmludGVybmFsOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKLXsKLSAgc3dpdGNoIChkc3QtPnJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1RJQzMwX0FCUzE2OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbMF07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVElDMzBfQUJTMjQ6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmdGljMzBfY29mZl9ob3d0b190YWJsZVsxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9USUMzMF9BQlMzMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzNdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1RJQzMwX0xEUDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzJdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1RJQzMwX1BDMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmdGljMzBfY29mZl9ob3d0b190YWJsZVs0XTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKLQotLyogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IG1hZ2ljIHRvIHRoZSBhZGRlbmQgaW4gYSByZWxvYyBlbnRyeSAqLwotCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHN5bWJvbCwgZXh0X3JlbG9jLCBjYWNoZV9wdHIpIFwKLSBjYWNoZV9wdHItPmFkZGVuZCA9ICBleHRfcmVsb2Mucl9vZmZzZXQ7Ci0KLQotI2RlZmluZSBSRUxPQ19QUk9DRVNTSU5HKHJlbGVudCxyZWxvYyxzeW1ib2xzLGFiZmQsc2VjdGlvbikgXAotIHJlbG9jX3Byb2Nlc3NpbmcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLQotc3RhdGljIHZvaWQKLXJlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKnJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwotICBydHlwZTJob3d0byAocmVsZW50LCByZWxvYyk7Ci0KLSAgaWYgKHJlbG9jLT5yX3N5bW5keCA+IDApCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBvYmpfY29udmVydCAoYWJmZClbcmVsb2MtPnJfc3ltbmR4XTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotICByZWxlbnQtPmFkZGVuZCA9IHJlbG9jLT5yX29mZnNldDsKLSAgcmVsZW50LT5hZGRyZXNzIC09IHNlY3Rpb24tPnZtYTsKLX0KLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLWNvbnN0IGJmZF90YXJnZXQgdGljMzBfY29mZl92ZWMgPQotewotICAiY29mZi10aWMzMCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi10aWM4MC5jIGIvYmZkL2NvZmYtdGljODAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzYzhhMC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi10aWM4MC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzU5ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzgwIE11bHRpbWVkaWEgVmlkZW8gUHJvY2Vzc29yIChNVlApLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIChmbmZAY3lnbnVzLmNvbSkKLQotICAgVGhlcmUgaXMgbm90aGluZyBuZXcgdW5kZXIgdGhlIHN1bi4gVGhpcyBmaWxlIGRyYXdzIGEgbG90IG9uIG90aGVyCi0gICBjb2ZmIGZpbGVzLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvdGljODAuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKLSNkZWZpbmUgQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUiAxCi0jZGVmaW5lIENPRkZfQUxJR05fSU5fU0ZMQUdTIDEKLQotI2RlZmluZSBHRVRfU0NOSERSX0ZMQUdTIGJmZF9oX2dldF8xNgotI2RlZmluZSBQVVRfU0NOSERSX0ZMQUdTIGJmZF9oX3B1dF8xNgotCi1zdGF0aWMgdm9pZCBydHlwZTJob3d0bwotICBQQVJBTVMgKChhcmVsZW50ICpjYWNoZV9wdHIsIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0KSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwYmFzZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZ2xvYjE1X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBnbG9iMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGxvY2FsMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3RpYzgwX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHRpYzgwX2hvd3RvX3RhYmxlW10gPQotewotCi0gIEhPV1RPIChSX1JFTExPTkcsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUxMT05HIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01QUENSLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTVBQQ1IiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQUJTLAkJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkFCUyIsCQkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQQkFTRSwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBiYXNlX3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQQkFTRSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUExCQVNFLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGJhc2VfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMQkFTRSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUDE1LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFAxNSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUDE1VywJCQkvKiB0eXBlICovCi0JIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZ2xvYjE1X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQMTVXIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmMwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmYzAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQMTVILAkJCS8qIHR5cGUgKi8KLQkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFAxNUgiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MWZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFAxNkIsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNl9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUDE2QiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUEwxNSwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMMTUiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2ZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTDE1VywJCQkvKiB0eXBlICovCi0JIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMMTVXIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUEwxNUgsCQkJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTDE1SCIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMMTZCLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBsb2NhbDE2X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTDE2QiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBOMTUsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBOMTUiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MWZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBOMTVXLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZ2xvYjE1X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTjE1VyIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUE4xNUgsCQkJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBOMTVIIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmMwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmYzAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTjE2QiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNl9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUE4xNkIiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMTjE1LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMTjE1IiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUExOMTVXLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMTjE1VyIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMTjE1SCwJCQkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTE4xNUgiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2ZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTE4xNkIsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBsb2NhbDE2X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTE4xNkIiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpCQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQwKLS8qIFNwZWNpYWwgcmVsb2NhdGlvbiBmdW5jdGlvbnMsIHVzZWQgd2hlbiB0aGUgb3V0cHV0IGZpbGUgaXMgbm90Ci0gICBpdHNlbGYgYSBDT0ZGIFRJYzgwIGZpbGUuICAqLwotCi0vKiBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGJhc2UgYWRkcmVzcyB0eXBlCi0gICByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwYmFzZV9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogRklYTUUuICAqLwotICBhYm9ydCAoKTsKLX0KLQotLyogVGhpcyBzcGVjaWFsIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHRoZSBnbG9iYWwgMTUgYml0IHJlbG9jYXRpb25zLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZ2xvYjE1X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiBGSVhNRS4gICovCi0gIGFib3J0ICgpOwotfQotCi0vKiBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGdsb2JhbCAxNiBiaXQgcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1nbG9iMTZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIEZJWE1FLiAgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgbG9jYWwgMTYgYml0IHJlbG9jYXRpb25zLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbG9jYWwxNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogRklYTUUuICAqLwotICBhYm9ydCAoKTsKLX0KLQwKLS8qIENvZGUgdG8gdHVybiBhbiBleHRlcm5hbCByX3R5cGUgaW50byBhIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIGhvd3RvX3RhYmxlLgotICAgSWYgcGFzc2VkIGFuIHJfdHlwZSB3ZSBkb24ndCByZWNvZ25pemUgdGhlIGFib3J0IHJhdGhlciB0aGFuIHNpbGVudGx5IGZhaWxpbmcKLSAgIHRvIGdlbmVyYXRlIGFuIG91dHB1dCBmaWxlLiAqLwotCi1zdGF0aWMgdm9pZAotcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIHRpYzgwX2hvd3RvX3RhYmxlIC8gc2l6ZW9mIHRpYzgwX2hvd3RvX3RhYmxlWzBdOyBpKyspCi0gICAgewotICAgICAgaWYgKHRpYzgwX2hvd3RvX3RhYmxlW2ldLnR5cGUgPT0gZHN0LT5yX3R5cGUpCi0JewotCSAgY2FjaGVfcHRyLT5ob3d0byA9IHRpYzgwX2hvd3RvX3RhYmxlICsgaTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVW5yZWNvZ25pemVkIHJlbG9jIHR5cGUgMHgleCIpLAotCQkJICh1bnNpZ25lZCBpbnQpIGRzdC0+cl90eXBlKTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9IHRpYzgwX2hvd3RvX3RhYmxlICsgMDsKLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIGNvZmZfdGljODBfcnR5cGVfdG9faG93dG8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl90aWM4MF9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0gIGFyZWxlbnQgZ2VucmVsOwotCi0gIGlmIChyZWwgLT4gcl9zeW1uZHggPT0gLTEgJiYgYWRkZW5kcCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBUSSAiaW50ZXJuYWwgcmVsb2NhdGlvbiIsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHJlbG9jYXRpb24KLQkgYW1vdW50IGlzIHRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIGN1cnJlbnQgc2VjdGlvbiBpcyBiZWluZyByZWxvY2F0ZWQKLQkgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAqLwotICAgICAgKmFkZGVuZHAgPSAoc2VjIC0+IG91dHB1dF9zZWN0aW9uIC0+IHZtYSArIHNlYyAtPiBvdXRwdXRfb2Zmc2V0KSAtIHNlYyAtPiB2bWE7Ci0gICAgfQotICBSVFlQRTJIT1dUTyAoJmdlbnJlbCwgcmVsKTsKLSAgcmV0dXJuIGdlbnJlbC5ob3d0bzsKLX0KLQotI2lmbmRlZiBCQURNQUcKLSNkZWZpbmUgQkFETUFHKHgpIFRJQzgwQkFETUFHKHgpCi0jZW5kaWYKLQwKLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGNvZmZfdGljODBfcmVsb2NhdGVfc2VjdGlvbgotCi0vKiBXZSBuZWVkIGEgc3BlY2lhbCByZWxvY2F0aW9uIHJvdXRpbmUgdG8gaGFuZGxlIHRoZSBQUCByZWxvY3MuICBNb3N0Ci0gICBvZiB0aGlzIGlzIGEgY29weSBvZiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfdGljODBfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLAotCQkJICAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsb2NzLCBzeW1zLAotCQkJICAgICBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyBzeW1uZHg7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0gICAgICBiZmRfdm1hIGFkZHI7Ci0KLSAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7ICAgIAotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JfQotCi0gICAgICAvKiBDT0ZGIHRyZWF0cyBjb21tb24gc3ltYm9scyBpbiBvbmUgb2YgdHdvIHdheXMuICBFaXRoZXIgdGhlCi0gICAgICAgICBzaXplIG9mIHRoZSBzeW1ib2wgaXMgaW5jbHVkZWQgaW4gdGhlIHNlY3Rpb24gY29udGVudHMsIG9yIGl0Ci0gICAgICAgICBpcyBub3QuICBXZSBhc3N1bWUgdGhhdCB0aGUgc2l6ZSBpcyBub3QgaW5jbHVkZWQsIGFuZCBmb3JjZQotICAgICAgICAgdGhlIHJ0eXBlX3RvX2hvd3RvIGZ1bmN0aW9uIHRvIGFkanVzdCB0aGUgYWRkZW5kIGFzIG5lZWRlZC4gICovCi0KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQlhZGRlbmQgPSAtIHN5bS0+bl92YWx1ZTsKLSAgICAgIGVsc2UKLQlhZGRlbmQgPSAwOwotCi0gICAgICBob3d0byA9IGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbCwgaCwKLQkJCQkgICAgICAgc3ltLCAmYWRkZW5kKTsKLSAgICAgIGlmIChob3d0byA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgdmFsID0gMDsKLQotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICB2YWwgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOwotICAgICAgICAgICAgICB2YWwgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICArIHN5bS0+bl92YWx1ZSk7Ci0JICAgICAgaWYgKCEgb2JqX3BlIChvdXRwdXRfYmZkKSkKLQkJdmFsIC09IHNlYy0+dm1hOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB9Ci0KLQkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGFkZHIgPSByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIC8qIEZJWE1FOiBUaGlzIGNvZGUgYXNzdW1lcyBsaXR0bGUgZW5kaWFuLCBidXQgdGhlIFBQIGNhbgotICAgICAgICAgYXBwYXJlbnRseSBiZSBiaS1lbmRpYW4uICBJIGRvbid0IGtub3cgaWYgdGhlIGJpLWVuZGlhbm5lc3MKLSAgICAgICAgIGFwcGxpZXMgdG8gdGhlIGluc3RydWN0aW9uIHNldCBvciBqdXN0IHRvIHRoZSBkYXRhLiAgKi8KLSAgICAgIHN3aXRjaCAoaG93dG8tPnR5cGUpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBSX0FCUzoKLQljYXNlIFJfUkVMTE9OR1g6Ci0JY2FzZSBSX1BQTDE1OgotCWNhc2UgUl9QUEwxNVc6Ci0JY2FzZSBSX1BQTDE1SDoKLQljYXNlIFJfUFBMTjE1OgotCWNhc2UgUl9QUExOMTVXOgotCWNhc2UgUl9QUExOMTVIOgotCSAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICBjb250ZW50cywgYWRkciwgdmFsLCBhZGRlbmQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfUFAxNToKLQljYXNlIFJfUFAxNVc6Ci0JY2FzZSBSX1BQMTVIOgotCWNhc2UgUl9QUE4xNToKLQljYXNlIFJfUFBOMTVXOgotCWNhc2UgUl9QUE4xNUg6Ci0JICAvKiBPZmZzZXQgdGhlIGFkZHJlc3Mgc28gdGhhdCB3ZSBjYW4gdXNlIDQgYnl0ZSByZWxvY2F0aW9ucy4gICovCi0JICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgIGNvbnRlbnRzICsgMiwgYWRkciwgdmFsLCBhZGRlbmQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfUFAxNkI6Ci0JY2FzZSBSX1BQTjE2QjoKLQkgIHsKLQkgICAgLyogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIHN0b3JlZCBpbiBiaXQgNi4gICovCi0JICAgIGJmZF9ieXRlIGhvbGQ7Ci0KLQkgICAgaG9sZCA9IGNvbnRlbnRzW2FkZHIgKyA0XTsKLQkgICAgY29udGVudHNbYWRkciArIDRdICY9fiAweDIwOwotCSAgICBjb250ZW50c1thZGRyICsgNF0gfD0gKGNvbnRlbnRzW2FkZHJdID4+IDEpICYgMHgyMDsKLQkgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICAgIGNvbnRlbnRzICsgMiwgYWRkciwKLQkJCQkJICAgICAgdmFsLCBhZGRlbmQpOwotCSAgICBjb250ZW50c1thZGRyXSAmPX4gMHg0MDsKLQkgICAgY29udGVudHNbYWRkcl0gfD0gKGNvbnRlbnRzW2FkZHIgKyA0XSA8PCAxKSAmIDB4NDA7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyA0XSAmPX4gMHgyMDsKLQkgICAgY29udGVudHNbYWRkciArIDRdIHw9IGhvbGQgJiAweDIwOwotCSAgICBicmVhazsKLQkgIH0KLQotCWNhc2UgUl9QUEwxNkI6Ci0JY2FzZSBSX1BQTE4xNkI6Ci0JICB7Ci0JICAgIC8qIFRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyBzdG9yZWQgaW4gYml0IDI4LiAgKi8KLQkgICAgYmZkX2J5dGUgaG9sZDsKLQotCSAgICBob2xkID0gY29udGVudHNbYWRkciArIDFdOwotCSAgICBjb250ZW50c1thZGRyICsgMV0gJj1+IDB4ODA7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyAxXSB8PSAoY29udGVudHNbYWRkciArIDNdIDw8IDMpICYgMHg4MDsKLQkgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICAgIGNvbnRlbnRzLCBhZGRyLAotCQkJCQkgICAgICB2YWwsIGFkZGVuZCk7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyAzXSAmPSB+MHgxMDsKLQkgICAgY29udGVudHNbYWRkciArIDNdIHw9IChjb250ZW50c1thZGRyICsgMV0gPj4gMykgJiAweDEwOwotCSAgICBjb250ZW50c1thZGRyICsgMV0gJj1+IDB4ODA7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyAxXSB8PSBob2xkICYgMHg4MDsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JCi0JY2FzZSBSX1BQQkFTRToKLQkgIC8qIFBhcmFtZXRlciBSQU0gaXMgZnJvbSAweDEwMDAwMDAgdG8gMHgxMDAwODAwLiAgKi8KLQkgIGNvbnRlbnRzW2FkZHJdICY9fiAweDM7Ci0JICBpZiAodmFsID49IDB4MTAwMDAwMCAmJiB2YWwgPCAweDEwMDA4MDApCi0JICAgIGNvbnRlbnRzW2FkZHJdIHw9IDB4MzsKLQkgIGVsc2UKLQkgICAgY29udGVudHNbYWRkcl0gfD0gMHgyOwotCSAgcnN0YXQgPSBiZmRfcmVsb2Nfb2s7Ci0JICBicmVhazsKLQotCWNhc2UgUl9QUExCQVNFOgotCSAgLyogUGFyYW1ldGVyIFJBTSBpcyBmcm9tIDB4MTAwMDAwMCB0byAweDEwMDA4MDAuICAqLwotCSAgY29udGVudHNbYWRkciArIDJdICY9IH4weGMwOwotCSAgaWYgKHZhbCA+PSAweDEwMDAwMDAgJiYgdmFsIDwgMHgxMDAwODAwKQotCSAgICBjb250ZW50c1thZGRyICsgMl0gfD0gMHhjMDsKLQkgIGVsc2UKLQkgICAgY29udGVudHNbYWRkciArIDJdIHw9IDB4ODA7Ci0JICByc3RhdCA9IGJmZF9yZWxvY19vazsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGJhZCByZWxvYyBhZGRyZXNzIDB4JWx4IGluIHNlY3Rpb24gYCVzJyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkgICAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIsCi0JICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgICBuYW1lID0gIipBQlMqIjsKLQkgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICBlbHNlCi0JICAgICAgewotCQluYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsIHN5bSwgYnVmKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLSNkZWZpbmUgVElDODBDT0ZGIDEJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0jdW5kZWYgQ19BVVRPQVJHCQkvKiBDbGFzaGVzIHdpdGggVEljODAncyBDX1VFWFQgKi8KLSN1bmRlZiBDX0xBU1RFTlQJCS8qIENsYXNoZXMgd2l0aCBUSWM4MCdzIENfU1RBVExBQiAqLwotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLWNvbnN0IGJmZF90YXJnZXQgCi0gIHRpYzgwY29mZl92ZWMgPQotewotICAiY29mZi10aWM4MCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlIChhcmNoIHN1cHBvcnRzIGJvdGgpICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0ge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgYmZkX2ZhbHNlfSwKLSB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUKLSB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtdTY4ay5jIGIvYmZkL2NvZmYtdTY4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2VhNzNmLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXU2OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgNjgwMDAgQ09GRiBiaW5hcmllcyBoYXZpbmcgdW5kZXJzY29yZSB3aXRoIG5hbWUuCi0gICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfU1lNCW02OGtjb2ZmdW5fdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCSJjb2ZmLW02OGstdW4iCi0KLSNkZWZpbmUgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCi0KLS8qIGRlZmluZSB0aGlzIHRvIG5vdCBoYXZlIG11bHRpcGxlIGNvcHkgb2YgbTY4a19ydHlwZTJob3d0bwotICAgaW4gdGhlIGV4ZWN1dGFibGUgZmlsZSAqLwotI2RlZmluZSBPTkxZX0RFQ0xBUkVfUkVMT0NTCi0KLS8qIFRoaXMgbWFnaWMgbnVtYmVyIGluZGljYXRlcyB0aGF0IHRoZSBuYW1lcyBoYXZlIHVuZGVyc2NvcmVzLgotICAgT3RoZXIgNjhrIG1hZ2ljIG51bWJlcnMgaW5kaWNhdGUgdGhhdCB0aGUgbmFtZXMgZG8gbm90IGhhdmUKLSAgIHVuZGVyc2NvcmVzLiAgKi8KLSNkZWZpbmUgQkFETUFHKHgpICgoeCkuZl9tYWdpYyAhPSBNQzY4S0JDU01BR0lDKQotCi0jaW5jbHVkZSAiY29mZi1tNjhrLmMiCmRpZmYgLS1naXQgYS9iZmQvY29mZi13NjUuYyBiL2JmZC9jb2ZmLXc2NS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGQ2OGMzLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXc2NS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgV0RDIDY1ODE2IENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCA8c2FjQGN5Z251cy5jb20+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+aG93dG8tPm5hbWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0gICpzcmNfcHRyID0gc3JjX2FkZHJlc3M7Ci0gICpkc3RfcHRyID0gZHN0X2FkZHJlc3M7Ci0KLX0KLQotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMgaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcwotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXN0aW1hdGUgaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZQotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotCi0jdW5kZWYgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jdW5kZWYgY29mZl9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgotCi0KLQotYmZkX3RhcmdldCB3NjVfdmVjID0KLXsKLSAgImNvZmYtdzY1IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgQkZEX0lTX1JFTEFYQUJMRSApLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgY2hhciAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgQ09GRl9TV0FQX1RBQkxFLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXdlMzJrLmMgYi9iZmQvY29mZi13ZTMyay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjZiYmUzLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXdlMzJrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciB3ZTMyayBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQnJlbmRhbiBLZWhvZSAoYnJlbmRhbkBjcy53aWRlbmVyLmVkdSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvd2UzMmsuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9IAotewotICAgIHswfSwKLSAgICB7MX0sCi0gICAgezJ9LAotICAgIHszfSwKLSAgICB7NH0sCi0gICAgezV9LAotICBIT1dUTyhSX0RJUjMyLAkgICAgICAgMCwgIDIsIAkzMiwgZmFsc2UsIDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJkaXIzMiIsCXRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICAgIHs3fSwKLSAgICB7MDEwfSwKLSAgICB7MDExfSwKLSAgICB7MDEyfSwKLSAgICB7MDEzfSwKLSAgICB7MDE0fSwKLSAgICB7MDE1fSwKLSAgICB7MDE2fSwKLSAgSE9XVE8oUl9SRUxCWVRFLAkgICAgICAgMCwgIDAsICAJOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjgiLAl0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiMTYiLAl0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxMT05HLAkgICAgICAgMCwgIDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JCWVRFLAkgICAgICAgMCwgIDAsIAk4LCAgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1A4IiwgICAgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSV09SRCwJICAgICAgIDAsICAxLCAJMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMTYiLCAgIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUkxPTkcsCSAgICAgICAwLCAgMiwgCTMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDMyIiwgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLX07Ci0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgIG51bm1iZXIgKi8KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeyB4LnJfdHlwZSA9IGhvd3RvLT50eXBlOyB9Ci0jZGVmaW5lIEJBRE1BRyh4KSBXRTMyS0JBRE1BRyh4KQotI2RlZmluZSBXRTMySwkxCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIFwKLQkgICAgKGNhY2hlX3B0ciktPmhvd3RvID0gaG93dG9fdGFibGUgKyAoZHN0KS0+cl90eXBlOwotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotI2RlZmluZSBjb2ZmX3dyaXRlX2FybWFwIGJzZF93cml0ZV9hcm1hcAotCi1jb25zdCBiZmRfdGFyZ2V0IHdlMzJrY29mZl92ZWMgPQotewotICAiY29mZi13ZTMyayIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBiZmRfZmFsc2V9LAotIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi16OGsuYyBiL2JmZC9jb2ZmLXo4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDA0OWU4OS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi16OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFppbG9nIFo4MDBuIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiwgPHNhY0BjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImNvZmYvejhrLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDEpCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tMzIgPQotSE9XVE8gKFJfSU1NMzIsIDAsIDEsIDMyLCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tMzIiLCB0cnVlLCAweGZmZmZmZmZmLAotICAgICAgIDB4ZmZmZmZmZmYsIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9pbW00bCA9Ci1IT1dUTyAoUl9JTU00TCwgMCwgMSwgNCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2ltbTRsIiwgdHJ1ZSwgMHhmLCAweGYsIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9kYSA9Ci1IT1dUTyAoUl9JTU0xNiwgMCwgMSwgMTYsIGZhbHNlLCAwLAotICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicl9kYSIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsCi0gICAgICAgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2ltbTggPQotSE9XVE8gKFJfSU1NOCwgMCwgMSwgOCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2ltbTgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLAotICAgICAgIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9qciA9Ci1IT1dUTyAoUl9KUiwgMCwgMSwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLAotICAgICAgICJyX2pyIiwgdHJ1ZSwgMCwgMCwgdHJ1ZSk7Ci0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCi0KLXN0YXRpYyBpbnQgCi1jb2ZmX3o4a19zZWxlY3RfcmVsb2MgKGhvd3RvKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLXsKLSAgcmV0dXJuIGhvd3RvLT50eXBlOwotfQotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB4LnJfdHlwZSA9IGNvZmZfejhrX3NlbGVjdF9yZWxvYyhob3d0bykKLQotCi0jZGVmaW5lIEJBRE1BRyh4KSBaOEtCQURNQUcoeCkKLSNkZWZpbmUgWjhLIDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLQotCi0KLS8qIENvZGUgdG8gc3dhcCBpbiB0aGUgcmVsb2MgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgICBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkgXAotICBkc3QtPnJfc3R1ZmZbMF0gPSAnUyc7IFwKLSAgZHN0LT5yX3N0dWZmWzFdID0gJ0MnOwotCi0vKiBDb2RlIHRvIHR1cm4gYSByX3R5cGUgaW50byBhIGhvd3RvIHB0ciwgdXNlcyB0aGUgYWJvdmUgaG93dG8gdGFibGUKLSAgICovCi0KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byAoaW50ZXJuYWwsIGRzdCkKLSAgICAgYXJlbGVudCAqIGludGVybmFsOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKLXsKLSAgc3dpdGNoIChkc3QtPnJfdHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0lNTTg6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9pbW04OwotICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgUl9JTU0xNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2RhOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0pSOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfanI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSU1NMzI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9pbW0zMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9JTU00TDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTRsOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGludGVybmFsLCByZWxvY2VudHJ5KSBydHlwZTJob3d0byhpbnRlcm5hbCxyZWxvY2VudHJ5KQotCi0KLS8qIFBlcmZvcm0gYW55IG5lY2Vzc2FyeSBtYWdpYyB0byB0aGUgYWRkZW5kIGluIGEgcmVsb2MgZW50cnkgKi8KLQotCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHN5bWJvbCwgZXh0X3JlbG9jLCBjYWNoZV9wdHIpIFwKLSBjYWNoZV9wdHItPmFkZGVuZCA9ICBleHRfcmVsb2Mucl9vZmZzZXQ7Ci0KLQotI2RlZmluZSBSRUxPQ19QUk9DRVNTSU5HKHJlbGVudCxyZWxvYyxzeW1ib2xzLGFiZmQsc2VjdGlvbikgXAotIHJlbG9jX3Byb2Nlc3NpbmcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLQotc3RhdGljIHZvaWQgCi1yZWxvY19wcm9jZXNzaW5nIChyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotICAgICBhcmVsZW50ICogcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOwotICAgICBhc3ltYm9sICoqIHN5bWJvbHM7Ci0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLXsKLSAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7Ci0gIHJ0eXBlMmhvd3RvIChyZWxlbnQsIHJlbG9jKTsKLQotICBpZiAocmVsb2MtPnJfc3ltbmR4ID4gMCkKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0IChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0KLQotICByZWxlbnQtPmFkZGVuZCA9IHJlbG9jLT5yX29mZnNldDsKLSAgcmVsZW50LT5hZGRyZXNzIC09IHNlY3Rpb24tPnZtYTsKLX0KLQotc3RhdGljIHZvaWQKLWV4dHJhX2Nhc2UgKGluX2FiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpCi0gICAgIGJmZCAqaW5fYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGludCAqc3JjX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyOwotewotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotICBzd2l0Y2ggKHJlbG9jLT5ob3d0by0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0lNTTg6Ci0gICAgICBiZmRfcHV0XzggKGluX2FiZmQsCi0JCSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbiksCi0JCSBkYXRhICsgKmRzdF9wdHIpOwotICAgICAgKCpkc3RfcHRyKSArPSAxOwotICAgICAgKCpzcmNfcHRyKSArPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSU1NMzI6Ci0gICAgICBiZmRfcHV0XzMyIChpbl9hYmZkLAotCQkgIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJICBkYXRhICsgKmRzdF9wdHIpOwotICAgICAgKCpkc3RfcHRyKSArPSA0OwotICAgICAgKCpzcmNfcHRyKSArPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSU1NNEw6Ci0gICAgICBiZmRfcHV0XzggKGluX2FiZmQsCi0JCSAoKGJmZF9nZXRfOCAoaW5fYWJmZCwgZGF0YSArICpkc3RfcHRyKSAmIDB4ZjApIAotCQkgIHwgKDB4MGYKLQkJICAgICAmIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICAgaW5wdXRfc2VjdGlvbikpKSwKLQkJIGRhdGEgKyAqZHN0X3B0cik7Ci0gICAgICAoKmRzdF9wdHIpICs9IDE7Ci0gICAgICAoKnNyY19wdHIpICs9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9JTU0xNjoKLSAgICAgIGJmZF9wdXRfMTYgKGluX2FiZmQsCi0JCSAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAotCQkgIGRhdGEgKyAqZHN0X3B0cik7Ci0gICAgICAoKmRzdF9wdHIpICs9IDI7Ci0gICAgICAoKnNyY19wdHIpICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9KUjoKLSAgICAgIHsKLQliZmRfdm1hIGRzdCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfdm1hIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQKLQkJICAgICAgICsgKmRzdF9wdHIKLQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JaW50IGdhcCA9IGRzdCAtIGRvdCAtIDE7LyogLTEgc2luY2Ugd2VyZSBpbiB0aGUgb2RkIGJ5dGUgb2YgdGhlCi0JCQkJICAgIHdvcmQgYW5kIHRoZSBwYydzIGJlZW4gaW5jcmVtZW50ZWQgKi8KLQotCWlmIChnYXAgJiAxKQotCSAgYWJvcnQgKCk7Ci0JZ2FwIC89IDI7Ci0JaWYgKGdhcCA+IDEyOCB8fCBnYXAgPCAtMTI4KQotCSAgewotCSAgICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgICAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgICAgYWJvcnQgKCk7Ci0JICB9Ci0JYmZkX3B1dF84IChpbl9hYmZkLCBnYXAsIGRhdGEgKyAqZHN0X3B0cik7Ci0JKCpkc3RfcHRyKSsrOwotCSgqc3JjX3B0cikrKzsKLQlicmVhazsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyBleHRyYV9jYXNlCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0KLSN1bmRlZiAgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jdW5kZWYgY29mZl9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgotCi1jb25zdCBiZmRfdGFyZ2V0IHo4a2NvZmZfdmVjID0KLXsKLSAgImNvZmYtejhrIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgc3ltYm9sIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZmNvZGUuaCBiL2JmZC9jb2ZmY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGQ5NzY5Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDM0OCArMCwwIEBACi0vKiBTdXBwb3J0IGZvciB0aGUgZ2VuZXJpYyBwYXJ0cyBvZiBtb3N0IENPRkYgdmFyaWFudHMsIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotTW9zdCBvZiB0aGlzIGhhY2tlZCBieSAgU3RldmUgQ2hhbWJlcmxhaW4sCi0JCQlzYWNAY3lnbnVzLmNvbQotKi8KLS8qCi0KLVNFQ1RJT04KLQljb2ZmIGJhY2tlbmRzCi0KLQlCRkQgc3VwcG9ydHMgYSBudW1iZXIgb2YgZGlmZmVyZW50IGZsYXZvdXJzIG9mIGNvZmYgZm9ybWF0LgotCVRoZSBtYWpvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIGZvcm1hdHMgYXJlIHRoZSBzaXplcyBhbmQKLQlhbGlnbm1lbnRzIG9mIGZpZWxkcyBpbiBzdHJ1Y3R1cmVzIG9uIGRpc2ssIGFuZCB0aGUgb2NjYXNpb25hbAotCWV4dHJhIGZpZWxkLgotCi0JQ29mZiBpbiBhbGwgaXRzIHZhcmlldGllcyBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgZmV3IGNvbW1vbgotCWZpbGVzIGFuZCBhIG51bWJlciBvZiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBmaWxlcy4gRm9yCi0JZXhhbXBsZSwgVGhlIDg4ayBiY3MgY29mZiBmb3JtYXQgaXMgaW1wbGVtZW50ZWQgaW4gdGhlIGZpbGUKLQlAZmlsZXtjb2ZmLW04OGsuY30uIFRoaXMgZmlsZSBAY29kZXsjaW5jbHVkZX1zCi0JQGZpbGV7Y29mZi9tODhrLmh9IHdoaWNoIGRlZmluZXMgdGhlIGV4dGVybmFsIHN0cnVjdHVyZSBvZiB0aGUKLQljb2ZmIGZvcm1hdCBmb3IgdGhlIDg4aywgYW5kIEBmaWxle2NvZmYvaW50ZXJuYWwuaH0gd2hpY2gKLQlkZWZpbmVzIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUuIEBmaWxle2NvZmYtbTg4ay5jfSBhbHNvCi0JZGVmaW5lcyB0aGUgcmVsb2NhdGlvbnMgdXNlZCBieSB0aGUgODhrIGZvcm1hdAotCUB4cmVme1JlbG9jYXRpb25zfS4KLQotCVRoZSBJbnRlbCBpOTYwIHByb2Nlc3NvciB2ZXJzaW9uIG9mIGNvZmYgaXMgaW1wbGVtZW50ZWQgaW4KLQlAZmlsZXtjb2ZmLWk5NjAuY30uIFRoaXMgZmlsZSBoYXMgdGhlIHNhbWUgc3RydWN0dXJlIGFzCi0JQGZpbGV7Y29mZi1tODhrLmN9LCBleGNlcHQgdGhhdCBpdCBpbmNsdWRlcyBAZmlsZXtjb2ZmL2k5NjAuaH0KLQlyYXRoZXIgdGhhbiBAZmlsZXtjb2ZmLW04OGsuaH0uCi0KLVNVQlNFQ1RJT04KLQlQb3J0aW5nIHRvIGEgbmV3IHZlcnNpb24gb2YgY29mZgotCi0JVGhlIHJlY29tbWVuZGVkIG1ldGhvZCBpcyB0byBzZWxlY3QgZnJvbSB0aGUgZXhpc3RpbmcKLQlpbXBsZW1lbnRhdGlvbnMgdGhlIHZlcnNpb24gb2YgY29mZiB3aGljaCBpcyBtb3N0IGxpa2UgdGhlIG9uZQotCXlvdSB3YW50IHRvIHVzZS4gIEZvciBleGFtcGxlLCB3ZSdsbCBzYXkgdGhhdCBpMzg2IGNvZmYgaXMKLQl0aGUgb25lIHlvdSBzZWxlY3QsIGFuZCB0aGF0IHlvdXIgY29mZiBmbGF2b3VyIGlzIGNhbGxlZCBmb28uCi0JQ29weSBAZmlsZXtpMzg2Y29mZi5jfSB0byBAZmlsZXtmb29jb2ZmLmN9LCBjb3B5Ci0JQGZpbGV7Li4vaW5jbHVkZS9jb2ZmL2kzODYuaH0gdG8gQGZpbGV7Li4vaW5jbHVkZS9jb2ZmL2Zvby5ofSwKLQlhbmQgYWRkIHRoZSBsaW5lcyB0byBAZmlsZXt0YXJnZXRzLmN9IGFuZCBAZmlsZXtNYWtlZmlsZS5pbn0KLQlzbyB0aGF0IHlvdXIgbmV3IGJhY2sgZW5kIGlzIHVzZWQuIEFsdGVyIHRoZSBzaGFwZXMgb2YgdGhlCi0Jc3RydWN0dXJlcyBpbiBAZmlsZXsuLi9pbmNsdWRlL2NvZmYvZm9vLmh9IHNvIHRoYXQgdGhleSBtYXRjaAotCXdoYXQgeW91IG5lZWQuIFlvdSB3aWxsIHByb2JhYmx5IGFsc28gaGF2ZSB0byBhZGQKLQlAY29kZXsjaWZkZWZ9cyB0byB0aGUgY29kZSBpbiBAZmlsZXtjb2ZmL2ludGVybmFsLmh9IGFuZAotCUBmaWxle2NvZmZjb2RlLmh9IGlmIHlvdXIgdmVyc2lvbiBvZiBjb2ZmIGlzIHRvbyB3aWxkLgotCi0JWW91IGNhbiB2ZXJpZnkgdGhhdCB5b3VyIG5ldyBCRkQgYmFja2VuZCB3b3JrcyBxdWl0ZSBzaW1wbHkgYnkKLQlidWlsZGluZyBAZmlsZXtvYmpkdW1wfSBmcm9tIHRoZSBAZmlsZXtiaW51dGlsc30gZGlyZWN0b3J5LAotCWFuZCBtYWtpbmcgc3VyZSB0aGF0IGl0cyB2ZXJzaW9uIG9mIHdoYXQncyBnb2luZyBvbiBhbmQgeW91cgotCWhvc3Qgc3lzdGVtJ3MgaWRlYSAoYXNzdW1pbmcgaXQgaGFzIHRoZSBwcmV0dHkgc3RhbmRhcmQgY29mZgotCWR1bXAgdXRpbGl0eSwgdXN1YWxseSBjYWxsZWQgQGNvZGV7YXR0LWR1bXB9IG9yIGp1c3QKLQlAY29kZXtkdW1wfSkgYXJlIHRoZSBzYW1lLiAgVGhlbiBjbGVhbiB1cCB5b3VyIGNvZGUsIGFuZCBzZW5kCi0Jd2hhdCB5b3UndmUgZG9uZSB0byBDeWdudXMuIFRoZW4geW91ciBzdHVmZiB3aWxsIGJlIGluIHRoZQotCW5leHQgcmVsZWFzZSwgYW5kIHlvdSB3b24ndCBoYXZlIHRvIGtlZXAgaW50ZWdyYXRpbmcgaXQuCi0KLVNVQlNFQ1RJT04KLQlIb3cgdGhlIGNvZmYgYmFja2VuZCB3b3JrcwotCi1TVUJTVUJTRUNUSU9OCi0JRmlsZSBsYXlvdXQKLQotCVRoZSBDb2ZmIGJhY2tlbmQgaXMgc3BsaXQgaW50byBnZW5lcmljIHJvdXRpbmVzIHRoYXQgYXJlCi0JYXBwbGljYWJsZSB0byBhbnkgQ29mZiB0YXJnZXQgYW5kIHJvdXRpbmVzIHRoYXQgYXJlIHNwZWNpZmljCi0JdG8gYSBwYXJ0aWN1bGFyIHRhcmdldC4gIFRoZSB0YXJnZXQtc3BlY2lmaWMgcm91dGluZXMgYXJlCi0JZnVydGhlciBzcGxpdCBpbnRvIG9uZXMgd2hpY2ggYXJlIGJhc2ljYWxseSB0aGUgc2FtZSBmb3IgYWxsCi0JQ29mZiB0YXJnZXRzIGV4Y2VwdCB0aGF0IHRoZXkgdXNlIHRoZSBleHRlcm5hbCBzeW1ib2wgZm9ybWF0Ci0Jb3IgdXNlIGRpZmZlcmVudCB2YWx1ZXMgZm9yIGNlcnRhaW4gY29uc3RhbnRzLgotCi0JVGhlIGdlbmVyaWMgcm91dGluZXMgYXJlIGluIEBmaWxle2NvZmZnZW4uY30uICBUaGVzZSByb3V0aW5lcwotCXdvcmsgZm9yIGFueSBDb2ZmIHRhcmdldC4gIFRoZXkgdXNlIHNvbWUgaG9va3MgaW50byB0aGUgdGFyZ2V0Ci0Jc3BlY2lmaWMgY29kZTsgdGhlIGhvb2tzIGFyZSBpbiBhIEBjb2Rle2JmZF9jb2ZmX2JhY2tlbmRfZGF0YX0KLQlzdHJ1Y3R1cmUsIG9uZSBvZiB3aGljaCBleGlzdHMgZm9yIGVhY2ggdGFyZ2V0LgotCi0JVGhlIGVzc2VudGlhbGx5IHNpbWlsYXIgdGFyZ2V0LXNwZWNpZmljIHJvdXRpbmVzIGFyZSBpbgotCUBmaWxle2NvZmZjb2RlLmh9LiAgVGhpcyBoZWFkZXIgZmlsZSBpbmNsdWRlcyBleGVjdXRhYmxlIEMgY29kZS4KLQlUaGUgdmFyaW91cyBDb2ZmIHRhcmdldHMgZmlyc3QgaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgQ29mZgotCWhlYWRlciBmaWxlLCBtYWtlIGFueSBzcGVjaWFsIGRlZmluZXMgdGhhdCBhcmUgbmVlZGVkLCBhbmQKLQl0aGVuIGluY2x1ZGUgQGZpbGV7Y29mZmNvZGUuaH0uCi0KLQlTb21lIG9mIHRoZSBDb2ZmIHRhcmdldHMgdGhlbiBhbHNvIGhhdmUgYWRkaXRpb25hbCByb3V0aW5lcyBpbgotCXRoZSB0YXJnZXQgc291cmNlIGZpbGUgaXRzZWxmLgotCi0JRm9yIGV4YW1wbGUsIEBmaWxle2NvZmYtaTk2MC5jfSBpbmNsdWRlcwotCUBmaWxle2NvZmYvaW50ZXJuYWwuaH0gYW5kIEBmaWxle2NvZmYvaTk2MC5ofS4gIEl0IHRoZW4KLQlkZWZpbmVzIGEgZmV3IGNvbnN0YW50cywgc3VjaCBhcyBAY29kZXtJOTYwfSwgYW5kIGluY2x1ZGVzCi0JQGZpbGV7Y29mZmNvZGUuaH0uICBTaW5jZSB0aGUgaTk2MCBoYXMgY29tcGxleCByZWxvY2F0aW9uCi0JdHlwZXMsIEBmaWxle2NvZmYtaTk2MC5jfSBhbHNvIGluY2x1ZGVzIHNvbWUgY29kZSB0bwotCW1hbmlwdWxhdGUgdGhlIGk5NjAgcmVsb2NzLiAgVGhpcyBjb2RlIGlzIG5vdCBpbgotCUBmaWxle2NvZmZjb2RlLmh9IGJlY2F1c2UgaXQgd291bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyCi0JdGFyZ2V0LgotCi1TVUJTVUJTRUNUSU9OCi0JQml0IHR3aWRkbGluZwotCi0JRWFjaCBmbGF2b3VyIG9mIGNvZmYgc3VwcG9ydGVkIGluIEJGRCBoYXMgaXRzIG93biBoZWFkZXIgZmlsZQotCWRlc2NyaWJpbmcgdGhlIGV4dGVybmFsIGxheW91dCBvZiB0aGUgc3RydWN0dXJlcy4gVGhlcmUgaXMgYWxzbwotCWFuIGludGVybmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2ZmIGxheW91dCwgaW4KLQlAZmlsZXtjb2ZmL2ludGVybmFsLmh9LiBBIG1ham9yIGZ1bmN0aW9uIG9mIHRoZQotCWNvZmYgYmFja2VuZCBpcyBzd2FwcGluZyB0aGUgYnl0ZXMgYW5kIHR3aWRkbGluZyB0aGUgYml0cyB0bwotCXRyYW5zbGF0ZSB0aGUgZXh0ZXJuYWwgZm9ybSBvZiB0aGUgc3RydWN0dXJlcyBpbnRvIHRoZSBub3JtYWwKLQlpbnRlcm5hbCBmb3JtLiBUaGlzIGlzIGFsbCBwZXJmb3JtZWQgaW4gdGhlCi0JQGNvZGV7YmZkX3N3YXB9X0Bpe3RoaW5nfV9AaXtkaXJlY3Rpb259IHJvdXRpbmVzLiBTb21lCi0JZWxlbWVudHMgYXJlIGRpZmZlcmVudCBzaXplcyBiZXR3ZWVuIGRpZmZlcmVudCB2ZXJzaW9ucyBvZgotCWNvZmY7IGl0IGlzIHRoZSBkdXR5IG9mIHRoZSBjb2ZmIHZlcnNpb24gc3BlY2lmaWMgaW5jbHVkZSBmaWxlCi0JdG8gb3ZlcnJpZGUgdGhlIGRlZmluaXRpb25zIG9mIHZhcmlvdXMgcGFja2luZyByb3V0aW5lcyBpbgotCUBmaWxle2NvZmZjb2RlLmh9LiBFLmcuLCB0aGUgc2l6ZSBvZiBsaW5lIG51bWJlciBlbnRyeSBpbiBjb2ZmIGlzCi0Jc29tZXRpbWVzIDE2IGJpdHMsIGFuZCBzb21ldGltZXMgMzIgYml0cy4gQGNvZGV7I2RlZmluZX1pbmcKLQlAY29kZXtQVVRfTE5TWl9MTk5PfSBhbmQgQGNvZGV7R0VUX0xOU1pfTE5OT30gd2lsbCBzZWxlY3QgdGhlCi0JY29ycmVjdCBvbmUuIE5vIGRvdWJ0LCBzb21lIGRheSBzb21lb25lIHdpbGwgZmluZCBhIHZlcnNpb24gb2YKLQljb2ZmIHdoaWNoIGhhcyBhIHZhcnlpbmcgZmllbGQgc2l6ZSBub3QgY2F0ZXJlZCB0byBhdCB0aGUKLQltb21lbnQuIFRvIHBvcnQgQkZELCB0aGF0IHBlcnNvbiB3aWxsIGhhdmUgdG8gYWRkIG1vcmUgQGNvZGV7I2RlZmluZXN9LgotCVRocmVlIG9mIHRoZSBiaXQgdHdpZGRsaW5nIHJvdXRpbmVzIGFyZSBleHBvcnRlZCB0bwotCUBjb2Rle2dkYn07IEBjb2Rle2NvZmZfc3dhcF9hdXhfaW59LCBAY29kZXtjb2ZmX3N3YXBfc3ltX2lufQotCWFuZCBAY29kZXtjb2ZmX3N3YXBfbGlubm9faW59LiBAY29kZXtHREJ9IHJlYWRzIHRoZSBzeW1ib2wKLQl0YWJsZSBvbiBpdHMgb3duLCBidXQgdXNlcyBCRkQgdG8gZml4IHRoaW5ncyB1cC4gIE1vcmUgb2YgdGhlCi0JYml0IHR3aWRkbGVycyBhcmUgZXhwb3J0ZWQgZm9yIEBjb2Rle2dhc307Ci0JQGNvZGV7Y29mZl9zd2FwX2F1eF9vdXR9LCBAY29kZXtjb2ZmX3N3YXBfc3ltX291dH0sCi0JQGNvZGV7Y29mZl9zd2FwX2xpbmVub19vdXR9LCBAY29kZXtjb2ZmX3N3YXBfcmVsb2Nfb3V0fSwKLQlAY29kZXtjb2ZmX3N3YXBfZmlsZWhkcl9vdXR9LCBAY29kZXtjb2ZmX3N3YXBfYW91dGhkcl9vdXR9LAotCUBjb2Rle2NvZmZfc3dhcF9zY25oZHJfb3V0fS4gQGNvZGV7R2FzfSBjdXJyZW50bHkga2VlcHMgdHJhY2sKLQlvZiBhbGwgdGhlIHN5bWJvbCB0YWJsZSBhbmQgcmVsb2MgZHJ1ZGdlcnkgaXRzZWxmLCB0aGVyZWJ5Ci0Jc2F2aW5nIHRoZSBpbnRlcm5hbCBCRkQgb3ZlcmhlYWQsIGJ1dCB1c2VzIEJGRCB0byBzd2FwIHRoaW5ncwotCW9uIHRoZSB3YXkgb3V0LCBtYWtpbmcgY3Jvc3MgcG9ydHMgbXVjaCBzYWZlci4gIERvaW5nIHNvIGFsc28KLQlhbGxvd3MgQkZEIChhbmQgdGh1cyB0aGUgbGlua2VyKSB0byB1c2UgdGhlIHNhbWUgaGVhZGVyIGZpbGVzCi0JYXMgQGNvZGV7Z2FzfSwgd2hpY2ggbWFrZXMgb25lIGF2ZW51ZSB0byBkaXNhc3RlciBkaXNhcHBlYXIuCi0KLVNVQlNVQlNFQ1RJT04KLQlTeW1ib2wgcmVhZGluZwotCi0JVGhlIHNpbXBsZSBjYW5vbmljYWwgZm9ybSBmb3Igc3ltYm9scyB1c2VkIGJ5IEJGRCBpcyBub3QgcmljaAotCWVub3VnaCB0byBrZWVwIGFsbCB0aGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluIGEgY29mZiBzeW1ib2wKLQl0YWJsZS4gVGhlIGJhY2sgZW5kIGdldHMgYXJvdW5kIHRoaXMgcHJvYmxlbSBieSBrZWVwaW5nIHRoZSBvcmlnaW5hbAotCXN5bWJvbCB0YWJsZSBhcm91bmQsICJiZWhpbmQgdGhlIHNjZW5lcyIuCi0KLQlXaGVuIGEgc3ltYm9sIHRhYmxlIGlzIHJlcXVlc3RlZCAodGhyb3VnaCBhIGNhbGwgdG8KLQlAY29kZXtiZmRfY2Fub25pY2FsaXplX3N5bXRhYn0pLCBhIHJlcXVlc3QgZ2V0cyB0aHJvdWdoIHRvCi0JQGNvZGV7Y29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWJ9LiBUaGlzIHJlYWRzIHRoZSBzeW1ib2wgdGFibGUgZnJvbQotCXRoZSBjb2ZmIGZpbGUgYW5kIHN3YXBzIGFsbCB0aGUgc3RydWN0dXJlcyBpbnNpZGUgaW50byB0aGUKLQlpbnRlcm5hbCBmb3JtLiBJdCBhbHNvIGZpeGVzIHVwIGFsbCB0aGUgcG9pbnRlcnMgaW4gdGhlIHRhYmxlCi0JKHJlcHJlc2VudGVkIGluIHRoZSBmaWxlIGJ5IG9mZnNldHMgZnJvbSB0aGUgZmlyc3Qgc3ltYm9sIGluCi0JdGhlIHRhYmxlKSBpbnRvIHBoeXNpY2FsIHBvaW50ZXJzIHRvIGVsZW1lbnRzIGluIHRoZSBuZXcKLQlpbnRlcm5hbCB0YWJsZS4gVGhpcyBpbnZvbHZlcyBzb21lIHdvcmsgc2luY2UgdGhlIG1lYW5pbmdzIG9mCi0JZmllbGRzIGNoYW5nZSBkZXBlbmRpbmcgdXBvbiBjb250ZXh0OiBhIGZpZWxkIHRoYXQgaXMgYQotCXBvaW50ZXIgdG8gYW5vdGhlciBzdHJ1Y3R1cmUgaW4gdGhlIHN5bWJvbCB0YWJsZSBhdCBvbmUgbW9tZW50Ci0JbWF5IGJlIHRoZSBzaXplIGluIGJ5dGVzIG9mIGEgc3RydWN0dXJlIGF0IHRoZSBuZXh0LiAgQW5vdGhlcgotCXBhc3MgaXMgbWFkZSBvdmVyIHRoZSB0YWJsZS4gQWxsIHN5bWJvbHMgd2hpY2ggbWFyayBmaWxlIG5hbWVzCi0JKDw8Q19GSUxFPj4gc3ltYm9scykgYXJlIG1vZGlmaWVkIHNvIHRoYXQgdGhlIGludGVybmFsCi0Jc3RyaW5nIHBvaW50cyB0byB0aGUgdmFsdWUgaW4gdGhlIGF1eGVudCAodGhlIHJlYWwgZmlsZW5hbWUpCi0JcmF0aGVyIHRoYW4gdGhlIG5vcm1hbCB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ltYm9sCi0JKEBjb2RleyIuZmlsZSJ9KS4KLQotCUF0IHRoaXMgdGltZSB0aGUgc3ltYm9sIG5hbWVzIGFyZSBtb3ZlZCBhcm91bmQuIENvZmYgc3RvcmVzCi0JYWxsIHN5bWJvbHMgbGVzcyB0aGFuIG5pbmUgY2hhcmFjdGVycyBsb25nIHBoeXNpY2FsbHkKLQl3aXRoaW4gdGhlIHN5bWJvbCB0YWJsZTsgbG9uZ2VyIHN0cmluZ3MgYXJlIGtlcHQgYXQgdGhlIGVuZCBvZgotCXRoZSBmaWxlIGluIHRoZSBzdHJpbmcgCXRhYmxlLiBUaGlzIHBhc3MgbW92ZXMgYWxsIHN0cmluZ3MKLQlpbnRvIG1lbW9yeSBhbmQgcmVwbGFjZXMgdGhlbSB3aXRoIHBvaW50ZXJzIHRvIHRoZSBzdHJpbmdzLgotCi0KLQlUaGUgc3ltYm9sIHRhYmxlIGlzIG1hc3NhZ2VkIG9uY2UgYWdhaW4sIHRoaXMgdGltZSB0byBjcmVhdGUKLQl0aGUgY2Fub25pY2FsIHRhYmxlIHVzZWQgYnkgdGhlIEJGRCBhcHBsaWNhdGlvbi4gRWFjaCBzeW1ib2wKLQlpcyBpbnNwZWN0ZWQgaW4gdHVybiwgYW5kIGEgZGVjaXNpb24gbWFkZSAodXNpbmcgdGhlCi0JQGNvZGV7c2NsYXNzfSBmaWVsZCkgYWJvdXQgdGhlIHZhcmlvdXMgZmxhZ3MgdG8gc2V0IGluIHRoZQotCUBjb2Rle2FzeW1ib2x9LiAgQHhyZWZ7U3ltYm9sc30uIFRoZSBnZW5lcmF0ZWQgY2Fub25pY2FsIHRhYmxlCi0Jc2hhcmVzIHN0cmluZ3Mgd2l0aCB0aGUgaGlkZGVuIGludGVybmFsIHN5bWJvbCB0YWJsZS4KLQotCUFueSBsaW5lbnVtYmVycyBhcmUgcmVhZCBmcm9tIHRoZSBjb2ZmIGZpbGUgdG9vLCBhbmQgYXR0YWNoZWQKLQl0byB0aGUgc3ltYm9scyB3aGljaCBvd24gdGhlIGZ1bmN0aW9ucyB0aGUgbGluZW51bWJlcnMgYmVsb25nIHRvLgotCi1TVUJTVUJTRUNUSU9OCi0JU3ltYm9sIHdyaXRpbmcKLQotCVdyaXRpbmcgYSBzeW1ib2wgdG8gYSBjb2ZmIGZpbGUgd2hpY2ggZGlkbid0IGNvbWUgZnJvbSBhIGNvZmYKLQlmaWxlIHdpbGwgbG9zZSBhbnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiBUaGUgQGNvZGV7YXN5bWJvbH0KLQlzdHJ1Y3R1cmUgcmVtZW1iZXJzIHRoZSBCRkQgZnJvbSB3aGljaCB0aGUgc3ltYm9sIHdhcyB0YWtlbiwgYW5kIG9uCi0Jb3V0cHV0IHRoZSBiYWNrIGVuZCBtYWtlcyBzdXJlIHRoYXQgdGhlIHNhbWUgZGVzdGluYXRpb24gdGFyZ2V0IGFzCi0Jc291cmNlIHRhcmdldCBpcyBwcmVzZW50LgotCi0JV2hlbiB0aGUgc3ltYm9scyBoYXZlIGNvbWUgZnJvbSBhIGNvZmYgZmlsZSB0aGVuIGFsbCB0aGUKLQlkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgcHJlc2VydmVkLgotCi0JU3ltYm9sIHRhYmxlcyBhcmUgcHJvdmlkZWQgZm9yIHdyaXRpbmcgdG8gdGhlIGJhY2sgZW5kIGluIGEKLQl2ZWN0b3Igb2YgcG9pbnRlcnMgdG8gcG9pbnRlcnMuIFRoaXMgYWxsb3dzIGFwcGxpY2F0aW9ucyBsaWtlCi0JdGhlIGxpbmtlciB0byBhY2N1bXVsYXRlIGFuZCBvdXRwdXQgbGFyZ2Ugc3ltYm9sIHRhYmxlcwotCXdpdGhvdXQgaGF2aW5nIHRvIGRvIHRvbyBtdWNoIGJ5dGUgY29weWluZy4KLQotCVRoaXMgZnVuY3Rpb24gcnVucyB0aHJvdWdoIHRoZSBwcm92aWRlZCBzeW1ib2wgdGFibGUgYW5kCi0JcGF0Y2hlcyBlYWNoIHN5bWJvbCBtYXJrZWQgYXMgYSBmaWxlIHBsYWNlIGhvbGRlcgotCShAY29kZXtDX0ZJTEV9KSB0byBwb2ludCB0byB0aGUgbmV4dCBmaWxlIHBsYWNlIGhvbGRlciBpbiB0aGUKLQlsaXN0LiBJdCBhbHNvIG1hcmtzIGVhY2ggQGNvZGV7b2Zmc2V0fSBmaWVsZCBpbiB0aGUgbGlzdCB3aXRoCi0JdGhlIG9mZnNldCBmcm9tIHRoZSBmaXJzdCBzeW1ib2wgb2YgdGhlIGN1cnJlbnQgc3ltYm9sLgotCi0JQW5vdGhlciBmdW5jdGlvbiBvZiB0aGlzIHByb2NlZHVyZSBpcyB0byB0dXJuIHRoZSBjYW5vbmljYWwKLQl2YWx1ZSBmb3JtIG9mIEJGRCBpbnRvIHRoZSBmb3JtIHVzZWQgYnkgY29mZi4gSW50ZXJuYWxseSwgQkZECi0JZXhwZWN0cyBzeW1ib2wgdmFsdWVzIHRvIGJlIG9mZnNldHMgZnJvbSBhIHNlY3Rpb24gYmFzZTsgc28gYQotCXN5bWJvbCBwaHlzaWNhbGx5IGF0IDB4MTIwLCBidXQgaW4gYSBzZWN0aW9uIHN0YXJ0aW5nIGF0Ci0JMHgxMDAsIHdvdWxkIGhhdmUgdGhlIHZhbHVlIDB4MjAuIENvZmYgZXhwZWN0cyBzeW1ib2xzIHRvCi0JY29udGFpbiB0aGVpciBmaW5hbCB2YWx1ZSwgc28gc3ltYm9scyBoYXZlIHRoZWlyIHZhbHVlcwotCWNoYW5nZWQgYXQgdGhpcyBwb2ludCB0byByZWZsZWN0IHRoZWlyIHN1bSB3aXRoIHRoZWlyIG93bmluZwotCXNlY3Rpb24uICBUaGlzIHRyYW5zZm9ybWF0aW9uIHVzZXMgdGhlCi0JPDxvdXRwdXRfc2VjdGlvbj4+IGZpZWxkIG9mIHRoZSBAY29kZXthc3ltYm9sfSdzCi0JQGNvZGV7YXNlY3Rpb259IEB4cmVme1NlY3Rpb25zfS4KLQotCW8gPDxjb2ZmX21hbmdsZV9zeW1ib2xzPj4KLQotCVRoaXMgcm91dGluZSBydW5zIHRob3VnaCB0aGUgcHJvdmlkZWQgc3ltYm9sIHRhYmxlIGFuZCB1c2VzCi0JdGhlIG9mZnNldHMgZ2VuZXJhdGVkIGJ5IHRoZSBwcmV2aW91cyBwYXNzIGFuZCB0aGUgcG9pbnRlcnMKLQlnZW5lcmF0ZWQgd2hlbiB0aGUgc3ltYm9sIHRhYmxlIHdhcyByZWFkIGluIHRvIGNyZWF0ZSB0aGUKLQlzdHJ1Y3R1cmVkIGhpZXJhY2h5IHJlcXVpcmVkIGJ5IGNvZmYuIEl0IGNoYW5nZXMgZWFjaCBwb2ludGVyCi0JdG8gYSBzeW1ib2wgaW50byB0aGUgaW5kZXggaW50byB0aGUgc3ltYm9sIHRhYmxlIG9mIHRoZSBhc3ltYm9sLgotCi0JbyA8PGNvZmZfd3JpdGVfc3ltYm9scz4+Ci0KLQlUaGlzIHJvdXRpbmUgcnVucyB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUgYW5kIHBhdGNoZXMgdXAgdGhlCi0Jc3ltYm9scyBmcm9tIHRoZWlyIGludGVybmFsIGZvcm0gaW50byB0aGUgY29mZiB3YXksIGNhbGxzIHRoZQotCWJpdCB0d2lkZGxlcnMsIGFuZCB3cml0ZXMgb3V0IHRoZSB0YWJsZSB0byB0aGUgZmlsZS4KLQotKi8KLQotLyoKLUlOVEVSTkFMX0RFRklOSVRJT04KLQljb2ZmX3N5bWJvbF90eXBlCi0KLURFU0NSSVBUSU9OCi0JVGhlIGhpZGRlbiBpbmZvcm1hdGlvbiBmb3IgYW4gPDxhc3ltYm9sPj4gaXMgZGVzY3JpYmVkIGluIGEKLQk8PGNvbWJpbmVkX2VudHJ5X3R5cGU+PjoKLQotQ09ERV9GUkFHTUVOVAotLgotLnR5cGVkZWYgc3RydWN0IGNvZmZfcHRyX3N0cnVjdAotLnsKLS4KLS4gICAgICAgeyogUmVtZW1iZXJzIHRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoZSBmaWxlIGZvcgotLiAgICAgICAgICB0aGlzIHN5bWJvbC4gR2VuZXJhdGVkIGJ5IGNvZmZfcmVudW1iZXJfc3ltYm9scy4gKn0KLS51bnNpZ25lZCBpbnQgb2Zmc2V0OwotLgotLiAgICAgICB7KiBTaG91bGQgdGhlIHZhbHVlIG9mIHRoaXMgc3ltYm9sIGJlIHJlbnVtYmVyZWQuICBVc2VkIGZvcgotLiAgICAgICAgICBYQ09GRiBDX0JTVEFUIHN5bWJvbHMuICBTZXQgYnkgY29mZl9zbHVycF9zeW1ib2xfdGFibGUuICAqfQotLnVuc2lnbmVkIGludCBmaXhfdmFsdWUgOiAxOwotLgotLiAgICAgICB7KiBTaG91bGQgdGhlIHRhZyBmaWVsZCBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLgotLiAgICAgICAgICBDcmVhdGVkIGJ5IGNvZmZfcG9pbnRlcml6ZV9hdXguICp9Ci0udW5zaWduZWQgaW50IGZpeF90YWcgOiAxOwotLgotLiAgICAgICB7KiBTaG91bGQgdGhlIGVuZGlkeCBmaWVsZCBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLgotLiAgICAgICAgICBDcmVhdGVkIGJ5IGNvZmZfcG9pbnRlcml6ZV9hdXguICp9Ci0udW5zaWduZWQgaW50IGZpeF9lbmQgOiAxOwotLgotLiAgICAgICB7KiBTaG91bGQgdGhlIHhfY3NlY3QueF9zY25sZW4gZmllbGQgYmUgcmVudW1iZXJlZC4KLS4gICAgICAgICAgQ3JlYXRlZCBieSBjb2ZmX3BvaW50ZXJpemVfYXV4LiAqfQotLnVuc2lnbmVkIGludCBmaXhfc2NubGVuIDogMTsKLS4KLS4gICAgICAgeyogRml4IHVwIGFuIFhDT0ZGIENfQklOQ0wvQ19FSU5DTCBzeW1ib2wuICBUaGUgdmFsdWUgaXMgdGhlCi0uICAgICAgICAgIGluZGV4IGludG8gdGhlIGxpbmUgbnVtYmVyIGVudHJpZXMuICBTZXQgYnkKLS4gICAgICAgICAgY29mZl9zbHVycF9zeW1ib2xfdGFibGUuICAqfQotLnVuc2lnbmVkIGludCBmaXhfbGluZSA6IDE7Ci0uCi0uICAgICAgIHsqIFRoZSBjb250YWluZXIgZm9yIHRoZSBzeW1ib2wgc3RydWN0dXJlIGFzIHJlYWQgYW5kIHRyYW5zbGF0ZWQKLS4gICAgICAgICAgIGZyb20gdGhlIGZpbGUuICp9Ci0uCi0udW5pb24gewotLiAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhlbnQ7Ci0uICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW1lbnQ7Ci0uIH0gdTsKLS59IGNvbWJpbmVkX2VudHJ5X3R5cGU7Ci0uCi0uCi0ueyogRWFjaCBjYW5vbmljYWwgYXN5bWJvbCByZWFsbHkgbG9va3MgbGlrZSB0aGlzOiAqfQotLgotLnR5cGVkZWYgc3RydWN0IGNvZmZfc3ltYm9sX3N0cnVjdAotLnsKLS4gICB7KiBUaGUgYWN0dWFsIHN5bWJvbCB3aGljaCB0aGUgcmVzdCBvZiBCRkQgd29ya3Mgd2l0aCAqfQotLmFzeW1ib2wgc3ltYm9sOwotLgotLiAgIHsqIEEgcG9pbnRlciB0byB0aGUgaGlkZGVuIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbCAqfQotLmNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZTsKLS4KLS4gICB7KiBBIHBvaW50ZXIgdG8gdGhlIGxpbmVudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoaXMgc3ltYm9sICp9Ci0uc3RydWN0IGxpbmVub19jYWNoZV9lbnRyeSAqbGluZW5vOwotLgotLiAgIHsqIEhhdmUgdGhlIGxpbmUgbnVtYmVycyBiZWVuIHJlbG9jYXRlZCB5ZXQgPyAqfQotLmJvb2xlYW4gZG9uZV9saW5lbm87Ci0ufSBjb2ZmX3N5bWJvbF90eXBlOwotCi0KLSovCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSNpbmNsdWRlICJwZWljb2RlLmgiCi0jZWxzZQotI2luY2x1ZGUgImNvZmZzd2FwLmgiCi0jZW5kaWYKLQotI2RlZmluZSBTVFJJTkdfU0laRV9TSVpFICg0KQotCi1zdGF0aWMgbG9uZyBzZWNfdG9fc3R5cF9mbGFncyBQQVJBTVMgKChjb25zdCBjaGFyICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgZmxhZ3dvcmQgc3R5cF90b19zZWNfZmxhZ3MgUEFSQU1TICgoYmZkICosIFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2JhZF9mb3JtYXRfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX25ld19zZWN0aW9uX2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfd3JpdGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfc2V0X2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgc2hvcnQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zZXRfYXJjaF9tYWNoCi0gIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIFBUUiBidXlfYW5kX3JlYWQgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyLCBpbnQsIHNpemVfdCkpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zbHVycF9saW5lX3RhYmxlIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zbHVycF9yZWxvY190YWJsZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGxvbmcgY29mZl9jYW5vbmljYWxpemVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLSNpZm5kZWYgY29mZl9ta29iamVjdF9ob29rCi1zdGF0aWMgUFRSIGNvZmZfbWtvYmplY3RfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSLCAgUFRSKSk7Ci0jZW5kaWYKLQwKLS8qIHZvaWQgd2FybmluZygpOyAqLwotCi0vKgotICogUmV0dXJuIGEgd29yZCB3aXRoIFNUWVBfKiAoc2NuaGRyLnNfZmxhZ3MpIGZsYWdzIHNldCB0byByZXByZXNlbnQgdGhlCi0gKiBpbmNvbWluZyBTRUNfKiBmbGFncy4gIFRoZSBpbnZlcnNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgc3R5cF90b19zZWNfZmxhZ3MoKS4KLSAqIE5PVEU6IElmIHlvdSBhZGQgdG8vY2hhbmdlIHRoaXMgcm91dGluZSwgeW91IHNob3VsZCBtaXJyb3IgdGhlIGNoYW5nZXMKLSAqIAlpbiBzdHlwX3RvX3NlY19mbGFncygpLgotICovCi1zdGF0aWMgbG9uZwotc2VjX3RvX3N0eXBfZmxhZ3MgKHNlY19uYW1lLCBzZWNfZmxhZ3MpCi0gICAgIENPTlNUIGNoYXIgKnNlY19uYW1lOwotICAgICBmbGFnd29yZCBzZWNfZmxhZ3M7Ci17Ci0gIGxvbmcgc3R5cF9mbGFncyA9IDA7Ci0KLSAgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfVEVYVCkpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfVEVYVDsKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfREFUQSkpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfREFUQTsKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfQlNTKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9CU1M7Ci0jaWZkZWYgX0NPTU1FTlQKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfQ09NTUVOVCkpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfSU5GTzsKLSNlbmRpZiAvKiBfQ09NTUVOVCAqLwotI2lmZGVmIF9MSUIKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfTElCKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9MSUI7Ci0jZW5kaWYgLyogX0xJQiAqLwotI2lmZGVmIF9MSVQKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfTElUKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9MSVQ7Ci0jZW5kaWYgLyogX0xJVCAqLwotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsICIuZGVidWciKSkKLSAgICB7Ci0jaWZkZWYgU1RZUF9ERUJVRwotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfREVCVUc7Ci0jZWxzZQotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfSU5GTzsKLSNlbmRpZgotICAgIH0KLSAgZWxzZSBpZiAoIXN0cm5jbXAgKHNlY19uYW1lLCAiLnN0YWIiLCA1KSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9JTkZPOwotICAgIH0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsICIuZWRhdGEiKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9EQVRBOwotICAgIH0KLSNlbmRpZgotI2lmZGVmIFJTNjAwMENPRkZfQwotICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgX1BBRCkpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfUEFEOwotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9MT0FERVIpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0xPQURFUjsKLSAgICB9Ci0jZW5kaWYKLSAgLyogVHJ5IGFuZCBmaWd1cmUgb3V0IHdoYXQgaXQgc2hvdWxkIGJlICovCi0gIGVsc2UgaWYgKHNlY19mbGFncyAmIFNFQ19DT0RFKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1RFWFQ7Ci0gICAgfQotICBlbHNlIGlmIChzZWNfZmxhZ3MgJiBTRUNfREFUQSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9EQVRBOwotICAgIH0KLSAgZWxzZSBpZiAoc2VjX2ZsYWdzICYgU0VDX1JFQURPTkxZKQotICAgIHsKLSNpZmRlZiBTVFlQX0xJVAkJCS8qIDI5ayByZWFkb25seSB0ZXh0L2RhdGEgc2VjdGlvbiAqLwotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfTElUOwotI2Vsc2UKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1RFWFQ7Ci0jZW5kaWYgLyogU1RZUF9MSVQgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHNlY19mbGFncyAmIFNFQ19MT0FEKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1RFWFQ7Ci0gICAgfQotICBlbHNlIGlmIChzZWNfZmxhZ3MgJiBTRUNfQUxMT0MpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfQlNTOwotICAgIH0KLQotI2lmZGVmIFNUWVBfTk9MT0FECi0gIGlmICgoc2VjX2ZsYWdzICYgKFNFQ19ORVZFUl9MT0FEIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkpKSAhPSAwKQotICAgIHN0eXBfZmxhZ3MgfD0gU1RZUF9OT0xPQUQ7Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotICBpZiAoc2VjX2ZsYWdzICYgU0VDX0xJTktfT05DRSkKLSAgICBzdHlwX2ZsYWdzIHw9IElNQUdFX1NDTl9MTktfQ09NREFUOwotI2VuZGlmCi0KLSAgcmV0dXJuIChzdHlwX2ZsYWdzKTsKLX0KLS8qCi0gKiBSZXR1cm4gYSB3b3JkIHdpdGggU0VDXyogZmxhZ3Mgc2V0IHRvIHJlcHJlc2VudCB0aGUgaW5jb21pbmcKLSAqIFNUWVBfKiBmbGFncyAoZnJvbSBzY25oZHIuc19mbGFncykuICAgVGhlIGludmVyc2Ugb2YgdGhpcwotICogZnVuY3Rpb24gaXMgc2VjX3RvX3N0eXBfZmxhZ3MoKS4KLSAqIE5PVEU6IElmIHlvdSBhZGQgdG8vY2hhbmdlIHRoaXMgcm91dGluZSwgeW91IHNob3VsZCBtaXJyb3IgdGhlIGNoYW5nZXMKLSAqICAgICAgaW4gc2VjX3RvX3N0eXBfZmxhZ3MoKS4KLSAqLwotc3RhdGljIGZsYWd3b3JkCi1zdHlwX3RvX3NlY19mbGFncyAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBoZHI7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmludGVybmFsX3MgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBoZHI7Ci0gIGxvbmcgc3R5cF9mbGFncyA9IGludGVybmFsX3MtPnNfZmxhZ3M7Ci0gIGZsYWd3b3JkIHNlY19mbGFncyA9IDA7Ci0KLSNpZmRlZiBTVFlQX05PTE9BRAotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfTk9MT0FEKQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLSAgICB9Ci0jZW5kaWYgLyogU1RZUF9OT0xPQUQgKi8KLQotICAvKiBGb3IgMzg2IENPRkYsIGF0IGxlYXN0LCBhbiB1bmxvYWRhYmxlIHRleHQgb3IgZGF0YSBzZWN0aW9uIGlzCi0gICAgIGFjdHVhbGx5IGEgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4gICovCi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9URVhUKQotICAgIHsKLSAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKLSAgICAgIGVsc2UKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0RBVEEpCi0gICAgewotICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3R5cF9mbGFncyAmIFNUWVBfQlNTKQotICAgIHsKLSNpZmRlZiBCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZCi0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotI2VuZGlmCi0Jc2VjX2ZsYWdzIHw9IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0lORk8pCi0gICAgewotICAgICAgLyogV2UgbWFyayB0aGVzZSBhcyBTRUNfREVCVUdHSU5HLCBidXQgb25seSBpZiBDT0ZGX1BBR0VfU0laRSBpcwotCSBkZWZpbmVkLiAgY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgdXNlcwotCSBDT0ZGX1BBR0VfU0laRSB0byBlbnN1cmUgdGhhdCB0aGUgbG93IG9yZGVyIGJpdHMgb2YgdGhlCi0JIHNlY3Rpb24gVk1BIGFuZCB0aGUgZmlsZSBvZmZzZXQgbWF0Y2guICBJZiB3ZSBkb24ndCBrbm93Ci0JIENPRkZfUEFHRV9TSVpFLCB3ZSBjYW4ndCBlbnN1cmUgdGhlIGNvcnJlY3QgY29ycmVzcG9uZGVuY2UsCi0JIGFuZCBkZW1hbmQgcGFnZSBsb2FkaW5nIG9mIHRoZSBmaWxlIHdpbGwgZmFpbC4gICovCi0jaWYgZGVmaW5lZCAoQ09GRl9QQUdFX1NJWkUpICYmICFkZWZpbmVkIChDT0ZGX0FMSUdOX0lOX1NfRkxBR1MpCi0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKLSNlbmRpZgotICAgIH0KLSAgZWxzZSBpZiAoc3R5cF9mbGFncyAmIFNUWVBfUEFEKQotICAgIHsKLSAgICAgIHNlY19mbGFncyA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9URVhUKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKLSAgICAgIGVsc2UKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RBVEEpID09IDApCi0gICAgewotICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfQlNTKSA9PSAwKQotICAgIHsKLSNpZmRlZiBCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZCi0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotI2VuZGlmCi0Jc2VjX2ZsYWdzIHw9IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5kZWJ1ZyIpID09IDAKLSNpZmRlZiBfQ09NTUVOVAotCSAgIHx8IHN0cmNtcCAobmFtZSwgX0NPTU1FTlQpID09IDAKLSNlbmRpZgotCSAgIHx8IHN0cm5jbXAgKG5hbWUsICIuc3RhYiIsIDUpID09IDApCi0gICAgewotI2lmZGVmIENPRkZfUEFHRV9TSVpFCi0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKLSNlbmRpZgotICAgIH0KLSNpZmRlZiBfTElCCi0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJQikgPT0gMCkKLSAgICA7Ci0jZW5kaWYKLSNpZmRlZiBfTElUCi0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJVCkgPT0gMCkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgPSBTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19SRUFET05MWTsKLSAgICB9Ci0jZW5kaWYKLSAgZWxzZQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLSAgICB9Ci0KLSNpZmRlZiBTVFlQX0xJVAkJCS8qIEEyOWsgcmVhZG9ubHkgdGV4dC9kYXRhIHNlY3Rpb24gdHlwZSAqLwotICBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX0xJVCkgPT0gU1RZUF9MSVQpCi0gICAgewotICAgICAgc2VjX2ZsYWdzID0gKFNFQ19MT0FEIHwgU0VDX0FMTE9DIHwgU0VDX1JFQURPTkxZKTsKLSAgICB9Ci0jZW5kaWYgLyogU1RZUF9MSVQgKi8KLSNpZmRlZiBTVFlQX09USEVSX0xPQUQJCS8qIE90aGVyIGxvYWRlZCBzZWN0aW9ucyAqLwotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfT1RIRVJfTE9BRCkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgPSAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpOwotICAgIH0KLSNlbmRpZiAvKiBTVFlQX1NEQVRBICovCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTE5LX1JFTU9WRSkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0KLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTE5LX0NPTURBVCkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfT05DRTsKLQotICAgICAgLyogVW5mb3J0dW5hdGVseSwgdGhlIFBFIGZvcm1hdCBzdG9yZXMgZXNzZW50aWFsIGluZm9ybWF0aW9uIGluCi0gICAgICAgICB0aGUgc3ltYm9sIHRhYmxlLCBvZiBhbGwgcGxhY2VzLiAgV2UgbmVlZCB0byBleHRyYWN0IHRoYXQKLSAgICAgICAgIGluZm9ybWF0aW9uIG5vdywgc28gdGhhdCBvYmpkdW1wIGFuZCB0aGUgbGlua2VyIHdpbGwga25vdyBob3cKLSAgICAgICAgIHRvIGhhbmRsZSB0aGUgc2VjdGlvbiB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IHRoZSBzeW1ib2xzLiAgV2UKLSAgICAgICAgIGNhbid0IGNhbGwgc2x1cnBfc3ltdGFiLCBiZWNhdXNlIHRoZSBsaW5rZXIgZG9lc24ndCB3YW50IHRoZQotICAgICAgICAgc3dhcHBlZCBzeW1ib2xzLiAgKi8KLQotICAgICAgLyogQ09NREFUIHNlY3Rpb25zIGFyZSBzcGVjaWFsLiAgVGhlIGZpcnN0IHN5bWJvbCBpcyB0aGUgc2VjdGlvbgotCSBzeW1ib2wsIHdoaWNoIHRlbGxzIHdoYXQga2luZCBvZiBDT01EQVQgc2VjdGlvbiBpdCBpcy4gIFRoZQotCSAqc2Vjb25kKiBzeW1ib2wgaXMgdGhlICJjb21kYXQgc3ltYm9sIiAtIHRoZSBvbmUgd2l0aCB0aGUKLQkgdW5pcXVlIG5hbWUuICBHTlUgdXNlcyB0aGUgc2VjdGlvbiBzeW1ib2wgZm9yIHRoZSB1bmlxdWUKLQkgbmFtZTsgTVMgdXNlcyAiLnRleHQiIGZvciBldmVyeSBjb21kYXQgc2VjdGlvbi4gIFNpZ2guICAtIERKICovCi0KLSAgICAgIGlmIChfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotCXsKLQkgIGJmZF9ieXRlICplc3ltLCAqZXN5bWVuZDsKLQotCSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKTsKLQkgIGVzeW1lbmQgPSBlc3ltICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogU1lNRVNaOwotCi0JICB3aGlsZSAoZXN5bSA8IGVzeW1lbmQpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07Ci0KLQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXN5bSwgKFBUUikgJmlzeW0pOwotCi0JICAgICAgaWYgKHNpemVvZiAoaW50ZXJuYWxfcy0+c19uYW1lKSA+IFNZTU5NTEVOKQotCQl7Ci0JCSAgLyogVGhpcyBjYXNlIGltcGxpZXMgdGhhdCB0aGUgbWF0Y2hpbmcgc3ltYm9sIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCi0JCSAgYWJvcnQgKCk7Ci0JCX0KLQotCSAgICAgIGlmIChpc3ltLm5fc2NsYXNzID09IENfU1RBVAotCQkgICYmIGlzeW0ubl90eXBlID09IFRfTlVMTAotCQkgICYmIGlzeW0ubl9udW1hdXggPT0gMSkKLQkJewotCQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0JCSAgY29uc3QgY2hhciAqc3ltbmFtZTsKLQotCQkgIHN5bW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZpc3ltLCBidWYpOwotCQkgIGlmIChzeW1uYW1lID09IE5VTEwpCi0JCSAgICBhYm9ydCAoKTsKLQotCQkgIGlmIChzdHJjbXAgKG5hbWUsIHN5bW5hbWUpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7Ci0KLQkJICAgICAgLyogVGhpcyBpcyB0aGUgc2VjdGlvbiBzeW1ib2wuICAqLwotCi0JCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCAoUFRSKSAoZXN5bSArIFNZTUVTWiksCi0JCQkJCSAgICBpc3ltLm5fdHlwZSwgaXN5bS5uX3NjbGFzcywKLQkJCQkJICAgIDAsIGlzeW0ubl9udW1hdXgsIChQVFIpICZhdXgpOwotCi0JCSAgICAgIC8qIEZJWE1FOiBNaWNyb3NvZnQgdXNlcyBOT0RVUExJQ0FURVMgYW5kCi0JCQkgQVNTT0NJQVRJVkUsIGJ1dCBnbnUgdXNlcyBBTlkgYW5kIFNBTUVfU0laRS4KLQkJCSBVbmZvcnR1bmF0ZWx5LCBnbnUgZG9lc24ndCBkbyB0aGUgY29tZGF0Ci0JCQkgc3ltYm9scyByaWdodC4gIFNvLCB1bnRpbCB3ZSBjYW4gZml4IGl0IHRvIGRvCi0JCQkgdGhlIHJpZ2h0IHRoaW5nLCB3ZSBhcmUgdGVtcG9yYXJpbHkgZGlzYWJsaW5nCi0JCQkgY29tZGF0cyBmb3IgdGhlIE1TIHR5cGVzICh0aGV5J3JlIHVzZWQgaW4KLQkJCSBETExzIGFuZCBDKyssIGJ1dCB3ZSBkb24ndCBzdXBwb3J0ICp0aGVpcioKLQkJCSBDKysgbGlicmFyaWVzIGFueXdheSAtIERKICovCi0KLQkJICAgICAgc3dpdGNoIChhdXgueF9zY24ueF9jb21kYXQpCi0JCQl7Ci0JCQljYXNlIElNQUdFX0NPTURBVF9TRUxFQ1RfTk9EVVBMSUNBVEVTOgotI2lmIDAKLQkJCSAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFk7Ci0jZWxzZQotCQkJICBzZWNfZmxhZ3MgJj0gflNFQ19MSU5LX09OQ0U7Ci0jZW5kaWYKLQkJCSAgYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQljYXNlIElNQUdFX0NPTURBVF9TRUxFQ1RfQU5ZOgotCQkJICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOwotCQkJICBicmVhazsKLQotCQkJY2FzZSBJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRToKLQkJCSAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFOwotCQkJICBicmVhazsKLQotCQkJY2FzZSBJTUFHRV9DT01EQVRfU0VMRUNUX0VYQUNUX01BVENIOgotCQkJICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTOwotCQkJICBicmVhazsKLQotCQkJY2FzZSBJTUFHRV9DT01EQVRfU0VMRUNUX0FTU09DSUFUSVZFOgotI2lmIDAKLQkJCSAgLyogRklYTUU6IFRoaXMgaXMgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4gICovCi0JCQkgIHNlY19mbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0jZWxzZQotCQkJICBzZWNfZmxhZ3MgJj0gflNFQ19MSU5LX09OQ0U7Ci0jZW5kaWYKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGVzeW0gKz0gKGlzeW0ubl9udW1hdXggKyAxKSAqIFNZTUVTWjsKLQkgICAgfQotCX0KLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gKHNlY19mbGFncyk7Ci19Ci0KLSNkZWZpbmUJZ2V0X2luZGV4KHN5bWJvbCkJKChzeW1ib2wpLT51ZGF0YS5pKQotCi0vKgotSU5URVJOQUxfREVGSU5JVElPTgotCWJmZF9jb2ZmX2JhY2tlbmRfZGF0YQotCi1DT0RFX0ZSQUdNRU5UCi0KLVNwZWNpYWwgZW50cnkgcG9pbnRzIGZvciBnZGIgdG8gc3dhcCBpbiBjb2ZmIHN5bWJvbCB0YWJsZSBwYXJ0czoKLS50eXBlZGVmIHN0cnVjdAotLnsKLS4gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9hdXhfaW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICAgICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICAgICAgICAgIGV4dCwKLS4gICAgICAgaW50ICAgICAgICAgICAgIHR5cGUsCi0uICAgICAgIGludCAgICAgICAgICAgICBjbGFzcywKLS4gICAgICAgaW50ICAgICAgICAgICAgIGluZGF1eCwKLS4gICAgICAgaW50ICAgICAgICAgICAgIG51bWF1eCwKLS4gICAgICAgUFRSICAgICAgICAgICAgIGluKSk7Ci0uCi0uICB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfc3ltX2luKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAgICAgICAgKmFiZmQgLAotLiAgICAgICBQVFIgICAgICAgICAgICAgZXh0LAotLiAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKLS4KLS4gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9saW5lbm9faW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICAgICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICAgICAgICAgZXh0LAotLiAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKLS4KLQotU3BlY2lhbCBlbnRyeSBwb2ludHMgZm9yIGdhcyB0byBzd2FwIG91dCBjb2ZmIHBhcnRzOgotCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2F1eF9vdXQpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAJKmFiZmQsCi0uICAgICAgIFBUUglpbiwKLS4gICAgICAgaW50ICAgIAl0eXBlLAotLiAgICAgICBpbnQgICAgCWNsYXNzLAotLiAgICAgICBpbnQgICAgIGluZGF1eCwKLS4gICAgICAgaW50ICAgICBudW1hdXgsCi0uICAgICAgIFBUUiAgICAJZXh0KSk7Ci0uCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3N5bV9vdXQpIFBBUkFNUyAoKAotLiAgICAgIGJmZCAgICAgICphYmZkLAotLiAgICAgIFBUUglpbiwKLS4gICAgICBQVFIJZXh0KSk7Ci0uCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2xpbmVub19vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgICAJKmFiZmQsCi0uICAgICAgCVBUUglpbiwKLS4JUFRSCWV4dCkpOwotLgotLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgICAgICphYmZkLAotLiAgICAgCVBUUglzcmMsCi0uCVBUUglkc3QpKTsKLS4KLS4gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgIAkqYWJmZCwKLS4JUFRSIAlpbiwKLS4JUFRSIAlvdXQpKTsKLS4KLS4gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgCSphYmZkLAotLglQVFIgCWluLAotLglQVFIJb3V0KSk7Ci0uCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgIAkqYWJmZCwKLS4gICAgICAJUFRSCWluLAotLglQVFIJb3V0KSk7Ci0uCi0KLVNwZWNpYWwgZW50cnkgcG9pbnRzIGZvciBnZW5lcmljIENPRkYgcm91dGluZXMgdG8gY2FsbCB0YXJnZXQKLWRlcGVuZGVudCBDT0ZGIHJvdXRpbmVzOgotCi0uIHVuc2lnbmVkIGludCBfYmZkX2ZpbGhzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfYW91dHN6OwotLiB1bnNpZ25lZCBpbnQgX2JmZF9zY25oc3o7Ci0uIHVuc2lnbmVkIGludCBfYmZkX3N5bWVzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfYXV4ZXN6OwotLiB1bnNpZ25lZCBpbnQgX2JmZF9yZWxzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfbGluZXN6OwotLiBib29sZWFuIF9iZmRfY29mZl9sb25nX2ZpbGVuYW1lczsKLS4gYm9vbGVhbiBfYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzOwotLiB1bnNpZ25lZCBpbnQgX2JmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXI7Ci0uIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICBleHQsCi0uICAgICAgIFBUUiAgICAgaW4pKTsKLS4gdm9pZCAoKl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfaW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGV4dCwKLS4gICAgICAgUFRSICAgICBpbikpOwotLiB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfc2NuaGRyX2luKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICBleHQsCi0uICAgICAgIFBUUiAgICAgaW4pKTsKLS4gdm9pZCAoKl9iZmRfY29mZl9zd2FwX3JlbG9jX2luKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICBleHQsCi0uICAgICAgIFBUUiAgICAgaW4pKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9iYWRfZm9ybWF0X2hvb2spIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIpKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIpKTsKLS4gUFRSICgqX2JmZF9jb2ZmX21rb2JqZWN0X2hvb2spIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIsCi0uICAgICAgIFBUUiAgICAgaW50ZXJuYWxfYW91dGhkcikpOwotLiBmbGFnd29yZCAoKl9iZmRfc3R5cF90b19zZWNfZmxhZ3NfaG9vaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgaW50ZXJuYWxfc2NuaGRyLAotLiAgICAgICBjb25zdCBjaGFyICpuYW1lKSk7Ci0uIHZvaWQgKCpfYmZkX3NldF9hbGlnbm1lbnRfaG9vaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIGFzZWN0aW9uICpzZWMsCi0uICAgICAgIFBUUiAgICAgaW50ZXJuYWxfc2NuaGRyKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCkpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0pKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wsCi0uICAgICAgIHVuc2lnbmVkIGludCBpbmRhdXgsCi0uICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eCkpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3ByaW50X2F1eCkgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqYWJmZCwKLS4gICAgICAgRklMRSAqZmlsZSwKLS4gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZSwKLS4gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXgsCi0uICAgICAgIHVuc2lnbmVkIGludCBpbmRhdXgpKTsKLS4gdm9pZCAoKl9iZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyLAotLiAgICAgICBhcmVsZW50ICpyZWxvYywKLS4gICAgICAgYmZkX2J5dGUgKmRhdGEsCi0uICAgICAgIHVuc2lnbmVkIGludCAqc3JjX3B0ciwKLS4gICAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyKSk7Ci0uIGludCAoKl9iZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLS4gICAgICAgYXJlbGVudCAqciwKLS4gICAgICAgdW5zaWduZWQgaW50IHNocmluaywKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbykpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3N5bV9pc19nbG9iYWwpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKmFiZmQsCi0uICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqYWJmZCkpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0uICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbikgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0uICAgICAgIGJmZCAqaW5wdXRfYmZkLAotLiAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLS4gICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jcywKLS4gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltcywKLS4gICAgICAgYXNlY3Rpb24gKipzZWN0aW9ucykpOwotLiByZWxvY19ob3d0b190eXBlICooKl9iZmRfY29mZl9ydHlwZV90b19ob3d0bykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqYWJmZCwKLS4gICAgICAgYXNlY3Rpb24gKnNlYywKLS4gICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWwsCi0uICAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCwKLS4gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltLAotLiAgICAgICBiZmRfdm1hICphZGRlbmRwKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfYWRqdXN0X3N5bW5keCkgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqb2JmZCwKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0uICAgICAgIGJmZCAqaWJmZCwKLS4gICAgICAgYXNlY3Rpb24gKnNlYywKLS4gICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYywKLS4gICAgICAgYm9vbGVhbiAqYWRqdXN0ZWRwKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCkgUEFSQU1TICgoCi0uICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotLiAgICAgICBiZmQgKmFiZmQsCi0uICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0uICAgICAgIGZsYWd3b3JkIGZsYWdzLCAKLS4gICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0uICAgICAgIGJmZF92bWEgdmFsdWUsCi0uICAgICAgIGNvbnN0IGNoYXIgKnN0cmluZywKLS4gICAgICAgYm9vbGVhbiBjb3B5LAotLiAgICAgICBib29sZWFuIGNvbGxlY3QsIAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwKSk7Ci0uCi0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKSBQQVJBTVMgKCgKLS4JYmZkICogYWJmZCwKLS4gICAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogcGZpbmZvKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KSBQQVJBTVMgKCgKLS4JYmZkICogYWJmZCwKLS4Jc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogcGZpbmZvKSk7Ci0uCi0ufSBiZmRfY29mZl9iYWNrZW5kX2RhdGE7Ci0uCi0uI2RlZmluZSBjb2ZmX2JhY2tlbmRfaW5mbyhhYmZkKSAoKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSAqKSAoYWJmZCktPnh2ZWMtPmJhY2tlbmRfZGF0YSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYXV4X2luKGEsZSx0LGMsaW5kLG51bSxpKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX3N3YXBfYXV4X2luKSAoYSxlLHQsYyxpbmQsbnVtLGkpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zeW1faW4oYSxlLGkpIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfc3dhcF9zeW1faW4pIChhLGUsaSkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX2xpbmVub19pbihhLGUsaSkgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoIGEpLT5fYmZkX2NvZmZfc3dhcF9saW5lbm9faW4pIChhLGUsaSkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX3JlbG9jX291dChhYmZkLCBpLCBvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0KSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQoYWJmZCwgaSwgbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2xpbmVub19vdXQpIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYXV4X291dChhLGksdCxjLGluZCxudW0sbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9zd2FwX2F1eF9vdXQpIChhLGksdCxjLGluZCxudW0sbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX3N5bV9vdXQoYWJmZCwgaSxvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfc3ltX291dCkgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0KGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQpIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQoYWJmZCwgaSxvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQpIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQoYWJmZCwgaSxvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQpIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX2ZpbGhzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2ZpbGhzeikKLS4jZGVmaW5lIGJmZF9jb2ZmX2FvdXRzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2FvdXRzeikKLS4jZGVmaW5lIGJmZF9jb2ZmX3NjbmhzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3NjbmhzeikKLS4jZGVmaW5lIGJmZF9jb2ZmX3N5bWVzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3N5bWVzeikKLS4jZGVmaW5lIGJmZF9jb2ZmX2F1eGVzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2F1eGVzeikKLS4jZGVmaW5lIGJmZF9jb2ZmX3JlbHN6KGFiZmQpICAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3JlbHN6KQotLiNkZWZpbmUgYmZkX2NvZmZfbGluZXN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfbGluZXN6KQotLiNkZWZpbmUgYmZkX2NvZmZfbG9uZ19maWxlbmFtZXMoYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2xvbmdfZmlsZW5hbWVzKQotLiNkZWZpbmUgYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzKGFiZmQpIFwKLS4gICAgICAgIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMpCi0uI2RlZmluZSBiZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyKGFiZmQpIFwKLS4JIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyKQotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luKGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4pIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbihhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luKSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX3Njbmhkcl9pbihhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4pIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfcmVsb2NfaW4oYWJmZCwgaSwgbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3JlbG9jX2luKSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9iYWRfZm9ybWF0X2hvb2soYWJmZCwgZmlsZWhkcikgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9iYWRfZm9ybWF0X2hvb2spIChhYmZkLCBmaWxlaGRyKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vayhhYmZkLCBmaWxlaGRyKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rKSAoYWJmZCwgZmlsZWhkcikpCi0uI2RlZmluZSBiZmRfY29mZl9ta29iamVjdF9ob29rKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9ta29iamVjdF9ob29rKSAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zdHlwX3RvX3NlY19mbGFnc19ob29rKGFiZmQsIHNjbmhkciwgbmFtZSlcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zdHlwX3RvX3NlY19mbGFnc19ob29rKSAoYWJmZCwgc2NuaGRyLCBuYW1lKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3NldF9hbGlnbm1lbnRfaG9vayhhYmZkLCBzZWMsIHNjbmhkcilcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zZXRfYWxpZ25tZW50X2hvb2spIChhYmZkLCBzZWMsIHNjbmhkcikpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUoYWJmZClcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyhhYmZkLCBzeW0pXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnKSAoYWJmZCwgc3ltKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3ByaW50X2F1eChhYmZkLCBmaWxlLCBiYXNlLCBzeW1ib2wsIGF1eCwgaW5kYXV4KVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcHJpbnRfYXV4KVwKLS4gICAgICAgICAoYWJmZCwgZmlsZSwgYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eCkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKVwKLS4gICAgICAgICAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwgZHN0X3B0cikpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKGFiZmQsIHNlY3Rpb24sIHJlbG9jLCBzaHJpbmssIGxpbmtfaW5mbylcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUpXAotLiAgICAgICAgIChhYmZkLCBzZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3ltX2lzX2dsb2JhbChhYmZkLCBzeW0pXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zeW1faXNfZ2xvYmFsKVwKLS4gICAgICAgICAoYWJmZCwgc3ltKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyhhYmZkKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKVwKLS4gICAgICAgICAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zdGFydF9maW5hbF9saW5rKG9iZmQsIGluZm8pXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAob2JmZCktPl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKVwKLS4gICAgICAgICAob2JmZCwgaW5mbykpCi0uI2RlZmluZSBiZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKG9iZmQsaW5mbyxpYmZkLG8sY29uLHJlbCxpc3ltcyxzZWNzKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGliZmQpLT5fYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbilcCi0uICAgICAgICAgKG9iZmQsIGluZm8sIGliZmQsIG8sIGNvbiwgcmVsLCBpc3ltcywgc2VjcykpCi0uI2RlZmluZSBiZmRfY29mZl9ydHlwZV90b19ob3d0byhhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcnR5cGVfdG9faG93dG8pXAotLiAgICAgICAgIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKSkKLS4jZGVmaW5lIGJmZF9jb2ZmX2FkanVzdF9zeW1uZHgob2JmZCwgaW5mbywgaWJmZCwgc2VjLCByZWwsIGFkanVzdGVkcClcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2FkanVzdF9zeW1uZHgpXAotLiAgICAgICAgIChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIHJlbCwgYWRqdXN0ZWRwKSkKLS4jZGVmaW5lIGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2woaW5mbyxhYmZkLG5hbWUsZmxhZ3Msc2VjdGlvbix2YWx1ZSxzdHJpbmcsY3AsY29sbCxoYXNocClcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wpXAotLiAgICAgICAgIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywgY3AsIGNvbGwsIGhhc2hwKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bihhLHApIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKSAoYSxwKSkKLS4jZGVmaW5lIGJmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdChhLHApIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KSAoYSxwKSkKLS4KLSovCi0KLS8qIFNlZSB3aGV0aGVyIHRoZSBtYWdpYyBudW1iZXIgbWF0Y2hlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2JhZF9mb3JtYXRfaG9vayAoYWJmZCwgZmlsZWhkcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgUFRSIGZpbGVoZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0KLSAgaWYgKEJBRE1BRyAoKmludGVybmFsX2YpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBpZiB0aGUgb3B0aW9uYWwgaGVhZGVyIGlzIE5VTEwgb3Igbm90IHRoZSBjb3JyZWN0IHNpemUgdGhlbgotICAgICBxdWl0OyB0aGUgb25seSBkaWZmZXJlbmNlIEkgY2FuIHNlZSBiZXR3ZWVuIG04OGsgZGd1eCBoZWFkZXJzIChNQzg4RE1BR0lDKQotICAgICBhbmQgSW50ZWwgOTYwIHJlYWR3cml0ZSBoZWFkZXJzIChJOTYwV1JNQUdJQykgaXMgdGhhdCB0aGUKLSAgICAgb3B0aW9uYWwgaGVhZGVyIGlzIG9mIGEgZGlmZmVyZW50IHNpemUuCi0KLSAgICAgQnV0IHRoZSBtaXBzIGtlZXBzIGV4dHJhIHN0dWZmIGluIGl0J3Mgb3B0aGRyLCBzbyBkb250IGNoZWNrCi0gICAgIHdoZW4gZG9pbmcgdGhhdAotICAgICAqLwotCi0jaWYgZGVmaW5lZChNODgpIHx8IGRlZmluZWQoSTk2MCkKLSAgaWYgKGludGVybmFsX2YtPmZfb3B0aGRyICE9IDAgJiYgQU9VVFNaICE9IGludGVybmFsX2YtPmZfb3B0aGRyKQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotICAgaW5pdGlhbGl6ZSBhIHNlY3Rpb24gc3RydWN0dXJlIHdpdGggaW5mb3JtYXRpb24gcGVjdWxpYXIgdG8gdGhpcwotICAgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBvZiBjb2ZmCi0qLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKiBhYmZkOwotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci17Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZTsKLQotICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVI7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT50ZXh0X2FsaWduX3Bvd2VyICE9IDAKLSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlY3Rpb24pLCAiLnRleHQiKSA9PSAwKQotICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHhjb2ZmX2RhdGEgKGFiZmQpLT50ZXh0X2FsaWduX3Bvd2VyOwotICBpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmRhdGFfYWxpZ25fcG93ZXIgIT0gMAotICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjdGlvbiksICIuZGF0YSIpID09IDApCi0gICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0geGNvZmZfZGF0YSAoYWJmZCktPmRhdGFfYWxpZ25fcG93ZXI7Ci0jZW5kaWYKLQotICAvKiBBbGxvY2F0ZSBhdXggcmVjb3JkcyBmb3Igc2VjdGlvbiBzeW1ib2xzLCB0byBzdG9yZSBzaXplIGFuZAotICAgICByZWxhdGVkIGluZm8uCi0KLSAgICAgQEAgVGhlIDEwIGlzIGEgZ3Vlc3MgYXQgYSBwbGF1c2libGUgbWF4aW11bSBudW1iZXIgb2YgYXV4IGVudHJpZXMKLSAgICAgKGJ1dCBzaG91bGRuJ3QgYmUgYSBjb25zdGFudCkuICAqLwotICBuYXRpdmUgPSAoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikKLQkgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChjb21iaW5lZF9lbnRyeV90eXBlKSAqIDEwKSk7Ci0gIGlmIChuYXRpdmUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogV2UgZG9uJ3QgbmVlZCB0byBzZXQgdXAgbl9uYW1lLCBuX3ZhbHVlLCBvciBuX3NjbnVtIGluIHRoZSBuYXRpdmUKLSAgICAgc3ltYm9sIGluZm9ybWF0aW9uLCBzaW5jZSB0aGV5J2xsIGJlIG92ZXJyaWRlbiBieSB0aGUgQkZEIHN5bWJvbAotICAgICBhbnlob3cuICBIb3dldmVyLCB3ZSBkbyBuZWVkIHRvIHNldCB0aGUgdHlwZSBhbmQgc3RvcmFnZSBjbGFzcywKLSAgICAgaW4gY2FzZSB0aGlzIHN5bWJvbCB3aW5kcyB1cCBnZXR0aW5nIHdyaXR0ZW4gb3V0LiAgVGhlIHZhbHVlIDAKLSAgICAgZm9yIG5fbnVtYXV4IGlzIGFscmVhZHkgY29ycmVjdC4gICovCi0KLSAgbmF0aXZlLT51LnN5bWVudC5uX3R5cGUgPSBUX05VTEw7Ci0gIG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSBDX1NUQVQ7Ci0KLSAgY29mZnN5bWJvbCAoc2VjdGlvbi0+c3ltYm9sKS0+bmF0aXZlID0gbmF0aXZlOwotCi0gIC8qIFRoZSAuc3RhYiBzZWN0aW9uIG11c3QgYmUgYWxpZ25lZCB0byAyKioyIGF0IG1vc3QsIGJlY2F1c2UKLSAgICAgb3RoZXJ3aXNlIHRoZXJlIG1heSBiZSBnYXBzIGluIHRoZSBzZWN0aW9uIHdoaWNoIGdkYiB3aWxsIG5vdAotICAgICBrbm93IGhvdyB0byBpbnRlcnByZXQuICBFeGFtaW5pbmcgdGhlIHNlY3Rpb24gbmFtZSBpcyBhIGhhY2ssIGJ1dAotICAgICB0aGF0IGlzIGFsc28gaG93IGdkYiBsb2NhdGVzIHRoZSBzZWN0aW9uLgotICAgICBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgLmN0b3JzIGFuZCAuZHRvcnMgc2VjdGlvbnMgc2ltaWxhcmx5LCB0bwotICAgICBhdm9pZCBpbnRyb2R1Y2luZyBudWxsIHdvcmRzIGluIHRoZSB0YWJsZXMuICAqLwotICBpZiAoQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSID4gMgotICAgICAgJiYgKHN0cm5jbXAgKHNlY3Rpb24tPm5hbWUsICIuc3RhYiIsIDUpID09IDAKLQkgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5jdG9ycyIpID09IDAKLQkgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5kdG9ycyIpID09IDApKQotICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgLyogU2ltaWxhcmx5LCB0aGUgLnN0YWJzdHIgc2VjdGlvbiBtdXN0IGJlIGFsaWduZWQgdG8gMioqMCBhdCBtb3N0LiAgKi8KLSAgaWYgKENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiA+IDAKLSAgICAgICYmIHN0cm5jbXAgKHNlY3Rpb24tPm5hbWUsICIuc3RhYnN0ciIsIDgpID09IDApCi0gICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmZGVmIENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIKLQotLyogU2V0IHRoZSBhbGlnbm1lbnQgb2YgYSBCRkQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkIGNvZmZfc2V0X2FsaWdubWVudF9ob29rIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQotc3RhdGljIHZvaWQKLWNvZmZfc2V0X2FsaWdubWVudF9ob29rIChhYmZkLCBzZWN0aW9uLCBzY25oZHIpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLSAgICAgUFRSIHNjbmhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqaGRyID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgc2NuaGRyOwotICB1bnNpZ25lZCBpbnQgaTsKLQotI2lmZGVmIEk5NjAKLSAgLyogRXh0cmFjdCBBTElHTiBmcm9tIDIqKkFMSUdOIHN0b3JlZCBpbiBzZWN0aW9uIGhlYWRlciAqLwotICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLSAgICBpZiAoKDEgPDwgaSkgPj0gaGRyLT5zX2FsaWduKQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBUSUM4MENPRkYKLSAgLyogVEkgdG9vbHMgaGlqYWNrIGJpdHMgOC0xMSBmb3IgdGhlIGFsaWdubWVudCAqLwotICBpID0gKGhkci0+c19mbGFncyA+PiA4KSAmIDB4RiA7Ci0jZW5kaWYKLSAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gaTsKLX0KLQotI2Vsc2UgLyogISBDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSICovCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0KLS8qIGEgY291cGxlIG9mIG1hY3JvcyB0byBoZWxwIHNldHRpbmcgdGhlIGFsaWdubWVudCBwb3dlciBmaWVsZCAqLwotI2RlZmluZSBBTElHTl9TRVQoZmllbGQseCx5KSBcCi0gIGlmICgoKGZpZWxkKSAmIElNQUdFX1NDTl9BTElHTl82NEJZVEVTKSA9PSB4IClcCi0gIHtcCi0gICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHk7XAotICB9Ci0KLSNkZWZpbmUgRUxJRkFMSUdOX1NFVChmaWVsZCx4LHkpIFwKLSAgZWxzZSBpZiAoKCAoZmllbGQpICYgSU1BR0VfU0NOX0FMSUdOXzY0QllURVMpID09IHggKSBcCi0gIHtcCi0gICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHk7XAotICB9Ci0KLXN0YXRpYyB2b2lkIGNvZmZfc2V0X2FsaWdubWVudF9ob29rIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQotc3RhdGljIHZvaWQKLWNvZmZfc2V0X2FsaWdubWVudF9ob29rIChhYmZkLCBzZWN0aW9uLCBzY25oZHIpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLSAgICAgUFRSIHNjbmhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqaGRyID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgc2NuaGRyOwotCi0gIEFMSUdOX1NFVCAgICAgKGhkci0+c19mbGFncywgSU1BR0VfU0NOX0FMSUdOXzY0QllURVMsIDYpCi0gIEVMSUZBTElHTl9TRVQgKGhkci0+c19mbGFncywgSU1BR0VfU0NOX0FMSUdOXzMyQllURVMsIDUpCi0gIEVMSUZBTElHTl9TRVQgKGhkci0+c19mbGFncywgSU1BR0VfU0NOX0FMSUdOXzE2QllURVMsIDQpCi0gIEVMSUZBTElHTl9TRVQgKGhkci0+c19mbGFncywgSU1BR0VfU0NOX0FMSUdOXzhCWVRFUywgIDMpCi0gIEVMSUZBTElHTl9TRVQgKGhkci0+c19mbGFncywgSU1BR0VfU0NOX0FMSUdOXzRCWVRFUywgIDIpCi0gIEVMSUZBTElHTl9TRVQgKGhkci0+c19mbGFncywgSU1BR0VfU0NOX0FMSUdOXzJCWVRFUywgIDEpCi0gIEVMSUZBTElHTl9TRVQgKGhkci0+c19mbGFncywgSU1BR0VfU0NOX0FMSUdOXzFCWVRFUywgIDApCi0KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0gIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIuaWRhdGEkMiIpID09IDApCi0gICAgewotICAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5pZGF0YSQzIikgPT0gMCkKLSAgICB7Ci0gICAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCAiLmlkYXRhJDQiKSA9PSAwKQotICAgIHsKLSAgICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDI7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIuaWRhdGEkNSIpID09IDApCi0gICAgewotICAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5pZGF0YSQ2IikgPT0gMCkKLSAgICB7Ci0gICAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCAiLnJlbG9jIikgPT0gMCkKLSAgICB7Ci0gICAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5zdGFiIiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gIC8qIEluIGEgUEUgaW1hZ2UgZmlsZSwgdGhlIHNfcGFkZHIgZmllbGQgaG9sZHMgdGhlIHZpcnR1YWwgc2l6ZSBvZiBhCi0gICAgIHNlY3Rpb24sIHdoaWxlIHRoZSBzX3NpemUgZmllbGQgaG9sZHMgdGhlIHJhdyBzaXplLiAgKi8KLSAgaWYgKGhkci0+c19wYWRkciAhPSAwKQotICAgIHsKLSAgICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbikgPT0gTlVMTCkKLQl7Ci0JICBzZWN0aW9uLT51c2VkX2J5X2JmZCA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogUmV0dXJuIGVycm9yLiAgKi8KLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWN0aW9uKSA9PSBOVUxMKQotCXsKLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWN0aW9uKS0+dGRhdGEgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWN0aW9uKS0+dGRhdGEgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBSZXR1cm4gZXJyb3IuICAqLwotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JfQotICAgICAgcGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbiktPnZpcnRfc2l6ZSA9IGhkci0+c19wYWRkcjsKLSAgICB9Ci0jZW5kaWYKLQotfQotI3VuZGVmIEFMSUdOX1NFVAotI3VuZGVmIEVMSUZBTElHTl9TRVQKLQotI2Vsc2UgLyogISBDT0ZGX1dJVEhfUEUgKi8KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLQotLyogV2UgZ3Jvc3NseSBhYnVzZSB0aGlzIGZ1bmN0aW9uIHRvIGhhbmRsZSBYQ09GRiBvdmVyZmxvdyBoZWFkZXJzLgotICAgV2hlbiB3ZSBzZWUgb25lLCB3ZSBjb3JyZWN0IHRoZSByZWxvYyBhbmQgbGluZSBudW1iZXIgY291bnRzIGluIHRoZQotICAgcmVhbCBoZWFkZXIsIGFuZCByZW1vdmUgdGhlIHNlY3Rpb24gd2UganVzdCBjcmVhdGVkLiAgKi8KLQotc3RhdGljIHZvaWQgY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi1zdGF0aWMgdm9pZAotY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgKGFiZmQsIHNlY3Rpb24sIHNjbmhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIHNjbmhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqaGRyID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgc2NuaGRyOwotICBhc2VjdGlvbiAqcmVhbF9zZWM7Ci0gIGFzZWN0aW9uICoqcHM7Ci0KLSAgaWYgKChoZHItPnNfZmxhZ3MgJiBTVFlQX09WUkZMTykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgcmVhbF9zZWMgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIGhkci0+c19ucmVsb2MpOwotICBpZiAocmVhbF9zZWMgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgcmVhbF9zZWMtPnJlbG9jX2NvdW50ID0gaGRyLT5zX3BhZGRyOwotICByZWFsX3NlYy0+bGluZW5vX2NvdW50ID0gaGRyLT5zX3ZhZGRyOwotCi0gIGZvciAocHMgPSAmYWJmZC0+c2VjdGlvbnM7ICpwcyAhPSBOVUxMOyBwcyA9ICYoKnBzKS0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKnBzID09IHNlY3Rpb24pCi0JewotCSAgKnBzID0gKCpwcyktPm5leHQ7Ci0JICAtLWFiZmQtPnNlY3Rpb25fY291bnQ7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0jZWxzZSAvKiAhIFJTNjAwMENPRkZfQyAqLwotCi0jZGVmaW5lIGNvZmZfc2V0X2FsaWdubWVudF9ob29rIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSkpIGJmZF92b2lkKQotCi0jZW5kaWYgLyogISBSUzYwMDBDT0ZGX0MgKi8KLSNlbmRpZiAvKiAhIENPRkZfV0lUSF9QRSAqLwotI2VuZGlmIC8qICEgQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUiAqLwotCi0jaWZuZGVmIGNvZmZfbWtvYmplY3QKLQotc3RhdGljIGJvb2xlYW4gY29mZl9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgY29mZl9kYXRhX3R5cGUgKmNvZmY7Ci0KLSAgYWJmZC0+dGRhdGEuY29mZl9vYmpfZGF0YSA9IChzdHJ1Y3QgY29mZl90ZGF0YSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGNvZmZfZGF0YV90eXBlKSk7Ci0gIGlmIChhYmZkLT50ZGF0YS5jb2ZmX29ial9kYXRhID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBjb2ZmID0gY29mZl9kYXRhIChhYmZkKTsKLSAgY29mZi0+c3ltYm9scyA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7Ci0gIGNvZmYtPmNvbnZlcnNpb25fdGFibGUgPSAodW5zaWduZWQgaW50ICopIE5VTEw7Ci0gIGNvZmYtPnJhd19zeW1lbnRzID0gKHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKikgTlVMTDsKLSAgY29mZi0+cmVsb2NiYXNlID0gMDsKLSAgY29mZi0+bG9jYWxfdG9jX3N5bV9tYXAgPSAwOwotCi0vKiAgbWFrZV9hYnNfc2VjdGlvbihhYmZkKTsqLwotCi0gIHJldHVybiB0cnVlOwotfQotI2VuZGlmCi0KLS8qIENyZWF0ZSB0aGUgQ09GRiBiYWNrZW5kIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KLSNpZm5kZWYgY29mZl9ta29iamVjdF9ob29rCi1zdGF0aWMgUFRSCi1jb2ZmX21rb2JqZWN0X2hvb2sgKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotICAgICBQVFIgYW91dGhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLSAgY29mZl9kYXRhX3R5cGUgKmNvZmY7Ci0KLSAgaWYgKGNvZmZfbWtvYmplY3QgKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiBOVUxMOwotCi0gIGNvZmYgPSBjb2ZmX2RhdGEgKGFiZmQpOwotCi0gIGNvZmYtPnN5bV9maWxlcG9zID0gaW50ZXJuYWxfZi0+Zl9zeW1wdHI7Ci0KLSAgLyogVGhlc2UgbWVtYmVycyBjb21tdW5pY2F0ZSBpbXBvcnRhbnQgY29uc3RhbnRzIGFib3V0IHRoZSBzeW1ib2wKLSAgICAgdGFibGUgdG8gR0RCJ3Mgc3ltYm9sLXJlYWRpbmcgY29kZS4gIFRoZXNlIGBjb25zdGFudHMnCi0gICAgIHVuZm9ydHVuYXRlbHkgdmFyeSBhbW9uZyBjb2ZmIGltcGxlbWVudGF0aW9ucy4uLiAgKi8KLSAgY29mZi0+bG9jYWxfbl9idG1hc2sgPSBOX0JUTUFTSzsKLSAgY29mZi0+bG9jYWxfbl9idHNoZnQgPSBOX0JUU0hGVDsKLSAgY29mZi0+bG9jYWxfbl90bWFzayA9IE5fVE1BU0s7Ci0gIGNvZmYtPmxvY2FsX25fdHNoaWZ0ID0gTl9UU0hJRlQ7Ci0gIGNvZmYtPmxvY2FsX3N5bWVzeiA9IFNZTUVTWjsKLSAgY29mZi0+bG9jYWxfYXV4ZXN6ID0gQVVYRVNaOwotICBjb2ZmLT5sb2NhbF9saW5lc3ogPSBMSU5FU1o7Ci0KLSAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpID0KLSAgICBvYmpfY29udl90YWJsZV9zaXplIChhYmZkKSA9Ci0gICAgICBpbnRlcm5hbF9mLT5mX25zeW1zOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGlmICgoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfU0hST0JKKSAhPSAwKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0gIGlmIChhb3V0aGRyICE9IE5VTEwgJiYgaW50ZXJuYWxfZi0+Zl9vcHRoZHIgPj0gQU9VVFNaKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICppbnRlcm5hbF9hID0KLQkoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikgYW91dGhkcjsKLSAgICAgIHN0cnVjdCB4Y29mZl90ZGF0YSAqeGNvZmY7Ci0KLSAgICAgIHhjb2ZmID0geGNvZmZfZGF0YSAoYWJmZCk7Ci0gICAgICB4Y29mZi0+ZnVsbF9hb3V0aGRyID0gdHJ1ZTsKLSAgICAgIHhjb2ZmLT50b2MgPSBpbnRlcm5hbF9hLT5vX3RvYzsKLSAgICAgIHhjb2ZmLT5zbnRvYyA9IGludGVybmFsX2EtPm9fc250b2M7Ci0gICAgICB4Y29mZi0+c25lbnRyeSA9IGludGVybmFsX2EtPm9fc25lbnRyeTsKLSAgICAgIHhjb2ZmLT50ZXh0X2FsaWduX3Bvd2VyID0gaW50ZXJuYWxfYS0+b19hbGdudGV4dDsKLSAgICAgIHhjb2ZmLT5kYXRhX2FsaWduX3Bvd2VyID0gaW50ZXJuYWxfYS0+b19hbGduZGF0YTsKLSAgICAgIHhjb2ZmLT5tb2R0eXBlID0gaW50ZXJuYWxfYS0+b19tb2R0eXBlOwotICAgICAgeGNvZmYtPmNwdXR5cGUgPSBpbnRlcm5hbF9hLT5vX2NwdXR5cGU7Ci0gICAgICB4Y29mZi0+bWF4ZGF0YSA9IGludGVybmFsX2EtPm9fbWF4ZGF0YTsKLSAgICAgIHhjb2ZmLT5tYXhzdGFjayA9IGludGVybmFsX2EtPm9fbWF4c3RhY2s7Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBBUk0gCi0gIC8qIFNldCB0aGUgZmxhZ3MgZmllbGQgZnJvbSB0aGUgQ09GRiBoZWFkZXIgcmVhZCBpbiAqLwotICBpZiAoISBfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBpbnRlcm5hbF9mLT5mX2ZsYWdzKSkKLSAgICBjb2ZmLT5mbGFncyA9IDA7Ci0jZW5kaWYKLSAgCi0gIHJldHVybiAoUFRSKSBjb2ZmOwotfQotI2VuZGlmCi0KLS8qIERldGVybWluZSB0aGUgbWFjaGluZSBhcmNoaXRlY3R1cmUgYW5kIHR5cGUuICBGSVhNRTogVGhpcyBpcyB0YXJnZXQKLSAgIGRlcGVuZGVudCBiZWNhdXNlIHRoZSBtYWdpYyBudW1iZXJzIGFyZSBkZWZpbmVkIGluIHRoZSB0YXJnZXQKLSAgIGRlcGVuZGVudCBoZWFkZXIgZmlsZXMuICBCdXQgdGhlcmUgaXMgbm8gcGFydGljdWxhciBuZWVkIGZvciB0aGlzLgotICAgSWYgdGhlIG1hZ2ljIG51bWJlcnMgd2VyZSBtb3ZlZCB0byBhIHNlcGFyYXRlIGZpbGUsIHRoaXMgZnVuY3Rpb24KLSAgIHdvdWxkIGJlIHRhcmdldCBpbmRlcGVuZGVudCBhbmQgd291bGQgYWxzbyBiZSBtdWNoIG1vcmUgc3VjY2Vzc2Z1bAotICAgYXQgbGlua2luZyB0b2dldGhlciBDT0ZGIGZpbGVzIGZvciBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3NldF9hcmNoX21hY2hfaG9vayAoYWJmZCwgZmlsZWhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLXsKLSAgbG9uZyBtYWNoaW5lOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLQotICBtYWNoaW5lID0gMDsKLSAgc3dpdGNoIChpbnRlcm5hbF9mLT5mX21hZ2ljKQotICAgIHsKLSNpZmRlZiBQUENNQUdJQwotICAgIGNhc2UgUFBDTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfcG93ZXJwYzsKLSAgICAgIG1hY2hpbmUgPSAwOyAvKiB3aGF0IGRvZXMgdGhpcyBtZWFuPyAoa3JrKSAqLwotICAgICAgYnJlYWs7IAotI2VuZGlmCi0jaWZkZWYgSTM4Nk1BR0lDCi0gICAgY2FzZSBJMzg2TUFHSUM6Ci0gICAgY2FzZSBJMzg2UFRYTUFHSUM6Ci0gICAgY2FzZSBJMzg2QUlYTUFHSUM6CQkvKiBEYW5idXJ5IFBTLzIgQUlYIEMgQ29tcGlsZXIgKi8KLSAgICBjYXNlIExZTlhDT0ZGTUFHSUM6CS8qIHNoYWRvd3MgdGhlIG02OGsgTHlueCBudW1iZXIgYmVsb3csIHNpZ2ggKi8KLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9pMzg2OwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEEyOUtfTUFHSUNfQklHCi0gICAgY2FzZSBBMjlLX01BR0lDX0JJRzoKLSAgICBjYXNlIEEyOUtfTUFHSUNfTElUVExFOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2EyOWs7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJNTUFHSUMKLSAgICBjYXNlIEFSTU1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2FybTsKLSAgICAgIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfQVJNX0FSQ0hJVEVDVFVSRV9NQVNLKQotCXsKLSAgICAgICAgY2FzZSBGX0FSTV8yOiAgbWFjaGluZSA9IGJmZF9tYWNoX2FybV8yOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRl9BUk1fMmE6IG1hY2hpbmUgPSBiZmRfbWFjaF9hcm1fMmE7IGJyZWFrOwotICAgICAgICBjYXNlIEZfQVJNXzM6ICBtYWNoaW5lID0gYmZkX21hY2hfYXJtXzM7ICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgY2FzZSBGX0FSTV8zTTogbWFjaGluZSA9IGJmZF9tYWNoX2FybV8zTTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgRl9BUk1fNDogIG1hY2hpbmUgPSBiZmRfbWFjaF9hcm1fNDsgIGJyZWFrOwotICAgICAgICBjYXNlIEZfQVJNXzRUOiBtYWNoaW5lID0gYmZkX21hY2hfYXJtXzRUOyBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIE1DNjhNQUdJQwotICAgIGNhc2UgTUM2OE1BR0lDOgotICAgIGNhc2UgTTY4TUFHSUM6Ci0jaWZkZWYgTUM2OEtCQ1NNQUdJQwotICAgIGNhc2UgTUM2OEtCQ1NNQUdJQzoKLSNlbmRpZgotI2lmZGVmIEFQT0xMT002OEtNQUdJQwotICAgIGNhc2UgQVBPTExPTTY4S01BR0lDOgotI2VuZGlmCi0jaWZkZWYgTFlOWENPRkZNQUdJQwotICAgIGNhc2UgTFlOWENPRkZNQUdJQzoKLSNlbmRpZgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfbTY4MDIwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBNQzg4TUFHSUMKLSAgICBjYXNlIE1DODhNQUdJQzoKLSAgICBjYXNlIE1DODhETUFHSUM6Ci0gICAgY2FzZSBNQzg4T01BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX204OGs7Ci0gICAgICBtYWNoaW5lID0gODgxMDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIFo4S01BR0lDCi0gICAgY2FzZSBaOEtNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF96OGs7Ci0gICAgICBzd2l0Y2ggKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX01BQ0hNQVNLKQotCXsKLQljYXNlIEZfWjgwMDE6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfejgwMDE7Ci0JICBicmVhazsKLQljYXNlIEZfWjgwMDI6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfejgwMDI7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgSTg2MAotICAgIGNhc2UgSTg2ME1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2k4NjA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEk5NjAKLSNpZmRlZiBJOTYwUk9NQUdJQwotICAgIGNhc2UgSTk2MFJPTUFHSUM6Ci0gICAgY2FzZSBJOTYwUldNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9pOTYwOwotICAgICAgc3dpdGNoIChGX0k5NjBUWVBFICYgaW50ZXJuYWxfZi0+Zl9mbGFncykKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIEZfSTk2MENPUkU6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jb3JlOwotCSAgYnJlYWs7Ci0JY2FzZSBGX0k5NjBLQjoKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2tiX3NiOwotCSAgYnJlYWs7Ci0JY2FzZSBGX0k5NjBNQzoKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX21jOwotCSAgYnJlYWs7Ci0JY2FzZSBGX0k5NjBYQToKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX3hhOwotCSAgYnJlYWs7Ci0JY2FzZSBGX0k5NjBDQToKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2NhOwotCSAgYnJlYWs7Ci0JY2FzZSBGX0k5NjBLQToKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2thX3NhOwotCSAgYnJlYWs7Ci0JY2FzZSBGX0k5NjBKWDoKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2p4OwotCSAgYnJlYWs7Ci0JY2FzZSBGX0k5NjBIWDoKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2h4OwotCSAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gICAgY2FzZSBVODAyUk9NQUdJQzoKLSAgICBjYXNlIFU4MDJXUk1BR0lDOgotICAgIGNhc2UgVTgwMlRPQ01BR0lDOgotICAgICAgewotCWludCBjcHV0eXBlOwotCi0JaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5jcHV0eXBlICE9IC0xKQotCSAgY3B1dHlwZSA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5jcHV0eXBlICYgMHhmZjsKLQllbHNlCi0JICB7Ci0JICAgIC8qIFdlIGRpZCBub3QgZ2V0IGEgdmFsdWUgZnJvbSB0aGUgYS5vdXQgaGVhZGVyLiAgSWYgdGhlCi0JICAgICAgIGZpbGUgaGFzIG5vdCBiZWVuIHN0cmlwcGVkLCB3ZSBtYXkgYmUgYWJsZSB0byBnZXQgdGhlCi0JICAgICAgIGFyY2hpdGVjdHVyZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaXJzdCBzeW1ib2wsIGlmIGl0Ci0JICAgICAgIGlzIGEgLmZpbGUgc3ltYm9sLiAgKi8KLQkgICAgaWYgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9PSAwKQotCSAgICAgIGNwdXR5cGUgPSAwOwotCSAgICBlbHNlCi0JICAgICAgewotCQliZmRfYnl0ZSBidWZbU1lNRVNaXTsKLQkJc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0KLQkJaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAotCQkgICAgfHwgYmZkX3JlYWQgKGJ1ZiwgMSwgU1lNRVNaLCBhYmZkKSAhPSBTWU1FU1opCi0JCSAgcmV0dXJuIGZhbHNlOwotCQljb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBidWYsIChQVFIpICZzeW0pOwotCQlpZiAoc3ltLm5fc2NsYXNzID09IENfRklMRSkKLQkJICBjcHV0eXBlID0gc3ltLm5fdHlwZSAmIDB4ZmY7Ci0JCWVsc2UKLQkJICBjcHV0eXBlID0gMDsKLQkgICAgICB9Ci0JICB9Ci0KLQkvKiBGSVhNRTogV2UgZG9uJ3QgaGFuZGxlIGFsbCBjYXNlcyBoZXJlLiAgKi8KLQlzd2l0Y2ggKGNwdXR5cGUpCi0JICB7Ci0JICBkZWZhdWx0OgotCSAgY2FzZSAwOgotI2lmZGVmIFBPV0VSTUFDCi0JICAgIC8qIFBvd2VyUEMgTWFjcyB1c2UgdGhlIHNhbWUgbWFnaWMgbnVtYmVycyBhcyBSUy82MDAwCi0JICAgICAgIChiZWNhdXNlIHRoYXQncyBob3cgdGhleSB3ZXJlIGJvb3RzdHJhcHBlZCBvcmlnaW5hbGx5KSwKLQkgICAgICAgYnV0IHRoZXkgYXJlIGFsd2F5cyBQb3dlclBDIGFyY2hpdGVjdHVyZS4gICovCi0JICAgIGFyY2ggPSBiZmRfYXJjaF9wb3dlcnBjOwotCSAgICBtYWNoaW5lID0gMDsKLSNlbHNlCi0JICAgIGFyY2ggPSBiZmRfYXJjaF9yczYwMDA7Ci0JICAgIG1hY2hpbmUgPSA2MDAwOwotI2VuZGlmIC8qIFBPV0VSTUFDICovCi0JICAgIGJyZWFrOwotCi0JICBjYXNlIDE6Ci0JICAgIGFyY2ggPSBiZmRfYXJjaF9wb3dlcnBjOwotCSAgICBtYWNoaW5lID0gNjAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjogLyogNjQgYml0IFBvd2VyUEMgKi8KLQkgICAgYXJjaCA9IGJmZF9hcmNoX3Bvd2VycGM7Ci0JICAgIG1hY2hpbmUgPSA2MjA7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAzOgotCSAgICBhcmNoID0gYmZkX2FyY2hfcG93ZXJwYzsKLQkgICAgbWFjaGluZSA9IDA7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA0OgotCSAgICBhcmNoID0gYmZkX2FyY2hfcnM2MDAwOwotCSAgICBtYWNoaW5lID0gNjAwMDsKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgV0UzMktNQUdJQwotICAgIGNhc2UgV0UzMktNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF93ZTMyazsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIEg4MzAwTUFHSUMKLSAgICBjYXNlIEg4MzAwTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaDgzMDA7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfaDgzMDA7Ci0gICAgICAvKiAhISBGSVhNRSB0aGlzIHByb2JhYmx5IGlzbid0IHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyAqLwotICAgICAgYWJmZC0+ZmxhZ3MgfD0gQkZEX0lTX1JFTEFYQUJMRTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBIODMwMEhNQUdJQwotICAgIGNhc2UgSDgzMDBITUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaDgzMDA7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfaDgzMDBoOwotICAgICAgLyogISEgRklYTUUgdGhpcyBwcm9iYWJseSBpc24ndCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgKi8KLSAgICAgIGFiZmQtPmZsYWdzIHw9IEJGRF9JU19SRUxBWEFCTEU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgSDgzMDBTTUFHSUMKLSAgICBjYXNlIEg4MzAwU01BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2g4MzAwOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX2g4MzAwczsKLSAgICAgIC8qICEhIEZJWE1FIHRoaXMgcHJvYmFibHkgaXNuJ3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzICovCi0gICAgICBhYmZkLT5mbGFncyB8PSBCRkRfSVNfUkVMQVhBQkxFOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFNIX0FSQ0hfTUFHSUNfQklHCi0gICAgY2FzZSBTSF9BUkNIX01BR0lDX0JJRzoKLSAgICBjYXNlIFNIX0FSQ0hfTUFHSUNfTElUVExFOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3NoOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgSDg1MDBNQUdJQwotICAgIGNhc2UgSDg1MDBNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9oODUwMDsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFNQQVJDTUFHSUMKLSAgICBjYXNlIFNQQVJDTUFHSUM6Ci0jaWZkZWYgTFlOWENPRkZNQUdJQwotICAgIGNhc2UgTFlOWENPRkZNQUdJQzoKLSNlbmRpZgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3NwYXJjOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgVElDMzBNQUdJQwotICAgIGNhc2UgVElDMzBNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF90aWMzMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBUSUM4MF9BUkNIX01BR0lDCi0gICAgY2FzZSBUSUM4MF9BUkNIX01BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3RpYzgwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIE1DT1JFTUFHSUMKLSAgICBjYXNlIE1DT1JFTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbWNvcmU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6CQkJLyogVW5yZWFkYWJsZSBpbnB1dCBmaWxlIHR5cGUgKi8KLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9vYnNjdXJlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmZGVmIFNZTU5BTUVfSU5fREVCVUcKLQotc3RhdGljIGJvb2xlYW4gc3ltbmFtZV9pbl9kZWJ1Z19ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLQotc3RhdGljIGJvb2xlYW4KLXN5bW5hbWVfaW5fZGVidWdfaG9vayAoYWJmZCwgc3ltKQotICAgICBiZmQgKiBhYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci17Ci0gIHJldHVybiBTWU1OQU1FX0lOX0RFQlVHIChzeW0pID8gdHJ1ZSA6IGZhbHNlOwotfQotCi0jZWxzZQotCi0jZGVmaW5lIHN5bW5hbWVfaW5fZGVidWdfaG9vayBcCi0gIChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSkpIGJmZF9mYWxzZQotCi0jZW5kaWYKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotCi0vKiBIYW5kbGUgdGhlIGNzZWN0IGF1eGVudCBvZiBhIENfRVhUIG9yIENfSElERVhUIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vawotICBQQVJBTVMgKChiZmQgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosCi0JICAgdW5zaWduZWQgaW50LCBjb21iaW5lZF9lbnRyeV90eXBlICopKTsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotY29mZl9wb2ludGVyaXplX2F1eF9ob29rIChhYmZkLCB0YWJsZV9iYXNlLCBzeW1ib2wsIGluZGF1eCwgYXV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2U7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50IGluZGF1eDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4OwotewotICBpbnQgY2xhc3MgPSBzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzOwotCi0gIGlmICgoY2xhc3MgPT0gQ19FWFQgfHwgY2xhc3MgPT0gQ19ISURFWFQpCi0gICAgICAmJiBpbmRhdXggKyAxID09IHN5bWJvbC0+dS5zeW1lbnQubl9udW1hdXgpCi0gICAgewotICAgICAgaWYgKFNNVFlQX1NNVFlQIChhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbXR5cCkgPT0gWFRZX0xEKQotCXsKLQkgIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5wID0KLQkgICAgdGFibGVfYmFzZSArIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5sOwotCSAgYXV4LT5maXhfc2NubGVuID0gMTsKLQl9Ci0KLSAgICAgIC8qIFJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIGNhbGxlciBzaG91bGQgbm90IGRvIGFueQotICAgICAgICAgZnVydGhlciB3b3JrIG9uIHRoaXMgYXV4ZW50LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBSZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGF1eGVudCBzaG91bGQgYmUgaGFuZGxlZCBieQotICAgICB0aGUgY2FsbGVyLiAgKi8KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0jZWxzZQotI2lmZGVmIEk5NjAKLQotLyogV2UgZG9uJ3Qgd2FudCB0byBwb2ludGVyaXplIGJhbCBlbnRyaWVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gY29mZl9wb2ludGVyaXplX2F1eF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwKLQkgICB1bnNpZ25lZCBpbnQsIGNvbWJpbmVkX2VudHJ5X3R5cGUgKikpOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2sgKGFiZmQsIHRhYmxlX2Jhc2UsIHN5bWJvbCwgaW5kYXV4LCBhdXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZTsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgaW5kYXV4OwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXg7Ci17Ci0gIC8qIFJldHVybiB0cnVlIGlmIHdlIGRvbid0IHdhbnQgdG8gcG9pbnRlcml6ZSB0aGlzIGF1eCBlbnRyeSwgd2hpY2gKLSAgICAgaXMgdGhlIGNhc2UgZm9yIHRoZSBsYXN0Zmlyc3QgYXV4IGVudHJ5IGZvciBhIENfTEVBRlBST0Mgc3ltYm9sLiAgKi8KLSAgcmV0dXJuIChpbmRhdXggPT0gMQotCSAgJiYgKHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19MRUFGUFJPQwotCSAgICAgIHx8IHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19MRUFGU1RBVAotCSAgICAgIHx8IHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19MRUFGRVhUKSk7Ci19Ci0KLSNlbHNlIC8qICEgSTk2MCAqLwotCi0jZGVmaW5lIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayAwCi0KLSNlbmRpZiAvKiAhIEk5NjAgKi8KLSNlbmRpZiAvKiAhIFJTNjAwMENPRkZfQyAqLwotCi0vKiBQcmludCBhbiBhdXggZW50cnkuICBUaGlzIHJldHVybnMgdHJ1ZSBpZiBpdCBoYXMgcHJpbnRlZCBpdC4gICovCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfcHJpbnRfYXV4Ci0gIFBBUkFNUyAoKGJmZCAqLCBGSUxFICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLAotCSAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgdW5zaWduZWQgaW50KSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3ByaW50X2F1eCAoYWJmZCwgZmlsZSwgdGFibGVfYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eCkKLSAgICAgYmZkICphYmZkOwotICAgICBGSUxFICpmaWxlOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2w7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eDsKLSAgICAgdW5zaWduZWQgaW50IGluZGF1eDsKLXsKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgaWYgKChzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRVhUCi0gICAgICAgfHwgc3ltYm9sLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0hJREVYVCkKLSAgICAgICYmIGluZGF1eCArIDEgPT0gc3ltYm9sLT51LnN5bWVudC5uX251bWF1eCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgY3NlY3QgZW50cnkuICAqLwotICAgICAgZnByaW50ZiAoZmlsZSwgIkFVWCAiKTsKLSAgICAgIGlmIChTTVRZUF9TTVRZUCAoYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc210eXApICE9IFhUWV9MRCkKLQl7Ci0JICBCRkRfQVNTRVJUICghIGF1eC0+Zml4X3Njbmxlbik7Ci0JICBmcHJpbnRmIChmaWxlLCAidmFsICU1bGQiLCBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ubCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwcmludGYgKGZpbGUsICJpbmR4ICIpOwotCSAgaWYgKCEgYXV4LT5maXhfc2NubGVuKQotCSAgICBmcHJpbnRmIChmaWxlLCAiJTRsZCIsIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5sKTsKLQkgIGVsc2UKLQkgICAgZnByaW50ZiAoZmlsZSwgIiU0bGQiLAotCQkgICAgIChsb25nKSAoYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc2NubGVuLnAgLSB0YWJsZV9iYXNlKSk7Ci0JfQotICAgICAgZnByaW50ZiAoZmlsZSwKLQkgICAgICAgIiBwcm1oc2ggJWxkIHNuaHNoICV1IHR5cCAlZCBhbGduICVkIGNsc3MgJXUgc3RiICVsZCBzbnN0YiAldSIsCi0JICAgICAgIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Bhcm1oYXNoLAotCSAgICAgICAodW5zaWduZWQgaW50KSBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbmhhc2gsCi0JICAgICAgIFNNVFlQX1NNVFlQIChhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbXR5cCksCi0JICAgICAgIFNNVFlQX0FMSUdOIChhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbXR5cCksCi0JICAgICAgICh1bnNpZ25lZCBpbnQpIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3NtY2xhcywKLQkgICAgICAgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc3RhYiwKLQkgICAgICAgKHVuc2lnbmVkIGludCkgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc25zdGFiKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIFJldHVybiBmYWxzZSB0byBpbmRpY2F0ZSB0aGF0IG5vIHNwZWNpYWwgYWN0aW9uIHdhcyB0YWtlbi4gICovCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoKLVNVQlNVQlNFQ1RJT04KLQlXcml0aW5nIHJlbG9jYXRpb25zCi0KLQlUbyB3cml0ZSByZWxvY2F0aW9ucywgdGhlIGJhY2sgZW5kIHN0ZXBzIHRob3VnaCB0aGUKLQljYW5vbmljYWwgcmVsb2NhdGlvbiB0YWJsZSBhbmQgY3JlYXRlIGFuCi0JQGNvZGV7aW50ZXJuYWxfcmVsb2N9LiBUaGUgc3ltYm9sIGluZGV4IHRvIHVzZSBpcyByZW1vdmVkIGZyb20KLQl0aGUgQGNvZGV7b2Zmc2V0fSBmaWVsZCBpbiB0aGUgc3ltYm9sIHRhYmxlIHN1cHBsaWVkLiAgVGhlCi0JYWRkcmVzcyBjb21lcyBkaXJlY3RseSBmcm9tIHRoZSBzdW0gb2YgdGhlIHNlY3Rpb24gYmFzZQotCWFkZHJlc3MgYW5kIHRoZSByZWxvY2F0aW9uIG9mZnNldDsgdGhlIHR5cGUgaXMgZHVnIGRpcmVjdGx5Ci0JZnJvbSB0aGUgaG93dG8gZmllbGQuICBUaGVuIHRoZSBAY29kZXtpbnRlcm5hbF9yZWxvY30gaXMKLQlzd2FwcGVkIGludG8gdGhlIHNoYXBlIG9mIGFuIEBjb2Rle2V4dGVybmFsX3JlbG9jfSBhbmQgd3JpdHRlbgotCW91dCB0byBkaXNrLgotCi0qLwotCi0jaWZkZWYgVEFSR19BVVgKLQotc3RhdGljIGludCBjb21wYXJlX2FyZWxlbnRfcHRyIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLS8qIEFVWCdzIGxkIHdhbnRzIHJlbG9jYXRpb25zIHRvIGJlIHNvcnRlZCAqLwotc3RhdGljIGludAotY29tcGFyZV9hcmVsZW50X3B0ciAoeCwgeSkKLSAgICAgY29uc3QgUFRSIHg7Ci0gICAgIGNvbnN0IFBUUiB5OwotewotICBjb25zdCBhcmVsZW50ICoqYSA9IChjb25zdCBhcmVsZW50ICoqKSB4OwotICBjb25zdCBhcmVsZW50ICoqYiA9IChjb25zdCBhcmVsZW50ICoqKSB5OwotICBiZmRfc2l6ZV90eXBlIGFhZHIgPSAoKmEpLT5hZGRyZXNzOwotICBiZmRfc2l6ZV90eXBlIGJhZHIgPSAoKmIpLT5hZGRyZXNzOwotCi0gIHJldHVybiAoYWFkciA8IGJhZHIgPyAtMSA6IGJhZHIgPCBhYWRyID8gMSA6IDApOwotfQotCi0jZW5kaWYgLyogVEFSR19BVVggKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfd3JpdGVfcmVsb2NzIChhYmZkLCBmaXJzdF91bmRlZikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgaW50IGZpcnN0X3VuZGVmOwotewotICBhc2VjdGlvbiAqczsKLQotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgZHN0OwotICAgICAgYXJlbGVudCAqKnA7Ci0KLSNpZm5kZWYgVEFSR19BVVgKLSAgICAgIHAgPSBzLT5vcmVsb2NhdGlvbjsKLSNlbHNlCi0gICAgICAvKiBzb3J0IHJlbG9jYXRpb25zIGJlZm9yZSB3ZSB3cml0ZSB0aGVtIG91dCAqLwotICAgICAgcCA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jIChzLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gICAgICBpZiAocCA9PSBOVUxMICYmIHMtPnJlbG9jX2NvdW50ID4gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBtZW1jcHkgKHAsIHMtPm9yZWxvY2F0aW9uLCBzLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gICAgICBxc29ydCAocCwgcy0+cmVsb2NfY291bnQsIHNpemVvZiAoYXJlbGVudCAqKSwgY29tcGFyZV9hcmVsZW50X3B0cik7Ci0jZW5kaWYKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnJlbG9jX2NvdW50OyBpKyspCi0JewotCSAgc3RydWN0IGludGVybmFsX3JlbG9jIG47Ci0JICBhcmVsZW50ICpxID0gcFtpXTsKLQkgIG1lbXNldCAoKFBUUikgJiBuLCAwLCBzaXplb2YgKG4pKTsKLQotCSAgLyogTm93IHdlJ3ZlIHJlbnVtYmVyZWQgdGhlIHN5bWJvbHMgd2Uga25vdyB3aGVyZSB0aGUKLQkgICAgIHVuZGVmaW5lZCBzeW1ib2xzIGxpdmUgaW4gdGhlIHRhYmxlLiAgQ2hlY2sgdGhlIHJlbG9jCi0JICAgICBlbnRyaWVzIGZvciBzeW1ib2xzIHdobydzIG91dHB1dCBiZmQgaXNuJ3QgdGhlIHJpZ2h0IG9uZS4KLQkgICAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgc3ltYm9sIHdhcyB1bmRlZmluZWQgKHdoaWNoIG1lYW5zCi0JICAgICB0aGF0IGFsbCB0aGUgcG9pbnRlcnMgYXJlIG5ldmVyIG1hZGUgdG8gcG9pbnQgdG8gdGhlIHNhbWUKLQkgICAgIHBsYWNlKS4gVGhpcyBpcyBhIGJhZCB0aGluZywnY2F1c2UgdGhlIHN5bWJvbHMgYXR0YWNoZWQKLQkgICAgIHRvIHRoZSBvdXRwdXQgYmZkIGFyZSBpbmRleGVkLCBzbyB0aGF0IHRoZSByZWxvY2F0aW9uCi0JICAgICBlbnRyaWVzIGtub3cgd2hpY2ggc3ltYm9sIGluZGV4IHRoZXkgcG9pbnQgdG8uICBTbyB3ZQotCSAgICAgaGF2ZSB0byBsb29rIHVwIHRoZSBvdXRwdXQgc3ltYm9sIGhlcmUuICovCi0KLQkgIGlmIChxLT5zeW1fcHRyX3B0clswXS0+dGhlX2JmZCAhPSBhYmZkKQotCSAgICB7Ci0JICAgICAgaW50IGk7Ci0JICAgICAgY29uc3QgY2hhciAqc25hbWUgPSBxLT5zeW1fcHRyX3B0clswXS0+bmFtZTsKLQkgICAgICBhc3ltYm9sICoqb3V0c3ltcyA9IGFiZmQtPm91dHN5bWJvbHM7Ci0JICAgICAgZm9yIChpID0gZmlyc3RfdW5kZWY7IG91dHN5bXNbaV07IGkrKykKLQkJewotCQkgIGNvbnN0IGNoYXIgKmludGFibGUgPSBvdXRzeW1zW2ldLT5uYW1lOwotCQkgIGlmIChzdHJjbXAgKGludGFibGUsIHNuYW1lKSA9PSAwKSB7Ci0JCSAgICAvKiBnb3QgYSBoaXQsIHNvIHJlcG9pbnQgdGhlIHJlbG9jICovCi0JCSAgICBxLT5zeW1fcHRyX3B0ciA9IG91dHN5bXMgKyBpOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQl9Ci0JICAgIH0KLQotCSAgbi5yX3ZhZGRyID0gcS0+YWRkcmVzcyArIHMtPnZtYTsKLQotI2lmZGVmIFJfSUhDT05TVAotCSAgLyogVGhlIDI5ayBjb25zdC9jb25zdGggcmVsb2MgcGFpciBpcyBhIHJlYWwga2x1ZGdlLiAgVGhlIGNvbnN0aAotCSAgICAgcGFydCBkb2Vzbid0IGhhdmUgYSBzeW1ib2w7IGl0IGhhcyBhbiBvZmZzZXQuICBTbyByZWJ1aWx0Ci0JICAgICB0aGF0IGhlcmUuICAqLwotCSAgaWYgKHEtPmhvd3RvLT50eXBlID09IFJfSUhDT05TVCkKLQkgICAgbi5yX3N5bW5keCA9IHEtPmFkZGVuZDsKLQkgIGVsc2UKLSNlbmRpZgotCSAgICBpZiAocS0+c3ltX3B0cl9wdHIpCi0JICAgICAgewotCQlpZiAocS0+c3ltX3B0cl9wdHIgPT0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHIpCi0JCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGFic29sdXRlIHN5bWJvbC4gICovCi0JCSAgbi5yX3N5bW5keCA9IC0xOwotCQllbHNlCi0JCSAgewotCQkgICAgbi5yX3N5bW5keCA9IGdldF9pbmRleCAoKCoocS0+c3ltX3B0cl9wdHIpKSk7Ci0JCSAgICAvKiBUYWtlIG5vdGljZSBpZiB0aGUgc3ltYm9sIHJlbG9jIHBvaW50cyB0byBhIHN5bWJvbAotCQkgICAgICAgd2UgZG9uJ3QgaGF2ZSBpbiBvdXIgc3ltYm9sIHRhYmxlLiAgV2hhdCBzaG91bGQgd2UKLQkJICAgICAgIGRvIGZvciB0aGlzPz8gICovCi0JCSAgICBpZiAobi5yX3N5bW5keCA+IG9ial9jb252X3RhYmxlX3NpemUgKGFiZmQpKQotCQkgICAgICBhYm9ydCAoKTsKLQkJICB9Ci0JICAgICAgfQotCi0jaWZkZWYgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUCi0JICBuLnJfb2Zmc2V0ID0gcS0+YWRkZW5kOwotI2VuZGlmCi0KLSNpZmRlZiBTRUxFQ1RfUkVMT0MKLQkgIC8qIFdvcmsgb3V0IHJlbG9jIHR5cGUgZnJvbSB3aGF0IGlzIHJlcXVpcmVkICovCi0JICBTRUxFQ1RfUkVMT0MgKG4sIHEtPmhvd3RvKTsKLSNlbHNlCi0JICBuLnJfdHlwZSA9IHEtPmhvd3RvLT50eXBlOwotI2VuZGlmCi0JICBjb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAmbiwgJmRzdCk7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIGRzdCwgMSwgUkVMU1osIGFiZmQpICE9IFJFTFNaKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0jaWZkZWYgVEFSR19BVVgKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JZnJlZSAocCk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCBmbGFncyBhbmQgbWFnaWMgbnVtYmVyIG9mIGEgY29mZiBmaWxlIGZyb20gYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lCi0gICB0eXBlLiAgUmVzdWx0IGlzIHRydWUgaWYgd2UgY2FuIHJlcHJlc2VudCB0aGUgYXJjaCZ0eXBlLCBmYWxzZSBpZiBub3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zZXRfZmxhZ3MgKGFiZmQsIG1hZ2ljcCwgZmxhZ3NwKQotICAgICBiZmQgKiBhYmZkOwotICAgICB1bnNpZ25lZCBpbnQgKm1hZ2ljcDsKLSAgICAgdW5zaWduZWQgc2hvcnQgKmZsYWdzcDsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSNpZmRlZiBaOEtNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfejhrOgotICAgICAgKm1hZ2ljcCA9IFo4S01BR0lDOwotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQljYXNlIGJmZF9tYWNoX3o4MDAxOgotCSAgKmZsYWdzcCA9IEZfWjgwMDE7Ci0JICBicmVhazsKLQljYXNlIGJmZF9tYWNoX3o4MDAyOgotCSAgKmZsYWdzcCA9IEZfWjgwMDI7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHJldHVybiB0cnVlOwotI2VuZGlmCi0jaWZkZWYgSTk2MFJPTUFHSUMKLQotICAgIGNhc2UgYmZkX2FyY2hfaTk2MDoKLQotICAgICAgewotCXVuc2lnbmVkIGZsYWdzOwotCSptYWdpY3AgPSBJOTYwUk9NQUdJQzsKLQkvKgotCSAgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MoYWJmZCkgJiBXUF9URVhUKSA/IEk5NjBST01BR0lDIDoKLQkgIEk5NjBSV01BR0lDKTsgICBGSVhNRT8/PwotCSAgKi8KLQlzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0JICB7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfY29yZToKLQkgICAgZmxhZ3MgPSBGX0k5NjBDT1JFOwotCSAgICBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfaTk2MF9rYl9zYjoKLQkgICAgZmxhZ3MgPSBGX0k5NjBLQjsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfbWM6Ci0JICAgIGZsYWdzID0gRl9JOTYwTUM7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX3hhOgotCSAgICBmbGFncyA9IEZfSTk2MFhBOwotCSAgICBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfaTk2MF9jYToKLQkgICAgZmxhZ3MgPSBGX0k5NjBDQTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfa2Ffc2E6Ci0JICAgIGZsYWdzID0gRl9JOTYwS0E7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX2p4OgotCSAgICBmbGFncyA9IEZfSTk2MEpYOwotCSAgICBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfaTk2MF9oeDoKLQkgICAgZmxhZ3MgPSBGX0k5NjBIWDsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JKmZsYWdzcCA9IGZsYWdzOwotCXJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFRJQzMwTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX3RpYzMwOgotICAgICAgKm1hZ2ljcCA9IFRJQzMwTUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotI2lmZGVmIFRJQzgwX0FSQ0hfTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX3RpYzgwOgotICAgICAgKm1hZ2ljcCA9IFRJQzgwX0FSQ0hfTUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotI2lmZGVmIEFSTU1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9hcm06Ci0gICAgICAqIG1hZ2ljcCA9IEFSTU1BR0lDOwotICAgICAgKiBmbGFnc3AgPSAwOwotICAgICAgaWYgKEFQQ1NfU0VUIChhYmZkKSkKLQl7Ci0JICBpZiAoQVBDU18yNl9GTEFHIChhYmZkKSkKLQkgICAgKiBmbGFnc3AgfD0gRl9BUENTMjY7Ci0JICAKLQkgIGlmIChBUENTX0ZMT0FUX0ZMQUcgKGFiZmQpKQotCSAgICAqIGZsYWdzcCB8PSBGX0FQQ1NfRkxPQVQ7Ci0JICAKLQkgIGlmIChQSUNfRkxBRyAoYWJmZCkpCi0JICAgICogZmxhZ3NwIHw9IEZfUElDOwotCX0KLSAgICAgIGlmIChJTlRFUldPUktfU0VUIChhYmZkKSAmJiBJTlRFUldPUktfRkxBRyAoYWJmZCkpCi0JKiBmbGFnc3AgfD0gRl9JTlRFUldPUks7Ci0gICAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0JewotCWNhc2UgYmZkX21hY2hfYXJtXzI6ICAqIGZsYWdzcCB8PSBGX0FSTV8yOyAgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9hcm1fMmE6ICogZmxhZ3NwIHw9IEZfQVJNXzJhOyBicmVhazsKLQljYXNlIGJmZF9tYWNoX2FybV8zOiAgKiBmbGFnc3AgfD0gRl9BUk1fMzsgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfYXJtXzNNOiAqIGZsYWdzcCB8PSBGX0FSTV8zTTsgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9hcm1fNDogICogZmxhZ3NwIHw9IEZfQVJNXzQ7ICBicmVhazsKLQljYXNlIGJmZF9tYWNoX2FybV80VDogKiBmbGFnc3AgfD0gRl9BUk1fNFQ7IGJyZWFrOwotCX0KLSAgICAgIHJldHVybiB0cnVlOwotI2VuZGlmCi0jaWZkZWYgUFBDTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6Ci0gICAgICAqbWFnaWNwID0gUFBDTUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgSTM4Nk1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgKm1hZ2ljcCA9IEkzODZNQUdJQzsKLSNpZmRlZiBMWU5YT1MKLSAgICAgIC8qIEp1c3Qgb3ZlcndyaXRlIHRoZSB1c3VhbCB2YWx1ZSBpZiB3ZSdyZSBkb2luZyBMeW54LiAqLwotICAgICAgKm1hZ2ljcCA9IExZTlhDT0ZGTUFHSUM7Ci0jZW5kaWYKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBJODYwTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX2k4NjA6Ci0gICAgICAqbWFnaWNwID0gSTg2ME1BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIE1DNjhNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSNpZmRlZiBBUE9MTE9NNjhLTUFHSUMKLSAgICAgICptYWdpY3AgPSBBUE9MTE9fQ09GRl9WRVJTSU9OX05VTUJFUjsKLSNlbHNlCi0gICAgICAvKiBOQU1FU19IQVZFX1VOREVSU0NPUkUgbWF5IGJlIGRlZmluZWQgYnkgY29mZi11NjhrLmMuICAqLwotI2lmZGVmIE5BTUVTX0hBVkVfVU5ERVJTQ09SRQotICAgICAgKm1hZ2ljcCA9IE1DNjhLQkNTTUFHSUM7Ci0jZWxzZQotICAgICAgKm1hZ2ljcCA9IE1DNjhNQUdJQzsKLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgTFlOWE9TCi0gICAgICAvKiBKdXN0IG92ZXJ3cml0ZSB0aGUgdXN1YWwgdmFsdWUgaWYgd2UncmUgZG9pbmcgTHlueC4gKi8KLSAgICAgICptYWdpY3AgPSBMWU5YQ09GRk1BR0lDOwotI2VuZGlmCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBNQzg4TUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX204OGs6Ci0gICAgICAqbWFnaWNwID0gTUM4OE9NQUdJQzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBIODMwME1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9oODMwMDoKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JY2FzZSBiZmRfbWFjaF9oODMwMDoKLQkgICptYWdpY3AgPSBIODMwME1BR0lDOwotCSAgcmV0dXJuIHRydWU7Ci0JY2FzZSBiZmRfbWFjaF9oODMwMGg6Ci0JICAqbWFnaWNwID0gSDgzMDBITUFHSUM7Ci0JICByZXR1cm4gdHJ1ZTsKLQljYXNlIGJmZF9tYWNoX2g4MzAwczoKLQkgICptYWdpY3AgPSBIODMwMFNNQUdJQzsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBTSF9BUkNIX01BR0lDX0JJRwotICAgIGNhc2UgYmZkX2FyY2hfc2g6Ci0gICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotCSptYWdpY3AgPSBTSF9BUkNIX01BR0lDX0JJRzsKLSAgICAgIGVsc2UKLQkqbWFnaWNwID0gU0hfQVJDSF9NQUdJQ19MSVRUTEU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBTUEFSQ01BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgICptYWdpY3AgPSBTUEFSQ01BR0lDOwotI2lmZGVmIExZTlhPUwotICAgICAgLyogSnVzdCBvdmVyd3JpdGUgdGhlIHVzdWFsIHZhbHVlIGlmIHdlJ3JlIGRvaW5nIEx5bnguICovCi0gICAgICAqbWFnaWNwID0gTFlOWENPRkZNQUdJQzsKLSNlbmRpZgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgSDg1MDBNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfaDg1MDA6Ci0gICAgICAqbWFnaWNwID0gSDg1MDBNQUdJQzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBMjlLX01BR0lDX0JJRwotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JKm1hZ2ljcCA9IEEyOUtfTUFHSUNfQklHOwotICAgICAgZWxzZQotCSptYWdpY3AgPSBBMjlLX01BR0lDX0xJVFRMRTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFdFMzJLTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX3dlMzJrOgotICAgICAgKm1hZ2ljcCA9IFdFMzJLTUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBVODAyVE9DTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX3JzNjAwMDoKLSNpZm5kZWYgUFBDTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6Ci0jZW5kaWYKLSAgICAgICptYWdpY3AgPSBVODAyVE9DTUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBNQ09SRU1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9tY29yZToKLSAgICAgICogbWFnaWNwID0gTUNPUkVNQUdJQzsKLSAgICAgIHJldHVybiB0cnVlOwotI2VuZGlmCi0gICAgICAKLSAgICBkZWZhdWx0OgkJCS8qIFVua25vd24gYXJjaGl0ZWN0dXJlICovCi0gICAgICAvKiByZXR1cm4gZmFsc2U7ICAtLSBmYWxsIHRocm91Z2ggdG8gInJldHVybiBmYWxzZSIgYmVsb3csIHRvIGF2b2lkCi0gICAgICAgInN0YXRlbWVudCBuZXZlciByZWFjaGVkIiBlcnJvcnMgb24gdGhlIG9uZSBiZWxvdy4gKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgdW5zaWduZWQgZHVtbXkxOwotICB1bnNpZ25lZCBzaG9ydCBkdW1teTI7Ci0KLSAgaWYgKCEgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhcmNoICE9IGJmZF9hcmNoX3Vua25vd24gJiYKLSAgICAgIGNvZmZfc2V0X2ZsYWdzIChhYmZkLCAmZHVtbXkxLCAmZHVtbXkyKSAhPSB0cnVlKQotICAgIHJldHVybiBmYWxzZTsJCS8qIFdlIGNhbid0IHJlcHJlc2VudCB0aGlzIHR5cGUgKi8KLQotICByZXR1cm4gdHJ1ZTsJCQkvKiBXZSdyZSBlYXN5IC4uLiAqLwotfQotCi0KLS8qIENhbGN1bGF0ZSB0aGUgZmlsZSBwb3NpdGlvbiBmb3IgZWFjaCBzZWN0aW9uLiAqLwotCi0jaWZuZGVmIEk5NjAKLSNkZWZpbmUgQUxJR05fU0VDVElPTlNfSU5fRklMRQotI2VuZGlmCi0jaWZkZWYgVElDODBDT0ZGCi0jdW5kZWYgQUxJR05fU0VDVElPTlNfSU5fRklMRQotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIGFzZWN0aW9uICpwcmV2aW91cyA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBmaWxlX3B0ciBzb2ZhciA9IEZJTEhTWjsKLSAgYm9vbGVhbiBhbGlnbl9hZGp1c3Q7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSNpZmRlZiBBTElHTl9TRUNUSU9OU19JTl9GSUxFCi0gIGZpbGVfcHRyIG9sZF9zb2ZhcjsKLSNlbmRpZgotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIC8qIE9uIFhDT0ZGLCBpZiB3ZSBoYXZlIHN5bWJvbHMsIHNldCB1cCB0aGUgLmRlYnVnIHNlY3Rpb24uICAqLwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPiAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3o7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGksIHN5bWNvdW50OwotICAgICAgYXN5bWJvbCAqKnN5bXA7Ci0KLSAgICAgIHN6ID0gMDsKLSAgICAgIHN5bWNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gICAgICBmb3IgKHN5bXAgPSBhYmZkLT5vdXRzeW1ib2xzLCBpID0gMDsgaSA8IHN5bWNvdW50OyBzeW1wKyssIGkrKykKLQl7Ci0JICBjb2ZmX3N5bWJvbF90eXBlICpjZjsKLQotCSAgY2YgPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCAqc3ltcCk7Ci0JICBpZiAoY2YgIT0gTlVMTAotCSAgICAgICYmIGNmLT5uYXRpdmUgIT0gTlVMTAotCSAgICAgICYmIFNZTU5BTUVfSU5fREVCVUcgKCZjZi0+bmF0aXZlLT51LnN5bWVudCkpCi0JICAgIHsKLQkgICAgICBzaXplX3QgbGVuOwotCi0JICAgICAgbGVuID0gc3RybGVuIChiZmRfYXN5bWJvbF9uYW1lICgqc3ltcCkpOwotCSAgICAgIGlmIChsZW4gPiBTWU1OTUxFTikKLQkJc3ogKz0gbGVuICsgMzsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzeiA+IDApCi0JewotCSAgYXNlY3Rpb24gKmRzZWM7Ci0KLQkgIGRzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuZGVidWciKTsKLQkgIGlmIChkc2VjID09IE5VTEwpCi0JICAgIGFib3J0ICgpOwotCSAgZHNlYy0+X3Jhd19zaXplID0gc3o7Ci0JICBkc2VjLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICBpbnQgcGFnZV9zaXplOwotICBpZiAoY29mZl9kYXRhIChhYmZkKS0+bGlua19pbmZvKSAKLSAgICB7Ci0gICAgICBwYWdlX3NpemUgPSBwZV9kYXRhIChhYmZkKS0+cGVfb3B0aGRyLkZpbGVBbGlnbm1lbnQ7Ci0gICAgfQotICBlbHNlCi0gICAgcGFnZV9zaXplID0gUEVfREVGX0ZJTEVfQUxJR05NRU5UOwotI2Vsc2UKLSNpZmRlZiBDT0ZGX1BBR0VfU0laRQotICBpbnQgcGFnZV9zaXplID0gQ09GRl9QQUdFX1NJWkU7Ci0jZW5kaWYKLSNlbmRpZgotCi0gIGlmIChiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qICBBIHN0YXJ0IGFkZHJlc3MgbWF5IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgb3JpZ2luYWwgZmlsZS4gSW4gdGhpcwotCSAgY2FzZSBpdCB3aWxsIG5lZWQgYW4gb3B0aW9uYWwgaGVhZGVyIHRvIHJlY29yZCBpdC4gICovCi0gICAgICBhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0gICAgfQotCi0gIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICBzb2ZhciArPSBBT1VUU1o7Ci0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGVsc2UgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5mdWxsX2FvdXRoZHIpCi0gICAgc29mYXIgKz0gQU9VVFNaOwotICBlbHNlCi0gICAgc29mYXIgKz0gU01BTExfQU9VVFNaOwotI2VuZGlmCi0KLSAgc29mYXIgKz0gYWJmZC0+c2VjdGlvbl9jb3VudCAqIFNDTkhTWjsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICAvKiBYQ09GRiBoYW5kbGVzIG92ZXJmbG93cyBpbiB0aGUgcmVsb2MgYW5kIGxpbmUgbnVtYmVyIGNvdW50IGZpZWxkcwotICAgICBieSBhbGxvY2F0aW5nIGEgbmV3IHNlY3Rpb24gaGVhZGVyIHRvIGhvbGQgdGhlIGNvcnJlY3QgY291bnRzLiAgKi8KLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50ID49IDB4ZmZmZiB8fCBjdXJyZW50LT5saW5lbm9fY291bnQgPj0gMHhmZmZmKQotICAgICAgc29mYXIgKz0gU0NOSFNaOwotI2VuZGlmCi0KLSAgYWxpZ25fYWRqdXN0ID0gZmFsc2U7Ci0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zLCBjb3VudCA9IDE7Ci0gICAgICAgY3VycmVudCAhPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCwgKytjb3VudCkKLSAgICB7Ci0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gICAgICAvKiBUaGUgTlQgbG9hZGVyIGRvZXMgbm90IHdhbnQgZW1wdHkgc2VjdGlvbiBoZWFkZXJzLCBzbyB3ZSBvbWl0Ci0gICAgICAgICB0aGVtLiAgV2UgZG9uJ3QgYWN0dWFsbHkgcmVtb3ZlIHRoZSBzZWN0aW9uIGZyb20gdGhlIEJGRCwKLSAgICAgICAgIGFsdGhvdWdoIHdlIHByb2JhYmx5IHNob3VsZC4gIFRoaXMgbWF0Y2hlcyBjb2RlIGluCi0gICAgICAgICBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cy4gICovCi0gICAgICBpZiAoY3VycmVudC0+X3Jhd19zaXplID09IDApCi0JewotCSAgY3VycmVudC0+dGFyZ2V0X2luZGV4ID0gLTE7Ci0JICAtLWNvdW50OwotCSAgY29udGludWU7Ci0JfQotI2VuZGlmCi0KLSAgICAgIGN1cnJlbnQtPnRhcmdldF9pbmRleCA9IGNvdW50OwotCi0gICAgICAvKiBPbmx5IGRlYWwgd2l0aCBzZWN0aW9ucyB3aGljaCBoYXZlIGNvbnRlbnRzICovCi0gICAgICBpZiAoIShjdXJyZW50LT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBBbGlnbiB0aGUgc2VjdGlvbnMgaW4gdGhlIGZpbGUgdG8gdGhlIHNhbWUgYm91bmRhcnkgb24KLQkgd2hpY2ggdGhleSBhcmUgYWxpZ25lZCBpbiB2aXJ0dWFsIG1lbW9yeS4gIEk5NjAgZG9lc24ndAotCSBkbyB0aGlzIChGSVhNRSkgc28gd2UgY2FuIHN0YXkgaW4gc3luYyB3aXRoIEludGVsLiAgOTYwCi0JIGRvZXNuJ3QgeWV0IHBhZ2UgZnJvbSBmaWxlcy4uLiAqLwotI2lmZGVmIEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUKLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApICE9IDApCi0JewotCSAgLyogbWFrZSBzdXJlIHRoaXMgc2VjdGlvbiBpcyBhbGlnbmVkIG9uIHRoZSByaWdodCBib3VuZGFyeSAtIGJ5Ci0JICAgICBwYWRkaW5nIHRoZSBwcmV2aW91cyBzZWN0aW9uIHVwIGlmIG5lY2Vzc2FyeSAqLwotCi0JICBvbGRfc29mYXIgPSBzb2ZhcjsKLQkgIHNvZmFyID0gQkZEX0FMSUdOIChzb2ZhciwgMSA8PCBjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXIpOwotCSAgaWYgKHByZXZpb3VzICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgcHJldmlvdXMtPl9yYXdfc2l6ZSArPSBzb2ZhciAtIG9sZF9zb2ZhcjsKLQkgICAgfQotCX0KLQotI2VuZGlmCi0KLSAgICAgIC8qIEluIGRlbWFuZCBwYWdlZCBmaWxlcyB0aGUgbG93IG9yZGVyIGJpdHMgb2YgdGhlIGZpbGUgb2Zmc2V0Ci0JIG11c3QgbWF0Y2ggdGhlIGxvdyBvcmRlciBiaXRzIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3MuICAqLwotI2lmZGVmIENPRkZfUEFHRV9TSVpFCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMAotCSAgJiYgKGN1cnJlbnQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCXNvZmFyICs9IChjdXJyZW50LT52bWEgLSBzb2ZhcikgJSBwYWdlX3NpemU7Ci0jZW5kaWYKLSAgICAgIGN1cnJlbnQtPmZpbGVwb3MgPSBzb2ZhcjsKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgLyogV2l0aCBQRSB3ZSBoYXZlIHRvIHBhZCBlYWNoIHNlY3Rpb24gdG8gYmUgYSBtdWx0aXBsZSBvZiBpdHMKLQkgcGFnZSBzaXplIHRvbywgYW5kIHJlbWVtYmVyIGJvdGggc2l6ZXMuICAqLwotCi0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpID09IE5VTEwpCi0JewotCSAgY3VycmVudC0+dXNlZF9ieV9iZmQgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChjdXJyZW50LT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpID09IE5VTEwpCi0JewotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT50ZGF0YSA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhKSk7Ci0JICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT50ZGF0YSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT52aXJ0X3NpemUgPT0gMCkKLQlwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KS0+dmlydF9zaXplID0gY3VycmVudC0+X3Jhd19zaXplOwotCi0gICAgICBjdXJyZW50LT5fcmF3X3NpemUgPSAoY3VycmVudC0+X3Jhd19zaXplICsgcGFnZV9zaXplIC0xKSAmIC1wYWdlX3NpemU7Ci0jZW5kaWYKLQotICAgICAgc29mYXIgKz0gY3VycmVudC0+X3Jhd19zaXplOwotCi0jaWZkZWYgQUxJR05fU0VDVElPTlNfSU5fRklMRQotICAgICAgLyogbWFrZSBzdXJlIHRoYXQgdGhpcyBzZWN0aW9uIGlzIG9mIHRoZSByaWdodCBzaXplIHRvbyAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgPT0gMCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIG9sZF9zaXplOwotCi0JICBvbGRfc2l6ZSA9IGN1cnJlbnQtPl9yYXdfc2l6ZTsKLQkgIGN1cnJlbnQtPl9yYXdfc2l6ZSA9IEJGRF9BTElHTiAoY3VycmVudC0+X3Jhd19zaXplLAotCQkJCQkgIDEgPDwgY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyKTsKLQkgIGFsaWduX2FkanVzdCA9IGN1cnJlbnQtPl9yYXdfc2l6ZSAhPSBvbGRfc2l6ZTsKLQkgIHNvZmFyICs9IGN1cnJlbnQtPl9yYXdfc2l6ZSAtIG9sZF9zaXplOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvbGRfc29mYXIgPSBzb2ZhcjsKLQkgIHNvZmFyID0gQkZEX0FMSUdOIChzb2ZhciwgMSA8PCBjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXIpOwotCSAgYWxpZ25fYWRqdXN0ID0gc29mYXIgIT0gb2xkX3NvZmFyOwotCSAgY3VycmVudC0+X3Jhd19zaXplICs9IHNvZmFyIC0gb2xkX3NvZmFyOwotCX0KLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gICAgICAvKiBGb3IgUEUgd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgcGFkIG91dCB0byB0aGUgYWxpZ25lZAotICAgICAgICAgX3Jhd19zaXplLCBpbiBjYXNlIHRoZSBjYWxsZXIgb25seSB3cml0ZXMgb3V0IGRhdGEgdG8gdGhlCi0gICAgICAgICB1bmFsaWduZWQgX3Jhd19zaXplLiAgKi8KLSAgICAgIGlmIChwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KS0+dmlydF9zaXplIDwgY3VycmVudC0+X3Jhd19zaXplKQotCWFsaWduX2FkanVzdCA9IHRydWU7Ci0jZW5kaWYKLQotI2lmZGVmIF9MSUIKLSAgICAgIC8qIEZvcmNlIC5saWIgc2VjdGlvbnMgdG8gc3RhcnQgYXQgemVyby4gIFRoZSB2bWEgaXMgdGhlbgotCSBpbmNyZW1lbnRlZCBpbiBjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzLiAgVGhpcyBpcyByaWdodCBmb3IKLQkgU1ZSMy4yLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9MSUIpID09IDApCi0JYmZkX3NldF9zZWN0aW9uX3ZtYSAoYWJmZCwgY3VycmVudCwgMCk7Ci0jZW5kaWYKLQotICAgICAgcHJldmlvdXMgPSBjdXJyZW50OwotICAgIH0KLQotICAvKiBJdCBpcyBub3cgc2FmZSB0byB3cml0ZSB0byB0aGUgb3V0cHV0IGZpbGUuICBJZiB3ZSBuZWVkZWQgYW4KLSAgICAgYWxpZ25tZW50IGFkanVzdG1lbnQgZm9yIHRoZSBsYXN0IHNlY3Rpb24sIHRoZW4gbWFrZSBzdXJlIHRoYXQKLSAgICAgdGhlcmUgaXMgYSBieXRlIGF0IG9mZnNldCBzb2Zhci4gIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzIGFuZCBubwotICAgICByZWxvY3MsIHRoZW4gbm90aGluZyBmb2xsb3dzIHRoZSBsYXN0IHNlY3Rpb24uICBJZiB3ZSBkb24ndCBmb3JjZQotICAgICB0aGUgbGFzdCBieXRlIG91dCwgdGhlbiB0aGUgZmlsZSBtYXkgYXBwZWFyIHRvIGJlIHRydW5jYXRlZC4gICovCi0gIGlmIChhbGlnbl9hZGp1c3QpCi0gICAgewotICAgICAgYmZkX2J5dGUgYjsKLQotICAgICAgYiA9IDA7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNvZmFyIC0gMSwgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF93cml0ZSAoJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgdGhlIHJlbG9jYXRpb25zIGFyZSBhbGlnbmVkLiAgV2UgZG9uJ3QgbmVlZCB0byBtYWtlCi0gICAgIHN1cmUgdGhhdCB0aGlzIGJ5dGUgZXhpc3RzLCBiZWNhdXNlIGl0IHdpbGwgb25seSBtYXR0ZXIgaWYgdGhlcmUKLSAgICAgcmVhbGx5IGFyZSByZWxvY3MuICAqLwotICBzb2ZhciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSKTsKLQotICBvYmpfcmVsb2NiYXNlIChhYmZkKSA9IHNvZmFyOwotICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBjYW4gbmV2ZXIgd29yaywgYmVjYXVzZSBpdCBpcyBjYWxsZWQgdG9vIGxhdGUtLWFmdGVyIHRoZQotICAgc2VjdGlvbiBwb3NpdGlvbnMgaGF2ZSBiZWVuIHNldC4gIEkgY2FuJ3QgZmlndXJlIG91dCB3aGF0IGl0IGlzCi0gICBmb3IsIHNvIEkgYW0gZ29pbmcgdG8gZGlzYWJsZSBpdC0tSWFuIFRheWxvciAyMCBNYXJjaCAxOTk2LiAgKi8KLQotLyogSWYgLmZpbGUsIC50ZXh0LCAuZGF0YSwgLmJzcyBzeW1ib2xzIGFyZSBtaXNzaW5nLCBhZGQgdGhlbS4gICovCi0vKiBAQCBTaG91bGQgd2Ugb25seSBiZSBhZGRpbmcgbWlzc2luZyBzeW1ib2xzLCBvciBvdmVycmlkaW5nIHRoZSBhdXgKLSAgIHZhbHVlcyBmb3IgZXhpc3Rpbmcgc2VjdGlvbiBzeW1ib2xzPyAgKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgaW50IG5zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIGFzeW1ib2wgKipzeW1wcCA9IGFiZmQtPm91dHN5bWJvbHM7Ci0gIGFzeW1ib2wgKipzeW1wcDI7Ci0gIHVuc2lnbmVkIGludCBpOwotICBpbnQgbmVlZF90ZXh0ID0gMSwgbmVlZF9kYXRhID0gMSwgbmVlZF9ic3MgPSAxLCBuZWVkX2ZpbGUgPSAxOwotCi0gIGZvciAoaSA9IDA7IGkgPCBuc3ltczsgaSsrKQotICAgIHsKLSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW1wcFtpXSk7Ci0gICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICAgaWYgKGNzeW0pCi0JewotCSAgLyogb25seSBkbyB0aGlzIGlmIHRoZXJlIGlzIGEgY29mZiByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5wdXQKLQkgICBzeW1ib2wgKi8KLQkgIGlmIChjc3ltLT5uYXRpdmUgJiYgY3N5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JICAgIHsKLQkgICAgICBuZWVkX2ZpbGUgPSAwOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBuYW1lID0gY3N5bS0+c3ltYm9sLm5hbWU7Ci0JICBpZiAoIW5hbWUpCi0JICAgIGNvbnRpbnVlOwotCSAgaWYgKCFzdHJjbXAgKG5hbWUsIF9URVhUKSkKLQkgICAgbmVlZF90ZXh0ID0gMDsKLSNpZmRlZiBBUE9MTE9fTTY4Ci0JICBlbHNlIGlmICghc3RyY21wIChuYW1lLCAiLnd0ZXh0IikpCi0JICAgIG5lZWRfdGV4dCA9IDA7Ci0jZW5kaWYKLQkgIGVsc2UgaWYgKCFzdHJjbXAgKG5hbWUsIF9EQVRBKSkKLQkgICAgbmVlZF9kYXRhID0gMDsKLQkgIGVsc2UgaWYgKCFzdHJjbXAgKG5hbWUsIF9CU1MpKQotCSAgICBuZWVkX2JzcyA9IDA7Ci0JfQotICAgIH0KLSAgLyogTm93IGkgPT0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCkuICAqLwotICAvKiBAQCBGb3Igbm93LCBkb24ndCBkZWFsIHdpdGggLmZpbGUgc3ltYm9sLiAgKi8KLSAgbmVlZF9maWxlID0gMDsKLQotICBpZiAoIW5lZWRfdGV4dCAmJiAhbmVlZF9kYXRhICYmICFuZWVkX2JzcyAmJiAhbmVlZF9maWxlKQotICAgIHJldHVybiB0cnVlOwotICBuc3ltcyArPSBuZWVkX3RleHQgKyBuZWVkX2RhdGEgKyBuZWVkX2JzcyArIG5lZWRfZmlsZTsKLSAgc3ltcHAyID0gKGFzeW1ib2wgKiopIGJmZF9hbGxvYyAoYWJmZCwgbnN5bXMgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICBpZiAoIXN5bXBwMikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG1lbWNweSAoc3ltcHAyLCBzeW1wcCwgaSAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIGlmIChuZWVkX2ZpbGUpCi0gICAgewotICAgICAgLyogQEAgR2VuZXJhdGUgZmFrZSAuZmlsZSBzeW1ib2wsIGluIHN5bXBwMltpXSwgYW5kIGluY3JlbWVudCBpLiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgaWYgKG5lZWRfdGV4dCkKLSAgICBzeW1wcDJbaSsrXSA9IGNvZmZfc2VjdGlvbl9zeW1ib2wgKGFiZmQsIF9URVhUKTsKLSAgaWYgKG5lZWRfZGF0YSkKLSAgICBzeW1wcDJbaSsrXSA9IGNvZmZfc2VjdGlvbl9zeW1ib2wgKGFiZmQsIF9EQVRBKTsKLSAgaWYgKG5lZWRfYnNzKQotICAgIHN5bXBwMltpKytdID0gY29mZl9zZWN0aW9uX3N5bWJvbCAoYWJmZCwgX0JTUyk7Ci0gIEJGRF9BU1NFUlQgKGkgPT0gbnN5bXMpOwotICBiZmRfc2V0X3N5bXRhYiAoYWJmZCwgc3ltcHAyLCBuc3ltcyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYgLyogMCAqLwotCi0vKiBTVVBQUkVTUyA1NTggKi8KLS8qIFNVUFBSRVNTIDUyOSAqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICBhc2VjdGlvbiAqY3VycmVudDsKLSAgYm9vbGVhbiBoYXNyZWxvY3MgPSBmYWxzZTsKLSAgYm9vbGVhbiBoYXNsaW5ubyA9IGZhbHNlOwotICBmaWxlX3B0ciBzY25fYmFzZTsKLSAgZmlsZV9wdHIgcmVsb2NfYmFzZTsKLSAgZmlsZV9wdHIgbGluZW5vX2Jhc2U7Ci0gIGZpbGVfcHRyIHN5bV9iYXNlOwotICB1bnNpZ25lZCBsb25nIHJlbG9jX3NpemUgPSAwOwotICB1bnNpZ25lZCBsb25nIGxubm9fc2l6ZSA9IDA7Ci0gIGJvb2xlYW4gbG9uZ19zZWN0aW9uX25hbWVzOwotICBhc2VjdGlvbiAqdGV4dF9zZWMgPSBOVUxMOwotICBhc2VjdGlvbiAqZGF0YV9zZWMgPSBOVUxMOwotICBhc2VjdGlvbiAqYnNzX3NlYyA9IE5VTEw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyIGludGVybmFsX2Y7Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyIGludGVybmFsX2E7Ci0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgc2l6ZV90IHN0cmluZ19zaXplID0gU1RSSU5HX1NJWkVfU0laRTsKLSNlbmRpZgotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0KLSAgLyogTWFrZSBhIHBhc3MgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIHRvIGNvdW50IGxpbmUgbnVtYmVyIGVudHJpZXMgYW5kCi0gICAgIHB1dCB0aGVtIGludG8gdGhlIGNvcnJlY3QgYXNlY3Rpb25zICovCi0KLSAgbG5ub19zaXplID0gY29mZl9jb3VudF9saW5lbnVtYmVycyAoYWJmZCkgKiBMSU5FU1o7Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpCi0gICAgewotICAgICAgaWYgKCEgY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmVsb2NfYmFzZSA9IG9ial9yZWxvY2Jhc2UgKGFiZmQpOwotCi0gIC8qIFdvcmsgb3V0IHRoZSBzaXplIG9mIHRoZSByZWxvYyBhbmQgbGlubm8gYXJlYXMgKi8KLQotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0KLSAgICAgICBjdXJyZW50LT5uZXh0KQotICAgIHJlbG9jX3NpemUgKz0gY3VycmVudC0+cmVsb2NfY291bnQgKiBSRUxTWjsKLQotICBsaW5lbm9fYmFzZSA9IHJlbG9jX2Jhc2UgKyByZWxvY19zaXplOwotICBzeW1fYmFzZSA9IGxpbmVub19iYXNlICsgbG5ub19zaXplOwotCi0gIC8qIEluZGljYXRlIGluIGVhY2ggc2VjdGlvbi0+bGluZV9maWxlcG9zIGl0cyBhY3R1YWwgZmlsZSBhZGRyZXNzICovCi0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPQotICAgICAgIGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgaWYgKGN1cnJlbnQtPmxpbmVub19jb3VudCkKLQl7Ci0JICBjdXJyZW50LT5saW5lX2ZpbGVwb3MgPSBsaW5lbm9fYmFzZTsKLQkgIGN1cnJlbnQtPm1vdmluZ19saW5lX2ZpbGVwb3MgPSBsaW5lbm9fYmFzZTsKLQkgIGxpbmVub19iYXNlICs9IGN1cnJlbnQtPmxpbmVub19jb3VudCAqIExJTkVTWjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY3VycmVudC0+bGluZV9maWxlcG9zID0gMDsKLQl9Ci0gICAgICBpZiAoY3VycmVudC0+cmVsb2NfY291bnQpCi0JewotCSAgY3VycmVudC0+cmVsX2ZpbGVwb3MgPSByZWxvY19iYXNlOwotCSAgcmVsb2NfYmFzZSArPSBjdXJyZW50LT5yZWxvY19jb3VudCAqIFJFTFNaOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjdXJyZW50LT5yZWxfZmlsZXBvcyA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBXcml0ZSBzZWN0aW9uIGhlYWRlcnMgdG8gdGhlIGZpbGUuICAqLwotICBpbnRlcm5hbF9mLmZfbnNjbnMgPSAwOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApICE9IDApCi0gICAgc2NuX2Jhc2UgPSBGSUxIU1ogKyBBT1VUU1o7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzY25fYmFzZSA9IEZJTEhTWjsKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgICAgIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotCXNjbl9iYXNlICs9IEFPVVRTWjsKLSAgICAgIGVsc2UKLQlzY25fYmFzZSArPSBTTUFMTF9BT1VUU1o7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzY25fYmFzZSwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGxvbmdfc2VjdGlvbl9uYW1lcyA9IGZhbHNlOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBjdXJyZW50ICE9IE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3NjbmhkciBzZWN0aW9uOwotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gICAgICAvKiBJZiB3ZSd2ZSBnb3QgYSAucmVsb2Mgc2VjdGlvbiwgcmVtZW1iZXIuICovCi0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIGlmIChzdHJjbXAgKGN1cnJlbnQtPm5hbWUsICIucmVsb2MiKSA9PSAwKQotCXsKLQkgIHBlX2RhdGEgKGFiZmQpLT5oYXNfcmVsb2Nfc2VjdGlvbiA9IDE7Ci0JfQotI2VuZGlmCi0KLSNlbmRpZgotICAgICAgaW50ZXJuYWxfZi5mX25zY25zKys7Ci0KLSAgICAgIHN0cm5jcHkgKHNlY3Rpb24uc19uYW1lLCBjdXJyZW50LT5uYW1lLCBTQ05OTUxFTik7Ci0KLSNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICAgICAgLyogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcyBhcyBpbiBQRS4gIFRoaXMgbXVzdCBiZSBjb21wYXRpYmxlCi0gICAgICAgICB3aXRoIHRoZSBjb2RlIGluIGNvZmZfd3JpdGVfc3ltYm9scy4gICovCi0gICAgICB7Ci0Jc2l6ZV90IGxlbjsKLQotCWxlbiA9IHN0cmxlbiAoY3VycmVudC0+bmFtZSk7Ci0JaWYgKGxlbiA+IFNDTk5NTEVOKQotCSAgewotCSAgICBtZW1zZXQgKHNlY3Rpb24uc19uYW1lLCAwLCBTQ05OTUxFTik7Ci0JICAgIHNwcmludGYgKHNlY3Rpb24uc19uYW1lLCAiLyVsdSIsICh1bnNpZ25lZCBsb25nKSBzdHJpbmdfc2l6ZSk7Ci0JICAgIHN0cmluZ19zaXplICs9IGxlbiArIDE7Ci0JICAgIGxvbmdfc2VjdGlvbl9uYW1lcyA9IHRydWU7Ci0JICB9Ci0gICAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIF9MSUIKLSAgICAgIC8qIEFsd2F5cyBzZXQgc192YWRkciBvZiAubGliIHRvIDAuICBUaGlzIGlzIHJpZ2h0IGZvciBTVlIzLjIKLQkgSWFuIFRheWxvciA8aWFuQGN5Z251cy5jb20+LiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9MSUIpID09IDApCi0Jc2VjdGlvbi5zX3ZhZGRyID0gMDsKLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgc2VjdGlvbi5zX3ZhZGRyID0gY3VycmVudC0+dm1hOwotICAgICAgc2VjdGlvbi5zX3BhZGRyID0gY3VycmVudC0+bG1hOwotICAgICAgc2VjdGlvbi5zX3NpemUgPSAgY3VycmVudC0+X3Jhd19zaXplOwotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gICAgICBzZWN0aW9uLnNfcGFkZHIgPSAwOwotI2VuZGlmCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gICAgICAvKiBSZW1pbmRlcjogc19wYWRkciBob2xkcyB0aGUgdmlydHVhbCBzaXplIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3VycmVudCkgIT0gTlVMTAotCSAgJiYgcGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3VycmVudCkgIT0gTlVMTCkKLQlzZWN0aW9uLnNfcGFkZHIgPSBwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KS0+dmlydF9zaXplOwotICAgICAgZWxzZQotCXNlY3Rpb24uc19wYWRkciA9IDA7Ci0jZW5kaWYKLQotICAgICAgLyoKLQkgSWYgdGhpcyBzZWN0aW9uIGhhcyBubyBzaXplIG9yIGlzIHVubG9hZGFibGUgdGhlbiB0aGUgc2NucHRyCi0JIHdpbGwgYmUgMCB0b28KLQkgKi8KLSAgICAgIGlmIChjdXJyZW50LT5fcmF3X3NpemUgPT0gMCB8fAotCSAgKGN1cnJlbnQtPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUykpID09IDApCi0JewotCSAgc2VjdGlvbi5zX3NjbnB0ciA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNlY3Rpb24uc19zY25wdHIgPSBjdXJyZW50LT5maWxlcG9zOwotCX0KLSAgICAgIHNlY3Rpb24uc19yZWxwdHIgPSBjdXJyZW50LT5yZWxfZmlsZXBvczsKLSAgICAgIHNlY3Rpb24uc19sbm5vcHRyID0gY3VycmVudC0+bGluZV9maWxlcG9zOwotICAgICAgc2VjdGlvbi5zX25yZWxvYyA9IGN1cnJlbnQtPnJlbG9jX2NvdW50OwotICAgICAgc2VjdGlvbi5zX25sbm5vID0gY3VycmVudC0+bGluZW5vX2NvdW50OwotICAgICAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50ICE9IDApCi0JaGFzcmVsb2NzID0gdHJ1ZTsKLSAgICAgIGlmIChjdXJyZW50LT5saW5lbm9fY291bnQgIT0gMCkKLQloYXNsaW5ubyA9IHRydWU7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgICAgIC8qIEluZGljYXRlIHRoZSB1c2Ugb2YgYW4gWENPRkYgb3ZlcmZsb3cgc2VjdGlvbiBoZWFkZXIuICAqLwotICAgICAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50ID49IDB4ZmZmZiB8fCBjdXJyZW50LT5saW5lbm9fY291bnQgPj0gMHhmZmZmKQotCXsKLQkgIHNlY3Rpb24uc19ucmVsb2MgPSAweGZmZmY7Ci0JICBzZWN0aW9uLnNfbmxubm8gPSAweGZmZmY7Ci0JfQotI2VuZGlmCi0KLSAgICAgIHNlY3Rpb24uc19mbGFncyA9IHNlY190b19zdHlwX2ZsYWdzIChjdXJyZW50LT5uYW1lLCBjdXJyZW50LT5mbGFncyk7Ci0KLSAgICAgIGlmICghc3RyY21wIChjdXJyZW50LT5uYW1lLCBfVEVYVCkpCi0JewotCSAgdGV4dF9zZWMgPSBjdXJyZW50OwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9EQVRBKSkKLQl7Ci0JICBkYXRhX3NlYyA9IGN1cnJlbnQ7Ci0JfQotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoY3VycmVudC0+bmFtZSwgX0JTUykpCi0JewotCSAgYnNzX3NlYyA9IGN1cnJlbnQ7Ci0JfQotCi0jaWZkZWYgSTk2MAotICAgICAgc2VjdGlvbi5zX2FsaWduID0gKGN1cnJlbnQtPmFsaWdubWVudF9wb3dlcgotCQkJID8gMSA8PCBjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXIKLQkJCSA6IDApOwotI2Vsc2UKLSNpZmRlZiBUSUM4MENPRkYKLSAgICAgIHNlY3Rpb24uc19mbGFncyB8PSAoY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyICYgMHhGKSA8PCA4OwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgLyogc3VwcHJlc3Mgb3V0cHV0IG9mIHRoZSBzZWN0aW9ucyBpZiB0aGV5IGFyZSBudWxsLiAgbGQgaW5jbHVkZXMKLQkgdGhlIGJzcyBhbmQgZGF0YSBzZWN0aW9ucyBldmVuIGlmIHRoZXJlIGlzIG5vIHNpemUgYXNzaWduZWQKLQkgdG8gdGhlbS4gIE5UIGxvYWRlciBkb2Vzbid0IGxpa2UgaXQgaWYgdGhlc2Ugc2VjdGlvbiBoZWFkZXJzIGFyZQotCSBpbmNsdWRlZCBpZiB0aGUgc2VjdGlvbnMgdGhlbXNlbHZlcyBhcmUgbm90IG5lZWRlZCAqLwotICAgICAgaWYgKHNlY3Rpb24uc19zaXplID09IDApCi0JaW50ZXJuYWxfZi5mX25zY25zLS07Ci0gICAgICBlbHNlCi0jZW5kaWYKLQl7Ci0JICBTQ05IRFIgYnVmZjsKLQkgIGlmIChjb2ZmX3N3YXBfc2NuaGRyX291dCAoYWJmZCwgJnNlY3Rpb24sICZidWZmKSA9PSAwCi0JICAgICAgfHwgYmZkX3dyaXRlICgoUFRSKSAoJmJ1ZmYpLCAxLCBTQ05IU1osIGFiZmQpICE9IFNDTkhTWikKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotI2lmZGVmIENPRkZfV0lUSF9QRQotICAgICAgLyogUEUgc3RvcmVzIENPTURBVCBzZWN0aW9uIGluZm9ybWF0aW9uIGluIHRoZSBzeW1ib2wgdGFibGUuICBJZgotICAgICAgICAgdGhpcyBzZWN0aW9uIGlzIHN1cHBvc2VkIHRvIGhhdmUgc29tZSBDT01EQVQgaW5mbywgdHJhY2sgZG93bgotICAgICAgICAgdGhlIHN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlIGFuZCBtb2RpZnkgaXQuICAqLwotICAgICAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNFQ19MSU5LX09OQ0UpICE9IDApCi0JewotCSAgdW5zaWduZWQgaW50IGksIGNvdW50OwotCSAgYXN5bWJvbCAqKnBzeW07Ci0JICBjb2ZmX3N5bWJvbF90eXBlICpjc3ltID0gTlVMTDsKLQkgIGFzeW1ib2wgKipwc3ltc2VjOwotCi0JICBwc3ltc2VjID0gTlVMTDsKLQkgIGNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0JICBmb3IgKGkgPSAwLCBwc3ltID0gYWJmZC0+b3V0c3ltYm9sczsgaSA8IGNvdW50OyBpKyssIHBzeW0rKykKLQkgICAgewotCSAgICAgIGlmICgoKnBzeW0pLT5zZWN0aW9uICE9IGN1cnJlbnQpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgLyogUmVtZW1iZXIgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhpcwotICAgICAgICAgICAgICAgICBzZWN0aW9uLiAgKi8KLQkgICAgICBpZiAocHN5bXNlYyA9PSBOVUxMKQotCQlwc3ltc2VjID0gcHN5bTsKLQotCSAgICAgIC8qIFNlZSBpZiB0aGlzIGlzIHRoZSBzZWN0aW9uIHN5bWJvbC4gICovCi0JICAgICAgaWYgKHN0cmNtcCAoKCpwc3ltKS0+bmFtZSwgY3VycmVudC0+bmFtZSkgPT0gMCkKLQkJewotCQkgIGNzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCAqcHN5bSk7Ci0JCSAgaWYgKGNzeW0gPT0gTlVMTAotCQkgICAgICB8fCBjc3ltLT5uYXRpdmUgPT0gTlVMTAotCQkgICAgICB8fCBjc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4IDwgMQotCQkgICAgICB8fCBjc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzICE9IENfU1RBVAotCQkgICAgICB8fCBjc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fdHlwZSAhPSBUX05VTEwpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIC8qIEhlcmUgKlBTWU0gaXMgdGhlIHNlY3Rpb24gc3ltYm9sIGZvciBDVVJSRU5ULiAgKi8KLQotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgLyogRGlkIHdlIGZpbmQgaXQ/Ci0JICAgICBOb3RlIHRoYXQgd2UgbWlnaHQgbm90IGlmIHdlJ3JlIGNvbnZlcnRpbmcgdGhlIGZpbGUgZnJvbQotCSAgICAgc29tZSBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXQuICAqLwotCSAgaWYgKGkgPCBjb3VudCkKLQkgICAgewotCSAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eDsKLQotCSAgICAgIC8qIFdlIGRvbid0IHRvdWNoIHRoZSB4X2NoZWNrc3VtIGZpZWxkLiAgVGhlCi0JCSB4X2Fzc29jaWF0ZWQgZmllbGQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuICAqLwotCi0JICAgICAgYXV4ID0gY3N5bS0+bmF0aXZlICsgMTsKLQkgICAgICBzd2l0Y2ggKGN1cnJlbnQtPmZsYWdzICYgU0VDX0xJTktfRFVQTElDQVRFUykKLQkJewotCQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDoKLQkJICBhdXgtPnUuYXV4ZW50Lnhfc2NuLnhfY29tZGF0ID0gSU1BR0VfQ09NREFUX1NFTEVDVF9BTlk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZOgotCQkgIGF1eC0+dS5hdXhlbnQueF9zY24ueF9jb21kYXQgPQotCQkgICAgSU1BR0VfQ09NREFUX1NFTEVDVF9OT0RVUExJQ0FURVM7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRToKLQkJICBhdXgtPnUuYXV4ZW50Lnhfc2NuLnhfY29tZGF0ID0KLQkJICAgIElNQUdFX0NPTURBVF9TRUxFQ1RfU0FNRV9TSVpFOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTOgotCQkgIGF1eC0+dS5hdXhlbnQueF9zY24ueF9jb21kYXQgPQotCQkgICAgSU1BR0VfQ09NREFUX1NFTEVDVF9FWEFDVF9NQVRDSDsKLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgLyogVGhlIENPTURBVCBzeW1ib2wgbXVzdCBiZSB0aGUgZmlyc3Qgc3ltYm9sIGZyb20gdGhpcwotICAgICAgICAgICAgICAgICBzZWN0aW9uIGluIHRoZSBzeW1ib2wgdGFibGUuICBJbiBvcmRlciB0byBtYWtlIHRoaXMKLSAgICAgICAgICAgICAgICAgd29yaywgd2UgbW92ZSB0aGUgQ09NREFUIHN5bWJvbCBiZWZvcmUgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgIHN5bWJvbCB3ZSBmb3VuZCBpbiB0aGUgc2VhcmNoIGFib3ZlLiAgSXQncyBPSyB0bwotICAgICAgICAgICAgICAgICByZWFycmFuZ2UgdGhlIHN5bWJvbCB0YWJsZSBhdCB0aGlzIHBvaW50LCBiZWNhdXNlCi0gICAgICAgICAgICAgICAgIGNvZmZfcmVudW1iZXJfc3ltYm9scyBpcyBnb2luZyB0byByZWFycmFuZ2UgaXQKLSAgICAgICAgICAgICAgICAgZnVydGhlciBhbmQgZml4IHVwIGFsbCB0aGUgYXV4IGVudHJpZXMuICAqLwotCSAgICAgIGlmIChwc3ltICE9IHBzeW1zZWMpCi0JCXsKLQkJICBhc3ltYm9sICpob2xkOwotCQkgIGFzeW1ib2wgKipwY29weTsKLQotCQkgIGhvbGQgPSAqcHN5bTsKLQkJICBmb3IgKHBjb3B5ID0gcHN5bTsgcGNvcHkgPiBwc3ltc2VjOyBwY29weS0tKQotCQkgICAgcGNvcHlbMF0gPSBwY29weVstMV07Ci0JCSAgKnBzeW1zZWMgPSBob2xkOwotCQl9Ci0JICAgIH0KLQl9Ci0jZW5kaWYgLyogQ09GRl9XSVRIX1BFICovCi0gICAgfQotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIC8qIFhDT0ZGIGhhbmRsZXMgb3ZlcmZsb3dzIGluIHRoZSByZWxvYyBhbmQgbGluZSBudW1iZXIgY291bnQgZmllbGRzCi0gICAgIGJ5IGNyZWF0aW5nIGEgbmV3IHNlY3Rpb24gaGVhZGVyIHRvIGhvbGQgdGhlIGNvcnJlY3QgdmFsdWVzLiAgKi8KLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50ID49IDB4ZmZmZiB8fCBjdXJyZW50LT5saW5lbm9fY291bnQgPj0gMHhmZmZmKQotCXsKLQkgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgc2NuaGRyOwotCSAgU0NOSERSIGJ1ZmY7Ci0KLQkgIGludGVybmFsX2YuZl9uc2NucysrOwotCSAgc3RybmNweSAoJihzY25oZHIuc19uYW1lWzBdKSwgY3VycmVudC0+bmFtZSwgOCk7Ci0JICBzY25oZHIuc19wYWRkciA9IGN1cnJlbnQtPnJlbG9jX2NvdW50OwotCSAgc2NuaGRyLnNfdmFkZHIgPSBjdXJyZW50LT5saW5lbm9fY291bnQ7Ci0JICBzY25oZHIuc19zaXplID0gMDsKLQkgIHNjbmhkci5zX3NjbnB0ciA9IDA7Ci0JICBzY25oZHIuc19yZWxwdHIgPSBjdXJyZW50LT5yZWxfZmlsZXBvczsKLQkgIHNjbmhkci5zX2xubm9wdHIgPSBjdXJyZW50LT5saW5lX2ZpbGVwb3M7Ci0JICBzY25oZHIuc19ucmVsb2MgPSBjdXJyZW50LT50YXJnZXRfaW5kZXg7Ci0JICBzY25oZHIuc19ubG5ubyA9IGN1cnJlbnQtPnRhcmdldF9pbmRleDsKLQkgIHNjbmhkci5zX2ZsYWdzID0gU1RZUF9PVlJGTE87Ci0JICBpZiAoY29mZl9zd2FwX3Njbmhkcl9vdXQgKGFiZmQsICZzY25oZHIsICZidWZmKSA9PSAwCi0JICAgICAgfHwgYmZkX3dyaXRlICgoUFRSKSAmYnVmZiwgMSwgU0NOSFNaLCBhYmZkKSAhPSBTQ05IU1opCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogT0ssIG5vdyBzZXQgdXAgdGhlIGZpbGVoZHIuLi4gKi8KLQotICAvKiBEb24ndCBpbmNsdWRlIHRoZSBpbnRlcm5hbCBhYnMgc2VjdGlvbiBpbiB0aGUgc2VjdGlvbiBjb3VudCAqLwotCi0gIC8qCi0gICAgIFdlIHdpbGwgTk9UIHB1dCBhIGZ1Y2tpbmcgdGltZXN0YW1wIGluIHRoZSBoZWFkZXIgaGVyZS4gRXZlcnkgdGltZSB5b3UKLSAgICAgcHV0IGl0IGJhY2ssIEkgd2lsbCBjb21lIGluIGFuZCB0YWtlIGl0IG91dCBhZ2Fpbi4gIEknbSBzb3JyeS4gIFRoaXMKLSAgICAgZmllbGQgZG9lcyBub3QgYmVsb25nIGhlcmUuICBXZSBmaWxsIGl0IHdpdGggYSAwIHNvIGl0IGNvbXBhcmVzIHRoZQotICAgICBzYW1lIGJ1dCBpcyBub3QgYSByZWFzb25hYmxlIHRpbWUuIC0tIGdudUBjeWdudXMuY29tCi0gICAgICovCi0gIGludGVybmFsX2YuZl90aW1kYXQgPSAwOwotCi0gIGludGVybmFsX2YuZl9mbGFncyA9IDA7Ci0KLSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQotICAgIGludGVybmFsX2YuZl9vcHRoZHIgPSBBT1VUU1o7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRlcm5hbF9mLmZfb3B0aGRyID0gMDsKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgICAgIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotCWludGVybmFsX2YuZl9vcHRoZHIgPSBBT1VUU1o7Ci0gICAgICBlbHNlCi0JaW50ZXJuYWxfZi5mX29wdGhkciA9IFNNQUxMX0FPVVRTWjsKLSNlbmRpZgotICAgIH0KLQotICBpZiAoIWhhc3JlbG9jcykKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9SRUxGTEc7Ci0gIGlmICghaGFzbGlubm8pCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfTE5OTzsKLSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0VYRUM7Ci0KLSAgLyogRklYTUU6IHRoaXMgaXMgd3JvbmcgZm9yIFBQQ19QRSEgKi8KLSAgaWYgKGJmZF9saXR0bGVfZW5kaWFuIChhYmZkKSkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9BUjMyV1I7Ci0gIGVsc2UKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9BUjMyVzsKLQotI2lmZGVmIFRJQzgwX1RBUkdFVF9JRAotICBpbnRlcm5hbF9mLmZfdGFyZ2V0X2lkID0gVElDODBfVEFSR0VUX0lEOwotI2VuZGlmCi0KLSAgLyoKLSAgICAgRklYTUUsIHNob3VsZCBkbyBzb21ldGhpbmcgYWJvdXQgdGhlIG90aGVyIGJ5dGUgb3JkZXJzIGFuZAotICAgICBhcmNoaXRlY3R1cmVzLgotICAgICAqLwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX1NIUk9CSjsKLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBfTE9BREVSKSAhPSBOVUxMKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0RZTkxPQUQ7Ci0jZW5kaWYKLQotICBtZW1zZXQgKCZpbnRlcm5hbF9hLCAwLCBzaXplb2YgaW50ZXJuYWxfYSk7Ci0KLSAgLyogU2V0IHVwIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgc3R1ZmYgKi8KLQotICB7Ci0gICAgdW5zaWduZWQgaW50IG1hZ2ljID0gMDsKLSAgICB1bnNpZ25lZCBzaG9ydCBmbGFncyA9IDA7Ci0gICAgY29mZl9zZXRfZmxhZ3MgKGFiZmQsICZtYWdpYywgJmZsYWdzKTsKLSAgICBpbnRlcm5hbF9mLmZfbWFnaWMgPSBtYWdpYzsKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gZmxhZ3M7Ci0gICAgLyogLi4uYW5kIHRoZSAib3B0Imhkci4uLiAqLwotCi0jaWZkZWYgQTI5SwotI2lmZGVmIFVMVFJBMwkJCS8qIE5ZVSdzIG1hY2hpbmUgKi8KLSAgICAvKiBGSVhNRTogVGhpcyBpcyBhIGJvZ3VzIGNoZWNrLiAgSSByZWFsbHkgd2FudCB0byBzZWUgaWYgdGhlcmUKLSAgICAgKiBpcyBhIC5zaGJzcyBvciBhIC5zaGRhdGEgc2VjdGlvbiwgaWYgc28gdGhlbiBzZXQgdGhlIG1hZ2ljCi0gICAgICogbnVtYmVyIHRvIGluZGljYXRlIGEgc2hhcmVkIGRhdGEgZXhlY3V0YWJsZS4KLSAgICAgKi8KLSAgICBpZiAoaW50ZXJuYWxfZi5mX25zY25zID49IDcpCi0gICAgICBpbnRlcm5hbF9hLm1hZ2ljID0gU0hNQUdJQzsgLyogU2hhcmVkIG1hZ2ljICovCi0gICAgZWxzZQotI2VuZGlmIC8qIFVMVFJBMyAqLwotICAgICAgaW50ZXJuYWxfYS5tYWdpYyA9IE5NQUdJQzsgLyogQXNzdW1lIHNlcGFyYXRlIGkvZCAqLwotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSNlbmRpZiAvKiBBMjlLICovCi0jaWZkZWYgVElDODBDT0ZGCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IFRJQzgwX0FSQ0hfTUFHSUM7Ci0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotI2VuZGlmIC8qIFRJQzgwICovCi0jaWZkZWYgSTg2MAotICAgIC8qIEZJWE1FOiBXaGF0IGFyZSB0aGUgYS5vdXQgbWFnaWMgbnVtYmVycyBmb3IgdGhlIGk4NjA/ICAqLwotICAgIGludGVybmFsX2EubWFnaWMgPSAwOwotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSNlbmRpZiAvKiBJODYwICovCi0jaWZkZWYgSTk2MAotICAgIGludGVybmFsX2EubWFnaWMgPSAobWFnaWMgPT0gSTk2MFJPTUFHSUMgPyBOTUFHSUMgOiBPTUFHSUMpOwotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSNlbmRpZiAvKiBJOTYwICovCi0jaWYgTTg4Ci0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotICAgIGludGVybmFsX2EubWFnaWMgPSBQQUdFTUFHSUNCQ1M7Ci0jZW5kaWYgLyogTTg4ICovCi0KLSNpZiBBUE9MTE9fTTY4Ci0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotICAgIGludGVybmFsX2EubWFnaWMgPSBBUE9MTE9fQ09GRl9WRVJTSU9OX05VTUJFUjsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChNNjgpIHx8IGRlZmluZWQoV0UzMkspIHx8IGRlZmluZWQoTTY4SykKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0jaWYgZGVmaW5lZChMWU5YT1MpCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IExZTlhDT0ZGTUFHSUM7Ci0jZWxzZQotI2lmIGRlZmluZWQoVEFSR19BVVgpCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IChhYmZkLT5mbGFncyAmIERfUEFHRUQgPyBQQUdFTUFHSUNQRVhFQ1BBR0VEIDoKLQkJCWFiZmQtPmZsYWdzICYgV1BfVEVYVCA/IFBBR0VNQUdJQ1BFWEVDU1dBUFBFRCA6Ci0JCQlQQUdFTUFHSUNFWEVDU1dBUFBFRCk7Ci0jZWxzZQotI2lmIGRlZmluZWQgKFBBR0VNQUdJQ1BFWEVDUEFHRUQpCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IFBBR0VNQUdJQ1BFWEVDUEFHRUQ7Ci0jZW5kaWYKLSNlbmRpZiAvKiBUQVJHX0FVWCAqLwotI2VuZGlmIC8qIExZTlhPUyAqLwotI2VuZGlmIC8qIE02OCB8fCBXRTMySyB8fCBNNjhLICovCi0KLSNpZiBkZWZpbmVkKEFSTSkKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IFpNQUdJQzsKLSNlbmRpZiAKLQotI2lmIGRlZmluZWQoUFBDX1BFKQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gSU1BR0VfTlRfT1BUSU9OQUxfSERSX01BR0lDOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIE1DT1JFX1BFCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotICAgIGludGVybmFsX2EubWFnaWMgPSBJTUFHRV9OVF9PUFRJT05BTF9IRFJfTUFHSUM7Ci0jZW5kaWYgCi0KLSNpZiBkZWZpbmVkKEkzODYpCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotI2lmIGRlZmluZWQoTFlOWE9TKQotICAgIGludGVybmFsX2EubWFnaWMgPSBMWU5YQ09GRk1BR0lDOwotI2Vsc2UgIC8qIExZTlhPUyAqLwotICAgIGludGVybmFsX2EubWFnaWMgPSBaTUFHSUM7Ci0jZW5kaWYgLyogTFlOWE9TICovCi0jZW5kaWYgLyogSTM4NiAqLwotCi0jaWYgZGVmaW5lZChTUEFSQykKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0jaWYgZGVmaW5lZChMWU5YT1MpCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IExZTlhDT0ZGTUFHSUM7Ci0jZW5kaWYgLyogTFlOWE9TICovCi0jZW5kaWYgLyogU1BBUkMgKi8KLQotI2lmZGVmIFJTNjAwMENPRkZfQwotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgPyBSUzZLX0FPVVRIRFJfWk1BR0lDIDoKLSAgICAoYWJmZC0+ZmxhZ3MgJiBXUF9URVhUKSA/IFJTNktfQU9VVEhEUl9OTUFHSUMgOgotICAgIFJTNktfQU9VVEhEUl9PTUFHSUM7Ci0jZW5kaWYKLQotI2lmbmRlZiBfX0FfTUFHSUNfU0VUX18KLSNpbmNsdWRlICJZb3VyIGFvdXRoZHIgbWFnaWMgbnVtYmVyIGlzIG5vdCBiZWluZyBzZXQhIgotI2Vsc2UKLSN1bmRlZiBfX0FfTUFHSUNfU0VUX18KLSNlbmRpZgotICB9Ci0KLSAgLyogRklYTUU6IERvZXMgYW55Ym9keSBldmVyIHNldCB0aGlzIHRvIGFub3RoZXIgdmFsdWU/ICAqLwotICBpbnRlcm5hbF9hLnZzdGFtcCA9IDA7Ci0KLSAgLyogTm93IHNob3VsZCB3cml0ZSByZWxvY3MsIHN0cmluZ3MsIHN5bXMgKi8KLSAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IHN5bV9iYXNlOwotCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIGludCBmaXJzdHVuZGVmOwotI2lmIDAKLSAgICAgIGlmICghY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLSAgICAgIGlmICghY29mZl9yZW51bWJlcl9zeW1ib2xzIChhYmZkLCAmZmlyc3R1bmRlZikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgY29mZl9tYW5nbGVfc3ltYm9scyAoYWJmZCk7Ci0gICAgICBpZiAoISBjb2ZmX3dyaXRlX3N5bWJvbHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGNvZmZfd3JpdGVfbGluZW51bWJlcnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGNvZmZfd3JpdGVfcmVsb2NzIChhYmZkLCBmaXJzdHVuZGVmKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0gIGVsc2UgaWYgKGxvbmdfc2VjdGlvbl9uYW1lcykKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSBoYXZlIGxvbmcgc2VjdGlvbiBuYW1lcyB3ZSBoYXZlIHRvIHdyaXRlIG91dCB0aGUgc3RyaW5nCi0gICAgICAgICB0YWJsZSBldmVuIGlmIHRoZXJlIGFyZSBubyBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICghIGNvZmZfd3JpdGVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotI2lmZGVmIFBQQ19QRQotICBlbHNlIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApICE9IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgYjsKLQotICAgICAgLyogUG93ZXJQQyBQRSBhcHBlYXJzIHRvIHJlcXVpcmUgdGhhdCBhbGwgZXhlY3V0YWJsZSBmaWxlcyBiZQotICAgICAgICAgcm91bmRlZCB1cCB0byB0aGUgcGFnZSBzaXplLiAgKi8KLSAgICAgIGIgPSAwOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgQkZEX0FMSUdOIChzeW1fYmFzZSwgQ09GRl9QQUdFX1NJWkUpIC0gMSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLSNlbmRpZgotCi0gIC8qIElmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDAsIHRoZW4gd2UgYXJlIG5vdCB1c2luZyB0aGUgQ09GRgotICAgICBiYWNrZW5kIGxpbmtlciwgYW5kIG9ial9yYXdfc3ltZW50X2NvdW50IGlzIG5vdCB2YWxpZCB1bnRpbCBhZnRlcgotICAgICBjb2ZmX3dyaXRlX3N5bWJvbHMgaXMgY2FsbGVkLiAgKi8KLSAgaWYgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIGludGVybmFsX2YuZl9zeW1wdHIgPSBzeW1fYmFzZTsKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgICAgIC8qIEFJWCBhcHBlYXJzIHRvIHJlcXVpcmUgdGhhdCBGX1JFTEZMRyBub3QgYmUgc2V0IGlmIHRoZXJlIGFyZQotICAgICAgICAgbG9jYWwgc3ltYm9scyBidXQgbm8gcmVsb2NhdGlvbnMuICAqLwotICAgICAgaW50ZXJuYWxfZi5mX2ZsYWdzICY9fiBGX1JFTEZMRzsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChsb25nX3NlY3Rpb25fbmFtZXMpCi0JaW50ZXJuYWxfZi5mX3N5bXB0ciA9IHN5bV9iYXNlOwotICAgICAgZWxzZQotCWludGVybmFsX2YuZl9zeW1wdHIgPSAwOwotICAgICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfTFNZTVM7Ci0gICAgfQotCi0gIGlmICh0ZXh0X3NlYykKLSAgICB7Ci0gICAgICBpbnRlcm5hbF9hLnRzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jICh0ZXh0X3NlYyk7Ci0gICAgICBpbnRlcm5hbF9hLnRleHRfc3RhcnQgPSBpbnRlcm5hbF9hLnRzaXplID8gdGV4dF9zZWMtPnZtYSA6IDA7Ci0gICAgfQotICBpZiAoZGF0YV9zZWMpCi0gICAgewotICAgICAgaW50ZXJuYWxfYS5kc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoZGF0YV9zZWMpOwotICAgICAgaW50ZXJuYWxfYS5kYXRhX3N0YXJ0ID0gaW50ZXJuYWxfYS5kc2l6ZSA/IGRhdGFfc2VjLT52bWEgOiAwOwotICAgIH0KLSAgaWYgKGJzc19zZWMpCi0gICAgewotICAgICAgaW50ZXJuYWxfYS5ic2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoYnNzX3NlYyk7Ci0gICAgICBpZiAoaW50ZXJuYWxfYS5ic2l6ZSAmJiBic3Nfc2VjLT52bWEgPCBpbnRlcm5hbF9hLmRhdGFfc3RhcnQpCi0JaW50ZXJuYWxfYS5kYXRhX3N0YXJ0ID0gYnNzX3NlYy0+dm1hOwotICAgIH0KLQotICBpbnRlcm5hbF9hLmVudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLSAgaW50ZXJuYWxfZi5mX25zeW1zID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotICAgIHsKLSAgICAgIGJmZF92bWEgdG9jOwotICAgICAgYXNlY3Rpb24gKmxvYWRlcl9zZWM7Ci0KLSAgICAgIGludGVybmFsX2EudnN0YW1wID0gMTsKLQotICAgICAgaW50ZXJuYWxfYS5vX3NuZW50cnkgPSB4Y29mZl9kYXRhIChhYmZkKS0+c25lbnRyeTsKLSAgICAgIGlmIChpbnRlcm5hbF9hLm9fc25lbnRyeSA9PSAwKQotCWludGVybmFsX2EuZW50cnkgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgICAgIGlmICh0ZXh0X3NlYyAhPSBOVUxMKQotCXsKLQkgIGludGVybmFsX2Eub19zbnRleHQgPSB0ZXh0X3NlYy0+dGFyZ2V0X2luZGV4OwotCSAgaW50ZXJuYWxfYS5vX2FsZ250ZXh0ID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgdGV4dF9zZWMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnRlcm5hbF9hLm9fc250ZXh0ID0gMDsKLQkgIGludGVybmFsX2Eub19hbGdudGV4dCA9IDA7Ci0JfQotICAgICAgaWYgKGRhdGFfc2VjICE9IE5VTEwpCi0JewotCSAgaW50ZXJuYWxfYS5vX3NuZGF0YSA9IGRhdGFfc2VjLT50YXJnZXRfaW5kZXg7Ci0JICBpbnRlcm5hbF9hLm9fYWxnbmRhdGEgPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBkYXRhX3NlYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludGVybmFsX2Eub19zbmRhdGEgPSAwOwotCSAgaW50ZXJuYWxfYS5vX2FsZ25kYXRhID0gMDsKLQl9Ci0gICAgICBsb2FkZXJfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7Ci0gICAgICBpZiAobG9hZGVyX3NlYyAhPSBOVUxMKQotCWludGVybmFsX2Eub19zbmxvYWRlciA9IGxvYWRlcl9zZWMtPnRhcmdldF9pbmRleDsKLSAgICAgIGVsc2UKLQlpbnRlcm5hbF9hLm9fc25sb2FkZXIgPSAwOwotICAgICAgaWYgKGJzc19zZWMgIT0gTlVMTCkKLQlpbnRlcm5hbF9hLm9fc25ic3MgPSBic3Nfc2VjLT50YXJnZXRfaW5kZXg7Ci0gICAgICBlbHNlCi0JaW50ZXJuYWxfYS5vX3NuYnNzID0gMDsKLQotICAgICAgdG9jID0geGNvZmZfZGF0YSAoYWJmZCktPnRvYzsKLSAgICAgIGludGVybmFsX2Eub190b2MgPSB0b2M7Ci0gICAgICBpbnRlcm5hbF9hLm9fc250b2MgPSB4Y29mZl9kYXRhIChhYmZkKS0+c250b2M7Ci0KLSAgICAgIGludGVybmFsX2Eub19tb2R0eXBlID0geGNvZmZfZGF0YSAoYWJmZCktPm1vZHR5cGU7Ci0gICAgICBpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmNwdXR5cGUgIT0gLTEpCi0JaW50ZXJuYWxfYS5vX2NwdXR5cGUgPSB4Y29mZl9kYXRhIChhYmZkKS0+Y3B1dHlwZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfYXJjaF9yczYwMDA6Ci0JICAgICAgaW50ZXJuYWxfYS5vX2NwdXR5cGUgPSA0OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6Ci0JICAgICAgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gMCkKLQkJaW50ZXJuYWxfYS5vX2NwdXR5cGUgPSAzOwotCSAgICAgIGVsc2UKLQkJaW50ZXJuYWxfYS5vX2NwdXR5cGUgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JfQotICAgICAgaW50ZXJuYWxfYS5vX21heHN0YWNrID0geGNvZmZfZGF0YSAoYWJmZCktPm1heHN0YWNrOwotICAgICAgaW50ZXJuYWxfYS5vX21heGRhdGEgPSB4Y29mZl9kYXRhIChhYmZkKS0+bWF4ZGF0YTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBub3cgd3JpdGUgdGhlbSAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICB7Ci0gICAgY2hhciBidWZmW0ZJTEhTWl07Ci0gICAgY29mZl9zd2FwX2ZpbGVoZHJfb3V0IChhYmZkLCAoUFRSKSAmIGludGVybmFsX2YsIChQVFIpIGJ1ZmYpOwotICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZmYsIDEsIEZJTEhTWiwgYWJmZCkgIT0gRklMSFNaKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICB7Ci0gICAgICAvKiBOb3RlIHRoYXQgcGVpY29kZS5oIGZpbGxzIGluIGEgUEVBT1VUSERSLCBub3QgYW4gQU9VVEhEUi4gCi0JIGluY2x1ZGUvY29mZi9wZS5oIHNldHMgQU9VVFNaID09IHNpemVvZihQRUFPVVRIRFIpKSAqLwotICAgICAgY2hhciBidWZmW0FPVVRTWl07Ci0gICAgICBjb2ZmX3N3YXBfYW91dGhkcl9vdXQgKGFiZmQsIChQVFIpICYgaW50ZXJuYWxfYSwgKFBUUikgYnVmZik7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmLCAxLCBBT1VUU1osIGFiZmQpICE9IEFPVVRTWikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBlbHNlCi0gICAgewotICAgICAgQU9VVEhEUiBidWZmOwotICAgICAgc2l6ZV90IHNpemU7Ci0KLSAgICAgIC8qIFhDT0ZGIHNlZW1zIHRvIGFsd2F5cyB3cml0ZSBhdCBsZWFzdCBhIHNtYWxsIGEub3V0IGhlYWRlci4gICovCi0gICAgICBjb2ZmX3N3YXBfYW91dGhkcl9vdXQgKGFiZmQsIChQVFIpICZpbnRlcm5hbF9hLCAoUFRSKSAmYnVmZik7Ci0gICAgICBpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmZ1bGxfYW91dGhkcikKLQlzaXplID0gQU9VVFNaOwotICAgICAgZWxzZQotCXNpemUgPSBTTUFMTF9BT1VUU1o7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmYnVmZiwgMSwgc2l6ZSwgYWJmZCkgIT0gc2l6ZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpCS8qIHNldCBieSBiZmQuYyBoYW5kbGVyICovCi0gICAgewotICAgICAgaWYgKCEgY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKF9MSUIpICYmICFkZWZpbmVkKFRBUkdfQVVYKQotCi0gICAvKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBmaWVsZCBvZiBhIC5saWIgc2VjdGlvbiBpcyB1c2VkIHRvIGhvbGQgdGhlCi0gICAgICBudW1iZXIgb2Ygc2hhcmVkIGxpYnJhcmllcyBpbiB0aGUgc2VjdGlvbi4gIFRoaXMgY29kZSBjb3VudHMgdGhlCi0gICAgICBudW1iZXIgb2Ygc2VjdGlvbnMgYmVpbmcgd3JpdHRlbiwgYW5kIGluY3JlbWVudHMgdGhlIGxtYSBmaWVsZAotICAgICAgd2l0aCB0aGUgbnVtYmVyLgotCi0gICAgICBJIGhhdmUgZm91bmQgbm8gZG9jdW1lbnRhdGlvbiBvbiB0aGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uLgotICAgICAgRXhwZXJpbWVudGF0aW9uIGluZGljYXRlcyB0aGF0IHRoZSBzZWN0aW9uIGNvbnRhaW5zIHplcm8gb3IgbW9yZQotICAgICAgcmVjb3JkcywgZWFjaCBvZiB3aGljaCBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6Ci0KLSAgICAgIC0gYSAoZm91ciBieXRlKSB3b3JkIGhvbGRpbmcgdGhlIGxlbmd0aCBvZiB0aGlzIHJlY29yZCwgaW4gd29yZHMsCi0gICAgICAtIGEgd29yZCB0aGF0IGFsd2F5cyBzZWVtcyB0byBiZSBzZXQgdG8gIjIiLAotICAgICAgLSB0aGUgcGF0aCB0byBhIHNoYXJlZCBsaWJyYXJ5LCBudWxsLXRlcm1pbmF0ZWQgYW5kIHRoZW4gcGFkZGVkCi0gICAgICAgIHRvIGEgd2hvbGUgd29yZCBib3VuZGFyeS4KLQotICAgICAgYmZkX2Fzc2VydCBjYWxscyBoYXZlIGJlZW4gYWRkZWQgdG8gYWxlcnQgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlCi0gICAgICB0byB3cml0ZSBhIHNlY3Rpb24gd2hpY2ggZG9lc24ndCBmb2xsb3cgdGhlc2UgYXNzdW1wdGlvbnMuICBUaGUKLSAgICAgIGNvZGUgaGFzIGJlZW4gdGVzdGVkIG9uIElTQyA0LjEgYnkgbWUsIGFuZCBvbiBTQ08gYnkgUm9iZXJ0IExpcGUKLSAgICAgIDxyb2JlcnRsQGFybmV0LmNvbT4gKFRoYW5rcyEpLgotICAKLSAgICAgIEd2cmFuIFVkZGVib3JnIDxndnJhbkB1ZGRlYm9yZy5wcC5zZT4gKi8KLQotICAgIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9MSUIpID09IDApCi0gICAgICB7Ci0JYmZkX2J5dGUgKnJlYywgKnJlY2VuZDsKLQotCXJlYyA9IChiZmRfYnl0ZSAqKSBsb2NhdGlvbjsKLQlyZWNlbmQgPSByZWMgKyBjb3VudDsKLQl3aGlsZSAocmVjIDwgcmVjZW5kKQotCSAgewotCSAgICArK3NlY3Rpb24tPmxtYTsKLQkgICAgcmVjICs9IGJmZF9nZXRfMzIgKGFiZmQsIHJlYykgKiA0OwotCSAgfQotCi0JQkZEX0FTU0VSVCAocmVjID09IHJlY2VuZCk7Ci0gICAgICB9Ci0KLSNlbmRpZgotCi0gIC8qIERvbid0IHdyaXRlIG91dCBic3Mgc2VjdGlvbnMgLSBvbmUgd2F5IHRvIGRvIHRoaXMgaXMgdG8KLSAgICAgICBzZWUgaWYgdGhlIGZpbGVwb3MgaGFzIG5vdCBiZWVuIHNldC4gKi8KLSAgaWYgKHNlY3Rpb24tPmZpbGVwb3MgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQpLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvdW50ICE9IDApCi0gICAgewotICAgICAgcmV0dXJuIChiZmRfd3JpdGUgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgPT0gY291bnQpID8gdHJ1ZSA6IGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jaWYgMAotc3RhdGljIGJvb2xlYW4KLWNvZmZfY2xvc2VfYW5kX2NsZWFudXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCFiZmRfcmVhZF9wIChhYmZkKSkKLSAgICBzd2l0Y2ggKGFiZmQtPmZvcm1hdCkKLSAgICAgIHsKLSAgICAgIGNhc2UgYmZkX2FyY2hpdmU6Ci0JaWYgKCFfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMgKGFiZmQpKQotCSAgcmV0dXJuIGZhbHNlOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfb2JqZWN0OgotCWlmICghY29mZl93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpKQotCSAgcmV0dXJuIGZhbHNlOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCXJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAvKiBXZSBkZXBlbmQgb24gYmZkX2Nsb3NlIHRvIGZyZWUgYWxsIHRoZSBtZW1vcnkgb24gdGhlIG9iamFsbG9jLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgUFRSCi1idXlfYW5kX3JlYWQgKGFiZmQsIHdoZXJlLCBzZWVrX2RpcmVjdGlvbiwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBmaWxlX3B0ciB3aGVyZTsKLSAgICAgaW50IHNlZWtfZGlyZWN0aW9uOwotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIGFyZWEgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICBpZiAoIWFyZWEpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCB3aGVyZSwgc2Vla19kaXJlY3Rpb24pICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChhcmVhLCAxLCBzaXplLCBhYmZkKSAhPSBzaXplKQotICAgIHJldHVybiAoTlVMTCk7Ci0gIHJldHVybiAoYXJlYSk7Ci19CQkJCS8qIGJ1eV9hbmRfcmVhZCgpICovCi0KLS8qCi1TVUJTVUJTRUNUSU9OCi0JUmVhZGluZyBsaW5lbnVtYmVycwotCi0JQ3JlYXRpbmcgdGhlIGxpbmVudW1iZXIgdGFibGUgaXMgZG9uZSBieSByZWFkaW5nIGluIHRoZSBlbnRpcmUKLQljb2ZmIGxpbmVudW1iZXIgdGFibGUsIGFuZCBjcmVhdGluZyBhbm90aGVyIHRhYmxlIGZvciBpbnRlcm5hbCB1c2UuCi0KLQlBIGNvZmYgbGluZW51bWJlciB0YWJsZSBpcyBzdHJ1Y3R1cmVkIHNvIHRoYXQgZWFjaCBmdW5jdGlvbgotCWlzIG1hcmtlZCBhcyBoYXZpbmcgYSBsaW5lIG51bWJlciBvZiAwLiBFYWNoIGxpbmUgd2l0aGluIHRoZQotCWZ1bmN0aW9uIGlzIGFuIG9mZnNldCBmcm9tIHRoZSBmaXJzdCBsaW5lIGluIHRoZSBmdW5jdGlvbi4gVGhlCi0JYmFzZSBvZiB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoZSB0YWJsZSBpcyBzdG9yZWQgaW4KLQl0aGUgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24uCi0KLQlUaGUgaW5mb3JtYXRpb24gaXMgY29waWVkIGZyb20gdGhlIGV4dGVybmFsIHRvIHRoZSBpbnRlcm5hbAotCXRhYmxlLCBhbmQgZWFjaCBzeW1ib2wgd2hpY2ggbWFya3MgYSBmdW5jdGlvbiBpcyBtYXJrZWQgYnkKLQlwb2ludGluZyBpdHMuLi4KLQotCUhvdyBkb2VzIHRoaXMgd29yayA/Ci0KLSovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3NsdXJwX2xpbmVfdGFibGUgKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLXsKLSAgTElORU5PICpuYXRpdmVfbGluZW5vOwotICBhbGVudCAqbGluZW5vX2NhY2hlOwotCi0gIEJGRF9BU1NFUlQgKGFzZWN0LT5saW5lbm8gPT0gKGFsZW50ICopIE5VTEwpOwotCi0gIG5hdGl2ZV9saW5lbm8gPSAoTElORU5PICopIGJ1eV9hbmRfcmVhZCAoYWJmZCwKLQkJCQkJICAgYXNlY3QtPmxpbmVfZmlsZXBvcywKLQkJCQkJICAgU0VFS19TRVQsCi0JCQkJCSAgIChzaXplX3QpIChMSU5FU1ogKgotCQkJCQkJICAgICBhc2VjdC0+bGluZW5vX2NvdW50KSk7Ci0gIGxpbmVub19jYWNoZSA9Ci0gICAgKGFsZW50ICopIGJmZF9hbGxvYyAoYWJmZCwgKHNpemVfdCkgKChhc2VjdC0+bGluZW5vX2NvdW50ICsgMSkgKiBzaXplb2YgKGFsZW50KSkpOwotICBpZiAobGluZW5vX2NhY2hlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICAgICAgYWxlbnQgKmNhY2hlX3B0ciA9IGxpbmVub19jYWNoZTsKLSAgICAgIExJTkVOTyAqc3JjID0gbmF0aXZlX2xpbmVubzsKLQotICAgICAgd2hpbGUgKGNvdW50ZXIgPCBhc2VjdC0+bGluZW5vX2NvdW50KQotCXsKLQkgIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gZHN0OwotCSAgY29mZl9zd2FwX2xpbmVub19pbiAoYWJmZCwgc3JjLCAmZHN0KTsKLQkgIGNhY2hlX3B0ci0+bGluZV9udW1iZXIgPSBkc3QubF9sbm5vOwotCi0JICBpZiAoY2FjaGVfcHRyLT5saW5lX251bWJlciA9PSAwKQotCSAgICB7Ci0JICAgICAgYm9vbGVhbiB3YXJuZWQ7Ci0JICAgICAgbG9uZyBzeW1uZHg7Ci0JICAgICAgY29mZl9zeW1ib2xfdHlwZSAqc3ltOwotCi0JICAgICAgd2FybmVkID0gZmFsc2U7Ci0JICAgICAgc3ltbmR4ID0gZHN0LmxfYWRkci5sX3N5bW5keDsKLQkgICAgICBpZiAoc3ltbmR4IDwgMAotCQkgIHx8ICh1bnNpZ25lZCBsb25nKSBzeW1uZHggPj0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6IHdhcm5pbmc6IGlsbGVnYWwgc3ltYm9sIGluZGV4ICVsZCBpbiBsaW5lIG51bWJlcnMiKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgZHN0LmxfYWRkci5sX3N5bW5keCk7Ci0JCSAgc3ltbmR4ID0gMDsKLQkJICB3YXJuZWQgPSB0cnVlOwotCQl9Ci0JICAgICAgLyogRklYTUU6IFdlIHNob3VsZCBub3QgYmUgY2FzdGluZyBiZXR3ZWVuIGludHMgYW5kCi0gICAgICAgICAgICAgICAgIHBvaW50ZXJzIGxpa2UgdGhpcy4gICovCi0JICAgICAgc3ltID0gKChjb2ZmX3N5bWJvbF90eXBlICopCi0JCSAgICAgKChzeW1uZHggKyBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKQotCQkgICAgICAtPnUuc3ltZW50Ll9uLl9uX24uX25femVyb2VzKSk7Ci0JICAgICAgY2FjaGVfcHRyLT51LnN5bSA9IChhc3ltYm9sICopIHN5bTsKLQkgICAgICBpZiAoc3ltLT5saW5lbm8gIT0gTlVMTCAmJiAhIHdhcm5lZCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiB3YXJuaW5nOiBkdXBsaWNhdGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIGAlcyciKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJICAgICBiZmRfYXN5bWJvbF9uYW1lICgmc3ltLT5zeW1ib2wpKTsKLQkJfQotCSAgICAgIHN5bS0+bGluZW5vID0gY2FjaGVfcHRyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjYWNoZV9wdHItPnUub2Zmc2V0ID0gZHN0LmxfYWRkci5sX3BhZGRyCi0JCS0gYmZkX3NlY3Rpb25fdm1hIChhYmZkLCBhc2VjdCk7Ci0JICAgIH0JCQkvKiBJZiBubyBsaW5lbnVtYmVyIGV4cGVjdCBhIHN5bWJvbCBpbmRleCAqLwotCi0JICBjYWNoZV9wdHIrKzsKLQkgIHNyYysrOwotCSAgY291bnRlcisrOwotCX0KLSAgICAgIGNhY2hlX3B0ci0+bGluZV9udW1iZXIgPSAwOwotCi0gICAgfQotICBhc2VjdC0+bGluZW5vID0gbGluZW5vX2NhY2hlOwotICAvKiBGSVhNRSwgZnJlZSBuYXRpdmVfbGluZW5vIGhlcmUsIG9yIHVzZSBhbGxvY2Egb3Igc29tZXRoaW5nLiAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICBjb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmVfc3ltYm9sczsKLSAgY29mZl9zeW1ib2xfdHlwZSAqY2FjaGVkX2FyZWE7Ci0gIHVuc2lnbmVkIGludCAqdGFibGVfcHRyOwotCi0gIHVuc2lnbmVkIGludCBudW1iZXJfb2Zfc3ltYm9scyA9IDA7Ci0KLSAgaWYgKG9ial9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBSZWFkIGluIHRoZSBzeW1ib2wgdGFibGUgKi8KLSAgaWYgKChuYXRpdmVfc3ltYm9scyA9IGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiIChhYmZkKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXR1cm4gKGZhbHNlKTsKLSAgICB9CQkJCS8qIG9uIGVycm9yICovCi0KLSAgLyogQWxsb2NhdGUgZW5vdWdoIHJvb20gZm9yIGFsbCB0aGUgc3ltYm9scyBpbiBjYWNoZWQgZm9ybSAqLwotICBjYWNoZWRfYXJlYSA9ICgoY29mZl9zeW1ib2xfdHlwZSAqKQotCQkgYmZkX2FsbG9jIChhYmZkLAotCQkJICAgIChvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkKLQkJCSAgICAgKiBzaXplb2YgKGNvZmZfc3ltYm9sX3R5cGUpKSkpOwotCi0gIGlmIChjYWNoZWRfYXJlYSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgdGFibGVfcHRyID0gKCh1bnNpZ25lZCBpbnQgKikKLQkgICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJICAob2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpCi0JCQkgICAqIHNpemVvZiAodW5zaWduZWQgaW50KSkpKTsKLQotICBpZiAodGFibGVfcHRyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbHNlCi0gICAgewotICAgICAgY29mZl9zeW1ib2xfdHlwZSAqZHN0ID0gY2FjaGVkX2FyZWE7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGFzdF9uYXRpdmVfaW5kZXggPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7Ci0gICAgICB1bnNpZ25lZCBpbnQgdGhpc19pbmRleCA9IDA7Ci0gICAgICB3aGlsZSAodGhpc19pbmRleCA8IGxhc3RfbmF0aXZlX2luZGV4KQotCXsKLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnNyYyA9IG5hdGl2ZV9zeW1ib2xzICsgdGhpc19pbmRleDsKLQkgIHRhYmxlX3B0clt0aGlzX2luZGV4XSA9IG51bWJlcl9vZl9zeW1ib2xzOwotCSAgZHN0LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0KLQkgIGRzdC0+c3ltYm9sLm5hbWUgPSAoY2hhciAqKSAoc3JjLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCk7Ci0JICAvKiBXZSB1c2UgdGhlIG5hdGl2ZSBuYW1lIGZpZWxkIHRvIHBvaW50IHRvIHRoZSBjYWNoZWQgZmllbGQuICAqLwotCSAgc3JjLT51LnN5bWVudC5fbi5fbl9uLl9uX3plcm9lcyA9IChsb25nKSBkc3Q7Ci0JICBkc3QtPnN5bWJvbC5zZWN0aW9uID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChhYmZkLAotCQkJCQkJICAgICBzcmMtPnUuc3ltZW50Lm5fc2NudW0pOwotCSAgZHN0LT5zeW1ib2wuZmxhZ3MgPSAwOwotCSAgZHN0LT5kb25lX2xpbmVubyA9IGZhbHNlOwotCi0JICBzd2l0Y2ggKHNyYy0+dS5zeW1lbnQubl9zY2xhc3MpCi0JICAgIHsKLSNpZmRlZiBJOTYwCi0JICAgIGNhc2UgQ19MRUFGRVhUOgotI2lmIDAKLQkgICAgICBkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZSAtIGRzdC0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMOwotCSAgICAgIGRzdC0+c3ltYm9sLmZsYWdzIHw9IEJTRl9OT1RfQVRfRU5EIHwgQlNGX0ZVTkNUSU9OOwotI2VuZGlmCi0JICAgICAgLyogRmFsbCB0aHJvdWdoIHRvIG5leHQgY2FzZSAqLwotCi0jZW5kaWYKLQotCSAgICBjYXNlIENfRVhUOgotCSAgICBjYXNlIENfV0VBS0VYVDoKLSNpZiBkZWZpbmVkIEFSTQotICAgICAgICAgICAgY2FzZSBDX1RIVU1CRVhUOgotICAgICAgICAgICAgY2FzZSBDX1RIVU1CRVhURlVOQzoKLSNlbmRpZgotI2lmZGVmIFJTNjAwMENPRkZfQwotCSAgICBjYXNlIENfSElERVhUOgotI2VuZGlmCi0jaWZkZWYgQ19TWVNURU0KLQkgICAgY2FzZSBDX1NZU1RFTToJLyogU3lzdGVtIFdpZGUgdmFyaWFibGUgKi8KLSNlbmRpZgotI2lmZGVmIENPRkZfV0lUSF9QRQotICAgICAgICAgICAgLyogUEUgdXNlcyBzdG9yYWdlIGNsYXNzIDB4NjggdG8gZGVub3RlIGEgc2VjdGlvbiBzeW1ib2wgKi8KLSAgICAgICAgICAgIGNhc2UgQ19TRUNUSU9OOgotCSAgICAvKiBQRSB1c2VzIHN0b3JhZ2UgY2xhc3MgMHg2OSBmb3IgYSB3ZWFrIGV4dGVybmFsIHN5bWJvbC4gICovCi0JICAgIGNhc2UgQ19OVF9XRUFLOgotI2VuZGlmCi0JICAgICAgaWYgKChzcmMtPnUuc3ltZW50Lm5fc2NudW0pID09IDApCi0JCXsKLQkJICBpZiAoKHNyYy0+dS5zeW1lbnQubl92YWx1ZSkgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgZHN0LT5zeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCSAgICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gMDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGRzdC0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCQkgICAgICBkc3QtPnN5bWJvbC52YWx1ZSA9IChzcmMtPnUuc3ltZW50Lm5fdmFsdWUpOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogQmFzZSB0aGUgdmFsdWUgYXMgYW4gaW5kZXggZnJvbSB0aGUgYmFzZSBvZiB0aGUKLQkJICAgICBzZWN0aW9uICovCi0KLQkJICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMOwotCi0jaWYgZGVmaW5lZCBDT0ZGX1dJVEhfUEUKLQkJICAvKiBQRSBzZXRzIHRoZSBzeW1ib2wgdG8gYSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgKi8KLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLSNlbHNlCi0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlCi0JCQkJICAgICAgIC0gZHN0LT5zeW1ib2wuc2VjdGlvbi0+dm1hKTsKLSNlbmRpZgotCi0JCSAgaWYgKElTRkNOICgoc3JjLT51LnN5bWVudC5uX3R5cGUpKSkKLQkJICAgIHsKLQkJICAgICAgLyogQSBmdW5jdGlvbiBleHQgZG9lcyBub3QgZ28gYXQgdGhlIGVuZCBvZiBhCi0JCQkgZmlsZS4gICovCi0JCSAgICAgIGRzdC0+c3ltYm9sLmZsYWdzIHw9IEJTRl9OT1RfQVRfRU5EIHwgQlNGX0ZVTkNUSU9OOwotCQkgICAgfQotCQl9Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLQkgICAgICAvKiBBIENfSElERVhUIHN5bWJvbCBpcyBub3QgZ2xvYmFsLiAgKi8KLQkgICAgICBpZiAoc3JjLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0hJREVYVCkKLQkJZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0JICAgICAgLyogQSBzeW1ib2wgd2l0aCBhIGNzZWN0IGVudHJ5IHNob3VsZCBub3QgZ28gYXQgdGhlIGVuZC4gICovCi0JICAgICAgaWYgKHNyYy0+dS5zeW1lbnQubl9udW1hdXggPiAwKQotCQlkc3QtPnN5bWJvbC5mbGFncyB8PSBCU0ZfTk9UX0FUX0VORDsKLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0JICAgICAgaWYgKHNyYy0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19OVF9XRUFLKQotCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOwotCSAgICAgIGlmIChzcmMtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfU0VDVElPTgotCQkgICYmIHNyYy0+dS5zeW1lbnQubl9zY251bSA+IDApCi0JCXsKLQkJICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9MT0NBTDsKLQkJfQotI2VuZGlmCi0KLQkgICAgICBpZiAoc3JjLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1dFQUtFWFQpCi0JCWRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX1dFQUs7Ci0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfU1RBVDoJLyogc3RhdGljCQkJICovCi0jaWZkZWYgSTk2MAotCSAgICBjYXNlIENfTEVBRlNUQVQ6CS8qIHN0YXRpYyBsZWFmIHByb2NlZHVyZSAgICAgICAgKi8KLSNlbmRpZgotI2lmIGRlZmluZWQgQVJNIAotICAgICAgICAgICAgY2FzZSBDX1RIVU1CU1RBVDogICAvKiBUaHVtYiBzdGF0aWMgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgY2FzZSBDX1RIVU1CTEFCRUw6ICAvKiBUaHVtYiBsYWJlbCAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgY2FzZSBDX1RIVU1CU1RBVEZVTkM6LyogVGh1bWIgc3RhdGljIGZ1bmN0aW9uICAgICAgICAqLwotI2VuZGlmCi0JICAgIGNhc2UgQ19MQUJFTDoJLyogbGFiZWwJCQkgKi8KLQkgICAgICBpZiAoc3JjLT51LnN5bWVudC5uX3NjbnVtID09IC0yKQotCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgZWxzZQotCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9MT0NBTDsKLQotCSAgICAgIC8qIEJhc2UgdGhlIHZhbHVlIGFzIGFuIGluZGV4IGZyb20gdGhlIGJhc2Ugb2YgdGhlCi0JCSBzZWN0aW9uLCBpZiB0aGVyZSBpcyBvbmUuICAqLwotCSAgICAgIGlmIChkc3QtPnN5bWJvbC5zZWN0aW9uKQotCQl7Ci0jaWYgZGVmaW5lZCBDT0ZGX1dJVEhfUEUKLQkJICAvKiBQRSBzZXRzIHRoZSBzeW1ib2wgdG8gYSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgKi8KLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLSNlbHNlCi0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlCi0JCQkJICAgICAgIC0gZHN0LT5zeW1ib2wuc2VjdGlvbi0+dm1hKTsKLSNlbmRpZgotCQl9Ci0JICAgICAgZWxzZQotCQlkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfTU9TOgkvKiBtZW1iZXIgb2Ygc3RydWN0dXJlCSAqLwotCSAgICBjYXNlIENfRU9TOgkvKiBlbmQgb2Ygc3RydWN0dXJlCQkgKi8KLSNpZmRlZiBOT1RERUYJCQkvKiBDX0FVVE9BUkcgaGFzIHRoZSBzYW1lIHZhbHVlICovCi0jaWZkZWYgQ19HTEJMUkVHCi0JICAgIGNhc2UgQ19HTEJMUkVHOgkvKiBBMjlrLXNwZWNpZmljIHN0b3JhZ2UgY2xhc3MgKi8KLSNlbmRpZgotI2VuZGlmCi0JICAgIGNhc2UgQ19SRUdQQVJNOgkvKiByZWdpc3RlciBwYXJhbWV0ZXIJCSAqLwotCSAgICBjYXNlIENfUkVHOgkvKiByZWdpc3RlciB2YXJpYWJsZQkJICovCi0jaWZuZGVmIFRJQzgwQ09GRgotI2lmZGVmIENfQVVUT0FSRwotCSAgICBjYXNlIENfQVVUT0FSRzoJLyogOTYwLXNwZWNpZmljIHN0b3JhZ2UgY2xhc3MgKi8KLSNlbmRpZgotI2VuZGlmCi0JICAgIGNhc2UgQ19UUERFRjoJLyogdHlwZSBkZWZpbml0aW9uCQkgKi8KLQkgICAgY2FzZSBDX0FSRzoKLQkgICAgY2FzZSBDX0FVVE86CS8qIGF1dG9tYXRpYyB2YXJpYWJsZSAqLwotCSAgICBjYXNlIENfRklFTEQ6CS8qIGJpdCBmaWVsZCAqLwotCSAgICBjYXNlIENfRU5UQUc6CS8qIGVudW1lcmF0aW9uIHRhZwkJICovCi0JICAgIGNhc2UgQ19NT0U6CS8qIG1lbWJlciBvZiBlbnVtZXJhdGlvbgkgKi8KLQkgICAgY2FzZSBDX01PVToJLyogbWVtYmVyIG9mIHVuaW9uCQkgKi8KLQkgICAgY2FzZSBDX1VOVEFHOgkvKiB1bmlvbiB0YWcJCQkgKi8KLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfRklMRToJLyogZmlsZSBuYW1lCQkJICovCi0JICAgIGNhc2UgQ19TVFJUQUc6CS8qIHN0cnVjdHVyZSB0YWcJCSAqLwotI2lmZGVmIFJTNjAwMENPRkZfQwotCSAgICBjYXNlIENfR1NZTToKLQkgICAgY2FzZSBDX0xTWU06Ci0JICAgIGNhc2UgQ19QU1lNOgotCSAgICBjYXNlIENfUlNZTToKLQkgICAgY2FzZSBDX1JQU1lNOgotCSAgICBjYXNlIENfU1RTWU06Ci0JICAgIGNhc2UgQ19CQ09NTToKLQkgICAgY2FzZSBDX0VDT01NOgotCSAgICBjYXNlIENfREVDTDoKLQkgICAgY2FzZSBDX0VOVFJZOgotCSAgICBjYXNlIENfRlVOOgotCSAgICBjYXNlIENfRVNUQVQ6Ci0jZW5kaWYKLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgICAgICBicmVhazsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotCSAgICBjYXNlIENfQklOQ0w6CS8qIGJlZ2lubmluZyBvZiBpbmNsdWRlIGZpbGUgICAgICovCi0JICAgIGNhc2UgQ19FSU5DTDoJLyogZW5kaW5nIG9mIGluY2x1ZGUgZmlsZSAgICAgICAgKi8KLQkgICAgICAvKiBUaGUgdmFsdWUgaXMgYWN0dWFsbHkgYSBwb2ludGVyIGludG8gdGhlIGxpbmUgbnVtYmVycwotICAgICAgICAgICAgICAgICBvZiB0aGUgZmlsZS4gIFdlIGxvY2F0ZSB0aGUgbGluZSBudW1iZXIgZW50cnksIGFuZAotICAgICAgICAgICAgICAgICBzZXQgdGhlIHNlY3Rpb24gdG8gdGhlIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgaXQsIGFuZAotICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGhlIGluZGV4IGluIHRoYXQgc2VjdGlvbi4gICovCi0JICAgICAgewotCQlhc2VjdGlvbiAqc2VjOwotCi0JCWRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLQkJZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLQkJICBpZiAoc2VjLT5saW5lX2ZpbGVwb3MgPD0gKGZpbGVfcHRyKSBzcmMtPnUuc3ltZW50Lm5fdmFsdWUKLQkJICAgICAgJiYgKChmaWxlX3B0cikgKHNlYy0+bGluZV9maWxlcG9zCi0JCQkJICAgICAgKyBzZWMtPmxpbmVub19jb3VudCAqIExJTkVTWikKLQkJCSAgPiAoZmlsZV9wdHIpIHNyYy0+dS5zeW1lbnQubl92YWx1ZSkpCi0JCSAgICBicmVhazsKLQkJaWYgKHNlYyA9PSBOVUxMKQotCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gMDsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGRzdC0+c3ltYm9sLnNlY3Rpb24gPSBzZWM7Ci0JCSAgICBkc3QtPnN5bWJvbC52YWx1ZSA9ICgoc3JjLT51LnN5bWVudC5uX3ZhbHVlCi0JCQkJCSAgLSBzZWMtPmxpbmVfZmlsZXBvcykKLQkJCQkJIC8gTElORVNaKTsKLQkJICAgIHNyYy0+Zml4X2xpbmUgPSAxOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDX0JTVEFUOgotCSAgICAgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLQotCSAgICAgIC8qIFRoZSB2YWx1ZSBpcyBhY3R1YWxseSBhIHN5bWJvbCBpbmRleC4gIFNhdmUgYSBwb2ludGVyCi0JCSB0byB0aGUgc3ltYm9sIGluc3RlYWQgb2YgdGhlIGluZGV4LiAgRklYTUU6IFRoaXMKLQkJIHNob3VsZCB1c2UgYSB1bmlvbi4gICovCi0JICAgICAgc3JjLT51LnN5bWVudC5uX3ZhbHVlID0KLQkJKGxvbmcpIChuYXRpdmVfc3ltYm9scyArIHNyYy0+dS5zeW1lbnQubl92YWx1ZSk7Ci0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0JICAgICAgc3JjLT5maXhfdmFsdWUgPSAxOwotCSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLQkgICAgY2FzZSBDX0JMT0NLOgkvKiAiLmJiIiBvciAiLmViIgkJICovCi0JICAgIGNhc2UgQ19GQ046CQkvKiAiLmJmIiBvciAiLmVmIgkJICovCi0JICAgIGNhc2UgQ19FRkNOOgkvKiBwaHlzaWNhbCBlbmQgb2YgZnVuY3Rpb24JICovCi0JICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0jaWYgZGVmaW5lZCBDT0ZGX1dJVEhfUEUKLQkgICAgICAvKiBQRSBzZXRzIHRoZSBzeW1ib2wgdG8gYSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQKLQkJIG9mIHRoZSBzZWN0aW9uLiAgKi8KLQkgICAgICBkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLSNlbHNlCi0JICAgICAgLyogQmFzZSB0aGUgdmFsdWUgYXMgYW4gaW5kZXggZnJvbSB0aGUgYmFzZSBvZiB0aGUKLQkJIHNlY3Rpb24uICAqLwotCSAgICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZQotCQkJCSAgIC0gZHN0LT5zeW1ib2wuc2VjdGlvbi0+dm1hKTsKLSNlbmRpZgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ19OVUxMOgotCSAgICBjYXNlIENfRVhUREVGOgkvKiBleHRlcm5hbCBkZWZpbml0aW9uCQkgKi8KLQkgICAgY2FzZSBDX1VMQUJFTDoJLyogdW5kZWZpbmVkIGxhYmVsCQkgKi8KLQkgICAgY2FzZSBDX1VTVEFUSUM6CS8qIHVuZGVmaW5lZCBzdGF0aWMJCSAqLwotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgICAgICAgIC8qIENfTElORSBpbiByZWd1bGFyIGNvZmYgaXMgMHg2OC4gIE5UIGhhcyB0YWtlbiBvdmVyIHRoaXMgc3RvcmFnZQotICAgICAgICAgICAgICAgY2xhc3MgdG8gcmVwcmVzZW50IGEgc2VjdGlvbiBzeW1ib2wgKi8KLQkgICAgY2FzZSBDX0xJTkU6CS8qIGxpbmUgIyByZWZvcm1hdHRlZCBhcyBzeW1ib2wgdGFibGUgZW50cnkgKi8KLQkgICAgICAvKiBOVCB1c2VzIDB4NjcgZm9yIGEgd2VhayBzeW1ib2wsIG5vdCBDX0FMSUFTLiAgKi8KLQkgICAgY2FzZSBDX0FMSUFTOgkvKiBkdXBsaWNhdGUgdGFnCQkgKi8KLSNlbmRpZgotCSAgICAgIC8qIE5ldyBzdG9yYWdlIGNsYXNzZXMgZm9yIFRJYzgwICovCi0jaWZkZWYgVElDODBDT0ZGCi0JICAgIGNhc2UgQ19VRVhUOgkvKiBUZW50YXRpdmUgZXh0ZXJuYWwgZGVmaW5pdGlvbiAqLwotI2VuZGlmCi0JICAgIGNhc2UgQ19TVEFUTEFCOgkvKiBTdGF0aWMgbG9hZCB0aW1lIGxhYmVsICovCi0JICAgIGNhc2UgQ19FWFRMQUI6CS8qIEV4dGVybmFsIGxvYWQgdGltZSBsYWJlbCAqLwotCSAgICBjYXNlIENfSElEREVOOgkvKiBleHQgc3ltYm9sIGluIGRtZXJ0IHB1YmxpYyBsaWIgKi8KLQkgICAgZGVmYXVsdDoKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiBVbnJlY29nbml6ZWQgc3RvcmFnZSBjbGFzcyAlZCBmb3IgJXMgc3ltYm9sIGAlcyciKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzcmMtPnUuc3ltZW50Lm5fc2NsYXNzLAotCQkgZHN0LT5zeW1ib2wuc2VjdGlvbi0+bmFtZSwgZHN0LT5zeW1ib2wubmFtZSk7Ci0JICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCSAgICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotLyogICAgICBCRkRfQVNTRVJUKGRzdC0+c3ltYm9sLmZsYWdzICE9IDApOyovCi0KLQkgIGRzdC0+bmF0aXZlID0gc3JjOwotCi0JICBkc3QtPnN5bWJvbC51ZGF0YS5pID0gMDsKLQkgIGRzdC0+bGluZW5vID0gKGFsZW50ICopIE5VTEw7Ci0JICB0aGlzX2luZGV4ICs9IChzcmMtPnUuc3ltZW50Lm5fbnVtYXV4KSArIDE7Ci0JICBkc3QrKzsKLQkgIG51bWJlcl9vZl9zeW1ib2xzKys7Ci0JfQkJCS8qIHdhbGsgdGhlIG5hdGl2ZSBzeW10YWIgKi8KLSAgICB9CQkJCS8qIGJmZGl6ZSB0aGUgbmF0aXZlIHN5bXRhYiAqLwotCi0gIG9ial9zeW1ib2xzIChhYmZkKSA9IGNhY2hlZF9hcmVhOwotICBvYmpfcmF3X3N5bWVudHMgKGFiZmQpID0gbmF0aXZlX3N5bWJvbHM7Ci0KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBudW1iZXJfb2Zfc3ltYm9sczsKLSAgb2JqX2NvbnZlcnQgKGFiZmQpID0gdGFibGVfcHRyOwotICAvKiBTbHVycCB0aGUgbGluZSB0YWJsZXMgZm9yIGVhY2ggc2VjdGlvbiB0b28gKi8KLSAgewotICAgIGFzZWN0aW9uICpwOwotICAgIHAgPSBhYmZkLT5zZWN0aW9uczsKLSAgICB3aGlsZSAocCkKLSAgICAgIHsKLQljb2ZmX3NsdXJwX2xpbmVfdGFibGUgKGFiZmQsIHApOwotCXAgPSBwLT5uZXh0OwotICAgICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQkJCQkvKiBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSgpICovCi0KLS8qIENoZWNrIHdoZXRoZXIgYSBzeW1ib2wgaXMgZ2xvYmFsbHkgdmlzaWJsZS4gIFRoaXMgaXMgdXNlZCBieSB0aGUKLSAgIENPRkYgYmFja2VuZCBsaW5rZXIgY29kZSBpbiBjb2ZmbGluay5jLCBzaW5jZSBhIGNvdXBsZSBvZiB0YXJnZXRzCi0gICBoYXZlIGdsb2JhbGx5IHZpc2libGUgc3ltYm9scyB3aGljaCBhcmUgbm90IGNsYXNzIENfRVhULiAgVGhpcwotICAgZnVuY3Rpb24gbmVlZCBub3QgaGFuZGxlIHRoZSBjYXNlIG9mIG5fY2xhc3MgPT0gQ19FWFQuICAqLwotCi0jdW5kZWYgT1RIRVJfR0xPQkFMX0NMQVNTCi0KLSNpZmRlZiBJOTYwCi0jZGVmaW5lIE9USEVSX0dMT0JBTF9DTEFTUyBDX0xFQUZFWFQKLSNlbmRpZgotCi0jaWZkZWYgQ09GRkFSTQotI2RlZmluZSBPVEhFUl9HTE9CQUxfQ0xBU1MgQ19USFVNQkVYVCB8fCBzeW1lbnQtPm5fc2NsYXNzID09IENfVEhVTUJFWFRGVU5DCi0jZWxzZQotI2lmZGVmIENPRkZfV0lUSF9QRQotI2RlZmluZSBPVEhFUl9HTE9CQUxfQ0xBU1MgQ19TRUNUSU9OCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgT1RIRVJfR0xPQkFMX0NMQVNTCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfc3ltX2lzX2dsb2JhbCBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3N5bV9pc19nbG9iYWwgKGFiZmQsIHN5bWVudCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqIHN5bWVudDsKLXsKLSAgcmV0dXJuIChzeW1lbnQtPm5fc2NsYXNzID09IE9USEVSX0dMT0JBTF9DTEFTUyk7Ci19Ci0KLSN1bmRlZiBPVEhFUl9HTE9CQUxfQ0xBU1MKLQotI2Vsc2UgLyogISBkZWZpbmVkIChPVEhFUl9HTE9CQUxfQ0xBU1MpICovCi0KLS8qIHN5bV9pc19nbG9iYWwgc2hvdWxkIG5vdCBiZSBkZWZpbmVkIGlmIGl0IGhhcyBub3RoaW5nIHRvIGRvLiAgKi8KLQotI2RlZmluZSBjb2ZmX3N5bV9pc19nbG9iYWwgMAotCi0jZW5kaWYgLyogISBkZWZpbmVkIChPVEhFUl9HTE9CQUxfQ0xBU1MpICovCi0KLS8qCi1TVUJTVUJTRUNUSU9OCi0JUmVhZGluZyByZWxvY2F0aW9ucwotCi0JQ29mZiByZWxvY2F0aW9ucyBhcmUgZWFzaWx5IHRyYW5zZm9ybWVkIGludG8gdGhlIGludGVybmFsIEJGRCBmb3JtCi0JKEBjb2Rle2FyZWxlbnR9KS4KLQotCVJlYWRpbmcgYSBjb2ZmIHJlbG9jYXRpb24gdGFibGUgaXMgZG9uZSBpbiB0aGUgZm9sbG93aW5nIHN0YWdlczoKLQotCW8gUmVhZCB0aGUgZW50aXJlIGNvZmYgcmVsb2NhdGlvbiB0YWJsZSBpbnRvIG1lbW9yeS4KLQotCW8gUHJvY2VzcyBlYWNoIHJlbG9jYXRpb24gaW4gdHVybjsgZmlyc3Qgc3dhcCBpdCBmcm9tIHRoZQotCWV4dGVybmFsIHRvIHRoZSBpbnRlcm5hbCBmb3JtLgotCi0JbyBUdXJuIHRoZSBzeW1ib2wgcmVmZXJlbmNlZCBpbiB0aGUgcmVsb2NhdGlvbidzIHN5bWJvbCBpbmRleAotCWludG8gYSBwb2ludGVyIGludG8gdGhlIGNhbm9uaWNhbCBzeW1ib2wgdGFibGUuCi0JVGhpcyB0YWJsZSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHJldHVybmVkIGJ5IGEgY2FsbCB0bwotCUBjb2Rle2JmZF9jYW5vbmljYWxpemVfc3ltdGFifS4gVGhlIGJhY2sgZW5kIHdpbGwgY2FsbCB0aGF0Ci0Jcm91dGluZSBhbmQgc2F2ZSB0aGUgcmVzdWx0IGlmIGEgY2Fub25pY2FsaXphdGlvbiBoYXNuJ3QgYmVlbiBkb25lLgotCi0JbyBUaGUgcmVsb2MgaW5kZXggaXMgdHVybmVkIGludG8gYSBwb2ludGVyIHRvIGEgaG93dG8KLQlzdHJ1Y3R1cmUsIGluIGEgYmFjayBlbmQgc3BlY2lmaWMgd2F5LiBGb3IgaW5zdGFuY2UsIHRoZSAzODYKLQlhbmQgOTYwIHVzZSB0aGUgQGNvZGV7cl90eXBlfSB0byBkaXJlY3RseSBwcm9kdWNlIGFuIGluZGV4Ci0JaW50byBhIGhvd3RvIHRhYmxlIHZlY3RvcjsgdGhlIDg4ayBzdWJ0cmFjdHMgYSBudW1iZXIgZnJvbSB0aGUKLQlAY29kZXtyX3R5cGV9IGZpZWxkIGFuZCBjcmVhdGVzIGFuIGFkZGVuZCBmaWVsZC4KLQotCi0qLwotCi0jaWZuZGVmIENBTENfQURERU5ECi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2Zmc3ltID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsgICAgICBcCi0gICAgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgIT0gYWJmZCkgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29mZnN5bSA9IChvYmpfc3ltYm9scyAoYWJmZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgKyAoY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAtIHN5bWJvbHMpKTsgICAgICAgICBcCi0gICAgZWxzZSBpZiAocHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29mZnN5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHB0cik7ICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoY29mZnN5bSAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICYmIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9PSAwKSAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpID09IGFiZmQgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgJiYgcHRyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKSAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIChwdHItPnNlY3Rpb24tPnZtYSArIHB0ci0+dmFsdWUpOyAgIFwKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzKQotICAgICBiZmQgKiBhYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhc3ltYm9sICoqIHN5bWJvbHM7Ci17Ci0gIFJFTE9DICpuYXRpdmVfcmVsb2NzOwotICBhcmVsZW50ICpyZWxvY19jYWNoZTsKLSAgYXJlbGVudCAqY2FjaGVfcHRyOwotCi0gIHVuc2lnbmVkIGludCBpZHg7Ci0KLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoYXNlY3QtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICghY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmF0aXZlX3JlbG9jcyA9Ci0gICAgKFJFTE9DICopIGJ1eV9hbmRfcmVhZCAoYWJmZCwKLQkJCSAgICBhc2VjdC0+cmVsX2ZpbGVwb3MsCi0JCQkgICAgU0VFS19TRVQsCi0JCQkgICAgKHNpemVfdCkgKFJFTFNaICoKLQkJCQkgICAgICBhc2VjdC0+cmVsb2NfY291bnQpKTsKLSAgcmVsb2NfY2FjaGUgPSAoYXJlbGVudCAqKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgKHNpemVfdCkgKGFzZWN0LT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCkpKTsKLQotICBpZiAocmVsb2NfY2FjaGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLQotICBmb3IgKGlkeCA9IDA7IGlkeCA8IGFzZWN0LT5yZWxvY19jb3VudDsgaWR4KyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIGRzdDsKLSAgICAgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqc3JjOwotI2lmbmRlZiBSRUxPQ19QUk9DRVNTSU5HCi0gICAgICBhc3ltYm9sICpwdHI7Ci0jZW5kaWYKLQotICAgICAgY2FjaGVfcHRyID0gcmVsb2NfY2FjaGUgKyBpZHg7Ci0gICAgICBzcmMgPSBuYXRpdmVfcmVsb2NzICsgaWR4OwotCi0gICAgICBjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIHNyYywgJmRzdCk7Ci0KLSNpZmRlZiBSRUxPQ19QUk9DRVNTSU5HCi0gICAgICBSRUxPQ19QUk9DRVNTSU5HIChjYWNoZV9wdHIsICZkc3QsIHN5bWJvbHMsIGFiZmQsIGFzZWN0KTsKLSNlbHNlCi0gICAgICBjYWNoZV9wdHItPmFkZHJlc3MgPSBkc3Qucl92YWRkcjsKLQotICAgICAgaWYgKGRzdC5yX3N5bW5keCAhPSAtMSkKLQl7Ci0JICBpZiAoZHN0LnJfc3ltbmR4IDwgMCB8fCBkc3Qucl9zeW1uZHggPj0gb2JqX2NvbnZfdGFibGVfc2l6ZSAoYWJmZCkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiB3YXJuaW5nOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gcmVsb2NzIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgZHN0LnJfc3ltbmR4KTsKLQkgICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JICAgICAgcHRyID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IChzeW1ib2xzCi0JCQkJCSsgb2JqX2NvbnZlcnQgKGFiZmQpW2RzdC5yX3N5bW5keF0pOwotCSAgICAgIHB0ciA9ICooY2FjaGVfcHRyLT5zeW1fcHRyX3B0cik7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCSAgcHRyID0gTlVMTDsKLQl9Ci0KLSAgICAgIC8qIFRoZSBzeW1ib2xzIGRlZmluaXRpb25zIHRoYXQgd2UgaGF2ZSByZWFkIGluIGhhdmUgYmVlbgotCSByZWxvY2F0ZWQgYXMgaWYgdGhlaXIgc2VjdGlvbnMgc3RhcnRlZCBhdCAwLiBCdXQgdGhlIG9mZnNldHMKLQkgcmVmZXJpbmcgdG8gdGhlIHN5bWJvbHMgaW4gdGhlIHJhdyBkYXRhIGhhdmUgbm90IGJlZW4KLQkgbW9kaWZpZWQsIHNvIHdlIGhhdmUgdG8gaGF2ZSBhIG5lZ2F0aXZlIGFkZGVuZCB0byBjb21wZW5zYXRlLgotCi0JIE5vdGUgdGhhdCBzeW1ib2xzIHdoaWNoIHVzZWQgdG8gYmUgY29tbW9uIG11c3QgYmUgbGVmdCBhbG9uZSAqLwotCi0gICAgICAvKiBDYWxjdWxhdGUgYW55IHJlbG9jIGFkZGVuZCBieSBsb29raW5nIGF0IHRoZSBzeW1ib2wgKi8KLSAgICAgIENBTENfQURERU5EIChhYmZkLCBwdHIsIGRzdCwgY2FjaGVfcHRyKTsKLQotICAgICAgY2FjaGVfcHRyLT5hZGRyZXNzIC09IGFzZWN0LT52bWE7Ci0vKiAhISAgICAgY2FjaGVfcHRyLT5zZWN0aW9uID0gKGFzZWN0aW9uICopIE5VTEw7Ki8KLQotICAgICAgLyogRmlsbCBpbiB0aGUgY2FjaGVfcHRyLT5ob3d0byBmaWVsZCBmcm9tIGRzdC5yX3R5cGUgKi8KLSAgICAgIFJUWVBFMkhPV1RPIChjYWNoZV9wdHIsICZkc3QpOwotI2VuZGlmCS8qIFJFTE9DX1BST0NFU1NJTkcgKi8KLQotICAgICAgaWYgKGNhY2hlX3B0ci0+aG93dG8gPT0gTlVMTCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBpbGxlZ2FsIHJlbG9jYXRpb24gdHlwZSAlZCBhdCBhZGRyZXNzIDB4JWx4IiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgZHN0LnJfdHlwZSwgKGxvbmcpIGRzdC5yX3ZhZGRyKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgYXNlY3QtPnJlbG9jYXRpb24gPSByZWxvY19jYWNoZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZm5kZWYgY29mZl9ydHlwZV90b19ob3d0bwotI2lmZGVmIFJUWVBFMkhPV1RPCi0KLS8qIEdldCB0aGUgaG93dG8gc3RydWN0dXJlIGZvciBhIHJlbG9jLiAgVGhpcyBpcyBvbmx5IHVzZWQgaWYgdGhlIGZpbGUKLSAgIGluY2x1ZGluZyB0aGlzIG9uZSBkZWZpbmVzIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiB0byBiZQotICAgX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbiwgc28gaXQgaXMgT0sgaWYgaXQgZG9lcyBub3QKLSAgIGFsd2F5cyB3b3JrLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBpbmNsdWRpbmcgZmlsZSB0bwotICAgbWFrZSBzdXJlIGl0IGlzIHJlYXNvbmFibGUgaWYgaXQgaXMgbmVlZGVkLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmNvZmZfcnR5cGVfdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCSAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosCi0JICAgYmZkX3ZtYSAqKSk7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0gIGFyZWxlbnQgZ2VucmVsOwotCi0gIFJUWVBFMkhPV1RPICgmZ2VucmVsLCByZWwpOwotICByZXR1cm4gZ2VucmVsLmhvd3RvOwotfQotCi0jZWxzZSAvKiAhIGRlZmluZWQgKFJUWVBFMkhPV1RPKSAqLwotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gTlVMTAotCi0jZW5kaWYgLyogISBkZWZpbmVkIChSVFlQRTJIT1dUTykgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKGNvZmZfcnR5cGVfdG9faG93dG8pICovCi0KLS8qIFRoaXMgaXMgc3R1cGlkLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYSBib29sZWFuIHByZWRpY2F0ZS4gICovCi1zdGF0aWMgbG9uZwotY29mZl9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBhcmVsZW50ICoqIHJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKiBzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICB1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotCi0KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHsKLSAgICAgIC8qIHRoaXMgc2VjdGlvbiBoYXMgcmVsb2NzIG1hZGUgdXAgYnkgdXMsIHRoZXkgYXJlIG5vdCBpbiB0aGUKLSAgICAgICBmaWxlLCBzbyB0YWtlIHRoZW0gb3V0IG9mIHRoZWlyIGNoYWluIGFuZCBwbGFjZSB0aGVtIGludG8KLSAgICAgICB0aGUgZGF0YSBhcmVhIHByb3ZpZGVkICovCi0gICAgICBhcmVsZW50X2NoYWluICpjaGFpbiA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOwotICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGNvdW50KyspCi0JewotCSAgKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0JICBjaGFpbiA9IGNoYWluLT5uZXh0OwotCX0KLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGNvZmZfc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpKQotCXJldHVybiAtMTsKLQotICAgICAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLQotICAgICAgZm9yICg7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspCi0JKnJlbHB0cisrID0gdGJscHRyKys7Ci0KLQotICAgIH0KLSAgKnJlbHB0ciA9IDA7Ci0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotI2lmZGVmIEdOVTk2MAotZmlsZV9wdHIKLWNvZmZfc3ltX2ZpbGVwb3MgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIG9ial9zeW1fZmlsZXBvcyAoYWJmZCk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX3JlbG9jMTZfZXN0aW1hdGUKLSNkZWZpbmUgY29mZl9yZWxvYzE2X2VzdGltYXRlIGR1bW15X3JlbG9jMTZfZXN0aW1hdGUKLQotc3RhdGljIGludCBkdW1teV9yZWxvYzE2X2VzdGltYXRlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICosIHVuc2lnbmVkIGludCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWR1bW15X3JlbG9jMTZfZXN0aW1hdGUgKGFiZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jLCBzaHJpbmssIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIHVuc2lnbmVkIGludCBzaHJpbms7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIGFib3J0ICgpOwotfQotCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMKLQotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMgZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcwotCi0vKiBUaGlzIHdvcmtzIGV2ZW4gaWYgYWJvcnQgaXMgbm90IGRlY2xhcmVkIGluIGFueSBoZWFkZXIgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkIGR1bW15X3JlbG9jMTZfZXh0cmFfY2FzZXMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLCBhcmVsZW50ICosCi0JICAgYmZkX2J5dGUgKiwgdW5zaWduZWQgaW50ICosIHVuc2lnbmVkIGludCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1teV9yZWxvYzE2X2V4dHJhX2Nhc2VzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLAotCQkJICAgZHN0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHI7Ci17Ci0gIGFib3J0ICgpOwotfQotI2VuZGlmCi0KLS8qIElmIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBpcyBkZWZpbmVkLCB3ZSBjYW4gdXNlIHRoZSBvcHRpbWl6ZWQgQ09GRgotICAgYmFja2VuZCBsaW5rZXIuICBPdGhlcndpc2Ugd2UgbXVzdCBjb250aW51ZSB0byB1c2UgdGhlIG9sZCBsaW5rZXIuICAqLwotI2lmZGVmIGNvZmZfcmVsb2NhdGVfc2VjdGlvbgotI2lmbmRlZiBjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9jb2ZmX2xpbmtfYWRkX3N5bWJvbHMKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX2JmZF9maW5hbF9saW5rCi0jZGVmaW5lIGNvZmZfYmZkX2ZpbmFsX2xpbmsgX2JmZF9jb2ZmX2ZpbmFsX2xpbmsKLSNlbmRpZgotI2Vsc2UgLyogISBkZWZpbmVkIChjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pICovCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBOVUxMCi0jaWZuZGVmIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2VuZGlmCi0jaWZuZGVmIGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2VuZGlmCi0jZGVmaW5lIGNvZmZfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNlbmRpZiAvKiAhIGRlZmluZWQgKGNvZmZfcmVsb2NhdGVfc2VjdGlvbikgKi8KLQotI2RlZmluZSBjb2ZmX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotI2lmbmRlZiBjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsKLSNkZWZpbmUgY29mZl9zdGFydF9maW5hbF9saW5rIE5VTEwKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYWRqdXN0X3N5bW5keAotI2RlZmluZSBjb2ZmX2FkanVzdF9zeW1uZHggTlVMTAotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIGNvZmZfbGlua19hZGRfb25lX3N5bWJvbCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4KLQotc3RhdGljIGJvb2xlYW4gY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biAoYWJmZCwgaW5mbykKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogaW5mbzsKLXsKLSAgcmV0dXJuIGFiZmQtPm91dHB1dF9oYXNfYmVndW47Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdAotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0IChhYmZkLCBwZmluZm8pCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbzsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX1NXQVBfYXV4X2luCi0jZGVmaW5lIGNvZmZfU1dBUF9hdXhfaW4gY29mZl9zd2FwX2F1eF9pbgotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9zeW1faW4KLSNkZWZpbmUgY29mZl9TV0FQX3N5bV9pbiBjb2ZmX3N3YXBfc3ltX2luCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX2xpbmVub19pbgotI2RlZmluZSBjb2ZmX1NXQVBfbGluZW5vX2luIGNvZmZfc3dhcF9saW5lbm9faW4KLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfYXV4X291dAotI2RlZmluZSBjb2ZmX1NXQVBfYXV4X291dCBjb2ZmX3N3YXBfYXV4X291dAotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9zeW1fb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9zeW1fb3V0IGNvZmZfc3dhcF9zeW1fb3V0Ci0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX2xpbmVub19vdXQKLSNkZWZpbmUgY29mZl9TV0FQX2xpbmVub19vdXQgY29mZl9zd2FwX2xpbmVub19vdXQKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfcmVsb2Nfb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9yZWxvY19vdXQgY29mZl9zd2FwX3JlbG9jX291dAotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9maWxlaGRyX291dAotI2RlZmluZSBjb2ZmX1NXQVBfZmlsZWhkcl9vdXQgY29mZl9zd2FwX2ZpbGVoZHJfb3V0Ci0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX2FvdXRoZHJfb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9hb3V0aGRyX291dCBjb2ZmX3N3YXBfYW91dGhkcl9vdXQKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfc2NuaGRyX291dAotI2RlZmluZSBjb2ZmX1NXQVBfc2NuaGRyX291dCBjb2ZmX3N3YXBfc2NuaGRyX291dAotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9yZWxvY19pbgotI2RlZmluZSBjb2ZmX1NXQVBfcmVsb2NfaW4gY29mZl9zd2FwX3JlbG9jX2luCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX2ZpbGVoZHJfaW4KLSNkZWZpbmUgY29mZl9TV0FQX2ZpbGVoZHJfaW4gY29mZl9zd2FwX2ZpbGVoZHJfaW4KLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfYW91dGhkcl9pbgotI2RlZmluZSBjb2ZmX1NXQVBfYW91dGhkcl9pbiBjb2ZmX3N3YXBfYW91dGhkcl9pbgotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9zY25oZHJfaW4KLSNkZWZpbmUgY29mZl9TV0FQX3Njbmhkcl9pbiBjb2ZmX3N3YXBfc2NuaGRyX2luCi0jZW5kaWYKLQotCi0KLXN0YXRpYyBDT05TVCBiZmRfY29mZl9iYWNrZW5kX2RhdGEgYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUgPQotewotICBjb2ZmX1NXQVBfYXV4X2luLCBjb2ZmX1NXQVBfc3ltX2luLCBjb2ZmX1NXQVBfbGluZW5vX2luLAotICBjb2ZmX1NXQVBfYXV4X291dCwgY29mZl9TV0FQX3N5bV9vdXQsCi0gIGNvZmZfU1dBUF9saW5lbm9fb3V0LCBjb2ZmX1NXQVBfcmVsb2Nfb3V0LAotICBjb2ZmX1NXQVBfZmlsZWhkcl9vdXQsIGNvZmZfU1dBUF9hb3V0aGRyX291dCwKLSAgY29mZl9TV0FQX3Njbmhkcl9vdXQsCi0gIEZJTEhTWiwgQU9VVFNaLCBTQ05IU1osIFNZTUVTWiwgQVVYRVNaLCBSRUxTWiwgTElORVNaLAotI2lmZGVmIENPRkZfTE9OR19GSUxFTkFNRVMKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0gIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiwKLSAgY29mZl9TV0FQX2ZpbGVoZHJfaW4sIGNvZmZfU1dBUF9hb3V0aGRyX2luLCBjb2ZmX1NXQVBfc2NuaGRyX2luLAotICBjb2ZmX1NXQVBfcmVsb2NfaW4sIGNvZmZfYmFkX2Zvcm1hdF9ob29rLCBjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywKLSAgY29mZl9ta29iamVjdF9ob29rLCBzdHlwX3RvX3NlY19mbGFncywgY29mZl9zZXRfYWxpZ25tZW50X2hvb2ssCi0gIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLCBzeW1uYW1lX2luX2RlYnVnX2hvb2ssIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaywKLSAgY29mZl9wcmludF9hdXgsIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcywgY29mZl9yZWxvYzE2X2VzdGltYXRlLAotICBjb2ZmX3N5bV9pc19nbG9iYWwsIGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLAotICBjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmssIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiwgY29mZl9ydHlwZV90b19ob3d0bywKLSAgY29mZl9hZGp1c3Rfc3ltbmR4LCBjb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wsCi0gIGNvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuLCBjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdAotfTsKLQotI2lmbmRlZiBjb2ZmX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lCWNvZmZfY2xvc2VfYW5kX2NsZWFudXAgICAgICAgICAgICAgIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBjb2ZmX2JmZF9mcmVlX2NhY2hlZF9pbmZvICAgICAgICAgICBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUJY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAgICAgICAgICAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhICAgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSAgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgCi0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAgICAgIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgICAgIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgY29mZl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgICAgICAgICAgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAKLSNkZWZpbmUgY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAgICAgX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUJICAgIF9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgY29mZl9yZWFkX21pbmlzeW1ib2xzCQkgICAgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfbWluaXN5bWJvbF90b19zeW1ib2wKLSNkZWZpbmUgY29mZl9taW5pc3ltYm9sX3RvX3N5bWJvbAkgICAgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0jZW5kaWYKLQotLyogVGhlIHJlbG9jIGxvb2t1cCByb3V0aW5lIG11c3QgYmUgc3VwcGxpZWQgYnkgZWFjaCBpbmRpdmlkdWFsIENPRkYKLSAgIGJhY2tlbmQuICAqLwotI2lmbmRlZiBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cAkgICAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgY29mZl9iZmRfcmVsYXhfc2VjdGlvbgkJICAgIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX2djX3NlY3Rpb25zCi0jZGVmaW5lIGNvZmZfYmZkX2djX3NlY3Rpb25zCQkgICAgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2NvZmZnZW4uYyBiL2JmZC9jb2ZmZ2VuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNmVkNjYuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmZnZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDIzODggKzAsMCBAQAotLyogU3VwcG9ydCBmb3IgdGhlIGdlbmVyaWMgcGFydHMgb2YgQ09GRiwgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIE1vc3Qgb2YgdGhpcyBoYWNrZWQgYnkgIFN0ZXZlIENoYW1iZXJsYWluLCBzYWNAY3lnbnVzLmNvbS4KLSAgIFNwbGl0IG91dCBvZiBjb2ZmY29kZS5oIGJ5IElhbiBUYXlsb3IsIGlhbkBjeWdudXMuY29tLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIENPRkYgY29kZSB0aGF0IGlzIG5vdCBkZXBlbmRlbnQgb24gYW55Ci0gICBwYXJ0aWN1bGFyIENPRkYgdGFyZ2V0LiAgVGhlcmUgaXMgb25seSBvbmUgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaW4KLSAgIGxpYmJmZC5hLCBzbyBubyB0YXJnZXQgc3BlY2lmaWMgY29kZSBtYXkgYmUgcHV0IGluIGhlcmUuICBPciwgdG8KLSAgIHB1dCBpdCBhbm90aGVyIHdheSwKLQotICAgKioqKioqKioqKiBETyBOT1QgUFVUIFRBUkdFVCBTUEVDSUZJQyBDT0RFIElOIFRISVMgRklMRSAqKioqKioqKioqCi0KLSAgIElmIHlvdSBuZWVkIHRvIGFkZCBzb21lIHRhcmdldCBzcGVjaWZpYyBiZWhhdmlvdXIsIGFkZCBhIG5ldyBob29rCi0gICBmdW5jdGlvbiB0byBiZmRfY29mZl9iYWNrZW5kX2RhdGEuCi0KLSAgIFNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSBhbHNvIGNhbGxlZCBieSB0aGUgRUNPRkYgcm91dGluZXMuCi0gICBUaG9zZSBmdW5jdGlvbnMgbWF5IG5vdCB1c2UgYW55IENPRkYgc3BlY2lmaWMgaW5mb3JtYXRpb24sIHN1Y2ggYXMKLSAgIGNvZmZfZGF0YSAoYWJmZCkuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotc3RhdGljIHZvaWQgY29mZl9maXhfc3ltYm9sX25hbWUKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLCBiZmRfc2l6ZV90eXBlICosCi0JICAgYXNlY3Rpb24gKiosIGJmZF9zaXplX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl93cml0ZV9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLCB1bnNpZ25lZCBpbnQgKiwKLQkgICBiZmRfc2l6ZV90eXBlICosIGFzZWN0aW9uICoqLCBiZmRfc2l6ZV90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHVuc2lnbmVkIGludCAqLCBiZmRfc2l6ZV90eXBlICosCi0JICAgYXNlY3Rpb24gKiosIGJmZF9zaXplX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBjb2ZmX3N5bWJvbF90eXBlICosIHVuc2lnbmVkIGludCAqLCBiZmRfc2l6ZV90eXBlICosCi0JICAgYXNlY3Rpb24gKiosIGJmZF9zaXplX3R5cGUgKikpOwotc3RhdGljIHZvaWQgY29mZl9wb2ludGVyaXplX2F1eAotICBQQVJBTVMgKChiZmQgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosCi0JICAgdW5zaWduZWQgaW50LCBjb21iaW5lZF9lbnRyeV90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX3NjbmhkciAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpjb2ZmX3JlYWxfb2JqZWN0X3AKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkLCBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqLCAKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKSk7Ci1zdGF0aWMgdm9pZCBmaXh1cF9zeW1ib2xfdmFsdWUKLSAgUEFSQU1TICgoYmZkICosIGNvZmZfc3ltYm9sX3R5cGUgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci1zdGF0aWMgY2hhciAqYnVpbGRfZGVidWdfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNoYXIgKmNvcHlfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY2hhciAqLCBpbnQpKTsKLQotI2RlZmluZSBTVFJJTkdfU0laRV9TSVpFICg0KQotCi0vKiBUYWtlIGEgc2VjdGlvbiBoZWFkZXIgcmVhZCBmcm9tIGEgY29mZiBmaWxlIChpbiBIT1NUIGJ5dGUgb3JkZXIpLAotICAgYW5kIG1ha2UgYSBCRkQgInNlY3Rpb24iIG91dCBvZiBpdC4gIFRoaXMgaXMgdXNlZCBieSBFQ09GRi4gICovCi1zdGF0aWMgYm9vbGVhbgotbWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlIChhYmZkLCBoZHIsIHRhcmdldF9pbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpoZHI7Ci0gICAgIHVuc2lnbmVkIGludCB0YXJnZXRfaW5kZXg7Ci17Ci0gIGFzZWN0aW9uICpyZXR1cm5fc2VjdGlvbjsKLSAgY2hhciAqbmFtZTsKLQotICBuYW1lID0gTlVMTDsKLQotICAvKiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzIGFzIGluIFBFLiAgKi8KLSAgaWYgKGJmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyAoYWJmZCkKLSAgICAgICYmIGhkci0+c19uYW1lWzBdID09ICcvJykKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZltTQ05OTUxFTl07Ci0gICAgICBsb25nIHN0cmluZGV4OwotICAgICAgY2hhciAqcDsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cmluZ3M7Ci0KLSAgICAgIG1lbWNweSAoYnVmLCBoZHItPnNfbmFtZSArIDEsIFNDTk5NTEVOIC0gMSk7Ci0gICAgICBidWZbU0NOTk1MRU4gLSAxXSA9ICdcMCc7Ci0gICAgICBzdHJpbmRleCA9IHN0cnRvbCAoYnVmLCAmcCwgMTApOwotICAgICAgaWYgKCpwID09ICdcMCcgJiYgc3RyaW5kZXggPj0gMCkKLQl7Ci0JICBzdHJpbmdzID0gX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIChhYmZkKTsKLQkgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIEZJWE1FOiBGb3IgZXh0cmEgc2FmZXR5LCB3ZSBzaG91bGQgbWFrZSBzdXJlIHRoYXQKLSAgICAgICAgICAgICBzdHJpbmRleCBkb2VzIG5vdCBydW4gdXMgcGFzdCB0aGUgZW5kLCBidXQgcmlnaHQgbm93IHdlCi0gICAgICAgICAgICAgZG9uJ3Qga25vdyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdGFibGUuICAqLwotCSAgc3RyaW5ncyArPSBzdHJpbmRleDsKLQkgIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoc3RyaW5ncykgKyAxKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHN0cmNweSAobmFtZSwgc3RyaW5ncyk7Ci0JfQotICAgIH0KLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEFzc29ydGVkIHdhc3RhZ2UgdG8gbnVsbC10ZXJtaW5hdGUgdGhlIG5hbWUsIHRoYW5rcyBBVCZUISAqLwotICAgICAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChoZHItPnNfbmFtZSkgKyAxKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3RybmNweSAobmFtZSwgKGNoYXIgKikgJmhkci0+c19uYW1lWzBdLCBzaXplb2YgKGhkci0+c19uYW1lKSk7Ci0gICAgICBuYW1lW3NpemVvZiAoaGRyLT5zX25hbWUpXSA9IDA7Ci0gICAgfQotCi0gIHJldHVybl9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotICBpZiAocmV0dXJuX3NlY3Rpb24gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuX3NlY3Rpb24tPnZtYSA9IGhkci0+c192YWRkcjsKLSAgcmV0dXJuX3NlY3Rpb24tPmxtYSA9IGhkci0+c19wYWRkcjsKLSAgcmV0dXJuX3NlY3Rpb24tPl9yYXdfc2l6ZSA9IGhkci0+c19zaXplOwotICByZXR1cm5fc2VjdGlvbi0+ZmlsZXBvcyA9IGhkci0+c19zY25wdHI7Ci0gIHJldHVybl9zZWN0aW9uLT5yZWxfZmlsZXBvcyA9IGhkci0+c19yZWxwdHI7Ci0gIHJldHVybl9zZWN0aW9uLT5yZWxvY19jb3VudCA9IGhkci0+c19ucmVsb2M7Ci0KLSAgYmZkX2NvZmZfc2V0X2FsaWdubWVudF9ob29rIChhYmZkLCByZXR1cm5fc2VjdGlvbiwgaGRyKTsKLQotICByZXR1cm5fc2VjdGlvbi0+bGluZV9maWxlcG9zID0gaGRyLT5zX2xubm9wdHI7Ci0KLSAgcmV0dXJuX3NlY3Rpb24tPmxpbmVub19jb3VudCA9IGhkci0+c19ubG5ubzsKLSAgcmV0dXJuX3NlY3Rpb24tPnVzZXJkYXRhID0gTlVMTDsKLSAgcmV0dXJuX3NlY3Rpb24tPm5leHQgPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgcmV0dXJuX3NlY3Rpb24tPmZsYWdzID0gYmZkX2NvZmZfc3R5cF90b19zZWNfZmxhZ3NfaG9vayAoYWJmZCwgaGRyLCBuYW1lKTsKLQotICByZXR1cm5fc2VjdGlvbi0+dGFyZ2V0X2luZGV4ID0gdGFyZ2V0X2luZGV4OwotCi0gIC8qIEF0IGxlYXN0IG9uIGkzODYtY29mZiwgdGhlIGxpbmUgbnVtYmVyIGNvdW50IGZvciBhIHNoYXJlZCBsaWJyYXJ5Ci0gICAgIHNlY3Rpb24gbXVzdCBiZSBpZ25vcmVkLiAgKi8KLSAgaWYgKChyZXR1cm5fc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSkgIT0gMCkKLSAgICByZXR1cm5fc2VjdGlvbi0+bGluZW5vX2NvdW50ID0gMDsKLQotICBpZiAoaGRyLT5zX25yZWxvYyAhPSAwKQotICAgIHJldHVybl9zZWN0aW9uLT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0gIC8qIEZJWE1FOiBzaG91bGQgdGhpcyBjaGVjayAnaGRyLT5zX3NpemUgPiAwJyAqLwotICBpZiAoaGRyLT5zX3NjbnB0ciAhPSAwKQotICAgIHJldHVybl9zZWN0aW9uLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBpbiBhIENPRkYgb2JqZWN0IGFuZCBtYWtlIGl0IGludG8gYSBCRkQuICBUaGlzIGlzIHVzZWQgYnkKLSAgIEVDT0ZGIGFzIHdlbGwuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1jb2ZmX3JlYWxfb2JqZWN0X3AgKGFiZmQsIG5zY25zLCBpbnRlcm5hbF9mLCBpbnRlcm5hbF9hKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIG5zY25zOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZjsKLSAgICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmludGVybmFsX2E7Ci17Ci0gIGZsYWd3b3JkIG9mbGFncyA9IGFiZmQtPmZsYWdzOwotICBiZmRfdm1hIG9zdGFydCA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gIFBUUiB0ZGF0YTsKLSAgc2l6ZV90IHJlYWRzaXplOwkJLyogbGVuZ3RoIG9mIGZpbGVfaW5mbyAqLwotICB1bnNpZ25lZCBpbnQgc2NuaHN6OwotICBjaGFyICpleHRlcm5hbF9zZWN0aW9uczsKLQotICBpZiAoIShpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9SRUxGTEcpKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19SRUxPQzsKLSAgaWYgKChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9FWEVDKSkKLSAgICBhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0gIGlmICghKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0xOTk8pKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19MSU5FTk87Ci0gIGlmICghKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0xTWU1TKSkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfTE9DQUxTOwotCi0gIC8qIEZJWE1FOiBIb3cgY2FuIHdlIHNldCBEX1BBR0VEIGNvcnJlY3RseT8gICovCi0gIGlmICgoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfRVhFQykgIT0gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBEX1BBR0VEOwotCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gaW50ZXJuYWxfZi0+Zl9uc3ltczsKLSAgaWYgKGludGVybmFsX2YtPmZfbnN5bXMpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgaWYgKGludGVybmFsX2EgIT0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIE5VTEwpCi0gICAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IGludGVybmFsX2EtPmVudHJ5OwotICBlbHNlCi0gICAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IDA7Ci0KLSAgLyogU2V0IHVwIHRoZSB0ZGF0YSBhcmVhLiAgRUNPRkYgdXNlcyBpdHMgb3duIHJvdXRpbmUsIGFuZCBvdmVycmlkZXMKLSAgICAgYWJmZC0+ZmxhZ3MuICAqLwotICB0ZGF0YSA9IGJmZF9jb2ZmX21rb2JqZWN0X2hvb2sgKGFiZmQsIChQVFIpIGludGVybmFsX2YsIChQVFIpIGludGVybmFsX2EpOwotICBpZiAodGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBzY25oc3ogPSBiZmRfY29mZl9zY25oc3ogKGFiZmQpOwotICByZWFkc2l6ZSA9IG5zY25zICogc2NuaHN6OwotICBleHRlcm5hbF9zZWN0aW9ucyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgcmVhZHNpemUpOwotICBpZiAoIWV4dGVybmFsX3NlY3Rpb25zKQotICAgIGdvdG8gZmFpbDsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIGV4dGVybmFsX3NlY3Rpb25zLCAxLCByZWFkc2l6ZSwgYWJmZCkgIT0gcmVhZHNpemUpCi0gICAgZ290byBmYWlsOwotCi0gIC8qIE5vdyBjb3B5IGRhdGEgYXMgcmVxdWlyZWQ7IGNvbnN0cnVjdCBhbGwgYXNlY3Rpb25zIGV0YyAqLwotICBpZiAobnNjbnMgIT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuc2NuczsgaSsrKQotCXsKLQkgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgdG1wOwotCSAgYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4gKGFiZmQsCi0JCQkJICAgKFBUUikgKGV4dGVybmFsX3NlY3Rpb25zICsgaSAqIHNjbmhzeiksCi0JCQkJICAgKFBUUikgJiB0bXApOwotCSAgaWYgKCEgbWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlIChhYmZkLCAmdG1wLCBpICsgMSkpCi0JICAgIGdvdG8gZmFpbDsKLQl9Ci0gICAgfQotCi0gIC8qICBtYWtlX2Fic19zZWN0aW9uIChhYmZkKTsgKi8KLQotICBpZiAoYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rIChhYmZkLCAoUFRSKSBpbnRlcm5hbF9mKSA9PSBmYWxzZSkKLSAgICBnb3RvIGZhaWw7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci0KLSBmYWlsOgotICBiZmRfcmVsZWFzZSAoYWJmZCwgdGRhdGEpOwotICBhYmZkLT5mbGFncyA9IG9mbGFnczsKLSAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IG9zdGFydDsKLSAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci19Ci0KLS8qIFR1cm4gYSBDT0ZGIGZpbGUgaW50byBhIEJGRCwgYnV0IGZhaWwgd2l0aCBiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0IGlmIGl0IGlzCi0gICBub3QgYSBDT0ZGIGZpbGUuICBUaGlzIGlzIGFsc28gdXNlZCBieSBFQ09GRi4gICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKgotY29mZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBpbnQgZmlsaHN6OwotICB1bnNpZ25lZCBpbnQgYW91dHN6OwotICBpbnQgbnNjbnM7Ci0gIFBUUiBmaWxlaGRyOwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciBpbnRlcm5hbF9mOwotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciBpbnRlcm5hbF9hOwotCi0gIC8qIGZpZ3VyZSBvdXQgaG93IG11Y2ggdG8gcmVhZCAqLwotICBmaWxoc3ogPSBiZmRfY29mZl9maWxoc3ogKGFiZmQpOwotICBhb3V0c3ogPSBiZmRfY29mZl9hb3V0c3ogKGFiZmQpOwotCi0gIGZpbGVoZHIgPSBiZmRfYWxsb2MgKGFiZmQsIGZpbGhzeik7Ci0gIGlmIChmaWxlaGRyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChiZmRfcmVhZCAoZmlsZWhkciwgMSwgZmlsaHN6LCBhYmZkKSAhPSBmaWxoc3opCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBiZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4gKGFiZmQsIGZpbGVoZHIsICZpbnRlcm5hbF9mKTsKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIGZpbGVoZHIpOwotCi0gIGlmIChiZmRfY29mZl9iYWRfZm9ybWF0X2hvb2sgKGFiZmQsICZpbnRlcm5hbF9mKSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgbnNjbnMgPSBpbnRlcm5hbF9mLmZfbnNjbnM7Ci0KLSAgaWYgKGludGVybmFsX2YuZl9vcHRoZHIpCi0gICAgewotICAgICAgUFRSIG9wdGhkcjsKLQotICAgICAgb3B0aGRyID0gYmZkX2FsbG9jIChhYmZkLCBhb3V0c3opOwotICAgICAgaWYgKG9wdGhkciA9PSBOVUxMKQotCXJldHVybiAwOzsKLSAgICAgIGlmIChiZmRfcmVhZCAob3B0aGRyLCAxLCBpbnRlcm5hbF9mLmZfb3B0aGRyLCBhYmZkKQotCSAgIT0gaW50ZXJuYWxfZi5mX29wdGhkcikKLQl7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBiZmRfY29mZl9zd2FwX2FvdXRoZHJfaW4gKGFiZmQsIG9wdGhkciwgKFBUUikgJmludGVybmFsX2EpOwotICAgIH0KLQotICByZXR1cm4gY29mZl9yZWFsX29iamVjdF9wIChhYmZkLCBuc2NucywgJmludGVybmFsX2YsCi0JCQkgICAgIChpbnRlcm5hbF9mLmZfb3B0aGRyICE9IDAKLQkJCSAgICAgID8gJmludGVybmFsX2EKLQkJCSAgICAgIDogKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIE5VTEwpKTsKLX0KLQotLyogR2V0IHRoZSBCRkQgc2VjdGlvbiBmcm9tIGEgQ09GRiBzeW1ib2wgc2VjdGlvbiBudW1iZXIuICAqLwotCi1hc2VjdGlvbiAqCi1jb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBpbmRleDsKLXsKLSAgc3RydWN0IHNlYyAqYW5zd2VyID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgaWYgKGluZGV4ID09IE5fQUJTKQotICAgIHJldHVybiBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICBpZiAoaW5kZXggPT0gTl9VTkRFRikKLSAgICByZXR1cm4gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgaWYgKGluZGV4ID09IE5fREVCVUcpCi0gICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0KLSAgd2hpbGUgKGFuc3dlcikKLSAgICB7Ci0gICAgICBpZiAoYW5zd2VyLT50YXJnZXRfaW5kZXggPT0gaW5kZXgpCi0JcmV0dXJuIGFuc3dlcjsKLSAgICAgIGFuc3dlciA9IGFuc3dlci0+bmV4dDsKLSAgICB9Ci0KLSAgLyogV2Ugc2hvdWxkIG5vdCByZWFjaCB0aGlzIHBvaW50LCBidXQgdGhlIFNDTyAzLjJ2NCAvbGliL2xpYmNfcy5hCi0gICAgIGhhcyBhIGJhZCBzeW1ib2wgdGFibGUgaW4gYmlnbGl0cG93Lm8uICAqLwotICByZXR1cm4gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLX0KLQotLyogR2V0IHRoZSB1cHBlciBib3VuZCBvZiBhIENPRkYgc3ltYm9sIHRhYmxlLiAgKi8KLQotbG9uZwotY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmICghYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSArIDEpICogKHNpemVvZiAoY29mZl9zeW1ib2xfdHlwZSAqKSk7Ci19Ci0KLQotLyogQ2Fub25pY2FsaXplIGEgQ09GRiBzeW1ib2wgdGFibGUuICAqLwotCi1sb25nCi1jb2ZmX2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICB1bnNpZ25lZCBpbnQgY291bnRlcjsKLSAgY29mZl9zeW1ib2xfdHlwZSAqc3ltYmFzZTsKLSAgY29mZl9zeW1ib2xfdHlwZSAqKmxvY2F0aW9uID0gKGNvZmZfc3ltYm9sX3R5cGUgKiopIGFsb2NhdGlvbjsKLQotICBpZiAoIWJmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHN5bWJhc2UgPSBvYmpfc3ltYm9scyAoYWJmZCk7Ci0gIGNvdW50ZXIgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgd2hpbGUgKGNvdW50ZXItLSA+IDApCi0gICAgKmxvY2F0aW9uKysgPSBzeW1iYXNlKys7Ci0KLSAgKmxvY2F0aW9uID0gTlVMTDsKLQotICByZXR1cm4gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci19Ci0KLS8qIEdldCB0aGUgbmFtZSBvZiBhIHN5bWJvbC4gIFRoZSBjYWxsZXIgbXVzdCBwYXNzIGluIGEgYnVmZmVyIG9mIHNpemUKLSAgID49IFNZTU5NTEVOICsgMS4gICovCi0KLWNvbnN0IGNoYXIgKgotX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCBzeW0sIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgLyogRklYTUU6IEl0J3Mgbm90IGNsZWFyIHRoaXMgd2lsbCB3b3JrIGNvcnJlY3RseSBpZiBzaXplb2YKLSAgICAgKF9uX3plcm9lcykgIT0gNC4gICovCi0gIGlmIChzeW0tPl9uLl9uX24uX25femVyb2VzICE9IDAKLSAgICAgIHx8IHN5bS0+X24uX25fbi5fbl9vZmZzZXQgPT0gMCkKLSAgICB7Ci0gICAgICBtZW1jcHkgKGJ1Ziwgc3ltLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7Ci0gICAgICBidWZbU1lNTk1MRU5dID0gJ1wwJzsKLSAgICAgIHJldHVybiBidWY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc3RyaW5nczsKLQotICAgICAgQkZEX0FTU0VSVCAoc3ltLT5fbi5fbl9uLl9uX29mZnNldCA+PSBTVFJJTkdfU0laRV9TSVpFKTsKLSAgICAgIHN0cmluZ3MgPSBvYmpfY29mZl9zdHJpbmdzIChhYmZkKTsKLSAgICAgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JewotCSAgc3RyaW5ncyA9IF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoYWJmZCk7Ci0JICBpZiAoc3RyaW5ncyA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICByZXR1cm4gc3RyaW5ncyArIHN5bS0+X24uX25fbi5fbl9vZmZzZXQ7Ci0gICAgfQotfQotCi0vKiBSZWFkIGluIGFuZCBzd2FwIHRoZSByZWxvY3MuICBUaGlzIHJldHVybnMgYSBidWZmZXIgaG9sZGluZyB0aGUKLSAgIHJlbG9jcyBmb3Igc2VjdGlvbiBTRUMgaW4gZmlsZSBBQkZELiAgSWYgQ0FDSEUgaXMgdHJ1ZSBhbmQKLSAgIElOVEVSTkFMX1JFTE9DUyBpcyBOVUxMLCB0aGUgcmVsb2NzIHJlYWQgaW4gd2lsbCBiZSBzYXZlZCBpbiBjYXNlCi0gICB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGFnYWluLiAgSWYgRVhURVJOQUxfUkVMT0NTIGlzIG5vdCBOVUxMLCBpdAotICAgaXMgYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHVuc3dhcHBlZCByZWxvY3MuICBJZgotICAgSU5URVJOQUxfUkVMT0NTIGlzIG5vdCBOVUxMLCBpdCBpcyBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZAotICAgdGhlIHN3YXBwZWQgcmVsb2NzLiAgSWYgUkVRVUlSRV9JTlRFUk5BTCBpcyB0cnVlLCB0aGVuIHRoZSByZXR1cm4KLSAgIHZhbHVlIG11c3QgYmUgSU5URVJOQUxfUkVMT0NTLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgTlVMTCBvbiBlcnJvci4gICovCi0KLXN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqCi1fYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKGFiZmQsIHNlYywgY2FjaGUsIGV4dGVybmFsX3JlbG9jcywKLQkJCQlyZXF1aXJlX2ludGVybmFsLCBpbnRlcm5hbF9yZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYm9vbGVhbiBjYWNoZTsKLSAgICAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jczsKLSAgICAgYm9vbGVhbiByZXF1aXJlX2ludGVybmFsOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKLXsKLSAgYmZkX3NpemVfdHlwZSByZWxzejsKLSAgYmZkX2J5dGUgKmZyZWVfZXh0ZXJuYWwgPSBOVUxMOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmZyZWVfaW50ZXJuYWwgPSBOVUxMOwotICBiZmRfYnl0ZSAqZXJlbDsKLSAgYmZkX2J5dGUgKmVyZWxfZW5kOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0KLSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwKLSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISByZXF1aXJlX2ludGVybmFsKQotCXJldHVybiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzOwotICAgICAgbWVtY3B5IChpbnRlcm5hbF9yZWxvY3MsIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MsCi0JICAgICAgc2VjLT5yZWxvY19jb3VudCAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSk7Ci0gICAgICByZXR1cm4gaW50ZXJuYWxfcmVsb2NzOwotICAgIH0KLQotICByZWxzeiA9IGJmZF9jb2ZmX3JlbHN6IChhYmZkKTsKLQotICBpZiAoZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgewotICAgICAgZnJlZV9leHRlcm5hbCA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPnJlbG9jX2NvdW50ICogcmVsc3opOwotICAgICAgaWYgKGZyZWVfZXh0ZXJuYWwgPT0gTlVMTCAmJiBzZWMtPnJlbG9jX2NvdW50ID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGV4dGVybmFsX3JlbG9jcyA9IGZyZWVfZXh0ZXJuYWw7Ci0gICAgfQotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoZXh0ZXJuYWxfcmVsb2NzLCByZWxzeiwgc2VjLT5yZWxvY19jb3VudCwgYWJmZCkKLQkgICE9IHJlbHN6ICogc2VjLT5yZWxvY19jb3VudCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWVfaW50ZXJuYWwgPSAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKQotCQkgICAgICAgYmZkX21hbGxvYyAoc2VjLT5yZWxvY19jb3VudAotCQkJCSAgICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7Ci0gICAgICBpZiAoZnJlZV9pbnRlcm5hbCA9PSBOVUxMICYmIHNlYy0+cmVsb2NfY291bnQgPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gZnJlZV9pbnRlcm5hbDsKLSAgICB9Ci0KLSAgLyogU3dhcCBpbiB0aGUgcmVsb2NzLiAgKi8KLSAgZXJlbCA9IGV4dGVybmFsX3JlbG9jczsKLSAgZXJlbF9lbmQgPSBlcmVsICsgcmVsc3ogKiBzZWMtPnJlbG9jX2NvdW50OwotICBpcmVsID0gaW50ZXJuYWxfcmVsb2NzOwotICBmb3IgKDsgZXJlbCA8IGVyZWxfZW5kOyBlcmVsICs9IHJlbHN6LCBpcmVsKyspCi0gICAgYmZkX2NvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKFBUUikgZXJlbCwgKFBUUikgaXJlbCk7Ci0KLSAgaWYgKGZyZWVfZXh0ZXJuYWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmcmVlX2V4dGVybmFsKTsKLSAgICAgIGZyZWVfZXh0ZXJuYWwgPSBOVUxMOwotICAgIH0KLQotICBpZiAoY2FjaGUgJiYgZnJlZV9pbnRlcm5hbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSA9PSBOVUxMKQotCXsKLQkgIHNlYy0+dXNlZF9ieV9iZmQgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSk7Ci0JICBpZiAoc2VjLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyA9IE5VTEw7Ci0JfQotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jcyA9IGZyZWVfaW50ZXJuYWw7Ci0gICAgfQotCi0gIHJldHVybiBpbnRlcm5hbF9yZWxvY3M7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX2V4dGVybmFsICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9leHRlcm5hbCk7Ci0gIGlmIChmcmVlX2ludGVybmFsICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9pbnRlcm5hbCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZXQgbGluZW5vX2NvdW50IGZvciB0aGUgb3V0cHV0IHNlY3Rpb25zIG9mIGEgQ09GRiBmaWxlLiAgKi8KLQotaW50Ci1jb2ZmX2NvdW50X2xpbmVudW1iZXJzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBsaW1pdCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IHRvdGFsID0gMDsKLSAgYXN5bWJvbCAqKnA7Ci0gIGFzZWN0aW9uICpzOwotCi0gIGlmIChsaW1pdCA9PSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgbWF5IGJlIGZyb20gdGhlIGJhY2tlbmQgbGlua2VyLCBpbiB3aGljaCBjYXNlIHRoZQotICAgICAgICAgbGluZW5vX2NvdW50IGluIHRoZSBzZWN0aW9ucyBpcyBjb3JyZWN0LiAgKi8KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXRvdGFsICs9IHMtPmxpbmVub19jb3VudDsKLSAgICAgIHJldHVybiB0b3RhbDsKLSAgICB9Ci0KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgQkZEX0FTU0VSVCAocy0+bGluZW5vX2NvdW50ID09IDApOwotCi0gIGZvciAocCA9IGFiZmQtPm91dHN5bWJvbHMsIGkgPSAwOyBpIDwgbGltaXQ7IGkrKywgcCsrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnFfbWF5YmUgPSAqcDsKLQotICAgICAgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKHFfbWF5YmUpID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotCXsKLQkgIGNvZmZfc3ltYm9sX3R5cGUgKnEgPSBjb2Zmc3ltYm9sIChxX21heWJlKTsKLQotCSAgLyogVGhlIEFJWCA0LjEgY29tcGlsZXIgY2FuIHNvbWV0aW1lcyBnZW5lcmF0ZSBsaW5lIG51bWJlcnMKLSAgICAgICAgICAgICBhdHRhY2hlZCB0byBkZWJ1Z2dpbmcgc3ltYm9scy4gIFdlIHRyeSB0byBzaW1wbHkgaWdub3JlCi0gICAgICAgICAgICAgdGhvc2UgaGVyZS4gICovCi0JICBpZiAocS0+bGluZW5vICE9IE5VTEwKLQkgICAgICAmJiBxLT5zeW1ib2wuc2VjdGlvbi0+b3duZXIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBsaW5lIG51bWJlcnMuICBJbmNyZW1lbnQgdGhlIG93bmluZwotCSAgICAgICAgIHNlY3Rpb24ncyBsaW5lbnVtYmVyIGNvdW50LiAgKi8KLQkgICAgICBhbGVudCAqbCA9IHEtPmxpbmVubzsKLQotCSAgICAgICsrcS0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5saW5lbm9fY291bnQ7Ci0JICAgICAgKyt0b3RhbDsKLQkgICAgICArK2w7Ci0JICAgICAgd2hpbGUgKGwtPmxpbmVfbnVtYmVyICE9IDApCi0JCXsKLQkJICArK3RvdGFsOwotCQkgICsrcS0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5saW5lbm9fY291bnQ7Ci0JCSAgKytsOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0b3RhbDsKLX0KLQotLyogVGFrZXMgYSBiZmQgYW5kIGEgc3ltYm9sLCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY29mZiBzcGVjaWZpYwotICAgYXJlYSBvZiB0aGUgc3ltYm9sIGlmIHRoZXJlIGlzIG9uZS4gICovCi0KLS8qQVJHU1VTRUQqLwotY29mZl9zeW1ib2xfdHlwZSAqCi1jb2ZmX3N5bWJvbF9mcm9tIChpZ25vcmVfYWJmZCwgc3ltYm9sKQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyIChzeW1ib2wpICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgIHJldHVybiAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwotCi0gIGlmIChiZmRfYXN5bWJvbF9iZmQgKHN5bWJvbCktPnRkYXRhLmNvZmZfb2JqX2RhdGEgPT0gKGNvZmZfZGF0YV90eXBlICopIE5VTEwpCi0gICAgcmV0dXJuIChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7Ci0KLSAgcmV0dXJuIChjb2ZmX3N5bWJvbF90eXBlICopIHN5bWJvbDsKLX0KLQotc3RhdGljIHZvaWQKLWZpeHVwX3N5bWJvbF92YWx1ZSAoYWJmZCwgY29mZl9zeW1ib2xfcHRyLCBzeW1lbnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZl9zeW1ib2xfcHRyOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1lbnQ7Ci17Ci0KLSAgLyogTm9ybWFsaXplIHRoZSBzeW1ib2wgZmxhZ3MgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbikpCi0gICAgewotICAgICAgLyogYSBjb21tb24gc3ltYm9sIGlzIHVuZGVmaW5lZCB3aXRoIGEgdmFsdWUgKi8KLSAgICAgIHN5bWVudC0+bl9zY251bSA9IE5fVU5ERUY7Ci0gICAgICBzeW1lbnQtPm5fdmFsdWUgPSBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC52YWx1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLmZsYWdzICYgQlNGX0RFQlVHR0lORykKLSAgICB7Ci0gICAgICBzeW1lbnQtPm5fdmFsdWUgPSBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC52YWx1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbikpCi0gICAgewotICAgICAgc3ltZW50LT5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICAgIHN5bWVudC0+bl92YWx1ZSA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24pCi0JewotCSAgc3ltZW50LT5uX3NjbnVtID0KLQkgICAgY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQotCSAgc3ltZW50LT5uX3ZhbHVlID0gKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnZhbHVlCi0JCQkgICAgICsgY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICBpZiAoISBvYmpfcGUgKGFiZmQpKQotCSAgICBzeW1lbnQtPm5fdmFsdWUgKz0KLQkgICAgICBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBCRkRfQVNTRVJUICgwKTsKLQkgIC8qIFRoaXMgY2FuIGhhcHBlbiwgYnV0IEkgZG9uJ3Qga25vdyB3aHkgeWV0IChzdGV2ZUBjeWdudXMuY29tKSAqLwotCSAgc3ltZW50LT5uX3NjbnVtID0gTl9BQlM7Ci0JICBzeW1lbnQtPm5fdmFsdWUgPSBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC52YWx1ZTsKLQl9Ci0gICAgfQotfQotCi0vKiBSdW4gdGhyb3VnaCBhbGwgdGhlIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZSBhbmQgd29yayBvdXQgd2hhdAotICAgdGhlaXIgaW5kZXhlcyBpbnRvIHRoZSBzeW1ib2wgdGFibGUgd2lsbCBiZSB3aGVuIG91dHB1dC4KLQotICAgQ29mZiByZXF1aXJlcyB0aGF0IGVhY2ggQ19GSUxFIHN5bWJvbCBwb2ludHMgdG8gdGhlIG5leHQgb25lIGluIHRoZQotICAgY2hhaW4sIGFuZCB0aGF0IHRoZSBsYXN0IG9uZSBwb2ludHMgdG8gdGhlIGZpcnN0IGV4dGVybmFsIHN5bWJvbC4gV2UKLSAgIGRvIHRoYXQgaGVyZSB0b28uICAqLwotCi1ib29sZWFuCi1jb2ZmX3JlbnVtYmVyX3N5bWJvbHMgKGJmZF9wdHIsIGZpcnN0X3VuZGVmKQotICAgICBiZmQgKmJmZF9wdHI7Ci0gICAgIGludCAqZmlyc3RfdW5kZWY7Ci17Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChiZmRfcHRyKTsKLSAgYXN5bWJvbCAqKnN5bWJvbF9wdHJfcHRyID0gYmZkX3B0ci0+b3V0c3ltYm9sczsKLSAgdW5zaWduZWQgaW50IG5hdGl2ZV9pbmRleCA9IDA7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmxhc3RfZmlsZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopIE5VTEw7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfaW5kZXg7Ci0KLSAgLyogQ09GRiBkZW1hbmRzIHRoYXQgdW5kZWZpbmVkIHN5bWJvbHMgY29tZSBhZnRlciBhbGwgb3RoZXIgc3ltYm9scy4KLSAgICAgU2luY2Ugd2UgZG9uJ3QgbmVlZCB0byBpbXBvc2UgdGhpcyBleHRyYSBrbm93bGVkZ2Ugb24gYWxsIG91cgotICAgICBjbGllbnQgcHJvZ3JhbXMsIGRlYWwgd2l0aCB0aGF0IGhlcmUuICBTb3J0IHRoZSBzeW1ib2wgdGFibGU7Ci0gICAgIGp1c3QgbW92ZSB0aGUgdW5kZWZpbmVkIHN5bWJvbHMgdG8gdGhlIGVuZCwgbGVhdmluZyB0aGUgcmVzdAotICAgICBhbG9uZS4gIFRoZSBPJ1JlaWxseSBib29rIHNheXMgdGhhdCBkZWZpbmVkIGdsb2JhbCBzeW1ib2xzIGNvbWUKLSAgICAgYXQgdGhlIGVuZCBiZWZvcmUgdGhlIHVuZGVmaW5lZCBzeW1ib2xzLCBzbyB3ZSBkbyB0aGF0IGhlcmUgYXMKLSAgICAgd2VsbC4gICovCi0gIC8qIEBAIERvIHdlIGhhdmUgc29tZSBjb25kaXRpb24gd2UgY291bGQgdGVzdCBmb3IsIHNvIHdlIGRvbid0IGFsd2F5cwotICAgICBoYXZlIHRvIGRvIHRoaXM/ICBJIGRvbid0IHRoaW5rIHJlbG9jYXRhYmlsaXR5IGlzIHF1aXRlIHJpZ2h0LCBidXQKLSAgICAgSSdtIG5vdCBjZXJ0YWluLiAgW3JhZWJ1cm46MTk5MjA1MDguMTcxMUVTVF0gICovCi0gIHsKLSAgICBhc3ltYm9sICoqbmV3c3ltczsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgIG5ld3N5bXMgPSAoYXN5bWJvbCAqKikgYmZkX2FsbG9jIChiZmRfcHRyLAotCQkJCSAgICAgIHNpemVvZiAoYXN5bWJvbCAqKSAqIChzeW1ib2xfY291bnQgKyAxKSk7Ci0gICAgaWYgKCFuZXdzeW1zKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGJmZF9wdHItPm91dHN5bWJvbHMgPSBuZXdzeW1zOwotICAgIGZvciAoaSA9IDA7IGkgPCBzeW1ib2xfY291bnQ7IGkrKykKLSAgICAgIGlmICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgQlNGX05PVF9BVF9FTkQpICE9IDAKLQkgIHx8ICghYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfcHRyX3B0cltpXS0+c2VjdGlvbikKLQkgICAgICAmJiAhYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2xfcHRyX3B0cltpXS0+c2VjdGlvbikKLQkgICAgICAmJiAoKHN5bWJvbF9wdHJfcHRyW2ldLT5mbGFncyAmIEJTRl9GVU5DVElPTikgIT0gMAotCQkgIHx8ICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgKEJTRl9HTE9CQUwgfCBCU0ZfV0VBSykpCi0JCSAgICAgID09IDApKSkpCi0JKm5ld3N5bXMrKyA9IHN5bWJvbF9wdHJfcHRyW2ldOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHN5bWJvbF9jb3VudDsgaSsrKQotICAgICAgaWYgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiBCU0ZfTk9UX0FUX0VORCkgPT0gMAotCSAgJiYgIWJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX3B0cl9wdHJbaV0tPnNlY3Rpb24pCi0JICAmJiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2xfcHRyX3B0cltpXS0+c2VjdGlvbikKLQkgICAgICB8fCAoKHN5bWJvbF9wdHJfcHRyW2ldLT5mbGFncyAmIEJTRl9GVU5DVElPTikgPT0gMAotCQkgICYmICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgKEJTRl9HTE9CQUwgfCBCU0ZfV0VBSykpCi0JCSAgICAgICE9IDApKSkpCi0JKm5ld3N5bXMrKyA9IHN5bWJvbF9wdHJfcHRyW2ldOwotCi0gICAgKmZpcnN0X3VuZGVmID0gbmV3c3ltcyAtIGJmZF9wdHItPm91dHN5bWJvbHM7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc3ltYm9sX2NvdW50OyBpKyspCi0gICAgICBpZiAoKHN5bWJvbF9wdHJfcHRyW2ldLT5mbGFncyAmIEJTRl9OT1RfQVRfRU5EKSA9PSAwCi0JICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9wdHJfcHRyW2ldLT5zZWN0aW9uKSkKLQkqbmV3c3ltcysrID0gc3ltYm9sX3B0cl9wdHJbaV07Ci0gICAgKm5ld3N5bXMgPSAoYXN5bWJvbCAqKSBOVUxMOwotICAgIHN5bWJvbF9wdHJfcHRyID0gYmZkX3B0ci0+b3V0c3ltYm9sczsKLSAgfQotCi0gIGZvciAoc3ltYm9sX2luZGV4ID0gMDsgc3ltYm9sX2luZGV4IDwgc3ltYm9sX2NvdW50OyBzeW1ib2xfaW5kZXgrKykKLSAgICB7Ci0gICAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2ZmX3N5bWJvbF9wdHIgPSBjb2ZmX3N5bWJvbF9mcm9tIChiZmRfcHRyLCBzeW1ib2xfcHRyX3B0cltzeW1ib2xfaW5kZXhdKTsKLSAgICAgIHN5bWJvbF9wdHJfcHRyW3N5bWJvbF9pbmRleF0tPnVkYXRhLmkgPSBzeW1ib2xfaW5kZXg7IAotICAgICAgaWYgKGNvZmZfc3ltYm9sX3B0ciAmJiBjb2ZmX3N5bWJvbF9wdHItPm5hdGl2ZSkKLQl7Ci0JICBjb21iaW5lZF9lbnRyeV90eXBlICpzID0gY29mZl9zeW1ib2xfcHRyLT5uYXRpdmU7Ci0JICBpbnQgaTsKLQotCSAgaWYgKHMtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRSkKLQkgICAgewotCSAgICAgIGlmIChsYXN0X2ZpbGUgIT0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikgTlVMTCkKLQkJbGFzdF9maWxlLT5uX3ZhbHVlID0gbmF0aXZlX2luZGV4OwotCSAgICAgIGxhc3RfZmlsZSA9ICYocy0+dS5zeW1lbnQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQotCSAgICAgIC8qIE1vZGlmeSB0aGUgc3ltYm9sIHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlaXIgc2VjdGlvbiBhbmQKLQkgICAgICAgICB0eXBlICovCi0KLQkgICAgICBmaXh1cF9zeW1ib2xfdmFsdWUgKGJmZF9wdHIsIGNvZmZfc3ltYm9sX3B0ciwgJihzLT51LnN5bWVudCkpOwotCSAgICB9Ci0JICBmb3IgKGkgPSAwOyBpIDwgcy0+dS5zeW1lbnQubl9udW1hdXggKyAxOyBpKyspCi0JICAgIHNbaV0ub2Zmc2V0ID0gbmF0aXZlX2luZGV4Kys7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5hdGl2ZV9pbmRleCsrOwotCX0KLSAgICB9Ci0gIG9ial9jb252X3RhYmxlX3NpemUgKGJmZF9wdHIpID0gbmF0aXZlX2luZGV4OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSdW4gdGhvcm91Z2ggdGhlIHN5bWJvbCB0YWJsZSBhZ2FpbiwgYW5kIGZpeCBpdCBzbyB0aGF0IGFsbAotICAgcG9pbnRlcnMgdG8gZW50cmllcyBhcmUgY2hhbmdlZCB0byB0aGUgZW50cmllcycgaW5kZXggaW4gdGhlIG91dHB1dAotICAgc3ltYm9sIHRhYmxlLiAgKi8KLQotdm9pZAotY29mZl9tYW5nbGVfc3ltYm9scyAoYmZkX3B0cikKLSAgICAgYmZkICpiZmRfcHRyOwotewotICB1bnNpZ25lZCBpbnQgc3ltYm9sX2NvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYmZkX3B0cik7Ci0gIGFzeW1ib2wgKipzeW1ib2xfcHRyX3B0ciA9IGJmZF9wdHItPm91dHN5bWJvbHM7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfaW5kZXg7Ci0KLSAgZm9yIChzeW1ib2xfaW5kZXggPSAwOyBzeW1ib2xfaW5kZXggPCBzeW1ib2xfY291bnQ7IHN5bWJvbF9pbmRleCsrKQotICAgIHsKLSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZfc3ltYm9sX3B0ciA9Ci0gICAgICBjb2ZmX3N5bWJvbF9mcm9tIChiZmRfcHRyLCBzeW1ib2xfcHRyX3B0cltzeW1ib2xfaW5kZXhdKTsKLQotICAgICAgaWYgKGNvZmZfc3ltYm9sX3B0ciAmJiBjb2ZmX3N5bWJvbF9wdHItPm5hdGl2ZSkKLQl7Ci0JICBpbnQgaTsKLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnMgPSBjb2ZmX3N5bWJvbF9wdHItPm5hdGl2ZTsKLQotCSAgaWYgKHMtPmZpeF92YWx1ZSkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgdXNlIGEgdW5pb24gaGVyZS4gICovCi0JICAgICAgcy0+dS5zeW1lbnQubl92YWx1ZSA9Ci0JCSgoY29tYmluZWRfZW50cnlfdHlwZSAqKSBzLT51LnN5bWVudC5uX3ZhbHVlKS0+b2Zmc2V0OwotCSAgICAgIHMtPmZpeF92YWx1ZSA9IDA7Ci0JICAgIH0KLQkgIGlmIChzLT5maXhfbGluZSkKLQkgICAgewotCSAgICAgIC8qIFRoZSB2YWx1ZSBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIGxpbmUgbnVtYmVyIGVudHJpZXMKLSAgICAgICAgICAgICAgICAgZm9yIHRoZSBzeW1ib2wncyBzZWN0aW9uLiAgT24gb3V0cHV0LCB0aGUgc3ltYm9sJ3MKLSAgICAgICAgICAgICAgICAgc2VjdGlvbiBzaG91bGQgYmUgTl9ERUJVRy4gICovCi0JICAgICAgcy0+dS5zeW1lbnQubl92YWx1ZSA9Ci0JCShjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bGluZV9maWxlcG9zCi0JCSArIHMtPnUuc3ltZW50Lm5fdmFsdWUgKiBiZmRfY29mZl9saW5lc3ogKGJmZF9wdHIpKTsKLQkgICAgICBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uID0KLQkJY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChiZmRfcHRyLCBOX0RFQlVHKTsKLQkgICAgICBCRkRfQVNTRVJUIChjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5mbGFncyAmIEJTRl9ERUJVR0dJTkcpOwotCSAgICB9Ci0JICBmb3IgKGkgPSAwOyBpIDwgcy0+dS5zeW1lbnQubl9udW1hdXg7IGkrKykKLQkgICAgewotCSAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmEgPSBzICsgaSArIDE7Ci0JICAgICAgaWYgKGEtPmZpeF90YWcpCi0JCXsKLQkJICBhLT51LmF1eGVudC54X3N5bS54X3RhZ25keC5sID0KLQkJICAgIGEtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LnAtPm9mZnNldDsKLQkJICBhLT5maXhfdGFnID0gMDsKLQkJfQotCSAgICAgIGlmIChhLT5maXhfZW5kKQotCQl7Ci0JCSAgYS0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCA9Ci0JCSAgICBhLT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5wLT5vZmZzZXQ7Ci0JCSAgYS0+Zml4X2VuZCA9IDA7Ci0JCX0KLQkgICAgICBpZiAoYS0+Zml4X3NjbmxlbikKLQkJewotCQkgIGEtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ubCA9Ci0JCSAgICBhLT51LmF1eGVudC54X2NzZWN0Lnhfc2NubGVuLnAtPm9mZnNldDsKLQkJICBhLT5maXhfc2NubGVuID0gMDsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWNvZmZfZml4X3N5bWJvbF9uYW1lIChhYmZkLCBzeW1ib2wsIG5hdGl2ZSwgc3RyaW5nX3NpemVfcCwKLQkJICAgICAgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwgZGVidWdfc3RyaW5nX3NpemVfcCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZTsKLSAgICAgYmZkX3NpemVfdHlwZSAqc3RyaW5nX3NpemVfcDsKLSAgICAgYXNlY3Rpb24gKipkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wOwotICAgICBiZmRfc2l6ZV90eXBlICpkZWJ1Z19zdHJpbmdfc2l6ZV9wOwotewotICB1bnNpZ25lZCBpbnQgbmFtZV9sZW5ndGg7Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4ZW50OwotICBjaGFyICpuYW1lID0gKGNoYXIgKikgKHN5bWJvbC0+bmFtZSk7Ci0KLSAgaWYgKG5hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBjb2ZmIHN5bWJvbHMgYWx3YXlzIGhhdmUgbmFtZXMsIHNvIHdlJ2xsIG1ha2Ugb25lIHVwICovCi0gICAgICBzeW1ib2wtPm5hbWUgPSAic3RyYW5nZSI7Ci0gICAgICBuYW1lID0gKGNoYXIgKikgc3ltYm9sLT5uYW1lOwotICAgIH0KLSAgbmFtZV9sZW5ndGggPSBzdHJsZW4gKG5hbWUpOwotCi0gIGlmIChuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRQotICAgICAgJiYgbmF0aXZlLT51LnN5bWVudC5uX251bWF1eCA+IDApCi0gICAgewotICAgICAgc3RybmNweSAobmF0aXZlLT51LnN5bWVudC5fbi5fbl9uYW1lLCAiLmZpbGUiLCBTWU1OTUxFTik7Ci0gICAgICBhdXhlbnQgPSAmKG5hdGl2ZSArIDEpLT51LmF1eGVudDsKLQotICAgICAgaWYgKGJmZF9jb2ZmX2xvbmdfZmlsZW5hbWVzIChhYmZkKSkKLQl7Ci0JICBpZiAobmFtZV9sZW5ndGggPD0gRklMTk1MRU4pCi0JICAgIHsKLQkgICAgICBzdHJuY3B5IChhdXhlbnQtPnhfZmlsZS54X2ZuYW1lLCBuYW1lLCBGSUxOTUxFTik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGF1eGVudC0+eF9maWxlLnhfbi54X29mZnNldCA9ICpzdHJpbmdfc2l6ZV9wICsgU1RSSU5HX1NJWkVfU0laRTsKLQkgICAgICBhdXhlbnQtPnhfZmlsZS54X24ueF96ZXJvZXMgPSAwOwotCSAgICAgICpzdHJpbmdfc2l6ZV9wICs9IG5hbWVfbGVuZ3RoICsgMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJuY3B5IChhdXhlbnQtPnhfZmlsZS54X2ZuYW1lLCBuYW1lLCBGSUxOTUxFTik7Ci0JICBpZiAobmFtZV9sZW5ndGggPiBGSUxOTUxFTikKLQkgICAgewotCSAgICAgIG5hbWVbRklMTk1MRU5dID0gJ1wwJzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobmFtZV9sZW5ndGggPD0gU1lNTk1MRU4pCi0JewotCSAgLyogVGhpcyBuYW1lIHdpbGwgZml0IGludG8gdGhlIHN5bWJvbCBuZWF0bHkgKi8KLQkgIHN0cm5jcHkgKG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbmFtZSwgc3ltYm9sLT5uYW1lLCBTWU1OTUxFTik7Ci0JfQotICAgICAgZWxzZSBpZiAoIWJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgKGFiZmQsICZuYXRpdmUtPnUuc3ltZW50KSkKLQl7Ci0JICBuYXRpdmUtPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID0gKCpzdHJpbmdfc2l6ZV9wCi0JCQkJCQkrIFNUUklOR19TSVpFX1NJWkUpOwotCSAgbmF0aXZlLT51LnN5bWVudC5fbi5fbl9uLl9uX3plcm9lcyA9IDA7Ci0JICAqc3RyaW5nX3NpemVfcCArPSBuYW1lX2xlbmd0aCArIDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxvbmcgZmlsZXBvczsKLQkgIGJmZF9ieXRlIGJ1ZlsyXTsKLQotCSAgLyogVGhpcyBuYW1lIHNob3VsZCBiZSB3cml0dGVuIGludG8gdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgRm9yCi0JICAgICBzb21lIHJlYXNvbiBlYWNoIG5hbWUgaXMgcHJlY2VkZWQgYnkgYSB0d28gYnl0ZSBsZW5ndGgKLQkgICAgIGFuZCBhbHNvIGZvbGxvd2VkIGJ5IGEgbnVsbCBieXRlLiAgRklYTUU6IFdlIGFzc3VtZSB0aGF0Ci0JICAgICB0aGUgLmRlYnVnIHNlY3Rpb24gaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLCBhbmQgdGhhdCBpdAotCSAgICAgaXMgbGFyZ2UgZW5vdWdoLiAgKi8KLQkgIGlmICgqZGVidWdfc3RyaW5nX3NlY3Rpb25fcCA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgKmRlYnVnX3N0cmluZ19zZWN0aW9uX3AgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kZWJ1ZyIpOwotCSAgZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLQkgIGJmZF9wdXRfMTYgKGFiZmQsIG5hbWVfbGVuZ3RoICsgMSwgYnVmKTsKLQkgIGlmICghYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLAotCQkJCQkgKmRlYnVnX3N0cmluZ19zZWN0aW9uX3AsCi0JCQkJCSAoUFRSKSBidWYsCi0JCQkJCSAoZmlsZV9wdHIpICpkZWJ1Z19zdHJpbmdfc2l6ZV9wLAotCQkJCQkgKGJmZF9zaXplX3R5cGUpIDIpCi0JICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwKLQkJCQkJICAgICpkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLAotCQkJCQkgICAgKFBUUikgc3ltYm9sLT5uYW1lLAotCQkJCQkgICAgKChmaWxlX3B0cikgKmRlYnVnX3N0cmluZ19zaXplX3AKLQkJCQkJICAgICArIDIpLAotCQkJCQkgICAgKGJmZF9zaXplX3R5cGUpIG5hbWVfbGVuZ3RoICsgMSkpCi0JICAgIGFib3J0ICgpOwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBmaWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLQkgICAgYWJvcnQgKCk7Ci0JICBuYXRpdmUtPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID0gKmRlYnVnX3N0cmluZ19zaXplX3AgKyAyOwotCSAgbmF0aXZlLT51LnN5bWVudC5fbi5fbl9uLl9uX3plcm9lcyA9IDA7Ci0JICAqZGVidWdfc3RyaW5nX3NpemVfcCArPSBuYW1lX2xlbmd0aCArIDM7Ci0JfQotICAgIH0KLX0KLQotLyogV2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBzeW1ib2wgaW5kZXggc28gdGhhdCB3aGVuIHdlIHdyaXRlIG91dAotICAgdGhlIHJlbG9jcyB3ZSBjYW4gZ2V0IHRoZSBpbmRleCBmb3IgYSBzeW1ib2wuICBUaGlzIG1ldGhvZCBpcyBhCi0gICBoYWNrLiAgRklYTUUuICAqLwotCi0jZGVmaW5lIHNldF9pbmRleChzeW1ib2wsIGlkeCkJKChzeW1ib2wpLT51ZGF0YS5pID0gKGlkeCkpCi0KLS8qIFdyaXRlIGEgc3ltYm9sIG91dCB0byBhIENPRkYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3dyaXRlX3N5bWJvbCAoYWJmZCwgc3ltYm9sLCBuYXRpdmUsIHdyaXR0ZW4sIHN0cmluZ19zaXplX3AsCi0JCSAgIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsIGRlYnVnX3N0cmluZ19zaXplX3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmU7Ci0gICAgIHVuc2lnbmVkIGludCAqd3JpdHRlbjsKLSAgICAgYmZkX3NpemVfdHlwZSAqc3RyaW5nX3NpemVfcDsKLSAgICAgYXNlY3Rpb24gKipkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wOwotICAgICBiZmRfc2l6ZV90eXBlICpkZWJ1Z19zdHJpbmdfc2l6ZV9wOwotewotICB1bnNpZ25lZCBpbnQgbnVtYXV4ID0gbmF0aXZlLT51LnN5bWVudC5uX251bWF1eDsKLSAgaW50IHR5cGUgPSBuYXRpdmUtPnUuc3ltZW50Lm5fdHlwZTsKLSAgaW50IGNsYXNzID0gbmF0aXZlLT51LnN5bWVudC5uX3NjbGFzczsKLSAgUFRSIGJ1ZjsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0KLSAgaWYgKG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQotICAgIHN5bWJvbC0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLQotICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcKLSAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX0RFQlVHOwotICAgIH0KLSAgZWxzZSBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fQUJTOwotICAgIH0KLSAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fVU5ERUY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0KLQlzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gIGNvZmZfZml4X3N5bWJvbF9uYW1lIChhYmZkLCBzeW1ib2wsIG5hdGl2ZSwgc3RyaW5nX3NpemVfcCwKLQkJCWRlYnVnX3N0cmluZ19zZWN0aW9uX3AsIGRlYnVnX3N0cmluZ19zaXplX3ApOwotCi0gIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0gIGJ1ZiA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltZXN6KTsKLSAgaWYgKCFidWYpCi0gICAgcmV0dXJuIGZhbHNlOwotICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsICZuYXRpdmUtPnUuc3ltZW50LCBidWYpOwotICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIHN5bWVzeiwgYWJmZCkgIT0gc3ltZXN6KQotICAgIHJldHVybiBmYWxzZTsKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIGJ1Zik7Ci0KLSAgaWYgKG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXggPiAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgYXV4ZXN6OwotICAgICAgdW5zaWduZWQgaW50IGo7Ci0KLSAgICAgIGF1eGVzeiA9IGJmZF9jb2ZmX2F1eGVzeiAoYWJmZCk7Ci0gICAgICBidWYgPSBiZmRfYWxsb2MgKGFiZmQsIGF1eGVzeik7Ci0gICAgICBpZiAoIWJ1ZikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgbmF0aXZlLT51LnN5bWVudC5uX251bWF1eDsgaisrKQotCXsKLQkgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAoYWJmZCwKLQkJCQkgJigobmF0aXZlICsgaiArIDEpLT51LmF1eGVudCksCi0JCQkJIHR5cGUsCi0JCQkJIGNsYXNzLAotCQkJCSBqLAotCQkJCSBuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4LAotCQkJCSBidWYpOwotCSAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCBhdXhlc3osIGFiZmQpICE9IGF1eGVzeikKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBidWYpOwotICAgIH0KLQotICAvKiBTdG9yZSB0aGUgaW5kZXggZm9yIHVzZSB3aGVuIHdlIHdyaXRlIG91dCB0aGUgcmVsb2NzLiAgKi8KLSAgc2V0X2luZGV4IChzeW1ib2wsICp3cml0dGVuKTsKLQotICAqd3JpdHRlbiArPSBudW1hdXggKyAxOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgc3ltYm9sIHRvIGEgQ09GRiBmaWxlIHRoYXQgZG9lcyBub3QgY29tZSBmcm9tIGEgQ09GRgotICAgZmlsZSBvcmlnaW5hbGx5LiAgVGhpcyBzeW1ib2wgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIsCi0gICBvciB3ZSBtYXkgYmUgbGlua2luZyBhIG5vbiBDT0ZGIGZpbGUgdG8gYSBDT0ZGIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl93cml0ZV9hbGllbl9zeW1ib2wgKGFiZmQsIHN5bWJvbCwgd3JpdHRlbiwgc3RyaW5nX3NpemVfcCwKLQkJCSBkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLCBkZWJ1Z19zdHJpbmdfc2l6ZV9wKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50ICp3cml0dGVuOwotICAgICBiZmRfc2l6ZV90eXBlICpzdHJpbmdfc2l6ZV9wOwotICAgICBhc2VjdGlvbiAqKmRlYnVnX3N0cmluZ19zZWN0aW9uX3A7Ci0gICAgIGJmZF9zaXplX3R5cGUgKmRlYnVnX3N0cmluZ19zaXplX3A7Ci17Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZTsKLSAgY29tYmluZWRfZW50cnlfdHlwZSBkdW1teTsKLQotICBuYXRpdmUgPSAmZHVtbXk7Ci0gIG5hdGl2ZS0+dS5zeW1lbnQubl90eXBlID0gVF9OVUxMOwotICBuYXRpdmUtPnUuc3ltZW50Lm5fZmxhZ3MgPSAwOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fVU5ERUY7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgPSBzeW1ib2wtPnZhbHVlOwotICAgIH0KLSAgZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fVU5ERUY7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgPSBzeW1ib2wtPnZhbHVlOwotICAgIH0KLSAgZWxzZSBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpCi0gICAgewotICAgICAgLyogVGhlcmUgaXNuJ3QgbXVjaCBwb2ludCB0byB3cml0aW5nIG91dCBhIGRlYnVnZ2luZyBzeW1ib2wKLSAgICAgICAgIHVubGVzcyB3ZSBhcmUgcHJlcGFyZWQgdG8gY29udmVydCBpdCBpbnRvIENPRkYgZGVidWdnaW5nCi0gICAgICAgICBmb3JtYXQuICBTbywgd2UganVzdCBpZ25vcmUgdGhlbS4gIFdlIG11c3QgY2xvYmJlciB0aGUgc3ltYm9sCi0gICAgICAgICBuYW1lIHRvIGtlZXAgaXQgZnJvbSBiZWluZyBwdXQgaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCi0gICAgICBzeW1ib2wtPm5hbWUgPSAiIjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9Ci0Jc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlID0gKHN5bWJvbC0+dmFsdWUKLQkJCQkgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGlmICghIG9ial9wZSAoYWJmZCkpCi0JbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICAgICAgLyogQ29weSB0aGUgYW55IGZsYWdzIGZyb20gdGhlIHRoZSBmaWxlIGhlYWRlciBpbnRvIHRoZSBzeW1ib2wuCi0gICAgICAgICBGSVhNRTogV2h5PyAgKi8KLSAgICAgIHsKLQljb2ZmX3N5bWJvbF90eXBlICpjID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltYm9sKTsKLQlpZiAoYyAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMKQotCSAgbmF0aXZlLT51LnN5bWVudC5uX2ZsYWdzID0gYmZkX2FzeW1ib2xfYmZkICgmYy0+c3ltYm9sKS0+ZmxhZ3M7Ci0gICAgICB9Ci0gICAgfQotCi0gIG5hdGl2ZS0+dS5zeW1lbnQubl90eXBlID0gMDsKLSAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfTE9DQUwpCi0gICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9IENfU1RBVDsKLSAgZWxzZSBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKQotICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSBvYmpfcGUgKGFiZmQpID8gQ19OVF9XRUFLIDogQ19XRUFLRVhUOwotICBlbHNlCi0gICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9IENfRVhUOwotICBuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4ID0gMDsKLQotICByZXR1cm4gY29mZl93cml0ZV9zeW1ib2wgKGFiZmQsIHN5bWJvbCwgbmF0aXZlLCB3cml0dGVuLCBzdHJpbmdfc2l6ZV9wLAotCQkJICAgIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsIGRlYnVnX3N0cmluZ19zaXplX3ApOwotfQotCi0vKiBXcml0ZSBhIG5hdGl2ZSBzeW1ib2wgdG8gYSBDT0ZGIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sIChhYmZkLCBzeW1ib2wsIHdyaXR0ZW4sIHN0cmluZ19zaXplX3AsCi0JCQkgIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsIGRlYnVnX3N0cmluZ19zaXplX3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29mZl9zeW1ib2xfdHlwZSAqc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgKndyaXR0ZW47Ci0gICAgIGJmZF9zaXplX3R5cGUgKnN0cmluZ19zaXplX3A7Ci0gICAgIGFzZWN0aW9uICoqZGVidWdfc3RyaW5nX3NlY3Rpb25fcDsKLSAgICAgYmZkX3NpemVfdHlwZSAqZGVidWdfc3RyaW5nX3NpemVfcDsKLXsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlID0gc3ltYm9sLT5uYXRpdmU7Ci0gIGFsZW50ICpsaW5lbm8gPSBzeW1ib2wtPmxpbmVubzsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBoYXMgYW4gYXNzb2NpYXRlZCBsaW5lIG51bWJlciwgd2UgbXVzdCBzdG9yZSB0aGUKLSAgICAgc3ltYm9sIGluZGV4IGluIHRoZSBsaW5lIG51bWJlciBmaWVsZC4gIFdlIGFsc28gdGFnIHRoZSBhdXhlbnQgdG8KLSAgICAgcG9pbnQgdG8gdGhlIHJpZ2h0IHBsYWNlIGluIHRoZSBsaW5lbm8gdGFibGUuICAqLwotICBpZiAobGluZW5vICYmICFzeW1ib2wtPmRvbmVfbGluZW5vICYmIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24tPm93bmVyICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGNvdW50ID0gMDsKLSAgICAgIGxpbmVub1tjb3VudF0udS5vZmZzZXQgPSAqd3JpdHRlbjsKLSAgICAgIGlmIChuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4KQotCXsKLQkgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYSA9ICYoKG5hdGl2ZSArIDEpLT51LmF1eGVudCk7Ci0KLQkgIGEtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9Ci0JICAgIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5tb3ZpbmdfbGluZV9maWxlcG9zOwotCX0KLQotICAgICAgLyogQ291bnQgYW5kIHJlbG9jYXRlIGFsbCBvdGhlciBsaW5lbnVtYmVycy4gICovCi0gICAgICBjb3VudCsrOwotICAgICAgd2hpbGUgKGxpbmVub1tjb3VudF0ubGluZV9udW1iZXIgIT0gMCkKLQl7Ci0jaWYgMAotCSAgLyogMTMgYXByaWwgOTIuIHNhYyAKLQkgICAgIEkndmUgYmVlbiB0b2xkIHRoaXMsIGJ1dCBzdGlsbCBuZWVkIHByb29mOgotCSAgICAgPiBUaGUgc2Vjb25kIGJ1ZyBpcyBhbHNvIGluIGBiZmQvY29mZmNvZGUuaCcuICBUaGlzIGJ1ZwotCSAgICAgPiBjYXVzZXMgdGhlIGxpbmtlciB0byBzY3JldyB1cCB0aGUgcGMtcmVsb2NhdGlvbnMgZm9yCi0JICAgICA+IGFsbCB0aGUgbGluZSBudW1iZXJzIGluIENPRkYgY29kZS4gIFRoaXMgYnVnIGlzbid0IG9ubHkKLQkgICAgID4gc3BlY2lmaWMgdG8gQTI5SyBpbXBsZW1lbnRhdGlvbnMsIGJ1dCBhZmZlY3RzIGFsbAotCSAgICAgPiBzeXN0ZW1zIHVzaW5nIENPRkYgZm9ybWF0IGJpbmFyaWVzLiAgTm90ZSB0aGF0IGluIENPRkYKLQkgICAgID4gb2JqZWN0IGZpbGVzLCB0aGUgbGluZSBudW1iZXIgY29yZSBvZmZzZXRzIG91dHB1dCBieQotCSAgICAgPiB0aGUgYXNzZW1ibGVyIGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgZWFjaAotCSAgICAgPiBwcm9jZWR1cmUsIG5vdCB0byB0aGUgc3RhcnQgb2YgdGhlIC50ZXh0IHNlY3Rpb24uICBUaGlzCi0JICAgICA+IHBhdGNoIHJlbG9jYXRlcyB0aGUgbGluZSBudW1iZXJzIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgPiBgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlJyBpbnN0ZWFkIG9mIHRoZSBzZWN0aW9uCi0JICAgICA+IHZpcnR1YWwgYWRkcmVzcy4KLQkgICAgID4gbW9kdWxhciFvbHNvbkBjcy5hcml6b25hLmVkdSAoSm9uIE9sc29uKQotCSAgICovCi0JICBsaW5lbm9bY291bnRdLnUub2Zmc2V0ICs9IG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZTsKLSNlbHNlCi0JICBsaW5lbm9bY291bnRdLnUub2Zmc2V0ICs9Ci0JICAgIChzeW1ib2wtPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICArIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotI2VuZGlmCi0JICBjb3VudCsrOwotCX0KLSAgICAgIHN5bWJvbC0+ZG9uZV9saW5lbm8gPSB0cnVlOwotCi0gICAgICBzeW1ib2wtPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bW92aW5nX2xpbmVfZmlsZXBvcyArPQotCWNvdW50ICogYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGNvZmZfd3JpdGVfc3ltYm9sIChhYmZkLCAmKHN5bWJvbC0+c3ltYm9sKSwgbmF0aXZlLCB3cml0dGVuLAotCQkJICAgIHN0cmluZ19zaXplX3AsIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsCi0JCQkgICAgZGVidWdfc3RyaW5nX3NpemVfcCk7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgQ09GRiBzeW1ib2xzLiAgKi8KLQotYm9vbGVhbgotY29mZl93cml0ZV9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3RyaW5nX3NpemU7Ci0gIGFzZWN0aW9uICpkZWJ1Z19zdHJpbmdfc2VjdGlvbjsKLSAgYmZkX3NpemVfdHlwZSBkZWJ1Z19zdHJpbmdfc2l6ZTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBsaW1pdCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICB1bnNpZ25lZCBpbnQgd3JpdHRlbiA9IDA7Ci0gIGFzeW1ib2wgKipwOwotCi0gIHN0cmluZ19zaXplID0gMDsKLSAgZGVidWdfc3RyaW5nX3NlY3Rpb24gPSBOVUxMOwotICBkZWJ1Z19zdHJpbmdfc2l6ZSA9IDA7Ci0KLSAgLyogSWYgdGhpcyB0YXJnZXQgc3VwcG9ydHMgbG9uZyBzZWN0aW9uIG5hbWVzLCB0aGV5IG11c3QgYmUgcHV0IGludG8KLSAgICAgdGhlIHN0cmluZyB0YWJsZS4gIFRoaXMgaXMgc3VwcG9ydGVkIGJ5IFBFLiAgVGhpcyBjb2RlIG11c3QKLSAgICAgaGFuZGxlIHNlY3Rpb24gbmFtZXMganVzdCBhcyB0aGV5IGFyZSBoYW5kbGVkIGluCi0gICAgIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLiAgKi8KLSAgaWYgKGJmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyAoYWJmZCkpCi0gICAgewotICAgICAgYXNlY3Rpb24gKm87Ci0KLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIHNpemVfdCBsZW47Ci0KLQkgIGxlbiA9IHN0cmxlbiAoby0+bmFtZSk7Ci0JICBpZiAobGVuID4gU0NOTk1MRU4pCi0JICAgIHN0cmluZ19zaXplICs9IGxlbiArIDE7Ci0JfQotICAgIH0KLQotICAvKiBTZWVrIHRvIHRoZSByaWdodCBwbGFjZSAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zeW1fZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBPdXRwdXQgYWxsIHRoZSBzeW1ib2xzIHdlIGhhdmUgKi8KLQotICB3cml0dGVuID0gMDsKLSAgZm9yIChwID0gYWJmZC0+b3V0c3ltYm9scywgaSA9IDA7IGkgPCBsaW1pdDsgaSsrLCBwKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltYm9sID0gKnA7Ci0gICAgICBjb2ZmX3N5bWJvbF90eXBlICpjX3N5bWJvbCA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bWJvbCk7Ci0KLSAgICAgIGlmIChjX3N5bWJvbCA9PSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMCi0JICB8fCBjX3N5bWJvbC0+bmF0aXZlID09IChjb21iaW5lZF9lbnRyeV90eXBlICopIE5VTEwpCi0JewotCSAgaWYgKCFjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCAoYWJmZCwgc3ltYm9sLCAmd3JpdHRlbiwgJnN0cmluZ19zaXplLAotCQkJCQkmZGVidWdfc3RyaW5nX3NlY3Rpb24sCi0JCQkJCSZkZWJ1Z19zdHJpbmdfc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCFjb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wgKGFiZmQsIGNfc3ltYm9sLCAmd3JpdHRlbiwKLQkJCQkJICZzdHJpbmdfc2l6ZSwgJmRlYnVnX3N0cmluZ19zZWN0aW9uLAotCQkJCQkgJmRlYnVnX3N0cmluZ19zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpID0gd3JpdHRlbjsKLQotICAvKiBOb3cgd3JpdGUgb3V0IHN0cmluZ3MgKi8KLQotICBpZiAoc3RyaW5nX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IHN0cmluZ19zaXplICsgU1RSSU5HX1NJWkVfU0laRTsKLSAgICAgIGJmZF9ieXRlIGJ1ZmZlcltTVFJJTkdfU0laRV9TSVpFXTsKLQotI2lmIFNUUklOR19TSVpFX1NJWkUgPT0gNAotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBzaXplLCBidWZmZXIpOwotI2Vsc2UKLSAjZXJyb3IgQ2hhbmdlIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmZXIsIDEsIHNpemVvZiAoYnVmZmVyKSwgYWJmZCkgIT0gc2l6ZW9mIChidWZmZXIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcy4gIFRoaXMgY29kZSBtdXN0IGhhbmRsZSBzZWN0aW9uCi0JIG5hbWVzIGp1c3QgYXMgdGhleSBhcmUgaGFuZGxlZCBpbiBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cy4gICovCi0gICAgICBpZiAoYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzIChhYmZkKSkKLQl7Ci0JICBhc2VjdGlvbiAqbzsKLQotCSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIHsKLQkgICAgICBzaXplX3QgbGVuOwotCi0JICAgICAgbGVuID0gc3RybGVuIChvLT5uYW1lKTsKLQkgICAgICBpZiAobGVuID4gU0NOTk1MRU4pCi0JCXsKLQkJICBpZiAoYmZkX3dyaXRlIChvLT5uYW1lLCAxLCBsZW4gKyAxLCBhYmZkKSAhPSBsZW4gKyAxKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZvciAocCA9IGFiZmQtPm91dHN5bWJvbHMsIGkgPSAwOwotCSAgIGkgPCBsaW1pdDsKLQkgICBpKyssIHArKykKLQl7Ci0JICBhc3ltYm9sICpxID0gKnA7Ci0JICBzaXplX3QgbmFtZV9sZW5ndGggPSBzdHJsZW4gKHEtPm5hbWUpOwotCSAgY29mZl9zeW1ib2xfdHlwZSAqY19zeW1ib2wgPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBxKTsKLQkgIHNpemVfdCBtYXhsZW47Ci0KLQkgIC8qIEZpZ3VyZSBvdXQgd2hldGhlciB0aGUgc3ltYm9sIG5hbWUgc2hvdWxkIGdvIGluIHRoZSBzdHJpbmcKLQkgICAgIHRhYmxlLiAgU3ltYm9sIG5hbWVzIHRoYXQgYXJlIHNob3J0IGVub3VnaCBhcmUgc3RvcmVkCi0JICAgICBkaXJlY3RseSBpbiB0aGUgc3ltZW50IHN0cnVjdHVyZS4gIEZpbGUgbmFtZXMgcGVybWl0IGEKLQkgICAgIGRpZmZlcmVudCwgbG9uZ2VyLCBsZW5ndGggaW4gdGhlIHN5bWVudCBzdHJ1Y3R1cmUuICBPbgotCSAgICAgWENPRkYsIHNvbWUgc3ltYm9sIG5hbWVzIGFyZSBzdG9yZWQgaW4gdGhlIC5kZWJ1ZyBzZWN0aW9uCi0JICAgICByYXRoZXIgdGhhbiBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQotCSAgaWYgKGNfc3ltYm9sID09IE5VTEwKLQkgICAgICB8fCBjX3N5bWJvbC0+bmF0aXZlID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIG5vdCBhIENPRkYgc3ltYm9sLCBzbyBpdCBjZXJ0YWlubHkgaXMgbm90IGEKLQkgICAgICAgICBmaWxlIG5hbWUsIG5vciBkb2VzIGl0IGdvIGluIHRoZSAuZGVidWcgc2VjdGlvbi4gICovCi0JICAgICAgbWF4bGVuID0gU1lNTk1MRU47Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgKGFiZmQsCi0JCQkJCSAgICAgICZjX3N5bWJvbC0+bmF0aXZlLT51LnN5bWVudCkpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHN5bWJvbCBuYW1lIGlzIGluIHRoZSBYQ09GRiAuZGVidWcgc2VjdGlvbi4KLQkgICAgICAgICBEb24ndCB3cml0ZSBpdCBpbnRvIHRoZSBzdHJpbmcgdGFibGUuICAqLwotCSAgICAgIG1heGxlbiA9IG5hbWVfbGVuZ3RoOwotCSAgICB9Ci0JICBlbHNlIGlmIChjX3N5bWJvbC0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUKLQkJICAgJiYgY19zeW1ib2wtPm5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXggPiAwKQotCSAgICBtYXhsZW4gPSBGSUxOTUxFTjsKLQkgIGVsc2UKLQkgICAgbWF4bGVuID0gU1lNTk1MRU47Ci0KLQkgIGlmIChuYW1lX2xlbmd0aCA+IG1heGxlbikKLQkgICAgewotCSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIChxLT5uYW1lKSwgMSwgbmFtZV9sZW5ndGggKyAxLCBhYmZkKQotCQkgICE9IG5hbWVfbGVuZ3RoICsgMSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIHdvdWxkIG5vcm1hbGx5IG5vdCB3cml0ZSBhbnl0aGluZyBoZXJlLCBidXQgd2UnbGwgd3JpdGUKLSAgICAgICAgIG91dCA0IHNvIHRoYXQgYW55IHN0dXBpZCBjb2ZmIHJlYWRlciB3aGljaCB0cmllcyB0byByZWFkIHRoZQotICAgICAgICAgc3RyaW5nIHRhYmxlIGV2ZW4gd2hlbiB0aGVyZSBpc24ndCBvbmUgd29uJ3QgY3JvYWsuICAqLwotICAgICAgdW5zaWduZWQgaW50IHNpemUgPSBTVFJJTkdfU0laRV9TSVpFOwotICAgICAgYmZkX2J5dGUgYnVmZmVyW1NUUklOR19TSVpFX1NJWkVdOwotCi0jaWYgU1RSSU5HX1NJWkVfU0laRSA9PSA0Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNpemUsIGJ1ZmZlcik7Ci0jZWxzZQotICNlcnJvciBDaGFuZ2UgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZmZlciwgMSwgU1RSSU5HX1NJWkVfU0laRSwgYWJmZCkKLQkgICE9IFNUUklOR19TSVpFX1NJWkUpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgdGhlIC5kZWJ1ZyBzZWN0aW9uIHdhcyBjcmVhdGVkIHRvIGJlIHRoZSBjb3JyZWN0IHNpemUuCi0gICAgIFdlIHNob3VsZCBjcmVhdGUgaXQgb3Vyc2VsdmVzIG9uIHRoZSBmbHksIGJ1dCB3ZSBkb24ndCBiZWNhdXNlCi0gICAgIEJGRCB3b24ndCBsZXQgdXMgd3JpdGUgdG8gYW55IHNlY3Rpb24gdW50aWwgd2Uga25vdyBob3cgbGFyZ2UgYWxsCi0gICAgIHRoZSBzZWN0aW9ucyBhcmUuICBXZSBjb3VsZCBzdGlsbCBkbyBpdCBieSBtYWtpbmcgYW5vdGhlciBwYXNzCi0gICAgIG92ZXIgdGhlIHN5bWJvbHMuICBGSVhNRS4gICovCi0gIEJGRF9BU1NFUlQgKGRlYnVnX3N0cmluZ19zaXplID09IDAKLQkgICAgICB8fCAoZGVidWdfc3RyaW5nX3NlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwKLQkJICAmJiAoQkZEX0FMSUdOIChkZWJ1Z19zdHJpbmdfc2l6ZSwKLQkJCQkgMSA8PCBkZWJ1Z19zdHJpbmdfc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKQotCQkgICAgICA9PSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBkZWJ1Z19zdHJpbmdfc2VjdGlvbikpKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2xlYW4KLWNvZmZfd3JpdGVfbGluZW51bWJlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJmZF9zaXplX3R5cGUgbGluZXN6OwotICBQVFIgYnVmZjsKLQotICBsaW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGFiZmQpOwotICBidWZmID0gYmZkX2FsbG9jIChhYmZkLCBsaW5lc3opOwotICBpZiAoIWJ1ZmYpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKHMtPmxpbmVub19jb3VudCkKLQl7Ci0JICBhc3ltYm9sICoqcSA9IGFiZmQtPm91dHN5bWJvbHM7Ci0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIHMtPmxpbmVfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIEZpbmQgYWxsIHRoZSBsaW5lbnVtYmVycyBpbiB0aGlzIHNlY3Rpb24gKi8KLQkgIHdoaWxlICgqcSkKLQkgICAgewotCSAgICAgIGFzeW1ib2wgKnAgPSAqcTsKLQkgICAgICBpZiAocC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gcykKLQkJewotCQkgIGFsZW50ICpsID0KLQkJICBCRkRfU0VORCAoYmZkX2FzeW1ib2xfYmZkIChwKSwgX2dldF9saW5lbm8sCi0JCQkgICAgKGJmZF9hc3ltYm9sX2JmZCAocCksIHApKTsKLQkJICBpZiAobCkKLQkJICAgIHsKLQkJICAgICAgLyogRm91bmQgYSBsaW5lbnVtYmVyIGVudHJ5LCBvdXRwdXQgKi8KLQkJICAgICAgc3RydWN0IGludGVybmFsX2xpbmVubyBvdXQ7Ci0JCSAgICAgIG1lbXNldCAoKFBUUikgJiBvdXQsIDAsIHNpemVvZiAob3V0KSk7Ci0JCSAgICAgIG91dC5sX2xubm8gPSAwOwotCQkgICAgICBvdXQubF9hZGRyLmxfc3ltbmR4ID0gbC0+dS5vZmZzZXQ7Ci0JCSAgICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgJm91dCwgYnVmZik7Ci0JCSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZmYsIDEsIGxpbmVzeiwgYWJmZCkgIT0gbGluZXN6KQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBsKys7Ci0JCSAgICAgIHdoaWxlIChsLT5saW5lX251bWJlcikKLQkJCXsKLQkJCSAgb3V0LmxfbG5ubyA9IGwtPmxpbmVfbnVtYmVyOwotCQkJICBvdXQubF9hZGRyLmxfc3ltbmR4ID0gbC0+dS5vZmZzZXQ7Ci0JCQkgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgJm91dCwgYnVmZik7Ci0JCQkgIGlmIChiZmRfd3JpdGUgKGJ1ZmYsIDEsIGxpbmVzeiwgYWJmZCkgIT0gbGluZXN6KQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCSAgbCsrOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgcSsrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIGJ1ZmYpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLypBUkdTVVNFRCAqLwotYWxlbnQgKgotY29mZl9nZXRfbGluZW5vIChpZ25vcmVfYWJmZCwgc3ltYm9sKQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIHJldHVybiBjb2Zmc3ltYm9sIChzeW1ib2wpLT5saW5lbm87Ci19Ci0KLSNpZiAwCi0KLS8qIFRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMsIHdoaWNoIGhhcyBiZWVuCi0gICBkaXNhYmxlZC4gICovCi0KLWFzeW1ib2wgKgotY29mZl9zZWN0aW9uX3N5bWJvbCAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCBuYW1lKTsKLSAgYXN5bWJvbCAqc3ltOwotICBjb21iaW5lZF9lbnRyeV90eXBlICpjc3ltOwotCi0gIHN5bSA9IHNlYy0+c3ltYm9sOwotICBjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltKS0+bmF0aXZlOwotICAvKiBNYWtlIHN1cmUgYmFjay1lbmQgQ09GRiBzdHVmZiBpcyB0aGVyZS4gICovCi0gIGlmIChjc3ltID09IDApCi0gICAgewotICAgICAgc3RydWN0IGZvbwotCXsKLQkgIGNvZmZfc3ltYm9sX3R5cGUgc3ltOwotCSAgLyogQEBGSVhNRSBUaGlzIHNob3VsZG4ndCB1c2UgYSBmaXhlZCBzaXplISEgICovCi0JICBjb21iaW5lZF9lbnRyeV90eXBlIGVbMTBdOwotCX07Ci0gICAgICBzdHJ1Y3QgZm9vICpmOwotICAgICAgZiA9IChzdHJ1Y3QgZm9vICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqZikpOwotICAgICAgaWYgKCFmKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19lcnJvcik7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBtZW1zZXQgKChjaGFyICopIGYsIDAsIHNpemVvZiAoKmYpKTsKLSAgICAgIGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bSktPm5hdGl2ZSA9IGNzeW0gPSBmLT5lOwotICAgIH0KLSAgY3N5bVswXS51LnN5bWVudC5uX3NjbGFzcyA9IENfU1RBVDsKLSAgY3N5bVswXS51LnN5bWVudC5uX251bWF1eCA9IDE7Ci0vKiAgU0ZfU0VUX1NUQVRJQ1MgKHN5bSk7ICAgICAgIEBAID8/PyAqLwotICBjc3ltWzFdLnUuYXV4ZW50Lnhfc2NuLnhfc2NubGVuID0gc2VjLT5fcmF3X3NpemU7Ci0gIGNzeW1bMV0udS5hdXhlbnQueF9zY24ueF9ucmVsb2MgPSBzZWMtPnJlbG9jX2NvdW50OwotICBjc3ltWzFdLnUuYXV4ZW50Lnhfc2NuLnhfbmxpbm5vID0gc2VjLT5saW5lbm9fY291bnQ7Ci0KLSAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZWMtPm91dHB1dF9zZWN0aW9uID0gc2VjOwotICAgICAgc2VjLT5vdXRwdXRfb2Zmc2V0ID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIHN5bTsKLX0KLQotI2VuZGlmIC8qIDAgKi8KLQotLyogVGhpcyBmdW5jdGlvbiB0cmFuc2Zvcm1zIHRoZSBvZmZzZXRzIGludG8gdGhlIHN5bWJvbCB0YWJsZSBpbnRvCi0gICBwb2ludGVycyB0byBzeW1lbnRzLiAgKi8KLQotc3RhdGljIHZvaWQKLWNvZmZfcG9pbnRlcml6ZV9hdXggKGFiZmQsIHRhYmxlX2Jhc2UsIHN5bWJvbCwgaW5kYXV4LCBhdXhlbnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZTsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgaW5kYXV4OwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXhlbnQ7Ci17Ci0gIHVuc2lnbmVkIGludCB0eXBlID0gc3ltYm9sLT51LnN5bWVudC5uX3R5cGU7Ci0gIHVuc2lnbmVkIGludCBjbGFzcyA9IHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3M7Ci0KLSAgaWYgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2spCi0gICAgewotICAgICAgaWYgKCgqY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaykKLQkgIChhYmZkLCB0YWJsZV9iYXNlLCBzeW1ib2wsIGluZGF1eCwgYXV4ZW50KSkKLQlyZXR1cm47Ci0gICAgfQotCi0gIC8qIERvbid0IGJvdGhlciBpZiB0aGlzIGlzIGEgZmlsZSBvciBhIHNlY3Rpb24gKi8KLSAgaWYgKGNsYXNzID09IENfU1RBVCAmJiB0eXBlID09IFRfTlVMTCkKLSAgICByZXR1cm47Ci0gIGlmIChjbGFzcyA9PSBDX0ZJTEUpCi0gICAgcmV0dXJuOwotCi0gIC8qIE90aGVyd2lzZSBwYXRjaCB1cCAqLwotI2RlZmluZSBOX1RNQVNLIGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fdG1hc2sKLSNkZWZpbmUgTl9CVFNIRlQgY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl9idHNoZnQKLSAgaWYgKChJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSB8fCBjbGFzcyA9PSBDX0JMT0NLIHx8IGNsYXNzID09IENfRkNOKQotICAgICAgJiYgYXV4ZW50LT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID4gMCkKLSAgICB7Ci0gICAgICBhdXhlbnQtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LnAgPQotCXRhYmxlX2Jhc2UgKyBhdXhlbnQtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4Lmw7Ci0gICAgICBhdXhlbnQtPmZpeF9lbmQgPSAxOwotICAgIH0KLSAgLyogQSBuZWdhdGl2ZSB0YWduZHggaXMgbWVhbmluZ2xlc3MsIGJ1dCB0aGUgU0NPIDMuMnY0IGNjIGNhbgotICAgICBnZW5lcmF0ZSBvbmUsIHNvIHdlIG11c3QgYmUgY2FyZWZ1bCB0byBpZ25vcmUgaXQuICAqLwotICBpZiAoYXV4ZW50LT51LmF1eGVudC54X3N5bS54X3RhZ25keC5sID4gMCkKLSAgICB7Ci0gICAgICBhdXhlbnQtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LnAgPQotCXRhYmxlX2Jhc2UgKyBhdXhlbnQtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4Lmw7Ci0gICAgICBhdXhlbnQtPmZpeF90YWcgPSAxOwotICAgIH0KLX0KLQotLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSAiLmRlYnVnIiBzZWN0aW9uLCBhbmQgcmVhZCBpdC4KLSAgIFdlIGRpZCBub3QgcmVhZCB0aGUgZGVidWcgc2VjdGlvbiB1bnRpbCBub3csIGJlY2F1c2UKLSAgIHdlIGRpZG4ndCB3YW50IHRvIGdvIHRvIHRoZSB0cm91YmxlIHVudGlsIHNvbWVvbmUgbmVlZGVkIGl0LiAqLwotCi1zdGF0aWMgY2hhciAqCi1idWlsZF9kZWJ1Z19zZWN0aW9uIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKmRlYnVnX3NlY3Rpb247Ci0gIGxvbmcgcG9zaXRpb247Ci0KLSAgYXNlY3Rpb24gKnNlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kZWJ1ZyIpOwotCi0gIGlmICghc2VjdCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fZGVidWdfc2VjdGlvbik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgZGVidWdfc2VjdGlvbiA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgICBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3QpKTsKLSAgaWYgKGRlYnVnX3NlY3Rpb24gPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBTZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGAuZGVidWcnIHNlY3Rpb24gYW5kIHJlYWQgaXQuIAotICAgICBTYXZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIGZpcnN0OyBpdCBpcyBuZWVkZWQgYnkgb3VyIGNhbGxlci4KLSAgICAgVGhlbiByZWFkIGRlYnVnIHNlY3Rpb24gYW5kIHJlc2V0IHRoZSBmaWxlIHBvaW50ZXIuICAqLwotCi0gIHBvc2l0aW9uID0gYmZkX3RlbGwgKGFiZmQpOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3QtPmZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKGRlYnVnX3NlY3Rpb24sCi0JCSAgICBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3QpLCAxLCBhYmZkKQotCSAgIT0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWN0KSkKLSAgICAgIHx8IGJmZF9zZWVrIChhYmZkLCBwb3NpdGlvbiwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBkZWJ1Z19zZWN0aW9uOwotfQotCi0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gYSBtYWxsb2MnZCBjb3B5IG9mICduYW1lJy4gICduYW1lJyBtYXkgbm90IGJlCi0gICBcMC10ZXJtaW5hdGVkLCBidXQgd2lsbCBub3QgZXhjZWVkICdtYXhsZW4nIGNoYXJhY3RlcnMuICBUaGUgY29weSAqd2lsbCoKLSAgIGJlIFwwLXRlcm1pbmF0ZWQuICAqLwotc3RhdGljIGNoYXIgKgotY29weV9uYW1lIChhYmZkLCBuYW1lLCBtYXhsZW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IG1heGxlbjsKLXsKLSAgaW50IGxlbjsKLSAgY2hhciAqbmV3bmFtZTsKLQotICBmb3IgKGxlbiA9IDA7IGxlbiA8IG1heGxlbjsgKytsZW4pCi0gICAgewotICAgICAgaWYgKG5hbWVbbGVuXSA9PSAnXDAnKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKChuZXduYW1lID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBsZW4gKyAxKSkgPT0gTlVMTCkKLSAgICByZXR1cm4gKE5VTEwpOwotICBzdHJuY3B5IChuZXduYW1lLCBuYW1lLCBsZW4pOwotICBuZXduYW1lW2xlbl0gPSAnXDAnOwotICByZXR1cm4gbmV3bmFtZTsKLX0KLQotLyogUmVhZCBpbiB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgc2l6ZV90IHNpemU7Ci0gIFBUUiBzeW1zOwotCi0gIGlmIChvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0KLSAgc2l6ZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzejsKLQotICBzeW1zID0gKFBUUikgYmZkX21hbGxvYyAoc2l6ZSk7Ci0gIGlmIChzeW1zID09IE5VTEwgJiYgc2l6ZSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zeW1fZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoc3ltcywgc2l6ZSwgMSwgYWJmZCkgIT0gc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoc3ltcyAhPSBOVUxMKQotCWZyZWUgKHN5bXMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSA9IHN5bXM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIHN0cmluZ3MuICBUaGUgc3RyaW5ncyBhcmUgbm90IGxvYWRlZCB1bnRpbAotICAgdGhleSBhcmUgbmVlZGVkLiAgVGhpcyBpcyBiZWNhdXNlIHdlIGhhdmUgbm8gc2ltcGxlIHdheSBvZgotICAgZGV0ZWN0aW5nIGEgbWlzc2luZyBzdHJpbmcgdGFibGUgaW4gYW4gYXJjaGl2ZS4gICovCi0KLWNvbnN0IGNoYXIgKgotX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgZXh0c3Ryc2l6ZVtTVFJJTkdfU0laRV9TSVpFXTsKLSAgc2l6ZV90IHN0cnNpemU7Ci0gIGNoYXIgKnN0cmluZ3M7Ci0KLSAgaWYgKG9ial9jb2ZmX3N0cmluZ3MgKGFiZmQpICE9IE5VTEwpCi0gICAgcmV0dXJuIG9ial9jb2ZmX3N0cmluZ3MgKGFiZmQpOwotCi0gIGlmIChvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkKLQkJICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogYmZkX2NvZmZfc3ltZXN6IChhYmZkKSksCi0JCVNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotICAgIAotICBpZiAoYmZkX3JlYWQgKGV4dHN0cnNpemUsIHNpemVvZiBleHRzdHJzaXplLCAxLCBhYmZkKSAhPSBzaXplb2YgZXh0c3Ryc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIC8qIFRoZXJlIGlzIG5vIHN0cmluZyB0YWJsZS4gICovCi0gICAgICBzdHJzaXplID0gU1RSSU5HX1NJWkVfU0laRTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWYgU1RSSU5HX1NJWkVfU0laRSA9PSA0Ci0gICAgICBzdHJzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXh0c3Ryc2l6ZSk7Ci0jZWxzZQotICNlcnJvciBDaGFuZ2UgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKHN0cnNpemUgPCBTVFJJTkdfU0laRV9TSVpFKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogYmFkIHN0cmluZyB0YWJsZSBzaXplICVsdSIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkgKHVuc2lnbmVkIGxvbmcpIHN0cnNpemUpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgc3RyaW5ncyA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cnNpemUpOwotICBpZiAoc3RyaW5ncyA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChiZmRfcmVhZCAoc3RyaW5ncyArIFNUUklOR19TSVpFX1NJWkUsCi0JCXN0cnNpemUgLSBTVFJJTkdfU0laRV9TSVpFLCAxLCBhYmZkKQotICAgICAgIT0gc3Ryc2l6ZSAtIFNUUklOR19TSVpFX1NJWkUpCi0gICAgewotICAgICAgZnJlZSAoc3RyaW5ncyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgb2JqX2NvZmZfc3RyaW5ncyAoYWJmZCkgPSBzdHJpbmdzOwotCi0gIHJldHVybiBzdHJpbmdzOwotfQotCi0vKiBGcmVlIHVwIHRoZSBleHRlcm5hbCBzeW1ib2xzIGFuZCBzdHJpbmdzIHJlYWQgZnJvbSBhIENPRkYgZmlsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpICE9IE5VTEwKLSAgICAgICYmICEgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSkKLSAgICB7Ci0gICAgICBmcmVlIChvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSk7Ci0gICAgICBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSA9IE5VTEw7Ci0gICAgfQotICBpZiAob2JqX2NvZmZfc3RyaW5ncyAoYWJmZCkgIT0gTlVMTAotICAgICAgJiYgISBvYmpfY29mZl9rZWVwX3N0cmluZ3MgKGFiZmQpKQotICAgIHsKLSAgICAgIGZyZWUgKG9ial9jb2ZmX3N0cmluZ3MgKGFiZmQpKTsKLSAgICAgIG9ial9jb2ZmX3N0cmluZ3MgKGFiZmQpID0gTlVMTDsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgc3ltYm9sIHRhYmxlIGludG8gZnJlc2hseSBiZmRfYWxsb2NhdGVkIG1lbW9yeSwgc3dhcCBpdCwgYW5kCi0gICBrbml0IHRoZSBzeW1ib2wgbmFtZXMgaW50byBhIG5vcm1hbGl6ZWQgZm9ybS4gIEJ5IG5vcm1hbGl6ZWQgaGVyZSBJCi0gICBtZWFuIHRoYXQgYWxsIHN5bWJvbHMgaGF2ZSBhbiBuX29mZnNldCBwb2ludGVyIHRoYXQgcG9pbnRzIHRvIGEgbnVsbC0KLSAgIHRlcm1pbmF0ZWQgc3RyaW5nLiAgKi8KLQotY29tYmluZWRfZW50cnlfdHlwZSAqCi1jb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb21iaW5lZF9lbnRyeV90eXBlICppbnRlcm5hbDsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqaW50ZXJuYWxfcHRyOwotICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2xfcHRyOwotICBjb21iaW5lZF9lbnRyeV90eXBlICppbnRlcm5hbF9lbmQ7Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBjaGFyICpyYXdfc3JjOwotICBjaGFyICpyYXdfZW5kOwotICBjb25zdCBjaGFyICpzdHJpbmdfdGFibGUgPSBOVUxMOwotICBjaGFyICpkZWJ1Z19zZWN0aW9uID0gTlVMTDsKLSAgdW5zaWduZWQgbG9uZyBzaXplOwotCi0gIGlmIChvYmpfcmF3X3N5bWVudHMgKGFiZmQpICE9IE5VTEwpCi0gICAgcmV0dXJuIG9ial9yYXdfc3ltZW50cyAoYWJmZCk7Ci0KLSAgc2l6ZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHNpemVvZiAoY29tYmluZWRfZW50cnlfdHlwZSk7Ci0gIGludGVybmFsID0gKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gIGlmIChpbnRlcm5hbCA9PSBOVUxMICYmIHNpemUgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaW50ZXJuYWxfZW5kID0gaW50ZXJuYWwgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7Ci0KLSAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICByYXdfc3JjID0gKGNoYXIgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0KLSAgLyogbWFyayB0aGUgZW5kIG9mIHRoZSBzeW1ib2xzICovCi0gIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0gIHJhd19lbmQgPSAoY2hhciAqKSByYXdfc3JjICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6OwotCi0gIC8qIEZJWE1FIFNPTUVEQVkuICBBIHN0cmluZyB0YWJsZSBzaXplIG9mIHplcm8gaXMgdmVyeSB3ZWlyZCwgYnV0Ci0gICAgIHByb2JhYmx5IHBvc3NpYmxlLiAgSWYgb25lIHNob3dzIHVwLCBpdCB3aWxsIHByb2JhYmx5IGtpbGwgdXMuICAqLwotCi0gIC8qIFN3YXAgYWxsIHRoZSByYXcgZW50cmllcyAqLwotICBmb3IgKGludGVybmFsX3B0ciA9IGludGVybmFsOwotICAgICAgIHJhd19zcmMgPCByYXdfZW5kOwotICAgICAgIHJhd19zcmMgKz0gc3ltZXN6LCBpbnRlcm5hbF9wdHIrKykKLSAgICB7Ci0KLSAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIHJhd19zcmMsCi0JCQkgICAgKFBUUikgJiBpbnRlcm5hbF9wdHItPnUuc3ltZW50KTsKLSAgICAgIHN5bWJvbF9wdHIgPSBpbnRlcm5hbF9wdHI7Ci0KLSAgICAgIGZvciAoaSA9IDA7Ci0JICAgaSA8IHN5bWJvbF9wdHItPnUuc3ltZW50Lm5fbnVtYXV4OwotCSAgIGkrKykKLQl7Ci0JICBpbnRlcm5hbF9wdHIrKzsKLQkgIHJhd19zcmMgKz0gc3ltZXN6OwotCSAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGFiZmQsIChQVFIpIHJhd19zcmMsCi0JCQkJc3ltYm9sX3B0ci0+dS5zeW1lbnQubl90eXBlLAotCQkJCXN5bWJvbF9wdHItPnUuc3ltZW50Lm5fc2NsYXNzLAotCQkJCWksIHN5bWJvbF9wdHItPnUuc3ltZW50Lm5fbnVtYXV4LAotCQkJCSYoaW50ZXJuYWxfcHRyLT51LmF1eGVudCkpOwotCSAgY29mZl9wb2ludGVyaXplX2F1eCAoYWJmZCwgaW50ZXJuYWwsIHN5bWJvbF9wdHIsIGksCi0JCQkgICAgICAgaW50ZXJuYWxfcHRyKTsKLQl9Ci0gICAgfQotCi0gIC8qIEZyZWUgdGhlIHJhdyBzeW1ib2xzLCBidXQgbm90IHRoZSBzdHJpbmdzIChpZiB3ZSBoYXZlIHRoZW0pLiAgKi8KLSAgb2JqX2NvZmZfa2VlcF9zdHJpbmdzIChhYmZkKSA9IHRydWU7Ci0gIGlmICghIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGZvciAoaW50ZXJuYWxfcHRyID0gaW50ZXJuYWw7IGludGVybmFsX3B0ciA8IGludGVybmFsX2VuZDsKLSAgICAgICBpbnRlcm5hbF9wdHIrKykKLSAgICB7Ci0gICAgICBpZiAoaW50ZXJuYWxfcHRyLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUKLQkgICYmIGludGVybmFsX3B0ci0+dS5zeW1lbnQubl9udW1hdXggPiAwKQotCXsKLQkgIC8qIG1ha2UgYSBmaWxlIHN5bWJvbCBwb2ludCB0byB0aGUgbmFtZSBpbiB0aGUgYXV4ZW50LCBzaW5jZQotCSAgICAgdGhlIHRleHQgIi5maWxlIiBpcyByZWR1bmRhbnQgKi8KLQkgIGlmICgoaW50ZXJuYWxfcHRyICsgMSktPnUuYXV4ZW50LnhfZmlsZS54X24ueF96ZXJvZXMgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIHRoZSBmaWxlbmFtZSBpcyBhIGxvbmcgb25lLCBwb2ludCBpbnRvIHRoZSBzdHJpbmcgdGFibGUgKi8KLQkgICAgICBpZiAoc3RyaW5nX3RhYmxlID09IE5VTEwpCi0JCXsKLQkJICBzdHJpbmdfdGFibGUgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGFiZmQpOwotCQkgIGlmIChzdHJpbmdfdGFibGUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBOVUxMOwotCQl9Ci0KLQkgICAgICBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID0KLQkJKChsb25nKQotCQkgKHN0cmluZ190YWJsZQotCQkgICsgKGludGVybmFsX3B0ciArIDEpLT51LmF1eGVudC54X2ZpbGUueF9uLnhfb2Zmc2V0KSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIG9yZGluYXJ5IHNob3J0IGZpbGVuYW1lLCBwdXQgaW50byBtZW1vcnkgYW55d2F5ICovCi0JICAgICAgaWYgKGludGVybmFsX3B0ci0+dS5zeW1lbnQubl9udW1hdXggPiAxCi0JCSAgJiYgY29mZl9kYXRhIChhYmZkKS0+cGUpCi0JCXsKLQkJICBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID0gKGxvbmcpCi0JCSAgICBjb3B5X25hbWUgKGFiZmQsIChpbnRlcm5hbF9wdHIgKyAxKS0+dS5hdXhlbnQueF9maWxlLnhfZm5hbWUsCi0JCQkgICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5uX251bWF1eCAqIHN5bWVzeik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID0gKGxvbmcpCi0JCSAgICBjb3B5X25hbWUgKGFiZmQsIChpbnRlcm5hbF9wdHIgKyAxKS0+dS5hdXhlbnQueF9maWxlLnhfZm5hbWUsCi0JCQkgICAgICAgRklMTk1MRU4pOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSAic2hvcnQiIG5hbWUuICBNYWtlIGl0IGxvbmcuICAqLwotCSAgICAgIHVuc2lnbmVkIGxvbmcgaSA9IDA7Ci0JICAgICAgY2hhciAqbmV3c3RyaW5nID0gTlVMTDsKLQotCSAgICAgIC8qIGZpbmQgdGhlIGxlbmd0aCBvZiB0aGlzIHN0cmluZyB3aXRob3V0IHdhbGtpbmcgaW50byBtZW1vcnkKLQkgICAgICAgICB0aGF0IGlzbid0IG91cnMuICAqLwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpCi0JCXsKLQkJICBpZiAoaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uYW1lW2ldID09ICdcMCcpCi0JCSAgICB7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQkJLyogaWYgZW5kIG9mIHN0cmluZyAqLwotCQl9CQkvKiBwb3NzaWJsZSBsZW5ndGhzIG9mIHRoaXMgc3RyaW5nLiAqLwotCi0JICAgICAgaWYgKChuZXdzdHJpbmcgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsICsraSkpID09IE5VTEwpCi0JCXJldHVybiAoTlVMTCk7Ci0JICAgICAgbWVtc2V0IChuZXdzdHJpbmcsIDAsIGkpOwotCSAgICAgIHN0cm5jcHkgKG5ld3N0cmluZywgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uYW1lLCBpIC0gMSk7Ci0JICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9IChsb25nIGludCkgbmV3c3RyaW5nOwotCSAgICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID09IDApCi0JICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPSAobG9uZyBpbnQpICIiOwotCSAgZWxzZSBpZiAoIWJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgKGFiZmQsICZpbnRlcm5hbF9wdHItPnUuc3ltZW50KSkKLQkgICAgewotCSAgICAgIC8qIExvbmcgbmFtZSBhbHJlYWR5LiAgUG9pbnQgc3ltYm9sIGF0IHRoZSBzdHJpbmcgaW4gdGhlCi0gICAgICAgICAgICAgICAgIHRhYmxlLiAgKi8KLQkgICAgICBpZiAoc3RyaW5nX3RhYmxlID09IE5VTEwpCi0JCXsKLQkJICBzdHJpbmdfdGFibGUgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGFiZmQpOwotCQkgIGlmIChzdHJpbmdfdGFibGUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBOVUxMOwotCQl9Ci0JICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9Ci0JCSgobG9uZyBpbnQpCi0JCSAoc3RyaW5nX3RhYmxlCi0JCSAgKyBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0KSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIExvbmcgbmFtZSBpbiBkZWJ1ZyBzZWN0aW9uLiAgVmVyeSBzaW1pbGFyLiAgKi8KLQkgICAgICBpZiAoZGVidWdfc2VjdGlvbiA9PSBOVUxMKQotCQlkZWJ1Z19zZWN0aW9uID0gYnVpbGRfZGVidWdfc2VjdGlvbiAoYWJmZCk7Ci0JICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9IChsb25nIGludCkKLQkJKGRlYnVnX3NlY3Rpb24gKyBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0KTsKLQkgICAgfQotCX0KLSAgICAgIGludGVybmFsX3B0ciArPSBpbnRlcm5hbF9wdHItPnUuc3ltZW50Lm5fbnVtYXV4OwotICAgIH0KLQotICBvYmpfcmF3X3N5bWVudHMgKGFiZmQpID0gaW50ZXJuYWw7Ci0gIEJGRF9BU1NFUlQgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKQotCSAgICAgID09ICh1bnNpZ25lZCBpbnQpIChpbnRlcm5hbF9wdHIgLSBpbnRlcm5hbCkpOwotCi0gIHJldHVybiAoaW50ZXJuYWwpOwotfQkJCQkvKiBjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYigpICovCi0KLWxvbmcKLWNvZmZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLWFzeW1ib2wgKgotY29mZl9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb2ZmX3N5bWJvbF90eXBlICpuZXcgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoY29mZl9zeW1ib2xfdHlwZSkpOwotICBpZiAobmV3ID09IE5VTEwpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgbWVtc2V0IChuZXcsIDAsIHNpemVvZiAqbmV3KTsKLSAgbmV3LT5zeW1ib2wuc2VjdGlvbiA9IDA7Ci0gIG5ldy0+bmF0aXZlID0gMDsKLSAgbmV3LT5saW5lbm8gPSAoYWxlbnQgKikgTlVMTDsKLSAgbmV3LT5kb25lX2xpbmVubyA9IGZhbHNlOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuICZuZXctPnN5bWJvbDsKLX0KLQotLyogTWFrZSBhIGRlYnVnZ2luZyBzeW1ib2wuICAqLwotCi1hc3ltYm9sICoKLWNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sIChhYmZkLCBwdHIsIHN6KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBwdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc3o7Ci17Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKm5ldyA9IChjb2ZmX3N5bWJvbF90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChjb2ZmX3N5bWJvbF90eXBlKSk7Ci0gIGlmIChuZXcgPT0gTlVMTCkKLSAgICByZXR1cm4gKE5VTEwpOwotICAvKiBAQCBUaGUgMTAgaXMgYSBndWVzcyBhdCBhIHBsYXVzaWJsZSBtYXhpbXVtIG51bWJlciBvZiBhdXggZW50cmllcwotICAgICAoYnV0IHNob3VsZG4ndCBiZSBhIGNvbnN0YW50KS4gICovCi0gIG5ldy0+bmF0aXZlID0gKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChjb21iaW5lZF9lbnRyeV90eXBlKSAqIDEwKTsKLSAgaWYgKCFuZXctPm5hdGl2ZSkKLSAgICByZXR1cm4gKE5VTEwpOwotICBuZXctPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgbmV3LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotICBuZXctPmxpbmVubyA9IChhbGVudCAqKSBOVUxMOwotICBuZXctPmRvbmVfbGluZW5vID0gZmFsc2U7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi0vKkFSR1NVU0VEICovCi12b2lkCi1jb2ZmX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLSAgaWYgKGNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSAhPSBOVUxMCi0gICAgICAmJiBjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUtPmZpeF92YWx1ZSkKLSAgICB7Ci0gICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpwc3ltOwotCi0gICAgICBwc3ltID0gKChjb21iaW5lZF9lbnRyeV90eXBlICopCi0JICAgICAgY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlKTsKLSAgICAgIHJldC0+dmFsdWUgPSAoYmZkX3ZtYSkgKHBzeW0gLSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKTsKLSAgICB9Ci19Ci0KLS8qIFJldHVybiB0aGUgQ09GRiBzeW1lbnQgZm9yIGEgc3ltYm9sLiAgKi8KLQotYm9vbGVhbgotYmZkX2NvZmZfZ2V0X3N5bWVudCAoYWJmZCwgc3ltYm9sLCBwc3ltZW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqcHN5bWVudDsKLXsKLSAgY29mZl9zeW1ib2xfdHlwZSAqY3N5bTsKLQotICBjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltYm9sKTsKLSAgaWYgKGNzeW0gPT0gTlVMTCB8fCBjc3ltLT5uYXRpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAqcHN5bWVudCA9IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQ7Ci0KLSAgaWYgKGNzeW0tPm5hdGl2ZS0+Zml4X3ZhbHVlKQotICAgIHBzeW1lbnQtPm5fdmFsdWUgPSAoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgcHN5bWVudC0+bl92YWx1ZQotCQkJLSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKTsKLQotICAvKiBGSVhNRTogV2Ugc2hvdWxkIGhhbmRsZSBmaXhfbGluZSBoZXJlLiAgKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBDT0ZGIGF1eGVudCBmb3IgYSBzeW1ib2wuICAqLwotCi1ib29sZWFuCi1iZmRfY29mZl9nZXRfYXV4ZW50IChhYmZkLCBzeW1ib2wsIGluZHgsIHBhdXhlbnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBpbnQgaW5keDsKLSAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICpwYXV4ZW50OwotewotICBjb2ZmX3N5bWJvbF90eXBlICpjc3ltOwotICBjb21iaW5lZF9lbnRyeV90eXBlICplbnQ7Ci0KLSAgY3N5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bWJvbCk7Ci0KLSAgaWYgKGNzeW0gPT0gTlVMTAotICAgICAgfHwgY3N5bS0+bmF0aXZlID09IE5VTEwKLSAgICAgIHx8IGluZHggPj0gY3N5bS0+bmF0aXZlLT51LnN5bWVudC5uX251bWF1eCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlbnQgPSBjc3ltLT5uYXRpdmUgKyBpbmR4ICsgMTsKLQotICAqcGF1eGVudCA9IGVudC0+dS5hdXhlbnQ7Ci0KLSAgaWYgKGVudC0+Zml4X3RhZykKLSAgICBwYXV4ZW50LT54X3N5bS54X3RhZ25keC5sID0KLSAgICAgICgoY29tYmluZWRfZW50cnlfdHlwZSAqKSBwYXV4ZW50LT54X3N5bS54X3RhZ25keC5wCi0gICAgICAgLSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKTsKLQotICBpZiAoZW50LT5maXhfZW5kKQotICAgIHBhdXhlbnQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPQotICAgICAgKChjb21iaW5lZF9lbnRyeV90eXBlICopIHBhdXhlbnQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LnAKLSAgICAgICAtIG9ial9yYXdfc3ltZW50cyAoYWJmZCkpOwotCi0gIGlmIChlbnQtPmZpeF9zY25sZW4pCi0gICAgcGF1eGVudC0+eF9jc2VjdC54X3Njbmxlbi5sID0KLSAgICAgICgoY29tYmluZWRfZW50cnlfdHlwZSAqKSBwYXV4ZW50LT54X2NzZWN0Lnhfc2NubGVuLnAKLSAgICAgICAtIG9ial9yYXdfc3ltZW50cyAoYWJmZCkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQcmludCBvdXQgaW5mb3JtYXRpb24gYWJvdXQgQ09GRiBzeW1ib2wuICAqLwotCi12b2lkCi1jb2ZmX3ByaW50X3N5bWJvbCAoYWJmZCwgZmlsZXAsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlcDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgZmlsZXA7Ci0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiY29mZiAlcyAlcyIsCi0JICAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSA/ICJuIiA6ICJnIiwKLQkgICAgICAgY29mZnN5bWJvbCAoc3ltYm9sKS0+bGluZW5vID8gImwiIDogIiAiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIGlmIChjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUpCi0JewotCSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JICB1bnNpZ25lZCBpbnQgYXV4OwotCSAgY29tYmluZWRfZW50cnlfdHlwZSAqY29tYmluZWQgPSBjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmU7Ci0JICBjb21iaW5lZF9lbnRyeV90eXBlICpyb290ID0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKTsKLQkgIHN0cnVjdCBsaW5lbm9fY2FjaGVfZW50cnkgKmwgPSBjb2Zmc3ltYm9sIChzeW1ib2wpLT5saW5lbm87Ci0KLQkgIGZwcmludGYgKGZpbGUsICJbJTNsZF0iLCAobG9uZykgKGNvbWJpbmVkIC0gcm9vdCkpOwotCi0JICBpZiAoISBjb21iaW5lZC0+Zml4X3ZhbHVlKQotCSAgICB2YWwgPSAodW5zaWduZWQgbG9uZykgY29tYmluZWQtPnUuc3ltZW50Lm5fdmFsdWU7Ci0JICBlbHNlCi0JICAgIHZhbCA9ICgodW5zaWduZWQgbG9uZykKLQkJICAgKChjb21iaW5lZF9lbnRyeV90eXBlICopIGNvbWJpbmVkLT51LnN5bWVudC5uX3ZhbHVlCi0JCSAgICAtIHJvb3QpKTsKLQotCSAgZnByaW50ZiAoZmlsZSwKLQkJICAgIihzZWMgJTJkKShmbCAweCUwMngpKHR5ICUzeCkoc2NsICUzZCkgKG54ICVkKSAweCUwOGx4ICVzIiwKLQkJICAgY29tYmluZWQtPnUuc3ltZW50Lm5fc2NudW0sCi0JCSAgIGNvbWJpbmVkLT51LnN5bWVudC5uX2ZsYWdzLAotCQkgICBjb21iaW5lZC0+dS5zeW1lbnQubl90eXBlLAotCQkgICBjb21iaW5lZC0+dS5zeW1lbnQubl9zY2xhc3MsCi0JCSAgIGNvbWJpbmVkLT51LnN5bWVudC5uX251bWF1eCwKLQkJICAgdmFsLAotCQkgICBzeW1ib2wtPm5hbWUpOwotCi0JICBmb3IgKGF1eCA9IDA7IGF1eCA8IGNvbWJpbmVkLT51LnN5bWVudC5uX251bWF1eDsgYXV4KyspCi0JICAgIHsKLQkgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXhwID0gY29tYmluZWQgKyBhdXggKyAxOwotCSAgICAgIGxvbmcgdGFnbmR4OwotCi0JICAgICAgaWYgKGF1eHAtPmZpeF90YWcpCi0JCXRhZ25keCA9IGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LnAgLSByb290OwotCSAgICAgIGVsc2UKLQkJdGFnbmR4ID0gYXV4cC0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgubDsKLQotCSAgICAgIGZwcmludGYgKGZpbGUsICJcbiIpOwotCi0JICAgICAgaWYgKGJmZF9jb2ZmX3ByaW50X2F1eCAoYWJmZCwgZmlsZSwgcm9vdCwgY29tYmluZWQsIGF1eHAsIGF1eCkpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgc3dpdGNoIChjb21iaW5lZC0+dS5zeW1lbnQubl9zY2xhc3MpCi0JCXsKLQkJY2FzZSBDX0ZJTEU6Ci0JCSAgZnByaW50ZiAoZmlsZSwgIkZpbGUgIik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBDX1NUQVQ6Ci0JCSAgaWYgKGNvbWJpbmVkLT51LnN5bWVudC5uX3R5cGUgPT0gVF9OVUxMKQotCQkgICAgLyogcHJvYmFibHkgYSBzZWN0aW9uIHN5bWJvbD8gKi8KLQkJICAgIHsKLQkJICAgICAgZnByaW50ZiAoZmlsZSwgIkFVWCBzY25sZW4gMHglbHggbnJlbG9jICVkIG5sbm5vICVkIiwKLQkJCSAgICAgICAobG9uZykgYXV4cC0+dS5hdXhlbnQueF9zY24ueF9zY25sZW4sCi0JCQkgICAgICAgYXV4cC0+dS5hdXhlbnQueF9zY24ueF9ucmVsb2MsCi0JCQkgICAgICAgYXV4cC0+dS5hdXhlbnQueF9zY24ueF9ubGlubm8pOwotCQkgICAgICBpZiAoYXV4cC0+dS5hdXhlbnQueF9zY24ueF9jaGVja3N1bSAhPSAwCi0JCQkgIHx8IGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfYXNzb2NpYXRlZCAhPSAwCi0JCQkgIHx8IGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfY29tZGF0ICE9IDApCi0JCQlmcHJpbnRmIChmaWxlLCAiIGNoZWNrc3VtIDB4JWx4IGFzc29jICVkIGNvbWRhdCAlZCIsCi0JCQkJIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfY2hlY2tzdW0sCi0JCQkJIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfYXNzb2NpYXRlZCwKLQkJCQkgYXV4cC0+dS5hdXhlbnQueF9zY24ueF9jb21kYXQpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICAvKiBlbHNlIGZhbGwgdGhyb3VnaCAqLwotCi0JCWRlZmF1bHQ6Ci0JCSAgZnByaW50ZiAoZmlsZSwgIkFVWCBsbm5vICVkIHNpemUgMHgleCB0YWduZHggJWxkIiwKLQkJCSAgIGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vLAotCQkJICAgYXV4cC0+dS5hdXhlbnQueF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUsCi0JCQkgICB0YWduZHgpOwotCQkgIGlmIChhdXhwLT5maXhfZW5kKQotCQkgICAgZnByaW50ZiAoZmlsZSwgIiBlbmRuZHggJWxkIiwKLQkJCSAgICAgKChsb25nKQotCQkJICAgICAgKGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LnAKLQkJCSAgICAgICAtIHJvb3QpKSk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAobCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKGZpbGUsICJcbiVzIDoiLCBsLT51LnN5bS0+bmFtZSk7Ci0JICAgICAgbCsrOwotCSAgICAgIHdoaWxlIChsLT5saW5lX251bWJlcikKLQkJewotCQkgIGZwcmludGYgKGZpbGUsICJcbiU0ZCA6IDB4JWx4IiwKLQkJCSAgIGwtPmxpbmVfbnVtYmVyLAotCQkJICAgKCh1bnNpZ25lZCBsb25nKQotCQkJICAgIChsLT51Lm9mZnNldCArIHN5bWJvbC0+c2VjdGlvbi0+dm1hKSkpOwotCQkgIGwrKzsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7Ci0JICBmcHJpbnRmIChmaWxlLCAiICUtNXMgJXMgJXMgJXMiLAotCQkgICBzeW1ib2wtPnNlY3Rpb24tPm5hbWUsCi0JCSAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSA/ICJuIiA6ICJnIiwKLQkJICAgY29mZnN5bWJvbCAoc3ltYm9sKS0+bGluZW5vID8gImwiIDogIiAiLAotCQkgICBzeW1ib2wtPm5hbWUpOwotCX0KLSAgICB9Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIG5hbWUgaW1wbGllcyBhIGxvY2FsIHN5bWJvbC4gIEluIENPRkYsCi0gICBsb2NhbCBzeW1ib2xzIGdlbmVyYWxseSBzdGFydCB3aXRoIGBgLkwnJy4gIE1vc3QgdGFyZ2V0cyB1c2UgdGhpcwotICAgZnVuY3Rpb24gZm9yIHRoZSBpc19sb2NhbF9sYWJlbF9uYW1lIGVudHJ5IHBvaW50LCBidXQgc29tZSBtYXkKLSAgIG92ZXJyaWRlIGl0LiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJ0wnOwotfQotCi0vKiBQcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiwgY2FsY3VsYXRlCi0gICBhbmQgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIGxpbmUgbmVhcmVzdCB0byB0aGUKLSAgIHdhbnRlZCBsb2NhdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotY29mZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlbmFtZV9wdHIsCi0JCQlmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKLXsKLSAgYm9vbGVhbiBmb3VuZDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBsaW5lX2Jhc2U7Ci0gIGNvZmZfZGF0YV90eXBlICpjb2YgPSBjb2ZmX2RhdGEgKGFiZmQpOwotICAvKiBSdW4gdGhyb3VnaCB0aGUgcmF3IHN5bWVudHMgaWYgYXZhaWxhYmxlICovCi0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnA7Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnBlbmQ7Ci0gIGFsZW50ICpsOwotICBzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICpzZWNfZGF0YTsKLQotICAvKiBCZWZvcmUgbG9va2luZyB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUsIHRyeSB0byB1c2UgYSAuc3RhYgotICAgICBzZWN0aW9uIHRvIGZpbmQgdGhlIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKCEgX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHN5bWJvbHMsIHNlY3Rpb24sIG9mZnNldCwKLQkJCQkJICAgICAmZm91bmQsIGZpbGVuYW1lX3B0ciwKLQkJCQkJICAgICBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0ciwKLQkJCQkJICAgICAmY29mZl9kYXRhIChhYmZkKS0+bGluZV9pbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChmb3VuZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAqZmlsZW5hbWVfcHRyID0gMDsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSAwOwotICAqbGluZV9wdHIgPSAwOwotCi0gIC8qIERvbid0IHRyeSBhbmQgZmluZCBsaW5lIG51bWJlcnMgaW4gYSBub24gY29mZiBmaWxlICovCi0gIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoY29mID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEZpbmQgdGhlIGZpcnN0IENfRklMRSBzeW1ib2wuICAqLwotICBwID0gY29mLT5yYXdfc3ltZW50czsKLSAgaWYgKCFwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwZW5kID0gcCArIGNvZi0+cmF3X3N5bWVudF9jb3VudDsKLSAgd2hpbGUgKHAgPCBwZW5kKQotICAgIHsKLSAgICAgIGlmIChwLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JYnJlYWs7Ci0gICAgICBwICs9IDEgKyBwLT51LnN5bWVudC5uX251bWF1eDsKLSAgICB9Ci0KLSAgaWYgKHAgPCBwZW5kKQotICAgIHsKLSAgICAgIGJmZF92bWEgc2VjX3ZtYTsKLSAgICAgIGJmZF92bWEgbWF4ZGlmZjsKLQotICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSBDX0ZJTEUgc3ltYm9scyB0byBmaW5kIHRoZSBiZXN0IG9uZS4gICovCi0gICAgICBzZWNfdm1hID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0gICAgICAqZmlsZW5hbWVfcHRyID0gKGNoYXIgKikgcC0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQ7Ci0gICAgICBtYXhkaWZmID0gKGJmZF92bWEpIDAgLSAoYmZkX3ZtYSkgMTsKLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnAyOwotCi0JICBmb3IgKHAyID0gcCArIDEgKyBwLT51LnN5bWVudC5uX251bWF1eDsKLQkgICAgICAgcDIgPCBwZW5kOwotCSAgICAgICBwMiArPSAxICsgcDItPnUuc3ltZW50Lm5fbnVtYXV4KQotCSAgICB7Ci0JICAgICAgaWYgKHAyLT51LnN5bWVudC5uX3NjbnVtID4gMAotCQkgICYmIChzZWN0aW9uCi0JCSAgICAgID09IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwKLQkJCQkJCSAgICAgIHAyLT51LnN5bWVudC5uX3NjbnVtKSkpCi0JCWJyZWFrOwotCSAgICAgIGlmIChwMi0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQotCQl7Ci0JCSAgcDIgPSBwZW5kOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKHAyIDwgcGVuZAotCSAgICAgICYmIG9mZnNldCArIHNlY192bWEgPj0gKGJmZF92bWEpIHAyLT51LnN5bWVudC5uX3ZhbHVlCi0JICAgICAgJiYgb2Zmc2V0ICsgc2VjX3ZtYSAtIChiZmRfdm1hKSBwMi0+dS5zeW1lbnQubl92YWx1ZSA8IG1heGRpZmYpCi0JICAgIHsKLQkgICAgICAqZmlsZW5hbWVfcHRyID0gKGNoYXIgKikgcC0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQ7Ci0JICAgICAgbWF4ZGlmZiA9IG9mZnNldCArIHNlY192bWEgLSBwMi0+dS5zeW1lbnQubl92YWx1ZTsKLQkgICAgfQotCi0JICAvKiBBdm9pZCBlbmRsZXNzIGxvb3BzIG9uIGVycm9uZW91cyBmaWxlcyBieSBlbnN1cmluZyB0aGF0Ci0JICAgICB3ZSBhbHdheXMgbW92ZSBmb3J3YXJkIGluIHRoZSBmaWxlLiAgKi8KLQkgIGlmIChwIC0gY29mLT5yYXdfc3ltZW50cyA+PSBwLT51LnN5bWVudC5uX3ZhbHVlKQotCSAgICBicmVhazsKLQotCSAgcCA9IGNvZi0+cmF3X3N5bWVudHMgKyBwLT51LnN5bWVudC5uX3ZhbHVlOwotCSAgaWYgKHAgPiBwZW5kIHx8IHAtPnUuc3ltZW50Lm5fc2NsYXNzICE9IENfRklMRSkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgd2FuZGVyIHRob3VnaCB0aGUgcmF3IGxpbmVudW1iZXJzIG9mIHRoZSBzZWN0aW9uICovCi0gIC8qIElmIHdlIGhhdmUgYmVlbiBjYWxsZWQgb24gdGhpcyBzZWN0aW9uIGJlZm9yZSwgYW5kIHRoZSBvZmZzZXQgd2UKLSAgICAgd2FudCBpcyBmdXJ0aGVyIGRvd24gdGhlbiB3ZSBjYW4gcHJpbWUgdGhlIGxvb2t1cCBsb29wLiAgKi8KLSAgc2VjX2RhdGEgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbik7Ci0gIGlmIChzZWNfZGF0YSAhPSBOVUxMCi0gICAgICAmJiBzZWNfZGF0YS0+aSA+IDAKLSAgICAgICYmIG9mZnNldCA+PSBzZWNfZGF0YS0+b2Zmc2V0KQotICAgIHsKLSAgICAgIGkgPSBzZWNfZGF0YS0+aTsKLSAgICAgICpmdW5jdGlvbm5hbWVfcHRyID0gc2VjX2RhdGEtPmZ1bmN0aW9uOwotICAgICAgbGluZV9iYXNlID0gc2VjX2RhdGEtPmxpbmVfYmFzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpID0gMDsKLSAgICAgIGxpbmVfYmFzZSA9IDA7Ci0gICAgfQotCi0gIGlmIChzZWN0aW9uLT5saW5lbm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBsID0gJnNlY3Rpb24tPmxpbmVub1tpXTsKLQotICAgICAgZm9yICg7IGkgPCBzZWN0aW9uLT5saW5lbm9fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAobC0+bGluZV9udW1iZXIgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEdldCB0aGUgc3ltYm9sIHRoaXMgbGluZSBudW1iZXIgcG9pbnRzIGF0ICovCi0JICAgICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZiA9IChjb2ZmX3N5bWJvbF90eXBlICopIChsLT51LnN5bSk7Ci0JICAgICAgaWYgKGNvZmYtPnN5bWJvbC52YWx1ZSA+IG9mZnNldCkKLQkJYnJlYWs7Ci0JICAgICAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBjb2ZmLT5zeW1ib2wubmFtZTsKLQkgICAgICBpZiAoY29mZi0+bmF0aXZlKQotCQl7Ci0JCSAgY29tYmluZWRfZW50cnlfdHlwZSAqcyA9IGNvZmYtPm5hdGl2ZTsKLQkJICBzID0gcyArIDEgKyBzLT51LnN5bWVudC5uX251bWF1eDsKLQotCQkgIC8qIEluIFhDT0ZGIGEgZGVidWdnaW5nIHN5bWJvbCBjYW4gZm9sbG93IHRoZQotCQkgICAgIGZ1bmN0aW9uIHN5bWJvbC4gICovCi0JCSAgaWYgKHMtPnUuc3ltZW50Lm5fc2NudW0gPT0gTl9ERUJVRykKLQkJICAgIHMgPSBzICsgMSArIHMtPnUuc3ltZW50Lm5fbnVtYXV4OwotCi0JCSAgLyogUyBzaG91bGQgbm93IHBvaW50IHRvIHRoZSAuYmYgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQkJICBpZiAocy0+dS5zeW1lbnQubl9udW1hdXgpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBsaW5lbnVtYmVyIGlzIHN0b3JlZCBpbiB0aGUgYXV4ZW50LiAgKi8KLQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphID0gJigocyArIDEpLT51LmF1eGVudCk7Ci0JCSAgICAgIGxpbmVfYmFzZSA9IGEtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vOwotCQkgICAgICAqbGluZV9wdHIgPSBsaW5lX2Jhc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGwtPnUub2Zmc2V0ID4gb2Zmc2V0KQotCQlicmVhazsKLQkgICAgICAqbGluZV9wdHIgPSBsLT5saW5lX251bWJlciArIGxpbmVfYmFzZSAtIDE7Ci0JICAgIH0KLQkgIGwrKzsKLQl9Ci0gICAgfQotCi0gIC8qIENhY2hlIHRoZSByZXN1bHRzIGZvciB0aGUgbmV4dCBjYWxsLiAgKi8KLSAgaWYgKHNlY19kYXRhID09IE5VTEwgJiYgc2VjdGlvbi0+b3duZXIgPT0gYWJmZCkKLSAgICB7Ci0gICAgICBzZWN0aW9uLT51c2VkX2J5X2JmZCA9Ci0JKChQVFIpIGJmZF96YWxsb2MgKGFiZmQsCi0JCQkgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7Ci0gICAgICBzZWNfZGF0YSA9IChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkOwotICAgIH0KLSAgaWYgKHNlY19kYXRhICE9IE5VTEwpCi0gICAgewotICAgICAgc2VjX2RhdGEtPm9mZnNldCA9IG9mZnNldDsKLSAgICAgIHNlY19kYXRhLT5pID0gaTsKLSAgICAgIHNlY19kYXRhLT5mdW5jdGlvbiA9ICpmdW5jdGlvbm5hbWVfcHRyOwotICAgICAgc2VjX2RhdGEtPmxpbmVfYmFzZSA9IGxpbmVfYmFzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWludAotY29mZl9zaXplb2ZfaGVhZGVycyAoYWJmZCwgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiByZWxvYzsKLXsKLSAgc2l6ZV90IHNpemU7Ci0KLSAgaWYgKHJlbG9jID09IGZhbHNlKQotICAgIHsKLSAgICAgIHNpemUgPSBiZmRfY29mZl9maWxoc3ogKGFiZmQpICsgYmZkX2NvZmZfYW91dHN6IChhYmZkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaXplID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKLSAgICB9Ci0KLSAgc2l6ZSArPSBhYmZkLT5zZWN0aW9uX2NvdW50ICogYmZkX2NvZmZfc2NuaHN6IChhYmZkKTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qIENoYW5nZSB0aGUgY2xhc3Mgb2YgYSBjb2ZmIHN5bWJvbCBoZWxkIGJ5IEJGRC4gICovCi1ib29sZWFuCi1iZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzIChhYmZkLCBzeW1ib2wsIGNsYXNzKQotICAgICBiZmQgKiAgICAgICAgIGFiZmQ7Ci0gICAgIGFzeW1ib2wgKiAgICAgc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgIGNsYXNzOwotewotICBjb2ZmX3N5bWJvbF90eXBlICogY3N5bTsKLQotICBjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltYm9sKTsKLSAgaWYgKGNzeW0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZSBpZiAoY3N5bS0+bmF0aXZlID09IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhbiBhbGllbiBzeW1ib2wgd2hpY2ggbm8gbmF0aXZlIGNvZmYgYmFja2VuZCBkYXRhLgotCSBXZSBjaGVhdCBoZXJlIGJ5IGNyZWF0aW5nIGEgZmFrZSBuYXRpdmUgZW50cnkgZm9yIGl0IGFuZAotCSB0aGVuIGZpbGxpbmcgaW4gdGhlIGNsYXNzLiAgVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoYXQgaW4KLQkgY29mZl93cml0ZV9hbGllbl9zeW1ib2woKS4gICovCi0gICAgICAKLSAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiBuYXRpdmU7Ci0KLSAgICAgIG5hdGl2ZSA9IChjb21iaW5lZF9lbnRyeV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqIG5hdGl2ZSkpOwotICAgICAgaWYgKG5hdGl2ZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgbWVtc2V0IChuYXRpdmUsIDAsIHNpemVvZiAoKiBuYXRpdmUpKTsKLSAgICAgIAotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3R5cGUgICA9IFRfTlVMTDsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSBjbGFzczsKLSAgICAgIAotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQl7Ci0JICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX1VOREVGOwotCSAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlID0gc3ltYm9sLT52YWx1ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JewotCSAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9VTkRFRjsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IHN5bWJvbC0+dmFsdWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9Ci0JICAgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IChzeW1ib2wtPnZhbHVlCi0JCQkJICAgICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgaWYgKCEgb2JqX3BlIChhYmZkKSkKLQkgICAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIAotCSAgLyogQ29weSB0aGUgYW55IGZsYWdzIGZyb20gdGhlIHRoZSBmaWxlIGhlYWRlciBpbnRvIHRoZSBzeW1ib2wuCi0JICAgICBGSVhNRTogV2h5PyAgKi8KLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl9mbGFncyA9IGJmZF9hc3ltYm9sX2JmZCAoJiBjc3ltLT5zeW1ib2wpLT5mbGFnczsKLQl9Ci0gICAgICAKLSAgICAgIGNzeW0tPm5hdGl2ZSA9IG5hdGl2ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gY2xhc3M7Ci0gICAgfQotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KZGlmZiAtLWdpdCBhL2JmZC9jb2ZmbGluay5jIGIvYmZkL2NvZmZsaW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNTY4NjkuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmZsaW5rLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUyICswLDAgQEAKLS8qIENPRkYgc3BlY2lmaWMgbGlua2VyIGNvZGUuCi0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyIGNvZGUuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9saW5rX2FkZF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgY2hhciAqZG9yZXNfY29tIFBBUkFNUyAoKGNoYXIgKiwgYmZkICosIGludCkpOwotc3RhdGljIGNoYXIgKmdldF9uYW1lIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKikpOwotc3RhdGljIGludCBwcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQgbWFya19yZWxvY3MgUEFSQU1TICgoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGJmZCAqKSk7Ci0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPmluZHggPSAtMTsKLSAgICAgIHJldC0+dHlwZSA9IFRfTlVMTDsKLSAgICAgIHJldC0+Y2xhc3MgPSBDX05VTEw7Ci0gICAgICByZXQtPm51bWF1eCA9IDA7Ci0gICAgICByZXQtPmF1eGJmZCA9IE5VTEw7Ci0gICAgICByZXQtPmF1eCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogSW5pdGlhbGl6ZSBhIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci17Ci0gIHRhYmxlLT5zdGFiX2luZm8gPSBOVUxMOwotICByZXR1cm4gX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT5yb290LCBhYmZkLCBuZXdmdW5jKTsKLX0KLQotLyogQ3JlYXRlIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLV9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0IChyZXQsIGFiZmQsCi0JCQkJCV9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdDsKLX0KLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLV9iZmRfY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT50eXBlcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogR2l2ZW4gYSBDT0ZGIEJGRCwgYWRkIHN5bWJvbHMgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlIGFzCi0gICBhcHByb3ByaWF0ZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfb2JqZWN0OgotICAgICAgcmV0dXJuIGNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pOwotICAgIGNhc2UgYmZkX2FyY2hpdmU6Ci0gICAgICByZXR1cm4gKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLQkgICAgICAoYWJmZCwgaW5mbywgY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCkpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIEFkZCBzeW1ib2xzIGZyb20gYSBDT0ZGIG9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2hlY2sgYSBzaW5nbGUgYXJjaGl2ZSBlbGVtZW50IHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGluY2x1ZGUgaXQgaW4KLSAgIHRoZSBsaW5rLiAgKlBORUVERUQgaXMgc2V0IGFjY29yZGluZyB0byB3aGV0aGVyIHRoaXMgZWxlbWVudCBpcwotICAgbmVlZGVkIGluIHRoZSBsaW5rIG9yIG5vdC4gIFRoaXMgaXMgY2FsbGVkIHZpYQotICAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyAoYWJmZCwgaW5mbywgcG5lZWRlZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgqcG5lZWRlZCkKLSAgICB7Ci0gICAgICBpZiAoISBjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkgfHwgISAqcG5lZWRlZCkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHN5bWJvbHMgdG8gc2VlIGlmIHRoaXMgb2JqZWN0IGZpbGUgc2hvdWxkIGJlCi0gICBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgYm9vbGVhbiAoKnN5bV9pc19nbG9iYWwpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIGJmZF9ieXRlICplc3ltOwotICBiZmRfYnl0ZSAqZXN5bV9lbmQ7Ci0KLSAgKnBuZWVkZWQgPSBmYWxzZTsKLQotICBzeW1faXNfZ2xvYmFsID0gY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3ltX2lzX2dsb2JhbDsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3o7Ci0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSAmc3ltKTsKLQotICAgICAgaWYgKChzeW0ubl9zY2xhc3MgPT0gQ19FWFQKLQkgICB8fCBzeW0ubl9zY2xhc3MgPT0gQ19XRUFLRVhUCi0JICAgfHwgKG9ial9wZSAoYWJmZCkgJiYgc3ltLm5fc2NsYXNzID09IENfTlRfV0VBSykKLSNpZmRlZiBDX1NZU1RFTQotCSAgIHx8IHN5bS5uX3NjbGFzcyA9PSBDX1NZU1RFTQotI2VuZGlmCi0JICAgfHwgKHN5bV9pc19nbG9iYWwgJiYgKCpzeW1faXNfZ2xvYmFsKSAoYWJmZCwgJnN5bSkpKQotCSAgJiYgKHN5bS5uX3NjbnVtICE9IDAgfHwgc3ltLm5fdmFsdWUgIT0gMCkpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgLyogVGhpcyBzeW1ib2wgaXMgZXh0ZXJuYWxseSB2aXNpYmxlLCBhbmQgaXMgZGVmaW5lZCBieSB0aGlzCi0gICAgICAgICAgICAgb2JqZWN0IGZpbGUuICAqLwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCAmc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0JICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHN5bWJvbHMgdGhhdCBhcmUgY3VycmVudGx5Ci0JICAgICB1bmRlZmluZWQuICBJZiBhIHN5bWJvbCBpcyBjdXJyZW50bHkga25vd24gdG8gYmUgY29tbW9uLAotCSAgICAgQ09GRiBsaW5rZXJzIGRvIG5vdCBicmluZyBpbiBhbiBvYmplY3QgZmlsZSB3aGljaCBkZWZpbmVzCi0JICAgICBpdC4gICovCi0JICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGFiZmQsIG5hbWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgKnBuZWVkZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICBlc3ltICs9IChzeW0ubl9udW1hdXggKyAxKSAqIHN5bWVzejsKLSAgICB9Ci0KLSAgLyogV2UgZG8gbm90IG5lZWQgdGhpcyBvYmplY3QgZmlsZS4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYWxsIHRoZSBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBib29sZWFuICgqc3ltX2lzX2dsb2JhbCkgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotICBib29sZWFuIGtlZXBfc3ltczsKLSAgYm9vbGVhbiBkZWZhdWx0X2NvcHk7Ci0gIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgYmZkX2J5dGUgKmVzeW07Ci0gIGJmZF9ieXRlICplc3ltX2VuZDsKLQotICAvKiBLZWVwIHRoZSBzeW1ib2xzIGR1cmluZyB0aGlzIGZ1bmN0aW9uLCBpbiBjYXNlIHRoZSBsaW5rZXIgbmVlZHMKLSAgICAgdG8gcmVhZCB0aGUgZ2VuZXJpYyBzeW1ib2xzIGluIG9yZGVyIHRvIHJlcG9ydCBhbiBlcnJvciBtZXNzYWdlLiAgKi8KLSAga2VlcF9zeW1zID0gb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKTsKLSAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IHRydWU7Ci0KLSAgc3ltX2lzX2dsb2JhbCA9IGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N5bV9pc19nbG9iYWw7Ci0KLSAgaWYgKGluZm8tPmtlZXBfbWVtb3J5KQotICAgIGRlZmF1bHRfY29weSA9IGZhbHNlOwotICBlbHNlCi0gICAgZGVmYXVsdF9jb3B5ID0gdHJ1ZTsKLQotICBzeW1jb3VudCA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKLQotICAvKiBXZSBrZWVwIGEgbGlzdCBvZiB0aGUgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcyB0aGF0IGNvcnJlc3BvbmQKLSAgICAgdG8gcGFydGljdWxhciBzeW1ib2xzLiAgKi8KLSAgc3ltX2hhc2ggPSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKikKLQkgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgKChzaXplX3QpIHN5bWNvdW50Ci0JCQkgICogc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikpKSk7Ci0gIGlmIChzeW1faGFzaCA9PSBOVUxMICYmIHN5bWNvdW50ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIG9ial9jb2ZmX3N5bV9oYXNoZXMgKGFiZmQpID0gc3ltX2hhc2g7Ci0gIG1lbXNldCAoc3ltX2hhc2gsIDAsCi0JICAoc2l6ZV90KSBzeW1jb3VudCAqIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopKTsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBCRkRfQVNTRVJUIChzeW1lc3ogPT0gYmZkX2NvZmZfYXV4ZXN6IChhYmZkKSk7Ci0gIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIHN5bWNvdW50ICogc3ltZXN6OwotICB3aGlsZSAoZXN5bSA8IGVzeW1fZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotICAgICAgYm9vbGVhbiBjb3B5OwotCi0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXN5bSwgKFBUUikgJnN5bSk7Ci0KLSAgICAgIGlmIChzeW0ubl9zY2xhc3MgPT0gQ19FWFQKLQkgICB8fCBzeW0ubl9zY2xhc3MgPT0gQ19XRUFLRVhUCi0JICAgfHwgKG9ial9wZSAoYWJmZCkgJiYgc3ltLm5fc2NsYXNzID09IENfTlRfV0VBSykKLSNpZmRlZiBDX1NZU1RFTQotCSAgfHwgc3ltLm5fc2NsYXNzID09IENfU1lTVEVNCi0jZW5kaWYKLQkgIHx8IChzeW1faXNfZ2xvYmFsICYmICgqc3ltX2lzX2dsb2JhbCkgKGFiZmQsICZzeW0pKSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQkgIGZsYWd3b3JkIGZsYWdzOwotCSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0JICBiZmRfdm1hIHZhbHVlOwotCi0JICAvKiBUaGlzIHN5bWJvbCBpcyBleHRlcm5hbGx5IHZpc2libGUuICAqLwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCAmc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFdlIG11c3QgY29weSB0aGUgbmFtZSBpbnRvIG1lbW9yeSBpZiB3ZSBnb3QgaXQgZnJvbSB0aGUKLSAgICAgICAgICAgICBzeW1lbnQgaXRzZWxmLCByYXRoZXIgdGhhbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgIGNvcHkgPSBkZWZhdWx0X2NvcHk7Ci0JICBpZiAoc3ltLl9uLl9uX24uX25femVyb2VzICE9IDAKLQkgICAgICB8fCBzeW0uX24uX25fbi5fbl9vZmZzZXQgPT0gMCkKLQkgICAgY29weSA9IHRydWU7Ci0KLQkgIHZhbHVlID0gc3ltLm5fdmFsdWU7Ci0KLQkgIGlmIChzeW0ubl9zY251bSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHZhbHVlID09IDApCi0JCXsKLQkJICBmbGFncyA9IDA7Ci0JCSAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmbGFncyA9IEJTRl9HTE9CQUw7Ci0JCSAgc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZmxhZ3MgPSBCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTDsKLQkgICAgICBzZWN0aW9uID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChhYmZkLCBzeW0ubl9zY251bSk7Ci0JICAgICAgaWYgKCEgb2JqX3BlIChhYmZkKSkKLQkJdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgICB9Ci0KLQkgIGlmIChzeW0ubl9zY2xhc3MgPT0gQ19XRUFLRVhUCi0JICAgICAgfHwgKG9ial9wZSAoYWJmZCkgJiYgc3ltLm5fc2NsYXNzID09IENfTlRfV0VBSykpCi0JICAgIGZsYWdzID0gQlNGX1dFQUs7Ci0KLQkgIGlmICghIChiZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sCi0JCSAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLAotCQkgIChjb25zdCBjaGFyICopIE5VTEwsIGNvcHksIGZhbHNlLAotCQkgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgc3ltX2hhc2gpKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChzZWN0aW9uID09IGJmZF9jb21fc2VjdGlvbl9wdHIKLQkgICAgICAmJiAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JICAgICAgJiYgKCgqc3ltX2hhc2gpLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIKLQkJICA+IGJmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIgKGFiZmQpKSkKLQkgICAgKCpzeW1faGFzaCktPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlcgotCSAgICAgID0gYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlciAoYWJmZCk7Ci0KLQkgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF9nZXRfZmxhdm91ciAoYWJmZCkpCi0JICAgIHsKLQkgICAgICBpZiAoKCgqc3ltX2hhc2gpLT5jbGFzcyA9PSBDX05VTEwKLQkJICAgJiYgKCpzeW1faGFzaCktPnR5cGUgPT0gVF9OVUxMKQotCQkgIHx8IHN5bS5uX3NjbnVtICE9IDAKLQkJICB8fCAoc3ltLm5fdmFsdWUgIT0gMAotCQkgICAgICAmJiAoKnN5bV9oYXNoKS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICAmJiAoKnN5bV9oYXNoKS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JCXsKLQkJICAoKnN5bV9oYXNoKS0+Y2xhc3MgPSBzeW0ubl9zY2xhc3M7Ci0JCSAgaWYgKHN5bS5uX3R5cGUgIT0gVF9OVUxMKQotCQkgICAgewotCQkgICAgICBpZiAoKCpzeW1faGFzaCktPnR5cGUgIT0gVF9OVUxMCi0JCQkgICYmICgqc3ltX2hhc2gpLT50eXBlICE9IHN5bS5uX3R5cGUpCi0JCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCSAgKF8oIldhcm5pbmc6IHR5cGUgb2Ygc3ltYm9sIGAlcycgY2hhbmdlZCBmcm9tICVkIHRvICVkIGluICVzIiksCi0JCQkgICBuYW1lLCAoKnN5bV9oYXNoKS0+dHlwZSwgc3ltLm5fdHlwZSwKLQkJCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkJICAgICAgKCpzeW1faGFzaCktPnR5cGUgPSBzeW0ubl90eXBlOwotCQkgICAgfQotCQkgICgqc3ltX2hhc2gpLT5hdXhiZmQgPSBhYmZkOwotCQkgIGlmIChzeW0ubl9udW1hdXggIT0gMCkKLQkJICAgIHsKLQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphbGxvYzsKLQkJICAgICAgdW5zaWduZWQgaW50IGk7Ci0JCSAgICAgIGJmZF9ieXRlICplYXV4OwotCQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmlhdXg7Ci0KLQkJICAgICAgKCpzeW1faGFzaCktPm51bWF1eCA9IHN5bS5uX251bWF1eDsKLQkJICAgICAgYWxsb2MgPSAoKHVuaW9uIGludGVybmFsX2F1eGVudCAqKQotCQkJICAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJCQkgIChzeW0ubl9udW1hdXgKLQkJCQkJCSAgICogc2l6ZW9mICgqYWxsb2MpKSkpOwotCQkgICAgICBpZiAoYWxsb2MgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgICBmb3IgKGkgPSAwLCBlYXV4ID0gZXN5bSArIHN5bWVzeiwgaWF1eCA9IGFsbG9jOwotCQkJICAgaSA8IHN5bS5uX251bWF1eDsKLQkJCSAgIGkrKywgZWF1eCArPSBzeW1lc3osIGlhdXgrKykKLQkJCWJmZF9jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCAoUFRSKSBlYXV4LCBzeW0ubl90eXBlLAotCQkJCQkgICAgICBzeW0ubl9zY2xhc3MsIGksIHN5bS5uX251bWF1eCwKLQkJCQkJICAgICAgKFBUUikgaWF1eCk7Ci0JCSAgICAgICgqc3ltX2hhc2gpLT5hdXggPSBhbGxvYzsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBlc3ltICs9IChzeW0ubl9udW1hdXggKyAxKSAqIHN5bWVzejsKLSAgICAgIHN5bV9oYXNoICs9IHN5bS5uX251bWF1eCArIDE7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBub24tdHJhZGl0aW9uYWwsIG5vbi1yZWxvY2F0ZWFibGUgbGluaywgdHJ5IHRvCi0gICAgIG9wdGltaXplIHRoZSBoYW5kbGluZyBvZiBhbnkgLnN0YWIvLnN0YWJzdHIgc2VjdGlvbnMuICAqLwotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmICEgaW5mby0+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+cGVfb3B0aGRyLlNpemVPZlN0YWNrUmVzZXJ2ZSA9dmFsOwotCi0gICAgICBpZiAocHRyWzBdID09ICcsJykgCi0JewotCSAgaW50IHZhbCA9IHN0cnRvdWwgKHB0cisxLCAmcHRyLCAwKTsKLQkgIGlmIChoZWFwKQotCSAgICBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuU2l6ZU9mSGVhcENvbW1pdCA9dmFsOwotCSAgZWxzZQotCSAgICBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuU2l6ZU9mU3RhY2tDb21taXQgPXZhbDsKLQl9Ci0gICAgfQotICByZXR1cm4gcHRyOwotfQotCi1zdGF0aWMgY2hhciAqZ2V0X25hbWUocHRyLCBkc3QpCi1jaGFyICpwdHI7Ci1jaGFyICoqZHN0OwotewotICB3aGlsZSAoKnB0ciA9PSAnICcpCi0gICAgcHRyKys7Ci0gICpkc3QgPSBwdHI7Ci0gIHdoaWxlICgqcHRyICYmICpwdHIgIT0gJyAnKQotICAgIHB0cisrOwotICAqcHRyID0gMDsKLSAgcmV0dXJuIHB0cisxOwotfQotCi0vKiBQcm9jZXNzIGFueSBtYWdpYyBlbWJlZGRlZCBjb21tYW5kcyBpbiBhIHNlY3Rpb24gY2FsbGVkIC5kcmVjdHZlICovCi0JCQkKLXN0YXRpYyBpbnQKLXByb2Nlc3NfZW1iZWRkZWRfY29tbWFuZHMgKG91dHB1dF9iZmQsIGluZm8sICBhYmZkKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kcmVjdHZlIik7Ci0gIGNoYXIgKnM7Ci0gIGNoYXIgKmU7Ci0gIGNoYXIgKmNvcHk7Ci0gIGlmICghc2VjKSAKLSAgICByZXR1cm4gMTsKLSAgCi0gIGNvcHkgPSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzZWMtPl9yYXdfc2l6ZSk7Ci0gIGlmICghY29weSkgCi0gICAgcmV0dXJuIDA7Ci0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyhhYmZkLCBzZWMsIGNvcHksIDAsIHNlYy0+X3Jhd19zaXplKSkgCi0gICAgewotICAgICAgZnJlZSAoY29weSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGUgPSBjb3B5ICsgc2VjLT5fcmF3X3NpemU7Ci0gIGZvciAocyA9IGNvcHk7ICBzIDwgZSA7ICkgCi0gICAgewotICAgICAgaWYgKHNbMF0hPSAnLScpIHsKLQlzKys7Ci0JY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoc3RybmNtcCAocywiLWF0dHIiLCA1KSA9PSAwKQotCXsKLQkgIGNoYXIgKm5hbWU7Ci0JICBjaGFyICphdHRyaWJzOwotCSAgYXNlY3Rpb24gKmFzZWM7Ci0KLQkgIGludCBsb29wID0gMTsKLQkgIGludCBoYWRfd3JpdGUgPSAwOwotCSAgaW50IGhhZF9yZWFkID0gMDsKLQkgIGludCBoYWRfZXhlYz0gMDsKLQkgIGludCBoYWRfc2hhcmVkPSAwOwotCSAgcyArPSA1OwotCSAgcyA9IGdldF9uYW1lKHMsICZuYW1lKTsKLQkgIHMgPSBnZXRfbmFtZShzLCAmYXR0cmlicyk7Ci0JICB3aGlsZSAobG9vcCkgewotCSAgICBzd2l0Y2ggKCphdHRyaWJzKyspIAotCSAgICAgIHsKLQkgICAgICBjYXNlICdXJzoKLQkJaGFkX3dyaXRlID0gMTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAnUic6Ci0JCWhhZF9yZWFkID0gMTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAnUyc6Ci0JCWhhZF9zaGFyZWQgPSAxOwotCQlicmVhazsKLQkgICAgICBjYXNlICdYJzoKLQkJaGFkX2V4ZWMgPSAxOwotCQlicmVhazsKLQkgICAgICBkZWZhdWx0OgotCQlsb29wID0gMDsKLQkgICAgICB9Ci0JICB9Ci0JICBhc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCSAgaWYgKGFzZWMpIHsKLQkgICAgaWYgKGhhZF9leGVjKQotCSAgICAgIGFzZWMtPmZsYWdzIHw9IFNFQ19DT0RFOwotCSAgICBpZiAoIWhhZF93cml0ZSkKLQkgICAgICBhc2VjLT5mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0JICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywiLWhlYXAiLCA1KSA9PSAwKQotCXsKLQkgIHMgPSBkb3Jlc19jb20gKHMrNSwgb3V0cHV0X2JmZCwgMSk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywiLXN0YWNrIiwgNikgPT0gMCkKLQl7Ci0JICBzID0gZG9yZXNfY29tIChzKzYsIG91dHB1dF9iZmQsIDApOwotCX0KLSAgICAgIGVsc2UgCi0JcysrOwotICAgIH0KLSAgZnJlZSAoY29weSk7Ci0gIHJldHVybiAxOwotfQotCi0vKiBQbGFjZSBhIG1hcmtlciBhZ2FpbnN0IGFsbCBzeW1ib2xzIHdoaWNoIGFyZSB1c2VkIGJ5IHJlbG9jYXRpb25zLgotICAgVGhpcyBtYXJrZXIgY2FuIGJlIHBpY2tlZCB1cCBieSB0aGUgJ2RvIHdlIHNraXAgdGhpcyBzeW1ib2wgPycKLSAgIGxvb3AgaW4gX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKCkgYW5kIHVzZWQgdG8gcHJldmVudCBza2lwcGluZwotICAgdGhhdCBzeW1ib2wuIAotICAgKi8KLQotc3RhdGljIHZvaWQKLW1hcmtfcmVsb2NzIChmaW5mbywgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKglmaW5mbzsKLSAgICAgYmZkICogCQkJCWlucHV0X2JmZDsKLXsKLSAgYXNlY3Rpb24gKiBhOwotCi0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChpbnB1dF9iZmQpICYgSEFTX1NZTVMpID09IDApCi0gICAgcmV0dXJuOwotICAKLSAgZm9yIChhID0gaW5wdXRfYmZkLT5zZWN0aW9uczsgYSAhPSAoYXNlY3Rpb24gKikgTlVMTDsgYSA9IGEtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICoJaW50ZXJuYWxfcmVsb2NzOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICoJaXJlbDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqCWlyZWxlbmQ7Ci0KLSAgICAgIAotICAgICAgaWYgKChhLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCB8fCBhLT5yZWxvY19jb3VudCAgPCAxKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBSZWFkIGluIHRoZSByZWxvY3MuICAqLwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0JKGlucHV0X2JmZCwgYSwgZmFsc2UsCi0JIGZpbmZvLT5leHRlcm5hbF9yZWxvY3MsCi0JIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUsCi0JIChmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlCi0JICA/IChmaW5mby0+c2VjdGlvbl9pbmZvWyBhLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4IF0ucmVsb2NzICsgYS0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KQotCSAgOiBmaW5mby0+aW50ZXJuYWxfcmVsb2NzKQotCSk7Ci0gICAgICAKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgaXJlbCAgICAgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBpcmVsZW5kICA9IGlyZWwgKyBhLT5yZWxvY19jb3VudDsKLQotICAgICAgLyogUGxhY2UgYSBtYXJrIGluIHRoZSBzeW1faW5kaWNlcyBhcnJheSAod2hvc2UgZW50cmllcyBoYXZlCi0JIGJlZW4gaW5pdGlhbGlzZWQgdG8gMCkgZm9yIGFsbCBvZiB0aGUgc3ltYm9scyB0aGF0IGFyZSB1c2VkCi0JIGluIHRoZSByZWxvY2F0aW9uIHRhYmxlLiAgVGhpcyB3aWxsIHRoZW4gYmUgcGlja2VkIHVwIGluIHRoZQotCSBza2lwL2Rvbid0IHBhc3MgKi8KLSAgICAgIAotICAgICAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0JewotCSAgZmluZm8tPnN5bV9pbmRpY2VzWyBpcmVsLT5yX3N5bW5keCBdID0gLTE7Ci0JfQotICAgIH0KLX0KLQotLyogTGluayBhbiBpbnB1dCBmaWxlIGludG8gdGhlIGxpbmtlciBvdXRwdXQgZmlsZS4gIFRoaXMgZnVuY3Rpb24KLSAgIGhhbmRsZXMgYWxsIHRoZSBzZWN0aW9ucyBhbmQgcmVsb2NhdGlvbnMgb2YgdGhlIGlucHV0IGZpbGUgYXQgb25jZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9saW5rX2lucHV0X2JmZCAoZmluZm8sIGlucHV0X2JmZCkKLSAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci17Ci0gIGJvb2xlYW4gKCpzeW1faXNfZ2xvYmFsKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0gIGJvb2xlYW4gKCphZGp1c3Rfc3ltbmR4KSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosCi0JCQkJICAgIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCSAgICBib29sZWFuICopKTsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBjb25zdCBjaGFyICpzdHJpbmdzOwotICBiZmRfc2l6ZV90eXBlIHN5bWVudF9iYXNlOwotICB1bnNpZ25lZCBpbnQgbl90bWFzazsKLSAgdW5zaWduZWQgaW50IG5fYnRzaGZ0OwotICBib29sZWFuIGNvcHksIGhhc2g7Ci0gIGJmZF9zaXplX3R5cGUgaXN5bWVzejsKLSAgYmZkX3NpemVfdHlwZSBvc3ltZXN6OwotICBiZmRfc2l6ZV90eXBlIGxpbmVzejsKLSAgYmZkX2J5dGUgKmVzeW07Ci0gIGJmZF9ieXRlICplc3ltX2VuZDsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaXN5bXA7Ci0gIGFzZWN0aW9uICoqc2VjcHA7Ci0gIGxvbmcgKmluZGV4cDsKLSAgdW5zaWduZWQgbG9uZyBvdXRwdXRfaW5kZXg7Ci0gIGJmZF9ieXRlICpvdXRzeW07Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBhc2VjdGlvbiAqbzsKLQotICAvKiBNb3ZlIGFsbCB0aGUgc3ltYm9scyB0byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLSAgc3ltX2lzX2dsb2JhbCA9IGNvZmZfYmFja2VuZF9pbmZvIChpbnB1dF9iZmQpLT5fYmZkX2NvZmZfc3ltX2lzX2dsb2JhbDsKLSAgc3RyaW5ncyA9IE5VTEw7Ci0gIHN5bWVudF9iYXNlID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpOwotICBpc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChpbnB1dF9iZmQpOwotICBvc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKLSAgbGluZXN6ID0gYmZkX2NvZmZfbGluZXN6IChpbnB1dF9iZmQpOwotICBCRkRfQVNTRVJUIChsaW5lc3ogPT0gYmZkX2NvZmZfbGluZXN6IChvdXRwdXRfYmZkKSk7Ci0KLSAgbl90bWFzayA9IGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+bG9jYWxfbl90bWFzazsKLSAgbl9idHNoZnQgPSBjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmxvY2FsX25fYnRzaGZ0OwotCi0gIC8qIERlZmluZSBtYWNyb3Mgc28gdGhhdCBJU0ZDTiwgZXQuIGFsLiwgbWFjcm9zIHdvcmsgY29ycmVjdGx5LiAgKi8KLSNkZWZpbmUgTl9UTUFTSyBuX3RtYXNrCi0jZGVmaW5lIE5fQlRTSEZUIG5fYnRzaGZ0Ci0KLSAgY29weSA9IGZhbHNlOwotICBpZiAoISBmaW5mby0+aW5mby0+a2VlcF9tZW1vcnkpCi0gICAgY29weSA9IHRydWU7Ci0gIGhhc2ggPSB0cnVlOwotICBpZiAoKG91dHB1dF9iZmQtPmZsYWdzICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgIT0gMCkKLSAgICBoYXNoID0gZmFsc2U7Ci0KLSAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChpbnB1dF9iZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpICogaXN5bWVzejsKLSAgaXN5bXAgPSBmaW5mby0+aW50ZXJuYWxfc3ltczsKLSAgc2VjcHAgPSBmaW5mby0+c2VjX3B0cnM7Ci0gIGluZGV4cCA9IGZpbmZvLT5zeW1faW5kaWNlczsKLSAgb3V0cHV0X2luZGV4ID0gc3ltZW50X2Jhc2U7Ci0gIG91dHN5bSA9IGZpbmZvLT5vdXRzeW1zOwotCi0gIGlmIChjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5wZSkKLSAgICB7Ci0gICAgICBpZiAoISBwcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywgaW5wdXRfYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBnb2luZyB0byBwZXJmb3JtIHJlbG9jYXRpb25zIGFuZCBhbHNvIHN0cmlwL2Rpc2NhcmQgc29tZSBzeW1ib2xzCi0gICAgIHRoZW4gd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3Qgc3RyaXAvZGlzY2FyZCB0aG9zZSBzeW1ib2xzIHRoYXQgYXJlCi0gICAgIGdvaW5nIHRvIGJlIGludm9sdmVkIGluIHRoZSByZWxvY2F0aW9ucyAqLwotICBpZiAoKCAgIGZpbmZvLT5pbmZvLT5zdHJpcCAgICE9IHN0cmlwX25vbmUKLSAgICAgICB8fCBmaW5mby0+aW5mby0+ZGlzY2FyZCAhPSBkaXNjYXJkX25vbmUpCi0gICAgICAmJiBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIC8qIG1hcmsgdGhlIHN5bWJvbCBhcnJheSBhcyAnbm90LXVzZWQnICovCi0gICAgICBtZW1zZXQgKGluZGV4cCwgMCwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkgKiBzaXplb2YgKiBpbmRleHApOyAKLSAgICAgICAKLSAgICAgIG1hcmtfcmVsb2NzIChmaW5mbywgaW5wdXRfYmZkKTsKLSAgICB9Ci0KLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07Ci0gICAgICBib29sZWFuIHNraXA7Ci0gICAgICBib29sZWFuIGdsb2JhbDsKLSAgICAgIGJvb2xlYW4gZG9udF9za2lwX3N5bWJvbDsKLSAgICAgIGludCBhZGQ7Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChpbnB1dF9iZmQsIChQVFIpIGVzeW0sIChQVFIpIGlzeW1wKTsKLQotICAgICAgLyogTWFrZSBhIGNvcHkgb2YgKmlzeW1wIHNvIHRoYXQgdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24KLQkgYWx3YXlzIHNlZXMgdGhlIG9yaWdpbmFsIHZhbHVlcy4gIFRoaXMgaXMgbW9yZSByZWxpYWJsZSB0aGFuCi0JIGFsd2F5cyByZWNvbXB1dGluZyB0aGUgc3ltYm9sIHZhbHVlIGV2ZW4gaWYgd2UgYXJlIHN0cmlwcGluZwotCSB0aGUgc3ltYm9sLiAgKi8KLSAgICAgIGlzeW0gPSAqaXN5bXA7Ci0KLSAgICAgIGlmIChpc3ltLm5fc2NudW0gIT0gMCkKLQkqc2VjcHAgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGlucHV0X2JmZCwgaXN5bS5uX3NjbnVtKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaXN5bS5uX3ZhbHVlID09IDApCi0JICAgICpzZWNwcCA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgICpzZWNwcCA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JfQotCi0gICAgICAvKiBFeHRyYWN0IHRoZSBmbGFnIGluZGljYXRpbmcgaWYgdGhpcyBzeW1ib2wgaXMgdXNlZCBieSBhCi0gICAgICAgICByZWxvY2F0aW9uLiAgKi8KLSAgICAgIGlmICgoZmluZm8tPmluZm8tPnN0cmlwICE9IHN0cmlwX25vbmUKLQkgICB8fCBmaW5mby0+aW5mby0+ZGlzY2FyZCAhPSBkaXNjYXJkX25vbmUpCi0JICAmJiBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKQotCWRvbnRfc2tpcF9zeW1ib2wgPSAqaW5kZXhwOwotICAgICAgZWxzZQotCWRvbnRfc2tpcF9zeW1ib2wgPSBmYWxzZTsKLSAgICAgIAotICAgICAgKmluZGV4cCA9IC0xOwotCi0gICAgICBza2lwID0gZmFsc2U7Ci0gICAgICBnbG9iYWwgPSBmYWxzZTsKLSAgICAgIGFkZCA9IDEgKyBpc3ltLm5fbnVtYXV4OwotCi0gICAgICAvKiBJZiB3ZSBhcmUgc3RyaXBwaW5nIGFsbCBzeW1ib2xzLCB3ZSB3YW50IHRvIHNraXAgdGhpcyBvbmUuICAqLwotICAgICAgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwgJiYgISBkb250X3NraXBfc3ltYm9sKQotCXNraXAgPSB0cnVlOwotCi0gICAgICBpZiAoISBza2lwKQotCXsKLQkgIGlmIChpc3ltLm5fc2NsYXNzID09IENfRVhUCi0JICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX1dFQUtFWFQKLQkgICAgICB8fCAob2JqX3BlIChpbnB1dF9iZmQpICYmIGlzeW0ubl9zY2xhc3MgPT0gQ19OVF9XRUFLKQotI2lmZGVmIENfU1lTVEVNCi0JICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX1NZU1RFTQotI2VuZGlmCi0JICAgICAgfHwgKHN5bV9pc19nbG9iYWwgJiYgKCpzeW1faXNfZ2xvYmFsKSAoaW5wdXRfYmZkLCAmaXN5bSkpKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBzeW1ib2wuICBHbG9iYWwgc3ltYm9scyBjb21lIGF0IHRoZQotCQkgZW5kIG9mIHRoZSBzeW1ib2wgdGFibGUsIHNvIHNraXAgdGhlbSBmb3Igbm93LgotCQkgTG9jYWxseSBkZWZpbmVkIGZ1bmN0aW9uIHN5bWJvbHMsIGhvd2V2ZXIsIGFyZSBhbgotCQkgZXhjZXB0aW9uLCBhbmQgYXJlIG5vdCBtb3ZlZCB0byB0aGUgZW5kLiAgKi8KLQkgICAgICBnbG9iYWwgPSB0cnVlOwotCSAgICAgIGlmICghIElTRkNOIChpc3ltLm5fdHlwZSkgfHwgaXN5bS5uX3NjbnVtID09IDApCi0JCXNraXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgbG9jYWwgc3ltYm9sLiAgU2tpcCBpdCBpZiB3ZSBhcmUgZGlzY2FyZGluZwotICAgICAgICAgICAgICAgICBsb2NhbCBzeW1ib2xzLiAgKi8KLQkgICAgICBpZiAoZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9hbGwgJiYgISBkb250X3NraXBfc3ltYm9sKQotCQlza2lwID0gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2Ugc3RyaXBwaW5nIGRlYnVnZ2luZyBzeW1ib2xzLCBhbmQgdGhpcyBpcyBhIGRlYnVnZ2luZwotICAgICAgICAgc3ltYm9sLCB0aGVuIHNraXAgaXQuICBGSVhNRTogZ2FzIHNldHMgdGhlIHNlY3Rpb24gdG8gTl9BQlMKLSAgICAgICAgIGZvciBzb21lIHR5cGVzIG9mIGRlYnVnZ2luZyBzeW1ib2xzOyBJIGRvbid0IGtub3cgaWYgdGhpcyBpcwotICAgICAgICAgYSBidWcgb3Igbm90LiAgSW4gYW55IGNhc2UsIHdlIGhhbmRsZSBpdCBoZXJlLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9kZWJ1Z2dlcgotCSAgJiYgISBkb250X3NraXBfc3ltYm9sCi0JICAmJiAoaXN5bS5uX3NjbnVtID09IE5fREVCVUcKLQkgICAgICB8fCAoaXN5bS5uX3NjbnVtID09IE5fQUJTCi0JCSAgJiYgKGlzeW0ubl9zY2xhc3MgPT0gQ19BVVRPCi0JCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19SRUcKLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX01PUwotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfTU9FCi0JCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19NT1UKLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX0FSRwotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfUkVHUEFSTQotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfRklFTEQKLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX0VPUykpKSkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogSWYgc29tZSBzeW1ib2xzIGFyZSBzdHJpcHBlZCBiYXNlZCBvbiB0aGUgbmFtZSwgd29yayBvdXQgdGhlCi0JIG5hbWUgYW5kIGRlY2lkZSB3aGV0aGVyIHRvIHNraXAgdGhpcyBzeW1ib2wuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgfHwgZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9sKSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCAmaXN5bSwgYnVmKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKCEgZG9udF9za2lwX3N5bWJvbAotCSAgICAgICYmICgoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkJICAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwgbmFtZSwgZmFsc2UsCi0JCQkJICAgIGZhbHNlKSA9PSBOVUxMKSkKLQkJICAgfHwgKCEgZ2xvYmFsCi0JCSAgICAgICAmJiBmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wKLQkJICAgICAgICYmIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChpbnB1dF9iZmQsIG5hbWUpKSkpCi0JICAgIHNraXAgPSB0cnVlOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBpcyBhbiBlbnVtLCBzdHJ1Y3QsIG9yIHVuaW9uIHRhZywgc2VlIGlmIHdlIGhhdmUKLSAgICAgICAgIGFscmVhZHkgb3V0cHV0IGFuIGlkZW50aWNhbCB0eXBlLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIChmaW5mby0+b3V0cHV0X2JmZC0+ZmxhZ3MgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSA9PSAwCi0JICAmJiAoaXN5bS5uX3NjbGFzcyA9PSBDX0VOVEFHCi0JICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX1NUUlRBRwotCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19VTlRBRykKLQkgICYmIGlzeW0ubl9udW1hdXggPT0gMSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQkgIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKm1oOwotCSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqbXQ7Ci0JICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OwotCSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqKmVwcDsKLQkgIGJmZF9ieXRlICplc2wsICplc2xlbmQ7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppc2xwOwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsICZpc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBJZ25vcmUgZmFrZSBuYW1lcyBpbnZlbnRlZCBieSBjb21waWxlcjsgdHJlYXQgdGhlbSBhbGwgYXMKLSAgICAgICAgICAgICB0aGUgc2FtZSBuYW1lLiAgKi8KLQkgIGlmICgqbmFtZSA9PSAnficgfHwgKm5hbWUgPT0gJy4nIHx8ICpuYW1lID09ICckJwotCSAgICAgIHx8ICgqbmFtZSA9PSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGlucHV0X2JmZCkKLQkJICAmJiAobmFtZVsxXSA9PSAnficgfHwgbmFtZVsxXSA9PSAnLicgfHwgbmFtZVsxXSA9PSAnJCcpKSkKLQkgICAgbmFtZSA9ICIiOwotCi0JICBtaCA9IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXAgKCZmaW5mby0+ZGVidWdfbWVyZ2UsIG5hbWUsCi0JCQkJCSAgICAgdHJ1ZSwgdHJ1ZSk7Ci0JICBpZiAobWggPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gaG9sZCB0eXBlIGluZm9ybWF0aW9uLiAgSWYgdGhpcyB0dXJucwotICAgICAgICAgICAgIG91dCB0byBiZSBhIGR1cGxpY2F0ZSwgd2UgcGFzcyB0aGlzIGFkZHJlc3MgdG8KLSAgICAgICAgICAgICBiZmRfcmVsZWFzZS4gICovCi0JICBtdCA9ICgoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqKQotCQliZmRfYWxsb2MgKGlucHV0X2JmZCwKLQkJCSAgIHNpemVvZiAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSkpKTsKLQkgIGlmIChtdCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBtdC0+Y2xhc3MgPSBpc3ltLm5fc2NsYXNzOwotCi0JICAvKiBQaWNrIHVwIHRoZSBhdXggZW50cnksIHdoaWNoIHBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSB0YWcKLSAgICAgICAgICAgICBlbnRyaWVzLiAgKi8KLQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIChQVFIpIChlc3ltICsgaXN5bWVzeiksCi0JCQkJaXN5bS5uX3R5cGUsIGlzeW0ubl9zY2xhc3MsIDAsIGlzeW0ubl9udW1hdXgsCi0JCQkJKFBUUikgJmF1eCk7Ci0KLQkgIC8qIEdhdGhlciB0aGUgZWxlbWVudHMuICAqLwotCSAgZXBwID0gJm10LT5lbGVtZW50czsKLQkgIG10LT5lbGVtZW50cyA9IE5VTEw7Ci0JICBpc2xwID0gaXN5bXAgKyAyOwotCSAgZXNsID0gZXN5bSArIDIgKiBpc3ltZXN6OwotCSAgZXNsZW5kID0gKChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpCi0JCSAgICArIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sICogaXN5bWVzeik7Ci0JICB3aGlsZSAoZXNsIDwgZXNsZW5kKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqZWxlbmFtZTsKLQkgICAgICBjaGFyIGVsZWJ1ZltTWU1OTUxFTiArIDFdOwotCSAgICAgIGNoYXIgKmNvcHk7Ci0KLQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoaW5wdXRfYmZkLCAoUFRSKSBlc2wsIChQVFIpIGlzbHApOwotCi0JICAgICAgKmVwcCA9ICgoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqKQotCQkgICAgICBiZmRfYWxsb2MgKGlucHV0X2JmZCwKLQkJCQkgc2l6ZW9mIChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50KSkpOwotCSAgICAgIGlmICgqZXBwID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGVsZW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgaXNscCwKLQkJCQkJCQllbGVidWYpOwotCSAgICAgIGlmIChlbGVuYW1lID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGNvcHkgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGlucHV0X2JmZCwgc3RybGVuIChlbGVuYW1lKSArIDEpOwotCSAgICAgIGlmIChjb3B5ID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBzdHJjcHkgKGNvcHksIGVsZW5hbWUpOwotCi0JICAgICAgKCplcHApLT5uYW1lID0gY29weTsKLQkgICAgICAoKmVwcCktPnR5cGUgPSBpc2xwLT5uX3R5cGU7Ci0JICAgICAgKCplcHApLT50YWduZHggPSAwOwotCSAgICAgIGlmIChpc2xwLT5uX251bWF1eCA+PSAxCi0JCSAgJiYgaXNscC0+bl90eXBlICE9IFRfTlVMTAotCQkgICYmIGlzbHAtPm5fc2NsYXNzICE9IENfRU9TKQotCQl7Ci0JCSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGVsZWF1eDsKLQkJICBsb25nIGluZHg7Ci0KLQkJICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoaW5wdXRfYmZkLCAoUFRSKSAoZXNsICsgaXN5bWVzeiksCi0JCQkJCWlzbHAtPm5fdHlwZSwgaXNscC0+bl9zY2xhc3MsIDAsCi0JCQkJCWlzbHAtPm5fbnVtYXV4LCAoUFRSKSAmZWxlYXV4KTsKLQkJICBpbmR4ID0gZWxlYXV4Lnhfc3ltLnhfdGFnbmR4Lmw7Ci0KLQkJICAvKiBGSVhNRTogSWYgdGhpcyB0YWduZHggZW50cnkgcmVmZXJzIHRvIGEgc3ltYm9sCi0JCSAgICAgZGVmaW5lZCBsYXRlciBpbiB0aGlzIGZpbGUsIHdlIGp1c3QgaWdub3JlIGl0LgotCQkgICAgIEhhbmRsaW5nIHRoaXMgY29ycmVjdGx5IHdvdWxkIGJlIHRlZGlvdXMsIGFuZCBtYXkKLQkJICAgICBub3QgYmUgcmVxdWlyZWQuICAqLwotCi0JCSAgaWYgKGluZHggPiAwCi0JCSAgICAgICYmIChpbmR4Ci0JCQkgIDwgKChlc3ltIC0KLQkJCSAgICAgIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpKQotCQkJICAgICAvIChsb25nKSBpc3ltZXN6KSkpCi0JCSAgICB7Ci0JCSAgICAgICgqZXBwKS0+dGFnbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdOwotCQkgICAgICBpZiAoKCplcHApLT50YWduZHggPCAwKQotCQkJKCplcHApLT50YWduZHggPSAwOwotCQkgICAgfQotCQl9Ci0JICAgICAgZXBwID0gJigqZXBwKS0+bmV4dDsKLQkgICAgICAqZXBwID0gTlVMTDsKLQotCSAgICAgIGVzbCArPSAoaXNscC0+bl9udW1hdXggKyAxKSAqIGlzeW1lc3o7Ci0JICAgICAgaXNscCArPSBpc2xwLT5uX251bWF1eCArIDE7Ci0JICAgIH0KLQotCSAgLyogU2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGRlZmluaXRpb24gd2hpY2ggbWF0Y2hlcyB0aGlzCi0gICAgICAgICAgICAgdHlwZS4gIFdlIGFsd2F5cyBvdXRwdXQgdGhlIHR5cGUgaWYgaXQgaGFzIG5vIGVsZW1lbnRzLAotICAgICAgICAgICAgIGZvciBzaW1wbGljaXR5LiAgKi8KLQkgIGlmIChtdC0+ZWxlbWVudHMgPT0gTlVMTCkKLQkgICAgYmZkX3JlbGVhc2UgKGlucHV0X2JmZCwgKFBUUikgbXQpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqbXRsOwotCi0JICAgICAgZm9yIChtdGwgPSBtaC0+dHlwZXM7IG10bCAhPSBOVUxMOyBtdGwgPSBtdGwtPm5leHQpCi0JCXsKLQkJICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICptZSwgKm1lbDsKLQotCQkgIGlmIChtdGwtPmNsYXNzICE9IG10LT5jbGFzcykKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgZm9yIChtZSA9IG10LT5lbGVtZW50cywgbWVsID0gbXRsLT5lbGVtZW50czsKLQkJICAgICAgIG1lICE9IE5VTEwgJiYgbWVsICE9IE5VTEw7Ci0JCSAgICAgICBtZSA9IG1lLT5uZXh0LCBtZWwgPSBtZWwtPm5leHQpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzdHJjbXAgKG1lLT5uYW1lLCBtZWwtPm5hbWUpICE9IDAKLQkJCSAgfHwgbWUtPnR5cGUgIT0gbWVsLT50eXBlCi0JCQkgIHx8IG1lLT50YWduZHggIT0gbWVsLT50YWduZHgpCi0JCQlicmVhazsKLQkJICAgIH0KLQotCQkgIGlmIChtZSA9PSBOVUxMICYmIG1lbCA9PSBOVUxMKQotCQkgICAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIGlmIChtdGwgPT0gTlVMTCB8fCAoYmZkX3NpemVfdHlwZSkgbXRsLT5pbmR4ID49IHN5bWVudF9iYXNlKQotCQl7Ci0JCSAgLyogVGhpcyBpcyB0aGUgZmlyc3QgZGVmaW5pdGlvbiBvZiB0aGlzIHR5cGUuICAqLwotCQkgIG10LT5pbmR4ID0gb3V0cHV0X2luZGV4OwotCQkgIG10LT5uZXh0ID0gbWgtPnR5cGVzOwotCQkgIG1oLT50eXBlcyA9IG10OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhIHJlZGVmaW5pdGlvbiB3aGljaCBjYW4gYmUgbWVyZ2VkLiAgKi8KLQkJICBiZmRfcmVsZWFzZSAoaW5wdXRfYmZkLCAoUFRSKSBtdCk7Ci0JCSAgKmluZGV4cCA9IG10bC0+aW5keDsKLQkJICBhZGQgPSAoZXNsZW5kIC0gZXN5bSkgLyBpc3ltZXN6OwotCQkgIHNraXAgPSB0cnVlOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdlIG5vdyBrbm93IHdoZXRoZXIgd2UgYXJlIHRvIHNraXAgdGhpcyBzeW1ib2wgb3Igbm90LiAgKi8KLSAgICAgIGlmICghIHNraXApCi0JewotCSAgLyogQWRqdXN0IHRoZSBzeW1ib2wgaW4gb3JkZXIgdG8gb3V0cHV0IGl0LiAgKi8KLQotCSAgaWYgKGlzeW0uX24uX25fbi5fbl96ZXJvZXMgPT0gMAotCSAgICAgICYmIGlzeW0uX24uX25fbi5fbl9vZmZzZXQgIT0gMCkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGEgbG9uZyBuYW1lLiAgRW50ZXIgaXQgaW4gdGhlIHN0cmluZwotCQkgdGFibGUgd2UgYXJlIGJ1aWxkaW5nLiAgTm90ZSB0aGF0IHdlIGRvIG5vdCBjaGVjawotCQkgYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1Zy4gIFRoYXQgaXMgb25seSB0cnVlIGZvcgotCQkgWENPRkYsIGFuZCBYQ09GRiByZXF1aXJlcyBkaWZmZXJlbnQgbGlua2luZyBjb2RlCi0JCSBhbnlob3cuICAqLwotCSAgICAgIG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgJmlzeW0sCi0JCQkJCQkgICAgIChjaGFyICopIE5VTEwpOwotCSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBuYW1lLCBoYXNoLCBjb3B5KTsKLQkgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpc3ltLl9uLl9uX24uX25fb2Zmc2V0ID0gU1RSSU5HX1NJWkVfU0laRSArIGluZHg7Ci0JICAgIH0KLQotCSAgaWYgKGlzeW0ubl9zY251bSA+IDApCi0JICAgIHsKLQkgICAgICBpc3ltLm5fc2NudW0gPSAoKnNlY3BwKS0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgICAgICBpc3ltLm5fdmFsdWUgKz0gKCpzZWNwcCktPm91dHB1dF9vZmZzZXQ7Ci0JICAgICAgaWYgKCEgb2JqX3BlIChpbnB1dF9iZmQpKQotCQlpc3ltLm5fdmFsdWUgLT0gKCpzZWNwcCktPnZtYTsKLQkgICAgICBpZiAoISBvYmpfcGUgKGZpbmZvLT5vdXRwdXRfYmZkKSkKLQkJaXN5bS5uX3ZhbHVlICs9ICgqc2VjcHApLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgICB9Ci0KLQkgIC8qIFRoZSB2YWx1ZSBvZiBhIENfRklMRSBzeW1ib2wgaXMgdGhlIHN5bWJvbCBpbmRleCBvZiB0aGUKLQkgICAgIG5leHQgQ19GSUxFIHN5bWJvbC4gIFRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBDX0ZJTEUgc3ltYm9sCi0JICAgICBpcyB0aGUgc3ltYm9sIGluZGV4IHRvIHRoZSBmaXJzdCBleHRlcm5hbCBzeW1ib2wKLQkgICAgIChhY3R1YWxseSwgY29mZl9yZW51bWJlcl9zeW1ib2xzIGRvZXMgbm90IGdldCB0aGlzCi0JICAgICByaWdodC0taXQganVzdCBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBDX0ZJTEUgc3ltYm9sCi0JICAgICB0byB6ZXJvLS1hbmQgbm9ib2R5IGhhcyBldmVyIGNvbXBsYWluZWQgYWJvdXQgaXQpLiAgV2UKLQkgICAgIHRyeSB0byBnZXQgdGhpcyByaWdodCwgYmVsb3csIGp1c3QgYmVmb3JlIHdlIHdyaXRlIHRoZQotCSAgICAgc3ltYm9scyBvdXQsIGJ1dCBpbiB0aGUgZ2VuZXJhbCBjYXNlIHdlIG1heSBoYXZlIHRvIHdyaXRlCi0JICAgICB0aGUgc3ltYm9sIG91dCB0d2ljZS4gICovCi0JICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JICAgIHsKLQkgICAgICBpZiAoZmluZm8tPmxhc3RfZmlsZV9pbmRleCAhPSAtMQotCQkgICYmIGZpbmZvLT5sYXN0X2ZpbGUubl92YWx1ZSAhPSAobG9uZykgb3V0cHV0X2luZGV4KQotCQl7Ci0JCSAgLyogV2UgbXVzdCBjb3JyZWN0IHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBDX0ZJTEUgZW50cnkuICAqLwotCQkgIGZpbmZvLT5sYXN0X2ZpbGUubl92YWx1ZSA9IG91dHB1dF9pbmRleDsKLQkJICBpZiAoKGJmZF9zaXplX3R5cGUpIGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggPj0gc3ltZW50X2Jhc2UpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBsYXN0IENfRklMRSBzeW1ib2wgaXMgaW4gdGhpcyBpbnB1dCBmaWxlLiAgKi8KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJCQkgICAgIChQVFIpIChmaW5mby0+b3V0c3ltcwotCQkJCQkJICAgICsgKChmaW5mby0+bGFzdF9maWxlX2luZGV4Ci0JCQkJCQkJLSBzeW1lbnRfYmFzZSkKLQkJCQkJCSAgICAgICAqIG9zeW1lc3opKSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBXZSBoYXZlIGFscmVhZHkgd3JpdHRlbiBvdXQgdGhlIGxhc3QgQ19GSUxFCi0JCQkgc3ltYm9sLiAgV2UgbmVlZCB0byB3cml0ZSBpdCBvdXQgYWdhaW4uICBXZQotCQkJIGJvcnJvdyAqb3V0c3ltIHRlbXBvcmFyaWx5LiAgKi8KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJCQkgICAgIChQVFIpIG91dHN5bSk7Ci0JCSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCQkgICAgKG9ial9zeW1fZmlsZXBvcyAob3V0cHV0X2JmZCkKLQkJCQkgICAgICsgZmluZm8tPmxhc3RfZmlsZV9pbmRleCAqIG9zeW1lc3opLAotCQkJCSAgICBTRUVLX1NFVCkgIT0gMAotCQkJICB8fCAoYmZkX3dyaXRlIChvdXRzeW0sIG9zeW1lc3osIDEsIG91dHB1dF9iZmQpCi0JCQkgICAgICAhPSBvc3ltZXN6KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA9IG91dHB1dF9pbmRleDsKLQkgICAgICBmaW5mby0+bGFzdF9maWxlID0gaXN5bTsKLQkgICAgfQotCi0JICAvKiBJZiBkb2luZyB0YXNrIGxpbmtpbmcsIGNvbnZlcnQgbm9ybWFsIGdsb2JhbCBmdW5jdGlvbiBzeW1ib2xzIHRvCi0JICAgICBzdGF0aWMgZnVuY3Rpb25zLiAqLwotCi0JICBpZiAoZmluZm8tPmluZm8tPnRhc2tfbGluawotCSAgICAgICYmIChpc3ltLm5fc2NsYXNzID09IENfRVhUCi0JCSAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX1dFQUtFWFQKLQkJICB8fCAob2JqX3BlIChpbnB1dF9iZmQpICYmIGlzeW0ubl9zY2xhc3MgPT0gQ19OVF9XRUFLKSkpCi0JICAgIGlzeW0ubl9zY2xhc3MgPSBDX1NUQVQ7Ci0KLQkgIC8qIE91dHB1dCB0aGUgc3ltYm9sLiAgKi8KLQotCSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgb3V0c3ltKTsKLQotCSAgKmluZGV4cCA9IG91dHB1dF9pbmRleDsKLQotCSAgaWYgKGdsb2JhbCkKLQkgICAgewotCSAgICAgIGxvbmcgaW5keDsKLQkgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgICBpbmR4ID0gKChlc3ltIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCkpCi0JCSAgICAgIC8gaXN5bWVzeik7Ci0JICAgICAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaW5keF07Ci0JICAgICAgaWYgKGggPT0gTlVMTCkKLQkJewotCQkgIC8qIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGVyZSB3ZXJlIGVycm9ycyBlYXJsaWVyIGluCi0gICAgICAgICAgICAgICAgICAgICB0aGUgbGluay4gICovCi0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgaC0+aW5keCA9IG91dHB1dF9pbmRleDsKLQkgICAgfQotCi0JICBvdXRwdXRfaW5kZXggKz0gYWRkOwotCSAgb3V0c3ltICs9IGFkZCAqIG9zeW1lc3o7Ci0JfQotCi0gICAgICBlc3ltICs9IGFkZCAqIGlzeW1lc3o7Ci0gICAgICBpc3ltcCArPSBhZGQ7Ci0gICAgICArK3NlY3BwOwotICAgICAgKytpbmRleHA7Ci0gICAgICBmb3IgKC0tYWRkOyBhZGQgPiAwOyAtLWFkZCkKLQl7Ci0JICAqc2VjcHArKyA9IE5VTEw7Ci0JICAqaW5kZXhwKysgPSAtMTsKLQl9Ci0gICAgfQotCi0gIC8qIEZpeCB1cCB0aGUgYXV4IGVudHJpZXMuICBUaGlzIG11c3QgYmUgZG9uZSBpbiBhIHNlcGFyYXRlIHBhc3MsCi0gICAgIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgY29ycmVjdCBzeW1ib2wgaW5kaWNlcyB1bnRpbCB3ZSBoYXZlCi0gICAgIGFscmVhZHkgZGVjaWRlZCB3aGljaCBzeW1ib2xzIHdlIGFyZSBnb2luZyB0byBrZWVwLiAgKi8KLQotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpICogaXN5bWVzejsKLSAgaXN5bXAgPSBmaW5mby0+aW50ZXJuYWxfc3ltczsKLSAgaW5kZXhwID0gZmluZm8tPnN5bV9pbmRpY2VzOwotICBzeW1faGFzaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIG91dHN5bSA9IGZpbmZvLT5vdXRzeW1zOwotICB3aGlsZSAoZXN5bSA8IGVzeW1fZW5kKQotICAgIHsKLSAgICAgIGludCBhZGQ7Ci0KLSAgICAgIGFkZCA9IDEgKyBpc3ltcC0+bl9udW1hdXg7Ci0KLSAgICAgIGlmICgoKmluZGV4cCA8IDAKLQkgICB8fCAoYmZkX3NpemVfdHlwZSkgKmluZGV4cCA8IHN5bWVudF9iYXNlKQotCSAgJiYgKCpzeW1faGFzaCA9PSBOVUxMCi0JICAgICAgfHwgKCpzeW1faGFzaCktPmF1eGJmZCAhPSBpbnB1dF9iZmQpKQotCWVzeW0gKz0gYWRkICogaXN5bWVzejsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0JICBpbnQgaTsKLQotCSAgaCA9IE5VTEw7Ci0JICBpZiAoKmluZGV4cCA8IDApCi0JICAgIHsKLQkgICAgICBoID0gKnN5bV9oYXNoOwotCi0JICAgICAgLyogVGhlIG02OGstbW90b3JvbGEtc3lzdiBhc3NlbWJsZXIgd2lsbCBzb21ldGltZXMKLSAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgdHdvIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lLCBidXQgb25seSBvbmUKLSAgICAgICAgICAgICAgICAgd2lsbCBoYXZlIGF1eCBlbnRyaWVzLiAgKi8KLQkgICAgICBCRkRfQVNTRVJUIChpc3ltcC0+bl9udW1hdXggPT0gMAotCQkJICB8fCBoLT5udW1hdXggPT0gaXN5bXAtPm5fbnVtYXV4KTsKLQkgICAgfQotCi0JICBlc3ltICs9IGlzeW1lc3o7Ci0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIG91dHN5bSArPSBvc3ltZXN6OwotCi0JICAvKiBIYW5kbGUgdGhlIGF1eCBlbnRyaWVzLiAgVGhpcyBoYW5kbGluZyBpcyBiYXNlZCBvbgotCSAgICAgY29mZl9wb2ludGVyaXplX2F1eC4gIEkgZG9uJ3Qga25vdyBpZiBpdCBhbHdheXMgY29ycmVjdC4gICovCi0JICBmb3IgKGkgPSAwOyBpIDwgaXN5bXAtPm5fbnVtYXV4ICYmIGVzeW0gPCBlc3ltX2VuZDsgaSsrKQotCSAgICB7Ci0JICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eHA7Ci0KLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQlhdXhwID0gaC0+YXV4ICsgaTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoaW5wdXRfYmZkLCAoUFRSKSBlc3ltLCBpc3ltcC0+bl90eXBlLAotCQkJCQlpc3ltcC0+bl9zY2xhc3MsIGksIGlzeW1wLT5uX251bWF1eCwKLQkJCQkJKFBUUikgJmF1eCk7Ci0JCSAgYXV4cCA9ICZhdXg7Ci0JCX0KLQotCSAgICAgIGlmIChpc3ltcC0+bl9zY2xhc3MgPT0gQ19GSUxFKQotCQl7Ci0JCSAgLyogSWYgdGhpcyBpcyBhIGxvbmcgZmlsZW5hbWUsIHdlIG11c3QgcHV0IGl0IGluIHRoZQotCQkgICAgIHN0cmluZyB0YWJsZS4gICovCi0JCSAgaWYgKGF1eHAtPnhfZmlsZS54X24ueF96ZXJvZXMgPT0gMAotCQkgICAgICAmJiBhdXhwLT54X2ZpbGUueF9uLnhfb2Zmc2V0ICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotCQkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkJICAgICAgQkZEX0FTU0VSVCAoYXV4cC0+eF9maWxlLnhfbi54X29mZnNldAotCQkJCSAgPj0gU1RSSU5HX1NJWkVfU0laRSk7Ci0JCSAgICAgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JCQl7Ci0JCQkgIHN0cmluZ3MgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGlucHV0X2JmZCk7Ci0JCQkgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBmaWxlbmFtZSA9IHN0cmluZ3MgKyBhdXhwLT54X2ZpbGUueF9uLnhfb2Zmc2V0OwotCQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBmaWxlbmFtZSwKLQkJCQkJCSBoYXNoLCBjb3B5KTsKLQkJICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBhdXhwLT54X2ZpbGUueF9uLnhfb2Zmc2V0ID0gU1RSSU5HX1NJWkVfU0laRSArIGluZHg7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChpc3ltcC0+bl9zY2xhc3MgIT0gQ19TVEFUIHx8IGlzeW1wLT5uX3R5cGUgIT0gVF9OVUxMKQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyBpbmR4OwotCi0JCSAgaWYgKElTRkNOIChpc3ltcC0+bl90eXBlKQotCQkgICAgICB8fCBJU1RBRyAoaXN5bXAtPm5fc2NsYXNzKQotCQkgICAgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19CTE9DSwotCQkgICAgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19GQ04pCi0JCSAgICB7Ci0JCSAgICAgIGluZHggPSBhdXhwLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sOwotCQkgICAgICBpZiAoaW5keCA+IDAKLQkJCSAgJiYgaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkJewotCQkJICAvKiBXZSBsb29rIGZvcndhcmQgdGhyb3VnaCB0aGUgc3ltYm9sIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIG5leHQgc3ltYm9sIHdlIGFyZSBnb2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbmNsdWRlLiAgSSBkb24ndCBrbm93IGlmIHRoaXMgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXJlbHkgcmlnaHQuICAqLwotCQkJICB3aGlsZSAoKGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XSA8IDAKLQkJCQkgIHx8ICgoYmZkX3NpemVfdHlwZSkgZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdCi0JCQkJICAgICAgPCBzeW1lbnRfYmFzZSkpCi0JCQkJICYmIGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJCSAgICArK2luZHg7Ci0JCQkgIGlmIChpbmR4ID49IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkJICAgIGluZHggPSBvdXRwdXRfaW5kZXg7Ci0JCQkgIGVsc2UKLQkJCSAgICBpbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdOwotCQkJICBhdXhwLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0gaW5keDsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGluZHggPSBhdXhwLT54X3N5bS54X3RhZ25keC5sOwotCQkgIGlmIChpbmR4ID4gMCAmJiBpbmR4IDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgc3ltaW5keDsKLQotCQkgICAgICBzeW1pbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdOwotCQkgICAgICBpZiAoc3ltaW5keCA8IDApCi0JCQlhdXhwLT54X3N5bS54X3RhZ25keC5sID0gMDsKLQkJICAgICAgZWxzZQotCQkJYXV4cC0+eF9zeW0ueF90YWduZHgubCA9IHN5bWluZHg7Ci0JCSAgICB9Ci0KLQkJICAvKiBUaGUgLmJmIHN5bWJvbHMgYXJlIHN1cHBvc2VkIHRvIGJlIGxpbmtlZCB0aHJvdWdoCi0JCSAgICAgdGhlIGVuZG5keCBmaWVsZC4gIFdlIG5lZWQgdG8gY2FycnkgdGhpcyBsaXN0Ci0JCSAgICAgYWNyb3NzIG9iamVjdCBmaWxlcy4gICovCi0JCSAgaWYgKGkgPT0gMAotCQkgICAgICAmJiBoID09IE5VTEwKLQkJICAgICAgJiYgaXN5bXAtPm5fc2NsYXNzID09IENfRkNOCi0JCSAgICAgICYmIChpc3ltcC0+X24uX25fbi5fbl96ZXJvZXMgIT0gMAotCQkJICB8fCBpc3ltcC0+X24uX25fbi5fbl9vZmZzZXQgPT0gMCkKLQkJICAgICAgJiYgaXN5bXAtPl9uLl9uX25hbWVbMF0gPT0gJy4nCi0JCSAgICAgICYmIGlzeW1wLT5fbi5fbl9uYW1lWzFdID09ICdiJwotCQkgICAgICAmJiBpc3ltcC0+X24uX25fbmFtZVsyXSA9PSAnZicKLQkJICAgICAgJiYgaXN5bXAtPl9uLl9uX25hbWVbM10gPT0gJ1wwJykKLQkJICAgIHsKLQkJICAgICAgaWYgKGZpbmZvLT5sYXN0X2JmX2luZGV4ICE9IC0xKQotCQkJewotCQkJICBmaW5mby0+bGFzdF9iZi54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0KLQkJCSAgICAqaW5kZXhwOwotCi0JCQkgIGlmICgoYmZkX3NpemVfdHlwZSkgZmluZm8tPmxhc3RfYmZfaW5kZXgKLQkJCSAgICAgID49IHN5bWVudF9iYXNlKQotCQkJICAgIHsKLQkJCSAgICAgIFBUUiBhdXhvdXQ7Ci0KLQkJCSAgICAgIC8qIFRoZSBsYXN0IC5iZiBzeW1ib2wgaXMgaW4gdGhpcyBpbnB1dAotCQkJCSBmaWxlLiAgVGhpcyB3aWxsIG9ubHkgaGFwcGVuIGlmIHRoZQotCQkJCSBhc3NlbWJsZXIgZGlkIG5vdCBzZXQgdXAgdGhlIC5iZgotCQkJCSBlbmRuZHggc3ltYm9scyBjb3JyZWN0bHkuICAqLwotCQkJICAgICAgYXV4b3V0ID0gKFBUUikgKGZpbmZvLT5vdXRzeW1zCi0JCQkJCSAgICAgICsgKChmaW5mby0+bGFzdF9iZl9pbmRleAotCQkJCQkJICAtIHN5bWVudF9iYXNlKQotCQkJCQkJICogb3N5bWVzeikpOwotCQkJICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLAotCQkJCQkJICAgICAoUFRSKSAmZmluZm8tPmxhc3RfYmYsCi0JCQkJCQkgICAgIGlzeW1wLT5uX3R5cGUsCi0JCQkJCQkgICAgIGlzeW1wLT5uX3NjbGFzcywKLQkJCQkJCSAgICAgMCwgaXN5bXAtPm5fbnVtYXV4LAotCQkJCQkJICAgICBhdXhvdXQpOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSB3cml0dGVuIG91dCB0aGUgbGFzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJmIGF1eCBlbnRyeS4gIFdlIG5lZWQgdG8gd3JpdGUgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBhZ2Fpbi4gIFdlIGJvcnJvdyAqb3V0c3ltCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcmlseS4gIEZJWE1FOiBUaGlzIGNhc2Ugc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBtYWRlIGZhc3Rlci4gICovCi0JCQkgICAgICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsCi0JCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9iZiwKLQkJCQkJCSAgICAgaXN5bXAtPm5fdHlwZSwKLQkJCQkJCSAgICAgaXN5bXAtPm5fc2NsYXNzLAotCQkJCQkJICAgICAwLCBpc3ltcC0+bl9udW1hdXgsCi0JCQkJCQkgICAgIChQVFIpIG91dHN5bSk7Ci0JCQkgICAgICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAob2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKQotCQkJCQkgICAgICsgZmluZm8tPmxhc3RfYmZfaW5kZXggKiBvc3ltZXN6KSwKLQkJCQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JCQkJICB8fCBiZmRfd3JpdGUgKG91dHN5bSwgb3N5bWVzeiwgMSwKLQkJCQkJCW91dHB1dF9iZmQpICE9IG9zeW1lc3opCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICBpZiAoYXV4cC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCAhPSAwKQotCQkJZmluZm8tPmxhc3RfYmZfaW5kZXggPSAtMTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICAvKiBUaGUgZW5kbmR4IGZpZWxkIG9mIHRoaXMgYXV4IGVudHJ5IG11c3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXBkYXRlZCB3aXRoIHRoZSBzeW1ib2wgbnVtYmVyIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IC5iZiBzeW1ib2wuICAqLwotCQkJICBmaW5mby0+bGFzdF9iZiA9ICphdXhwOwotCQkJICBmaW5mby0+bGFzdF9iZl9pbmRleCA9ICgoKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKQotCQkJCQkJICAgLyBvc3ltZXN6KQotCQkJCQkJICArIHN5bWVudF9iYXNlKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKGggPT0gTlVMTCkKLQkJewotCQkgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgYXV4cCwgaXN5bXAtPm5fdHlwZSwKLQkJCQkJIGlzeW1wLT5uX3NjbGFzcywgaSwgaXN5bXAtPm5fbnVtYXV4LAotCQkJCQkgKFBUUikgb3V0c3ltKTsKLQkJICBvdXRzeW0gKz0gb3N5bWVzejsKLQkJfQotCi0JICAgICAgZXN5bSArPSBpc3ltZXN6OwotCSAgICB9Ci0JfQotCi0gICAgICBpbmRleHAgKz0gYWRkOwotICAgICAgaXN5bXAgKz0gYWRkOwotICAgICAgc3ltX2hhc2ggKz0gYWRkOwotICAgIH0KLQotICAvKiBSZWxvY2F0ZSB0aGUgbGluZSBudW1iZXJzLCB1bmxlc3Mgd2UgYXJlIHN0cmlwcGluZyB0aGVtLiAgKi8KLSAgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9ub25lCi0gICAgICB8fCBmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLSAgICB7Ci0gICAgICBmb3IgKG8gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIGJmZF92bWEgb2Zmc2V0OwotCSAgYmZkX2J5dGUgKmVsaW5lOwotCSAgYmZkX2J5dGUgKmVsaW5lZW5kOwotCi0JICAvKiBGSVhNRTogSWYgU0VDX0hBU19DT05URU5UUyBpcyBub3QgZm9yIHRoZSBzZWN0aW9uLCB0aGVuCi0JICAgICBidWlsZF9saW5rX29yZGVyIGluIGxkd3JpdGUuYyB3aWxsIG5vdCBoYXZlIGNyZWF0ZWQgYQotCSAgICAgbGluayBvcmRlciwgd2hpY2ggbWVhbnMgdGhhdCB3ZSB3aWxsIG5vdCBoYXZlIHNlZW4gdGhpcwotCSAgICAgaW5wdXQgc2VjdGlvbiBpbiBfYmZkX2NvZmZfZmluYWxfbGluaywgd2hpY2ggbWVhbnMgdGhhdAotCSAgICAgd2Ugd2lsbCBub3QgaGF2ZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZSBsaW5lIG51bWJlcnMgb2YKLQkgICAgIHRoaXMgc2VjdGlvbi4gIEkgZG9uJ3QgdGhpbmsgbGluZSBudW1iZXJzIGNhbiBiZQotCSAgICAgbWVhbmluZ2Z1bCBmb3IgYSBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGhhdmUKLQkgICAgIFNFQ19IQVNfQ09OVEVOVFMgc2V0LCBidXQsIGlmIHRoZXkgZG8sIHRoaXMgbXVzdCBiZQotCSAgICAgY2hhbmdlZC4gICovCi0JICBpZiAoby0+bGluZW5vX2NvdW50ID09IDAKLQkgICAgICB8fCAoby0+b3V0cHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBvLT5saW5lX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgYmZkX3JlYWQgKGZpbmZvLT5saW5lbm9zLCBsaW5lc3osIG8tPmxpbmVub19jb3VudCwKLQkJCSAgIGlucHV0X2JmZCkgIT0gbGluZXN6ICogby0+bGluZW5vX2NvdW50KQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIG9mZnNldCA9IG8tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBvLT5vdXRwdXRfb2Zmc2V0IC0gby0+dm1hOwotCSAgZWxpbmUgPSBmaW5mby0+bGluZW5vczsKLQkgIGVsaW5lZW5kID0gZWxpbmUgKyBsaW5lc3ogKiBvLT5saW5lbm9fY291bnQ7Ci0JICBmb3IgKDsgZWxpbmUgPCBlbGluZWVuZDsgZWxpbmUgKz0gbGluZXN6KQotCSAgICB7Ci0JICAgICAgc3RydWN0IGludGVybmFsX2xpbmVubyBpbGluZTsKLQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luIChpbnB1dF9iZmQsIChQVFIpIGVsaW5lLCAoUFRSKSAmaWxpbmUpOwotCi0JICAgICAgaWYgKGlsaW5lLmxfbG5ubyAhPSAwKQotCQlpbGluZS5sX2FkZHIubF9wYWRkciArPSBvZmZzZXQ7Ci0JICAgICAgZWxzZSBpZiAoaWxpbmUubF9hZGRyLmxfc3ltbmR4ID49IDAKLQkJICAgICAgICYmICgodW5zaWduZWQgbG9uZykgaWxpbmUubF9hZGRyLmxfc3ltbmR4Ci0JCQkgICA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKSkKLQkJewotCQkgIGxvbmcgaW5keDsKLQotCQkgIGluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaWxpbmUubF9hZGRyLmxfc3ltbmR4XTsKLQotCQkgIGlmIChpbmR4IDwgMCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlc2UgbGluZSBudW1iZXJzIGFyZSBhdHRhY2hlZCB0byBhIHN5bWJvbAotCQkJIHdoaWNoIHdlIGFyZSBzdHJpcHBpbmcuICBXZSBzaG91bGQgcmVhbGx5Ci0JCQkganVzdCBkaXNjYXJkIHRoZSBsaW5lIG51bWJlcnMsIGJ1dCB0aGF0IHdvdWxkCi0JCQkgYmUgYSBwYWluIGJlY2F1c2Ugd2UgaGF2ZSBhbHJlYWR5IGNvdW50ZWQKLQkJCSB0aGVtLiAgKi8KLQkJICAgICAgaW5keCA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzOwotCQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgaWE7Ci0KLQkJICAgICAgLyogRml4IHVwIHRoZSBsbm5vcHRyIGZpZWxkIGluIHRoZSBhdXggZW50cnkgb2YKLQkJCSB0aGUgc3ltYm9sLiAgSXQgdHVybnMgb3V0IHRoYXQgd2UgY2FuJ3QgZG8KLQkJCSB0aGlzIHdoZW4gd2UgbW9kaWZ5IHRoZSBzeW1ib2wgYXV4IGVudHJpZXMsCi0JCQkgYmVjYXVzZSBnYXMgc29tZXRpbWVzIHNjcmV3cyB1cCB0aGUgbG5ub3B0cgotCQkJIGZpZWxkIGFuZCBtYWtlcyBpdCBhbiBvZmZzZXQgZnJvbSB0aGUgc3RhcnQKLQkJCSBvZiB0aGUgbGluZSBudW1iZXJzIHJhdGhlciB0aGFuIGFuIGFic29sdXRlCi0JCQkgZmlsZSBpbmRleC4gICovCi0JCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChvdXRwdXRfYmZkLAotCQkJCQkgICAgKFBUUikgKGZpbmZvLT5vdXRzeW1zCi0JCQkJCQkgICArICgoaW5keCAtIHN5bWVudF9iYXNlKQotCQkJCQkJICAgICAgKiBvc3ltZXN6KSksCi0JCQkJCSAgICAoUFRSKSAmaXMpOwotCQkgICAgICBpZiAoKElTRkNOIChpcy5uX3R5cGUpCi0JCQkgICB8fCBpcy5uX3NjbGFzcyA9PSBDX0JMT0NLKQotCQkJICAmJiBpcy5uX251bWF1eCA+PSAxKQotCQkJewotCQkJICBQVFIgYXV4cHRyOwotCi0JCQkgIGF1eHB0ciA9IChQVFIpIChmaW5mby0+b3V0c3ltcwotCQkJCQkgICsgKChpbmR4IC0gc3ltZW50X2Jhc2UgKyAxKQotCQkJCQkgICAgICogb3N5bWVzeikpOwotCQkJICBiZmRfY29mZl9zd2FwX2F1eF9pbiAob3V0cHV0X2JmZCwgYXV4cHRyLAotCQkJCQkJaXMubl90eXBlLCBpcy5uX3NjbGFzcywKLQkJCQkJCTAsIGlzLm5fbnVtYXV4LCAoUFRSKSAmaWEpOwotCQkJICBpYS54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgPQotCQkJICAgIChvLT5vdXRwdXRfc2VjdGlvbi0+bGluZV9maWxlcG9zCi0JCQkgICAgICsgby0+b3V0cHV0X3NlY3Rpb24tPmxpbmVub19jb3VudCAqIGxpbmVzegotCQkJICAgICArIGVsaW5lIC0gZmluZm8tPmxpbmVub3MpOwotCQkJICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpYSwKLQkJCQkJCSBpcy5uX3R5cGUsIGlzLm5fc2NsYXNzLCAwLAotCQkJCQkJIGlzLm5fbnVtYXV4LCBhdXhwdHIpOwotCQkJfQotCQkgICAgfQotCi0JCSAgaWxpbmUubF9hZGRyLmxfc3ltbmR4ID0gaW5keDsKLQkJfQotCi0JICAgICAgYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaWxpbmUsIChQVFIpIGVsaW5lKTsKLQkgICAgfQotCi0JICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCQkoby0+b3V0cHV0X3NlY3Rpb24tPmxpbmVfZmlsZXBvcwotCQkJICsgby0+b3V0cHV0X3NlY3Rpb24tPmxpbmVub19jb3VudCAqIGxpbmVzeiksCi0JCQlTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF93cml0ZSAoZmluZm8tPmxpbmVub3MsIGxpbmVzeiwgby0+bGluZW5vX2NvdW50LAotCQkJICAgIG91dHB1dF9iZmQpICE9IGxpbmVzeiAqIG8tPmxpbmVub19jb3VudCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICs9IG8tPmxpbmVub19jb3VudDsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIHN3YXBwZWQgb3V0IGEgQ19GSUxFIHN5bWJvbCwgZ3Vlc3MgdGhhdCB0aGUgbmV4dCBDX0ZJTEUKLSAgICAgc3ltYm9sIHdpbGwgYmUgdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGUgbmV4dCBpbnB1dCBmaWxlLiAgSW4gdGhlCi0gICAgIG5vcm1hbCBjYXNlLCB0aGlzIHdpbGwgc2F2ZSB1cyBmcm9tIHdyaXRpbmcgb3V0IHRoZSBDX0ZJTEUgc3ltYm9sCi0gICAgIGFnYWluLiAgKi8KLSAgaWYgKGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggIT0gLTEKLSAgICAgICYmIChiZmRfc2l6ZV90eXBlKSBmaW5mby0+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+b3V0cHV0X3NlY3Rpb24sCi0JCQkJCSAgY29udGVudHMsIG8tPm91dHB1dF9vZmZzZXQsCi0JCQkJCSAgKG8tPl9jb29rZWRfc2l6ZSAhPSAwCi0JCQkJCSAgID8gby0+X2Nvb2tlZF9zaXplCi0JCQkJCSAgIDogby0+X3Jhd19zaXplKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgKF9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicwotCQkgKG91dHB1dF9iZmQsICZjb2ZmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+c3RhYl9pbmZvLAotCQkgIG8sICZzZWNkYXRhLT5zdGFiX2luZm8sIGNvbnRlbnRzKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmICghIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeSkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChpbnB1dF9iZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIGdsb2JhbCBzeW1ib2wuICBDYWxsZWQgdmlhIGNvZmZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0gKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm8gPSAoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICopIGRhdGE7Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgb3V0cHV0X2JmZCA9IGZpbmZvLT5vdXRwdXRfYmZkOwotCi0gIGlmIChoLT5pbmR4ID49IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGgtPmluZHggIT0gLTIKLSAgICAgICYmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0JICB8fCAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICAmJiAoYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLAotCQkJCSAgIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGZhbHNlLCBmYWxzZSkKLQkJICA9PSBOVUxMKSkpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9uZXc6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLSAgICAgIGlzeW0ubl9zY251bSA9IE5fVU5ERUY7Ci0gICAgICBpc3ltLm5fdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgIHsKLQlhc2VjdGlvbiAqc2VjOwotCi0Jc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQlpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKQotCSAgaXN5bS5uX3NjbnVtID0gTl9BQlM7Ci0JZWxzZQotCSAgaXN5bS5uX3NjbnVtID0gc2VjLT50YXJnZXRfaW5kZXg7Ci0JaXN5bS5uX3ZhbHVlID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQlpZiAoISBvYmpfcGUgKGZpbmZvLT5vdXRwdXRfYmZkKSkKLQkgIGlzeW0ubl92YWx1ZSArPSBzZWMtPnZtYTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIGlzeW0ubl9zY251bSA9IE5fVU5ERUY7Ci0gICAgICBpc3ltLm5fdmFsdWUgPSBoLT5yb290LnUuYy5zaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3dhcm5pbmc6Ci0gICAgICAvKiBKdXN0IGlnbm9yZSB0aGVzZS4gIFRoZXkgY2FuJ3QgYmUgaGFuZGxlZCBhbnlob3cuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChzdHJsZW4gKGgtPnJvb3Qucm9vdC5zdHJpbmcpIDw9IFNZTU5NTEVOKQotICAgIHN0cm5jcHkgKGlzeW0uX24uX25fbmFtZSwgaC0+cm9vdC5yb290LnN0cmluZywgU1lNTk1MRU4pOwotICBlbHNlCi0gICAgewotICAgICAgYm9vbGVhbiBoYXNoOwotICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0gICAgICBoYXNoID0gdHJ1ZTsKLSAgICAgIGlmICgob3V0cHV0X2JmZC0+ZmxhZ3MgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSAhPSAwKQotCWhhc2ggPSBmYWxzZTsKLSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLT5zdHJ0YWIsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGhhc2gsCi0JCQkJIGZhbHNlKTsKLSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQl7Ci0JICBmaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpc3ltLl9uLl9uX24uX25femVyb2VzID0gMDsKLSAgICAgIGlzeW0uX24uX25fbi5fbl9vZmZzZXQgPSBTVFJJTkdfU0laRV9TSVpFICsgaW5keDsKLSAgICB9Ci0KLSAgaXN5bS5uX3NjbGFzcyA9IGgtPmNsYXNzOwotICBpc3ltLm5fdHlwZSA9IGgtPnR5cGU7Ci0KLSAgaWYgKGlzeW0ubl9zY2xhc3MgPT0gQ19OVUxMKQotICAgIGlzeW0ubl9zY2xhc3MgPSBDX0VYVDsKLQotICAvKiBJZiBkb2luZyB0YXNrIGxpbmtpbmcgYW5kIHRoaXMgaXMgdGhlIHBhc3Mgd2hlcmUgd2UgY29udmVydAotICAgICBkZWZpbmVkIGdsb2JhbHMgdG8gc3RhdGljcywgdGhlbiBkbyB0aGF0IGNvbnZlcnNpb24gbm93LiAgSWYgdGhlCi0gICAgIHN5bWJvbCBpcyBub3QgYmVpbmcgY29udmVydGVkLCBqdXN0IGlnbm9yZSBpdCBhbmQgaXQgd2lsbCBiZQotICAgICBvdXRwdXQgZHVyaW5nIGEgbGF0ZXIgcGFzcy4gKi8KLSAgaWYgKGZpbmZvLT5nbG9iYWxfdG9fc3RhdGljKQotICAgIHsKLSAgICAgIGlmIChpc3ltLm5fc2NsYXNzICE9IENfRVhUCi0JICAmJiBpc3ltLm5fc2NsYXNzICE9IENfV0VBS0VYVAotCSAgJiYgKCEgb2JqX3BlIChvdXRwdXRfYmZkKSB8fCBpc3ltLm5fc2NsYXNzICE9IENfTlRfV0VBSykpCi0JewotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgICAgaXN5bS5uX3NjbGFzcyA9IENfU1RBVDsKLSAgICB9Ci0KLSAgaXN5bS5uX251bWF1eCA9IGgtPm51bWF1eDsKLSAgCi0gIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlzeW0sIChQVFIpIGZpbmZvLT5vdXRzeW1zKTsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKG91dHB1dF9iZmQpOwotCi0gIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJKG9ial9zeW1fZmlsZXBvcyAob3V0cHV0X2JmZCkKLQkJICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpICogc3ltZXN6KSwKLQkJU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF93cml0ZSAoZmluZm8tPm91dHN5bXMsIHN5bWVzeiwgMSwgb3V0cHV0X2JmZCkgIT0gc3ltZXN6KQotICAgIHsKLSAgICAgIGZpbmZvLT5mYWlsZWQgPSB0cnVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBoLT5pbmR4ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpOwotCi0gICsrb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpOwotCi0gIC8qIFdyaXRlIG91dCBhbnkgYXNzb2NpYXRlZCBhdXggZW50cmllcy4gIFRoZXJlIG5vcm1hbGx5IHdpbGwgYmUKLSAgICAgbm9uZS4gIElmIHRoZXJlIGFyZSBhbnksIEkgaGF2ZSBubyBpZGVhIGhvdyB0byBtb2RpZnkgdGhlbS4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBpc3ltLm5fbnVtYXV4OyBpKyspCi0gICAgewotICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAoaC0+YXV4ICsgaSksIGlzeW0ubl90eXBlLAotCQkJICAgICBpc3ltLm5fc2NsYXNzLCBpLCBpc3ltLm5fbnVtYXV4LAotCQkJICAgICAoUFRSKSBmaW5mby0+b3V0c3ltcyk7Ci0gICAgICBpZiAoYmZkX3dyaXRlIChmaW5mby0+b3V0c3ltcywgc3ltZXN6LCAxLCBvdXRwdXRfYmZkKSAhPSBzeW1lc3opCi0JewotCSAgZmluZm8tPmZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgKytvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGFzayBnbG9iYWwgc3ltYm9scywgY29udmVydGluZyB0aGVtIHRvIHN0YXRpY3MuICBDYWxsZWQKLSAgIHZpYSBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZS4gIENhbGxzIGJmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0gdG8gZG8KLSAgIHRoZSBkaXJ0eSB3b3JrLCBpZiB0aGUgc3ltYm9sIHdlIGFyZSBwcm9jZXNzaW5nIG5lZWRzIGNvbnZlcnNpb24uICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl93cml0ZV90YXNrX2dsb2JhbHMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm8gPSAoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICopIGRhdGE7Ci0gIGJvb2xlYW4gcnRudmFsID0gdHJ1ZTsKLSAgYm9vbGVhbiBzYXZlX2dsb2JhbF90b19zdGF0aWM7Ci0KLSAgaWYgKGgtPmluZHggPCAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCXsKLQljYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQljYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgIHNhdmVfZ2xvYmFsX3RvX3N0YXRpYyA9IGZpbmZvLT5nbG9iYWxfdG9fc3RhdGljOwotCSAgZmluZm8tPmdsb2JhbF90b19zdGF0aWMgPSB0cnVlOwotCSAgcnRudmFsID0gX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0gKGgsIGRhdGEpOwotCSAgZmluZm8tPmdsb2JhbF90b19zdGF0aWMgPSBzYXZlX2dsb2JhbF90b19zdGF0aWM7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChydG52YWwpOwotfQotCi0vKiBIYW5kbGUgYSBsaW5rIG9yZGVyIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGdlbmVyYXRlIGEgcmVsb2MuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfcmVsb2NfbGlua19vcmRlciAob3V0cHV0X2JmZCwgZmluZm8sIG91dHB1dF9zZWN0aW9uLCBsaW5rX29yZGVyKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaF9wdHI7Ci0KLSAgaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKG91dHB1dF9iZmQsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+cmVsb2MpOwotICBpZiAoaG93dG8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kICE9IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICAgYmZkX2J5dGUgKmJ1ZjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJvb2xlYW4gb2s7Ci0KLSAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfem1hbGxvYyAoc2l6ZSk7Ci0gICAgICBpZiAoYnVmID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBvdXRwdXRfYmZkLAotCQkJCSAgICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kLCBidWYpOwotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGZpbmZvLT5pbmZvLAotCQkgIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgPyBiZmRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCSAgICAgICBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUuc2VjdGlvbikKLQkJICAgOiBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSksCi0JCSAgaG93dG8tPm5hbWUsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kLAotCQkgIChiZmQgKikgTlVMTCwgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHsKLQkgICAgICBmcmVlIChidWYpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgb2sgPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uLCAoUFRSKSBidWYsCi0JCQkJICAgICAoZmlsZV9wdHIpIGxpbmtfb3JkZXItPm9mZnNldCwgc2l6ZSk7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgaWYgKCEgb2spCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTdG9yZSB0aGUgcmVsb2MgaW5mb3JtYXRpb24gaW4gdGhlIHJpZ2h0IHBsYWNlLiAgSXQgd2lsbCBnZXQKLSAgICAgc3dhcHBlZCBhbmQgd3JpdHRlbiBvdXQgYXQgdGhlIGVuZCBvZiB0aGUgZmluYWxfbGluayByb3V0aW5lLiAgKi8KLQotICBpcmVsID0gKGZpbmZvLT5zZWN0aW9uX2luZm9bb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleF0ucmVsb2NzCi0JICArIG91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCk7Ci0gIHJlbF9oYXNoX3B0ciA9IChmaW5mby0+c2VjdGlvbl9pbmZvW291dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMKLQkJICArIG91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCk7Ci0KLSAgbWVtc2V0IChpcmVsLCAwLCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpOwotICAqcmVsX2hhc2hfcHRyID0gTlVMTDsKLQotICBpcmVsLT5yX3ZhZGRyID0gb3V0cHV0X3NlY3Rpb24tPnZtYSArIGxpbmtfb3JkZXItPm9mZnNldDsKLQotICBpZiAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyKQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgdG8gc29tZWhvdyBsb2NhdGUgYSBzeW1ib2wgaW4gdGhlIHJpZ2h0IHNlY3Rpb24uICBUaGUKLSAgICAgICAgIHN5bWJvbCBtdXN0IGVpdGhlciBoYXZlIGEgdmFsdWUgb2YgemVybywgb3Igd2UgbXVzdCBhZGp1c3QKLSAgICAgICAgIHRoZSBhZGRlbmQgYnkgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBGSVhNRTogV3JpdGUgdGhpcwotICAgICAgICAgd2hlbiB3ZSBuZWVkIGl0LiAgVGhlIG9sZCBsaW5rZXIgY291bGRuJ3QgaGFuZGxlIHRoaXMgYW55aG93LiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgICAgKnJlbF9oYXNoX3B0ciA9IE5VTEw7Ci0gICAgICBpcmVsLT5yX3N5bW5keCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywKLQkJCQkJIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkJCQkgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0gICAgICBpZiAoaCAhPSBOVUxMKQotCXsKLQkgIGlmIChoLT5pbmR4ID49IDApCi0JICAgIGlyZWwtPnJfc3ltbmR4ID0gaC0+aW5keDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFNldCB0aGUgaW5kZXggdG8gLTIgdG8gZm9yY2UgdGhpcyBzeW1ib2wgdG8gZ2V0Ci0JCSB3cml0dGVuIG91dC4gICovCi0JICAgICAgaC0+aW5keCA9IC0yOwotCSAgICAgICpyZWxfaGFzaF9wdHIgPSBoOwotCSAgICAgIGlyZWwtPnJfc3ltbmR4ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkgKGZpbmZvLT5pbmZvLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwgKGJmZCAqKSBOVUxMLAotCQkgIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpcmVsLT5yX3N5bW5keCA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBGSVhNRTogSXMgdGhpcyBhbHdheXMgcmlnaHQ/ICAqLwotICBpcmVsLT5yX3R5cGUgPSBob3d0by0+dHlwZTsKLQotICAvKiByX3NpemUgaXMgb25seSB1c2VkIG9uIHRoZSBSUy82MDAwLCB3aGljaCBuZWVkcyBpdHMgb3duIGxpbmtlcgotICAgICByb3V0aW5lcyBhbnlob3cuICByX2V4dGVybiBpcyBvbmx5IHVzZWQgZm9yIEVDT0ZGLiAgKi8KLQotICAvKiBGSVhNRTogV2hhdCBpcyB0aGUgcmlnaHQgdmFsdWUgZm9yIHJfb2Zmc2V0PyAgSXMgemVybyBPSz8gICovCi0KLSAgKytvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEEgYmFzaWMgcmVsb2MgaGFuZGxpbmcgcm91dGluZSB3aGljaCBtYXkgYmUgdXNlZCBieSBwcm9jZXNzb3JzIHdpdGgKLSAgIHNpbXBsZSByZWxvY3MuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsCi0JCQkJICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsCi0JCQkJICAgIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgIGJmZF92bWEgYWRkZW5kOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsgICAgCi0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIC8qIENPRkYgdHJlYXRzIGNvbW1vbiBzeW1ib2xzIGluIG9uZSBvZiB0d28gd2F5cy4gIEVpdGhlciB0aGUKLSAgICAgICAgIHNpemUgb2YgdGhlIHN5bWJvbCBpcyBpbmNsdWRlZCBpbiB0aGUgc2VjdGlvbiBjb250ZW50cywgb3IgaXQKLSAgICAgICAgIGlzIG5vdC4gIFdlIGFzc3VtZSB0aGF0IHRoZSBzaXplIGlzIG5vdCBpbmNsdWRlZCwgYW5kIGZvcmNlCi0gICAgICAgICB0aGUgcnR5cGVfdG9faG93dG8gZnVuY3Rpb24gdG8gYWRqdXN0IHRoZSBhZGRlbmQgYXMgbmVlZGVkLiAgKi8KLQotICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCWFkZGVuZCA9IC0gc3ltLT5uX3ZhbHVlOwotICAgICAgZWxzZQotCWFkZGVuZCA9IDA7Ci0KLQotICAgICAgaG93dG8gPSBiZmRfY29mZl9ydHlwZV90b19ob3d0byAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwsIGgsCi0JCQkJICAgICAgIHN5bSwgJmFkZGVuZCk7Ci0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB0aGVuIHdlIGNhbiBqdXN0IGlnbm9yZQotICAgICAgICAgYSBQQyByZWxhdGl2ZSByZWxvYyB0aGF0IGlzIHBjcmVsX29mZnNldC4gIEl0IHdpbGwgYWxyZWFkeQotICAgICAgICAgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZS4gIElmIHRoaXMgaXMgbm90IGEgcmVsb2NhdGVhYmxlIGxpbmssCi0gICAgICAgICB0aGVuIHdlIHNob3VsZCBpZ25vcmUgdGhlIHN5bWJvbCB2YWx1ZS4gICovCi0gICAgICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlICYmIGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JewotCSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgY29udGludWU7Ci0JICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JICAgIGFkZGVuZCArPSBzeW0tPm5fdmFsdWU7Ci0JfQotCi0gICAgICB2YWwgPSAwOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0gICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlKTsKLQkgICAgICBpZiAoISBvYmpfcGUgKGlucHV0X2JmZCkpCi0JCXZhbCAtPSBzZWMtPnZtYTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgfQotCi0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaW5mby0+YmFzZV9maWxlKQotCXsKLQkgIC8qIEVtaXQgYSByZWxvYyBpZiB0aGUgYmFja2VuZCB0aGlua3MgaXQgbmVlZHMgaXQuICovCi0JICBpZiAoc3ltICYmIHBlX2RhdGEgKG91dHB1dF9iZmQpLT5pbl9yZWxvY19wIChvdXRwdXRfYmZkLCBob3d0bykpCi0JICAgIHsKLQkgICAgICAvKiBSZWxvY2F0aW9uIHRvIGEgc3ltYm9sIGluIGEgc2VjdGlvbiB3aGljaCBpc24ndAotCQkgYWJzb2x1dGUuICBXZSBvdXRwdXQgdGhlIGFkZHJlc3MgaGVyZSB0byBhIGZpbGUuCi0JCSBUaGlzIGZpbGUgaXMgdGhlbiByZWFkIGJ5IGRsbHRvb2wgd2hlbiBnZW5lcmF0aW5nIHRoZQotCQkgcmVsb2Mgc2VjdGlvbi4gIE5vdGUgdGhhdCB0aGUgYmFzZSBmaWxlIGlzIG5vdAotCQkgcG9ydGFibGUgYmV0d2VlbiBzeXN0ZW1zLiAgV2Ugd3JpdGUgb3V0IGEgbG9uZyBoZXJlLAotCQkgYW5kIGRsbHRvb2wgcmVhZHMgaW4gYSBsb25nLiAgKi8KLQkgICAgICBsb25nIGFkZHIgPSAocmVsLT5yX3ZhZGRyIAotCQkJICAgLSBpbnB1dF9zZWN0aW9uLT52bWEgCi0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgCi0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCSAgICAgIGlmIChjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5wZSkKLQkJYWRkciAtPSBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotCSAgICAgIGlmIChmd3JpdGUgKCZhZGRyLCAxLCBzaXplb2YgKGxvbmcpLCAoRklMRSAqKSBpbmZvLT5iYXNlX2ZpbGUpCi0JCSAgIT0gc2l6ZW9mIChsb25nKSkKLQkJewotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQl9Ci0gIAotICAgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCWNvbnRlbnRzLAotCQkJCQlyZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEsCi0JCQkJCXZhbCwgYWRkZW5kKTsKLQotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGJhZCByZWxvYyBhZGRyZXNzIDB4JWx4IGluIHNlY3Rpb24gYCVzJyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkgICAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIsCi0JICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgICBuYW1lID0gIipBQlMqIjsKLQkgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICBlbHNlCi0JICAgICAgewotCQluYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsIHN5bSwgYnVmKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmZzd2FwLmggYi9iZmQvY29mZnN3YXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJjMTgwZi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZnN3YXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxNyArMCwwIEBACi0vKiBHZW5lcmljIENPRkYgc3dhcHBpbmcgcm91dGluZXMsIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHVzZWQgdG8gc3dhcCBDT0ZGIGRhdGEuICBJdCBpcyBhIGhlYWRlcgotICAgZmlsZSBiZWNhdXNlIHRoZSBkZXRhaWxzIG9mIHN3YXBwaW5nIGRlcGVuZCBvbiB0aGUgZGV0YWlscyBvZiB0aGUKLSAgIHN0cnVjdHVyZXMgdXNlZCBieSBlYWNoIENPRkYgaW1wbGVtZW50YXRpb24uICBUaGlzIGlzIGluY2x1ZGVkIGJ5Ci0gICBjb2ZmY29kZS5oLCBhcyB3ZWxsIGFzIGJ5IHRoZSBFQ09GRiBiYWNrZW5kLgotCi0gICBBbnkgZmlsZSB3aGljaCB1c2VzIHRoaXMgbXVzdCBmaXJzdCBpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiIGFuZAotICAgImNvZmYvQ1BVLmgiLiAgVGhlIGZ1bmN0aW9ucyB3aWxsIHRoZW4gYmUgY29ycmVjdCBmb3IgdGhhdCBDUFUuICAqLwotCi0jaWZuZGVmIElNQUdFX0JBU0UKLSNkZWZpbmUgSU1BR0VfQkFTRSAwCi0jZW5kaWYKLQotI2RlZmluZSBQVVRXT1JEIGJmZF9oX3B1dF8zMgotI2RlZmluZSBQVVRIQUxGIGJmZF9oX3B1dF8xNgotI2RlZmluZQlQVVRCWVRFIGJmZF9oX3B1dF84Ci0KLSNpZm5kZWYgR0VUX0ZDTl9MTk5PUFRSCi0jZGVmaW5lIEdFVF9GQ05fTE5OT1BUUihhYmZkLCBleHQpICBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKQotI2VuZGlmCi0KLSNpZm5kZWYgR0VUX0ZDTl9FTkRORFgKLSNkZWZpbmUgR0VUX0ZDTl9FTkRORFgoYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4KQotI2VuZGlmCi0KLSNpZm5kZWYgUFVUX0ZDTl9MTk5PUFRSCi0jZGVmaW5lIFBVVF9GQ05fTE5OT1BUUihhYmZkLCBpbiwgZXh0KSAgUFVUV09SRChhYmZkLCAgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNlbmRpZgotI2lmbmRlZiBQVVRfRkNOX0VORE5EWAotI2RlZmluZSBQVVRfRkNOX0VORE5EWChhYmZkLCBpbiwgZXh0KSBQVVRXT1JEKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCkKLSNlbmRpZgotI2lmbmRlZiBHRVRfTE5TWl9MTk5PCi0jZGVmaW5lIEdFVF9MTlNaX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0xOU1pfU0laRQotI2RlZmluZSBHRVRfTE5TWl9TSVpFKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9MTlNaX0xOTk8KLSNkZWZpbmUgUFVUX0xOU1pfTE5OTyhhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKWV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0xOU1pfU0laRQotI2RlZmluZSBQVVRfTE5TWl9TSVpFKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLCBpbiwgKGJmZF9ieXRlKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOX1NDTkxFTgotI2RlZmluZSBHRVRfU0NOX1NDTkxFTihhYmZkLCAgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9zY25sZW4pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTl9OUkVMT0MKLSNkZWZpbmUgR0VUX1NDTl9OUkVMT0MoYWJmZCwgIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ucmVsb2MpCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTl9OTElOTk8KLSNkZWZpbmUgR0VUX1NDTl9OTElOTk8oYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ubGlubm8pCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTl9TQ05MRU4KLSNkZWZpbmUgUFVUX1NDTl9TQ05MRU4oYWJmZCxpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfc2NubGVuKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05fTlJFTE9DCi0jZGVmaW5lIFBVVF9TQ05fTlJFTE9DKGFiZmQsaW4sIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsIGluLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbnJlbG9jKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05fTkxJTk5PCi0jZGVmaW5lIFBVVF9TQ05fTkxJTk5PKGFiZmQsaW4sIGV4dCkgIGJmZF9oX3B1dF8xNihhYmZkLGluLCAoYmZkX2J5dGUgICopIGV4dC0+eF9zY24ueF9ubGlubm8pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0xJTkVOT19MTk5PCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZW5kaWYKLSNpZm5kZWYgUFVUX0xJTkVOT19MTk5PCi0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZW5kaWYKLQotLyogVGhlIGZfc3ltcHRyIGZpZWxkIGluIHRoZSBmaWxlaGRyIGlzIHNvbWV0aW1lcyA2NCBiaXRzLiAgKi8KLSNpZm5kZWYgR0VUX0ZJTEVIRFJfU1lNUFRSCi0jZGVmaW5lIEdFVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfRklMRUhEUl9TWU1QVFIKLSNkZWZpbmUgUFVUX0ZJTEVIRFJfU1lNUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLS8qIFNvbWUgZmllbGRzIGluIHRoZSBhb3V0aGRyIGFyZSBzb21ldGltZXMgNjQgYml0cy4gICovCi0jaWZuZGVmIEdFVF9BT1VUSERSX1RTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX1RTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX1RTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX1RTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0RTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX0RTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0RTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX0RTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0JTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX0JTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0JTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX0JTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0VOVFJZCi0jZGVmaW5lIEdFVF9BT1VUSERSX0VOVFJZIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0VOVFJZCi0jZGVmaW5lIFBVVF9BT1VUSERSX0VOVFJZIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfVEVYVF9TVEFSVCBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9URVhUX1NUQVJUCi0jZGVmaW5lIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfREFUQV9TVEFSVAotI2RlZmluZSBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCBiZmRfaF9wdXRfMzIKLSNlbmRpZgotCi0vKiBTb21lIGZpZWxkcyBpbiB0aGUgc2NuaGRyIGFyZSBzb21ldGltZXMgNjQgYml0cy4gICovCi0jaWZuZGVmIEdFVF9TQ05IRFJfUEFERFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9QQUREUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1BBRERSCi0jZGVmaW5lIFBVVF9TQ05IRFJfUEFERFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9WQUREUgotI2RlZmluZSBHRVRfU0NOSERSX1ZBRERSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfVkFERFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9WQUREUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX1NJWkUKLSNkZWZpbmUgR0VUX1NDTkhEUl9TSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfU0laRQotI2RlZmluZSBQVVRfU0NOSERSX1NJWkUgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9TQ05QVFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9TQ05QVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9TQ05QVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9TQ05QVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9SRUxQVFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9SRUxQVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9SRUxQVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9SRUxQVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9MTk5PUFRSCi0jZGVmaW5lIEdFVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX0xOTk9QVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9MTk5PUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfTlJFTE9DCi0jZGVmaW5lIEdFVF9TQ05IRFJfTlJFTE9DIGJmZF9oX2dldF8xNgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfTlJFTE9DCi0jZGVmaW5lIFBVVF9TQ05IRFJfTlJFTE9DIGJmZF9oX3B1dF8xNgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfTkxOTk8KLSNkZWZpbmUgR0VUX1NDTkhEUl9OTE5OTyBiZmRfaF9nZXRfMTYKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX05MTk5PCi0jZGVmaW5lIFBVVF9TQ05IRFJfTkxOTk8gYmZkX2hfcHV0XzE2Ci0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9GTEFHUwotI2RlZmluZSBHRVRfU0NOSERSX0ZMQUdTIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfRkxBR1MKLSNkZWZpbmUgUFVUX1NDTkhEUl9GTEFHUyBiZmRfaF9wdXRfMzIKLSNlbmRpZgotCi0KLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9hb3V0aGRyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfYW91dGhkcl9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfc2NuaGRyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfc2NuaGRyX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9maWxlaGRyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci0jaWZuZGVmIE5PX0NPRkZfUkVMT0NTCi1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfcmVsb2NfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9yZWxvY19vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci0jZW5kaWYgLyogTk9fQ09GRl9SRUxPQ1MgKi8KLSNpZm5kZWYgTk9fQ09GRl9TWU1CT0xTCi1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfc3ltX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfc3ltX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9hdXhfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgaW50LCBpbnQsIGludCwgaW50LCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX2F1eF9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgaW50LCBpbnQsIGludCwgaW50LCBQVFIpKTsKLSNlbmRpZiAvKiBOT19DT0ZGX1NZTUJPTFMgKi8KLSNpZm5kZWYgTk9fQ09GRl9MSU5FTk9TCi1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfbGluZW5vX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfbGluZW5vX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLSNlbmRpZiAvKiBOT19DT0ZGX0xJTkVOT1MgKi8KLQotI2lmbmRlZiBOT19DT0ZGX1JFTE9DUwotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgc3JjOwotICAgICBQVFIgZHN0OwotewotICBSRUxPQyAqcmVsb2Nfc3JjID0gKFJFTE9DICopIHNyYzsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY19kc3QgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopIGRzdDsKLQotICByZWxvY19kc3QtPnJfdmFkZHIgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopcmVsb2Nfc3JjLT5yX3ZhZGRyKTsKLSAgcmVsb2NfZHN0LT5yX3N5bW5keCA9IGJmZF9oX2dldF9zaWduZWRfMzIoYWJmZCwgKGJmZF9ieXRlICopIHJlbG9jX3NyYy0+cl9zeW1uZHgpOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIHJlbG9jX2RzdC0+cl90eXBlID0gYmZkX2hfZ2V0XzgoYWJmZCwgcmVsb2Nfc3JjLT5yX3R5cGUpOwotICByZWxvY19kc3QtPnJfc2l6ZSA9IGJmZF9oX2dldF84KGFiZmQsIHJlbG9jX3NyYy0+cl9zaXplKTsKLSNlbHNlCi0gIHJlbG9jX2RzdC0+cl90eXBlID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSByZWxvY19zcmMtPnJfdHlwZSk7Ci0jZW5kaWYKLQotI2lmZGVmIFNXQVBfSU5fUkVMT0NfT0ZGU0VUCi0gIHJlbG9jX2RzdC0+cl9vZmZzZXQgPSBTV0FQX0lOX1JFTE9DX09GRlNFVChhYmZkLAotCQkJCQkgICAgIChiZmRfYnl0ZSAqKSByZWxvY19zcmMtPnJfb2Zmc2V0KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJc3JjOwotICAgICBQVFIJZHN0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jX3NyYyA9IChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKilzcmM7Ci0gIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqcmVsb2NfZHN0ID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKWRzdDsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIHJlbG9jX3NyYy0+cl92YWRkciwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl92YWRkcik7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCByZWxvY19zcmMtPnJfc3ltbmR4LCAoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX3N5bW5keCk7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHJlbG9jX3NyYy0+cl90eXBlLCAoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX3R5cGUpOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgcmVsb2Nfc3JjLT5yX3NpemUsIChiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfc2l6ZSk7Ci0jZWxzZQotICBiZmRfaF9wdXRfMTYoYWJmZCwgcmVsb2Nfc3JjLT5yX3R5cGUsIChiZmRfYnl0ZSAqKQotCSAgICAgICByZWxvY19kc3QtPnJfdHlwZSk7Ci0jZW5kaWYKLQotI2lmZGVmIFNXQVBfT1VUX1JFTE9DX09GRlNFVAotICBTV0FQX09VVF9SRUxPQ19PRkZTRVQoYWJmZCwKLQkJCXJlbG9jX3NyYy0+cl9vZmZzZXQsCi0JCQkoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX29mZnNldCk7Ci0jZW5kaWYKLSNpZmRlZiBTV0FQX09VVF9SRUxPQ19FWFRSQQotICBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLHJlbG9jX3NyYywgcmVsb2NfZHN0KTsKLSNlbmRpZgotCi0gIHJldHVybiBSRUxTWjsKLX0KLQotI2VuZGlmIC8qIE5PX0NPRkZfUkVMT0NTICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfZmlsZWhkcl9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIJICAgICBzcmM7Ci0gICAgIFBUUgkgICAgIGRzdDsKLXsKLSAgRklMSERSICpmaWxlaGRyX3NyYyA9IChGSUxIRFIgKikgc3JjOwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9kc3QgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZHN0OwotI2lmZGVmIENPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUFJFCi0gIENPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUFJFIChhYmZkLCBzcmMsIGRzdCk7Ci0jZW5kaWYKLSAgZmlsZWhkcl9kc3QtPmZfbWFnaWMgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGZpbGVoZHJfc3JjLT5mX21hZ2ljKTsKLSAgZmlsZWhkcl9kc3QtPmZfbnNjbnMgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX25zY25zKTsKLSAgZmlsZWhkcl9kc3QtPmZfdGltZGF0ID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl90aW1kYXQpOwotICBmaWxlaGRyX2RzdC0+Zl9zeW1wdHIgPQotICAgIEdFVF9GSUxFSERSX1NZTVBUUiAoYWJmZCwgKGJmZF9ieXRlICopIGZpbGVoZHJfc3JjLT5mX3N5bXB0cik7Ci0gIGZpbGVoZHJfZHN0LT5mX25zeW1zID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9uc3ltcyk7Ci0gIGZpbGVoZHJfZHN0LT5mX29wdGhkciA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfb3B0aGRyKTsKLSAgZmlsZWhkcl9kc3QtPmZfZmxhZ3MgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX2ZsYWdzKTsKLSNpZmRlZiBUSUM4MF9UQVJHRVRfSUQKLSAgZmlsZWhkcl9kc3QtPmZfdGFyZ2V0X2lkID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl90YXJnZXRfaWQpOwotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BPU1QKLSAgQ09GRl9BREpVU1RfRklMRUhEUl9JTl9QT1NUIChhYmZkLCBzcmMsIGRzdCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljICB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW47Ci0gICAgIFBUUglvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2luID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopaW47Ci0gIEZJTEhEUiAqZmlsZWhkcl9vdXQgPSAoRklMSERSICopb3V0OwotCi0jaWZkZWYgQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUFJFCi0gIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BSRSAoYWJmZCwgaW4sIG91dCk7Ci0jZW5kaWYKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfbWFnaWMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9tYWdpYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX25zY25zLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbnNjbnMpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+Zl90aW1kYXQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl90aW1kYXQpOwotICBQVVRfRklMRUhEUl9TWU1QVFIgKGFiZmQsIChiZmRfdm1hKSBmaWxlaGRyX2luLT5mX3N5bXB0ciwKLQkJICAgICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX3N5bXB0cik7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBmaWxlaGRyX2luLT5mX25zeW1zLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbnN5bXMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9vcHRoZHIsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9vcHRoZHIpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9mbGFncywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX2ZsYWdzKTsKLSNpZmRlZiBUSUM4MF9UQVJHRVRfSUQKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfdGFyZ2V0X2lkLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfdGFyZ2V0X2lkKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUE9TVAotICBDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QT1NUIChhYmZkLCBpbiwgb3V0KTsKLSNlbmRpZgotICByZXR1cm4gRklMSFNaOwotfQotCi0KLSNpZm5kZWYgTk9fQ09GRl9TWU1CT0xTCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCBleHQxLCBpbjEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgZXh0MTsKLSAgICAgUFRSIGluMTsKLXsKLSAgU1lNRU5UICpleHQgPSAoU1lNRU5UICopZXh0MTsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAgICAgICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopaW4xOwotCi0gIGlmKCBleHQtPmUuZV9uYW1lWzBdID09IDApIHsKLSAgICBpbi0+X24uX25fbi5fbl96ZXJvZXMgPSAwOwotICAgIGluLT5fbi5fbl9uLl9uX29mZnNldCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lLmUuZV9vZmZzZXQpOwotICB9Ci0gIGVsc2UgewotI2lmIFNZTU5NTEVOICE9IEVfU1lNTk1MRU4KLSAgIC0+IEVycm9yLCB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBTWU1OTUxFTiE7Ci0jZWxzZQotICAgIG1lbWNweShpbi0+X24uX25fbmFtZSwgZXh0LT5lLmVfbmFtZSwgU1lNTk1MRU4pOwotI2VuZGlmCi0gIH0KLSAgaW4tPm5fdmFsdWUgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV92YWx1ZSk7IAotICBpbi0+bl9zY251bSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3NjbnVtKTsKLSAgaWYgKHNpemVvZihleHQtPmVfdHlwZSkgPT0gMil7Ci0gICAgaW4tPm5fdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICB9Ci0gIGVsc2UgewotICAgIGluLT5uX3R5cGUgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgfQotICBpbi0+bl9zY2xhc3MgPSBiZmRfaF9nZXRfOChhYmZkLCBleHQtPmVfc2NsYXNzKTsKLSAgaW4tPm5fbnVtYXV4ID0gYmZkX2hfZ2V0XzgoYWJmZCwgZXh0LT5lX251bWF1eCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCBpbnAsIGV4dHApCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWlucDsKLSAgICAgUFRSCWV4dHA7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbnA7Ci0gIFNZTUVOVCAqZXh0ID0oU1lNRU5UICopZXh0cDsKLSAgaWYoaW4tPl9uLl9uX25hbWVbMF0gPT0gMCkgewotICAgIGJmZF9oX3B1dF8zMihhYmZkLCAwLCAoYmZkX2J5dGUgKikgZXh0LT5lLmUuZV96ZXJvZXMpOwotICAgIGJmZF9oX3B1dF8zMihhYmZkLCBpbi0+X24uX25fbi5fbl9vZmZzZXQsIChiZmRfYnl0ZSAqKSAgZXh0LT5lLmUuZV9vZmZzZXQpOwotICB9Ci0gIGVsc2UgewotI2lmIFNZTU5NTEVOICE9IEVfU1lNTk1MRU4KLSAgICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgU1lNTk1MRU4hOwotI2Vsc2UKLSAgICBtZW1jcHkoZXh0LT5lLmVfbmFtZSwgaW4tPl9uLl9uX25hbWUsIFNZTU5NTEVOKTsKLSNlbmRpZgotICB9Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCAgaW4tPm5fdmFsdWUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3ZhbHVlKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsICBpbi0+bl9zY251bSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfc2NudW0pOwotICBpZiAoc2l6ZW9mKGV4dC0+ZV90eXBlKSA9PSAyKQotICAgICAgewotCWJmZF9oX3B1dF8xNihhYmZkLCAgaW4tPm5fdHlwZSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7Ci0gICAgICB9Ci0gIGVsc2UKLSAgICAgIHsKLQliZmRfaF9wdXRfMzIoYWJmZCwgIGluLT5uX3R5cGUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICAgICAgfQotICBiZmRfaF9wdXRfOChhYmZkLCAgaW4tPm5fc2NsYXNzICwgZXh0LT5lX3NjbGFzcyk7Ci0gIGJmZF9oX3B1dF84KGFiZmQsICBpbi0+bl9udW1hdXggLCBleHQtPmVfbnVtYXV4KTsKLSAgcmV0dXJuIFNZTUVTWjsKLX0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9hdXhfaW4gKGFiZmQsIGV4dDEsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGluMSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUiAJICAgICAgZXh0MTsKLSAgICAgaW50ICAgICAgICAgICAgIHR5cGU7Ci0gICAgIGludCAgICAgICAgICAgICBjbGFzczsKLSAgICAgaW50CSAgICAgIGluZHg7Ci0gICAgIGludAkgICAgICBudW1hdXg7Ci0gICAgIFBUUiAJICAgICAgaW4xOwotewotICBBVVhFTlQgICAgKmV4dCA9IChBVVhFTlQgKilleHQxOwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKWluMTsKLQotI2lmZGVmIENPRkZfQURKVVNUX0FVWF9JTl9QUkUKLSAgQ09GRl9BREpVU1RfQVVYX0lOX1BSRSAoYWJmZCwgZXh0MSwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgaW4xKTsKLSNlbmRpZgotICBzd2l0Y2ggKGNsYXNzKSB7Ci0gICAgY2FzZSBDX0ZJTEU6Ci0gICAgICBpZiAoZXh0LT54X2ZpbGUueF9mbmFtZVswXSA9PSAwKSB7Ci0JICBpbi0+eF9maWxlLnhfbi54X3plcm9lcyA9IDA7Ci0JICBpbi0+eF9maWxlLnhfbi54X29mZnNldCA9IAotCSAgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X2ZpbGUueF9uLnhfb2Zmc2V0KTsKLQl9IGVsc2UgewotI2lmIEZJTE5NTEVOICE9IEVfRklMTk1MRU4KLQkgICAgLT4gRXJyb3IsIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIEZJTE5NTEVOITsKLSNlbHNlCi0JICAgIGlmIChudW1hdXggPiAxKQotCSAgICAgIHsKLQkJaWYgKGluZHggPT0gMCkKLQkJICBtZW1jcHkgKGluLT54X2ZpbGUueF9mbmFtZSwgZXh0LT54X2ZpbGUueF9mbmFtZSwKLQkJCSAgbnVtYXV4ICogc2l6ZW9mIChBVVhFTlQpKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW1lbWNweSAoaW4tPnhfZmlsZS54X2ZuYW1lLCBleHQtPnhfZmlsZS54X2ZuYW1lLCBGSUxOTUxFTik7Ci0JICAgICAgfQotI2VuZGlmCi0JICB9Ci0gICAgICBnb3RvIGVuZDsKLQotICAgICAgLyogUlMvNjAwMCAiY3NlY3QiIGF1eGVudHMgKi8KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgICBjYXNlIENfRVhUOgotICAgIGNhc2UgQ19ISURFWFQ6Ci0gICAgICBpZiAoaW5keCArIDEgPT0gbnVtYXV4KQotCXsKLQkgIGluLT54X2NzZWN0Lnhfc2NubGVuLmwgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dC0+eF9jc2VjdC54X3Njbmxlbik7Ci0JICBpbi0+eF9jc2VjdC54X3Bhcm1oYXNoID0gYmZkX2hfZ2V0XzMyIChhYmZkLAotCQkJCQkJIGV4dC0+eF9jc2VjdC54X3Bhcm1oYXNoKTsKLQkgIGluLT54X2NzZWN0Lnhfc25oYXNoICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGV4dC0+eF9jc2VjdC54X3NuaGFzaCk7Ci0JICAvKiBXZSBkb24ndCBoYXZlIHRvIGhhY2sgYml0ZmllbGRzIGluIHhfc210eXAgYmVjYXVzZSBpdCdzCi0JICAgICBkZWZpbmVkIGJ5IHNoaWZ0cy1hbmQtYW5kcywgd2hpY2ggYXJlIGVxdWl2YWxlbnQgb24gYWxsCi0JICAgICBieXRlIG9yZGVycy4gICovCi0JICBpbi0+eF9jc2VjdC54X3NtdHlwICAgID0gYmZkX2hfZ2V0XzggIChhYmZkLCBleHQtPnhfY3NlY3QueF9zbXR5cCk7Ci0JICBpbi0+eF9jc2VjdC54X3NtY2xhcyAgID0gYmZkX2hfZ2V0XzggIChhYmZkLCBleHQtPnhfY3NlY3QueF9zbWNsYXMpOwotCSAgaW4tPnhfY3NlY3QueF9zdGFiICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0LT54X2NzZWN0Lnhfc3RhYik7Ci0JICBpbi0+eF9jc2VjdC54X3Nuc3RhYiAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleHQtPnhfY3NlY3QueF9zbnN0YWIpOwotCSAgZ290byBlbmQ7Ci0JfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGNhc2UgQ19TVEFUOgotI2lmZGVmIENfTEVBRlNUQVQKLSAgICBjYXNlIENfTEVBRlNUQVQ6Ci0jZW5kaWYKLSAgICBjYXNlIENfSElEREVOOgotICAgICAgaWYgKHR5cGUgPT0gVF9OVUxMKSB7Ci0JICBpbi0+eF9zY24ueF9zY25sZW4gPSBHRVRfU0NOX1NDTkxFTihhYmZkLCBleHQpOwotCSAgaW4tPnhfc2NuLnhfbnJlbG9jID0gR0VUX1NDTl9OUkVMT0MoYWJmZCwgZXh0KTsKLQkgIGluLT54X3Njbi54X25saW5ubyA9IEdFVF9TQ05fTkxJTk5PKGFiZmQsIGV4dCk7Ci0KLQkgIC8qIFBFIGRlZmluZXMgc29tZSBleHRyYSBmaWVsZHM7IHdlIHplcm8gdGhlbSBvdXQgZm9yCi0gICAgICAgICAgICAgc2FmZXR5LiAgKi8KLQkgIGluLT54X3Njbi54X2NoZWNrc3VtID0gMDsKLQkgIGluLT54X3Njbi54X2Fzc29jaWF0ZWQgPSAwOwotCSAgaW4tPnhfc2NuLnhfY29tZGF0ID0gMDsKLQotCSAgZ290byBlbmQ7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGluLT54X3N5bS54X3RhZ25keC5sID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdGFnbmR4KTsKLSNpZm5kZWYgTk9fVFZORFgKLSAgaW4tPnhfc3ltLnhfdHZuZHggPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90dm5keCk7Ci0jZW5kaWYKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0gR0VUX0ZDTl9MTk5PUFRSIChhYmZkLCBleHQpOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPSBHRVRfRkNOX0VORE5EWCAoYWJmZCwgZXh0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWYgRElNTlVNICE9IEVfRElNTlVNCi0gI2Vycm9yIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIERJTU5VTQotI2VuZGlmCi0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdKTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0pOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSk7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdKTsKLSAgICB9Ci0KLSAgaWYgKElTRkNOKHR5cGUpKSB7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2ZzaXplID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2ZzaXplKTsKLSAgfQotICBlbHNlIHsKLSAgICBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8gPSBHRVRfTE5TWl9MTk5PKGFiZmQsIGV4dCk7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplID0gR0VUX0xOU1pfU0laRShhYmZkLCBleHQpOwotICB9Ci0KLWVuZDogOwotICAvKiB0aGUgc2VtaWNvbG9uIGlzIGJlY2F1c2UgTVNWQyBkb2Vzbid0IGxpa2UgbGFiZWxzIGF0Ci0gICAgIGVuZCBvZiBibG9jay4gKi8KLQotI2lmZGVmIENPRkZfQURKVVNUX0FVWF9JTl9QT1NUCi0gIENPRkZfQURKVVNUX0FVWF9JTl9QT1NUIChhYmZkLCBleHQxLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBpbjEpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9hdXhfb3V0IChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApCi0gICAgIGJmZCAgICphYmZkOwotICAgICBQVFIgCWlucDsKLSAgICAgaW50ICAgdHlwZTsKLSAgICAgaW50ICAgY2xhc3M7Ci0gICAgIGludCAgIGluZHg7Ci0gICAgIGludCAgIG51bWF1eDsKLSAgICAgUFRSCWV4dHA7Ci17Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopaW5wOwotICBBVVhFTlQgKmV4dCA9IChBVVhFTlQgKilleHRwOwotCi0jaWZkZWYgQ09GRl9BREpVU1RfQVVYX09VVF9QUkUKLSAgQ09GRl9BREpVU1RfQVVYX09VVF9QUkUgKGFiZmQsIGlucCwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgZXh0cCk7Ci0jZW5kaWYKLSAgbWVtc2V0KChQVFIpZXh0LCAwLCBBVVhFU1opOwotICBzd2l0Y2ggKGNsYXNzKSB7Ci0gIGNhc2UgQ19GSUxFOgotICAgIGlmIChpbi0+eF9maWxlLnhfZm5hbWVbMF0gPT0gMCkgewotICAgICAgUFVUV09SRChhYmZkLCAwLCAoYmZkX2J5dGUgKikgZXh0LT54X2ZpbGUueF9uLnhfemVyb2VzKTsKLSAgICAgIFBVVFdPUkQoYWJmZCwKLQkgICAgICBpbi0+eF9maWxlLnhfbi54X29mZnNldCwKLQkgICAgICAoYmZkX2J5dGUgKikgZXh0LT54X2ZpbGUueF9uLnhfb2Zmc2V0KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0jaWYgRklMTk1MRU4gIT0gRV9GSUxOTUxFTgotICAgICAgLT4gRXJyb3IsIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIEZJTE5NTEVOITsKLSNlbHNlCi0gICAgICBtZW1jcHkgKGV4dC0+eF9maWxlLnhfZm5hbWUsIGluLT54X2ZpbGUueF9mbmFtZSwgRklMTk1MRU4pOwotI2VuZGlmCi0gICAgfQotICAgIGdvdG8gZW5kOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIC8qIFJTLzYwMDAgImNzZWN0IiBhdXhlbnRzICovCi0gIGNhc2UgQ19FWFQ6Ci0gIGNhc2UgQ19ISURFWFQ6Ci0gICAgaWYgKGluZHggKyAxID09IG51bWF1eCkKLSAgICAgIHsKLQlQVVRXT1JEIChhYmZkLCBpbi0+eF9jc2VjdC54X3Njbmxlbi5sLAlleHQtPnhfY3NlY3QueF9zY25sZW4pOwotCVBVVFdPUkQgKGFiZmQsIGluLT54X2NzZWN0LnhfcGFybWhhc2gsCWV4dC0+eF9jc2VjdC54X3Bhcm1oYXNoKTsKLQlQVVRIQUxGIChhYmZkLCBpbi0+eF9jc2VjdC54X3NuaGFzaCwJZXh0LT54X2NzZWN0Lnhfc25oYXNoKTsKLQkvKiBXZSBkb24ndCBoYXZlIHRvIGhhY2sgYml0ZmllbGRzIGluIHhfc210eXAgYmVjYXVzZSBpdCdzCi0JICAgZGVmaW5lZCBieSBzaGlmdHMtYW5kLWFuZHMsIHdoaWNoIGFyZSBlcXVpdmFsZW50IG9uIGFsbAotCSAgIGJ5dGUgb3JkZXJzLiAgKi8KLQlQVVRCWVRFIChhYmZkLCBpbi0+eF9jc2VjdC54X3NtdHlwLAlleHQtPnhfY3NlY3QueF9zbXR5cCk7Ci0JUFVUQllURSAoYWJmZCwgaW4tPnhfY3NlY3QueF9zbWNsYXMsCWV4dC0+eF9jc2VjdC54X3NtY2xhcyk7Ci0JUFVUV09SRCAoYWJmZCwgaW4tPnhfY3NlY3QueF9zdGFiLAlleHQtPnhfY3NlY3QueF9zdGFiKTsKLQlQVVRIQUxGIChhYmZkLCBpbi0+eF9jc2VjdC54X3Nuc3RhYiwJZXh0LT54X2NzZWN0Lnhfc25zdGFiKTsKLQlnb3RvIGVuZDsKLSAgICAgIH0KLSAgICBicmVhazsKLSNlbmRpZgotCi0gIGNhc2UgQ19TVEFUOgotI2lmZGVmIENfTEVBRlNUQVQKLSAgY2FzZSBDX0xFQUZTVEFUOgotI2VuZGlmCi0gIGNhc2UgQ19ISURERU46Ci0gICAgaWYgKHR5cGUgPT0gVF9OVUxMKSB7Ci0gICAgICBQVVRfU0NOX1NDTkxFTihhYmZkLCBpbi0+eF9zY24ueF9zY25sZW4sIGV4dCk7Ci0gICAgICBQVVRfU0NOX05SRUxPQyhhYmZkLCBpbi0+eF9zY24ueF9ucmVsb2MsIGV4dCk7Ci0gICAgICBQVVRfU0NOX05MSU5OTyhhYmZkLCBpbi0+eF9zY24ueF9ubGlubm8sIGV4dCk7Ci0gICAgICBnb3RvIGVuZDsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBQVVRXT1JEKGFiZmQsIGluLT54X3N5bS54X3RhZ25keC5sLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3RhZ25keCk7Ci0jaWZuZGVmIE5PX1RWTkRYCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBpbi0+eF9zeW0ueF90dm5keCAsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdHZuZHgpOwotI2VuZGlmCi0KLSAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCi0gICAgewotICAgICAgUFVUX0ZDTl9MTk5PUFRSKGFiZmQsICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyLCBleHQpOwotICAgICAgUFVUX0ZDTl9FTkRORFgoYWJmZCwgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sLCBleHQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZiBESU1OVU0gIT0gRV9ESU1OVU0KLSAjZXJyb3Igd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgRElNTlVNCi0jZW5kaWYKLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0sCi0JCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0sCi0JCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0sCi0JCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzJdKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10sCi0JCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdKTsKLSAgICB9Ci0KLSAgaWYgKElTRkNOICh0eXBlKSkKLSAgICBQVVRXT1JEIChhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfZnNpemUsCi0JICAgICAoYmZkX2J5dGUgKikgIGV4dC0+eF9zeW0ueF9taXNjLnhfZnNpemUpOwotICBlbHNlCi0gICAgewotICAgICAgUFVUX0xOU1pfTE5OTyAoYWJmZCwgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vLCBleHQpOwotICAgICAgUFVUX0xOU1pfU0laRSAoYWJmZCwgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplLCBleHQpOwotICAgIH0KLQotZW5kOgotI2lmZGVmIENPRkZfQURKVVNUX0FVWF9PVVRfUE9TVAotICBDT0ZGX0FESlVTVF9BVVhfT1VUX1BPU1QgKGFiZmQsIGlucCwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgZXh0cCk7Ci0jZW5kaWYKLSAgcmV0dXJuIEFVWEVTWjsKLX0KLQotI2VuZGlmIC8qIE5PX0NPRkZfU1lNQk9MUyAqLwotCi0jaWZuZGVmIE5PX0NPRkZfTElORU5PUwotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX2xpbmVub19pbiAoYWJmZCwgZXh0MSwgaW4xKQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSIGV4dDE7Ci0gICAgIFBUUiBpbjE7Ci17Ci0gIExJTkVOTyAqZXh0ID0gKExJTkVOTyAqKWV4dDE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gICAgICAqaW4gPSAoc3RydWN0IGludGVybmFsX2xpbmVubyAqKWluMTsKLQotICBpbi0+bF9hZGRyLmxfc3ltbmR4ID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmxfYWRkci5sX3N5bW5keCk7Ci0gIGluLT5sX2xubm8gPSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX2xpbmVub19vdXQgKGFiZmQsIGlucCwgb3V0cCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW5wOwotICAgICBQVFIJb3V0cDsKLXsKLSAgc3RydWN0IGludGVybmFsX2xpbmVubyAqaW4gPSAoc3RydWN0IGludGVybmFsX2xpbmVubyAqKWlucDsKLSAgc3RydWN0IGV4dGVybmFsX2xpbmVubyAqZXh0ID0gKHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKilvdXRwOwotICBQVVRXT1JEKGFiZmQsIGluLT5sX2FkZHIubF9zeW1uZHgsIChiZmRfYnl0ZSAqKQotCSAgZXh0LT5sX2FkZHIubF9zeW1uZHgpOwotCi0gIFBVVF9MSU5FTk9fTE5OTyAoYWJmZCwgaW4tPmxfbG5ubywgZXh0KTsKLSAgcmV0dXJuIExJTkVTWjsKLX0KLQotI2VuZGlmIC8qIE5PX0NPRkZfTElORU5PUyAqLwotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX2FvdXRoZHJfaW4gKGFiZmQsIGFvdXRoZHJfZXh0MSwgYW91dGhkcl9pbnQxKQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSIGFvdXRoZHJfZXh0MTsKLSAgICAgUFRSIGFvdXRoZHJfaW50MTsKLXsKLSAgQU9VVEhEUiAgICAgICAgKmFvdXRoZHJfZXh0ID0gKEFPVVRIRFIgKikgYW91dGhkcl9leHQxOwotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqYW91dGhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKilhb3V0aGRyX2ludDE7Ci0KLSAgYW91dGhkcl9pbnQtPm1hZ2ljID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+bWFnaWMpOwotICBhb3V0aGRyX2ludC0+dnN0YW1wID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dnN0YW1wKTsKLSAgYW91dGhkcl9pbnQtPnRzaXplID0KLSAgICBHRVRfQU9VVEhEUl9UU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT50c2l6ZSk7Ci0gIGFvdXRoZHJfaW50LT5kc2l6ZSA9Ci0gICAgR0VUX0FPVVRIRFJfRFNJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+ZHNpemUpOwotICBhb3V0aGRyX2ludC0+YnNpemUgPQotICAgIEdFVF9BT1VUSERSX0JTSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmJzaXplKTsKLSAgYW91dGhkcl9pbnQtPmVudHJ5ID0KLSAgICBHRVRfQU9VVEhEUl9FTlRSWSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5lbnRyeSk7Ci0gIGFvdXRoZHJfaW50LT50ZXh0X3N0YXJ0ID0KLSAgICBHRVRfQU9VVEhEUl9URVhUX1NUQVJUIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnRleHRfc3RhcnQpOwotICBhb3V0aGRyX2ludC0+ZGF0YV9zdGFydCA9Ci0gICAgR0VUX0FPVVRIRFJfREFUQV9TVEFSVCAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5kYXRhX3N0YXJ0KTsKLQotI2lmZGVmIEk5NjAKLSAgYW91dGhkcl9pbnQtPnRhZ2VudHJpZXMgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT50YWdlbnRyaWVzKTsKLSNlbmRpZgotCi0jaWZkZWYgQVBPTExPX002OAotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbnQtPm9faW5saWIsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+b19pbmxpYik7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2ludC0+b19zcmksIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+b19zcmkpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbnQtPnZpZFswXSwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT52aWQpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbnQtPnZpZFsxXSwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT52aWQgKyA0KTsKLSNlbmRpZgotCi0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgYW91dGhkcl9pbnQtPm9fdG9jID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5vX3RvYyk7Ci0gIGFvdXRoZHJfaW50LT5vX3NuZW50cnkgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fc25lbnRyeSk7Ci0gIGFvdXRoZHJfaW50LT5vX3NudGV4dCA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbnRleHQpOwotICBhb3V0aGRyX2ludC0+b19zbmRhdGEgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fc25kYXRhKTsKLSAgYW91dGhkcl9pbnQtPm9fc250b2MgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fc250b2MpOwotICBhb3V0aGRyX2ludC0+b19zbmxvYWRlciA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbmxvYWRlcik7Ci0gIGFvdXRoZHJfaW50LT5vX3NuYnNzID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX3NuYnNzKTsKLSAgYW91dGhkcl9pbnQtPm9fYWxnbnRleHQgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fYWxnbnRleHQpOwotICBhb3V0aGRyX2ludC0+b19hbGduZGF0YSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19hbGduZGF0YSk7Ci0gIGFvdXRoZHJfaW50LT5vX21vZHR5cGUgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fbW9kdHlwZSk7Ci0gIGFvdXRoZHJfaW50LT5vX2NwdXR5cGUgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fY3B1dHlwZSk7Ci0gIGFvdXRoZHJfaW50LT5vX21heHN0YWNrID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5vX21heHN0YWNrKTsKLSAgYW91dGhkcl9pbnQtPm9fbWF4ZGF0YSA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+b19tYXhkYXRhKTsKLSNlbmRpZgotCi0jaWZkZWYgTUlQU0VDT0ZGCi0gIGFvdXRoZHJfaW50LT5ic3Nfc3RhcnQgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmJzc19zdGFydCk7Ci0gIGFvdXRoZHJfaW50LT5ncF92YWx1ZSA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Z3BfdmFsdWUpOwotICBhb3V0aGRyX2ludC0+Z3BybWFzayA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Z3BybWFzayk7Ci0gIGFvdXRoZHJfaW50LT5jcHJtYXNrWzBdID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5jcHJtYXNrWzBdKTsKLSAgYW91dGhkcl9pbnQtPmNwcm1hc2tbMV0gPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmNwcm1hc2tbMV0pOwotICBhb3V0aGRyX2ludC0+Y3BybWFza1syXSA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Y3BybWFza1syXSk7Ci0gIGFvdXRoZHJfaW50LT5jcHJtYXNrWzNdID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5jcHJtYXNrWzNdKTsKLSNlbmRpZgotCi0jaWZkZWYgQUxQSEFFQ09GRgotICBhb3V0aGRyX2ludC0+YnNzX3N0YXJ0ID0gYmZkX2hfZ2V0XzY0KGFiZmQsIGFvdXRoZHJfZXh0LT5ic3Nfc3RhcnQpOwotICBhb3V0aGRyX2ludC0+Z3BfdmFsdWUgPSBiZmRfaF9nZXRfNjQoYWJmZCwgYW91dGhkcl9leHQtPmdwX3ZhbHVlKTsKLSAgYW91dGhkcl9pbnQtPmdwcm1hc2sgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmdwcm1hc2spOwotICBhb3V0aGRyX2ludC0+ZnBybWFzayA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+ZnBybWFzayk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX2FvdXRoZHJfb3V0IChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbjsKLSAgICAgUFRSCW91dDsKLXsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmFvdXRoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKilpbjsKLSAgQU9VVEhEUiAqYW91dGhkcl9vdXQgPSAoQU9VVEhEUiAqKW91dDsKLQotICBiZmRfaF9wdXRfMTYoYWJmZCwgYW91dGhkcl9pbi0+bWFnaWMsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+bWFnaWMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgYW91dGhkcl9pbi0+dnN0YW1wLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnZzdGFtcCk7Ci0gIFBVVF9BT1VUSERSX1RTSVpFIChhYmZkLCBhb3V0aGRyX2luLT50c2l6ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT50c2l6ZSk7Ci0gIFBVVF9BT1VUSERSX0RTSVpFIChhYmZkLCBhb3V0aGRyX2luLT5kc2l6ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5kc2l6ZSk7Ci0gIFBVVF9BT1VUSERSX0JTSVpFIChhYmZkLCBhb3V0aGRyX2luLT5ic2l6ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ic2l6ZSk7Ci0gIFBVVF9BT1VUSERSX0VOVFJZIChhYmZkLCBhb3V0aGRyX2luLT5lbnRyeSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5lbnRyeSk7Ci0gIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQgKGFiZmQsIGFvdXRoZHJfaW4tPnRleHRfc3RhcnQsCi0JCQkgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+dGV4dF9zdGFydCk7Ci0gIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgKGFiZmQsIGFvdXRoZHJfaW4tPmRhdGFfc3RhcnQsCi0JCQkgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+ZGF0YV9zdGFydCk7Ci0KLSNpZmRlZiBJOTYwCi0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT50YWdlbnRyaWVzLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnRhZ2VudHJpZXMpOwotI2VuZGlmCi0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBhb3V0aGRyX2luLT5vX3RvYywgYW91dGhkcl9vdXQtPm9fdG9jKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX3NuZW50cnksIGFvdXRoZHJfb3V0LT5vX3NuZW50cnkpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fc250ZXh0LCBhb3V0aGRyX291dC0+b19zbnRleHQpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fc25kYXRhLCBhb3V0aGRyX291dC0+b19zbmRhdGEpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fc250b2MsIGFvdXRoZHJfb3V0LT5vX3NudG9jKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX3NubG9hZGVyLCBhb3V0aGRyX291dC0+b19zbmxvYWRlcik7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbmJzcywgYW91dGhkcl9vdXQtPm9fc25ic3MpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fYWxnbnRleHQsIGFvdXRoZHJfb3V0LT5vX2FsZ250ZXh0KTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX2FsZ25kYXRhLCBhb3V0aGRyX291dC0+b19hbGduZGF0YSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19tb2R0eXBlLCBhb3V0aGRyX291dC0+b19tb2R0eXBlKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX2NwdXR5cGUsIGFvdXRoZHJfb3V0LT5vX2NwdXR5cGUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGFvdXRoZHJfaW4tPm9fbWF4c3RhY2ssIGFvdXRoZHJfb3V0LT5vX21heHN0YWNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBhb3V0aGRyX2luLT5vX21heGRhdGEsIGFvdXRoZHJfb3V0LT5vX21heGRhdGEpOwotICBtZW1zZXQgKGFvdXRoZHJfb3V0LT5vX3Jlc3YyLCAwLCBzaXplb2YgYW91dGhkcl9vdXQtPm9fcmVzdjIpOwotI2VuZGlmCi0KLSNpZmRlZiBNSVBTRUNPRkYKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmJzc19zdGFydCwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ic3Nfc3RhcnQpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Z3BfdmFsdWUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Z3BfdmFsdWUpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Z3BybWFzaywgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ncHJtYXNrKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmNwcm1hc2tbMF0sIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Y3BybWFza1swXSk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5jcHJtYXNrWzFdLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmNwcm1hc2tbMV0pOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Y3BybWFza1syXSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5jcHJtYXNrWzJdKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmNwcm1hc2tbM10sIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Y3BybWFza1szXSk7Ci0jZW5kaWYKLQotI2lmZGVmIEFMUEhBRUNPRkYKLSAgLyogRklYTUU6IFdoYXQgZG9lcyBibGRyZXYgbWVhbj8gICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCAoYmZkX3ZtYSkgMiwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ibGRyZXYpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgKGJmZF92bWEpIDAsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+cGFkZGluZyk7Ci0gIGJmZF9oX3B1dF82NChhYmZkLCBhb3V0aGRyX2luLT5ic3Nfc3RhcnQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+YnNzX3N0YXJ0KTsKLSAgYmZkX2hfcHV0XzY0KGFiZmQsIGFvdXRoZHJfaW4tPmdwX3ZhbHVlLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmdwX3ZhbHVlKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmdwcm1hc2ssIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Z3BybWFzayk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5mcHJtYXNrLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmZwcm1hc2spOwotI2VuZGlmCi0KLSAgcmV0dXJuIEFPVVRTWjsKLX0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9zY25oZHJfaW4gKGFiZmQsIGV4dCwgaW4pCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIJICAgICBleHQ7Ci0gICAgIFBUUgkgICAgIGluOwotewotICBTQ05IRFIgKnNjbmhkcl9leHQgPSAoU0NOSERSICopIGV4dDsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGluOwotCi0jaWZkZWYgQ09GRl9BREpVU1RfU0NOSERSX0lOX1BSRQotICBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUFJFIChhYmZkLCBleHQsIGluKTsKLSNlbmRpZgotICBtZW1jcHkoc2NuaGRyX2ludC0+c19uYW1lLCBzY25oZHJfZXh0LT5zX25hbWUsIHNpemVvZihzY25oZHJfaW50LT5zX25hbWUpKTsKLSAgc2NuaGRyX2ludC0+c192YWRkciA9Ci0gICAgR0VUX1NDTkhEUl9WQUREUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfdmFkZHIpOwotICBzY25oZHJfaW50LT5zX3BhZGRyID0KLSAgICBHRVRfU0NOSERSX1BBRERSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19wYWRkcik7Ci0gIHNjbmhkcl9pbnQtPnNfc2l6ZSA9Ci0gICAgR0VUX1NDTkhEUl9TSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19zaXplKTsKLQotICBzY25oZHJfaW50LT5zX3NjbnB0ciA9Ci0gICAgR0VUX1NDTkhEUl9TQ05QVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NjbnB0cik7Ci0gIHNjbmhkcl9pbnQtPnNfcmVscHRyID0KLSAgICBHRVRfU0NOSERSX1JFTFBUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfcmVscHRyKTsKLSAgc2NuaGRyX2ludC0+c19sbm5vcHRyID0KLSAgICBHRVRfU0NOSERSX0xOTk9QVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2xubm9wdHIpOwotICBzY25oZHJfaW50LT5zX2ZsYWdzID0KLSAgICBHRVRfU0NOSERSX0ZMQUdTIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19mbGFncyk7Ci0gIHNjbmhkcl9pbnQtPnNfbnJlbG9jID0KLSAgICBHRVRfU0NOSERSX05SRUxPQyAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbnJlbG9jKTsKLSAgc2NuaGRyX2ludC0+c19ubG5ubyA9Ci0gICAgR0VUX1NDTkhEUl9OTE5OTyAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOwotI2lmZGVmIEk5NjAKLSAgc2NuaGRyX2ludC0+c19hbGlnbiA9Ci0gICAgR0VUX1NDTkhEUl9BTElHTiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfYWxpZ24pOwotI2VuZGlmCi0jaWZkZWYgQ09GRl9BREpVU1RfU0NOSERSX0lOX1BPU1QKLSAgQ09GRl9BREpVU1RfU0NOSERSX0lOX1BPU1QgKGFiZmQsIGV4dCwgaW4pOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9zY25oZHJfb3V0IChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbjsKLSAgICAgUFRSCW91dDsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopaW47Ci0gIFNDTkhEUiAqc2NuaGRyX2V4dCA9IChTQ05IRFIgKilvdXQ7Ci0gIHVuc2lnbmVkIGludCByZXQgPSBTQ05IU1o7Ci0KLSNpZmRlZiBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BSRQotICBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BSRSAoYWJmZCwgaW4sIG91dCk7Ci0jZW5kaWYKLSAgbWVtY3B5KHNjbmhkcl9leHQtPnNfbmFtZSwgc2NuaGRyX2ludC0+c19uYW1lLCBzaXplb2Yoc2NuaGRyX2ludC0+c19uYW1lKSk7Ci0KLSAgUFVUX1NDTkhEUl9WQUREUiAoYWJmZCwgc2NuaGRyX2ludC0+c192YWRkciwKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3ZhZGRyKTsKLQotCi0gIFBVVF9TQ05IRFJfUEFERFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfcGFkZHIsCi0JCSAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19wYWRkcik7Ci0gIFBVVF9TQ05IRFJfU0laRSAoYWJmZCwgc2NuaGRyX2ludC0+c19zaXplLAotCQkgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19zaXplKTsKLQotICBQVVRfU0NOSERSX1NDTlBUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19zY25wdHIsCi0JCSAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2NucHRyKTsKLSAgUFVUX1NDTkhEUl9SRUxQVFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfcmVscHRyLAotCQkgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3JlbHB0cik7Ci0gIFBVVF9TQ05IRFJfTE5OT1BUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19sbm5vcHRyLAotCQkgICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19sbm5vcHRyKTsKLSAgUFVUX1NDTkhEUl9GTEFHUyAoYWJmZCwgc2NuaGRyX2ludC0+c19mbGFncywKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKLSNpZiBkZWZpbmVkKE04OCkKLSAgUFVUV09SRChhYmZkLCBzY25oZHJfaW50LT5zX25sbm5vLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0gIFBVVFdPUkQoYWJmZCwgc2NuaGRyX2ludC0+c19ucmVsb2MsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0jZWxzZQotICBpZiAoc2NuaGRyX2ludC0+c19ubG5ubyA8PSAweGZmZmYpCi0gICAgUFVUSEFMRihhYmZkLCBzY25oZHJfaW50LT5zX25sbm5vLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZltzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSkgKyAxXTsKLQotICAgICAgbWVtY3B5IChidWYsIHNjbmhkcl9pbnQtPnNfbmFtZSwgc2l6ZW9mIChzY25oZHJfaW50LT5zX25hbWUpKTsKLSAgICAgIGJ1ZltzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSldID0gJ1wwJzsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogd2FybmluZzogJXM6IGxpbmUgbnVtYmVyIG92ZXJmbG93OiAweCVseCA+IDB4ZmZmZiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkgYnVmLCBzY25oZHJfaW50LT5zX25sbm5vKTsKLSAgICAgIFBVVEhBTEYgKGFiZmQsIDB4ZmZmZiwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOwotICAgIH0KLSAgaWYgKHNjbmhkcl9pbnQtPnNfbnJlbG9jIDw9IDB4ZmZmZikKLSAgICBQVVRIQUxGKGFiZmQsIHNjbmhkcl9pbnQtPnNfbnJlbG9jLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciBidWZbc2l6ZW9mIChzY25oZHJfaW50LT5zX25hbWUpICsgMV07Ci0KLSAgICAgIG1lbWNweSAoYnVmLCBzY25oZHJfaW50LT5zX25hbWUsIHNpemVvZiAoc2NuaGRyX2ludC0+c19uYW1lKSk7Ci0gICAgICBidWZbc2l6ZW9mIChzY25oZHJfaW50LT5zX25hbWUpXSA9ICdcMCc7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiAlczogcmVsb2Mgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCi0JCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJICAgICBidWYsIHNjbmhkcl9pbnQtPnNfbnJlbG9jKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICBQVVRIQUxGIChhYmZkLCAweGZmZmYsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0gICAgICByZXQgPSAwOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgSTk2MAotICBQVVRfU0NOSERSX0FMSUdOIChhYmZkLCBzY25oZHJfaW50LT5zX2FsaWduLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19hbGlnbik7Ci0jZW5kaWYKLSNpZmRlZiBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BPU1QKLSAgQ09GRl9BREpVU1RfU0NOSERSX09VVF9QT1NUIChhYmZkLCBpbiwgb3V0KTsKLSNlbmRpZgotICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZy5iZmQgYi9iZmQvY29uZmlnLmJmZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg0NjBmYS4uMDAwMDAwMAotLS0gYS9iZmQvY29uZmlnLmJmZAorKysgL2Rldi9udWxsCkBAIC0xLDczMiArMCwwIEBACi0jIGNvbmZpZy5iZmQKLSMgQ29udmVydCBhIGNhbm9uaWNhbCBob3N0IHR5cGUgaW50byBhIEJGRCBob3N0IHR5cGUuCi0jIFNldCBzaGVsbCB2YXJpYWJsZSB0YXJnIHRvIGNhbm9uaWNhbCB0YXJnZXQgbmFtZSwgYW5kIHJ1bgotIyB1c2luZyBgYC4gY29uZmlnLmJmZCcnLgotIyBTZXRzIHRoZSBmb2xsb3dpbmcgc2hlbGwgdmFyaWFibGVzOgotIyAgdGFyZ19kZWZ2ZWMJCURlZmF1bHQgdmVjdG9yIGZvciB0aGlzIHRhcmdldAotIyAgdGFyZ19zZWx2ZWNzCQlWZWN0b3JzIHRvIGJ1aWxkIGZvciB0aGlzIHRhcmdldAotIyAgdGFyZ19hcmNocwkJQXJjaGl0ZWN0dXJlcyBmb3IgdGhpcyB0YXJnZXQKLSMgIHRhcmdfY2ZsYWdzCQkkKENGTEFHUykgZm9yIHRoaXMgdGFyZ2V0IChGSVhNRTogcHJldHR5IGJvZ3VzKQotIyAgdGFyZ191bmRlcnNjb3JlCVdoZXRoZXIgdW5kZXJzY29yZXMgYXJlIHVzZWQ6IHllcyBvciBubwotCi0jIFBhcnQgb2YgdGhpcyBmaWxlIGlzIHByb2Nlc3NlZCBieSB0YXJnbWF0Y2guc2VkIHRvIGdlbmVyYXRlIHRoZQotIyB0YXJnbWF0Y2guaCBmaWxlLiAgVGhlICNpZmRlZiBhbmQgI2VuZGlmIGxpbmVzIHRoYXQgYXBwZWFyIGJlbG93IGFyZQotIyBjb3BpZWQgZGlyZWN0bHkgaW50byB0YXJnbWF0Y2guaC4KLQotIyBUaGUgYmludXRpbHMgYysrZmlsdCBwcm9ncmFtIHdhbnRzIHRvIGtub3cgd2hldGhlciB1bmRlcnNjb3JlcyBhcmUKLSMgc3RyaXBwZWQgb3Igbm90LiAgVGhhdCBpcyB3aHkgd2Ugc2V0IHRhcmdfdW5kZXJzY29yZS4gIGMrK2ZpbHQgdXNlcwotIyB0aGlzIGluZm9ybWF0aW9uIHRvIGNob29zZSBhIGRlZmF1bHQuICBUaGlzIGluZm9ybWF0aW9uIGlzCi0jIGR1cGxpY2F0ZWQgaW4gdGhlIHN5bWJvbF9sZWFkaW5nX2NoYXIgZmllbGQgb2YgdGhlIEJGRCB0YXJnZXQKLSMgdmVjdG9yLCBidXQgYysrZmlsdCBkb2VzIG5vdCBkZWFsIHdpdGggb2JqZWN0IGZpbGVzIGFuZCBpcyBub3QKLSMgbGlua2VkIGFnYWluc3QgbGliYmZkLmEuICBJdCBpcyBub3QgdGVycmlibHkgaW1wb3J0YW50IHRoYXQgYysrZmlsdAotIyBnZXQgdGhpcyByaWdodDsgaXQgaXMganVzdCBjb252ZW5pZW50LgotCi10YXJnX2RlZnZlYz0KLXRhcmdfc2VsdmVjcz0KLXRhcmdfY2ZsYWdzPQotdGFyZ191bmRlcnNjb3JlPW5vCi0KLXRhcmdfY3B1PWBlY2hvICR0YXJnIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWNhc2UgIiR7dGFyZ19jcHV9IiBpbgotYWxwaGEqKSB0YXJnX2FyY2hzPWJmZF9hbHBoYV9hcmNoIDs7Ci1hcm0qKQl0YXJnX2FyY2hzPWJmZF9hcm1fYXJjaCA7Owotc3Ryb25nYXJtKikgdGFyZ19hcmNocz1iZmRfYXJtX2FyY2ggOzsKLXRodW1iKikJdGFyZ19hcmNocz1iZmRfYXJtX2FyY2ggOzsKLWMzMCopCXRhcmdfYXJjaHM9YmZkX3RpYzMwX2FyY2ggOzsKLWhwcGEqKQl0YXJnX2FyY2hzPWJmZF9ocHBhX2FyY2ggOzsKLWlbMzQ1Nl04NikgdGFyZ19hcmNocz1iZmRfaTM4Nl9hcmNoIDs7Ci1tNjgqKQl0YXJnX2FyY2hzPWJmZF9tNjhrX2FyY2ggOzsKLW04OCopCXRhcmdfYXJjaHM9YmZkX204OGtfYXJjaCA7OwotbWlwcyopCXRhcmdfYXJjaHM9YmZkX21pcHNfYXJjaCA7OwotcG93ZXJwYyopIHRhcmdfYXJjaHM9ImJmZF9yczYwMDBfYXJjaCBiZmRfcG93ZXJwY19hcmNoIiA7OwotcnM2MDAwKQl0YXJnX2FyY2hzPSJiZmRfcnM2MDAwX2FyY2ggYmZkX3Bvd2VycGNfYXJjaCIgOzsKLXNwYXJjKikgdGFyZ19hcmNocz1iZmRfc3BhcmNfYXJjaCA7Owotdjg1MCopCXRhcmdfYXJjaHM9YmZkX3Y4NTBfYXJjaCA7OwotejhrKikJdGFyZ19hcmNocz1iZmRfejhrX2FyY2ggOzsKLSopCXRhcmdfYXJjaHM9YmZkXyR7dGFyZ19jcHV9X2FyY2ggOzsKLWVzYWMKLQotCi0jIFdIRU4gQURESU5HIEVOVFJJRVMgVE8gVEhJUyBNQVRSSVg6Ci0jICBNYWtlIHN1cmUgdGhhdCB0aGUgbGVmdCBzaWRlIGFsd2F5cyBoYXMgdHdvIGRhc2hlcy4gIE90aGVyd2lzZSB5b3UKLSMgIGNhbiBnZXQgc3B1cmlvdXMgbWF0Y2hlcy4gIEV2ZW4gZm9yIHVuYW1iaWd1b3VzIGNhc2VzLCBkbyB0aGlzIGFzIGEKLSMgIGNvbnZlbnRpb24sIGVsc2UgdGhlIHRhYmxlIGJlY29tZXMgYSByZWFsIG1lc3MgdG8gdW5kZXJzdGFuZCBhbmQgbWFpbnRhaW4uCi0KLWNhc2UgIiR7dGFyZ30iIGluCi0jIFNUQVJUIE9GIHRhcmdtYXRjaC5oCi0jaWZkZWYgQkZENjQKLSAgYWxwaGEqLSotbmV0YnNkKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmNjRfYWxwaGFfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmYWxwaGFfbGl0dGxlX3ZlYwotICAgIDs7Ci0gIGFscGhhKi0qLW5ldHdhcmUqKQotICAgIHRhcmdfZGVmdmVjPWVjb2ZmYWxwaGFfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1ubG0zMl9hbHBoYV92ZWMKLSAgICA7OwotICBhbHBoYSotKi1saW51eGVjb2ZmKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZmFscGhhX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjY0X2FscGhhX3ZlYwotICAgIDs7Ci0gIGFscGhhKi0qLWxpbnV4LWdudSogfCBhbHBoYSotKi1lbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGY2NF9hbHBoYV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ZWNvZmZhbHBoYV9saXR0bGVfdmVjCi0gICAgOzsKLSAgYWxwaGEqLSotKnZtcyopCi0gICAgdGFyZ19kZWZ2ZWM9dm1zX2FscGhhX3ZlYwotICAgIDs7Ci0gIGFscGhhKi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZhbHBoYV9saXR0bGVfdmVjCi0gICAgOzsKLSNlbmRpZiAvKiBCRkQ2NCAqLwotCi0gIGFyYy0qLWVsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFyY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2JpZ2FyY192ZWMKLSAgICA7OwotCi0gIGFybS0qLXJpc2NpeCopCi0gICAgdGFyZ19kZWZ2ZWM9cmlzY2l4X3ZlYwotICAgIDs7Ci0gIGFybS1lcG9jLXBlKikKLSAgICB0YXJnX2RlZnZlYz1hcm1fZXBvY19wZV9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJhcm1fZXBvY19wZV9saXR0bGVfdmVjIGFybV9lcG9jX3BlX2JpZ192ZWMgYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMgYXJtX2Vwb2NfcGVpX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPW5vCi0gICAgOzsKLSAgYXJtLSotcGUqKQotICAgIHRhcmdfZGVmdmVjPWFybXBlX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImFybXBlX2xpdHRsZV92ZWMgYXJtcGVfYmlnX3ZlYyBhcm1wZWlfbGl0dGxlX3ZlYyBhcm1wZWlfYmlnX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgYXJtLSotYW91dCB8IGFybWVsLSotYW91dCkJCi0gICAgdGFyZ19kZWZ2ZWM9YW91dF9hcm1fbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1hb3V0X2FybV9iaWdfdmVjCi0gICAgOzsKLSAgYXJtZWItKi1hb3V0KQotICAgIHRhcmdfZGVmdmVjPWFvdXRfYXJtX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9YW91dF9hcm1fbGl0dGxlX3ZlYwotICAgIDs7Ci0gIGFybS0qLWNvZmYpCi0gICAgdGFyZ19kZWZ2ZWM9YXJtY29mZl9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWFybWNvZmZfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBhcm0tKi1lbGYgfCBhcm0qLSotbGludXgtZ251KQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVhcm1fdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9iaWdhcm1fdmVjCi0gICAgOzsKLSAgYXJtLSotb2FiaSkKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMKLSAgICA7OwotCi0gIHRodW1iLSotY29mZikKLSAgICB0YXJnX2RlZnZlYz1hcm1jb2ZmX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YXJtY29mZl9iaWdfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHRodW1iLSotb2FiaSkKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMKLSAgICA7OwotICB0aHVtYi0qLWVsZikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfYmlnYXJtX3ZlYwotICAgIDs7Ci0gIHRodW1iLWVwb2MtcGUqKQotICAgIHRhcmdfZGVmdmVjPWFybV9lcG9jX3BlX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImFybV9lcG9jX3BlX2xpdHRsZV92ZWMgYXJtX2Vwb2NfcGVfYmlnX3ZlYyBhcm1fZXBvY19wZWlfbGl0dGxlX3ZlYyBhcm1fZXBvY19wZWlfYmlnX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9bm8KLSAgICA7OwotICB0aHVtYi0qLXBlKikKLSAgICB0YXJnX2RlZnZlYz1hcm1wZV9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJhcm1wZV9saXR0bGVfdmVjIGFybXBlX2JpZ192ZWMgYXJtcGVpX2xpdHRsZV92ZWMgYXJtcGVpX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHN0cm9uZ2FybS0qLWVsZikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfYmlnYXJtX3ZlYwotICAgIDs7Ci0gIHN0cm9uZ2FybS0qLWNvZmYpCi0gICAgdGFyZ19kZWZ2ZWM9YXJtY29mZl9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWFybWNvZmZfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIGEyOWstKi1lYm1vbiogfCBhMjlrLSotdWRpKiB8IGEyOWstKi1jb2ZmKiB8IGEyOWstKi1zeW0xKiB8IFwKLSAgYTI5ay0qLXZ4d29ya3MqIHwgYTI5ay0qLXN5c3YqKQotICAgIHRhcmdfZGVmdmVjPWEyOWtjb2ZmX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBhMjlrLSotYW91dCogfCBhMjlrLSotYnNkKiB8IGEyOWstKi12c3RhKikKLSAgICB0YXJnX2RlZnZlYz1zdW5vc19iaWdfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgYzMwLSotKmFvdXQqIHwgdGljMzAtKi0qYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9dGljMzBfYW91dF92ZWMKLSAgICA7OwotICBjMzAtKi0qY29mZiogfCB0aWMzMC0qLSpjb2ZmKikKLSAgICB0YXJnX2RlZnZlYz10aWMzMF9jb2ZmX3ZlYwotICAgIDs7Ci0KLSAgZDEwdi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2QxMHZfdmVjCi0gICAgOzsKLQotICBkMzB2LSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfZDMwdl92ZWMKLSAgICA7OwotCi0gIGZyMzAtKi1lbGYpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2ZyMzBfdmVjCi0gICAgOzsKLQotCi0gIGg4MzAwKi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9aDgzMDBjb2ZmX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIGg4NTAwLSotKikKLSAgICB0YXJnX2RlZnZlYz1oODUwMGNvZmZfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgaHBwYSotKi0qZWxmKiB8IGhwcGEqLSotbGl0ZXMqIHwgaHBwYSotKi1zeXN2NCogfCBocHBhKi0qLXJ0ZW1zKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaHBwYV92ZWMKLSAgICA7OwotI2lmIGRlZmluZWQgKEhPU1RfSFBQQUhQVVgpIHx8IGRlZmluZWQgKEhPU1RfSFBQQUJTRCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBT1NGKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFNUEVJWCkKLSAgaHBwYSotKi1ic2QqKQotICAgIHRhcmdfZGVmdmVjPXNvbV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2hwcGFfdmVjCi0gICAgOzsKLSAgaHBwYSotKi1ocHV4KiB8IGhwcGEqLSotaGl1eCogfCBocHBhKi0qLW1wZWl4KikKLSAgICB0YXJnX2RlZnZlYz1zb21fdmVjCi0gICAgOzsKLSAgaHBwYSotKi1vc2YqKQotICAgIHRhcmdfZGVmdmVjPXNvbV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2hwcGFfdmVjCi0gICAgOzsKLSNlbmRpZiAvKiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFCU0QpIHx8IGRlZmluZWQgKEhPU1RfSFBQQU9TRikgKi8KLQotICBpWzM0NTZdODYtKi1zY28zLjJ2NSpjb2ZmKQotICAgIHRhcmdfZGVmdmVjPWkzODZjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1zeXN2NCogfCBpWzM0NTZdODYtKi11bml4d2FyZSB8IGlbMzQ1Nl04Ni0qLXNvbGFyaXMyKiB8IFwKLSAgaVszNDU2XTg2LSotZWxmIHwgaVszNDU2XTg2LSotc2NvMy4ydjUqIHwgaVszNDU2XTg2LSotZnJlZWJzZGVsZiogfCBcCi0gIGlbMzQ1Nl04Ni0qLWRndXgqIHwgaVszNDU2XTg2LSotc3lzdjUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2Y29mZl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1ydGVtc2VsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJpMzg2Y29mZl92ZWMgaTM4NmFvdXRfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW1zZG9zZGpncHAqIHwgaVszNDU2XSotKi1nbzMyKiB8IGlbMzQ1Nl04Ni1nbzMyLXJ0ZW1zKiApCi0gICAgdGFyZ19kZWZ2ZWM9Z28zMmNvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJnbzMyc3R1YmJlZGNvZmZfdmVjIGkzODZhb3V0X3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zeXN2KiB8IGlbMzQ1Nl04Ni0qLWlzYyogfCBpWzM0NTZdODYtKi1zY28qIHwgaVszNDU2XTg2LSotY29mZiB8IFwKLSAgaVszNDU2XTg2LSotYWl4KikKLSAgICB0YXJnX2RlZnZlYz1pMzg2Y29mZl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYqLSotcnRlbXMqKQotICAgIHRhcmdfZGVmdmVjPWkzODZjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2kzODZfdmVjIGkzODZhb3V0X3ZlYyIKLSAgICA7OwotIGlbMzQ1Nl04Ni1zZXF1ZW50LWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmR5bml4X3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpWzM0NTZdODYtKi1ic2QqKQotICAgIHRhcmdfZGVmdmVjPWkzODZic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWZyZWVic2QqKQotICAgIHRhcmdfZGVmdmVjPWkzODZmcmVlYnNkX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2YnNkX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpWzM0NTZdODYtKi1uZXRic2QqIHwgaVszNDU2XTg2LSotb3BlbmJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4Nm5ldGJzZF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9aTM4NmJzZF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbmV0d2FyZSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJubG0zMl9pMzg2X3ZlYyBpMzg2Y29mZl92ZWMgaTM4NmFvdXRfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWxpbnV4KmFvdXQqKQotICAgIHRhcmdfZGVmdmVjPWkzODZsaW51eF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWxpbnV4LWdudSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWkzODZsaW51eF92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1seW54b3MqKQotICAgIHRhcmdfZGVmdmVjPWkzODZseW54X2NvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWkzODZseW54X2FvdXRfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotZ251KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1tYWNoKiB8IGlbMzQ1Nl04Ni0qLW9zZjFtayopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4Nm1hY2gzX3ZlYwotICAgIHRhcmdfY2ZsYWdzPS1EU1RBVF9GT1JfRVhFQwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpWzM0NTZdODYtKi1vczlrKQotICAgIHRhcmdfZGVmdmVjPWkzODZvczlrX3ZlYwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW1zZG9zKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2YW91dF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9aTM4Nm1zZG9zX3ZlYwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW1vc3MqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaTM4Nm1zZG9zX3ZlYyBpMzg2YW91dF92ZWMiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotYmVvc3BlKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2cGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJpMzg2cGVfdmVjIGkzODZwZWlfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWJlb3NlbGYqIHwgaVszNDU2XTg2LSotYmVvcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJpMzg2cGVfdmVjIGkzODZwZWlfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW1pbmd3MzIqIHwgaVszNDU2XTg2LSotY3lnd2luKiB8IGlbMzQ1Nl04Ni0qLXdpbm50IHwgaVszNDU2XTg2LSotcGUpCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NnBlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaTM4NnBlX3ZlYyBpMzg2cGVpX3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtbm9uZS0qKQotICAgIHRhcmdfZGVmdmVjPWkzODZjb2ZmX3ZlYwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWFvdXQqIHwgaVszNDU2XTg2Ki0qLXZzdGEqKQotICAgIHRhcmdfZGVmdmVjPWkzODZhb3V0X3ZlYwotICAgIDs7Ci0KLSAgaTg2MC0qLW1hY2gzKiB8IGk4NjAtKi1vc2YxKiB8IGk4NjAtKi1jb2ZmKikKLSAgICB0YXJnX2RlZnZlYz1pODYwY29mZl92ZWMKLSAgICA7OwotICBpODYwLSotc3lzdjQqIHwgaTg2MC0qLWVsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2k4NjBfdmVjCi0gICAgOzsKLQotICBpOTYwLSotdnh3b3JrczQqIHwgaTk2MC0qLXZ4d29ya3M1LjApCi0gICAgdGFyZ19kZWZ2ZWM9Yl9vdXRfdmVjX2xpdHRsZV9ob3N0Ci0gICAgdGFyZ19zZWx2ZWNzPSJiX291dF92ZWNfYmlnX2hvc3QgaWNvZmZfbGl0dGxlX3ZlYyBpY29mZl9iaWdfdmVjIGllZWVfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpOTYwLSotdnh3b3JrczUuKiB8IGk5NjAtKi1jb2ZmKiB8IGk5NjAtKi1zeXN2KiB8IGk5NjAtKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9aWNvZmZfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaWNvZmZfYmlnX3ZlYyBiX291dF92ZWNfbGl0dGxlX2hvc3QgYl9vdXRfdmVjX2JpZ19ob3N0IGllZWVfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpOTYwLSotdnh3b3JrcyogfCBpOTYwLSotYW91dCogfCBpOTYwLSotYm91dCogfCBpOTYwLSotbmluZHkqKQotICAgIHRhcmdfZGVmdmVjPWJfb3V0X3ZlY19saXR0bGVfaG9zdAotICAgIHRhcmdfc2VsdmVjcz0iYl9vdXRfdmVjX2JpZ19ob3N0IGljb2ZmX2xpdHRsZV92ZWMgaWNvZmZfYmlnX3ZlYyBpZWVlX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBtMzJyLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbTMycl92ZWMKLSAgICA7OwotCi0gIG02OCotYXBvbGxvLSopCi0gICAgdGFyZ19kZWZ2ZWM9YXBvbGxvY29mZl92ZWMKLSAgICA7OwotICBtNjgqLWJ1bGwtc3lzdiopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a2NvZmZ1bl92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki1tb3Rvcm9sYS1zeXN2KikKLSAgICB0YXJnX2RlZnZlYz1tNjhrc3lzdmNvZmZfdmVjCi0gICAgOzsKLSAgbTY4Ki1ocC1ic2QqKQotICAgIHRhcmdfZGVmdmVjPWhwMzAwYnNkX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLSotYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9YW91dDBfYmlnX3ZlYwotICAgICMgV2UgaW5jbHVkZSBjaXNjb19jb3JlX3ZlYyBoZXJlLCByYXRoZXIgdGhhbiBtYWtpbmcgYSBzZXBhcmF0ZSBjaXNjbwotICAgICMgY29uZmlndXJhdGlvbiwgc28gdGhhdCBjaXNjby1jb3JlLmMgZ2V0cyByb3V0aW5lbHkgdGVzdGVkIGF0Ci0gICAgIyBsZWFzdCBmb3IgY29tcGlsYXRpb24uCi0gICAgdGFyZ19zZWx2ZWNzPSJjaXNjb19jb3JlX3ZlYyBpZWVlX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki0qLWVsZiogfCBtNjgqLSotc3lzdjQqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tNjhrX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibTY4a2NvZmZfdmVjIGllZWVfdmVjIgotICAgIDs7Ci0gIG02OCotKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a2NvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJtNjhrY29mZl92ZWMgdmVyc2Fkb3NfdmVjIGllZWVfdmVjIGFvdXQwX2JpZ192ZWMiCi0gICAgOzsKLSAgbTY4Ki0qLWNvZmYqIHwgbTY4Ki0qLXN5c3YqKQotICAgIHRhcmdfZGVmdmVjPW02OGtjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibTY4a2NvZmZfdmVjIHZlcnNhZG9zX3ZlYyBpZWVlX3ZlYyIKLSAgICA7OwotICBtNjgqLSotaHB1eCopCi0gICAgdGFyZ19kZWZ2ZWM9aHAzMDBocHV4X3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLSotbGludXgqYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a2xpbnV4X3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfbTY4a192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki0qLWxpbnV4LWdudSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX202OGtfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPW02OGtsaW51eF92ZWMKLSAgICA7OwotICBtNjgqLSotZ251KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbTY4a192ZWMKLSAgICAjIHRhcmdfc2VsdmVjcz1tNjhrbWFjaDNfdmVjCi0gICAgIyB0YXJnX2NmbGFncz0tRFNUQVRfRk9SX0VYRUMKLSAgICA7OwotICBtNjgqLSotbHlueG9zKikKLSAgICB0YXJnX2RlZnZlYz1tNjhrbHlueF9jb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1tNjhrbHlueF9hb3V0X3ZlYwotICAgIDs7Ci0gIG02OCotaHAqLW5ldGJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4azRrbmV0YnNkX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibTY4a25ldGJzZF92ZWMgaHAzMDBic2RfdmVjIHN1bm9zX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotKi1uZXRic2QqIHwgbTY4Ki0qLW9wZW5ic2QqKQotICAgIHRhcmdfZGVmdmVjPW02OGtuZXRic2RfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJtNjhrNGtuZXRic2RfdmVjIGhwMzAwYnNkX3ZlYyBzdW5vc19iaWdfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLSotc3Vub3MqIHwgbTY4Ki0qLW9zNjhrKiB8IG02OCotKi12eHdvcmtzKiB8IG02OCotbmV0eC0qIHwgXAotICBtNjgqLSotYnNkKiB8IG02OCotKi12c3RhKikKLSAgICB0YXJnX2RlZnZlYz1zdW5vc19iaWdfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotZXJpY3Nzb24tKikKLSAgICB0YXJnX2RlZnZlYz1zdW5vc19iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJtNjhrY29mZl92ZWMgdmVyc2Fkb3NfdmVjIHRla2hleF92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotY2JtLSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX202OGtfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPW02OGtjb2ZmX3ZlYwotICAgIDs7Ci0gIG02OCotYXBwbGUtYXV4KikKLSAgICB0YXJnX2RlZnZlYz1tNjhrYXV4X2NvZmZfdmVjCi0gICAgOzsKLSAgbTY4Ki0qLXBzb3MqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tNjhrX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pZWVlX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIG04OCotaGFycmlzLWN4dXgqIHwgbTg4Ki0qLWRndXgqIHwgbTg4Ki0qLXN5c3Y0KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbTg4a192ZWMKLSAgICB0YXJnX3NlbHZlY3M9bTg4a2Jjc192ZWMKLSAgICA7OwotICBtODgqLSotbWFjaDMqKQotICAgIHRhcmdfZGVmdmVjPW04OGttYWNoM192ZWMKLSAgICB0YXJnX2NmbGFncz0tRFNUQVRfRk9SX0VYRUMKLSAgICA7OwotICBtODgqLSotKikKLSAgICB0YXJnX2RlZnZlYz1tODhrYmNzX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIG1jb3JlLSotZWxmKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tY29yZV9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbWNvcmVfYmlnX3ZlYyBiZmRfZWxmMzJfbWNvcmVfbGl0dGxlX3ZlYyIKLSAgICA7OwotICBtY29yZS0qLXBlKQotICAgIHRhcmdfZGVmdmVjPW1jb3JlX3BlX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im1jb3JlX3BlX2JpZ192ZWMgbWNvcmVfcGVfbGl0dGxlX3ZlYyBtY29yZV9wZWlfYmlnX3ZlYyBtY29yZV9wZWlfbGl0dGxlX3ZlYyIKLSAgICA7OwotCi0gIG1pcHMqLWJpZy0qKQotICAgIHRhcmdfZGVmdmVjPWVjb2ZmX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ZWNvZmZfbGl0dGxlX3ZlYwotICAgIDs7Ci0gIG1pcHMtZGVjLW5ldGJzZCogfCBtaXBzKmVsKi0qLW5ldGJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfYmlnbWlwc192ZWMgZWNvZmZfbGl0dGxlX3ZlYyBlY29mZl9iaWdfdmVjIgotICAgIDs7Ci0gbWlwcyotKi1uZXRic2QqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9iaWdtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjIGVjb2ZmX2JpZ192ZWMgZWNvZmZfbGl0dGxlX3ZlYyIKLSAgICA7OwotICBtaXBzKi1kZWMtYnNkKikKLSAgICB0YXJnX2RlZnZlYz1hb3V0X21pcHNfbGl0dGxlX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtaXBzKi1kZWMtbWFjaDMqKQotICAgIHRhcmdfZGVmdmVjPWFvdXRfbWlwc19saXR0bGVfdmVjCi0gICAgdGFyZ19jZmxhZ3M9LURTVEFUX0ZPUl9FWEVDCi0gICAgOzsKLSAgbWlwcyotZGVjLSogfCBtaXBzKmVsLSotZWNvZmYqKQotICAgIHRhcmdfZGVmdmVjPWVjb2ZmX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ZWNvZmZfYmlnX3ZlYwotICAgIDs7Ci0gIG1pcHMqLSotZWNvZmYqKQotICAgIHRhcmdfZGVmdmVjPWVjb2ZmX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ZWNvZmZfbGl0dGxlX3ZlYwotICAgIDs7Ci0gIG1pcHMqLSotaXJpeDYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9iaWdtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyBiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMiCi0gICAgOzsKLSAgbWlwcyotKi1pcml4NSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgZWNvZmZfYmlnX3ZlYyBlY29mZl9saXR0bGVfdmVjIgotICAgIDs7Ci0gIG1pcHMqLXNnaS0qIHwgbWlwcyotKi1ic2QqKQotICAgIHRhcmdfZGVmdmVjPWVjb2ZmX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ZWNvZmZfbGl0dGxlX3ZlYwotICAgIDs7Ci0gIG1pcHMqLSotbG5ld3MqKQotICAgIHRhcmdfZGVmdmVjPWVjb2ZmX2JpZ2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImVjb2ZmX2xpdHRsZV92ZWMgZWNvZmZfYmlnX3ZlYyIKLSAgICA7OwotICBtaXBzKi0qLW1hY2gzKikKLSAgICB0YXJnX2RlZnZlYz1hb3V0X21pcHNfbGl0dGxlX3ZlYwotICAgIHRhcmdfY2ZsYWdzPS1EU1RBVF9GT1JfRVhFQwotICAgIDs7Ci0gIG1pcHMqLSotc3lzdjQqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9iaWdtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjIGVjb2ZmX2JpZ192ZWMgZWNvZmZfbGl0dGxlX3ZlYyIKLSAgICA7OwotICBtaXBzKi0qLXN5c3YqIHwgbWlwcyotKi1yaXNjb3MqKQotICAgIHRhcmdfZGVmdmVjPWVjb2ZmX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ZWNvZmZfbGl0dGxlX3ZlYwotICAgIDs7Ci0gIG1pcHMqZWwtKi1lbGYqIHwgbWlwcyplbC0qLXJ0ZW1zKiB8IG1pcHMqZWwtKi12eHdvcmtzKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9iaWdtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIgotICAgIDs7Ci0gIG1pcHMqLSotZWxmKiB8IG1pcHMqLSotcnRlbXMqIHwgbWlwcyotKi12eHdvcmtzKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIgotICAgIDs7Ci0gIG1pcHMqLSotbm9uZSkKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIgotICAgIDs7Ci0gIG1pcHMqZWwqLSotbGludXgtZ251KiB8IG1pcHMqZWwqLSotb3BlbmJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyBlY29mZl9saXR0bGVfdmVjIGVjb2ZmX2JpZ192ZWMiCi0gICAgOzsKLSAgbWlwcyotKi1saW51eC1nbnUqIHwgbWlwcyotKi1vcGVuYnNkKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIGVjb2ZmX2JpZ192ZWMgZWNvZmZfbGl0dGxlX3ZlYyIKLSAgICA7OwotCi0gIG1uMTAyMDAtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tbjEwMjAwX3ZlYwotICAgIDs7Ci0KLSAgbW4xMDMwMC0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX21uMTAzMDBfdmVjCi0gICAgOzsKLQotICBuczMyay1wYzUzMi1tYWNoKiB8IG5zMzJrLXBjNTMyLXV4KikKLSAgICB0YXJnX2RlZnZlYz1wYzUzMm1hY2hhb3V0X3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBuczMyay0qLW5ldGJzZCogfCBuczMyay0qLWxpdGVzKiB8IG5zMzJrLSotb3BlbmJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9cGM1MzJuZXRic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgcG93ZXJwYy0qLWFpeCogfCBwb3dlcnBjLSotYmVvcyopCi0gICAgdGFyZ19kZWZ2ZWM9cnM2MDAwY29mZl92ZWMKLSAgICA7OwotICBwb3dlcnBjLSotKmJzZCogfCBwb3dlcnBjLSotZWxmKiB8IHBvd2VycGMtKi1zeXN2NCogfCBwb3dlcnBjLSotZWFiaSogfCBcCi0gIHBvd2VycGMtKi1zb2xhcmlzMiogfCBwb3dlcnBjLSotbGludXgtZ251KiB8IHBvd2VycGMtKi1ydGVtcyogfCBcCi0gIHBvd2VycGMtKi12eHdvcmtzKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfcG93ZXJwY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9InJzNjAwMGNvZmZfdmVjIGJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjIHBwY2Jvb3RfdmVjIgotICAgIDs7Ci0gIHBvd2VycGMtKi1tYWNvcyogfCBwb3dlcnBjLSotbXB3KikKLSAgICB0YXJnX2RlZnZlYz1wbWFjX3hjb2ZmX3ZlYwotICAgIDs7Ci0gIHBvd2VycGMtKi1uZXR3YXJlKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfcG93ZXJwY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im5sbTMyX3Bvd2VycGNfdmVjIHJzNjAwMGNvZmZfdmVjIgotICAgIDs7Ci0gIHBvd2VycGNsZS0qLWVsZiogfCBwb3dlcnBjbGUtKi1zeXN2NCogfCBwb3dlcnBjbGUtKi1lYWJpKiB8IFwKLSAgcG93ZXJwY2xlLSotc29sYXJpczIqIHwgcG93ZXJwY2xlLSotbGludXgtZ251KiB8IHBvd2VycGNsZS0qLXZ4d29ya3MqIHxcCi0gIHBvd2VycGNsZS0qLXJ0ZW1zKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0icnM2MDAwY29mZl92ZWMgYmZkX2VsZjMyX3Bvd2VycGNfdmVjIHBwY2Jvb3RfdmVjIgotICAgIDs7Ci0KLSAgcG93ZXJwY2xlLSotcGUgfCBwb3dlcnBjbGUtKi13aW5udCogfCBwb3dlcnBjbGUtKi1jeWd3aW4qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9wb3dlcnBjbGVfcGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfcG93ZXJwY2xlX3BlaV92ZWMgYmZkX3Bvd2VycGNfcGVpX3ZlYyBiZmRfcG93ZXJwY2xlX3BlX3ZlYyBiZmRfcG93ZXJwY19wZV92ZWMiCi0gICAgOzsKLQotICByczYwMDAtKi0qKQotICAgIHRhcmdfZGVmdmVjPXJzNjAwMGNvZmZfdmVjCi0gICAgOzsKLQotICBzaC0qLWVsZiogfCBzaC0qLXJ0ZW1zZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfc2hfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfc2hsX3ZlYyBzaGNvZmZfdmVjIHNobGNvZmZfdmVjIHNoY29mZl9zbWFsbF92ZWMgc2hsY29mZl9zbWFsbF92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHNoLSotKiB8IHNoLSotcnRlbXMqKQotICAgIHRhcmdfZGVmdmVjPXNoY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9InNoY29mZl92ZWMgc2hsY29mZl92ZWMgc2hjb2ZmX3NtYWxsX3ZlYyBzaGxjb2ZmX3NtYWxsX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBzcGFyY2xldC0qLWFvdXQqKQotICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9c3BhcmNsZV9hb3V0X3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzcGFyYzg2eC0qLWFvdXQqKQotICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgc3BhcmNsaXRlLSotZWxmKiB8IHNwYXJjODZ4LSotZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfc3BhcmNfdmVjCi0gICAgOzsKLSAgc3BhcmMtKi1saW51eCphb3V0KikKLSAgICB0YXJnX2RlZnZlYz1zcGFyY2xpbnV4X3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX3NwYXJjX3ZlYyBzdW5vc19iaWdfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzcGFyYy0qLWxpbnV4LWdudSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NwYXJjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ic3BhcmNsaW51eF92ZWMgc3Vub3NfYmlnX3ZlYyIKLSAgICA7OwotICBzcGFyYy0qLWx5bnhvcyopCi0gICAgdGFyZ19kZWZ2ZWM9c3BhcmNseW54X2NvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPXNwYXJjbHlueF9hb3V0X3ZlYwotICAgIDs7Ci0gIHNwYXJjLSotbmV0YnNkKiB8IHNwYXJjLSotb3BlbmJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9c3BhcmNuZXRic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHNwYXJjLSotZWxmKiB8IHNwYXJjLSotc29sYXJpczIqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9c3Vub3NfYmlnX3ZlYwotICAgIDs7Ci0gIHNwYXJjLSotc3lzdjQqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192ZWMKLSAgICA7OwotICBzcGFyYy0qLW5ldHdhcmUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im5sbTMyX3NwYXJjX3ZlYyBzdW5vc19iaWdfdmVjIgotICAgIDs7Ci0jaWZkZWYgQkZENjQKLSAgc3BhcmM2NC0qLWFvdXQqKQotICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgc3BhcmM2NC0qLWxpbnV4LWdudSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjY0X3NwYXJjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX3NwYXJjX3ZlYyBzcGFyY2xpbnV4X3ZlYyBzdW5vc19iaWdfdmVjIgotICAgIDs7Ci0gIHNwYXJjNjQtKi1lbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGY2NF9zcGFyY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX3NwYXJjX3ZlYwotICAgIDs7ICAgIAotI2VuZGlmIC8qIEJGRDY0ICovCi0gIHNwYXJjKi0qLWNvZmYqKQotICAgIHRhcmdfZGVmdmVjPXNwYXJjY29mZl92ZWMKLSAgICA7OwotICBzcGFyYyotKi0qIHwgc3BhcmMqLSotcnRlbXMqKQotICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotI2lmIEhBVkVfaG9zdF9hb3V0X3ZlYwotICB0YWhvZS0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9aG9zdF9hb3V0X3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotI2VuZGlmCi0KLSAgdGljODAqLSotKikKLSAgICB0YXJnX2RlZnZlYz10aWM4MGNvZmZfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLQotICB2ODUwLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfdjg1MF92ZWMKLSAgICA7OwotICB2ODUwZS0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3Y4NTBfdmVjCi0gICAgOzsKLSAgdjg1MGVhLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfdjg1MF92ZWMKLSAgICA7OwotI2lmIEhBVkVfaG9zdF9hb3V0X3ZlYwotICB2YXgtKi1ic2QqIHwgdmF4LSotdWx0cml4KikKLSAgICB0YXJnX2RlZnZlYz1ob3N0X2FvdXRfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0jZW5kaWYKLQotICB2YXgqLSotKnZtcyopCi0gICAgdGFyZ19kZWZ2ZWM9dm1zX3ZheF92ZWMKLSAgICA7OwotCi0gIHdlMzJrLSotKikKLSAgICB0YXJnX2RlZnZlYz13ZTMya2NvZmZfdmVjCi0gICAgOzsKLQotICB3NjUtKi0qKQotICAgIHRhcmdfZGVmdmVjPXc2NV92ZWMKLSAgICA7OwotCi0gIHo4ayotKi0qKQotICAgIHRhcmdfZGVmdmVjPXo4a2NvZmZfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgKi0qLWllZWUqKQotICAgIHRhcmdfZGVmdmVjPWllZWVfdmVjCi0gICAgOzsKLQotICAqLWFkb2JlLSopCi0gICAgdGFyZ19kZWZ2ZWM9YV9vdXRfYWRvYmVfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgKi1zb255LSopCi0gICAgdGFyZ19kZWZ2ZWM9bmV3c29zM192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICAqLXRhbmRlbS0qKQotICAgIHRhcmdfZGVmdmVjPW02OGtjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pZWVlX3ZlYwotICAgIDs7Ci0jIEVORCBPRiB0YXJnbWF0Y2guaAotICAqKQotICAgIGVjaG8gMT4mMiAiKioqIEJGRCBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldCAke3Rhcmd9LiIKLSAgICBlY2hvIDE+JjIgIioqKiBMb29rIGluIGJmZC9jb25maWcuYmZkIGZvciBzdXBwb3J0ZWQgdGFyZ2V0cy4iCi0gICAgZXhpdCAxCi0gICAgOzsKLWVzYWMKLQotIyBJZiB3ZSBzdXBwb3J0IGFueSBFTEYgdGFyZ2V0LCB0aGVuIGF1dG9tYXRpY2FsbHkgYWRkIHN1cHBvcnQgZm9yIHRoZQotIyBnZW5lcmljIEVMRiB0YXJnZXRzLiAgVGhpcyBwZXJtaXRzIGFuIG9iamR1bXAgd2l0aCBzb21lIEVMRiBzdXBwb3J0Ci0jIHRvIGJlIHVzZWQgb24gYW4gYXJiaXRyYXJ5IEVMRiBmaWxlIGZvciBhbnl0aGluZyBvdGhlciB0aGFuCi0jIHJlbG9jYXRpb24gaW5mb3JtYXRpb24uCi1jYXNlICIke3RhcmdfZGVmdmVjfSAke3Rhcmdfc2VsdmVjc30iIGluCi0gICpiZmRfZWxmNjQqKQotICAgIHRhcmdfc2VsdmVjcz0iJHt0YXJnX3NlbHZlY3N9IGJmZF9lbGY2NF9saXR0bGVfZ2VuZXJpY192ZWMgYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYyBiZmRfZWxmMzJfbGl0dGxlX2dlbmVyaWNfdmVjIGJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMiCi0gICAgOzsKLSAgKmJmZF9lbGYzMiopCi0gICAgdGFyZ19zZWx2ZWNzPSIke3Rhcmdfc2VsdmVjc30gYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYyBiZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjIgotICAgIDs7Ci1lc2FjCmRpZmYgLS1naXQgYS9iZmQvY29uZmlnLmluIGIvYmZkL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmYTQ1Yi4uMDAwMDAwMAotLS0gYS9iZmQvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIHlvdSBjYW4gc2FmZWx5IGluY2x1ZGUgYm90aCA8c3lzL3RpbWUuaD4gYW5kIDx0aW1lLmg+LiAgKi8KLSN1bmRlZiBUSU1FX1dJVEhfU1lTX1RJTUUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRENHRVRURVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZmNudGwgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRkNOVEwKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmZG9wZW4gZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRkRPUEVOCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVENXRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWFkdmlzZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NQURWSVNFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXByb3RlY3QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVBST1RFQ1QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRpdGltZXIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUSVRJTUVSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzY29uZiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TWVNDT05GCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVudC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9ESVJFTlRfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9GQ05UTF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkZGVmLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURERFRl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2Rpci5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfRElSX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0ZJTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvbmRpci5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcHJvY2ZzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QUk9DRlNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFMVUVTX0gKLQotLyogTmFtZSBvZiBwYWNrYWdlICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCi0jdW5kZWYgVkVSU0lPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbiAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogVXNlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz8gKi8KLSN1bmRlZiBVU0VfQklOQVJZX0ZPUEVOCi0KLS8qIERlZmluZSBpZiBzdHJzdHIgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKLQotLyogRGVmaW5lIGlmIG1hbGxvYyBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQwotCi0vKiBEZWZpbmUgaWYgcmVhbGxvYyBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MKLQotLyogRGVmaW5lIGlmIGZyZWUgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi0KLS8qIERlZmluZSBpZiBnZXRlbnYgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBwcnN0YXR1c190LiAqLwotI3VuZGVmIEhBVkVfUFJTVEFUVVNfVAotCi0vKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIHByc3RhdHVzX3QucHJfd2hvLiAqLwotI3VuZGVmIEhBVkVfUFJTVEFUVVNfVF9QUl9XSE8KLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBwc3RhdHVzX3QuICovCi0jdW5kZWYgSEFWRV9QU1RBVFVTX1QKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBwcnBzaW5mb190LiAqLwotI3VuZGVmIEhBVkVfUFJQU0lORk9fVAotCi0vKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIHBzaW5mb190LiAqLwotI3VuZGVmIEhBVkVfUFNJTkZPX1QKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBsd3BzdGF0dXNfdC4gKi8KLSN1bmRlZiBIQVZFX0xXUFNUQVRVU19UCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgbHdwc3RhdHVzX3QucHJfY29udGV4dC4gKi8KLSN1bmRlZiBIQVZFX0xXUFNUQVRVU19UX1BSX0NPTlRFWFQKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBsd3BzdGF0dXNfdC5wcl9yZWcuICovCi0jdW5kZWYgSEFWRV9MV1BTVEFUVVNfVF9QUl9SRUcKLQotLyogTmFtZSBvZiBob3N0IHNwZWNpZmljIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gdHJhZC1jb3JlLmMuICovCi0jdW5kZWYgVFJBRF9IRUFERVIKLQotLyogVXNlIG1tYXAgaWYgaXQncyBhdmFpbGFibGU/ICovCi0jdW5kZWYgVVNFX01NQVAKLQpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZ3VyZSBiL2JmZC9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3YjVhOGYuLjAwMDAwMDAKLS0tIGEvYmZkL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDU5ODcgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9bm9dIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLTY0LWJpdC1iZmQgICAgIDY0LWJpdCBzdXBwb3J0IChvbiBob3N0cyB3aXRoIG5hcnJvd2VyIHdvcmQgc2l6ZXMpIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLW1tYXAgICAgICAgICAgICAgdHJ5IHVzaW5nIG1tYXAgZm9yIEJGRCBpbnB1dCBmaWxlcyBpZiBhdmFpbGFibGUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPWxpYmJmZC5jCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBlbHNlCi0gICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBmaQotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU5NDogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MTU6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLXRhcmdldF9hbGlhcz0kdGFyZ2V0Ci1jYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLXRhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKLXRhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi10YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotdGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYzMzogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjU4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2ODg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3Mzk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc3MTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgNzgyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Nzg3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgxMzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgxODogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODI3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg0NjogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg3ODogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTExOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk2NDogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDIxOiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLQotUEFDS0FHRT1iZmQKLQotVkVSU0lPTj0yLjkuNAotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0IiAxPiYyOyBleGl0IDE7IH0KLWZpCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLUVPRgotCi0KLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNjc6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBQ0xPQ0FMPWFjbG9jYWwKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA4MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0NPTkY9YXV0b2NvbmYKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDkzOiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b21ha2UgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPTUFLRT1hdXRvbWFrZQotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPTUFLRT0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b21ha2UiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEwNjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTE5OiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBNQUtFSU5GTz1tYWtlaW5mbwotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotCi0KLWlmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFyOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNDI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUj0iJHthY190b29sX3ByZWZpeH1hciIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiICYmIGFjX2N2X3Byb2dfQVI9ImFyIgotZmkKLWZpCi1BUj0iJGFjX2N2X3Byb2dfQVIiCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE3NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIwNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgUkFOTElCPSI6IgotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPW5vCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3N0YXRpYz15ZXMKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI4OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCi0gIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMjk6IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIgPiY1Ci0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAvKiB8IFtBLVphLXpdOlxcKikKLSAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzQ3OiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLWVsc2UKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNTA6IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9MRCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotICAgICAgICB0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmkKLWZpCi0KLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi10ZXN0IC16ICIkTEQiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotCi1lY2hvICRhY19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM4NjogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ251X2xkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2dudV9sZCIgMT4mNgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQwMjogY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX05NJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluIC91c3IvdWNiIC91c3IvY2NzL2JpbiAkUEFUSCAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgIGFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0gICAgICBlbHNlCi0gICAgICAgIGFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0iCi0gICAgICBmaQotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi0KLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLWVjaG8gIiRhY190IiIkTk0iIDE+JjYKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDM3OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdGRhdGEKLWlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsCi10aGVuCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotICBhY19jdl9wcm9nX0xOX1M9ImxuIC1zIgotZWxzZQotICBhY19jdl9wcm9nX0xOX1M9bG4KLWZpCi1maQotTE5fUz0iJGFjX2N2X3Byb2dfTE5fUyIKLWlmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0KLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnI2xpbmUgMTQ3MyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ3NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0OTk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTMxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSJkbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIiAmJiBhY19jdl9wcm9nX0RMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1NjY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iJHthY190b29sX3ByZWZpeH1hcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU5ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSJhcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiICYmIGFjX2N2X3Byb2dfQVM9ImZhbHNlIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIEFTPSJmYWxzZSIKLWZpCi1maQotCi0KLSAgOzsKLQotZXNhYwotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIExOX1M9IiRMTl9TIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRob3N0IFwKLXx8IHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbGlidG9vbCBjb25maWd1cmUgZmFpbGVkIiAxPiYyOyBleGl0IDE7IH0KLQotIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKLSMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS02NC1iaXQtYmZkIG9yIC0tZGlzYWJsZS02NC1iaXQtYmZkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlXzY0X2JpdF9iZmQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlXzY0X2JpdF9iZmQiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSAgd2FudDY0PXRydWUgIDs7Ci0gIG5vKSAgIHdhbnQ2ND1mYWxzZSA7OwotICAqKSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIDY0LWJpdC1iZmQgb3B0aW9uIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLWVsc2UKLSAgd2FudDY0PWZhbHNlCi1maQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRhcmdldHMgb3IgLS1kaXNhYmxlLXRhcmdldHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfdGFyZ2V0cytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfdGFyZ2V0cyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJyIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjCi1maQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiBvciAtLWRpc2FibGUtY29tbW9uYmZkbGliIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2NvbW1vbmJmZGxpYitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfY29tbW9uYmZkbGliIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgY29tbW9uYmZkbGliPXRydWUgOzsKLSAgbm8pICBjb21tb25iZmRsaWI9ZmFsc2UgOzsKLSAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIEJGRCBjb21tb25iZmRsaWIgb3B0aW9uIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLW1tYXAgb3IgLS13aXRob3V0LW1tYXAgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX21tYXArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfbW1hcCIKLSAgY2FzZSAiJHt3aXRodmFsfSIgaW4KLSAgeWVzKSAgd2FudF9tbWFwPXRydWUgOzsKLSAgbm8pICAgd2FudF9tbWFwPWZhbHNlIDs7Ci0gICopICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7d2l0aHZhbH0gZm9yIEJGRCB3aXRoLW1tYXAgb3B0aW9uIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLWVsc2UKLSAgd2FudF9tbWFwPWZhbHNlCi1maQotCi0KLQotCi0KLWlmIHRlc3QgLXogIiR0YXJnZXQiIDsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcxODogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQotICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKLSAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9bm8KLWZpCi0KLSAgZWNobyAiJGFjX3QiIiRVU0VfTUFJTlRBSU5FUl9NT0RFIiAxPiY2Ci0gIAotCi1pZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPQotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9JyMnCi1lbHNlCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPScjJwotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9Ci1maQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3NDE6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3NDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3NTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3NzQ6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTc3OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3ODY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgwNTogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTgxNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLQotaG9zdDY0PWZhbHNlCi10YXJnZXQ2ND1mYWxzZQotCi0jIGhvc3Qgc3R1ZmY6Ci0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg0NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg3NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MjU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NTc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDE5NjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTczOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5OTk6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDA0OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDEzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMzI6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLQotQUxMX0xJTkdVQVM9Ci1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA2NjogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDgxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDg3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDk4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTA0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTE1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTIxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTQ2OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTUxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTU5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxNzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE5NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjE1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi1pZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOwotZXhpdCAoMCk7IH0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI1MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjU1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi10eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7Ci0vKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLWNoYXIgKipwOwotLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLXN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgotICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0gICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLwotY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwotY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KLSsrY2NwOwotcCA9IChjaGFyKiopIGNjcDsKLWNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOwoteyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciAqdDsKLSAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAqdCsrID0gMDsKLX0KLXsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCi0gIGludCB4W10gPSB7MjUsIDE3fTsKLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgKytmb287Ci19Ci17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7Ci0gIGlwdHIgcCA9IDA7Ci0gICsrcDsKLX0KLXsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07Ci0gIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLX0KLXsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCi0gIGNvbnN0IGludCBmb28gPSAxMDsKLX0KLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMDQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMyNTogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzMyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMzOTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNjU6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNzAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM5ODogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDAzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDMzOiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQzOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDQ1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ2NjogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDcxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0OTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTMxOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUzNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NjE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1NjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU4OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjE2OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjYyNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjQzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2Njg6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjczICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjc4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MDc6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3MTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjczNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc2MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjc2OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjkwODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5MzY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTQxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTQ2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk3NjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk4MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDMzOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDM4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNjE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA5NTogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTAwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzEwNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxMjg6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzE0ODogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTY3OiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTcyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMxNzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTk0OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxOTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzIyMjogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyMzAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjQxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjU3OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyNjIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI5NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzMzMTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzMzNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzU5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzg2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQyMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDU0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDYyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ5NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1Mjg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTY0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjU0OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjgyOiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjg3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM2OTI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi0jIFBlcm1pdCBob3N0IHNwZWNpZmljIHNldHRpbmdzLgotLiAke3NyY2Rpcn0vY29uZmlndXJlLmhvc3QKLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3NzA6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotQkZEX0hPU1RfNjRCSVRfTE9ORz0wCi1CRkRfSE9TVF82NF9CSVRfREVGSU5FRD0wCi1CRkRfSE9TVF82NF9CSVQ9Ci1CRkRfSE9TVF9VXzY0X0JJVD0KLWlmIHRlc3QgIngke0hPU1RfNjRCSVRfVFlQRX0iID0gInhsb25nIjsgdGhlbgotICBCRkRfSE9TVF82NEJJVF9MT05HPTEKLWVsaWYgdGVzdCAieCR7SE9TVF82NEJJVF9UWVBFfSIgIT0gIngiOyB0aGVuCi0gIEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEPTEKLSAgQkZEX0hPU1RfNjRfQklUPSR7SE9TVF82NEJJVF9UWVBFfQotICBCRkRfSE9TVF9VXzY0X0JJVD0ke0hPU1RfVV82NEJJVF9UWVBFfQotZmkKLQotCi0KLQotCi0jIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0IC16ICIkQ0NfRk9SX0JVSUxEIjsgdGhlbgotICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICAgIENDX0ZPUl9CVUlMRD0nJChDQyknCi0gIGVsc2UKLSAgICBDQ19GT1JfQlVJTEQ9Z2NjCi0gIGZpCi1maQotCi0jIEFsc28gc2V0IEVYRUVYVF9GT1JfQlVJTEQuCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICBFWEVFWFRfRk9SX0JVSUxEPSckKEVYRUVYVCknCi1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBidWlsZCBzeXN0ZW0gZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4NTM6IGNoZWNraW5nIGZvciBidWlsZCBzeXN0ZW0gZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9idWlsZF9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBhY19jX3Rlc3QuYyA8PCAnRU9GJwotaW50IG1haW4oKSB7Ci0vKiBOb3RoaW5nIG5lZWRlZCBoZXJlICovCi19Ci1FT0YKLSAgICAke0NDX0ZPUl9CVUlMRH0gLW8gYWNfY190ZXN0IGFtX2NfdGVzdC5jIDE+JjUgMj4mNQotICAgIGJmZF9jdl9idWlsZF9leGVleHQ9YGVjaG8gYWNfY190ZXN0LiogfCBncmVwIC12IGFjX2NfdGVzdC5jIHwgc2VkIC1lIHMvYWNfY190ZXN0Ly9gCi0gICAgcm0gLWYgYWNfY190ZXN0KgotICAgIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiA9IHggJiYgYmZkX2N2X2J1aWxkX2V4ZWV4dD1ubwotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfYnVpbGRfZXhlZXh0IiAxPiY2Ci0gIEVYRUVYVF9GT1JfQlVJTEQ9IiIKLSAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFRfRk9SX0JVSUxEPSR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0KLWZpCi0KLQotZm9yIGFjX2hkciBpbiBzdGRkZWYuaCBzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggdGltZS5oIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg3ODogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM4ODMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM4ODg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIGZjbnRsLmggc3lzL2ZpbGUuaCBzeXMvdGltZS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzkxODogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5MjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM5Mjg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk1NTogY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl90aW1lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzk2MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci1pbnQgbWFpbigpIHsKLXN0cnVjdCB0bSAqdHA7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk2OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl90aW1lPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfdGltZT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfdGltZSIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3RpbWUgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxCi1FT0YKLQotZmkKLQotYWNfaGVhZGVyX2RpcmVudD1ubwotZm9yIGFjX2hkciBpbiBkaXJlbnQuaCBzeXMvbmRpci5oIHN5cy9kaXIuaCBuZGlyLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5OTQ6IGNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzOTk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDwkYWNfaGRyPgotaW50IG1haW4oKSB7Ci1ESVIgKmRpcnAgPSAwOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQwMDc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfZGlyZW50XyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSBhY19oZWFkZXJfZGlyZW50PSRhY19oZHI7IGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLSMgVHdvIHZlcnNpb25zIG9mIG9wZW5kaXIgZXQgYWwuIGFyZSBpbiAtbGRpciBhbmQgLWx4IG9uIFNDTyBYZW5peC4KLWlmIHRlc3QgJGFjX2hlYWRlcl9kaXJlbnQgPSBkaXJlbnQuaDsgdGhlbgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWxkaXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwMzI6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1sZGlyIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gZGlyJ18nb3BlbmRpciB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxkaXIgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDA0MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIG9wZW5kaXIoKTsKLQotaW50IG1haW4oKSB7Ci1vcGVuZGlyKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDUxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMSUJTPSIkTElCUyAtbGRpciIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbHgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwNzM6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1seCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIHgnXydvcGVuZGlyIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbHggICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDA4MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIG9wZW5kaXIoKTsKLQotaW50IG1haW4oKSB7Ci1vcGVuZGlyKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDkyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMSUJTPSIkTElCUyAtbHgiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZmkKLQotZm9yIGFjX2Z1bmMgaW4gZmNudGwgZ2V0cGFnZXNpemUgc2V0aXRpbWVyIHN5c2NvbmYgZmRvcGVuCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTE3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxNDU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotCi1jYXNlICIke2hvc3R9IiBpbgotKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MpCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBVU0VfQklOQVJZX0ZPUEVOIDEKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxODA6IGNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHN0cnN0cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQyMDY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHI9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU1RSU1RSIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIG1hbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjI3OiBjaGVja2luZyB3aGV0aGVyIG1hbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDIzMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBtYWxsb2MKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MjUzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX01BTExPQyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciByZWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyNzQ6IGNoZWNraW5nIHdoZXRoZXIgcmVhbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyNzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgcmVhbGxvYwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzMDA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2MiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9yZWFsbG9jID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzIxOiBjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MzI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGZyZWUKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzQ3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWU9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWU9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZSA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9GUkVFIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzY4OiBjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDM3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBnZXRlbnYKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Mzk0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52PXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52IiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52ID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOViAxCi1FT0YKLQotZmkKLQotCi0jIElmIHdlIGFyZSBjb25maWd1cmVkIG5hdGl2ZSwgcGljayBhIGNvcmUgZmlsZSBzdXBwb3J0IGZpbGUuCi1DT1JFRklMRT0KLUNPUkVGTEFHPQotVFJBRF9IRUFERVI9Ci1pZiB0ZXN0ICIke3RhcmdldH0iID0gIiR7aG9zdH0iOyB0aGVuCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0gIGFscGhhKi0qLWxpbnV4LWdudSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9hbHBoYWxpbnV4LmgiJwotCTs7Ci0gIGFscGhhKi0qLW5ldGJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIGFscGhhKi0qLSopCQlDT1JFRklMRT1vc2YtY29yZS5sbyA7OwotICBhcm0tKi1yaXNjaXgpCQlDT1JFRklMRT10cmFkLWNvcmUubG8gOzsKLSAgaHBwYSotKi1ocHV4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotaGl1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBocHBhKi0qLW1wZWl4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotYnNkKikJCUNPUkVGSUxFPSJocHV4LWNvcmUubG8gaHBwYWJzZC1jb3JlLmxvIgotCQkJQ09SRUZMQUc9Ii1ESFBVWF9DT1JFIC1ESFBQQUJTRF9DT1JFIiA7OwotICBpWzM0NTZdODYtc2VxdWVudC1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbzsKLQlUUkFEX0hFQURFUj0nImhvc3RzL3N5bW1ldHJ5LmgiJwotCTs7Ci0gIGlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3Y0KikgOzsKLSAgaVszNDU2XTg2LXNlcXVlbnQtc3lzdiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9zeW1tZXRyeS5oIicKLQk7OwotICBpWzM0NTZdODYtKi1ic2QqIHwgaVszNDU2XTg2LSotZnJlZWJzZCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2YnNkLmgiJwotCTs7Ci0gIGlbMzQ1Nl04Ni0qLW5ldGJzZCogfCBpWzM0NTZdODYtKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIGlbMzQ1Nl04Ni1lc2l4LXN5c3YzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2VzaXguaCInCi0JOzsKLSAgaVszNDU2XTg2LSotc2NvMy4ydjUqKQotCUNPUkVGSUxFPXNjbzUtY29yZS5sbwotCTs7Ci0gIGlbMzQ1Nl04Ni0qLXNjbyogfCBpWzM0NTZdODYtKi1pc2MqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTM4NnNjby5oIicKLQk7OwotICBpWzM0NTZdODYtKi1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2bWFjaDMuaCInCi0JOzsKLSAgaVszNDU2XTg2LSotbGludXgtZ251KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZsaW51eC5oIicKLQk7OwotICBpWzM0NTZdODYtKi1pc2MqKQlDT1JFRklMRT10cmFkLWNvcmUubG8gOzsKLSAgaVszNDU2XTg2LSotYWl4KikJQ09SRUZJTEU9YWl4Mzg2LWNvcmUubG8gOzsKLSAgaTg2MC0qLW1hY2gzKiB8IGk4NjAtKi1vc2YxKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2k4NjBtYWNoMy5oIicKLQk7OwotICBtaXBzLWRlYy1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbWlwc2JzZC5oIicKLQk7OwotICBtaXBzLWRlYy1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9taXBzbWFjaDMuaCInCi0JOzsKLSAgbWlwcy0qLW5ldGJzZCogfCBtaXBzKi0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgbWlwcy1kZWMtKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2RlY3N0YXRpb24uaCInCi0JOzsKLSAgbWlwcy1zZ2ktaXJpeDQqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy1zZ2ktaXJpeDUqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy1zZ2ktaXJpeDYqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy0qLW1hY2gzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL21pcHNtYWNoMy5oIicKLQk7OwotICBtaXBzLSotc3lzdjQqKQk7OwotICBtaXBzLSotc3lzdiogfCBtaXBzLSotcmlzY29zKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3Jpc2Nvcy5oIicKLQk7OwotICBtaXBzLXNvbnktYnNkKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL25ld3MtbWlwcy5oIicKLQk7OwotICBtNjgqLWJ1bGwqLXN5c3YqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZHB4Mi5oIicKLQk7OwotICBtNjgqLWhwLWhwdXgqKQlDT1JFRklMRT1ocHV4LWNvcmUubG8gOzsKLSAgbTY4Ki1ocC1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaHAzMDBic2QuaCInCi0JOzsKLSAgbTY4Ki0qLWxpbnV4LWdudSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9tNjhrbGludXguaCInCi0JOzsKLSAgbTY4Ki1tb3Rvcm9sYS1zeXN2KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2RlbHRhNjguaCInCi0JOzsKLSAgbTY4Ki1zb255LSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9uZXdzLmgiJwotCTs7Ci0gIG02OCotKi1uZXRic2QqIHwgbTY4Ki0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgbTY4Ki1hcHBsZS1hdXgqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbTY4a2F1eC5oIicKLQk7OwotICBtODgqLSotc3lzdjQqKQk7OwotICBtODgqLW1vdG9yb2xhLXN5c3YqKQlDT1JFRklMRT1wdHJhY2UtY29yZS5sbyA7OwotICBtODgqLSotbWFjaDMqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbTg4a21hY2gzLmgiJwotCTs7Ci0gIG5zMzJrLXBjNTMyLW1hY2gpCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9wYzUzMm1hY2guaCInCi0JOzsKLSAgbnMzMmstKi1uZXRic2QqIHwgbnMzMmstKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIHJzNjAwMC0qLWx5bngqKQlDT1JFRklMRT1seW54LWNvcmUubG8gOzsKLSAgcnM2MDAwLSotYWl4NCopCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHJzNjAwMC0qLSopCQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICBwb3dlcnBjLSotKmJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi1haXg0KikJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLWFpeCopCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi1iZW9zKikJOzsKLSAgcG93ZXJwYy0qLW5ldGJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIHNwYXJjLSotbmV0YnNkKiB8IHNwYXJjLSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICB0YWhvZS0qLSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy90YWhvZS5oIicKLQk7OwotICB2YXgtKi11bHRyaXgyKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3ZheHVsdDIuaCInCi0JOzsKLSAgdmF4LSotdWx0cml4KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3ZheHVsdDIuaCInCi0JOzsKLSAgdmF4LSotKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3ZheGJzZC5oIicKLQk7OwotICBlc2FjCi0KLSAgY2FzZSAiJENPUkVGSUxFIiBpbgotICBhaXgzODYtY29yZS5sbykJQ09SRUZMQUc9LURBSVgzODZfQ09SRSA7OwotICBocHBhYnNkLWNvcmUubG8pCUNPUkVGTEFHPS1ESFBQQUJTRF9DT1JFIDs7Ci0gIGhwdXgtY29yZS5sbykJCUNPUkVGTEFHPS1ESFBVWF9DT1JFIDs7Ci0gIGlyaXgtY29yZS5sbykJCUNPUkVGTEFHPS1ESVJJWF9DT1JFIDs7Ci0gIGx5bngtY29yZS5sbykJCUNPUkVGTEFHPS1ETFlOWF9DT1JFIDs7Ci0gIG5ldGJzZC1jb3JlLmxvKQlDT1JFRkxBRz0tRE5FVEJTRF9DT1JFIDs7Ci0gIG9zZi1jb3JlLmxvKQkJQ09SRUZMQUc9LURPU0ZfQ09SRSA7OwotICBwdHJhY2UtY29yZS5sbykJQ09SRUZMQUc9LURQVFJBQ0VfQ09SRSA7OwotICByczYwMDAtY29yZS5sbykJQ09SRUZMQUc9IiRDT1JFRkxBRyAtREFJWF9DT1JFIiA7OwotICBzY281LWNvcmUubG8pCQlDT1JFRkxBRz0iJENPUkVGTEFHIC1EU0NPNV9DT1JFIiA7OwotICB0cmFkLWNvcmUubG8pCQlDT1JFRkxBRz0iJENPUkVGTEFHIC1EVFJBRF9DT1JFIiA7OwotICBlc2FjCi0KLSAgIyBFTEYgY29yZWZpbGUgc3VwcG9ydCBoYXMgc2V2ZXJhbCBmbGF2b3JzLCBidXQgYWxsIG9mCi0gICMgdGhlbSB1c2Ugc29tZXRoaW5nIGNhbGxlZCA8c3lzL3Byb2Nmcy5oPgotICBmb3IgYWNfaGRyIGluIHN5cy9wcm9jZnMuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1OTU6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NjAwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjA1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19wcm9jZnNfaCIgPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2MzM6IGNoZWNraW5nIGZvciBwcnN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN0YXR1c190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDYzOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotaW50IG1haW4oKSB7Ci1wcnN0YXR1c190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjQ1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3Byc3RhdHVzX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN0YXR1c190PW5vCi0gICAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJzdGF0dXNfdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfUFJTVEFUVVNfVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJzdGF0dXNfdCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHByc3RhdHVzX3QucHJfd2hvIGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDY2NzogY2hlY2tpbmcgZm9yIHByc3RhdHVzX3QucHJfd2hvIGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG8nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NjcyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLXByc3RhdHVzX3QgYXZhcjsgdm9pZCogYXJlZiA9ICh2b2lkKikgJmF2YXIucHJfd2hvCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDY3OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG89eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG89bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG8gPSB5ZXM7IHRoZW4KLSAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1BSU1RBVFVTX1RfUFJfV0hPIDEKLUVPRgotCi0gZmkKLSBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG8iIDE+JjYKLQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzAxOiBjaGVja2luZyBmb3IgcHN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NzA2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLXBzdGF0dXNfdCBhdmFyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDcxMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3Q9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3QgPSB5ZXM7IHRoZW4KLSAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1BTVEFUVVNfVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190IiAxPiY2Ci0KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJwc2luZm9fdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ3MzU6IGNoZWNraW5nIGZvciBwcnBzaW5mb190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnBzaW5mb190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDc0MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotaW50IG1haW4oKSB7Ci1wcnBzaW5mb190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzQ3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycHNpbmZvX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnBzaW5mb190PW5vCi0gICAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJwc2luZm9fdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfUFJQU0lORk9fVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJwc2luZm9fdCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBzaW5mb190IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDc2OTogY2hlY2tpbmcgZm9yIHBzaW5mb190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2luZm9fdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ3NzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLWludCBtYWluKCkgewotcHNpbmZvX3QgYXZhcgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3ODE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNpbmZvX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2luZm9fdD1ubwotICAgCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzaW5mb190ID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9QU0lORk9fVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNpbmZvX3QiIDE+JjYKLQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsd3BzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4MDM6IGNoZWNraW5nIGZvciBsd3BzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbHdwc3RhdHVzX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0ODA4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLWx3cHN0YXR1c190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODE1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cHN0YXR1c190PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbHdwc3RhdHVzX3Q9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BzdGF0dXNfdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTFdQU1RBVFVTX1QgMQotRU9GCi0KLSBmaQotIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cHN0YXR1c190IiAxPiY2Ci0KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbHdwc3RhdHVzX3QucHJfY29udGV4dCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4Mzc6IGNoZWNraW5nIGZvciBsd3BzdGF0dXNfdC5wcl9jb250ZXh0IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4NDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLWludCBtYWluKCkgewotbHdwc3RhdHVzX3QgYXZhcjsgdm9pZCogYXJlZiA9ICh2b2lkKikgJmF2YXIucHJfY29udGV4dAotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4NDk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX2NvbnRleHQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dD1ubwotICAgCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9jb250ZXh0ID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MV1BTVEFUVVNfVF9QUl9DT05URVhUIDEKLUVPRgotCi0gZmkKLSBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGx3cHN0YXR1c190LnByX3JlZyBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4NzE6IGNoZWNraW5nIGZvciBsd3BzdGF0dXNfdC5wcl9yZWcgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0ODc2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLWx3cHN0YXR1c190IGF2YXI7IHZvaWQqIGFyZWYgPSAodm9pZCopICZhdmFyLnByX3JlZwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4ODM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX3JlZz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWc9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfcmVnID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MV1BTVEFUVVNfVF9QUl9SRUcgMQotRU9GCi0KLSBmaQotIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWciIDE+JjYKLQotICBmaQotZmkKLQotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUUkFEX0hFQURFUiAkVFJBRF9IRUFERVIKLUVPRgotCi0KLSMgSG9ycmlibGUgaGFja3MgdG8gYnVpbGQgRExMcyBvbiBXaW5kb3dzLgotV0lOMzJMREZMQUdTPQotV0lOMzJMSUJBREQ9Ci1jYXNlICIke2hvc3R9IiBpbgotKi0qLWN5Z3dpbiopCi0gIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCi0gICAgV0lOMzJMREZMQUdTPSItbm8tdW5kZWZpbmVkIgotICAgIFdJTjMyTElCQUREPSItTGBwd2RgLy4uL2xpYmliZXJ0eSAtbGliZXJ0eSAtTGBwd2RgLy4uL2ludGwgLWxpbnRsIC1sY3lnd2luIC1sa2VybmVsMzIiCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLQotCi0jIHRhcmdldCBzdHVmZjoKLQotIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgotICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi0gICAgZG8KLQlyZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAotCWlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotZGVmdmVjPQotc2VsdmVjcz0KLXNlbGFyY2hzPQotVERFRklORVM9Ci1mb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCi1kbwotICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCI7IHRoZW4KLSAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQotICAgIGVsc2UKLQkuICRzcmNkaXIvY29uZmlnLmJmZAotCWlmIHRlc3QgIngkdGFyZyIgPSAieCR0YXJnZXQiOyB0aGVuCi0JICAgIGRlZnZlYz0kdGFyZ19kZWZ2ZWMKLQlmaQotCXNlbHZlY3M9IiRzZWx2ZWNzICR0YXJnX2RlZnZlYyAkdGFyZ19zZWx2ZWNzIgotCXNlbGFyY2hzPSIkc2VsYXJjaHMgJHRhcmdfYXJjaHMiCi0JVERFRklORVM9IiRUREVGSU5FUyAkdGFyZ19jZmxhZ3MiCi0gICAgZmkKLWRvbmUKLQotCi0jIFRoaXMgcHJvY2Vzc2luZyBzdGlsbCBuZWVkcyB0byBiZSBkb25lIGlmIHdlJ3JlIHRvIGRlY2lkZSBwcm9wZXJseSB3aGV0aGVyCi0jIDY0LWJpdCBzdXBwb3J0IG5lZWRzIHRvIGJlIGNvbXBpbGVkIGluLiAgQ3VycmVudGx5LCBpdCB3aWxsIGJlIGluY2x1ZGVkIGlmCi0jIHRoZSBkZWZhdWx0IG9yIGFueSBvdGhlciBleHBsaWNpdGx5IHJlcXVlc3RlZCB0YXJnZXQgcmVxdWlyZXMgaXQ7IGl0Ci0jIHdpbGwgbm90IGJlIGluY2x1ZGVkIG9uIGEgMzItYml0IGhvc3QgaWYgbm8gNjQtYml0IHRhcmdldCBpcyByZXF1ZXN0ZWQsIGFuZAotIyBubyAiLS13aXRoLTY0LWJpdC1iZmQiIG9wdGlvbiBpcyBnaXZlbiwgZXZlbiBpZiAiLS13aXRoLXRhcmdldHM9YWxsIiBpcwotIyB1c2VkLgotCi0jIHVuaXEgdGhlIGRlZmF1bHQgYW5kIHNlbGVjdGVkIHZlY3RvcnMgaW4gYWxsIHRoZSBjb25maWd1cmVkIHRhcmdldHMuCi1mPSIiCi1mb3IgaSBpbiAkc2VsdmVjcyA7IGRvCi0gICAgY2FzZSAiICRmICIgaW4KLSAgICAqIiAkaSAiKikgOzsKLSAgICAqKSBmPSIkZiAkaSIgOzsKLSAgICBlc2FjCi1kb25lCi1zZWx2ZWNzPSIkZiIKLQotCi0jIHVuaXEgdGhlIGFyY2hpdGVjdHVyZXMgaW4gYWxsIHRoZSBjb25maWd1cmVkIHRhcmdldHMuCi1mPSIiCi1mb3IgaSBpbiAkc2VsYXJjaHMgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotc2VsYXJjaHM9IiRmIgotCi0jIFRhcmdldCBiYWNrZW5kIC5vIGZpbGVzLgotdGI9Ci0KLWVsZj0iZWxmLmxvIGVsZmxpbmsubG8gZHdhcmYyLmxvIGR3YXJmMS5sbyIKLQotZm9yIHZlYyBpbiAkc2VsdmVjcwotZG8KLSAgICBjYXNlICIkdmVjIiBpbgotICAgICMgVGhpcyBsaXN0IGlzIGFscGhhYmV0aXplZCB0byBtYWtlIGl0IGVhc3kgdG8gY29tcGFyZQotICAgICMgd2l0aCB0aGUgdHdvIHZlY3RvciBsaXN0cyBpbiB0YXJnZXRzLmMuCi0gICAgYTI5a2NvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1hMjlrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGFfb3V0X2Fkb2JlX3ZlYykJCXRiPSIkdGIgYW91dC1hZG9iZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYXJtY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtcGVfbGl0dGxlX3ZlYykJCXRiPSIkdGIgcGUtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1wZV9iaWdfdmVjKQkJdGI9IiR0YiBwZS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybXBlaV9saXR0bGVfdmVjKQkJdGI9IiR0YiBwZWktYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1wZWlfYmlnX3ZlYykJCXRiPSIkdGIgcGVpLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYykJdGI9IiR0YiBlcG9jLXBlLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVfYmlnX3ZlYykJdGI9IiR0YiBlcG9jLXBlLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMpCXRiPSIkdGIgZXBvYy1wZWktYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1fZXBvY19wZWlfYmlnX3ZlYykJdGI9IiR0YiBlcG9jLXBlaS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFvdXQwX2JpZ192ZWMpCQl0Yj0iJHRiIGFvdXQwLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X2FybV9iaWdfdmVjKQkJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9hcm1fbGl0dGxlX3ZlYykJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9taXBzX2JpZ192ZWMpCQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFvdXRfbWlwc19saXR0bGVfdmVjKQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFwb2xsb2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWFwb2xsby5sbyIgOzsKLSAgICBiX291dF92ZWNfYmlnX2hvc3QpCQl0Yj0iJHRiIGJvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGJfb3V0X3ZlY19saXR0bGVfaG9zdCkJdGI9IiR0YiBib3V0LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBiZmRfZWxmNjRfYWxwaGFfdmVjKQl0Yj0iJHRiIGVsZjY0LWFscGhhLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYykgdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYykJdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMpIAl0Yj0iJHRiIGVsZjMyLWdlbi5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdtaXBzX3ZlYykgCXRiPSIkdGIgZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfZWxmNjRfYmlnbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjY0LW1pcHMubG8gZWxmNjQubG8gZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjMyX2QxMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMTB2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2QzMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMzB2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2ZyMzBfdmVjKQkJdGI9IiR0YiBlbGYzMi1mcjMwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2hwcGFfdmVjKQkJdGI9IiR0YiBlbGYzMi1ocHBhLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2kzODZfdmVjKQkJdGI9IiR0YiBlbGYzMi1pMzg2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2k4NjBfdmVjKQkJdGI9IiR0YiBlbGYzMi1pODYwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYykgdGI9IiR0YiBlbGYzMi1nZW4ubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjKSAJdGI9IiR0YiBlbGY2NC1taXBzLmxvIGVsZjY0LmxvIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGYzMl9tMzJyX3ZlYykJCXRiPSIkdGIgZWxmMzItbTMyci5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tNjhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTY4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tODhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTg4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tY29yZV9iaWdfdmVjKQl0Yj0iJHRiIGVsZjMyLW1jb3JlLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMpCXRiPSIkdGIgZWxmMzItbWNvcmUubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbW4xMDIwMF92ZWMpCXRiPSIkdGIgZWxmLW0xMDIwMC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tbjEwMzAwX3ZlYykJdGI9IiR0YiBlbGYtbTEwMzAwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3Bvd2VycGNfdmVjKQl0Yj0iJHRiIGVsZjMyLXBwYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjKQl0Yj0iJHRiIGVsZjMyLXBwYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9zaF92ZWMpCQl0Yj0iJHRiIGVsZjMyLXNoLmxvIGVsZjMyLmxvICRlbGYgY29mZi1zaC5sbyIgOzsKLSAgICBiZmRfZWxmMzJfc2hsX3ZlYykJCXRiPSIkdGIgZWxmMzItc2gubG8gZWxmMzIubG8gJGVsZiBjb2ZmLXNoLmxvIiA7OwotICAgIGJmZF9lbGYzMl9zcGFyY192ZWMpCXRiPSIkdGIgZWxmMzItc3BhcmMubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfdjg1MF92ZWMpCQl0Yj0iJHRiIGVsZjMyLXY4NTAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjKSAJdGI9IiR0YiBlbGY2NC1nZW4ubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYykgdGI9IiR0YiBlbGY2NC1nZW4ubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjY0X3NwYXJjX3ZlYykJdGI9IiR0YiBlbGY2NC1zcGFyYy5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBjaXNjb19jb3JlX3ZlYykJCXRiPSIkdGIgY2lzY28tY29yZS5sbyIgOzsKLSAgICBkZW1vXzY0X3ZlYykJCXRiPSIkdGIgZGVtbzY0LmxvIGFvdXQ2NC5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgZWNvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLW1pcHMubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIiA7OwotICAgIGVjb2ZmX2JpZ2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZmFscGhhX2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1hbHBoYS5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGdvMzJjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1nbzMyLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGdvMzJzdHViYmVkY29mZl92ZWMpCXRiPSIkdGIgY29mZi1zdGdvMzIubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaDgzMDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1oODMwMC5sbyByZWxvYzE2LmxvIiA7OwotICAgIGg4NTAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaDg1MDAubG8gcmVsb2MxNi5sbyIgOzsKLSAgICBob3N0X2FvdXRfdmVjKQkJdGI9IiR0YiBob3N0LWFvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGhwMzAwYnNkX3ZlYykJCXRiPSIkdGIgaHAzMDBic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGhwMzAwaHB1eF92ZWMpCQl0Yj0iJHRiIGhwMzAwaHB1eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmFvdXRfdmVjKQkJdGI9IiR0YiBpMzg2YW91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmJzZF92ZWMpCQl0Yj0iJHRiIGkzODZic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1pMzg2LmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGkzODZkeW5peF92ZWMpCQl0Yj0iJHRiIGkzODZkeW5peC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmZyZWVic2RfdmVjKQkJdGI9IiR0YiBpMzg2ZnJlZWJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nm1zZG9zX3ZlYykJCXRiPSIkdGIgaTM4Nm1zZG9zLmxvIiA7OwotICAgIGkzODZwZV92ZWMpCQkJdGI9IiR0YiBwZS1pMzg2LmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBpMzg2cGVpX3ZlYykJCXRiPSIkdGIgcGVpLWkzODYubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaTM4NmxpbnV4X3ZlYykJCXRiPSIkdGIgaTM4NmxpbnV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bHlueF9hb3V0X3ZlYykJCXRiPSIkdGIgaTM4Nmx5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bHlueF9jb2ZmX3ZlYykJCXRiPSIkdGIgY2YtaTM4Nmx5bngubG8gY29mZmxpbmsubG8gbHlueC1jb3JlLmxvIiA7OwotICAgIGkzODZtYWNoM192ZWMpCQl0Yj0iJHRiIGkzODZtYWNoMy5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nm5ldGJzZF92ZWMpCQl0Yj0iJHRiIGkzODZuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZvczlrX3ZlYykJCXRiPSIkdGIgaTM4Nm9zOWsubG8gYW91dDMyLmxvIiA7OwotICAgIGk4NjBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1pODYwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGljb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtaTk2MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLWk5NjAubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaWVlZV92ZWMpCQkJdGI9IiR0YiBpZWVlLmxvIiA7OwotICAgIG02OGtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtjb2ZmdW5fdmVjKQkJdGI9IiR0YiBjb2ZmLXU2OGsubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtsaW51eF92ZWMpCQl0Yj0iJHRiIG02OGtsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2x5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIG02OGtseW54LmxvIGx5bngtY29yZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2x5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLW02OGtseW54LmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyBseW54LWNvcmUubG8iIDs7Ci0gICAgbTY4a25ldGJzZF92ZWMpCQl0Yj0iJHRiIG02OGtuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGs0a25ldGJzZF92ZWMpCQl0Yj0iJHRiIG02OGs0a25ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2F1eF9jb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1hdXgubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtzeXN2Y29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtc3ZtNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG04OGtiY3NfdmVjKQkJdGI9IiR0YiBjb2ZmLW04OGsubG8iIDs7Ci0gICAgbWNvcmVfcGVfYmlnX3ZlYykJCXRiPSIkdGIgcGUtbWNvcmUubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbWNvcmVfcGVfbGl0dGxlX3ZlYykJdGI9IiR0YiBwZS1tY29yZS5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZWlfYmlnX3ZlYykJCXRiPSIkdGIgcGVpLW1jb3JlLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1jb3JlX3BlaV9saXR0bGVfdmVjKQl0Yj0iJHRiIHBlaS1tY29yZS5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBuZXdzb3MzX3ZlYykJCXRiPSIkdGIgbmV3c29zMy5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbmxtMzJfaTM4Nl92ZWMpCQl0Yj0iJHRiIG5sbTMyLWkzODYubG8gbmxtMzIubG8gbmxtLmxvIiA7OwotICAgIG5sbTMyX3NwYXJjX3ZlYykJCXRiPSIkdGIgbmxtMzItc3BhcmMubG8gbmxtMzIubG8gbmxtLmxvIiA7OwotICAgIG5sbTMyX2FscGhhX3ZlYykJCXRiPSIkdGIgbmxtMzItYWxwaGEubG8gbmxtMzIubG8gbmxtLmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICByaXNjaXhfdmVjKQkJCXRiPSIkdGIgYW91dDMyLmxvIHJpc2NpeC5sbyIgOzsKLSAgICBubG0zMl9wb3dlcnBjX3ZlYykJCXRiPSIkdGIgbmxtMzItcHBjLmxvIG5sbTMyLmxvIG5sbS5sbyIgOzsKLSAgICBwYzUzMm5ldGJzZF92ZWMpCQl0Yj0iJHRiIG5zMzJrbmV0YnNkLmxvIGFvdXQtbnMzMmsubG8iIDs7Ci0gICAgcGM1MzJtYWNoYW91dF92ZWMpCQl0Yj0iJHRiIHBjNTMyLW1hY2gubG8gYW91dC1uczMyay5sbyIgOzsKLSAgICBwbWFjX3hjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1wbWFjLmxvIHhjb2ZmbGluay5sbyIgOzsKLSAgICByczYwMDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1yczYwMDAubG8geGNvZmZsaW5rLmxvIiA7OwotICAgIGJmZF9wb3dlcnBjX3BlX3ZlYykgICAgICAgICB0Yj0iJHRiIHBlLXBwYy5sbyBjb2ZmbGluay5sbyIgOzsgIAotICAgIGJmZF9wb3dlcnBjbGVfcGVfdmVjKSAgICAgICB0Yj0iJHRiIHBlLXBwYy5sbyBjb2ZmbGluay5sbyIgOzsgIAotICAgIGJmZF9wb3dlcnBjX3BlaV92ZWMpICAgICAgICB0Yj0iJHRiIHBlaS1wcGMubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX3Bvd2VycGNsZV9wZWlfdmVjKSAgICAgIHRiPSIkdGIgcGVpLXBwYy5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBwcGNib290X3ZlYykJCXRiPSIkdGIgcHBjYm9vdC5sbyIgOzsKLSAgICBzaGNvZmZfdmVjKQkJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGxjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGNvZmZfc21hbGxfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNobGNvZmZfc21hbGxfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNvbV92ZWMpCQkJdGI9IiR0YiBzb20ubG8iIDs7Ci0gICAgc3BhcmNsZV9hb3V0X3ZlYykJCXRiPSIkdGIgYW91dC1zcGFyY2xlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2xpbnV4X3ZlYykJCXRiPSIkdGIgc3BhcmNsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNseW54X2FvdXRfdmVjKQkJdGI9IiR0YiBzcGFyY2x5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2x5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLXNwYXJjbHlueC5sbyBseW54LWNvcmUubG8iIDs7Ci0gICAgc3BhcmNuZXRic2RfdmVjKQkJdGI9IiR0YiBzcGFyY25ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zcGFyYy5sbyIgOzsKLSAgICBzcmVjX3ZlYykJCQl0Yj0iJHRiIHNyZWMubG8iIDs7Ci0gICAgc3Vub3NfYmlnX3ZlYykJCXRiPSIkdGIgc3Vub3MubG8gYW91dDMyLmxvIiA7OwotICAgIHN5bWJvbHNyZWNfdmVjKQkJdGI9IiR0YiBzcmVjLmxvIiA7OwotICAgIHRla2hleF92ZWMpCQkJdGI9IiR0YiB0ZWtoZXgubG8iIDs7Ci0gICAgdGljMzBfYW91dF92ZWMpCQl0Yj0iJHRiIGFvdXQtdGljMzAubG8iIDs7Ci0gICAgdGljMzBfY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtdGljMzAubG8iIDs7Ci0gICAgdGljODBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi10aWM4MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICB2ZXJzYWRvc192ZWMpCQl0Yj0iJHRiIHZlcnNhZG9zLmxvIiA7OwotICAgIHZtc19hbHBoYV92ZWMpCQl0Yj0iJHRiIHZtcy5sbyB2bXMtaGRyLmxvIHZtcy1nc2QubG8gdm1zLXRpci5sbyB2bXMtbWlzYy5sbyIKLSAJCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIHZtc192YXhfdmVjKQkJdGI9IiR0YiB2bXMubG8gdm1zLWhkci5sbyB2bXMtZ3NkLmxvIHZtcy10aXIubG8gdm1zLW1pc2MubG8iIDs7Ci0gICAgdzY1X3ZlYykJCQl0Yj0iJHRiIGNvZmYtdzY1LmxvIHJlbG9jMTYubG8iIDs7Ci0gICAgd2UzMmtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi13ZTMyay5sbyIgOzsKLSAgICB6OGtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi16OGsubG8gcmVsb2MxNi5sbyIgOzsKLQotICAgICIiKQkJCTs7Ci0gICAgKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAqKiogdW5rbm93biB0YXJnZXQgdmVjdG9yICR2ZWMiIDE+JjI7IGV4aXQgMTsgfSA7OwotICAgIGVzYWMKLWRvbmUKLQotIyBUYXJnZXQgYXJjaGl0ZWN0dXJlIC5vIGZpbGVzLgotIyBBIGNvdXBsZSBvZiBDUFVzIHVzZSBzaG9ydGVyIGZpbGUgbmFtZXMgdG8gYXZvaWQgcHJvYmxlbXMgb24gRE9TCi0jIGZpbGVzeXN0ZW1zLgotdGE9YGVjaG8gJHNlbGFyY2hzIHwgc2VkIC1lIHMvYmZkXy9jcHUtL2cgLWUgcy9fYXJjaC8ubG8vZyAtZSBzL21uMTAyMDAvbTEwMjAwLyAtZSBzL21uMTAzMDAvbTEwMzAwL2AKLQotIyBXZWVkIG91dCBkdXBsaWNhdGUgLm8gZmlsZXMuCi1mPSIiCi1mb3IgaSBpbiAkdGIgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGI9IiRmIgotCi1mPSIiCi1mb3IgaSBpbiAkdGEgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGE9IiRmIgotCi1iZmRfYmFja2VuZHM9IiR0YiIKLWJmZF9tYWNoaW5lcz0iJHRhIgotCi1pZiB0ZXN0IHgke2FsbF90YXJnZXRzfSA9IHh0cnVlIDsgdGhlbgotICBiZmRfYmFja2VuZHM9IiR7YmZkX2JhY2tlbmRzfSInICQoQUxMX0JBQ0tFTkRTKScKLSAgYmZkX21hY2hpbmVzPSIke2JmZF9tYWNoaW5lc30iJyAkKEFMTF9NQUNISU5FUyknCi0gIHNlbHZlY3M9Ci0gIGhhdmV2ZWNzPQotICBzZWxhcmNocz0KLWVsc2UJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0gICMgT25seSBzZXQgdGhlc2UgaWYgdGhleSB3aWxsIGJlIG5vbmVtcHR5LCBmb3IgdGhlIGNsZXZlciBlY2hvLgotICBoYXZldmVjcz0KLSAgdGVzdCAtbiAiJHNlbHZlY3MiICYmCi0gICAgaGF2ZXZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi8tREhBVkVfLycgLWUgJ3MvIFwoLlwpLyAtREhBVkVfXDEvZydgCi0gIHRlc3QgLW4gIiRzZWx2ZWNzIiAmJgotICAgIHNlbHZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi9cJi8nIC1lICdzLyBcKC5cKS8sXCZcMS9nJ2AKLSAgdGVzdCAtbiAiJHNlbGFyY2hzIiAmJgotICAgIHNlbGFyY2hzPWBlY2hvICRzZWxhcmNocyB8IHNlZCAtZSAncy9eL1wmLycgLWUgJ3MvIFwoLlwpLyxcJlwxL2cnYAotZmkJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0KLWNhc2UgJHtob3N0NjR9LSR7dGFyZ2V0NjR9LSR7d2FudDY0fSBpbgotICAqdHJ1ZSopCi0gICAgd29yZHNpemU9NjQKLSAgICBhbGxfYmFja2VuZHM9JyQoQkZENjRfQkFDS0VORFMpICQoQkZEMzJfQkFDS0VORFMpJwotICAgIGlmIHRlc3QgLXogIiRHQ0MiICYmIHRlc3QgIiRCRkRfSE9TVF82NEJJVF9MT05HIiA9ICIwIiAmJiB0ZXN0ICIkQkZEX0hPU1RfNjRfQklUX0RFRklORUQiID0gIjAiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IFlvdSBoYXZlIHJlcXVlc3RlZCBhIDY0IGJpdCBCRkQgY29uZmlndXJhdGlvbiwgYnV0IiAxPiYyCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IHlvdXIgY29tcGlsZXIgbWF5IG5vdCBoYXZlIGEgNjQgYml0IGludGVncmFsIHR5cGUiIDE+JjIKLSAgICBmaQotICAgIDs7Ci0gIGZhbHNlLWZhbHNlLWZhbHNlKQotICAgIHdvcmRzaXplPTMyCi0gICAgYWxsX2JhY2tlbmRzPSckKEJGRDMyX0JBQ0tFTkRTKScKLSAgICA7OwotZXNhYwotCi0KLQotCi0KLQotdGRlZmF1bHRzPSIiCi10ZXN0IC1uICIke2RlZnZlY30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9IC1EREVGQVVMVF9WRUNUT1I9JHtkZWZ2ZWN9IgotdGVzdCAtbiAiJHtzZWx2ZWNzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURTRUxFQ1RfVkVDUz0nJHtzZWx2ZWNzfSciCi10ZXN0IC1uICIke3NlbGFyY2hzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURTRUxFQ1RfQVJDSElURUNUVVJFUz0nJHtzZWxhcmNoc30nIgotdGVzdCAtbiAiJHtoYXZldmVjc30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9ICR7aGF2ZXZlY3N9IgotCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MjM5OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTI0NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NTI0OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1Mjc4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MjgzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUzMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUzMzE6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUzMzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU0Nzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi1mb3IgYWNfZnVuYyBpbiBtYWR2aXNlIG1wcm90ZWN0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NTA0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NTA5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU1MzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWNhc2UgJHt3YW50X21tYXB9KyR7YWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZH0gaW4KLSAgdHJ1ZSt5ZXMgKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFVTRV9NTUFQIDEKLUVPRgotIDs7Ci1lc2FjCi0KLXJtIC1mIGRvYy9jb25maWcuc3RhdHVzCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgZG9jL01ha2VmaWxlIGJmZC1pbjMuaDpiZmQtaW4yLmggcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUB0YXJnZXRAJSR0YXJnZXQlZwotcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKLXMlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKLXMlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKLXMlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQENDQCUkQ0MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKLXMlQFZFUlNJT05AJSRWRVJTSU9OJWcKLXMlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKLXMlQEFVVE9DT05GQCUkQVVUT0NPTkYlZwotcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCi1zJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCi1zJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAQVJAJSRBUiVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVATERAJSRMRCVnCi1zJUBOTUAlJE5NJWcKLXMlQExOX1NAJSRMTl9TJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQERMTFRPT0xAJSRETExUT09MJWcKLXMlQEFTQCUkQVMlZwotcyVATUFJTlRBSU5FUl9NT0RFX1RSVUVAJSRNQUlOVEFJTkVSX01PREVfVFJVRSVnCi1zJUBNQUlOVEFJTkVSX01PREVfRkFMU0VAJSRNQUlOVEFJTkVSX01PREVfRkFMU0UlZwotcyVATUFJTlRAJSRNQUlOVCVnCi1zJUBFWEVFWFRAJSRFWEVFWFQlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLXMlQEhERUZJTkVTQCUkSERFRklORVMlZwotcyVAQkZEX0hPU1RfNjRCSVRfTE9OR0AlJEJGRF9IT1NUXzY0QklUX0xPTkclZwotcyVAQkZEX0hPU1RfNjRfQklUX0RFRklORURAJSRCRkRfSE9TVF82NF9CSVRfREVGSU5FRCVnCi1zJUBCRkRfSE9TVF82NF9CSVRAJSRCRkRfSE9TVF82NF9CSVQlZwotcyVAQkZEX0hPU1RfVV82NF9CSVRAJSRCRkRfSE9TVF9VXzY0X0JJVCVnCi1zJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZwotcyVARVhFRVhUX0ZPUl9CVUlMREAlJEVYRUVYVF9GT1JfQlVJTEQlZwotcyVAQ09SRUZJTEVAJSRDT1JFRklMRSVnCi1zJUBDT1JFRkxBR0AlJENPUkVGTEFHJWcKLXMlQFdJTjMyTERGTEFHU0AlJFdJTjMyTERGTEFHUyVnCi1zJUBXSU4zMkxJQkFEREAlJFdJTjMyTElCQUREJWcKLXMlQFRERUZJTkVTQCUkVERFRklORVMlZwotcyVAd29yZHNpemVAJSR3b3Jkc2l6ZSVnCi1zJUBhbGxfYmFja2VuZHNAJSRhbGxfYmFja2VuZHMlZwotcyVAYmZkX2JhY2tlbmRzQCUkYmZkX2JhY2tlbmRzJWcKLXMlQGJmZF9tYWNoaW5lc0AlJGJmZF9tYWNoaW5lcyVnCi1zJUB0ZGVmYXVsdHNAJSR0ZGVmYXVsdHMlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgZG9jL01ha2VmaWxlIGJmZC1pbjMuaDpiZmQtaW4yLmggcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi1zZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGUKLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9iZmQvY29uZmlndXJlLmJhdCBiL2JmZC9jb25maWd1cmUuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGZlNzllLi4wMDAwMDAwCi0tLSBhL2JmZC9jb25maWd1cmUuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotQGVjaG8gb2ZmDQotaWYgIiUxIiA9PSAiaDgvMzAwIiBnb3RvIGg4MzAwDQotDQotZWNobyBDb25maWd1cmluZyBiZmQgZm9yIGdvMzINCi11cGRhdGUgaG9zdHNcZ28zMi5oIHN5c2RlcC5oDQotdXBkYXRlIE1ha2VmaWxlLmRvcyBNYWtlZmlsZQ0KLWVjaG8gcy9AV09SRFNJWkVALzMyL2c+Y29uZmlnLnNlZA0KLXNlZCAtZSBzL14vc1wvQFZFUlNJT05AXC8vIC1lIHMvJC9cL2cvZyB2ZXJzaW9uID4+Y29uZmlnLnNlZA0KLXNlZCAtZiBjb25maWcuc2VkIDwgYmZkLWluMi5oID4gYmZkLmgyDQotdXBkYXRlIGJmZC5oMiBiZmQuaA0KLWdvdG8gZXhpdA0KLQ0KLTpoODMwMA0KLWVjaG8gQ29uZmlndXJpbmcgYmZkIGZvciBIOC8zMDANCi11cGRhdGUgaG9zdHNcaC1nbzMyLmggc3lzZGVwLmgNCi11cGRhdGUgTWFrZWZpbGUuZG9zIE1ha2VmaWxlDQotDQotOmV4aXQNCmRpZmYgLS1naXQgYS9iZmQvY29uZmlndXJlLmNvbSBiL2JmZC9jb25maWd1cmUuY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mjk5NzdjLi4wMDAwMDAwCi0tLSBhL2JmZC9jb25maWd1cmUuY29tCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLSQhCi0kISBUaGlzIGZpbGUgY29uZmlndXJlcyB0aGUgYmZkIGxpYnJhcnkgZm9yIHVzZSB3aXRoIG9wZW5WTVMgKEFscGhhIGFuZCBWYXgpCi0kIQotJCEgV2UgZG8gbm90IHVzZSB0aGUgY29uZmlndXJlIHNjcmlwdCwgc2luY2Ugd2UgZG8gbm90IGhhdmUgL2Jpbi9zaAotJCEgdG8gZXhlY3V0ZSBpdC4KLSQhCi0kISBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCi0kIQotJGFyY2hfaW5keCA9IDEgKyAoKGYkZ2V0c3lpKCJDUFUiKS5nZS4xMjgpLmFuZC4xKSAgICAgICEgdmF4PT0xLCBhbHBoYT09MgotJGFyY2ggPSBmJGVsZW1lbnQoYXJjaF9pbmR4LCJ8IiwifFZBWHxBbHBoYXwiKQotJCEKLSRpZiBhcmNoIC5lcXMuICJBbHBoYSIKLSR0aGVuCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkNvbmZpZ3VyaW5nIGZvciBBbHBoYSB0YXJnZXQiCi0kIHRhcmdldCA9ICJhbHBoYSIKLSQhCi0kISBjb3B5IGJmZC1pbjIuaCB0byBiZmQuaCwgcmVwbGFjaW5nIEAgbWFjcm9zCi0kIQotJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN5cyRpbnB1dCAtCi0gICAgICAgIFtdYmZkLWluMi5oIC9vdXRwdXQ9W11iZmQuaAotJERFQ0sKLSEKLSEgIENvcHkgZmlsZSwgY2hhbmdpbmcgbGluZXMgd2l0aCBtYWNyb3MgKEBAKQotIQotIQotICAgdmZpbGUgOj0gQ1JFQVRFX0JVRkZFUigidmZpbGUiLCAiQ09ORklHVVJFLklOIik7Ci0gICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YodmZpbGUpLCBFTkRfT0YodmZpbGUpKTsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQU1fSU5JVF9BVVRPTUFLRShiZmQsICcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgdmVycyA6PSBDVVJSRU5UX0xJTkUtIikiOwotICAgRUxTRTsKLSAgICAgdmVycyA6PSAidW5rbm93biI7Ci0gICBFTkRJRjsKLQotICAgZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJmaWxlIiwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAiZmlsZV9uYW1lIikpOwotICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKGZpbGUpLCBFTkRfT0YoZmlsZSkpOwotCi0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BWRVJTSU9OQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKHZlcnMpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0B3b3Jkc2l6ZUAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgnNjQnKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRCSVRfTE9OR0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgnMCcpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NF9CSVRfREVGSU5FREAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgnX19ERUNDJyk7Ci0gICAgICBTUExJVF9MSU5FOwotICAgICAgQ09QWV9URVhUKCcjaW5jbHVkZSA8aW50cy5oPicpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NF9CSVRAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJ2ludDY0Jyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUX1VfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCd1aW50NjQnKTsKLSAgIEVORElGOwotICAgV1JJVEVfRklMRShmaWxlLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJvdXRwdXRfZmlsZSIpKTsKLSAgIFFVSVQKLSQgIEVPRAotJAotJGVsc2UKLSQKLSQgd3JpdGUgc3lzJG91dHB1dCAiQ29uZmlndXJpbmcgZm9yIFZheCB0YXJnZXQiCi0kIHRhcmdldCA9ICJ2YXgiCi0kIQotJCEgY29weSBiZmQtaW4yLmggdG8gYmZkLmgsIHJlcGxhY2luZyBAIG1hY3JvcwotJCEKLSQgZWRpdC90cHUvbm9qb3VybmFsL25vc2VjdGlvbi9ub2Rpc3BsYXkvY29tbWFuZD1zeXMkaW5wdXQgLQotICAgICAgICBbXWJmZC1pbjIuaCAvb3V0cHV0PVtdYmZkLmgKLSRERUNLCi0hCi0hICBDb3B5IGZpbGUsIGNoYW5naW5nIGxpbmVzIHdpdGggbWFjcm9zIChAQCkKLSEKLSEKLSAgIHZmaWxlIDo9IENSRUFURV9CVUZGRVIoInZmaWxlIiwgIkNPTkZJR1VSRS5JTiIpOwotICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKHZmaWxlKSwgRU5EX09GKHZmaWxlKSk7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0FNX0lOSVRfQVVUT01BS0UoYmZkLCAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgIHZlcnMgOj0gQ1VSUkVOVF9MSU5FLSIpIjsKLSAgIEVMU0U7Ci0gICAgIHZlcnMgOj0gInVua25vd24iOwotICAgRU5ESUY7Ci0KLSAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKLSAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRihmaWxlKSwgRU5EX09GKGZpbGUpKTsKLQotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAVkVSU0lPTkAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCh2ZXJzKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAd29yZHNpemVAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJzMyJyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0QklUX0xPTkdAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJzAnKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUX0RFRklORURAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJ19fREVDQycpOwotICAgICAgU1BMSVRfTElORTsKLSAgICAgIENPUFlfVEVYVCgnI2luY2x1ZGUgPGludHMuaD4nKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCdpbnQ2NCcpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF9VXzY0X0JJVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgndWludDY0Jyk7Ci0gICBFTkRJRjsKLSAgIFdSSVRFX0ZJTEUoZmlsZSwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAib3V0cHV0X2ZpbGUiKSk7Ci0gICBRVUlUCi0kICBFT0QKLSRlbmRpZgotJAotJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZWQgYGJmZC5oJyBmcm9tIGBiZmQtaW4yLmgnLiIKLSQhCi0kIQotJCEgY3JlYXRlIHRhcmdtYXRjaC5oCi0kIQotJCBvcGVuL3dyaXRlIHRmaWxlIFtddGFyZ21hdGNoLmgKLSQgd3JpdGUgdGZpbGUgInsgIiIiICsgdGFyZ2V0ICsgIi0qLSp2bXMqIiIiICsgIiwiCi0kIHdyaXRlIHRmaWxlICIjaWYgZGVmaW5lZCAoU0VMRUNUX1ZFQ1MpIgotJCB3cml0ZSB0ZmlsZSAiU0VMRUNUX1ZFQ1MiCi0kIHdyaXRlIHRmaWxlICIjZWxzZSIKLSQgd3JpdGUgdGZpbGUgIlVOU1VQUE9SVEVEX1RBUkdFVCIKLSQgd3JpdGUgdGZpbGUgIiNlbmRpZiIKLSQgd3JpdGUgdGZpbGUgIn0sIgotJCBjbG9zZSB0ZmlsZQotJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZWQgYHRhcmdtYXRjaC5oJyIKLSQhCi0kIQotJCEgY3JlYXRlIGNvbmZpZy5oCi0kIQotJCBjcmVhdGUgW11jb25maWcuaAotLyogY29uZmlnLmgtdm1zLiAgR2VuZXJhdGVkIGJ5IGhhbmQgYnkgS2xhdXMgS+RtcGYsIGtrYWVtcGZAZGlkeW11cy5ybWkuZGUuICAqLwotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0vKiBXaGV0aGVyIG1hbGxvYyBtdXN0IGJlIGRlY2xhcmVkIGV2ZW4gaWYgPHN0ZGxpYi5oPiBpcyBpbmNsdWRlZC4gICovCi0vKiAjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MgKi8KLS8qIFdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIGV2ZW4gaWYgPHN0ZGxpYi5oPiBpcyBpbmNsdWRlZC4gICovCi0vKiAjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFICovCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0vKiAjZGVmaW5lIEhBVkVfTU1BUCAxICovCi0vKiBEbyB3ZSBuZWVkIHRvIHVzZSB0aGUgYiBtb2RpZmllciB3aGVuIG9wZW5pbmcgYmluYXJ5IGZpbGVzPyAgKi8KLS8qICN1bmRlZiBVU0VfQklOQVJZX0ZPUEVOICovCi0vKiBOYW1lIG9mIGhvc3Qgc3BlY2lmaWMgaGVhZGVyIGZpbGUgdG8gaW5jbHVkZSBpbiB0cmFkLWNvcmUuYy4gICovCi0vKiAjdW5kZWYgVFJBRF9IRUFERVIgKi8KLS8qIERlZmluZSBvbmx5IGlmIDxzeXMvcHJvY2ZzLmg+IGlzIGF2YWlsYWJsZSAqYW5kKiBpdCBkZWZpbmVzIHByc3RhdHVzX3QuICAqLwotLyogI3VuZGVmIEhBVkVfU1lTX1BST0NGU19IICovCi0vKiBEbyB3ZSByZWFsbHkgd2FudCB0byB1c2UgbW1hcCBpZiBpdCdzIGF2YWlsYWJsZT8gICovCi0vKiAjdW5kZWYgVVNFX01NQVAgKi8KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZmNudGwgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX0ZDTlRMIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX0dFVFBBR0VTSVpFIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWFkdmlzZSBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEhBVkVfTUFEVklTRSAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1wcm90ZWN0IGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgSEFWRV9NUFJPVEVDVCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfRkNOVExfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRkZWYuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NURERFRl9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RETElCX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NZU19GSUxFX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dGltZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfVElNRV9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfVU5JU1REX0ggMQotJCEKLSQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGVkIGBjb25maWcuaCciCi0KZGlmZiAtLWdpdCBhL2JmZC9jb25maWd1cmUuaG9zdCBiL2JmZC9jb25maWd1cmUuaG9zdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3MDQ4Yi4uMDAwMDAwMAotLS0gYS9iZmQvY29uZmlndXJlLmhvc3QKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IG92ZXJyaWRlcyBzb21lIG9mIHRoZSB0b29scyBhbmQKLSMgZmxhZ3MgdXNlZCBvbiBhIGhvc3Qgc3BlY2lmaWMgYmFzaXMuCi0KLSMgU2luY2UgdGhlICJiZmQvaG9zdHMiIGRpcmVjdG9yeSBpcyBzaGFyZWQgYnkgdGhlIGJmZCwgb3Bjb2RlcywgYW5kCi0jIGJpbnV0aWxzIGRpcmVjdG9yaWVzIChhdCBsZWFzdCksIHRoZSBpbmRleCB0byBpdCBpcyBhbHNvIHNoYXJlZC4KLSMgVGhpcyBpcyB0aGF0IGluZGV4LiAgRWFjaCBjb25maWd1cmUuaW4gZmlsZSBzaG91bGQgc291cmNlIHRoaXMgZmlsZQotIyBpbiBpdHMgcGVyLWhvc3QgcGFydC4KLQotIyBUaGlzIHNldHMgdGhlIGZvbGxvd2luZyBzaGVsbCB2YXJpYWJsZXM6Ci0jICBIREVGSU5FUwkJaG9zdCBzcGVjaWZpYyBjb21waWxlciBvcHRpb25zCi0jICBob3N0NjQJCXNldCB0byB0cnVlIGlmIDY0IGJpdCB0eXBlcyBhcmUgYXMgZmFzdCBhcyAzMiBiaXQKLSMgIEhPU1RfNjRCSVRfVFlQRQlob3N0IDY0IGJpdCB0eXBlCi0jICBIT1NUX1VfNjRCSVRfVFlQRQl1bnNpZ25lZCA2NCBiaXQgdHlwZSAobm90IG5lZWRlZCBpZiA2NEJJVF9UWVBFIGlzIGxvbmcpCi0KLUhERUZJTkVTPQotaG9zdDY0PWZhbHNlCi1IT1NUXzY0QklUX1RZUEU9Ci1IT1NUX1VfNjRCSVRfVFlQRT0KLQotY2FzZSAiJHtob3N0fSIgaW4KLQotYWxwaGEqLSotKikJCWhvc3Q2ND10cnVlOyBIT1NUXzY0QklUX1RZUEU9bG9uZyA7OwotCi1ocHBhKi0qLWhwdXgqKQkJSERFRklORVM9LURIT1NUX0hQUEFIUFVYIDs7Ci1ocHBhKi0qLWhpdXgqKQkJSERFRklORVM9LURIT1NUX0hQUEFIUFVYIDs7Ci1ocHBhKi0qLW1wZWl4KikJCUhERUZJTkVTPS1ESE9TVF9IUFBBTVBFSVggOzsKLWhwcGEqLSotYnNkKikJCUhERUZJTkVTPS1ESE9TVF9IUFBBQlNEIDs7Ci1ocHBhKi0qLW9zZiopCQlIREVGSU5FUz0tREhPU1RfSFBQQU9TRiA7OwotCi1pWzM0NTZdODYtc2VxdWVudC1ic2QqKQlIREVGSU5FUz0tRHNoYXJlZD1nZW5zaGFyZWQgOzsKLWlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3Y0KikgOzsKLWlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3YqKQlIREVGSU5FUz0tRHNoYXJlZD1nZW5zaGFyZWQgOzsKLQotbWlwcyotZGVjLW5ldGJzZCopCTs7Ci1taXBzKi0qLW9wZW5ic2QqKQk7OwotbWlwcyotZGVjLSopCQlIREVGSU5FUz0iLUcgNCIJOzsKLW1pcHMqLXNnaS1pcml4MyopCUhERUZJTkVTPSItRyA0IiA7OwotbWlwcyotc2dpLWlyaXg0KikJSERFRklORVM9Ii1HIDQiIDs7Ci1taXBzKi1zZ2ktaXJpeDYqKQlob3N0NjQ9dHJ1ZQotCQkJSE9TVF82NEJJVF9UWVBFPSJsb25nIGxvbmciOwotCQkJSE9TVF9VXzY0QklUX1RZUEU9InVuc2lnbmVkIGxvbmcgbG9uZyI7Ci0JCQk7OwotbWlwcyotKi1zeXN2NCopCQk7OwotbWlwcyotKi1zeXN2KikJCUhERUZJTkVTPSItRyA0IiA7OwotbWlwcyotKi1yaXNjb3MqKQlIREVGSU5FUz0iLUcgNCIgOzsKLQotbTY4Ki1ocC1ocHV4KikJCUhERUZJTkVTPS1ESE9TVF9IUDMwMEhQVVggOzsKLQotKi0qLXNvbGFyaXMqKQkJSE9TVF82NEJJVF9UWVBFPSJsb25nIGxvbmciCi0JCQlIT1NUX1VfNjRCSVRfVFlQRT0idW5zaWduZWQgbG9uZyBsb25nIgotCQkJOzsKLQotKi0qLXdpbmRvd3MqKQotCQkJSE9TVF82NEJJVF9UWVBFPV9faW50NjQKLQkJCUhPU1RfVV82NEJJVF9UWVBFPSJ1bnNpZ25lZCBfX2ludDY0IgotIyBUaGUgZm9sbG93aW5nIGtyb2NrIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIGNhbid0IHJ1biB0aGUgYnVpbGQgY29tcGlsZXIKLSMgKE1TVkMpIG9uIHRoZSBjb25maWd1cmUgaG9zdCwgc28gd2UgaGF2ZSB0byBleHBsaWNpdGx5IHNldCB0aGUgdmFsdWVzIGhlcmUuCi0jIE5vdGUgdGhhdCB0aGlzIGZpbGUgaXMgbmV2ZXIgcnVuIHRocm91Z2ggYXV0b2NvbmYsIHNvIHdlIGNhbid0IHVzZSBhbnkKLSMgYXV0b2NvbmYgbWFjcm9zIGhlcmUuICBCZWNhdXNlIG9mIHRoaXMsIHdlIGhhdmUgdG8gbXVjayB3aXRoIGF1dG9jb25mCi0jIHZhcmlhYmxlcyBleHBsaWNpdGx5LgotCQkJYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotCQkJYWNfY3ZfaGVhZGVyX3RpbWU9bm8KLQkJCWFjX2N2X2Z1bmNfZ2V0cGFnZXNpemU9bm8KLQkJCWFjX2N2X2Z1bmNfbWFkdmlzZT1ubwotCQkJYWNfY3ZfZnVuY19tcHJvdGVjdD1ubwotCQkJYWNfY3ZfaGVhZGVyX3N5c19maWxlX2g9bm8KLQkJCWFjX2N2X2hlYWRlcl9zeXNfdGltZV9oPW5vCi0JCQlhY19jdl9oZWFkZXJfdW5pc3RkX2g9bm8KLQkJCTs7Ci1lc2FjCmRpZmYgLS1naXQgYS9iZmQvY29uZmlndXJlLmluIGIvYmZkL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBlZWIwMS4uMDAwMDAwMAotLS0gYS9iZmQvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjQ4ICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sCi0KLUFDX1BSRVJFUSgyLjEzKQotQUNfSU5JVChsaWJiZmQuYykKLQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotQUNfSVNDX1BPU0lYCi0KLUFNX0lOSVRfQVVUT01BS0UoYmZkLCAyLjkuNCkKLQotZG5sIFRoZXNlIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wsIGJlY2F1c2UgaXQgbWF5IHdhbnQKLWRubCB0byBjYWxsIEFDX0NIRUNLX1BST0cuCi1BQ19DSEVDS19UT09MKEFSLCBhcikKLUFDX0NIRUNLX1RPT0woUkFOTElCLCByYW5saWIsIDopCi0KLWRubCBEZWZhdWx0IHRvIGEgbm9uIHNoYXJlZCBsaWJyYXJ5LiAgVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUKLWRubCBjb25maWd1cmUgb3B0aW9uIC0tZW5hYmxlLXNoYXJlZC4KLUFNX0RJU0FCTEVfU0hBUkVECi0KLUFNX1BST0dfTElCVE9PTAotCi1BQ19BUkdfRU5BQkxFKDY0LWJpdC1iZmQsCi1bICAtLWVuYWJsZS02NC1iaXQtYmZkICAgICA2NC1iaXQgc3VwcG9ydCAob24gaG9zdHMgd2l0aCBuYXJyb3dlciB3b3JkIHNpemVzKV0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpICB3YW50NjQ9dHJ1ZSAgOzsKLSAgbm8pICAgd2FudDY0PWZhbHNlIDs7Ci0gICopICAgIEFDX01TR19FUlJPUihiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciA2NC1iaXQtYmZkIG9wdGlvbikgOzsKLWVzYWNdLFt3YW50NjQ9ZmFsc2VdKWRubAotQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAotWyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWNdKWRubAotQUNfQVJHX0VOQUJMRShjb21tb25iZmRsaWIsCi1bICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb25dKSA7OwotZXNhY10pZG5sCi1BQ19BUkdfV0lUSChtbWFwLAotWyAgLS13aXRoLW1tYXAgICAgICAgICAgICAgdHJ5IHVzaW5nIG1tYXAgZm9yIEJGRCBpbnB1dCBmaWxlcyBpZiBhdmFpbGFibGVdLAotW2Nhc2UgIiR7d2l0aHZhbH0iIGluCi0gIHllcykgIHdhbnRfbW1hcD10cnVlIDs7Ci0gIG5vKSAgIHdhbnRfbW1hcD1mYWxzZSA7OwotICAqKSAgICBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7d2l0aHZhbH0gZm9yIEJGRCB3aXRoLW1tYXAgb3B0aW9uKSA7OwotZXNhY10sW3dhbnRfbW1hcD1mYWxzZV0pZG5sCi0KLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQotZmkKLUFDX0FSR19QUk9HUkFNCi0KLUFNX01BSU5UQUlORVJfTU9ERQotQUNfRVhFRVhUCi0KLWhvc3Q2ND1mYWxzZQotdGFyZ2V0NjQ9ZmFsc2UKLQotIyBob3N0IHN0dWZmOgotCi1BQ19QUk9HX0NDCi0KLUFMTF9MSU5HVUFTPQotQ1lfR05VX0dFVFRFWFQKLQotIyBQZXJtaXQgaG9zdCBzcGVjaWZpYyBzZXR0aW5ncy4KLS4gJHtzcmNkaXJ9L2NvbmZpZ3VyZS5ob3N0Ci0KLUFDX1NVQlNUKEhERUZJTkVTKQotQUNfUFJPR19JTlNUQUxMCi0KLUJGRF9IT1NUXzY0QklUX0xPTkc9MAotQkZEX0hPU1RfNjRfQklUX0RFRklORUQ9MAotQkZEX0hPU1RfNjRfQklUPQotQkZEX0hPU1RfVV82NF9CSVQ9Ci1pZiB0ZXN0ICJ4JHtIT1NUXzY0QklUX1RZUEV9IiA9ICJ4bG9uZyI7IHRoZW4KLSAgQkZEX0hPU1RfNjRCSVRfTE9ORz0xCi1lbGlmIHRlc3QgIngke0hPU1RfNjRCSVRfVFlQRX0iICE9ICJ4IjsgdGhlbgotICBCRkRfSE9TVF82NF9CSVRfREVGSU5FRD0xCi0gIEJGRF9IT1NUXzY0X0JJVD0ke0hPU1RfNjRCSVRfVFlQRX0KLSAgQkZEX0hPU1RfVV82NF9CSVQ9JHtIT1NUX1VfNjRCSVRfVFlQRX0KLWZpCi1BQ19TVUJTVChCRkRfSE9TVF82NEJJVF9MT05HKQotQUNfU1VCU1QoQkZEX0hPU1RfNjRfQklUX0RFRklORUQpCi1BQ19TVUJTVChCRkRfSE9TVF82NF9CSVQpCi1BQ19TVUJTVChCRkRfSE9TVF9VXzY0X0JJVCkKLQotQkZEX0NDX0ZPUl9CVUlMRAotCi1BQ19DSEVDS19IRUFERVJTKHN0ZGRlZi5oIHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaCB0aW1lLmggdW5pc3RkLmgpCi1BQ19DSEVDS19IRUFERVJTKGZjbnRsLmggc3lzL2ZpbGUuaCBzeXMvdGltZS5oKQotQUNfSEVBREVSX1RJTUUKLUFDX0hFQURFUl9ESVJFTlQKLUFDX0NIRUNLX0ZVTkNTKGZjbnRsIGdldHBhZ2VzaXplIHNldGl0aW1lciBzeXNjb25mIGZkb3BlbikKLQotQkZEX0JJTkFSWV9GT1BFTgotCi1CRkRfTkVFRF9ERUNMQVJBVElPTihzdHJzdHIpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihtYWxsb2MpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihyZWFsbG9jKQotQkZEX05FRURfREVDTEFSQVRJT04oZnJlZSkKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKGdldGVudikKLQotIyBJZiB3ZSBhcmUgY29uZmlndXJlZCBuYXRpdmUsIHBpY2sgYSBjb3JlIGZpbGUgc3VwcG9ydCBmaWxlLgotQ09SRUZJTEU9Ci1DT1JFRkxBRz0KLVRSQURfSEVBREVSPQotaWYgdGVzdCAiJHt0YXJnZXR9IiA9ICIke2hvc3R9IjsgdGhlbgotICBjYXNlICIke2hvc3R9IiBpbgotICBhbHBoYSotKi1saW51eC1nbnUqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvYWxwaGFsaW51eC5oIicKLQk7OwotICBhbHBoYSotKi1uZXRic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OwotICBhbHBoYSotKi0qKQkJQ09SRUZJTEU9b3NmLWNvcmUubG8gOzsKLSAgYXJtLSotcmlzY2l4KQkJQ09SRUZJTEU9dHJhZC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotaHB1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBocHBhKi0qLWhpdXgqKQlDT1JFRklMRT1ocHV4LWNvcmUubG8gOzsKLSAgaHBwYSotKi1tcGVpeCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBocHBhKi0qLWJzZCopCQlDT1JFRklMRT0iaHB1eC1jb3JlLmxvIGhwcGFic2QtY29yZS5sbyIKLQkJCUNPUkVGTEFHPSItREhQVVhfQ09SRSAtREhQUEFCU0RfQ09SRSIgOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni1zZXF1ZW50LWJzZCopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvOwotCVRSQURfSEVBREVSPSciaG9zdHMvc3ltbWV0cnkuaCInCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3Y0KikgOzsKLSAgaVszNDU2XTg2LXNlcXVlbnQtc3lzdiopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9zeW1tZXRyeS5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotYnNkKiB8IGlbMzQ1Nl04Ni0qLWZyZWVic2QqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTM4NmJzZC5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotbmV0YnNkKiB8IGlbMzQ1Nl04Ni0qLW9wZW5ic2QqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni1lc2l4LXN5c3YzKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2VzaXguaCInCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni0qLXNjbzMuMnY1KikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT1zY281LWNvcmUubG8KLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotc2NvKiB8IGlbMzQ1Nl04Ni0qLWlzYyopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2c2NvLmgiJwotCTs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtKi1tYWNoMyopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2bWFjaDMuaCInCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni0qLWxpbnV4LWdudSopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2bGludXguaCInCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni0qLWlzYyopCUNPUkVGSUxFPXRyYWQtY29yZS5sbyA7OwotICBpWzM0NTZdODYtKi1haXgqKQlDT1JFRklMRT1haXgzODYtY29yZS5sbyA7OwotY2hhbmdlcXVvdGUoWyxdKWRubAotICBpODYwLSotbWFjaDMqIHwgaTg2MC0qLW9zZjEqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTg2MG1hY2gzLmgiJwotCTs7Ci0gIG1pcHMtZGVjLWJzZCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9taXBzYnNkLmgiJwotCTs7Ci0gIG1pcHMtZGVjLW1hY2gzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL21pcHNtYWNoMy5oIicKLQk7OwotICBtaXBzLSotbmV0YnNkKiB8IG1pcHMqLSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICBtaXBzLWRlYy0qKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZGVjc3RhdGlvbi5oIicKLQk7OwotICBtaXBzLXNnaS1pcml4NCopCUNPUkVGSUxFPWlyaXgtY29yZS5sbyA7OwotICBtaXBzLXNnaS1pcml4NSopCUNPUkVGSUxFPWlyaXgtY29yZS5sbyA7OwotICBtaXBzLXNnaS1pcml4NiopCUNPUkVGSUxFPWlyaXgtY29yZS5sbyA7OwotICBtaXBzLSotbWFjaDMqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbWlwc21hY2gzLmgiJwotCTs7Ci0gIG1pcHMtKi1zeXN2NCopCTs7Ci0gIG1pcHMtKi1zeXN2KiB8IG1pcHMtKi1yaXNjb3MqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvcmlzY29zLmgiJwotCTs7Ci0gIG1pcHMtc29ueS1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbmV3cy1taXBzLmgiJwotCTs7Ci0gIG02OCotYnVsbCotc3lzdiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9kcHgyLmgiJwotCTs7Ci0gIG02OCotaHAtaHB1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBtNjgqLWhwLWJzZCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9ocDMwMGJzZC5oIicKLQk7OwotICBtNjgqLSotbGludXgtZ251KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL202OGtsaW51eC5oIicKLQk7OwotICBtNjgqLW1vdG9yb2xhLXN5c3YqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZGVsdGE2OC5oIicKLQk7OwotICBtNjgqLXNvbnktKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL25ld3MuaCInCi0JOzsKLSAgbTY4Ki0qLW5ldGJzZCogfCBtNjgqLSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICBtNjgqLWFwcGxlLWF1eCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9tNjhrYXV4LmgiJwotCTs7Ci0gIG04OCotKi1zeXN2NCopCTs7Ci0gIG04OCotbW90b3JvbGEtc3lzdiopCUNPUkVGSUxFPXB0cmFjZS1jb3JlLmxvIDs7Ci0gIG04OCotKi1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9tODhrbWFjaDMuaCInCi0JOzsKLSAgbnMzMmstcGM1MzItbWFjaCkKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3BjNTMybWFjaC5oIicKLQk7OwotICBuczMyay0qLW5ldGJzZCogfCBuczMyay0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgcnM2MDAwLSotbHlueCopCUNPUkVGSUxFPWx5bngtY29yZS5sbyA7OwotICByczYwMDAtKi1haXg0KikJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcnM2MDAwLSotKikJCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi0qYnNkKikJQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLWFpeDQqKQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICBwb3dlcnBjLSotYWl4KikJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLWJlb3MqKQk7OwotICBwb3dlcnBjLSotbmV0YnNkKikJQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8gOzsKLSAgc3BhcmMtKi1uZXRic2QqIHwgc3BhcmMtKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIHRhaG9lLSotKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3RhaG9lLmgiJwotCTs7Ci0gIHZheC0qLXVsdHJpeDIqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvdmF4dWx0Mi5oIicKLQk7OwotICB2YXgtKi11bHRyaXgqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvdmF4dWx0Mi5oIicKLQk7OwotICB2YXgtKi0qKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvdmF4YnNkLmgiJwotCTs7Ci0gIGVzYWMKLQotICBjYXNlICIkQ09SRUZJTEUiIGluCi0gIGFpeDM4Ni1jb3JlLmxvKQlDT1JFRkxBRz0tREFJWDM4Nl9DT1JFIDs7Ci0gIGhwcGFic2QtY29yZS5sbykJQ09SRUZMQUc9LURIUFBBQlNEX0NPUkUgOzsKLSAgaHB1eC1jb3JlLmxvKQkJQ09SRUZMQUc9LURIUFVYX0NPUkUgOzsKLSAgaXJpeC1jb3JlLmxvKQkJQ09SRUZMQUc9LURJUklYX0NPUkUgOzsKLSAgbHlueC1jb3JlLmxvKQkJQ09SRUZMQUc9LURMWU5YX0NPUkUgOzsKLSAgbmV0YnNkLWNvcmUubG8pCUNPUkVGTEFHPS1ETkVUQlNEX0NPUkUgOzsKLSAgb3NmLWNvcmUubG8pCQlDT1JFRkxBRz0tRE9TRl9DT1JFIDs7Ci0gIHB0cmFjZS1jb3JlLmxvKQlDT1JFRkxBRz0tRFBUUkFDRV9DT1JFIDs7Ci0gIHJzNjAwMC1jb3JlLmxvKQlDT1JFRkxBRz0iJENPUkVGTEFHIC1EQUlYX0NPUkUiIDs7Ci0gIHNjbzUtY29yZS5sbykJCUNPUkVGTEFHPSIkQ09SRUZMQUcgLURTQ081X0NPUkUiIDs7Ci0gIHRyYWQtY29yZS5sbykJCUNPUkVGTEFHPSIkQ09SRUZMQUcgLURUUkFEX0NPUkUiIDs7Ci0gIGVzYWMKLQotICAjIEVMRiBjb3JlZmlsZSBzdXBwb3J0IGhhcyBzZXZlcmFsIGZsYXZvcnMsIGJ1dCBhbGwgb2YKLSAgIyB0aGVtIHVzZSBzb21ldGhpbmcgY2FsbGVkIDxzeXMvcHJvY2ZzLmg+Ci0gIEFDX0NIRUNLX0hFQURFUlMoc3lzL3Byb2Nmcy5oKQotICBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19wcm9jZnNfaCIgPSB5ZXM7IHRoZW4KLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUocHJzdGF0dXNfdCkKLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSKHByc3RhdHVzX3QsIHByX3dobykKLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUocHN0YXR1c190KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShwcnBzaW5mb190KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShwc2luZm9fdCkKLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUobHdwc3RhdHVzX3QpCi0gICAgQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFX01FTUJFUihsd3BzdGF0dXNfdCwgcHJfY29udGV4dCkKLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSKGx3cHN0YXR1c190LCBwcl9yZWcpCi0gIGZpCi1maQotQUNfU1VCU1QoQ09SRUZJTEUpCi1BQ19TVUJTVChDT1JFRkxBRykKLUFDX0RFRklORV9VTlFVT1RFRChUUkFEX0hFQURFUiwgJFRSQURfSEVBREVSLAotICBbTmFtZSBvZiBob3N0IHNwZWNpZmljIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gdHJhZC1jb3JlLmMuXSkKLQotIyBIb3JyaWJsZSBoYWNrcyB0byBidWlsZCBETExzIG9uIFdpbmRvd3MuCi1XSU4zMkxERkxBR1M9Ci1XSU4zMkxJQkFERD0KLWNhc2UgIiR7aG9zdH0iIGluCi0qLSotY3lnd2luKikKLSAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gInllcyI7IHRoZW4KLSAgICBXSU4zMkxERkxBR1M9Ii1uby11bmRlZmluZWQiCi0gICAgV0lOMzJMSUJBREQ9Ii1MYHB3ZGAvLi4vbGliaWJlcnR5IC1saWJlcnR5IC1MYHB3ZGAvLi4vaW50bCAtbGludGwgLWxjeWd3aW4gLWxrZXJuZWwzMiIKLSAgZmkKLSAgOzsKLWVzYWMKLUFDX1NVQlNUKFdJTjMyTERGTEFHUykKLUFDX1NVQlNUKFdJTjMyTElCQUREKQotCi0jIHRhcmdldCBzdHVmZjoKLQotIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgotICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi0gICAgZG8KLQlyZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAotCWlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotZGVmdmVjPQotc2VsdmVjcz0KLXNlbGFyY2hzPQotVERFRklORVM9Ci1mb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCi1kbwotICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCI7IHRoZW4KLSAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQotICAgIGVsc2UKLQkuICRzcmNkaXIvY29uZmlnLmJmZAotCWlmIHRlc3QgIngkdGFyZyIgPSAieCR0YXJnZXQiOyB0aGVuCi0JICAgIGRlZnZlYz0kdGFyZ19kZWZ2ZWMKLQlmaQotCXNlbHZlY3M9IiRzZWx2ZWNzICR0YXJnX2RlZnZlYyAkdGFyZ19zZWx2ZWNzIgotCXNlbGFyY2hzPSIkc2VsYXJjaHMgJHRhcmdfYXJjaHMiCi0JVERFRklORVM9IiRUREVGSU5FUyAkdGFyZ19jZmxhZ3MiCi0gICAgZmkKLWRvbmUKLUFDX1NVQlNUKFRERUZJTkVTKQotCi0jIFRoaXMgcHJvY2Vzc2luZyBzdGlsbCBuZWVkcyB0byBiZSBkb25lIGlmIHdlJ3JlIHRvIGRlY2lkZSBwcm9wZXJseSB3aGV0aGVyCi0jIDY0LWJpdCBzdXBwb3J0IG5lZWRzIHRvIGJlIGNvbXBpbGVkIGluLiAgQ3VycmVudGx5LCBpdCB3aWxsIGJlIGluY2x1ZGVkIGlmCi0jIHRoZSBkZWZhdWx0IG9yIGFueSBvdGhlciBleHBsaWNpdGx5IHJlcXVlc3RlZCB0YXJnZXQgcmVxdWlyZXMgaXQ7IGl0Ci0jIHdpbGwgbm90IGJlIGluY2x1ZGVkIG9uIGEgMzItYml0IGhvc3QgaWYgbm8gNjQtYml0IHRhcmdldCBpcyByZXF1ZXN0ZWQsIGFuZAotIyBubyAiLS13aXRoLTY0LWJpdC1iZmQiIG9wdGlvbiBpcyBnaXZlbiwgZXZlbiBpZiAiLS13aXRoLXRhcmdldHM9YWxsIiBpcwotIyB1c2VkLgotCi0jIHVuaXEgdGhlIGRlZmF1bHQgYW5kIHNlbGVjdGVkIHZlY3RvcnMgaW4gYWxsIHRoZSBjb25maWd1cmVkIHRhcmdldHMuCi1mPSIiCi1mb3IgaSBpbiAkc2VsdmVjcyA7IGRvCi0gICAgY2FzZSAiICRmICIgaW4KLSAgICAqIiAkaSAiKikgOzsKLSAgICAqKSBmPSIkZiAkaSIgOzsKLSAgICBlc2FjCi1kb25lCi1zZWx2ZWNzPSIkZiIKLQotCi0jIHVuaXEgdGhlIGFyY2hpdGVjdHVyZXMgaW4gYWxsIHRoZSBjb25maWd1cmVkIHRhcmdldHMuCi1mPSIiCi1mb3IgaSBpbiAkc2VsYXJjaHMgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotc2VsYXJjaHM9IiRmIgotCi0jIFRhcmdldCBiYWNrZW5kIC5vIGZpbGVzLgotdGI9Ci0KLWVsZj0iZWxmLmxvIGVsZmxpbmsubG8gZHdhcmYyLmxvIGR3YXJmMS5sbyIKLQotZm9yIHZlYyBpbiAkc2VsdmVjcwotZG8KLSAgICBjYXNlICIkdmVjIiBpbgotICAgICMgVGhpcyBsaXN0IGlzIGFscGhhYmV0aXplZCB0byBtYWtlIGl0IGVhc3kgdG8gY29tcGFyZQotICAgICMgd2l0aCB0aGUgdHdvIHZlY3RvciBsaXN0cyBpbiB0YXJnZXRzLmMuCi0gICAgYTI5a2NvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1hMjlrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGFfb3V0X2Fkb2JlX3ZlYykJCXRiPSIkdGIgYW91dC1hZG9iZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYXJtY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtcGVfbGl0dGxlX3ZlYykJCXRiPSIkdGIgcGUtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1wZV9iaWdfdmVjKQkJdGI9IiR0YiBwZS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybXBlaV9saXR0bGVfdmVjKQkJdGI9IiR0YiBwZWktYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1wZWlfYmlnX3ZlYykJCXRiPSIkdGIgcGVpLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYykJdGI9IiR0YiBlcG9jLXBlLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVfYmlnX3ZlYykJdGI9IiR0YiBlcG9jLXBlLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMpCXRiPSIkdGIgZXBvYy1wZWktYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1fZXBvY19wZWlfYmlnX3ZlYykJdGI9IiR0YiBlcG9jLXBlaS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFvdXQwX2JpZ192ZWMpCQl0Yj0iJHRiIGFvdXQwLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X2FybV9iaWdfdmVjKQkJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9hcm1fbGl0dGxlX3ZlYykJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9taXBzX2JpZ192ZWMpCQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFvdXRfbWlwc19saXR0bGVfdmVjKQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFwb2xsb2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWFwb2xsby5sbyIgOzsKLSAgICBiX291dF92ZWNfYmlnX2hvc3QpCQl0Yj0iJHRiIGJvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGJfb3V0X3ZlY19saXR0bGVfaG9zdCkJdGI9IiR0YiBib3V0LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBiZmRfZWxmNjRfYWxwaGFfdmVjKQl0Yj0iJHRiIGVsZjY0LWFscGhhLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYykgdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYykJdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMpIAl0Yj0iJHRiIGVsZjMyLWdlbi5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdtaXBzX3ZlYykgCXRiPSIkdGIgZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfZWxmNjRfYmlnbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjY0LW1pcHMubG8gZWxmNjQubG8gZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjMyX2QxMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMTB2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2QzMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMzB2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2ZyMzBfdmVjKQkJdGI9IiR0YiBlbGYzMi1mcjMwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2hwcGFfdmVjKQkJdGI9IiR0YiBlbGYzMi1ocHBhLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2kzODZfdmVjKQkJdGI9IiR0YiBlbGYzMi1pMzg2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2k4NjBfdmVjKQkJdGI9IiR0YiBlbGYzMi1pODYwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYykgdGI9IiR0YiBlbGYzMi1nZW4ubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjKSAJdGI9IiR0YiBlbGY2NC1taXBzLmxvIGVsZjY0LmxvIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGYzMl9tMzJyX3ZlYykJCXRiPSIkdGIgZWxmMzItbTMyci5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tNjhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTY4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tODhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTg4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tY29yZV9iaWdfdmVjKQl0Yj0iJHRiIGVsZjMyLW1jb3JlLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMpCXRiPSIkdGIgZWxmMzItbWNvcmUubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbW4xMDIwMF92ZWMpCXRiPSIkdGIgZWxmLW0xMDIwMC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tbjEwMzAwX3ZlYykJdGI9IiR0YiBlbGYtbTEwMzAwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3Bvd2VycGNfdmVjKQl0Yj0iJHRiIGVsZjMyLXBwYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjKQl0Yj0iJHRiIGVsZjMyLXBwYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9zaF92ZWMpCQl0Yj0iJHRiIGVsZjMyLXNoLmxvIGVsZjMyLmxvICRlbGYgY29mZi1zaC5sbyIgOzsKLSAgICBiZmRfZWxmMzJfc2hsX3ZlYykJCXRiPSIkdGIgZWxmMzItc2gubG8gZWxmMzIubG8gJGVsZiBjb2ZmLXNoLmxvIiA7OwotICAgIGJmZF9lbGYzMl9zcGFyY192ZWMpCXRiPSIkdGIgZWxmMzItc3BhcmMubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfdjg1MF92ZWMpCQl0Yj0iJHRiIGVsZjMyLXY4NTAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjKSAJdGI9IiR0YiBlbGY2NC1nZW4ubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYykgdGI9IiR0YiBlbGY2NC1nZW4ubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjY0X3NwYXJjX3ZlYykJdGI9IiR0YiBlbGY2NC1zcGFyYy5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBjaXNjb19jb3JlX3ZlYykJCXRiPSIkdGIgY2lzY28tY29yZS5sbyIgOzsKLSAgICBkZW1vXzY0X3ZlYykJCXRiPSIkdGIgZGVtbzY0LmxvIGFvdXQ2NC5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgZWNvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLW1pcHMubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIiA7OwotICAgIGVjb2ZmX2JpZ2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZmFscGhhX2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1hbHBoYS5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGdvMzJjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1nbzMyLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGdvMzJzdHViYmVkY29mZl92ZWMpCXRiPSIkdGIgY29mZi1zdGdvMzIubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaDgzMDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1oODMwMC5sbyByZWxvYzE2LmxvIiA7OwotICAgIGg4NTAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaDg1MDAubG8gcmVsb2MxNi5sbyIgOzsKLSAgICBob3N0X2FvdXRfdmVjKQkJdGI9IiR0YiBob3N0LWFvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGhwMzAwYnNkX3ZlYykJCXRiPSIkdGIgaHAzMDBic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGhwMzAwaHB1eF92ZWMpCQl0Yj0iJHRiIGhwMzAwaHB1eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmFvdXRfdmVjKQkJdGI9IiR0YiBpMzg2YW91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmJzZF92ZWMpCQl0Yj0iJHRiIGkzODZic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1pMzg2LmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGkzODZkeW5peF92ZWMpCQl0Yj0iJHRiIGkzODZkeW5peC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmZyZWVic2RfdmVjKQkJdGI9IiR0YiBpMzg2ZnJlZWJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nm1zZG9zX3ZlYykJCXRiPSIkdGIgaTM4Nm1zZG9zLmxvIiA7OwotICAgIGkzODZwZV92ZWMpCQkJdGI9IiR0YiBwZS1pMzg2LmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBpMzg2cGVpX3ZlYykJCXRiPSIkdGIgcGVpLWkzODYubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaTM4NmxpbnV4X3ZlYykJCXRiPSIkdGIgaTM4NmxpbnV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bHlueF9hb3V0X3ZlYykJCXRiPSIkdGIgaTM4Nmx5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bHlueF9jb2ZmX3ZlYykJCXRiPSIkdGIgY2YtaTM4Nmx5bngubG8gY29mZmxpbmsubG8gbHlueC1jb3JlLmxvIiA7OwotICAgIGkzODZtYWNoM192ZWMpCQl0Yj0iJHRiIGkzODZtYWNoMy5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nm5ldGJzZF92ZWMpCQl0Yj0iJHRiIGkzODZuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZvczlrX3ZlYykJCXRiPSIkdGIgaTM4Nm9zOWsubG8gYW91dDMyLmxvIiA7OwotICAgIGk4NjBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1pODYwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGljb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtaTk2MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLWk5NjAubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaWVlZV92ZWMpCQkJdGI9IiR0YiBpZWVlLmxvIiA7OwotICAgIG02OGtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtjb2ZmdW5fdmVjKQkJdGI9IiR0YiBjb2ZmLXU2OGsubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtsaW51eF92ZWMpCQl0Yj0iJHRiIG02OGtsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2x5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIG02OGtseW54LmxvIGx5bngtY29yZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2x5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLW02OGtseW54LmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyBseW54LWNvcmUubG8iIDs7Ci0gICAgbTY4a25ldGJzZF92ZWMpCQl0Yj0iJHRiIG02OGtuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGs0a25ldGJzZF92ZWMpCQl0Yj0iJHRiIG02OGs0a25ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2F1eF9jb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1hdXgubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtzeXN2Y29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtc3ZtNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG04OGtiY3NfdmVjKQkJdGI9IiR0YiBjb2ZmLW04OGsubG8iIDs7Ci0gICAgbWNvcmVfcGVfYmlnX3ZlYykJCXRiPSIkdGIgcGUtbWNvcmUubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbWNvcmVfcGVfbGl0dGxlX3ZlYykJdGI9IiR0YiBwZS1tY29yZS5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZWlfYmlnX3ZlYykJCXRiPSIkdGIgcGVpLW1jb3JlLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1jb3JlX3BlaV9saXR0bGVfdmVjKQl0Yj0iJHRiIHBlaS1tY29yZS5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBuZXdzb3MzX3ZlYykJCXRiPSIkdGIgbmV3c29zMy5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbmxtMzJfaTM4Nl92ZWMpCQl0Yj0iJHRiIG5sbTMyLWkzODYubG8gbmxtMzIubG8gbmxtLmxvIiA7OwotICAgIG5sbTMyX3NwYXJjX3ZlYykJCXRiPSIkdGIgbmxtMzItc3BhcmMubG8gbmxtMzIubG8gbmxtLmxvIiA7OwotICAgIG5sbTMyX2FscGhhX3ZlYykJCXRiPSIkdGIgbmxtMzItYWxwaGEubG8gbmxtMzIubG8gbmxtLmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICByaXNjaXhfdmVjKQkJCXRiPSIkdGIgYW91dDMyLmxvIHJpc2NpeC5sbyIgOzsKLSAgICBubG0zMl9wb3dlcnBjX3ZlYykJCXRiPSIkdGIgbmxtMzItcHBjLmxvIG5sbTMyLmxvIG5sbS5sbyIgOzsKLSAgICBwYzUzMm5ldGJzZF92ZWMpCQl0Yj0iJHRiIG5zMzJrbmV0YnNkLmxvIGFvdXQtbnMzMmsubG8iIDs7Ci0gICAgcGM1MzJtYWNoYW91dF92ZWMpCQl0Yj0iJHRiIHBjNTMyLW1hY2gubG8gYW91dC1uczMyay5sbyIgOzsKLSAgICBwbWFjX3hjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1wbWFjLmxvIHhjb2ZmbGluay5sbyIgOzsKLSAgICByczYwMDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1yczYwMDAubG8geGNvZmZsaW5rLmxvIiA7OwotICAgIGJmZF9wb3dlcnBjX3BlX3ZlYykgICAgICAgICB0Yj0iJHRiIHBlLXBwYy5sbyBjb2ZmbGluay5sbyIgOzsgIAotICAgIGJmZF9wb3dlcnBjbGVfcGVfdmVjKSAgICAgICB0Yj0iJHRiIHBlLXBwYy5sbyBjb2ZmbGluay5sbyIgOzsgIAotICAgIGJmZF9wb3dlcnBjX3BlaV92ZWMpICAgICAgICB0Yj0iJHRiIHBlaS1wcGMubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX3Bvd2VycGNsZV9wZWlfdmVjKSAgICAgIHRiPSIkdGIgcGVpLXBwYy5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBwcGNib290X3ZlYykJCXRiPSIkdGIgcHBjYm9vdC5sbyIgOzsKLSAgICBzaGNvZmZfdmVjKQkJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGxjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGNvZmZfc21hbGxfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNobGNvZmZfc21hbGxfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNvbV92ZWMpCQkJdGI9IiR0YiBzb20ubG8iIDs7Ci0gICAgc3BhcmNsZV9hb3V0X3ZlYykJCXRiPSIkdGIgYW91dC1zcGFyY2xlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2xpbnV4X3ZlYykJCXRiPSIkdGIgc3BhcmNsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNseW54X2FvdXRfdmVjKQkJdGI9IiR0YiBzcGFyY2x5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2x5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLXNwYXJjbHlueC5sbyBseW54LWNvcmUubG8iIDs7Ci0gICAgc3BhcmNuZXRic2RfdmVjKQkJdGI9IiR0YiBzcGFyY25ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zcGFyYy5sbyIgOzsKLSAgICBzcmVjX3ZlYykJCQl0Yj0iJHRiIHNyZWMubG8iIDs7Ci0gICAgc3Vub3NfYmlnX3ZlYykJCXRiPSIkdGIgc3Vub3MubG8gYW91dDMyLmxvIiA7OwotICAgIHN5bWJvbHNyZWNfdmVjKQkJdGI9IiR0YiBzcmVjLmxvIiA7OwotICAgIHRla2hleF92ZWMpCQkJdGI9IiR0YiB0ZWtoZXgubG8iIDs7Ci0gICAgdGljMzBfYW91dF92ZWMpCQl0Yj0iJHRiIGFvdXQtdGljMzAubG8iIDs7Ci0gICAgdGljMzBfY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtdGljMzAubG8iIDs7Ci0gICAgdGljODBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi10aWM4MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICB2ZXJzYWRvc192ZWMpCQl0Yj0iJHRiIHZlcnNhZG9zLmxvIiA7OwotICAgIHZtc19hbHBoYV92ZWMpCQl0Yj0iJHRiIHZtcy5sbyB2bXMtaGRyLmxvIHZtcy1nc2QubG8gdm1zLXRpci5sbyB2bXMtbWlzYy5sbyIKLSAJCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIHZtc192YXhfdmVjKQkJdGI9IiR0YiB2bXMubG8gdm1zLWhkci5sbyB2bXMtZ3NkLmxvIHZtcy10aXIubG8gdm1zLW1pc2MubG8iIDs7Ci0gICAgdzY1X3ZlYykJCQl0Yj0iJHRiIGNvZmYtdzY1LmxvIHJlbG9jMTYubG8iIDs7Ci0gICAgd2UzMmtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi13ZTMyay5sbyIgOzsKLSAgICB6OGtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi16OGsubG8gcmVsb2MxNi5sbyIgOzsKLQotICAgICIiKQkJCTs7Ci0gICAgKikgQUNfTVNHX0VSUk9SKCoqKiB1bmtub3duIHRhcmdldCB2ZWN0b3IgJHZlYykgOzsKLSAgICBlc2FjCi1kb25lCi0KLSMgVGFyZ2V0IGFyY2hpdGVjdHVyZSAubyBmaWxlcy4KLSMgQSBjb3VwbGUgb2YgQ1BVcyB1c2Ugc2hvcnRlciBmaWxlIG5hbWVzIHRvIGF2b2lkIHByb2JsZW1zIG9uIERPUwotIyBmaWxlc3lzdGVtcy4KLXRhPWBlY2hvICRzZWxhcmNocyB8IHNlZCAtZSBzL2JmZF8vY3B1LS9nIC1lIHMvX2FyY2gvLmxvL2cgLWUgcy9tbjEwMjAwL20xMDIwMC8gLWUgcy9tbjEwMzAwL20xMDMwMC9gCi0KLSMgV2VlZCBvdXQgZHVwbGljYXRlIC5vIGZpbGVzLgotZj0iIgotZm9yIGkgaW4gJHRiIDsgZG8KLSAgICBjYXNlICIgJGYgIiBpbgotICAgICoiICRpICIqKSA7OwotICAgICopIGY9IiRmICRpIiA7OwotICAgIGVzYWMKLWRvbmUKLXRiPSIkZiIKLQotZj0iIgotZm9yIGkgaW4gJHRhIDsgZG8KLSAgICBjYXNlICIgJGYgIiBpbgotICAgICoiICRpICIqKSA7OwotICAgICopIGY9IiRmICRpIiA7OwotICAgIGVzYWMKLWRvbmUKLXRhPSIkZiIKLQotYmZkX2JhY2tlbmRzPSIkdGIiCi1iZmRfbWFjaGluZXM9IiR0YSIKLQotaWYgdGVzdCB4JHthbGxfdGFyZ2V0c30gPSB4dHJ1ZSA7IHRoZW4KLSAgYmZkX2JhY2tlbmRzPSIke2JmZF9iYWNrZW5kc30iJyAkKEFMTF9CQUNLRU5EUyknCi0gIGJmZF9tYWNoaW5lcz0iJHtiZmRfbWFjaGluZXN9IicgJChBTExfTUFDSElORVMpJwotICBzZWx2ZWNzPQotICBoYXZldmVjcz0KLSAgc2VsYXJjaHM9Ci1lbHNlCSMgYWxsX3RhcmdldHMgaXMgdHJ1ZQotICAjIE9ubHkgc2V0IHRoZXNlIGlmIHRoZXkgd2lsbCBiZSBub25lbXB0eSwgZm9yIHRoZSBjbGV2ZXIgZWNoby4KLSAgaGF2ZXZlY3M9Ci0gIHRlc3QgLW4gIiRzZWx2ZWNzIiAmJgotICAgIGhhdmV2ZWNzPWBlY2hvICRzZWx2ZWNzIHwgc2VkIC1lICdzL14vLURIQVZFXy8nIC1lICdzLyBcKC5cKS8gLURIQVZFX1wxL2cnYAotICB0ZXN0IC1uICIkc2VsdmVjcyIgJiYKLSAgICBzZWx2ZWNzPWBlY2hvICRzZWx2ZWNzIHwgc2VkIC1lICdzL14vXCYvJyAtZSAncy8gXCguXCkvLFwmXDEvZydgCi0gIHRlc3QgLW4gIiRzZWxhcmNocyIgJiYKLSAgICBzZWxhcmNocz1gZWNobyAkc2VsYXJjaHMgfCBzZWQgLWUgJ3MvXi9cJi8nIC1lICdzLyBcKC5cKS8sXCZcMS9nJ2AKLWZpCSMgYWxsX3RhcmdldHMgaXMgdHJ1ZQotCi1jYXNlICR7aG9zdDY0fS0ke3RhcmdldDY0fS0ke3dhbnQ2NH0gaW4KLSAgKnRydWUqKQotICAgIHdvcmRzaXplPTY0Ci0gICAgYWxsX2JhY2tlbmRzPSckKEJGRDY0X0JBQ0tFTkRTKSAkKEJGRDMyX0JBQ0tFTkRTKScKLSAgICBpZiB0ZXN0IC16ICIkR0NDIiAmJiB0ZXN0ICIkQkZEX0hPU1RfNjRCSVRfTE9ORyIgPSAiMCIgJiYgdGVzdCAiJEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEIiA9ICIwIjsgdGhlbgotICAgICAgQUNfTVNHX1dBUk4oW1lvdSBoYXZlIHJlcXVlc3RlZCBhIDY0IGJpdCBCRkQgY29uZmlndXJhdGlvbiwgYnV0XSkKLSAgICAgIEFDX01TR19XQVJOKFt5b3VyIGNvbXBpbGVyIG1heSBub3QgaGF2ZSBhIDY0IGJpdCBpbnRlZ3JhbCB0eXBlXSkKLSAgICBmaQotICAgIDs7Ci0gIGZhbHNlLWZhbHNlLWZhbHNlKQotICAgIHdvcmRzaXplPTMyCi0gICAgYWxsX2JhY2tlbmRzPSckKEJGRDMyX0JBQ0tFTkRTKScKLSAgICA7OwotZXNhYwotCi1BQ19TVUJTVCh3b3Jkc2l6ZSkKLUFDX1NVQlNUKGFsbF9iYWNrZW5kcykKLUFDX1NVQlNUKGJmZF9iYWNrZW5kcykKLUFDX1NVQlNUKGJmZF9tYWNoaW5lcykKLQotdGRlZmF1bHRzPSIiCi10ZXN0IC1uICIke2RlZnZlY30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9IC1EREVGQVVMVF9WRUNUT1I9JHtkZWZ2ZWN9IgotdGVzdCAtbiAiJHtzZWx2ZWNzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURTRUxFQ1RfVkVDUz0nJHtzZWx2ZWNzfSciCi10ZXN0IC1uICIke3NlbGFyY2hzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURTRUxFQ1RfQVJDSElURUNUVVJFUz0nJHtzZWxhcmNoc30nIgotdGVzdCAtbiAiJHtoYXZldmVjc30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9ICR7aGF2ZXZlY3N9IgotQUNfU1VCU1QodGRlZmF1bHRzKQotCi1kbmwgQUNfQ0hFQ0tfSEVBREVSUyhzeXMvbW1hbi5oKQotQUNfRlVOQ19NTUFQCi1BQ19DSEVDS19GVU5DUyhtYWR2aXNlIG1wcm90ZWN0KQotY2FzZSAke3dhbnRfbW1hcH0rJHthY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkfSBpbgotICB0cnVlK3llcyApICBBQ19ERUZJTkUoVVNFX01NQVAsIDEsIFtVc2UgbW1hcCBpZiBpdCdzIGF2YWlsYWJsZT9dKSA7OwotZXNhYwotCi1ybSAtZiBkb2MvY29uZmlnLnN0YXR1cwotQUNfT1VUUFVUKE1ha2VmaWxlIGRvYy9NYWtlZmlsZSBiZmQtaW4zLmg6YmZkLWluMi5oIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCi1bc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlXSkKZGlmZiAtLWdpdCBhL2JmZC9jb3JlZmlsZS5jIGIvYmZkL2NvcmVmaWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMmY1MTkuLjAwMDAwMDAKLS0tIGEvYmZkL2NvcmVmaWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyogQ29yZSBmaWxlIGdlbmVyaWMgaW50ZXJmYWNlIHJvdXRpbmVzIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCUNvcmUgZmlsZXMKLQotREVTQ1JJUFRJT04KLQlUaGVzZSBhcmUgZnVuY3Rpb25zIHBlcnRhaW5pbmcgdG8gY29yZSBmaWxlcy4KLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotCi0vKgotRlVOQ1RJT04KLQliZmRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotCi1TWU5PUFNJUwotCUNPTlNUIGNoYXIgKmJmZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgcmVhZC1vbmx5IHN0cmluZyBleHBsYWluaW5nIHdoaWNoIHByb2dyYW0gd2FzIHJ1bm5pbmcKLQl3aGVuIGl0IGZhaWxlZCBhbmQgcHJvZHVjZWQgdGhlIGNvcmUgZmlsZSBAdmFye2FiZmR9LgotCi0qLwotCi1DT05TVCBjaGFyICoKLWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX2NvcmUpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBCRkRfU0VORCAoYWJmZCwgX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQsIChhYmZkKSk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLQotU1lOT1BTSVMKLQlpbnQgYmZkX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbChiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybnMgdGhlIHNpZ25hbCBudW1iZXIgd2hpY2ggY2F1c2VkIHRoZSBjb3JlIGR1bXAgd2hpY2gKLQlnZW5lcmF0ZWQgdGhlIGZpbGUgdGhlIEJGRCBAdmFye2FiZmR9IGlzIGF0dGFjaGVkIHRvLgotKi8KLQotaW50Ci1iZmRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX2NvcmUpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBCRkRfU0VORCAoYWJmZCwgX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCwgKGFiZmQpKTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQljb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQotU1lOT1BTSVMKLQlib29sZWFuIGNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCQkoYmZkICpjb3JlX2JmZCwgYmZkICpleGVjX2JmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIDw8dHJ1ZT4+IGlmIHRoZSBjb3JlIGZpbGUgYXR0YWNoZWQgdG8gQHZhcntjb3JlX2JmZH0KLQl3YXMgZ2VuZXJhdGVkIGJ5IGEgcnVuIG9mIHRoZSBleGVjdXRhYmxlIGZpbGUgYXR0YWNoZWQgdG8KLQlAdmFye2V4ZWNfYmZkfSwgPDxmYWxzZT4+IG90aGVyd2lzZS4KLSovCi1ib29sZWFuCi1jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICAgIGlmICgoY29yZV9iZmQtPmZvcm1hdCAhPSBiZmRfY29yZSkgfHwgKGV4ZWNfYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdCkpIHsKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICByZXR1cm4gQkZEX1NFTkQgKGNvcmVfYmZkLCBfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wLAotCQkgICAgIChjb3JlX2JmZCwgZXhlY19iZmQpKTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9jcHUtYTI5ay5jIGIvYmZkL2NwdS1hMjlrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZDI1YTQuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1hMjlrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEFNRCAyOTAwMCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYTI5a19hcmNoID0KLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfYTI5aywKLSAgICAwLAkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJhMjlrIiwKLSAgICAiYTI5ayIsCi0gICAgNCwKLSAgICB0cnVlLCAvKiB0aGUgb25lIGFuZCBvbmx5ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICAgMCwKLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtYWxwaGEuYyBiL2JmZC9jcHUtYWxwaGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg5OTAwYi4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWFscGhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEFscGhhIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBOKEJJVFNfV09SRCwgQklUU19BRERSLCBOVU1CRVIsIFBSSU5ULCBERUZBVUxULCBORVhUKSBcCi0gIHsJCQkJCQkJXAotICAgIEJJVFNfV09SRCwgLyogYml0cyBpbiBhIHdvcmQgKi8JCQlcCi0gICAgQklUU19BRERSLCAvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8JCQlcCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwkJCQlcCi0gICAgYmZkX2FyY2hfYWxwaGEsCQkJCQlcCi0gICAgTlVNQkVSLAkJCQkJCVwKLSAgICAiYWxwaGEiLAkJCQkJCVwKLSAgICBQUklOVCwJCQkJCQlcCi0gICAgMywJCQkJCQkJXAotICAgIERFRkFVTFQsCQkJCQkJXAotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAkJCQlcCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwJCQkJCVwKLSAgICBORVhULAkJCQkJCVwKLSAgfQotCi0jZGVmaW5lIE5OKGluZGV4KSAoJmFyY2hfaW5mb19zdHJ1Y3RbaW5kZXhdKQotCi0vKiBUaGVzZSBleGlzdCBvbmx5IHNvIHRoYXQgd2UgY2FuIHJlc29uYWJseSBkaXNhc3NlbWJsZSBQQUxjb2RlLiAgKi8KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0gCi17Ci0gIE4gKDY0LCA2NCwgYmZkX21hY2hfYWxwaGFfZXY0LCAiYWxwaGE6ZXY0IiwgZmFsc2UsIE5OKDEpKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9hbHBoYV9ldjUsICJhbHBoYTpldjUiLCBmYWxzZSwgTk4oMikpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX2FscGhhX2V2NiwgImFscGhhOmV2NiIsIGZhbHNlLCAwKSwKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYWxwaGFfYXJjaCA9Ci0gIE4gKDY0LCA2NCwgMCwgImFscGhhIiwgdHJ1ZSwgTk4oMCkpOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hcmMuYyBiL2JmZC9jcHUtYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZTU5ZDQuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1hcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgQVJDIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zIChkamVAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIEFSQyhtYWNoLCBwcmludF9uYW1lLCBkZWZhdWx0X3AsIG5leHQpIFwKLXsJCQkJCVwKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8JCVwKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCVwKLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQlcCi0gICAgYmZkX2FyY2hfYXJjLAkJCVwKLSAgICBtYWNoLAkJCQlcCi0gICAgImFyYyIsCQkJCVwKLSAgICBwcmludF9uYW1lLAkJCQlcCi0gICAgNCwgLyogc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIgKi8JXAotICAgIGRlZmF1bHRfcCwJCQkJXAotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAkJXAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCQkJXAotICAgIG5leHQsCQkJCVwKLSAgfQotCi0jaWYgMCAvKiA/Pz8gTm90IGN1cnJlbnRseSBuZWVkZWQsIGJ1dCBrZWVwIGluIGZvciBmdXR1cmUgcmVmZXJlbmNlLiAgKi8KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0KLXsKLSAgQVJDIChiZmRfbWFjaF9hcmNfZm9vLCAiYXJjLWZvbyIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFsxXSksCi0gIEFSQyAoYmZkX21hY2hfYXJjX2JhciwgImFyYy1iYXIiLCBmYWxzZSwgMCksCi19OwotI2VuZGlmCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYXJjX2FyY2ggPQotICBBUkMgKGJmZF9tYWNoX2FyY19iYXNlLCAiYXJjLWJhc2UiLCB0cnVlLCAwIC8qJmFyY2hfaW5mb19zdHJ1Y3RbMF0qLyk7Ci0MCi0vKiBVdGlsaXR5IHJvdXRpbmVzLiAgKi8KLQotLyogR2l2ZW4gY3B1IHR5cGUgTkFNRSwgcmV0dXJuIGl0cyBiZmRfbWFjaF9hcmNfeHh4IHZhbHVlLgotICAgUmV0dXJucyAtMSBpZiBub3QgZm91bmQuICAqLwotCi1pbnQKLWFyY19nZXRfbWFjaCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpwOwotCi0gIGZvciAocCA9ICZiZmRfYXJjX2FyY2g7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgewotICAgICAgLyogKzQ6IHNraXAgb3ZlciAiYXJjLSIgKi8KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHAtPnByaW50YWJsZV9uYW1lICsgNCkgPT0gMCkKLQlyZXR1cm4gcC0+bWFjaDsKLSAgICB9Ci0gIHJldHVybiAtMTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9jcHUtYXJtLmMgYi9iZmQvY3B1LWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTk5YzBmLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBBUk0gcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgMTk5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqY29tcGF0aWJsZQotICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKLXN0YXRpYyBib29sZWFuIHNjYW4gUEFSQU1TICgoY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgd29ya3Mgb3V0IHdoaWNoIEFSTQotICAgbWFjaGluZSB3aGljaCB3b3VsZCBiZSBjb21wYXRpYmxlIHdpdGggYm90aCBhbmQgcmV0dXJucyBhIHBvaW50ZXIKLSAgIHRvIGl0cyBpbmZvIHN0cnVjdHVyZSAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWNvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogYTsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogYjsKLXsKLSAgLyogSWYgYSAmIGIgYXJlIGZvciBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlIHdlIGNhbiBkbyBub3RoaW5nICovCi0gIGlmIChhLT5hcmNoICE9IGItPmFyY2gpCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAvKiBJZiBhICYgYiBhcmUgZm9yIHRoZSBzYW1lIG1hY2hpbmUgdGhlbiBhbGwgaXMgd2VsbCAqLwotICBpZiAoYS0+bWFjaCA9PSBiLT5tYWNoKQotICAgIHJldHVybiBhOwotCi0gIC8qIE90aGVyd2lzZSBpZiBlaXRoZXIgYSBvciBiIGlzIHRoZSAnZGVmYXVsdCcgbWFjaGluZSB0aGVuCi0gICAgIGl0IGNhbiBiZSBwb2x5bW9ycGhlZCBpbnRvIHRoZSBvdGhlciAqLwotICBpZiAoYS0+dGhlX2RlZmF1bHQpCi0gICAgcmV0dXJuIGI7Ci0gIAotICBpZiAoYi0+dGhlX2RlZmF1bHQpCi0gICAgcmV0dXJuIGE7Ci0KLSAgLyogU28gZmFyIGFsbCBuZXdlciBBUk0gYXJjaGl0ZWN0dXJlIGNvcmVzIGFyZSBzdXBlcnNldHMgb2YgcHJldmlvdXMgY29yZXMgKi8KLSAgaWYgKGEtPm1hY2ggPCBiLT5tYWNoKQotICAgIHJldHVybiBiOwotICBlbHNlIGlmIChhLT5tYWNoID4gYi0+bWFjaCkKLSAgICByZXR1cm4gYTsKLQotICAvKiBOZXZlciByZWFjaGVkISAqLwotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdAotewotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgY2hhciAqICAgICAgICAgICAgICAgIG5hbWU7Ci19Ci1wcm9jZXNzb3JzW10gPQotewotICB7IGJmZF9tYWNoX2FybV8yLCAgImFybTIiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8yYSwgImFybTI1MCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8yYSwgImFybTMiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYwIiAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYwMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTciICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTcxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTc1MDAiICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTdkIiAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTdkaSIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zTSwgImFybTdkbSIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zTSwgImFybTdkbWkiICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTgiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTgxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgInNhMSIgICAgICB9LAotICB7IGJmZF9tYWNoX2FybV80VCwgImFybTd0ZG1pIiB9Ci19OwotCi1zdGF0aWMgYm9vbGVhbiAKLXNjYW4gKGluZm8sIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKiBpbmZvOwotICAgICBjb25zdCBjaGFyICogc3RyaW5nOwotewotICBpbnQgIGk7Ci0KLSAgLyogRmlyc3QgdGVzdCBmb3IgYW4gZXhhY3QgbWF0Y2ggKi8KLSAgaWYgKHN0cmNhc2VjbXAgKHN0cmluZywgaW5mby0+cHJpbnRhYmxlX25hbWUpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTmV4dCBjaGVjayBmb3IgYSBwcm9jZXNzb3IgbmFtZSBpbnN0ZWFkIG9mIGFuIEFyY2hpdGVjdHVyZSBuYW1lICovCi0gIGZvciAoaSA9IHNpemVvZiAocHJvY2Vzc29ycykgLyBzaXplb2YgKHByb2Nlc3NvcnNbMF0pOyBpLS07KQotICAgIHsKLSAgICAgIGlmIChzdHJjYXNlY21wIChzdHJpbmcsIHByb2Nlc3NvcnNbIGkgXS5uYW1lKSA9PSAwKQotCWJyZWFrOwotICAgIH0KLQotICBpZiAoaSAhPSAtMSAmJiBpbmZvLT5hcmNoID09IHByb2Nlc3NvcnNbIGkgXS5hcmNoKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEZpbmFsbHkgY2hlY2sgZm9yIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSAqLwotICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCAiYXJtIikgPT0gMCkKLSAgICByZXR1cm4gaW5mby0+dGhlX2RlZmF1bHQ7Ci0gIAotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotI2RlZmluZSBOKG51bWJlciwgcHJpbnQsIGRlZmF1bHQsIG5leHQpICBcCi17ICAzMiwgMzIsIDgsIGJmZF9hcmNoX2FybSwgbnVtYmVyLCAiYXJtIiwgcHJpbnQsIDQsIGRlZmF1bHQsIGNvbXBhdGlibGUsIHNjYW4sIG5leHQgfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17IAotICBOKCBiZmRfbWFjaF9hcm1fMiwgICJhcm12MiIsICBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzFdICksCi0gIE4oIGJmZF9tYWNoX2FybV8yYSwgImFybXYyYSIsIGZhbHNlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbMl0gKSwKLSAgTiggYmZkX21hY2hfYXJtXzMsICAiYXJtdjMiLCAgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFszXSApLAotICBOKCBiZmRfbWFjaF9hcm1fM00sICJhcm12M20iLCBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzRdICksCi0gIE4oIGJmZF9tYWNoX2FybV80LCAgImFybXY0IiwgIGZhbHNlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbNV0gKSwKLSAgTiggYmZkX21hY2hfYXJtXzRULCAiYXJtdjR0IiwgZmFsc2UsIE5VTEwgKQotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hcm1fYXJjaCA9Ci0gIE4oIDAsICJhcm0iLCB0cnVlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbMF0gKTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtZDEwdi5jIGIvYmZkL2NwdS1kMTB2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZmYwODguLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1kMTB2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEQxMFYgcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiBIdW50IChodW50QGN5Z251cy5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMTB2X2FyY2ggPSAKLXsJCQkJCQotICAgIDE2LAkvKiAxNiBiaXRzIGluIGEgd29yZCAqLwkJCi0gICAgMTYsCS8qIDE2IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwkKLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQkKLSAgICBiZmRfYXJjaF9kMTB2LAotICAgIDAsCQkKLSAgICAiZDEwdiIsCQkJCQotICAgICJkMTB2IiwJCQkJCi0gICAgNCwgLyogc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIgKi8JCi0gICAgdHJ1ZSwJCQkJCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQkKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAkJCQotICAgIDAsCQkJCQotfTsKLQpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1kMzB2LmMgYi9iZmQvY3B1LWQzMHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVhZGZlZS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWQzMHYuYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgTWl0c3ViaXNoaSBEMzBWIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJ0aW4gSHVudCAoaHVudEBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZDMwdl9hcmNoID0KLXsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9kMzB2LAotICAgIDAsCi0gICAgImQzMHYiLAotICAgICJkMzB2IiwKLSAgICA0LCAvKiBzZWN0aW9uIGFsaWdubWVudCBwb3dlciAqLwotICAgIHRydWUsCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgIDAsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1mcjMwLmMgYi9iZmQvY3B1LWZyMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMyMDhmOC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWZyMzAuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgRlIzMCBwcm9jZXNzb3IuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2ZyMzBfYXJjaCA9Ci17Ci0gIDMyLAkJCQkvKiBiaXRzIHBlciB3b3JkICovCi0gIDMyLAkJCQkvKiBiaXRzIHBlciBhZGRyZXNzICovCi0gIDgsCQkJCS8qIGJpdHMgcGVyIGJ5dGUgKi8KLSAgYmZkX2FyY2hfZnIzMCwJCS8qIGFyY2hpdGVjdHVyZSAqLwotICBiZmRfbWFjaF9mcjMwLAkJLyogbWFjaGluZSAqLwotICAiZnIzMCIsCQkJLyogYXJjaGl0ZWN0dXJlIG5hbWUgKi8KLSAgImZyMzAiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDQsCQkJCS8qIHNlY3Rpb24gYWxpZ24gcG93ZXIgKi8KLSAgdHJ1ZSwJCQkJLyogdGhlIGRlZmF1bHQgPyAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAkvKiBhcmNoaXRlY3R1cmUgY29tcGFyaXNvbiBmbiAqLwotICBiZmRfZGVmYXVsdF9zY2FuLAkJLyogc3RyaW5nIHRvIGFyY2hpdGVjdHVyZSBjb252ZXJ0IGZuICovCi0gIE5VTEwJCQkJLyogbmV4dCBpbiBsaXN0ICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1oODMwMC5jIGIvYmZkL2NwdS1oODMwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjdiN2RmLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtaDgzMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgSGl0YWNoaSBIOC8zMDAgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoICgpOwotCi1zdGF0aWMgYm9vbGVhbgotaDgzMDBfc2NhbiAoaW5mbywgc3RyaW5nKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBpZiAoKnN0cmluZyAhPSAnaCcgJiYgKnN0cmluZyAhPSAnSCcpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN0cmluZysrOwotICBpZiAoKnN0cmluZyAhPSAnOCcpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN0cmluZysrOwotICBpZiAoKnN0cmluZyA9PSAnLycpCi0gICAgc3RyaW5nKys7Ci0KLSAgaWYgKCpzdHJpbmcgIT0gJzMnKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nICE9ICcwJykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0cmluZysrOwotICBpZiAoKnN0cmluZyAhPSAnMCcpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJpbmcrKzsKLSAgaWYgKCpzdHJpbmcgPT0gJy0nKQotICAgIHN0cmluZysrOwotICBpZiAoKnN0cmluZyA9PSAnaCcgfHwgKnN0cmluZyA9PSAnSCcpCi0gICAgewotICAgICAgcmV0dXJuIChpbmZvLT5tYWNoID09IGJmZF9tYWNoX2g4MzAwaCk7Ci0gICAgfQotICBlbHNlIGlmICgqc3RyaW5nID09ICdzJyB8fCAqc3RyaW5nID09ICdTJykKLSAgICB7Ci0gICAgICByZXR1cm4gKGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaDgzMDBzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9oODMwMDsKLSAgICB9Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCB3b3JrcyBvdXQgdGhlIAotICAgbWFjaGluZSB3aGljaCB3b3VsZCBiZSBjb21wYXRpYmxlIHdpdGggYm90aCBhbmQgcmV0dXJucyBhIHBvaW50ZXIKLSAgIHRvIGl0cyBpbmZvIHN0cnVjdHVyZSAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWNvbXBhdGlibGUgKGluLCBvdXQpCi0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGluOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBvdXQ7Ci17Ci0gIC8qIEl0J3MgcmVhbGx5IG5vdCBhIGdvb2QgaWRlYSB0byBtaXggYW5kIG1hdGNoIG1vZGVzLiAgKi8KLSAgaWYgKGluLT5tYWNoICE9IG91dC0+bWFjaCkKLSAgICByZXR1cm4gMDsKLSAgZWxzZQotICAgIHJldHVybiBpbjsKLX0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBoODMwMF9pbmZvX3N0cnVjdCA9Ci17Ci0gIDE2LAkJCQkvKiAxNiBiaXRzIGluIGEgd29yZCAqLwotICAxNiwJCQkJLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaDgzMDAsCi0gIGJmZF9tYWNoX2g4MzAwLAotICAiaDgzMDAiLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgImg4MzAwIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGNvbXBhdGlibGUsCi0gIGg4MzAwX3NjYW4sCi0vKiAgICBsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXAsICovCi0gIDAsCi19OwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGg4MzAwaF9pbmZvX3N0cnVjdCA9Ci17Ci0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaDgzMDAsCi0gIGJmZF9tYWNoX2g4MzAwaCwKLSAgImg4MzAwaCIsCQkJLyogYXJjaF9uYW1lICAqLwotICAiaDgzMDBoIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICBmYWxzZSwJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGNvbXBhdGlibGUsCi0gIGg4MzAwX3NjYW4sCi0vKiAgICBsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXAsICovCi0gICZoODMwMF9pbmZvX3N0cnVjdCwKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaDgzMDBfYXJjaCA9Ci17Ci0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaDgzMDAsCi0gIGJmZF9tYWNoX2g4MzAwcywKLSAgImg4MzAwcyIsCQkJLyogYXJjaF9uYW1lICAqLwotICAiaDgzMDBzIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICBmYWxzZSwJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGNvbXBhdGlibGUsCi0gIGg4MzAwX3NjYW4sCi0vKiAgICBsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXAsICovCi0gICZoODMwMGhfaW5mb19zdHJ1Y3QsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1oODUwMC5jIGIvYmZkL2NwdS1oODUwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGFiZmQxLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtaDg1MDAuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgSDgvNTAwIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZiAwCi0KLS8qIAotUmVsb2NhdGlvbnMgZm9yIHRoZSBaOEsKLQotKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCi1ob3d0bzE2X2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgIGlnbm9yZV9pbnB1dF9zZWN0aW9uLCBpZ25vcmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaWdub3JlX2lucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqaWdub3JlX2JmZDsKLXsKLSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgeCA9IGJmZF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZGF0YSArIGFkZHIpOwotCi0gIEhPV1RPX1BSRVBBUkUocmVsb2NhdGlvbiwgc3ltYm9sX2luKTsKLQotICB4ID0gKHggKyByZWxvY2F0aW9uICsgcmVsb2NfZW50cnktPmFkZGVuZCk7Ci0KLSAgYmZkX3B1dF8xNihhYmZkLCB4LCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLWhvd3RvOF9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJIGlnbm9yZV9pbnB1dF9zZWN0aW9uLCBpZ25vcmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaWdub3JlX2lucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqaWdub3JlX2JmZDsKLXsKLSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgeCA9IGJmZF9nZXRfOChhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0KLSAgSE9XVE9fUFJFUEFSRShyZWxvY2F0aW9uLCBzeW1ib2xfaW4pOwotCi0gIHggPSAoeCArIHJlbG9jYXRpb24gKyByZWxvY19lbnRyeS0+YWRkZW5kKTsKLQotICBiZmRfcHV0XzgoYWJmZCwgeCwgKGJmZF9ieXRlICopZGF0YSArIGFkZHIpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCi1ob3d0bzhfRkZubl9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICAgICAgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotICBsb25nIHggPSBiZmRfZ2V0XzgoYWJmZCwgKGJmZF9ieXRlICopZGF0YSArIGFkZHIpOwotICBhYm9ydCgpOwotICBIT1dUT19QUkVQQVJFKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfOChhYmZkLCB4LCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCi1ob3d0bzhfcGNyZWxfY2FsbGJhY2sgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsCi0JCSAgICAgICBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHggPSBiZmRfZ2V0XzgoYWJmZCwgKGJmZF9ieXRlICopZGF0YSArIGFkZHIpOwotICBhYm9ydCgpOwotICBIT1dUT19QUkVQQVJFKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfOChhYmZkLCB4LCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b18xNgotICA9IE5FV0hPV1RPKGhvd3RvMTZfY2FsbGJhY2ssImFiczE2IiwxLGZhbHNlLGZhbHNlKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzgKLSAgPSBORVdIT1dUTyhob3d0bzhfY2FsbGJhY2ssImFiczgiLDAsZmFsc2UsZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b184X0ZGbm4KLSAgPSBORVdIT1dUTyhob3d0bzhfRkZubl9jYWxsYmFjaywiZmYwMCthYnM4IiwwLGZhbHNlLGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fOF9wY3JlbAotICA9IE5FV0hPV1RPKGhvd3RvOF9wY3JlbF9jYWxsYmFjaywicGNyZWw4IiwwLGZhbHNlLHRydWUpOwotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYXJjaCwgY29kZSkKLSAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmFyY2g7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpIHsKLSAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgcmV0dXJuICZob3d0b18xNjsKLSAgY2FzZSBCRkRfUkVMT0NfOF9GRm5uOgotICAgIHJldHVybiAmaG93dG9fOF9GRm5uOwotICBjYXNlIEJGRF9SRUxPQ184OgotICAgIHJldHVybiAmaG93dG9fODsKLSAgY2FzZSBCRkRfUkVMT0NfOF9QQ1JFTDoKLSAgICByZXR1cm4gJmhvd3RvXzhfcGNyZWw7Ci0gIH0KLSAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopTlVMTDsKLX0KLSNlbmRpZgotCi1pbnQgYmZkX2RlZmF1bHRfc2Nhbl9udW1fbWFjaCgpOwotCi1zdGF0aWMgYm9vbGVhbiAKLXNjYW5fbWFjaCAoaW5mbywgc3RyaW5nKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBpZiAoc3RyY21wKHN0cmluZywiaDgvNTAwIikgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIGlmIChzdHJjbXAoc3RyaW5nLCJIOC81MDAiKSA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgaWYgKHN0cmNtcChzdHJpbmcsImg4NTAwIikgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIGlmIChzdHJjbXAoc3RyaW5nLCJIODUwMCIpID09IDApIHJldHVybiB0cnVlOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotI2lmIDAgLyogbm90IHVzZWQgY3VycmVudGx5ICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgdHdvIGFyY2hfaW5mb3MgYW5kIHJldHVybnMgd2hldGhlcgotICAgdGhleSdkIGJlIGNvbXBhdGlibGUgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1jb21wYXRpYmxlIChhLGIpCi0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYTsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiOwotewotICBpZiAoYS0+YXJjaCAhPSBiLT5hcmNoIHx8IGEtPm1hY2ggIT0gYi0+bWFjaCkKLSAgIHJldHVybiBOVUxMOwotICByZXR1cm4gYTsKLX0KLSNlbmRpZgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2g4NTAwX2FyY2ggPQotewotICAxNiwJCQkJLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgMjQsCQkJCS8qIDI0IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2g4NTAwLAotICAwLAkJCQkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAiaDg1MDAiLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgImg4NTAwIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gIHNjYW5fbWFjaCwKLSAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWhwcGEuYyBiL2JmZC9jcHUtaHBwYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDI2YTkyLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtaHBwYS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBIUCBQcmVjaXNpb24gQXJjaGl0ZWN0dXJlIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaHBwYTEwX2FyY2ggPQotewotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2hwcGEsCi0gIDEwLAkJCQkvKiBCeSBjb252ZW50aW9uIFBBMS4wID0gMTAgKi8KLSAgImhwcGEiLAotICAiaHBwYTEuMCIsCi0gIDMsCi0gIHRydWUsCQkJCS8qIFVubGVzcyB3ZSB1c2UgMS4xIHNwZWNpZmljIGZlYXR1cmVzICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgMCwKLX07Ci0KLS8qIFBBMi4wIGluIG5hcnJvdyBtb2RlICovCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9ocHBhMjBfYXJjaCA9Ci17Ci0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaHBwYSwKLSAgMjAsCQkJCS8qIEJ5IGNvbnZlbnRpb24gUEExLjAgPSAxMCAqLwotICAiaHBwYSIsCi0gICJocHBhMi4wIiwKLSAgMywKLSAgZmFsc2UsCQkJLyogVW5sZXNzIHdlIHVzZSAxLjEgc3BlY2lmaWMgZmVhdHVyZXMgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAmYmZkX2hwcGExMF9hcmNoLAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9ocHBhX2FyY2ggPQotewotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2hwcGEsCi0gIDExLAkJCQkvKiBCeSBjb252ZW50aW9uIFBBMS4xID0gMTEgKi8KLSAgImhwcGEiLAotICAiaHBwYTEuMSIsCi0gIDMsCi0gIGZhbHNlLAkJCS8qIDEuMSBzcGVjaWZpYyBmZWF0dXJlcyB1c2VkICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgJmJmZF9ocHBhMjBfYXJjaCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWkzODYuYyBiL2JmZC9jcHUtaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWI5YjE4Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBJbnRlbCAzODYgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IDE5OTIsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaTM4Nl9hcmNoX2ludGVsX3N5bnRheCA9Ci17Ci0gIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaTM4NiwKLSAgYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCwKLSAgImkzODY6aW50ZWwiLAotICAiaTM4NjppbnRlbCIsCi0gIDMsCi0gIHRydWUsCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgMCwKLX07Ci1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGk4MDg2X2FyY2ggPQotewotICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAod2VsbCwgbm90IHJlYWxseSkgKi8KLSAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9pMzg2LAotICBiZmRfbWFjaF9pMzg2X2k4MDg2LAotICAiaTgwODYiLAotICAiaTgwODYiLAotICAzLAotICBmYWxzZSwKLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAmYmZkX2kzODZfYXJjaF9pbnRlbF9zeW50YXgsCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2kzODZfYXJjaCA9Ci17Ci0gIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaTM4NiwKLSAgYmZkX21hY2hfaTM4Nl9pMzg2LAotICAiaTM4NiIsCi0gICJpMzg2IiwKLSAgMywKLSAgdHJ1ZSwKLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAmaTgwODZfYXJjaCwKLX07Ci0KZGlmZiAtLWdpdCBhL2JmZC9jcHUtaTg2MC5jIGIvYmZkL2NwdS1pODYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Yzg2N2MuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1pODYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEludGVsIDg2MCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgMTk5MiwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENyZWF0ZWQgbW9zdGx5IGJ5IHN1YnN0aXR1dGluZyAiODYwIiBmb3IgIjM4NiIgaW4gY3B1LWkzODYuYwotICAgSGFycnkgRG9sYW4gPGRvbGFuQHNzZC5pbnRlbC5jb20+LCBPY3RvYmVyIDE5OTUKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaTg2MF9hcmNoID0KLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfaTg2MCwKLSAgICAwLAkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJpODYwIiwKLSAgICAiaTg2MCIsCi0gICAgMywKLSAgICB0cnVlLCAvKiB0aGUgb25lIGFuZCBvbmx5ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICAgMCwKLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtaTk2MC5jIGIvYmZkL2NwdS1pOTYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYjJjN2UuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1pOTYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGk5NjAgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLQotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIGEgc3RyaW5nLCBhbmQgdHJpZXMgdG8gd29yayBvdXQgaWYgaXQKLSAgIGNvdWxkIHBvc3NpYmx5IHJlZmVyIHRvIHRoZSBpOTYwIG1hY2hpbmUgcG9pbnRlZCBhdCBpbiB0aGUKLSAgIGluZm9fc3RydWN0IHBvaW50ZXIgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNjYW5fOTYwX21hY2ggKGFwLCBzdHJpbmcpCi0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXA7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotCi0gIC8qIExvb2sgZm9yIHRoZSBzdHJpbmcgaTk2MCwgb3Igc29tZXN1Y2ggYXQgdGhlIGZyb250IG9mIHRoZSBzdHJpbmcgICovCi0KLSAgaWYgKHN0cm5jbXAoImk5NjAiLHN0cmluZyw0KSA9PSAwKSB7Ci0gICAgc3RyaW5nKz00OwotICB9Ci0gIGVsc2UgewotICAgIC8qIG5vIG1hdGNoLCBjYW4gYmUgdXMgKi8KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKHN0cmluZ1swXSA9PSAwKSB7Ci0gICAgLyogaTk2MCBvbiBpdCdzIG93biBtZWFucyBjb3JlIHRvIHVzKi8KLSAgICBpZiAoYXAtPm1hY2ggPT0gYmZkX21hY2hfaTk2MF9jb3JlKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoc3RyaW5nWzBdICE9ICc6JykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzdHJpbmcrKzsKLSAgaWYgKHN0cmluZ1swXSA9PSAnXDAnKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHN0cmluZ1swXSA9PSAnYycgJiYgc3RyaW5nWzFdID09ICdvJyAmJiBzdHJpbmdbMl0gPT0gJ3InICYmCi0gICAgICBzdHJpbmdbM10gPT0gJ2UnICYmIHN0cmluZ1s0XSA9PSAnXDAnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2NvcmU7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc3RyaW5nLCAia2Ffc2EiKSA9PSAwKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2thX3NhOwotICBlbHNlIGlmIChzdHJjbXAgKHN0cmluZywgImtiX3NiIikgPT0gMCkKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYl9zYjsKLSAgZWxzZSBpZiAoc3RyaW5nWzFdID09ICdcMCcgfHwgc3RyaW5nWzJdICE9ICdcMCcpIC8qIHJlc3QgYXJlIDItY2hhciAqLwotICAgIHJldHVybiBmYWxzZTsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdrJyAmJiBzdHJpbmdbMV0gPT0gJ2InKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2tiX3NiOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ3MnICYmIHN0cmluZ1sxXSA9PSAnYicpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Jfc2I7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnbScgJiYgc3RyaW5nWzFdID09ICdjJykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9tYzsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICd4JyAmJiBzdHJpbmdbMV0gPT0gJ2EnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX3hhOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ2MnICYmIHN0cmluZ1sxXSA9PSAnYScpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY2E7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnaycgJiYgc3RyaW5nWzFdID09ICdhJykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYV9zYTsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdzJyAmJiBzdHJpbmdbMV0gPT0gJ2EnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2thX3NhOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ2onICYmIHN0cmluZ1sxXSA9PSAneCcpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfang7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnaCcgJiYgc3RyaW5nWzFdID09ICd4JykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9oeDsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG1hY2hpbmUgPT0gYXAtPm1hY2gpICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0KLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgd29ya3Mgb3V0IHRoZSBpOTYwCi0gICBtYWNoaW5lIHdoaWNoIHdvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCBib3RoIGFuZCByZXR1cm5zIGEgcG9pbnRlcgotICAgdG8gaXRzIGluZm8gc3RydWN0dXJlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLQotICAvKiBUaGUgaTk2MCBoYXMgZGlzdGluY3Qgc3Vic3BlY2llcyB3aGljaCBtYXkgbm90IGludGVyYnJlZWQ6Ci0JQ09SRSBDQSAgICAgICAgICAKLQlDT1JFIEtBIEtCIE1DIFhBCi0JQ09SRSBIWCBKWAotICAgICBBbnkgYXJjaGl0ZWN0dXJlIG9uIHRoZSBzYW1lIGxpbmUgaXMgY29tcGF0aWJsZSwgdGhlIG9uZSBvbgotICAgICB0aGUgcmlnaHQgaXMgdGhlIGxlYXN0IHJlc3RyaWN0aXZlLiAgCi0gICAgIAotICAgICBXZSByZXByZXNlbnQgdGhpcyBpbmZvcm1hdGlvbiBpbiBhbiBhcnJheSwgZWFjaCBtYWNoaW5lIHRvIGEgc2lkZSAqLwotCi0jZGVmaW5lIEVSUk9SCTAKLSNkZWZpbmUgQ09SRQliZmRfbWFjaF9pOTYwX2NvcmUgIC8qMSovICAKLSNkZWZpbmUgS0EgCWJmZF9tYWNoX2k5NjBfa2Ffc2EgLyoyKi8gCi0jZGVmaW5lIEtCIAliZmRfbWFjaF9pOTYwX2tiX3NiIC8qMyovCi0jZGVmaW5lIE1DIAliZmRfbWFjaF9pOTYwX21jICAgIC8qNCovCi0jZGVmaW5lIFhBIAliZmRfbWFjaF9pOTYwX3hhICAgIC8qNSovCi0jZGVmaW5lIENBIAliZmRfbWFjaF9pOTYwX2NhICAgIC8qNiovCi0jZGVmaW5lIEpYCWJmZF9tYWNoX2k5NjBfanggICAgLyo3Ki8KLSNkZWZpbmUgSFgJYmZkX21hY2hfaTk2MF9oeCAgICAvKjgqLwotI2RlZmluZSBNQVhfQVJDSCAoKGludClIWCkKLQotICBzdGF0aWMgQ09OU1QgdW5zaWduZWQgbG9uZyBtYXRyaXhbTUFYX0FSQ0grMV1bTUFYX0FSQ0grMV0gPSAKLSAgICB7Ci0gICAgICB7IEVSUk9SLAlDT1JFLAlLQSwJS0IsCU1DLAlYQSwJQ0EsCUpYLAlIWCB9LAotICAgICAgeyBDT1JFLAlDT1JFLAlLQSwJS0IsCU1DLAlYQSwJQ0EsCUpYLAlIWCB9LAotICAgICAgeyBLQSwJS0EsCUtBLAlLQiwJTUMsCVhBLAlFUlJPUiwJRVJST1IsCUVSUk9SfSwKLSAgICAgIHsgS0IsCUtCLAlLQiwJS0IsCU1DLAlYQSwJRVJST1IsIAlFUlJPUiwJRVJST1J9LAotICAgICAgeyBNQywJTUMsCU1DLAlNQywJTUMsCVhBLAlFUlJPUiwJRVJST1IsCUVSUk9SfSwKLSAgICAgIHsgWEEsCVhBLAlYQSwJWEEsCVhBLAlYQSwJRVJST1IsCUVSUk9SLAlFUlJPUn0sCi0gICAgICB7IENBLAlDQSwJRVJST1IsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUNBLAlFUlJPUiwJRVJST1J9LAotICAgICAgeyBKWCwJSlgsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUVSUk9SLAlFUlJPUiwgIEpYLAlIWCB9LAotICAgICAgeyBIWCwJSFgsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUVSUk9SLAlFUlJPUiwJSFgsCUhYIH0sCi0gICAgfTsKLQotCi0gIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgbWF0cml4W2EtPm1hY2hdW2ItPm1hY2hdID09IEVSUk9SKSAKLSAgICB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICByZXR1cm4gKGEtPm1hY2ggID09ICBtYXRyaXhbYS0+bWFjaF1bYi0+bWFjaF0pID8gIGEgOiBiOwotICAgIH0KLX0KLQotCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoKCk7Ci0jZGVmaW5lIE4oYSxiLGQsbikgXAoteyAzMiwgMzIsIDgsYmZkX2FyY2hfaTk2MCxhLCJpOTYwIixiLDMsZCxjb21wYXRpYmxlLHNjYW5fOTYwX21hY2gsbix9Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0gCi17IAotICBOKGJmZF9tYWNoX2k5NjBfa2Ffc2EsImk5NjA6a2Ffc2EiLGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFsxXSksCi0gIE4oYmZkX21hY2hfaTk2MF9rYl9zYiwiaTk2MDprYl9zYiIsZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzJdKSwKLSAgTihiZmRfbWFjaF9pOTYwX21jLCAgICJpOTYwOm1jIiwgICBmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbM10pLAotICBOKGJmZF9tYWNoX2k5NjBfeGEsICAgImk5NjA6eGEiLCAgIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs0XSksCi0gIE4oYmZkX21hY2hfaTk2MF9jYSwgICAiaTk2MDpjYSIsICAgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzVdKSwKLSAgTihiZmRfbWFjaF9pOTYwX2p4LCAgICJpOTYwOmp4IiwgICBmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbNl0pLAotICBOKGJmZF9tYWNoX2k5NjBfaHgsCSJpOTYwOmh4IiwgICBmYWxzZSwgMCksCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k5NjBfYXJjaCA9Ci0gIE4oYmZkX21hY2hfaTk2MF9jb3JlLCAiaTk2MDpjb3JlIiwgdHJ1ZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMF0pOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tMTAyMDAuYyBiL2JmZC9jcHUtbTEwMjAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOGE2NzguLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1tMTAyMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgTWF0c3VzaGl0YSAxMDIwMCBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tbjEwMjAwX2FyY2ggPQotICB7Ci0gICAgMTYsIC8qIDE2IGJpdHMgaW4gYSB3b3JkICovCi0gICAgMjQsIC8qIDE2IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsICAvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfbW4xMDIwMCwKLSAgICAyMDAsCi0gICAgIm1uMTAyMDAiLAotICAgICJtbjEwMjAwIiwKLSAgICAyLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4gLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LW0xMDMwMC5jIGIvYmZkL2NwdS1tMTAzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFhMGJmZS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW0xMDMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBNYXRzdXNoaXRhIDEwMzAwIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIE5FWFQgTlVMTAotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAzMDBfYXJjaCA9Ci0gIHsKLSAgICAzMiwgLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwgLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwgIC8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9tbjEwMzAwLAotICAgIDMwMCwKLSAgICAibW4xMDMwMCIsCi0gICAgIm1uMTAzMDAiLAotICAgIDIsCi0gICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gICAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICAgTkVYVCwKLSAgfTsKLQpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tMzJyLmMgYi9iZmQvY3B1LW0zMnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzY2MzMS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW0zMnIuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgTTMyUiBwcm9jZXNzb3IuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIE4obnVtYmVyLCBwcmludCwgZGVmYXVsdCwgbmV4dCkgIFwKLXsgIDMyLCAzMiwgOCwgYmZkX2FyY2hfbTMyciwgbnVtYmVyLCAibTMyciIsIHByaW50LCA0LCBkZWZhdWx0LCBcCi0gICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIGJmZF9kZWZhdWx0X3NjYW4sIG5leHQgfQotCi0jZGVmaW5lIE5FWFQgTlVMTAotCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbTMycl9hcmNoID0KLSAgTiAoYmZkX21hY2hfbTMyciwgIm0zMnIiLCB0cnVlLCBORVhUKTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtbTY4ay5jIGIvYmZkL2NwdS1tNjhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NDE4MmQuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1tNjhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciBhcmNoaXRlY3R1cmVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgTihuYW1lLCBwcmludCxkLG5leHQpICBcCi17ICAzMiwgMzIsIDgsIGJmZF9hcmNoX202OGssIG5hbWUsICJtNjhrIixwcmludCwyLGQsYmZkX2RlZmF1bHRfY29tcGF0aWJsZSxiZmRfZGVmYXVsdF9zY2FuLCBuZXh0LCB9Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0KLXsgCi0gIE4oYmZkX21hY2hfbTY4MDAwLCAibTY4azo2ODAwMCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFsxXSksCi0gIE4oYmZkX21hY2hfbTY4MDA4LCAibTY4azo2ODAwOCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFsyXSksCi0gIE4oYmZkX21hY2hfbTY4MDEwLCAibTY4azo2ODAxMCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFszXSksCi0gIE4oYmZkX21hY2hfbTY4MDIwLCAibTY4azo2ODAyMCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs0XSksCi0gIE4oYmZkX21hY2hfbTY4MDMwLCAibTY4azo2ODAzMCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs1XSksCi0gIE4oYmZkX21hY2hfbTY4MDQwLCAibTY4azo2ODA0MCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs2XSksCi0gIE4oYmZkX21hY2hfY3B1MzIsICAibTY4azpjcHUzMiIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs3XSksCi0gIE4oYmZkX21hY2hfbTY4MDYwLCAibTY4azo2ODA2MCIsIGZhbHNlLCAwKSwKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbTY4a19hcmNoID0KLSAgTigwLCAibTY4ayIsIHRydWUsICZhcmNoX2luZm9fc3RydWN0WzBdKTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtbTg4ay5jIGIvYmZkL2NwdS1tODhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNzE2YzUuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1tODhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBiZmQgYmFjay1lbmQgZm9yIG04OGsgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLQotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX204OGtfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX204OGssCi0gICAgODgxMDAsCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICAgIm04OGsiLAotICAgICJtODhrOjg4MTAwIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tY29yZS5jIGIvYmZkL2NwdS1tY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGJmZTFiLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtbWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIE1vdG9yb2xsYSdzIE1Db3JlIGFyY2hpdGVjdHVyZQotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbWNvcmVfYXJjaCA9Ci17Ci0gIDMyLAkJICAJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJICAJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJICAJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfbWNvcmUsIAkJLyogQXJjaGl0ZWN0dXJlICovCi0gIDAsCQkgIAkJLyogTWFjaGluZSBudW1iZXIgLSAwIGZvciBub3cgKi8KLSAgIk1Db3JlIiwJICAJCS8qIEFyY2hpdGVjdHVyZSBuYW1lICovCi0gICJNQ29yZSIsCSAgCQkvKiBQcmludGFibGUgbmFtZSAqLwotICAzLAkJICAJCS8qIFNlY3Rpb24gYWxpZ24gcG93ZXIgKi8KLSAgdHJ1ZSwJCSAgCQkvKiBJcyB0aGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSA/ICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCS8qIEFyY2hpdGVjdHVyZSBjb21wYXJpc29uIGZ1bmN0aW9uICovCi0gIGJmZF9kZWZhdWx0X3NjYW4sCSAgIAkvKiBTdHJpbmcgdG8gYXJjaGl0ZWN0dXJlIGNvbnZlcnNpb24gKi8KLSAgTlVMTAkJCSAgIAkvKiBOZXh0IGluIGxpc3QgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LW1pcHMuYyBiL2JmZC9jcHUtbWlwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTMzYjhjLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtbWlwcy5jCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyogYmZkIGJhY2stZW5kIGZvciBtaXBzIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEtOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBOKEJJVFNfV09SRCwgQklUU19BRERSLCBOVU1CRVIsIFBSSU5ULCBERUZBVUxULCBORVhUKQkJXAotICB7CQkJCQkJCVwKLSAgICBCSVRTX1dPUkQsIC8qICBiaXRzIGluIGEgd29yZCAqLwkJCVwKLSAgICBCSVRTX0FERFIsIC8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwkJCVwKLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQkJCVwKLSAgICBiZmRfYXJjaF9taXBzLAkJCQkJXAotICAgIE5VTUJFUiwJCQkJCQlcCi0gICAgIm1pcHMiLAkJCQkJCVwKLSAgICBQUklOVCwJCQkJCQlcCi0gICAgMywJCQkJCQkJXAotICAgIERFRkFVTFQsCQkJCQkJXAotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAkJCQlcCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwJCQkJCVwKLSAgICBORVhULAkJCQkJCVwKLSAgfQotCi1lbnVtIHsKLUlfbWlwczMwMDAsIAotSV9taXBzMzkwMCwgCi1JX21pcHM0MDAwLCAKLUlfbWlwczQwMTAsIAotSV9taXBzNDEwMCwgCi1JX21pcHM0MTExLAotSV9taXBzNDMwMCwgCi1JX21pcHM0NDAwLCAKLUlfbWlwczQ2MDAsIAotSV9taXBzNDY1MCwgCi1JX21pcHM1MDAwLCAKLUlfbWlwczYwMDAsIAotSV9taXBzODAwMCwgCi1JX21pcHMxMDAwMCwKLUlfbWlwczE2Ci19OwotCi0KLSNkZWZpbmUgTk4oaW5kZXgpICgmYXJjaF9pbmZvX3N0cnVjdFsoaW5kZXgpKzFdKQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9IAotewotICBOICgzMiwgMzIsIGJmZF9tYWNoX21pcHMzMDAwLCAibWlwczozMDAwIiwgZmFsc2UsIE5OKElfbWlwczMwMDApKSwKLSAgTiAoMzIsIDMyLCBiZmRfbWFjaF9taXBzMzkwMCwgIm1pcHM6MzkwMCIsIGZhbHNlLCBOTihJX21pcHMzOTAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQwMDAsICJtaXBzOjQwMDAiLCBmYWxzZSwgTk4oSV9taXBzNDAwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0MDEwLCAibWlwczo0MDEwIiwgZmFsc2UsIE5OKElfbWlwczQwMTApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDEwMCwgIm1pcHM6NDEwMCIsIGZhbHNlLCBOTihJX21pcHM0MTAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQxMTEsICJtaXBzOjQxMTEiLCBmYWxzZSwgTk4oSV9taXBzNDExMSkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0MzAwLCAibWlwczo0MzAwIiwgZmFsc2UsIE5OKElfbWlwczQzMDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDQwMCwgIm1pcHM6NDQwMCIsIGZhbHNlLCBOTihJX21pcHM0NDAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQ2MDAsICJtaXBzOjQ2MDAiLCBmYWxzZSwgTk4oSV9taXBzNDYwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0NjUwLCAibWlwczo0NjUwIiwgZmFsc2UsIE5OKElfbWlwczQ2NTApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNTAwMCwgIm1pcHM6NTAwMCIsIGZhbHNlLCBOTihJX21pcHM1MDAwKSksCi0gIE4gKDMyLCAzMiwgYmZkX21hY2hfbWlwczYwMDAsICJtaXBzOjYwMDAiLCBmYWxzZSwgTk4oSV9taXBzNjAwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM4MDAwLCAibWlwczo4MDAwIiwgZmFsc2UsIE5OKElfbWlwczgwMDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzMTAwMDAsICJtaXBzOjEwMDAwIiwgZmFsc2UsIE5OKElfbWlwczEwMDAwKSksCi0KLQotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHMxNiwgICAibWlwczoxNiIsICAgZmFsc2UsIDApLAotfTsKLQotLyogVGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIGlzIG1pcHM6MzAwMCwgYnV0IHdpdGggYSBtYWNoaW5lIG51bWJlciBvZgotICAgemVyby4gIFRoaXMgbGV0cyB0aGUgbGlua2VyIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBkZWZhdWx0IHNldHRpbmcKLSAgIG9mIG1pcHMsIGFuZCBhbiBleHBsaWNpdCBzZXR0aW5nIG9mIG1pcHM6MzAwMC4gICovCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbWlwc19hcmNoID0KLU4gKDMyLCAzMiwgMCwgIm1pcHMiLCB0cnVlLCAmYXJjaF9pbmZvX3N0cnVjdFswXSk7CmRpZmYgLS1naXQgYS9iZmQvY3B1LW5zMzJrLmMgYi9iZmQvY3B1LW5zMzJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMGExOGQuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1uczMyay5jCisrKyAvZGV2L251bGwKQEAgLTEsODQ2ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgbnMzMmsgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEFsbW9zdCB0b3RhbGx5IHJld3JpdHRlbiBieSBJYW4gRGFsbCBmcm9tIGluaXRpYWwgd29yawotICAgYnkgQW5kcmV3IENhZ25leS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibnMzMmsuaCIKLQotI2RlZmluZSBOKG1hY2hpbmUsIHByaW50YWJsZSwgZCwgbmV4dCkgIFwKLXsgIDMyLCAzMiwgOCwgYmZkX2FyY2hfbnMzMmssIG1hY2hpbmUsICJuczMyayIscHJpbnRhYmxlLDMsZCxiZmRfZGVmYXVsdF9jb21wYXRpYmxlLGJmZF9kZWZhdWx0X3NjYW4sIG5leHQsIH0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQoteyAKLSAgTigzMjUzMiwibnMzMms6MzI1MzIiLHRydWUsIDApLCAvKiB0aGUgd29yZCBuczMyayB3aWxsIG1hdGNoIHRoaXMgdG9vICovCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX25zMzJrX2FyY2ggPQotICBOKDMyMDMyLCJuczMyazozMjAzMiIsZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzBdKTsKLQotc3RhdGljIGxvbmcKLW5zMzJrX3NpZ25fZXh0ZW5kKHZhbHVlLCBiaXRzKQotICAgICBpbnQgdmFsdWU7Ci0gICAgIGludCBiaXRzOwotewotICB2YWx1ZSA9IHZhbHVlICYgKCgxIDw8IGJpdHMpIC0gMSk7Ci0gIHJldHVybiAodmFsdWUgJiAoMSA8PCAoYml0cy0xKSkKLQkgID8gdmFsdWUgfCAofigoMSA8PCBiaXRzKSAtIDEpKQotCSAgOiB2YWx1ZSk7Ci19Ci0KLWxvbmcKLV9iZmRfbnMzMmtfZ2V0X2Rpc3BsYWNlbWVudChidWZmZXIsIG9mZnNldCwgc2l6ZSkKLSAgICAgYmZkX2J5dGUgKmJ1ZmZlcjsKLSAgICAgbG9uZyBvZmZzZXQ7Ci0gICAgIGxvbmcgc2l6ZTsKLXsKLSAgbG9uZyB2YWx1ZTsKLSAgYnVmZmVyICs9IG9mZnNldDsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICB2YWx1ZSA9IG5zMzJrX3NpZ25fZXh0ZW5kICgqYnVmZmVyLCA3KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHZhbHVlID0gbnMzMmtfc2lnbl9leHRlbmQoKmJ1ZmZlcisrLCA2KTsKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKDB4ZmYgJiAqYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIHZhbHVlID0gbnMzMmtfc2lnbl9leHRlbmQoKmJ1ZmZlcisrLCA2KTsKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKDB4ZmYgJiAqYnVmZmVyKyspOwotICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCAoMHhmZiAmICpidWZmZXIrKyk7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgweGZmICYgKmJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotaW50Ci1fYmZkX25zMzJrX3B1dF9kaXNwbGFjZW1lbnQodmFsdWUsIGJ1ZmZlciwgb2Zmc2V0LCBzaXplKQotICAgICBsb25nIHZhbHVlOwotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgbG9uZyBzaXplOwotewotICBidWZmZXIgKz0gb2Zmc2V0OwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGlmICh2YWx1ZSA8IC02NCB8fCB2YWx1ZSA+IDYzKQotCXJldHVybiAtMTsKLSAgICAgIHZhbHVlJj0weDdmOwotICAgICAgKmJ1ZmZlcisrPXZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaWYgKHZhbHVlIDwgLTgxOTIgfHwgdmFsdWUgPiA4MTkxKQotCXJldHVybiAtMTsKLSAgICAgIHZhbHVlJj0weDNmZmY7Ci0gICAgICB2YWx1ZXw9MHg4MDAwOwotICAgICAgKmJ1ZmZlcisrPSh2YWx1ZT4+OCk7Ci0gICAgICAqYnVmZmVyKys9dmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBpZiAodmFsdWUgPCAtMHgxZjAwMDAwMCB8fCB2YWx1ZSA+PSAweDIwMDAwMDAwKQotCXJldHVybiAtMTsKLSAgICAgIHZhbHVlfD0weGMwMDAwMDAwOwotICAgICAgKmJ1ZmZlcisrPSh2YWx1ZT4+MjQpOwotICAgICAgKmJ1ZmZlcisrPSh2YWx1ZT4+MTYpOwotICAgICAgKmJ1ZmZlcisrPSh2YWx1ZT4+OCk7Ci0gICAgICAqYnVmZmVyKys9dmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1sb25nCi1fYmZkX25zMzJrX2dldF9pbW1lZGlhdGUgKGJ1ZmZlciwgb2Zmc2V0LCBzaXplKQotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgbG9uZyBzaXplOwotewotICBsb25nIHZhbHVlID0gMDsKLSAgYnVmZmVyICs9IG9mZnNldDsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgqYnVmZmVyKysgJiAweGZmKTsKLSAgICBjYXNlIDM6Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgqYnVmZmVyKysgJiAweGZmKTsKLSAgICBjYXNlIDI6Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgqYnVmZmVyKysgJiAweGZmKTsKLSAgICBjYXNlIDE6Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgqYnVmZmVyKysgJiAweGZmKTsKLSAgICB9Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotaW50Ci1fYmZkX25zMzJrX3B1dF9pbW1lZGlhdGUgKHZhbHVlLCBidWZmZXIsIG9mZnNldCwgc2l6ZSkKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgYmZkX2J5dGUgKmJ1ZmZlcjsKLSAgICAgbG9uZyBvZmZzZXQ7Ci0gICAgIGxvbmcgc2l6ZTsKLXsKLSAgYnVmZmVyICs9IG9mZnNldCArIHNpemUgLSAxOwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgICpidWZmZXItLSA9ICh2YWx1ZSAmIDB4ZmYpOyB2YWx1ZSA+Pj0gODsKLSAgICBjYXNlIDM6Ci0gICAgICAqYnVmZmVyLS0gPSAodmFsdWUgJiAweGZmKTsgdmFsdWUgPj49IDg7Ci0gICAgY2FzZSAyOgotICAgICAgKmJ1ZmZlci0tID0gKHZhbHVlICYgMHhmZik7IHZhbHVlID4+PSA4OwotICAgIGNhc2UgMToKLSAgICAgICpidWZmZXItLSA9ICh2YWx1ZSAmIDB4ZmYpOyB2YWx1ZSA+Pj0gODsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBUaGlzIGlzIGp1c3QgbGlrZSB0aGUgc3RhbmRhcmQgcGVyZm9ybV9yZWxvY2F0aW9uIGV4Y2VwdCB3ZQotICogdXNlIGdldF9kYXRhIGFuZCBwdXRfZGF0YSB3aGljaCBrbm93IGFib3V0IHRoZSBuczMyawotICogc3RvcmFnZSBtZXRob2RzLgotICogVGhpcyBpcyBwcm9iYWJseSBhIGxvdCBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gaXQgbmVlZHMgdG8gYmUhCi0gKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWRvX25zMzJrX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQllcnJvcl9tZXNzYWdlLCBnZXRfZGF0YSwgcHV0X2RhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotICAgICBsb25nICgqZ2V0X2RhdGEpKCk7Ci0gICAgIGludCAoKnB1dF9kYXRhKSgpOwotewotICBpbnQgb3ZlcmZsb3cgPSAwOwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgYmZkX3ZtYSBvdXRwdXRfYmFzZSA9IDA7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOwotCi0gIGlmICgoc3ltYm9sLT5zZWN0aW9uID09ICZiZmRfYWJzX3NlY3Rpb24pCi0gICAgICAmJiBvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgcmV0dXJuIGFuIGVycm9yIGlmCi0gICAgIHRoZSBzeW1ib2wgaXMgbm90IGRlZmluZWQuICBBbiB1bmRlZmluZWQgd2VhayBzeW1ib2wgaXMKLSAgICAgY29uc2lkZXJlZCB0byBoYXZlIGEgdmFsdWUgb2YgemVybyAoU1ZSNCBBQkksIHAuIDQtMjcpLiAgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwCi0gICAgICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICBmbGFnID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotCi0gIC8qIElzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uIHJlYWxseSB3aXRoaW4gdGhlIHNlY3Rpb24/ICAqLwotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotCi0gIC8qIEdldCBzeW1ib2wgdmFsdWUuICAoQ29tbW9uIHN5bWJvbHMgYXJlIHNwZWNpYWwuKSAgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0KLSAgcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgJiYgaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZSkKLSAgICBvdXRwdXRfYmFzZSA9IDA7Ci0gIGVsc2UKLSAgICBvdXRwdXRfYmFzZSA9IHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIHJlbG9jYXRpb24gKz0gb3V0cHV0X2Jhc2UgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogQWRkIGluIHN1cHBsaWVkIGFkZGVuZC4gICovCi0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICAvKiBIZXJlIHRoZSB2YXJpYWJsZSByZWxvY2F0aW9uIGhvbGRzIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZQotICAgICBzeW1ib2wgd2UgYXJlIHJlbG9jYXRpbmcgYWdhaW5zdCwgcGx1cyBhbnkgYWRkZW5kLiAgKi8KLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICBXZSB3YW50IHRvIHNldCBSRUxPQ0FUSU9OCi0JIHRvIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgYW5kIHRoZQotCSBsb2NhdGlvbi4gIFJFTE9DQVRJT04gaXMgYWxyZWFkeSB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sLgotCi0JIFdlIHN0YXJ0IGJ5IHN1YnRyYWN0aW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcKLQkgdGhlIGxvY2F0aW9uLgotCi0JIElmIHBjcmVsX29mZnNldCBpcyBzZXQsIHdlIG11c3QgZnVydGhlciBzdWJ0cmFjdCB0aGUgcG9zaXRpb24KLQkgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbi4gIFNvbWUgdGFyZ2V0cyBhcnJhbmdlIGZvcgotCSB0aGUgYWRkZW5kIHRvIGJlIHRoZSBuZWdhdGl2ZSBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGxvY2F0aW9uCi0JIHdpdGhpbiB0aGUgc2VjdGlvbjsgZm9yIGV4YW1wbGUsIGkzODYtYW91dCBkb2VzIHRoaXMuICBGb3IKLQkgaTM4Ni1hb3V0LCBwY3JlbF9vZmZzZXQgaXMgZmFsc2UuICBTb21lIG90aGVyIHRhcmdldHMgZG8gbm90Ci0JIGluY2x1ZGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbjsgZm9yIGV4YW1wbGUsIG04OGtiY3MsCi0JIG9yIEVMRi4gIEZvciB0aG9zZSB0YXJnZXRzLCBwY3JlbF9vZmZzZXQgaXMgdHJ1ZS4KLQotCSBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoZW4gd2UgbXVzdCBlbnN1cmUKLQkgdGhhdCB0aGlzIHJlbG9jIHdpbGwgYmUgY29ycmVjdGx5IGNvbXB1dGVkIHdoZW4gdGhlIGZpbmFsCi0JIHJlbG9jYXRpb24gaXMgZG9uZS4gIElmIHBjcmVsX29mZnNldCBpcyBmYWxzZSB3ZSB3YW50IHRvIHdpbmQKLQkgdXAgd2l0aCB0aGUgbmVnYXRpdmUgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbiwKLQkgd2hpY2ggbWVhbnMgd2UgbXVzdCBhZGp1c3QgdGhlIGV4aXN0aW5nIGFkZGVuZCBieSB0aGUgY2hhbmdlCi0JIGluIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24uICBJZiBwY3JlbF9vZmZzZXQgaXMgdHJ1ZQotCSB3ZSBkbyBub3Qgd2FudCB0byBhZGp1c3QgdGhlIGV4aXN0aW5nIGFkZGVuZCBhdCBhbGwuCi0KLQkgRklYTUU6IFRoaXMgc2VlbXMgbG9naWNhbCB0byBtZSwgYnV0IGZvciB0aGUgY2FzZSBvZgotCSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCBpdCBpcyBub3Qgd2hhdCB0aGUgY29kZQotCSBhY3R1YWxseSBkb2VzLiAgSSBkb24ndCB3YW50IHRvIGNoYW5nZSBpdCwgYmVjYXVzZSBpdCBzZWVtcwotCSBmYXIgdG9vIGxpa2VseSB0aGF0IHNvbWV0aGluZyB3aWxsIGJyZWFrLiAgKi8KLQotICAgICAgcmVsb2NhdGlvbiAtPQotCWlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gICAgICBpZiAoaG93dG8tPnBjcmVsX29mZnNldCA9PSB0cnVlKQotCXJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBhbmQgd2Ugd2FudCB0byBhcHBseSB0aGUgcmVsb2NhdGlvbgotCSAgICAgdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4gTW9kaWZ5IHRoZSByZWxvYwotCSAgICAgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotCSAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgcmV0dXJuIGZsYWc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGJ1dCBpbnBsYWNlLCBzbyBtb2RpZnkgdGhlCi0JICAgICByZWxvYyByZWNvcmQgYSBiaXQuCi0KLQkgICAgIElmIHdlJ3ZlIHJlbG9jYXRlZCB3aXRoIGEgc3ltYm9sIHdpdGggYSBzZWN0aW9uLCBjaGFuZ2UKLQkgICAgIGludG8gYSByZWYgdG8gdGhlIHNlY3Rpb24gYmVsb25naW5nIHRvIHRoZSBzeW1ib2wuICAqLwotCi0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0JICAvKiBXVEY/PyAqLwotCSAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJhaXhjb2ZmLXJzNjAwMCIpICE9IDApCi0JICAgIHsKLSNpZiAxCi0JICAgICAgLyogRm9yIG02OGstY29mZiwgdGhlIGFkZGVuZCB3YXMgYmVpbmcgc3VidHJhY3RlZCB0d2ljZSBkdXJpbmcKLQkJIHJlbG9jYXRpb24gd2l0aCAtci4gIFJlbW92aW5nIHRoZSBsaW5lIGJlbG93IHRoaXMgY29tbWVudAotCQkgZml4ZXMgdGhhdCBwcm9ibGVtOyBzZWUgUFIgMjk1My4KLQotSG93ZXZlciwgSWFuIHdyb3RlIHRoZSBmb2xsb3dpbmcsIHJlZ2FyZGluZyByZW1vdmluZyB0aGUgbGluZSBiZWxvdywKLXdoaWNoIGV4cGxhaW5zIHdoeSBpdCBpcyBzdGlsbCBlbmFibGVkOiAgLS1kam0KLQotSWYgeW91IHB1dCBhIHBhdGNoIGxpa2UgdGhhdCBpbnRvIEJGRCB5b3UgbmVlZCB0byBjaGVjayBhbGwgdGhlIENPRkYKLWxpbmtlcnMuICBJIGFtIGZhaXJseSBjZXJ0YWluIHRoYXQgcGF0Y2ggd2lsbCBicmVhayBjb2ZmLWkzODYgKGUuZy4sCi1TQ08pOyBzZWUgY29mZl9pMzg2X3JlbG9jIGluIGNvZmYtaTM4Ni5jIHdoZXJlIEkgd29ya2VkIGFyb3VuZCB0aGUKLXByb2JsZW0gaW4gYSBkaWZmZXJlbnQgd2F5LiAgVGhlcmUgbWF5IHZlcnkgd2VsbCBiZSBhIHJlYXNvbiB0aGF0IHRoZQotY29kZSB3b3JrcyBhcyBpdCBkb2VzLgotCi1IbW1tLiAgVGhlIGZpcnN0IG9idmlvdXMgcG9pbnQgaXMgdGhhdCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHNob3VsZAotbm90IGhhdmUgYW55IHRlc3RzIHRoYXQgZGVwZW5kIHVwb24gdGhlIGZsYXZvdXIuICBJdCdzIHNlZW0gbGlrZQotZW50aXJlbHkgdGhlIHdyb25nIHBsYWNlIGZvciBzdWNoIGEgdGhpbmcuICBUaGUgc2Vjb25kIG9idmlvdXMgcG9pbnQKLWlzIHRoYXQgdGhlIGN1cnJlbnQgY29kZSBpZ25vcmVzIHRoZSByZWxvYyBhZGRlbmQgd2hlbiBwcm9kdWNpbmcKLXJlbG9jYXRlYWJsZSBvdXRwdXQgZm9yIENPRkYuICBUaGF0J3MgcGVjdWxpYXIuICBJbiBmYWN0LCBJIHJlYWxseQotaGF2ZSBubyBpZGVhIHdoYXQgdGhlIHBvaW50IG9mIHRoZSBsaW5lIHlvdSB3YW50IHRvIHJlbW92ZSBpcy4KLQotQSB0eXBpY2FsIENPRkYgcmVsb2Mgc3VidHJhY3RzIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgYWRkcyBpbgotdGhlIG5ldyB2YWx1ZSB0byB0aGUgbG9jYXRpb24gaW4gdGhlIG9iamVjdCBmaWxlIChpZiBpdCdzIGEgcGMKLXJlbGF0aXZlIHJlbG9jIGl0IGFkZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3ltYm9sIHZhbHVlIGFuZCB0aGUKLWxvY2F0aW9uKS4gIFdoZW4gcmVsb2NhdGluZyB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoYXQgcHJvcGVydHkuCi0KLUJGRCBoYW5kbGVzIHRoaXMgYnkgc2V0dGluZyB0aGUgYWRkZW5kIHRvIHRoZSBuZWdhdGl2ZSBvZiB0aGUgb2xkCi12YWx1ZSBvZiB0aGUgc3ltYm9sLiAgVW5mb3J0dW5hdGVseSBpdCBoYW5kbGVzIGNvbW1vbiBzeW1ib2xzIGluIGEKLW5vbi1zdGFuZGFyZCB3YXkgKGl0IGRvZXNuJ3Qgc3VidHJhY3QgdGhlIG9sZCB2YWx1ZSkgYnV0IHRoYXQncyBhCi1kaWZmZXJlbnQgc3RvcnkgKHdlIGNhbid0IGNoYW5nZSBpdCB3aXRob3V0IGxvc2luZyBiYWNrd2FyZAotY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBvYmplY3QgZmlsZXMpIChjb2ZmLWkzODYgZG9lcyBzdWJ0cmFjdCB0aGUgb2xkCi12YWx1ZSwgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nIGNvZmYtaTM4NiB0YXJnZXRzLCBsaWtlIFNDTykuCi0KLVNvIGV2ZXJ5dGhpbmcgd29ya3MgZmluZSB3aGVuIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFdoZW4KLXdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgbG9naWNhbGx5IHdlIHNob3VsZCBkbyBleGFjdGx5Ci13aGF0IHdlIGRvIHdoZW4gbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgVGhlcmVmb3JlLCB5b3VyCi1wYXRjaCBpcyBjb3JyZWN0LiAgSW4gZmFjdCwgaXQgc2hvdWxkIHByb2JhYmx5IGFsd2F5cyBqdXN0IHNldAotcmVsb2NfZW50cnktPmFkZGVuZCB0byAwIGZvciBhbGwgY2FzZXMsIHNpbmNlIGl0IGlzLCBpbiBmYWN0LCBnb2luZyB0bwotYWRkIHRoZSB2YWx1ZSBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgd29uJ3QgaHVydCB0aGUgQ09GRiBjb2RlLAotd2hpY2ggZG9lc24ndCB1c2UgdGhlIGFkZGVuZDsgSSdtIG5vdCBzdXJlIHdoYXQgaXQgd2lsbCBkbyB0byBvdGhlcgotZm9ybWF0cyAodGhlIHRoaW5nIHRvIGNoZWNrIGZvciB3b3VsZCBiZSB3aGV0aGVyIGFueSBmb3JtYXRzIGJvdGggdXNlCi10aGUgYWRkZW5kIGFuZCBzZXQgcGFydGlhbF9pbnBsYWNlKS4KLQotV2hlbiBJIHdhbnRlZCB0byBtYWtlIGNvZmYtaTM4NiBwcm9kdWNlIHJlbG9jYXRlYWJsZSBvdXRwdXQsIEkgcmFuCi1pbnRvIHRoZSBwcm9ibGVtIHRoYXQgeW91IGFyZSBydW5uaW5nIGludG86IEkgd2FudGVkIHRvIHJlbW92ZSB0aGF0Ci1saW5lLiAgUmF0aGVyIHRoYW4gcmlzayBpdCwgSSBtYWRlIHRoZSBjb2ZmLWkzODYgcmVsb2NzIHVzZSBhIHNwZWNpYWwKLWZ1bmN0aW9uOyBpdCdzIGNvZmZfaTM4Nl9yZWxvYyBpbiBjb2ZmLWkzODYuYy4gIFRoZSBmdW5jdGlvbgotc3BlY2lmaWNhbGx5IGFkZHMgdGhlIGFkZGVuZCBmaWVsZCBpbnRvIHRoZSBvYmplY3QgZmlsZSwga25vd2luZyB0aGF0Ci1iZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGlzIG5vdCBnb2luZyB0by4gIElmIHlvdSByZW1vdmUgdGhhdCBsaW5lLCB0aGVuCi1jb2ZmLWkzODYuYyB3aWxsIHdpbmQgdXAgYWRkaW5nIHRoZSBhZGRlbmQgZmllbGQgaW4gdHdpY2UuICBJdCdzCi10cml2aWFsIHRvIGZpeDsgaXQganVzdCBuZWVkcyB0byBiZSBkb25lLgotCi1UaGUgcHJvYmxlbSB3aXRoIHJlbW92aW5nIHRoZSBsaW5lIGlzIGp1c3QgdGhhdCBpdCBtYXkgYnJlYWsgc29tZQotd29ya2luZyBjb2RlLiAgV2l0aCBCRkQgaXQncyBoYXJkIHRvIGJlIHN1cmUgb2YgYW55dGhpbmcuICBUaGUgcmlnaHQKLXdheSB0byBkZWFsIHdpdGggdGhpcyBpcyBzaW1wbHkgdG8gYnVpbGQgYW5kIHRlc3QgYXQgbGVhc3QgYWxsIHRoZQotc3VwcG9ydGVkIENPRkYgdGFyZ2V0cy4gIEl0IHNob3VsZCBiZSBzdHJhaWdodGZvcndhcmQgaWYgdGltZSBhbmQgZGlzawotc3BhY2UgY29uc3VtaW5nLiAgRm9yIGVhY2ggdGFyZ2V0OgotICAgIDEpIGJ1aWxkIHRoZSBsaW5rZXIKLSAgICAyKSBnZW5lcmF0ZSBzb21lIGV4ZWN1dGFibGUsIGFuZCBsaW5rIGl0IHVzaW5nIC1yIChJIHdvdWxkCi0gICAgICAgcHJvYmFibHkgdXNlIHBhcmFub2lhLm8gYW5kIGxpbmsgYWdhaW5zdCBuZXdsaWIvbGliYy5hLCB3aGljaAotICAgICAgIGZvciBhbGwgdGhlIHN1cHBvcnRlZCB0YXJnZXRzIHdvdWxkIGJlIGF2YWlsYWJsZSBpbgotICAgICAgIC91c3IvY3lnbnVzL3Byb2dyZXNzaXZlL0gtaG9zdC90YXJnZXQvbGliL2xpYmMuYSkuCi0gICAgMykgbWFrZSB0aGUgY2hhbmdlIHRvIHJlbG9jLmMKLSAgICA0KSByZWJ1aWxkIHRoZSBsaW5rZXIKLSAgICA1KSByZXBlYXQgc3RlcCAyCi0gICAgNikgaWYgdGhlIHJlc3VsdGluZyBvYmplY3QgZmlsZXMgYXJlIHRoZSBzYW1lLCB5b3UgaGF2ZSBhdCBsZWFzdAotICAgICAgIG1hZGUgaXQgbm8gd29yc2UKLSAgICA3KSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgeW91IGhhdmUgdG8gZmlndXJlIG91dCB3aGljaCB2ZXJzaW9uIGlzCi0gICAgICAgcmlnaHQKLSovCi0JICAgICAgcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkZW5kOwotI2VuZGlmCi0JICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOwotICAgIH0KLQotICAvKiBGSVhNRTogVGhpcyBvdmVyZmxvdyBjaGVja2luZyBpcyBpbmNvbXBsZXRlLCBiZWNhdXNlIHRoZSB2YWx1ZQotICAgICBtaWdodCBoYXZlIG92ZXJmbG93ZWQgYmVmb3JlIHdlIGdldCBoZXJlLiAgRm9yIGEgY29ycmVjdCBjaGVjayB3ZQotICAgICBuZWVkIHRvIGNvbXB1dGUgdGhlIHZhbHVlIGluIGEgc2l6ZSBsYXJnZXIgdGhhbiBiaXRzaXplLCBidXQgd2UKLSAgICAgY2FuJ3QgcmVhc29uYWJseSBkbyB0aGF0IGZvciBhIHJlbG9jIHRoZSBzYW1lIHNpemUgYXMgYSBob3N0Ci0gICAgIG1hY2hpbmUgd29yZC4KLSAgICAgRklYTUU6IFdlIHNob3VsZCBhbHNvIGRvIG92ZXJmbG93IGNoZWNraW5nIG9uIHRoZSByZXN1bHQgYWZ0ZXIKLSAgICAgYWRkaW5nIGluIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyAhPSBjb21wbGFpbl9vdmVyZmxvd19kb250KQotICAgIHsKLSAgICAgIGJmZF92bWEgY2hlY2s7Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSByZWxvY2F0aW9uLCBidXQKLQkgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHplcm8uICAqLwotICAgICAgaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID4gaG93dG8tPmJpdHBvcykKLQljaGVjayA9IHJlbG9jYXRpb24gPj4gKGhvd3RvLT5yaWdodHNoaWZ0IC0gaG93dG8tPmJpdHBvcyk7Ci0gICAgICBlbHNlCi0JY2hlY2sgPSByZWxvY2F0aW9uIDw8IChob3d0by0+Yml0cG9zIC0gaG93dG8tPnJpZ2h0c2hpZnQpOwotICAgICAgc3dpdGNoIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cpCi0JewotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkOgotCSAgewotCSAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICAqLwotCSAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWF4ID0gKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMTsKLQkgICAgYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21pbiA9IH5yZWxvY19zaWduZWRfbWF4OwotCi0JICAgIC8qIFRoZSBhYm92ZSByaWdodCBzaGlmdCBpcyBpbmNvcnJlY3QgZm9yIGEgc2lnbmVkIHZhbHVlLgotCSAgICAgICBGaXggaXQgdXAgYnkgZm9yY2luZyBvbiB0aGUgdXBwZXIgYml0cy4gICovCi0JICAgIGlmIChob3d0by0+cmlnaHRzaGlmdCA+IGhvd3RvLT5iaXRwb3MKLQkJJiYgKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uIDwgMCkKLQkgICAgICBjaGVjayB8PSAoKGJmZF92bWEpIC0gMQotCQkJJiB+KChiZmRfdm1hKSAtIDEKLQkJCSAgICA+PiAoaG93dG8tPnJpZ2h0c2hpZnQgLSBob3d0by0+Yml0cG9zKSkpOwotCSAgICBpZiAoKGJmZF9zaWduZWRfdm1hKSBjaGVjayA+IHJlbG9jX3NpZ25lZF9tYXgKLQkJfHwgKGJmZF9zaWduZWRfdm1hKSBjaGVjayA8IHJlbG9jX3NpZ25lZF9taW4pCi0JICAgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQ6Ci0JICB7Ci0JICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gIFRoaXMgZXhwcmVzc2lvbiBhdm9pZHMKLQkgICAgICAgb3ZlcmZsb3cgaWYgaG93dG8tPmJpdHNpemUgaXMgdGhlIG51bWJlciBvZiBiaXRzIGluCi0JICAgICAgIGJmZF92bWEuICAqLwotCSAgICBiZmRfdm1hIHJlbG9jX3Vuc2lnbmVkX21heCA9Ci0JICAgICgoKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCi0JICAgIGlmICgoYmZkX3ZtYSkgY2hlY2sgPiByZWxvY191bnNpZ25lZF9tYXgpCi0JICAgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQ6Ci0JICB7Ci0JICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gIFRoaXMgZXhwcmVzc2lvbiBhdm9pZHMKLQkgICAgICAgb3ZlcmZsb3cgaWYgaG93dG8tPmJpdHNpemUgaXMgdGhlIG51bWJlciBvZiBiaXRzIGluCi0JICAgICAgIGJmZF92bWEuICAqLwotCSAgICBiZmRfdm1hIHJlbG9jX2JpdHMgPSAoKCgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotCSAgICBpZiAoKChiZmRfdm1hKSBjaGVjayAmIH5yZWxvY19iaXRzKSAhPSAwCi0JCSYmICgoYmZkX3ZtYSkgY2hlY2sgJiB+cmVsb2NfYml0cykgIT0gKC0xICYgfnJlbG9jX2JpdHMpKQotCSAgICAgIHsKLQkJLyogVGhlIGFib3ZlIHJpZ2h0IHNoaWZ0IGlzIGluY29ycmVjdCBmb3IgYSBzaWduZWQKLQkJICAgdmFsdWUuICBTZWUgaWYgdHVybmluZyBvbiB0aGUgdXBwZXIgYml0cyBmaXhlcyB0aGUKLQkJICAgb3ZlcmZsb3cuICAqLwotCQlpZiAoaG93dG8tPnJpZ2h0c2hpZnQgPiBob3d0by0+Yml0cG9zCi0JCSAgICAmJiAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPCAwKQotCQkgIHsKLQkJICAgIGNoZWNrIHw9ICgoYmZkX3ZtYSkgLSAxCi0JCQkgICAgICAmIH4oKGJmZF92bWEpIC0gMQotCQkJCSAgPj4gKGhvd3RvLT5yaWdodHNoaWZ0IC0gaG93dG8tPmJpdHBvcykpKTsKLQkJICAgIGlmICgoKGJmZF92bWEpIGNoZWNrICYgfnJlbG9jX2JpdHMpICE9ICgtMSAmIH5yZWxvY19iaXRzKSkKLQkJICAgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQkJICB9Ci0JCWVsc2UKLQkJICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAgRWl0aGVyIHdlIGFyZSByZWxvY2F0aW5nIGFsbCB0aGUgd2F5LCBvciB3ZSBkb24ndCB3YW50IHRvIGFwcGx5Ci0gICAgdGhlIHJlbG9jYXRpb24gdG8gdGhlIHJlbG9jIGVudHJ5IChwcm9iYWJseSBiZWNhdXNlIHRoZXJlIGlzbid0Ci0gICAgYW55IHJvb20gaW4gdGhlIG91dHB1dCBmb3JtYXQgdG8gZGVzY3JpYmUgYWRkZW5kcyB0byByZWxvY3MpCi0gICAgKi8KLQotICAvKiBUaGUgY2FzdCB0byBiZmRfdm1hIGF2b2lkcyBhIGJ1ZyBpbiB0aGUgQWxwaGEgT1NGLzEgQyBjb21waWxlcgotICAgICAoT1NGIHZlcnNpb24gMS4zLCBjb21waWxlciB2ZXJzaW9uIDMuMTEpLiAgSXQgbWlzY29tcGlsZXMgdGhlCi0gICAgIGZvbGxvd2luZyBwcm9ncmFtOgotCi0gICAgIHN0cnVjdCBzdHIKLSAgICAgewotICAgICAgIHVuc2lnbmVkIGludCBpMDsKLSAgICAgfSBzID0geyAwIH07Ci0KLSAgICAgaW50Ci0gICAgIG1haW4gKCkKLSAgICAgewotICAgICAgIHVuc2lnbmVkIGxvbmcgeDsKLQotICAgICAgIHggPSAweDEwMDAwMDAwMDsKLSAgICAgICB4IDw8PSAodW5zaWduZWQgbG9uZykgcy5pMDsKLSAgICAgICBpZiAoeCA9PSAwKQotCSBwcmludGYgKCJmYWlsZWRcbiIpOwotICAgICAgIGVsc2UKLQkgcHJpbnRmICgic3VjY2VlZGVkICglbHgpXG4iLCB4KTsKLSAgICAgfQotICAgICAqLwotCi0gIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKLQotICAvKiBTaGlmdCBldmVyeXRoaW5nIHVwIHRvIHdoZXJlIGl0J3MgZ29pbmcgdG8gYmUgdXNlZCAqLwotCi0gIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBob3d0by0+Yml0cG9zOwotCi0gIC8qIFdhaXQgZm9yIHRoZSBkYXkgd2hlbiBhbGwgaGF2ZSB0aGUgbWFzayBpbiB0aGVtICovCi0KLSAgLyogV2hhdCB3ZSBkbzoKLSAgICAgaSBpbnN0cnVjdGlvbiB0byBiZSBsZWZ0IGFsb25lCi0gICAgIG8gb2Zmc2V0IHdpdGhpbiBpbnN0cnVjdGlvbgotICAgICByIHJlbG9jYXRpb24gb2Zmc2V0IHRvIGFwcGx5Ci0gICAgIFMgc3JjIG1hc2sKLSAgICAgRCBkc3QgbWFzawotICAgICBOIH5kc3QgbWFzawotICAgICBBIHBhcnQgMQotICAgICBCIHBhcnQgMgotICAgICBSIHJlc3VsdAotCi0gICAgIERvIHRoaXM6Ci0gICAgIGkgaSBpIGkgaSBvIG8gbyBvIG8gICAgICAgIGZyb20gYmZkX2dldDxzaXplPgotICAgICBhbmQgICAgICAgICAgIFMgUyBTIFMgUyAgICB0byBnZXQgdGhlIHNpemUgb2Zmc2V0IHdlIHdhbnQKLSAgICAgKyAgIHIgciByIHIgciByIHIgciByIHIgIHRvIGdldCB0aGUgZmluYWwgdmFsdWUgdG8gcGxhY2UKLSAgICAgYW5kICAgICAgICAgICBEIEQgRCBEIEQgIHRvIGNob3AgdG8gcmlnaHQgc2l6ZQotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBBIEEgQSBBIEEKLSAgICAgQW5kIHRoaXM6Ci0gICAgIC4uLiAgIGkgaSBpIGkgaSBvIG8gbyBvIG8gIGZyb20gYmZkX2dldDxzaXplPgotICAgICBhbmQgICBOIE4gTiBOIE4gICAgICAgICAgICBnZXQgaW5zdHJ1Y3Rpb24KLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgLi4uICAgQiBCIEIgQiBCCi0KLSAgICAgQW5kIHRoZW46Ci0gICAgIEIgQiBCIEIgQgotICAgICBvciAgICAgICAgICAgICAgQSBBIEEgQSBBCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIFIgUiBSIFIgUiBSIFIgUiBSIFIgICAgICAgIHB1dCBpbnRvIGJmZF9wdXQ8c2l6ZT4KLSAgICAgKi8KLQotI2RlZmluZSBET0lUKHgpIFwKLSAgeCA9ICggKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgIHJlbG9jYXRpb24pICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICBzd2l0Y2ggKGhvd3RvLT5zaXplKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICB7Ci0JY2hhciB4ID0gZ2V0X2RhdGEgKGRhdGEsIGFkZHIsIDEpOwotCURPSVQgKHgpOwotCW92ZXJmbG93ID0gcHV0X2RhdGEoeCwgZGF0YSwgYWRkciwgMSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIGlmIChyZWxvY2F0aW9uKQotCXsKLQkgIHNob3J0IHggPSBnZXRfZGF0YSAoZGF0YSwgYWRkciwgMik7Ci0JICBET0lUICh4KTsKLQkgIG92ZXJmbG93ID0gcHV0X2RhdGEoeCwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YSwgYWRkciwgMik7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaWYgKHJlbG9jYXRpb24pCi0JewotCSAgbG9uZyB4ID0gZ2V0X2RhdGEgKGRhdGEsIGFkZHIsIDQpOwotCSAgRE9JVCAoeCk7Ci0JICBvdmVyZmxvdyA9IHB1dF9kYXRhKHgsIGRhdGEsIGFkZHIsIDQpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgLTI6Ci0gICAgICB7Ci0JbG9uZyAgeCA9IGdldF9kYXRhKGRhdGEsIGFkZHIsIDQpOwotCXJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQlET0lUKHgpOwotCW92ZXJmbG93ID0gcHV0X2RhdGEoeCwgZGF0YSAsIGFkZHIsIDQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICAvKiBEbyBub3RoaW5nICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDoKLSNpZmRlZiBCRkQ2NAotICAgICAgaWYgKHJlbG9jYXRpb24pCi0JewotCSAgYmZkX3ZtYSB4ID0gZ2V0X2RhdGEgKGRhdGEsIGFkZHIsIDgpOwotCSAgRE9JVCAoeCk7Ci0JICBvdmVyZmxvdyA9IHB1dF9kYXRhKHgsIGRhdGEsIGFkZHIsIDgpOwotCX0KLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3RoZXI7Ci0gICAgfQotICBpZiAoKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyAhPSBjb21wbGFpbl9vdmVyZmxvd19kb250KSAmJiBvdmVyZmxvdykKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHJldHVybiBmbGFnOwotfQotCi0vKiBSZWxvY2F0ZSBhIGdpdmVuIGxvY2F0aW9uIHVzaW5nIGEgZ2l2ZW4gdmFsdWUgYW5kIGhvd3RvLiAgKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX2RvX25zMzJrX3JlbG9jX2NvbnRlbnRzICggaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgbG9jYXRpb24sCi0JCQkgICAgICBnZXRfZGF0YSwgcHV0X2RhdGEpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICBiZmRfYnl0ZSAqbG9jYXRpb247Ci0gICAgIGxvbmcgKCpnZXRfZGF0YSkoKTsKLSAgICAgaW50ICgqcHV0X2RhdGEpKCk7Ci17Ci0gIGludCBzaXplOwotICBiZmRfdm1hIHg7Ci0gIGJvb2xlYW4gb3ZlcmZsb3c7Ci0KLSAgLyogSWYgdGhlIHNpemUgaXMgbmVnYXRpdmUsIG5lZ2F0ZSBSRUxPQ0FUSU9OLiAgVGhpcyBpc24ndCB2ZXJ5Ci0gICAgIGdlbmVyYWwuICAqLwotICBpZiAoaG93dG8tPnNpemUgPCAwKQotICAgIHJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQotICAvKiBHZXQgdGhlIHZhbHVlIHdlIGFyZSBnb2luZyB0byByZWxvY2F0ZS4gICovCi0gIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSA0OgotI2lmZGVmIEJGRDY0Ci0gICAgY2FzZSA4OgotI2VuZGlmCi0gICAgICB4ID0gZ2V0X2RhdGEgKGxvY2F0aW9uLCAwLCBzaXplKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICBGSVhNRTogV2UgbWF5IGRyb3AgYml0cyBkdXJpbmcgdGhlIGFkZGl0aW9uCi0gICAgIHdoaWNoIHdlIGRvbid0IGNoZWNrIGZvci4gIFdlIG11c3QgZWl0aGVyIGNoZWNrIGF0IGV2ZXJ5IHNpbmdsZQotICAgICBvcGVyYXRpb24sIHdoaWNoIHdvdWxkIGJlIHRlZGlvdXMsIG9yIHdlIG11c3QgZG8gdGhlIGNvbXB1dGF0aW9ucwotICAgICBpbiBhIHR5cGUgbGFyZ2VyIHRoYW4gYmZkX3ZtYSwgd2hpY2ggd291bGQgYmUgaW5lZmZpY2llbnQuICAqLwotICBvdmVyZmxvdyA9IGZhbHNlOwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpCi0gICAgewotICAgICAgYmZkX3ZtYSBjaGVjazsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHNpZ25lZF9jaGVjazsKLSAgICAgIGJmZF92bWEgYWRkOwotICAgICAgYmZkX3NpZ25lZF92bWEgc2lnbmVkX2FkZDsKLQotICAgICAgaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID09IDApCi0JewotCSAgY2hlY2sgPSByZWxvY2F0aW9uOwotCSAgc2lnbmVkX2NoZWNrID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBEcm9wIHVud2FudGVkIGJpdHMgZnJvbSB0aGUgdmFsdWUgd2UgYXJlIHJlbG9jYXRpbmcgdG8uICAqLwotCSAgY2hlY2sgPSByZWxvY2F0aW9uID4+IGhvd3RvLT5yaWdodHNoaWZ0OwotCi0JICAvKiBJZiB0aGlzIGlzIGEgc2lnbmVkIHZhbHVlLCB0aGUgcmlnaHRzaGlmdCBqdXN0IGRyb3BwZWQKLQkgICAgIGxlYWRpbmcgMSBiaXRzIChhc3N1bWluZyB0d29zIGNvbXBsZW1lbnQpLiAgKi8KLQkgIGlmICgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPj0gMCkKLQkgICAgc2lnbmVkX2NoZWNrID0gY2hlY2s7Ci0JICBlbHNlCi0JICAgIHNpZ25lZF9jaGVjayA9IChjaGVjawotCQkJICAgIHwgKChiZmRfdm1hKSAtIDEKLQkJCSAgICAgICAmIH4oKGJmZF92bWEpIC0gMSA+PiBob3d0by0+cmlnaHRzaGlmdCkpKTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IGZpbGUuICAqLwotICAgICAgYWRkID0geCAmIGhvd3RvLT5zcmNfbWFzazsKLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZSB3aXRoIGFuIGFwcHJvcHJpYXRlIHNpZ24uCi0JIFRoZSBleHByZXNzaW9uIGludm9sdmluZyBob3d0by0+c3JjX21hc2sgaXNvbGF0ZXMgdGhlIHVwcGVyCi0JIGJpdCBvZiBzcmNfbWFzay4gIElmIHRoYXQgYml0IGlzIHNldCBpbiB0aGUgdmFsdWUgd2UgYXJlCi0JIGFkZGluZywgaXQgaXMgbmVnYXRpdmUsIGFuZCB3ZSBzdWJ0cmFjdCBvdXQgdGhhdCBudW1iZXIgdGltZXMKLQkgdHdvLiAgSWYgc3JjX21hc2sgaW5jbHVkZXMgdGhlIGhpZ2hlc3QgcG9zc2libGUgYml0LCB0aGVuIHdlCi0JIGNhbiBub3QgZ2V0IHRoZSB1cHBlciBiaXQsIGJ1dCB0aGF0IGRvZXMgbm90IG1hdHRlciBzaW5jZQotCSBzaWduZWRfYWRkIG5lZWRzIG5vIGFkanVzdG1lbnQgdG8gYmVjb21lIG5lZ2F0aXZlIGluIHRoYXQKLQkgY2FzZS4gICovCi0gICAgICBzaWduZWRfYWRkID0gYWRkOwotICAgICAgaWYgKChhZGQgJiAoKCh+aG93dG8tPnNyY19tYXNrKSA+PiAxKSAmIGhvd3RvLT5zcmNfbWFzaykpICE9IDApCi0Jc2lnbmVkX2FkZCAtPSAoKCh+aG93dG8tPnNyY19tYXNrKSA+PiAxKSAmIGhvd3RvLT5zcmNfbWFzaykgPDwgMTsKLQotICAgICAgLyogQWRkIHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZSwgc2hpZnRlZCBzbyB0aGF0IGl0IGlzIGEKLQkgc3RyYWlnaHQgbnVtYmVyLiAgKi8KLSAgICAgIGlmIChob3d0by0+Yml0cG9zID09IDApCi0JewotCSAgY2hlY2sgKz0gYWRkOwotCSAgc2lnbmVkX2NoZWNrICs9IHNpZ25lZF9hZGQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNoZWNrICs9IGFkZCA+PiBob3d0by0+Yml0cG9zOwotCi0JICAvKiBGb3IgdGhlIHNpZ25lZCBjYXNlIHdlIHVzZSBBREQsIHJhdGhlciB0aGFuIFNJR05FRF9BREQsCi0JICAgICB0byBhdm9pZCB3YXJuaW5ncyBmcm9tIFNWUjQgY2MuICBUaGlzIGlzIE9LIHNpbmNlIHdlCi0JICAgICBleHBsaWN0bHkgaGFuZGxlIHRoZSBzaWduIGJpdHMuICAqLwotCSAgaWYgKHNpZ25lZF9hZGQgPj0gMCkKLQkgICAgc2lnbmVkX2NoZWNrICs9IGFkZCA+PiBob3d0by0+Yml0cG9zOwotCSAgZWxzZQotCSAgICBzaWduZWRfY2hlY2sgKz0gKChhZGQgPj4gaG93dG8tPmJpdHBvcykKLQkJCSAgICAgfCAoKGJmZF92bWEpIC0gMQotCQkJCSYgfigoYmZkX3ZtYSkgLSAxID4+IGhvd3RvLT5iaXRwb3MpKSk7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdykKLQl7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQ6Ci0JICB7Ci0JICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gICovCi0JICAgIGJmZF9zaWduZWRfdm1hIHJlbG9jX3NpZ25lZF9tYXggPSAoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxOwotCSAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWluID0gfnJlbG9jX3NpZ25lZF9tYXg7Ci0KLQkgICAgaWYgKHNpZ25lZF9jaGVjayA+IHJlbG9jX3NpZ25lZF9tYXgKLQkJfHwgc2lnbmVkX2NoZWNrIDwgcmVsb2Nfc2lnbmVkX21pbikKLQkgICAgICBvdmVyZmxvdyA9IHRydWU7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkOgotCSAgewotCSAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICBUaGlzIGV4cHJlc3Npb24gYXZvaWRzCi0JICAgICAgIG92ZXJmbG93IGlmIGhvd3RvLT5iaXRzaXplIGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbgotCSAgICAgICBiZmRfdm1hLiAgKi8KLQkgICAgYmZkX3ZtYSByZWxvY191bnNpZ25lZF9tYXggPQotCSAgICAoKCgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotCSAgICBpZiAoY2hlY2sgPiByZWxvY191bnNpZ25lZF9tYXgpCi0JICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZDoKLQkgIHsKLQkgICAgLyogQXNzdW1lcyB0d28ncyBjb21wbGVtZW50LiAgVGhpcyBleHByZXNzaW9uIGF2b2lkcwotCSAgICAgICBvdmVyZmxvdyBpZiBob3d0by0+Yml0c2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4KLQkgICAgICAgYmZkX3ZtYS4gICovCi0JICAgIGJmZF92bWEgcmVsb2NfYml0cyA9ICgoKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCi0JICAgIGlmICgoY2hlY2sgJiB+cmVsb2NfYml0cykgIT0gMAotCQkmJiAoKChiZmRfdm1hKSBzaWduZWRfY2hlY2sgJiB+cmVsb2NfYml0cykKLQkJICAgICE9ICgtMSAmIH5yZWxvY19iaXRzKSkpCi0JICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgLyogUHV0IFJFTE9DQVRJT04gaW4gdGhlIHJpZ2h0IGJpdHMuICAqLwotICByZWxvY2F0aW9uID4+PSAoYmZkX3ZtYSkgaG93dG8tPnJpZ2h0c2hpZnQ7Ci0gIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBob3d0by0+Yml0cG9zOwotCi0gIC8qIEFkZCBSRUxPQ0FUSU9OIHRvIHRoZSByaWdodCBiaXRzIG9mIFguICAqLwotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykKLSAgICAgICB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spKTsKLQotICAvKiBQdXQgdGhlIHJlbG9jYXRlZCB2YWx1ZSBiYWNrIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAyOgotICAgIGNhc2UgNDoKLSNpZmRlZiBCRkQ2NAotICAgIGNhc2UgODoKLSNlbmRpZgotICAgICAgcHV0X2RhdGEoeCwgbG9jYXRpb24sIDAsIHNpemUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBvdmVyZmxvdyA/IGJmZF9yZWxvY19vdmVyZmxvdyA6IGJmZF9yZWxvY19vazsKLX0KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX25zMzJrX3JlbG9jX2Rpc3AgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGRvX25zMzJrX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UsCi0JCQkgX2JmZF9uczMya19nZXRfZGlzcGxhY2VtZW50LAotCQkJIF9iZmRfbnMzMmtfcHV0X2Rpc3BsYWNlbWVudCk7Ci19Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9uczMya19yZWxvY19pbW0gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gZG9fbnMzMmtfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwgX2JmZF9uczMya19nZXRfaW1tZWRpYXRlLAotCQkJIF9iZmRfbnMzMmtfcHV0X2ltbWVkaWF0ZSk7Ci19Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9uczMya19maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQlhZGRyZXNzLCB2YWx1ZSwgYWRkZW5kKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICAvKiBTYW5pdHkgY2hlY2sgdGhlIGFkZHJlc3MuICAqLwotICBpZiAoYWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIGJhc2ljIHJlbG9jYXRpb24KLSAgICAgYWdhaW5zdCBhIHN5bWJvbC4gIFdlIHdhbnQgdG8gY29tcHV0ZSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB0bwotICAgICByZWxvY2F0ZSB0by4gIFRoaXMgaXMganVzdCBWQUxVRSwgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wsIHBsdXMKLSAgICAgQURERU5ELCBhbnkgYWRkZW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsb2MuICAqLwotICByZWxvY2F0aW9uID0gdmFsdWUgKyBhZGRlbmQ7Ci0KLSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgUEMgcmVsYXRpdmUsIHdlIHdhbnQgdG8gc2V0IFJFTE9DQVRJT04gdG8KLSAgICAgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN5bWJvbCAoY3VycmVudGx5IGluIFJFTE9DQVRJT04pIGFuZCB0aGUKLSAgICAgbG9jYXRpb24gd2UgYXJlIHJlbG9jYXRpbmcuICBTb21lIHRhcmdldHMgKGUuZy4sIGkzODYtYW91dCkKLSAgICAgYXJyYW5nZSBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIHRvIGJlIHRoZSBuZWdhdGl2ZSBvZiB0aGUKLSAgICAgb2Zmc2V0IG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb247IGZvciBzdWNoIHRhcmdldHMKLSAgICAgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlLiAgT3RoZXIgdGFyZ2V0cyAoZS5nLiwgbTg4a2JjcyBvciBFTEYpCi0gICAgIHNpbXBseSBsZWF2ZSB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gYXMgemVybzsgZm9yIHN1Y2gKLSAgICAgdGFyZ2V0cyBwY3JlbF9vZmZzZXQgaXMgdHJ1ZS4gIElmIHBjcmVsX29mZnNldCBpcyBmYWxzZSB3ZSBkbyBub3QKLSAgICAgbmVlZCB0byBzdWJ0cmFjdCBvdXQgdGhlIG9mZnNldCBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZQotICAgICBzZWN0aW9uICh3aGljaCBpcyBqdXN0IEFERFJFU1MpLiAgKi8KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICB7Ci0gICAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0KQotCXJlbG9jYXRpb24gLT0gYWRkcmVzczsKLSAgICB9Ci0KLSAgcmV0dXJuIF9iZmRfbnMzMmtfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICAgICAgIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci19CmRpZmYgLS1naXQgYS9iZmQvY3B1LXBvd2VycGMuYyBiL2JmZC9jcHUtcG93ZXJwYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWYwZjgwLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtcG93ZXJwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qIEJGRCBQb3dlclBDIENQVSBkZWZpbml0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIFRoZSBjb21tb24gUG93ZXJQQyBhcmNoaXRlY3R1cmUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBSUy82MDAwLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqcG93ZXJwY19jb21wYXRpYmxlCi0gIFBBUkFNUyAoKGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqLCBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKikpOwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLXBvd2VycGNfY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgQkZEX0FTU0VSVCAoYS0+YXJjaCA9PSBiZmRfYXJjaF9wb3dlcnBjKTsKLSAgc3dpdGNoIChiLT5hcmNoKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgotICAgICAgcmV0dXJuIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUgKGEsIGIpOwotICAgIGNhc2UgYmZkX2FyY2hfcnM2MDAwOgotICAgICAgaWYgKGEtPm1hY2ggPT0gMCkKLQlyZXR1cm4gYTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQotewotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9wb3dlcnBjLAotICAgIDYwMywgLyogZm9yIHRoZSBtcGM2MDMgKi8KLSAgICAicG93ZXJwYyIsCi0gICAgInBvd2VycGM6NjAzIiwKLSAgICAzLAotICAgIGZhbHNlLCAvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBwb3dlcnBjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbMV0KLSAgfSwKLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcG93ZXJwYywKLSAgICA2MDQsIC8qIGZvciB0aGUgbXBjNjA0ICovCi0gICAgInBvd2VycGMiLAotICAgICJwb3dlcnBjOjYwNCIsCi0gICAgMywKLSAgICBmYWxzZSwgLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgcG93ZXJwY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzJdCi0gIH0sCi0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3Bvd2VycGMsCi0gICAgNDAzLCAvKiBmb3IgdGhlIDQwMyAqLwotICAgICJwb3dlcnBjIiwKLSAgICAicG93ZXJwYzo0MDMiLAotICAgIDMsCi0gICAgZmFsc2UsIC8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIHBvd2VycGNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFszXQotICB9LAotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9wb3dlcnBjLAotICAgIDYwMSwgLyogZm9yIHRoZSBtcGM2MDEgKi8KLSAgICAicG93ZXJwYyIsCi0gICAgInBvd2VycGM6NjAxIiwKLSAgICAzLAotICAgIGZhbHNlLCAvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBwb3dlcnBjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgMAotICB9Ci19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3Bvd2VycGNfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3Bvd2VycGMsCi0gICAgMCwgLyogZm9yIHRoZSBQT1dFUi9Qb3dlclBDIGNvbW1vbiBhcmNoaXRlY3R1cmUgKi8KLSAgICAicG93ZXJwYyIsCi0gICAgInBvd2VycGM6Y29tbW9uIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBkZWZhdWx0ICovCi0gICAgcG93ZXJwY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzBdCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXJzNjAwMC5jIGIvYmZkL2NwdS1yczYwMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1MmFlOS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXJzNjAwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciByczYwMDAgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgRklYTUU6IENhbiBzb21lb25lIHByb3ZpZGUgYSB0cmFuc2xpdGVyYXRpb24gb2YgdGhpcyBuYW1lIGludG8gQVNDSUk/Ci0gICBVc2luZyB0aGUgZm9sbG93aW5nIGNoYXJzIGNhdXNlZCBhIGNvbXBpbGVyIHdhcm5pbmcgb24gSElVWCAoc28gSSByZXBsYWNlZAotICAgdGhlbSB3aXRoIG9jdGFsIGVzY2FwZXMpLCBhbmQgaXNuJ3QgdXNlZnVsIHdpdGhvdXQgYW4gdW5kZXJzdGFuZGluZyBvZiB3aGF0Ci0gICBjaGFyYWN0ZXIgc2V0IGl0IGlzLgotICAgV3JpdHRlbiBieSBNaW1pIFBoXDM3M1wzNjRuZy1UaFwzNDVvIFZcMzY1IG9mIElCTQotICAgYW5kIEpvaG4gR2lsbW9yZSBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIFRoZSBSUy82MDAwIGFyY2hpdGVjdHVyZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIFBvd2VyUEMgY29tbW9uCi0gICBhcmNoaXRlY3R1cmUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpyczYwMDBfY29tcGF0aWJsZQotICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1yczYwMDBfY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgQkZEX0FTU0VSVCAoYS0+YXJjaCA9PSBiZmRfYXJjaF9yczYwMDApOwotICBzd2l0Y2ggKGItPmFyY2gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICBjYXNlIGJmZF9hcmNoX3JzNjAwMDoKLSAgICAgIHJldHVybiBiZmRfZGVmYXVsdF9jb21wYXRpYmxlIChhLCBiKTsKLSAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6Ci0gICAgICBpZiAoYi0+bWFjaCA9PSAwKQotCXJldHVybiBiOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3JzNjAwMF9hcmNoID0KLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcnM2MDAwLAotICAgIDYwMDAsCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICAgInJzNjAwMCIsCi0gICAgInJzNjAwMDo2MDAwIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICByczYwMDBfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXNoLmMgYi9iZmQvY3B1LXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YWRmOTIuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1zaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBIaXRhY2hpLVNIIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLQotc3RhdGljIGJvb2xlYW4gCi1zY2FuX21hY2ggKGluZm8sIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHN0cmNhc2VjbXAgKGluZm8tPnByaW50YWJsZV9uYW1lLCBzdHJpbmcpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0jaWYgMAotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCByZXR1cm5zIHdoZXRoZXIKLSAgIHRoZXknZCBiZSBjb21wYXRpYmxlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgaWYgKGEtPmFyY2ggIT0gYi0+YXJjaCB8fCBhLT5tYWNoICE9IGItPm1hY2gpCi0gICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGE7Ci19Ci0jZW5kaWYKLQotI2RlZmluZSBTSF9ORVhUICZhcmNoX2luZm9fc3RydWN0WzBdCi0jZGVmaW5lIFNIM19ORVhUICZhcmNoX2luZm9fc3RydWN0WzFdCi0jZGVmaW5lIFNIM0VfTkVYVCBOVUxMCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0gCi17Ci0gIHsKLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NoLAotICAgIGJmZF9tYWNoX3NoMywKLSAgICAic2giLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgICAic2gzIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAgIDEsCi0gICAgZmFsc2UsCQkJLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBzY2FuX21hY2gsCi0gICAgU0gzX05FWFQKLSAgfSwKLSAgewotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc2gsCi0gICAgYmZkX21hY2hfc2gzZSwKLSAgICAic2giLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgICAic2gzZSIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgICAxLAotICAgIGZhbHNlLAkJCS8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gICAgc2Nhbl9tYWNoLAotICAgIFNIM0VfTkVYVAotICB9LAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9zaF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9zaCwKLSAgYmZkX21hY2hfc2gsCi0gICJzaCIsCQkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgInNoIiwJCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgMSwKLSAgdHJ1ZSwJCQkJLyogdGhlIGRlZmF1bHQgbWFjaGluZSAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICBzY2FuX21hY2gsCi0gIFNIX05FWFQKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXNwYXJjLmMgYi9iZmQvY3B1LXNwYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNGJkOTIuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1zcGFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgU1BBUkMgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotLyogRG9uJ3QgbWl4IDMyIGJpdCBhbmQgNjQgYml0IGZpbGVzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqc3BhcmNfY29tcGF0aWJsZQotICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1zcGFyY19jb21wYXRpYmxlIChhLCBiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgaWYgKGEtPmJpdHNfcGVyX3dvcmQgIT0gYi0+Yml0c19wZXJfd29yZCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gYmZkX2RlZmF1bHRfY29tcGF0aWJsZSAoYSwgYik7Ci19Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0KLXsKLSAgewotICAgIDMyLAkvKiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NwYXJjLAotICAgIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0LAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnNwYXJjbGV0IiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbMV0sCi0gIH0sCi0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGUsCi0gICAgInNwYXJjIiwKLSAgICAic3BhcmM6c3BhcmNsaXRlIiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbMl0sCi0gIH0sCi0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY192OHBsdXMsCi0gICAgInNwYXJjIiwKLSAgICAic3BhcmM6djhwbHVzIiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbM10sCi0gIH0sCi0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY192OHBsdXNhLAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnY4cGx1c2EiLAotICAgIDMsCi0gICAgZmFsc2UsCi0gICAgc3BhcmNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFs0XSwKLSAgfSwKLSAgewotICAgIDMyLAkvKiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NwYXJjLAotICAgIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZSwKLSAgICAic3BhcmMiLAotICAgICJzcGFyYzpzcGFyY2xpdGVfbGUiLAotICAgIDMsCi0gICAgZmFsc2UsCi0gICAgc3BhcmNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFs1XSwKLSAgfSwKLSAgewotICAgIDY0LAkvKiBiaXRzIGluIGEgd29yZCAqLwotICAgIDY0LAkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NwYXJjLAotICAgIGJmZF9tYWNoX3NwYXJjX3Y5LAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnY5IiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbNl0sCi0gIH0sCi0gIHsKLSAgICA2NCwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICA2NCwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY192OWEsCi0gICAgInNwYXJjIiwKLSAgICAic3BhcmM6djlhIiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgMCwKLSAgfQotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9zcGFyY19hcmNoID0KLSAgewotICAgIDMyLAkvKiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NwYXJjLAotICAgIGJmZF9tYWNoX3NwYXJjLAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBkZWZhdWx0ICovCi0gICAgc3BhcmNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFswXSwKLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtdGljMzAuYyBiL2JmZC9jcHUtdGljMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3MjNmNy4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXRpYzMwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzIFRNUzMyMEMzMCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3RpYzMwX2FyY2ggPQotewotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX3RpYzMwLAotICAwLAkJCQkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAidGljMzAiLAotICAidG1zMzIwYzMwIiwKLSAgMiwKLSAgdHJ1ZSwJCQkJLyogdGhlIG9uZSBhbmQgb25seSAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICBiZmRfZGVmYXVsdF9zY2FuLAotICAwLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtdGljODAuYyBiL2JmZC9jcHUtdGljODAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAyODY2ZS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXRpYzgwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBiZmQgYmFjay1lbmQgZm9yIFRJIFRNUzMyMEM4MCAoTVZQKSBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBhdCBDeWdudXMgc3VwcG9ydCAoZm5mQGN5Z251cy5jb20pCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3RpYzgwX2FyY2ggPQotICB7Ci0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF90aWM4MCwJCS8qIGJmZF9hcmNoaXRlY3R1cmUgZW51bSAqLwotICAgIDAsCQkJCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICAgInRpYzgwIiwJCQkvKiBhcmNoaXRlY3R1cmUgbmFtZSAqLwotICAgICJ0aWM4MCIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgICAyLAkJCQkvKiBzZWN0aW9uIGFsaWdubWVudCBwb3dlciAqLwotICAgIHRydWUsCQkJLyogZGVmYXVsdCBtYWNoaW5lIGZvciBhcmNoaXRlY3R1cmUgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4gLAotICAgIE5VTEwsCQkJCS8qIFBvaW50ZXIgdG8gbmV4dCBpbiBjaGFpbiAqLwotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS12ODUwLmMgYi9iZmQvY3B1LXY4NTAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5NDEzZC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXY4NTAuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIE5FQyBWODUwIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotc3RhdGljIGJvb2xlYW4gCi1zY2FuIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICogaW5mbzsKLSAgICAgY29uc3QgY2hhciAqIHN0cmluZzsKLXsKLSAgY29uc3QgY2hhciAqcHRyX3NyYzsKLSAgY29uc3QgY2hhciAqcHRyX3RzdDsKLSAgdW5zaWduZWQgbG9uZyBudW1iZXI7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotCi0gIC8qIEZpcnN0IHRlc3QgZm9yIGFuIGV4YWN0IG1hdGNoICovCi0gIGlmIChzdHJjYXNlY21wIChzdHJpbmcsIGluZm8tPnByaW50YWJsZV9uYW1lKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFNlZSBob3cgbXVjaCBvZiB0aGUgc3VwcGxpZWQgc3RyaW5nIG1hdGNoZXMgd2l0aCB0aGUKLSAgICAgYXJjaGl0ZWN0dXJlLCBlZyB0aGUgc3RyaW5nIG02OGs6NjgwMjAgd291bGQgbWF0Y2ggdGhlIG02OGsgZW50cnkKLSAgICAgdXAgdG8gdGhlIDosIHRoZW4gd2UgZ2V0IGxlZnQgd2l0aCB0aGUgbWFjaGluZSBudW1iZXIgKi8KLQotICBmb3IgKHB0cl9zcmMgPSBzdHJpbmcsIHB0cl90c3QgPSBpbmZvLT5hcmNoX25hbWU7IAotICAgICAgICpwdHJfc3JjICYmICpwdHJfdHN0OwotICAgICAgIHB0cl9zcmMrKywgcHRyX3RzdCsrKSAKLSAgICB7Ci0gICAgICBpZiAoKnB0cl9zcmMgIT0gKnB0cl90c3QpIGJyZWFrOwotICAgIH0KLQotICAvKiBDaGV3ZWQgdXAgYXMgbXVjaCBvZiB0aGUgYXJjaGl0ZWN0dXJlIGFzIHdpbGwgbWF0Y2gsIHNraXAgYW55Ci0gICAgIGNvbG9ucyAqLwotICBpZiAoKnB0cl9zcmMgPT0gJzonKQotICAgIHB0cl9zcmMrKzsKLSAgCi0gIGlmICgqcHRyX3NyYyA9PSAwKQotICAgIHsKLSAgICAgIC8qIG5vdGhpbmcgbW9yZSwgdGhlbiBvbmx5IGtlZXAgdGhpcyBvbmUgaWYgaXQgaXMgdGhlIGRlZmF1bHQKLQkgbWFjaGluZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUgKi8KLSAgICAgIHJldHVybiBpbmZvLT50aGVfZGVmYXVsdDsKLSAgICB9Ci0KLSAgbnVtYmVyID0gMDsKLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcHRyX3NyYykpCi0gICAgewotICAgICAgbnVtYmVyID0gbnVtYmVyICogMTAgKyAqIHB0cl9zcmMgIC0gJzAnOwotICAgICAgcHRyX3NyYysrOwotICAgIH0KLQotICBzd2l0Y2ggKG51bWJlcikgCi0gICAgewotICAgIGNhc2UgYmZkX21hY2hfdjg1MGU6ICBhcmNoID0gYmZkX2FyY2hfdjg1MDsgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF92ODUwZWE6IGFyY2ggPSBiZmRfYXJjaF92ODUwOyBicmVhazsKLSAgICBkZWZhdWx0OiAgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChhcmNoICE9IGluZm8tPmFyY2gpIAotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobnVtYmVyICE9IGluZm8tPm1hY2gpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE4obnVtYmVyLCBwcmludCwgZGVmYXVsdCwgbmV4dCkgIFwKLXsgIDMyLCAzMiwgOCwgYmZkX2FyY2hfdjg1MCwgbnVtYmVyLCAidjg1MCIsIHByaW50LCAyLCBkZWZhdWx0LCBcCi0gICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIHNjYW4sIG5leHQgfQotCi0jZGVmaW5lIE5FWFQgTlVMTAotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9IAotewotICBOIChiZmRfbWFjaF92ODUwZSwgICJ2ODUwZSIsICBmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMV0pLAotICBOIChiZmRfbWFjaF92ODUwZWEsICJ2ODUwZWEiLCBmYWxzZSwgTlVMTCkKLX07Ci0KLSN1bmRlZiBORVhUCi0jZGVmaW5lIE5FWFQgJmFyY2hfaW5mb19zdHJ1Y3RbMF0KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF92ODUwX2FyY2ggPQotICBOIChiZmRfbWFjaF92ODUwLCAidjg1MCIsIHRydWUsIE5FWFQpOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS12YXguYyBiL2JmZC9jcHUtdmF4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYzZkMzkuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS12YXguYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIGJmZCBiYWNrLWVuZCBmb3IgdmF4IHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF92YXhfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3ZheCwKLSAgICAwLAkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJ2YXgiLAotICAgICJ2YXgiLAotICAgIDMsCi0gICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4gLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXc2NS5jIGIvYmZkL2NwdS13NjUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBiYmYwNC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXc2NS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIFdEQyA2NTgxNiBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGl3NjVlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSB3NjVvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLQotaW50IGJmZF9kZWZhdWx0X3NjYW5fbnVtX21hY2goKTsKLQotc3RhdGljIGJvb2xlYW4gCi1zY2FuX21hY2ggKGluZm8sIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHN0cmNtcChzdHJpbmcsInc2NSIpID09IDApIHJldHVybiB0cnVlOwotICBpZiAoc3RyY21wKHN0cmluZywidzY1ODE2IikgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdzY1X2FyY2ggPQotewotICAxNiwJCQkJLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgMjQsCQkJCS8qIDI0IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX3c2NSwKLSAgMCwJCQkJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgInc2NSIsCQkJLyogYXJjaF9uYW1lICAqLwotICAidzY1IiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gIHNjYW5fbWFjaCwKLSAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXdlMzJrLmMgYi9iZmQvY3B1LXdlMzJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGNiYzEuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS13ZTMyay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogYmZkIGJhY2stZW5kIGZvciB3ZTMyayBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBCcmVuZGFuIEtlaG9lIChicmVuZGFuQGNzLndpZGVuZXIuZWR1KS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfd2UzMmtfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3dlMzJrLAotICAgIDMyMDAwLAkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJ3ZTMyayIsCi0gICAgIndlMzJrOjMyMDAwIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS16OGsuYyBiL2JmZC9jcHUtejhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjY2U4ZWIuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS16OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgWjgwMG4gYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotCi0jaWYgMAkJCQkvKiBub3QgdXNlZCBjdXJyZW50bHkgKi8KLS8qCi1SZWxvY2F0aW9ucyBmb3IgdGhlIFo4SwotCi0qLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaG93dG8xNl9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfMTYgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaG93dG84X2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+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/PyBiZmQuaCBsaWJiZmQuaCBsaWJjb2ZmLmggdGV4cHV0LmxvZwotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9ICQoRE9DRklMRVMpCmRpZmYgLS1naXQgYS9iZmQvZG9jL01ha2VmaWxlLmluIGIvYmZkL2RvYy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI5NWMxMC4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1ERVNURElSID0KLQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLQotdG9wX2J1aWxkZGlyID0gLi4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQkZEX0hPU1RfNjRCSVRfTE9ORyA9IEBCRkRfSE9TVF82NEJJVF9MT05HQAotQkZEX0hPU1RfNjRfQklUID0gQEJGRF9IT1NUXzY0X0JJVEAKLUJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEID0gQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQAotQkZEX0hPU1RfVV82NF9CSVQgPSBAQkZEX0hPU1RfVV82NF9CSVRACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1DT1JFRklMRSA9IEBDT1JFRklMRUAKLUNPUkVGTEFHID0gQENPUkVGTEFHQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1FWEVFWFQgPSBARVhFRVhUQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTExJQlMgPSBASU5UTExJQlNACi1JTlRMT0JKUyA9IEBJTlRMT0JKU0AKLUxEID0gQExEQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTUFJTlQgPSBATUFJTlRACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLU1TR0ZNVCA9IEBNU0dGTVRACi1OTSA9IEBOTUAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBPRklMRVMgPSBAUE9GSUxFU0AKLVBPU1VCID0gQFBPU1VCQAotUkFOTElCID0gQFJBTkxJQkAKLVRERUZJTkVTID0gQFRERUZJTkVTQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotV0lOMzJMREZMQUdTID0gQFdJTjMyTERGTEFHU0AKLVdJTjMyTElCQUREID0gQFdJTjMyTElCQUREQAotYWxsX2JhY2tlbmRzID0gQGFsbF9iYWNrZW5kc0AKLWJmZF9iYWNrZW5kcyA9IEBiZmRfYmFja2VuZHNACi1iZmRfbWFjaGluZXMgPSBAYmZkX21hY2hpbmVzQAotbCA9IEBsQAotdGRlZmF1bHRzID0gQHRkZWZhdWx0c0AKLXdvcmRzaXplID0gQHdvcmRzaXplQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLURPQ0ZJTEVTID0gYW91dHgudGV4aSAgYXJjaGl2ZS50ZXhpIGFyY2h1cmVzLnRleGkgXAotCWJmZHQudGV4aSAgY2FjaGUudGV4aSBjb2ZmY29kZS50ZXhpIFwKLQljb3JlLnRleGkgZWxmLnRleGkgZWxmY29kZS50ZXhpICBmb3JtYXQudGV4aSAgbGliYmZkLnRleGkgIFwKLQlvcG5jbHMudGV4aSAgcmVsb2MudGV4aSAgc2VjdGlvbi50ZXhpICBcCi0Jc3ltcy50ZXhpICB0YXJnZXRzLnRleGkgaW5pdC50ZXhpIGhhc2gudGV4aSBsaW5rZXIudGV4aQotCi0KLVBST1RPUyA9IGFyY2hpdmUucCBhcmNodXJlcy5wIGJmZC5wIFwKLQkgY29yZS5wIGZvcm1hdC5wIFwKLQlsaWJiZmQucCBvcG5jbHMucCByZWxvYy5wIFwKLQlzZWN0aW9uLnAgc3ltcy5wIHRhcmdldHMucCAgXAotCWZvcm1hdC5wICBjb3JlLnAgaW5pdC5wCi0KLQotSVBST1RPUyA9IGNhY2hlLmlwIGxpYmJmZC5pcCByZWxvYy5pcCBpbml0LmlwIGFyY2h1cmVzLmlwIGNvZmZjb2RlLmlwCi0KLSMgU1JDRE9DLCBTUkNQUk9ULCBTUkNJUFJPVCBvbmx5IHVzZWQgdG8gc2lkZXN0ZXAgU3VuIE1ha2UgYnVnIGluIGludGVyYWN0aW9uIAotIyBiZXR3ZWVuIFZQQVRIIGFuZCBzdWZmaXggcnVsZXMuICBJZiB5b3UgdXNlIEdOVSBNYWtlLCBwZXJoYXBzIG90aGVyIE1ha2VzLAotIyB5b3UgZG9uJ3QgbmVlZCB0aGVzZSB0aHJlZToKLVNSQ0RPQyA9ICQoc3JjZGlyKS8uLi9hb3V0eC5oICAkKHNyY2RpcikvLi4vYXJjaGl2ZS5jIFwKLQkkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyAkKHNyY2RpcikvLi4vYmZkLmMgXAotCSQoc3JjZGlyKS8uLi9jYWNoZS5jICQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oIFwKLQkkKHNyY2RpcikvLi4vY29yZWZpbGUuYyAkKHNyY2RpcikvLi4vZWxmLmMgXAotCSQoc3JjZGlyKS8uLi9lbGZjb2RlLmggICQoc3JjZGlyKS8uLi9mb3JtYXQuYyBcCi0JJChzcmNkaXIpLy4uL2xpYmJmZC5jICQoc3JjZGlyKS8uLi9vcG5jbHMuYyBcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMgICQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgXAotCSQoc3JjZGlyKS8uLi9zeW1zLmMgICQoc3JjZGlyKS8uLi90YXJnZXRzLmMgXAotCSQoc3JjZGlyKS8uLi9oYXNoLmMgJChzcmNkaXIpLy4uL2xpbmtlci5jCi0KLQotU1JDUFJPVCA9ICQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgXAotCSQoc3JjZGlyKS8uLi9iZmQuYyAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCAkKHNyY2RpcikvLi4vY29yZWZpbGUuYyBcCi0JJChzcmNkaXIpLy4uL2Zvcm1hdC5jICQoc3JjZGlyKS8uLi9saWJiZmQuYyBcCi0JJChzcmNkaXIpLy4uL29wbmNscy5jICQoc3JjZGlyKS8uLi9yZWxvYy5jIFwKLQkkKHNyY2RpcikvLi4vc2VjdGlvbi5jICQoc3JjZGlyKS8uLi9zeW1zLmMgXAotCSQoc3JjZGlyKS8uLi90YXJnZXRzLmMgJChzcmNkaXIpLy4uL2luaXQuYwotCi0KLVNSQ0lQUk9UID0gJChzcmNkaXIpLy4uL2NhY2hlLmMgJChzcmNkaXIpLy4uL2xpYmJmZC5jIFwKLQkkKHNyY2RpcikvLi4vcmVsb2MuYyAkKHNyY2RpcikvLi4vY3B1LWg4MzAwLmMgXAotCSQoc3JjZGlyKS8uLi9jcHUtaTk2MC5jICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jIFwKLQkkKHNyY2RpcikvLi4vaW5pdC5jCi0KLQotVEVYSURJUiA9ICQoc3JjZGlyKS8uLi8uLi90ZXhpbmZvL2ZzZgotCi1pbmZvX1RFWElORk9TID0gYmZkLnRleGluZm8KLQotTUtET0MgPSBjaGV3JChFWEVFWFRfRk9SX0JVSUxEKQotCi1ub2luc3RfVEVYSU5GT1MgPSBiZmRpbnQudGV4aQotCi1NT1NUTFlDTEVBTkZJTEVTID0gJChNS0RPQykgKi5vCi0KLUNMRUFORklMRVMgPSBzLSogKi5wICouaXAKLQotRElTVENMRUFORklMRVMgPSBiZmQuPz8gYmZkLj8/PyBiZmQuaCBsaWJiZmQuaCBsaWJjb2ZmLmggdGV4cHV0LmxvZwotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9ICQoRE9DRklMRVMpCi1ta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS8uLi9ta2luc3RhbGxkaXJzCi1DT05GSUdfSEVBREVSID0gLi4vY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9IAotVEVYSTJEVkkgPSBgaWYgdGVzdCAtZiAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgdGhlbiBlY2hvICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyBlbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAotVEVYSU5GT19URVggPSAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXgKLUlORk9fREVQUyA9IGJmZC5pbmZvCi1EVklTID0gYmZkLmR2aQotVEVYSU5GT1MgPSBiZmQudGV4aW5mbwotRElTVF9DT01NT04gPSAgQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gdGFyCi1HWklQX0VOViA9IC0tYmVzdAotYWxsOiBhbGwtcmVkaXJlY3QKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmR2aSAuaW5mbyAucHMgLnRleGkgLnRleGluZm8gLnR4aQotJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIE1ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWN5Z251cyBkb2MvTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLQotYmZkLmluZm86IGJmZC50ZXhpbmZvCi1iZmQuZHZpOiBiZmQudGV4aW5mbwotCi0KLURWSVBTID0gZHZpcHMKLQotLnRleGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udGV4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udHhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLS5kdmkucHM6Ci0JJChEVklQUykgJDwgLW8gJEAKLQotaW5zdGFsbC1pbmZvLWFtOiAkKElORk9fREVQUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGluZm9kaXIpCi0JQGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBpZmlsZSBpbiBgY2QgJCRkICYmIGVjaG8gJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XWA7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAkJGQvJCRpZmlsZTsgdGhlbiBcCi0JICAgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlIjsgXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlOyBcCi0JICAgIGVsc2UgOiA7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCUAkKFBPU1RfSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBsaXN0PSckKElORk9fREVQUyknOyBcCi0JICBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSI7XAotCSAgICBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUgfHwgOjtcCi0JICBkb25lOyBcCi0JZWxzZSA6IDsgZmkKLQotdW5pbnN0YWxsLWluZm86Ci0JJChQUkVfVU5JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGlpPXllczsgXAotCWVsc2UgaWk9OyBmaTsgXAotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgLXogIiRpaSIgXAotCSAgICB8fCBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAtLXJlbW92ZSAkJGZpbGU7IFwKLQlkb25lCi0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAoY2QgJChERVNURElSKSQoaW5mb2RpcikgJiYgcm0gLWYgJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XSk7IFwKLQlkb25lCi0KLWRpc3QtaW5mbzogJChJTkZPX0RFUFMpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBiYXNlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGJhc2U7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGZpbGUgaW4gYGNkICQkZCAmJiBldmFsIGVjaG8gJCRiYXNlKmA7IGRvIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tYW1pbmZvOgotCS1ybSAtZiBiZmQuYXV4IGJmZC5jcCBiZmQuY3BzIGJmZC5kdmkgYmZkLmZuIGJmZC5mbnMgYmZkLmt5IGJmZC5reXMgXAotCSAgYmZkLnBzIGJmZC5sb2cgYmZkLnBnIGJmZC50b2MgYmZkLnRwIGJmZC50cHMgYmZkLnZyIGJmZC52cnMgXAotCSAgYmZkLm9wIGJmZC50ciBiZmQuY3YgYmZkLmNuCi0KLWNsZWFuLWFtaW5mbzoKLQotZGlzdGNsZWFuLWFtaW5mbzoKLQotbWFpbnRhaW5lci1jbGVhbi1hbWluZm86Ci0JZm9yIGkgaW4gJChJTkZPX0RFUFMpOyBkbyBcCi0JICBybSAtZiAkJGk7IFwKLQkgIGlmIHRlc3QgImBlY2hvICQkaS1bMC05XSpgIiAhPSAiJCRpLVswLTldKiI7IHRoZW4gXAotCSAgICBybSAtZiAkJGktWzAtOV0qOyBcCi0JICBmaTsgXAotCWRvbmUKLWNsZWFuLWluZm86IG1vc3RseWNsZWFuLWFtaW5mbwotdGFnczogVEFHUwotVEFHUzoKLQotCi1kaXN0ZGlyID0gJCh0b3BfYnVpbGRkaXIpLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLQotc3ViZGlyID0gZG9jCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgZGlzdC1pbmZvCi1pbmZvLWFtOiAkKElORk9fREVQUykKLWluZm86IGluZm8tYW0KLWR2aS1hbTogJChEVklTKQotZHZpOiBkdmktYW0KLWNoZWNrLWFtOgotY2hlY2s6IGNoZWNrLWFtCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQotaW5zdGFsbC1pbmZvLWFtOiAKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCi1pbnN0YWxsLWV4ZWMtYW06Ci1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQotCi1pbnN0YWxsLWRhdGEtYW06Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotaW5zdGFsbDogaW5zdGFsbC1hbQotdW5pbnN0YWxsLWFtOgotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLWFsbC1hbTogTWFrZWZpbGUKLWFsbC1yZWRpcmVjdDogYWxsLWFtCi1pbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUz0tcyBpbnN0YWxsCi1pbnN0YWxsZGlyczoKLQotCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKE1PU1RMWUNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1PU1RMWUNMRUFORklMRVMpCi0KLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQktdGVzdCAteiAiJChESVNUQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoRElTVENMRUFORklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWFtaW5mbyBtb3N0bHljbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQotCi1jbGVhbi1hbTogIGNsZWFuLWFtaW5mbyBjbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWFtCi0KLWNsZWFuOiBjbGVhbi1hbQotCi1kaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4tYW1pbmZvIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBcCi0JCWRpc3RjbGVhbi1hbQotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCi0KLS5QSE9OWTogaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1pbmZvIG1vc3RseWNsZWFuLWFtaW5mbyBcCi1kaXN0Y2xlYW4tYW1pbmZvIGNsZWFuLWFtaW5mbyBtYWludGFpbmVyLWNsZWFuLWFtaW5mbyB0YWdzIGRpc3RkaXIgXAotaW5mby1hbSBpbmZvIGR2aS1hbSBkdmkgY2hlY2sgY2hlY2stYW0gaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxjaGVjayBcCi1pbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMgXAotaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWFtIGluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbCBcCi1hbGwtcmVkaXJlY3QgYWxsLWFtIGFsbCBpbnN0YWxsZGlycyBtb3N0bHljbGVhbi1nZW5lcmljIFwKLWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWdlbmVyaWMgbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGNsZWFuIFwKLW1vc3RseWNsZWFuIGRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuCi0KLQotJChNS0RPQyk6IGNoZXcubwotCSQoQ0NfRk9SX0JVSUxEKSAtbyAkKE1LRE9DKSBjaGV3Lm8gJChMT0FETElCRVMpICQoTERGTEFHUykKLQotY2hldy5vOiBjaGV3LmMKLQkkKENDX0ZPUl9CVUlMRCkgLWMgLUkuLiAtSSQoc3JjZGlyKS8uLiAtSSQoc3JjZGlyKS8uLi8uLi9pbmNsdWRlIC1JJChzcmNkaXIpLy4uLy4uL2ludGwgLUkuLi8uLi9pbnRsICQoSF9DRkxBR1MpICQoQ0ZMQUdTKSAkKHNyY2RpcikvY2hldy5jCi0KLXByb3RvczogbGliYmZkLmggbGliY29mZi5oIGJmZC5oCi0KLWJmZC5pbmZvIGJmZC5kdmk6ICQoRE9DRklMRVMpIGJmZHN1bW0udGV4aSBiZmQudGV4aW5mbwotCi0jIFdlIGNhbid0IHJlcGxhY2UgdGhlc2UgcnVsZXMgd2l0aCBhbiBpbXBsaWNpdCBydWxlLCBiZWNhdXNlCi0jIG1ha2VzIHdpdGhvdXQgVlBBVEggc3VwcG9ydCBjb3VsZG4ndCBmaW5kIHRoZSAuaCBmaWxlcyBpbiBgLi4nLgotCi0jIFdlIHVzZSBzLVhYWCB0YXJnZXRzIHNvIHRoYXQgd2UgY2FuIGRpc3RyaWJ1dGUgdGhlIGluZm8gZmlsZXMsCi0jIGFuZCBwZXJtaXQgcGVvcGxlIHRvIHJlYnVpbGQgdGhlbSwgd2l0aG91dCByZXF1aXJpbmcgdGhlIG1ha2VpbmZvCi0jIHByb2dyYW0uICBJZiBzb21lYm9keSB0cmllcyB0byByZWJ1aWxkIGluZm8sIGJ1dCBub25lIG9mIHRoZSAudGV4aQotIyBmaWxlcyBoYXZlIGNoYW5nZWQsIHRoZW4gdGhpcyBNYWtlZmlsZSB3aWxsIGJ1aWxkIGNoZXcsIGFuZCB3aWxsCi0jIGJ1aWxkIGFsbCBvZiB0aGUgc3RhbXAgZmlsZXMsIGJ1dCB3aWxsIG5vdCBhY3R1YWxseSBoYXZlIHRvIHJlYnVpbGQKLSMgYmZkLmluZm8uCi0KLXMtYW91dHg6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9hb3V0eC5oICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2FvdXR4LmggPmFvdXR4LnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBhb3V0eC50bXAgYW91dHgudGV4aQotCXRvdWNoIHMtYW91dHgKLWFvdXR4LnRleGk6IHMtYW91dHgKLQotcy1hcmNoaXZlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vYXJjaGl2ZS5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2FyY2hpdmUuYyA+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+ZmlsZVxuIik7Ci0gICAgZXhpdCgzMyk7ICAgIAotfQotCi0vKiBUaGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gZGVjbGFyZSBleGl0LiAgU29tZXRpbWVzIGl0IHJldHVybnMKLSAgIGludCwgYW5kIHNvbWV0aW1lcyBpdCByZXR1cm5zIHZvaWQuICBTb21ldGltZXMgaXQgY2hhbmdlcyBiZXR3ZWVuCi0gICBPUyByZWxlYXNlcy4gIFRyeWluZyB0byBnZXQgaXQgZGVjbGFyZWQgY29ycmVjdGx5IGluIHRoZSBob3N0cyBmaWxlCi0gICBpcyBhIHBvaW50bGVzcyB3YXN0ZSBvZiB0aW1lLiAgKi8KLQotc3RhdGljIHZvaWQKLWNoZXdfZXhpdCAoKQotewotICBleGl0ICgwKTsKLX0KLQotaW50IERFRlVOKG1haW4sKGFjLGF2KSwKLWludCBhYyBBTkQKLWNoYXIgKmF2W10pCi17Ci0gIHVuc2lnbmVkIGludCBpOwotICBzdHJpbmdfdHlwZSBidWZmZXI7Ci0gIHN0cmluZ190eXBlIHBwdHI7Ci0KLSAgaW5pdF9zdHJpbmcoJmJ1ZmZlcik7Ci0gIGluaXRfc3RyaW5nKCZwcHRyKTsKLSAgaW5pdF9zdHJpbmcoc3RhY2srMCk7Ci0gIHRvcz1zdGFjaysxOwotICBwdHIgPSAmcHB0cjsKLSAgICAKLSAgYWRkX2ludHJpbnNpYygicHVzaF90ZXh0IiwgcHVzaF90ZXh0KTsKLSAgYWRkX2ludHJpbnNpYygiISIsIGJhbmcpOwotICBhZGRfaW50cmluc2ljKCJAIiwgYXRzaWduKTsKLSAgYWRkX2ludHJpbnNpYygiaGVsbG8iLGhlbGxvKTsgICAgCi0gIGFkZF9pbnRyaW5zaWMoInN0ZG91dCIsc3Rkb3V0Xyk7ICAgIAotICBhZGRfaW50cmluc2ljKCJzdGRlcnIiLHN0ZGVycl8pOyAgICAKLSAgYWRkX2ludHJpbnNpYygicHJpbnQiLHByaW50KTsgICAgCi0gIGFkZF9pbnRyaW5zaWMoInNraXBfcGFzdF9uZXdsaW5lIiwgc2tpcF9wYXN0X25ld2xpbmUgKTsKLSAgYWRkX2ludHJpbnNpYygiY2F0c3RyIiwgaWNhdHN0ciApOwotICBhZGRfaW50cmluc2ljKCJjb3B5X3Bhc3RfbmV3bGluZSIsIGljb3B5X3Bhc3RfbmV3bGluZSApOwotICBhZGRfaW50cmluc2ljKCJkdXAiLCBvdGhlcl9kdXAgKTsKLSAgYWRkX2ludHJpbnNpYygiZHJvcCIsIGRyb3ApOwotICBhZGRfaW50cmluc2ljKCJpZHJvcCIsIGlkcm9wKTsKLSAgYWRkX2ludHJpbnNpYygicmVtY2hhciIsIHJlbWNoYXIgKTsKLSAgYWRkX2ludHJpbnNpYygiZ2V0X3N0dWZmX2luX2NvbW1hbmQiLCBnZXRfc3R1ZmZfaW5fY29tbWFuZCApOwotICBhZGRfaW50cmluc2ljKCJkb19mYW5jeV9zdHVmZiIsIGRvX2ZhbmN5X3N0dWZmICk7Ci0gIGFkZF9pbnRyaW5zaWMoImJ1bGxldGl6ZSIsIGJ1bGxldGl6ZSApOwotICBhZGRfaW50cmluc2ljKCJjb3VyaWVyaXplIiwgY291cmllcml6ZSApOwotICAvKiBJZiB0aGUgZm9sbG93aW5nIGxpbmUgZ2l2ZXMgYW4gZXJyb3IsIGV4aXQoKSBpcyBub3QgZGVjbGFyZWQgaW4gdGhlCi0gICAgIC4uL2hvc3RzL2Zvby5oIGZpbGUgZm9yIHRoaXMgaG9zdC4gIEZpeCBpdCB0aGVyZSwgbm90IGhlcmUhICAqLwotICAvKiBObywgZG9uJ3QgZml4IGl0IGFueXdoZXJlOyBzZWUgY29tbWVudCBvbiBjaGV3X2V4aXQtLUlhbiBUYXlsb3IuICAqLwotICBhZGRfaW50cmluc2ljKCJleGl0IiwgY2hld19leGl0ICk7Ci0gIGFkZF9pbnRyaW5zaWMoInN3YXAiLCBzd2FwICk7Ci0gIGFkZF9pbnRyaW5zaWMoIm91dHB1dGRvdHMiLCBvdXRwdXRkb3RzICk7Ci0gIGFkZF9pbnRyaW5zaWMoInBhcmFtc3R1ZmYiLCBwYXJhbXN0dWZmICk7Ci0gIGFkZF9pbnRyaW5zaWMoIm1heWJlY2F0c3RyIiwgbWF5YmVjYXRzdHIgKTsKLSAgYWRkX2ludHJpbnNpYygidHJhbnNsYXRlY29tbWVudHMiLCB0cmFuc2xhdGVjb21tZW50cyApOwotICBhZGRfaW50cmluc2ljKCJraWxsX2JvZ3VzX2xpbmVzIiwga2lsbF9ib2d1c19saW5lcyk7Ci0gIGFkZF9pbnRyaW5zaWMoImluZGVudCIsIGluZGVudCk7Ci0gIGFkZF9pbnRyaW5zaWMoImludGVybmFsbW9kZSIsIGludGVybmFsbW9kZSk7Ci0gIGFkZF9pbnRyaW5zaWMoInByaW50X3N0YWNrX2xldmVsIiwgcHJpbnRfc3RhY2tfbGV2ZWwpOwotICBhZGRfaW50cmluc2ljKCJzdHJpcF90cmFpbGluZ19uZXdsaW5lcyIsIHN0cmlwX3RyYWlsaW5nX25ld2xpbmVzKTsKLSAgICAKLSAgLyogUHV0IGEgbmwgYXQgdGhlIHN0YXJ0ICovCi0gIGNhdGNoYXIoJmJ1ZmZlciwnXG4nKTsKLQotICByZWFkX2luKCZidWZmZXIsIHN0ZGluKTsgCi0gIHJlbW92ZV9ub25jb21tZW50cygmYnVmZmVyLCBwdHIpOwotICBmb3IgKGk9IDE7IGkgPCAodW5zaWduZWQgaW50KSBhYzsgaSsrKSAKLSAgewotICAgIGlmIChhdltpXVswXSA9PSAnLScpCi0gICAgewotICAgICAgaWYgKGF2W2ldWzFdID09ICdmJykKLSAgICAgIHsKLQlzdHJpbmdfdHlwZSBiOwotCUZJTEUgKmY7Ci0JaW5pdF9zdHJpbmcoJmIpOwotCi0JZiAgPSBmb3BlbihhdltpKzFdLCJyIik7Ci0JaWYgKCFmKSAKLQl7Ci0JICBmcHJpbnRmKHN0ZGVyciwiQ2FuJ3Qgb3BlbiB0aGUgaW5wdXQgZmlsZSAlc1xuIixhdltpKzFdKTsKLQkgIHJldHVybiAzMzsKLQl9Ci0KLQlyZWFkX2luKCZiLCBmKTsKLQljb21waWxlKGIucHRyKTsKLQlwZXJmb3JtKCk7CQotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXZbaV1bMV0gPT0gJ2knKSAKLSAgICAgIHsKLQlpbnRlcm5hbF93YW50ZWQgPSAxOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXZbaV1bMV0gPT0gJ3cnKSAKLSAgICAgIHsKLQl3YXJuaW5nID0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLQl1c2FnZSAoKTsKLSAgICB9Ci0gIH0gICAgICAKLSAgd3JpdGVfYnVmZmVyKHN0YWNrKzAsIHN0ZG91dCk7Ci0gIGlmICh0b3MgIT0gc3RhY2spCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZmluaXNoaW5nIHdpdGggY3VycmVudCBzdGFjayBsZXZlbCAlZFxuIiwgdG9zIC0gc3RhY2spOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JmZC9kb2MvZG9jLnN0ciBiL2JmZC9kb2MvZG9jLnN0cgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyNzZmZS4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL2RvYy5zdHIKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotOiBET0NERAotCXNraXBfcGFzdF9uZXdsaW5lCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQga2lsbF9ib2d1c19saW5lcyBjYXRzdHIKLQk7Ci0KLTogRU5EREQKLQlza2lwX3Bhc3RfbmV3bGluZQotCTsKLQotOiBFWEFNUExFCi0Jc2tpcF9wYXN0X25ld2xpbmUJCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQga2lsbF9ib2d1c19saW5lcyBkb19mYW5jeV9zdHVmZiB0cmFuc2xhdGVjb21tZW50cyAKLQljb3VyaWVyaXplIGNhdHN0cgotCi0JOwotCi06IElOT0RFIAotCSJAbm9kZSAiIGNhdHN0ciBza2lwX3Bhc3RfbmV3bGluZSBjb3B5X3Bhc3RfbmV3bGluZSBjYXRzdHIgCi0JOwotCi06IENPREVfRlJBR01FTlQKLQlFWEFNUExFIAotCTsKLQotOiBDT01NRU5UCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAotCWRyb3AKLQk7Ci0KLTogU1lOT1BTSVMKLQlza2lwX3Bhc3RfbmV3bGluZQotCSJAc3Ryb25ne1N5bm9wc2lzfVxuIiBjYXRzdHIKLQkiQGV4YW1wbGVcbiIgY2F0c3RyCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQgIAotCWtpbGxfYm9ndXNfbGluZXMKLQlpbmRlbnQKLQljYXRzdHIKLQkiQGVuZCBleGFtcGxlXG4iIGNhdHN0cgotCi0JOwotCi06IGZ1bmMKLQkiQGZpbmRleCAiCS0gYQotCXNraXBfcGFzdF9uZXdsaW5lCi0JY29weV9wYXN0X25ld2xpbmUKLQlkdXAJCS0gYSB4IHggCi0JIkBzdWJzdWJzZWN0aW9uIEBjb2RleyIgLSBhIHggeCBiIAotCXN3YXAKLQlyZW1jaGFyCi0JIn1cbiIgLSBhIHggYiB4IGMKLQljYXRzdHIgCWNhdHN0ciAJY2F0c3RyIAljYXRzdHIgCWNhdHN0ciAKLQk7Ci0KLTogRlVOQ1RJT04KLQkiQGZpbmRleCAiCS0gYQotCXNraXBfcGFzdF9uZXdsaW5lCi0JY29weV9wYXN0X25ld2xpbmUKLQlkdXAJCS0gYSB4IHggCi0JIkBzdWJzdWJzZWN0aW9uIEBjb2RleyIgLSBhIHggeCBiIAotCXN3YXAKLQlyZW1jaGFyCi0JIn1cbiIgLSBhIHggYiB4IGMKLQljYXRzdHIgCWNhdHN0ciAJY2F0c3RyIAljYXRzdHIgCWNhdHN0ciAKLQk7Ci0KLTogYm9keXRleHQKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZCAKLQlidWxsZXRpemUKLQlraWxsX2JvZ3VzX2xpbmVzCi0JZG9fZmFuY3lfc3R1ZmYKLQljb3VyaWVyaXplCi0JY2F0c3RyCi0JIlxuIiBjYXRzdHIKLQk7Ci0KLTogYXNlY3Rpb24KLQlza2lwX3Bhc3RfbmV3bGluZQotCWNhdHN0cgotCWNvcHlfcGFzdF9uZXdsaW5lIAkKLQlkb19mYW5jeV9zdHVmZiBjYXRzdHIgCQotCWJvZHl0ZXh0CQotCTsKLQotOiBTRUNUSU9OIAotCSJAc2VjdGlvbiAiIGFzZWN0aW9uICA7Ci0KLTogU1VCU0VDVElPTgotCSJAc3Vic2VjdGlvbiAiIGFzZWN0aW9uICA7Ci0KLTogU1VCU1VCU0VDVElPTgotCSJAc3Vic3Vic2VjdGlvbiAiIGFzZWN0aW9uICA7Ci0KLTogc3ViaGVhZAotCXNraXBfcGFzdF9uZXdsaW5lCi0JYm9keXRleHQKLQk7Ci0KLQotCi0JCi06IERFU0NSSVBUSU9OIAotCSJAc3Ryb25ne0Rlc2NyaXB0aW9ufUAqXG4iIGNhdHN0ciBzdWJoZWFkIDsKLQotOiBSRVRVUk5TCi0JIkBzdHJvbmd7UmV0dXJuc31AKlxuIiBjYXRzdHIgc3ViaGVhZCA7Ci0KLTogSU5URVJOQUxfRlVOQ1RJT04KLQlmdW5jIDsKLQotCi06IElOVEVSTkFMX0RFRklOSVRJT04gCi0JZnVuYyA7Ci0KLQotOiBJTlRFUk5BTAotCWZ1bmMgOwotCi06IFRZUEVERUYKLQlGVU5DVElPTiA7Ci0KLTogU0VOVU0KLQlza2lwX3Bhc3RfbmV3bGluZQotCSJIZXJlIGFyZSB0aGUgcG9zc2libGUgdmFsdWVzIGZvciBAY29kZXtlbnVtICIKLQljb3B5X3Bhc3RfbmV3bGluZSByZW1jaGFyIGNhdHN0cgotCSJ9OlxuXG4iIGNhdHN0ciBjYXRzdHIKLQk7Ci06IEVOVU0KLQlza2lwX3Bhc3RfbmV3bGluZQotCSJAZGVmZm4ge30gIgotCWNvcHlfcGFzdF9uZXdsaW5lIGNhdHN0ciBjYXRzdHIKLQk7Ci06IEVOVU1YCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQkiQGRlZmZueCB7fSAiCi0JY29weV9wYXN0X25ld2xpbmUgY2F0c3RyCi0JY2F0c3RyCi0JOwotOiBFTlVNRVEKLQlza2lwX3Bhc3RfbmV3bGluZQotCSJAZGVmZm4ge30gIgotCWNvcHlfcGFzdF9uZXdsaW5lIGNhdHN0ciBjYXRzdHIKLQlza2lwX3Bhc3RfbmV3bGluZQotCTsKLTogRU5VTUVRWAotCXNraXBfcGFzdF9uZXdsaW5lCi0JIkBkZWZmbngge30gIgotCWNvcHlfcGFzdF9uZXdsaW5lIGNhdHN0cgotCWNhdHN0cgotCXNraXBfcGFzdF9uZXdsaW5lCi0JOwotOiBFTlVNRE9DCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAotCXN0cmlwX3RyYWlsaW5nX25ld2xpbmVzCi0JY2F0c3RyCi0JIlxuQGVuZCBkZWZmblxuIiBjYXRzdHIKLQk7CmRpZmYgLS1naXQgYS9iZmQvZG9jL21ha2VmaWxlLnZtcyBiL2JmZC9kb2MvbWFrZWZpbGUudm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDg1N2MwLi4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvbWFrZWZpbGUudm1zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1DRkxBR1MgPSAvbm9vcHQvaW5jbHVkZT0oW10sWy1dLFstLi0uaW5jbHVkZV0pCi1MREZMQUdTID0gL25vbWFwCi1MRExJQlMgPSAsc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYgotCi1hbGw6IGNoZXcuZXhlCmRpZmYgLS1naXQgYS9iZmQvZG9jL3Byb3RvLnN0ciBiL2JmZC9kb2MvcHJvdG8uc3RyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDMxYzE2Li4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvcHJvdG8uc3RyCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLQotOiBTWU5PUFNJUwotCXNraXBfcGFzdF9uZXdsaW5lCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQJCi0JcGFyYW1zdHVmZgotCWluZGVudAotCW1heWJlY2F0c3RyCi07Ci0KLTogaWdub3JlCi0Jc2tpcF9wYXN0X25ld2xpbmUgCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQKLQlvdXRwdXRkb3RzCi0JbWF5YmVjYXRzdHIKLQk7Ci0KLTogQ09ERV9GUkFHTUVOVAotCWlnbm9yZSA7Ci0KLTogZXh0ZXJuYWwKLQkwIGludGVybmFsbW9kZSBpZ25vcmUgOwotCi06IGludGVybmFsIAotCTEgaW50ZXJuYWxtb2RlIGlnbm9yZSA7Ci0KLS0gaW5wdXQgc3RhY2sgeyBhIGIgfSBvdXRwdXQgYiBpZiBpbnRlcm5hbCwgYSBpZiBleHRlcm5hbAotOiBpZmludGVybmFsCi0JIiIgc3dhcCAxIGludGVybmFsbW9kZSBtYXliZWNhdHN0cgotCXN3YXAKLQkiIiBzd2FwIDAgaW50ZXJuYWxtb2RlIG1heWJlY2F0c3RyCi0JY2F0c3RyCi0JOwotCi0tIFB1dCBub3RlIGluIG91dHB1dCBzdHJpbmcsIHJlZ2FyZGxlc3Mgb2YgaW50ZXJuYWwgbW9kZS4KLTogQ09NTUVOVAotCXNraXBfcGFzdF9uZXdsaW5lCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQKLQl0cmFuc2xhdGVjb21tZW50cwotCWNhdHN0cgotCTsKLQotLSBTRU5VTSAgICBlbnVtLXR5cGUtbmFtZQotLSBFTlVNICAgICBlbnVtLW5hbWUKLS0gRU5VTVggICAgYWRkbC1lbnVtLW5hbWUKLS0gRU5VTURPQyAgZG9jIGZvciBwcmVjZWRpbmcgZW51bXMKLS0gRU5EU0VOVU0gbWF4LWVudW0tbmFtZQotCi06IG1ha2VfZW51bV9oZWFkZXIKLQlkdXAKLQkiZW51bSAiIHN3YXAgY2F0c3RyCi0JIiB7XG4iIGNhdHN0cgotCXN3YXAgIiAgX2R1bW15X2ZpcnN0XyIgc3dhcCBjYXRzdHIgY2F0c3RyCi0JIixcbiIgY2F0c3RyCi0JOwotOiBtYWtlX3N0cmluZ190YWJsZV9oZWFkZXIKLQlkdXAKLQkiI2lmZGVmIF9CRkRfTUFLRV9UQUJMRV8iIHN3YXAgY2F0c3RyIHN3YXAKLQkiXG5cbnN0YXRpYyBjb25zdCBjaGFyICpjb25zdCAiIHN3YXAgY2F0c3RyIGNhdHN0cgotCSJfbmFtZXNbXSA9IHsgXCJAQHVuaW5pdGlhbGl6ZWRAQFwiLFxuIiBjYXRzdHIKLQk7Ci06IFNFTlVNCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljb3B5X3Bhc3RfbmV3bGluZQotCXJlbWNoYXIKLQlkdXAKLQltYWtlX2VudW1faGVhZGVyCi0Jc3dhcAotCW1ha2Vfc3RyaW5nX3RhYmxlX2hlYWRlcgotCWlmaW50ZXJuYWwKLQljYXRzdHIKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZCBjYXRzdHIKLQl0cmFuc2xhdGVjb21tZW50cyA7Ci06IEVORFNFTlVNCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljb3B5X3Bhc3RfbmV3bGluZSBzdHJpcF90cmFpbGluZ19uZXdsaW5lcwotCWR1cAotCSIgICIgc3dhcCBjYXRzdHIgIiB9O1xuIiBjYXRzdHIJc3dhcAotCSIgXCJAQG92ZXJmbG93OiAiIHN3YXAgY2F0c3RyICJAQFwiLFxufTtcbiNlbmRpZlxuXG4iIGNhdHN0cgotCWlmaW50ZXJuYWwKLQljYXRzdHIKLQk7Ci06IG1ha2VfZW51bWVyYXRvcgotCSIgICIgc3dhcCBjYXRzdHIKLQkiLFxuIiBjYXRzdHIKLQk7Ci06IG1ha2VfZW51bWVyYXRvcl9zdHJpbmcKLQkiICBcIiIgc3dhcCBjYXRzdHIKLQkiXCIsXG4iIGNhdHN0cgotCTsKLTogRU5VTQotCXNraXBfcGFzdF9uZXdsaW5lCi0JY29weV9wYXN0X25ld2xpbmUKLQlyZW1jaGFyCi0JZHVwCi0JbWFrZV9lbnVtZXJhdG9yCi0Jc3dhcAotCW1ha2VfZW51bWVyYXRvcl9zdHJpbmcKLQlpZmludGVybmFsCi0JOwotOiBFTlVNWCBFTlVNIGNhdHN0ciA7Ci06IEVOVU1FUQotCXNraXBfcGFzdF9uZXdsaW5lCi0JIiNkZWZpbmUgIgotCWNvcHlfcGFzdF9uZXdsaW5lIHJlbWNoYXIKLQljYXRzdHIKLQkiICIKLQljYXRzdHIKLQljb3B5X3Bhc3RfbmV3bGluZQotCWNhdHN0cgotCSIiIHN3YXAgMCBpbnRlcm5hbG1vZGUgbWF5YmVjYXRzdHIKLQk7Ci06IEVOVU1FUVggRU5VTUVRIGNhdHN0ciA7Ci06IEVOVU1ET0MKLQlza2lwX3Bhc3RfbmV3bGluZQotCWdldF9zdHVmZl9pbl9jb21tYW5kCi0Jc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMKLQkiXG57KiAiIHN3YXAgY2F0c3RyICIgKn1cbiIgY2F0c3RyCi0JdHJhbnNsYXRlY29tbWVudHMKLQktIGRpc2NhcmQgaXQgaWYgd2UncmUgZG9pbmcgaW50ZXJuYWwgbW9kZQotCSIiIHN3YXAgMCBpbnRlcm5hbG1vZGUgbWF5YmVjYXRzdHIKLQlzd2FwCi0JY2F0c3RyIGNhdHN0cgotCTsKLTogRU5EREQgZXh0ZXJuYWwgOwotOiBTRUNUSU9OIGlnbm9yZSA7Ci06IFNVQlNFQ1RJT04gaWdub3JlIDsKLTogU1VCU1VCU0VDVElPTiBpZ25vcmUgOwotOiBJTlRFUk5BTF9ERUZJTklUSU9OIGludGVybmFsIDsKLTogREVTQ1JJUFRJT04gaWdub3JlIDsKLTogRlVOQ1RJT04gZXh0ZXJuYWwgOwotOiBSRVRVUk5TIGlnbm9yZSA7Ci06IFRZUEVERUYgZXh0ZXJuYWwgOwotOiBJTlRFUk5BTF9GVU5DVElPTiBpbnRlcm5hbCA7Ci06IElOVEVSTkFMIGludGVybmFsIDsKLTogSU5PREUgaWdub3JlIDsKZGlmZiAtLWdpdCBhL2JmZC9kd2FyZjEuYyBiL2JmZC9kd2FyZjEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjYzI2Yi4uMDAwMDAwMAotLS0gYS9iZmQvZHdhcmYxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzYgKzAsMCBAQAotLyogRFdBUkYgMSBmaW5kIG5lYXJlc3QgbGluZSAoX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUpLgotICAgQ29weXJpZ2h0IDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVdyaXR0ZW4gYnkgR2F2aW4gUm9taWctS29jaCBvZiBDeWdudXMgU29sdXRpb25zIChnYXZpbkBjeWdudXMuY29tKS4gIAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL2R3YXJmLmgiCi0KLS8qIGR3YXJmMV9kZWJ1ZyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGFsbCBkd2FyZjEgaW5mby4gKi8KLQotc3RydWN0IGR3YXJmMV9kZWJ1ZyB7Ci0KLSAgLyogVGhlIGJmZCB3ZSBhcmUgd29ya2luZyB3aXRoLiAqLwotICBiZmQqIGFiZmQ7Ci0KLSAgLyogTGlzdCBvZiBhbHJlYWR5IHBhcnNlZCBjb21waWxhdGlvbiB1bml0cy4gKi8KLSAgc3RydWN0IGR3YXJmMV91bml0KiBsYXN0VW5pdDsKLQotICAvKiBUaGUgYnVmZmVyIGZvciB0aGUgLmRlYnVnIHNlY3Rpb24uIAotICAgICBaZXJvIGluZGljYXRlcyB0aGF0IHRoZSAuZGVidWcgc2VjdGlvbiBmYWlsZWQgdG8gbG9hZC4gKi8KLSAgY2hhciogZGVidWdfc2VjdGlvbjsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24gbWVtb3J5IGJ1ZmZlci4gKi8KLSAgY2hhciogZGVidWdfc2VjdGlvbl9lbmQ7Ci0KLSAgLyogVGhlIGJ1ZmZlciBmb3IgdGhlIC5saW5lIHNlY3Rpb24uICovCi0gIGNoYXIqIGxpbmVfc2VjdGlvbjsKLQotICAvKiBFbmQgb2YgdGhhdCBidWZmZXIuICovCi0gIGNoYXIqIGxpbmVfc2VjdGlvbl9lbmQ7Ci0KLSAgLyogVGhlIGN1cnJlbnQgb3IgbmV4dCB1bnJlYWQgZGllIHdpdGhpbiB0aGUgLmRlYnVnIHNlY3Rpb24uICovCi0gIGNoYXIqIGN1cnJlbnREaWU7Ci19OwotCi0vKiBPbmUgZHdhcmYxX3VuaXQgZm9yIGVhY2ggcGFyc2VkIGNvbXBpbGF0aW9uIHVuaXQgZGllLiAqLwotCi1zdHJ1Y3QgZHdhcmYxX3VuaXQgewotICAvKiBMaW5rZWQgc3RhcnRpbmcgZnJvbSBzdGFzaC0+bGFzdFVuaXQuICovCi0gIHN0cnVjdCBkd2FyZjFfdW5pdCogcHJldjsKLQotICAvKiBOYW1lIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LiAqLwotICBjaGFyKiBuYW1lOwotCi0gIC8qIFRoZSBoaWdoZXN0IGFuZCBsb3dlc3QgYWRkcmVzcyB1c2VkIGluIHRoZSBjb21waWxhdGlvbiB1bml0LiAqLwotICB1bnNpZ25lZCBsb25nIGxvd19wYzsKLSAgdW5zaWduZWQgbG9uZyBoaWdoX3BjOwotCi0gIC8qIERvZXMgdGhpcyB1bml0IGhhdmUgYSBzdGF0ZW1lbnQgbGlzdD8gKi8KLSAgaW50IGhhc19zdG10X2xpc3Q7Ci0KLSAgLyogSWYgYW55LCB0aGUgb2Zmc2V0IG9mIHRoZSBsaW5lIG51bWJlciB0YWJsZSBpbiB0aGUgLmxpbmUgc2VjdGlvbi4gKi8KLSAgdW5zaWduZWQgbG9uZyBzdG10X2xpc3Rfb2Zmc2V0OwotCi0gIC8qIElmIG5vbi16ZXJvLCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoaWxkIG9mIHRoaXMgdW5pdC4gKi8KLSAgY2hhciogZmlyc3RfY2hpbGQ7Ci0KLSAgLyogSG93IG1hbnkgbGluZSBlbnRyaWVzPyAqLwotICB1bnNpZ25lZCBsb25nIGxpbmVfY291bnQ7Ci0KLSAgLyogVGhlIGRlY29kZWQgbGluZSBudW1iZXIgdGFibGUgKGxpbmVfY291bnQgZW50cmllcykuICovCi0gIHN0cnVjdCBsaW5lbnVtYmVyKiBsaW5lbnVtYmVyX3RhYmxlOwotCi0gIC8qIFRoZSBsaXN0IG9mIGZ1bmN0aW9ucyBpbiB0aGlzIHVuaXQuICovCi0gIHN0cnVjdCBkd2FyZjFfZnVuYyogZnVuY19saXN0OwotfTsKLQotCi0KLS8qIE9uZSBkd2FyZjFfZnVuYyBmb3IgZWFjaCBwYXJzZWQgZnVuY3Rpb24gZGllLiAgKi8KLQotc3RydWN0IGR3YXJmMV9mdW5jIHsKLSAgLyogTGlua2VkIHN0YXJ0aW5nIGZyb20gYVVuaXQtPmZ1bmNfbGlzdC4gKi8KLSAgc3RydWN0IGR3YXJmMV9mdW5jKiBwcmV2OwotICAKLSAgLyogTmFtZSBvZiBmdW5jdGlvbi4gKi8KLSAgY2hhciogbmFtZTsKLSAgCi0gIC8qIFRoZSBoaWdoZXN0IGFuZCBsb3dlc3QgYWRkcmVzcyB1c2VkIGluIHRoZSBjb21waWxhdGlvbiB1bml0LiAqLwotICB1bnNpZ25lZCBsb25nIGxvd19wYzsKLSAgdW5zaWduZWQgbG9uZyBoaWdoX3BjOwotfTsKLQotCi0vKiBVc2VkIHRvIHJldHVybiBpbmZvIGFib3V0IGEgcGFyc2VkIGRpZS4gKi8KLXN0cnVjdCBkaWVfaW5mbyB7Ci0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICB1bnNpZ25lZCBsb25nIHNpYmxpbmc7Ci0gIHVuc2lnbmVkIGxvbmcgbG93X3BjOwotICB1bnNpZ25lZCBsb25nIGhpZ2hfcGM7Ci0gIHVuc2lnbmVkIGxvbmcgc3RtdF9saXN0X29mZnNldDsKLSAgCi0gIGNoYXIqIG5hbWU7IAotICAKLSAgaW50IGhhc19zdG10X2xpc3Q7Ci0KLSAgdW5zaWduZWQgc2hvcnQgdGFnOwotfTsKLQotCi0vKiBQYXJzZWQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICovCi1zdHJ1Y3QgbGluZW51bWJlciB7Ci0gIC8qIEZpcnN0IGFkZHJlc3MgaW4gdGhlIGxpbmUuICovCi0gIHVuc2lnbmVkIGxvbmcgYWRkcjsKLQotICAvKiBUaGUgbGluZSBudW1iZXIuICovCi0gIHVuc2lnbmVkIGxvbmcgbGluZW51bWJlcjsKLX07Ci0KLQotLyogRmluZCB0aGUgZm9ybSBvZiBhbiBhdHRyLCBmcm9tIHRoZSBhdHRyIGZpZWxkLiAqLwotI2RlZmluZSBGT1JNX0ZST01fQVRUUihhdHRyKQkoKGF0dHIpICYgMHhGKQkvKiBJbXBsaWNpdGx5IHNwZWNpZmllZCAqLwotCi0KLS8qIFJldHVybiBhIG5ld2x5IGFsbG9jYXRlZCBkd2FyZjFfdW5pdC4gIEl0IHNob3VsZCBiZSBjbGVhcmVkIGFuZAotICAgdGhlbiBhdHRhY2hlZCBpbnRvIHRoZSAnc3Rhc2gnIGF0ICdzdGFzaC0+bGFzdFVuaXQnLiAqLwotCi1zdGF0aWMgc3RydWN0IGR3YXJmMV91bml0KgotYWxsb2NfZHdhcmYxX3VuaXQgKHN0YXNoKQotICBzdHJ1Y3QgZHdhcmYxX2RlYnVnKiBzdGFzaDsKLXsKLSAgc3RydWN0IGR3YXJmMV91bml0KiB4ID0gCi0gICAgKHN0cnVjdCBkd2FyZjFfdW5pdCopIGJmZF9hbGxvYyAoc3Rhc2gtPmFiZmQsIAotCQkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBkd2FyZjFfdW5pdCkpOwotICB4LT5wcmV2ID0gc3Rhc2gtPmxhc3RVbml0OwotICBzdGFzaC0+bGFzdFVuaXQgPSB4OwotCi0gIHJldHVybiB4OwotfQotCi0vKiBSZXR1cm4gYSBuZXdseSBhbGxvY2F0ZWQgZHdhcmYxX2Z1bmMuICBJdCBtdXN0IGJlIGNsZWFyZWQgYW5kCi0gICBhdHRhY2hlZCBpbnRvICdhVW5pdCcgYXQgJ2FVbml0LT5mdW5jX2xpc3QnLiAqLwotCi1zdGF0aWMgc3RydWN0IGR3YXJmMV9mdW5jKgotYWxsb2NfZHdhcmYxX2Z1bmMgKHN0YXNoLCBhVW5pdCkKLSAgICAgc3RydWN0IGR3YXJmMV9kZWJ1Zyogc3Rhc2g7Ci0gICAgIHN0cnVjdCBkd2FyZjFfdW5pdCogYVVuaXQ7Ci17Ci0gIHN0cnVjdCBkd2FyZjFfZnVuYyogeCA9IAotICAgIChzdHJ1Y3QgZHdhcmYxX2Z1bmMqKSBiZmRfYWxsb2MgKHN0YXNoLT5hYmZkLCAKLQkJCQkgIHNpemVvZiAoc3RydWN0IGR3YXJmMV9mdW5jKSk7Ci0gIHgtPnByZXYgPSBhVW5pdC0+ZnVuY19saXN0OwotICBhVW5pdC0+ZnVuY19saXN0ID0geDsKLSAgCi0gIHJldHVybiB4OwotfQotCi0vKiBwYXJzZV9kaWUgLSBwYXJzZSBhIER3YXJmMSBkaWUuCi0gICBQYXJzZSB0aGUgZGllIHN0YXJ0aW5nIGF0ICdhRGllUHRyJyBpbnRvICdhRGllSW5mbycuCi0gICAnYWJmZCcgbXVzdCBiZSB0aGUgYmZkIGZyb20gd2hpY2ggdGhlIHNlY3Rpb24gdGhhdCAnYURpZVB0cicKLSAgIHBvaW50cyB0byB3YXMgcHVsbGVkIGZyb20uIAotCi0gICBSZXR1cm4gZmFsc2UgaWYgdGhlIGRpZSBpcyBpbnZhbGlkbHkgZm9ybWF0dGVkOyB0cnVlIG90aGVyd2lzZS4gKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2RpZSAoYWJmZCwgYURpZUluZm8sIGFEaWVQdHIpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgc3RydWN0IGRpZV9pbmZvKiBhRGllSW5mbzsKLSAgICAgY2hhciogICAgICAgICAgICBhRGllUHRyOwotewotICBjaGFyKiB0aGlzX2RpZSA9IGFEaWVQdHI7Ci0gIGNoYXIqIHhwdHIgPSB0aGlzX2RpZTsKLQotICBtZW1zZXQgKGFEaWVJbmZvLDAsc2l6ZW9mKCphRGllSW5mbykpOwotCi0gIC8qIEZpcnN0IGNvbWVzIHRoZSBsZW5ndGguICovCi0gIGFEaWVJbmZvLT5sZW5ndGggPSBiZmRfZ2V0XzMyIChhYmZkLCB4cHRyKTsKLSAgeHB0ciArPSA0OwotICBpZiAoYURpZUluZm8tPmxlbmd0aCA8IDYpCi0gICAgewotICAgICAgLyogSnVzdCBwYWRkaW5nIGJ5dGVzLiAqLwotICAgICAgYURpZUluZm8tPnRhZyA9IFRBR19wYWRkaW5nOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoZW4gdGhlIHRhZy4gKi8KLSAgYURpZUluZm8tPnRhZyA9IGJmZF9nZXRfMTYgKGFiZmQsIHhwdHIpOwotICB4cHRyICs9IDI7Ci0gICAgICAKLSAgLyogVGhlbiB0aGUgYXR0cmlidXRlcy4gKi8KLSAgd2hpbGUgKHhwdHIgPCAodGhpc19kaWUgKyBhRGllSW5mby0+bGVuZ3RoKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBhdHRyOwotICAgICAgCi0gICAgICAvKiBQYXJzZSB0aGUgYXR0cmlidXRlIGJhc2VkIG9uIGl0cyBmb3JtLiAgVGhpcyBzZWN0aW9uIAotICAgICAgICAgbXVzdCBoYW5kbGUgYWxsIGR3YXJmMSBmb3JtcywgYnV0IG5lZWQgb25seSBoYW5kbGUgdGhlCi0JIGFjdHVhbCBhdHRyaWJ1dGVzIHRoYXQgd2UgY2FyZSBhYm91dC4gKi8KLQotICAgICAgYXR0ciA9IGJmZF9nZXRfMTYgKGFiZmQsIHhwdHIpOwotICAgICAgeHB0ciArPSAyOwotICAgICAgCi0gICAgICBzd2l0Y2ggKEZPUk1fRlJPTV9BVFRSIChhdHRyKSkKLQl7Ci0JY2FzZSBGT1JNX0RBVEEyOgotCSAgeHB0ciArPSAyOwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX0RBVEE0OgotCWNhc2UgRk9STV9SRUY6Ci0JICBpZiAoYXR0ciA9PSBBVF9zaWJsaW5nKQotCSAgICBhRGllSW5mby0+c2libGluZyA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotCSAgZWxzZSBpZiAoYXR0ciA9PSBBVF9zdG10X2xpc3QpCi0JICAgIHsKLQkgICAgICBhRGllSW5mby0+c3RtdF9saXN0X29mZnNldCA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotCSAgICAgIGFEaWVJbmZvLT5oYXNfc3RtdF9saXN0ID0gMTsKLQkgICAgfQotCSAgeHB0ciArPSA0OwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX0RBVEE4OgotCSAgeHB0ciArPSA4OwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX0FERFI6Ci0JICBpZiAoYXR0ciA9PSBBVF9sb3dfcGMpCi0JICAgIGFEaWVJbmZvLT5sb3dfcGMgPSBiZmRfZ2V0XzMyIChhYmZkLCB4cHRyKTsKLQkgIGVsc2UgaWYgKGF0dHIgPT0gQVRfaGlnaF9wYykKLQkgICAgYURpZUluZm8tPmhpZ2hfcGMgPSBiZmRfZ2V0XzMyIChhYmZkLCB4cHRyKTsKLQkgIHhwdHIgKz0gNDsKLQkgIGJyZWFrOwotCWNhc2UgRk9STV9CTE9DSzI6Ci0JICB4cHRyICs9IDIgKyBiZmRfZ2V0XzE2IChhYmZkLCB4cHRyKTsKLQkgIGJyZWFrOwotCWNhc2UgRk9STV9CTE9DSzQ6Ci0JICB4cHRyICs9IDQgKyBiZmRfZ2V0XzMyIChhYmZkLCB4cHRyKTsKLQkgIGJyZWFrOwotCWNhc2UgRk9STV9TVFJJTkc6Ci0JICBpZiAoYXR0ciA9PSBBVF9uYW1lKQotCSAgICBhRGllSW5mby0+bmFtZSA9IHhwdHI7Ci0JICB4cHRyICs9IHN0cmxlbiAoeHB0cikgKyAxOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgYSBkd2FyZjEgbGluZSBudW1iZXIgdGFibGUgZm9yICdhVW5pdC0+c3RtdF9saXN0X29mZnNldCcKLSAgIGludG8gJ2FVbml0LT5saW5lbnVtYmVyX3RhYmxlJy4gIFJldHVybiBmYWxzZSBpZiBhbiBlcnJvciAKLSAgIG9jY3VyczsgdHJ1ZSBvdGhlcndpc2UuICovCi0gIAotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2xpbmVfdGFibGUgKHN0YXNoLCBhVW5pdCkKLSAgc3RydWN0IGR3YXJmMV9kZWJ1Zyogc3Rhc2g7Ci0gIHN0cnVjdCBkd2FyZjFfdW5pdCogYVVuaXQ7Ci17Ci0gIGNoYXIqIHhwdHI7Ci0KLSAgLyogTG9hZCB0aGUgIi5saW5lIiBzZWN0aW9uIGZyb20gdGhlIGJmZCBpZiB3ZSBoYXZlbid0IGFscmVhZHkuICovIAotICBpZiAoc3Rhc2gtPmxpbmVfc2VjdGlvbiA9PSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICptc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotICAgICAgCi0gICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0YXNoLT5hYmZkLCAiLmxpbmUiKTsKLSAgICAgIGlmICghIG1zZWMpCi0JcmV0dXJuIGZhbHNlOwotCSAgCi0gICAgICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChtc2VjKTsKLSAgICAgIHN0YXNoLT5saW5lX3NlY3Rpb24gPSAodW5zaWduZWQgY2hhciopIGJmZF9hbGxvYyAoc3Rhc2gtPmFiZmQsIHNpemUpOwotICAgICAgCi0gICAgICBpZiAoISBzdGFzaC0+bGluZV9zZWN0aW9uKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChzdGFzaC0+YWJmZCwgbXNlYywgc3Rhc2gtPmxpbmVfc2VjdGlvbiwgMCwgc2l6ZSkpCi0JewotCSAgc3Rhc2gtPmxpbmVfc2VjdGlvbiA9IDA7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzdGFzaC0+bGluZV9zZWN0aW9uX2VuZCA9IHN0YXNoLT5saW5lX3NlY3Rpb24gKyBzaXplOwotICAgIH0KLQotICB4cHRyID0gc3Rhc2gtPmxpbmVfc2VjdGlvbiArIGFVbml0LT5zdG10X2xpc3Rfb2Zmc2V0OwotICBpZiAoeHB0ciA8IHN0YXNoLT5saW5lX3NlY3Rpb25fZW5kKQotICAgIHsKLSAgICAgIGludCBlYWNoTGluZTsKLQotICAgICAgY2hhciogdGJsZW5kOwotICAgICAgdW5zaWduZWQgbG9uZyBiYXNlOwotCi0gICAgICAvKiBGaXJzdCBjb21lcyB0aGUgbGVuZ3RoLiAqLwotICAgICAgdGJsZW5kID0gYmZkX2dldF8zMiAoc3Rhc2gtPmFiZmQsIHhwdHIpICsgeHB0cjsKLSAgICAgIHhwdHIgKz0gNDsKLQotICAgICAgLyogVGhlbiB0aGUgYmFzZSBhZGRyZXNzIGZvciBlYWNoIGFkZHJlc3MgaW4gdGhlIHRhYmxlLiAqLwotICAgICAgYmFzZSA9IGJmZF9nZXRfMzIgKHN0YXNoLT5hYmZkLCB4cHRyKTsKLSAgICAgIHhwdHIgKz0gNDsKLQotICAgICAgLyogSG93IG1hbnkgbGluZSBlbnRyeXM/Ci0JIDEwID0gNCAobGluZSBudW1iZXIpICsgMiAocG9zIGluIGxpbmUpICsgNCAoYWRkcmVzcyBpbiBsaW5lKSAqLwotICAgICAgYVVuaXQtPmxpbmVfY291bnQgPSAodGJsZW5kIC0geHB0cikgLyAxMDsKLQotICAgICAgLyogQWxsb2NhdGUgYW4gYXJyYXkgZm9yIHRoZSBlbnRyaWVzLiAqLwotICAgICAgYVVuaXQtPmxpbmVudW1iZXJfdGFibGUgPSAoc3RydWN0IGxpbmVudW1iZXIqKQotCWJmZF9hbGxvYyAoc3Rhc2gtPmFiZmQsIAotCQkgICBzaXplb2YgKHN0cnVjdCBsaW5lbnVtYmVyKSAqIGFVbml0LT5saW5lX2NvdW50KTsKLQkKLSAgICAgIGZvciAoZWFjaExpbmUgPSAwOyBlYWNoTGluZSA8IGFVbml0LT5saW5lX2NvdW50OyBlYWNoTGluZSsrKQotCXsKLQkgIC8qIEEgbGluZSBudW1iZXIuICovCi0JICBhVW5pdC0+bGluZW51bWJlcl90YWJsZVtlYWNoTGluZV0ubGluZW51bWJlcgotCSAgICA9IGJmZF9nZXRfMzIgKHN0YXNoLT5hYmZkLCB4cHRyKTsKLQkgIHhwdHIgKz0gNDsKLQotCSAgLyogU2tpcCB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSBsaW5lLiAqLwotCSAgeHB0ciArPSAyOwotCi0JICAvKiBBbmQgZmluYWxseSB0aGUgYWRkcmVzcy4gKi8KLQkgIGFVbml0LT5saW5lbnVtYmVyX3RhYmxlW2VhY2hMaW5lXS5hZGRyIAotCSAgICA9IGJhc2UgKyBiZmRfZ2V0XzMyIChzdGFzaC0+YWJmZCwgeHB0cik7Ci0JICB4cHRyICs9IDQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgZWFjaCBmdW5jdGlvbiBkaWUgaW4gYSBjb21waWxhdGlvbiB1bml0ICdhVW5pdCcuCi0gICBUaGUgZmlyc3QgY2hpbGQgZGllIG9mICdhVW5pdCcgc2hvdWxkIGJlIGluICdhVW5pdC0+Zmlyc3RfY2hpbGQnLAotICAgdGhlIHJlc3VsdCBpcyBwbGFjZWQgaW4gJ2FVbml0LT5mdW5jX2xpc3QnLgotICAgUmV0dXJuIGZhbHNlIGlmIGVycm9yOyB0cnVlIG90aGVyd2lzZS4gKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2Z1bmN0aW9uc19pbl91bml0IChzdGFzaCwgYVVuaXQpCi0gICAgIHN0cnVjdCBkd2FyZjFfZGVidWcqIHN0YXNoOwotICAgICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIGFVbml0OwotewotICBjaGFyKiBlYWNoRGllOwotCi0gIGlmIChhVW5pdC0+Zmlyc3RfY2hpbGQpCi0gICAgZm9yIChlYWNoRGllID0gYVVuaXQtPmZpcnN0X2NoaWxkOwotCSBlYWNoRGllIDwgc3Rhc2gtPmRlYnVnX3NlY3Rpb25fZW5kOwotCSApCi0gICAgICB7Ci0Jc3RydWN0IGRpZV9pbmZvIGVhY2hEaWVJbmZvOwotCQotCWlmICghIHBhcnNlX2RpZSAoc3Rhc2gtPmFiZmQsICZlYWNoRGllSW5mbywgZWFjaERpZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0JCi0JaWYgKGVhY2hEaWVJbmZvLnRhZyA9PSBUQUdfZ2xvYmFsX3N1YnJvdXRpbmUKLQkgICAgfHwgZWFjaERpZUluZm8udGFnID09IFRBR19zdWJyb3V0aW5lCi0JICAgIHx8IGVhY2hEaWVJbmZvLnRhZyA9PSBUQUdfaW5saW5lZF9zdWJyb3V0aW5lCi0JICAgIHx8IGVhY2hEaWVJbmZvLnRhZyA9PSBUQUdfZW50cnlfcG9pbnQpCi0JICB7Ci0JICAgIHN0cnVjdCBkd2FyZjFfZnVuYyogYUZ1bmMgPSBhbGxvY19kd2FyZjFfZnVuYyAoc3Rhc2gsYVVuaXQpOwotCSAgICAKLQkgICAgYUZ1bmMtPm5hbWUgPSBlYWNoRGllSW5mby5uYW1lOwotCSAgICBhRnVuYy0+bG93X3BjID0gZWFjaERpZUluZm8ubG93X3BjOwotCSAgICBhRnVuYy0+aGlnaF9wYyA9IGVhY2hEaWVJbmZvLmhpZ2hfcGM7Ci0JICB9Ci0JCi0JLyogTW92ZSB0byBuZXh0IHNpYmxpbmcsIGlmIG5vbmUsIGVuZCBsb29wICovCi0JaWYgKGVhY2hEaWVJbmZvLnNpYmxpbmcpCi0JICBlYWNoRGllID0gc3Rhc2gtPmRlYnVnX3NlY3Rpb24gKyBlYWNoRGllSW5mby5zaWJsaW5nOwotCWVsc2UKLQkgIGJyZWFrOwotICAgICAgfQotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB0byAnYWRkcicgaW4gJ2FVbml0Jy4KLSAgIFJldHVybiB3aGV0aGVyIHdlIGZvdW5kIHRoZSBsaW5lIChvciBhIGZ1bmN0aW9uKSB3aXRob3V0IGVycm9yLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotZHdhcmYxX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUgKHN0YXNoLCBhVW5pdCwgYWRkciwgCi0JCSAgICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCSAgICAgICBsaW5lbnVtYmVyX3B0cikKLSAgc3RydWN0IGR3YXJmMV9kZWJ1Zyogc3Rhc2g7Ci0gIHN0cnVjdCBkd2FyZjFfdW5pdCogYVVuaXQ7Ci0gIHVuc2lnbmVkIGxvbmcgYWRkcjsKLSAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gIHVuc2lnbmVkIGludCAqbGluZW51bWJlcl9wdHI7Ci17Ci0gIGludCBsaW5lX3AgPSBmYWxzZTsKLSAgaW50IGZ1bmNfcCA9IGZhbHNlOwotCi0gIGlmIChhVW5pdC0+bG93X3BjIDw9IGFkZHIgJiYgYWRkciA8IGFVbml0LT5oaWdoX3BjKQotICAgIHsKLSAgICAgIGlmIChhVW5pdC0+aGFzX3N0bXRfbGlzdCkKLQl7Ci0JICBpbnQgaTsKLQkgIHN0cnVjdCBkd2FyZjFfZnVuYyogZWFjaEZ1bmM7Ci0KLQkgIGlmICghIGFVbml0LT5saW5lbnVtYmVyX3RhYmxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgcGFyc2VfbGluZV90YWJsZSAoc3Rhc2gsIGFVbml0KSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmICghIGFVbml0LT5mdW5jX2xpc3QpCi0JICAgIHsKLQkgICAgICBpZiAoISBwYXJzZV9mdW5jdGlvbnNfaW5fdW5pdCAoc3Rhc2gsIGFVbml0KSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBhVW5pdC0+bGluZV9jb3VudDsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKGFVbml0LT5saW5lbnVtYmVyX3RhYmxlW2ldLmFkZHIgPD0gYWRkcgotCQkgICYmIGFkZHIgPCBhVW5pdC0+bGluZW51bWJlcl90YWJsZVtpKzFdLmFkZHIpCi0JCXsKLQkJICAqZmlsZW5hbWVfcHRyID0gYVVuaXQtPm5hbWU7Ci0JCSAgKmxpbmVudW1iZXJfcHRyID0gYVVuaXQtPmxpbmVudW1iZXJfdGFibGVbaV0ubGluZW51bWJlcjsKLQkJICBsaW5lX3AgPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgZm9yIChlYWNoRnVuYyA9IGFVbml0LT5mdW5jX2xpc3Q7IAotCSAgICAgICBlYWNoRnVuYzsgCi0JICAgICAgIGVhY2hGdW5jID0gZWFjaEZ1bmMtPnByZXYpCi0JICAgIHsKLQkgICAgICBpZiAoZWFjaEZ1bmMtPmxvd19wYyA8PSBhZGRyCi0JCSAgJiYgYWRkciA8IGVhY2hGdW5jLT5oaWdoX3BjKQotCQl7Ci0JCSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBlYWNoRnVuYy0+bmFtZTsKLQkJICBmdW5jX3AgPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiBsaW5lX3AgfHwgZnVuY19wOwotfQotCi0KLQotCi0vKiBUaGUgRFdBUkYgMSB2ZXJzaW9uIG9mIGZpbmRfbmVhcmVzdCBsaW5lLgotICAgUmV0dXJuIHRydWUgaWYgdGhlIGxpbmUgaXMgZm91bmQgd2l0aG91dCBlcnJvci4gKi8KLQotYm9vbGVhbgotX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgbGluZW51bWJlcl9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZW51bWJlcl9wdHI7Ci17Ci0gIHN0cnVjdCBkd2FyZjFfZGVidWcgKnN0YXNoID0gZWxmX3RkYXRhIChhYmZkKS0+ZHdhcmYxX2ZpbmRfbGluZV9pbmZvOwotCi0gIHN0cnVjdCBkd2FyZjFfdW5pdCogZWFjaFVuaXQ7Ci0KLSAgLyogV2hhdCBhZGRyZXNzIGFyZSB3ZSBsb29raW5nIGZvcj8gKi8KLSAgYmZkX3ZtYSBhZGRyID0gb2Zmc2V0ICsgc2VjdGlvbi0+dm1hOwotCi0gICpmaWxlbmFtZV9wdHIgPSBOVUxMOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IE5VTEw7Ci0gICpsaW5lbnVtYmVyX3B0ciA9IDA7Ci0gIAotCi0gIGlmICghIHN0YXNoKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICptc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotICAgICAgCi0gICAgICBzdGFzaCA9IGVsZl90ZGF0YSAoYWJmZCktPmR3YXJmMV9maW5kX2xpbmVfaW5mbyA9Ci0JKHN0cnVjdCBkd2FyZjFfZGVidWcqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkd2FyZjFfZGVidWcpKTsKLSAgICAgIAotICAgICAgaWYgKCEgc3Rhc2gpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWciKTsKLSAgICAgIGlmICghIG1zZWMpCi0JewotCSAgLyogTm8gZHdhcmYxIGluZm8uICBOb3RlIHRoYXQgYXQgdGhpcyBwb2ludCB0aGUgc3Rhc2gKLQkgICAgIGhhcyBiZWVuIGFsbG9jYXRlZCwgYnV0IGNvbnRhaW5zIHplcm9zLCB0aGlzIGxldHMKLQkgICAgIGZ1dHVyZSBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGZhaWwgcXVpY2tlci4gKi8KLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKG1zZWMpOwotICAgICAgc3Rhc2gtPmRlYnVnX3NlY3Rpb24gPSAodW5zaWduZWQgY2hhciopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gICAgICAKLSAgICAgIGlmICghIHN0YXNoLT5kZWJ1Z19zZWN0aW9uKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBtc2VjLCBzdGFzaC0+ZGVidWdfc2VjdGlvbiwgMCwgc2l6ZSkpCi0JewotCSAgc3Rhc2gtPmRlYnVnX3NlY3Rpb24gPSAwOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgc3Rhc2gtPmRlYnVnX3NlY3Rpb25fZW5kID0gc3Rhc2gtPmRlYnVnX3NlY3Rpb24gKyBzaXplOwotICAgICAgc3Rhc2gtPmN1cnJlbnREaWUgPSBzdGFzaC0+ZGVidWdfc2VjdGlvbjsKLSAgICAgIHN0YXNoLT5hYmZkID0gYWJmZDsKLSAgICB9Ci0KLSAgLyogQSBudWxsIGRlYnVnX3NlY3Rpb24gaW5kaWNhdGVzIHRoYXQgdGhlcmUgd2FzIG5vIGR3YXJmMSBpbmZvCi0gICAgIG9yIHRoYXQgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBzZXR0aW5nIHVwIHRoZSBzdGFzaC4gKi8KLQotICBpZiAoISBzdGFzaC0+ZGVidWdfc2VjdGlvbikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotCi0gIC8qIExvb2sgYXQgdGhlIHByZXZpb3VzbHkgcGFyc2VkIHVuaXRzIHRvIHNlZSBpZiBhbnkgY29udGFpbgotICAgICB0aGUgYWRkci4gKi8KLSAgZm9yIChlYWNoVW5pdCA9IHN0YXNoLT5sYXN0VW5pdDsgZWFjaFVuaXQ7IGVhY2hVbml0ID0gZWFjaFVuaXQtPnByZXYpCi0gICAgewotICAgICAgaWYgKGVhY2hVbml0LT5sb3dfcGMgPD0gYWRkciAmJiBhZGRyIDwgZWFjaFVuaXQtPmhpZ2hfcGMpCi0JcmV0dXJuIGR3YXJmMV91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChzdGFzaCwgZWFjaFVuaXQsIGFkZHIsCi0JCQkJCSAgICAgIGZpbGVuYW1lX3B0ciwgCi0JCQkJCSAgICAgIGZ1bmN0aW9ubmFtZV9wdHIsIAotCQkJCQkgICAgICBsaW5lbnVtYmVyX3B0cik7Ci0gICAgfQotCi0gIHdoaWxlIChzdGFzaC0+Y3VycmVudERpZSA8IHN0YXNoLT5kZWJ1Z19zZWN0aW9uX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGllX2luZm8gYURpZUluZm87Ci0KLSAgICAgIGlmICghIHBhcnNlX2RpZSAoc3Rhc2gtPmFiZmQsICZhRGllSW5mbywgc3Rhc2gtPmN1cnJlbnREaWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgaWYgKGFEaWVJbmZvLnRhZyA9PSBUQUdfY29tcGlsZV91bml0KQotCXsKLQkgIHN0cnVjdCBkd2FyZjFfdW5pdCogYVVuaXQKLQkgICAgPSBhbGxvY19kd2FyZjFfdW5pdCAoc3Rhc2gpOwotCSAgCi0JICBhVW5pdC0+bmFtZSA9IGFEaWVJbmZvLm5hbWU7Ci0JICBhVW5pdC0+bG93X3BjID0gYURpZUluZm8ubG93X3BjOwotCSAgYVVuaXQtPmhpZ2hfcGMgPSBhRGllSW5mby5oaWdoX3BjOwotCSAgYVVuaXQtPmhhc19zdG10X2xpc3QgPSBhRGllSW5mby5oYXNfc3RtdF9saXN0OwotCSAgYVVuaXQtPnN0bXRfbGlzdF9vZmZzZXQgPSBhRGllSW5mby5zdG10X2xpc3Rfb2Zmc2V0OwotCSAgCi0JICAvKiBBIGRpZSBoYXMgYSBjaGlsZCBpZiBpdCdzIGZvbGxvd2VkIGJ5IGEgZGllIHRoYXQgaXMKLQkgICAgIG5vdCBpdCdzIHNpYmxpbmcuICovCi0JICBpZiAoYURpZUluZm8uc2libGluZyAKLQkgICAgICAmJiBzdGFzaC0+Y3VycmVudERpZSArIGFEaWVJbmZvLmxlbmd0aCAKLSAgICAgICAgICAgICAgICAgICAgPCBzdGFzaC0+ZGVidWdfc2VjdGlvbl9lbmQKLQkgICAgICAmJiBzdGFzaC0+Y3VycmVudERpZSArIGFEaWVJbmZvLmxlbmd0aCAKLQkgICAgICAgICAgICAhPSBzdGFzaC0+ZGVidWdfc2VjdGlvbiArIGFEaWVJbmZvLnNpYmxpbmcpCi0JICAgIGFVbml0LT5maXJzdF9jaGlsZCA9IHN0YXNoLT5jdXJyZW50RGllICsgYURpZUluZm8ubGVuZ3RoOwotCSAgZWxzZQotCSAgICBhVW5pdC0+Zmlyc3RfY2hpbGQgPSAwOwotCi0JICBpZiAoYVVuaXQtPmxvd19wYyA8PSBhZGRyICYmIGFkZHIgPCBhVW5pdC0+aGlnaF9wYykKLQkgICAgcmV0dXJuIGR3YXJmMV91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChzdGFzaCwgYVVuaXQsIGFkZHIsIAotCQkJCQkJICBmaWxlbmFtZV9wdHIsIAotCQkJCQkJICBmdW5jdGlvbm5hbWVfcHRyLCAKLQkJCQkJCSAgbGluZW51bWJlcl9wdHIpOwotCX0KLSAgICAgIAotICAgICAgaWYgKGFEaWVJbmZvLnNpYmxpbmcgIT0gMCkKLQlzdGFzaC0+Y3VycmVudERpZSA9IHN0YXNoLT5kZWJ1Z19zZWN0aW9uICsgYURpZUluZm8uc2libGluZzsKLSAgICAgIGVsc2UKLQlzdGFzaC0+Y3VycmVudERpZSArPSBhRGllSW5mby5sZW5ndGg7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiBFT0YgKi8KZGlmZiAtLWdpdCBhL2JmZC9kd2FyZjIuYyBiL2JmZC9kd2FyZjIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhN2NmZi4uMDAwMDAwMAotLS0gYS9iZmQvZHdhcmYyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDY2ICswLDAgQEAKLS8qIERXQVJGIDIgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBBZGFwdGVkIGZyb20gZ2RiL2R3YXJmMnJlYWQuYyBieSBHYXZpbiBLb2NoIG9mIEN5Z251cyBTb2x1dGlvbnMKLSAgIChnYXZpbkBjeWdudXMuY29tKS4KLQotICAgRnJvbSB0aGUgZHdhcmYycmVhZC5jIGhlYWRlcjoKLSAgIEFkYXB0ZWQgYnkgR2FyeSBGdW5jayAoZ2FyeUBpbnRyZXBpZC5jb20pLCBJbnRyZXBpZCBUZWNobm9sb2d5LAotICAgSW5jLiAgd2l0aCBzdXBwb3J0IGZyb20gRmxvcmlkYSBTdGF0ZSBVbml2ZXJzaXR5ICh1bmRlciBjb250cmFjdAotICAgd2l0aCB0aGUgQWRhIEpvaW50IFByb2dyYW0gT2ZmaWNlKSwgYW5kIFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAgIEluaXRpYWwgY29udHJpYnV0aW9uIGJ5IEJyZW50IEJlbnNvbiwgSGFycmlzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4sCi0gICBiYXNlZCBvbiBGcmVkIEZpc2gncyAoQ3lnbnVzIFN1cHBvcnQpIGltcGxlbWVudGF0aW9uIG9mIERXQVJGIDEKLSAgIHN1cHBvcnQgaW4gZHdhcmZyZWFkLmMKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci1XSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9kd2FyZjIuaCIKLQotLyogVGhlIGRhdGEgaW4gdGhlIC5kZWJ1Z19saW5lIHN0YXRlbWVudCBwcm9sb2d1ZSBsb29rcyBsaWtlIHRoaXMuICAqLwotc3RydWN0IGxpbmVfaGVhZAotICB7Ci0gICAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aDsKLSAgICB1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uOwotICAgIHVuc2lnbmVkIGludCBwcm9sb2d1ZV9sZW5ndGg7Ci0gICAgdW5zaWduZWQgY2hhciBtaW5pbXVtX2luc3RydWN0aW9uX2xlbmd0aDsKLSAgICB1bnNpZ25lZCBjaGFyIGRlZmF1bHRfaXNfc3RtdDsKLSAgICBpbnQgbGluZV9iYXNlOwotICAgIHVuc2lnbmVkIGNoYXIgbGluZV9yYW5nZTsKLSAgICB1bnNpZ25lZCBjaGFyIG9wY29kZV9iYXNlOwotICAgIHVuc2lnbmVkIGNoYXIgKnN0YW5kYXJkX29wY29kZV9sZW5ndGhzOwotICB9OwotCi0vKiBBdHRyaWJ1dGVzIGhhdmUgYSBuYW1lIGFuZCBhIHZhbHVlICovCi1zdHJ1Y3QgYXR0cmlidXRlCi0gIHsKLSAgICBlbnVtIGR3YXJmX2F0dHJpYnV0ZSBuYW1lOwotICAgIGVudW0gZHdhcmZfZm9ybSBmb3JtOwotICAgIHVuaW9uCi0gICAgICB7Ci0JY2hhciAqc3RyOwotCXN0cnVjdCBkd2FyZl9ibG9jayAqYmxrOwotCXVuc2lnbmVkIGludCB1bnNuZDsKLQlpbnQgc25kOwotCWJmZF92bWEgYWRkcjsKLSAgICAgIH0KLSAgICB1OwotICB9OwotCi0vKiBHZXQgYXQgcGFydHMgb2YgYW4gYXR0cmlidXRlIHN0cnVjdHVyZSAqLwotCi0jZGVmaW5lIERXX1NUUklORyhhdHRyKSAgICAoKGF0dHIpLT51LnN0cikKLSNkZWZpbmUgRFdfVU5TTkQoYXR0cikgICAgICgoYXR0ciktPnUudW5zbmQpCi0jZGVmaW5lIERXX0JMT0NLKGF0dHIpICAgICAoKGF0dHIpLT51LmJsaykKLSNkZWZpbmUgRFdfU05EKGF0dHIpICAgICAgICgoYXR0ciktPnUuc25kKQotI2RlZmluZSBEV19BRERSKGF0dHIpCSAgICgoYXR0ciktPnUuYWRkcikKLQotLyogQmxvY2tzIGFyZSBhIGJ1bmNoIG9mIHVudHlwZWQgYnl0ZXMuICovCi1zdHJ1Y3QgZHdhcmZfYmxvY2sKLSAgewotICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgIGNoYXIgKmRhdGE7Ci0gIH07Ci0KLQotc3RydWN0IGR3YXJmMl9kZWJ1ZyB7Ci0KLSAgLyogQSBsaXN0IG9mIGFsbCBwcmV2aW91c2x5IHJlYWQgY29tcF91bml0cy4gKi8KLSAgc3RydWN0IGNvbXBfdW5pdCogYWxsX2NvbXBfdW5pdHM7Ci0KLSAgLyogVGhlIG5leHQgdW5yZWFkIGNvbXBpbGF0aW9uIHVuaXQgd2l0aGluIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uLgotICAgICBaZXJvIGluZGljYXRlcyB0aGF0IHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uIGhhcyBub3QgYmVlbiBsb2FkZWQKLSAgICAgaW50byBhIGJ1ZmZlciB5ZXQuKi8KLSAgY2hhciogaW5mb19wdHI7Ci0KLSAgLyogUG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uIG1lbW9yeSBidWZmZXIuICovCi0gIGNoYXIqIGluZm9fcHRyX2VuZDsKLQotICAvKiBQb2ludGVyIHRvIHRoZSAuZGVidWdfYWJicmV2IHNlY3Rpb24gbG9hZGVkIGludG8gbWVtb3J5LiAqLwotICBjaGFyKiBkd2FyZl9hYmJyZXZfYnVmZmVyOwotCi0gIC8qIExlbmd0aCBvZiB0aGUgbG9hZGVkIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbi4gKi8KLSAgdW5zaWduZWQgbG9uZyBkd2FyZl9hYmJyZXZfc2l6ZTsKLX07Ci0KLQotCi0vKiBBIG1pbmltYWwgZGVjb2Rpbmcgb2YgRFdBUkYyIGNvbXBpbGF0aW9uIHVuaXRzLiAgV2Ugb25seSBkZWNvZGUKLSAgIHdoYXQncyBuZWVkZWQgdG8gZ2V0IHRvIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gKi8KLQotc3RydWN0IGNvbXBfdW5pdCB7Ci0KLSAgLyogQ2hhaW4gdGhlIHByZXZpb3VzbHkgcmVhZCBjb21waWxhdGlvbiB1bml0cy4gKi8KLSAgc3RydWN0IGNvbXBfdW5pdCogbmV4dF91bml0OwotCi0gIC8qIEtlZXAgdGhlIGJkZiBjb252ZW5pZW50IChmb3IgbWVtb3J5IGFsbG9jYXRpb24pLiAqLwotICBiZmQqIGFiZmQ7Ci0KLSAgLyogVGhlIGxvd2VzdCBhbmQgaGlnZXN0IGFkZHJlc3NlcyBjb250YWluZWQgaW4gdGhpcyBjb21waWxhdGlvbgotICAgICB1bml0IGFzIHNwZWNpZmllZCBpbiB0aGUgY29tcGlsYXRpb24gdW5pdCBoZWFkZXIuICovCi0gIGJmZF92bWEgbG93OwotICBiZmRfdm1hIGhpZ2g7Ci0KLSAgLyogVGhlIERXX0FUX25hbWUgYXR0cmlidXRlIChmb3IgZXJyb3IgbWVzc2FnZXMpLiAqLwotICBjaGFyKiBuYW1lOwotCi0gIC8qIFRoZSBhYmJyZXYgaGFzaCB0YWJsZS4gKi8KLSAgc3RydWN0IGFiYnJldl9pbmZvKiogYWJicmV2czsKLQotICAvKiBOb3RlIHRoYXQgYW4gZXJyb3Igd2FzIGZvdW5kIGJ5IGNvbXBfdW5pdF9maW5kX25lYXJlc3RfbGluZS4gKi8KLSAgaW50IGVycm9yOwotCi0gIC8qIFRoZSBEV19BVF9jb21wX2RpciBhdHRyaWJ1dGUgKi8KLSAgY2hhciogY29tcF9kaXI7Ci0KLSAgLyogVHJ1ZSBpZiB0aGVyZSBpcyBhIGxpbmUgbnVtYmVyIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbXAuIHVuaXQuICovCi0gIGludCBzdG10bGlzdDsKLSAgCi0gIC8qIFRoZSBvZmZzZXQgaW50byAuZGVidWdfbGluZSBvZiB0aGUgbGluZSBudW1iZXIgdGFibGUuICovCi0gIHVuc2lnbmVkIGxvbmcgbGluZV9vZmZzZXQ7Ci0KLSAgLyogUG9pbnRlciB0byB0aGUgZmlyc3QgY2hpbGQgZGllIGZvciB0aGUgY29tcCB1bml0LiAqLwotICBjaGFyICpmaXJzdF9jaGlsZF9kaWVfcHRyOwotCi0gIC8qIFRoZSBlbmQgb2YgdGhlIGNvbXAgdW5pdC4gKi8KLSAgY2hhciAqZW5kX3B0cjsKLQotICAvKiBUaGUgZGVjb2RlZCBsaW5lIG51bWJlciwgTlVMTCBpZiBub3QgeWV0IGRlY29kZWQuICovCi0gIHN0cnVjdCBsaW5lX2luZm9fdGFibGUqIGxpbmVfdGFibGU7Ci0KLSAgLyogQSBsaXN0IG9mIHRoZSBmdW5jdGlvbnMgZm91bmQgaW4gdGhpcyBjb21wLiB1bml0LiAqLwotICBzdHJ1Y3QgZnVuY2luZm8qIGZ1bmN0aW9uX3RhYmxlOyAKLQotICAvKiBBZGRyZXNzIHNpemUgZm9yIHRoaXMgdW5pdCAtIGZyb20gdW5pdCBoZWFkZXIgKi8KLSAgdW5zaWduZWQgY2hhciBhZGRyX3NpemU7Ci19OwotCi0KLQotLyogVkVSQkFUSU0gCi0gICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHVwIHRvIHRoZSBFTkQgVkVSQkFUSU0gbWFyayBhcmUgCi0gICBjb3BpZWQgZGlyZWN0bHkgZnJvbSBkd2FyZjJyZWFkLmMuICovCi0KLS8qIHJlYWQgZHdhcmYgaW5mb3JtYXRpb24gZnJvbSBhIGJ1ZmZlciAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzFfYnl0ZSAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci19Ci0KLXN0YXRpYyBpbnQKLXJlYWRfMV9zaWduZWRfYnl0ZSAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfc2lnbmVkXzggKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzJfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBub3QgdXNlZC4gICovCi0KLXN0YXRpYyBpbnQKLXJlYWRfMl9zaWduZWRfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzRfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBub3QgdXNlZC4gICovCi0KLXN0YXRpYyBpbnQKLXJlYWRfNF9zaWduZWRfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzhfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotc3RhdGljIGNoYXIgKgotcmVhZF9uX2J5dGVzIChhYmZkLCBidWYsIHNpemUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIC8qIElmIHRoZSBzaXplIG9mIGEgaG9zdCBjaGFyIGlzIDggYml0cywgd2UgY2FuIHJldHVybiBhIHBvaW50ZXIKLSAgICAgdG8gdGhlIGJ1ZmZlciwgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gY29weSB0aGUgZGF0YSB0byBhIGJ1ZmZlcgotICAgICBhbGxvY2F0ZWQgb24gdGhlIHRlbXBvcmFyeSBvYnN0YWNrLiAgKi8KLSAgcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNoYXIgKgotcmVhZF9zdHJpbmcgKGFiZmQsIGJ1ZiwgYnl0ZXNfcmVhZF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqYnVmOwotICAgICB1bnNpZ25lZCBpbnQgKmJ5dGVzX3JlYWRfcHRyOwotewotICAvKiBJZiB0aGUgc2l6ZSBvZiBhIGhvc3QgY2hhciBpcyA4IGJpdHMsIHdlIGNhbiByZXR1cm4gYSBwb2ludGVyCi0gICAgIHRvIHRoZSBzdHJpbmcsIG90aGVyd2lzZSB3ZSBoYXZlIHRvIGNvcHkgdGhlIHN0cmluZyB0byBhIGJ1ZmZlcgotICAgICBhbGxvY2F0ZWQgb24gdGhlIHRlbXBvcmFyeSBvYnN0YWNrLiAgKi8KLSAgaWYgKCpidWYgPT0gJ1wwJykKLSAgICB7Ci0gICAgICAqYnl0ZXNfcmVhZF9wdHIgPSAxOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAqYnl0ZXNfcmVhZF9wdHIgPSBzdHJsZW4gKGJ1ZikgKyAxOwotICByZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYnVmLCBieXRlc19yZWFkX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci0gICAgIHVuc2lnbmVkIGludCAqYnl0ZXNfcmVhZF9wdHI7Ci17Ci0gIHVuc2lnbmVkIGludCAgcmVzdWx0OwotICB1bnNpZ25lZCBpbnQgIG51bV9yZWFkOwotICBpbnQgICAgICAgICAgIHNoaWZ0OwotICB1bnNpZ25lZCBjaGFyIGJ5dGU7Ci0KLSAgcmVzdWx0ICAgPSAwOwotICBzaGlmdCAgICA9IDA7Ci0gIG51bV9yZWFkID0gMDsKLSAgCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9IGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci0gICAgICBidWYgKys7Ci0gICAgICBudW1fcmVhZCArKzsKLSAgICAgIHJlc3VsdCB8PSAoKGJ5dGUgJiAweDdmKSA8PCBzaGlmdCk7Ci0gICAgICBzaGlmdCArPSA3OwotICAgIH0KLSAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKLSAgCi0gICogYnl0ZXNfcmVhZF9wdHIgPSBudW1fcmVhZDsKLSAgCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQKLXJlYWRfc2lnbmVkX2xlYjEyOCAoYWJmZCwgYnVmLCBieXRlc19yZWFkX3B0cikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgY2hhciAqIGJ1ZjsKLSAgICAgdW5zaWduZWQgaW50ICogYnl0ZXNfcmVhZF9wdHI7Ci17Ci0gIGludCAgICAgICAgICAgcmVzdWx0OwotICBpbnQgICAgICAgICAgIHNoaWZ0OwotICBpbnQgICAgICAgICAgIG51bV9yZWFkOwotICB1bnNpZ25lZCBjaGFyIGJ5dGU7Ci0KLSAgcmVzdWx0ID0gMDsKLSAgc2hpZnQgPSAwOwotICBudW1fcmVhZCA9IDA7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBieXRlID0gYmZkX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLSAgICAgIGJ1ZiArKzsKLSAgICAgIG51bV9yZWFkICsrOwotICAgICAgcmVzdWx0IHw9ICgoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0KTsKLSAgICAgIHNoaWZ0ICs9IDc7Ci0gICAgfQotICB3aGlsZSAoYnl0ZSAmIDB4ODApOwotICAKLSAgaWYgKChzaGlmdCA8IDMyKSAmJiAoYnl0ZSAmIDB4NDApKQotICAgIHJlc3VsdCB8PSAtKDEgPDwgc2hpZnQpOwotCi0gICogYnl0ZXNfcmVhZF9wdHIgPSBudW1fcmVhZDsKLSAgCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIEVORCBWRVJCQVRJTSAqLwotCi1zdGF0aWMgYmZkX3ZtYQotcmVhZF9hZGRyZXNzICh1bml0LCBidWYpCi0gICAgIHN0cnVjdCBjb21wX3VuaXQqIHVuaXQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgYmZkX3ZtYSByZXR2YWwgPSAwOwotCi0gIGlmICh1bml0LT5hZGRyX3NpemUgPT0gNCkKLSAgICB7Ci0gICAgICByZXR2YWwgPSBiZmRfZ2V0XzMyICh1bml0LT5hYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dmFsID0gYmZkX2dldF82NCAodW5pdC0+YWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci0gICAgfQotICByZXR1cm4gcmV0dmFsOwotfQotCi0KLQotCi0KLS8qIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGluZm9ybWF0aW9uIG9mIGFuIGFiYnJldi4gKi8KLXN0cnVjdCBhYmJyZXZfaW5mbwotICB7Ci0gICAgdW5zaWduZWQgaW50IG51bWJlcjsJLyogbnVtYmVyIGlkZW50aWZ5aW5nIGFiYnJldiAqLwotICAgIGVudW0gZHdhcmZfdGFnIHRhZzsJCS8qIGR3YXJmIHRhZyAqLwotICAgIGludCBoYXNfY2hpbGRyZW47CQkvKiBib29sZWFuICovCi0gICAgdW5zaWduZWQgaW50IG51bV9hdHRyczsJLyogbnVtYmVyIG9mIGF0dHJpYnV0ZXMgKi8KLSAgICBzdHJ1Y3QgYXR0cl9hYmJyZXYgKmF0dHJzOwkvKiBhbiBhcnJheSBvZiBhdHRyaWJ1dGUgZGVzY3JpcHRpb25zICovCi0gICAgc3RydWN0IGFiYnJldl9pbmZvICpuZXh0OwkvKiBuZXh0IGluIGNoYWluICovCi0gIH07Ci0KLXN0cnVjdCBhdHRyX2FiYnJldgotICB7Ci0gICAgZW51bSBkd2FyZl9hdHRyaWJ1dGUgbmFtZTsKLSAgICBlbnVtIGR3YXJmX2Zvcm0gZm9ybTsKLSAgfTsKLQotI2lmbmRlZiBBQkJSRVZfSEFTSF9TSVpFCi0jZGVmaW5lIEFCQlJFVl9IQVNIX1NJWkUgMTIxCi0jZW5kaWYKLSNpZm5kZWYgQVRUUl9BTExPQ19DSFVOSwotI2RlZmluZSBBVFRSX0FMTE9DX0NIVU5LIDQKLSNlbmRpZgotCi0vKiBMb29rdXAgYW4gYWJicmV2X2luZm8gc3RydWN0dXJlIGluIHRoZSBhYmJyZXYgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYWJicmV2X2luZm8gKgotbG9va3VwX2FiYnJldiAobnVtYmVyLGFiYnJldnMpCi0gICAgIHVuc2lnbmVkIGludCBudW1iZXI7Ci0gICAgIHN0cnVjdCBhYmJyZXZfaW5mbyAqKmFiYnJldnM7Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoX251bWJlcjsKLSAgc3RydWN0IGFiYnJldl9pbmZvICphYmJyZXY7Ci0KLSAgaGFzaF9udW1iZXIgPSBudW1iZXIgJSBBQkJSRVZfSEFTSF9TSVpFOwotICBhYmJyZXYgPSBhYmJyZXZzW2hhc2hfbnVtYmVyXTsKLQotICB3aGlsZSAoYWJicmV2KQotICAgIHsKLSAgICAgIGlmIChhYmJyZXYtPm51bWJlciA9PSBudW1iZXIpCi0JcmV0dXJuIGFiYnJldjsKLSAgICAgIGVsc2UKLQlhYmJyZXYgPSBhYmJyZXYtPm5leHQ7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogSW4gRFdBUkYgdmVyc2lvbiAyLCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcwotICAgc3RvcmVkIGluIGEgc2VwYXJhdGUgLmRlYnVnX2FiYnJldiBzZWN0aW9uLiAgQmVmb3JlIHdlIHJlYWQgYW55Ci0gICBkaWVzIGZyb20gYSBzZWN0aW9uIHdlIHJlYWQgaW4gYWxsIGFiYnJldmlhdGlvbnMgYW5kIGluc3RhbGwgdGhlbQotICAgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBhYmJyZXZfaW5mbyoqCi1yZWFkX2FiYnJldnMgKGFiZmQsIG9mZnNldCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IG9mZnNldDsKLXsKLSAgc3RydWN0IGFiYnJldl9pbmZvICoqYWJicmV2czsKLSAgY2hhciAqYWJicmV2X3B0cjsKLSAgc3RydWN0IGFiYnJldl9pbmZvICpjdXJfYWJicmV2OwotICB1bnNpZ25lZCBpbnQgYWJicmV2X251bWJlciwgYnl0ZXNfcmVhZCwgYWJicmV2X25hbWU7Ci0gIHVuc2lnbmVkIGludCBhYmJyZXZfZm9ybSwgaGFzaF9udW1iZXI7Ci0gIHN0cnVjdCBkd2FyZjJfZGVidWcgKnN0YXNoOwotCi0gIHN0YXNoID0gZWxmX3RkYXRhKGFiZmQpLT5kd2FyZjJfZmluZF9saW5lX2luZm87Ci0KLSAgaWYgKCEgc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIpCi0gICAgewotICAgICAgYXNlY3Rpb24gKm1zZWM7Ci0KLSAgICAgIG1zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kZWJ1Z19hYmJyZXYiKTsKLSAgICAgIGlmICghIG1zZWMpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogQ2FuJ3QgZmluZCAuZGVidWdfYWJicmV2IHNlY3Rpb24uIikpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICAKLSAgICAgIHN0YXNoLT5kd2FyZl9hYmJyZXZfc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAobXNlYyk7Ci0gICAgICBzdGFzaC0+ZHdhcmZfYWJicmV2X2J1ZmZlciA9IChjaGFyKikgYmZkX2FsbG9jIChhYmZkLCBzdGFzaC0+ZHdhcmZfYWJicmV2X3NpemUpOwotICAgICAgaWYgKCEgc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIpCi0JICByZXR1cm4gMDsKLSAgICAgIAotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBtc2VjLCAKLQkJCQkgICAgICBzdGFzaC0+ZHdhcmZfYWJicmV2X2J1ZmZlciwgMCwKLQkJCQkgICAgICBzdGFzaC0+ZHdhcmZfYWJicmV2X3NpemUpKQotCXJldHVybiAwOwotICAgIH0KLQotICBpZiAob2Zmc2V0ID4gc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IEFiYnJldiBvZmZzZXQgKCV1KSBiaWdnZXIgdGhhbiBhYmJyZXYgc2l6ZSAoJXUpLiIpLCAKLQkJCSAgICAgb2Zmc2V0LCBzdGFzaC0+ZHdhcmZfYWJicmV2X3NpemUgKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGFiYnJldnMgPSAoc3RydWN0IGFiYnJldl9pbmZvKiopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZihzdHJ1Y3QgYWJicmV2X2luZm8qKSAqIEFCQlJFVl9IQVNIX1NJWkUpOwotCi0gIGFiYnJldl9wdHIgPSBzdGFzaC0+ZHdhcmZfYWJicmV2X2J1ZmZlciArIG9mZnNldDsKLSAgYWJicmV2X251bWJlciA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKLQotICAvKiBsb29wIHVudGlsIHdlIHJlYWNoIGFuIGFiYnJldiBudW1iZXIgb2YgMCAqLwotICB3aGlsZSAoYWJicmV2X251bWJlcikKLSAgICB7Ci0gICAgICBjdXJfYWJicmV2ID0gKHN0cnVjdCBhYmJyZXZfaW5mbyopYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYWJicmV2X2luZm8pKTsKLQotICAgICAgLyogcmVhZCBpbiBhYmJyZXYgaGVhZGVyICovCi0gICAgICBjdXJfYWJicmV2LT5udW1iZXIgPSBhYmJyZXZfbnVtYmVyOwotICAgICAgY3VyX2FiYnJldi0+dGFnID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGN1cl9hYmJyZXYtPmhhc19jaGlsZHJlbiA9IHJlYWRfMV9ieXRlIChhYmZkLCBhYmJyZXZfcHRyKTsKLSAgICAgIGFiYnJldl9wdHIgKz0gMTsKLQotICAgICAgLyogbm93IHJlYWQgaW4gZGVjbGFyYXRpb25zICovCi0gICAgICBhYmJyZXZfbmFtZSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBhYmJyZXZfZm9ybSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICB3aGlsZSAoYWJicmV2X25hbWUpCi0JewotCSAgaWYgKChjdXJfYWJicmV2LT5udW1fYXR0cnMgJSBBVFRSX0FMTE9DX0NIVU5LKSA9PSAwKQotCSAgICB7Ci0JICAgICAgY3VyX2FiYnJldi0+YXR0cnMgPSAoc3RydWN0IGF0dHJfYWJicmV2ICopCi0JCWJmZF9yZWFsbG9jIChjdXJfYWJicmV2LT5hdHRycywKLQkJCSAgICAgKGN1cl9hYmJyZXYtPm51bV9hdHRycyArIEFUVFJfQUxMT0NfQ0hVTkspCi0JCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgYXR0cl9hYmJyZXYpKTsKLQkgICAgICBpZiAoISBjdXJfYWJicmV2LT5hdHRycykKLQkJcmV0dXJuIDA7Ci0JICAgIH0KLQkgIGN1cl9hYmJyZXYtPmF0dHJzW2N1cl9hYmJyZXYtPm51bV9hdHRyc10ubmFtZSA9IGFiYnJldl9uYW1lOwotCSAgY3VyX2FiYnJldi0+YXR0cnNbY3VyX2FiYnJldi0+bnVtX2F0dHJzKytdLmZvcm0gPSBhYmJyZXZfZm9ybTsKLQkgIGFiYnJldl9uYW1lID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKLQkgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkgIGFiYnJldl9mb3JtID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKLQkgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKLQl9Ci0KLSAgICAgIGhhc2hfbnVtYmVyID0gYWJicmV2X251bWJlciAlIEFCQlJFVl9IQVNIX1NJWkU7Ci0gICAgICBjdXJfYWJicmV2LT5uZXh0ID0gYWJicmV2c1toYXNoX251bWJlcl07Ci0gICAgICBhYmJyZXZzW2hhc2hfbnVtYmVyXSA9IGN1cl9hYmJyZXY7Ci0KLSAgICAgIC8qIEdldCBuZXh0IGFiYnJldmlhdGlvbi4KLSAgICAgICAgIFVuZGVyIElyaXg2IHRoZSBhYmJyZXZpYXRpb25zIGZvciBhIGNvbXBpbGF0aW9uIHVuaXQgYXJlIG5vdAotCSBhbHdheXMgcHJvcGVybHkgdGVybWluYXRlZCB3aXRoIGFuIGFiYnJldiBudW1iZXIgb2YgMC4KLQkgRXhpdCBsb29wIGlmIHdlIGVuY291bnRlciBhbiBhYmJyZXZpYXRpb24gd2hpY2ggd2UgaGF2ZQotCSBhbHJlYWR5IHJlYWQgKHdoaWNoIG1lYW5zIHdlIGFyZSBhYm91dCB0byByZWFkIHRoZSBhYmJyZXZpYXRpb25zCi0JIGZvciB0aGUgbmV4dCBjb21waWxlIHVuaXQpIG9yIGlmIHRoZSBlbmQgb2YgdGhlIGFiYnJldmlhdGlvbgotCSB0YWJsZSBpcyByZWFjaGVkLiAgKi8KLSAgICAgIGlmICgodW5zaWduZWQgaW50KSAoYWJicmV2X3B0ciAtIHN0YXNoLT5kd2FyZl9hYmJyZXZfYnVmZmVyKQotCSAgICA+PSBzdGFzaC0+ZHdhcmZfYWJicmV2X3NpemUpCi0JYnJlYWs7Ci0gICAgICBhYmJyZXZfbnVtYmVyID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGlmIChsb29rdXBfYWJicmV2IChhYmJyZXZfbnVtYmVyLGFiYnJldnMpICE9IE5VTEwpCi0JYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBhYmJyZXZzOwotfQotCi0vKiBSZWFkIGFuIGF0dHJpYnV0ZSBkZXNjcmliZWQgYnkgYW4gYWJicmV2aWF0ZWQgYXR0cmlidXRlLiAgKi8KLQotc3RhdGljIGNoYXIgKgotcmVhZF9hdHRyaWJ1dGUgKGF0dHIsIGFiYnJldiwgdW5pdCwgaW5mb19wdHIpCi0gICAgIHN0cnVjdCBhdHRyaWJ1dGUgICAqYXR0cjsKLSAgICAgc3RydWN0IGF0dHJfYWJicmV2ICphYmJyZXY7Ci0gICAgIHN0cnVjdCBjb21wX3VuaXQgICAqdW5pdDsKLSAgICAgY2hhciAgICAgICAgICAgICAgICppbmZvX3B0cjsKLXsKLSAgYmZkICphYmZkID0gdW5pdC0+YWJmZDsKLSAgdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQ7Ci0gIHN0cnVjdCBkd2FyZl9ibG9jayAqYmxrOwotCi0gIGF0dHItPm5hbWUgPSBhYmJyZXYtPm5hbWU7Ci0gIGF0dHItPmZvcm0gPSBhYmJyZXYtPmZvcm07Ci0gIHN3aXRjaCAoYWJicmV2LT5mb3JtKQotICAgIHsKLSAgICBjYXNlIERXX0ZPUk1fYWRkcjoKLSAgICBjYXNlIERXX0ZPUk1fcmVmX2FkZHI6Ci0gICAgICBEV19BRERSIChhdHRyKSA9IHJlYWRfYWRkcmVzcyAodW5pdCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gdW5pdC0+YWRkcl9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2Jsb2NrMjoKLSAgICAgIGJsayA9IChzdHJ1Y3QgZHdhcmZfYmxvY2sgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkd2FyZl9ibG9jaykpOwotICAgICAgYmxrLT5zaXplID0gcmVhZF8yX2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSAyOwotICAgICAgYmxrLT5kYXRhID0gcmVhZF9uX2J5dGVzIChhYmZkLCBpbmZvX3B0ciwgYmxrLT5zaXplKTsKLSAgICAgIGluZm9fcHRyICs9IGJsay0+c2l6ZTsKLSAgICAgIERXX0JMT0NLIChhdHRyKSA9IGJsazsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazQ6Ci0gICAgICBibGsgPSAoc3RydWN0IGR3YXJmX2Jsb2NrICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZHdhcmZfYmxvY2spKTsKLSAgICAgIGJsay0+c2l6ZSA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gNDsKLSAgICAgIGJsay0+ZGF0YSA9IHJlYWRfbl9ieXRlcyAoYWJmZCwgaW5mb19wdHIsIGJsay0+c2l6ZSk7Ci0gICAgICBpbmZvX3B0ciArPSBibGstPnNpemU7Ci0gICAgICBEV19CTE9DSyAoYXR0cikgPSBibGs7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTI6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzJfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTQ6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzRfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTg6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzhfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fc3RyaW5nOgotICAgICAgRFdfU1RSSU5HIChhdHRyKSA9IHJlYWRfc3RyaW5nIChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazoKLSAgICAgIGJsayA9IChzdHJ1Y3QgZHdhcmZfYmxvY2sgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkd2FyZl9ibG9jaykpOwotICAgICAgYmxrLT5zaXplID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgYmxrLT5kYXRhID0gcmVhZF9uX2J5dGVzIChhYmZkLCBpbmZvX3B0ciwgYmxrLT5zaXplKTsKLSAgICAgIGluZm9fcHRyICs9IGJsay0+c2l6ZTsKLSAgICAgIERXX0JMT0NLIChhdHRyKSA9IGJsazsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazE6Ci0gICAgICBibGsgPSAoc3RydWN0IGR3YXJmX2Jsb2NrICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZHdhcmZfYmxvY2spKTsKLSAgICAgIGJsay0+c2l6ZSA9IHJlYWRfMV9ieXRlIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSAxOwotICAgICAgYmxrLT5kYXRhID0gcmVhZF9uX2J5dGVzIChhYmZkLCBpbmZvX3B0ciwgYmxrLT5zaXplKTsKLSAgICAgIGluZm9fcHRyICs9IGJsay0+c2l6ZTsKLSAgICAgIERXX0JMT0NLIChhdHRyKSA9IGJsazsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9kYXRhMToKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfMV9ieXRlIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2ZsYWc6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzFfYnl0ZSAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9zZGF0YToKLSAgICAgIERXX1NORCAoYXR0cikgPSByZWFkX3NpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3VkYXRhOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3JlZjE6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzFfYnl0ZSAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9yZWYyOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF8yX2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3JlZjQ6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzRfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fcmVmX3VkYXRhOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3N0cnA6Ci0gICAgY2FzZSBEV19GT1JNX2luZGlyZWN0OgotICAgIGRlZmF1bHQ6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBJbnZhbGlkIG9yIHVuaGFuZGxlZCBGT1JNIHZhbHVlOiAlZC4iKSwKLQkJCSAgICAgYWJicmV2LT5mb3JtKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgIH0KLSAgcmV0dXJuIGluZm9fcHRyOwotfQotCi0KLS8qIFNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIHRhYmxlIHJvdXRpbmVzLiAqLwotCi0jZGVmaW5lIEZJTEVfQUxMT0NfQ0hVTksgNQotI2RlZmluZSBESVJfQUxMT0NfQ0hVTksgNQotCi1zdHJ1Y3QgbGluZV9pbmZvIHsKLSAgc3RydWN0IGxpbmVfaW5mbyogcHJldl9saW5lOwotCi0gIGJmZF92bWEgYWRkcmVzczsKLSAgY2hhciogZmlsZW5hbWU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotICB1bnNpZ25lZCBpbnQgY29sdW1uOwotfTsKLQotc3RydWN0IGZpbGVpbmZvIHsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgaW50IGRpcjsKLSAgdW5zaWduZWQgaW50IHRpbWU7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotfTsKLQotc3RydWN0IGxpbmVfaW5mb190YWJsZSB7Ci0gIGJmZCogYWJmZDsKLQotICB1bnNpZ25lZCBpbnQgbnVtX2ZpbGVzOwotICB1bnNpZ25lZCBpbnQgbnVtX2RpcnM7Ci0KLSAgY2hhciogY29tcF9kaXI7Ci0gIGNoYXIqKiBkaXJzOwotICBzdHJ1Y3QgZmlsZWluZm8qIGZpbGVzOwotICBzdHJ1Y3QgbGluZV9pbmZvKiBsYXN0X2xpbmU7Ci19OwotCi1zdGF0aWMgdm9pZCAKLWFkZF9saW5lX2luZm8gKHRhYmxlLCBhZGRyZXNzLCBmaWxlbmFtZSwgbGluZSwgY29sdW1uKQotICAgICBzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKiB0YWJsZTsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotICAgICBjaGFyKiBmaWxlbmFtZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgIHVuc2lnbmVkIGludCBjb2x1bW47Ci17Ci0gIHN0cnVjdCBsaW5lX2luZm8qIGluZm8gPSAoc3RydWN0IGxpbmVfaW5mbyopCi0gICAgYmZkX2FsbG9jICh0YWJsZS0+YWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbGluZV9pbmZvKSk7Ci0KLSAgaW5mby0+cHJldl9saW5lID0gdGFibGUtPmxhc3RfbGluZTsKLSAgdGFibGUtPmxhc3RfbGluZSA9IGluZm87Ci0KLSAgaW5mby0+YWRkcmVzcyA9IGFkZHJlc3M7Ci0gIGluZm8tPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIGluZm8tPmxpbmUgPSBsaW5lOwotICBpbmZvLT5jb2x1bW4gPSBjb2x1bW47Ci19Ci0KLXN0YXRpYyBjaGFyKiAKLWNvbmNhdF9maWxlbmFtZSAodGFibGUsIGZpbGUpCi0gICAgIHN0cnVjdCBsaW5lX2luZm9fdGFibGUqIHRhYmxlOwotICAgICB1bnNpZ25lZCBpbnQgZmlsZTsKLXsKLSAgY2hhciogZmlsZW5hbWUgPSB0YWJsZS0+ZmlsZXNbZmlsZSAtIDFdLm5hbWU7Ci0gIGlmICgqZmlsZW5hbWUgPT0gJy8nKQotICAgIHJldHVybiBmaWxlbmFtZTsKLQotICBlbHNlCi0gICAgewotICAgICAgY2hhciogZGlybmFtZSA9ICh0YWJsZS0+ZmlsZXNbZmlsZSAtIDFdLmRpcgotCQkgICAgICAgPyB0YWJsZS0+ZGlyc1t0YWJsZS0+ZmlsZXNbZmlsZSAtIDFdLmRpciAtIDFdCi0JCSAgICAgICA6IHRhYmxlLT5jb21wX2Rpcik7Ci0gICAgICByZXR1cm4gKGNoYXIqKSBjb25jYXQgKGRpcm5hbWUsICIvIiwgZmlsZW5hbWUsIE5VTEwpOwotICAgIH0KLX0KLQotLyogRGVjb2RlIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgVU5JVC4gKi8KLQotc3RhdGljIHN0cnVjdCBsaW5lX2luZm9fdGFibGUqCi1kZWNvZGVfbGluZV9pbmZvICh1bml0KQotICAgICBzdHJ1Y3QgY29tcF91bml0ICp1bml0OwotewotICBiZmQgKmFiZmQgPSB1bml0LT5hYmZkOwotCi0gIHN0YXRpYyBjaGFyKiBkd2FyZl9saW5lX2J1ZmZlciA9IDA7Ci0KLSAgc3RydWN0IGxpbmVfaW5mb190YWJsZSogdGFibGU7Ci0KLSAgY2hhciAqbGluZV9wdHI7Ci0gIGNoYXIgKmxpbmVfZW5kOwotICBzdHJ1Y3QgbGluZV9oZWFkIGxoOwotICB1bnNpZ25lZCBpbnQgaSwgYnl0ZXNfcmVhZDsKLSAgY2hhciAqY3VyX2ZpbGUsICpjdXJfZGlyOwotICB1bnNpZ25lZCBjaGFyIG9wX2NvZGUsIGV4dGVuZGVkX29wLCBhZGpfb3Bjb2RlOwotCi0gIGlmICghIGR3YXJmX2xpbmVfYnVmZmVyKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICptc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotCi0gICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWdfbGluZSIpOwotICAgICAgaWYgKCEgbXNlYykKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBDYW4ndCBmaW5kIC5kZWJ1Z19saW5lIHNlY3Rpb24uIikpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICAKLSAgICAgIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKG1zZWMpOwotICAgICAgZHdhcmZfbGluZV9idWZmZXIgPSAoY2hhciopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gICAgICBpZiAoISBkd2FyZl9saW5lX2J1ZmZlcikKLQlyZXR1cm4gMDsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBtc2VjLCAKLQkJCQkgICAgICBkd2FyZl9saW5lX2J1ZmZlciwgMCwKLQkJCQkgICAgICBzaXplKSkKLQlyZXR1cm4gMDsKLQotICAgICAgLyogRklYTUU6IFdlIG91Z2h0IHRvIGFwcGx5IHRoZSByZWxvY3MgYWdhaW5zdCB0aGlzIHNlY3Rpb24gYmVmb3JlCi0JIHdlIHByb2Nlc3MgaXQuLi4uICovCi0gICAgfQotCi0gIHRhYmxlID0gKHN0cnVjdCBsaW5lX2luZm9fdGFibGUqKSBiZmRfYWxsb2MgKGFiZmQsIAotCQkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKSk7Ci0gIHRhYmxlLT5hYmZkID0gYWJmZDsKLSAgdGFibGUtPmNvbXBfZGlyID0gdW5pdC0+Y29tcF9kaXI7Ci0KLSAgdGFibGUtPm51bV9maWxlcyA9IDA7Ci0gIHRhYmxlLT5maWxlcyA9IE5VTEw7Ci0KLSAgdGFibGUtPm51bV9kaXJzID0gMDsKLSAgdGFibGUtPmRpcnMgPSBOVUxMOwotCi0gIGxpbmVfcHRyID0gZHdhcmZfbGluZV9idWZmZXIgKyB1bml0LT5saW5lX29mZnNldDsKLQotICAvKiByZWFkIGluIHRoZSBwcm9sb2d1ZSAqLwotICBsaC50b3RhbF9sZW5ndGggPSByZWFkXzRfYnl0ZXMgKGFiZmQsIGxpbmVfcHRyKTsKLSAgbGluZV9wdHIgKz0gNDsKLSAgbGluZV9lbmQgPSBsaW5lX3B0ciArIGxoLnRvdGFsX2xlbmd0aDsKLSAgbGgudmVyc2lvbiA9IHJlYWRfMl9ieXRlcyAoYWJmZCwgbGluZV9wdHIpOwotICBsaW5lX3B0ciArPSAyOwotICBsaC5wcm9sb2d1ZV9sZW5ndGggPSByZWFkXzRfYnl0ZXMgKGFiZmQsIGxpbmVfcHRyKTsKLSAgbGluZV9wdHIgKz0gNDsKLSAgbGgubWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGggPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotICBsaW5lX3B0ciArPSAxOwotICBsaC5kZWZhdWx0X2lzX3N0bXQgPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotICBsaW5lX3B0ciArPSAxOwotICBsaC5saW5lX2Jhc2UgPSByZWFkXzFfc2lnbmVkX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKLSAgbGluZV9wdHIgKz0gMTsKLSAgbGgubGluZV9yYW5nZSA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7Ci0gIGxpbmVfcHRyICs9IDE7Ci0gIGxoLm9wY29kZV9iYXNlID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKLSAgbGluZV9wdHIgKz0gMTsKLSAgbGguc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHMgPSAodW5zaWduZWQgY2hhciAqKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgbGgub3Bjb2RlX2Jhc2UgKiBzaXplb2YgKHVuc2lnbmVkIGNoYXIpKTsKLQotICBsaC5zdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1swXSA9IDE7Ci0gIGZvciAoaSA9IDE7IGkgPCBsaC5vcGNvZGVfYmFzZTsgKytpKQotICAgIHsKLSAgICAgIGxoLnN0YW5kYXJkX29wY29kZV9sZW5ndGhzW2ldID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKLSAgICAgIGxpbmVfcHRyICs9IDE7Ci0gICAgfQotCi0gIC8qIFJlYWQgZGlyZWN0b3J5IHRhYmxlICAqLwotICB3aGlsZSAoKGN1cl9kaXIgPSByZWFkX3N0cmluZyAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgaWYgKCh0YWJsZS0+bnVtX2RpcnMgJSBESVJfQUxMT0NfQ0hVTkspID09IDApCi0JewotCSAgdGFibGUtPmRpcnMgPSAoY2hhciAqKikKLQkgICAgYmZkX3JlYWxsb2MgKHRhYmxlLT5kaXJzLAotCQkJICh0YWJsZS0+bnVtX2RpcnMgKyBESVJfQUxMT0NfQ0hVTkspICogc2l6ZW9mIChjaGFyICopKTsKLQkgIGlmICghIHRhYmxlLT5kaXJzKQotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgICB0YWJsZS0+ZGlyc1t0YWJsZS0+bnVtX2RpcnMrK10gPSBjdXJfZGlyOwotICAgIH0KLSAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQotICAvKiBSZWFkIGZpbGUgbmFtZSB0YWJsZSAqLwotICB3aGlsZSAoKGN1cl9maWxlID0gcmVhZF9zdHJpbmcgKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCkpICE9IE5VTEwpCi0gICAgewotICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGlmICgodGFibGUtPm51bV9maWxlcyAlIEZJTEVfQUxMT0NfQ0hVTkspID09IDApCi0JewotCSAgdGFibGUtPmZpbGVzID0gKHN0cnVjdCBmaWxlaW5mbyAqKQotCSAgICBiZmRfcmVhbGxvYyAodGFibGUtPmZpbGVzLAotCQkJICh0YWJsZS0+bnVtX2ZpbGVzICsgRklMRV9BTExPQ19DSFVOSykKLQkJCSAqIHNpemVvZiAoc3RydWN0IGZpbGVpbmZvKSk7Ci0JICBpZiAoISB0YWJsZS0+ZmlsZXMpCi0JICAgIHJldHVybiAwOwotCX0KLSAgICAgIHRhYmxlLT5maWxlc1t0YWJsZS0+bnVtX2ZpbGVzXS5uYW1lID0gY3VyX2ZpbGU7Ci0gICAgICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10uZGlyID0KLQlyZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10udGltZSA9Ci0JcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLnNpemUgPQotCXJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIHRhYmxlLT5udW1fZmlsZXMrKzsKLSAgICB9Ci0gIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0KLSAgLyogUmVhZCB0aGUgc3RhdGVtZW50IHNlcXVlbmNlcyB1bnRpbCB0aGVyZSdzIG5vdGhpbmcgbGVmdC4gICovCi0gIHdoaWxlIChsaW5lX3B0ciA8IGxpbmVfZW5kKQotICAgIHsKLSAgICAgIC8qIHN0YXRlIG1hY2hpbmUgcmVnaXN0ZXJzICAqLwotICAgICAgYmZkX3ZtYSBhZGRyZXNzID0gMDsKLSAgICAgIGNoYXIqIGZpbGVuYW1lID0gY29uY2F0X2ZpbGVuYW1lICh0YWJsZSwgMSk7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGluZSA9IDE7Ci0gICAgICB1bnNpZ25lZCBpbnQgY29sdW1uID0gMDsKLSAgICAgIGludCBpc19zdG10ID0gbGguZGVmYXVsdF9pc19zdG10OwotICAgICAgaW50IGJhc2ljX2Jsb2NrID0gMDsKLSAgICAgIGludCBlbmRfc2VxdWVuY2UgPSAwOwotCi0gICAgICAvKiBEZWNvZGUgdGhlIHRhYmxlLiAqLwotICAgICAgd2hpbGUgKCEgZW5kX3NlcXVlbmNlKQotCXsKLQkgIG9wX2NvZGUgPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotCSAgbGluZV9wdHIgKz0gMTsKLQkgIHN3aXRjaCAob3BfY29kZSkKLQkgICAgewotCSAgICBjYXNlIERXX0xOU19leHRlbmRlZF9vcDoKLQkgICAgICBsaW5lX3B0ciArPSAxOwkvKiBpZ25vcmUgbGVuZ3RoICovCi0JICAgICAgZXh0ZW5kZWRfb3AgPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotCSAgICAgIGxpbmVfcHRyICs9IDE7Ci0JICAgICAgc3dpdGNoIChleHRlbmRlZF9vcCkKLQkJewotCQljYXNlIERXX0xORV9lbmRfc2VxdWVuY2U6Ci0JCSAgZW5kX3NlcXVlbmNlID0gMTsKLQkJICBhZGRfbGluZV9pbmZvICh0YWJsZSwgYWRkcmVzcywgZmlsZW5hbWUsIGxpbmUsIGNvbHVtbik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgRFdfTE5FX3NldF9hZGRyZXNzOgotCQkgIGFkZHJlc3MgPSByZWFkX2FkZHJlc3MgKHVuaXQsIGxpbmVfcHRyKTsKLQkJICBsaW5lX3B0ciArPSB1bml0LT5hZGRyX3NpemU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgRFdfTE5FX2RlZmluZV9maWxlOgotCQkgIGN1cl9maWxlID0gcmVhZF9zdHJpbmcgKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JCSAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkJICBpZiAoKHRhYmxlLT5udW1fZmlsZXMgJSBGSUxFX0FMTE9DX0NIVU5LKSA9PSAwKQotCQkgICAgewotCQkgICAgICB0YWJsZS0+ZmlsZXMgPSAoc3RydWN0IGZpbGVpbmZvICopCi0JCQliZmRfcmVhbGxvYyAodGFibGUtPmZpbGVzLAotCQkJCSAgICAgKHRhYmxlLT5udW1fZmlsZXMgKyBGSUxFX0FMTE9DX0NIVU5LKQotCQkJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBmaWxlaW5mbykpOwotCQkgICAgICBpZiAoISB0YWJsZS0+ZmlsZXMpCi0JCQlyZXR1cm4gMDsKLQkJICAgIH0KLQkJICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10ubmFtZSA9IGN1cl9maWxlOwotCQkgIHRhYmxlLT5maWxlc1t0YWJsZS0+bnVtX2ZpbGVzXS5kaXIgPQotCQkgICAgcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JCSAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkJICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10udGltZSA9Ci0JCSAgICByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLQkJICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCQkgIHRhYmxlLT5maWxlc1t0YWJsZS0+bnVtX2ZpbGVzXS5zaXplID0KLQkJICAgIHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotCQkgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JCSAgdGFibGUtPm51bV9maWxlcysrOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IG1hbmdsZWQgbGluZSBudW1iZXIgc2VjdGlvbi4iKSk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgcmV0dXJuIDA7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfY29weToKLQkgICAgICBhZGRfbGluZV9pbmZvICh0YWJsZSwgYWRkcmVzcywgZmlsZW5hbWUsIGxpbmUsIGNvbHVtbik7Ci0JICAgICAgYmFzaWNfYmxvY2sgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXX0xOU19hZHZhbmNlX3BjOgotCSAgICAgIGFkZHJlc3MgKz0gbGgubWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGgKLQkJKiByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLQkgICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXX0xOU19hZHZhbmNlX2xpbmU6Ci0JICAgICAgbGluZSArPSByZWFkX3NpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfc2V0X2ZpbGU6Ci0JICAgICAgewotCQl1bnNpZ25lZCBpbnQgZmlsZTsKLQotCQkvKiBUaGUgZmlsZSBhbmQgZGlyZWN0b3J5IHRhYmxlcyBhcmUgMCBiYXNlZCwgdGhlIHJlZmVyZW5jZXMKLQkJICAgYXJlIDEgYmFzZWQuICAqLwotCQlmaWxlID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JCWxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JCWZpbGVuYW1lID0gY29uY2F0X2ZpbGVuYW1lICh0YWJsZSwgZmlsZSk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgY2FzZSBEV19MTlNfc2V0X2NvbHVtbjoKLQkgICAgICBjb2x1bW4gPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLQkgICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXX0xOU19uZWdhdGVfc3RtdDoKLQkgICAgICBpc19zdG10ID0gKCFpc19zdG10KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfc2V0X2Jhc2ljX2Jsb2NrOgotCSAgICAgIGJhc2ljX2Jsb2NrID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfY29uc3RfYWRkX3BjOgotCSAgICAgIGFkZHJlc3MgKz0gKDI1NSAtIGxoLm9wY29kZV9iYXNlKSAvIGxoLmxpbmVfcmFuZ2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFdfTE5TX2ZpeGVkX2FkdmFuY2VfcGM6Ci0JICAgICAgYWRkcmVzcyArPSByZWFkXzJfYnl0ZXMgKGFiZmQsIGxpbmVfcHRyKTsKLQkgICAgICBsaW5lX3B0ciArPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgkJLyogc3BlY2lhbCBvcGVyYW5kICovCi0JICAgICAgYWRqX29wY29kZSA9IG9wX2NvZGUgLSBsaC5vcGNvZGVfYmFzZTsKLQkgICAgICBhZGRyZXNzICs9IChhZGpfb3Bjb2RlIC8gbGgubGluZV9yYW5nZSkKLQkJKiBsaC5taW5pbXVtX2luc3RydWN0aW9uX2xlbmd0aDsKLQkgICAgICBsaW5lICs9IGxoLmxpbmVfYmFzZSArIChhZGpfb3Bjb2RlICUgbGgubGluZV9yYW5nZSk7Ci0JICAgICAgLyogYXBwZW5kIHJvdyB0byBtYXRyaXggdXNpbmcgY3VycmVudCB2YWx1ZXMgKi8KLQkgICAgICBhZGRfbGluZV9pbmZvICh0YWJsZSwgYWRkcmVzcywgZmlsZW5hbWUsIGxpbmUsIGNvbHVtbik7Ci0JICAgICAgYmFzaWNfYmxvY2sgPSAxOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdGFibGU7Ci19Ci0KLQotLyogSWYgQUREUiBpcyB3aXRoaW4gVEFCTEUgc2V0IHRoZSBvdXRwdXQgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHRydWUsCi0gICBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLiAgVGhlIG91dHB1dCBwYXJhbWV0ZXJzLCBGSUxFTkFNRV9QVFIgYW5kCi0gICBMSU5FTlVNQkVSX1BUUiwgYXJlIHBvaW50ZXJzIHRvIHRoZSBvYmplY3RzIHRvIGJlIGZpbGxlZCBpbi4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWxvb2t1cF9hZGRyZXNzX2luX2xpbmVfaW5mb190YWJsZSAodGFibGUsIAotCQkJCSAgIGFkZHIsCi0JCQkJICAgZmlsZW5hbWVfcHRyLCAKLQkJCQkgICBsaW5lbnVtYmVyX3B0cikKLSAgICAgc3RydWN0IGxpbmVfaW5mb190YWJsZSogdGFibGU7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lbnVtYmVyX3B0cjsKLXsKLSAgc3RydWN0IGxpbmVfaW5mbyogZWFjaF9saW5lOwotICBzdHJ1Y3QgbGluZV9pbmZvKiBuZXh0X2xpbmU7Ci0gIAotICBmb3IgKG5leHRfbGluZSA9IDAsIGVhY2hfbGluZSA9IHRhYmxlLT5sYXN0X2xpbmU7Ci0gICAgICAgZWFjaF9saW5lOwotICAgICAgIG5leHRfbGluZSA9IGVhY2hfbGluZSwgZWFjaF9saW5lID0gZWFjaF9saW5lLT5wcmV2X2xpbmUpCi0gICAgewotICAgICAgaWYgKGFkZHIgPj0gZWFjaF9saW5lLT5hZGRyZXNzCi0JICAmJiAobmV4dF9saW5lID09IDAKLQkgICAgICB8fCBhZGRyIDwgbmV4dF9saW5lLT5hZGRyZXNzKSkgCi0JewotCSAgKmZpbGVuYW1lX3B0ciA9IGVhY2hfbGluZS0+ZmlsZW5hbWU7Ci0JICAqbGluZW51bWJlcl9wdHIgPSBlYWNoX2xpbmUtPmxpbmU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotICAKLSAgcmV0dXJuIGZhbHNlOwotfQotICAKLQotCi0KLS8qIEZ1bmN0aW9uIHRhYmxlIGZ1bmN0aW9ucy4gKi8KLQotc3RydWN0IGZ1bmNpbmZvIHsKLSAgc3RydWN0IGZ1bmNpbmZvICpwcmV2X2Z1bmM7Ci0KLSAgY2hhciogbmFtZTsKLSAgYmZkX3ZtYSBsb3c7Ci0gIGJmZF92bWEgaGlnaDsKLX07Ci0KLQotLyogSWYgQUREUiBpcyB3aXRoaW4gVEFCTEUsIHNldCBGVU5DVElPTk5BTUVfUFRSLCBhbmQgcmV0dXJuIHRydWUuICovCi0KLXN0YXRpYyBib29sZWFuCi1sb29rdXBfYWRkcmVzc19pbl9mdW5jdGlvbl90YWJsZSAodGFibGUsIAotCQkJCSAgYWRkciwKLQkJCQkgIGZ1bmN0aW9ubmFtZV9wdHIpCi0gICAgIHN0cnVjdCBmdW5jaW5mbyogdGFibGU7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci17Ci0gIHN0cnVjdCBmdW5jaW5mbyogZWFjaF9mdW5jOwotCi0gIGZvciAoZWFjaF9mdW5jID0gdGFibGU7Ci0gICAgICAgZWFjaF9mdW5jOwotICAgICAgIGVhY2hfZnVuYyA9IGVhY2hfZnVuYy0+cHJldl9mdW5jKQotICAgIHsKLSAgICAgIGlmIChhZGRyID49IGVhY2hfZnVuYy0+bG93ICYmIGFkZHIgPCBlYWNoX2Z1bmMtPmhpZ2gpCi0JewotCSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBlYWNoX2Z1bmMtPm5hbWU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotICAKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLQotCi0vKiBEV0FSRjIgQ29tcGlsYXRpb24gdW5pdCBmdW5jdGlvbnMuICovCi0KLQotLyogU2NhbiBvdmVyIGVhY2ggZGllIGluIGEgY29tcC4gdW5pdCBsb29raW5nIGZvciBmdW5jdGlvbnMgdG8gYWRkCi0gICB0byB0aGUgZnVuY3Rpb24gdGFibGUuICovCi0KLXN0YXRpYyBib29sZWFuCi1zY2FuX3VuaXRfZm9yX2Z1bmN0aW9ucyAodW5pdCkKLSAgICAgc3RydWN0IGNvbXBfdW5pdCAqdW5pdDsKLXsKLSAgYmZkICphYmZkID0gdW5pdC0+YWJmZDsKLSAgY2hhciAqaW5mb19wdHIgPSB1bml0LT5maXJzdF9jaGlsZF9kaWVfcHRyOwotICBpbnQgbmVzdGluZ19sZXZlbCA9IDE7Ci0KLSAgd2hpbGUgKG5lc3RpbmdfbGV2ZWwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGFiYnJldl9udW1iZXIsIGJ5dGVzX3JlYWQsIGk7Ci0gICAgICBzdHJ1Y3QgYWJicmV2X2luZm8gKmFiYnJldjsKLSAgICAgIHN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLSAgICAgIHN0cnVjdCBmdW5jaW5mbyAqZnVuYzsKLSAgICAgIGNoYXIqIG5hbWUgPSAwOwotCi0gICAgICBhYmJyZXZfbnVtYmVyID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotCi0gICAgICBpZiAoISBhYmJyZXZfbnVtYmVyKQotCXsKLQkgIG5lc3RpbmdfbGV2ZWwtLTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIAotICAgICAgYWJicmV2ID0gbG9va3VwX2FiYnJldiAoYWJicmV2X251bWJlcix1bml0LT5hYmJyZXZzKTsKLSAgICAgIGlmICghIGFiYnJldikKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBDb3VsZCBub3QgZmluZCBhYmJyZXYgbnVtYmVyICVkLiIpLCAKLQkJCSAgICAgYWJicmV2X251bWJlcik7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChhYmJyZXYtPnRhZyA9PSBEV19UQUdfc3VicHJvZ3JhbSkKLQl7Ci0JICBmdW5jID0gKHN0cnVjdCBmdW5jaW5mbyopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGZ1bmNpbmZvKSk7Ci0JICBmdW5jLT5wcmV2X2Z1bmMgPSB1bml0LT5mdW5jdGlvbl90YWJsZTsKLQkgIHVuaXQtPmZ1bmN0aW9uX3RhYmxlID0gZnVuYzsKLQl9Ci0gICAgICBlbHNlCi0JZnVuYyA9IE5VTEw7Ci0gIAotICAgICAgZm9yIChpID0gMDsgaSA8IGFiYnJldi0+bnVtX2F0dHJzOyArK2kpCi0JewotCSAgaW5mb19wdHIgPSByZWFkX2F0dHJpYnV0ZSAoJmF0dHIsICZhYmJyZXYtPmF0dHJzW2ldLCB1bml0LCBpbmZvX3B0cik7Ci0JICAKLQkgIGlmIChmdW5jKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChhdHRyLm5hbWUpCi0JCXsKLQkJY2FzZSBEV19BVF9uYW1lOgotCQkgIAotCQkgIG5hbWUgPSBEV19TVFJJTkcgKCZhdHRyKTsKLQotCQkgIC8qIFByZWZlciBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSBvdmVyIERXX0FUX25hbWUuICAqLwotCQkgIGlmIChmdW5jLT5uYW1lID09IE5VTEwpCi0JCSAgICBmdW5jLT5uYW1lID0gRFdfU1RSSU5HICgmYXR0cik7Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWNhc2UgRFdfQVRfTUlQU19saW5rYWdlX25hbWU6Ci0JCSAgZnVuYy0+bmFtZSA9IERXX1NUUklORyAoJmF0dHIpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRFdfQVRfbG93X3BjOgotCQkgIGZ1bmMtPmxvdyA9IERXX0FERFIgKCZhdHRyKTsKLQkJICBicmVhazsKLQotCQljYXNlIERXX0FUX2hpZ2hfcGM6Ci0JCSAgZnVuYy0+aGlnaCA9IERXX0FERFIgKCZhdHRyKTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN3aXRjaCAoYXR0ci5uYW1lKQotCQl7Ci0JCWNhc2UgRFdfQVRfbmFtZToKLQkJICBuYW1lID0gRFdfU1RSSU5HICgmYXR0cik7Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWRlZmF1bHQ6Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKGFiYnJldi0+aGFzX2NoaWxkcmVuKQotCW5lc3RpbmdfbGV2ZWwrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi0KLQotCi0vKiBQYXJzZSBhIERXQVJGMiBjb21waWxhdGlvbiB1bml0IHN0YXJ0aW5nIGF0IElORk9fUFRSLiAgVGhpcyBpbmNsdWRlcwotICAgdGhlIGNvbXBpbGF0aW9uIHVuaXQgaGVhZGVyIHRoYXQgcHJvY2VlZHMgdGhlIERJRSdzLCBidXQgZG9lcyBub3QKLSAgIGluY2x1ZGUgdGhlIGxlbmd0aCBmaWVsZCB0aGF0IHByZWNlZWRzIGVhY2ggY29tcGlsYXRpb24gdW5pdCBoZWFkZXIuCi0gICBFTkRfUFRSIHBvaW50cyBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoaXMgY29tcCB1bml0LgotCi0gICBUaGlzIHJvdXRpbmUgZG9lcyBub3QgcmVhZCB0aGUgd2hvbGUgY29tcGlsYXRpb24gdW5pdDsgb25seSBlbm91Z2gKLSAgIHRvIGdldCB0byB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotc3RhdGljIHN0cnVjdCBjb21wX3VuaXQgKgotcGFyc2VfY29tcF91bml0IChhYmZkLCBpbmZvX3B0ciwgZW5kX3B0cikKLSAgICAgYmZkKiBhYmZkOwotICAgICBjaGFyKiBpbmZvX3B0cjsKLSAgICAgY2hhciogZW5kX3B0cjsKLXsKLSAgc3RydWN0IGNvbXBfdW5pdCogdW5pdDsKLQotICB1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uOwotICB1bnNpZ25lZCBpbnQgYWJicmV2X29mZnNldDsKLSAgdW5zaWduZWQgY2hhciBhZGRyX3NpemU7Ci0gIHN0cnVjdCBhYmJyZXZfaW5mbyoqIGFiYnJldnM7Ci0KLSAgdW5zaWduZWQgaW50IGFiYnJldl9udW1iZXIsIGJ5dGVzX3JlYWQsIGk7Ci0gIHN0cnVjdCBhYmJyZXZfaW5mbyAqYWJicmV2OwotICBzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0KLSAgdmVyc2lvbiA9IHJlYWRfMl9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICBpbmZvX3B0ciArPSAyOwotICBhYmJyZXZfb2Zmc2V0ID0gcmVhZF80X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gIGluZm9fcHRyICs9IDQ7Ci0gIGFkZHJfc2l6ZSA9IHJlYWRfMV9ieXRlIChhYmZkLCBpbmZvX3B0cik7Ci0gIGluZm9fcHRyICs9IDE7Ci0KLSAgaWYgKHZlcnNpb24gIT0gMikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBmb3VuZCBkd2FyZiB2ZXJzaW9uICclaHUnLCB0aGlzIHJlYWRlciBvbmx5IGhhbmRsZXMgdmVyc2lvbiAyIGluZm9ybWF0aW9uLiIpLCB2ZXJzaW9uICk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoYWRkcl9zaXplID4gc2l6ZW9mIChiZmRfdm1hKSkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBmb3VuZCBhZGRyZXNzIHNpemUgJyV1JywgdGhpcyByZWFkZXIgY2FuIG5vdCBoYW5kbGUgc2l6ZXMgZ3JlYXRlciB0aGFuICcldScuIiksCi0JCQkgYWRkcl9zaXplLAotCQkJIHNpemVvZiAoYmZkX3ZtYSkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGFkZHJfc2l6ZSAhPSA0ICYmIGFkZHJfc2l6ZSAhPSA4KQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIkR3YXJmIEVycm9yOiBmb3VuZCBhZGRyZXNzIHNpemUgJyV1JywgdGhpcyByZWFkZXIgY2FuIG9ubHkgaGFuZGxlIGFkZHJlc3Mgc2l6ZXMgJzQnIGFuZCAnOCcuIiwgYWRkcl9zaXplICk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSBhYmJyZXZzIGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaW50byBhIHRhYmxlICovCi0gIGFiYnJldnMgPSByZWFkX2FiYnJldnMgKGFiZmQsIGFiYnJldl9vZmZzZXQpOwotICBpZiAoISBhYmJyZXZzKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgYWJicmV2X251bWJlciA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOwotICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotICBpZiAoISBhYmJyZXZfbnVtYmVyKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IEJhZCBhYmJyZXYgbnVtYmVyOiAlZC4iKSwKLQkJCSBhYmJyZXZfbnVtYmVyKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGFiYnJldiA9IGxvb2t1cF9hYmJyZXYgKGFiYnJldl9udW1iZXIsIGFiYnJldnMpOwotICBpZiAoISBhYmJyZXYpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogQ291bGQgbm90IGZpbmQgYWJicmV2IG51bWJlciAlZC4iKSwKLQkJCSBhYmJyZXZfbnVtYmVyKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAKLSAgdW5pdCA9IChzdHJ1Y3QgY29tcF91bml0KikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29tcF91bml0KSk7Ci0gIHVuaXQtPmFiZmQgPSBhYmZkOwotICB1bml0LT5hZGRyX3NpemUgPSBhZGRyX3NpemU7IAotICB1bml0LT5hYmJyZXZzID0gYWJicmV2czsKLSAgdW5pdC0+ZW5kX3B0ciA9IGVuZF9wdHI7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGFiYnJldi0+bnVtX2F0dHJzOyArK2kpCi0gICAgewotICAgICAgaW5mb19wdHIgPSByZWFkX2F0dHJpYnV0ZSAoJmF0dHIsICZhYmJyZXYtPmF0dHJzW2ldLCB1bml0LCBpbmZvX3B0cik7Ci0KLSAgICAgIC8qIFN0b3JlIHRoZSBkYXRhIGlmIGl0IGlzIG9mIGFuIGF0dHJpYnV0ZSB3ZSB3YW50IHRvIGtlZXAgaW4gYQotCSBwYXJ0aWFsIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBzd2l0Y2ggKGF0dHIubmFtZSkKLQl7Ci0JY2FzZSBEV19BVF9zdG10X2xpc3Q6Ci0JICB1bml0LT5zdG10bGlzdCA9IDE7Ci0JICB1bml0LT5saW5lX29mZnNldCA9IERXX1VOU05EICgmYXR0cik7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfQVRfbmFtZToKLQkgIHVuaXQtPm5hbWUgPSBEV19TVFJJTkcgKCZhdHRyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19BVF9sb3dfcGM6Ci0JICB1bml0LT5sb3cgPSBEV19BRERSICgmYXR0cik7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfQVRfaGlnaF9wYzoKLQkgIHVuaXQtPmhpZ2ggPSBEV19BRERSICgmYXR0cik7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfQVRfY29tcF9kaXI6Ci0JICB7Ci0JICAgIGNoYXIqIGNvbXBfZGlyID0gRFdfU1RSSU5HICgmYXR0cik7Ci0JICAgIGlmIChjb21wX2RpcikKLQkgICAgICB7Ci0JCS8qIElyaXggNi4yIG5hdGl2ZSBjYyBwcmVwZW5kcyA8bWFjaGluZT4uOiB0byB0aGUgY29tcGlsYXRpb24KLQkJICAgZGlyZWN0b3J5LCBnZXQgcmlkIG9mIGl0LiAgKi8KLQkJY2hhciAqY3AgPSAoY2hhciopIHN0cmNociAoY29tcF9kaXIsICc6Jyk7Ci0KLQkJaWYgKGNwICYmIGNwICE9IGNvbXBfZGlyICYmIGNwWy0xXSA9PSAnLicgJiYgY3BbMV0gPT0gJy8nKQotCQkgIGNvbXBfZGlyID0gY3AgKyAxOwotCSAgICAgIH0KLQkgICAgdW5pdC0+Y29tcF9kaXIgPSBjb21wX2RpcjsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICB1bml0LT5maXJzdF9jaGlsZF9kaWVfcHRyID0gaW5mb19wdHI7Ci0gIHJldHVybiB1bml0OwotfQotCi0KLQotCi0KLS8qIFJldHVybiB0cnVlIGlmIFVOSVQgY29udGFpbnMgdGhlIGFkZHJlc3MgZ2l2ZW4gYnkgQUREUi4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvbXBfdW5pdF9jb250YWluc19hZGRyZXNzICh1bml0LCBhZGRyKQotICAgICBzdHJ1Y3QgY29tcF91bml0KiB1bml0OwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHJldHVybiAhIHVuaXQtPmVycm9yCi0gICAgJiYgKGFkZHIgPj0gdW5pdC0+bG93ICYmIGFkZHIgPD0gdW5pdC0+aGlnaCk7Ci19Ci0KLQotLyogSWYgVU5JVCBjb250YWlucyBBRERSLCBzZXQgdGhlIG91dHB1dCBwYXJhbWV0ZXJzIHRvIHRoZSB2YWx1ZXMgZm9yCi0gICB0aGUgbGluZSBjb250YWluaW5nIEFERFIuICBUaGUgb3V0cHV0IHBhcmFtZXRlcnMsIEZJTEVOQU1FX1BUUiwKLSAgIEZVTkNUSU9OTkFNRV9QVFIsIGFuZCBMSU5FTlVNQkVSX1BUUiwgYXJlIHBvaW50ZXJzIHRvIHRoZSBvYmplY3RzCi0gICB0byBiZSBmaWxsZWQgaW4uICAKLQotICAgUmV0dXJuIHRydWUgb2YgVU5JVCBjb250YWlucyBBRERSLCBhbmQgbm8gZXJyb3JzIHdlcmUgZW5jb3VudGVyZWQ7Ci0gICBmYWxzZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lICh1bml0LCBhZGRyLAotCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVudW1iZXJfcHRyKQotICAgICBzdHJ1Y3QgY29tcF91bml0KiB1bml0OwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVudW1iZXJfcHRyOwotewotICBib29sZWFuIGxpbmVfcDsKLSAgYm9vbGVhbiBmdW5jX3A7Ci0gIAotICBpZiAodW5pdC0+ZXJyb3IpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHVuaXQtPmxpbmVfdGFibGUpCi0gICAgewotICAgICAgaWYgKCEgdW5pdC0+c3RtdGxpc3QpCi0JewotCSAgdW5pdC0+ZXJyb3IgPSAxOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgCi0gICAgICB1bml0LT5saW5lX3RhYmxlID0gZGVjb2RlX2xpbmVfaW5mbyAodW5pdCk7Ci0KLSAgICAgIGlmICghIHVuaXQtPmxpbmVfdGFibGUpCi0JewotCSAgdW5pdC0+ZXJyb3IgPSAxOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIAotICAgICAgaWYgKCEgc2Nhbl91bml0X2Zvcl9mdW5jdGlvbnMgKHVuaXQpKQotCXsKLQkgIHVuaXQtPmVycm9yID0gMTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGxpbmVfcCA9IGxvb2t1cF9hZGRyZXNzX2luX2xpbmVfaW5mb190YWJsZSAodW5pdC0+bGluZV90YWJsZSwKLQkJCQkJICAgICAgYWRkciwKLQkJCQkJICAgICAgZmlsZW5hbWVfcHRyLCAKLQkJCQkJICAgICAgbGluZW51bWJlcl9wdHIpOwotICBmdW5jX3AgPSBsb29rdXBfYWRkcmVzc19pbl9mdW5jdGlvbl90YWJsZSAodW5pdC0+ZnVuY3Rpb25fdGFibGUsIAotCQkJCQkgICAgIGFkZHIsCi0JCQkJCSAgICAgZnVuY3Rpb25uYW1lX3B0cik7Ci0gIHJldHVybiBsaW5lX3AgfHwgZnVuY19wOwotfQotCi0vKiBUaGUgRFdBUkYyIHZlcnNpb24gb2YgZmluZF9uZWFyZXN0IGxpbmUuCi0gICBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGluZSBpcyBmb3VuZCB3aXRob3V0IGVycm9yLiAqLwotCi1ib29sZWFuCi1fYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotCQkJICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVudW1iZXJfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVudW1iZXJfcHRyOwotewotICAvKiBSZWFkIGVhY2ggY29tcGlsYXRpb24gdW5pdCBmcm9tIHRoZSBzZWN0aW9uIC5kZWJ1Z19pbmZvLCBhbmQgY2hlY2sKLSAgICAgdG8gc2VlIGlmIGl0IGNvbnRhaW5zIHRoZSBhZGRyZXNzIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiAgSWYgeWVzLAotICAgICBsb29rdXAgdGhlIGFkZHJlc3MsIGFuZCByZXR1cm4gdGhlIGxpbmUgbnVtYmVyIGluZm8uICBJZiBubywgZ28KLSAgICAgb24gdG8gdGhlIG5leHQgY29tcGlsYXRpb24gdW5pdC4gIAotCi0gICAgIFdlIGtlZXAgYSBsaXN0IG9mIGFsbCB0aGUgcHJldmlvdXNseSByZWFkIGNvbXBpbGF0aW9uIHVuaXRzLCBhbmQKLSAgICAgYSBwb2ludGVyIHRvIHRoZSBuZXh0IHVuLXJlYWQgY29tcGlsYXRpb24gdW5pdC4gIENoZWNrIHRoZSAKLSAgICAgcHJldmlvdXNseSByZWFkIHVuaXRzIGJlZm9yZSByZWFkaW5nIG1vcmUuCi0gICAgICovCi0KLSAgc3RydWN0IGR3YXJmMl9kZWJ1ZyAqc3Rhc2ggPSBlbGZfdGRhdGEgKGFiZmQpLT5kd2FyZjJfZmluZF9saW5lX2luZm87Ci0KLSAgLyogV2hhdCBhZGRyZXNzIGFyZSB3ZSBsb29raW5nIGZvcj8gKi8KLSAgYmZkX3ZtYSBhZGRyID0gb2Zmc2V0ICsgc2VjdGlvbi0+dm1hOwotCi0gIHN0cnVjdCBjb21wX3VuaXQqIGVhY2g7Ci0gIAotICAqZmlsZW5hbWVfcHRyID0gTlVMTDsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBOVUxMOwotICAqbGluZW51bWJlcl9wdHIgPSAwOwotCi0gIGlmICghIHN0YXNoKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICptc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotICAgICAgCi0gICAgICBzdGFzaCA9IGVsZl90ZGF0YSAoYWJmZCktPmR3YXJmMl9maW5kX2xpbmVfaW5mbyA9Ci0JKHN0cnVjdCBkd2FyZjJfZGVidWcqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkd2FyZjJfZGVidWcpKTsKLSAgICAgIAotICAgICAgaWYgKCEgc3Rhc2gpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWdfaW5mbyIpOwotICAgICAgaWYgKCEgbXNlYykKLQl7Ci0JICAvKiBObyBkd2FyZjIgaW5mby4gIE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IHRoZSBzdGFzaAotCSAgICAgaGFzIGJlZW4gYWxsb2NhdGVkLCBidXQgY29udGFpbnMgemVyb3MsIHRoaXMgbGV0cwotCSAgICAgZnV0dXJlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gZmFpbCBxdWlja2VyLiAqLwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAobXNlYyk7Ci0gICAgICBpZiAoc2l6ZSA9PSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgc3Rhc2gtPmluZm9fcHRyID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgICAgIAotICAgICAgaWYgKCEgc3Rhc2gtPmluZm9fcHRyKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBtc2VjLCBzdGFzaC0+aW5mb19wdHIsIDAsIHNpemUpKQotCXsKLQkgIHN0YXNoLT5pbmZvX3B0ciA9IDA7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzdGFzaC0+aW5mb19wdHJfZW5kID0gc3Rhc2gtPmluZm9fcHRyICsgc2l6ZTsKLQotICAgICAgLyogRklYTUU6ICBUaGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24uCi0JIFRoZSAnbG93JyBhbmQgJ2hpZ2gnIGFkZHJlc3NlcyBvZiB0aGUgY29tcF91bml0cyBhcmUgY29tcHV0ZWQgYnkgcmVsb2NzCi0JIGFnYWluc3Qgc3ltYm9scyBpbiB0aGUgLnRleHQgc2VnbWVudC4gIFdlIG5lZWQgdGhlc2UgYWRkcmVzc2VzIGluCi0JIG9yZGVyIHRvIGRldGVybWluZSB0aGUgbmVhcmVzdCBsaW5lIG51bWJlciwgYW5kIHNvIHdlIGhhdmUgdG8gcmVzb2x2ZQotCSB0aGUgcmVsb2NzLiAgVGhlcmUgaXMgYSBzaW1pbGFyIHByb2JsZW0gd2hlbiB0aGUgLmRlYnVnX2xpbmUgc2VjdGlvbiBpcwotCSBwcm9jZXNzZWQgYXMgd2VsbC4KLQkgCi0JIFVuZm9ydHVuYXRlbHkgZ2V0dGluZyBob2xkIG9mIHRoZSByZWxvYyBpbmZvcm1hdGlvbiBpcyBoYXJkLi4uICovCi0gICAgfQotICAKLSAgLyogQSBudWxsIGluZm9fcHRyIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIG5vIGR3YXJmMiBpbmZvIAotICAgICAob3IgdGhhdCBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHNldHRpbmcgdXAgdGhlIHN0YXNoKS4gKi8KLQotICBpZiAoISBzdGFzaC0+aW5mb19wdHIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENoZWNrIHRoZSBwcmV2aW91c2x5IHJlYWQgY29tcC4gdW5pdHMgZmlyc3QuICovCi0KLSAgZm9yIChlYWNoID0gc3Rhc2gtPmFsbF9jb21wX3VuaXRzOyBlYWNoOyBlYWNoID0gZWFjaC0+bmV4dF91bml0KQotICAgIHsKLSAgICAgIGlmIChjb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyAoZWFjaCwgYWRkcikpCi0JcmV0dXJuIGNvbXBfdW5pdF9maW5kX25lYXJlc3RfbGluZSAoZWFjaCwgYWRkciwKLQkJCQkJICAgIGZpbGVuYW1lX3B0ciwgCi0JCQkJCSAgICBmdW5jdGlvbm5hbWVfcHRyLCAKLQkJCQkJICAgIGxpbmVudW1iZXJfcHRyKTsKLSAgICB9Ci0KLSAgLyogUmVhZCBlYWNoIHJlbWFpbmluZyBjb21wLiB1bml0cyBjaGVja2luZyBlYWNoIGFzIHRoZXkgYXJlIHJlYWQuICovCi0gIHdoaWxlIChzdGFzaC0+aW5mb19wdHIgPCBzdGFzaC0+aW5mb19wdHJfZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBjb21wX3VuaXQqIGVhY2g7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCi0gICAgICBsZW5ndGggPSByZWFkXzRfYnl0ZXMgKGFiZmQsIHN0YXNoLT5pbmZvX3B0cik7Ci0gICAgICBzdGFzaC0+aW5mb19wdHIgKz0gNDsKLQotICAgICAgaWYgKGxlbmd0aCA+IDApCi0gICAgICAgIHsKLQkgIGVhY2ggPSBwYXJzZV9jb21wX3VuaXQgKGFiZmQsIHN0YXNoLT5pbmZvX3B0ciwgCi0JCQkJICBzdGFzaC0+aW5mb19wdHIgKyBsZW5ndGgpOwotCSAgc3Rhc2gtPmluZm9fcHRyICs9IGxlbmd0aDsKLQotCSAgaWYgKGVhY2gpCi0JICAgIHsKLQkgICAgICBlYWNoLT5uZXh0X3VuaXQgPSBzdGFzaC0+YWxsX2NvbXBfdW5pdHM7Ci0JICAgICAgc3Rhc2gtPmFsbF9jb21wX3VuaXRzID0gZWFjaDsKLQotCSAgICAgIGlmIChjb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyAoZWFjaCwgYWRkcikpCi0JCXJldHVybiBjb21wX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUgKGVhY2gsIGFkZHIsCi0JCQkJCQkgICAgZmlsZW5hbWVfcHRyLCAKLQkJCQkJCSAgICBmdW5jdGlvbm5hbWVfcHRyLCAKLQkJCQkJCSAgICBsaW5lbnVtYmVyX3B0cik7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogZW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL2JmZC9lY29mZi5jIGIvYmZkL2Vjb2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYTIzMDkuLjAwMDAwMDAKLS0tIGEvYmZkL2Vjb2ZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMyICswLDAgQEAKLS8qIEdlbmVyaWMgRUNPRkYgKEV4dGVuZGVkLUNPRkYpIHJvdXRpbmVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIE9yaWdpbmFsIHZlcnNpb24gYnkgUGVyIEJvdGhuZXIuCi0gICBGdWxsIHN1cHBvcnQgYWRkZWQgYnkgSWFuIExhbmNlIFRheWxvciwgaWFuQGN5Z251cy5jb20uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAiYW91dC9yYW5saWIuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLS8qIEZJWE1FOiBXZSBuZWVkIHRoZSBkZWZpbml0aW9ucyBvZiBOX1NFVFtBRFRCXSwgYnV0IGFvdXQ2NC5oIGRlZmluZXMKLSAgIHNvbWUgb3RoZXIgc3R1ZmYgd2hpY2ggd2UgZG9uJ3Qgd2FudCBhbmQgd2hpY2ggY29uZmxpY3RzIHdpdGggc3R1ZmYKLSAgIHdlIGRvIHdhbnQuICAqLwotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI3VuZGVmIE5fQUJTCi0jdW5kZWYgZXhlY19oZHIKLSN1bmRlZiBvYmpfc3ltX2ZpbGVwb3MKLQotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0MCi0vKiBQcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIGludCBlY29mZl9nZXRfbWFnaWMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgbG9uZyBlY29mZl9zZWNfdG9fc3R5cF9mbGFncyBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgICAgIGZsYWd3b3JkIGZsYWdzKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9zZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICphYmZkLCBTWU1SICplY29mZl9zeW0sCi0JCQkJCSAgIGFzeW1ib2wgKmFzeW0sIGludCBleHQsIGludCB3ZWFrKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9lbWl0X2FnZ3JlZ2F0ZSBQQVJBTVMgKChiZmQgKmFiZmQsIEZEUiAqZmRyLAotCQkJCQkgIGNoYXIgKnN0cmluZywKLQkJCQkJICBSTkRYUiAqcm5keCwgbG9uZyBpc3ltLAotCQkJCQkgIGNvbnN0IGNoYXIgKndoaWNoKSk7Ci1zdGF0aWMgY2hhciAqZWNvZmZfdHlwZV90b19zdHJpbmcgUEFSQU1TICgoYmZkICphYmZkLCBGRFIgKmZkciwKLQkJCQkJICAgdW5zaWduZWQgaW50IGluZHgpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQlhc3ltYm9sICoqc3ltYm9scykpOwotc3RhdGljIGludCBlY29mZl9zb3J0X2hkcnMgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9nZXRfZXh0ciBQQVJBTVMgKChhc3ltYm9sICosIEVYVFIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc2V0X2luZGV4IFBBUkFNUyAoKGFzeW1ib2wgKiwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIHVuc2lnbmVkIGludCBlY29mZl9hcm1hcF9oYXNoIFBBUkFNUyAoKENPTlNUIGNoYXIgKnMsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCAqcmVoYXNoLAotCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwKLQkJCQkJICAgICAgdW5zaWduZWQgaW50IGhsb2cpKTsKLQwKLS8qIFRoaXMgc3R1ZmYgaXMgc29tZXdoYXQgY29waWVkIGZyb20gY29mZmNvZGUuaC4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiBiZmRfZGVidWdfc2VjdGlvbiA9IHsgIipERUJVRyoiIH07Ci0KLS8qIENyZWF0ZSBhbiBFQ09GRiBvYmplY3QuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFiZmQtPnRkYXRhLmVjb2ZmX29ial9kYXRhID0gKChzdHJ1Y3QgZWNvZmZfdGRhdGEgKikKLQkJCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGVjb2ZmX2RhdGFfdHlwZSkpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLmVjb2ZmX29ial9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGEgaG9vayBjYWxsZWQgYnkgY29mZl9yZWFsX29iamVjdF9wIHRvIGNyZWF0ZSBhbnkgYmFja2VuZAotICAgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotCi1QVFIKLV9iZmRfZWNvZmZfbWtvYmplY3RfaG9vayAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLSAgICAgUFRSIGFvdXRoZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICppbnRlcm5hbF9hID0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIGFvdXRoZHI7Ci0gIGVjb2ZmX2RhdGFfdHlwZSAqZWNvZmY7Ci0KLSAgaWYgKF9iZmRfZWNvZmZfbWtvYmplY3QgKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiBOVUxMOwotCi0gIGVjb2ZmID0gZWNvZmZfZGF0YSAoYWJmZCk7Ci0gIGVjb2ZmLT5ncF9zaXplID0gODsKLSAgZWNvZmYtPnN5bV9maWxlcG9zID0gaW50ZXJuYWxfZi0+Zl9zeW1wdHI7Ci0KLSAgaWYgKGludGVybmFsX2EgIT0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIE5VTEwpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGVjb2ZmLT50ZXh0X3N0YXJ0ID0gaW50ZXJuYWxfYS0+dGV4dF9zdGFydDsKLSAgICAgIGVjb2ZmLT50ZXh0X2VuZCA9IGludGVybmFsX2EtPnRleHRfc3RhcnQgKyBpbnRlcm5hbF9hLT50c2l6ZTsKLSAgICAgIGVjb2ZmLT5ncCA9IGludGVybmFsX2EtPmdwX3ZhbHVlOwotICAgICAgZWNvZmYtPmdwcm1hc2sgPSBpbnRlcm5hbF9hLT5ncHJtYXNrOwotICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQllY29mZi0+Y3BybWFza1tpXSA9IGludGVybmFsX2EtPmNwcm1hc2tbaV07Ci0gICAgICBlY29mZi0+ZnBybWFzayA9IGludGVybmFsX2EtPmZwcm1hc2s7Ci0gICAgICBpZiAoaW50ZXJuYWxfYS0+bWFnaWMgPT0gRUNPRkZfQU9VVF9aTUFHSUMpCi0JYWJmZC0+ZmxhZ3MgfD0gRF9QQUdFRDsKLSAgICAgIGVsc2UKLQlhYmZkLT5mbGFncyAmPX4gRF9QQUdFRDsKLSAgICB9Ci0KLSAgLyogSXQgdHVybnMgb3V0IHRoYXQgbm8gc3BlY2lhbCBhY3Rpb24gaXMgcmVxdWlyZWQgYnkgdGhlIE1JUFMgb3IKLSAgICAgQWxwaGEgRUNPRkYgYmFja2VuZHMuICBUaGV5IGhhdmUgZGlmZmVyZW50IGluZm9ybWF0aW9uIGluIHRoZQotICAgICBhLm91dCBoZWFkZXIsIGJ1dCB3ZSBqdXN0IGNvcHkgaXQgYWxsIChlLmcuLCBncHJtYXNrLCBjcHJtYXNrIGFuZAotICAgICBmcHJtYXNrKSBhbmQgbGV0IHRoZSBzd2FwcGluZyByb3V0aW5lcyBlbnN1cmUgdGhhdCBvbmx5IHJlbGV2YW50Ci0gICAgIGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4gb3V0LiAgKi8KLQotICByZXR1cm4gKFBUUikgZWNvZmY7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBuZXcgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gNDsKLQotICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfVEVYVCkgPT0gMAotICAgICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfSU5JVCkgPT0gMAotICAgICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfRklOSSkgPT0gMCkKLSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICBlbHNlIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9EQVRBKSA9PSAwCi0JICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfU0RBVEEpID09IDApCi0gICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLSAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfUkRBVEEpID09IDAKLQkgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9MSVQ4KSA9PSAwCi0JICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfTElUNCkgPT0gMAotCSAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX1JDT05TVCkgPT0gMAotCSAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX1BEQVRBKSA9PSAwKQotICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfUkVBRE9OTFk7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0JTUykgPT0gMAotCSAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX1NCU1MpID09IDApCi0gICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0FMTE9DOwotICBlbHNlIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9MSUIpID09IDApCi0gICAgewotICAgICAgLyogQW4gSXJpeCA0IHNoYXJlZCBsaWJhcnkuICAqLwotICAgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgfQotCi0gIC8qIFByb2JhYmx5IGFueSBvdGhlciBzZWN0aW9uIG5hbWUgaXMgU0VDX05FVkVSX0xPQUQsIGJ1dCBJJ20KLSAgICAgdW5jZXJ0YWluIGFib3V0IC5pbml0IG9uIHNvbWUgc3lzdGVtcyBhbmQgSSBkb24ndCBrbm93IGhvdyBzaGFyZWQKLSAgICAgbGlicmFyaWVzIHdvcmsuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZXRlcm1pbmUgdGhlIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIGFuZCB0eXBlLiAgVGhpcyBpcyBjYWxsZWQgZnJvbQotICAgdGhlIGdlbmVyaWMgQ09GRiByb3V0aW5lcy4gIEl0IGlzIHRoZSBpbnZlcnNlIG9mIGVjb2ZmX2dldF9tYWdpYywKLSAgIGJlbG93LiAgVGhpcyBjb3VsZCBiZSBhbiBFQ09GRiBiYWNrZW5kIHJvdXRpbmUsIHdpdGggb25lIHZlcnNpb24KLSAgIGZvciBlYWNoIHRhcmdldCwgYnV0IHRoZXJlIGFyZW4ndCBhbGwgdGhhdCBtYW55IEVDT0ZGIHRhcmdldHMuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2hfaG9vayAoYWJmZCwgZmlsZWhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIHVuc2lnbmVkIGxvbmcgbWFjaDsKLQotICBzd2l0Y2ggKGludGVybmFsX2YtPmZfbWFnaWMpCi0gICAgewotICAgIGNhc2UgTUlQU19NQUdJQ18xOgotICAgIGNhc2UgTUlQU19NQUdJQ19MSVRUTEU6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0JJRzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOwotICAgICAgbWFjaCA9IDMwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTUlQU19NQUdJQ19MSVRUTEUyOgotICAgIGNhc2UgTUlQU19NQUdJQ19CSUcyOgotICAgICAgLyogTUlQUyBJU0EgbGV2ZWwgMjogdGhlIHI2MDAwICovCi0gICAgICBhcmNoID0gYmZkX2FyY2hfbWlwczsKLSAgICAgIG1hY2ggPSA2MDAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1JUFNfTUFHSUNfTElUVExFMzoKLSAgICBjYXNlIE1JUFNfTUFHSUNfQklHMzoKLSAgICAgIC8qIE1JUFMgSVNBIGxldmVsIDM6IHRoZSByNDAwMCAqLwotICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgICBtYWNoID0gNDAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9NQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9hbHBoYTsKLSAgICAgIG1hY2ggPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXJjaCA9IGJmZF9hcmNoX29ic2N1cmU7Ci0gICAgICBtYWNoID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaCk7Ci19Ci0KLS8qIEdldCB0aGUgbWFnaWMgbnVtYmVyIHRvIHVzZSBiYXNlZCBvbiB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lLgotICAgVGhpcyBpcyB0aGUgaW52ZXJzZSBvZiBfYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywgYWJvdmUuICAqLwotCi1zdGF0aWMgaW50Ci1lY29mZl9nZXRfbWFnaWMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGJpZywgbGl0dGxlOwotCi0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF9taXBzOgotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQlkZWZhdWx0OgotCWNhc2UgMDoKLQljYXNlIDMwMDA6Ci0JICBiaWcgPSBNSVBTX01BR0lDX0JJRzsKLQkgIGxpdHRsZSA9IE1JUFNfTUFHSUNfTElUVExFOwotCSAgYnJlYWs7Ci0KLQljYXNlIDYwMDA6Ci0JICBiaWcgPSBNSVBTX01BR0lDX0JJRzI7Ci0JICBsaXR0bGUgPSBNSVBTX01BR0lDX0xJVFRMRTI7Ci0JICBicmVhazsKLQotCWNhc2UgNDAwMDoKLQkgIGJpZyA9IE1JUFNfTUFHSUNfQklHMzsKLQkgIGxpdHRsZSA9IE1JUFNfTUFHSUNfTElUVExFMzsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgcmV0dXJuIGJmZF9iaWdfZW5kaWFuIChhYmZkKSA/IGJpZyA6IGxpdHRsZTsKLQotICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6Ci0gICAgICByZXR1cm4gQUxQSEFfTUFHSUM7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qIEdldCB0aGUgc2VjdGlvbiBzX2ZsYWdzIHRvIHVzZSBmb3IgYSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGxvbmcKLWVjb2ZmX3NlY190b19zdHlwX2ZsYWdzIChuYW1lLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIGxvbmcgc3R5cDsKLQotICBzdHlwID0gMDsKLQotICBpZiAoc3RyY21wIChuYW1lLCBfVEVYVCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9URVhUOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9EQVRBKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0RBVEE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1NEQVRBKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1NEQVRBOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9SREFUQSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9SREFUQTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElUQSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9MSVRBOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9MSVQ4KSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0xJVDg7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJVDQpID09IDApCi0gICAgc3R5cCA9IFNUWVBfTElUNDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfQlNTKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0JTUzsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfU0JTUykgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9TQlNTOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9JTklUKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0VDT0ZGX0lOSVQ7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0ZJTkkpID09IDApCi0gICAgc3R5cCA9IFNUWVBfRUNPRkZfRklOSTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUERBVEEpID09IDApCi0gICAgc3R5cCA9IFNUWVBfUERBVEE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1hEQVRBKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1hEQVRBOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9MSUIpID09IDApCi0gICAgc3R5cCA9IFNUWVBfRUNPRkZfTElCOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9HT1QpID09IDApCi0gICAgc3R5cCA9IFNUWVBfR09UOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9IQVNIKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0hBU0g7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RZTkFNSUMpID09IDApCi0gICAgc3R5cCA9IFNUWVBfRFlOQU1JQzsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElCTElTVCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9MSUJMSVNUOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9SRUxEWU4pID09IDApCi0gICAgc3R5cCA9IFNUWVBfUkVMRFlOOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9DT05GTElDKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0NPTkZMSUM7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RZTlNUUikgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9EWU5TVFI7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RZTlNZTSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9EWU5TWU07Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0NPTU1FTlQpID09IDApCi0gICAgewotICAgICAgc3R5cCA9IFNUWVBfQ09NTUVOVDsKLSAgICAgIGZsYWdzICY9fiBTRUNfTkVWRVJfTE9BRDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1JDT05TVCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9SQ09OU1Q7Ci0gIGVsc2UgaWYgKGZsYWdzICYgU0VDX0NPREUpIAotICAgIHN0eXAgPSBTVFlQX1RFWFQ7Ci0gIGVsc2UgaWYgKGZsYWdzICYgU0VDX0RBVEEpIAotICAgIHN0eXAgPSBTVFlQX0RBVEE7Ci0gIGVsc2UgaWYgKGZsYWdzICYgU0VDX1JFQURPTkxZKQotICAgIHN0eXAgPSBTVFlQX1JEQVRBOwotICBlbHNlIGlmIChmbGFncyAmIFNFQ19MT0FEKQotICAgIHN0eXAgPSBTVFlQX1JFRzsKLSAgZWxzZQotICAgIHN0eXAgPSBTVFlQX0JTUzsKLQotICBpZiAoZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLSAgICBzdHlwIHw9IFNUWVBfTk9MT0FEOwotCi0gIHJldHVybiBzdHlwOwotfQotCi0vKiBHZXQgdGhlIEJGRCBmbGFncyB0byB1c2UgZm9yIGEgc2VjdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotZmxhZ3dvcmQKLV9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgaGRyOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICppbnRlcm5hbF9zID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaGRyOwotICBsb25nIHN0eXBfZmxhZ3MgPSBpbnRlcm5hbF9zLT5zX2ZsYWdzOwotICBmbGFnd29yZCBzZWNfZmxhZ3M9MDsKLQotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfTk9MT0FEKQotICAgIHNlY19mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLQotICAvKiBGb3IgMzg2IENPRkYsIGF0IGxlYXN0LCBhbiB1bmxvYWRhYmxlIHRleHQgb3IgZGF0YSBzZWN0aW9uIGlzCi0gICAgIGFjdHVhbGx5IGEgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4gICovCi0gIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfVEVYVCkKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9FQ09GRl9JTklUKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0VDT0ZGX0ZJTkkpCi0gICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfRFlOQU1JQykKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSUJMSVNUKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX1JFTERZTikKLSAgICAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9DT05GTElDCi0gICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfRFlOU1RSKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0RZTlNZTSkKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9IQVNIKSkKLSAgICB7Ci0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0Jc2VjX2ZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gICAgfQotICBlbHNlIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfREFUQSkKLQkgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfUkRBVEEpCi0JICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX1NEQVRBKQotCSAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9QREFUQQotCSAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9YREFUQQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9HT1QpCi0JICAgfHwgc3R5cF9mbGFncyA9PSBTVFlQX1JDT05TVCkKLSAgICB7Ci0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gICAgICBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX1JEQVRBKQotCSAgfHwgc3R5cF9mbGFncyA9PSBTVFlQX1BEQVRBCi0JICB8fCBzdHlwX2ZsYWdzID09IFNUWVBfUkNPTlNUKQotCXNlY19mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0gICAgfQotICBlbHNlIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfQlNTKQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9TQlNTKSkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX0lORk8pIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9DT01NRU5UKQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLSAgICB9Ci0gIGVsc2UgaWYgKChzdHlwX2ZsYWdzICYgU1RZUF9MSVRBKQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSVQ4KQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSVQ0KSkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19SRUFET05MWTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0VDT0ZGX0xJQikKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotICAgIH0KLQotICByZXR1cm4gc2VjX2ZsYWdzOwotfQotDAotLyogUmVhZCBpbiB0aGUgc3ltYm9saWMgaGVhZGVyIGZvciBhbiBFQ09GRiBvYmplY3QgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9oZHJfc2l6ZTsKLSAgUFRSIHJhdyA9IE5VTEw7Ci0gIEhEUlIgKmludGVybmFsX3N5bWhkcjsKLQotICAvKiBTZWUgaWYgd2UndmUgYWxyZWFkeSByZWFkIGl0IGluLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5tYWdpYyA9PSAKLSAgICAgIGJhY2tlbmQtPmRlYnVnX3N3YXAuc3ltX21hZ2ljKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFNlZSB3aGV0aGVyIHRoZXJlIGlzIGEgc3ltYm9saWMgaGVhZGVyLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBBdCB0aGlzIHBvaW50IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpIGhvbGRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scwotICAgICBhcyByZWFkIGZyb20gdGhlIGZpbGUgaGVhZGVyLCBidXQgb24gRUNPRkYgdGhpcyBpcyBhbHdheXMgdGhlCi0gICAgIHNpemUgb2YgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIGhlYWRlci4gIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8KLSAgICAgaGFuZGxlIHRoaXMgd2hlbiB3ZSBmaXJzdCByZWFkIHRoZSBmaWxlIGluIGNvZmZnZW4uYy4gICovCi0gIGV4dGVybmFsX2hkcl9zaXplID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9oZHJfc2l6ZTsKLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IGV4dGVybmFsX2hkcl9zaXplKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBoZWFkZXIuICAqLwotICByYXcgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBleHRlcm5hbF9oZHJfc2l6ZSk7Ci0gIGlmIChyYXcgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcywgU0VFS19TRVQpID09IC0xCi0gICAgICB8fCAoYmZkX3JlYWQgKHJhdywgZXh0ZXJuYWxfaGRyX3NpemUsIDEsIGFiZmQpCi0JICAhPSBleHRlcm5hbF9oZHJfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGludGVybmFsX3N5bWhkciA9ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXI7Ci0gICgqYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2hkcl9pbikgKGFiZmQsIHJhdywgaW50ZXJuYWxfc3ltaGRyKTsKLQotICBpZiAoaW50ZXJuYWxfc3ltaGRyLT5tYWdpYyAhPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLnN5bV9tYWdpYykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBOb3cgd2UgY2FuIGdldCB0aGUgY29ycmVjdCBudW1iZXIgb2Ygc3ltYm9scy4gICovCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gKGludGVybmFsX3N5bWhkci0+aXN5bU1heAotCQkJICAgICArIGludGVybmFsX3N5bWhkci0+aWV4dE1heCk7Ci0KLSAgaWYgKHJhdyAhPSBOVUxMKQotICAgIGZyZWUgKHJhdyk7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHJhdyAhPSBOVUxMKQotICAgIGZyZWUgKHJhdyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVhZCBpbiBhbmQgc3dhcCB0aGUgaW1wb3J0YW50IHN5bWJvbGljIGluZm9ybWF0aW9uIGZvciBhbiBFQ09GRgotICAgb2JqZWN0IGZpbGUuICBUaGlzIGlzIGNhbGxlZCBieSBnZGIgdmlhIHRoZSByZWFkX2RlYnVnX2luZm8gZW50cnkKLSAgIHBvaW50IGluIHRoZSBiYWNrZW5kIHN0cnVjdHVyZS4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvIChhYmZkLCBpZ25vcmUsIGRlYnVnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppZ25vcmU7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgSERSUiAqaW50ZXJuYWxfc3ltaGRyOwotICBiZmRfc2l6ZV90eXBlIHJhd19iYXNlOwotICBiZmRfc2l6ZV90eXBlIHJhd19zaXplOwotICBQVFIgcmF3OwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Zkcl9zaXplOwotICBjaGFyICpmcmF3X3NyYzsKLSAgY2hhciAqZnJhd19lbmQ7Ci0gIHN0cnVjdCBmZHIgKmZkcl9wdHI7Ci0gIGJmZF9zaXplX3R5cGUgcmF3X2VuZDsKLSAgYmZkX3NpemVfdHlwZSBjYl9lbmQ7Ci0KLSAgQkZEX0FTU0VSVCAoZGVidWcgPT0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvKTsKLQotICAvKiBDaGVjayB3aGV0aGVyIHdlJ3ZlIGFscmVhZHkgZ290dGVuIGl0LCBhbmQgd2hldGhlciB0aGVyZSdzIGFueSB0bwotICAgICBnZXQuICAqLwotICBpZiAoZWNvZmZfZGF0YSAoYWJmZCktPnJhd19zeW1lbnRzICE9IChQVFIpIE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IDA7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKCEgZWNvZmZfc2x1cnBfc3ltYm9saWNfaGVhZGVyIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW50ZXJuYWxfc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0KLSAgLyogUmVhZCBhbGwgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIGF0IG9uY2UuICAqLwotICByYXdfYmFzZSA9IChlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MKLQkgICAgICArIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfaGRyX3NpemUpOwotCi0gIC8qIEFscGhhIGVjb2ZmIG1ha2VzIHRoZSBkZXRlcm1pbmF0aW9uIG9mIHJhd19zaXplIGRpZmZpY3VsdC4gSXQgaGFzCi0gICAgIGFuIHVuZG9jdW1lbnRlZCBkZWJ1ZyBkYXRhIHNlY3Rpb24gYmV0d2VlbiB0aGUgc3ltaGRyIGFuZCB0aGUgZmlyc3QKLSAgICAgZG9jdW1lbnRlZCBzZWN0aW9uLiBBbmQgdGhlIG9yZGVyaW5nIG9mIHRoZSBzZWN0aW9ucyB2YXJpZXMgYmV0d2VlbgotICAgICBzdGF0aWNhbGx5IGFuZCBkeW5hbWljYWxseSBsaW5rZWQgZXhlY3V0YWJsZXMuCi0gICAgIElmIGJmZCBzdXBwb3J0cyBTRUVLX0VORCBzb21lZGF5LCB0aGlzIGNvZGUgY291bGQgYmUgc2ltcGxpZmllZC4gICovCi0KLSAgcmF3X2VuZCA9IDA7Ci0KLSNkZWZpbmUgVVBEQVRFX1JBV19FTkQoc3RhcnQsIGNvdW50LCBzaXplKSBcCi0gIGNiX2VuZCA9IGludGVybmFsX3N5bWhkci0+c3RhcnQgKyBpbnRlcm5hbF9zeW1oZHItPmNvdW50ICogKHNpemUpOyBcCi0gIGlmIChjYl9lbmQgPiByYXdfZW5kKSBcCi0gICAgcmF3X2VuZCA9IGNiX2VuZAotCi0gIFVQREFURV9SQVdfRU5EIChjYkxpbmVPZmZzZXQsIGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYkRuT2Zmc2V0LCBpZG5NYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZG5yX3NpemUpOwotICBVUERBVEVfUkFXX0VORCAoY2JQZE9mZnNldCwgaXBkTWF4LCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX3Bkcl9zaXplKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiU3ltT2Zmc2V0LCBpc3ltTWF4LCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX3N5bV9zaXplKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiT3B0T2Zmc2V0LCBpb3B0TWF4LCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX29wdF9zaXplKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiQXV4T2Zmc2V0LCBpYXV4TWF4LCBzaXplb2YgKHVuaW9uIGF1eF9leHQpKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiU3NPZmZzZXQsIGlzc01heCwgc2l6ZW9mIChjaGFyKSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYlNzRXh0T2Zmc2V0LCBpc3NFeHRNYXgsIHNpemVvZiAoY2hhcikpOwotICBVUERBVEVfUkFXX0VORCAoY2JGZE9mZnNldCwgaWZkTWF4LCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2Zkcl9zaXplKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiUmZkT2Zmc2V0LCBjcmZkLCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX3JmZF9zaXplKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiRXh0T2Zmc2V0LCBpZXh0TWF4LCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2V4dF9zaXplKTsKLQotI3VuZGVmIFVQREFURV9SQVdfRU5ECi0KLSAgcmF3X3NpemUgPSByYXdfZW5kIC0gcmF3X2Jhc2U7Ci0gIGlmIChyYXdfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyA9IDA7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJhdyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmF3X3NpemUpOwotICBpZiAocmF3ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCShlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MKLQkJICsgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9oZHJfc2l6ZSksCi0JCVNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAocmF3LCByYXdfc2l6ZSwgMSwgYWJmZCkgIT0gcmF3X3NpemUpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJhdyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5yYXdfc3ltZW50cyA9IHJhdzsKLQotICAvKiBHZXQgcG9pbnRlcnMgZm9yIHRoZSBudW1lcmljIG9mZnNldHMgaW4gdGhlIEhEUlIgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgRklYKG9mZjEsIG9mZjIsIHR5cGUpIFwKLSAgaWYgKGludGVybmFsX3N5bWhkci0+b2ZmMSA9PSAwKSBcCi0gICAgZGVidWctPm9mZjIgPSAodHlwZSkgTlVMTDsgXAotICBlbHNlIFwKLSAgICBkZWJ1Zy0+b2ZmMiA9ICh0eXBlKSAoKGNoYXIgKikgcmF3IFwKLQkJCSAgKyAoaW50ZXJuYWxfc3ltaGRyLT5vZmYxIFwKLQkJCSAgICAgLSByYXdfYmFzZSkpCi0gIEZJWCAoY2JMaW5lT2Zmc2V0LCBsaW5lLCB1bnNpZ25lZCBjaGFyICopOwotICBGSVggKGNiRG5PZmZzZXQsIGV4dGVybmFsX2RuciwgUFRSKTsKLSAgRklYIChjYlBkT2Zmc2V0LCBleHRlcm5hbF9wZHIsIFBUUik7Ci0gIEZJWCAoY2JTeW1PZmZzZXQsIGV4dGVybmFsX3N5bSwgUFRSKTsKLSAgRklYIChjYk9wdE9mZnNldCwgZXh0ZXJuYWxfb3B0LCBQVFIpOwotICBGSVggKGNiQXV4T2Zmc2V0LCBleHRlcm5hbF9hdXgsIHVuaW9uIGF1eF9leHQgKik7Ci0gIEZJWCAoY2JTc09mZnNldCwgc3MsIGNoYXIgKik7Ci0gIEZJWCAoY2JTc0V4dE9mZnNldCwgc3NleHQsIGNoYXIgKik7Ci0gIEZJWCAoY2JGZE9mZnNldCwgZXh0ZXJuYWxfZmRyLCBQVFIpOwotICBGSVggKGNiUmZkT2Zmc2V0LCBleHRlcm5hbF9yZmQsIFBUUik7Ci0gIEZJWCAoY2JFeHRPZmZzZXQsIGV4dGVybmFsX2V4dCwgUFRSKTsKLSN1bmRlZiBGSVgKLQotICAvKiBJIGRvbid0IHdhbnQgdG8gYWx3YXlzIHN3YXAgYWxsIHRoZSBkYXRhLCBiZWNhdXNlIGl0IHdpbGwganVzdAotICAgICB3YXN0ZSB0aW1lIGFuZCBtb3N0IHByb2dyYW1zIHdpbGwgbmV2ZXIgbG9vayBhdCBpdC4gIFRoZSBvbmx5Ci0gICAgIHRpbWUgdGhlIGxpbmtlciBuZWVkcyBtb3N0IG9mIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gc3dhcHBlZAotICAgICBpcyB3aGVuIGxpbmtpbmcgYmlnLWVuZGlhbiBhbmQgbGl0dGxlLWVuZGlhbiBNSVBTIG9iamVjdCBmaWxlcwotICAgICB0b2dldGhlciwgd2hpY2ggaXMgbm90IGEgY29tbW9uIG9jY3VycmVuY2UuCi0KLSAgICAgV2UgbmVlZCB0byBsb29rIGF0IHRoZSBmZHIgdG8gZGVhbCB3aXRoIGEgbG90IG9mIGluZm9ybWF0aW9uIGluCi0gICAgIHRoZSBzeW1ib2xzLCBzbyB3ZSBzd2FwIHRoZW0gaGVyZS4gICovCi0gIGRlYnVnLT5mZHIgPSAoc3RydWN0IGZkciAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAoaW50ZXJuYWxfc3ltaGRyLT5pZmRNYXggKgotCQkJCQkgIHNpemVvZiAoc3RydWN0IGZkcikpKTsKLSAgaWYgKGRlYnVnLT5mZHIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGV4dGVybmFsX2Zkcl9zaXplID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9mZHJfc2l6ZTsKLSAgZmRyX3B0ciA9IGRlYnVnLT5mZHI7Ci0gIGZyYXdfc3JjID0gKGNoYXIgKikgZGVidWctPmV4dGVybmFsX2ZkcjsKLSAgZnJhd19lbmQgPSBmcmF3X3NyYyArIGludGVybmFsX3N5bWhkci0+aWZkTWF4ICogZXh0ZXJuYWxfZmRyX3NpemU7Ci0gIGZvciAoOyBmcmF3X3NyYyA8IGZyYXdfZW5kOyBmcmF3X3NyYyArPSBleHRlcm5hbF9mZHJfc2l6ZSwgZmRyX3B0cisrKQotICAgICgqYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2Zkcl9pbikgKGFiZmQsIChQVFIpIGZyYXdfc3JjLCBmZHJfcHRyKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEVDT0ZGIHN5bWJvbCB0YWJsZSByb3V0aW5lcy4gIFRoZSBFQ09GRiBzeW1ib2wgdGFibGUgaXMgZGVzY3JpYmVkCi0gICBpbiBnY2MvbWlwcy10ZmlsZS5jLiAgKi8KLQotLyogRUNPRkYgdXNlcyB0d28gY29tbW9uIHNlY3Rpb25zLiAgT25lIGlzIHRoZSB1c3VhbCBvbmUsIGFuZCB0aGUKLSAgIG90aGVyIGlzIGZvciBzbWFsbCBvYmplY3RzLiAgQWxsIHRoZSBzbWFsbCBvYmplY3RzIGFyZSBrZXB0Ci0gICB0b2dldGhlciwgYW5kIHRoZW4gcmVmZXJlbmNlZCB2aWEgdGhlIGdwIHBvaW50ZXIsIHdoaWNoIHlpZWxkcwotICAgZmFzdGVyIGFzc2VtYmxlciBjb2RlLiAgVGhpcyBpcyB3aGF0IHdlIHVzZSBmb3IgdGhlIHNtYWxsIGNvbW1vbgotICAgc2VjdGlvbi4gICovCi1zdGF0aWMgYXNlY3Rpb24gZWNvZmZfc2NvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgZWNvZmZfc2NvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqZWNvZmZfc2NvbV9zeW1ib2xfcHRyOwotCi0vKiBDcmVhdGUgYW4gZW1wdHkgc3ltYm9sLiAgKi8KLQotYXN5bWJvbCAqCi1fYmZkX2Vjb2ZmX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGVjb2ZmX3N5bWJvbF90eXBlICpuZXc7Ci0KLSAgbmV3ID0gKGVjb2ZmX3N5bWJvbF90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChlY29mZl9zeW1ib2xfdHlwZSkpOwotICBpZiAobmV3ID09IChlY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMKQotICAgIHJldHVybiAoYXN5bWJvbCAqKSBOVUxMOwotICBtZW1zZXQgKChQVFIpIG5ldywgMCwgc2l6ZW9mICpuZXcpOwotICBuZXctPnN5bWJvbC5zZWN0aW9uID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIG5ldy0+ZmRyID0gKEZEUiAqKSBOVUxMOwotICBuZXctPmxvY2FsID0gZmFsc2U7Ci0gIG5ldy0+bmF0aXZlID0gTlVMTDsKLSAgbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiAmbmV3LT5zeW1ib2w7Ci19Ci0KLS8qIFNldCB0aGUgQkZEIGZsYWdzIGFuZCBzZWN0aW9uIGZvciBhbiBFQ09GRiBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfc2V0X3N5bWJvbF9pbmZvIChhYmZkLCBlY29mZl9zeW0sIGFzeW0sIGV4dCwgd2VhaykKLSAgICAgYmZkICphYmZkOwotICAgICBTWU1SICplY29mZl9zeW07Ci0gICAgIGFzeW1ib2wgKmFzeW07Ci0gICAgIGludCBleHQ7Ci0gICAgIGludCB3ZWFrOwotewotICBhc3ltLT50aGVfYmZkID0gYWJmZDsKLSAgYXN5bS0+dmFsdWUgPSBlY29mZl9zeW0tPnZhbHVlOwotICBhc3ltLT5zZWN0aW9uID0gJmJmZF9kZWJ1Z19zZWN0aW9uOwotICBhc3ltLT51ZGF0YS5pID0gMDsKLQotICAvKiBNb3N0IHN5bWJvbCB0eXBlcyBhcmUganVzdCBmb3IgZGVidWdnaW5nLiAgKi8KLSAgc3dpdGNoIChlY29mZl9zeW0tPnN0KQotICAgIHsKLSAgICBjYXNlIHN0R2xvYmFsOgotICAgIGNhc2Ugc3RTdGF0aWM6Ci0gICAgY2FzZSBzdExhYmVsOgotICAgIGNhc2Ugc3RQcm9jOgotICAgIGNhc2Ugc3RTdGF0aWNQcm9jOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzdE5pbDoKLSAgICAgIGlmIChFQ09GRl9JU19TVEFCIChlY29mZl9zeW0pKQotCXsKLQkgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKHdlYWspCi0gICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfRVhQT1JUIHwgQlNGX1dFQUs7Ci0gIGVsc2UgaWYgKGV4dCkKLSAgICBhc3ltLT5mbGFncyA9IEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMOwotICBlbHNlCi0gICAgewotICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0gICAgICAvKiBOb3JtYWxseSwgYSBsb2NhbCBzdFByb2Mgc3ltYm9sIHdpbGwgaGF2ZSBhIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgIGV4dGVybmFsIHN5bWJvbC4gIFdlIG1hcmsgdGhlIGxvY2FsIHN5bWJvbCBhcyBhIGRlYnVnZ2luZwotICAgICAgICAgc3ltYm9sLCBpbiBvcmRlciB0byBwcmV2ZW50IG5tIGZyb20gcHJpbnRpbmcgYm90aCBvdXQuCi0gICAgICAgICBTaW1pbGFybHksIHdlIG1hcmsgc3RMYWJlbCBhbmQgc3RhYnMgc3ltYm9scyBhcyBkZWJ1Z2dpbmcKLSAgICAgICAgIHN5bWJvbHMuICBJbiBib3RoIGNhc2VzLCB3ZSBkbyB3YW50IHRvIHNldCB0aGUgdmFsdWUKLSAgICAgICAgIGNvcnJlY3RseSBiYXNlZCBvbiB0aGUgc3ltYm9sIGNsYXNzLiAgKi8KLSAgICAgIGlmIChlY29mZl9zeW0tPnN0ID09IHN0UHJvYwotCSAgfHwgZWNvZmZfc3ltLT5zdCA9PSBzdExhYmVsCi0JICB8fCBFQ09GRl9JU19TVEFCIChlY29mZl9zeW0pKQotCWFzeW0tPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0gICAgfQotICBzd2l0Y2ggKGVjb2ZmX3N5bS0+c2MpCi0gICAgewotICAgIGNhc2Ugc2NOaWw6Ci0gICAgICAvKiBVc2VkIGZvciBjb21waWxlciBnZW5lcmF0ZWQgbGFiZWxzLiAgTGVhdmUgdGhlbSBpbiB0aGUKLQkgZGVidWdnaW5nIHNlY3Rpb24sIGFuZCBtYXJrIHRoZW0gYXMgbG9jYWwuICBJZiBCU0ZfREVCVUdHSU5HCi0JIGlzIHNldCwgdGhlbiBubSBkb2VzIG5vdCBkaXNwbGF5IHRoZW0gZm9yIHNvbWUgcmVhc29uLiAgSWYgbm8KLQkgZmxhZ3MgYXJlIHNldCB0aGVuIHRoZSBsaW5rZXIgd2hpbmVzIGFib3V0IHRoZW0uICAqLwotICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjVGV4dDoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIudGV4dCIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY0RhdGE6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmRhdGEiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NCc3M6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmJzcyIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1JlZ2lzdGVyOgotICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY0FiczoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1VuZGVmaW5lZDoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgYXN5bS0+ZmxhZ3MgPSAwOwotICAgICAgYXN5bS0+dmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY0NkYkxvY2FsOgotICAgIGNhc2Ugc2NCaXRzOgotICAgIGNhc2Ugc2NDZGJTeXN0ZW06Ci0gICAgY2FzZSBzY1JlZ0ltYWdlOgotICAgIGNhc2Ugc2NJbmZvOgotICAgIGNhc2Ugc2NVc2VyU3RydWN0OgotICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1NEYXRhOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5zZGF0YSIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1NCc3M6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNic3MiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NSRGF0YToKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIucmRhdGEiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NWYXI6Ci0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjQ29tbW9uOgotICAgICAgaWYgKGFzeW0tPnZhbHVlID4gZWNvZmZfZGF0YSAoYWJmZCktPmdwX3NpemUpCi0JewotCSAgYXN5bS0+c2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBhc3ltLT5mbGFncyA9IDA7Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2Ugc2NTQ29tbW9uOgotICAgICAgaWYgKGVjb2ZmX3Njb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JewotCSAgLyogSW5pdGlhbGl6ZSB0aGUgc21hbGwgY29tbW9uIHNlY3Rpb24uICAqLwotCSAgZWNvZmZfc2NvbV9zZWN0aW9uLm5hbWUgPSBTQ09NTU9OOwotCSAgZWNvZmZfc2NvbV9zZWN0aW9uLmZsYWdzID0gU0VDX0lTX0NPTU1PTjsKLQkgIGVjb2ZmX3Njb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICZlY29mZl9zY29tX3NlY3Rpb247Ci0JICBlY29mZl9zY29tX3NlY3Rpb24uc3ltYm9sID0gJmVjb2ZmX3Njb21fc3ltYm9sOwotCSAgZWNvZmZfc2NvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJmVjb2ZmX3Njb21fc3ltYm9sX3B0cjsKLQkgIGVjb2ZmX3Njb21fc3ltYm9sLm5hbWUgPSBTQ09NTU9OOwotCSAgZWNvZmZfc2NvbV9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICBlY29mZl9zY29tX3N5bWJvbC5zZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLQkgIGVjb2ZmX3Njb21fc3ltYm9sX3B0ciA9ICZlY29mZl9zY29tX3N5bWJvbDsKLQl9Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLSAgICAgIGFzeW0tPmZsYWdzID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NWYXJSZWdpc3RlcjoKLSAgICBjYXNlIHNjVmFyaWFudDoKLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NTVW5kZWZpbmVkOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBhc3ltLT5mbGFncyA9IDA7Ci0gICAgICBhc3ltLT52YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjSW5pdDoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuaW5pdCIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY0Jhc2VkVmFyOgotICAgIGNhc2Ugc2NYRGF0YToKLSAgICBjYXNlIHNjUERhdGE6Ci0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjRmluaToKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuZmluaSIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1JDb25zdDoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIucmNvbnN0Iik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIExvb2sgZm9yIHNwZWNpYWwgY29uc3RydWN0b3JzIHN5bWJvbHMgYW5kIG1ha2UgcmVsb2NhdGlvbiBlbnRyaWVzCi0gICAgIGluIGEgc3BlY2lhbCBjb25zdHJ1Y3Rpb24gc2VjdGlvbi4gIFRoZXNlIGFyZSBwcm9kdWNlZCBieSB0aGUKLSAgICAgLWZnbnUtbGlua2VyIGFyZ3VtZW50IHRvIGcrKy4gICovCi0gIGlmIChFQ09GRl9JU19TVEFCIChlY29mZl9zeW0pKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUNPRkZfVU5NQVJLX1NUQUIgKGVjb2ZmX3N5bS0+aW5kZXgpKQotCXsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0KLQljYXNlIE5fU0VUQToKLQljYXNlIE5fU0VUVDoKLQljYXNlIE5fU0VURDoKLQljYXNlIE5fU0VUQjoKLQkgIHsKLQkgICAgLyogVGhpcyBjb2RlIGlzIG5vIGxvbmdlciBuZWVkZWQuICBJdCB1c2VkIHRvIGJlIHVzZWQgdG8KLQkgICAgICAgbWFrZSB0aGUgbGlua2VyIGhhbmRsZSBzZXQgc3ltYm9scywgYnV0IHRoZXkgYXJlIG5vdwotCSAgICAgICBoYW5kbGVkIGluIHRoZSBhZGRfc3ltYm9scyByb3V0aW5lIGluc3RlYWQuICAqLwotI2lmIDAKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0JICAgIGFyZWxlbnRfY2hhaW4gKnJlbG9jX2NoYWluOwotCSAgICB1bnNpZ25lZCBpbnQgYml0c2l6ZTsKLQotCSAgICAvKiBHZXQgYSBzZWN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgc3ltYm9sICh1c3VhbGx5Ci0JICAgICAgIF9fQ1RPUl9MSVNUX18gb3IgX19EVE9SX0xJU1RfXykuICBGSVhNRTogZ2NjIHVzZXMgdGhlCi0JICAgICAgIG5hbWUgX19fQ1RPUl9MSVNUICh0aHJlZSB1bmRlcnNjb3JlcykuICBXZSBuZWVkCi0JICAgICAgIF9fQ1RPUl9MSVNUICh0d28gdW5kZXJzY29yZXMpLCBzaW5jZSBFQ09GRiBkb2Vzbid0IHVzZQotCSAgICAgICBhIGxlYWRpbmcgdW5kZXJzY29yZS4gIFRoaXMgc2hvdWxkIGJlIGhhbmRsZWQgYnkgZ2NjLAotCSAgICAgICBidXQgaW5zdGVhZCB3ZSBkbyBpdCBoZXJlLiAgQWN0dWFsbHksIHRoaXMgc2hvdWxkIGFsbAotCSAgICAgICBiZSBkb25lIGRpZmZlcmVudGx5IGFueWhvdy4gICovCi0JICAgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChhc3ltKTsKLQkgICAgaWYgKG5hbWVbMF0gPT0gJ18nICYmIG5hbWVbMV0gPT0gJ18nICYmIG5hbWVbMl0gPT0gJ18nKQotCSAgICAgIHsKLQkJKytuYW1lOwotCQlhc3ltLT5uYW1lID0gbmFtZTsKLQkgICAgICB9Ci0JICAgIHNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7Ci0JICAgIGlmIChzZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQotCSAgICAgIHsKLQkJY2hhciAqY29weTsKLQotCQljb3B5ID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWUpICsgMSk7Ci0JCWlmICghY29weSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCXN0cmNweSAoY29weSwgbmFtZSk7Ci0JCXNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBjb3B5KTsKLQkgICAgICB9Ci0KLQkgICAgLyogQnVpbGQgYSByZWxvYyBwb2ludGluZyB0byB0aGlzIGNvbnN0cnVjdG9yLiAgKi8KLQkgICAgcmVsb2NfY2hhaW4gPQotCSAgICAgIChhcmVsZW50X2NoYWluICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChhcmVsZW50X2NoYWluKSk7Ci0JICAgIGlmICghcmVsb2NfY2hhaW4pCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICByZWxvY19jaGFpbi0+cmVsZW50LnN5bV9wdHJfcHRyID0KLQkgICAgICBiZmRfZ2V0X3NlY3Rpb24gKGFzeW0pLT5zeW1ib2xfcHRyX3B0cjsKLQkgICAgcmVsb2NfY2hhaW4tPnJlbGVudC5hZGRyZXNzID0gc2VjdGlvbi0+X3Jhd19zaXplOwotCSAgICByZWxvY19jaGFpbi0+cmVsZW50LmFkZGVuZCA9IGFzeW0tPnZhbHVlOwotCSAgICByZWxvY19jaGFpbi0+cmVsZW50Lmhvd3RvID0KLQkgICAgICBlY29mZl9iYWNrZW5kIChhYmZkKS0+Y29uc3RydWN0b3JfcmVsb2M7Ci0KLQkgICAgLyogU2V0IHVwIHRoZSBjb25zdHJ1Y3RvciBzZWN0aW9uIHRvIGhvbGQgdGhlIHJlbG9jLiAgKi8KLQkgICAgc2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQ09OU1RSVUNUT1I7Ci0JICAgICsrc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLQkgICAgLyogQ29uc3RydWN0b3Igc2VjdGlvbnMgbXVzdCBiZSByb3VuZGVkIHRvIGEgYm91bmRhcnkKLQkgICAgICAgYmFzZWQgb24gdGhlIGJpdHNpemUuICBUaGVzZSBhcmUgbm90IHJlYWwgc2VjdGlvbnMtLQotCSAgICAgICB0aGV5IGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSB0aGUgbGlua2VyLS1zbyB0aGUgRUNPRkYKLQkgICAgICAgMTYgYnl0ZSBhbGlnbm1lbnQgcmVzdHJpY3Rpb24gZG9lcyBub3QgYXBwbHkuICAqLwotCSAgICBiaXRzaXplID0gZWNvZmZfYmFja2VuZCAoYWJmZCktPmNvbnN0cnVjdG9yX2JpdHNpemU7Ci0JICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDE7Ci0JICAgIHdoaWxlICgoMSA8PCBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpIDwgYml0c2l6ZSAvIDgpCi0JICAgICAgKytzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXI7Ci0KLQkgICAgcmVsb2NfY2hhaW4tPm5leHQgPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLQkgICAgc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW4gPSByZWxvY19jaGFpbjsKLQkgICAgc2VjdGlvbi0+X3Jhd19zaXplICs9IGJpdHNpemUgLyA4OwotCi0jZW5kaWYgLyogMCAqLwotCi0JICAgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyBhIGNvbnN0cnVjdG9yLiAgKi8KLQkgICAgYXN5bS0+ZmxhZ3MgfD0gQlNGX0NPTlNUUlVDVE9SOwotCSAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYW4gRUNPRkYgc3ltYm9sIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9leHRfc2l6ZQotICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9leHRfc2l6ZTsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fc2l6ZQotICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9zeW1fc2l6ZTsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX2V4dF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgRVhUUiAqKSkKLSAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuc3dhcF9leHRfaW47Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9zeW1faW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFNZTVIgKikpCi0gICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLnN3YXBfc3ltX2luOwotICBiZmRfc2l6ZV90eXBlIGludGVybmFsX3NpemU7Ci0gIGVjb2ZmX3N5bWJvbF90eXBlICppbnRlcm5hbDsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKmludGVybmFsX3B0cjsKLSAgY2hhciAqZXJhd19zcmM7Ci0gIGNoYXIgKmVyYXdfZW5kOwotICBGRFIgKmZkcl9wdHI7Ci0gIEZEUiAqZmRyX2VuZDsKLQotICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IHJlYWQgaW4gdGhlIHN5bWJvbCB0YWJsZSwgZG8gbm90aGluZy4gICovCi0gIGlmIChlY29mZl9kYXRhIChhYmZkKS0+Y2Fub25pY2FsX3N5bWJvbHMgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBHZXQgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKCEgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvIChhYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwKLQkJCQkJJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGludGVybmFsX3NpemUgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIHNpemVvZiAoZWNvZmZfc3ltYm9sX3R5cGUpOwotICBpbnRlcm5hbCA9IChlY29mZl9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIGludGVybmFsX3NpemUpOwotICBpZiAoaW50ZXJuYWwgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW50ZXJuYWxfcHRyID0gaW50ZXJuYWw7Ci0gIGVyYXdfc3JjID0gKGNoYXIgKikgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZXh0ZXJuYWxfZXh0OwotICBlcmF3X2VuZCA9IChlcmF3X3NyYwotCSAgICAgICsgKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4Ci0JCSAqIGV4dGVybmFsX2V4dF9zaXplKSk7Ci0gIGZvciAoOyBlcmF3X3NyYyA8IGVyYXdfZW5kOyBlcmF3X3NyYyArPSBleHRlcm5hbF9leHRfc2l6ZSwgaW50ZXJuYWxfcHRyKyspCi0gICAgewotICAgICAgRVhUUiBpbnRlcm5hbF9lc3ltOwotCi0gICAgICAoKnN3YXBfZXh0X2luKSAoYWJmZCwgKFBUUikgZXJhd19zcmMsICZpbnRlcm5hbF9lc3ltKTsKLSAgICAgIGludGVybmFsX3B0ci0+c3ltYm9sLm5hbWUgPSAoZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3NleHQKLQkJCQkgICArIGludGVybmFsX2VzeW0uYXN5bS5pc3MpOwotICAgICAgaWYgKCFlY29mZl9zZXRfc3ltYm9sX2luZm8gKGFiZmQsICZpbnRlcm5hbF9lc3ltLmFzeW0sCi0JCQkJICAmaW50ZXJuYWxfcHRyLT5zeW1ib2wsIDEsCi0JCQkJICBpbnRlcm5hbF9lc3ltLndlYWtleHQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC8qIFRoZSBhbHBoYSB1c2VzIGEgbmVnYXRpdmUgaWZkIGZpZWxkIGZvciBzZWN0aW9uIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGludGVybmFsX2VzeW0uaWZkID49IDApCi0JaW50ZXJuYWxfcHRyLT5mZHIgPSAoZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZmRyCi0JCQkgICAgICsgaW50ZXJuYWxfZXN5bS5pZmQpOwotICAgICAgZWxzZQotCWludGVybmFsX3B0ci0+ZmRyID0gTlVMTDsKLSAgICAgIGludGVybmFsX3B0ci0+bG9jYWwgPSBmYWxzZTsKLSAgICAgIGludGVybmFsX3B0ci0+bmF0aXZlID0gKFBUUikgZXJhd19zcmM7Ci0gICAgfQotCi0gIC8qIFRoZSBsb2NhbCBzeW1ib2xzIG11c3QgYmUgYWNjZXNzZWQgdmlhIHRoZSBmZHIncywgYmVjYXVzZSB0aGUKLSAgICAgc3RyaW5nIGFuZCBhdXggaW5kaWNlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGZkciBpbmZvcm1hdGlvbi4gICovCi0gIGZkcl9wdHIgPSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5mZHI7Ci0gIGZkcl9lbmQgPSBmZHJfcHRyICsgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlmZE1heDsKLSAgZm9yICg7IGZkcl9wdHIgPCBmZHJfZW5kOyBmZHJfcHRyKyspCi0gICAgewotICAgICAgY2hhciAqbHJhd19zcmM7Ci0gICAgICBjaGFyICpscmF3X2VuZDsKLQotICAgICAgbHJhd19zcmMgPSAoKGNoYXIgKikgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZXh0ZXJuYWxfc3ltCi0JCSAgKyBmZHJfcHRyLT5pc3ltQmFzZSAqIGV4dGVybmFsX3N5bV9zaXplKTsKLSAgICAgIGxyYXdfZW5kID0gbHJhd19zcmMgKyBmZHJfcHRyLT5jc3ltICogZXh0ZXJuYWxfc3ltX3NpemU7Ci0gICAgICBmb3IgKDsKLQkgICBscmF3X3NyYyA8IGxyYXdfZW5kOwotCSAgIGxyYXdfc3JjICs9IGV4dGVybmFsX3N5bV9zaXplLCBpbnRlcm5hbF9wdHIrKykKLQl7Ci0JICBTWU1SIGludGVybmFsX3N5bTsKLQotCSAgKCpzd2FwX3N5bV9pbikgKGFiZmQsIChQVFIpIGxyYXdfc3JjLCAmaW50ZXJuYWxfc3ltKTsKLQkgIGludGVybmFsX3B0ci0+c3ltYm9sLm5hbWUgPSAoZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3MKLQkJCQkgICAgICAgKyBmZHJfcHRyLT5pc3NCYXNlCi0JCQkJICAgICAgICsgaW50ZXJuYWxfc3ltLmlzcyk7Ci0JICBpZiAoIWVjb2ZmX3NldF9zeW1ib2xfaW5mbyAoYWJmZCwgJmludGVybmFsX3N5bSwKLQkJCQkgICAgICAmaW50ZXJuYWxfcHRyLT5zeW1ib2wsIDAsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpbnRlcm5hbF9wdHItPmZkciA9IGZkcl9wdHI7Ci0JICBpbnRlcm5hbF9wdHItPmxvY2FsID0gdHJ1ZTsKLQkgIGludGVybmFsX3B0ci0+bmF0aXZlID0gKFBUUikgbHJhd19zcmM7Ci0JfQotICAgIH0KLQotICBlY29mZl9kYXRhIChhYmZkKS0+Y2Fub25pY2FsX3N5bWJvbHMgPSBpbnRlcm5hbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIGZvciB0aGUgY2Fub25pY2FsIHN5bWJvbHMuICAqLwotCi1sb25nCi1fYmZkX2Vjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCEgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvIChhYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwKLQkJCQkJJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSArIDEpICogKHNpemVvZiAoZWNvZmZfc3ltYm9sX3R5cGUgKikpOwotfQotCi0vKiBHZXQgdGhlIGNhbm9uaWNhbCBzeW1ib2xzLiAgKi8KLQotbG9uZwotX2JmZF9lY29mZl9nZXRfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICBlY29mZl9zeW1ib2xfdHlwZSAqc3ltYmFzZTsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKipsb2NhdGlvbiA9IChlY29mZl9zeW1ib2xfdHlwZSAqKikgYWxvY2F0aW9uOwotCi0gIGlmIChfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBzeW1iYXNlID0gZWNvZmZfZGF0YSAoYWJmZCktPmNhbm9uaWNhbF9zeW1ib2xzOwotICB3aGlsZSAoY291bnRlciA8IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKQotICAgIHsKLSAgICAgICoobG9jYXRpb24rKykgPSBzeW1iYXNlKys7Ci0gICAgICBjb3VudGVyKys7Ci0gICAgfQotICAqbG9jYXRpb24rKyA9IChlY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwotICByZXR1cm4gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci19Ci0KLS8qIFR1cm4gRUNPRkYgdHlwZSBpbmZvcm1hdGlvbiBpbnRvIGEgcHJpbnRhYmxlIHN0cmluZy4KLSAgIGVjb2ZmX2VtaXRfYWdncmVnYXRlIGFuZCBlY29mZl90eXBlX3RvX3N0cmluZyBhcmUgZnJvbQotICAgZ2NjL21pcHMtdGR1bXAuYywgd2l0aCBzd2FwcGluZyBhZGRlZCBhbmQgdXNlZF9wdHIgcmVtb3ZlZC4gICovCi0KLS8qIFdyaXRlIGFnZ3JlZ2F0ZSBpbmZvcm1hdGlvbiB0byBhIHN0cmluZy4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9lbWl0X2FnZ3JlZ2F0ZSAoYWJmZCwgZmRyLCBzdHJpbmcsIHJuZHgsIGlzeW0sIHdoaWNoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEZEUiAqZmRyOwotICAgICBjaGFyICpzdHJpbmc7Ci0gICAgIFJORFhSICpybmR4OwotICAgICBsb25nIGlzeW07Ci0gICAgIGNvbnN0IGNoYXIgKndoaWNoOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXAgPQotICAgICZlY29mZl9iYWNrZW5kIChhYmZkKS0+ZGVidWdfc3dhcDsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1Z19pbmZvID0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvOwotICB1bnNpZ25lZCBpbnQgaWZkID0gcm5keC0+cmZkOwotICB1bnNpZ25lZCBpbnQgaW5keCA9IHJuZHgtPmluZGV4OwotICBjb25zdCBjaGFyICpuYW1lOwotICAKLSAgaWYgKGlmZCA9PSAweGZmZikKLSAgICBpZmQgPSBpc3ltOwotCi0gIC8qIEFuIGlmZCBvZiAtMSBpcyBhbiBvcGFxdWUgdHlwZS4gIEFuIGVzY2FwZWQgaW5kZXggb2YgMCBpcyBhCi0gICAgIHN0cnVjdCByZXR1cm4gdHlwZSBvZiBhIHByb2NlZHVyZSBjb21waWxlZCB3aXRob3V0IC1nLiAgKi8KLSAgaWYgKGlmZCA9PSAweGZmZmZmZmZmCi0gICAgICB8fCAocm5keC0+cmZkID09IDB4ZmZmICYmIGluZHggPT0gMCkpCi0gICAgbmFtZSA9ICI8dW5kZWZpbmVkPiI7Ci0gIGVsc2UgaWYgKGluZHggPT0gaW5kZXhOaWwpCi0gICAgbmFtZSA9ICI8bm8gbmFtZT4iOwotICBlbHNlCi0gICAgewotICAgICAgU1lNUiBzeW07Ci0KLSAgICAgIGlmIChkZWJ1Z19pbmZvLT5leHRlcm5hbF9yZmQgPT0gTlVMTCkKLQlmZHIgPSBkZWJ1Z19pbmZvLT5mZHIgKyBpZmQ7Ci0gICAgICBlbHNlCi0JewotCSAgUkZEVCByZmQ7Ci0KLQkgICgqZGVidWdfc3dhcC0+c3dhcF9yZmRfaW4pIChhYmZkLAotCQkJCSAgICAgICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9yZmQKLQkJCQkgICAgICAgKyAoKGZkci0+cmZkQmFzZSArIGlmZCkKLQkJCQkJICAqIGRlYnVnX3N3YXAtPmV4dGVybmFsX3JmZF9zaXplKSksCi0JCQkJICAgICAgJnJmZCk7Ci0JICBmZHIgPSBkZWJ1Z19pbmZvLT5mZHIgKyByZmQ7Ci0JfQotCi0gICAgICBpbmR4ICs9IGZkci0+aXN5bUJhc2U7Ci0KLSAgICAgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLAotCQkJCSAgKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQotCQkJCSAgICsgaW5keCAqIGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKSwKLQkJCQkgICZzeW0pOwotCi0gICAgICBuYW1lID0gZGVidWdfaW5mby0+c3MgKyBmZHItPmlzc0Jhc2UgKyBzeW0uaXNzOwotICAgIH0KLQotICBzcHJpbnRmIChzdHJpbmcsCi0JICAgIiVzICVzIHsgaWZkID0gJXUsIGluZGV4ID0gJWx1IH0iLAotCSAgIHdoaWNoLCBuYW1lLCBpZmQsCi0JICAgKChsb25nKSBpbmR4Ci0JICAgICsgZGVidWdfaW5mby0+c3ltYm9saWNfaGVhZGVyLmlleHRNYXgpKTsKLX0KLQotLyogQ29udmVydCB0aGUgdHlwZSBpbmZvcm1hdGlvbiB0byBzdHJpbmcgZm9ybWF0LiAgKi8KLQotc3RhdGljIGNoYXIgKgotZWNvZmZfdHlwZV90b19zdHJpbmcgKGFiZmQsIGZkciwgaW5keCkKLSAgICAgYmZkICphYmZkOwotICAgICBGRFIgKmZkcjsKLSAgICAgdW5zaWduZWQgaW50IGluZHg7Ci17Ci0gIHVuaW9uIGF1eF9leHQgKmF1eF9wdHI7Ci0gIGludCBiaWdlbmRpYW47Ci0gIEFVWFUgdTsKLSAgc3RydWN0IHF1YWwgewotICAgIHVuc2lnbmVkIGludCAgdHlwZTsKLSAgICBpbnQgIGxvd19ib3VuZDsKLSAgICBpbnQgIGhpZ2hfYm91bmQ7Ci0gICAgaW50ICBzdHJpZGU7Ci0gIH0gcXVhbGlmaWVyc1s3XTsKLSAgdW5zaWduZWQgaW50IGJhc2ljX3R5cGU7Ci0gIGludCBpOwotICBjaGFyIGJ1ZmZlcjFbMTAyNF07Ci0gIHN0YXRpYyBjaGFyIGJ1ZmZlcjJbMTAyNF07Ci0gIGNoYXIgKnAxID0gYnVmZmVyMTsKLSAgY2hhciAqcDIgPSBidWZmZXIyOwotICBSTkRYUiBybmR4OwotCi0gIGF1eF9wdHIgPSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5leHRlcm5hbF9hdXggKyBmZHItPmlhdXhCYXNlOwotICBiaWdlbmRpYW4gPSBmZHItPmZCaWdlbmRpYW47Ci0KLSAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKLSAgICB7Ci0gICAgICBxdWFsaWZpZXJzW2ldLmxvd19ib3VuZCA9IDA7Ci0gICAgICBxdWFsaWZpZXJzW2ldLmhpZ2hfYm91bmQgPSAwOwotICAgICAgcXVhbGlmaWVyc1tpXS5zdHJpZGUgPSAwOwotICAgIH0KLQotICBpZiAoQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHhdKSA9PSAoYmZkX3ZtYSkgLTEpCi0gICAgcmV0dXJuICItMSAobm8gdHlwZSkiOwotICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrK10uYV90aSwgJnUudGkpOwotCi0gIGJhc2ljX3R5cGUgPSB1LnRpLmJ0OwotICBxdWFsaWZpZXJzWzBdLnR5cGUgPSB1LnRpLnRxMDsKLSAgcXVhbGlmaWVyc1sxXS50eXBlID0gdS50aS50cTE7Ci0gIHF1YWxpZmllcnNbMl0udHlwZSA9IHUudGkudHEyOwotICBxdWFsaWZpZXJzWzNdLnR5cGUgPSB1LnRpLnRxMzsKLSAgcXVhbGlmaWVyc1s0XS50eXBlID0gdS50aS50cTQ7Ci0gIHF1YWxpZmllcnNbNV0udHlwZSA9IHUudGkudHE1OwotICBxdWFsaWZpZXJzWzZdLnR5cGUgPSB0cU5pbDsKLQotICAvKgotICAgKiBHbyBnZXQgdGhlIGJhc2ljIHR5cGUuCi0gICAqLwotICBzd2l0Y2ggKGJhc2ljX3R5cGUpCi0gICAgewotICAgIGNhc2UgYnROaWw6CQkJLyogdW5kZWZpbmVkICovCi0gICAgICBzdHJjcHkgKHAxLCAibmlsIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRBZHI6CQkJLyogYWRkcmVzcyAtIGludGVnZXIgc2FtZSBzaXplIGFzIHBvaW50ZXIgKi8KLSAgICAgIHN0cmNweSAocDEsICJhZGRyZXNzIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRDaGFyOgkJLyogY2hhcmFjdGVyICovCi0gICAgICBzdHJjcHkgKHAxLCAiY2hhciIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0VUNoYXI6CQkvKiB1bnNpZ25lZCBjaGFyYWN0ZXIgKi8KLSAgICAgIHN0cmNweSAocDEsICJ1bnNpZ25lZCBjaGFyIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRTaG9ydDoJCS8qIHNob3J0ICovCi0gICAgICBzdHJjcHkgKHAxLCAic2hvcnQiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFVTaG9ydDoJCS8qIHVuc2lnbmVkIHNob3J0ICovCi0gICAgICBzdHJjcHkgKHAxLCAidW5zaWduZWQgc2hvcnQiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidEludDoJCQkvKiBpbnQgKi8KLSAgICAgIHN0cmNweSAocDEsICJpbnQiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFVJbnQ6CQkvKiB1bnNpZ25lZCBpbnQgKi8KLSAgICAgIHN0cmNweSAocDEsICJ1bnNpZ25lZCBpbnQiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidExvbmc6CQkvKiBsb25nICovCi0gICAgICBzdHJjcHkgKHAxLCAibG9uZyIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0VUxvbmc6CQkvKiB1bnNpZ25lZCBsb25nICovCi0gICAgICBzdHJjcHkgKHAxLCAidW5zaWduZWQgbG9uZyIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0RmxvYXQ6CQkvKiBmbG9hdCAocmVhbCkgKi8KLSAgICAgIHN0cmNweSAocDEsICJmbG9hdCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0RG91YmxlOgkJLyogRG91YmxlIChyZWFsKSAqLwotICAgICAgc3RyY3B5IChwMSwgImRvdWJsZSIpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFN0cnVjdHVyZXMgYWRkIDEtMiBhdXggd29yZHM6Ci0JIDFzdCB3b3JkIGlzIFtTVF9SRkRFU0NBUEUsIG9mZnNldF0gcG9pbnRlciB0byBzdHJ1Y3QgZGVmOwotCSAybmQgd29yZCBpcyBmaWxlIGluZGV4IGlmIDFzdCB3b3JkIHJmZCBpcyBTVF9SRkRFU0NBUEUuICAqLwotCi0gICAgY2FzZSBidFN0cnVjdDoJCS8qIFN0cnVjdHVyZSAoUmVjb3JkKSAqLwotICAgICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keF0uYV9ybmR4LCAmcm5keCk7Ci0gICAgICBlY29mZl9lbWl0X2FnZ3JlZ2F0ZSAoYWJmZCwgZmRyLCBwMSwgJnJuZHgsCi0JCQkgICAgKGxvbmcpIEFVWF9HRVRfSVNZTSAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KzFdKSwKLQkJCSAgICAic3RydWN0Iik7Ci0gICAgICBpbmR4Kys7CQkJLyogc2tpcCBhdXggd29yZHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBVbmlvbnMgYWRkIDEtMiBhdXggd29yZHM6Ci0JIDFzdCB3b3JkIGlzIFtTVF9SRkRFU0NBUEUsIG9mZnNldF0gcG9pbnRlciB0byB1bmlvbiBkZWY7Ci0JIDJuZCB3b3JkIGlzIGZpbGUgaW5kZXggaWYgMXN0IHdvcmQgcmZkIGlzIFNUX1JGREVTQ0FQRS4gICovCi0KLSAgICBjYXNlIGJ0VW5pb246CQkvKiBVbmlvbiAqLwotICAgICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keF0uYV9ybmR4LCAmcm5keCk7Ci0gICAgICBlY29mZl9lbWl0X2FnZ3JlZ2F0ZSAoYWJmZCwgZmRyLCBwMSwgJnJuZHgsCi0JCQkgICAgKGxvbmcpIEFVWF9HRVRfSVNZTSAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KzFdKSwKLQkJCSAgICAidW5pb24iKTsKLSAgICAgIGluZHgrKzsJCQkvKiBza2lwIGF1eCB3b3JkcyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIEVudW1lcmF0aW9ucyBhZGQgMS0yIGF1eCB3b3JkczoKLQkgMXN0IHdvcmQgaXMgW1NUX1JGREVTQ0FQRSwgb2Zmc2V0XSBwb2ludGVyIHRvIGVudW0gZGVmOwotCSAybmQgd29yZCBpcyBmaWxlIGluZGV4IGlmIDFzdCB3b3JkIHJmZCBpcyBTVF9SRkRFU0NBUEUuICAqLwotCi0gICAgY2FzZSBidEVudW06CQkvKiBFbnVtZXJhdGlvbiAqLwotICAgICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keF0uYV9ybmR4LCAmcm5keCk7Ci0gICAgICBlY29mZl9lbWl0X2FnZ3JlZ2F0ZSAoYWJmZCwgZmRyLCBwMSwgJnJuZHgsCi0JCQkgICAgKGxvbmcpIEFVWF9HRVRfSVNZTSAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KzFdKSwKLQkJCSAgICAiZW51bSIpOwotICAgICAgaW5keCsrOwkJCS8qIHNraXAgYXV4IHdvcmRzICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRUeXBlZGVmOgkJLyogZGVmaW5lZCB2aWEgYSB0eXBlZGVmLCBpc3ltUmVmIHBvaW50cyAqLwotICAgICAgc3RyY3B5IChwMSwgInR5cGVkZWYiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFJhbmdlOgkJLyogc3VicmFuZ2Ugb2YgaW50ICovCi0gICAgICBzdHJjcHkgKHAxLCAic3VicmFuZ2UiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFNldDoJCQkvKiBwYXNjYWwgc2V0cyAqLwotICAgICAgc3RyY3B5IChwMSwgInNldCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0Q29tcGxleDoJCS8qIGZvcnRyYW4gY29tcGxleCAqLwotICAgICAgc3RyY3B5IChwMSwgImNvbXBsZXgiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidERDb21wbGV4OgkJLyogZm9ydHJhbiBkb3VibGUgY29tcGxleCAqLwotICAgICAgc3RyY3B5IChwMSwgImRvdWJsZSBjb21wbGV4Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRJbmRpcmVjdDoJCS8qIGZvcndhcmQgb3IgdW5uYW1lZCB0eXBlZGVmICovCi0gICAgICBzdHJjcHkgKHAxLCAiZm9yd2FyZC91bmFtZWQgdHlwZWRlZiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0Rml4ZWREZWM6CQkvKiBGaXhlZCBEZWNpbWFsICovCi0gICAgICBzdHJjcHkgKHAxLCAiZml4ZWQgZGVjaW1hbCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0RmxvYXREZWM6CQkvKiBGbG9hdCBEZWNpbWFsICovCi0gICAgICBzdHJjcHkgKHAxLCAiZmxvYXQgZGVjaW1hbCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0U3RyaW5nOgkJLyogVmFyeWluZyBMZW5ndGggQ2hhcmFjdGVyIFN0cmluZyAqLwotICAgICAgc3RyY3B5IChwMSwgInN0cmluZyIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0Qml0OgkJCS8qIEFsaWduZWQgQml0IFN0cmluZyAqLwotICAgICAgc3RyY3B5IChwMSwgImJpdCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0UGljdHVyZToJCS8qIFBpY3R1cmUgKi8KLSAgICAgIHN0cmNweSAocDEsICJwaWN0dXJlIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRWb2lkOgkJLyogVm9pZCAqLwotICAgICAgc3RyY3B5IChwMSwgInZvaWQiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHNwcmludGYgKHAxLCBfKCJVbmtub3duIGJhc2ljIHR5cGUgJWQiKSwgKGludCkgYmFzaWNfdHlwZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcDEgKz0gc3RybGVuIChidWZmZXIxKTsKLQotICAvKgotICAgKiBJZiB0aGlzIGlzIGEgYml0ZmllbGQsIGdldCB0aGUgYml0c2l6ZS4KLSAgICovCi0gIGlmICh1LnRpLmZCaXRmaWVsZCkKLSAgICB7Ci0gICAgICBpbnQgYml0c2l6ZTsKLQotICAgICAgYml0c2l6ZSA9IEFVWF9HRVRfV0lEVEggKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCsrXSk7Ci0gICAgICBzcHJpbnRmIChwMSwgIiA6ICVkIiwgYml0c2l6ZSk7Ci0gICAgICBwMSArPSBzdHJsZW4gKGJ1ZmZlcjEpOwotICAgIH0KLQotCi0gIC8qCi0gICAqIERlYWwgd2l0aCBhbnkgcXVhbGlmaWVycy4KLSAgICovCi0gIGlmIChxdWFsaWZpZXJzWzBdLnR5cGUgIT0gdHFOaWwpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIFNuYXJmIHVwIGFueSBhcnJheSBib3VuZHMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuICBBcnJheXMKLSAgICAgICAqIHN0b3JlIDUgc3VjY2Vzc2l2ZSB3b3JkcyBpbiB0aGUgYXV4LiB0YWJsZToKLSAgICAgICAqCXdvcmQgMAlSTkRYUiB0byB0eXBlIG9mIHRoZSBib3VuZHMgKGllLCBpbnQpCi0gICAgICAgKgl3b3JkIDEJQ3VycmVudCBmaWxlIGRlc2NyaXB0b3IgaW5kZXgKLSAgICAgICAqCXdvcmQgMglsb3cgYm91bmQKLSAgICAgICAqCXdvcmQgMwloaWdoIGJvdW5kIChvciAtMSBpZiBbXSkKLSAgICAgICAqCXdvcmQgNAlzdHJpZGUgc2l6ZSBpbiBiaXRzCi0gICAgICAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCi0JewotCSAgaWYgKHF1YWxpZmllcnNbaV0udHlwZSA9PSB0cUFycmF5KQotCSAgICB7Ci0JICAgICAgcXVhbGlmaWVyc1tpXS5sb3dfYm91bmQgPQotCQlBVVhfR0VUX0ROTE9XIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrMl0pOwotCSAgICAgIHF1YWxpZmllcnNbaV0uaGlnaF9ib3VuZCA9Ci0JCUFVWF9HRVRfRE5ISUdIIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrM10pOwotCSAgICAgIHF1YWxpZmllcnNbaV0uc3RyaWRlID0KLQkJQVVYX0dFVF9XSURUSCAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KzRdKTsKLQkgICAgICBpbmR4ICs9IDU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBOb3cgcHJpbnQgb3V0IHRoZSBxdWFsaWZpZXJzLgotICAgICAgICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCXsKLQkgIHN3aXRjaCAocXVhbGlmaWVyc1tpXS50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgdHFOaWw6Ci0JICAgIGNhc2UgdHFNYXg6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSB0cVB0cjoKLQkgICAgICBzdHJjcHkgKHAyLCAicHRyIHRvICIpOwotCSAgICAgIHAyICs9IHNpemVvZiAoInB0ciB0byAiKS0xOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgdHFWb2w6Ci0JICAgICAgc3RyY3B5IChwMiwgInZvbGF0aWxlICIpOwotCSAgICAgIHAyICs9IHNpemVvZiAoInZvbGF0aWxlICIpLTE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSB0cUZhcjoKLQkgICAgICBzdHJjcHkgKHAyLCAiZmFyICIpOwotCSAgICAgIHAyICs9IHNpemVvZiAoImZhciAiKS0xOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgdHFQcm9jOgotCSAgICAgIHN0cmNweSAocDIsICJmdW5jLiByZXQuICIpOwotCSAgICAgIHAyICs9IHNpemVvZiAoImZ1bmMuIHJldC4gIik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSB0cUFycmF5OgotCSAgICAgIHsKLQkJaW50IGZpcnN0X2FycmF5ID0gaTsKLQkJaW50IGo7Ci0KLQkJLyogUHJpbnQgYXJyYXkgYm91bmRzIHJldmVyc2VkIChpZSwgaW4gdGhlIG9yZGVyIHRoZSBDCi0JCSAgIHByb2dyYW1tZXIgd3JpdGVzIHRoZW0pLiAgQyBpcyBzdWNoIGEgZnVuIGxhbmd1YWdlLi4uLiAqLwotCi0JCXdoaWxlIChpIDwgNSAmJiBxdWFsaWZpZXJzW2krMV0udHlwZSA9PSB0cUFycmF5KQotCQkgIGkrKzsKLQotCQlmb3IgKGogPSBpOyBqID49IGZpcnN0X2FycmF5OyBqLS0pCi0JCSAgewotCQkgICAgc3RyY3B5IChwMiwgImFycmF5IFsiKTsKLQkJICAgIHAyICs9IHNpemVvZiAoImFycmF5IFsiKS0xOwotCQkgICAgaWYgKHF1YWxpZmllcnNbal0ubG93X2JvdW5kICE9IDApCi0JCSAgICAgIHNwcmludGYgKHAyLAotCQkJICAgICAgICIlbGQ6JWxkIHslbGQgYml0c30iLAotCQkJICAgICAgIChsb25nKSBxdWFsaWZpZXJzW2pdLmxvd19ib3VuZCwKLQkJCSAgICAgICAobG9uZykgcXVhbGlmaWVyc1tqXS5oaWdoX2JvdW5kLAotCQkJICAgICAgIChsb25nKSBxdWFsaWZpZXJzW2pdLnN0cmlkZSk7Ci0KLQkJICAgIGVsc2UgaWYgKHF1YWxpZmllcnNbal0uaGlnaF9ib3VuZCAhPSAtMSkKLQkJICAgICAgc3ByaW50ZiAocDIsCi0JCQkgICAgICAgIiVsZCB7JWxkIGJpdHN9IiwKLQkJCSAgICAgICAobG9uZykgKHF1YWxpZmllcnNbal0uaGlnaF9ib3VuZCArIDEpLAotCQkJICAgICAgIChsb25nKSAocXVhbGlmaWVyc1tqXS5zdHJpZGUpKTsKLQotCQkgICAgZWxzZQotCQkgICAgICBzcHJpbnRmIChwMiwgIiB7JWxkIGJpdHN9IiwgKGxvbmcpIChxdWFsaWZpZXJzW2pdLnN0cmlkZSkpOwotCi0JCSAgICBwMiArPSBzdHJsZW4gKHAyKTsKLQkJICAgIHN0cmNweSAocDIsICJdIG9mICIpOwotCQkgICAgcDIgKz0gc2l6ZW9mICgiXSBvZiAiKS0xOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHN0cmNweSAocDIsIGJ1ZmZlcjEpOwotICByZXR1cm4gYnVmZmVyMjsKLX0KLQotLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IEVDT0ZGIHN5bWJvbCBTWU1CT0wgaW4gUkVULiAgKi8KLQotLypBUkdTVVNFRCovCi12b2lkCi1fYmZkX2Vjb2ZmX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqYWJmZDsJCQkvKiBJZ25vcmVkLiAgKi8KLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIGxvY2FsIGxhYmVsLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBuYW1lWzBdID09ICckJzsKLX0KLQotLyogUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gRUNPRkYgc3ltYm9sLiAgKi8KLQotdm9pZAotX2JmZF9lY29mZl9wcmludF9zeW1ib2wgKGFiZmQsIGZpbGVwLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZXA7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwCi0gICAgPSAmZWNvZmZfYmFja2VuZCAoYWJmZCktPmRlYnVnX3N3YXA7Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKWZpbGVwOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSAgICAgIGlmIChlY29mZnN5bWJvbCAoc3ltYm9sKS0+bG9jYWwpCi0JewotCSAgU1lNUiBlY29mZl9zeW07Ci0JCi0JICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgZWNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSwKLQkJCQkgICAgICAmZWNvZmZfc3ltKTsKLQkgIGZwcmludGYgKGZpbGUsICJlY29mZiBsb2NhbCAiKTsKLQkgIGZwcmludGZfdm1hIChmaWxlLCAoYmZkX3ZtYSkgZWNvZmZfc3ltLnZhbHVlKTsKLQkgIGZwcmludGYgKGZpbGUsICIgJXggJXgiLCAodW5zaWduZWQpIGVjb2ZmX3N5bS5zdCwKLQkJICAgKHVuc2lnbmVkKSBlY29mZl9zeW0uc2MpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBFWFRSIGVjb2ZmX2V4dDsKLQotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9pbikgKGFiZmQsIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUsCi0JCQkJICAgICAgJmVjb2ZmX2V4dCk7Ci0JICBmcHJpbnRmIChmaWxlLCAiZWNvZmYgZXh0ZXJuICIpOwotCSAgZnByaW50Zl92bWEgKGZpbGUsIChiZmRfdm1hKSBlY29mZl9leHQuYXN5bS52YWx1ZSk7Ci0JICBmcHJpbnRmIChmaWxlLCAiICV4ICV4IiwgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zdCwKLQkJICAgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zYyk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIC8qIFByaW50IG91dCB0aGUgc3ltYm9scyBpbiBhIHJlYXNvbmFibGUgd2F5ICovCi0gICAgICB7Ci0JY2hhciB0eXBlOwotCWludCBwb3M7Ci0JRVhUUiBlY29mZl9leHQ7Ci0JY2hhciBqbXB0Ymw7Ci0JY2hhciBjb2JvbF9tYWluOwotCWNoYXIgd2Vha2V4dDsKLQotCWlmIChlY29mZnN5bWJvbCAoc3ltYm9sKS0+bG9jYWwpCi0JICB7Ci0JICAgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCBlY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlLAotCQkJCQkmZWNvZmZfZXh0LmFzeW0pOwotCSAgICB0eXBlID0gJ2wnOwotCSAgICBwb3MgPSAoKCgoY2hhciAqKSBlY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlCi0JCSAgICAgLSAoY2hhciAqKSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5leHRlcm5hbF9zeW0pCi0JCSAgICAvIGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKQotCQkgICArIGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4KTsKLQkgICAgam1wdGJsID0gJyAnOwotCSAgICBjb2JvbF9tYWluID0gJyAnOwotCSAgICB3ZWFrZXh0ID0gJyAnOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9pbikgKGFiZmQsIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUsCi0JCQkJCSZlY29mZl9leHQpOwotCSAgICB0eXBlID0gJ2UnOwotCSAgICBwb3MgPSAoKChjaGFyICopIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUKLQkJICAgIC0gKGNoYXIgKikgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZXh0ZXJuYWxfZXh0KQotCQkgICAvIGRlYnVnX3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKTsKLQkgICAgam1wdGJsID0gZWNvZmZfZXh0LmptcHRibCA/ICdqJyA6ICcgJzsKLQkgICAgY29ib2xfbWFpbiA9IGVjb2ZmX2V4dC5jb2JvbF9tYWluID8gJ2MnIDogJyAnOwotCSAgICB3ZWFrZXh0ID0gZWNvZmZfZXh0LndlYWtleHQgPyAndycgOiAnICc7Ci0JICB9Ci0KLQlmcHJpbnRmIChmaWxlLCAiWyUzZF0gJWMgIiwKLQkJIHBvcywgdHlwZSk7Ci0JZnByaW50Zl92bWEgKGZpbGUsIChiZmRfdm1hKSBlY29mZl9leHQuYXN5bS52YWx1ZSk7Ci0JZnByaW50ZiAoZmlsZSwgIiBzdCAleCBzYyAleCBpbmR4ICV4ICVjJWMlYyAlcyIsCi0JCSAodW5zaWduZWQpIGVjb2ZmX2V4dC5hc3ltLnN0LAotCQkgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zYywKLQkJICh1bnNpZ25lZCkgZWNvZmZfZXh0LmFzeW0uaW5kZXgsCi0JCSBqbXB0YmwsIGNvYm9sX21haW4sIHdlYWtleHQsCi0JCSBzeW1ib2wtPm5hbWUpOwotCi0JaWYgKGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5mZHIgIT0gTlVMTAotCSAgICAmJiBlY29mZl9leHQuYXN5bS5pbmRleCAhPSBpbmRleE5pbCkKLQkgIHsKLQkgICAgRkRSICpmZHI7Ci0JICAgIHVuc2lnbmVkIGludCBpbmR4OwotCSAgICBpbnQgYmlnZW5kaWFuOwotCSAgICBiZmRfc2l6ZV90eXBlIHN5bV9iYXNlOwotCSAgICB1bmlvbiBhdXhfZXh0ICphdXhfYmFzZTsKLQotCSAgICBmZHIgPSBlY29mZnN5bWJvbCAoc3ltYm9sKS0+ZmRyOwotCSAgICBpbmR4ID0gZWNvZmZfZXh0LmFzeW0uaW5kZXg7Ci0KLQkgICAgLyogc3ltX2Jhc2UgaXMgdXNlZCB0byBtYXAgdGhlIGZkciByZWxhdGl2ZSBpbmRpY2VzIHdoaWNoCi0JICAgICAgIGFwcGVhciBpbiB0aGUgZmlsZSB0byB0aGUgcG9zaXRpb24gbnVtYmVyIHdoaWNoIHdlIGFyZQotCSAgICAgICB1c2luZy4gICovCi0JICAgIHN5bV9iYXNlID0gZmRyLT5pc3ltQmFzZTsKLQkgICAgaWYgKGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5sb2NhbCkKLQkgICAgICBzeW1fYmFzZSArPQotCQllY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heDsKLQotCSAgICAvKiBhdXhfYmFzZSBpcyB0aGUgc3RhcnQgb2YgdGhlIGF1eCBlbnRyaWVzIGZvciB0aGlzIGZpbGU7Ci0JICAgICAgIGFzeW0uaW5kZXggaXMgYW4gb2Zmc2V0IGZyb20gdGhpcy4gICovCi0JICAgIGF1eF9iYXNlID0gKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmV4dGVybmFsX2F1eAotCQkJKyBmZHItPmlhdXhCYXNlKTsKLQotCSAgICAvKiBUaGUgYXV4IGVudHJpZXMgYXJlIHN0b3JlZCBpbiBob3N0IGJ5dGUgb3JkZXI7IHRoZQotCSAgICAgICBvcmRlciBpcyBpbmRpY2F0ZWQgYnkgYSBiaXQgaW4gdGhlIGZkci4gICovCi0JICAgIGJpZ2VuZGlhbiA9IGZkci0+ZkJpZ2VuZGlhbjsKLQotCSAgICAvKiBUaGlzIHN3aXRjaCBpcyBiYXNpY2FsbHkgZnJvbSBnY2MvbWlwcy10ZHVtcC5jICAqLwotCSAgICBzd2l0Y2ggKGVjb2ZmX2V4dC5hc3ltLnN0KQotCSAgICAgIHsKLQkgICAgICBjYXNlIHN0TmlsOgotCSAgICAgIGNhc2Ugc3RMYWJlbDoKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0RmlsZToKLQkgICAgICBjYXNlIHN0QmxvY2s6Ci0JCWZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgRW5kKzEgc3ltYm9sOiAlbGQiKSwKLQkJCSAobG9uZykgKGluZHggKyBzeW1fYmFzZSkpOwotCQlicmVhazsKLQotCSAgICAgIGNhc2Ugc3RFbmQ6Ci0JCWlmIChlY29mZl9leHQuYXN5bS5zYyA9PSBzY1RleHQKLQkJICAgIHx8IGVjb2ZmX2V4dC5hc3ltLnNjID09IHNjSW5mbykKLQkJICBmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIEZpcnN0IHN5bWJvbDogJWxkIiksCi0JCQkgICAobG9uZykgKGluZHggKyBzeW1fYmFzZSkpOwotCQllbHNlCi0JCSAgZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBGaXJzdCBzeW1ib2w6ICVsZCIpLCAKLQkJCSAgICgobG9uZykKLQkJCSAgICAoQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sCi0JCQkJCSAgICZhdXhfYmFzZVtlY29mZl9leHQuYXN5bS5pbmRleF0pCi0JCQkgICAgICsgc3ltX2Jhc2UpKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBzdFByb2M6Ci0JICAgICAgY2FzZSBzdFN0YXRpY1Byb2M6Ci0JCWlmIChFQ09GRl9JU19TVEFCICgmZWNvZmZfZXh0LmFzeW0pKQotCQkgIDsKLQkJZWxzZSBpZiAoZWNvZmZzeW1ib2wgKHN5bWJvbCktPmxvY2FsKQotCQkgIGZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgRW5kKzEgc3ltYm9sOiAlLTdsZCAgIFR5cGU6ICAlcyIpLAotCQkJICAgKChsb25nKQotCQkJICAgIChBVVhfR0VUX0lTWU0gKGJpZ2VuZGlhbiwKLQkJCQkJICAgJmF1eF9iYXNlW2Vjb2ZmX2V4dC5hc3ltLmluZGV4XSkKLQkJCSAgICAgKyBzeW1fYmFzZSkpLAotCQkJICAgZWNvZmZfdHlwZV90b19zdHJpbmcgKGFiZmQsIGZkciwgaW5keCArIDEpKTsKLQkJZWxzZQotCQkgIGZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgTG9jYWwgc3ltYm9sOiAlbGQiKSwKLQkJCSAgICgobG9uZykgaW5keAotCQkJICAgICsgKGxvbmcpIHN5bV9iYXNlCi0JCQkgICAgKyAoZWNvZmZfZGF0YSAoYWJmZCkKLQkJCSAgICAgICAtPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXgpKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBzdFN0cnVjdDoKLQkJZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBzdHJ1Y3Q7IEVuZCsxIHN5bWJvbDogJWxkIiksCi0JCQkgKGxvbmcpIChpbmR4ICsgc3ltX2Jhc2UpKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0VW5pb246Ci0JCWZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgdW5pb247IEVuZCsxIHN5bWJvbDogJWxkIiksCi0JCQkgKGxvbmcpIChpbmR4ICsgc3ltX2Jhc2UpKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0RW51bToKLQkJZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBlbnVtOyBFbmQrMSBzeW1ib2w6ICVsZCIpLAotCQkJIChsb25nKSAoaW5keCArIHN5bV9iYXNlKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgZGVmYXVsdDoKLQkJaWYgKCEgRUNPRkZfSVNfU1RBQiAoJmVjb2ZmX2V4dC5hc3ltKSkKLQkJICBmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIFR5cGU6ICVzIiksCi0JCQkgICBlY29mZl90eXBlX3RvX3N0cmluZyAoYWJmZCwgZmRyLCBpbmR4KSk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQwKLS8qIFJlYWQgaW4gdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgYXJlbGVudCAqaW50ZXJuYWxfcmVsb2NzOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2NzX3NpemU7Ci0gIGNoYXIgKmV4dGVybmFsX3JlbG9jczsKLSAgYXJlbGVudCAqcnB0cjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKHNlY3Rpb24tPnJlbG9jYXRpb24gIT0gKGFyZWxlbnQgKikgTlVMTAotICAgICAgfHwgc2VjdGlvbi0+cmVsb2NfY291bnQgPT0gMAotICAgICAgfHwgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgaW50ZXJuYWxfcmVsb2NzID0gKGFyZWxlbnQgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAoc2l6ZW9mIChhcmVsZW50KQotCQkJCQkgICAgKiBzZWN0aW9uLT5yZWxvY19jb3VudCkpOwotICBleHRlcm5hbF9yZWxvY19zaXplID0gYmFja2VuZC0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgZXh0ZXJuYWxfcmVsb2NzX3NpemUgPSBleHRlcm5hbF9yZWxvY19zaXplICogc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGV4dGVybmFsX3JlbG9jcyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgZXh0ZXJuYWxfcmVsb2NzX3NpemUpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IChhcmVsZW50ICopIE5VTEwKLSAgICAgIHx8IGV4dGVybmFsX3JlbG9jcyA9PSAoY2hhciAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgMSwgZXh0ZXJuYWxfcmVsb2NzX3NpemUsIGFiZmQpCi0gICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpID0gMCwgcnB0ciA9IGludGVybmFsX3JlbG9jczsgaSA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBpKyssIHJwdHIrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgaW50ZXJuOwotCi0gICAgICAoKmJhY2tlbmQtPnN3YXBfcmVsb2NfaW4pIChhYmZkLAotCQkJCSBleHRlcm5hbF9yZWxvY3MgKyBpICogZXh0ZXJuYWxfcmVsb2Nfc2l6ZSwKLQkJCQkgJmludGVybik7Ci0KLSAgICAgIGlmIChpbnRlcm4ucl9leHRlcm4pCi0JewotCSAgLyogcl9zeW1uZHggaXMgYW4gaW5kZXggaW50byB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0JICBCRkRfQVNTRVJUIChpbnRlcm4ucl9zeW1uZHggPj0gMAotCQkgICAgICAmJiAoaW50ZXJuLnJfc3ltbmR4Ci0JCQkgIDwgKGVjb2ZmX2RhdGEgKGFiZmQpCi0JCQkgICAgIC0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heCkpKTsKLQkgIHJwdHItPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIGludGVybi5yX3N5bW5keDsKLQkgIHJwdHItPmFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoaW50ZXJuLnJfc3ltbmR4ID09IFJFTE9DX1NFQ1RJT05fTk9ORQotCSAgICAgICB8fCBpbnRlcm4ucl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9BQlMpCi0JewotCSAgcnB0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkgIHJwdHItPmFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIENPTlNUIGNoYXIgKnNlY19uYW1lOwotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgLyogcl9zeW1uZHggaXMgYSBzZWN0aW9uIGtleS4gICovCi0JICBzd2l0Y2ggKGludGVybi5yX3N5bW5keCkKLQkgICAgewotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fVEVYVDogIHNlY19uYW1lID0gIi50ZXh0IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fUkRBVEE6IHNlY19uYW1lID0gIi5yZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fREFUQTogIHNlY19uYW1lID0gIi5kYXRhIjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0RBVEE6IHNlY19uYW1lID0gIi5zZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0JTUzogIHNlY19uYW1lID0gIi5zYnNzIjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fQlNTOiAgIHNlY19uYW1lID0gIi5ic3MiOyAgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fSU5JVDogIHNlY19uYW1lID0gIi5pbml0IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUODogIHNlY19uYW1lID0gIi5saXQ4IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUNDogIHNlY19uYW1lID0gIi5saXQ0IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fWERBVEE6IHNlY19uYW1lID0gIi54ZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fUERBVEE6IHNlY19uYW1lID0gIi5wZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fRklOSTogIHNlY19uYW1lID0gIi5maW5pIjsgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9MSVRBOiAgc2VjX25hbWUgPSAiLmxpdGEiOyAgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9SQ09OU1Q6IHNlY19uYW1lID0gIi5yY29uc3QiOyBicmVhazsKLQkgICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0JICAgIH0KLQotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHNlY19uYW1lKTsKLQkgIGlmIChzZWMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgIGFib3J0ICgpOwotCSAgcnB0ci0+c3ltX3B0cl9wdHIgPSBzZWMtPnN5bWJvbF9wdHJfcHRyOwotCi0JICBycHRyLT5hZGRlbmQgPSAtIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYyk7Ci0JfQotCi0gICAgICBycHRyLT5hZGRyZXNzID0gaW50ZXJuLnJfdmFkZHIgLSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQotICAgICAgLyogTGV0IHRoZSBiYWNrZW5kIHNlbGVjdCB0aGUgaG93dG8gZmllbGQgYW5kIGRvIGFueSBvdGhlcgotCSByZXF1aXJlZCBwcm9jZXNzaW5nLiAgKi8KLSAgICAgICgqYmFja2VuZC0+YWRqdXN0X3JlbG9jX2luKSAoYWJmZCwgJmludGVybiwgcnB0cik7Ci0gICAgfQotCi0gIGJmZF9yZWxlYXNlIChhYmZkLCBleHRlcm5hbF9yZWxvY3MpOwotCi0gIHNlY3Rpb24tPnJlbG9jYXRpb24gPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCBhIGNhbm9uaWNhbCBsaXN0IG9mIHJlbG9jcy4gICovCi0KLWxvbmcKLV9iZmRfZWNvZmZfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSAKLSAgICB7Ci0gICAgICBhcmVsZW50X2NoYWluICpjaGFpbjsKLQotICAgICAgLyogVGhpcyBzZWN0aW9uIGhhcyByZWxvY3MgbWFkZSB1cCBieSB1cywgbm90IHRoZSBmaWxlLCBzbyB0YWtlCi0JIHRoZW0gb3V0IG9mIHRoZWlyIGNoYWluIGFuZCBwbGFjZSB0aGVtIGludG8gdGhlIGRhdGEgYXJlYQotCSBwcm92aWRlZC4gICovCi0gICAgICBmb3IgKGNvdW50ID0gMCwgY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLQkgICBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotCSAgIGNvdW50KyssIGNoYWluID0gY2hhaW4tPm5leHQpCi0JKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0gICAgfQotICBlbHNlCi0gICAgeyAKLSAgICAgIGFyZWxlbnQgKnRibHB0cjsKLQotICAgICAgaWYgKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSA9PSBmYWxzZSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCSpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgIH0KLQotICAqcmVscHRyID0gKGFyZWxlbnQgKikgTlVMTDsKLQotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0MCi0vKiBQcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiwgY2FsY3VsYXRlCi0gICBhbmQgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIGxpbmUgbmVhcmVzdCB0byB0aGUKLSAgIHdhbnRlZCBsb2NhdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgaWdub3JlX3N5bWJvbHMsIG9mZnNldCwKLQkJCSAgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgcmV0bGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKippZ25vcmVfc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIENPTlNUIGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKnJldGxpbmVfcHRyOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXAKLSAgICA9ICZlY29mZl9iYWNrZW5kIChhYmZkKS0+ZGVidWdfc3dhcDsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1Z19pbmZvID0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvOwotICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpsaW5lX2luZm87Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgdGhlIEZEUidzLiAgKi8KLSAgaWYgKCEgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvIChhYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwgZGVidWdfaW5mbykKLSAgICAgIHx8IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChlY29mZl9kYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm8gPQotCSgoc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqKQotCSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlY29mZl9maW5kX2xpbmUpKSk7Ci0gICAgICBpZiAoZWNvZmZfZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgbGluZV9pbmZvID0gZWNvZmZfZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvOwotCi0gIHJldHVybiBfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lIChhYmZkLCBzZWN0aW9uLCBvZmZzZXQsIGRlYnVnX2luZm8sCi0JCQkJIGRlYnVnX3N3YXAsIGxpbmVfaW5mbywgZmlsZW5hbWVfcHRyLAotCQkJCSBmdW5jdGlvbm5hbWVfcHRyLCByZXRsaW5lX3B0cik7Ci19Ci0MCi0vKiBDb3B5IHByaXZhdGUgQkZEIGRhdGEuICBUaGlzIGlzIGNhbGxlZCBieSBvYmpjb3B5IGFuZCBzdHJpcC4gIFdlCi0gICB1c2UgaXQgdG8gY29weSB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gb25lIEJGRCB0byB0aGUKLSAgIG90aGVyLiAgSXQgd291bGQgYmUgdGhlb3JldGljYWxseSBwb3NzaWJsZSB0byByZXByZXNlbnQgdGhlIEVDT0ZGCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEhvd2V2ZXIsIGl0IHdvdWxkIGJlIGEKLSAgIGxvdCBvZiB3b3JrLCBhbmQgdGhlcmUgd291bGQgYmUgbGl0dGxlIGdhaW4gKGdhcywgZ2RiLCBhbmQgbGQKLSAgIGFscmVhZHkgYWNjZXNzIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdmlhIHRoZQotICAgZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3R1cmUsIGFuZCB0aGF0IHN0cnVjdHVyZSB3b3VsZCBoYXZlIHRvIGJlCi0gICByZXRhaW5lZCBpbiBvcmRlciB0byBzdXBwb3J0IEVDT0ZGIGRlYnVnZ2luZyBpbiBNSVBTIEVMRikuCi0KLSAgIFRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBFQ09GRiBleHRlcm5hbCBzeW1ib2xzIGNvbWVzIGZyb20KLSAgIHRoZSBzeW1ib2wgdGFibGUsIHNvIHRoaXMgZnVuY3Rpb24gb25seSBoYW5kbGVzIHRoZSBvdGhlciBkZWJ1Z2dpbmcKLSAgIGluZm9ybWF0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmlpbmZvID0gJmVjb2ZmX2RhdGEgKGliZmQpLT5kZWJ1Z19pbmZvOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb2luZm8gPSAmZWNvZmZfZGF0YSAob2JmZCktPmRlYnVnX2luZm87Ci0gIHJlZ2lzdGVyIGludCBpOwotICBhc3ltYm9sICoqc3ltX3B0cl9wdHI7Ci0gIHNpemVfdCBjOwotICBib29sZWFuIGxvY2FsOwotCi0gIC8qIFdlIG9ubHkgd2FudCB0byBjb3B5IGluZm9ybWF0aW9uIG92ZXIgaWYgYm90aCBCRkQncyB1c2UgRUNPRkYKLSAgICAgZm9ybWF0LiAgKi8KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBDb3B5IHRoZSBHUCB2YWx1ZSBhbmQgdGhlIHJlZ2lzdGVyIG1hc2tzLiAgKi8KLSAgZWNvZmZfZGF0YSAob2JmZCktPmdwID0gZWNvZmZfZGF0YSAoaWJmZCktPmdwOwotICBlY29mZl9kYXRhIChvYmZkKS0+Z3BybWFzayA9IGVjb2ZmX2RhdGEgKGliZmQpLT5ncHJtYXNrOwotICBlY29mZl9kYXRhIChvYmZkKS0+ZnBybWFzayA9IGVjb2ZmX2RhdGEgKGliZmQpLT5mcHJtYXNrOwotICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotICAgIGVjb2ZmX2RhdGEgKG9iZmQpLT5jcHJtYXNrW2ldID0gZWNvZmZfZGF0YSAoaWJmZCktPmNwcm1hc2tbaV07Ci0KLSAgLyogQ29weSB0aGUgdmVyc2lvbiBzdGFtcC4gICovCi0gIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIudnN0YW1wID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci52c3RhbXA7Ci0KLSAgLyogSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMsIGRvbid0IGNvcHkgYW55IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGMgPSBiZmRfZ2V0X3N5bWNvdW50IChvYmZkKTsKLSAgc3ltX3B0cl9wdHIgPSBiZmRfZ2V0X291dHN5bWJvbHMgKG9iZmQpOwotICBpZiAoYyA9PSAwIHx8IHN5bV9wdHJfcHRyID09IChhc3ltYm9sICoqKSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFNlZSBpZiB0aGVyZSBhcmUgYW55IGxvY2FsIHN5bWJvbHMuICAqLwotICBsb2NhbCA9IGZhbHNlOwotICBmb3IgKDsgYyA+IDA7IGMtLSwgc3ltX3B0cl9wdHIrKykKLSAgICB7Ci0gICAgICBpZiAoZWNvZmZzeW1ib2wgKCpzeW1fcHRyX3B0ciktPmxvY2FsKQotCXsKLQkgIGxvY2FsID0gdHJ1ZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGxvY2FsKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGFyZSBzb21lIGxvY2FsIHN5bWJvbHMuICBXZSBqdXN0IGJyaW5nIG92ZXIgYWxsIHRoZQotCSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBGSVhNRTogVGhpcyBpcyBub3QgcXVpdGUgdGhlIHJpZ2h0Ci0JIHRoaW5nIHRvIGRvLiAgSWYgdGhlIHVzZXIgaGFzIGFza2VkIHVzIHRvIGRpc2NhcmQgYWxsCi0JIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgdGhlbiB3ZSBhcmUgcHJvYmFibHkgZ29pbmcgdG8gd2luZCB1cAotCSBrZWVwaW5nIGl0IGJlY2F1c2UgdGhlcmUgd2lsbCBwcm9iYWJseSBiZSBzb21lIGxvY2FsIHN5bWJvbAotCSB3aGljaCBvYmpjb3B5IGRpZCBub3QgZGlzY2FyZC4gIFdlIHNob3VsZCBhY3R1YWxseSBicmVhawotCSBhcGFydCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFuZCBvbmx5IGtlZXAgdGhhdCB3aGljaAotCSBhcHBsaWVzIHRvIHRoZSBzeW1ib2xzIHdlIHdhbnQgdG8ga2VlcC4gICovCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlsaW5lTWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pbGluZU1heDsKLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuY2JMaW5lID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5jYkxpbmU7Ci0gICAgICBvaW5mby0+bGluZSA9IGlpbmZvLT5saW5lOwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlkbk1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaWRuTWF4OwotICAgICAgb2luZm8tPmV4dGVybmFsX2RuciA9IGlpbmZvLT5leHRlcm5hbF9kbnI7Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaXBkTWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pcGRNYXg7Ci0gICAgICBvaW5mby0+ZXh0ZXJuYWxfcGRyID0gaWluZm8tPmV4dGVybmFsX3BkcjsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pc3ltTWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pc3ltTWF4OwotICAgICAgb2luZm8tPmV4dGVybmFsX3N5bSA9IGlpbmZvLT5leHRlcm5hbF9zeW07Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaW9wdE1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaW9wdE1heDsKLSAgICAgIG9pbmZvLT5leHRlcm5hbF9vcHQgPSBpaW5mby0+ZXh0ZXJuYWxfb3B0OwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlhdXhNYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlhdXhNYXg7Ci0gICAgICBvaW5mby0+ZXh0ZXJuYWxfYXV4ID0gaWluZm8tPmV4dGVybmFsX2F1eDsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pc3NNYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlzc01heDsKLSAgICAgIG9pbmZvLT5zcyA9IGlpbmZvLT5zczsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pZmRNYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlmZE1heDsKLSAgICAgIG9pbmZvLT5leHRlcm5hbF9mZHIgPSBpaW5mby0+ZXh0ZXJuYWxfZmRyOwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmNyZmQgPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmNyZmQ7Ci0gICAgICBvaW5mby0+ZXh0ZXJuYWxfcmZkID0gaWluZm8tPmV4dGVybmFsX3JmZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBhcmUgZGlzY2FyZGluZyBhbGwgdGhlIGxvY2FsIHN5bWJvbCBpbmZvcm1hdGlvbi4gIExvb2sKLQkgdGhyb3VnaCB0aGUgZXh0ZXJuYWwgc3ltYm9scyBhbmQgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIEZEUgotCSBvciBhdXggaW5mb3JtYXRpb24uICAqLwotICAgICAgYyA9IGJmZF9nZXRfc3ltY291bnQgKG9iZmQpOwotICAgICAgc3ltX3B0cl9wdHIgPSBiZmRfZ2V0X291dHN5bWJvbHMgKG9iZmQpOwotICAgICAgZm9yICg7IGMgPiAwOyBjLS0sIHN5bV9wdHJfcHRyKyspCi0JewotCSAgRVhUUiBlc3ltOwotCi0JICAoKihlY29mZl9iYWNrZW5kIChvYmZkKS0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbikpCi0JICAgIChvYmZkLCBlY29mZnN5bWJvbCAoKnN5bV9wdHJfcHRyKS0+bmF0aXZlLCAmZXN5bSk7Ci0JICBlc3ltLmlmZCA9IGlmZE5pbDsKLQkgIGVzeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOwotCSAgKCooZWNvZmZfYmFja2VuZCAob2JmZCktPmRlYnVnX3N3YXAuc3dhcF9leHRfb3V0KSkKLQkgICAgKG9iZmQsICZlc3ltLCBlY29mZnN5bWJvbCAoKnN5bV9wdHJfcHRyKS0+bmF0aXZlKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogU2V0IHRoZSBhcmNoaXRlY3R1cmUuICBUaGUgc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSBpcyBzdG9yZWQgaW4gdGhlCi0gICBiYWNrZW5kIHBvaW50ZXIuICBXZSBhbHdheXMgc2V0IHRoZSBhcmNoaXRlY3R1cmUgYW55aG93LCBzaW5jZSBtYW55Ci0gICBjYWxsZXJzIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotICByZXR1cm4gYXJjaCA9PSBlY29mZl9iYWNrZW5kIChhYmZkKS0+YXJjaDsKLX0KLQotLyogR2V0IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIGhlYWRlcnMuICAqLwotCi0vKkFSR1NVU0VEKi8KLWludAotX2JmZF9lY29mZl9zaXplb2ZfaGVhZGVycyAoYWJmZCwgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiByZWxvYzsKLXsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIGludCBjOwotICBpbnQgcmV0OwotCi0gIGMgPSAwOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKU5VTEw7IAotICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KSAKLSAgICArK2M7Ci0KLSAgcmV0ID0gKGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCkKLQkgKyBiZmRfY29mZl9hb3V0c3ogKGFiZmQpCi0JICsgYyAqIGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCkpOwotICByZXR1cm4gQkZEX0FMSUdOIChyZXQsIDE2KTsKLX0KLQotLyogR2V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIHJldHVybiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLAotCQkJCQkgICAgb2Zmc2V0LCBjb3VudCk7Ci19Ci0KLS8qIFNvcnQgc2VjdGlvbnMgYnkgVk1BLCBidXQgcHV0IFNFQ19BTExPQyBzZWN0aW9ucyBmaXJzdC4gIFRoaXMgaXMKLSAgIGNhbGxlZCB2aWEgcXNvcnQuICAqLwotCi1zdGF0aWMgaW50Ci1lY29mZl9zb3J0X2hkcnMgKGFyZzEsIGFyZzIpCi0gICAgIGNvbnN0IFBUUiBhcmcxOwotICAgICBjb25zdCBQVFIgYXJnMjsKLXsKLSAgY29uc3QgYXNlY3Rpb24gKmhkcjEgPSAqKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcxOwotICBjb25zdCBhc2VjdGlvbiAqaGRyMiA9ICooY29uc3QgYXNlY3Rpb24gKiopIGFyZzI7Ci0KLSAgaWYgKChoZHIxLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoKGhkcjItPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotCXJldHVybiAtMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKGhkcjItPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCXJldHVybiAxOwotICAgIH0KLSAgaWYgKGhkcjEtPnZtYSA8IGhkcjItPnZtYSkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKGhkcjEtPnZtYSA+IGhkcjItPnZtYSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBDYWxjdWxhdGUgdGhlIGZpbGUgcG9zaXRpb24gZm9yIGVhY2ggc2VjdGlvbiwgYW5kIHNldAotICAgcmVsb2NfZmlsZXBvcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZmlsZV9wdHIgc29mYXIsIGZpbGVfc29mYXI7Ci0gIGFzZWN0aW9uICoqc29ydGVkX2hkcnM7Ci0gIGFzZWN0aW9uICpjdXJyZW50OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgZmlsZV9wdHIgb2xkX3NvZmFyOwotICBib29sZWFuIHJkYXRhX2luX3RleHQ7Ci0gIGJvb2xlYW4gZmlyc3RfZGF0YSwgZmlyc3Rfbm9uYWxsb2M7Ci0gIGNvbnN0IGJmZF92bWEgcm91bmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKS0+cm91bmQ7Ci0KLSAgc29mYXIgPSBfYmZkX2Vjb2ZmX3NpemVvZl9oZWFkZXJzIChhYmZkLCBmYWxzZSk7Ci0gIGZpbGVfc29mYXIgPSBzb2ZhcjsKLQotICAvKiBTb3J0IHRoZSBzZWN0aW9ucyBieSBWTUEuICAqLwotICBzb3J0ZWRfaGRycyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoYWJmZC0+c2VjdGlvbl9jb3VudAotCQkJCQkgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gIGlmIChzb3J0ZWRfaGRycyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnMsIGkgPSAwOwotICAgICAgIGN1cnJlbnQgIT0gTlVMTDsKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCwgaSsrKQotICAgIHNvcnRlZF9oZHJzW2ldID0gY3VycmVudDsKLSAgQkZEX0FTU0VSVCAoaSA9PSBhYmZkLT5zZWN0aW9uX2NvdW50KTsKLQotICBxc29ydCAoc29ydGVkX2hkcnMsIGFiZmQtPnNlY3Rpb25fY291bnQsIHNpemVvZiAoYXNlY3Rpb24gKiksCi0JIGVjb2ZmX3NvcnRfaGRycyk7Ci0KLSAgLyogU29tZSB2ZXJzaW9ucyBvZiB0aGUgT1NGIGxpbmtlciBwdXQgdGhlIC5yZGF0YSBzZWN0aW9uIGluIHRoZQotICAgICB0ZXh0IHNlZ21lbnQsIGFuZCBzb21lIGRvIG5vdC4gICovCi0gIHJkYXRhX2luX3RleHQgPSBlY29mZl9iYWNrZW5kIChhYmZkKS0+cmRhdGFfaW5fdGV4dDsKLSAgaWYgKHJkYXRhX2luX3RleHQpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBjdXJyZW50ID0gc29ydGVkX2hkcnNbaV07Ci0JICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUkRBVEEpID09IDApCi0JICAgIGJyZWFrOwotCSAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0JICAgICAgJiYgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUERBVEEpICE9IDAKLQkgICAgICAmJiBzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9SQ09OU1QpICE9IDApCi0JICAgIHsKLQkgICAgICByZGF0YV9pbl90ZXh0ID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlY29mZl9kYXRhIChhYmZkKS0+cmRhdGFfaW5fdGV4dCA9IHJkYXRhX2luX3RleHQ7Ci0KLSAgZmlyc3RfZGF0YSA9IHRydWU7Ci0gIGZpcnN0X25vbmFsbG9jID0gdHJ1ZTsKLSAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOwotCi0gICAgICBjdXJyZW50ID0gc29ydGVkX2hkcnNbaV07Ci0KLSAgICAgIC8qIEZvciB0aGUgQWxwaGEgRUNPRkYgLnBkYXRhIHNlY3Rpb24gdGhlIGxubm9wdHIgZmllbGQgaXMKLQkgc3VwcG9zZWQgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiAucGRhdGEgZW50cmllcyB0aGF0IGFyZQotCSByZWFsbHkgaW4gdGhlIHNlY3Rpb24uICBFYWNoIGVudHJ5IGlzIDggYnl0ZXMuICBXZSBzdG9yZSB0aGlzCi0JIGF3YXkgaW4gbGluZV9maWxlcG9zIGJlZm9yZSBpbmNyZWFzaW5nIHRoZSBzZWN0aW9uIHNpemUuICAqLwotICAgICAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1BEQVRBKSA9PSAwKQotCWN1cnJlbnQtPmxpbmVfZmlsZXBvcyA9IGN1cnJlbnQtPl9yYXdfc2l6ZSAvIDg7Ci0KLSAgICAgIGFsaWdubWVudF9wb3dlciA9IGN1cnJlbnQtPmFsaWdubWVudF9wb3dlcjsKLQotICAgICAgLyogT24gVWx0cml4LCB0aGUgZGF0YSBzZWN0aW9ucyBpbiBhbiBleGVjdXRhYmxlIGZpbGUgbXVzdCBiZQotCSBhbGlnbmVkIHRvIGEgcGFnZSBib3VuZGFyeSB3aXRoaW4gdGhlIGZpbGUuICBUaGlzIGRvZXMgbm90Ci0JIGFmZmVjdCB0aGUgc2VjdGlvbiBzaXplLCB0aG91Z2guICBGSVhNRTogRG9lcyB0aGlzIHdvcmsgZm9yCi0JIG90aGVyIHBsYXRmb3Jtcz8gIEl0IHJlcXVpcmVzIHNvbWUgbW9kaWZpY2F0aW9uIGZvciB0aGUKLQkgQWxwaGEsIGJlY2F1c2UgLnJkYXRhIG9uIHRoZSBBbHBoYSBnb2VzIHdpdGggdGhlIHRleHQsIG5vdAotCSB0aGUgZGF0YS4gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwCi0JICAmJiAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwCi0JICAmJiAhIGZpcnN0X2RhdGEKLQkgICYmIChjdXJyZW50LT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0JICAmJiAoISByZGF0YV9pbl90ZXh0Ci0JICAgICAgfHwgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUkRBVEEpICE9IDApCi0JICAmJiBzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9QREFUQSkgIT0gMAotCSAgJiYgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUkNPTlNUKSAhPSAwKQotCXsKLQkgIHNvZmFyID0gKHNvZmFyICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLQkgIGZpbGVfc29mYXIgPSAoZmlsZV9zb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JICBmaXJzdF9kYXRhID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfTElCKSA9PSAwKQotCXsKLQkgIC8qIE9uIElyaXggNCwgdGhlIGxvY2F0aW9uIG9mIGNvbnRlbnRzIG9mIHRoZSAubGliIHNlY3Rpb24KLQkgICAgIGZyb20gYSBzaGFyZWQgbGlicmFyeSBzZWN0aW9uIGlzIGFsc28gcm91bmRlZCB1cCB0byBhCi0JICAgICBwYWdlIGJvdW5kYXJ5LiAgKi8KLQotCSAgc29mYXIgPSAoc29mYXIgKyByb3VuZCAtIDEpICZ+IChyb3VuZCAtIDEpOwotCSAgZmlsZV9zb2ZhciA9IChmaWxlX3NvZmFyICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLQl9Ci0gICAgICBlbHNlIGlmIChmaXJzdF9ub25hbGxvYwotCSAgICAgICAmJiAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDAKLQkgICAgICAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLQl7Ci0JICAvKiBTa2lwIHVwIHRvIHRoZSBuZXh0IHBhZ2UgZm9yIGFuIHVuYWxsb2NhdGVkIHNlY3Rpb24sIHN1Y2gKLSAgICAgICAgICAgICBhcyB0aGUgLmNvbW1lbnQgc2VjdGlvbiBvbiB0aGUgQWxwaGEuICBUaGlzIGxlYXZlcyByb29tCi0gICAgICAgICAgICAgZm9yIHRoZSAuYnNzIHNlY3Rpb24uICAqLwotCSAgZmlyc3Rfbm9uYWxsb2MgPSBmYWxzZTsKLQkgIHNvZmFyID0gKHNvZmFyICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLQkgIGZpbGVfc29mYXIgPSAoZmlsZV9zb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JfQotCi0gICAgICAvKiBBbGlnbiB0aGUgc2VjdGlvbnMgaW4gdGhlIGZpbGUgdG8gdGhlIHNhbWUgYm91bmRhcnkgb24KLQkgd2hpY2ggdGhleSBhcmUgYWxpZ25lZCBpbiB2aXJ0dWFsIG1lbW9yeS4gICovCi0gICAgICBzb2ZhciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgYWxpZ25tZW50X3Bvd2VyKTsKLSAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotCWZpbGVfc29mYXIgPSBCRkRfQUxJR04gKGZpbGVfc29mYXIsIDEgPDwgYWxpZ25tZW50X3Bvd2VyKTsKLQotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDAKLQkgICYmIChjdXJyZW50LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQl7Ci0JICBzb2ZhciArPSAoY3VycmVudC0+dm1hIC0gc29mYXIpICUgcm91bmQ7Ci0JICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQkgICAgZmlsZV9zb2ZhciArPSAoY3VycmVudC0+dm1hIC0gZmlsZV9zb2ZhcikgJSByb3VuZDsKLQl9Ci0KLSAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEKSkgIT0gMCkKLQljdXJyZW50LT5maWxlcG9zID0gZmlsZV9zb2ZhcjsKLQotICAgICAgc29mYXIgKz0gY3VycmVudC0+X3Jhd19zaXplOwotICAgICAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JZmlsZV9zb2ZhciArPSBjdXJyZW50LT5fcmF3X3NpemU7Ci0KLSAgICAgIC8qIG1ha2Ugc3VyZSB0aGF0IHRoaXMgc2VjdGlvbiBpcyBvZiB0aGUgcmlnaHQgc2l6ZSB0b28gKi8KLSAgICAgIG9sZF9zb2ZhciA9IHNvZmFyOwotICAgICAgc29mYXIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IGFsaWdubWVudF9wb3dlcik7Ci0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQlmaWxlX3NvZmFyID0gQkZEX0FMSUdOIChmaWxlX3NvZmFyLCAxIDw8IGFsaWdubWVudF9wb3dlcik7Ci0gICAgICBjdXJyZW50LT5fcmF3X3NpemUgKz0gc29mYXIgLSBvbGRfc29mYXI7Ci0gICAgfQotCi0gIGZyZWUgKHNvcnRlZF9oZHJzKTsKLSAgc29ydGVkX2hkcnMgPSBOVUxMOwotCi0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5yZWxvY19maWxlcG9zID0gZmlsZV9zb2ZhcjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGV0ZXJtaW5lIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVsb2NzIGZvciBhbGwgdGhlIHNlY3Rpb25zIGluIHRoZQotICAgb3V0cHV0IGZpbGUsIGFzIHdlbGwgYXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeW1ib2xpYyBkZWJ1Z2dpbmcKLSAgIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJmZF9zaXplX3R5cGUKLWVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY19zaXplID0KLSAgICBlY29mZl9iYWNrZW5kIChhYmZkKS0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgZmlsZV9wdHIgcmVsb2NfYmFzZTsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19zaXplOwotICBhc2VjdGlvbiAqY3VycmVudDsKLSAgZmlsZV9wdHIgc3ltX2Jhc2U7Ci0KLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBpZiAoISBlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCWFib3J0ICgpOwotICAgICAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0gICAgfQotICAKLSAgcmVsb2NfYmFzZSA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5yZWxvY19maWxlcG9zOwotCi0gIHJlbG9jX3NpemUgPSAwOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKU5VTEw7IAotICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KSAKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudC0+cmVsb2NfY291bnQgPT0gMCkKLQljdXJyZW50LT5yZWxfZmlsZXBvcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3NpemVfdHlwZSByZWxzaXplOwotCi0JICBjdXJyZW50LT5yZWxfZmlsZXBvcyA9IHJlbG9jX2Jhc2U7Ci0JICByZWxzaXplID0gY3VycmVudC0+cmVsb2NfY291bnQgKiBleHRlcm5hbF9yZWxvY19zaXplOwotCSAgcmVsb2Nfc2l6ZSArPSByZWxzaXplOwotCSAgcmVsb2NfYmFzZSArPSByZWxzaXplOwotCX0KLSAgICB9Ci0KLSAgc3ltX2Jhc2UgPSBlY29mZl9kYXRhIChhYmZkKS0+cmVsb2NfZmlsZXBvcyArIHJlbG9jX3NpemU7Ci0KLSAgLyogQXQgbGVhc3Qgb24gVWx0cml4LCB0aGUgc3ltYm9sIHRhYmxlIG9mIGFuIGV4ZWN1dGFibGUgZmlsZSBtdXN0Ci0gICAgIGJlIGFsaWduZWQgdG8gYSBwYWdlIGJvdW5kYXJ5LiAgRklYTUU6IElzIHRoaXMgdHJ1ZSBvbiBvdGhlcgotICAgICBwbGF0Zm9ybXM/ICAqLwotICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwCi0gICAgICAmJiAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotICAgIHN5bV9iYXNlID0gKChzeW1fYmFzZSArIGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5yb3VuZCAtIDEpCi0JCSZ+IChlY29mZl9iYWNrZW5kIChhYmZkKS0+cm91bmQgLSAxKSk7Ci0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zID0gc3ltX2Jhc2U7Ci0KLSAgcmV0dXJuIHJlbG9jX3NpemU7Ci19Ci0KLS8qIFNldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICAvKiBUaGlzIG11c3QgYmUgZG9uZSBmaXJzdCwgYmVjYXVzZSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgaXMKLSAgICAgZ29pbmcgdG8gc2V0IG91dHB1dF9oYXNfYmVndW4gdG8gdHJ1ZS4gICovCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKQotICAgIHsKLSAgICAgIGlmICghIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBIYW5kbGUgdGhlIC5saWIgc2VjdGlvbiBzcGVjaWFsbHkgc28gdGhhdCBJcml4IDQgc2hhcmVkIGxpYnJhcmllcwotICAgICB3b3JrIG91dC4gIFNlZSBjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzIGluIGNvZmZjb2RlLmguICAqLwotICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfTElCKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpyZWMsICpyZWNlbmQ7Ci0KLSAgICAgIHJlYyA9IChiZmRfYnl0ZSAqKSBsb2NhdGlvbjsKLSAgICAgIHJlY2VuZCA9IHJlYyArIGNvdW50OwotICAgICAgd2hpbGUgKHJlYyA8IHJlY2VuZCkKLQl7Ci0JICArK3NlY3Rpb24tPmxtYTsKLQkgIHJlYyArPSBiZmRfZ2V0XzMyIChhYmZkLCByZWMpICogNDsKLQl9Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHJlYyA9PSByZWNlbmQpOwotICAgIH0KLQotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQpLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3dyaXRlIChsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBHUCB2YWx1ZSBmb3IgYW4gRUNPRkYgZmlsZS4gIFRoaXMgaXMgYSBob29rIHVzZWQgYnkKLSAgIG5sbWNvbnYuICAqLwotCi1iZmRfdm1hCi1iZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgCi0gIHJldHVybiBlY29mZl9kYXRhIChhYmZkKS0+Z3A7Ci19Ci0KLS8qIFNldCB0aGUgR1AgdmFsdWUgZm9yIGFuIEVDT0ZGIGZpbGUuICBUaGlzIGlzIGEgaG9vayB1c2VkIGJ5IHRoZQotICAgYXNzZW1ibGVyLiAgKi8KLQotYm9vbGVhbgotYmZkX2Vjb2ZmX3NldF9ncF92YWx1ZSAoYWJmZCwgZ3BfdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3ZtYSBncF92YWx1ZTsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgIT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlY29mZl9kYXRhIChhYmZkKS0+Z3AgPSBncF92YWx1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSByZWdpc3RlciBtYXNrcyBmb3IgYW4gRUNPRkYgZmlsZS4gIFRoaXMgaXMgYSBob29rIHVzZWQgYnkKLSAgIHRoZSBhc3NlbWJsZXIuICAqLwotCi1ib29sZWFuCi1iZmRfZWNvZmZfc2V0X3JlZ21hc2tzIChhYmZkLCBncHJtYXNrLCBmcHJtYXNrLCBjcHJtYXNrKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZ3BybWFzazsKLSAgICAgdW5zaWduZWQgbG9uZyBmcHJtYXNrOwotICAgICB1bnNpZ25lZCBsb25nICpjcHJtYXNrOwotewotICBlY29mZl9kYXRhX3R5cGUgKnRkYXRhOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgdGRhdGEgPSBlY29mZl9kYXRhIChhYmZkKTsKLSAgdGRhdGEtPmdwcm1hc2sgPSBncHJtYXNrOwotICB0ZGF0YS0+ZnBybWFzayA9IGZwcm1hc2s7Ci0gIGlmIChjcHJtYXNrICE9ICh1bnNpZ25lZCBsb25nICopIE5VTEwpCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0JdGRhdGEtPmNwcm1hc2tbaV0gPSBjcHJtYXNrW2ldOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IEVDT0ZGIEVYVFIgaW5mb3JtYXRpb24gZm9yIGFuIGV4dGVybmFsIHN5bWJvbC4gIFRoaXMgZnVuY3Rpb24KLSAgIGlzIHBhc3NlZCB0byBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2dldF9leHRyIChzeW0sIGVzeW0pCi0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgRVhUUiAqZXN5bTsKLXsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKmVjb2ZmX3N5bV9wdHI7Ci0gIGJmZCAqaW5wdXRfYmZkOwotCi0gIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyIChzeW0pICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgZWNvZmZzeW1ib2wgKHN5bSktPm5hdGl2ZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIERvbid0IGluY2x1ZGUgZGVidWdnaW5nLCBsb2NhbCwgb3Igc2VjdGlvbiBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDAKLQkgIHx8IChzeW0tPmZsYWdzICYgQlNGX0xPQ0FMKSAhPSAwCi0JICB8fCAoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGVzeW0tPmptcHRibCA9IDA7Ci0gICAgICBlc3ltLT5jb2JvbF9tYWluID0gMDsKLSAgICAgIGVzeW0tPndlYWtleHQgPSAoc3ltLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwOwotICAgICAgZXN5bS0+cmVzZXJ2ZWQgPSAwOwotICAgICAgZXN5bS0+aWZkID0gaWZkTmlsOwotICAgICAgLyogRklYTUU6IHdlIGNhbiBkbyBiZXR0ZXIgdGhhbiB0aGlzIGZvciBzdCBhbmQgc2MuICAqLwotICAgICAgZXN5bS0+YXN5bS5zdCA9IHN0R2xvYmFsOwotICAgICAgZXN5bS0+YXN5bS5zYyA9IHNjQWJzOwotICAgICAgZXN5bS0+YXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBlc3ltLT5hc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgZWNvZmZfc3ltX3B0ciA9IGVjb2Zmc3ltYm9sIChzeW0pOwotCi0gIGlmIChlY29mZl9zeW1fcHRyLT5sb2NhbCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5wdXRfYmZkID0gYmZkX2FzeW1ib2xfYmZkIChzeW0pOwotICAoKihlY29mZl9iYWNrZW5kIChpbnB1dF9iZmQpLT5kZWJ1Z19zd2FwLnN3YXBfZXh0X2luKSkKLSAgICAoaW5wdXRfYmZkLCBlY29mZl9zeW1fcHRyLT5uYXRpdmUsIGVzeW0pOwotCi0gIC8qIElmIHRoZSBzeW1ib2wgd2FzIGRlZmluZWQgYnkgdGhlIGxpbmtlciwgdGhlbiBlc3ltIHdpbGwgYmUKLSAgICAgdW5kZWZpbmVkIGJ1dCBzeW0gd2lsbCBub3QgYmUuICBHZXQgYSBiZXR0ZXIgY2xhc3MgZm9yIHN1Y2ggYQotICAgICBzeW1ib2wuICAqLwotICBpZiAoKGVzeW0tPmFzeW0uc2MgPT0gc2NVbmRlZmluZWQKLSAgICAgICB8fCBlc3ltLT5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKLSAgICAgICYmICEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotICAgIGVzeW0tPmFzeW0uc2MgPSBzY0FiczsKLQotICAvKiBBZGp1c3QgdGhlIEZEUiBpbmRleCBmb3IgdGhlIHN5bWJvbCBieSB0aGF0IHVzZWQgZm9yIHRoZSBpbnB1dAotICAgICBCRkQuICAqLwotICBpZiAoZXN5bS0+aWZkICE9IC0xKQotICAgIHsKLSAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICppbnB1dF9kZWJ1ZzsKLQotICAgICAgaW5wdXRfZGVidWcgPSAmZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZGVidWdfaW5mbzsKLSAgICAgIEJGRF9BU1NFUlQgKGVzeW0tPmlmZCA8IGlucHV0X2RlYnVnLT5zeW1ib2xpY19oZWFkZXIuaWZkTWF4KTsKLSAgICAgIGlmIChpbnB1dF9kZWJ1Zy0+aWZkbWFwICE9IChSRkRUICopIE5VTEwpCi0JZXN5bS0+aWZkID0gaW5wdXRfZGVidWctPmlmZG1hcFtlc3ltLT5pZmRdOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBleHRlcm5hbCBzeW1ib2wgaW5kZXguICBUaGlzIHJvdXRpbmUgaXMgcGFzc2VkIHRvCi0gICBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3NldF9pbmRleCAoc3ltLCBpbmR4KQotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLXsKLSAgZWNvZmZfc2V0X3N5bV9pbmRleCAoc3ltLCBpbmR4KTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIEVDT0ZGIGZpbGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICBjb25zdCBiZmRfdm1hIHJvdW5kID0gYmFja2VuZC0+cm91bmQ7Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZmlsaHN6ID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBhb3V0c3ogPSBiZmRfY29mZl9hb3V0c3ogKGFiZmQpOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIHNjbmhzeiA9IGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCk7Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfaGRyX3NpemUKLSAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfaGRyX3NpemU7Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGJhY2tlbmQtPmV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIHZvaWQgKCogY29uc3QgYWRqdXN0X3JlbG9jX291dCkgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgIGNvbnN0IGFyZWxlbnQgKiwKLQkJCQkJICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKQotICAgID0gYmFja2VuZC0+YWRqdXN0X3JlbG9jX291dDsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3JlbG9jX291dCkgUEFSQU1TICgoYmZkICosCi0JCQkJCSBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkJIFBUUikpCi0gICAgPSBiYWNrZW5kLT5zd2FwX3JlbG9jX291dDsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1ZyA9ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mbzsKLSAgSERSUiAqIGNvbnN0IHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBhc2VjdGlvbiAqY3VycmVudDsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBiZmRfc2l6ZV90eXBlIHJlbG9jX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwotICBiZmRfdm1hIHRleHRfc3RhcnQ7Ci0gIGJvb2xlYW4gc2V0X3RleHRfc3RhcnQ7Ci0gIGJmZF9zaXplX3R5cGUgZGF0YV9zaXplOwotICBiZmRfdm1hIGRhdGFfc3RhcnQ7Ci0gIGJvb2xlYW4gc2V0X2RhdGFfc3RhcnQ7Ci0gIGJmZF9zaXplX3R5cGUgYnNzX3NpemU7Ci0gIFBUUiBidWZmID0gTlVMTDsKLSAgUFRSIHJlbG9jX2J1ZmYgPSBOVUxMOwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciBpbnRlcm5hbF9mOwotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciBpbnRlcm5hbF9hOwotICBpbnQgaTsKLQotICAvKiBEZXRlcm1pbmUgd2hlcmUgdGhlIHNlY3Rpb25zIGFuZCByZWxvY3Mgd2lsbCBnbyBpbiB0aGUgb3V0cHV0Ci0gICAgIGZpbGUuICAqLwotICByZWxvY19zaXplID0gZWNvZmZfY29tcHV0ZV9yZWxvY19maWxlX3Bvc2l0aW9ucyAoYWJmZCk7Ci0KLSAgY291bnQgPSAxOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKU5VTEw7IAotICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KSAKLSAgICB7Ci0gICAgICBjdXJyZW50LT50YXJnZXRfaW5kZXggPSBjb3VudDsKLSAgICAgICsrY291bnQ7Ci0gICAgfQotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotICAgIHRleHRfc2l6ZSA9IF9iZmRfZWNvZmZfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGZhbHNlKTsKLSAgZWxzZQotICAgIHRleHRfc2l6ZSA9IDA7Ci0gIHRleHRfc3RhcnQgPSAwOwotICBzZXRfdGV4dF9zdGFydCA9IGZhbHNlOwotICBkYXRhX3NpemUgPSAwOwotICBkYXRhX3N0YXJ0ID0gMDsKLSAgc2V0X2RhdGFfc3RhcnQgPSBmYWxzZTsKLSAgYnNzX3NpemUgPSAwOwotCi0gIC8qIFdyaXRlIHNlY3Rpb24gaGVhZGVycyB0byB0aGUgZmlsZS4gICovCi0KLSAgLyogQWxsb2NhdGUgYnVmZiBiaWcgZW5vdWdoIHRvIGhvbGQgYSBzZWN0aW9uIGhlYWRlciwKLSAgICAgZmlsZSBoZWFkZXIsIG9yIGEub3V0IGhlYWRlci4gICovCi0gIHsKLSAgICBiZmRfc2l6ZV90eXBlIHNpejsKLSAgICBzaXogPSBzY25oc3o7Ci0gICAgaWYgKHNpeiA8IGZpbGhzeikKLSAgICAgIHNpeiA9IGZpbGhzejsKLSAgICBpZiAoc2l6IDwgYW91dHN6KQotICAgICAgc2l6ID0gYW91dHN6OwotICAgIGJ1ZmYgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzaXopOwotICAgIGlmIChidWZmID09IE5VTEwpCi0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgfQotCi0gIGludGVybmFsX2YuZl9uc2NucyA9IDA7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoZmlsaHN6ICsgYW91dHN6KSwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOwotICAgICAgIGN1cnJlbnQgIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3NjbmhkciBzZWN0aW9uOwotICAgICAgYmZkX3ZtYSB2bWE7Ci0KLSAgICAgICsraW50ZXJuYWxfZi5mX25zY25zOwotCi0gICAgICBzdHJuY3B5IChzZWN0aW9uLnNfbmFtZSwgY3VycmVudC0+bmFtZSwgc2l6ZW9mIHNlY3Rpb24uc19uYW1lKTsKLQotICAgICAgLyogVGhpcyBzZWVtcyB0byBiZSBjb3JyZWN0IGZvciBJcml4IDQgc2hhcmVkIGxpYnJhcmllcy4gICovCi0gICAgICB2bWEgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBjdXJyZW50KTsKLSAgICAgIGlmIChzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9MSUIpID09IDApCi0Jc2VjdGlvbi5zX3ZhZGRyID0gMDsKLSAgICAgIGVsc2UKLQlzZWN0aW9uLnNfdmFkZHIgPSB2bWE7Ci0KLSAgICAgIHNlY3Rpb24uc19wYWRkciA9IGN1cnJlbnQtPmxtYTsKLSAgICAgIHNlY3Rpb24uc19zaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChjdXJyZW50KTsKLQotICAgICAgLyogSWYgdGhpcyBzZWN0aW9uIGlzIHVubG9hZGFibGUgdGhlbiB0aGUgc2NucHRyIHdpbGwgYmUgMC4gICovCi0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUykpID09IDApCi0Jc2VjdGlvbi5zX3NjbnB0ciA9IDA7Ci0gICAgICBlbHNlCi0Jc2VjdGlvbi5zX3NjbnB0ciA9IGN1cnJlbnQtPmZpbGVwb3M7Ci0gICAgICBzZWN0aW9uLnNfcmVscHRyID0gY3VycmVudC0+cmVsX2ZpbGVwb3M7Ci0KLSAgICAgIC8qIEZJWE1FOiB0aGUgbG5ub3B0ciBvZiB0aGUgLnNic3Mgb3IgLnNkYXRhIHNlY3Rpb24gb2YgYW4KLQkgb2JqZWN0IGZpbGUgcHJvZHVjZWQgYnkgdGhlIGFzc2VtYmxlciBpcyBzdXBwb3NlZCB0byBwb2ludCB0bwotCSBpbmZvcm1hdGlvbiBhYm91dCBob3cgbXVjaCByb29tIGlzIHJlcXVpcmVkIGJ5IG9iamVjdHMgb2YKLQkgdmFyaW91cyBkaWZmZXJlbnQgc2l6ZXMuICBJIHRoaW5rIHRoaXMgb25seSBtYXR0ZXJzIGlmIHdlCi0JIHdhbnQgdGhlIGxpbmtlciB0byBjb21wdXRlIHRoZSBiZXN0IHNpemUgdG8gdXNlLCBvcgotCSBzb21ldGhpbmcuICBJIGRvbid0IGtub3cgd2hhdCBoYXBwZW5zIGlmIHRoZSBpbmZvcm1hdGlvbiBpcwotCSBub3QgcHJlc2VudC4gICovCi0gICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUERBVEEpICE9IDApCi0Jc2VjdGlvbi5zX2xubm9wdHIgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoZSBBbHBoYSBFQ09GRiAucGRhdGEgc2VjdGlvbiB1c2VzIHRoZSBsbm5vcHRyIGZpZWxkIHRvCi0JICAgICBob2xkIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc2VjdGlvbiAoZWFjaCBlbnRyeSBpcwotCSAgICAgOCBieXRlcykuICBXZSBzdG9yZWQgdGhpcyBpbiB0aGUgbGluZV9maWxlcG9zIGZpZWxkIGluCi0JICAgICBlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuICAqLwotCSAgc2VjdGlvbi5zX2xubm9wdHIgPSBjdXJyZW50LT5saW5lX2ZpbGVwb3M7Ci0JfQotCi0gICAgICBzZWN0aW9uLnNfbnJlbG9jID0gY3VycmVudC0+cmVsb2NfY291bnQ7Ci0gICAgICBzZWN0aW9uLnNfbmxubm8gPSAwOwotICAgICAgc2VjdGlvbi5zX2ZsYWdzID0gZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MgKGN1cnJlbnQtPm5hbWUsCi0JCQkJCQkgY3VycmVudC0+ZmxhZ3MpOwotCi0gICAgICBpZiAoYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0IChhYmZkLCAoUFRSKSAmc2VjdGlvbiwgYnVmZikgPT0gMAotCSAgfHwgYmZkX3dyaXRlIChidWZmLCAxLCBzY25oc3osIGFiZmQpICE9IHNjbmhzeikKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1RFWFQpICE9IDAKLQkgIHx8ICgoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9SREFUQSkgIT0gMAotCSAgICAgICYmIGVjb2ZmX2RhdGEgKGFiZmQpLT5yZGF0YV9pbl90ZXh0KQotCSAgfHwgc2VjdGlvbi5zX2ZsYWdzID09IFNUWVBfUERBVEEKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0RZTkFNSUMpICE9IDAKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0xJQkxJU1QpICE9IDAKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1JFTERZTikgIT0gMAotCSAgfHwgc2VjdGlvbi5zX2ZsYWdzID09IFNUWVBfQ09ORkxJQwotCSAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfRFlOU1RSKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9EWU5TWU0pICE9IDAKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0hBU0gpICE9IDAKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0VDT0ZGX0lOSVQpICE9IDAKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0VDT0ZGX0ZJTkkpICE9IDAKLQkgIHx8IHNlY3Rpb24uc19mbGFncyA9PSBTVFlQX1JDT05TVCkKLQl7Ci0JICB0ZXh0X3NpemUgKz0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChjdXJyZW50KTsKLQkgIGlmICghIHNldF90ZXh0X3N0YXJ0IHx8IHRleHRfc3RhcnQgPiB2bWEpCi0JICAgIHsKLQkgICAgICB0ZXh0X3N0YXJ0ID0gdm1hOwotCSAgICAgIHNldF90ZXh0X3N0YXJ0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1JEQVRBKSAhPSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0RBVEEpICE9IDAKLQkgICAgICAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfTElUQSkgIT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9MSVQ4KSAhPSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0xJVDQpICE9IDAKLQkgICAgICAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfU0RBVEEpICE9IDAKLQkgICAgICAgfHwgc2VjdGlvbi5zX2ZsYWdzID09IFNUWVBfWERBVEEKLQkgICAgICAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfR09UKSAhPSAwKQotCXsKLQkgIGRhdGFfc2l6ZSArPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGN1cnJlbnQpOwotCSAgaWYgKCEgc2V0X2RhdGFfc3RhcnQgfHwgZGF0YV9zdGFydCA+IHZtYSkKLQkgICAgewotCSAgICAgIGRhdGFfc3RhcnQgPSB2bWE7Ci0JICAgICAgc2V0X2RhdGFfc3RhcnQgPSB0cnVlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfQlNTKSAhPSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1NCU1MpICE9IDApCi0JYnNzX3NpemUgKz0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChjdXJyZW50KTsKLSAgICAgIGVsc2UgaWYgKHNlY3Rpb24uc19mbGFncyA9PSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0VDT0ZGX0xJQikgIT0gMAotCSAgICAgICB8fCBzZWN0aW9uLnNfZmxhZ3MgPT0gU1RZUF9DT01NRU5UKQotCS8qIERvIG5vdGhpbmcgKi8gOwotICAgICAgZWxzZQotCWFib3J0ICgpOwotICAgIH0JCi0KLSAgLyogU2V0IHVwIHRoZSBmaWxlIGhlYWRlci4gICovCi0KLSAgaW50ZXJuYWxfZi5mX21hZ2ljID0gZWNvZmZfZ2V0X21hZ2ljIChhYmZkKTsKLQotICAvKiBXZSB3aWxsIE5PVCBwdXQgYSBmdWNraW5nIHRpbWVzdGFtcCBpbiB0aGUgaGVhZGVyIGhlcmUuIEV2ZXJ5Ci0gICAgIHRpbWUgeW91IHB1dCBpdCBiYWNrLCBJIHdpbGwgY29tZSBpbiBhbmQgdGFrZSBpdCBvdXQgYWdhaW4uICBJJ20KLSAgICAgc29ycnkuICBUaGlzIGZpZWxkIGRvZXMgbm90IGJlbG9uZyBoZXJlLiAgV2UgZmlsbCBpdCB3aXRoIGEgMCBzbwotICAgICBpdCBjb21wYXJlcyB0aGUgc2FtZSBidXQgaXMgbm90IGEgcmVhc29uYWJsZSB0aW1lLiAtLQotICAgICBnbnVAY3lnbnVzLmNvbS4gICovCi0gIGludGVybmFsX2YuZl90aW1kYXQgPSAwOwotCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoZSBFQ09GRiBmX25zeW1zIGZpZWxkIGlzIG5vdCBhY3R1YWxseSB0aGUgbnVtYmVyIG9mCi0JIHN5bWJvbHMsIGl0J3MgdGhlIHNpemUgb2Ygc3ltYm9saWMgaW5mb3JtYXRpb24gaGVhZGVyLiAgKi8KLSAgICAgIGludGVybmFsX2YuZl9uc3ltcyA9IGV4dGVybmFsX2hkcl9zaXplOwotICAgICAgaW50ZXJuYWxfZi5mX3N5bXB0ciA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvczsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRlcm5hbF9mLmZfbnN5bXMgPSAwOwotICAgICAgaW50ZXJuYWxfZi5mX3N5bXB0ciA9IDA7Ci0gICAgfQotCi0gIGludGVybmFsX2YuZl9vcHRoZHIgPSBhb3V0c3o7Ci0KLSAgaW50ZXJuYWxfZi5mX2ZsYWdzID0gRl9MTk5POwotICBpZiAocmVsb2Nfc2l6ZSA9PSAwKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX1JFTEZMRzsKLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfTFNZTVM7Ci0gIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9FWEVDOwotCi0gIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfQVIzMldSOwotICBlbHNlCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfQVIzMlc7Ci0KLSAgLyogU2V0IHVwIHRoZSBgYG9wdGlvbmFsJycgaGVhZGVyLiAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IEVDT0ZGX0FPVVRfWk1BR0lDOwotICBlbHNlCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IEVDT0ZGX0FPVVRfT01BR0lDOwotCi0gIC8qIEZJWE1FOiBJcyB0aGlzIHJlYWxseSBjb3JyZWN0PyAgKi8KLSAgaW50ZXJuYWxfYS52c3RhbXAgPSBzeW1oZHItPnZzdGFtcDsKLQotICAvKiBBdCBsZWFzdCBvbiBVbHRyaXgsIHRoZXNlIGhhdmUgdG8gYmUgcm91bmRlZCB0byBwYWdlIGJvdW5kYXJpZXMuCi0gICAgIEZJWE1FOiBJcyB0aGlzIHRydWUgb24gb3RoZXIgcGxhdGZvcm1zPyAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0gICAgewotICAgICAgaW50ZXJuYWxfYS50c2l6ZSA9ICh0ZXh0X3NpemUgKyByb3VuZCAtIDEpICZ+IChyb3VuZCAtIDEpOwotICAgICAgaW50ZXJuYWxfYS50ZXh0X3N0YXJ0ID0gdGV4dF9zdGFydCAmfiAocm91bmQgLSAxKTsKLSAgICAgIGludGVybmFsX2EuZHNpemUgPSAoZGF0YV9zaXplICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLSAgICAgIGludGVybmFsX2EuZGF0YV9zdGFydCA9IGRhdGFfc3RhcnQgJn4gKHJvdW5kIC0gMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ZXJuYWxfYS50c2l6ZSA9IHRleHRfc2l6ZTsKLSAgICAgIGludGVybmFsX2EudGV4dF9zdGFydCA9IHRleHRfc3RhcnQ7Ci0gICAgICBpbnRlcm5hbF9hLmRzaXplID0gZGF0YV9zaXplOwotICAgICAgaW50ZXJuYWxfYS5kYXRhX3N0YXJ0ID0gZGF0YV9zdGFydDsKLSAgICB9Ci0KLSAgLyogT24gVWx0cml4LCB0aGUgaW5pdGlhbCBwb3J0aW9ucyBvZiB0aGUgLnNic3MgYW5kIC5ic3Mgc2VnbWVudHMKLSAgICAgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEgc2VjdGlvbi4gIFRoZSBic2l6ZSBmaWVsZCBpbiB0aGUKLSAgICAgb3B0aW9uYWwgaGVhZGVyIHJlY29yZHMgaG93IG1hbnkgYnNzIGJ5dGVzIGFyZSByZXF1aXJlZCBiZXlvbmQKLSAgICAgdGhvc2UgaW4gdGhlIGRhdGEgc2VjdGlvbi4gIFRoZSB2YWx1ZSBpcyBub3Qgcm91bmRlZCB0byBhIHBhZ2UKLSAgICAgYm91bmRhcnkuICAqLwotICBpZiAoYnNzX3NpemUgPCBpbnRlcm5hbF9hLmRzaXplIC0gZGF0YV9zaXplKQotICAgIGJzc19zaXplID0gMDsKLSAgZWxzZQotICAgIGJzc19zaXplIC09IGludGVybmFsX2EuZHNpemUgLSBkYXRhX3NpemU7Ci0gIGludGVybmFsX2EuYnNpemUgPSBic3Nfc2l6ZTsKLSAgaW50ZXJuYWxfYS5ic3Nfc3RhcnQgPSBpbnRlcm5hbF9hLmRhdGFfc3RhcnQgKyBpbnRlcm5hbF9hLmRzaXplOwotCi0gIGludGVybmFsX2EuZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotCi0gIGludGVybmFsX2EuZ3BfdmFsdWUgPSBlY29mZl9kYXRhIChhYmZkKS0+Z3A7Ci0KLSAgaW50ZXJuYWxfYS5ncHJtYXNrID0gZWNvZmZfZGF0YSAoYWJmZCktPmdwcm1hc2s7Ci0gIGludGVybmFsX2EuZnBybWFzayA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5mcHJtYXNrOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIGludGVybmFsX2EuY3BybWFza1tpXSA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5jcHJtYXNrW2ldOwotCi0gIC8qIExldCB0aGUgYmFja2VuZCBhZGp1c3QgdGhlIGhlYWRlcnMgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKGJhY2tlbmQtPmFkanVzdF9oZWFkZXJzKQotICAgIHsKLSAgICAgIGlmICghICgqYmFja2VuZC0+YWRqdXN0X2hlYWRlcnMpIChhYmZkLCAmaW50ZXJuYWxfZiwgJmludGVybmFsX2EpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGZpbGUgaGVhZGVyIGFuZCB0aGUgb3B0aW9uYWwgaGVhZGVyLiAgKi8KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgKFBUUikgJmludGVybmFsX2YsIGJ1ZmYpOwotICBpZiAoYmZkX3dyaXRlIChidWZmLCAxLCBmaWxoc3osIGFiZmQpICE9IGZpbGhzeikKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBiZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0IChhYmZkLCAoUFRSKSAmaW50ZXJuYWxfYSwgYnVmZik7Ci0gIGlmIChiZmRfd3JpdGUgKGJ1ZmYsIDEsIGFvdXRzeiwgYWJmZCkgIT0gYW91dHN6KQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIEJ1aWxkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKLSAgICAgd3JpdGluZyBvdXQgdGhlIHJlbG9jcyBzbyB0aGF0IHdlIGtub3cgdGhlIHN5bWJvbCBpbmRpY2VzLiAgV2UKLSAgICAgZG9uJ3QgZG8gdGhpcyBpZiB0aGlzIEJGRCB3YXMgY3JlYXRlZCBieSB0aGUgYmFja2VuZCBsaW5rZXIsCi0gICAgIHNpbmNlIGl0IHdpbGwgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIHN5bWJvbHMgYW5kIHJlbG9jcy4gICovCi0gIGlmICghIGVjb2ZmX2RhdGEgKGFiZmQpLT5saW5rZXIpCi0gICAgewotICAgICAgc3ltaGRyLT5pZXh0TWF4ID0gMDsKLSAgICAgIHN5bWhkci0+aXNzRXh0TWF4ID0gMDsKLSAgICAgIGRlYnVnLT5leHRlcm5hbF9leHQgPSBkZWJ1Zy0+ZXh0ZXJuYWxfZXh0X2VuZCA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+c3NleHQgPSBkZWJ1Zy0+c3NleHRfZW5kID0gTlVMTDsKLSAgICAgIGlmIChiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzIChhYmZkLCBkZWJ1ZywgJmJhY2tlbmQtPmRlYnVnX3N3YXAsCi0JCQkJICAgICAoKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgPT0gMCkKLQkJCQkgICAgICA/IHRydWUgOiBmYWxzZSksCi0JCQkJICAgICBlY29mZl9nZXRfZXh0ciwgZWNvZmZfc2V0X2luZGV4KQotCSAgPT0gZmFsc2UpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgcmVsb2NzLiAgKi8KLSAgICAgIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOwotCSAgIGN1cnJlbnQgIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0JICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0JewotCSAgYXJlbGVudCAqKnJlbG9jX3B0cl9wdHI7Ci0JICBhcmVsZW50ICoqcmVsb2NfZW5kOwotCSAgY2hhciAqb3V0X3B0cjsKLQotCSAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50ID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICByZWxvY19idWZmID0KLQkgICAgYmZkX2FsbG9jIChhYmZkLCBjdXJyZW50LT5yZWxvY19jb3VudCAqIGV4dGVybmFsX3JlbG9jX3NpemUpOwotCSAgaWYgKHJlbG9jX2J1ZmYgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIHJlbG9jX3B0cl9wdHIgPSBjdXJyZW50LT5vcmVsb2NhdGlvbjsKLQkgIHJlbG9jX2VuZCA9IHJlbG9jX3B0cl9wdHIgKyBjdXJyZW50LT5yZWxvY19jb3VudDsKLQkgIG91dF9wdHIgPSAoY2hhciAqKSByZWxvY19idWZmOwotCSAgZm9yICg7Ci0JICAgICAgIHJlbG9jX3B0cl9wdHIgPCByZWxvY19lbmQ7Ci0JICAgICAgIHJlbG9jX3B0cl9wdHIrKywgb3V0X3B0ciArPSBleHRlcm5hbF9yZWxvY19zaXplKQotCSAgICB7Ci0JICAgICAgYXJlbGVudCAqcmVsb2M7Ci0JICAgICAgYXN5bWJvbCAqc3ltOwotCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbjsKLQkgIAotCSAgICAgIG1lbXNldCAoKFBUUikgJmluLCAwLCBzaXplb2YgaW4pOwotCi0JICAgICAgcmVsb2MgPSAqcmVsb2NfcHRyX3B0cjsKLQkgICAgICBzeW0gPSAqcmVsb2MtPnN5bV9wdHJfcHRyOwotCi0JICAgICAgaW4ucl92YWRkciA9IChyZWxvYy0+YWRkcmVzcwotCQkJICAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgY3VycmVudCkpOwotCSAgICAgIGluLnJfdHlwZSA9IHJlbG9jLT5ob3d0by0+dHlwZTsKLQotCSAgICAgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLQkJewotCQkgIGluLnJfc3ltbmR4ID0gZWNvZmZfZ2V0X3N5bV9pbmRleCAoKnJlbG9jLT5zeW1fcHRyX3B0cik7Ci0JCSAgaW4ucl9leHRlcm4gPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgQ09OU1QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKTsKLQkJICBpZiAoc3RyY21wIChuYW1lLCAiLnRleHQiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1RFWFQ7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJkYXRhIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SREFUQTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZGF0YSIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fREFUQTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NEQVRBOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TQlNTOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5ic3MiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaW5pdCIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUODsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUNDsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIueGRhdGEiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1hEQVRBOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5wZGF0YSIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUERBVEE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmZpbmkiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0ZJTkk7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdGEiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVEE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKkFCUyoiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0FCUzsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucmNvbnN0IikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SQ09OU1Q7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCSAgaW4ucl9leHRlcm4gPSAwOwotCQl9Ci0KLQkgICAgICAoKmFkanVzdF9yZWxvY19vdXQpIChhYmZkLCByZWxvYywgJmluKTsKLQotCSAgICAgICgqc3dhcF9yZWxvY19vdXQpIChhYmZkLCAmaW4sIChQVFIpIG91dF9wdHIpOwotCSAgICB9Ci0KLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgY3VycmVudC0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmIChiZmRfd3JpdGUgKHJlbG9jX2J1ZmYsCi0JCQkgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSwgY3VycmVudC0+cmVsb2NfY291bnQsIGFiZmQpCi0JICAgICAgIT0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZSAqIGN1cnJlbnQtPnJlbG9jX2NvdW50KQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19idWZmKTsKLQkgIHJlbG9jX2J1ZmYgPSBOVUxMOwotCX0KLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKLQl7Ci0JICAvKiBXcml0ZSBvdXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0JICBpZiAoYmZkX2Vjb2ZmX3dyaXRlX2RlYnVnIChhYmZkLCBkZWJ1ZywgJmJhY2tlbmQtPmRlYnVnX3N3YXAsCi0JCQkJICAgICBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MpCi0JICAgICAgPT0gZmFsc2UpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIC5ic3Mgc2VjdGlvbiBvZiBhIGRlbWFuZCBwYWdlZCBleGVjdXRhYmxlIG11c3QgcmVjZWl2ZSBhbgotICAgICBlbnRpcmUgcGFnZS4gIElmIHRoZXJlIGFyZSBzeW1ib2xzLCB0aGUgc3ltYm9scyB3aWxsIHN0YXJ0IG9uIHRoZQotICAgICBuZXh0IHBhZ2UuICBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scywgd2UgbXVzdCBmaWxsIG91dCB0aGUgcGFnZSBieQotICAgICBoYW5kLiAgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDAKLSAgICAgICYmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMAotICAgICAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyIGM7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MgLSAxLAotCQkgICAgU0VFS19TRVQpICE9IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoYmZkX3JlYWQgKCZjLCAxLCAxLCBhYmZkKSA9PSAwKQotCWMgPSAwOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyAtIDEsCi0JCSAgICBTRUVLX1NFVCkgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKCZjLCAxLCAxLCBhYmZkKSAhPSAxKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBpZiAocmVsb2NfYnVmZiAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19idWZmKTsKLSAgaWYgKGJ1ZmYgIT0gTlVMTCkKLSAgICBmcmVlIChidWZmKTsKLSAgcmV0dXJuIHRydWU7Ci0gZXJyb3JfcmV0dXJuOgotICBpZiAocmVsb2NfYnVmZiAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19idWZmKTsKLSAgaWYgKGJ1ZmYgIT0gTlVMTCkKLSAgICBmcmVlIChidWZmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogQXJjaGl2ZSBoYW5kbGluZy4gIEVDT0ZGIHVzZXMgd2hhdCBhcHBlYXJzIHRvIGJlIGEgdW5pcXVlIHR5cGUgb2YKLSAgIGFyY2hpdmUgaGVhZGVyIChhcm1hcCkuICBUaGUgYnl0ZSBvcmRlcmluZyBvZiB0aGUgYXJtYXAgYW5kIHRoZQotICAgY29udGVudHMgYXJlIGVuY29kZWQgaW4gdGhlIG5hbWUgb2YgdGhlIGFybWFwIGl0c2VsZi4gIEF0IGxlYXN0IGZvcgotICAgbm93LCB3ZSBvbmx5IHN1cHBvcnQgYXJjaGl2ZXMgd2l0aCB0aGUgc2FtZSBieXRlIG9yZGVyaW5nIGluIHRoZQotICAgYXJtYXAgYW5kIHRoZSBjb250ZW50cy4KLQotICAgVGhlIGZpcnN0IGZvdXIgYnl0ZXMgaW4gdGhlIGFybWFwIGFyZSB0aGUgbnVtYmVyIG9mIHN5bWJvbAotICAgZGVmaW5pdGlvbnMuICBUaGlzIGlzIGFsd2F5cyBhIHBvd2VyIG9mIHR3by4KLQotICAgVGhpcyBpcyBmb2xsb3dlZCBieSB0aGUgc3ltYm9sIGRlZmluaXRpb25zLiAgRWFjaCBzeW1ib2wgZGVmaW5pdGlvbgotICAgb2NjdXBpZXMgOCBieXRlcy4gIFRoZSBmaXJzdCBmb3VyIGJ5dGVzIGFyZSB0aGUgb2Zmc2V0IGZyb20gdGhlCi0gICBzdGFydCBvZiB0aGUgYXJtYXAgc3RyaW5ncyB0byB0aGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBuYW1pbmcKLSAgIHRoaXMgc3ltYm9sLiAgVGhlIHNlY29uZCBmb3VyIGJ5dGVzIGFyZSB0aGUgZmlsZSBvZmZzZXQgdG8gdGhlCi0gICBhcmNoaXZlIG1lbWJlciB3aGljaCBkZWZpbmVzIHRoaXMgc3ltYm9sLiAgSWYgdGhlIHNlY29uZCBmb3VyIGJ5dGVzCi0gICBhcmUgMCwgdGhlbiB0aGlzIGlzIG5vdCBhY3R1YWxseSBhIHN5bWJvbCBkZWZpbml0aW9uLCBhbmQgaXQgc2hvdWxkCi0gICBiZSBpZ25vcmVkLgotCi0gICBUaGUgc3ltYm9scyBhcmUgaGFzaGVkIGludG8gdGhlIGFybWFwIHdpdGggYSBjbG9zZWQgaGFzaGluZyBzY2hlbWUuCi0gICBTZWUgdGhlIGZ1bmN0aW9ucyBiZWxvdyBmb3IgdGhlIGRldGFpbHMgb2YgdGhlIGFsZ29yaXRobS4KLQotICAgQWZ0ZXIgdGhlIHN5bWJvbCBkZWZpbml0aW9ucyBjb21lcyBmb3VyIGJ5dGVzIGhvbGRpbmcgdGhlIHNpemUgb2YKLSAgIHRoZSBzdHJpbmcgdGFibGUsIGZvbGxvd2VkIGJ5IHRoZSBzdHJpbmcgdGFibGUgaXRzZWxmLiAgKi8KLQotLyogVGhlIG5hbWUgb2YgYW4gYXJjaGl2ZSBoZWFkZXJzIGxvb2tzIGxpa2UgdGhpczoKLSAgIF9fX19fX19fX19FW0JMXUVbQkxdXyAod2l0aCBhIHRyYWlsaW5nIHNwYWNlKS4KLSAgIFRoZSB0cmFpbGluZyBzcGFjZSBpcyBjaGFuZ2VkIHRvIGFuIFggaWYgdGhlIGFyY2hpdmUgaXMgY2hhbmdlZCB0bwotICAgaW5kaWNhdGUgdGhhdCB0aGUgYXJtYXAgaXMgb3V0IG9mIGRhdGUuCi0KLSAgIFRoZSBBbHBoYSBzZWVtcyB0byB1c2UgX19fX19fX182NEVbQkxdRVtCTF1fLiAgKi8KLQotI2RlZmluZSBBUk1BUF9CSUdfRU5ESUFOICdCJwotI2RlZmluZSBBUk1BUF9MSVRUTEVfRU5ESUFOICdMJwotI2RlZmluZSBBUk1BUF9NQVJLRVIgJ0UnCi0jZGVmaW5lIEFSTUFQX1NUQVJUX0xFTkdUSCAxMAotI2RlZmluZSBBUk1BUF9IRUFERVJfTUFSS0VSX0lOREVYIDEwCi0jZGVmaW5lIEFSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVggMTEKLSNkZWZpbmUgQVJNQVBfT0JKRUNUX01BUktFUl9JTkRFWCAxMgotI2RlZmluZSBBUk1BUF9PQkpFQ1RfRU5ESUFOX0lOREVYIDEzCi0jZGVmaW5lIEFSTUFQX0VORF9JTkRFWCAxNAotI2RlZmluZSBBUk1BUF9FTkQgIl8gIgotCi0vKiBUaGlzIGlzIGEgbWFnaWMgbnVtYmVyIHVzZWQgaW4gdGhlIGhhc2hpbmcgYWxnb3JpdGhtLiAgKi8KLSNkZWZpbmUgQVJNQVBfSEFTSF9NQUdJQyAweDlkZDY4YWI1Ci0KLS8qIFRoaXMgcmV0dXJucyB0aGUgaGFzaCB2YWx1ZSB0byB1c2UgZm9yIGEgc3RyaW5nLiAgSXQgYWxzbyBzZXRzCi0gICAqUkVIQVNIIHRvIHRoZSByZWhhc2ggYWRqdXN0bWVudCBpZiB0aGUgZmlyc3Qgc2xvdCBpcyB0YWtlbi4gIFNJWkUKLSAgIGlzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSwgYW5kIEhMT0cgaXMgdGhlIGxvZwotICAgYmFzZSAyIG9mIFNJWkUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1lY29mZl9hcm1hcF9oYXNoIChzLCByZWhhc2gsIHNpemUsIGhsb2cpCi0gICAgIENPTlNUIGNoYXIgKnM7Ci0gICAgIHVuc2lnbmVkIGludCAqcmVoYXNoOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgdW5zaWduZWQgaW50IGhsb2c7Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoOwotCi0gIGlmIChobG9nID09IDApCi0gICAgcmV0dXJuIDA7Ci0gIGhhc2ggPSAqcysrOwotICB3aGlsZSAoKnMgIT0gJ1wwJykKLSAgICBoYXNoID0gKChoYXNoID4+IDI3KSB8IChoYXNoIDw8IDUpKSArICpzKys7Ci0gIGhhc2ggKj0gQVJNQVBfSEFTSF9NQUdJQzsKLSAgKnJlaGFzaCA9IChoYXNoICYgKHNpemUgLSAxKSkgfCAxOwotICByZXR1cm4gaGFzaCA+PiAoMzIgLSBobG9nKTsKLX0KLQotLyogUmVhZCBpbiB0aGUgYXJtYXAuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3NsdXJwX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgbmV4dG5hbWVbMTddOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqbWFwZGF0YTsKLSAgYmZkX3NpemVfdHlwZSBwYXJzZWRfc2l6ZTsKLSAgY2hhciAqcmF3X2FybWFwOwotICBzdHJ1Y3QgYXJ0ZGF0YSAqYXJkYXRhOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGNoYXIgKnJhd19wdHI7Ci0gIHN0cnVjdCBzeW1kZWYgKnN5bWRlZl9wdHI7Ci0gIGNoYXIgKnN0cmluZ2Jhc2U7Ci0gIAotICAvKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQuICAqLwotICBpID0gYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCk7Ci0gIGlmIChpID09IDApCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGkgIT0gMTYpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIC0xNiwgU0VFS19DVVIpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElyaXggNC4wLjVGIGFwcGFyZW50bHkgY2FuIHVzZSBlaXRoZXIgYW4gRUNPRkYgYXJtYXAgb3IgYQotICAgICBzdGFuZGFyZCBDT0ZGIGFybWFwLiAgV2UgY291bGQgbW92ZSB0aGUgRUNPRkYgYXJtYXAgc3R1ZmYgaW50bwotICAgICBiZmRfc2x1cnBfYXJtYXAsIGJ1dCB0aGF0IHNlZW1zIGluYXBwcm9wcmlhdGUgc2luY2Ugbm8gb3RoZXIKLSAgICAgdGFyZ2V0IHVzZXMgdGhpcyBmb3JtYXQuICBJbnN0ZWFkLCB3ZSBjaGVjayBkaXJlY3RseSBmb3IgYSBDT0ZGCi0gICAgIGFybWFwLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSA9PSAwKQotICAgIHJldHVybiBiZmRfc2x1cnBfYXJtYXAgKGFiZmQpOwotCi0gIC8qIFNlZSBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBhbiBhcm1hcC4gICovCi0gIGlmIChzdHJuY21wIChuZXh0bmFtZSwgZWNvZmZfYmFja2VuZCAoYWJmZCktPmFybWFwX3N0YXJ0LAotCSAgICAgICBBUk1BUF9TVEFSVF9MRU5HVEgpICE9IDAKLSAgICAgIHx8IG5leHRuYW1lW0FSTUFQX0hFQURFUl9NQVJLRVJfSU5ERVhdICE9IEFSTUFQX01BUktFUgotICAgICAgfHwgKG5leHRuYW1lW0FSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVhdICE9IEFSTUFQX0JJR19FTkRJQU4KLQkgICYmIG5leHRuYW1lW0FSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVhdICE9IEFSTUFQX0xJVFRMRV9FTkRJQU4pCi0gICAgICB8fCBuZXh0bmFtZVtBUk1BUF9PQkpFQ1RfTUFSS0VSX0lOREVYXSAhPSBBUk1BUF9NQVJLRVIKLSAgICAgIHx8IChuZXh0bmFtZVtBUk1BUF9PQkpFQ1RfRU5ESUFOX0lOREVYXSAhPSBBUk1BUF9CSUdfRU5ESUFOCi0JICAmJiBuZXh0bmFtZVtBUk1BUF9PQkpFQ1RfRU5ESUFOX0lOREVYXSAhPSBBUk1BUF9MSVRUTEVfRU5ESUFOKQotICAgICAgfHwgc3RybmNtcCAobmV4dG5hbWUgKyBBUk1BUF9FTkRfSU5ERVgsCi0JCSAgQVJNQVBfRU5ELCBzaXplb2YgQVJNQVBfRU5EIC0gMSkgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgcmlnaHQgYnl0ZSBvcmRlcmluZy4gICovCi0gIGlmICgoKG5leHRuYW1lW0FSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVhdID09IEFSTUFQX0JJR19FTkRJQU4pCi0gICAgICAgXiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkpCi0gICAgICB8fCAoKG5leHRuYW1lW0FSTUFQX09CSkVDVF9FTkRJQU5fSU5ERVhdID09IEFSTUFQX0JJR19FTkRJQU4pCi0JICBeIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogUmVhZCBpbiB0aGUgYXJtYXAuICAqLwotICBhcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKLSAgbWFwZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIF9iZmRfcmVhZF9hcl9oZHIgKGFiZmQpOwotICBpZiAobWFwZGF0YSA9PSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcGFyc2VkX3NpemUgPSBtYXBkYXRhLT5wYXJzZWRfc2l6ZTsKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIG1hcGRhdGEpOwotICAgIAotICByYXdfYXJtYXAgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHBhcnNlZF9zaXplKTsKLSAgaWYgKHJhd19hcm1hcCA9PSAoY2hhciAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSByYXdfYXJtYXAsIDEsIHBhcnNlZF9zaXplLCBhYmZkKSAhPSBwYXJzZWRfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSByYXdfYXJtYXApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgYXJkYXRhLT50ZGF0YSA9IChQVFIpIHJhd19hcm1hcDsKLQotICBjb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLQotICBhcmRhdGEtPnN5bWRlZl9jb3VudCA9IDA7Ci0gIGFyZGF0YS0+Y2FjaGUgPSAoc3RydWN0IGFyX2NhY2hlICopIE5VTEw7Ci0KLSAgLyogVGhpcyBjb2RlIHVzZWQgdG8gb3ZlcmxheSB0aGUgc3ltZGVmcyBvdmVyIHRoZSByYXcgYXJjaGl2ZSBkYXRhLAotICAgICBidXQgdGhhdCBkb2Vzbid0IHdvcmsgb24gYSA2NCBiaXQgaG9zdC4gICovCi0KLSAgc3RyaW5nYmFzZSA9IHJhd19hcm1hcCArIGNvdW50ICogOCArIDg7Ci0KLSNpZmRlZiBDSEVDS19BUk1BUF9IQVNICi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgaGxvZzsKLQotICAgIC8qIERvdWJsZSBjaGVjayB0aGF0IEkgaGF2ZSB0aGUgaGFzaGluZyBhbGdvcml0aG0gcmlnaHQgYnkgbWFraW5nCi0gICAgICAgc3VyZSB0aGF0IGV2ZXJ5IHN5bWJvbCBjYW4gYmUgbG9va2VkIHVwIHN1Y2Nlc3NmdWxseS4gICovCi0gICAgaGxvZyA9IDA7Ci0gICAgZm9yIChpID0gMTsgaSA8IGNvdW50OyBpIDw8PSAxKQotICAgICAgaGxvZysrOwotICAgIEJGRF9BU1NFUlQgKGkgPT0gY291bnQpOwotCi0gICAgcmF3X3B0ciA9IHJhd19hcm1hcCArIDQ7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHJhd19wdHIgKz0gOCkKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgbmFtZV9vZmZzZXQsIGZpbGVfb2Zmc2V0OwotCXVuc2lnbmVkIGludCBoYXNoLCByZWhhc2gsIHNyY2g7Ci0gICAgICAKLQluYW1lX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgcmF3X3B0cik7Ci0JZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChyYXdfcHRyICsgNCkpOwotCWlmIChmaWxlX29mZnNldCA9PSAwKQotCSAgY29udGludWU7Ci0JaGFzaCA9IGVjb2ZmX2FybWFwX2hhc2ggKHN0cmluZ2Jhc2UgKyBuYW1lX29mZnNldCwgJnJlaGFzaCwgY291bnQsCi0JCQkJIGhsb2cpOwotCWlmIChoYXNoID09IGkpCi0JICBjb250aW51ZTsKLQotCS8qIFNlZSBpZiB3ZSBjYW4gcmVoYXNoIHRvIHRoaXMgbG9jYXRpb24uICAqLwotCWZvciAoc3JjaCA9IChoYXNoICsgcmVoYXNoKSAmIChjb3VudCAtIDEpOwotCSAgICAgc3JjaCAhPSBoYXNoICYmIHNyY2ggIT0gaTsKLQkgICAgIHNyY2ggPSAoc3JjaCArIHJlaGFzaCkgJiAoY291bnQgLSAxKSkKLQkgIEJGRF9BU1NFUlQgKGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgKHJhd19hcm1hcCArIDggKyBzcmNoICogOCkpCi0JCSAgICAgICE9IDApOwotCUJGRF9BU1NFUlQgKHNyY2ggPT0gaSk7Ci0gICAgICB9Ci0gIH0KLQotI2VuZGlmIC8qIENIRUNLX0FSTUFQX0hBU0ggKi8KLQotICByYXdfcHRyID0gcmF3X2FybWFwICsgNDsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHJhd19wdHIgKz0gOCkKLSAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAocmF3X3B0ciArIDQpKSAhPSAwKQotICAgICAgKythcmRhdGEtPnN5bWRlZl9jb3VudDsKLQotICBzeW1kZWZfcHRyID0gKChzdHJ1Y3Qgc3ltZGVmICopCi0JCWJmZF9hbGxvYyAoYWJmZCwKLQkJCSAgIGFyZGF0YS0+c3ltZGVmX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc3ltZGVmKSkpOwotICBpZiAoIXN5bWRlZl9wdHIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFyZGF0YS0+c3ltZGVmcyA9IChjYXJzeW0gKikgc3ltZGVmX3B0cjsKLQotICByYXdfcHRyID0gcmF3X2FybWFwICsgNDsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHJhd19wdHIgKz0gOCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbmFtZV9vZmZzZXQsIGZpbGVfb2Zmc2V0OwotCi0gICAgICBmaWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgKHJhd19wdHIgKyA0KSk7Ci0gICAgICBpZiAoZmlsZV9vZmZzZXQgPT0gMCkKLQljb250aW51ZTsKLSAgICAgIG5hbWVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSByYXdfcHRyKTsKLSAgICAgIHN5bWRlZl9wdHItPnMubmFtZSA9IHN0cmluZ2Jhc2UgKyBuYW1lX29mZnNldDsKLSAgICAgIHN5bWRlZl9wdHItPmZpbGVfb2Zmc2V0ID0gZmlsZV9vZmZzZXQ7Ci0gICAgICArK3N5bWRlZl9wdHI7Ci0gICAgfQotCi0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpOwotICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeS4gICovCi0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zICs9IGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zICUgMjsKLQotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gYXJtYXAuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3dyaXRlX2FybWFwIChhYmZkLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOwotICAgICBzdHJ1Y3Qgb3JsICptYXA7Ci0gICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQ7Ci0gICAgIGludCBzdHJpZHg7Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoc2l6ZSwgaGFzaGxvZzsKLSAgdW5zaWduZWQgaW50IHN5bWRlZnNpemU7Ci0gIGludCBwYWRpdDsKLSAgdW5zaWduZWQgaW50IHN0cmluZ3NpemU7Ci0gIHVuc2lnbmVkIGludCBtYXBzaXplOwotICBmaWxlX3B0ciBmaXJzdHJlYWw7Ci0gIHN0cnVjdCBhcl9oZHIgaGRyOwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgYmZkX2J5dGUgdGVtcFs0XTsKLSAgYmZkX2J5dGUgKmhhc2h0YWJsZTsKLSAgYmZkICpjdXJyZW50OwotICBiZmQgKmxhc3RfZWx0OwotCi0gIC8qIFVsdHJpeCBhcHBlYXJzIHRvIHVzZSBhcyBhIGhhc2ggdGFibGUgc2l6ZSB0aGUgbGVhc3QgcG93ZXIgb2YgdHdvCi0gICAgIGdyZWF0ZXIgdGhhbiB0d2ljZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMuICAqLwotICBmb3IgKGhhc2hsb2cgPSAwOyAoKHVuc2lnbmVkIGludCkgMSA8PCBoYXNobG9nKSA8PSAyICogb3JsX2NvdW50OyBoYXNobG9nKyspCi0gICAgOwotICBoYXNoc2l6ZSA9IDEgPDwgaGFzaGxvZzsKLQotICBzeW1kZWZzaXplID0gaGFzaHNpemUgKiA4OwotICBwYWRpdCA9IHN0cmlkeCAlIDI7Ci0gIHN0cmluZ3NpemUgPSBzdHJpZHggKyBwYWRpdDsKLQotICAvKiBJbmNsdWRlIDggYnl0ZXMgdG8gc3RvcmUgc3ltZGVmc2l6ZSBhbmQgc3RyaW5nc2l6ZSBpbiBvdXRwdXQuICovCi0gIG1hcHNpemUgPSBzeW1kZWZzaXplICsgc3RyaW5nc2l6ZSArIDg7Ci0KLSAgZmlyc3RyZWFsID0gU0FSTUFHICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArIG1hcHNpemUgKyBlbGVuZ3RoOwotCi0gIG1lbXNldCAoKFBUUikgJmhkciwgMCwgc2l6ZW9mIGhkcik7Ci0KLSAgLyogV29yayBvdXQgdGhlIEVDT0ZGIGFybWFwIG5hbWUuICAqLwotICBzdHJjcHkgKGhkci5hcl9uYW1lLCBlY29mZl9iYWNrZW5kIChhYmZkKS0+YXJtYXBfc3RhcnQpOwotICBoZHIuYXJfbmFtZVtBUk1BUF9IRUFERVJfTUFSS0VSX0lOREVYXSA9IEFSTUFQX01BUktFUjsKLSAgaGRyLmFyX25hbWVbQVJNQVBfSEVBREVSX0VORElBTl9JTkRFWF0gPQotICAgIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpCi0gICAgID8gQVJNQVBfQklHX0VORElBTgotICAgICA6IEFSTUFQX0xJVFRMRV9FTkRJQU4pOwotICBoZHIuYXJfbmFtZVtBUk1BUF9PQkpFQ1RfTUFSS0VSX0lOREVYXSA9IEFSTUFQX01BUktFUjsKLSAgaGRyLmFyX25hbWVbQVJNQVBfT0JKRUNUX0VORElBTl9JTkRFWF0gPQotICAgIGJmZF9iaWdfZW5kaWFuIChhYmZkKSA/IEFSTUFQX0JJR19FTkRJQU4gOiBBUk1BUF9MSVRUTEVfRU5ESUFOOwotICBtZW1jcHkgKGhkci5hcl9uYW1lICsgQVJNQVBfRU5EX0lOREVYLCBBUk1BUF9FTkQsIHNpemVvZiBBUk1BUF9FTkQgLSAxKTsKLQotICAvKiBXcml0ZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBhcmNoaXZlIGhlYWRlciB0byBiZSBqdXN0IGEgbGl0dGxlIGJpdAotICAgICBsYXRlciB0aGFuIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGZpbGUsIG90aGVyd2lzZSB0aGUgbGlua2VyIHdpbGwKLSAgICAgY29tcGxhaW4gdGhhdCB0aGUgaW5kZXggaXMgb3V0IG9mIGRhdGUuICBBY3R1YWxseSwgdGhlIFVsdHJpeAotICAgICBsaW5rZXIganVzdCBjaGVja3MgdGhlIGFyY2hpdmUgbmFtZTsgdGhlIEdOVSBsaW5rZXIgbWF5IGNoZWNrIHRoZQotICAgICBkYXRlLiAgKi8KLSAgc3RhdCAoYWJmZC0+ZmlsZW5hbWUsICZzdGF0YnVmKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2RhdGUsICIlbGQiLCAobG9uZykgKHN0YXRidWYuc3RfbXRpbWUgKyA2MCkpOwotCi0gIC8qIFRoZSBERUNzdGF0aW9uIHVzZXMgemVyb2VzIGZvciB0aGUgdWlkLCBnaWQgYW5kIG1vZGUgb2YgdGhlCi0gICAgIGFybWFwLiAgKi8KLSAgaGRyLmFyX3VpZFswXSA9ICcwJzsKLSAgaGRyLmFyX2dpZFswXSA9ICcwJzsKLSNpZiAwCi0gIGhkci5hcl9tb2RlWzBdID0gJzAnOwotI2Vsc2UKLSAgLyogQnVpbGRpbmcgZ2NjIGVuZHMgdXAgZXh0cmFjdGluZyB0aGUgYXJtYXAgYXMgYSBmaWxlIC0gdHdpY2UuICovCi0gIGhkci5hcl9tb2RlWzBdID0gJzYnOwotICBoZHIuYXJfbW9kZVsxXSA9ICc0JzsKLSAgaGRyLmFyX21vZGVbMl0gPSAnNCc7Ci0jZW5kaWYKLQotICBzcHJpbnRmIChoZHIuYXJfc2l6ZSwgIiUtMTBkIiwgKGludCkgbWFwc2l6ZSk7Ci0KLSAgaGRyLmFyX2ZtYWdbMF0gPSAnYCc7Ci0gIGhkci5hcl9mbWFnWzFdID0gJ1wwMTInOwotCi0gIC8qIFR1cm4gYWxsIG51bGwgYnl0ZXMgaW4gdGhlIGhlYWRlciBpbnRvIHNwYWNlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOyBpKyspCi0gICBpZiAoKChjaGFyICopKCZoZHIpKVtpXSA9PSAnXDAnKQotICAgICAoKChjaGFyICopKCZoZHIpKVtpXSkgPSAnICc7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGhhc2hzaXplLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgdGVtcCwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICBoYXNodGFibGUgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc3ltZGVmc2l6ZSk7Ci0gIGlmICghaGFzaHRhYmxlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjdXJyZW50ID0gYWJmZC0+YXJjaGl2ZV9oZWFkOwotICBsYXN0X2VsdCA9IGN1cnJlbnQ7Ci0gIGZvciAoaSA9IDA7IGkgPCBvcmxfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaGFzaCwgcmVoYXNoOwotCi0gICAgICAvKiBBZHZhbmNlIGZpcnN0cmVhbCB0byB0aGUgZmlsZSBwb3NpdGlvbiBvZiB0aGlzIGFyY2hpdmUKLQkgZWxlbWVudC4gICovCi0gICAgICBpZiAoKChiZmQgKikgbWFwW2ldLnBvcykgIT0gbGFzdF9lbHQpCi0JewotCSAgZG8KLQkgICAgewotCSAgICAgIGZpcnN0cmVhbCArPSBhcmVsdF9zaXplIChjdXJyZW50KSArIHNpemVvZiAoc3RydWN0IGFyX2hkcik7Ci0JICAgICAgZmlyc3RyZWFsICs9IGZpcnN0cmVhbCAlIDI7Ci0JICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7Ci0JICAgIH0KLQkgIHdoaWxlIChjdXJyZW50ICE9IChiZmQgKikgbWFwW2ldLnBvcyk7Ci0JfQotCi0gICAgICBsYXN0X2VsdCA9IGN1cnJlbnQ7Ci0KLSAgICAgIGhhc2ggPSBlY29mZl9hcm1hcF9oYXNoICgqbWFwW2ldLm5hbWUsICZyZWhhc2gsIGhhc2hzaXplLCBoYXNobG9nKTsKLSAgICAgIGlmIChiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChoYXNodGFibGUgKyAoaGFzaCAqIDgpICsgNCkpICE9IDApCi0JewotCSAgdW5zaWduZWQgaW50IHNyY2g7Ci0KLQkgIC8qIFRoZSBkZXNpcmVkIHNsb3QgaXMgYWxyZWFkeSB0YWtlbi4gICovCi0JICBmb3IgKHNyY2ggPSAoaGFzaCArIHJlaGFzaCkgJiAoaGFzaHNpemUgLSAxKTsKLQkgICAgICAgc3JjaCAhPSBoYXNoOwotCSAgICAgICBzcmNoID0gKHNyY2ggKyByZWhhc2gpICYgKGhhc2hzaXplIC0gMSkpCi0JICAgIGlmIChiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChoYXNodGFibGUgKyAoc3JjaCAqIDgpICsgNCkpID09IDApCi0JICAgICAgYnJlYWs7Ci0KLQkgIEJGRF9BU1NFUlQgKHNyY2ggIT0gaGFzaCk7Ci0KLQkgIGhhc2ggPSBzcmNoOwotCX0KLQkKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIG1hcFtpXS5uYW1pZHgsCi0JCSAgICAoUFRSKSAoaGFzaHRhYmxlICsgaGFzaCAqIDgpKTsKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGZpcnN0cmVhbCwKLQkJICAgIChQVFIpIChoYXNodGFibGUgKyBoYXNoICogOCArIDQpKTsKLSAgICB9Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgaGFzaHRhYmxlLCAxLCBzeW1kZWZzaXplLCBhYmZkKSAhPSBzeW1kZWZzaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfcmVsZWFzZSAoYWJmZCwgaGFzaHRhYmxlKTsKLQotICAvKiBOb3cgd3JpdGUgdGhlIHN0cmluZ3MuICAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzdHJpbmdzaXplLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgdGVtcCwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoaSA9IDA7IGkgPCBvcmxfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGxlbjsKLQotICAgICAgbGVuID0gc3RybGVuICgqbWFwW2ldLm5hbWUpICsgMTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICgqbWFwW2ldLm5hbWUpLCAxLCBsZW4sIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBzcGVjIHNleiB0aGlzIHNob3VsZCBiZSBhIG5ld2xpbmUuICBCdXQgaW4gb3JkZXIgdG8gYmUKLSAgICAgYnVnLWNvbXBhdGlibGUgZm9yIERFQ3N0YXRpb24gYXIgd2UgdXNlIGEgbnVsbC4gICovCi0gIGlmIChwYWRpdCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgiIiwgMSwgMSwgYWJmZCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZWUgd2hldGhlciB0aGlzIEJGRCBpcyBhbiBhcmNoaXZlLiAgSWYgaXQgaXMsIHJlYWQgaW4gdGhlIGFybWFwCi0gICBhbmQgdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUuICAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLV9iZmRfZWNvZmZfYXJjaGl2ZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcnRkYXRhICp0ZGF0YV9ob2xkOwotICBjaGFyIGFybWFnW1NBUk1BRyArIDFdOwotCi0gIHRkYXRhX2hvbGQgPSBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGE7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBhcm1hZywgMSwgU0FSTUFHLCBhYmZkKSAhPSBTQVJNQUcpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci0gICAgfQotCi0gIGlmIChzdHJuY21wIChhcm1hZywgQVJNQUcsIFNBUk1BRykgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBXZSBhcmUgc2V0dGluZyBiZmRfYXJkYXRhKGFiZmQpIGhlcmUsIGJ1dCBzaW5jZSBiZmRfYXJkYXRhCi0gICAgIGludm9sdmVzIGEgY2FzdCwgd2UgY2FuJ3QgZG8gaXQgYXMgdGhlIGxlZnQgb3BlcmFuZCBvZgotICAgICBhc3NpZ25tZW50LiAgKi8KLSAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0KLSAgICAoc3RydWN0IGFydGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJ0ZGF0YSkpOwotCi0gIGlmIChiZmRfYXJkYXRhIChhYmZkKSA9PSAoc3RydWN0IGFydGRhdGEgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSB0ZGF0YV9ob2xkOwotICAgICAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci0gICAgfQotCi0gIGJmZF9hcmRhdGEgKGFiZmQpLT5maXJzdF9maWxlX2ZpbGVwb3MgPSBTQVJNQUc7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5jYWNoZSA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5hcmNoaXZlX2hlYWQgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcyA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9IE5VTEw7Ci0gIAotICBpZiAoX2JmZF9lY29mZl9zbHVycF9hcm1hcCAoYWJmZCkgPT0gZmFsc2UKLSAgICAgIHx8IF9iZmRfZWNvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGJmZF9hcmRhdGEgKGFiZmQpKTsKLSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9IHRkYXRhX2hvbGQ7Ci0gICAgICByZXR1cm4gKGNvbnN0IGJmZF90YXJnZXQgKikgTlVMTDsKLSAgICB9Ci0gIAotICBpZiAoYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIGJmZCAqZmlyc3Q7Ci0KLSAgICAgIC8qIFRoaXMgYXJjaGl2ZSBoYXMgYSBtYXAsIHNvIHdlIG1heSBwcmVzdW1lIHRoYXQgdGhlIGNvbnRlbnRzCi0JIGFyZSBvYmplY3QgZmlsZXMuICBNYWtlIHN1cmUgdGhhdCBpZiB0aGUgZmlyc3QgZmlsZSBpbiB0aGUKLQkgYXJjaGl2ZSBjYW4gYmUgcmVjb2duaXplZCBhcyBhbiBvYmplY3QgZmlsZSwgaXQgaXMgZm9yIHRoaXMKLQkgdGFyZ2V0LiAgSWYgbm90LCBhc3N1bWUgdGhhdCB0aGlzIGlzIHRoZSB3cm9uZyBmb3JtYXQuICBJZgotCSB0aGUgZmlyc3QgZmlsZSBpcyBub3QgYW4gb2JqZWN0IGZpbGUsIHNvbWVib2R5IGlzIGRvaW5nCi0JIHNvbWV0aGluZyB3ZWlyZCwgYW5kIHdlIHBlcm1pdCBpdCBzbyB0aGF0IGFyIC10IHdpbGwgd29yay4gICovCi0KLSAgICAgIGZpcnN0ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYWJmZCwgKGJmZCAqKSBOVUxMKTsKLSAgICAgIGlmIChmaXJzdCAhPSBOVUxMKQotCXsKLQkgIGJvb2xlYW4gZmFpbDsKLQotCSAgZmlyc3QtPnRhcmdldF9kZWZhdWx0ZWQgPSBmYWxzZTsKLQkgIGZhaWwgPSBmYWxzZTsKLQkgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmaXJzdCwgYmZkX29iamVjdCkKLQkgICAgICAmJiBmaXJzdC0+eHZlYyAhPSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoZmlyc3QpOwotCSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7Ci0JICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gdGRhdGFfaG9sZDsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCi0JICAvKiBXZSBvdWdodCB0byBjbG9zZSBmaXJzdCBoZXJlLCBidXQgd2UgY2FuJ3QsIGJlY2F1c2Ugd2UKLSAgICAgICAgICAgICBoYXZlIG5vIHdheSB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJjaGl2ZSBjYWNoZS4gIEZJWE1FLiAgKi8KLQl9Ci0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotDAotLyogRUNPRkYgbGlua2VyIGNvZGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplY29mZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5LAotCSAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGUsCi0JICAgY29uc3QgY2hhciAqc3RyaW5nKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICpwbmVlZGVkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBQVFIsIGNoYXIgKikpOwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBFQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVjb2ZmX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5pbmR4ID0gLTE7Ci0gICAgICByZXQtPmFiZmQgPSBOVUxMOwotICAgICAgcmV0LT53cml0dGVuID0gMDsKLSAgICAgIHJldC0+c21hbGwgPSAwOwotICAgIH0KLSAgbWVtc2V0ICgoUFRSKSAmcmV0LT5lc3ltLCAwLCBzaXplb2YgcmV0LT5lc3ltKTsKLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhbiBFQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1fYmZkX2Vjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKCEgX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICBlY29mZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0gIHJldHVybiAmcmV0LT5yb290OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIEVDT0ZGIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgZWNvZmZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhbiBFQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIEVDT0ZGIGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKLSAgIGp1c3QgYSBjYXN0LiAgKi8KLQotI2RlZmluZSBlY29mZl9oYXNoX3RhYmxlKHApICgoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogR2l2ZW4gYW4gRUNPRkYgQkZELCBhZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgYXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX29iamVjdDoKLSAgICAgIHJldHVybiBlY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbyk7Ci0gICAgY2FzZSBiZmRfYXJjaGl2ZToKLSAgICAgIHJldHVybiBlY29mZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8pOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIEFkZCB0aGUgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmUgZmlsZSB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuCi0gICBUaGlzIGxvb2tzIHRocm91Z2ggdGhlIHVuZGVmaW5lZCBzeW1ib2xzLCBsb29rcyBlYWNoIG9uZSB1cCBpbiB0aGUKLSAgIGFyY2hpdmUgaGFzaCB0YWJsZSwgYW5kIGFkZHMgYW55IGFzc29jaWF0ZWQgb2JqZWN0IGZpbGUuICBXZSBkbyBub3QKLSAgIHVzZSBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIGJlY2F1c2UgRUNPRkYgYXJjaGl2ZXMKLSAgIGFscmVhZHkgaGF2ZSBhIGhhc2ggdGFibGUsIHNvIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBjb25zdHJ1Y3QKLSAgIGFub3RoZXIgb25lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgY29uc3QgYmZkX2J5dGUgKnJhd19hcm1hcDsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipwdW5kZWY7Ci0gIHVuc2lnbmVkIGludCBhcm1hcF9jb3VudDsKLSAgdW5zaWduZWQgaW50IGFybWFwX2xvZzsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGNvbnN0IGJmZF9ieXRlICpoYXNodGFibGU7Ci0gIGNvbnN0IGNoYXIgKnN0cmluZ2Jhc2U7Ci0KLSAgaWYgKCEgYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIEFuIGVtcHR5IGFyY2hpdmUgaXMgYSBzcGVjaWFsIGNhc2UuICAqLwotICAgICAgaWYgKGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCkgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19hcm1hcCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIHdlIGRvbid0IGhhdmUgYW55IHJhdyBkYXRhIGZvciB0aGlzIGFyY2hpdmUsIGFzIGNhbiBoYXBwZW4gb24KLSAgICAgSXJpeCA0LjAuNUYsIHdlIGNhbGwgdGhlIGdlbmVyaWMgcm91dGluZS4KLSAgICAgRklYTUU6IFdlIHNob3VsZCBiZSBtb3JlIGNsZXZlciBhYm91dCB0aGlzLCBzaW5jZSBzb21lZGF5IHRkYXRhCi0gICAgIG1heSBnZXQgdG8gc29tZXRoaW5nIGZvciBhIGdlbmVyaWMgYXJjaGl2ZS4gICovCi0gIHJhd19hcm1hcCA9IChjb25zdCBiZmRfYnl0ZSAqKSBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGE7Ci0gIGlmIChyYXdfYXJtYXAgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0gICAgcmV0dXJuIChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0JICAgIChhYmZkLCBpbmZvLCBlY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCkpOwotCi0gIGFybWFwX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYXdfYXJtYXApOwotCi0gIGFybWFwX2xvZyA9IDA7Ci0gIGZvciAoaSA9IDE7IGkgPCBhcm1hcF9jb3VudDsgaSA8PD0gMSkKLSAgICBhcm1hcF9sb2crKzsKLSAgQkZEX0FTU0VSVCAoaSA9PSBhcm1hcF9jb3VudCk7Ci0KLSAgaGFzaHRhYmxlID0gcmF3X2FybWFwICsgNDsKLSAgc3RyaW5nYmFzZSA9IChjb25zdCBjaGFyICopIHJhd19hcm1hcCArIGFybWFwX2NvdW50ICogOCArIDg7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBsaXN0IG9mIHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KLSAgcHVuZGVmID0gJmluZm8tPmhhc2gtPnVuZGVmczsKLSAgd2hpbGUgKCpwdW5kZWYgIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBpbnQgaGFzaCwgcmVoYXNoOwotICAgICAgdW5zaWduZWQgaW50IGZpbGVfb2Zmc2V0OwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJmZCAqZWxlbWVudDsKLQotICAgICAgaCA9ICpwdW5kZWY7Ci0KLSAgICAgIC8qIFdoZW4gYSBzeW1ib2wgaXMgZGVmaW5lZCwgaXQgaXMgbm90IG5lY2Vzc2FyaWx5IHJlbW92ZWQgZnJvbQotCSB0aGUgbGlzdC4gICovCi0gICAgICBpZiAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQl7Ci0JICAvKiBSZW1vdmUgdGhpcyBlbnRyeSBmcm9tIHRoZSBsaXN0LCBmb3IgZ2VuZXJhbCBjbGVhbmxpbmVzcwotCSAgICAgYW5kIGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIGxvb2sgdGhyb3VnaCB0aGUgbGlzdCBhZ2FpbgotCSAgICAgaWYgd2Ugc2VhcmNoIGFueSBtb3JlIGxpYnJhcmllcy4gIFdlIGNhbid0IHJlbW92ZSB0aGUKLQkgICAgIGVudHJ5IGlmIGl0IGlzIHRoZSB0YWlsLCBiZWNhdXNlIHRoYXQgd291bGQgbG9zZSBhbnkKLQkgICAgIGVudHJpZXMgd2UgYWRkIHRvIHRoZSBsaXN0IGxhdGVyIG9uLiAgKi8KLQkgIGlmICgqcHVuZGVmICE9IGluZm8tPmhhc2gtPnVuZGVmc190YWlsKQotCSAgICAqcHVuZGVmID0gKCpwdW5kZWYpLT5uZXh0OwotCSAgZWxzZQotCSAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBOYXRpdmUgRUNPRkYgbGlua2VycyBkbyBub3QgcHVsbCBpbiBhcmNoaXZlIGVsZW1lbnRzIG1lcmVseQotCSB0byBzYXRpc2Z5IGNvbW1vbiBkZWZpbml0aW9ucywgc28gbmVpdGhlciBkbyB3ZS4gIFdlIGxlYXZlCi0JIHRoZW0gb24gdGhlIGxpc3QsIHRob3VnaCwgaW4gY2FzZSB3ZSBhcmUgbGlua2luZyBhZ2FpbnN0IHNvbWUKLQkgb3RoZXIgb2JqZWN0IGZvcm1hdC4gICovCi0gICAgICBpZiAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQl7Ci0JICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBMb29rIGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGhhc2ggPSBlY29mZl9hcm1hcF9oYXNoIChoLT5yb290LnN0cmluZywgJnJlaGFzaCwgYXJtYXBfY291bnQsCi0JCQkgICAgICAgYXJtYXBfbG9nKTsKLQotICAgICAgZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhhc2h0YWJsZSArIChoYXNoICogOCkgKyA0KTsKLSAgICAgIGlmIChmaWxlX29mZnNldCA9PSAwKQotCXsKLQkgIC8qIE5vdGhpbmcgaW4gdGhpcyBzbG90LiAgKi8KLQkgIHB1bmRlZiA9ICYoKnB1bmRlZiktPm5leHQ7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIG5hbWUgPSBzdHJpbmdiYXNlICsgYmZkX2hfZ2V0XzMyIChhYmZkLCBoYXNodGFibGUgKyAoaGFzaCAqIDgpKTsKLSAgICAgIGlmIChuYW1lWzBdICE9IGgtPnJvb3Quc3RyaW5nWzBdCi0JICB8fCBzdHJjbXAgKG5hbWUsIGgtPnJvb3Quc3RyaW5nKSAhPSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBzcmNoOwotCSAgYm9vbGVhbiBmb3VuZDsKLQotCSAgLyogVGhhdCB3YXMgdGhlIHdyb25nIHN5bWJvbC4gIFRyeSByZWhhc2hpbmcuICAqLwotCSAgZm91bmQgPSBmYWxzZTsKLQkgIGZvciAoc3JjaCA9IChoYXNoICsgcmVoYXNoKSAmIChhcm1hcF9jb3VudCAtIDEpOwotCSAgICAgICBzcmNoICE9IGhhc2g7Ci0JICAgICAgIHNyY2ggPSAoc3JjaCArIHJlaGFzaCkgJiAoYXJtYXBfY291bnQgLSAxKSkKLQkgICAgewotCSAgICAgIGZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoYXNodGFibGUgKyAoc3JjaCAqIDgpICsgNCk7Ci0JICAgICAgaWYgKGZpbGVfb2Zmc2V0ID09IDApCi0JCWJyZWFrOwotCSAgICAgIG5hbWUgPSBzdHJpbmdiYXNlICsgYmZkX2hfZ2V0XzMyIChhYmZkLCBoYXNodGFibGUgKyAoc3JjaCAqIDgpKTsKLQkgICAgICBpZiAobmFtZVswXSA9PSBoLT5yb290LnN0cmluZ1swXQotCQkgICYmIHN0cmNtcCAobmFtZSwgaC0+cm9vdC5zdHJpbmcpID09IDApCi0JCXsKLQkJICBmb3VuZCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoISBmb3VuZCkKLQkgICAgewotCSAgICAgIHB1bmRlZiA9ICYoKnB1bmRlZiktPm5leHQ7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgaGFzaCA9IHNyY2g7Ci0JfQotCi0gICAgICBlbGVtZW50ID0gKCpiYWNrZW5kLT5nZXRfZWx0X2F0X2ZpbGVwb3MpIChhYmZkLCBmaWxlX29mZnNldCk7Ci0gICAgICBpZiAoZWxlbWVudCA9PSAoYmZkICopIE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChlbGVtZW50LCBiZmRfb2JqZWN0KSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFVubGlrZSB0aGUgZ2VuZXJpYyBsaW5rZXIsIHdlIGtub3cgdGhhdCB0aGlzIGVsZW1lbnQgcHJvdmlkZXMKLQkgYSBkZWZpbml0aW9uIGZvciBhbiB1bmRlZmluZWQgc3ltYm9sIGFuZCB3ZSBrbm93IHRoYXQgd2Ugd2FudAotCSB0byBpbmNsdWRlIGl0LiAgV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBhbnl0aGluZy4gICovCi0gICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGVsZW1lbnQsIG5hbWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGVjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChlbGVtZW50LCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHB1bmRlZiA9ICYoKnB1bmRlZiktPm5leHQ7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBpZiB3ZSB1c2VkIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLSAgIGJlY2F1c2Ugd2Ugd2VyZSBub3QgZGVhbGluZyB3aXRoIGFuIEVDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBiYWNrZW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCk7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9leHRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEVYVFIgKikpCi0gICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLnN3YXBfZXh0X2luOwotICBIRFJSICpzeW1oZHI7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIFBUUiBleHRlcm5hbF9leHQgPSBOVUxMOwotICBzaXplX3QgZXNpemU7Ci0gIGNoYXIgKnNzZXh0ID0gTlVMTDsKLSAgY2hhciAqZXh0X3B0cjsKLSAgY2hhciAqZXh0X2VuZDsKLQotICAqcG5lZWRlZCA9IGZhbHNlOwotCi0gIGlmICghIGVjb2ZmX3NsdXJwX3N5bWJvbGljX2hlYWRlciAoYWJmZCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMsIHdlIGRvbid0IHdhbnQgaXQuICAqLwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCkKLSAgICBnb3RvIHN1Y2Nlc3NmdWxfcmV0dXJuOwotCi0gIHN5bWhkciA9ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXI7Ci0KLSAgLyogUmVhZCBpbiB0aGUgZXh0ZXJuYWwgc3ltYm9scyBhbmQgZXh0ZXJuYWwgc3RyaW5ncy4gICovCi0gIGV4dGVybmFsX2V4dF9zaXplID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9leHRfc2l6ZTsKLSAgZXNpemUgPSBzeW1oZHItPmlleHRNYXggKiBleHRlcm5hbF9leHRfc2l6ZTsKLSAgZXh0ZXJuYWxfZXh0ID0gKFBUUikgYmZkX21hbGxvYyAoZXNpemUpOwotICBpZiAoZXh0ZXJuYWxfZXh0ID09IE5VTEwgJiYgZXNpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bWhkci0+Y2JFeHRPZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoZXh0ZXJuYWxfZXh0LCAxLCBlc2l6ZSwgYWJmZCkgIT0gZXNpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3NleHQgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzeW1oZHItPmlzc0V4dE1heCk7Ci0gIGlmIChzc2V4dCA9PSBOVUxMICYmIHN5bWhkci0+aXNzRXh0TWF4ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW1oZHItPmNiU3NFeHRPZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKHNzZXh0LCAxLCBzeW1oZHItPmlzc0V4dE1heCwgYWJmZCkgIT0KLQkgIChiZmRfc2l6ZV90eXBlKSBzeW1oZHItPmlzc0V4dE1heCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBleHRlcm5hbCBzeW1ib2xzIHRvIHNlZSBpZiB0aGV5IGRlZmluZSBzb21lCi0gICAgIHN5bWJvbCB0aGF0IGlzIGN1cnJlbnRseSB1bmRlZmluZWQuICAqLwotICBleHRfcHRyID0gKGNoYXIgKikgZXh0ZXJuYWxfZXh0OwotICBleHRfZW5kID0gZXh0X3B0ciArIGVzaXplOwotICBmb3IgKDsgZXh0X3B0ciA8IGV4dF9lbmQ7IGV4dF9wdHIgKz0gZXh0ZXJuYWxfZXh0X3NpemUpCi0gICAgewotICAgICAgRVhUUiBlc3ltOwotICAgICAgYm9vbGVhbiBkZWY7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgICgqc3dhcF9leHRfaW4pIChhYmZkLCAoUFRSKSBleHRfcHRyLCAmZXN5bSk7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIHN5bWJvbCBkZWZpbmVzIHNvbWV0aGluZy4gICovCi0gICAgICBpZiAoZXN5bS5hc3ltLnN0ICE9IHN0R2xvYmFsCi0JICAmJiBlc3ltLmFzeW0uc3QgIT0gc3RMYWJlbAotCSAgJiYgZXN5bS5hc3ltLnN0ICE9IHN0UHJvYykKLQljb250aW51ZTsKLQotICAgICAgc3dpdGNoIChlc3ltLmFzeW0uc2MpCi0JewotCWNhc2Ugc2NUZXh0OgotCWNhc2Ugc2NEYXRhOgotCWNhc2Ugc2NCc3M6Ci0JY2FzZSBzY0FiczoKLQljYXNlIHNjU0RhdGE6Ci0JY2FzZSBzY1NCc3M6Ci0JY2FzZSBzY1JEYXRhOgotCWNhc2Ugc2NDb21tb246Ci0JY2FzZSBzY1NDb21tb246Ci0JY2FzZSBzY0luaXQ6Ci0JY2FzZSBzY0Zpbmk6Ci0JY2FzZSBzY1JDb25zdDoKLQkgIGRlZiA9IHRydWU7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZGVmID0gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICghIGRlZikKLQljb250aW51ZTsKLQotICAgICAgbmFtZSA9IHNzZXh0ICsgZXN5bS5hc3ltLmlzczsKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICAgICAgLyogVW5saWtlIHRoZSBnZW5lcmljIGxpbmtlciwgd2UgZG8gbm90IHB1bGwgaW4gZWxlbWVudHMgYmVjYXVzZQotCSBvZiBjb21tb24gc3ltYm9scy4gICovCi0gICAgICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgfHwgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQljb250aW51ZTsKLQotICAgICAgLyogSW5jbHVkZSB0aGlzIGVsZW1lbnQuICAqLwotICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBhYmZkLCBuYW1lKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmICghIGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyAoYWJmZCwgaW5mbywgZXh0ZXJuYWxfZXh0LCBzc2V4dCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgICpwbmVlZGVkID0gdHJ1ZTsKLSAgICAgIGdvdG8gc3VjY2Vzc2Z1bF9yZXR1cm47Ci0gICAgfQotCi0gc3VjY2Vzc2Z1bF9yZXR1cm46Ci0gIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9leHQpOwotICBpZiAoc3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChzc2V4dCk7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKGV4dGVybmFsX2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX2V4dCk7Ci0gIGlmIChzc2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKHNzZXh0KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIEVDT0ZGIG9iamVjdCBmaWxlIHRvIHRoZSBnbG9iYWwgbGlua2VyIGhhc2gKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBIRFJSICpzeW1oZHI7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIFBUUiBleHRlcm5hbF9leHQgPSBOVUxMOwotICBzaXplX3QgZXNpemU7Ci0gIGNoYXIgKnNzZXh0ID0gTlVMTDsKLSAgYm9vbGVhbiByZXN1bHQ7Ci0KLSAgaWYgKCEgZWNvZmZfc2x1cnBfc3ltYm9saWNfaGVhZGVyIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMsIHdlIGRvbid0IHdhbnQgaXQuICAqLwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzeW1oZHIgPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyOwotCi0gIC8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIHN5bWJvbHMgYW5kIGV4dGVybmFsIHN0cmluZ3MuICAqLwotICBleHRlcm5hbF9leHRfc2l6ZSA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2V4dF9zaXplOwotICBlc2l6ZSA9IHN5bWhkci0+aWV4dE1heCAqIGV4dGVybmFsX2V4dF9zaXplOwotICBleHRlcm5hbF9leHQgPSAoUFRSKSBiZmRfbWFsbG9jIChlc2l6ZSk7Ci0gIGlmIChleHRlcm5hbF9leHQgPT0gTlVMTCAmJiBlc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltaGRyLT5jYkV4dE9mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChleHRlcm5hbF9leHQsIDEsIGVzaXplLCBhYmZkKSAhPSBlc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzc2V4dCA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN5bWhkci0+aXNzRXh0TWF4KTsKLSAgaWYgKHNzZXh0ID09IE5VTEwgJiYgc3ltaGRyLT5pc3NFeHRNYXggIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bWhkci0+Y2JTc0V4dE9mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoc3NleHQsIDEsIHN5bWhkci0+aXNzRXh0TWF4LCBhYmZkKQotCSAgIT0gKGJmZF9zaXplX3R5cGUpIHN5bWhkci0+aXNzRXh0TWF4KSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICByZXN1bHQgPSBlY29mZl9saW5rX2FkZF9leHRlcm5hbHMgKGFiZmQsIGluZm8sIGV4dGVybmFsX2V4dCwgc3NleHQpOwotCi0gIGlmIChzc2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKHNzZXh0KTsKLSAgaWYgKGV4dGVybmFsX2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX2V4dCk7Ci0gIHJldHVybiByZXN1bHQ7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzc2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKHNzZXh0KTsKLSAgaWYgKGV4dGVybmFsX2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX2V4dCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQWRkIHRoZSBleHRlcm5hbCBzeW1ib2xzIG9mIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBnbG9iYWwgbGlua2VyCi0gICBoYXNoIHRhYmxlLiAgVGhlIGV4dGVybmFsIHN5bWJvbHMgYW5kIHN0cmluZ3Mgd2UgYXJlIHBhc3NlZCBhcmUKLSAgIGp1c3QgYWxsb2NhdGVkIG9uIHRoZSBzdGFjaywgYW5kIHdpbGwgYmUgZGlzY2FyZGVkLiAgV2UgbXVzdAotICAgZXhwbGljaXRseSBzYXZlIGFueSBpbmZvcm1hdGlvbiB3ZSBtYXkgbmVlZCBsYXRlciBvbiBpbiB0aGUgbGluay4KLSAgIFdlIGRvIG5vdCB3YW50IHRvIHJlYWQgdGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbiBhZ2Fpbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9saW5rX2FkZF9leHRlcm5hbHMgKGFiZmQsIGluZm8sIGV4dGVybmFsX2V4dCwgc3NleHQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIFBUUiBleHRlcm5hbF9leHQ7Ci0gICAgIGNoYXIgKnNzZXh0OwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICB2b2lkICgqIGNvbnN0IHN3YXBfZXh0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBFWFRSICopKQotICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbjsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9leHRfc2l6ZSA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIHVuc2lnbmVkIGxvbmcgZXh0X2NvdW50OwotICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7Ci0gIGNoYXIgKmV4dF9wdHI7Ci0gIGNoYXIgKmV4dF9lbmQ7Ci0KLSAgZXh0X2NvdW50ID0gZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXg7Ci0KLSAgc3ltX2hhc2ggPSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJIGV4dF9jb3VudCAqIHNpemVvZiAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikpKTsKLSAgaWYgKCFzeW1faGFzaCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1faGFzaGVzID0gc3ltX2hhc2g7Ci0KLSAgZXh0X3B0ciA9IChjaGFyICopIGV4dGVybmFsX2V4dDsKLSAgZXh0X2VuZCA9IGV4dF9wdHIgKyBleHRfY291bnQgKiBleHRlcm5hbF9leHRfc2l6ZTsKLSAgZm9yICg7IGV4dF9wdHIgPCBleHRfZW5kOyBleHRfcHRyICs9IGV4dGVybmFsX2V4dF9zaXplLCBzeW1faGFzaCsrKQotICAgIHsKLSAgICAgIEVYVFIgZXN5bTsKLSAgICAgIGJvb2xlYW4gc2tpcDsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAqc3ltX2hhc2ggPSBOVUxMOwotCi0gICAgICAoKnN3YXBfZXh0X2luKSAoYWJmZCwgKFBUUikgZXh0X3B0ciwgJmVzeW0pOwotCi0gICAgICAvKiBTa2lwIGRlYnVnZ2luZyBzeW1ib2xzLiAgKi8KLSAgICAgIHNraXAgPSBmYWxzZTsKLSAgICAgIHN3aXRjaCAoZXN5bS5hc3ltLnN0KQotCXsKLQljYXNlIHN0R2xvYmFsOgotCWNhc2Ugc3RTdGF0aWM6Ci0JY2FzZSBzdExhYmVsOgotCWNhc2Ugc3RQcm9jOgotCWNhc2Ugc3RTdGF0aWNQcm9jOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHNraXAgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc2tpcCkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBzeW1ib2wuICAqLwotICAgICAgdmFsdWUgPSBlc3ltLmFzeW0udmFsdWU7Ci0gICAgICBzd2l0Y2ggKGVzeW0uYXN5bS5zYykKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIHNjTmlsOgotCWNhc2Ugc2NSZWdpc3RlcjoKLQljYXNlIHNjQ2RiTG9jYWw6Ci0JY2FzZSBzY0JpdHM6Ci0JY2FzZSBzY0NkYlN5c3RlbToKLQljYXNlIHNjUmVnSW1hZ2U6Ci0JY2FzZSBzY0luZm86Ci0JY2FzZSBzY1VzZXJTdHJ1Y3Q6Ci0JY2FzZSBzY1ZhcjoKLQljYXNlIHNjVmFyUmVnaXN0ZXI6Ci0JY2FzZSBzY1ZhcmlhbnQ6Ci0JY2FzZSBzY0Jhc2VkVmFyOgotCWNhc2Ugc2NYRGF0YToKLQljYXNlIHNjUERhdGE6Ci0JICBzZWN0aW9uID0gTlVMTDsKLQkgIGJyZWFrOwotCWNhc2Ugc2NUZXh0OgotCSAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi50ZXh0Iik7Ci0JICB2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQljYXNlIHNjRGF0YToKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuZGF0YSIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0JzczoKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuYnNzIik7Ci0JICB2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQljYXNlIHNjQWJzOgotCSAgc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIHNjVW5kZWZpbmVkOgotCSAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIHNjU0RhdGE6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNkYXRhIik7Ci0JICB2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQljYXNlIHNjU0JzczoKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuc2JzcyIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1JEYXRhOgotCSAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5yZGF0YSIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0NvbW1vbjoKLQkgIGlmICh2YWx1ZSA+IGVjb2ZmX2RhdGEgKGFiZmQpLT5ncF9zaXplKQotCSAgICB7Ci0JICAgICAgc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBzY1NDb21tb246Ci0JICBpZiAoZWNvZmZfc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEluaXRpYWxpemUgdGhlIHNtYWxsIGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgICAgICBlY29mZl9zY29tX3NlY3Rpb24ubmFtZSA9IFNDT01NT047Ci0JICAgICAgZWNvZmZfc2NvbV9zZWN0aW9uLmZsYWdzID0gU0VDX0lTX0NPTU1PTjsKLQkgICAgICBlY29mZl9zY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmZWNvZmZfc2NvbV9zZWN0aW9uOwotCSAgICAgIGVjb2ZmX3Njb21fc2VjdGlvbi5zeW1ib2wgPSAmZWNvZmZfc2NvbV9zeW1ib2w7Ci0JICAgICAgZWNvZmZfc2NvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJmVjb2ZmX3Njb21fc3ltYm9sX3B0cjsKLQkgICAgICBlY29mZl9zY29tX3N5bWJvbC5uYW1lID0gU0NPTU1PTjsKLQkgICAgICBlY29mZl9zY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgICAgICBlY29mZl9zY29tX3N5bWJvbC5zZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLQkgICAgICBlY29mZl9zY29tX3N5bWJvbF9wdHIgPSAmZWNvZmZfc2NvbV9zeW1ib2w7Ci0JICAgIH0KLQkgIHNlY3Rpb24gPSAmZWNvZmZfc2NvbV9zZWN0aW9uOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1NVbmRlZmluZWQ6Ci0JICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCWNhc2Ugc2NJbml0OgotCSAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5pbml0Iik7Ci0JICB2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQljYXNlIHNjRmluaToKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuZmluaSIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1JDb25zdDoKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIucmNvbnN0Iik7Ci0JICB2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChzZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBuYW1lID0gc3NleHQgKyBlc3ltLmFzeW0uaXNzOwotCi0gICAgICBoID0gTlVMTDsKLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGFiZmQsIG5hbWUsCi0JICAgICAgZXN5bS53ZWFrZXh0ID8gQlNGX1dFQUsgOiBCU0ZfR0xPQkFMLAotCSAgICAgIHNlY3Rpb24sIHZhbHVlLCAoY29uc3QgY2hhciAqKSBOVUxMLCB0cnVlLCB0cnVlLAotCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgICpzeW1faGFzaCA9IGg7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBidWlsZGluZyBhbiBFQ09GRiBoYXNoIHRhYmxlLCBzYXZlIHRoZSBleHRlcm5hbAotCSBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgPT0gYmZkX2dldF9mbGF2b3VyIChhYmZkKSkKLQl7Ci0JICBpZiAoaC0+YWJmZCA9PSAoYmZkICopIE5VTEwKLQkgICAgICB8fCAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pCi0JCSAgJiYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKQotCQkgICAgICB8fCAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkpKQotCSAgICB7Ci0JICAgICAgaC0+YWJmZCA9IGFiZmQ7Ci0JICAgICAgaC0+ZXN5bSA9IGVzeW07Ci0JICAgIH0KLQotCSAgLyogUmVtZW1iZXIgd2hldGhlciB0aGlzIHN5bWJvbCB3YXMgc21hbGwgdW5kZWZpbmVkLiAgKi8KLQkgIGlmIChlc3ltLmFzeW0uc2MgPT0gc2NTVW5kZWZpbmVkKQotCSAgICBoLT5zbWFsbCA9IDE7Ci0KLQkgIC8qIElmIHRoaXMgc3ltYm9sIHdhcyBldmVyIHNtYWxsIHVuZGVmaW5lZCwgaXQgbmVlZHMgdG8gd2luZAotCSAgICAgdXAgaW4gYSBHUCByZWxhdGl2ZSBzZWN0aW9uLiAgV2UgY2FuJ3QgY29udHJvbCB0aGUKLQkgICAgIHNlY3Rpb24gb2YgYSBkZWZpbmVkIHN5bWJvbCwgYnV0IHdlIGNhbiBjb250cm9sIHRoZQotCSAgICAgc2VjdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wuICBUaGlzIGNhc2UgaXMgYWN0dWFsbHkgbmVlZGVkCi0JICAgICBvbiBVbHRyaXggNC4yIHRvIGhhbmRsZSB0aGUgc3ltYm9sIGNyZWQgaW4gLWxja3JiLiAgKi8KLQkgIGlmIChoLT5zbWFsbAotCSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+bmFtZSwgU0NPTU1PTikgIT0gMCkKLQkgICAgewotCSAgICAgIGgtPnJvb3QudS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsCi0JCQkJCQkJCSBTQ09NTU9OKTsKLQkgICAgICBoLT5yb290LnUuYy5wLT5zZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQkgICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjQ29tbW9uKQotCQloLT5lc3ltLmFzeW0uc2MgPSBzY1NDb21tb247Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRUNPRkYgZmluYWwgbGluayByb3V0aW5lcy4gICovCi0KLXN0YXRpYyBib29sZWFuIGVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZQotICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIGJmZCAqaW5wdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCSAgIFBUUiBoYW5kbGUpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwKLSAgUEFSQU1TICgoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2luZGlyZWN0X2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogU3RydWN0dXJlIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0byBlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsLiAgKi8KLQotc3RydWN0IGV4dHN5bV9pbmZvCi17Ci0gIGJmZCAqYWJmZDsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci19OwotCi0vKiBFQ09GRiBmaW5hbCBsaW5rIHJvdXRpbmUuICBUaGlzIGxvb2tzIHRocm91Z2ggYWxsIHRoZSBpbnB1dCBCRkRzCi0gICBhbmQgZ2F0aGVycyB0b2dldGhlciBhbGwgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgYW5kIHRoZW4KLSAgIHByb2Nlc3NlcyBhbGwgdGhlIGxpbmsgb3JkZXIgaW5mb3JtYXRpb24uICBUaGlzIG1heSBjYXVzZSBpdCB0bwotICAgY2xvc2UgYW5kIHJlb3BlbiBzb21lIGlucHV0IEJGRHM7IEknbGwgc2VlIGhvdyBiYWQgdGhpcyBpcy4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBiYWNrZW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCk7Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWcgPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm87Ci0gIEhEUlIgKnN5bWhkcjsKLSAgUFRSIGhhbmRsZTsKLSAgcmVnaXN0ZXIgYmZkICppbnB1dF9iZmQ7Ci0gIGFzZWN0aW9uICpvOwotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci0gIHN0cnVjdCBleHRzeW1faW5mbyBlaW5mbzsKLQotICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gY291bnRzIGluIHRoZSBzeW1ib2xpYwotICAgICBoZWFkZXIuICAqLwotICBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgc3ltaGRyLT52c3RhbXAgPSAwOwotICBzeW1oZHItPmlsaW5lTWF4ID0gMDsKLSAgc3ltaGRyLT5jYkxpbmUgPSAwOwotICBzeW1oZHItPmlkbk1heCA9IDA7Ci0gIHN5bWhkci0+aXBkTWF4ID0gMDsKLSAgc3ltaGRyLT5pc3ltTWF4ID0gMDsKLSAgc3ltaGRyLT5pb3B0TWF4ID0gMDsKLSAgc3ltaGRyLT5pYXV4TWF4ID0gMDsKLSAgc3ltaGRyLT5pc3NNYXggPSAwOwotICBzeW1oZHItPmlzc0V4dE1heCA9IDA7Ci0gIHN5bWhkci0+aWZkTWF4ID0gMDsKLSAgc3ltaGRyLT5jcmZkID0gMDsKLSAgc3ltaGRyLT5pZXh0TWF4ID0gMDsKLQotICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXRzZWxmIGluIHRoZSBkZWJ1Z19pbmZvCi0gICAgIHN0cnVjdHVyZS4gICovCi0gIGRlYnVnLT5saW5lID0gTlVMTDsKLSAgZGVidWctPmV4dGVybmFsX2RuciA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9wZHIgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfc3ltID0gTlVMTDsKLSAgZGVidWctPmV4dGVybmFsX29wdCA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9hdXggPSBOVUxMOwotICBkZWJ1Zy0+c3MgPSBOVUxMOwotICBkZWJ1Zy0+c3NleHQgPSBkZWJ1Zy0+c3NleHRfZW5kID0gTlVMTDsKLSAgZGVidWctPmV4dGVybmFsX2ZkciA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9yZmQgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfZXh0ID0gZGVidWctPmV4dGVybmFsX2V4dF9lbmQgPSBOVUxMOwotCi0gIGhhbmRsZSA9IGJmZF9lY29mZl9kZWJ1Z19pbml0IChhYmZkLCBkZWJ1ZywgJmJhY2tlbmQtPmRlYnVnX3N3YXAsIGluZm8pOwotICBpZiAoaGFuZGxlID09IChQVFIpIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEFjY3VtdWxhdGUgdGhlIGRlYnVnZ2luZyBzeW1ib2xzIGZyb20gZWFjaCBpbnB1dCBCRkQuICAqLwotICBmb3IgKGlucHV0X2JmZCA9IGluZm8tPmlucHV0X2JmZHM7Ci0gICAgICAgaW5wdXRfYmZkICE9IChiZmQgKikgTlVMTDsKLSAgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9iZmQtPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBib29sZWFuIHJldDsKLQotICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaW5wdXRfYmZkKSA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0JewotCSAgLyogQWJpdHJhcmlseSBzZXQgdGhlIHN5bWJvbGljIGhlYWRlciB2c3RhbXAgdG8gdGhlIHZzdGFtcAotCSAgICAgb2YgdGhlIGZpcnN0IG9iamVjdCBmaWxlIGluIHRoZSBsaW5rLiAgKi8KLQkgIGlmIChzeW1oZHItPnZzdGFtcCA9PSAwKQotCSAgICBzeW1oZHItPnZzdGFtcAotCSAgICAgID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIudnN0YW1wOwotCSAgcmV0ID0gZWNvZmZfZmluYWxfbGlua19kZWJ1Z19hY2N1bXVsYXRlIChhYmZkLCBpbnB1dF9iZmQsIGluZm8sCi0JCQkJCQkgICBoYW5kbGUpOwotCX0KLSAgICAgIGVsc2UKLQlyZXQgPSBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZV9vdGhlciAoaGFuZGxlLCBhYmZkLAotCQkJCQkJZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLAotCQkJCQkJaW5wdXRfYmZkLCBpbmZvKTsKLSAgICAgIGlmICghIHJldCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIENvbWJpbmUgdGhlIHJlZ2lzdGVyIG1hc2tzLiAgKi8KLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5ncHJtYXNrIHw9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwcm1hc2s7Ci0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+ZnBybWFzayB8PSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5mcHJtYXNrOwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmNwcm1hc2tbMF0gfD0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3BybWFza1swXTsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5jcHJtYXNrWzFdIHw9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNwcm1hc2tbMV07Ci0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+Y3BybWFza1syXSB8PSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5jcHJtYXNrWzJdOwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmNwcm1hc2tbM10gfD0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3BybWFza1szXTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLSAgZWluZm8uYWJmZCA9IGFiZmQ7Ci0gIGVpbmZvLmluZm8gPSBpbmZvOwotICBlY29mZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgIGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwsCi0JCQkgICAgKFBUUikgJmVpbmZvKTsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgdG8gbWFrZSBhIHBhc3Mgb3ZlciB0aGUgbGlua19vcmRlcnMgdG8gY291bnQgdXAgdGhlCi0JIG51bWJlciBvZiByZWxvY2F0aW9ucyB3ZSB3aWxsIG5lZWQgdG8gb3V0cHV0LCBzbyB0aGF0IHdlIGtub3cKLQkgaG93IG11Y2ggc3BhY2UgdGhleSB3aWxsIHRha2UgdXAuICAqLwotICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIG8tPnJlbG9jX2NvdW50ID0gMDsKLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkgICAgICBvLT5yZWxvY19jb3VudCArPSBwLT51LmluZGlyZWN0LnNlY3Rpb24tPnJlbG9jX2NvdW50OwotCSAgICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkgICAgICArK28tPnJlbG9jX2NvdW50OwotCX0KLSAgICB9Ci0KLSAgLyogQ29tcHV0ZSB0aGUgcmVsb2MgYW5kIHN5bWJvbCBmaWxlIHBvc2l0aW9ucy4gICovCi0gIGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMgKGFiZmQpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKCEgYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnIChoYW5kbGUsIGFiZmQsIGRlYnVnLAotCQkJCQkgICAmYmFja2VuZC0+ZGVidWdfc3dhcCwgaW5mbywKLQkJCQkJICAgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX2Vjb2ZmX2RlYnVnX2ZyZWUgKGhhbmRsZSwgYWJmZCwgZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLCBpbmZvKTsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIC8qIE5vdyByZXNldCB0aGUgcmVsb2NfY291bnQgZmllbGQgb2YgdGhlIHNlY3Rpb25zIGluIHRoZSBvdXRwdXQKLQkgQkZEIHRvIDAsIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGVtIHRvIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkKLQkgcmVsb2NzIHdlIGhhdmUgb3V0cHV0IHRodXMgZmFyLiAgKi8KLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLQlvLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgfQotCi0gIC8qIEdldCBhIHZhbHVlIGZvciB0aGUgR1AgcmVnaXN0ZXIuICAqLwotICBpZiAoZWNvZmZfZGF0YSAoYWJmZCktPmdwID09IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9ncCIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JZWNvZmZfZGF0YSAoYWJmZCktPmdwID0gKGgtPnUuZGVmLnZhbHVlCi0JCQkJICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIGJmZF92bWEgbG87Ci0KLQkgIC8qIE1ha2UgdXAgYSB2YWx1ZS4gICovCi0JICBsbyA9IChiZmRfdm1hKSAtMTsKLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChvLT52bWEgPCBsbwotCQkgICYmIChzdHJjbXAgKG8tPm5hbWUsIF9TQlNTKSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoby0+bmFtZSwgX1NEQVRBKSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoby0+bmFtZSwgX0xJVDQpID09IDAKLQkJICAgICAgfHwgc3RyY21wIChvLT5uYW1lLCBfTElUOCkgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKG8tPm5hbWUsIF9MSVRBKSA9PSAwKSkKLQkJbG8gPSBvLT52bWE7Ci0JICAgIH0KLQkgIGVjb2ZmX2RhdGEgKGFiZmQpLT5ncCA9IGxvICsgMHg4MDAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJZiB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbiBuZWVkcyB0byBkbyBhIHJlbG9jCi0JICAgICBpbnZvbHZpbmcgdGhlIEdQIHZhbHVlLCBpdCBzaG91bGQgbWFrZSBhIHJlbG9jX2Rhbmdlcm91cwotCSAgICAgY2FsbGJhY2sgdG8gd2FybiB0aGF0IEdQIGlzIG5vdCBkZWZpbmVkLiAgKi8KLQl9Ci0gICAgfQotCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikpCi0JICAgIHsKLQkgICAgICBpZiAoISBlY29mZl9pbmRpcmVjdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICBpZiAoISBlY29mZl9yZWxvY19saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBzeW1oZHItPmlleHRNYXggKyBzeW1oZHItPmlzeW1NYXg7Ci0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPmxpbmtlciA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFjY3VtdWxhdGUgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYW4gaW5wdXQgQkZEIGludG8gdGhlCi0gICBvdXRwdXQgQkZELiAgVGhpcyBtdXN0IHJlYWQgaW4gdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIG9mIHRoZQotICAgaW5wdXQgQkZELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZSAob3V0cHV0X2JmZCwgaW5wdXRfYmZkLCBpbmZvLCBoYW5kbGUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBQVFIgaGFuZGxlOwotewotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnID0gJmVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmRlYnVnX2luZm87Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3Qgc3dhcCA9Ci0gICAgJmVjb2ZmX2JhY2tlbmQgKGlucHV0X2JmZCktPmRlYnVnX3N3YXA7Ci0gIEhEUlIgKnN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBib29sZWFuIHJldDsKLQotI2RlZmluZSBSRUFEKHB0ciwgb2Zmc2V0LCBjb3VudCwgc2l6ZSwgdHlwZSkJCQkJXAotICBpZiAoc3ltaGRyLT5jb3VudCA9PSAwKQkJCQkJCVwKLSAgICBkZWJ1Zy0+cHRyID0gTlVMTDsJCQkJCQkJXAotICBlbHNlCQkJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBkZWJ1Zy0+cHRyID0gKHR5cGUpIGJmZF9tYWxsb2MgKChzaXplX3QpIChzaXplICogc3ltaGRyLT5jb3VudCkpOwlcCi0gICAgICBpZiAoZGVidWctPnB0ciA9PSBOVUxMKQkJCQkJCVwKLQl7CQkJCQkJCQlcCi0gICAgICAgICAgcmV0ID0gZmFsc2U7CQkJCQkJCVwKLSAgICAgICAgICBnb3RvIHJldHVybl9zb21ldGhpbmc7CQkJCQlcCi0JfQkJCQkJCQkJXAotICAgICAgaWYgKChiZmRfc2VlayAoaW5wdXRfYmZkLCAoZmlsZV9wdHIpIHN5bWhkci0+b2Zmc2V0LCBTRUVLX1NFVCkJXAotCSAgICE9IDApCQkJCQkJCVwKLQkgIHx8IChiZmRfcmVhZCAoZGVidWctPnB0ciwgc2l6ZSwgc3ltaGRyLT5jb3VudCwJCVwKLQkJCWlucHV0X2JmZCkgIT0gc2l6ZSAqIHN5bWhkci0+Y291bnQpKQkJXAotCXsJCQkJCQkJCVwKLSAgICAgICAgICByZXQgPSBmYWxzZTsJCQkJCQkJXAotICAgICAgICAgIGdvdG8gcmV0dXJuX3NvbWV0aGluZzsJCQkJCVwKLQl9CQkJCQkJCQlcCi0gICAgfQotCi0gIC8qIElmIHJhd19zeW1lbnRzIGlzIG5vdCBOVUxMLCB0aGVuIHRoZSBkYXRhIHdhcyBhbHJlYWR5IGJ5IHJlYWQgYnkKLSAgICAgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnJhd19zeW1lbnRzID09IE5VTEwpCi0gICAgewotICAgICAgUkVBRCAobGluZSwgY2JMaW5lT2Zmc2V0LCBjYkxpbmUsIHNpemVvZiAodW5zaWduZWQgY2hhciksCi0JICAgIHVuc2lnbmVkIGNoYXIgKik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9kbnIsIGNiRG5PZmZzZXQsIGlkbk1heCwgc3dhcC0+ZXh0ZXJuYWxfZG5yX3NpemUsIFBUUik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9wZHIsIGNiUGRPZmZzZXQsIGlwZE1heCwgc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUsIFBUUik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9zeW0sIGNiU3ltT2Zmc2V0LCBpc3ltTWF4LCBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSwgUFRSKTsKLSAgICAgIFJFQUQgKGV4dGVybmFsX29wdCwgY2JPcHRPZmZzZXQsIGlvcHRNYXgsIHN3YXAtPmV4dGVybmFsX29wdF9zaXplLCBQVFIpOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfYXV4LCBjYkF1eE9mZnNldCwgaWF1eE1heCwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSwKLQkgICAgdW5pb24gYXV4X2V4dCAqKTsKLSAgICAgIFJFQUQgKHNzLCBjYlNzT2Zmc2V0LCBpc3NNYXgsIHNpemVvZiAoY2hhciksIGNoYXIgKik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9mZHIsIGNiRmRPZmZzZXQsIGlmZE1heCwgc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUsIFBUUik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9yZmQsIGNiUmZkT2Zmc2V0LCBjcmZkLCBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSwgUFRSKTsKLSAgICB9Ci0jdW5kZWYgUkVBRAotCi0gIC8qIFdlIGRvIG5vdCByZWFkIHRoZSBleHRlcm5hbCBzdHJpbmdzIG9yIHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLQotICByZXQgPSAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUKLQkgKGhhbmRsZSwgb3V0cHV0X2JmZCwgJmVjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5kZWJ1Z19pbmZvLAotCSAgJmVjb2ZmX2JhY2tlbmQgKG91dHB1dF9iZmQpLT5kZWJ1Z19zd2FwLAotCSAgaW5wdXRfYmZkLCBkZWJ1Zywgc3dhcCwgaW5mbykpOwotCi0gcmV0dXJuX3NvbWV0aGluZzoKLSAgaWYgKGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnJhd19zeW1lbnRzID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGRlYnVnLT5saW5lICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmxpbmUpOwotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9kbnIgIT0gTlVMTCkKLQlmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yKTsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfcGRyICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmV4dGVybmFsX3Bkcik7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX3N5bSAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9zeW0pOwotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9vcHQgIT0gTlVMTCkKLQlmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0KTsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmV4dGVybmFsX2F1eCk7Ci0gICAgICBpZiAoZGVidWctPnNzICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPnNzKTsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZmRyICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmV4dGVybmFsX2Zkcik7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX3JmZCAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9yZmQpOwotCi0gICAgICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IGZvbGxvdyBvbmUgb2YgdGhlc2UgcG9pbnRlcnMKLQkgaW50byBmcmVlZCBtZW1vcnkuICAqLwotICAgICAgZGVidWctPmxpbmUgPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX2RuciA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfcGRyID0gTlVMTDsKLSAgICAgIGRlYnVnLT5leHRlcm5hbF9zeW0gPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX29wdCA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ID0gTlVMTDsKLSAgICAgIGRlYnVnLT5zcyA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfZmRyID0gTlVMTDsKLSAgICAgIGRlYnVnLT5leHRlcm5hbF9yZmQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBQdXQgb3V0IGluZm9ybWF0aW9uIGZvciBhbiBleHRlcm5hbCBzeW1ib2wuICBUaGVzZSBjb21lIG9ubHkgZnJvbQotICAgdGhlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBleHRzeW1faW5mbyAqZWluZm8gPSAoc3RydWN0IGV4dHN5bV9pbmZvICopIGRhdGE7Ci0gIGJmZCAqb3V0cHV0X2JmZCA9IGVpbmZvLT5hYmZkOwotICBib29sZWFuIHN0cmlwOwotCi0gIC8qIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBzeW1ib2wgaXMgYmVpbmcgc3RyaXBwZWQuICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLSAgICBzdHJpcCA9IGZhbHNlOwotICBlbHNlIGlmIChlaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0JICAgfHwgKGVpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgICYmIGJmZF9oYXNoX2xvb2t1cCAoZWluZm8tPmluZm8tPmtlZXBfaGFzaCwKLQkJCQkgICBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCSAgIGZhbHNlLCBmYWxzZSkgPT0gTlVMTCkpCi0gICAgc3RyaXAgPSB0cnVlOwotICBlbHNlCi0gICAgc3RyaXAgPSBmYWxzZTsKLQotICBpZiAoc3RyaXAgfHwgaC0+d3JpdHRlbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoaC0+YWJmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgaC0+ZXN5bS5qbXB0YmwgPSAwOwotICAgICAgaC0+ZXN5bS5jb2JvbF9tYWluID0gMDsKLSAgICAgIGgtPmVzeW0ud2Vha2V4dCA9IDA7Ci0gICAgICBoLT5lc3ltLnJlc2VydmVkID0gMDsKLSAgICAgIGgtPmVzeW0uaWZkID0gaWZkTmlsOwotICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0R2xvYmFsOwotCi0gICAgICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQloLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICBvdXRwdXRfc2VjdGlvbiA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAob3V0cHV0X3NlY3Rpb24tPm93bmVyLCBvdXRwdXRfc2VjdGlvbik7Ci0JCi0JICBpZiAoc3RyY21wIChuYW1lLCBfVEVYVCkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NUZXh0OwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfREFUQSkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NEYXRhOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfU0RBVEEpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjU0RhdGE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9SREFUQSkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NSRGF0YTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0JTUykgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NCc3M7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9TQlNTKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1NCc3M7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9JTklUKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0luaXQ7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9GSU5JKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0Zpbmk7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9QREFUQSkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NQRGF0YTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1hEQVRBKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1hEYXRhOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUkNPTlNUKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1JDb25zdDsKLQkgIGVsc2UKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0JfQotCi0gICAgICBoLT5lc3ltLmFzeW0ucmVzZXJ2ZWQgPSAwOwotICAgICAgaC0+ZXN5bS5hc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0gICAgfQotICBlbHNlIGlmIChoLT5lc3ltLmlmZCAhPSAtMSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0KLSAgICAgIC8qIEFkanVzdCB0aGUgRkRSIGluZGV4IGZvciB0aGUgc3ltYm9sIGJ5IHRoYXQgdXNlZCBmb3IgdGhlCi0JIGlucHV0IEJGRC4gICovCi0gICAgICBkZWJ1ZyA9ICZlY29mZl9kYXRhIChoLT5hYmZkKS0+ZGVidWdfaW5mbzsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPmVzeW0uaWZkID49IDAKLQkJICAmJiBoLT5lc3ltLmlmZCA8IGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuaWZkTWF4KTsKLSAgICAgIGgtPmVzeW0uaWZkID0gZGVidWctPmlmZG1hcFtoLT5lc3ltLmlmZF07Ci0gICAgfQotCi0gIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9uZXc6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjICE9IHNjVW5kZWZpbmVkCi0JICAmJiBoLT5lc3ltLmFzeW0uc2MgIT0gc2NTVW5kZWZpbmVkKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjVW5kZWZpbmVkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjVW5kZWZpbmVkCi0JICB8fCBoLT5lc3ltLmFzeW0uc2MgPT0gc2NTVW5kZWZpbmVkKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotICAgICAgZWxzZSBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjQ29tbW9uKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOwotICAgICAgZWxzZSBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjU0NvbW1vbikKLQloLT5lc3ltLmFzeW0uc2MgPSBzY1NCc3M7Ci0gICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIGlmIChoLT5lc3ltLmFzeW0uc2MgIT0gc2NDb21tb24KLQkgICYmIGgtPmVzeW0uYXN5bS5zYyAhPSBzY1NDb21tb24pCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NDb21tb247Ci0gICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSBoLT5yb290LnUuYy5zaXplOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF93YXJuaW5nOgotICAgICAgLyogRklYTUU6IElnbm9yZSB0aGVzZSBmb3Igbm93LiAgVGhlIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2gKLQkgdGhleSBzaG91bGQgYmUgd3JpdHRlbiBvdXQgYXJlIG5vdCBjbGVhciB0byBtZS4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCB1c2VzIGlleHRNYXggdG8ga2VlcCB0cmFjayBvZiB0aGUKLSAgICAgc3ltYm9sIG51bWJlci4gICovCi0gIGgtPmluZHggPSBlY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heDsKLSAgaC0+d3JpdHRlbiA9IDE7Ci0KLSAgcmV0dXJuIChiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsCi0JICAob3V0cHV0X2JmZCwgJmVjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5kZWJ1Z19pbmZvLAotCSAgICZlY29mZl9iYWNrZW5kIChvdXRwdXRfYmZkKS0+ZGVidWdfc3dhcCwgaC0+cm9vdC5yb290LnN0cmluZywKLQkgICAmaC0+ZXN5bSkpOwotfQotCi0vKiBSZWxvY2F0ZSBhbmQgd3JpdGUgYW4gRUNPRkYgc2VjdGlvbiBpbnRvIGFuIEVDT0ZGIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2luZGlyZWN0X2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIGluZm8sIG91dHB1dF9zZWN0aW9uLCBsaW5rX29yZGVyKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLXsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gIGJmZCAqaW5wdXRfYmZkOwotICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKLSAgYmZkX3NpemVfdHlwZSByYXdfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBjb29rZWRfc2l6ZTsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY19zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jc19zaXplOwotICBQVFIgZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLQotICBCRkRfQVNTRVJUICgob3V0cHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCk7Ci0KLSAgaWYgKGxpbmtfb3JkZXItPnNpemUgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLSAgc2VjdGlvbl90ZGF0YSA9IGVjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKLQotICByYXdfc2l6ZSA9IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgY29va2VkX3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemU7Ci0gIGlmIChjb29rZWRfc2l6ZSA9PSAwKQotICAgIGNvb2tlZF9zaXplID0gcmF3X3NpemU7Ci0KLSAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gb3V0cHV0X3NlY3Rpb24pOwotICBCRkRfQVNTRVJUIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ID09IGxpbmtfb3JkZXItPm9mZnNldCk7Ci0gIEJGRF9BU1NFUlQgKGNvb2tlZF9zaXplID09IGxpbmtfb3JkZXItPnNpemUpOwotCi0gIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gIFdlIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGxhcmdlciBvZgotICAgICB0aGUgc2l6ZSBiZWZvcmUgcmVsb2NhdGluZyBhbmQgdGhlIHNpemUgYWZ0ZXIgcmVsb2NhdGluZy4gICovCi0gIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHJhd19zaXplID49IGNvb2tlZF9zaXplCi0JCQkJICAgICAgPyAoc2l6ZV90KSByYXdfc2l6ZQotCQkJCSAgICAgIDogKHNpemVfdCkgY29va2VkX3NpemUpOwotICBpZiAoY29udGVudHMgPT0gTlVMTCAmJiByYXdfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIElmIHdlIGFyZSByZWxheGluZywgdGhlIGNvbnRlbnRzIG1heSBoYXZlIGFscmVhZHkgYmVlbiByZWFkIGludG8KLSAgICAgbWVtb3J5LCBpbiB3aGljaCBjYXNlIHdlIGNvcHkgdGhlbSBpbnRvIG91ciBuZXcgYnVmZmVyLiAgV2UgZG9uJ3QKLSAgICAgc2ltcGx5IHJldXNlIHRoZSBvbGQgYnVmZmVyIGluIGNhc2UgY29va2VkX3NpemUgPiByYXdfc2l6ZS4gICovCi0gIGlmIChzZWN0aW9uX3RkYXRhICE9IChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqKSBOVUxMCi0gICAgICAmJiBzZWN0aW9uX3RkYXRhLT5jb250ZW50cyAhPSAoYmZkX2J5dGUgKikgTlVMTCkKLSAgICBtZW1jcHkgKGNvbnRlbnRzLCBzZWN0aW9uX3RkYXRhLT5jb250ZW50cywgKHNpemVfdCkgcmF3X3NpemUpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgKFBUUikgY29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCByYXdfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgcmVsb2NzLiAgSWYgd2UgYXJlIHJlbGF4aW5nIE1JUFMgY29kZSwgdGhleSB3aWxsIGFscmVhZHkKLSAgICAgaGF2ZSBiZWVuIHJlYWQgaW4uICBPdGhlcndpc2UsIHdlIHJlYWQgdGhlbSBpbiBub3cuICAqLwotICBleHRlcm5hbF9yZWxvY19zaXplID0gZWNvZmZfYmFja2VuZCAoaW5wdXRfYmZkKS0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgZXh0ZXJuYWxfcmVsb2NzX3NpemUgPSBleHRlcm5hbF9yZWxvY19zaXplICogaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgaWYgKHNlY3Rpb25fdGRhdGEgIT0gKHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhICopIE5VTEwKLSAgICAgICYmIHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGV4dGVybmFsX3JlbG9jcyA9IHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jczsKLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dGVybmFsX3JlbG9jcyA9IChQVFIpIGJmZF9tYWxsb2MgKChzaXplX3QpIGV4dGVybmFsX3JlbG9jc19zaXplKTsKLSAgICAgIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBleHRlcm5hbF9yZWxvY3Nfc2l6ZSAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbi0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgMSwgZXh0ZXJuYWxfcmVsb2NzX3NpemUsIGlucHV0X2JmZCkKLQkgICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIFJlbG9jYXRlIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgaWYgKCEgKCgqZWNvZmZfYmFja2VuZCAoaW5wdXRfYmZkKS0+cmVsb2NhdGVfc2VjdGlvbikKLQkgKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsCi0JICBleHRlcm5hbF9yZWxvY3MpKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHJlbG9jYXRlZCBzZWN0aW9uLiAgKi8KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLAotCQkJCSAgb3V0cHV0X3NlY3Rpb24sCi0JCQkJICAoUFRSKSBjb250ZW50cywKLQkJCQkgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQsCi0JCQkJICBjb29rZWRfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGUgcmVsb2NzIHdlcmUKLSAgICAgbW9kaWZpZWQsIGFuZCB3ZSB3cml0ZSB0aGVtIG91dCBub3cuICBXZSB1c2UgdGhlIHJlbG9jX2NvdW50Ci0gICAgIGZpZWxkIG9mIG91dHB1dF9zZWN0aW9uIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiByZWxvY3Mgd2UKLSAgICAgaGF2ZSBvdXRwdXQgc28gZmFyLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCSAgICAob3V0cHV0X3NlY3Rpb24tPnJlbF9maWxlcG9zICsKLQkJICAgICBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKiBleHRlcm5hbF9yZWxvY19zaXplKSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3dyaXRlIChleHRlcm5hbF9yZWxvY3MsIDEsIGV4dGVybmFsX3JlbG9jc19zaXplLCBvdXRwdXRfYmZkKQotCSAgICAgICE9IGV4dGVybmFsX3JlbG9jc19zaXplKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIG91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCArPSBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKGNvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoY29udGVudHMpOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwgJiYgc2VjdGlvbl90ZGF0YSA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0gIGlmIChleHRlcm5hbF9yZWxvY3MgIT0gTlVMTCAmJiBzZWN0aW9uX3RkYXRhID09IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBHZW5lcmF0ZSBhIHJlbG9jIHdoZW4gbGlua2luZyBhbiBFQ09GRiBmaWxlLiAgVGhpcyBpcyBhIHJlbG9jCi0gICByZXF1ZXN0ZWQgYnkgdGhlIGxpbmtlciwgYW5kIGRvZXMgY29tZSBmcm9tIGFueSBpbnB1dCBmaWxlLiAgVGhpcwotICAgaXMgdXNlZCB0byBidWlsZCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0YWJsZXMgd2hlbiBsaW5raW5nCi0gICB3aXRoIC1Vci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9yZWxvY19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIGVudW0gYmZkX2xpbmtfb3JkZXJfdHlwZSB0eXBlOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0gIGFyZWxlbnQgcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgaW47Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgYmZkX2J5dGUgKnJidWY7Ci0gIGJvb2xlYW4gb2s7Ci0KLSAgdHlwZSA9IGxpbmtfb3JkZXItPnR5cGU7Ci0gIHNlY3Rpb24gPSBOVUxMOwotICBhZGRlbmQgPSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZDsKLQotICAvKiBXZSBzZXQgdXAgYW4gYXJlbGVudCB0byBwYXNzIHRvIHRoZSBiYWNrZW5kIGFkanVzdF9yZWxvY19vdXQKLSAgICAgcm91dGluZS4gICovCi0gIHJlbC5hZGRyZXNzID0gbGlua19vcmRlci0+b2Zmc2V0OwotCi0gIHJlbC5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAob3V0cHV0X2JmZCwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5yZWxvYyk7Ci0gIGlmIChyZWwuaG93dG8gPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKHR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcikKLSAgICB7Ci0gICAgICBzZWN0aW9uID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb247Ci0gICAgICByZWwuc3ltX3B0cl9wdHIgPSBzZWN0aW9uLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogVHJlYXQgYSByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZCBzeW1ib2wgYXMgdGhvdWdoIGl0IHdlcmUKLSAgICAgICAgIGFjdHVhbGx5IGFnYWluc3QgdGhlIHNlY3Rpb24uICAqLwotICAgICAgaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sCi0JCQkJCWxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkJCQlmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl7Ci0JICB0eXBlID0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcjsKLQkgIHNlY3Rpb24gPSBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQkgIC8qIEl0IHNlZW1zIHRoYXQgd2Ugb3VnaHQgdG8gYWRkIHRoZSBzeW1ib2wgdmFsdWUgdG8gdGhlCi0gICAgICAgICAgICAgYWRkZW5kIGhlcmUsIGJ1dCBpbiBwcmFjdGljZSBpdCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkCi0gICAgICAgICAgICAgYmVjYXVzZSBpdCB3YXMgcGFzc2VkIHRvIGNvbnN0cnVjdG9yX2NhbGxiYWNrLiAgKi8KLQkgIGFkZGVuZCArPSBzZWN0aW9uLT52bWEgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBjYW4ndCBzZXQgdXAgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIGNvcnJlY3RseSwKLQkgICAgIGJlY2F1c2Ugd2UgaGF2ZSBubyBhc3ltYm9sIHN0cnVjdHVyZS4gIEN1cnJlbnRseSBubwotCSAgICAgYWRqdXN0X3JlbG9jX291dCByb3V0aW5lIGNhcmVzLiAgKi8KLQkgIHJlbC5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgLyogQWxsIEVDT0ZGIHJlbG9jcyBhcmUgaW4tcGxhY2UuICBQdXQgdGhlIGFkZGVuZCBpbnRvIHRoZSBvYmplY3QKLSAgICAgZmlsZS4gICovCi0KLSAgQkZEX0FTU0VSVCAocmVsLmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UpOwotICBpZiAoYWRkZW5kICE9IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotICAgICAgYmZkX2J5dGUgKmJ1ZjsKLSAgICAgIGJvb2xlYW4gb2s7Ci0KLSAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbC5ob3d0byk7Ci0gICAgICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX3ptYWxsb2MgKHNpemUpOwotICAgICAgaWYgKGJ1ZiA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKHJlbC5ob3d0bywgb3V0cHV0X2JmZCwgYWRkZW5kLCBidWYpOwotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoaW5mbywKLQkJICAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgID8gYmZkX3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgc2VjdGlvbikKLQkJICAgOiBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSksCi0JCSAgcmVsLmhvd3RvLT5uYW1lLCBhZGRlbmQsIChiZmQgKikgTlVMTCwKLQkJICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgewotCSAgICAgIGZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24sIChQVFIpIGJ1ZiwKLQkJCQkgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LCBzaXplKTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICBpZiAoISBvaykKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJlbC5hZGRlbmQgPSAwOwotCi0gIC8qIE1vdmUgdGhlIGluZm9ybWF0aW9uIGludG8gYSBpbnRlcm5hbF9yZWxvYyBzdHJ1Y3R1cmUuICAqLwotICBpbi5yX3ZhZGRyID0gKHJlbC5hZGRyZXNzCi0JCSsgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24pKTsKLSAgaW4ucl90eXBlID0gcmVsLmhvd3RvLT50eXBlOwotCi0gIGlmICh0eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgaW5mbywKLQkJCQkJIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkJCQkgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0gICAgICBpZiAoaCAhPSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAmJiBoLT5pbmR4ICE9IC0xKQotCWluLnJfc3ltbmR4ID0gaC0+aW5keDsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCSAoaW5mbywgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsIChiZmQgKikgTlVMTCwKLQkJICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaW4ucl9zeW1uZHggPSAwOwotCX0KLSAgICAgIGluLnJfZXh0ZXJuID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBDT05TVCBjaGFyICpuYW1lOwotCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIHNlY3Rpb24pOwotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fVEVYVDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1JEQVRBOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmRhdGEiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9EQVRBOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0RBVEE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NCU1M7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fQlNTOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9JTklUOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDgiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ4OwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ0OwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnhkYXRhIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fWERBVEE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucGRhdGEiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9QREFUQTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5maW5pIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fRklOSTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXRhIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUQTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIipBQlMqIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fQUJTOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJjb25zdCIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1JDT05TVDsKLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICAgIGluLnJfZXh0ZXJuID0gMDsKLSAgICB9Ci0KLSAgLyogTGV0IHRoZSBCRkQgYmFja2VuZCBhZGp1c3QgdGhlIHJlbG9jLiAgKi8KLSAgKCplY29mZl9iYWNrZW5kIChvdXRwdXRfYmZkKS0+YWRqdXN0X3JlbG9jX291dCkgKG91dHB1dF9iZmQsICZyZWwsICZpbik7Ci0KLSAgLyogR2V0IHNvbWUgbWVtb3J5IGFuZCBzd2FwIG91dCB0aGUgcmVsb2MuICAqLwotICBleHRlcm5hbF9yZWxvY19zaXplID0gZWNvZmZfYmFja2VuZCAob3V0cHV0X2JmZCktPmV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIHJidWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSk7Ci0gIGlmIChyYnVmID09IChiZmRfYnl0ZSAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAoKmVjb2ZmX2JhY2tlbmQgKG91dHB1dF9iZmQpLT5zd2FwX3JlbG9jX291dCkgKG91dHB1dF9iZmQsICZpbiwgKFBUUikgcmJ1Zik7Ci0KLSAgb2sgPSAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCSAgKG91dHB1dF9zZWN0aW9uLT5yZWxfZmlsZXBvcyArCi0JCSAgIG91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCAqIGV4dGVybmFsX3JlbG9jX3NpemUpLAotCQkgIFNFRUtfU0VUKSA9PSAwCi0JJiYgKGJmZF93cml0ZSAoKFBUUikgcmJ1ZiwgMSwgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSwgb3V0cHV0X2JmZCkKLQkgICAgPT0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZSkpOwotCi0gIGlmIChvaykKLSAgICArK291dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLQotICBmcmVlIChyYnVmKTsKLQotICByZXR1cm4gb2s7Ci19CmRpZmYgLS1naXQgYS9iZmQvZWNvZmZsaW5rLmMgYi9iZmQvZWNvZmZsaW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMjBhMmIuLjAwMDAwMDAKLS0tIGEvYmZkL2Vjb2ZmbGluay5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5OSArMCwwIEBACi0vKiBSb3V0aW5lcyB0byBsaW5rIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgPGlhbkBjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgIm9iamFsbG9jLmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0MCi1zdGF0aWMgYm9vbGVhbiBlY29mZl9hZGRfYnl0ZXMgUEFSQU1TICgoY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkJCQkJc2l6ZV90IG5lZWQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnN0cmluZ19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfYWxpZ25fZGVidWcgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCSAgICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl93cml0ZV9zeW1oZHIgUEFSQU1TICgoYmZkICosIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICosCi0JCQkJCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICosCi0JCQkJCSAgIGZpbGVfcHRyIHdoZXJlKSk7Ci1zdGF0aWMgaW50IGNtcF9mZHJ0YWJfZW50cnkgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIG1rX2ZkcnRhYiBQQVJBTVMgKChiZmQgKiwKLQkJCQkgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QsCi0JCQkJICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0LAotCQkJCSAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqKSk7Ci1zdGF0aWMgbG9uZyBmZHJ0YWJfbG9va3VwIFBBUkFNUyAoKHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gbG9va3VwX2xpbmUKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCwgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqKSk7Ci0MCi0vKiBSb3V0aW5lcyB0byBzd2FwIGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBpbiBhbmQgb3V0LiAgSSBhbSBhc3N1bWluZwotICAgdGhhdCB0aGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIGZvcm1hdCBpcyBhbHdheXMgZ29pbmcgdG8gYmUgdGFyZ2V0Ci0gICBpbmRlcGVuZGVudC4gICovCi0KLS8qIFN3YXAgaW4gYSB0eXBlIGluZm9ybWF0aW9uIHJlY29yZC4KLSAgIEJJR0VORCBzYXlzIHdoZXRoZXIgQVVYIHN5bWJvbHMgYXJlIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbjsgdGhpcwotICAgaW5mbyBjb21lcyBmcm9tIHRoZSBmaWxlIGhlYWRlciByZWNvcmQgKGZoLWZCaWdlbmRpYW4pLiAgKi8KLQotdm9pZAotX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiAoYmlnZW5kLCBleHRfY29weSwgaW50ZXJuKQotICAgICBpbnQgYmlnZW5kOwotICAgICBjb25zdCBzdHJ1Y3QgdGlyX2V4dCAqZXh0X2NvcHk7Ci0gICAgIFRJUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgdGlyX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICpleHRfY29weTsJCS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmlnZW5kKSB7Ci0gICAgaW50ZXJuLT5mQml0ZmllbGQgICA9IDAgIT0gKGV4dC0+dF9iaXRzMVswXSAmIFRJUl9CSVRTMV9GQklURklFTERfQklHKTsKLSAgICBpbnRlcm4tPmNvbnRpbnVlZCAgID0gMCAhPSAoZXh0LT50X2JpdHMxWzBdICYgVElSX0JJVFMxX0NPTlRJTlVFRF9CSUcpOwotICAgIGludGVybi0+YnQgICAgICAgICAgPSAoZXh0LT50X2JpdHMxWzBdICYgVElSX0JJVFMxX0JUX0JJRykKLQkJCT4+CQkgICAgVElSX0JJVFMxX0JUX1NIX0JJRzsKLSAgICBpbnRlcm4tPnRxNCAgICAgICAgID0gKGV4dC0+dF90cTQ1WzBdICYgVElSX0JJVFNfVFE0X0JJRykKLQkJCT4+CQkgICAgVElSX0JJVFNfVFE0X1NIX0JJRzsKLSAgICBpbnRlcm4tPnRxNSAgICAgICAgID0gKGV4dC0+dF90cTQ1WzBdICYgVElSX0JJVFNfVFE1X0JJRykKLQkJCT4+CQkgICAgVElSX0JJVFNfVFE1X1NIX0JJRzsKLSAgICBpbnRlcm4tPnRxMCAgICAgICAgID0gKGV4dC0+dF90cTAxWzBdICYgVElSX0JJVFNfVFEwX0JJRykKLQkJCT4+CQkgICAgVElSX0JJVFNfVFEwX1NIX0JJRzsKLSAgICBpbnRlcm4tPnRxMSAgICAgICAgID0gKGV4dC0+dF90cTAxWzBdICYgVElSX0JJVFNfVFExX0JJRykKLQkJCT4+CQkgICAgVElSX0JJVFNfVFExX1NIX0JJRzsKLSAgICBpbnRlcm4tPnRxMiAgICAgICAgID0gKGV4dC0+dF90cTIzWzBdICYgVElSX0JJVFNfVFEyX0JJRykKLQkJCT4+CQkgICAgVElSX0JJVFNfVFEyX1NIX0JJRzsKLSAgICBpbnRlcm4tPnRxMyAgICAgICAgID0gKGV4dC0+dF90cTIzWzBdICYgVElSX0JJVFNfVFEzX0JJRykKLQkJCT4+CQkgICAgVElSX0JJVFNfVFEzX1NIX0JJRzsKLSAgfSBlbHNlIHsKLSAgICBpbnRlcm4tPmZCaXRmaWVsZCAgID0gMCAhPSAoZXh0LT50X2JpdHMxWzBdICYgVElSX0JJVFMxX0ZCSVRGSUVMRF9MSVRUTEUpOwotICAgIGludGVybi0+Y29udGludWVkICAgPSAwICE9IChleHQtPnRfYml0czFbMF0gJiBUSVJfQklUUzFfQ09OVElOVUVEX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5idCAgICAgICAgICA9IChleHQtPnRfYml0czFbMF0gJiBUSVJfQklUUzFfQlRfTElUVExFKQotCQkJPj4JCSAgICBUSVJfQklUUzFfQlRfU0hfTElUVExFOwotICAgIGludGVybi0+dHE0ICAgICAgICAgPSAoZXh0LT50X3RxNDVbMF0gJiBUSVJfQklUU19UUTRfTElUVExFKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTRfU0hfTElUVExFOwotICAgIGludGVybi0+dHE1ICAgICAgICAgPSAoZXh0LT50X3RxNDVbMF0gJiBUSVJfQklUU19UUTVfTElUVExFKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTVfU0hfTElUVExFOwotICAgIGludGVybi0+dHEwICAgICAgICAgPSAoZXh0LT50X3RxMDFbMF0gJiBUSVJfQklUU19UUTBfTElUVExFKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTBfU0hfTElUVExFOwotICAgIGludGVybi0+dHExICAgICAgICAgPSAoZXh0LT50X3RxMDFbMF0gJiBUSVJfQklUU19UUTFfTElUVExFKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTFfU0hfTElUVExFOwotICAgIGludGVybi0+dHEyICAgICAgICAgPSAoZXh0LT50X3RxMjNbMF0gJiBUSVJfQklUU19UUTJfTElUVExFKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTJfU0hfTElUVExFOwotICAgIGludGVybi0+dHEzICAgICAgICAgPSAoZXh0LT50X3RxMjNbMF0gJiBUSVJfQklUU19UUTNfTElUVExFKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTNfU0hfTElUVExFOwotICB9Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IGEgdHlwZSBpbmZvcm1hdGlvbiByZWNvcmQuCi0gICBCSUdFTkQgc2F5cyB3aGV0aGVyIEFVWCBzeW1ib2xzIGFyZSBiaWctZW5kaWFuIG9yIGxpdHRsZS1lbmRpYW47IHRoaXMKLSAgIGluZm8gY29tZXMgZnJvbSB0aGUgZmlsZSBoZWFkZXIgcmVjb3JkIChmaC1mQmlnZW5kaWFuKS4gICovCi0KLXZvaWQKLV9iZmRfZWNvZmZfc3dhcF90aXJfb3V0IChiaWdlbmQsIGludGVybl9jb3B5LCBleHQpCi0gICAgIGludCBiaWdlbmQ7Ci0gICAgIGNvbnN0IFRJUiAqaW50ZXJuX2NvcHk7Ci0gICAgIHN0cnVjdCB0aXJfZXh0ICpleHQ7Ci17Ci0gIFRJUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiaWdlbmQpIHsKLSAgICBleHQtPnRfYml0czFbMF0gPSAoKGludGVybi0+ZkJpdGZpZWxkID8gVElSX0JJVFMxX0ZCSVRGSUVMRF9CSUcgOiAwKQotCQkgICAgICAgfCAoaW50ZXJuLT5jb250aW51ZWQgPyBUSVJfQklUUzFfQ09OVElOVUVEX0JJRyA6IDApCi0JCSAgICAgICB8ICgoaW50ZXJuLT5idCA8PCBUSVJfQklUUzFfQlRfU0hfQklHKQotCQkJICAmIFRJUl9CSVRTMV9CVF9CSUcpKTsKLSAgICBleHQtPnRfdHE0NVswXSA9ICgoKGludGVybi0+dHE0IDw8IFRJUl9CSVRTX1RRNF9TSF9CSUcpCi0JCSAgICAgICAmIFRJUl9CSVRTX1RRNF9CSUcpCi0JCSAgICAgIHwgKChpbnRlcm4tPnRxNSA8PCBUSVJfQklUU19UUTVfU0hfQklHKQotCQkJICYgVElSX0JJVFNfVFE1X0JJRykpOwotICAgIGV4dC0+dF90cTAxWzBdID0gKCgoaW50ZXJuLT50cTAgPDwgVElSX0JJVFNfVFEwX1NIX0JJRykKLQkJICAgICAgICYgVElSX0JJVFNfVFEwX0JJRykKLQkJICAgICAgfCAoKGludGVybi0+dHExIDw8IFRJUl9CSVRTX1RRMV9TSF9CSUcpCi0JCQkgJiBUSVJfQklUU19UUTFfQklHKSk7Ci0gICAgZXh0LT50X3RxMjNbMF0gPSAoKChpbnRlcm4tPnRxMiA8PCBUSVJfQklUU19UUTJfU0hfQklHKQotCQkgICAgICAgJiBUSVJfQklUU19UUTJfQklHKQotCQkgICAgICB8ICgoaW50ZXJuLT50cTMgPDwgVElSX0JJVFNfVFEzX1NIX0JJRykKLQkJCSAmIFRJUl9CSVRTX1RRM19CSUcpKTsKLSAgfSBlbHNlIHsKLSAgICBleHQtPnRfYml0czFbMF0gPSAoKGludGVybi0+ZkJpdGZpZWxkID8gVElSX0JJVFMxX0ZCSVRGSUVMRF9MSVRUTEUgOiAwKQotCQkgICAgICAgfCAoaW50ZXJuLT5jb250aW51ZWQgPyBUSVJfQklUUzFfQ09OVElOVUVEX0xJVFRMRSA6IDApCi0JCSAgICAgICB8ICgoaW50ZXJuLT5idCA8PCBUSVJfQklUUzFfQlRfU0hfTElUVExFKQotCQkJICAmIFRJUl9CSVRTMV9CVF9MSVRUTEUpKTsKLSAgICBleHQtPnRfdHE0NVswXSA9ICgoKGludGVybi0+dHE0IDw8IFRJUl9CSVRTX1RRNF9TSF9MSVRUTEUpCi0JCSAgICAgICAmIFRJUl9CSVRTX1RRNF9MSVRUTEUpCi0JCSAgICAgIHwgKChpbnRlcm4tPnRxNSA8PCBUSVJfQklUU19UUTVfU0hfTElUVExFKQotCQkJICYgVElSX0JJVFNfVFE1X0xJVFRMRSkpOwotICAgIGV4dC0+dF90cTAxWzBdID0gKCgoaW50ZXJuLT50cTAgPDwgVElSX0JJVFNfVFEwX1NIX0xJVFRMRSkKLQkJICAgICAgICYgVElSX0JJVFNfVFEwX0xJVFRMRSkKLQkJICAgICAgfCAoKGludGVybi0+dHExIDw8IFRJUl9CSVRTX1RRMV9TSF9MSVRUTEUpCi0JCQkgJiBUSVJfQklUU19UUTFfTElUVExFKSk7Ci0gICAgZXh0LT50X3RxMjNbMF0gPSAoKChpbnRlcm4tPnRxMiA8PCBUSVJfQklUU19UUTJfU0hfTElUVExFKQotCQkgICAgICAgJiBUSVJfQklUU19UUTJfTElUVExFKQotCQkgICAgICB8ICgoaW50ZXJuLT50cTMgPDwgVElSX0JJVFNfVFEzX1NIX0xJVFRMRSkKLQkJCSAmIFRJUl9CSVRTX1RRM19MSVRUTEUpKTsKLSAgfQotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIGluIGEgcmVsYXRpdmUgc3ltYm9sIHJlY29yZC4gIEJJR0VORCBzYXlzIHdoZXRoZXIgaXQgaXMgaW4KLSAgIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbiBmb3JtYXQuKi8KLQotdm9pZAotX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4gKGJpZ2VuZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgaW50IGJpZ2VuZDsKLSAgICAgY29uc3Qgc3RydWN0IHJuZHhfZXh0ICpleHRfY29weTsKLSAgICAgUk5EWFIgKmludGVybjsKLXsKLSAgc3RydWN0IHJuZHhfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKmV4dF9jb3B5OwkJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiaWdlbmQpIHsKLSAgICBpbnRlcm4tPnJmZCAgID0gKGV4dC0+cl9iaXRzWzBdIDw8IFJORFhfQklUUzBfUkZEX1NIX0xFRlRfQklHKQotCQkgIHwgKChleHQtPnJfYml0c1sxXSAmIFJORFhfQklUUzFfUkZEX0JJRykKLQkJICAgIAkJICAgID4+IFJORFhfQklUUzFfUkZEX1NIX0JJRyk7Ci0gICAgaW50ZXJuLT5pbmRleCA9ICgoZXh0LT5yX2JpdHNbMV0gJiBSTkRYX0JJVFMxX0lOREVYX0JJRykKLQkJICAgIAkJICAgIDw8IFJORFhfQklUUzFfSU5ERVhfU0hfTEVGVF9CSUcpCi0JCSAgfCAoZXh0LT5yX2JpdHNbMl0gPDwgUk5EWF9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRykKLQkJICB8IChleHQtPnJfYml0c1szXSA8PCBSTkRYX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHKTsKLSAgfSBlbHNlIHsKLSAgICBpbnRlcm4tPnJmZCAgID0gKGV4dC0+cl9iaXRzWzBdIDw8IFJORFhfQklUUzBfUkZEX1NIX0xFRlRfTElUVExFKQotCQkgIHwgKChleHQtPnJfYml0c1sxXSAmIFJORFhfQklUUzFfUkZEX0xJVFRMRSkKLQkJICAgIAkJICAgIDw8IFJORFhfQklUUzFfUkZEX1NIX0xFRlRfTElUVExFKTsKLSAgICBpbnRlcm4tPmluZGV4ID0gKChleHQtPnJfYml0c1sxXSAmIFJORFhfQklUUzFfSU5ERVhfTElUVExFKQotCQkgICAgCQkgICAgPj4gUk5EWF9CSVRTMV9JTkRFWF9TSF9MSVRUTEUpCi0JCSAgfCAoZXh0LT5yX2JpdHNbMl0gPDwgUk5EWF9CSVRTMl9JTkRFWF9TSF9MRUZUX0xJVFRMRSkKLQkJICB8ICgodW5zaWduZWQgaW50KSBleHQtPnJfYml0c1szXQotCQkgICAgIDw8IFJORFhfQklUUzNfSU5ERVhfU0hfTEVGVF9MSVRUTEUpOwotICB9Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IGEgcmVsYXRpdmUgc3ltYm9sIHJlY29yZC4gIEJJR0VORCBzYXlzIHdoZXRoZXIgaXQgaXMgaW4KLSAgIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbiBmb3JtYXQuKi8KLQotdm9pZAotX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0IChiaWdlbmQsIGludGVybl9jb3B5LCBleHQpCi0gICAgIGludCBiaWdlbmQ7Ci0gICAgIGNvbnN0IFJORFhSICppbnRlcm5fY29weTsKLSAgICAgc3RydWN0IHJuZHhfZXh0ICpleHQ7Ci17Ci0gIFJORFhSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJpZ2VuZCkgewotICAgIGV4dC0+cl9iaXRzWzBdID0gaW50ZXJuLT5yZmQgPj4gUk5EWF9CSVRTMF9SRkRfU0hfTEVGVF9CSUc7Ci0gICAgZXh0LT5yX2JpdHNbMV0gPSAoKChpbnRlcm4tPnJmZCA8PCBSTkRYX0JJVFMxX1JGRF9TSF9CSUcpCi0JCSAgICAgICAmIFJORFhfQklUUzFfUkZEX0JJRykKLQkJICAgICAgfCAoKGludGVybi0+aW5kZXggPj4gUk5EWF9CSVRTMV9JTkRFWF9TSF9MRUZUX0JJRykKLQkJCSAmIFJORFhfQklUUzFfSU5ERVhfQklHKSk7Ci0gICAgZXh0LT5yX2JpdHNbMl0gPSBpbnRlcm4tPmluZGV4ID4+IFJORFhfQklUUzJfSU5ERVhfU0hfTEVGVF9CSUc7Ci0gICAgZXh0LT5yX2JpdHNbM10gPSBpbnRlcm4tPmluZGV4ID4+IFJORFhfQklUUzNfSU5ERVhfU0hfTEVGVF9CSUc7Ci0gIH0gZWxzZSB7Ci0gICAgZXh0LT5yX2JpdHNbMF0gPSBpbnRlcm4tPnJmZCA+PiBSTkRYX0JJVFMwX1JGRF9TSF9MRUZUX0xJVFRMRTsKLSAgICBleHQtPnJfYml0c1sxXSA9ICgoKGludGVybi0+cmZkID4+IFJORFhfQklUUzFfUkZEX1NIX0xFRlRfTElUVExFKQotCQkgICAgICAgJiBSTkRYX0JJVFMxX1JGRF9MSVRUTEUpCi0JCSAgICAgIHwgKChpbnRlcm4tPmluZGV4IDw8IFJORFhfQklUUzFfSU5ERVhfU0hfTElUVExFKQotCQkJICYgUk5EWF9CSVRTMV9JTkRFWF9MSVRUTEUpKTsKLSAgICBleHQtPnJfYml0c1syXSA9IGludGVybi0+aW5kZXggPj4gUk5EWF9CSVRTMl9JTkRFWF9TSF9MRUZUX0xJVFRMRTsKLSAgICBleHQtPnJfYml0c1szXSA9IGludGVybi0+aW5kZXggPj4gUk5EWF9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRTsKLSAgfQotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotDAotLyogVGhlIG1pbmltdW0gYW1vdW50IG9mIGRhdGEgdG8gYWxsb2NhdGUuICAqLwotI2RlZmluZSBBTExPQ19TSVpFICg0MDY0KQotCi0vKiBBZGQgYnl0ZXMgdG8gYSBidWZmZXIuICBSZXR1cm4gc3VjY2Vzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLCBuZWVkKQotICAgICBjaGFyICoqYnVmOwotICAgICBjaGFyICoqYnVmZW5kOwotICAgICBzaXplX3QgbmVlZDsKLXsKLSAgc2l6ZV90IGhhdmU7Ci0gIHNpemVfdCB3YW50OwotICBjaGFyICpuZXdidWY7Ci0KLSAgaGF2ZSA9ICpidWZlbmQgLSAqYnVmOwotICBpZiAoaGF2ZSA+IG5lZWQpCi0gICAgd2FudCA9IEFMTE9DX1NJWkU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3YW50ID0gbmVlZCAtIGhhdmU7Ci0gICAgICBpZiAod2FudCA8IEFMTE9DX1NJWkUpCi0Jd2FudCA9IEFMTE9DX1NJWkU7Ci0gICAgfQotICBuZXdidWYgPSAoY2hhciAqKSBiZmRfcmVhbGxvYyAoKmJ1ZiwgaGF2ZSArIHdhbnQpOwotICBpZiAobmV3YnVmID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICAqYnVmID0gbmV3YnVmOwotICAqYnVmZW5kID0gKmJ1ZiArIGhhdmUgKyB3YW50OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2Uga2VlcCBhIGhhc2ggdGFibGUgd2hpY2ggbWFwcyBzdHJpbmdzIHRvIG51bWJlcnMuICBXZSB1c2UgaXQgdG8KLSAgIG1hcCBGRFIgbmFtZXMgdG8gaW5kaWNlcyBpbiB0aGUgb3V0cHV0IGZpbGUsIGFuZCB0byBtYXAgbG9jYWwKLSAgIHN0cmluZ3Mgd2hlbiBjb21iaW5pbmcgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICAvKiBGRFIgaW5kZXggb3Igc3RyaW5nIHRhYmxlIG9mZnNldC4gICovCi0gIGxvbmcgdmFsOwotICAvKiBOZXh0IGVudHJ5IGluIHN0cmluZyB0YWJsZS4gICovCi0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqbmV4dDsKLX07Ci0KLXN0cnVjdCBzdHJpbmdfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgdGFibGU7Ci19OwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhIHN0cmluZyBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1zdHJpbmdfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+dmFsID0gLTE7Ci0gICAgICByZXQtPm5leHQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gc3RyaW5nIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIHN0cmluZ19oYXNoX2xvb2t1cCh0LCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodCktPnRhYmxlLCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIFdlIGNhbid0IGFmZm9yZCB0byByZWFkIGluIGFsbCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoZW4gd2UgZG8KLSAgIGEgbGluay4gIEluc3RlYWQsIHdlIGJ1aWxkIGEgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIHRvIHNob3cgaG93Ci0gICBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGlucHV0IGZpbGUgbWFwIHRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLXN0cnVjdCBzaHVmZmxlCi17Ci0gIC8qIFRoZSBuZXh0IGVudHJ5IGluIHRoaXMgbGlua2VkIGxpc3QuICAqLwotICBzdHJ1Y3Qgc2h1ZmZsZSAqbmV4dDsKLSAgLyogVGhlIGxlbmd0aCBvZiB0aGUgaW5mb3JtYXRpb24uICAqLwotICB1bnNpZ25lZCBsb25nIHNpemU7Ci0gIC8qIFdoZXRoZXIgdGhpcyBpbmZvcm1hdGlvbiBjb21lcyBmcm9tIGEgZmlsZSBvciBub3QuICAqLwotICBib29sZWFuIGZpbGVwOwotICB1bmlvbgotICAgIHsKLSAgICAgIHN0cnVjdAotCXsKLQkgIC8qIFRoZSBCRkQgdGhlIGRhdGEgY29tZXMgZnJvbS4gICovCi0JICBiZmQgKmlucHV0X2JmZDsKLQkgIC8qIFRoZSBvZmZzZXQgd2l0aGluIGlucHV0X2JmZC4gICovCi0JICBmaWxlX3B0ciBvZmZzZXQ7Ci0JfSBmaWxlOwotICAgICAgLyogVGhlIGRhdGEgdG8gYmUgd3JpdHRlbiBvdXQuICAqLwotICAgICAgUFRSIG1lbW9yeTsKLSAgICB9IHU7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBhY3Jvc3MgY2FsbHMgdG8KLSAgIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlLiAgKi8KLQotc3RydWN0IGFjY3VtdWxhdGUKLXsKLSAgLyogVGhlIEZEUiBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IHN0cmluZ19oYXNoX3RhYmxlIGZkcl9oYXNoOwotICAvKiBUaGUgc3RyaW5ncyBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IHN0cmluZ19oYXNoX3RhYmxlIHN0cl9oYXNoOwotICAvKiBMaW5rZWQgbGlzdHMgZGVzY3JpYmluZyBob3cgdG8gc2h1ZmZsZSB0aGUgaW5wdXQgZGVidWcKLSAgICAgaW5mb3JtYXRpb24gaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBrZWVwIGEgcG9pbnRlciB0byBib3RoIHRoZQotICAgICBoZWFkIGFuZCB0aGUgdGFpbC4gICovCi0gIHN0cnVjdCBzaHVmZmxlICpsaW5lOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqbGluZV9lbmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpwZHI7Ci0gIHN0cnVjdCBzaHVmZmxlICpwZHJfZW5kOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqc3ltOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqc3ltX2VuZDsKLSAgc3RydWN0IHNodWZmbGUgKm9wdDsKLSAgc3RydWN0IHNodWZmbGUgKm9wdF9lbmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICphdXg7Ci0gIHN0cnVjdCBzaHVmZmxlICphdXhfZW5kOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqc3M7Ci0gIHN0cnVjdCBzaHVmZmxlICpzc19lbmQ7Ci0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqc3NfaGFzaDsKLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzc19oYXNoX2VuZDsKLSAgc3RydWN0IHNodWZmbGUgKmZkcjsKLSAgc3RydWN0IHNodWZmbGUgKmZkcl9lbmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpyZmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpyZmRfZW5kOwotICAvKiBUaGUgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBmaWxlIHNodWZmbGUuICAqLwotICB1bnNpZ25lZCBsb25nIGxhcmdlc3RfZmlsZV9zaHVmZmxlOwotICAvKiBBbiBvYmphbGxvYyBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IG9iamFsbG9jICptZW1vcnk7Ci19OwotCi0vKiBBZGQgYSBmaWxlIGVudHJ5IHRvIGEgc2h1ZmZsZSBsaXN0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4gYWRkX2ZpbGVfc2h1ZmZsZSBQQVJBTVMgKChzdHJ1Y3QgYWNjdW11bGF0ZSAqLAotCQkJCSAgICAgIHN0cnVjdCBzaHVmZmxlICoqLAotCQkJCSAgICAgIHN0cnVjdCBzaHVmZmxlICoqLCBiZmQgKiwgZmlsZV9wdHIsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZykpOwotCi1zdGF0aWMgYm9vbGVhbgotYWRkX2ZpbGVfc2h1ZmZsZSAoYWluZm8sIGhlYWQsIHRhaWwsIGlucHV0X2JmZCwgb2Zmc2V0LCBzaXplKQotICAgICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm87Ci0gICAgIHN0cnVjdCBzaHVmZmxlICoqaGVhZDsKLSAgICAgc3RydWN0IHNodWZmbGUgKip0YWlsOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICB1bnNpZ25lZCBsb25nIHNpemU7Ci17Ci0gIHN0cnVjdCBzaHVmZmxlICpuOwotCi0gIGlmICgqdGFpbCAhPSAoc3RydWN0IHNodWZmbGUgKikgTlVMTAotICAgICAgJiYgKCp0YWlsKS0+ZmlsZXAKLSAgICAgICYmICgqdGFpbCktPnUuZmlsZS5pbnB1dF9iZmQgPT0gaW5wdXRfYmZkCi0gICAgICAmJiAoKnRhaWwpLT51LmZpbGUub2Zmc2V0ICsgKCp0YWlsKS0+c2l6ZSA9PSAodW5zaWduZWQgbG9uZykgb2Zmc2V0KQotICAgIHsKLSAgICAgIC8qIEp1c3QgbWVyZ2UgdGhpcyBlbnRyeSBvbnRvIHRoZSBleGlzdGluZyBvbmUuICAqLwotICAgICAgKCp0YWlsKS0+c2l6ZSArPSBzaXplOwotICAgICAgaWYgKCgqdGFpbCktPnNpemUgPiBhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUpCi0JYWluZm8tPmxhcmdlc3RfZmlsZV9zaHVmZmxlID0gKCp0YWlsKS0+c2l6ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBuID0gKHN0cnVjdCBzaHVmZmxlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LAotCQkJCQkgc2l6ZW9mIChzdHJ1Y3Qgc2h1ZmZsZSkpOwotICBpZiAoIW4pCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBuLT5uZXh0ID0gTlVMTDsKLSAgbi0+c2l6ZSA9IHNpemU7Ci0gIG4tPmZpbGVwID0gdHJ1ZTsKLSAgbi0+dS5maWxlLmlucHV0X2JmZCA9IGlucHV0X2JmZDsKLSAgbi0+dS5maWxlLm9mZnNldCA9IG9mZnNldDsKLSAgaWYgKCpoZWFkID09IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKQotICAgICpoZWFkID0gbjsKLSAgaWYgKCp0YWlsICE9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKQotICAgICgqdGFpbCktPm5leHQgPSBuOwotICAqdGFpbCA9IG47Ci0gIGlmIChzaXplID4gYWluZm8tPmxhcmdlc3RfZmlsZV9zaHVmZmxlKQotICAgIGFpbmZvLT5sYXJnZXN0X2ZpbGVfc2h1ZmZsZSA9IHNpemU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSBtZW1vcnkgZW50cnkgdG8gYSBzaHVmZmxlIGxpc3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBhZGRfbWVtb3J5X3NodWZmbGUgUEFSQU1TICgoc3RydWN0IGFjY3VtdWxhdGUgKiwKLQkJCQkJICAgc3RydWN0IHNodWZmbGUgKipoZWFkLAotCQkJCQkgICBzdHJ1Y3Qgc2h1ZmZsZSAqKnRhaWwsCi0JCQkJCSAgIGJmZF9ieXRlICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpKTsKLQotc3RhdGljIGJvb2xlYW4KLWFkZF9tZW1vcnlfc2h1ZmZsZSAoYWluZm8sIGhlYWQsIHRhaWwsIGRhdGEsIHNpemUpCi0gICAgIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbzsKLSAgICAgc3RydWN0IHNodWZmbGUgKipoZWFkOwotICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqKnRhaWw7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIHNpemU7Ci17Ci0gIHN0cnVjdCBzaHVmZmxlICpuOwotICAgICAKLSAgbiA9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwKLQkJCQkJIHNpemVvZiAoc3RydWN0IHNodWZmbGUpKTsKLSAgaWYgKCFuKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgbi0+bmV4dCA9IE5VTEw7Ci0gIG4tPnNpemUgPSBzaXplOwotICBuLT5maWxlcCA9IGZhbHNlOwotICBuLT51Lm1lbW9yeSA9IChQVFIpIGRhdGE7Ci0gIGlmICgqaGVhZCA9PSAoc3RydWN0IHNodWZmbGUgKikgTlVMTCkKLSAgICAqaGVhZCA9IG47Ci0gIGlmICgqdGFpbCAhPSAoc3RydWN0IHNodWZmbGUgKikgTlVMTCkKLSAgICAoKnRhaWwpLT5uZXh0ID0gbjsKLSAgKnRhaWwgPSBuOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSW5pdGlhbGl6ZSB0aGUgRkRSIGhhc2ggdGFibGUuICBUaGlzIHJldHVybnMgYSBoYW5kbGUgd2hpY2ggaXMgdGhlbgotICAgcGFzc2VkIGluIHRvIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlLCBldC4gYWwuICAqLwotCi0vKkFSR1NVU0VEKi8KLVBUUgotYmZkX2Vjb2ZmX2RlYnVnX2luaXQgKG91dHB1dF9iZmQsIG91dHB1dF9kZWJ1Zywgb3V0cHV0X3N3YXAsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvOwotCi0gIGFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGFjY3VtdWxhdGUpKTsKLSAgaWYgKCFhaW5mbykKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdF9uICgmYWluZm8tPmZkcl9oYXNoLnRhYmxlLCBzdHJpbmdfaGFzaF9uZXdmdW5jLAotCQkJICAgICAgIDEwMjEpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGFpbmZvLT5saW5lID0gTlVMTDsKLSAgYWluZm8tPmxpbmVfZW5kID0gTlVMTDsKLSAgYWluZm8tPnBkciA9IE5VTEw7Ci0gIGFpbmZvLT5wZHJfZW5kID0gTlVMTDsKLSAgYWluZm8tPnN5bSA9IE5VTEw7Ci0gIGFpbmZvLT5zeW1fZW5kID0gTlVMTDsKLSAgYWluZm8tPm9wdCA9IE5VTEw7Ci0gIGFpbmZvLT5vcHRfZW5kID0gTlVMTDsKLSAgYWluZm8tPmF1eCA9IE5VTEw7Ci0gIGFpbmZvLT5hdXhfZW5kID0gTlVMTDsKLSAgYWluZm8tPnNzID0gTlVMTDsKLSAgYWluZm8tPnNzX2VuZCA9IE5VTEw7Ci0gIGFpbmZvLT5zc19oYXNoID0gTlVMTDsKLSAgYWluZm8tPnNzX2hhc2hfZW5kID0gTlVMTDsKLSAgYWluZm8tPmZkciA9IE5VTEw7Ci0gIGFpbmZvLT5mZHJfZW5kID0gTlVMTDsKLSAgYWluZm8tPnJmZCA9IE5VTEw7Ci0gIGFpbmZvLT5yZmRfZW5kID0gTlVMTDsKLQotICBhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUgPSAwOwotCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0ICgmYWluZm8tPnN0cl9oYXNoLnRhYmxlLCBzdHJpbmdfaGFzaF9uZXdmdW5jKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgLyogVGhlIGZpcnN0IGVudHJ5IGluIHRoZSBzdHJpbmcgdGFibGUgaXMgdGhlIGVtcHR5IHN0cmluZy4gICovCi0gICAgICBvdXRwdXRfZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NNYXggPSAxOwotICAgIH0KLQotICBhaW5mby0+bWVtb3J5ID0gb2JqYWxsb2NfY3JlYXRlICgpOwotICBpZiAoYWluZm8tPm1lbW9yeSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoUFRSKSBhaW5mbzsKLX0KLQotLyogRnJlZSB0aGUgYWNjdW11bGF0ZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi12b2lkCi1iZmRfZWNvZmZfZGVidWdfZnJlZSAoaGFuZGxlLCBvdXRwdXRfYmZkLCBvdXRwdXRfZGVidWcsIG91dHB1dF9zd2FwLCBpbmZvKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0gIAotICBiZmRfaGFzaF90YWJsZV9mcmVlICgmYWluZm8tPmZkcl9oYXNoLnRhYmxlKTsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJmFpbmZvLT5zdHJfaGFzaC50YWJsZSk7Ci0KLSAgb2JqYWxsb2NfZnJlZSAoYWluZm8tPm1lbW9yeSk7Ci0KLSAgZnJlZSAoYWluZm8pOwotfQotCi0vKiBBY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBJTlBVVF9CRkQgaW50bwotICAgT1VUUFVUX0JGRC4gIFRoZSBJTlBVVF9ERUJVRyBhcmd1bWVudCBwb2ludHMgdG8gc29tZSBFQ09GRgotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoaWNoIHdlIHdhbnQgdG8gbGluayBpbnRvIHRoZSBpbmZvcm1hdGlvbgotICAgcG9pbnRlZCB0byBieSB0aGUgT1VUUFVUX0RFQlVHIGFyZ3VtZW50LiAgT1VUUFVUX1NXQVAgYW5kCi0gICBJTlBVVF9TV0FQIHBvaW50IHRvIHRoZSBzd2FwcGluZyBpbmZvcm1hdGlvbiBuZWVkZWQuICBJTkZPIGlzIHRoZQotICAgbGlua2VyIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gIEhBTkRMRSBpcyByZXR1cm5lZCBieQotICAgYmZkX2Vjb2ZmX2RlYnVnX2luaXQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlIChoYW5kbGUsIG91dHB1dF9iZmQsIG91dHB1dF9kZWJ1Zywgb3V0cHV0X3N3YXAsCi0JCQkgICAgaW5wdXRfYmZkLCBpbnB1dF9kZWJ1ZywgaW5wdXRfc3dhcCwKLQkJCSAgICBpbmZvKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICppbnB1dF9kZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmlucHV0X3N3YXA7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOwotICB2b2lkICgqIGNvbnN0IHN3YXBfc3ltX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBTWU1SICopKQotICAgID0gaW5wdXRfc3dhcC0+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+aWV4dE1heCArIDEpICogZXh0ZXJuYWxfZXh0X3NpemUpCi0JICA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVzeW0tPmFzeW0uaXNzID0gc3ltaGRyLT5pc3NFeHRNYXg7Ci0KLSAgKCpzd2FwX2V4dF9vdXQpIChhYmZkLCBlc3ltLAotCQkgICAoKGNoYXIgKikgZGVidWctPmV4dGVybmFsX2V4dAotCQkgICAgKyBzeW1oZHItPmlleHRNYXggKiBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSkpOwotCi0gICsrc3ltaGRyLT5pZXh0TWF4OwotCi0gIHN0cmNweSAoZGVidWctPnNzZXh0ICsgc3ltaGRyLT5pc3NFeHRNYXgsIG5hbWUpOwotICBzeW1oZHItPmlzc0V4dE1heCArPSBuYW1lbGVuICsgMTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWxpZ24gdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLWVjb2ZmX2FsaWduX2RlYnVnIChhYmZkLCBkZWJ1Zywgc3dhcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotewotICBIRFJSICogY29uc3Qgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gIGJmZF9zaXplX3R5cGUgZGVidWdfYWxpZ24sIGF1eF9hbGlnbiwgcmZkX2FsaWduOwotICBzaXplX3QgYWRkOwotCi0gIC8qIEFkanVzdCB0aGUgY291bnRzIHNvIHRoYXQgc3RydWN0dXJlcyBhcmUgYWxpZ25lZC4gICovCi0gIGRlYnVnX2FsaWduID0gc3dhcC0+ZGVidWdfYWxpZ247Ci0gIGF1eF9hbGlnbiA9IGRlYnVnX2FsaWduIC8gc2l6ZW9mICh1bmlvbiBhdXhfZXh0KTsKLSAgcmZkX2FsaWduID0gZGVidWdfYWxpZ24gLyBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZTsKLQotICBhZGQgPSBkZWJ1Z19hbGlnbiAtIChzeW1oZHItPmNiTGluZSAmIChkZWJ1Z19hbGlnbiAtIDEpKTsKLSAgaWYgKGFkZCAhPSBkZWJ1Z19hbGlnbikKLSAgICB7Ci0gICAgICBpZiAoZGVidWctPmxpbmUgIT0gKHVuc2lnbmVkIGNoYXIgKikgTlVMTCkKLQltZW1zZXQgKChQVFIpIChkZWJ1Zy0+bGluZSArIHN5bWhkci0+Y2JMaW5lKSwgMCwgYWRkKTsKLSAgICAgIHN5bWhkci0+Y2JMaW5lICs9IGFkZDsKLSAgICB9Ci0KLSAgYWRkID0gZGVidWdfYWxpZ24gLSAoc3ltaGRyLT5pc3NNYXggJiAoZGVidWdfYWxpZ24gLSAxKSk7Ci0gIGlmIChhZGQgIT0gZGVidWdfYWxpZ24pCi0gICAgewotICAgICAgaWYgKGRlYnVnLT5zcyAhPSAoY2hhciAqKSBOVUxMKQotCW1lbXNldCAoKFBUUikgKGRlYnVnLT5zcyArIHN5bWhkci0+aXNzTWF4KSwgMCwgYWRkKTsKLSAgICAgIHN5bWhkci0+aXNzTWF4ICs9IGFkZDsKLSAgICB9Ci0KLSAgYWRkID0gZGVidWdfYWxpZ24gLSAoc3ltaGRyLT5pc3NFeHRNYXggJiAoZGVidWdfYWxpZ24gLSAxKSk7Ci0gIGlmIChhZGQgIT0gZGVidWdfYWxpZ24pCi0gICAgewotICAgICAgaWYgKGRlYnVnLT5zc2V4dCAhPSAoY2hhciAqKSBOVUxMKQotCW1lbXNldCAoKFBUUikgKGRlYnVnLT5zc2V4dCArIHN5bWhkci0+aXNzRXh0TWF4KSwgMCwgYWRkKTsKLSAgICAgIHN5bWhkci0+aXNzRXh0TWF4ICs9IGFkZDsKLSAgICB9Ci0KLSAgYWRkID0gYXV4X2FsaWduIC0gKHN5bWhkci0+aWF1eE1heCAmIChhdXhfYWxpZ24gLSAxKSk7Ci0gIGlmIChhZGQgIT0gYXV4X2FsaWduKQotICAgIHsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ICE9ICh1bmlvbiBhdXhfZXh0ICopIE5VTEwpCi0JbWVtc2V0ICgoUFRSKSAoZGVidWctPmV4dGVybmFsX2F1eCArIHN5bWhkci0+aWF1eE1heCksIDAsCi0JCWFkZCAqIHNpemVvZiAodW5pb24gYXV4X2V4dCkpOwotICAgICAgc3ltaGRyLT5pYXV4TWF4ICs9IGFkZDsKLSAgICB9Ci0KLSAgYWRkID0gcmZkX2FsaWduIC0gKHN5bWhkci0+Y3JmZCAmIChyZmRfYWxpZ24gLSAxKSk7Ci0gIGlmIChhZGQgIT0gcmZkX2FsaWduKQotICAgIHsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkICE9IChQVFIpIE5VTEwpCi0JbWVtc2V0ICgoUFRSKSAoKGNoYXIgKikgZGVidWctPmV4dGVybmFsX3JmZAotCQkgICAgICAgKyBzeW1oZHItPmNyZmQgKiBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSksCi0JCTAsIChzaXplX3QpIChhZGQgKiBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSkpOwotICAgICAgc3ltaGRyLT5jcmZkICs9IGFkZDsKLSAgICB9Ci19Ci0KLS8qIFJldHVybiB0aGUgc2l6ZSByZXF1aXJlZCBieSB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotYmZkX3NpemVfdHlwZQotYmZkX2Vjb2ZmX2RlYnVnX3NpemUgKGFiZmQsIGRlYnVnLCBzd2FwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci17Ci0gIGJmZF9zaXplX3R5cGUgdG90OwotCi0gIGVjb2ZmX2FsaWduX2RlYnVnIChhYmZkLCBkZWJ1Zywgc3dhcCk7Ci0gIHRvdCA9IHN3YXAtPmV4dGVybmFsX2hkcl9zaXplOwotCi0jZGVmaW5lIEFERChjb3VudCwgc2l6ZSkgXAotICB0b3QgKz0gZGVidWctPnN5bWJvbGljX2hlYWRlci5jb3VudCAqIHNpemUKLQotICBBREQgKGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSk7Ci0gIEFERCAoaWRuTWF4LCBzd2FwLT5leHRlcm5hbF9kbnJfc2l6ZSk7Ci0gIEFERCAoaXBkTWF4LCBzd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSk7Ci0gIEFERCAoaXN5bU1heCwgc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOwotICBBREQgKGlvcHRNYXgsIHN3YXAtPmV4dGVybmFsX29wdF9zaXplKTsKLSAgQUREIChpYXV4TWF4LCBzaXplb2YgKHVuaW9uIGF1eF9leHQpKTsKLSAgQUREIChpc3NNYXgsIHNpemVvZiAoY2hhcikpOwotICBBREQgKGlzc0V4dE1heCwgc2l6ZW9mIChjaGFyKSk7Ci0gIEFERCAoaWZkTWF4LCBzd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSk7Ci0gIEFERCAoY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpOwotICBBREQgKGlleHRNYXgsIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplKTsKLQotI3VuZGVmIEFERAotCi0gIHJldHVybiB0b3Q7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgRUNPRkYgc3ltYm9saWMgaGVhZGVyLCBnaXZlbiB0aGUgZmlsZSBwb3NpdGlvbiBpdCBpcwotICAgZ29pbmcgdG8gYmUgcGxhY2VkIGF0LiAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGNvdW50cyBhcmUgc2V0Ci0gICBjb3JyZWN0bHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfd3JpdGVfc3ltaGRyIChhYmZkLCBkZWJ1Zywgc3dhcCwgd2hlcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgICAgZmlsZV9wdHIgd2hlcmU7Ci17Ci0gIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgY2hhciAqYnVmZiA9IE5VTEw7Ci0KLSAgZWNvZmZfYWxpZ25fZGVidWcgKGFiZmQsIGRlYnVnLCBzd2FwKTsKLQotICAvKiBHbyB0byB0aGUgcmlnaHQgbG9jYXRpb24gaW4gdGhlIGZpbGUuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHdoZXJlLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgd2hlcmUgKz0gc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemU7Ci0KLSAgc3ltaGRyLT5tYWdpYyA9IHN3YXAtPnN5bV9tYWdpYzsKLQotICAvKiBGaWxsIGluIHRoZSBmaWxlIG9mZnNldHMuICAqLwotI2RlZmluZSBTRVQob2Zmc2V0LCBjb3VudCwgc2l6ZSkgXAotICBpZiAoc3ltaGRyLT5jb3VudCA9PSAwKSBcCi0gICAgc3ltaGRyLT5vZmZzZXQgPSAwOyBcCi0gIGVsc2UgXAotICAgIHsgXAotICAgICAgc3ltaGRyLT5vZmZzZXQgPSB3aGVyZTsgXAotICAgICAgd2hlcmUgKz0gc3ltaGRyLT5jb3VudCAqIHNpemU7IFwKLSAgICB9Ci0KLSAgU0VUIChjYkxpbmVPZmZzZXQsIGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSk7Ci0gIFNFVCAoY2JEbk9mZnNldCwgaWRuTWF4LCBzd2FwLT5leHRlcm5hbF9kbnJfc2l6ZSk7Ci0gIFNFVCAoY2JQZE9mZnNldCwgaXBkTWF4LCBzd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSk7Ci0gIFNFVCAoY2JTeW1PZmZzZXQsIGlzeW1NYXgsIHN3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKLSAgU0VUIChjYk9wdE9mZnNldCwgaW9wdE1heCwgc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemUpOwotICBTRVQgKGNiQXV4T2Zmc2V0LCBpYXV4TWF4LCBzaXplb2YgKHVuaW9uIGF1eF9leHQpKTsKLSAgU0VUIChjYlNzT2Zmc2V0LCBpc3NNYXgsIHNpemVvZiAoY2hhcikpOwotICBTRVQgKGNiU3NFeHRPZmZzZXQsIGlzc0V4dE1heCwgc2l6ZW9mIChjaGFyKSk7Ci0gIFNFVCAoY2JGZE9mZnNldCwgaWZkTWF4LCBzd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSk7Ci0gIFNFVCAoY2JSZmRPZmZzZXQsIGNyZmQsIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplKTsKLSAgU0VUIChjYkV4dE9mZnNldCwgaWV4dE1heCwgc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpOwotI3VuZGVmIFNFVAotCi0gIGJ1ZmYgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSk7Ci0gIGlmIChidWZmID09IE5VTEwgJiYgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAoKnN3YXAtPnN3YXBfaGRyX291dCkgKGFiZmQsIHN5bWhkciwgYnVmZik7Ci0gIGlmIChiZmRfd3JpdGUgKGJ1ZmYsIDEsIHN3YXAtPmV4dGVybmFsX2hkcl9zaXplLCBhYmZkKQotICAgICAgIT0gc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJ1ZmYgIT0gTlVMTCkKLSAgICBmcmVlIChidWZmKTsKLSAgcmV0dXJuIHRydWU7Ci0gZXJyb3JfcmV0dXJuOgotICBpZiAoYnVmZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1ZmYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBmdW5jdGlvbiBhc3N1bWVzCi0gICB0aGF0IHRoZSBpbmZvcm1hdGlvbiAodGhlIHBvaW50ZXJzIGFuZCBjb3VudHMpIGluICpERUJVRyBoYXZlIGJlZW4KLSAgIHNldCBjb3JyZWN0bHkuICBXSEVSRSBpcyB0aGUgcG9zaXRpb24gaW4gdGhlIGZpbGUgdG8gd3JpdGUgdGhlCi0gICBpbmZvcm1hdGlvbiB0by4gIFRoaXMgZnVuY3Rpb24gZmlsbHMgaW4gdGhlIGZpbGUgb2Zmc2V0cyBpbiB0aGUKLSAgIHN5bWJvbGljIGhlYWRlci4gICovCi0KLWJvb2xlYW4KLWJmZF9lY29mZl93cml0ZV9kZWJ1ZyAoYWJmZCwgZGVidWcsIHN3YXAsIHdoZXJlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gICAgIGZpbGVfcHRyIHdoZXJlOwotewotICBIRFJSICogY29uc3Qgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0KLSAgaWYgKCEgZWNvZmZfd3JpdGVfc3ltaGRyIChhYmZkLCBkZWJ1Zywgc3dhcCwgd2hlcmUpKQotICAgIHJldHVybiBmYWxzZTsKLQotI2RlZmluZSBXUklURShwdHIsIGNvdW50LCBzaXplLCBvZmZzZXQpIFwKLSAgQkZEX0FTU0VSVCAoc3ltaGRyLT5vZmZzZXQgPT0gMCBcCi0JICAgICAgfHwgKGJmZF92bWEpIGJmZF90ZWxsIChhYmZkKSA9PSBzeW1oZHItPm9mZnNldCk7IFwKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgZGVidWctPnB0ciwgc2l6ZSwgc3ltaGRyLT5jb3VudCwgYWJmZCkgXAotICAgICAgIT0gc2l6ZSAqIHN5bWhkci0+Y291bnQpIFwKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgV1JJVEUgKGxpbmUsIGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSwgY2JMaW5lT2Zmc2V0KTsKLSAgV1JJVEUgKGV4dGVybmFsX2RuciwgaWRuTWF4LCBzd2FwLT5leHRlcm5hbF9kbnJfc2l6ZSwgY2JEbk9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9wZHIsIGlwZE1heCwgc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUsIGNiUGRPZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfc3ltLCBpc3ltTWF4LCBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSwgY2JTeW1PZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfb3B0LCBpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSwgY2JPcHRPZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfYXV4LCBpYXV4TWF4LCBzaXplb2YgKHVuaW9uIGF1eF9leHQpLCBjYkF1eE9mZnNldCk7Ci0gIFdSSVRFIChzcywgaXNzTWF4LCBzaXplb2YgKGNoYXIpLCBjYlNzT2Zmc2V0KTsKLSAgV1JJVEUgKHNzZXh0LCBpc3NFeHRNYXgsIHNpemVvZiAoY2hhciksIGNiU3NFeHRPZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfZmRyLCBpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplLCBjYkZkT2Zmc2V0KTsKLSAgV1JJVEUgKGV4dGVybmFsX3JmZCwgY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUsIGNiUmZkT2Zmc2V0KTsKLSAgV1JJVEUgKGV4dGVybmFsX2V4dCwgaWV4dE1heCwgc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUsIGNiRXh0T2Zmc2V0KTsKLSN1bmRlZiBXUklURQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYSBzaHVmZmxlIGxpc3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlY29mZl93cml0ZV9zaHVmZmxlIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiwKLQkJCQkJICAgIHN0cnVjdCBzaHVmZmxlICosIFBUUiBzcGFjZSkpOwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgc2h1ZmZsZSwgc3BhY2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gICAgIHN0cnVjdCBzaHVmZmxlICpzaHVmZmxlOwotICAgICBQVFIgc3BhY2U7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBzaHVmZmxlICpsOwotICB1bnNpZ25lZCBsb25nIHRvdGFsOwotCi0gIHRvdGFsID0gMDsKLSAgZm9yIChsID0gc2h1ZmZsZTsgbCAhPSAoc3RydWN0IHNodWZmbGUgKikgTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgbC0+ZmlsZXApCi0JewotCSAgaWYgKGJmZF93cml0ZSAobC0+dS5tZW1vcnksIDEsIGwtPnNpemUsIGFiZmQpICE9IGwtPnNpemUpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGJmZF9zZWVrIChsLT51LmZpbGUuaW5wdXRfYmZkLCBsLT51LmZpbGUub2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF9yZWFkIChzcGFjZSwgMSwgbC0+c2l6ZSwgbC0+dS5maWxlLmlucHV0X2JmZCkgIT0gbC0+c2l6ZQotCSAgICAgIHx8IGJmZF93cml0ZSAoc3BhY2UsIDEsIGwtPnNpemUsIGFiZmQpICE9IGwtPnNpemUpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICB0b3RhbCArPSBsLT5zaXplOwotICAgIH0KLQotICBpZiAoKHRvdGFsICYgKHN3YXAtPmRlYnVnX2FsaWduIC0gMSkpICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBiZmRfYnl0ZSAqczsKLQotICAgICAgaSA9IHN3YXAtPmRlYnVnX2FsaWduIC0gKHRvdGFsICYgKHN3YXAtPmRlYnVnX2FsaWduIC0gMSkpOwotICAgICAgcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChpKTsKLSAgICAgIGlmIChzID09IE5VTEwgJiYgaSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgbWVtc2V0ICgoUFRSKSBzLCAwLCBpKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHMsIDEsIGksIGFiZmQpICE9IGkpCi0JewotCSAgZnJlZSAocyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZnJlZSAocyk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHVzaW5nIGFjY3VtdWxhdGVkIGxpbmtlcgotICAgaW5mb3JtYXRpb24uICAqLwotCi1ib29sZWFuCi1iZmRfZWNvZmZfd3JpdGVfYWNjdW11bGF0ZWRfZGVidWcgKGhhbmRsZSwgYWJmZCwgZGVidWcsIHN3YXAsIGluZm8sIHdoZXJlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBmaWxlX3B0ciB3aGVyZTsKLXsKLSAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGhhbmRsZTsKLSAgUFRSIHNwYWNlID0gTlVMTDsKLQotICBpZiAoISBlY29mZl93cml0ZV9zeW1oZHIgKGFiZmQsIGRlYnVnLCBzd2FwLCB3aGVyZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3BhY2UgPSAoUFRSKSBiZmRfbWFsbG9jIChhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUpOwotICBpZiAoc3BhY2UgPT0gTlVMTCAmJiBhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+bGluZSwgc3BhY2UpCi0gICAgICB8fCAhIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5wZHIsIHNwYWNlKQotICAgICAgfHwgISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+c3ltLCBzcGFjZSkKLSAgICAgIHx8ICEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPm9wdCwgc3BhY2UpCi0gICAgICB8fCAhIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5hdXgsIHNwYWNlKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBUaGUgc3RyaW5nIHRhYmxlIGlzIHdyaXR0ZW4gb3V0IGZyb20gdGhlIGhhc2ggdGFibGUgaWYgdGhpcyBpcyBhCi0gICAgIGZpbmFsIGxpbmsuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGFpbmZvLT5zc19oYXNoID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCk7Ci0gICAgICBpZiAoISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+c3MsIHNwYWNlKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHRvdGFsOwotICAgICAgYmZkX2J5dGUgbnVsbDsKLSAgICAgIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqc2g7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGFpbmZvLT5zcyA9PSAoc3RydWN0IHNodWZmbGUgKikgTlVMTCk7Ci0gICAgICBudWxsID0gMDsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICZudWxsLCAxLCAxLCBhYmZkKSAhPSAxKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgdG90YWwgPSAxOwotICAgICAgQkZEX0FTU0VSVCAoYWluZm8tPnNzX2hhc2ggPT0gTlVMTCB8fCBhaW5mby0+c3NfaGFzaC0+dmFsID09IDEpOwotICAgICAgZm9yIChzaCA9IGFpbmZvLT5zc19oYXNoOwotCSAgIHNoICE9IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTDsKLQkgICBzaCA9IHNoLT5uZXh0KQotCXsKLQkgIHNpemVfdCBsZW47Ci0KLQkgIGxlbiA9IHN0cmxlbiAoc2gtPnJvb3Quc3RyaW5nKTsKLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpIHNoLT5yb290LnN0cmluZywgMSwgbGVuICsgMSwgYWJmZCkgIT0gbGVuICsgMSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICB0b3RhbCArPSBsZW4gKyAxOwotCX0KLQotICAgICAgaWYgKCh0b3RhbCAmIChzd2FwLT5kZWJ1Z19hbGlnbiAtIDEpKSAhPSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBpOwotCSAgYmZkX2J5dGUgKnM7Ci0KLQkgIGkgPSBzd2FwLT5kZWJ1Z19hbGlnbiAtICh0b3RhbCAmIChzd2FwLT5kZWJ1Z19hbGlnbiAtIDEpKTsKLQkgIHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoaSk7Ci0JICBpZiAocyA9PSBOVUxMICYmIGkgIT0gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBtZW1zZXQgKChQVFIpIHMsIDAsIGkpOwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgcywgMSwgaSwgYWJmZCkgIT0gaSkKLQkgICAgewotCSAgICAgIGZyZWUgKHMpOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBmcmVlIChzKTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSBleHRlcm5hbCBzdHJpbmdzIGFuZCBzeW1ib2wgYXJlIG5vdCBjb252ZXJ0ZWQgb3ZlciB0byB1c2luZwotICAgICBzaHVmZmxlcy4gIEZJWE1FOiBUaGV5IHByb2JhYmx5IHNob3VsZCBiZS4gICovCi0gIGlmIChiZmRfd3JpdGUgKGRlYnVnLT5zc2V4dCwgMSwgZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NFeHRNYXgsIGFiZmQpCi0gICAgICAhPSAoYmZkX3NpemVfdHlwZSkgZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NFeHRNYXgpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICgoZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NFeHRNYXggJiAoc3dhcC0+ZGVidWdfYWxpZ24gLSAxKSkgIT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIGJmZF9ieXRlICpzOwotCi0gICAgICBpID0gKHN3YXAtPmRlYnVnX2FsaWduCi0JICAgLSAoZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NFeHRNYXggJiAoc3dhcC0+ZGVidWdfYWxpZ24gLSAxKSkpOwotICAgICAgcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChpKTsKLSAgICAgIGlmIChzID09IE5VTEwgJiYgaSAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgbWVtc2V0ICgoUFRSKSBzLCAwLCBpKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHMsIDEsIGksIGFiZmQpICE9IGkpCi0JewotCSAgZnJlZSAocyk7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgICBmcmVlIChzKTsKLSAgICB9Ci0KLSAgaWYgKCEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPmZkciwgc3BhY2UpCi0gICAgICB8fCAhIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5yZmQsIHNwYWNlKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBCRkRfQVNTRVJUIChkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmNiRXh0T2Zmc2V0ID09IDAKLQkgICAgICB8fCAoZGVidWctPnN5bWJvbGljX2hlYWRlci5jYkV4dE9mZnNldAotCQkgID09IChiZmRfdm1hKSBiZmRfdGVsbCAoYWJmZCkpKTsKLQotICBpZiAoYmZkX3dyaXRlIChkZWJ1Zy0+ZXh0ZXJuYWxfZXh0LCBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSwKLQkJIGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuaWV4dE1heCwgYWJmZCkKLSAgICAgICE9IGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuaWV4dE1heCAqIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChzcGFjZSAhPSBOVUxMKQotICAgIGZyZWUgKHNwYWNlKTsKLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzcGFjZSAhPSBOVUxMKQotICAgIGZyZWUgKHNwYWNlKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogSGFuZGxlIHRoZSBmaW5kX25lYXJlc3RfbGluZSBmdW5jdGlvbiBmb3IgYm90aCBFQ09GRiBhbmQgTUlQUyBFTEYKLSAgIGZpbGVzLiAgKi8KLQotLyogQ29tcGFyZSBGRFIgZW50cmllcy4gIFRoaXMgaXMgY2FsbGVkIHZpYSBxc29ydC4gICovCi0KLXN0YXRpYyBpbnQKLWNtcF9mZHJ0YWJfZW50cnkgKGxlZnRwLCByaWdodHApCi0gICAgIGNvbnN0IFBUUiBsZWZ0cDsKLSAgICAgY29uc3QgUFRSIHJpZ2h0cDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqbHAgPQotICAgIChjb25zdCBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICopIGxlZnRwOwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICpycCA9Ci0gICAgKGNvbnN0IHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKikgcmlnaHRwOwotCi0gIGlmIChscC0+YmFzZV9hZGRyIDwgcnAtPmJhc2VfYWRkcikKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChscC0+YmFzZV9hZGRyID4gcnAtPmJhc2VfYWRkcikKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEVhY2ggZmlsZSBkZXNjcmlwdG9yIChGRFIpIGhhcyBhIG1lbW9yeSBhZGRyZXNzLCB0byBzaW1wbGlmeQotICAgbG9va2luZyB1cCBhbiBGRFIgYnkgYWRkcmVzcywgd2UgYnVpbGQgYSB0YWJsZSBjb3ZlcmluZyBhbGwgRkRScwotICAgdGhhdCBoYXZlIGEgbGVhc3Qgb25lIHByb2NlZHVyZSBkZXNjcmlwdG9yIGluIHRoZW0uICBUaGUgZmluYWwKLSAgIHRhYmxlIHdpbGwgYmUgc29ydGVkIGJ5IGFkZHJlc3Mgc28gd2UgY2FuIGxvb2sgaXQgdXAgdmlhIGJpbmFyeQotICAgc2VhcmNoLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1rX2ZkcnRhYiAoYWJmZCwgZGVidWdfaW5mbywgZGVidWdfc3dhcCwgbGluZV9pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWdfaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwOwotICAgICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpsaW5lX2luZm87Ci17Ci0gIHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKnRhYjsKLSAgRkRSICpmZHJfcHRyOwotICBGRFIgKmZkcl9zdGFydDsKLSAgRkRSICpmZHJfZW5kOwotICBib29sZWFuIHN0YWJzOwotICBsb25nIGxlbjsKLQotICBmZHJfc3RhcnQgPSBkZWJ1Z19pbmZvLT5mZHI7Ci0gIGZkcl9lbmQgPSBmZHJfc3RhcnQgKyBkZWJ1Z19pbmZvLT5zeW1ib2xpY19oZWFkZXIuaWZkTWF4OwotCi0gIC8qIEZpcnN0LCBsZXQncyBzZWUgaG93IGxvbmcgdGhlIHRhYmxlIG5lZWRzIHRvIGJlOiAqLwotICBmb3IgKGxlbiA9IDAsIGZkcl9wdHIgPSBmZHJfc3RhcnQ7IGZkcl9wdHIgPCBmZHJfZW5kOyBmZHJfcHRyKyspCi0gICAgewotICAgICAgaWYgKGZkcl9wdHItPmNwZCA9PSAwKQkvKiBza2lwIEZEUnMgdGhhdCBoYXZlIG5vIFBEUnMgKi8KLQljb250aW51ZTsKLSAgICAgICsrbGVuOwotICAgIH0KLQotICAvKiBOb3csIGNyZWF0ZSBhbmQgZmlsbCBpbiB0aGUgdGFibGU6ICovCi0KLSAgbGluZV9pbmZvLT5mZHJ0YWIgPSAoKHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkqKQotCQkgICAgICAgYmZkX3phbGxvYyAoYWJmZCwKLQkJCQkgICBsZW4gKiBzaXplb2YgKHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkpKSk7Ci0gIGlmIChsaW5lX2luZm8tPmZkcnRhYiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbGluZV9pbmZvLT5mZHJ0YWJfbGVuID0gbGVuOwotCi0gIHRhYiA9IGxpbmVfaW5mby0+ZmRydGFiOwotICBmb3IgKGZkcl9wdHIgPSBmZHJfc3RhcnQ7IGZkcl9wdHIgPCBmZHJfZW5kOyBmZHJfcHRyKyspCi0gICAgewotICAgICAgaWYgKGZkcl9wdHItPmNwZCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgZmlsZSBoYXMgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgSW4KLQkgYSBmaWxlIHdpdGggc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLCB0aGUgc2Vjb25kIGxvY2FsCi0JIHN5bWJvbCBpcyBuYW1lZCBAc3RhYnMuICAqLwotICAgICAgc3RhYnMgPSBmYWxzZTsKLSAgICAgIGlmIChmZHJfcHRyLT5jc3ltID49IDIpCi0JewotCSAgY2hhciAqc3ltX3B0cjsKLQkgIFNZTVIgc3ltOwotCi0JICBzeW1fcHRyID0gKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQotCQkgICAgICsgKGZkcl9wdHItPmlzeW1CYXNlICsgMSkqZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOwotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikgKGFiZmQsIHN5bV9wdHIsICZzeW0pOwotCSAgaWYgKHN0cmNtcCAoZGVidWdfaW5mby0+c3MgKyBmZHJfcHRyLT5pc3NCYXNlICsgc3ltLmlzcywKLQkJICAgICAgU1RBQlNfU1lNQk9MKSA9PSAwKQotCSAgICBzdGFicyA9IHRydWU7Ci0JfQotCi0gICAgICBpZiAoIXN0YWJzKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcGRyX3NpemU7Ci0JICBjaGFyICpwZHJfcHRyOwotCSAgUERSIHBkcjsKLQotCSAgZXh0ZXJuYWxfcGRyX3NpemUgPSBkZWJ1Z19zd2FwLT5leHRlcm5hbF9wZHJfc2l6ZTsKLQotCSAgcGRyX3B0ciA9ICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9wZHIKLQkJICAgICArIGZkcl9wdHItPmlwZEZpcnN0ICogZXh0ZXJuYWxfcGRyX3NpemUpOwotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3Bkcl9pbikgKGFiZmQsIChQVFIpIHBkcl9wdHIsICZwZHIpOwotCSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IFBEUiBpcyB0aGUgb2Zmc2V0IG9mIHRoYXQKLQkgICAgIHByb2NlZHVyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIGZpbGUgRkRSLiAgKi8KLQkgIHRhYi0+YmFzZV9hZGRyID0gZmRyX3B0ci0+YWRyIC0gcGRyLmFkcjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogWFhYIEkgZG9uJ3Qga25vdyBhYm91dCBzdGFicywgc28gdGhpcyBpcyBhIGd1ZXNzCi0JICAgICAoZGF2aWRtQGNzLmFyaXpvbmEuZWR1KTogKi8KLQkgIHRhYi0+YmFzZV9hZGRyID0gZmRyX3B0ci0+YWRyOwotCX0KLSAgICAgIHRhYi0+ZmRyID0gZmRyX3B0cjsKLSAgICAgICsrdGFiOwotICAgIH0KLQotICAvKiBGaW5hbGx5LCB0aGUgdGFibGUgaXMgc29ydGVkIGluIGluY3JlYXNpbmcgbWVtb3J5LWFkZHJlc3Mgb3JkZXIuCi0gICAgIFRoZSB0YWJsZSBpcyBtb3N0bHkgc29ydGVkIGFscmVhZHksIGJ1dCB0aGVyZSBhcmUgY2FzZXMgKGUuZy4sCi0gICAgIHN0YXRpYyBmdW5jdGlvbnMgaW4gaW5jbHVkZSBmaWxlcyksIHdoZXJlIHRoaXMgZG9lcyBub3QgaG9sZC4KLSAgICAgVXNlICJvZHVtcCAtUEZ2IiB0byB2ZXJpZnkuLi4gICovCi0gIHFzb3J0ICgoUFRSKSBsaW5lX2luZm8tPmZkcnRhYiwgbGVuLAotCSBzaXplb2YgKHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkpLCBjbXBfZmRydGFiX2VudHJ5KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIGluZGV4IG9mIGZpcnN0IEZEUiB0aGF0IGNvdmVycyB0byBPRkZTRVQuICAqLwotCi1zdGF0aWMgbG9uZwotZmRydGFiX2xvb2t1cCAobGluZV9pbmZvLCBvZmZzZXQpCi0gICAgIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKmxpbmVfaW5mbzsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci17Ci0gIGxvbmcgbG93LCBoaWdoLCBsZW47Ci0gIGxvbmcgbWlkID0gLTE7Ci0gIHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKnRhYjsKLQotICBsZW4gPSBsaW5lX2luZm8tPmZkcnRhYl9sZW47Ci0gIGlmIChsZW4gPT0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgdGFiID0gbGluZV9pbmZvLT5mZHJ0YWI7Ci0gIGZvciAobG93ID0gMCwgaGlnaCA9IGxlbiAtIDEgOyBsb3cgIT0gaGlnaCA7KQotICAgIHsKLSAgICAgIG1pZCA9IChoaWdoICsgbG93KSAvIDI7Ci0gICAgICBpZiAob2Zmc2V0ID49IHRhYlttaWRdLmJhc2VfYWRkciAmJiBvZmZzZXQgPCB0YWJbbWlkICsgMV0uYmFzZV9hZGRyKQotCWdvdG8gZmluZF9taW47Ci0KLSAgICAgIGlmICh0YWJbbWlkXS5iYXNlX2FkZHIgPiBvZmZzZXQpCi0JaGlnaCA9IG1pZDsKLSAgICAgIGVsc2UKLQlsb3cgPSBtaWQgKyAxOwotICAgIH0KLSAgKyttaWQ7Ci0KLSAgLyogbGFzdCBlbnRyeSBpcyBjYXRjaC1hbGwgZm9yIGFsbCBoaWdoZXIgYWRkcmVzc2VzOiAqLwotICBpZiAob2Zmc2V0IDwgdGFiW21pZF0uYmFzZV9hZGRyKQotICAgIHJldHVybiAtMTsKLQotIGZpbmRfbWluOgotCi0gIHdoaWxlIChtaWQgPiAwICYmIHRhYlttaWQgLSAxXS5iYXNlX2FkZHIgPT0gdGFiW21pZF0uYmFzZV9hZGRyKQotICAgIC0tbWlkOwotCi0gIHJldHVybiBtaWQ7Ci19Ci0KLS8qIExvb2sgdXAgYSBsaW5lIGdpdmVuIGFuIGFkZHJlc3MsIHN0b3JpbmcgdGhlIGluZm9ybWF0aW9uIGluCi0gICBMSU5FX0lORk8tPmNhY2hlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxvb2t1cF9saW5lIChhYmZkLCBkZWJ1Z19pbmZvLCBkZWJ1Z19zd2FwLCBsaW5lX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1Z19pbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXA7Ci0gICAgIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKmxpbmVfaW5mbzsKLXsKLSAgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqdGFiOwotICBiZmRfdm1hIG9mZnNldDsKLSAgYm9vbGVhbiBzdGFiczsKLSAgRkRSICpmZHJfcHRyOwotICBpbnQgaTsKLSAgCi0gIG9mZnNldCA9IGxpbmVfaW5mby0+Y2FjaGUuc3RhcnQ7Ci0gICAgIAotICAvKiBCdWlsZCBGRFIgdGFibGUgKHNvcnRlZCBieSBvYmplY3QgZmlsZSdzIGJhc2UtYWRkcmVzcykgaWYgd2UKLSAgICAgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5LiAgKi8KLSAgaWYgKGxpbmVfaW5mby0+ZmRydGFiID09IE5VTEwKLSAgICAgICYmICFta19mZHJ0YWIgKGFiZmQsIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsIGxpbmVfaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHRhYiA9IGxpbmVfaW5mby0+ZmRydGFiOwotCi0gIC8qIGZpbmQgZmlyc3QgRkRSIGZvciBhZGRyZXNzIE9GRlNFVCAqLwotICBpID0gZmRydGFiX2xvb2t1cCAobGluZV9pbmZvLCBvZmZzZXQpOwotICBpZiAoaSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwkJLyogbm8gRkRSLCBubyBmdW4uLi4gKi8KLSAgZmRyX3B0ciA9IHRhYltpXS5mZHI7Ci0KLSAgLyogQ2hlY2sgd2hldGhlciB0aGlzIGZpbGUgaGFzIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEluIGEKLSAgICAgZmlsZSB3aXRoIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgdGhlIHNlY29uZCBsb2NhbCBzeW1ib2wgaXMKLSAgICAgbmFtZWQgQHN0YWJzLiAgKi8KLSAgc3RhYnMgPSBmYWxzZTsKLSAgaWYgKGZkcl9wdHItPmNzeW0gPj0gMikKLSAgICB7Ci0gICAgICBjaGFyICpzeW1fcHRyOwotICAgICAgU1lNUiBzeW07Ci0KLSAgICAgIHN5bV9wdHIgPSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfc3ltCi0JCSArIChmZHJfcHRyLT5pc3ltQmFzZSArIDEpICogZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOwotICAgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikgKGFiZmQsIHN5bV9wdHIsICZzeW0pOwotICAgICAgaWYgKHN0cmNtcCAoZGVidWdfaW5mby0+c3MgKyBmZHJfcHRyLT5pc3NCYXNlICsgc3ltLmlzcywKLQkJICBTVEFCU19TWU1CT0wpID09IDApCi0Jc3RhYnMgPSB0cnVlOwotICAgIH0KLQotICBpZiAoIXN0YWJzKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcGRyX3NpemU7Ci0gICAgICBjaGFyICpwZHJfcHRyOwotICAgICAgY2hhciAqYmVzdF9wZHIgPSBOVUxMOwotICAgICAgRkRSICpiZXN0X2ZkcjsKLSAgICAgIGJmZF92bWEgYmVzdF9kaXN0ID0gfjA7Ci0gICAgICBQRFIgcGRyOwotICAgICAgdW5zaWduZWQgY2hhciAqbGluZV9wdHI7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpsaW5lX2VuZDsKLSAgICAgIGludCBsaW5lbm87Ci0gICAgICAvKiBUaGlzIGZpbGUgdXNlcyBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBFYWNoIEZEUiBoYXMgYQotICAgICAgICAgbGlzdCBvZiBwcm9jZWR1cmUgZGVzY3JpcHRvcnMgKFBEUikuICBUaGUgYWRkcmVzcyBpbiB0aGUgRkRSCi0gICAgICAgICBpcyB0aGUgYWJzb2x1dGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgcHJvY2VkdXJlLiAgVGhlIGFkZHJlc3MKLSAgICAgICAgIGluIHRoZSBmaXJzdCBQRFIgZ2l2ZXMgdGhlIG9mZnNldCBvZiB0aGF0IHByb2NlZHVyZSByZWxhdGl2ZQotICAgICAgICAgdG8gdGhlIG9iamVjdCBmaWxlJ3MgYmFzZS1hZGRyZXNzLiAgVGhlIGFkZHJlc3NlcyBpbgotICAgICAgICAgc3Vic2VxdWVudCBQRFJzIHNwZWNpZnkgZWFjaCBwcm9jZWR1cmUncyBhZGRyZXNzIHJlbGF0aXZlIHRvCi0gICAgICAgICB0aGUgb2JqZWN0IGZpbGUncyBiYXNlLWFkZHJlc3MuICBUbyBtYWtlIHRoaW5ncyBtb3JlIGp1aWN5LAotICAgICAgICAgd2hlbmV2ZXIgdGhlIFBST0YgYml0IGluIHRoZSBQRFIgaXMgc2V0LCB0aGUgcmVhbCBlbnRyeSBwb2ludAotICAgICAgICAgb2YgdGhlIHByb2NlZHVyZSBtYXkgYmUgMTYgYnl0ZXMgYmVsb3cgd2hhdCB3b3VsZCBub3JtYWxseSBiZQotICAgICAgICAgdGhlIHByb2NlZHVyZSdzIGVudHJ5IHBvaW50LiAgSW5zdGVhZCwgREVDIGNhbWUgdXAgd2l0aCBhCi0gICAgICAgICB3aWNrZWQgc2NoZW1lIHRvIGNyZWF0ZSBwcm9maWxlZCBsaWJyYXJpZXMgIm9uIHRoZSBmbHkiOgotICAgICAgICAgaW5zdGVhZCBvZiBzaGlwcGluZyBhIHJlZ3VsYXIgYW5kIGEgcHJvZmlsZWQgdmVyc2lvbiBvZiBlYWNoCi0gICAgICAgICBsaWJyYXJ5LCB0aGV5IGluc2VydCAxNiBieXRlcyBvZiB1bnVzZWQgc3BhY2UgaW4gZnJvbnQgb2YKLSAgICAgICAgIGVhY2ggcHJvY2VkdXJlIGFuZCBzZXQgdGhlICJwcm9mIiBiaXQgaW4gdGhlIFBEUiB0byBpbmRpY2F0ZQotICAgICAgICAgdGhhdCB0aGVyZSBpcyBhIGdhcCB0aGVyZSAodGhpcyBpcyBkb25lIGF1dG9tYWdpY2FsbHkgYnkgImFzIgotICAgICAgICAgd2hlbiBvcHRpb24gIi1wZyIgaXMgc3BlY2lmaWVkKS4gIFRodXMsIG5vcm1hbGx5LCB5b3UgbGluawotICAgICAgICAgYWdhaW5zdCBzdWNoIGEgbGlicmFyeSBhbmQsIGV4Y2VwdCBmb3IgbG90cyBvZiAxNiBieXRlIGdhcHMKLSAgICAgICAgIGJldHdlZW4gZnVuY3Rpb25zLCB0aGluZ3Mgd2lsbCBiZWhhdmUgYXMgdXN1YWwuICBIb3dldmVyLAotICAgICAgICAgd2hlbiBpbnZva2luZyAibGQiIHdpdGggb3B0aW9uICItcGciLCBpdCB3aWxsIGZpbGwgdGhvc2UgZ2FwcwotICAgICAgICAgd2l0aCBjb2RlIHRoYXQgY2FsbHMgbWNvdW50KCkuICBJdCB0aGVuIG1vdmVzIHRoZSBmdW5jdGlvbidzCi0gICAgICAgICBlbnRyeSBwb2ludCBkb3duIGJ5IDE2IGJ5dGVzLCBhbmQgb3V0IHBvcHMgYSBiaW5hcnkgdGhhdCBoYXMKLSAgICAgICAgIGFsbCBmdW5jdGlvbnMgcHJvZmlsZWQuCi0KLSAgICAgICAgIE5PVEU6IE5laXRoZXIgRkRScyBub3IgUERScyBhcmUgc3RyaWN0bHkgc29ydGVkIGluIG1lbW9yeQotICAgICAgICAgICAgICAgb3JkZXIuICBGb3IgZXhhbXBsZSwgd2hlbiBpbmNsdWRpbmcgaGVhZGVyLWZpbGVzIHRoYXQKLSAgICAgICAgICAgICAgIGRlZmluZSBmdW5jdGlvbnMsIHRoZSBGRFJzIGZvbGxvdyBiZWhpbmQgdGhlIGluY2x1ZGluZwotICAgICAgICAgICAgICAgZmlsZSwgZXZlbiB0aG91Z2ggdGhlaXIgY29kZSBtYXkgaGF2ZSBiZWVuIGdlbmVyYXRlZCBhdAotICAgICAgICAgICAgICAgYSBsb3dlciBhZGRyZXNzLiAgRmlsZSBjb2ZmLWFscGhhLmMgZnJvbSBsaWJiZmQKLSAgICAgICAgICAgICAgIGlsbHVzdHJhdGVzIHRoaXMgKHVzZSAib2R1bXAgLVBGdiIgdG8gbG9vayBhdCBhIGZpbGUncwotICAgICAgICAgICAgICAgRkRSL1BEUikuICBTaW1pbGFybHksIFBEUnMgYXJlIHNvbWV0aW1lcyBvdXQgb2Ygb3JkZXIKLSAgICAgICAgICAgICAgIGFzIHdlbGwuICBBbiBleGFtcGxlIG9mIHRoaXMgaXMgT1NGLzEgdjMuMCBsaWJjJ3MKLSAgICAgICAgICAgICAgIG1hbGxvYy5jLiAgSSdtIG5vdCBzdXJlIHdoeSB0aGlzIGhhcHBlbnMsIGJ1dCBpdCBjb3VsZAotICAgICAgICAgICAgICAgYmUgZHVlIHRvIG9wdGltaXphdGlvbnMgdGhhdCByZW9yZGVyIGEgZnVuY3Rpb24ncwotICAgICAgICAgICAgICAgcG9zaXRpb24gd2l0aGluIGFuIG9iamVjdC1maWxlLgotICAgICAgICAKLSAgICAgICAgIFN0cmF0ZWd5OgotICAgICAgICAgCi0gICAgICAgICBPbiB0aGUgZmlyc3QgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLCB3ZSBidWlsZCBhIHRhYmxlIG9mIEZEUnMKLSAgICAgICAgIHRoYXQgaXMgc29ydGVkIGJ5IHRoZSBiYXNlLWFkZHJlc3Mgb2YgdGhlIG9iamVjdC1maWxlIHRoZSBGRFIKLSAgICAgICAgIGlzIHJlZmVycmluZyB0by4gIE5vdGljZSB0aGF0IGVhY2ggb2JqZWN0LWZpbGUgbWF5IGNvbnRhaW4KLSAgICAgICAgIGNvZGUgZnJvbSBtdWx0aXBsZSBzb3VyY2UgZmlsZXMgKGUuZy4sIGR1ZSB0byBjb2RlIGRlZmluZWQgaW4KLSAgICAgICAgIGluY2x1ZGUgZmlsZXMpLiAgVGh1cywgZm9yIGFueSBnaXZlbiBiYXNlLWFkZHJlc3MsIHRoZXJlIG1heQotICAgICAgICAgYmUgbXVsdGlwbGUgRkRScyAoYnV0IHRoaXMgY2FzZSBpcywgZm9ydHVuYXRlbHksIHVuY29tbW9uKS4KLSAgICAgICAgIGxvb2t1cChhZGRyKSBndWFyYW50ZWVzIHRvIHJldHVybiB0aGUgZmlyc3QgRkRSIHRoYXQgYXBwbGllcwotICAgICAgICAgdG8gYWRkcmVzcyBBRERSLiAgVGh1cywgYWZ0ZXIgaW52b2tpbmcgbG9va3VwKCksIHdlIGhhdmUgYQotICAgICAgICAgbGlzdCBvZiBGRFJzIHRoYXQgbWF5IGNvbnRhaW4gdGhlIFBEUiBmb3IgQUREUi4gIE5leHQsIHdlCi0gICAgICAgICB3YWxrIHRocm91Z2ggdGhlIFBEUnMgb2YgdGhlc2UgRkRScyBhbmQgbG9jYXRlIHRoZSBvbmUgdGhhdAotICAgICAgICAgaXMgY2xvc2VzdCB0byBBRERSIChpLmUuLCBmb3Igd2hpY2ggdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotICAgICAgICAgQUREUiBhbmQgdGhlIFBEUidzIGVudHJ5IHBvaW50IGlzIHBvc2l0aXZlIGFuZCBtaW5pbWFsKS4KLSAgICAgICAgIE9uY2UsIHRoZSByaWdodCBGRFIgYW5kIFBEUiBhcmUgbG9jYXRlZCwgd2Ugc2ltcGx5IHdhbGsKLSAgICAgICAgIHRocm91Z2ggdGhlIGxpbmUtbnVtYmVyIHRhYmxlIHRvIGxvb2t1cCB0aGUgbGluZS1udW1iZXIgdGhhdAotICAgICAgICAgYmVzdCBtYXRjaGVzIEFERFIuICBPYnZpb3VzbHksIHRoaW5ncyBjb3VsZCBiZSBzcGVkIHVwIGJ5Ci0gICAgICAgICBrZWVwaW5nIGEgc29ydGVkIGxpc3Qgb2YgUERScyBpbnN0ZWFkIG9mIGEgc29ydGVkIGxpc3Qgb2YKLSAgICAgICAgIEZEUnMuICBIb3dldmVyLCB0aGlzIHdvdWxkIGluY3JlYXNlIHNwYWNlIHJlcXVpcmVtZW50cwotICAgICAgICAgY29uc2lkZXJhYmx5LCB3aGljaCBpcyB1bmRlc2lyYWJsZS4gICovCi0gICAgICBleHRlcm5hbF9wZHJfc2l6ZSA9IGRlYnVnX3N3YXAtPmV4dGVybmFsX3Bkcl9zaXplOwotCi0gICAgICAvKiBNYWtlIG9mZnNldCByZWxhdGl2ZSB0byBvYmplY3QgZmlsZSdzIHN0YXJ0LWFkZHJlc3M6ICovCi0gICAgICBvZmZzZXQgLT0gdGFiW2ldLmJhc2VfYWRkcjsKLSAgICAgIC8qIFNlYXJjaCBGRFIgbGlzdCBzdGFydGluZyBhdCB0YWJbaV0gZm9yIHRoZSBQRFIgdGhhdCBiZXN0IG1hdGNoZXMKLSAgICAgICAgIE9GRlNFVC4gIE5vcm1hbGx5LCB0aGUgRkRSIGxpc3QgaXMgb25seSBvbmUgZW50cnkgbG9uZy4gICovCi0gICAgICBiZXN0X2ZkciA9IE5VTEw7Ci0gICAgICBkbwotCXsKLQkgIGJmZF92bWEgZGlzdCwgbWluX2Rpc3QgPSAwOwotCSAgY2hhciAqcGRyX2hvbGQ7Ci0JICBjaGFyICpwZHJfZW5kOwotCSAgCi0JICBmZHJfcHRyID0gdGFiW2ldLmZkcjsKLQkgIAotCSAgcGRyX3B0ciA9ICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9wZHIKLQkJICAgICArIGZkcl9wdHItPmlwZEZpcnN0ICogZXh0ZXJuYWxfcGRyX3NpemUpOwotCSAgcGRyX2VuZCA9IHBkcl9wdHIgKyBmZHJfcHRyLT5jcGQgKiBleHRlcm5hbF9wZHJfc2l6ZTsKLQkgICgqZGVidWdfc3dhcC0+c3dhcF9wZHJfaW4pIChhYmZkLCAoUFRSKSBwZHJfcHRyLCAmcGRyKTsKLQkgIC8qIEZpbmQgUERSIHRoYXQgaXMgY2xvc2VzdCB0byBPRkZTRVQuICBJZiBwZHIucHJvZiBpcyBzZXQsCi0JICAgICB0aGUgcHJvY2VkdXJlIGVudHJ5LXBvaW50ICptYXkqIGJlIDB4MTAgYmVsb3cgcGRyLmFkci4gIFdlCi0JICAgICBzaW1wbHkgcHJldGVuZCB0aGF0IHBkci5wcm9mICppbXBsaWVzKiBhIGxvd2VyIGVudHJ5LXBvaW50LgotCSAgICAgVGhpcyBpcyBzYWZlIGJlY2F1c2UgaXQganVzdCBtZWFucyB0aGF0IG1heSBpZGVudGlmeSA0IE5PUHMKLQkgICAgIGluIGZyb250IG9mIHRoZSBmdW5jdGlvbiBhcyBiZWxvbmdpbmcgdG8gdGhlIGZ1bmN0aW9uLiAgKi8KLQkgIGZvciAocGRyX2hvbGQgPSBOVUxMOwotCSAgICAgICBwZHJfcHRyIDwgcGRyX2VuZDsKLQkgICAgICAgKHBkcl9wdHIgKz0gZXh0ZXJuYWxfcGRyX3NpemUsCi0JCSgqZGVidWdfc3dhcC0+c3dhcF9wZHJfaW4pIChhYmZkLCAoUFRSKSBwZHJfcHRyLCAmcGRyKSkpCi0JICAgIHsKLQkgICAgICBpZiAob2Zmc2V0ID49IChwZHIuYWRyIC0gMHgxMCAqIHBkci5wcm9mKSkKLQkJewotCQkgIGRpc3QgPSBvZmZzZXQgLSAocGRyLmFkciAtIDB4MTAgKiBwZHIucHJvZik7Ci0JCSAgaWYgKCFwZHJfaG9sZCB8fCBkaXN0IDwgbWluX2Rpc3QpCi0JCSAgICB7Ci0JCSAgICAgIG1pbl9kaXN0ID0gZGlzdDsKLQkJICAgICAgcGRyX2hvbGQgPSBwZHJfcHRyOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIAotCSAgaWYgKCFiZXN0X3BkciB8fCBtaW5fZGlzdCA8IGJlc3RfZGlzdCkKLQkgICAgewotCSAgICAgIGJlc3RfZGlzdCA9IG1pbl9kaXN0OwotCSAgICAgIGJlc3RfZmRyID0gZmRyX3B0cjsKLQkgICAgICBiZXN0X3BkciA9IHBkcl9ob2xkOwotCSAgICB9Ci0JICAvKiBjb250aW51ZSBsb29waW5nIHVudGlsIGJhc2VfYWRkciBvZiBuZXh0IGVudHJ5IGlzIGRpZmZlcmVudDogKi8KLQl9Ci0gICAgICB3aGlsZSAoKytpIDwgbGluZV9pbmZvLT5mZHJ0YWJfbGVuCi0JICAgICAmJiB0YWJbaV0uYmFzZV9hZGRyID09IHRhYltpIC0gMV0uYmFzZV9hZGRyKTsKLQotICAgICAgaWYgKCFiZXN0X2ZkciB8fCAhYmVzdF9wZHIpCi0JcmV0dXJuIGZhbHNlOwkJCS8qIHNob3VsZG4ndCBoYXBwZW4uLi4gKi8KLQotICAgICAgLyogcGhldywgZmluYWxseSB3ZSBnb3Qgc29tZXRoaW5nIHRoYXQgd2UgY2FuIGhvbGQgb250bzogKi8KLSAgICAgIGZkcl9wdHIgPSBiZXN0X2ZkcjsKLSAgICAgIHBkcl9wdHIgPSBiZXN0X3BkcjsKLSAgICAgICgqZGVidWdfc3dhcC0+c3dhcF9wZHJfaW4pIChhYmZkLCAoUFRSKSBwZHJfcHRyLCAmcGRyKTsKLSAgICAgIC8qIE5vdyB3ZSBjYW4gbG9vayBmb3IgdGhlIGFjdHVhbCBsaW5lIG51bWJlci4gIFRoZSBsaW5lIG51bWJlcnMKLSAgICAgICAgIGFyZSBzdG9yZWQgaW4gYSB2ZXJ5IGZ1bmt5IGZvcm1hdCwgd2hpY2ggSSB3b24ndCB0cnkgdG8KLSAgICAgICAgIGRlc2NyaWJlLiAgVGhlIHNlYXJjaCBpcyBib3VuZGVkIGJ5IHRoZSBlbmQgb2YgdGhlIEZEUnMgbGluZQotICAgICAgICAgbnVtYmVyIGVudHJpZXMuICAqLwotICAgICAgbGluZV9lbmQgPSBkZWJ1Z19pbmZvLT5saW5lICsgZmRyX3B0ci0+Y2JMaW5lT2Zmc2V0ICsgZmRyX3B0ci0+Y2JMaW5lOwotCi0gICAgICAvKiBNYWtlIG9mZnNldCByZWxhdGl2ZSB0byBwcm9jZWR1cmUgZW50cnk6ICovCi0gICAgICBvZmZzZXQgLT0gcGRyLmFkciAtIDB4MTAgKiBwZHIucHJvZjsKLSAgICAgIGxpbmVubyA9IHBkci5sbkxvdzsKLSAgICAgIGxpbmVfcHRyID0gZGVidWdfaW5mby0+bGluZSArIGZkcl9wdHItPmNiTGluZU9mZnNldCArIHBkci5jYkxpbmVPZmZzZXQ7Ci0gICAgICB3aGlsZSAobGluZV9wdHIgPCBsaW5lX2VuZCkKLQl7Ci0JICBpbnQgZGVsdGE7Ci0JICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLQkgIGRlbHRhID0gKmxpbmVfcHRyID4+IDQ7Ci0JICBpZiAoZGVsdGEgPj0gMHg4KQotCSAgICBkZWx0YSAtPSAweDEwOwotCSAgY291bnQgPSAoKmxpbmVfcHRyICYgMHhmKSArIDE7Ci0JICArK2xpbmVfcHRyOwotCSAgaWYgKGRlbHRhID09IC04KQotCSAgICB7Ci0JICAgICAgZGVsdGEgPSAoKChsaW5lX3B0clswXSkgJiAweGZmKSA8PCA4KSArICgobGluZV9wdHJbMV0pICYgMHhmZik7Ci0JICAgICAgaWYgKGRlbHRhID49IDB4ODAwMCkKLQkJZGVsdGEgLT0gMHgxMDAwMDsKLQkgICAgICBsaW5lX3B0ciArPSAyOwotCSAgICB9Ci0JICBsaW5lbm8gKz0gZGVsdGE7Ci0JICBpZiAob2Zmc2V0IDwgY291bnQgKiA0KQotCSAgICB7Ci0JICAgICAgbGluZV9pbmZvLT5jYWNoZS5zdG9wICs9IGNvdW50ICogNCAtIG9mZnNldDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgb2Zmc2V0IC09IGNvdW50ICogNDsKLQl9Ci0KLSAgICAgIC8qIElmIGZkcl9wdHItPnJzcyBpcyAtMSwgdGhlbiB0aGlzIGZpbGUgZG9lcyBub3QgaGF2ZSBmdWxsCi0gICAgICAgICBzeW1ib2xzLCBhdCBsZWFzdCBhY2NvcmRpbmcgdG8gZ2RiL21pcHNyZWFkLmMuICAqLwotICAgICAgaWYgKGZkcl9wdHItPnJzcyA9PSAtMSkKLQl7Ci0JICBsaW5lX2luZm8tPmNhY2hlLmZpbGVuYW1lID0gTlVMTDsKLQkgIGlmIChwZHIuaXN5bSA9PSAtMSkKLQkgICAgbGluZV9pbmZvLT5jYWNoZS5mdW5jdGlvbm5hbWUgPSBOVUxMOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgRVhUUiBwcm9jX2V4dDsKLQotCSAgICAgICgqZGVidWdfc3dhcC0+c3dhcF9leHRfaW4pCi0JCShhYmZkLAotCQkgKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX2V4dAotCQkgICsgcGRyLmlzeW0gKiBkZWJ1Z19zd2FwLT5leHRlcm5hbF9leHRfc2l6ZSksCi0JCSAmcHJvY19leHQpOwotCSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuZnVuY3Rpb25uYW1lID0gKGRlYnVnX2luZm8tPnNzZXh0Ci0JCQkJCSAgICAgICArIHByb2NfZXh0LmFzeW0uaXNzKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBTWU1SIHByb2Nfc3ltOwotCi0JICBsaW5lX2luZm8tPmNhY2hlLmZpbGVuYW1lID0gKGRlYnVnX2luZm8tPnNzCi0JCQkJICAgICAgICsgZmRyX3B0ci0+aXNzQmFzZQotCQkJCSAgICAgICArIGZkcl9wdHItPnJzcyk7Ci0JICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKQotCSAgICAoYWJmZCwKLQkgICAgICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0KLQkgICAgICArICgoZmRyX3B0ci0+aXN5bUJhc2UgKyBwZHIuaXN5bSkKLQkJICogZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpKSwKLQkgICAgICZwcm9jX3N5bSk7Ci0JICBsaW5lX2luZm8tPmNhY2hlLmZ1bmN0aW9ubmFtZSA9IChkZWJ1Z19pbmZvLT5zcwotCQkJCQkgICArIGZkcl9wdHItPmlzc0Jhc2UKLQkJCQkJICAgKyBwcm9jX3N5bS5pc3MpOwotCX0KLSAgICAgIGlmIChsaW5lbm8gPT0gaWxpbmVOaWwpCi0JbGluZW5vID0gMDsKLSAgICAgIGxpbmVfaW5mby0+Y2FjaGUubGluZV9udW0gPSBsaW5lbm87Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fc2l6ZTsKLSAgICAgIGNvbnN0IGNoYXIgKmRpcmVjdG9yeV9uYW1lOwotICAgICAgY29uc3QgY2hhciAqbWFpbl9maWxlX25hbWU7Ci0gICAgICBjb25zdCBjaGFyICpjdXJyZW50X2ZpbGVfbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWU7Ci0gICAgICBjb25zdCBjaGFyICpsaW5lX2ZpbGVfbmFtZTsKLSAgICAgIGJmZF92bWEgbG93X2Z1bmNfdm1hOwotICAgICAgYmZkX3ZtYSBsb3dfbGluZV92bWE7Ci0gICAgICBib29sZWFuIHBhc3RfbGluZTsKLSAgICAgIGJvb2xlYW4gcGFzdF9mbjsKLSAgICAgIGNoYXIgKnN5bV9wdHIsICpzeW1fcHRyX2VuZDsKLSAgICAgIHNpemVfdCBsZW4sIGZ1bmNsZW47Ci0gICAgICBjaGFyICpidWZmZXIgPSBOVUxMOwotCi0gICAgICAvKiBUaGlzIGZpbGUgdXNlcyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBXaGVuIGdjYyBpcyBub3QKLQkgb3B0aW1pemluZywgaXQgd2lsbCBwdXQgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGJlZm9yZQotCSB0aGUgZnVuY3Rpb24gbmFtZSBzdGFicyBlbnRyeS4gIFdoZW4gZ2NjIGlzIG9wdGltaXppbmcsIGl0Ci0JIHdpbGwgcHV0IHRoZSBzdGFicyBlbnRyeSBmb3IgYWxsIHRoZSBmdW5jdGlvbiBmaXJzdCwgZm9sbG93ZWQKLQkgYnkgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgKFRoaXMgYXBwZWFycyB0byBoYXBwZW4KLQkgYmVjYXVzZSBvZiB0aGUgdHdvIG91dHB1dCBmaWxlcyB1c2VkIGJ5IHRoZSAtbWdwb3B0IHN3aXRjaCwKLQkgd2hpY2ggaXMgaW1wbGllZCBieSAtTykuICBUaGlzIG1lYW5zIHRoYXQgd2UgbXVzdCBrZWVwCi0JIGxvb2tpbmcgdGhyb3VnaCB0aGUgc3ltYm9scyB1bnRpbCB3ZSBmaW5kIGJvdGggYSBsaW5lIG51bWJlcgotCSBhbmQgYSBmdW5jdGlvbiBuYW1lIHdoaWNoIGFyZSBiZXlvbmQgdGhlIGFkZHJlc3Mgd2Ugd2FudC4gICovCi0KLSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWUgPSBOVUxMOwotICAgICAgbGluZV9pbmZvLT5jYWNoZS5mdW5jdGlvbm5hbWUgPSBOVUxMOwotICAgICAgbGluZV9pbmZvLT5jYWNoZS5saW5lX251bSA9IDA7Ci0KLSAgICAgIGRpcmVjdG9yeV9uYW1lID0gTlVMTDsKLSAgICAgIG1haW5fZmlsZV9uYW1lID0gTlVMTDsKLSAgICAgIGN1cnJlbnRfZmlsZV9uYW1lID0gTlVMTDsKLSAgICAgIGZ1bmN0aW9uX25hbWUgPSBOVUxMOwotICAgICAgbGluZV9maWxlX25hbWUgPSBOVUxMOwotICAgICAgbG93X2Z1bmNfdm1hID0gMDsKLSAgICAgIGxvd19saW5lX3ZtYSA9IDA7Ci0gICAgICBwYXN0X2xpbmUgPSBmYWxzZTsKLSAgICAgIHBhc3RfZm4gPSBmYWxzZTsKLQotICAgICAgZXh0ZXJuYWxfc3ltX3NpemUgPSBkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZTsKLQotICAgICAgc3ltX3B0ciA9ICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0KLQkJICsgKGZkcl9wdHItPmlzeW1CYXNlICsgMikgKiBleHRlcm5hbF9zeW1fc2l6ZSk7Ci0gICAgICBzeW1fcHRyX2VuZCA9IHN5bV9wdHIgKyAoZmRyX3B0ci0+Y3N5bSAtIDIpICogZXh0ZXJuYWxfc3ltX3NpemU7Ci0gICAgICBmb3IgKDsKLQkgICBzeW1fcHRyIDwgc3ltX3B0cl9lbmQgJiYgKCEgcGFzdF9saW5lIHx8ICEgcGFzdF9mbik7Ci0JICAgc3ltX3B0ciArPSBleHRlcm5hbF9zeW1fc2l6ZSkKLQl7Ci0JICBTWU1SIHN5bTsKLQotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikgKGFiZmQsIHN5bV9wdHIsICZzeW0pOwotCi0JICBpZiAoRUNPRkZfSVNfU1RBQiAoJnN5bSkpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKEVDT0ZGX1VOTUFSS19TVEFCIChzeW0uaW5kZXgpKQotCQl7Ci0JCWNhc2UgTl9TTzoKLQkJICBtYWluX2ZpbGVfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lID0KLQkJICAgIGRlYnVnX2luZm8tPnNzICsgZmRyX3B0ci0+aXNzQmFzZSArIHN5bS5pc3M7Ci0KLQkJICAvKiBDaGVjayB0aGUgbmV4dCBzeW1ib2wgdG8gc2VlIGlmIGl0IGlzIGFsc28gYW4KLSAgICAgICAgICAgICAgICAgICAgIE5fU08gc3ltYm9sLiAgKi8KLQkJICBpZiAoc3ltX3B0ciArIGV4dGVybmFsX3N5bV9zaXplIDwgc3ltX3B0cl9lbmQpCi0JCSAgICB7Ci0JCSAgICAgIFNZTVIgbmV4dHN5bTsKLQotCQkgICAgICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwKLQkJCQkJCSAgc3ltX3B0ciArIGV4dGVybmFsX3N5bV9zaXplLAotCQkJCQkJICAmbmV4dHN5bSk7Ci0JCSAgICAgIGlmIChFQ09GRl9JU19TVEFCICgmbmV4dHN5bSkKLQkJCSAgJiYgRUNPRkZfVU5NQVJLX1NUQUIgKG5leHRzeW0uaW5kZXgpID09IE5fU08pCi0JCQl7Ci0gCQkJICBkaXJlY3RvcnlfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lOwotCQkJICBtYWluX2ZpbGVfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lID0KLQkJCSAgICBkZWJ1Z19pbmZvLT5zcyArIGZkcl9wdHItPmlzc0Jhc2UgKyBuZXh0c3ltLmlzczsKLQkJCSAgc3ltX3B0ciArPSBleHRlcm5hbF9zeW1fc2l6ZTsKLQkJCX0KLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlIE5fU09MOgotCQkgIGN1cnJlbnRfZmlsZV9uYW1lID0KLQkJICAgIGRlYnVnX2luZm8tPnNzICsgZmRyX3B0ci0+aXNzQmFzZSArIHN5bS5pc3M7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBOX0ZVTjoKLQkJICBpZiAoc3ltLnZhbHVlID4gb2Zmc2V0KQotCQkgICAgcGFzdF9mbiA9IHRydWU7Ci0JCSAgZWxzZSBpZiAoc3ltLnZhbHVlID49IGxvd19mdW5jX3ZtYSkKLQkJICAgIHsKLQkJICAgICAgbG93X2Z1bmNfdm1hID0gc3ltLnZhbHVlOwotCQkgICAgICBmdW5jdGlvbl9uYW1lID0KLQkJCWRlYnVnX2luZm8tPnNzICsgZmRyX3B0ci0+aXNzQmFzZSArIHN5bS5pc3M7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoc3ltLnN0ID09IHN0TGFiZWwgJiYgc3ltLmluZGV4ICE9IGluZGV4TmlsKQotCSAgICB7Ci0JICAgICAgaWYgKHN5bS52YWx1ZSA+IG9mZnNldCkKLQkJcGFzdF9saW5lID0gdHJ1ZTsKLQkgICAgICBlbHNlIGlmIChzeW0udmFsdWUgPj0gbG93X2xpbmVfdm1hKQotCQl7Ci0JCSAgbG93X2xpbmVfdm1hID0gc3ltLnZhbHVlOwotCQkgIGxpbmVfZmlsZV9uYW1lID0gY3VycmVudF9maWxlX25hbWU7Ci0JCSAgbGluZV9pbmZvLT5jYWNoZS5saW5lX251bSA9IHN5bS5pbmRleDsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobGluZV9pbmZvLT5jYWNoZS5saW5lX251bSAhPSAwKQotCW1haW5fZmlsZV9uYW1lID0gbGluZV9maWxlX25hbWU7Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBzdHVmZiBhZnRlciB0aGUgY29sb24gaW4gdGhlIGZ1bmN0aW9uCi0gICAgICAgICBuYW1lLiAgV2UgYWxzbyBuZWVkIHRvIHB1dCB0aGUgZGlyZWN0b3J5IG5hbWUgYW5kIHRoZSBmaWxlCi0gICAgICAgICBuYW1lIHRvZ2V0aGVyLiAgKi8KLSAgICAgIGlmIChmdW5jdGlvbl9uYW1lID09IE5VTEwpCi0JbGVuID0gZnVuY2xlbiA9IDA7Ci0gICAgICBlbHNlCi0JbGVuID0gZnVuY2xlbiA9IHN0cmxlbiAoZnVuY3Rpb25fbmFtZSkgKyAxOwotCi0gICAgICBpZiAobWFpbl9maWxlX25hbWUgIT0gTlVMTAotCSAgJiYgZGlyZWN0b3J5X25hbWUgIT0gTlVMTAotCSAgJiYgbWFpbl9maWxlX25hbWVbMF0gIT0gJy8nKQotCWxlbiArPSBzdHJsZW4gKGRpcmVjdG9yeV9uYW1lKSArIHN0cmxlbiAobWFpbl9maWxlX25hbWUpICsgMTsKLQotICAgICAgaWYgKGxlbiAhPSAwKQotCXsKLQkgIGlmIChsaW5lX2luZm8tPmZpbmRfYnVmZmVyICE9IE5VTEwpCi0JICAgIGZyZWUgKGxpbmVfaW5mby0+ZmluZF9idWZmZXIpOwotCSAgYnVmZmVyID0gKGNoYXIgKikgYmZkX21hbGxvYyAobGVuKTsKLQkgIGlmIChidWZmZXIgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgbGluZV9pbmZvLT5maW5kX2J1ZmZlciA9IGJ1ZmZlcjsKLQl9Ci0KLSAgICAgIGlmIChmdW5jdGlvbl9uYW1lICE9IE5VTEwpCi0JewotCSAgY2hhciAqY29sb247Ci0KLQkgIHN0cmNweSAoYnVmZmVyLCBmdW5jdGlvbl9uYW1lKTsKLQkgIGNvbG9uID0gc3RyY2hyIChidWZmZXIsICc6Jyk7Ci0JICBpZiAoY29sb24gIT0gTlVMTCkKLQkgICAgKmNvbG9uID0gJ1wwJzsKLQkgIGxpbmVfaW5mby0+Y2FjaGUuZnVuY3Rpb25uYW1lID0gYnVmZmVyOwotCX0KLQotICAgICAgaWYgKG1haW5fZmlsZV9uYW1lICE9IE5VTEwpCi0JewotCSAgaWYgKGRpcmVjdG9yeV9uYW1lID09IE5VTEwgfHwgbWFpbl9maWxlX25hbWVbMF0gPT0gJy8nKQotCSAgICBsaW5lX2luZm8tPmNhY2hlLmZpbGVuYW1lID0gbWFpbl9maWxlX25hbWU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzcHJpbnRmIChidWZmZXIgKyBmdW5jbGVuLCAiJXMlcyIsIGRpcmVjdG9yeV9uYW1lLAotCQkgICAgICAgbWFpbl9maWxlX25hbWUpOwotCSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWUgPSBidWZmZXIgKyBmdW5jbGVuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRG8gdGhlIHdvcmsgb2YgZmluZF9uZWFyZXN0X2xpbmUuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lIChhYmZkLCBzZWN0aW9uLCBvZmZzZXQsIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsCi0JCQlsaW5lX2luZm8sIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgcmV0bGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnX2luZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcDsKLSAgICAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqbGluZV9pbmZvOwotICAgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpyZXRsaW5lX3B0cjsKLXsKLSAgb2Zmc2V0ICs9IHNlY3Rpb24tPnZtYTsKLQotICBpZiAobGluZV9pbmZvLT5jYWNoZS5zZWN0ID09IE5VTEwKLSAgICAgIHx8IGxpbmVfaW5mby0+Y2FjaGUuc2VjdCAhPSBzZWN0aW9uCi0gICAgICB8fCBvZmZzZXQgPCBsaW5lX2luZm8tPmNhY2hlLnN0YXJ0Ci0gICAgICB8fCBvZmZzZXQgPj0gbGluZV9pbmZvLT5jYWNoZS5zdG9wKQotICAgIHsKLSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuc2VjdCA9IHNlY3Rpb247Ci0gICAgICBsaW5lX2luZm8tPmNhY2hlLnN0YXJ0ID0gb2Zmc2V0OwotICAgICAgbGluZV9pbmZvLT5jYWNoZS5zdG9wID0gb2Zmc2V0OwotICAgICAgaWYgKCEgbG9va3VwX2xpbmUgKGFiZmQsIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsIGxpbmVfaW5mbykpCi0JewotCSAgbGluZV9pbmZvLT5jYWNoZS5zZWN0ID0gTlVMTDsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gICpmaWxlbmFtZV9wdHIgPSBsaW5lX2luZm8tPmNhY2hlLmZpbGVuYW1lOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IGxpbmVfaW5mby0+Y2FjaGUuZnVuY3Rpb25uYW1lOwotICAqcmV0bGluZV9wdHIgPSBsaW5lX2luZm8tPmNhY2hlLmxpbmVfbnVtOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogVGhlc2Ugcm91dGluZXMgY29weSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBpbnRvIGEgbWVtb3J5IGJ1ZmZlci4KLQotICAgRklYTUU6IFRoZSB3aG9sZSBwb2ludCBvZiB0aGUgc2h1ZmZsZSBjb2RlIGlzIHRvIGF2b2lkIHN0b3JpbmcKLSAgIGV2ZXJ5dGhpbmcgaW4gbWVtb3J5LCBzaW5jZSB0aGUgbGlua2VyIGlzIHN1Y2ggYSBtZW1vcnkgaG9nLiAgVGhpcwotICAgY29kZSBtYWtlcyB0aGF0IGVmZm9ydCB1c2VsZXNzLiAgSXQgaXMgb25seSBjYWxsZWQgYnkgdGhlIE1JUFMgRUxGCi0gICBjb2RlIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBzbyBpdCBpcyBub3QgdGhhdCBiaWcgYQotICAgZGVhbCwgYnV0IGl0IHNob3VsZCBiZSBmaXhlZCBldmVudHVhbGx5LiAgKi8KLQotLyogQ29sbGVjdCBhIHNodWZmbGUgaW50byBhIG1lbW9yeSBidWZmZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlY29mZl9jb2xsZWN0X3NodWZmbGUgUEFSQU1TICgoc3RydWN0IHNodWZmbGUgKiwgYmZkX2J5dGUgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfY29sbGVjdF9zaHVmZmxlIChsLCBidWZmKQotICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqbDsKLSAgICAgYmZkX2J5dGUgKmJ1ZmY7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdG90YWw7Ci0KLSAgdG90YWwgPSAwOwotICBmb3IgKDsgbCAhPSAoc3RydWN0IHNodWZmbGUgKikgTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgbC0+ZmlsZXApCi0JbWVtY3B5IChidWZmLCBsLT51Lm1lbW9yeSwgbC0+c2l6ZSk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGJmZF9zZWVrIChsLT51LmZpbGUuaW5wdXRfYmZkLCBsLT51LmZpbGUub2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF9yZWFkIChidWZmLCAxLCBsLT5zaXplLCBsLT51LmZpbGUuaW5wdXRfYmZkKSAhPSBsLT5zaXplKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgdG90YWwgKz0gbC0+c2l6ZTsKLSAgICAgIGJ1ZmYgKz0gbC0+c2l6ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgUERSIGluZm9ybWF0aW9uIGludG8gYSBtZW1vcnkgYnVmZmVyLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfcGRyIChoYW5kbGUsIGJ1ZmYpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZF9ieXRlICpidWZmOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOwotCi0gIHJldHVybiBlY29mZl9jb2xsZWN0X3NodWZmbGUgKGFpbmZvLT5wZHIsIGJ1ZmYpOwotfQotCi0vKiBDb3B5IHN5bWJvbCBpbmZvcm1hdGlvbiBpbnRvIGEgbWVtb3J5IGJ1ZmZlci4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3N5bSAoaGFuZGxlLCBidWZmKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmRfYnl0ZSAqYnVmZjsKLXsKLSAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGhhbmRsZTsKLQotICByZXR1cm4gZWNvZmZfY29sbGVjdF9zaHVmZmxlIChhaW5mby0+c3ltLCBidWZmKTsKLX0KLQotLyogQ29weSB0aGUgc3RyaW5nIHRhYmxlIGludG8gYSBtZW1vcnkgYnVmZmVyLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3MgKGhhbmRsZSwgYnVmZikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkX2J5dGUgKmJ1ZmY7Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqc2g7Ci0gIHVuc2lnbmVkIGxvbmcgdG90YWw7Ci0KLSAgLyogVGhlIHN0cmluZyB0YWJsZSBpcyB3cml0dGVuIG91dCBmcm9tIHRoZSBoYXNoIHRhYmxlIGlmIHRoaXMgaXMgYQotICAgICBmaW5hbCBsaW5rLiAgKi8KLSAgQkZEX0FTU0VSVCAoYWluZm8tPnNzID09IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKTsKLSAgKmJ1ZmYrKyA9ICdcMCc7Ci0gIHRvdGFsID0gMTsKLSAgQkZEX0FTU0VSVCAoYWluZm8tPnNzX2hhc2ggPT0gTlVMTCB8fCBhaW5mby0+c3NfaGFzaC0+dmFsID09IDEpOwotICBmb3IgKHNoID0gYWluZm8tPnNzX2hhc2g7Ci0gICAgICAgc2ggIT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMOwotICAgICAgIHNoID0gc2gtPm5leHQpCi0gICAgewotICAgICAgc2l6ZV90IGxlbjsKLQotICAgICAgbGVuID0gc3RybGVuIChzaC0+cm9vdC5zdHJpbmcpOwotICAgICAgbWVtY3B5IChidWZmLCAoUFRSKSBzaC0+cm9vdC5zdHJpbmcsIGxlbiArIDEpOwotICAgICAgdG90YWwgKz0gbGVuICsgMTsKLSAgICAgIGJ1ZmYgKz0gbGVuICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvZWNvZmZzd2FwLmggYi9iZmQvZWNvZmZzd2FwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMjhkMTYuLjAwMDAwMDAKLS0tIGEvYmZkL2Vjb2Zmc3dhcC5oCisrKyAvZGV2L251bGwKQEAgLTEsODUzICswLDAgQEAKLS8qIEdlbmVyaWMgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMsIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogTk9URTogVGhpcyBpcyBhIGhlYWRlciBmaWxlLCBidXQgaXQgY29udGFpbnMgZXhlY3V0YWJsZSByb3V0aW5lcy4KLSAgIFRoaXMgaXMgZG9uZSB0aGlzIHdheSBiZWNhdXNlIHRoZXNlIHJvdXRpbmVzIGFyZSBzdWJzdGFudGlhbGx5Ci0gICBzaW1pbGFyLCBidXQgYXJlIG5vdCBpZGVudGljYWwsIGZvciBhbGwgRUNPRkYgdGFyZ2V0cy4KLQotICAgVGhlc2UgYXJlIHJvdXRpbmVzIHRvIHN3YXAgdGhlIEVDT0ZGIHN5bWJvbGljIGluZm9ybWF0aW9uIGluIGFuZAotICAgb3V0LiAgVGhlIHJvdXRpbmVzIGFyZSBkZWZpbmVkIHN0YXRpY2FsbHkuICBZb3UgY2FuIHNldCBicmVha3BvaW50cwotICAgb24gdGhlbSBpbiBnZGIgYnkgbmFtaW5nIHRoZSBpbmNsdWRpbmcgc291cmNlIGZpbGU7IGUuZy4sCi0gICAnY29mZi1taXBzLmMnOmVjb2ZmX3N3YXBfaGRyX2luLgotCi0gICBCZWZvcmUgaW5jbHVkaW5nIHRoaXMgaGVhZGVyIGZpbGUsIG9uZSBvZiBFQ09GRl8zMiBvciBFQ09GRl82NCBtdXN0Ci0gICBiZSBkZWZpbmVkLiAgVGhlc2UgYXJlIGNoZWNrZWQgd2hlbiBzd2FwcGluZyBpbmZvcm1hdGlvbiB0aGF0Ci0gICBkZXBlbmRzIHVwb24gdGhlIHRhcmdldCBzaXplLiAgVGhpcyBjb2RlIHdvcmtzIGZvciAzMiBiaXQgYW5kIDY0Ci0gICBiaXQgRUNPRkYsIGJ1dCBtYXkgbmVlZCB0byBiZSBnZW5lcmFsaXplZCBpbiB0aGUgZnV0dXJlLgotCi0gICBTb21lIGhlYWRlciBmaWxlIHdoaWNoIGRlZmluZXMgdGhlIGV4dGVybmFsIGZvcm1zIG9mIHRoZXNlCi0gICBzdHJ1Y3R1cmVzIG11c3QgYWxzbyBiZSBpbmNsdWRlZCBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgaGVhZGVyIGZpbGUuCi0gICBDdXJyZW50bHkgdGhpcyBpcyBlaXRoZXIgY29mZi9taXBzLmggb3IgY29mZi9hbHBoYS5oLgotCi0gICBJZiB0aGUgc3ltYm9sIFRFU1QgaXMgZGVmaW5lZCB3aGVuIHRoaXMgZmlsZSBpcyBjb21waWxlZCwgYQotICAgY29tcGFyaXNvbiBpcyBtYWRlIHRvIGVuc3VyZSB0aGF0LCBpbiBmYWN0LCB0aGUgb3V0cHV0IGlzCi0gICBiaXQtZm9yLWJpdCB0aGUgc2FtZSBhcyB0aGUgaW5wdXQuICBPZiBjb3Vyc2UsIHRoaXMgc3ltYm9sIHNob3VsZAotICAgb25seSBiZSBkZWZpbmVkIHdoZW4gZGVsaWJlcmF0ZWx5IHRlc3RpbmcgdGhlIGNvZGUgb24gYSBtYWNoaW5lCi0gICB3aXRoIHRoZSBwcm9wZXIgYnl0ZSBzZXggYW5kIHN1Y2guICAqLwotCi0jaWZkZWYgRUNPRkZfMzIKLSNkZWZpbmUgZWNvZmZfZ2V0X29mZiBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgZWNvZmZfcHV0X29mZiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmZGVmIEVDT0ZGXzY0Ci0jZGVmaW5lIGVjb2ZmX2dldF9vZmYgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIGVjb2ZmX3B1dF9vZmYgYmZkX2hfcHV0XzY0Ci0jZW5kaWYKLQotLyogRUNPRkYgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhlc2UgYXJlIHRoZSBzYW1lCi0gICBmb3IgYWxsIEVDT0ZGIHRhcmdldHMsIHNvIHRoZXkgYXJlIGRlZmluZWQgaW4gZWNvZmZsaW5rLmMuICAqLwotCi1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luCi0gIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHRpcl9leHQgKiwgVElSICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0Ci0gIFBBUkFNUyAoKGludCwgY29uc3QgVElSICosIHN0cnVjdCB0aXJfZXh0ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luCi0gIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHJuZHhfZXh0ICosIFJORFhSICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dAotICBQQVJBTVMgKChpbnQsIGNvbnN0IFJORFhSICosIHN0cnVjdCBybmR4X2V4dCAqKSk7Ci0KLS8qIFByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfaGRyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEhEUlIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9oZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBIRFJSICosIFBUUikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9mZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgRkRSICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfZmRyX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgRkRSICosIFBUUikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9wZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUERSICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfcGRyX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgUERSICosIFBUUikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9zeW1faW4gUEFSQU1TICgoYmZkICosIFBUUiwgU1lNUiAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX3N5bV9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IFNZTVIgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2V4dF9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBFWFRSICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfZXh0X291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgRVhUUiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfcmZkX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFJGRFQgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9yZmRfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBSRkRUICosIFBUUikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9vcHRfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgT1BUUiAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX29wdF9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IE9QVFIgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2Rucl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBETlIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9kbnJfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBETlIgKiwgUFRSKSk7Ci0KLS8qIFN3YXAgaW4gdGhlIHN5bWJvbGljIGhlYWRlci4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2hkcl9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIEhEUlIgKmludGVybjsKLXsKLSAgc3RydWN0IGhkcl9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqKHN0cnVjdCBoZHJfZXh0ICopIGV4dF9jb3B5OwotCi0gIGludGVybi0+bWFnaWMgICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9tYWdpYyk7Ci0gIGludGVybi0+dnN0YW1wICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF92c3RhbXApOwotICBpbnRlcm4tPmlsaW5lTWF4ICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pbGluZU1heCk7Ci0gIGludGVybi0+Y2JMaW5lICAgICAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkxpbmUpOwotICBpbnRlcm4tPmNiTGluZU9mZnNldCAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JMaW5lT2Zmc2V0KTsKLSAgaW50ZXJuLT5pZG5NYXggICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaWRuTWF4KTsKLSAgaW50ZXJuLT5jYkRuT2Zmc2V0ICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiRG5PZmZzZXQpOwotICBpbnRlcm4tPmlwZE1heCAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pcGRNYXgpOwotICBpbnRlcm4tPmNiUGRPZmZzZXQgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JQZE9mZnNldCk7Ci0gIGludGVybi0+aXN5bU1heCAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lzeW1NYXgpOwotICBpbnRlcm4tPmNiU3ltT2Zmc2V0ICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JTeW1PZmZzZXQpOwotICBpbnRlcm4tPmlvcHRNYXggICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pb3B0TWF4KTsKLSAgaW50ZXJuLT5jYk9wdE9mZnNldCAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiT3B0T2Zmc2V0KTsKLSAgaW50ZXJuLT5pYXV4TWF4ICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaWF1eE1heCk7Ci0gIGludGVybi0+Y2JBdXhPZmZzZXQgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkF1eE9mZnNldCk7Ci0gIGludGVybi0+aXNzTWF4ICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lzc01heCk7Ci0gIGludGVybi0+Y2JTc09mZnNldCAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlNzT2Zmc2V0KTsKLSAgaW50ZXJuLT5pc3NFeHRNYXggICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaXNzRXh0TWF4KTsKLSAgaW50ZXJuLT5jYlNzRXh0T2Zmc2V0ID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3NFeHRPZmZzZXQpOwotICBpbnRlcm4tPmlmZE1heCAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZmRNYXgpOwotICBpbnRlcm4tPmNiRmRPZmZzZXQgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JGZE9mZnNldCk7Ci0gIGludGVybi0+Y3JmZCAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NyZmQpOwotICBpbnRlcm4tPmNiUmZkT2Zmc2V0ICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JSZmRPZmZzZXQpOwotICBpbnRlcm4tPmlleHRNYXggICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZXh0TWF4KTsKLSAgaW50ZXJuLT5jYkV4dE9mZnNldCAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiRXh0T2Zmc2V0KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgdGhlIHN5bWJvbGljIGhlYWRlci4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2hkcl9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEhEUlIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IGhkcl9leHQgKmV4dCA9IChzdHJ1Y3QgaGRyX2V4dCAqKSBleHRfcHRyOwotICBIRFJSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwotCi0gIGJmZF9oX3B1dF9zaWduZWRfMTYgKGFiZmQsIGludGVybi0+bWFnaWMsIChiZmRfYnl0ZSAqKWV4dC0+aF9tYWdpYyk7Ci0gIGJmZF9oX3B1dF9zaWduZWRfMTYgKGFiZmQsIGludGVybi0+dnN0YW1wLCAoYmZkX2J5dGUgKilleHQtPmhfdnN0YW1wKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlsaW5lTWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaWxpbmVNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiTGluZSwgKGJmZF9ieXRlICopZXh0LT5oX2NiTGluZSk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JMaW5lT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JMaW5lT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlkbk1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lkbk1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JEbk9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiRG5PZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXBkTWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaXBkTWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlBkT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JQZE9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3ltTWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaXN5bU1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JTeW1PZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlN5bU9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pb3B0TWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaW9wdE1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JPcHRPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYk9wdE9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pYXV4TWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaWF1eE1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JBdXhPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkF1eE9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3NNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pc3NNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiU3NPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlNzT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzc0V4dE1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lzc0V4dE1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JTc0V4dE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3NFeHRPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWZkTWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaWZkTWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkZkT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JGZE9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jcmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY3JmZCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JSZmRPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlJmZE9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pZXh0TWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaWV4dE1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JFeHRPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkV4dE9mZnNldCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgaW4gdGhlIGZpbGUgZGVzY3JpcHRvciByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9mZHJfaW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9jb3B5OwotICAgICBGRFIgKmludGVybjsKLXsKLSAgc3RydWN0IGZkcl9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqKHN0cnVjdCBmZHJfZXh0ICopIGV4dF9jb3B5OwotICAKLSAgaW50ZXJuLT5hZHIgICAgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2Fkcik7Ci0gIGludGVybi0+cnNzICAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX3Jzcyk7Ci0jaWZkZWYgRUNPRkZfNjQKLSAgaWYgKGludGVybi0+cnNzID09IDB4ZmZmZmZmZmYpCi0gICAgaW50ZXJuLT5yc3MgPSAtMTsKLSNlbmRpZgotICBpbnRlcm4tPmlzc0Jhc2UgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pc3NCYXNlKTsKLSAgaW50ZXJuLT5jYlNzICAgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NiU3MpOwotICBpbnRlcm4tPmlzeW1CYXNlICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pc3ltQmFzZSk7Ci0gIGludGVybi0+Y3N5bSAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NzeW0pOwotICBpbnRlcm4tPmlsaW5lQmFzZSAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pbGluZUJhc2UpOwotICBpbnRlcm4tPmNsaW5lICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jbGluZSk7Ci0gIGludGVybi0+aW9wdEJhc2UgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lvcHRCYXNlKTsKLSAgaW50ZXJuLT5jb3B0ICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY29wdCk7Ci0jaWZkZWYgRUNPRkZfMzIKLSAgaW50ZXJuLT5pcGRGaXJzdCAgICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaXBkRmlyc3QpOwotICBpbnRlcm4tPmNwZCAgICAgICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jcGQpOwotI2VuZGlmCi0jaWZkZWYgRUNPRkZfNjQKLSAgaW50ZXJuLT5pcGRGaXJzdCAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaXBkRmlyc3QpOwotICBpbnRlcm4tPmNwZCAgICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jcGQpOwotI2VuZGlmCi0gIGludGVybi0+aWF1eEJhc2UgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lhdXhCYXNlKTsKLSAgaW50ZXJuLT5jYXV4ICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY2F1eCk7Ci0gIGludGVybi0+cmZkQmFzZSAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX3JmZEJhc2UpOwotICBpbnRlcm4tPmNyZmQgICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jcmZkKTsKLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIGludGVybi0+bGFuZyAgICAgICAgPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0xBTkdfQklHKQotCQkJCQk+PiBGRFJfQklUUzFfTEFOR19TSF9CSUc7Ci0gICAgaW50ZXJuLT5mTWVyZ2UgICAgICA9IDAgIT0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9GTUVSR0VfQklHKTsKLSAgICBpbnRlcm4tPmZSZWFkaW4gICAgID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZSRUFESU5fQklHKTsKLSAgICBpbnRlcm4tPmZCaWdlbmRpYW4gID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZCSUdFTkRJQU5fQklHKTsKLSAgICBpbnRlcm4tPmdsZXZlbCAgICAgID0gKGV4dC0+Zl9iaXRzMlswXSAmIEZEUl9CSVRTMl9HTEVWRUxfQklHKQotCQkJCQk+PiBGRFJfQklUUzJfR0xFVkVMX1NIX0JJRzsKLSAgfSBlbHNlIHsKLSAgICBpbnRlcm4tPmxhbmcgICAgICAgID0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9MQU5HX0xJVFRMRSkKLQkJCQkJPj4gRkRSX0JJVFMxX0xBTkdfU0hfTElUVExFOwotICAgIGludGVybi0+Zk1lcmdlICAgICAgPSAwICE9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfRk1FUkdFX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5mUmVhZGluICAgICA9IDAgIT0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9GUkVBRElOX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5mQmlnZW5kaWFuICA9IDAgIT0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9GQklHRU5ESUFOX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5nbGV2ZWwgICAgICA9IChleHQtPmZfYml0czJbMF0gJiBGRFJfQklUUzJfR0xFVkVMX0xJVFRMRSkKLQkJCQkJPj4gRkRSX0JJVFMyX0dMRVZFTF9TSF9MSVRUTEU7Ci0gIH0KLSAgaW50ZXJuLT5yZXNlcnZlZCA9IDA7Ci0KLSAgaW50ZXJuLT5jYkxpbmVPZmZzZXQgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NiTGluZU9mZnNldCk7Ci0gIGludGVybi0+Y2JMaW5lICAgICAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYkxpbmUpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCB0aGUgZmlsZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2Zkcl9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEZEUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3QgZmRyX2V4dCAqZXh0ID0gKHN0cnVjdCBmZHJfZXh0ICopIGV4dF9wdHI7Ci0gIEZEUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+YWRyLCAoYmZkX2J5dGUgKilleHQtPmZfYWRyKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJzcywgKGJmZF9ieXRlICopZXh0LT5mX3Jzcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3NCYXNlLCAoYmZkX2J5dGUgKilleHQtPmZfaXNzQmFzZSk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JTcywgKGJmZF9ieXRlICopZXh0LT5mX2NiU3MpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXN5bUJhc2UsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pc3ltQmFzZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jc3ltLCAoYmZkX2J5dGUgKilleHQtPmZfY3N5bSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pbGluZUJhc2UsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pbGluZUJhc2UpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+Y2xpbmUsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jbGluZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pb3B0QmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX2lvcHRCYXNlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNvcHQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jb3B0KTsKLSNpZmRlZiBFQ09GRl8zMgotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGludGVybi0+aXBkRmlyc3QsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pcGRGaXJzdCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5jcGQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jcGQpOwotI2VuZGlmCi0jaWZkZWYgRUNPRkZfNjQKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlwZEZpcnN0LCAoYmZkX2J5dGUgKilleHQtPmZfaXBkRmlyc3QpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+Y3BkLCAoYmZkX2J5dGUgKilleHQtPmZfY3BkKTsKLSNlbmRpZgotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWF1eEJhc2UsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pYXV4QmFzZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jYXV4LCAoYmZkX2J5dGUgKilleHQtPmZfY2F1eCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5yZmRCYXNlLCAoYmZkX2J5dGUgKilleHQtPmZfcmZkQmFzZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jcmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY3JmZCk7Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBleHQtPmZfYml0czFbMF0gPSAoKChpbnRlcm4tPmxhbmcgPDwgRkRSX0JJVFMxX0xBTkdfU0hfQklHKQotCQkJJiBGRFJfQklUUzFfTEFOR19CSUcpCi0JCSAgICAgICB8IChpbnRlcm4tPmZNZXJnZSA/IEZEUl9CSVRTMV9GTUVSR0VfQklHIDogMCkKLQkJICAgICAgIHwgKGludGVybi0+ZlJlYWRpbiA/IEZEUl9CSVRTMV9GUkVBRElOX0JJRyA6IDApCi0JCSAgICAgICB8IChpbnRlcm4tPmZCaWdlbmRpYW4gPyBGRFJfQklUUzFfRkJJR0VORElBTl9CSUcgOiAwKSk7Ci0gICAgZXh0LT5mX2JpdHMyWzBdID0gKChpbnRlcm4tPmdsZXZlbCA8PCBGRFJfQklUUzJfR0xFVkVMX1NIX0JJRykKLQkJICAgICAgICYgRkRSX0JJVFMyX0dMRVZFTF9CSUcpOwotICAgIGV4dC0+Zl9iaXRzMlsxXSA9IDA7Ci0gICAgZXh0LT5mX2JpdHMyWzJdID0gMDsKLSAgfSBlbHNlIHsKLSAgICBleHQtPmZfYml0czFbMF0gPSAoKChpbnRlcm4tPmxhbmcgPDwgRkRSX0JJVFMxX0xBTkdfU0hfTElUVExFKQotCQkJJiBGRFJfQklUUzFfTEFOR19MSVRUTEUpCi0JCSAgICAgICB8IChpbnRlcm4tPmZNZXJnZSA/IEZEUl9CSVRTMV9GTUVSR0VfTElUVExFIDogMCkKLQkJICAgICAgIHwgKGludGVybi0+ZlJlYWRpbiA/IEZEUl9CSVRTMV9GUkVBRElOX0xJVFRMRSA6IDApCi0JCSAgICAgICB8IChpbnRlcm4tPmZCaWdlbmRpYW4gPyBGRFJfQklUUzFfRkJJR0VORElBTl9MSVRUTEUgOiAwKSk7Ci0gICAgZXh0LT5mX2JpdHMyWzBdID0gKChpbnRlcm4tPmdsZXZlbCA8PCBGRFJfQklUUzJfR0xFVkVMX1NIX0xJVFRMRSkKLQkJICAgICAgICYgRkRSX0JJVFMyX0dMRVZFTF9MSVRUTEUpOwotICAgIGV4dC0+Zl9iaXRzMlsxXSA9IDA7Ci0gICAgZXh0LT5mX2JpdHMyWzJdID0gMDsKLSAgfQotCi0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JMaW5lT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmZfY2JMaW5lT2Zmc2V0KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmUsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYkxpbmUpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0jaWZuZGVmIE1QV19DCi0KLS8qIFN3YXAgaW4gdGhlIHByb2NlZHVyZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3Bkcl9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIFBEUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgcGRyX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IHBkcl9leHQgKikgZXh0X2NvcHk7Ci0KLSAgbWVtc2V0ICgoUFRSKSBpbnRlcm4sIDAsIHNpemVvZiAoKmludGVybikpOwotCi0gIGludGVybi0+YWRyICAgICAgICAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9hZHIpOwotICBpbnRlcm4tPmlzeW0gICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pc3ltKTsKLSAgaW50ZXJuLT5pbGluZSAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfaWxpbmUpOwotICBpbnRlcm4tPnJlZ21hc2sgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdtYXNrKTsKLSAgaW50ZXJuLT5yZWdvZmZzZXQgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwKLQkJCQkJICAgICAgIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdvZmZzZXQpOwotICBpbnRlcm4tPmlvcHQgICAgICAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfaW9wdCk7Ci0gIGludGVybi0+ZnJlZ21hc2sgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdtYXNrKTsKLSAgaW50ZXJuLT5mcmVnb2Zmc2V0ICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwKLQkJCQkJICAgICAgIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnb2Zmc2V0KTsKLSAgaW50ZXJuLT5mcmFtZW9mZnNldCAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwKLQkJCQkJICAgICAgIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZW9mZnNldCk7Ci0gIGludGVybi0+ZnJhbWVyZWcgICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lcmVnKTsKLSAgaW50ZXJuLT5wY3JlZyAgICAgICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfcGNyZWcpOwotICBpbnRlcm4tPmxuTG93ICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkxvdyk7Ci0gIGludGVybi0+bG5IaWdoICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2xuSGlnaCk7Ci0gIGludGVybi0+Y2JMaW5lT2Zmc2V0ICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9jYkxpbmVPZmZzZXQpOwotCi0jaWZkZWYgRUNPRkZfNjQKLSAgaW50ZXJuLT5ncF9wcm9sb2d1ZSA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5wX2dwX3Byb2xvZ3VlKTsKLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgaW50ZXJuLT5ncF91c2VkID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX0dQX1VTRURfQklHKTsKLSAgICAgIGludGVybi0+cmVnX2ZyYW1lID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX1JFR19GUkFNRV9CSUcpOwotICAgICAgaW50ZXJuLT5wcm9mID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX1BST0ZfQklHKTsKLSAgICAgIGludGVybi0+cmVzZXJ2ZWQgPSAoKChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUkVTRVJWRURfQklHKQotCQkJICAgPDwgUERSX0JJVFMxX1JFU0VSVkVEX1NIX0xFRlRfQklHKQotCQkJICB8ICgoZXh0LT5wX2JpdHMyWzBdICYgUERSX0JJVFMyX1JFU0VSVkVEX0JJRykKLQkJCSAgICAgPj4gUERSX0JJVFMyX1JFU0VSVkVEX1NIX0JJRykpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludGVybi0+Z3BfdXNlZCA9IDAgIT0gKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9HUF9VU0VEX0xJVFRMRSk7Ci0gICAgICBpbnRlcm4tPnJlZ19mcmFtZSA9IDAgIT0gKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9SRUdfRlJBTUVfTElUVExFKTsKLSAgICAgIGludGVybi0+cHJvZiA9IDAgIT0gKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9QUk9GX0xJVFRMRSk7Ci0gICAgICBpbnRlcm4tPnJlc2VydmVkID0gKCgoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX1JFU0VSVkVEX0xJVFRMRSkKLQkJCSAgID4+IFBEUl9CSVRTMV9SRVNFUlZFRF9TSF9MSVRUTEUpCi0JCQkgIHwgKChleHQtPnBfYml0czJbMF0gJiBQRFJfQklUUzJfUkVTRVJWRURfTElUVExFKQotCQkJICAgICA8PCBQRFJfQklUUzJfUkVTRVJWRURfU0hfTEVGVF9MSVRUTEUpKTsKLSAgICB9Ci0gIGludGVybi0+bG9jYWxvZmYgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+cF9sb2NhbG9mZik7Ci0jZW5kaWYgIAotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCB0aGUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfcGRyX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgUERSICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBwZHJfZXh0ICpleHQgPSAoc3RydWN0IHBkcl9leHQgKikgZXh0X3B0cjsKLSAgUERSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5hZHIsIChiZmRfYnl0ZSAqKWV4dC0+cF9hZHIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXN5bSwgKGJmZF9ieXRlICopZXh0LT5wX2lzeW0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWxpbmUsIChiZmRfYnl0ZSAqKWV4dC0+cF9pbGluZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5yZWdtYXNrLCAoYmZkX2J5dGUgKilleHQtPnBfcmVnbWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5yZWdvZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdvZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aW9wdCwgKGJmZF9ieXRlICopZXh0LT5wX2lvcHQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+ZnJlZ21hc2ssIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnbWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5mcmVnb2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ29mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5mcmFtZW9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbnRlcm4tPmZyYW1lcmVnLCAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVyZWcpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGludGVybi0+cGNyZWcsIChiZmRfYnl0ZSAqKWV4dC0+cF9wY3JlZyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5sbkxvdywgKGJmZF9ieXRlICopZXh0LT5wX2xuTG93KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmxuSGlnaCwgKGJmZF9ieXRlICopZXh0LT5wX2xuSGlnaCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JMaW5lT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfY2JMaW5lT2Zmc2V0KTsKLQotI2lmZGVmIEVDT0ZGXzY0Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBpbnRlcm4tPmdwX3Byb2xvZ3VlLCAoYmZkX2J5dGUgKikgZXh0LT5wX2dwX3Byb2xvZ3VlKTsKLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgZXh0LT5wX2JpdHMxWzBdID0gKChpbnRlcm4tPmdwX3VzZWQgPyBQRFJfQklUUzFfR1BfVVNFRF9CSUcgOiAwKQotCQkJIHwgKGludGVybi0+cmVnX2ZyYW1lID8gUERSX0JJVFMxX1JFR19GUkFNRV9CSUcgOiAwKQotCQkJIHwgKGludGVybi0+cHJvZiA/IFBEUl9CSVRTMV9QUk9GX0JJRyA6IDApCi0JCQkgfCAoKGludGVybi0+cmVzZXJ2ZWQKLQkJCSAgICAgPj4gUERSX0JJVFMxX1JFU0VSVkVEX1NIX0xFRlRfQklHKQotCQkJICAgICYgUERSX0JJVFMxX1JFU0VSVkVEX0JJRykpOwotICAgICAgZXh0LT5wX2JpdHMyWzBdID0gKChpbnRlcm4tPnJlc2VydmVkIDw8IFBEUl9CSVRTMl9SRVNFUlZFRF9TSF9CSUcpCi0JCQkgJiBQRFJfQklUUzJfUkVTRVJWRURfQklHKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHQtPnBfYml0czFbMF0gPSAoKGludGVybi0+Z3BfdXNlZCA/IFBEUl9CSVRTMV9HUF9VU0VEX0xJVFRMRSA6IDApCi0JCQkgfCAoaW50ZXJuLT5yZWdfZnJhbWUgPyBQRFJfQklUUzFfUkVHX0ZSQU1FX0xJVFRMRSA6IDApCi0JCQkgfCAoaW50ZXJuLT5wcm9mID8gUERSX0JJVFMxX1BST0ZfTElUVExFIDogMCkKLQkJCSB8ICgoaW50ZXJuLT5yZXNlcnZlZCA8PCBQRFJfQklUUzFfUkVTRVJWRURfU0hfTElUVExFKQotCQkJICAgICYgUERSX0JJVFMxX1JFU0VSVkVEX0xJVFRMRSkpOwotICAgICAgZXh0LT5wX2JpdHMyWzBdID0gKChpbnRlcm4tPnJlc2VydmVkID4+Ci0JCQkgIFBEUl9CSVRTMl9SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRSkKLQkJCSAmIFBEUl9CSVRTMl9SRVNFUlZFRF9MSVRUTEUpOwotICAgIH0KLSAgYmZkX2hfcHV0XzggKGFiZmQsIGludGVybi0+bG9jYWxvZmYsIChiZmRfYnl0ZSAqKSBleHQtPnBfbG9jYWxvZmYpOwotI2VuZGlmICAKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotI2Vsc2UgLyogTVBXX0MgKi8KLS8qIFNhbWUgcm91dGluZXMsIGJ1dCB3aXRoIEVDT0ZGXzY0IGNvZGUgcmVtb3ZlZCwgc28gXiYlJCMmISBNUFcgQyBkb2Vzbid0Ci0gICBjb3JydXB0IGl0c2VsZiBhbmQgdGhlbiBmcmVhayBvdXQuICovCi0vKiBTd2FwIGluIHRoZSBwcm9jZWR1cmUgZGVzY3JpcHRvciByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9wZHJfaW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9jb3B5OwotICAgICBQRFIgKmludGVybjsKLXsKLSAgc3RydWN0IHBkcl9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqKHN0cnVjdCBwZHJfZXh0ICopIGV4dF9jb3B5OwotICAKLSAgaW50ZXJuLT5hZHIgICAgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2Fkcik7Ci0gIGludGVybi0+aXN5bSAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lzeW0pOwotICBpbnRlcm4tPmlsaW5lICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pbGluZSk7Ci0gIGludGVybi0+cmVnbWFzayAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX3JlZ21hc2spOwotICBpbnRlcm4tPnJlZ29mZnNldCAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAotCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX3JlZ29mZnNldCk7Ci0gIGludGVybi0+aW9wdCAgICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pb3B0KTsKLSAgaW50ZXJuLT5mcmVnbWFzayAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ21hc2spOwotICBpbnRlcm4tPmZyZWdvZmZzZXQgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAotCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdvZmZzZXQpOwotICBpbnRlcm4tPmZyYW1lb2Zmc2V0ICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAotCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lb2Zmc2V0KTsKLSAgaW50ZXJuLT5mcmFtZXJlZyAgICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVyZWcpOwotICBpbnRlcm4tPnBjcmVnICAgICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9wY3JlZyk7Ci0gIGludGVybi0+bG5Mb3cgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2xuTG93KTsKLSAgaW50ZXJuLT5sbkhpZ2ggICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfbG5IaWdoKTsKLSAgaW50ZXJuLT5jYkxpbmVPZmZzZXQgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2NiTGluZU9mZnNldCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IHRoZSBwcm9jZWR1cmUgZGVzY3JpcHRvciByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9wZHJfb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBQRFIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IHBkcl9leHQgKmV4dCA9IChzdHJ1Y3QgcGRyX2V4dCAqKSBleHRfcHRyOwotICBQRFIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmFkciwgKGJmZF9ieXRlICopZXh0LT5wX2Fkcik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3ltLCAoYmZkX2J5dGUgKilleHQtPnBfaXN5bSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pbGluZSwgKGJmZF9ieXRlICopZXh0LT5wX2lsaW5lKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJlZ21hc2ssIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdtYXNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJlZ29mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX3JlZ29mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pb3B0LCAoYmZkX2J5dGUgKilleHQtPnBfaW9wdCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5mcmVnbWFzaywgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdtYXNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyZWdvZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyYW1lb2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVvZmZzZXQpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGludGVybi0+ZnJhbWVyZWcsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZXJlZyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5wY3JlZywgKGJmZF9ieXRlICopZXh0LT5wX3BjcmVnKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmxuTG93LCAoYmZkX2J5dGUgKilleHQtPnBfbG5Mb3cpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+bG5IaWdoLCAoYmZkX2J5dGUgKilleHQtPnBfbG5IaWdoKTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmVPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9jYkxpbmVPZmZzZXQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotI2VuZGlmIC8qIE1QV19DICovCi0KLS8qIFN3YXAgaW4gYSBzeW1ib2wgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfc3ltX2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgU1lNUiAqaW50ZXJuOwotewotICBzdHJ1Y3Qgc3ltX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IHN5bV9leHQgKikgZXh0X2NvcHk7Ci0gIAotICBpbnRlcm4tPmlzcyAgICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+c19pc3MpOwotICBpbnRlcm4tPnZhbHVlICAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnNfdmFsdWUpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgaW50ZXJuLT5zdCAgICAgICAgICA9ICAoZXh0LT5zX2JpdHMxWzBdICYgU1lNX0JJVFMxX1NUX0JJRykKLQkJCQkJICAgPj4gU1lNX0JJVFMxX1NUX1NIX0JJRzsKLSAgICBpbnRlcm4tPnNjICAgICAgICAgID0gKChleHQtPnNfYml0czFbMF0gJiBTWU1fQklUUzFfU0NfQklHKQotCQkJCQkgICA8PCBTWU1fQklUUzFfU0NfU0hfTEVGVF9CSUcpCi0JCQl8ICgoZXh0LT5zX2JpdHMyWzBdICYgU1lNX0JJVFMyX1NDX0JJRykKLQkJCQkJICAgPj4gU1lNX0JJVFMyX1NDX1NIX0JJRyk7Ci0gICAgaW50ZXJuLT5yZXNlcnZlZCAgICA9IDAgIT0gKGV4dC0+c19iaXRzMlswXSAmIFNZTV9CSVRTMl9SRVNFUlZFRF9CSUcpOwotICAgIGludGVybi0+aW5kZXggICAgICAgPSAoKGV4dC0+c19iaXRzMlswXSAmIFNZTV9CSVRTMl9JTkRFWF9CSUcpCi0JCQkJCSAgIDw8IFNZTV9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRykKLQkJCXwgKGV4dC0+c19iaXRzM1swXSA8PCBTWU1fQklUUzNfSU5ERVhfU0hfTEVGVF9CSUcpCi0JCQl8IChleHQtPnNfYml0czRbMF0gPDwgU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfQklHKTsKLSAgfSBlbHNlIHsKLSAgICBpbnRlcm4tPnN0ICAgICAgICAgID0gIChleHQtPnNfYml0czFbMF0gJiBTWU1fQklUUzFfU1RfTElUVExFKQotCQkJCQkgICA+PiBTWU1fQklUUzFfU1RfU0hfTElUVExFOwotICAgIGludGVybi0+c2MgICAgICAgICAgPSAoKGV4dC0+c19iaXRzMVswXSAmIFNZTV9CSVRTMV9TQ19MSVRUTEUpCi0JCQkJCSAgID4+IFNZTV9CSVRTMV9TQ19TSF9MSVRUTEUpCi0JCQl8ICgoZXh0LT5zX2JpdHMyWzBdICYgU1lNX0JJVFMyX1NDX0xJVFRMRSkKLQkJCQkJICAgPDwgU1lNX0JJVFMyX1NDX1NIX0xFRlRfTElUVExFKTsKLSAgICBpbnRlcm4tPnJlc2VydmVkICAgID0gMCAhPSAoZXh0LT5zX2JpdHMyWzBdICYgU1lNX0JJVFMyX1JFU0VSVkVEX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5pbmRleCAgICAgICA9ICgoZXh0LT5zX2JpdHMyWzBdICYgU1lNX0JJVFMyX0lOREVYX0xJVFRMRSkKLQkJCQkJICAgPj4gU1lNX0JJVFMyX0lOREVYX1NIX0xJVFRMRSkKLQkJCXwgKGV4dC0+c19iaXRzM1swXSA8PCBTWU1fQklUUzNfSU5ERVhfU0hfTEVGVF9MSVRUTEUpCi0JCQl8ICgodW5zaWduZWQgaW50KSBleHQtPnNfYml0czRbMF0KLQkJCSAgIDw8IFNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0xJVFRMRSk7Ci0gIH0KLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgYSBzeW1ib2wgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgU1lNUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3Qgc3ltX2V4dCAqZXh0ID0gKHN0cnVjdCBzeW1fZXh0ICopIGV4dF9wdHI7Ci0gIFNZTVIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXNzLCAoYmZkX2J5dGUgKilleHQtPnNfaXNzKTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT52YWx1ZSwgKGJmZF9ieXRlICopZXh0LT5zX3ZhbHVlKTsKLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIGV4dC0+c19iaXRzMVswXSA9ICgoKGludGVybi0+c3QgPDwgU1lNX0JJVFMxX1NUX1NIX0JJRykKLQkJCSYgU1lNX0JJVFMxX1NUX0JJRykKLQkJICAgICAgIHwgKChpbnRlcm4tPnNjID4+IFNZTV9CSVRTMV9TQ19TSF9MRUZUX0JJRykKLQkJCSAgJiBTWU1fQklUUzFfU0NfQklHKSk7Ci0gICAgZXh0LT5zX2JpdHMyWzBdID0gKCgoaW50ZXJuLT5zYyA8PCBTWU1fQklUUzJfU0NfU0hfQklHKQotCQkJJiBTWU1fQklUUzJfU0NfQklHKQotCQkgICAgICAgfCAoaW50ZXJuLT5yZXNlcnZlZCA/IFNZTV9CSVRTMl9SRVNFUlZFRF9CSUcgOiAwKQotCQkgICAgICAgfCAoKGludGVybi0+aW5kZXggPj4gU1lNX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHKQotCQkJICAmIFNZTV9CSVRTMl9JTkRFWF9CSUcpKTsKLSAgICBleHQtPnNfYml0czNbMF0gPSAoaW50ZXJuLT5pbmRleCA+PiBTWU1fQklUUzNfSU5ERVhfU0hfTEVGVF9CSUcpICYgMHhmZjsKLSAgICBleHQtPnNfYml0czRbMF0gPSAoaW50ZXJuLT5pbmRleCA+PiBTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9CSUcpICYgMHhmZjsKLSAgfSBlbHNlIHsKLSAgICBleHQtPnNfYml0czFbMF0gPSAoKChpbnRlcm4tPnN0IDw8IFNZTV9CSVRTMV9TVF9TSF9MSVRUTEUpCi0JCQkmIFNZTV9CSVRTMV9TVF9MSVRUTEUpCi0JCSAgICAgICB8ICgoaW50ZXJuLT5zYyA8PCBTWU1fQklUUzFfU0NfU0hfTElUVExFKQotCQkJICAmIFNZTV9CSVRTMV9TQ19MSVRUTEUpKTsKLSAgICBleHQtPnNfYml0czJbMF0gPSAoKChpbnRlcm4tPnNjID4+IFNZTV9CSVRTMl9TQ19TSF9MRUZUX0xJVFRMRSkKLQkJCSYgU1lNX0JJVFMyX1NDX0xJVFRMRSkKLQkJICAgICAgIHwgKGludGVybi0+cmVzZXJ2ZWQgPyBTWU1fQklUUzJfUkVTRVJWRURfTElUVExFIDogMCkKLQkJICAgICAgIHwgKChpbnRlcm4tPmluZGV4IDw8IFNZTV9CSVRTMl9JTkRFWF9TSF9MSVRUTEUpCi0JCQkgICYgU1lNX0JJVFMyX0lOREVYX0xJVFRMRSkpOwotICAgIGV4dC0+c19iaXRzM1swXSA9IChpbnRlcm4tPmluZGV4ID4+IFNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRSkgJiAweGZmOwotICAgIGV4dC0+c19iaXRzNFswXSA9IChpbnRlcm4tPmluZGV4ID4+IFNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0xJVFRMRSkgJiAweGZmOwotICB9Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgaW4gYW4gZXh0ZXJuYWwgc3ltYm9sIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2V4dF9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIEVYVFIgKmludGVybjsKLXsKLSAgc3RydWN0IGV4dF9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqKHN0cnVjdCBleHRfZXh0ICopIGV4dF9jb3B5OwotICAKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBpbnRlcm4tPmptcHRibCAgICAgID0gMCAhPSAoZXh0LT5lc19iaXRzMVswXSAmIEVYVF9CSVRTMV9KTVBUQkxfQklHKTsKLSAgICBpbnRlcm4tPmNvYm9sX21haW4gID0gMCAhPSAoZXh0LT5lc19iaXRzMVswXSAmIEVYVF9CSVRTMV9DT0JPTF9NQUlOX0JJRyk7Ci0gICAgaW50ZXJuLT53ZWFrZXh0ICAgICA9IDAgIT0gKGV4dC0+ZXNfYml0czFbMF0gJiBFWFRfQklUUzFfV0VBS0VYVF9CSUcpOwotICB9IGVsc2UgewotICAgIGludGVybi0+am1wdGJsICAgICAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX0pNUFRCTF9MSVRUTEUpOwotICAgIGludGVybi0+Y29ib2xfbWFpbiAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX0NPQk9MX01BSU5fTElUVExFKTsKLSAgICBpbnRlcm4tPndlYWtleHQgICAgID0gMCAhPSAoZXh0LT5lc19iaXRzMVswXSAmIEVYVF9CSVRTMV9XRUFLRVhUX0xJVFRMRSk7Ci0gIH0KLSAgaW50ZXJuLT5yZXNlcnZlZCA9IDA7Ci0KLSNpZmRlZiBFQ09GRl8zMgotICBpbnRlcm4tPmlmZCAgICAgICAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmVzX2lmZCk7Ci0jZW5kaWYKLSNpZmRlZiBFQ09GRl82NAotICBpbnRlcm4tPmlmZCAgICAgICAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmVzX2lmZCk7Ci0jZW5kaWYKLQotICBlY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgJmV4dC0+ZXNfYXN5bSwgJmludGVybi0+YXN5bSk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IGFuIGV4dGVybmFsIHN5bWJvbCByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9leHRfb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFWFRSICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBleHRfZXh0ICpleHQgPSAoc3RydWN0IGV4dF9leHQgKikgZXh0X3B0cjsKLSAgRVhUUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgZXh0LT5lc19iaXRzMVswXSA9ICgoaW50ZXJuLT5qbXB0YmwgPyBFWFRfQklUUzFfSk1QVEJMX0JJRyA6IDApCi0JCQl8IChpbnRlcm4tPmNvYm9sX21haW4gPyBFWFRfQklUUzFfQ09CT0xfTUFJTl9CSUcgOiAwKQotCQkJfCAoaW50ZXJuLT53ZWFrZXh0ID8gRVhUX0JJVFMxX1dFQUtFWFRfQklHIDogMCkpOwotICAgIGV4dC0+ZXNfYml0czJbMF0gPSAwOwotI2lmZGVmIEVDT0ZGXzY0Ci0gICAgZXh0LT5lc19iaXRzMlsxXSA9IDA7Ci0gICAgZXh0LT5lc19iaXRzMlsyXSA9IDA7Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICBleHQtPmVzX2JpdHMxWzBdID0gKChpbnRlcm4tPmptcHRibCA/IEVYVF9CSVRTMV9KTVBUQkxfTElUVExFIDogMCkKLQkJCXwgKGludGVybi0+Y29ib2xfbWFpbiA/IEVYVF9CSVRTMV9DT0JPTF9NQUlOX0xJVFRMRSA6IDApCi0JCQl8IChpbnRlcm4tPndlYWtleHQgPyBFWFRfQklUUzFfV0VBS0VYVF9MSVRUTEUgOiAwKSk7Ci0gICAgZXh0LT5lc19iaXRzMlswXSA9IDA7Ci0jaWZkZWYgRUNPRkZfNjQKLSAgICBleHQtPmVzX2JpdHMyWzFdID0gMDsKLSAgICBleHQtPmVzX2JpdHMyWzJdID0gMDsKLSNlbmRpZgotICB9Ci0KLSNpZmRlZiBFQ09GRl8zMgotICBiZmRfaF9wdXRfc2lnbmVkXzE2IChhYmZkLCBpbnRlcm4tPmlmZCwgKGJmZF9ieXRlICopZXh0LT5lc19pZmQpOwotI2VuZGlmCi0jaWZkZWYgRUNPRkZfNjQKLSAgYmZkX2hfcHV0X3NpZ25lZF8zMiAoYWJmZCwgaW50ZXJuLT5pZmQsIChiZmRfYnl0ZSAqKWV4dC0+ZXNfaWZkKTsKLSNlbmRpZgotCi0gIGVjb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgJmludGVybi0+YXN5bSwgJmV4dC0+ZXNfYXN5bSk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgaW4gYSByZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3IuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9yZmRfaW4gKGFiZmQsIGV4dF9wdHIsIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X3B0cjsKLSAgICAgUkZEVCAqaW50ZXJuOwotewotICBzdHJ1Y3QgcmZkX2V4dCAqZXh0ID0gKHN0cnVjdCByZmRfZXh0ICopIGV4dF9wdHI7Ci0KLSAgKmludGVybiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5yZmQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCBhIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvci4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3JmZF9vdXQgKGFiZmQsIGludGVybiwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBSRkRUICppbnRlcm47Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3QgcmZkX2V4dCAqZXh0ID0gKHN0cnVjdCByZmRfZXh0ICopIGV4dF9wdHI7Ci0KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAqaW50ZXJuLCAoYmZkX2J5dGUgKilleHQtPnJmZCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgaW4gYW4gb3B0aW1pemF0aW9uIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX29wdF9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIE9QVFIgKmludGVybjsKLXsKLSAgc3RydWN0IG9wdF9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqKHN0cnVjdCBvcHRfZXh0ICopIGV4dF9jb3B5OwotCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIGludGVybi0+b3QgPSBleHQtPm9fYml0czFbMF07Ci0gICAgICBpbnRlcm4tPnZhbHVlID0gKCgodW5zaWduZWQgaW50KSBleHQtPm9fYml0czJbMF0KLQkJCTw8IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0JJRykKLQkJICAgICAgIHwgKCh1bnNpZ25lZCBpbnQpIGV4dC0+b19iaXRzM1swXQotCQkJICA8PCBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9CSUcpCi0JCSAgICAgICB8ICgodW5zaWduZWQgaW50KSBleHQtPm9fYml0czRbMF0KLQkJCSAgPDwgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ZXJuLT5vdCA9IGV4dC0+b19iaXRzMVswXTsKLSAgICAgIGludGVybi0+dmFsdWUgPSAoKGV4dC0+b19iaXRzMlswXSA8PCBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEUpCi0JCSAgICAgICB8IChleHQtPm9fYml0czNbMF0gPDwgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfTElUVExFKQotCQkgICAgICAgfCAoZXh0LT5vX2JpdHM0WzBdIDw8IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0xJVFRMRSkpOwotICAgIH0KLQotICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSwKLQkJCSAgICZleHQtPm9fcm5keCwgJmludGVybi0+cm5keCk7Ci0KLSAgaW50ZXJuLT5vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPm9fb2Zmc2V0KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgYW4gb3B0aW1pemF0aW9uIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX29wdF9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IE9QVFIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IG9wdF9leHQgKmV4dCA9IChzdHJ1Y3Qgb3B0X2V4dCAqKSBleHRfcHRyOwotICBPUFRSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIGV4dC0+b19iaXRzMVswXSA9IGludGVybi0+b3Q7Ci0gICAgICBleHQtPm9fYml0czJbMF0gPSBpbnRlcm4tPnZhbHVlID4+IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0JJRzsKLSAgICAgIGV4dC0+b19iaXRzM1swXSA9IGludGVybi0+dmFsdWUgPj4gT1BUX0JJVFMzX1ZBTFVFX1NIX0xFRlRfQklHOwotICAgICAgZXh0LT5vX2JpdHM0WzBdID0gaW50ZXJuLT52YWx1ZSA+PiBPUFRfQklUUzRfVkFMVUVfU0hfTEVGVF9CSUc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZXh0LT5vX2JpdHMxWzBdID0gaW50ZXJuLT5vdDsKLSAgICAgIGV4dC0+b19iaXRzMlswXSA9IGludGVybi0+dmFsdWUgPj4gT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfTElUVExFOwotICAgICAgZXh0LT5vX2JpdHMzWzBdID0gaW50ZXJuLT52YWx1ZSA+PiBPUFRfQklUUzNfVkFMVUVfU0hfTEVGVF9MSVRUTEU7Ci0gICAgICBleHQtPm9fYml0czRbMF0gPSBpbnRlcm4tPnZhbHVlID4+IE9QVF9CSVRTNF9WQUxVRV9TSF9MRUZUX0xJVFRMRTsKLSAgICB9Ci0KLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0IChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpLAotCQkJICAgICZpbnRlcm4tPnJuZHgsICZleHQtPm9fcm5keCk7Ci0KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnZhbHVlLCAoYmZkX2J5dGUgKikgZXh0LT5vX29mZnNldCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgaW4gYSBkZW5zZSBudW1iZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9kbnJfaW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9jb3B5OwotICAgICBETlIgKmludGVybjsKLXsKLSAgc3RydWN0IGRucl9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqKHN0cnVjdCBkbnJfZXh0ICopIGV4dF9jb3B5OwotCi0gIGludGVybi0+cmZkID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5kX3JmZCk7Ci0gIGludGVybi0+aW5kZXggPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmRfaW5kZXgpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCBhIGRlbnNlIG51bWJlci4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2Rucl9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEROUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3QgZG5yX2V4dCAqZXh0ID0gKHN0cnVjdCBkbnJfZXh0ICopIGV4dF9wdHI7Ci0gIEROUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cmZkLCAoYmZkX2J5dGUgKikgZXh0LT5kX3JmZCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pbmRleCwgKGJmZF9ieXRlICopIGV4dC0+ZF9pbmRleCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9iZmQvZWxmLWJmZC5oIGIvYmZkL2VsZi1iZmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJmZmUyYS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmLWJmZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZGF0YSBzdHJ1Y3R1cmVzIGZvciBFTEYgZmlsZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfTElCRUxGX0hfCi0jZGVmaW5lIF9MSUJFTEZfSF8gMQotCi0jaW5jbHVkZSAiZWxmL2NvbW1vbi5oIgotI2luY2x1ZGUgImVsZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImVsZi9leHRlcm5hbC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotLyogSWYgc2l6ZSBpc24ndCBzcGVjaWZpZWQgYXMgNjQgb3IgMzIsIE5BTUUgbWFjcm8gc2hvdWxkIGZhaWwuICAqLwotI2lmbmRlZiBOQU1FCi0jaWYgQVJDSF9TSVpFPT02NAotI2RlZmluZSBOQU1FKHgseSkgQ0FUNCh4LDY0LF8seSkKLSNlbmRpZgotI2lmIEFSQ0hfU0laRT09MzIKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDQoeCwzMixfLHkpCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIE5BTUUKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDQoeCxOT1NJWkUsXyx5KQotI2VuZGlmCi0KLSNkZWZpbmUgRWxmTkFNRShYKQlOQU1FKEVsZixYKQotI2RlZmluZSBlbGZOQU1FKFgpCU5BTUUoZWxmLFgpCi0KLS8qIEluZm9ybWF0aW9uIGhlbGQgZm9yIGFuIEVMRiBzeW1ib2wuICBUaGUgZmlyc3QgZmllbGQgaXMgdGhlCi0gICBjb3JyZXNwb25kaW5nIGFzeW1ib2wuICBFdmVyeSBzeW1ib2wgaXMgYW4gRUxGIGZpbGUgaXMgYWN0dWFsbHkgYQotICAgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSwgYWx0aG91Z2ggaXQgaXMgb2Z0ZW4gaGFuZGxlZCBhcyBhCi0gICBwb2ludGVyIHRvIGFuIGFzeW1ib2wuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUaGUgQkZEIHN5bWJvbC4gICovCi0gIGFzeW1ib2wgc3ltYm9sOwotICAvKiBFTEYgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSAgRWxmX0ludGVybmFsX1N5bSBpbnRlcm5hbF9lbGZfc3ltOwotICAvKiBCYWNrZW5kIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaHBwYV9hcmdfcmVsb2M7Ci0gICAgICBQVFIgbWlwc19leHRyOwotICAgICAgUFRSIGFueTsKLSAgICB9Ci0gIHRjX2RhdGE7Ci0KLSAgLyogVmVyc2lvbiBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgZnJvbSBhbiBFbGZfSW50ZXJuYWxfVmVyc3ltCi0gICAgIHN0cnVjdHVyZSBpbiBhIFNIVF9HTlVfdmVyc3ltIHNlY3Rpb24uICBJdCBpcyB6ZXJvIGlmIHRoZXJlIGlzIG5vCi0gICAgIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotICB1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uOwotCi19IGVsZl9zeW1ib2xfdHlwZTsKLQwKLS8qIEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICBUaGlzIGlzIGluaXRpYWxpemVkIHRvIC0xLiAgSXQgaXMKLSAgICAgc2V0IHRvIC0yIGlmIHRoZSBzeW1ib2wgaXMgdXNlZCBieSBhIHJlbG9jLiAgKi8KLSAgbG9uZyBpbmR4OwotCi0gIC8qIFN5bWJvbCBzaXplLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0gIC8qIFN5bWJvbCBpbmRleCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgSW5pdGlhbGl6ZWQgdG8gLTEsIGFuZCByZW1haW5zCi0gICAgIC0xIGlmIHRoaXMgaXMgbm90IGEgZHluYW1pYyBzeW1ib2wuICAqLwotICBsb25nIGR5bmluZHg7Ci0KLSAgLyogU3RyaW5nIHRhYmxlIGluZGV4IGluIC5keW5zdHIgaWYgdGhpcyBpcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBkeW5zdHJfaW5kZXg7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCB0aGlzCi0gICAgIGZpZWxkIHBvaW50cyB0byBhIGRlZmluZWQgc3ltYm9sIHdpdGggdGhlIHNhbWUgdmFsdWUsIGlmIHRoZXJlIGlzCi0gICAgIG9uZS4gIE90aGVyd2lzZSBpdCBpcyBOVUxMLiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKndlYWtkZWY7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgcmVxdWlyZXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHRoZQotICAgICBwcm9jZXNzb3Igc3BlY2lmaWMgYmFja2VuZCB1c2VzIHRoaXMgZmllbGQgdG8gdHJhY2sgdXNhZ2UgYW5kCi0gICAgIGZpbmFsIG9mZnNldC4gIFdlIHVzZSBhIHVuaW9uIGFuZCB0d28gbmFtZXMgcHJpbWFyaWx5IHRvIGRvY3VtZW50Ci0gICAgIHRoZSBpbnRlbnQgb2YgYW55IHBhcnRpY3VsYXIgcGllY2Ugb2YgY29kZS4gIFRoZSBmaWVsZCBzaG91bGQgYmUKLSAgICAgdXNlZCBhcyBhIGNvdW50IHVudGlsIHNpemVfZHluYW1pY19zZWN0aW9ucywgYXQgd2hpY2ggcG9pbnQgdGhlCi0gICAgIGNvbnRlbnRzIG9mIHRoZSAuZ290IGlzIGZpeGVkLiAgQWZ0ZXJ3YXJkLCBpZiB0aGlzIGZpZWxkIGlzIC0xLAotICAgICB0aGVuIHRoZSBzeW1ib2wgZG9lcyBub3QgcmVxdWlyZSBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHJlZmNvdW50OwotICAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgfSBnb3Q7Ci0KLSAgLyogU2FtZSwgYnV0IHRyYWNrcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSByZWZjb3VudDsKLSAgICAgIGJmZF92bWEgb2Zmc2V0OwotICAgIH0gcGx0OwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIHVzZWQgaW4gdGhlIGxpbmtlciBjcmVhdGVkIHNlY3Rpb25zLCB0aGUgcHJvY2Vzc29yCi0gICAgIHNwZWNpZmljIGJhY2tlbmQgdXNlcyB0aGlzIGZpZWxkIHRvIG1hcCB0aGUgZmllbGQgaW50byB0aGUgb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMgKmxpbmtlcl9zZWN0aW9uX3BvaW50ZXI7Ci0KLSAgLyogVmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0gIHVuaW9uCi0gIHsKLSAgICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgZm9yIGEgc3ltYm9sIHdoaWNoIGlzIG5vdCBkZWZpbmVkIGluIGEKLSAgICAgICByZWd1bGFyIG9iamVjdC4gIEl0IHBvaW50cyB0byB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiByZWFkIGluCi0gICAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QuICAqLwotICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgKnZlcmRlZjsKLSAgICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgZm9yIGEgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgaW4gYSByZWd1bGFyCi0gICAgICAgb2JqZWN0LiAgSXQgaXMgc2V0IHVwIGluIHNpemVfZHluYW1pY19zZWN0aW9ucy4gIEl0IHBvaW50cyB0bwotICAgICAgIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHdlIHNob3VsZCB3cml0ZSBvdXQgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnZlcnRyZWU7Ci0gIH0gdmVyaW5mbzsKLQotICAvKiBWaXJ0dWFsIHRhYmxlIGVudHJ5IHVzZSBpbmZvcm1hdGlvbi4gIFRoaXMgYXJyYXkgaXMgbm9taW5hbGx5IG9mIHNpemUKLSAgICAgc2l6ZS9zaXplb2YodGFyZ2V0X3ZvaWRfcG9pbnRlciksIHRob3VnaCB3ZSBoYXZlIHRvIGJlIGFibGUgdG8gYXNzdW1lCi0gICAgIGFuZCB0cmFjayBhIHNpemUgd2hpbGUgdGhlIHN5bWJvbCBpcyBzdGlsbCB1bmRlZmluZWQuICBJdCBpcyBpbmRleGVkCi0gICAgIHZpYSBvZmZzZXQvc2l6ZW9mKHRhcmdldF92b2lkX3BvaW50ZXIpLiAgKi8KLSAgc2l6ZV90IHZ0YWJsZV9lbnRyaWVzX3NpemU7Ci0gIGJvb2xlYW4gKnZ0YWJsZV9lbnRyaWVzX3VzZWQ7Ci0KLSAgLyogVmlydHVhbCB0YWJsZSBkZXJpdmF0aW9uIGluZm8uICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqdnRhYmxlX3BhcmVudDsKLQotICAvKiBTeW1ib2wgdHlwZSAoU1RUX05PVFlQRSwgU1RUX09CSkVDVCwgZXRjLikuICAqLwotICBjaGFyIHR5cGU7Ci0KLSAgLyogU3ltYm9sIHN0X290aGVyIHZhbHVlLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvdGhlcjsKLQotICAvKiBIYXNoIHZhbHVlIG9mIHRoZSBuYW1lIGNvbXB1dGVkIHVzaW5nIHRoZSBFTEYgaGFzaCBmdW5jdGlvbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgZWxmX2hhc2hfdmFsdWU7Ci0KLSAgLyogU29tZSBmbGFnczsgbGVnYWwgdmFsdWVzIGZvbGxvdy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGVsZl9saW5rX2hhc2hfZmxhZ3M7Ci0gIC8qIFN5bWJvbCBpcyByZWZlcmVuY2VkIGJ5IGEgbm9uLXNoYXJlZCBvYmplY3QuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSIDAxCi0gIC8qIFN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgbm9uLXNoYXJlZCBvYmplY3QuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSIDAyCi0gIC8qIFN5bWJvbCBpcyByZWZlcmVuY2VkIGJ5IGEgc2hhcmVkIG9iamVjdC4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMgMDQKLSAgLyogU3ltYm9sIGlzIGRlZmluZWQgYnkgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQyAwMTAKLSAgLyogU3ltYm9sIGhhcyBhIG5vbi13ZWFrIHJlZmVyZW5jZSBmcm9tIGEgbm9uLXNoYXJlZCBvYmplY3QuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUsgMDIwCi0gIC8qIER5bmFtaWMgc3ltYm9sIGhhcyBiZWVuIGFkanVzdGQuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX0RZTkFNSUNfQURKVVNURUQgMDQwCi0gIC8qIFN5bWJvbCBuZWVkcyBhIGNvcHkgcmVsb2MuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX05FRURTX0NPUFkgMDEwMAotICAvKiBTeW1ib2wgbmVlZHMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIDAyMDAKLSAgLyogU3ltYm9sIGFwcGVhcnMgaW4gYSBub24tRUxGIGlucHV0IGZpbGUuICAqLwotI2RlZmluZSBFTEZfTElOS19OT05fRUxGIDA0MDAKLSAgLyogU3ltYm9sIHNob3VsZCBiZSBtYXJrZWQgYXMgaGlkZGVuIGluIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSElEREVOIDAxMDAwCi0gIC8qIFN5bWJvbCB3YXMgZm9yY2VkIHRvIGxvY2FsIHNjb3BlIGR1ZSB0byBhIHZlcnNpb24gc2NyaXB0IGZpbGUuICAqLwotI2RlZmluZSBFTEZfTElOS19GT1JDRURfTE9DQUwgMDIwMDAKLSAgLyogU3ltYm9sIHdhcyBtYXJrZWQgZHVyaW5nIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfTUFSSyAwNDAwMAotfTsKLQotLyogRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLSAgLyogV2hldGhlciB3ZSBoYXZlIGNyZWF0ZWQgdGhlIHNwZWNpYWwgZHluYW1pYyBzZWN0aW9ucyByZXF1aXJlZAotICAgICB3aGVuIGxpbmtpbmcgYWdhaW5zdCBvciBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdC4gICovCi0gIGJvb2xlYW4gZHluYW1pY19zZWN0aW9uc19jcmVhdGVkOwotICAvKiBUaGUgQkZEIHVzZWQgdG8gaG9sZCBzcGVjaWFsIHNlY3Rpb25zIGNyZWF0ZWQgYnkgdGhlIGxpbmtlci4KLSAgICAgVGhpcyB3aWxsIGJlIHRoZSBmaXJzdCBCRkQgZm91bmQgd2hpY2ggcmVxdWlyZXMgdGhlc2Ugc2VjdGlvbnMgdG8KLSAgICAgYmUgY3JlYXRlZC4gICovCi0gIGJmZCAqZHlub2JqOwotICAvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbHMgZm91bmQgaW4gdGhlIGxpbmsgd2hpY2ggbXVzdCBiZSBwdXQgaW50bwotICAgICB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBkeW5zeW1jb3VudDsKLSAgLyogVGhlIHN0cmluZyB0YWJsZSBvZiBkeW5hbWljIHN5bWJvbHMsIHdoaWNoIGJlY29tZXMgdGhlIC5keW5zdHIKLSAgICAgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKmR5bnN0cjsKLSAgLyogVGhlIG51bWJlciBvZiBidWNrZXRzIGluIHRoZSBoYXNoIHRhYmxlIGluIHRoZSAuaGFzaCBzZWN0aW9uLgotICAgICBUaGlzIGlzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBidWNrZXRjb3VudDsKLSAgLyogQSBsaW5rZWQgbGlzdCBvZiBEVF9ORUVERUQgbmFtZXMgZm91bmQgaW4gZHluYW1pYyBvYmplY3RzCi0gICAgIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQ7Ci0gIC8qIFRoZSBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sLiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmhnb3Q7Ci0gIC8qIEEgcG9pbnRlciB0byBpbmZvcm1hdGlvbiB1c2VkIHRvIGxpbmsgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotICBQVFIgc3RhYl9pbmZvOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQlcCi0gICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikJCQkJCVwKLSAgIGJmZF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLAkJXAotCQkJIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhbiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBFTEYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGVsZl9oYXNoX3RhYmxlKHApICgoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0MCi0vKiBDb25zdGFudCBpbmZvcm1hdGlvbiBoZWxkIGZvciBhbiBFTEYgYmFja2VuZC4gICovCi0KLXN0cnVjdCBlbGZfc2l6ZV9pbmZvIHsKLSAgdW5zaWduZWQgY2hhciBzaXplb2ZfZWhkciwgc2l6ZW9mX3BoZHIsIHNpemVvZl9zaGRyOwotICB1bnNpZ25lZCBjaGFyIHNpemVvZl9yZWwsIHNpemVvZl9yZWxhLCBzaXplb2Zfc3ltLCBzaXplb2ZfZHluLCBzaXplb2Zfbm90ZTsKLQotICB1bnNpZ25lZCBjaGFyIGFyY2hfc2l6ZSwgZmlsZV9hbGlnbjsKLSAgdW5zaWduZWQgY2hhciBlbGZjbGFzcywgZXZfY3VycmVudDsKLSAgaW50ICgqd3JpdGVfb3V0X3BoZHJzKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKiwgaW50KSk7Ci0gIGJvb2xlYW4gKCp3cml0ZV9zaGRyc19hbmRfZWhkcikgUEFSQU1TICgoYmZkICopKTsKLSAgdm9pZCAoKndyaXRlX3JlbG9jcykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotICB2b2lkICgqc3dhcF9zeW1ib2xfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLCBQVFIpKTsKLSAgYm9vbGVhbiAoKnNsdXJwX3JlbG9jX3RhYmxlKQotICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci0gIGxvbmcgKCpzbHVycF9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci0gIHZvaWQgKCpzd2FwX2R5bl9pbikgUEFSQU1TICgoYmZkICosIGNvbnN0IFBUUiwgRWxmX0ludGVybmFsX0R5biAqKSk7Ci19OwotCi0jZGVmaW5lIGVsZl9zeW1ib2xfZnJvbShBQkZELFMpIFwKLQkoKChTKS0+dGhlX2JmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyIFwKLQkgICYmIChTKS0+dGhlX2JmZC0+dGRhdGEuZWxmX29ial9kYXRhICE9IDApIFwKLQkgPyAoZWxmX3N5bWJvbF90eXBlICopIChTKSBcCi0JIDogMCkKLQotc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEKLXsKLSAgLyogV2hldGhlciB0aGUgYmFja2VuZCB1c2VzIFJFTCBvciBSRUxBIHJlbG9jYXRpb25zLiAgRklYTUU6IHNvbWUKLSAgICAgRUxGIGJhY2tlbmRzIHVzZSBib3RoLiAgV2hlbiB3ZSBuZWVkIHRvIHN1cHBvcnQgb25lLCB0aGlzIHdob2xlCi0gICAgIGFwcHJvYWNoIHdpbGwgbmVlZCB0byBiZSBjaGFuZ2VkLiAgKi8KLSAgaW50IHVzZV9yZWxhX3A7Ci0KLSAgLyogVGhlIGFyY2hpdGVjdHVyZSBmb3IgdGhpcyBiYWNrZW5kLiAgKi8KLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0KLSAgLyogVGhlIEVMRiBtYWNoaW5lIGNvZGUgKEVNX3h4eHgpIGZvciB0aGlzIGJhY2tlbmQuICAqLwotICBpbnQgZWxmX21hY2hpbmVfY29kZTsKLQotICAvKiBUaGUgbWF4aW11bSBwYWdlIHNpemUgZm9yIHRoaXMgYmFja2VuZC4gICovCi0gIGJmZF92bWEgbWF4cGFnZXNpemU7Ci0KLSAgLyogVGhpcyBpcyB0cnVlIGlmIHRoZSBsaW5rZXIgc2hvdWxkIGFjdCBsaWtlIGNvbGxlY3QgYW5kIGdhdGhlcgotICAgICBnbG9iYWwgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBieSBuYW1lLiAgVGhpcyBpcyB0cnVlIGZvcgotICAgICBNSVBTIEVMRiBiZWNhdXNlIHRoZSBJcml4IDUgdG9vbHMgY2FuIG5vdCBoYW5kbGUgdGhlIC5pbml0Ci0gICAgIHNlY3Rpb24uICAqLwotICBib29sZWFuIGNvbGxlY3Q7Ci0KLSAgLyogVGhpcyBpcyB0cnVlIGlmIHRoZSBsaW5rZXIgc2hvdWxkIGlnbm9yZSBjaGFuZ2VzIHRvIHRoZSB0eXBlIG9mIGEKLSAgICAgc3ltYm9sLiAgVGhpcyBpcyB0cnVlIGZvciBNSVBTIEVMRiBiZWNhdXNlIHNvbWUgSXJpeCA1IG9iamVjdHMKLSAgICAgcmVjb3JkIHVuZGVmaW5lZCBmdW5jdGlvbnMgYXMgU1RUX09CSkVDVCBhbHRob3VnaCB0aGUgZGVmaW5pdGlvbnMKLSAgICAgYXJlIFNUVF9GVU5DLiAgKi8KLSAgYm9vbGVhbiB0eXBlX2NoYW5nZV9vazsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIHRyYW5zbGF0ZSBhbiBFTEYgUkVMQSByZWxvY2F0aW9uIHRvIGEgQkZEIGFyZWxlbnQKLSAgICAgc3RydWN0dXJlLiAgKi8KLSAgdm9pZCAoKmVsZl9pbmZvX3RvX2hvd3RvKSBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLAotCQkJCSAgICAgRWxmX0ludGVybmFsX1JlbGEgKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gdHJhbnNsYXRlIGFuIEVMRiBSRUwgcmVsb2NhdGlvbiB0byBhIEJGRCBhcmVsZW50Ci0gICAgIHN0cnVjdHVyZS4gICovCi0gIHZvaWQgKCplbGZfaW5mb190b19ob3d0b19yZWwpIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosCi0JCQkJCSBFbGZfSW50ZXJuYWxfUmVsICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGEgc3ltYm9sIGlzIGdsb2JhbCB3aGVuCi0gICAgIHBhcnRpdGlvbmluZyB0aGUgc3ltYm9sIHRhYmxlIGludG8gbG9jYWwgYW5kIGdsb2JhbCBzeW1ib2xzLgotICAgICBUaGlzIHNob3VsZCBiZSBOVUxMIGZvciBtb3N0IHRhcmdldHMsIGluIHdoaWNoIGNhc2UgdGhlIGNvcnJlY3QKLSAgICAgdGhpbmcgd2lsbCBiZSBkb25lLiAgTUlQUyBFTEYsIGF0IGxlYXN0IG9uIHRoZSBJcml4IDUsIGhhcwotICAgICBzcGVjaWFsIHJlcXVpcmVtZW50cy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0KLSAgLyogVGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgYXJlIGhvb2tzIHdoaWNoIGFyZSBjYWxsZWQgb25seSBpZiB0aGV5Ci0gICAgIGFyZSBub3QgTlVMTC4gICovCi0KLSAgLyogQSBmdW5jdGlvbiB0byBwZXJtaXQgYSBiYWNrZW5kIHNwZWNpZmljIGNoZWNrIG9uIHdoZXRoZXIgYQotICAgICBwYXJ0aWN1bGFyIEJGRCBmb3JtYXQgaXMgcmVsZXZhbnQgZm9yIGFuIG9iamVjdCBmaWxlLCBhbmQgdG8KLSAgICAgcGVybWl0IHRoZSBiYWNrZW5kIHRvIHNldCBhbnkgZ2xvYmFsIGluZm9ybWF0aW9uIGl0IHdpc2hlcy4gIFdoZW4KLSAgICAgdGhpcyBpcyBjYWxsZWQgZWxmX2VsZmhlYWRlciBpcyBzZXQsIGJ1dCBhbnl0aGluZyBlbHNlIHNob3VsZCBiZQotICAgICB1c2VkIHdpdGggY2F1dGlvbi4gIElmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIGNoZWNrX2Zvcm1hdAotICAgICByb3V0aW5lIHdpbGwgcmV0dXJuIGEgYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCBlcnJvci4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9vYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFkZGl0aW9uYWwgc3ltYm9sIHByb2Nlc3Npbmcgd2hlbiByZWFkaW5nIHRoZQotICAgICBFTEYgc3ltYm9sIHRhYmxlLiAgVGhpcyBpcyB3aGVyZSBhbnkgcHJvY2Vzc29yLXNwZWNpZmljIHNwZWNpYWwKLSAgICAgc2VjdGlvbiBpbmRpY2VzIGFyZSBoYW5kbGVkLiAgKi8KLSAgdm9pZCAoKmVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0KLSAgLyogQSBmdW5jdGlvbiB0byBkbyBhZGRpdGlvbmFsIHN5bWJvbCBwcm9jZXNzaW5nIGFmdGVyIHJlYWRpbmcgdGhlCi0gICAgIGVudGlyZSBFTEYgc3ltYm9sIHRhYmxlLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKSBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCQkgIGVsZl9zeW1ib2xfdHlwZSAqLAotCQkJCQkJCSAgdW5zaWduZWQgaW50KSk7Ci0KLSAgIC8qIEEgZnVuY3Rpb24gdG8gc2V0IHRoZSB0eXBlIG9mIHRoZSBpbmZvIGZpZWxkLiAgUHJvY2Vzc29yLXNwZWNpZmljCi0gICAgIHR5cGVzIHNob3VsZCBiZSBoYW5kbGVkIGhlcmUuICovCi0gIGludCAoKmVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZSkgUEFSQU1TICgoIEVsZl9JbnRlcm5hbF9TeW0gKiwgaW50KSk7IAotIAotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBvbiB0aGUgRUxGIHNlY3Rpb24gaGVhZGVyCi0gICAgIGp1c3QgYmVmb3JlIHdyaXRpbmcgaXQgb3V0LiAgVGhpcyBpcyB1c2VkIHRvIHNldCB0aGUgZmxhZ3MgYW5kCi0gICAgIHR5cGUgZmllbGRzIGZvciBzb21lIHNlY3Rpb25zLCBvciB0byBhY3R1YWxseSB3cml0ZSBvdXQgZGF0YSBmb3IKLSAgICAgdW51c3VhbCBzZWN0aW9ucy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGhhbmRsZSB1bnVzdWFsIHNlY3Rpb24gdHlwZXMgd2hlbiBjcmVhdGluZyBCRkQKLSAgICAgc2VjdGlvbnMgZnJvbSBFTEYgc2VjdGlvbnMuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiwKLQkJCQkJCSAgICBjaGFyICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIHNldCB1cCB0aGUgRUxGIHNlY3Rpb24gaGVhZGVyIGZvciBhIEJGRCBzZWN0aW9uIGluCi0gICAgIHByZXBhcmF0aW9uIGZvciB3cml0aW5nIGl0IG91dC4gIFRoaXMgaXMgd2hlcmUgdGhlIGZsYWdzIGFuZCB0eXBlCi0gICAgIGZpZWxkcyBhcmUgc2V0IGZvciB1bnVzdWFsIHNlY3Rpb25zLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpIFBBUkFNUyAoKGJmZCAqLCBFbGYzMl9JbnRlcm5hbF9TaGRyICosCi0JCQkJCQlhc2VjdGlvbiAqKSk7Ci0KLSAgLyogQSBmdW5jdGlvbiB0byBnZXQgdGhlIEVMRiBzZWN0aW9uIGluZGV4IGZvciBhIEJGRCBzZWN0aW9uLiAgSWYKLSAgICAgdGhpcyByZXR1cm5zIHRydWUsIHRoZSBzZWN0aW9uIHdhcyBmb3VuZC4gIElmIGl0IGlzIGEgbm9ybWFsIEVMRgotICAgICBzZWN0aW9uLCAqUkVUVkFMIHNob3VsZCBiZSBsZWZ0IHVuY2hhbmdlZC4gIElmIGl0IGlzIG5vdCBhIG5vcm1hbAotICAgICBFTEYgc2VjdGlvbiAqUkVUVkFMIHNob3VsZCBiZSBzZXQgdG8gdGhlIFNITl94eHh4IGluZGV4LiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbikKLSAgICBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqLCBpbnQgKnJldHZhbCkpOwotCi0gIC8qIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIGl0IGlzIGNhbGxlZCBieSB0aGUgYWRkX3N5bWJvbHMgcGhhc2UKLSAgICAgb2YgYSBsaW5rIGp1c3QgYmVmb3JlIGFkZGluZyBhIHN5bWJvbCB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoCi0gICAgIHRhYmxlLiAgSXQgbWF5IG1vZGlmeSBhbnkgb2YgdGhlIGZpZWxkcyBhcyBpdCB3aXNoZXMuICBJZiAqTkFNRQotICAgICBpcyBzZXQgdG8gTlVMTCwgdGhlIHN5bWJvbCB3aWxsIGJlIHNraXBwZWQgcmF0aGVyIHRoYW4gYmVpbmcKLSAgICAgYWRkZWQgdG8gdGhlIGhhc2ggdGFibGUuICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvcgotICAgICBoYW5kbGluZyBhbGwgcHJvY2Vzc29yIGRlcGVuZGVudCBzeW1ib2wgYmluZGluZ3MgYW5kIHNlY3Rpb24KLSAgICAgaW5kaWNlcywgYW5kIG11c3Qgc2V0IGF0IGxlYXN0ICpGTEFHUyBhbmQgKlNFQyBmb3IgZWFjaCBwcm9jZXNzb3IKLSAgICAgZGVwZW5kZW50IGNhc2U7IGZhaWx1cmUgdG8gZG8gc28gd2lsbCBjYXVzZSBhIGxpbmsgZXJyb3IuICAqLwotICBib29sZWFuICgqZWxmX2FkZF9zeW1ib2xfaG9vaykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLCBjb25zdCBjaGFyICoqbmFtZSwKLQkgICAgIGZsYWd3b3JkICpmbGFncywgYXNlY3Rpb24gKipzZWMsIGJmZF92bWEgKnZhbHVlKSk7Ci0KLSAgLyogSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgaXQgaXMgY2FsbGVkIGJ5IHRoZSBlbGZfbGlua19vdXRwdXRfc3ltCi0gICAgIHBoYXNlIG9mIGEgbGluayBmb3IgZWFjaCBzeW1ib2wgd2hpY2ggd2lsbCBhcHBlYXIgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKQotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqLAotCSAgICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKSk7Ci0KLSAgLyogVGhlIENSRUFURV9EWU5BTUlDX1NFQ1RJT05TIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQKLSAgICAgbGlua2VyIHRoZSBmaXJzdCB0aW1lIGl0IGVuY291bnRlcnMgYSBkeW5hbWljIG9iamVjdCBpbiB0aGUgbGluay4KLSAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGNyZWF0ZSBhbnkgc2VjdGlvbnMgcmVxdWlyZWQgZm9yIGR5bmFtaWMKLSAgICAgbGlua2luZy4gIFRoZSBBQkZEIGFyZ3VtZW50IGlzIGEgZHluYW1pYyBvYmplY3QuICBUaGUgLmludGVycCwKLSAgICAgLmR5bmFtaWMsIC5keW5zeW0sIC5keW5zdHIsIGFuZCAuaGFzaCBmdW5jdGlvbnMgaGF2ZSBhbHJlYWR5IGJlZW4KLSAgICAgY3JlYXRlZCwgYW5kIHRoaXMgZnVuY3Rpb24gbWF5IG1vZGlmeSB0aGUgc2VjdGlvbiBmbGFncyBpZgotICAgICBkZXNpcmVkLiAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vcm1hbGx5IGNyZWF0ZSB0aGUgLmdvdCBhbmQgLnBsdAotICAgICBzZWN0aW9ucywgYnV0IGRpZmZlcmVudCBiYWNrZW5kcyBoYXZlIGRpZmZlcmVudCByZXF1aXJlbWVudHMuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpCi0gICAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotCi0gIC8qIFRoZSBDSEVDS19SRUxPQ1MgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBhZGRfc3ltYm9scyBwaGFzZSBvZgotICAgICB0aGUgRUxGIGJhY2tlbmQgbGlua2VyLiAgSXQgaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggc2VjdGlvbiB3aXRoCi0gICAgIHJlbG9jcyBvZiBhbiBvYmplY3QgZmlsZSwganVzdCBhZnRlciB0aGUgc3ltYm9scyBmb3IgdGhlIG9iamVjdAotICAgICBmaWxlIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhlCi0gICAgIGZ1bmN0aW9uIG11c3QgbG9vayB0aHJvdWdoIHRoZSByZWxvY3MgYW5kIGRvIGFueSBzcGVjaWFsIGhhbmRsaW5nCi0gICAgIHJlcXVpcmVkLiAgVGhpcyBnZW5lcmFsbHkgbWVhbnMgYWxsb2NhdGluZyBzcGFjZSBpbiB0aGUgZ2xvYmFsCi0gICAgIG9mZnNldCB0YWJsZSwgYW5kIHBlcmhhcHMgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSByZWxvYy4gIFRoZQotICAgICByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgICBhY3R1YWxseSB1c2VzIFJlbCBzdHJ1Y3R1cmVzLCB0aGUgcl9hZGRlbmQgZmllbGQgd2lsbCBhbHdheXMgYmUKLSAgICAgemVyby4gICovCi0gIGJvb2xlYW4gKCpjaGVja19yZWxvY3MpCi0gICAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgYXNlY3Rpb24gKm8sCi0JICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzKSk7Ci0KLSAgLyogVGhlIEFESlVTVF9EWU5BTUlDX1NZTUJPTCBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kCi0gICAgIGxpbmtlciBmb3IgZXZlcnkgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQKLSAgICAgcmVmZXJlbmNlZCBieSBhIHJlZ3VsYXIgb2JqZWN0LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZQotICAgICBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gc2VlbiwgYnV0IGJlZm9yZSB0aGUgU0laRV9EWU5BTUlDX1NFQ1RJT05TCi0gICAgIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZC4gIFRoZSBoYXNoIHRhYmxlIGVudHJ5IHNob3VsZCBiZQotICAgICBiZmRfbGlua19oYXNoX2RlZmluZWQgb3JlIGJmZF9saW5rX2hhc2hfZGVmd2VhaywgYW5kIGl0IHNob3VsZCBiZQotICAgICBkZWZpbmVkIGluIGEgc2VjdGlvbiBmcm9tIGEgZHluYW1pYyBvYmplY3QuICBEeW5hbWljIG9iamVjdAotICAgICBzZWN0aW9ucyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBmaW5hbCBsaW5rLCBhbmQgdGhpcyBmdW5jdGlvbiBpcwotICAgICByZXNwb25zaWJsZSBmb3IgY2hhbmdpbmcgdGhlIHZhbHVlIHRvIHNvbWV0aGluZyB3aGljaCB0aGUgcmVzdCBvZgotICAgICB0aGUgbGluayBjYW4gZGVhbCB3aXRoLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGludm9sdmUgYWRkaW5nIGFuCi0gICAgIGVudHJ5IHRvIHRoZSAucGx0IG9yIC5nb3Qgb3Igc29tZSBzdWNoIHNlY3Rpb24sIGFuZCBzZXR0aW5nIHRoZQotICAgICBzeW1ib2wgdG8gcG9pbnQgdG8gdGhhdC4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wpCi0gICAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoKSk7Ci0KLSAgLyogVGhlIEFMV0FZU19TSVpFX1NFQ1RJT05TIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYmFja2VuZCBsaW5rZXIKLSAgICAgYWZ0ZXIgYWxsIHRoZSBsaW5rZXIgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIHNlZW4gYnV0IGJlZm9yZSB0aGUKLSAgICAgc2VjdGlvbiBzaXplcyBoYXZlIGJlZW4gc2V0LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIKLSAgICAgQURKVVNUX0RZTkFNSUNfU1lNQk9MLCBidXQgYmVmb3JlIFNJWkVfRFlOQU1JQ19TRUNUSU9OUy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucykKLSAgICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci0KLSAgLyogVGhlIFNJWkVfRFlOQU1JQ19TRUNUSU9OUyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kCi0gICAgIGxpbmtlciBhZnRlciBhbGwgdGhlIGxpbmtlciBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gc2VlbiBidXQgYmVmb3JlCi0gICAgIHRoZSBzZWN0aW9ucyBzaXplcyBoYXZlIGJlZW4gc2V0LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIKLSAgICAgQURKVVNUX0RZTkFNSUNfU1lNQk9MIGhhcyBiZWVuIGNhbGxlZCBvbiBhbGwgYXBwcm9wcmlhdGUgc3ltYm9scy4KLSAgICAgSXQgaXMgb25seSBjYWxsZWQgd2hlbiBsaW5raW5nIGFnYWluc3QgYSBkeW5hbWljIG9iamVjdC4gIEl0IG11c3QKLSAgICAgc2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucywgYW5kIG1heSBmaWxsIGluIHRoZWlyCi0gICAgIGNvbnRlbnRzIGFzIHdlbGwuICBUaGUgZ2VuZXJpYyBFTEYgbGlua2VyIGNhbiBoYW5kbGUgdGhlIC5keW5zeW0sCi0gICAgIC5keW5zdHIgYW5kIC5oYXNoIHNlY3Rpb25zLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZSB0aGUKLSAgICAgLmludGVycCBzZWN0aW9uIGFuZCBhbnkgc2VjdGlvbnMgY3JlYXRlZCBieSB0aGUKLSAgICAgQ1JFQVRFX0RZTkFNSUNfU0VDVElPTlMgZW50cnkgcG9pbnQuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKQotICAgIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLQotICAvKiBUaGUgUkVMT0NBVEVfU0VDVElPTiBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kIGxpbmtlcgotICAgICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgICAgVGhlIHJlbG9jcyBhcmUgYWx3YXlzIHBhc3NlZCBhcyBSZWxhIHN0cnVjdHVyZXM7IGlmIHRoZSBzZWN0aW9uCi0gICAgIGFjdHVhbGx5IHVzZXMgUmVsIHN0cnVjdHVyZXMsIHRoZSByX2FkZGVuZCBmaWVsZCB3aWxsIGFsd2F5cyBiZQotICAgICB6ZXJvLgotCi0gICAgIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdCB0aGUgc2VjdGlvbiBjb250ZW50cyBhcwotICAgICBuZWNlc3NhcnksIGFuZCAoaWYgdXNpbmcgUmVsYSByZWxvY3MgYW5kIGdlbmVyYXRpbmcgYQotICAgICByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzCi0gICAgIG5lY2Vzc2FyeS4KLQotICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgc2V0dGluZyB0aGUgcmVsb2MKLSAgICAgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgotCi0gICAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCi0KLSAgICAgTE9DQUxfU0VDVElPTlMgaXMgYW4gYXJyYXkgZ2l2aW5nIHRoZSBzZWN0aW9uIGluIHRoZSBpbnB1dCBmaWxlCi0gICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0X3NobmR4IGZpZWxkIG9mIGVhY2ggbG9jYWwgc3ltYm9sLgotCi0gICAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAotICAgICB2aWEgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkuCi0KLSAgICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUKLSAgICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKLSAgICAgZ29pbmcgdG8gYmUgdGhlIHNlY3Rpb24gc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG91dHB1dAotICAgICBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSBhZGRlbmQgbXVzdCBiZSBhZGp1c3RlZAotICAgICBhY2NvcmRpbmdseS4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKQotICAgIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgICBiZmQgKmlucHV0X2JmZCwgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sIGJmZF9ieXRlICpjb250ZW50cywKLQkgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MsIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXMsCi0JICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zKSk7Ci0KLSAgLyogVGhlIEZJTklTSF9EWU5BTUlDX1NZTUJPTCBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kCi0gICAgIGxpbmtlciBqdXN0IGJlZm9yZSBpdCB3cml0ZXMgYSBzeW1ib2wgb3V0IHRvIHRoZSAuZHluc3ltIHNlY3Rpb24uCi0gICAgIFRoZSBwcm9jZXNzb3IgYmFja2VuZCBtYXkgbWFrZSBhbnkgcmVxdWlyZWQgYWRqdXN0bWVudCB0byB0aGUKLSAgICAgc3ltYm9sLiAgSXQgbWF5IGFsc28gdGFrZSB0aGUgb3Bwb3J0dW5pdHkgdG8gc2V0IGNvbnRlbnRzIG9mIHRoZQotICAgICBkeW5hbWljIHNlY3Rpb25zLiAgTm90ZSB0aGF0IEZJTklTSF9EWU5BTUlDX1NZTUJPTCBpcyBjYWxsZWQgb24KLSAgICAgYWxsIC5keW5zeW0gc3ltYm9scywgd2hpbGUgQURKVVNUX0RZTkFNSUNfU1lNQk9MIGlzIG9ubHkgY2FsbGVkCi0gICAgIG9uIHRob3NlIHN5bWJvbHMgd2hpY2ggYXJlIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdC4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wpCi0gICAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBFbGZfSW50ZXJuYWxfU3ltICpzeW0pKTsKLQotICAvKiBUaGUgRklOSVNIX0RZTkFNSUNfU0VDVElPTlMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZAotICAgICBsaW5rZXIganVzdCBiZWZvcmUgaXQgd3JpdGVzIGFsbCB0aGUgZHluYW1pYyBzZWN0aW9ucyBvdXQgdG8gdGhlCi0gICAgIG91dHB1dCBmaWxlLiAgVGhlIEZJTklTSF9EWU5BTUlDX1NZTUJPTCB3aWxsIGhhdmUgYmVlbiBjYWxsZWQgb24KLSAgICAgYWxsIGR5bmFtaWMgc3ltYm9scy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucykKLSAgICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci0KLSAgLyogQSBmdW5jdGlvbiB0byBkbyBhbnkgYmVnaW5uaW5nIHByb2Nlc3NpbmcgbmVlZGVkIGZvciB0aGUgRUxGIGZpbGUKLSAgICAgYmVmb3JlIGJ1aWxkaW5nIHRoZSBFTEYgaGVhZGVycyBhbmQgY29tcHV0aW5nIGZpbGUgcG9zaXRpb25zLiAgKi8KLSAgdm9pZCAoKmVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFueSBmaW5hbCBwcm9jZXNzaW5nIG5lZWRlZCBmb3IgdGhlIEVMRiBmaWxlCi0gICAgIGJlZm9yZSB3cml0aW5nIGl0IG91dC4gIFRoZSBMSU5LRVIgYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGlzIEJGRAotICAgICB3YXMgY3JlYXRlZCBieSB0aGUgRUxGIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgdm9pZCAoKmVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpCi0gICAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4gbGlua2VyKSk7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUuICBJdCBzaG91bGQKLSAgICAgcmV0dXJuIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwcm9ncmFtIHNlZ21lbnRzIHdoaWNoIHRoaXMgQkZECi0gICAgIHdpbGwgbmVlZC4gIEl0IHNob3VsZCByZXR1cm4gLTEgb24gZXJyb3IuICAqLwotICBpbnQgKCplbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycykgUEFSQU1TICgoYmZkICopKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBtb2RpZnkgYW4gZXhpc3Rpbmcgc2VnbWVudCBtYXAgaW4gYQotICAgICBiYWNrZW5kIHNwZWNpZmljIGZhc2hpb24uICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwKSBQQVJBTVMgKChiZmQgKikpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBzZWN0aW9uIGdjIHRvIGRpc2NvdmVyIHRoZSBzZWN0aW9uIGEKLSAgICAgcGFydGljdWxhciByZWxvY2F0aW9uIHJlZmVycyB0by4gIEl0IG5lZWQgbm90IGJlIGRlZmluZWQgZm9yIGhvc3RzCi0gICAgIHRoYXQgaGF2ZSBubyBxdWVlciByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLSAgYXNlY3Rpb24gKiAoKmdjX21hcmtfaG9vaykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiwgaWYgZGVmaW5lZCwgaXMgY2FsbGVkIGR1cmluZyB0aGUgc3dlZXAgcGhhc2Ugb2YgZ2MKLSAgICAgaW4gb3JkZXIgdGhhdCBhIGJhY2tlbmQgbWlnaHQgdXBkYXRlIGFueSBkYXRhIHN0cnVjdHVyZXMgaXQgbWlnaHQKLSAgICAgYmUgbWFpbnRhaW5pbmcuICAqLwotICBib29sZWFuICgqZ2Nfc3dlZXBfaG9vaykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqbywKLQkgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MpKTsKLQotICAvKiBUaGUgc3dhcHBpbmcgdGFibGUgdG8gdXNlIHdoZW4gZGVhbGluZyB3aXRoIEVDT0ZGIGluZm9ybWF0aW9uLgotICAgICBVc2VkIGZvciB0aGUgTUlQUyBFTEYgLm1kZWJ1ZyBzZWN0aW9uLiAgKi8KLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0KLSAgLyogQWx0ZXJuYXRlIEVNX3h4eHggbWFjaGluZSBjb2RlcyBmb3IgdGhpcyBiYWNrZW5kLiAgKi8KLSAgaW50IGVsZl9tYWNoaW5lX2FsdDE7Ci0gIGludCBlbGZfbWFjaGluZV9hbHQyOwotCi0gIGNvbnN0IHN0cnVjdCBlbGZfc2l6ZV9pbmZvICpzOwotCi0gIC8qIG9mZnNldCBvZiB0aGUgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCBmcm9tIHRoZSBzdGFydCBvZiB0aGUKLSAgICAgLmdvdCBzZWN0aW9uICovCi0gIGJmZF92bWEgZ290X3N5bWJvbF9vZmZzZXQ7Ci0KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGhlYWRlcnMgZm9yIHRoZSBHT1QgYW5kIFBMVC4gIFRoaXMgaW5jbHVkZXMKLSAgICAgdGhlIHNvLWNhbGxlZCByZXNlcnZlZCBlbnRyaWVzIG9uIHNvbWUgc3lzdGVtcy4gICovCi0gIGJmZF92bWEgZ290X2hlYWRlcl9zaXplOwotICBiZmRfdm1hIHBsdF9oZWFkZXJfc2l6ZTsKLQotICB1bnNpZ25lZCB3YW50X2dvdF9wbHQgOiAxOwotICB1bnNpZ25lZCBwbHRfcmVhZG9ubHkgOiAxOwotICB1bnNpZ25lZCB3YW50X3BsdF9zeW0gOiAxOwotICB1bnNpZ25lZCBwbHRfbm90X2xvYWRlZCA6IDE7Ci0gIHVuc2lnbmVkIHBsdF9hbGlnbm1lbnQgOiA0OwotICB1bnNpZ25lZCBjYW5fZ2Nfc2VjdGlvbnMgOiAxOwotfTsKLQotLyogSW5mb3JtYXRpb24gc3RvcmVkIGZvciBlYWNoIEJGRCBzZWN0aW9uIGluIGFuIEVMRiBmaWxlLiAgVGhpcwotICAgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBieSBlbGZfbmV3X3NlY3Rpb25faG9vay4gICovCi0KLXN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YQotewotICAvKiBUaGUgRUxGIGhlYWRlciBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgdGhpc19oZHI7Ci0gIC8qIFRoZSBFTEYgaGVhZGVyIGZvciB0aGUgcmVsb2Mgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgICBzZWN0aW9uLCBpZiBhbnkuICAqLwotICBFbGZfSW50ZXJuYWxfU2hkciByZWxfaGRyOwotICAvKiBJZiB0aGVyZSBpcyBhIHNlY29uZCByZWxvYyBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlY3Rpb24sCi0gICAgIGFzIGNhbiBoYXBwZW4gb24gSXJpeCA2LCB0aGlzIGZpZWxkIHBvaW50cyB0byB0aGUgaGVhZGVyLiAgKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHIyOwotICAvKiBUaGUgRUxGIHNlY3Rpb24gbnVtYmVyIG9mIHRoaXMgc2VjdGlvbi4gIE9ubHkgdXNlZCBmb3IgYW4gb3V0cHV0Ci0gICAgIGZpbGUuICAqLwotICBpbnQgdGhpc19pZHg7Ci0gIC8qIFRoZSBFTEYgc2VjdGlvbiBudW1iZXIgb2YgdGhlIHJlbG9jIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgc2VjdGlvbiwgaWYgYW55LiAgT25seSB1c2VkIGZvciBhbiBvdXRwdXQgZmlsZS4gICovCi0gIGludCByZWxfaWR4OwotICAvKiBVc2VkIGJ5IHRoZSBiYWNrZW5kIGxpbmtlciB0byBzdG9yZSB0aGUgc3ltYm9sIGhhc2ggdGFibGUgZW50cmllcwotICAgICBhc3NvY2lhdGVkIHdpdGggcmVsb2NzIGFnYWluc3QgZ2xvYmFsIHN5bWJvbHMuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoZXM7Ci0gIC8qIEEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCByZWxvY3MuICBJZiB0aGUgc2VjdGlvbiB1c2VzIFJFTCByZWxvY3MsCi0gICAgIHJhdGhlciB0aGFuIFJFTEEsIGFsbCB0aGUgcl9hZGRlbmQgZmllbGRzIHdpbGwgYmUgemVyby4gIFRoaXMKLSAgICAgcG9pbnRlciBtYXkgYmUgTlVMTC4gIEl0IGlzIHVzZWQgYnkgdGhlIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgLyogVXNlZCBieSB0aGUgYmFja2VuZCBsaW5rZXIgd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnkgdG8KLSAgICAgcmVjb3JkIHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBmb3IgYSBzZWN0aW9uIHN5bWJvbAotICAgICBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc2VjdGlvbi4gICovCi0gIGxvbmcgZHluaW5keDsKLSAgLyogQSBwb2ludGVyIHVzZWQgZm9yIC5zdGFiIGxpbmtpbmcgb3B0aW1pemF0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci0gIC8qIEEgcG9pbnRlciBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgRUxGIGJhY2tlbmQuICAqLwotICBQVFIgdGRhdGE7Ci19OwotCi0jZGVmaW5lIGVsZl9zZWN0aW9uX2RhdGEoc2VjKSAgKChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEqKXNlYy0+dXNlZF9ieV9iZmQpCi0KLSNkZWZpbmUgZ2V0X2VsZl9iYWNrZW5kX2RhdGEoYWJmZCkgXAotICAoKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICopIChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKQotCi0vKiBFbnVtZXJhdGlvbiB0byBzcGVjaWZ5IHRoZSBzcGVjaWFsIHNlY3Rpb24uICAqLwotdHlwZWRlZiBlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtCi17Ci0gIExJTktFUl9TRUNUSU9OX1VOS05PV04sCQkvKiBub3QgdXNlZCAqLwotICBMSU5LRVJfU0VDVElPTl9HT1QsCQkJLyogLmdvdCBzZWN0aW9uIGZvciBnbG9iYWwgb2Zmc2V0IHBvaW50ZXJzICovCi0gIExJTktFUl9TRUNUSU9OX1BMVCwJCQkvKiAucGx0IHNlY3Rpb24gZm9yIGdlbmVyYXRlZCBwcm9jZWR1cmUgc3R1YnMgKi8KLSAgTElOS0VSX1NFQ1RJT05fU0RBVEEsCQkJLyogLnNkYXRhLy5zYnNzIHNlY3Rpb24gZm9yIFBvd2VyUEMgKi8KLSAgTElOS0VSX1NFQ1RJT05fU0RBVEEyLAkJLyogLnNkYXRhMi8uc2JzczIgc2VjdGlvbiBmb3IgUG93ZXJQQyAqLwotICBMSU5LRVJfU0VDVElPTl9NQVgJCQkvKiAjIG9mIGxpbmtlciBzZWN0aW9ucyAqLwotfSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bV90OwotCi0vKiBTZWN0aW9ucyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIuICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb24KLXsKLSAgY2hhciAqbmFtZTsJCQkJLyogbmFtZSBvZiB0aGUgc2VjdGlvbiAqLwotICBjaGFyICpyZWxfbmFtZTsJCQkvKiBuYW1lIG9mIHRoZSBhc3NvY2lhdGVkIC5yZWx7LGF9LiBzZWN0aW9uICovCi0gIGNoYXIgKmJzc19uYW1lOwkJCS8qIG5hbWUgb2YgYSByZWxhdGVkIC5ic3Mgc2VjdGlvbiAqLwotICBjaGFyICpzeW1fbmFtZTsJCQkvKiBuYW1lIG9mIHN5bWJvbCB0byByZWZlcmVuY2UgdGhpcyBzZWN0aW9uICovCi0gIGFzZWN0aW9uICpzZWN0aW9uOwkJCS8qIHBvaW50ZXIgdG8gdGhlIHNlY3Rpb24gKi8KLSAgYXNlY3Rpb24gKmJzc19zZWN0aW9uOwkJLyogcG9pbnRlciB0byB0aGUgYnNzIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgKi8KLSAgYXNlY3Rpb24gKnJlbF9zZWN0aW9uOwkJLyogcG9pbnRlciB0byB0aGUgcmVsb2NhdGlvbnMgbmVlZGVkIGZvciB0aGlzIHNlY3Rpb24gKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKnN5bV9oYXNoOwkvKiBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIHN5bWJvbCBoYXNoIHZhbHVlICovCi0gIGJmZF92bWEgaW5pdGlhbF9zaXplOwkJCS8qIGluaXRpYWwgc2l6ZSBiZWZvcmUgYW55IGxpbmtlciBnZW5lcmF0ZWQgYWxsb2NhdGlvbnMgKi8KLSAgYmZkX3ZtYSBzeW1fb2Zmc2V0OwkJCS8qIG9mZnNldCBvZiBzeW1ib2wgZnJvbSBiZWdpbm5pbmcgb2Ygc2VjdGlvbiAqLwotICBiZmRfdm1hIGhvbGVfc2l6ZTsJCQkvKiBzaXplIG9mIHJlc2VydmVkIGFkZHJlc3MgaG9sZSBpbiBhbGxvY2F0aW9uICovCi0gIGJmZF92bWEgaG9sZV9vZmZzZXQ7CQkJLyogY3VycmVudCBvZmZzZXQgZm9yIHRoZSBob2xlICovCi0gIGJmZF92bWEgbWF4X2hvbGVfb2Zmc2V0OwkJLyogbWF4aW11bSBvZmZzZXQgZm9yIHRoZSBob2xlICovCi0gIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Qgd2hpY2g7CS8qIHdoaWNoIHNlY3Rpb24gdGhpcyBpcyAqLwotICBib29sZWFuIGhvbGVfd3JpdHRlbl9wOwkJLyogd2hldGhlciB0aGUgaG9sZSBoYXMgYmVlbiBpbml0aWFsaXplZCAqLwotICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50OwkJLyogYWxpZ25tZW50IGZvciB0aGUgc2VjdGlvbiAqLwotICBmbGFnd29yZCBmbGFnczsJCQkvKiBmbGFncyB0byB1c2UgdG8gY3JlYXRlIHRoZSBzZWN0aW9uICovCi19IGVsZl9saW5rZXJfc2VjdGlvbl90OwotCi0vKiBMaW5rZWQgbGlzdCBvZiBhbGxvY2F0ZWQgcG9pbnRlciBlbnRyaWVzLiAgVGhpcyBoYW5ncyBvZmYgb2YgdGhlIHN5bWJvbCBsaXN0cywgYW5kCi0gICBwcm92aWRlcyBhbGxvd3MgdXMgdG8gcmV0dXJuIGRpZmZlcmVudCBwb2ludGVycywgYmFzZWQgb24gZGlmZmVyZW50IGFkZGVuZCdzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzCi17Ci0gIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMgKm5leHQ7CS8qIG5leHQgYWxsb2NhdGVkIHBvaW50ZXIgZm9yIHRoaXMgc3ltYm9sICovCi0gIGJmZF92bWEgb2Zmc2V0OwkJCQkvKiBvZmZzZXQgb2YgcG9pbnRlciBmcm9tIGJlZ2lubmluZyBvZiBzZWN0aW9uICovCi0gIGJmZF9zaWduZWRfdm1hIGFkZGVuZDsJCQkvKiBhZGRlbmQgdXNlZCAqLwotICBlbGZfbGlua2VyX3NlY3Rpb25fZW51bV90IHdoaWNoOwkJLyogd2hpY2ggbGlua2VyIHNlY3Rpb24gdGhpcyBpcyAqLwotICBib29sZWFuIHdyaXR0ZW5fYWRkcmVzc19wOwkJCS8qIHdoZXRoZXIgYWRkcmVzcyB3YXMgd3JpdHRlbiB5ZXQgKi8KLX0gZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3Q7Ci0KLS8qIFNvbWUgcHJpdmF0ZSBkYXRhIGlzIHN0YXNoZWQgYXdheSBmb3IgZnV0dXJlIHVzZSB1c2luZyB0aGUgdGRhdGEgcG9pbnRlcgotICAgaW4gdGhlIGJmZCBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgZWxmX29ial90ZGF0YQotewotICBFbGZfSW50ZXJuYWxfRWhkciBlbGZfaGVhZGVyWzFdOwkvKiBBY3R1YWwgZGF0YSwgYnV0IHJlZiBsaWtlIHB0ciAqLwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmVsZl9zZWN0X3B0cjsKLSAgRWxmX0ludGVybmFsX1BoZHIgKnBoZHI7Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKnNlZ21lbnRfbWFwOwotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzdHJ0YWJfcHRyOwotICBpbnQgbnVtX2xvY2FsczsKLSAgaW50IG51bV9nbG9iYWxzOwotICBhc3ltYm9sICoqc2VjdGlvbl9zeW1zOwkJLyogU1RUX1NFQ1RJT04gc3ltYm9scyBmb3IgZWFjaCBzZWN0aW9uICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyIHN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyIHNoc3RydGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgc3RydGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHluc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHluc3RydGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHludmVyc3ltX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHludmVycmVmX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHludmVyZGVmX2hkcjsKLSAgdW5zaWduZWQgaW50IHN5bXRhYl9zZWN0aW9uLCBzaHN0cnRhYl9zZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgc3RydGFiX3NlY3Rpb24sIGR5bnN5bXRhYl9zZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgZHludmVyc3ltX3NlY3Rpb24sIGR5bnZlcmRlZl9zZWN0aW9uLCBkeW52ZXJyZWZfc2VjdGlvbjsKLSAgZmlsZV9wdHIgbmV4dF9maWxlX3BvczsKLSNpZiAwCi0gIC8qIHdlIGRvbid0IG5lZWQgdGhlc2UgaW5zaWRlIGJmZCBhbnltb3JlLCBhbmQgSSB0aGluawotICAgICB0aGVzZSB3ZXJlbid0IHVzZWQgb3V0c2lkZSBiZmQuICovCi0gIHZvaWQgKnByc3RhdHVzOwkJCS8qIFRoZSByYXcgL3Byb2MgcHJzdGF0dXMgc3RydWN0dXJlICovCi0gIHZvaWQgKnBycHNpbmZvOwkJCS8qIFRoZSByYXcgL3Byb2MgcHJwc2luZm8gc3RydWN0dXJlICovCi0jZW5kaWYKLSAgYmZkX3ZtYSBncDsJCQkJLyogVGhlIGdwIHZhbHVlIChNSVBTIG9ubHksIGZvciBub3cpICovCi0gIHVuc2lnbmVkIGludCBncF9zaXplOwkJCS8qIFRoZSBncCBzaXplIChNSVBTIG9ubHksIGZvciBub3cpICovCi0KLSAgLyogSW5mb3JtYXRpb24gZ3JhYmJlZCBmcm9tIGFuIGVsZiBjb3JlIGZpbGUuICovCi0gIGludCBjb3JlX3NpZ25hbDsKLSAgaW50IGNvcmVfcGlkOwotICBpbnQgY29yZV9sd3BpZDsKLSAgY2hhciogY29yZV9wcm9ncmFtOwotICBjaGFyKiBjb3JlX2NvbW1hbmQ7Ci0KLSAgLyogVGhpcyBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkIGJ5IHRoZSBiYWNrZW5kCi0gICAgIGxpbmtlci4gICovCi0gIGJvb2xlYW4gbGlua2VyOwotCi0gIC8qIEEgbWFwcGluZyBmcm9tIGV4dGVybmFsIHN5bWJvbHMgdG8gZW50cmllcyBpbiB0aGUgbGlua2VyIGhhc2gKLSAgICAgdGFibGUsIHVzZWQgd2hlbiBsaW5raW5nLiAgVGhpcyBpcyBpbmRleGVkIGJ5IHRoZSBzeW1ib2wgaW5kZXgKLSAgICAgbWludXMgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIHN5bWJvbCB0YWJsZSBoZWFkZXIuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0KLSAgLyogQSBtYXBwaW5nIGZyb20gbG9jYWwgc3ltYm9scyB0byBvZmZzZXRzIGludG8gdGhlIGdsb2JhbCBvZmZzZXQKLSAgICAgdGFibGUsIHVzZWQgd2hlbiBsaW5raW5nLiAgVGhpcyBpcyBpbmRleGVkIGJ5IHRoZSBzeW1ib2wgaW5kZXguCi0gICAgIExpa2UgZm9yIHRoZSBnbG9iYWxzLCB3ZSB1c2UgYSB1bmlvbiBhbmQgdHdvIG5hbWVzIHByaW1hcmlseSB0bwotICAgICBkb2N1bWVudCB0aGUgaW50ZW50IG9mIGFueSBwYXJ0aWN1bGFyIHBpZWNlIG9mIGNvZGUuICBUaGUgZmllbGQKLSAgICAgc2hvdWxkIGJlIHVzZWQgYXMgYSBjb3VudCB1bnRpbCBzaXplX2R5bmFtaWNfc2VjdGlvbnMsIGF0IHdoaWNoCi0gICAgIHBvaW50IHRoZSBjb250ZW50cyBvZiB0aGUgLmdvdCBpcyBmaXhlZC4gIEFmdGVyd2FyZCwgaWYgYW4gZW50cnkKLSAgICAgaXMgLTEsIHRoZW4gdGhlIHN5bWJvbCBkb2VzIG5vdCByZXF1aXJlIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSAqcmVmY291bnRzOwotICAgICAgYmZkX3ZtYSAqb2Zmc2V0czsKLSAgICB9IGxvY2FsX2dvdDsKLQotICAvKiBBIG1hcHBpbmcgZnJvbSBsb2NhbCBzeW1ib2xzIHRvIG9mZnNldHMgaW50byB0aGUgdmFyaW91cyBsaW5rZXIKLSAgICAgc2VjdGlvbnMgYWRkZWQuICBUaGlzIGlzIGluZGV4IGJ5IHRoZSBzeW1ib2wgaW5kZXguICAqLwotICBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKmxpbmtlcl9zZWN0aW9uX3BvaW50ZXJzOwotCi0gIC8qIFRoZSBsaW5rZXIgRUxGIGVtdWxhdGlvbiBjb2RlIG5lZWRzIHRvIGxldCB0aGUgYmFja2VuZCBFTEYgbGlua2VyCi0gICAgIGtub3cgd2hhdCBmaWxlbmFtZSBzaG91bGQgYmUgdXNlZCBmb3IgYSBkeW5hbWljIG9iamVjdCBpZiB0aGUKLSAgICAgZHluYW1pYyBvYmplY3QgaXMgZm91bmQgdXNpbmcgYSBzZWFyY2guICBUaGUgZW11bGF0aW9uIGNvZGUgdGhlbgotICAgICBzb21ldGltZXMgbmVlZHMgdG8ga25vdyB3aGF0IG5hbWUgd2FzIGFjdHVhbGx5IHVzZWQuICBVbnRpbCB0aGUKLSAgICAgZmlsZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgbGlua2VyIHN5bWJvbCB0YWJsZSwgdGhpcyBmaWVsZCBob2xkcwotICAgICB0aGUgbmFtZSB0aGUgbGlua2VyIHdhbnRzLiAgQWZ0ZXIgaXQgaGFzIGJlZW4gYWRkZWQsIGl0IGhvbGRzIHRoZQotICAgICBuYW1lIGFjdHVhbGx5IHVzZWQsIHdoaWNoIHdpbGwgYmUgdGhlIERUX1NPTkFNRSBlbnRyeSBpZiB0aGVyZSBpcwotICAgICBvbmUuICAqLwotICBjb25zdCBjaGFyICpkdF9uYW1lOwotCi0gIC8qIElyaXggNSBvZnRlbiBzY3Jld3MgdXAgdGhlIHN5bWJvbCB0YWJsZSwgc29ydGluZyBsb2NhbCBzeW1ib2xzCi0gICAgIGFmdGVyIGdsb2JhbCBzeW1ib2xzLiAgVGhpcyBmbGFnIGlzIHNldCBpZiB0aGUgc3ltYm9sIHRhYmxlIGluCi0gICAgIHRoaXMgQkZEIGFwcGVhcnMgdG8gYmUgc2NyZXdlZCB1cC4gIElmIGl0IGlzLCB3ZSBpZ25vcmUgdGhlCi0gICAgIHNoX2luZm8gZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZSBoZWFkZXIsIGFuZCBhbHdheXMgcmVhZCBhbGwgdGhlCi0gICAgIHN5bWJvbHMuICAqLwotICBib29sZWFuIGJhZF9zeW10YWI7Ci0KLSAgLyogUmVjb3JkcyB0aGUgcmVzdWx0IG9mIGBnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZScuICAqLwotICBiZmRfc2l6ZV90eXBlIHByb2dyYW1faGVhZGVyX3NpemU7Ci0KLSAgLyogVXNlZCBieSBmaW5kX25lYXJlc3RfbGluZSBlbnRyeSBwb2ludC4gICovCi0gIFBUUiBsaW5lX2luZm87Ci0KLSAgLyogVXNlZCBieSBNSVBTIEVMRiBmaW5kX25lYXJlc3RfbGluZSBlbnRyeSBwb2ludC4gIFRoZSBzdHJ1Y3R1cmUKLSAgICAgY291bGQgYmUgaW5jbHVkZWQgZGlyZWN0bHkgaW4gdGhpcyBvbmUsIGJ1dCB0aGVyZSdzIG5vIHBvaW50IHRvCi0gICAgIHdhc3RpbmcgdGhlIG1lbW9yeSBqdXN0IGZvciB0aGUgaW5mcmVxdWVudGx5IGNhbGxlZAotICAgICBmaW5kX25lYXJlc3RfbGluZS4gICovCi0gIHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUgKmZpbmRfbGluZV9pbmZvOwotCi0gIC8qIEEgcGxhY2UgdG8gc3Rhc2ggZHdhcmYxIGluZm8gZm9yIHRoaXMgYmZkLiAqLwotICBzdHJ1Y3QgZHdhcmYxX2RlYnVnICpkd2FyZjFfZmluZF9saW5lX2luZm87Ci0KLSAgLyogQSBwbGFjZSB0byBzdGFzaCBkd2FyZjIgaW5mbyBmb3IgdGhpcyBiZmQuICovCi0gIHN0cnVjdCBkd2FyZjJfZGVidWcgKmR3YXJmMl9maW5kX2xpbmVfaW5mbzsKLQotICAvKiBBbiBhcnJheSBvZiBzdHViIHNlY3Rpb25zIGluZGV4ZWQgYnkgc3ltYm9sIG51bWJlciwgdXNlZCBieSB0aGUKLSAgICAgTUlQUyBFTEYgbGlua2VyLiAgRklYTUU6IFdlIHNob3VsZCBmaWd1cmUgb3V0IHNvbWUgd2F5IHRvIG9ubHkKLSAgICAgaW5jbHVkZSB0aGlzIGZpZWxkIGZvciBhIE1JUFMgRUxGIHRhcmdldC4gICovCi0gIGFzZWN0aW9uICoqbG9jYWxfc3R1YnM7Ci0KLSAgLyogVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGVfZmxhZ3MgZmllbGQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KLSAgYm9vbGVhbiBmbGFnc19pbml0OwotCi0gIC8qIE51bWJlciBvZiBzeW1ib2wgdmVyc2lvbiBkZWZpbml0aW9ucyB3ZSBhcmUgYWJvdXQgdG8gZW1pdC4gICovCi0gIHVuc2lnbmVkIGludCBjdmVyZGVmczsKLQotICAvKiBOdW1iZXIgb2Ygc3ltYm9sIHZlcnNpb24gcmVmZXJlbmNlcyB3ZSBhcmUgYWJvdXQgdG8gZW1pdC4gICovCi0gIHVuc2lnbmVkIGludCBjdmVycmVmczsKLQotICAvKiBTeW1ib2wgdmVyc2lvbiBkZWZpbml0aW9ucyBpbiBleHRlcm5hbCBvYmplY3RzLiAgKi8KLSAgRWxmX0ludGVybmFsX1ZlcmRlZiAqdmVyZGVmOwotCi0gIC8qIFN5bWJvbCB2ZXJzaW9uIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgb2JqZWN0cy4gICovCi0gIEVsZl9JbnRlcm5hbF9WZXJuZWVkICp2ZXJyZWY7Ci0KLSAgLyogTGlua2VyIHNlY3Rpb25zIHRoYXQgd2UgYXJlIGludGVyZXN0ZWQgaW4uICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtlcl9zZWN0aW9uICpsaW5rZXJfc2VjdGlvblsgKGludClMSU5LRVJfU0VDVElPTl9NQVggXTsKLX07Ci0KLSNkZWZpbmUgZWxmX3RkYXRhKGJmZCkJCSgoYmZkKSAtPiB0ZGF0YS5lbGZfb2JqX2RhdGEpCi0jZGVmaW5lIGVsZl9lbGZoZWFkZXIoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZWxmX2hlYWRlcikKLSNkZWZpbmUgZWxmX2VsZnNlY3Rpb25zKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGVsZl9zZWN0X3B0cikKLSNkZWZpbmUgZWxmX3Noc3RydGFiKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IHN0cnRhYl9wdHIpCi0jZGVmaW5lIGVsZl9vbmVzeW10YWIoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gc3ltdGFiX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9keW5zeW10YWIoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZHluc3ltdGFiX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9keW52ZXJzeW0oYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZHludmVyc3ltX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9keW52ZXJkZWYoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZHludmVyZGVmX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9keW52ZXJyZWYoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZHludmVycmVmX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9udW1fbG9jYWxzKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IG51bV9sb2NhbHMpCi0jZGVmaW5lIGVsZl9udW1fZ2xvYmFscyhiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBudW1fZ2xvYmFscykKLSNkZWZpbmUgZWxmX3NlY3Rpb25fc3ltcyhiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBzZWN0aW9uX3N5bXMpCi0jZGVmaW5lIGNvcmVfcHJwc2luZm8oYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gcHJwc2luZm8pCi0jZGVmaW5lIGNvcmVfcHJzdGF0dXMoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gcHJzdGF0dXMpCi0jZGVmaW5lIGVsZl9ncChiZmQpCQkoZWxmX3RkYXRhKGJmZCkgLT4gZ3ApCi0jZGVmaW5lIGVsZl9ncF9zaXplKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGdwX3NpemUpCi0jZGVmaW5lIGVsZl9zeW1faGFzaGVzKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IHN5bV9oYXNoZXMpCi0jZGVmaW5lIGVsZl9sb2NhbF9nb3RfcmVmY291bnRzKGJmZCkgKGVsZl90ZGF0YShiZmQpIC0+IGxvY2FsX2dvdC5yZWZjb3VudHMpCi0jZGVmaW5lIGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyhiZmQpIChlbGZfdGRhdGEoYmZkKSAtPiBsb2NhbF9nb3Qub2Zmc2V0cykKLSNkZWZpbmUgZWxmX2xvY2FsX3B0cl9vZmZzZXRzKGJmZCkgKGVsZl90ZGF0YShiZmQpIC0+IGxpbmtlcl9zZWN0aW9uX3BvaW50ZXJzKQotI2RlZmluZSBlbGZfZHRfbmFtZShiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBkdF9uYW1lKQotI2RlZmluZSBlbGZfYmFkX3N5bXRhYihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBiYWRfc3ltdGFiKQotI2RlZmluZSBlbGZfZmxhZ3NfaW5pdChiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBmbGFnc19pbml0KQotI2RlZmluZSBlbGZfbGlua2VyX3NlY3Rpb24oYmZkLG4pIChlbGZfdGRhdGEoYmZkKSAtPiBsaW5rZXJfc2VjdGlvblsoaW50KW5dKQotDAotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJkZWZfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJkZWYgKiwgRWxmX0ludGVybmFsX1ZlcmRlZiAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJkZWYgKiwgRWxmX0V4dGVybmFsX1ZlcmRlZiAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJkYXV4ICosIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJkYXV4ICosIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVybmVlZF9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKiwgRWxmX0ludGVybmFsX1Zlcm5lZWQgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1Zlcm5lZWQgKiwgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJuYXV4X2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfVmVybmF1eCAqLCBFbGZfSW50ZXJuYWxfVmVybmF1eCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfVmVybmF1eCAqLCBFbGZfRXh0ZXJuYWxfVmVybmF1eCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX1ZlcnN5bSAqLCBFbGZfSW50ZXJuYWxfVmVyc3ltICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyc3ltX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1ZlcnN5bSAqLCBFbGZfRXh0ZXJuYWxfVmVyc3ltICopKTsKLQotZXh0ZXJuIGludCBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLWV4dGVybiBjaGFyICpiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCwgdW5zaWduZWQpKTsKLWV4dGVybiBjaGFyICpiZmRfZWxmX2dldF9zdHJfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQpKTsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmX3ByaW50X3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosCi0JCQkJCSAgYmZkX3ByaW50X3N5bWJvbF90eXBlKSk7Ci0jZGVmaW5lIGVsZl9zdHJpbmdfZnJvbV9lbGZfc3RydGFiKGFiZmQsc3RyaW5kZXgpIFwKLSAgICAgYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbihhYmZkLGVsZl9lbGZoZWFkZXIoYWJmZCktPmVfc2hzdHJuZHgsc3RyaW5kZXgpCi0KLSNkZWZpbmUgYmZkX2VsZjMyX3ByaW50X3N5bWJvbAliZmRfZWxmX3ByaW50X3N5bWJvbAotI2RlZmluZSBiZmRfZWxmNjRfcHJpbnRfc3ltYm9sCWJmZF9lbGZfcHJpbnRfc3ltYm9sCi0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGJmZF9lbGZfaGFzaCBQQVJBTVMgKChDT05TVCB1bnNpZ25lZCBjaGFyICopKTsKLQotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgUEFSQU1TICgoYmZkICosCi0JCQkJCQkJICAgIGFyZWxlbnQgKiwKLQkJCQkJCQkgICAgYXN5bWJvbCAqLAotCQkJCQkJCSAgICBQVFIsCi0JCQkJCQkJICAgIGFzZWN0aW9uICosCi0JCQkJCQkJICAgIGJmZCAqLAotCQkJCQkJCSAgICBjaGFyICoqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmX21rY29yZWZpbGUgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBFbGZfSW50ZXJuYWxfU2hkciAqYmZkX2VsZl9maW5kX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcgotICBQQVJBTVMgKChiZmQgKmFiZmQsIEVsZl9JbnRlcm5hbF9TaGRyICpoZHIsIGNvbnN0IGNoYXIgKm5hbWUpKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBiZmQgKiwgYXN5bWJvbCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmQgKiwgYXNlY3Rpb24gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl93cml0ZV9jb3JlZmlsZV9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwKLQkJCQkJCSAgICAgICBmaWxlX3B0ciwKLQkJCQkJCSAgICAgICBiZmRfc2l6ZV90eXBlKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGxvbmcgX2JmZF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9jYW5vbmljYWxpemVfcmVsb2MgUEFSQU1TICgoYmZkICosIHNlY19wdHIsCi0JCQkJCQkgIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwKLQkJCQkJCQkgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGFzeW1ib2wgKl9iZmRfZWxmX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJICAgICAgIHN5bWJvbF9pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGFsZW50ICpfYmZkX2VsZl9nZXRfbGluZW5vIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX3NldF9hcmNoX21hY2ggUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKLQkJCQkJCXVuc2lnbmVkIGxvbmcpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJICAgIGFzeW1ib2wgKiosCi0JCQkJCQkgICAgYmZkX3ZtYSwgQ09OU1QgY2hhciAqKiwKLQkJCQkJCSAgICBDT05TVCBjaGFyICoqLAotCQkJCQkJICAgIHVuc2lnbmVkIGludCAqKSk7Ci0jZGVmaW5lIF9iZmRfZWxmX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgX2JmZF9lbGZfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi1leHRlcm4gaW50IF9iZmRfZWxmX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9uZXdfc2VjdGlvbl9ob29rIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0KLS8qIElmIHRoZSB0YXJnZXQgZG9lc24ndCBoYXZlIHJlbG9jIGhhbmRsaW5nIHdyaXR0ZW4geWV0OiAgKi8KLWV4dGVybiB2b2lkIF9iZmRfZWxmX25vX2luZm9fdG9faG93dG8gUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwKLQkJCQkJICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX3NlY3Rpb25fZnJvbV9zaGRyIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQgc2hpbmRleCkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3NlY3Rpb25fZnJvbV9waGRyIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfUGhkciAqLCBpbnQpKTsKLQotZXh0ZXJuIGludCBfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci0KLWFzZWN0aW9uICpiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50KSk7Ci1ib29sZWFuIF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1ib29sZWFuCi1fYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLWJvb2xlYW4KLV9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci12b2lkIF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzIFBBUkFNUyAoKGJmZCAqKSk7Ci1maWxlX3B0ciBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiBQQVJBTVMgKChFbGZfSW50ZXJuYWxfU2hkciAqLAotCQkJCQkJCSAgICBmaWxlX3B0ciwKLQkJCQkJCQkgICAgYm9vbGVhbikpOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKSk7Ci0KLWJvb2xlYW4gX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWJvb2xlYW4gX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZWxmX2xpbmtlcl9zZWN0aW9uX3QgKl9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKmFiZmQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgZW51bSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bSwKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqZGVmYXVsdHMpKTsKLQotZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKl9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbgotICBQQVJBTVMgKChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqbGlua2VyX3BvaW50ZXJzLAotCSAgIGJmZF9zaWduZWRfdm1hIGFkZGVuZCwKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fZW51bV90IHdoaWNoKSk7Ci0KLWJvb2xlYW4gYmZkX2VsZjMyX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3QsCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JICAgY29uc3QgRWxmMzJfSW50ZXJuYWxfUmVsYSAqcmVsKSk7Ci0KLWJmZF92bWEgYmZkX2VsZjMyX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2FiZmQsCi0JICAgYmZkICppbnB1dF9iZmQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0LAotCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLAotCSAgIGJmZF92bWEgcmVsb2NhdGlvbiwKLQkgICBjb25zdCBFbGYzMl9JbnRlcm5hbF9SZWxhICpyZWwsCi0JICAgaW50IHJlbGF0aXZlX3JlbG9jKSk7Ci0KLWJvb2xlYW4gYmZkX2VsZjY0X2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3QsCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JICAgY29uc3QgRWxmNjRfSW50ZXJuYWxfUmVsYSAqcmVsKSk7Ci0KLWJmZF92bWEgYmZkX2VsZjY0X2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2FiZmQsCi0JICAgYmZkICppbnB1dF9iZmQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0LAotCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLAotCSAgIGJmZF92bWEgcmVsb2NhdGlvbiwKLQkgICBjb25zdCBFbGY2NF9JbnRlcm5hbF9SZWxhICpyZWwsCi0JICAgaW50IHJlbGF0aXZlX3JlbG9jKSk7Ci0KLWJvb2xlYW4gX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhCi0gIFBBUkFNUyAoKGJmZCAqZHlub2JqLAotCSAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdCwKLQkgICBpbnQgYWxpZ25tZW50KSk7Ci0KLWJvb2xlYW4gX2JmZF9lbGZjb3JlX3NlY3Rpb25fZnJvbV9waGRyCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfUGhkciAqLCBpbnQpKTsKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9lbGYzMl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9lbGYzMl9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNoYXIgKmJmZF9lbGYzMl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gaW50IGJmZF9lbGYzMl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICosCi0JCQkJCQkJCSBiZmQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX1N5bSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwgUFRSKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9yZWxvY19pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfRXh0ZXJuYWxfUmVsICosIEVsZl9JbnRlcm5hbF9SZWwgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsICosIEVsZjMyX0V4dGVybmFsX1JlbCAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9yZWxvY2FfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9waGRyX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9QaGRyICosIEVsZl9JbnRlcm5hbF9QaGRyICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3BoZHJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqLCBFbGYzMl9FeHRlcm5hbF9QaGRyICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX2R5bl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgUFRSLCBFbGZfSW50ZXJuYWxfRHluICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9EeW4gKiwgRWxmMzJfRXh0ZXJuYWxfRHluICopKTsKLWV4dGVybiBsb25nIGJmZF9lbGYzMl9zbHVycF9zeW1ib2xfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl93cml0ZV9zaGRyc19hbmRfZWhkciBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGludCBiZmRfZWxmMzJfd3JpdGVfb3V0X3BoZHJzCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqLCBpbnQpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIEVsZl9JbnRlcm5hbF9SZWxhICpfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYm9vbGVhbikpOwotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2VsZjY0X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2VsZjY0X2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gY2hhciAqYmZkX2VsZjY0X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBpbnQgYmZkX2VsZjY0X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCQkJIGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X0V4dGVybmFsX1N5bSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwgUFRSKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9yZWxvY19pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfRXh0ZXJuYWxfUmVsICosIEVsZl9JbnRlcm5hbF9SZWwgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcmVsb2Nfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsICosIEVsZjY0X0V4dGVybmFsX1JlbCAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9yZWxvY2FfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X0V4dGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9waGRyX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9FeHRlcm5hbF9QaGRyICosIEVsZl9JbnRlcm5hbF9QaGRyICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3BoZHJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqLCBFbGY2NF9FeHRlcm5hbF9QaGRyICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX2R5bl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgUFRSLCBFbGZfSW50ZXJuYWxfRHluICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9EeW4gKiwgRWxmNjRfRXh0ZXJuYWxfRHluICopKTsKLWV4dGVybiBsb25nIGJmZF9lbGY2NF9zbHVycF9zeW1ib2xfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF93cml0ZV9zaGRyc19hbmRfZWhkciBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGludCBiZmRfZWxmNjRfd3JpdGVfb3V0X3BoZHJzCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqLCBpbnQpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIEVsZl9JbnRlcm5hbF9SZWxhICpfYmZkX2VsZjY0X2xpbmtfcmVhZF9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYm9vbGVhbikpOwotCi0jZGVmaW5lIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBiZmRfZWxmNjRfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfY2xvc2VfYW5kX2NsZWFudXAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIFBUUiwKLSAgICAgICAgICAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotYm9vbGVhbiBfYmZkX2VsZjMyX2djX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLWJvb2xlYW4gX2JmZF9lbGYzMl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotYm9vbGVhbiBfYmZkX2VsZjMyX2djX2NvbW1vbl9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1ib29sZWFuIF9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgYmZkX3ZtYSkpOwotYm9vbGVhbiBfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBiZmRfdm1hKSk7Ci0KLWJvb2xlYW4gX2JmZF9lbGY2NF9nY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci1ib29sZWFuIF9iZmRfZWxmNjRfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLWJvb2xlYW4gX2JmZF9lbGY2NF9nY19jb21tb25fZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotYm9vbGVhbiBfYmZkX2VsZjY0X2djX3JlY29yZF92dGluaGVyaXQKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIGJmZF92bWEpKTsKLWJvb2xlYW4gX2JmZF9lbGY2NF9nY19yZWNvcmRfdnRlbnRyeQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgYmZkX3ZtYSkpOwotCi0vKiBNSVBTIEVMRiBzcGVjaWZpYyByb3V0aW5lcy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKiwgaW50ICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX21pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9taXBzX2VsZl9oaTE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9taXBzX2VsZl9nb3QxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0jZW5kaWYgLyogX0xJQkVMRl9IXyAqLwpkaWZmIC0tZ2l0IGEvYmZkL2VsZi1tMTAyMDAuYyBiL2JmZC9lbGYtbTEwMjAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZDE5M2QuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZi1tMTAyMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MjUgKzAsMCBAQAotLyogTWF0c3VzaGl0YSAxMDIwMCBzcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgbW4xMDIwMF9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gbW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIG1uMTAyMDBfZWxmX3N5bWJvbF9hZGRyZXNzX3AKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIEVsZjMyX0V4dGVybmFsX1N5bSAqLCBiZmRfdm1hKSk7Ci0KLS8qIFdlIGhhdmUgdG8gdXNlIFJFTEEgaW5zdHJ1Y3Rpb25zIHNpbmNlIG1kX2FwcGx5X2ZpeDMgaW4gdGhlIGFzc2VtYmxlcgotICAgZG9lcyBhYnNvbHV0ZWx5IG5vdGhpbmcuICAqLwotI2RlZmluZSBVU0VfUkVMQQotCi1lbnVtIHJlbG9jX3R5cGUKLXsKLSAgUl9NTjEwMjAwX05PTkUgPSAwLAotICBSX01OMTAyMDBfMzIsCi0gIFJfTU4xMDIwMF8xNiwKLSAgUl9NTjEwMjAwXzgsCi0gIFJfTU4xMDIwMF8yNCwKLSAgUl9NTjEwMjAwX1BDUkVMOCwKLSAgUl9NTjEwMjAwX1BDUkVMMTYsCi0gIFJfTU4xMDIwMF9QQ1JFTDI0LAotICBSX01OMTAyMDBfTUFYCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbW4xMDIwMF9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogRHVtbXkgcmVsb2NhdGlvbi4gIERvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfTk9ORSwKLQkgMCwKLQkgMiwKLQkgMTYsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMjAwX05PTkUiLAotCSBmYWxzZSwKLQkgMCwKLQkgMCwKLQkgZmFsc2UpLAotICAvKiBTdGFuZGFyZCAzMiBiaXQgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMjAwXzMyLAotCSAwLAotCSAyLAotCSAzMiwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfMzIiLAotCSBmYWxzZSwKLQkgMHhmZmZmZmZmZiwKLQkgMHhmZmZmZmZmZiwKLQkgZmFsc2UpLAotICAvKiBTdGFuZGFyZCAxNiBiaXQgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMjAwXzE2LAotCSAwLAotCSAxLAotCSAxNiwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfMTYiLAotCSBmYWxzZSwKLQkgMHhmZmZmLAotCSAweGZmZmYsCi0JIGZhbHNlKSwKLSAgLyogU3RhbmRhcmQgOCBiaXQgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMjAwXzgsCi0JIDAsCi0JIDAsCi0JIDgsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMjAwXzgiLAotCSBmYWxzZSwKLQkgMHhmZiwKLQkgMHhmZiwKLQkgZmFsc2UpLAotICAvKiBTdGFuZGFyZCAyNCBiaXQgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMjAwXzI0LAotCSAwLAotCSAyLAotCSAyNCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfMjQiLAotCSBmYWxzZSwKLQkgMHhmZmZmZmYsCi0JIDB4ZmZmZmZmLAotCSBmYWxzZSksCi0gIC8qIFNpbXBsZSA4IHBjLXJlbGF0aXZlIHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDIwMF9QQ1JFTDgsCi0JIDAsCi0JIDAsCi0JIDgsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfUENSRUw4IiwKLQkgZmFsc2UsCi0JIDB4ZmYsCi0JIDB4ZmYsCi0JIHRydWUpLAotICAvKiBTaW1wbGUgMTYgcGMtcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMjAwX1BDUkVMMTYsCi0JIDAsCi0JIDEsCi0JIDE2LAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMjAwX1BDUkVMMTYiLAotCSBmYWxzZSwKLQkgMHhmZmZmLAotCSAweGZmZmYsCi0JIHRydWUpLAotICAvKiBTaW1wbGUgMzJiaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCBhIDEgYnl0ZSBhZGp1c3RtZW50Ci0gICAgIHRvIGdldCB0aGUgcGMtcmVsYXRpdmUgb2Zmc2V0IGNvcnJlY3QuICAqLwotICBIT1dUTyAoUl9NTjEwMjAwX1BDUkVMMjQsCi0JIDAsCi0JIDIsCi0JIDI0LAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMjAwX1BDUkVMMjQiLAotCSBmYWxzZSwKLQkgMHhmZmZmZmYsCi0JIDB4ZmZmZmZmLAotCSB0cnVlKSwKLX07Ci0KLXN0cnVjdCBtbjEwMjAwX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtbjEwMjAwX3JlbG9jX21hcCBtbjEwMjAwX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NTjEwMjAwX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX01OMTAyMDBfMzIsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX01OMTAyMDBfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfTU4xMDIwMF84LCB9LAotICB7IEJGRF9SRUxPQ18yNCwgUl9NTjEwMjAwXzI0LCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX01OMTAyMDBfUENSRUw4LCB9LAotICB7IEJGRF9SRUxPQ18xNl9QQ1JFTCwgUl9NTjEwMjAwX1BDUkVMMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzI0X1BDUkVMLCBSX01OMTAyMDBfUENSRUwyNCwgfSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7Ci0gICAgICAgaSA8IHNpemVvZiAobW4xMDIwMF9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgbW4xMDIwMF9yZWxvY19tYXApOwotICAgICAgIGkrKykKLSAgICB7Ci0gICAgICBpZiAobW4xMDIwMF9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmZWxmX21uMTAyMDBfaG93dG9fdGFibGVbbW4xMDIwMF9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIE1OMTAyMDAgRUxGIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1uMTAyMDBfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfTU4xMDIwMF9NQVgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0KLS8qIFBlcmZvcm0gYSByZWxvY2F0aW9uIGFzIHBhcnQgb2YgYSBmaW5hbCBsaW5rLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBvZmZzZXQsIHZhbHVlLAotCQkJCSBhZGRlbmQsIGluZm8sIHN5bV9zZWMsIGlzX2xvY2FsKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0gICAgIGludCBpc19sb2NhbDsKLXsKLSAgdW5zaWduZWQgbG9uZyByX3R5cGUgPSBob3d0by0+dHlwZTsKLSAgYmZkX2J5dGUgKmhpdF9kYXRhID0gY29udGVudHMgKyBvZmZzZXQ7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotCi0gICAgY2FzZSBSX01OMTAyMDBfTk9ORToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDIwMF8zMjoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDIwMF8xNjoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHg3ZmZmIHx8IChsb25nKXZhbHVlIDwgLTB4ODAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfODoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHg3ZiB8fCAobG9uZyl2YWx1ZSA8IC0weDgwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwXzI0OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmZmZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDgwMDAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICB2YWx1ZSAmPSAweGZmZmZmZjsKLSAgICAgIHZhbHVlIHw9IChiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhKSAmIDB4ZmYwMDAwMDApOwotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwX1BDUkVMODoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSAob2Zmc2V0ICsgMSk7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4ZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHgxMDApCi0gICAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwX1BDUkVMMTY6Ci0gICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgdmFsdWUgLT0gKG9mZnNldCArIDIpOwotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweGZmZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHgxMDAwMCkKLSAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwX1BDUkVMMjQ6Ci0gICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgdmFsdWUgLT0gKG9mZnNldCArIDMpOwotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweGZmZmZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDEwMDAwMDApCi0gICAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIHZhbHVlICY9IDB4ZmZmZmZmOwotICAgICAgdmFsdWUgfD0gKGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgMHhmZjAwMDAwMCk7Ci0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgIH0KLX0KLQotDAotLyogUmVsb2NhdGUgYW4gTU4xMDIwMCBFTEYgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotbW4xMDIwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGhvd3RvID0gZWxmX21uMTAyMDBfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLSAgICAgICAgICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0gICAgICAgICAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0gICAgICAgICAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHIgPSBtbjEwMjAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCQkgICBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkJICAgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCwKLQkJCQkJICAgaW5mbywgc2VjLCBoID09IE5VTEwpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNvbnN0IGNoYXIgKm1zZyA9IChjb25zdCBjaGFyICopMDsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjb21tb25fZXJyb3I6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVsYXhpbmcgZm9yIHRoZSBtbjEwMjAwLgotCi0gICBUaGVyZSdzIHF1aXRlIGEgZmV3IHJlbGF4aW5nIG9wcG9ydHVuaXRlcyBhdmFpbGFibGUgb24gdGhlIG1uMTAyMDA6Ci0KLQkqIGpzcjoyNCAtPiBqc3I6MTYgCQkJCQkgICAyIGJ5dGVzCi0KLQkqIGptcDoyNCAtPiBqbXA6MTYJCQkJCSAgIDIgYnl0ZXMKLQkqIGptcDoxNiAtPiBicmE6OAkJCQkJICAgMSBieXRlCi0KLQkJKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgYSBjb25kaXRpb25hbCBicmFuY2gKLQkJYXJvdW5kIHRoZSBqdW1wL2JyYSwgd2UgbWF5IGJlIGFibGUgdG8gcmV2ZXJzZSBpdHMgY29uZGl0aW9uCi0JCWFuZCBjaGFuZ2UgaXRzIHRhcmdldCB0byB0aGUganVtcCdzIHRhcmdldC4gIFRoZSBqdW1wL2JyYQotCQljYW4gdGhlbiBiZSBkZWxldGVkLgkJCQkgICAyIGJ5dGVzCi0KLQkqIG1vdiBhYnMyNCAtPiBtb3YgYWJzMTYJMiBieXRlIHNhdmluZ3MKLQotCSogTW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggYWNjZXB0IGltbTI0IGNhbiByZWxheCB0byBpbW0xNiAgMiBieXRlcwotCS0gTW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggYWNjZXB0IGltbTE2IGNhbiByZWxheCB0byBpbW04ICAgMSBieXRlCi0KLQkqIE1vc3QgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFjY2VwdCBkMjQgY2FuIHJlbGF4IHRvIGQxNgkgICAyIGJ5dGVzCi0JLSBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgZDE2IGNhbiByZWxheCB0byBkOAkgICAxIGJ5dGUKLQotCWFiczI0LCBpbW0yNCwgZDI0IGFsbCBsb29rIHRoZSBzYW1lIGF0IHRoZSByZWxvYyBsZXZlbC4gIEl0Ci0JbWlnaHQgbWFrZSB0aGUgY29kZSBzaW1wbGVyIGlmIHdlIGhhZCBkaWZmZXJlbnQgcmVsb2NzIGZvcgotCXRoZSB2YXJpb3VzIHJlbGF4YWJsZSBvcGVyYW5kIHR5cGVzLgotICAgCi0JV2UgZG9uJ3QgaGFuZGxlIGltbTE2LT5pbW04IG9yIGQxNi0+ZDggYXMgdGhleSdyZSB2ZXJ5IHJhcmUKLQlhbmQgc29tZXdoYXQgbW9yZSBkaWZmaWN1bHQgdG8gc3VwcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuIAotbW4xMDIwMF9lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltcyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZnJlZV9leHRzeW1zID0gTlVMTDsKLQotICAvKiBBc3N1bWUgbm90aGluZyBjaGFuZ2VzLiAgKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgLyogV2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBmb3IgYSByZWxvY2F0ZWFibGUgbGluaywgaWYKLSAgICAgdGhpcyBzZWN0aW9uIGRvZXMgbm90IGhhdmUgcmVsb2NzLCBvciBpZiB0aGlzIGlzIG5vdCBhCi0gICAgIGNvZGUgc2VjdGlvbi4gICovCi0gIGlmIChsaW5rX2luZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLSAgICAgIHx8IHNlYy0+cmVsb2NfY291bnQgPT0gMAotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc2VjdGlvbiwKLSAgICAgaW5pdGlhbGl6ZSB0aGUgY29va2VkIHNpemUuICAqLwotICBpZiAoc2VjLT5fY29va2VkX3NpemUgPT0gMCkKLSAgICBzZWMtPl9jb29rZWRfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLQotICAvKiBHZXQgYSBjb3B5IG9mIHRoZSBuYXRpdmUgcmVsb2NhdGlvbnMuICAqLwotICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCSAgICAgKGFiZmQsIHNlYywgKFBUUikgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCSAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIC8qIFdhbGsgdGhyb3VnaCB0aGVtIGxvb2tpbmcgZm9yIHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMuICAqLwotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgc3ltdmFsOwotCi0gICAgICAvKiBJZiB0aGlzIGlzbid0IHNvbWV0aGluZyB0aGF0IGNhbiBiZSByZWxheGVkLCB0aGVuIGlnbm9yZQotCSB0aGlzIHJlbG9jLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMjAwX05PTkUKLQkgIHx8IEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAyMDBfOAotCSAgfHwgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF9NQVgpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCSAgICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFJlYWQgdGhpcyBCRkQncyBzeW1ib2xzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JewotCSAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0JICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQkgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JICAgICAgZXh0c3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfc2l6ZSkpOwotCSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JCSAgfHwgKGJmZF9yZWFkIChleHRzeW1zLCAxLCBzeW10YWJfaGRyLT5zaF9zaXplLCBhYmZkKQotCQkgICAgICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGUgcmVsb2MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pIDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0JICBhc2VjdGlvbiAqc3ltX3NlYzsKLQotCSAgLyogQSBsb2NhbCBzeW1ib2wuICAqLwotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLAotCQkJCSAgICBleHRzeW1zICsgRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJICAgICZpc3ltKTsKLQotCSAgc3ltX3NlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBpc3ltLnN0X3NobmR4KTsKLQkgIHN5bXZhbCA9IChpc3ltLnN0X3ZhbHVlCi0JCSAgICArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgc3ltX3NlYy0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAvKiBBbiBleHRlcm5hbCBzeW1ib2wuICAqLwotCSAgaW5keCA9IEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pIC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgIGggPSBlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5keF07Ci0JICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCSAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBhcHBlYXJzIHRvIGJlIGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZAotICAgICAgICAgICAgICAgICBzeW1ib2wuICBKdXN0IGlnbm9yZSBpdC0taXQgd2lsbCBiZSBjYXVnaHQgYnkgdGhlCi0gICAgICAgICAgICAgICAgIHJlZ3VsYXIgcmVsb2MgcHJvY2Vzc2luZy4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc3ltdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JfQotCi0gICAgICAvKiBGb3Igc2ltcGxpY2l0eSBvZiBjb2RpbmcsIHdlIGFyZSBnb2luZyB0byBtb2RpZnkgdGhlIHNlY3Rpb24KLQkgY29udGVudHMsIHRoZSBzZWN0aW9uIHJlbG9jcywgYW5kIHRoZSBCRkQgc3ltYm9sIHRhYmxlLiAgV2UKLQkgbXVzdCB0ZWxsIHRoZSByZXN0IG9mIHRoZSBjb2RlIG5vdCB0byBmcmVlIHVwIHRoaXMKLQkgaW5mb3JtYXRpb24uICBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBpbnN0ZWFkIGNyZWF0ZSBhIHRhYmxlCi0JIG9mIGNoYW5nZXMgd2hpY2ggaGF2ZSB0byBiZSBtYWRlLCBhcyBpcyBkb25lIGluIGNvZmYtbWlwcy5jOwotCSB0aGF0IHdvdWxkIGJlIG1vcmUgd29yaywgYnV0IHdvdWxkIHJlcXVpcmUgbGVzcyBtZW1vcnkgd2hlbgotCSB0aGUgbGlua2VyIGlzIHJ1bi4gICovCi0KLQotICAgICAgLyogVHJ5IHRvIHR1cm4gYSAyNGJpdCBwYy1yZWxhdGl2ZSBicmFuY2gvY2FsbCBpbnRvIGEgMTZiaXQgcGMtcmVsYXRpdmUKLQkgYnJhbmNoL2NhbGwuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAyMDBfUENSRUwyNCkKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCi0JICAvKiBEZWFsIHdpdGggcGMtcmVsYXRpdmUgZ3Vuay4gICovCi0JICB2YWx1ZSAtPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIHZhbHVlIC09IChpcmVsLT5yX29mZnNldCArIDMpOwotCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgdmFsdWUgd2lsbCBmaXQgaW4gMTYgYml0cywgbm90ZSB0aGUgaGlnaCB2YWx1ZSBpcwotCSAgICAgMHg3ZmZmICsgMiBhcyB0aGUgdGFyZ2V0IHdpbGwgYmUgdHdvIGJ5dGVzIGNsb3NlciBpZiB3ZSBhcmUKLQkgICAgIGFibGUgdG8gcmVsYXguICAqLwotCSAgaWYgKChsb25nKXZhbHVlIDwgMHg4MDAxICYmIChsb25nKXZhbHVlID4gLTB4ODAwMCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICBpZiAoY29kZSAhPSAweGUwICYmIGNvZGUgIT0gMHhlMSkKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JICAgICAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGlmIChjb2RlID09IDB4ZTApCi0JCWJmZF9wdXRfOCAoYWJmZCwgMHhmYywgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCSAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMHhlMSkKLQkJYmZkX3B1dF84IChhYmZkLCAweGZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkgICAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkgICAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICBSX01OMTAyMDBfUENSRUwxNik7Ci0KLQkgICAgICAvKiBUaGUgb3Bjb2RlIGdvdCBzaG9ydGVyIHRvbywgc28gd2UgaGF2ZSB0byBmaXggdGhlIG9mZnNldC4gICovCi0JICAgICAgaXJlbC0+cl9vZmZzZXQgLT0gMTsKLQotCSAgICAgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JICAgICAgaWYgKCFtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCSAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JICAgICAgKmFnYWluID0gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogVHJ5IHRvIHR1cm4gYSAxNmJpdCBwYy1yZWxhdGl2ZSBicmFuY2ggaW50byBhIDhiaXQgcGMtcmVsYXRpdmUKLQkgYnJhbmNoLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMjAwX1BDUkVMMTYpCi0JewotCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKLQotCSAgLyogRGVhbCB3aXRoIHBjLXJlbGF0aXZlIGd1bmsuICAqLwotCSAgdmFsdWUgLT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICB2YWx1ZSAtPSAoaXJlbC0+cl9vZmZzZXQgKyAyKTsKLQkgIHZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOwotCi0JICAvKiBTZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0IGluIDggYml0cywgbm90ZSB0aGUgaGlnaCB2YWx1ZSBpcwotCSAgICAgMHg3ZiArIDEgYXMgdGhlIHRhcmdldCB3aWxsIGJlIG9uZSBieXRlcyBjbG9zZXIgaWYgd2UgYXJlCi0JICAgICBhYmxlIHRvIHJlbGF4LiAgKi8KLQkgIGlmICgobG9uZyl2YWx1ZSA8IDB4ODAgJiYgKGxvbmcpdmFsdWUgPiAtMHg4MCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICBpZiAoY29kZSAhPSAweGZjKQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkgICAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JICAgICAgYmZkX3B1dF84IChhYmZkLCAweGVhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkgICAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICBSX01OMTAyMDBfUENSRUw4KTsKLQotCSAgICAgIC8qIERlbGV0ZSBvbmUgYnl0ZSBvZiBkYXRhLiAgKi8KLQkgICAgICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAxKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkgICAgICAqYWdhaW4gPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUcnkgdG8gZWxpbWluYXRlIGFuIHVuY29uZGl0aW9uYWwgOCBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoCi0JIHdoaWNoIGltbWVkaWF0ZWx5IGZvbGxvd3MgYSBjb25kaXRpb25hbCA4IGJpdCBwYy1yZWxhdGl2ZQotCSBicmFuY2ggYXJvdW5kIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaC4KLQotCSAgICBvcmlnaW5hbDoJCW5ldzoKLQkgICAgYkNDIGxhYjEJCWJDQycgbGFiMgotCSAgICBicmEgbGFiMgotCSAgIGxhYjE6CSAgICAgICBsYWIxOgotCi0KLQkgVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGJDQyBjYW4ndCByZWFjaCBsYWIyIGF0IGFzc2VtYmx5IHRpbWUsCi0JIGJ1dCBkdWUgdG8gb3RoZXIgcmVsYXhhdGlvbnMgaXQgY2FuIHJlYWNoIGF0IGxpbmsgdGltZS4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF9QQ1JFTDgpCi0JewotCSAgRWxmX0ludGVybmFsX1JlbGEgKm5yZWw7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCSAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAvKiBEZWFsIHdpdGggcGMtcmVsYXRpdmUgZ3Vuay4gICovCi0JICB2YWx1ZSAtPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIHZhbHVlIC09IChpcmVsLT5yX29mZnNldCArIDEpOwotCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQkgIC8qIERvIG5vdGhpbmcgaWYgdGhpcyByZWxvYyBpcyB0aGUgbGFzdCBieXRlIGluIHRoZSBzZWN0aW9uLiAgKi8KLQkgIGlmIChpcmVsLT5yX29mZnNldCA9PSBzZWMtPl9jb29rZWRfc2l6ZSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpcyBhbiB1bmNvbmRpdGlvbmFsIHBjLXJlbGF0aXZlCi0JICAgICBicmFuY2gsIG1vcmUgb2Z0ZW4gdGhhbiBub3QgdGhpcyB0ZXN0IHdpbGwgZmFpbCwgc28gd2UKLQkgICAgIHRlc3QgaXQgZmlyc3QgdG8gc3BlZWQgdGhpbmdzIHVwLiAgKi8KLQkgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyAxKTsKLQkgIGlmIChjb2RlICE9IDB4ZWEpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBBbHNvIG1ha2Ugc3VyZSB0aGUgbmV4dCByZWxvY2F0aW9uIGFwcGxpZXMgdG8gdGhlIG5leHQKLQkgICAgIGluc3RydWN0aW9uIGFuZCB0aGF0IGl0J3MgYSBwYy1yZWxhdGl2ZSA4IGJpdCBicmFuY2guICAqLwotCSAgbnJlbCA9IGlyZWwgKyAxOwotCSAgaWYgKG5yZWwgPT0gaXJlbGVuZAotCSAgICAgIHx8IGlyZWwtPnJfb2Zmc2V0ICsgMiAhPSBucmVsLT5yX29mZnNldAotCSAgICAgIHx8IEVMRjMyX1JfVFlQRSAobnJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX01OMTAyMDBfUENSRUw4KQotCSAgICBjb250aW51ZTsKLQotCSAgLyogTWFrZSBzdXJlIG91ciBkZXN0aW5hdGlvbiBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZQotCSAgICAgdW5jb25kaXRpb25hbCBicmFuY2guICAqLwotCSAgaWYgKHN5bXZhbCAhPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgKyBpcmVsLT5yX29mZnNldCArIDMpKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogTm93IG1ha2Ugc3VyZSB3ZSBhcmUgYSBjb25kaXRpb25hbCBicmFuY2guICBUaGlzIG1heSBub3QKLQkgICAgIGJlIG5lY2Vzc2FyeSwgYnV0IHdoeSB0YWtlIHRoZSBjaGFuY2UuIAotCi0JICAgICBOb3RlIHRoZXNlIGNoZWNrcyBhc3N1bWUgdGhhdCBSX01OMTAyMDBfUENSRUw4IHJlbG9jcwotCSAgICAgb25seSBvY2N1ciBvbiBiQ0MgYW5kIGJDQ3ggaW5zbnMuICBJZiB0aGV5IG9jY3VyZWQKLQkgICAgIGVsc2V3aGVyZSwgd2UnZCBuZWVkIHRvIGtub3cgdGhlIHN0YXJ0IG9mIHRoaXMgaW5zbgotCSAgICAgZm9yIHRoaXMgY2hlY2sgdG8gYmUgYWNjdXJhdGUuICAqLwotCSAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCSAgaWYgKGNvZGUgIT0gMHhlMCAmJiBjb2RlICE9IDB4ZTEgJiYgY29kZSAhPSAweGUyCi0JICAgICAgJiYgY29kZSAhPSAweGUzICYmIGNvZGUgIT0gMHhlNCAmJiBjb2RlICE9IDB4ZTUKLQkgICAgICAmJiBjb2RlICE9IDB4ZTYgJiYgY29kZSAhPSAweGU3ICYmIGNvZGUgIT0gMHhlOAotCSAgICAgICYmIGNvZGUgIT0gMHhlOSAmJiBjb2RlICE9IDB4ZWMgJiYgY29kZSAhPSAweGVkCi0JICAgICAgJiYgY29kZSAhPSAweGVlICYmIGNvZGUgIT0gMHhlZiAmJiBjb2RlICE9IDB4ZmMKLQkgICAgICAmJiBjb2RlICE9IDB4ZmQgJiYgY29kZSAhPSAweGZlICYmIGNvZGUgIT0gMHhmZikKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFdlIGFsc28gaGF2ZSB0byBiZSBzdXJlIHRoZXJlIGlzIG5vIHN5bWJvbC9sYWJlbAotCSAgICAgYXQgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLQkgIGlmIChtbjEwMjAwX2VsZl9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBzZWMsIGV4dHN5bXMsCi0JCQkJCSAgICBpcmVsLT5yX29mZnNldCArIDEpKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCSAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotCSAgc3dpdGNoIChjb2RlKQotCSAgICB7Ci0JICAgICAgY2FzZSAweGZjOgotCQljb2RlID0gMHhmZDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGZkOgotCQljb2RlID0gMHhmYzsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGZlOgotCQljb2RlID0gMHhmZjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGZmOgotCQljb2RlID0gMHhmZTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGU4OgotCQljb2RlID0gMHhlOTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGU5OgotCQljb2RlID0gMHhlODsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGUwOgotCQljb2RlID0gMHhlMjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGUyOgotCQljb2RlID0gMHhlMDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGUzOgotCQljb2RlID0gMHhlMTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGUxOgotCQljb2RlID0gMHhlMzsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGU0OgotCQljb2RlID0gMHhlNjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGU2OgotCQljb2RlID0gMHhlNDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGU3OgotCQljb2RlID0gMHhlNTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGU1OgotCQljb2RlID0gMHhlNzsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGVjOgotCQljb2RlID0gMHhlZDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGVkOgotCQljb2RlID0gMHhlYzsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGVlOgotCQljb2RlID0gMHhlZjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGVmOgotCQljb2RlID0gMHhlZTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCSAgCi0JICAvKiBTZXQgdGhlIHJlbG9jIHR5cGUgYW5kIHN5bWJvbCBmb3IgdGhlIGZpcnN0IGJyYW5jaAotCSAgICAgZnJvbSB0aGUgc2Vjb25kIGJyYW5jaC4gICovCi0JICBpcmVsLT5yX2luZm8gPSBucmVsLT5yX2luZm87Ci0KLQkgIC8qIE1ha2UgdGhlIHJlbG9jIGZvciB0aGUgc2Vjb25kIGJyYW5jaCBhIG51bGwgcmVsb2MuICAqLwotCSAgbnJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAobnJlbC0+cl9pbmZvKSwKLQkJCQkgICAgICAgUl9NTjEwMjAwX05PTkUpOwotCi0JICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCSAgaWYgKCFtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkgICphZ2FpbiA9IHRydWU7Ci0JfQotCi0gICAgICAvKiBUcnkgdG8gdHVybiBhIDI0Yml0IGltbWVkaWF0ZSwgZGlzcGxhY2VtZW50IG9yIGFic29sdXRlIGFkZHJlc3MKLQkgaW50byBhIDE2Yml0IGltbWVkaWF0ZSwgZGlzcGxhY2VtZW50IG9yIGFic29sdXRlIGFkZHJlc3MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAyMDBfMjQpCi0JewotCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKLQotCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLiAKLQkgICAgIFdlIGFsbG93IGFueSAxNmJpdCBtYXRjaCBoZXJlLiAgV2UgcHJ1bmUgdGhvc2Ugd2UgY2FuJ3QKLQkgICAgIGhhbmRsZSBiZWxvdy4gICovCi0JICBpZiAoKGxvbmcpdmFsdWUgPCAweDdmZmYgJiYgKGxvbmcpdmFsdWUgPiAtMHg4MDAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogQWxsIGluc25zIHdoaWNoIGhhdmUgMjRiaXQgb3BlcmFuZHMgYXJlIDUgYnl0ZXMgbG9uZywKLQkJIHRoZSBmaXJzdCBieXRlIHdpbGwgYWx3YXlzIGJlIDB4ZjQsIGJ1dCB3ZSBkb3VibGUgY2hlY2sKLQkJIGl0IGp1c3QgaW4gY2FzZS4gICovCi0KLQkgICAgICAvKiBHZXQgdGhlIGZpcnN0IG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JICAgICAgaWYgKGNvZGUgIT0gMHhmNCkKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBHZXQgdGhlIHNlY29uZCBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIHN3aXRjaCAoY29kZSAmIDB4ZmMpCi0JCXsKLQkJLyogbW92IGltbTI0LGRuIC0+IG1vdiBpbW0xNixkbiAqLwotCQljYXNlIDB4NzA6Ci0JCSAgLyogTm90IHNhZmUgaWYgdGhlIGhpZ2ggYml0IGlzIG9uIGFzIHJlbGF4aW5nIG1heQotCQkgICAgIG1vdmUgdGhlIHZhbHVlIG91dCBvZiBoaWdoIG1lbSBhbmQgdGh1cyBub3QgZml0Ci0JCSAgICAgaW4gYSBzaWduZWQgMTZiaXQgdmFsdWUuICAqLwotCQkgIGlmICh2YWx1ZSAmIDB4ODAwMCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbGRlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGY4ICsgKGNvZGUgJiAweDAzKSwKLQkJCSAgICAgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCSAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgICAgIFJfTU4xMDIwMF8xNik7Ci0KLQkJICAvKiBUaGUgb3Bjb2RlIGdvdCBzaG9ydGVyIHRvbywgc28gd2UgaGF2ZSB0byBmaXggdGhlCi0JCSAgICAgb2Zmc2V0LiAgKi8KLQkJICBpcmVsLT5yX29mZnNldCAtPSAxOwotCi0JCSAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQkgIGJyZWFrOwotCi0JCS8qIG1vdiBpbW0yNCxhbiAtPiBtb3YgaW1tMTYsYW4gCi0JCSAgIGNtcCBpbW0yNCxhbiAtPiBjbXAgaW1tMTYsYW4KLQkJICAgbW92IChhYnMyNCksZG4gLT4gbW92IChhYnMxNiksZG4KLQkJICAgbW92IGRuLChhYnMyNCkgLT4gbW92IGRuLChhYnMxNikKLQkJICAgbW92YiBkbiwoYWJzMjQpIC0+IG1vdmIgZG4sKGFiczE2KQotCQkgICBtb3ZidSAoYWJzMjQpLGRuIC0+IG1vdmJ1IChhYnMxNiksZG4gKi8KLQkJY2FzZSAweDc0OgotCQljYXNlIDB4N2M6Ci0JCWNhc2UgMHhjMDoKLQkJY2FzZSAweDQwOgotCQljYXNlIDB4NDQ6Ci0JCWNhc2UgMHhjODoKLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsZGVjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NzQpCi0JCSAgICBjb2RlID0gMHhkYyArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDdjKQotCQkgICAgY29kZSA9IDB4ZWMgKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhjMCkKLQkJICAgIGNvZGUgPSAweGM4ICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NDApCi0JCSAgICBjb2RlID0gMHhjMCArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDQ0KQotCQkgICAgY29kZSA9IDB4YzQgKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhjOCkKLQkJICAgIGNvZGUgPSAweGNjICsgKGNvZGUgJiAweDAzKTsKLQotCQkgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgICAgICBSX01OMTAyMDBfMTYpOwotCi0JCSAgLyogVGhlIG9wY29kZSBnb3Qgc2hvcnRlciB0b28sIHNvIHdlIGhhdmUgdG8gZml4IHRoZQotCQkgICAgIG9mZnNldC4gICovCi0JCSAgaXJlbC0+cl9vZmZzZXQgLT0gMTsKLQotCQkgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JCSAgaWYgKCFtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCSAgICAgICBpcmVsLT5yX29mZnNldCArIDEsIDIpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgKmFnYWluID0gdHJ1ZTsKLQkJICBicmVhazsKLQotCQkvKiBjbXAgaW1tMjQsZG4gLT4gY21wIGltbTE2LGRuCi0JCSAgIG1vdiAoYWJzMjQpLGFuIC0+IG1vdiAoYWJzMTYpLGFuCi0JCSAgIG1vdiBhbiwoYWJzMjQpIC0+IG1vdiBhbiwoYWJzMTYpCi0JCSAgIGFkZCBpbW0yNCxkbiAtPiBhZGQgaW1tMTYsZG4KLQkJICAgYWRkIGltbTI0LGFuIC0+IGFkZCBpbW0xNixhbgotCQkgICBzdWIgaW1tMjQsZG4gLT4gc3ViIGltbTE2LGRuCi0JCSAgIHN1YiBpbW0yNCxhbiAtPiBzdWIgaW1tMTYsYW4gCi0JCSAgIEFuZCBhbGwgZDI0LT5kMTYgaW4gbWVtb3J5IG9wcy4gICovCi0JCWNhc2UgMHg3ODoKLQkJY2FzZSAweGQwOgotCQljYXNlIDB4NTA6Ci0JCWNhc2UgMHg2MDoKLQkJY2FzZSAweDY0OgotCQljYXNlIDB4Njg6Ci0JCWNhc2UgMHg2YzoKLQkJY2FzZSAweDgwOgotCQljYXNlIDB4ZjA6Ci0JCWNhc2UgMHgwMDoKLQkJY2FzZSAweDEwOgotCQljYXNlIDB4YjA6Ci0JCWNhc2UgMHgzMDoKLQkJY2FzZSAweGEwOgotCQljYXNlIDB4MjA6Ci0JCWNhc2UgMHg5MDoKLQkJICAvKiBOb3Qgc2FmZSBpZiB0aGUgaGlnaCBiaXQgaXMgb24gYXMgcmVsYXhpbmcgbWF5Ci0JCSAgICAgbW92ZSB0aGUgdmFsdWUgb3V0IG9mIGhpZ2ggbWVtIGFuZCB0aHVzIG5vdCBmaXQKLQkJICAgICBpbiBhIHNpZ25lZCAxNmJpdCB2YWx1ZS4gICovCi0JCSAgaWYgKCgoY29kZSAmIDB4ZmMpID09IDB4NzgKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHg2MAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDY0Ci0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4NjgKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHg2YwotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDgwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4ZjAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHgwMAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDEwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4YjAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHgzMAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweGEwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4MjAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHg5MCkKLQkJICAgICAgICYmICh2YWx1ZSAmIDB4ODAwMCkgIT0gMCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbGRlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGY3LCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkJICBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDc4KQotCQkgICAgY29kZSA9IDB4NDggKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhkMCkKLQkJICAgIGNvZGUgPSAweDMwICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NTApCi0JCSAgICBjb2RlID0gMHgyMCArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDYwKQotCQkgICAgY29kZSA9IDB4MTggKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg2NCkKLQkJICAgIGNvZGUgPSAweDA4ICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NjgpCi0JCSAgICBjb2RlID0gMHgxYyArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDZjKQotCQkgICAgY29kZSA9IDB4MGMgKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg4MCkKLQkJICAgIGNvZGUgPSAweGMwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4ZjApCi0JCSAgICBjb2RlID0gMHhiMCArIChjb2RlICYgMHgwNyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDAwKQotCQkgICAgY29kZSA9IDB4ODAgKyAoY29kZSAmIDB4MDcpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHgxMCkKLQkJICAgIGNvZGUgPSAweGEwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4YjApCi0JCSAgICBjb2RlID0gMHg3MCArIChjb2RlICYgMHgwNyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDMwKQotCQkgICAgY29kZSA9IDB4NjAgKyAoY29kZSAmIDB4MDcpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhhMCkKLQkJICAgIGNvZGUgPSAweGQwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4MjApCi0JCSAgICBjb2RlID0gMHg5MCArIChjb2RlICYgMHgwNyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDkwKQotCQkgICAgY29kZSA9IDB4NTAgKyAoY29kZSAmIDB4MDcpOwotCi0JCSAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkJICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICAgICAgUl9NTjEwMjAwXzE2KTsKLQotCQkgIC8qIERlbGV0ZSBvbmUgYnl0ZXMgb2YgZGF0YS4gICovCi0JCSAgaWYgKCFtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCSAgICAgICBpcmVsLT5yX29mZnNldCArIDIsIDEpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgKmFnYWluID0gdHJ1ZTsKLQkJICBicmVhazsKLQotCQkvKiBtb3ZiIChhYnMyNCksZG4gLT5tb3ZidSAoYWJzMTYpLGRuIGV4dHhiIGJuICovCi0JCWNhc2UgMHhjNDoKLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsZGVjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhjYyArIChjb2RlICYgMHgwMyksCi0JCQkgICAgIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhiOCArIChjb2RlICYgMHgwMyksCi0JCQkgICAgIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCQkgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgICAgICBSX01OMTAyMDBfMTYpOwotCi0JCSAgLyogVGhlIHJlbG9jIHdpbGwgYmUgYXBwbGllZCBvbmUgYnl0ZSBpbiBmcm9udCBvZiBpdHMKLQkJICAgICBjdXJyZW50IGxvY2F0aW9uLiAgKi8KLQkJICBpcmVsLT5yX29mZnNldCAtPSAxOwotCi0JCSAgLyogRGVsZXRlIG9uZSBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMiwgMSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQl9Ci0gICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKLQl9Ci0gICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBEZWxldGUgc29tZSBieXRlcyBmcm9tIGEgc2VjdGlvbiB3aGlsZSByZWxheGluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWRkciwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXM7Ci0gIGludCBzaG5keCwgaW5kZXg7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGFsaWduOwotICBiZmRfdm1hIHRvYWRkcjsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKnN5bV9oYXNoOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0KLSAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYyk7Ci0KLSAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQotICAvKiBUaGUgZGVsZXRpb24gbXVzdCBzdG9wIGF0IHRoZSBuZXh0IEFMSUdOIHJlbG9jIGZvciBhbiBhbGlnbWVudAotICAgICBwb3dlciBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGFyZSBkZWxldGluZy4gICovCi0KLSAgaXJlbGFsaWduID0gTlVMTDsKLSAgdG9hZGRyID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLSAgaXJlbCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jczsKLSAgaXJlbGVuZCA9IGlyZWwgKyBzZWMtPnJlbG9jX2NvdW50OwotCi0gIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLwotICBtZW1tb3ZlIChjb250ZW50cyArIGFkZHIsIGNvbnRlbnRzICsgYWRkciArIGNvdW50LCB0b2FkZHIgLSBhZGRyIC0gY291bnQpOwotICBzZWMtPl9jb29rZWRfc2l6ZSAtPSBjb3VudDsKLQotICAvKiBBZGp1c3QgYWxsIHRoZSByZWxvY3MuICAqLwotICBmb3IgKGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgLyogR2V0IHRoZSBuZXcgcmVsb2MgYWRkcmVzcy4gICovCi0gICAgICBpZiAoKGlyZWwtPnJfb2Zmc2V0ID4gYWRkcgotCSAgICYmIGlyZWwtPnJfb2Zmc2V0IDwgdG9hZGRyKSkKLQlpcmVsLT5yX29mZnNldCAtPSBjb3VudDsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IHRoZSBsb2NhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXM7Ci0gIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLQotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmIGlzeW0uc3RfdmFsdWUgPiBhZGRyCi0JICAmJiBpc3ltLnN0X3ZhbHVlIDwgdG9hZGRyKQotCXsKLQkgIGlzeW0uc3RfdmFsdWUgLT0gY291bnQ7Ci0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0IChhYmZkLCAmaXN5bSwgZXN5bSk7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgYWRqdXN0IHRoZSBnbG9iYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGVzeW0gPSBleHRzeW1zICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZXN5bWVuZCA9IGV4dHN5bXMgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSk7Ci0gIGZvciAoaW5kZXggPSAwOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrLCBpbmRleCsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7Ci0gICAgICBzeW1faGFzaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmRleF07Ci0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgKChzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCAoc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uID09IHNlYwotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA+IGFkZHIKLQkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPCB0b2FkZHIpCi0JewotCSAgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSAtPSBjb3VudDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiBhIHN5bWJvbCBleGlzdHMgYXQgdGhlIGdpdmVuIGFkZHJlc3MsIGVsc2UgcmV0dXJuCi0gICBmYWxzZS4gICovCi1zdGF0aWMgYm9vbGVhbgotbW4xMDIwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcCAoYWJmZCwgc2VjLCBleHRzeW1zLCBhZGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltczsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgaW50IHNobmR4OwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoLCAqKnN5bV9oYXNoX2VuZDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOwotCi0gIC8qIEV4YW1pbmUgYWxsIHRoZSBzeW1ib2xzLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXM7Ci0gIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLQotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmIGlzeW0uc3RfdmFsdWUgPT0gYWRkcikKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgc3ltX2hhc2ggPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoX2VuZCA9IChzeW1faGFzaAotCQkgICsgKHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkKLQkJICAgICAtIHN5bXRhYl9oZHItPnNoX2luZm8pKTsKLSAgZm9yICg7IHN5bV9oYXNoIDwgc3ltX2hhc2hfZW5kOyBzeW1faGFzaCsrKQotICAgIHsKLSAgICAgIGlmICgoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAmJiAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA9PSBhZGRyKQotCXJldHVybiB0cnVlOwotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgIHdoaWNoIHVzZXMgbW4xMDIwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1tbjEwMjAwX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKLQkJCQkJICAgIGRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgYmZkICppbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKipzZWN0aW9ucyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfU3ltICppbnRlcm5hbF9zeW1zID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlbGF4aW5nLCBvciBvZiBoYXZpbmcgYQotICAgICBwYXJ0aWN1bGFyIHNldCBvZiBzZWN0aW9uIGNvbnRlbnRzLCBzcGVjaWFsbHkuICAqLwotICBpZiAocmVsb2NhdGVhYmxlCi0gICAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJCSAgICAgICByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgbWVtY3B5IChkYXRhLCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMsCi0JICBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLSAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICppc3ltcDsKLSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotCi0gICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQlleHRlcm5hbF9zeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBleHRlcm5hbF9zeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAgICAgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKTsKLQkgIGlmIChleHRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3N5bXMsIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSwKLQkJCSAgICBzeW10YWJfaGRyLT5zaF9pbmZvLCBpbnB1dF9iZmQpCi0JCSAgIT0gKHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKFBUUikgTlVMTCwKLQkJCSAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIGZhbHNlKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGludGVybmFsX3N5bXMgPSAoKEVsZl9JbnRlcm5hbF9TeW0gKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJCSAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gICAgICBpZiAoc2VjdGlvbnMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaXN5bXAgPSBpbnRlcm5hbF9zeW1zOwotICAgICAgc2VjcHAgPSBzZWN0aW9uczsKLSAgICAgIGVzeW0gPSBleHRlcm5hbF9zeW1zOwotICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyArK2VzeW0sICsraXN5bXAsICsrc2VjcHApCi0JewotCSAgYXNlY3Rpb24gKmlzZWM7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCBpc3ltcCk7Ci0KLQkgIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQotCSAgICBpc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA+IDAgJiYgaXN5bXAtPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgaXNlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW1wLT5zdF9zaG5keCk7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0FCUykKLQkgICAgaXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgaXNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXaG8ga25vd3M/ICAqLwotCSAgICAgIGlzZWMgPSBOVUxMOwotCSAgICB9Ci0KLQkgICpzZWNwcCA9IGlzZWM7Ci0JfQotCi0gICAgICBpZiAoISBtbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGlucHV0X2JmZCwKLQkJCQkgICAgIGlucHV0X3NlY3Rpb24sIGRhdGEsIGludGVybmFsX3JlbG9jcywKLQkJCQkgICAgIGludGVybmFsX3N5bXMsIHNlY3Rpb25zKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCi0JZnJlZSAoc2VjdGlvbnMpOwotICAgICAgc2VjdGlvbnMgPSBOVUxMOwotICAgICAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKLQlmcmVlIChpbnRlcm5hbF9zeW1zKTsKLSAgICAgIGludGVybmFsX3N5bXMgPSBOVUxMOwotICAgICAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotCWZyZWUgKGV4dGVybmFsX3N5bXMpOwotICAgICAgZXh0ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0JZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBkYXRhOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwKLSAgICAgICYmIGludGVybmFsX3JlbG9jcyAhPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzKQotICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gIGlmIChleHRlcm5hbF9zeW1zICE9IE5VTEwgJiYgc3ltdGFiX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9zeW1zKTsKLSAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChpbnRlcm5hbF9zeW1zKTsKLSAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoc2VjdGlvbnMpOwotICByZXR1cm4gTlVMTDsKLX0KLQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9tbjEwMjAwX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjMyLW1uMTAyMDAiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9tbjEwMjAwCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX01OMTAyMDAKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwltbjEwMjAwX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCTAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiBtbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsYXhfc2VjdGlvbgltbjEwMjAwX2VsZl9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLQkJCQltbjEwMjAwX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLQotI2RlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciAnXycKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZi1tMTAzMDAuYyBiL2JmZC9lbGYtbTEwMzAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYTA5YTguLjAwMDAwMDAKLS0tIGEvYmZkL2VsZi1tMTAzMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MjEgKzAsMCBAQAotLyogTWF0c3VzaGl0YSAxMDMwMCBzcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvbW4xMDMwMC5oIgotCi1zdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkKLXsKLSAgLyogVGhlIGJhc2ljIGVsZiBsaW5rIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIEZvciBmdW5jdGlvbiBzeW1ib2xzLCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gaXMKLSAgICAgY2FsbGVkIGRpcmVjdGx5IChpZSBieSBuYW1lKS4gICovCi0gIHVuc2lnbmVkIGludCBkaXJlY3RfY2FsbHM7Ci0KLSAgLyogRm9yIGZ1bmN0aW9uIHN5bWJvbHMsIHRoZSBzaXplIG9mIHRoaXMgZnVuY3Rpb24ncyBzdGFjawotICAgICAoaWYgPD0gMjU1IGJ5dGVzKS4gIFdlIHN0dWZmIHRoaXMgaW50byAiY2FsbCIgaW5zdHJ1Y3Rpb25zCi0gICAgIHRvIHRoaXMgdGFyZ2V0IHdoZW4gaXQncyB2YWxpZCBhbmQgcHJvZml0YWJsZSB0byBkbyBzby4KLQotICAgICBUaGlzIGRvZXMgbm90IGluY2x1ZGUgc3RhY2sgYWxsb2NhdGVkIGJ5IG1vdm0hICAqLwotICB1bnNpZ25lZCBjaGFyIHN0YWNrX3NpemU7Ci0KLSAgLyogRm9yIGZ1bmN0aW9uIHN5bWJvbHMsIGFyZ3VtZW50cyAoaWYgYW55KSBmb3IgbW92bSBpbnN0cnVjdGlvbgotICAgICBpbiB0aGUgcHJvbG9ndWUuICBXZSBzdHVmZiB0aGlzIHZhbHVlIGludG8gImNhbGwiIGluc3RydWN0aW9ucwotICAgICB0byB0aGUgdGFyZ2V0IHdoZW4gaXQncyB2YWxpZCBhbmQgcHJvZml0YWJsZSB0byBkbyBzby4gICovCi0gIHVuc2lnbmVkIGNoYXIgbW92bV9hcmdzOwotCi0gIC8qIEZvciBmdW50aW9uIHN5bWJvbHMsIHRoZSBhbW91bnQgb2Ygc3RhY2sgc3BhY2UgdGhhdCB3b3VsZCBiZSBhbGxvY2F0ZWQKLSAgICAgYnkgdGhlIG1vdm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHJlZHVuZGFudCB3aXRoIG1vdm1fYXJncywgYnV0IHdlCi0gICAgIGFkZCBpdCB0byB0aGUgaGFzaCB0YWJsZSB0byBhdm9pZCBjb21wdXRpbmcgaXQgb3ZlciBhbmQgb3Zlci4gICovCi0gIHVuc2lnbmVkIGNoYXIgbW92bV9zdGFja19zaXplOwotCi0vKiBXaGVuIHNldCwgY29udmVydCBhbGwgImNhbGwiIGluc3RydWN0aW9ucyB0byB0aGlzIHRhcmdldCBpbnRvICJjYWxscyIKLSAgIGluc3RydWN0aW9ucy4gICovCi0jZGVmaW5lIE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTIDB4MQotCi0vKiBVc2VkIHRvIG1hcmsgZnVuY3Rpb25zIHdoaWNoIGhhdmUgaGFkIHJlZHVuZGFudCBwYXJ0cyBvZiB0aGVpcgotICAgcHJvbG9ndWUgZGVsZXRlZC4gICovCi0jZGVmaW5lIE1OMTAzMDBfREVMRVRFRF9QUk9MT0dVRV9CWVRFUyAweDIKLSAgdW5zaWduZWQgY2hhciBmbGFnczsKLX07Ci0KLS8qIFdlIGRlcml2ZSBhIGhhc2ggdGFibGUgZnJvbSB0aGUgbWFpbiBlbGYgbGlua2VyIGhhc2ggdGFibGUgc28KLSAgIHdlIGNhbiBzdG9yZSBzdGF0ZSB2YXJpYWJsZXMgYW5kIGEgc2Vjb25kYXJ5IGhhc2ggdGFibGUgd2l0aG91dAotICAgcmVzb3J0aW5nIHRvIGdsb2JhbCB2YXJpYWJsZXMuICAqLwotc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBtYWluIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIEEgaGFzaCB0YWJsZSBmb3Igc3RhdGljIGZ1bmN0aW9ucy4gIFdlIGNvdWxkIGRlcml2ZSBhIG5ldyBoYXNoIHRhYmxlCi0gICAgIGluc3RlYWQgb2YgdXNpbmcgdGhlIGZ1bGwgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUgaWYgd2Ugd2FudGVkCi0gICAgIHRvIHNhdmUgc29tZSBtZW1vcnkuICAqLwotICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUgKnN0YXRpY19oYXNoX3RhYmxlOwotCi0gIC8qIFJhbmRvbSBsaW5rZXIgc3RhdGUgZmxhZ3MuICAqLwotI2RlZmluZSBNTjEwMzAwX0hBU0hfRU5UUklFU19JTklUSUFMSVpFRCAweDEKLSAgY2hhciBmbGFnczsKLX07Ci0KLS8qIEZvciBNTjEwMzAwIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotLyogR2V0IHRoZSBNTjEwMzAwIEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgZWxmMzJfbW4xMDMwMF9oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLSNkZWZpbmUgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBtbjEwMzAwX2luZm9fdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtbjEwMzAwX2VsZl9jaGVja19yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGFzZWN0aW9uICptbjEwMzAwX2VsZl9nY19tYXJrX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotc3RhdGljIGJvb2xlYW4gbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIG1uMTAzMDBfZWxmX3N5bWJvbF9hZGRyZXNzX3AKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIEVsZjMyX0V4dGVybmFsX1N5bSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9tbjEwMzAwX2ZpbmlzaF9oYXNoX3RhYmxlX2VudHJ5Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvbXB1dGVfZnVuY3Rpb25faW5mbwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci0KLS8qIFdlIGhhdmUgdG8gdXNlIFJFTEEgaW5zdHJ1Y3Rpb25zIHNpbmNlIG1kX2FwcGx5X2ZpeDMgaW4gdGhlIGFzc2VtYmxlcgotICAgZG9lcyBhYnNvbHV0ZWx5IG5vdGhpbmcuICAqLwotI2RlZmluZSBVU0VfUkVMQQotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9tbjEwMzAwX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBEdW1teSByZWxvY2F0aW9uLiAgRG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF9OT05FLAotCSAwLAotCSAyLAotCSAxNiwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAzMDBfTk9ORSIsCi0JIGZhbHNlLAotCSAwLAotCSAwLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDMyIGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAzMDBfMzIsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF8zMiIsCi0JIGZhbHNlLAotCSAweGZmZmZmZmZmLAotCSAweGZmZmZmZmZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDE2IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAzMDBfMTYsCi0JIDAsCi0JIDEsCi0JIDE2LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF8xNiIsCi0JIGZhbHNlLAotCSAweGZmZmYsCi0JIDB4ZmZmZiwKLQkgZmFsc2UpLAotICAvKiBTdGFuZGFyZCA4IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAzMDBfOCwKLQkgMCwKLQkgMCwKLQkgOCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAzMDBfOCIsCi0JIGZhbHNlLAotCSAweGZmLAotCSAweGZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDMyYml0IHBjLXJlbGF0aXZlIHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF9QQ1JFTDMyLAotCSAwLAotCSAyLAotCSAzMiwKLQkgdHJ1ZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF9QQ1JFTDMyIiwKLQkgZmFsc2UsCi0JIDB4ZmZmZmZmZmYsCi0JIDB4ZmZmZmZmZmYsCi0JIHRydWUpLAotICAvKiBTdGFuZGFyZCAxNmJpdCBwYy1yZWxhdGl2ZSByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAzMDBfUENSRUwxNiwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAzMDBfUENSRUwxNiIsCi0JIGZhbHNlLAotCSAweGZmZmYsCi0JIDB4ZmZmZiwKLQkgdHJ1ZSksCi0gIC8qIFN0YW5kYXJkIDggcGMtcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMzAwX1BDUkVMOCwKLQkgMCwKLQkgMCwKLQkgOCwKLQkgdHJ1ZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF9QQ1JFTDgiLAotCSBmYWxzZSwKLQkgMHhmZiwKLQkgMHhmZiwKLQkgdHJ1ZSksCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01OMTAzMDBfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9NTjEwMzAwX0dOVV9WVEVOVFJZLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01OMTAzMDBfR05VX1ZURU5UUlkiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU3RhbmRhcmQgMjQgYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF8yNCwKLQkgMCwKLQkgMiwKLQkgMjQsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwXzI0IiwKLQkgZmFsc2UsCi0JIDB4ZmZmZmZmLAotCSAweGZmZmZmZiwKLQkgZmFsc2UpLAotCi19OwotCi1zdHJ1Y3QgbW4xMDMwMF9yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9yZWxvY19tYXAgbW4xMDMwMF9yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfTU4xMDMwMF9OT05FLCB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9NTjEwMzAwXzMyLCB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl9NTjEwMzAwXzE2LCB9LAotICB7IEJGRF9SRUxPQ184LCBSX01OMTAzMDBfOCwgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfTU4xMDMwMF9QQ1JFTDMyLCB9LAotICB7IEJGRF9SRUxPQ18xNl9QQ1JFTCwgUl9NTjEwMzAwX1BDUkVMMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzhfUENSRUwsIFJfTU4xMDMwMF9QQ1JFTDgsIH0sCi0gIHsgQkZEX1JFTE9DXzI0LCBSX01OMTAzMDBfMjQsIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX01OMTAzMDBfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksIFJfTU4xMDMwMF9HTlVfVlRFTlRSWSB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgICBpIDwgc2l6ZW9mIChtbjEwMzAwX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBtbjEwMzAwX3JlbG9jX21hcCk7Ci0gICAgICAgaSsrKQotICAgIHsKLSAgICAgIGlmIChtbjEwMzAwX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZlbGZfbW4xMDMwMF9ob3d0b190YWJsZVttbjEwMzAwX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gTU4xMDMwMCBFTEYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbW4xMDMwMF9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9NTjEwMzAwX01BWCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX21uMTAzMDBfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tbjEwMzAwX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzLCAqKnN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQkvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0JICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQ6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQkvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLQkgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfTU4xMDMwMF9HTlVfVlRFTlRSWToKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1uMTAzMDBfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSX01OMTAzMDBfR05VX1ZUSU5IRVJJVDoKLQljYXNlIFJfTU4xMDMwMF9HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0JICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotCXsKLQkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogUGVyZm9ybSBhIHJlbG9jYXRpb24gYXMgcGFydCBvZiBhIGZpbmFsIGxpbmsuICAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbW4xMDMwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIG9mZnNldCwgdmFsdWUsCi0JCQkJIGFkZGVuZCwgaW5mbywgc3ltX3NlYywgaXNfbG9jYWwpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLSAgICAgaW50IGlzX2xvY2FsOwotewotICB1bnNpZ25lZCBsb25nIHJfdHlwZSA9IGhvd3RvLT50eXBlOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBjb250ZW50cyArIG9mZnNldDsKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX01OMTAzMDBfTk9ORToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF8zMjoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF8yNDoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHg3ZmZmZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHg4MDAwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlICYgMHhmZiwgaGl0X2RhdGEpOwotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsICh2YWx1ZSA+PiA4KSAmIDB4ZmYsIGhpdF9kYXRhICsgMSk7Ci0gICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgKHZhbHVlID4+IDE2KSAmIDB4ZmYsIGhpdF9kYXRhICsgMik7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAzMDBfMTY6Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4N2ZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDgwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwXzg6Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4N2YgfHwgKGxvbmcpdmFsdWUgPCAtMHg4MCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF9QQ1JFTDg6Ci0gICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgdmFsdWUgLT0gb2Zmc2V0OwotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweGZmIHx8IChsb25nKXZhbHVlIDwgLTB4MTAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwX1BDUkVMMTY6Ci0gICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgdmFsdWUgLT0gb2Zmc2V0OwotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweGZmZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHgxMDAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAzMDBfUENSRUwzMjoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSBvZmZzZXQ7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUOgotICAgIGNhc2UgUl9NTjEwMzAwX0dOVV9WVEVOVFJZOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci19Ci0KLQwKLS8qIFJlbG9jYXRlIGFuIE1OMTAzMDAgRUxGIHNlY3Rpb24uICAqLwotc3RhdGljIGJvb2xlYW4KLW1uMTAzMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICoqKQotCQkgKGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGhvd3RvID0gZWxmX21uMTAzMDBfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIC8qIEp1c3Qgc2tpcCB0aGUgdnRhYmxlIGdjIHJlbG9jcy4gICovCi0gICAgICBpZiAocl90eXBlID09IFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUCi0JICB8fCByX3R5cGUgPT0gUl9NTjEwMzAwX0dOVV9WVEVOVFJZKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICByID0gbW4xMDMwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkJICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJCSAgIHJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQsCi0JCQkJCSAgIGluZm8sIHNlYywgaCA9PSBOVUxMKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjb25zdCBjaGFyICptc2cgPSAoY29uc3QgY2hhciAqKTA7Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjb21tb25fZXJyb3I6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggaW5pdGlhbGl6aW5nIG9uZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9tbjEwMzAwX2ZpbmlzaF9oYXNoX3RhYmxlX2VudHJ5IChnZW5fZW50cnksIGluX2FyZ3MpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZ2VuX2VudHJ5OwotICAgICBQVFIgaW5fYXJnczsKLXsKLSAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICplbnRyeTsKLSAgdW5zaWduZWQgaW50IGJ5dGVfY291bnQgPSAwOwotCi0gIGVudHJ5ID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKWdlbl9lbnRyeTsKLQotICAvKiBJZiB3ZSBhbHJlYWR5IGtub3cgd2Ugd2FudCB0byBjb252ZXJ0ICJjYWxsIiB0byAiY2FsbHMiIGZvciBjYWxscwotICAgICB0byB0aGlzIHN5bWJvbCwgdGhlbiByZXR1cm4gbm93LiAgKi8KLSAgaWYgKGVudHJ5LT5mbGFncyA9PSBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGVyZSBhcmUgbm8gbmFtZWQgY2FsbHMgdG8gdGhpcyBzeW1ib2wsIG9yIHRoZXJlJ3Mgbm90aGluZyB3ZQotICAgICBjYW4gbW92ZSBmcm9tIHRoZSBmdW5jdGlvbiBpdHNlbGYgaW50byB0aGUgImNhbGwiIGluc3RydWN0aW9uLCB0aGVuCi0gICAgIG5vdGUgdGhhdCBhbGwgImNhbGwiIGluc3RydWN0aW9ucyBzaG91bGQgYmUgY29udmVydGVkIGludG8gImNhbGxzIgotICAgICBpbnN0cnVjdGlvbnMgYW5kIHJldHVybi4gICovCi0gIGlmIChlbnRyeS0+ZGlyZWN0X2NhbGxzID09IDAKLSAgICAgIHx8IChlbnRyeS0+c3RhY2tfc2l6ZSA9PSAwICYmIGVudHJ5LT5tb3ZtX2FyZ3MgPT0gMCkpCi0gICAgewotICAgICAgLyogTWFrZSBhIG5vdGUgdGhhdCB3ZSBzaG91bGQgY29udmVydCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHRvICJjYWxscyIKLQkgaW5zdHJ1Y3Rpb25zIGZvciBjYWxscyB0byB0aGlzIHN5bWJvbC4gICovCi0gICAgICBlbnRyeS0+ZmxhZ3MgfD0gTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogV2UgbWF5IGJlIGFibGUgdG8gbW92ZSBzb21lIGluc3RydWN0aW9ucyBmcm9tIHRoZSBmdW5jdGlvbiBpdHNlbGYgaW50bwotICAgICB0aGUgImNhbGwiIGluc3RydWN0aW9uLiAgQ291bnQgaG93IG1hbnkgYnl0ZXMgd2UgbWlnaHQgYmUgYWJsZSB0bwotICAgICBlbGltaW5hdGUgaW4gdGhlIGZ1bmN0aW9uIGl0c2VsZi4gICovCi0KLSAgLyogQSBtb3ZtIGluc3RydWN0aW9uIGlzIHR3byBieXRlcy4gICovCi0gIGlmIChlbnRyeS0+bW92bV9hcmdzKQotICAgIGJ5dGVfY291bnQgKz0gMjsKLQotICAvKiBDb3VudCB0aGUgaW5zbiB0byBhbGxvY2F0ZSBzdGFjayBzcGFjZSB0b28uICAqLwotICBpZiAoZW50cnktPnN0YWNrX3NpemUgPiAwICYmIGVudHJ5LT5zdGFja19zaXplIDw9IDEyOCkKLSAgICBieXRlX2NvdW50ICs9IDM7Ci0gIGVsc2UgaWYgKGVudHJ5LT5zdGFja19zaXplID4gMCAmJiBlbnRyeS0+c3RhY2tfc2l6ZSA8IDI1NikKLSAgICBieXRlX2NvdW50ICs9IDQ7Ci0KLSAgLyogSWYgdXNpbmcgImNhbGwiIHdpbGwgcmVzdWx0IGluIGxhcmdlciBjb2RlLCB0aGVuIHR1cm4gYWxsCi0gICAgIHRoZSBhc3NvY2lhdGVkICJjYWxsIiBpbnN0cnVjdGlvbnMgaW50byAiY2FsbHMiIGluc3RydXRpb25zLiAgKi8KLSAgaWYgKGJ5dGVfY291bnQgPCBlbnRyeS0+ZGlyZWN0X2NhbGxzKQotICAgIGVudHJ5LT5mbGFncyB8PSBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUzsKLQotICAvKiBUaGlzIHJvdXRpbmUgbmV2ZXIgZmFpbHMuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlbGF4aW5nIGZvciB0aGUgbW4xMDMwMC4KLQotICAgVGhlcmUncyBxdWl0ZSBhIGZldyByZWxheGluZyBvcHBvcnR1bml0ZXMgYXZhaWxhYmxlIG9uIHRoZSBtbjEwMzAwOgotCi0JKiBjYWxsczozMiAtPiBjYWxsczoxNiAJCQkJCSAgIDIgYnl0ZXMKLQkqIGNhbGw6MzIgIC0+IGNhbGw6MTYJCQkJCSAgIDIgYnl0ZXMKLQotCSogY2FsbDozMiAtPiBjYWxsczozMgkJCQkJICAgMSBieXRlCi0JKiBjYWxsOjE2IC0+IGNhbGxzOjE2CQkJCQkgICAxIGJ5dGUKLQkJKiBUaGVzZSBhcmUgZG9uZSBhbnl0aW1lIHVzaW5nICJjYWxscyIgd291bGQgcmVzdWx0Ci0JCWluIHNtYWxsZXIgY29kZSwgb3Igd2hlbiBuZWNlc3NhcnkgdG8gcHJlc2VydmUgdGhlCi0JCW1lYW5pbmcgb2YgdGhlIHByb2dyYW0uCi0KLQkqIGNhbGw6MzIJCQkJCQkgICB2YXJpZXMKLQkqIGNhbGw6MTYKLQkJKiBJbiBzb21lIGNpcmN1bXN0YW5jZXMgd2UgY2FuIG1vdmUgaW5zdHJ1Y3Rpb25zCi0JCWZyb20gYSBmdW5jdGlvbiBwcm9sb2d1ZSBpbnRvIGEgImNhbGwiIGluc3RydWN0aW9uLgotCQlUaGlzIGlzIG9ubHkgZG9uZSBpZiB0aGUgcmVzdWx0aW5nIGNvZGUgaXMgbm8gbGFyZ2VyCi0JCXRoYW4gdGhlIG9yaWdpbmFsIGNvZGUuCi0KLQotCSogam1wOjMyIC0+IGptcDoxNgkJCQkJICAgMiBieXRlcwotCSogam1wOjE2IC0+IGJyYTo4CQkJCQkgICAxIGJ5dGUKLQotCQkqIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBhIGNvbmRpdGlvbmFsIGJyYW5jaAotCQlhcm91bmQgdGhlIGp1bXAvYnJhLCB3ZSBtYXkgYmUgYWJsZSB0byByZXZlcnNlIGl0cyBjb25kaXRpb24KLQkJYW5kIGNoYW5nZSBpdHMgdGFyZ2V0IHRvIHRoZSBqdW1wJ3MgdGFyZ2V0LiAgVGhlIGp1bXAvYnJhCi0JCWNhbiB0aGVuIGJlIGRlbGV0ZWQuCQkJCSAgIDIgYnl0ZXMKLQotCSogbW92IGFiczMyIC0+IG1vdiBhYnMxNgkJCQkgICAxIG9yIDIgYnl0ZXMKLQotCSogTW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggYWNjZXB0IGltbTMyIGNhbiByZWxheCB0byBpbW0xNiAgMSBvciAyIGJ5dGVzCi0JLSBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgaW1tMTYgY2FuIHJlbGF4IHRvIGltbTggICAxIG9yIDIgYnl0ZXMKLQotCSogTW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggYWNjZXB0IGQzMiBjYW4gcmVsYXggdG8gZDE2CSAgIDEgb3IgMiBieXRlcwotCS0gTW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggYWNjZXB0IGQxNiBjYW4gcmVsYXggdG8gZDgJICAgMSBvciAyIGJ5dGVzCi0KLQlXZSBkb24ndCBoYW5kbGUgaW1tMTYtPmltbTggb3IgZDE2LT5kOCBhcyB0aGV5J3JlIHZlcnkgcmFyZQotCWFuZCBzb21ld2hhdCBtb3JlIGRpZmZpY3VsdCB0byBzdXBwb3J0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlYywgbGlua19pbmZvLCBhZ2FpbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9ieXRlICpmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpmcmVlX2V4dHN5bXMgPSBOVUxMOwotICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUgKmhhc2hfdGFibGU7Ci0KLSAgLyogQXNzdW1lIG5vdGhpbmcgY2hhbmdlcy4gICovCi0gICphZ2FpbiA9IGZhbHNlOwotCi0gIC8qIFdlIG5lZWQgYSBwb2ludGVyIHRvIHRoZSBtbjEwMzAwIHNwZWNpZmljIGhhc2ggdGFibGUuICAqLwotICBoYXNoX3RhYmxlID0gZWxmMzJfbW4xMDMwMF9oYXNoX3RhYmxlIChsaW5rX2luZm8pOwotCi0gIC8qIEluaXRpYWxpemUgZmllbGRzIGluIGVhY2ggaGFzaCB0YWJsZSBlbnRyeSB0aGUgZmlyc3QgdGltZSB0aHJvdWdoLiAgKi8KLSAgaWYgKChoYXNoX3RhYmxlLT5mbGFncyAmIE1OMTAzMDBfSEFTSF9FTlRSSUVTX0lOSVRJQUxJWkVEKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZCAqaW5wdXRfYmZkOwotCi0gICAgICAvKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSBpbnB1dCBiZmRzLiAgKi8KLSAgICAgIGZvciAoaW5wdXRfYmZkID0gbGlua19pbmZvLT5pbnB1dF9iZmRzOwotCSAgIGlucHV0X2JmZCAhPSBOVUxMOwotCSAgIGlucHV0X2JmZCA9IGlucHV0X2JmZC0+bGlua19uZXh0KQotCXsKLQkgIGFzZWN0aW9uICpzZWN0aW9uOwotCi0JICAvKiBXZSdyZSBnb2luZyB0byBuZWVkIGFsbCB0aGUgc3ltYm9scyBmb3IgZWFjaCBiZmQuICAqLwotCSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgICAgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLSAgICAgICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLSAgICAgICAgICAgIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotICAgICAgICAgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0gICAgICAgICAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAgICAgICAgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0gICAgICAgICAgICAgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICAgICAgICAgICAgICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGlucHV0X2JmZCkKLSAgICAgICAgICAgICAgICAgICAgICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICAgIH0KLQotCSAgLyogSXRlcmF0ZSBvdmVyIGVhY2ggc2VjdGlvbiBpbiB0aGlzIGJmZC4gICovCi0JICBmb3IgKHNlY3Rpb24gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOwotCSAgICAgICBzZWN0aW9uICE9IE5VTEw7Ci0JICAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCSAgICB7Ci0JICAgICAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpoYXNoOwotCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLQkgICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLQkgICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLQkgICAgICBjaGFyICpuZXdfbmFtZTsKLQkgICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotCi0JICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IG9mIHNlY3Rpb24gY29udGVudHMgaWYgaXQgZXhpc3RzLiAgKi8KLQkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JCWNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgICAgIGVsc2UgaWYgKHNlY3Rpb24tPl9yYXdfc2l6ZSAhPSAwKQotCQl7Ci0JCSAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCQkgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopYmZkX21hbGxvYyAoc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCQkgIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIHNlY3Rpb24sCi0JCQkJCQkgY29udGVudHMsIChmaWxlX3B0cikgMCwKLQkJCQkJCSBzZWN0aW9uLT5fcmF3X3NpemUpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjb250ZW50cyA9IE5VTEw7Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0JCX0KLQotCSAgICAgIC8qIElmIHRoZXJlIGFyZW4ndCBhbnkgcmVsb2NzLCB0aGVuIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gICovCi0JICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotCQkgICYmIHNlY3Rpb24tPnJlbG9jX2NvdW50ICE9IDApCi0JCXsKLQotCQkgIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0JCSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkJCSAgICAgKGlucHV0X2JmZCwgc2VjdGlvbiwgKFBUUikgTlVMTCwKLQkJCQkgICAgICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJCQkgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7Ci0JCSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQkJICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0JCSAgLyogTm93IGV4YW1pbmUgZWFjaCByZWxvY2F0aW9uLiAgKi8KLQkJICBpcmVsID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgIGlyZWxlbmQgPSBpcmVsICsgc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0JCSAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgcl90eXBlOwotCQkgICAgICB1bnNpZ25lZCBsb25nIHJfaW5kZXg7Ci0JCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCQkgICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbyk7Ci0JCSAgICAgIHJfaW5kZXggPSBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKTsKLQotCQkgICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludClSX01OMTAzMDBfTUFYKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgICAgLyogV2UgbmVlZCB0aGUgbmFtZSBhbmQgaGFzaCB0YWJsZSBlbnRyeSBvZiB0aGUgdGFyZ2V0Ci0JCQkgc3ltYm9sISAgKi8KLQkJICAgICAgaGFzaCA9IE5VTEw7Ci0JCSAgICAgIHN5bSA9IE5VTEw7Ci0JCSAgICAgIHN5bV9zZWMgPSBOVUxMOwotCi0JCSAgICAgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkJCXsKLQkJCSAgLyogQSBsb2NhbCBzeW1ib2wuICAqLwotCQkJICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLQkJCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgZXh0c3ltcyArIHJfaW5kZXgsICZpc3ltKTsKLQotCQkJICBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JCQkgICAgc3ltX3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPiAwCi0JCQkJICAgJiYgaXN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JCQkgICAgc3ltX3NlYwotCQkJICAgICAgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICBpc3ltLnN0X3NobmR4KTsKLQkJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQotCQkJICAgIHN5bV9zZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JCQkgICAgc3ltX3NlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0KLQkJCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQkgICBpc3ltLnN0X25hbWUpOwotCi0JCQkgIC8qIElmIGl0IGlzbid0IGEgZnVuY3Rpb24sIHRoZW4gd2UgZG9uJ3QgY2FyZQotCQkJICAgICBhYm91dCBpdC4gICovCi0JCQkgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJICAgICAgJiYgRUxGX1NUX1RZUEUgKGlzeW0uc3RfaW5mbykgIT0gU1RUX0ZVTkMpCi0JCQkgICAgY29udGludWU7Ci0KLQkJCSAgLyogVGFjayBvbiBhbiBJRCBzbyB3ZSBjYW4gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcwotCQkJICAgICBsb2NhbCBzeW1ib2wgaW4gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KLQkJCSAgbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKHN5bV9uYW1lKSArIDEwKTsKLQkJCSAgaWYgKG5ld19uYW1lID09IDApCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJCSAgc3ByaW50ZiAobmV3X25hbWUsICIlc18lMDh4Iiwgc3ltX25hbWUsIChpbnQpc3ltX3NlYyk7Ci0JCQkgIHN5bV9uYW1lID0gbmV3X25hbWU7Ci0KLQkJCSAgaGFzaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJCQkgICBlbGZfbGlua19oYXNoX2xvb2t1cCAoJmhhc2hfdGFibGUtPnN0YXRpY19oYXNoX3RhYmxlLT5yb290LAotCQkJCQkJICAgICAgICAgc3ltX25hbWUsIHRydWUsCi0JCQkJCQkgICAgICAgICB0cnVlLCBmYWxzZSk7Ci0JCQkgIGZyZWUgKG5ld19uYW1lKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICByX2luZGV4IC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0JCQkgIGhhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCQkJICAgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbcl9pbmRleF07Ci0JCQl9Ci0KLQkJICAgICAgLyogSWYgdGhpcyBpcyBub3QgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24sIHRoZW4gd2UKLQkJCSBzaG91bGQgY29udmVydCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHRvICJjYWxscyIKLQkJCSBpbnN0cnVjdGlvbnMuICAqLwotCQkgICAgICBjb2RlID0gYmZkX2dldF84IChpbnB1dF9iZmQsCi0JCQkJCWNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQkJICAgICAgaWYgKGNvZGUgIT0gMHhkZCAmJiBjb2RlICE9IDB4Y2QpCi0JCQloYXNoLT5mbGFncyB8PSBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUzsKLQotCQkgICAgICAvKiBJZiB0aGlzIGlzIGEganVtcC9jYWxsLCB0aGVuIGJ1bXAgdGhlIGRpcmVjdF9jYWxscwotCQkJIGNvdW50ZXIuICBFbHNlIGZvcmNlICJjYWxsIiB0byAiY2FsbHMiIGNvbnZlcnNpb25zLiAgKi8KLQkJICAgICAgaWYgKHJfdHlwZSA9PSBSX01OMTAzMDBfUENSRUwzMgotCQkJICB8fCByX3R5cGUgPT0gUl9NTjEwMzAwX1BDUkVMMTYpCi0JCQloYXNoLT5kaXJlY3RfY2FsbHMrKzsKLQkJICAgICAgZWxzZQotCQkJaGFzaC0+ZmxhZ3MgfD0gTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFM7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIE5vdyBsb29rIGF0IHRoZSBhY3R1YWwgY29udGVudHMgdG8gZ2V0IHRoZSBzdGFjayBzaXplLAotCQkgYW5kIGEgbGlzdCBvZiB3aGF0IHJlZ2lzdGVycyB3ZXJlIHNhdmVkIGluIHRoZSBwcm9sb2d1ZQotCQkgKGllIG1vdm1fYXJncykuICAqLwotCSAgICAgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLQkJewotCi0JCSAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLQkJICBpbnQgaWR4LCBzaG5keDsKLQotCQkgIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgICBzZWN0aW9uKTsKLQotCi0JCSAgLyogTG9vayBhdCBlYWNoIGZ1bmN0aW9uIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uIGFuZAotCQkgICAgIHVwZGF0ZSBpbmZvIGZvciB0aGF0IGZ1bmN0aW9uLiAgKi8KLQkJICBlc3ltID0gZXh0c3ltczsKLQkJICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JCSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCi0JCSAgICB7Ci0JCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotCQkgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgJmlzeW0pOwotCQkgICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCQkJICAmJiBFTEZfU1RfVFlQRSAoaXN5bS5zdF9pbmZvKSA9PSBTVFRfRlVOQykKLQkJCXsKLQkJCSAgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQotCQkJICAgIHN5bV9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID4gMAotCQkJCSAgICYmIGlzeW0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCQkJICAgIHN5bV9zZWMKLQkJCSAgICAgID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgaXN5bS5zdF9zaG5keCk7Ci0JCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0FCUykKLQkJCSAgICBzeW1fc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCQkJICAgIHN5bV9zZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCi0JCQkgIHN5bV9uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCXN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJaXN5bS5zdF9uYW1lKTsKLQotCQkJICAvKiBUYWNrIG9uIGFuIElEIHNvIHdlIGNhbiB1bmlxdWVseSBpZGVudGlmeSB0aGlzCi0JCQkgICAgIGxvY2FsIHN5bWJvbCBpbiB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLwotCQkJICBuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc3ltX25hbWUpICsgMTApOwotCQkJICBpZiAobmV3X25hbWUgPT0gMCkKLQkJCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkJICBzcHJpbnRmIChuZXdfbmFtZSwgIiVzXyUwOHgiLCBzeW1fbmFtZSwgKGludClzeW1fc2VjKTsKLQkJCSAgc3ltX25hbWUgPSBuZXdfbmFtZTsKLQotCQkJICBoYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJCSAgICBlbGZfbGlua19oYXNoX2xvb2t1cCAoJmhhc2hfdGFibGUtPnN0YXRpY19oYXNoX3RhYmxlLT5yb290LAotCQkJCQkJICAgICAgICAgIHN5bV9uYW1lLCB0cnVlLAotCQkJCQkJICAgICAgICAgIHRydWUsIGZhbHNlKTsKLQkJCSAgZnJlZSAobmV3X25hbWUpOwotCQkJICBjb21wdXRlX2Z1bmN0aW9uX2luZm8gKGlucHV0X2JmZCwgaGFzaCwKLQkJCQkJICAgICAgICAgaXN5bS5zdF92YWx1ZSwgY29udGVudHMpOwotCQkJfQotCQkgICAgfQotCi0JCSAgZXN5bSA9IGV4dHN5bXMgKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotCQkgIGVzeW1lbmQgPSBleHRzeW1zICsgKHN5bXRhYl9oZHItPnNoX3NpemUKLQkJCQkgICAgICAgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOwotCQkgIGZvciAoaWR4ID0gMDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaWR4KyspCi0JCSAgICB7Ci0JCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotCQkgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgJmlzeW0pOwotCQkgICAgICBoYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJICAgICAgIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2lkeF07Ci0JCSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JCQkgICYmIEVMRl9TVF9UWVBFIChpc3ltLnN0X2luZm8pID09IFNUVF9GVU5DCi0JCQkgICYmIChoYXNoKS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjdGlvbgotCQkJICAmJiAoKGhhc2gpLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgIHx8IChoYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJCWNvbXB1dGVfZnVuY3Rpb25faW5mbyAoaW5wdXRfYmZkLCBoYXNoLAotCQkJCQkgICAgICAgKGhhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUsCi0JCQkJCSAgICAgICBjb250ZW50cyk7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIENhY2hlIG9yIGZyZWUgYW55IG1lbW9yeSB3ZSBhbGxvY2F0ZWQgZm9yIHRoZSByZWxvY3MuICAqLwotCSAgICAgIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotCQl7Ci0JCSAgZnJlZSAoZnJlZV9yZWxvY3MpOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQkJfQotCi0JICAgICAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIGNvbnRlbnRzLiAgKi8KLQkgICAgICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQkJICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgICAgfQotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCQl9Ci0JICAgIH0KLQotCSAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIHN5bWJvbHMuICAqLwotCSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQkJZnJlZSAoZnJlZV9leHRzeW1zKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IGV4dHN5bXM7Ci0JCX0KLQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBOb3cgaXRlcmF0ZSBvbiBlYWNoIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZSBhbmQgcGVyZm9ybQotCSB0aGUgZmluYWwgaW5pdGlhbGl6YXRpb24gc3RlcHMgb24gZWFjaC4gICovCi0gICAgICBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90cmF2ZXJzZSAoaGFzaF90YWJsZSwKLQkJCQkJZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSwKLQkJCQkJTlVMTCk7Ci0gICAgICBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90cmF2ZXJzZSAoaGFzaF90YWJsZS0+c3RhdGljX2hhc2hfdGFibGUsCi0JCQkJCWVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnksCi0JCQkJCU5VTEwpOwotCi0gICAgICAvKiBBbGwgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQuICAqLwotICAgICAgaGFzaF90YWJsZS0+ZmxhZ3MgfD0gTU4xMDMwMF9IQVNIX0VOVFJJRVNfSU5JVElBTElaRUQ7Ci0KLSAgICAgIC8qIE5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGdvIHRocm91Z2ggZWFjaAotCSBjb2RlIHNlY3Rpb24gYW5kIGRlbGV0ZSBhbnkgcHJvbG9ndWUgaW5zbnMgd2hpY2ggd2lsbCBiZQotCSByZWR1bmRhbnQgYmVjYXVzZSB0aGVpciBvcGVyYXRpb25zIHdpbGwgYmUgcGVyZm9ybWVkIGJ5Ci0JIGEgImNhbGwiIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGZvciAoaW5wdXRfYmZkID0gbGlua19pbmZvLT5pbnB1dF9iZmRzOwotCSAgIGlucHV0X2JmZCAhPSBOVUxMOwotCSAgIGlucHV0X2JmZCA9IGlucHV0X2JmZC0+bGlua19uZXh0KQotCXsKLQkgIGFzZWN0aW9uICpzZWN0aW9uOwotCi0JICAvKiBXZSdyZSBnb2luZyB0byBuZWVkIGFsbCB0aGUgc3ltYm9scyBmb3IgZWFjaCBiZmQuICAqLwotCSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgICAgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLSAgICAgICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLSAgICAgICAgICAgIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotICAgICAgICAgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0gICAgICAgICAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAgICAgICAgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0gICAgICAgICAgICAgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICAgICAgICAgICAgICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGlucHV0X2JmZCkKLSAgICAgICAgICAgICAgICAgICAgICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICAgIH0KLQotCSAgLyogV2FsayBvdmVyIGVhY2ggc2VjdGlvbiBpbiB0aGlzIGJmZC4gICovCi0JICBmb3IgKHNlY3Rpb24gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOwotCSAgICAgICBzZWN0aW9uICE9IE5VTEw7Ci0JICAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaW50IHNobmR4OwotCSAgICAgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0JICAgICAgaW50IGlkeDsKLQotCSAgICAgIC8qIFNraXAgbm9uLWNvZGUgc2VjdGlvbnMgYW5kIGVtcHR5IHNlY3Rpb25zLiAgKi8KLQkgICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpID09IDAgfHwgc2VjdGlvbi0+X3Jhd19zaXplID09IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgaWYgKHNlY3Rpb24tPnJlbG9jX2NvdW50ICE9IDApCi0JCXsKLSAgICAgICAgICAgICAgICAgIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gICAgICAgICAgICAgICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0X2JmZCwgc2VjdGlvbiwgKFBUUikgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLSAgICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAgICAgICAgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgICAgICAgICAgICAgICAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJfQotCi0JICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IG9mIHNlY3Rpb24gY29udGVudHMgaWYgaXQgZXhpc3RzLiAgKi8KLQkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JCWNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkJICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKWJmZF9tYWxsb2MgKHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkJICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBzZWN0aW9uLAotCQkJCQkJIGNvbnRlbnRzLCAoZmlsZV9wdHIpIDAsCi0JCQkJCQkgc2VjdGlvbi0+X3Jhd19zaXplKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQotCSAgICAgIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChpbnB1dF9iZmQsIHNlY3Rpb24pOwotCi0JICAgICAgLyogTm93IGxvb2sgZm9yIGFueSBmdW5jdGlvbiBpbiB0aGlzIHNlY3Rpb24gd2hpY2ggbmVlZHMKLQkJIGluc25zIGRlbGV0ZWQgZnJvbSBpdHMgcHJvbG9ndWUuICAqLwotCSAgICAgIGVzeW0gPSBleHRzeW1zOwotCSAgICAgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgICAgICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLQkJewotCQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQkJICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKnN5bV9oYXNoOwotCQkgIGFzZWN0aW9uICpzeW1fc2VjOwotCQkgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCQkgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0JCSAgY2hhciAqbmV3X25hbWU7Ci0KLQkJICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgJmlzeW0pOwotCi0JCSAgaWYgKGlzeW0uc3Rfc2huZHggIT0gc2huZHgpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkJICAgIHN5bV9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPiAwICYmIGlzeW0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCQkgICAgc3ltX3NlYwotCQkgICAgICA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW0uc3Rfc2huZHgpOwotCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0FCUykKLQkJICAgIHN5bV9zZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkJICAgIHN5bV9zZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCi0JCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQlpc3ltLnN0X25hbWUpOwotCi0JCSAgLyogVGFjayBvbiBhbiBJRCBzbyB3ZSBjYW4gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcwotCQkgICAgIGxvY2FsIHN5bWJvbCBpbiB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLwotCQkgIG5ld19uYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChzeW1fbmFtZSkgKyAxMCk7Ci0JCSAgaWYgKG5ld19uYW1lID09IDApCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzcHJpbnRmIChuZXdfbmFtZSwgIiVzXyUwOHgiLCBzeW1fbmFtZSwgKGludClzeW1fc2VjKTsKLQkJICBzeW1fbmFtZSA9IG5ld19uYW1lOwotCi0JCSAgc3ltX2hhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCQkgICAgZWxmX2xpbmtfaGFzaF9sb29rdXAgKCZoYXNoX3RhYmxlLT5zdGF0aWNfaGFzaF90YWJsZS0+cm9vdCwKLQkJCQkJICAgICAgICAgIHN5bV9uYW1lLCBmYWxzZSwKLQkJCQkJICAgICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0KLQkJICBmcmVlIChuZXdfbmFtZSk7Ci0JCSAgaWYgKHN5bV9oYXNoID09IE5VTEwpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIGlmICghICgoc3ltX2hhc2gpLT5mbGFncyAmIE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTKQotCQkgICAgICAmJiAhICgoc3ltX2hhc2gpLT5mbGFncyAmIE1OMTAzMDBfREVMRVRFRF9QUk9MT0dVRV9CWVRFUykpCi0JCSAgICB7Ci0JCSAgICAgIGludCBieXRlcyA9IDA7Ci0KLQkJICAgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhpbmdzLiAgKi8KLQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKWV4dHN5bXM7Ci0JCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAgICAgLyogQ291bnQgaG93IG1hbnkgYnl0ZXMgd2UncmUgZ29pbmcgdG8gZGVsZXRlLiAgKi8KLQkJICAgICAgaWYgKHN5bV9oYXNoLT5tb3ZtX2FyZ3MpCi0JCQlieXRlcyArPSAyOwotCi0JCSAgICAgIGlmIChzeW1faGFzaC0+c3RhY2tfc2l6ZSAmJiBzeW1faGFzaC0+c3RhY2tfc2l6ZSA8PSAxMjgpCi0JCQlieXRlcyArPSAzOwotCQkgICAgICBlbHNlIGlmIChzeW1faGFzaC0+c3RhY2tfc2l6ZQotCQkJICAgICAgICYmIHN5bV9oYXNoLT5zdGFja19zaXplIDwgMjU2KQotCQkJYnl0ZXMgKz0gNDsKLQotCQkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgZGVsZXRlZCBwcm9sb2d1ZSBieXRlcyBmb3IgdGhpcwotCQkJIGZ1bmN0aW9uLiAgKi8KLQkJICAgICAgc3ltX2hhc2gtPmZsYWdzIHw9IE1OMTAzMDBfREVMRVRFRF9QUk9MT0dVRV9CWVRFUzsKLQotCQkgICAgICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KLQkJICAgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGlucHV0X2JmZCwKLQkJCQkJCQkgICBzZWN0aW9uLAotCQkJCQkJCSAgIGlzeW0uc3RfdmFsdWUsCi0JCQkJCQkJICAgYnl0ZXMpKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgICAgLyogU29tZXRoaW5nIGNoYW5nZWQuICBOb3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQKLQkJCSBtYXkgbGVhZCB0byBtb3JlIHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMuICAqLwotCQkgICAgICAqYWdhaW4gPSB0cnVlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBMb29rIGZvciBhbnkgZ2xvYmFsIGZ1bmN0aW9ucyBpbiB0aGlzIHNlY3Rpb24gd2hpY2gKLQkJIG5lZWQgaW5zbnMgZGVsZXRlZCBmcm9tIHRoZWlyIHByb2xvZ3Vlcy4gICovCi0JICAgICAgZXN5bSA9IGV4dHN5bXMgKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgICAgIGVzeW1lbmQgPSBleHRzeW1zICsgKHN5bXRhYl9oZHItPnNoX3NpemUKLQkJCQkgICAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSk7Ci0JICAgICAgZm9yIChpZHggPSAwOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrLCBpZHgrKykKLQkJewotCQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQkJICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKnN5bV9oYXNoOwotCi0JCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsIGVzeW0sICZpc3ltKTsKLQkJICBzeW1faGFzaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJCSAgICAgICAoZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaWR4XSk7Ci0JCSAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkJICAgICAgJiYgKHN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjdGlvbgotCQkgICAgICAmJiAhICgoc3ltX2hhc2gpLT5mbGFncyAmIE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTKQotCQkgICAgICAmJiAhICgoc3ltX2hhc2gpLT5mbGFncyAmIE1OMTAzMDBfREVMRVRFRF9QUk9MT0dVRV9CWVRFUykpCi0JCSAgICB7Ci0JCSAgICAgIGludCBieXRlcyA9IDA7Ci0KLQkJICAgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhpbmdzLiAgKi8KLQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKWV4dHN5bXM7Ci0JCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAgICAgLyogQ291bnQgaG93IG1hbnkgYnl0ZXMgd2UncmUgZ29pbmcgdG8gZGVsZXRlLiAgKi8KLQkJICAgICAgaWYgKHN5bV9oYXNoLT5tb3ZtX2FyZ3MpCi0JCQlieXRlcyArPSAyOwotCi0JCSAgICAgIGlmIChzeW1faGFzaC0+c3RhY2tfc2l6ZSAmJiBzeW1faGFzaC0+c3RhY2tfc2l6ZSA8PSAxMjgpCi0JCQlieXRlcyArPSAzOwotCQkgICAgICBlbHNlIGlmIChzeW1faGFzaC0+c3RhY2tfc2l6ZQotCQkJICAgICAgICYmIHN5bV9oYXNoLT5zdGFja19zaXplIDwgMjU2KQotCQkJYnl0ZXMgKz0gNDsKLQotCQkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgZGVsZXRlZCBwcm9sb2d1ZSBieXRlcyBmb3IgdGhpcwotCQkJIGZ1bmN0aW9uLiAgKi8KLQkJICAgICAgc3ltX2hhc2gtPmZsYWdzIHw9IE1OMTAzMDBfREVMRVRFRF9QUk9MT0dVRV9CWVRFUzsKLQotCQkgICAgICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KLQkJICAgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGlucHV0X2JmZCwKLQkJCQkJCQkgICBzZWN0aW9uLAotCQkJCQkJCSAgIChzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwKLQkJCQkJCQkgICBieXRlcykpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgICAvKiBTb21ldGhpbmcgY2hhbmdlZC4gIE5vdCBzdHJpY3RseSBuZWNlc3NhcnksIGJ1dAotCQkJIG1heSBsZWFkIHRvIG1vcmUgcmVsYXhpbmcgb3Bwb3J0dW5pdGllcy4gICovCi0JCSAgICAgICphZ2FpbiA9IHRydWU7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIENhY2hlIG9yIGZyZWUgYW55IG1lbW9yeSB3ZSBhbGxvY2F0ZWQgZm9yIHRoZSByZWxvY3MuICAqLwotCSAgICAgIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotCQl7Ci0JCSAgZnJlZSAoZnJlZV9yZWxvY3MpOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQkJfQotCi0JICAgICAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIGNvbnRlbnRzLiAgKi8KLQkgICAgICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQkJICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgICAgfQotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCQl9Ci0JICAgIH0KLQotCSAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIHN5bWJvbHMuICAqLwotCSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQkJZnJlZSAoZnJlZV9leHRzeW1zKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IGV4dHN5bXM7Ci0JCX0KLQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLQotCi0gIC8qIChSZSlpbml0aWFsaXplIGZvciB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gc2hvcnRlbmluZy9yZWxheGluZyBwYXNzLiAgKi8KLSAgY29udGVudHMgPSBOVUxMOwotICBleHRzeW1zID0gTlVMTDsKLSAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotICAvKiBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGZvciBhIHJlbG9jYXRlYWJsZSBsaW5rLCBpZgotICAgICB0aGlzIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSByZWxvY3MsIG9yIGlmIHRoaXMgaXMgbm90IGEKLSAgICAgY29kZSBzZWN0aW9uLiAgKi8KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzZWN0aW9uLAotICAgICBpbml0aWFsaXplIHRoZSBjb29rZWQgc2l6ZS4gICovCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotCi0gIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJICAgICAoYWJmZCwgc2VjLCAoUFRSKSBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJICAgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgLyogV2FsayB0aHJvdWdoIHRoZW0gbG9va2luZyBmb3IgcmVsYXhpbmcgb3Bwb3J0dW5pdGllcy4gICovCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBzeW12YWw7Ci0gICAgICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotCi0gICAgICAvKiBJZiB0aGlzIGlzbid0IHNvbWV0aGluZyB0aGF0IGNhbiBiZSByZWxheGVkLCB0aGVuIGlnbm9yZQotCSB0aGlzIHJlbG9jLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMzAwX05PTkUKLQkgIHx8IEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfOAotCSAgfHwgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDMwMF9NQVgpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCSAgICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFJlYWQgdGhpcyBCRkQncyBzeW1ib2xzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JewotCSAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0JICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQkgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JICAgICAgZXh0c3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfc2l6ZSkpOwotCSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JCSAgfHwgKGJmZF9yZWFkIChleHRzeW1zLCAxLCBzeW10YWJfaGRyLT5zaF9zaXplLCBhYmZkKQotCQkgICAgICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGUgcmVsb2MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pIDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0JICBhc2VjdGlvbiAqc3ltX3NlYzsKLQkgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0JICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLQkgIGNoYXIgKm5ld19uYW1lOwotCi0JICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkgICAgJmlzeW0pOwotCi0JICBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JICAgIHN5bV9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA+IDAgJiYgaXN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JICAgIHN5bV9zZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaXN5bS5zdF9zaG5keCk7Ci0JICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0JICAgIHN5bV9zZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCSAgICBzeW1fc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQotCSAgc3ltdmFsID0gKGlzeW0uc3RfdmFsdWUKLQkJICAgICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIHN5bV9uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwKLQkJCQkJCSAgICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkgICAgICBpc3ltLnN0X25hbWUpOwotCi0JICAvKiBUYWNrIG9uIGFuIElEIHNvIHdlIGNhbiB1bmlxdWVseSBpZGVudGlmeSB0aGlzCi0JICAgICBsb2NhbCBzeW1ib2wgaW4gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KLQkgIG5ld19uYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChzeW1fbmFtZSkgKyAxMCk7Ci0JICBpZiAobmV3X25hbWUgPT0gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBzcHJpbnRmIChuZXdfbmFtZSwgIiVzXyUwOHgiLCBzeW1fbmFtZSwgKGludClzeW1fc2VjKTsKLQkgIHN5bV9uYW1lID0gbmV3X25hbWU7Ci0KLQkgIGggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCWVsZl9saW5rX2hhc2hfbG9va3VwICgmaGFzaF90YWJsZS0+c3RhdGljX2hhc2hfdGFibGUtPnJvb3QsCi0JCQkJICAgICAgc3ltX25hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCSAgZnJlZSAobmV3X25hbWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluZHg7Ci0KLQkgIC8qIEFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0JICBpbmR4ID0gRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJKGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XSk7Ci0JICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgYXBwZWFycyB0byBiZSBhIHJlZmVyZW5jZSB0byBhbiB1bmRlZmluZWQKLSAJCXN5bWJvbC4gIEp1c3QgaWdub3JlIGl0LS1pdCB3aWxsIGJlIGNhdWdodCBieSB0aGUKLSAJCXJlZ3VsYXIgcmVsb2MgcHJvY2Vzc2luZy4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc3ltdmFsID0gKGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JfQotCi0gICAgICAvKiBGb3Igc2ltcGxpY2l0eSBvZiBjb2RpbmcsIHdlIGFyZSBnb2luZyB0byBtb2RpZnkgdGhlIHNlY3Rpb24KLQkgY29udGVudHMsIHRoZSBzZWN0aW9uIHJlbG9jcywgYW5kIHRoZSBCRkQgc3ltYm9sIHRhYmxlLiAgV2UKLQkgbXVzdCB0ZWxsIHRoZSByZXN0IG9mIHRoZSBjb2RlIG5vdCB0byBmcmVlIHVwIHRoaXMKLQkgaW5mb3JtYXRpb24uICBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBpbnN0ZWFkIGNyZWF0ZSBhIHRhYmxlCi0JIG9mIGNoYW5nZXMgd2hpY2ggaGF2ZSB0byBiZSBtYWRlLCBhcyBpcyBkb25lIGluIGNvZmYtbWlwcy5jOwotCSB0aGF0IHdvdWxkIGJlIG1vcmUgd29yaywgYnV0IHdvdWxkIHJlcXVpcmUgbGVzcyBtZW1vcnkgd2hlbgotCSB0aGUgbGlua2VyIGlzIHJ1bi4gICovCi0KLSAgICAgIC8qIFRyeSB0byB0dXJuIGEgMzJiaXQgcGMtcmVsYXRpdmUgYnJhbmNoL2NhbGwgaW50byBhIDE2Yml0IHBjLXJlbGF0aXZlCi0JIGJyYW5jaC9jYWxsLCBhbHNvIGRlYWwgd2l0aCAiY2FsbCIgLT4gImNhbGxzIiBjb252ZXJzaW9ucyBhbmQKLQkgaW5zZXJ0aW9uIG9mIHByb2xvZ3VlIGRhdGEgaW50byAiY2FsbCIgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMzAwX1BDUkVMMzIpCi0JewotCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKLQotCSAgLyogSWYgd2UndmUgZ290IGEgImNhbGwiIGluc3RydWN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgdHVybmVkCi0JICAgICBpbnRvIGEgImNhbGxzIiBpbnN0cnVjdGlvbiwgZG8gc28gbm93LiAgSXQgc2F2ZXMgYSBieXRlLiAgKi8KLQkgIGlmIChoICYmIChoLT5mbGFncyAmIE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTKSkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICAvKiBNYWtlIHN1cmUgd2UncmUgd29ya2luZyB3aXRoIGEgImNhbGwiIGluc3RydWN0aW9uISAgKi8KLQkgICAgICBpZiAoY29kZSA9PSAweGRkKQotCQl7Ci0JCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywKLQkJICAgICBldGMuICAqLwotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmYywgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmZiwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0KLQkJICAvKiBGaXggaXJlbC0+cl9vZmZzZXQgYW5kIGlyZWwtPnJfYWRkZW5kLiAgKi8KLQkJICBpcmVsLT5yX29mZnNldCArPSAxOwotCQkgIGlyZWwtPnJfYWRkZW5kICs9IDE7Ci0KLQkJICAvKiBEZWxldGUgb25lIGJ5dGUgb2YgZGF0YS4gICovCi0JCSAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCSAgICAgICBpcmVsLT5yX29mZnNldCArIDMsIDEpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgKmFnYWluID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChoKQotCSAgICB7Ci0JICAgICAgLyogV2UndmUgZ290IGEgImNhbGwiIGluc3RydWN0aW9uIHdoaWNoIG5lZWRzIHNvbWUgZGF0YQotCQkgZnJvbSB0YXJnZXQgZnVuY3Rpb24gZmlsbGVkIGluLiAgKi8KLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgLyogSW5zZXJ0IGRhdGEgZnJvbSB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGludG8gdGhlICJjYWxsIgotCQkgaW5zdHJ1Y3Rpb24gaWYgbmVlZGVkLiAgKi8KLQkgICAgICBpZiAoY29kZSA9PSAweGRkKQotCQl7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBoLT5tb3ZtX2FyZ3MsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyA0KTsKLQkJICBiZmRfcHV0XzggKGFiZmQsIGgtPnN0YWNrX3NpemUgKyBoLT5tb3ZtX3N0YWNrX3NpemUsCi0JCQkgICAgIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyA1KTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIERlYWwgd2l0aCBwYy1yZWxhdGl2ZSBndW5rLiAgKi8KLQkgIHZhbHVlIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgLT0gaXJlbC0+cl9vZmZzZXQ7Ci0JICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLQotCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLCBub3RlIHRoZSBoaWdoIHZhbHVlIGlzCi0JICAgICAweDdmZmYgKyAyIGFzIHRoZSB0YXJnZXQgd2lsbCBiZSB0d28gYnl0ZXMgY2xvc2VyIGlmIHdlIGFyZQotCSAgICAgYWJsZSB0byByZWxheC4gICovCi0JICBpZiAoKGxvbmcpdmFsdWUgPCAweDgwMDEgJiYgKGxvbmcpdmFsdWUgPiAtMHg4MDAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIGlmIChjb2RlICE9IDB4ZGMgJiYgY29kZSAhPSAweGRkICYmIGNvZGUgIT0gMHhmZikKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JICAgICAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGlmIChjb2RlID09IDB4ZGMpCi0JCWJmZF9wdXRfOCAoYWJmZCwgMHhjYywgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCSAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMHhkZCkKLQkJYmZkX3B1dF84IChhYmZkLCAweGNkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JICAgICAgZWxzZSBpZiAoY29kZSA9PSAweGZmKQotCQliZmRfcHV0XzggKGFiZmQsIDB4ZmEsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCSAgICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfTU4xMDMwMF9QQ1JFTDE2KTsKLQotCSAgICAgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JICAgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCSAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JICAgICAgKmFnYWluID0gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogVHJ5IHRvIHR1cm4gYSAxNmJpdCBwYy1yZWxhdGl2ZSBicmFuY2ggaW50byBhIDhiaXQgcGMtcmVsYXRpdmUKLQkgYnJhbmNoLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMzAwX1BDUkVMMTYpCi0JewotCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKLQotCSAgLyogSWYgd2UndmUgZ290IGEgImNhbGwiIGluc3RydWN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgdHVybmVkCi0JICAgICBpbnRvIGEgImNhbGxzIiBpbnN0cnVjdGlvbiwgZG8gc28gbm93LiAgSXQgc2F2ZXMgYSBieXRlLiAgKi8KLQkgIGlmIChoICYmIChoLT5mbGFncyAmIE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTKSkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICAvKiBNYWtlIHN1cmUgd2UncmUgd29ya2luZyB3aXRoIGEgImNhbGwiIGluc3RydWN0aW9uISAgKi8KLQkgICAgICBpZiAoY29kZSA9PSAweGNkKQotCQl7Ci0JCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywKLQkJICAgICBldGMuICAqLwotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmYSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmZiwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0KLQkJICAvKiBGaXggaXJlbC0+cl9vZmZzZXQgYW5kIGlyZWwtPnJfYWRkZW5kLiAgKi8KLQkJICBpcmVsLT5yX29mZnNldCArPSAxOwotCQkgIGlyZWwtPnJfYWRkZW5kICs9IDE7Ci0KLQkJICAvKiBEZWxldGUgb25lIGJ5dGUgb2YgZGF0YS4gICovCi0JCSAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCSAgICAgICBpcmVsLT5yX29mZnNldCArIDEsIDEpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgKmFnYWluID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChoKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIC8qIEluc2VydCBkYXRhIGZyb20gdGhlIHRhcmdldCBmdW5jdGlvbiBpbnRvIHRoZSAiY2FsbCIKLQkJIGluc3RydWN0aW9uIGlmIG5lZWRlZC4gICovCi0JICAgICAgaWYgKGNvZGUgPT0gMHhjZCkKLQkJewotCQkgIGJmZF9wdXRfOCAoYWJmZCwgaC0+bW92bV9hcmdzLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgMik7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBoLT5zdGFja19zaXplICsgaC0+bW92bV9zdGFja19zaXplLAotCQkJICAgICBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgMyk7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBEZWFsIHdpdGggcGMtcmVsYXRpdmUgZ3Vuay4gICovCi0JICB2YWx1ZSAtPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIHZhbHVlIC09IGlyZWwtPnJfb2Zmc2V0OwotCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgdmFsdWUgd2lsbCBmaXQgaW4gOCBiaXRzLCBub3RlIHRoZSBoaWdoIHZhbHVlIGlzCi0JICAgICAweDdmICsgMSBhcyB0aGUgdGFyZ2V0IHdpbGwgYmUgb25lIGJ5dGVzIGNsb3NlciBpZiB3ZSBhcmUKLQkgICAgIGFibGUgdG8gcmVsYXguICAqLwotCSAgaWYgKChsb25nKXZhbHVlIDwgMHg4MCAmJiAobG9uZyl2YWx1ZSA+IC0weDgwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIGlmIChjb2RlICE9IDB4Y2MpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCSAgICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCSAgICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIDB4Y2EsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfTU4xMDMwMF9QQ1JFTDgpOwotCi0JICAgICAgLyogRGVsZXRlIG9uZSBieXRlIG9mIGRhdGEuICAqLwotCSAgICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICBpcmVsLT5yX29mZnNldCArIDEsIDEpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCSAgICAgICphZ2FpbiA9IHRydWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRyeSB0byBlbGltaW5hdGUgYW4gdW5jb25kaXRpb25hbCA4IGJpdCBwYy1yZWxhdGl2ZSBicmFuY2gKLQkgd2hpY2ggaW1tZWRpYXRlbHkgZm9sbG93cyBhIGNvbmRpdGlvbmFsIDggYml0IHBjLXJlbGF0aXZlCi0JIGJyYW5jaCBhcm91bmQgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoLgotCi0JICAgIG9yaWdpbmFsOgkJbmV3OgotCSAgICBiQ0MgbGFiMQkJYkNDJyBsYWIyCi0JICAgIGJyYSBsYWIyCi0JICAgbGFiMToJICAgICAgIGxhYjE6Ci0KLQotCSBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgYkNDIGNhbid0IHJlYWNoIGxhYjIgYXQgYXNzZW1ibHkgdGltZSwKLQkgYnV0IGR1ZSB0byBvdGhlciByZWxheGF0aW9ucyBpdCBjYW4gcmVhY2ggYXQgbGluayB0aW1lLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMzAwX1BDUkVMOCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSAqbnJlbDsKLQkgIGJmZF92bWEgdmFsdWUgPSBzeW12YWw7Ci0JICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgIC8qIERlYWwgd2l0aCBwYy1yZWxhdGl2ZSBndW5rLiAgKi8KLQkgIHZhbHVlIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgLT0gaXJlbC0+cl9vZmZzZXQ7Ci0JICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLQotCSAgLyogRG8gbm90aGluZyBpZiB0aGlzIHJlbG9jIGlzIHRoZSBsYXN0IGJ5dGUgaW4gdGhlIHNlY3Rpb24uICAqLwotCSAgaWYgKGlyZWwtPnJfb2Zmc2V0ID09IHNlYy0+X2Nvb2tlZF9zaXplKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogU2VlIGlmIHRoZSBuZXh0IGluc3RydWN0aW9uIGlzIGFuIHVuY29uZGl0aW9uYWwgcGMtcmVsYXRpdmUKLQkgICAgIGJyYW5jaCwgbW9yZSBvZnRlbiB0aGFuIG5vdCB0aGlzIHRlc3Qgd2lsbCBmYWlsLCBzbyB3ZQotCSAgICAgdGVzdCBpdCBmaXJzdCB0byBzcGVlZCB0aGluZ3MgdXAuICAqLwotCSAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDEpOwotCSAgaWYgKGNvZGUgIT0gMHhjYSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEFsc28gbWFrZSBzdXJlIHRoZSBuZXh0IHJlbG9jYXRpb24gYXBwbGllcyB0byB0aGUgbmV4dAotCSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoYXQgaXQncyBhIHBjLXJlbGF0aXZlIDggYml0IGJyYW5jaC4gICovCi0JICBucmVsID0gaXJlbCArIDE7Ci0JICBpZiAobnJlbCA9PSBpcmVsZW5kCi0JICAgICAgfHwgaXJlbC0+cl9vZmZzZXQgKyAyICE9IG5yZWwtPnJfb2Zmc2V0Ci0JICAgICAgfHwgRUxGMzJfUl9UWVBFIChucmVsLT5yX2luZm8pICE9IChpbnQpIFJfTU4xMDMwMF9QQ1JFTDgpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBNYWtlIHN1cmUgb3VyIGRlc3RpbmF0aW9uIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlCi0JICAgICB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0JICBpZiAoc3ltdmFsICE9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSArIGlyZWwtPnJfb2Zmc2V0ICsgMykpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBOb3cgbWFrZSBzdXJlIHdlIGFyZSBhIGNvbmRpdGlvbmFsIGJyYW5jaC4gIFRoaXMgbWF5IG5vdAotCSAgICAgYmUgbmVjZXNzYXJ5LCBidXQgd2h5IHRha2UgdGhlIGNoYW5jZS4KLQotCSAgICAgTm90ZSB0aGVzZSBjaGVja3MgYXNzdW1lIHRoYXQgUl9NTjEwMzAwX1BDUkVMOCByZWxvY3MKLQkgICAgIG9ubHkgb2NjdXIgb24gYkNDIGFuZCBiQ0N4IGluc25zLiAgSWYgdGhleSBvY2N1cmVkCi0JICAgICBlbHNld2hlcmUsIHdlJ2QgbmVlZCB0byBrbm93IHRoZSBzdGFydCBvZiB0aGlzIGluc24KLQkgICAgIGZvciB0aGlzIGNoZWNrIHRvIGJlIGFjY3VyYXRlLiAgKi8KLQkgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQkgIGlmIChjb2RlICE9IDB4YzAgJiYgY29kZSAhPSAweGMxICYmIGNvZGUgIT0gMHhjMgotCSAgICAgICYmIGNvZGUgIT0gMHhjMyAmJiBjb2RlICE9IDB4YzQgJiYgY29kZSAhPSAweGM1Ci0JICAgICAgJiYgY29kZSAhPSAweGM2ICYmIGNvZGUgIT0gMHhjNyAmJiBjb2RlICE9IDB4YzgKLQkgICAgICAmJiBjb2RlICE9IDB4YzkgJiYgY29kZSAhPSAweGU4ICYmIGNvZGUgIT0gMHhlOQotCSAgICAgICYmIGNvZGUgIT0gMHhlYSAmJiBjb2RlICE9IDB4ZWIpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBXZSBhbHNvIGhhdmUgdG8gYmUgc3VyZSB0aGVyZSBpcyBubyBzeW1ib2wvbGFiZWwKLQkgICAgIGF0IHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0JICBpZiAobW4xMDMwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcCAoYWJmZCwgc2VjLCBleHRzeW1zLAotCQkJCQkgICAgaXJlbC0+cl9vZmZzZXQgKyAxKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkgIC8qIFJldmVyc2UgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZmlyc3QgYnJhbmNoLiAgKi8KLQkgIHN3aXRjaCAoY29kZSkKLQkgICAgewotCSAgICAgIGNhc2UgMHhjODoKLQkJY29kZSA9IDB4Yzk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjOToKLQkJY29kZSA9IDB4Yzg7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjMDoKLQkJY29kZSA9IDB4YzI7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjMjoKLQkJY29kZSA9IDB4YzA7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjMzoKLQkJY29kZSA9IDB4YzE7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjMToKLQkJY29kZSA9IDB4YzM7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjNDoKLQkJY29kZSA9IDB4YzY7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjNjoKLQkJY29kZSA9IDB4YzQ7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjNzoKLQkJY29kZSA9IDB4YzU7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjNToKLQkJY29kZSA9IDB4Yzc7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhlODoKLQkJY29kZSA9IDB4ZTk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHg5ZDoKLQkJY29kZSA9IDB4ZTg7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhlYToKLQkJY29kZSA9IDB4ZWI7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhlYjoKLQkJY29kZSA9IDB4ZWE7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgLyogU2V0IHRoZSByZWxvYyB0eXBlIGFuZCBzeW1ib2wgZm9yIHRoZSBmaXJzdCBicmFuY2gKLQkgICAgIGZyb20gdGhlIHNlY29uZCBicmFuY2guICAqLwotCSAgaXJlbC0+cl9pbmZvID0gbnJlbC0+cl9pbmZvOwotCi0JICAvKiBNYWtlIHRoZSByZWxvYyBmb3IgdGhlIHNlY29uZCBicmFuY2ggYSBudWxsIHJlbG9jLiAgKi8KLQkgIG5yZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKG5yZWwtPnJfaW5mbyksCi0JCQkJICAgICAgIFJfTU4xMDMwMF9OT05FKTsKLQotCSAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCSAgICAgICBpcmVsLT5yX29mZnNldCArIDEsIDIpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JICAqYWdhaW4gPSB0cnVlOwotCX0KLQotCi0gICAgICAvKiBUcnkgdG8gdHVybiBhIDMyYml0IGltbWVkaWF0ZSwgZGlzcGxhY2VtZW50IG9yIGFic29sdXRlIGFkZHJlc3MKLQkgaW50byBhIDE2Yml0IGltbWVkaWF0ZSwgZGlzcGxhY2VtZW50IG9yIGFic29sdXRlIGFkZHJlc3MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfMzIpCi0JewotCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKLQkgIHZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOwotCi0KLQkgIC8qIFNlZSBpZiB0aGUgdmFsdWUgd2lsbCBmaXQgaW4gMTYgYml0cy4KLQkgICAgIFdlIGFsbG93IGFueSAxNmJpdCBtYXRjaCBoZXJlLiAgV2UgcHJ1bmUgdGhvc2Ugd2UgY2FuJ3QKLQkgICAgIGhhbmRsZSBiZWxvdy4gICovCi0JICBpZiAoKGxvbmcpdmFsdWUgPCAweDdmZmYgJiYgKGxvbmcpdmFsdWUgPiAtMHg4MDAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogTW9zdCBpbnNucyB3aGljaCBoYXZlIDMyYml0IG9wZXJhbmRzIGFyZSA2IGJ5dGVzIGxvbmc7Ci0JCSBleGNlcHRpb25zIGFyZSBwY3JlbCBpbnNucyBhbmQgYml0IGluc25zLgotCi0JCSBXZSBoYW5kbGUgcGNyZWwgaW5zbnMgYWJvdmUuICBXZSBkb24ndCBib3RoZXIgdHJ5aW5nCi0JCSB0byBoYW5kbGUgdGhlIGJpdCBpbnNucyBoZXJlLgotCi0JCSBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmVtYWluaW5nIGluc25zIHdpbGwgYmUgMHhmYy4gICovCi0KLQkgICAgICAvKiBHZXQgdGhlIGZpcnN0IG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JICAgICAgaWYgKGNvZGUgIT0gMHhmYykKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBHZXQgdGhlIHNlY29uZCBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+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+bW92bV9zdGFja19zaXplICs9IDggKiA0OwotCi0gICAgfQotCi0gIC8qIE5vdyBsb29rIGZvciB0aGUgdHdvIHN0YWNrIGFkanVzdG1lbnQgdmFyaWFudHMuICAqLwotICBpZiAoYnl0ZTEgPT0gMHhmOCAmJiBieXRlMiA9PSAweGZlKQotICAgIHsKLSAgICAgIGludCB0ZW1wID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGFkZHIgKyAyKTsKLSAgICAgIHRlbXAgPSAoKHRlbXAgJiAweGZmKSBeICh+MHg3ZikpICsgMHg4MDsKLQotICAgICAgaGFzaC0+c3RhY2tfc2l6ZSA9IC10ZW1wOwotICAgIH0KLSAgZWxzZSBpZiAoYnl0ZTEgPT0gMHhmYSAmJiBieXRlMiA9PSAweGZlKQotICAgIHsKLSAgICAgIGludCB0ZW1wID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBhZGRyICsgMik7Ci0gICAgICB0ZW1wID0gKCh0ZW1wICYgMHhmZmZmKSBeICh+MHg3ZmZmKSkgKyAweDgwMDA7Ci0gICAgICB0ZW1wID0gLXRlbXA7Ci0KLSAgICAgIGlmICh0ZW1wIDwgMjU1KQotCWhhc2gtPnN0YWNrX3NpemUgPSB0ZW1wOwotICAgIH0KLQotICAvKiBJZiB0aGUgdG90YWwgc3RhY2sgdG8gYmUgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsIGluc3RydWN0aW9uIGlzIG1vcmUKLSAgICAgdGhhbiAyNTUgYnl0ZXMsIHRoZW4gd2UgY2FuJ3QgcmVtb3ZlIHRoZSBzdGFjayBhZGp1c3RtZW50IGJ5IHVzaW5nCi0gICAgICJjYWxsIiAod2UgbWlnaHQgc3RpbGwgYmUgYWJsZSB0byByZW1vdmUgdGhlICJtb3ZtIiBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChoYXNoLT5zdGFja19zaXplICsgaGFzaC0+bW92bV9zdGFja19zaXplID4gMjU1KQotICAgIGhhc2gtPnN0YWNrX3NpemUgPSAwOwotCi0gIHJldHVybjsKLX0KLQotLyogRGVsZXRlIHNvbWUgYnl0ZXMgZnJvbSBhIHNlY3Rpb24gd2hpbGUgcmVsYXhpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFkZHIsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgaW50IGNvdW50OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOwotICBpbnQgc2huZHgsIGluZGV4OwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhbGlnbjsKLSAgYmZkX3ZtYSB0b2FkZHI7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQotICBzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKTsKLQotICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCi0gIC8qIFRoZSBkZWxldGlvbiBtdXN0IHN0b3AgYXQgdGhlIG5leHQgQUxJR04gcmVsb2MgZm9yIGFuIGFsaWdtZW50Ci0gICAgIHBvd2VyIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgYXJlIGRlbGV0aW5nLiAgKi8KLQotICBpcmVsYWxpZ24gPSBOVUxMOwotICB0b2FkZHIgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotICBpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOwotICBpcmVsZW5kID0gaXJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0KLSAgLyogQWN0dWFsbHkgZGVsZXRlIHRoZSBieXRlcy4gICovCi0gIG1lbW1vdmUgKGNvbnRlbnRzICsgYWRkciwgY29udGVudHMgKyBhZGRyICsgY291bnQsIHRvYWRkciAtIGFkZHIgLSBjb3VudCk7Ci0gIHNlYy0+X2Nvb2tlZF9zaXplIC09IGNvdW50OwotCi0gIC8qIEFkanVzdCBhbGwgdGhlIHJlbG9jcy4gICovCi0gIGZvciAoaXJlbCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICAvKiBHZXQgdGhlIG5ldyByZWxvYyBhZGRyZXNzLiAgKi8KLSAgICAgIGlmICgoaXJlbC0+cl9vZmZzZXQgPiBhZGRyCi0JICAgJiYgaXJlbC0+cl9vZmZzZXQgPCB0b2FkZHIpKQotCWlyZWwtPnJfb2Zmc2V0IC09IGNvdW50OwotICAgIH0KLQotICAvKiBBZGp1c3QgdGhlIGxvY2FsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotCi0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgaXN5bS5zdF92YWx1ZSA+IGFkZHIKLQkgICYmIGlzeW0uc3RfdmFsdWUgPCB0b2FkZHIpCi0JewotCSAgaXN5bS5zdF92YWx1ZSAtPSBjb3VudDsKLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZpc3ltLCBlc3ltKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhZGp1c3QgdGhlIGdsb2JhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXMgKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBlc3ltZW5kID0gZXh0c3ltcyArIChzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKTsKLSAgZm9yIChpbmRleCA9IDA7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyssIGluZGV4KyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLSAgICAgIHN5bV9oYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkgICAoZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZGV4XSk7Ci0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgKChzeW1faGFzaCktPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IChzeW1faGFzaCktPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIChzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uID09IHNlYwotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnZhbHVlID4gYWRkcgotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnZhbHVlIDwgdG9hZGRyKQotCXsKLQkgIChzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi52YWx1ZSAtPSBjb3VudDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiBhIHN5bWJvbCBleGlzdHMgYXQgdGhlIGdpdmVuIGFkZHJlc3MsIGVsc2UgcmV0dXJuCi0gICBmYWxzZS4gICovCi1zdGF0aWMgYm9vbGVhbgotbW4xMDMwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcCAoYWJmZCwgc2VjLCBleHRzeW1zLCBhZGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltczsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgaW50IHNobmR4OwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaCwgKipzeW1faGFzaF9lbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKTsKLQotICAvKiBFeGFtaW5lIGFsbCB0aGUgc3ltYm9scy4gICovCi0gIGVzeW0gPSBleHRzeW1zOwotICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7Ci0KLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiBpc3ltLnN0X3ZhbHVlID09IGFkZHIpCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHN5bV9oYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKikoZWxmX3N5bV9oYXNoZXMgKGFiZmQpKTsKLSAgc3ltX2hhc2hfZW5kID0gKHN5bV9oYXNoCi0JCSAgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKQotCQkgICAgIC0gc3ltdGFiX2hkci0+c2hfaW5mbykpOwotICBmb3IgKDsgc3ltX2hhc2ggPCBzeW1faGFzaF9lbmQ7IHN5bV9oYXNoKyspCi0gICAgewotICAgICAgaWYgKCgoKnN5bV9oYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgKCpzeW1faGFzaCktPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmICgqc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWMKLQkgICYmICgqc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUgPT0gYWRkcikKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogVGhpcyBpcyBhIHZlcnNpb24gb2YgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gICB3aGljaCB1c2VzIG1uMTAzMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotbW4xMDMwMF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCSAgICBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGJmZCAqaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICoqc2VjdGlvbnMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1N5bSAqaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0KLSAgLyogV2Ugb25seSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiByZWxheGluZywgb3Igb2YgaGF2aW5nIGEKLSAgICAgcGFydGljdWxhciBzZXQgb2Ygc2VjdGlvbiBjb250ZW50cywgc3BlY2lhbGx5LiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZQotICAgICAgfHwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJCQkgICAgICAgcmVsb2NhdGVhYmxlLAotCQkJCQkJICAgICAgIHN5bWJvbHMpOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotCi0gIG1lbWNweSAoZGF0YSwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzLAotCSAgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotICBpZiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0gICAgICAmJiBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSAqaXN5bXA7Ci0gICAgICBhc2VjdGlvbiAqKnNlY3BwOwotICAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLQotICAgICAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JZXh0ZXJuYWxfc3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gICAgICBlbHNlCi0JewotCSAgZXh0ZXJuYWxfc3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJICAgICAgICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSk7Ci0JICBpZiAoZXh0ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9zeW1zLCBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSksCi0JCQkgICAgc3ltdGFiX2hkci0+c2hfaW5mbywgaW5wdXRfYmZkKQotCQkgICE9IChzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkJIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIChQVFIpIE5VTEwsCi0JCQkgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCBmYWxzZSkpOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpbnRlcm5hbF9zeW1zID0gKChFbGZfSW50ZXJuYWxfU3ltICopCi0JCSAgICAgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCQkgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICAgICAgaWYgKHNlY3Rpb25zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlzeW1wID0gaW50ZXJuYWxfc3ltczsKLSAgICAgIHNlY3BwID0gc2VjdGlvbnM7Ci0gICAgICBlc3ltID0gZXh0ZXJuYWxfc3ltczsKLSAgICAgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICAgIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgKytlc3ltLCArK2lzeW1wLCArK3NlY3BwKQotCXsKLQkgIGFzZWN0aW9uICppc2VjOwotCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgaXN5bXApOwotCi0JICBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkgICAgaXNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPiAwICYmIGlzeW1wLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JICAgIGlzZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLCBpc3ltcC0+c3Rfc2huZHgpOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9BQlMpCi0JICAgIGlzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JICAgIGlzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2hvIGtub3dzPyAgKi8KLQkgICAgICBpc2VjID0gTlVMTDsKLQkgICAgfQotCi0JICAqc2VjcHAgPSBpc2VjOwotCX0KLQotICAgICAgaWYgKCEgbW4xMDMwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBpbnB1dF9iZmQsCi0JCQkJICAgICBpbnB1dF9zZWN0aW9uLCBkYXRhLCBpbnRlcm5hbF9yZWxvY3MsCi0JCQkJICAgICBpbnRlcm5hbF9zeW1zLCBzZWN0aW9ucykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotCWZyZWUgKHNlY3Rpb25zKTsKLSAgICAgIHNlY3Rpb25zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0JZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBpbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChleHRlcm5hbF9zeW1zICE9IE5VTEwgJiYgc3ltdGFiX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLQlmcmVlIChleHRlcm5hbF9zeW1zKTsKLSAgICAgIGV4dGVybmFsX3N5bXMgPSBOVUxMOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzKQotCWZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gZGF0YTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBOVUxMCi0gICAgICAmJiBpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLSAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHNlY3Rpb25zKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEFzc29ydGVkIGhhc2ggdGFibGUgZnVuY3Rpb25zLiAgKi8KLQotLyogSW5pdGlhbGl6ZSBhbiBlbnRyeSBpbiB0aGUgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGFuIE1OMTAzMDAgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZXQtPmRpcmVjdF9jYWxscyA9IDA7Ci0gICAgICByZXQtPnN0YWNrX3NpemUgPSAwOwotICAgICAgcmV0LT5tb3ZtX3N0YWNrX3NpemUgPSAwOwotICAgICAgcmV0LT5mbGFncyA9IDA7Ci0gICAgICByZXQtPm1vdm1fYXJncyA9IDA7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGFuIG1uMTAzMDAgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT5mbGFncyA9IDA7Ci0gIHJldC0+c3RhdGljX2hhc2hfdGFibGUKLSAgICA9ICgoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlICopCi0gICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0LT5zdGF0aWNfaGFzaF90YWJsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5zdGF0aWNfaGFzaF90YWJsZS0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldC0+c3RhdGljX2hhc2hfdGFibGUpOwotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLXN0YXRpYyBpbnQKLWVsZl9tbjEwMzAwX21hY2ggKGZsYWdzKQotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgc3dpdGNoIChmbGFncyAmIEVGX01OMTAzMDBfTUFDSCkKLSAgICB7Ci0gICAgICBjYXNlIEVfTU4xMDMwMF9NQUNIX01OMTAzMDA6Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gYmZkX21hY2hfbW4xMDMwMDsKLQotICAgIH0KLX0KLQotLyogVGhlIGZpbmFsIHByb2Nlc3NpbmcgZG9uZSBqdXN0IGJlZm9yZSB3cml0aW5nIG91dCBhIE1OMTAzMDAgRUxGIG9iamVjdAotICAgZmlsZS4gIFRoaXMgZ2V0cyB0aGUgTU4xMDMwMCBhcmNoaXRlY3R1cmUgcmlnaHQgYmFzZWQgb24gdGhlIG1hY2hpbmUKLSAgIG51bWJlci4gICovCi0KLS8qQVJHU1VTRUQqLwotdm9pZAotX2JmZF9tbjEwMzAwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKipoZHJwcDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0gICAgewotICAgICAgZGVmYXVsdDoKLSAgICAgIGNhc2UgYmZkX21hY2hfbW4xMDMwMDoKLQl2YWwgPSBFX01OMTAzMDBfTUFDSF9NTjEwMzAwOwotCWJyZWFrOwotCi0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9IH4gKEVGX01OMTAzMDBfTUFDSCk7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IHZhbDsKLX0KLQotYm9vbGVhbgotX2JmZF9tbjEwMzAwX2VsZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9tbjEwMzAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGZfbW4xMDMwMF9tYWNoIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncykpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLQotYm9vbGVhbgotX2JmZF9tbjEwMzAwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfZ2V0X2FyY2ggKG9iZmQpID09IGJmZF9nZXRfYXJjaCAoaWJmZCkKLSAgICAgICYmIGJmZF9nZXRfbWFjaCAob2JmZCkgPCBiZmRfZ2V0X21hY2ggKGliZmQpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfZ2V0X2FyY2ggKGliZmQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9nZXRfbWFjaCAoaWJmZCkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX21uMTAzMDBfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItbW4xMDMwMCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX21uMTAzMDAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfTU4xMDMwMAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQltbjEwMzAwX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQkwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwkxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwltbjEwMzAwX2VsZl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCW1uMTAzMDBfZWxmX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCW1uMTAzMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uCW1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJCW1uMTAzMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotCQkJCWVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotCi0jZGVmaW5lIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyICdfJwotCi0vKiBTbyB3ZSBjYW4gc2V0IGJpdHMgaW4gZV9mbGFncy4gICovCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iZmRfbW4xMDMwMF9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcCAgICAgICAgICAgIF9iZmRfbW4xMDMwMF9lbGZfb2JqZWN0X3AKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iZmRfbW4xMDMwMF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYuYyBiL2JmZC9lbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwNzI4MS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjUwICswLDAgQEAKLS8qIEVMRiBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLQotU0VDVElPTgotCUVMRiBiYWNrZW5kcwotCi0JQkZEIHN1cHBvcnQgZm9yIEVMRiBmb3JtYXRzIGlzIGJlaW5nIHdvcmtlZCBvbi4KLQlDdXJyZW50bHksIHRoZSBiZXN0IHN1cHBvcnRlZCBiYWNrIGVuZHMgYXJlIGZvciBzcGFyYyBhbmQgaTM4NgotCShydW5uaW5nIHN2cjQgb3IgU29sYXJpcyAyKS4KLQotCURvY3VtZW50YXRpb24gb2YgdGhlIGludGVybmFscyBvZiB0aGUgc3VwcG9ydCBjb2RlIHN0aWxsIG5lZWRzCi0JdG8gYmUgd3JpdHRlbi4gIFRoZSBjb2RlIGlzIGNoYW5naW5nIHF1aWNrbHkgZW5vdWdoIHRoYXQgd2UKLQloYXZlbid0IGJvdGhlcmVkIHlldC4KLSAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2RlZmluZSBBUkNIX1NJWkUgMAotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotc3RhdGljIElOTElORSBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptYWtlX21hcHBpbmcKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICoqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gbWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IGVsZl9zb3J0X3NlY3Rpb25zIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gcHJlcF9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzd2FwX291dF9zeW1zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICoqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBjaGFyICplbGZfcmVhZCBQQVJBTVMgKChiZmQgKiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBlbGZfZmFrZV9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBhc3NpZ25fc2VjdGlvbl9udW1iZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgSU5MSU5FIGludCBzeW1faXNfZ2xvYmFsIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tYXBfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJmZF9zaXplX3R5cGUgZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUgUEFSQU1TICgoYmZkICopKTsKLQotLyogU3dhcCB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIGFuZCBvdXQuICBUaGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcwotICAgY3VycmVudGx5IHNpemUgaW5kZXBlbmRlbnQuICBJZiB0aGF0IGV2ZXIgY2hhbmdlcywgdGhpcyBjb2RlIHdpbGwKLSAgIG5lZWQgdG8gbW92ZSBpbnRvIGVsZmNvZGUuaC4gICovCi0KLS8qIFN3YXAgaW4gYSBWZXJkZWYgc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJkZWZfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJkZWYgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1ZlcmRlZiAqZHN0OwotewotICBkc3QtPnZkX3ZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dmRfdmVyc2lvbik7Ci0gIGRzdC0+dmRfZmxhZ3MgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52ZF9mbGFncyk7Ci0gIGRzdC0+dmRfbmR4ICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52ZF9uZHgpOwotICBkc3QtPnZkX2NudCAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dmRfY250KTsKLSAgZHN0LT52ZF9oYXNoICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZkX2hhc2gpOwotICBkc3QtPnZkX2F1eCAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dmRfYXV4KTsKLSAgZHN0LT52ZF9uZXh0ICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZkX25leHQpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcmRlZiBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJkZWYgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1ZlcmRlZiAqZHN0OwotewotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dmRfdmVyc2lvbiwgZHN0LT52ZF92ZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZkX2ZsYWdzLCBkc3QtPnZkX2ZsYWdzKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZkX25keCwgZHN0LT52ZF9uZHgpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dmRfY250LCBkc3QtPnZkX2NudCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZF9oYXNoLCBkc3QtPnZkX2hhc2gpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dmRfYXV4LCBkc3QtPnZkX2F1eCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZF9uZXh0LCBkc3QtPnZkX25leHQpOwotfQotCi0vKiBTd2FwIGluIGEgVmVyZGF1eCBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3ZlcmRhdXhfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJkYXV4ICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICpkc3Q7Ci17Ci0gIGRzdC0+dmRhX25hbWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dmRhX25hbWUpOwotICBkc3QtPnZkYV9uZXh0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZkYV9uZXh0KTsKLX0KLQotLyogU3dhcCBvdXQgYSBWZXJkYXV4IHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJkYXV4ICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZGFfbmFtZSwgZHN0LT52ZGFfbmFtZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZGFfbmV4dCwgZHN0LT52ZGFfbmV4dCk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBWZXJuZWVkIHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVybmVlZF9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKmRzdDsKLXsKLSAgZHN0LT52bl92ZXJzaW9uID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZuX3ZlcnNpb24pOwotICBkc3QtPnZuX2NudCAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dm5fY250KTsKLSAgZHN0LT52bl9maWxlICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZuX2ZpbGUpOwotICBkc3QtPnZuX2F1eCAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5fYXV4KTsKLSAgZHN0LT52bl9uZXh0ICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZuX25leHQpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcm5lZWQgc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1Zlcm5lZWQgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKmRzdDsKLXsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZuX3ZlcnNpb24sIGRzdC0+dm5fdmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52bl9jbnQsIGRzdC0+dm5fY250KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZuX2ZpbGUsIGRzdC0+dm5fZmlsZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52bl9hdXgsIGRzdC0+dm5fYXV4KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZuX25leHQsIGRzdC0+dm5fbmV4dCk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBWZXJuYXV4IHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVybmF1eF9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1Zlcm5hdXggKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1Zlcm5hdXggKmRzdDsKLXsKLSAgZHN0LT52bmFfaGFzaCAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5hX2hhc2gpOwotICBkc3QtPnZuYV9mbGFncyA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52bmFfZmxhZ3MpOwotICBkc3QtPnZuYV9vdGhlciA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52bmFfb3RoZXIpOwotICBkc3QtPnZuYV9uYW1lICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52bmFfbmFtZSk7Ci0gIGRzdC0+dm5hX25leHQgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZuYV9uZXh0KTsKLX0KLQotLyogU3dhcCBvdXQgYSBWZXJuYXV4IHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVybmF1eF9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJuYXV4ICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52bmFfaGFzaCwgZHN0LT52bmFfaGFzaCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52bmFfZmxhZ3MsIGRzdC0+dm5hX2ZsYWdzKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZuYV9vdGhlciwgZHN0LT52bmFfb3RoZXIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dm5hX25hbWUsIGRzdC0+dm5hX25hbWUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dm5hX25leHQsIGRzdC0+dm5hX25leHQpOwotfQotCi0vKiBTd2FwIGluIGEgVmVyc3ltIHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVyc3ltX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfVmVyc3ltICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9WZXJzeW0gKmRzdDsKLXsKLSAgZHN0LT52c192ZXJzID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZzX3ZlcnMpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcnN5bSBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3ZlcnN5bV9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJzeW0gKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1ZlcnN5bSAqZHN0OwotewotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dnNfdmVycywgZHN0LT52c192ZXJzKTsKLX0KLQotLyogU3RhbmRhcmQgRUxGIGhhc2ggZnVuY3Rpb24uICBEbyBub3QgY2hhbmdlIHRoaXMgZnVuY3Rpb247IHlvdSB3aWxsCi0gICBjYXVzZSBpbnZhbGlkIGhhc2ggdGFibGVzIHRvIGJlIGdlbmVyYXRlZC4gICovCi11bnNpZ25lZCBsb25nCi1iZmRfZWxmX2hhc2ggKG5hbWUpCi0gICAgIENPTlNUIHVuc2lnbmVkIGNoYXIgKm5hbWU7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaCA9IDA7Ci0gIHVuc2lnbmVkIGxvbmcgZzsKLSAgaW50IGNoOwotCi0gIHdoaWxlICgoY2ggPSAqbmFtZSsrKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGggPSAoaCA8PCA0KSArIGNoOwotICAgICAgaWYgKChnID0gKGggJiAweGYwMDAwMDAwKSkgIT0gMCkKLQl7Ci0JICBoIF49IGcgPj4gMjQ7Ci0JICAvKiBUaGUgRUxGIEFCSSBzYXlzIGBoICY9IH5nJywgYnV0IHRoaXMgaXMgZXF1aXZhbGVudCBpbgotCSAgICAgdGhpcyBjYXNlIGFuZCBvbiBzb21lIG1hY2hpbmVzIG9uZSBpbnNuIGluc3RlYWQgb2YgdHdvLiAgKi8KLQkgIGggXj0gZzsKLQl9Ci0gICAgfQotICByZXR1cm4gaDsKLX0KLQotLyogUmVhZCBhIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgYXQgYSBzcGVjaWZpZWQgb2Zmc2V0IGluIGFuIEVMRgotICAgZmlsZSwgaW50byBhIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIsIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZQotICAgYnVmZmVyLiAqLwotCi1zdGF0aWMgY2hhciAqCi1lbGZfcmVhZCAoYWJmZCwgb2Zmc2V0LCBzaXplKQotICAgICBiZmQgKiBhYmZkOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIGNoYXIgKmJ1ZjsKLQotICBpZiAoKGJ1ZiA9IGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSkpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgYnVmLCBzaXplLCAxLCBhYmZkKSAhPSBzaXplKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZXR1cm4gYnVmOwotfQotCi1ib29sZWFuCi1iZmRfZWxmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICAvKiB0aGlzIGp1c3QgZG9lcyBpbml0aWFsaXphdGlvbiAqLwotICAvKiBjb2ZmX21rb2JqZWN0IHphbGxvYydzIHNwYWNlIGZvciB0ZGF0YS5jb2ZmX29ial9kYXRhIC4uLiAqLwotICBlbGZfdGRhdGEgKGFiZmQpID0gKHN0cnVjdCBlbGZfb2JqX3RkYXRhICopCi0gICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX29ial90ZGF0YSkpOwotICBpZiAoZWxmX3RkYXRhIChhYmZkKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgLyogc2luY2UgZXZlcnl0aGluZyBpcyBkb25lIGF0IGNsb3NlIHRpbWUsIGRvIHdlIG5lZWQgYW55Ci0gICAgIGluaXRpYWxpemF0aW9uPyAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1iZmRfZWxmX21rY29yZWZpbGUgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIC8qIEkgdGhpbmsgdGhpcyBjYW4gYmUgZG9uZSBqdXN0IGxpa2UgYW4gb2JqZWN0IGZpbGUuICovCi0gIHJldHVybiBiZmRfZWxmX21rb2JqZWN0IChhYmZkKTsKLX0KLQotY2hhciAqCi1iZmRfZWxmX2dldF9zdHJfc2VjdGlvbiAoYWJmZCwgc2hpbmRleCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHNoaW5kZXg7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycDsKLSAgY2hhciAqc2hzdHJ0YWIgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgc2hzdHJ0YWJzaXplOwotCi0gIGlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBpZiAoaV9zaGRycCA9PSAwIHx8IGlfc2hkcnBbc2hpbmRleF0gPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBzaHN0cnRhYiA9IChjaGFyICopIGlfc2hkcnBbc2hpbmRleF0tPmNvbnRlbnRzOwotICBpZiAoc2hzdHJ0YWIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBObyBjYWNoZWQgb25lLCBhdHRlbXB0IHRvIHJlYWQsIGFuZCBjYWNoZSB3aGF0IHdlIHJlYWQuICovCi0gICAgICBvZmZzZXQgPSBpX3NoZHJwW3NoaW5kZXhdLT5zaF9vZmZzZXQ7Ci0gICAgICBzaHN0cnRhYnNpemUgPSBpX3NoZHJwW3NoaW5kZXhdLT5zaF9zaXplOwotICAgICAgc2hzdHJ0YWIgPSBlbGZfcmVhZCAoYWJmZCwgb2Zmc2V0LCBzaHN0cnRhYnNpemUpOwotICAgICAgaV9zaGRycFtzaGluZGV4XS0+Y29udGVudHMgPSAoUFRSKSBzaHN0cnRhYjsKLSAgICB9Ci0gIHJldHVybiBzaHN0cnRhYjsKLX0KLQotY2hhciAqCi1iZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBzaGluZGV4LCBzdHJpbmRleCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHNoaW5kZXg7Ci0gICAgIHVuc2lnbmVkIGludCBzdHJpbmRleDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQotICBpZiAoc3RyaW5kZXggPT0gMCkKLSAgICByZXR1cm4gIiI7Ci0KLSAgaGRyID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XTsKLQotICBpZiAoaGRyLT5jb250ZW50cyA9PSBOVUxMCi0gICAgICAmJiBiZmRfZWxmX2dldF9zdHJfc2VjdGlvbiAoYWJmZCwgc2hpbmRleCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoc3RyaW5kZXggPj0gaGRyLT5zaF9zaXplKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogaW52YWxpZCBzdHJpbmcgb2Zmc2V0ICV1ID49ICVsdSBmb3Igc2VjdGlvbiBgJXMnIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzdHJpbmRleCwgKHVuc2lnbmVkIGxvbmcpIGhkci0+c2hfc2l6ZSwKLQkgKChzaGluZGV4ID09IGVsZl9lbGZoZWFkZXIoYWJmZCktPmVfc2hzdHJuZHgKLQkgICAmJiBzdHJpbmRleCA9PSBoZHItPnNoX25hbWUpCi0JICA/ICIuc2hzdHJ0YWIiCi0JICA6IGVsZl9zdHJpbmdfZnJvbV9lbGZfc3RydGFiIChhYmZkLCBoZHItPnNoX25hbWUpKSk7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gIHJldHVybiAoKGNoYXIgKikgaGRyLT5jb250ZW50cykgKyBzdHJpbmRleDsKLX0KLQotLyogTWFrZSBhIEJGRCBzZWN0aW9uIGZyb20gYW4gRUxGIHNlY3Rpb24uICBXZSBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlCi0gICBCRkQgc2VjdGlvbiBpbiB0aGUgYmZkX3NlY3Rpb24gZmllbGQgb2YgdGhlIGhlYWRlci4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqbmV3c2VjdDsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgaWYgKGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChzdHJjbXAgKG5hbWUsCi0JCQkgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uKSkgPT0gMCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbmV3c2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLSAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbmV3c2VjdC0+ZmlsZXBvcyA9IGhkci0+c2hfb2Zmc2V0OwotCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl92bWEgKGFiZmQsIG5ld3NlY3QsIGhkci0+c2hfYWRkcikKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIG5ld3NlY3QsIGhkci0+c2hfc2l6ZSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgbmV3c2VjdCwKLQkJCQkgICAgICBiZmRfbG9nMiAoaGRyLT5zaF9hZGRyYWxpZ24pKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmxhZ3MgPSBTRUNfTk9fRkxBR1M7Ci0gIGlmIChoZHItPnNoX3R5cGUgIT0gU0hUX05PQklUUykKLSAgICBmbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotICBpZiAoKGhkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgICAgaWYgKGhkci0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotCWZsYWdzIHw9IFNFQ19MT0FEOwotICAgIH0KLSAgaWYgKChoZHItPnNoX2ZsYWdzICYgU0hGX1dSSVRFKSA9PSAwKQotICAgIGZsYWdzIHw9IFNFQ19SRUFET05MWTsKLSAgaWYgKChoZHItPnNoX2ZsYWdzICYgU0hGX0VYRUNJTlNUUikgIT0gMCkKLSAgICBmbGFncyB8PSBTRUNfQ09ERTsKLSAgZWxzZSBpZiAoKGZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0gICAgZmxhZ3MgfD0gU0VDX0RBVEE7Ci0KLSAgLyogVGhlIGRlYnVnZ2luZyBzZWN0aW9ucyBhcHBlYXIgdG8gYmUgcmVjb2duaXplZCBvbmx5IGJ5IG5hbWUsIG5vdAotICAgICBhbnkgc29ydCBvZiBmbGFnLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZGVidWciLCBzaXplb2YgIi5kZWJ1ZyIgLSAxKSA9PSAwCi0gICAgICB8fCBzdHJuY21wIChuYW1lLCAiLmxpbmUiLCBzaXplb2YgIi5saW5lIiAtIDEpID09IDAKLSAgICAgIHx8IHN0cm5jbXAgKG5hbWUsICIuc3RhYiIsIHNpemVvZiAiLnN0YWIiIC0gMSkgPT0gMCkKLSAgICBmbGFncyB8PSBTRUNfREVCVUdHSU5HOwotCi0gIC8qIEFzIGEgR05VIGV4dGVuc2lvbiwgaWYgdGhlIG5hbWUgYmVnaW5zIHdpdGggLmdudS5saW5rb25jZSwgd2UKLSAgICAgb25seSBsaW5rIGEgc2luZ2xlIGNvcHkgb2YgdGhlIHNlY3Rpb24uICBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydAotICAgICBnKysuICBnKysgd2lsbCBlbWl0IGVhY2ggdGVtcGxhdGUgZXhwYW5zaW9uIGluIGl0cyBvd24gc2VjdGlvbi4KLSAgICAgVGhlIHN5bWJvbHMgd2lsbCBiZSBkZWZpbmVkIGFzIHdlYWssIHNvIHRoYXQgbXVsdGlwbGUgZGVmaW5pdGlvbnMKLSAgICAgYXJlIHBlcm1pdHRlZC4gIFRoZSBHTlUgbGlua2VyIGV4dGVuc2lvbiBpcyB0byBhY3R1YWxseSBkaXNjYXJkCi0gICAgIGFsbCBidXQgb25lIG9mIHRoZSBzZWN0aW9ucy4gICovCi0gIGlmIChzdHJuY21wIChuYW1lLCAiLmdudS5saW5rb25jZSIsIHNpemVvZiAiLmdudS5saW5rb25jZSIgLSAxKSA9PSAwKQotICAgIGZsYWdzIHw9IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBuZXdzZWN0LCBmbGFncykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgoZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1BoZHIgKnBoZHI7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSBwaGRycyB0byBzZWUgaWYgd2UgbmVlZCB0byBhZGp1c3QgdGhlIGxtYS4KLSAgICAgICAgIElmIGFsbCB0aGUgcF9wYWRkciBmaWVsZHMgYXJlIHplcm8sIHdlIGlnbm9yZSB0aGVtLCBzaW5jZQotICAgICAgICAgc29tZSBFTEYgbGlua2VycyBwcm9kdWNlIHN1Y2ggb3V0cHV0LiAgKi8KLSAgICAgIHBoZHIgPSBlbGZfdGRhdGEgKGFiZmQpLT5waGRyOwotICAgICAgZm9yIChpID0gMDsgaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BobnVtOyBpKyssIHBoZHIrKykKLQl7Ci0JICBpZiAocGhkci0+cF9wYWRkciAhPSAwKQotCSAgICBicmVhazsKLQl9Ci0gICAgICBpZiAoaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BobnVtKQotCXsKLQkgIHBoZHIgPSBlbGZfdGRhdGEgKGFiZmQpLT5waGRyOwotCSAgZm9yIChpID0gMDsgaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BobnVtOyBpKyssIHBoZHIrKykKLQkgICAgewotCSAgICAgIGlmIChwaGRyLT5wX3R5cGUgPT0gUFRfTE9BRAotCQkgICYmIHBoZHItPnBfdmFkZHIgIT0gcGhkci0+cF9wYWRkcgotCQkgICYmIHBoZHItPnBfdmFkZHIgPD0gaGRyLT5zaF9hZGRyCi0JCSAgJiYgKHBoZHItPnBfdmFkZHIgKyBwaGRyLT5wX21lbXN6Ci0JCSAgICAgID49IGhkci0+c2hfYWRkciArIGhkci0+c2hfc2l6ZSkKLQkJICAmJiAoKGZsYWdzICYgU0VDX0xPQUQpID09IDAKLQkJICAgICAgfHwgKHBoZHItPnBfb2Zmc2V0IDw9IChiZmRfdm1hKSBoZHItPnNoX29mZnNldAotCQkJICAmJiAocGhkci0+cF9vZmZzZXQgKyBwaGRyLT5wX2ZpbGVzegotCQkJICAgICAgPj0gaGRyLT5zaF9vZmZzZXQgKyBoZHItPnNoX3NpemUpKSkpCi0JCXsKLQkJICBuZXdzZWN0LT5sbWEgKz0gcGhkci0+cF9wYWRkciAtIHBoZHItPnBfdmFkZHI7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaGRyLT5iZmRfc2VjdGlvbiA9IG5ld3NlY3Q7Ci0gIGVsZl9zZWN0aW9uX2RhdGEgKG5ld3NlY3QpLT50aGlzX2hkciA9ICpoZHI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9lbGZfZmluZF9zZWN0aW9uCi0KLVNZTk9QU0lTCi0Jc3RydWN0IGVsZl9pbnRlcm5hbF9zaGRyICpiZmRfZWxmX2ZpbmRfc2VjdGlvbiAoYmZkICphYmZkLCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLQlIZWxwZXIgZnVuY3Rpb25zIGZvciBHREIgdG8gbG9jYXRlIHRoZSBzdHJpbmcgdGFibGVzLgotCVNpbmNlIEJGRCBoaWRlcyBzdHJpbmcgdGFibGVzIGZyb20gY2FsbGVycywgR0RCIG5lZWRzIHRvIHVzZSBhbgotCWludGVybmFsIGhvb2sgdG8gZmluZCB0aGVtLiAgU3VuJ3MgLnN0YWJzdHIsIGluIHBhcnRpY3VsYXIsCi0JaXNuJ3QgZXZlbiBwb2ludGVkIHRvIGJ5IHRoZSAuc3RhYiBzZWN0aW9uLCBzbyBvcmRpbmFyeQotCW1lY2hhbmlzbXMgd291bGRuJ3Qgd29yayB0byBmaW5kIGl0LCBldmVuIGlmIHdlIGhhZCBzb21lLgotKi8KLQotc3RydWN0IGVsZl9pbnRlcm5hbF9zaGRyICoKLWJmZF9lbGZfZmluZF9zZWN0aW9uIChhYmZkLCBuYW1lKQotICAgICBiZmQgKiBhYmZkOwotICAgICBjaGFyICpuYW1lOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqKmlfc2hkcnA7Ci0gIGNoYXIgKnNoc3RydGFiOwotICB1bnNpZ25lZCBpbnQgbWF4OwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBpX3NoZHJwID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKTsKLSAgaWYgKGlfc2hkcnAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaHN0cnRhYiA9IGJmZF9lbGZfZ2V0X3N0cl9zZWN0aW9uCi0JKGFiZmQsIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4KTsKLSAgICAgIGlmIChzaHN0cnRhYiAhPSBOVUxMKQotCXsKLQkgIG1heCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtOwotCSAgZm9yIChpID0gMTsgaSA8IG1heDsgaSsrKQotCSAgICBpZiAoIXN0cmNtcCAoJnNoc3RydGFiW2lfc2hkcnBbaV0tPnNoX25hbWVdLCBuYW1lKSkKLQkgICAgICByZXR1cm4gaV9zaGRycFtpXTsKLQl9Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotY29uc3QgY2hhciAqY29uc3QgYmZkX2VsZl9zZWN0aW9uX3R5cGVfbmFtZXNbXSA9IHsKLSAgIlNIVF9OVUxMIiwgIlNIVF9QUk9HQklUUyIsICJTSFRfU1lNVEFCIiwgIlNIVF9TVFJUQUIiLAotICAiU0hUX1JFTEEiLCAiU0hUX0hBU0giLCAiU0hUX0RZTkFNSUMiLCAiU0hUX05PVEUiLAotICAiU0hUX05PQklUUyIsICJTSFRfUkVMIiwgIlNIVF9TSExJQiIsICJTSFRfRFlOU1lNIiwKLX07Ci0KLS8qIEVMRiByZWxvY3MgYXJlIGFnYWluc3Qgc3ltYm9scy4gIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlCi0gICBvdXRwdXQsIGFuZCB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wsIGFuZCBub3RoaW5nCi0gICBoYXMgZ2l2ZW4gdXMgYW55IGFkZGl0aW9uYWwgYWRkZW5kLCB0aGUgcmVzdWx0aW5nIHJlbG9jIHdpbGwgYWxzbwotICAgYmUgYWdhaW5zdCB0aGUgc2FtZSBzeW1ib2wuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0bwotICAgY2hhbmdlIGFueXRoaW5nIGFib3V0IHRoZSB3YXkgdGhlIHJlbG9jIGlzIGhhbmRsZWQsIHNpbmNlIGl0IHdpbGwKLSAgIGFsbCBiZSBkb25lIGF0IGZpbmFsIGxpbmsgdGltZS4gIFJhdGhlciB0aGFuIHB1dCBzcGVjaWFsIGNhc2UgY29kZQotICAgaW50byBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCBhbGwgdGhlIHJlbG9jIHR5cGVzIHVzZSB0aGlzIGhvd3RvCi0gICBmdW5jdGlvbi4gIEl0IGp1c3Qgc2hvcnQgY2lyY3VpdHMgdGhlIHJlbG9jIGlmIHByb2R1Y2luZwotICAgcmVsb2NhdGVhYmxlIG91dHB1dCBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0KLS8qQVJHU1VTRUQqLwotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfZWxmX2dlbmVyaWNfcmVsb2MgKGFiZmQsCi0JCSAgICAgICByZWxvY19lbnRyeSwKLQkJICAgICAgIHN5bWJvbCwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgb3V0cHV0X2JmZCwKLQkJICAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQwKLS8qIFByaW50IG91dCB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgZmFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmFyZzsKLXsKLSAgRklMRSAqZiA9IChGSUxFICopIGZhcmc7Ci0gIEVsZl9JbnRlcm5hbF9QaGRyICpwOwotICBhc2VjdGlvbiAqczsKLSAgYmZkX2J5dGUgKmR5bmJ1ZiA9IE5VTEw7Ci0KLSAgcCA9IGVsZl90ZGF0YSAoYWJmZCktPnBoZHI7Ci0gIGlmIChwICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGksIGM7Ci0KLSAgICAgIGZwcmludGYgKGYsIF8oIlxuUHJvZ3JhbSBIZWFkZXI6XG4iKSk7Ci0gICAgICBjID0gZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW07Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrLCBwKyspCi0JewotCSAgY29uc3QgY2hhciAqczsKLQkgIGNoYXIgYnVmWzIwXTsKLQotCSAgc3dpdGNoIChwLT5wX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBQVF9OVUxMOiBzID0gIk5VTEwiOyBicmVhazsKLQkgICAgY2FzZSBQVF9MT0FEOiBzID0gIkxPQUQiOyBicmVhazsKLQkgICAgY2FzZSBQVF9EWU5BTUlDOiBzID0gIkRZTkFNSUMiOyBicmVhazsKLQkgICAgY2FzZSBQVF9JTlRFUlA6IHMgPSAiSU5URVJQIjsgYnJlYWs7Ci0JICAgIGNhc2UgUFRfTk9URTogcyA9ICJOT1RFIjsgYnJlYWs7Ci0JICAgIGNhc2UgUFRfU0hMSUI6IHMgPSAiU0hMSUIiOyBicmVhazsKLQkgICAgY2FzZSBQVF9QSERSOiBzID0gIlBIRFIiOyBicmVhazsKLQkgICAgZGVmYXVsdDogc3ByaW50ZiAoYnVmLCAiMHglbHgiLCBwLT5wX3R5cGUpOyBzID0gYnVmOyBicmVhazsKLQkgICAgfQotCSAgZnByaW50ZiAoZiwgIiU4cyBvZmYgICAgMHgiLCBzKTsKLQkgIGZwcmludGZfdm1hIChmLCBwLT5wX29mZnNldCk7Ci0JICBmcHJpbnRmIChmLCAiIHZhZGRyIDB4Iik7Ci0JICBmcHJpbnRmX3ZtYSAoZiwgcC0+cF92YWRkcik7Ci0JICBmcHJpbnRmIChmLCAiIHBhZGRyIDB4Iik7Ci0JICBmcHJpbnRmX3ZtYSAoZiwgcC0+cF9wYWRkcik7Ci0JICBmcHJpbnRmIChmLCAiIGFsaWduIDIqKiV1XG4iLCBiZmRfbG9nMiAocC0+cF9hbGlnbikpOwotCSAgZnByaW50ZiAoZiwgIiAgICAgICAgIGZpbGVzeiAweCIpOwotCSAgZnByaW50Zl92bWEgKGYsIHAtPnBfZmlsZXN6KTsKLQkgIGZwcmludGYgKGYsICIgbWVtc3ogMHgiKTsKLQkgIGZwcmludGZfdm1hIChmLCBwLT5wX21lbXN6KTsKLQkgIGZwcmludGYgKGYsICIgZmxhZ3MgJWMlYyVjIiwKLQkJICAgKHAtPnBfZmxhZ3MgJiBQRl9SKSAhPSAwID8gJ3InIDogJy0nLAotCQkgICAocC0+cF9mbGFncyAmIFBGX1cpICE9IDAgPyAndycgOiAnLScsCi0JCSAgIChwLT5wX2ZsYWdzICYgUEZfWCkgIT0gMCA/ICd4JyA6ICctJyk7Ci0JICBpZiAoKHAtPnBfZmxhZ3MgJn4gKFBGX1IgfCBQRl9XIHwgUEZfWCkpICE9IDApCi0JICAgIGZwcmludGYgKGYsICIgJWx4IiwgcC0+cF9mbGFncyAmfiAoUEZfUiB8IFBGX1cgfCBQRl9YKSk7Ci0JICBmcHJpbnRmIChmLCAiXG4iKTsKLQl9Ci0gICAgfQotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7Ci0gIGlmIChzICE9IE5VTEwpCi0gICAgewotICAgICAgaW50IGVsZnNlYzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbGluazsKLSAgICAgIGJmZF9ieXRlICpleHRkeW4sICpleHRkeW5lbmQ7Ci0gICAgICBzaXplX3QgZXh0ZHluc2l6ZTsKLSAgICAgIHZvaWQgKCpzd2FwX2R5bl9pbikgUEFSQU1TICgoYmZkICosIGNvbnN0IFBUUiwgRWxmX0ludGVybmFsX0R5biAqKSk7Ci0KLSAgICAgIGZwcmludGYgKGYsIF8oIlxuRHluYW1pYyBTZWN0aW9uOlxuIikpOwotCi0gICAgICBkeW5idWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAocy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChkeW5idWYgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgKFBUUikgZHluYnVmLCAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgcy0+X3Jhd19zaXplKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZWxmc2VjID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzKTsKLSAgICAgIGlmIChlbGZzZWMgPT0gLTEpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBsaW5rID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtlbGZzZWNdLT5zaF9saW5rOwotCi0gICAgICBleHRkeW5zaXplID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2ZfZHluOwotICAgICAgc3dhcF9keW5faW4gPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnN3YXBfZHluX2luOwotCi0gICAgICBleHRkeW4gPSBkeW5idWY7Ci0gICAgICBleHRkeW5lbmQgPSBleHRkeW4gKyBzLT5fcmF3X3NpemU7Ci0gICAgICBmb3IgKDsgZXh0ZHluIDwgZXh0ZHluZW5kOyBleHRkeW4gKz0gZXh0ZHluc2l6ZSkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGFiWzIwXTsKLQkgIGJvb2xlYW4gc3RyaW5ncDsKLQotCSAgKCpzd2FwX2R5bl9pbikgKGFiZmQsIChQVFIpIGV4dGR5biwgJmR5bik7Ci0KLQkgIGlmIChkeW4uZF90YWcgPT0gRFRfTlVMTCkKLQkgICAgYnJlYWs7Ci0KLQkgIHN0cmluZ3AgPSBmYWxzZTsKLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgc3ByaW50ZiAoYWIsICIweCVseCIsICh1bnNpZ25lZCBsb25nKSBkeW4uZF90YWcpOwotCSAgICAgIG5hbWUgPSBhYjsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX05FRURFRDogbmFtZSA9ICJORUVERUQiOyBzdHJpbmdwID0gdHJ1ZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUExUUkVMU1o6IG5hbWUgPSAiUExUUkVMU1oiOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRHT1Q6IG5hbWUgPSAiUExUR09UIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSEFTSDogbmFtZSA9ICJIQVNIIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfU1RSVEFCOiBuYW1lID0gIlNUUlRBQiI7IGJyZWFrOwotCSAgICBjYXNlIERUX1NZTVRBQjogbmFtZSA9ICJTWU1UQUIiOyBicmVhazsKLQkgICAgY2FzZSBEVF9SRUxBOiBuYW1lID0gIlJFTEEiOyBicmVhazsKLQkgICAgY2FzZSBEVF9SRUxBU1o6IG5hbWUgPSAiUkVMQVNaIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUkVMQUVOVDogbmFtZSA9ICJSRUxBRU5UIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfU1RSU1o6IG5hbWUgPSAiU1RSU1oiOyBicmVhazsKLQkgICAgY2FzZSBEVF9TWU1FTlQ6IG5hbWUgPSAiU1lNRU5UIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSU5JVDogbmFtZSA9ICJJTklUIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfRklOSTogbmFtZSA9ICJGSU5JIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfU09OQU1FOiBuYW1lID0gIlNPTkFNRSI7IHN0cmluZ3AgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9SUEFUSDogbmFtZSA9ICJSUEFUSCI7IHN0cmluZ3AgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9TWU1CT0xJQzogbmFtZSA9ICJTWU1CT0xJQyI7IGJyZWFrOwotCSAgICBjYXNlIERUX1JFTDogbmFtZSA9ICJSRUwiOyBicmVhazsKLQkgICAgY2FzZSBEVF9SRUxTWjogbmFtZSA9ICJSRUxTWiI7IGJyZWFrOwotCSAgICBjYXNlIERUX1JFTEVOVDogbmFtZSA9ICJSRUxFTlQiOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRSRUw6IG5hbWUgPSAiUExUUkVMIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfREVCVUc6IG5hbWUgPSAiREVCVUciOyBicmVhazsKLQkgICAgY2FzZSBEVF9URVhUUkVMOiBuYW1lID0gIlRFWFRSRUwiOyBicmVhazsKLQkgICAgY2FzZSBEVF9KTVBSRUw6IG5hbWUgPSAiSk1QUkVMIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfQVVYSUxJQVJZOiBuYW1lID0gIkFVWElMSUFSWSI7IHN0cmluZ3AgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9GSUxURVI6IG5hbWUgPSAiRklMVEVSIjsgc3RyaW5ncCA9IHRydWU7IGJyZWFrOwotCSAgICBjYXNlIERUX1ZFUlNZTTogbmFtZSA9ICJWRVJTWU0iOyBicmVhazsKLQkgICAgY2FzZSBEVF9WRVJERUY6IG5hbWUgPSAiVkVSREVGIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfVkVSREVGTlVNOiBuYW1lID0gIlZFUkRFRk5VTSI7IGJyZWFrOwotCSAgICBjYXNlIERUX1ZFUk5FRUQ6IG5hbWUgPSAiVkVSTkVFRCI7IGJyZWFrOwotCSAgICBjYXNlIERUX1ZFUk5FRUROVU06IG5hbWUgPSAiVkVSTkVFRE5VTSI7IGJyZWFrOwotCSAgICB9Ci0KLQkgIGZwcmludGYgKGYsICIgICUtMTFzICIsIG5hbWUpOwotCSAgaWYgKCEgc3RyaW5ncCkKLQkgICAgZnByaW50ZiAoZiwgIjB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpIGR5bi5kX3VuLmRfdmFsKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLQotCSAgICAgIHN0cmluZyA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGxpbmssCi0JCQkJCQkJZHluLmRfdW4uZF92YWwpOwotCSAgICAgIGlmIChzdHJpbmcgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnByaW50ZiAoZiwgIiVzIiwgc3RyaW5nKTsKLQkgICAgfQotCSAgZnByaW50ZiAoZiwgIlxuIik7Ci0JfQotCi0gICAgICBmcmVlIChkeW5idWYpOwotICAgICAgZHluYnVmID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKChlbGZfZHludmVyZGVmIChhYmZkKSAhPSAwICYmIGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZiA9PSBOVUxMKQotICAgICAgfHwgKGVsZl9keW52ZXJyZWYgKGFiZmQpICE9IDAgJiYgZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmID09IE5VTEwpKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfZHludmVyZGVmIChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgKnQ7Ci0KLSAgICAgIGZwcmludGYgKGYsIF8oIlxuVmVyc2lvbiBkZWZpbml0aW9uczpcbiIpKTsKLSAgICAgIGZvciAodCA9IGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZjsgdCAhPSBOVUxMOyB0ID0gdC0+dmRfbmV4dGRlZikKLQl7Ci0JICBmcHJpbnRmIChmLCAiJWQgMHglMi4yeCAweCU4LjhseCAlc1xuIiwgdC0+dmRfbmR4LAotCQkgICB0LT52ZF9mbGFncywgdC0+dmRfaGFzaCwgdC0+dmRfbm9kZW5hbWUpOwotCSAgaWYgKHQtPnZkX2F1eHB0ci0+dmRhX25leHRwdHIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICphOwotCi0JICAgICAgZnByaW50ZiAoZiwgIlx0Iik7Ci0JICAgICAgZm9yIChhID0gdC0+dmRfYXV4cHRyLT52ZGFfbmV4dHB0cjsKLQkJICAgYSAhPSBOVUxMOwotCQkgICBhID0gYS0+dmRhX25leHRwdHIpCi0JCWZwcmludGYgKGYsICIlcyAiLCBhLT52ZGFfbm9kZW5hbWUpOwotCSAgICAgIGZwcmludGYgKGYsICJcbiIpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoZWxmX2R5bnZlcnJlZiAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKLQotICAgICAgZnByaW50ZiAoZiwgXygiXG5WZXJzaW9uIFJlZmVyZW5jZXM6XG4iKSk7Ci0gICAgICBmb3IgKHQgPSBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWY7IHQgIT0gTlVMTDsgdCA9IHQtPnZuX25leHRyZWYpCi0JewotCSAgRWxmX0ludGVybmFsX1Zlcm5hdXggKmE7Ci0KLQkgIGZwcmludGYgKGYsIF8oIiAgcmVxdWlyZWQgZnJvbSAlczpcbiIpLCB0LT52bl9maWxlbmFtZSk7Ci0JICBmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCSAgICBmcHJpbnRmIChmLCAiICAgIDB4JTguOGx4IDB4JTIuMnggJTIuMmQgJXNcbiIsIGEtPnZuYV9oYXNoLAotCQkgICAgIGEtPnZuYV9mbGFncywgYS0+dm5hX290aGVyLCBhLT52bmFfbm9kZW5hbWUpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChkeW5idWYgIT0gTlVMTCkKLSAgICBmcmVlIChkeW5idWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIERpc3BsYXkgRUxGLXNwZWNpZmljIGZpZWxkcyBvZiBhIHN5bWJvbC4gICovCi0KLXZvaWQKLWJmZF9lbGZfcHJpbnRfc3ltYm9sIChhYmZkLCBmaWxlcCwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZpbGVwOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBmaWxlcDsKLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgICAgZnByaW50ZiAoZmlsZSwgImVsZiAiKTsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBzeW1ib2wtPnZhbHVlKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgJWx4IiwgKGxvbmcpIHN5bWJvbC0+ZmxhZ3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIHsKLQlDT05TVCBjaGFyICpzZWN0aW9uX25hbWU7Ci0Jc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uID8gc3ltYm9sLT5zZWN0aW9uLT5uYW1lIDogIigqbm9uZSopIjsKLQliZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotCWZwcmludGYgKGZpbGUsICIgJXNcdCIsIHNlY3Rpb25fbmFtZSk7Ci0JLyogUHJpbnQgdGhlICJvdGhlciIgdmFsdWUgZm9yIGEgc3ltYm9sLiAgRm9yIGNvbW1vbiBzeW1ib2xzLAotCSAgIHdlJ3ZlIGFscmVhZHkgcHJpbnRlZCB0aGUgc2l6ZTsgbm93IHByaW50IHRoZSBhbGlnbm1lbnQuCi0JICAgRm9yIG90aGVyIHN5bWJvbHMsIHdlIGhhdmUgbm8gc3BlY2lmaWVkIGFsaWdubWVudCwgYW5kCi0JICAgd2UndmUgcHJpbnRlZCB0aGUgYWRkcmVzczsgbm93IHByaW50IHRoZSBzaXplLiAgKi8KLQlmcHJpbnRmX3ZtYSAoZmlsZSwKLQkJICAgICAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0JCSAgICAgID8gKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF92YWx1ZQotCQkgICAgICA6ICgoZWxmX3N5bWJvbF90eXBlICopIHN5bWJvbCktPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZSkpOwotCi0JLyogSWYgd2UgaGF2ZSB2ZXJzaW9uIGluZm9ybWF0aW9uLCBwcmludCBpdC4gICovCi0JaWYgKGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnN5bV9zZWN0aW9uICE9IDAKLQkgICAgJiYgKGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcmRlZl9zZWN0aW9uICE9IDAKLQkJfHwgZWxmX3RkYXRhIChhYmZkKS0+ZHludmVycmVmX3NlY3Rpb24gIT0gMCkpCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCB2ZXJudW07Ci0JICAgIGNvbnN0IGNoYXIgKnZlcnNpb25fc3RyaW5nOwotCi0JICAgIHZlcm51bSA9ICgoZWxmX3N5bWJvbF90eXBlICopIHN5bWJvbCktPnZlcnNpb24gJiBWRVJTWU1fVkVSU0lPTjsKLQotCSAgICBpZiAodmVybnVtID09IDApCi0JICAgICAgdmVyc2lvbl9zdHJpbmcgPSAiIjsKLQkgICAgZWxzZSBpZiAodmVybnVtID09IDEpCi0JICAgICAgdmVyc2lvbl9zdHJpbmcgPSAiQmFzZSI7Ci0JICAgIGVsc2UgaWYgKHZlcm51bSA8PSBlbGZfdGRhdGEgKGFiZmQpLT5jdmVyZGVmcykKLQkgICAgICB2ZXJzaW9uX3N0cmluZyA9Ci0JCWVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZlt2ZXJudW0gLSAxXS52ZF9ub2RlbmFtZTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJRWxmX0ludGVybmFsX1Zlcm5lZWQgKnQ7Ci0KLQkJdmVyc2lvbl9zdHJpbmcgPSAiIjsKLQkJZm9yICh0ID0gZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmOwotCQkgICAgIHQgIT0gTlVMTDsKLQkJICAgICB0ID0gdC0+dm5fbmV4dHJlZikKLQkJICB7Ci0JCSAgICBFbGZfSW50ZXJuYWxfVmVybmF1eCAqYTsKLQotCQkgICAgZm9yIChhID0gdC0+dm5fYXV4cHRyOyBhICE9IE5VTEw7IGEgPSBhLT52bmFfbmV4dHB0cikKLQkJICAgICAgewotCQkJaWYgKGEtPnZuYV9vdGhlciA9PSB2ZXJudW0pCi0JCQkgIHsKLQkJCSAgICB2ZXJzaW9uX3N0cmluZyA9IGEtPnZuYV9ub2RlbmFtZTsKLQkJCSAgICBicmVhazsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBpZiAoKCgoZWxmX3N5bWJvbF90eXBlICopIHN5bWJvbCktPnZlcnNpb24gJiBWRVJTWU1fSElEREVOKSA9PSAwKQotCSAgICAgIGZwcmludGYgKGZpbGUsICIgICUtMTFzIiwgdmVyc2lvbl9zdHJpbmcpOwotCSAgICBlbHNlCi0JICAgICAgewotCQlpbnQgaTsKLQotCQlmcHJpbnRmIChmaWxlLCAiICglcykiLCB2ZXJzaW9uX3N0cmluZyk7Ci0JCWZvciAoaSA9IDEwIC0gc3RybGVuICh2ZXJzaW9uX3N0cmluZyk7IGkgPiAwOyAtLWkpCi0JCSAgcHV0YyAoJyAnLCBmaWxlKTsKLQkgICAgICB9Ci0JICB9Ci0KLQkvKiBJZiB0aGUgc3Rfb3RoZXIgZmllbGQgaXMgbm90IHplcm8sIHByaW50IGl0LiAgKi8KLQlpZiAoKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlciAhPSAwKQotCSAgZnByaW50ZiAoZmlsZSwgIiAweCUwMngiLAotCQkgICAoKHVuc2lnbmVkIGludCkKLQkJICAgICgoZWxmX3N5bWJvbF90eXBlICopIHN5bWJvbCktPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXIpKTsKLQotCWZwcmludGYgKGZpbGUsICIgJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotfQotDAotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGFuIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1fYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+aW5keCA9IC0xOwotICAgICAgcmV0LT5zaXplID0gMDsKLSAgICAgIHJldC0+ZHluaW5keCA9IC0xOwotICAgICAgcmV0LT5keW5zdHJfaW5kZXggPSAwOwotICAgICAgcmV0LT53ZWFrZGVmID0gTlVMTDsKLSAgICAgIHJldC0+Z290Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLSAgICAgIHJldC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLSAgICAgIHJldC0+bGlua2VyX3NlY3Rpb25fcG9pbnRlciA9IChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKTA7Ci0gICAgICByZXQtPnZlcmluZm8udmVyZGVmID0gTlVMTDsKLSAgICAgIHJldC0+dnRhYmxlX2VudHJpZXNfdXNlZCA9IE5VTEw7Ci0gICAgICByZXQtPnZ0YWJsZV9lbnRyaWVzX3NpemUgPSAwOwotICAgICAgcmV0LT52dGFibGVfcGFyZW50ID0gTlVMTDsKLSAgICAgIHJldC0+dHlwZSA9IFNUVF9OT1RZUEU7Ci0gICAgICByZXQtPm90aGVyID0gMDsKLSAgICAgIC8qIEFzc3VtZSB0aGF0IHdlIGhhdmUgYmVlbiBjYWxsZWQgYnkgYSBub24tRUxGIHN5bWJvbCByZWFkZXIuCi0gICAgICAgICBUaGlzIGZsYWcgaXMgdGhlbiByZXNldCBieSB0aGUgY29kZSB3aGljaCByZWFkcyBhbiBFTEYgaW5wdXQKLSAgICAgICAgIGZpbGUuICBUaGlzIGVuc3VyZXMgdGhhdCBhIHN5bWJvbCBjcmVhdGVkIGJ5IGEgbm9uLUVMRiBzeW1ib2wKLSAgICAgICAgIHJlYWRlciB3aWxsIGhhdmUgdGhlIGZsYWcgc2V0IGNvcnJlY3RseS4gICovCi0gICAgICByZXQtPmVsZl9saW5rX2hhc2hfZmxhZ3MgPSBFTEZfTElOS19OT05fRUxGOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYW4gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCQljb25zdCBjaGFyICopKTsKLXsKLSAgdGFibGUtPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCA9IGZhbHNlOwotICB0YWJsZS0+ZHlub2JqID0gTlVMTDsKLSAgLyogVGhlIGZpcnN0IGR5bmFtaWMgc3ltYm9sIGlzIGEgZHVtbXkuICAqLwotICB0YWJsZS0+ZHluc3ltY291bnQgPSAxOwotICB0YWJsZS0+ZHluc3RyID0gTlVMTDsKLSAgdGFibGUtPmJ1Y2tldGNvdW50ID0gMDsKLSAgdGFibGUtPm5lZWRlZCA9IE5VTEw7Ci0gIHRhYmxlLT5oZ290ID0gTlVMTDsKLSAgdGFibGUtPnN0YWJfaW5mbyA9IE5VTEw7Ci0gIHJldHVybiBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnJvb3QsIGFiZmQsIG5ld2Z1bmMpOwotfQotCi0vKiBDcmVhdGUgYW4gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0IChyZXQsIGFiZmQsIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gJnJldC0+cm9vdDsKLX0KLQotLyogVGhpcyBpcyBhIGhvb2sgZm9yIHRoZSBFTEYgZW11bGF0aW9uIGNvZGUgaW4gdGhlIGdlbmVyaWMgbGlua2VyIHRvCi0gICB0ZWxsIHRoZSBiYWNrZW5kIGxpbmtlciB3aGF0IGZpbGUgbmFtZSB0byB1c2UgZm9yIHRoZSBEVF9ORUVERUQKLSAgIGVudHJ5IGZvciBhIGR5bmFtaWMgb2JqZWN0LiAgVGhlIGdlbmVyaWMgbGlua2VyIHBhc3NlcyBuYW1lIGFzIGFuCi0gICBlbXB0eSBzdHJpbmcgdG8gaW5kaWNhdGUgdGhhdCBubyBEVF9ORUVERUQgZW50cnkgc2hvdWxkIGJlIG1hZGUuICAqLwotCi12b2lkCi1iZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICAmJiBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX29iamVjdCkKLSAgICBlbGZfZHRfbmFtZSAoYWJmZCkgPSBuYW1lOwotfQotCi0vKiBHZXQgdGhlIGxpc3Qgb2YgRFRfTkVFREVEIGVudHJpZXMgZm9yIGEgbGluay4gIFRoaXMgaXMgYSBob29rIGZvcgotICAgdGhlIGxpbmtlciBFTEYgZW11bGF0aW9uIGNvZGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKgotYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPm5lZWRlZDsKLX0KLQotLyogR2V0IHRoZSBuYW1lIGFjdHVhbGx5IHVzZWQgZm9yIGEgZHluYW1pYyBvYmplY3QgZm9yIGEgbGluay4gIFRoaXMKLSAgIGlzIHRoZSBTT05BTUUgZW50cnkgaWYgdGhlcmUgaXMgb25lLiAgT3RoZXJ3aXNlLCBpdCBpcyB0aGUgc3RyaW5nCi0gICBwYXNzZWQgdG8gYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUsIG9yIGl0IGlzIHRoZSBmaWxlbmFtZS4gICovCi0KLWNvbnN0IGNoYXIgKgotYmZkX2VsZl9nZXRfZHRfc29uYW1lIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgICYmIGJmZF9nZXRfZm9ybWF0IChhYmZkKSA9PSBiZmRfb2JqZWN0KQotICAgIHJldHVybiBlbGZfZHRfbmFtZSAoYWJmZCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBHZXQgdGhlIGxpc3Qgb2YgRFRfTkVFREVEIGVudHJpZXMgZnJvbSBhIEJGRC4gIFRoaXMgaXMgYSBob29rIGZvcgotICAgdGhlIEVMRiBsaW5rZXIgZW11bGF0aW9uIGNvZGUuICAqLwotCi1ib29sZWFuCi1iZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QgKGFiZmQsIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICoqcG5lZWRlZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJmZF9ieXRlICpkeW5idWYgPSBOVUxMOwotICBpbnQgZWxmc2VjOwotICB1bnNpZ25lZCBsb25nIGxpbms7Ci0gIGJmZF9ieXRlICpleHRkeW4sICpleHRkeW5lbmQ7Ci0gIHNpemVfdCBleHRkeW5zaXplOwotICB2b2lkICgqc3dhcF9keW5faW4pIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQVFIsIEVsZl9JbnRlcm5hbF9EeW4gKikpOwotCi0gICpwbmVlZGVkID0gTlVMTDsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX29iamVjdCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpOwotICBpZiAocyA9PSBOVUxMIHx8IHMtPl9yYXdfc2l6ZSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bmJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzLT5fcmF3X3NpemUpOwotICBpZiAoZHluYnVmID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzLCAoUFRSKSBkeW5idWYsIChmaWxlX3B0cikgMCwKLQkJCQkgIHMtPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgZWxmc2VjID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzKTsKLSAgaWYgKGVsZnNlYyA9PSAtMSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBsaW5rID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtlbGZzZWNdLT5zaF9saW5rOwotCi0gIGV4dGR5bnNpemUgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9keW47Ci0gIHN3YXBfZHluX2luID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zd2FwX2R5bl9pbjsKLQotICBleHRkeW4gPSBkeW5idWY7Ci0gIGV4dGR5bmVuZCA9IGV4dGR5biArIHMtPl9yYXdfc2l6ZTsKLSAgZm9yICg7IGV4dGR5biA8IGV4dGR5bmVuZDsgZXh0ZHluICs9IGV4dGR5bnNpemUpCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0KLSAgICAgICgqc3dhcF9keW5faW4pIChhYmZkLCAoUFRSKSBleHRkeW4sICZkeW4pOwotCi0gICAgICBpZiAoZHluLmRfdGFnID09IERUX05VTEwpCi0JYnJlYWs7Ci0KLSAgICAgIGlmIChkeW4uZF90YWcgPT0gRFRfTkVFREVEKQotCXsKLQkgIGNvbnN0IGNoYXIgKnN0cmluZzsKLQkgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbDsKLQotCSAgc3RyaW5nID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgbGluaywKLQkJCQkJCSAgICBkeW4uZF91bi5kX3ZhbCk7Ci0JICBpZiAoc3RyaW5nID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBsID0gKHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAqbCk7Ci0JICBpZiAobCA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgbC0+YnkgPSBhYmZkOwotCSAgbC0+bmFtZSA9IHN0cmluZzsKLQkgIGwtPm5leHQgPSAqcG5lZWRlZDsKLQkgICpwbmVlZGVkID0gbDsKLQl9Ci0gICAgfQotCi0gIGZyZWUgKGR5bmJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChkeW5idWYgIT0gTlVMTCkKLSAgICBmcmVlIChkeW5idWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBhbiBFTEYgc3RyaW5nIHRhYmxlLS1mb3JjZSB0aGUgZmlyc3QgYnl0ZSB0byBiZSB6ZXJvLiAgKi8KLQotc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqCi1fYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCAoKQotewotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpyZXQ7Ci0KLSAgcmV0ID0gX2JmZF9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKHJldCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgbG9jOwotCi0gICAgICBsb2MgPSBfYmZkX3N0cmluZ3RhYl9hZGQgKHJldCwgIiIsIHRydWUsIGZhbHNlKTsKLSAgICAgIEJGRF9BU1NFUlQgKGxvYyA9PSAwIHx8IGxvYyA9PSAoYmZkX3NpemVfdHlwZSkgLTEpOwotICAgICAgaWYgKGxvYyA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JewotCSAgX2JmZF9zdHJpbmd0YWJfZnJlZSAocmV0KTsKLQkgIHJldCA9IE5VTEw7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHJldDsKLX0KLQwKLS8qIEVMRiAuby9leGVjIGZpbGUgcmVhZGluZyAqLwotCi0vKiBDcmVhdGUgYSBuZXcgYmZkIHNlY3Rpb24gZnJvbSBhbiBFTEYgc2VjdGlvbiBoZWFkZXIuICovCi0KLWJvb2xlYW4KLWJmZF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgc2hpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgc2hpbmRleDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkciA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF07Ci0gIEVsZl9JbnRlcm5hbF9FaGRyICplaGRyID0gZWxmX2VsZmhlYWRlciAoYWJmZCk7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIGNoYXIgKm5hbWU7Ci0KLSAgbmFtZSA9IGVsZl9zdHJpbmdfZnJvbV9lbGZfc3RydGFiIChhYmZkLCBoZHItPnNoX25hbWUpOwotCi0gIHN3aXRjaCAoaGRyLT5zaF90eXBlKQotICAgIHsKLSAgICBjYXNlIFNIVF9OVUxMOgotICAgICAgLyogSW5hY3RpdmUgc2VjdGlvbi4gVGhyb3cgaXQgYXdheS4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgU0hUX1BST0dCSVRTOgkvKiBOb3JtYWwgc2VjdGlvbiB3aXRoIGNvbnRlbnRzLiAgKi8KLSAgICBjYXNlIFNIVF9EWU5BTUlDOgkvKiBEeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24uICAqLwotICAgIGNhc2UgU0hUX05PQklUUzoJLyogLmJzcyBzZWN0aW9uLiAgKi8KLSAgICBjYXNlIFNIVF9IQVNIOgkvKiAuaGFzaCBzZWN0aW9uLiAgKi8KLSAgICBjYXNlIFNIVF9OT1RFOgkvKiAubm90ZSBzZWN0aW9uLiAgKi8KLSAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpOwotCi0gICAgY2FzZSBTSFRfU1lNVEFCOgkJLyogQSBzeW1ib2wgdGFibGUgKi8KLSAgICAgIGlmIChlbGZfb25lc3ltdGFiIChhYmZkKSA9PSBzaGluZGV4KQotCXJldHVybiB0cnVlOwotCi0gICAgICBCRkRfQVNTRVJUIChoZHItPnNoX2VudHNpemUgPT0gYmVkLT5zLT5zaXplb2Zfc3ltKTsKLSAgICAgIEJGRF9BU1NFUlQgKGVsZl9vbmVzeW10YWIgKGFiZmQpID09IDApOwotICAgICAgZWxmX29uZXN5bXRhYiAoYWJmZCkgPSBzaGluZGV4OwotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkciA9ICpoZHI7Ci0gICAgICBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdID0gaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQotICAgICAgLyogU29tZXRpbWVzIGEgc2hhcmVkIG9iamVjdCB3aWxsIG1hcCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgSWYKLSAgICAgICAgIFNIRl9BTExPQyBpcyBzZXQsIGFuZCB0aGlzIGlzIGEgc2hhcmVkIG9iamVjdCwgdGhlbiB3ZSBhbHNvCi0gICAgICAgICB0cmVhdCB0aGlzIHNlY3Rpb24gYXMgYSBCRkQgc2VjdGlvbi4gIFdlIGNhbiBub3QgYmFzZSB0aGUKLSAgICAgICAgIGRlY2lzaW9uIHB1cmVseSBvbiBTSEZfQUxMT0MsIGJlY2F1c2UgdGhhdCBmbGFnIGlzIHNvbWV0aW1lcwotICAgICAgICAgc2V0IGluIGEgcmVsb2NhdGVhYmxlIG9iamVjdCBmaWxlLCB3aGljaCB3b3VsZCBjb25mdXNlIHRoZQotICAgICAgICAgbGlua2VyLiAgKi8KLSAgICAgIGlmICgoaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMAotCSAgJiYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotCSAgJiYgISBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBjYXNlIFNIVF9EWU5TWU06CQkvKiBBIGR5bmFtaWMgc3ltYm9sIHRhYmxlICovCi0gICAgICBpZiAoZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gc2hpbmRleCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgQkZEX0FTU0VSVCAoaGRyLT5zaF9lbnRzaXplID09IGJlZC0+cy0+c2l6ZW9mX3N5bSk7Ci0gICAgICBCRkRfQVNTRVJUIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSAwKTsKLSAgICAgIGVsZl9keW5zeW10YWIgKGFiZmQpID0gc2hpbmRleDsKLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmR5bnN5bXRhYl9oZHIgPSAqaGRyOwotICAgICAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9IGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW5zeW10YWJfaGRyOwotICAgICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgICAgIC8qIEJlc2lkZXMgYmVpbmcgYSBzeW1ib2wgdGFibGUsIHdlIGFsc28gdHJlYXQgdGhpcyBhcyBhIHJlZ3VsYXIKLQkgc2VjdGlvbiwgc28gdGhhdCBvYmpjb3B5IGNhbiBoYW5kbGUgaXQuICAqLwotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0KLSAgICBjYXNlIFNIVF9TVFJUQUI6CQkvKiBBIHN0cmluZyB0YWJsZSAqLwotICAgICAgaWYgKGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGlmIChlaGRyLT5lX3Noc3RybmR4ID09IHNoaW5kZXgpCi0JewotCSAgZWxmX3RkYXRhIChhYmZkKS0+c2hzdHJ0YWJfaGRyID0gKmhkcjsKLQkgIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPSAmZWxmX3RkYXRhIChhYmZkKS0+c2hzdHJ0YWJfaGRyOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgICAgewotCXVuc2lnbmVkIGludCBpOwotCi0JZm9yIChpID0gMTsgaSA8IGVoZHItPmVfc2hudW07IGkrKykKLQkgIHsKLQkgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjIgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2ldOwotCSAgICBpZiAoaGRyMi0+c2hfbGluayA9PSBzaGluZGV4KQotCSAgICAgIHsKLQkJaWYgKCEgYmZkX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBpKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCWlmIChlbGZfb25lc3ltdGFiIChhYmZkKSA9PSBpKQotCQkgIHsKLQkJICAgIGVsZl90ZGF0YSAoYWJmZCktPnN0cnRhYl9oZHIgPSAqaGRyOwotCQkgICAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9Ci0JCSAgICAgICZlbGZfdGRhdGEgKGFiZmQpLT5zdHJ0YWJfaGRyOwotCQkgICAgcmV0dXJuIHRydWU7Ci0JCSAgfQotCQlpZiAoZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gaSkKLQkJICB7Ci0JCSAgICBlbGZfdGRhdGEgKGFiZmQpLT5keW5zdHJ0YWJfaGRyID0gKmhkcjsKLQkJICAgIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPSBoZHIgPQotCQkgICAgICAmZWxmX3RkYXRhIChhYmZkKS0+ZHluc3RydGFiX2hkcjsKLQkJICAgIC8qIFdlIGFsc28gdHJlYXQgdGhpcyBhcyBhIHJlZ3VsYXIgc2VjdGlvbiwgc28KLQkJICAgICAgIHRoYXQgb2JqY29weSBjYW4gaGFuZGxlIGl0LiAgKi8KLQkJICAgIGJyZWFrOwotCQkgIH0KLSNpZiAwIC8qIE5vdCBoYW5kbGluZyBvdGhlciBzdHJpbmcgdGFibGVzIHNwZWNpYWxseSByaWdodCBub3cuICAqLwotCQloZHIyID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtpXTsJLyogaW4gY2FzZSBpdCBtb3ZlZCAqLwotCQkvKiBXZSBoYXZlIGEgc3RydGFiIGZvciBzb21lIHJhbmRvbSBvdGhlciBzZWN0aW9uLiAgKi8KLQkJbmV3c2VjdCA9IChhc2VjdGlvbiAqKSBoZHIyLT5iZmRfc2VjdGlvbjsKLQkJaWYgKCFuZXdzZWN0KQotCQkgIGJyZWFrOwotCQloZHItPmJmZF9zZWN0aW9uID0gbmV3c2VjdDsKLQkJaGRyMiA9ICZlbGZfc2VjdGlvbl9kYXRhIChuZXdzZWN0KS0+c3RyX2hkcjsKLQkJKmhkcjIgPSAqaGRyOwotCQllbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdID0gaGRyMjsKLSNlbmRpZgotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0KLSAgICBjYXNlIFNIVF9SRUw6Ci0gICAgY2FzZSBTSFRfUkVMQToKLSAgICAgIC8qICpUaGVzZSogZG8gYSBsb3Qgb2Ygd29yayAtLSBidXQgYnVpbGQgbm8gc2VjdGlvbnMhICAqLwotICAgICAgewotCWFzZWN0aW9uICp0YXJnZXRfc2VjdDsKLQlFbGZfSW50ZXJuYWxfU2hkciAqaGRyMjsKLQotCS8qIEZvciBzb21lIGluY29tcHJlaGVuc2libGUgcmVhc29uIE9yYWNsZSBkaXN0cmlidXRlcwotCSAgIGxpYnJhcmllcyBmb3IgU29sYXJpcyBpbiB3aGljaCBzb21lIG9mIHRoZSBvYmplY3RzIGhhdmUKLQkgICBib2d1cyBzaF9saW5rIGZpZWxkcy4gIEl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQganVzdAotCSAgIHJlamVjdCB0aGVtLCBidXQsIHVuZm9ydHVuYXRlbHksIHNvbWUgcGVvcGxlIG5lZWQgdG8gdXNlCi0JICAgdGhlbS4gIFdlIHNjYW4gdGhyb3VnaCB0aGUgc2VjdGlvbiBoZWFkZXJzOyBpZiB3ZSBmaW5kIG9ubHkKLQkgICBvbmUgc3VpdGFibGUgc3ltYm9sIHRhYmxlLCB3ZSBjbG9iYmVyIHRoZSBzaF9saW5rIHRvIHBvaW50Ci0JICAgdG8gaXQuICBJIGhvcGUgdGhpcyBkb2Vzbid0IGJyZWFrIGFueXRoaW5nLiAgKi8KLQlpZiAoZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtoZHItPnNoX2xpbmtdLT5zaF90eXBlICE9IFNIVF9TWU1UQUIKLQkgICAgJiYgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtoZHItPnNoX2xpbmtdLT5zaF90eXBlICE9IFNIVF9EWU5TWU0pCi0JICB7Ci0JICAgIGludCBzY2FuOwotCSAgICBpbnQgZm91bmQ7Ci0KLQkgICAgZm91bmQgPSAwOwotCSAgICBmb3IgKHNjYW4gPSAxOyBzY2FuIDwgZWhkci0+ZV9zaG51bTsgc2NhbisrKQotCSAgICAgIHsKLQkJaWYgKGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2Nhbl0tPnNoX3R5cGUgPT0gU0hUX1NZTVRBQgotCQkgICAgfHwgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzY2FuXS0+c2hfdHlwZSA9PSBTSFRfRFlOU1lNKQotCQkgIHsKLQkJICAgIGlmIChmb3VuZCAhPSAwKQotCQkgICAgICB7Ci0JCQlmb3VuZCA9IDA7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgZm91bmQgPSBzY2FuOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGlmIChmb3VuZCAhPSAwKQotCSAgICAgIGhkci0+c2hfbGluayA9IGZvdW5kOwotCSAgfQotCi0JLyogR2V0IHRoZSBzeW1ib2wgdGFibGUuICAqLwotCWlmIChlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2hkci0+c2hfbGlua10tPnNoX3R5cGUgPT0gU0hUX1NZTVRBQgotCSAgICAmJiAhIGJmZF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLT5zaF9saW5rKSkKLQkgIHJldHVybiBmYWxzZTsKLQotCS8qIElmIHRoaXMgcmVsb2Mgc2VjdGlvbiBkb2VzIG5vdCB1c2UgdGhlIG1haW4gc3ltYm9sIHRhYmxlIHdlCi0JICAgZG9uJ3QgdHJlYXQgaXQgYXMgYSByZWxvYyBzZWN0aW9uLiAgQkZEIGNhbid0IGFkZXF1YXRlbHkKLQkgICByZXByZXNlbnQgc3VjaCBhIHNlY3Rpb24sIHNvIGF0IGxlYXN0IGZvciBub3csIHdlIGRvbid0Ci0JICAgdHJ5LiAgV2UganVzdCBwcmVzZW50IGl0IGFzIGEgbm9ybWFsIHNlY3Rpb24uICAqLwotCWlmIChoZHItPnNoX2xpbmsgIT0gZWxmX29uZXN5bXRhYiAoYWJmZCkpCi0JICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLQotCWlmICghIGJmZF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLT5zaF9pbmZvKSkKLQkgIHJldHVybiBmYWxzZTsKLQl0YXJnZXRfc2VjdCA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBoZHItPnNoX2luZm8pOwotCWlmICh0YXJnZXRfc2VjdCA9PSBOVUxMKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JaWYgKCh0YXJnZXRfc2VjdC0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkgICAgfHwgdGFyZ2V0X3NlY3QtPnJlbG9jX2NvdW50ID09IDApCi0JICBoZHIyID0gJmVsZl9zZWN0aW9uX2RhdGEgKHRhcmdldF9zZWN0KS0+cmVsX2hkcjsKLQllbHNlCi0JICB7Ci0JICAgIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHRhcmdldF9zZWN0KS0+cmVsX2hkcjIgPT0gTlVMTCk7Ci0JICAgIGhkcjIgPSAoRWxmX0ludGVybmFsX1NoZHIgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCpoZHIyKSk7Ci0JICAgIGVsZl9zZWN0aW9uX2RhdGEgKHRhcmdldF9zZWN0KS0+cmVsX2hkcjIgPSBoZHIyOwotCSAgfQotCSpoZHIyID0gKmhkcjsKLQllbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdID0gaGRyMjsKLQl0YXJnZXRfc2VjdC0+cmVsb2NfY291bnQgKz0gaGRyLT5zaF9zaXplIC8gaGRyLT5zaF9lbnRzaXplOwotCXRhcmdldF9zZWN0LT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0JdGFyZ2V0X3NlY3QtPnJlbG9jYXRpb24gPSBOVUxMOwotCXRhcmdldF9zZWN0LT5yZWxfZmlsZXBvcyA9IGhkci0+c2hfb2Zmc2V0OwotCWFiZmQtPmZsYWdzIHw9IEhBU19SRUxPQzsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSFRfR05VX3ZlcmRlZjoKLSAgICAgIGVsZl9keW52ZXJkZWYgKGFiZmQpID0gc2hpbmRleDsKLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcmRlZl9oZHIgPSAqaGRyOwotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hUX0dOVV92ZXJzeW06Ci0gICAgICBlbGZfZHludmVyc3ltIChhYmZkKSA9IHNoaW5kZXg7Ci0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJzeW1faGRyID0gKmhkcjsKLSAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNIVF9HTlVfdmVybmVlZDoKLSAgICAgIGVsZl9keW52ZXJyZWYgKGFiZmQpID0gc2hpbmRleDsKLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnJlZl9oZHIgPSAqaGRyOwotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hUX1NITElCOgotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogQ2hlY2sgZm9yIGFueSBwcm9jZXNzb3Itc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4gICovCi0gICAgICB7Ci0JaWYgKGJlZC0+ZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIpCi0JICAoKmJlZC0+ZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIpIChhYmZkLCBoZHIsIG5hbWUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHaXZlbiBhbiBFTEYgc2VjdGlvbiBudW1iZXIsIHJldHJpZXZlIHRoZSBjb3JyZXNwb25kaW5nIEJGRAotICAgc2VjdGlvbi4gICovCi0KLWFzZWN0aW9uICoKLWJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci17Ci0gIEJGRF9BU1NFUlQgKGluZGV4ID4gMCAmJiBpbmRleCA8IFNITl9MT1JFU0VSVkUpOwotICBpZiAoaW5kZXggPj0gZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW0pCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2luZGV4XS0+YmZkX3NlY3Rpb247Ci19Ci0KLWJvb2xlYW4KLV9iZmRfZWxmX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKnNkYXRhOwotCi0gIHNkYXRhID0gKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoKnNkYXRhKSk7Ci0gIGlmICghc2RhdGEpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzZWMtPnVzZWRfYnlfYmZkID0gKFBUUikgc2RhdGE7Ci0gIG1lbXNldCAoc2RhdGEsIDAsIHNpemVvZiAoKnNkYXRhKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgYSBuZXcgYmZkIHNlY3Rpb24gZnJvbSBhbiBFTEYgcHJvZ3JhbSBoZWFkZXIuCi0KLSAgIFNpbmNlIHByb2dyYW0gc2VnbWVudHMgaGF2ZSBubyBuYW1lcywgd2UgZ2VuZXJhdGUgYSBzeW50aGV0aWMgbmFtZQotICAgb2YgdGhlIGZvcm0gc2VnbWVudDxOVU0+LCB3aGVyZSBOVU0gaXMgZ2VuZXJhbGx5IHRoZSBpbmRleCBpbiB0aGUKLSAgIHByb2dyYW0gaGVhZGVyIHRhYmxlLiAgRm9yIHNlZ21lbnRzIHRoYXQgYXJlIHNwbGl0IChzZWUgYmVsb3cpIHdlCi0gICBnZW5lcmF0ZSB0aGUgbmFtZXMgc2VnbWVudDxOVU0+YSBhbmQgc2VnbWVudDxOVU0+Yi4KLQotICAgTm90ZSB0aGF0IHNvbWUgcHJvZ3JhbSBzZWdtZW50cyBtYXkgaGF2ZSBhIGZpbGUgc2l6ZSB0aGF0IGlzIGRpZmZlcmVudCB0aGFuCi0gICAobGVzcyB0aGFuKSB0aGUgbWVtb3J5IHNpemUuICBBbGwgdGhpcyBtZWFucyBpcyB0aGF0IGF0IGV4ZWN1dGlvbiB0aGUKLSAgIHN5c3RlbSBtdXN0IGFsbG9jYXRlIHRoZSBhbW91bnQgb2YgbWVtb3J5IHNwZWNpZmllZCBieSB0aGUgbWVtb3J5IHNpemUsCi0gICBidXQgb25seSBpbml0aWFsaXplIGl0IHdpdGggdGhlIGZpcnN0ICJmaWxlIHNpemUiIGJ5dGVzIHJlYWQgZnJvbSB0aGUKLSAgIGZpbGUuICBUaGlzIHdvdWxkIG9jY3VyIGZvciBleGFtcGxlLCB3aXRoIHByb2dyYW0gc2VnbWVudHMgY29uc2lzdGluZwotICAgb2YgY29tYmluZWQgZGF0YStic3MuCi0KLSAgIFRvIGhhbmRsZSB0aGUgYWJvdmUgc2l0dWF0aW9uLCB0aGlzIHJvdXRpbmUgZ2VuZXJhdGVzIFRXTyBiZmQgc2VjdGlvbnMKLSAgIGZvciB0aGUgc2luZ2xlIHByb2dyYW0gc2VnbWVudC4gIFRoZSBmaXJzdCBoYXMgdGhlIGxlbmd0aCBzcGVjaWZpZWQgYnkKLSAgIHRoZSBmaWxlIHNpemUgb2YgdGhlIHNlZ21lbnQsIGFuZCB0aGUgc2Vjb25kIGhhcyB0aGUgbGVuZ3RoIHNwZWNpZmllZAotICAgYnkgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIHNpemVzLiAgSW4gZWZmZWN0LCB0aGUgc2VnbWVudCBpcyBzcGxpdAotICAgaW50byBpdCdzIGluaXRpYWxpemVkIGFuZCB1bmluaXRpYWxpemVkIHBhcnRzLgotCi0gKi8KLQotYm9vbGVhbgotYmZkX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBoZHIsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9QaGRyICpoZHI7Ci0gICAgIGludCBpbmRleDsKLXsKLSAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgbmFtZWJ1Zls2NF07Ci0gIGludCBzcGxpdDsKLQotICBzcGxpdCA9ICgoaGRyLT5wX21lbXN6ID4gMCkKLQkgICAgJiYgKGhkci0+cF9maWxlc3ogPiAwKQotCSAgICAmJiAoaGRyLT5wX21lbXN6ID4gaGRyLT5wX2ZpbGVzeikpOwotICBzcHJpbnRmIChuYW1lYnVmLCBzcGxpdCA/ICJzZWdtZW50JWRhIiA6ICJzZWdtZW50JWQiLCBpbmRleCk7Ci0gIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAobmFtZWJ1ZikgKyAxKTsKLSAgaWYgKCFuYW1lKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RyY3B5IChuYW1lLCBuYW1lYnVmKTsKLSAgbmV3c2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAobmV3c2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmV3c2VjdC0+dm1hID0gaGRyLT5wX3ZhZGRyOwotICBuZXdzZWN0LT5sbWEgPSBoZHItPnBfcGFkZHI7Ci0gIG5ld3NlY3QtPl9yYXdfc2l6ZSA9IGhkci0+cF9maWxlc3o7Ci0gIG5ld3NlY3QtPmZpbGVwb3MgPSBoZHItPnBfb2Zmc2V0OwotICBuZXdzZWN0LT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotICBpZiAoaGRyLT5wX3R5cGUgPT0gUFRfTE9BRCkKLSAgICB7Ci0gICAgICBuZXdzZWN0LT5mbGFncyB8PSBTRUNfQUxMT0M7Ci0gICAgICBuZXdzZWN0LT5mbGFncyB8PSBTRUNfTE9BRDsKLSAgICAgIGlmIChoZHItPnBfZmxhZ3MgJiBQRl9YKQotCXsKLQkgIC8qIEZJWE1FOiBhbGwgd2Uga25vd24gaXMgdGhhdCBpdCBoYXMgZXhlY3V0ZSBQRVJNSVNTSU9OLAotCSAgICAgbWF5IGJlIGRhdGEuICovCi0JICBuZXdzZWN0LT5mbGFncyB8PSBTRUNfQ09ERTsKLQl9Ci0gICAgfQotICBpZiAoIShoZHItPnBfZmxhZ3MgJiBQRl9XKSkKLSAgICB7Ci0gICAgICBuZXdzZWN0LT5mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0gICAgfQotCi0gIGlmIChzcGxpdCkKLSAgICB7Ci0gICAgICBzcHJpbnRmIChuYW1lYnVmLCAic2VnbWVudCVkYiIsIGluZGV4KTsKLSAgICAgIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAobmFtZWJ1ZikgKyAxKTsKLSAgICAgIGlmICghbmFtZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzdHJjcHkgKG5hbWUsIG5hbWVidWYpOwotICAgICAgbmV3c2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICAgICAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBuZXdzZWN0LT52bWEgPSBoZHItPnBfdmFkZHIgKyBoZHItPnBfZmlsZXN6OwotICAgICAgbmV3c2VjdC0+bG1hID0gaGRyLT5wX3BhZGRyICsgaGRyLT5wX2ZpbGVzejsKLSAgICAgIG5ld3NlY3QtPl9yYXdfc2l6ZSA9IGhkci0+cF9tZW1zeiAtIGhkci0+cF9maWxlc3o7Ci0gICAgICBpZiAoaGRyLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQl7Ci0JICBuZXdzZWN0LT5mbGFncyB8PSBTRUNfQUxMT0M7Ci0JICBpZiAoaGRyLT5wX2ZsYWdzICYgUEZfWCkKLQkgICAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0NPREU7Ci0JfQotICAgICAgaWYgKCEoaGRyLT5wX2ZsYWdzICYgUEZfVykpCi0JbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHVwIGFuIEVMRiBpbnRlcm5hbCBzZWN0aW9uIGhlYWRlciBmb3IgYSBzZWN0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotZWxmX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIGFzZWN0LCBmYWlsZWRwdHJhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotICAgICBQVFIgZmFpbGVkcHRyYXJnOwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBib29sZWFuICpmYWlsZWRwdHIgPSAoYm9vbGVhbiAqKSBmYWlsZWRwdHJhcmc7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICp0aGlzX2hkcjsKLQotICBpZiAoKmZhaWxlZHB0cikKLSAgICB7Ci0gICAgICAvKiBXZSBhbHJlYWR5IGZhaWxlZDsganVzdCBnZXQgb3V0IG9mIHRoZSBiZmRfbWFwX292ZXJfc2VjdGlvbnMKLSAgICAgICAgIGxvb3AuICAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB0aGlzX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChhc2VjdCktPnRoaXNfaGRyOwotCi0gIHRoaXNfaGRyLT5zaF9uYW1lID0gKHVuc2lnbmVkIGxvbmcpIF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX3Noc3RydGFiIChhYmZkKSwKLQkJCQkJCQkgIGFzZWN0LT5uYW1lLAotCQkJCQkJCSAgdHJ1ZSwgZmFsc2UpOwotICBpZiAodGhpc19oZHItPnNoX25hbWUgPT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotICAgIHsKLSAgICAgICpmYWlsZWRwdHIgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB0aGlzX2hkci0+c2hfZmxhZ3MgPSAwOwotCi0gIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0gICAgICB8fCBhc2VjdC0+dXNlcl9zZXRfdm1hKQotICAgIHRoaXNfaGRyLT5zaF9hZGRyID0gYXNlY3QtPnZtYTsKLSAgZWxzZQotICAgIHRoaXNfaGRyLT5zaF9hZGRyID0gMDsKLQotICB0aGlzX2hkci0+c2hfb2Zmc2V0ID0gMDsKLSAgdGhpc19oZHItPnNoX3NpemUgPSBhc2VjdC0+X3Jhd19zaXplOwotICB0aGlzX2hkci0+c2hfbGluayA9IDA7Ci0gIHRoaXNfaGRyLT5zaF9hZGRyYWxpZ24gPSAxIDw8IGFzZWN0LT5hbGlnbm1lbnRfcG93ZXI7Ci0gIC8qIFRoZSBzaF9lbnRzaXplIGFuZCBzaF9pbmZvIGZpZWxkcyBtYXkgaGF2ZSBiZWVuIHNldCBhbHJlYWR5IGJ5Ci0gICAgIGNvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEuICAqLwotCi0gIHRoaXNfaGRyLT5iZmRfc2VjdGlvbiA9IGFzZWN0OwotICB0aGlzX2hkci0+Y29udGVudHMgPSBOVUxMOwotCi0gIC8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgYmFzZWQgb24gc2VjdGlvbiBuYW1lcy4gICovCi0gIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmR5bnN0ciIpID09IDApCi0gICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOwotICBlbHNlIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmhhc2giKSA9PSAwKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX0hBU0g7Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+YXJjaF9zaXplIC8gODsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXNlY3QtPm5hbWUsICIuZHluc3ltIikgPT0gMCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9EWU5TWU07Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3N5bTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXNlY3QtPm5hbWUsICIuZHluYW1pYyIpID09IDApCi0gICAgewotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfRFlOQU1JQzsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gYmVkLT5zLT5zaXplb2ZfZHluOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoYXNlY3QtPm5hbWUsICIucmVsYS4iLCA2KSA9PSAwCi0JICAgJiYgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT51c2VfcmVsYV9wKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1JFTEE7Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3JlbGE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChhc2VjdC0+bmFtZSwgIi5yZWwuIiwgNSkgPT0gMAotCSAgICYmICEgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT51c2VfcmVsYV9wKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1JFTDsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gYmVkLT5zLT5zaXplb2ZfcmVsOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoYXNlY3QtPm5hbWUsICIubm90ZSIsIDUpID09IDApCi0gICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfTk9URTsKLSAgZWxzZSBpZiAoc3RybmNtcCAoYXNlY3QtPm5hbWUsICIuc3RhYiIsIDUpID09IDAKLQkgICAmJiBzdHJjbXAgKGFzZWN0LT5uYW1lICsgc3RybGVuIChhc2VjdC0+bmFtZSkgLSAzLCAic3RyIikgPT0gMCkKLSAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXNlY3QtPm5hbWUsICIuZ251LnZlcnNpb24iKSA9PSAwKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX0dOVV92ZXJzeW07Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcnN5bSk7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmdudS52ZXJzaW9uX2QiKSA9PSAwKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX0dOVV92ZXJkZWY7Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IDA7Ci0gICAgICAvKiBvYmpjb3B5IG9yIHN0cmlwIHdpbGwgY29weSBvdmVyIHNoX2luZm8sIGJ1dCBtYXkgbm90IHNldAotICAgICAgICAgY3ZlcmRlZnMuICBUaGUgbGlua2VyIHdpbGwgc2V0IGN2ZXJkZWZzLCBidXQgc2hfaW5mbyB3aWxsIGJlCi0gICAgICAgICB6ZXJvLiAgKi8KLSAgICAgIGlmICh0aGlzX2hkci0+c2hfaW5mbyA9PSAwKQotCXRoaXNfaGRyLT5zaF9pbmZvID0gZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcmRlZnM7Ci0gICAgICBlbHNlCi0JQkZEX0FTU0VSVCAoZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcmRlZnMgPT0gMAotCQkgICAgfHwgdGhpc19oZHItPnNoX2luZm8gPT0gZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcmRlZnMpOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5nbnUudmVyc2lvbl9yIikgPT0gMCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9HTlVfdmVybmVlZDsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgICAgIC8qIG9iamNvcHkgb3Igc3RyaXAgd2lsbCBjb3B5IG92ZXIgc2hfaW5mbywgYnV0IG1heSBub3Qgc2V0Ci0gICAgICAgICBjdmVycmVmcy4gIFRoZSBsaW5rZXIgd2lsbCBzZXQgY3ZlcnJlZnMsIGJ1dCBzaF9pbmZvIHdpbGwgYmUKLSAgICAgICAgIHplcm8uICAqLwotICAgICAgaWYgKHRoaXNfaGRyLT5zaF9pbmZvID09IDApCi0JdGhpc19oZHItPnNoX2luZm8gPSBlbGZfdGRhdGEgKGFiZmQpLT5jdmVycmVmczsKLSAgICAgIGVsc2UKLQlCRkRfQVNTRVJUIChlbGZfdGRhdGEgKGFiZmQpLT5jdmVycmVmcyA9PSAwCi0JCSAgICB8fCB0aGlzX2hkci0+c2hfaW5mbyA9PSBlbGZfdGRhdGEgKGFiZmQpLT5jdmVycmVmcyk7Ci0gICAgfQotICBlbHNlIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JICAgJiYgKGFzZWN0LT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwKQotICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1BST0dCSVRTOwotICBlbHNlIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JICAgJiYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkpCi0gICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfTk9CSVRTOwotICBlbHNlCi0gICAgewotICAgICAgLyogV2hvIGtub3dzPyAgKi8KLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1BST0dCSVRTOwotICAgIH0KLQotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB0aGlzX2hkci0+c2hfZmxhZ3MgfD0gU0hGX0FMTE9DOwotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMCkKLSAgICB0aGlzX2hkci0+c2hfZmxhZ3MgfD0gU0hGX1dSSVRFOwotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotICAgIHRoaXNfaGRyLT5zaF9mbGFncyB8PSBTSEZfRVhFQ0lOU1RSOwotCi0gIC8qIENoZWNrIGZvciBwcm9jZXNzb3Itc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4gICovCi0gIHsKLSAgICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gICAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucykKLSAgICAgICgqYmVkLT5lbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zKSAoYWJmZCwgdGhpc19oZHIsIGFzZWN0KTsKLSAgfQotCi0gIC8qIElmIHRoZSBzZWN0aW9uIGhhcyByZWxvY3MsIHNldCB1cCBhIHNlY3Rpb24gaGVhZGVyIGZvciB0aGUKLSAgICAgU0hUX1JFTFtBXSBzZWN0aW9uLiAgKi8KLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKnJlbGFfaGRyOwotICAgICAgaW50IHVzZV9yZWxhX3AgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnVzZV9yZWxhX3A7Ci0gICAgICBjaGFyICpuYW1lOwotCi0gICAgICByZWxhX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChhc2VjdCktPnJlbF9oZHI7Ci0gICAgICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgIi5yZWxhIiArIHN0cmxlbiAoYXNlY3QtPm5hbWUpKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JewotCSAgKmZhaWxlZHB0ciA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotICAgICAgc3ByaW50ZiAobmFtZSwgIiVzJXMiLCB1c2VfcmVsYV9wID8gIi5yZWxhIiA6ICIucmVsIiwgYXNlY3QtPm5hbWUpOwotICAgICAgcmVsYV9oZHItPnNoX25hbWUgPQotCSh1bnNpZ25lZCBpbnQpIF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX3Noc3RydGFiIChhYmZkKSwgbmFtZSwKLQkJCQkJICAgdHJ1ZSwgZmFsc2UpOwotICAgICAgaWYgKHJlbGFfaGRyLT5zaF9uYW1lID09ICh1bnNpZ25lZCBpbnQpIC0xKQotCXsKLQkgICpmYWlsZWRwdHIgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHJlbGFfaGRyLT5zaF90eXBlID0gdXNlX3JlbGFfcCA/IFNIVF9SRUxBIDogU0hUX1JFTDsKLSAgICAgIHJlbGFfaGRyLT5zaF9lbnRzaXplID0gKHVzZV9yZWxhX3AKLQkJCSAgICAgID8gYmVkLT5zLT5zaXplb2ZfcmVsYQotCQkJICAgICAgOiBiZWQtPnMtPnNpemVvZl9yZWwpOwotICAgICAgcmVsYV9oZHItPnNoX2FkZHJhbGlnbiA9IGJlZC0+cy0+ZmlsZV9hbGlnbjsKLSAgICAgIHJlbGFfaGRyLT5zaF9mbGFncyA9IDA7Ci0gICAgICByZWxhX2hkci0+c2hfYWRkciA9IDA7Ci0gICAgICByZWxhX2hkci0+c2hfc2l6ZSA9IDA7Ci0gICAgICByZWxhX2hkci0+c2hfb2Zmc2V0ID0gMDsKLSAgICB9Ci19Ci0KLS8qIEFzc2lnbiBhbGwgRUxGIHNlY3Rpb24gbnVtYmVycy4gIFRoZSBkdW1teSBmaXJzdCBzZWN0aW9uIGlzIGhhbmRsZWQgaGVyZQotICAgdG9vLiAgVGhlIGxpbmsvaW5mbyBwb2ludGVycyBmb3IgdGhlIHN0YW5kYXJkIHNlY3Rpb24gdHlwZXMgYXJlIGZpbGxlZAotICAgaW4gaGVyZSB0b28sIHdoaWxlIHdlJ3JlIGF0IGl0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFzc2lnbl9zZWN0aW9uX251bWJlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZl9vYmpfdGRhdGEgKnQgPSBlbGZfdGRhdGEgKGFiZmQpOwotICBhc2VjdGlvbiAqc2VjOwotICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9udW1iZXI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycDsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQotICBzZWN0aW9uX251bWJlciA9IDE7Ci0KLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICpkID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKTsKLQotICAgICAgZC0+dGhpc19pZHggPSBzZWN0aW9uX251bWJlcisrOwotICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwKQotCWQtPnJlbF9pZHggPSAwOwotICAgICAgZWxzZQotCWQtPnJlbF9pZHggPSBzZWN0aW9uX251bWJlcisrOwotICAgIH0KLQotICB0LT5zaHN0cnRhYl9zZWN0aW9uID0gc2VjdGlvbl9udW1iZXIrKzsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHggPSB0LT5zaHN0cnRhYl9zZWN0aW9uOwotICB0LT5zaHN0cnRhYl9oZHIuc2hfc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKGVsZl9zaHN0cnRhYiAoYWJmZCkpOwotCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCi0gICAgewotICAgICAgdC0+c3ltdGFiX3NlY3Rpb24gPSBzZWN0aW9uX251bWJlcisrOwotICAgICAgdC0+c3RydGFiX3NlY3Rpb24gPSBzZWN0aW9uX251bWJlcisrOwotICAgIH0KLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaG51bSA9IHNlY3Rpb25fbnVtYmVyOwotCi0gIC8qIFNldCB1cCB0aGUgbGlzdCBvZiBzZWN0aW9uIGhlYWRlciBwb2ludGVycywgaW4gYWdyZWVtZW50IHdpdGggdGhlCi0gICAgIGluZGljZXMuICAqLwotICBpX3NoZHJwID0gKChFbGZfSW50ZXJuYWxfU2hkciAqKikKLQkgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2VjdGlvbl9udW1iZXIgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TaGRyICopKSk7Ci0gIGlmIChpX3NoZHJwID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlfc2hkcnBbMF0gPSAoKEVsZl9JbnRlcm5hbF9TaGRyICopCi0JCWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChFbGZfSW50ZXJuYWxfU2hkcikpKTsKLSAgaWYgKGlfc2hkcnBbMF0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgaV9zaGRycCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBtZW1zZXQgKGlfc2hkcnBbMF0sIDAsIHNpemVvZiAoRWxmX0ludGVybmFsX1NoZHIpKTsKLQotICBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpID0gaV9zaGRycDsKLQotICBpX3NoZHJwW3QtPnNoc3RydGFiX3NlY3Rpb25dID0gJnQtPnNoc3RydGFiX2hkcjsKLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKLSAgICB7Ci0gICAgICBpX3NoZHJwW3QtPnN5bXRhYl9zZWN0aW9uXSA9ICZ0LT5zeW10YWJfaGRyOwotICAgICAgaV9zaGRycFt0LT5zdHJ0YWJfc2VjdGlvbl0gPSAmdC0+c3RydGFiX2hkcjsKLSAgICAgIHQtPnN5bXRhYl9oZHIuc2hfbGluayA9IHQtPnN0cnRhYl9zZWN0aW9uOwotICAgIH0KLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICpkID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKTsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotICAgICAgaV9zaGRycFtkLT50aGlzX2lkeF0gPSAmZC0+dGhpc19oZHI7Ci0gICAgICBpZiAoZC0+cmVsX2lkeCAhPSAwKQotCWlfc2hkcnBbZC0+cmVsX2lkeF0gPSAmZC0+cmVsX2hkcjsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgc2hfbGluayBhbmQgc2hfaW5mbyBmaWVsZHMgd2hpbGUgd2UncmUgYXQgaXQuICAqLwotCi0gICAgICAvKiBzaF9saW5rIG9mIGEgcmVsb2Mgc2VjdGlvbiBpcyB0aGUgc2VjdGlvbiBpbmRleCBvZiB0aGUgc3ltYm9sCi0JIHRhYmxlLiAgc2hfaW5mbyBpcyB0aGUgc2VjdGlvbiBpbmRleCBvZiB0aGUgc2VjdGlvbiB0byB3aGljaAotCSB0aGUgcmVsb2NhdGlvbiBlbnRyaWVzIGFwcGx5LiAgKi8KLSAgICAgIGlmIChkLT5yZWxfaWR4ICE9IDApCi0JewotCSAgZC0+cmVsX2hkci5zaF9saW5rID0gdC0+c3ltdGFiX3NlY3Rpb247Ci0JICBkLT5yZWxfaGRyLnNoX2luZm8gPSBkLT50aGlzX2lkeDsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoZC0+dGhpc19oZHIuc2hfdHlwZSkKLQl7Ci0JY2FzZSBTSFRfUkVMOgotCWNhc2UgU0hUX1JFTEE6Ci0JICAvKiBBIHJlbG9jIHNlY3Rpb24gd2hpY2ggd2UgYXJlIHRyZWF0aW5nIGFzIGEgbm9ybWFsIEJGRAotCSAgICAgc2VjdGlvbi4gIHNoX2xpbmsgaXMgdGhlIHNlY3Rpb24gaW5kZXggb2YgdGhlIHN5bWJvbAotCSAgICAgdGFibGUuICBzaF9pbmZvIGlzIHRoZSBzZWN0aW9uIGluZGV4IG9mIHRoZSBzZWN0aW9uIHRvCi0JICAgICB3aGljaCB0aGUgcmVsb2NhdGlvbiBlbnRyaWVzIGFwcGx5LiAgV2UgYXNzdW1lIHRoYXQgYW4KLQkgICAgIGFsbG9jYXRlZCByZWxvYyBzZWN0aW9uIHVzZXMgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotCSAgICAgRklYTUU6IEhvdyBjYW4gd2UgYmUgc3VyZT8gICovCi0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3ltIik7Ci0JICBpZiAocyAhPSBOVUxMKQotCSAgICBkLT50aGlzX2hkci5zaF9saW5rID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCi0JICAvKiBXZSBsb29rIHVwIHRoZSBzZWN0aW9uIHRoZSByZWxvY3MgYXBwbHkgdG8gYnkgbmFtZS4gICovCi0JICBuYW1lID0gc2VjLT5uYW1lOwotCSAgaWYgKGQtPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTCkKLQkgICAgbmFtZSArPSA0OwotCSAgZWxzZQotCSAgICBuYW1lICs9IDU7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCSAgaWYgKHMgIT0gTlVMTCkKLQkgICAgZC0+dGhpc19oZHIuc2hfaW5mbyA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2lkeDsKLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfU1RSVEFCOgotCSAgLyogV2UgYXNzdW1lIHRoYXQgYSBzZWN0aW9uIG5hbWVkIC5zdGFiKnN0ciBpcyBhIHN0YWJzCi0JICAgICBzdHJpbmcgc2VjdGlvbi4gIFdlIGxvb2sgZm9yIGEgc2VjdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUKLQkgICAgIGJ1dCB3aXRob3V0IHRoZSB0cmFpbGluZyBgYHN0cicnLCBhbmQgc2V0IGl0cyBzaF9saW5rCi0JICAgICBmaWVsZCB0byBwb2ludCB0byB0aGlzIHNlY3Rpb24uICAqLwotCSAgaWYgKHN0cm5jbXAgKHNlYy0+bmFtZSwgIi5zdGFiIiwgc2l6ZW9mICIuc3RhYiIgLSAxKSA9PSAwCi0JICAgICAgJiYgc3RyY21wIChzZWMtPm5hbWUgKyBzdHJsZW4gKHNlYy0+bmFtZSkgLSAzLCAic3RyIikgPT0gMCkKLQkgICAgewotCSAgICAgIHNpemVfdCBsZW47Ci0JICAgICAgY2hhciAqYWxjOwotCi0JICAgICAgbGVuID0gc3RybGVuIChzZWMtPm5hbWUpOwotCSAgICAgIGFsYyA9IChjaGFyICopIGJmZF9tYWxsb2MgKGxlbiAtIDIpOwotCSAgICAgIGlmIChhbGMgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHN0cm5jcHkgKGFsYywgc2VjLT5uYW1lLCBsZW4gLSAzKTsKLQkgICAgICBhbGNbbGVuIC0gM10gPSAnXDAnOwotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgYWxjKTsKLQkgICAgICBmcmVlIChhbGMpOwotCSAgICAgIGlmIChzICE9IE5VTEwpCi0JCXsKLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfbGluayA9IGQtPnRoaXNfaWR4OwotCi0JCSAgLyogVGhpcyBpcyBhIC5zdGFiIHNlY3Rpb24uICAqLwotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9lbnRzaXplID0KLQkJICAgIDQgKyAyICogKGJlZC0+cy0+YXJjaF9zaXplIC8gOCk7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9EWU5BTUlDOgotCWNhc2UgU0hUX0RZTlNZTToKLQljYXNlIFNIVF9HTlVfdmVybmVlZDoKLQljYXNlIFNIVF9HTlVfdmVyZGVmOgotCSAgLyogc2hfbGluayBpcyB0aGUgc2VjdGlvbiBoZWFkZXIgaW5kZXggb2YgdGhlIHN0cmluZyB0YWJsZQotCSAgICAgdXNlZCBmb3IgdGhlIGR5bmFtaWMgZW50cmllcywgb3IgdGhlIHN5bWJvbCB0YWJsZSwgb3IgdGhlCi0JICAgICB2ZXJzaW9uIHN0cmluZ3MuICAqLwotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN0ciIpOwotCSAgaWYgKHMgIT0gTlVMTCkKLQkgICAgZC0+dGhpc19oZHIuc2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2lkeDsKLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfSEFTSDoKLQljYXNlIFNIVF9HTlVfdmVyc3ltOgotCSAgLyogc2hfbGluayBpcyB0aGUgc2VjdGlvbiBoZWFkZXIgaW5kZXggb2YgdGhlIHN5bWJvbCB0YWJsZQotCSAgICAgdGhpcyBoYXNoIHRhYmxlIG9yIHZlcnNpb24gdGFibGUgaXMgZm9yLiAgKi8KLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5zeW0iKTsKLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIGQtPnRoaXNfaGRyLnNoX2xpbmsgPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYXAgc3ltYm9sIGZyb20gaXQncyBpbnRlcm5hbCBudW1iZXIgdG8gdGhlIGV4dGVybmFsIG51bWJlciwgbW92aW5nCi0gICBhbGwgbG9jYWwgc3ltYm9scyB0byBiZSBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1zeW1faXNfZ2xvYmFsIChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICAvKiBJZiB0aGUgYmFja2VuZCBoYXMgYSBzcGVjaWFsIG1hcHBpbmcsIHVzZSBpdC4gICovCi0gIGlmIChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwpCi0gICAgcmV0dXJuICgoKmdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCkKLQkgICAgKGFiZmQsIHN5bSkpOwotCi0gIHJldHVybiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkgIT0gMAotCSAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmX21hcF9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBzeW1jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBhc3ltYm9sICoqc3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIGFzeW1ib2wgKipzZWN0X3N5bXM7Ci0gIGludCBudW1fbG9jYWxzID0gMDsKLSAgaW50IG51bV9nbG9iYWxzID0gMDsKLSAgaW50IG51bV9sb2NhbHMyID0gMDsKLSAgaW50IG51bV9nbG9iYWxzMiA9IDA7Ci0gIGludCBtYXhfaW5kZXggPSAwOwotICBpbnQgbnVtX3NlY3Rpb25zID0gMDsKLSAgaW50IGlkeDsKLSAgYXNlY3Rpb24gKmFzZWN0OwotICBhc3ltYm9sICoqbmV3X3N5bXM7Ci0gIGFzeW1ib2wgKnN5bTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgImVsZl9tYXBfc3ltYm9sc1xuIik7Ci0gIGZmbHVzaCAoc3RkZXJyKTsKLSNlbmRpZgotCi0gIC8qIEFkZCBhIHNlY3Rpb24gc3ltYm9sIGZvciBlYWNoIEJGRCBzZWN0aW9uLiAgRklYTUU6IElzIHRoaXMgcmVhbGx5Ci0gICAgIG5lY2Vzc2FyeT8gICovCi0gIGZvciAoYXNlY3QgPSBhYmZkLT5zZWN0aW9uczsgYXNlY3Q7IGFzZWN0ID0gYXNlY3QtPm5leHQpCi0gICAgewotICAgICAgaWYgKG1heF9pbmRleCA8IGFzZWN0LT5pbmRleCkKLQltYXhfaW5kZXggPSBhc2VjdC0+aW5kZXg7Ci0gICAgfQotCi0gIG1heF9pbmRleCsrOwotICBzZWN0X3N5bXMgPSAoYXN5bWJvbCAqKikgYmZkX3phbGxvYyAoYWJmZCwgbWF4X2luZGV4ICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgaWYgKHNlY3Rfc3ltcyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWxmX3NlY3Rpb25fc3ltcyAoYWJmZCkgPSBzZWN0X3N5bXM7Ci0KLSAgZm9yIChpZHggPSAwOyBpZHggPCBzeW1jb3VudDsgaWR4KyspCi0gICAgewotICAgICAgc3ltID0gc3ltc1tpZHhdOwotICAgICAgCi0gICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDAKLQkgICYmIHN5bS0+dmFsdWUgPT0gMCkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICBzZWMgPSBzeW0tPnNlY3Rpb247Ci0KLQkgIGlmIChzZWMtPm93bmVyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoc2VjLT5vd25lciAhPSBhYmZkKQotCQl7Ci0JCSAgaWYgKHNlYy0+b3V0cHV0X29mZnNldCAhPSAwKQotCQkgICAgY29udGludWU7Ci0JCSAgCi0JCSAgc2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQotCQkgIC8qIEVtcHR5IHNlY3Rpb25zIGluIHRoZSBpbnB1dCBmaWxlcyBtYXkgaGF2ZSBoYWQgYSBzZWN0aW9uCi0JCSAgICAgc3ltYm9sIGNyZWF0ZWQgZm9yIHRoZW0uICAoU2VlIHRoZSBjb21tZW50IG5lYXIgdGhlIGVuZCBvZgotCQkgICAgIF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzIGluIGxpbmtlci5jKS4gIElmIHRoZSBsaW5rZXIKLQkJICAgICBzY3JpcHQgZGlzY2FyZHMgc3VjaCBzZWN0aW9ucyB0aGVuIHdlIHdpbGwgcmVhY2ggdGhpcyBwb2ludC4KLQkJICAgICBTaW5jZSB3ZSBrbm93IHRoYXQgd2UgY2Fubm90IGF2b2lkIHRoaXMgY2FzZSwgd2UgZGV0ZWN0IGl0Ci0JCSAgICAgYW5kIHNraXAgdGhlIGFib3J0IGFuZCB0aGUgYXNzaWdubWVudCB0byB0aGUgc2VjdF9zeW1zIGFycmF5LgotCQkgICAgIFRvIHJlcHJvZHVjZSB0aGlzIHBhcnRpY3VsYXIgY2FzZSB0cnkgcnVubmluZyB0aGUgbGlua2VyCi0JCSAgICAgdGVzdHN1aXRlIHRlc3QgbGQtc2NyaXB0cy93ZWFrLmV4cCBmb3IgYW4gRUxGIHBvcnQgdGhhdCB1c2VzCi0JCSAgICAgdGhlIGdlbmVyaWMgbGlua2VyLiAgKi8KLQkJICBpZiAoc2VjLT5vd25lciA9PSBOVUxMKQotCQkgICAgY29udGludWU7Ci0KLQkJICBCRkRfQVNTRVJUIChzZWMtPm93bmVyID09IGFiZmQpOwotCQl9Ci0JICAgICAgc2VjdF9zeW1zW3NlYy0+aW5kZXhdID0gc3ltc1tpZHhdOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBmb3IgKGFzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IGFzZWN0OyBhc2VjdCA9IGFzZWN0LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzZWN0X3N5bXNbYXNlY3QtPmluZGV4XSAhPSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBzeW0gPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICAgICAgaWYgKHN5bSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN5bS0+dGhlX2JmZCA9IGFiZmQ7Ci0gICAgICBzeW0tPm5hbWUgPSBhc2VjdC0+bmFtZTsKLSAgICAgIHN5bS0+dmFsdWUgPSAwOwotICAgICAgLyogU2V0IHRoZSBmbGFncyB0byAwIHRvIGluZGljYXRlIHRoYXQgdGhpcyBvbmUgd2FzIG5ld2x5IGFkZGVkLiAgKi8KLSAgICAgIHN5bS0+ZmxhZ3MgPSAwOwotICAgICAgc3ltLT5zZWN0aW9uID0gYXNlY3Q7Ci0gICAgICBzZWN0X3N5bXNbYXNlY3QtPmluZGV4XSA9IHN5bTsKLSAgICAgIG51bV9zZWN0aW9ucysrOwotI2lmZGVmIERFQlVHCi0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0gXygiY3JlYXRpbmcgc2VjdGlvbiBzeW1ib2wsIG5hbWUgPSAlcywgdmFsdWUgPSAweCUuOGx4LCBpbmRleCA9ICVkLCBzZWN0aW9uID0gMHglLjhseFxuIiksCi0JICAgICAgIGFzZWN0LT5uYW1lLCAobG9uZykgYXNlY3QtPnZtYSwgYXNlY3QtPmluZGV4LCAobG9uZykgYXNlY3QpOwotI2VuZGlmCi0gICAgfQotCi0gIC8qIENsYXNzaWZ5IGFsbCBvZiB0aGUgc3ltYm9scy4gICovCi0gIGZvciAoaWR4ID0gMDsgaWR4IDwgc3ltY291bnQ7IGlkeCsrKQotICAgIHsKLSAgICAgIGlmICghc3ltX2lzX2dsb2JhbCAoYWJmZCwgc3ltc1tpZHhdKSkKLQludW1fbG9jYWxzKys7Ci0gICAgICBlbHNlCi0JbnVtX2dsb2JhbHMrKzsKLSAgICB9Ci0gIGZvciAoYXNlY3QgPSBhYmZkLT5zZWN0aW9uczsgYXNlY3Q7IGFzZWN0ID0gYXNlY3QtPm5leHQpCi0gICAgewotICAgICAgaWYgKHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdICE9IE5VTEwKLQkgICYmIHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdLT5mbGFncyA9PSAwKQotCXsKLQkgIHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdLT5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIGlmICghc3ltX2lzX2dsb2JhbCAoYWJmZCwgc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0pKQotCSAgICBudW1fbG9jYWxzKys7Ci0JICBlbHNlCi0JICAgIG51bV9nbG9iYWxzKys7Ci0JICBzZWN0X3N5bXNbYXNlY3QtPmluZGV4XS0+ZmxhZ3MgPSAwOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IHNvcnQgdGhlIHN5bWJvbHMgc28gdGhlIGxvY2FsIHN5bWJvbHMgYXJlIGZpcnN0LiAgKi8KLSAgbmV3X3N5bXMgPSAoKGFzeW1ib2wgKiopCi0JICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJIChudW1fbG9jYWxzICsgbnVtX2dsb2JhbHMpICogc2l6ZW9mIChhc3ltYm9sICopKSk7Ci0gIGlmIChuZXdfc3ltcyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGlkeCA9IDA7IGlkeCA8IHN5bWNvdW50OyBpZHgrKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW0gPSBzeW1zW2lkeF07Ci0gICAgICBpbnQgaTsKLQotICAgICAgaWYgKCFzeW1faXNfZ2xvYmFsIChhYmZkLCBzeW0pKQotCWkgPSBudW1fbG9jYWxzMisrOwotICAgICAgZWxzZQotCWkgPSBudW1fbG9jYWxzICsgbnVtX2dsb2JhbHMyKys7Ci0gICAgICBuZXdfc3ltc1tpXSA9IHN5bTsKLSAgICAgIHN5bS0+dWRhdGEuaSA9IGkgKyAxOwotICAgIH0KLSAgZm9yIChhc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBhc2VjdDsgYXNlY3QgPSBhc2VjdC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0gIT0gTlVMTAotCSAgJiYgc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0tPmZsYWdzID09IDApCi0JewotCSAgYXN5bWJvbCAqc3ltID0gc2VjdF9zeW1zW2FzZWN0LT5pbmRleF07Ci0JICBpbnQgaTsKLQotCSAgc3ltLT5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIGlmICghc3ltX2lzX2dsb2JhbCAoYWJmZCwgc3ltKSkKLQkgICAgaSA9IG51bV9sb2NhbHMyKys7Ci0JICBlbHNlCi0JICAgIGkgPSBudW1fbG9jYWxzICsgbnVtX2dsb2JhbHMyKys7Ci0JICBuZXdfc3ltc1tpXSA9IHN5bTsKLQkgIHN5bS0+dWRhdGEuaSA9IGkgKyAxOwotCX0KLSAgICB9Ci0KLSAgYmZkX3NldF9zeW10YWIgKGFiZmQsIG5ld19zeW1zLCBudW1fbG9jYWxzICsgbnVtX2dsb2JhbHMpOwotCi0gIGVsZl9udW1fbG9jYWxzIChhYmZkKSA9IG51bV9sb2NhbHM7Ci0gIGVsZl9udW1fZ2xvYmFscyAoYWJmZCkgPSBudW1fZ2xvYmFsczsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFsaWduIHRvIHRoZSBtYXhpbXVtIGZpbGUgYWxpZ25tZW50IHRoYXQgY291bGQgYmUgcmVxdWlyZWQgZm9yIGFueQotICAgRUxGIGRhdGEgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIElOTElORSBmaWxlX3B0ciBhbGlnbl9maWxlX3Bvc2l0aW9uIFBBUkFNUyAoKGZpbGVfcHRyLCBpbnQpKTsKLXN0YXRpYyBJTkxJTkUgZmlsZV9wdHIKLWFsaWduX2ZpbGVfcG9zaXRpb24gKG9mZiwgYWxpZ24pCi0gICAgIGZpbGVfcHRyIG9mZjsKLSAgICAgaW50IGFsaWduOwotewotICByZXR1cm4gKG9mZiArIGFsaWduIC0gMSkgJiB+KGFsaWduIC0gMSk7Ci19Ci0KLS8qIEFzc2lnbiBhIGZpbGUgcG9zaXRpb24gdG8gYSBzZWN0aW9uLCBvcHRpb25hbGx5IGFsaWduaW5nIHRvIHRoZQotICAgcmVxdWlyZWQgc2VjdGlvbiBhbGlnbm1lbnQuICAqLwotCi1JTkxJTkUgZmlsZV9wdHIKLV9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uIChpX3NoZHJwLCBvZmZzZXQsIGFsaWduKQotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaV9zaGRycDsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBib29sZWFuIGFsaWduOwotewotICBpZiAoYWxpZ24pCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGFsOwotCi0gICAgICBhbCA9IGlfc2hkcnAtPnNoX2FkZHJhbGlnbjsKLSAgICAgIGlmIChhbCA+IDEpCi0Jb2Zmc2V0ID0gQkZEX0FMSUdOIChvZmZzZXQsIGFsKTsKLSAgICB9Ci0gIGlfc2hkcnAtPnNoX29mZnNldCA9IG9mZnNldDsKLSAgaWYgKGlfc2hkcnAtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0gICAgaV9zaGRycC0+YmZkX3NlY3Rpb24tPmZpbGVwb3MgPSBvZmZzZXQ7Ci0gIGlmIChpX3NoZHJwLT5zaF90eXBlICE9IFNIVF9OT0JJVFMpCi0gICAgb2Zmc2V0ICs9IGlfc2hkcnAtPnNoX3NpemU7Ci0gIHJldHVybiBvZmZzZXQ7Ci19Ci0KLS8qIENvbXB1dGUgdGhlIGZpbGUgcG9zaXRpb25zIHdlIGFyZSBnb2luZyB0byBwdXQgdGhlIHNlY3Rpb25zIGF0LCBhbmQKLSAgIG90aGVyd2lzZSBwcmVwYXJlIHRvIGJlZ2luIHdyaXRpbmcgb3V0IHRoZSBFTEYgZmlsZS4gIElmIExJTktfSU5GTwotICAgaXMgbm90IE5VTEwsIHRoaXMgaXMgYmVpbmcgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZCBsaW5rZXIuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBib29sZWFuIGZhaWxlZDsKLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RydGFiOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc2hzdHJ0YWJfaGRyOwotCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIERvIGFueSBlbGYgYmFja2VuZCBzcGVjaWZpYyBwcm9jZXNzaW5nIGZpcnN0LiAgKi8KLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZykKLSAgICAoKmJlZC0+ZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZykgKGFiZmQsIGxpbmtfaW5mbyk7Ci0KLSAgaWYgKCEgcHJlcF9oZWFkZXJzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmFpbGVkID0gZmFsc2U7Ci0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgZWxmX2Zha2Vfc2VjdGlvbnMsICZmYWlsZWQpOwotICBpZiAoZmFpbGVkKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoIWFzc2lnbl9zZWN0aW9uX251bWJlcnMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgYmFja2VuZCBsaW5rZXIgYnVpbGRzIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbiBpdHNlbGYuICAqLwotICBpZiAobGlua19pbmZvID09IE5VTEwgJiYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPiAwKQotICAgIHsKLSAgICAgIC8qIE5vbi16ZXJvIGlmIGRvaW5nIGEgcmVsb2NhdGFibGUgbGluay4gICovCi0gICAgICBpbnQgcmVsb2NhdGFibGVfcCA9ICEgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKTsKLQotICAgICAgaWYgKCEgc3dhcF9vdXRfc3ltcyAoYWJmZCwgJnN0cnRhYiwgcmVsb2NhdGFibGVfcCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzaHN0cnRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c2hzdHJ0YWJfaGRyOwotICAvKiBzaF9uYW1lIHdhcyBzZXQgaW4gcHJlcF9oZWFkZXJzLiAgKi8KLSAgc2hzdHJ0YWJfaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKLSAgc2hzdHJ0YWJfaGRyLT5zaF9mbGFncyA9IDA7Ci0gIHNoc3RydGFiX2hkci0+c2hfYWRkciA9IDA7Ci0gIHNoc3RydGFiX2hkci0+c2hfc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKGVsZl9zaHN0cnRhYiAoYWJmZCkpOwotICBzaHN0cnRhYl9oZHItPnNoX2VudHNpemUgPSAwOwotICBzaHN0cnRhYl9oZHItPnNoX2xpbmsgPSAwOwotICBzaHN0cnRhYl9oZHItPnNoX2luZm8gPSAwOwotICAvKiBzaF9vZmZzZXQgaXMgc2V0IGluIGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzLiAgKi8KLSAgc2hzdHJ0YWJfaGRyLT5zaF9hZGRyYWxpZ24gPSAxOwotCi0gIGlmICghYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobGlua19pbmZvID09IE5VTEwgJiYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPiAwKQotICAgIHsKLSAgICAgIGZpbGVfcHRyIG9mZjsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0KLSAgICAgIG9mZiA9IGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3M7Ci0KLSAgICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICAgICAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKGhkciwgb2ZmLCB0cnVlKTsKLQotICAgICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN0cnRhYl9oZHI7Ci0gICAgICBvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoaGRyLCBvZmYsIHRydWUpOwotCi0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zID0gb2ZmOwotCi0gICAgICAvKiBOb3cgdGhhdCB3ZSBrbm93IHdoZXJlIHRoZSAuc3RydGFiIHNlY3Rpb24gZ29lcywgd3JpdGUgaXQKLSAgICAgICAgIG91dC4gICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCBzdHJ0YWIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKHN0cnRhYik7Ci0gICAgfQotCi0gIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgYSBtYXBwaW5nIGZyb20gYSBzZXQgb2Ygc2VjdGlvbnMgdG8gYSBwcm9ncmFtIHNlZ21lbnQuICAqLwotCi1zdGF0aWMgSU5MSU5FIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKgotbWFrZV9tYXBwaW5nIChhYmZkLCBzZWN0aW9ucywgZnJvbSwgdG8sIHBoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLSAgICAgdW5zaWduZWQgaW50IGZyb207Ci0gICAgIHVuc2lnbmVkIGludCB0bzsKLSAgICAgYm9vbGVhbiBwaGRyOwotewotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgYXNlY3Rpb24gKipoZHJwcDsKLQotICBtID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCi0gICAgICAgYmZkX3phbGxvYyAoYWJmZCwKLQkJICAgKHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkKLQkJICAgICsgKHRvIC0gZnJvbSAtIDEpICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpKTsKLSAgaWYgKG0gPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgbS0+bmV4dCA9IE5VTEw7Ci0gIG0tPnBfdHlwZSA9IFBUX0xPQUQ7Ci0gIGZvciAoaSA9IGZyb20sIGhkcnBwID0gc2VjdGlvbnMgKyBmcm9tOyBpIDwgdG87IGkrKywgaGRycHArKykKLSAgICBtLT5zZWN0aW9uc1tpIC0gZnJvbV0gPSAqaGRycHA7Ci0gIG0tPmNvdW50ID0gdG8gLSBmcm9tOwotCi0gIGlmIChmcm9tID09IDAgJiYgcGhkcikKLSAgICB7Ci0gICAgICAvKiBJbmNsdWRlIHRoZSBoZWFkZXJzIGluIHRoZSBmaXJzdCBQVF9MT0FEIHNlZ21lbnQuICAqLwotICAgICAgbS0+aW5jbHVkZXNfZmlsZWhkciA9IDE7Ci0gICAgICBtLT5pbmNsdWRlc19waGRycyA9IDE7Ci0gICAgfQotCi0gIHJldHVybiBtOwotfQotCi0vKiBTZXQgdXAgYSBtYXBwaW5nIGZyb20gQkZEIHNlY3Rpb25zIHRvIHByb2dyYW0gc2VnbWVudHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICoqc2VjdGlvbnMgPSBOVUxMOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbWZpcnN0OwotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICoqcG07Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm07Ci0gIGFzZWN0aW9uICpsYXN0X2hkcjsKLSAgdW5zaWduZWQgaW50IHBoZHJfaW5kZXg7Ci0gIGJmZF92bWEgbWF4cGFnZXNpemU7Ci0gIGFzZWN0aW9uICoqaGRycHA7Ci0gIGJvb2xlYW4gcGhkcl9pbl9zZWdtZW50ID0gdHJ1ZTsKLSAgYm9vbGVhbiB3cml0YWJsZTsKLSAgYXNlY3Rpb24gKmR5bnNlYzsKLQotICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXAgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX2NvdW50X3NlY3Rpb25zIChhYmZkKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFNlbGVjdCB0aGUgYWxsb2NhdGVkIHNlY3Rpb25zLCBhbmQgc29ydCB0aGVtLiAgKi8KLQotICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoYmZkX2NvdW50X3NlY3Rpb25zIChhYmZkKQotCQkJCSAgICAgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICBpZiAoc2VjdGlvbnMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpID0gMDsKLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQl7Ci0JICBzZWN0aW9uc1tpXSA9IHM7Ci0JICArK2k7Ci0JfQotICAgIH0KLSAgQkZEX0FTU0VSVCAoaSA8PSBiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpKTsKLSAgY291bnQgPSBpOwotCi0gIHFzb3J0IChzZWN0aW9ucywgKHNpemVfdCkgY291bnQsIHNpemVvZiAoYXNlY3Rpb24gKiksIGVsZl9zb3J0X3NlY3Rpb25zKTsKLQotICAvKiBCdWlsZCB0aGUgbWFwcGluZy4gICovCi0KLSAgbWZpcnN0ID0gTlVMTDsKLSAgcG0gPSAmbWZpcnN0OwotCi0gIC8qIElmIHdlIGhhdmUgYSAuaW50ZXJwIHNlY3Rpb24sIHRoZW4gY3JlYXRlIGEgUFRfUEhEUiBzZWdtZW50IGZvcgotICAgICB0aGUgcHJvZ3JhbSBoZWFkZXJzIGFuZCBhIFBUX0lOVEVSUCBzZWdtZW50IGZvciB0aGUgLmludGVycAotICAgICBzZWN0aW9uLiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmludGVycCIpOwotICBpZiAocyAhPSBOVUxMICYmIChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwKQotICAgIHsKLSAgICAgIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKLQkgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApKSk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgbS0+bmV4dCA9IE5VTEw7Ci0gICAgICBtLT5wX3R5cGUgPSBQVF9QSERSOwotICAgICAgLyogRklYTUU6IFVuaXhXYXJlIGFuZCBTb2xhcmlzIHNldCBQRl9YLCBJcml4IDUgZG9lcyBub3QuICAqLwotICAgICAgbS0+cF9mbGFncyA9IFBGX1IgfCBQRl9YOwotICAgICAgbS0+cF9mbGFnc192YWxpZCA9IDE7Ci0gICAgICBtLT5pbmNsdWRlc19waGRycyA9IDE7Ci0KLSAgICAgICpwbSA9IG07Ci0gICAgICBwbSA9ICZtLT5uZXh0OwotCi0gICAgICBtID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCi0JICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKSkpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIG0tPm5leHQgPSBOVUxMOwotICAgICAgbS0+cF90eXBlID0gUFRfSU5URVJQOwotICAgICAgbS0+Y291bnQgPSAxOwotICAgICAgbS0+c2VjdGlvbnNbMF0gPSBzOwotCi0gICAgICAqcG0gPSBtOwotICAgICAgcG0gPSAmbS0+bmV4dDsKLSAgICB9Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzZWN0aW9ucy4gIFdlIHB1dCBzZWN0aW9ucyBpbiB0aGUgc2FtZSBwcm9ncmFtCi0gICAgIHNlZ21lbnQgd2hlbiB0aGUgc3RhcnQgb2YgdGhlIHNlY29uZCBzZWN0aW9uIGNhbiBiZSBwbGFjZWQgd2l0aGluCi0gICAgIGEgZmV3IGJ5dGVzIG9mIHRoZSBlbmQgb2YgdGhlIGZpcnN0IHNlY3Rpb24uICAqLwotICBsYXN0X2hkciA9IE5VTEw7Ci0gIHBoZHJfaW5kZXggPSAwOwotICBtYXhwYWdlc2l6ZSA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+bWF4cGFnZXNpemU7Ci0gIHdyaXRhYmxlID0gZmFsc2U7Ci0gIGR5bnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKTsKLSAgaWYgKGR5bnNlYyAhPSBOVUxMCi0gICAgICAmJiAoZHluc2VjLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwKQotICAgIGR5bnNlYyA9IE5VTEw7Ci0KLSAgLyogRGVhbCB3aXRoIC1UdGV4dCBvciBzb21ldGhpbmcgc2ltaWxhciBzdWNoIHRoYXQgdGhlIGZpcnN0IHNlY3Rpb24KLSAgICAgaXMgbm90IGFkamFjZW50IHRvIHRoZSBwcm9ncmFtIGhlYWRlcnMuICBUaGlzIGlzIGFuCi0gICAgIGFwcHJveGltYXRpb24sIHNpbmNlIGF0IHRoaXMgcG9pbnQgd2UgZG9uJ3Qga25vdyBleGFjdGx5IGhvdyBtYW55Ci0gICAgIHByb2dyYW0gaGVhZGVycyB3ZSB3aWxsIG5lZWQuICAqLwotICBpZiAoY291bnQgPiAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgcGhkcl9zaXplOwotCi0gICAgICBwaGRyX3NpemUgPSBlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplOwotICAgICAgaWYgKHBoZHJfc2l6ZSA9PSAwKQotCXBoZHJfc2l6ZSA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX3BoZHI7Ci0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgPT0gMAotCSAgfHwgc2VjdGlvbnNbMF0tPmxtYSA8IHBoZHJfc2l6ZQotCSAgfHwgc2VjdGlvbnNbMF0tPmxtYSAlIG1heHBhZ2VzaXplIDwgcGhkcl9zaXplICUgbWF4cGFnZXNpemUpCi0JcGhkcl9pbl9zZWdtZW50ID0gZmFsc2U7Ci0gICAgfQotCi0gIGZvciAoaSA9IDAsIGhkcnBwID0gc2VjdGlvbnM7IGkgPCBjb3VudDsgaSsrLCBoZHJwcCsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpoZHI7Ci0gICAgICBib29sZWFuIG5ld19zZWdtZW50OwotCi0gICAgICBoZHIgPSAqaGRycHA7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIHNlY3Rpb24gYW5kIHRoZSBsYXN0IG9uZSB3aWxsIGZpdCBpbiB0aGUgc2FtZQotICAgICAgICAgc2VnbWVudC4gICovCi0KLSAgICAgIGlmIChsYXN0X2hkciA9PSBOVUxMKQotCXsKLQkgIC8qIElmIHdlIGRvbid0IGhhdmUgYSBzZWdtZW50IHlldCwgdGhlbiB3ZSBkb24ndCBuZWVkIGEgbmV3Ci0JICAgICBvbmUgKHdlIGJ1aWxkIHRoZSBsYXN0IG9uZSBhZnRlciB0aGlzIGxvb3ApLiAgKi8KLQkgIG5ld19zZWdtZW50ID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZSBpZiAobGFzdF9oZHItPmxtYSAtIGxhc3RfaGRyLT52bWEgIT0gaGRyLT5sbWEgLSBoZHItPnZtYSkKLQl7Ci0JICAvKiBJZiB0aGlzIHNlY3Rpb24gaGFzIGEgZGlmZmVyZW50IHJlbGF0aW9uIGJldHdlZW4gdGhlCi0gICAgICAgICAgICAgdmlydHVhbCBhZGRyZXNzIGFuZCB0aGUgbG9hZCBhZGRyZXNzLCB0aGVuIHdlIG5lZWQgYSBuZXcKLSAgICAgICAgICAgICBzZWdtZW50LiAgKi8KLQkgIG5ld19zZWdtZW50ID0gdHJ1ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChCRkRfQUxJR04gKGxhc3RfaGRyLT5sbWEgKyBsYXN0X2hkci0+X3Jhd19zaXplLCBtYXhwYWdlc2l6ZSkKLQkgICAgICAgPCBCRkRfQUxJR04gKGhkci0+bG1hLCBtYXhwYWdlc2l6ZSkpCi0JewotCSAgLyogSWYgcHV0dGluZyB0aGlzIHNlY3Rpb24gaW4gdGhpcyBzZWdtZW50IHdvdWxkIGZvcmNlIHVzIHRvCi0gICAgICAgICAgICAgc2tpcCBhIHBhZ2UgaW4gdGhlIHNlZ21lbnQsIHRoZW4gd2UgbmVlZCBhIG5ldyBzZWdtZW50LiAgKi8KLQkgIG5ld19zZWdtZW50ID0gdHJ1ZTsKLQl9Ci0gICAgICBlbHNlIGlmICgobGFzdF9oZHItPmZsYWdzICYgU0VDX0xPQUQpID09IDAKLQkgICAgICAgJiYgKGhkci0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLQl7Ci0JICAvKiBXZSBkb24ndCB3YW50IHRvIHB1dCBhIGxvYWRhYmxlIHNlY3Rpb24gYWZ0ZXIgYQotICAgICAgICAgICAgIG5vbmxvYWRhYmxlIHNlY3Rpb24gaW4gdGhlIHNhbWUgc2VnbWVudC4gICovCi0JICBuZXdfc2VnbWVudCA9IHRydWU7Ci0JfQotICAgICAgZWxzZSBpZiAoKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgPT0gMCkKLQl7Ci0JICAvKiBJZiB0aGUgZmlsZSBpcyBub3QgZGVtYW5kIHBhZ2VkLCB3aGljaCBtZWFucyB0aGF0IHdlCi0gICAgICAgICAgICAgZG9uJ3QgcmVxdWlyZSB0aGUgc2VjdGlvbnMgdG8gYmUgY29ycmVjdGx5IGFsaWduZWQgaW4gdGhlCi0gICAgICAgICAgICAgZmlsZSwgdGhlbiB0aGVyZSBpcyBubyBvdGhlciByZWFzb24gZm9yIGEgbmV3IHNlZ21lbnQuICAqLwotCSAgbmV3X3NlZ21lbnQgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlIGlmICghIHdyaXRhYmxlCi0JICAgICAgICYmIChoZHItPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwCi0JICAgICAgICYmIChCRkRfQUxJR04gKGxhc3RfaGRyLT5sbWEgKyBsYXN0X2hkci0+X3Jhd19zaXplLCBtYXhwYWdlc2l6ZSkKLQkJICAgPT0gaGRyLT5sbWEpKQotCXsKLQkgIC8qIFdlIGRvbid0IHdhbnQgdG8gcHV0IGEgd3JpdGFibGUgc2VjdGlvbiBpbiBhIHJlYWQgb25seQotICAgICAgICAgICAgIHNlZ21lbnQsIHVubGVzcyB0aGV5IGFyZSBvbiB0aGUgc2FtZSBwYWdlIGluIG1lbW9yeQotICAgICAgICAgICAgIGFueWhvdy4gIFdlIGFscmVhZHkga25vdyB0aGF0IHRoZSBsYXN0IHNlY3Rpb24gZG9lcyBub3QKLSAgICAgICAgICAgICBicmluZyB1cyBwYXN0IHRoZSBjdXJyZW50IHNlY3Rpb24gb24gdGhlIHBhZ2UsIHNvIHRoZQotICAgICAgICAgICAgIG9ubHkgY2FzZSBpbiB3aGljaCB0aGUgbmV3IHNlY3Rpb24gaXMgbm90IG9uIHRoZSBzYW1lCi0gICAgICAgICAgICAgcGFnZSBhcyB0aGUgcHJldmlvdXMgc2VjdGlvbiBpcyB3aGVuIHRoZSBwcmV2aW91cyBzZWN0aW9uCi0gICAgICAgICAgICAgZW5kcyBwcmVjaXNlbHkgb24gYSBwYWdlIGJvdW5kYXJ5LiAgKi8KLQkgIG5ld19zZWdtZW50ID0gdHJ1ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogT3RoZXJ3aXNlLCB3ZSBjYW4gdXNlIHRoZSBzYW1lIHNlZ21lbnQuICAqLwotCSAgbmV3X3NlZ21lbnQgPSBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIG5ld19zZWdtZW50KQotCXsKLQkgIGlmICgoaGRyLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMCkKLQkgICAgd3JpdGFibGUgPSB0cnVlOwotCSAgbGFzdF9oZHIgPSBoZHI7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFdlIG5lZWQgYSBuZXcgcHJvZ3JhbSBzZWdtZW50LiAgV2UgbXVzdCBjcmVhdGUgYSBuZXcgcHJvZ3JhbQotICAgICAgICAgaGVhZGVyIGhvbGRpbmcgYWxsIHRoZSBzZWN0aW9ucyBmcm9tIHBoZHJfaW5kZXggdW50aWwgaGRyLiAgKi8KLQotICAgICAgbSA9IG1ha2VfbWFwcGluZyAoYWJmZCwgc2VjdGlvbnMsIHBoZHJfaW5kZXgsIGksIHBoZHJfaW5fc2VnbWVudCk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAqcG0gPSBtOwotICAgICAgcG0gPSAmbS0+bmV4dDsKLQotICAgICAgaWYgKChoZHItPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQotCXdyaXRhYmxlID0gdHJ1ZTsKLSAgICAgIGVsc2UKLQl3cml0YWJsZSA9IGZhbHNlOwotCi0gICAgICBsYXN0X2hkciA9IGhkcjsKLSAgICAgIHBoZHJfaW5kZXggPSBpOwotICAgICAgcGhkcl9pbl9zZWdtZW50ID0gZmFsc2U7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhIGZpbmFsIFBUX0xPQUQgcHJvZ3JhbSBzZWdtZW50LiAgKi8KLSAgaWYgKGxhc3RfaGRyICE9IE5VTEwpCi0gICAgewotICAgICAgbSA9IG1ha2VfbWFwcGluZyAoYWJmZCwgc2VjdGlvbnMsIHBoZHJfaW5kZXgsIGksIHBoZHJfaW5fc2VnbWVudCk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAqcG0gPSBtOwotICAgICAgcG0gPSAmbS0+bmV4dDsKLSAgICB9Ci0KLSAgLyogSWYgdGhlcmUgaXMgYSAuZHluYW1pYyBzZWN0aW9uLCB0aHJvdyBpbiBhIFBUX0RZTkFNSUMgc2VnbWVudC4gICovCi0gIGlmIChkeW5zZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBtID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCi0JICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKSkpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIG0tPm5leHQgPSBOVUxMOwotICAgICAgbS0+cF90eXBlID0gUFRfRFlOQU1JQzsKLSAgICAgIG0tPmNvdW50ID0gMTsKLSAgICAgIG0tPnNlY3Rpb25zWzBdID0gZHluc2VjOwotCi0gICAgICAqcG0gPSBtOwotICAgICAgcG0gPSAmbS0+bmV4dDsKLSAgICB9Ci0KLSAgLyogRm9yIGVhY2ggbG9hZGFibGUgLm5vdGUgc2VjdGlvbiwgYWRkIGEgUFRfTk9URSBzZWdtZW50LiAgV2UgZG9uJ3QKLSAgICAgdXNlIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lLCBiZWNhdXNlIGlmIHdlIGxpbmsgdG9nZXRoZXIKLSAgICAgbm9ubG9hZGFibGUgLm5vdGUgc2VjdGlvbnMgYW5kIGxvYWRhYmxlIC5ub3RlIHNlY3Rpb25zLCB3ZSB3aWxsCi0gICAgIGdlbmVyYXRlIHR3byAubm90ZSBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0IGZpbGUuICBGSVhNRTogVXNpbmcKLSAgICAgbmFtZXMgZm9yIHNlY3Rpb24gdHlwZXMgaXMgYm9ndXMgYW55aG93LiAgKi8KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwCi0JICAmJiBzdHJuY21wIChzLT5uYW1lLCAiLm5vdGUiLCA1KSA9PSAwKQotCXsKLQkgIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKLQkgICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKSkpOwotCSAgaWYgKG0gPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBtLT5uZXh0ID0gTlVMTDsKLQkgIG0tPnBfdHlwZSA9IFBUX05PVEU7Ci0JICBtLT5jb3VudCA9IDE7Ci0JICBtLT5zZWN0aW9uc1swXSA9IHM7Ci0KLQkgICpwbSA9IG07Ci0JICBwbSA9ICZtLT5uZXh0OwotCX0KLSAgICB9Ci0KLSAgZnJlZSAoc2VjdGlvbnMpOwotICBzZWN0aW9ucyA9IE5VTEw7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXAgPSBtZmlyc3Q7Ci0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU29ydCBzZWN0aW9ucyBieSBhZGRyZXNzLiAgKi8KLQotc3RhdGljIGludAotZWxmX3NvcnRfc2VjdGlvbnMgKGFyZzEsIGFyZzIpCi0gICAgIGNvbnN0IFBUUiBhcmcxOwotICAgICBjb25zdCBQVFIgYXJnMjsKLXsKLSAgY29uc3QgYXNlY3Rpb24gKnNlYzEgPSAqKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcxOwotICBjb25zdCBhc2VjdGlvbiAqc2VjMiA9ICooY29uc3QgYXNlY3Rpb24gKiopIGFyZzI7Ci0KLSAgLyogU29ydCBieSBMTUEgZmlyc3QsIHNpbmNlIHRoaXMgaXMgdGhlIGFkZHJlc3MgdXNlZCB0bwotICAgICBwbGFjZSB0aGUgc2VjdGlvbiBpbnRvIGEgc2VnbWVudC4gICovCi0gIGlmIChzZWMxLT5sbWEgPCBzZWMyLT5sbWEpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmIChzZWMxLT5sbWEgPiBzZWMyLT5sbWEpCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogVGhlbiBzb3J0IGJ5IFZNQS4gIE5vcm1hbGx5IHRoZSBMTUEgYW5kIHRoZSBWTUEgd2lsbCBiZQotICAgICB0aGUgc2FtZSwgYW5kIHRoaXMgd2lsbCBkbyBub3RoaW5nLiAgKi8KLSAgaWYgKHNlYzEtPnZtYSA8IHNlYzItPnZtYSkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKHNlYzEtPnZtYSA+IHNlYzItPnZtYSkKLSAgICByZXR1cm4gMTsKLQotICAvKiBQdXQgIVNFQ19MT0FEIHNlY3Rpb25zIGFmdGVyIFNFQ19MT0FEIG9uZXMuICAqLwotCi0jZGVmaW5lIFRPRU5EKHgpICgoKHgpLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwKQotCi0gIGlmIChUT0VORCAoc2VjMSkpCi0gICAgewotICAgICAgaWYgKFRPRU5EIChzZWMyKSkKLQlyZXR1cm4gc2VjMS0+dGFyZ2V0X2luZGV4IC0gc2VjMi0+dGFyZ2V0X2luZGV4OwotICAgICAgZWxzZQotCXJldHVybiAxOwotICAgIH0KLQotICBpZiAoVE9FTkQgKHNlYzIpKQotICAgIHJldHVybiAtMTsKLQotI3VuZGVmIFRPRU5ECi0KLSAgLyogU29ydCBieSBzaXplLCB0byBwdXQgemVybyBzaXplZCBzZWN0aW9ucyBiZWZvcmUgb3RoZXJzIGF0IHRoZQotICAgICBzYW1lIGFkZHJlc3MuICAqLwotCi0gIGlmIChzZWMxLT5fcmF3X3NpemUgPCBzZWMyLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoc2VjMS0+X3Jhd19zaXplID4gc2VjMi0+X3Jhd19zaXplKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiBzZWMxLT50YXJnZXRfaW5kZXggLSBzZWMyLT50YXJnZXRfaW5kZXg7Ci19Ci0KLS8qIEFzc2lnbiBmaWxlIHBvc2l0aW9ucyB0byB0aGUgc2VjdGlvbnMgYmFzZWQgb24gdGhlIG1hcHBpbmcgZnJvbQotICAgc2VjdGlvbnMgdG8gc2VnbWVudHMuICBUaGlzIGZ1bmN0aW9uIGFsc28gc2V0cyB1cCBzb21lIGZpZWxkcyBpbgotICAgdGhlIGZpbGUgaGVhZGVyLCBhbmQgd3JpdGVzIG91dCB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3Qgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptOwotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0gIEVsZl9JbnRlcm5hbF9QaGRyICpwaGRyczsKLSAgZmlsZV9wdHIgb2ZmLCB2b2ZmOwotICBiZmRfdm1hIGZpbGVoZHJfdmFkZHIsIGZpbGVoZHJfcGFkZHI7Ci0gIGJmZF92bWEgcGhkcnNfdmFkZHIsIHBoZHJzX3BhZGRyOwotICBFbGZfSW50ZXJuYWxfUGhkciAqcDsKLQotICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXAgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwKQotICAgIHsKLSAgICAgIGlmICghICgqYmVkLT5lbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXApIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGNvdW50ID0gMDsKLSAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0gICAgKytjb3VudDsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9waG9mZiA9IGJlZC0+cy0+c2l6ZW9mX2VoZHI7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BoZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3BoZHI7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BobnVtID0gY291bnQ7Ci0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgd2UgYWxyZWFkeSBjb3VudGVkIHRoZSBudW1iZXIgb2YgcHJvZ3JhbSBzZWdtZW50cywgbWFrZSBzdXJlCi0gICAgIHRoYXQgd2UgYWxsb2NhdGVkIGVub3VnaCBzcGFjZS4gIFRoaXMgaGFwcGVucyB3aGVuIFNJWkVPRl9IRUFERVJTCi0gICAgIGlzIHVzZWQgaW4gYSBsaW5rZXIgc2NyaXB0LiAgKi8KLSAgYWxsb2MgPSBlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplIC8gYmVkLT5zLT5zaXplb2ZfcGhkcjsKLSAgaWYgKGFsbG9jICE9IDAgJiYgY291bnQgPiBhbGxvYykKLSAgICB7Ci0gICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgKF8oIiVzOiBOb3QgZW5vdWdoIHJvb20gZm9yIHByb2dyYW0gaGVhZGVycyAoYWxsb2NhdGVkICV1LCBuZWVkICV1KSIpLAotCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBhbGxvYywgY291bnQpKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYWxsb2MgPT0gMCkKLSAgICBhbGxvYyA9IGNvdW50OwotCi0gIHBoZHJzID0gKChFbGZfSW50ZXJuYWxfUGhkciAqKQotCSAgIGJmZF9hbGxvYyAoYWJmZCwgYWxsb2MgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9QaGRyKSkpOwotICBpZiAocGhkcnMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgb2ZmID0gYmVkLT5zLT5zaXplb2ZfZWhkcjsKLSAgb2ZmICs9IGFsbG9jICogYmVkLT5zLT5zaXplb2ZfcGhkcjsKLQotICBmaWxlaGRyX3ZhZGRyID0gMDsKLSAgZmlsZWhkcl9wYWRkciA9IDA7Ci0gIHBoZHJzX3ZhZGRyID0gMDsKLSAgcGhkcnNfcGFkZHIgPSAwOwotCi0gIGZvciAobSA9IGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwLCBwID0gcGhkcnM7Ci0gICAgICAgbSAhPSBOVUxMOwotICAgICAgIG0gPSBtLT5uZXh0LCBwKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBhc2VjdGlvbiAqKnNlY3BwOwotCi0gICAgICAvKiBJZiBlbGZfc2VnbWVudF9tYXAgaXMgbm90IGZyb20gbWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzLCB0aGUKLSAgICAgICAgIHNlY3Rpb25zIG1heSBub3QgYmUgY29ycmVjdGx5IG9yZGVyZWQuICAqLwotICAgICAgaWYgKG0tPmNvdW50ID4gMCkKLQlxc29ydCAobS0+c2VjdGlvbnMsIChzaXplX3QpIG0tPmNvdW50LCBzaXplb2YgKGFzZWN0aW9uICopLAotCSAgICAgICBlbGZfc29ydF9zZWN0aW9ucyk7Ci0KLSAgICAgIHAtPnBfdHlwZSA9IG0tPnBfdHlwZTsKLQotICAgICAgaWYgKG0tPnBfZmxhZ3NfdmFsaWQpCi0JcC0+cF9mbGFncyA9IG0tPnBfZmxhZ3M7Ci0gICAgICBlbHNlCi0JcC0+cF9mbGFncyA9IDA7Ci0KLSAgICAgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRAotCSAgJiYgbS0+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+ZXZfY3VycmVudDsKLQotICBmb3IgKGNvdW50ID0gRUlfUEFEOyBjb3VudCA8IEVJX05JREVOVDsgY291bnQrKykKLSAgICBpX2VoZHJwLT5lX2lkZW50W2NvdW50XSA9IDA7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgaV9laGRycC0+ZV90eXBlID0gRVRfRFlOOwotICBlbHNlIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApICE9IDApCi0gICAgaV9laGRycC0+ZV90eXBlID0gRVRfRVhFQzsKLSAgZWxzZSBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9jb3JlKQotICAgIGlfZWhkcnAtPmVfdHlwZSA9IEVUX0NPUkU7Ci0gIGVsc2UKLSAgICBpX2VoZHJwLT5lX3R5cGUgPSBFVF9SRUw7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX3Vua25vd246Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9OT05FOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgIGlmIChiZWQtPnMtPmFyY2hfc2l6ZSA9PSA2NCkKLQlpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9TUEFSQ1Y5OwotICAgICAgZWxzZQotCWlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1NQQVJDOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fMzg2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fNjhLOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9tODhrOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fODhLOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pODYwOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fODYwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9taXBzOgkvKiBNSVBTIFJ4eHh4ICovCi0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9NSVBTOwkvKiBvbmx5IE1JUFMgUjMwMDAgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfaHBwYToKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1BBUklTQzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1BQQzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9BTFBIQTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfc2g6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9TSDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfZDEwdjoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0NZR05VU19EMTBWOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9kMzB2OgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX0QzMFY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX2ZyMzA6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfRlIzMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfbWNvcmU6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9NQ09SRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfdjg1MDoKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIDA6ICAgICAgICAgICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX1Y4NTA7IGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgY2FzZSBiZmRfYXJjaF9hcmM6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfQVJDOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIGJmZF9hcmNoX2FybToKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0FSTTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfbTMycjoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0NZR05VU19NMzJSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9tbjEwMjAwOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX01OMTAyMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX21uMTAzMDA6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfTU4xMDMwMDsKLSAgICAgIGJyZWFrOwotICAgICAgLyogYWxzbyBub3RlIHRoYXQgRU1fTTMyLCBBVCZUIFdFMzIxMDAgaXMgdW5rbm93biB0byBiZmQgKi8KLSAgICBkZWZhdWx0OgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fTk9ORTsKLSAgICB9Ci0gIGlfZWhkcnAtPmVfdmVyc2lvbiA9IGJlZC0+cy0+ZXZfY3VycmVudDsKLSAgaV9laGRycC0+ZV9laHNpemUgPSBiZWQtPnMtPnNpemVvZl9laGRyOwotCi0gIC8qIG5vIHByb2dyYW0gaGVhZGVyLCBmb3Igbm93LiAqLwotICBpX2VoZHJwLT5lX3Bob2ZmID0gMDsKLSAgaV9laGRycC0+ZV9waGVudHNpemUgPSAwOwotICBpX2VoZHJwLT5lX3BobnVtID0gMDsKLQotICAvKiBlYWNoIGJmZCBzZWN0aW9uIGlzIHNlY3Rpb24gaGVhZGVyIGVudHJ5ICovCi0gIGlfZWhkcnAtPmVfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICBpX2VoZHJwLT5lX3NoZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3NoZHI7Ci0KLSAgLyogaWYgd2UncmUgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSwgd2UnbGwgbmVlZCBhIHByb2dyYW0gaGVhZGVyIHRhYmxlICovCi0gIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICB7Ci0gICAgICAvKiBpdCBhbGwgaGFwcGVucyBsYXRlciAqLwotI2lmIDAKLSAgICAgIGlfZWhkcnAtPmVfcGhlbnRzaXplID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUGhkcik7Ci0KLSAgICAgIC8qIGVsZl9idWlsZF9waGRycygpIHJldHVybnMgYSAoTlVMTC10ZXJtaW5hdGVkKSBhcnJheSBvZgotCSBFbGZfSW50ZXJuYWxfUGhkcnMgKi8KLSAgICAgIGlfcGhkcnAgPSBlbGZfYnVpbGRfcGhkcnMgKGFiZmQsIGlfZWhkcnAsIGlfc2hkcnAsICZpX2VoZHJwLT5lX3BobnVtKTsKLSAgICAgIGlfZWhkcnAtPmVfcGhvZmYgPSBvdXRiYXNlOwotICAgICAgb3V0YmFzZSArPSBpX2VoZHJwLT5lX3BoZW50c2l6ZSAqIGlfZWhkcnAtPmVfcGhudW07Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpX2VoZHJwLT5lX3BoZW50c2l6ZSA9IDA7Ci0gICAgICBpX3BoZHJwID0gMDsKLSAgICAgIGlfZWhkcnAtPmVfcGhvZmYgPSAwOwotICAgIH0KLQotICBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyLnNoX25hbWUgPQotICAgICh1bnNpZ25lZCBpbnQpIF9iZmRfc3RyaW5ndGFiX2FkZCAoc2hzdHJ0YWIsICIuc3ltdGFiIiwgdHJ1ZSwgZmFsc2UpOwotICBlbGZfdGRhdGEgKGFiZmQpLT5zdHJ0YWJfaGRyLnNoX25hbWUgPQotICAgICh1bnNpZ25lZCBpbnQpIF9iZmRfc3RyaW5ndGFiX2FkZCAoc2hzdHJ0YWIsICIuc3RydGFiIiwgdHJ1ZSwgZmFsc2UpOwotICBlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHIuc2hfbmFtZSA9Ci0gICAgKHVuc2lnbmVkIGludCkgX2JmZF9zdHJpbmd0YWJfYWRkIChzaHN0cnRhYiwgIi5zaHN0cnRhYiIsIHRydWUsIGZhbHNlKTsKLSAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIuc2hfbmFtZSA9PSAodW5zaWduZWQgaW50KSAtMQotICAgICAgfHwgZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkci5zaF9uYW1lID09ICh1bnNpZ25lZCBpbnQpIC0xCi0gICAgICB8fCBlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHIuc2hfbmFtZSA9PSAodW5zaWduZWQgaW50KSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFzc2lnbiBmaWxlIHBvc2l0aW9ucyBmb3IgYWxsIHRoZSByZWxvYyBzZWN0aW9ucyB3aGljaCBhcmUgbm90IHBhcnQKLSAgIG9mIHRoZSBsb2FkYWJsZSBmaWxlIGltYWdlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZmlsZV9wdHIgb2ZmOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKipzaGRycHA7Ci0KLSAgb2ZmID0gZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvczsKLQotICBmb3IgKGkgPSAxLCBzaGRycHAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpICsgMTsKLSAgICAgICBpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW07Ci0gICAgICAgaSsrLCBzaGRycHArKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc2hkcnA7Ci0KLSAgICAgIHNoZHJwID0gKnNoZHJwcDsKLSAgICAgIGlmICgoc2hkcnAtPnNoX3R5cGUgPT0gU0hUX1JFTCB8fCBzaGRycC0+c2hfdHlwZSA9PSBTSFRfUkVMQSkKLQkgICYmIHNoZHJwLT5zaF9vZmZzZXQgPT0gLTEpCi0Jb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKHNoZHJwLCBvZmYsIHRydWUpOwotICAgIH0KLQotICBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zID0gb2ZmOwotfQotCi1ib29sZWFuCi1fYmZkX2VsZl93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgRWxmX0ludGVybmFsX0VoZHIgKmlfZWhkcnA7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycDsKLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLQotICBpZiAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuCi0gICAgICAmJiAhIF9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucwotICAgICAgICAgICAgIChhYmZkLCAoc3RydWN0IGJmZF9saW5rX2luZm8gKikgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoYWJmZCk7Ci0KLSAgZmFpbGVkID0gZmFsc2U7Ci0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgYmVkLT5zLT53cml0ZV9yZWxvY3MsICZmYWlsZWQpOwotICBpZiAoZmFpbGVkKQotICAgIHJldHVybiBmYWxzZTsKLQotICBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyAoYWJmZCk7Ci0KLSAgLyogQWZ0ZXIgd3JpdGluZyB0aGUgaGVhZGVycywgd2UgbmVlZCB0byB3cml0ZSB0aGUgc2VjdGlvbnMgdG9vLi4uICovCi0gIGZvciAoY291bnQgPSAxOyBjb3VudCA8IGlfZWhkcnAtPmVfc2hudW07IGNvdW50KyspCi0gICAgewotICAgICAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nKQotCSgqYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcpIChhYmZkLCBpX3NoZHJwW2NvdW50XSk7Ci0gICAgICBpZiAoaV9zaGRycFtjb3VudF0tPmNvbnRlbnRzKQotCXsKLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgaV9zaGRycFtjb3VudF0tPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3dyaXRlIChpX3NoZHJwW2NvdW50XS0+Y29udGVudHMsIGlfc2hkcnBbY291bnRdLT5zaF9zaXplLAotCQkJICAgICAxLCBhYmZkKQotCQkgICE9IGlfc2hkcnBbY291bnRdLT5zaF9zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzZWN0aW9uIGhlYWRlciBuYW1lcy4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgZWxmX3RkYXRhIChhYmZkKS0+c2hzdHJ0YWJfaGRyLnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8ICEgX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgZWxmX3Noc3RydGFiIChhYmZkKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZWQtPmVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpCi0gICAgKCpiZWQtPmVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpIChhYmZkLAotCQkJCQkJZWxmX3RkYXRhIChhYmZkKS0+bGlua2VyKTsKLQotICByZXR1cm4gYmVkLT5zLT53cml0ZV9zaGRyc19hbmRfZWhkciAoYWJmZCk7Ci19Ci0KLWJvb2xlYW4KLV9iZmRfZWxmX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIEhvcGVmdWxseSB0aGlzIGNhbiBiZSBkb25lIGp1c3QgbGlrZSBhbiBvYmplY3QgZmlsZS4gKi8KLSAgcmV0dXJuIF9iZmRfZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCk7Ci19Ci0vKiBnaXZlbiBhIHNlY3Rpb24sIHNlYXJjaCB0aGUgaGVhZGVyIHRvIGZpbmQgdGhlbS4uLiAqLwotaW50Ci1fYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzZWMgKmFzZWN0OwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBpbnQgaW5kZXg7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gIGludCBtYXhpbmRleCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtOwotCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1heGluZGV4OyBpbmRleCsrKQotICAgIHsKLSAgICAgIGhkciA9IGlfc2hkcnBbaW5kZXhdOwotICAgICAgaWYgKGhkci0+YmZkX3NlY3Rpb24gPT0gYXNlY3QpCi0JcmV0dXJuIGluZGV4OwotICAgIH0KLQotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pCi0gICAgewotICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbWF4aW5kZXg7IGluZGV4KyspCi0JewotCSAgaW50IHJldHZhbDsKLQotCSAgaGRyID0gaV9zaGRycFtpbmRleF07Ci0JICByZXR2YWwgPSBpbmRleDsKLQkgIGlmICgoKmJlZC0+ZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKQotCSAgICAgIChhYmZkLCBoZHIsIGFzZWN0LCAmcmV0dmFsKSkKLQkgICAgcmV0dXJuIHJldHZhbDsKLQl9Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGFzZWN0KSkKLSAgICByZXR1cm4gU0hOX0FCUzsKLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoYXNlY3QpKQotICAgIHJldHVybiBTSE5fQ09NTU9OOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChhc2VjdCkpCi0gICAgcmV0dXJuIFNITl9VTkRFRjsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLQotICByZXR1cm4gLTE7Ci19Ci0KLS8qIEdpdmVuIGEgQkZEIHN5bWJvbCwgcmV0dXJuIHRoZSBpbmRleCBpbiB0aGUgRUxGIHN5bWJvbCB0YWJsZSwgb3IgLTEKLSAgIG9uIGVycm9yLiAgKi8KLQotaW50Ci1fYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIChhYmZkLCBhc3ltX3B0cl9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFzeW1fcHRyX3B0cjsKLXsKLSAgYXN5bWJvbCAqYXN5bV9wdHIgPSAqYXN5bV9wdHJfcHRyOwotICBpbnQgaWR4OwotICBmbGFnd29yZCBmbGFncyA9IGFzeW1fcHRyLT5mbGFnczsKLQotICAvKiBXaGVuIGdhcyBjcmVhdGVzIHJlbG9jYXRpb25zIGFnYWluc3QgbG9jYWwgbGFiZWxzLCBpdCBjcmVhdGVzIGl0cwotICAgICBvd24gc3ltYm9sIGZvciB0aGUgc2VjdGlvbiwgYnV0IGRvZXMgcHV0IHRoZSBzeW1ib2wgaW50byB0aGUKLSAgICAgc3ltYm9sIGNoYWluLCBzbyB1ZGF0YSBpcyAwLiAgV2hlbiB0aGUgbGlua2VyIGlzIGdlbmVyYXRpbmcKLSAgICAgcmVsb2NhdGFibGUgb3V0cHV0LCB0aGlzIHNlY3Rpb24gc3ltYm9sIG1heSBiZSBmb3Igb25lIG9mIHRoZQotICAgICBpbnB1dCBzZWN0aW9ucyByYXRoZXIgdGhhbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotICBpZiAoYXN5bV9wdHItPnVkYXRhLmkgPT0gMAotICAgICAgJiYgKGZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotICAgICAgJiYgYXN5bV9wdHItPnNlY3Rpb24pCi0gICAgewotICAgICAgaW50IGluZHg7Ci0KLSAgICAgIGlmIChhc3ltX3B0ci0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQlpbmR4ID0gYXN5bV9wdHItPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5pbmRleDsKLSAgICAgIGVsc2UKLQlpbmR4ID0gYXN5bV9wdHItPnNlY3Rpb24tPmluZGV4OwotICAgICAgaWYgKGVsZl9zZWN0aW9uX3N5bXMgKGFiZmQpW2luZHhdKQotCWFzeW1fcHRyLT51ZGF0YS5pID0gZWxmX3NlY3Rpb25fc3ltcyAoYWJmZClbaW5keF0tPnVkYXRhLmk7Ci0gICAgfQotCi0gIGlkeCA9IGFzeW1fcHRyLT51ZGF0YS5pOwotCi0gIGlmIChpZHggPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIHdoZW4gdXNpbmcgLS1zdHJpcC1zeW1ib2wgb24gYSBzeW1ib2wKLSAgICAgICAgIHdoaWNoIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uIGVudHJ5LiAgKi8KLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogc3ltYm9sIGAlcycgcmVxdWlyZWQgYnV0IG5vdCBwcmVzZW50IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBiZmRfYXN5bWJvbF9uYW1lIChhc3ltX3B0cikpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotI2lmIERFQlVHICYgNAotICB7Ci0gICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgXygiZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgMHglLjhseCwgbmFtZSA9ICVzLCBzeW0gbnVtID0gJWQsIGZsYWdzID0gMHglLjhseCVzXG4iKSwKLQkgICAgIChsb25nKSBhc3ltX3B0ciwgYXN5bV9wdHItPm5hbWUsIGlkeCwgZmxhZ3MsCi0JICAgICBlbGZfc3ltYm9sX2ZsYWdzIChmbGFncykpOwotICAgIGZmbHVzaCAoc3RkZXJyKTsKLSAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogQ29weSBwcml2YXRlIEJGRCBkYXRhLiAgVGhpcyBjb3BpZXMgYW55IHByb2dyYW0gaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9FaGRyICppZWhkcjsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbWZpcnN0OwotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICoqcG07Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm07Ci0gIEVsZl9JbnRlcm5hbF9QaGRyICpwOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IG51bV9zZWdtZW50czsKLSAgYm9vbGVhbiBwaGRyX2luY2x1ZGVkID0gZmFsc2U7Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChlbGZfdGRhdGEgKGliZmQpLT5waGRyID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWVoZHIgPSBlbGZfZWxmaGVhZGVyIChpYmZkKTsKLQotICBtZmlyc3QgPSBOVUxMOwotICBwbSA9ICZtZmlyc3Q7Ci0KLSAgbnVtX3NlZ21lbnRzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfcGhudW07Ci0KLSNkZWZpbmUgSVNfQ09OVEFJTkVEX0JZKGFkZHIsIGxlbiwgYm90dG9tLCBwaGRyKQkJIAlcCi0JICAoKGFkZHIpID49IChib3R0b20pCQkJCSAJICAJXAotCSAgICYmICggICAoKGFkZHIpICsgKGxlbikpIDw9ICgoYm90dG9tKSArIChwaGRyKS0+cF9tZW1zeikJXAotCSAgICAgICB8fCAoKGFkZHIpICsgKGxlbikpIDw9ICgoYm90dG9tKSArIChwaGRyKS0+cF9maWxlc3opKSkKLQotICAvKiBTcGVjaWFsIGNhc2U6IGNvcmVmaWxlICJOT1RFIiBzZWN0aW9uIGNvbnRhaW5pbmcgcmVncywgcHJwc2luZm8gZXRjLiAqLwotCi0jZGVmaW5lIElTX0NPUkVGSUxFX05PVEUocCwgcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIChwLT5wX3R5cGUgPT0gUFRfTk9URSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgICYmIGJmZF9nZXRfZm9ybWF0IChpYmZkKSA9PSBiZmRfY29yZSAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAgJiYgcy0+dm1hID09IDAgJiYgcy0+bG1hID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgICAmJiAoYmZkX3ZtYSkgcy0+ZmlsZXBvcyA+PSBwLT5wX29mZnNldCAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgICYmIChiZmRfdm1hKSBzLT5maWxlcG9zICsgcy0+X3Jhd19zaXplICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAgPD0gcC0+cF9vZmZzZXQgKyBwLT5wX2ZpbGVzeikKLQotICAvKiBUaGUgY29tcGxpY2F0ZWQgY2FzZSB3aGVuIHBfdmFkZHIgaXMgMCBpcyB0byBoYW5kbGUgdGhlIFNvbGFyaXMKLSAgICAgbGlua2VyLCB3aGljaCBnZW5lcmF0ZXMgYSBQVF9JTlRFUlAgc2VjdGlvbiB3aXRoIHBfdmFkZHIgYW5kCi0gICAgIHBfbWVtc3ogc2V0IHRvIDAuICAqLwotCi0jZGVmaW5lIElTX1NPTEFSSVNfUFRfSU5URVJQKHAsIHMpCQkJCQlcCi0JICAgIChwLT5wX3ZhZGRyID09IDAJCQkJCQlcCi0JICAgICAmJiBwLT5wX2ZpbGVzeiA+IDAJCQkJCQlcCi0JICAgICAmJiAocy0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwCQkJXAotCSAgICAgJiYgcy0+X3Jhd19zaXplID4gMAkJCQkJXAotCSAgICAgJiYgKGJmZF92bWEpIHMtPmZpbGVwb3MgPj0gcC0+cF9vZmZzZXQJCQlcCi0JICAgICAmJiAoKGJmZF92bWEpIHMtPmZpbGVwb3MgKyBzLT5fcmF3X3NpemUJCQlcCi0JCSAgICAgPD0gcC0+cF9vZmZzZXQgKyBwLT5wX2ZpbGVzeikpCi0KLSAgLyogU2NhbiB0aHJvdWdoIHRoZSBzZWdtZW50cyBzcGVjaWZpZWQgaW4gdGhlIHByb2dyYW0gaGVhZGVyCi0gICAgIG9mIHRoZSBpbnB1dCBCRkQuICAqLwotICBmb3IgKGkgPSAwLCBwID0gZWxmX3RkYXRhIChpYmZkKS0+cGhkcjsgaSA8IG51bV9zZWdtZW50czsgaSsrLCBwKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGNzZWNzOwotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotICAgICAgYXNlY3Rpb24gKm9zOwotICAgICAgdW5zaWduZWQgaW50IGlzZWM7Ci0gICAgICBiZmRfdm1hIG1hdGNoaW5nX2xtYTsKLSAgICAgIGJmZF92bWEgc3VnZ2VzdGVkX2xtYTsKLSAgICAgIHVuc2lnbmVkIGludCBqOwotCi0gICAgICAvKiBGb3IgZWFjaCBzZWN0aW9uIGluIHRoZSBpbnB1dCBCRkQsIGRlY2lkZSBpZiBpdCBzaG91bGQgYmUKLQkgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgc2VnbWVudC4gIEEgc2VjdGlvbiB3aWxsIGJlIGluY2x1ZGVkCi0JIGlmIGl0IGlzIHdpdGhpbiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgc2VnbWVudCwgYW5kIGl0IGlzCi0JIGFuIGFsbG9jYXRlZCBzZWdtZW50LCBhbmQgdGhlcmUgaXMgYW4gb3V0cHV0IHNlY3Rpb24KLQkgYXNzb2NpYXRlZCB3aXRoIGl0LiAgKi8KLSAgICAgIGNzZWNzID0gMDsKLSAgICAgIGZvciAocyA9IGliZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCWlmIChzLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCSAgewotCSAgICBpZiAoKElTX0NPTlRBSU5FRF9CWSAocy0+dm1hLCBzLT5fcmF3X3NpemUsIHAtPnBfdmFkZHIsIHApCi0JCSB8fCBJU19TT0xBUklTX1BUX0lOVEVSUCAocCwgcykpCi0JCSYmIChzLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkgICAgICArK2NzZWNzOwotCSAgICBlbHNlIGlmIChJU19DT1JFRklMRV9OT1RFIChwLCBzKSkKLQkgICAgICArK2NzZWNzOwotCSAgfQotCi0gICAgICAvKiBBbGxvY2F0ZSBhIHNlZ21lbnQgbWFwIGJpZyBlbm91Z2ggdG8gY29udGFpbiBhbGwgb2YgdGhlCi0JIHNlY3Rpb25zIHdlIGhhdmUgc2VsZWN0ZWQuICAqLwotICAgICAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotCSAgIGJmZF9hbGxvYyAob2JmZCwKLQkJICAgICAgKHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkKLQkJICAgICAgICsgKChzaXplX3QpIGNzZWNzIC0gMSkgKiBzaXplb2YgKGFzZWN0aW9uICopKSkpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpZWxkcyBvZiB0aGUgc2VnbWVudCBtYXAuICBEZWZhdWx0IHRvCi0JIHVzaW5nIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzZWdtZW50IGluIHRoZSBpbnB1dCBCRkQuICAqLwotICAgICAgbS0+bmV4dCAgICAgICAgICA9IE5VTEw7Ci0gICAgICBtLT5wX3R5cGUgICAgICAgID0gcC0+cF90eXBlOwotICAgICAgbS0+cF9mbGFncyAgICAgICA9IHAtPnBfZmxhZ3M7Ci0gICAgICBtLT5wX2ZsYWdzX3ZhbGlkID0gMTsKLSAgICAgIG0tPnBfcGFkZHIgICAgICAgPSBwLT5wX3BhZGRyOwotICAgICAgbS0+cF9wYWRkcl92YWxpZCA9IDE7Ci0KLSAgICAgIC8qIERldGVybWluZSBpZiB0aGlzIHNlZ21lbnQgY29udGFpbnMgdGhlIEVMRiBmaWxlIGhlYWRlcgotCSBhbmQgaWYgaXQgY29udGFpbnMgdGhlIHByb2dyYW0gaGVhZGVycyB0aGVtc2VsdmVzLiAgKi8KLSAgICAgIG0tPmluY2x1ZGVzX2ZpbGVoZHIgPSAocC0+cF9vZmZzZXQgPT0gMAotCQkJICAgICAmJiBwLT5wX2ZpbGVzeiA+PSBpZWhkci0+ZV9laHNpemUpOwotCi0gICAgICBtLT5pbmNsdWRlc19waGRycyA9IDA7Ci0KLSAgICAgIGlmICghIHBoZHJfaW5jbHVkZWQgfHwgcC0+cF90eXBlICE9IFBUX0xPQUQpCi0JewotCSAgbS0+aW5jbHVkZXNfcGhkcnMgPQotCSAgICAocC0+cF9vZmZzZXQgPD0gKGJmZF92bWEpIGllaGRyLT5lX3Bob2ZmCi0JICAgICAmJiAocC0+cF9vZmZzZXQgKyBwLT5wX2ZpbGVzegotCQkgPj0gKChiZmRfdm1hKSBpZWhkci0+ZV9waG9mZgotCQkgICAgICsgaWVoZHItPmVfcGhudW0gKiBpZWhkci0+ZV9waGVudHNpemUpKSk7Ci0JICBpZiAocC0+cF90eXBlID09IFBUX0xPQUQgJiYgbS0+aW5jbHVkZXNfcGhkcnMpCi0JICAgIHBoZHJfaW5jbHVkZWQgPSB0cnVlOwotCX0KLQotICAgICAgaWYgKGNzZWNzID09IDApCi0JewotCSAgLyogU3BlY2lhbCBzZWdtZW50cywgc3VjaCBhcyB0aGUgUFRfUEhEUiBzZWdtZW50LCBtYXkgY29udGFpbgotCSAgICAgbm8gc2VjdGlvbnMsIGJ1dCBvcmRpbmFyeSwgbG9hZGFibGUgc2VnbWVudHMgc2hvdWxkIGNvbnRhaW4KLQkgICAgIHNvbWV0aGluZy4gICovCi0KLQkgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJKF8oIiVzOiB3YXJuaW5nOiBFbXB0eSBsb2FkYWJsZSBzZWdtZW50IGRldGVjdGVkXG4iKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotCSAgbS0+Y291bnQgPSAwOwotCSAgKnBtID0gbTsKLQkgIHBtID0gJm0tPm5leHQ7Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTm93IHNjYW4gdGhlIHNlY3Rpb25zIGluIHRoZSBpbnB1dCBCRkQgYWdhaW4gYW5kIGF0dGVtcHQKLQkgdG8gYWRkIHRoZWlyIGNvcnJlc3BvbmRpbmcgb3V0cHV0IHNlY3Rpb25zIHRvIHRoZSBzZWdtZW50IG1hcC4KLQkgVGhlIHByb2JsZW0gaGVyZSBpcyBob3cgdG8gaGFuZGxlIGFuIG91dHB1dCBzZWN0aW9uIHdoaWNoIGhhcwotCSBiZWVuIG1vdmVkIChpZSBoYWQgaXRzIExNQSBjaGFuZ2VkKS4gIFRoZXJlIGFyZSBmb3VyIHBvc3NpYmlsaXRpZXM6Ci0KLQkgMS4gTm9uZSBvZiB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIG1vdmVkLgotCSAgICBJbiB0aGlzIGNhc2Ugd2UgY2FuIGNvbnRpbnVlIHRvIHVzZSB0aGUgc2VnbWVudCBMTUEgZnJvbSB0aGUKLQkgICAgaW5wdXQgQkZELgotCi0JIDIuIEFsbCBvZiB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIG1vdmVkIGJ5IHRoZSBzYW1lIGFtb3VudC4KLQkgICAgSW4gdGhpcyBjYXNlIHdlIGNhbiBjaGFuZ2UgdGhlIHNlZ21lbnQncyBMTUEgdG8gbWF0Y2ggdGhlIExNQQotCSAgICBvZiB0aGUgZmlyc3Qgc2VjdGlvbi4KLQotCSAzLiBTb21lIG9mIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gbW92ZWQsIG90aGVycyBoYXZlIG5vdC4KLQkgICAgSW4gdGhpcyBjYXNlIHRob3NlIHNlY3Rpb25zIHdoaWNoIGhhdmUgbm90IGJlZW4gbW92ZWQgY2FuIGJlCi0JICAgIHBsYWNlZCBpbiB0aGUgY3VycmVudCBzZWdtZW50IHdoaWNoIHdpbGwgaGF2ZSB0byBoYXZlIGl0cyBzaXplLAotCSAgICBhbmQgcG9zc2libHkgaXRzIExNQSBjaGFuZ2VkLCBhbmQgYSBuZXcgc2VnbWVudCBvciBzZWdtZW50cyB3aWxsCi0JICAgIGhhdmUgdG8gYmUgY3JlYXRlZCB0byBjb250YWluIHRoZSBvdGhlciBzZWN0aW9ucy4KLQotCSA0LiBUaGUgc2VjdGlvbnMgaGF2ZSBiZWVuIG1vdmVkLCBidXQgbm90IGJlIHRoZSBzYW1lIGFtb3VudC4KLQkgICAgSW4gdGhpcyBjYXNlIHdlIGNhbiBjaGFuZ2UgdGhlIHNlZ21lbnQncyBMTUEgdG8gbWF0Y2ggdGhlIExNQQotCSAgICBvZiB0aGUgZmlyc3Qgc2VjdGlvbiBhbmQgd2Ugd2lsbCBoYXZlIHRvIGNyZWF0ZSBhIG5ldyBzZWdtZW50Ci0JICAgIG9yIHNlZ21lbnRzIHRvIGNvbnRhaW4gdGhlIG90aGVyIHNlY3Rpb25zLgotCi0JIEluIG9yZGVyIHRvIHNhdmUgdGltZSwgd2UgYWxsb2NhdGUgYW4gYXJyYXkgdG8gaG9sZCB0aGUgc2VjdGlvbgotCSBwb2ludGVycyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluLiAgQXMgdGhlc2Ugc2VjdGlvbnMgZ2V0IGFzc2lnbmVkCi0JIHRvIGEgc2VnbWVudCwgdGhleSBhcmUgcmVtb3ZlZCBmcm9tIHRoaXMgYXJyYXkuICAqLwotCi0gICAgICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoc2l6ZW9mIChhc2VjdGlvbiAqKSAqIGNzZWNzKTsKLSAgICAgIGlmIChzZWN0aW9ucyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogU3RlcCBPbmU6IFNjYW4gZm9yIHNlZ21lbnQgdnMgc2VjdGlvbiBMTUEgY29uZmxpY3RzLgotCSBBbHNvIGFkZCB0aGUgc2VjdGlvbnMgdG8gdGhlIHNlY3Rpb24gYXJyYXkgYWxsb2NhdGVkIGFib3ZlLgotCSBBbHNvIGFkZCB0aGUgc2VjdGlvbnMgdG8gdGhlIGN1cnJlbnQgc2VnbWVudC4gIEluIHRoZSBjb21tb24KLQkgY2FzZSwgd2hlcmUgdGhlIHNlY3Rpb25zIGhhdmUgbm90IGJlZW4gbW92ZWQsIHRoaXMgbWVhbnMgdGhhdAotCSB3ZSBoYXZlIGNvbXBsZXRlbHkgZmlsbGVkIHRoZSBzZWdtZW50LCBhbmQgdGhlcmUgaXMgbm90aGluZwotCSBtb3JlIHRvIGRvLiAgKi8KLQotICAgICAgaXNlYyA9IDA7Ci0gICAgICBtYXRjaGluZ19sbWEgPSBmYWxzZTsKLSAgICAgIHN1Z2dlc3RlZF9sbWEgPSAwOwotCi0gICAgICBmb3IgKGogPSAwLCBzID0gaWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgb3MgPSBzLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgaWYgKCgoKElTX0NPTlRBSU5FRF9CWSAocy0+dm1hLCBzLT5fcmF3X3NpemUsIHAtPnBfdmFkZHIsIHApCi0JCSB8fCBJU19TT0xBUklTX1BUX0lOVEVSUCAocCwgcykpCi0JCSYmIChzLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkgICAgICAgfHwgSVNfQ09SRUZJTEVfTk9URSAocCwgcykpCi0JICAgICAgJiYgb3MgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNlY3Rpb25zW2orK10gPSBzOwotCi0JICAgICAgLyogVGhlIFNvbGFyaXMgbmF0aXZlIGxpbmtlciBhbHdheXMgc2V0cyBwX3BhZGRyIHRvIDAuCi0JCSBXZSB0cnkgdG8gY2F0Y2ggdGhhdCBjYXNlIGhlcmUsIGFuZCBzZXQgaXQgdG8gdGhlCi0JCSBjb3JyZWN0IHZhbHVlLiAgKi8KLQkgICAgICBpZiAocC0+cF9wYWRkciA9PSAwCi0JCSAgJiYgcC0+cF92YWRkciAhPSAwCi0JCSAgJiYgaXNlYyA9PSAwCi0JCSAgJiYgb3MtPmxtYSAhPSAwCi0JCSAgJiYgKG9zLT52bWEgPT0gKHAtPnBfdmFkZHIKLQkJCQkgICsgKG0tPmluY2x1ZGVzX2ZpbGVoZHIKLQkJCQkgICAgID8gaWVoZHItPmVfZWhzaXplCi0JCQkJICAgICA6IDApCi0JCQkJICArIChtLT5pbmNsdWRlc19waGRycwotCQkJCSAgICAgPyBpZWhkci0+ZV9waG51bSAqIGllaGRyLT5lX3BoZW50c2l6ZQotCQkJCSAgICAgOiAwKSkpKQotCQltLT5wX3BhZGRyID0gcC0+cF92YWRkcjsKLQotCSAgICAgIC8qIE1hdGNoIHVwIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzZWdtZW50IHdpdGggdGhlCi0JCSBMTUEgYWRkcmVzcyBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChJU19DT05UQUlORURfQlkgKG9zLT5sbWEsIG9zLT5fcmF3X3NpemUsIG0tPnBfcGFkZHIsIHApCi0JCSAgfHwgSVNfQ09SRUZJTEVfTk9URSAocCwgcykpCi0JCXsKLQkJICBpZiAobWF0Y2hpbmdfbG1hID09IDApCi0JCSAgICBtYXRjaGluZ19sbWEgPSBvcy0+bG1hOwotCi0JCSAgLyogV2UgYXNzdW1lIHRoYXQgaWYgdGhlIHNlY3Rpb24gZml0cyB3aXRoaW4gdGhlIHNlZ21lbnQKLQkJICAgICB0aGF0IGl0IGRvZXMgbm90IG92ZXJsYXAgYW55IG90aGVyIHNlY3Rpb24gd2l0aGluIHRoYXQKLQkJICAgICBzZWdtZW50LiAgKi8KLQkJICBtLT5zZWN0aW9uc1tpc2VjKytdID0gb3M7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdWdnZXN0ZWRfbG1hID09IDApCi0JCXN1Z2dlc3RlZF9sbWEgPSBvcy0+bG1hOwotCSAgICB9Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUIChqID09IGNzZWNzKTsKLQotICAgICAgLyogU3RlcCBUd286IEFkanVzdCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBzZWdtZW50LAotCSBpZiBuZWNlc3NhcnkuICAqLwotICAgICAgaWYgKGlzZWMgPT0gY3NlY3MpCi0JewotCSAgLyogQWxsIG9mIHRoZSBzZWN0aW9ucyBmaXR0ZWQgd2l0aGluIHRoZSBzZWdtZW50IGFzIGN1cnJlbnRseQotCSAgICAgc3BlY2lmaWVkLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBjYXNlLiAgQWRkIHRoZSBzZWdtZW50IHRvCi0JICAgICB0aGUgbGlzdCBvZiBidWlsdCBzZWdtZW50cyBhbmQgY2Fycnkgb24gdG8gcHJvY2VzcyB0aGUgbmV4dAotCSAgICAgcHJvZ3JhbSBoZWFkZXIgaW4gdGhlIGlucHV0IEJGRC4gICovCi0JICBtLT5jb3VudCA9IGNzZWNzOwotCSAgKnBtID0gbTsKLQkgIHBtID0gJm0tPm5leHQ7Ci0KLQkgIGZyZWUgKHNlY3Rpb25zKTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKG1hdGNoaW5nX2xtYSAhPSAwKQotCXsKLQkgIC8qIEF0IGxlYXN0IG9uZSBzZWN0aW9uIGZpdHMgaW5zaWRlIHRoZSBjdXJyZW50IHNlZ21lbnQuCi0JICAgICBLZWVwIGl0LCBidXQgbW9kaWZ5IGl0cyBwaHlzaWNhbCBhZGRyZXNzIHRvIG1hdGNoIHRoZQotCSAgICAgTE1BIG9mIHRoZSBmaXJzdCBzZWN0aW9uIHRoYXQgZml0dGVkLiAgKi8KLQotCSAgbS0+cF9wYWRkciA9IG1hdGNoaW5nX2xtYTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTm9uZSBvZiB0aGUgc2VjdGlvbnMgZml0dGVkIGluc2lkZSB0aGUgY3VycmVudCBzZWdtZW50LgotCSAgICAgQ2hhbmdlIHRoZSBjdXJyZW50IHNlZ21lbnQncyBwaHlzaWNhbCBhZGRyZXNzIHRvIG1hdGNoCi0JICAgICB0aGUgTE1BIG9mIHRoZSBmaXJzdCBzZWN0aW9uLiAgKi8KLQotCSAgbS0+cF9wYWRkciA9IHN1Z2dlc3RlZF9sbWE7Ci0JfQotCi0gICAgICAvKiBTdGVwIFRocmVlOiBMb29wIG92ZXIgdGhlIHNlY3Rpb25zIGFnYWluLCB0aGlzIHRpbWUgYXNzaWduaW5nCi0JIHRob3NlIHRoYXQgZml0IHRvIHRoZSBjdXJyZW50IHNlZ21lbnQgYW5kIHJlbXZvaW5nIHRoZW0gZnJvbSB0aGUKLQkgc2VjdGlvbnMgYXJyYXk7IGJ1dCBtYWtpbmcgc3VyZSBub3QgdG8gbGVhdmUgbGFyZ2UgZ2Fwcy4gIE9uY2UgYWxsCi0JIHBvc3NpYmxlIHNlY3Rpb25zIGhhdmUgYmVlbiBhc3NpZ25lZCB0byB0aGUgY3VycmVudCBzZWdtZW50IGl0IGlzCi0JIGFkZGVkIHRvIHRoZSBsaXN0IG9mIGJ1aWx0IHNlZ21lbnRzIGFuZCBpZiBzZWN0aW9ucyBzdGlsbCByZW1haW4KLQkgdG8gYmUgYXNzaWduZWQsIGEgbmV3IHNlZ21lbnQgaXMgY29uc3RydWN0ZWQgYmVmb3JlIHJlcGVhdGluZwotCSB0aGUgbG9vcC4gICovCi0gICAgICBpc2VjID0gMDsKLSAgICAgIGRvCi0JewotCSAgbS0+Y291bnQgPSAwOwotCSAgc3VnZ2VzdGVkX2xtYSA9IDA7Ci0KLQkgIC8qIEZpbGwgdGhlIGN1cnJlbnQgc2VnbWVudCB3aXRoIHNlY3Rpb25zIHRoYXQgZml0LiAgKi8KLQkgIGZvciAoaiA9IDA7IGogPCBjc2VjczsgaisrKQotCSAgICB7Ci0JICAgICAgcyA9IHNlY3Rpb25zW2pdOwotCi0JICAgICAgaWYgKHMgPT0gTlVMTCkKLQkJY29udGludWU7Ci0KLQkgICAgICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotCi0JICAgICAgaWYgKElTX0NPTlRBSU5FRF9CWSAob3MtPmxtYSwgb3MtPl9yYXdfc2l6ZSwgbS0+cF9wYWRkciwgcCkKLQkJICB8fCBJU19DT1JFRklMRV9OT1RFIChwLCBzKSkKLQkJewotCQkgIGlmIChtLT5jb3VudCA9PSAwKQotCQkgICAgewotCQkgICAgICAvKiBJZiB0aGUgZmlyc3Qgc2VjdGlvbiBpbiBhIHNlZ21lbnQgZG9lcyBub3Qgc3RhcnQgYXQKLQkJCSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWdtZW50LCB0aGVuIHNvbWV0aGluZyBpcyB3cm9uZy4gICovCi0JCSAgICAgIGlmIChvcy0+bG1hICE9IG0tPnBfcGFkZHIpCi0JCQlhYm9ydCAoKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGFzZWN0aW9uICogcHJldl9zZWM7Ci0JCSAgICAgIGJmZF92bWEgbWF4cGFnZXNpemU7Ci0KLQkJICAgICAgcHJldl9zZWMgPSBtLT5zZWN0aW9uc1ttLT5jb3VudCAtIDFdOwotCQkgICAgICBtYXhwYWdlc2l6ZSA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChvYmZkKS0+bWF4cGFnZXNpemU7Ci0KLQkJICAgICAgLyogSWYgdGhlIGdhcCBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIHNlY3Rpb24KLQkJCSBhbmQgdGhlIHN0YXJ0IG9mIHRoaXMgc2VjdGlvbiBpcyBtb3JlIHRoYW4gbWF4cGFnZXNpemUKLQkJCSB0aGVuIHdlIG5lZWQgdG8gc3RhcnQgYSBuZXcgc2VnbWVudC4gICovCi0JCSAgICAgIGlmIChCRkRfQUxJR04gKHByZXZfc2VjLT5sbWEgKyBwcmV2X3NlYy0+X3Jhd19zaXplLCBtYXhwYWdlc2l6ZSkKLQkJCSAgPCBCRkRfQUxJR04gKG9zLT5sbWEsIG1heHBhZ2VzaXplKSkKLQkJCXsKLQkJCSAgaWYgKHN1Z2dlc3RlZF9sbWEgPT0gMCkKLQkJCSAgICBzdWdnZXN0ZWRfbG1hID0gb3MtPmxtYTsKLQotCQkJICBjb250aW51ZTsKLQkJCX0KLQkJICAgIH0KLQotCQkgIG0tPnNlY3Rpb25zW20tPmNvdW50KytdID0gb3M7Ci0JCSAgKytpc2VjOwotCQkgIHNlY3Rpb25zW2pdID0gTlVMTDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN1Z2dlc3RlZF9sbWEgPT0gMCkKLQkJc3VnZ2VzdGVkX2xtYSA9IG9zLT5sbWE7Ci0JICAgIH0KLQotCSAgQkZEX0FTU0VSVCAobS0+Y291bnQgPiAwKTsKLQotCSAgLyogQWRkIHRoZSBjdXJyZW50IHNlZ21lbnQgdG8gdGhlIGxpc3Qgb2YgYnVpbHQgc2VnbWVudHMuICAqLwotCSAgKnBtID0gbTsKLQkgIHBtID0gJm0tPm5leHQ7Ci0KLQkgIGlmIChpc2VjIDwgY3NlY3MpCi0JICAgIHsKLQkgICAgICAvKiBXZSBzdGlsbCBoYXZlIG5vdCBhbGxvY2F0ZWQgYWxsIG9mIHRoZSBzZWN0aW9ucyB0bwotCQkgc2VnbWVudHMuICBDcmVhdGUgYSBuZXcgc2VnbWVudCBoZXJlLCBpbml0aWFsaXNlIGl0Ci0JCSBhbmQgY2Fycnkgb24gbG9vcGluZy4gICovCi0KLQkgICAgICBtID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCi0JCSAgIGJmZF9hbGxvYyAob2JmZCwKLQkJCSAgICAgIChzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApCi0JCQkgICAgICAgKyAoKHNpemVfdCkgY3NlY3MgLSAxKSAqIHNpemVvZiAoYXNlY3Rpb24gKikpKSk7Ci0JICAgICAgaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZmllbGRzIG9mIHRoZSBzZWdtZW50IG1hcC4gIFNldCB0aGUgcGh5c2ljYWwKLQkJIHBoeXNpY2FsIGFkZHJlc3MgdG8gdGhlIExNQSBvZiB0aGUgZmlyc3Qgc2VjdGlvbiB0aGF0IGhhcwotCQkgbm90IHlldCBiZWVuIGFzc2lnbmVkLiAgKi8KLQotCSAgICAgIG0tPm5leHQgICAgICAgICAgICAgPSBOVUxMOwotCSAgICAgIG0tPnBfdHlwZSAgICAgICAgICAgPSBwLT5wX3R5cGU7Ci0JICAgICAgbS0+cF9mbGFncyAgICAgICAgICA9IHAtPnBfZmxhZ3M7Ci0JICAgICAgbS0+cF9mbGFnc192YWxpZCAgICA9IDE7Ci0JICAgICAgbS0+cF9wYWRkciAgICAgICAgICA9IHN1Z2dlc3RlZF9sbWE7Ci0JICAgICAgbS0+cF9wYWRkcl92YWxpZCAgICA9IDE7Ci0JICAgICAgbS0+aW5jbHVkZXNfZmlsZWhkciA9IDA7Ci0JICAgICAgbS0+aW5jbHVkZXNfcGhkcnMgICA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICB3aGlsZSAoaXNlYyA8IGNzZWNzKTsKLQotICAgICAgZnJlZSAoc2VjdGlvbnMpOwotICAgIH0KLQotICAvKiBUaGUgU29sYXJpcyBsaW5rZXIgY3JlYXRlcyBwcm9ncmFtIGhlYWRlcnMgaW4gd2hpY2ggYWxsIHRoZQotICAgICBwX3BhZGRyIGZpZWxkcyBhcmUgemVyby4gIFdoZW4gd2UgdHJ5IHRvIG9iamNvcHkgb3Igc3RyaXAgc3VjaCBhCi0gICAgIGZpbGUsIHdlIGdldCBjb25mdXNlZC4gIENoZWNrIGZvciB0aGlzIGNhc2UsIGFuZCBpZiB3ZSBmaW5kIGl0Ci0gICAgIHJlc2V0IHRoZSBwX3BhZGRyX3ZhbGlkIGZpZWxkcy4gICovCi0gIGZvciAobSA9IG1maXJzdDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKLSAgICBpZiAobS0+cF9wYWRkciAhPSAwKQotICAgICAgYnJlYWs7Ci0gIGlmIChtID09IE5VTEwpCi0gICAgewotICAgICAgZm9yIChtID0gbWZpcnN0OyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQotCW0tPnBfcGFkZHJfdmFsaWQgPSAwOwotICAgIH0KLQotICBlbGZfdGRhdGEgKG9iZmQpLT5zZWdtZW50X21hcCA9IG1maXJzdDsKLQotI2lmIDAKLSAgLyogRmluYWwgU3RlcDogU29ydCB0aGUgc2VnbWVudHMgaW50byBhc2NlbmRpbmcgb3JkZXIgb2YgcGh5c2ljYWwgYWRkcmVzcy4gKi8KLSAgaWYgKG1maXJzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAqIHByZXY7Ci0KLSAgICAgIHByZXYgPSBtZmlyc3Q7Ci0gICAgICBmb3IgKG0gPSBtZmlyc3QtPm5leHQ7IG0gIT0gTlVMTDsgcHJldiA9IG0sIG0gPSBtLT5uZXh0KQotCXsKLQkgIC8qIFllcyBJIGtub3cgLSBpdHMgYSBidWJibGUgc29ydC4uLi4qLwotCSAgaWYgKG0tPm5leHQgIT0gTlVMTCAmJiAobS0+bmV4dC0+cF9wYWRkciA8IG0tPnBfcGFkZHIpKQotCSAgICB7Ci0JICAgICAgLyogc3dhcCBtIGFuZCBtLT5uZXh0ICovCi0JICAgICAgcHJldi0+bmV4dCA9IG0tPm5leHQ7Ci0JICAgICAgbS0+bmV4dCA9IG0tPm5leHQtPm5leHQ7Ci0JICAgICAgcHJldi0+bmV4dC0+bmV4dCA9IG07Ci0KLQkgICAgICAvKiByZXN0YXJ0IGxvb3AuICovCi0JICAgICAgbSA9IG1maXJzdDsKLQkgICAgfQotCX0KLSAgICB9Ci0jZW5kaWYKLQotI3VuZGVmIElTX0NPTlRBSU5FRF9CWQotI3VuZGVmIElTX1NPTEFSSVNfUFRfSU5URVJQCi0jdW5kZWYgSVNfQ09SRUZJTEVfTk9URQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBwcml2YXRlIHNlY3Rpb24gaW5mb3JtYXRpb24uICBUaGlzIGNvcGllcyBvdmVyIHRoZSBlbnRzaXplCi0gICBmaWVsZCwgYW5kIHNvbWV0aW1lcyB0aGUgaW5mbyBmaWVsZC4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMsIG9iZmQsIG9zZWMpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKmlzZWM7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXNlY3Rpb24gKm9zZWM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICppaGRyLCAqb2hkcjsKLQotICBpZiAoaWJmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBvYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQ29weSBvdmVyIHByaXZhdGUgQkZEIGRhdGEgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY29waWVkLgotICAgICBUaGlzIG11c3QgYmUgZG9uZSBoZXJlLCByYXRoZXIgdGhhbiBpbiB0aGUgY29weV9wcml2YXRlX2JmZF9kYXRhCi0gICAgIGVudHJ5IHBvaW50LCBiZWNhdXNlIHRoZSBsYXR0ZXIgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9uCi0gICAgIGNvbnRlbnRzIGhhdmUgYmVlbiBzZXQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHByb2dyYW0gaGVhZGVycyBoYXZlCi0gICAgIGFscmVhZHkgYmVlbiB3b3JrZWQgb3V0LiAgKi8KLSAgaWYgKGVsZl90ZGF0YSAob2JmZCktPnNlZ21lbnRfbWFwID09IE5VTEwKLSAgICAgICYmIGVsZl90ZGF0YSAoaWJmZCktPnBoZHIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgLyogT25seSBzZXQgdXAgdGhlIHNlZ21lbnRzIGlmIHRoZXJlIGFyZSBubyBtb3JlIFNFQ19BTExPQwotICAgICAgICAgc2VjdGlvbnMuICBGSVhNRTogVGhpcyB3b24ndCBkbyB0aGUgcmlnaHQgdGhpbmcgaWYgb2JqY29weSBpcwotICAgICAgICAgdXNlZCB0byByZW1vdmUgdGhlIGxhc3QgU0VDX0FMTE9DIHNlY3Rpb24sIHNpbmNlIG9iamNvcHkKLSAgICAgICAgIHdvbid0IGNhbGwgdGhpcyByb3V0aW5lIGluIHRoYXQgY2FzZS4gICovCi0gICAgICBmb3IgKHMgPSBpc2VjLT5uZXh0OyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCWlmICgocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JICBicmVhazsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JewotCSAgaWYgKCEgY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWhkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChpc2VjKS0+dGhpc19oZHI7Ci0gIG9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAob3NlYyktPnRoaXNfaGRyOwotCi0gIG9oZHItPnNoX2VudHNpemUgPSBpaGRyLT5zaF9lbnRzaXplOwotCi0gIGlmIChpaGRyLT5zaF90eXBlID09IFNIVF9TWU1UQUIKLSAgICAgIHx8IGloZHItPnNoX3R5cGUgPT0gU0hUX0RZTlNZTQotICAgICAgfHwgaWhkci0+c2hfdHlwZSA9PSBTSFRfR05VX3Zlcm5lZWQKLSAgICAgIHx8IGloZHItPnNoX3R5cGUgPT0gU0hUX0dOVV92ZXJkZWYpCi0gICAgb2hkci0+c2hfaW5mbyA9IGloZHItPnNoX2luZm87Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgcHJpdmF0ZSBzeW1ib2wgaW5mb3JtYXRpb24uICBJZiB0aGlzIHN5bWJvbCBpcyBpbiBhIHNlY3Rpb24KLSAgIHdoaWNoIHdlIGRpZCBub3QgbWFwIGludG8gYSBCRkQgc2VjdGlvbiwgdHJ5IHRvIG1hcCB0aGUgc2VjdGlvbgotICAgaW5kZXggY29ycmVjdGx5LiAgV2UgdXNlIHNwZWNpYWwgbWFjcm8gZGVmaW5pdGlvbnMgZm9yIHRoZSBtYXBwZWQKLSAgIHNlY3Rpb24gaW5kaWNlczsgdGhlc2UgZGVmaW5pdGlvbnMgYXJlIGludGVycHJldGVkIGJ5IHRoZQotICAgc3dhcF9vdXRfc3ltcyBmdW5jdGlvbi4gICovCi0KLSNkZWZpbmUgTUFQX09ORVNZTVRBQiAoU0hOX0xPUkVTRVJWRSAtIDEpCi0jZGVmaW5lIE1BUF9EWU5TWU1UQUIgKFNITl9MT1JFU0VSVkUgLSAyKQotI2RlZmluZSBNQVBfU1RSVEFCIChTSE5fTE9SRVNFUlZFIC0gMykKLSNkZWZpbmUgTUFQX1NIU1RSVEFCIChTSE5fTE9SRVNFUlZFIC0gNCkKLQotYm9vbGVhbgotX2JmZF9lbGZfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIChpYmZkLCBpc3ltYXJnLCBvYmZkLCBvc3ltYXJnKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzeW1ib2wgKmlzeW1hcmc7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXN5bWJvbCAqb3N5bWFyZzsKLXsKLSAgZWxmX3N5bWJvbF90eXBlICppc3ltLCAqb3N5bTsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaXN5bSA9IGVsZl9zeW1ib2xfZnJvbSAoaWJmZCwgaXN5bWFyZyk7Ci0gIG9zeW0gPSBlbGZfc3ltYm9sX2Zyb20gKG9iZmQsIG9zeW1hcmcpOwotCi0gIGlmIChpc3ltICE9IE5VTEwKLSAgICAgICYmIG9zeW0gIT0gTlVMTAotICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChpc3ltLT5zeW1ib2wuc2VjdGlvbikpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHNobmR4OwotCi0gICAgICBzaG5keCA9IGlzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHg7Ci0gICAgICBpZiAoc2huZHggPT0gZWxmX29uZXN5bXRhYiAoaWJmZCkpCi0Jc2huZHggPSBNQVBfT05FU1lNVEFCOwotICAgICAgZWxzZSBpZiAoc2huZHggPT0gZWxmX2R5bnN5bXRhYiAoaWJmZCkpCi0Jc2huZHggPSBNQVBfRFlOU1lNVEFCOwotICAgICAgZWxzZSBpZiAoc2huZHggPT0gZWxmX3RkYXRhIChpYmZkKS0+c3RydGFiX3NlY3Rpb24pCi0Jc2huZHggPSBNQVBfU1RSVEFCOwotICAgICAgZWxzZSBpZiAoc2huZHggPT0gZWxmX3RkYXRhIChpYmZkKS0+c2hzdHJ0YWJfc2VjdGlvbikKLQlzaG5keCA9IE1BUF9TSFNUUlRBQjsKLSAgICAgIG9zeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHggPSBzaG5keDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN3YXBfb3V0X3N5bXMgKGFiZmQsIHN0dHAsIHJlbG9jYXRhYmxlX3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKnN0dHA7Ci0gICAgIGludCByZWxvY2F0YWJsZV9wOwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIGlmICghZWxmX21hcF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRHVtcCBvdXQgdGhlIHN5bXRhYnMuICovCi0gIHsKLSAgICBpbnQgc3ltY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgICBhc3ltYm9sICoqc3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3R0OwotICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW1zdHJ0YWJfaGRyOwotICAgIGNoYXIgKm91dGJvdW5kX3N5bXM7Ci0gICAgaW50IGlkeDsKLQotICAgIHN0dCA9IF9iZmRfZWxmX3N0cmluZ3RhYl9pbml0ICgpOwotICAgIGlmIChzdHQgPT0gTlVMTCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgICBzeW10YWJfaGRyLT5zaF90eXBlID0gU0hUX1NZTVRBQjsKLSAgICBzeW10YWJfaGRyLT5zaF9lbnRzaXplID0gYmVkLT5zLT5zaXplb2Zfc3ltOwotICAgIHN5bXRhYl9oZHItPnNoX3NpemUgPSBzeW10YWJfaGRyLT5zaF9lbnRzaXplICogKHN5bWNvdW50ICsgMSk7Ci0gICAgc3ltdGFiX2hkci0+c2hfaW5mbyA9IGVsZl9udW1fbG9jYWxzIChhYmZkKSArIDE7Ci0gICAgc3ltdGFiX2hkci0+c2hfYWRkcmFsaWduID0gYmVkLT5zLT5maWxlX2FsaWduOwotCi0gICAgc3ltc3RydGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zdHJ0YWJfaGRyOwotICAgIHN5bXN0cnRhYl9oZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOwotCi0gICAgb3V0Ym91bmRfc3ltcyA9IGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAgICAgICAoMSArIHN5bWNvdW50KSAqIGJlZC0+cy0+c2l6ZW9mX3N5bSk7Ci0gICAgaWYgKG91dGJvdW5kX3N5bXMgPT0gTlVMTCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChQVFIpIG91dGJvdW5kX3N5bXM7Ci0KLSAgICAvKiBub3cgZ2VuZXJhdGUgdGhlIGRhdGEgKGZvciAiY29udGVudHMiKSAqLwotICAgIHsKLSAgICAgIC8qIEZpbGwgaW4gemVyb3RoIHN5bWJvbCBhbmQgc3dhcCBpdCBvdXQuICAqLwotICAgICAgRWxmX0ludGVybmFsX1N5bSBzeW07Ci0gICAgICBzeW0uc3RfbmFtZSA9IDA7Ci0gICAgICBzeW0uc3RfdmFsdWUgPSAwOwotICAgICAgc3ltLnN0X3NpemUgPSAwOwotICAgICAgc3ltLnN0X2luZm8gPSAwOwotICAgICAgc3ltLnN0X290aGVyID0gMDsKLSAgICAgIHN5bS5zdF9zaG5keCA9IFNITl9VTkRFRjsKLSAgICAgIGJlZC0+cy0+c3dhcF9zeW1ib2xfb3V0IChhYmZkLCAmc3ltLCAoUFRSKSBvdXRib3VuZF9zeW1zKTsKLSAgICAgIG91dGJvdW5kX3N5bXMgKz0gYmVkLT5zLT5zaXplb2Zfc3ltOwotICAgIH0KLSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHN5bWNvdW50OyBpZHgrKykKLSAgICAgIHsKLQlFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLQliZmRfdm1hIHZhbHVlID0gc3ltc1tpZHhdLT52YWx1ZTsKLQllbGZfc3ltYm9sX3R5cGUgKnR5cGVfcHRyOwotCWZsYWd3b3JkIGZsYWdzID0gc3ltc1tpZHhdLT5mbGFnczsKLQlpbnQgdHlwZTsKLQotCWlmIChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQkgIC8qIFNlY3Rpb24gc3ltYm9scyBoYXZlIG5vIG5hbWVzLiAgKi8KLQkgIHN5bS5zdF9uYW1lID0gMDsKLQllbHNlCi0JICB7Ci0JICAgIHN5bS5zdF9uYW1lID0gKHVuc2lnbmVkIGxvbmcpIF9iZmRfc3RyaW5ndGFiX2FkZCAoc3R0LAotCQkJCQkJCSAgICAgIHN5bXNbaWR4XS0+bmFtZSwKLQkJCQkJCQkgICAgICB0cnVlLCBmYWxzZSk7Ci0JICAgIGlmIChzeW0uc3RfbmFtZSA9PSAodW5zaWduZWQgbG9uZykgLTEpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCi0JdHlwZV9wdHIgPSBlbGZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bXNbaWR4XSk7Ci0KLQlpZiAoKGZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0JICAgICYmIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltc1tpZHhdLT5zZWN0aW9uKSkKLQkgIHsKLQkgICAgLyogRUxGIGNvbW1vbiBzeW1ib2xzIHB1dCB0aGUgYWxpZ25tZW50IGludG8gdGhlIGB2YWx1ZScgZmllbGQsCi0JICAgICAgIGFuZCB0aGUgc2l6ZSBpbnRvIHRoZSBgc2l6ZScgZmllbGQuICBUaGlzIGlzIGJhY2t3YXJkcyBmcm9tCi0JICAgICAgIGhvdyBCRkQgaGFuZGxlcyBpdCwgc28gcmV2ZXJzZSBpdCBoZXJlLiAgKi8KLQkgICAgc3ltLnN0X3NpemUgPSB2YWx1ZTsKLQkgICAgaWYgKHR5cGVfcHRyID09IE5VTEwKLQkJfHwgdHlwZV9wdHItPmludGVybmFsX2VsZl9zeW0uc3RfdmFsdWUgPT0gMCkKLQkgICAgICBzeW0uc3RfdmFsdWUgPSB2YWx1ZSA+PSAxNiA/IDE2IDogKDEgPDwgYmZkX2xvZzIgKHZhbHVlKSk7Ci0JICAgIGVsc2UKLQkgICAgICBzeW0uc3RfdmFsdWUgPSB0eXBlX3B0ci0+aW50ZXJuYWxfZWxmX3N5bS5zdF92YWx1ZTsKLQkgICAgc3ltLnN0X3NobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCi0JICAgICAgKGFiZmQsIHN5bXNbaWR4XS0+c2VjdGlvbik7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBhc2VjdGlvbiAqc2VjID0gc3ltc1tpZHhdLT5zZWN0aW9uOwotCSAgICBpbnQgc2huZHg7Ci0KLQkgICAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24pCi0JICAgICAgewotCQl2YWx1ZSArPSBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0JCXNlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JICAgICAgfQotCSAgICAvKiBEb24ndCBhZGQgaW4gdGhlIHNlY3Rpb24gdm1hIGZvciByZWxvY2F0YWJsZSBvdXRwdXQuICAqLwotCSAgICBpZiAoISByZWxvY2F0YWJsZV9wKQotCSAgICAgIHZhbHVlICs9IHNlYy0+dm1hOwotCSAgICBzeW0uc3RfdmFsdWUgPSB2YWx1ZTsKLQkgICAgc3ltLnN0X3NpemUgPSB0eXBlX3B0ciA/IHR5cGVfcHRyLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemUgOiAwOwotCi0JICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKLQkJJiYgdHlwZV9wdHIgIT0gTlVMTAotCQkmJiB0eXBlX3B0ci0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaG5keCAhPSAwKQotCSAgICAgIHsKLQkJLyogVGhpcyBzeW1ib2wgaXMgaW4gYSByZWFsIEVMRiBzZWN0aW9uIHdoaWNoIHdlIGRpZAotICAgICAgICAgICAgICAgICAgIG5vdCBjcmVhdGUgYXMgYSBCRkQgc2VjdGlvbi4gIFVuZG8gdGhlIG1hcHBpbmcgZG9uZQotICAgICAgICAgICAgICAgICAgIGJ5IGNvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YS4gICovCi0JCXNobmR4ID0gdHlwZV9wdHItPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHg7Ci0JCXN3aXRjaCAoc2huZHgpCi0JCSAgewotCQkgIGNhc2UgTUFQX09ORVNZTVRBQjoKLQkJICAgIHNobmR4ID0gZWxmX29uZXN5bXRhYiAoYWJmZCk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIE1BUF9EWU5TWU1UQUI6Ci0JCSAgICBzaG5keCA9IGVsZl9keW5zeW10YWIgKGFiZmQpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBNQVBfU1RSVEFCOgotCQkgICAgc2huZHggPSBlbGZfdGRhdGEgKGFiZmQpLT5zdHJ0YWJfc2VjdGlvbjsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgTUFQX1NIU1RSVEFCOgotCQkgICAgc2huZHggPSBlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9zZWN0aW9uOwotCQkgICAgYnJlYWs7Ci0JCSAgZGVmYXVsdDoKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOwotCi0JCWlmIChzaG5keCA9PSAtMSkKLQkJICB7Ci0JCSAgICBhc2VjdGlvbiAqc2VjMjsKLQotCQkgICAgLyogV3JpdGluZyB0aGlzIHdvdWxkIGJlIGEgaGVsbCBvZiBhIGxvdCBlYXNpZXIgaWYKLQkJICAgICAgIHdlIGhhZCBzb21lIGRlY2VudCBkb2N1bWVudGF0aW9uIG9uIGJmZCwgYW5kCi0JCSAgICAgICBrbmV3IHdoYXQgdG8gZXhwZWN0IG9mIHRoZSBsaWJyYXJ5LCBhbmQgd2hhdCB0bwotCQkgICAgICAgZGVtYW5kIG9mIGFwcGxpY2F0aW9ucy4gIEZvciBleGFtcGxlLCBpdAotCQkgICAgICAgYXBwZWFycyB0aGF0IGBvYmpjb3B5JyBtaWdodCBub3Qgc2V0IHRoZQotCQkgICAgICAgc2VjdGlvbiBvZiBhIHN5bWJvbCB0byBiZSBhIHNlY3Rpb24gdGhhdCBpcwotCQkgICAgICAgYWN0dWFsbHkgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkJICAgIHNlYzIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc2VjLT5uYW1lKTsKLQkJICAgIEJGRF9BU1NFUlQgKHNlYzIgIT0gMCk7Ci0JCSAgICBzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjMik7Ci0JCSAgICBCRkRfQVNTRVJUIChzaG5keCAhPSAtMSk7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBzeW0uc3Rfc2huZHggPSBzaG5keDsKLQkgIH0KLQotCWlmICgoZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pICE9IDApCi0JICB0eXBlID0gU1RUX0ZVTkM7Ci0JZWxzZSBpZiAoKGZsYWdzICYgQlNGX09CSkVDVCkgIT0gMCkKLQkgIHR5cGUgPSBTVFRfT0JKRUNUOwotCWVsc2UKLQkgIHR5cGUgPSBTVFRfTk9UWVBFOwotCi0gICAgICAgIC8qIFByb2Nlc3Nvci1zcGVjaWZpYyB0eXBlcyAqLwotICAgICAgICBpZiAoYmVkLT5lbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUpCi0gICAgICAgICAgdHlwZSA9ICgqYmVkLT5lbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUpICgmdHlwZV9wdHItPmludGVybmFsX2VsZl9zeW0sIHR5cGUpOwotCi0JaWYgKGZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotCSAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfU0VDVElPTik7Ci0JZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1zW2lkeF0tPnNlY3Rpb24pKQotCSAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgdHlwZSk7Ci0JZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1zW2lkeF0tPnNlY3Rpb24pKQotCSAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoKChmbGFncyAmIEJTRl9XRUFLKQotCQkJCSAgICAgID8gU1RCX1dFQUsKLQkJCQkgICAgICA6IFNUQl9HTE9CQUwpLAotCQkJCSAgICAgdHlwZSk7Ci0JZWxzZSBpZiAoZmxhZ3MgJiBCU0ZfRklMRSkKLQkgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX0ZJTEUpOwotCWVsc2UKLQkgIHsKLQkgICAgaW50IGJpbmQgPSBTVEJfTE9DQUw7Ci0KLQkgICAgaWYgKGZsYWdzICYgQlNGX0xPQ0FMKQotCSAgICAgIGJpbmQgPSBTVEJfTE9DQUw7Ci0JICAgIGVsc2UgaWYgKGZsYWdzICYgQlNGX1dFQUspCi0JICAgICAgYmluZCA9IFNUQl9XRUFLOwotCSAgICBlbHNlIGlmIChmbGFncyAmIEJTRl9HTE9CQUwpCi0JICAgICAgYmluZCA9IFNUQl9HTE9CQUw7Ci0KLQkgICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoYmluZCwgdHlwZSk7Ci0JICB9Ci0KLQlpZiAodHlwZV9wdHIgIT0gTlVMTCkKLQkgIHN5bS5zdF9vdGhlciA9IHR5cGVfcHRyLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyOwotCWVsc2UKLQkgIHN5bS5zdF9vdGhlciA9IDA7Ci0KLQliZWQtPnMtPnN3YXBfc3ltYm9sX291dCAoYWJmZCwgJnN5bSwgKFBUUikgb3V0Ym91bmRfc3ltcyk7Ci0Jb3V0Ym91bmRfc3ltcyArPSBiZWQtPnMtPnNpemVvZl9zeW07Ci0gICAgICB9Ci0KLSAgICAqc3R0cCA9IHN0dDsKLSAgICBzeW1zdHJ0YWJfaGRyLT5zaF9zaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoc3R0KTsKLSAgICBzeW1zdHJ0YWJfaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKLQotICAgIHN5bXN0cnRhYl9oZHItPnNoX2ZsYWdzID0gMDsKLSAgICBzeW1zdHJ0YWJfaGRyLT5zaF9hZGRyID0gMDsKLSAgICBzeW1zdHJ0YWJfaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgICBzeW1zdHJ0YWJfaGRyLT5zaF9saW5rID0gMDsKLSAgICBzeW1zdHJ0YWJfaGRyLT5zaF9pbmZvID0gMDsKLSAgICBzeW1zdHJ0YWJfaGRyLT5zaF9hZGRyYWxpZ24gPSAxOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIGhvbGQgdGhlIHN5bXRhYiB2ZWN0b3IuCi0KLSAgIE5vdGUgdGhhdCB3ZSBiYXNlIGl0IG9uIHRoZSBjb3VudCBwbHVzIDEsIHNpbmNlIHdlIHdpbGwgbnVsbCB0ZXJtaW5hdGUKLSAgIHRoZSB2ZWN0b3IgYWxsb2NhdGVkIGJhc2VkIG9uIHRoaXMgc2l6ZS4gIEhvd2V2ZXIsIHRoZSBFTEYgc3ltYm9sIHRhYmxlCi0gICBhbHdheXMgaGFzIGEgZHVtbXkgZW50cnkgYXMgc3ltYm9sICMwLCBzbyBpdCBlbmRzIHVwIGV2ZW4uICAqLwotCi1sb25nCi1fYmZkX2VsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGxvbmcgc3ltY291bnQ7Ci0gIGxvbmcgc3ltdGFiX3NpemU7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLQotICBzeW1jb3VudCA9IGhkci0+c2hfc2l6ZSAvIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX3N5bTsKLSAgc3ltdGFiX3NpemUgPSAoc3ltY291bnQgLSAxICsgMSkgKiAoc2l6ZW9mIChhc3ltYm9sICopKTsKLQotICByZXR1cm4gc3ltdGFiX3NpemU7Ci19Ci0KLWxvbmcKLV9iZmRfZWxmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIHN5bWNvdW50OwotICBsb25nIHN5bXRhYl9zaXplOwotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnN5bXRhYl9oZHI7Ci0KLSAgaWYgKGVsZl9keW5zeW10YWIgKGFiZmQpID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgc3ltY291bnQgPSBoZHItPnNoX3NpemUgLyBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9zeW07Ci0gIHN5bXRhYl9zaXplID0gKHN5bWNvdW50IC0gMSArIDEpICogKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0KLSAgcmV0dXJuIHN5bXRhYl9zaXplOwotfQotCi1sb25nCi1fYmZkX2VsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci17Ci0gIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLS8qIENhbm9uaWNhbGl6ZSB0aGUgcmVsb2NzLiAgKi8KLQotbG9uZwotX2JmZF9lbGZfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBpZiAoISBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNsdXJwX3JlbG9jX3RhYmxlIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24sCi0JCQkJCQkJICAgc3ltYm9scywKLQkJCQkJCQkgICBmYWxzZSkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIGZvciAoaSA9IDA7IGkgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgaSsrKQotICAgICpyZWxwdHIrKyA9IHRibHB0cisrOwotCi0gICpyZWxwdHIgPSBOVUxMOwotCi0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotbG9uZwotX2JmZF9lbGZfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIGxvbmcgc3ltY291bnQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNsdXJwX3N5bWJvbF90YWJsZQotICAgIChhYmZkLCBhbG9jYXRpb24sIGZhbHNlKTsKLQotICBpZiAoc3ltY291bnQgPj0gMCkKLSAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IHN5bWNvdW50OwotICByZXR1cm4gc3ltY291bnQ7Ci19Ci0KLWxvbmcKLV9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIHJldHVybiBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNsdXJwX3N5bWJvbF90YWJsZQotICAgIChhYmZkLCBhbG9jYXRpb24sIHRydWUpOwotfQotCi0vKiBSZXR1cm4gdGhlIHNpemUgcmVxdWlyZWQgZm9yIHRoZSBkeW5hbWljIHJlbG9jIGVudHJpZXMuICBBbnkKLSAgIHNlY3Rpb24gdGhhdCB3YXMgYWN0dWFsbHkgaW5zdGFsbGVkIGluIHRoZSBCRkQsIGFuZCBoYXMgdHlwZQotICAgU0hUX1JFTCBvciBTSFRfUkVMQSwgYW5kIHVzZXMgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBpcwotICAgY29uc2lkZXJlZCB0byBiZSBhIGR5bmFtaWMgcmVsb2Mgc2VjdGlvbi4gICovCi0KLWxvbmcKLV9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGxvbmcgcmV0OwotICBhc2VjdGlvbiAqczsKLQotICBpZiAoZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXQgPSBzaXplb2YgKGFyZWxlbnQgKik7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfbGluayA9PSBlbGZfZHluc3ltdGFiIChhYmZkKQotCSYmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMCi0JICAgIHx8IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9SRUxBKSkKLSAgICAgIHJldCArPSAoKHMtPl9yYXdfc2l6ZSAvIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9lbnRzaXplKQotCSAgICAgICogc2l6ZW9mIChhcmVsZW50ICopKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBDYW5vbmljYWxpemUgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzLiAgTm90ZSB0aGF0IHdlIHJldHVybgotICAgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMgYXMgYSBzaW5nbGUgYmxvY2ssIGFsdGhvdWdoIHRoZXkgYXJlCi0gICBhY3R1YWxseSBhc3NvY2lhdGVkIHdpdGggcGFydGljdWxhciBzZWN0aW9uczsgdGhlIGludGVyZmFjZSwgd2hpY2gKLSAgIHdhcyBkZXNpZ25lZCBmb3IgU3VuT1Mgc3R5bGUgc2hhcmVkIGxpYnJhcmllcywgZXhwZWN0cyB0aGF0IHRoZXJlCi0gICBpcyBvbmx5IG9uZSBzZXQgb2YgZHluYW1pYyByZWxvY3MuICBBbnkgc2VjdGlvbiB0aGF0IHdhcyBhY3R1YWxseQotICAgaW5zdGFsbGVkIGluIHRoZSBCRkQsIGFuZCBoYXMgdHlwZSBTSFRfUkVMIG9yIFNIVF9SRUxBLCBhbmQgdXNlcwotICAgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgZHluYW1pYyByZWxvYwotICAgc2VjdGlvbi4gICovCi0KLWxvbmcKLV9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCBzdG9yYWdlLCBzeW1zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKipzdG9yYWdlOwotICAgICBhc3ltYm9sICoqc3ltczsKLXsKLSAgYm9vbGVhbiAoKnNsdXJwX3JlbG9jcykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLSAgYXNlY3Rpb24gKnM7Ci0gIGxvbmcgcmV0OwotCi0gIGlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHNsdXJwX3JlbG9jcyA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2x1cnBfcmVsb2NfdGFibGU7Ci0gIHJldCA9IDA7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfbGluayA9PSBlbGZfZHluc3ltdGFiIChhYmZkKQotCSAgJiYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9SRUwKLQkgICAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMQSkpCi0JewotCSAgYXJlbGVudCAqcDsKLQkgIGxvbmcgY291bnQsIGk7Ci0KLQkgIGlmICghICgqc2x1cnBfcmVsb2NzKSAoYWJmZCwgcywgc3ltcywgdHJ1ZSkpCi0JICAgIHJldHVybiAtMTsKLQkgIGNvdW50ID0gcy0+X3Jhd19zaXplIC8gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2VudHNpemU7Ci0JICBwID0gcy0+cmVsb2NhdGlvbjsKLQkgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCSAgICAqc3RvcmFnZSsrID0gcCsrOwotCSAgcmV0ICs9IGNvdW50OwotCX0KLSAgICB9Ci0KLSAgKnN0b3JhZ2UgPSBOVUxMOwotCi0gIHJldHVybiByZXQ7Ci19Ci0MCi0vKiBSZWFkIGluIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLQotICBpZiAoZWxmX2R5bnZlcmRlZiAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICAgRWxmX0V4dGVybmFsX1ZlcmRlZiAqZXZlcmRlZjsKLSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgKml2ZXJkZWY7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcmRlZl9oZHI7Ci0KLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZiA9Ci0JKChFbGZfSW50ZXJuYWxfVmVyZGVmICopCi0JIGJmZF96YWxsb2MgKGFiZmQsIGhkci0+c2hfaW5mbyAqIHNpemVvZiAoRWxmX0ludGVybmFsX1ZlcmRlZikpKTsKLSAgICAgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWYgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcmRlZnMgPSBoZHItPnNoX2luZm87Ci0KLSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGhkci0+c2hfc2l6ZSk7Ci0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfcmVhZCAoKFBUUikgY29udGVudHMsIDEsIGhkci0+c2hfc2l6ZSwgYWJmZCkgIT0gaGRyLT5zaF9zaXplKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBldmVyZGVmID0gKEVsZl9FeHRlcm5hbF9WZXJkZWYgKikgY29udGVudHM7Ci0gICAgICBpdmVyZGVmID0gZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmOwotICAgICAgZm9yIChpID0gMDsgaSA8IGhkci0+c2hfaW5mbzsgaSsrLCBpdmVyZGVmKyspCi0JewotCSAgRWxmX0V4dGVybmFsX1ZlcmRhdXggKmV2ZXJkYXV4OwotCSAgRWxmX0ludGVybmFsX1ZlcmRhdXggKml2ZXJkYXV4OwotCSAgdW5zaWduZWQgaW50IGo7Ci0KLQkgIF9iZmRfZWxmX3N3YXBfdmVyZGVmX2luIChhYmZkLCBldmVyZGVmLCBpdmVyZGVmKTsKLQotCSAgaXZlcmRlZi0+dmRfYmZkID0gYWJmZDsKLQotCSAgaXZlcmRlZi0+dmRfYXV4cHRyID0gKChFbGZfSW50ZXJuYWxfVmVyZGF1eCAqKQotCQkJCWJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAgKGl2ZXJkZWYtPnZkX2NudAotCQkJCQkgICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9WZXJkYXV4KSkpKTsKLQkgIGlmIChpdmVyZGVmLT52ZF9hdXhwdHIgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGV2ZXJkYXV4ID0gKChFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqKQotCQkgICAgICAoKGJmZF9ieXRlICopIGV2ZXJkZWYgKyBpdmVyZGVmLT52ZF9hdXgpKTsKLQkgIGl2ZXJkYXV4ID0gaXZlcmRlZi0+dmRfYXV4cHRyOwotCSAgZm9yIChqID0gMDsgaiA8IGl2ZXJkZWYtPnZkX2NudDsgaisrLCBpdmVyZGF1eCsrKQotCSAgICB7Ci0JICAgICAgX2JmZF9lbGZfc3dhcF92ZXJkYXV4X2luIChhYmZkLCBldmVyZGF1eCwgaXZlcmRhdXgpOwotCi0JICAgICAgaXZlcmRhdXgtPnZkYV9ub2RlbmFtZSA9Ci0JCWJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGhkci0+c2hfbGluaywKLQkJCQkJCSBpdmVyZGF1eC0+dmRhX25hbWUpOwotCSAgICAgIGlmIChpdmVyZGF1eC0+dmRhX25vZGVuYW1lID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgaWYgKGogKyAxIDwgaXZlcmRlZi0+dmRfY250KQotCQlpdmVyZGF1eC0+dmRhX25leHRwdHIgPSBpdmVyZGF1eCArIDE7Ci0JICAgICAgZWxzZQotCQlpdmVyZGF1eC0+dmRhX25leHRwdHIgPSBOVUxMOwotCi0JICAgICAgZXZlcmRhdXggPSAoKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopCi0JCQkgICgoYmZkX2J5dGUgKikgZXZlcmRhdXggKyBpdmVyZGF1eC0+dmRhX25leHQpKTsKLQkgICAgfQotCi0JICBpdmVyZGVmLT52ZF9ub2RlbmFtZSA9IGl2ZXJkZWYtPnZkX2F1eHB0ci0+dmRhX25vZGVuYW1lOwotCi0JICBpZiAoaSArIDEgPCBoZHItPnNoX2luZm8pCi0JICAgIGl2ZXJkZWYtPnZkX25leHRkZWYgPSBpdmVyZGVmICsgMTsKLQkgIGVsc2UKLQkgICAgaXZlcmRlZi0+dmRfbmV4dGRlZiA9IE5VTEw7Ci0KLQkgIGV2ZXJkZWYgPSAoKEVsZl9FeHRlcm5hbF9WZXJkZWYgKikKLQkJICAgICAoKGJmZF9ieXRlICopIGV2ZXJkZWYgKyBpdmVyZGVmLT52ZF9uZXh0KSk7Ci0JfQotCi0gICAgICBmcmVlIChjb250ZW50cyk7Ci0gICAgICBjb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChlbGZfZHludmVycmVmIChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqZXZlcm5lZWQ7Ci0gICAgICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqaXZlcm5lZWQ7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnJlZl9oZHI7Ci0KLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZiA9Ci0JKChFbGZfSW50ZXJuYWxfVmVybmVlZCAqKQotCSBiZmRfemFsbG9jIChhYmZkLCBoZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9WZXJuZWVkKSkpOwotICAgICAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZiA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT5jdmVycmVmcyA9IGhkci0+c2hfaW5mbzsKLQotICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoaGRyLT5zaF9zaXplKTsKLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBoZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF9yZWFkICgoUFRSKSBjb250ZW50cywgMSwgaGRyLT5zaF9zaXplLCBhYmZkKSAhPSBoZHItPnNoX3NpemUpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGV2ZXJuZWVkID0gKEVsZl9FeHRlcm5hbF9WZXJuZWVkICopIGNvbnRlbnRzOwotICAgICAgaXZlcm5lZWQgPSBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWY7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgaGRyLT5zaF9pbmZvOyBpKyssIGl2ZXJuZWVkKyspCi0JewotCSAgRWxmX0V4dGVybmFsX1Zlcm5hdXggKmV2ZXJuYXV4OwotCSAgRWxmX0ludGVybmFsX1Zlcm5hdXggKml2ZXJuYXV4OwotCSAgdW5zaWduZWQgaW50IGo7Ci0KLQkgIF9iZmRfZWxmX3N3YXBfdmVybmVlZF9pbiAoYWJmZCwgZXZlcm5lZWQsIGl2ZXJuZWVkKTsKLQotCSAgaXZlcm5lZWQtPnZuX2JmZCA9IGFiZmQ7Ci0KLQkgIGl2ZXJuZWVkLT52bl9maWxlbmFtZSA9Ci0JICAgIGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGhkci0+c2hfbGluaywKLQkJCQkJICAgICBpdmVybmVlZC0+dm5fZmlsZSk7Ci0JICBpZiAoaXZlcm5lZWQtPnZuX2ZpbGVuYW1lID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpdmVybmVlZC0+dm5fYXV4cHRyID0KLQkgICAgKChFbGZfSW50ZXJuYWxfVmVybmF1eCAqKQotCSAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJaXZlcm5lZWQtPnZuX2NudCAqIHNpemVvZiAoRWxmX0ludGVybmFsX1Zlcm5hdXgpKSk7Ci0KLQkgIGV2ZXJuYXV4ID0gKChFbGZfRXh0ZXJuYWxfVmVybmF1eCAqKQotCQkgICAgICAoKGJmZF9ieXRlICopIGV2ZXJuZWVkICsgaXZlcm5lZWQtPnZuX2F1eCkpOwotCSAgaXZlcm5hdXggPSBpdmVybmVlZC0+dm5fYXV4cHRyOwotCSAgZm9yIChqID0gMDsgaiA8IGl2ZXJuZWVkLT52bl9jbnQ7IGorKywgaXZlcm5hdXgrKykKLQkgICAgewotCSAgICAgIF9iZmRfZWxmX3N3YXBfdmVybmF1eF9pbiAoYWJmZCwgZXZlcm5hdXgsIGl2ZXJuYXV4KTsKLQotCSAgICAgIGl2ZXJuYXV4LT52bmFfbm9kZW5hbWUgPQotCQliZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBoZHItPnNoX2xpbmssCi0JCQkJCQkgaXZlcm5hdXgtPnZuYV9uYW1lKTsKLQkgICAgICBpZiAoaXZlcm5hdXgtPnZuYV9ub2RlbmFtZSA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIGlmIChqICsgMSA8IGl2ZXJuZWVkLT52bl9jbnQpCi0JCWl2ZXJuYXV4LT52bmFfbmV4dHB0ciA9IGl2ZXJuYXV4ICsgMTsKLQkgICAgICBlbHNlCi0JCWl2ZXJuYXV4LT52bmFfbmV4dHB0ciA9IE5VTEw7Ci0KLQkgICAgICBldmVybmF1eCA9ICgoRWxmX0V4dGVybmFsX1Zlcm5hdXggKikKLQkJCSAgKChiZmRfYnl0ZSAqKSBldmVybmF1eCArIGl2ZXJuYXV4LT52bmFfbmV4dCkpOwotCSAgICB9Ci0KLQkgIGlmIChpICsgMSA8IGhkci0+c2hfaW5mbykKLQkgICAgaXZlcm5lZWQtPnZuX25leHRyZWYgPSBpdmVybmVlZCArIDE7Ci0JICBlbHNlCi0JICAgIGl2ZXJuZWVkLT52bl9uZXh0cmVmID0gTlVMTDsKLQotCSAgZXZlcm5lZWQgPSAoKEVsZl9FeHRlcm5hbF9WZXJuZWVkICopCi0JCSAgICAgICgoYmZkX2J5dGUgKikgZXZlcm5lZWQgKyBpdmVybmVlZC0+dm5fbmV4dCkpOwotCX0KLQotICAgICAgZnJlZSAoY29udGVudHMpOwotICAgICAgY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0gICAgZnJlZSAoY29udGVudHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi1hc3ltYm9sICoKLV9iZmRfZWxmX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGVsZl9zeW1ib2xfdHlwZSAqbmV3c3ltOwotCi0gIG5ld3N5bSA9IChlbGZfc3ltYm9sX3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChlbGZfc3ltYm9sX3R5cGUpKTsKLSAgaWYgKCFuZXdzeW0pCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuZXdzeW0tPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgICAgIHJldHVybiAmbmV3c3ltLT5zeW1ib2w7Ci0gICAgfQotfQotCi12b2lkCi1fYmZkX2VsZl9nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgbmFtZSBpbXBsaWVzIGEgbG9jYWwgc3ltYm9sLiAgTW9zdCB0YXJnZXRzCi0gICB1c2UgdGhpcyBmdW5jdGlvbiBmb3IgdGhlIGlzX2xvY2FsX2xhYmVsX25hbWUgZW50cnkgcG9pbnQsIGJ1dCBzb21lCi0gICBvdmVycmlkZSBpdC4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgLyogTm9ybWFsIGxvY2FsIHN5bWJvbHMgc3RhcnQgd2l0aCBgYC5MJycuICAqLwotICBpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnTCcpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQXQgbGVhc3Qgc29tZSBTVlI0IGNvbXBpbGVycyAoZS5nLiwgVW5peFdhcmUgMi4xIGNjKSBnZW5lcmF0ZQotICAgICBEV0FSRiBkZWJ1Z2dpbmcgc3ltYm9scyBzdGFydGluZyB3aXRoIGBgLi4nJy4gICovCi0gIGlmIChuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICcuJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBnY2Mgd2lsbCBzb21ldGltZXMgZ2VuZXJhdGUgc3ltYm9scyBiZWdpbm5pbmcgd2l0aCBgYF8uTF8nJyB3aGVuCi0gICAgIGVtaXR0aW5nIERXQVJGIGRlYnVnZ2luZyBvdXRwdXQuICBJIHN1c3BlY3QgdGhpcyBpcyBhY3R1YWxseSBhCi0gICAgIHNtYWxsIGJ1ZyBpbiBnY2MgKGl0IGNhbGxzIEFTTV9PVVRQVVRfTEFCRUwgd2hlbiBpdCBzaG91bGQgY2FsbAotICAgICBBU01fR0VORVJBVEVfSU5URVJOQUxfTEFCRUwsIGFuZCB0aGlzIGNhdXNlcyB0aGUgbGVhZGluZwotICAgICB1bmRlcnNjb3JlIHRvIGJlIGVtaXR0ZWQgb24gc29tZSBFTEYgdGFyZ2V0cykuICBGb3IgZWFzZSBvZiB1c2UsCi0gICAgIHdlIHRyZWF0IHN1Y2ggc3ltYm9scyBhcyBsb2NhbC4gICovCi0gIGlmIChuYW1lWzBdID09ICdfJyAmJiBuYW1lWzFdID09ICcuJyAmJiBuYW1lWzJdID09ICdMJyAmJiBuYW1lWzNdID09ICdfJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWFsZW50ICoKLV9iZmRfZWxmX2dldF9saW5lbm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1ib29sZWFuCi1fYmZkX2VsZl9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIC8qIElmIHRoaXMgaXNuJ3QgdGhlIHJpZ2h0IGFyY2hpdGVjdHVyZSBmb3IgdGhpcyBiYWNrZW5kLCBhbmQgdGhpcwotICAgICBpc24ndCB0aGUgZ2VuZXJpYyBiYWNrZW5kLCBmYWlsLiAgKi8KLSAgaWYgKGFyY2ggIT0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5hcmNoCi0gICAgICAmJiBhcmNoICE9IGJmZF9hcmNoX3Vua25vd24KLSAgICAgICYmIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+YXJjaCAhPSBiZmRfYXJjaF91bmtub3duKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci19Ci0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB0byBhIHBhcnRpY3VsYXIgc2VjdGlvbiBhbmQgb2Zmc2V0LCBmb3IgZXJyb3IKLSAgIHJlcG9ydGluZy4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLAotCQkJICAgIHNlY3Rpb24sCi0JCQkgICAgc3ltYm9scywKLQkJCSAgICBvZmZzZXQsCi0JCQkgICAgZmlsZW5hbWVfcHRyLAotCQkJICAgIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkgICAgbGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgQ09OU1QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHI7Ci17Ci0gIGJvb2xlYW4gZm91bmQ7Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBhc3ltYm9sICpmdW5jOwotICBiZmRfdm1hIGxvd19mdW5jOwotICBhc3ltYm9sICoqcDsKLQotICBpZiAoX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKLQkJCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgCi0JCQkJICAgICBsaW5lX3B0cikpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICAgICBsaW5lX3B0cikpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKCEgX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHN5bWJvbHMsIHNlY3Rpb24sIG9mZnNldCwKLQkJCQkJICAgICAmZm91bmQsIGZpbGVuYW1lX3B0ciwKLQkJCQkJICAgICBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0ciwKLQkJCQkJICAgICAmZWxmX3RkYXRhIChhYmZkKS0+bGluZV9pbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChmb3VuZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoc3ltYm9scyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmaWxlbmFtZSA9IE5VTEw7Ci0gIGZ1bmMgPSBOVUxMOwotICBsb3dfZnVuYyA9IDA7Ci0KLSAgZm9yIChwID0gc3ltYm9sczsgKnAgIT0gTlVMTDsgcCsrKQotICAgIHsKLSAgICAgIGVsZl9zeW1ib2xfdHlwZSAqcTsKLQotICAgICAgcSA9IChlbGZfc3ltYm9sX3R5cGUgKikgKnA7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb24gKCZxLT5zeW1ib2wpICE9IHNlY3Rpb24pCi0JY29udGludWU7Ci0KLSAgICAgIHN3aXRjaCAoRUxGX1NUX1RZUEUgKHEtPmludGVybmFsX2VsZl9zeW0uc3RfaW5mbykpCi0JewotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQljYXNlIFNUVF9GSUxFOgotCSAgZmlsZW5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgmcS0+c3ltYm9sKTsKLQkgIGJyZWFrOwotCWNhc2UgU1RUX05PVFlQRToKLQljYXNlIFNUVF9GVU5DOgotCSAgaWYgKHEtPnN5bWJvbC5zZWN0aW9uID09IHNlY3Rpb24KLQkgICAgICAmJiBxLT5zeW1ib2wudmFsdWUgPj0gbG93X2Z1bmMKLQkgICAgICAmJiBxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgZnVuYyA9IChhc3ltYm9sICopIHE7Ci0JICAgICAgbG93X2Z1bmMgPSBxLT5zeW1ib2wudmFsdWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZ1bmMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKmZpbGVuYW1lX3B0ciA9IGZpbGVuYW1lOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IGJmZF9hc3ltYm9sX25hbWUgKGZ1bmMpOwotICAqbGluZV9wdHIgPSAwOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50Ci1fYmZkX2VsZl9zaXplb2ZfaGVhZGVycyAoYWJmZCwgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiByZWxvYzsKLXsKLSAgaW50IHJldDsKLQotICByZXQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9laGRyOwotICBpZiAoISByZWxvYykKLSAgICByZXQgKz0gZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUgKGFiZmQpOwotICByZXR1cm4gcmV0OwotfQotCi1ib29sZWFuCi1fYmZkX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQotICBpZiAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuCi0gICAgICAmJiAhIF9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucwotICAgICAgKGFiZmQsIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSBOVUxMKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50aGlzX2hkcjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGhkci0+c2hfb2Zmc2V0ICsgb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3dyaXRlIChsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZAotX2JmZF9lbGZfbm9faW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBhYm9ydCAoKTsKLX0KLQotI2lmIDAKLXZvaWQKLV9iZmRfZWxmX25vX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0jZW5kaWYKLQotLyogVHJ5IHRvIGNvbnZlcnQgYSBub24tRUxGIHJlbG9jIGludG8gYW4gRUxGIG9uZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jIChhYmZkLCBhcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYXJlbG9jOwotewotICAvKiBDaGVjayB3aGV0aGVyIHdlIHJlYWxseSBoYXZlIGFuIEVMRiBob3d0by4gKi8KLQotICBpZiAoKCphcmVsb2MtPnN5bV9wdHJfcHRyKS0+dGhlX2JmZC0+eHZlYyAhPSBhYmZkLT54dmVjKQotICAgIHsKLSAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgICAgIC8qIEFsaWVuIHJlbG9jOiBUcnkgdG8gZGV0ZXJtaW5lIGl0cyB0eXBlIHRvIHJlcGxhY2UgaXQgd2l0aCBhbgotCSBlcXVpdmFsZW50IEVMRiByZWxvYy4gKi8KLQotICAgICAgaWYgKGFyZWxvYy0+aG93dG8tPnBjX3JlbGF0aXZlKQotCXsKLQkgIHN3aXRjaCAoYXJlbG9jLT5ob3d0by0+Yml0c2l6ZSkKLQkgICAgewotCSAgICBjYXNlIDg6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ184X1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDEyOgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMTJfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMTY6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAyNDoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzI0X1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDMyOgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgNjQ6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ182NF9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBnb3RvIGZhaWw7Ci0JICAgIH0KLQotCSAgaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpOwotCi0JICBpZiAoYXJlbG9jLT5ob3d0by0+cGNyZWxfb2Zmc2V0ICE9IGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JICAgIHsKLQkgICAgICBpZiAoaG93dG8tPnBjcmVsX29mZnNldCkKLQkJYXJlbG9jLT5hZGRlbmQgKz0gYXJlbG9jLT5hZGRyZXNzOwotCSAgICAgIGVsc2UKLQkJYXJlbG9jLT5hZGRlbmQgLT0gYXJlbG9jLT5hZGRyZXNzOyAvKiBhZGRlbmQgaXMgdW5zaWduZWQhISAqLwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAoYXJlbG9jLT5ob3d0by0+Yml0c2l6ZSkKLQkgICAgewotCSAgICBjYXNlIDg6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ184OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE0OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMTQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMTY6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18xNjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAyNjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzI2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDMyOgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgNjQ6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ182NDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBnb3RvIGZhaWw7Ci0JICAgIH0KLQotCSAgaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpOwotCX0KLQotICAgICAgaWYgKGhvd3RvKQotCWFyZWxvYy0+aG93dG8gPSBob3d0bzsKLSAgICAgIGVsc2UKLQlnb3RvIGZhaWw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZmFpbDoKLSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgKF8oIiVzOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUgJXMiKSwKLSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGFyZWxvYy0+aG93dG8tPm5hbWUpOwotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sZWFuCi1fYmZkX2VsZl9jbG9zZV9hbmRfY2xlYW51cCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgaWYgKGVsZl9zaHN0cnRhYiAoYWJmZCkgIT0gTlVMTCkKLQlfYmZkX3N0cmluZ3RhYl9mcmVlIChlbGZfc2hzdHJ0YWIgKGFiZmQpKTsKLSAgICB9Ci0KLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cCAoYWJmZCk7Ci19Ci0KLS8qIEZvciBSZWwgdGFyZ2V0cywgd2UgZW5jb2RlIG1lYW5pbmdmdWwgZGF0YSBmb3IgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWQotICAgaW4gdGhlIHJlbG9jYXRpb24ncyBvZmZzZXQuICBUaHVzIHdlIGNhbm5vdCBhbGxvdyBhbnkgc29ydCBvZiBzYW5pdHkKLSAgIHJhbmdlLWNoZWNraW5nIHRvIGludGVyZmVyZS4gIFRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0byBkbyBpbiBwcm9jZXNzaW5nCi0gICB0aGlzIHJlbG9jLiAgKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuIChhYmZkLCByZSwgc3ltYm9sLCBkYXRhLCBpcywgb2JmZCwgZXJybXNnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlOwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaXM7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotDAotLyogRWxmIGNvcmUgZmlsZSBzdXBwb3J0LiAgTXVjaCBvZiB0aGlzIG9ubHkgd29ya3Mgb24gbmF0aXZlCi0gICB0b29sY2hhaW5zLCBzaW5jZSB3ZSByZWx5IG9uIGtub3dpbmcgdGhlCi0gICBtYWNoaW5lLWRlcGVuZGVudCBwcm9jZnMgc3RydWN0dXJlIGluIG9yZGVyIHRvIHBpY2sKLSAgIG91dCBkZXRhaWxzIGFib3V0IHRoZSBjb3JlZmlsZS4gKi8KLQotI2lmZGVmIEhBVkVfU1lTX1BST0NGU19ICi0jIGluY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLSNlbmRpZgotCi0KLS8qIERlZmluZSBvZmZzZXRvZiBmb3IgdGhvc2Ugc3lzdGVtcyB3aGljaCBsYWNrIGl0LiAqLwotCi0jaWZuZGVmIG9mZnNldG9mCi0jIGRlZmluZSBvZmZzZXRvZihUWVBFLCBNRU1CRVIpICgodW5zaWduZWQgbG9uZykgJigoVFlQRSAqKTApLT5NRU1CRVIpCi0jZW5kaWYKLQotCi0vKiBGSVhNRTogdGhpcyBpcyBraW5kYSB3cm9uZywgYnV0IGl0J3Mgd2hhdCBnZGIgd2FudHMuICovCi0KLXN0YXRpYyBpbnQKLWVsZmNvcmVfbWFrZV9waWQgKGFiZmQpCi0gICAgIGJmZCogYWJmZDsKLXsKLSAgcmV0dXJuICgoZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9sd3BpZCA8PCAxNikKLQkgICsgKGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfcGlkKSk7Ci19Ci0KLQotLyogSWYgdGhlcmUgaXNuJ3QgYSBzZWN0aW9uIGNhbGxlZCBOQU1FLCBtYWtlIG9uZSwgdXNpbmcKLSAgIGRhdGEgZnJvbSBTRUNULiAgTm90ZSwgdGhpcyBmdW5jdGlvbiB3aWxsIGdlbmVyYXRlIGEKLSAgIHJlZmVyZW5jZSB0byBOQU1FLCBzbyB5b3Ugc2hvdWxkbid0IGRlYWxsb2NhdGUgb3IKLSAgIG92ZXJ3cml0ZSBpdC4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfbWF5YmVfbWFrZV9zZWN0IChhYmZkLCBuYW1lLCBzZWN0KQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIGNoYXIqIG5hbWU7Ci0gICAgIGFzZWN0aW9uKiBzZWN0OwotewotICBhc2VjdGlvbiogc2VjdDI7Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKSAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNlY3QyID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gIGlmIChzZWN0MiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzZWN0Mi0+X3Jhd19zaXplID0gc2VjdC0+X3Jhd19zaXplOwotICBzZWN0Mi0+ZmlsZXBvcyA9IHNlY3QtPmZpbGVwb3M7Ci0gIHNlY3QyLT5mbGFncyA9IHNlY3QtPmZsYWdzOwotICBzZWN0Mi0+YWxpZ25tZW50X3Bvd2VyID0gc2VjdC0+YWxpZ25tZW50X3Bvd2VyOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBwcnN0YXR1c190IGV4aXN0cyBvbjoKLSAgICAgc29sYXJpcyAyLls1NjddCi0gICAgIGxpbnV4IDIuWzAxXSArIGdsaWJjCi0gICAgIHVuaXh3YXJlIDQuMgotKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfUFJTVEFUVVNfVCkKLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX2dyb2tfcHJzdGF0dXMgKGFiZmQsIG5vdGUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Ci17Ci0gIHByc3RhdHVzX3QgcHJzdGF0OwotICBjaGFyIGJ1ZlsxMDBdOwotICBjaGFyKiBuYW1lOwotICBhc2VjdGlvbiogc2VjdDsKLQotICBpZiAobm90ZS0+ZGVzY3N6ICE9IHNpemVvZiAocHJzdGF0KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBtZW1jcHkgKCZwcnN0YXQsIG5vdGUtPmRlc2NkYXRhLCBzaXplb2YgKHByc3RhdCkpOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfc2lnbmFsID0gcHJzdGF0LnByX2N1cnNpZzsKLSAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9waWQgPSBwcnN0YXQucHJfcGlkOwotCi0gIC8qIHByX3dobyBleGlzdHMgb246Ci0gICAgICAgc29sYXJpcyAyLls1NjddCi0gICAgICAgdW5peHdhcmUgNC4yCi0gICAgIHByX3dobyBkb2Vzbid0IGV4aXN0IG9uOgotICAgICAgIGxpbnV4IDIuWzAxXQotICAqLwotI2lmIGRlZmluZWQgKEhBVkVfUFJTVEFUVVNfVF9QUl9XSE8pCi0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfbHdwaWQgPSBwcnN0YXQucHJfd2hvOwotI2VuZGlmCi0KLSAgLyogTWFrZSBhICIucmVnLzk5OSIgc2VjdGlvbi4gKi8KLQotICBzcHJpbnRmIChidWYsICIucmVnLyVkIiwgZWxmY29yZV9tYWtlX3BpZCAoYWJmZCkpOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKGJ1ZikgKyAxKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0cmNweSAobmFtZSwgYnVmKTsKLQotICBzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gIGlmIChzZWN0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzZWN0LT5fcmF3X3NpemUgPSBzaXplb2YgKHByc3RhdC5wcl9yZWcpOwotICBzZWN0LT5maWxlcG9zID0gbm90ZS0+ZGVzY3BvcyArIG9mZnNldG9mIChwcnN0YXR1c190LCBwcl9yZWcpOwotICBzZWN0LT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgaWYgKCEgZWxmY29yZV9tYXliZV9tYWtlX3NlY3QgKGFiZmQsICIucmVnIiwgc2VjdCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotI2VuZGlmIC8qIGRlZmluZWQgKEhBVkVfUFJTVEFUVVNfVCkgKi8KLQotCi0vKiBUaGVyZSBpc24ndCBhIGNvbnNpc3RlbnQgcHJmcHJlZ3NldF90IGFjcm9zcyBwbGF0Zm9ybXMsCi0gICBidXQgaXQgZG9lc24ndCBtYXR0ZXIsIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0byBwaWNrIHRoaXMKLSAgIGRhdGEgc3RydWN0dXJlIGFwYXJ0LiAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX3ByZnByZWcgKGFiZmQsIG5vdGUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Ci17Ci0gIGNoYXIgYnVmWzEwMF07Ci0gIGNoYXIqIG5hbWU7Ci0gIGFzZWN0aW9uKiBzZWN0OwotCi0gIC8qIE1ha2UgYSAiLnJlZzIvOTk5IiBzZWN0aW9uLiAqLwotCi0gIHNwcmludGYgKGJ1ZiwgIi5yZWcyLyVkIiwgZWxmY29yZV9tYWtlX3BpZCAoYWJmZCkpOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKGJ1ZikgKyAxKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0cmNweSAobmFtZSwgYnVmKTsKLQotICBzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gIGlmIChzZWN0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzZWN0LT5fcmF3X3NpemUgPSBub3RlLT5kZXNjc3o7Ci0gIHNlY3QtPmZpbGVwb3MgPSBub3RlLT5kZXNjcG9zOwotICBzZWN0LT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgaWYgKCEgZWxmY29yZV9tYXliZV9tYWtlX3NlY3QgKGFiZmQsICIucmVnMiIsIHNlY3QpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmIGRlZmluZWQgKEhBVkVfUFJQU0lORk9fVCkKLSMgZGVmaW5lIGVsZmNvcmVfcHNpbmZvX3QgcHJwc2luZm9fdAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX1BTSU5GT19UKQotIyBkZWZpbmUgZWxmY29yZV9wc2luZm9fdCBwc2luZm9fdAotI2VuZGlmCi0KLQotI2lmIGRlZmluZWQgKEhBVkVfUFJQU0lORk9fVCkgfHwgZGVmaW5lZCAoSEFWRV9QU0lORk9fVCkKLQotLyogcmV0dXJuIGEgbWFsbG9jJ2VkIGNvcHkgb2YgYSBzdHJpbmcgYXQgU1RBUlQgd2hpY2ggaXMgYXQKLSAgIG1vc3QgTUFYIGJ5dGVzIGxvbmcsIHBvc3NpYmx5IHdpdGhvdXQgYSB0ZXJtaW5hdGluZyAnXDAnLgotICAgdGhlIGNvcHkgd2lsbCBhbHdheXMgaGF2ZSBhIHRlcm1pbmF0aW5nICdcMCcuICovCi0KLXN0YXRpYyBjaGFyKgotZWxmY29yZV9zdHJuZHVwIChhYmZkLCBzdGFydCwgbWF4KQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIGNoYXIqIHN0YXJ0OwotICAgICBpbnQgbWF4OwotewotICBjaGFyKiBkdXA7Ci0gIGNoYXIqIGVuZCA9IG1lbWNociAoc3RhcnQsICdcMCcsIG1heCk7Ci0gIGludCBsZW47Ci0KLSAgaWYgKGVuZCA9PSBOVUxMKQotICAgIGxlbiA9IG1heDsKLSAgZWxzZQotICAgIGxlbiA9IGVuZCAtIHN0YXJ0OwotCi0gIGR1cCA9IGJmZF9hbGxvYyAoYWJmZCwgbGVuICsgMSk7Ci0gIGlmIChkdXAgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBtZW1jcHkgKGR1cCwgc3RhcnQsIGxlbik7Ci0gIGR1cFtsZW5dID0gJ1wwJzsKLQotICByZXR1cm4gZHVwOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX3BzaW5mbyAoYWJmZCwgbm90ZSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfTm90ZSogbm90ZTsKLXsKLSAgZWxmY29yZV9wc2luZm9fdCBwc2luZm87Ci0KLSAgaWYgKG5vdGUtPmRlc2NzeiAhPSBzaXplb2YgKGVsZmNvcmVfcHNpbmZvX3QpKQotICAgIHJldHVybiB0cnVlOwotCi0gIG1lbWNweSAoJnBzaW5mbywgbm90ZS0+ZGVzY2RhdGEsIG5vdGUtPmRlc2Nzeik7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9wcm9ncmFtCi0gICAgPSBlbGZjb3JlX3N0cm5kdXAgKGFiZmQsIHBzaW5mby5wcl9mbmFtZSwgc2l6ZW9mIChwc2luZm8ucHJfZm5hbWUpKTsKLQotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2NvbW1hbmQKLSAgICA9IGVsZmNvcmVfc3RybmR1cCAoYWJmZCwgcHNpbmZvLnByX3BzYXJncywgc2l6ZW9mIChwc2luZm8ucHJfcHNhcmdzKSk7Ci0KLSAgLyogTm90ZSB0aGF0IGZvciBzb21lIHJlYXNvbiwgYSBzcHVyaW91cyBzcGFjZSBpcyB0YWNrZWQKLSAgICAgb250byB0aGUgZW5kIG9mIHRoZSBhcmdzIGluIHNvbWUgKGF0IGxlYXN0IG9uZSBhbnl3YXkpCi0gICAgIGltcGxlbWVudGF0aW9ucywgc28gc3RyaXAgaXQgb2ZmIGlmIGl0IGV4aXN0cy4gKi8KLQotICB7Ci0gICAgY2hhciogY29tbWFuZCA9IGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfY29tbWFuZDsKLSAgICBpbnQgbiA9IHN0cmxlbiAoY29tbWFuZCk7Ci0KLSAgICBpZiAoMCA8IG4gJiYgY29tbWFuZFtuIC0gMV0gPT0gJyAnKQotICAgICAgY29tbWFuZFtuIC0gMV0gPSAnXDAnOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYgLyogZGVmaW5lZCAoSEFWRV9QUlBTSU5GT19UKSB8fCBkZWZpbmVkIChIQVZFX1BTSU5GT19UKSAqLwotCi0KLSNpZiBkZWZpbmVkIChIQVZFX1BTVEFUVVNfVCkKLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX2dyb2tfcHN0YXR1cyAoYWJmZCwgbm90ZSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfTm90ZSogbm90ZTsKLXsKLSAgcHN0YXR1c190IHBzdGF0OwotCi0gIGlmIChub3RlLT5kZXNjc3ogIT0gc2l6ZW9mIChwc3RhdCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbWVtY3B5ICgmcHN0YXQsIG5vdGUtPmRlc2NkYXRhLCBzaXplb2YgKHBzdGF0KSk7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9waWQgPSBwc3RhdC5wcl9waWQ7Ci0KLSAgLyogQ291bGQgZ3JhYiBzb21lIG1vcmUgZGV0YWlscyBmcm9tIHRoZSAicmVwcmVzZW50YXRpdmUiCi0gICAgIGx3cHN0YXR1c190IGluIHBzdGF0LnByX2x3cCwgYnV0IHdlJ2xsIGNhdGNoIGl0IGFsbCBpbiBhbgotICAgICBOVF9MV1BTVEFUVVMgbm90ZSwgcHJlc3VtYWJseS4gKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZiAvKiBkZWZpbmVkIChIQVZFX1BTVEFUVVNfVCkgKi8KLQotCi0jaWYgZGVmaW5lZCAoSEFWRV9MV1BTVEFUVVNfVCkKLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX2dyb2tfbHdwc3RhdHVzIChhYmZkLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICBsd3BzdGF0dXNfdCBsd3BzdGF0OwotICBjaGFyIGJ1ZlsxMDBdOwotICBjaGFyKiBuYW1lOwotICBhc2VjdGlvbiogc2VjdDsKLQotICBpZiAobm90ZS0+ZGVzY3N6ICE9IHNpemVvZiAobHdwc3RhdCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbWVtY3B5ICgmbHdwc3RhdCwgbm90ZS0+ZGVzY2RhdGEsIHNpemVvZiAobHdwc3RhdCkpOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfbHdwaWQgPSBsd3BzdGF0LnByX2x3cGlkOwotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3NpZ25hbCA9IGx3cHN0YXQucHJfY3Vyc2lnOwotCi0gIC8qIE1ha2UgYSAiLnJlZy85OTkiIHNlY3Rpb24uICovCi0KLSAgc3ByaW50ZiAoYnVmLCAiLnJlZy8lZCIsIGVsZmNvcmVfbWFrZV9waWQgKGFiZmQpKTsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChidWYpICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJjcHkgKG5hbWUsIGJ1Zik7Ci0KLSAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1RfUFJfQ09OVEVYVCkKLSAgc2VjdC0+X3Jhd19zaXplID0gc2l6ZW9mIChsd3BzdGF0LnByX2NvbnRleHQudWNfbWNvbnRleHQuZ3JlZ3MpOwotICBzZWN0LT5maWxlcG9zID0gbm90ZS0+ZGVzY3BvcwotICAgICsgb2Zmc2V0b2YgKGx3cHN0YXR1c190LCBwcl9jb250ZXh0LnVjX21jb250ZXh0LmdyZWdzKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoSEFWRV9MV1BTVEFUVVNfVF9QUl9SRUcpCi0gIHNlY3QtPl9yYXdfc2l6ZSA9IHNpemVvZiAobHdwc3RhdC5wcl9yZWcpOwotICBzZWN0LT5maWxlcG9zID0gbm90ZS0+ZGVzY3BvcyArIG9mZnNldG9mIChsd3BzdGF0dXNfdCwgcHJfcmVnKTsKLSNlbmRpZgotCi0gIHNlY3QtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLSAgc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotICBpZiAoIWVsZmNvcmVfbWF5YmVfbWFrZV9zZWN0IChhYmZkLCAiLnJlZyIsIHNlY3QpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBNYWtlIGEgIi5yZWcyLzk5OSIgc2VjdGlvbiAqLwotCi0gIHNwcmludGYgKGJ1ZiwgIi5yZWcyLyVkIiwgZWxmY29yZV9tYWtlX3BpZCAoYWJmZCkpOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKGJ1ZikgKyAxKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0cmNweSAobmFtZSwgYnVmKTsKLQotICBzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gIGlmIChzZWN0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9MV1BTVEFUVVNfVF9QUl9DT05URVhUKQotICBzZWN0LT5fcmF3X3NpemUgPSBzaXplb2YgKGx3cHN0YXQucHJfY29udGV4dC51Y19tY29udGV4dC5mcHJlZ3MpOwotICBzZWN0LT5maWxlcG9zID0gbm90ZS0+ZGVzY3BvcwotICAgICsgb2Zmc2V0b2YgKGx3cHN0YXR1c190LCBwcl9jb250ZXh0LnVjX21jb250ZXh0LmZwcmVncyk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1RfUFJfRlBSRUcpCi0gIHNlY3QtPl9yYXdfc2l6ZSA9IHNpemVvZiAobHdwc3RhdC5wcl9mcHJlZyk7Ci0gIHNlY3QtPmZpbGVwb3MgPSBub3RlLT5kZXNjcG9zICsgb2Zmc2V0b2YgKGx3cHN0YXR1c190LCBwcl9mcHJlZyk7Ci0jZW5kaWYKLQotICBzZWN0LT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgaWYgKCFlbGZjb3JlX21heWJlX21ha2Vfc2VjdCAoYWJmZCwgIi5yZWcyIiwgc2VjdCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotI2VuZGlmIC8qIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1QpICovCi0KLQotCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX25vdGUgKGFiZmQsIG5vdGUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Ci17Ci0gIHN3aXRjaCAobm90ZS0+dHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiB0cnVlOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9QUlNUQVRVU19UKQotICAgIGNhc2UgTlRfUFJTVEFUVVM6Ci0gICAgICByZXR1cm4gZWxmY29yZV9ncm9rX3Byc3RhdHVzIChhYmZkLCBub3RlKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoSEFWRV9QU1RBVFVTX1QpCi0gICAgY2FzZSBOVF9QU1RBVFVTOgotICAgICAgcmV0dXJuIGVsZmNvcmVfZ3Jva19wc3RhdHVzIChhYmZkLCBub3RlKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoSEFWRV9MV1BTVEFUVVNfVCkKLSAgICBjYXNlIE5UX0xXUFNUQVRVUzoKLSAgICAgIHJldHVybiBlbGZjb3JlX2dyb2tfbHdwc3RhdHVzIChhYmZkLCBub3RlKTsKLSNlbmRpZgotCi0gICAgY2FzZSBOVF9GUFJFR1NFVDoJCS8qIEZJWE1FOiByZW5hbWUgdG8gTlRfUFJGUFJFRyAqLwotICAgICAgcmV0dXJuIGVsZmNvcmVfZ3Jva19wcmZwcmVnIChhYmZkLCBub3RlKTsKLQotI2lmIGRlZmluZWQgKEhBVkVfUFJQU0lORk9fVCkgfHwgZGVmaW5lZCAoSEFWRV9QU0lORk9fVCkKLSAgICBjYXNlIE5UX1BSUFNJTkZPOgotICAgIGNhc2UgTlRfUFNJTkZPOgotICAgICAgcmV0dXJuIGVsZmNvcmVfZ3Jva19wc2luZm8gKGFiZmQsIG5vdGUpOwotI2VuZGlmCi0gICAgfQotfQotCi0KLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX3JlYWRfbm90ZXMgKGFiZmQsIG9mZnNldCwgc2l6ZSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3ZtYSBzaXplOwotewotICBjaGFyKiBidWY7Ci0gIGNoYXIqIHA7Ci0KLSAgaWYgKHNpemUgPD0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgU0VFS19TRVQpID09IC0xKQotICAgIHJldHVybiBmYWxzZTsKLQotICBidWYgPSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzaXplKTsKLSAgaWYgKGJ1ZiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3JlYWQgKGJ1Ziwgc2l6ZSwgMSwgYWJmZCkgIT0gc2l6ZSkKLSAgICB7Ci0gICAgZXJyb3I6Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBwID0gYnVmOwotICB3aGlsZSAocCA8IGJ1ZiArIHNpemUpCi0gICAgewotICAgICAgLyogRklYTUU6IGJhZCBhbGlnbm1lbnQgYXNzdW1wdGlvbi4gKi8KLSAgICAgIEVsZl9FeHRlcm5hbF9Ob3RlKiB4bnAgPSAoRWxmX0V4dGVybmFsX05vdGUqKSBwOwotICAgICAgRWxmX0ludGVybmFsX05vdGUgaW47Ci0KLSAgICAgIGluLnR5cGUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSB4bnAtPnR5cGUpOwotCi0gICAgICBpbi5uYW1lc3ogPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSB4bnAtPm5hbWVzeik7Ci0gICAgICBpbi5uYW1lZGF0YSA9IHhucC0+bmFtZTsKLQotICAgICAgaW4uZGVzY3N6ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgeG5wLT5kZXNjc3opOwotICAgICAgaW4uZGVzY2RhdGEgPSBpbi5uYW1lZGF0YSArIEJGRF9BTElHTiAoaW4ubmFtZXN6LCA0KTsKLSAgICAgIGluLmRlc2Nwb3MgPSBvZmZzZXQgKyAoaW4uZGVzY2RhdGEgLSBidWYpOwotCi0gICAgICBpZiAoISBlbGZjb3JlX2dyb2tfbm90ZSAoYWJmZCwgJmluKSkKLQlnb3RvIGVycm9yOwotCi0gICAgICBwID0gaW4uZGVzY2RhdGEgKyBCRkRfQUxJR04gKGluLmRlc2NzeiwgNCk7Ci0gICAgfQotCi0gIGZyZWUgKGJ1Zik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLQotYm9vbGVhbgotX2JmZF9lbGZjb3JlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBwaGRyLCBzZWNfbnVtKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9QaGRyKiBwaGRyOwotICAgICBpbnQgc2VjX251bTsKLXsKLSAgaWYgKCEgYmZkX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBwaGRyLCBzZWNfbnVtKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHBoZHItPnBfdHlwZSA9PSBQVF9OT1RFCi0gICAgICAmJiAhIGVsZmNvcmVfcmVhZF9ub3RlcyAoYWJmZCwgcGhkci0+cF9vZmZzZXQsIHBoZHItPnBfZmlsZXN6KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1hcmMuYyBiL2JmZC9lbGYzMi1hcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5MGEyNC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyogQVJDLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9hcmMuaCIKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBhcmNfaW5mb190b19ob3d0b19yZWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKLXN0YXRpYyBib29sZWFuIGFyY19lbGZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIGFyY19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotCi0vKiBUcnkgdG8gbWluaW1pemUgdGhlIGFtb3VudCBvZiBzcGFjZSBvY2N1cGllZCBieSByZWxvY2F0aW9uIHRhYmxlcwotICAgb24gdGhlIFJPTSAobm90IHRoYXQgdGhlIFJPTSB3b24ndCBiZSBzd2FtcGVkIGJ5IG90aGVyIEVMRiBvdmVyaGVhZCkuICAqLwotI2RlZmluZSBVU0VfUkVMCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9hcmNfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfQVJDX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJDX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgc3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9BUkNfMzIsCQkvKiB0eXBlICovCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSQ18zMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwgICAJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAyNiBiaXQgYWJzb2x1dGUgYnJhbmNoLCByaWdodCBzaGlmdGVkIGJ5IDIuICAqLwotICBIT1dUTyAoUl9BUkNfQjI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSQ19CMjYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMGZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDBmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDIyIGJpdCBicmFuY2g7IGJpdHMgMjEtMiBhcmUgc3RvcmVkIGluIGJpdHMgMjYtNy4gICovCi0gIEhPV1RPIChSX0FSQ19CMjJfUENSRUwsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA3LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUkNfQjIyX1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwN2ZmZmY4MCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDdmZmZmODAsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotfTsKLQotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBBUkMgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IGFyY19yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJjX3JlbG9jX21hcCBhcmNfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX0FSQ19OT05FLCB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9BUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfQ1RPUiwgUl9BUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfQVJDX0IyNiwgUl9BUkNfQjI2IH0sCi0gIHsgQkZEX1JFTE9DX0FSQ19CMjJfUENSRUwsIFJfQVJDX0IyMl9QQ1JFTCB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgICBpIDwgc2l6ZW9mIChhcmNfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGFyY19yZWxvY19tYXApOwotICAgICAgIGkrKykKLSAgICB7Ci0gICAgICBpZiAoYXJjX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZlbGZfYXJjX2hvd3RvX3RhYmxlW2FyY19yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIEFSQyBFTEYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotYXJjX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0FSQ19tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9hcmNfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlciBmb3IgYW4gQVJDIEVMRiBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFyY19lbGZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IG1hY2g7Ci0gIHVuc2lnbmVkIGxvbmcgYXJjaCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfQVJDX01BQ0g7Ci0KLSAgc3dpdGNoIChhcmNoKQotICAgIHsKLSAgICBjYXNlIEVfQVJDX01BQ0hfQkFTRToKLSAgICAgIG1hY2ggPSBiZmRfbWFjaF9hcmNfYmFzZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBVbmtub3duIGNwdSB0eXBlLiAgPz8/IFdoYXQgdG8gZG8/ICAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAodm9pZCkgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfYXJjLCBtYWNoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoZSBmaW5hbCBwcm9jZXNzaW5nIGRvbmUganVzdCBiZWZvcmUgd3JpdGluZyBvdXQgYW4gQVJDIEVMRiBvYmplY3QgZmlsZS4KLSAgIFRoaXMgZ2V0cyB0aGUgQVJDIGFyY2hpdGVjdHVyZSByaWdodCBiYXNlZCBvbiB0aGUgbWFjaGluZSBudW1iZXIuICAqLwotCi1zdGF0aWMgdm9pZAotYXJjX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXI7Ci17Ci0gIGludCBtYWNoOwotICB1bnNpZ25lZCBsb25nIHZhbDsKLQotICBzd2l0Y2ggKG1hY2ggPSBiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9tYWNoX2FyY19iYXNlOgotICAgICAgdmFsID0gRV9BUkNfTUFDSF9CQVNFOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj1+IEVGX0FSQ19NQUNIOwotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSB2YWw7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX2xpdHRsZWFyY192ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCSJlbGYzMi1saXR0bGVhcmMiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfYmlnYXJjX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1iaWdhcmMiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9hcmMKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfQVJDCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JMAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJYXJjX2luZm9fdG9faG93dG9fcmVsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCWFyY19lbGZfb2JqZWN0X3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBcCi0JCQkJYXJjX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1hcm0uaCBiL2JmZC9lbGYzMi1hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczZjFhZS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItYXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEwICswLDAgQEAKLS8qIDMyLWJpdCBFTEYgc3VwcG9ydCBmb3IgQVJNCi0gICBDb3B5cmlnaHQgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgaW5zbjMyOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgaW5zbjE2OwotCi1zdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgaW50IGVsZjMyX2FybV9nZXRfc3ltYm9sX3R5cGUgCi0gIFBBUkFNUyAoKCBFbGZfSW50ZXJuYWxfU3ltICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICplbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX3ZtYSwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBjaGFyKSk7Ci0KLXN0YXRpYyBpbnNuMzIgaW5zZXJ0X3RodW1iX2JyYW5jaAotICBQQVJBTVMgKChpbnNuMzIsIGludCkpOwotc3RhdGljIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpmaW5kX3RodW1iX2dsdWUKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgQ09OU1QgY2hhciAqLCBiZmQgKikpOwotc3RhdGljIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpmaW5kX2FybV9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIENPTlNUIGNoYXIgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIHJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgdm9pZCByZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotCi0vKiBUaGUgbGlua2VyIHNjcmlwdCBrbm93cyB0aGUgc2VjdGlvbiBuYW1lcyBmb3IgcGxhY2VtZW50LgotICAgVGhlIGVudHJ5X25hbWVzIGFyZSB1c2VkIHRvIGRvIHNpbXBsZSBuYW1lIG1hbmdsaW5nIG9uIHRoZSBzdHVicy4KLSAgIEdpdmVuIGEgZnVuY3Rpb24gbmFtZSwgYW5kIGl0cyB0eXBlLCB0aGUgc3R1YiBjYW4gYmUgZm91bmQuIFRoZQotICAgbmFtZSBjYW4gYmUgY2hhbmdlZC4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhlICVzIGJlIHByZXNlbnQuCi0gKi8KLQotI2RlZmluZSBJTlRFUldPUktfRkxBRyggYWJmZCApICAgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfSU5URVJXT1JLKQotCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSAiLmdsdWVfN3QiCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUgICAiX18lc19mcm9tX3RodW1iIgotCi0jZGVmaW5lIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSAiLmdsdWVfNyIKLSNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSAgICJfXyVzX2Zyb21fYXJtIgotCi0vKiBUaGUgbmFtZSBvZiB0aGUgZHluYW1pYyBpbnRlcnByZXRlci4gIFRoaXMgaXMgcHV0IGluIHRoZSAuaW50ZXJwCi0gICBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgICAgICIvdXNyL2xpYi9sZC5zby4xIgotCi0vKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCi0jZGVmaW5lIFBMVF9FTlRSWV9TSVpFIDE2Ci0KLS8qIFRoZSBmaXJzdCBlbnRyeSBpbiBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2tzIGxpa2UKLSAgIHRoaXMuICBJdCBpcyBzZXQgdXAgc28gdGhhdCBhbnkgc2hhcmVkIGxpYnJhcnkgZnVuY3Rpb24gdGhhdCBpcwotICAgY2FsbGVkIGJlZm9yZSB0aGUgcmVsb2NhdGlvbiBoYXMgYmVlbiBzZXQgdXAgY2FsbGVzIHRoZSBkeW5hbWljCi0gICBsaW5rZXIgZmlyc3QgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZjMyX2FybV9wbHQwX2VudHJ5IFtQTFRfRU5UUllfU0laRV0gPQotewotICAweDA0LCAweGUwLCAweDJkLCAweGU1LAkvKiBzdHIgICBsciwgW3NwLCAjLTRdISAgICAgKi8KLSAgMHgxMCwgMHhlMCwgMHg5ZiwgMHhlNSwJLyogbGRyICAgbHIsIFtwYywgIzE2XSAgICAgICovCi0gIDB4MGUsIDB4ZTAsIDB4OGYsIDB4ZTAsCS8qIGFkciAgIGxyLCBwYywgbHIgICAgICAgICAqLwotICAweDA4LCAweGYwLCAweGJlLCAweGU1CS8qIGxkciAgIHBjLCBbbHIsICMtNF0gICAgICAqLwotfTsKLQotLyogU3Vic2VxdWVudCBlbnRyaWVzIGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9vayBsaWtlCi0gICB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZjMyX2FybV9wbHRfZW50cnkgW1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4MDQsIDB4YzAsIDB4OWYsIDB4ZTUsCS8qIGxkciAgIGlwLCBbcGMsICM0XSAgICAgICAqLwotICAweDBjLCAweGMwLCAweDhmLCAweGUwLAkvKiBhZGQgICBpcCwgcGMsIGlwICAgICAgICAgKi8KLSAgMHgwMCwgMHhmMCwgMHg5YywgMHhlNSwJLyogbGRyICAgcGMsIFtpcF0gICAgICAgICAgICovCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgICAgICAgIC8qIG9mZnNldCB0byBzeW1ib2wgaW4gZ290ICAqLwotfTsKLQotCi0vKiBUaGUgQVJNIGxpbmtlciBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgcmVsb2NzIHRoYXQgaXQKLSAgIGRlY2lkZXMgdG8gY29weSBpbiBjaGVja19yZWxvY3MgZm9yIGVhY2ggc3ltYm9sLiAgVGhpcyBpcyBzbyB0aGF0Ci0gICBpdCBjYW4gZGlzY2FyZCBQQyByZWxhdGl2ZSByZWxvY3MgaWYgaXQgZG9lc24ndCBuZWVkIHRoZW0gd2hlbgotICAgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMuICBXZSBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaW4gYSBmaWVsZAotICAgZXh0ZW5kaW5nIHRoZSByZWd1bGFyIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLS8qIFRoaXMgc3RydWN0dXJlIGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIHdlCi0gICBoYXZlIGNvcGllZCBmb3IgYSBnaXZlbiBzeW1ib2wuICAqLwotCi1zdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQKLXsKLSAgLyogTmV4dCBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IGVsZjMyX2FybV9wY3JlbF9yZWxvY3NfY29waWVkICogbmV4dDsKLSAgLyogQSBzZWN0aW9uIGluIGR5bm9iai4gICovCi0gIGFzZWN0aW9uICogc2VjdGlvbjsKLSAgLyogTnVtYmVyIG9mIHJlbG9jcyBjb3BpZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLX07Ci0KLS8qIGFybSBFTEYgbGlua2VyIGhhc2ggZW50cnkuICAqLwotCi1zdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIE51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3MgY29waWVkIGZvciB0aGlzIHN5bWJvbC4gICovCi0gIHN0cnVjdCBlbGYzMl9hcm1fcGNyZWxfcmVsb2NzX2NvcGllZCAqIHBjcmVsX3JlbG9jc19jb3BpZWQ7Ci19OwotCi0vKiBEZWNsYXJlIHRoaXMgbm93IHRoYXQgdGhlIGFib3ZlIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fZGlzY2FyZF9jb3BpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLS8qIFRyYXZlcnNlIGFuIGFybSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZjMyX2FybV9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBBUk0gZWxmIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgZWxmMzJfYXJtX2hhc2hfdGFibGUoaW5mbykgXAotICAoKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICopICgoaW5mbyktPmhhc2gpKQotCi0vKiBBUk0gRUxGIGxpbmtlciBoYXNoIHRhYmxlICovCi1zdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZQotICB7Ci0gICAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCi0gICAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAgIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5nIHRoZSBUaHVtYi10by1BUk0gZ2x1ZS4gICovCi0gICAgbG9uZyBpbnQgdGh1bWJfZ2x1ZV9zaXplOwotCi0gICAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHNlY3Rpb24gY29udGFpbmcgdGhlIEFSTS10by1UaHVtYiBnbHVlLiAgKi8KLSAgICBsb25nIGludCBhcm1fZ2x1ZV9zaXplOwotCi0gICAgLyogQW4gYXJiaXRhcnkgaW5wdXQgQkZEIGNob3NlbiB0byBob2xkIHRoZSBnbHVlIHNlY3Rpb25zLiAgKi8KLSAgICBiZmQgKiBiZmRfb2ZfZ2x1ZV9vd25lcjsKLSAgfTsKLQotCi0vKiBDcmVhdGUgYW4gQVJNIGVsZiBsaW5rZXIgaGFzaCB0YWJsZSAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoIV9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXQtPnRodW1iX2dsdWVfc2l6ZSA9IDA7Ci0gIHJldC0+YXJtX2dsdWVfc2l6ZSA9IDA7Ci0gIHJldC0+YmZkX29mX2dsdWVfb3duZXIgPSBOVUxMOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqCi1maW5kX3RodW1iX2dsdWUgKGxpbmtfaW5mbywgbmFtZSwgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBiZmQgKmlucHV0X2JmZDsKLXsKLSAgY2hhciAqdG1wX25hbWU7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoYXNoOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqaGFzaF90YWJsZTsKLQotICAvKiBXZSBuZWVkIGEgcG9pbnRlciB0byB0aGUgYXJtZWxmIHNwZWNpZmljIGhhc2ggdGFibGUuICAqLwotICBoYXNoX3RhYmxlID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLQotICB0bXBfbmFtZSA9ICgoY2hhciAqKQotICAgICAgIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUpICsgMSkpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0KLSAgaGFzaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKCYoaGFzaF90YWJsZSktPnJvb3QsIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gIGlmIChoYXNoID09IE5VTEwpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCIlczogdW5hYmxlIHRvIGZpbmQgVEhVTUIgZ2x1ZSAnJXMnIGZvciBgJXMnIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCB0bXBfbmFtZSwgbmFtZSk7Ci0KLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIHJldHVybiBoYXNoOwotfQotCi1zdGF0aWMgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKgotZmluZF9hcm1fZ2x1ZSAobGlua19pbmZvLCBuYW1lLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotewotICBjaGFyICp0bXBfbmFtZTsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKm15aDsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKmhhc2hfdGFibGU7Ci0KLSAgLyogV2UgbmVlZCBhIHBvaW50ZXIgdG8gdGhlIGVsZmFybSBzcGVjaWZpYyBoYXNoIHRhYmxlLiAgKi8KLSAgaGFzaF90YWJsZSA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChsaW5rX2luZm8pOwotCi0gIHRtcF9uYW1lID0gKChjaGFyICopCi0gICAgICAgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLQotICBteWggPSBlbGZfbGlua19oYXNoX2xvb2t1cAotICAgICgmKGhhc2hfdGFibGUpLT5yb290LCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICBpZiAobXloID09IE5VTEwpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCIlczogdW5hYmxlIHRvIGZpbmQgQVJNIGdsdWUgJyVzJyBmb3IgYCVzJyIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgdG1wX25hbWUsIG5hbWUpOwotCi0gIGZyZWUgKHRtcF9uYW1lKTsKLQotICByZXR1cm4gbXloOwotfQotCi0vKgotICAgQVJNLT5UaHVtYiBnbHVlOgotCi0gICAuYXJtCi0gICBfX2Z1bmNfZnJvbV9hcm06Ci0gICBsZHIgcjEyLCBfX2Z1bmNfYWRkcgotICAgYnggIHIxMgotICAgX19mdW5jX2FkZHI6Ci0gICAud29yZCBmdW5jICAgIEAgYmVoYXZlIGFzIGlmIHlvdSBzYXcgYSBBUk1fMzIgcmVsb2MKLSAqLwotCi0jZGVmaW5lIEFSTTJUSFVNQl9HTFVFX1NJWkUgMTIKLXN0YXRpYyBjb25zdCBpbnNuMzIgYTJ0MV9sZHJfaW5zbiA9IDB4ZTU5ZmMwMDA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIGEydDJfYnhfcjEyX2luc24gPSAweGUxMmZmZjFjOwotc3RhdGljIGNvbnN0IGluc24zMiBhMnQzX2Z1bmNfYWRkcl9pbnNuID0gMHgwMDAwMDAwMTsKLQotLyoKLSAgIFRodW1iLT5BUk06ICAgICAgICAgICAgICAgICAgICAgICAgICBUaHVtYi0+KG5vbi1pbnRlcndvcmtpbmcgYXdhcmUpIEFSTQotCi0gICAudGh1bWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRodW1iCi0gICAuYWxpZ24gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFsaWduIDIKLSAgIF9fZnVuY19mcm9tX3RodW1iOiAgICAgICAgICAgICAgX19mdW5jX2Zyb21fdGh1bWI6Ci0gICBieCBwYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCB7cjYsIGxyfQotICAgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxkciAgcjYsIF9fZnVuY19hZGRyCi0gICAuYXJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3YgIGxyLCBwYwotICAgX19mdW5jX2NoYW5nZV90b19hcm06ICAgICAgICAgICAgICAgICAgICAgICAgYnggICByNgotICAgYiBmdW5jICAgICAgICAgICAgICAgICAgICAgICAuYXJtCi0gICBfX2Z1bmNfYmFja190b190aHVtYjoKLSAgIGxkbWlhIHIxMyEge3I2LCBscn0KLSAgIGJ4ICAgIGxyCi0gICBfX2Z1bmNfYWRkcjoKLSAgIC53b3JkICAgICAgICBmdW5jIAotICovCi0KLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfU0laRSA4Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTFfYnhfcGNfaW5zbiA9IDB4NDc3ODsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMl9ub29wX2luc24gPSAweDQ2YzA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIHQyYTNfYl9pbnNuID0gMHhlYTAwMDAwMDsKLQotc3RhdGljIGNvbnN0IGluc24xNiB0MmExX3B1c2hfaW5zbiA9IDB4YjU0MDsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMl9sZHJfaW5zbiA9IDB4NGUwMzsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhM19tb3ZfaW5zbiA9IDB4NDZmZTsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhNF9ieF9pbnNuID0gMHg0NzMwOwotc3RhdGljIGNvbnN0IGluc24zMiB0MmE1X3BvcF9pbnNuID0gMHhlOGJkNDA0MDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgdDJhNl9ieF9pbnNuID0gMHhlMTJmZmYxZTsKLQotYm9vbGVhbgotYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgKGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLXsKLSAgYXNlY3Rpb24gKiBzOwotICBiZmRfYnl0ZSAqIGZvbzsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotCi0gIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLQotICBpZiAoZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIGZvbyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOwotCi0gICAgICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplOwotICAgICAgcy0+Y29udGVudHMgPSBmb287Ci0gICAgfQotCi0gIGlmIChnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0JKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICBmb28gPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jCi0JKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUpOwotCi0gICAgICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemU7Ci0gICAgICBzLT5jb250ZW50cyA9IGZvbzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUgKGxpbmtfaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLXsKLSAgY29uc3QgY2hhciAqIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICByZWdpc3RlciBhc2VjdGlvbiAqIHM7Ci0gIGNoYXIgKiB0bXBfbmFtZTsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBteWg7Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQotICBnbG9iYWxzID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0gICAgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotCi0KLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICB0bXBfbmFtZSA9ICgoY2hhciAqKQotICAgICAgIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUpICsgMSkpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0KLSAgbXloID0gZWxmX2xpbmtfaGFzaF9sb29rdXAKLSAgICAoJihnbG9iYWxzKS0+cm9vdCwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgaWYgKG15aCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHRtcF9uYW1lKTsKLSAgICAgIHJldHVybjsJCQkvKiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBndXkgKi8KLSAgICB9Ci0KLSAgLyogVGhlIG9ubHkgdHJpY2sgaGVyZSBpcyB1c2luZyBoYXNoX3RhYmxlLT5hcm1fZ2x1ZV9zaXplIGFzIHRoZSB2YWx1ZS4gRXZlbgotICAgICB0aG91Z2ggdGhlIHNlY3Rpb24gaXNuJ3QgYWxsb2NhdGVkIHlldCwgdGhpcyBpcyB3aGVyZSB3ZSB3aWxsIGJlIHB1dHRpbmcKLSAgICAgaXQuICAqLwotCi0gIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChsaW5rX2luZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKLQkJCQkgICAgQlNGX0dMT0JBTCwKLQkJCQkgICAgcywgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSArIDEsCi0JCQkJICAgIE5VTEwsIHRydWUsIGZhbHNlLAotCQkJCSAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZteWgpOwotCi0gIGZyZWUgKHRtcF9uYW1lKTsKLQotICBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplICs9IEFSTTJUSFVNQl9HTFVFX1NJWkU7Ci0KLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotcmVjb3JkX3RodW1iX3RvX2FybV9nbHVlIChsaW5rX2luZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBjb25zdCBjaGFyICpuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIGNoYXIgKnRtcF9uYW1lOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqbXloOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqaGFzaF90YWJsZTsKLSAgY2hhciBiaW5kOwotCi0gIGhhc2hfdGFibGUgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAobGlua19pbmZvKTsKLQotICBCRkRfQVNTRVJUIChoYXNoX3RhYmxlICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChoYXNoX3RhYmxlLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLSAgICAoaGFzaF90YWJsZS0+YmZkX29mX2dsdWVfb3duZXIsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICB0bXBfbmFtZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUpICsgMSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLQotICBteWggPSBlbGZfbGlua19oYXNoX2xvb2t1cAotICAgICgmKGhhc2hfdGFibGUpLT5yb290LCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICBpZiAobXloICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAodG1wX25hbWUpOwotICAgICAgcmV0dXJuOwkJCS8qIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGd1eSAqLwotICAgIH0KLQotICBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAobGlua19pbmZvLCBoYXNoX3RhYmxlLT5iZmRfb2ZfZ2x1ZV9vd25lciwgdG1wX25hbWUsCi0JCQkgICAgIEJTRl9HTE9CQUwsIHMsIGhhc2hfdGFibGUtPnRodW1iX2dsdWVfc2l6ZSArIDEsCi0JCQkJICAgIE5VTEwsIHRydWUsIGZhbHNlLAotCQkJCSAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZteWgpOwotCi0gIC8qIElmIHdlIG1hcmsgaXQgJ3RodW1iJywgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIGRvIGEgYmV0dGVyIGpvYi4gICovCi0gIGJpbmQgPSBFTEZfU1RfQklORCAobXloLT50eXBlKTsKLSAgbXloLT50eXBlID0gRUxGX1NUX0lORk8gKGJpbmQsIFNUVF9BUk1fVEZVTkMpOwotCi0gIGZyZWUgKHRtcF9uYW1lKTsKLQotICAvKiBBbGxvY2F0ZSBhbm90aGVyIHN5bWJvbCB0byBtYXJrIHdoZXJlIHdlIHN3aXRjaCB0byBhcm0gbW9kZS4gICovCi0KLSNkZWZpbmUgQ0hBTkdFX1RPX0FSTSAiX18lc19jaGFuZ2VfdG9fYXJtIgotI2RlZmluZSBCQUNLX0ZST01fQVJNICJfXyVzX2JhY2tfZnJvbV9hcm0iCi0KLSAgdG1wX25hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChDSEFOR0VfVE9fQVJNKSArIDEpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgQ0hBTkdFX1RPX0FSTSwgbmFtZSk7Ci0KLSAgbXloID0gTlVMTDsKLQotICBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAobGlua19pbmZvLCBoYXNoX3RhYmxlLT5iZmRfb2ZfZ2x1ZV9vd25lciwgdG1wX25hbWUsCi0JCQkgICAgICBCU0ZfTE9DQUwsIHMsIGhhc2hfdGFibGUtPnRodW1iX2dsdWVfc2l6ZSArIDQsCi0JCQkJICAgIE5VTEwsIHRydWUsIGZhbHNlLAotCQkJCSAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZteWgpOwotCi0gIGZyZWUgKHRtcF9uYW1lKTsKLQotICBoYXNoX3RhYmxlLT50aHVtYl9nbHVlX3NpemUgKz0gVEhVTUIyQVJNX0dMVUVfU0laRTsKLQotICByZXR1cm47Ci19Ci0KLS8qIFNlbGVjdCBhIEJGRCB0byBiZSB1c2VkIHRvIGhvbGQgdGhlIHNlY3Rpb25zIHVzZWQgYnkgdGhlIGdsdWUgY29kZS4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGxpbmtlciBzY3JpcHRzIGluIGxkL2VtdWx0ZW1wbC8KLSAgIHthcm1lbGYvcGV9LmVtICAqLwotYm9vbGVhbgotYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICpnbG9iYWxzOwotICBmbGFnd29yZCBmbGFnczsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICAvKiBJZiB3ZSBhcmUgb25seSBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rIGRvIG5vdCBib3RoZXIKLSAgICAgZ2V0dGluZyBhIGJmZCB0byBob2xkIHRoZSBnbHVlLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBnbG9iYWxzID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0KLSAgaWYgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWTsKLQotICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICAgICAgaWYgKHNlYyA9PSBOVUxMCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlYywgMikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBpZiAoc2VjID09IE5VTEwpCi0gICAgewotICAgICAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCi0gICAgICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gICAgICBpZiAoc2VjID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywgZmxhZ3MpCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFNhdmUgdGhlIGJmZCBmb3IgbGF0ZXIgdXNlLiAgKi8KLSAgZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgPSBhYmZkOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1iZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGFiZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltcyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZnJlZV9leHRzeW1zID0gTlVMTDsKLQotICBhc2VjdGlvbiAqc2VjOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqZ2xvYmFsczsKLQotICAvKiBJZiB3ZSBhcmUgb25seSBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rIGRvIG5vdCBib3RoZXIKLSAgICAgdG8gY29uc3RydWN0IGFueSBnbHVlLiAgKi8KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEhlcmUgd2UgaGF2ZSBhIGJmZCB0aGF0IGlzIHRvIGJlIGluY2x1ZGVkIG9uIHRoZSBsaW5rLiAgV2UgaGF2ZSBhIGhvb2sKLSAgICAgdG8gZG8gcmVsb2MgcnVtbWFnaW5nLCBiZWZvcmUgc2VjdGlvbiBzaXplcyBhcmUgbmFpbGVkIGRvd24uICAqLwotCi0gIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAobGlua19pbmZvKTsKLQotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICAvKiBSdW1tYWdlIGFyb3VuZCBhbGwgdGhlIHJlbG9jcyBhbmQgbWFwIHRoZSBnbHVlIHZlY3RvcnMuICAqLwotICBzZWMgPSBhYmZkLT5zZWN0aW9uczsKLQotICBpZiAoc2VjID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZm9yICg7IHNlYyAhPSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICAgICAgLyogTG9hZCB0aGUgcmVsb2NzLiAgKi8KLQotICAgICAgaXJlbCA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MgKGFiZmQsIHNlYywgKFBUUikgTlVMTCwKLQkJCQkJKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIGZhbHNlKSk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGlyZWwgIT0gMCk7Ci0KLSAgICAgIGlyZWxlbmQgPSBpcmVsICsgc2VjLT5yZWxvY19jb3VudDsKLSAgICAgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotCXsKLQkgIGxvbmcgcl90eXBlOwotCSAgdW5zaWduZWQgbG9uZyByX2luZGV4OwotCSAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pOwotCSAgcl9pbmRleCA9IEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pOwotCi0JICAvKiBUaGVzZSBhcmUgdGhlIG9ubHkgcmVsb2NhdGlvbiB0eXBlcyB3ZSBjYXJlIGFib3V0ICovCi0JICBpZiAocl90eXBlICE9IFJfQVJNX1BDMjQKLQkgICAgICAmJiByX3R5cGUgIT0gUl9BUk1fVEhNX1BDMjIpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotCSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkJY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JCSAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCQkgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JCSAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgfQotCi0JICAvKiBSZWFkIHRoaXMgQkZEJ3Mgc3ltYm9scyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0JICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0JICAgICAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JCWV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkJICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSAgICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfc2l6ZSkpOwotCQkgIGlmIChleHRzeW1zID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBmcmVlX2V4dHN5bXMgPSBleHRzeW1zOwotCQkgIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCQkgICAgICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCi0JCQkgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgfQotCi0JICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBub3QgYWdhaW5zdCBhIHN5bWJvbCBpdCBjYW5ub3QgY29uY2VybiB1cy4gKi8KLQotCSAgaCA9IE5VTEw7Ci0KLQkgIC8qIFdlIGRvbid0IGNhcmUgYWJvdXQgbG9jYWwgc3ltYm9scyAqLwotCSAgaWYgKHJfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogVGhpcyBpcyBhbiBleHRlcm5hbCBzeW1ib2wgKi8KLQkgIHJfaW5kZXggLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICAgZWxmX3N5bV9oYXNoZXMgKGFiZmQpW3JfaW5kZXhdOwotCi0JICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBhZ2FpbnN0IGEgc3RhdGljIHN5bWJvbCBpdCBtdXN0IGJlIHdpdGhpbgotCSAgICAgdGhlIGN1cnJlbnQgc2VjdGlvbiBhbmQgc28gY2Fubm90IGJlIGEgY3Jvc3MgQVJNL1RodW1iIHJlbG9jYXRpb24uICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIHN3aXRjaCAocl90eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgUl9BUk1fUEMyNDoKLQkgICAgICAvKiBUaGlzIG9uZSBpcyBhIGNhbGwgZnJvbSBhcm0gY29kZS4gIFdlIG5lZWQgdG8gbG9vayB1cAotCSAgICAgICAgIHRoZSB0YXJnZXQgb2YgdGhlIGNhbGwuIElmIGl0IGlzIGEgdGh1bWIgdGFyZ2V0LCB3ZQotCSAgICAgICAgIGluc2VydCBnbHVlLiAgKi8KLQotCSAgICAgIGlmIChFTEZfU1RfVFlQRShoLT50eXBlKSA9PSBTVFRfQVJNX1RGVU5DKQotCQlyZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUgKGxpbmtfaW5mbywgaCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX0FSTV9USE1fUEMyMjoKLQkgICAgICAvKiBUaGlzIG9uZSBpcyBhIGNhbGwgZnJvbSB0aHVtYiBjb2RlLiAgV2UgbG9vayAKLQkgICAgICAgICB1cCB0aGUgdGFyZ2V0IG9mIHRoZSBjYWxsLiBJZiBpdCBpcyBub3QgYSB0aHVtYgotICAgICAgICAgICAgICAgICB0YXJnZXQsIHdlIGluc2VydCBnbHVlLiAqLyAKLQotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoaC0+dHlwZSkgIT0gU1RUX0FSTV9URlVOQykKLQkJcmVjb3JkX3RodW1iX3RvX2FybV9nbHVlIChsaW5rX2luZm8sIGgpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dHN5bXMpOwotICByZXR1cm4gZmFsc2U7Ci0KLX0KLQotLyogVGhlIHRodW1iIGZvcm0gb2YgYSBsb25nIGJyYW5jaCBpcyBhIGJpdCBmaW5pY2t5LCBiZWNhdXNlIHRoZSBvZmZzZXQKLSAgIGVuY29kaW5nIGlzIHNwbGl0IG92ZXIgdHdvIGZpZWxkcywgZWFjaCBpbiBpdCdzIG93biBpbnN0cnVjdGlvbi4gVGhleQotICAgY2FuIG9jY3VyIGluIGFueSBvcmRlci4gU28gZ2l2ZW4gYSB0aHVtYiBmb3JtIG9mIGxvbmcgYnJhbmNoLCBhbmQgYW4gCi0gICBvZmZzZXQsIGluc2VydCB0aGUgb2Zmc2V0IGludG8gdGhlIHRodW1iIGJyYW5jaCBhbmQgcmV0dXJuIGZpbmlzaGVkCi0gICBpbnN0cnVjdGlvbi4gCi0KLSAgIEl0IHRha2VzIHR3byB0aHVtYiBpbnN0cnVjdGlvbnMgdG8gZW5jb2RlIHRoZSB0YXJnZXQgYWRkcmVzcy4gRWFjaCBoYXMgCi0gICAxMSBiaXRzIHRvIGludmVzdC4gVGhlIHVwcGVyIDExIGJpdHMgYXJlIHN0b3JlZCBpbiBvbmUgKGlkZW50aWZlZCBieQotICAgSC0wLi4gc2VlIGJlbG93KSwgdGhlIGxvd2VyIDExIGJpdHMgYXJlIHN0b3JlZCBpbiB0aGUgb3RoZXIgKGlkZW50aWZpZWQgCi0gICBieSBILTEpLiAKLQotICAgQ29tYmluZSB0b2dldGhlciBhbmQgc2hpZnRlZCBsZWZ0IGJ5IDEgKGl0J3MgYSBoYWxmIHdvcmQgYWRkcmVzcykgYW5kIAotICAgdGhlcmUgeW91IGhhdmUgaXQuCi0KLSAgIE9wOiAxMTExID0gRiwKLSAgIEgtMCwgdXBwZXIgYWRkcmVzcy0wID0gMDAwCi0gICBPcDogMTExMSA9IEYsCi0gICBILTEsIGxvd2VyIGFkZHJlc3MtMCA9IDgwMAotCi0gICBUaGV5IGNhbiBiZSBvcmRlcmVkIGVpdGhlciB3YXksIGJ1dCB0aGUgYXJtIHRvb2xzIEkndmUgc2VlbiBhbHdheXMgcHV0IAotICAgdGhlIGxvd2VyIG9uZSBmaXJzdC4gSXQgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIuIGtya0BjeWdudXMuY29tCi0KLSAgIFhYWDogIEFjdHVhbGx5IHRoZSBvcmRlciBkb2VzIG1hdHRlci4gIFRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gKEgtMSkKLSAgIG1vdmVzIHRoZSBjb21wdXRlZCBhZGRyZXNzIGludG8gdGhlIFBDLCBzbyBpdCBtdXN0IGJlIHRoZSBzZWNvbmQgb25lCi0gICBpbiB0aGUgc2VxdWVuY2UuICBUaGUgcHJvYmxlbSwgaG93ZXZlciBpcyB0aGF0IHdoaWxzdCBsaXR0bGUgZW5kaWFuIGNvZGUKLSAgIHN0b3JlcyB0aGUgaW5zdHJ1Y3Rpb25zIGluIEhJIHRoZW4gTE9XIG9yZGVyLCBiaWcgZW5kaWFuIGNvZGUgZG9lcyB0aGUKLSAgIHJldmVyc2UuICBuaWNrY0BjeWdudXMuY29tICAqLwotCi0jZGVmaW5lIExPV19ISV9PUkRFUiAweEY4MDBGMDAwCi0jZGVmaW5lIEhJX0xPV19PUkRFUiAweEYwMDBGODAwCi0KLXN0YXRpYyBpbnNuMzIKLWluc2VydF90aHVtYl9icmFuY2ggKGJyX2luc24sIHJlbF9vZmYpCi0gICAgIGluc24zMiBicl9pbnNuOwotICAgICBpbnQgcmVsX29mZjsKLXsKLSAgdW5zaWduZWQgaW50IGxvd19iaXRzOwotICB1bnNpZ25lZCBpbnQgaGlnaF9iaXRzOwotCi0KLSAgQkZEX0FTU0VSVCAoKHJlbF9vZmYgJiAxKSAhPSAxKTsKLQotICByZWxfb2ZmID4+PSAxOwkJLyogaGFsZiB3b3JkIGFsaWduZWQgYWRkcmVzcyAqLwotICBsb3dfYml0cyA9IHJlbF9vZmYgJiAweDAwMDAwN0ZGOwkvKiB0aGUgYm90dG9tIDExIGJpdHMgKi8KLSAgaGlnaF9iaXRzID0gKHJlbF9vZmYgPj4gMTEpICYgMHgwMDAwMDdGRjsJLyogdGhlIHRvcCAxMSBiaXRzICovCi0KLSAgaWYgKChicl9pbnNuICYgTE9XX0hJX09SREVSKSA9PSBMT1dfSElfT1JERVIpCi0gICAgYnJfaW5zbiA9IExPV19ISV9PUkRFUiB8IChsb3dfYml0cyA8PCAxNikgfCBoaWdoX2JpdHM7Ci0gIGVsc2UgaWYgKChicl9pbnNuICYgSElfTE9XX09SREVSKSA9PSBISV9MT1dfT1JERVIpCi0gICAgYnJfaW5zbiA9IEhJX0xPV19PUkRFUiB8IChoaWdoX2JpdHMgPDwgMTYpIHwgbG93X2JpdHM7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsJCQkvKiBlcnJvciAtIG5vdCBhIHZhbGlkIGJyYW5jaCBpbnN0cnVjdGlvbiBmb3JtICovCi0KLSAgLyogRklYTUU6IGFib3J0IGlzIHByb2JhYmx5IG5vdCB0aGUgcmlnaHQgY2FsbC4ga3JrQGN5Z251cy5jb20gKi8KLQotICByZXR1cm4gYnJfaW5zbjsKLX0KLQotLyogVGh1bWIgY29kZSBjYWxsaW5nIGFuIEFSTSBmdW5jdGlvbiAqLwotc3RhdGljIGludAotZWxmMzJfdGh1bWJfdG9fYXJtX3N0dWIgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSBoaXRfZGF0YSwgc3ltX3NlYywgb2Zmc2V0LCBhZGRlbmQsIHZhbCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqaGl0X2RhdGE7Ci0gICAgIGFzZWN0aW9uICpzeW1fc2VjOwotICAgICBpbnQgb2Zmc2V0OwotICAgICBpbnQgYWRkZW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgYXNlY3Rpb24gKnMgPSAwOwotICBsb25nIGludCBteV9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IHRtcDsKLSAgbG9uZyBpbnQgcmV0X29mZnNldDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKm15aDsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKmdsb2JhbHM7Ci0KLSAgbXloID0gZmluZF90aHVtYl9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpOwotICBpZiAobXloID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgbXlfb2Zmc2V0ID0gbXloLT5yb290LnUuZGVmLnZhbHVlOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsCi0JCQkgICAgICAgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChzLT5jb250ZW50cyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAocy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCk7Ci0KLSAgaWYgKChteV9vZmZzZXQgJiAweDAxKSA9PSAweDAxKQotICAgIHsKLSAgICAgIGlmIChzeW1fc2VjICE9IE5VTEwKLQkgICYmIHN5bV9zZWMtPm93bmVyICE9IE5VTEwKLQkgICYmICFJTlRFUldPUktfRkxBRyAoc3ltX3NlYy0+b3duZXIpKQotCXsKLQkgIF9iZmRfZXJyb3JfaGFuZGxlcgotCSAgICAoXyAoIiVzKCVzKTogd2FybmluZzogaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkLiIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoc3ltX3NlYy0+b3duZXIpLCBuYW1lKTsKLQkgIF9iZmRfZXJyb3JfaGFuZGxlcgotCSAgICAoXyAoIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IHRodW1iIGNhbGwgdG8gYXJtIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLQotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLS1teV9vZmZzZXQ7Ci0gICAgICBteWgtPnJvb3QudS5kZWYudmFsdWUgPSBteV9vZmZzZXQ7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTFfYnhfcGNfaW5zbiwKLQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCk7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTJfbm9vcF9pbnNuLAotCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgMik7Ci0KLSAgICAgIHJldF9vZmZzZXQgPQotCSgoYmZkX3NpZ25lZF92bWEpIHZhbCkJLyogQWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBvZiB0aGUgc3R1YiAqLwotCS0gKChiZmRfc2lnbmVkX3ZtYSkKLQkgICAocy0+b3V0cHV0X29mZnNldAkvKiBPZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbiB0byB0aGUgc3RhcnQgb2YgdGhlIHN0dWJzLiAgKi8KLQkgICAgKyBteV9vZmZzZXQJCS8qIE9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhpcyBzdHViIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzdHVicy4gICovCi0JICAgICsgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSkJLyogQWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCi0JICAgKyA0CQkJLyogVGhlIGJyYW5jaCBpbnN0cnVjdGlvbiBpcyA0IGJ5dGVzIGludG8gdGhlIHN0dWIuICAqLwotCSAgICsgOCk7CQkvKiBBUk0gYnJhbmNoZXMgd29yayBmcm9tIHRoZSBwYyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKyA4LiAgKi8KLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICB0MmEzX2JfaW5zbiB8ICgocmV0X29mZnNldCA+PiAyKSAmIDB4MDBGRkZGRkYpLAotCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKG15X29mZnNldCA8PSBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUpOwotCi0gIC8qIE5vdyBnbyBiYWNrIGFuZCBmaXggdXAgdGhlIG9yaWdpbmFsIEJMIGluc24gdG8gcG9pbnQKLSAgICAgdG8gaGVyZS4gICovCi0gIHJldF9vZmZzZXQgPQotICAgIHMtPm91dHB1dF9vZmZzZXQKLSAgICArIG15X29mZnNldAotICAgIC0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLSAgICAgICArIG9mZnNldCArIGFkZGVuZCkKLSAgICAtIDQ7Ci0KLSAgdG1wID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YQotCQkgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCi0gIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JICAgICAgaW5zZXJ0X3RodW1iX2JyYW5jaCAodG1wLCByZXRfb2Zmc2V0KSwKLQkgICAgICBoaXRfZGF0YSAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFybSBjb2RlIGNhbGxpbmcgYSBUaHVtYiBmdW5jdGlvbiAqLwotc3RhdGljIGludAotZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSBoaXRfZGF0YSwgc3ltX3NlYywgb2Zmc2V0LCBhZGRlbmQsIHZhbCkKLQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpoaXRfZGF0YTsKLSAgICAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0gICAgIGludCBvZmZzZXQ7Ci0gICAgIGludCBhZGRlbmQ7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICB1bnNpZ25lZCBsb25nIGludCB0bXA7Ci0gIGxvbmcgaW50IG15X29mZnNldDsKLSAgYXNlY3Rpb24gKnM7Ci0gIGxvbmcgaW50IHJldF9vZmZzZXQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpteWg7Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICpnbG9iYWxzOwotCi0gIG15aCA9IGZpbmRfYXJtX2dsdWUgKGluZm8sIG5hbWUsIGlucHV0X2JmZCk7Ci0gIGlmIChteWggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZ2xvYmFscyA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICBteV9vZmZzZXQgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsCi0JCQkgICAgICAgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAocy0+Y29udGVudHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpOwotCi0gIGlmICgobXlfb2Zmc2V0ICYgMHgwMSkgPT0gMHgwMSkKLSAgICB7Ci0gICAgICBpZiAoc3ltX3NlYyAhPSBOVUxMCi0JICAmJiBzeW1fc2VjLT5vd25lciAhPSBOVUxMCi0JICAmJiAhSU5URVJXT1JLX0ZMQUcgKHN5bV9zZWMtPm93bmVyKSkKLQl7Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkgICAgKF8gKCIlcyglcyk6IHdhcm5pbmc6IGludGVyd29ya2luZyBub3QgZW5hYmxlZC4iKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKHN5bV9zZWMtPm93bmVyKSwgbmFtZSk7Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkgICAgKF8gKCIgIGZpcnN0IG9jY3VycmVuY2U6ICVzOiBhcm0gY2FsbCB0byB0aHVtYiIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0JfQotICAgICAgLS1teV9vZmZzZXQ7Ci0gICAgICBteWgtPnJvb3QudS5kZWYudmFsdWUgPSBteV9vZmZzZXQ7Ci0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGEydDFfbGRyX2luc24sCi0JCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQpOwotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBhMnQyX2J4X3IxMl9pbnNuLAotCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7Ci0KLSAgICAgIC8qIEl0J3MgYSB0aHVtYiBhZGRyZXNzLiAgQWRkIHRoZSBsb3cgb3JkZXIgYml0LiAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHZhbCB8IGEydDNfZnVuY19hZGRyX2luc24sCi0JCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA4KTsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAobXlfb2Zmc2V0IDw9IGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOwotCi0gIHRtcCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEpOwotICB0bXAgPSB0bXAgJiAweEZGMDAwMDAwOwotCi0gIC8qIFNvbWVob3cgdGhlc2UgYXJlIGJvdGggNCB0b28gZmFyLCBzbyBzdWJ0cmFjdCA4LiAqLwotICByZXRfb2Zmc2V0ID0gcy0+b3V0cHV0X29mZnNldAotICAgICsgbXlfb2Zmc2V0Ci0gICAgKyBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0gICAgLSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotICAgICAgICsgb2Zmc2V0ICsgYWRkZW5kKQotICAgIC0gODsKLQotICB0bXAgPSB0bXAgfCAoKHJldF9vZmZzZXQgPj4gMikgJiAweDAwRkZGRkZGKTsKLQotICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB0bXAsIGhpdF9kYXRhCi0JICAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBlcmZvcm0gYSByZWxvY2F0aW9uIGFzIHBhcnQgb2YgYSBmaW5hbCBsaW5rLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJICAgICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCByZWwsIHZhbHVlLAotCQkJICAgICAgIGluZm8sIHN5bV9zZWMsIHN5bV9uYW1lLCBzeW1fZmxhZ3MpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgaG93dG87Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIG91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICBjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKiAgICByZWw7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgdmFsdWU7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBzeW1fc2VjOwotICAgICBjb25zdCBjaGFyICogICAgICAgICAgIHN5bV9uYW1lOwotICAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgIHN5bV9mbGFnczsKLXsKLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgcl90eXBlID0gaG93dG8tPnR5cGU7Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgIHJfc3ltbmR4OwotICBiZmRfYnl0ZSAqICAgICAgICAgICAgICAgICAgICBoaXRfZGF0YSA9IGNvbnRlbnRzICsgcmVsLT5yX29mZnNldDsKLSAgYmZkICogICAgICAgICAgICAgICAgICAgICAgICAgZHlub2JqID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1NoZHIgKiAgICAgICAgICAgc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiogc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqICAgICAgICAgICAgICAgICAgICAgbG9jYWxfZ290X29mZnNldHM7Ci0gIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgIHNnb3QgPSBOVUxMOwotICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICBzcGx0ID0gTlVMTDsKLSAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICAgc3JlbG9jID0gTlVMTDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiAgaCA9IE5VTEw7Ci0gIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZDsKLSAgICAKLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGlmIChkeW5vYmopCi0gICAgewotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICB9Ci0gIHN5bXRhYl9oZHIgPSAmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoaW5wdXRfYmZkKTsKLSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0jaWZkZWYgVVNFX1JFTAotICBhZGRlbmQgPSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiBob3d0by0+c3JjX21hc2spOwotI2Vsc2UKLSAgYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLSNlbmRpZgotICAKLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9BUk1fTk9ORToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX1BDMjQ6Ci0gICAgY2FzZSBSX0FSTV9BQlMzMjoKLSAgICBjYXNlIFJfQVJNX1JFTDMyOgotICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMgYXJlIGNvcGllZAotCSBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4gdGltZS4gKi8KLSAgICAgIAotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgKHJfdHlwZSAhPSBSX0FSTV9QQzI0Ci0gCSAgICAgIHx8IChoICE9IE5VTEwKLQkgICAgICAgICAgJiYgaC0+ZHluaW5keCAhPSAtMQotCQkgICYmICghIGluZm8tPnN5bWJvbGljCi0JCSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKSkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsIG91dHJlbDsKLQkgIGJvb2xlYW4gc2tpcCwgcmVsb2NhdGU7Ci0JICAKLQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKiBuYW1lOwotCSAgICAgIAotCSAgICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLAotCQkgICAgICAgZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJICAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQkgICAgICAKLQkgICAgICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDAKLQkJCSAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLAotCQkJCQkJCSAgIGlucHV0X3NlY3Rpb24pLAotCQkJCSAgICAgbmFtZSArIDQpID09IDApOwotCSAgICAgIAotCSAgICAgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNyZWxvYyAhPSBOVUxMKTsKLQkgICAgfQotCSAgCi0JICBza2lwID0gZmFsc2U7Ci0JICAKLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCi0JICAgIG91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZjsKLQkgICAgICAKLQkgICAgICBvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0JCSAgICAgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgJiBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCQkgICAgICByZWwtPnJfb2Zmc2V0KSk7Ci0JICAgICAgaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCi0JCXNraXAgPSB0cnVlOwotCSAgICAgIG91dHJlbC5yX29mZnNldCA9IG9mZjsKLQkgICAgfQotCSAgCi0JICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAKLQkgIGlmIChza2lwKQotCSAgICB7Ci0JICAgICAgbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQkgICAgICByZWxvY2F0ZSA9IGZhbHNlOwotCSAgICB9Ci0JICBlbHNlIGlmIChyX3R5cGUgPT0gUl9BUk1fUEMyNCkKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCAmJiBoLT5keW5pbmR4ICE9IC0xKTsKLQkgICAgICBpZiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQlyZWxvY2F0ZSA9IGZhbHNlOwotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGUgPSB0cnVlOwotCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfQVJNX1BDMjQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaCA9PSBOVUxMCi0JCSAgfHwgKChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApKQotCQl7Ci0JCSAgcmVsb2NhdGUgPSB0cnVlOwotCQkgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfQVJNX1JFTEFUSVZFKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCQkgIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCSAgICByZWxvY2F0ZSA9IGZhbHNlOwotCQkgIGVsc2UKLQkJICAgIHJlbG9jYXRlID0gdHJ1ZTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FSTV9BQlMzMik7Ci0JCX0KLQkgICAgfQotCSAgCi0JICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJICAgICgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQotCQkJCSAgICAgIHNyZWxvYy0+Y29udGVudHMpCi0JCQkJICAgICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQkgIAotCSAgLyogSWYgdGhpcyByZWxvYyBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG8gbm90IHdhbnQgdG8gCi0JICAgICBmaWRkbGUgd2l0aCB0aGUgYWRkZW5kLiAgT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGluY2x1ZGUgdGhlIHN5bWJvbAotCSAgICAgdmFsdWUgc28gdGhhdCBpdCBiZWNvbWVzIGFuIGFkZGVuZCBmb3IgdGhlIGR5bmFtaWMgcmVsb2MuICovCi0JICBpZiAoISByZWxvY2F0ZSkKLQkgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQkgIAotCSAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgCi0JCQkJCSAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCB2YWx1ZSwKLQkJCQkJICAgKGJmZF92bWEpIDApOwotCX0KLSAgICAgIGVsc2Ugc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl9BUk1fUEMyNDoKLQkgIC8qIEFybSBCL0JMIGluc3RydWN0aW9uICovCi0JICAKLQkgIC8qIENoZWNrIGZvciBhcm0gY2FsbGluZyB0aHVtYiBmdW5jdGlvbi4gICovCi0JICBpZiAoc3ltX2ZsYWdzID09IFNUVF9BUk1fVEZVTkMpCi0JICAgIHsKLQkgICAgICBlbGYzMl9hcm1fdG9fdGh1bWJfc3R1YiAoaW5mbywgc3ltX25hbWUsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiwgaGl0X2RhdGEsIHN5bV9zZWMsIHJlbC0+cl9vZmZzZXQsIGFkZGVuZCwgdmFsdWUpOwotCSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0JICAgIH0KLQkgIAotCSAgdmFsdWUgPSB2YWx1ZSArIGFkZGVuZDsKLQkgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyA4KTsKLQkgIHZhbHVlIC09IHJlbC0+cl9vZmZzZXQ7Ci0JICB2YWx1ZSA9IHZhbHVlID4+IGhvd3RvLT5yaWdodHNoaWZ0OwotCSAgCi0JICB2YWx1ZSAmPSAweGZmZmZmZjsKLQkgIHZhbHVlIHw9IChiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhKSAmIDB4ZmYwMDAwMDApOwotCSAgYnJlYWs7Ci0JICAKLQljYXNlIFJfQVJNX0FCUzMyOgotCSAgdmFsdWUgKz0gYWRkZW5kOwotCSAgaWYgKHN5bV9mbGFncyA9PSBTVFRfQVJNX1RGVU5DKQotCSAgICB2YWx1ZSB8PSAxOwotCSAgYnJlYWs7Ci0JICAKLQljYXNlIFJfQVJNX1JFTDMyOgotCSAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICB2YWx1ZSArPSBhZGRlbmQ7Ci0JICBicmVhazsKLQl9Ci0gICAgICAKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX0FCUzg6Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0gICAgICBpZiAoKGxvbmcpIHZhbHVlID4gMHg3ZiB8fCAobG9uZykgdmFsdWUgPCAtMHg4MCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX0FCUzE2OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpIHZhbHVlID4gMHg3ZmZmIHx8IChsb25nKSB2YWx1ZSA8IC0weDgwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9BUk1fQUJTMTI6Ci0gICAgICAvKiBTdXBwb3J0IGxkciBhbmQgc3RyIGluc3RydWN0aW9uIGZvciB0aGUgYXJtICovCi0gICAgICAvKiBBbHNvIHRodW1iIGIgKHVuY29uZGl0aW9uYWwgYnJhbmNoKS4gID8/PyBSZWFsbHk/ICAqLwotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpIHZhbHVlID4gMHg3ZmYgfHwgKGxvbmcpIHZhbHVlIDwgLTB4ODAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIHZhbHVlIHw9IChiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhKSAmIDB4ZmZmZmYwMDApOwotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9BUk1fVEhNX0FCUzU6Ci0gICAgICAvKiBTdXBwb3J0IGxkciBhbmQgc3RyIGluc3RydWN0aW9ucyBmb3IgdGhlIHRodW1iLiAqLwotI2lmZGVmIFVTRV9SRUwKLSAgICAgIC8qIE5lZWQgdG8gcmVmZXRjaCBhZGRlbmQuICAqLwotICAgICAgYWRkZW5kID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiBob3d0by0+c3JjX21hc2s7Ci0gICAgICAvKiA/Pz8gTmVlZCB0byBkZXRlcm1pbmUgc2hpZnQgYW1vdW50IGZyb20gb3BlcmFuZCBzaXplLiAgKi8KLSAgICAgIGFkZGVuZCA+Pj0gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0jZW5kaWYKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgLyogPz8/IElzbid0IHZhbHVlIHVuc2lnbmVkPyAgKi8KLSAgICAgIGlmICgobG9uZykgdmFsdWUgPiAweDFmIHx8IChsb25nKSB2YWx1ZSA8IC0weDEwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIC8qID8/PyBWYWx1ZSBuZWVkcyB0byBiZSBwcm9wZXJseSBzaGlmdGVkIGludG8gcGxhY2UgZmlyc3QuICAqLwotICAgICAgdmFsdWUgfD0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiAweGY4M2Y7Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX0FSTV9USE1fUEMyMjoKLSAgICAgIC8qIFRodW1iIEJMIChicmFuY2ggbG9uZyBpbnN0cnVjdGlvbikuICovCi0gICAgICB7Ci0JYmZkX3ZtYSByZWxvY2F0aW9uOwotCWJvb2xlYW4gb3ZlcmZsb3cgPSBmYWxzZTsKLQliZmRfdm1hIHVwcGVyX2luc24gPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGhpdF9kYXRhKTsKLQliZmRfdm1hIGxvd2VyX2luc24gPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGhpdF9kYXRhICsgMik7Ci0JYmZkX3ZtYSBzcmNfbWFzayA9IDB4MDA3RkZGRkU7Ci0JYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDE7Ci0JYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21pbiA9IH5yZWxvY19zaWduZWRfbWF4OwotCWJmZF92bWEgY2hlY2s7Ci0JYmZkX3NpZ25lZF92bWEgc2lnbmVkX2NoZWNrOwotCWJmZF92bWEgYWRkOwotCWJmZF9zaWduZWRfdm1hIHNpZ25lZF9hZGQ7Ci0KLSNpZmRlZiBVU0VfUkVMCi0JLyogTmVlZCB0byByZWZldGNoIHRoZSBhZGRlbmQgYW5kIHNxdWlzaCB0aGUgdHdvIDExIGJpdCBwaWVjZXMKLQkgICB0b2dldGhlci4gICovCi0JewotCSAgYmZkX3ZtYSB1cHBlciA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgMHg3ZmY7Ci0JICBiZmRfdm1hIGxvd2VyID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBoaXRfZGF0YSArIDIpICYgMHg3ZmY7Ci0JICB1cHBlciA9ICh1cHBlciBeIDB4NDAwKSAtIDB4NDAwOyAvKiBzaWduIGV4dGVuZCAqLwotCSAgYWRkZW5kID0gKHVwcGVyIDw8IDEyKSB8IChsb3dlciA8PCAxKTsKLQl9Ci0jZW5kaWYKLQotICAgICAgICAvKiBJZiBpdCdzIG5vdCBhIGNhbGwgdG8gdGh1bWIsIGFzc3VtZSBjYWxsIHRvIGFybSAqLwotCWlmIChzeW1fZmxhZ3MgIT0gU1RUX0FSTV9URlVOQykKLQkgIHsKLQkgICAgaWYgKGVsZjMyX3RodW1iX3RvX2FybV9zdHViCi0JCShpbmZvLCBzeW1fbmFtZSwgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgaGl0X2RhdGEsIHN5bV9zZWMsIHJlbC0+cl9vZmZzZXQsIGFkZGVuZCwgdmFsdWUpKQotCSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0JICAgIGVsc2UKLQkgICAgICByZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQkgIH0KLQotCS8qICs0OiBwYyBpcyBvZmZzZXQgYnkgNCAqLwotCXJlbG9jYXRpb24gPSB2YWx1ZSArIGFkZGVuZCArIDQ7Ci0JcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQlyZWxvY2F0aW9uIC09IHJlbC0+cl9vZmZzZXQ7Ci0KLQljaGVjayA9IHJlbG9jYXRpb24gPj4gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0KLQkvKiBJZiB0aGlzIGlzIGEgc2lnbmVkIHZhbHVlLCB0aGUgcmlnaHRzaGlmdCBqdXN0IGRyb3BwZWQKLQkgICBsZWFkaW5nIDEgYml0cyAoYXNzdW1pbmcgdHdvcyBjb21wbGVtZW50KS4gICovCi0JaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+PSAwKQotCSAgc2lnbmVkX2NoZWNrID0gY2hlY2s7Ci0JZWxzZQotCSAgc2lnbmVkX2NoZWNrID0gY2hlY2sgfCB+KChiZmRfdm1hKSAtMSA+PiBob3d0by0+cmlnaHRzaGlmdCk7Ci0KLQlhZGQgPSAoKHVwcGVyX2luc24gJiAweDdmZikgPDwgMTIpIHwgKChsb3dlcl9pbnNuICYgMHg3ZmYpIDw8IDEpOwotCS8qIHNpZ24gZXh0ZW5kICovCi0Jc2lnbmVkX2FkZCA9IChhZGQgXiAweDQwMDAwMCkgLSAweDQwMDAwMDsKLQotCS8qIEFkZCB0aGUgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IGZpbGUuICAqLwotCXNpZ25lZF9jaGVjayArPSBzaWduZWRfYWRkOwotCXJlbG9jYXRpb24gKz0gc2lnbmVkX2FkZDsKLQotCS8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gICovCi0JaWYgKHNpZ25lZF9jaGVjayA+IHJlbG9jX3NpZ25lZF9tYXgKLQkgICAgfHwgc2lnbmVkX2NoZWNrIDwgcmVsb2Nfc2lnbmVkX21pbikKLQkgIG92ZXJmbG93ID0gdHJ1ZTsKLQotCS8qIFB1dCBSRUxPQ0FUSU9OIGJhY2sgaW50byB0aGUgaW5zbi4gICovCi0JdXBwZXJfaW5zbiA9ICh1cHBlcl9pbnNuICYgfihiZmRfdm1hKSAweDdmZikgfCAoKHJlbG9jYXRpb24gPj4gMTIpICYgMHg3ZmYpOwotCWxvd2VyX2luc24gPSAobG93ZXJfaW5zbiAmIH4oYmZkX3ZtYSkgMHg3ZmYpIHwgKChyZWxvY2F0aW9uID4+IDEpICYgMHg3ZmYpOwotCi0JLyogUHV0IHRoZSByZWxvY2F0ZWQgdmFsdWUgYmFjayBpbiB0aGUgb2JqZWN0IGZpbGU6ICAqLwotCWJmZF9wdXRfMTYgKGlucHV0X2JmZCwgdXBwZXJfaW5zbiwgaGl0X2RhdGEpOwotCWJmZF9wdXRfMTYgKGlucHV0X2JmZCwgbG93ZXJfaW5zbiwgaGl0X2RhdGEgKyAyKTsKLQotCXJldHVybiAob3ZlcmZsb3cgPyBiZmRfcmVsb2Nfb3ZlcmZsb3cgOiBiZmRfcmVsb2Nfb2spOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfQVJNX0dOVV9WVElOSEVSSVQ6Ci0gICAgY2FzZSBSX0FSTV9HTlVfVlRFTlRSWToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX0NPUFk6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fR0xPQl9EQVQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fSlVNUF9TTE9UOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX1JFTEFUSVZFOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX0dPVE9GRjoKLSAgICAgIC8qIFJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZQotICAgICAgICAgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0gICAgICBpZiAoc2dvdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICAgICAgCi0gICAgICAvKiBOb3RlIHRoYXQgc2dvdC0+b3V0cHV0X29mZnNldCBpcyBub3QgaW52b2x2ZWQgaW4gdGhpcwotICAgICAgICAgY2FsY3VsYXRpb24uICBXZSBhbHdheXMgd2FudCB0aGUgc3RhcnQgb2YgLmdvdC4gIElmIHdlCi0gICAgICAgICBkZWZpbmUgX0dMT0JBTF9PRkZTRVRfVEFCTEUgaW4gYSBkaWZmZXJlbnQgd2F5LCBhcyBpcwotICAgICAgICAgcGVybWl0dGVkIGJ5IHRoZSBBQkksIHdlIG1pZ2h0IGhhdmUgdG8gY2hhbmdlIHRoaXMKLSAgICAgICAgIGNhbGN1bGF0aW9uLiAqLwotICAgICAgCi0gICAgICB2YWx1ZSAtPSBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgCi0gICAgICAJCQkJICAgICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCB2YWx1ZSwKLSAgICAgIAkJCQkgICAgICAgKGJmZF92bWEpIDApOwotCi0gICAgY2FzZSBSX0FSTV9HT1RQQzoKLSAgICAgIC8qIFVzZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGFzIHN5bWJvbCB2YWx1ZS4gKi8KLQotICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgICAgIAotICAgICAgaWYgKHNnb3QgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICAgIHZhbHVlID0gc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgICAgIHJldHVybiBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIAotICAgICAgCQkJCSAgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0gICAgICAJCQkJICAgICAgIChiZmRfdm1hKSAwKTsKLSAgICAgIAotICAgIGNhc2UgUl9BUk1fR09UMzI6Ci0gICAgICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCi0gICAgICAgICBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAqLwotICAgICAgaWYgKHNnb3QgPT0gTlVMTCkKLQlyZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICAgIAotICAgICAgaWYgKGggIT0gTlVMTCkKLQl7Ci0JICBiZmRfdm1hIG9mZjsKLQkgIAotCSAgb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkgIEJGRF9BU1NFUlQgKG9mZiAhPSAoYmZkX3ZtYSkgLTEpOwotCSAgCi0JICBpZiAoIWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkIHx8Ci0JICAgICAgKGluZm8tPnNoYXJlZCAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEgLUJzeW1ib2xpYyBsaW5rCi0JCSBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGxvY2FsbHkuICBXZSBtdXN0IGluaXRpYWxpemUgdGhpcwotCQkgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTaW5jZSB0aGUgb2Zmc2V0IG11c3QKLQkJIGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQsIHdlIHVzZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0Ci0JCSB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlIGluaXRpYWxpemVkIGl0IGFscmVhZHkuCi0JCSAKLQkJIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWwuZ290IHJlbG9jYXRpb24KLQkJIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcyBpcyBkb25lIGluIHRoZSAKLQkJIGZpbmlzaF9keW5hbWljX3N5bWJvbCByb3V0aW5lLiAqLwotCSAgICAgIAotCSAgICAgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJb2ZmICY9IH4xOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHZhbHVlLCBzZ290LT5jb250ZW50cyArIG9mZik7Ci0JCSAgaC0+Z290Lm9mZnNldCB8PSAxOwotCQl9Ci0JICAgIH0KLQkgIAotCSAgdmFsdWUgPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfdm1hIG9mZjsKLQkgIAotCSAgQkZEX0FTU0VSVCAobG9jYWxfZ290X29mZnNldHMgIT0gTlVMTCAmJgotCQkgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKTsKLQkgIAotCSAgb2ZmID0gbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdOwotCSAgCi0JICAvKiBUaGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNC4gIFdlIHVzZSB0aGUKLQkgICAgIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlIGFscmVhZHkKLQkgICAgIGdlbmVyYXRlZCB0aGUgbmVjZXNzYXJ5IHJlbG9jLiAqLwotCSAgaWYgKChvZmYgJiAxKSAhPSAwKQotCSAgICBvZmYgJj0gfjE7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB2YWx1ZSwgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCSAgICAgIAotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICBhc2VjdGlvbiAqIHNyZWxnb3Q7Ci0JCSAgRWxmX0ludGVybmFsX1JlbCBvdXRyZWw7Ci0JCSAgCi0JCSAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotCQkgIEJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7Ci0JCSAgCi0JCSAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldCAKLQkJCQkgICAgICsgb2ZmKTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX0FSTV9SRUxBVElWRSk7Ci0JCSAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgICAgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsICopCi0JCQkJCSAgICAgIHNyZWxnb3QtPmNvbnRlbnRzKQotCQkJCQkgICAgICsgc3JlbGdvdC0+cmVsb2NfY291bnQpKTsKLQkJICArK3NyZWxnb3QtPnJlbG9jX2NvdW50OwotCQl9Ci0JICAgICAgCi0JICAgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7Ci0JICAgIH0KLQkgIAotCSAgdmFsdWUgPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmOwotCX0KLSAgICAgIAotICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgCi0gICAgICAJCQkJICAgICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCB2YWx1ZSwKLSAgICAgIAkJCQkgICAgICAgKGJmZF92bWEpIDApOwotICAgICAgCi0gICAgY2FzZSBSX0FSTV9QTFQzMjoKLSAgICAgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUKLSAgICAgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotICAgICAgLyogUmVzb2x2ZSBhIFBMVDMyIHJlbG9jIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wgZGlyZWN0bHksCi0gICAgICAgICB3aXRob3V0IHVzaW5nIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gKi8KLSAgICAgIGlmIChoID09IE5VTEwpCi0gICAgICAgIHJldHVybiBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0gICAgICAgIAkJCQkgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHZhbHVlLAotICAgICAgICAJCQkJIChiZmRfdm1hKSAwKTsKLQotICAgICAgaWYgKGgtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQotICAgICAgICAvKiBXZSBkaWRuJ3QgbWFrZSBhIFBMVCBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICBUaGlzCi0gICAgICAgICAgIGhhcHBlbnMgd2hlbiBzdGF0aWNhbGx5IGxpbmtpbmcgUElDIGNvZGUsIG9yIHdoZW4KLSAgICAgICAgICAgdXNpbmcgLUJzeW1ib2xpYy4gICovCi0JcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCB2YWx1ZSwKLQkJCQkJIChiZmRfdm1hKSAwKTsKLQotICAgICAgQkZEX0FTU0VSVChzcGx0ICE9IE5VTEwpOwotICAgICAgaWYgKHNwbHQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICAgIHZhbHVlID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JICAgICAgICsgaC0+cGx0Lm9mZnNldCk7Ci0gICAgICByZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgICAJCQkgICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHZhbHVlLAotICAgICAgICAJCQkgICAgICAgKGJmZF92bWEpIDApOwotICAgICAgCi0gICAgY2FzZSBSX0FSTV9TQlJFTDMyOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX0FNUF9WQ0FMTDk6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fUlNCUkVMMzI6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fVEhNX1JQQzIyOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX1JSRUwzMjoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9SQUJTMzI6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fUlBDMjQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fUkJBU0U6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci19Ci0KLQotLyogUmVsb2NhdGUgYW4gQVJNIEVMRiBzZWN0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIG91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICBjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKiAgICByZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKiogICAgICAgICAgICBsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKiAgICAgICAgICAgc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiogc3ltX2hhc2hlczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWxlbmQ7Ci0gIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgIG5hbWU7Ci0KLSAgc3ltdGFiX2hkciA9ICYgZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiBob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICogc3ltOwotICAgICAgYXNlY3Rpb24gKiBzZWM7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3R5cGUgPT0gUl9BUk1fR05VX1ZURU5UUlkKLSAgICAgICAgICB8fCByX3R5cGUgPT0gUl9BUk1fR05VX1ZUSU5IRVJJVCApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvKiBTY290dEI6IHJhbmdlIGNoZWNrIHJfdHlwZSBoZXJlLiAqLwotICAgICAgCi0gICAgICBob3d0byA9IGVsZjMyX2FybV9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0jaWZkZWYgVVNFX1JFTAotCQkgIHsKLQkJICAgIGJmZF92bWEgdmFsOwotCQkgICAgdmFsID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQkgICAgdmFsICs9IChzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlKTsKLQkJICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQkgIH0KLSNlbHNlCi0JCSAgcmVsLT5yX2FkZGVuZCArPSAoc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZSkKLQkJICAgID4+IGhvd3RvLT5yaWdodHNoaWZ0OwotI2VuZGlmCi0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIAotICAgICAgICAgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkgIAkgICAgICAgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIAotCSAgICAgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uIHZhbHVlLgotCSAgICAgICAgIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUgb2JzY3VyZSBjYXNlcyAKLQkgICAgICAgICBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gKi8KLQkgICAgICBzd2l0Y2ggKHJfdHlwZSkKLQkJewotCSAgICAgICAgY2FzZSBSX0FSTV9QQzI0OgotCSAgICAgICAgY2FzZSBSX0FSTV9BQlMzMjoKLQkgICAgICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICAgICAgICAgJiYgKAotCSAgICAgICAgICAgICAgCSAgKCFpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCSAgICAgICAgICAgICAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMAotCQkJICApCi0JICAgICAgICAgICAgICAmJiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkgICAgICApCi0JICAgICAgICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JICAgICAgICBjYXNlIFJfQVJNX0dPVFBDOgotCSAgICAgICAgICByZWxvY2F0aW9uID0gMDsKLQkJICBicmVhazsKLQkJICAKLQkgICAgICAgIGNhc2UgUl9BUk1fR09UMzI6Ci0JICAgICAgICAgIGlmIChlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JICAgICAgICAgICAgICAmJiAoIWluZm8tPnNoYXJlZAotCSAgICAgICAgICAgICAgICAgIHx8ICghaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkgICAgICAgICAgICAgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLQkJCSAgKQotCQkgICAgICApCi0JICAgICAgICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JICAgICAgICBjYXNlIFJfQVJNX1BMVDMyOgotCSAgICAgICAgICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSktMSkKLQkgICAgICAgICAgICByZWxvY2F0aW9uID0gMDsKLQkJICBicmVhazsKLQkJICAKLQkgICAgICAgIGRlZmF1bHQ6Ci0JCSAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkoXygiJXM6IHdhcm5pbmc6IHVucmVzb2x2YWJsZSByZWxvY2F0aW9uIGFnYWluc3Qgc3ltYm9sIGAlcycgZnJvbSAlcyBzZWN0aW9uIiksCi0JCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSk7Ci0JCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChoICE9IE5VTEwpCi0JbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBlbHNlCi0JewotCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCSAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0JICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JfQotICAgICAgCi0gICAgICByID0gZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJCSBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsLAotCQkJCQkgcmVsb2NhdGlvbiwgaW5mbywgc2VjLCBuYW1lLAotCQkJCQkgKGggPyBFTEZfU1RfVFlQRSAoaC0+dHlwZSkgOgotCQkJCQkgIEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pKSk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBjb25zdCBjaGFyICogbXNnID0gKGNvbnN0IGNoYXIgKikgMDsKLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjb21tb25fZXJyb3I6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGdW5jdGlvbiB0byBrZWVwIEFSTSBzcGVjaWZpYyBmbGFncyBpbiB0aGUgRUxGIGhlYWRlci4gKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBpZiAoZWxmX2ZsYWdzX2luaXQgKGFiZmQpCi0gICAgICAmJiBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAhPSBmbGFncykKLSAgICB7Ci0gICAgICBpZiAoZmxhZ3MgJiBFRl9JTlRFUldPUkspCi0JX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAotV2FybmluZzogTm90IHNldHRpbmcgaW50ZXJ3b3JrIGZsYWcgb2YgJXMgc2luY2UgaXQgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQgYXMgbm9uLWludGVyd29ya2luZyIpLAotCQkJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGVsc2UKLQlfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCi1XYXJuaW5nOiBDbGVhcmluZyB0aGUgaW50ZXJ3b3JrIGZsYWcgb2YgJXMgZHVlIHRvIG91dHNpZGUgcmVxdWVzdCIpLAotCQkJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICAgICAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlciAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBmbGFnd29yZCBpbl9mbGFnczsKLSAgZmxhZ3dvcmQgb3V0X2ZsYWdzOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbl9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvdXRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoZWxmX2ZsYWdzX2luaXQgKG9iZmQpICYmIGluX2ZsYWdzICE9IG91dF9mbGFncykKLSAgICB7Ci0gICAgICAvKiBDYW5ub3QgbWl4IFBJQyBhbmQgbm9uLVBJQyBjb2RlLiAgKi8KLSAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9QSUMpICE9IChvdXRfZmxhZ3MgJiBFRl9QSUMpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQ2Fubm90IG1peCBBUENTMjYgYW5kIEFQQ1MzMiBjb2RlLiAgKi8KLSAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9BUENTXzI2KSAhPSAob3V0X2ZsYWdzICYgRUZfQVBDU18yNikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBDYW5ub3QgbWl4IGZsb2F0IEFQQ1MgYW5kIG5vbi1mbG9hdCBBUENTIGNvZGUuICAqLwotICAgICAgaWYgKChpbl9mbGFncyAmIEVGX0FQQ1NfRkxPQVQpICE9IChvdXRfZmxhZ3MgJiBFRl9BUENTX0ZMT0FUKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgaGF2ZSBkaWZmZXJlbnQgaW50ZXJ3b3JraW5nIGZsYWdzCi0gICAgICAgICB0aGVuIHR1cm4gb2ZmIHRoZSBpbnRlcndvcmtpbmcgYml0LiAgKi8KLSAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9JTlRFUldPUkspICE9IChvdXRfZmxhZ3MgJiBFRl9JTlRFUldPUkspKQotCXsKLQkgIGlmIChvdXRfZmxhZ3MgJiBFRl9JTlRFUldPUkspCi0JICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKLVdhcm5pbmc6IENsZWFyaW5nIHRoZSBpbnRlcndvcmsgZmxhZyBpbiAlcyBiZWNhdXNlIG5vbi1pbnRlcndvcmtpbmcgY29kZSBpbiAlcyBoYXMgYmVlbiBsaW5rZWQgd2l0aCBpdCIpLAotCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0JICBpbl9mbGFncyAmPSB+RUZfSU5URVJXT1JLOwotCX0KLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG91dF9mbGFnczsKLSAgZmxhZ3dvcmQgaW5fZmxhZ3M7Ci0KLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmICggICBpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0gICAgICAmJiBvYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOCi0gICAgICAmJiBpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgJXMgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzICVzIGVuZGlhbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkgYmZkX2JpZ19lbmRpYW4gKGliZmQpID8gImJpZyIgOiAibGl0dGxlIiwKLQkgYmZkX2JpZ19lbmRpYW4gKG9iZmQpID8gImJpZyIgOiAibGl0dGxlIik7Ci0KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgaW5wdXQgQkZEIG11c3QgaGF2ZSBoYWQgaXRzIGZsYWdzIGluaXRpYWxpc2VkLiAgKi8KLSAgLyogVGhlIGZvbGxvd2luZyBzZWVtcyBib2d1cyB0byBtZSAtLSBUaGUgZmxhZ3MgYXJlIGluaXRpYWxpemVkIGluCi0gICAgIHRoZSBhc3NlbWJsZXIgYnV0IEkgZG9uJ3QgdGhpbmsgYW4gZWxmX2ZsYWdzX2luaXQgZmllbGQgaXMKLSAgICAgd3JpdHRlbiBpbnRvIHRoZSBvYmplY3QgKi8KLSAgLyogQkZEX0FTU0VSVCAoZWxmX2ZsYWdzX2luaXQgKGliZmQpKTsgKi8KLQotICBpbl9mbGFncyAgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb3V0X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0KLSAgaWYgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCi0gICAgewotICAgICAgLyogSWYgdGhlIGlucHV0IGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSB0aGVuIGRvIG5vdAotICAgICAgICAgYm90aGVyIHNldHRpbmcgdGhlIGZsYWdzIGZvciB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSwKLSAgICAgICAgIGluc3RlYWQgYWxsb3cgZnV0dXJlIG1lcmdlcyB0byBkbyB0aGlzLiAgSWYgbm8gZnV0dXJlCi0gICAgICAgICBtZXJnZXMgZXZlciBzZXQgdGhlc2UgZmxhZ3MgdGhlbiB0aGV5IHdpbGwgcmV0YWluIHRoZWlyCi0gICAgICAgICB1bml0aWFsaXNlZCB2YWx1ZXMsIHdoaWNoIHN1cnByaXNlIHN1cnByaXNlLCBjb3JyZXNwb25kCi0gICAgICAgICB0byB0aGUgZGVmYXVsdCB2YWx1ZXMuICAqLwotICAgICAgaWYgKGJmZF9nZXRfYXJjaF9pbmZvIChpYmZkKS0+dGhlX2RlZmF1bHQpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGluX2ZsYWdzOwotCi0gICAgICBpZiAoYmZkX2dldF9hcmNoIChvYmZkKSA9PSBiZmRfZ2V0X2FyY2ggKGliZmQpCi0JICAmJiBiZmRfZ2V0X2FyY2hfaW5mbyAob2JmZCktPnRoZV9kZWZhdWx0KQotCXJldHVybiBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwgYmZkX2dldF9tYWNoIChpYmZkKSk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBDaGVjayBmbGFnIGNvbXBhdGliaWxpdHkuICAqLwotICBpZiAoaW5fZmxhZ3MgPT0gb3V0X2ZsYWdzKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIENvbXBsYWluIGFib3V0IHZhcmlvdXMgZmxhZyBtaXNtYXRjaGVzLiAgKi8KLQotICBpZiAoKGluX2ZsYWdzICYgRUZfQVBDU18yNikgIT0gKG91dF9mbGFncyAmIEVGX0FQQ1NfMjYpKQotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKLUVycm9yOiAlcyBjb21waWxlZCBmb3IgQVBDUy0lZCwgd2hlcmVhcyAlcyBpcyBjb21waWxlZCBmb3IgQVBDUy0lZCIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JCQlpbl9mbGFncyAmIEVGX0FQQ1NfMjYgPyAyNiA6IDMyLAotCQkJYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCQlvdXRfZmxhZ3MgJiBFRl9BUENTXzI2ID8gMjYgOiAzMik7Ci0KLSAgaWYgKChpbl9mbGFncyAmIEVGX0FQQ1NfRkxPQVQpICE9IChvdXRfZmxhZ3MgJiBFRl9BUENTX0ZMT0FUKSkKLSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCi1FcnJvcjogJXMgcGFzc2VzIGZsb2F0cyBpbiAlcyByZWdpc3RlcnMsIHdoZXJlYXMgJXMgcGFzc2VzIHRoZW0gaW4gJXMgcmVnaXN0ZXJzIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkJICAgICBpbl9mbGFncyAmIEVGX0FQQ1NfRkxPQVQgPyBfICgiZmxvYXQiKSA6IF8gKCJpbnRlZ2VyIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwKLQkJICAgICAgb3V0X2ZsYWdzICYgRUZfQVBDU18yNiA/IF8gKCJmbG9hdCIpIDogXyAoImludGVnZXIiKSk7Ci0KLSAgaWYgKChpbl9mbGFncyAmIEVGX1BJQykgIT0gKG91dF9mbGFncyAmIEVGX1BJQykpCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAotRXJyb3I6ICVzIGlzIGNvbXBpbGVkIGFzIHBvc2l0aW9uICVzIGNvZGUsIHdoZXJlYXMgJXMgaXMgbm90IiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkJICAgIGluX2ZsYWdzICYgRUZfUElDID8gXyAoImluZGVwZW5kZW50IikgOiBfICgiZGVwZW5kZW50IiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLSAgLyogSW50ZXJ3b3JraW5nIG1pc21hdGNoIGlzIG9ubHkgYSB3YXJuaW5nLiAqLwotICBpZiAoKGluX2ZsYWdzICYgRUZfSU5URVJXT1JLKSAhPSAob3V0X2ZsYWdzICYgRUZfSU5URVJXT1JLKSkKLSAgICB7Ci0gICAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCi1XYXJuaW5nOiAlcyAlcyBpbnRlcndvcmtpbmcsIHdoZXJlYXMgJXMgJXMiKSwKLQkJCSAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JICBpbl9mbGFncyAmIEVGX0lOVEVSV09SSyA/IF8gKCJzdXBwb3J0cyIpIDogXyAoImRvZXMgbm90IHN1cHBvcnQiKSwKLQkJCSAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCSAgICBvdXRfZmxhZ3MgJiBFRl9JTlRFUldPUksgPyBfICgiZG9lcyBub3QiKSA6IF8gKCJkb2VzIikpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBwdHI7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBwdHI7Ci0KLSAgQkZEX0FTU0VSVCAoYWJmZCAhPSBOVUxMICYmIHB0ciAhPSBOVUxMKTsKLQotICAvKiBQcmludCBub3JtYWwgRUxGIHByaXZhdGUgZGF0YS4gICovCi0gIF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cik7Ci0KLSAgLyogSWdub3JlIGluaXQgZmxhZyAtIGl0IG1heSBub3QgYmUgc2V0LCBkZXNwaXRlIHRoZSBmbGFncyBmaWVsZCBjb250YWluaW5nIHZhbGlkIGRhdGEuICAqLwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGZwcmludGYgKGZpbGUsIF8gKCJwcml2YXRlIGZsYWdzID0gJWx4OiIpLCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyk7Ci0KLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfSU5URVJXT1JLKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2ludGVyd29ya2luZyBlbmFibGVkXSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2ludGVyd29ya2luZyBub3QgZW5hYmxlZF0iKSk7Ci0KLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfQVBDU18yNikKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtBUENTLTI2XSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW0FQQ1MtMzJdIikpOwotCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0FQQ1NfRkxPQVQpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbZmxvYXRzIHBhc3NlZCBpbiBmbG9hdCByZWdpc3RlcnNdIikpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbZmxvYXRzIHBhc3NlZCBpbiBpbnRlZ2VyIHJlZ2lzdGVyc10iKSk7Ci0KLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfUElDKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW3Bvc2l0aW9uIGluZGVwZW5kZW50XSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2Fic29sdXRlIHBvc2l0aW9uXSIpKTsKLQotICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQKLWVsZjMyX2FybV9nZXRfc3ltYm9sX3R5cGUgKGVsZl9zeW0sIHR5cGUpCi0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiBlbGZfc3ltOwotICAgICBpbnQgdHlwZTsKLXsKLSAgaWYgKEVMRl9TVF9UWVBFIChlbGZfc3ltLT5zdF9pbmZvKSA9PSBTVFRfQVJNX1RGVU5DKQotICAgIHJldHVybiBFTEZfU1RfVFlQRSAoZWxmX3N5bS0+c3RfaW5mbyk7Ci0gIGVsc2UKLSAgICByZXR1cm4gdHlwZTsKLX0KLSAgICAKLXN0YXRpYyBhc2VjdGlvbiAqCi1lbGYzMl9hcm1fZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgICBiZmQgKmFiZmQ7Ci0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9BUk1fR05VX1ZUSU5IRVJJVDoKLSAgICAgIGNhc2UgUl9BUk1fR05VX1ZURU5UUlk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIGVsc2UKLSAgICAgewotICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0gICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLSAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgLyogd2UgZG9uJ3QgdXNlIGdvdCBhbmQgcGx0IGVudHJpZXMgZm9yIGFybWVsZiAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0gCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgIGluZm87Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgIHNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiAgcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICByZWxfZW5kOwotICBiZmQgKiAgICAgICAgICAgICAgICAgICAgICAgICBkeW5vYmo7Ci0gIGFzZWN0aW9uICogc2dvdCwgKnNyZWxnb3QsICpzcmVsb2M7Ci0gIGJmZF92bWEgKiBsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgIAotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotIAotICBzZ290ID0gc3JlbGdvdCA9IHNyZWxvYyA9IE5VTEw7Ci0JCQkJICAgCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCk7Ci0gIAotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLSAgICAgICAgaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0gICAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0gCi0gICAgICAvKiBTb21lIHJlbG9jcyByZXF1aXJlIGEgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JewotCSAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQkgICAgewotCSAgICBjYXNlIFJfQVJNX0dPVDMyOgotCSAgICBjYXNlIFJfQVJNX0dPVE9GRjoKLQkgICAgY2FzZSBSX0FSTV9HT1RQQzoKLQkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgICAgewotCSAgY2FzZSBSX0FSTV9HT1QzMjoKLQkgICAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KLQkgICAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgICB7Ci0JICAgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgICAgfQotCi0JICAgIC8qIEdldCB0aGUgZ290IHJlbG9jYXRpb24gc2VjdGlvbiBpZiBuZWNlc3NhcnkuICAqLwotCSAgICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JICAgICAgICAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgICAgewotCSAgICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotCSAgICAgIAotCSAgICAgICAgLyogSWYgbm8gZ290IHJlbG9jYXRpb24gc2VjdGlvbiwgbWFrZSBvbmUgYW5kIGluaXRpYWxpemUuICAqLwotCSAgICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJICB7Ci0JCSAgICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLQkJICAgIGlmIChzcmVsZ290ID09IE5VTEwKLQkJICAgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkgIAkJCQkgICAgKFNFQ19BTExPQwotCQkJCQkJICAgICB8IFNFQ19MT0FECi0JCQkJCQkgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsZ290LCAyKSkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgaWYgKGggIT0gTlVMTCkKLQkgICAgICB7Ci0JICAgICAgICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0JCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCi0JCSAgYnJlYWs7Ci0JCQotCSAgICAgICAgaC0+Z290Lm9mZnNldCA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgICAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotICAgICAJICAgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbAotICAgICAgICAgICAgICAgICAgIHN5bWJvbC4gICovCi0JICAgICAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICB7Ci0JCSAgICBzaXplX3Qgc2l6ZTsKLQkJICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotCi0JCSAgICBzaXplID0gc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoYmZkX3ZtYSk7Ci0JCSAgICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IChiZmRfdm1hICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0JCSAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKSA9IGxvY2FsX2dvdF9vZmZzZXRzOwotCQkgICAgZm9yIChpID0gMDsgaSA8IHN5bXRhYl9oZHItPnNoX2luZm87IGkrKykKLQkJICAgICAgbG9jYWxfZ290X29mZnNldHNbaV0gPSAoYmZkX3ZtYSkgLTE7Ci0JCSAgfQotCQkKLQkgICAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKQotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCi0JICAgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gPSBzZ290LT5fcmF3X3NpemU7Ci0KLQkgICAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCi0JCSAgICAgb3V0cHV0IGEgUl9BUk1fUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUgZHluYW1pYwotCQkgICAgIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KLQkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCSAgICAgIH0KLQotCSAgICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQkgICAgYnJlYWs7Ci0KLSAgCSAgY2FzZSBSX0FSTV9QTFQzMjoKLQkgICAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gIFdlCi0gICAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotICAgICAgICAgICAgICAgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGEgY2FzZSBvZiBsaW5raW5nIFBJQyBjb2RlIHdoaWNoIGlzCi0gICAgICAgICAgICAgICBuZXZlciByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGluIHdoaWNoIGNhc2Ugd2UKLSAgICAgICAgICAgICAgIGRvbid0IG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeQotICAgICAgICAgICAgICAgYWZ0ZXIgYWxsLiAgKi8KLQotCSAgICAvKiBJZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB3ZSByZXNvbHZlIGl0IGRpcmVjdGx5IHdpdGhvdXQKLSAgICAgICAgICAgICAgIGNyZWF0aW5nIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotCSAgICBpZiAoaCA9PSBOVUxMKQotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIFJfQVJNX0FCUzMyOgotCSAgY2FzZSBSX0FSTV9SRUwzMjoKLQkgIGNhc2UgUl9BUk1fUEMyNDoKLQkgICAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGFuZCB0aGlzIGlzIGEgcmVsb2MKLSAgICAgICAgICAgICAgIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLCBvciBhIG5vbiBQQyByZWxhdGl2ZSByZWxvYwotICAgICAgICAgICAgICAgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCwgdGhlbiB3ZSBuZWVkIHRvIGNvcHkgdGhlIHJlbG9jCi0gICAgICAgICAgICAgICBpbnRvIHRoZSBzaGFyZWQgbGlicmFyeS4gIEhvd2V2ZXIsIGlmIHdlIGFyZSBsaW5raW5nIHdpdGgKLSAgICAgICAgICAgICAgIC1Cc3ltYm9saWMsIHdlIGRvIG5vdCBuZWVkIHRvIGNvcHkgYSByZWxvYyBhZ2FpbnN0IGEKLSAgICAgICAgICAgICAgIGdsb2JhbCBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBpbiBhbiBvYmplY3Qgd2UgYXJlCi0gICAgICAgICAgICAgICBpbmNsdWRpbmcgaW4gdGhlIGxpbmsgKGkuZS4sIERFRl9SRUdVTEFSIGlzIHNldCkuICBBdAotICAgICAgICAgICAgICAgdGhpcyBwb2ludCB3ZSBoYXZlIG5vdCBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMsIHNvIGl0IGlzCi0gICAgICAgICAgICAgICBwb3NzaWJsZSB0aGF0IERFRl9SRUdVTEFSIGlzIG5vdCBzZXQgbm93IGJ1dCB3aWxsIGJlIHNldAotICAgICAgICAgICAgICAgbGF0ZXIgKGl0IGlzIG5ldmVyIGNsZWFyZWQpLiAgV2UgYWNjb3VudCBmb3IgdGhhdAotICAgICAgICAgICAgICAgcG9zc2liaWxpdHkgYmVsb3cgYnkgc3RvcmluZyBpbmZvcm1hdGlvbiBpbiB0aGUKLSAgICAgICAgICAgICAgIHBjcmVsX3JlbG9jc19jb3BpZWQgZmllbGQgb2YgdGhlIGhhc2ggdGFibGUgZW50cnkuICAqLwotCSAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAgICAgJiYgKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pICE9IFJfQVJNX1BDMjQKLQkgICAgICAgIHx8IChoICE9IE5VTEwKLQkJICAmJiAoISBpbmZvLT5zeW1ib2xpYwotCQkgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpKQotCSAgICAgIHsKLQkgICAgICAgIC8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UKLSAgICAgICAgICAgICAgICAgICByZWxvYyB0eXBlcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGNyZWF0ZSBhIHJlbG9jCi0gICAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhpcyByZWxvYy4gICovCi0JICAgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgewotCQkgICAgY29uc3QgY2hhciAqIG5hbWU7Ci0KLQkJICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAgIChhYmZkLAotCQkJICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICAgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMAotCQkgCSAgICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkJICAgbmFtZSArIDQpID09IDApOwotCi0JCSAgICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgICAgewotCQkgICAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0JCSAgICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZCi0JCQkgICAgICAgICB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCQkgICAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJCSAgZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JCSAgICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCQkgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKLQkJCSAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAyKSkKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkgICAgICB9Ci0JCSAgfQotCi0JICAgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JICAgICAgICAvKiBJZiB3ZSBhcmUgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIGFuZCB0aGlzIGlzIGEKLSAgICAgICAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlCi0gICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbnMgd2UgaGF2ZSBlbnRlcmVkIGZvciB0aGlzIHN5bWJvbCwgc28gdGhhdAotICAgICAgICAgICAgICAgICAgIHdlIGNhbiBkaXNjYXJkIHRoZW0gYWdhaW4gaWYgdGhlIHN5bWJvbCBpcyBsYXRlcgotICAgICAgICAgICAgICAgICAgIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgICAgaXMgb25seSBjYWxsZWQgaWYgd2UgYXJlIHVzaW5nIGFuIGVsZl9pMzg2IGxpbmtlcgotICAgICAgICAgICAgICAgICAgIGhhc2ggdGFibGUsIHdoaWNoIG1lYW5zIHRoYXQgaCBpcyByZWFsbHkgYSBwb2ludGVyIHRvCi0gICAgICAgICAgICAgICAgICAgYW4gZWxmX2kzODZfbGlua19oYXNoX2VudHJ5LiAgKi8KLQkgICAgICAgIGlmIChoICE9IE5VTEwgJiYgaW5mby0+c3ltYm9saWMKLQkJICAgICYmIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfQVJNX1BDMjQpCi0JCSAgewotCQkgICAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKiBlaDsKLQkJICAgIHN0cnVjdCBlbGYzMl9hcm1fcGNyZWxfcmVsb2NzX2NvcGllZCAqIHA7Ci0KLQkJICAgIGVoID0gKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopIGg7Ci0KLQkJICAgIGZvciAocCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCQkgICAgICBpZiAocC0+c2VjdGlvbiA9PSBzcmVsb2MpCi0JCSAgICAgICAgYnJlYWs7Ci0KLQkJICAgIGlmIChwID09IE5VTEwpCi0JCSAgICAgIHsKLQkJICAgICAgICBwID0gKChzdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQgKikKLQkJCSAgICAgYmZkX2FsbG9jIChkeW5vYmosIHNpemVvZiAqIHApKTsKLQkJCQotCQkgICAgICAgIGlmIChwID09IE5VTEwpCi0JCQkgIHJldHVybiBmYWxzZTsKLQkJICAgICAgICBwLT5uZXh0ID0gZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7Ci0JCSAgICAgICAgZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBwOwotCQkgICAgICAgIHAtPnNlY3Rpb24gPSBzcmVsb2M7Ci0JCSAgICAgICAgcC0+Y291bnQgPSAwOwotCQkgICAgICB9Ci0KLQkJICAgICsrcC0+Y291bnQ7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9BUk1fR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0gICAgICAgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfQVJNX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSAgICAgICAKLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB0byBhIHBhcnRpY3VsYXIgc2VjdGlvbiBhbmQgb2Zmc2V0LCBmb3IgZXJyb3IKLSAgIHJlcG9ydGluZy4gICBUaGlzIGNvZGUgaXMgYSBkdXBsaWNhdGUgb2YgdGhlIGNvZGUgaW4gZWxmLmMsIGV4Y2VwdAotICAgdGhhdCBpdCBhbHNvIGFjY2VwdHMgU1RUX0FSTV9URlVOQyBhcyBhIHN5bWJvbCB0aGF0IG5hbWVzIGEgZnVuY3Rpb24uICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fZmluZF9uZWFyZXN0X2xpbmUKLSAgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKLSAgICAgYmZkICogICAgICAgICAgYWJmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKiAgICAgc3ltYm9sczsKLSAgICAgYmZkX3ZtYSAgICAgICAgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqICBmaWxlbmFtZV9wdHI7Ci0gICAgIENPTlNUIGNoYXIgKiogIGZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqIGxpbmVfcHRyOwotewotICBib29sZWFuICAgICAgZm91bmQ7Ci0gIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsKLSAgYXN5bWJvbCAqICAgIGZ1bmM7Ci0gIGJmZF92bWEgICAgICBsb3dfZnVuYzsKLSAgYXN5bWJvbCAqKiAgIHA7Ci0KLSAgaWYgKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIAotCQkJCSAgICAgbGluZV9wdHIpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzeW1ib2xzLCBzZWN0aW9uLCBvZmZzZXQsCi0JCQkJCSAgICAgJmZvdW5kLCBmaWxlbmFtZV9wdHIsCi0JCQkJCSAgICAgZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIsCi0JCQkJCSAgICAgJmVsZl90ZGF0YSAoYWJmZCktPmxpbmVfaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgaWYgKGZvdW5kKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChzeW1ib2xzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZpbGVuYW1lID0gTlVMTDsKLSAgZnVuYyA9IE5VTEw7Ci0gIGxvd19mdW5jID0gMDsKLQotICBmb3IgKHAgPSBzeW1ib2xzOyAqcCAhPSBOVUxMOyBwKyspCi0gICAgewotICAgICAgZWxmX3N5bWJvbF90eXBlICpxOwotCi0gICAgICBxID0gKGVsZl9zeW1ib2xfdHlwZSAqKSAqcDsKLQotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbiAoJnEtPnN5bWJvbCkgIT0gc2VjdGlvbikKLQljb250aW51ZTsKLQotICAgICAgc3dpdGNoIChFTEZfU1RfVFlQRSAocS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCWNhc2UgU1RUX0ZJTEU6Ci0JICBmaWxlbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCZxLT5zeW1ib2wpOwotCSAgYnJlYWs7Ci0JY2FzZSBTVFRfTk9UWVBFOgotCWNhc2UgU1RUX0ZVTkM6Ci0JY2FzZSBTVFRfQVJNX1RGVU5DOgotCSAgaWYgKHEtPnN5bWJvbC5zZWN0aW9uID09IHNlY3Rpb24KLQkgICAgICAmJiBxLT5zeW1ib2wudmFsdWUgPj0gbG93X2Z1bmMKLQkgICAgICAmJiBxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgZnVuYyA9IChhc3ltYm9sICopIHE7Ci0JICAgICAgbG93X2Z1bmMgPSBxLT5zeW1ib2wudmFsdWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZ1bmMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKmZpbGVuYW1lX3B0ciA9IGZpbGVuYW1lOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IGJmZF9hc3ltYm9sX25hbWUgKGZ1bmMpOwotICAqbGluZV9wdHIgPSAwOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQotICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKLSAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KLSAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCi0gICB1bmRlcnN0YW5kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotewotICBiZmQgKiBkeW5vYmo7Ci0gIGFzZWN0aW9uICogczsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uLCBwdXQgaXQgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgV2UKLSAgICAgd2lsbCBmaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbGF0ZXIsCi0gICAgIHdoZW4gd2Uga25vdyB0aGUgYWRkcmVzcyBvZiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLSAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKLSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApCi0gICAgewotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpID09IDAKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgPT0gMCkKLQl7Ci0JICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIGlmIHdlIHNhdyBhIFBMVDMyIHJlbG9jIGluIGFuIGlucHV0Ci0gICAgICAgICAgICAgZmlsZSwgYnV0IHRoZSBzeW1ib2wgd2FzIG5ldmVyIHJlZmVycmVkIHRvIGJ5IGEgZHluYW1pYwotICAgICAgICAgICAgIG9iamVjdC4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGJ1aWxkCi0gICAgICAgICAgICAgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgYW5kIHdlIGNhbiBqdXN0IGRvIGEgUEMzMgotICAgICAgICAgICAgIHJlbG9jIGluc3RlYWQuICAqLwotCSAgQkZEX0FTU0VSVCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCk7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0gICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IC5wbHQgZW50cnksIG1ha2Ugcm9vbSBmb3IgdGhlIHNwZWNpYWwKLQkgZmlyc3QgZW50cnkuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUKLQkgbm90IGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGlzCi0JIGxvY2F0aW9uIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uCi0JIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsIGV4ZWN1dGFibGUgYW5kCi0JIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQl9Ci0KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0KLSAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBlbnRyeS4gICovCi0gICAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAuZ290LnBsdCBzZWN0aW9uLCB3aGljaAotCSB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgLmdvdCBzZWN0aW9uIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSA0OwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLnJlbC5wbHQgc2VjdGlvbi4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCi0KLSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG11c3QgcHJlc3VtZSB0aGF0IHRoZQotICAgICBvbmx5IHJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBhcmUgdmlhIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotICAgICBGb3Igc3VjaCBjYXNlcyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyBoZXJlOyB0aGUgcmVsb2NhdGlvbnMgd2lsbAotICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSByZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBzeW1ib2wgaW4gb3VyIC5keW5ic3Mgc2VjdGlvbiwgd2hpY2ggd2lsbAotICAgICBiZWNvbWUgcGFydCBvZiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgVGhlcmUgd2lsbCBiZQotICAgICBhbiBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gIFRoZSBkeW5hbWljCi0gICAgIG9iamVjdCB3aWxsIGNvbnRhaW4gcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgc28gYWxsIHJlZmVyZW5jZXMKLSAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgdG8gdGhpcyBzeW1ib2wgd2lsbCBnbyB0aHJvdWdoIHRoZSBnbG9iYWwKLSAgICAgb2Zmc2V0IHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpbGwgdXNlIHRoZSAuZHluc3ltIGVudHJ5IHRvCi0gICAgIGRldGVybWluZSB0aGUgYWRkcmVzcyBpdCBtdXN0IHB1dCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgc28KLSAgICAgYm90aCB0aGUgZHluYW1pYyBvYmplY3QgYW5kIHRoZSByZWd1bGFyIG9iamVjdCB3aWxsIHJlZmVyIHRvIHRoZQotICAgICBzYW1lIG1lbW9yeSBsb2NhdGlvbiBmb3IgdGhlIHZhcmlhYmxlLiAgKi8KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5ic3MiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAvKiBXZSBtdXN0IGdlbmVyYXRlIGEgUl9BUk1fQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlciB0bwotICAgICBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCi0gICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQotICAgICAucmVsLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0gICAgICBzcmVsLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKLSAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gICovCi0gIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IDMpCi0gICAgcG93ZXJfb2ZfdHdvID0gMzsKLQotICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KLSAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCi0JCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIHBvd2VyX29mX3R3bykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBhcyBiZWluZyBhdCB0aGlzIHBvaW50IGluIHRoZSBzZWN0aW9uLiAgKi8KLSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQotICAvKiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB0byBtYWtlIHJvb20gZm9yIHRoZSBzeW1ib2wuICAqLwotICBzLT5fcmF3X3NpemUgKz0gaC0+c2l6ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKiBvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci17Ci0gIGJmZCAqIGR5bm9iajsKLSAgYXNlY3Rpb24gKiBzOwotICBib29sZWFuIHBsdDsKLSAgYm9vbGVhbiByZWxvY3M7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGVudHJpZXMgaW4gdGhlIC5yZWwuZ290IHNlY3Rpb24uCi0gICAgICAgICBIb3dldmVyLCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZSBkeW5hbWljIHNlY3Rpb25zLCB3ZSB3aWxsCi0gICAgICAgICBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldCB0aGUgc2l6ZSBvZiAucmVsLmdvdCwKLSAgICAgICAgIHdoaWNoIHdpbGwgY2F1c2UgaXQgdG8gZ2V0IHN0cmlwcGVkIGZyb20gdGhlIG91dHB1dCBmaWxlCi0gICAgICAgICBiZWxvdy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIHNoYXJlZCBsaW5rLCB0aGVuIHdlIG5lZWQgdG8gZGlzY2FyZCBhbGwKLSAgICAgUEMgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QuCi0gICAgIFdlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlbSBpbiB0aGUgY2hlY2tfcmVsb2NzIHJvdXRpbmUsIGJ1dCB3ZQotICAgICB3aWxsIG5vdCBmaWxsIHRoZW0gaW4gaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQgJiYgaW5mby0+c3ltYm9saWMpCi0gICAgZWxmMzJfYXJtX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmMzJfYXJtX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgZWxmMzJfYXJtX2Rpc2NhcmRfY29waWVzLAotCQkJCSAgKFBUUikgTlVMTCk7Ci0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICBwbHQgPSBmYWxzZTsKLSAgcmVsb2NzID0gZmFsc2U7Ci0gIHJlbHRleHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICogbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RyaXA7Ci0KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICBzdHJpcCA9IGZhbHNlOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogU3RyaXAgdGhpcyBzZWN0aW9uIGlmIHdlIGRvbid0IG5lZWQgaXQ7IHNlZSB0aGUKLSAgICAgICAgICAgICAgICAgY29tbWVudCBiZWxvdy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGlzIGEgUExULiAgKi8KLQkgICAgICBwbHQgPSB0cnVlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWwiLCA0KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIG1vc3RseSB0byBoYW5kbGUgLnJlbC5ic3MgYW5kCi0JCSAucmVsLnBsdC4gIFdlIG11c3QgY3JlYXRlIGJvdGggc2VjdGlvbnMgaW4KLQkJIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIHRoZXkgbXVzdCBiZSBjcmVhdGVkCi0JCSBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dAotCQkgc2VjdGlvbnMuICBUaGUgbGlua2VyIGRvZXMgdGhhdCBiZWZvcmUKLQkJIGFkanVzdF9keW5hbWljX3N5bWJvbCBpcyBjYWxsZWQsIGFuZCBpdCBpcyB0aGF0Ci0JCSBmdW5jdGlvbiB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW55dGhpbmcgbmVlZHMgdG8gZ28KLQkJIGludG8gdGhlc2Ugc2VjdGlvbnMuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKiB0YXJnZXQ7Ci0KLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVsb2Mgc2VjdGlvbnMgb3RoZXIKLSAgICAgICAgICAgICAgICAgdGhhbiAucmVsLnBsdC4gICovCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWwucGx0IikgIT0gMCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0KLQkJICByZWxvY3MgPSB0cnVlOwotCi0JCSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotCQkgICAgIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwKLQkJICAgICBlbnRyeS4gIFRoZSBlbnRyaWVzIGluIHRoZSAucmVsLnBsdCBzZWN0aW9uCi0JCSAgICAgcmVhbGx5IGFwcGx5IHRvIHRoZSAuZ290IHNlY3Rpb24sIHdoaWNoIHdlCi0JCSAgICAgY3JlYXRlZCBvdXJzZWx2ZXMgYW5kIHNvIGtub3cgaXMgbm90IHJlYWRvbmx5LiAgKi8KLQkJICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCQkgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkJICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDQpOwotCQkgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICAgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICAgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJICAgIHJlbHRleHQgPSB0cnVlOwotCQl9Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5nb3QiLCA0KSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCXsKLQkgIGFzZWN0aW9uICoqIHNwcDsKLQotCSAgZm9yIChzcHAgPSAmcy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLT5zZWN0aW9uczsKLQkgICAgICAgKnNwcCAhPSBzLT5vdXRwdXRfc2VjdGlvbjsKLQkgICAgICAgc3BwID0gJigqc3BwKS0+bmV4dCkKLQkgICAgOwotCSAgKnNwcCA9IHMtPm91dHB1dF9zZWN0aW9uLT5uZXh0OwotCSAgLS1zLT5vdXRwdXRfc2VjdGlvbi0+b3duZXItPnNlY3Rpb25fY291bnQ7Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBlbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfREVCVUcsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocGx0KQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUwpCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWxvY3MpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUwsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxFTlQsCi0JCQkJCQlzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGVsZjMyX2FybV9saW5rX2hhc2hfdHJhdmVyc2UgaWYgd2UgYXJlCi0gICBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3Qgd2l0aCAtQnN5bWJvbGljLiAgSXQgZGlzY2FyZHMgdGhlIHNwYWNlCi0gICBhbGxvY2F0ZWQgdG8gY29weSBQQyByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIHdoaWNoIGFyZQotICAgZGVmaW5lZCBpbiByZWd1bGFyIG9iamVjdHMuICBXZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlCi0gICBjaGVja19yZWxvY3Mgcm91dGluZSwgYnV0IHdlIHdvbid0IGZpbGwgdGhlbSBpbiBpbiB0aGUKLSAgIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fZGlzY2FyZF9jb3BpZXMgKGgsIGlnbm9yZSkKLSAgICAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICBQVFIgaWdub3JlOwotewotICBzdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQgKiBzOwotCi0gIC8qIFdlIG9ubHkgZGlzY2FyZCByZWxvY3MgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSAgaWYgKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAocyA9IGgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgcy0+c2VjdGlvbi0+X3Jhd19zaXplIC09IHMtPmNvdW50ICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqIG91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogc3ltOwotewotICBiZmQgKiBkeW5vYmo7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICogc3BsdDsKLSAgICAgIGFzZWN0aW9uICogc2dvdDsKLSAgICAgIGFzZWN0aW9uICogc3JlbDsKLSAgICAgIGJmZF92bWEgcGx0X2luZGV4OwotICAgICAgYmZkX3ZtYSBnb3Rfb2Zmc2V0OwotICAgICAgRWxmX0ludGVybmFsX1JlbCByZWw7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBTZXQKLQkgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIEdldCB0aGUgaW5kZXggaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHdoaWNoCi0JIGNvcnJlc3BvbmRzIHRvIHRoaXMgc3ltYm9sLiAgVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhpcyBzeW1ib2wKLQkgaW4gYWxsIHRoZSBzeW1ib2xzIGZvciB3aGljaCB3ZSBhcmUgbWFraW5nIHBsdCBlbnRyaWVzLiAgVGhlCi0JIGZpcnN0IGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBpcyByZXNlcnZlZC4gICovCi0gICAgICBwbHRfaW5kZXggPSBoLT5wbHQub2Zmc2V0IC8gUExUX0VOVFJZX1NJWkUgLSAxOwotCi0gICAgICAvKiBHZXQgdGhlIG9mZnNldCBpbnRvIHRoZSAuZ290IHRhYmxlIG9mIHRoZSBlbnRyeSB0aGF0Ci0JIGNvcnJlc3BvbmRzIHRvIHRoaXMgZnVuY3Rpb24uICBFYWNoIC5nb3QgZW50cnkgaXMgNCBieXRlcy4KLQkgVGhlIGZpcnN0IHRocmVlIGFyZSByZXNlcnZlZC4gICovCi0gICAgICBnb3Rfb2Zmc2V0ID0gKHBsdF9pbmRleCArIDMpICogNDsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgIG1lbWNweSAoc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LAotICAgICAgICAgICAgICBlbGYzMl9hcm1fcGx0X2VudHJ5LAotCSAgICAgIFBMVF9FTlRSWV9TSVpFKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgZ290X29mZnNldCAKLQkJICAgICAgIC0gc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgLSBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICAtIGgtPnBsdC5vZmZzZXQgLSAxMiksCi0JCSAgICAgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDEyKTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIHNwbHQtPm91dHB1dF9vZmZzZXQpLAotCQkgIHNnb3QtPmNvbnRlbnRzICsgZ290X29mZnNldCk7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSAucmVsLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICArIGdvdF9vZmZzZXQpOwotICAgICAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fSlVNUF9TTE9UKTsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwKLQkJCQkoKEVsZjMyX0V4dGVybmFsX1JlbCAqKSBzcmVsLT5jb250ZW50cwotCQkJCSArIHBsdF9pbmRleCkpOwotCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGFzIGRlZmluZWQgaW4KLQkgICAgIHRoZSAucGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQl9Ci0gICAgfQotCi0gIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqIHNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqIHNyZWw7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0Ci0JIHVwLiAgKi8KLSAgICAgIAotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKLQotICAgICAgcmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBUaGUgZW50cnkgaW4KLQkgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBpbml0aWFsaXplZCBpbgotCSB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9BUk1fUkVMQVRJVkUpOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIGgtPmdvdC5vZmZzZXQpOwotCSAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fR0xPQl9EQVQpOwotCX0KLQotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmcmVsLAotCQkJCSgoRWxmMzJfRXh0ZXJuYWxfUmVsICopIHNyZWwtPmNvbnRlbnRzCi0JCQkJICsgc3JlbC0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrc3JlbC0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqIHM7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgbmVlZHMgYSBjb3B5IHJlbG9jLiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMQotCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkJCSAgICIucmVsLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgcmVsLnJfb2Zmc2V0ID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fQ09QWSk7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZyZWwsCi0JCQkJKChFbGYzMl9FeHRlcm5hbF9SZWwgKikgcy0+Y29udGVudHMKLQkJCQkgKyBzLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgLyogTWFyayBfRFlOQU1JQyBhbmQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGFzIGFic29sdXRlLiAgKi8KLSAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICogb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotewotICBiZmQgKiBkeW5vYmo7Ci0gIGFzZWN0aW9uICogc2dvdDsKLSAgYXNlY3Rpb24gKiBzZHluOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICogbmFtZTsKLQkgIGFzZWN0aW9uICogczsKLQotCSAgYmZkX2VsZjMyX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRHT1Q6Ci0JICAgICAgbmFtZSA9ICIuZ290IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOgotCSAgICAgIG5hbWUgPSAiLnJlbC5wbHQiOwotCSAgICBnZXRfdm1hOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUExUUkVMU1o6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlbC5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemU7Ci0JICAgICAgZWxzZQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUkVMU1o6Ci0JICAgICAgLyogTXkgcmVhZGluZyBvZiB0aGUgU1ZSNCBBQkkgaW5kaWNhdGVzIHRoYXQgdGhlCi0JCSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSByZWxvY3MgKERUX0pNUFJFTCkgc2hvdWxkIGJlCi0JCSBpbmNsdWRlZCBpbiB0aGUgb3ZlcmFsbCByZWxvY3MgKERUX1JFTCkuICBUaGlzIGlzCi0JCSB3aGF0IFNvbGFyaXMgZG9lcy4gIEhvd2V2ZXIsIFVuaXhXYXJlIGNhbiBub3QgaGFuZGxlCi0JCSB0aGF0IGNhc2UuICBUaGVyZWZvcmUsIHdlIG92ZXJyaWRlIHRoZSBEVF9SRUxTWiBlbnRyeQotCQkgaGVyZSB0byBtYWtlIGl0IG5vdCBpbmNsdWRlIHRoZSBKTVBSRUwgcmVsb2NzLiAgU2luY2UKLQkJIHRoZSBsaW5rZXIgc2NyaXB0IGFycmFuZ2VzIGZvciAucmVsLnBsdCB0byBmb2xsb3cgYWxsCi0JCSBvdGhlciByZWxvY2F0aW9uIHNlY3Rpb25zLCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5Ci0JCSBhYm91dCBjaGFuZ2luZyB0aGUgRFRfUkVMIGVudHJ5LiAgKi8KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsLnBsdCIpOwotCSAgICAgIGlmIChzICE9IE5VTEwpCi0JCXsKLQkJICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fY29va2VkX3NpemU7Ci0JCSAgZWxzZQotCQkgICAgZHluLmRfdW4uZF92YWwgLT0gcy0+X3Jhd19zaXplOwotCQl9Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogRmlsbCBpbiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPiAwKQotCW1lbWNweSAoc3BsdC0+Y29udGVudHMsIGVsZjMyX2FybV9wbHQwX2VudHJ5LCBQTFRfRU5UUllfU0laRSk7Ci0KLSAgICAgIC8qIFVuaXhXYXJlIHNldHMgdGhlIGVudHNpemUgb2YgLnBsdCB0byA0LCBhbHRob3VnaCB0aGF0IGRvZXNuJ3QKLQkgcmVhbGx5IHNlZW0gbGlrZSB0aGUgcmlnaHQgdmFsdWUuICAqLwotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLSAgICB9Ci0KLSAgLyogRmlsbCBpbiB0aGUgZmlyc3QgdGhyZWUgZW50cmllcyBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIGlmIChzZ290LT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIGlmIChzZHluID09IE5VTEwpCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNkeW4tPm91dHB1dF9vZmZzZXQsCi0JCSAgICBzZ290LT5jb250ZW50cyk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyA0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDgpOwotICAgIH0KLQotICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfYXJtCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNX0FSTQotI2RlZmluZSBFTEZfTUFYUEFHRV9TSVpFCQkweDgwMDAKLQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIAllbGYzMl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAJZWxmMzJfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwkJZWxmMzJfYXJtX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQllbGYzMl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgICAgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAJZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGJmZF9lbGYzMl9maW5kX25lYXJlc3RfbGluZQkgICAgICAgIGVsZjMyX2FybV9maW5kX25lYXJlc3RfbGluZQotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZSAgICAgICAgICAgICBlbGYzMl9hcm1fZ2V0X3N5bWJvbF90eXBlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vayAgICAgICAgICAgICAgICBlbGYzMl9hcm1fZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgICAgICAgICBlbGYzMl9hcm1fZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgICAgICAgICAgICAgICAgZWxmMzJfYXJtX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uICAgIAllbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wJZWxmMzJfYXJtX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwlfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wJZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucwllbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCWVsZjMyX2FybV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgMQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgICAgMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgICAgMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gICAgMAotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItZDEwdi5jIGIvYmZkL2VsZjMyLWQxMHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU4MGJhZS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItZDEwdi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM0ICswLDAgQEAKLS8qIEQxMFYtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFydGluIEh1bnQgKGh1bnRAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLS8qICNpbmNsdWRlICJlbGYvZDEwdi5oIiAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBkMTB2X2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci0KLQotLyogVXNlIFJFTCBpbnN0ZWFkIG9mIFJFTEEgdG8gc2F2ZSBzcGFjZSAqLwotI2RlZmluZSBVU0VfUkVMCi0KLWVudW0gcmVsb2NfdHlwZQotewotICBSX0QxMFZfTk9ORSA9IDAsCi0gIFJfRDEwVl8xMF9QQ1JFTF9SLAotICBSX0QxMFZfMTBfUENSRUxfTCwKLSAgUl9EMTBWXzE2LAotICBSX0QxMFZfMTgsCi0gIFJfRDEwVl8xOF9QQ1JFTCwKLSAgUl9EMTBWXzMyLAotICBSX0QxMFZfR05VX1ZUSU5IRVJJVCwKLSAgUl9EMTBWX0dOVV9WVEVOVFJZLAotICBSX0QxMFZfbWF4Ci19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfZDEwdl9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogVGhpcyByZWxvYyBkb2VzIG5vdGhpbmcuICAqLwotICBIT1dUTyAoUl9EMTBWX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDEwVl9OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBQQyBSZWxhdGl2ZSAxMC1iaXQgcmVsb2NhdGlvbiwgc2hpZnRlZCBieSAyICAqLwotICAvKiByaWdodCBjb250YWluZXIgKi8KLSAgSE9XVE8gKFJfRDEwVl8xMF9QQ1JFTF9SLAkvKiB0eXBlICovCi0JIDIsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTAsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDEwVl8xMF9QQ1JFTF9SIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJICAgICAgICAvKiBzcmNfbWFzayAqLwotCSAweGZmLCAgIAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gUEMgUmVsYXRpdmUgMTAtYml0IHJlbG9jYXRpb24sIHNoaWZ0ZWQgYnkgMiAgKi8KLSAgLyogbGVmdCBjb250YWluZXIgKi8KLSAgSE9XVE8gKFJfRDEwVl8xMF9QQ1JFTF9MLAkvKiB0eXBlICovCi0JIDIsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTAsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotCSAxNSwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QxMFZfMTBfUENSRUxfTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwN2Y4MDAwLAkJICAgICAgICAvKiBzcmNfbWFzayAqLwotCSAweDA3ZjgwMDAsICAgCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDE2IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0QxMFZfMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMTBWXzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIDE4IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIDIgKi8KLSAgSE9XVE8gKFJfRDEwVl8xOCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QxMFZfMTgiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAxOCBiaXQgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCBieSAyICAqLwotICBIT1dUTyAoUl9EMTBWXzE4X1BDUkVMLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDEwVl8xOF9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfRDEwVl8zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMTBWXzMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLSAgSE9XVE8gKFJfRDEwVl9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9EMTBWX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9EMTBWX0dOVV9WVEVOVFJZLCAgICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9EMTBWX0dOVV9WVEVOVFJZIiwgICAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAKLX07Ci0KLS8qIE1hcCBCRkQgcmVsb2MgdHlwZXMgdG8gRDEwViBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZDEwdl9yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLSBzdGF0aWMgY29uc3Qgc3RydWN0IGQxMHZfcmVsb2NfbWFwIGQxMHZfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX0QxMFZfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SLCBSX0QxMFZfMTBfUENSRUxfUiB9LAotICB7IEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0wsIFJfRDEwVl8xMF9QQ1JFTF9MIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX0QxMFZfMTYgfSwKLSAgeyBCRkRfUkVMT0NfRDEwVl8xOCwgUl9EMTBWXzE4IH0sCi0gIHsgQkZEX1JFTE9DX0QxMFZfMThfUENSRUwsIFJfRDEwVl8xOF9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9EMTBWXzMyIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX0QxMFZfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksIFJfRDEwVl9HTlVfVlRFTlRSWSB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgICBpIDwgc2l6ZW9mIChkMTB2X3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBkMTB2X3JlbG9jX21hcCk7Ci0gICAgICAgaSsrKQotICAgIHsKLSAgICAgIGlmIChkMTB2X3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZlbGZfZDEwdl9ob3d0b190YWJsZVtkMTB2X3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gRDEwViBFTEYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotZDEwdl9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9EMTBWX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2QxMHZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotc3RhdGljIGFzZWN0aW9uICoKLWVsZjMyX2QxMHZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgICBiZmQgKmFiZmQ7Ci0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9EMTBWX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYXNlIFJfRDEwVl9HTlVfVlRFTlRSWToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfZDEwdl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgLyogd2UgZG9uJ3QgdXNlIGdvdCBhbmQgcGx0IGVudHJpZXMgZm9yIGQxMHYgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4KLSAgIFNpbmNlIHdlIGRvbid0IGRvIC5nb3RzIG9yIC5wbHRzLCB3ZSBqdXN0IG5lZWQgdG8gY29uc2lkZXIgdGhlCi0gICB2aXJ0dWFsIHRhYmxlIHJlbG9jcyBmb3IgZ2MuICAqLwotIAotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2QxMHZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAKLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotICAgICAgICBoID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLSAKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICAgIHsKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9EMTBWX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX0QxMFZfR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsb2NhdGUgYSBEMTBWIEVMRiBzZWN0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9kMTB2X3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAocl90eXBlID09IFJfRDEwVl9HTlVfVlRFTlRSWQotICAgICAgICAgIHx8IHJfdHlwZSA9PSBSX0QxMFZfR05VX1ZUSU5IRVJJVCApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBob3d0byA9IGVsZl9kMTB2X2hvd3RvX3RhYmxlICsgcl90eXBlOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaCAhPSBOVUxMKQotCW5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICAgICAgZWxzZQotCXsKLQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCSAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCX0KLSAgICAgIAotICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBjb25zdCBjaGFyICogbXNnID0gKGNvbnN0IGNoYXIgKikgMDsKLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjb21tb25fZXJyb3I6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfZDEwdgotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX0NZR05VU19EMTBWCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgICAgYmZkX2VsZjMyX2QxMHZfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLWQxMHYiCi0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JICAgICAgICAgICAgIDAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCSAgICAgICAgICAgICBkMTB2X2luZm9fdG9faG93dG9fcmVsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCSAgICAgICAgICAgICAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgICAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vayAgICAgICAgICAgICBlbGYzMl9kMTB2X2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rICAgICAgICAgICAgZWxmMzJfZDEwdl9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgICAgICBlbGYzMl9kMTB2X2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uICAgICAgICAgZWxmMzJfZDEwdl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyAgICAgICAgICAxCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1kMzB2LmMgYi9iZmQvZWxmMzItZDMwdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjBlOWU5Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1kMzB2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDEgKzAsMCBAQAotLyogRDMwVi1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJ0aW4gSHVudCAoaHVudEBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBkMzB2X2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci1zdGF0aWMgdm9pZCBkMzB2X2luZm9fdG9faG93dG9fcmVsYQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYmZkX2VsZl9kMzB2X3JlbG9jIFBBUkFNUyAoKAotICAgICBiZmQgKmFiZmQsCi0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAotICAgICBhc3ltYm9sICpzeW1ib2wsCi0gICAgIFBUUiBkYXRhLAotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICAgYmZkICpvdXRwdXRfYmZkLAotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEgUEFSQU1TICgoCi0gICAgIGJmZCAqYWJmZCwKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnksCi0gICAgIGFzeW1ib2wgKnN5bWJvbCwKLSAgICAgUFRSIGRhdGEsCi0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotICAgICBiZmQgKm91dHB1dF9iZmQsCi0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlKSk7Ci0KLWVudW0gcmVsb2NfdHlwZQotewotICBSX0QzMFZfTk9ORSA9IDAsCi0gIFJfRDMwVl82LAotICBSX0QzMFZfOV9QQ1JFTCwKLSAgUl9EMzBWXzlfUENSRUxfUiwKLSAgUl9EMzBWXzE1LAotICBSX0QzMFZfMTVfUENSRUwsCi0gIFJfRDMwVl8xNV9QQ1JFTF9SLAotICBSX0QzMFZfMjEsCi0gIFJfRDMwVl8yMV9QQ1JFTCwKLSAgUl9EMzBWXzIxX1BDUkVMX1IsCi0gIFJfRDMwVl8zMiwKLSAgUl9EMzBWXzMyX1BDUkVMLAotICBSX0QzMFZfMzJfTk9STUFMLAotICBSX0QzMFZfbWF4Ci19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfZDMwdl9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogVGhpcyByZWxvYyBkb2VzIG5vdGhpbmcuICAqLwotICBIT1dUTyAoUl9EMzBWX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl9OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDYgYml0IGFic29sdXRlIHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfRDMwVl82LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl82IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2YsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDkgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzlfUENSRUwsCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9kMzB2X3JlbG9jXzIxLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfOV9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2YsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDkgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzlfUENSRUxfUiwJLyogdHlwZSAqLwotCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl85X1BDUkVMX1IiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2YsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gYWJzb2x1dGUgMTUgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzE1LAkJLyogdHlwZSAqLwotCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzE1IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMTUgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzE1X1BDUkVMLAkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8xNV9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMTUgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzE1X1BDUkVMX1IsCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvY18yMSwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzE1X1BDUkVMX1IiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBhYnNvbHV0ZSAyMSBiaXQgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCBieSAzICovCi0gIEhPV1RPIChSX0QzMFZfMjEsCQkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfMjEiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDIxIGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl8yMV9QQ1JFTCwJLyogdHlwZSAqLwotCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9kMzB2X3JlbG9jXzIxLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfMjFfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMjEgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMywgaW4gdGhlIFJpZ2h0IGNvbnRhaW5lciAqLwotICBIT1dUTyAoUl9EMzBWXzIxX1BDUkVMX1IsCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvY18yMSwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzIxX1BDUkVMX1IiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgRDMwViAzMiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9EMzBWXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9kMzB2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDMyIGJpdCByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0QzMFZfMzJfUENSRUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzMyX1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlZ3VsYXIgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfRDMwVl8zMl9OT1JNQUwsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8zMl9OT1JNQUwiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotfTsKLQotI2RlZmluZSBNSU4zMiAobG9uZyBsb25nKTB4ZmZmZmZmZmY4MDAwMDAwMExMCi0jZGVmaW5lIE1BWDMyIDB4N2ZmZmZmZmZMTAotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfZWxmX2QzMHZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBsb25nIGxvbmcgcmVsb2NhdGlvbjsKLSAgYmZkX3ZtYSBpbjEsIGluMiwgbnVtOwotICBiZmRfdm1hIHRtcF9hZGRyID0gMDsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0gIGFzZWN0aW9uICpyZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb247Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3ZtYSBvdXRwdXRfYmFzZSA9IDA7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotICBpbnQgbWFrZV9hYnNvbHV0ZSA9IDA7Ci0KLSAgciA9IGJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci0gIGlmIChyICE9IGJmZF9yZWxvY19jb250aW51ZSkKLSAgICByZXR1cm4gcjsgCi0KLSAgLyogYSBoYWNrZWQtdXAgdmVyc2lvbiBvZiBiZmRfcGVyZm9ybV9yZWxvYygpIGZvbGxvd3MgKi8KLSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwCi0gICAgICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICBmbGFnID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiByZWFsbHkgd2l0aGluIHRoZSBzZWN0aW9uPyAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCi0gICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KLQotICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24gPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUuICAqLwotICBpZiAob3V0cHV0X2JmZCkKLSAgICBvdXRwdXRfYmFzZSA9IDA7Ci0gIGVsc2UKLSAgICBvdXRwdXRfYmFzZSA9IHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIHJlbG9jYXRpb24gKz0gb3V0cHV0X2Jhc2UgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogQWRkIGluIHN1cHBsaWVkIGFkZGVuZC4gICovCi0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICAvKiBIZXJlIHRoZSB2YXJpYWJsZSByZWxvY2F0aW9uIGhvbGRzIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZQotICAgICBzeW1ib2wgd2UgYXJlIHJlbG9jYXRpbmcgYWdhaW5zdCwgcGx1cyBhbnkgYWRkZW5kLiAgKi8KLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0gICAgewotICAgICAgdG1wX2FkZHIgPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCAKLQkrIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICAgICAgcmVsb2NhdGlvbiAtPSB0bXBfYWRkcjsKLSAgICB9Ci0gIAotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYW5kIHdlIHdhbnQgdG8gYXBwbHkgdGhlIHJlbG9jYXRpb24KLQkgdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4gTW9kaWZ5IHRoZSByZWxvYwotCSBpbnBsYWNlIHRvIHJlZmxlY3Qgd2hhdCB3ZSBub3cga25vdy4gICovCi0gICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gZmxhZzsKLSAgICB9Ci0gIGVsc2UKLSAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gMDsKLSAgCi0gIGluMSA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGluMiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkciArIDQpOwotCi0gIC8qIGV4dHJhY3QgdGhlIGFkZGVuZCAqLwotICBudW0gPSAoKGluMiAmIDB4M0ZGRkYpCi0JIHwgKChpbjIgJiAweEZGMDAwMDApID4+IDIpCi0JIHwgKChpbjEgJiAweDNGKSA8PCAyNikpOwotICBpbjEgJj0gMHhGRkZGRkZDMDsKLSAgaW4yID0gMHg4MDAwMDAwMDsKLSAgCi0gIHJlbG9jYXRpb24gKz0gbnVtOwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSAmJiBob3d0by0+Yml0c2l6ZSA9PSAzMikKLSAgICB7Ci0gICAgICAvKiB0aGUgRDMwViBoYXMgYSBQQyB0aGF0IGRvZXNuJ3Qgd3JhcCBhbmQgUEMtcmVsYXRpdmUganVtcHMgKi8KLSAgICAgIC8qIGFyZSBzaWduZWQsIHNvIGEgUEMtcmVsYXRpdmUganVtcCBjYW4ndGJlIG1vcmUgdGhhbiArLy0gMl4zMSBieXJ0ZXMgKi8KLSAgICAgIC8qIGlmIG9uZSBleGNlZWRzIHRoaXMsIGNoYW5nZSBpdCB0byBhbiBhYnNvbHV0ZSBqdW1wICovCi0gICAgICBpZiAocmVsb2NhdGlvbiA+IE1BWDMyKQotCXsKLQkgIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiArIHRtcF9hZGRyKSAmIDB4ZmZmZmZmZmY7Ci0JICBtYWtlX2Fic29sdXRlID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChyZWxvY2F0aW9uIDwgTUlOMzIpCi0JewotCSAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uICsgdG1wX2FkZHIpICYgMHhmZmZmZmZmZjsKLQkgIG1ha2VfYWJzb2x1dGUgPSAxOwotCX0KLSAgICB9Ci0gIAotICBpbjEgfD0gKHJlbG9jYXRpb24gPj4gMjYpICYgMHgzRjsJLyogdG9wIDYgYml0cyAqLwotICBpbjIgfD0gKChyZWxvY2F0aW9uICYgMHgwM0ZDMDAwMCkgPDwgMik7ICAvKiBuZXh0IDggYml0cyAqLyAKLSAgaW4yIHw9IHJlbG9jYXRpb24gJiAweDAwMDNGRkZGOwkJLyogYm90dG9tIDE4IGJpdHMgKi8KLSAgCi0gIC8qIGNoYW5nZSBhIFBDLXJlbGF0aXZlIGluc3RydWN0aW9uIHRvIGl0cyBhYnNvbHV0ZSBlcXVpdmFsZW50ICovCi0gIC8qIHdpdGggdGhpcyBzaW1wbGUgaGFjayAqLwotICBpZiAobWFrZV9hYnNvbHV0ZSkKLSAgICBpbjEgfD0gMHgwMDEwMDAwMDsKLQotICBiZmRfcHV0XzMyIChhYmZkLCBpbjEsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGluMiwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyICsgNCk7Ci0gIAotICByZXR1cm4gZmxhZzsKLX0gICAKLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfZWxmX2QzMHZfcmVsb2NfMjEgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgaW4xLCBudW07Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLSAgaW50IG1hc2ssIG1heDsKLQotICByID0gYmZkX2VsZl9nZW5lcmljX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKLSAgaWYgKHIgIT0gYmZkX3JlbG9jX2NvbnRpbnVlKQotICAgIHJldHVybiByOyAKLQotICAvKiBhIGhhY2tlZC11cCB2ZXJzaW9uIG9mIGJmZF9wZXJmb3JtX3JlbG9jKCkgZm9sbG93cyAqLwotIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDAKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIGZsYWcgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIC8qIElzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uIHJlYWxseSB3aXRoaW4gdGhlIHNlY3Rpb24/ICAqLwotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotCi0gIC8qIEdldCBzeW1ib2wgdmFsdWUuICAoQ29tbW9uIHN5bWJvbHMgYXJlIHNwZWNpYWwuKSAgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbiA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgLyogQ29udmVydCBpbnB1dC1zZWN0aW9uLXJlbGF0aXZlIHN5bWJvbCB2YWx1ZSB0byBhYnNvbHV0ZS4gICovCi0gIGlmIChvdXRwdXRfYmZkKQotICAgIG91dHB1dF9iYXNlID0gMDsKLSAgZWxzZQotICAgIG91dHB1dF9iYXNlID0gcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgcmVsb2NhdGlvbiArPSBvdXRwdXRfYmFzZSArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAvKiBBZGQgaW4gc3VwcGxpZWQgYWRkZW5kLiAgKi8KLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIC8qIEhlcmUgdGhlIHZhcmlhYmxlIHJlbG9jYXRpb24gaG9sZHMgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlCi0gICAgIHN5bWJvbCB3ZSBhcmUgcmVsb2NhdGluZyBhZ2FpbnN0LCBwbHVzIGFueSBhZGRlbmQuICAqLwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQgPT0gdHJ1ZSkKLQlyZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYW5kIHdlIHdhbnQgdG8gYXBwbHkgdGhlIHJlbG9jYXRpb24KLQkgdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4gTW9kaWZ5IHRoZSByZWxvYwotCSBpbnBsYWNlIHRvIHJlZmxlY3Qgd2hhdCB3ZSBub3cga25vdy4gICovCi0gICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gZmxhZzsKLSAgICB9Ci0gIGVsc2UKLSAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gMDsKLSAgCi0gIGluMSA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0KLSAgbWFzayA9ICAoMSA8PCBob3d0by0+Yml0c2l6ZSkgLSAxOwotICBpZiAoaG93dG8tPmJpdHNpemUgPT0gNikKLSAgICBtYXNrIDw8PSAxMjsKLSAgbWF4ID0gKDEgPDwgKGhvd3RvLT5iaXRzaXplICsgMikpIC0gMTsKLQotICAvKiBleHRyYWN0IHRoZSBhZGRlbmQgKi8KLSAgbnVtID0gaW4xICYgbWFzazsgIC8qIDE4IGJpdHMgKi8KLSAgaWYgKGhvd3RvLT5iaXRzaXplID09IDYpCi0gICAgbnVtID4+PSAxMjsKLSAgbnVtIDw8PSAzOyAvKiBzaGlmdCBsZWZ0IDMgKi8KLSAgaW4xICY9IH5tYXNrOyAgLyogbWFzayBvdXQgYWRkZW5kICovCi0KLSAgcmVsb2NhdGlvbiArPSBudW07Ci0gIGlmIChob3d0by0+dHlwZSA9PSBSX0QzMFZfMjFfUENSRUxfUiB8fCBob3d0by0+dHlwZSA9PSBSX0QzMFZfMTVfUENSRUxfUiB8fAotICAgICAgaG93dG8tPnR5cGUgPT0gUl9EMzBWXzlfUENSRUxfUiApCi0gICAgewotICAgICAgcmVsb2NhdGlvbiArPSA0OwotICAgIH0KLQotICBpZiAoKGludClyZWxvY2F0aW9uIDwgMCApCi0gICAgewotICAgICAgaWYgKH4oaW50KXJlbG9jYXRpb24gPiBtYXgpCi0JZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKGludClyZWxvY2F0aW9uID4gbWF4KQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgfQotICByZWxvY2F0aW9uID4+PSAzOyAKLSAgaWYgKGhvd3RvLT5iaXRzaXplID09IDYpCi0gICAgaW4xIHw9ICgocmVsb2NhdGlvbiAmIChtYXNrID4+IDEyKSkgPDwgMTIpOwotICBlbHNlCi0gICAgaW4xIHw9IHJlbG9jYXRpb24gJiBtYXNrOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGluMSwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgCi0gIHJldHVybiBmbGFnOwotfSAgIAotCi0vKiBNYXAgQkZEIHJlbG9jIHR5cGVzIHRvIEQzMFYgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IGQzMHZfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZDMwdl9yZWxvY19tYXAgZDMwdl9yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfRDMwVl9OT05FLCB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzYsIFJfRDMwVl82IH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTCwgUl9EMzBWXzlfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl85X1BDUkVMX1IsIFJfRDMwVl85X1BDUkVMX1IgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8xNSwgUl9EMzBWXzE1IH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMTVfUENSRUwsIFJfRDMwVl8xNV9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMX1IsIFJfRDMwVl8xNV9QQ1JFTF9SIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMjEsIFJfRDMwVl8yMSB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMLCBSX0QzMFZfMjFfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SLCBSX0QzMFZfMjFfUENSRUxfUiB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzMyLCBSX0QzMFZfMzIgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8zMl9QQ1JFTCwgUl9EMzBWXzMyX1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX0QzMFZfMzJfTk9STUFMIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKGQzMHZfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGQzMHZfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKGQzMHZfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9kMzB2X2hvd3RvX3RhYmxlW2QzMHZfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBEMzBWIEVMRiByZWxvYyAodHlwZSBSRUwpLiAgKi8KLQotc3RhdGljIHZvaWQKLWQzMHZfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfRDMwVl9tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9kMzB2X2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gRDMwViBFTEYgcmVsb2MgKHR5cGUgUkVMQSkuICAqLwotCi1zdGF0aWMgdm9pZAotZDMwdl9pbmZvX3RvX2hvd3RvX3JlbGEgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0QzMFZfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfZDMwdl9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9kMzB2Ci0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX0QzMFYKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICBiZmRfZWxmMzJfZDMwdl92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItZDMwdiIKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwlkMzB2X2luZm9fdG9faG93dG9fcmVsYQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJZDMwdl9pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcJMAotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItZnIzMC5jIGIvYmZkL2VsZjMyLWZyMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4NzI1Zi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItZnIzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsODExICswLDAgQEAKLS8qIEZSMzAtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRi4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9mcjMwLmgiCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZnIzMF9lbGZfaTIwX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmcjMwX2VsZl9pMzJfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqIGZyMzBfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgZnIzMF9pbmZvX3RvX2hvd3RvX3JlbGEgCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZnIzMF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBmcjMwX2VsZl9nY19zd2VlcF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKiBmcjMwX2VsZl9nY19tYXJrX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBmcjMwX2VsZl9ob3d0b190YWJsZSBbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gOCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0ZSMzBfOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA0LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfOCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MGZmMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjAgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzIwLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZnIzMF9lbGZfaTIwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfMjAiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMGYwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IGludG8gNDggYml0cyBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF80OCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGZyMzBfZWxmX2kzMl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzQ4IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDYgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzZfSU5fNCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA0LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfNl9JTl80IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZjAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEFuIDggYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzhfSU5fOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA0LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfOF9JTl84IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDBmZjAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEEgOSBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0ZSMzBfOV9JTl84LAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDQsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRlIzMF85X0lOXzgiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MGZmMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogQSAxMCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0ZSMzBfMTBfSU5fOCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA0LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfMTBfSU5fOCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwZmYwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBQQyByZWxhdGl2ZSA5IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDEuICAqLwotICBIT1dUTyAoUl9GUjMwXzlfUENSRUwsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDksCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfOV9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgUEMgcmVsYXRpdmUgMTIgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMS4gICovCi0gIEhPV1RPIChSX0ZSMzBfMTJfUENSRUwsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzEyX1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX0ZSMzBfR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfRlIzMF9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfRlIzMF9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfRlIzMF9HTlVfVlRFTlRSWSIsICAgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gCi19OwotDAotLyogVXRpbGl0eSB0byBhY3R1YWxseSBwZXJmb3JtIGFuIFJfRlIzMF8yMCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWZyMzBfZWxmX2kyMF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqICAgICAgYWJmZDsKLSAgICAgYXJlbGVudCAqICByZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqICBzeW1ib2w7Ci0gICAgIFBUUiAgICAgICAgZGF0YTsKLSAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKiAgICAgIG91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiogICAgZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSAgICAgICByZWxvY2F0aW9uOwotICB1bnNpZ25lZCBsb25nIHg7Ci0gIAotICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICAvKiBGSVhNRTogU2VlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBJcyB0aGlzIHJpZ2h0PyAgKi8KLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gIHJlbG9jYXRpb24gPQotICAgIHN5bWJvbC0+dmFsdWUKLSAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotICAgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0gICAgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGlmIChyZWxvY2F0aW9uID4gKCgxVSA8PCAyMCkgLSAxKSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHggPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICB4ID0gKHggJiAweGZmMGYwMDAwKSB8IChyZWxvY2F0aW9uICYgMHgwMDAwZmZmZikgfCAoKHJlbG9jYXRpb24gJiAweDAwMGYwMDAwKSA8PCA0KTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0MCi0vKiBVdGlsaXR5IHRvIGFjdHVhbGx5IHBlcmZvcm0gYSBSX0ZSMzBfNDggcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1mcjMwX2VsZl9pMzJfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiAgICAgIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiAgcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiAgc3ltYm9sOwotICAgICBQVFIgICAgICAgIGRhdGE7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICogICAgICBvdXRwdXRfYmZkOwotICAgICBjaGFyICoqICAgIGVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgICAgICAgcmVsb2NhdGlvbjsKLQotICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICAvKiBGSVhNRTogU2VlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBJcyB0aGlzIHJpZ2h0PyAgKi8KLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gIHJlbG9jYXRpb24gPQotICAgIHN5bWJvbC0+dmFsdWUKLSAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotICAgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0gICAgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHJlbG9jYXRpb24sIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyArIDIpOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0MCi0vKiBNYXAgQkZEIHJlbG9jIHR5cGVzIHRvIEZSMzAgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IGZyMzBfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBpbnQgZnIzMF9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZyMzBfcmVsb2NfbWFwIGZyMzBfcmVsb2NfbWFwIFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgICAgICAgICAgIFJfRlIzMF9OT05FIH0sCi0gIHsgQkZEX1JFTE9DXzgsICAgICAgICAgICAgICBSX0ZSMzBfOCB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzIwLCAgICAgICAgUl9GUjMwXzIwIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCAgICAgICAgICAgICBSX0ZSMzBfMzIgfSwKLSAgeyBCRkRfUkVMT0NfRlIzMF80OCwgICAgICAgIFJfRlIzMF80OCB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzZfSU5fNCwgICAgUl9GUjMwXzZfSU5fNCB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzhfSU5fOCwgICAgUl9GUjMwXzhfSU5fOCB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzlfSU5fOCwgICAgUl9GUjMwXzlfSU5fOCB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzEwX0lOXzgsICAgUl9GUjMwXzEwX0lOXzggfSwKLSAgeyBCRkRfUkVMT0NfRlIzMF85X1BDUkVMLCAgIFJfRlIzMF85X1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfMTJfUENSRUwsICBSX0ZSMzBfMTJfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfRlIzMF9HTlVfVlRJTkhFUklUIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgICBSX0ZSMzBfR05VX1ZURU5UUlkgfSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWZyMzBfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSBzaXplb2YgKGZyMzBfcmVsb2NfbWFwKSAvIHNpemVvZiAoZnIzMF9yZWxvY19tYXBbMF0pOwotICAgICAgIC0taTspCi0gICAgaWYgKGZyMzBfcmVsb2NfbWFwIFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0gICAgICByZXR1cm4gJiBmcjMwX2VsZl9ob3d0b190YWJsZSBbZnIzMF9yZWxvY19tYXBbaV0uZnIzMF9yZWxvY192YWxdOwotICAKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gRlIzMCBFTEYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotZnIzMF9pbmZvX3RvX2hvd3RvX3JlbGEgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKiBhYmZkOwotICAgICBhcmVsZW50ICogY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICogZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0ZSMzBfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICYgZnIzMF9lbGZfaG93dG9fdGFibGUgW3JfdHlwZV07Ci19Ci0MCi0vKiBQZXJmb3JtIGEgc2luZ2xlIHJlbG9jYXRpb24uICBCeSBkZWZhdWx0IHdlIHVzZSB0aGUgc3RhbmRhcmQgQkZECi0gICByb3V0aW5lcywgYnV0IGEgZmV3IHJlbG9jcywgd2UgaGF2ZSB0byBkbyB0aGVtIG91cnNlbHZlcy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbCwgcmVsb2NhdGlvbikKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqICBob3d0bzsKLSAgICAgYmZkICogICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICBjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKiByZWw7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgcmVsb2NhdGlvbjsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHIgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF92bWEgICAgICAgICAgICAgICB4OwotICBiZmRfc2lnbmVkX3ZtYQlzcmVsOwotICAKLSAgc3dpdGNoIChob3d0by0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0ZSMzBfMjA6Ci0gICAgICBjb250ZW50cyAgICs9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7Ci0KLSAgICAgIGlmIChyZWxvY2F0aW9uID4gKCgxIDw8IDIwKSAtIDEpKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLSAgICAgIHggPSAoeCAmIDB4ZmYwZjAwMDApIHwgKHJlbG9jYXRpb24gJiAweDAwMDBmZmZmKSB8ICgocmVsb2NhdGlvbiAmIDB4MDAwZjAwMDApIDw8IDQpOwotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9GUjMwXzQ4OgotICAgICAgY29udGVudHMgICArPSByZWwtPnJfb2Zmc2V0ICsgMjsKLSAgICAgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfRlIzMF85X1BDUkVMOgotICAgICAgY29udGVudHMgICArPSByZWwtPnJfb2Zmc2V0ICsgMTsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb247Ci0gICAgICBzcmVsICs9IHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBzcmVsIC09IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsIC09IDI7ICAvKiBCcmFuY2ggaW5zdHJ1Y3Rpb25zIGFkZCAyIHRvIHRoZSBQQy4uLiAqLwotICAgICAgc3JlbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSAgICAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICAKLSAgICAgIGlmIChzcmVsICYgMSkKLQlyZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gICAgICBpZiAoc3JlbCA+ICgoMSA8PCA4KSAtIDEpIHx8IChzcmVsIDwgLSAoMSA8PCA4KSkpCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHNyZWwgPj4gMSwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfRlIzMF8xMl9QQ1JFTDoKLSAgICAgIGNvbnRlbnRzICAgKz0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb247Ci0gICAgICBzcmVsICs9IHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBzcmVsIC09IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsIC09IDI7IC8qIEJyYW5jaCBpbnN0cnVjdGlvbnMgYWRkIDIgdG8gdGhlIFBDLi4uICovCi0gICAgICBzcmVsIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQkJICAgICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIAotICAgICAgaWYgKHNyZWwgJiAxKQotCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICAgIGlmIChzcmVsID4gKCgxIDw8IDExKSAtIDEpIHx8IChzcmVsIDwgLSAoMSA8PCAxMSkpKQotCSAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMpOwotICAgICAgeCA9ICh4ICYgMHhmODAwKSB8ICgoc3JlbCA+PiAxKSAmIDB4N2ZmKTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJICAgIHJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQpOwotICAgIH0KLQotICByZXR1cm4gcjsKLX0KLQotDAotLyogUmVsb2NhdGUgYW4gRlIzMCBFTEYgc2VjdGlvbi4KLSAgIFRoZXJlIGlzIHNvbWUgYXR0ZW1wdCB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdXNhYmxlIGZvciBtYW55IGFyY2hpdGVjdHVyZXMsCi0gICBib3RoIFVTRV9SRUwgYW5kIFVTRV9SRUxBIFsndHdvdWxkIGJlIG5pY2UgaWYgc3VjaCBhIGNyaXR0ZXIgZXhpc3RlZF0sCi0gICBpZiBvbmx5IHRvIHNlcnZlIGFzIGEgbGVhcm5pbmcgdG9vbC4KLQotICAgVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBuZXcgRUxGIGJhY2tlbmQgbGlua2VyCi0gICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCi0gICB6ZXJvLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3RpbmcgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKLSAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZQotICAgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzIG5lY2Vzc2FyeS4KLQotICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgdGhlIHJlbG9jCi0gICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLSAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCi0KLSAgIExPQ0FMX1NFQ1RJT05TIGlzIGFuIGFycmF5IGdpdmluZyB0aGUgc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZQotICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCi0KLSAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAotICAgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgotCi0gICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQotICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKLSAgIGdvaW5nIHRvIGJlIHRoZSBzZWN0aW9uIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQKLSAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCi0gICBhY2NvcmRpbmdseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1mcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgaW5mbzsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqICAgICAgICAgICAgICBjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICBsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKiAgICAgICAgICAgICBsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKiAgICAgICAgICAgc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiogc3ltX2hhc2hlczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICYgZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIHJlbGVuZCAgICAgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLQotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwgKyspCi0gICAgewotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICBob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgcl9zeW1uZHg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bTsKLSAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgc2VjOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICByOwotICAgICAgY29uc3QgY2hhciAqICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTDsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgcl90eXBlOwotICAgICAgCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIAotICAgICAgaWYgKCAgIHJfdHlwZSA9PSBSX0ZSMzBfR05VX1ZUSU5IRVJJVAotCSAgfHwgcl90eXBlID09IFJfRlIzMF9HTlVfVlRFTlRSWSkKLQljb250aW51ZTsKLSAgICAgIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0gICAgICAgICAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotICAgICAgICAgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotICAgICAgICAgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIAotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zIFtyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBob3d0byAgPSBmcjMwX2VsZl9ob3d0b190YWJsZSArIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaCAgICAgID0gTlVMTDsKLSAgICAgIHN5bSAgICA9IE5VTEw7Ci0gICAgICBzZWMgICAgPSBOVUxMOwotICAgICAgCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zIFtyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JICAKLQkgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JICAgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSk7Ci0JICBuYW1lID0gKG5hbWUgPT0gTlVMTCkgPyBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYykgOiBuYW1lOwotI2lmIDAKLQkgIGZwcmludGYgKHN0ZGVyciwgImxvY2FsOiBzZWM6ICVzLCBzeW06ICVzICglZCksIHZhbHVlOiAleCArICV4ICsgJXggYWRkZW5kICV4XG4iLAotCQkgICBzZWMtPm5hbWUsIG5hbWUsIHN5bS0+c3RfbmFtZSwKLQkJICAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hLCBzZWMtPm91dHB1dF9vZmZzZXQsCi0JCSAgIHN5bS0+c3RfdmFsdWUsIHJlbC0+cl9hZGRlbmQpOwotI2VuZGlmCi0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzIFtyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgCi0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQotCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLSNpZiAwCi0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgImRlZmluZWQ6IHNlYzogJXMsIG5hbWU6ICVzLCB2YWx1ZTogJXggKyAleCArICV4IGdpdmVzOiAleFxuIiwKLQkJICAgICAgIHNlYy0+bmFtZSwgbmFtZSwgaC0+cm9vdC51LmRlZi52YWx1ZSwKLQkJICAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSwgc2VjLT5vdXRwdXRfb2Zmc2V0LCByZWxvY2F0aW9uKTsKLSNlbmRpZgotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHsKLSNpZiAwCi0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAidW5kZWZpbmVkOiBzZWM6ICVzLCBuYW1lOiAlc1xuIiwKLQkJICAgICAgIHNlYy0+bmFtZSwgbmFtZSk7Ci0jZW5kaWYKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotI2lmIDAKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJ1bmtub3duOiBuYW1lOiAlc1xuIiwgbmFtZSk7Ci0jZW5kaWYKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLSAgICAgIAotICAgICAgciA9IGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgIGNvbnRlbnRzLCByZWwsIHJlbG9jYXRpb24pOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgY29uc3QgY2hhciAqIG1zZyA9IChjb25zdCBjaGFyICopIE5VTEw7Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICByID0gaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdwotCQkoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIHIgPSBpbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wKLQkJKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIHJlbG9jYXRpb24iKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG1zZykKLQkgICAgciA9IGluZm8tPmNhbGxiYWNrcy0+d2FybmluZwotCSAgICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCk7Ci0KLQkgIGlmICghIHIpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLWZyMzBfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICAgICBpbmZvOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgIHJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfRlIzMF9HTlVfVlRJTkhFUklUOgotCWNhc2UgUl9GUjMwX0dOVV9WVEVOVFJZOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0JewotCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWZyMzBfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgaW5mbzsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICBzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogcmVsb2NzOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0gCi1zdGF0aWMgYm9vbGVhbgotZnIzMF9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAKLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotICAgICAgICBoID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLSAKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICAgIHsKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9GUjMwX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX0ZSMzBfR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotIAotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2ZyMzAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfRlIzMAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgICAgIGJmZF9lbGYzMl9mcjMwX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1mcjMwIgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJCU5VTEwKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCQlmcjMwX2luZm9fdG9faG93dG9fcmVsYQotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCQlmcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawkJZnIzMF9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJCWZyMzBfZWxmX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzICAgICAgICAgICAgICAgIGZyMzBfZWxmX2NoZWNrX3JlbG9jcwotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwkJMQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCWZyMzBfcmVsb2NfdHlwZV9sb29rdXAKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWdlbi5jIGIvYmZkL2VsZjMyLWdlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGQzY2FjLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1nZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qIEdlbmVyaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMsIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotLyogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFueSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLCBidXQgc2hvdWxkIGJlCi0gICBnb29kIGVub3VnaCBmb3IgR0RCIG9yIG9iamR1bXAgdG8gcmVhZCB0aGUgZmlsZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGR1bW15ID0KLSAgSE9XVE8gKDAsCQkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiVU5LTk9XTiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmVsZl9yZWxvYzsKLXsKLSAgYmZkX3JlbG9jLT5ob3d0byA9ICZkdW1teTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZWxmX3JlbG9jOwotewotICBiZmRfcmVsb2MtPmhvd3RvID0gJmR1bW15OwotfQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQliZmRfZWxmMzJfbGl0dGxlX2dlbmVyaWNfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJImVsZjMyLWxpdHRsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCQliZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJlbGYzMi1iaWciCi0jZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfdW5rbm93bgotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQlFTV9OT05FCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCWVsZl9nZW5lcmljX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQllbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvX3JlbAotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaHBwYS5jIGIvYmZkL2VsZjMyLWhwcGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkN2Y2Ny4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItaHBwYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk4OCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhQIFBBLVJJU0MgRUxGIGZpbGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieQotCi0JQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlCi0JRGVwYXJ0bWVudCBvZiBDb21wdXRlciBTY2llbmNlCi0JVW5pdmVyc2l0eSBvZiBVdGFoCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLS8qIFRoZSBpbnRlcm5hbCB0eXBlIG9mIGEgc3ltYm9sIHRhYmxlIGV4dGVuc2lvbiBlbnRyeS4gICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgc3ltZXh0X2VudHJ5UzsKLQotLyogVGhlIGV4dGVybmFsIHR5cGUgb2YgYSBzeW1ib2wgdGFibGUgZXh0ZW5zaW9uIGVudHJ5LiAgKi8KLSNkZWZpbmUgRUxGMzJfUEFSSVNDX1NYX1NJWkUgKDQpCi0jZGVmaW5lIEVMRjMyX1BBUklTQ19TWF9HRVQoYmZkLCBhZGRyKSBiZmRfaF9nZXRfMzIgKChiZmQpLCAoYWRkcikpCi0jZGVmaW5lIEVMRjMyX1BBUklTQ19TWF9QVVQoYmZkLCB2YWwsIGFkZHIpIFwKLSAgYmZkX2hfcHV0XzMyICgoYmZkKSwgKHZhbCksIChhZGRyKSkKLQotLyogSFBQQSBzeW1ib2wgdGFibGUgZXh0ZW5zaW9uIGVudHJ5IHR5cGVzICovCi1lbnVtIGVsZjMyX2hwcGFfc3ltZXh0bl90eXBlcwotewotICBQQVJJU0NfU1hUX05VTEwsCi0gIFBBUklTQ19TWFRfU1lNTkRYLAotICBQQVJJU0NfU1hUX0FSR19SRUxPQywKLX07Ci0KLS8qIFRoZXNlIG1hY3JvcyBjb21wb3NlIGFuZCBkZWNvbXBvc2UgdGhlIHZhbHVlIG9mIGEgc3ltZXh0biBlbnRyeToKLQotICAgZW50cnlfdHlwZSA9IEVMRjMyX1BBUklTQ19TWF9UWVBFKHdvcmQpOwotICAgZW50cnlfdmFsdWUgPSBFTEYzMl9QQVJJU0NfU1hfVkFMKHdvcmQpOwotICAgd29yZCA9IEVMRjMyX1BBUklTQ19TWF9XT1JEKHR5cGUsdmFsKTsgICovCi0KLSNkZWZpbmUgRUxGMzJfUEFSSVNDX1NYX1RZUEUocCkJCSgocCkgPj4gMjQpCi0jZGVmaW5lIEVMRjMyX1BBUklTQ19TWF9WQUwocCkJCSgocCkgJiAweEZGRkZGRikKLSNkZWZpbmUgRUxGMzJfUEFSSVNDX1NYX1dPUkQodHlwZSx2YWwpCSgoKHR5cGUpIDw8IDI0KSArICh2YWwgJiAweEZGRkZGRikpCi0KLS8qIFRoZSBmb2xsb3dpbmcgd2FzIGFkZGVkIGZhY2lsaXRhdGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIC5ocHBhX3N5bWV4dG4KLSAgIHNlY3Rpb24uICBUaGlzIHNlY3Rpb24gaXMgYnVpbHQgYWZ0ZXIgdGhlIHN5bWJvbCB0YWJsZSBpcyBidWlsdCBpbiB0aGUKLSAgIGVsZl93cml0ZV9vYmplY3RfY29udGVudHMgcm91dGluZSAoY2FsbGVkIGZyb20gYmZkX2Nsb3NlKS4gIEl0IGlzIGJ1aWx0Ci0gICBzbyBsYXRlIGJlY2F1c2UgaXQgcmVxdWlyZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBub3Qga25vd24gdW50aWwKLSAgIHRoZSBzeW1ib2wgYW5kIHN0cmluZyB0YWJsZSBzZWN0aW9ucyBoYXZlIGJlZW4gYWxsb2NhdGVkLCBhbmQKLSAgIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4gYnVpbHQuICovCi0KLSNkZWZpbmUgU1lNRVhUTl9TRUNUSU9OX05BTUUgIi5QQVJJU0Muc3ltZXh0IgotCi1zdHJ1Y3Qgc3ltZXh0X2NoYWluCi0gIHsKLSAgICBzeW1leHRfZW50cnlTIGVudHJ5OwotICAgIHN0cnVjdCBzeW1leHRfY2hhaW4gKm5leHQ7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IHN5bWV4dF9jaGFpbiBzeW1leHRfY2hhaW5TOwotCi0vKiBXZSB1c2UgdGhyZWUgZGlmZmVyZW50IGhhc2ggdGFibGVzIHRvIGhvbGQgaW5mb3JtYXRpb24gZm9yCi0gICBsaW5raW5nIFBBIEVMRiBvYmplY3RzLgotCi0gICBUaGUgZmlyc3QgaXMgdGhlIGVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlIHdoaWNoIGlzIGRlcml2ZWQKLSAgIGZyb20gdGhlIHN0YW5kYXJkIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gIFdlIHVzZSB0aGlzIGFzIGEgcGxhY2UgdG8KLSAgIGF0dGFjaCBvdGhlciBoYXNoIHRhYmxlcyBhbmQgc3RhdGljIGluZm9ybWF0aW9uLgotCi0gICBUaGUgc2Vjb25kIGlzIHRoZSBzdHViIGhhc2ggdGFibGUgd2hpY2ggaXMgZGVyaXZlZCBmcm9tIHRoZQotICAgYmFzZSBCRkQgaGFzaCB0YWJsZS4gIFRoZSBzdHViIGhhc2ggdGFibGUgaG9sZHMgdGhlIGluZm9ybWF0aW9uCi0gICBuZWNlc3NhcnkgdG8gYnVpbGQgdGhlIGxpbmtlciBzdHVicyBkdXJpbmcgYSBsaW5rLgotCi0gICBUaGUgbGFzdCBoYXNoIHRhYmxlIGtlZXBzIHRyYWNrIG9mIGFyZ3VtZW50IGxvY2F0aW9uIGluZm9ybWF0aW9uIG5lZWRlZAotICAgdG8gYnVpbGQgaGFzaCB0YWJsZXMuICBFYWNoIGZ1bmN0aW9uIHdpdGggbm9uemVybyBhcmd1bWVudCBsb2NhdGlvbgotICAgYml0cyB3aWxsIGhhdmUgYW4gZW50cnkgaW4gdGhpcyB0YWJsZS4gICovCi0KLS8qIEhhc2ggdGFibGUgZm9yIGxpbmtlciBzdHVicy4gICovCi0KLXN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeQotewotICAvKiBCYXNlIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLCB3ZSBjYW4gZ2V0IHRoZSBuYW1lIG9mIHRoZSBzdHViCi0gICAgIChhbmQgdGh1cyBrbm93IGV4YWN0bHkgd2hhdCBhY3Rpb25zIGl0IHBlcmZvcm1zKSBmcm9tIHRoZSBiYXNlCi0gICAgIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBPZmZzZXQgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGlzIHN0dWIuICAqLwotICBiZmRfdm1hIG9mZnNldDsKLQotICAvKiBHaXZlbiB0aGUgc3ltYm9sJ3MgdmFsdWUgYW5kIGl0cyBzZWN0aW9uIHdlIGNhbiBkZXRlcm1pbmUgaXRzIGZpbmFsCi0gICAgIHZhbHVlIHdoZW4gYnVpbGRpbmcgdGhlIHN0dWJzIChzbyB0aGUgc3R1YiBrbm93cyB3aGVyZSB0byBqdW1wLiAgKi8KLSAgc3ltdmFsdWUgdGFyZ2V0X3ZhbHVlOwotICBhc2VjdGlvbiAqdGFyZ2V0X3NlY3Rpb247Ci19OwotCi1zdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIGhhc2ggdGFibGUgaXRzZWxmLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogVGhlIHN0dWIgQkZELiAgKi8KLSAgYmZkICpzdHViX2JmZDsKLQotICAvKiBXaGVyZSB0byBwbGFjZSB0aGUgbmV4dCBzdHViLiAgKi8KLSAgYmZkX2J5dGUgKmxvY2F0aW9uOwotCi0gIC8qIEN1cnJlbnQgb2Zmc2V0IGluIHRoZSBzdHViIHNlY3Rpb24uICAqLwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotCi19OwotCi0vKiBIYXNoIHRhYmxlIGZvciBhcmd1bWVudCBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBlbGYzMl9ocHBhX2FyZ3NfaGFzaF9lbnRyeQotewotICAvKiBCYXNlIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogVGhlIGFyZ3VtZW50IGxvY2F0aW9uIGJpdHMgZm9yIHRoaXMgZW50cnkuICAqLwotICBpbnQgYXJnX2JpdHM7Ci19OwotCi1zdHJ1Y3QgZWxmMzJfaHBwYV9hcmdzX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIGhhc2ggdGFibGUgaXRzZWxmLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi1zdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLX07Ci0KLXN0cnVjdCBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZQotewotICAvKiBUaGUgbWFpbiBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBUaGUgc3R1YiBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICpzdHViX2hhc2hfdGFibGU7Ci0KLSAgLyogVGhlIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IGVsZjMyX2hwcGFfYXJnc19oYXNoX3RhYmxlICphcmdzX2hhc2hfdGFibGU7Ci0KLSAgLyogQSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIG91dHB1dCBzeW1ib2xzLiAgKi8KLSAgdW5zaWduZWQgaW50IG91dHB1dF9zeW1ib2xfY291bnQ7Ci0KLSAgLyogU3R1ZmYgc28gd2UgY2FuIGhhbmRsZSBEUCByZWxhdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gIGxvbmcgZ2xvYmFsX3ZhbHVlOwotICBpbnQgZ2xvYmFsX3N5bV9kZWZpbmVkOwotfTsKLQotLyogRklYTUUuICAqLwotI2RlZmluZSBBUkdVTUVOVFMJMAotI2RlZmluZSBSRVRVUk5fVkFMVUUJMQotCi0vKiBUaGUgdmFyaW91cyBhcmd1bWVudCByZWxvY2F0aW9ucyB0aGF0IG1heSBiZSBwZXJmb3JtZWQuICAqLwotdHlwZWRlZiBlbnVtCi17Ci0gIC8qIE5vIHJlbG9jYXRpb24uICAqLwotICBOTywKLSAgLyogUmVsb2NhdGUgMzIgYml0cyBmcm9tIEdSIHRvIEZQIHJlZ2lzdGVyLiAgKi8KLSAgR0YsCi0gIC8qIFJlbG9jYXRlIDY0IGJpdHMgZnJvbSBhIEdSIHBhaXIgdG8gRlAgcGFpci4gICovCi0gIEdELAotICAvKiBSZWxvY2F0ZSAzMiBiaXRzIGZyb20gRlAgdG8gR1IuICAqLwotICBGRywKLSAgLyogUmVsb2NhdGUgNjQgYml0cyBmcm9tIEZQIHBhaXIgdG8gR1IgcGFpci4gICovCi0gIERHLAotfSBhcmdfcmVsb2NfdHlwZTsKLQotLyogV2hhdCBpcyBiZWluZyByZWxvY2F0ZWQgKGVnIHdoaWNoIGFyZ3VtZW50IG9yIHRoZSByZXR1cm4gdmFsdWUpLiAgKi8KLXR5cGVkZWYgZW51bQotewotICBBUkcwLCBBUkcxLCBBUkcyLCBBUkczLCBSRVQsCi19IGFyZ19yZWxvY19sb2NhdGlvbjsKLQotCi0vKiBFTEYzMi9IUFBBIHJlbG9jYXRpb24gc3VwcG9ydAotCi0JVGhpcyBmaWxlIGNvbnRhaW5zIEVMRjMyL0hQUEEgcmVsb2NhdGlvbiBzdXBwb3J0IGFzIHNwZWNpZmllZAotCWluIHRoZSBTdHJhdHVzIEZUWC9Hb2xmIE9iamVjdCBGaWxlIEZvcm1hdCAoU0VELTE3NjIpIGRhdGVkCi0JRmVicnVhcnkgMTk5NC4gICovCi0KLSNpbmNsdWRlICJlbGYzMi1ocHBhLmgiCi0jaW5jbHVkZSAiaHBwYV9zdHVicy5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGhwcGFfZWxmX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBocHBhX2VsZl9yZWxvY2F0ZV9pbnNuCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBsb25nLAotCSAgIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBocHBhX2VsZl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkKiwgY2hhciAqKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqIGVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmMzJfaHBwYV9zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi1zdGF0aWMgdm9pZCBlbGYzMl9ocHBhX2luZm9fdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgZWxmX3N5bWJvbF90eXBlICosIHVuc2lnbmVkIGludCkpOwotCi1zdGF0aWMgdm9pZCBlbGYzMl9ocHBhX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgdm9pZCBlbGYzMl9ocHBhX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotCi1zdGF0aWMgdm9pZCBhZGRfZW50cnlfdG9fc3ltZXh0X2NoYWluCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgc3ltZXh0X2NoYWluUyAqKiwKLQkgICBzeW1leHRfY2hhaW5TICoqKSk7Ci0KLXN0YXRpYyB2b2lkCi1lbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzeW1leHRfY2hhaW5TICopKTsKLQotc3RhdGljIGJvb2xlYW4gaHBwYV9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjMyX2hwcGFfYWRkX3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosCi0JICAgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkICosIGFzZWN0aW9uICosCi0JICAgYmZkX2J5dGUgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwgYmZkX3ZtYSwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBhc2VjdGlvbiAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZjMyX2hwcGFfc3R1Yl9oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGYzMl9ocHBhX2FyZ3NfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIGJmZF9ieXRlICosIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCSAgICAgICBjb25zdCBjaGFyICopKSkpOwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9idWlsZF9vbmVfc3R1YiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9ocHBhX3JlYWRfc3ltZXh0X2luZm8KLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIHN0cnVjdCBlbGYzMl9ocHBhX2FyZ3NfaGFzaF90YWJsZSAqLAotCSAgIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGVsZjMyX2hwcGFfc2l6ZV9vZl9zdHViCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBiZmRfdm1hLCBiZmRfdm1hLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmMzJfaHBwYV9hcmdfcmVsb2NfbmVlZGVkCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBhcmdfcmVsb2NfdHlwZSBbXSkpOwotCi1zdGF0aWMgdm9pZCBlbGYzMl9ocHBhX25hbWVfb2Zfc3R1YgotICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgYmZkX3ZtYSwgY2hhciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjMyX2hwcGFfc2l6ZV9zeW1leHQgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGYzMl9ocHBhX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKSk7Ci0KLS8qIEVMRi9QQSByZWxvY2F0aW9uIGhvd3RvIGVudHJpZXMuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfaHBwYV9ob3d0b190YWJsZVtFTEZfSE9XVE9fVEFCTEVfU0laRV0gPQotewotICB7Ul9QQVJJU0NfTk9ORSwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX05PTkUifSwKLSAgLyogVGhlIHZhbHVlcyBpbiBESVIzMiBhcmUgdG8gcGxhY2F0ZSB0aGUgY2hlY2sgaW4KLSAgICAgX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUuICAqLwotICB7Ul9QQVJJU0NfRElSMzIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfRElSMzIiLCBmYWxzZSwgMCwgMHhmZmZmZmZmZiwgZmFsc2V9LAotICB7Ul9QQVJJU0NfRElSMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0RJUjIxTCJ9LAotICB7Ul9QQVJJU0NfRElSMTdSLCAwLCAwLCAxNywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0RJUjE3UiJ9LAotICB7Ul9QQVJJU0NfRElSMTdGLCAwLCAwLCAxNywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0RJUjE3RiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0RJUjE0UiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19ESVIxNFIifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfUENSRUwyMUwsIDAsIDAsIDIxLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDIxTCJ9LAotICB7Ul9QQVJJU0NfUENSRUwxN1IsIDAsIDAsIDE3LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE3UiJ9LAotICB7Ul9QQVJJU0NfUENSRUwxN0YsIDAsIDAsIDE3LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE3RiJ9LAotICB7Ul9QQVJJU0NfUENSRUwxN0MsIDAsIDAsIDE3LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE3QyJ9LAotICB7Ul9QQVJJU0NfUENSRUwxNFIsIDAsIDAsIDE0LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE0UiJ9LAotICB7Ul9QQVJJU0NfUENSRUwxNEYsIDAsIDAsIDE0LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE0RiJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0RQUkVMMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0RQUkVMMjFMIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19EUFJFTDE0UiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19EUFJFTDE0UiJ9LAotICB7Ul9QQVJJU0NfRFBSRUwxNEYsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfRFBSRUwxNEYifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19ETFRSRUwyMUwsIDAsIDAsIDIxLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfRExUUkVMMjFMIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19ETFRSRUwxNFIsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfRExUUkVMMTRSIn0sCi0gIHtSX1BBUklTQ19ETFRSRUwxNEYsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfRExUUkVMMTRGIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfRExUSU5EMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0RMVElORDIxTCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfRExUSU5EMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0RMVElORDE0UiJ9LAotICB7Ul9QQVJJU0NfRExUSU5EMTRGLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0RMVElORDE0RiJ9LAotCi0gIHtSX1BBUklTQ19TRVRCQVNFLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfU0VUQkFTRSJ9LAotICB7Ul9QQVJJU0NfQkFTRVJFTDMyLCAwLCAwLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0JBU0VSRUwzMiJ9LAotICB7Ul9QQVJJU0NfQkFTRVJFTDIxTCwgMCwgMCwgMjEsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19CQVNFUkVMMjFMIn0sCi0gIHtSX1BBUklTQ19CQVNFUkVMMTdSLCAwLCAwLCAxNywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0JBU0VSRUwxN1IifSwKLSAge1JfUEFSSVNDX0JBU0VSRUwxN0YsIDAsIDAsIDE3LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfQkFTRVJFTDE3RiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0JBU0VSRUwxNFIsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfQkFTRVJFTDE0UiJ9LAotICB7Ul9QQVJJU0NfQkFTRVJFTDE0RiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19CQVNFUkVMMTRGIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19URVhUUkVMMzIsIDAsIDAsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVEVYVFJFTDMyIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19EQVRBUkVMMzIsIDAsIDAsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19QTEFCRUwzMiwgMCwgMCwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19QTEFCRUwzMiJ9LAotICB7Ul9QQVJJU0NfUExBQkVMMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1BMQUJFTDIxTCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfUExBQkVMMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1BMQUJFTDE0UiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19QTFRJTkQyMUwsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19QTFRJTkQyMUwifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1BMVElORDE0UiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1BMVElORDE0UiJ9LAotICB7Ul9QQVJJU0NfUExUSU5EMTRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfUExUSU5EMTRGIn0sCi0KLQotICB7Ul9QQVJJU0NfQ09QWSwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0NPUFkifSwKLSAge1JfUEFSSVNDX0dMT0JfREFULCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfR0xPQl9EQVQifSwKLSAge1JfUEFSSVNDX0pNUF9TTE9ULCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfSk1QX1NMT1QifSwKLSAge1JfUEFSSVNDX1JFTEFUSVZFLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfUkVMQVRJVkUifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi19OwotCi0vKiBXaGVyZSAod2hhdCByZWdpc3RlciB0eXBlKSBpcyBhbiBhcmd1bWVudCBjb21taW5nIGZyb20/ICAqLwotdHlwZWRlZiBlbnVtCi17Ci0gIEFSX05PLAotICBBUl9HUiwKLSAgQVJfRlIsCi0gIEFSX0ZVLAotICBBUl9GUERCTDEsCi0gIEFSX0ZQREJMMiwKLX0gYXJnX2xvY2F0aW9uOwotCi0vKiBIb3Jpem9udGFsIHJlcHJlc2VudHMgdGhlIGNhbGxlZSdzIGFyZ3VtZW50IGxvY2F0aW9uIGluZm9ybWF0aW9uLAotICAgdmVydGljYWwgcmVwcmVzZW50cyBjYWxsZXIncyBhcmd1bWVudCBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gIFZhbHVlIGF0IGEKLSAgIHBhcnRpY3VsYXIgWCxZIGxvY2F0aW9uIHJlcHJlc2VudHMgd2hhdCAoaWYgYW55KSBhcmd1bWVudCByZWxvY2F0aW9uCi0gICBuZWVkcyB0byBiZSBwZXJmb3JtZWQgdG8gbWFrZSBjYWxsZXIgYW5kIGNhbGxlZSBhZ3JlZS4gICovCi0KLXN0YXRpYyBDT05TVCBhcmdfcmVsb2NfdHlwZSBhcmdfbWlzbWF0Y2hlc1s2XVs2XSA9Ci17Ci0gIHtOTywgTk8sIE5PLCBOTywgTk8sIE5PfSwKLSAge05PLCBOTywgR0YsIE5PLCBHRCwgTk99LAotICB7Tk8sIEZHLCBOTywgTk8sIE5PLCBOT30sCi0gIHtOTywgTk8sIE5PLCBOTywgTk8sIE5PfSwKLSAge05PLCBERywgTk8sIE5PLCBOTywgTk99LAotICB7Tk8sIERHLCBOTywgTk8sIE5PLCBOT30sCi19OwotCi0vKiBMaWtld2lzZSwgYnV0IHJldmVyc2VkIGZvciB0aGUgcmV0dXJuIHZhbHVlLiAgKi8KLXN0YXRpYyBDT05TVCBhcmdfcmVsb2NfdHlwZSByZXRfbWlzbWF0Y2hlc1s2XVs2XSA9Ci17Ci0gIHtOTywgTk8sIE5PLCBOTywgTk8sIE5PfSwKLSAge05PLCBOTywgRkcsIE5PLCBERywgTk99LAotICB7Tk8sIEdGLCBOTywgTk8sIE5PLCBOT30sCi0gIHtOTywgTk8sIE5PLCBOTywgTk8sIE5PfSwKLSAge05PLCBHRCwgTk8sIE5PLCBOTywgTk99LAotICB7Tk8sIEdELCBOTywgTk8sIE5PLCBOT30sCi19OwotCi0vKiBNaXNjIHN0YXRpYyBjcnVkIGZvciBzeW1ib2wgZXh0ZW5zaW9uIHJlY29yZHMuICAqLwotc3RhdGljIHN5bWV4dF9jaGFpblMgKnN5bWV4dF9yb290UDsKLXN0YXRpYyBzeW1leHRfY2hhaW5TICpzeW1leHRfbGFzdFA7Ci1zdGF0aWMgYmZkX3NpemVfdHlwZSBzeW1leHRfY2hhaW5fc2l6ZTsKLQotLyogRklYTUU6IFdlIHNob3VsZCBiZSBhYmxlIHRvIHRyeSB0aGlzIHN0YXRpYyB2YXJpYWJsZSEgICovCi1zdGF0aWMgYmZkX2J5dGUgKnN5bWV4dG5fY29udGVudHM7Ci0KLQotLyogRm9yIGxpbmtlciBzdHViIGhhc2ggdGFibGVzLiAgKi8KLSNkZWZpbmUgZWxmMzJfaHBwYV9zdHViX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLSNkZWZpbmUgZWxmMzJfaHBwYV9zdHViX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pIFwKLSAgKGJmZF9oYXNoX3RyYXZlcnNlIFwKLSAgICgmKHRhYmxlKS0+cm9vdCwgXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwgXAotICAgIChpbmZvKSkpCi0KLS8qIEZvciBsaW5rZXIgYXJncyBoYXNoIHRhYmxlcy4gICovCi0jZGVmaW5lIGVsZjMyX2hwcGFfYXJnc19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3QgZWxmMzJfaHBwYV9hcmdzX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0jZGVmaW5lIGVsZjMyX2hwcGFfYXJnc19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKSBcCi0gIChiZmRfaGFzaF90cmF2ZXJzZSBcCi0gICAoJih0YWJsZSktPnJvb3QsIFwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksIFwKLSAgICAoaW5mbykpKQotCi0jZGVmaW5lIGVsZjMyX2hwcGFfYXJnc19oYXNoX3RhYmxlX2luaXQodGFibGUsIG5ld2Z1bmMpIFwKLSAgKGJmZF9oYXNoX3RhYmxlX2luaXQgXAotICAgKCYodGFibGUpLT5yb290LCBcCi0gICAgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBcCi0JCQkJCSBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgXAotCQkJCQkgY29uc3QgY2hhciAqKSkpIChuZXdmdW5jKSkpCi0KLS8qIEZvciBIUFBBIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBlbGYzMl9ocHBhX2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpXAotICAoKHN0cnVjdCBlbGYzMl9ocHBhX2xpbmtfaGFzaF9lbnRyeSAqKQkJCQlcCi0gICBlbGZfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwJCVwKLQkJCSAoY29weSksIChmb2xsb3cpKSkKLQotI2RlZmluZSBlbGYzMl9ocHBhX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCVwKLSAgKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgUEEgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBlbGYzMl9ocHBhX2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotCi0vKiBFeHRyYWN0IHNwZWNpZmljIGFyZ3VtZW50IGxvY2F0aW9uIGJpdHMgZm9yIFdISUNIIGZyb20KLSAgIHRoZSBmdWxsIGFyZ3VtZW50IGxvY2F0aW9uIGluIEFSLiAgKi8KLSNkZWZpbmUgRVhUUkFDVF9BUkJJVFMoYXIsIHdoaWNoKSAoKGFyKSA+PiAoOCAtICgod2hpY2gpICogMikpKSAmIDMKLQotLyogQXNzb3J0ZWQgaGFzaCB0YWJsZSBmdW5jdGlvbnMuICAqLwotCi0vKiBJbml0aWFsaXplIGFuIGVudHJ5IGluIHRoZSBzdHViIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZjMyX2hwcGFfc3R1Yl9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqcmV0OwotCi0gIHJldCA9IChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+b2Zmc2V0ID0gMDsKLSAgICAgIHJldC0+dGFyZ2V0X3ZhbHVlID0gMDsKLSAgICAgIHJldC0+dGFyZ2V0X3NlY3Rpb24gPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBzdHViIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIHN0dWJfYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBiZmQgKnN0dWJfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICB0YWJsZS0+b2Zmc2V0ID0gMDsKLSAgdGFibGUtPmxvY2F0aW9uID0gMDsKLSAgdGFibGUtPnN0dWJfYmZkID0gc3R1Yl9iZmQ7Ci0gIHJldHVybiAoYmZkX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT5yb290LCBuZXdmdW5jKSk7Ci19Ci0KLS8qIEluaXRpYWxpemUgYW4gZW50cnkgaW4gdGhlIGFyZ3VtZW50IGxvY2F0aW9uIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZjMyX2hwcGFfYXJnc19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX2FyZ3NfaGFzaF9lbnRyeSAqcmV0OwotCi0gIHJldCA9IChzdHJ1Y3QgZWxmMzJfaHBwYV9hcmdzX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlbGYzMl9ocHBhX2FyZ3NfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZjMyX2hwcGFfYXJnc19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBlbGYzMl9ocHBhX2FyZ3NfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCi0gIGlmIChyZXQpCi0gICAgcmV0LT5hcmdfYml0cyA9IDA7Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgdGhlIGRlcml2ZWQgbGlua2VyIGhhc2ggdGFibGUuICBUaGUgUEEgRUxGIHBvcnQgdXNlcyB0aGUgZGVyaXZlZAotICAgaGFzaCB0YWJsZSB0byBrZWVwIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBQQSBFTEYgbGlua2VyICh3aXRob3V0Ci0gICB1c2luZyBzdGF0aWMgdmFyaWFibGVzKS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1lbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBpZiAoIV9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmV0LT5zdHViX2hhc2hfdGFibGUgPSBOVUxMOwotICByZXQtPmFyZ3NfaGFzaF90YWJsZSA9IE5VTEw7Ci0gIHJldC0+b3V0cHV0X3N5bWJvbF9jb3VudCA9IDA7Ci0gIHJldC0+Z2xvYmFsX3ZhbHVlID0gMDsKLSAgcmV0LT5nbG9iYWxfc3ltX2RlZmluZWQgPSAwOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIFJlbG9jYXRlIHRoZSBnaXZlbiBJTlNOIGdpdmVuIHRoZSB2YXJpb3VzIGlucHV0IHBhcmFtZXRlcnMuCi0KLSAgIEZJWE1FOiBlbmRpYW5uZXNzIGFuZCBzaXplb2YgKGxvbmcpIGlzc3VlcyBhYm91bmQgaGVyZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1ocHBhX2VsZl9yZWxvY2F0ZV9pbnNuIChhYmZkLCBpbnB1dF9zZWN0LCBpbnNuLCBhZGRyZXNzLCBzeW1fdmFsdWUsCi0JCQlyX2FkZGVuZCwgcl9mb3JtYXQsIHJfZmllbGQsIHBjcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0OwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLSAgICAgbG9uZyBzeW1fdmFsdWU7Ci0gICAgIGxvbmcgcl9hZGRlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcl9mb3JtYXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcl9maWVsZDsKLSAgICAgdW5zaWduZWQgbG9uZyBwY3JlbDsKLXsKLSAgdW5zaWduZWQgY2hhciBvcGNvZGUgPSBnZXRfb3Bjb2RlIChpbnNuKTsKLSAgbG9uZyBjb25zdGFudF92YWx1ZTsKLQotICBzd2l0Y2ggKG9wY29kZSkKLSAgICB7Ci0gICAgY2FzZSBMRE86Ci0gICAgY2FzZSBMREI6Ci0gICAgY2FzZSBMREg6Ci0gICAgY2FzZSBMRFc6Ci0gICAgY2FzZSBMRFdNOgotICAgIGNhc2UgU1RCOgotICAgIGNhc2UgU1RIOgotICAgIGNhc2UgU1RXOgotICAgIGNhc2UgU1RXTToKLSAgICBjYXNlIENPTUlDTFI6Ci0gICAgY2FzZSBTVUJJOgotICAgIGNhc2UgQURESVQ6Ci0gICAgY2FzZSBBRERJOgotICAgIGNhc2UgTERJTDoKLSAgICBjYXNlIEFERElMOgotICAgICAgY29uc3RhbnRfdmFsdWUgPSBIUFBBX1JfQ09OU1RBTlQgKHJfYWRkZW5kKTsKLQotICAgICAgaWYgKHBjcmVsKQotCXN5bV92YWx1ZSAtPSBhZGRyZXNzOwotCi0gICAgICBzeW1fdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCBjb25zdGFudF92YWx1ZSwgcl9maWVsZCk7Ci0gICAgICByZXR1cm4gaHBwYV9yZWJ1aWxkX2luc24gKGFiZmQsIGluc24sIHN5bV92YWx1ZSwgcl9mb3JtYXQpOwotCi0gICAgY2FzZSBCTDoKLSAgICBjYXNlIEJFOgotICAgIGNhc2UgQkxFOgotICAgICAgLyogWFhYIGNvbXB1dGluZyBjb25zdGFudF92YWx1ZSBpcyBub3QgbmVlZGVkPz8/ICovCi0gICAgICBjb25zdGFudF92YWx1ZSA9IGFzc2VtYmxlXzE3ICgoaW5zbiAmIDB4MDAxZjAwMDApID4+IDE2LAotCQkJCSAgICAoaW5zbiAmIDB4MDAwMDFmZmMpID4+IDIsCi0JCQkJICAgIGluc24gJiAxKTsKLQotICAgICAgY29uc3RhbnRfdmFsdWUgPSAoY29uc3RhbnRfdmFsdWUgPDwgMTUpID4+IDE1OwotICAgICAgaWYgKHBjcmVsKQotCXsKLQkgIHN5bV92YWx1ZSAtPQotCSAgICBhZGRyZXNzICsgaW5wdXRfc2VjdC0+b3V0cHV0X29mZnNldAotCSAgICArIGlucHV0X3NlY3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICBzeW1fdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCAtOCwgcl9maWVsZCk7Ci0JfQotICAgICAgZWxzZQotCXN5bV92YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0IChzeW1fdmFsdWUsIGNvbnN0YW50X3ZhbHVlLCByX2ZpZWxkKTsKLQotICAgICAgcmV0dXJuIGhwcGFfcmVidWlsZF9pbnNuIChhYmZkLCBpbnNuLCBzeW1fdmFsdWUgPj4gMiwgcl9mb3JtYXQpOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChvcGNvZGUgPT0gMCkKLQl7Ci0JICBjb25zdGFudF92YWx1ZSA9IEhQUEFfUl9DT05TVEFOVCAocl9hZGRlbmQpOwotCi0JICBpZiAocGNyZWwpCi0JICAgIHN5bV92YWx1ZSAtPSBhZGRyZXNzOwotCi0JICByZXR1cm4gaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgY29uc3RhbnRfdmFsdWUsIHJfZmllbGQpOwotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIEhQUEEgRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSX1BBUklTQ19VTklNUExFTUVOVEVEKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gZWxmX2hwcGFfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzeW1fc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc3ltX3NlYy0+b3V0cHV0X29mZnNldDsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc3ltX3NlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHN5bV9zZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTgotCQkJICAgPyAwIDogc3ltLT5zdF92YWx1ZSkKLQkJCSArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQKLQkJCSArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb25nIGluZHg7Ci0KLQkgIGluZHggPSByX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaW5keF07Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHN5bV9zZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGggIT0gTlVMTCkKLQlzeW1fbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBlbHNlCi0JewotCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgICBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJICAgICAgc3ltLT5zdF9uYW1lKTsKLQkgIGlmIChzeW1fbmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoKnN5bV9uYW1lID09ICdcMCcpCi0JICAgIHN5bV9uYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzeW1fc2VjKTsKLQl9Ci0KLSAgICAgIC8qIElmIGFyZ3NfaGFzaF90YWJsZSBpcyBOVUxMLCB0aGVuIHdlIGhhdmUgZW5jb3VudGVyZWQgc29tZQotCSBraW5kIG9mIGxpbmsgZXJyb3IgKGV4LiB1bmRlZmluZWQgc3ltYm9scykuICBEbyBub3QgdHJ5IHRvCi0JIGFwcGx5IGFueSByZWxvY2F0aW9ucywgY29udGludWUgdGhlIGxvb3Agc28gd2UgY2FuIG5vdGlmeQotCSB0aGUgdXNlciBvZiBzZXZlcmFsIGVycm9ycyBpbiBhIHNpbmdsZSBhdHRlbXB0ZWQgbGluay4gICovCi0gICAgICBpZiAoZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+YXJnc19oYXNoX3RhYmxlID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIHIgPSBlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCQkgICAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQkJICAgICAgcmVsLT5yX29mZnNldCwgcmVsb2NhdGlvbiwKLQkJCQkJICAgICAgcmVsLT5yX2FkZGVuZCwgaW5mbywgc3ltX3NlYywKLQkJCQkJICAgICAgc3ltX25hbWUsIGggPT0gTlVMTCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgLyogVGhpcyBjYW4gaGFwcGVuIGZvciBEUCByZWxhdGl2ZSByZWxvY3MgaWYgJGdsb2JhbCQgaXMKLQkgICAgICAgdW5kZWZpbmVkLiAgVGhpcyBpcyBhIHBhbmljIHNpdHVhdGlvbiBzbyB3ZSBkb24ndCB0cnkKLQkgICAgICAgdG8gY29udGludWUuICAqLwotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgIChpbmZvLCAiJGdsb2JhbCQiLCBpbnB1dF9iZmQsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgewotCQkvKiBXZSB1c2UgdGhpcyByZXR1cm4gdmFsdWUgdG8gaW5kaWNhdGUgdGhhdCB3ZSBwZXJmb3JtZWQKLQkJICAgYSAiZGFuZ2Vyb3VzIiByZWxvY2F0aW9uLiAgVGhpcyBkb2Vzbid0IG1lYW4gd2UgZGlkCi0JCSAgIHRoZSB3cm9uZyB0aGluZywgaXQganVzdCBtZWFucyB0aGVyZSBtYXkgYmUgc29tZSBjbGVhbnVwCi0JCSAgIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBoZXJlLgotCi0JCSAgIEluIHBhcnRpY3VsYXIgd2UgaGFkIHRvIHN3YXAgdGhlIGxhc3QgY2FsbCBpbnNuIGFuZCBpdHMKLQkJICAgZGVsYXkgc2xvdC4gIElmIHRoZSBkZWxheSBzbG90IGluc24gbmVlZGVkIGEgcmVsb2NhdGlvbiwKLQkJICAgdGhlbiB3ZSdsbCBuZWVkIHRvIGFkanVzdCB0aGUgbmV4dCByZWxvY2F0aW9uIGVudHJ5J3MKLQkJICAgb2Zmc2V0IHRvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgdGhlIGluc24gbW92ZWQuCi0KLQkJICAgVGhpcyBoYWlyIHdvdWxkbid0IGJlIG5lY2Vzc2FyeSBpZiB3ZSBpbnNlcnRlZCBzdHVicwotCQkgICBiZXR3ZWVuIHByb2NlZHVyZXMgYW5kIHVzZWQgYSAiYmwiIHRvIGdldCB0byB0aGUgc3R1Yi4gICovCi0JCWlmIChyZWwgIT0gcmVsZW5kKQotCQkgIHsKLQkJICAgIEVsZl9JbnRlcm5hbF9SZWxhICpuZXh0X3JlbCA9IHJlbCArIDE7Ci0KLQkJICAgIGlmIChyZWwtPnJfb2Zmc2V0ICsgNCA9PSBuZXh0X3JlbC0+cl9vZmZzZXQpCi0JCSAgICAgIG5leHRfcmVsLT5yX29mZnNldCAtPSA0OwotCQkgIH0KLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAgKGluZm8sIHN5bV9uYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIG9uZSAob3IgbW9yZSkgQkZEIHJlbG9jYXRpb25zIHdoaWNoIGltcGxlbWVudCB0aGUgYmFzZQotICAgcmVsb2NhdGlvbiB3aXRoIG1vZGlmaWNhdGlvbnMgYmFzZWQgb24gZm9ybWF0IGFuZCBmaWVsZC4gICovCi0KLWVsZjMyX2hwcGFfcmVsb2NfdHlwZSAqKgotaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUgKGFiZmQsIGJhc2VfdHlwZSwgZm9ybWF0LCBmaWVsZCwgaWdub3JlLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZWxmMzJfaHBwYV9yZWxvY190eXBlIGJhc2VfdHlwZTsKLSAgICAgaW50IGZvcm1hdDsKLSAgICAgaW50IGZpZWxkOwotICAgICBpbnQgaWdub3JlOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIGVsZjMyX2hwcGFfcmVsb2NfdHlwZSAqZmluYWx0eXBlOwotICBlbGYzMl9ocHBhX3JlbG9jX3R5cGUgKipmaW5hbF90eXBlczsKLQotICAvKiBBbGxvY2F0ZSBzbG90cyBmb3IgdGhlIEJGRCByZWxvY2F0aW9uLiAgKi8KLSAgZmluYWxfdHlwZXMgPSAoKGVsZjMyX2hwcGFfcmVsb2NfdHlwZSAqKikKLQkJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChlbGYzMl9ocHBhX3JlbG9jX3R5cGUgKikgKiAyKSk7Ci0gIGlmIChmaW5hbF90eXBlcyA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcmVsb2NhdGlvbiBpdHNlbGYuICAqLwotICBmaW5hbHR5cGUgPSAoKGVsZjMyX2hwcGFfcmVsb2NfdHlwZSAqKQotCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoZWxmMzJfaHBwYV9yZWxvY190eXBlKSkpOwotICBpZiAoZmluYWx0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogU29tZSByZWFzb25hYmxlIGRlZmF1bHRzLiAgKi8KLSAgZmluYWxfdHlwZXNbMF0gPSBmaW5hbHR5cGU7Ci0gIGZpbmFsX3R5cGVzWzFdID0gTlVMTDsKLQotI2RlZmluZSBmaW5hbF90eXBlIGZpbmFsdHlwZVswXQotCi0gIGZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0KLSAgLyogSnVzdCBhIHRhbmdsZSBvZiBuZXN0ZWQgc3dpdGNoIHN0YXRlbWVudHMgdG8gZGVhbCB3aXRoIHRoZSBicmFpbmRhbWFnZQotICAgICB0aGF0IGEgZGlmZmVyZW50IGZpZWxkIHNlbGVjdG9yIG1lYW5zIGEgY29tcGxldGVseSBkaWZmZXJlbnQgcmVsb2NhdGlvbgotICAgICBmb3IgUEEgRUxGLiAgKi8KLSAgc3dpdGNoIChiYXNlX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9IUFBBOgotICAgIGNhc2UgUl9IUFBBX0FCU19DQUxMOgotICAgICAgc3dpdGNoIChmb3JtYXQpCi0JewotCWNhc2UgMTQ6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9yc2VsOgotCSAgICBjYXNlIGVfcnJzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RJUjE0UjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX3J0c2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ETFRSRUwxNFI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV90c2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ETFRSRUwxNEY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9ycHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUExBQkVMMTRSOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgMTc6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9mc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ESVIxN0Y7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9yc2VsOgotCSAgICBjYXNlIGVfcnJzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RJUjE3UjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDIxOgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfbHNlbDoKLQkgICAgY2FzZSBlX2xyc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ESVIyMUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9sdHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRExUUkVMMjFMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfbHBzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BMQUJFTDIxTDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDMyOgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSMzI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9wc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QTEFCRUwzMjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgUl9IUFBBX0dPVE9GRjoKLSAgICAgIHN3aXRjaCAoZm9ybWF0KQotCXsKLQljYXNlIDE0OgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfcnNlbDoKLQkgICAgY2FzZSBlX3Jyc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19EUFJFTDE0UjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX2ZzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RQUkVMMTRGOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgMjE6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9scnNlbDoKLQkgICAgY2FzZSBlX2xzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RQUkVMMjFMOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSBSX0hQUEFfUENSRUxfQ0FMTDoKLSAgICAgIHN3aXRjaCAoZm9ybWF0KQotCXsKLQljYXNlIDE0OgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfcnNlbDoKLQkgICAgY2FzZSBlX3Jyc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QQ1JFTDE0UjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX2ZzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMTRGOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgMTc6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9yc2VsOgotCSAgICBjYXNlIGVfcnJzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMTdSOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUENSRUwxN0Y7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAyMToKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2xzZWw6Ci0JICAgIGNhc2UgZV9scnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUENSRUwyMUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gZmluYWxfdHlwZXM7Ci19Ci0KLSN1bmRlZiBmaW5hbF90eXBlCi0KLS8qIFNldCB0aGUgY29udGVudHMgb2YgYSBwYXJ0aWN1bGFyIHNlY3Rpb24gYXQgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIC8qIElnbm9yZSB3cml0ZSByZXF1ZXN0cyBmb3IgdGhlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbiB1bnRpbCB3ZSd2ZQotICAgICBoYWQgdGhlIGNoYW5jZSB0byByZWJ1aWxkIGl0IG91cnNlbHZlcy4gICovCi0gIGlmICghc3RyY21wIChzZWN0aW9uLT5uYW1lLCAiLlBBUklTQy5zeW1leHRuIikgJiYgIXN5bWV4dF9jaGFpbl9zaXplKQotICAgIHJldHVybiB0cnVlOwotICBlbHNlCi0gICAgcmV0dXJuIF9iZmRfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwKLQkJCQkJICBvZmZzZXQsIGNvdW50KTsKLX0KLQotLyogVHJhbnNsYXRlIGZyb20gYW4gZWxmIGludG8gZmllbGQgaW50byBhIGhvd3RvIHJlbG9jYXRpb24gcG9pbnRlci4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGYzMl9ocHBhX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBCRkRfQVNTRVJUIChFTEYzMl9SX1RZUEUoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2hwcGFfaG93dG9fdGFibGVbRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyldOwotfQotCi0KLS8qIEFjdHVhbGx5IHBlcmZvcm0gYSByZWxvY2F0aW9uLiAgTk9URSB0aGlzIGlzIChtb3N0bHkpIHN1cGVyY2VlZGVkCi0gICBieSBlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIHdoaWNoIGlzIGNhbGxlZCBieSB0aGUgbmV3Ci0gICBmYXN0IGxpbmtlci4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWhwcGFfZWxmX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQllcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogSXQgaXMgbm8gbG9uZ2VyIHZhbGlkIHRvIGNhbGwgaHBwYV9lbGZfcmVsb2Mgd2hlbiBjcmVhdGluZwotICAgICBhIGZpbmFsIGV4ZWN1dGFibGUuICAqLwotICBpZiAob3V0cHV0X2JmZCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gICAgICAvKiBXb3JrIGFyb3VuZCBsb3NzYWdlIGluIGdlbmVyaWMgZWxmIGNvZGUgdG8gd3JpdGUgcmVsb2NhdGlvbnMuCi0JIChtYXBzIGRpZmZlcmVudCBzZWN0aW9uIHN5bWJvbHMgaW50byB0aGUgc2FtZSBzeW1ib2wgaW5kZXgpLiAgKi8KLSAgICAgIGlmICgoc3ltYm9sX2luLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQkgICYmIHN5bWJvbF9pbi0+c2VjdGlvbikKLQlyZWxvY19lbnRyeS0+YWRkZW5kICs9IHN5bWJvbF9pbi0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKmVycm9yX21lc3NhZ2UgPSAoY2hhciAqKSBfKCJVbnN1cHBvcnRlZCBjYWxsIHRvIGhwcGFfZWxmX3JlbG9jIik7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci19Ci0KLS8qIEFjdHVhbGx5IHBlcmZvcm0gYSByZWxvY2F0aW9uIGFzIHBhcnQgb2YgYSBmaW5hbCBsaW5rLiAgVGhpcyBjYW4gZ2V0Ci0gICByYXRoZXIgaGFpcnkgd2hlbiBsaW5rZXIgc3R1YnMgYXJlIG5lZWRlZC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBvZmZzZXQsIHZhbHVlLAotCQkJCSAgICBhZGRlbmQsIGluZm8sIHN5bV9zZWMsIHN5bV9uYW1lLCBpc19sb2NhbCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzeW1fc2VjOwotICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLSAgICAgaW50IGlzX2xvY2FsOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgcl90eXBlID0gaG93dG8tPnR5cGU7Ci0gIHVuc2lnbmVkIGxvbmcgcl9mb3JtYXQgPSBob3d0by0+Yml0c2l6ZTsKLSAgdW5zaWduZWQgbG9uZyByX2ZpZWxkID0gZV9mc2VsOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBjb250ZW50cyArIG9mZnNldDsKLSAgYm9vbGVhbiByX3BjcmVsID0gaG93dG8tPnBjX3JlbGF0aXZlOwotCi0gIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhKTsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbHVlIGZvciAkZ2xvYmFsJC4gIEZJWE1FIGlzbid0IHRoaXMgZWZmZWN0aXZlbHkKLSAgICAganVzdCBsaWtlIHRoZSBncCBwb2ludGVyIG9uIE1JUFM/ICBDYW4gd2UgdXNlIHRob3NlIHJvdXRpbmVzIGZvciB0aGlzCi0gICAgIHB1cnBvc2U/ICAqLwotICBpZiAoIWVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF9zeW1fZGVmaW5lZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIGggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCAiJGdsb2JhbCQiLCBmYWxzZSwKLQkJCQkgZmFsc2UsIGZhbHNlKTsKLQotICAgICAgLyogSWYgdGhlcmUgaXNuJ3QgYSAkZ2xvYmFsJCwgdGhlbiB3ZSdyZSBpbiBkZWVwIHRyb3VibGUuICAqLwotICAgICAgaWYgKGggPT0gTlVMTCkKLQlyZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgICAgLyogSWYgJGdsb2JhbCQgaXNuJ3QgYSBkZWZpbmVkIHN5bWJvbCwgdGhlbiB3ZSdyZSBzdGlsbCBpbiBkZWVwCi0JIHRyb3VibGUuICAqLwotICAgICAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF92YWx1ZSA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5nbG9iYWxfc3ltX2RlZmluZWQgPSAxOwotICAgIH0KLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1BBUklTQ19OT05FOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfUEFSSVNDX0RJUjMyOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTdGOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxN0M6Ci0gICAgICByX2ZpZWxkID0gZV9mc2VsOwotICAgICAgZ290byBkb19iYXNpY190eXBlXzE7Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDIxTDoKLSAgICAgIHJfZmllbGQgPSBlX2xyc2VsOwotICAgICAgZ290byBkb19iYXNpY190eXBlXzE7Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIxN1I6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3UjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTRSOgotICAgICAgcl9maWVsZCA9IGVfcnJzZWw7Ci0gICAgICBnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLQotICAgIC8qIEZvciBhbGwgdGhlIERQIHJlbGF0aXZlIHJlbG9jYXRpb25zLCB3ZSBuZWVkIHRvIGV4YW1pbmUgdGhlIHN5bWJvbCdzCi0gICAgICAgc2VjdGlvbi4gIElmIGl0J3MgYSBjb2RlIHNlY3Rpb24sIHRoZW4gImRhdGEgcG9pbnRlciByZWxhdGl2ZSIgbWFrZXMKLSAgICAgICBubyBzZW5zZS4gIEluIHRoYXQgY2FzZSB3ZSBkb24ndCBhZGp1c3QgdGhlICJ2YWx1ZSIsIGFuZCBmb3IgMjEgYml0Ci0gICAgICAgYWRkaWwgaW5zdHJ1Y3Rpb25zLCB3ZSBjaGFuZ2UgdGhlIHNvdXJjZSBhZGRlbmQgcmVnaXN0ZXIgZnJvbSAlZHAgdG8KLSAgICAgICAlcjAuICAqLwotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwyMUw6Ci0gICAgICByX2ZpZWxkID0gZV9scnNlbDsKLSAgICAgIGlmIChzeW1fc2VjLT5mbGFncyAmIFNFQ19DT0RFKQotCXsKLQkgIGlmICgoaW5zbiAmIDB4ZmMwMDAwMDApID4+IDI2ID09IDB4YQotCSAgICAgICAmJiAoaW5zbiAmIDB4MDNlMDAwMDApID4+IDIxID09IDB4MWIpCi0JICAgIGluc24gJj0gfjB4MDNlMDAwMDA7Ci0JfQotICAgICAgZWxzZQotCXZhbHVlIC09IGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF92YWx1ZTsKLSAgICAgIGdvdG8gZG9fYmFzaWNfdHlwZV8xOwotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNFI6Ci0gICAgICByX2ZpZWxkID0gZV9ycnNlbDsKLSAgICAgIGlmICgoc3ltX3NlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLQl2YWx1ZSAtPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5nbG9iYWxfdmFsdWU7Ci0gICAgICBnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTRGOgotICAgICAgcl9maWVsZCA9IGVfZnNlbDsKLSAgICAgIGlmICgoc3ltX3NlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLQl2YWx1ZSAtPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5nbG9iYWxfdmFsdWU7Ci0gICAgICBnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLQotICAgIC8qIFRoZXNlIGNhc2VzIGFyZSBzZXBhcmF0ZSBhcyB0aGV5IG1heSBpbnZvbHZlIGEgbG90IG1vcmUgd29yawotICAgICAgIHRvIGRlYWwgd2l0aCBsaW5rZXIgc3R1YnMuICAqLwotICAgIGNhc2UgUl9QQVJJU0NfUExBQkVMMzI6Ci0gICAgY2FzZSBSX1BBUklTQ19QTEFCRUwyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19QTEFCRUwxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3RjoKLSAgICAgIHsKLQliZmRfdm1hIGxvY2F0aW9uOwotCXVuc2lnbmVkIGludCBsZW4sIGNhbGxlcl9hcmdzLCBjYWxsZWVfYXJnczsKLQlhcmdfcmVsb2NfdHlwZSBhcmdfcmVsb2NfdHlwZXNbNV07Ci0Jc3RydWN0IGVsZjMyX2hwcGFfYXJnc19oYXNoX3RhYmxlICphcmdzX2hhc2hfdGFibGU7Ci0Jc3RydWN0IGVsZjMyX2hwcGFfYXJnc19oYXNoX2VudHJ5ICphcmdzX2hhc2g7Ci0JY2hhciAqbmV3X25hbWUsICpzdHViX25hbWU7Ci0KLQkvKiBHZXQgdGhlIGZpZWxkIHNlbGVjdG9yIHJpZ2h0LiAgV2UnbGwgbmVlZCBpdCBpbiBhIG1pbnV0ZS4gICovCi0JaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QQ1JFTDE3RgotCSAgICB8fCByX3R5cGUgPT0gUl9QQVJJU0NfUExBQkVMMzIpCi0JICByX2ZpZWxkID0gZV9mc2VsOwotCWVsc2UgaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QTEFCRUwyMUwpCi0JICByX2ZpZWxkID0gZV9scnNlbDsKLQllbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUExBQkVMMTRSKQotCSAgcl9maWVsZCA9IGVfcnJzZWw7Ci0KLQkvKiBGaW5kIG91dCB3aGVyZSB3ZSBhcmUgYW5kIHdoZXJlIHdlJ3JlIGdvaW5nLiAgKi8KLQlsb2NhdGlvbiA9IChvZmZzZXQgKwotCQkgICAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArCi0JCSAgICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotCS8qIE5vdyBsb29rIGZvciB0aGUgYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgICB0YXJnZXQuICAqLwotCWxlbiA9IHN0cmxlbiAoc3ltX25hbWUpICsgMTsKLQlpZiAoaXNfbG9jYWwpCi0JICBsZW4gKz0gOTsKLQluZXdfbmFtZSA9IGJmZF9tYWxsb2MgKGxlbik7Ci0JaWYgKCFuZXdfbmFtZSkKLQkgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCXN0cmNweSAobmV3X25hbWUsIHN5bV9uYW1lKTsKLQotCS8qIExvY2FsIHN5bWJvbHMgaGF2ZSB1bmlxdWUgSURzLiAgKi8KLQlpZiAoaXNfbG9jYWwpCi0JICBzcHJpbnRmIChuZXdfbmFtZSArIGxlbiAtIDEwLCAiXyUwOHgiLCAoaW50KXN5bV9zZWMpOwotCi0JYXJnc19oYXNoX3RhYmxlID0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+YXJnc19oYXNoX3RhYmxlOwotCi0JYXJnc19oYXNoID0gZWxmMzJfaHBwYV9hcmdzX2hhc2hfbG9va3VwIChhcmdzX2hhc2hfdGFibGUsCi0JCQkJCQkgbmV3X25hbWUsIGZhbHNlLCBmYWxzZSk7Ci0JaWYgKGFyZ3NfaGFzaCA9PSBOVUxMKQotCSAgY2FsbGVlX2FyZ3MgPSAwOwotCWVsc2UKLQkgIGNhbGxlZV9hcmdzID0gYXJnc19oYXNoLT5hcmdfYml0czsKLQotCS8qIElmIHRoaXMgaXMgYSBDQUxMIHJlbG9jYXRpb24sIHRoZW4gZ2V0IHRoZSBjYWxsZXIncyBiaXRzCi0JICAgZnJvbSB0aGUgYWRkZW5kLiAgRWxzZSB1c2UgdGhlIG1hZ2ljIDB4MTU1IHZhbHVlIGZvciBQTEFCRUxTLgotCi0JICAgQWxzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBkZXN0aW5hdGlvbiAodmFsdWUpIGZvciBQTEFCRUxTLiAgKi8KLQlpZiAocl90eXBlID09IFJfUEFSSVNDX1BDUkVMMTdGKQotCSAgY2FsbGVyX2FyZ3MgPSBIUFBBX1JfQVJHX1JFTE9DIChhZGRlbmQpOwotCWVsc2UKLQkgIHsKLQkgICAgY2FsbGVyX2FyZ3MgPSAweDE1NTsKLQkgICAgbG9jYXRpb24gPSB2YWx1ZTsKLQkgIH0KLQotCS8qIEFueSBraW5kIG9mIGxpbmtlciBzdHViIG5lZWRlZD8gICovCi0JaWYgKCgoaW50KSh2YWx1ZSAtIGxvY2F0aW9uKSA+IDB4M2ZmZmYpCi0JICAgIHx8ICgoaW50KSh2YWx1ZSAtIGxvY2F0aW9uKSA8IChpbnQpMHhmZmZjMDAwMCkKLQkgICAgfHwgZWxmMzJfaHBwYV9hcmdfcmVsb2NfbmVlZGVkIChjYWxsZXJfYXJncywgY2FsbGVlX2FyZ3MsCi0JCQkJCSAgICBhcmdfcmVsb2NfdHlwZXMpKQotCSAgewotCSAgICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKnN0dWJfaGFzaF90YWJsZTsKLQkgICAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5ICpzdHViX2hhc2g7Ci0JICAgIGFzZWN0aW9uICpzdHViX3NlY3Rpb247Ci0KLQkgICAgLyogQnVpbGQgYSBuYW1lIGZvciB0aGUgc3R1Yi4gICovCi0KLQkgICAgbGVuID0gc3RybGVuIChuZXdfbmFtZSk7Ci0JICAgIGxlbiArPSAyMzsKLQkgICAgc3R1Yl9uYW1lID0gYmZkX21hbGxvYyAobGVuKTsKLQkgICAgaWYgKCFzdHViX25hbWUpCi0JICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0JICAgIGVsZjMyX2hwcGFfbmFtZV9vZl9zdHViIChjYWxsZXJfYXJncywgY2FsbGVlX2FyZ3MsCi0JCQkJICAgICBsb2NhdGlvbiwgdmFsdWUsIHN0dWJfbmFtZSk7Ci0JICAgIHN0cmNhdCAoc3R1Yl9uYW1lLCBuZXdfbmFtZSk7Ci0JICAgIGZyZWUgKG5ld19uYW1lKTsKLQotCSAgICBzdHViX2hhc2hfdGFibGUgPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5zdHViX2hhc2hfdGFibGU7Ci0KLQkgICAgc3R1Yl9oYXNoCi0JICAgICAgPSBlbGYzMl9ocHBhX3N0dWJfaGFzaF9sb29rdXAgKHN0dWJfaGFzaF90YWJsZSwgc3R1Yl9uYW1lLAotCQkJCQkgICAgIGZhbHNlLCBmYWxzZSk7Ci0KLQkgICAgLyogV2UncmUgZG9uZSB3aXRoIHRoYXQgbmFtZS4gICovCi0JICAgIGZyZWUgKHN0dWJfbmFtZSk7Ci0KLQkgICAgLyogVGhlIHN0dWIgQkZEIG9ubHkgaGFzIG9uZSBzZWN0aW9uLiAgKi8KLQkgICAgc3R1Yl9zZWN0aW9uID0gc3R1Yl9oYXNoX3RhYmxlLT5zdHViX2JmZC0+c2VjdGlvbnM7Ci0KLQkgICAgaWYgKHN0dWJfaGFzaCAhPSBOVUxMKQotCSAgICAgIHsKLQotCQlpZiAocl90eXBlID09IFJfUEFSSVNDX1BDUkVMMTdGKQotCQkgIHsKLQkJICAgIHVuc2lnbmVkIGxvbmcgZGVsYXlfaW5zbjsKLQkJICAgIHVuc2lnbmVkIGludCBvcGNvZGUsIHJ0bl9yZWcsIGxkb190YXJnZXRfcmVnLCBsZG9fc3JjX3JlZzsKLQotCQkgICAgLyogV2UnbGwgbmVlZCB0byBwZWVrIGF0IHRoZSBuZXh0IGluc24uICAqLwotCQkgICAgZGVsYXlfaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEgKyA0KTsKLQkJICAgIG9wY29kZSA9IGdldF9vcGNvZGUgKGRlbGF5X2luc24pOwotCi0JCSAgICAvKiBXZSBhbHNvIG5lZWQgdG8ga25vdyB0aGUgcmV0dXJuIHJlZ2lzdGVyIGZvciB0aGlzCi0JCSAgICAgICBjYWxsLiAgKi8KLQkJICAgIHJ0bl9yZWcgPSAoaW5zbiAmIDB4MDNlMDAwMDApID4+IDIxOwotCi0JCSAgICBsZG9fc3JjX3JlZyA9IChkZWxheV9pbnNuICYgMHgwM2UwMDAwMCkgPj4gMjE7Ci0JCSAgICBsZG9fdGFyZ2V0X3JlZyA9IChkZWxheV9pbnNuICYgMHgwMDFmMDAwMCkgPj4gMTY7Ci0KLQkJICAgIC8qIE11bmdlIHVwIHRoZSB2YWx1ZSBhbmQgb3RoZXIgcGFyYW1ldGVycyBmb3IKLQkJICAgICAgIGhwcGFfZWxmX3JlbG9jYXRlX2luc24uICAqLwotCi0JCSAgICB2YWx1ZSA9IChzdHViX2hhc2gtPm9mZnNldAotCQkJICAgICArIHN0dWJfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICArIHN0dWJfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkJICAgIHJfZm9ybWF0ID0gMTc7Ci0JCSAgICByX2ZpZWxkID0gZV9mc2VsOwotCQkgICAgcl9wY3JlbCA9IDA7Ci0JCSAgICBhZGRlbmQgPSAwOwotCi0JCSAgICAvKiBXZSBuZWVkIHRvIHBlZWsgYXQgdGhlIGRlbGF5IGluc24gYW5kIGRldGVybWluZSBpZgotCQkgICAgICAgd2UnbGwgbmVlZCB0byBzd2FwIHRoZSBicmFuY2ggYW5kIGl0cyBkZWxheSBpbnNuLiAgKi8KLQkJICAgIGlmICgoaW5zbiAmIDIpCi0JCQl8fCAob3Bjb2RlID09IExETwotCQkJICAgICYmIGxkb190YXJnZXRfcmVnID09IHJ0bl9yZWcpCi0JCQl8fCAoZGVsYXlfaW5zbiA9PSAweDA4MDAwMjQwKSkKLQkJICAgICAgewotCQkJLyogTm8gbmVlZCB0byBzd2FwIHRoZSBicmFuY2ggYW5kIGl0cyBkZWxheSBzbG90LCBidXQKLQkJCSAgIHdlIGRvIG5lZWQgdG8gbWFrZSBzdXJlIHRvIGp1bXAgcGFzdCB0aGUgcmV0dXJuCi0JCQkgICBwb2ludGVyIHVwZGF0ZSBpbiB0aGUgc3R1Yi4gICovCi0JCQl2YWx1ZSArPSA0OwotCi0JCQkvKiBJZiB0aGUgZGVsYXkgaW5zbiBkb2VzIGEgcmV0dXJuIHBvaW50ZXIgYWRqdXN0bWVudCwKLQkJCSAgIHRoZW4gd2UgaGF2ZSB0byBtYWtlIHN1cmUgaXQgc3RheXMgdmFsaWQuICAqLwotCQkJaWYgKG9wY29kZSA9PSBMRE8KLQkJCSAgICAmJiBsZG9fdGFyZ2V0X3JlZyA9PSBydG5fcmVnKQotCQkJICB7Ci0JCQkgICAgZGVsYXlfaW5zbiAmPSAweGZjMDBmZmZmOwotCQkJICAgIGRlbGF5X2luc24gfD0gKCgzMSA8PCAyMSkgfCAoMzEgPDwgMTYpKTsKLQkJCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIGRlbGF5X2luc24sIGhpdF9kYXRhICsgNCk7Ci0JCQkgIH0KLQkJCS8qIFVzZSBhIEJMRSB0byByZWFjaCB0aGUgc3R1Yi4gICovCi0JCQlpbnNuID0gQkxFX1NSNF9SMDsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQkvKiBXb25kZXJmdWwsIHdlIGhhdmUgdG8gc3dhcCB0aGUgY2FsbCBpbnNuIGFuZCBpdHMKLQkJCSAgIGRlbGF5IHNsb3QuICAqLwotCQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBkZWxheV9pbnNuLCBoaXRfZGF0YSk7Ci0JCQkvKiBVc2UgYSBCTEUsbiB0byByZWFjaCB0aGUgc3R1Yi4gICovCi0JCQlpbnNuID0gKEJMRV9TUjRfUjAgfCAweDIpOwotCQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBpbnNuLCBoaXRfZGF0YSArIDQpOwotCQkJaW5zbiA9IGhwcGFfZWxmX3JlbG9jYXRlX2luc24gKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkJCQkJICAgICAgIGluc24sIG9mZnNldCArIDQsCi0JCQkJCQkgICAgICAgdmFsdWUsIGFkZGVuZCwKLQkJCQkJCSAgICAgICByX2Zvcm1hdCwgcl9maWVsZCwKLQkJCQkJCSAgICAgICByX3BjcmVsKTsKLQkJCS8qIFVwZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gd29yZC4gICovCi0JCQliZmRfcHV0XzMyIChpbnB1dF9iZmQsIGluc24sIGhpdF9kYXRhICsgNCk7Ci0JCQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIC8qIFBMQUJFTCBzdHVmZiBpcyBlYXN5LiAgKi8KLQotCQkgICAgdmFsdWUgPSAoc3R1Yl9oYXNoLT5vZmZzZXQKLQkJCSAgICAgKyBzdHViX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgKyBzdHViX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCQkgICAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgUlAgYWRqdXN0bWVudCBmb3IgUExBQkVMcy4gICovCi0JCSAgICB2YWx1ZSArPSA0OwotCQkgICAgaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QTEFCRUwzMikKLQkJICAgICAgcl9mb3JtYXQgPSAzMjsKLQkJICAgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QTEFCRUwyMUwpCi0JCSAgICAgIHJfZm9ybWF0ID0gMjE7Ci0JCSAgICBlbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUExBQkVMMTRSKQotCQkgICAgICByX2Zvcm1hdCA9IDE0OwotCi0JCSAgICByX3BjcmVsID0gMDsKLQkJICAgIGFkZGVuZCA9IDA7Ci0JCSAgfQotCQl9Ci0JICAgICAgZWxzZQotCQlyZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQkgIH0KLQlnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLSAgICAgIH0KLQotZG9fYmFzaWNfdHlwZV8xOgotICAgICAgaW5zbiA9IGhwcGFfZWxmX3JlbG9jYXRlX2luc24gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgaW5zbiwKLQkJCQkgICAgIG9mZnNldCwgdmFsdWUsIGFkZGVuZCwgcl9mb3JtYXQsCi0JCQkJICAgICByX2ZpZWxkLCByX3BjcmVsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogU29tZXRoaW5nIHdlIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZS4gICovCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgIH0KLQotICAvKiBVcGRhdGUgdGhlIGluc3RydWN0aW9uIHdvcmQuICAqLwotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIGluc24sIGhpdF9kYXRhKTsKLSAgcmV0dXJuIChiZmRfcmVsb2Nfb2spOwotfQotCi0vKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGhvd3RvIHRhYmxlIGVudHJ5IHRvIHBlcmZvcm0gdGhlIENPREUKLSAgIHJlbG9jYXRpb24gZm9yIGFuIEFSQ0ggbWFjaGluZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBpZiAoKGludCkgY29kZSA8IChpbnQpIFJfUEFSSVNDX1VOSU1QTEVNRU5URUQpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoKGludCkgZWxmX2hwcGFfaG93dG9fdGFibGVbKGludCkgY29kZV0udHlwZSA9PSAoaW50KSBjb2RlKTsKLSAgICAgIHJldHVybiAmZWxmX2hwcGFfaG93dG9fdGFibGVbKGludCkgY29kZV07Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgU1lNIHJlcHJlc2VudHMgYSBsb2NhbCBsYWJlbCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaHBwYV9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gKG5hbWVbMF0gPT0gJ0wnICYmIG5hbWVbMV0gPT0gJyQnKTsKLX0KLQotLyogRG8gYW55IGJhY2tlbmQgc3BlY2lmaWMgcHJvY2Vzc2luZyB3aGVuIGJlZ2lubmluZyB0byB3cml0ZSBhbiBvYmplY3QKLSAgIGZpbGUuICBGb3IgUEEgRUxGIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgZXh0ZW5zaW9uCi0gICBzZWN0aW9uICpiZWZvcmUqIGFueSBvdGhlciBvdXRwdXQgcHJvY2Vzc2luZyBoYXBwZW5zLiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZjMyX2hwcGFfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgYXNlY3Rpb24gKnN5bWV4dG5fc2VjOwotCi0gIC8qIFNpemUgdXAgdGhlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbi4gICovCi0gIGlmICgoYWJmZC0+b3V0c3ltYm9scyA9PSBOVUxMCi0gICAgICAgJiYgaW5mbyA9PSBOVUxMKQotICAgICAgfHwgc3ltZXh0X2NoYWluX3NpemUgIT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGluZm8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSB3ZXJlIG5vdCBjYWxsZWQgZnJvbSB0aGUgQkZEIEVMRiBsaW5rZXIgY29kZSwgc28gd2UgbmVlZAotCSB0byBleGFtaW5lIHRoZSBvdXRwdXQgQkZEJ3Mgb3V0c3ltYm9scy4KLQotCSBOb3RlIHdlIGNhbiBub3QgYnVpbGQgdGhlIHN5bWJvbCBleHRlbnNpb25zIG5vdyBhcyB0aGUgc3ltYm9sCi0JIG1hcCBoYXNuJ3QgYmVlbiBzZXQgdXAuICAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnN5bWNvdW50OyBpKyspCi0JewotCSAgZWxmX3N5bWJvbF90eXBlICpzeW1ib2wgPSAoZWxmX3N5bWJvbF90eXBlICopYWJmZC0+b3V0c3ltYm9sc1tpXTsKLQotCSAgLyogT25seSBmdW5jdGlvbnMgZXZlciBuZWVkIGFuIGVudHJ5IGluIHRoZSBzeW1ib2wgZXh0ZW5zaW9uCi0JICAgICBzZWN0aW9uLiAgKi8KLQkgIGlmICghKHN5bWJvbC0+c3ltYm9sLmZsYWdzICYgQlNGX0ZVTkNUSU9OKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEFuZCBvbmx5IGlmIHRoZXkgc3BlY2lmeSB0aGUgbG9jYXRpb25zIG9mIHRoZWlyIGFyZ3VtZW50cy4gICovCi0JICBpZiAoc3ltYm9sLT50Y19kYXRhLmhwcGFfYXJnX3JlbG9jID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBZdXAuICBUaGlzIGZ1bmN0aW9uIHN5bWJvbCBuZWVkcyBhbiBlbnRyeS4gICovCi0JICBzeW1leHRfY2hhaW5fc2l6ZSArPSAyICogRUxGMzJfUEFSSVNDX1NYX1NJWkU7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgewotICAgICAgc3RydWN0IGVsZjMyX2hwcGFfYXJnc19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgIHRhYmxlID0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+YXJnc19oYXNoX3RhYmxlOwotCi0gICAgICAvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbi4gICovCi0gICAgICBlbGYzMl9ocHBhX2FyZ3NfaGFzaF90cmF2ZXJzZSAodGFibGUsCi0JCQkJICAgICBlbGYzMl9ocHBhX3NpemVfc3ltZXh0LAotCQkJCSAgICAgJnN5bWV4dF9jaGFpbl9zaXplKTsKLSAgICB9Ci0KLSAgLyogTm93IGNyZWF0ZSB0aGUgc2VjdGlvbiBhbmQgc2V0IGl0cyBzaXplLiAgV2UnbGwgZmlsbCBpbiB0aGUKLSAgICAgY29udGVudHMgbGF0ZXIuICAqLwotICBzeW1leHRuX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBTWU1FWFROX1NFQ1RJT05fTkFNRSk7Ci0gIGlmIChzeW1leHRuX3NlYyA9PSBOVUxMKQotICAgIHN5bWV4dG5fc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgU1lNRVhUTl9TRUNUSU9OX05BTUUpOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc3ltZXh0bl9zZWMsCi0JCQkgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0RBVEEpOwotICBzeW1leHRuX3NlYy0+b3V0cHV0X3NlY3Rpb24gPSBzeW1leHRuX3NlYzsKLSAgc3ltZXh0bl9zZWMtPm91dHB1dF9vZmZzZXQgPSAwOwotICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzeW1leHRuX3NlYywgMik7Ci0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBzeW1leHRuX3NlYywgc3ltZXh0X2NoYWluX3NpemUpOwotfQotCi0vKiBDYWxsZWQgZm9yIGVhY2ggZW50cnkgaW4gdGhlIGFyZ3MgbG9jYXRpb24gaGFzaCB0YWJsZS4gIEZvciBlYWNoCi0gICBlbnRyeSB3ZSBidW1wIHRoZSBzaXplIHBvaW50ZXIgYnkgMiByZWNvcmRzICgxNiBieXRlcykuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9zaXplX3N5bWV4dCAoZ2VuX2VudHJ5LCBpbl9hcmdzKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmdlbl9lbnRyeTsKLSAgICAgUFRSIGluX2FyZ3M7Ci17Ci0gIGJmZF9zaXplX3R5cGUgKnNpemVwID0gKGJmZF9zaXplX3R5cGUgKilpbl9hcmdzOwotCi0gICpzaXplcCArPSAyICogRUxGMzJfUEFSSVNDX1NYX1NJWkU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBCYWNrZW5kIHJvdXRpbmUgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgZm9yIGVhY2ggb3V0cHV0IHN5bWJvbC4KLQotICAgRm9yIFBBIEVMRiB3ZSB1c2UgdGhpcyBvcHBvcnR1bml0eSB0byBhZGQgYW4gYXBwcm9wcmlhdGUgZW50cnkKLSAgIHRvIHRoZSBzeW1ib2wgZXh0ZW5zaW9uIGNoYWluIGZvciBmdW5jdGlvbiBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIG5hbWUsIHN5bSwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgY2hhciAqbmV3X25hbWU7Ci0gIHVuc2lnbmVkIGludCBsZW4sIGluZGV4OwotICBzdHJ1Y3QgZWxmMzJfaHBwYV9hcmdzX2hhc2hfdGFibGUgKmFyZ3NfaGFzaF90YWJsZTsKLSAgc3RydWN0IGVsZjMyX2hwcGFfYXJnc19oYXNoX2VudHJ5ICphcmdzX2hhc2g7Ci0KLSAgLyogSWYgdGhlIGFyZ3MgaGFzaCB0YWJsZSBpcyBOVUxMLCB0aGVuIHdlJ3ZlIGVuY291bnRlcmVkIGFuIGVycm9yCi0gICAgIG9mIHNvbWUgc29ydHMgKGZvciBleGFtcGxlLCBhbiB1bmRlZmluZWQgc3ltYm9sKS4gIEluIHRoYXQgY2FzZQotICAgICB3ZSd2ZSBnb3Qgbm90aGluZyBlbHNlIHRvIGRvLgotCi0gICAgIE5PVEU6IGVsZl9saW5rX291dHB1dF9zeW1ib2wgd2lsbCBhYm9ydCBpZiB3ZSByZXR1cm4gZmFsc2UgaGVyZSEgICovCi0gIGlmIChlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5hcmdzX2hhc2hfdGFibGUgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbmRleCA9IGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPm91dHB1dF9zeW1ib2xfY291bnQrKzsKLQotICAvKiBXZSBuZWVkIHRvIGxvb2sgdXAgdGhpcyBzeW1ib2wgaW4gdGhlIGFyZ3MgaGFzaCB0YWJsZSB0byBzZWUgaWYKLSAgICAgaXQgaGFzIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cy4gICovCi0gIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfRlVOQykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBrbm93IGl0J3MgYSBmdW5jdGlvbiBzeW1ib2wgb2Ygc29tZSBraW5kLiAgKi8KLSAgbGVuID0gc3RybGVuIChuYW1lKSArIDE7Ci0gIGlmIChFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSA9PSBTVEJfTE9DQUwpCi0gICAgbGVuICs9IDk7Ci0KLSAgbmV3X25hbWUgPSBiZmRfbWFsbG9jIChsZW4pOwotICBpZiAobmV3X25hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RyY3B5IChuZXdfbmFtZSwgbmFtZSk7Ci0gIGlmIChFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSA9PSBTVEJfTE9DQUwpCi0gICAgc3ByaW50ZiAobmV3X25hbWUgKyBsZW4gLSAxMCwgIl8lMDh4IiwgKGludClzZWN0aW9uKTsKLQotICAvKiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSB1bmlxdWUgbmFtZSwgd2UgY2FuIGxvb2sgaXQgdXAgaW4gdGhlCi0gICAgIGFyZ3MgaGFzaCB0YWJsZS4gICovCi0gIGFyZ3NfaGFzaF90YWJsZSA9IGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmFyZ3NfaGFzaF90YWJsZTsKLSAgYXJnc19oYXNoID0gZWxmMzJfaHBwYV9hcmdzX2hhc2hfbG9va3VwIChhcmdzX2hhc2hfdGFibGUsIG5ld19uYW1lLAotCQkJCQkgICBmYWxzZSwgZmFsc2UpOwotICBmcmVlIChuZXdfbmFtZSk7Ci0gIGlmIChhcmdzX2hhc2ggPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBrbm93IHRoaXMgc3ltYm9sIGhhcyBhcmcgcmVsb2MgYml0cy4gICovCi0gIGFkZF9lbnRyeV90b19zeW1leHRfY2hhaW4gKGFiZmQsIGFyZ3NfaGFzaC0+YXJnX2JpdHMsCi0JCQkgICAgIGluZGV4LCAmc3ltZXh0X3Jvb3RQLCAmc3ltZXh0X2xhc3RQKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBlcmZvcm0gYW55IHByb2Nlc3NpbmcgbmVlZGVkIGxhdGUgaW4gdGhlIG9iamVjdCBmaWxlIHdyaXRpbmcgcHJvY2Vzcy4KLSAgIEZvciBQQSBFTEYgd2UgYnVpbGQgYW5kIHNldCB0aGUgY29udGVudHMgb2YgdGhlIHN5bWJvbCBleHRlbnNpb24KLSAgIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotZWxmMzJfaHBwYV9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGxpbmtlcjsKLXsKLSAgYXNlY3Rpb24gKnN5bWV4dG5fc2VjOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICAvKiBOb3cgYnVpbGQgdGhlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbi4gICovCi0gIGlmIChzeW1leHRfY2hhaW5fc2l6ZSA9PSAwKQotICAgIHJldHVybjsKLQotICBpZiAoISBsaW5rZXIpCi0gICAgewotICAgICAgLyogV2Ugd2VyZSBub3QgY2FsbGVkIGZyb20gdGhlIGJhY2tlbmQgbGlua2VyLCBzbyB3ZSBzdGlsbCBuZWVkCi0JIHRvIGJ1aWxkIHRoZSBzeW1ib2wgZXh0ZW5zaW9uIGNoYWluLgotCi0gICAgICAgICBMb29rIGF0IGVhY2ggc3ltYm9sLCBhZGRpbmcgdGhlIGFwcHJvcHJpYXRlIGluZm9ybWF0aW9uIHRvIHRoZQotCSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gbGlzdCBhcyBuZWNlc3NhcnkuICAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnN5bWNvdW50OyBpKyspCi0JewotCSAgZWxmX3N5bWJvbF90eXBlICpzeW1ib2wgPSAoZWxmX3N5bWJvbF90eXBlICopIGFiZmQtPm91dHN5bWJvbHNbaV07Ci0KLQkgIC8qIE9ubHkgZnVuY3Rpb25zIGV2ZXIgbmVlZCBhbiBlbnRyeSBpbiB0aGUgc3ltYm9sIGV4dGVuc2lvbgotCSAgICAgc2VjdGlvbi4gICovCi0JICBpZiAoIShzeW1ib2wtPnN5bWJvbC5mbGFncyAmIEJTRl9GVU5DVElPTikpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBBbmQgb25seSBpZiB0aGV5IHNwZWNpZnkgdGhlIGxvY2F0aW9ucyBvZiB0aGVpciBhcmd1bWVudHMuICAqLwotCSAgaWYgKHN5bWJvbC0+dGNfZGF0YS5ocHBhX2FyZ19yZWxvYyA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogQWRkIHRoaXMgc3ltYm9sJ3MgaW5mb3JtYXRpb24gdG8gdGhlIGNoYWluLiAgKi8KLQkgIGFkZF9lbnRyeV90b19zeW1leHRfY2hhaW4gKGFiZmQsIHN5bWJvbC0+dGNfZGF0YS5ocHBhX2FyZ19yZWxvYywKLQkJCQkgICAgIHN5bWJvbC0+c3ltYm9sLnVkYXRhLmksICZzeW1leHRfcm9vdFAsCi0JCQkJICAgICAmc3ltZXh0X2xhc3RQKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBmaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uLiAgKi8KLSAgZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyAoYWJmZCwgc3ltZXh0X3Jvb3RQKTsKLQotICAvKiBBbmQgYXR0YWNoIHRoYXQgYXMgdGhlIHNlY3Rpb24ncyBjb250ZW50cy4gICovCi0gIHN5bWV4dG5fc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIFNZTUVYVE5fU0VDVElPTl9OQU1FKTsKLSAgaWYgKHN5bWV4dG5fc2VjID09IChhc2VjdGlvbiAqKSAwKQotICAgIGFib3J0KCk7Ci0KLSAgc3ltZXh0bl9zZWMtPmNvbnRlbnRzID0gKHZvaWQgKilzeW1leHRuX2NvbnRlbnRzOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc3ltZXh0bl9zZWMsIHN5bWV4dG5fc2VjLT5jb250ZW50cywKLQkJCSAgICBzeW1leHRuX3NlYy0+b3V0cHV0X29mZnNldCwgc3ltZXh0bl9zZWMtPl9yYXdfc2l6ZSk7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgc3ltYm9sIGV4dGVudGlvbiBjaGFpbiB0byBpbmNsdWRlIHRoZSBzeW1ib2wgcG9pbnRlZCB0bwotICAgYnkgU1lNQk9MUCBpZiBTWU1CT0xQIGlzIGEgZnVuY3Rpb24gc3ltYm9sLiAgVXNlZCBpbnRlcm5hbGx5IGFuZCBieSBHQVMuICAqLwotCi1zdGF0aWMgdm9pZAotYWRkX2VudHJ5X3RvX3N5bWV4dF9jaGFpbiAoYWJmZCwgYXJnX3JlbG9jLCBzeW1faWR4LCBzeW1leHRfcm9vdCwgc3ltZXh0X2xhc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGFyZ19yZWxvYzsKLSAgICAgdW5zaWduZWQgaW50IHN5bV9pZHg7Ci0gICAgIHN5bWV4dF9jaGFpblMgKipzeW1leHRfcm9vdDsKLSAgICAgc3ltZXh0X2NoYWluUyAqKnN5bWV4dF9sYXN0OwotewotICBzeW1leHRfY2hhaW5TICpzeW1leHRQOwotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeSBhbmQgaW5pdGlhbGl6ZSB0aGlzIGVudHJ5LiAgKi8KLSAgc3ltZXh0UCA9IChzeW1leHRfY2hhaW5TICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzeW1leHRfY2hhaW5TKSAqIDIpOwotICBpZiAoIXN5bWV4dFApCi0gICAgYWJvcnQoKTsJCQkvKiBGSVhNRSAqLwotCi0gIHN5bWV4dFBbMF0uZW50cnkgPSBFTEYzMl9QQVJJU0NfU1hfV09SRCAoUEFSSVNDX1NYVF9TWU1ORFgsIHN5bV9pZHgpOwotICBzeW1leHRQWzBdLm5leHQgPSAmc3ltZXh0UFsxXTsKLQotICBzeW1leHRQWzFdLmVudHJ5ID0gRUxGMzJfUEFSSVNDX1NYX1dPUkQgKFBBUklTQ19TWFRfQVJHX1JFTE9DLCBhcmdfcmVsb2MpOwotICBzeW1leHRQWzFdLm5leHQgPSBOVUxMOwotCi0gIC8qIE5vdyB1cGRhdGUgdGhlIGNoYWluIGl0c2VsZiBzbyBpdCBjYW4gYmUgd2Fsa2VkIGxhdGVyIHRvIGJ1aWxkCi0gICAgIHRoZSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24uICAqLwotICBpZiAoKnN5bWV4dF9yb290ID09IE5VTEwpCi0gICAgewotICAgICAgKnN5bWV4dF9yb290ID0gJnN5bWV4dFBbMF07Ci0gICAgICAqc3ltZXh0X2xhc3QgPSAmc3ltZXh0UFsxXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKnN5bWV4dF9sYXN0KS0+bmV4dCA9ICZzeW1leHRQWzBdOwotICAgICAgKnN5bWV4dF9sYXN0ID0gJnN5bWV4dFBbMV07Ci0gICAgfQotfQotCi0vKiBCdWlsZCB0aGUgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMgKGFiZmQsIHN5bWV4dF9yb290KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN5bWV4dF9jaGFpblMgKnN5bWV4dF9yb290OwotewotICBzeW1leHRfY2hhaW5TICpzeW1leHRQOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgYXNlY3Rpb24gKnN5bWV4dG5fc2VjOwotCi0gIHN5bWV4dG5fc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIFNZTUVYVE5fU0VDVElPTl9OQU1FKTsKLQotICAvKiBHcmFiIHNvbWUgbWVtb3J5IGZvciB0aGUgY29udGVudHMgb2YgdGhlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbgotICAgICBpdHNlbGYuICAqLwotICBzeW1leHRuX2NvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGFiZmQsCi0JCQkJCSAgICAgIHN5bWV4dG5fc2VjLT5fcmF3X3NpemUpOwotICBpZiAoIXN5bWV4dG5fY29udGVudHMpCi0gICAgYWJvcnQoKTsJCQkvKiBGSVhNRSAqLwotCi0gIC8qIEZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBzeW1ib2wgZXh0ZW5zaW9uIGNoYWluLiAgKi8KLSAgZm9yIChpID0gMCwgc3ltZXh0UCA9IHN5bWV4dF9yb290OyBzeW1leHRQOyBzeW1leHRQID0gc3ltZXh0UC0+bmV4dCwgKytpKQotICAgIEVMRjMyX1BBUklTQ19TWF9QVVQgKGFiZmQsIChiZmRfdm1hKSBzeW1leHRQLT5lbnRyeSwKLQkJCSBzeW1leHRuX2NvbnRlbnRzICsgaSAqIEVMRjMyX1BBUklTQ19TWF9TSVpFKTsKLQotICByZXR1cm47Ci19Ci0KLS8qIERvIHNvbWUgUEEgRUxGIHNwZWNpZmljIHdvcmsgYWZ0ZXIgcmVhZGluZyBpbiB0aGUgc3ltYm9sIHRhYmxlLgotICAgSW4gcGFydGljdWxhciBhdHRhY2ggdGhlIGFyZ3VtZW50IHJlbG9jYXRpb24gZnJvbSB0aGUKLSAgIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbiB0byB0aGUgYXBwcm9wcmlhdGUgc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcgKGFiZmQsIGVzeW1zLHN5bWNudCkKLSAgICAgYmZkICphYmZkOwotICAgICBlbGZfc3ltYm9sX3R5cGUgKmVzeW1zOwotICAgICB1bnNpZ25lZCBpbnQgc3ltY250OwotewotICBFbGYzMl9JbnRlcm5hbF9TaGRyICpzeW1leHRuX2hkciA9Ci0gICAgYmZkX2VsZl9maW5kX3NlY3Rpb24gKGFiZmQsIFNZTUVYVE5fU0VDVElPTl9OQU1FKTsKLSAgdW5zaWduZWQgaW50IGksIGN1cnJlbnRfc3ltX2lkeCA9IDA7Ci0KLSAgLyogSWYgbm8gc3ltYm9sIGV4dGVuc2lvbiBleGlzdGVkLCB0aGVuIGFsbCBzeW1ib2wgZXh0ZW5zaW9uIGluZm9ybWF0aW9uCi0gICAgIGlzIGFzc3VtZWQgdG8gYmUgemVyby4gICovCi0gIGlmIChzeW1leHRuX2hkciA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzeW1jbnQ7IGkrKykKLQllc3ltc1tpXS50Y19kYXRhLmhwcGFfYXJnX3JlbG9jID0gMDsKLSAgICAgIHJldHVybiAodHJ1ZSk7Ci0gICAgfQotCi0gIC8qIEZJWE1FOiAgV2h5IG5vdCB1c2UgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIGhlcmU/ICBBbHNvIHNob3VsZCBnaXZlCi0gICAgIG1lbW9yeSBiYWNrIHdoZW4gd2UncmUgZG9uZS4gICovCi0gIC8qIEFsbG9jYXRlIGEgYnVmZmVyIG9mIHRoZSBhcHByb3ByaWF0ZSBzaXplIGZvciB0aGUgc3ltZXh0biBzZWN0aW9uLiAgKi8KLSAgc3ltZXh0bl9oZHItPmNvbnRlbnRzID0gYmZkX3phbGxvYyhhYmZkLHN5bWV4dG5faGRyLT5zaF9zaXplKTsKLSAgaWYgKCFzeW1leHRuX2hkci0+Y29udGVudHMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFJlYWQgaW4gdGhlIHN5bWV4dG4gc2VjdGlvbi4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltZXh0bl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpID09IC0xKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBzeW1leHRuX2hkci0+Y29udGVudHMsIDEsIHN5bWV4dG5faGRyLT5zaF9zaXplLCBhYmZkKQotICAgICAgIT0gc3ltZXh0bl9oZHItPnNoX3NpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFBhcnNlIGVudHJpZXMgaW4gdGhlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbiwgdXBkYXRpbmcgdGhlIHN5bXRhYgotICAgICBlbnRyaWVzIGFzIHdlIGdvICovCi0gIGZvciAoaSA9IDA7IGkgPCBzeW1leHRuX2hkci0+c2hfc2l6ZSAvIEVMRjMyX1BBUklTQ19TWF9TSVpFOyBpKyspCi0gICAgewotICAgICAgc3ltZXh0X2VudHJ5UyBzZSA9Ci0JRUxGMzJfUEFSSVNDX1NYX0dFVCAoYWJmZCwKLQkJCSAgICAgKCh1bnNpZ25lZCBjaGFyICopc3ltZXh0bl9oZHItPmNvbnRlbnRzCi0JCQkgICAgICArIGkgKiBFTEYzMl9QQVJJU0NfU1hfU0laRSkpOwotICAgICAgdW5zaWduZWQgaW50IHNlX3ZhbHVlID0gRUxGMzJfUEFSSVNDX1NYX1ZBTCAoc2UpOwotICAgICAgdW5zaWduZWQgaW50IHNlX3R5cGUgPSBFTEYzMl9QQVJJU0NfU1hfVFlQRSAoc2UpOwotCi0gICAgICBzd2l0Y2ggKHNlX3R5cGUpCi0JewotCWNhc2UgUEFSSVNDX1NYVF9OVUxMOgotCSAgYnJlYWs7Ci0KLQljYXNlIFBBUklTQ19TWFRfU1lNTkRYOgotCSAgaWYgKHNlX3ZhbHVlID49IHN5bWNudCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiAoZmFsc2UpOwotCSAgICB9Ci0JICBjdXJyZW50X3N5bV9pZHggPSBzZV92YWx1ZSAtIDE7Ci0JICBicmVhazsKLQotCWNhc2UgUEFSSVNDX1NYVF9BUkdfUkVMT0M6Ci0JICBlc3ltc1tjdXJyZW50X3N5bV9pZHhdLnRjX2RhdGEuaHBwYV9hcmdfcmVsb2MgPSBzZV92YWx1ZTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIChmYWxzZSk7Ci0JfQotICAgIH0KLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyogUmVhZCBhbmQgYXR0YWNoIHRoZSBzeW1ib2wgZXh0ZW5zaW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3ltYm9scwotICAgaW4gSU5QVVRfQkZEIHRvIHRoZSBhcmd1bWVudCBsb2NhdGlvbiBoYXNoIHRhYmxlLiAgSGFuZGxlIGxvY2FscwotICAgaWYgRE9fTE9DQUxTIGlzIHRydWU7IGxpa2V3aXNlIGZvciBnbG9iYWxzIHdoZW4gRE9fR0xPQkFMUyBpcyB0cnVlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLCBhcmdzX2hhc2hfdGFibGUsIGxvY2FsX3N5bXMpCi0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgICAgc3RydWN0IGVsZjMyX2hwcGFfYXJnc19oYXNoX3RhYmxlICphcmdzX2hhc2hfdGFibGU7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci17Ci0gIGFzZWN0aW9uICpzeW1leHRuX3NlYzsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICB1bnNpZ25lZCBpbnQgaSwgbl9lbnRyaWVzLCBjdXJyZW50X2luZGV4ID0gMDsKLQotICAvKiBHZXQgdGhlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbiBmb3IgdGhpcyBCRkQuICBJZiBubyBzZWN0aW9uIGV4aXN0cwotICAgICB0aGVuIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gIExpa2V3aXNlIGlmIHRoZSBzZWN0aW9uIGV4aXN0cywgYnV0Ci0gICAgIGhhcyBubyBjb250ZW50cy4gICovCi0gIHN5bWV4dG5fc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgU1lNRVhUTl9TRUNUSU9OX05BTUUpOwotICBpZiAoc3ltZXh0bl9zZWMgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBEb25lIHNlcGFyYXRlbHkgc28gd2UgY2FuIHR1cm4gb2ZmIFNFQ19IQVNfQ09OVEVOVFMgKHNlZSBiZWxvdykuICAqLwotICBpZiAoc3ltZXh0bl9zZWMtPl9yYXdfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIHN5bWV4dG5fc2VjLT5mbGFncyAmPSB+U0VDX0hBU19DT05URU5UUzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzeW1leHRuX3NlYy0+X3Jhd19zaXplKTsKLSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEhvdyBncm9zcy4gIFdlIHR1cm4gb2ZmIFNFQ19IQVNfQ09OVEVOVFMgZm9yIHRoZSBpbnB1dCBzeW1ib2wgZXh0ZW5zaW9uCi0gICAgIHNlY3Rpb25zIHRvIGtlZXAgdGhlIGdlbmVyaWMgRUxGL0JGRCBjb2RlIGZyb20gdHJ5aW5nIHRvIGRvIGFueXRoaW5nCi0gICAgIHdpdGggdGhlbS4gIFdlIGhhdmUgdG8gdW5kbyB0aGF0IGhhY2sgdGVtcG9yYXJpbHkgc28gdGhhdCB3ZSBjYW4gcmVhZAotICAgICBpbiB0aGUgY29udGVudHMgd2l0aCB0aGUgZ2VuZXJpYyBjb2RlLiAgKi8KLSAgc3ltZXh0bl9zZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgc3ltZXh0bl9zZWMsIGNvbnRlbnRzLAotCQkJCTAsIHN5bWV4dG5fc2VjLT5fcmF3X3NpemUpID09IGZhbHNlKQotICAgIHsKLSAgICAgIHN5bWV4dG5fc2VjLT5mbGFncyAmPSB+U0VDX0hBU19DT05URU5UUzsKLSAgICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogR3Jvc3MuICBUdXJuIG9mZiBTRUNfSEFTX0NPTlRFTlRTIGZvciB0aGUgaW5wdXQgc3ltYm9sIGV4dGVuc2lvbgotICAgICBzZWN0aW9ucyAoc2VlIGFib3ZlKS4gICovCi0gIHN5bWV4dG5fc2VjLT5mbGFncyAmPSB+U0VDX0hBU19DT05URU5UUzsKLQotICBuX2VudHJpZXMgPSBzeW1leHRuX3NlYy0+X3Jhd19zaXplIC8gRUxGMzJfUEFSSVNDX1NYX1NJWkU7Ci0gIGZvciAoaSA9IDA7IGkgPCBuX2VudHJpZXM7IGkrKykKLSAgICB7Ci0gICAgICBzeW1leHRfZW50cnlTIGVudHJ5ID0KLQlFTEYzMl9QQVJJU0NfU1hfR0VUIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgaSAqIEVMRjMyX1BBUklTQ19TWF9TSVpFKTsKLSAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSA9IEVMRjMyX1BBUklTQ19TWF9WQUwgKGVudHJ5KTsKLSAgICAgIHVuc2lnbmVkIGludCB0eXBlID0gRUxGMzJfUEFSSVNDX1NYX1RZUEUgKGVudHJ5KTsKLSAgICAgIHN0cnVjdCBlbGYzMl9ocHBhX2FyZ3NfaGFzaF9lbnRyeSAqYXJnc19oYXNoOwotCi0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgUEFSSVNDX1NYVF9OVUxMOgotCSAgYnJlYWs7Ci0KLQljYXNlIFBBUklTQ19TWFRfU1lNTkRYOgotCSAgaWYgKHZhbHVlID49IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICBmcmVlIChjb250ZW50cyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBjdXJyZW50X2luZGV4ID0gdmFsdWU7Ci0JICBicmVhazsKLQotCWNhc2UgUEFSSVNDX1NYVF9BUkdfUkVMT0M6Ci0JICBpZiAoY3VycmVudF9pbmRleCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotCSAgICAgIGNoYXIgKm5ld19uYW1lOwotCSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCSAgICAgIGFzZWN0aW9uICpzeW1fc2VjOwotCSAgICAgIHVuc2lnbmVkIGludCBsZW47Ci0KLQkgICAgICBoZHIgPSBlbGZfZWxmc2VjdGlvbnMgKGlucHV0X2JmZClbbG9jYWxfc3ltc1tjdXJyZW50X2luZGV4XS5zdF9zaG5keF07Ci0JICAgICAgc3ltX3NlYyA9IGhkci0+YmZkX3NlY3Rpb247Ci0JICAgICAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgICBzeW10YWJfaGRyLT5zaF9saW5rLAotCSAJCQkgICAgICAgIGxvY2FsX3N5bXNbY3VycmVudF9pbmRleF0uc3RfbmFtZSk7Ci0JICAgICAgbGVuID0gc3RybGVuIChzeW1fbmFtZSkgKyAxMDsKLQkgICAgICBuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKGxlbik7Ci0JICAgICAgaWYgKG5ld19uYW1lID09IE5VTEwpCi0JCXsKLQkJICBmcmVlIChjb250ZW50cyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgc3RyY3B5IChuZXdfbmFtZSwgc3ltX25hbWUpOwotCSAgICAgIHNwcmludGYgKG5ld19uYW1lICsgbGVuIC0gMTAsICJfJTA4eCIsIChpbnQpc3ltX3NlYyk7Ci0KLQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIHN5bWJvbCB3aXRoIGFyZ3VtZW50IGxvY2F0aW9uIGluZm8uCi0JCSBXZSBuZWVkIHRvIGVudGVyIGl0IGludG8gdGhlIGhhc2ggdGFibGUuICAqLwotCSAgICAgIGFyZ3NfaGFzaCA9IGVsZjMyX2hwcGFfYXJnc19oYXNoX2xvb2t1cCAoYXJnc19oYXNoX3RhYmxlLAotCQkJCQkJICAgICAgIG5ld19uYW1lLCB0cnVlLAotCQkJCQkJICAgICAgIHRydWUpOwotCSAgICAgIGZyZWUgKG5ld19uYW1lKTsKLQkgICAgICBpZiAoYXJnc19oYXNoID09IE5VTEwpCi0JCXsKLQkJICBmcmVlIChjb250ZW50cyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgYXJnc19oYXNoLT5hcmdfYml0cyA9IHZhbHVlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBlbHNlIGlmIChjdXJyZW50X2luZGV4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICAgIGN1cnJlbnRfaW5kZXggLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgICAgICBoID0gZWxmX3N5bV9oYXNoZXMoaW5wdXRfYmZkKVtjdXJyZW50X2luZGV4XTsKLQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIHN5bWJvbCB3aXRoIGFyZ3VtZW50IGxvY2F0aW9uCi0JCSBpbmZvcm1hdGlvbi4gIFdlIG5lZWQgdG8gZW50ZXIgaXQgaW50byB0aGUgaGFzaCB0YWJsZS4gICovCi0JICAgICAgYXJnc19oYXNoID0gZWxmMzJfaHBwYV9hcmdzX2hhc2hfbG9va3VwIChhcmdzX2hhc2hfdGFibGUsCi0JCQkJCQkgICAgICAgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkJCSAgICAgICB0cnVlLCB0cnVlKTsKLQkgICAgICBpZiAoYXJnc19oYXNoID09IE5VTEwpCi0JCXsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICBmcmVlIChjb250ZW50cyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgYXJnc19oYXNoLT5hcmdfYml0cyA9IHZhbHVlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgZnJlZSAoY29udGVudHMpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0gIGZyZWUgKGNvbnRlbnRzKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFVuZG8gdGhlIGdlbmVyaWMgRUxGIGNvZGUncyBzdWJ0cmFjdGlvbiBvZiBzZWN0aW9uLT52bWEgZnJvbSB0aGUKLSAgIHZhbHVlIG9mIGVhY2ggZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfYWRkX3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBzeW0sIG5hbWVwLCBmbGFnc3AsIHNlY3AsIHZhbHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwOwotICAgICBmbGFnd29yZCAqZmxhZ3NwOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGJmZF92bWEgKnZhbHA7Ci17Ci0gICp2YWxwICs9ICgqc2VjcCktPnZtYTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgc3R1YiBuZWVkZWQgdG8gcGVyZm9ybSBhIGNhbGwgYXNzdW1pbmcgdGhlCi0gICBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgZm9yIGNhbGxlciBhbmQgY2FsbGVlIGFyZSBpbiBDQUxMRVIgYW5kIENBTExFRQotICAgZm9yIGEgY2FsbCBmcm9tIExPQ0FUSU9OIHRvIERFU1RJTkFUSU9OLiAgQ29weSB0aGUgbmFtZSBpbnRvIFNUVUJfTkFNRS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGYzMl9ocHBhX25hbWVfb2Zfc3R1YiAoY2FsbGVyLCBjYWxsZWUsIGxvY2F0aW9uLCBkZXN0aW5hdGlvbiwgc3R1Yl9uYW1lKQotICAgICB1bnNpZ25lZCBpbnQgY2FsbGVyLCBjYWxsZWU7Ci0gICAgIGJmZF92bWEgbG9jYXRpb24sIGRlc3RpbmF0aW9uOwotICAgICBjaGFyICpzdHViX25hbWU7Ci17Ci0gIGFyZ19yZWxvY190eXBlIGFyZ19yZWxvY190eXBlc1s1XTsKLQotICBpZiAoZWxmMzJfaHBwYV9hcmdfcmVsb2NfbmVlZGVkIChjYWxsZXIsIGNhbGxlZSwgYXJnX3JlbG9jX3R5cGVzKSkKLSAgICB7Ci0gICAgICBhcmdfcmVsb2NfbG9jYXRpb24gaTsKLSAgICAgIC8qIEZpbGwgaW4gdGhlIGJhc2ljIHRlbXBsYXRlLiAgKi8KLSAgICAgIHN0cmNweSAoc3R1Yl9uYW1lLCAiX19YWF9YWF9YWF9YWF9YWF9zdHViXyIpOwotCi0gICAgICAvKiBOb3cgZml4IHRoZSBzcGVjaWZpY3MuICAqLwotICAgICAgZm9yIChpID0gQVJHMDsgaSA8PSBSRVQ7IGkrKykKLQlzd2l0Y2ggKGFyZ19yZWxvY190eXBlc1tpXSkKLQkgIHsKLQkgICAgY2FzZSBOTzoKLQkgICAgICBzdHViX25hbWVbMyAqIGkgKyAyXSA9ICdOJzsKLQkgICAgICBzdHViX25hbWVbMyAqIGkgKyAzXSA9ICdPJzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBHRjoKLQkgICAgICBzdHViX25hbWVbMyAqIGkgKyAyXSA9ICdHJzsKLQkgICAgICBzdHViX25hbWVbMyAqIGkgKyAzXSA9ICdGJzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBGRzoKLQkgICAgICBzdHViX25hbWVbMyAqIGkgKyAyXSA9ICdGJzsKLQkgICAgICBzdHViX25hbWVbMyAqIGkgKyAzXSA9ICdHJzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBHRDoKLQkgICAgICBzdHViX25hbWVbMyAqIGkgKyAyXSA9ICdHJzsKLQkgICAgICBzdHViX25hbWVbMyAqIGkgKyAzXSA9ICdEJzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBERzoKLQkgICAgICBzdHViX25hbWVbMyAqIGkgKyAyXSA9ICdEJzsKLQkgICAgICBzdHViX25hbWVbMyAqIGkgKyAzXSA9ICdHJzsKLQkgICAgICBicmVhazsKLQkgIH0KLSAgICB9Ci0gIGVsc2UKLSAgICBzdHJjcHkgKHN0dWJfbmFtZSwgIl9fX19fbG9uZ19icmFuY2hfc3R1Yl8iKTsKLX0KLQotLyogRGV0ZXJtaW5lIGlmIGFuIGFyZ3VtZW50IHJlbG9jYXRpb24gc3R1YiBpcyBuZWVkZWQgdG8gcGVyZm9ybSBhCi0gICBjYWxsIGFzc3VtaW5nIHRoZSBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgZm9yIGNhbGxlciBhbmQgY2FsbGVlCi0gICBhcmUgaW4gQ0FMTEVSIGFuZCBDQUxMRUUuICBQbGFjZSB0aGUgdHlwZSBvZiByZWxvY2F0aW9ucyAoaWYgYW55KQotICAgaW50byBzdHViX3R5cGVzX3AuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9hcmdfcmVsb2NfbmVlZGVkIChjYWxsZXIsIGNhbGxlZSwgc3R1Yl90eXBlcykKLSAgICAgdW5zaWduZWQgaW50IGNhbGxlciwgY2FsbGVlOwotICAgICBhcmdfcmVsb2NfdHlwZSBzdHViX3R5cGVzWzVdOwotewotICAvKiBTcGVjaWFsIGNhc2UgZm9yIG5vIHJlbG9jYXRpb25zLiAgKi8KLSAgaWYgKGNhbGxlciA9PSAwIHx8IGNhbGxlZSA9PSAwKQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgewotICAgICAgYXJnX2xvY2F0aW9uIGNhbGxlcl9sb2NbNV07Ci0gICAgICBhcmdfbG9jYXRpb24gY2FsbGVlX2xvY1s1XTsKLQotICAgICAgLyogRXh0cmFjdCB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBhcmd1bWVudCBhbmQgcmV0dXJuCi0JIHZhbHVlIG9uIGJvdGggdGhlIGNhbGxlciBhbmQgY2FsbGVlIHNpZGVzLiAgKi8KLSAgICAgIGNhbGxlcl9sb2NbQVJHMF0gPSBFWFRSQUNUX0FSQklUUyAoY2FsbGVyLCBBUkcwKTsKLSAgICAgIGNhbGxlZV9sb2NbQVJHMF0gPSBFWFRSQUNUX0FSQklUUyAoY2FsbGVlLCBBUkcwKTsKLSAgICAgIGNhbGxlcl9sb2NbQVJHMV0gPSBFWFRSQUNUX0FSQklUUyAoY2FsbGVyLCBBUkcxKTsKLSAgICAgIGNhbGxlZV9sb2NbQVJHMV0gPSBFWFRSQUNUX0FSQklUUyAoY2FsbGVlLCBBUkcxKTsKLSAgICAgIGNhbGxlcl9sb2NbQVJHMl0gPSBFWFRSQUNUX0FSQklUUyAoY2FsbGVyLCBBUkcyKTsKLSAgICAgIGNhbGxlZV9sb2NbQVJHMl0gPSBFWFRSQUNUX0FSQklUUyAoY2FsbGVlLCBBUkcyKTsKLSAgICAgIGNhbGxlcl9sb2NbQVJHM10gPSBFWFRSQUNUX0FSQklUUyAoY2FsbGVyLCBBUkczKTsKLSAgICAgIGNhbGxlZV9sb2NbQVJHM10gPSBFWFRSQUNUX0FSQklUUyAoY2FsbGVlLCBBUkczKTsKLSAgICAgIGNhbGxlcl9sb2NbUkVUXSA9IEVYVFJBQ1RfQVJCSVRTIChjYWxsZXIsIFJFVCk7Ci0gICAgICBjYWxsZWVfbG9jW1JFVF0gPSBFWFRSQUNUX0FSQklUUyAoY2FsbGVlLCBSRVQpOwotCi0gICAgICAvKiBDaGVjayBzb21lIHNwZWNpYWwgY29tYmluYXRpb25zLiAgVGhpcyBpcyBuZWNlc3NhcnkgdG8KLQkgZGVhbCB3aXRoIGRvdWJsZSBwcmVjaXNpb24gRlAgYXJndW1lbnRzLiAgKi8KLSAgICAgIGlmIChjYWxsZXJfbG9jW0FSRzBdID09IEFSX0ZVIHx8IGNhbGxlcl9sb2NbQVJHMV0gPT0gQVJfRlUpCi0JewotCSAgY2FsbGVyX2xvY1tBUkcwXSA9IEFSX0ZQREJMMTsKLQkgIGNhbGxlcl9sb2NbQVJHMV0gPSBBUl9OTzsKLQl9Ci0gICAgICBpZiAoY2FsbGVyX2xvY1tBUkcyXSA9PSBBUl9GVSB8fCBjYWxsZXJfbG9jW0FSRzNdID09IEFSX0ZVKQotCXsKLQkgIGNhbGxlcl9sb2NbQVJHMl0gPSBBUl9GUERCTDI7Ci0JICBjYWxsZXJfbG9jW0FSRzNdID0gQVJfTk87Ci0JfQotICAgICAgaWYgKGNhbGxlZV9sb2NbQVJHMF0gPT0gQVJfRlUgfHwgY2FsbGVlX2xvY1tBUkcxXSA9PSBBUl9GVSkKLQl7Ci0JICBjYWxsZWVfbG9jW0FSRzBdID0gQVJfRlBEQkwxOwotCSAgY2FsbGVlX2xvY1tBUkcxXSA9IEFSX05POwotCX0KLSAgICAgIGlmIChjYWxsZWVfbG9jW0FSRzJdID09IEFSX0ZVIHx8IGNhbGxlZV9sb2NbQVJHM10gPT0gQVJfRlUpCi0JewotCSAgY2FsbGVlX2xvY1tBUkcyXSA9IEFSX0ZQREJMMjsKLQkgIGNhbGxlZV9sb2NbQVJHM10gPSBBUl9OTzsKLQl9Ci0KLSAgICAgIC8qIE5vdyBsb29rIHVwIGFueSByZWxvY2F0aW9uIG5lZWRlZCBmb3IgZWFjaCBhcmd1bWVudCBhbmQgdGhlCi0JIHJldHVybiB2YWx1ZS4gICovCi0gICAgICBzdHViX3R5cGVzW0FSRzBdID0gYXJnX21pc21hdGNoZXNbY2FsbGVyX2xvY1tBUkcwXV1bY2FsbGVlX2xvY1tBUkcwXV07Ci0gICAgICBzdHViX3R5cGVzW0FSRzFdID0gYXJnX21pc21hdGNoZXNbY2FsbGVyX2xvY1tBUkcxXV1bY2FsbGVlX2xvY1tBUkcxXV07Ci0gICAgICBzdHViX3R5cGVzW0FSRzJdID0gYXJnX21pc21hdGNoZXNbY2FsbGVyX2xvY1tBUkcyXV1bY2FsbGVlX2xvY1tBUkcyXV07Ci0gICAgICBzdHViX3R5cGVzW0FSRzNdID0gYXJnX21pc21hdGNoZXNbY2FsbGVyX2xvY1tBUkczXV1bY2FsbGVlX2xvY1tBUkczXV07Ci0gICAgICBzdHViX3R5cGVzW1JFVF0gPSByZXRfbWlzbWF0Y2hlc1tjYWxsZXJfbG9jW1JFVF1dW2NhbGxlZV9sb2NbUkVUXV07Ci0KLSAgICAgIHJldHVybiAoc3R1Yl90eXBlc1tBUkcwXSAhPSBOTwotCSAgICAgIHx8IHN0dWJfdHlwZXNbQVJHMV0gIT0gTk8KLQkgICAgICB8fCBzdHViX3R5cGVzW0FSRzJdICE9IE5PCi0JICAgICAgfHwgc3R1Yl90eXBlc1tBUkczXSAhPSBOTwotCSAgICAgIHx8IHN0dWJfdHlwZXNbUkVUXSAhPSBOTyk7Ci0gICAgfQotfQotCi0vKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBzdHViIG5lZWRlZCB0byBjYWxsIGZyb20gTE9DQVRJT04gdG8gREVTVElOQVRJT04KLSAgIChhIGZ1bmN0aW9uIG5hbWVkIFNZTV9OQU1FKSwgd2l0aCBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgQ0FMTEVSIGFuZAotICAgQ0FMTEVFLiAgUmV0dXJuIHplcm8gaWYgbm8gc3R1YiBpcyBuZWVkZWQgdG8gcGVyZm9ybSBzdWNoIGEgY2FsbC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWVsZjMyX2hwcGFfc2l6ZV9vZl9zdHViIChjYWxsZWUsIGNhbGxlciwgbG9jYXRpb24sIGRlc3RpbmF0aW9uLCBzeW1fbmFtZSkKLSAgICAgdW5zaWduZWQgaW50IGNhbGxlZSwgY2FsbGVyOwotICAgICBiZmRfdm1hIGxvY2F0aW9uLCBkZXN0aW5hdGlvbjsKLSAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci17Ci0gIGFyZ19yZWxvY190eXBlIGFyZ19yZWxvY190eXBlc1s1XTsKLQotICAvKiBEZXRlcm1pbmUgaWYgYSBsb25nIGJyYW5jaCBvciBhcmd1bWVudCByZWxvY2F0aW9uIHN0dWIgaXMgbmVlZGVkLgotICAgICBJZiBhbiBhcmd1bWVudCByZWxvY2F0aW9uIHN0dWIgaXMgbmVlZGVkLCB0aGUgcmVsb2NhdGlvbiB3aWxsIGJlCi0gICAgIHN0b3JlZCBpbnRvIGFyZ19yZWxvY190eXBlcy4gICovCi0gIGlmICghKCgoaW50KShsb2NhdGlvbiAtIGRlc3RpbmF0aW9uKSA+IDB4M2ZmZmYpCi0JfHwgKChpbnQpKGxvY2F0aW9uIC0gZGVzdGluYXRpb24pIDwgKGludCkweGZmZmMwMDAwKQotCXx8IGVsZjMyX2hwcGFfYXJnX3JlbG9jX25lZWRlZCAoY2FsbGVyLCBjYWxsZWUsIGFyZ19yZWxvY190eXBlcykpKQotICAgIHJldHVybiAwOwotCi0gIC8qIFNvbWUga2luZCBvZiBzdHViIGlzIG5lZWRlZC4gIERldGVybWluZSBob3cgYmlnIGl0IG5lZWRzIHRvIGJlLgotICAgICBGaXJzdCBjaGVjayBmb3IgYXJndW1lbnQgcmVsb2NhdGlvbiBzdHVicyBhcyB0aGV5IGFsc28gaGFuZGxlCi0gICAgIGxvbmcgY2FsbHMuICBUaGVuIGNoZWNrIGZvciBsb25nIGNhbGxzIHRvIG1pbGxpY29kZSBhbmQgZmluYWxseQotICAgICB0aGUgbm9ybWFsIGxvbmcgY2FsbHMuICAqLwotICBpZiAoYXJnX3JlbG9jX3R5cGVzW0FSRzBdICE9IE5PCi0gICAgICB8fCBhcmdfcmVsb2NfdHlwZXNbQVJHMV0gIT0gTk8KLSAgICAgIHx8IGFyZ19yZWxvY190eXBlc1tBUkcyXSAhPSBOTwotICAgICAgfHwgYXJnX3JlbG9jX3R5cGVzW0FSRzNdICE9IE5PCi0gICAgICB8fCBhcmdfcmVsb2NfdHlwZXNbUkVUXSAhPSBOTykKLSAgICB7Ci0gICAgICAvKiBTb21lIGtpbmQgb2YgYXJndW1lbnQgcmVsb2NhdGlvbiBzdHViIGlzIG5lZWRlZC4gICovCi0gICAgICB1bnNpZ25lZCBpbnQgbGVuID0gMTY7Ci0gICAgICBhcmdfcmVsb2NfbG9jYXRpb24gaTsKLQotICAgICAgLyogRWFjaCBHUiBvciBGRyByZWxvY2F0aW9uIHRha2VzIDIgaW5zbnMsIGVhY2ggR0Qgb3IgREcKLQkgcmVsb2NhdGlvbiB0YWtlcyAzIGluc25zLiAgUGx1cyA0IG1vcmUgaW5zbnMgZm9yIHRoZQotICAgICAgICAgUlAgYWRqdXN0bWVudCwgbGRpbCAmIChiZSB8IGJsZSkgYW5kIGNvcHkuICAqLwotICAgICAgZm9yIChpID0gQVJHMDsgaSA8PSBSRVQ7IGkrKykKLQlzd2l0Y2ggKGFyZ19yZWxvY190eXBlc1tpXSkKLQkgIHsKLQkgICAgY2FzZSBHRjoKLQkgICAgY2FzZSBGRzoKLQkgICAgICBsZW4gKz0gODsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEdEOgotCSAgICBjYXNlIERHOgotCSAgICAgIGxlbiArPSAxMjsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgfQotCi0gICAgICAvKiBFeHRyYSBpbnN0cnVjdGlvbnMgYXJlIG5lZWRlZCBpZiB3ZSdyZSByZWxvY2F0aW5nIGEgcmV0dXJuIHZhbHVlLiAgKi8KLSAgICAgIGlmIChhcmdfcmVsb2NfdHlwZXNbUkVUXSAhPSBOTykKLQlsZW4gKz0gMTI7Ci0KLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBlbHNlIGlmICghc3RybmNtcCAoIiQkIiwgc3ltX25hbWUsIDIpCi0gICAgICAmJiBzdHJjbXAgKCIkJGR5bmNhbGwiLCBzeW1fbmFtZSkpCi0gICAgcmV0dXJuIDEyOwotICBlbHNlCi0gICAgcmV0dXJuIDE2OwotfQotCi0vKiBCdWlsZCBvbmUgbGlua2VyIHN0dWIgYXMgZGVmaW5lZCBieSB0aGUgc3R1YiBoYXNoIHRhYmxlIGVudHJ5IEdFTl9FTlRSWS4KLSAgIElOX0FSR1MgY29udGFpbnMgdGhlIHN0dWIgQkZEIGFuZCBsaW5rIGluZm8gcG9pbnRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9idWlsZF9vbmVfc3R1YiAoZ2VuX2VudHJ5LCBpbl9hcmdzKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmdlbl9lbnRyeTsKLSAgICAgUFRSIGluX2FyZ3M7Ci17Ci0gIHZvaWQgKiphcmdzID0gKHZvaWQgKiopaW5fYXJnczsKLSAgYmZkICpzdHViX2JmZCA9IChiZmQgKilhcmdzWzBdOwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKWFyZ3NbMV07Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqZW50cnk7Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqc3R1Yl9oYXNoX3RhYmxlOwotICBiZmRfYnl0ZSAqbG9jOwotICBzeW12YWx1ZSBzeW1fdmFsdWU7Ci0gIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCi0gIC8qIEluaXRpYWxpemUgcG9pbnRlcnMgdG8gdGhlIHN0dWIgaGFzaCB0YWJsZSwgdGhlIHBhcnRpY3VsYXIgZW50cnkgd2UKLSAgICAgYXJlIGJ1aWxkaW5nIGEgc3R1YiBmb3IsIGFuZCB3aGVyZSAoaW4gbWVtb3J5KSB3ZSBzaG91bGQgcGxhY2UgdGhlIHN0dWIKLSAgICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgZW50cnkgPSAoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5ICopZ2VuX2VudHJ5OwotICBzdHViX2hhc2hfdGFibGUgPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUoaW5mbyktPnN0dWJfaGFzaF90YWJsZTsKLSAgbG9jID0gc3R1Yl9oYXNoX3RhYmxlLT5sb2NhdGlvbjsKLQotICAvKiBNYWtlIGEgbm90ZSBvZiB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgc3R1YnMgZm9yIHRoaXMgZW50cnkuICAqLwotICBlbnRyeS0+b2Zmc2V0ID0gc3R1Yl9oYXNoX3RhYmxlLT5vZmZzZXQ7Ci0KLSAgLyogVGhlIHN5bWJvbCdzIG5hbWUgc3RhcnRzIGF0IG9mZnNldCAyMi4gICovCi0gIHN5bV9uYW1lID0gZW50cnktPnJvb3Quc3RyaW5nICsgMjI7Ci0KLSAgc3ltX3ZhbHVlID0gKGVudHJ5LT50YXJnZXRfdmFsdWUKLQkgICAgICAgKyBlbnRyeS0+dGFyZ2V0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkgICAgICAgKyBlbnRyeS0+dGFyZ2V0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0gIGlmIChzdHJuY21wICgiX19fX19sb25nX2JyYW5jaF9zdHViXyIsIGVudHJ5LT5yb290LnN0cmluZywgMjIpKQotICAgIHsKLSAgICAgIC8qIFRoaXMgbXVzdCBiZSBhbiBhcmd1bWVudCBvciByZXR1cm4gdmFsdWUgcmVsb2NhdGlvbiBzdHViLiAgKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgIGFyZ19yZWxvY19sb2NhdGlvbiBpOwotICAgICAgYmZkX2J5dGUgKmJlZ2luX2xvYyA9IGxvYzsKLQotICAgICAgLyogRmlyc3QgdGhlIHJldHVybiBwb2ludGVyIGFkanVzdG1lbnQuICBEZXBlbmRpbmcgb24gZXhhY3QgY2FsbGluZwotCSBzZXF1ZW5jZSB0aGlzIGluc3RydWN0aW9uIG1heSBiZSBza2lwcGVkLiAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBMRE9fTTRfUjMxX1IzMSwgbG9jKTsKLSAgICAgIGxvYyArPSA0OwotCi0gICAgICAvKiBJZiB3ZSBhcmUgcmVsb2NhdGluZyBhIHJldHVybiB2YWx1ZSwgdGhlbiB3ZSdyZSBnb2luZyB0byBoYXZlCi0JIHRvIHJldHVybiBpbnRvIHRoZSBzdHViLiAgU28gd2UgaGF2ZSB0byBzYXZlIG9mZiB0aGUgdXNlcidzCi0JIHJldHVybiBwb2ludGVyIGludG8gdGhlIHN0YWNrIGF0IFJQJy4gICovCi0gICAgICBpZiAoc3RybmNtcCAoZW50cnktPnJvb3Quc3RyaW5nICsgMTQsICJOTyIsIDIpKQotCXsKLQkgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBTVFdfUjMxX004UjMwLCBsb2MpOwotCSAgbG9jICs9IDQ7Ci0JfQotCi0gICAgICAvKiBJdGVyYXRlIG92ZXIgdGhlIGFyZ3VtZW50IHJlbG9jYXRpb25zLCBlbWl0dGluZyBpbnN0cnVjdGlvbnMKLQkgdG8gbW92ZSB0aGVtIGFyb3VuZCBhcyBuZWNlc3NhcnkuICAqLwotICAgICAgZm9yIChpID0gQVJHMDsgaSA8PSBBUkczOyBpKyspCi0JewotCSAgaWYgKCFzdHJuY21wIChlbnRyeS0+cm9vdC5zdHJpbmcgKyAzICogaSArIDIsICJHRiIsIDIpKQotCSAgICB7Ci0JICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIFNUV19BUkdfTTE2UjMwIHwgKCgyNiAtIGkpIDw8IDE2KSwgbG9jKTsKLQkgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgRkxEV19NMTZSMzBfRkFSRyB8ICg0ICsgaSksIGxvYyArIDQpOwotCSAgICAgIGxvYyArPSA4OwotCSAgICB9Ci0JICBlbHNlIGlmICghc3RybmNtcCAoZW50cnktPnJvb3Quc3RyaW5nICsgMyAqIGkgKyAyLCAiRkciLCAyKSkKLQkgICAgewotCSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBGU1RXX0ZBUkdfTTE2UjMwIHwgKDQgKyBpKSwgbG9jKTsKLQkgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgTERXX00xNlIzMF9BUkcgfCAoKDI2IC0gaSkgPDwgMTYpLCBsb2MgKyA0KTsKLQkgICAgICBsb2MgKz0gODsKLQkgICAgfQotCSAgZWxzZSBpZiAoIXN0cm5jbXAgKGVudHJ5LT5yb290LnN0cmluZyArIDMgKiBpICsgMiwgIkdEIiwgMikpCi0JICAgIHsKLQkgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgU1RXX0FSR19NMTJSMzAgfCAoKDI2IC0gaSkgPDwgMTYpLCBsb2MpOwotCSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBTVFdfQVJHX00xNlIzMCB8ICgoMjUgLSBpKSA8PCAxNiksIGxvYyArIDQpOwotCSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBGTEREX00xNlIzMF9GQVJHIHwgKDUgKyBpKSwgbG9jICsgOCk7Ci0JICAgICAgbG9jICs9IDEyOwotCSAgICB9Ci0JICBlbHNlIGlmICghc3RybmNtcCAoZW50cnktPnJvb3Quc3RyaW5nICsgMyAqIGkgKyAyLCAiREciLCAyKSkKLQkgICAgewotCSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBGU1REX0ZBUkdfTTE2UjMwIHwgKDUgKyBpKSwgbG9jKTsKLQkgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgTERXX00xMlIzMF9BUkcgfCAoKDI2IC0gaSkgPDwgMTYpLCBsb2MgKyA0KTsKLQkgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgTERXX00xNlIzMF9BUkcgfCAoKDI1IC0gaSkgPDwgMTYpLCBsb2MgKyA4KTsKLQkgICAgICBsb2MgKz0gMTI7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIExvYWQgdGhlIGhpZ2ggYml0cyBvZiB0aGUgdGFyZ2V0IGFkZHJlc3MgaW50byAlcjEuICAqLwotICAgICAgaW5zbiA9IGhwcGFfcmVidWlsZF9pbnNuIChzdHViX2JmZCwgTERJTF9SMSwKLQkJCQlocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCAwLCBlX2xyc2VsKSwgMjEpOwotICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIGluc24sIGxvYyk7Ci0gICAgICBsb2MgKz0gNDsKLQotICAgICAgLyogSWYgd2UgYXJlIHJlbG9jYXRpbmcgYSByZXR1cm4gdmFsdWUsIHRoZW4gd2UncmUgZ29pbmcgdG8gaGF2ZQotCSB0byByZXR1cm4gaW50byB0aGUgc3R1YiwgdGhlbiBwZXJmb3JtIHRoZSByZXR1cm4gdmFsdWUgcmVsb2NhdGlvbi4gICovCi0gICAgICBpZiAoc3RybmNtcCAoZW50cnktPnJvb3Quc3RyaW5nICsgMTQsICJOTyIsIDIpKQotCXsKLQkgIC8qIFRvIHJldHVybiB0byB0aGUgc3R1YiB3ZSAiYmxlIiB0byB0aGUgdGFyZ2V0IGFuZCBjb3B5IHRoZSByZXR1cm4KLQkgICAgIHBvaW50ZXIgZnJvbSAlcjMxIGludG8gJXIyLiAgKi8KLQkgIGluc24gPSBocHBhX3JlYnVpbGRfaW5zbiAoc3R1Yl9iZmQsCi0JCQkJICAgIEJMRV9TUjRfUjEsCi0JCQkJICAgIGhwcGFfZmllbGRfYWRqdXN0IChzeW1fdmFsdWUsIDAsCi0JCQkJCQkgICAgICAgZV9ycnNlbCkgPj4gMiwKLQkJCQkgICAgMTcpOwotCSAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIGluc24sIGxvYyk7Ci0JICBiZmRfcHV0XzMyIChzdHViX2JmZCwgQ09QWV9SMzFfUjIsIGxvYyArIDQpOwotCi0JICAvKiBSZWxvYWQgdGhlIHJldHVybiBwb2ludGVyIGZvciBvdXIgY2FsbGVyIGZyb20gdGhlIHN0YWNrLiAgKi8KLQkgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBMRFdfTThSMzBfUjMxLCBsb2MgKyA4KTsKLQkgIGxvYyArPSAxMjsKLQotCSAgLyogUGVyZm9ybSB0aGUgcmV0dXJuIHZhbHVlIHJlbG9jYXRpb24uICAqLwotCSAgaWYgKCFzdHJuY21wIChlbnRyeS0+cm9vdC5zdHJpbmcgKyAxNCwgIkdGIiwgMikpCi0JICAgIHsKLQkgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgU1RXX0FSR19NMTZSMzAgfCAoMjggPDwgMTYpLCBsb2MpOwotCSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBGTERXX00xNlIzMF9GQVJHIHwgNCwgbG9jICsgNCk7Ci0JICAgICAgbG9jICs9IDg7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCFzdHJuY21wIChlbnRyeS0+cm9vdC5zdHJpbmcgKyAxNCwgIkZHIiwgMikpCi0JICAgIHsKLQkgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgRlNUV19GQVJHX00xNlIzMCB8IDQsIGxvYyk7Ci0JICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIExEV19NMTZSMzBfQVJHIHwgKDI4IDw8IDE2KSwgbG9jICsgNCk7Ci0JICAgICAgbG9jICs9IDg7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCFzdHJuY21wIChlbnRyeS0+cm9vdC5zdHJpbmcgKyAyLCAiR0QiLCAyKSkKLQkgICAgewotCSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBTVFdfQVJHX00xMlIzMCB8ICgyOCA8PCAxNiksIGxvYyk7Ci0JICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIFNUV19BUkdfTTE2UjMwIHwgKDI5IDw8IDE2KSwgbG9jICsgNCk7Ci0JICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIEZMRERfTTE2UjMwX0ZBUkcgfCA0LCBsb2MgKyA4KTsKLQkgICAgICBsb2MgKz0gMTI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCFzdHJuY21wIChlbnRyeS0+cm9vdC5zdHJpbmcgKyAyLCAiREciLCAyKSkKLQkgICAgewotCSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBGU1REX0ZBUkdfTTE2UjMwIHwgNCwgbG9jKTsKLQkgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgTERXX00xMlIzMF9BUkcgfCAoMjggPDwgMTYpLCBsb2MgKyA0KTsKLQkgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgTERXX00xNlIzMF9BUkcgfCAoMjkgPDwgMTYpLCBsb2MgKyA4KTsKLQkgICAgICBsb2MgKz0gMTI7Ci0JICAgIH0KLQkgIC8qIEJyYW5jaCBiYWNrIHRvIHRoZSB1c2VyJ3MgY29kZSBub3cuICAqLwotCSAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIEJWX05fMF9SMzEsIGxvYyk7Ci0JICBsb2MgKz0gNDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTm8gcmV0dXJuIHZhbHVlIHJlbG9jYXRpb24sIHNvIHdlIGNhbiBzaW1wbHkgImJlIiB0byB0aGUKLQkgICAgIHRhcmdldCBhbmQgY29weSBvdXQgcmV0dXJuIHBvaW50ZXIgaW50byAlcjIuICAqLwotCSAgaW5zbiA9IGhwcGFfcmVidWlsZF9pbnNuIChzdHViX2JmZCwgQkVfU1I0X1IxLAotCQkJCSAgICBocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCAwLAotCQkJCQkJICAgICAgIGVfcnJzZWwpID4+IDIsIDE3KTsKLQkgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBpbnNuLCBsb2MpOwotCSAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIENPUFlfUjMxX1IyLCBsb2MgKyA0KTsKLQkgIGxvYyArPSA4OwotCX0KLQotICAgICAgLyogVXBkYXRlIHRoZSBsb2NhdGlvbiBhbmQgb2Zmc2V0cy4gICovCi0gICAgICBzdHViX2hhc2hfdGFibGUtPmxvY2F0aW9uICs9IChsb2MgLSBiZWdpbl9sb2MpOwotICAgICAgc3R1Yl9oYXNoX3RhYmxlLT5vZmZzZXQgKz0gKGxvYyAtIGJlZ2luX2xvYyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQ3JlYXRlIG9uZSBvZiB0d28gdmFyaWFudCBsb25nIGJyYW5jaCBzdHVicy4gIE9uZSBmb3IgJCRkeW5jYWxsIGFuZAotCSBub3JtYWwgY2FsbHMsIHRoZSBvdGhlciBmb3IgY2FsbHMgdG8gbWlsbGljb2RlLiAgKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgIGludCBtaWxsaWNvZGVfY2FsbCA9IDA7Ci0KLSAgICAgIGlmICghc3RybmNtcCAoIiQkIiwgc3ltX25hbWUsIDIpICYmIHN0cmNtcCAoIiQkZHluY2FsbCIsIHN5bV9uYW1lKSkKLQltaWxsaWNvZGVfY2FsbCA9IDE7Ci0KLSAgICAgIC8qIEZpcnN0IHRoZSByZXR1cm4gcG9pbnRlciBhZGp1c3RtZW50LiAgRGVwZW5kaW5nIG9uIGV4YWN0IGNhbGxpbmcKLQkgc2VxdWVuY2UgdGhpcyBpbnN0cnVjdGlvbiBtYXkgYmUgc2tpcHBlZC4gICovCi0gICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgTERPX000X1IzMV9SMzEsIGxvYyk7Ci0KLSAgICAgIC8qIFRoZSBuZXh0IHR3byBpbnN0cnVjdGlvbnMgYXJlIHRoZSBsb25nIGJyYW5jaCBpdHNlbGYuICBBIGxvbmcgYnJhbmNoCi0JIGlzIGZvcm1lZCB3aXRoICJsZGlsIiBsb2FkaW5nIHRoZSB1cHBlciBiaXRzIG9mIHRoZSB0YXJnZXQgYWRkcmVzcwotCSBpbnRvIGEgcmVnaXN0ZXIsIHRoZW4gYnJhbmNoaW5nIHdpdGggImJlIiB3aGljaCBhZGRzIGluIHRoZSBsb3dlciBiaXRzLgotCSBMb25nIGJyYW5jaGVzIHRvIG1pbGxpY29kZSBudWxsaWZ5IHRoZSBkZWxheSBzbG90IG9mIHRoZSAiYmUiLiAgKi8KLSAgICAgIGluc24gPSBocHBhX3JlYnVpbGRfaW5zbiAoc3R1Yl9iZmQsIExESUxfUjEsCi0JCQkJaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgMCwgZV9scnNlbCksIDIxKTsKLSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBpbnNuLCBsb2MgKyA0KTsKLSAgICAgIGluc24gPSBocHBhX3JlYnVpbGRfaW5zbiAoc3R1Yl9iZmQsIEJFX1NSNF9SMSB8IChtaWxsaWNvZGVfY2FsbCA/IDIgOiAwKSwKLQkJCQlocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCAwLCBlX3Jyc2VsKSA+PiAyLAotCQkJCTE3KTsKLSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBpbnNuLCBsb2MgKyA4KTsKLQotICAgICAgaWYgKCFtaWxsaWNvZGVfY2FsbCkKLQl7Ci0JICAvKiBUaGUgc2VxdWVuY2UgdG8gY2FsbCB0aGlzIHN0dWIgcGxhY2VzIHRoZSByZXR1cm4gcG9pbnRlciBpbnRvICVyMzEsCi0JICAgICB0aGUgZmluYWwgdGFyZ2V0IGV4cGVjdHMgdGhlIHJldHVybiBwb2ludGVyIGluICVyMiwgc28gY29weSB0aGUKLQkgICAgICByZXR1cm4gcG9pbnRlciBpbnRvIHRoZSBwcm9wZXIgcmVnaXN0ZXIuICAqLwotCSAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIENPUFlfUjMxX1IyLCBsb2MgKyAxMik7Ci0KLQkgIC8qIFVwZGF0ZSB0aGUgbG9jYXRpb24gYW5kIG9mZnNldHMuICAqLwotCSAgc3R1Yl9oYXNoX3RhYmxlLT5sb2NhdGlvbiArPSAxNjsKLQkgIHN0dWJfaGFzaF90YWJsZS0+b2Zmc2V0ICs9IDE2OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBVcGRhdGUgdGhlIGxvY2F0aW9uIGFuZCBvZmZzZXRzLiAgKi8KLQkgIHN0dWJfaGFzaF90YWJsZS0+bG9jYXRpb24gKz0gMTI7Ci0JICBzdHViX2hhc2hfdGFibGUtPm9mZnNldCArPSAxMjsKLQl9Ci0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBFeHRlcm5hbCBlbnRyeSBwb2ludHMgZm9yIHNpemluZyBhbmQgYnVpbGRpbmcgbGlua2VyIHN0dWJzLiAgKi8KLQotLyogQnVpbGQgYWxsIHRoZSBzdHVicyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgb3V0cHV0IGZpbGUuICBUaGUKLSAgIHN0dWJzIGFyZSBrZXB0IGluIGEgaGFzaCB0YWJsZSBhdHRhY2hlZCB0byB0aGUgbWFpbiBsaW5rZXIgaGFzaAotICAgdGFibGUuICBUaGlzIGlzIGNhbGxlZCB2aWEgaHBwYWVsZl9maW5pc2ggaW4gdGhlIGxpbmtlci4gICovCi0KLWJvb2xlYW4KLWVsZjMyX2hwcGFfYnVpbGRfc3R1YnMgKHN0dWJfYmZkLCBpbmZvKQotICAgICBiZmQgKnN0dWJfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgLyogVGhlIHN0dWIgQkZEIG9ubHkgaGFzIG9uZSBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKnN0dWJfc2VjID0gc3R1Yl9iZmQtPnNlY3Rpb25zOwotICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKnRhYmxlOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgdm9pZCAqYXJnc1syXTsKLQotICAvKiBTbyB3ZSBjYW4gcGFzcyBib3RoIHRoZSBCRkQgZm9yIHRoZSBzdHVicyBhbmQgdGhlIGxpbmsgaW5mbwotICAgICBzdHJ1Y3R1cmUgdG8gdGhlIHJvdXRpbmUgd2hpY2ggYWN0dWFsbHkgYnVpbGRzIHN0dWJzLiAgKi8KLSAgYXJnc1swXSA9IHN0dWJfYmZkOwotICBhcmdzWzFdID0gaW5mbzsKLQotICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gaG9sZCB0aGUgbGlua2VyIHN0dWJzLiAgKi8KLSAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKHN0dWJfYmZkLCBzdHViX3NlYyk7Ci0gIHN0dWJfc2VjLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIGJmZF96YWxsb2MgKHN0dWJfYmZkLCBzaXplKTsKLSAgaWYgKHN0dWJfc2VjLT5jb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgdGFibGUgPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUoaW5mbyktPnN0dWJfaGFzaF90YWJsZTsKLSAgdGFibGUtPmxvY2F0aW9uID0gc3R1Yl9zZWMtPmNvbnRlbnRzOwotCi0gIC8qIEJ1aWxkIHRoZSBzdHVicyBhcyBkaXJlY3RlZCBieSB0aGUgc3R1YiBoYXNoIHRhYmxlLiAgKi8KLSAgZWxmMzJfaHBwYV9zdHViX2hhc2hfdHJhdmVyc2UgKHRhYmxlLCBlbGYzMl9ocHBhX2J1aWxkX29uZV9zdHViLCBhcmdzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGV0ZXJtaW5lIGFuZCBzZXQgdGhlIHNpemUgb2YgdGhlIHN0dWIgc2VjdGlvbiBmb3IgYSBmaW5hbCBsaW5rLgotCi0gICBUaGUgYmFzaWMgaWRlYSBoZXJlIGlzIHRvIGV4YW1pbmUgYWxsIHRoZSByZWxvY2F0aW9ucyBsb29raW5nIGZvcgotICAgUEMtcmVsYXRpdmUgY2FsbHMgdG8gYSB0YXJnZXQgdGhhdCBpcyB1bnJlYWNoYWJsZSB3aXRoIGEgImJsIgotICAgaW5zdHJ1Y3Rpb24gb3IgY2FsbHMgd2hlcmUgdGhlIGNhbGxlciBhbmQgY2FsbGVlIGRpc2FncmVlIG9uIHRoZQotICAgbG9jYXRpb24gb2YgdGhlaXIgYXJndW1lbnRzIG9yIHJldHVybiB2YWx1ZS4gICovCi0KLWJvb2xlYW4KLWVsZjMyX2hwcGFfc2l6ZV9zdHVicyAoc3R1Yl9iZmQsIG91dHB1dF9iZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICpzdHViX2JmZDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotewotICBiZmQgKmlucHV0X2JmZDsKLSAgYXNlY3Rpb24gKnNlY3Rpb24sICpzdHViX3NlYyA9IDA7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zLCAqaXN5bSwgKiphbGxfbG9jYWxfc3ltczsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRfc3ltcywgKmVzeW07Ci0gIHVuc2lnbmVkIGludCBpLCBpbmRleCwgYmZkX2NvdW50ID0gMDsKLSAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICpzdHViX2hhc2hfdGFibGUgPSAwOwotICBzdHJ1Y3QgZWxmMzJfaHBwYV9hcmdzX2hhc2hfdGFibGUgKmFyZ3NfaGFzaF90YWJsZSA9IDA7Ci0KLSAgLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBzdHViIGhhc2ggdGFibGUuICAqLwotICBzdHViX2hhc2hfdGFibGUgPSAoKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqKQotCQkgICAgIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlKSkpOwotICBpZiAoIXN0dWJfaGFzaF90YWJsZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoIWVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlX2luaXQgKHN0dWJfaGFzaF90YWJsZSwgc3R1Yl9iZmQsCi0JCQkJCWVsZjMyX2hwcGFfc3R1Yl9oYXNoX25ld2Z1bmMpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIExpa2V3aXNlIGZvciB0aGUgYXJndW1lbnQgbG9jYXRpb24gaGFzaCB0YWJsZS4gICovCi0gIGFyZ3NfaGFzaF90YWJsZSA9ICgoc3RydWN0IGVsZjMyX2hwcGFfYXJnc19oYXNoX3RhYmxlICopCi0JCSAgICAgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZWxmMzJfaHBwYV9hcmdzX2hhc2hfdGFibGUpKSk7Ci0gIGlmICghYXJnc19oYXNoX3RhYmxlKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICghZWxmMzJfaHBwYV9hcmdzX2hhc2hfdGFibGVfaW5pdCAoYXJnc19oYXNoX3RhYmxlLAotCQkJCQllbGYzMl9ocHBhX2FyZ3NfaGFzaF9uZXdmdW5jKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBBdHRhY2ggdGhlIGhhc2ggdGFibGVzIHRvIHRoZSBtYWluIGhhc2ggdGFibGUuICAqLwotICBlbGYzMl9ocHBhX2hhc2hfdGFibGUobGlua19pbmZvKS0+c3R1Yl9oYXNoX3RhYmxlID0gc3R1Yl9oYXNoX3RhYmxlOwotICBlbGYzMl9ocHBhX2hhc2hfdGFibGUobGlua19pbmZvKS0+YXJnc19oYXNoX3RhYmxlID0gYXJnc19oYXNoX3RhYmxlOwotCi0gIC8qIENvdW50IHRoZSBudW1iZXIgb2YgaW5wdXQgQkZEcy4gICovCi0gIGZvciAoaW5wdXRfYmZkID0gbGlua19pbmZvLT5pbnB1dF9iZmRzOwotICAgICAgIGlucHV0X2JmZCAhPSBOVUxMOwotICAgICAgIGlucHV0X2JmZCA9IGlucHV0X2JmZC0+bGlua19uZXh0KQotICAgICBiZmRfY291bnQrKzsKLQotICAvKiBXZSB3YW50IHRvIHJlYWQgaW4gc3ltYm9sIGV4dGVuc2lvbiByZWNvcmRzIG9ubHkgb25jZS4gIFRvIGRvIHRoaXMKLSAgICAgd2UgbmVlZCB0byByZWFkIGluIHRoZSBsb2NhbCBzeW1ib2xzIGluIHBhcmFsbGVsIGFuZCBzYXZlIHRoZW0gZm9yCi0gICAgIGxhdGVyIHVzZTsgc28gaG9sZCBwb2ludGVycyB0byB0aGUgbG9jYWwgc3ltYm9scyBpbiBhbiBhcnJheS4gICovCi0gIGFsbF9sb2NhbF9zeW1zCi0gICAgPSAoRWxmX0ludGVybmFsX1N5bSAqKikgYmZkX21hbGxvYyAoc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltICopCi0JCQkJCSogYmZkX2NvdW50KTsKLSAgaWYgKGFsbF9sb2NhbF9zeW1zID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIG1lbXNldCAoYWxsX2xvY2FsX3N5bXMsIDAsIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSAqKSAqIGJmZF9jb3VudCk7Ci0KLSAgLyogV2FsayBvdmVyIGFsbCB0aGUgaW5wdXQgQkZEcyBhZGRpbmcgZW50cmllcyB0byB0aGUgYXJncyBoYXNoIHRhYmxlCi0gICAgIGZvciBhbGwgdGhlIGV4dGVybmFsIGZ1bmN0aW9ucy4gICovCi0gIGZvciAoaW5wdXRfYmZkID0gbGlua19pbmZvLT5pbnB1dF9iZmRzLCBpbmRleCA9IDA7Ci0gICAgICAgaW5wdXRfYmZkICE9IE5VTEw7Ci0gICAgICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQsIGluZGV4KyspCi0gICAgewotICAgICAgLyogV2UnbGwgbmVlZCB0aGUgc3ltYm9sIHRhYmxlIGluIGEgc2Vjb25kLiAgKi8KLSAgICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICAgICAgaWYgKHN5bXRhYl9oZHItPnNoX2luZm8gPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgbmVlZCBhbiBhcnJheSBvZiB0aGUgbG9jYWwgc3ltYm9scyBhdHRhY2hlZCB0byB0aGUgaW5wdXQgYmZkLgotCSBVbmZvcnR1bmF0ZWx5LCB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIHJlYWQgJiBzd2FwIHRoZW0gaW4uICAqLwotICAgICAgbG9jYWxfc3ltcwotCT0gKEVsZl9JbnRlcm5hbF9TeW0gKikgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCQkgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpOwotICAgICAgaWYgKGxvY2FsX3N5bXMgPT0gTlVMTCkKLQl7Ci0JICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JICAgIGlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0JICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgICBhbGxfbG9jYWxfc3ltc1tpbmRleF0gPSBsb2NhbF9zeW1zOwotCi0gICAgICBleHRfc3ltcwotCT0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJCSAgICAgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOwotICAgICAgaWYgKGV4dF9zeW1zID09IE5VTEwpCi0JewotCSAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotCSAgICBpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3JlYWQgKGV4dF9zeW1zLCAxLAotCQkgICAgICAgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCSogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSwgaW5wdXRfYmZkKQotCSAgIT0gKHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKQotCXsKLQkgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkgICAgaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkgIGZyZWUgKGV4dF9zeW1zKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgLyogU3dhcCB0aGUgbG9jYWwgc3ltYm9scyBpbi4gICovCi0gICAgICBpc3ltID0gbG9jYWxfc3ltczsKLSAgICAgIGVzeW0gPSBleHRfc3ltczsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzeW10YWJfaGRyLT5zaF9pbmZvOyBpKyssIGVzeW0rKywgaXN5bSsrKQotCSBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgaXN5bSk7Ci0KLSAgICAgIC8qIE5vdyB3ZSBjYW4gZnJlZSB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0gICAgICBmcmVlIChleHRfc3ltcyk7Ci0KLSAgICAgIGlmIChlbGYzMl9ocHBhX3JlYWRfc3ltZXh0X2luZm8gKGlucHV0X2JmZCwgc3ltdGFiX2hkciwgYXJnc19oYXNoX3RhYmxlLAotCQkJCSAgICAgICBsb2NhbF9zeW1zKSA9PSBmYWxzZSkKLQl7Ci0JICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JICAgIGlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0JICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIE1hZ2ljIGFzIHdlIGtub3cgdGhlIHN0dWIgYmZkIG9ubHkgaGFzIG9uZSBzZWN0aW9uLiAgKi8KLSAgc3R1Yl9zZWMgPSBzdHViX2JmZC0+c2VjdGlvbnM7Ci0KLSAgLyogSWYgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSwgdGhlbiB3ZSBkb24ndAotICAgICBoYXZlIHRvIGV4YW1pbmUgdGhlIHJlbG9jcy4gICovCi0gIGlmIChsaW5rX2luZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgYXJndW1lbnQgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIGFsbCB0aGUgZ2xvYmFsCi0gICAgIGZ1bmN0aW9ucyB3ZSBjYW4gc3RhcnQgbG9va2luZyBmb3Igc3R1YnMuICAqLwotICBmb3IgKGlucHV0X2JmZCA9IGxpbmtfaW5mby0+aW5wdXRfYmZkcywgaW5kZXggPSAwOwotICAgICAgIGlucHV0X2JmZCAhPSBOVUxMOwotICAgICAgIGlucHV0X2JmZCA9IGlucHV0X2JmZC0+bGlua19uZXh0LCBpbmRleCsrKQotICAgIHsKLSAgICAgIC8qIFdlJ2xsIG5lZWQgdGhlIHN5bWJvbCB0YWJsZSBpbiBhIHNlY29uZC4gICovCi0gICAgICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIGlmIChzeW10YWJfaGRyLT5zaF9pbmZvID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIGxvY2FsX3N5bXMgPSBhbGxfbG9jYWxfc3ltc1tpbmRleF07Ci0KLSAgICAgIC8qIFdhbGsgb3ZlciBlYWNoIHNlY3Rpb24gYXR0YWNoZWQgdG8gdGhlIGlucHV0IGJmZC4gICovCi0gICAgICBmb3IgKHNlY3Rpb24gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOwotCSAgIHNlY3Rpb24gIT0gTlVMTDsKLQkgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU2hkciAqaW5wdXRfcmVsX2hkcjsKLQkgIEVsZjMyX0V4dGVybmFsX1JlbGEgKmV4dGVybmFsX3JlbG9jcywgKmVyZWxhZW5kLCAqZXJlbGE7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzLCAqaXJlbGFlbmQsICppcmVsYTsKLQotCSAgLyogSWYgdGhlcmUgYXJlbid0IGFueSByZWxvY3MsIHRoZW4gdGhlcmUncyBub3RoaW5nIHRvIGRvLiAgKi8KLQkgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkgICAgICB8fCBzZWN0aW9uLT5yZWxvY19jb3VudCA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBleHRlcm5hbCByZWxvY2F0aW9ucy4gICovCi0JICBleHRlcm5hbF9yZWxvY3MKLQkgICAgPSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKLQkgICAgICAgYmZkX21hbGxvYyAoc2VjdGlvbi0+cmVsb2NfY291bnQKLQkJCSAgICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKSkpOwotCSAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotCQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICAvKiBMaWtld2lzZSBmb3IgdGhlIGludGVybmFsIHJlbG9jYXRpb25zLiAgKi8KLQkgIGludGVybmFsX3JlbG9jcwotCSAgICA9ICgoRWxmX0ludGVybmFsX1JlbGEgKikKLQkgICAgICAgYmZkX21hbGxvYyAoc2VjdGlvbi0+cmVsb2NfY291bnQgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWxhKSkpOwotCSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0JICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIHJlbG9jcy4gICovCi0JICBpbnB1dF9yZWxfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxfaGRyOwotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIGlucHV0X3JlbF9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfcmVhZCAoZXh0ZXJuYWxfcmVsb2NzLCAxLCBpbnB1dF9yZWxfaGRyLT5zaF9zaXplLAotCQkJICAgaW5wdXRfYmZkKSAhPSBpbnB1dF9yZWxfaGRyLT5zaF9zaXplKQotCSAgICB7Ci0JICAgICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLQkgICAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgLyogU3dhcCBpbiB0aGUgcmVsb2NzLiAgKi8KLQkgIGVyZWxhID0gZXh0ZXJuYWxfcmVsb2NzOwotCSAgZXJlbGFlbmQgPSBlcmVsYSArIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotCSAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBmb3IgKDsgZXJlbGEgPCBlcmVsYWVuZDsgZXJlbGErKywgaXJlbGErKykKLQkgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX2luIChpbnB1dF9iZmQsIGVyZWxhLCBpcmVsYSk7Ci0KLQkgIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgZXh0ZXJuYWwgcmVsb2NzLCBmcmVlIHRoZW0uICAqLwotCSAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLQotCSAgLyogTm93IGV4YW1pbmUgZWFjaCByZWxvY2F0aW9uLiAgKi8KLQkgIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgaXJlbGFlbmQgPSBpcmVsYSArIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotCSAgZm9yICg7IGlyZWxhIDwgaXJlbGFlbmQ7IGlyZWxhKyspCi0JICAgIHsKLQkgICAgICBsb25nIHJfdHlwZSwgY2FsbGVlX2FyZ3MsIGNhbGxlcl9hcmdzLCBzaXplX29mX3N0dWI7Ci0JICAgICAgdW5zaWduZWQgbG9uZyByX2luZGV4OwotCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoYXNoOwotCSAgICAgIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqc3R1Yl9oYXNoOwotCSAgICAgIHN0cnVjdCBlbGYzMl9ocHBhX2FyZ3NfaGFzaF9lbnRyeSAqYXJnc19oYXNoOwotCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLQkgICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLQkgICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLQkgICAgICBzeW12YWx1ZSBzeW1fdmFsdWU7Ci0JICAgICAgYmZkX3ZtYSBsb2NhdGlvbiwgZGVzdGluYXRpb247Ci0JICAgICAgY2hhciAqbmV3X25hbWUgPSBOVUxMOwotCi0JICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChpcmVsYS0+cl9pbmZvKTsKLQkgICAgICByX2luZGV4ID0gRUxGMzJfUl9TWU0gKGlyZWxhLT5yX2luZm8pOwotCi0JICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfUEFSSVNDX1VOSU1QTEVNRU5URUQpCi0JCXsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCQkgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJICAgIGlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgLyogT25seSBsb29rIGZvciBzdHVicyBvbiBjYWxsIGluc3RydWN0aW9ucyBvciBwbGFiZWwKLQkJIHJlZmVyZW5jZXMuICAqLwotCSAgICAgIGlmIChyX3R5cGUgIT0gUl9QQVJJU0NfUENSRUwxN0YKLQkJICAmJiByX3R5cGUgIT0gUl9QQVJJU0NfUExBQkVMMzIKLQkJICAmJiByX3R5cGUgIT0gUl9QQVJJU0NfUExBQkVMMjFMCi0JCSAgJiYgcl90eXBlICE9IFJfUEFSSVNDX1BMQUJFTDE0UikKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBOb3cgZGV0ZXJtaW5lIHRoZSBjYWxsIHRhcmdldCwgaXRzIG5hbWUsIHZhbHVlLCBzZWN0aW9uCi0JCSBhbmQgYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzLiAgKi8KLQkgICAgICBoYXNoID0gTlVMTDsKLQkgICAgICBzeW0gPSBOVUxMOwotCSAgICAgIHN5bV9zZWMgPSBOVUxMOwotCSAgICAgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkJewotCQkgIC8qIEl0J3MgYSBsb2NhbCBzeW1ib2wuICAqLwotCQkgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0KLQkJICBzeW0gPSBsb2NhbF9zeW1zICsgcl9pbmRleDsKLQkJICBoZHIgPSBlbGZfZWxmc2VjdGlvbnMgKGlucHV0X2JmZClbc3ltLT5zdF9zaG5keF07Ci0JCSAgc3ltX3NlYyA9IGhkci0+YmZkX3NlY3Rpb247Ci0JCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQkgICAgICBzeW0tPnN0X25hbWUpOwotCQkgIHN5bV92YWx1ZSA9IChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTgotCQkJICAgICAgID8gMCA6IHN5bS0+c3RfdmFsdWUpOwotCQkgIGRlc3RpbmF0aW9uID0gKHN5bV92YWx1ZQotCQkJCSArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQKLQkJCQkgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotCQkgIC8qIFRhY2sgb24gYW4gSUQgc28gd2UgY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgbG9jYWwKLQkJICAgICBzeW1ib2wgaW4gdGhlIHN0dWIgb3IgYXJnIGluZm8gaGFzaCB0YWJsZXMuICAqLwotCQkgIG5ld19uYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChzeW1fbmFtZSkgKyAxMCk7Ci0JCSAgaWYgKG5ld19uYW1lID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgfQotCQkgIHNwcmludGYgKG5ld19uYW1lLCAiJXNfJTA4eCIsIHN5bV9uYW1lLCAoaW50KXN5bV9zZWMpOwotCQkgIHN5bV9uYW1lID0gbmV3X25hbWU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBJdCdzIGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0JCSAgbG9uZyBpbmRleDsKLQotCQkgIGluZGV4ID0gcl9pbmRleCAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JCSAgaGFzaCA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2luZGV4XTsKLQkJICBpZiAoaGFzaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoYXNoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgewotCQkgICAgICBzeW1fc2VjID0gaGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgICAgICBzeW1fbmFtZSA9IGhhc2gtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCSAgICAgIHN5bV92YWx1ZSA9IGhhc2gtPnJvb3QudS5kZWYudmFsdWU7Ci0JCSAgICAgIGRlc3RpbmF0aW9uID0gKHN5bV92YWx1ZQotCQkJCSAgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgICArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBhcmdzX2hhc2ggPSBlbGYzMl9ocHBhX2FyZ3NfaGFzaF9sb29rdXAgKGFyZ3NfaGFzaF90YWJsZSwKLQkJCQkJCSAgICAgICBzeW1fbmFtZSwgZmFsc2UsIGZhbHNlKTsKLQotCSAgICAgIC8qIEdldCBib3RoIGNhbGxlciBhbmQgY2FsbGVlIGFyZ3VtZW50IGluZm9ybWF0aW9uLiAgKi8KLQkgICAgICBpZiAoYXJnc19oYXNoID09IE5VTEwpCi0JCWNhbGxlZV9hcmdzID0gMDsKLQkgICAgICBlbHNlCi0JCWNhbGxlZV9hcmdzID0gYXJnc19oYXNoLT5hcmdfYml0czsKLQotCSAgICAgIC8qIEZvciBjYWxscyBnZXQgdGhlIGNhbGxlcidzIGJpdHMgZnJvbSB0aGUgYWRkZW5kIG9mCi0JCSB0aGUgY2FsbCByZWxvY2F0aW9uLiAgRm9yIFBMQUJFTFMgdGhlIGNhbGxlcidzIGJpdHMKLQkJIGFyZSBhc3N1bWVkIHRvIGhhdmUgYWxsIGFyZ3MgJiByZXR1cm4gdmFsdWVzIGluIGdlbmVyYWwKLQkJIHJlZ2lzdGVycyAoMHgxNTUpLiAgKi8KLQkgICAgICBpZiAocl90eXBlID09IFJfUEFSSVNDX1BDUkVMMTdGKQotCQljYWxsZXJfYXJncyA9IEhQUEFfUl9BUkdfUkVMT0MgKGlyZWxhLT5yX2FkZGVuZCk7Ci0JICAgICAgZWxzZQotCQljYWxsZXJfYXJncyA9IDB4MTU1OwotCi0JICAgICAgLyogTm93IGRldGVybWluZSB3aGVyZSB0aGUgY2FsbCBwb2ludCBpcy4gICovCi0JICAgICAgbG9jYXRpb24gPSAoc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICArIHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgKyBpcmVsYS0+cl9vZmZzZXQpOwotCi0JICAgICAgLyogV2Ugb25seSBjYXJlIGFib3V0IHRoZSBkZXN0aW5hdGlvbiBmb3IgUENSRUwgZnVuY3Rpb24KLQkJIGNhbGxzIChlZy4gd2UgZG9uJ3QgY2FyZSBmb3IgUExBQkVMUykuICAqLwotCSAgICAgIGlmIChyX3R5cGUgIT0gUl9QQVJJU0NfUENSRUwxN0YpCi0JCWxvY2F0aW9uID0gZGVzdGluYXRpb247Ci0KLQkgICAgICAvKiBEZXRlcm1pbmUgd2hhdCAoaWYgYW55KSBsaW5rZXIgc3R1YiBpcyBuZWVkZWQgYW5kIGl0cwotCQkgc2l6ZSAoaW4gYnl0ZXMpLiAgKi8KLQkgICAgICBzaXplX29mX3N0dWIgPSBlbGYzMl9ocHBhX3NpemVfb2Zfc3R1YiAoY2FsbGVlX2FyZ3MsCi0JCQkJCQkgICAgICBjYWxsZXJfYXJncywKLQkJCQkJCSAgICAgIGxvY2F0aW9uLAotCQkJCQkJICAgICAgZGVzdGluYXRpb24sCi0JCQkJCQkgICAgICBzeW1fbmFtZSk7Ci0JICAgICAgaWYgKHNpemVfb2Zfc3R1YiAhPSAwKQotCQl7Ci0JCSAgY2hhciAqc3R1Yl9uYW1lOwotCQkgIHVuc2lnbmVkIGludCBsZW47Ci0KLQkJICAvKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBzdHViLiAgKi8KLQkJICBsZW4gPSBzdHJsZW4gKHN5bV9uYW1lKTsKLQkJICBsZW4gKz0gMjM7Ci0KLQkJICBzdHViX25hbWUgPSBiZmRfbWFsbG9jIChsZW4pOwotCQkgIGlmICghc3R1Yl9uYW1lKQotCQkgICAgewotCQkgICAgICAvKiBCZWNhdXNlIHN5bV9uYW1lIHdhcyBtYWxsb2NkIGFib3ZlIGZvciBsb2NhbAotCQkJIHN5bWJvbHMuICAqLwotCQkgICAgICBpZiAocl9pbmRleCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JCQlmcmVlIChuZXdfbmFtZSk7Ci0KLQkJICAgICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLQkJICAgICAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotCQkJaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotCQkJICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0JCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICB9Ci0JCSAgZWxmMzJfaHBwYV9uYW1lX29mX3N0dWIgKGNhbGxlcl9hcmdzLCBjYWxsZWVfYXJncywKLQkJCQkJICAgbG9jYXRpb24sIGRlc3RpbmF0aW9uLCBzdHViX25hbWUpOwotCQkgIHN0cmNhdCAoc3R1Yl9uYW1lICsgMjIsIHN5bV9uYW1lKTsKLQotCQkgIC8qIEJlY2F1c2Ugc3ltX25hbWUgd2FzIG1hbGxvY2VkIGFib3ZlIGZvciBsb2NhbCBzeW1ib2xzLiAgKi8KLQkJICBpZiAocl9pbmRleCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JCSAgICBmcmVlIChuZXdfbmFtZSk7Ci0KLQkJICBzdHViX2hhc2gKLQkJICAgID0gZWxmMzJfaHBwYV9zdHViX2hhc2hfbG9va3VwIChzdHViX2hhc2hfdGFibGUsIHN0dWJfbmFtZSwKLQkJCQkJCSAgIGZhbHNlLCBmYWxzZSk7Ci0JCSAgaWYgKHN0dWJfaGFzaCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICAvKiBUaGUgcHJvcGVyIHN0dWIgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLCBub3RoaW5nCi0JCQkgZWxzZSB0byBkby4gICovCi0JCSAgICAgIGZyZWUgKHN0dWJfbmFtZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoc3R1Yl9iZmQsIHN0dWJfc2VjLAotCQkJCQkgICAgKGJmZF9zZWN0aW9uX3NpemUgKHN0dWJfYmZkLAotCQkJCQkJCSAgICAgICBzdHViX3NlYykKLQkJCQkJICAgICArIHNpemVfb2Zfc3R1YikpOwotCi0JCSAgICAgIC8qIEVudGVyIHRoaXMgZW50cnkgaW50byB0aGUgbGlua2VyIHN0dWIgaGFzaCB0YWJsZS4gICovCi0JCSAgICAgIHN0dWJfaGFzaAotCQkJPSBlbGYzMl9ocHBhX3N0dWJfaGFzaF9sb29rdXAgKHN0dWJfaGFzaF90YWJsZSwKLQkJCQkJCSAgICAgICBzdHViX25hbWUsIHRydWUsIHRydWUpOwotCQkgICAgICBpZiAoc3R1Yl9oYXNoID09IE5VTEwpCi0JCQl7Ci0JCQkgIGZyZWUgKHN0dWJfbmFtZSk7Ci0JCQkgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JCQkgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJCSAgICBpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0JCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkJCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCQl9Ci0KLQkJICAgICAgLyogV2UnbGwgbmVlZCB0aGVzZSB0byBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgdGhhdCB0aGUKLQkJCSBzdHViIHdpbGwgYnJhbmNoIHRvLiAgKi8KLQkJICAgICAgc3R1Yl9oYXNoLT50YXJnZXRfdmFsdWUgPSBzeW1fdmFsdWU7Ci0JCSAgICAgIHN0dWJfaGFzaC0+dGFyZ2V0X3NlY3Rpb24gPSBzeW1fc2VjOwotCQkgICAgfQotCQkgIGZyZWUgKHN0dWJfbmFtZSk7Ci0JCX0KLQkgICAgfQotCSAgLyogV2UncmUgZG9uZSB3aXRoIHRoZSBpbnRlcm5hbCByZWxvY3MsIGZyZWUgdGhlbS4gICovCi0JICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCX0KLSAgICB9Ci0gIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgbG9jYWwgc3ltYm9scywgZnJlZSB0aGVtLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotICAgIGlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLSAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotICByZXR1cm4gdHJ1ZTsKLQotZXJyb3JfcmV0dXJuOgotICAvKiBSZXR1cm4gZ3JhY2VmdWxseSwgYXZvaWRpbmcgZGFuZ2xpbmcgcmVmZXJlbmNlcyB0byB0aGUgaGFzaCB0YWJsZXMuICAqLwotICBpZiAoc3R1Yl9oYXNoX3RhYmxlKQotICAgIHsKLSAgICAgIGVsZjMyX2hwcGFfaGFzaF90YWJsZShsaW5rX2luZm8pLT5zdHViX2hhc2hfdGFibGUgPSBOVUxMOwotICAgICAgZnJlZSAoc3R1Yl9oYXNoX3RhYmxlKTsKLSAgICB9Ci0gIGlmIChhcmdzX2hhc2hfdGFibGUpCi0gICAgewotICAgICAgZWxmMzJfaHBwYV9oYXNoX3RhYmxlKGxpbmtfaW5mbyktPmFyZ3NfaGFzaF90YWJsZSA9IE5VTEw7Ci0gICAgICBmcmVlIChhcmdzX2hhc2hfdGFibGUpOwotICAgIH0KLSAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBzdHViIHNlY3Rpb24gdG8gemVybyBzaW5jZSB3ZSdyZSBuZXZlciBnb2luZwotICAgICB0byBjcmVhdGUgdGhlbS4gICBBdm9pZHMgbG9zaW5nIHdoZW4gd2UgdHJ5IHRvIGdldCBpdHMgY29udGVudHMKLSAgICAgdG9vLiAgKi8KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKHN0dWJfYmZkLCBzdHViX3NlYywgMCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogTWlzYyBCRkQgc3VwcG9ydCBjb2RlLiAgKi8KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAkJZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCWhwcGFfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotLyogU3ltYm9sIGV4dGVuc2lvbiBzdHVmZi4gICovCi0jZGVmaW5lIGJmZF9lbGYzMl9zZXRfc2VjdGlvbl9jb250ZW50cwkJZWxmMzJfaHBwYV9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJCWVsZjMyX2hwcGFfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZyBcCi0gIGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nIFwKLSAgZWxmMzJfaHBwYV9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBcCi0gIGVsZjMyX2hwcGFfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0KLS8qIFN0dWZmIGZvciB0aGUgQkZEIGxpbmtlci4gICovCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JCWVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sJCWVsZjMyX2hwcGFfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIFwKLSAgZWxmMzJfaHBwYV9saW5rX291dHB1dF9zeW1ib2xfaG9vawotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX2hwcGFfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLWhwcGEiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9ocHBhCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fUEFSSVNDCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1ocHBhLmggYi9iZmQvZWxmMzItaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjMzOTIwLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1ocHBhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKiBFTEYzMi9IUFBBIHN1cHBvcnQKLQotICAgVGhpcyBmaWxlIGNvbnRhaW5zIEVMRjMyL0hQUEEgcmVsb2NhdGlvbiBzdXBwb3J0IGFzIHNwZWNpZmllZAotICAgaW4gdGhlIFN0cmF0dXMgRlRYL0dvbGYgT2JqZWN0IEZpbGUgRm9ybWF0IChTRUQtMTc2MikgZGF0ZWQKLSAgIEZlYnJ1YXJ5IDE5OTQuCi0KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnk6Ci0KLSAgIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZQotICAgRGVwYXJ0bWVudCBvZiBDb21wdXRlciBTY2llbmNlCi0gICBVbml2ZXJzaXR5IG9mIFV0YWgKLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEYzMl9IUFBBX0gKLSNkZWZpbmUgX0VMRjMyX0hQUEFfSAotCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImxpYmhwcGEuaCIKLSNpbmNsdWRlICJlbGYvaHBwYS5oIgotCi0jZGVmaW5lIEVMRl9IT1dUT19UQUJMRV9TSVpFCVJfUEFSSVNDX1VOSU1QTEVNRU5URUQgKyAxCi0jZGVmaW5lIE5fUEFSSVNDX1JFTE9DUwkJUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCArIDEKLQotLyogRGVmaW5lIGdyb3VwcyBvZiBiYXNpYyByZWxvY2F0aW9ucy4gIEZJWE1FOiAgVGhlc2Ugc2hvdWxkCi0gICBiZSB0aGUgb25seSBiYXNpYyByZWxvY2F0aW9ucyBjcmVhdGVkIGJ5IEdBUy4gIFRoZSByZXN0Ci0gICBzaG91bGQgYmUgaW50ZXJuYWwgdG8gdGhlIEJGRCBiYWNrZW5kLiAgCi0KLSAgIFRoZSBpZGVhIGlzIGJvdGggU09NIGFuZCBFTEYgZGVmaW5lIHRoZXNlIGJhc2ljIHJlbG9jYXRpb24KLSAgIHR5cGVzIHNvIHRoZXkgbWFwIGludG8gYSBTT00gb3IgRUxGIHNwZWNpZmljIHJlbG9jYXRpb24gCi0gICBhcyBhcHByb3ByaWF0ZS4gIFRoaXMgYWxsb3dzIEdBUyB0byBzaGFyZSBtdWNoIG1vcmUgY29kZQotICAgYmV0d2VlbiB0aGUgdHdvIHRhcmdldCBvYmplY3QgZm9ybWF0cy4gICovCi0KLSNkZWZpbmUgUl9IUFBBX05PTkUJCQlSX1BBUklTQ19OT05FCi0jZGVmaW5lCVJfSFBQQQkJCQlSX1BBUklTQ19ESVIzMgotI2RlZmluZQlSX0hQUEFfR09UT0ZGCQkJUl9QQVJJU0NfRFBSRUwyMUwKLSNkZWZpbmUJUl9IUFBBX1BDUkVMX0NBTEwJCVJfUEFSSVNDX1BDUkVMMjFMCi0jZGVmaW5lIFJfSFBQQV9BQlNfQ0FMTAkJCVJfUEFSSVNDX0RJUjE3RgotI2RlZmluZSBSX0hQUEFfQ09NUExFWAkJCVJfUEFSSVNDX1VOSU1QTEVNRU5URUQKLQotZWxmMzJfaHBwYV9yZWxvY190eXBlICoqIGhwcGFfZWxmX2dlbl9yZWxvY190eXBlCi0gIFBBUkFNUyAoKGJmZCAqLCBlbGYzMl9ocHBhX3JlbG9jX3R5cGUsIGludCwgaW50LCBpbnQsIGFzeW1ib2wgKikpOwotCi1ib29sZWFuIGVsZjMyX2hwcGFfc2l6ZV9zdHVicwotICBQQVJBTVMgKChiZmQgKiwgYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotYm9vbGVhbiBlbGYzMl9ocHBhX2J1aWxkX3N0dWJzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSNlbmRpZiAvKiBfRUxGMzJfSFBQQV9IICovCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaTM4Ni5jIGIvYmZkL2VsZjMyLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwYzY4MC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk0MyArMCwwIEBACi0vKiBJbnRlbCA4MDM4Ni84MDQ4Ni1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5My0xOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgZWxmX2kzODZfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyB2b2lkIGVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVsZl9pMzg2X2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9pMzg2X2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0jZGVmaW5lIFVTRV9SRUwJMQkJLyogMzg2IHVzZXMgUkVMIHJlbG9jYXRpb25zIGluc3RlYWQgb2YgUkVMQSAqLwotCi0jaW5jbHVkZSAiZWxmL2kzODYuaCIKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2hvd3RvX3RhYmxlW109Ci17Ci0gIEhPV1RPKFJfMzg2X05PTkUsCSAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9OT05FIiwJICAgIHRydWUsMHgwMDAwMDAwMCwweDAwMDAwMDAwLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfMzIsCSAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl8zMiIsCSAgICB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X1BDMzIsCSAwLDIsMzIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9QQzMyIiwJICAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSXzM4Nl9HT1QzMiwJIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0dPVDMyIiwgICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl9QTFQzMiwJIDAsMiwzMix0cnVlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfUExUMzIiLCAgICB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl8zODZfQ09QWSwgICAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9DT1BZIiwJICAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfR0xPQl9EQVQsICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9HTE9CX0RBVCIsIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfSlVNUF9TTE9ULCAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9KVU1QX1NMT1QiLHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfUkVMQVRJVkUsICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9SRUxBVElWRSIsIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfR09UT0ZGLCAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9HT1RPRkYiLCAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfR09UUEMsICAgICAwLDIsMzIsdHJ1ZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0dPVFBDIiwgICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIHsgMTEgfSwKLSAgeyAxMiB9LAotICB7IDEzIH0sCi0gIHsgMTQgfSwKLSAgeyAxNSB9LAotICB7IDE2IH0sCi0gIHsgMTcgfSwKLSAgeyAxOCB9LAotICB7IDE5IH0sCi0gIC8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBhIEdOVSBleHRlbnNpb24uICAqLwotICBIT1dUTyhSXzM4Nl8xNiwJIDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2XzE2IiwJICAgIHRydWUsMHhmZmZmLDB4ZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X1BDMTYsCSAwLDEsMTYsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9QQzE2IiwJICAgIHRydWUsMHhmZmZmLDB4ZmZmZix0cnVlKSwKLSAgSE9XVE8oUl8zODZfOCwJIDAsMCw4LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfOCIsCSAgICB0cnVlLDB4ZmYsMHhmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X1BDOCwJIDAsMCw4LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfUEM4IiwJICAgIHRydWUsMHhmZiwweGZmLHRydWUpLAotfTsKLQotLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfaTM4Nl92dGluaGVyaXRfaG93dG8gPQotICBIT1dUTyAoUl8zODZfR05VX1ZUSU5IRVJJVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl8zODZfR05VX1ZUSU5IRVJJVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7Ci0KLS8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlLiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2kzODZfdnRlbnRyeV9ob3d0byA9Ci0gIEhPV1RPIChSXzM4Nl9HTlVfVlRFTlRSWSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfMzg2X0dOVV9WVEVOVFJZIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKTsKLQotI2lmZGVmIERFQlVHX0dFTl9SRUxPQwotI2RlZmluZSBUUkFDRShzdHIpIGZwcmludGYgKHN0ZGVyciwgImkzODYgYmZkIHJlbG9jIGxvb2t1cCAlZCAoJXMpXG4iLCBjb2RlLCBzdHIpCi0jZWxzZQotI2RlZmluZSBUUkFDRShzdHIpCi0jZW5kaWYKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTk9ORToKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DX05PTkUiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X05PTkUgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzIiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2XzMyIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfQ1RPUiIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfMzIgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfUEMzMiIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfUEMzMiBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVDMyOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X0dPVDMyIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9HT1QzMiBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X1BMVDMyOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X1BMVDMyIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9QTFQzMiBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0NPUFk6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfQ09QWSIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfQ09QWSBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dMT0JfREFUOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X0dMT0JfREFUIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9HTE9CX0RBVCBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0pVTVBfU0xPVDoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9KVU1QX1NMT1QiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X0pVTVBfU0xPVCBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X1JFTEFUSVZFOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X1JFTEFUSVZFIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9SRUxBVElWRSBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVE9GRjoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9HT1RPRkYiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X0dPVE9GRiBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVFBDOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X0dPVFBDIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9HT1RQQyBdOwotCi0gICAgICAvKiBUaGUgcmVtYWluaW5nIHJlbG9jcyBhcmUgYSBHTlUgZXh0ZW5zaW9uLiAgKi8KLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzE2Iik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsoaW50KSBSXzM4Nl8xNl07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzE2X1BDUkVMIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsoaW50KSBSXzM4Nl9QQzE2XTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ184Iik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsoaW50KSBSXzM4Nl84XTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzhfUENSRUw6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ184X1BDUkVMIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsoaW50KSBSXzM4Nl9QQzhdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCIpOwotICAgICAgcmV0dXJuICZlbGYzMl9pMzg2X3Z0aW5oZXJpdF9ob3d0bzsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSIpOwotICAgICAgcmV0dXJuICZlbGYzMl9pMzg2X3Z0ZW50cnlfaG93dG87Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIFRSQUNFICgiVW5rbm93biIpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9pMzg2X2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQJCSphYmZkOwotICAgICBhcmVsZW50CQkqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIGFib3J0ICgpOwotfQotCi1zdGF0aWMgdm9pZAotZWxmX2kzODZfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIGVudW0gZWxmX2kzODZfcmVsb2NfdHlwZSB0eXBlOwotCi0gIHR5cGUgPSAoZW51bSBlbGZfaTM4Nl9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgaWYgKHR5cGUgPT0gUl8zODZfR05VX1ZUSU5IRVJJVCkKLSAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZjMyX2kzODZfdnRpbmhlcml0X2hvd3RvOwotICBlbHNlIGlmICh0eXBlID09IFJfMzg2X0dOVV9WVEVOVFJZKQotICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmMzJfaTM4Nl92dGVudHJ5X2hvd3RvOwotICBlbHNlCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAodHlwZSA8IFJfMzg2X21heCk7Ci0gICAgICBCRkRfQVNTRVJUICh0eXBlIDwgRklSU1RfSU5WQUxJRF9SRUxPQyB8fCB0eXBlID4gTEFTVF9JTlZBTElEX1JFTE9DKTsKLSAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHR5cGVdOwotICAgIH0KLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgbmFtZSBpbXBsaWVzIGEgbG9jYWwgbGFiZWwuICBUaGUgVW5peFdhcmUKLSAgIDIuMSBjYyBnZW5lcmF0ZXMgdGVtcG9yYXJ5IHN5bWJvbHMgdGhhdCBzdGFydCB3aXRoIC5YLCBzbyB3ZQotICAgcmVjb2duaXplIHRoZW0gaGVyZS4gIEZJWE1FOiBkbyBvdGhlciBTVlI0IGNvbXBpbGVycyBhbHNvIHVzZSAuWD8uCi0gICBJZiBzbywgd2Ugc2hvdWxkIG1vdmUgdGhlIC5YIHJlY29nbml0aW9uIGludG8KLSAgIF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2kzODZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnWCcpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpOwotfQotDAotLyogRnVuY3Rpb25zIGZvciB0aGUgaTM4NiBFTEYgbGlua2VyLiAgKi8KLQotLyogVGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgaW50ZXJwcmV0ZXIuICBUaGlzIGlzIHB1dCBpbiB0aGUgLmludGVycAotICAgc2VjdGlvbi4gICovCi0KLSNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgIi91c3IvbGliL2xpYmMuc28uMSIKLQotLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotI2RlZmluZSBQTFRfRU5UUllfU0laRSAxNgotCi0vKiBUaGUgZmlyc3QgZW50cnkgaW4gYW4gYWJzb2x1dGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9va3MgbGlrZQotICAgdGhpcy4gIFNlZSB0aGUgU1ZSNCBBQkkgaTM4NiBzdXBwbGVtZW50IHRvIHNlZSBob3cgdGhpcyB3b3Jrcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfaTM4Nl9wbHQwX2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4ZmYsIDB4MzUsCS8qIHB1c2hsIGNvbnRlbnRzIG9mIGFkZHJlc3MgKi8KLSAgMCwgMCwgMCwgMCwJLyogcmVwbGFjZWQgd2l0aCBhZGRyZXNzIG9mIC5nb3QgKyA0LiAgKi8KLSAgMHhmZiwgMHgyNSwJLyogam1wIGluZGlyZWN0ICovCi0gIDAsIDAsIDAsIDAsCS8qIHJlcGxhY2VkIHdpdGggYWRkcmVzcyBvZiAuZ290ICsgOC4gICovCi0gIDAsIDAsIDAsIDAJLyogcGFkIG91dCB0byAxNiBieXRlcy4gICovCi19OwotCi0vKiBTdWJzZXF1ZW50IGVudHJpZXMgaW4gYW4gYWJzb2x1dGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9vayBsaWtlCi0gICB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9pMzg2X3BsdF9lbnRyeVtQTFRfRU5UUllfU0laRV0gPQotewotICAweGZmLCAweDI1LAkvKiBqbXAgaW5kaXJlY3QgKi8KLSAgMCwgMCwgMCwgMCwJLyogcmVwbGFjZWQgd2l0aCBhZGRyZXNzIG9mIHRoaXMgc3ltYm9sIGluIC5nb3QuICAqLwotICAweDY4LAkJLyogcHVzaGwgaW1tZWRpYXRlICovCi0gIDAsIDAsIDAsIDAsCS8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IGludG8gcmVsb2NhdGlvbiB0YWJsZS4gICovCi0gIDB4ZTksCQkvKiBqbXAgcmVsYXRpdmUgKi8KLSAgMCwgMCwgMCwgMAkvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzdGFydCBvZiAucGx0LiAgKi8KLX07Ci0KLS8qIFRoZSBmaXJzdCBlbnRyeSBpbiBhIFBJQyBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rIGxpa2UgdGhpcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfaTM4Nl9waWNfcGx0MF9lbnRyeVtQTFRfRU5UUllfU0laRV0gPQotewotICAweGZmLCAweGIzLCA0LCAwLCAwLCAwLAkvKiBwdXNobCA0KCVlYngpICovCi0gIDB4ZmYsIDB4YTMsIDgsIDAsIDAsIDAsCS8qIGptcCAqOCglZWJ4KSAqLwotICAwLCAwLCAwLCAwCQkJLyogcGFkIG91dCB0byAxNiBieXRlcy4gICovCi19OwotCi0vKiBTdWJzZXF1ZW50IGVudHJpZXMgaW4gYSBQSUMgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9vayBsaWtlIHRoaXMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX2kzODZfcGljX3BsdF9lbnRyeVtQTFRfRU5UUllfU0laRV0gPQotewotICAweGZmLCAweGEzLAkvKiBqbXAgKm9mZnNldCglZWJ4KSAqLwotICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIG9mZnNldCBvZiB0aGlzIHN5bWJvbCBpbiAuZ290LiAgKi8KLSAgMHg2OCwJCS8qIHB1c2hsIGltbWVkaWF0ZSAqLwotICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIG9mZnNldCBpbnRvIHJlbG9jYXRpb24gdGFibGUuICAqLwotICAweGU5LAkJLyogam1wIHJlbGF0aXZlICovCi0gIDAsIDAsIDAsIDAJLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgdG8gc3RhcnQgb2YgLnBsdC4gICovCi19OwotCi0vKiBUaGUgaTM4NiBsaW5rZXIgbmVlZHMgdG8ga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIHJlbG9jcyB0aGF0IGl0Ci0gICBkZWNpZGVzIHRvIGNvcHkgaW4gY2hlY2tfcmVsb2NzIGZvciBlYWNoIHN5bWJvbC4gIFRoaXMgaXMgc28gdGhhdAotICAgaXQgY2FuIGRpc2NhcmQgUEMgcmVsYXRpdmUgcmVsb2NzIGlmIGl0IGRvZXNuJ3QgbmVlZCB0aGVtIHdoZW4KLSAgIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLiAgV2Ugc3RvcmUgdGhlIGluZm9ybWF0aW9uIGluIGEgZmllbGQKLSAgIGV4dGVuZGluZyB0aGUgcmVndWxhciBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBrZWVwcyB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlIHJlbG9jcyB3ZQotICAgaGF2ZSBjb3BpZWQgZm9yIGEgZ2l2ZW4gc3ltYm9sLiAgKi8KLQotc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQKLXsKLSAgLyogTmV4dCBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQgKm5leHQ7Ci0gIC8qIEEgc2VjdGlvbiBpbiBkeW5vYmouICAqLwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgLyogTnVtYmVyIG9mIHJlbG9jcyBjb3BpZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLX07Ci0KLS8qIGkzODYgRUxGIGxpbmtlciBoYXNoIGVudHJ5LiAgKi8KLQotc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIE51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3MgY29waWVkIGZvciB0aGlzIHN5bWJvbC4gICovCi0gIHN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkICpwY3JlbF9yZWxvY3NfY29waWVkOwotfTsKLQotLyogaTM4NiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBEZWNsYXJlIHRoaXMgbm93IHRoYXQgdGhlIGFib3ZlIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9kaXNjYXJkX2NvcGllcwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi0vKiBUcmF2ZXJzZSBhbiBpMzg2IEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgZWxmX2kzODZfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgaTM4NiBFTEYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGVsZl9pMzg2X2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhbiBpMzg2IEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotZWxmX2kzODZfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgcmV0LT5wY3JlbF9yZWxvY3NfY29waWVkID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYW4gaTM4NiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotZWxmX2kzODZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgICAgIGVsZl9pMzg2X2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbGdvdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKTsKLQotICBzZ290ID0gTlVMTDsKLSAgc3JlbGdvdCA9IE5VTEw7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICAvKiBTb21lIHJlbG9jcyByZXF1aXJlIGEgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JewotCSAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQkgICAgewotCSAgICBjYXNlIFJfMzg2X0dPVDMyOgotCSAgICBjYXNlIFJfMzg2X0dPVE9GRjoKLQkgICAgY2FzZSBSXzM4Nl9HT1RQQzoKLQkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSXzM4Nl9HT1QzMjoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkgICAgICAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgIHsKLQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0JICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsLmdvdCIpOwotCQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbGdvdCwKLQkJCQkJCSAgKFNFQ19BTExPQwotCQkJCQkJICAgfCBTRUNfTE9BRAotCQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICB8IFNFQ19SRUFET05MWSkpCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsZ290LCAyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0JCXsKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGgtPmdvdC5vZmZzZXQgPSBzZ290LT5fcmF3X3NpemU7Ci0KLQkgICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCQl7Ci0JCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0gICAgIAkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbAotICAgICAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQl7Ci0JCSAgc2l6ZV90IHNpemU7Ci0JCSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0KLQkJICBzaXplID0gc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoYmZkX3ZtYSk7Ci0JCSAgbG9jYWxfZ290X29mZnNldHMgPSAoYmZkX3ZtYSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotCQkgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCkgPSBsb2NhbF9nb3Rfb2Zmc2V0czsKLQkJICBmb3IgKGkgPSAwOyBpIDwgc3ltdGFiX2hkci0+c2hfaW5mbzsgaSsrKQotCQkgICAgbG9jYWxfZ290X29mZnNldHNbaV0gPSAoYmZkX3ZtYSkgLTE7Ci0JCX0KLQkgICAgICBpZiAobG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQkJewotCQkgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGEgUl8zODZfUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUgZHluYW1pYwotICAgICAgICAgICAgICAgICAgICAgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLwotCQkgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JCX0KLQkgICAgfQotCi0JICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfMzg2X1BMVDMyOgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gIFdlCi0gICAgICAgICAgICAgYWN0dWFsbHkgYnVpbGQgdGhlIGVudHJ5IGluIGFkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgICAgICAgICAgICBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgYSBjYXNlIG9mIGxpbmtpbmcgUElDIGNvZGUgd2hpY2ggaXMKLSAgICAgICAgICAgICBuZXZlciByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGluIHdoaWNoIGNhc2Ugd2UKLSAgICAgICAgICAgICBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkKLSAgICAgICAgICAgICBhZnRlciBhbGwuICAqLwotCi0JICAvKiBJZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB3ZSByZXNvbHZlIGl0IGRpcmVjdGx5IHdpdGhvdXQKLSAgICAgICAgICAgICBjcmVhdGluZyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgKi8KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCi0JICBicmVhazsKLQotCWNhc2UgUl8zODZfMzI6Ci0JY2FzZSBSXzM4Nl9QQzMyOgotCSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGFuZCB0aGlzIGlzIGEgcmVsb2MKLSAgICAgICAgICAgICBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCwgb3IgYSBub24gUEMgcmVsYXRpdmUgcmVsb2MKLSAgICAgICAgICAgICBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLCB0aGVuIHdlIG5lZWQgdG8gY29weSB0aGUgcmVsb2MKLSAgICAgICAgICAgICBpbnRvIHRoZSBzaGFyZWQgbGlicmFyeS4gIEhvd2V2ZXIsIGlmIHdlIGFyZSBsaW5raW5nIHdpdGgKLSAgICAgICAgICAgICAtQnN5bWJvbGljLCB3ZSBkbyBub3QgbmVlZCB0byBjb3B5IGEgcmVsb2MgYWdhaW5zdCBhCi0gICAgICAgICAgICAgZ2xvYmFsIHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkIGluIGFuIG9iamVjdCB3ZSBhcmUKLSAgICAgICAgICAgICBpbmNsdWRpbmcgaW4gdGhlIGxpbmsgKGkuZS4sIERFRl9SRUdVTEFSIGlzIHNldCkuICBBdAotICAgICAgICAgICAgIHRoaXMgcG9pbnQgd2UgaGF2ZSBub3Qgc2VlbiBhbGwgdGhlIGlucHV0IGZpbGVzLCBzbyBpdCBpcwotICAgICAgICAgICAgIHBvc3NpYmxlIHRoYXQgREVGX1JFR1VMQVIgaXMgbm90IHNldCBub3cgYnV0IHdpbGwgYmUgc2V0Ci0gICAgICAgICAgICAgbGF0ZXIgKGl0IGlzIG5ldmVyIGNsZWFyZWQpLiAgV2UgYWNjb3VudCBmb3IgdGhhdAotICAgICAgICAgICAgIHBvc3NpYmlsaXR5IGJlbG93IGJ5IHN0b3JpbmcgaW5mb3JtYXRpb24gaW4gdGhlCi0gICAgICAgICAgICAgcGNyZWxfcmVsb2NzX2NvcGllZCBmaWVsZCBvZiB0aGUgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0JICBpZiAoaW5mby0+c2hhcmVkCi0JICAgICAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkgICAgICAmJiAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykgIT0gUl8zODZfUEMzMgotCQkgIHx8IChoICE9IE5VTEwKLQkJICAgICAgJiYgKCEgaW5mby0+c3ltYm9saWMKLQkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKSkKLQkgICAgewotCSAgICAgIC8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UKLSAgICAgICAgICAgICAgICAgcmVsb2MgdHlwZXMgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYwotICAgICAgICAgICAgICAgICBzZWN0aW9uIGluIGR5bm9iaiBhbmQgbWFrZSByb29tIGZvciB0aGlzIHJlbG9jLiAgKi8KLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChhYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWwiLCA0KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCQkJCQkgbmFtZSArIDQpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBmbGFnd29yZCBmbGFnczsKLQotCQkgICAgICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIG5hbWUpOwotCQkgICAgICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZCi0JCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQkJICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkJZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsIGZsYWdzKQotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCi0JICAgICAgLyogSWYgd2UgYXJlIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLCBhbmQgdGhpcyBpcyBhCi0gICAgICAgICAgICAgICAgIGdsb2JhbCBzeW1ib2wsIHdlIGNvdW50IHRoZSBudW1iZXIgb2YgUEMgcmVsYXRpdmUKLSAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbnMgd2UgaGF2ZSBlbnRlcmVkIGZvciB0aGlzIHN5bWJvbCwgc28gdGhhdAotICAgICAgICAgICAgICAgICB3ZSBjYW4gZGlzY2FyZCB0aGVtIGFnYWluIGlmIHRoZSBzeW1ib2wgaXMgbGF0ZXIKLSAgICAgICAgICAgICAgICAgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0LiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24KLSAgICAgICAgICAgICAgICAgaXMgb25seSBjYWxsZWQgaWYgd2UgYXJlIHVzaW5nIGFuIGVsZl9pMzg2IGxpbmtlcgotICAgICAgICAgICAgICAgICBoYXNoIHRhYmxlLCB3aGljaCBtZWFucyB0aGF0IGggaXMgcmVhbGx5IGEgcG9pbnRlciB0bwotICAgICAgICAgICAgICAgICBhbiBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkuICAqLwotCSAgICAgIGlmIChoICE9IE5VTEwgJiYgaW5mby0+c3ltYm9saWMKLQkJICAmJiBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSA9PSBSXzM4Nl9QQzMyKQotCQl7Ci0JCSAgc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqZWg7Ci0JCSAgc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQgKnA7Ci0KLQkJICBlaCA9IChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0KLQkJICBmb3IgKHAgPSBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQkJICAgIGlmIChwLT5zZWN0aW9uID09IHNyZWxvYykKLQkJICAgICAgYnJlYWs7Ci0KLQkJICBpZiAocCA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBwID0gKChzdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZCAqKQotCQkJICAgYmZkX2FsbG9jIChkeW5vYmosIHNpemVvZiAqcCkpOwotCQkgICAgICBpZiAocCA9PSBOVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBwLT5uZXh0ID0gZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7Ci0JCSAgICAgIGVoLT5wY3JlbF9yZWxvY3NfY29waWVkID0gcDsKLQkJICAgICAgcC0+c2VjdGlvbiA9IHNyZWxvYzsKLQkJICAgICAgcC0+Y291bnQgPSAwOwotCQkgICAgfQotCi0JCSAgKytwLT5jb3VudDsKLQkJfQotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0JICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSXzM4Nl9HTlVfVlRJTkhFUklUOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLQkgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl8zODZfR05VX1ZURU5UUlk6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgc2VjdGlvbiB0aGF0IHNob3VsZCBiZSBtYXJrZWQgYWdhaW5zdCBHQyBmb3IgYSBnaXZlbgotICAgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1lbGZfaTM4Nl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl8zODZfR05VX1ZUSU5IRVJJVDoKLQljYXNlIFJfMzg2X0dOVV9WVEVOVFJZOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLQkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLQl7Ci0JICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2kzODZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIC8qID8/PyBJdCB3b3VsZCBzZWVtIHRoYXQgdGhlIGV4aXN0aW5nIGkzODYgY29kZSBkb2VzIG5vIHNvcnQKLSAgICAgb2YgcmVmZXJlbmNlIGNvdW50aW5nIG9yIHdoYXRub3Qgb24gaXRzIEdPVCBhbmQgUExUIGVudHJpZXMsCi0gICAgIHNvIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBnYXJiYWdlIGNvbGxlY3QgdGhlbSBhdCB0aGlzIHRpbWUuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlciwKLSAgICAgd2hlbiB3ZSBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSA9PSAwKQotCXsKLQkgIC8qIFRoaXMgY2FzZSBjYW4gb2NjdXIgaWYgd2Ugc2F3IGEgUExUMzIgcmVsb2MgaW4gYW4gaW5wdXQKLSAgICAgICAgICAgICBmaWxlLCBidXQgdGhlIHN5bWJvbCB3YXMgbmV2ZXIgcmVmZXJyZWQgdG8gYnkgYSBkeW5hbWljCi0gICAgICAgICAgICAgb2JqZWN0LiAgSW4gc3VjaCBhIGNhc2UsIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gYnVpbGQKLSAgICAgICAgICAgICBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBhbmQgd2UgY2FuIGp1c3QgZG8gYSBQQzMyCi0gICAgICAgICAgICAgcmVsb2MgaW5zdGVhZC4gICovCi0JICBCRkRfQVNTRVJUICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgLnBsdCBlbnRyeSwgbWFrZSByb29tIGZvciB0aGUgc3BlY2lhbAotCSBmaXJzdCBlbnRyeS4gICovCi0gICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCi0Jcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZQotCSBub3QgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoaXMKLQkgbG9jYXRpb24gaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24KLQkgcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQKLQkgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCX0KLQotICAgICAgaC0+cGx0Lm9mZnNldCA9IHMtPl9yYXdfc2l6ZTsKLQotICAgICAgLyogTWFrZSByb29tIGZvciB0aGlzIGVudHJ5LiAgKi8KLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5nb3QucGx0IHNlY3Rpb24sIHdoaWNoCi0JIHdpbGwgYmUgcGxhY2VkIGluIHRoZSAuZ290IHNlY3Rpb24gYnkgdGhlIGxpbmtlciBzY3JpcHQuICAqLwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IDQ7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAucmVsLnBsdCBzZWN0aW9uLiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuICAqLwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSXzM4Nl9DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0gICAgIGNvcHkgdGhlIGluaXRpYWwgdmFsdWUgb3V0IG9mIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgaW50byB0aGUKLSAgICAgcnVudGltZSBwcm9jZXNzIGltYWdlLiAgV2UgbmVlZCB0byByZW1lbWJlciB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgIC5yZWwuYnNzIHNlY3Rpb24gd2UgYXJlIGdvaW5nIHRvIHVzZS4gICovCi0gIGlmICgoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLQotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gMykKLSAgICBwb3dlcl9vZl90d28gPSAzOwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHBsdDsKLSAgYm9vbGVhbiByZWxvY3M7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGVudHJpZXMgaW4gdGhlIC5yZWwuZ290IHNlY3Rpb24uCi0gICAgICAgICBIb3dldmVyLCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZSBkeW5hbWljIHNlY3Rpb25zLCB3ZSB3aWxsCi0gICAgICAgICBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldCB0aGUgc2l6ZSBvZiAucmVsLmdvdCwKLSAgICAgICAgIHdoaWNoIHdpbGwgY2F1c2UgaXQgdG8gZ2V0IHN0cmlwcGVkIGZyb20gdGhlIG91dHB1dCBmaWxlCi0gICAgICAgICBiZWxvdy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIHNoYXJlZCBsaW5rLCB0aGVuIHdlIG5lZWQgdG8gZGlzY2FyZCBhbGwKLSAgICAgUEMgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QuCi0gICAgIFdlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlbSBpbiB0aGUgY2hlY2tfcmVsb2NzIHJvdXRpbmUsIGJ1dCB3ZQotICAgICB3aWxsIG5vdCBmaWxsIHRoZW0gaW4gaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQgJiYgaW5mby0+c3ltYm9saWMpCi0gICAgZWxmX2kzODZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaTM4Nl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgZWxmX2kzODZfZGlzY2FyZF9jb3BpZXMsCi0JCQkJIChQVFIpIE5VTEwpOwotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcGx0ID0gZmFsc2U7Ci0gIHJlbG9jcyA9IGZhbHNlOwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RyaXA7Ci0KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICBzdHJpcCA9IGZhbHNlOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogU3RyaXAgdGhpcyBzZWN0aW9uIGlmIHdlIGRvbid0IG5lZWQgaXQ7IHNlZSB0aGUKLSAgICAgICAgICAgICAgICAgY29tbWVudCBiZWxvdy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGlzIGEgUExULiAgKi8KLQkgICAgICBwbHQgPSB0cnVlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWwiLCA0KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIG1vc3RseSB0byBoYW5kbGUgLnJlbC5ic3MgYW5kCi0JCSAucmVsLnBsdC4gIFdlIG11c3QgY3JlYXRlIGJvdGggc2VjdGlvbnMgaW4KLQkJIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIHRoZXkgbXVzdCBiZSBjcmVhdGVkCi0JCSBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dAotCQkgc2VjdGlvbnMuICBUaGUgbGlua2VyIGRvZXMgdGhhdCBiZWZvcmUKLQkJIGFkanVzdF9keW5hbWljX3N5bWJvbCBpcyBjYWxsZWQsIGFuZCBpdCBpcyB0aGF0Ci0JCSBmdW5jdGlvbiB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW55dGhpbmcgbmVlZHMgdG8gZ28KLQkJIGludG8gdGhlc2Ugc2VjdGlvbnMuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnRhcmdldDsKLQotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZWxvYyBzZWN0aW9ucyBvdGhlcgotICAgICAgICAgICAgICAgICB0aGFuIC5yZWwucGx0LiAgKi8KLQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlbC5wbHQiKSAhPSAwKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQotCQkgIHJlbG9jcyA9IHRydWU7Ci0KLQkJICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSAgICAgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTAotCQkgICAgIGVudHJ5LiAgVGhlIGVudHJpZXMgaW4gdGhlIC5yZWwucGx0IHNlY3Rpb24KLQkJICAgICByZWFsbHkgYXBwbHkgdG8gdGhlIC5nb3Qgc2VjdGlvbiwgd2hpY2ggd2UKLQkJICAgICBjcmVhdGVkIG91cnNlbHZlcyBhbmQgc28ga25vdyBpcyBub3QgcmVhZG9ubHkuICAqLwotCQkgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJCSAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCQkgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNCk7Ci0JCSAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkgICAgcmVsdGV4dCA9IHRydWU7Ci0JCX0KLQotCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKLQkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmdvdCIsIDQpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsb2NzKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMRU5ULAotCQkJCQkJc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBlbGZfaTM4Nl9saW5rX2hhc2hfdHJhdmVyc2UgaWYgd2UgYXJlCi0gICBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3Qgd2l0aCAtQnN5bWJvbGljLiAgSXQgZGlzY2FyZHMgdGhlIHNwYWNlCi0gICBhbGxvY2F0ZWQgdG8gY29weSBQQyByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIHdoaWNoIGFyZQotICAgZGVmaW5lZCBpbiByZWd1bGFyIG9iamVjdHMuICBXZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlCi0gICBjaGVja19yZWxvY3Mgcm91dGluZSwgYnV0IHdlIHdvbid0IGZpbGwgdGhlbSBpbiBpbiB0aGUKLSAgIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2Rpc2NhcmRfY29waWVzIChoLCBpZ25vcmUpCi0gICAgIHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpZ25vcmU7Ci17Ci0gIHN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkICpzOwotCi0gIC8qIFdlIG9ubHkgZGlzY2FyZCByZWxvY3MgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSAgaWYgKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAocyA9IGgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgcy0+c2VjdGlvbi0+X3Jhd19zaXplIC09IHMtPmNvdW50ICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWxvY2F0ZSBhbiBpMzg2IEVMRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNwbHQ7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChpbnB1dF9iZmQpOwotCi0gIHNnb3QgPSBOVUxMOwotICBzcGx0ID0gTlVMTDsKLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfdHlwZSA9PSBSXzM4Nl9HTlVfVlRJTkhFUklUCi0JICB8fCByX3R5cGUgPT0gUl8zODZfR05VX1ZURU5UUlkpCi0JY29udGludWU7Ci0gICAgICBpZiAocl90eXBlIDwgMAotCSAgfHwgcl90eXBlID49IChpbnQpIFJfMzg2X21heAotCSAgfHwgKHJfdHlwZSA+PSAoaW50KSBGSVJTVF9JTlZBTElEX1JFTE9DCi0JICAgICAgJiYgcl90eXBlIDw9IChpbnQpIExBU1RfSU5WQUxJRF9SRUxPQykpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaG93dG8gPSBlbGZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBiZmRfdm1hIHZhbDsKLQotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICB2YWwgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JCSAgdmFsICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWwsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIGlmIChyX3R5cGUgPT0gUl8zODZfR09UUEMKLQkJICB8fCAocl90eXBlID09IFJfMzg2X1BMVDMyCi0JCSAgICAgICYmIGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQkgIHx8IChyX3R5cGUgPT0gUl8zODZfR09UMzIKLQkJICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkJICAgICAgJiYgKCEgaW5mby0+c2hhcmVkCi0JCQkgIHx8ICghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQkgIHx8IChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JCSAgICAgICYmIChyX3R5cGUgPT0gUl8zODZfMzIKLQkJCSAgfHwgcl90eXBlID09IFJfMzg2X1BDMzIpCi0JCSAgICAgICYmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkJCSAgLyogRFdBUkYgd2lsbCBlbWl0IFJfMzg2XzMyIHJlbG9jYXRpb25zIGluIGl0cwotCQkJICAgICBzZWN0aW9ucyBhZ2FpbnN0IHN5bWJvbHMgZGVmaW5lZCBleHRlcm5hbGx5Ci0JCQkgICAgIGluIHNoYXJlZCBsaWJyYXJpZXMuICBXZSBjYW4ndCBkbyBhbnl0aGluZwotCQkJICAgICB3aXRoIHRoZW0gaGVyZS4gICovCi0JCQkgIHx8IChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApKSkKLQkJewotCQkgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZS4gIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUKLSAgICAgICAgICAgICAgICAgICAgIG9ic2N1cmUgY2FzZXMgc2VjLT5vdXRwdXRfc2VjdGlvbiB3aWxsIGJlIE5VTEwuICAqLwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6IHdhcm5pbmc6IHVucmVzb2x2YWJsZSByZWxvY2F0aW9uIGFnYWluc3Qgc3ltYm9sIGAlcycgZnJvbSAlcyBzZWN0aW9uIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgaC0+cm9vdC5yb290LnN0cmluZywKLQkJICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSk7Ci0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQljYXNlIFJfMzg2X0dPVDMyOgotCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSBnbG9iYWwKLQkgICAgIG9mZnNldCB0YWJsZS4gICovCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBvZmYgPSBoLT5nb3Qub2Zmc2V0OwotCSAgICAgIEJGRF9BU1NFUlQgKG9mZiAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSkKLQkJewotCQkgIC8qIFRoaXMgaXMgYWN0dWFsbHkgYSBzdGF0aWMgbGluaywgb3IgaXQgaXMgYQotCQkgICAgIC1Cc3ltYm9saWMgbGluayBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JCSAgICAgbG9jYWxseSwgb3IgdGhlIHN5bWJvbCB3YXMgZm9yY2VkIHRvIGJlIGxvY2FsCi0JCSAgICAgYmVjYXVzZSBvZiBhIHZlcnNpb24gZmlsZS4gIFdlIG11c3QgaW5pdGlhbGl6ZQotCQkgICAgIHRoaXMgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTaW5jZSB0aGUKLQkJICAgICBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LCB3ZSB1c2UgdGhlCi0JCSAgICAgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlIGhhdmUKLQkJICAgICBpbml0aWFsaXplZCBpdCBhbHJlYWR5LgotCi0JCSAgICAgV2hlbiBkb2luZyBhIGR5bmFtaWMgbGluaywgd2UgY3JlYXRlIGEgLnJlbC5nb3QKLQkJICAgICByZWxvY2F0aW9uIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcwotCQkgICAgIGlzIGRvbmUgaW4gdGhlIGZpbmlzaF9keW5hbWljX3N5bWJvbCByb3V0aW5lLiAgKi8KLQkJICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCSAgICBvZmYgJj0gfjE7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSAgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCQkgICAgICBoLT5nb3Qub2Zmc2V0IHw9IDE7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZjsKLQotCSAgICAgIEJGRF9BU1NFUlQgKGxvY2FsX2dvdF9vZmZzZXRzICE9IE5VTEwKLQkJCSAgJiYgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgICAgICBvZmYgPSBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF07Ci0KLQkgICAgICAvKiBUaGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNC4gIFdlIHVzZQotICAgICAgICAgICAgICAgICB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlIGhhdmUKLSAgICAgICAgICAgICAgICAgYWxyZWFkeSBnZW5lcmF0ZWQgdGhlIG5lY2Vzc2FyeSByZWxvYy4gICovCi0JICAgICAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQlvZmYgJj0gfjE7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCi0JCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKnNyZWxnb3Q7Ci0JCSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgb3V0cmVsOwotCi0JCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLQkJICAgICAgQkZEX0FTU0VSVCAoc3JlbGdvdCAhPSBOVUxMKTsKLQotCQkgICAgICBvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCQkgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkJCSArIG9mZik7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfMzg2X1JFTEFUSVZFKTsKLQkJICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkJKCgoRWxmMzJfRXh0ZXJuYWxfUmVsICopCi0JCQkJCQkgIHNyZWxnb3QtPmNvbnRlbnRzKQotCQkJCQkJICsgc3JlbGdvdC0+cmVsb2NfY291bnQpKTsKLQkJICAgICAgKytzcmVsZ290LT5yZWxvY19jb3VudDsKLQkJICAgIH0KLQotCQkgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSB8PSAxOwotCQl9Ci0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZjsKLQkgICAgfQotCi0JICBicmVhazsKLQotCWNhc2UgUl8zODZfR09UT0ZGOgotCSAgLyogUmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGdsb2JhbCBvZmZzZXQKLQkgICAgIHRhYmxlLiAgKi8KLQotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgLyogTm90ZSB0aGF0IHNnb3QtPm91dHB1dF9vZmZzZXQgaXMgbm90IGludm9sdmVkIGluIHRoaXMKLQkgICAgIGNhbGN1bGF0aW9uLiAgV2UgYWx3YXlzIHdhbnQgdGhlIHN0YXJ0IG9mIC5nb3QuICBJZiB3ZQotCSAgICAgZGVmaW5lZCBfR0xPQkFMX09GRlNFVF9UQUJMRSBpbiBhIGRpZmZlcmVudCB3YXksIGFzIGlzCi0JICAgICBwZXJtaXR0ZWQgYnkgdGhlIEFCSSwgd2UgbWlnaHQgaGF2ZSB0byBjaGFuZ2UgdGhpcwotCSAgICAgY2FsY3VsYXRpb24uICAqLwotCSAgcmVsb2NhdGlvbiAtPSBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0JICBicmVhazsKLQotCWNhc2UgUl8zODZfR09UUEM6Ci0JICAvKiBVc2UgZ2xvYmFsIG9mZnNldCB0YWJsZSBhcyBzeW1ib2wgdmFsdWUuICAqLwotCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfMzg2X1BMVDMyOgotCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZQotCSAgICAgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCi0JICAvKiBSZXNvbHZlIGEgUExUMzIgcmVsb2MgYWdhaW4gYSBsb2NhbCBzeW1ib2wgZGlyZWN0bHksCi0gICAgICAgICAgICAgd2l0aG91dCB1c2luZyB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmIChoLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLQkgICAgewotCSAgICAgIC8qIFdlIGRpZG4ndCBtYWtlIGEgUExUIGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gIFRoaXMKLSAgICAgICAgICAgICAgICAgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgotICAgICAgICAgICAgICAgICB1c2luZyAtQnN5bWJvbGljLiAgKi8KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoc3BsdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICByZWxvY2F0aW9uID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkJKyBoLT5wbHQub2Zmc2V0KTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfMzg2XzMyOgotCWNhc2UgUl8zODZfUEMzMjoKLQkgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkgICAgICAmJiAocl90eXBlICE9IFJfMzg2X1BDMzIKLQkJICB8fCAoaCAhPSBOVUxMCi0JCSAgICAgICYmIGgtPmR5bmluZHggIT0gLTEKLQkJICAgICAgJiYgKCEgaW5mby0+c3ltYm9saWMKLQkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKSkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgb3V0cmVsOwotCSAgICAgIGJvb2xlYW4gc2tpcCwgcmVsb2NhdGU7Ci0KLQkgICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB0aGVzZSByZWxvY2F0aW9ucwotCQkgYXJlIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4KLQkJIHRpbWUuICAqLwotCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoaW5wdXRfYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWwiLCA0KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pLAotCQkJCQkgbmFtZSArIDQpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOwotCQl9Ci0KLQkgICAgICBza2lwID0gZmFsc2U7Ci0KLQkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQotCQlvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF92bWEgb2ZmOwotCi0JCSAgb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotCQkJIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQkgIGlucHV0X3NlY3Rpb24sCi0JCQkgICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCQkJICByZWwtPnJfb2Zmc2V0KSk7Ci0JCSAgaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCi0JCSAgICBza2lwID0gdHJ1ZTsKLQkJICBvdXRyZWwucl9vZmZzZXQgPSBvZmY7Ci0JCX0KLQotCSAgICAgIG91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIGlmIChza2lwKQotCQl7Ci0JCSAgbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQkJICByZWxvY2F0ZSA9IGZhbHNlOwotCQl9Ci0JICAgICAgZWxzZSBpZiAocl90eXBlID09IFJfMzg2X1BDMzIpCi0JCXsKLQkJICBCRkRfQVNTRVJUIChoICE9IE5VTEwgJiYgaC0+ZHluaW5keCAhPSAtMSk7Ci0JCSAgcmVsb2NhdGUgPSBmYWxzZTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSXzM4Nl9QQzMyKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIGgtPmR5bmluZHggbWF5IGJlIC0xIGlmIHRoaXMgc3ltYm9sIHdhcyBtYXJrZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgIGJlY29tZSBsb2NhbC4gICovCi0JCSAgaWYgKGggPT0gTlVMTAotCQkgICAgICB8fCAoKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JCQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApKQotCQkgICAgewotCQkgICAgICByZWxvY2F0ZSA9IHRydWU7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfMzg2X1JFTEFUSVZFKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCQkgICAgICByZWxvY2F0ZSA9IGZhbHNlOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSXzM4Nl8zMik7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJKCgoRWxmMzJfRXh0ZXJuYWxfUmVsICopCi0JCQkJCSAgc3JlbG9jLT5jb250ZW50cykKLQkJCQkJICsgc3JlbG9jLT5yZWxvY19jb3VudCkpOwotCSAgICAgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQotCSAgICAgIC8qIElmIHRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvCi0JCSBub3Qgd2FudCB0byBmaWRkbGUgd2l0aCB0aGUgYWRkZW5kLiAgT3RoZXJ3aXNlLCB3ZQotCQkgbmVlZCB0byBpbmNsdWRlIHRoZSBzeW1ib2wgdmFsdWUgc28gdGhhdCBpdCBiZWNvbWVzCi0JCSBhbiBhZGRlbmQgZm9yIHRoZSBkeW5hbWljIHJlbG9jLiAgKi8KLQkgICAgICBpZiAoISByZWxvY2F0ZSkKLQkJY29udGludWU7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkgICAgcmVsb2NhdGlvbiwgKGJmZF92bWEpIDApOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaCAhPSBOVUxMKQotCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQllbHNlCi0JCSAgewotCQkgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQkgICAgc3ltLT5zdF9uYW1lKTsKLQkJICAgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCQkgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCQkgIH0KLQkJaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0gICAgICBiZmRfdm1hIHBsdF9pbmRleDsKLSAgICAgIGJmZF92bWEgZ290X29mZnNldDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgU2V0Ci0JIGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNnb3QgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOwotCi0gICAgICAvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSB3aGljaAotCSBjb3JyZXNwb25kcyB0byB0aGlzIHN5bWJvbC4gIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoaXMgc3ltYm9sCi0JIGluIGFsbCB0aGUgc3ltYm9scyBmb3Igd2hpY2ggd2UgYXJlIG1ha2luZyBwbHQgZW50cmllcy4gIFRoZQotCSBmaXJzdCBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgaXMgcmVzZXJ2ZWQuICAqLwotICAgICAgcGx0X2luZGV4ID0gaC0+cGx0Lm9mZnNldCAvIFBMVF9FTlRSWV9TSVpFIC0gMTsKLQotICAgICAgLyogR2V0IHRoZSBvZmZzZXQgaW50byB0aGUgLmdvdCB0YWJsZSBvZiB0aGUgZW50cnkgdGhhdAotCSBjb3JyZXNwb25kcyB0byB0aGlzIGZ1bmN0aW9uLiAgRWFjaCAuZ290IGVudHJ5IGlzIDQgYnl0ZXMuCi0JIFRoZSBmaXJzdCB0aHJlZSBhcmUgcmVzZXJ2ZWQuICAqLwotICAgICAgZ290X29mZnNldCA9IChwbHRfaW5kZXggKyAzKSAqIDQ7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgbWVtY3B5IChzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQsIGVsZl9pMzg2X3BsdF9lbnRyeSwKLQkJICBQTFRfRU5UUllfU0laRSk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgICAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGdvdF9vZmZzZXQpLAotCQkgICAgICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyAyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWVtY3B5IChzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQsIGVsZl9pMzg2X3BpY19wbHRfZW50cnksCi0JCSAgUExUX0VOVFJZX1NJWkUpOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZ290X29mZnNldCwKLQkJICAgICAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgMik7Ci0JfQotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBwbHRfaW5kZXggKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCksCi0JCSAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgNyk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAtIChoLT5wbHQub2Zmc2V0ICsgUExUX0VOVFJZX1NJWkUpLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDEyKTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgKyBoLT5wbHQub2Zmc2V0Ci0JCSAgICsgNiksCi0JCSAgc2dvdC0+Y29udGVudHMgKyBnb3Rfb2Zmc2V0KTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWwucGx0IHNlY3Rpb24uICAqLwotICAgICAgcmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgZ290X29mZnNldCk7Ci0gICAgICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSXzM4Nl9KVU1QX1NMT1QpOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmcmVsLAotCQkJCSgoRWxmMzJfRXh0ZXJuYWxfUmVsICopIHNyZWwtPmNvbnRlbnRzCi0JCQkJICsgcGx0X2luZGV4KSk7Ci0KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbgotCSAgICAgdGhlIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCi0JICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0Ci0JIHVwLiAgKi8KLQotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKLQotICAgICAgcmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBMaWtld2lzZSBpZgotCSB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwgYmVjYXVzZSBvZiBhIHZlcnNpb24gZmlsZS4KLQkgVGhlIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4KLQkgaW5pdGlhbGl6ZWQgaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24uICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCXJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfMzg2X1JFTEFUSVZFKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyBoLT5nb3Qub2Zmc2V0KTsKLQkgIHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfMzg2X0dMT0JfREFUKTsKLQl9Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwKLQkJCQkoKEVsZjMyX0V4dGVybmFsX1JlbCAqKSBzcmVsLT5jb250ZW50cwotCQkJCSArIHNyZWwtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3NyZWwtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX0NPUFkpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgbmVlZHMgYSBjb3B5IHJlbG9jLiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMQotCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkJCSAgICIucmVsLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgcmVsLnJfb2Zmc2V0ID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl8zODZfQ09QWSk7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZyZWwsCi0JCQkJKChFbGYzMl9FeHRlcm5hbF9SZWwgKikgcy0+Y29udGVudHMKLQkJCQkgKyBzLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgLyogTWFyayBfRFlOQU1JQyBhbmQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGFzIGFic29sdXRlLiAgKi8KLSAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzZHluOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBCRkRfQVNTRVJUIChzZHluICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgYXNlY3Rpb24gKnM7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUExUR09UOgotCSAgICAgIG5hbWUgPSAiLmdvdCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX0pNUFJFTDoKLQkgICAgICBuYW1lID0gIi5yZWwucGx0IjsKLQkgICAgZ2V0X3ZtYToKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1BMVFJFTFNaOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWwucGx0Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplOwotCSAgICAgIGVsc2UKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fcmF3X3NpemU7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1JFTFNaOgotCSAgICAgIC8qIE15IHJlYWRpbmcgb2YgdGhlIFNWUjQgQUJJIGluZGljYXRlcyB0aGF0IHRoZQotCQkgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgcmVsb2NzIChEVF9KTVBSRUwpIHNob3VsZCBiZQotCQkgaW5jbHVkZWQgaW4gdGhlIG92ZXJhbGwgcmVsb2NzIChEVF9SRUwpLiAgVGhpcyBpcwotCQkgd2hhdCBTb2xhcmlzIGRvZXMuICBIb3dldmVyLCBVbml4V2FyZSBjYW4gbm90IGhhbmRsZQotCQkgdGhhdCBjYXNlLiAgVGhlcmVmb3JlLCB3ZSBvdmVycmlkZSB0aGUgRFRfUkVMU1ogZW50cnkKLQkJIGhlcmUgdG8gbWFrZSBpdCBub3QgaW5jbHVkZSB0aGUgSk1QUkVMIHJlbG9jcy4gIFNpbmNlCi0JCSB0aGUgbGlua2VyIHNjcmlwdCBhcnJhbmdlcyBmb3IgLnJlbC5wbHQgdG8gZm9sbG93IGFsbAotCQkgb3RoZXIgcmVsb2NhdGlvbiBzZWN0aW9ucywgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeQotCQkgYWJvdXQgY2hhbmdpbmcgdGhlIERUX1JFTCBlbnRyeS4gICovCi0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlbC5wbHQiKTsKLQkgICAgICBpZiAocyAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQkgICAgZHluLmRfdW4uZF92YWwgLT0gcy0+X2Nvb2tlZF9zaXplOwotCQkgIGVsc2UKLQkJICAgIGR5bi5kX3VuLmRfdmFsIC09IHMtPl9yYXdfc2l6ZTsKLQkJfQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIGlmIChzcGx0ICYmIHNwbHQtPl9yYXdfc2l6ZSA+IDApCi0JewotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgbWVtY3B5IChzcGx0LT5jb250ZW50cywgZWxmX2kzODZfcGljX3BsdDBfZW50cnksIFBMVF9FTlRSWV9TSVpFKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1lbWNweSAoc3BsdC0+Y29udGVudHMsIGVsZl9pMzg2X3BsdDBfZW50cnksIFBMVF9FTlRSWV9TSVpFKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJICBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2dvdC0+b3V0cHV0X29mZnNldCArIDQsCi0JCQkgIHNwbHQtPmNvbnRlbnRzICsgMik7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJCSAgc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNnb3QtPm91dHB1dF9vZmZzZXQgKyA4LAotCQkJICBzcGx0LT5jb250ZW50cyArIDgpOwotCSAgICB9Ci0KLQkgIC8qIFVuaXhXYXJlIHNldHMgdGhlIGVudHNpemUgb2YgLnBsdCB0byA0LCBhbHRob3VnaCB0aGF0IGRvZXNuJ3QKLQkgICAgIHJlYWxseSBzZWVtIGxpa2UgdGhlIHJpZ2h0IHZhbHVlLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9IDQ7Ci0JfQotICAgIH0KLQotICAvKiBGaWxsIGluIHRoZSBmaXJzdCB0aHJlZSBlbnRyaWVzIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKHNkeW4gPT0gTlVMTCkKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMpOwotICAgICAgZWxzZQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDQpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgOCk7Ci0gICAgfQotCi0gIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9IDQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCWJmZF9lbGYzMl9pMzg2X3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJlbGYzMi1pMzg2IgotI2RlZmluZSBFTEZfQVJDSAkJCWJmZF9hcmNoX2kzODYKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fMzg2Ci0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MTAwMAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJZWxmX2kzODZfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCWVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLQkJCQkJZWxmX2kzODZfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCV9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0JCQkJCWVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCWVsZl9pMzg2X2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wgXAotCQkJCQllbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wgXAotCQkJCQllbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQllbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJZWxmX2kzODZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJZWxmX2kzODZfZ2Nfc3dlZXBfaG9vawotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwkxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdAkxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seQkxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bQkwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZQkxMgotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUJUExUX0VOVFJZX1NJWkUKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWk4NjAuYyBiL2JmZC9lbGYzMi1pODYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NTM3YTcuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWk4NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIEludGVsIDg2MCBzcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCV9iZmRfZWxmX25vX2luZm9fdG9faG93dG8KLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQliZmRfZWxmMzJfaTg2MF92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICJlbGYzMi1pODYwIgotI2RlZmluZSBFTEZfQVJDSAliZmRfYXJjaF9pODYwCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUgRU1fODYwCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tMzJyLmMgYi9iZmQvZWxmMzItbTMyci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmY4NTIzLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tMzJyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDgyICswLDAgQEAKLS8qIE0zMlItc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRi4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9tMzJyLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTMycl9lbGZfMTBfcGNyZWxfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG0zMnJfZWxmX2RvXzEwX3BjcmVsX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCByZWxvY19ob3d0b190eXBlICosIGFzZWN0aW9uICosCi0JICAgYmZkX2J5dGUgKiwgYmZkX3ZtYSwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9oaTE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgbTMycl9lbGZfcmVsb2NhdGVfaGkxNgotICBQQVJBTVMgKChiZmQgKiwgaW50LCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCSAgIGJmZF9ieXRlICosIGJmZF92bWEpKTsKLWJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9sbzE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9zZGExNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIG0zMnJfaW5mb190b19ob3d0b19yZWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKLWJvb2xlYW4gX2JmZF9tMzJyX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKiwgaW50ICopKTsKLXZvaWQgX2JmZF9tMzJyX2VsZl9zeW1ib2xfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci0jaWYgMCAvKiBub3QgeWV0ICovCi1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotI2VuZGlmCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTMycl9lbGZfZmluYWxfc2RhX2Jhc2UKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiosIGJmZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfb2JqZWN0X3AKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIG0zMnJfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIG0zMnJfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi0jZGVmaW5lIE5PUF9JTlNOCQkweDcwMDAKLSNkZWZpbmUgTUFLRV9QQVJBTExFTChpbnNuKQkoKGluc24pIHwgMHg4MDAwKQotCi0vKiBVc2UgUkVMIGluc3RlYWQgb2YgUkVMQSB0byBzYXZlIHNwYWNlLgotICAgVGhpcyBvbmx5IHNhdmVzIHNwYWNlIGluIGxpYnJhcmllcyBhbmQgb2JqZWN0IGZpbGVzLCBidXQgcGVyaGFwcwotICAgcmVsb2NzIHdpbGwgYmUgcHV0IGluIFJPTT8gIEFsbCBpbiBhbGwgdGhvdWdoLCBSRUwgcmVsb2NzIGFyZSBhIHBhaW4KLSAgIHRvIHdvcmsgd2l0aC4gICovCi0jZGVmaW5lIFVTRV9SRUwKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbTMycl9lbGZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX00zMlJfMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8xNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NMzJSXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjQgYml0IGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NMzJSXzI0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMjQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gUEMgUmVsYXRpdmUgMTAtYml0IHJlbG9jYXRpb24sIHNoaWZ0ZWQgYnkgMi4KLSAgICAgVGhpcyByZWxvYyBpcyBjb21wbGljYXRlZCBiZWNhdXNlIHJlbG9jYXRpb25zIGFyZSByZWxhdGl2ZSB0byBwYyAmIC00LgotICAgICBpLmUuIGJyYW5jaGVzIGluIHRoZSByaWdodCBpbnNuIHNsb3QgdXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBsZWZ0IGluc24KLSAgICAgc2xvdCBmb3IgcGMuICAqLwotICAvKiA/Pz8gSXQncyBub3QgY2xlYXIgd2hldGhlciB0aGlzIHNob3VsZCBoYXZlIHBhcnRpYWxfaW5wbGFjZSBzZXQgb3Igbm90LgotICAgICBCcmFuY2ggcmVsYXhpbmcgaW4gdGhlIGFzc2VtYmxlciBjYW4gc3RvcmUgdGhlIGFkZGVuZCBpbiB0aGUgaW5zbiwKLSAgICAgYW5kIGlmIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gZ2V0cyBjYWxsZWQgdGhlIGFkZGVuZCBtYXkgZ2V0IGFkZGVkCi0gICAgIGFnYWluLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl8xMF9QQ1JFTCwJLyogdHlwZSAqLwotCSAyLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEwLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmXzEwX3BjcmVsX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMTBfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkgICAgICAgIC8qIHNyY19tYXNrICovCi0JIDB4ZmYsICAgCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE4IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDIuICAqLwotICBIT1dUTyAoUl9NMzJSXzE4X1BDUkVMLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8xOF9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMjYgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMi4gICovCi0gIC8qID8/PyBJdCdzIG5vdCBjbGVhciB3aGV0aGVyIHRoaXMgc2hvdWxkIGhhdmUgcGFydGlhbF9pbnBsYWNlIHNldCBvciBub3QuCi0gICAgIEJyYW5jaCByZWxheGluZyBpbiB0aGUgYXNzZW1ibGVyIGNhbiBzdG9yZSB0aGUgYWRkZW5kIGluIHRoZSBpbnNuLAotICAgICBhbmQgaWYgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiBnZXRzIGNhbGxlZCB0aGUgYWRkZW5kIG1heSBnZXQgYWRkZWQKLSAgICAgYWdhaW4uICAqLwotICBIT1dUTyAoUl9NMzJSXzI2X1BDUkVMLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8yNl9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgYWRkcmVzcyB3aGVuIGxvd2VyIDE2IGlzIG9yJ2QgaW4uICAqLwotICBIT1dUTyAoUl9NMzJSX0hJMTZfVUxPLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtMzJyX2VsZl9oaTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfSEkxNl9VTE8iLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGFkZHJlc3Mgd2hlbiBsb3dlciAxNiBpcyBhZGRlZCBpbi4gICovCi0gIEhPV1RPIChSX00zMlJfSEkxNl9TTE8sCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmX2hpMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl9ISTE2X1NMTyIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3dlciAxNiBiaXRzIG9mIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NMzJSX0xPMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmX2xvMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl9MTzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTbWFsbCBkYXRhIGFyZWEgMTYgYml0cyBvZmZzZXQuICAqLwotICBIT1dUTyAoUl9NMzJSX1NEQTE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmX3NkYTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfU0RBMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAvKiBGSVhNRTogY29ycmVjdD8gKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9NMzJSX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX00zMlJfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX00zMlJfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX00zMlJfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi19OwotDAotLyogSGFuZGxlIHRoZSBSX00zMlJfMTBfUENSRUwgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl8xMF9wY3JlbF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiBhYmZkOwotICAgICBhcmVsZW50ICogcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiBzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqIG91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiogZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogVGhpcyBwYXJ0IGlzIGZyb20gYmZkX2VsZl9nZW5lcmljX3JlbG9jLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgKCEgcmVsb2NfZW50cnktPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkgIHx8IHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgLyogRklYTUU6IFNlZSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLiAgSXMgdGhpcyByaWdodD8gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotICAgIH0KLQotICByZXR1cm4gbTMycl9lbGZfZG9fMTBfcGNyZWxfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LT5ob3d0bywKLQkJCQkgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICBkYXRhLCByZWxvY19lbnRyeS0+YWRkcmVzcywKLQkJCQkgICAgIHN5bWJvbC0+c2VjdGlvbiwKLQkJCQkgICAgIChzeW1ib2wtPnZhbHVlCi0JCQkJICAgICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCksCi0JCQkJICAgICByZWxvY19lbnRyeS0+YWRkZW5kKTsKLX0KLQotLyogVXRpbGl0eSB0byBhY3R1YWxseSBwZXJmb3JtIGFuIFJfTTMyUl8xMF9QQ1JFTCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW0zMnJfZWxmX2RvXzEwX3BjcmVsX3JlbG9jIChhYmZkLCBob3d0bywgaW5wdXRfc2VjdGlvbiwgZGF0YSwgb2Zmc2V0LAotCQkJICAgIHN5bWJvbF9zZWN0aW9uLCBzeW1ib2xfdmFsdWUsIGFkZGVuZCkKLSAgICAgYmZkICphYmZkOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYXNlY3Rpb24gKnN5bWJvbF9zZWN0aW9uOwotICAgICBiZmRfdm1hIHN5bWJvbF92YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIGJmZF9zaWduZWRfdm1hIHJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGxvbmcgeDsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHN0YXR1czsKLQotICAvKiBTYW5pdHkgY2hlY2sgdGhlIGFkZHJlc3MgKG9mZnNldCBpbiBzZWN0aW9uKS4gICovCi0gIGlmIChvZmZzZXQgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIHJlbG9jYXRpb24gPSBzeW1ib2xfdmFsdWUgKyBhZGRlbmQ7Ci0gIC8qIE1ha2UgaXQgcGMgcmVsYXRpdmUuICAqLwotICByZWxvY2F0aW9uIC09CShpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAvKiBUaGVzZSBqdW1wcyBtYXNrIG9mZiB0aGUgbG93ZXIgdHdvIGJpdHMgb2YgdGhlIGN1cnJlbnQgYWRkcmVzcwotICAgICBiZWZvcmUgZG9pbmcgcGNyZWwgY2FsY3VsYXRpb25zLiAgKi8KLSAgcmVsb2NhdGlvbiAtPSAob2Zmc2V0ICYgLTRMKTsKLQotICBpZiAocmVsb2NhdGlvbiA8IC0weDIwMCB8fCByZWxvY2F0aW9uID4gMHgxZmYpCi0gICAgc3RhdHVzID0gYmZkX3JlbG9jX292ZXJmbG93OwotICBlbHNlCi0gICAgc3RhdHVzID0gYmZkX3JlbG9jX29rOwotCi0gIHggPSBiZmRfZ2V0XzE2IChhYmZkLCBkYXRhICsgb2Zmc2V0KTsKLSAgcmVsb2NhdGlvbiA+Pj0gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0gIHJlbG9jYXRpb24gPDw9IGhvd3RvLT5iaXRwb3M7Ci0gIHggPSAoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzayk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIHgsIGRhdGEgKyBvZmZzZXQpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgUl9NMzJSX0hJMTZfW1NVXUxPIHJlbG9jcy4KLSAgIEhJMTZfU0xPIGlzIGZvciB0aGUgYWRkMyBhbmQgbG9hZC9zdG9yZSB3aXRoIGRpc3BsYWNlbWVudCBpbnN0cnVjdGlvbnMuCi0gICBISTE2X1VMTyBpcyBmb3IgdGhlIG9yMyBpbnN0cnVjdGlvbi4KLSAgIEZvciBSX00zMlJfSEkxNl9TTE8sIHRoZSBsb3dlciAxNiBiaXRzIGFyZSBzaWduIGV4dGVuZGVkIHdoZW4gYWRkZWQgdG8KLSAgIHRoZSBoaWdoIDE2IGJ5dGVzIHNvIGlmIHRoZSBsb3dlciAxNiBiaXRzIGFyZSBuZWdhdGl2ZSAoYml0IDE1ID09IDEpIHRoZW4KLSAgIHdlIG11c3QgYWRkIG9uZSB0byB0aGUgaGlnaCAxNiBieXRlcyAod2hpY2ggd2lsbCBnZXQgc3VidHJhY3RlZCBvZmYgd2hlbgotICAgdGhlIGxvdyAxNiBiaXRzIGFyZSBhZGRlZCkuCi0gICBUaGVzZSByZWxvY3MgaGF2ZSB0byBiZSBkb25lIGluIGNvbWJpbmF0aW9uIHdpdGggYW4gUl9NMzJSX0xPMTYgcmVsb2MKLSAgIGJlY2F1c2UgdGhlcmUgaXMgYSBjYXJyeSBmcm9tIHRoZSBMTzE2IHRvIHRoZSBISTE2LiAgSGVyZSB3ZSBqdXN0IHNhdmUKLSAgIHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkOyB3ZSBkbyB0aGUgYWN0dWFsIHJlbG9jYXRpb24gd2hlbiB3ZSBzZWUgdGhlIExPMTYuCi0gICBUaGlzIGNvZGUgaXMgY29waWVkIGZyb20gdGhlIGVsZjMyLW1pcHMuYy4gIFdlIGFsc28gc3VwcG9ydCBhbiBhcmJpdHJhcnkKLSAgIG51bWJlciBvZiBISTE2IHJlbG9jcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgTE8xNiByZWxvYy4gIFRoZQotICAgYXNzZW1ibGVyIHNvcnRzIHRoZSByZWxvY3MgdG8gZW5zdXJlIGVhY2ggSEkxNiBpbW1lZGlhdGVseSBwcmVjZWRlcyBpdHMKLSAgIExPMTYuICBIb3dldmVyIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb3BpZXMsIHRoZSBhc3NlbWJsZXIgbWF5IG5vdCBmaW5kCi0gICB0aGUgcmVhbCBMTzE2IHNvIGl0IHBpY2tzIHRoZSBmaXJzdCBvbmUgaXQgZmluZHMuICAqLwotCi1zdHJ1Y3QgbTMycl9oaTE2Ci17Ci0gIHN0cnVjdCBtMzJyX2hpMTYgKm5leHQ7Ci0gIGJmZF9ieXRlICphZGRyOwotICBiZmRfdm1hIGFkZGVuZDsKLX07Ci0KLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgYSBzdGF0aWMgdmFyaWFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IG0zMnJfaGkxNiAqbTMycl9oaTE2X2xpc3Q7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW0zMnJfZWxmX2hpMTZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgc3RydWN0IG0zMnJfaGkxNiAqbjsKLQotICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuCi0gICAgIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG9uJ3Qgd2FudAotICAgICB0byBjaGFuZ2UgYW55dGhpbmcuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcyAob2Zmc2V0IGluIHNlY3Rpb24pLiAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldCA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIC8qIFNhdmUgdGhlIGluZm9ybWF0aW9uLCBhbmQgbGV0IExPMTYgZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KLSAgbiA9IChzdHJ1Y3QgbTMycl9oaTE2ICopIGJmZF9tYWxsb2MgKHNpemVvZiAqbik7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICBuLT5hZGRyID0gKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbi0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLSAgbi0+bmV4dCA9IG0zMnJfaGkxNl9saXN0OwotICBtMzJyX2hpMTZfbGlzdCA9IG47Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogSGFuZGxlIGFuIE0zMlIgRUxGIEhJMTYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbTMycl9lbGZfcmVsb2NhdGVfaGkxNiAoaW5wdXRfYmZkLCB0eXBlLCByZWxoaSwgcmVsbG8sIGNvbnRlbnRzLCBhZGRlbmQpCi0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBpbnQgdHlwZTsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGhpOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsbG87Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgYmZkX3ZtYSBhZGRsbzsKLQotICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbGhpLT5yX29mZnNldCk7Ci0KLSAgYWRkbG8gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsbG8tPnJfb2Zmc2V0KTsKLSAgaWYgKHR5cGUgPT0gUl9NMzJSX0hJMTZfU0xPKQotICAgIGFkZGxvID0gKChhZGRsbyAmIDB4ZmZmZikgXiAweDgwMDApIC0gMHg4MDAwOwotICBlbHNlCi0gICAgYWRkbG8gJj0gMHhmZmZmOwotCi0gIGFkZGVuZCArPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGFkZGxvOwotCi0gIC8qIFJlYWNjb3VudCBmb3Igc2lnbiBleHRlbnNpb24gb2YgbG93IHBhcnQuICAqLwotICBpZiAodHlwZSA9PSBSX00zMlJfSEkxNl9TTE8KLSAgICAgICYmIChhZGRlbmQgJiAweDgwMDApICE9IDApCi0gICAgYWRkZW5kICs9IDB4MTAwMDA7Ci0KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCSAgICAgIChpbnNuICYgMHhmZmZmMDAwMCkgfCAoKGFkZGVuZCA+PiAxNikgJiAweGZmZmYpLAotCSAgICAgIGNvbnRlbnRzICsgcmVsaGktPnJfb2Zmc2V0KTsKLX0KLQotLyogRG8gYW4gUl9NMzJSX0xPMTYgcmVsb2NhdGlvbi4gIFRoaXMgaXMgYSBzdHJhaWdodGZvcndhcmQgMTYgYml0Ci0gICBpbnBsYWNlIHJlbG9jYXRpb247IHRoaXMgZnVuY3Rpb24gZXhpc3RzIGluIG9yZGVyIHRvIGRvIHRoZQotICAgUl9NMzJSX0hJMTZfW1NVXUxPIHJlbG9jYXRpb24gZGVzY3JpYmVkIGFib3ZlLiAgKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl9sbzE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAobTMycl9oaTE2X2xpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbTMycl9oaTE2ICpsOwotCi0gICAgICBsID0gbTMycl9oaTE2X2xpc3Q7Ci0gICAgICB3aGlsZSAobCAhPSBOVUxMKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKLQkgIHN0cnVjdCBtMzJyX2hpMTYgKm5leHQ7Ci0KLQkgIC8qIERvIHRoZSBISTE2IHJlbG9jYXRpb24uICBOb3RlIHRoYXQgd2UgYWN0dWFsbHkgZG9uJ3QgbmVlZAotCSAgICAgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgTE8xNiBpdHNlbGYsIGV4Y2VwdCB3aGVyZSB0bwotCSAgICAgZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlIExPMTYuICAqLwotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGwtPmFkZHIpOwotCSAgdmFsbG8gPSAoKGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpCi0JCSAgICYgMHhmZmZmKSBeIDB4ODAwMCkgLSAweDgwMDA7Ci0JICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOwotCSAgdmFsICs9IGwtPmFkZGVuZDsKLQotCSAgLyogUmVhY2NvdW50IGZvciBzaWduIGV4dGVuc2lvbiBvZiBsb3cgcGFydC4gICovCi0JICBpZiAoKHZhbCAmIDB4ODAwMCkgIT0gMCkKLQkgICAgdmFsICs9IDB4MTAwMDA7Ci0KLQkgIGluc24gPSAoaW5zbiAmfiAweGZmZmYpIHwgKCh2YWwgPj4gMTYpICYgMHhmZmZmKTsKLQkgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGwtPmFkZHIpOwotCi0JICBuZXh0ID0gbC0+bmV4dDsKLQkgIGZyZWUgKGwpOwotCSAgbCA9IG5leHQ7Ci0JfQotCi0gICAgICBtMzJyX2hpMTZfbGlzdCA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIE5vdyBkbyB0aGUgTE8xNiByZWxvYyBpbiB0aGUgdXN1YWwgd2F5LiAgKi8KLSAgcmV0dXJuIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCQlpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKLX0KLQotLyogSGFuZGxlIHRoZSBSX00zMlJfU0RBMTYgcmVsb2MuCi0gICBUaGlzIHJlbG9jIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgYWRkcmVzcyBvZiBvYmplY3RzIGluIHRoZSBzbWFsbCBkYXRhIGFyZWEKLSAgIGFuZCB0byBwZXJmb3JtIGxvYWRzIGFuZCBzdG9yZXMgZnJvbSB0aGF0IGFyZWEuCi0gICBUaGUgbG93ZXIgMTYgYml0cyBhcmUgc2lnbiBleHRlbmRlZCBhbmQgYWRkZWQgdG8gdGhlIHJlZ2lzdGVyIHNwZWNpZmllZAotICAgaW4gdGhlIGluc3RydWN0aW9uLCB3aGljaCBpcyBhc3N1bWVkIHRvIHBvaW50IHRvIF9TREFfQkFTRV8uICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl9zZGExNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIFRoaXMgcGFydCBpcyBmcm9tIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBTZWUgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gIElzIHRoaXMgcmlnaHQ/ICAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgLyogRklYTUU6IG5vdCBzdXJlIHdoYXQgdG8gZG8gaGVyZSB5ZXQuICBCdXQgdGhlbiBhZ2FpbiwgdGhlIGxpbmtlcgotICAgICBtYXkgbmV2ZXIgY2FsbCB1cy4gICovCi0gIGFib3J0ICgpOwotfQotDAotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBNMzJSIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBtMzJyX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtMzJyX3JlbG9jX21hcCBtMzJyX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NMzJSX05PTkUgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfTTMyUl8xNiB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9NMzJSXzMyIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfMjQsIFJfTTMyUl8yNCB9LAotICB7IEJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMLCBSX00zMlJfMTBfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl8xOF9QQ1JFTCwgUl9NMzJSXzE4X1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfMjZfUENSRUwsIFJfTTMyUl8yNl9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPLCBSX00zMlJfSEkxNl9VTE8gfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTywgUl9NMzJSX0hJMTZfU0xPIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfTE8xNiwgUl9NMzJSX0xPMTYgfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl9TREExNiwgUl9NMzJSX1NEQTE2IH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX00zMlJfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksIFJfTTMyUl9HTlVfVlRFTlRSWSB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgICBpIDwgc2l6ZW9mIChtMzJyX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBtMzJyX3JlbG9jX21hcCk7Ci0gICAgICAgaSsrKQotICAgIHsKLSAgICAgIGlmIChtMzJyX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZtMzJyX2VsZl9ob3d0b190YWJsZVttMzJyX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gTTMyUiBFTEYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbTMycl9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9NMzJSX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmbTMycl9lbGZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQwKLS8qIEdpdmVuIGEgQkZEIHNlY3Rpb24sIHRyeSB0byBsb2NhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRUxGIHNlY3Rpb24KLSAgIGluZGV4LiAgKi8KLQotYm9vbGVhbgotX2JmZF9tMzJyX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIGhkciwgc2VjLCByZXR2YWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBpbnQgKnJldHZhbDsKLXsKLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuc2NvbW1vbiIpID09IDApCi0gICAgewotICAgICAgKnJldHZhbCA9IFNITl9NMzJSX1NDT01NT047Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogTTMyUiBFTEYgdXNlcyB0d28gY29tbW9uIHNlY3Rpb25zLiAgT25lIGlzIHRoZSB1c3VhbCBvbmUsIGFuZCB0aGUgb3RoZXIKLSAgIGlzIGZvciBzbWFsbCBvYmplY3RzLiAgQWxsIHRoZSBzbWFsbCBvYmplY3RzIGFyZSBrZXB0IHRvZ2V0aGVyLCBhbmQgdGhlbgotICAgcmVmZXJlbmNlZCB2aWEgb25lIHJlZ2lzdGVyLCB3aGljaCB5aWVsZHMgZmFzdGVyIGFzc2VtYmxlciBjb2RlLiAgSXQgaXMKLSAgIHVwIHRvIHRoZSBjb21waWxlciB0byBlbWl0IGFuIGluc3RydWN0aW9uIHRvIGxvYWQgdGhlIHJlZ2lzdGVyIHdpdGgKLSAgIF9TREFfQkFTRS4gIFRoaXMgaXMgd2hhdCB3ZSB1c2UgZm9yIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gIFRoaXMKLSAgIGFwcHJvYWNoIGlzIGNvcGllZCBmcm9tIGVsZjMyLW1pcHMuYy4gICovCi1zdGF0aWMgYXNlY3Rpb24gbTMycl9lbGZfc2NvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgbTMycl9lbGZfc2NvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbTMycl9lbGZfc2NvbV9zeW1ib2xfcHRyOwotCi0vKiBIYW5kbGUgdGhlIHNwZWNpYWwgTTMyUiBzZWN0aW9uIG51bWJlcnMgdGhhdCBhIHN5bWJvbCBtYXkgdXNlLiAgKi8KLQotdm9pZAotX2JmZF9tMzJyX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyAoYWJmZCwgYXN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICphc3ltOwotewotICBlbGZfc3ltYm9sX3R5cGUgKmVsZnN5bTsKLQotICBlbGZzeW0gPSAoZWxmX3N5bWJvbF90eXBlICopIGFzeW07Ci0KLSAgc3dpdGNoIChlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHgpCi0gICAgewotICAgIGNhc2UgU0hOX00zMlJfU0NPTU1PTjoKLSAgICAgIGlmIChtMzJyX2VsZl9zY29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHNtYWxsIGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5uYW1lID0gIi5zY29tbW9uIjsKLQkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5mbGFncyA9IFNFQ19JU19DT01NT047Ci0JICBtMzJyX2VsZl9zY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmbTMycl9lbGZfc2NvbV9zZWN0aW9uOwotCSAgbTMycl9lbGZfc2NvbV9zZWN0aW9uLnN5bWJvbCA9ICZtMzJyX2VsZl9zY29tX3N5bWJvbDsKLQkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZtMzJyX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci0JICBtMzJyX2VsZl9zY29tX3N5bWJvbC5uYW1lID0gIi5zY29tbW9uIjsKLQkgIG0zMnJfZWxmX3Njb21fc3ltYm9sLmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgbTMycl9lbGZfc2NvbV9zeW1ib2wuc2VjdGlvbiA9ICZtMzJyX2VsZl9zY29tX3NlY3Rpb247Ci0JICBtMzJyX2VsZl9zY29tX3N5bWJvbF9wdHIgPSAmbTMycl9lbGZfc2NvbV9zeW1ib2w7Ci0JfQotICAgICAgYXN5bS0+c2VjdGlvbiA9ICZtMzJyX2VsZl9zY29tX3NlY3Rpb247Ci0gICAgICBhc3ltLT52YWx1ZSA9IGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgV2UgbXVzdCBoYW5kbGUgdGhlIHNwZWNpYWwgTTMyUiBzZWN0aW9uIG51bWJlcnMgaGVyZS4KLSAgIFdlIGFsc28ga2VlcCB3YXRjaGluZyBmb3Igd2hldGhlciB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgc2RhdGEgc3BlY2lhbAotICAgbGlua2VyIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lcDsKLSAgICAgZmxhZ3dvcmQgKmZsYWdzcDsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBiZmRfdm1hICp2YWxwOwotewotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmICgqbmFtZXApWzBdID09ICdfJyAmJiAoKm5hbWVwKVsxXSA9PSAnUycKLSAgICAgICYmIHN0cmNtcCAoKm5hbWVwLCAiX1NEQV9CQVNFXyIpID09IDApCi0gICAgewotICAgICAgLyogVGhpcyBpcyBzaW1wbGVyIHRoYW4gdXNpbmcgX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uCi0JIChvdXIgbmVlZHMgYXJlIHNpbXBsZXIgdGhhbiBwcGMncyBuZWVkcykuICBBbHNvCi0JIF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiBjdXJyZW50bHkgaGFzIGEgYnVnIHdoZXJlIGlmIGEgLnNkYXRhCi0JIHNlY3Rpb24gYWxyZWFkeSBleGlzdHMgYSBuZXcgb25lIGlzIGNyZWF0ZWQgdGhhdCBmb2xsb3dzIGl0IHdoaWNoCi0JIHNjcmV3cyBvZiBfU0RBX0JBU0VfIGFkZHJlc3MgY2FsY3MgYmVjYXVzZSBvdXRwdXRfb2Zmc2V0ICE9IDAuICAqLwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBhc2VjdGlvbiAqcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNkYXRhIik7Ci0KLSAgICAgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgY29iYmxlZCBmcm9tIGVsZjMyLXBwYy5jIGFuZCBlbGZsaW5rLmMuICAqLwotCi0gICAgICBpZiAocyA9PSBOVUxMKQotCXsKLQkgIGludCBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLQkgIHMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5zZGF0YSIpOwotCSAgaWYgKHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKTsKLQl9Ci0KLSAgICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQliZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9TREFfQkFTRV8iLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICAgICAgaWYgKChoID09IE5VTEwgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCSAgJiYgIShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywKLQkJCQkJCSBhYmZkLAotCQkJCQkJICJfU0RBX0JBU0VfIiwKLQkJCQkJCSBCU0ZfR0xPQkFMLAotCQkJCQkJIHMsCi0JCQkJCQkgMzI3NjgsCi0JCQkJCQkgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJCSBmYWxzZSwKLQkJCQkJCSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JCQkJCQkgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotICAgIH0KLQotICBzd2l0Y2ggKHN5bS0+c3Rfc2huZHgpCi0gICAgewotICAgIGNhc2UgU0hOX00zMlJfU0NPTU1PTjoKLSAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNjb21tb24iKTsKLSAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSBTREFfQkFTRSB2YWx1ZSwgc28gdGhhdCB3ZSBjYW4gYWRqdXN0IHRoZQotICAgc3ltYm9sIHZhbHVlIGNvcnJlY3RseS4gIFdlIGxvb2sgdXAgdGhlIHN5bWJvbCBfU0RBX0JBU0VfIGluIHRoZSBvdXRwdXQKLSAgIEJGRC4gIElmIHdlIGNhbid0IGZpbmQgaXQsIHdlJ3JlIHN0dWNrLiAgV2UgY2FjaGUgaXQgaW4gdGhlIEVMRgotICAgdGFyZ2V0IGRhdGEuICBXZSBkb24ndCBuZWVkIHRvIGFkanVzdCB0aGUgc3ltYm9sIHZhbHVlIGZvciBhbgotICAgZXh0ZXJuYWwgc3ltYm9sIGlmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW0zMnJfZWxmX2ZpbmFsX3NkYV9iYXNlIChvdXRwdXRfYmZkLCBpbmZvLCBlcnJvcl9tZXNzYWdlLCBwc2IpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJvcl9tZXNzYWdlOwotICAgICBiZmRfdm1hICpwc2I7Ci17Ci0gIGlmIChlbGZfZ3AgKG91dHB1dF9iZmQpID09IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9TREFfQkFTRV8iLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCWVsZl9ncCAob3V0cHV0X2JmZCkgPSAoaC0+dS5kZWYudmFsdWUKLQkJCSAgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIE9ubHkgZ2V0IHRoZSBlcnJvciBvbmNlLiAgKi8KLQkgICpwc2IgPSBlbGZfZ3AgKG91dHB1dF9iZmQpID0gNDsKLQkgICplcnJvcl9tZXNzYWdlID0KLQkgICAgKGNvbnN0IGNoYXIgKikgXygiU0RBIHJlbG9jYXRpb24gd2hlbiBfU0RBX0JBU0VfIG5vdCBkZWZpbmVkIik7Ci0JICByZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQl9Ci0gICAgfQotICAqcHNiID0gZWxmX2dwIChvdXRwdXRfYmZkKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQwKLS8qIFJlbG9jYXRlIGFuIE0zMlIvRCBFTEYgc2VjdGlvbi4KLSAgIFRoZXJlIGlzIHNvbWUgYXR0ZW1wdCB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdXNhYmxlIGZvciBtYW55IGFyY2hpdGVjdHVyZXMsCi0gICBib3RoIFVTRV9SRUwgYW5kIFVTRV9SRUxBIFsndHdvdWxkIGJlIG5pY2UgaWYgc3VjaCBhIGNyaXR0ZXIgZXhpc3RlZF0sCi0gICBpZiBvbmx5IHRvIHNlcnZlIGFzIGEgbGVhcm5pbmcgdG9vbC4KLQotICAgVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBuZXcgRUxGIGJhY2tlbmQgbGlua2VyCi0gICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCi0gICB6ZXJvLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3QgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKLSAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzCi0gICBuZWNlc3NhcnkuCi0KLSAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIHRoZSByZWxvYwotICAgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgotCi0gICBMT0NBTF9TWU1TIGlzIGEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCBpbiBsb2NhbCBzeW1ib2xzLgotCi0gICBMT0NBTF9TRUNUSU9OUyBpcyBhbiBhcnJheSBnaXZpbmcgdGhlIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUKLSAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0X3NobmR4IGZpZWxkIG9mIGVhY2ggbG9jYWwgc3ltYm9sLgotCi0gICBUaGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoZSBnbG9iYWwgc3ltYm9scyBjYW4gYmUgZm91bmQKLSAgIHZpYSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKS4KLQotICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUKLSAgIFNUQl9MT0NBTC9TVFRfU0VDVElPTiBzeW1ib2xzIHNwZWNpYWxseS4gIFRoZSBvdXRwdXQgc3ltYm9sIGlzCi0gICBnb2luZyB0byBiZSB0aGUgc2VjdGlvbiBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0Ci0gICBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSBhZGRlbmQgbXVzdCBiZSBhZGp1c3RlZAotICAgYWNjb3JkaW5nbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICAvKiBBc3N1bWUgc3VjY2Vzcy4gICovCi0gIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgLyogV2UgY2FuJ3QgbW9kaWZ5IHJfYWRkZW5kIGhlcmUgYXMgZWxmX2xpbmtfaW5wdXRfYmZkIGhhcyBhbiBhc3NlcnQgdG8KLQkgZW5zdXJlIGl0J3MgemVybyAod2UgdXNlIFJFTCByZWxvY3MsIG5vdCBSRUxBKS4gIFRoZXJlZm9yZSB0aGlzCi0JIHNob3VsZCBiZSBhc3NpZ25pbmcgemVybyB0byBgYWRkZW5kJywgYnV0IGZvciBjbGFyaXR5IHdlIHVzZQotCSBgcl9hZGRlbmQnLiAgKi8KLSAgICAgIGJmZF92bWEgYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIGJmZF92bWEgb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2cgPSBOVUxMOwotCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfTTMyUl9tYXgpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogdW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWQiKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgKGludCkgcl90eXBlKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChyX3R5cGUgPT0gUl9NMzJSX0dOVV9WVEVOVFJZCi0gICAgICAgICAgfHwgcl90eXBlID09IFJfTTMyUl9HTlVfVlRJTkhFUklUKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaG93dG8gPSBtMzJyX2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgc2VjID0gTlVMTDsKLQkgIGlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgLyogRXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBMb2NhbCBzeW1ib2wuICAqLwotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc3ltX25hbWUgPSAiPGxvY2FsIHN5bWJvbD4iOwotCSAgLyogU1RUX1NFQ1RJT046IHN5bWJvbCBpcyBhc3NvY2lhdGVkIHdpdGggYSBzZWN0aW9uLiAgKi8KLQkgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfU0VDVElPTikKLQkgICAgewotCSAgICAgIC8qIFN5bWJvbCBpc24ndCBhc3NvY2lhdGVkIHdpdGggYSBzZWN0aW9uLiAgTm90aGluZyB0byBkby4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0jaWZuZGVmIFVTRV9SRUwKLQkgIC8qIFRoaXMgY2FuJ3QgYmUgZG9uZSBmb3IgVVNFX1JFTCBiZWNhdXNlIGl0IGRvZXNuJ3QgbWVhbiBhbnl0aGluZwotCSAgICAgYW5kIGVsZl9saW5rX2lucHV0X2JmZCBhc3NlcnRzIHRoaXMgc3RheXMgemVyby4gICovCi0JICByZWwtPnJfYWRkZW5kID0gYWRkZW5kOwotI2VuZGlmCi0KLSNpZm5kZWYgVVNFX1JFTAotCSAgLyogQWRkZW5kcyBhcmUgc3RvcmVkIHdpdGggcmVsb2NzLiAgV2UncmUgZG9uZS4gICovCi0JICBjb250aW51ZTsKLSNlbHNlIC8qIFVTRV9SRUwgKi8KLQkgIC8qIElmIHBhcnRpYWxfaW5wbGFjZSwgd2UgbmVlZCB0byBzdG9yZSBhbnkgYWRkaXRpb25hbCBhZGRlbmQKLQkgICAgIGJhY2sgaW4gdGhlIHNlY3Rpb24uICAqLwotCSAgaWYgKCEgaG93dG8tPnBhcnRpYWxfaW5wbGFjZSkKLQkgICAgY29udGludWU7Ci0JICAvKiA/Pz8gSGVyZSBpcyBhIG5pY2UgcGxhY2UgdG8gY2FsbCBhIHNwZWNpYWxfZnVuY3Rpb24KLQkgICAgIGxpa2UgaGFuZGxlci4gICovCi0JICBpZiAocl90eXBlICE9IFJfTTMyUl9ISTE2X1NMTyAmJiByX3R5cGUgIT0gUl9NMzJSX0hJMTZfVUxPKQotCSAgICByID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwKLQkJCQkJYWRkZW5kLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqbG9yZWw7Ci0KLQkgICAgICAvKiBXZSBhbGxvdyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIEhJMTYgcmVsb2NzIGJlZm9yZSB0aGUKLQkJIExPMTYgcmVsb2MuICBUaGlzIHBlcm1pdHMgZ2NjIHRvIGVtaXQgdGhlIEhJIGFuZCBMTyByZWxvY3MKLQkJIGl0c2VsZi4gICovCi0JICAgICAgZm9yIChsb3JlbCA9IHJlbCArIDE7Ci0JCSAgIChsb3JlbCA8IHJlbGVuZAotCQkgICAgJiYgKEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NMzJSX0hJMTZfU0xPCi0JCQl8fCBFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTTMyUl9ISTE2X1VMTykpOwotCQkgICBsb3JlbCsrKQotCQljb250aW51ZTsKLQkgICAgICBpZiAobG9yZWwgPCByZWxlbmQKLQkJICAmJiBFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTTMyUl9MTzE2KQotCQl7Ci0JCSAgbTMycl9lbGZfcmVsb2NhdGVfaGkxNiAoaW5wdXRfYmZkLCByX3R5cGUsIHJlbCwgbG9yZWwsCi0JCQkJCSAgY29udGVudHMsIGFkZGVuZCk7Ci0JCSAgciA9IGJmZF9yZWxvY19vazsKLQkJfQotCSAgICAgIGVsc2UKLQkJciA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsCi0JCQkJCSAgICBhZGRlbmQsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgICAgfQotI2VuZGlmIC8qIFVTRV9SRUwgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0JICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0JICBzeW0gPSBOVUxMOwotCSAgc2VjID0gTlVMTDsKLQotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIC8qIExvY2FsIHN5bWJvbC4gICovCi0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgICAgICBzeW1fbmFtZSA9ICI8bG9jYWwgc3ltYm9sPiI7Ci0JICAgICAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJICAgICsgc3ltLT5zdF92YWx1ZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEV4dGVybmFsIHN5bWJvbC4gICovCi0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgICAgICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCQloID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICAgICAgc3ltX25hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCi0JICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQl7Ci0JCSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCSAgICByZWxvY2F0aW9uID0gMDsKLQkJICBlbHNlCi0JCSAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JCXJlbG9jYXRpb24gPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkJICBpbnB1dF9zZWN0aW9uLCBvZmZzZXQpKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcy4gICovCi0JICBpZiAob2Zmc2V0ID4gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKQotCSAgICB7Ci0JICAgICAgciA9IGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCSAgICAgIGdvdG8gY2hlY2tfcmVsb2M7Ci0JICAgIH0KLQotCSAgc3dpdGNoICgoaW50KSByX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSAoaW50KSBSX00zMlJfMTBfUENSRUwgOgotCSAgICAgIHIgPSBtMzJyX2VsZl9kb18xMF9wY3JlbF9yZWxvYyAoaW5wdXRfYmZkLCBob3d0bywgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgICAgY29udGVudHMsIG9mZnNldCwKLQkJCQkJICAgICAgc2VjLCByZWxvY2F0aW9uLCBhZGRlbmQpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgKGludCkgUl9NMzJSX0hJMTZfU0xPIDoKLQkgICAgY2FzZSAoaW50KSBSX00zMlJfSEkxNl9VTE8gOgotCSAgICAgIHsKLQkJRWxmX0ludGVybmFsX1JlbGEgKmxvcmVsOwotCi0JCS8qIFdlIGFsbG93IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgSEkxNiByZWxvY3MgYmVmb3JlIHRoZQotCQkgICBMTzE2IHJlbG9jLiAgVGhpcyBwZXJtaXRzIGdjYyB0byBlbWl0IHRoZSBISSBhbmQgTE8gcmVsb2NzCi0JCSAgIGl0c2VsZi4gICovCi0JCWZvciAobG9yZWwgPSByZWwgKyAxOwotCQkgICAgIChsb3JlbCA8IHJlbGVuZAotCQkgICAgICAmJiAoRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX00zMlJfSEkxNl9TTE8KLQkJCSAgfHwgRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX00zMlJfSEkxNl9VTE8pKTsKLQkJICAgICBsb3JlbCsrKQotCQkgIGNvbnRpbnVlOwotCQlpZiAobG9yZWwgPCByZWxlbmQKLQkJICAgICYmIEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NMzJSX0xPMTYpCi0JCSAgewotCQkgICAgbTMycl9lbGZfcmVsb2NhdGVfaGkxNiAoaW5wdXRfYmZkLCByX3R5cGUsIHJlbCwgbG9yZWwsCi0JCQkJCSAgICBjb250ZW50cywgcmVsb2NhdGlvbiArIGFkZGVuZCk7Ci0JCSAgICByID0gYmZkX3JlbG9jX29rOwotCQkgIH0KLQkJZWxzZQotCQkgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCQljb250ZW50cywgb2Zmc2V0LAotCQkJCQkJcmVsb2NhdGlvbiwgYWRkZW5kKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAoaW50KSBSX00zMlJfU0RBMTYgOgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlCRkRfQVNTRVJUIChzZWMgIT0gTlVMTCk7Ci0JCW5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKTsKLQotCQlpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKG5hbWUsICIuc2NvbW1vbiIpID09IDApCi0JCSAgewotCQkgICAgYmZkX3ZtYSBzZGFfYmFzZTsKLQkJICAgIGJmZCAqb3V0X2JmZCA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotCi0JCSAgICByID0gbTMycl9lbGZfZmluYWxfc2RhX2Jhc2UgKG91dF9iZmQsIGluZm8sCi0JCQkJCQkgJmVycm1zZywKLQkJCQkJCSAmc2RhX2Jhc2UpOwotCQkgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCQkgICAgICB7Ci0JCQlyZXQgPSBmYWxzZTsKLQkJCWdvdG8gY2hlY2tfcmVsb2M7Ci0JCSAgICAgIH0KLQotCQkgICAgLyogQXQgdGhpcyBwb2ludCBgcmVsb2NhdGlvbicgY29udGFpbnMgdGhlIG9iamVjdCdzCi0JCSAgICAgICBhZGRyZXNzLiAgKi8KLQkJICAgIHJlbG9jYXRpb24gLT0gc2RhX2Jhc2U7Ci0JCSAgICAvKiBOb3cgaXQgY29udGFpbnMgdGhlIG9mZnNldCBmcm9tIF9TREFfQkFTRV8uICAqLwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhbiAlcyByZWxvY2F0aW9uIGlzIGluIHRoZSB3cm9uZyBzZWN0aW9uICglcykiKSwKLQkJCQkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkJICAgc3ltX25hbWUsCi0JCQkJCSAgIG0zMnJfZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHJfdHlwZV0ubmFtZSwKLQkJCQkJICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOwotCQkgICAgLypiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsgPz8/IHdoeT8gKi8KLQkJICAgIHJldCA9IGZhbHNlOwotCQkgICAgY29udGludWU7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBkZWZhdWx0IDoKLQkgICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgY29udGVudHMsIG9mZnNldCwKLQkJCQkJICAgIHJlbG9jYXRpb24sIGFkZGVuZCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICBjaGVja19yZWxvYzoKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIC8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBnZW5lcmljIGVub3VnaCB0byBnbyBpbiBhIHV0aWxpdHkuICAqLwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICB9Ci0KLQkgIGlmIChlcnJtc2cgIT0gTlVMTCkKLQkgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIG9mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBlcnJtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgICAgIGVycm1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCSAgICAgIGVycm1zZyA9IF8oImludGVybmFsIGVycm9yOiBkYW5nZXJvdXMgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGVycm1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7Ci0JICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0KLQkgICAgY29tbW9uX2Vycm9yOgotCSAgICAgIGlmICghKCgqaW5mby0+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+c3Rfc2huZHgpOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9BQlMpCi0JICAgIGlzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JICAgIGlzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9NMzJSX1NDT01NT04pCi0JICAgIGlzZWMgPSAmbTMycl9lbGZfc2NvbV9zZWN0aW9uOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2hvIGtub3dzPyAgKi8KLQkgICAgICBpc2VjID0gTlVMTDsKLQkgICAgfQotCi0JICAqc2VjcHAgPSBpc2VjOwotCX0KLQotICAgICAgaWYgKCEgbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBpbnB1dF9iZmQsCi0JCQkJICAgICAgIGlucHV0X3NlY3Rpb24sIGRhdGEsIGludGVybmFsX3JlbG9jcywKLQkJCQkgICAgICAgaW50ZXJuYWxfc3ltcywgc2VjdGlvbnMpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLQlmcmVlIChzZWN0aW9ucyk7Ci0gICAgICBzZWN0aW9ucyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotCWZyZWUgKGludGVybmFsX3N5bXMpOwotICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0JZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gICAgICBleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLQlmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTAotICAgICAgJiYgaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0gICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3N5bXMpOwotICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0jZW5kaWYgLyogI2lmIDAgKi8KLQwKLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIuICAqLwotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN3aXRjaCAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NMzJSX0FSQ0gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBFX00zMlJfQVJDSDogICAodm9pZCkgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfbTMyciwgYmZkX21hY2hfbTMycik7ICBicmVhazsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdG9yZSB0aGUgbWFjaGluZSBudW1iZXIgaW4gdGhlIGZsYWdzIGZpZWxkLiAgKi8KLXN0YXRpYyB2b2lkCi1tMzJyX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqICAgYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9tYWNoX20zMnI6ICB2YWwgPSBFX00zMlJfQVJDSDsgYnJlYWs7Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9NMzJSX0FSQ0g7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IHZhbDsKLX0KLQotLyogRnVuY3Rpb24gdG8ga2VlcCBNMzJSIHNwZWNpZmljIGZpbGUgZmxhZ3MuICovCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKiAgICBhYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChhYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyICovCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChvYmZkKQotCSAgICAgIHx8IChlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncwotCQkgID09IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzKSk7Ci0KLSAgZWxmX2dwIChvYmZkKSA9IGVsZl9ncCAoaWJmZCk7Ci0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqIGliZmQ7Ci0gICAgIGJmZCAqIG9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG91dF9mbGFnczsKLSAgZmxhZ3dvcmQgaW5fZmxhZ3M7Ci0KLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGluX2ZsYWdzICA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvdXRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCi0gICAgewotICAgICAgLyogSWYgdGhlIGlucHV0IGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSB0aGVuIGRvIG5vdAotCSBib3RoZXIgc2V0dGluZyB0aGUgZmxhZ3MgZm9yIHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLAotCSBpbnN0ZWFkIGFsbG93IGZ1dHVyZSBtZXJnZXMgdG8gZG8gdGhpcy4gIElmIG5vIGZ1dHVyZQotCSBtZXJnZXMgZXZlciBzZXQgdGhlc2UgZmxhZ3MgdGhlbiB0aGV5IHdpbGwgcmV0YWluIHRoZWlyCi0JIHVuaXRpYWxpc2VkIHZhbHVlcywgd2hpY2ggc3VycHJpc2Ugc3VycHJpc2UsIGNvcnJlc3BvbmQKLQkgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoaWJmZCktPnRoZV9kZWZhdWx0KQotCXJldHVybiB0cnVlOwotICAgICAgCi0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLQotICAgICAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQotCSAgJiYgYmZkX2dldF9hcmNoX2luZm8gKG9iZmQpLT50aGVfZGVmYXVsdCkKLQl7Ci0JICByZXR1cm4gYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIENoZWNrIGZsYWcgY29tcGF0aWJpbGl0eS4gICovCi0gIGlmIChpbl9mbGFncyA9PSBvdXRfZmxhZ3MpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChpbl9mbGFncyAmIEVGX00zMlJfQVJDSCkgIT0gKG91dF9mbGFncyAmIEVGX00zMlJfQVJDSCkpCi0gICAgewotICAgICAgaWYgKChpbl9mbGFncyAmIEVGX00zMlJfQVJDSCkgIT0gRV9NMzJSX0FSQ0gpCi0JewotCSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogSW5zdHJ1Y3Rpb24gc2V0IG1pc21hdGNoIHdpdGggcHJldmlvdXMgbW9kdWxlcyIpLAotCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEaXNwbGF5IHRoZSBmbGFncyBmaWVsZCAqLwotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICogICBhYmZkOwotICAgICBQVFIgICAgIHB0cjsKLXsKLSAgRklMRSAqIGZpbGUgPSAoRklMRSAqKSBwdHI7Ci0gIAotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpCi0gIAotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpOwotICAKLSAgZnByaW50ZiAoZmlsZSwgXygicHJpdmF0ZSBmbGFncyA9ICVseCIpLCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyk7Ci0gIAotICBzd2l0Y2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTTMyUl9BUkNIKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgRV9NMzJSX0FSQ0g6ICBmcHJpbnRmIChmaWxlLCBfKCI6IG0zMnIgaW5zdHJ1Y3Rpb25zIikpOyAgYnJlYWs7Ci0gICAgfQotICAKLSAgZnB1dGMgKCdcbicsIGZpbGUpOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWFzZWN0aW9uICoKLW0zMnJfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgICAgYmZkICphYmZkOwotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfTTMyUl9HTlVfVlRJTkhFUklUOgotICAgICAgY2FzZSBSX00zMlJfR05VX1ZURU5UUlk6Ci0gICAgICAgIGJyZWFrOwotIAotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIC8qIHdlIGRvbid0IHVzZSBnb3QgYW5kIHBsdCBlbnRyaWVzIGZvciBtMzJyICovCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4KLSAgIFNpbmNlIHdlIGRvbid0IGRvIC5nb3RzIG9yIC5wbHRzLCB3ZSBqdXN0IG5lZWQgdG8gY29uc2lkZXIgdGhlCi0gICB2aXJ0dWFsIHRhYmxlIHJlbG9jcyBmb3IgZ2MuICAqLwotIAotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotIAotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotIAotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLSAgICAgICAgaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0gICAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0gCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgICB7Ci0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfTTMyUl9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9NMzJSX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotDAotCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9tMzJyCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX00zMlIKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICBiZmRfZWxmMzJfbTMycl92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItbTMyciIKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJCTAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQkJbTMycl9pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24JX2JmZF9tMzJyX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJCV9iZmRfbTMycl9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCQltMzJyX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkJbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgICAgICAgICAgbTMycl9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgICAgICAgICBtMzJyX2VsZl9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgICAgICAgICBtMzJyX2VsZl9jaGVja19yZWxvY3MKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgICAgICAgICAgICAgMQotI2lmIDAgLyogbm90IHlldCAqLwotLyogcmVsYXggc3VwcG9ydCAqLwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24JCW0zMnJfZWxmX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJCQltMzJyX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQkJbTMycl9lbGZfb2JqZWN0X3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAJbTMycl9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAJbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAJbTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzCQltMzJyX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEJbTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotCQkJCQkKLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tNjhrLmMgYi9iZmQvZWxmMzItbTY4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzhjN2VlLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tNjhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjk5ICswLDAgQEAKLS8qIE1vdG9yb2xhIDY4ayBzZXJpZXMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9tNjhrLmgiCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpyZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCBydHlwZV90b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVsZl9tNjhrX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKmVsZl9tNjhrX2djX21hcmtfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2djX3N3ZWVwX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2FkanVzdF9keW5pbmR4Ci0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19maW5pc2hfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGYzMl9tNjhrX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfbTY4a19jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9tNjhrX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9tNjhrX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0gewotICBIT1dUTyhSXzY4S19OT05FLCAgICAgICAwLCAwLCAwLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfTk9ORSIsICAgICAgZmFsc2UsIDAsIDB4MDAwMDAwMDAsZmFsc2UpLAotICBIT1dUTyhSXzY4S18zMiwgICAgICAgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfMzIiLCAgICAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S18xNiwgICAgICAgICAwLCAxLDE2LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfMTYiLCAgICAgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S184LCAgICAgICAgICAwLCAwLCA4LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfOCIsICAgICAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19QQzMyLCAgICAgICAwLCAyLDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUEMzMiIsICAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX1BDMTYsICAgICAgIDAsIDEsMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QQzE2IiwgICAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfUEM4LCAgICAgICAgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BDOCIsICAgICAgIGZhbHNlLCAwLCAweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSXzY4S19HT1QzMiwgICAgICAwLCAyLDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UMzIiLCAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX0dPVDE2LCAgICAgIDAsIDEsMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HT1QxNiIsICAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfR09UOCwgICAgICAgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX0dPVDgiLCAgICAgIGZhbHNlLCAwLCAweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSXzY4S19HT1QzMk8sICAgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UMzJPIiwgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19HT1QxNk8sICAgICAwLCAxLDE2LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UMTZPIiwgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19HT1Q4TywgICAgICAwLCAwLCA4LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UOE8iLCAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19QTFQzMiwgICAgICAwLCAyLDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUMzIiLCAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX1BMVDE2LCAgICAgIDAsIDEsMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QTFQxNiIsICAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfUExUOCwgICAgICAgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BMVDgiLCAgICAgIGZhbHNlLCAwLCAweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSXzY4S19QTFQzMk8sICAgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUMzJPIiwgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19QTFQxNk8sICAgICAwLCAxLDE2LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUMTZPIiwgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19QTFQ4TywgICAgICAwLCAwLCA4LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUOE8iLCAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19DT1BZLCAgICAgICAwLCAwLCAwLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfQ09QWSIsICAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19HTE9CX0RBVCwgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR0xPQl9EQVQiLCAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19KTVBfU0xPVCwgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfSk1QX1NMT1QiLCAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19SRUxBVElWRSwgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUkVMQVRJVkUiLCAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl82OEtfR05VX1ZUSU5IRVJJVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl82OEtfR05VX1ZUSU5IRVJJVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSXzY4S19HTlVfVlRFTlRSWSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfNjhLX0dOVV9WVEVOVFJZIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwKLX07Ci0KLXN0YXRpYyB2b2lkCi1ydHlwZV90b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBCRkRfQVNTRVJUIChFTEYzMl9SX1RZUEUoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl82OEtfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b190YWJsZVtFTEYzMl9SX1RZUEUoZHN0LT5yX2luZm8pXTsKLX0KLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byBydHlwZV90b19ob3d0bwotCi1zdGF0aWMgY29uc3Qgc3RydWN0Ci17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfdmFsOwotICBpbnQgZWxmX3ZhbDsKLX0gcmVsb2NfbWFwW10gPSB7Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfNjhLX05PTkUgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfNjhLXzMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSXzY4S18xNiB9LAotICB7IEJGRF9SRUxPQ184LCBSXzY4S184IH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMLCBSXzY4S19QQzMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BDUkVMLCBSXzY4S19QQzE2IH0sCi0gIHsgQkZEX1JFTE9DXzhfUENSRUwsIFJfNjhLX1BDOCB9LAotICB7IEJGRF9SRUxPQ18zMl9HT1RfUENSRUwsIFJfNjhLX0dPVDMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTCwgUl82OEtfR09UMTYgfSwKLSAgeyBCRkRfUkVMT0NfOF9HT1RfUENSRUwsIFJfNjhLX0dPVDggfSwKLSAgeyBCRkRfUkVMT0NfMzJfR09UT0ZGLCBSXzY4S19HT1QzMk8gfSwKLSAgeyBCRkRfUkVMT0NfMTZfR09UT0ZGLCBSXzY4S19HT1QxNk8gfSwKLSAgeyBCRkRfUkVMT0NfOF9HT1RPRkYsIFJfNjhLX0dPVDhPIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTCwgUl82OEtfUExUMzIgfSwKLSAgeyBCRkRfUkVMT0NfMTZfUExUX1BDUkVMLCBSXzY4S19QTFQxNiB9LAotICB7IEJGRF9SRUxPQ184X1BMVF9QQ1JFTCwgUl82OEtfUExUOCB9LAotICB7IEJGRF9SRUxPQ18zMl9QTFRPRkYsIFJfNjhLX1BMVDMyTyB9LAotICB7IEJGRF9SRUxPQ18xNl9QTFRPRkYsIFJfNjhLX1BMVDE2TyB9LAotICB7IEJGRF9SRUxPQ184X1BMVE9GRiwgUl82OEtfUExUOE8gfSwKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl82OEtfQ09QWSB9LAotICB7IEJGRF9SRUxPQ182OEtfR0xPQl9EQVQsIFJfNjhLX0dMT0JfREFUIH0sCi0gIHsgQkZEX1JFTE9DXzY4S19KTVBfU0xPVCwgUl82OEtfSk1QX1NMT1QgfSwKLSAgeyBCRkRfUkVMT0NfNjhLX1JFTEFUSVZFLCBSXzY4S19SRUxBVElWRSB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSXzY4S18zMiB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgUl82OEtfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksIFJfNjhLX0dOVV9WVEVOVFJZIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHJlbG9jX21hcCkgLyBzaXplb2YgKHJlbG9jX21hcFswXSk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocmVsb2NfbWFwW2ldLmJmZF92YWwgPT0gY29kZSkKLQlyZXR1cm4gJmhvd3RvX3RhYmxlW3JlbG9jX21hcFtpXS5lbGZfdmFsXTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgRUxGX0FSQ0ggYmZkX2FyY2hfbTY4awotLyogZW5kIGNvZGUgZ2VuZXJhdGVkIGJ5IGVsZi5lbCAqLwotCi0jZGVmaW5lIFVTRV9SRUxBCi0KLQwKLS8qIEZ1bmN0aW9ucyBmb3IgdGhlIG02OGsgRUxGIGxpbmtlci4gICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9saWJjLnNvLjEiCi0KLS8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMjAKLQotLyogVGhlIGZpcnN0IGVudHJ5IGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9va3MgbGlrZSB0aGlzLiAgU2VlCi0gICB0aGUgU1ZSNCBBQkkgbTY4ayBzdXBwbGVtZW50IHRvIHNlZSBob3cgdGhpcyB3b3Jrcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfbTY4a19wbHQwX2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4MmYsIDB4M2IsIDB4MDEsIDB4NzAsIC8qIG1vdmUubCAoJXBjLGFkZHIpLC0oJXNwKSAqLwotICAwLCAwLCAwLCAwLAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byAuZ290ICsgNC4gICovCi0gIDB4NGUsIDB4ZmIsIDB4MDEsIDB4NzEsIC8qIGptcCAoWyVwYyxhZGRyXSkgKi8KLSAgMCwgMCwgMCwgMCwJCSAgLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgdG8gLmdvdCArIDguICAqLwotICAwLCAwLCAwLCAwCQkgIC8qIHBhZCBvdXQgdG8gMjAgYnl0ZXMuICAqLwotfTsKLQotLyogU3Vic2VxdWVudCBlbnRyaWVzIGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9vayBsaWtlIHRoaXMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX202OGtfcGx0X2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4NGUsIDB4ZmIsIDB4MDEsIDB4NzEsIC8qIGptcCAoWyVwYyxzeW1ib2xAR09UUENdKSAqLwotICAwLCAwLCAwLCAwLAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzeW1ib2wncyAuZ290IGVudHJ5LiAgKi8KLSAgMHgyZiwgMHgzYywJCSAgLyogbW92ZS5sICNvZmZzZXQsLSglc3ApICovCi0gIDAsIDAsIDAsIDAsCQkgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IGludG8gcmVsb2NhdGlvbiB0YWJsZS4gICovCi0gIDB4NjAsIDB4ZmYsCQkgIC8qIGJyYS5sIC5wbHQgKi8KLSAgMCwgMCwgMCwgMAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzdGFydCBvZiAucGx0LiAgKi8KLX07Ci0KLSNkZWZpbmUgQ1BVMzJfRkxBRyhhYmZkKSAgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfQ1BVMzIpCi0KLSNkZWZpbmUgUExUX0NQVTMyX0VOVFJZX1NJWkUgMjQKLS8qIFByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJpZXMgZm9yIHRoZSBjcHUzMiAqLwotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9jcHUzMl9wbHQwX2VudHJ5W1BMVF9DUFUzMl9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4MjAsIDB4N2IsIDB4MDEsIDB4NzAsIC8qIG1vdmVhbCAlcGNAKDB4YyksICVhMCAqLwotICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byAuZ290ICsgNC4gICovCi0gIDB4NGUsIDB4ZDAsICAgICAgICAgICAgIC8qIGptcCAlYTBAICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgIC8qIHJlcGxhY2Ugd2l0aCBvZmZzZXQgdG8gLmdvdCArOC4gKi8KLSAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgLyogcGFkIG91dCB0byAyNCBieXRlcy4gICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgIC8qIHBhZCBvdXQgdG8gMjQgYnl0ZXMuICAqLwotICAwLCAwCi19OwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX2NwdTMyX3BsdF9lbnRyeVtQTFRfQ1BVMzJfRU5UUllfU0laRV0gPQotewotICAweDIwLCAweDdiLCAweDAxLCAweDcwLCAgLyogbW92ZWFsICVwY0AoMHhjKSwgJWEwICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzeW1ib2wncyAuZ290IGVudHJ5LiAgKi8KLSAgMHg0ZSwgMHhkMCwgICAgICAgICAgICAgIC8qIGptcCAlYTBAICovCi0gIDB4MmYsIDB4M2MsICAgICAgICAgICAgICAvKiBtb3ZlLmwgI29mZnNldCwtKCVzcCkgKi8KLSAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IGludG8gcmVsb2NhdGlvbiB0YWJsZS4gICovCi0gIDB4NjAsIDB4ZmYsICAgICAgICAgICAgICAvKiBicmEubCAucGx0ICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzdGFydCBvZiAucGx0LiAgKi8KLSAgMCwgMAotfTsKLQotLyogVGhlIG02OGsgbGlua2VyIG5lZWRzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiByZWxvY3MgdGhhdCBpdAotICAgZGVjaWRlcyB0byBjb3B5IGluIGNoZWNrX3JlbG9jcyBmb3IgZWFjaCBzeW1ib2wuICBUaGlzIGlzIHNvIHRoYXQgaXQKLSAgIGNhbiBkaXNjYXJkIFBDIHJlbGF0aXZlIHJlbG9jcyBpZiBpdCBkb2Vzbid0IG5lZWQgdGhlbSB3aGVuIGxpbmtpbmcKLSAgIHdpdGggLUJzeW1ib2xpYy4gIFdlIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiBhIGZpZWxkIGV4dGVuZGluZyB0aGUKLSAgIHJlZ3VsYXIgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUga2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3Mgd2UgaGF2ZQotICAgY29waWVkIGZvciBhIGdpdmVuIHN5bWJvbC4gICovCi0KLXN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkCi17Ci0gIC8qIE5leHQgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICpuZXh0OwotICAvKiBBIHNlY3Rpb24gaW4gZHlub2JqLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIC8qIE51bWJlciBvZiByZWxvY3MgY29waWVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgY291bnQ7Ci19OwotCi0vKiBtNjhrIEVMRiBsaW5rZXIgaGFzaCBlbnRyeS4gICovCi0KLXN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBOdW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIGNvcGllZCBmb3IgdGhpcyBzeW1ib2wuICAqLwotICBzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCAqcGNyZWxfcmVsb2NzX2NvcGllZDsKLX07Ci0KLS8qIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogRGVjbGFyZSB0aGlzIG5vdyB0aGF0IHRoZSBhYm92ZSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfZGlzY2FyZF9jb3BpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotLyogVHJhdmVyc2UgYW4gbTY4ayBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZl9tNjhrX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBlbGZfbTY4a19oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX3RhYmxlICopIChwKS0+aGFzaCkKLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGFuIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGZfbTY4a19saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZXQtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhbiBtNjhrIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1lbGZfbTY4a19saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgZWxmX202OGtfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIEtlZXAgbTY4ay1zcGVjaWZpYyBmbGFncyBpbiB0aGUgRUxGIGhlYWRlciAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX202OGtfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBtNjhrLXNwZWNpZmljIGRhdGEgZnJvbSBvbmUgbW9kdWxlIHRvIGFub3RoZXIgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9tNjhrX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIGluX2ZsYWdzOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLSAKLSAgaW5fZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAKLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfbTY4a19tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgZmxhZ3dvcmQgb3V0X2ZsYWdzOwotICBmbGFnd29yZCBpbl9mbGFnczsKLQotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW5fZmxhZ3MgID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIG91dF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotCi0gIGlmICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQotICAgIHsKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGluX2ZsYWdzOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9tNjhrX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgcHRyOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgcHRyOwotCi0gIEJGRF9BU1NFUlQgKGFiZmQgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCk7Ci0KLSAgLyogUHJpbnQgbm9ybWFsIEVMRiBwcml2YXRlIGRhdGEuICAqLwotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpOwotCi0gIC8qIElnbm9yZSBpbml0IGZsYWcgLSBpdCBtYXkgbm90IGJlIHNldCwgZGVzcGl0ZSB0aGUgZmxhZ3MgZmllbGQgY29udGFpbmluZyB2YWxpZCBkYXRhLiAgKi8KLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfICgicHJpdmF0ZSBmbGFncyA9ICVseDoiKSwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MpOwotCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0NQVTMyKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2NwdTMyXSIpKTsKLQotICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbGdvdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNyZWxnb3QgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSXzY4S19HT1Q4OgotCWNhc2UgUl82OEtfR09UMTY6Ci0JY2FzZSBSXzY4S19HT1QzMjoKLQkgIGlmIChoICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSXzY4S19HT1Q4TzoKLQljYXNlIFJfNjhLX0dPVDE2TzoKLQljYXNlIFJfNjhLX0dPVDMyTzoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0KLQkgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCFfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JICAgICAgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICB7Ci0JICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQotCQl7Ci0JCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkJICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJIChTRUNfQUxMT0MKLQkJCQkJCSAgfCBTRUNfTE9BRAotCQkJCQkJICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdC5yZWZjb3VudCA9PSAtMSkKLQkJewotCQkgIGgtPmdvdC5yZWZjb3VudCA9IDE7Ci0KLQkJICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCQkgICAgewotCQkgICAgICBpZiAoIWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICAvKiBBbGxvY2F0ZSBzcGFjZSBpbiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkJICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQkJICAvKiBBbGxvY2F0ZSByZWxvY2F0aW9uIHNwYWNlLiAgKi8KLQkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJaC0+Z290LnJlZmNvdW50Kys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF9zaWduZWRfdm1hKTsKLQkJICBsb2NhbF9nb3RfcmVmY291bnRzID0gKChiZmRfc2lnbmVkX3ZtYSAqKQotCQkJCQkgYmZkX2FsbG9jIChhYmZkLCBzaXplKSk7Ci0JCSAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCkgPSBsb2NhbF9nb3RfcmVmY291bnRzOwotCQkgIG1lbXNldCAobG9jYWxfZ290X3JlZmNvdW50cywgLTEsIHNpemUpOwotCQl9Ci0JICAgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID09IC0xKQotCQl7Ci0JCSAgbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPSAxOwotCi0JCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0JCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkJICAgIHsKLQkJICAgICAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCi0JCQkgb3V0cHV0IGEgUl82OEtfUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUgZHluYW1pYwotCQkJIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KLQkJICAgICAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCWxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdKys7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QTFQ4OgotCWNhc2UgUl82OEtfUExUMTY6Ci0JY2FzZSBSXzY4S19QTFQzMjoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICBXZQotCSAgICAgYWN0dWFsbHkgYnVpbGQgdGhlIGVudHJ5IGluIGFkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgICAgICAgICAgICBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgYSBjYXNlIG9mIGxpbmtpbmcgUElDIGNvZGUgd2hpY2ggaXMKLSAgICAgICAgICAgICBuZXZlciByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGluIHdoaWNoIGNhc2Ugd2UKLSAgICAgICAgICAgICBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkKLSAgICAgICAgICAgICBhZnRlciBhbGwuICAqLwotCi0JICAvKiBJZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB3ZSByZXNvbHZlIGl0IGRpcmVjdGx5IHdpdGhvdXQKLQkgICAgIGNyZWF0aW5nIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICBpZiAoaC0+cGx0LnJlZmNvdW50ID09IC0xKQotCSAgICBoLT5wbHQucmVmY291bnQgPSAxOwotCSAgZWxzZQotCSAgICBoLT5wbHQucmVmY291bnQrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QTFQ4TzoKLQljYXNlIFJfNjhLX1BMVDE2TzoKLQljYXNlIFJfNjhLX1BMVDMyTzoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBoYXZlIHRoaXMgcmVsb2NhdGlvbiBmb3IgYQotCQkgbG9jYWwgc3ltYm9sLiAgRklYTUU6IGRvZXMgaXQ/ICBIb3cgdG8gaGFuZGxlIGl0IGlmCi0JCSBpdCBkb2VzIG1ha2Ugc2Vuc2U/ICAqLwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBpZiAoIWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgaWYgKGgtPnBsdC5yZWZjb3VudCA9PSAtMSkKLQkgICAgaC0+cGx0LnJlZmNvdW50ID0gMTsKLQkgIGVsc2UKLQkgICAgaC0+cGx0LnJlZmNvdW50Kys7Ci0JICBicmVhazsKLQotCWNhc2UgUl82OEtfUEM4OgotCWNhc2UgUl82OEtfUEMxNjoKLQljYXNlIFJfNjhLX1BDMzI6Ci0JICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSBhbmQgdGhpcyBpcyBub3QgYSBsb2NhbAotCSAgICAgc3ltYm9sLCB3ZSBuZWVkIHRvIGNvcHkgdGhlIHJlbG9jIGludG8gdGhlIHNoYXJlZCBsaWJyYXJ5LgotCSAgICAgSG93ZXZlciB3aGVuIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljIGFuZCB0aGlzIGlzIGEgZ2xvYmFsCi0JICAgICBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBpbiBhbiBvYmplY3Qgd2UgYXJlIGluY2x1ZGluZyBpbiB0aGUKLQkgICAgIGxpbmsgKGkuZS4sIERFRl9SRUdVTEFSIGlzIHNldCksIHRoZW4gd2UgY2FuIHJlc29sdmUgdGhlCi0JICAgICByZWxvYyBkaXJlY3RseS4gIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBub3Qgc2VlbiBhbGwgdGhlIGlucHV0Ci0JICAgICBmaWxlcywgc28gaXQgaXMgcG9zc2libGUgdGhhdCBERUZfUkVHVUxBUiBpcyBub3Qgc2V0IG5vdyBidXQKLQkgICAgIHdpbGwgYmUgc2V0IGxhdGVyIChpdCBpcyBuZXZlciBjbGVhcmVkKS4gIFdlIGFjY291bnQgZm9yIHRoYXQKLQkgICAgIHBvc3NpYmlsaXR5IGJlbG93IGJ5IHN0b3JpbmcgaW5mb3JtYXRpb24gaW4gdGhlCi0JICAgICBwY3JlbF9yZWxvY3NfY29waWVkIGZpZWxkIG9mIHRoZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLQkgIGlmICghKGluZm8tPnNoYXJlZAotCQkmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCQkmJiBoICE9IE5VTEwKLQkJJiYgKCFpbmZvLT5zeW1ib2xpYwotCQkgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKQotCSAgICB7Ci0JICAgICAgaWYgKGggIT0gTlVMTCkKLQkJewotCQkgIC8qIE1ha2Ugc3VyZSBhIHBsdCBlbnRyeSBpcyBjcmVhdGVkIGZvciB0aGlzIHN5bWJvbCBpZgotCQkgICAgIGl0IHR1cm5zIG91dCB0byBiZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSBkeW5hbWljCi0JCSAgICAgb2JqZWN0LiAgKi8KLQkJICBpZiAoaC0+cGx0LnJlZmNvdW50ID09IC0xKQotCQkgICAgaC0+cGx0LnJlZmNvdW50ID0gMTsKLQkJICBlbHNlCi0JCSAgICBoLT5wbHQucmVmY291bnQrKzsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl82OEtfODoKLQljYXNlIFJfNjhLXzE2OgotCWNhc2UgUl82OEtfMzI6Ci0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogTWFrZSBzdXJlIGEgcGx0IGVudHJ5IGlzIGNyZWF0ZWQgZm9yIHRoaXMgc3ltYm9sIGlmIGl0Ci0JCSB0dXJucyBvdXQgdG8gYmUgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QuICAqLwotCSAgICAgIGlmIChoLT5wbHQucmVmY291bnQgPT0gLTEpCi0JCWgtPnBsdC5yZWZjb3VudCA9IDE7Ci0JICAgICAgZWxzZQotCQloLT5wbHQucmVmY291bnQrKzsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbmVlZCB0byBjb3B5IHRoZQotCSAgICAgcmVsb2MgaW50byB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZQotCQkgcmVsb2MgdHlwZXMgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYwotCQkgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhpcyByZWxvYy4gICovCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoYWJmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JCQkJCSBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywKLQkJCQkJCSAgICAgKFNFQ19BTExPQwotCQkJCQkJICAgICAgfCBTRUNfTE9BRAotCQkJCQkJICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICAgICB8IFNFQ19SRUFET05MWSkpCi0JCQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLQkgICAgICAvKiBJZiB3ZSBhcmUgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIHdlIGNvdW50IHRoZSBudW1iZXIgb2YKLQkJIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zIHdlIGhhdmUgZW50ZXJlZCBmb3IgdGhpcyBzeW1ib2wsCi0JCSBzbyB0aGF0IHdlIGNhbiBkaXNjYXJkIHRoZW0gYWdhaW4gaWYgdGhlIHN5bWJvbCBpcyBsYXRlcgotCQkgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0LiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMKLQkJIG9ubHkgY2FsbGVkIGlmIHdlIGFyZSB1c2luZyBhbiBtNjhrZWxmIGxpbmtlciBoYXNoIHRhYmxlLAotCQkgd2hpY2ggbWVhbnMgdGhhdCBoIGlzIHJlYWxseSBhIHBvaW50ZXIgdG8gYW4KLQkJIGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeS4gICovCi0JICAgICAgaWYgKChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSA9PSBSXzY4S19QQzgKLSAJCSAgIHx8IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfNjhLX1BDMTYKLSAJCSAgIHx8IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfNjhLX1BDMzIpCi0JCSAgJiYgaW5mby0+c3ltYm9saWMpCi0JCXsKLQkJICBzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5ICplaDsKLQkJICBzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCAqcDsKLQotCQkgIGVoID0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKikgaDsKLQotCQkgIGZvciAocCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCQkgICAgaWYgKHAtPnNlY3Rpb24gPT0gc3JlbG9jKQotCQkgICAgICBicmVhazsKLQotCQkgIGlmIChwID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHAgPSAoKHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICopCi0JCQkgICBiZmRfYWxsb2MgKGR5bm9iaiwgc2l6ZW9mICpwKSk7Ci0JCSAgICAgIGlmIChwID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIHAtPm5leHQgPSBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZDsKLQkJICAgICAgZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBwOwotCQkgICAgICBwLT5zZWN0aW9uID0gc3JlbG9jOwotCQkgICAgICBwLT5jb3VudCA9IDA7Ci0JCSAgICB9Ci0KLQkJICArK3AtPmNvdW50OwotCQl9Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLQkgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfNjhLX0dOVV9WVElOSEVSSVQ6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotCSAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSXzY4S19HTlVfVlRFTlRSWToKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLWVsZl9tNjhrX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSXzY4S19HTlVfVlRJTkhFUklUOgotCWNhc2UgUl82OEtfR05VX1ZURU5UUlk6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0JICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotCXsKLQkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbTY4a19nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdF9yZWZjb3VudHM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsZ290OwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgbG9jYWxfZ290X3JlZmNvdW50cyA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKTsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgaWYgKGR5bm9iaikKLSAgICB7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgfQotCi0gIHJlbGVuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl82OEtfR09UODoKLQljYXNlIFJfNjhLX0dPVDE2OgotCWNhc2UgUl82OEtfR09UMzI6Ci0JY2FzZSBSXzY4S19HT1Q4TzoKLQljYXNlIFJfNjhLX0dPVDE2TzoKLQljYXNlIFJfNjhLX0dPVDMyTzoKLQkgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQkgIGlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgICAgICBpZiAoaC0+Z290LnJlZmNvdW50ID4gMCkKLQkJewotCQkgIC0taC0+Z290LnJlZmNvdW50OwotCQkgIGlmIChoLT5nb3QucmVmY291bnQgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgLmdvdCBlbnRyeSBhbnkgbW9yZS4gICovCi0JCSAgICAgIHNnb3QtPl9yYXdfc2l6ZSAtPSA0OwotCQkgICAgICBzcmVsZ290LT5fcmF3X3NpemUgLT0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPiAwKQotCQl7Ci0JCSAgLS1sb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XTsKLQkJICBpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgLmdvdCBlbnRyeSBhbnkgbW9yZS4gICovCi0JCSAgICAgIHNnb3QtPl9yYXdfc2l6ZSAtPSA0OwotCQkgICAgICBpZiAoaW5mby0+c2hhcmVkKQotCQkJc3JlbGdvdC0+X3Jhd19zaXplIC09IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfNjhLX1BMVDg6Ci0JY2FzZSBSXzY4S19QTFQxNjoKLQljYXNlIFJfNjhLX1BMVDMyOgotCWNhc2UgUl82OEtfUExUOE86Ci0JY2FzZSBSXzY4S19QTFQxNk86Ci0JY2FzZSBSXzY4S19QTFQzMk86Ci0JY2FzZSBSXzY4S19QQzg6Ci0JY2FzZSBSXzY4S19QQzE2OgotCWNhc2UgUl82OEtfUEMzMjoKLQljYXNlIFJfNjhLXzg6Ci0JY2FzZSBSXzY4S18xNjoKLQljYXNlIFJfNjhLXzMyOgotCSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCSAgaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICAgIGlmIChoLT5wbHQucmVmY291bnQgPiAwKQotCQktLWgtPnBsdC5yZWZjb3VudDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlciwKLSAgICAgd2hlbiB3ZSBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSA9PSAwCi0JICAvKiBXZSBtdXN0IGFsd2F5cyBjcmVhdGUgdGhlIHBsdCBlbnRyeSBpZiBpdCB3YXMgcmVmZXJlbmNlZAotCSAgICAgYnkgYSBQTFR4eE8gcmVsb2NhdGlvbi4gIEluIHRoaXMgY2FzZSB3ZSBhbHJlYWR5IHJlY29yZGVkCi0JICAgICBpdCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgICYmIGgtPmR5bmluZHggPT0gLTEpCi0JewotCSAgLyogVGhpcyBjYXNlIGNhbiBvY2N1ciBpZiB3ZSBzYXcgYSBQTFR4eCByZWxvYyBpbiBhbiBpbnB1dAotCSAgICAgZmlsZSwgYnV0IHRoZSBzeW1ib2wgd2FzIG5ldmVyIHJlZmVycmVkIHRvIGJ5IGEgZHluYW1pYwotCSAgICAgb2JqZWN0LiAgSW4gc3VjaCBhIGNhc2UsIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gYnVpbGQKLQkgICAgIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGFuZCB3ZSBjYW4ganVzdCBkbyBhIFBDeHgKLQkgICAgIHJlbG9jIGluc3RlYWQuICAqLwotCSAgQkZEX0FTU0VSVCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCk7Ci0JICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAvKiBHQyBtYXkgaGF2ZSByZW5kZXJlZCB0aGlzIGVudHJ5IHVudXNlZC4gICovCi0gICAgICBpZiAoaC0+cGx0LnJlZmNvdW50IDw9IDApCi0JewotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+RUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCAucGx0IGVudHJ5LCBtYWtlIHJvb20gZm9yIHRoZSBzcGVjaWFsCi0JIGZpcnN0IGVudHJ5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLSAgICAgICAgaWYgKCBDUFUzMl9GTEFHIChkeW5vYmopKQotICAgICAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfQ1BVMzJfRU5UUllfU0laRTsKLSAgICAgICAgZWxzZQotCSAgcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZQotCSBub3QgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoaXMKLQkgbG9jYXRpb24gaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24KLQkgcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQKLQkgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICghaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0JfQotCi0gICAgICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplOwotCi0gICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICAqLwotICAgICAgaWYgKENQVTMyX0ZMQUcgKGR5bm9iaikpCi0gICAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfQ1BVMzJfRU5UUllfU0laRTsKLSAgICAgIGVsc2UKLSAgICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLmdvdC5wbHQgc2VjdGlvbiwgd2hpY2gKLQkgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIC5nb3Qgc2VjdGlvbiBieSB0aGUgbGlua2VyIHNjcmlwdC4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gNDsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFJlaW5pdGlhbGl6ZSB0aGUgcGx0IG9mZnNldCBub3cgdGhhdCBpdCBpcyBub3QgdXNlZCBhcyBhIHJlZmVyZW5jZQotICAgICBjb3VudCBhbnkgbW9yZS4gICovCi0gIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCi0KLSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG11c3QgcHJlc3VtZSB0aGF0IHRoZQotICAgICBvbmx5IHJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBhcmUgdmlhIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotICAgICBGb3Igc3VjaCBjYXNlcyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyBoZXJlOyB0aGUgcmVsb2NhdGlvbnMgd2lsbAotICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSByZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBzeW1ib2wgaW4gb3VyIC5keW5ic3Mgc2VjdGlvbiwgd2hpY2ggd2lsbAotICAgICBiZWNvbWUgcGFydCBvZiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgVGhlcmUgd2lsbCBiZQotICAgICBhbiBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gIFRoZSBkeW5hbWljCi0gICAgIG9iamVjdCB3aWxsIGNvbnRhaW4gcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgc28gYWxsIHJlZmVyZW5jZXMKLSAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgdG8gdGhpcyBzeW1ib2wgd2lsbCBnbyB0aHJvdWdoIHRoZSBnbG9iYWwKLSAgICAgb2Zmc2V0IHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpbGwgdXNlIHRoZSAuZHluc3ltIGVudHJ5IHRvCi0gICAgIGRldGVybWluZSB0aGUgYWRkcmVzcyBpdCBtdXN0IHB1dCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgc28KLSAgICAgYm90aCB0aGUgZHluYW1pYyBvYmplY3QgYW5kIHRoZSByZWd1bGFyIG9iamVjdCB3aWxsIHJlZmVyIHRvIHRoZQotICAgICBzYW1lIG1lbW9yeSBsb2NhdGlvbiBmb3IgdGhlIHZhcmlhYmxlLiAgKi8KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5ic3MiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAvKiBXZSBtdXN0IGdlbmVyYXRlIGEgUl82OEtfQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlciB0bwotICAgICBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCi0gICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQotICAgICAucmVsYS5ic3Mgc2VjdGlvbiB3ZSBhcmUgZ29pbmcgdG8gdXNlLiAgKi8KLSAgaWYgKChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKLSAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gICovCi0gIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IDMpCi0gICAgcG93ZXJfb2ZfdHdvID0gMzsKLQotICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KLSAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCi0JCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKLSAgICB7Ci0gICAgICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHBsdDsKLSAgYm9vbGVhbiByZWxvY3M7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbGEuZ290IHNlY3Rpb24uCi0JIEhvd2V2ZXIsIGlmIHdlIGFyZSBub3QgY3JlYXRpbmcgdGhlIGR5bmFtaWMgc2VjdGlvbnMsIHdlIHdpbGwKLQkgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQgdGhlIHNpemUgb2YgLnJlbGEuZ290LAotCSB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldCBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZQotCSBiZWxvdy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQlzLT5fcmF3X3NpemUgPSAwOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBzaGFyZWQgbGluaywgdGhlbiB3ZSBuZWVkIHRvIGRpc2NhcmQgYWxsIFBDCi0gICAgIHJlbGF0aXZlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgV2UKLSAgICAgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGVtIGluIHRoZSBjaGVja19yZWxvY3Mgcm91dGluZSwgYnV0IHdlIHdpbGwgbm90Ci0gICAgIGZpbGwgdGhlbSBpbiBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCAmJiBpbmZvLT5zeW1ib2xpYykKLSAgICBlbGZfbTY4a19saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9tNjhrX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSBlbGZfbTY4a19kaXNjYXJkX2NvcGllcywKLQkJCQkgKFBUUikgTlVMTCk7Ci0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICBwbHQgPSBmYWxzZTsKLSAgcmVsb2NzID0gZmFsc2U7Ci0gIHJlbHRleHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKLQkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7Ci0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBTdHJpcCB0aGlzIHNlY3Rpb24gaWYgd2UgZG9uJ3QgbmVlZCBpdDsgc2VlIHRoZQotICAgICAgICAgICAgICAgICBjb21tZW50IGJlbG93LiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgaXMgYSBQTFQuICAqLwotCSAgICAgIHBsdCA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIG1vc3RseSB0byBoYW5kbGUgLnJlbGEuYnNzIGFuZAotCQkgLnJlbGEucGx0LiAgV2UgbXVzdCBjcmVhdGUgYm90aCBzZWN0aW9ucyBpbgotCQkgY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgdGhleSBtdXN0IGJlIGNyZWF0ZWQKLQkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQotCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKLQkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbwotCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OwotCi0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlbG9jIHNlY3Rpb25zIG90aGVyCi0gICAgICAgICAgICAgICAgIHRoYW4gLnJlbGEucGx0LiAgKi8KLQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlbGEucGx0IikgIT0gMCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0KLQkJICByZWxvY3MgPSB0cnVlOwotCi0JCSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotCQkgICAgIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwKLQkJICAgICBlbnRyeS4gIC5yZWxhLnBsdCBpcyBhY3R1YWxseSBhc3NvY2lhdGVkIHdpdGgKLQkJICAgICAuZ290LnBsdCwgd2hpY2ggaXMgbmV2ZXIgcmVhZG9ubHkuICAqLwotCQkgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJCSAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCQkgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNSk7Ci0JCSAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkgICAgcmVsdGV4dCA9IHRydWU7Ci0JCX0KLQotCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKLQkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmdvdCIsIDQpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghaW5mby0+c2hhcmVkKQotCXsKLQkgIGlmICghYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChwbHQpCi0JewotCSAgaWYgKCFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKLQkgICAgICB8fCAhYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTEEpCi0JICAgICAgfHwgIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbG9jcykKLQl7Ci0JICBpZiAoIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQSwgMCkKLQkgICAgICB8fCAhYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBU1osIDApCi0JICAgICAgfHwgIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQUVOVCwKLQkJCQkJICAgICAgIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIGdlbmVyYXRlIGEgc2VjdGlvbgotICAgICBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24gZm9yIHdoaWNoIHdlIG1pZ2h0IG5lZWQgdG8gY29weQotICAgICByZWxvY3MuICBUaGVzZSBhcmUgbG9jYWwgc3ltYm9scywgd2hpY2ggbWVhbnMgdGhhdCB0aGV5IG11c3QgY29tZQotICAgICBmaXJzdCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBUaGF0IG1lYW5zIHdlIG11c3QgaW5jcmVtZW50Ci0gICAgIHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBvZiBldmVyeSBvdGhlciBkeW5hbWljIHN5bWJvbC4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgaW50IGM7Ci0KLSAgICAgIGMgPSAwOwotICAgICAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgIT0gMAotCSAgICAgIHx8IChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID0gYyArIDE7Ci0KLQkgIC8qIFRoZXNlIHN5bWJvbHMgd2lsbCBoYXZlIG5vIG5hbWVzLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0gICAgICAgICAgICAgZmlkZGxlIHdpdGggZHluc3RyX2luZGV4LiAgKi8KLQotCSAgKytjOwotCX0KLQotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgZWxmX202OGtfYWRqdXN0X2R5bmluZHgsCi0JCQkgICAgICAoUFRSKSAmYyk7Ci0gICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ICs9IGM7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJbmNyZW1lbnQgdGhlIGluZGV4IG9mIGEgZHluYW1pYyBzeW1ib2wgYnkgYSBnaXZlbiBhbW91bnQuICBDYWxsZWQKLSAgIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2FkanVzdF9keW5pbmR4IChoLCBjcGFyZykKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBjcGFyZzsKLXsKLSAgaW50ICpjcCA9IChpbnQgKikgY3Bhcmc7Ci0KLSAgaWYgKGgtPmR5bmluZHggIT0gLTEpCi0gICAgaC0+ZHluaW5keCArPSAqY3A7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB2aWEgZWxmX202OGtfbGlua19oYXNoX3RyYXZlcnNlIGlmIHdlIGFyZQotICAgY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0IHdpdGggLUJzeW1ib2xpYy4gIEl0IGRpc2NhcmRzIHRoZSBzcGFjZQotICAgYWxsb2NhdGVkIHRvIGNvcHkgUEMgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyB3aGljaCBhcmUgZGVmaW5lZAotICAgaW4gcmVndWxhciBvYmplY3RzLiAgV2UgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGVtIGluIHRoZSBjaGVja19yZWxvY3MKLSAgIHJvdXRpbmUsIGJ1dCB3ZSB3b24ndCBmaWxsIHRoZW0gaW4gaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2Rpc2NhcmRfY29waWVzIChoLCBpZ25vcmUpCi0gICAgIHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpZ25vcmU7Ci17Ci0gIHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICpzOwotCi0gIC8qIFdlIG9ubHkgZGlzY2FyZCByZWxvY3MgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSAgaWYgKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAocyA9IGgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgcy0+c2VjdGlvbi0+X3Jhd19zaXplIC09IHMtPmNvdW50ICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsb2NhdGUgYW4gTTY4SyBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcGx0OwotICBhc2VjdGlvbiAqc3JlbG9jOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoaW5wdXRfYmZkKTsKLQotICBzZ290ID0gTlVMTDsKLSAgc3BsdCA9IE5VTEw7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSXzY4S19tYXgpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaG93dG8gPSBob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIGlmICgoKHJfdHlwZSA9PSBSXzY4S19QTFQ4Ci0JCSAgICB8fCByX3R5cGUgPT0gUl82OEtfUExUMTYKLQkJICAgIHx8IHJfdHlwZSA9PSBSXzY4S19QTFQzMgotCQkgICAgfHwgcl90eXBlID09IFJfNjhLX1BMVDhPCi0JCSAgICB8fCByX3R5cGUgPT0gUl82OEtfUExUMTZPCi0JCSAgICB8fCByX3R5cGUgPT0gUl82OEtfUExUMzJPKQotCQkgICAmJiBoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMQotCQkgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLQkJICB8fCAoKHJfdHlwZSA9PSBSXzY4S19HT1Q4TwotCQkgICAgICAgfHwgcl90eXBlID09IFJfNjhLX0dPVDE2TwotCQkgICAgICAgfHwgcl90eXBlID09IFJfNjhLX0dPVDMyTwotCQkgICAgICAgfHwgKChyX3R5cGUgPT0gUl82OEtfR09UOAotCQkJICAgIHx8IHJfdHlwZSA9PSBSXzY4S19HT1QxNgotCQkJICAgIHx8IHJfdHlwZSA9PSBSXzY4S19HT1QzMikKLQkJCSAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkgICAgICAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgIT0gMCkpCi0JCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICAgICYmICghIGluZm8tPnNoYXJlZAotCQkJICB8fCAoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCQkgICAgICAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkJICAgICAgJiYgKHJfdHlwZSA9PSBSXzY4S184Ci0JCQkgIHx8IHJfdHlwZSA9PSBSXzY4S18xNgotCQkJICB8fCByX3R5cGUgPT0gUl82OEtfMzIKLQkJCSAgfHwgcl90eXBlID09IFJfNjhLX1BDOAotCQkJICB8fCByX3R5cGUgPT0gUl82OEtfUEMxNgotCQkJICB8fCByX3R5cGUgPT0gUl82OEtfUEMzMikpKQotCQl7Ci0JCSAgLyogSW4gdGhlc2UgY2FzZXMsIHdlIGRvbid0IG5lZWQgdGhlIHJlbG9jYXRpb24KLQkJICAgICB2YWx1ZS4gIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUKLQkJICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghKGluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbAotCQkgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl82OEtfR09UODoKLQljYXNlIFJfNjhLX0dPVDE2OgotCWNhc2UgUl82OEtfR09UMzI6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wKLQkgICAgIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQkgIGlmIChoICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSXzY4S19HT1Q4TzoKLQljYXNlIFJfNjhLX0dPVDE2TzoKLQljYXNlIFJfNjhLX0dPVDMyTzoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdGhlIG9mZnNldCBvZiB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluCi0JICAgICB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0KLQkgIHsKLQkgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgICB7Ci0JCXNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCQlCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICAgIH0KLQotCSAgICBpZiAoaCAhPSBOVUxMKQotCSAgICAgIHsKLQkJb2ZmID0gaC0+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+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNkeW47Ci0gIGludCBwbHRfZW50cnkwX3NpemUsIHBsdF9vZmYxLCBwbHRfb2ZmMjsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2R5biAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGFzZWN0aW9uICpzOwotCi0JICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1BMVEdPVDoKLQkgICAgICBuYW1lID0gIi5nb3QiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9KTVBSRUw6Ci0JICAgICAgbmFtZSA9ICIucmVsYS5wbHQiOwotCSAgICBnZXRfdm1hOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUExUUkVMU1o6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlbGEucGx0Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplOwotCSAgICAgIGVsc2UKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fcmF3X3NpemU7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1JFTEFTWjoKLQkgICAgICAvKiBUaGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgcmVsb2NzIChEVF9KTVBSRUwpIHNob3VsZAotCQkgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBvdmVyYWxsIHJlbG9jcyAoRFRfUkVMQSkuCi0JCSBUaGVyZWZvcmUsIHdlIG92ZXJyaWRlIHRoZSBEVF9SRUxBU1ogZW50cnkgaGVyZSB0bwotCQkgbWFrZSBpdCBub3QgaW5jbHVkZSB0aGUgSk1QUkVMIHJlbG9jcy4gIFNpbmNlIHRoZQotCQkgbGlua2VyIHNjcmlwdCBhcnJhbmdlcyBmb3IgLnJlbGEucGx0IHRvIGZvbGxvdyBhbGwKLQkJIG90aGVyIHJlbG9jYXRpb24gc2VjdGlvbnMsIHdlIGRvbid0IGhhdmUgdG8gd29ycnkKLQkJIGFib3V0IGNoYW5naW5nIHRoZSBEVF9SRUxBIGVudHJ5LiAgKi8KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsYS5wbHQiKTsKLQkgICAgICBpZiAocyAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQkgICAgZHluLmRfdW4uZF92YWwgLT0gcy0+X2Nvb2tlZF9zaXplOwotCQkgIGVsc2UKLQkJICAgIGR5bi5kX3VuLmRfdmFsIC09IHMtPl9yYXdfc2l6ZTsKLQkJfQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICBpZiAoc3BsdC0+X3Jhd19zaXplID4gMCkKLQl7Ci0gICAgICAgICAgaWYgKCFDUFUzMl9GTEFHIChvdXRwdXRfYmZkKSkKLSAgICAgICAgICAgIHsKLQkgICAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzLCBlbGZfbTY4a19wbHQwX2VudHJ5LCBQTFRfRU5UUllfU0laRSk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgICAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgNAotCQkgICAgICAgICAgIC0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyAyKSksCi0JCSAgICAgICAgICBzcGx0LT5jb250ZW50cyArIDQpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICAgICAgICAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldCArIDgKLQkJICAgICAgICAgICAtIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMTApKSwKLQkJICAgICAgICAgIHNwbHQtPmNvbnRlbnRzICsgMTIpOwotICAgICAgICAgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgCi0gICAgICAgICAgICAgICA9IFBMVF9FTlRSWV9TSVpFOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgLyogY3B1MzIgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWVtY3B5IChzcGx0LT5jb250ZW50cywgZWxmX2NwdTMyX3BsdDBfZW50cnksIFBMVF9DUFUzMl9FTlRSWV9TSVpFKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgICAgICAgKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQgKyA0Ci0JCSAgICAgICAgICAgLSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIDIpKSwKLQkJICAgICAgICAgIHNwbHQtPmNvbnRlbnRzICsgNCk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgICAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgOAotCQkgICAgICAgICAgIC0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyAxMCkpLAotCQkgICAgICAgICAgc3BsdC0+Y29udGVudHMgKyAxMCk7Ci0gICAgICAgICAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSAKLSAgICAgICAgICAgICAgID0gUExUX0NQVTMyX0VOVFJZX1NJWkU7Ci0gICAgICAgICAgICB9Ci0JfQotICAgIH0KLQotICAvKiBGaWxsIGluIHRoZSBmaXJzdCB0aHJlZSBlbnRyaWVzIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKHNkeW4gPT0gTlVMTCkKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMpOwotICAgICAgZWxzZQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDQpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgOCk7Ci0gICAgfQotCi0gIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9IDQ7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2R5bnN5bTsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgRWxmX0ludGVybmFsX1N5bSBzeW07Ci0gICAgICBpbnQgYzsKLQotICAgICAgLyogU2V0IHVwIHRoZSBzZWN0aW9uIHN5bWJvbHMgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMuICAqLwotCi0gICAgICBzZHluc3ltID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNkeW5zeW0gIT0gTlVMTCk7Ci0KLSAgICAgIHN5bS5zdF9zaXplID0gMDsKLSAgICAgIHN5bS5zdF9uYW1lID0gMDsKLSAgICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX1NFQ1RJT04pOwotICAgICAgc3ltLnN0X290aGVyID0gMDsKLQotICAgICAgYyA9IDA7Ci0gICAgICBmb3IgKHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpbnQgaW5keDsKLQotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICBzeW0uc3RfdmFsdWUgPSBzLT52bWE7Ci0KLQkgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7Ci0JICBCRkRfQVNTRVJUIChpbmR4ID4gMCk7Ci0JICBzeW0uc3Rfc2huZHggPSBpbmR4OwotCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0IChvdXRwdXRfYmZkLCAmc3ltLAotCQkJCSAgICAgKFBUUikgKCgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkJCSAgICAgc2R5bnN5bS0+Y29udGVudHMpCi0JCQkJCSAgICArIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4KSk7Ci0KLQkgICsrYzsKLQl9Ci0KLSAgICAgIC8qIFNldCB0aGUgc2hfaW5mbyBmaWVsZCBvZiB0aGUgb3V0cHV0IC5keW5zeW0gc2VjdGlvbiB0byB0aGUKLSAgICAgICAgIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgc3ltYm9sLiAgKi8KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNkeW5zeW0tPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfaW5mbyA9IGMgKyAxOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCWJmZF9lbGYzMl9tNjhrX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmMzItbTY4ayIKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fNjhLCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MjAwMAotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCV9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0JCQkJCWVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rCV9iZmRfZWxmMzJfZ2NfY29tbW9uX2ZpbmFsX2xpbmsKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJZWxmX202OGtfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQllbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgllbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawllbGZfbTY4a19nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawllbGZfbTY4a19nY19zd2VlcF9ob29rCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGYzMl9tNjhrX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZjMyX202OGtfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGYzMl9tNjhrX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxmMzJfbTY4a19wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0IDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5IDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltIDAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTEyCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tODhrLmMgYi9iZmQvZWxmMzItbTg4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2M1MzVlLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tODhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiBNb3Rvcm9sYSA4OGstc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotLyogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFueSByZWxvY2F0aW9ucywgYnV0IHNob3VsZCBiZSBnb29kIGVub3VnaAotICAgZm9yIEdEQi4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9tODhrX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1tODhrIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfbTg4awotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNXzg4SwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQlfYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tY29yZS5jIGIvYmZkL2VsZjMyLW1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNzgwMDIuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLW1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NTkgKzAsMCBAQAotLyogTW90b3JvbGxhIE1Db3JlIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBhIHByZWxpbWluYXJ5IFJDRSBFTEYgQUJJLiAgVGhlCi0gICBpbmZvcm1hdGlvbiBtYXkgbm90IG1hdGNoIHRoZSBmaW5hbCBSQ0UgRUxGIEFCSS4gICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvbWNvcmUuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2RlZmluZQlVU0VfUkVMQQkvKiBPbmx5IFVTRV9SRUwgaXMgYWN0dWFsbHkgc2lnbmlmaWNhbnQsIGJ1dCB0aGlzIGlzCi0JCQkgICBoZXJlIGFyZSBhIHJlbWluZGVyLi4uICovCi0KLXN0YXRpYyB2b2lkIG1jb3JlX2VsZl9ob3d0b19pbml0Ci0gIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogbWNvcmVfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIG1jb3JlX2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gbWNvcmVfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gbWNvcmVfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG1jb3JlX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtY29yZV9lbGZfdW5zdXBwb3J0ZWRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbKGludCkgUl9NQ09SRV9tYXhdOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtY29yZV9lbGZfaG93dG9fcmF3W10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX01DT1JFX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NQ09SRV9OT05FIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgc3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NQ09SRV9BRERSMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiQUREUjMyIiwJCS8qIG5hbWUgKi8vKiBGb3IgY29tcGF0YWJpbGl0eSB3aXRoIGNvZmYvcGUgcG9ydC4gICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDggYml0cyArIDIgemVybyBiaXRzOyBqbXBpL2pzcmkvbHJ3IGluc3RydWN0aW9ucy4KLSAgICAgU2hvdWxkIG5vdCBhcHBlYXIgaW4gb2JqZWN0IGZpbGVzLiAqLwotICBIT1dUTyAoUl9NQ09SRV9QQ1JFTElNTThCWTQsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtY29yZV9lbGZfdW5zdXBwb3J0ZWRfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUNPUkVfUENSRUxJTU04Qlk0IiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogYnNyL2J0L2JmL2JyIGluc3RydWN0aW9uczsgMTEgYml0cyArIDEgemVybyBiaXQgCi0gICAgIFNwYW4gMmsgaW5zdHJ1Y3Rpb25zID09IDRrIGJ5dGVzLgotICAgICBPbmx5IHVzZWZ1bCBwaWVjZXMgYXQgdGhlIHJlbG9jYXRlZCBhZGRyZXNzIGFyZSB0aGUgb3Bjb2RlICg1IGJpdHMpICovCi0gIEhPV1RPIChSX01DT1JFX1BDUkVMSU1NMTFCWTIsLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX1BDUkVMSU1NMTFCWTIiLC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA0IGJpdHMgKyAxIHplcm8gYml0OyAnbG9vcHQnIGluc3RydWN0aW9uIG9ubHk7IHVuc3VwcG9ydGVkLiAqLwotICBIT1dUTyAoUl9NQ09SRV9QQ1JFTElNTTRCWTIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtY29yZV9lbGZfdW5zdXBwb3J0ZWRfcmVsb2MsLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NQ09SRV9QQ1JFTElNTTRCWTIiLC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMi1iaXQgcGMtcmVsYXRpdmUuIEV2ZW50dWFsbHkgdGhpcyB3aWxsIGhlbHAgc3VwcG9ydCBQSUMgY29kZS4gKi8KLSAgSE9XVE8gKFJfTUNPUkVfUENSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUNPUkVfUENSRUwzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBQQ1JFTElNTTExQlkyLCB0aGlzIHJlbG9jYXRpb24gaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYQotICAgICAnanNyaScgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLiBUaGVyZSBpcyBhIHNlcGFyYXRlIHJlbG9jYXRpb24KLSAgICAgZW50cnkgZm9yIHRoZSBsaXRlcmFsIHBvb2wgZW50cnkgdGhhdCBpdCByZWZlcmVuY2VzLCBidXQgd2UgCi0gICAgIG1pZ2h0IGJlIGFibGUgdG8gY2hhbmdlIHRoZSBqc3JpIHRvIGEgYnNyIGlmIHRoZSB0YXJnZXQgdHVybnMgb3V0Ci0gICAgIHRvIGJlIGNsb3NlIGVub3VnaCBbZXZlbiB0aG91Z2ggd2Ugd29uJ3QgcmVjbGFpbSB0aGUgbGl0ZXJhbCBwb29sCi0gICAgIGVudHJ5LCB3ZSdsbCBnZXQgc29tZSBydW50aW1lIGVmZmljaWVuY3kgYmFja10uIE5vdGUgdGhhdCB0aGlzCi0gICAgIGlzIGEgcmVsb2NhdGlvbiB0aGF0IHdlIGFyZSBhbGxvd2VkIHRvIHNhZmVseSBpZ25vcmUuICAqLyAKLSAgSE9XVE8gKFJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTIsLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX1BDUkVMSlNSX0lNTTExQlkyIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLSAgSE9XVE8gKFJfTUNPUkVfR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfTUNPUkVfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX01DT1JFX0dOVV9WVEVOVFJZLCAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9NQ09SRV9HTlVfVlRFTlRSWSIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgSE9XVE8gKFJfTUNPUkVfUkVMQVRJVkUsICAgICAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NQ09SRV9SRUxBVElWRSIsICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShhKSAoc2l6ZW9mIChhKSAvIHNpemVvZiAoYSlbMF0pCi0jZW5kaWYKLQwKLS8qIEluaXRpYWxpemUgdGhlIG1jb3JlX2VsZl9ob3d0b190YWJsZSwgc28gdGhhdCBsaW5lYXIgYWNjZXNzZXMgY2FuIGJlIGRvbmUuICAqLwotc3RhdGljIHZvaWQKLW1jb3JlX2VsZl9ob3d0b19pbml0ICgpCi17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IE5VTV9FTEVNIChtY29yZV9lbGZfaG93dG9fcmF3KTsgaS0tOykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgdHlwZTsKLSAgICAgIAotICAgICAgdHlwZSA9IG1jb3JlX2VsZl9ob3d0b19yYXdbaV0udHlwZTsKLSAgICAgIAotICAgICAgQkZEX0FTU0VSVCAodHlwZSA8IE5VTV9FTEVNIChtY29yZV9lbGZfaG93dG9fdGFibGUpKTsKLSAgICAgIAotICAgICAgbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFt0eXBlXSA9ICYgbWNvcmVfZWxmX2hvd3RvX3JhdyBbaV07Ci0gICAgfQotfQotCi0MCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1tY29yZV9lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBlbnVtIGVsZl9tY29yZV9yZWxvY190eXBlIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9OT05FOwotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTk9ORToJCSAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX05PTkU7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgkJCSAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX0FERFIzMjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNDoJICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfUENSRUxJTU04Qlk0OyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMjogICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9QQ1JFTElNTTExQlkyOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyOgkgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9QQ1JFTElNTTRCWTI7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOgkJICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfUENSRUwzMjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyOiBtY29yZV9yZWxvYyA9IFJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTI7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOiAgICAgICAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX0dOVV9WVElOSEVSSVQ7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWTogICAgICAgICAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX0dOVV9WVEVOVFJZOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19SVkE6ICAgICAgICAgICAgICAgICAgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9SRUxBVElWRTsgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKU5VTEw7Ci0gICAgfQotCi0gIGlmICghIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbUl9NQ09SRV9QQ1JFTElNTThCWTRdKQkvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIG1jb3JlX2VsZl9ob3d0b19pbml0ICgpOwotCi0gIHJldHVybiBtY29yZV9lbGZfaG93dG9fdGFibGUgWyhpbnQpIG1jb3JlX3JlbG9jXTsKLX07Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYSBSQ0UgRUxGIHJlbG9jLiAgKi8KLXN0YXRpYyB2b2lkCi1tY29yZV9lbGZfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiBjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKiBkc3Q7Ci17Ci0gIGlmICghIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbUl9NQ09SRV9QQ1JFTElNTThCWTRdKQkvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIG1jb3JlX2VsZl9ob3d0b19pbml0ICgpOwotCi0gIEJGRF9BU1NFUlQgKEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl9NQ09SRV9tYXgpOwotICAKLSAgY2FjaGVfcHRyLT5ob3d0byA9IG1jb3JlX2VsZl9ob3d0b190YWJsZSBbRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyldOwotfQotCi0vKiBGdW5jdGlvbiB0byBzZXQgd2hldGhlciBhIG1vZHVsZSBuZWVkcyB0aGUgLW1yZWxvY2F0YWJsZSBiaXQgc2V0LiAqLwotc3RhdGljIGJvb2xlYW4KLW1jb3JlX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBCRkRfQVNTRVJUICghIGVsZl9mbGFnc19pbml0IChhYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tY29yZV9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9PSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqIGliZmQ7Ci0gICAgIGJmZCAqIG9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG9sZF9mbGFnczsKLSAgZmxhZ3dvcmQgbmV3X2ZsYWdzOwotICBib29sZWFuIGVycm9yOwotCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmICggICBpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0gICAgICAmJiBvYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgJXMgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzICVzIGVuZGlhbi5cbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLSAgICAgICAgIGJmZF9iaWdfZW5kaWFuIChpYmZkKSA/ICJiaWciIDogImxpdHRsZSIsCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAob2JmZCkgPyAiYmlnIiA6ICJsaXR0bGUiKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuZXdfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb2xkX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0gIAotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCS8qIEZpcnN0IGNhbGwsIG5vIGZsYWdzIHNldCAqLwotICAgIHsKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IG5ld19mbGFnczsKLSAgICB9Ci0gIGVsc2UgaWYgKG5ld19mbGFncyA9PSBvbGRfZmxhZ3MpCS8qIENvbXBhdGlibGUgZmxhZ3MgYXJlIG9rICovCi0gICAgOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIERvbid0IHByZXRlbmQgd2UgY2FuIGRlYWwgd2l0aCB1bnN1cHBvcnRlZCByZWxvY3MuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiByZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqIHN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICogb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKiBlcnJvcl9tZXNzYWdlOwotewotICBCRkRfQVNTRVJUIChyZWxvY19lbnRyeS0+aG93dG8gIT0gKHJlbG9jX2hvd3RvX3R5cGUgKikwKTsKLSAgCi0gIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IFJlbG9jYXRpb24gJXMgKCVkKSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIpLAotCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJICAgICAgcmVsb2NfZW50cnktPmhvd3RvLT5uYW1lLAotCQkgICAgICByZWxvY19lbnRyeS0+aG93dG8tPnR5cGUpOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotfQotCi0MCi0vKiBUaGUgUkVMT0NBVEVfU0VDVElPTiBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kIGxpbmtlcgotICAgdG8gaGFuZGxlIHRoZSByZWxvY2F0aW9ucyBmb3IgYSBzZWN0aW9uLgotCi0gICBUaGUgcmVsb2NzIGFyZSBhbHdheXMgcGFzc2VkIGFzIFJlbGEgc3RydWN0dXJlczsgaWYgdGhlIHNlY3Rpb24KLSAgIGFjdHVhbGx5IHVzZXMgUmVsIHN0cnVjdHVyZXMsIHRoZSByX2FkZGVuZCBmaWVsZCB3aWxsIGFsd2F5cyBiZQotICAgemVyby4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYWRqdXN0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGFzCi0gICBuZWNlc3NhcnksIGFuZCAoaWYgdXNpbmcgUmVsYSByZWxvY3MgYW5kIGdlbmVyYXRpbmcgYQotICAgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlKSBhZGp1c3RpbmcgdGhlIHJlbG9jIGFkZGVuZCBhcwotICAgbmVjZXNzYXJ5LgotCi0gICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgc2V0dGluZyB0aGUgcmVsb2MKLSAgIGFkZHJlc3Mgb3IgdGhlIHJlbG9jIHN5bWJvbCBpbmRleC4KLQotICAgTE9DQUxfU1lNUyBpcyBhIHBvaW50ZXIgdG8gdGhlIHN3YXBwZWQgaW4gbG9jYWwgc3ltYm9scy4KLQotICAgTE9DQUxfU0VDVElPTlMgaXMgYW4gYXJyYXkgZ2l2aW5nIHRoZSBzZWN0aW9uIGluIHRoZSBpbnB1dCBmaWxlCi0gICBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdF9zaG5keCBmaWVsZCBvZiBlYWNoIGxvY2FsIHN5bWJvbC4KLQotICAgVGhlIGdsb2JhbCBoYXNoIHRhYmxlIGVudHJ5IGZvciB0aGUgZ2xvYmFsIHN5bWJvbHMgY2FuIGJlIGZvdW5kCi0gICB2aWEgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkuCi0KLSAgIFdoZW4gZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGlzIGZ1bmN0aW9uIG11c3QgaGFuZGxlCi0gICBTVEJfTE9DQUwvU1RUX1NFQ1RJT04gc3ltYm9scyBzcGVjaWFsbHkuICBUaGUgb3V0cHV0IHN5bWJvbCBpcwotICAgZ29pbmcgdG8gYmUgdGhlIHNlY3Rpb24gc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG91dHB1dAotICAgc2VjdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgYWRkZW5kIG11c3QgYmUgYWRqdXN0ZWQKLSAgIGFjY29yZGluZ2x5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1jb3JlX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKiBvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIGJmZCAqIGlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqIHJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqIGxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqIGxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsID0gcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgYm9vbGVhbiByZXQgPSB0cnVlOwotICBsb25nIGluc247Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsCi0JICAgIm1jb3JlX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIGNhbGxlZCBmb3IgJXMgc2VjdGlvbiAlcywgJWxkIHJlbG9jYXRpb25zJXNcbiIsCi0JICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkgICBiZmRfc2VjdGlvbl9uYW1lKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiksCi0JICAgKGxvbmcpIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50LAotCSAgIChpbmZvLT5yZWxvY2F0ZWFibGUpID8gIiAocmVsb2NhdGFibGUpIiA6ICIiKTsKLSNlbmRpZgotCi0gIGlmICghIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbUl9NQ09SRV9QQ1JFTElNTThCWTRdKQkvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIG1jb3JlX2VsZl9ob3d0b19pbml0ICgpOwotCi0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGVudW0gZWxmX21jb3JlX3JlbG9jX3R5cGUgICAgcl90eXBlID0gKGVudW0gZWxmX21jb3JlX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICBhZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICByID0gYmZkX3JlbG9jX290aGVyOwotICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICBzZWMgPSAoYXNlY3Rpb24gKikgMDsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgaG93dG87Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb247Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bSA9IChFbGZfSW50ZXJuYWxfU3ltICopIDA7Ci0gICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIDA7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgIG9sZGluc3Q7Ci0gICAgICAKLSAgICAgIC8qIFVua25vd24gcmVsb2NhdGlvbiBoYW5kbGluZyAqLwotICAgICAgaWYgKCh1bnNpZ25lZCkgcl90eXBlID49ICh1bnNpZ25lZCkgUl9NQ09SRV9tYXgKLQkgIHx8ICEgbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFsoaW50KXJfdHlwZV0pCi0JewotCSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogVW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWRcbiIpLAotCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCSAgICAgIChpbnQpIHJfdHlwZSk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICAKLSAgICAgIGhvd3RvID0gbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFsoaW50KSByX3R5cGVdOwotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIAotCSAgICAgIGlmICgodW5zaWduZWQpRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgYWRkZW5kID0gcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotI2lmZGVmIERFQlVHCi0JICBmcHJpbnRmIChzdGRlcnIsICJcdHR5cGUgPSAlcyAoJWQpLCBzeW1ib2wgaW5kZXggPSAlbGQsIG9mZnNldCA9ICVsZCwgYWRkZW5kID0gJWxkXG4iLAotCQkgICBob3d0by0+bmFtZSwgKGludCkgcl90eXBlLCByX3N5bW5keCwgKGxvbmcpIG9mZnNldCwgKGxvbmcpIGFkZGVuZCk7Ci0jZW5kaWYKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotCi0gICAgICAvKiBDb21wbGFpbiBhYm91dCBrbm93biByZWxvY2F0aW9uIHRoYXQgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkICovCi0gICAgICBpZiAoaG93dG8tPnNwZWNpYWxfZnVuY3Rpb24gPT0gbWNvcmVfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jKQotCXsKLQkgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IFJlbG9jYXRpb24gJXMgKCVkKSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIpLAotCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCSAgICAgIGhvd3RvLT5uYW1lLAotCQkJICAgICAgKGludClyX3R5cGUpOwotCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldCA9IGZhbHNlOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zIFtyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzIFtyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgaWYgKCAgIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCShpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAJIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgcmV0ID0gZmFsc2U7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0KLQljYXNlIFJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTI6Ci0JICBvbGRpbnN0ID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyArIG9mZnNldCk7Ci0jZGVmaW5lCU1DT1JFX0lOU1RfQlNSCTB4RjgwMAotCSAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCBNQ09SRV9JTlNUX0JTUiwgY29udGVudHMgKyBvZmZzZXQpOwotCSAgYnJlYWs7Ci0JfQotCi0KLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXHR0eXBlID0gJXMgKCVkKSwgc3ltYm9sIGluZGV4ID0gJWxkLCBvZmZzZXQgPSAlbGQsIGFkZGVuZCA9ICVsZFxuIiwKLQkgICAgICAgaG93dG8tPm5hbWUsIHJfdHlwZSwgcl9zeW1uZHgsIChsb25nKSBvZmZzZXQsIChsb25nKSBhZGRlbmQpOwotI2VuZGlmCi0KLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLQkoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIG9mZnNldCwgcmVsb2NhdGlvbiwgYWRkZW5kKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rICYmIHJfdHlwZSA9PSBSX01DT1JFX1BDUkVMSlNSX0lNTTExQlkyKQotCXsKLQkgIC8qIFdhc24ndCBvaywgYmFjayBpdCBvdXQgYW5kIGdpdmUgdXAuICAqLwotCSAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCBvbGRpbnN0LCBjb250ZW50cyArIG9mZnNldCk7Ci0JICByID0gYmZkX3JlbG9jX29rOwotCX0KLSAgICAgIAotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHJldCA9IGZhbHNlOwotCSAgCi0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKiBuYW1lOwotCi0JCWlmIChoICE9IE5VTEwpCi0JCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpOwotCQkgICAgCi0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICBicmVhazsKLQotCQkgICAgaWYgKCogbmFtZSA9PSAnXDAnKQotCQkgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCQkgIH0KLQotCQkoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICBvZmZzZXQpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHJldDsKLX0KLQwKLS8qIFJldHVybiB0aGUgc2VjdGlvbiB0aGF0IHNob3VsZCBiZSBtYXJrZWQgYWdhaW5zdCBHQyBmb3IgYSBnaXZlbgotICAgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tY29yZV9lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgICAgICBhYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICAgICAgIGluZm87Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgcmVsOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgICAgICAgc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl9NQ09SRV9HTlVfVlRJTkhFUklUOgotCWNhc2UgUl9NQ09SRV9HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIAotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLQkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLQl7Ci0JICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgaW5mbzsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICBzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogcmVsb2NzOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0gCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgYXNlY3Rpb24gKiBzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICByZWxfZW5kOwotIAotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotIAotICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotIAotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgCi0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotICAgICAgICBoID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgaCA9IHN5bV9oYXNoZXMgW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0gCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgICB7Ci0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfTUNPUkVfR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQkgIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9NQ09SRV9HTlVfVlRFTlRSWToKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX2FkZGVuZCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfbWNvcmVfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1tY29yZS1iaWciCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgICAgIGJmZF9lbGYzMl9tY29yZV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICAgICJlbGYzMi1tY29yZS1saXR0bGUiCi0KLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX21jb3JlCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fTUNPUkUKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAJCS8qIDRrLCBpZiB3ZSBldmVyIGhhdmUgJ2VtICovCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCW1jb3JlX2VsZl9pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAlOVUxMCi0KLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQltY29yZV9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQltY29yZV9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzCQltY29yZV9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAkJbWNvcmVfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JCW1jb3JlX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawkJbWNvcmVfZWxmX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCQltY29yZV9lbGZfZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgICAgICAgICAgICAgICAgbWNvcmVfZWxmX2NoZWNrX3JlbG9jcwotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwkJMQotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItbWlwcy5jIGIvYmZkL2VsZjMyLW1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwMzI2Mi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItbWlwcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzgwMCArMCwwIEBACi0vKiBNSVBTLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIE1vc3Qgb2YgdGhlIGluZm9ybWF0aW9uIGFkZGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LAotICAgPGlhbkBjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaGFuZGxlcyBNSVBTIEVMRiB0YXJnZXRzLiAgU0dJIElyaXggNSB1c2VzIGEgc2xpZ2h0bHkKLSAgIGRpZmZlcmVudCBNSVBTIEVMRiBmcm9tIG90aGVyIHRhcmdldHMuICBUaGlzIG1hdHRlcnMgd2hlbiBsaW5raW5nLgotICAgVGhpcyBmaWxlIHN1cHBvcnRzIGJvdGgsIHN3aXRjaGluZyBhdCBydW50aW1lLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0KLS8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICAqLwotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAiY29mZi9taXBzLmgiCi0jZGVmaW5lIEVDT0ZGXzMyCi0jaW5jbHVkZSAiZWNvZmZzd2FwLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwczMyXzY0Yml0X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgbWlwc19pbmZvX3RvX2hvd3RvX3JlbAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKiwgRWxmMzJfZ3B0YWIgKikpOwotc3RhdGljIHZvaWQgYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX2dwdGFiICosIEVsZjMyX0V4dGVybmFsX2dwdGFiICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX3N5bV9pc19nbG9iYWwgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGYzMl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZQotICBQQVJBTVMgKChQVFIsIGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICopKTsKLXN0YXRpYyBpbnQgbWlwc19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX21vZGlmeV9zZWdtZW50X21hcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIElOTElORSBpbnQgZWxmX21pcHNfaXNhIFBBUkFNUyAoKGZsYWd3b3JkKSk7Ci1zdGF0aWMgSU5MSU5FIGludCBlbGZfbWlwc19tYWNoIFBBUkFNUyAoKGZsYWd3b3JkKSk7Ci1zdGF0aWMgSU5MSU5FIGNoYXIqIGVsZl9taXBzX2FiaV9uYW1lIFBBUkFNUyAoKGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjMyX3NlY3Rpb25fZnJvbV9zaGRyCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGYzMl9JbnRlcm5hbF9TaGRyICosIGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGYzMl9zZWN0aW9uX3Byb2Nlc3NpbmcKLSAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICptaXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICptaXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IGdwdGFiX2NvbXBhcmUgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyB2b2lkIG1pcHNfZWxmX3JlbG9jYXRlX2hpMTYKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF9ieXRlICosCi0JICAgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfcmVsb2NhdGVfZ290X2xvY2FsCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZl9yZWxvY2F0ZV9nbG9iYWxfZ290Ci0gICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzMTZfanVtcF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwczE2X2dwcmVsX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfYWRqdXN0X2R5bmluZHgKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBFbGZfSW50ZXJuYWxfU3ltICosCi0JICAgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2NyZWF0ZV9jb21wYWN0X3JlbF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCSAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosIGFzZWN0aW9uICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19lbGZfZmluYWxfZ3AKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgYm9vbGVhbiwgY2hhciAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYmZkX2J5dGUgKmVsZjMyX21pcHNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqLCBib29sZWFuLCBhc3ltYm9sICoqKSk7Ci0KLS8qIFRoaXMgaXMgdHJ1ZSBmb3IgSXJpeCA1IGV4ZWN1dGFibGVzLCBmYWxzZSBmb3Igbm9ybWFsIE1JUFMgRUxGIEFCSQotICAgZXhlY3V0YWJsZXMuICBGSVhNRTogQXQgdGhlIG1vbWVudCwgd2UgZGVmYXVsdCB0byBhbHdheXMgZ2VuZXJhdGluZwotICAgSXJpeCA1IGV4ZWN1dGFibGVzLiAgKi8KLQotI2RlZmluZSBTR0lfQ09NUEFUKGFiZmQpICgxKQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgLmdvdCBpbmZvcm1hdGlvbiB3aGVuIGxpbmtpbmcuICBJdAotICAgaXMgc3RvcmVkIGluIHRoZSB0ZGF0YSBmaWVsZCBvZiB0aGUgYmZkX2VsZl9zZWN0aW9uX2RhdGEgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IG1pcHNfZ290X2luZm8KLXsKLSAgLyogVGhlIHN5bWJvbCBpbmRleCBvZiB0aGUgZmlyc3QgZ2xvYmFsIC5nb3Qgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBnbG9iYWxfZ290c3ltOwotICAvKiBUaGUgbnVtYmVyIG9mIGxvY2FsIC5nb3QgZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGludCBsb2NhbF9nb3RubzsKLSAgLyogVGhlIG51bWJlciBvZiBsb2NhbCAuZ290IGVudHJpZXMgd2UgaGF2ZSB1c2VkLiAgKi8KLSAgdW5zaWduZWQgaW50IGFzc2lnbmVkX2dvdG5vOwotfTsKLQotLyogVGhlIG51bWJlciBvZiBsb2NhbCAuZ290IGVudHJpZXMgd2UgcmVzZXJ2ZS4gICovCi0jZGVmaW5lIE1JUFNfUkVTRVJWRURfR09UTk8gKDIpCi0KLS8qIEluc3RydWN0aW9ucyB3aGljaCBhcHBlYXIgaW4gYSBzdHViLiAgRm9yIHNvbWUgcmVhc29uIHRoZSBzdHViIGlzCi0gICBzbGlnaHRseSBkaWZmZXJlbnQgb24gYW4gU0dJIHN5c3RlbS4gICovCi0jZGVmaW5lIEVMRl9NSVBTX0dQX09GRlNFVChhYmZkKSAoU0dJX0NPTVBBVCAoYWJmZCkgPyAweDdmZjAgOiAweDgwMDApCi0jZGVmaW5lIFNUVUJfTFcoYWJmZCkJCQkJCVwKLSAgKFNHSV9DT01QQVQgKGFiZmQpCQkJCQlcCi0gICA/IDB4OGY5OTgwMTAJCQkvKiBsdyB0OSwweDgwMTAoZ3ApICovCVwKLSAgIDogMHg4Zjk5ODAwMCkJCS8qIGx3IHQ5LDB4ODAwMChncCkgKi8KLSNkZWZpbmUgU1RVQl9NT1ZFIDB4MDNlMDc4MjUJLyogbW92ZSB0NyxyYSAqLwotI2RlZmluZSBTVFVCX0pBTFIgMHgwMzIwZjgwOQkvKiBqYWwgdDkgKi8KLSNkZWZpbmUgU1RVQl9MSTE2IDB4MzQxODAwMDAJLyogb3JpIHQ4LHplcm8sMCAqLwotI2RlZmluZSBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRSAoMTYpCi0KLSNpZiAwCi0vKiBXZSBubyBsb25nZXIgdHJ5IHRvIGlkZW50aWZ5IHBhcnRpY3VsYXIgc2VjdGlvbnMgZm9yIHRoZSAuZHluc3ltCi0gICBzZWN0aW9uLiAgV2hlbiB3ZSBkbywgd2Ugd2luZCB1cCBjcmFzaGluZyBpZiB0aGVyZSBhcmUgb3RoZXIgcmFuZG9tCi0gICBzZWN0aW9ucyB3aXRoIHJlbG9jYXRpb25zLiAgKi8KLQotLyogTmFtZXMgb2Ygc2VjdGlvbnMgd2hpY2ggYXBwZWFyIGluIHRoZSAuZHluc3ltIHNlY3Rpb24gaW4gYW4gSXJpeCA1Ci0gICBleGVjdXRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzW10gPQotewotICAiLnRleHQiLAotICAiLmluaXQiLAotICAiLmZpbmkiLAotICAiLmRhdGEiLAotICAiLnJvZGF0YSIsCi0gICIuc2RhdGEiLAotICAiLnNic3MiLAotICAiLmJzcyIsCi0gIE5VTEwKLX07Ci0KLSNkZWZpbmUgU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTIFwKLSAgKHNpemVvZiBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzIC8gc2l6ZW9mIG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXNbMF0pCi0KLS8qIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzIHdoaWNoIGdvIGluIHRoZQotICAgdGV4dCBzZWdtZW50LiAgKi8KLQotI2RlZmluZSBNSVBTX1RFWFRfRFlOU1lNX1NFQ05PICgzKQotCi0jZW5kaWYgLyogMCAqLwotCi0vKiBUaGUgbmFtZXMgb2YgdGhlIHJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlIHN5bWJvbHMgdXNlZCBvbiBJcml4IDUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pcHNfZWxmX2R5bnN5bV9ydHByb2NfbmFtZXNbXSA9Ci17Ci0gICJfcHJvY2VkdXJlX3RhYmxlIiwKLSAgIl9wcm9jZWR1cmVfc3RyaW5nX3RhYmxlIiwKLSAgIl9wcm9jZWR1cmVfdGFibGVfc2l6ZSIsCi0gIE5VTEwKLX07Ci0KLS8qIFRoZXNlIHN0cnVjdHVyZXMgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIC5jb21wYWN0X3JlbCBzZWN0aW9uIG9uCi0gICBJcml4IDUuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBsb25nIGlkMTsJCS8qIEFsd2F5cyBvbmU/ICAqLwotICB1bnNpZ25lZCBsb25nIG51bTsJCS8qIE51bWJlciBvZiBjb21wYWN0IHJlbG9jYXRpb24gZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgaWQyOwkJLyogQWx3YXlzIHR3bz8gICovCi0gIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkJLyogVGhlIGZpbGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByZXNlcnZlZDA7CS8qIFplcm8/ICAqLwotICB1bnNpZ25lZCBsb25nIHJlc2VydmVkMTsJLyogWmVybz8gICovCi19IEVsZjMyX2NvbXBhY3RfcmVsOwotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmRfYnl0ZSBpZDFbNF07Ci0gIGJmZF9ieXRlIG51bVs0XTsKLSAgYmZkX2J5dGUgaWQyWzRdOwotICBiZmRfYnl0ZSBvZmZzZXRbNF07Ci0gIGJmZF9ieXRlIHJlc2VydmVkMFs0XTsKLSAgYmZkX2J5dGUgcmVzZXJ2ZWQxWzRdOwotfSBFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgaW50IGN0eXBlIDogMTsJLyogMTogbG9uZyAwOiBzaG9ydCBmb3JtYXQuIFNlZSBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGludCBydHlwZSA6IDQ7CS8qIFJlbG9jYXRpb24gdHlwZXMuIFNlZSBiZWxvdy4gKi8KLSAgdW5zaWduZWQgaW50IGRpc3QydG8gOiA4OwotICB1bnNpZ25lZCBpbnQgcmVsdmFkZHIgOiAxOTsJLyogKFZBRERSIC0gdmFkZHIgb2YgdGhlIHByZXZpb3VzIGVudHJ5KS8gNCAqLwotICB1bnNpZ25lZCBsb25nIGtvbnN0OwkJLyogS09OU1QgZmllbGQuIFNlZSBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGxvbmcgdmFkZHI7CQkvKiBWQUREUiB0byBiZSByZWxvY2F0ZWQuICAqLwotfSBFbGYzMl9jcmluZm87Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGludCBjdHlwZSA6IDE7CS8qIDE6IGxvbmcgMDogc2hvcnQgZm9ybWF0LiBTZWUgYmVsb3cuICAqLwotICB1bnNpZ25lZCBpbnQgcnR5cGUgOiA0OwkvKiBSZWxvY2F0aW9uIHR5cGVzLiBTZWUgYmVsb3cuICovCi0gIHVuc2lnbmVkIGludCBkaXN0MnRvIDogODsKLSAgdW5zaWduZWQgaW50IHJlbHZhZGRyIDogMTk7CS8qIChWQUREUiAtIHZhZGRyIG9mIHRoZSBwcmV2aW91cyBlbnRyeSkvIDQgKi8KLSAgdW5zaWduZWQgbG9uZyBrb25zdDsJCS8qIEtPTlNUIGZpZWxkLiBTZWUgYmVsb3cuICAqLwotfSBFbGYzMl9jcmluZm8yOwotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmRfYnl0ZSBpbmZvWzRdOwotICBiZmRfYnl0ZSBrb25zdFs0XTsKLSAgYmZkX2J5dGUgdmFkZHJbNF07Ci19IEVsZjMyX0V4dGVybmFsX2NyaW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgYmZkX2J5dGUgaW5mb1s0XTsKLSAgYmZkX2J5dGUga29uc3RbNF07Ci19IEVsZjMyX0V4dGVybmFsX2NyaW5mbzI7Ci0KLS8qIFRoZXNlIGFyZSB0aGUgY29uc3RhbnRzIHVzZWQgdG8gc3dhcCB0aGUgYml0ZmllbGRzIGluIGEgY3JpbmZvLiAgKi8KLQotI2RlZmluZSBDUklORk9fQ1RZUEUgKDB4MSkKLSNkZWZpbmUgQ1JJTkZPX0NUWVBFX1NIICgzMSkKLSNkZWZpbmUgQ1JJTkZPX1JUWVBFICgweGYpCi0jZGVmaW5lIENSSU5GT19SVFlQRV9TSCAoMjcpCi0jZGVmaW5lIENSSU5GT19ESVNUMlRPICgweGZmKQotI2RlZmluZSBDUklORk9fRElTVDJUT19TSCAoMTkpCi0jZGVmaW5lIENSSU5GT19SRUxWQUREUiAoMHg3ZmZmZikKLSNkZWZpbmUgQ1JJTkZPX1JFTFZBRERSX1NIICgwKQotCi0vKiBBIGNvbXBhY3QgcmVsb2NhdGlvbiBpbmZvIGhhcyBsb25nICgzIHdvcmRzKSBvciBzaG9ydCAoMiB3b3JkcykKLSAgIGZvcm1hdHMuICBBIHNob3J0IGZvcm1hdCBkb2Vzbid0IGhhdmUgVkFERFIgZmllbGQgYW5kIHJlbHZhZGRyCi0gICBmaWVsZHMgY29udGFpbnMgKChWQUREUiAtIHZhZGRyIG9mIHRoZSBwcmV2aW91cyBlbnRyeSkgPj4gMikuICAqLwotI2RlZmluZSBDUkZfTUlQU19MT05HCQkJMQotI2RlZmluZSBDUkZfTUlQU19TSE9SVAkJCTAKLQotLyogVGhlcmUgYXJlIDQgdHlwZXMgb2YgY29tcGFjdCByZWxvY2F0aW9uIGF0IGxlYXN0LiBUaGUgdmFsdWUgS09OU1QKLSAgIGhhcyBkaWZmZXJlbnQgbWVhbmluZyBmb3IgZWFjaCB0eXBlOgotCi0gICAodHlwZSkJCShrb25zdCkKLSAgIENUX01JUFNfUkVMMzIJQWRkcmVzcyBpbiBkYXRhCi0gICBDVF9NSVBTX1dPUkQJCUFkZHJlc3MgaW4gd29yZCAoWFhYKQotICAgQ1RfTUlQU19HUEhJX0xPCUdQIC0gdmFkZHIKLSAgIENUX01JUFNfSk1QQUQJQWRkcmVzcyB0byBqdW1wCi0gICAqLwotCi0jZGVmaW5lIENSVF9NSVBTX1JFTDMyCQkJMHhhCi0jZGVmaW5lIENSVF9NSVBTX1dPUkQJCQkweGIKLSNkZWZpbmUgQ1JUX01JUFNfR1BISV9MTwkJMHhjCi0jZGVmaW5lIENSVF9NSVBTX0pNUEFECQkJMHhkCi0KLSNkZWZpbmUgbWlwc19lbGZfc2V0X2NyX2Zvcm1hdCh4LGZvcm1hdCkJKCh4KS5jdHlwZSA9IChmb3JtYXQpKQotI2RlZmluZSBtaXBzX2VsZl9zZXRfY3JfdHlwZSh4LHR5cGUpCQkoKHgpLnJ0eXBlID0gKHR5cGUpKQotI2RlZmluZSBtaXBzX2VsZl9zZXRfY3JfZGlzdDJ0byh4LHYpCQkoKHgpLmRpc3QydG8gPSAodikpCi0jZGVmaW5lIG1pcHNfZWxmX3NldF9jcl9yZWx2YWRkcih4LGQpCQkoKHgpLnJlbHZhZGRyID0gKGQpPDwyKQotCi1zdGF0aWMgdm9pZCBiZmRfZWxmMzJfc3dhcF9jb21wYWN0X3JlbF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX2NvbXBhY3RfcmVsICosIEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsICopKTsKLXN0YXRpYyB2b2lkIGJmZF9lbGYzMl9zd2FwX2NyaW5mb19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX2NyaW5mbyAqLCBFbGYzMl9FeHRlcm5hbF9jcmluZm8gKikpOwotCi0jZGVmaW5lIFVTRV9SRUwJMQkJLyogTUlQUyB1c2VzIFJFTCByZWxvY2F0aW9ucyBpbnN0ZWFkIG9mIFJFTEEgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHNfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIE5vIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18zMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHN5bWJvbCByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1JFTDMyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDI2IGJpdCBicmFuY2ggYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX01JUFNfMjYsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIAkJCS8qIFRoaXMgbmVlZHMgY29tcGxleCBvdmVyZmxvdwotCQkJCSAgIGRldGVjdGlvbiwgYmVjYXVzZSB0aGUgdXBwZXIgZm91cgotCQkJCSAgIGJpdHMgbXVzdCBtYXRjaCB0aGUgUEMuICAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18yNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9NSVBTX0xPMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0xPMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HUFJFTDE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWZlcmVuY2UgdG8gbGl0ZXJhbCBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTElURVJBTCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVmZXJlbmNlIHRvIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ290MTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1QxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IFBDIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPIChSX01JUFNfUEMxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1BDMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgY2FsbCB0aHJvdWdoIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogVGhpcyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTEwxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dQUkVMMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgICAvKiBUaGUgcmVtYWluaW5nIHJlbG9jcyBhcmUgZGVmaW5lZCBvbiBJcml4IDUsIGFsdGhvdWdoIHRoZXkgYXJlCi0gICAgICAgbm90IGRlZmluZWQgYnkgdGhlIEFCSS4gICovCi0gICAgeyAxMyB9LAotICAgIHsgMTQgfSwKLSAgICB7IDE1IH0sCi0KLSAgLyogQSA1IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ1LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDUiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3YzAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2MwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseTsgYSBzcGVjaWFsIGZ1bmN0aW9uIGlzCi0gICAgIG5lZWRlZCB0byBwdXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluIHRoZSByaWdodCBwbGFjZS4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3YzQsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2M0LAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgcmVsb2NhdGlvbi4gIFRoaXMgaXMgdXNlZCBpbiAzMiBiaXQgRUxGIHdoZW4gYWRkcmVzc2VzCi0gICAgIGFyZSA2NCBiaXRzIGxvbmc7IHRoZSB1cHBlciAzMiBiaXRzIGFyZSBzaW1wbHkgYSBzaWduIGV4dGVuc2lvbi4KLSAgICAgVGhlIGZpZWxkcyBvZiB0aGUgaG93dG8gc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGZvciBSX01JUFNfMzIsCi0gICAgIG90aGVyIHRoYW4gdGhlIHR5cGUsIG5hbWUsIGFuZCBzcGVjaWFsX2Z1bmN0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU182NCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHMzMl82NGJpdF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBEaXNwbGFjZW1lbnQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfRElTUCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0RJU1AiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogRGlzcGxhY2VtZW50IHRvIHBhZ2UgcG9pbnRlciBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9QQUdFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfUEFHRSIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBPZmZzZXQgZnJvbSBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfT0ZTVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX09GU1QiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0hJMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0hJMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfTE8xNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2NCBiaXQgc3VidHJhY3Rpb24uICBQcmVzdW1hYmx5IG5vdCB1c2VkIGluIDMyIGJpdCBFTEYuICAqLwotICB7IFJfTUlQU19TVUIgfSwKLQotICAvKiBVc2VkIHRvIGNhdXNlIHRoZSBsaW5rZXIgdG8gaW5zZXJ0IGFuZCBkZWxldGUgaW5zdHJ1Y3Rpb25zPyAgKi8KLSAgeyBSX01JUFNfSU5TRVJUX0EgfSwKLSAgeyBSX01JUFNfSU5TRVJUX0IgfSwKLSAgeyBSX01JUFNfREVMRVRFIH0sCi0KLSAgLyogR2V0IHRoZSBoaWdoZXIgdmFsdWVzIG9mIGEgNjQgYml0IGFkZGVuZC4gIFByZXN1bWFibHkgbm90IHVzZWQgaW4KLSAgICAgMzIgYml0IEVMRi4gICovCi0gIHsgUl9NSVBTX0hJR0hFUiB9LAotICB7IFJfTUlQU19ISUdIRVNUIH0sCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTF9ISTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTExfSEkxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTExfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMX0xPMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgeyBSX01JUFNfU0NOX0RJU1AgfSwKLSAgeyBSX01JUFNfUkVMMTYgfSwKLSAgeyBSX01JUFNfQUREX0lNTUVESUFURSB9LAotICB7IFJfTUlQU19QSlVNUCB9LAotICB7IFJfTUlQU19SRUxHT1QgfQotfTsKLQotLyogVGhlIHJlbG9jIHVzZWQgZm9yIEJGRF9SRUxPQ19DVE9SIHdoZW4gZG9pbmcgYSA2NCBiaXQgbGluay4gIFRoaXMKLSAgIGlzIGEgaGFjayB0byBtYWtlIHRoZSBsaW5rZXIgdGhpbmsgdGhhdCB3ZSBuZWVkIDY0IGJpdCB2YWx1ZXMuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHNfY3RvcjY0X2hvd3RvID0KLSAgSE9XVE8gKFJfTUlQU182NCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzMzJfNjRiaXRfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU182NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFRoZSByZWxvYyB1c2VkIGZvciB0aGUgbWlwczE2IGp1bXAgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHMxNl9qdW1wX2hvd3RvID0KLSAgSE9XVE8gKFJfTUlQUzE2XzI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKLQkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKLQkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KLQkgbWlwczE2X2p1bXBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQUzE2XzI2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFRoZSByZWxvYyB1c2VkIGZvciB0aGUgbWlwczE2IGdwcmVsIGluc3RydWN0aW9uLiAgVGhlIHNyY19tYXNrIGFuZAotICAgZHNrX21hc2sgZm9yIHRoaXMgaG93dG8gZG8gbm90IHJlZmxlY3QgdGhlIGFjdHVhbCBpbnN0cnVjdGlvbiwgaW4KLSAgIHdoaWNoIHRoZSB2YWx1ZSBpcyBub3QgY29udGlndW91czsgdGhlIG1hc2tzIGFyZSBmb3IgdGhlCi0gICBjb252ZW5pZW5jZSBvZiB0aGUgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9taXBzMTZfZ3ByZWxfaG93dG8gPQotICBIT1dUTyAoUl9NSVBTMTZfR1BSRUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzMTZfZ3ByZWxfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQUzE2X0dQUkVMIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotCi0vKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHNfZ251X3Z0aW5oZXJpdF9ob3d0byA9Ci0gIEhPV1RPIChSX01JUFNfR05VX1ZUSU5IRVJJVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0byA9Ci0gIEhPV1RPIChSX01JUFNfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR05VX1ZURU5UUlkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIERvIGEgUl9NSVBTX0hJMTYgcmVsb2NhdGlvbi4gIFRoaXMgaGFzIHRvIGJlIGRvbmUgaW4gY29tYmluYXRpb24KLSAgIHdpdGggYSBSX01JUFNfTE8xNiByZWxvYywgYmVjYXVzZSB0aGVyZSBpcyBhIGNhcnJ5IGZyb20gdGhlIExPMTYgdG8KLSAgIHRoZSBISTE2LiAgSGVyZSB3ZSBqdXN0IHNhdmUgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQ7IHdlIGRvIHRoZQotICAgYWN0dWFsIHJlbG9jYXRpb24gd2hlbiB3ZSBzZWUgdGhlIExPMTYuICBNSVBTIEVMRiByZXF1aXJlcyB0aGF0IHRoZQotICAgTE8xNiBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIEhJMTYuICBBcyBhIEdOVSBleHRlbnNpb24sIHdlIHBlcm1pdCBhbgotICAgYXJiaXRyYXJ5IG51bWJlciBvZiBISTE2IHJlbG9jcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgTE8xNgotICAgcmVsb2MuICBUaGlzIGV4dGVuc2lvbiBwZXJtaXRzIGdjYyB0byBvdXRwdXQgdGhlIEhJIGFuZCBMTyByZWxvY3MKLSAgIGl0c2VsZi4gICovCi0KLXN0cnVjdCBtaXBzX2hpMTYKLXsKLSAgc3RydWN0IG1pcHNfaGkxNiAqbmV4dDsKLSAgYmZkX2J5dGUgKmFkZHI7Ci0gIGJmZF92bWEgYWRkZW5kOwotfTsKLQotLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBhIHN0YXRpYyB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19oaTE2ICptaXBzX2hpMTZfbGlzdDsKLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MgKGFiZmQsCi0JCSAgICAgcmVsb2NfZW50cnksCi0JCSAgICAgc3ltYm9sLAotCQkgICAgIGRhdGEsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLAotCQkgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHN0cnVjdCBtaXBzX2hpMTYgKm47Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSBkb24ndCB3YW50Ci0gICAgIHRvIGNoYW5nZSBhbnl0aGluZy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgcmV0ID0gYmZkX3JlbG9jX29rOwotCi0gIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksICJfZ3BfZGlzcCIpID09IDApCi0gICAgewotICAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgICBiZmRfdm1hIGdwOwotCi0gICAgICBpZiAocmV0ID09IGJmZF9yZWxvY191bmRlZmluZWQpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0JcmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgICAgIGVsc2UKLQl7Ci0JICByZWxvY2F0ZWFibGUgPSBmYWxzZTsKLQkgIG91dHB1dF9iZmQgPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lcjsKLQl9Ci0KLSAgICAgIHJldCA9IG1pcHNfZWxmX2ZpbmFsX2dwIChvdXRwdXRfYmZkLCBzeW1ib2wsIHJlbG9jYXRlYWJsZSwKLQkJCSAgICAgICBlcnJvcl9tZXNzYWdlLCAmZ3ApOwotICAgICAgaWYgKHJldCAhPSBiZmRfcmVsb2Nfb2spCi0JcmV0dXJuIHJldDsKLQotICAgICAgcmVsb2NhdGlvbiA9IGdwIC0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotCSAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0JcmV0ID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQlyZWxvY2F0aW9uID0gMDsKLSAgICAgIGVsc2UKLQlyZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLSAgICB9Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBTYXZlIHRoZSBpbmZvcm1hdGlvbiwgYW5kIGxldCBMTzE2IGRvIHRoZSBhY3R1YWwgcmVsb2NhdGlvbi4gICovCi0gIG4gPSAoc3RydWN0IG1pcHNfaGkxNiAqKSBiZmRfbWFsbG9jIChzaXplb2YgKm4pOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgbi0+YWRkciA9IChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIG4tPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gIG4tPm5leHQgPSBtaXBzX2hpMTZfbGlzdDsKLSAgbWlwc19oaTE2X2xpc3QgPSBuOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIERvIGEgUl9NSVBTX0xPMTYgcmVsb2NhdGlvbi4gIFRoaXMgaXMgYSBzdHJhaWdodGZvcndhcmQgMTYgYml0Ci0gICBpbnBsYWNlIHJlbG9jYXRpb247IHRoaXMgZnVuY3Rpb24gZXhpc3RzIGluIG9yZGVyIHRvIGRvIHRoZQotICAgUl9NSVBTX0hJMTYgcmVsb2NhdGlvbiBkZXNjcmliZWQgYWJvdmUuICAqLwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYyAoYWJmZCwKLQkJICAgICByZWxvY19lbnRyeSwKLQkJICAgICBzeW1ib2wsCi0JCSAgICAgZGF0YSwKLQkJICAgICBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsCi0JCSAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGFyZWxlbnQgZ3BfZGlzcF9yZWxlbnQ7Ci0KLSAgaWYgKG1pcHNfaGkxNl9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG1pcHNfaGkxNiAqbDsKLQotICAgICAgbCA9IG1pcHNfaGkxNl9saXN0OwotICAgICAgd2hpbGUgKGwgIT0gTlVMTCkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluc247Ci0JICB1bnNpZ25lZCBsb25nIHZhbDsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsbG87Ci0JICBzdHJ1Y3QgbWlwc19oaTE2ICpuZXh0OwotCi0JICAvKiBEbyB0aGUgSEkxNiByZWxvY2F0aW9uLiAgTm90ZSB0aGF0IHdlIGFjdHVhbGx5IGRvbid0IG5lZWQKLQkgICAgIHRvIGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIExPMTYgaXRzZWxmLCBleGNlcHQgd2hlcmUgdG8KLQkgICAgIGZpbmQgdGhlIGxvdyAxNiBiaXRzIG9mIHRoZSBhZGRlbmQgbmVlZGVkIGJ5IHRoZSBMTzE2LiAgKi8KLQkgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBsLT5hZGRyKTsKLQkgIHZhbGxvID0gKGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpCi0JCSAgICYgMHhmZmZmKTsKLQkgIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgdmFsbG87Ci0JICB2YWwgKz0gbC0+YWRkZW5kOwotCi0JICAvKiBUaGUgbG93IG9yZGVyIDE2IGJpdHMgYXJlIGFsd2F5cyB0cmVhdGVkIGFzIGEgc2lnbmVkCi0JICAgICB2YWx1ZS4gIFRoZXJlZm9yZSwgYSBuZWdhdGl2ZSB2YWx1ZSBpbiB0aGUgbG93IG9yZGVyIGJpdHMKLQkgICAgIHJlcXVpcmVzIGFuIGFkanVzdG1lbnQgaW4gdGhlIGhpZ2ggb3JkZXIgYml0cy4gIFdlIG5lZWQKLQkgICAgIHRvIG1ha2UgdGhpcyBhZGp1c3RtZW50IGluIHR3byB3YXlzOiBvbmNlIGZvciB0aGUgYml0cyB3ZQotCSAgICAgdG9vayBmcm9tIHRoZSBkYXRhLCBhbmQgb25jZSBmb3IgdGhlIGJpdHMgd2UgYXJlIHB1dHRpbmcKLQkgICAgIGJhY2sgaW4gdG8gdGhlIGRhdGEuICAqLwotCSAgaWYgKCh2YWxsbyAmIDB4ODAwMCkgIT0gMCkKLQkgICAgdmFsIC09IDB4MTAwMDA7Ci0JICBpZiAoKHZhbCAmIDB4ODAwMCkgIT0gMCkKLQkgICAgdmFsICs9IDB4MTAwMDA7Ci0KLQkgIGluc24gPSAoaW5zbiAmfiAweGZmZmYpIHwgKCh2YWwgPj4gMTYpICYgMHhmZmZmKTsKLQkgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGwtPmFkZHIpOwotCi0JICBpZiAoc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLCAiX2dwX2Rpc3AiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgZ3BfZGlzcF9yZWxlbnQgPSAqcmVsb2NfZW50cnk7Ci0JICAgICAgcmVsb2NfZW50cnkgPSAmZ3BfZGlzcF9yZWxlbnQ7Ci0JICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IGwtPmFkZGVuZDsKLQkgICAgfQotCi0JICBuZXh0ID0gbC0+bmV4dDsKLQkgIGZyZWUgKGwpOwotCSAgbCA9IG5leHQ7Ci0JfQotCi0gICAgICBtaXBzX2hpMTZfbGlzdCA9IE5VTEw7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksICJfZ3BfZGlzcCIpID09IDApCi0gICAgewotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgICAgIGJmZF92bWEgZ3AsIHJlbG9jYXRpb247Ci0KLSAgICAgIC8qIEZJWE1FOiBEb2VzIHRoaXMgY2FzZSBldmVyIG9jY3VyPyAgKi8KLQotICAgICAgcmV0ID0gbWlwc19lbGZfZmluYWxfZ3AgKG91dHB1dF9iZmQsIHN5bWJvbCwgdHJ1ZSwgZXJyb3JfbWVzc2FnZSwgJmdwKTsKLSAgICAgIGlmIChyZXQgIT0gYmZkX3JlbG9jX29rKQotCXJldHVybiByZXQ7Ci0KLSAgICAgIHJlbG9jYXRpb24gPSBncCAtIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICAgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICAgICAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAgICAgZ3BfZGlzcF9yZWxlbnQgPSAqcmVsb2NfZW50cnk7Ci0gICAgICByZWxvY19lbnRyeSA9ICZncF9kaXNwX3JlbGVudDsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uIC0gNDsKLSAgICB9Ci0KLSAgLyogTm93IGRvIHRoZSBMTzE2IHJlbG9jIGluIHRoZSB1c3VhbCB3YXkuICAqLwotICByZXR1cm4gYmZkX2VsZl9nZW5lcmljX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJCWlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotfQotCi0vKiBEbyBhIFJfTUlQU19HT1QxNiByZWxvYy4gIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSBnbG9iYWwgb2Zmc2V0Ci0gICB0YWJsZSB1c2VkIGZvciBQSUMgY29kZS4gIElmIHRoZSBzeW1ib2wgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLCB0aGUKLSAgIGluc3RydWN0aW9uIGlzIG1vZGlmaWVkIHRvIGNvbnRhaW4gdGhlIG9mZnNldCBvZiB0aGUgYXBwcm9wcmlhdGUKLSAgIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgSWYgdGhlIHN5bWJvbCBpcyBhIHNlY3Rpb24KLSAgIHN5bWJvbCwgdGhlIG5leHQgcmVsb2MgaXMgYSBSX01JUFNfTE8xNiByZWxvYy4gIFRoZSB0d28gMTYgYml0Ci0gICBhZGRlbmRzIGFyZSBjb21iaW5lZCB0byBmb3JtIHRoZSByZWFsIGFkZGVuZCBhZ2FpbnN0IHRoZSBzZWN0aW9uCi0gICBzeW1ib2w7IHRoZSBHT1QxNiBpcyBtb2RpZmllZCB0byBjb250YWluIHRoZSBvZmZzZXQgb2YgYW4gZW50cnkgaW4KLSAgIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBhbmQgdGhlIExPMTYgaXMgbW9kaWZpZWQgdG8gb2Zmc2V0IGl0Ci0gICBhcHByb3ByaWF0ZWx5LiAgVGh1cyBhbiBvZmZzZXQgbGFyZ2VyIHRoYW4gMTYgYml0cyByZXF1aXJlcyBhCi0gICBtb2RpZmllZCB2YWx1ZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KLQotICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWZmaWNlcyBmb3IgdGhlIGFzc2VtYmxlciwgYnV0IHRoZSBsaW5rZXIgZG9lcwotICAgbm90IHlldCBrbm93IGhvdyB0byBjcmVhdGUgZ2xvYmFsIG9mZnNldCB0YWJsZXMuICAqLwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfbWlwc19lbGZfZ290MTZfcmVsb2MgKGFiZmQsCi0JCSAgICAgIHJlbG9jX2VudHJ5LAotCQkgICAgICBzeW1ib2wsCi0JCSAgICAgIGRhdGEsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIG91dHB1dF9iZmQsCi0JCSAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvbid0IHdhbnQKLSAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBpcyBhIGxvY2FsIHN5bWJvbCwgd2UgY2FuIGhhbmRsZSBpdAotICAgICBqdXN0IGxpa2UgSEkxNi4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgcmV0dXJuIF9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCQkgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotCi0gIGFib3J0ICgpOwotfQotCi0vKiBXZSBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlIGdwIHZhbHVlLCBzbyB0aGF0IHdlIGNhbiBhZGp1c3QgdGhlCi0gICBzeW1ib2wgdmFsdWUgY29ycmVjdGx5LiAgV2UgbG9vayB1cCB0aGUgc3ltYm9sIF9ncCBpbiB0aGUgb3V0cHV0Ci0gICBCRkQuICBJZiB3ZSBjYW4ndCBmaW5kIGl0LCB3ZSdyZSBzdHVjay4gIFdlIGNhY2hlIGl0IGluIHRoZSBFTEYKLSAgIHRhcmdldCBkYXRhLiAgV2UgZG9uJ3QgbmVlZCB0byBhZGp1c3QgdGhlIHN5bWJvbCB2YWx1ZSBmb3IgYW4KLSAgIGV4dGVybmFsIHN5bWJvbCBpZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCByZWxvY2F0ZWFibGUsIGVycm9yX21lc3NhZ2UsIHBncCkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLSAgICAgYmZkX3ZtYSAqcGdwOwotewotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiAhIHJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAqcGdwID0gMDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotICAgIH0KLQotICAqcGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoKnBncCA9PSAwCi0gICAgICAmJiAoISByZWxvY2F0ZWFibGUKLQkgIHx8IChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKSkKLSAgICB7Ci0gICAgICBpZiAocmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIE1ha2UgdXAgYSB2YWx1ZS4gICovCi0JICAqcGdwID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMHg0MDAwOwotCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsICpwZ3ApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0JICBhc3ltYm9sICoqc3ltOwotCSAgdW5zaWduZWQgaW50IGk7Ci0KLQkgIGNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCk7Ci0JICBzeW0gPSBiZmRfZ2V0X291dHN5bWJvbHMgKG91dHB1dF9iZmQpOwotCi0JICBpZiAoc3ltID09IChhc3ltYm9sICoqKSBOVUxMKQotCSAgICBpID0gY291bnQ7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgc3ltKyspCi0JCXsKLQkJICByZWdpc3RlciBDT05TVCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCpzeW0pOwotCQkgIGlmICgqbmFtZSA9PSAnXycgJiYgc3RyY21wIChuYW1lLCAiX2dwIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgKnBncCA9IGJmZF9hc3ltYm9sX3ZhbHVlICgqc3ltKTsKLQkJICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsICpwZ3ApOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmIChpID49IGNvdW50KQotCSAgICB7Ci0JICAgICAgLyogT25seSBnZXQgdGhlIGVycm9yIG9uY2UuICAqLwotCSAgICAgICpwZ3AgPSA0OwotCSAgICAgIF9iZmRfc2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkLCAqcGdwKTsKLQkgICAgICAqZXJyb3JfbWVzc2FnZSA9Ci0JCShjaGFyICopIF8oIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gd2hlbiBfZ3Agbm90IGRlZmluZWQiKTsKLQkgICAgICByZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogRG8gYSBSX01JUFNfR1BSRUwxNiByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIDE2IGJpdCB2YWx1ZSB3aGljaCBtdXN0Ci0gICBiZWNvbWUgdGhlIG9mZnNldCBmcm9tIHRoZSBncCByZWdpc3Rlci4gIFRoaXMgZnVuY3Rpb24gYWxzbyBoYW5kbGVzCi0gICBSX01JUFNfTElURVJBTCByZWxvY2F0aW9ucywgYWx0aG91Z2ggdGhvc2UgY2FuIGJlIGhhbmRsZWQgbW9yZQotICAgY2xldmVybHkgYmVjYXVzZSB0aGUgZW50cmllcyBpbiB0aGUgLmxpdDggYW5kIC5saXQ0IHNlY3Rpb25zIGNhbiBiZQotICAgbWVyZ2VkLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBncHJlbDE2X3dpdGhfZ3AgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJCSAgICAgIGFyZWxlbnQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJCSAgICAgIGJvb2xlYW4sIFBUUiwgYmZkX3ZtYSkpOwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIGdwOwotCi0gIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbCB3aXRoIG5vCi0gICAgIGFkZGVuZCwgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgYW55dGhpbmcuICBXZSB3aWxsIG9ubHkgaGF2ZSBhbgotICAgICBhZGRlbmQgaWYgdGhpcyBpcyBhIG5ld2x5IGNyZWF0ZWQgcmVsb2MsIG5vdCByZWFkIGZyb20gYW4gRUxGCi0gICAgIGZpbGUuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICByZWxvY2F0ZWFibGUgPSB0cnVlOwotICBlbHNlCi0gICAgewotICAgICAgcmVsb2NhdGVhYmxlID0gZmFsc2U7Ci0gICAgICBvdXRwdXRfYmZkID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+b3duZXI7Ci0gICAgfQotCi0gIHJldCA9IG1pcHNfZWxmX2ZpbmFsX2dwIChvdXRwdXRfYmZkLCBzeW1ib2wsIHJlbG9jYXRlYWJsZSwgZXJyb3JfbWVzc2FnZSwKLQkJCSAgICZncCk7Ci0gIGlmIChyZXQgIT0gYmZkX3JlbG9jX29rKQotICAgIHJldHVybiByZXQ7Ci0KLSAgcmV0dXJuIGdwcmVsMTZfd2l0aF9ncCAoYWJmZCwgc3ltYm9sLCByZWxvY19lbnRyeSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgcmVsb2NhdGVhYmxlLCBkYXRhLCBncCk7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWdwcmVsMTZfd2l0aF9ncCAoYWJmZCwgc3ltYm9sLCByZWxvY19lbnRyeSwgaW5wdXRfc2VjdGlvbiwgcmVsb2NhdGVhYmxlLCBkYXRhLAotCQkgZ3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBQVFIgZGF0YTsKLSAgICAgYmZkX3ZtYSBncDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgLyogU2V0IHZhbCB0byB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb3Igc3ltYm9sLiAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5ob3d0by0+c3JjX21hc2sgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGNhc2Ugb2NjdXJzIHdpdGggdGhlIDY0LWJpdCBNSVBTIEVMRiBBQkkuICAqLwotICAgICAgdmFsID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgPSAoKGluc24gJiAweGZmZmYpICsgcmVsb2NfZW50cnktPmFkZGVuZCkgJiAweGZmZmY7Ci0gICAgICBpZiAodmFsICYgMHg4MDAwKQotCXZhbCAtPSAweDEwMDAwOwotICAgIH0KLQotICAvKiBBZGp1c3QgdmFsIGZvciB0aGUgZmluYWwgc2VjdGlvbiBsb2NhdGlvbiBhbmQgR1AgdmFsdWUuICBJZiB3ZQotICAgICBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBmb3IKLSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLSAgaWYgKCEgcmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICB2YWwgKz0gcmVsb2NhdGlvbiAtIGdwOwotCi0gIGluc24gPSAoaW5zbiAmfiAweGZmZmYpIHwgKHZhbCAmIDB4ZmZmZik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIGlmIChyZWxvY2F0ZWFibGUpCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAvKiBNYWtlIHN1cmUgaXQgZml0IGluIDE2IGJpdHMuICAqLwotICBpZiAodmFsID49IDB4ODAwMCAmJiB2YWwgPCAweGZmZmY4MDAwKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogRG8gYSBSX01JUFNfR1BSRUwzMiByZWxvY2F0aW9uLiAgSXMgdGhpcyAzMiBiaXQgdmFsdWUgdGhlIG9mZnNldAotICAgZnJvbSB0aGUgZ3AgcmVnaXN0ZXI/IFhYWCAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGdwcmVsMzJfd2l0aF9ncCBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAotCQkJCQkJICAgICAgYXJlbGVudCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJICAgICAgYm9vbGVhbiwgUFRSLCBiZmRfdm1hKSk7Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jIChhYmZkLAotCQkJcmVsb2NfZW50cnksCi0JCQlzeW1ib2wsCi0JCQlkYXRhLAotCQkJaW5wdXRfc2VjdGlvbiwKLQkJCW91dHB1dF9iZmQsCi0JCQllcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgZ3A7Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8KLSAgICAgYWRkZW5kLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZy4gIFdlIHdpbGwgb25seSBoYXZlIGFuCi0gICAgIGFkZGVuZCBpZiB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCByZWxvYywgbm90IHJlYWQgZnJvbSBhbiBFTEYKLSAgICAgZmlsZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopCi0JXygiMzJiaXRzIGdwIHJlbGF0aXZlIHJlbG9jYXRpb24gb2NjdXJzIGZvciBhbiBleHRlcm5hbCBzeW1ib2wiKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlbG9jYXRlYWJsZSA9IHRydWU7Ci0gICAgICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxvY2F0ZWFibGUgPSBmYWxzZTsKLSAgICAgIG91dHB1dF9iZmQgPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lcjsKLQotICAgICAgcmV0ID0gbWlwc19lbGZfZmluYWxfZ3AgKG91dHB1dF9iZmQsIHN5bWJvbCwgcmVsb2NhdGVhYmxlLAotCQkJICAgICAgIGVycm9yX21lc3NhZ2UsICZncCk7Ci0gICAgICBpZiAocmV0ICE9IGJmZF9yZWxvY19vaykKLQlyZXR1cm4gcmV0OwotICAgIH0KLQotICByZXR1cm4gZ3ByZWwzMl93aXRoX2dwIChhYmZkLCBzeW1ib2wsIHJlbG9jX2VudHJ5LCBpbnB1dF9zZWN0aW9uLAotCQkJICByZWxvY2F0ZWFibGUsIGRhdGEsIGdwKTsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZ3ByZWwzMl93aXRoX2dwIChhYmZkLCBzeW1ib2wsIHJlbG9jX2VudHJ5LCBpbnB1dF9zZWN0aW9uLCByZWxvY2F0ZWFibGUsIGRhdGEsCi0JCSBncCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIFBUUiBkYXRhOwotICAgICBiZmRfdm1hIGdwOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICBpZiAocmVsb2NfZW50cnktPmhvd3RvLT5zcmNfbWFzayA9PSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgY2FzZSBhcmlzZXMgd2l0aCB0aGUgNjQtYml0IE1JUFMgRUxGIEFCSS4gICovCi0gICAgICB2YWwgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIC8qIFNldCB2YWwgdG8gdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9yIHN5bWJvbC4gICovCi0gIHZhbCArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIC8qIEFkanVzdCB2YWwgZm9yIHRoZSBmaW5hbCBzZWN0aW9uIGxvY2F0aW9uIGFuZCBHUCB2YWx1ZS4gIElmIHdlCi0gICAgIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgd2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzIGZvcgotICAgICBhbiBleHRlcm5hbCBzeW1ib2wuICAqLwotICBpZiAoISByZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotICAgIHZhbCArPSByZWxvY2F0aW9uIC0gZ3A7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAocmVsb2NhdGVhYmxlKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogSGFuZGxlIGEgNjQgYml0IHJlbG9jIGluIGEgMzIgYml0IE1JUFMgRUxGIGZpbGUuICBUaGVzZSBhcmUKLSAgIGdlbmVyYXRlZCB3aGVuIGFkZHJlc2VzIGFyZSA2NCBiaXRzLiAgVGhlIHVwcGVyIDMyIGJpdHMgYXJlIGEgc2ltbGUKLSAgIHNpZ24gZXh0ZW5zaW9uLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwczMyXzY0Yml0X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotICBhcmVsZW50IHJlbG9jMzI7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotICBiZmRfc2l6ZV90eXBlIGFkZHI7Ci0KLSAgciA9IGJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci0gIGlmIChyICE9IGJmZF9yZWxvY19jb250aW51ZSkKLSAgICByZXR1cm4gcjsKLQotICAvKiBEbyBhIG5vcm1hbCAzMiBiaXQgcmVsb2NhdGlvbiBvbiB0aGUgbG93ZXIgMzIgYml0cy4gICovCi0gIHJlbG9jMzIgPSAqcmVsb2NfZW50cnk7Ci0gIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgcmVsb2MzMi5hZGRyZXNzICs9IDQ7Ci0gIHJlbG9jMzIuaG93dG8gPSAmZWxmX21pcHNfaG93dG9fdGFibGVbUl9NSVBTXzMyXTsKLSAgciA9IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGFiZmQsICZyZWxvYzMyLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci0KLSAgLyogU2lnbiBleHRlbmQgaW50byB0aGUgdXBwZXIgMzIgYml0cy4gICovCi0gIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2MzMi5hZGRyZXNzKTsKLSAgaWYgKCh2YWwgJiAweDgwMDAwMDAwKSAhPSAwKQotICAgIHZhbCA9IDB4ZmZmZmZmZmY7Ci0gIGVsc2UKLSAgICB2YWwgPSAwOwotICBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCi0gICAgYWRkciArPSA0OwotICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIEhhbmRsZSBhIG1pcHMxNiBqdW1wLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwczE2X2p1bXBfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIEZJWE1FLiAgKi8KLSAgewotICAgIHN0YXRpYyBib29sZWFuIHdhcm5lZDsKLQotICAgIGlmICghIHdhcm5lZCkKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCJMaW5raW5nIG1pcHMxNiBvYmplY3RzIGludG8gJXMgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQiKSwKLQkgYmZkX2dldF90YXJnZXQgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lcikpOwotICAgIHdhcm5lZCA9IHRydWU7Ci0gIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLX0KLQotLyogSGFuZGxlIGEgbWlwczE2IEdQIHJlbGF0aXZlIHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwczE2X2dwcmVsX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIGdwOwotICB1bnNpZ25lZCBzaG9ydCBleHRlbmQsIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgZmluYWw7Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8KLSAgICAgYWRkZW5kLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZy4gIFdlIHdpbGwgb25seSBoYXZlIGFuCi0gICAgIGFkZGVuZCBpZiB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCByZWxvYywgbm90IHJlYWQgZnJvbSBhbiBFTEYKLSAgICAgZmlsZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgcmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOwotICAgICAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotICAgIH0KLQotICByZXQgPSBtaXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCByZWxvY2F0ZWFibGUsIGVycm9yX21lc3NhZ2UsCi0JCQkgICAmZ3ApOwotICBpZiAocmV0ICE9IGJmZF9yZWxvY19vaykKLSAgICByZXR1cm4gcmV0OwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogUGljayB1cCB0aGUgbWlwczE2IGV4dGVuZCBpbnN0cnVjdGlvbiBhbmQgdGhlIHJlYWwgaW5zdHJ1Y3Rpb24uICAqLwotICBleHRlbmQgPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MgKyAyKTsKLQotICAvKiBTdHVmZiB0aGUgY3VycmVudCBhZGRlbmQgYmFjayBhcyBhIDMyIGJpdCB2YWx1ZSwgZG8gdGhlIHVzdWFsCi0gICAgIHJlbG9jYXRpb24sIGFuZCB0aGVuIGNsZWFuIHVwLiAgKi8KLSAgYmZkX3B1dF8zMiAoYWJmZCwKLQkgICAgICAoKChleHRlbmQgJiAweDFmKSA8PCAxMSkKLQkgICAgICAgfCAoZXh0ZW5kICYgMHg3ZTApCi0JICAgICAgIHwgKGluc24gJiAweDFmKSksCi0JICAgICAgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgcmV0ID0gZ3ByZWwxNl93aXRoX2dwIChhYmZkLCBzeW1ib2wsIHJlbG9jX2VudHJ5LCBpbnB1dF9zZWN0aW9uLAotCQkJIHJlbG9jYXRlYWJsZSwgZGF0YSwgZ3ApOwotCi0gIGZpbmFsID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsCi0JICAgICAgKChleHRlbmQgJiAweGY4MDApCi0JICAgICAgIHwgKChmaW5hbCA+PiAxMSkgJiAweDFmKQotCSAgICAgICB8IChmaW5hbCAmIDB4N2UwKSksCi0JICAgICAgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsCi0JICAgICAgKChpbnNuICYgMHhmZmUwKQotCSAgICAgICB8IChmaW5hbCAmIDB4MWYpKSwKLQkgICAgICAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzICsgMik7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUmV0dXJuIHRoZSBJU0EgZm9yIGEgTUlQUyBlX2ZsYWdzIHZhbHVlLiAgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWVsZl9taXBzX2lzYSAoZmxhZ3MpCi0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBzd2l0Y2ggKGZsYWdzICYgRUZfTUlQU19BUkNIKQotICAgIHsKLSAgICBjYXNlIEVfTUlQU19BUkNIXzE6Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIEVfTUlQU19BUkNIXzI6Ci0gICAgICByZXR1cm4gMjsKLSAgICBjYXNlIEVfTUlQU19BUkNIXzM6Ci0gICAgICByZXR1cm4gMzsKLSAgICBjYXNlIEVfTUlQU19BUkNIXzQ6Ci0gICAgICByZXR1cm4gNDsKLSAgICB9Ci0gIHJldHVybiA0OwotfQotCi0vKiBSZXR1cm4gdGhlIE1BQ0ggZm9yIGEgTUlQUyBlX2ZsYWdzIHZhbHVlLiAgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWVsZl9taXBzX21hY2ggKGZsYWdzKQotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgc3dpdGNoIChmbGFncyAmIEVGX01JUFNfTUFDSCkKLSAgICB7Ci0gICAgY2FzZSBFX01JUFNfTUFDSF8zOTAwOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHMzOTAwOwotCi0gICAgY2FzZSBFX01JUFNfTUFDSF80MDEwOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHM0MDEwOwotCi0gICAgY2FzZSBFX01JUFNfTUFDSF80MTAwOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHM0MTAwOwotCi0gICAgY2FzZSBFX01JUFNfTUFDSF80MTExOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHM0MTExOwotCi0gICAgY2FzZSBFX01JUFNfTUFDSF80NjUwOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHM0NjUwOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHN3aXRjaCAoZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBFX01JUFNfQVJDSF8xOgotCSAgcmV0dXJuIGJmZF9tYWNoX21pcHMzMDAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfTUlQU19BUkNIXzI6Ci0JICByZXR1cm4gYmZkX21hY2hfbWlwczYwMDA7Ci0JICBicmVhazsKLQotCWNhc2UgRV9NSVBTX0FSQ0hfMzoKLQkgIHJldHVybiBiZmRfbWFjaF9taXBzNDAwMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX01JUFNfQVJDSF80OgotCSAgcmV0dXJuIGJmZF9tYWNoX21pcHM4MDAwOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIHByaW50YWJsZSBuYW1lIGZvciBBQkkgZnJvbSBmbGFnd29yZC4gKi8KLQotc3RhdGljIElOTElORSBjaGFyKgotZWxmX21pcHNfYWJpX25hbWUgKGZsYWdzKQotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgc3dpdGNoIChmbGFncyAmIEVGX01JUFNfQUJJKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICByZXR1cm4gIm5vbmUiOwotICAgIGNhc2UgRV9NSVBTX0FCSV9PMzI6Ci0gICAgICByZXR1cm4gIk8zMiI7Ci0gICAgY2FzZSBFX01JUFNfQUJJX082NDoKLSAgICAgIHJldHVybiAiTzY0IjsKLSAgICBjYXNlIEVfTUlQU19BQklfRUFCSTMyOgotICAgICAgcmV0dXJuICJFQUJJMzIiOwotICAgIGNhc2UgRV9NSVBTX0FCSV9FQUJJNjQ6Ci0gICAgICByZXR1cm4gIkVBQkk2NCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAidW5rbm93biBhYmkiOwotICAgIH0KLX0KLQotLyogQSBtYXBwaW5nIGZyb20gQkZEIHJlbG9jIHR5cGVzIHRvIE1JUFMgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IGVsZl9yZWxvY19tYXAgewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgZW51bSBlbGZfbWlwc19yZWxvY190eXBlIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGVsZl9yZWxvY19tYXAgbWlwc19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfTUlQU19OT05FLCB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl9NSVBTXzE2IH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX01JUFNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfNjQsIFJfTUlQU182NCB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0pNUCwgUl9NSVBTXzI2IH0sCi0gIHsgQkZEX1JFTE9DX0hJMTZfUywgUl9NSVBTX0hJMTYgfSwKLSAgeyBCRkRfUkVMT0NfTE8xNiwgUl9NSVBTX0xPMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HUFJFTCwgUl9NSVBTX0dQUkVMMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19MSVRFUkFMLCBSX01JUFNfTElURVJBTCB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBSX01JUFNfR09UMTYgfSwKLSAgeyBCRkRfUkVMT0NfMTZfUENSRUwsIFJfTUlQU19QQzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTDE2LCBSX01JUFNfQ0FMTDE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR1BSRUwzMiwgUl9NSVBTX0dQUkVMMzIgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNiwgUl9NSVBTX0dPVF9ISTE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsIFJfTUlQU19HT1RfTE8xNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNiwgUl9NSVBTX0NBTExfSEkxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNiwgUl9NSVBTX0NBTExfTE8xNiB9Ci19OwotCi0vKiBHaXZlbiBhIEJGRCByZWxvYyB0eXBlLCByZXR1cm4gYSBob3d0byBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChtaXBzX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChtaXBzX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZlbGZfbWlwc19ob3d0b190YWJsZVsoaW50KSBtaXBzX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICAvKiBXZSBuZWVkIHRvIGhhbmRsZSBCRkRfUkVMT0NfQ1RPUiBzcGVjaWFsbHkuCi0JIFNlbGVjdCB0aGUgcmlnaHQgcmVsb2NhdGlvbiAoUl9NSVBTXzMyIG9yIFJfTUlQU182NCkgYmFzZWQgb24gdGhlCi0JIHNpemUgb2YgYWRkcmVzc2VzIG9uIHRoaXMgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgICAgIGlmIChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChhYmZkKSA9PSAzMikKLQlyZXR1cm4gJmVsZl9taXBzX2hvd3RvX3RhYmxlWyhpbnQpIFJfTUlQU18zMl07Ci0gICAgICBlbHNlCi0JcmV0dXJuICZlbGZfbWlwc19jdG9yNjRfaG93dG87Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTMTZfSk1QOgotICAgICAgcmV0dXJuICZlbGZfbWlwczE2X2p1bXBfaG93dG87Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQUzE2X0dQUkVMOgotICAgICAgcmV0dXJuICZlbGZfbWlwczE2X2dwcmVsX2hvd3RvOwotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgICAgcmV0dXJuICZlbGZfbWlwc19nbnVfdnRpbmhlcml0X2hvd3RvOwotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIHJldHVybiAmZWxmX21pcHNfZ251X3Z0ZW50cnlfaG93dG87Ci0gICAgfQotfQotCi0vKiBHaXZlbiBhIE1JUFMgcmVsb2MgdHlwZSwgZmlsbCBpbiBhbiBhcmVsZW50IHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX01JUFMxNl8yNjoKLSAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX21pcHMxNl9qdW1wX2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01JUFMxNl9HUFJFTDoKLSAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX21pcHMxNl9ncHJlbF9ob3d0bzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NSVBTX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9taXBzX2dudV92dGluaGVyaXRfaG93dG87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTUlQU19HTlVfVlRFTlRSWToKLSAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX21pcHNfZ251X3Z0ZW50cnlfaG93dG87Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX01JUFNfbWF4KTsKLSAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX21pcHNfaG93dG9fdGFibGVbcl90eXBlXTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBUaGUgYWRkZW5kIGZvciBhIEdQUkVMMTYgb3IgTElURVJBTCByZWxvY2F0aW9uIGNvbWVzIGZyb20gdGhlIEdQCi0gICAgIHZhbHVlIGZvciB0aGUgb2JqZWN0IGZpbGUuICBXZSBnZXQgdGhlIGFkZGVuZCBub3csIHJhdGhlciB0aGFuCi0gICAgIHdoZW4gd2UgZG8gdGhlIHJlbG9jYXRpb24sIGJlY2F1c2UgdGhlIHN5bWJvbCBtYW5pcHVsYXRpb25zIGRvbmUKLSAgICAgYnkgdGhlIGxpbmtlciBtYXkgY2F1c2UgdXMgdG8gbG9zZSB0cmFjayBvZiB0aGUgaW5wdXQgQkZELiAgKi8KLSAgaWYgKCgoKmNhY2hlX3B0ci0+c3ltX3B0cl9wdHIpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMAotICAgICAgJiYgKHJfdHlwZSA9PSAodW5zaWduZWQgaW50KSBSX01JUFNfR1BSRUwxNgotCSAgfHwgcl90eXBlID09ICh1bnNpZ25lZCBpbnQpIFJfTUlQU19MSVRFUkFMKSkKLSAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGVsZl9ncCAoYWJmZCk7Ci19Ci0MCi0vKiBBIC5yZWdpbmZvIHNlY3Rpb24gaG9sZHMgYSBzaW5nbGUgRWxmMzJfUmVnSW5mbyBzdHJ1Y3R1cmUuICBUaGVzZQotICAgcm91dGluZXMgc3dhcCB0aGlzIHN0cnVjdHVyZSBpbiBhbmQgb3V0LiAgVGhleSBhcmUgdXNlZCBvdXRzaWRlIG9mCi0gICBCRkQsIHNvIHRoZXkgYXJlIGdsb2JhbGx5IHZpc2libGUuICAqLwotCi12b2lkCi1iZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9faW4gKGFiZmQsIGV4LCBpbikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvICpleDsKLSAgICAgRWxmMzJfUmVnSW5mbyAqaW47Ci17Ci0gIGluLT5yaV9ncHJtYXNrID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2dwcm1hc2spOwotICBpbi0+cmlfY3BybWFza1swXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzBdKTsKLSAgaW4tPnJpX2Nwcm1hc2tbMV0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1sxXSk7Ci0gIGluLT5yaV9jcHJtYXNrWzJdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMl0pOwotICBpbi0+cmlfY3BybWFza1szXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzNdKTsKLSAgaW4tPnJpX2dwX3ZhbHVlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2dwX3ZhbHVlKTsKLX0KLQotdm9pZAotYmZkX21pcHNfZWxmMzJfc3dhcF9yZWdpbmZvX291dCAoYWJmZCwgaW4sIGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjMyX1JlZ0luZm8gKmluOwotICAgICBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvICpleDsKLXsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2dwcm1hc2ssCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfZ3BybWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzBdLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMF0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1sxXSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzFdKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbMl0sCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1syXSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzNdLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbM10pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfZ3BfdmFsdWUsCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfZ3BfdmFsdWUpOwotfQotCi0vKiBJbiB0aGUgNjQgYml0IEFCSSwgdGhlIC5NSVBTLm9wdGlvbnMgc2VjdGlvbiBob2xkcyByZWdpc3RlcgotICAgaW5mb3JtYXRpb24gaW4gYW4gRWxmNjRfUmVnaW5mbyBzdHJ1Y3R1cmUuICBUaGVzZSByb3V0aW5lcyBzd2FwCi0gICB0aGVtIGluIGFuZCBvdXQuICBUaGV5IGFyZSBnbG9iYWxseSB2aXNpYmxlIGJlY2F1c2UgdGhleSBhcmUgdXNlZAotICAgb3V0c2lkZSBvZiBCRkQuICBUaGVzZSByb3V0aW5lcyBhcmUgaGVyZSBzbyB0aGF0IGdhcyBjYW4gY2FsbCB0aGVtCi0gICB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IHdoZXRoZXIgdGhlIDY0IGJpdCBBQkkgaGFzIGJlZW4gaW5jbHVkZWQuICAqLwotCi12b2lkCi1iZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9faW4gKGFiZmQsIGV4LCBpbikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvICpleDsKLSAgICAgRWxmNjRfSW50ZXJuYWxfUmVnSW5mbyAqaW47Ci17Ci0gIGluLT5yaV9ncHJtYXNrID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2dwcm1hc2spOwotICBpbi0+cmlfcGFkID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX3BhZCk7Ci0gIGluLT5yaV9jcHJtYXNrWzBdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMF0pOwotICBpbi0+cmlfY3BybWFza1sxXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzFdKTsKLSAgaW4tPnJpX2Nwcm1hc2tbMl0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1syXSk7Ci0gIGluLT5yaV9jcHJtYXNrWzNdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbM10pOwotICBpbi0+cmlfZ3BfdmFsdWUgPSBiZmRfaF9nZXRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfZ3BfdmFsdWUpOwotfQotCi12b2lkCi1iZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9fb3V0IChhYmZkLCBpbiwgZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmNjRfSW50ZXJuYWxfUmVnSW5mbyAqaW47Ci0gICAgIEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKmV4OwotewotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfZ3BybWFzaywKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9ncHJtYXNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX3BhZCwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9wYWQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1swXSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzBdKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbMV0sCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1sxXSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzJdLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMl0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1szXSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzNdKTsKLSAgYmZkX2hfcHV0XzY0IChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2dwX3ZhbHVlLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2dwX3ZhbHVlKTsKLX0KLQotLyogU3dhcCBhbiBlbnRyeSBpbiBhIC5ncHRhYiBzZWN0aW9uLiAgTm90ZSB0aGF0IHRoZXNlIHJvdXRpbmVzIHJlbHkKLSAgIG9uIHRoZSBlcXVpdmFsZW5jZSBvZiB0aGUgdHdvIGVsZW1lbnRzIG9mIHRoZSB1bmlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1iZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX2luIChhYmZkLCBleCwgaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKmV4OwotICAgICBFbGYzMl9ncHRhYiAqaW47Ci17Ci0gIGluLT5ndF9lbnRyeS5ndF9nX3ZhbHVlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleC0+Z3RfZW50cnkuZ3RfZ192YWx1ZSk7Ci0gIGluLT5ndF9lbnRyeS5ndF9ieXRlcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXgtPmd0X2VudHJ5Lmd0X2J5dGVzKTsKLX0KLQotc3RhdGljIHZvaWQKLWJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfb3V0IChhYmZkLCBpbiwgZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmMzJfZ3B0YWIgKmluOwotICAgICBFbGYzMl9FeHRlcm5hbF9ncHRhYiAqZXg7Ci17Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5ndF9lbnRyeS5ndF9nX3ZhbHVlLAotCQlleC0+Z3RfZW50cnkuZ3RfZ192YWx1ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5ndF9lbnRyeS5ndF9ieXRlcywKLQkJZXgtPmd0X2VudHJ5Lmd0X2J5dGVzKTsKLX0KLQotc3RhdGljIHZvaWQKLWJmZF9lbGYzMl9zd2FwX2NvbXBhY3RfcmVsX291dCAoYWJmZCwgaW4sIGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjMyX2NvbXBhY3RfcmVsICppbjsKLSAgICAgRWxmMzJfRXh0ZXJuYWxfY29tcGFjdF9yZWwgKmV4OwotewotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+aWQxLCBleC0+aWQxKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPm51bSwgZXgtPm51bSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5pZDIsIGV4LT5pZDIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+b2Zmc2V0LCBleC0+b2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJlc2VydmVkMCwgZXgtPnJlc2VydmVkMCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yZXNlcnZlZDEsIGV4LT5yZXNlcnZlZDEpOwotfQotCi1zdGF0aWMgdm9pZAotYmZkX2VsZjMyX3N3YXBfY3JpbmZvX291dCAoYWJmZCwgaW4sIGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjMyX2NyaW5mbyAqaW47Ci0gICAgIEVsZjMyX0V4dGVybmFsX2NyaW5mbyAqZXg7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgbDsKLQotICBsID0gKCgoaW4tPmN0eXBlICYgQ1JJTkZPX0NUWVBFKSA8PCBDUklORk9fQ1RZUEVfU0gpCi0gICAgICAgfCAoKGluLT5ydHlwZSAmIENSSU5GT19SVFlQRSkgPDwgQ1JJTkZPX1JUWVBFX1NIKQotICAgICAgIHwgKChpbi0+ZGlzdDJ0byAmIENSSU5GT19ESVNUMlRPKSA8PCBDUklORk9fRElTVDJUT19TSCkKLSAgICAgICB8ICgoaW4tPnJlbHZhZGRyICYgQ1JJTkZPX1JFTFZBRERSKSA8PCBDUklORk9fUkVMVkFERFJfU0gpKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgbCwgZXgtPmluZm8pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+a29uc3QsIGV4LT5rb25zdCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT52YWRkciwgZXgtPnZhZGRyKTsKLX0KLQotLyogU3dhcCBpbiBhbiBvcHRpb25zIGhlYWRlci4gICovCi0KLXZvaWQKLWJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4gKGFiZmQsIGV4LCBpbikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqZXg7Ci0gICAgIEVsZl9JbnRlcm5hbF9PcHRpb25zICppbjsKLXsKLSAgaW4tPmtpbmQgPSBiZmRfaF9nZXRfOCAoYWJmZCwgZXgtPmtpbmQpOwotICBpbi0+c2l6ZSA9IGJmZF9oX2dldF84IChhYmZkLCBleC0+c2l6ZSk7Ci0gIGluLT5zZWN0aW9uID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleC0+c2VjdGlvbik7Ci0gIGluLT5pbmZvID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleC0+aW5mbyk7Ci19Ci0KLS8qIFN3YXAgb3V0IGFuIG9wdGlvbnMgaGVhZGVyLiAgKi8KLQotdm9pZAotYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfT3B0aW9ucyAqaW47Ci0gICAgIEVsZl9FeHRlcm5hbF9PcHRpb25zICpleDsKLXsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIGluLT5raW5kLCBleC0+a2luZCk7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBpbi0+c2l6ZSwgZXgtPnNpemUpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT5zZWN0aW9uLCBleC0+c2VjdGlvbik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPmluZm8sIGV4LT5pbmZvKTsKLX0KLQwKLS8qIERldGVybWluZSB3aGV0aGVyIGEgc3ltYm9sIGlzIGdsb2JhbCBmb3IgdGhlIHB1cnBvc2VzIG9mIHNwbGl0dGluZwotICAgdGhlIHN5bWJvbCB0YWJsZSBpbnRvIGdsb2JhbCBzeW1ib2xzIGFuZCBsb2NhbCBzeW1ib2xzLiAgQXQgbGVhc3QKLSAgIG9uIElyaXggNSwgdGhpcyBzcGxpdCBtdXN0IGJlIGJldHdlZW4gc2VjdGlvbiBzeW1ib2xzIGFuZCBhbGwgb3RoZXIKLSAgIHN5bWJvbHMuICBPbiBtb3N0IEVMRiB0YXJnZXRzIHRoZSBzcGxpdCBpcyBiZXR3ZWVuIHN0YXRpYyBzeW1ib2xzCi0gICBhbmQgZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9zeW1faXNfZ2xvYmFsIChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICByZXR1cm4gKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAgPyB0cnVlIDogZmFsc2U7Ci19Ci0MCi0vKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyIGZvciBhIE1JUFMgRUxGIGZpbGUuICBUaGlzIGlzIHVzZWQgZm9yCi0gICBib3RoIHRoZSAzMi1iaXQgYW5kIHRoZSA2NC1iaXQgQUJJLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9taXBzLAotCQkJICAgICBlbGZfbWlwc19tYWNoIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncykpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlciBmb3IgYSAzMi1iaXQgTUlQUyBFTEYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZjMyX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIElyaXggNSBpcyBicm9rZW4uICBPYmplY3QgZmlsZSBzeW1ib2wgdGFibGVzIGFyZSBub3QgYWx3YXlzCi0gICAgIHNvcnRlZCBjb3JyZWN0bHkgc3VjaCB0aGF0IGxvY2FsIHN5bWJvbHMgcHJlY2VkZSBnbG9iYWwgc3ltYm9scywKLSAgICAgYW5kIHRoZSBzaF9pbmZvIGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUgaXMgbm90IGFsd2F5cyByaWdodC4gICovCi0gIGVsZl9iYWRfc3ltdGFiIChhYmZkKSA9IHRydWU7Ci0KLSAgcmV0dXJuIF9iZmRfbWlwc19lbGZfb2JqZWN0X3AgKGFiZmQpOwotfQotCi0vKiBUaGUgZmluYWwgcHJvY2Vzc2luZyBkb25lIGp1c3QgYmVmb3JlIHdyaXRpbmcgb3V0IGEgTUlQUyBFTEYgb2JqZWN0Ci0gICBmaWxlLiAgVGhpcyBnZXRzIHRoZSBNSVBTIGFyY2hpdGVjdHVyZSByaWdodCBiYXNlZCBvbiB0aGUgbWFjaGluZQotICAgbnVtYmVyLiAgVGhpcyBpcyB1c2VkIGJ5IGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICAqLwotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLV9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyOwotewotICB1bnNpZ25lZCBsb25nIHZhbDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaGRycHA7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX21hY2hfbWlwczMwMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8xOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHMzOTAwOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMSB8IEVfTUlQU19NQUNIXzM5MDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczYwMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8yOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MDAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQzMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8zOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MDEwOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMyB8IEVfTUlQU19NQUNIXzQwMTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczQxMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8zIHwgRV9NSVBTX01BQ0hfNDEwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDExMToKLSAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzMgfCBFX01JUFNfTUFDSF80MTExOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0NjUwOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMyB8IEVfTUlQU19NQUNIXzQ2NTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczgwMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF80OwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9IH4gKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCk7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IHZhbDsKLQotICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgZm9yIC5ncHRhYiBzZWN0aW9ucyBhbmQgb3RoZXIgYXBwcm9wcmlhdGUKLSAgICAgaW5mbyBmb3IgZWFjaCBzcGVjaWFsIHNlY3Rpb24uICAqLwotICBmb3IgKGkgPSAxLCBoZHJwcCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCkgKyAxOwotICAgICAgIGkgPCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaG51bTsKLSAgICAgICBpKyssIGhkcnBwKyspCi0gICAgewotICAgICAgc3dpdGNoICgoKmhkcnBwKS0+c2hfdHlwZSkKLQl7Ci0JY2FzZSBTSFRfTUlQU19MSUJMSVNUOgotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3RyIik7Ci0JICBpZiAoc2VjICE9IE5VTEwpCi0JICAgICgqaGRycHApLT5zaF9saW5rID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX01JUFNfR1BUQUI6Ci0JICBCRkRfQVNTRVJUICgoKmhkcnBwKS0+YmZkX3NlY3Rpb24gIT0gTlVMTCk7Ci0JICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsICgqaGRycHApLT5iZmRfc2VjdGlvbik7Ci0JICBCRkRfQVNTRVJUIChuYW1lICE9IE5VTEwKLQkJICAgICAgJiYgc3RybmNtcCAobmFtZSwgIi5ncHRhYi4iLCBzaXplb2YgIi5ncHRhYi4iIC0gMSkgPT0gMCk7Ci0JICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSArIHNpemVvZiAiLmdwdGFiIiAtIDEpOwotCSAgQkZEX0FTU0VSVCAoc2VjICE9IE5VTEwpOwotCSAgKCpoZHJwcCktPnNoX2luZm8gPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2lkeDsKLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfTUlQU19DT05URU5UOgotCSAgQkZEX0FTU0VSVCAoKCpoZHJwcCktPmJmZF9zZWN0aW9uICE9IE5VTEwpOwotCSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCAoKmhkcnBwKS0+YmZkX3NlY3Rpb24pOwotCSAgQkZEX0FTU0VSVCAobmFtZSAhPSBOVUxMCi0JCSAgICAgICYmIHN0cm5jbXAgKG5hbWUsICIuTUlQUy5jb250ZW50IiwKLQkJCQkgIHNpemVvZiAiLk1JUFMuY29udGVudCIgLSAxKSA9PSAwKTsKLQkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLAotCQkJCQkgbmFtZSArIHNpemVvZiAiLk1JUFMuY29udGVudCIgLSAxKTsKLQkgIEJGRF9BU1NFUlQgKHNlYyAhPSBOVUxMKTsKLQkgICgqaGRycHApLT5zaF9pbmZvID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX01JUFNfU1lNQk9MX0xJQjoKLQkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN5bSIpOwotCSAgaWYgKHNlYyAhPSBOVUxMKQotCSAgICAoKmhkcnBwKS0+c2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4OwotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubGlibGlzdCIpOwotCSAgaWYgKHNlYyAhPSBOVUxMKQotCSAgICAoKmhkcnBwKS0+c2hfaW5mbyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4OwotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9NSVBTX0VWRU5UUzoKLQkgIEJGRF9BU1NFUlQgKCgqaGRycHApLT5iZmRfc2VjdGlvbiAhPSBOVUxMKTsKLQkgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgKCpoZHJwcCktPmJmZF9zZWN0aW9uKTsKLQkgIEJGRF9BU1NFUlQgKG5hbWUgIT0gTlVMTCk7Ci0JICBpZiAoc3RybmNtcCAobmFtZSwgIi5NSVBTLmV2ZW50cyIsIHNpemVvZiAiLk1JUFMuZXZlbnRzIiAtIDEpID09IDApCi0JICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLAotCQkJCQkgICBuYW1lICsgc2l6ZW9mICIuTUlQUy5ldmVudHMiIC0gMSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLk1JUFMucG9zdF9yZWwiLAotCQkJCSAgIHNpemVvZiAiLk1JUFMucG9zdF9yZWwiIC0gMSkgPT0gMCk7Ci0JICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsCi0JCQkJCSAgICAgKG5hbWUKLQkJCQkJICAgICAgKyBzaXplb2YgIi5NSVBTLnBvc3RfcmVsIiAtIDEpKTsKLQkgICAgfQotCSAgQkZEX0FTU0VSVCAoc2VjICE9IE5VTEwpOwotCSAgKCpoZHJwcCktPnNoX2xpbmsgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2lkeDsKLQkgIGJyZWFrOwotCi0JfQotICAgIH0KLX0KLQwKLS8qIEZ1bmN0aW9uIHRvIGtlZXAgTUlQUyBzcGVjaWZpYyBmaWxlIGZsYWdzIGxpa2UgYXMgRUZfTUlQU19QSUMuICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKGFiZmQpCi0JICAgICAgfHwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPT0gZmxhZ3MpOwotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID0gZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChhYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIG9uZSBvYmplY3QgbW9kdWxlIHRvIGFub3RoZXIgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChvYmZkKQotCSAgICAgIHx8IChlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncwotCQkgID09IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzKSk7Ci0KLSAgZWxmX2dwIChvYmZkKSA9IGVsZl9ncCAoaWJmZCk7Ci0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBmbGFnd29yZCBvbGRfZmxhZ3M7Ci0gIGZsYWd3b3JkIG5ld19mbGFnczsKLSAgYm9vbGVhbiBvazsKLQotICAvKiBDaGVjayBpZiB3ZSBoYXZlIHRoZSBzYW1lIGVuZGlhbmVzcyAqLwotICBpZiAoaWJmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IG9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgotICAgICAgJiYgb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTikKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICptc2c7Ci0KLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoaWJmZCkpCi0JbXNnID0gXygiJXM6IGNvbXBpbGVkIGZvciBhIGJpZyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgbGl0dGxlIGVuZGlhbiIpOwotICAgICAgZWxzZQotCW1zZyA9IF8oIiVzOiBjb21waWxlZCBmb3IgYSBsaXR0bGUgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIGJpZyBlbmRpYW4iKTsKLQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChtc2csIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuZXdfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgfD0gbmV3X2ZsYWdzICYgRUZfTUlQU19OT1JFT1JERVI7Ci0gIG9sZF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotCi0gIGlmICghIGVsZl9mbGFnc19pbml0IChvYmZkKSkKLSAgICB7Ci0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBuZXdfZmxhZ3M7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X2FyY2ggKG9iZmQpID09IGJmZF9nZXRfYXJjaCAoaWJmZCkKLQkgICYmIGJmZF9nZXRfYXJjaF9pbmZvIChvYmZkKS0+dGhlX2RlZmF1bHQpCi0JewotCSAgaWYgKCEgYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksCi0JCQkJICAgYmZkX2dldF9tYWNoIChpYmZkKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBDaGVjayBmbGFnIGNvbXBhdGliaWxpdHkuICAqLwotCi0gIG5ld19mbGFncyAmPSB+RUZfTUlQU19OT1JFT1JERVI7Ci0gIG9sZF9mbGFncyAmPSB+RUZfTUlQU19OT1JFT1JERVI7Ci0KLSAgaWYgKG5ld19mbGFncyA9PSBvbGRfZmxhZ3MpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgb2sgPSB0cnVlOwotCi0gIGlmICgobmV3X2ZsYWdzICYgRUZfTUlQU19QSUMpICE9IChvbGRfZmxhZ3MgJiBFRl9NSVBTX1BJQykpCi0gICAgewotICAgICAgbmV3X2ZsYWdzICY9IH5FRl9NSVBTX1BJQzsKLSAgICAgIG9sZF9mbGFncyAmPSB+RUZfTUlQU19QSUM7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGxpbmtpbmcgUElDIGZpbGVzIHdpdGggbm9uLVBJQyBmaWxlcyIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgICBvayA9IGZhbHNlOwotICAgIH0KLQotICBpZiAoKG5ld19mbGFncyAmIEVGX01JUFNfQ1BJQykgIT0gKG9sZF9mbGFncyAmIEVGX01JUFNfQ1BJQykpCi0gICAgewotICAgICAgbmV3X2ZsYWdzICY9IH5FRl9NSVBTX0NQSUM7Ci0gICAgICBvbGRfZmxhZ3MgJj0gfkVGX01JUFNfQ1BJQzsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogbGlua2luZyBhYmljYWxscyBmaWxlcyB3aXRoIG5vbi1hYmljYWxscyBmaWxlcyIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgICBvayA9IGZhbHNlOwotICAgIH0KLQotICAvKiBDb21wYXJlIHRoZSBJU0Ency4gKi8KLSAgaWYgKChuZXdfZmxhZ3MgJiAoRUZfTUlQU19BUkNIIHwgRUZfTUlQU19NQUNIKSkKLSAgICAgICE9IChvbGRfZmxhZ3MgJiAoRUZfTUlQU19BUkNIIHwgRUZfTUlQU19NQUNIKSkpCi0gICAgewotICAgICAgaW50IG5ld19tYWNoID0gbmV3X2ZsYWdzICYgRUZfTUlQU19NQUNIOwotICAgICAgaW50IG9sZF9tYWNoID0gb2xkX2ZsYWdzICYgRUZfTUlQU19NQUNIOwotICAgICAgaW50IG5ld19pc2EgPSBlbGZfbWlwc19pc2EgKG5ld19mbGFncyk7Ci0gICAgICBpbnQgb2xkX2lzYSA9IGVsZl9taXBzX2lzYSAob2xkX2ZsYWdzKTsKLQotICAgICAgLyogSWYgZWl0aGVyIGhhcyBubyBtYWNoaW5lIHNwZWNpZmllZCwganVzdCBjb21wYXJlIHRoZSBnZW5lcmFsIGlzYSdzLgotCSBTb21lIGNvbWJpbmF0aW9ucyBvZiBtYWNoaW5lcyBhcmUgb2ssIGlmIHRoZSBpc2EncyBtYXRjaC4gKi8KLSAgICAgIGlmICghIG5ld19tYWNoIAotCSAgfHwgISBvbGRfbWFjaAotCSAgfHwgbmV3X21hY2ggPT0gb2xkX21hY2gKLQkgICkKLQl7Ci0JICAvKiBEb24ndCB3YXJuIGFib3V0IG1peGluZyAtbWlwczEgYW5kIC1taXBzMiBjb2RlLCBvciBtaXhpbmcgLW1pcHMzCi0JICAgICBhbmQgLW1pcHM0IGNvZGUuICBUaGV5IHdpbGwgbm9ybWFsbHkgdXNlIHRoZSBzYW1lIGRhdGEgc2l6ZXMgYW5kCi0JICAgICBjYWxsaW5nIGNvbnZlbnRpb25zLiAgKi8KLQotCSAgaWYgKChuZXdfaXNhID09IDEgfHwgbmV3X2lzYSA9PSAyKQotCSAgICAgID8gKG9sZF9pc2EgIT0gMSAmJiBvbGRfaXNhICE9IDIpCi0JICAgICAgOiAob2xkX2lzYSA9PSAxIHx8IG9sZF9pc2EgPT0gMikpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiBJU0EgbWlzbWF0Y2ggKC1taXBzJWQpIHdpdGggcHJldmlvdXMgbW9kdWxlcyAoLW1pcHMlZCkiKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoaWJmZCksIG5ld19pc2EsIG9sZF9pc2EpOwotCSAgICAgIG9rID0gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGVsc2UKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBJU0EgbWlzbWF0Y2ggKCVkKSB3aXRoIHByZXZpb3VzIG1vZHVsZXMgKCVkKSIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JICAgICBlbGZfbWlwc19tYWNoIChuZXdfZmxhZ3MpLAotCSAgICAgZWxmX21pcHNfbWFjaCAob2xkX2ZsYWdzKSk7Ci0JICBvayA9IGZhbHNlOwotCX0KLQotICAgICAgbmV3X2ZsYWdzICY9IH4gKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCk7Ci0gICAgICBvbGRfZmxhZ3MgJj0gfiAoRUZfTUlQU19BUkNIIHwgRUZfTUlQU19NQUNIKTsKLSAgICB9Ci0KLSAgLyogQ29tcGFyZSBBQkkncyAqLwotICBpZiAoKG5ld19mbGFncyAmIEVGX01JUFNfQUJJKSAhPSAob2xkX2ZsYWdzICYgRUZfTUlQU19BQkkpKQotICAgIHsKLSAgICAgIC8qIE9ubHkgZXJyb3IgaWYgYm90aCBhcmUgc2V0ICh0byBkaWZmZXJlbnQgdmFsdWVzKS4gKi8KLSAgICAgIGlmICgobmV3X2ZsYWdzICYgRUZfTUlQU19BQkkpCi0JICAmJiAob2xkX2ZsYWdzICYgRUZfTUlQU19BQkkpKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IEFCSSBtaXNtYXRjaDogbGlua2luZyAlcyBtb2R1bGUgd2l0aCBwcmV2aW91cyAlcyBtb2R1bGVzIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkgICAgIGVsZl9taXBzX2FiaV9uYW1lIChuZXdfZmxhZ3MpLAotCSAgICAgZWxmX21pcHNfYWJpX25hbWUgKG9sZF9mbGFncykpOwotCSAgb2sgPSBmYWxzZTsKLQl9Ci0gICAgICBuZXdfZmxhZ3MgJj0gfkVGX01JUFNfQUJJOwotICAgICAgb2xkX2ZsYWdzICY9IH5FRl9NSVBTX0FCSTsKLSAgICB9Ci0KLSAgLyogV2FybiBhYm91dCBhbnkgb3RoZXIgbWlzbWF0Y2hlcyAqLwotICBpZiAobmV3X2ZsYWdzICE9IG9sZF9mbGFncykKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IHVzZXMgZGlmZmVyZW50IGVfZmxhZ3MgKDB4JWx4KSBmaWVsZHMgdGhhbiBwcmV2aW91cyBtb2R1bGVzICgweCVseCkiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksICh1bnNpZ25lZCBsb25nKSBuZXdfZmxhZ3MsCi0JICh1bnNpZ25lZCBsb25nKSBvbGRfZmxhZ3MpOwotICAgICAgb2sgPSBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgb2spCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotc3RhdGljIGJvb2xlYW4KLV9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBwdHI7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBwdHI7Ci0KLSAgQkZEX0FTU0VSVCAoYWJmZCAhPSBOVUxMICYmIHB0ciAhPSBOVUxMKTsKLQotICAvKiBQcmludCBub3JtYWwgRUxGIHByaXZhdGUgZGF0YS4gICovCi0gIF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cik7Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgZnByaW50ZiAoZmlsZSwgXyAoInByaXZhdGUgZmxhZ3MgPSAlbHg6IiksIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzKTsKLQotICBpZiAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkpID09IEVfTUlQU19BQklfTzMyKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2FiaT1PMzJdIikpOwotICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgPT0gRV9NSVBTX0FCSV9PNjQpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpPU82NF0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQUJJKSA9PSBFX01JUFNfQUJJX0VBQkkzMikKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYmk9RUFCSTMyXSIpKTsKLSAgZWxzZSBpZiAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkpID09IEVfTUlQU19BQklfRUFCSTY0KQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2FiaT1FQUJJNjRdIikpOwotICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpIHVua25vd25dIikpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbbm8gYWJpIHNldF0iKSk7Ci0KLSAgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMSkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzMV0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMikKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzMl0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMykKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzM10iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfNCkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzNF0iKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFt1bmtub3duIElTQV0iKSk7Ci0KLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU18zMkJJVE1PREUpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbMzJiaXRtb2RlXSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW25vdCAzMmJpdG1vZGVdIikpOwotCi0gIGZwdXRjICgnXG4nLCBmaWxlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEhhbmRsZSBhIE1JUFMgc3BlY2lmaWMgc2VjdGlvbiB3aGVuIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUuICBUaGlzCi0gICBpcyBjYWxsZWQgd2hlbiBlbGZjb2RlLmggZmluZHMgYSBzZWN0aW9uIHdpdGggYW4gdW5rbm93biB0eXBlLgotICAgVGhpcyByb3V0aW5lIHN1cHBvcnRzIGJvdGggdGhlIDMyLWJpdCBhbmQgNjQtYml0IEVMRiBBQkkuCi0KLSAgIEZJWE1FOiBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgU0hGX01JUFNfR1BSRUwgZmxhZywgYnV0IEknbSBub3Qgc3VyZQotICAgaG93IHRvLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzID0gMDsKLQotICAvKiBUaGVyZSBvdWdodCB0byBiZSBhIHBsYWNlIHRvIGtlZXAgRUxGIGJhY2tlbmQgc3BlY2lmaWMgZmxhZ3MsIGJ1dAotICAgICBhdCB0aGUgbW9tZW50IHRoZXJlIGlzbid0IG9uZS4gIFdlIGp1c3Qga2VlcCB0cmFjayBvZiB0aGUKLSAgICAgc2VjdGlvbnMgYnkgdGhlaXIgbmFtZSwgaW5zdGVhZC4gIEZvcnR1bmF0ZWx5LCB0aGUgQUJJIGdpdmVzCi0gICAgIHN1Z2dlc3RlZCBuYW1lcyBmb3IgYWxsIHRoZSBNSVBTIHNwZWNpZmljIHNlY3Rpb25zLCBzbyB3ZSB3aWxsCi0gICAgIHByb2JhYmx5IGdldCBhd2F5IHdpdGggdGhpcy4gICovCi0gIHN3aXRjaCAoaGRyLT5zaF90eXBlKQotICAgIHsKLSAgICBjYXNlIFNIVF9NSVBTX0xJQkxJU1Q6Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLmxpYmxpc3QiKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfTVNZTToKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIubXN5bSIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19DT05GTElDVDoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuY29uZmxpY3QiKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfR1BUQUI6Ci0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5ncHRhYi4iLCBzaXplb2YgIi5ncHRhYi4iIC0gMSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX1VDT0RFOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi51Y29kZSIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19ERUJVRzoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIubWRlYnVnIikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmbGFncyA9IFNFQ19ERUJVR0dJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX1JFR0lORk86Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlZ2luZm8iKSAhPSAwCi0JICB8fCBoZHItPnNoX3NpemUgIT0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmbGFncyA9IChTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19JRkFDRToKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuTUlQUy5pbnRlcmZhY2VzIikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0NPTlRFTlQ6Ci0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5NSVBTLmNvbnRlbnQiLCBzaXplb2YgIi5NSVBTLmNvbnRlbnQiIC0gMSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX09QVElPTlM6Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLm9wdGlvbnMiKSAhPSAwCi0JICAmJiBzdHJjbXAgKG5hbWUsICIuTUlQUy5vcHRpb25zIikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0RXQVJGOgotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZGVidWdfIiwgc2l6ZW9mICIuZGVidWdfIiAtIDEpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19TWU1CT0xfTElCOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5NSVBTLnN5bWxpYiIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19FVkVOVFM6Ci0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5NSVBTLmV2ZW50cyIsIHNpemVvZiAiLk1JUFMuZXZlbnRzIiAtIDEpICE9IDAKLQkgICYmIHN0cm5jbXAgKG5hbWUsICIuTUlQUy5wb3N0X3JlbCIsCi0JCSAgICAgIHNpemVvZiAiLk1JUFMucG9zdF9yZWwiIC0gMSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoZmxhZ3MpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uLAotCQkJCSAgIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsCi0JCQkJCQkJICAgaGRyLT5iZmRfc2VjdGlvbikKLQkJCQkgICAgfCBmbGFncykpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBhIDMyLWJpdCBNSVBTIEVMRiBzcGVjaWZpYyBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmMzJfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBjaGFyICpuYW1lOwotewotICBpZiAoISBfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBGSVhNRTogV2Ugc2hvdWxkIHJlY29yZCBzaF9pbmZvIGZvciBhIC5ncHRhYiBzZWN0aW9uLiAgKi8KLQotICAvKiBGb3IgYSAucmVnaW5mbyBzZWN0aW9uLCBzZXQgdGhlIGdwIHZhbHVlIGluIHRoZSB0ZGF0YSBpbmZvcm1hdGlvbgotICAgICBmcm9tIHRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24uICBXZSBuZWVkIHRoZSBncCB2YWx1ZSB3aGlsZQotICAgICBwcm9jZXNzaW5nIHJlbG9jcywgc28gd2UganVzdCBnZXQgaXQgbm93LiAgVGhlIC5yZWdpbmZvIHNlY3Rpb24KLSAgICAgaXMgbm90IHVzZWQgaW4gdGhlIDY0LWJpdCBNSVBTIEVMRiBBQkkuICAqLwotICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9NSVBTX1JFR0lORk8pCi0gICAgewotICAgICAgRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyBleHQ7Ci0gICAgICBFbGYzMl9SZWdJbmZvIHM7Ci0KLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaGRyLT5iZmRfc2VjdGlvbiwgKFBUUikgJmV4dCwKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNpemVvZiBleHQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19pbiAoYWJmZCwgJmV4dCwgJnMpOwotICAgICAgZWxmX2dwIChhYmZkKSA9IHMucmlfZ3BfdmFsdWU7Ci0gICAgfQotCi0gIC8qIEZvciBhIFNIVF9NSVBTX09QVElPTlMgc2VjdGlvbiwgbG9vayBmb3IgYSBPREtfUkVHSU5GTyBlbnRyeSwgYW5kCi0gICAgIHNldCB0aGUgZ3AgdmFsdWUgYmFzZWQgb24gd2hhdCB3ZSBmaW5kLiAgV2UgbWF5IHNlZSBib3RoCi0gICAgIFNIVF9NSVBTX1JFR0lORk8gYW5kIFNIVF9NSVBTX09QVElPTlMvT0RLX1JFR0lORk87IGluIHRoYXQgY2FzZSwKLSAgICAgdGhleSBzaG91bGQgYWdyZWUuICAqLwotICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9NSVBTX09QVElPTlMpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLCAqbCwgKmxlbmQ7Ci0KLSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGhkci0+c2hfc2l6ZSk7Ci0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgaGRyLT5zaF9zaXplKSkKLQl7Ci0JICBmcmVlIChjb250ZW50cyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgbCA9IGNvbnRlbnRzOwotICAgICAgbGVuZCA9IGNvbnRlbnRzICsgaGRyLT5zaF9zaXplOwotICAgICAgd2hpbGUgKGwgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKSA8PSBsZW5kKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9PcHRpb25zIGludG9wdDsKLQotCSAgYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbiAoYWJmZCwgKEVsZl9FeHRlcm5hbF9PcHRpb25zICopIGwsCi0JCQkJCSZpbnRvcHQpOwotCSAgaWYgKGludG9wdC5raW5kID09IE9ES19SRUdJTkZPKQotCSAgICB7Ci0JICAgICAgRWxmMzJfUmVnSW5mbyBpbnRyZWc7Ci0KLQkgICAgICBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9faW4KLQkJKGFiZmQsCi0JCSAoKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKikKLQkJICAobCArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpKSksCi0JCSAmaW50cmVnKTsKLQkgICAgICBlbGZfZ3AgKGFiZmQpID0gaW50cmVnLnJpX2dwX3ZhbHVlOwotCSAgICB9Ci0JICBsICs9IGludG9wdC5zaXplOwotCX0KLSAgICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgY29ycmVjdCB0eXBlIGZvciBhIE1JUFMgRUxGIHNlY3Rpb24uICBXZSBkbyB0aGlzIGJ5IHRoZQotICAgc2VjdGlvbiBuYW1lLCB3aGljaCBpcyBhIGhhY2ssIGJ1dCBvdWdodCB0byB3b3JrLiAgVGhpcyByb3V0aW5lIGlzCi0gICB1c2VkIGJ5IGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIGhkciwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqbmFtZTsKLQotICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgIi5saWJsaXN0IikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19MSUJMSVNUOwotICAgICAgaGRyLT5zaF9pbmZvID0gc2VjLT5fcmF3X3NpemUgLyBzaXplb2YgKEVsZjMyX0xpYik7Ci0gICAgICAvKiBUaGUgc2hfbGluayBmaWVsZCBpcyBzZXQgaW4gZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubXN5bSIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfTVNZTTsKLSAgICAgIGhkci0+c2hfZW50c2l6ZSA9IDg7Ci0gICAgICAvKiBGSVhNRTogU2V0IHRoZSBzaF9pbmZvIGZpZWxkLiAgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5jb25mbGljdCIpID09IDApCi0gICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfQ09ORkxJQ1Q7Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ3B0YWIuIiwgc2l6ZW9mICIuZ3B0YWIuIiAtIDEpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfR1BUQUI7Ci0gICAgICBoZHItPnNoX2VudHNpemUgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2dwdGFiKTsKLSAgICAgIC8qIFRoZSBzaF9pbmZvIGZpZWxkIGlzIHNldCBpbiBmaW5hbF93cml0ZV9wcm9jZXNzaW5nLiAgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi51Y29kZSIpID09IDApCi0gICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfVUNPREU7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5tZGVidWciKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0RFQlVHOwotICAgICAgLyogSW4gYSBzaGFyZWQgb2JqZWN0IG9uIElyaXggNS4zLCB0aGUgLm1kZWJ1ZyBzZWN0aW9uIGhhcyBhbgotICAgICAgICAgZW50c2l6ZSBvZiAwLiAgRklYTUU6IERvZXMgdGhpcyBtYXR0ZXI/ICAqLwotICAgICAgaWYgKFNHSV9DT01QQVQgKGFiZmQpICYmIChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgICAgIGVsc2UKLQloZHItPnNoX2VudHNpemUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJlZ2luZm8iKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX1JFR0lORk87Ci0gICAgICAvKiBJbiBhIHNoYXJlZCBvYmplY3Qgb24gSXJpeCA1LjMsIHRoZSAucmVnaW5mbyBzZWN0aW9uIGhhcyBhbgotICAgICAgICAgZW50c2l6ZSBvZiAweDE4LiAgRklYTUU6IERvZXMgdGhpcyBtYXR0ZXI/ICAqLwotICAgICAgaWYgKFNHSV9DT01QQVQgKGFiZmQpICYmIChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JaGRyLT5zaF9lbnRzaXplID0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKTsKLSAgICAgIGVsc2UKLQloZHItPnNoX2VudHNpemUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoU0dJX0NPTVBBVCAoYWJmZCkKLQkgICAmJiAoc3RyY21wIChuYW1lLCAiLmhhc2giKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAobmFtZSwgIi5keW5hbWljIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKG5hbWUsICIuZHluc3RyIikgPT0gMCkpCi0gICAgewotICAgICAgaGRyLT5zaF9lbnRzaXplID0gMDsKLSNpZiAwCi0gICAgICAvKiBUaGlzIGlzbid0IGhvdyB0aGUgSXJpeCA2IGxpbmtlciBiZWhhdmVzLiAgKi8KLSAgICAgIGhkci0+c2hfaW5mbyA9IFNJWkVPRl9NSVBTX0RZTlNZTV9TRUNOQU1FUzsKLSNlbmRpZgotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmdvdCIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLmxpdDgiKSA9PSAwKQotICAgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX01JUFNfR1BSRUw7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5NSVBTLmludGVyZmFjZXMiKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0lGQUNFOwotICAgICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfTUlQU19OT1NUUklQOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLk1JUFMuY29udGVudCIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfQ09OVEVOVDsKLSAgICAgIC8qIFRoZSBzaF9pbmZvIGZpZWxkIGlzIHNldCBpbiBmaW5hbF93cml0ZV9wcm9jZXNzaW5nLiAgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5vcHRpb25zIikgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5NSVBTLm9wdGlvbnMiKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX09QVElPTlM7Ci0gICAgICBoZHItPnNoX2VudHNpemUgPSAxOwotICAgICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfTUlQU19OT1NUUklQOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5kZWJ1Z18iLCBzaXplb2YgIi5kZWJ1Z18iIC0gMSkgPT0gMCkKLSAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19EV0FSRjsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLk1JUFMuc3ltbGliIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19TWU1CT0xfTElCOwotICAgICAgLyogVGhlIHNoX2xpbmsgYW5kIHNoX2luZm8gZmllbGRzIGFyZSBzZXQgaW4KLSAgICAgICAgIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5NSVBTLmV2ZW50cyIsIHNpemVvZiAiLk1JUFMuZXZlbnRzIiAtIDEpID09IDAKLQkgICB8fCBzdHJuY21wIChuYW1lLCAiLk1JUFMucG9zdF9yZWwiLAotCQkgICAgICAgc2l6ZW9mICIuTUlQUy5wb3N0X3JlbCIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0VWRU5UUzsKLSAgICAgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX01JUFNfTk9TVFJJUDsKLSAgICAgIC8qIFRoZSBzaF9saW5rIGZpZWxkIGlzIHNldCBpbiBmaW5hbF93cml0ZV9wcm9jZXNzaW5nLiAgKi8KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdpdmVuIGEgQkZEIHNlY3Rpb24sIHRyeSB0byBsb2NhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRUxGIHNlY3Rpb24KLSAgIGluZGV4LiAgVGhpcyBpcyB1c2VkIGJ5IGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuCi0gICBBY3R1YWxseSwgaXQncyBub3QgY2xlYXIgdG8gbWUgdGhhdCB0aGUgNjQtYml0IEFCSSBzdXBwb3J0cyB0aGVzZSwKLSAgIGJ1dCBmb3Igbm9uLVBJQyBvYmplY3RzIHdlIHdpbGwgY2VydGFpbmx5IHdhbnQgc3VwcG9ydCBmb3IgYXQgbGVhc3QKLSAgIHRoZSAuc2NvbW1vbiBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIGhkciwgc2VjLCByZXR2YWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBpbnQgKnJldHZhbDsKLXsKLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuc2NvbW1vbiIpID09IDApCi0gICAgewotICAgICAgKnJldHZhbCA9IFNITl9NSVBTX1NDT01NT047Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLmFjb21tb24iKSA9PSAwKQotICAgIHsKLSAgICAgICpyZXR2YWwgPSBTSE5fTUlQU19BQ09NTU9OOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFdoZW4gYXJlIHdyaXRpbmcgb3V0IHRoZSAub3B0aW9ucyBvciAuTUlQUy5vcHRpb25zIHNlY3Rpb24sCi0gICByZW1lbWJlciB0aGUgYnl0ZXMgd2UgYXJlIHdyaXRpbmcgb3V0LCBzbyB0aGF0IHdlIGNhbiBpbnN0YWxsIHRoZQotICAgR1AgdmFsdWUgaW4gdGhlIHNlY3Rpb25fcHJvY2Vzc2luZyByb3V0aW5lLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5vcHRpb25zIikgPT0gMAotICAgICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCAiLk1JUFMub3B0aW9ucyIpID09IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgKmM7Ci0KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKSA9PSBOVUxMKQotCXsKLQkgIHNlY3Rpb24tPnVzZWRfYnlfYmZkID0KLQkgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpKTsKLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYyA9IChiZmRfYnl0ZSAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGRhdGE7Ci0gICAgICBpZiAoYyA9PSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotCSAgaWYgKHNlY3Rpb24tPl9jb29rZWRfc2l6ZSAhPSAwKQotCSAgICBzaXplID0gc2VjdGlvbi0+X2Nvb2tlZF9zaXplOwotCSAgZWxzZQotCSAgICBzaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOwotCSAgYyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplKTsKLQkgIGlmIChjID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50ZGF0YSA9IChQVFIpIGM7Ci0JfQotCi0gICAgICBtZW1jcHkgKGMgKyBvZmZzZXQsIGxvY2F0aW9uLCBjb3VudCk7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwKLQkJCQkJY291bnQpOwotfQotCi0vKiBXb3JrIG92ZXIgYSBzZWN0aW9uIGp1c3QgYmVmb3JlIHdyaXRpbmcgaXQgb3V0LiAgVGhpcyByb3V0aW5lIGlzCi0gICB1c2VkIGJ5IGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICBGSVhNRTogV2UgcmVjb2duaXplCi0gICBzZWN0aW9ucyB0aGF0IG5lZWQgdGhlIFNIRl9NSVBTX0dQUkVMIGZsYWcgYnkgbmFtZTsgdGhlcmUgaGFzIHRvIGJlCi0gICBhIGJldHRlciB3YXkuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyAoYWJmZCwgaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci17Ci0gIGlmIChoZHItPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uKTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDApCi0JewotCSAgaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxMT0MgfCBTSEZfV1JJVEUgfCBTSEZfTUlQU19HUFJFTDsKLQkgIGhkci0+c2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JewotCSAgaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxMT0MgfCBTSEZfV1JJVEUgfCBTSEZfTUlQU19HUFJFTDsKLQkgIGhkci0+c2hfdHlwZSA9IFNIVF9OT0JJVFM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDgiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAobmFtZSwgIi5saXQ0IikgPT0gMCkKLQl7Ci0JICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9BTExPQyB8IFNIRl9XUklURSB8IFNIRl9NSVBTX0dQUkVMOwotCSAgaGRyLT5zaF90eXBlID0gU0hUX1BST0dCSVRTOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5jb21wYWN0X3JlbCIpID09IDApCi0JewotCSAgaGRyLT5zaF9mbGFncyA9IDA7Ci0JICBoZHItPnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJ0cHJvYyIpID09IDApCi0JewotCSAgaWYgKGhkci0+c2hfYWRkcmFsaWduICE9IDAgJiYgaGRyLT5zaF9lbnRzaXplID09IDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgYWRqdXN0OwotCi0JICAgICAgYWRqdXN0ID0gaGRyLT5zaF9zaXplICUgaGRyLT5zaF9hZGRyYWxpZ247Ci0JICAgICAgaWYgKGFkanVzdCAhPSAwKQotCQloZHItPnNoX3NpemUgKz0gaGRyLT5zaF9hZGRyYWxpZ24gLSBhZGp1c3Q7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXb3JrIG92ZXIgYSBzZWN0aW9uIGp1c3QgYmVmb3JlIHdyaXRpbmcgaXQgb3V0LiAgV2UgdXBkYXRlIHRoZSBHUAotICAgdmFsdWUgaW4gdGhlIFNIVF9NSVBTX1JFR0lORk8gYW5kIFNIVF9NSVBTX09QVElPTlMgc2VjdGlvbnMgYmFzZWQKLSAgIG9uIHRoZSB2YWx1ZSB3ZSBhcmUgdXNpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGYzMl9zZWN0aW9uX3Byb2Nlc3NpbmcgKGFiZmQsIGhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICpoZHI7Ci17Ci0gIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX01JUFNfUkVHSU5GTykKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBidWZbNF07Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGhkci0+c2hfc2l6ZSA9PSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pKTsKLSAgICAgIEJGRF9BU1NFUlQgKGhkci0+Y29udGVudHMgPT0gTlVMTCk7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIGhkci0+c2hfb2Zmc2V0ICsgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSAtIDQsCi0JCSAgICBTRUVLX1NFVCkgPT0gLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgZWxmX2dwIChhYmZkKSwgYnVmKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgKGJmZF9zaXplX3R5cGUpIDEsIChiZmRfc2l6ZV90eXBlKSA0LCBhYmZkKSAhPSA0KQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfTUlQU19PUFRJT05TCi0gICAgICAmJiBoZHItPmJmZF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pICE9IE5VTEwKLSAgICAgICYmIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pLT50ZGF0YSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpjb250ZW50cywgKmwsICpsZW5kOwotCi0gICAgICAvKiBXZSBzdG9yZWQgdGhlIHNlY3Rpb24gY29udGVudHMgaW4gdGhlIGVsZl9zZWN0aW9uX2RhdGEgdGRhdGEKLQkgZmllbGQgaW4gdGhlIHNldF9zZWN0aW9uX2NvbnRlbnRzIHJvdXRpbmUuICBXZSBzYXZlIHRoZQotCSBzZWN0aW9uIGNvbnRlbnRzIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byByZWFkIHRoZW0gYWdhaW4uCi0JIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IGVsZl9ncCBpcyBzZXQsIHNvIHdlIGNhbiBsb29rCi0JIHRocm91Z2ggdGhlIHNlY3Rpb24gY29udGVudHMgdG8gc2VlIGlmIHRoZXJlIGlzIGFuCi0JIE9ES19SRUdJTkZPIHN0cnVjdHVyZS4gICovCi0KLSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pLT50ZGF0YTsKLSAgICAgIGwgPSBjb250ZW50czsKLSAgICAgIGxlbmQgPSBjb250ZW50cyArIGhkci0+c2hfc2l6ZTsKLSAgICAgIHdoaWxlIChsICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykgPD0gbGVuZCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfT3B0aW9ucyBpbnRvcHQ7Ci0KLQkgIGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4gKGFiZmQsIChFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqKSBsLAotCQkJCQkmaW50b3B0KTsKLQkgIGlmIChpbnRvcHQua2luZCA9PSBPREtfUkVHSU5GTykKLQkgICAgewotCSAgICAgIGJmZF9ieXRlIGJ1Zls0XTsKLQotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJCSAgICAoaGRyLT5zaF9vZmZzZXQKLQkJCSAgICAgKyAobCAtIGNvbnRlbnRzKQotCQkJICAgICArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpCi0JCQkgICAgICsgKHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbykgLSA0KSksCi0JCQkgICAgIFNFRUtfU0VUKSA9PSAtMSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgZWxmX2dwIChhYmZkKSwgYnVmKTsKLQkgICAgICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIDQsIGFiZmQpICE9IDQpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgbCArPSBpbnRvcHQuc2l6ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyAoYWJmZCwgaGRyKTsKLX0KLQwKLS8qIE1JUFMgRUxGIHVzZXMgdHdvIGNvbW1vbiBzZWN0aW9ucy4gIE9uZSBpcyB0aGUgdXN1YWwgb25lLCBhbmQgdGhlCi0gICBvdGhlciBpcyBmb3Igc21hbGwgb2JqZWN0cy4gIEFsbCB0aGUgc21hbGwgb2JqZWN0cyBhcmUga2VwdAotICAgdG9nZXRoZXIsIGFuZCB0aGVuIHJlZmVyZW5jZWQgdmlhIHRoZSBncCBwb2ludGVyLCB3aGljaCB5aWVsZHMKLSAgIGZhc3RlciBhc3NlbWJsZXIgY29kZS4gIFRoaXMgaXMgd2hhdCB3ZSB1c2UgZm9yIHRoZSBzbWFsbCBjb21tb24KLSAgIHNlY3Rpb24uICBUaGlzIGFwcHJvYWNoIGlzIGNvcGllZCBmcm9tIGVjb2ZmLmMuICAqLwotc3RhdGljIGFzZWN0aW9uIG1pcHNfZWxmX3Njb21fc2VjdGlvbjsKLXN0YXRpYyBhc3ltYm9sIG1pcHNfZWxmX3Njb21fc3ltYm9sOwotc3RhdGljIGFzeW1ib2wgKm1pcHNfZWxmX3Njb21fc3ltYm9sX3B0cjsKLQotLyogTUlQUyBFTEYgYWxzbyB1c2VzIGFuIGFjb21tb24gc2VjdGlvbiwgd2hpY2ggcmVwcmVzZW50cyBhbgotICAgYWxsb2NhdGVkIGNvbW1vbiBzeW1ib2wgd2hpY2ggbWF5IGJlIG92ZXJyaWRkZW4gYnkgYQotICAgZGVmaW5pdGlvbiBpbiBhIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLXN0YXRpYyBhc2VjdGlvbiBtaXBzX2VsZl9hY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCBtaXBzX2VsZl9hY29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICptaXBzX2VsZl9hY29tX3N5bWJvbF9wdHI7Ci0KLS8qIFRoZSBJcml4IDUgc3VwcG9ydCB1c2VzIHR3byB2aXJ0dWFsIHNlY3Rpb25zLCB3aGljaCByZXByZXNlbnQKLSAgIHRleHQvZGF0YSBzeW1ib2xzIGRlZmluZWQgaW4gZHluYW1pYyBvYmplY3RzLiAgKi8KLXN0YXRpYyBhc2VjdGlvbiBtaXBzX2VsZl90ZXh0X3NlY3Rpb247Ci1zdGF0aWMgYXNlY3Rpb24gKm1pcHNfZWxmX3RleHRfc2VjdGlvbl9wdHI7Ci1zdGF0aWMgYXN5bWJvbCBtaXBzX2VsZl90ZXh0X3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICptaXBzX2VsZl90ZXh0X3N5bWJvbF9wdHI7Ci0KLXN0YXRpYyBhc2VjdGlvbiBtaXBzX2VsZl9kYXRhX3NlY3Rpb247Ci1zdGF0aWMgYXNlY3Rpb24gKm1pcHNfZWxmX2RhdGFfc2VjdGlvbl9wdHI7Ci1zdGF0aWMgYXN5bWJvbCBtaXBzX2VsZl9kYXRhX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICptaXBzX2VsZl9kYXRhX3N5bWJvbF9wdHI7Ci0KLS8qIEhhbmRsZSB0aGUgc3BlY2lhbCBNSVBTIHNlY3Rpb24gbnVtYmVycyB0aGF0IGEgc3ltYm9sIG1heSB1c2UuCi0gICBUaGlzIGlzIHVzZWQgZm9yIGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICAqLwotCi12b2lkCi1fYmZkX21pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nIChhYmZkLCBhc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKmFzeW07Ci17Ci0gIGVsZl9zeW1ib2xfdHlwZSAqZWxmc3ltOwotCi0gIGVsZnN5bSA9IChlbGZfc3ltYm9sX3R5cGUgKikgYXN5bTsKLSAgc3dpdGNoIChlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHgpCi0gICAgewotICAgIGNhc2UgU0hOX01JUFNfQUNPTU1PTjoKLSAgICAgIC8qIFRoaXMgc2VjdGlvbiBpcyB1c2VkIGluIGEgZHluYW1pY2FsbHkgbGlua2VkIGV4ZWN1dGFibGUgZmlsZS4KLQkgSXQgaXMgYW4gYWxsb2NhdGVkIGNvbW1vbiBzZWN0aW9uLiAgVGhlIGR5bmFtaWMgbGlua2VyIGNhbgotCSBlaXRoZXIgcmVzb2x2ZSB0aGVzZSBzeW1ib2xzIHRvIHNvbWV0aGluZyBpbiBhIHNoYXJlZAotCSBsaWJyYXJ5LCBvciBpdCBjYW4ganVzdCBsZWF2ZSB0aGVtIGhlcmUuICBGb3Igb3VyIHB1cnBvc2VzLAotCSB3ZSBjYW4gY29uc2lkZXIgdGhlc2Ugc3ltYm9scyB0byBiZSBpbiBhIG5ldyBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChtaXBzX2VsZl9hY29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIGFjb21tb24gc2VjdGlvbi4gICovCi0JICBtaXBzX2VsZl9hY29tX3NlY3Rpb24ubmFtZSA9ICIuYWNvbW1vbiI7Ci0JICBtaXBzX2VsZl9hY29tX3NlY3Rpb24uZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JICBtaXBzX2VsZl9hY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmbWlwc19lbGZfYWNvbV9zZWN0aW9uOwotCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLnN5bWJvbCA9ICZtaXBzX2VsZl9hY29tX3N5bWJvbDsKLQkgIG1pcHNfZWxmX2Fjb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZtaXBzX2VsZl9hY29tX3N5bWJvbF9wdHI7Ci0JICBtaXBzX2VsZl9hY29tX3N5bWJvbC5uYW1lID0gIi5hY29tbW9uIjsKLQkgIG1pcHNfZWxmX2Fjb21fc3ltYm9sLmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgbWlwc19lbGZfYWNvbV9zeW1ib2wuc2VjdGlvbiA9ICZtaXBzX2VsZl9hY29tX3NlY3Rpb247Ci0JICBtaXBzX2VsZl9hY29tX3N5bWJvbF9wdHIgPSAmbWlwc19lbGZfYWNvbV9zeW1ib2w7Ci0JfQotICAgICAgYXN5bS0+c2VjdGlvbiA9ICZtaXBzX2VsZl9hY29tX3NlY3Rpb247Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hOX0NPTU1PTjoKLSAgICAgIC8qIENvbW1vbiBzeW1ib2xzIGxlc3MgdGhhbiB0aGUgR1Agc2l6ZSBhcmUgYXV0b21hdGljYWxseQotCSB0cmVhdGVkIGFzIFNITl9NSVBTX1NDT01NT04gc3ltYm9scy4gICovCi0gICAgICBpZiAoYXN5bS0+dmFsdWUgPiBlbGZfZ3Bfc2l6ZSAoYWJmZCkpCi0JYnJlYWs7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgU0hOX01JUFNfU0NPTU1PTjoKLSAgICAgIGlmIChtaXBzX2VsZl9zY29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHNtYWxsIGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIG1pcHNfZWxmX3Njb21fc2VjdGlvbi5uYW1lID0gIi5zY29tbW9uIjsKLQkgIG1pcHNfZWxmX3Njb21fc2VjdGlvbi5mbGFncyA9IFNFQ19JU19DT01NT047Ci0JICBtaXBzX2VsZl9zY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmbWlwc19lbGZfc2NvbV9zZWN0aW9uOwotCSAgbWlwc19lbGZfc2NvbV9zZWN0aW9uLnN5bWJvbCA9ICZtaXBzX2VsZl9zY29tX3N5bWJvbDsKLQkgIG1pcHNfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZtaXBzX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci0JICBtaXBzX2VsZl9zY29tX3N5bWJvbC5uYW1lID0gIi5zY29tbW9uIjsKLQkgIG1pcHNfZWxmX3Njb21fc3ltYm9sLmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgbWlwc19lbGZfc2NvbV9zeW1ib2wuc2VjdGlvbiA9ICZtaXBzX2VsZl9zY29tX3NlY3Rpb247Ci0JICBtaXBzX2VsZl9zY29tX3N5bWJvbF9wdHIgPSAmbWlwc19lbGZfc2NvbV9zeW1ib2w7Ci0JfQotICAgICAgYXN5bS0+c2VjdGlvbiA9ICZtaXBzX2VsZl9zY29tX3NlY3Rpb247Ci0gICAgICBhc3ltLT52YWx1ZSA9IGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9NSVBTX1NVTkRFRklORUQ6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotCi0jaWYgMCAvKiBmb3IgU0dJX0NPTVBBVCAqLwotICAgIGNhc2UgU0hOX01JUFNfVEVYVDoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBtaXBzX2VsZl90ZXh0X3NlY3Rpb25fcHRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9NSVBTX0RBVEE6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gbWlwc19lbGZfZGF0YV9zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgfQotfQotDAotLyogV2hlbiBjcmVhdGluZyBhbiBJcml4IDUgZXhlY3V0YWJsZSwgd2UgbmVlZCBSRUdJTkZPIGFuZCBSVFBST0MKLSAgIHNlZ21lbnRzLiAgKi8KLQotc3RhdGljIGludAotbWlwc19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGludCByZXQ7Ci0KLSAgcmV0ID0gMDsKLQotICBpZiAoISBTR0lfQ09NUEFUIChhYmZkKSkKLSAgICByZXR1cm4gcmV0OwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yZWdpbmZvIik7Ci0gIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0gICAgewotICAgICAgLyogV2UgbmVlZCBhIFBUX01JUFNfUkVHSU5GTyBzZWdtZW50LiAgKi8KLSAgICAgICsrcmV0OwotICAgIH0KLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpICE9IE5VTEwKLSAgICAgICYmIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLm1kZWJ1ZyIpICE9IE5VTEwpCi0gICAgewotICAgICAgLyogV2UgbmVlZCBhIFBUX01JUFNfUlRQUk9DIHNlZ21lbnQuICAqLwotICAgICAgKytyZXQ7Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIE1vZGlmeSB0aGUgc2VnbWVudCBtYXAgZm9yIGFuIElyaXggNSBleGVjdXRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX21vZGlmeV9zZWdtZW50X21hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbSwgKipwbTsKLQotICBpZiAoISBTR0lfQ09NUEFUIChhYmZkKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGVyZSBpcyBhIC5yZWdpbmZvIHNlY3Rpb24sIHdlIG5lZWQgYSBQVF9NSVBTX1JFR0lORk8KLSAgICAgc2VnbWVudC4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yZWdpbmZvIik7Ci0gIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0gICAgewotICAgICAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0JaWYgKG0tPnBfdHlwZSA9PSBQVF9NSVBTX1JFR0lORk8pCi0JICBicmVhazsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JewotCSAgbSA9IChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAqbSk7Ci0JICBpZiAobSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIG0tPnBfdHlwZSA9IFBUX01JUFNfUkVHSU5GTzsKLQkgIG0tPmNvdW50ID0gMTsKLQkgIG0tPnNlY3Rpb25zWzBdID0gczsKLQotCSAgLyogV2Ugd2FudCB0byBwdXQgaXQgYWZ0ZXIgdGhlIFBIRFIgYW5kIElOVEVSUCBzZWdtZW50cy4gICovCi0JICBwbSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsKLQkgIHdoaWxlICgqcG0gIT0gTlVMTAotCQkgJiYgKCgqcG0pLT5wX3R5cGUgPT0gUFRfUEhEUgotCQkgICAgIHx8ICgqcG0pLT5wX3R5cGUgPT0gUFRfSU5URVJQKSkKLQkgICAgcG0gPSAmKCpwbSktPm5leHQ7Ci0KLQkgIG0tPm5leHQgPSAqcG07Ci0JICAqcG0gPSBtOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhlcmUgYXJlIC5keW5hbWljIGFuZCAubWRlYnVnIHNlY3Rpb25zLCB3ZSBtYWtlIGEgcm9vbSBmb3IKLSAgICAgdGhlIFJUUFJPQyBoZWFkZXIuICBGSVhNRTogUmV3cml0ZSB3aXRob3V0IHNlY3Rpb24gbmFtZXMuICAqLwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaW50ZXJwIikgPT0gTlVMTAotICAgICAgJiYgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpICE9IE5VTEwKLSAgICAgICYmIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLm1kZWJ1ZyIpICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0JaWYgKG0tPnBfdHlwZSA9PSBQVF9NSVBTX1JUUFJPQykKLQkgIGJyZWFrOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQl7Ci0JICBtID0gKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICptKTsKLQkgIGlmIChtID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgbS0+cF90eXBlID0gUFRfTUlQU19SVFBST0M7Ci0KLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ydHByb2MiKTsKLQkgIGlmIChzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBtLT5jb3VudCA9IDA7Ci0JICAgICAgbS0+cF9mbGFncyA9IDA7Ci0JICAgICAgbS0+cF9mbGFnc192YWxpZCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG0tPmNvdW50ID0gMTsKLQkgICAgICBtLT5zZWN0aW9uc1swXSA9IHM7Ci0JICAgIH0KLQotCSAgLyogV2Ugd2FudCB0byBwdXQgaXQgYWZ0ZXIgdGhlIERZTkFNSUMgc2VnbWVudC4gICovCi0JICBwbSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsKLQkgIHdoaWxlICgqcG0gIT0gTlVMTCAmJiAoKnBtKS0+cF90eXBlICE9IFBUX0RZTkFNSUMpCi0JICAgIHBtID0gJigqcG0pLT5uZXh0OwotCSAgaWYgKCpwbSAhPSBOVUxMKQotCSAgICBwbSA9ICYoKnBtKS0+bmV4dDsKLQotCSAgbS0+bmV4dCA9ICpwbTsKLQkgICpwbSA9IG07Ci0JfQotICAgIH0KLQotICAvKiBPbiBJcml4IDUsIHRoZSBQVF9EWU5BTUlDIHNlZ21lbnQgaW5jbHVkZXMgdGhlIC5keW5hbWljLCAuZHluc3RyLAotICAgICAuZHluc3ltLCBhbmQgLmhhc2ggc2VjdGlvbnMsIGFuZCBldmVyeXRoaW5nIGluIGJldHdlZW4uICAqLwotICBmb3IgKHBtID0gJmVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOyAqcG0gIT0gTlVMTDsgcG0gPSAmKCpwbSktPm5leHQpCi0gICAgaWYgKCgqcG0pLT5wX3R5cGUgPT0gUFRfRFlOQU1JQykKLSAgICAgIGJyZWFrOwotICBtID0gKnBtOwotICBpZiAobSAhPSBOVUxMCi0gICAgICAmJiBtLT5jb3VudCA9PSAxCi0gICAgICAmJiBzdHJjbXAgKG0tPnNlY3Rpb25zWzBdLT5uYW1lLCAiLmR5bmFtaWMiKSA9PSAwKQotICAgIHsKLSAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpzZWNfbmFtZXNbXSA9Ci0JeyAiLmR5bmFtaWMiLCAiLmR5bnN0ciIsICIuZHluc3ltIiwgIi5oYXNoIiB9OwotICAgICAgYmZkX3ZtYSBsb3csIGhpZ2g7Ci0gICAgICB1bnNpZ25lZCBpbnQgaSwgYzsKLSAgICAgIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm47Ci0KLSAgICAgIGxvdyA9IDB4ZmZmZmZmZmY7Ci0gICAgICBoaWdoID0gMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Ygc2VjX25hbWVzIC8gc2l6ZW9mIHNlY19uYW1lc1swXTsgaSsrKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc2VjX25hbWVzW2ldKTsKLQkgIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JICAgIHsKLQkgICAgICBiZmRfc2l6ZV90eXBlIHN6OwotCi0JICAgICAgaWYgKGxvdyA+IHMtPnZtYSkKLQkJbG93ID0gcy0+dm1hOwotCSAgICAgIHN6ID0gcy0+X2Nvb2tlZF9zaXplOwotCSAgICAgIGlmIChzeiA9PSAwKQotCQlzeiA9IHMtPl9yYXdfc2l6ZTsKLQkgICAgICBpZiAoaGlnaCA8IHMtPnZtYSArIHN6KQotCQloaWdoID0gcy0+dm1hICsgc3o7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGMgPSAwOwotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JaWYgKChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwCi0JICAgICYmIHMtPnZtYSA+PSBsb3cKLQkgICAgJiYgKChzLT52bWEKLQkJICsgKHMtPl9jb29rZWRfc2l6ZSAhPSAwID8gcy0+X2Nvb2tlZF9zaXplIDogcy0+X3Jhd19zaXplKSkKLQkJPD0gaGlnaCkpCi0JICArK2M7Ci0KLSAgICAgIG4gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKLQkgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKm4gKyAoYyAtIDEpICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpOwotICAgICAgaWYgKG4gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAqbiA9ICptOwotICAgICAgbi0+Y291bnQgPSBjOwotCi0gICAgICBpID0gMDsKLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXsKLQkgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMAotCSAgICAgICYmIHMtPnZtYSA+PSBsb3cKLQkgICAgICAmJiAoKHMtPnZtYQotCQkgICArIChzLT5fY29va2VkX3NpemUgIT0gMCA/IHMtPl9jb29rZWRfc2l6ZSA6IHMtPl9yYXdfc2l6ZSkpCi0JCSAgPD0gaGlnaCkpCi0JICAgIHsKLQkgICAgICBuLT5zZWN0aW9uc1tpXSA9IHM7Ci0JICAgICAgKytpOwotCSAgICB9Ci0JfQotCi0gICAgICAqcG0gPSBuOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHJ1bnRpbWUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgY3JlYXRlZCBieSB0aGUKLSAgIGxvYWRlciBmb3IgdXNlIGJ5IHRoZSBzdGF0aWMgZXhjZXB0aW9uIHN5c3RlbS4gICovCi0KLXR5cGVkZWYgc3RydWN0IHJ1bnRpbWVfcGRyIHsKLQliZmRfdm1hCWFkcjsJCS8qIG1lbW9yeSBhZGRyZXNzIG9mIHN0YXJ0IG9mIHByb2NlZHVyZSAqLwotCWxvbmcJcmVnbWFzazsJLyogc2F2ZSByZWdpc3RlciBtYXNrICovCi0JbG9uZwlyZWdvZmZzZXQ7CS8qIHNhdmUgcmVnaXN0ZXIgb2Zmc2V0ICovCi0JbG9uZwlmcmVnbWFzazsJLyogc2F2ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBtYXNrICovCi0JbG9uZwlmcmVnb2Zmc2V0OwkvKiBzYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG9mZnNldCAqLwotCWxvbmcJZnJhbWVvZmZzZXQ7CS8qIGZyYW1lIHNpemUgKi8KLQlzaG9ydAlmcmFtZXJlZzsJLyogZnJhbWUgcG9pbnRlciByZWdpc3RlciAqLwotCXNob3J0CXBjcmVnOwkJLyogb2Zmc2V0IG9yIHJlZyBvZiByZXR1cm4gcGMgKi8KLQlsb25nCWlycHNzOwkJLyogaW5kZXggaW50byB0aGUgcnVudGltZSBzdHJpbmcgdGFibGUgKi8KLQlsb25nCXJlc2VydmVkOwotCXN0cnVjdCBleGNlcHRpb25faW5mbyAqZXhjZXB0aW9uX2luZm87LyogcG9pbnRlciB0byBleGNlcHRpb24gYXJyYXkgKi8KLX0gUlBEUiwgKnBSUERSOwotI2RlZmluZSBjYlJQRFIgc2l6ZW9mKFJQRFIpCi0jZGVmaW5lIHJwZE5pbCAoKHBSUERSKSAwKQotCi0vKiBTd2FwIFJQRFIgKHJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlIGVudHJ5KSBmb3Igb3V0cHV0LiAgKi8KLQotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9ycGRyX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgUlBEUiAqLCBzdHJ1Y3QgcnBkcl9leHQgKikpOwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9ycGRyX291dCAoYWJmZCwgaW4sIGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IFJQRFIgKmluOwotICAgICBzdHJ1Y3QgcnBkcl9leHQgKmV4OwotewotICAvKiBlY29mZl9wdXRfb2ZmIHdhcyBkZWZpbmVkIGluIGVjb2Zmc3dhcC5oLiAgKi8KLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW4tPmFkciwgKGJmZF9ieXRlICopIGV4LT5wX2Fkcik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPnJlZ21hc2ssIChiZmRfYnl0ZSAqKSBleC0+cF9yZWdtYXNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+cmVnb2Zmc2V0LCAoYmZkX2J5dGUgKikgZXgtPnBfcmVnb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+ZnJlZ21hc2ssIChiZmRfYnl0ZSAqKSBleC0+cF9mcmVnbWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPmZyZWdvZmZzZXQsIChiZmRfYnl0ZSAqKSBleC0+cF9mcmVnb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+ZnJhbWVvZmZzZXQsIChiZmRfYnl0ZSAqKSBleC0+cF9mcmFtZW9mZnNldCk7Ci0KLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+ZnJhbWVyZWcsIChiZmRfYnl0ZSAqKSBleC0+cF9mcmFtZXJlZyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnBjcmVnLCAoYmZkX2J5dGUgKikgZXgtPnBfcGNyZWcpOwotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPmlycHNzLCAoYmZkX2J5dGUgKikgZXgtPnBfaXJwc3MpOwotI2lmIDAgLyogRklYTUUgKi8KLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW4tPmV4Y2VwdGlvbl9pbmZvLCAoYmZkX2J5dGUgKikgZXgtPnBfZXhjZXB0aW9uX2luZm8pOwotI2VuZGlmCi19Ci0MCi0vKiBSZWFkIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmcm9tIGEgLm1kZWJ1ZyBzZWN0aW9uIGludG8gYQotICAgZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyAoYWJmZCwgc2VjdGlvbiwgZGVidWcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLXsKLSAgSERSUiAqc3ltaGRyOwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgY2hhciAqZXh0X2hkciA9IE5VTEw7Ci0KLSAgc3dhcCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLSAgbWVtc2V0IChkZWJ1ZywgMCwgc2l6ZW9mKCpkZWJ1ZykpOwotCi0gIGV4dF9oZHIgPSAoY2hhciAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSk7Ci0gIGlmIChleHRfaGRyID09IE5VTEwgJiYgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBleHRfaGRyLCAoZmlsZV9wdHIpIDAsCi0JCQkJc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUpCi0gICAgICA9PSBmYWxzZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgKCpzd2FwLT5zd2FwX2hkcl9pbikgKGFiZmQsIGV4dF9oZHIsIHN5bWhkcik7Ci0KLSAgLyogVGhlIHN5bWJvbGljIGhlYWRlciBjb250YWlucyBhYnNvbHV0ZSBmaWxlIG9mZnNldHMgYW5kIHNpemVzIHRvCi0gICAgIHJlYWQuICAqLwotI2RlZmluZSBSRUFEKHB0ciwgb2Zmc2V0LCBjb3VudCwgc2l6ZSwgdHlwZSkJCQkJXAotICBpZiAoc3ltaGRyLT5jb3VudCA9PSAwKQkJCQkJCVwKLSAgICBkZWJ1Zy0+cHRyID0gTlVMTDsJCQkJCQkJXAotICBlbHNlCQkJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBkZWJ1Zy0+cHRyID0gKHR5cGUpIGJmZF9tYWxsb2MgKChzaXplX3QpIChzaXplICogc3ltaGRyLT5jb3VudCkpOwlcCi0gICAgICBpZiAoZGVidWctPnB0ciA9PSBOVUxMKQkJCQkJCVwKLQlnb3RvIGVycm9yX3JldHVybjsJCQkJCQlcCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgc3ltaGRyLT5vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCVwKLQkgIHx8IChiZmRfcmVhZCAoZGVidWctPnB0ciwgc2l6ZSwgc3ltaGRyLT5jb3VudCwJCVwKLQkJCWFiZmQpICE9IHNpemUgKiBzeW1oZHItPmNvdW50KSkJCQlcCi0JZ290byBlcnJvcl9yZXR1cm47CQkJCQkJXAotICAgIH0KLQotICBSRUFEIChsaW5lLCBjYkxpbmVPZmZzZXQsIGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSwgdW5zaWduZWQgY2hhciAqKTsKLSAgUkVBRCAoZXh0ZXJuYWxfZG5yLCBjYkRuT2Zmc2V0LCBpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9wZHIsIGNiUGRPZmZzZXQsIGlwZE1heCwgc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX3N5bSwgY2JTeW1PZmZzZXQsIGlzeW1NYXgsIHN3YXAtPmV4dGVybmFsX3N5bV9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9vcHQsIGNiT3B0T2Zmc2V0LCBpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfYXV4LCBjYkF1eE9mZnNldCwgaWF1eE1heCwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSwKLQl1bmlvbiBhdXhfZXh0ICopOwotICBSRUFEIChzcywgY2JTc09mZnNldCwgaXNzTWF4LCBzaXplb2YgKGNoYXIpLCBjaGFyICopOwotICBSRUFEIChzc2V4dCwgY2JTc0V4dE9mZnNldCwgaXNzRXh0TWF4LCBzaXplb2YgKGNoYXIpLCBjaGFyICopOwotICBSRUFEIChleHRlcm5hbF9mZHIsIGNiRmRPZmZzZXQsIGlmZE1heCwgc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX3JmZCwgY2JSZmRPZmZzZXQsIGNyZmQsIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9leHQsIGNiRXh0T2Zmc2V0LCBpZXh0TWF4LCBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSwgUFRSKTsKLSN1bmRlZiBSRUFECi0KLSAgZGVidWctPmZkciA9IE5VTEw7Ci0gIGRlYnVnLT5hZGp1c3QgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZXh0X2hkciAhPSBOVUxMKQotICAgIGZyZWUgKGV4dF9oZHIpOwotICBpZiAoZGVidWctPmxpbmUgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+bGluZSk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2Rucik7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfcGRyICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX3Bkcik7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfc3ltICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX3N5bSk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX29wdCk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2F1eCk7Ci0gIGlmIChkZWJ1Zy0+c3MgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+c3MpOwotICBpZiAoZGVidWctPnNzZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPnNzZXh0KTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9mZHIgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZmRyKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9yZmQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZXh0KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogTUlQUyBFTEYgbG9jYWwgbGFiZWxzIHN0YXJ0IHdpdGggJyQnLCBub3QgJ0wnLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAobmFtZVswXSA9PSAnJCcpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogT24gSXJpeCA2LCB0aGUgbGFiZWxzIGdvIGJhY2sgdG8gc3RhcnRpbmcgd2l0aCAnLicsIHNvIHdlIGFjY2VwdAotICAgICB0aGUgZ2VuZXJpYyBFTEYgbG9jYWwgbGFiZWwgc3ludGF4IGFzIHdlbGwuICAqLwotICByZXR1cm4gX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSk7Ci19Ci0KLS8qIE1JUFMgRUxGIHVzZXMgYSBzcGVjaWFsIGZpbmRfbmVhcmVzdF9saW5lIHJvdXRpbmUgaW4gb3JkZXIgdGhlCi0gICBoYW5kbGUgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUKLXsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gZDsKLSAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSBpOwotfTsKLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlbmFtZV9wdHIsCi0JCQkJIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyOwotewotICBhc2VjdGlvbiAqbXNlYzsKLQotICBpZiAoX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKLQkJCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkgICAgIGxpbmVfcHRyKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKLQkJCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkgICAgIGxpbmVfcHRyKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubWRlYnVnIik7Ci0gIGlmIChtc2VjICE9IE5VTEwpCi0gICAgewotICAgICAgZmxhZ3dvcmQgb3JpZ2ZsYWdzOwotICAgICAgc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSAqZmk7Ci0gICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IHN3YXAgPQotCWdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLQotICAgICAgLyogSWYgd2UgYXJlIGNhbGxlZCBkdXJpbmcgYSBsaW5rLCBtaXBzX2VsZl9maW5hbF9saW5rIG1heSBoYXZlCi0JIGNsZWFyZWQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmllbGQuICBXZSBmb3JjZSBpdCBiYWNrIG9uIGhlcmUKLQkgaWYgYXBwcm9wcmlhdGUgKHdoaWNoIGl0IG5vcm1hbGx5IHdpbGwgYmUpLiAgKi8KLSAgICAgIG9yaWdmbGFncyA9IG1zZWMtPmZsYWdzOwotICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG1zZWMpLT50aGlzX2hkci5zaF90eXBlICE9IFNIVF9OT0JJVFMpCi0JbXNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQotICAgICAgZmkgPSBlbGZfdGRhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbzsKLSAgICAgIGlmIChmaSA9PSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZmRyX3NpemU7Ci0JICBjaGFyICpmcmF3X3NyYzsKLQkgIGNoYXIgKmZyYXdfZW5kOwotCSAgc3RydWN0IGZkciAqZmRyX3B0cjsKLQotCSAgZmkgPSAoKHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUgKikKLQkJYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lKSkpOwotCSAgaWYgKGZpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKCEgX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8gKGFiZmQsIG1zZWMsICZmaS0+ZCkpCi0JICAgIHsKLQkgICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogU3dhcCBpbiB0aGUgRkRSIGluZm9ybWF0aW9uLiAgKi8KLQkgIGZpLT5kLmZkciA9ICgoc3RydWN0IGZkciAqKQotCQkgICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgKGZpLT5kLnN5bWJvbGljX2hlYWRlci5pZmRNYXggKgotCQkJCSAgIHNpemVvZiAoc3RydWN0IGZkcikpKSk7Ci0JICBpZiAoZmktPmQuZmRyID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGV4dGVybmFsX2Zkcl9zaXplID0gc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemU7Ci0JICBmZHJfcHRyID0gZmktPmQuZmRyOwotCSAgZnJhd19zcmMgPSAoY2hhciAqKSBmaS0+ZC5leHRlcm5hbF9mZHI7Ci0JICBmcmF3X2VuZCA9IChmcmF3X3NyYwotCQkgICAgICArIGZpLT5kLnN5bWJvbGljX2hlYWRlci5pZmRNYXggKiBleHRlcm5hbF9mZHJfc2l6ZSk7Ci0JICBmb3IgKDsgZnJhd19zcmMgPCBmcmF3X2VuZDsgZnJhd19zcmMgKz0gZXh0ZXJuYWxfZmRyX3NpemUsIGZkcl9wdHIrKykKLQkgICAgKCpzd2FwLT5zd2FwX2Zkcl9pbikgKGFiZmQsIChQVFIpIGZyYXdfc3JjLCBmZHJfcHRyKTsKLQotCSAgZWxmX3RkYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm8gPSBmaTsKLQotCSAgLyogTm90ZSB0aGF0IHdlIGRvbid0IGJvdGhlciB0byBldmVyIGZyZWUgdGhpcyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICBmaW5kX25lYXJlc3RfbGluZSBpcyBlaXRoZXIgY2FsbGVkIGFsbCB0aGUgdGltZSwgYXMgaW4KLSAgICAgICAgICAgICBvYmpkdW1wIC1sLCBzbyB0aGUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIHNhdmVkLCBvciBpdCBpcwotICAgICAgICAgICAgIHJhcmVseSBjYWxsZWQsIGFzIGluIGxkIGVycm9yIG1lc3NhZ2VzLCBzbyB0aGUgbWVtb3J5Ci0gICAgICAgICAgICAgd2FzdGVkIGlzIHVuaW1wb3J0YW50LiAgU3RpbGwsIGl0IHdvdWxkIHByb2JhYmx5IGJlIGEKLSAgICAgICAgICAgICBnb29kIGlkZWEgZm9yIGZyZWVfY2FjaGVkX2luZm8gdG8gdGhyb3cgaXQgYXdheS4gICovCi0JfQotCi0gICAgICBpZiAoX2JmZF9lY29mZl9sb2NhdGVfbGluZSAoYWJmZCwgc2VjdGlvbiwgb2Zmc2V0LCAmZmktPmQsIHN3YXAsCi0JCQkJICAmZmktPmksIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkgIGxpbmVfcHRyKSkKLQl7Ci0JICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0gICAgfQotCi0gIC8qIEZhbGwgYmFjayBvbiB0aGUgZ2VuZXJpYyBFTEYgZmluZF9uZWFyZXN0X2xpbmUgcm91dGluZS4gICovCi0KLSAgcmV0dXJuIF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICAgICBsaW5lX3B0cik7Ci19Ci0MCi0gIC8qIFRoZSBtaXBzMTYgY29tcGlsZXIgdXNlcyBhIGNvdXBsZSBvZiBzcGVjaWFsIHNlY3Rpb25zIHRvIGhhbmRsZQotICAgICBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMuCi0KLSAgICAgU2VjdGlvbiBuYW1lcyB0aGF0IGxvb2sgbGlrZSAubWlwczE2LmZuLkZOTkFNRSBjb250YWluIHN0dWJzIHRoYXQKLSAgICAgY29weSBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMgZnJvbSB0aGUgZnAgcmVncyB0byB0aGUgZ3AgcmVncyBhbmQKLSAgICAgdGhlbiBqdW1wIHRvIEZOTkFNRS4gIElmIGFueSAzMiBiaXQgZnVuY3Rpb24gY2FsbHMgRk5OQU1FLCB0aGUKLSAgICAgY2FsbCBzaG91bGQgYmUgcmVkaXJlY3RlZCB0byB0aGUgc3R1YiBpbnN0ZWFkLiAgSWYgbm8gMzIgYml0Ci0gICAgIGZ1bmN0aW9uIGNhbGxzIEZOTkFNRSwgdGhlIHN0dWIgc2hvdWxkIGJlIGRpc2NhcmRlZC4gIFdlIG5lZWQgdG8KLSAgICAgY29uc2lkZXIgYW55IHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24sIG5vdCBqdXN0IGEgY2FsbCwgYmVjYXVzZQotICAgICBpZiB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gaXMgdGFrZW4gd2Ugd2lsbCBuZWVkIHRoZSBzdHViLAotICAgICBzaW5jZSB0aGUgYWRkcmVzcyBtaWdodCBiZSBwYXNzZWQgdG8gYSAzMiBiaXQgZnVuY3Rpb24uCi0KLSAgICAgU2VjdGlvbiBuYW1lcyB0aGF0IGxvb2sgbGlrZSAubWlwczE2LmNhbGwuRk5OQU1FIGNvbnRhaW4gc3R1YnMKLSAgICAgdGhhdCBjb3B5IGZsb2F0aW5nIHBvaW50IGFyZ3VtZW50cyBmcm9tIHRoZSBncCByZWdzIHRvIHRoZSBmcAotICAgICByZWdzIGFuZCB0aGVuIGp1bXAgdG8gRk5OQU1FLiAgSWYgRk5OQU1FIGlzIGEgMzIgYml0IGZ1bmN0aW9uLAotICAgICB0aGVuIGFueSAxNiBiaXQgZnVuY3Rpb24gdGhhdCBjYWxscyBGTk5BTUUgc2hvdWxkIGJlIHJlZGlyZWN0ZWQKLSAgICAgdG8gdGhlIHN0dWIgaW5zdGVhZC4gIElmIEZOTkFNRSBpcyBub3QgYSAzMiBiaXQgZnVuY3Rpb24sIHRoZQotICAgICBzdHViIHNob3VsZCBiZSBkaXNjYXJkZWQuCi0KLSAgICAgLm1pcHMxNi5jYWxsLmZwLkZOTkFNRSBzZWN0aW9ucyBhcmUgc2ltaWxhciwgYnV0IGNvbnRhaW4gc3R1YnMKLSAgICAgd2hpY2ggY2FsbCBGTk5BTUUgYW5kIHRoZW4gY29weSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGZwIHJlZ3MKLSAgICAgdG8gdGhlIGdwIHJlZ3MuICBUaGVzZSBzdHVicyBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlIGluICQxOCB3aGlsZQotICAgICBjYWxsaW5nIEZOTkFNRTsgYW55IGZ1bmN0aW9uIHdoaWNoIG1pZ2h0IGNhbGwgb25lIG9mIHRoZXNlIHN0dWJzCi0gICAgIG11c3QgYXJyYW5nZSB0byBzYXZlICQxOCBhcm91bmQgdGhlIGNhbGwuICAoVGhpcyBjYXNlIGlzIG5vdAotICAgICBuZWVkZWQgZm9yIDMyIGJpdCBmdW5jdGlvbnMgdGhhdCBjYWxsIDE2IGJpdCBmdW5jdGlvbnMsIGJlY2F1c2UKLSAgICAgMTYgYml0IGZ1bmN0aW9ucyBhbHdheXMgcmV0dXJuIGZsb2F0aW5nIHBvaW50IHZhbHVlcyBpbiBib3RoCi0gICAgICRmMC8kZjEgYW5kICQyLyQzLikKLQotICAgICBOb3RlIHRoYXQgaW4gYWxsIGNhc2VzIEZOTkFNRSBtaWdodCBiZSBkZWZpbmVkIHN0YXRpY2FsbHkuCi0gICAgIFRoZXJlZm9yZSwgRk5OQU1FIGlzIG5vdCB1c2VkIGxpdGVyYWxseS4gIEluc3RlYWQsIHRoZSByZWxvY2F0aW9uCi0gICAgIGluZm9ybWF0aW9uIHdpbGwgaW5kaWNhdGUgd2hpY2ggc3ltYm9sIHRoZSBzZWN0aW9uIGlzIGZvci4KLQotICAgICBXZSByZWNvcmQgYW55IHN0dWJzIHRoYXQgd2UgZmluZCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotI2RlZmluZSBGTl9TVFVCICIubWlwczE2LmZuLiIKLSNkZWZpbmUgQ0FMTF9TVFVCICIubWlwczE2LmNhbGwuIgotI2RlZmluZSBDQUxMX0ZQX1NUVUIgIi5taXBzMTYuY2FsbC5mcC4iCi0KLS8qIFRoZSBNSVBTIEVMRiBsaW5rZXIgbmVlZHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBzeW1ib2wgaW4KLSAgIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBFeHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICBFWFRSIGVzeW07Ci0KLSAgLyogTnVtYmVyIG9mIE1JUFNfMzIgb3IgTUlQU19SRUwzMiByZWxvY3MgYWdhaW5zdCB0aGlzIHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGludCBtaXBzXzMyX3JlbG9jczsKLQotICAvKiBJZiB0aGVyZSBpcyBhIHN0dWIgdGhhdCAzMiBiaXQgZnVuY3Rpb25zIHNob3VsZCB1c2UgdG8gY2FsbCB0aGlzCi0gICAgIDE2IGJpdCBmdW5jdGlvbiwgdGhpcyBwb2ludHMgdG8gdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgc3R1Yi4gICovCi0gIGFzZWN0aW9uICpmbl9zdHViOwotCi0gIC8qIFdoZXRoZXIgd2UgbmVlZCB0aGUgZm5fc3R1YjsgdGhpcyBpcyBzZXQgaWYgdGhpcyBzeW1ib2wgYXBwZWFycwotICAgICBpbiBhbnkgcmVsb2NzIG90aGVyIHRoYW4gYSAxNiBiaXQgY2FsbC4gICovCi0gIGJvb2xlYW4gbmVlZF9mbl9zdHViOwotCi0gIC8qIElmIHRoZXJlIGlzIGEgc3R1YiB0aGF0IDE2IGJpdCBmdW5jdGlvbnMgc2hvdWxkIHVzZSB0byBjYWxsIHRoaXMKLSAgICAgMzIgYml0IGZ1bmN0aW9uLCB0aGlzIHBvaW50cyB0byB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBzdHViLiAgKi8KLSAgYXNlY3Rpb24gKmNhbGxfc3R1YjsKLQotICAvKiBUaGlzIGlzIGxpa2UgdGhlIGNhbGxfc3R1YiBmaWVsZCwgYnV0IGl0IGlzIHVzZWQgaWYgdGhlIGZ1bmN0aW9uCi0gICAgIGJlaW5nIGNhbGxlZCByZXR1cm5zIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUuICAqLwotICBhc2VjdGlvbiAqY2FsbF9mcF9zdHViOwotfTsKLQotLyogTUlQUyBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0jaWYgMAotICAvKiBXZSBubyBsb25nZXIgdXNlIHRoaXMuICAqLwotICAvKiBTdHJpbmcgc2VjdGlvbiBpbmRpY2VzIGZvciB0aGUgZHluYW1pYyBzZWN0aW9uIHN5bWJvbHMuICAqLwotICBiZmRfc2l6ZV90eXBlIGR5bnN5bV9zZWNfc3RyaW5kZXhbU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTXTsKLSNlbmRpZgotICAvKiBUaGUgbnVtYmVyIG9mIC5ydHByb2MgZW50cmllcy4gICovCi0gIGJmZF9zaXplX3R5cGUgcHJvY2VkdXJlX2NvdW50OwotICAvKiBUaGUgc2l6ZSBvZiB0aGUgLmNvbXBhY3RfcmVsIHNlY3Rpb24gKGlmIFNHSV9DT01QQVQpLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBjb21wYWN0X3JlbF9zaXplOwotICAvKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIERUX01JUFNfUkxEX01BUCBkeW5hbWljCi0gICAgIGVudHJ5IGlzIHNldCB0byB0aGUgYWRkcmVzcyBvZiBfX3JsZF9vYmpfaGVhZCBhcyBpbiBJcml4IDUuICovCi0gIGJvb2xlYW4gdXNlX3JsZF9vYmpfaGVhZDsKLSAgLyogVGhpcyBpcyB0aGUgdmFsdWUgb2YgdGhlIF9fcmxkX21hcCBvciBfX3JsZF9vYmpfaGVhZCBzeW1ib2wuICAqLwotICBiZmRfdm1hIHJsZF92YWx1ZTsKLSAgLyogVGhpcyBpcyBzZXQgaWYgd2Ugc2VlIGFueSBtaXBzMTYgc3R1YiBzZWN0aW9ucy4gKi8KLSAgYm9vbGVhbiBtaXBzMTZfc3R1YnNfc2VlbjsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBNSVBTIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgbWlwc19lbGZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykJXAotICAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikJCQkJCVwKLSAgIGVsZl9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLAkJXAotCQkJIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBtaXBzX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBNSVBTIEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgbWlwc19lbGZfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfb3V0cHV0X2V4dHN5bQotICBQQVJBTVMgKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYSBNSVBTIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotbWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICBtZW1zZXQgKCZyZXQtPmVzeW0sIDAsIHNpemVvZiAoRVhUUikpOwotICAgICAgLyogV2UgdXNlIC0yIGFzIGEgbWFya2VyIHRvIGluZGljYXRlIHRoYXQgdGhlIGluZm9ybWF0aW9uIGhhcwotCSBub3QgYmVlbiBzZXQuICAtMSBtZWFucyB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIGlmZC4gICovCi0gICAgICByZXQtPmVzeW0uaWZkID0gLTI7Ci0gICAgICByZXQtPm1pcHNfMzJfcmVsb2NzID0gMDsKLSAgICAgIHJldC0+Zm5fc3R1YiA9IE5VTEw7Ci0gICAgICByZXQtPm5lZWRfZm5fc3R1YiA9IGZhbHNlOwotICAgICAgcmV0LT5jYWxsX3N0dWIgPSBOVUxMOwotICAgICAgcmV0LT5jYWxsX2ZwX3N0dWIgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLW1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgICBtaXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSNpZiAwCi0gIC8qIFdlIG5vIGxvbmdlciB1c2UgdGhpcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVM7IGkrKykKLSAgICByZXQtPmR5bnN5bV9zZWNfc3RyaW5kZXhbaV0gPSAoYmZkX3NpemVfdHlwZSkgLTE7Ci0jZW5kaWYKLSAgcmV0LT5wcm9jZWR1cmVfY291bnQgPSAwOwotICByZXQtPmNvbXBhY3RfcmVsX3NpemUgPSAwOwotICByZXQtPnVzZV9ybGRfb2JqX2hlYWQgPSBmYWxzZTsKLSAgcmV0LT5ybGRfdmFsdWUgPSAwOwotICByZXQtPm1pcHMxNl9zdHVic19zZWVuID0gZmFsc2U7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogSG9vayBjYWxsZWQgYnkgdGhlIGxpbmtlciByb3V0aW5lIHdoaWNoIGFkZHMgc3ltYm9scyBmcm9tIGFuIG9iamVjdAotICAgZmlsZS4gIFdlIG11c3QgaGFuZGxlIHRoZSBzcGVjaWFsIE1JUFMgc2VjdGlvbiBudW1iZXJzIGhlcmUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9hZGRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIHN5bSwgbmFtZXAsIGZsYWdzcCwgc2VjcCwgdmFscCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBjb25zdCBjaGFyICoqbmFtZXA7Ci0gICAgIGZsYWd3b3JkICpmbGFnc3A7Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYmZkX3ZtYSAqdmFscDsKLXsKLSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpCi0gICAgICAmJiAoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0gICAgICAmJiBzdHJjbXAgKCpuYW1lcCwgIl9ybGRfbmV3X2ludGVyZmFjZSIpID09IDApCi0gICAgewotICAgICAgLyogU2tpcCBJcml4IDUgcmxkIGVudHJ5IG5hbWUuICAqLwotICAgICAgKm5hbWVwID0gTlVMTDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBzd2l0Y2ggKHN5bS0+c3Rfc2huZHgpCi0gICAgewotICAgIGNhc2UgU0hOX0NPTU1PTjoKLSAgICAgIC8qIENvbW1vbiBzeW1ib2xzIGxlc3MgdGhhbiB0aGUgR1Agc2l6ZSBhcmUgYXV0b21hdGljYWxseQotCSB0cmVhdGVkIGFzIFNITl9NSVBTX1NDT01NT04gc3ltYm9scy4gICovCi0gICAgICBpZiAoc3ltLT5zdF9zaXplID4gZWxmX2dwX3NpemUgKGFiZmQpKQotCWJyZWFrOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIFNITl9NSVBTX1NDT01NT046Ci0gICAgICAqc2VjcCA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5zY29tbW9uIik7Ci0gICAgICAoKnNlY3ApLT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hOX01JUFNfVEVYVDoKLSAgICAgIC8qIFRoaXMgc2VjdGlvbiBpcyB1c2VkIGluIGEgc2hhcmVkIG9iamVjdC4gICovCi0gICAgICBpZiAobWlwc19lbGZfdGV4dF9zZWN0aW9uX3B0ciA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHNlY3Rpb24uICAqLwotCSAgbWlwc19lbGZfdGV4dF9zZWN0aW9uLm5hbWUgPSAiLnRleHQiOwotCSAgbWlwc19lbGZfdGV4dF9zZWN0aW9uLmZsYWdzID0gU0VDX05PX0ZMQUdTOwotCSAgbWlwc19lbGZfdGV4dF9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gTlVMTDsKLQkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbi5zeW1ib2wgPSAmbWlwc19lbGZfdGV4dF9zeW1ib2w7Ci0JICBtaXBzX2VsZl90ZXh0X3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmbWlwc19lbGZfdGV4dF9zeW1ib2xfcHRyOwotCSAgbWlwc19lbGZfdGV4dF9zeW1ib2wubmFtZSA9ICIudGV4dCI7Ci0JICBtaXBzX2VsZl90ZXh0X3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIG1pcHNfZWxmX3RleHRfc3ltYm9sLnNlY3Rpb24gPSAmbWlwc19lbGZfdGV4dF9zZWN0aW9uOwotCSAgbWlwc19lbGZfdGV4dF9zeW1ib2xfcHRyID0gJm1pcHNfZWxmX3RleHRfc3ltYm9sOwotCSAgbWlwc19lbGZfdGV4dF9zZWN0aW9uX3B0ciA9ICZtaXBzX2VsZl90ZXh0X3NlY3Rpb247Ci0JfQotICAgICAgLyogVGhpcyBjb2RlIHVzZWQgdG8gZG8gKnNlY3AgPSBiZmRfdW5kX3NlY3Rpb25fcHRyIGlmCi0gICAgICAgICBpbmZvLT5zaGFyZWQuICBJIGRvbid0IGtub3cgd2h5LCBhbmQgdGhhdCBkb2Vzbid0IG1ha2Ugc2Vuc2UsCi0gICAgICAgICBzbyBJIHRvb2sgaXQgb3V0LiAgKi8KLSAgICAgICpzZWNwID0gbWlwc19lbGZfdGV4dF9zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19BQ09NTU9OOgotICAgICAgLyogRmFsbCB0aHJvdWdoLiBYWFggQ2FuIHdlIHRyZWF0IHRoaXMgYXMgYWxsb2NhdGVkIGRhdGE/ICAqLwotICAgIGNhc2UgU0hOX01JUFNfREFUQToKLSAgICAgIC8qIFRoaXMgc2VjdGlvbiBpcyB1c2VkIGluIGEgc2hhcmVkIG9iamVjdC4gICovCi0gICAgICBpZiAobWlwc19lbGZfZGF0YV9zZWN0aW9uX3B0ciA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHNlY3Rpb24uICAqLwotCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uLm5hbWUgPSAiLmRhdGEiOwotCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uLmZsYWdzID0gU0VDX05PX0ZMQUdTOwotCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gTlVMTDsKLQkgIG1pcHNfZWxmX2RhdGFfc2VjdGlvbi5zeW1ib2wgPSAmbWlwc19lbGZfZGF0YV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9kYXRhX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmbWlwc19lbGZfZGF0YV9zeW1ib2xfcHRyOwotCSAgbWlwc19lbGZfZGF0YV9zeW1ib2wubmFtZSA9ICIuZGF0YSI7Ci0JICBtaXBzX2VsZl9kYXRhX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIG1pcHNfZWxmX2RhdGFfc3ltYm9sLnNlY3Rpb24gPSAmbWlwc19lbGZfZGF0YV9zZWN0aW9uOwotCSAgbWlwc19lbGZfZGF0YV9zeW1ib2xfcHRyID0gJm1pcHNfZWxmX2RhdGFfc3ltYm9sOwotCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uX3B0ciA9ICZtaXBzX2VsZl9kYXRhX3NlY3Rpb247Ci0JfQotICAgICAgLyogVGhpcyBjb2RlIHVzZWQgdG8gZG8gKnNlY3AgPSBiZmRfdW5kX3NlY3Rpb25fcHRyIGlmCi0gICAgICAgICBpbmZvLT5zaGFyZWQuICBJIGRvbid0IGtub3cgd2h5LCBhbmQgdGhhdCBkb2Vzbid0IG1ha2Ugc2Vuc2UsCi0gICAgICAgICBzbyBJIHRvb2sgaXQgb3V0LiAgKi8KLSAgICAgICpzZWNwID0gbWlwc19lbGZfZGF0YV9zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19TVU5ERUZJTkVEOgotICAgICAgKnNlY3AgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChTR0lfQ09NUEFUIChhYmZkKQotICAgICAgJiYgISBpbmZvLT5zaGFyZWQKLSAgICAgICYmIGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYwotICAgICAgJiYgc3RyY21wICgqbmFtZXAsICJfX3JsZF9vYmpfaGVhZCIpID09IDApCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIC8qIE1hcmsgX19ybGRfb2JqX2hlYWQgYXMgZHluYW1pYy4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGFiZmQsICpuYW1lcCwgQlNGX0dMT0JBTCwgKnNlY3AsCi0JICAgICAgKGJmZF92bWEpICp2YWxwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkgICAgICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JICAgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gICAgICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotICAgICAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT51c2VfcmxkX29ial9oZWFkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIG1pcHMxNiB0ZXh0IHN5bWJvbCwgYWRkIDEgdG8gdGhlIHZhbHVlIHRvIG1ha2UgaXQKLSAgICAgb2RkLiAgVGhpcyB3aWxsIGNhdXNlIHNvbWV0aGluZyBsaWtlIC53b3JkIFNZTSB0byBjb21lIHVwIHdpdGgKLSAgICAgdGhlIHJpZ2h0IHZhbHVlIHdoZW4gaXQgaXMgbG9hZGVkIGludG8gdGhlIFBDLiAgKi8KLSAgaWYgKHN5bS0+c3Rfb3RoZXIgPT0gU1RPX01JUFMxNikKLSAgICArKyp2YWxwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdHJ1Y3R1cmUgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIG1pcHNfZWxmX291dHB1dF9leHRzeW0uICAqLwotCi1zdHJ1Y3QgZXh0c3ltX2luZm8KLXsKLSAgYmZkICphYmZkOwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgYm9vbGVhbiBmYWlsZWQ7Ci19OwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byB3cml0ZSBvdXQgRUNPRkYgZGVidWdnaW5nIGV4dGVybmFsIHN5bWJvbAotICAgaW5mb3JtYXRpb24uICBJdCBpcyBjYWxsZWQgdmlhIG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gIFRoZQotICAgRUNPRkYgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uIG11c3QgbWF0Y2ggdGhlIEVMRiBleHRlcm5hbAotICAgc3ltYm9sIGluZm9ybWF0aW9uLiAgVW5mb3J0dW5hdGVseSwgYXQgdGhpcyBwb2ludCB3ZSBkb24ndCBrbm93Ci0gICB3aGV0aGVyIGEgc3ltYm9sIGlzIHJlcXVpcmVkIGJ5IHJlbG9jIGluZm9ybWF0aW9uLCBzbyB0aGUgdHdvCi0gICB0YWJsZXMgbWF5IHdpbmQgdXAgYmVpbmcgZGlmZmVyZW50LiAgV2UgbXVzdCBzb3J0IG91dCB0aGUgZXh0ZXJuYWwKLSAgIHN5bWJvbCBpbmZvcm1hdGlvbiBiZWZvcmUgd2UgY2FuIHNldCB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgLm1kZWJ1ZwotICAgc2VjdGlvbiwgYW5kIHdlIG11c3Qgc2V0IHRoZSBzaXplIG9mIHRoZSAubWRlYnVnIHNlY3Rpb24gYmVmb3JlIHdlCi0gICBjYW4gcmVsb2NhdGUgYW55IHNlY3Rpb25zLCBhbmQgd2UgY2FuJ3Qga25vdyB3aGljaCBzeW1ib2xzIGFyZQotICAgcmVxdWlyZWQgYnkgcmVsb2NhdGlvbiB1bnRpbCB3ZSByZWxvY2F0ZSB0aGUgc2VjdGlvbnMuCi0gICBGb3J0dW5hdGVseSwgaXQgaXMgcmVsYXRpdmVseSB1bmxpa2VseSB0aGF0IGFueSBzeW1ib2wgd2lsbCBiZQotICAgc3RyaXBwZWQgYnV0IHJlcXVpcmVkIGJ5IGEgcmVsb2MuICBJbiBwYXJ0aWN1bGFyLCBpdCBjYW4gbm90IGhhcHBlbgotICAgd2hlbiBnZW5lcmF0aW5nIGEgZmluYWwgZXhlY3V0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9vdXRwdXRfZXh0c3ltIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGV4dHN5bV9pbmZvICplaW5mbyA9IChzdHJ1Y3QgZXh0c3ltX2luZm8gKikgZGF0YTsKLSAgYm9vbGVhbiBzdHJpcDsKLSAgYXNlY3Rpb24gKnNlYywgKm91dHB1dF9zZWN0aW9uOwotCi0gIGlmIChoLT5yb290LmluZHggPT0gLTIpCi0gICAgc3RyaXAgPSBmYWxzZTsKLSAgZWxzZSBpZiAoKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JICAgIHx8IChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSAhPSAwKQotCSAgICYmIChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwCi0JICAgJiYgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpID09IDApCi0gICAgc3RyaXAgPSB0cnVlOwotICBlbHNlIGlmIChlaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0JICAgfHwgKGVpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgICYmIGJmZF9oYXNoX2xvb2t1cCAoZWluZm8tPmluZm8tPmtlZXBfaGFzaCwKLQkJCQkgICBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJICAgZmFsc2UsIGZhbHNlKSA9PSBOVUxMKSkKLSAgICBzdHJpcCA9IHRydWU7Ci0gIGVsc2UKLSAgICBzdHJpcCA9IGZhbHNlOwotCi0gIGlmIChzdHJpcCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoaC0+ZXN5bS5pZmQgPT0gLTIpCi0gICAgewotICAgICAgaC0+ZXN5bS5qbXB0YmwgPSAwOwotICAgICAgaC0+ZXN5bS5jb2JvbF9tYWluID0gMDsKLSAgICAgIGgtPmVzeW0ud2Vha2V4dCA9IDA7Ci0gICAgICBoLT5lc3ltLnJlc2VydmVkID0gMDsKLSAgICAgIGgtPmVzeW0uaWZkID0gaWZkTmlsOwotICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0R2xvYmFsOwotCi0gICAgICBpZiAoU0dJX0NPTVBBVCAoZWluZm8tPmFiZmQpCi0JICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgLyogVXNlIHVuZGVmaW5lZCBjbGFzcy4gIEFsc28sIHNldCBjbGFzcyBhbmQgdHlwZSBmb3Igc29tZQotICAgICAgICAgICAgIHNwZWNpYWwgc3ltYm9scy4gICovCi0JICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCSAgaWYgKHN0cmNtcCAobmFtZSwgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1swXSkgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAobmFtZSwgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1sxXSkgPT0gMCkKLQkgICAgewotCSAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjRGF0YTsKLQkgICAgICBoLT5lc3ltLmFzeW0uc3QgPSBzdExhYmVsOwotCSAgICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1syXSkgPT0gMCkKLQkgICAgewotCSAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotCSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0TGFiZWw7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0KLQkJbWlwc19lbGZfaGFzaF90YWJsZSAoZWluZm8tPmluZm8pLT5wcm9jZWR1cmVfY291bnQ7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIl9ncF9kaXNwIikgPT0gMCkKLQkgICAgewotCSAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotCSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0TGFiZWw7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gZWxmX2dwIChlaW5mby0+YWJmZCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NVbmRlZmluZWQ7Ci0JfQotICAgICAgZWxzZSBpZiAoaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0gICAgICBlbHNlCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0JICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgIC8qIFdoZW4gbWFraW5nIGEgc2hhcmVkIGxpYnJhcnkgYW5kIHN5bWJvbCBoIGlzIHRoZSBvbmUgZnJvbQotCSAgICAgdGhlIGFub3RoZXIgc2hhcmVkIGxpYnJhcnksIE9VVFBVVF9TRUNUSU9OIG1heSBiZSBudWxsLiAgKi8KLQkgIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1VuZGVmaW5lZDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChvdXRwdXRfc2VjdGlvbi0+b3duZXIsIG91dHB1dF9zZWN0aW9uKTsKLQotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIudGV4dCIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjVGV4dDsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZGF0YSIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjRGF0YTsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwKQotCQloLT5lc3ltLmFzeW0uc2MgPSBzY1NEYXRhOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yb2RhdGEiKSA9PSAwCi0JCSAgICAgICB8fCBzdHJjbXAgKG5hbWUsICIucmRhdGEiKSA9PSAwKQotCQloLT5lc3ltLmFzeW0uc2MgPSBzY1JEYXRhOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5ic3MiKSA9PSAwKQotCQloLT5lc3ltLmFzeW0uc2MgPSBzY0JzczsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjU0JzczsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaW5pdCIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjSW5pdDsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjRmluaTsKLQkgICAgICBlbHNlCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotCSAgICB9Ci0JfQotCi0gICAgICBoLT5lc3ltLmFzeW0ucmVzZXJ2ZWQgPSAwOwotICAgICAgaC0+ZXN5bS5hc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0gICAgfQotCi0gIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSBoLT5yb290LnJvb3QudS5jLnNpemU7Ci0gIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICB7Ci0gICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjQ29tbW9uKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOwotICAgICAgZWxzZSBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjU0NvbW1vbikKLQloLT5lc3ltLmFzeW0uc2MgPSBzY1NCc3M7Ci0KLSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgb3V0cHV0X3NlY3Rpb24gPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotICAgICAgaWYgKG91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0JaC0+ZXN5bS5hc3ltLnZhbHVlID0gKGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgICsgb3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0gICAgICBlbHNlCi0JaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdHlwZSBhbmQgdmFsdWUgZm9yIGEgc3ltYm9sIHdpdGggYSBmdW5jdGlvbiBzdHViLiAgKi8KLSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0UHJvYzsKLSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaWYgKHNlYyA9PSBOVUxMKQotCWgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgb3V0cHV0X3NlY3Rpb24gPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCSAgaWYgKG91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0JICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IChoLT5yb290LnBsdC5vZmZzZXQKLQkJCQkgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICArIG91dHB1dF9zZWN0aW9uLT52bWEpOwotCSAgZWxzZQotCSAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotCX0KLSNpZiAwIC8qIEZJWE1FPyAgKi8KLSAgICAgIGgtPmVzeW0uaWZkID0gMDsKLSNlbmRpZgotICAgIH0KLQotICBpZiAoISBiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsIChlaW5mby0+YWJmZCwgZWluZm8tPmRlYnVnLCBlaW5mby0+c3dhcCwKLQkJCQkgICAgICBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJICAgICAgJmgtPmVzeW0pKQotICAgIHsKLSAgICAgIGVpbmZvLT5mYWlsZWQgPSB0cnVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIGEgcnVudGltZSBwcm9jZWR1cmUgdGFibGUgZnJvbSB0aGUgLm1kZWJ1ZyBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2NyZWF0ZV9wcm9jZWR1cmVfdGFibGUgKGhhbmRsZSwgYWJmZCwgaW5mbywgcywgZGVidWcpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICBIRFJSICpoZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgUlBEUiAqcnBkciwgKnJwOwotICBzdHJ1Y3QgcnBkcl9leHQgKmVycDsKLSAgUFRSIHJ0cHJvYzsKLSAgc3RydWN0IHBkcl9leHQgKmVwZHI7Ci0gIHN0cnVjdCBzeW1fZXh0ICplc3ltOwotICBjaGFyICpzcywgKipzdjsKLSAgY2hhciAqc3RyOwotICB1bnNpZ25lZCBsb25nIHNpemUsIGNvdW50OwotICB1bnNpZ25lZCBsb25nIHNpbmRleDsKLSAgdW5zaWduZWQgbG9uZyBpOwotICBQRFIgcGRyOwotICBTWU1SIHN5bTsKLSAgY29uc3QgY2hhciAqbm9fbmFtZV9mdW5jID0gXygic3RhdGljIHByb2NlZHVyZSAobm8gbmFtZSkiKTsKLQotICBlcGRyID0gTlVMTDsKLSAgcnBkciA9IE5VTEw7Ci0gIGVzeW0gPSBOVUxMOwotICBzcyA9IE5VTEw7Ci0gIHN2ID0gTlVMTDsKLQotICBzd2FwID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwOwotCi0gIHNpbmRleCA9IHN0cmxlbiAobm9fbmFtZV9mdW5jKSArIDE7Ci0gIGNvdW50ID0gaGRyLT5pcGRNYXg7Ci0gIGlmIChjb3VudCA+IDApCi0gICAgewotICAgICAgc2l6ZSA9IHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplOwotCi0gICAgICBlcGRyID0gKHN0cnVjdCBwZHJfZXh0ICopIGJmZF9tYWxsb2MgKHNpemUgKiBjb3VudCk7Ci0gICAgICBpZiAoZXBkciA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoISBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9wZHIgKGhhbmRsZSwgKFBUUikgZXBkcikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNpemUgPSBzaXplb2YgKFJQRFIpOwotICAgICAgcnAgPSBycGRyID0gKFJQRFIgKikgYmZkX21hbGxvYyAoc2l6ZSAqIGNvdW50KTsKLSAgICAgIGlmIChycGRyID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHN2ID0gKGNoYXIgKiopIGJmZF9tYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqIGNvdW50KTsKLSAgICAgIGlmIChzdiA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBjb3VudCA9IGhkci0+aXN5bU1heDsKLSAgICAgIHNpemUgPSBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZTsKLSAgICAgIGVzeW0gPSAoc3RydWN0IHN5bV9leHQgKikgYmZkX21hbGxvYyAoc2l6ZSAqIGNvdW50KTsKLSAgICAgIGlmIChlc3ltID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmICghIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3N5bSAoaGFuZGxlLCAoUFRSKSBlc3ltKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgY291bnQgPSBoZHItPmlzc01heDsKLSAgICAgIHNzID0gKGNoYXIgKikgYmZkX21hbGxvYyAoY291bnQpOwotICAgICAgaWYgKHNzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoISBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zcyAoaGFuZGxlLCAoUFRSKSBzcykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGNvdW50ID0gaGRyLT5pcGRNYXg7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgcnArKykKLQl7Ci0JICAoKnN3YXAtPnN3YXBfcGRyX2luKSAoYWJmZCwgKFBUUikgKGVwZHIgKyBpKSwgJnBkcik7Ci0JICAoKnN3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgKFBUUikgJmVzeW1bcGRyLmlzeW1dLCAmc3ltKTsKLQkgIHJwLT5hZHIgPSBzeW0udmFsdWU7Ci0JICBycC0+cmVnbWFzayA9IHBkci5yZWdtYXNrOwotCSAgcnAtPnJlZ29mZnNldCA9IHBkci5yZWdvZmZzZXQ7Ci0JICBycC0+ZnJlZ21hc2sgPSBwZHIuZnJlZ21hc2s7Ci0JICBycC0+ZnJlZ29mZnNldCA9IHBkci5mcmVnb2Zmc2V0OwotCSAgcnAtPmZyYW1lb2Zmc2V0ID0gcGRyLmZyYW1lb2Zmc2V0OwotCSAgcnAtPmZyYW1lcmVnID0gcGRyLmZyYW1lcmVnOwotCSAgcnAtPnBjcmVnID0gcGRyLnBjcmVnOwotCSAgcnAtPmlycHNzID0gc2luZGV4OwotCSAgc3ZbaV0gPSBzcyArIHN5bS5pc3M7Ci0JICBzaW5kZXggKz0gc3RybGVuIChzdltpXSkgKyAxOwotCX0KLSAgICB9Ci0KLSAgc2l6ZSA9IHNpemVvZiAoc3RydWN0IHJwZHJfZXh0KSAqIChjb3VudCArIDIpICsgc2luZGV4OwotICBzaXplID0gQkZEX0FMSUdOIChzaXplLCAxNik7Ci0gIHJ0cHJvYyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gIGlmIChydHByb2MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+cHJvY2VkdXJlX2NvdW50ID0gMDsKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+cHJvY2VkdXJlX2NvdW50ID0gY291bnQgKyAyOwotCi0gIGVycCA9IChzdHJ1Y3QgcnBkcl9leHQgKikgcnRwcm9jOwotICBtZW1zZXQgKGVycCwgMCwgc2l6ZW9mIChzdHJ1Y3QgcnBkcl9leHQpKTsKLSAgZXJwKys7Ci0gIHN0ciA9IChjaGFyICopIHJ0cHJvYyArIHNpemVvZiAoc3RydWN0IHJwZHJfZXh0KSAqIChjb3VudCArIDIpOwotICBzdHJjcHkgKHN0ciwgbm9fbmFtZV9mdW5jKTsKLSAgc3RyICs9IHN0cmxlbiAobm9fbmFtZV9mdW5jKSArIDE7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGVjb2ZmX3N3YXBfcnBkcl9vdXQgKGFiZmQsIHJwZHIgKyBpLCBlcnAgKyBpKTsKLSAgICAgIHN0cmNweSAoc3RyLCBzdltpXSk7Ci0gICAgICBzdHIgKz0gc3RybGVuIChzdltpXSkgKyAxOwotICAgIH0KLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgKGJmZF92bWEpIC0xLCAoYmZkX2J5dGUgKikgKGVycCArIGNvdW50KS0+cF9hZHIpOwotCi0gIC8qIFNldCB0aGUgc2l6ZSBhbmQgY29udGVudHMgb2YgLnJ0cHJvYyBzZWN0aW9uLiAgKi8KLSAgcy0+X3Jhd19zaXplID0gc2l6ZTsKLSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgcnRwcm9jOwotCi0gIC8qIFNraXAgdGhpcyBzZWN0aW9uIGxhdGVyIG9uIChJIGRvbid0IHRoaW5rIHRoaXMgY3VycmVudGx5Ci0gICAgIG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0gIHMtPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQotICBpZiAoZXBkciAhPSBOVUxMKQotICAgIGZyZWUgKGVwZHIpOwotICBpZiAocnBkciAhPSBOVUxMKQotICAgIGZyZWUgKHJwZHIpOwotICBpZiAoZXN5bSAhPSBOVUxMKQotICAgIGZyZWUgKGVzeW0pOwotICBpZiAoc3MgIT0gTlVMTCkKLSAgICBmcmVlIChzcyk7Ci0gIGlmIChzdiAhPSBOVUxMKQotICAgIGZyZWUgKHN2KTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGVwZHIgIT0gTlVMTCkKLSAgICBmcmVlIChlcGRyKTsKLSAgaWYgKHJwZHIgIT0gTlVMTCkKLSAgICBmcmVlIChycGRyKTsKLSAgaWYgKGVzeW0gIT0gTlVMTCkKLSAgICBmcmVlIChlc3ltKTsKLSAgaWYgKHNzICE9IE5VTEwpCi0gICAgZnJlZSAoc3MpOwotICBpZiAoc3YgIT0gTlVMTCkKLSAgICBmcmVlIChzdik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQSBjb21wYXJpc29uIHJvdXRpbmUgdXNlZCB0byBzb3J0IC5ncHRhYiBlbnRyaWVzLiAgKi8KLQotc3RhdGljIGludAotZ3B0YWJfY29tcGFyZSAocDEsIHAyKQotICAgICBjb25zdCBQVFIgcDE7Ci0gICAgIGNvbnN0IFBUUiBwMjsKLXsKLSAgY29uc3QgRWxmMzJfZ3B0YWIgKmExID0gKGNvbnN0IEVsZjMyX2dwdGFiICopIHAxOwotICBjb25zdCBFbGYzMl9ncHRhYiAqYTIgPSAoY29uc3QgRWxmMzJfZ3B0YWIgKikgcDI7Ci0KLSAgcmV0dXJuIGExLT5ndF9lbnRyeS5ndF9nX3ZhbHVlIC0gYTItPmd0X2VudHJ5Lmd0X2dfdmFsdWU7Ci19Ci0KLS8qIFdlIG5lZWQgdG8gdXNlIGEgc3BlY2lhbCBsaW5rIHJvdXRpbmUgdG8gaGFuZGxlIHRoZSAucmVnaW5mbyBhbmQKLSAgIHRoZSAubWRlYnVnIHNlY3Rpb25zLiAgV2UgbmVlZCB0byBtZXJnZSBhbGwgaW5zdGFuY2VzIG9mIHRoZXNlCi0gICBzZWN0aW9ucyB0b2dldGhlciwgbm90IHdyaXRlIHRoZW0gYWxsIG91dCBzZXF1ZW50aWFsbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKipzZWNwcDsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgYXNlY3Rpb24gKnJlZ2luZm9fc2VjLCAqbWRlYnVnX3NlYywgKmdwdGFiX2RhdGFfc2VjLCAqZ3B0YWJfYnNzX3NlYzsKLSAgYXNlY3Rpb24gKnJ0cHJvY19zZWM7Ci0gIEVsZjMyX1JlZ0luZm8gcmVnaW5mbzsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gZGVidWc7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwCi0gICAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0gIEhEUlIgKnN5bWhkciA9ICZkZWJ1Zy5zeW1ib2xpY19oZWFkZXI7Ci0gIFBUUiBtZGVidWdfaGFuZGxlID0gTlVMTDsKLQotICAvKiBEcm9wIHRoZSAub3B0aW9ucyBzZWN0aW9uLCBzaW5jZSBpdCBoYXMgc3BlY2lhbCBzZW1hbnRpY3Mgd2hpY2ggSQotICAgICBoYXZlbid0IGJvdGhlcmVkIHRvIGZpZ3VyZSBvdXQuICAqLwotICBmb3IgKHNlY3BwID0gJmFiZmQtPnNlY3Rpb25zOyAqc2VjcHAgIT0gTlVMTDsgc2VjcHAgPSAmKCpzZWNwcCktPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoKCpzZWNwcCktPm5hbWUsICIub3B0aW9ucyIpID09IDApCi0JewotCSAgZm9yIChwID0gKCpzZWNwcCktPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQkgICAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JICAgICAgcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkgICgqc2VjcHApLT5saW5rX29yZGVyX2hlYWQgPSBOVUxMOwotCSAgKnNlY3BwID0gKCpzZWNwcCktPm5leHQ7Ci0JICAtLWFiZmQtPnNlY3Rpb25fY291bnQ7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIEdldCBhIHZhbHVlIGZvciB0aGUgR1AgcmVnaXN0ZXIuICAqLwotICBpZiAoZWxmX2dwIChhYmZkKSA9PSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfZ3AiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCWVsZl9ncCAoYWJmZCkgPSAoaC0+dS5kZWYudmFsdWUKLQkJCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIGJmZF92bWEgbG87Ci0KLQkgIC8qIE1ha2UgdXAgYSB2YWx1ZS4gICovCi0JICBsbyA9IChiZmRfdm1hKSAtMTsKLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChvLT52bWEgPCBsbwotCQkgICYmIChzdHJjbXAgKG8tPm5hbWUsICIuc2JzcyIpID09IDAKLQkJICAgICAgfHwgc3RyY21wIChvLT5uYW1lLCAiLnNkYXRhIikgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKG8tPm5hbWUsICIubGl0NCIpID09IDAKLQkJICAgICAgfHwgc3RyY21wIChvLT5uYW1lLCAiLmxpdDgiKSA9PSAwKSkKLQkJbG8gPSBvLT52bWE7Ci0JICAgIH0KLQkgIGVsZl9ncCAoYWJmZCkgPSBsbyArIEVMRl9NSVBTX0dQX09GRlNFVCAoYWJmZCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIElmIHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uIG5lZWRzIHRvIGRvIGEgcmVsb2MKLQkgICAgIGludm9sdmluZyB0aGUgR1AgdmFsdWUsIGl0IHNob3VsZCBtYWtlIGEgcmVsb2NfZGFuZ2Vyb3VzCi0JICAgICBjYWxsYmFjayB0byB3YXJuIHRoYXQgR1AgaXMgbm90IGRlZmluZWQuICAqLwotCX0KLSAgICB9Ci0KLSAgLyogR28gdGhyb3VnaCB0aGUgc2VjdGlvbnMgYW5kIGNvbGxlY3QgdGhlIC5yZWdpbmZvIGFuZCAubWRlYnVnCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgcmVnaW5mb19zZWMgPSBOVUxMOwotICBtZGVidWdfc2VjID0gTlVMTDsKLSAgZ3B0YWJfZGF0YV9zZWMgPSBOVUxMOwotICBncHRhYl9ic3Nfc2VjID0gTlVMTDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIucmVnaW5mbyIpID09IDApCi0JewotCSAgbWVtc2V0ICgmcmVnaW5mbywgMCwgc2l6ZW9mIHJlZ2luZm8pOwotCi0JICAvKiBXZSBoYXZlIGZvdW5kIHRoZSAucmVnaW5mbyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4KLQkgICAgIExvb2sgdGhyb3VnaCBhbGwgdGhlIGxpbmtfb3JkZXJzIGNvbXByaXNpbmcgaXQgYW5kIG1lcmdlCi0JICAgICB0aGUgaW5mb3JtYXRpb24gdG9nZXRoZXIuICAqLwotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkgICAgICBiZmQgKmlucHV0X2JmZDsKLQkgICAgICBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvIGV4dDsKLQkgICAgICBFbGYzMl9SZWdJbmZvIHN1YjsKLQotCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQl7Ci0JCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJICAgIGNvbnRpbnVlOwotCQkgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0JICAgICAgLyogVGhlIGxpbmtlciBlbXVsYXRpb24gY29kZSBoYXMgcHJvYmFibHkgY2xvYmJlcmVkIHRoZQotICAgICAgICAgICAgICAgICBzaXplIHRvIGJlIHplcm8gYnl0ZXMuICAqLwotCSAgICAgIGlmIChpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUgPT0gMCkKLQkJaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplID0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKTsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgICAoUFRSKSAmZXh0LAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJCSAgICAgIHNpemVvZiBleHQpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9faW4gKGlucHV0X2JmZCwgJmV4dCwgJnN1Yik7Ci0KLQkgICAgICByZWdpbmZvLnJpX2dwcm1hc2sgfD0gc3ViLnJpX2dwcm1hc2s7Ci0JICAgICAgcmVnaW5mby5yaV9jcHJtYXNrWzBdIHw9IHN1Yi5yaV9jcHJtYXNrWzBdOwotCSAgICAgIHJlZ2luZm8ucmlfY3BybWFza1sxXSB8PSBzdWIucmlfY3BybWFza1sxXTsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbMl0gfD0gc3ViLnJpX2Nwcm1hc2tbMl07Ci0JICAgICAgcmVnaW5mby5yaV9jcHJtYXNrWzNdIHw9IHN1Yi5yaV9jcHJtYXNrWzNdOwotCi0JICAgICAgLyogcmlfZ3BfdmFsdWUgaXMgc2V0IGJ5IHRoZSBmdW5jdGlvbgotCQkgbWlwc19lbGYzMl9zZWN0aW9uX3Byb2Nlc3Npbmcgd2hlbiB0aGUgc2VjdGlvbiBpcwotCQkgZmluYWxseSB3cml0dGVuIG91dC4gICovCi0KLQkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotCSAgLyogU2l6ZSBoYXMgYmVlbiBzZXQgaW4gbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMgICovCi0JICBCRkRfQVNTRVJUKG8tPl9yYXdfc2l6ZSA9PSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pKTsKLQotCSAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKLQkgICAgIG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0KLQkgIHJlZ2luZm9fc2VjID0gbzsKLQl9Ci0KLSAgICAgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIubWRlYnVnIikgPT0gMCkKLQl7Ci0JICBzdHJ1Y3QgZXh0c3ltX2luZm8gZWluZm87Ci0KLQkgIC8qIFdlIGhhdmUgZm91bmQgdGhlIC5tZGVidWcgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuCi0JICAgICBMb29rIHRocm91Z2ggYWxsIHRoZSBsaW5rX29yZGVycyBjb21wcmlzaW5nIGl0IGFuZCBtZXJnZQotCSAgICAgdGhlIGluZm9ybWF0aW9uIHRvZ2V0aGVyLiAgKi8KLQkgIHN5bWhkci0+bWFnaWMgPSBzd2FwLT5zeW1fbWFnaWM7Ci0JICAvKiBGSVhNRTogV2hhdCBzaG91bGQgdGhlIHZlcnNpb24gc3RhbXAgYmU/ICAqLwotCSAgc3ltaGRyLT52c3RhbXAgPSAwOwotCSAgc3ltaGRyLT5pbGluZU1heCA9IDA7Ci0JICBzeW1oZHItPmNiTGluZSA9IDA7Ci0JICBzeW1oZHItPmlkbk1heCA9IDA7Ci0JICBzeW1oZHItPmlwZE1heCA9IDA7Ci0JICBzeW1oZHItPmlzeW1NYXggPSAwOwotCSAgc3ltaGRyLT5pb3B0TWF4ID0gMDsKLQkgIHN5bWhkci0+aWF1eE1heCA9IDA7Ci0JICBzeW1oZHItPmlzc01heCA9IDA7Ci0JICBzeW1oZHItPmlzc0V4dE1heCA9IDA7Ci0JICBzeW1oZHItPmlmZE1heCA9IDA7Ci0JICBzeW1oZHItPmNyZmQgPSAwOwotCSAgc3ltaGRyLT5pZXh0TWF4ID0gMDsKLQotCSAgLyogV2UgYWNjdW11bGF0ZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGl0c2VsZiBpbiB0aGUKLQkgICAgIGRlYnVnX2luZm8gc3RydWN0dXJlLiAgKi8KLQkgIGRlYnVnLmxpbmUgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfZG5yID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX3BkciA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9zeW0gPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfb3B0ID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX2F1eCA9IE5VTEw7Ci0JICBkZWJ1Zy5zcyA9IE5VTEw7Ci0JICBkZWJ1Zy5zc2V4dCA9IGRlYnVnLnNzZXh0X2VuZCA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9mZHIgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfcmZkID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX2V4dCA9IGRlYnVnLmV4dGVybmFsX2V4dF9lbmQgPSBOVUxMOwotCi0JICBtZGVidWdfaGFuZGxlID0gYmZkX2Vjb2ZmX2RlYnVnX2luaXQgKGFiZmQsICZkZWJ1Zywgc3dhcCwgaW5mbyk7Ci0JICBpZiAobWRlYnVnX2hhbmRsZSA9PSAoUFRSKSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmIChTR0lfQ09NUEFUIChhYmZkKSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzOwotCSAgICAgIEVYVFIgZXN5bTsKLQkgICAgICBiZmRfdm1hIGxhc3Q7Ci0JICAgICAgdW5zaWduZWQgaW50IGk7Ci0JICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lW10gPQotCQl7ICIudGV4dCIsICIuaW5pdCIsICIuZmluaSIsICIuZGF0YSIsCi0JCSAgICAiLnJvZGF0YSIsICIuc2RhdGEiLCAiLnNic3MiLCAiLmJzcyIgfTsKLQkgICAgICBzdGF0aWMgY29uc3QgaW50IHNjW10gPSB7IHNjVGV4dCwgc2NJbml0LCBzY0ZpbmksIHNjRGF0YSwKLQkJCQkJICBzY1JEYXRhLCBzY1NEYXRhLCBzY1NCc3MsIHNjQnNzIH07Ci0KLQkgICAgICBlc3ltLmptcHRibCA9IDA7Ci0JICAgICAgZXN5bS5jb2JvbF9tYWluID0gMDsKLQkgICAgICBlc3ltLndlYWtleHQgPSAwOwotCSAgICAgIGVzeW0ucmVzZXJ2ZWQgPSAwOwotCSAgICAgIGVzeW0uaWZkID0gaWZkTmlsOwotCSAgICAgIGVzeW0uYXN5bS5pc3MgPSBpc3NOaWw7Ci0JICAgICAgZXN5bS5hc3ltLnN0ID0gc3RMb2NhbDsKLQkgICAgICBlc3ltLmFzeW0ucmVzZXJ2ZWQgPSAwOwotCSAgICAgIGVzeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOwotCSAgICAgIGxhc3QgPSAwOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXsKLQkJICBlc3ltLmFzeW0uc2MgPSBzY1tpXTsKLQkJICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWVbaV0pOwotCQkgIGlmIChzICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGVzeW0uYXN5bS52YWx1ZSA9IHMtPnZtYTsKLQkJICAgICAgbGFzdCA9IHMtPnZtYSArIHMtPl9yYXdfc2l6ZTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBlc3ltLmFzeW0udmFsdWUgPSBsYXN0OwotCi0JCSAgaWYgKCEgYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCAoYWJmZCwgJmRlYnVnLCBzd2FwLAotCQkJCQkJICAgICAgbmFtZVtpXSwgJmVzeW0pKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkgICAgICBiZmQgKmlucHV0X2JmZDsKLQkgICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqaW5wdXRfc3dhcDsKLQkgICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBpbnB1dF9kZWJ1ZzsKLQkgICAgICBjaGFyICplcmF3X3NyYzsKLQkgICAgICBjaGFyICplcmF3X2VuZDsKLQotCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQl7Ci0JCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJICAgIGNvbnRpbnVlOwotCQkgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0JICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaW5wdXRfYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0JCSAgfHwgKGdldF9lbGZfYmFja2VuZF9kYXRhIChpbnB1dF9iZmQpCi0JCSAgICAgIC0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCkgPT0gTlVMTCkKLQkJewotCQkgIC8qIEkgZG9uJ3Qga25vdyB3aGF0IGEgbm9uIE1JUFMgRUxGIGJmZCB3b3VsZCBiZQotCQkgICAgIGRvaW5nIHdpdGggYSAubWRlYnVnIHNlY3Rpb24sIGJ1dCBJIGRvbid0IHJlYWxseQotCQkgICAgIHdhbnQgdG8gZGVhbCB3aXRoIGl0LiAgKi8KLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgICAgaW5wdXRfc3dhcCA9IChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoaW5wdXRfYmZkKQotCQkJICAgIC0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCk7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChwLT5zaXplID09IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLQkgICAgICAvKiBUaGUgRUNPRkYgbGlua2luZyBjb2RlIGV4cGVjdHMgdGhhdCB3ZSBoYXZlIGFscmVhZHkKLQkJIHJlYWQgaW4gdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhbmQgc2V0IHVwIGFuCi0JCSBlY29mZl9kZWJ1Z19pbmZvIHN0cnVjdHVyZSwgc28gd2UgZG8gdGhhdCBub3cuICAqLwotCSAgICAgIGlmICghIF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCQkgICAmaW5wdXRfZGVidWcpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBpZiAoISAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUKLQkJICAgICAobWRlYnVnX2hhbmRsZSwgYWJmZCwgJmRlYnVnLCBzd2FwLCBpbnB1dF9iZmQsCi0JCSAgICAgICZpbnB1dF9kZWJ1ZywgaW5wdXRfc3dhcCwgaW5mbykpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAvKiBMb29wIHRocm91Z2ggdGhlIGV4dGVybmFsIHN5bWJvbHMuICBGb3IgZWFjaCBvbmUgd2l0aAotCQkgaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24sIHRyeSB0byBmaW5kIHRoZSBzeW1ib2wgaW4KLQkJIHRoZSBsaW5rZXIgZ2xvYmFsIGhhc2ggdGFibGUgYW5kIHNhdmUgdGhlIGluZm9ybWF0aW9uCi0JCSBmb3IgdGhlIG91dHB1dCBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLQkgICAgICBlcmF3X3NyYyA9IGlucHV0X2RlYnVnLmV4dGVybmFsX2V4dDsKLQkgICAgICBlcmF3X2VuZCA9IChlcmF3X3NyYwotCQkJICArIChpbnB1dF9kZWJ1Zy5zeW1ib2xpY19oZWFkZXIuaWV4dE1heAotCQkJICAgICAqIGlucHV0X3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKSk7Ci0JICAgICAgZm9yICg7Ci0JCSAgIGVyYXdfc3JjIDwgZXJhd19lbmQ7Ci0JCSAgIGVyYXdfc3JjICs9IGlucHV0X3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKQotCQl7Ci0JCSAgRVhUUiBleHQ7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQkJICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgKCppbnB1dF9zd2FwLT5zd2FwX2V4dF9pbikgKGlucHV0X2JmZCwgKFBUUikgZXJhd19zcmMsICZleHQpOwotCQkgIGlmIChleHQuYXN5bS5zYyA9PSBzY05pbAotCQkgICAgICB8fCBleHQuYXN5bS5zYyA9PSBzY1VuZGVmaW5lZAotCQkgICAgICB8fCBleHQuYXN5bS5zYyA9PSBzY1NVbmRlZmluZWQpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIG5hbWUgPSBpbnB1dF9kZWJ1Zy5zc2V4dCArIGV4dC5hc3ltLmlzczsKLQkJICBoID0gbWlwc19lbGZfbGlua19oYXNoX2xvb2t1cCAobWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCQkgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJICBpZiAoaCA9PSBOVUxMIHx8IGgtPmVzeW0uaWZkICE9IC0yKQotCQkgICAgY29udGludWU7Ci0KLQkJICBpZiAoZXh0LmlmZCAhPSAtMSkKLQkJICAgIHsKLQkJICAgICAgQkZEX0FTU0VSVCAoZXh0LmlmZAotCQkJCSAgPCBpbnB1dF9kZWJ1Zy5zeW1ib2xpY19oZWFkZXIuaWZkTWF4KTsKLQkJICAgICAgZXh0LmlmZCA9IGlucHV0X2RlYnVnLmlmZG1hcFtleHQuaWZkXTsKLQkJICAgIH0KLQotCQkgIGgtPmVzeW0gPSBleHQ7Ci0JCX0KLQotCSAgICAgIC8qIEZyZWUgdXAgdGhlIGluZm9ybWF0aW9uIHdlIGp1c3QgcmVhZC4gICovCi0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcubGluZSk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZG5yKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9wZHIpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3N5bSk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfb3B0KTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9hdXgpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLnNzKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5zc2V4dCk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZmRyKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9yZmQpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX2V4dCk7Ci0KLQkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotCSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpICYmIGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIC8qIENyZWF0ZSAucnRwcm9jIHNlY3Rpb24uICAqLwotCSAgICAgIHJ0cHJvY19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ydHByb2MiKTsKLQkgICAgICBpZiAocnRwcm9jX3NlYyA9PSBOVUxMKQotCQl7Ci0JCSAgZmxhZ3dvcmQgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgfCBTRUNfTElOS0VSX0NSRUFURUQgfCBTRUNfUkVBRE9OTFkpOwotCi0JCSAgcnRwcm9jX3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucnRwcm9jIik7Ci0JCSAgaWYgKHJ0cHJvY19zZWMgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcnRwcm9jX3NlYywgZmxhZ3MpCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcnRwcm9jX3NlYywgNCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIGlmICghIG1pcHNfZWxmX2NyZWF0ZV9wcm9jZWR1cmVfdGFibGUgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsCi0JCQkJCQkgICAgIGluZm8sIHJ0cHJvY19zZWMsICZkZWJ1ZykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBCdWlsZCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLQkgIGVpbmZvLmFiZmQgPSBhYmZkOwotCSAgZWluZm8uaW5mbyA9IGluZm87Ci0JICBlaW5mby5kZWJ1ZyA9ICZkZWJ1ZzsKLQkgIGVpbmZvLnN3YXAgPSBzd2FwOwotCSAgZWluZm8uZmFpbGVkID0gZmFsc2U7Ci0JICBtaXBzX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UgKG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgICAgICBtaXBzX2VsZl9vdXRwdXRfZXh0c3ltLAotCQkJCSAgICAgICAoUFRSKSAmZWluZm8pOwotCSAgaWYgKGVpbmZvLmZhaWxlZCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIC5tZGVidWcgc2VjdGlvbi4gICovCi0JICBvLT5fcmF3X3NpemUgPSBiZmRfZWNvZmZfZGVidWdfc2l6ZSAoYWJmZCwgJmRlYnVnLCBzd2FwKTsKLQotCSAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKLQkgICAgIG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0KLQkgIG1kZWJ1Z19zZWMgPSBvOwotCX0KLQotICAgICAgaWYgKHN0cm5jbXAgKG8tPm5hbWUsICIuZ3B0YWIuIiwgc2l6ZW9mICIuZ3B0YWIuIiAtIDEpID09IDApCi0JewotCSAgY29uc3QgY2hhciAqc3VibmFtZTsKLQkgIHVuc2lnbmVkIGludCBjOwotCSAgRWxmMzJfZ3B0YWIgKnRhYjsKLQkgIEVsZjMyX0V4dGVybmFsX2dwdGFiICpleHRfdGFiOwotCSAgdW5zaWduZWQgaW50IGk7Ci0KLQkgIC8qIFRoZSAuZ3B0YWIuc2RhdGEgYW5kIC5ncHRhYi5zYnNzIHNlY3Rpb25zIGhvbGQKLQkgICAgIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgaG93IHRoZSBzbWFsbCBkYXRhIGFyZWEgd291bGQKLQkgICAgIGNoYW5nZSBkZXBlbmRpbmcgdXBvbiB0aGUgLUcgc3dpdGNoLiAgVGhlc2Ugc2VjdGlvbnMKLQkgICAgIG5vdCB1c2VkIGluIGV4ZWN1dGFibGVzIGZpbGVzLiAgKi8KLQkgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0KLQkgICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JCSAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCQkgICBwID0gcC0+bmV4dCkKLQkJewotCQkgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotCi0JCSAgaWYgKHAtPnR5cGUgIT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCQljb250aW51ZTsKLQkJICAgICAgYWJvcnQgKCk7Ci0JCSAgICB9Ci0KLQkJICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0JCSAgLyogSGFjazogcmVzZXQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBzbyB0aGF0Ci0JCSAgICAgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkJICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkJfQotCi0JICAgICAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcwotCQkgY3VycmVudGx5IG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICAgICAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCi0JICAgICAgLyogUmVhbGx5IHJlbW92ZSB0aGUgc2VjdGlvbi4gICovCi0JICAgICAgZm9yIChzZWNwcCA9ICZhYmZkLT5zZWN0aW9uczsKLQkJICAgKnNlY3BwICE9IG87Ci0JCSAgIHNlY3BwID0gJigqc2VjcHApLT5uZXh0KQotCQk7Ci0JICAgICAgKnNlY3BwID0gKCpzZWNwcCktPm5leHQ7Ci0JICAgICAgLS1hYmZkLT5zZWN0aW9uX2NvdW50OwotCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogVGhlcmUgaXMgb25lIGdwdGFiIGZvciBpbml0aWFsaXplZCBkYXRhLCBhbmQgb25lIGZvcgotCSAgICAgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLQkgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIuZ3B0YWIuc2RhdGEiKSA9PSAwKQotCSAgICBncHRhYl9kYXRhX3NlYyA9IG87Ci0JICBlbHNlIGlmIChzdHJjbXAgKG8tPm5hbWUsICIuZ3B0YWIuc2JzcyIpID09IDApCi0JICAgIGdwdGFiX2Jzc19zZWMgPSBvOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczogaWxsZWdhbCBzZWN0aW9uIG5hbWUgYCVzJyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG8tPm5hbWUpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBUaGUgbGlua2VyIHNjcmlwdCBhbHdheXMgY29tYmluZXMgLmdwdGFiLmRhdGEgYW5kCi0JICAgICAuZ3B0YWIuc2RhdGEgaW50byAuZ3B0YWIuc2RhdGEsIGFuZCBsaWtld2lzZSBmb3IKLQkgICAgIC5ncHRhYi5ic3MgYW5kIC5ncHRhYi5zYnNzLiAgSXQgaXMgcG9zc2libGUgdGhhdCB0aGVyZSBpcwotCSAgICAgbm8gLnNkYXRhIG9yIC5zYnNzIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBpbiB3aGljaAotCSAgICAgY2FzZSB3ZSBtdXN0IGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgc3VibmFtZSA9IG8tPm5hbWUgKyBzaXplb2YgIi5ncHRhYiIgLSAxOwotCSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzdWJuYW1lKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKG8gPT0gZ3B0YWJfZGF0YV9zZWMpCi0JCW8tPm5hbWUgPSAiLmdwdGFiLmRhdGEiOwotCSAgICAgIGVsc2UKLQkJby0+bmFtZSA9ICIuZ3B0YWIuYnNzIjsKLQkgICAgICBzdWJuYW1lID0gby0+bmFtZSArIHNpemVvZiAiLmdwdGFiIiAtIDE7Ci0JICAgICAgQkZEX0FTU0VSVCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN1Ym5hbWUpICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIC8qIFNldCB1cCB0aGUgZmlyc3QgZW50cnkuICAqLwotCSAgYyA9IDE7Ci0JICB0YWIgPSAoRWxmMzJfZ3B0YWIgKikgYmZkX21hbGxvYyAoYyAqIHNpemVvZiAoRWxmMzJfZ3B0YWIpKTsKLQkgIGlmICh0YWIgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgdGFiWzBdLmd0X2hlYWRlci5ndF9jdXJyZW50X2dfdmFsdWUgPSBlbGZfZ3Bfc2l6ZSAoYWJmZCk7Ci0JICB0YWJbMF0uZ3RfaGVhZGVyLmd0X3VudXNlZCA9IDA7Ci0KLQkgIC8qIENvbWJpbmUgdGhlIGlucHV0IHNlY3Rpb25zLiAgKi8KLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JICAgICAgYmZkICppbnB1dF9iZmQ7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgbGFzdDsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGdwZW50cnk7Ci0KLQkgICAgICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJewotCQkgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCSAgICBjb250aW51ZTsKLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaW5wdXRfc2VjdGlvbiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQkgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLQotCSAgICAgIC8qIENvbWJpbmUgdGhlIGdwdGFiIGVudHJpZXMgZm9yIHRoaXMgaW5wdXQgc2VjdGlvbiBvbmUKLQkJIGJ5IG9uZS4gIFdlIGtub3cgdGhhdCB0aGUgaW5wdXQgZ3B0YWIgZW50cmllcyBhcmUKLQkJIHNvcnRlZCBieSBhc2NlbmRpbmcgLUcgdmFsdWUuICAqLwotCSAgICAgIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotCSAgICAgIGxhc3QgPSAwOwotCSAgICAgIGZvciAoZ3BlbnRyeSA9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpOwotCQkgICBncGVudHJ5IDwgc2l6ZTsKLQkJICAgZ3BlbnRyeSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2dwdGFiKSkKLQkJewotCQkgIEVsZjMyX0V4dGVybmFsX2dwdGFiIGV4dF9ncHRhYjsKLQkJICBFbGYzMl9ncHRhYiBpbnRfZ3B0YWI7Ci0JCSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JCSAgdW5zaWduZWQgbG9uZyBhZGQ7Ci0JCSAgYm9vbGVhbiBleGFjdDsKLQkJICB1bnNpZ25lZCBpbnQgbG9vazsKLQotCQkgIGlmICghIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMKLQkJCSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoUFRSKSAmZXh0X2dwdGFiLAotCQkJICBncGVudHJ5LCBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2dwdGFiKSkpKQotCQkgICAgewotCQkgICAgICBmcmVlICh0YWIpOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICBiZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX2luIChpbnB1dF9iZmQsICZleHRfZ3B0YWIsCi0JCQkJCQkmaW50X2dwdGFiKTsKLQkJICB2YWwgPSBpbnRfZ3B0YWIuZ3RfZW50cnkuZ3RfZ192YWx1ZTsKLQkJICBhZGQgPSBpbnRfZ3B0YWIuZ3RfZW50cnkuZ3RfYnl0ZXMgLSBsYXN0OwotCi0JCSAgZXhhY3QgPSBmYWxzZTsKLQkJICBmb3IgKGxvb2sgPSAxOyBsb29rIDwgYzsgbG9vaysrKQotCQkgICAgewotCQkgICAgICBpZiAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPj0gdmFsKQotCQkJdGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2J5dGVzICs9IGFkZDsKLQotCQkgICAgICBpZiAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPT0gdmFsKQotCQkJZXhhY3QgPSB0cnVlOwotCQkgICAgfQotCi0JCSAgaWYgKCEgZXhhY3QpCi0JCSAgICB7Ci0JCSAgICAgIEVsZjMyX2dwdGFiICpuZXdfdGFiOwotCQkgICAgICB1bnNpZ25lZCBpbnQgbWF4OwotCi0JCSAgICAgIC8qIFdlIG5lZWQgYSBuZXcgdGFibGUgZW50cnkuICAqLwotCQkgICAgICBuZXdfdGFiID0gKChFbGYzMl9ncHRhYiAqKQotCQkJCSBiZmRfcmVhbGxvYyAoKFBUUikgdGFiLAotCQkJCQkgICAgICAoYyArIDEpICogc2l6ZW9mIChFbGYzMl9ncHRhYikpKTsKLQkJICAgICAgaWYgKG5ld190YWIgPT0gTlVMTCkKLQkJCXsKLQkJCSAgZnJlZSAodGFiKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICB0YWIgPSBuZXdfdGFiOwotCQkgICAgICB0YWJbY10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA9IHZhbDsKLQkJICAgICAgdGFiW2NdLmd0X2VudHJ5Lmd0X2J5dGVzID0gYWRkOwotCi0JCSAgICAgIC8qIE1lcmdlIGluIHRoZSBzaXplIGZvciB0aGUgbmV4dCBzbWFsbGVzdCAtRwotCQkJIHZhbHVlLCBzaW5jZSB0aGF0IHdpbGwgYmUgaW1wbGllZCBieSB0aGlzIG5ldwotCQkJIHZhbHVlLiAgKi8KLQkJICAgICAgbWF4ID0gMDsKLQkJICAgICAgZm9yIChsb29rID0gMTsgbG9vayA8IGM7IGxvb2srKykKLQkJCXsKLQkJCSAgaWYgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlIDwgdmFsCi0JCQkgICAgICAmJiAobWF4ID09IDAKLQkJCQkgIHx8ICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZQotCQkJCSAgICAgID4gdGFiW21heF0uZ3RfZW50cnkuZ3RfZ192YWx1ZSkpKQotCQkJICAgIG1heCA9IGxvb2s7Ci0JCQl9Ci0JCSAgICAgIGlmIChtYXggIT0gMCkKLQkJCXRhYltjXS5ndF9lbnRyeS5ndF9ieXRlcyArPQotCQkJICB0YWJbbWF4XS5ndF9lbnRyeS5ndF9ieXRlczsKLQotCQkgICAgICArK2M7Ci0JCSAgICB9Ci0KLQkJICBsYXN0ID0gaW50X2dwdGFiLmd0X2VudHJ5Lmd0X2J5dGVzOwotCQl9Ci0KLQkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotCSAgLyogVGhlIHRhYmxlIG11c3QgYmUgc29ydGVkIGJ5IC1HIHZhbHVlLiAgKi8KLQkgIGlmIChjID4gMikKLQkgICAgcXNvcnQgKHRhYiArIDEsIGMgLSAxLCBzaXplb2YgKHRhYlswXSksIGdwdGFiX2NvbXBhcmUpOwotCi0JICAvKiBTd2FwIG91dCB0aGUgdGFibGUuICAqLwotCSAgZXh0X3RhYiA9ICgoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKikKLQkJICAgICBiZmRfYWxsb2MgKGFiZmQsIGMgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2dwdGFiKSkpOwotCSAgaWYgKGV4dF90YWIgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZyZWUgKHRhYik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0JICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfb3V0IChhYmZkLCB0YWIgKyBpLCBleHRfdGFiICsgaSk7Ci0JICBmcmVlICh0YWIpOwotCi0JICBvLT5fcmF3X3NpemUgPSBjICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9ncHRhYik7Ci0JICBvLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRfdGFiOwotCi0JICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQotCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIEludm9rZSB0aGUgcmVndWxhciBFTEYgYmFja2VuZCBsaW5rZXIgdG8gZG8gYWxsIHRoZSB3b3JrLiAgKi8KLSAgaWYgKCEgYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdyaXRlIG91dCB0aGUgY29tcHV0ZWQgc2VjdGlvbnMuICAqLwotCi0gIGlmIChyZWdpbmZvX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvIGV4dDsKLQotICAgICAgYmZkX21pcHNfZWxmMzJfc3dhcF9yZWdpbmZvX291dCAoYWJmZCwgJnJlZ2luZm8sICZleHQpOwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCByZWdpbmZvX3NlYywgKFBUUikgJmV4dCwKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNpemVvZiBleHQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG1kZWJ1Z19zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoYWJmZC0+b3V0cHV0X2hhc19iZWd1bik7Ci0gICAgICBpZiAoISBiZmRfZWNvZmZfd3JpdGVfYWNjdW11bGF0ZWRfZGVidWcgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsICZkZWJ1ZywKLQkJCQkJICAgICAgIHN3YXAsIGluZm8sCi0JCQkJCSAgICAgICBtZGVidWdfc2VjLT5maWxlcG9zKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGJmZF9lY29mZl9kZWJ1Z19mcmVlIChtZGVidWdfaGFuZGxlLCBhYmZkLCAmZGVidWcsIHN3YXAsIGluZm8pOwotICAgIH0KLQotICBpZiAoZ3B0YWJfZGF0YV9zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBncHRhYl9kYXRhX3NlYywKLQkJCQkgICAgICBncHRhYl9kYXRhX3NlYy0+Y29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAgIGdwdGFiX2RhdGFfc2VjLT5fcmF3X3NpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGdwdGFiX2Jzc19zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBncHRhYl9ic3Nfc2VjLAotCQkJCSAgICAgIGdwdGFiX2Jzc19zZWMtPmNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwKLQkJCQkgICAgICBncHRhYl9ic3Nfc2VjLT5fcmF3X3NpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpKQotICAgIHsKLSAgICAgIHJ0cHJvY19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ydHByb2MiKTsKLSAgICAgIGlmIChydHByb2Nfc2VjICE9IE5VTEwpCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBydHByb2Nfc2VjLAotCQkJCQkgIHJ0cHJvY19zZWMtPmNvbnRlbnRzLAotCQkJCQkgIChmaWxlX3B0cikgMCwKLQkJCQkJICBydHByb2Nfc2VjLT5fcmF3X3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIGEgTUlQUyBFTEYgSEkxNiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZl9yZWxvY2F0ZV9oaTE2IChpbnB1dF9iZmQsIHJlbGhpLCByZWxsbywgY29udGVudHMsIGFkZGVuZCkKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxoaTsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGxvOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotewotICBiZmRfdm1hIGluc247Ci0gIGJmZF92bWEgYWRkbG87Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWxoaS0+cl9vZmZzZXQpOwotCi0gIGFkZGxvID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbGxvLT5yX29mZnNldCk7Ci0gIGFkZGxvICY9IDB4ZmZmZjsKLQotICBhZGRlbmQgKz0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBhZGRsbzsKLQotICBpZiAoKGFkZGxvICYgMHg4MDAwKSAhPSAwKQotICAgIGFkZGVuZCAtPSAweDEwMDAwOwotICBpZiAoKGFkZGVuZCAmIDB4ODAwMCkgIT0gMCkKLSAgICBhZGRlbmQgKz0gMHgxMDAwMDsKLQotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsCi0JICAgICAgKGluc24gJiAweGZmZmYwMDAwKSB8ICgoYWRkZW5kID4+IDE2KSAmIDB4ZmZmZiksCi0JICAgICAgY29udGVudHMgKyByZWxoaS0+cl9vZmZzZXQpOwotfQotCi0vKiBIYW5kbGUgYSBNSVBTIEVMRiBsb2NhbCBHT1QxNiByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9yZWxvY2F0ZV9nb3RfbG9jYWwgKG91dHB1dF9iZmQsIGlucHV0X2JmZCwgc2dvdCwgcmVsaGksIHJlbGxvLAotCQkJICAgICBjb250ZW50cywgYWRkZW5kKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGhpOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsbG87Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBhc3NpZ25lZF9nb3RubzsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJmZF92bWEgaW5zbjsKLSAgYmZkX3ZtYSBhZGRsbzsKLSAgYmZkX3ZtYSBhZGRyZXNzOwotICBiZmRfdm1hIGhpcGFnZTsKLSAgYmZkX2J5dGUgKmdvdF9jb250ZW50czsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWxoaS0+cl9vZmZzZXQpOwotCi0gIGFkZGxvID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbGxvLT5yX29mZnNldCk7Ci0gIGFkZGxvICY9IDB4ZmZmZjsKLQotICBhZGRlbmQgKz0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBhZGRsbzsKLQotICBpZiAoKGFkZGxvICYgMHg4MDAwKSAhPSAwKQotICAgIGFkZGVuZCAtPSAweDEwMDAwOwotICBpZiAoKGFkZGVuZCAmIDB4ODAwMCkgIT0gMCkKLSAgICBhZGRlbmQgKz0gMHgxMDAwMDsKLQotICAvKiBHZXQgYSBnb3QgZW50cnkgcmVwcmVzZW50aW5nIHJlcXVlc3RlZCBoaXBhZ2UuICAqLwotICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzZ290KSAhPSBOVUxMKTsKLSAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZ290KS0+dGRhdGE7Ci0gIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0KLSAgYXNzaWduZWRfZ290bm8gPSBnLT5hc3NpZ25lZF9nb3RubzsKLSAgZ290X2NvbnRlbnRzID0gc2dvdC0+Y29udGVudHM7Ci0gIGhpcGFnZSA9IGFkZGVuZCAmIDB4ZmZmZjAwMDA7Ci0KLSAgZm9yIChpID0gTUlQU19SRVNFUlZFRF9HT1ROTzsgaSA8IGFzc2lnbmVkX2dvdG5vOyBpKyspCi0gICAgewotICAgICAgYWRkcmVzcyA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgZ290X2NvbnRlbnRzICsgaSAqIDQpOwotICAgICAgaWYgKGhpcGFnZSA9PSAoYWRkcmVzcyAmIDB4ZmZmZjAwMDApKQotCWJyZWFrOwotICAgIH0KLQotICBpZiAoaSA9PSBhc3NpZ25lZF9nb3RubykKLSAgICB7Ci0gICAgICBpZiAoYXNzaWduZWRfZ290bm8gPj0gZy0+bG9jYWxfZ290bm8pCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCJtb3JlIGdvdCBlbnRyaWVzIGFyZSBuZWVkZWQgZm9yIGhpcGFnZSByZWxvY2F0aW9ucyIpKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBoaXBhZ2UsIGdvdF9jb250ZW50cyArIGFzc2lnbmVkX2dvdG5vICogNCk7Ci0gICAgICArK2ctPmFzc2lnbmVkX2dvdG5vOwotICAgIH0KLQotICBpID0gLSBFTEZfTUlQU19HUF9PRkZTRVQgKG91dHB1dF9iZmQpICsgaSAqIDQ7Ci0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGluc24gJiAweGZmZmYwMDAwKSB8IChpICYgMHhmZmZmKSwKLQkgICAgICBjb250ZW50cyArIHJlbGhpLT5yX29mZnNldCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBNSVBTIEVMRiBDQUxMMTYgcmVsb2MgYW5kIGdsb2JhbCBHT1QxNiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZl9yZWxvY2F0ZV9nbG9iYWxfZ290IChpbnB1dF9iZmQsIHJlbCwgY29udGVudHMsIG9mZnNldCkKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci17Ci0gIGJmZF92bWEgaW5zbjsKLQotICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsCi0JICAgICAgKGluc24gJiAweGZmZmYwMDAwKSB8IChvZmZzZXQgJiAweGZmZmYpLAotCSAgICAgIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci19Ci0KLS8qIFJlbG9jYXRlIGEgTUlQUyBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzaXplX3QgbG9jc3ltY291bnQ7Ci0gIHNpemVfdCBleHRzeW1vZmY7Ci0gIGFzZWN0aW9uICpzZ290LCAqc3JlbG9jLCAqc2NwdDsKLSAgYmZkICpkeW5vYmo7Ci0gIGJmZF92bWEgZ3A7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0gIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICBzZ290ID0gTlVMTDsKLSAgc3JlbG9jID0gTlVMTDsKLSAgaWYgKGR5bm9iaiA9PSBOVUxMIHx8ICEgU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkpCi0gICAgc2NwdCA9IE5VTEw7Ci0gIGVsc2UKLSAgICBzY3B0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5jb21wYWN0X3JlbCIpOwotICBnID0gTlVMTDsKLQotICBpZiAoZWxmX2JhZF9zeW10YWIgKGlucHV0X2JmZCkpCi0gICAgewotICAgICAgbG9jc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pOwotICAgICAgZXh0c3ltb2ZmID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb2NzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBleHRzeW1vZmYgPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgIH0KLQotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICptaDsKLSAgICAgIGludCBvdGhlcjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPT0gUl9NSVBTX0dOVV9WVElOSEVSSVQKLQkgIHx8IHJfdHlwZSA9PSBSX01JUFNfR05VX1ZURU5UUlkpCi0JY29udGludWU7Ci0gICAgICBpZiAoKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfTUlQU19tYXgpCi0JICAmJiByX3R5cGUgIT0gUl9NSVBTMTZfMjYKLQkgICYmIHJfdHlwZSAhPSBSX01JUFMxNl9HUFJFTCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAocl90eXBlID09IFJfTUlQUzE2XzI2KQotCWhvd3RvID0gJmVsZl9taXBzMTZfanVtcF9ob3d0bzsKLSAgICAgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFMxNl9HUFJFTCkKLQlob3d0byA9ICZlbGZfbWlwczE2X2dwcmVsX2hvd3RvOwotICAgICAgZWxzZQotCWhvd3RvID0gZWxmX21pcHNfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIGlmIChkeW5vYmogIT0gTlVMTAotCSAgJiYgKHJfdHlwZSA9PSBSX01JUFNfQ0FMTDE2Ci0JICAgICAgfHwgcl90eXBlID09IFJfTUlQU19HT1QxNgotCSAgICAgIHx8IHJfdHlwZSA9PSBSX01JUFNfQ0FMTF9ISTE2Ci0JICAgICAgfHwgcl90eXBlID09IFJfTUlQU19DQUxMX0xPMTYKLQkgICAgICB8fCByX3R5cGUgPT0gUl9NSVBTX0dPVF9ISTE2Ci0JICAgICAgfHwgcl90eXBlID09IFJfTUlQU19HT1RfTE8xNikpCi0JewotCSAgLyogV2UgbmVlZCB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICAgIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpICE9IE5VTEwpOwotCSAgICAgIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCktPnRkYXRhOwotCSAgICAgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgLyogTWl4IGluIHRoZSBjaGFuZ2UgaW4gR1AgYWRkcmVzcyBmb3IgYSBHUCByZWxhdGl2ZSByZWxvYy4gICovCi0gICAgICBpZiAocl90eXBlICE9IFJfTUlQU19HUFJFTDE2Ci0JICAmJiByX3R5cGUgIT0gUl9NSVBTX0xJVEVSQUwKLQkgICYmIHJfdHlwZSAhPSBSX01JUFNfR1BSRUwzMgotCSAgJiYgcl90eXBlICE9IFJfTUlQUzE2X0dQUkVMKQotCWFkZGVuZCA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGdwID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAoaW5mbywKLQkJICAgICAgXygiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aGVuIEdQIG5vdCBkZWZpbmVkIiksCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgLyogT25seSBnaXZlIHRoZSBlcnJvciBvbmNlIHBlciBsaW5rLiAgKi8KLQkgICAgICBncCA9IDQ7Ci0JICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLQkgICAgfQotCi0JICBpZiAocl9zeW1uZHggPCBleHRzeW1vZmYKLQkgICAgICB8fCAoZWxmX2JhZF9zeW10YWIgKGlucHV0X2JmZCkKLQkJICAmJiBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF0gIT0gTlVMTCkpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIFRoZSBjdXJyZW50Ci0JCSBhZGRlbmQgaW4gdGhlIGluc3RydWN0aW9uIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLQkJIElOUFVUX1NFQ1RJT04tPnZtYSBhbmQgdGhlIEdQIHZhbHVlIG9mIElOUFVUX0JGRC4gIFdlCi0JCSBtdXN0IGNoYW5nZSB0aGlzIHRvIGJlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCi0JCSBmaW5hbCBkZWZpbml0aW9uICh3aGljaCB3aWxsIGVuZCB1cCBpbiBSRUxPQ0FUSU9OKQotCQkgYW5kIHRoZSBHUCB2YWx1ZSBvZiBPVVRQVVRfQkZEICh3aGljaCBpcyBpbiBHUCkuICAqLwotCSAgICAgIGFkZGVuZCA9IGVsZl9ncCAoaW5wdXRfYmZkKSAtIGdwOwotCSAgICB9Ci0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIC8qIFdlIGFyZSBkb2luZyBhIGZpbmFsIGxpbmsuICBUaGUgY3VycmVudCBhZGRlbmQgaW4gdGhlCi0JCSBpbnN0cnVjdGlvbiBpcyBzaW1wbHkgdGhlIGRlc2lyZWQgb2Zmc2V0IGludG8gdGhlCi0JCSBzeW1ib2wgKG5vcm1hbGx5IHplcm8pLiAgV2Ugd2FudCB0aGUgaW5zdHJ1Y3Rpb24gdG8KLQkJIGhvbGQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZmluYWwgZGVmaW5pdGlvbiBvZgotCQkgdGhlIHN5bWJvbCAod2hpY2ggd2lsbCBlbmQgdXAgaW4gUkVMT0NBVElPTikgYW5kIHRoZQotCQkgR1AgdmFsdWUgb2YgT1VUUFVUX0JGRCAod2hpY2ggaXMgaW4gR1ApLiAgKi8KLQkgICAgICBhZGRlbmQgPSAtIGdwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBhcmUgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgd2UgYXJlbid0Ci0JCSBnb2luZyB0byBkZWZpbmUgdGhpcyBzeW1ib2wsIHNvIHdlIGp1c3QgbGVhdmUgdGhlCi0JCSBpbnN0cnVjdGlvbiBhbG9uZS4gICovCi0JICAgICAgYWRkZW5kID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA+PSBsb2NzeW1jb3VudAotCSAgICAgIHx8IChlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKQotCQkgICYmIGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XSA9PSBOVUxMKSkKLQkgICAgciA9IGJmZF9yZWxvY19vazsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgIT0gU1RUX1NFQ1RJT04pCi0JCXIgPSBiZmRfcmVsb2Nfb2s7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCi0JCSAgLyogSXQgd291bGQgYmUgbG9naWNhbCB0byBhZGQgc3ltLT5zdF92YWx1ZSBoZXJlLAotCQkgICAgIGJ1dCBJcml4IDUgc29tZXRpbWVzIGdlbmVyYXRlcyBhIGdhcmJhZ2Ugc3ltYm9sCi0JCSAgICAgdmFsdWUuICAqLwotCQkgIGFkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0KLQkJICAvKiBJZiB0aGlzIGlzIEhJMTYgb3IgR09UMTYgd2l0aCBhbiBhc3NvY2lhdGVkIExPMTYsCi0JCSAgICAgYWRqdXN0IHRoZSBhZGRlbmQgYWNjb3JkaW5nbHkuICBPdGhlcndpc2UsIGp1c3QKLQkJICAgICByZWxvY2F0ZS4gICovCi0JCSAgaWYgKHJfdHlwZSA9PSBSX01JUFNfNjQgJiYgYmZkX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JCSAgICByID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwKLQkJCQkJCWFkZGVuZCwKLQkJCQkJCWNvbnRlbnRzICsgcmVsLT5yX29mZnNldCArIDQpOwotCQkgIGVsc2UgaWYgKHJfdHlwZSAhPSBSX01JUFNfSEkxNiAmJiByX3R5cGUgIT0gUl9NSVBTX0dPVDE2KQotCQkgICAgciA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsCi0JCQkJCQlhZGRlbmQsCi0JCQkJCQljb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmxvcmVsOwotCi0JCSAgICAgIC8qIEFzIGEgR05VIGV4dGVuc2lvbiwgcGVybWl0IGFuIGFyYml0cmFyeQotCQkJIG51bWJlciBvZiBSX01JUFNfSEkxNiByZWxvY3MgYmVmb3JlIHRoZQotCQkJIFJfTUlQU19MTzE2IHJlbG9jLiAgVGhpcyBwZXJtaXRzIGdjYyB0byBlbWl0Ci0JCQkgdGhlIEhJIGFuZCBMTyByZWxvY3MgaXRzZWxmLiAgKi8KLQkJICAgICAgaWYgKHJfdHlwZSA9PSBSX01JUFNfR09UMTYpCi0JCQlsb3JlbCA9IHJlbCArIDE7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgZm9yIChsb3JlbCA9IHJlbCArIDE7Ci0JCQkgICAgICAgKGxvcmVsIDwgcmVsZW5kCi0JCQkJJiYgKEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykKLQkJCQkgICAgPT0gUl9NSVBTX0hJMTYpKTsKLQkJCSAgICAgICBsb3JlbCsrKQotCQkJICAgIDsKLQkJCX0KLQkJICAgICAgaWYgKGxvcmVsIDwgcmVsZW5kCi0JCQkgICYmIEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NSVBTX0xPMTYpCi0JCQl7Ci0JCQkgIG1pcHNfZWxmX3JlbG9jYXRlX2hpMTYgKGlucHV0X2JmZCwgcmVsLCBsb3JlbCwKLQkJCQkJCSAgY29udGVudHMsIGFkZGVuZCk7Ci0JCQkgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLAotCQkJCQkJICAgIGFkZGVuZCwKLQkJCQkJCSAgICBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCSAgYm9vbGVhbiBsb2NhbDsKLQkgIGJvb2xlYW4gdW5kZWZpbmVkX2Vycm9yOwotCi0JICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0JICB1bmRlZmluZWRfZXJyb3IgPSBmYWxzZTsKLQkgIHN5bSA9IE5VTEw7Ci0JICBpZiAocl9zeW1uZHggPCBleHRzeW1vZmYKLQkgICAgICB8fCAoZWxmX2JhZF9zeW10YWIgKGlucHV0X2JmZCkKLQkJICAmJiBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF0gIT0gTlVMTCkpCi0JICAgIHsKLQkgICAgICBsb2NhbCA9IHRydWU7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgICAgICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIC8qIEl0IHdvdWxkIGJlIGxvZ2ljYWwgdG8gYWx3YXlzIGFkZCBzeW0tPnN0X3ZhbHVlIGhlcmUsCi0JCSBidXQgSXJpeCA1IHNvbWV0aW1lcyBnZW5lcmF0ZXMgYSBnYXJiYWdlIHN5bWJvbAotCQkgdmFsdWUuICAqLwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfU0VDVElPTikKLQkJcmVsb2NhdGlvbiArPSBzeW0tPnN0X3ZhbHVlOwotCi0JICAgICAgLyogbWlwczE2IHRleHQgbGFiZWxzIHNob3VsZCBiZSB0cmVhdGVkIGFzIG9kZC4gICovCi0JICAgICAgaWYgKHN5bS0+c3Rfb3RoZXIgPT0gU1RPX01JUFMxNikKLQkJKytyZWxvY2F0aW9uOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsb25nIGluZHg7Ci0KLQkgICAgICBsb2NhbCA9IGZhbHNlOwotCSAgICAgIGluZHggPSByX3N5bW5keCAtIGV4dHN5bW9mZjsKLQkgICAgICBoID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaW5keF07Ci0JICAgICAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkJaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgICAgIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfZ3BfZGlzcCIpID09IDApCi0JCXsKLQkJICBpZiAoZ3AgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCQkgICAgIChpbmZvLAotCQkJICAgICAgXygiX2dwX2Rpc3AgdXNlZCB3aGVuIEdQIG5vdCBkZWZpbmVkIiksCi0JCQkgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIC8qIE9ubHkgZ2l2ZSB0aGUgZXJyb3Igb25jZSBwZXIgbGluay4gICovCi0JCSAgICAgIGdwID0gNDsKLQkJICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLQkJICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBzZWMgPSBpbnB1dF9zZWN0aW9uOwotCQkgICAgICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCQkJcmVsb2NhdGlvbiA9IChncAotCQkJCSAgICAgIC0gKHJlbC0+cl9vZmZzZXQKLQkJCQkJICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSArIHNlYy0+b3V0cHV0X29mZnNldCkpOwotCQkgICAgICBlbHNlCi0JCQlyZWxvY2F0aW9uID0gZ3AgLSByZWwtPnJfb2Zmc2V0OwotCQkgICAgICBpZiAocl90eXBlID09IFJfTUlQU19MTzE2KQotCQkJcmVsb2NhdGlvbiArPSA0OwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCXsKLQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkJICAgIHJlbG9jYXRpb24gPSAwOwotCQkgIGVsc2UKLQkJICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJcmVsb2NhdGlvbiA9IDA7Ci0JICAgICAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQotCQlyZWxvY2F0aW9uID0gMDsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQ19MSU5LIikgPT0gMCkKLQkJewotCQkgIC8qIElmIHRoaXMgaXMgYSBkeW5hbWljIGxpbmssIHdlIHNob3VsZCBoYXZlIGNyZWF0ZWQKLSAgICAgICAgICAgICAgICAgICAgIGEgX0RZTkFNSUNfTElOSyBzeW1ib2wgaW4KLSAgICAgICAgICAgICAgICAgICAgIG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLiAgT3RoZXJ3aXNlLCB3ZQotICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGRlZmluZSB0aGUgc3ltYm9sIHdpdGggYSB2YWx1ZSBvZiAwLgotICAgICAgICAgICAgICAgICAgICAgRklYTUU6IEl0IHNob3VsZCBwcm9iYWJseSBnZXQgaW50byB0aGUgc3ltYm9sCi0gICAgICAgICAgICAgICAgICAgICB0YWJsZSBzb21laG93IGFzIHdlbGwuICAqLwotCQkgIEJGRF9BU1NFUlQgKCEgaW5mby0+c2hhcmVkKTsKLQkJICBCRkRfQVNTRVJUIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgICAiLmR5bmFtaWMiKSA9PSBOVUxMKTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkJICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgdW5kZWZpbmVkX2Vycm9yID0gdHJ1ZTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICB9Ci0KLQkgIG1oID0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgaDsKLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIG90aGVyID0gaC0+b3RoZXI7Ci0JICBlbHNlIGlmIChzeW0gIT0gTlVMTCkKLQkgICAgb3RoZXIgPSBzeW0tPnN0X290aGVyOwotCSAgZWxzZQotCSAgICBvdGhlciA9IDA7Ci0KLQkgIC8qIElmIHRoaXMgZnVuY3Rpb24gaGFzIGFuIGZuX3N0dWIsIHRoZW4gaXQgaXMgYSBtaXBzMTYKLQkgICAgIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIGEgc3R1YiBpZiBpdCBpcyBjYWxsZWQgYnkgYSAzMiBiaXQKLQkgICAgIGZ1bmN0aW9uLiAgSWYgdGhpcyByZWxvYyBpcyBhbnl0aGluZyBvdGhlciB0aGFuIGEgMTYgYml0Ci0JICAgICBjYWxsLCByZWRpcmVjdCB0aGUgcmVsb2MgdG8gdGhlIHN0dWIuICBXZSBkb24ndCByZWRpcmVjdAotCSAgICAgcmVsb2NzIGZyb20gb3RoZXIgc3R1YiBmdW5jdGlvbnMuICAqLwotCSAgaWYgKHJfdHlwZSAhPSBSX01JUFMxNl8yNgotCSAgICAgICYmICgobWggIT0gTlVMTAotCQkgICAmJiBtaC0+Zm5fc3R1YiAhPSBOVUxMKQotCQkgIHx8IChtaCA9PSBOVUxMCi0JCSAgICAgICYmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+bG9jYWxfc3R1YnMgIT0gTlVMTAotCQkgICAgICAmJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPmxvY2FsX3N0dWJzW3Jfc3ltbmR4XSAhPSBOVUxMKSkKLQkgICAgICAmJiBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSwKLQkJCSAgRk5fU1RVQiwgc2l6ZW9mIEZOX1NUVUIgLSAxKSAhPSAwCi0JICAgICAgJiYgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiksCi0JCQkgIENBTExfU1RVQiwgc2l6ZW9mIENBTExfU1RVQiAtIDEpICE9IDAKLQkgICAgICAmJiBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSwKLQkJCSAgQ0FMTF9GUF9TVFVCLCBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgIT0gMCkKLQkgICAgewotCSAgICAgIGlmIChtaCAhPSBOVUxMKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAobWgtPm5lZWRfZm5fc3R1Yik7Ci0JCSAgcmVsb2NhdGlvbiA9IChtaC0+Zm5fc3R1Yi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgbWgtPmZuX3N0dWItPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNlY3Rpb24gKmZuX3N0dWI7Ci0KLQkJICBmbl9zdHViID0gZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9zdHVic1tyX3N5bW5keF07Ci0JCSAgcmVsb2NhdGlvbiA9IChmbl9zdHViLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBmbl9zdHViLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCi0JICAgICAgLyogUkVMT0NBVElPTiBub3cgcG9pbnRzIHRvIDMyIGJpdCBjb2RlLiAgKi8KLQkgICAgICBvdGhlciA9IDA7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhpcyBmdW5jdGlvbiBoYXMgYSBjYWxsX3N0dWIsIHRoZW4gaXQgaXMgY2FsbGVkIGJ5IGEKLSAgICAgICAgICAgICBtaXBzMTYgZnVuY3Rpb247IHRoZSBjYWxsIG5lZWRzIHRvIGdvIHRocm91Z2ggYSBzdHViIGlmCi0gICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBpcyBhIDMyIGJpdCBmdW5jdGlvbi4gIElmIHRoaXMgcmVsb2MgaXMgYQotICAgICAgICAgICAgIDE2IGJpdCBjYWxsLCBhbmQgdGhlIHN5bWJvbCBpcyBub3QgYSAxNiBiaXQgZnVuY3Rpb24sCi0gICAgICAgICAgICAgdGhlbiByZWRpcmVjdCB0aGUgcmVsb2MgdG8gdGhlIHN0dWIuICBOb3RlIHRoYXQgd2UgZG9uJ3QKLSAgICAgICAgICAgICBuZWVkIHRvIHdvcnJ5IGFib3V0IGNhbGxpbmcgdGhlIGZ1bmN0aW9uIHRocm91Z2ggYQotICAgICAgICAgICAgIGZ1bmN0aW9uIHBvaW50ZXI7IHN1Y2ggY2FsbHMgYXJlIGhhbmRsZWQgYnkgcm91dGluZwotICAgICAgICAgICAgIHRocm91Z2ggYSBzcGVjaWFsIG1pcHMxNiByb3V0aW5lLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGVjawotICAgICAgICAgICAgIHdoZXRoZXIgdGhpcyBjYWxsIGlzIGZyb20gYSBzdHViOyBpdCBjYW4ndCBiZSwgYmVjYXVzZSBhCi0gICAgICAgICAgICAgc3R1YiBjb250YWlucyAzMiBiaXQgY29kZSwgYW5kIGhlbmNlIGNhbiBub3QgaGF2ZSBhIDE2Ci0gICAgICAgICAgICAgYml0IHJlbG9jLiAgKi8KLQkgIGlmIChyX3R5cGUgPT0gUl9NSVBTMTZfMjYKLQkgICAgICAmJiBtaCAhPSBOVUxMCi0JICAgICAgJiYgKG1oLT5jYWxsX3N0dWIgIT0gTlVMTCB8fCBtaC0+Y2FsbF9mcF9zdHViICE9IE5VTEwpCi0JICAgICAgJiYgb3RoZXIgIT0gU1RPX01JUFMxNikKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzdHViOwotCi0JICAgICAgLyogSWYgYm90aCBjYWxsX3N0dWIgYW5kIGNhbGxfZnBfc3R1YiBhcmUgZGVmaW5lZCwgd2UKLSAgICAgICAgICAgICAgICAgY2FuIGZpZ3VyZSBvdXQgd2hpY2ggb25lIHRvIHVzZSBieSBzZWVpbmcgd2hpY2ggb25lCi0gICAgICAgICAgICAgICAgIGFwcGVhcnMgaW4gdGhlIGlucHV0IGZpbGUuICAqLwotCSAgICAgIGlmIChtaC0+Y2FsbF9zdHViICE9IE5VTEwgJiYgbWgtPmNhbGxfZnBfc3R1YiAhPSBOVUxMKQotCQl7Ci0JCSAgYXNlY3Rpb24gKm87Ci0KLQkJICBzdHViID0gTlVMTDsKLQkJICBmb3IgKG8gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCQkgICAgewotCQkgICAgICBpZiAoc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgbyksCi0JCQkJICAgQ0FMTF9GUF9TVFVCLCBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgPT0gMCkKLQkJCXsKLQkJCSAgc3R1YiA9IG1oLT5jYWxsX2ZwX3N0dWI7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgfQotCQkgIGlmIChzdHViID09IE5VTEwpCi0JCSAgICBzdHViID0gbWgtPmNhbGxfc3R1YjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG1oLT5jYWxsX3N0dWIgIT0gTlVMTCkKLQkJc3R1YiA9IG1oLT5jYWxsX3N0dWI7Ci0JICAgICAgZWxzZQotCQlzdHViID0gbWgtPmNhbGxfZnBfc3R1YjsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHN0dWItPl9yYXdfc2l6ZSA+IDApOwotCSAgICAgIHJlbG9jYXRpb24gPSBzdHViLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc3R1Yi0+b3V0cHV0X29mZnNldDsKLQkgICAgfQotCi0JICBpZiAocl90eXBlID09IFJfTUlQU19ISTE2KQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmxvcmVsOwotCi0JICAgICAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCBwZXJtaXQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZgotCQkgUl9NSVBTX0hJMTYgcmVsb2NzIGJlZm9yZSB0aGUgUl9NSVBTX0xPMTYgcmVsb2MuCi0JCSBUaGlzIHBlcm1pdHMgZ2NjIHRvIGVtaXQgdGhlIEhJIGFuZCBMTyByZWxvY3MgaXRzZWxmLiAgKi8KLQkgICAgICBmb3IgKGxvcmVsID0gcmVsICsgMTsKLQkJICAgKGxvcmVsIDwgcmVsZW5kCi0JCSAgICAmJiBFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTUlQU19ISTE2KTsKLQkJICAgbG9yZWwrKykKLQkJOwotCSAgICAgIGlmIChsb3JlbCA8IHJlbGVuZAotCQkgICYmIEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NSVBTX0xPMTYpCi0JCXsKLQkJICBtaXBzX2VsZl9yZWxvY2F0ZV9oaTE2IChpbnB1dF9iZmQsIHJlbCwgbG9yZWwsCi0JCQkJCSAgY29udGVudHMsIHJlbG9jYXRpb24gKyBhZGRlbmQpOwotCQkgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCQkgICAgICByZWxvY2F0aW9uLCBhZGRlbmQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChyX3R5cGUgPT0gUl9NSVBTX0dPVDE2ICYmIGxvY2FsKQotCSAgICB7Ci0JICAgICAgLyogR09UMTYgbXVzdCBhbHNvIGhhdmUgYW4gYXNzb2NpYXRlZCBMTzE2IGluIHRoZSBsb2NhbAotCQkgY2FzZS4gIEluIHRoaXMgY2FzZSwgdGhlIGFkZGVuZCBpcyBleHRyYWN0ZWQgYW5kIHRoZQotCQkgc2VjdGlvbiBpbiB3aGljaCB0aGUgcmVmZXJlbmNlZCBvYmplY3QgaXMgZGV0ZXJtaW5lZC4KLQkJIFRoZW4gdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlIG9iamVjdCBpcyBjb21wdXRlZCBhbmQKLQkJIHRoZSBHT1QgZW50cnkgZm9yIHRoZSBoaXBhZ2UgKGFuIGFsaWduZWQgNjRrYiBjaHVuaykKLQkJIGlzIGFkZGVkIHRvIC5nb3Qgc2VjdGlvbiBpZiBuZWVkZWQuICBUaGUgb2Zmc2V0IGZpZWxkCi0JCSBvZiB0aGUgR09UMTYtcmVsb2NhdGVkIGluc3RydWN0aW9uIGlzIHJlcGxhY2VkIGJ5IHRoZQotCQkgaW5kZXggb2YgdGhpcyBHT1QgZW50cnkgZm9yIHRoZSBoaXBhZ2UuICAqLwotCSAgICAgIGlmICgocmVsICsgMSkgPCByZWxlbmQKLQkJICAmJiBFTEYzMl9SX1RZUEUgKChyZWwgKyAxKS0+cl9pbmZvKSA9PSBSX01JUFNfTE8xNikKLQkJewotCQkgIGlmICghIG1pcHNfZWxmX3JlbG9jYXRlX2dvdF9sb2NhbCAob3V0cHV0X2JmZCwgaW5wdXRfYmZkLAotCQkJCQkJICAgICBzZ290LCByZWwsIHJlbCArIDEsCi0JCQkJCQkgICAgIGNvbnRlbnRzLAotCQkJCQkJICAgICByZWxvY2F0aW9uICsgYWRkZW5kKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICByID0gYmZkX3JlbG9jX29rOwotCQl9Ci0JICAgICAgZWxzZQotCQlyID0gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFNfQ0FMTDE2Ci0JCSAgIHx8IHJfdHlwZSA9PSBSX01JUFNfR09UMTYKLQkJICAgfHwgcl90eXBlID09IFJfTUlQU19DQUxMX0xPMTYKLQkJICAgfHwgcl90eXBlID09IFJfTUlQU19HT1RfTE8xNikKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2Zmc2V0OwotCi0JICAgICAgLyogVGhpcyBzeW1ib2wgbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgZ2xvYmFsIHN5bWJvbAotCQkgaGF2aW5nIHRoZSBjb3JyZXNwb25kaW5nIGdvdCBlbnRyeS4gICovCi0JICAgICAgQkZEX0FTU0VSVCAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICAgICAgb2Zmc2V0ID0gKGgtPmR5bmluZHggLSBnLT5nbG9iYWxfZ290c3ltICsgZy0+bG9jYWxfZ290bm8pICogNDsKLQkgICAgICBCRkRfQVNTRVJUIChnLT5sb2NhbF9nb3RubyA8PSBvZmZzZXQKLQkJCSAgJiYgb2Zmc2V0IDwgc2dvdC0+X3Jhd19zaXplKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uICsgYWRkZW5kLAotCQkJICBzZ290LT5jb250ZW50cyArIG9mZnNldCk7Ci0JICAgICAgb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIG9mZnNldCAtIGdwKTsKLQkgICAgICBtaXBzX2VsZl9yZWxvY2F0ZV9nbG9iYWxfZ290IChpbnB1dF9iZmQsIHJlbCwgY29udGVudHMsCi0JCQkJCSAgICBvZmZzZXQpOwotCSAgICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFNfQ0FMTF9ISTE2Ci0JCSAgIHx8IHJfdHlwZSA9PSBSX01JUFNfR09UX0hJMTYpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZnNldDsKLQotCSAgICAgIC8qIFRoaXMgbXVzdCBiZSBhIGdsb2JhbCBzeW1ib2wgd2l0aCBhIGdvdCBlbnRyeS4gIFRoZQotICAgICAgICAgICAgICAgICBuZXh0IHJlbG9jIG11c3QgYmUgdGhlIGNvcnJlc3BvbmRpbmcgTE8xNiByZWxvYy4gICovCi0JICAgICAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMICYmIGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKTsKLQkgICAgICBCRkRfQVNTRVJUICgocmVsICsgMSkgPCByZWxlbmQpOwotCSAgICAgIEJGRF9BU1NFUlQgKChpbnQpIEVMRjMyX1JfVFlQRSAoKHJlbCArIDEpLT5yX2luZm8pCi0JCQkgID09IChyX3R5cGUgPT0gUl9NSVBTX0NBTExfSEkxNgotCQkJICAgICAgPyAoaW50KSBSX01JUFNfQ0FMTF9MTzE2Ci0JCQkgICAgICA6IChpbnQpIFJfTUlQU19HT1RfTE8xNikpOwotCi0JICAgICAgb2Zmc2V0ID0gKGgtPmR5bmluZHggLSBnLT5nbG9iYWxfZ290c3ltICsgZy0+bG9jYWxfZ290bm8pICogNDsKLQkgICAgICBCRkRfQVNTRVJUIChnLT5sb2NhbF9nb3RubyA8PSBvZmZzZXQKLQkJCSAgJiYgb2Zmc2V0IDwgc2dvdC0+X3Jhd19zaXplKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uICsgYWRkZW5kLAotCQkJICBzZ290LT5jb250ZW50cyArIG9mZnNldCk7Ci0JICAgICAgb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIG9mZnNldCAtIGdwKTsKLQkgICAgICBtaXBzX2VsZl9yZWxvY2F0ZV9oaTE2IChpbnB1dF9iZmQsIHJlbCwgcmVsICsgMSwgY29udGVudHMsCi0JCQkJICAgICAgb2Zmc2V0KTsKLQkgICAgICByID0gYmZkX3JlbG9jX29rOwotCSAgICB9Ci0JICBlbHNlIGlmIChyX3R5cGUgPT0gUl9NSVBTX1JFTDMyCi0JCSAgIHx8IHJfdHlwZSA9PSBSX01JUFNfMzIpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsIG91dHJlbDsKLQkgICAgICBFbGYzMl9jcmluZm8gY3B0cmVsOwotCSAgICAgIGJmZF9ieXRlICpjcjsKLQotCSAgICAgIGlmICgoaW5mby0+c2hhcmVkCi0JCSAgIHx8IChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAgICAgJiYgaCAhPSBOVUxMCi0JCSAgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKQotCQkJICAgPT0gMCkpKQotCQkgICYmIChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJewotCQkgIGJvb2xlYW4gc2tpcDsKLQotCQkgIC8qIFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHRoZXNlCi0JCSAgICAgcmVsb2NhdGlvbnMgYXJlIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZQotCQkgICAgIHJlc29sdmVkIGF0IHJ1biB0aW1lLiAgKi8KLQkJICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmR5biIpOwotCQkgICAgICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7Ci0JCSAgICB9Ci0KLQkJICBza2lwID0gZmFsc2U7Ci0KLQkJICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQotCQkgICAgb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JCSAgICAgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJCSAgICAgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCSAgICAgIHJlbC0+cl9vZmZzZXQpKTsKLQkJICAgICAgaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCi0JCQlza2lwID0gdHJ1ZTsKLQkJICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCQkgICAgfQotCi0JCSAgb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCQkgIGFkZGVuZCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQotCQkgIGlmIChza2lwKQotCQkgICAgbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQkJICBlbHNlIGlmIChoICE9IE5VTEwKLQkJCSAgICYmICghIGluZm8tPnN5bWJvbGljCi0JCQkgICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQkgICAgewotCQkgICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9NSVBTX1JFTDMyKTsKLQkJICAgICAgc2VjID0gaW5wdXRfc2VjdGlvbjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgaW5keDsKLQotCQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQkJc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCQkgICAgICB8fCAoaC0+cm9vdC50eXBlCi0JCQkJCSAgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSk7Ci0JCQkgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJCX0KLQkJICAgICAgaWYgKHNlYyAhPSBOVUxMICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLQkJCWluZHggPSAwOwotCQkgICAgICBlbHNlIGlmIChzZWMgPT0gTlVMTCB8fCBzZWMtPm93bmVyID09IE5VTEwpCi0JCQl7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYXNlY3Rpb24gKm9zZWM7Ci0KLQkJCSAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JCQkgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChvc2VjKS0+ZHluaW5keDsKLQkJCSAgaWYgKGluZHggPT0gMCkKLQkJCSAgICBhYm9ydCAoKTsKLQkJCX0KLQotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChpbmR4LCBSX01JUFNfUkVMMzIpOwotCQkgICAgICBhZGRlbmQgKz0gcmVsb2NhdGlvbjsKLQkJICAgIH0KLQotCQkgIGlmICghIHNraXApCi0JCSAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBhZGRlbmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0KLQkJICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCSAgICAgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsICopCi0JCQkJCSAgICAgICBzcmVsb2MtPmNvbnRlbnRzKQotCQkJCQkgICAgICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkJICArK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0KLQkJICBpZiAoISBza2lwICYmIFNHSV9DT01QQVQgKG91dHB1dF9iZmQpKQotCQkgICAgewotCQkgICAgICBpZiAoc2NwdCA9PSBOVUxMKQotCQkJY29udGludWU7Ci0KLQkJICAgICAgLyogTWFrZSBhbiBlbnRyeSBvZiBjb21wYWN0IHJlbG9jYXRpb24gaW5mby4gICovCi0JCSAgICAgIG1pcHNfZWxmX3NldF9jcl9mb3JtYXQgKGNwdHJlbCwgQ1JGX01JUFNfTE9ORyk7Ci0JCSAgICAgIGNwdHJlbC52YWRkciA9IChyZWwtPnJfb2Zmc2V0Ci0JCQkJICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkJICAgICAgaWYgKHJfdHlwZSA9PSBSX01JUFNfUkVMMzIpCi0JCQltaXBzX2VsZl9zZXRfY3JfdHlwZSAoY3B0cmVsLCBDUlRfTUlQU19SRUwzMik7Ci0JCSAgICAgIGVsc2UKLQkJCW1pcHNfZWxmX3NldF9jcl90eXBlIChjcHRyZWwsIENSVF9NSVBTX1dPUkQpOwotCQkgICAgICBtaXBzX2VsZl9zZXRfY3JfZGlzdDJ0byAoY3B0cmVsLCAwKTsKLQkJICAgICAgY3B0cmVsLmtvbnN0ID0gYWRkZW5kOwotCi0JCSAgICAgIGNyID0gKHNjcHQtPmNvbnRlbnRzCi0JCQkgICAgKyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsKSk7Ci0JCSAgICAgIGJmZF9lbGYzMl9zd2FwX2NyaW5mb19vdXQgKG91dHB1dF9iZmQsICZjcHRyZWwsCi0JCQkJCQkgKChFbGYzMl9FeHRlcm5hbF9jcmluZm8gKikgY3IKLQkJCQkJCSAgKyBzY3B0LT5yZWxvY19jb3VudCkpOwotCQkgICAgICArK3NjcHQtPnJlbG9jX2NvdW50OwotCQkgICAgfQotCi0JCSAgLyogVGhpcyByZWxvYyB3aWxsIGJlIGNvbXB1dGVkIGF0IHJ1bnRpbWUsIHNvCi0JCSAgICAgdGhlcmUncyBubyBuZWVkIHRvIGRvIGFueXRoaW5nIG5vdy4gICovCi0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCQkgICAgICByZWxvY2F0aW9uLCBhZGRlbmQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChyX3R5cGUgPT0gUl9NSVBTXzY0KQotCSAgICB7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBhZGRyOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0JICAgICAgLyogRG8gYSAzMiBiaXQgcmVsb2NhdGlvbiwgYW5kIHNpZ24gZXh0ZW5kIHRvIDY0IGJpdHMuICAqLwotCSAgICAgIGFkZHIgPSByZWwtPnJfb2Zmc2V0OwotCSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQkJYWRkciArPSA0OwotCSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICBjb250ZW50cywgYWRkciwgcmVsb2NhdGlvbiwKLQkJCQkJICAgIGFkZGVuZCk7Ci0JICAgICAgdmFsID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIGFkZHIpOwotCSAgICAgIGlmICgodmFsICYgMHg4MDAwMDAwMCkgIT0gMCkKLQkJdmFsID0gMHhmZmZmZmZmZjsKLQkgICAgICBlbHNlCi0JCXZhbCA9IDA7Ci0JICAgICAgYWRkciA9IHJlbC0+cl9vZmZzZXQ7Ci0JICAgICAgaWYgKGJmZF9saXR0bGVfZW5kaWFuIChpbnB1dF9iZmQpKQotCQlhZGRyICs9IDQ7Ci0JICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWwsIGNvbnRlbnRzICsgYWRkcik7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFNfMjYgJiYgb3RoZXIgPT0gU1RPX01JUFMxNikKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQotCSAgICAgIC8qIFRoaXMgaXMgYSBqdW1wIHRvIGEgbWlwczE2IHJvdXRpbmUgZnJvbSBhIG1pcHMzMgotICAgICAgICAgICAgICAgICByb3V0aW5lLiAgV2UgbmVlZCB0byBjaGFuZ2UgamFsIGludG8gamFseC4gICovCi0JICAgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkgICAgICBpZiAoKChpbnNuID4+IDI2KSAmIDB4M2YpICE9IDB4MwotCQkgICYmICgoaW5zbiA+PiAyNikgJiAweDNmKSAhPSAweDFkKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6ICVzKzB4JWx4OiBqdW1wIHRvIG1pcHMxNiByb3V0aW5lIHdoaWNoIGlzIG5vdCBqYWwiKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkgICAgIGlucHV0X3NlY3Rpb24tPm5hbWUsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl9vZmZzZXQpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIGluc24gPSAoaW5zbiAmIDB4M2ZmZmZmZikgfCAoMHgxZCA8PCAyNik7Ci0JICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBpbnNuLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkJICAgIHJlbG9jYXRpb24sIGFkZGVuZCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFMxNl8yNikKLQkgICAgewotCSAgICAgIC8qIEl0J3MgZWFzaWVzdCB0byBkbyB0aGUgbm9ybWFsIHJlbG9jYXRpb24sIGFuZCB0aGVuCi0gICAgICAgICAgICAgICAgIGRpZyBvdXQgdGhlIGluc3RydWN0aW9uIGFuZCBzd2FwIHRoZSBmaXJzdCB3b3JkIHRoZQotICAgICAgICAgICAgICAgICB3YXkgdGhlIG1pcHMxNiBleHBlY3RzIGl0LiAgSWYgdGhpcyBpcyBsaXR0bGUgZW5kaWFuLAotICAgICAgICAgICAgICAgICB0aG91Z2gsIHdlIG5lZWQgdG8gc3dhcCB0aGUgdHdvIHdvcmRzIGZpcnN0LCBhbmQgdGhlbgotICAgICAgICAgICAgICAgICBzd2FwIHRoZW0gYmFjayBhZ2FpbiBsYXRlciwgc28gdGhhdCB0aGUgYWRkcmVzcyBsb29rcwotICAgICAgICAgICAgICAgICByaWdodC4gICovCi0KLQkgICAgICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKGlucHV0X2JmZCkpCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIGluc247Ci0KLQkJICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQkgIGluc24gPSAoKGluc24gPj4gMTYpICYgMHhmZmZmKSB8ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpOwotCQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkJfQotCi0JICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCQkgICAgcmVsb2NhdGlvbiwgYWRkZW5kKTsKLQkgICAgICBpZiAociA9PSBiZmRfcmVsb2Nfb2spCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIGluc247Ci0KLQkJICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKGlucHV0X2JmZCkpCi0JCSAgICB7Ci0JCSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JCSAgICAgIGluc24gPSAoKGluc24gPj4gMTYpICYgMHhmZmZmKSB8ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpOwotCQkgICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIGluc24sIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JCSAgICB9Ci0KLQkJICBpbnNuID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQkgIGluc24gPSAoKGluc24gJiAweGZjMDApCi0JCQkgIHwgKChpbnNuICYgMHgxZikgPDwgNSkKLQkJCSAgfCAoKGluc24gJiAweDNlMCkgPj4gNSkpOwotCQkgIC8qIElmIHRoaXMgaXMgYSBqdW1wIHRvIGEgMzIgYml0IHJvdXRpbmUsIHRoZW4gbWFrZQotCQkgICAgIGl0IGphbHguICAqLwotCQkgIGlmIChvdGhlciAhPSBTVE9fTUlQUzE2KQotCQkgICAgaW5zbiB8PSAweDQwMDsKLQkJICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIGluc24sIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocl90eXBlID09IFJfTUlQUzE2X0dQUkVMKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgc2hvcnQgZXh0ZW5kLCBpbnNuOwotCSAgICAgIGJmZF9ieXRlIGJ1Zls0XTsKLQkgICAgICB1bnNpZ25lZCBsb25nIGZpbmFsOwotCi0JICAgICAgLyogRXh0cmFjdCB0aGUgYWRkZW5kIGludG8gYnVmLCBydW4gdGhlIHJlZ3VsYXIgcmVsb2MsCi0gICAgICAgICAgICAgICAgIGFuZCBzdHVmZiB0aGUgcmVzdWx0aW5nIHZhbHVlIGJhY2sgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgICAgICBpZiAocmVsLT5yX29mZnNldCA+IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkKLQkJciA9IGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGV4dGVuZCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkJICBpbnNuID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQgKyAyKTsKLQkJICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsCi0JCQkgICAgICAoKChleHRlbmQgJiAweDFmKSA8PCAxMSkKLQkJCSAgICAgICB8IChleHRlbmQgJiAweDdlMCkKLQkJCSAgICAgICB8IChpbnNuICYgMHgxZikpLAotCQkJICAgICAgYnVmKTsKLQkJICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLAotCQkJCQkJaW5wdXRfc2VjdGlvbiwgYnVmLAotCQkJCQkJKGJmZF92bWEpIDAsIHJlbG9jYXRpb24sCi0JCQkJCQlhZGRlbmQpOwotCQkgIGZpbmFsID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBidWYpOwotCQkgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwKLQkJCSAgICAgICgoZXh0ZW5kICYgMHhmODAwKQotCQkJICAgICAgIHwgKChmaW5hbCA+PiAxMSkgJiAweDFmKQotCQkJICAgICAgIHwgKGZpbmFsICYgMHg3ZTApKSwKLQkJCSAgICAgIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JCSAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLAotCQkJICAgICAgKChpbnNuICYgMHhmZmUwKQotCQkJICAgICAgIHwgKGZpbmFsICYgMHgxZikpLAotCQkJICAgICAgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0ICsgMik7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCQkgIHJlbG9jYXRpb24sIGFkZGVuZCk7Ci0KLQkgIC8qIFRoZSBqYWwgaW5zdHJ1Y3Rpb24gY2FuIG9ubHkganVtcCB0byBhbiBhZGRyZXNzIHdoaWNoIGlzCi0gICAgICAgICAgICAgZGl2aXNpYmxlIGJ5IDQsIGFuZCBpdCBjYW4gb25seSBqdW1wIHRvIGFuIGFkZHJlc3Mgd2l0aAotICAgICAgICAgICAgIHRoZSBzYW1lIHVwcGVyIDQgYml0cyBhcyB0aGUgUEMuICAqLwotCSAgaWYgKHIgPT0gYmZkX3JlbG9jX29rCi0JICAgICAgJiYgKHJfdHlwZSA9PSBSX01JUFMxNl8yNiB8fCByX3R5cGUgPT0gUl9NSVBTXzI2KSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgYWRkcjsKLSAgICAgICAgICAgICAgYmZkX3ZtYSBwYzsKLSAgICAgICAgICAgICAgYmZkX3ZtYSB0YXJnZXQ7Ci0KLSAgICAgICAgICAgICAgcGMgPSAoKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLSAgICAgICAgICAgICAgICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotICAgICAgICAgICAgICAgICAgICAgKyByZWwtPnJfb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICAmIDB4ZjAwMDAwMDApOwotICAgICAgICAgICAgICB0YXJnZXQgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCkKLQkJCSYgKGhvd3RvLT5kc3RfbWFzayk7Ci0gICAgICAgICAgICAgIGFkZHIgPSAodGFyZ2V0IDw8IDIpICsgcGM7Ci0JICAgICAgaWYgKG90aGVyID09IFNUT19NSVBTMTYpCi0JCWFkZHIgJj0gfiAoYmZkX3ZtYSkgMTsKLQkgICAgICBpZiAoKGFkZHIgJiAzKSAhPSAwCi0JCSAgfHwgKChhZGRyICYgMHhmMDAwMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAhPSBwYykpCi0JCXIgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JICAgIH0KLQotCSAgLyogRG9uJ3QgYm90aGVyIHRvIHJlcG9ydCBhIHJlbG9jYXRpb24gb3ZlcmZsb3cgZm9yIGEgY2FsbAotICAgICAgICAgICAgIHRvIGEgd2VhayB1bmRlZmluZWQgc3ltYm9sIHdpdGggYSB2YWx1ZSBvZiB6ZXJvLiAgVGhpcwotICAgICAgICAgICAgIHBlcm1pdHMgdXMgdG8gdXNlCi0JICAgICAgICAgaWYgKCFmKSBmKCk7Ci0JICAgICBldmVuIGlmIHdlIGFyZW4ndCBpbiByYW5nZSB0byBjYWxsIGFkZHJlc3MgemVyby4gICovCi0JICBpZiAociA9PSBiZmRfcmVsb2Nfb3ZlcmZsb3cKLQkgICAgICAmJiAocl90eXBlID09IFJfTUlQUzE2XzI2IHx8IHJfdHlwZSA9PSBSX01JUFNfMjYpCi0JICAgICAgJiYgcmVsb2NhdGlvbiArIGFkZGVuZCA9PSAwCi0JICAgICAgJiYgaCAhPSBOVUxMCi0JICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByID0gYmZkX3JlbG9jX29rOwotCi0JICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IGlzc3VlZCBhbiBlcnJvciBmb3IgYW4gdW5kZWZpbmVkIHN5bWJvbCwKLSAgICAgICAgICAgICBkb24ndCBpc3N1ZSBhbm90aGVyIHVzZWxlc3MgZXJyb3IuICAqLwotCSAgaWYgKHVuZGVmaW5lZF9lcnJvcgotCSAgICAgICYmIChyID09IGJmZF9yZWxvY191bmRlZmluZWQgfHwgciA9PSBiZmRfcmVsb2Nfb3ZlcmZsb3cpKQotCSAgICByID0gYmZkX3JlbG9jX29rOwotCi0JICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkKLQkgICAgICAmJiBzY3B0ICE9IE5VTEwKLQkgICAgICAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JICAgIHsKLQkgICAgICBFbGYzMl9jcmluZm8gY3B0cmVsOwotCSAgICAgIGJmZF9ieXRlICpjcjsKLQotCSAgICAgIC8qIE1ha2UgYW4gZW50cnkgb2YgY29tcGFjdCByZWxvY2F0aW9uIGluZm8uICAqLwotCSAgICAgIG1pcHNfZWxmX3NldF9jcl9mb3JtYXQgKGNwdHJlbCwgQ1JGX01JUFNfTE9ORyk7Ci0JICAgICAgY3B0cmVsLnZhZGRyID0gKHJlbC0+cl9vZmZzZXQKLQkJCSAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIHN3aXRjaCAocl90eXBlKQotCQl7Ci0JCWNhc2UgUl9NSVBTXzI2OgotCQkgIG1pcHNfZWxmX3NldF9jcl90eXBlIChjcHRyZWwsIENSVF9NSVBTX0pNUEFEKTsKLQkJICAvKiBYWFggSG93IHNob3VsZCB3ZSBzZXQgZGlzdDJ0byBpbiB0aGlzIGNhc2UuICovCi0JCSAgbWlwc19lbGZfc2V0X2NyX2Rpc3QydG8gKGNwdHJlbCwgOCk7Ci0JCSAgY3B0cmVsLmtvbnN0ID0gYWRkZW5kICsgcmVsb2NhdGlvbjsKLQkJICBjciA9IHNjcHQtPmNvbnRlbnRzICsgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbCk7Ci0JCSAgYmZkX2VsZjMyX3N3YXBfY3JpbmZvX291dCAob3V0cHV0X2JmZCwgJmNwdHJlbCwKLQkJCQkJICAgICAoKEVsZjMyX0V4dGVybmFsX2NyaW5mbyAqKSBjcgotCQkJCQkgICAgICArIHNjcHQtPnJlbG9jX2NvdW50KSk7Ci0JCSAgKytzY3B0LT5yZWxvY19jb3VudDsKLQkJICBicmVhazsKLQotCQljYXNlIFJfTUlQU19HUFJFTDE2OgotCQljYXNlIFJfTUlQU19MSVRFUkFMOgotCQljYXNlIFJfTUlQU19HUFJFTDMyOgotCQkgIG1pcHNfZWxmX3NldF9jcl90eXBlIChjcHRyZWwsIENSVF9NSVBTX0dQSElfTE8pOwotCQkgIGNwdHJlbC5rb25zdCA9IGdwIC0gY3B0cmVsLnZhZGRyOwotCQkgIG1pcHNfZWxmX3NldF9jcl9kaXN0MnRvIChjcHRyZWwsIDQpOwotCQkgIGNyID0gc2NwdC0+Y29udGVudHMgKyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsKTsKLQkJICBiZmRfZWxmMzJfc3dhcF9jcmluZm9fb3V0IChvdXRwdXRfYmZkLCAmY3B0cmVsLAotCQkJCQkgICAgICgoRWxmMzJfRXh0ZXJuYWxfY3JpbmZvICopIGNyCi0JCQkJCSAgICAgICsgc2NwdC0+cmVsb2NfY291bnQpKTsKLQkJICArK3NjcHQtPnJlbG9jX2NvdW50OwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJICAgIHN5bS0+c3RfbmFtZSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0JCWlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaG9vayBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIHRoZSBsaW5rZXIgd3JpdGVzIG91dCBhIGdsb2JhbAotICAgc3ltYm9sLiAgV2UgbWFyayBzeW1ib2xzIGFzIHNtYWxsIGNvbW1vbiBpZiBhcHByb3ByaWF0ZS4gIFRoaXMgaXMKLSAgIGFsc28gd2hlcmUgd2UgdW5kbyB0aGUgaW5jcmVtZW50IG9mIHRoZSB2YWx1ZSBmb3IgYSBtaXBzMTYgc3ltYm9sLiAgKi8KLQotLypBUkdTSUdOT1JFRCovCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIG5hbWUsIHN5bSwgaW5wdXRfc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWM7Ci17Ci0gIC8qIElmIHdlIHNlZSBhIGNvbW1vbiBzeW1ib2wsIHdoaWNoIGltcGxpZXMgYSByZWxvY2F0YWJsZSBsaW5rLCB0aGVuCi0gICAgIGlmIGEgc3ltYm9sIHdhcyBzbWFsbCBjb21tb24gaW4gYW4gaW5wdXQgZmlsZSwgbWFyayBpdCBhcyBzbWFsbAotICAgICBjb21tb24gaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgaWYgKHN5bS0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTgotICAgICAgJiYgc3RyY21wIChpbnB1dF9zZWMtPm5hbWUsICIuc2NvbW1vbiIpID09IDApCi0gICAgc3ltLT5zdF9zaG5keCA9IFNITl9NSVBTX1NDT01NT047Ci0KLSAgaWYgKHN5bS0+c3Rfb3RoZXIgPT0gU1RPX01JUFMxNgotICAgICAgJiYgKHN5bS0+c3RfdmFsdWUgJiAxKSAhPSAwKQotICAgIC0tc3ltLT5zdF92YWx1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBmb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KLQotLyogVGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgaW50ZXJwcmV0ZXIuICBUaGlzIGlzIHB1dCBpbiB0aGUgLmludGVycAotICAgc2VjdGlvbi4gICovCi0KLSNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgIi91c3IvbGliL2xpYmMuc28uMSIKLQotLyogQ3JlYXRlIGR5bmFtaWMgc2VjdGlvbnMgd2hlbiBsaW5raW5nIGFnYWluc3QgYSBkeW5hbWljIG9iamVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgY29uc3QgY2hhciAqIGNvbnN0ICpuYW1lcDsKLQotICBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZCi0JICAgfCBTRUNfTElOS0VSX0NSRUFURUQgfCBTRUNfUkVBRE9OTFkpOwotCi0gIC8qIE1pcHMgQUJJIHJlcXVlc3RzIHRoZSAuZHluYW1pYyBzZWN0aW9uIHRvIGJlIHJlYWQgb25seS4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7Ci0gIGlmIChzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSAuZ290IHNlY3Rpb24uICAqLwotICBpZiAoISBtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDcmVhdGUgLnN0dWIgc2VjdGlvbi4gICovCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zdHViIikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5zdHViIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpCi0gICAgICAmJiAhaW5mby0+c2hhcmVkCi0gICAgICAmJiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ybGRfbWFwIikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5ybGRfbWFwIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgJiB+U0VDX1JFQURPTkxZKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChTR0lfQ09NUEFUIChhYmZkKSkKLSAgICB7Ci0gICAgICBmb3IgKG5hbWVwID0gbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lczsgKm5hbWVwICE9IE5VTEw7IG5hbWVwKyspCi0JewotCSAgaCA9IE5VTEw7Ci0JICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJIChpbmZvLCBhYmZkLCAqbmFtZXAsIEJTRl9HTE9CQUwsIGJmZF91bmRfc2VjdGlvbl9wdHIsCi0JCSAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCQkgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0JICBoLT50eXBlID0gU1RUX1NFQ1RJT047Ci0KLQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gY3JlYXRlIGEgLmNvbXBhY3RfcmVsIHNlY3Rpb24uICAqLwotICAgICAgaWYgKCEgbWlwc19lbGZfY3JlYXRlX2NvbXBhY3RfcmVsX3NlY3Rpb24gKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQ2hhbmdlIGFsaWdtZW50cyBvZiBzb21lIHNlY3Rpb25zLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5oYXNoIik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDQpOwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN5bSIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCA0KTsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5zdHIiKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCk7Ci0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmVnaW5mbyIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCA0KTsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDQpOwotICAgIH0KLQotICBpZiAoIWluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBoID0gTlVMTDsKLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGFiZmQsICJfRFlOQU1JQ19MSU5LIiwgQlNGX0dMT0JBTCwgYmZkX2Fic19zZWN0aW9uX3B0ciwKLQkgICAgICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JICAgICAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICAgICAgaC0+dHlwZSA9IFNUVF9TRUNUSU9OOwotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnVzZV9ybGRfb2JqX2hlYWQpCi0JewotCSAgLyogX19ybGRfbWFwIGlzIGEgZm91ciBieXRlIHdvcmQgbG9jYXRlZCBpbiB0aGUgLmRhdGEgc2VjdGlvbgotCSAgICAgYW5kIGlzIGZpbGxlZCBpbiBieSB0aGUgcnRsZCB0byBjb250YWluIGEgcG9pbnRlciB0bwotCSAgICAgdGhlIF9yX2RlYnVnIHN0cnVjdHVyZS4gSXRzIHN5bWJvbCB2YWx1ZSB3aWxsIGJlIHNldCBpbgotCSAgICAgbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sLiAgKi8KLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ybGRfbWFwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0JICBoID0gTlVMTDsKLQkgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkgKGluZm8sIGFiZmQsICJfX3JsZF9tYXAiLCBCU0ZfR0xPQkFMLCBzLAotCQkgIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkJICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOwotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotCSAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgdGhlIC5jb21wYWN0X3JlbCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2NyZWF0ZV9jb21wYWN0X3JlbF9zZWN0aW9uIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmNvbXBhY3RfcmVsIikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCSAgICAgICB8IFNFQ19SRUFET05MWSk7Ci0KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmNvbXBhY3RfcmVsIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbCk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgdGhlIC5nb3Qgc2VjdGlvbiB0byBob2xkIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLQotICAvKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuICAqLwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZ290IikgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZCi0JICAgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdvdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBfR0xPQkFMX09GRlNFVF9UQUJMRV8uICBXZSBkb24ndCBkbyB0aGlzIGluIHRoZQotICAgICBsaW5rZXIgc2NyaXB0IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgdGhlIHN5bWJvbCBpZiB3ZQotICAgICBhcmUgbm90IGNyZWF0aW5nIGEgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIGggPSBOVUxMOwotICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgKGluZm8sIGFiZmQsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iLCBCU0ZfR0xPQkFMLCBzLAotCSAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCSAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKLSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotICBpZiAoaW5mby0+c2hhcmVkCi0gICAgICAmJiAhIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBmaXJzdCBzZXZlcmFsIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cmllcyBhcmUgcmVzZXJ2ZWQuICAqLwotICBzLT5fcmF3X3NpemUgPSBNSVBTX1JFU0VSVkVEX0dPVE5PICogNDsKLQotICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICBzaXplb2YgKHN0cnVjdCBtaXBzX2dvdF9pbmZvKSk7Ci0gIGlmIChnID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBnLT5nbG9iYWxfZ290c3ltID0gMDsKLSAgZy0+bG9jYWxfZ290bm8gPSBNSVBTX1JFU0VSVkVEX0dPVE5POwotICBnLT5hc3NpZ25lZF9nb3RubyA9IE1JUFNfUkVTRVJWRURfR09UTk87Ci0gIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHMtPnVzZWRfYnlfYmZkID0KLQkoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSkpOwotICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRkYXRhID0gKFBUUikgZzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKLSAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLSAgc2l6ZV90IGV4dHN5bW9mZjsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbG9jOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgZXh0c3ltb2ZmID0gKGVsZl9iYWRfc3ltdGFiIChhYmZkKSkgPyAwIDogc3ltdGFiX2hkci0+c2hfaW5mbzsKLQotICAvKiBDaGVjayBmb3IgdGhlIG1pcHMxNiBzdHViIHNlY3Rpb25zLiAgKi8KLQotICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0gIGlmIChzdHJuY21wIChuYW1lLCBGTl9TVFVCLCBzaXplb2YgRk5fU1RVQiAtIDEpID09IDApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLQotICAgICAgLyogTG9vayBhdCB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBmaWd1cmUgb3V0IHdoaWNoIHN5bWJvbAotICAgICAgICAgdGhpcyBpcyBmb3IuICAqLwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWxvY3MtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IGV4dHN5bW9mZgotCSAgfHwgc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl0gPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqbzsKLQotCSAgLyogVGhpcyBzdHViIGlzIGZvciBhIGxvY2FsIHN5bWJvbC4gIFRoaXMgc3R1YiB3aWxsIG9ubHkgYmUKLSAgICAgICAgICAgICBuZWVkZWQgaWYgdGhlcmUgaXMgc29tZSByZWxvY2F0aW9uIGluIHRoaXMgQkZELCBvdGhlcgotICAgICAgICAgICAgIHRoYW4gYSAxNiBiaXQgZnVuY3Rpb24gY2FsbCwgd2hpY2ggcmVmZXJzIHRvIHRoaXMgc3ltYm9sLiAgKi8KLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnNlY19yZWxvY3M7Ci0JICAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnIsICpyZW5kOwotCi0JICAgICAgLyogV2UgY2FuIGlnbm9yZSBzdHViIHNlY3Rpb25zIHdoZW4gbG9va2luZyBmb3IgcmVsb2NzLiAgKi8KLQkgICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0JCSAgfHwgby0+cmVsb2NfY291bnQgPT0gMAotCQkgIHx8IHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBvKSwgRk5fU1RVQiwKLQkJCSAgICAgIHNpemVvZiBGTl9TVFVCIC0gMSkgPT0gMAotCQkgIHx8IHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBvKSwgQ0FMTF9TVFVCLAotCQkJICAgICAgc2l6ZW9mIENBTExfU1RVQiAtIDEpID09IDAKLQkJICB8fCBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgbyksIENBTExfRlBfU1RVQiwKLQkJCSAgICAgIHNpemVvZiBDQUxMX0ZQX1NUVUIgLSAxKSA9PSAwKQotCQljb250aW51ZTsKLQotCSAgICAgIHNlY19yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkgICAgKGFiZmQsIG8sIChQVFIpIE5VTEwsCi0JCQkgICAgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkJICAgICBpbmZvLT5rZWVwX21lbW9yeSkpOwotCSAgICAgIGlmIChzZWNfcmVsb2NzID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIHJlbmQgPSBzZWNfcmVsb2NzICsgby0+cmVsb2NfY291bnQ7Ci0JICAgICAgZm9yIChyID0gc2VjX3JlbG9jczsgciA8IHJlbmQ7IHIrKykKLQkJaWYgKEVMRjMyX1JfU1lNIChyLT5yX2luZm8pID09IHJfc3ltbmR4Ci0JCSAgICAmJiBFTEYzMl9SX1RZUEUgKHItPnJfaW5mbykgIT0gUl9NSVBTMTZfMjYpCi0JCSAgYnJlYWs7Ci0KLQkgICAgICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSkKLQkJZnJlZSAoc2VjX3JlbG9jcyk7Ci0KLQkgICAgICBpZiAociA8IHJlbmQpCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChvID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGVyZSBpcyBubyBub24tY2FsbCByZWxvYyBmb3IgdGhpcyBzdHViLCBzbyB3ZSBkbwotICAgICAgICAgICAgICAgICBub3QgbmVlZCBpdC4gIFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZQotICAgICAgICAgICAgICAgICB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0IHNlY3Rpb25zLCB3ZQotICAgICAgICAgICAgICAgICBjYW4gZWFzaWx5IGRpc2NhcmQgaXQgYnkgc2V0dGluZyB0aGUgU0VDX0VYQ0xVREUKLSAgICAgICAgICAgICAgICAgZmxhZy4gICovCi0JICAgICAgc2VjLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCi0JICAvKiBSZWNvcmQgdGhpcyBzdHViIGluIGFuIGFycmF5IG9mIGxvY2FsIHN5bWJvbCBzdHVicyBmb3IKLSAgICAgICAgICAgICB0aGlzIEJGRC4gKi8KLQkgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5sb2NhbF9zdHVicyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyBzeW1jb3VudDsKLQkgICAgICBhc2VjdGlvbiAqKm47Ci0KLQkgICAgICBpZiAoZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotCQlzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0JICAgICAgZWxzZQotCQlzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICAgICAgbiA9IChhc2VjdGlvbiAqKikgYmZkX3phbGxvYyAoYWJmZCwKLQkJCQkJICAgIHN5bWNvdW50ICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0JICAgICAgaWYgKG4gPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmxvY2FsX3N0dWJzID0gbjsKLQkgICAgfQotCi0JICBlbGZfdGRhdGEgKGFiZmQpLT5sb2NhbF9zdHVic1tyX3N5bW5keF0gPSBzZWM7Ci0KLQkgIC8qIFdlIGRvbid0IG5lZWQgdG8gc2V0IG1pcHMxNl9zdHVic19zZWVuIGluIHRoaXMgY2FzZS4KLSAgICAgICAgICAgICBUaGF0IGZsYWcgaXMgdXNlZCB0byBzZWUgd2hldGhlciB3ZSBuZWVkIHRvIGxvb2sgdGhyb3VnaAotICAgICAgICAgICAgIHRoZSBnbG9iYWwgc3ltYm9sIHRhYmxlIGZvciBzdHVicy4gIFdlIGRvbid0IG5lZWQgdG8gc2V0Ci0gICAgICAgICAgICAgaXQgaGVyZSwgYmVjYXVzZSB3ZSBqdXN0IGhhdmUgYSBsb2NhbCBzdHViLiAgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgICAgICBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXSk7Ci0KLQkgIC8qIEggaXMgdGhlIHN5bWJvbCB0aGlzIHN0dWIgaXMgZm9yLiAgKi8KLQotCSAgaC0+Zm5fc3R1YiA9IHNlYzsKLQkgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5taXBzMTZfc3R1YnNfc2VlbiA9IHRydWU7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgQ0FMTF9TVFVCLCBzaXplb2YgQ0FMTF9TVFVCIC0gMSkgPT0gMAotCSAgIHx8IHN0cm5jbXAgKG5hbWUsIENBTExfRlBfU1RVQiwgc2l6ZW9mIENBTExfRlBfU1RVQiAtIDEpID09IDApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBhc2VjdGlvbiAqKmxvYzsKLQotICAgICAgLyogTG9vayBhdCB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBmaWd1cmUgb3V0IHdoaWNoIHN5bWJvbAotICAgICAgICAgdGhpcyBpcyBmb3IuICAqLwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWxvY3MtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IGV4dHN5bW9mZgotCSAgfHwgc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl0gPT0gTlVMTCkKLQl7Ci0JICAvKiBUaGlzIHN0dWIgd2FzIGFjdHVhbGx5IGJ1aWx0IGZvciBhIHN0YXRpYyBzeW1ib2wgZGVmaW5lZAotCSAgICAgaW4gdGhlIHNhbWUgZmlsZS4gIFdlIGFzc3VtZSB0aGF0IGFsbCBzdGF0aWMgc3ltYm9scyBpbgotCSAgICAgbWlwczE2IGNvZGUgYXJlIHRoZW1zZWx2ZXMgbWlwczE2LCBzbyB3ZSBjYW4gc2ltcGx5Ci0JICAgICBkaXNjYXJkIHRoaXMgc3R1Yi4gIFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZQotCSAgICAgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dCBzZWN0aW9ucywgd2UgY2FuCi0JICAgICBlYXNpbHkgZGlzY2FyZCBpdCBieSBzZXR0aW5nIHRoZSBTRUNfRVhDTFVERSBmbGFnLiAgKi8KLQkgIHNlYy0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIGggPSAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXSk7Ci0KLSAgICAgIC8qIEggaXMgdGhlIHN5bWJvbCB0aGlzIHN0dWIgaXMgZm9yLiAgKi8KLQotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsIENBTExfRlBfU1RVQiwgc2l6ZW9mIENBTExfRlBfU1RVQiAtIDEpID09IDApCi0JbG9jID0gJmgtPmNhbGxfZnBfc3R1YjsKLSAgICAgIGVsc2UKLQlsb2MgPSAmaC0+Y2FsbF9zdHViOwotCi0gICAgICAvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYW4gYXBwcm9wcmlhdGUgc3R1YiBmb3IgdGhpcyBmdW5jdGlvbiwgd2UKLQkgZG9uJ3QgbmVlZCBhbm90aGVyIG9uZSwgc28gd2UgY2FuIGRpc2NhcmQgdGhpcyBvbmUuICBTaW5jZQotCSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zCi0JIHRvIG91dHB1dCBzZWN0aW9ucywgd2UgY2FuIGVhc2lseSBkaXNjYXJkIGl0IGJ5IHNldHRpbmcgdGhlCi0JIFNFQ19FWENMVURFIGZsYWcuICBXZSBjYW4gYWxzbyBkaXNjYXJkIHRoaXMgc2VjdGlvbiBpZiB3ZQotCSBoYXBwZW4gdG8gYWxyZWFkeSBrbm93IHRoYXQgdGhpcyBpcyBhIG1pcHMxNiBmdW5jdGlvbjsgaXQgaXMKLQkgbm90IG5lY2Vzc2FyeSB0byBjaGVjayB0aGlzIGhlcmUsIGFzIGl0IGlzIGNoZWNrZWQgbGF0ZXIsIGJ1dAotCSBpdCBpcyBzbGlnaHRseSBmYXN0ZXIgdG8gY2hlY2sgbm93LiAgKi8KLSAgICAgIGlmICgqbG9jICE9IE5VTEwgfHwgaC0+cm9vdC5vdGhlciA9PSBTVE9fTUlQUzE2KQotCXsKLQkgIHNlYy0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgICpsb2MgPSBzZWM7Ci0gICAgICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+bWlwczE2X3N0dWJzX3NlZW4gPSB0cnVlOwotICAgIH0KLQotICBpZiAoZHlub2JqID09IE5VTEwpCi0gICAgewotICAgICAgc2dvdCA9IE5VTEw7Ci0gICAgICBnID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIGlmIChzZ290ID09IE5VTEwpCi0JZyA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCkgIT0gTlVMTCk7Ci0JICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpLT50ZGF0YTsKLQkgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0JfQotICAgIH0KLQotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IGV4dHN5bW9mZikKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl07Ci0KLQkgIC8qIFRoaXMgbWF5IGJlIGFuIGluZGlyZWN0IHN5bWJvbCBjcmVhdGVkIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uLiAgKi8KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0JCWggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgICAgfQotCX0KLQotICAgICAgLyogU29tZSByZWxvY3MgcmVxdWlyZSBhIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMIHx8IHNnb3QgPT0gTlVMTCkKLQl7Ci0JICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCSAgICB7Ci0JICAgIGNhc2UgUl9NSVBTX0dPVDE2OgotCSAgICBjYXNlIFJfTUlQU19DQUxMMTY6Ci0JICAgIGNhc2UgUl9NSVBTX0NBTExfSEkxNjoKLQkgICAgY2FzZSBSX01JUFNfQ0FMTF9MTzE2OgotCSAgICBjYXNlIFJfTUlQU19HT1RfSEkxNjoKLQkgICAgY2FzZSBSX01JUFNfR09UX0xPMTY6Ci0JICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCQllbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgbWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzZ290KSAhPSBOVUxMKTsKLQkgICAgICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpLT50ZGF0YTsKLQkgICAgICBCRkRfQVNTRVJUIChnICE9IE5VTEwpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9NSVBTXzMyOgotCSAgICBjYXNlIFJfTUlQU19SRUwzMjoKLQkgICAgICBpZiAoZHlub2JqID09IE5VTEwKLQkJICAmJiAoaW5mby0+c2hhcmVkIHx8IGggIT0gTlVMTCkKLQkJICAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl9NSVBTX0NBTEwxNjoKLQljYXNlIFJfTUlQU19DQUxMX0hJMTY6Ci0JY2FzZSBSX01JUFNfQ0FMTF9MTzE2OgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KLQotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6IENBTEwxNiByZWxvYyBhdCAweCVseCBub3QgYWdhaW5zdCBnbG9iYWwgc3ltYm9sIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl9vZmZzZXQpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCSAgICB7Ci0JICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogTm90ZSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGdsb2JhbCBnb3Qgc3ltYm9sIGluIC5keW5zeW0uICAqLwotCSAgaWYgKGctPmdsb2JhbF9nb3RzeW0gPT0gMAotCSAgICAgIHx8IGctPmdsb2JhbF9nb3RzeW0gPiAodW5zaWduZWQgbG9uZykgaC0+ZHluaW5keCkKLQkgICAgZy0+Z2xvYmFsX2dvdHN5bSA9IGgtPmR5bmluZHg7Ci0KLQkgIC8qIE1ha2UgdGhpcyBzeW1ib2wgdG8gaGF2ZSB0aGUgY29ycmVzcG9uZGluZyBnb3QgZW50cnkuICAqLwotCSAgaC0+Z290Lm9mZnNldCA9IDA7Ci0KLQkgIC8qIFdlIG5lZWQgYSBzdHViLCBub3QgYSBwbHQgZW50cnkgZm9yIHRoZSB1bmRlZmluZWQKLQkgICAgIGZ1bmN0aW9uLiAgQnV0IHdlIHJlY29yZCBpdCBhcyBpZiBpdCBuZWVkcyBwbHQuICBTZWUKLQkgICAgIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgaW4gZWxmbGluay5oLiAgKi8KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICBoLT50eXBlID0gU1RUX0ZVTkM7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX01JUFNfR09UMTY6Ci0JY2FzZSBSX01JUFNfR09UX0hJMTY6Ci0JY2FzZSBSX01JUFNfR09UX0xPMTY6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkJewotCQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgLyogTm90ZSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGdsb2JhbCBnb3Qgc3ltYm9sIGluCi0gICAgICAgICAgICAgICAgIC5keW5zeW0uICAqLwotCSAgICAgIGlmIChnLT5nbG9iYWxfZ290c3ltID09IDAKLQkJICB8fCBnLT5nbG9iYWxfZ290c3ltID4gKHVuc2lnbmVkIGxvbmcpIGgtPmR5bmluZHgpCi0JCWctPmdsb2JhbF9nb3RzeW0gPSBoLT5keW5pbmR4OwotCi0JICAgICAgLyogTWFrZSB0aGlzIHN5bWJvbCB0byBiZSB0aGUgZ2xvYmFsIGdvdCBzeW1ib2wuICAqLwotCSAgICAgIGgtPmdvdC5vZmZzZXQgPSAwOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX01JUFNfMzI6Ci0JY2FzZSBSX01JUFNfUkVMMzI6Ci0JICBpZiAoKGluZm8tPnNoYXJlZCB8fCBoICE9IE5VTEwpCi0JICAgICAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lID0gIi5yZWwuZHluIjsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywKLQkJCQkJCSAgICAgIChTRUNfQUxMT0MKLQkJCQkJCSAgICAgICB8IFNFQ19MT0FECi0JCQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgICAgICB8IFNFQ19SRUFET05MWSkpCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsb2MsCi0JCQkJCQkJICA0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICAvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlCi0JCSAgICAgcmVsb2MgdHlwZXMgaW50byB0aGUgb3V0cHV0IGZpbGUgYXMgUl9NSVBTX1JFTDMyCi0JCSAgICAgcmVsb2NzLiAgV2UgbWFrZSByb29tIGZvciB0aGlzIHJlbG9jIGluIHRoZQotCQkgICAgIC5yZWwuZHluIHJlbG9jIHNlY3Rpb24gKi8KLQkJICBpZiAoc3JlbG9jLT5fcmF3X3NpemUgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogQWRkIGEgbnVsbCBlbGVtZW50LiAqLwotCQkgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JCSAgICAgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQkJICAgIH0KLQkJICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpobWlwczsKLQotCQkgIC8qIFdlIG9ubHkgbmVlZCB0byBjb3B5IHRoaXMgcmVsb2MgaWYgdGhlIHN5bWJvbCBpcwotICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBpbiBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLQkJICBobWlwcyA9IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0JCSAgKytobWlwcy0+bWlwc18zMl9yZWxvY3M7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkpCi0JICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5jb21wYWN0X3JlbF9zaXplICs9Ci0JICAgICAgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9jcmluZm8pOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9NSVBTXzI2OgotCWNhc2UgUl9NSVBTX0dQUkVMMTY6Ci0JY2FzZSBSX01JUFNfTElURVJBTDoKLQljYXNlIFJfTUlQU19HUFJFTDMyOgotCSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpKQotCSAgICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+Y29tcGFjdF9yZWxfc2l6ZSArPQotCSAgICAgIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfY3JpbmZvKTsKLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0JICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSX01JUFNfR05VX1ZUSU5IRVJJVDoKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0JICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfTUlQU19HTlVfVlRFTlRSWToKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIHJlbG9jIGlzIG5vdCBhIDE2IGJpdCBjYWxsLCBhbmQgaXQgaGFzIGEgZ2xvYmFsCi0gICAgICAgICBzeW1ib2wsIHRoZW4gd2Ugd2lsbCBuZWVkIHRoZSBmbl9zdHViIGlmIHRoZXJlIGlzIG9uZS4KLSAgICAgICAgIFJlZmVyZW5jZXMgZnJvbSBhIHN0dWIgc2VjdGlvbiBkbyBub3QgY291bnQuICovCi0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSAhPSBSX01JUFMxNl8yNgotCSAgJiYgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksIEZOX1NUVUIsCi0JCSAgICAgIHNpemVvZiBGTl9TVFVCIC0gMSkgIT0gMAotCSAgJiYgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksIENBTExfU1RVQiwKLQkJICAgICAgc2l6ZW9mIENBTExfU1RVQiAtIDEpICE9IDAKLQkgICYmIHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCBDQUxMX0ZQX1NUVUIsCi0JCSAgICAgIHNpemVvZiBDQUxMX0ZQX1NUVUIgLSAxKSAhPSAwKQotCXsKLQkgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKm1oOwotCi0JICBtaCA9IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0JICBtaC0+bmVlZF9mbl9zdHViID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUgbWFya2VkIGFnYWluc3QgR0MgZm9yIGEgZ2l2ZW4KLSAgIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWlwc19lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgLyogPz8/IERvIG1pcHMxNiBzdHViIHNlY3Rpb25zIG5lZWQgdG8gYmUgaGFuZGxlZCBzcGVjaWFsPyAgKi8KLQotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl9NSVBTX0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSX01JUFNfR05VX1ZURU5UUlk6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0JICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotCXsKLQkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSNpZiAwCi0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3RfcmVmY291bnRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9NSVBTX0dPVDE2OgotICAgICAgY2FzZSBSX01JUFNfQ0FMTDE2OgotICAgICAgY2FzZSBSX01JUFNfQ0FMTF9ISTE2OgotICAgICAgY2FzZSBSX01JUFNfQ0FMTF9MTzE2OgotICAgICAgY2FzZSBSX01JUFNfR09UX0hJMTY6Ci0gICAgICBjYXNlIFJfTUlQU19HT1RfTE8xNjoKLQkvKiA/Pz8gSXQgd291bGQgc2VlbSB0aGF0IHRoZSBleGlzdGluZyBNSVBTIGNvZGUgZG9lcyBubyBzb3J0Ci0JICAgb2YgcmVmZXJlbmNlIGNvdW50aW5nIG9yIHdoYXRub3Qgb24gaXRzIEdPVCBhbmQgUExUIGVudHJpZXMsCi0JICAgc28gaXQgaXMgbm90IHBvc3NpYmxlIHRvIGdhcmJhZ2UgY29sbGVjdCB0aGVtIGF0IHRoaXMgdGltZS4gICovCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpobWlwczsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgKi8KLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwKLQkgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkKLQkJICB8fCBoLT53ZWFrZGVmICE9IE5VTEwKLQkJICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQgaW4gYSBkeW5hbWljIG9iamVjdCwgd2UgbmVlZCB0byBjb3B5Ci0gICAgIGFueSBSX01JUFNfMzIgb3IgUl9NSVBTX1JFTDMyIHJlbG9jcyBhZ2FpbnN0IGl0IGludG8gdGhlIG91dHB1dAotICAgICBmaWxlLiAgKi8KLSAgaG1pcHMgPSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGhtaXBzLT5taXBzXzMyX3JlbG9jcyAhPSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0gICAgewotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmR5biIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXsKLQkgIC8qIE1ha2Ugcm9vbSBmb3IgYSBudWxsIGVsZW1lbnQuICovCi0JICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCSAgKytzLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gaG1pcHMtPm1pcHNfMzJfcmVsb2NzICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotICAgIH0KLQotICAvKiBGb3IgYSBmdW5jdGlvbiwgY3JlYXRlIGEgc3R1YiwgaWYgbmVlZGVkLiAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIHRoZW4gc2V0Ci0JIHRoZSBzeW1ib2wgdG8gdGhlIHN0dWIgbG9jYXRpb24uICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UKLQkgZnVuY3Rpb24gcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwKLQkgZXhlY3V0YWJsZSBhbmQgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogV2UgbmVlZCAuc3R1YiBzZWN0aW9uLiAgKi8KLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnN0dWIiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0JICAvKiBYWFggV3JpdGUgdGhpcyBzdHViIGFkZHJlc3Mgc29tZXdoZXJlLiAgKi8KLQkgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0KLQkgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBzdHViIGNvZGUuICAqLwotCSAgcy0+X3Jhd19zaXplICs9IE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFOwotCi0JICAvKiBUaGUgbGFzdCBoYWxmIHdvcmQgb2YgdGhlIHN0dWIgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgaW5kZXgKLQkgICAgIG9mIHRoaXMgc3ltYm9sIGluIC5keW5zeW0gc2VjdGlvbi4gICovCi0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiByZWFkLAotICAgYW5kIHRoZSBpbnB1dCBzZWN0aW9ucyBoYXZlIGJlZW4gYXNzaWduZWQgdG8gb3V0cHV0IHNlY3Rpb25zLiAgV2UKLSAgIGNoZWNrIGZvciBhbnkgbWlwczE2IHN0dWIgc2VjdGlvbnMgdGhhdCB3ZSBjYW4gZGlzY2FyZC4gICovCi0KLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2NoZWNrX21pcHMxNl9zdHVicwotICBQQVJBTVMgKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpyaTsKLQotICAvKiBUaGUgLnJlZ2luZm8gc2VjdGlvbiBoYXMgYSBmaXhlZCBzaXplLiAgKi8KLSAgcmkgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWdpbmZvIik7Ci0gIGlmIChyaSAhPSBOVUxMKQotICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRwdXRfYmZkLCByaSwgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSk7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgISBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+bWlwczE2X3N0dWJzX3NlZW4pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbWlwc19lbGZfbGlua19oYXNoX3RyYXZlcnNlIChtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICAgICBtaXBzX2VsZl9jaGVja19taXBzMTZfc3R1YnMsCi0JCQkgICAgICAgKFBUUikgTlVMTCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENoZWNrIHRoZSBtaXBzMTYgc3R1YnMgZm9yIGEgcGFydGljdWxhciBzeW1ib2wsIGFuZCBzZWUgaWYgd2UgY2FuCi0gICBkaXNjYXJkIHRoZW0uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9jaGVja19taXBzMTZfc3R1YnMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBpZiAoaC0+Zm5fc3R1YiAhPSBOVUxMCi0gICAgICAmJiAhIGgtPm5lZWRfZm5fc3R1YikKLSAgICB7Ci0gICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSBmbl9zdHViOyB0aGUgb25seSByZWZlcmVuY2VzIHRvIHRoaXMgc3ltYm9sCi0gICAgICAgICBhcmUgMTYgYml0IGNhbGxzLiAgQ2xvYmJlciB0aGUgc2l6ZSB0byAwIHRvIHByZXZlbnQgaXQgZnJvbQotICAgICAgICAgYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotICAgICAgaC0+Zm5fc3R1Yi0+X3Jhd19zaXplID0gMDsKLSAgICAgIGgtPmZuX3N0dWItPl9jb29rZWRfc2l6ZSA9IDA7Ci0gICAgICBoLT5mbl9zdHViLT5mbGFncyAmPSB+IFNFQ19SRUxPQzsKLSAgICAgIGgtPmZuX3N0dWItPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIGgtPmZuX3N0dWItPmZsYWdzIHw9IFNFQ19FWENMVURFOwotICAgIH0KLQotICBpZiAoaC0+Y2FsbF9zdHViICE9IE5VTEwKLSAgICAgICYmIGgtPnJvb3Qub3RoZXIgPT0gU1RPX01JUFMxNikKLSAgICB7Ci0gICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSBjYWxsX3N0dWI7IHRoaXMgaXMgYSAxNiBiaXQgZnVuY3Rpb24sIHNvCi0gICAgICAgICBjYWxscyBmcm9tIG90aGVyIDE2IGJpdCBmdW5jdGlvbnMgYXJlIE9LLiAgQ2xvYmJlciB0aGUgc2l6ZQotICAgICAgICAgdG8gMCB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotICAgICAgaC0+Y2FsbF9zdHViLT5fcmF3X3NpemUgPSAwOwotICAgICAgaC0+Y2FsbF9zdHViLT5fY29va2VkX3NpemUgPSAwOwotICAgICAgaC0+Y2FsbF9zdHViLT5mbGFncyAmPSB+IFNFQ19SRUxPQzsKLSAgICAgIGgtPmNhbGxfc3R1Yi0+cmVsb2NfY291bnQgPSAwOwotICAgICAgaC0+Y2FsbF9zdHViLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLSAgICB9Ci0KLSAgaWYgKGgtPmNhbGxfZnBfc3R1YiAhPSBOVUxMCi0gICAgICAmJiBoLT5yb290Lm90aGVyID09IFNUT19NSVBTMTYpCi0gICAgewotICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgY2FsbF9zdHViOyB0aGlzIGlzIGEgMTYgYml0IGZ1bmN0aW9uLCBzbwotICAgICAgICAgY2FsbHMgZnJvbSBvdGhlciAxNiBiaXQgZnVuY3Rpb25zIGFyZSBPSy4gIENsb2JiZXIgdGhlIHNpemUKLSAgICAgICAgIHRvIDAgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgKi8KLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+X3Jhd19zaXplID0gMDsKLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+X2Nvb2tlZF9zaXplID0gMDsKLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+ZmxhZ3MgJj0gfiBTRUNfUkVMT0M7Ci0gICAgICBoLT5jYWxsX2ZwX3N0dWItPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHJlbHRleHQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCX0KLSAgICB9Ci0KLSAgLyogUmVjb21wdXRlIHRoZSBzaXplIG9mIC5nb3QgZm9yIGxvY2FsIGVudGlyZXMgKHJlc2VydmVkIGFuZAotICAgICBoaXBhZ2VzKSBpZiBuZWVkZWQuICBUbyBlc3RpbWF0ZSBpdCwgZ2V0IHRoZSB1cHBlciBib3VuZCBvZiB0b3RhbAotICAgICBzaXplIG9mIGxvYWRhYmxlIHNlY3Rpb25zLiAgKi8KLSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0KLSAgaWYgKHNnb3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGxvYWRhYmxlX3NpemUgPSAwOwotICAgICAgYmZkX3NpemVfdHlwZSBsb2NhbF9nb3RubzsKLSAgICAgIHN0cnVjdCBfYmZkICpzdWI7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpICE9IE5VTEwpOwotICAgICAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZ290KS0+dGRhdGE7Ci0gICAgICBCRkRfQVNTRVJUIChnICE9IE5VTEwpOwotCi0gICAgICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1Yjsgc3ViID0gc3ViLT5saW5rX25leHQpCi0JZm9yIChzID0gc3ViLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQkgIHsKLQkgICAgaWYgKChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQkgICAgICBjb250aW51ZTsKLQkgICAgbG9hZGFibGVfc2l6ZSArPSAocy0+X3Jhd19zaXplICsgMHhmKSAmIH4weGY7Ci0JICB9Ci0KLSAgICAgIGxvYWRhYmxlX3NpemUgKz0gTUlQU19GVU5DVElPTl9TVFVCX1NJWkU7Ci0KLSAgICAgIC8qIEFzc3VtZSB0aGVyZSBhcmUgdHdvIGxvYWRhYmxlIHNlZ21lbnRzIGNvbnNpc3Rpbmcgb2YKLQkgY29udGlndW91cyBzZWN0aW9ucy4gIElzIDUgZW5vdWdoPyAqLwotICAgICAgbG9jYWxfZ290bm8gPSAobG9hZGFibGVfc2l6ZSA+PiAxNikgKyA1ICsgTUlQU19SRVNFUlZFRF9HT1ROTzsKLSAgICAgIGctPmxvY2FsX2dvdG5vID0gbG9jYWxfZ290bm87Ci0gICAgICBzZ290LT5fcmF3X3NpemUgKz0gbG9jYWxfZ290bm8gKiA0OwotICAgIH0KLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHJlbHRleHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKLQkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7Ci0KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogV2Ugb25seSBzdHJpcCB0aGUgc2VjdGlvbiBpZiB0aGUgb3V0cHV0IHNlY3Rpb24gbmFtZQotICAgICAgICAgICAgICAgICBoYXMgdGhlIHNhbWUgbmFtZS4gIE90aGVyd2lzZSwgdGhlcmUgbWlnaHQgYmUgc2V2ZXJhbAotICAgICAgICAgICAgICAgICBpbnB1dCBzZWN0aW9ucyBmb3IgdGhpcyBvdXRwdXQgc2VjdGlvbi4gIEZJWE1FOiBUaGlzCi0gICAgICAgICAgICAgICAgIGNvZGUgaXMgcHJvYmFibHkgbm90IG5lZWRlZCB0aGVzZSBkYXlzIGFueWhvdywgc2luY2UKLSAgICAgICAgICAgICAgICAgdGhlIGxpbmtlciBub3cgZG9lcyBub3QgY3JlYXRlIGVtcHR5IG91dHB1dCBzZWN0aW9ucy4gICovCi0JICAgICAgaWYgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKLQkJICAmJiBzdHJjbXAgKG5hbWUsCi0JCQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIsCi0JCQkJCQkgICBzLT5vdXRwdXRfc2VjdGlvbikpID09IDApCi0JCXN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OwotCi0JICAgICAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotICAgICAgICAgICAgICAgICBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMIGVudHJ5LgotICAgICAgICAgICAgICAgICBJZiB0aGUgcmVsb2NhdGlvbiBzZWN0aW9uIGlzIC5yZWwuZHluLCB3ZSBhbHdheXMKLSAgICAgICAgICAgICAgICAgYXNzZXJ0IGEgRFRfVEVYVFJFTCBlbnRyeSByYXRoZXIgdGhhbiB0ZXN0aW5nIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAgdGhlcmUgZXhpc3RzIGEgcmVsb2NhdGlvbiB0byBhIHJlYWQgb25seSBzZWN0aW9uIG9yCi0gICAgICAgICAgICAgICAgIG5vdC4gICovCi0JICAgICAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkgICAgICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgICAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA0KTsKLQkgICAgICBpZiAoKHRhcmdldCAhPSBOVUxMCi0JCSAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkgIHx8IHN0cmNtcCAob3V0bmFtZSwgIi5yZWwuZHluIikgPT0gMCkKLQkJcmVsdGV4dCA9IHRydWU7Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWwuZHluIikgIT0gMCkKLQkJcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5nb3QiLCA0KSA9PSAwKQotCXsKLQkgIGludCBpOwotCi0JICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzKSAhPSBOVUxMKTsKLQkgIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRkYXRhOwotCSAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKLQotCSAgLyogRml4IHRoZSBzaXplIG9mIC5nb3Qgc2VjdGlvbiBmb3IgdGhlIGNvcnJlc3BvbmRlbmNlIG9mCi0JICAgICBnbG9iYWwgc3ltYm9scyBhbmQgZ290IGVudHJpZXMuIFRoaXMgYWRkcyBzb21lIHVzZWxlc3MKLQkgICAgIGdvdCBlbnRyaWVzLiBJcyB0aGlzIHJlcXVpcmVkIGJ5IEFCSSByZWFsbHk/ICAqLwotCSAgaSA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgLSBnLT5nbG9iYWxfZ290c3ltOwotCSAgcy0+X3Jhd19zaXplICs9IGkgKiA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuc3R1YiIsIDUpID09IDApCi0JewotCSAgLyogSXJpeCBybGQgYXNzdW1lcyB0aGF0IHRoZSBmdW5jdGlvbiBzdHViIGlzbid0IGF0IHRoZSBlbmQKLQkgICAgIG9mIC50ZXh0IHNlY3Rpb24uIFNvIHB1dCBhIGR1bW15LiBYWFggICovCi0JICBzLT5fcmF3X3NpemUgKz0gTUlQU19GVU5DVElPTl9TVFVCX1NJWkU7Ci0JfQotICAgICAgZWxzZSBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICAgICAgJiYgISBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+dXNlX3JsZF9vYmpfaGVhZAotCSAgICAgICAmJiBzdHJuY21wIChuYW1lLCAiLnJsZF9tYXAiLCA4KSA9PSAwKQotCXsKLQkgIC8qIFdlIGFkZCBhIHJvb20gZm9yIF9fcmxkX21hcC4gSXQgd2lsbCBiZSBmaWxsZWQgaW4gYnkgdGhlCi0JICAgICBydGxkIHRvIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBfcl9kZWJ1ZyBzdHJ1Y3R1cmUuICAqLwotCSAgcy0+X3Jhd19zaXplICs9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkKLQkgICAgICAgJiYgc3RybmNtcCAobmFtZSwgIi5jb21wYWN0X3JlbCIsIDEyKSA9PSAwKQotCXMtPl9yYXdfc2l6ZSArPSBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+Y29tcGFjdF9yZWxfc2l6ZTsKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuaW5pdCIsIDUpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIG1lbXNldCAocy0+Y29udGVudHMsIDAsIHMtPl9yYXdfc2l6ZSk7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBlbGZfbWlwc19maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKFNHSV9DT01QQVQgKG91dHB1dF9iZmQpKQotCSAgICB7Ci0JICAgICAgLyogU0dJIG9iamVjdCBoYXMgdGhlIGVxdWl2YWxlbmNlIG9mIERUX0RFQlVHIGluIHRoZQotCQkgRFRfTUlQU19STERfTUFQIGVudHJ5LiAgKi8KLQkgICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfUkxEX01BUCwgMCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZHluIikpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMU1osIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMRU5ULCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX0NPTkZMSUNUTk8sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX0xJQkxJU1ROTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5jb25mbGljdCIpICE9IE5VTEwpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX0NPTkZMSUNULCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5saWJsaXN0Iik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfTElCTElTVCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19STERfVkVSU0lPTiwgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfRkxBR1MsIDApKQotCXJldHVybiBmYWxzZTsKLQotI2lmIDAKLSAgICAgIC8qIFRpbWUgc3RhbXBzIGluIGV4ZWN1dGFibGUgZmlsZXMgYXJlIGEgYmFkIGlkZWEuICAqLwotICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX1RJTUVfU1RBTVAsIDApKQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0jaWYgMCAvKiBGSVhNRSAgKi8KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19JQ0hFQ0tTVU0sIDApKQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0jaWYgMCAvKiBGSVhNRSAgKi8KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19JVkVSU0lPTiwgMCkpCi0JcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19CQVNFX0FERFJFU1MsIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX0xPQ0FMX0dPVE5PLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19TWU1UQUJOTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfVU5SRUZFWFROTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfR09UU1lNLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19ISVBBR0VOTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0jaWYgMCAvKiAoU0dJX0NPTVBBVCkgKi8KLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW5pdCIpKQotCWlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSU5JVCwgMCkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZmluaSIpKQotCWlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfRklOSSwgMCkpCi0JICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgLyogSWYgd2UgdXNlIGR5bmFtaWMgbGlua2luZywgd2UgZ2VuZXJhdGUgYSBzZWN0aW9uIHN5bWJvbCBmb3IgZWFjaAotICAgICBvdXRwdXQgc2VjdGlvbi4gIFRoZXNlIGFyZSBsb2NhbCBzeW1ib2xzLCB3aGljaCBtZWFucyB0aGF0IHRoZXkKLSAgICAgbXVzdCBjb21lIGZpcnN0IGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLSAgICAgVGhhdCBtZWFucyB3ZSBtdXN0IGluY3JlbWVudCB0aGUgZHluYW1pYyBzeW1ib2wgaW5kZXggb2YgZXZlcnkKLSAgICAgb3RoZXIgZHluYW1pYyBzeW1ib2wuICAqLwotICB7Ci0gICAgdW5zaWduZWQgaW50IGMsIGk7Ci0gICAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0KLSAgICBjID0gMDsKLSAgICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgICB7Ci0jaWYgMAotCS8qIFdlIG5vIGxvbmdlciB0cnkgdG8gcmVzdHJpY3QgdGhlIHNldCBvZiBzZWN0aW9ucyB3aGljaCBnZXQKLSAgICAgICAgICAgZHluYW1pYyBzeW1ib2wgdGFibGUgZW50cmllcywgc2luY2UgaXQgZmFpbHMgaWYgd2UgaGF2ZQotICAgICAgICAgICBvdGhlciByYW5kb20gc2VjdGlvbnMgd2hpY2ggbmVlZCBkeW5hbWljIHJlbG9jYXRpb25zLiAgKi8KLQljb25zdCBjaGFyICogY29uc3QgKm5hbWVwOwotCWJmZF9zaXplX3R5cGUgc3RyaW5kZXg7Ci0Jc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZHluc3RyOwotCi0JaWYgKFNHSV9DT01QQVQgKG91dHB1dF9iZmQpKQotCSAgewotCSAgICBjID0gU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTIC0gMTsKLQkgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgICBtaXBzX2VsZl9hZGp1c3RfZHluaW5keCwKLQkJCQkgICAgKFBUUikgJmMpOwotCSAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ICs9IGM7Ci0KLQkgICAgZHluc3RyID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHI7Ci0JICAgIEJGRF9BU1NFUlQgKGR5bnN0ciAhPSBOVUxMKTsKLQotCSAgICBmb3IgKGkgPSAxLCBuYW1lcCA9IG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXM7Ci0JCSAqbmFtZXAgIT0gTlVMTDsKLQkJIGkrKywgbmFtZXArKykKLQkgICAgICB7Ci0JCXMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgKm5hbWVwKTsKLQkJaWYgKHMgIT0gTlVMTCkKLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCA9IGk7Ci0KLQkJc3RyaW5kZXggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGR5bnN0ciwgKm5hbWVwLCB0cnVlLCBmYWxzZSk7Ci0JCWlmIChzdHJpbmRleCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCSAgcmV0dXJuIGZhbHNlOwotCi0JCW1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1fc2VjX3N0cmluZGV4W2ldID0gc3RyaW5kZXg7Ci0JICAgICAgfQotCSAgfQotCWVsc2UKLSNlbmRpZiAvKiAwICovCi0JICB7Ci0JICAgIGMgPSBiZmRfY291bnRfc2VjdGlvbnMgKG91dHB1dF9iZmQpOwotCSAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAgIG1pcHNfZWxmX2FkanVzdF9keW5pbmR4LAotCQkJCSAgICAoUFRSKSAmYyk7Ci0JICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgKz0gYzsKLQotCSAgICBmb3IgKGkgPSAxLCBzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQsIGkrKykKLQkgICAgICB7Ci0JCWVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID0gaTsKLQkJLyogVGhlc2Ugc3ltYm9scyB3aWxsIGhhdmUgbm8gbmFtZXMsIHNvIHdlIGRvbid0IG5lZWQgdG8KLQkJICAgZmlkZGxlIHdpdGggZHluc3RyX2luZGV4LiAgKi8KLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0KLSAgICBpZiAoc2dvdCAhPSBOVUxMKQotICAgICAgewotCUJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpICE9IE5VTEwpOwotCWcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCktPnRkYXRhOwotCUJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0KLQkvKiBJZiB0aGVyZSBhcmUgbm8gZ2xvYmFsIGdvdCBzeW1ib2xzLCBmYWtlIHRoZSBsYXN0IHN5bWJvbCBzbwotCSAgIGZvciBzYWZldHkuICAqLwotCWlmIChnLT5nbG9iYWxfZ290c3ltKQotCSAgZy0+Z2xvYmFsX2dvdHN5bSArPSBjOwotCWVsc2UKLQkgIGctPmdsb2JhbF9nb3RzeW0gPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50IC0gMTsKLSAgICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJbmNyZW1lbnQgdGhlIGluZGV4IG9mIGEgZHluYW1pYyBzeW1ib2wgYnkgYSBnaXZlbiBhbW91bnQuICBDYWxsZWQKLSAgIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2FkanVzdF9keW5pbmR4IChoLCBjcGFyZykKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBjcGFyZzsKLXsKLSAgdW5zaWduZWQgaW50ICpjcCA9ICh1bnNpZ25lZCBpbnQgKikgY3Bhcmc7Ci0KLSAgaWYgKGgtPmR5bmluZHggIT0gLTEpCi0gICAgaC0+ZHluaW5keCArPSAqY3A7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGJmZF92bWEgZ3ZhbDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBndmFsID0gc3ltLT5zdF92YWx1ZTsKLQotICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBiZmRfYnl0ZSAqcDsKLSAgICAgIGJmZF9ieXRlIHN0dWJbTUlQU19GVU5DVElPTl9TVFVCX1NJWkVdOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYSBzdHViLiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnN0dWIiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIEZpbGwgdGhlIHN0dWIuICAqLwotICAgICAgcCA9IHN0dWI7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTVFVCX0xXKG91dHB1dF9iZmQpLCBwKTsKLSAgICAgIHAgKz0gNDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNUVUJfTU9WRSwgcCk7Ci0gICAgICBwICs9IDQ7Ci0KLSAgICAgIC8qIEZJWE1FOiBDYW4gaC0+ZHluaW5kZXggYmUgbW9yZSB0aGFuIDY0Sz8gICovCi0gICAgICBpZiAoaC0+ZHluaW5keCAmIDB4ZmZmZjAwMDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTVFVCX0pBTFIsIHApOwotICAgICAgcCArPSA0OwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgU1RVQl9MSTE2ICsgaC0+ZHluaW5keCwgcCk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPnBsdC5vZmZzZXQgPD0gcy0+X3Jhd19zaXplKTsKLSAgICAgIG1lbWNweSAocy0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LCBzdHViLCBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRSk7Ci0KLSAgICAgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQuICBwbHQub2Zmc2V0ICE9IC0xIG9jY3VycwotCSBvbmx5IGZvciB0aGUgcmVmZXJlbmNlZCBzeW1ib2wuICAqLwotICAgICAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQotICAgICAgLyogVGhlIHJ1bi10aW1lIGxpbmtlciB1c2VzIHRoZSBzdF92YWx1ZSBmaWVsZCBvZiB0aGUgc3ltYm9sCi0JIHRvIHJlc2V0IHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciB0aGlzIGV4dGVybmFsCi0JIHRvIGl0cyBzdHViIGFkZHJlc3Mgd2hlbiB1bmxpbmtpbmcgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgICAgIGd2YWwgPSBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgcy0+b3V0cHV0X29mZnNldCArIGgtPnBsdC5vZmZzZXQ7Ci0gICAgICBzeW0tPnN0X3ZhbHVlID0gZ3ZhbDsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpICE9IE5VTEwpOwotICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpLT50ZGF0YTsKLSAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKLQotICBpZiAoKHVuc2lnbmVkIGxvbmcpIGgtPmR5bmluZHggPj0gZy0+Z2xvYmFsX2dvdHN5bSkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIG9mZnNldDsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0cwotCSB2YWx1ZSB0byB0aGUgY29ycmVzcG9uZGluZyBnb3QgZW50cnksIGlmIG5lZWRlZC4gICovCi0gICAgICBpZiAoaC0+Z290Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0JewotCSAgb2Zmc2V0ID0gKGgtPmR5bmluZHggLSBnLT5nbG9iYWxfZ290c3ltICsgZy0+bG9jYWxfZ290bm8pICogNDsKLQkgIEJGRF9BU1NFUlQgKGctPmxvY2FsX2dvdG5vICogNCA8PSBvZmZzZXQKLQkJICAgICAgJiYgb2Zmc2V0IDwgc2dvdC0+X3Jhd19zaXplKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGd2YWwsIHNnb3QtPmNvbnRlbnRzICsgb2Zmc2V0KTsKLQl9Ci0gICAgfQotCi0gIC8qIE1hcmsgX0RZTkFNSUMgYW5kIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhcyBhYnNvbHV0ZS4gICovCi0gIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICBpZiAoc3RyY21wIChuYW1lLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKG5hbWUsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfRFlOQU1JQ19MSU5LIikgPT0gMCkKLSAgICB7Ci0gICAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLSAgICAgIHN5bS0+c3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBTVFRfU0VDVElPTik7Ci0gICAgICBzeW0tPnN0X3ZhbHVlID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKFNHSV9DT01QQVQgKG91dHB1dF9iZmQpKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICJfZ3BfZGlzcCIpID09IDApCi0JewotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0JICBzeW0tPnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1NFQ1RJT04pOwotCSAgc3ltLT5zdF92YWx1ZSA9IGVsZl9ncCAob3V0cHV0X2JmZCk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzBdKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAobmFtZSwgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1sxXSkgPT0gMCkKLQl7Ci0JICBzeW0tPnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1NFQ1RJT04pOwotCSAgc3ltLT5zdF9vdGhlciA9IFNUT19QUk9URUNURUQ7Ci0JICBzeW0tPnN0X3ZhbHVlID0gMDsKLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fTUlQU19EQVRBOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1syXSkgPT0gMCkKLQl7Ci0JICBzeW0tPnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1NFQ1RJT04pOwotCSAgc3ltLT5zdF9vdGhlciA9IFNUT19QUk9URUNURUQ7Ci0JICBzeW0tPnN0X3ZhbHVlID0gbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnByb2NlZHVyZV9jb3VudDsKLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCX0KLSAgICAgIGVsc2UgaWYgKHN5bS0+c3Rfc2huZHggIT0gU0hOX1VOREVGICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0FCUykKLQl7Ci0JICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQykKLQkgICAgc3ltLT5zdF9zaG5keCA9IFNITl9NSVBTX1RFWFQ7Ci0JICBlbHNlIGlmIChoLT50eXBlID09IFNUVF9PQkpFQ1QpCi0JICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fTUlQU19EQVRBOwotCX0KLSAgICB9Ci0KLSAgaWYgKFNHSV9DT01QQVQgKG91dHB1dF9iZmQpCi0gICAgICAmJiAhIGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBpZiAoISBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+dXNlX3JsZF9vYmpfaGVhZAotCSAgJiYgc3RyY21wIChuYW1lLCAiX19ybGRfbWFwIikgPT0gMCkKLQl7Ci0JICBhc2VjdGlvbiAqcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmxkX21hcCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHN5bS0+c3RfdmFsdWUgPSBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgcy0+b3V0cHV0X29mZnNldDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzLT5jb250ZW50cyk7Ci0JICBpZiAobWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnJsZF92YWx1ZSA9PSAwKQotCSAgICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+cmxkX3ZhbHVlID0gc3ltLT5zdF92YWx1ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+dXNlX3JsZF9vYmpfaGVhZAotCSAgICAgICAmJiBzdHJjbXAgKG5hbWUsICJfX3JsZF9vYmpfaGVhZCIpID09IDApCi0JewotCSAgYXNlY3Rpb24gKnMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJsZF9tYXAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+cmxkX3ZhbHVlID0gc3ltLT5zdF92YWx1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBtaXBzMTYgc3ltYm9sLCBmb3JjZSB0aGUgdmFsdWUgdG8gYmUgZXZlbi4gICovCi0gIGlmIChzeW0tPnN0X290aGVyID09IFNUT19NSVBTMTYKLSAgICAgICYmIChzeW0tPnN0X3ZhbHVlICYgMSkgIT0gMCkKLSAgICAtLXN5bS0+c3RfdmFsdWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzZHluOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICBpZiAoc2dvdCA9PSBOVUxMKQotICAgIGcgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCkgIT0gTlVMTCk7Ci0gICAgICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpLT50ZGF0YTsKLSAgICAgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgQkZEX0FTU0VSVCAoc2R5biAhPSBOVUxMKTsKLSAgICAgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBzaXplX3QgZWxlbXNpemU7Ci0JICBhc2VjdGlvbiAqczsKLQotCSAgYmZkX2VsZjMyX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9SRUxFTlQ6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmR5biIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1NUUlNaOgotCSAgICAgIC8qIFJld3JpdGUgRFRfU1RSU1ouICAqLwotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0KLQkJX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIpOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRHT1Q6Ci0JICAgICAgbmFtZSA9ICIuZ290IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfTUlQU19DT05GTElDVDoKLQkgICAgICBuYW1lID0gIi5jb25mbGljdCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX01JUFNfTElCTElTVDoKLQkgICAgICBuYW1lID0gIi5saWJsaXN0IjsKLQkgICAgZ2V0X3ZtYToKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfUkxEX1ZFUlNJT046Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPSAxOyAvKiBYWFggKi8KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19GTEFHUzoKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IFJIRl9OT1RQT1Q7IC8qIFhYWCAqLwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUTk86Ci0JICAgICAgbmFtZSA9ICIuY29uZmxpY3QiOwotCSAgICAgIGVsZW1zaXplID0gc2l6ZW9mIChFbGYzMl9Db25mbGljdCk7Ci0JICAgICAgZ290byBzZXRfZWxlbW5vOwotCi0JICAgIGNhc2UgRFRfTUlQU19MSUJMSVNUTk86Ci0JICAgICAgbmFtZSA9ICIubGlibGlzdCI7Ci0JICAgICAgZWxlbXNpemUgPSBzaXplb2YgKEVsZjMyX0xpYik7Ci0JICAgIHNldF9lbGVtbm86Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBpZiAocyAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQkgICAgZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemUgLyBlbGVtc2l6ZTsKLQkJICBlbHNlCi0JCSAgICBkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZSAvIGVsZW1zaXplOwotCQl9Ci0JICAgICAgZWxzZQotCQkgICAgZHluLmRfdW4uZF92YWwgPSAwOwotCi0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfVElNRV9TVEFNUDoKLQkgICAgICB0aW1lICgodGltZV90ICopICZkeW4uZF91bi5kX3ZhbCk7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfSUNIRUNLU1VNOgotCSAgICAgIC8qIFhYWCBGSVhNRTogKi8KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfSVZFUlNJT046Ci0JICAgICAgLyogWFhYIEZJWE1FOiAqLwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19CQVNFX0FERFJFU1M6Ci0JICAgICAgcyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWEgJiB+KDB4ZmZmZik7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfTE9DQUxfR09UTk86Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPSBnLT5sb2NhbF9nb3RubzsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19TWU1UQUJOTzoKLQkgICAgICBuYW1lID0gIi5keW5zeW0iOwotCSAgICAgIGVsZW1zaXplID0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pOwotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemUgLyBlbGVtc2l6ZTsKLQkgICAgICBlbHNlCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplIC8gZWxlbXNpemU7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfVU5SRUZFWFROTzoKLSNpZiAwCi0JICAgICAgZHluLmRfdW4uZF92YWwgPSBTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVM7Ci0jZWxzZQotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gYmZkX2NvdW50X3NlY3Rpb25zIChvdXRwdXRfYmZkKTsKLSNlbmRpZgotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0dPVFNZTToKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IGctPmdsb2JhbF9nb3RzeW07Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfSElQQUdFTk86Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPSBnLT5sb2NhbF9nb3RubyAtIE1JUFNfUkVTRVJWRURfR09UTk87Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfUkxEX01BUDoKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5ybGRfdmFsdWU7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBUaGUgZmlyc3QgZW50cnkgb2YgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBiZSBmaWxsZWQgYXQKLSAgICAgcnVudGltZS4gVGhlIHNlY29uZCBlbnRyeSB3aWxsIGJlIHVzZWQgYnkgc29tZSBydW50aW1lIGxvYWRlcnMuCi0gICAgIFRoaXMgaXNuJ3QgdGhlIGNhc2Ugb2YgSXJpeCBybGQuICovCi0gIGlmIChzZ290ICE9IE5VTEwgJiYgc2dvdC0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDB4ODAwMDAwMDAsIHNnb3QtPmNvbnRlbnRzICsgNCk7Ci0gICAgfQotCi0gIGlmIChzZ290ICE9IE5VTEwpCi0gICAgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLQotICB7Ci0gICAgYXNlY3Rpb24gKnNkeW5zeW07Ci0gICAgYXNlY3Rpb24gKnM7Ci0gICAgRWxmX0ludGVybmFsX1N5bSBzeW07Ci0gICAgRWxmMzJfY29tcGFjdF9yZWwgY3B0OwotCi0gICAgLyogU2V0IHVwIHRoZSBzZWN0aW9uIHN5bWJvbHMgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMuIFNHSSBzZXRzCi0gICAgICAgdGhlIFNUVF9OT1RZUEUgYXR0cmlidXRlIGZvciB0aGVzZSBzeW1ib2xzLiAgU2hvdWxkIHdlIGRvIHNvPyAgKi8KLQotICAgIHNkeW5zeW0gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgIGlmIChzZHluc3ltICE9IE5VTEwpCi0gICAgICB7Ci0jaWYgMAotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JY29uc3QgY2hhciAqIGNvbnN0ICogbmFtZXAgPSBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzOwotCXVuc2lnbmVkIGludCBpOwotCWJmZF92bWEgbGFzdDsKLQlsb25nIGRpbmR4OwotCi0JLyogV2Ugbm8gbG9uZ2VyIHRyeSB0byByZXN0cmljdCB0aGUgc2V0IG9mIHNlY3Rpb25zIHdoaWNoIGdldAotICAgICAgICAgICBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyaWVzLCBzaW5jZSBpdCBmYWlscyBpZiB3ZSBoYXZlCi0gICAgICAgICAgIG90aGVyIHJhbmRvbSBzZWN0aW9ucyB3aGljaCBuZWVkIGR5bmFtaWMgcmVsb2NhdGlvbnMuICAqLwotCWlmIChTR0lfQ09NUEFUIChvdXRwdXRfYmZkKSkKLQkgIHsKLQkgICAgc3ltLnN0X3NpemUgPSAwOwotCSAgICBzeW0uc3RfbmFtZSA9IDA7Ci0JICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX05PVFlQRSk7Ci0JICAgIHN5bS5zdF9vdGhlciA9IDA7Ci0KLQkgICAgaSA9IDA7Ci0JICAgIGxhc3QgPSAwOwotCSAgICBkaW5keCA9IDA7Ci0JICAgIHdoaWxlICgobmFtZSA9ICpuYW1lcCsrKSAhPSBOVUxMKQotCSAgICAgIHsKLQkJcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkJaWYgKHMgIT0gTlVMTCkKLQkJICB7Ci0JCSAgICBzeW0uc3RfdmFsdWUgPSBzLT52bWE7Ci0JCSAgICBkaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4OwotCQkgICAgbGFzdCA9IHMtPnZtYSArIHMtPl9yYXdfc2l6ZTsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBzeW0uc3RfdmFsdWUgPSBsYXN0OwotCQkgICAgZGluZHgrKzsKLQkJICB9Ci0KLQkJc3ltLnN0X3NobmR4ID0gKGkgPCBNSVBTX1RFWFRfRFlOU1lNX1NFQ05PCi0JCQkJPyBTSE5fTUlQU19URVhUCi0JCQkJOiBTSE5fTUlQU19EQVRBKTsKLQkJKytpOwotCQlzeW0uc3RfbmFtZSA9Ci0JCSAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bV9zZWNfc3RyaW5kZXhbZGluZHhdOwotCi0JCWJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKG91dHB1dF9iZmQsICZzeW0sCi0JCQkJCSAgICgoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJCQkgICAgIHNkeW5zeW0tPmNvbnRlbnRzKQotCQkJCQkgICAgKyBkaW5keCkpOwotCSAgICAgIH0KLQotCSAgICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIG91dHB1dCAuZHluc3ltIHNlY3Rpb24gdG8KLQkgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgc3ltYm9sLiAgKi8KLQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2R5bnN5bS0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9pbmZvID0KLQkgICAgICBTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVM7Ci0JICB9Ci0JZWxzZQotI2VuZGlmIC8qIDAgKi8KLQkgIHsKLQkgICAgc3ltLnN0X3NpemUgPSAwOwotCSAgICBzeW0uc3RfbmFtZSA9IDA7Ci0JICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX1NFQ1RJT04pOwotCSAgICBzeW0uc3Rfb3RoZXIgPSAwOwotCi0JICAgIGZvciAocyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCSAgICAgIHsKLQkJaW50IGluZHg7Ci0KLQkJc3ltLnN0X3ZhbHVlID0gcy0+dm1hOwotCi0JCWluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7Ci0JCUJGRF9BU1NFUlQgKGluZHggPiAwKTsKLQkJc3ltLnN0X3NobmR4ID0gaW5keDsKLQotCQliZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0IChvdXRwdXRfYmZkLCAmc3ltLAotCQkJCQkgICAoKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCQkJICAgICBzZHluc3ltLT5jb250ZW50cykKLQkJCQkJICAgICsgZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHgpKTsKLQkgICAgICB9Ci0KLQkgICAgLyogU2V0IHRoZSBzaF9pbmZvIGZpZWxkIG9mIHRoZSBvdXRwdXQgLmR5bnN5bSBzZWN0aW9uIHRvCi0JICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZ2xvYmFsIHN5bWJvbC4gICovCi0JICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNkeW5zeW0tPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfaW5mbyA9Ci0JICAgICAgYmZkX2NvdW50X3NlY3Rpb25zIChvdXRwdXRfYmZkKSArIDE7Ci0JICB9Ci0gICAgICB9Ci0KLSAgICBpZiAoU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkpCi0gICAgICB7Ci0JLyogV3JpdGUgLmNvbXBhY3RfcmVsIHNlY3Rpb24gb3V0LiAgKi8KLQlzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5jb21wYWN0X3JlbCIpOwotCWlmIChzICE9IE5VTEwpCi0JICB7Ci0JICAgIGNwdC5pZDEgPSAxOwotCSAgICBjcHQubnVtID0gcy0+cmVsb2NfY291bnQ7Ci0JICAgIGNwdC5pZDIgPSAyOwotCSAgICBjcHQub2Zmc2V0ID0gKHMtPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zCi0JCQkgICsgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbCkpOwotCSAgICBjcHQucmVzZXJ2ZWQwID0gMDsKLQkgICAgY3B0LnJlc2VydmVkMSA9IDA7Ci0JICAgIGJmZF9lbGYzMl9zd2FwX2NvbXBhY3RfcmVsX291dCAob3V0cHV0X2JmZCwgJmNwdCwKLQkJCQkJICAgICgoRWxmMzJfRXh0ZXJuYWxfY29tcGFjdF9yZWwgKikKLQkJCQkJICAgICBzLT5jb250ZW50cykpOwotCi0JICAgIC8qIENsZWFuIHVwIGEgZHVtbXkgc3R1YiBmdW5jdGlvbiBlbnRyeSBpbiAudGV4dC4gICovCi0JICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnN0dWIiKTsKLQkgICAgaWYgKHMgIT0gTlVMTCkKLQkgICAgICB7Ci0JCWZpbGVfcHRyIGR1bW15X29mZnNldDsKLQotCQlCRkRfQVNTRVJUIChzLT5fcmF3X3NpemUgPj0gTUlQU19GVU5DVElPTl9TVFVCX1NJWkUpOwotCQlkdW1teV9vZmZzZXQgPSBzLT5fcmF3X3NpemUgLSBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRTsKLQkJbWVtc2V0IChzLT5jb250ZW50cyArIGR1bW15X29mZnNldCwgMCwKLQkJCU1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFKTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAvKiBDbGVhbiB1cCBhIGZpcnN0IHJlbG9jYXRpb24gaW4gLnJlbC5keW4uICAqLwotICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5keW4iKTsKLSAgICBpZiAocyAhPSBOVUxMICYmIHMtPl9yYXdfc2l6ZSA+IDApCi0gICAgICBtZW1zZXQgKHMtPmNvbnRlbnRzLCAwLCBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCkpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGlzIGlzIGFsbW9zdCBpZGVudGljYWwgdG8gYmZkX2dlbmVyaWNfZ2V0Xy4uLiBleGNlcHQgdGhhdCBzb21lCi0gICBNSVBTIHJlbG9jYXRpb25zIG5lZWQgdG8gYmUgaGFuZGxlZCBzcGVjaWFsbHkuICBTaWdoLiAgKi8KLQotc3RhdGljIGJmZF9ieXRlICoKLWVsZjMyX21pcHNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJCSAgIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIC8qIEdldCBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIHN0dWZmICovCi0gIGJmZCAqaW5wdXRfYmZkID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLSAgbG9uZyByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKLSAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7Ci0gIGxvbmcgcmVsb2NfY291bnQ7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jIChyZWxvY19zaXplKTsKLSAgaWYgKHJlbG9jX3ZlY3RvciA9PSBOVUxMICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiByZWFkIGluIHRoZSBzZWN0aW9uICovCi0gIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsCi0JCQkJIGlucHV0X3NlY3Rpb24sCi0JCQkJIChQVFIpIGRhdGEsCi0JCQkJIDAsCi0JCQkJIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2UncmUgbm90IHJlbGF4aW5nIHRoZSBzZWN0aW9uLCBzbyBqdXN0IGNvcHkgdGhlIHNpemUgaW5mbyAqLwotICBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemU7Ci0gIGlucHV0X3NlY3Rpb24tPnJlbG9jX2RvbmUgPSB0cnVlOwotCi0gIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLAotCQkJCQlpbnB1dF9zZWN0aW9uLAotCQkJCQlyZWxvY192ZWN0b3IsCi0JCQkJCXN5bWJvbHMpOwotICBpZiAocmVsb2NfY291bnQgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChyZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgYXJlbGVudCAqKnBhcmVudDsKLSAgICAgIC8qIGZvciBtaXBzICovCi0gICAgICBpbnQgZ3BfZm91bmQ7Ci0gICAgICBiZmRfdm1hIGdwID0gMHgxMjM0NTY3ODsJLyogaW5pdGlhbGl6ZSBqdXN0IHRvIHNodXQgZ2NjIHVwICovCi0KLSAgICAgIHsKLQlzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmg7Ci0Jc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmxoOwotCS8qIFNraXAgYWxsIHRoaXMgc3R1ZmYgaWYgd2UgYXJlbid0IG1peGluZyBmb3JtYXRzLiAgKi8KLQlpZiAoYWJmZCAmJiBpbnB1dF9iZmQKLQkgICAgJiYgYWJmZC0+eHZlYyA9PSBpbnB1dF9iZmQtPnh2ZWMpCi0JICBsaCA9IDA7Ci0JZWxzZQotCSAgewotCSAgICBoID0gYmZkX2hhc2hfbG9va3VwICgmbGlua19pbmZvLT5oYXNoLT50YWJsZSwgIl9ncCIsIGZhbHNlLCBmYWxzZSk7Ci0JICAgIGxoID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0JICB9Ci0gICAgICBsb29rdXA6Ci0JaWYgKGxoKQotCSAgewotCSAgICBzd2l0Y2ggKGxoLT50eXBlKQotCSAgICAgIHsKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkJZ3BfZm91bmQgPSAwOwotCQlicmVhazsKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkJZ3BfZm91bmQgPSAxOwotCQlncCA9IGxoLT51LmRlZi52YWx1ZTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF93YXJuaW5nOgotCQlsaCA9IGxoLT51LmkubGluazsKLQkJLyogQEBGSVhNRSAgaWdub3Jpbmcgd2FybmluZyBmb3Igbm93ICovCi0JCWdvdG8gbG9va3VwOwotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9uZXc6Ci0JICAgICAgZGVmYXVsdDoKLQkJYWJvcnQgKCk7Ci0JICAgICAgfQotCSAgfQotCWVsc2UKLQkgIGdwX2ZvdW5kID0gMDsKLSAgICAgIH0KLSAgICAgIC8qIGVuZCBtaXBzICovCi0gICAgICBmb3IgKHBhcmVudCA9IHJlbG9jX3ZlY3RvcjsgKnBhcmVudCAhPSAoYXJlbGVudCAqKSBOVUxMOwotCSAgIHBhcmVudCsrKQotCXsKLQkgIGNoYXIgKmVycm9yX21lc3NhZ2UgPSAoY2hhciAqKSBOVUxMOwotCSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLQkgIC8qIFNwZWNpZmljIHRvIE1JUFM6IERlYWwgd2l0aCByZWxvY2F0aW9uIHR5cGVzIHRoYXQgcmVxdWlyZQotCSAgICAga25vd2luZyB0aGUgZ3Agb2YgdGhlIG91dHB1dCBiZmQuICAqLwotCSAgYXN5bWJvbCAqc3ltID0gKigqcGFyZW50KS0+c3ltX3B0cl9wdHI7Ci0JICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW0tPnNlY3Rpb24pICYmIGFiZmQpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgc3BlY2lhbF9mdW5jdGlvbiB3b3VsZG4ndCBnZXQgY2FsbGVkIGFueXdheXMuICAqLwotCSAgICB9Ci0JICBlbHNlIGlmICghZ3BfZm91bmQpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgZ3AgaXNuJ3QgdGhlcmU7IGxldCB0aGUgc3BlY2lhbCBmdW5jdGlvbiBjb2RlCi0JCSBmYWxsIG92ZXIgb24gaXRzIG93bi4gICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKCgqcGFyZW50KS0+aG93dG8tPnNwZWNpYWxfZnVuY3Rpb24KLQkJICAgPT0gX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jKQotCSAgICB7Ci0JICAgICAgLyogYnlwYXNzIHNwZWNpYWxfZnVuY3Rpb24gY2FsbCAqLwotCSAgICAgIHIgPSBncHJlbDE2X3dpdGhfZ3AgKGlucHV0X2JmZCwgc3ltLCAqcGFyZW50LCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgIHJlbG9jYXRlYWJsZSwgKFBUUikgZGF0YSwgZ3ApOwotCSAgICAgIGdvdG8gc2tpcF9iZmRfcGVyZm9ybV9yZWxvY2F0aW9uOwotCSAgICB9Ci0JICAvKiBlbmQgbWlwcyBzcGVjaWZpYyBzdHVmZiAqLwotCi0JICByID0gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiAoaW5wdXRfYmZkLAotCQkJCSAgICAgICpwYXJlbnQsCi0JCQkJICAgICAgKFBUUikgZGF0YSwKLQkJCQkgICAgICBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIHJlbG9jYXRlYWJsZSA/IGFiZmQgOiAoYmZkICopIE5VTEwsCi0JCQkJICAgICAgJmVycm9yX21lc3NhZ2UpOwotCXNraXBfYmZkX3BlcmZvcm1fcmVsb2NhdGlvbjoKLQotCSAgaWYgKHJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpvcyA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0JICAgICAgLyogQSBwYXJ0aWFsIGxpbmssIHNvIGtlZXAgdGhlIHJlbG9jcyAqLwotCSAgICAgIG9zLT5vcmVsb2NhdGlvbltvcy0+cmVsb2NfY291bnRdID0gKnBhcmVudDsKLQkgICAgICBvcy0+cmVsb2NfY291bnQrKzsKLQkgICAgfQotCi0JICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKHIpCi0JCXsKLQkJY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCQkgIGlmICghKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCQkobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqKCpwYXJlbnQpLT5zeW1fcHRyX3B0ciksCi0JCQkgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoKnBhcmVudCktPmFkZHJlc3MpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JCSAgQkZEX0FTU0VSVCAoZXJyb3JfbWVzc2FnZSAhPSAoY2hhciAqKSBOVUxMKTsKLQkJICBpZiAoISgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCQkobGlua19pbmZvLCBlcnJvcl9tZXNzYWdlLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgKCpwYXJlbnQpLT5hZGRyZXNzKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCQkobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqKCpwYXJlbnQpLT5zeW1fcHRyX3B0ciksCi0JCQkgKCpwYXJlbnQpLT5ob3d0by0+bmFtZSwgKCpwYXJlbnQpLT5hZGRlbmQsCi0JCQkgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoKnBhcmVudCktPmFkZHJlc3MpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCQlkZWZhdWx0OgotCQkgIGFib3J0ICgpOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gZGF0YTsKLQotZXJyb3JfcmV0dXJuOgotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgZWxmMzJfbWlwc19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLQwKLS8qIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhlc2UgYXJlIHVzZWQgd2hlbiBkZWFsaW5nIHdpdGggdGhlCi0gICAubWRlYnVnIHNlY3Rpb24sIHdoaWNoIGlzIGluIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgZm9ybWF0LiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCBtaXBzX2VsZjMyX2Vjb2ZmX2RlYnVnX3N3YXAgPQotewotICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgbWFnaWNTeW0sCi0gIC8qIEFsaWdubWVudCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBFLmcuLCA0LiAgKi8KLSAgNCwKLSAgLyogU2l6ZXMgb2YgZXh0ZXJuYWwgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBzaXplb2YgKHN0cnVjdCBoZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZG5yX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHBkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBzeW1fZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3Qgb3B0X2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGZkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCByZmRfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZXh0X2V4dCksCi0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIGluIGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICBlY29mZl9zd2FwX2hkcl9pbiwKLSAgZWNvZmZfc3dhcF9kbnJfaW4sCi0gIGVjb2ZmX3N3YXBfcGRyX2luLAotICBlY29mZl9zd2FwX3N5bV9pbiwKLSAgZWNvZmZfc3dhcF9vcHRfaW4sCi0gIGVjb2ZmX3N3YXBfZmRyX2luLAotICBlY29mZl9zd2FwX3JmZF9pbiwKLSAgZWNvZmZfc3dhcF9leHRfaW4sCi0gIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4sCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luLAotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIGVjb2ZmX3N3YXBfaGRyX291dCwKLSAgZWNvZmZfc3dhcF9kbnJfb3V0LAotICBlY29mZl9zd2FwX3Bkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfc3ltX291dCwKLSAgZWNvZmZfc3dhcF9vcHRfb3V0LAotICBlY29mZl9zd2FwX2Zkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfcmZkX291dCwKLSAgZWNvZmZfc3dhcF9leHRfb3V0LAotICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCwKLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0LAotICAvKiBGdW5jdGlvbiB0byByZWFkIGluIHN5bWJvbGljIGRhdGEuICAqLwotICBfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbwotfTsKLQwKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCWJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJlbGYzMi1saXR0bGVtaXBzIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCWJmZF9lbGYzMl9iaWdtaXBzX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmMzItYmlnbWlwcyIKLSNkZWZpbmUgRUxGX0FSQ0gJCQliZmRfYXJjaF9taXBzCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNX01JUFMKLQotLyogVGhlIFNWUjQgTUlQUyBBQkkgc2F5cyB0aGF0IHRoaXMgc2hvdWxkIGJlIDB4MTAwMDAsIGJ1dCBJcml4IDUgdXNlcwotICAgYSB2YWx1ZSBvZiAweDEwMDAsIGFuZCB3ZSBhcmUgY29tcGF0aWJsZS4gICovCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MTAwMAotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NvbGxlY3QJCXRydWUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfdHlwZV9jaGFuZ2Vfb2sJdHJ1ZQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMJdHJ1ZQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJMAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCW1pcHNfaW5mb190b19ob3d0b19yZWwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbAltaXBzX2VsZl9zeW1faXNfZ2xvYmFsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQltaXBzX2VsZjMyX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyCW1pcHNfZWxmMzJfc2VjdGlvbl9mcm9tX3NoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwlfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nCW1pcHNfZWxmMzJfc2VjdGlvbl9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nCV9iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgXAotCQkJCQltaXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwotI2RlZmluZSBlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAJbWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAotCQkJCQlfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcAkmbWlwc19lbGYzMl9lY29mZl9kZWJ1Z19zd2FwCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLQkJCQkJbWlwc19lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBiZmRfZWxmMzJfZmluZF9uZWFyZXN0X2xpbmUJX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBiZmRfZWxmMzJfc2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotCQkJCQltaXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfZmluYWxfbGluawltaXBzX2VsZl9maW5hbF9saW5rCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJX2JmZF9taXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotCQkJCQlfYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCW1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCW1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwltaXBzX2VsZl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJbWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zIFwKLQkJCQkJbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayBcCi0JCQkJCW1pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCW1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCW1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawltaXBzX2VsZl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawltaXBzX2VsZl9nY19zd2VlcF9ob29rCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCSg0Kk1JUFNfUkVTRVJWRURfR09UTk8pCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQkwCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1wcGMuYyBiL2JmZC9lbGYzMi1wcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjViYjI0YS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItcHBjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODQ4ICswLDAgQEAKLS8qIFBvd2VyUEMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gYSBwcmVsaW1pbmFyeSBQb3dlclBDIEVMRiBBQkkuICBUaGUKLSAgIGluZm9ybWF0aW9uIG1heSBub3QgbWF0Y2ggdGhlIGZpbmFsIFBvd2VyUEMgRUxGIEFCSS4gIEl0IGluY2x1ZGVzCi0gICBzdWdnZXN0aW9ucyBmcm9tIHRoZSBpbi1wcm9ncmVzcyBFbWJlZGRlZCBQb3dlclBDIEFCSSwgYW5kIHRoYXQKLSAgIGluZm9ybWF0aW9uIG1heSBhbHNvIG5vdCBtYXRjaC4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9wcGMuaCIKLQotI2RlZmluZSBVU0VfUkVMQQkJLyogd2Ugd2FudCBSRUxBIHJlbG9jYXRpb25zLCBub3QgUkVMICovCi0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgcHBjX2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXJlbGVudCAqY2FjaGVfcHRyLCBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3QpKTsKLXN0YXRpYyB2b2lkIHBwY19lbGZfaG93dG9faW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi1zdGF0aWMgaW50IHBwY19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9zZWN0aW9uX2Zyb21fc2hkciBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCSAgRWxmMzJfSW50ZXJuYWxfU2hkciAqLAotCQkJCQkJICBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfZmFrZV9zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqKSk7Ci0KLXN0YXRpYyBlbGZfbGlua2VyX3NlY3Rpb25fdCAqcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgIGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0pKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9jaGVja19yZWxvY3MgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgICBhc2VjdGlvbiAqLAotCQkJCQkgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLQotc3RhdGljIGFzZWN0aW9uICogcHBjX2VsZl9nY19tYXJrX2hvb2sgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JCQkJCQlFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLAotCQkJCQkJc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JCQkJCQlFbGZfSW50ZXJuYWxfU3ltICpzeW0pKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9nY19zd2VlcF9ob29rIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JCQkJCSAgICAgIGFzZWN0aW9uICpzZWMsCi0JCQkJCSAgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MpKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9hZGp1c3RfZHluaW5keCBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCQkJCQkJIGJmZCAqLAotCQkJCQkJIGFzZWN0aW9uICosCi0JCQkJCQkgYmZkX2J5dGUgKiwKLQkJCQkJCSBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzLAotCQkJCQkJIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXMsCi0JCQkJCQkgYXNlY3Rpb24gKiopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9hZGRfc3ltYm9sX2hvb2sgIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCQkgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCQkJCQkJIGNvbnN0IGNoYXIgKiosCi0JCQkJCQkgZmxhZ3dvcmQgKiwKLQkJCQkJCSBhc2VjdGlvbiAqKiwKLQkJCQkJCSBiZmRfdm1hICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkJICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKLQkJCQkJCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotCi1zdGF0aWMgYm9vbGVhbiBwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSNkZWZpbmUgQlJBTkNIX1BSRURJQ1RfQklUIDB4MjAwMDAwCQkvKiBicmFuY2ggcHJlZGljdGlvbiBiaXQgZm9yIGJyYW5jaCB0YWtlbiByZWxvY3MgKi8KLSNkZWZpbmUgUkFfUkVHSVNURVJfTUFTSyAweDAwMWYwMDAwCQkvKiBtYXNrIHRvIHNldCBSQSBpbiBtZW1vcnkgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFJBX1JFR0lTVEVSX1NISUZUIDE2CQkJLyogdmFsdWUgdG8gc2hpZnQgcmVnaXN0ZXIgYnkgdG8gaW5zZXJ0IFJBICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9sZC5zby4xIgotCi0vKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotI2RlZmluZSBQTFRfRU5UUllfU0laRSAxMgotLyogVGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGx0IHJlc2VydmVkIGZvciB0aGUgZHluYW1pYyBsaW5rZXIuICAqLwotI2RlZmluZSBQTFRfSU5JVElBTF9FTlRSWV9TSVpFIDcyCi0vKiBUaGUgc2l6ZSBvZiB0aGUgZ2FwIGJldHdlZW4gZW50cmllcyBpbiB0aGUgUExULiAgKi8KLSNkZWZpbmUgUExUX1NMT1RfU0laRSA4Ci0vKiBUaGUgbnVtYmVyIG9mIHNpbmdsZS1zbG90IFBMVCBlbnRyaWVzICh0aGUgcmVzdCB1c2UgdHdvIHNsb3RzKS4gICovCi0jZGVmaW5lIFBMVF9OVU1fU0lOR0xFX0VOVFJJRVMgODE5MgotCi0MCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClSX1BQQ19tYXggXTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcHBjX2VsZl9ob3d0b19yYXdbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfUFBDX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgc3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9QUENfQUREUjMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBhYnNvbHV0ZSAyNiBiaXQgYnJhbmNoOyB0aGUgbG93ZXIgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvLgotICAgICBGSVhNRTogd2UgZG9uJ3QgY2hlY2sgdGhhdCwgd2UganVzdCBjbGVhciB0aGVtLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIyNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjI0IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHN0YW5kYXJkIDE2IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDE2IGJpdCByZWxvY2F0aW9uIHdpdGhvdXQgb3ZlcmZsb3cuICAqLwotICBIT1dUTyAoUl9QUENfQUREUjE2X0xPLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMTZfTE8iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIG9yZGVyIDE2IGJpdHMgb2YgYW4gYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX1BQQ19BRERSMTZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE2X0hJIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBvcmRlciAxNiBiaXRzIG9mIGFuIGFkZHJlc3MsIHBsdXMgMSBpZiB0aGUgY29udGVudHMgb2YKLSAgICAgdGhlIGxvdyAxNiBiaXRzLCB0cmVhdGVkIGFzIGEgc2lnbmVkIG51bWJlciwgaXMgbmVnYXRpdmUuCSovCi0gIEhPV1RPIChSX1BQQ19BRERSMTZfSEEsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMTZfSEEiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIGFic29sdXRlIDE2IGJpdCBicmFuY2g7IHRoZSBsb3dlciB0d28gYml0cyBtdXN0IGJlIHplcm8uCi0gICAgIEZJWE1FOiB3ZSBkb24ndCBjaGVjayB0aGF0LCB3ZSBqdXN0IGNsZWFyIHRoZW0uICAqLwotICBIT1dUTyAoUl9QUENfQUREUjE0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMTQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIGFic29sdXRlIDE2IGJpdCBicmFuY2gsIGZvciB3aGljaCBiaXQgMTAgc2hvdWxkIGJlIHNldCB0bwotICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBicmFuY2ggaXMgZXhwZWN0ZWQgdG8gYmUgdGFrZW4uCVRoZSBsb3dlciB0d28KLSAgICAgYml0cyBtdXN0IGJlIHplcm8uCSAqLwotICBIT1dUTyAoUl9QUENfQUREUjE0X0JSVEFLRU4sCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE0X0JSVEFLRU4iLC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gYWJzb2x1dGUgMTYgYml0IGJyYW5jaCwgZm9yIHdoaWNoIGJpdCAxMCBzaG91bGQgYmUgc2V0IHRvCi0gICAgIGluZGljYXRlIHRoYXQgdGhlIGJyYW5jaCBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgdGFrZW4uICBUaGUgbG93ZXIKLSAgICAgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIxNF9CUk5UQUtFTiwgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMTRfQlJOVEFLRU4iLC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAyNiBiaXQgYnJhbmNoOyB0aGUgbG93ZXIgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvLgkgKi8KLSAgSE9XVE8gKFJfUFBDX1JFTDI0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19SRUwyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMTYgYml0IGJyYW5jaDsgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4JICovCi0gIEhPV1RPIChSX1BQQ19SRUwxNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUkVMMTQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE2IGJpdCBicmFuY2guCUJpdCAxMCBzaG91bGQgYmUgc2V0IHRvIGluZGljYXRlIHRoYXQKLSAgICAgdGhlIGJyYW5jaCBpcyBleHBlY3RlZCB0byBiZSB0YWtlbi4gIFRoZSBsb3dlciB0d28gYml0cyBtdXN0IGJlCi0gICAgIHplcm8uICAqLwotICBIT1dUTyAoUl9QUENfUkVMMTRfQlJUQUtFTiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19SRUwxNF9CUlRBS0VOIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE2IGJpdCBicmFuY2guCUJpdCAxMCBzaG91bGQgYmUgc2V0IHRvIGluZGljYXRlIHRoYXQKLSAgICAgdGhlIGJyYW5jaCBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgdGFrZW4uICBUaGUgbG93ZXIgdHdvIGJpdHMgbXVzdAotICAgICBiZSB6ZXJvLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1JFTDE0X0JSTlRBS0VOLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1JFTDE0X0JSTlRBS0VOIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2LCBidXQgcmVmZXJyaW5nIHRvIHRoZSBHT1QgdGFibGUgZW50cnkgZm9yIHRoZQotICAgICBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfR09UMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19HT1QxNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2X0xPLCBidXQgcmVmZXJyaW5nIHRvIHRoZSBHT1QgdGFibGUgZW50cnkgZm9yCi0gICAgIHRoZSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfR09UMTZfTE8sCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19HT1QxNl9MTyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMTZfSEksIGJ1dCByZWZlcnJpbmcgdG8gdGhlIEdPVCB0YWJsZSBlbnRyeSBmb3IKLSAgICAgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19HT1QxNl9ISSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfR09UMTZfSEkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCSAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNl9IQSwgYnV0IHJlZmVycmluZyB0byB0aGUgR09UIHRhYmxlIGVudHJ5IGZvcgotICAgICB0aGUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0dPVDE2X0hBLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dPVDE2X0hBIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX1JFTDI0LCBidXQgcmVmZXJyaW5nIHRvIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZQotICAgICBlbnRyeSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19QTFRSRUwyNCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUExUUkVMMjQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoaXMgaXMgdXNlZCBvbmx5IGJ5IHRoZSBkeW5hbWljIGxpbmtlci4gIFRoZSBzeW1ib2wgc2hvdWxkIGV4aXN0Ci0gICAgIGJvdGggaW4gdGhlIG9iamVjdCBiZWluZyBydW4gYW5kIGluIHNvbWUgc2hhcmVkIGxpYnJhcnkuICBUaGUKLSAgICAgZHluYW1pYyBsaW5rZXIgY29waWVzIHRoZSBkYXRhIGFkZHJlc3NlZCBieSB0aGUgc3ltYm9sIGZyb20gdGhlCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGludG8gdGhlIG9iamVjdCwgYmVjYXVzZSB0aGUgb2JqZWN0IGJlaW5nCi0gICAgIHJ1biBoYXMgdG8gaGF2ZSB0aGUgZGF0YSBhdCBzb21lIHBhcnRpY3VsYXIgYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX1BQQ19DT1BZLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQ09QWSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMzIsIGJ1dCB1c2VkIHdoZW4gc2V0dGluZyBnbG9iYWwgb2Zmc2V0IHRhYmxlCi0gICAgIGVudHJpZXMuICAqLwotICBIT1dUTyAoUl9QUENfR0xPQl9EQVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dMT0JfREFUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTWFya3MgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeSBmb3IgYSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfSk1QX1NMT1QsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0pNUF9TTE9UIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFVzZWQgb25seSBieSB0aGUgZHluYW1pYyBsaW5rZXIuICBXaGVuIHRoZSBvYmplY3QgaXMgcnVuLCB0aGlzCi0gICAgIGxvbmd3b3JkIGlzIHNldCB0byB0aGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBvYmplY3QsIHBsdXMgdGhlCi0gICAgIGFkZGVuZC4gICovCi0gIEhPV1RPIChSX1BQQ19SRUxBVElWRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUkVMQVRJVkUiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX1JFTDI0LCBidXQgdXNlcyB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB3aXRoaW4gdGhlCi0gICAgIG9iamVjdCByYXRoZXIgdGhhbiB0aGUgZmluYWwgdmFsdWUuICBOb3JtYWxseSB1c2VkIGZvcgotICAgICBfR0xPQkFMX09GRlNFVF9UQUJMRV8uICAqLwotICBIT1dUTyAoUl9QUENfTE9DQUwyNFBDLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0xPQ0FMMjRQQyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMzIsIGJ1dCBtYXkgYmUgdW5hbGlnbmVkLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1VBRERSMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1VBRERSMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNiwgYnV0IG1heSBiZSB1bmFsaWduZWQuICAqLwotICBIT1dUTyAoUl9QUENfVUFERFIxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfVUFERFIxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IFBDIHJlbGF0aXZlICovCi0gIEhPV1RPIChSX1BQQ19SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19SRUwzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMi1iaXQgcmVsb2NhdGlvbiB0byB0aGUgc3ltYm9sJ3MgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuCi0gICAgIEZJWE1FOiBub3Qgc3VwcG9ydGVkLiAqLwotICBIT1dUTyAoUl9QUENfUExUMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1BMVDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMi1iaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiB0byB0aGUgc3ltYm9sJ3MgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuCi0gICAgIEZJWE1FOiBub3Qgc3VwcG9ydGVkLiAqLwotICBIT1dUTyAoUl9QUENfUExUUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19QTFRSRUwzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNl9MTywgYnV0IHJlZmVycmluZyB0byB0aGUgUExUIHRhYmxlIGVudHJ5IGZvcgotICAgICB0aGUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1BMVDE2X0xPLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUExUMTZfTE8iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2X0hJLCBidXQgcmVmZXJyaW5nIHRvIHRoZSBQTFQgdGFibGUgZW50cnkgZm9yCi0gICAgIHRoZSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfUExUMTZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1BMVDE2X0hJIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMTZfSEEsIGJ1dCByZWZlcnJpbmcgdG8gdGhlIFBMVCB0YWJsZSBlbnRyeSBmb3IKLSAgICAgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19QTFQxNl9IQSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19QTFQxNl9IQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzaWduLWV4dGVuZGVkIDE2IGJpdCB2YWx1ZSByZWxhdGl2ZSB0byBfU0RBX0JBU0VfLCBmb3IgdXNlIHdpdGgKLSAgICAgc21hbGwgZGF0YSBpdGVtcy4gICovCi0gIEhPV1RPIChSX1BQQ19TREFSRUwxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfU0RBUkVMMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyLWJpdCBzZWN0aW9uIHJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0gIEhPV1RPIChSX1BQQ19TRUNUT0ZGLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1NFQ1RPRkYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYtYml0IGxvd2VyIGhhbGYgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotICBIT1dUTyAoUl9QUENfU0VDVE9GRl9MTywJICAvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfU0VDVE9GRl9MTyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYtYml0IHVwcGVyIGhhbGYgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotICBIT1dUTyAoUl9QUENfU0VDVE9GRl9ISSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfU0VDVE9GRl9ISSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2LWJpdCB1cHBlciBoYWxmIGFkanVzdGVkIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSAgSE9XVE8gKFJfUFBDX1NFQ1RPRkZfSEEsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfU0VDVE9GRl9IQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGZyb20gdGhlIEVtYmVkZGVkIEVMRiBBQkksIGFuZCBhcmUgbm90Ci0gICAgIGluIHRoZSBTVlI0IEVMRiBBQkkuICAqLwotCi0gIC8qIDMyIGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSB0aGUgYWRkZW5kIG1pbnVzIHRoZSBzeW1ib2wgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9OQUREUjMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IHZhbHVlIHJlc3VsdGluZyBmcm9tIHRoZSBhZGRlbmQgbWludXMgdGhlIHN5bWJvbCAqLwotICBIT1dUTyAoUl9QUENfRU1CX05BRERSMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX05BRERSMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSB0aGUgYWRkZW5kIG1pbnVzIHRoZSBzeW1ib2wgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjE2X0xPLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19FTUJfQUREUjE2X0xPIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBvcmRlciAxNiBiaXRzIG9mIHRoZSBhZGRlbmQgbWludXMgdGhlIHN5bWJvbCAqLwotICBIT1dUTyAoUl9QUENfRU1CX05BRERSMTZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX05BRERSMTZfSEkiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIG9yZGVyIDE2IGJpdHMgb2YgdGhlIHJlc3VsdCBvZiB0aGUgYWRkZW5kIG1pbnVzIHRoZSBhZGRyZXNzLAotICAgICBwbHVzIDEgaWYgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb3cgMTYgYml0cywgdHJlYXRlZCBhcyBhIHNpZ25lZCBudW1iZXIsCi0gICAgIGlzIG5lZ2F0aXZlLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjE2X0hBLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX05BRERSMTZfSEEiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSBhbGxvY2F0aW5nIGEgNCBieXRlIHdvcmQgdG8gaG9sZCBhbgotICAgICBhZGRyZXNzIGluIHRoZSAuc2RhdGEgc2VjdGlvbiwgYW5kIHJldHVybmluZyB0aGUgb2Zmc2V0IGZyb20KLSAgICAgX1NEQV9CQVNFXyBmb3IgdGhhdCByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX1BQQ19FTUJfU0RBSTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9TREFJMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSBhbGxvY2F0aW5nIGEgNCBieXRlIHdvcmQgdG8gaG9sZCBhbgotICAgICBhZGRyZXNzIGluIHRoZSAuc2RhdGEyIHNlY3Rpb24sIGFuZCByZXR1cm5pbmcgdGhlIG9mZnNldCBmcm9tCi0gICAgIF9TREEyX0JBU0VfIGZvciB0aGF0IHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9TREEySTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9TREEySTE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHNpZ24tZXh0ZW5kZWQgMTYgYml0IHZhbHVlIHJlbGF0aXZlIHRvIF9TREEyX0JBU0VfLCBmb3IgdXNlIHdpdGgKLSAgICAgc21hbGwgZGF0YSBpdGVtcy4JICovCi0gIEhPV1RPIChSX1BQQ19FTUJfU0RBMlJFTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX1NEQTJSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlbG9jYXRlIGFnYWluc3QgZWl0aGVyIF9TREFfQkFTRV8gb3IgX1NEQTJfQkFTRV8sIGZpbGxpbmcgaW4gdGhlIDE2IGJpdAotICAgICBzaWduZWQgb2Zmc2V0IGZyb20gdGhlIGFwcHJvcHJpYXRlIGJhc2UsIGFuZCBmaWxsaW5nIGluIHRoZSByZWdpc3RlcgotICAgICBmaWVsZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlciAoMCwgMiwgb3IgMTMpLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9TREEyMSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX1NEQTIxIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfTVJLUkVGICovCi0gIC8qIFJlbG9jYXRpb24gbm90IGhhbmRsZWQ6IFJfUFBDX0VNQl9SRUxTRUMxNiAqLwotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfUkVMU1RfTE8gKi8KLSAgLyogUmVsb2NhdGlvbiBub3QgaGFuZGxlZDogUl9QUENfRU1CX1JFTFNUX0hJICovCi0gIC8qIFJlbG9jYXRpb24gbm90IGhhbmRsZWQ6IFJfUFBDX0VNQl9SRUxTVF9IQSAqLwotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfQklUX0ZMRCAqLwotCi0gIC8qIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gYWdhaW5zdCBlaXRoZXIgX1NEQV9CQVNFXyBvciBfU0RBMl9CQVNFXywgZmlsbGluZwotICAgICBpbiB0aGUgMTYgYml0IHNpZ25lZCBvZmZzZXQgZnJvbSB0aGUgYXBwcm9wcmlhdGUgYmFzZSwgYW5kIGZpbGxpbmcgaW4gdGhlCi0gICAgIHJlZ2lzdGVyIGZpZWxkIHdpdGggdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyICgwLCAyLCBvciAxMykuICAqLwotICBIT1dUTyAoUl9QUENfRU1CX1JFTFNEQSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19FTUJfUkVMU0RBIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9QUENfR05VX1ZUSU5IRVJJVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfR05VX1ZUSU5IRVJJVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9QUENfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dOVV9WVEVOVFJZIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFBob255IHJlbG9jIHRvIGhhbmRsZSBBSVggc3R5bGUgVE9DIGVudHJpZXMgKi8KLSAgSE9XVE8gKFJfUFBDX1RPQzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfVE9DMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLQwKLS8qIEluaXRpYWxpemUgdGhlIHBwY19lbGZfaG93dG9fdGFibGUsIHNvIHRoYXQgbGluZWFyIGFjY2Vzc2VzIGNhbiBiZSBkb25lLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19lbGZfaG93dG9faW5pdCAoKQotewotICB1bnNpZ25lZCBpbnQgaSwgdHlwZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwcGNfZWxmX2hvd3RvX3JhdykgLyBzaXplb2YgKHBwY19lbGZfaG93dG9fcmF3WzBdKTsgaSsrKQotICAgIHsKLSAgICAgIHR5cGUgPSBwcGNfZWxmX2hvd3RvX3Jhd1tpXS50eXBlOwotICAgICAgQkZEX0FTU0VSVCAodHlwZSA8IHNpemVvZihwcGNfZWxmX2hvd3RvX3RhYmxlKSAvIHNpemVvZihwcGNfZWxmX2hvd3RvX3RhYmxlWzBdKSk7Ci0gICAgICBwcGNfZWxmX2hvd3RvX3RhYmxlW3R5cGVdID0gJnBwY19lbGZfaG93dG9fcmF3W2ldOwotICAgIH0KLX0KLQotDAotLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlbGF4aW5nIGZvciB0aGUgUFBDIHdpdGggb3B0aW9uIC0tbXBjODYwYzBbPTxuPl0uCi0KLSAgIFRoZSBNUEM4NjAsIHJldmlzaW9uIEMwIG9yIGVhcmxpZXIgY29udGFpbnMgYSBidWcgaW4gdGhlIGRpZS4KLSAgIElmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRydWUsIHRoZSBuZXh0IGluc3RydWN0aW9uCi0gICB0byBiZSBleGVjdXRlZCAqbWF5KiBiZSB0cmVhdGVkIGFzIGEgbm8tb3AuCi0gICAxLyBBIGZvcndhcmQgYnJhbmNoIGlzIGV4ZWN1dGVkLgotICAgMi8gVGhlIGJyYW5jaCBpcyBwcmVkaWN0ZWQgYXMgbm90IHRha2VuLgotICAgMy8gVGhlIGJyYW5jaCBpcyB0YWtlbi4KLSAgIDQvIFRoZSBicmFuY2ggaXMgbG9jYXRlZCBpbiB0aGUgbGFzdCA1IHdvcmRzIG9mIGEgcGFnZS4KLSAgICAgIChUaGUgRU9QIGxpbWl0IGlzIDUgYnkgZGVmYXVsdCBidXQgbWF5IGJlIHNwZWNpZmllZCBhcyBhbnkgdmFsdWUgZnJvbSAxLTEwLikKLSAgIAotICAgT3VyIHNvZnR3YXJlIHNvbHV0aW9uIGlzIHRvIGRldGVjdCB0aGVzZSBwcm9ibGVtYXRpYyBicmFuY2hlcyBpbiBhCi0gICBsaW5rZXIgcGFzcyBhbmQgbW9kaWZ5IHRoZW0gYXMgZm9sbG93czoKLSAgIDEvIFVuY29uZGl0aW9uYWwgYnJhbmNoZXMgLSBTaW5jZSB0aGVzZSBhcmUgYWx3YXlzIHByZWRpY3RlZCB0YWtlbiwKLSAgICAgIHRoZXJlIGlzIG5vIHByb2JsZW0gYW5kIG5vIGFjdGlvbiBpcyByZXF1aXJlZC4KLSAgIDIvIENvbmRpdGlvbmFsIGJhY2t3YXJkIGJyYW5jaGVzIC0gTm8gcHJvYmxlbSwgbm8gYWN0aW9uIHJlcXVpcmVkLgotICAgMy8gQ29uZGl0aW9uYWwgZm9yd2FyZCBicmFuY2hlcyAtIEVuc3VyZSB0aGF0IHRoZSAiaW52ZXJzZSBwcmVkaWN0aW9uCi0gICAgICBiaXQiIGlzIHNldCAoZW5zdXJlIGl0IGlzIHByZWRpY3RlZCB0YWtlbikuCi0gICA0LyBDb25kaXRpb25hbCByZWdpc3RlciBicmFuY2hlcyAtIEVuc3VyZSB0aGF0IHRoZSAieSBiaXQiIGlzIHNldAotICAgICAgKGVuc3VyZSBpdCBpcyBwcmVkaWN0ZWQgdGFrZW4pLgotKi8KLQotLyogU29ydCBzZWN0aW9ucyBieSBhZGRyZXNzLiAgKi8KLQotc3RhdGljIGludAotcHBjX2VsZl9zb3J0X3JlbGEgKGFyZzEsIGFyZzIpCi0gICAgY29uc3Qgdm9pZCAqYXJnMTsKLSAgICBjb25zdCB2b2lkICphcmcyOwotewotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKnJlbGExID0gKGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhKiopIGFyZzE7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICoqcmVsYTIgPSAoY29uc3QgRWxmX0ludGVybmFsX1JlbGEqKikgYXJnMjsKLQotICAvKiBTb3J0IGJ5IG9mZnNldC4gKi8KLSAgcmV0dXJuICgoKnJlbGExKS0+cl9vZmZzZXQgLSAoKnJlbGEyKS0+cl9vZmZzZXQpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9yZWxheF9zZWN0aW9uIChhYmZkLCBpc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgIGJmZCAqYWJmZDsKLSAgICBhc2VjdGlvbiAqaXNlYzsKLSAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgIGJvb2xlYW4gKmFnYWluOwotewotI2RlZmluZSBQQUdFU0laRSAweDEwMDAKLQotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqKnJlbGFfY29tYiA9IE5VTEw7Ci0gIGludCBjb21iX2N1cnIsIGNvbWJfY291bnQ7Ci0KLSAgLyogV2UgbmV2ZXIgaGF2ZSB0byBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIHBlciBpbnB1dCBzZWN0aW9uLiAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICAvKiBJZiBuZWVkZWQsIGluaXRpYWxpemUgdGhpcyBzZWN0aW9uJ3MgY29va2VkIHNpemUuICAqLwotICBpZiAoaXNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgICBpc2VjLT5fY29va2VkX3NpemUgPSBpc2VjLT5fcmF3X3NpemU7Ci0KLSAgLyogV2UncmUgb25seSBpbnRlcmVzdGVkIGluIHRleHQgc2VjdGlvbnMgd2hpY2ggb3ZlcmxhcCB0aGUKLSAgdHJvdWJsZXNvbWUgYXJlYSBhdCB0aGUgZW5kIG9mIGEgcGFnZS4gKi8KLSAgaWYgKGxpbmtfaW5mby0+bXBjODYwYzAgJiYgKGlzZWMtPmZsYWdzICYgU0VDX0NPREUpICYmIGlzZWMtPl9jb29rZWRfc2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGRvdCwgZW5kX3BhZ2UsIGVuZF9zZWN0aW9uOwotICAgICAgYm9vbGVhbiBzZWN0aW9uX21vZGlmaWVkOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICovCi0gICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoaXNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGlzZWMtPl9yYXdfc2l6ZSk7Ci0JICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpc2VjLCBjb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsIGlzZWMtPl9yYXdfc2l6ZSkpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBjb21iX2N1cnIgPSAwOwotICAgICAgY29tYl9jb3VudCA9IDA7Ci0gICAgICBpZiAoaXNlYy0+cmVsb2NfY291bnQpCi0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBuOwotCi0gICAgICAgICAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLSAgICAgICAgICBpbnRlcm5hbF9yZWxvY3MgPSBfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MgKAotICAgIAkgICAgYWJmZCwgaXNlYywgKFBUUikgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIAotICAgIAkgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSk7Ci0gICAgICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIAkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgIAkgICAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLSAgICAKLSAgICAgICAgICAvKiBTZXR1cCBhIGZhc3RlciBhY2Nlc3MgbWV0aG9kIGZvciB0aGUgcmVsb2MgaW5mbyB3ZSBuZWVkLiAqLwotICAgICAgICAgIHJlbGFfY29tYiA9IChFbGZfSW50ZXJuYWxfUmVsYSoqKQotCSAgICBiZmRfbWFsbG9jIChpc2VjLT5yZWxvY19jb3VudCpzaXplb2YoRWxmX0ludGVybmFsX1JlbGEqKSk7Ci0gICAgICAgICAgaWYgKHJlbGFfY29tYiA9PSBOVUxMKQotICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICBmb3IgKG49MDsgbjxpc2VjLT5yZWxvY19jb3VudDsgKytuKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsb25nIHJfdHlwZTsKLSAgICAKLSAgICAgICAgICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChpbnRlcm5hbF9yZWxvY3Nbbl0ucl9pbmZvKTsKLSAgICAgICAgICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpUl9QUENfbWF4KQotICAgICAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgCi0gICAgICAgICAgICAgIC8qIFByb2xvZ3VlIGNvbnN0YW50cyBhcmUgc29tZXRpbWVzIHByZXNlbnQgaW4gdGhlICIudGV4dCIKLSAgICAgICAgICAgICAgc2VjdGlvbnMgYW5kIHRoZXkgY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlaXIgYXNzb2NpYXRlZCByZWxvY2F0aW9uLgotICAgICAgICAgICAgICBXZSBkb24ndCB3YW50IHRvIHByb2Nlc3MgdGhvc2Ugd29yZHMgYW5kIHNvbWUgb3RoZXJzIHdoaWNoCi0gICAgICAgICAgICAgIGNhbiBhbHNvIGJlIGlkZW50aWZpZWQgYnkgdGhlaXIgcmVsb2NhdGlvbnMuICBIb3dldmVyLCBub3QgYWxsCi0gICAgICAgICAgICAgIGNvbmRpdGlvbmFsIGJyYW5jaGVzIHdpbGwgaGF2ZSBhIHJlbG9jYXRpb24gc28gd2Ugd2lsbAotICAgICAgICAgICAgICBvbmx5IGlnbm9yZSB3b3JkcyB0aGF0IDEpIGhhdmUgYSByZWxvYywgYW5kIDIpIHRoZSByZWxvYwotICAgICAgICAgICAgICBpcyBub3QgYXBwbGljYWJsZSB0byBhIGNvbmRpdGlvbmFsIGJyYW5jaC4KLSAgICAgICAgICAgICAgVGhlIGFycmF5IHJlbGFfY29tYiBpcyBidWlsdCBoZXJlIGZvciB1c2UgaW4gdGhlIEVPUCBzY2FuIGxvb3AuICovCi0gICAgICAgICAgICAgIHN3aXRjaCAocl90eXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFJfUFBDX0FERFIxNF9CUk5UQUtFTjogICAgIC8qIGFic29sdXRlLCBwcmVkaWN0ZWQgbm90IHRha2VuICovCi0gICAgICAgICAgICAgICAgY2FzZSBSX1BQQ19SRUwxNDogICAgICAgICAgICAgICAvKiByZWxhdGl2ZSBjb25kLiBici4gKi8KLSAgICAgICAgICAgICAgICBjYXNlIFJfUFBDX1JFTDE0X0JSTlRBS0VOOiAgICAgIC8qIHJlbC4gY29uZC4gYnIuLCBwcmVkaWN0ZWQgbm90IHRha2VuICovCi0gICAgICAgICAgICAgICAgICAvKiBXZSBzaG91bGQgY2hlY2sgdGhlIGluc3RydWN0aW9uLiAqLwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIC8qIFRoZSB3b3JkIGlzIG5vdCBhIGNvbmRpdGlvbmFsIGJyYW5jaCAtIGlnbm9yZSBpdC4gKi8KLSAgICAgICAgICAgICAgICAgIHJlbGFfY29tYltjb21iX2NvdW50KytdID0gJmludGVybmFsX3JlbG9jc1tuXTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoY29tYl9jb3VudCA+IDEpCi0gICAgICAgICAgICAgIHFzb3J0IChyZWxhX2NvbWIsIChzaXplX3QpIGNvbWJfY291bnQsIHNpemVvZiAoaW50KSwgcHBjX2VsZl9zb3J0X3JlbGEpOwotICAgICAgICB9Ci0KLSAgICAgIC8qIEVudW1lcmF0ZSBlYWNoIEVPUCByZWdpb24gdGhhdCBvdmVybGFwcyB0aGlzIHNlY3Rpb24uICovCi0gICAgICBlbmRfc2VjdGlvbiA9IGlzZWMtPnZtYSArIGlzZWMtPl9jb29rZWRfc2l6ZTsKLSAgICAgIGRvdCA9IGVuZF9wYWdlID0gKGlzZWMtPnZtYSB8IChQQUdFU0laRSAtIDEpKSArIDE7Ci0gICAgICBkb3QgLT0gbGlua19pbmZvLT5tcGM4NjBjMDsKLSAgICAgIHNlY3Rpb25fbW9kaWZpZWQgPSBmYWxzZTsKLSAgICAgIGlmIChkb3QgPCBpc2VjLT52bWEpICAgICAgLyogSW5jcmVtZW50IHRoZSBzdGFydCBwb3NpdGlvbiBpZiB0aGlzIHNlY3Rpb24gKi8KLSAgICAgICAgICBkb3QgPSBpc2VjLT52bWE7ICAgICAgLyogYmVnaW5zIGluIHRoZSBtaWRkbGUgb2YgaXRzIGZpcnN0IEVPUCByZWdpb24uICovCi0gICAgICBmb3IgKDsKLSAgICAgICAgICAgZG90IDwgZW5kX3NlY3Rpb247Ci0gICAgICAgICAgIGRvdCArPSBQQUdFU0laRSwgZW5kX3BhZ2UgKz0gUEFHRVNJWkUpCi0gICAgICAgIHsKLQotICAgICAgICAgIC8qIENoZWNrIGVhY2ggd29yZCBpbiB0aGlzIEVPUCByZWdpb24uICovCi0gICAgICAgICAgZm9yICg7IGRvdCA8IGVuZF9wYWdlOyBkb3QgKz0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYmZkX3ZtYSBpc2VjX29mZnNldDsKLSAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICAgICAgICAgICBib29sZWFuIHNraXAsIG1vZGlmaWVkOwotCi0gICAgICAgICAgICAgIC8qIERvbid0IHByb2Nlc3MgdGhpcyB3b3JkIGlmIHRoZXJlIGlzIGEgcmVsb2NhdGlvbiBmb3IgaXQgYW5kCi0gICAgICAgICAgICAgIHRoZSByZWxvY2F0aW9uIGluZGljYXRlcyB0aGUgd29yZCBpcyBub3QgYSBjb25kaXRpb25hbCBicmFuY2guICovCi0gICAgICAgICAgICAgIHNraXAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgaXNlY19vZmZzZXQgPSBkb3QgLSBpc2VjLT52bWE7Ci0gICAgICAgICAgICAgIGZvciAoOyBjb21iX2N1cnI8Y29tYl9jb3VudDsgKytjb21iX2N1cnIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYmZkX3ZtYSByX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgcl9vZmZzZXQgPSByZWxhX2NvbWJbY29tYl9jdXJyXS0+cl9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICBpZiAocl9vZmZzZXQgPj0gaXNlY19vZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAocl9vZmZzZXQgPT0gaXNlY19vZmZzZXQpIHNraXAgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoc2tpcCkgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgLyogQ2hlY2sgdGhlIGN1cnJlbnQgd29yZCBmb3IgYSBwcm9ibGVtYXRpYyBjb25kaXRpb25hbCBicmFuY2guICovCi0jZGVmaW5lIEJPMChpbnNuKSAoKGluc24pICYgMHgwMjAwMDAwMCkKLSNkZWZpbmUgQk8yKGluc24pICgoaW5zbikgJiAweDAwODAwMDAwKQotI2RlZmluZSBCTzQoaW5zbikgKChpbnNuKSAmIDB4MDAyMDAwMDApCi0gICAgICAgICAgICAgIGluc24gPSAodW5zaWduZWQgbG9uZykgYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyBpc2VjX29mZnNldCk7Ci0gICAgICAgICAgICAgIG1vZGlmaWVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgIGlmICgoaW5zbiAmIDB4RmMwMDAwMDApID09IDB4NDAwMDAwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLyogSW5zdHJ1Y3Rpb24gaXMgQkN4ICovCi0gICAgICAgICAgICAgICAgICBpZiAoKCFCTzAoaW5zbikgfHwgIUJPMihpbnNuKSkgJiYgIUJPNChpbnNuKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGJmZF92bWEgdGFyZ2V0OwotICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgYnJhbmNoIGlzIHByZWRpY3RlZCBhcyAibm9ybWFsIi4KLSAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGlzIGEgZm9yd2FyZCBicmFuY2gsIGl0IGlzIHByb2JsZW1hdGljLiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gaW5zbiAmIDB4MDAwMEZmZmM7ICAgICAgICAgICAgICAgLypleHRyYWN0Ki8KLSAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAodGFyZ2V0IF4gMHg4MDAwKSAtIDB4ODAwMDsgICAgICAvKnNpZ24gZXh0ZW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICBpZiAoKGluc24gJiAweDAwMDAwMDAyKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgKz0gZG90OyAgICAgICAgICAgICAgICAgICAgICAgIC8qY29udmVydCB0byBhYnMqLwotICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPiBkb3QpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGluc24gfD0gMHgwMDIwMDAwMDsgICAvKiBzZXQgdGhlIHByZWRpY3Rpb24gYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAoKGluc24gJiAweEZjMDBGZmZlKSA9PSAweDRjMDAwNDIwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIEluc3RydWN0aW9uIGlzIEJDQ1RSeCAqLwotICAgICAgICAgICAgICAgICAgaWYgKCghQk8wKGluc24pIHx8ICFCTzIoaW5zbikpICYmICFCTzQoaW5zbikpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgYnJhbmNoIGlzIHByZWRpY3RlZCBhcyBub3QtdGFrZW4uCi0JCSAgICAgIElmIHRoaXMgaXMgYSBmb3J3YXJkIGJyYW5jaCwgaXQgaXMgcHJvYmxlbWF0aWMuCi0gICAgICAgICAgICAgICAgICAgICAgU2luY2Ugd2UgY2FuJ3QgdGVsbCBzdGF0aWNhbGx5IGlmIGl0IHdpbGwgYnJhbmNoIGZvcndhcmQsCi0gICAgICAgICAgICAgICAgICAgICAgYWx3YXlzIHNldCB0aGUgcHJlZGljdGlvbiBiaXQuICovCi0gICAgICAgICAgICAgICAgICAgICAgaW5zbiB8PSAweDAwMjAwMDAwOyAgIC8qIHNldCB0aGUgcHJlZGljdGlvbiBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIGlmICgoaW5zbiAmIDB4RmMwMEZmZmUpID09IDB4NGMwMDAwMjApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLyogSW5zdHJ1Y3Rpb24gaXMgQkNMUnggKi8KLSAgICAgICAgICAgICAgICAgIGlmICgoIUJPMChpbnNuKSB8fCAhQk8yKGluc24pKSAmJiAhQk80KGluc24pKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGJyYW5jaCBpcyBwcmVkaWN0ZWQgYXMgbm90LXRha2VuLgotCQkgICAgICBJZiB0aGlzIGlzIGEgZm9yd2FyZCBicmFuY2gsIGl0IGlzIHByb2JsZW1hdGljLgotICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIHdlIGNhbid0IHRlbGwgc3RhdGljYWxseSBpZiBpdCB3aWxsIGJyYW5jaCBmb3J3YXJkLAotICAgICAgICAgICAgICAgICAgICAgIGFsd2F5cyBzZXQgdGhlIHByZWRpY3Rpb24gYml0LiAqLwotICAgICAgICAgICAgICAgICAgICAgIGluc24gfD0gMHgwMDIwMDAwMDsgICAvKiBzZXQgdGhlIHByZWRpY3Rpb24gYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotCQkgICAgfQotICAgICAgICAgICAgICAgIH0KLSN1bmRlZiBCTzAKLSN1bmRlZiBCTzIKLSN1bmRlZiBCTzQKLSAgICAgICAgICAgICAgaWYgKG1vZGlmaWVkKQotCSAgICAgICAgewotICAgICAgICAgICAgICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBpc2VjX29mZnNldCk7Ci0JCSAgc2VjdGlvbl9tb2RpZmllZCA9IHRydWU7Ci0JICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGlmIChzZWN0aW9uX21vZGlmaWVkKQotCXsKLQkgIGVsZl9zZWN0aW9uX2RhdGEgKGlzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0JfQotICAgIH0KLQotICBpZiAocmVsYV9jb21iICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAocmVsYV9jb21iKTsKLSAgICAgIHJlbGFfY29tYiA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoaXNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi1lcnJvcl9yZXR1cm46Ci0gIGlmIChyZWxhX2NvbWIgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxhX2NvbWIpOwotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotDAotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotcHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgZW51bSBlbGZfcHBjX3JlbG9jX3R5cGUgcHBjX3JlbG9jID0gUl9QUENfTk9ORTsKLQotICBpZiAoIXBwY19lbGZfaG93dG9fdGFibGVbUl9QUENfQUREUjMyXSkKLSAgICAvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIHBwY19lbGZfaG93dG9faW5pdCAoKTsKLQotICBzd2l0Y2ggKChpbnQpY29kZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKU5VTEw7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19OT05FOgkJcHBjX3JlbG9jID0gUl9QUENfTk9ORTsJCQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoJCQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMzI7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQkEyNjoJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIyNDsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgkJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIxNjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6CQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTZfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgkJcHBjX3JlbG9jID0gUl9QUENfQUREUjE2X0hJOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgkJcHBjX3JlbG9jID0gUl9QUENfQUREUjE2X0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMTY6CQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTQ7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTRfQlJUQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMTZfQlJOVEFLRU46CXBwY19yZWxvYyA9IFJfUFBDX0FERFIxNF9CUk5UQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IyNjoJCXBwY19yZWxvYyA9IFJfUFBDX1JFTDI0OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IxNjoJCXBwY19yZWxvYyA9IFJfUFBDX1JFTDE0OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19SRUwxNF9CUlRBS0VOOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19SRUwxNF9CUk5UQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UT0ZGOgkJcHBjX3JlbG9jID0gUl9QUENfR09UMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19MTzE2X0dPVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX0dPVDE2X0xPOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9HT1RPRkY6CQlwcGNfcmVsb2MgPSBSX1BQQ19HT1QxNl9ISTsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfU19HT1RPRkY6CXBwY19yZWxvYyA9IFJfUFBDX0dPVDE2X0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjRfUExUX1BDUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19QTFRSRUwyNDsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19DT1BZOgkJcHBjX3JlbG9jID0gUl9QUENfQ09QWTsJCQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfR0xPQl9EQVQ6CXBwY19yZWxvYyA9IFJfUFBDX0dMT0JfREFUOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQzoJcHBjX3JlbG9jID0gUl9QUENfTE9DQUwyNFBDOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6CQlwcGNfcmVsb2MgPSBSX1BQQ19SRUwzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BMVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX1BMVDMyOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUExUX1BDUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19QTFRSRUwzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTZfUExUT0ZGOgkJcHBjX3JlbG9jID0gUl9QUENfUExUMTZfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1BMVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX1BMVDE2X0hJOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TX1BMVE9GRjoJcHBjX3JlbG9jID0gUl9QUENfUExUMTZfSEE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDE2OgkJcHBjX3JlbG9jID0gUl9QUENfU0RBUkVMMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9CQVNFUkVMOgkJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTZfQkFTRVJFTDoJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRl9MTzsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfQkFTRVJFTDoJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRl9ISTsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19TRUNUT0ZGX0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19UT0MxNjoJCXBwY19yZWxvYyA9IFJfUFBDX1RPQzE2OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjMyOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfTkFERFIzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX05BRERSMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE86CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0xPOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEk6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0hJOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEE6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0hBOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQUkxNjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMkkxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQTJJMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUw6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9TREEyUkVMOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9TREEyMToJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQTIxOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9NUktSRUY6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9NUktSRUY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNFQzE2OglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU0VDMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfSEk7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfSEE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQ6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9CSVRfRkxEOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREE6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9SRUxTREE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoJcHBjX3JlbG9jID0gUl9QUENfR05VX1ZUSU5IRVJJVDsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOglwcGNfcmVsb2MgPSBSX1BQQ19HTlVfVlRFTlRSWTsJCWJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClwcGNfcmVsb2MgXTsKLX07Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYSBQb3dlclBDIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBpZiAoIXBwY19lbGZfaG93dG9fdGFibGVbIFJfUFBDX0FERFIzMiBdKQkvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIHBwY19lbGZfaG93dG9faW5pdCAoKTsKLQotICBCRkRfQVNTRVJUIChFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKSA8ICh1bnNpZ25lZCBpbnQpIFJfUFBDX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSBwcGNfZWxmX2hvd3RvX3RhYmxlW0VMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pXTsKLX0KLQotLyogSGFuZGxlIHRoZSBSX1BQQ19BRERSMTZfSEEgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfZWxmX2FkZHIxNl9oYV9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIHJlbG9jX2VudHJ5LT5hZGRlbmQgKz0gKHJlbG9jYXRpb24gJiAweDgwMDApIDw8IDE7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8gc2V0IHdoZXRoZXIgYSBtb2R1bGUgbmVlZHMgdGhlIC1tcmVsb2NhdGFibGUgYml0IHNldC4gKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKGFiZmQpCi0JICAgICAgfHwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPT0gZmxhZ3MpOwotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID0gZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChhYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIG9uZSBvYmplY3QgbW9kdWxlIHRvIGFub3RoZXIgKi8KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpCi0JICAgICAgfHwgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPT0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MpOwotCi0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcgKi8KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBmbGFnd29yZCBvbGRfZmxhZ3M7Ci0gIGZsYWd3b3JkIG5ld19mbGFnczsKLSAgYm9vbGVhbiBlcnJvcjsKLQotICAvKiBDaGVjayBpZiB3ZSBoYXZlIHRoZSBzYW1lIGVuZGlhbmVzcyAqLwotICBpZiAoaWJmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IG9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgotICAgICAgJiYgb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTikKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICptc2c7Ci0KLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoaWJmZCkpCi0JbXNnID0gXygiJXM6IGNvbXBpbGVkIGZvciBhIGJpZyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgbGl0dGxlIGVuZGlhbiIpOwotICAgICAgZWxzZQotCW1zZyA9IF8oIiVzOiBjb21waWxlZCBmb3IgYSBsaXR0bGUgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIGJpZyBlbmRpYW4iKTsKLQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChtc2csIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuZXdfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb2xkX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0gIGlmICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQkvKiBGaXJzdCBjYWxsLCBubyBmbGFncyBzZXQgKi8KLSAgICB7Ci0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBuZXdfZmxhZ3M7Ci0gICAgfQotCi0gIGVsc2UgaWYgKG5ld19mbGFncyA9PSBvbGRfZmxhZ3MpCS8qIENvbXBhdGlibGUgZmxhZ3MgYXJlIG9rICovCi0gICAgOwotCi0gIGVsc2UJCQkJCS8qIEluY29tcGF0aWJsZSBmbGFncyAqLwotICAgIHsKLSAgICAgIC8qIFdhcm4gYWJvdXQgLW1yZWxvY2F0YWJsZSBtaXNtYXRjaC4gIEFsbG93IC1tcmVsb2NhdGFibGUtbGliIHRvIGJlIGxpbmtlZAotICAgICAgICAgd2l0aCBlaXRoZXIuICAqLwotICAgICAgZXJyb3IgPSBmYWxzZTsKLSAgICAgIGlmICgobmV3X2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFKSAhPSAwCi0JICAmJiAob2xkX2ZsYWdzICYgKEVGX1BQQ19SRUxPQ0FUQUJMRSB8IEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpKSA9PSAwKQotCXsKLQkgIGVycm9yID0gdHJ1ZTsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGNvbXBpbGVkIHdpdGggLW1yZWxvY2F0YWJsZSBhbmQgbGlua2VkIHdpdGggbW9kdWxlcyBjb21waWxlZCBub3JtYWxseSIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCX0KLSAgICAgIGVsc2UgaWYgKChuZXdfZmxhZ3MgJiAoRUZfUFBDX1JFTE9DQVRBQkxFIHwgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQikpID09IDAKLQkgICAgICAgJiYgKG9sZF9mbGFncyAmIEVGX1BQQ19SRUxPQ0FUQUJMRSkgIT0gMCkKLQl7Ci0JICBlcnJvciA9IHRydWU7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBjb21waWxlZCBub3JtYWxseSBhbmQgbGlua2VkIHdpdGggbW9kdWxlcyBjb21waWxlZCB3aXRoIC1tcmVsb2NhdGFibGUiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQl9Ci0KLSAgICAgIC8qIFRoZSBvdXRwdXQgaXMgLW1yZWxvY2F0YWJsZS1saWIgaWZmIGJvdGggdGhlIGlucHV0IGZpbGVzIGFyZS4gICovCi0gICAgICBpZiAoISAobmV3X2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQikpCi0JZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgJj0gfkVGX1BQQ19SRUxPQ0FUQUJMRV9MSUI7Ci0KLSAgICAgIC8qIFRoZSBvdXRwdXQgaXMgLW1yZWxvY2F0YWJsZSBpZmYgaXQgY2FuJ3QgYmUgLW1yZWxvY2F0YWJsZS1saWIsCi0gICAgICAgICBidXQgZWFjaCBpbnB1dCBmaWxlIGlzIGVpdGhlciAtbXJlbG9jYXRhYmxlIG9yIC1tcmVsb2NhdGFibGUtbGliLiAgKi8KLSAgICAgIGlmICghIChlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyAmIEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpCi0JICAmJiAobmV3X2ZsYWdzICYgKEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIgfCBFRl9QUENfUkVMT0NBVEFCTEUpKQotCSAgJiYgKG9sZF9mbGFncyAmIChFRl9QUENfUkVMT0NBVEFCTEVfTElCIHwgRUZfUFBDX1JFTE9DQVRBQkxFKSkpCi0JZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgfD0gRUZfUFBDX1JFTE9DQVRBQkxFOwotCi0gICAgICAvKiBEbyBub3Qgd2FybiBhYm91dCBlYWJpIHZzLiBWLjQgbWlzbWF0Y2gsIGp1c3Qgb3IgaW4gdGhlIGJpdCBpZiBhbnkgbW9kdWxlIHVzZXMgaXQgKi8KLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzIHw9IChuZXdfZmxhZ3MgJiBFRl9QUENfRU1CKTsKLQotICAgICAgbmV3X2ZsYWdzICY9IH4gKEVGX1BQQ19SRUxPQ0FUQUJMRSB8IEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIgfCBFRl9QUENfRU1CKTsKLSAgICAgIG9sZF9mbGFncyAmPSB+IChFRl9QUENfUkVMT0NBVEFCTEUgfCBFRl9QUENfUkVMT0NBVEFCTEVfTElCIHwgRUZfUFBDX0VNQik7Ci0KLSAgICAgIC8qIFdhcm4gYWJvdXQgYW55IG90aGVyIG1pc21hdGNoZXMgKi8KLSAgICAgIGlmIChuZXdfZmxhZ3MgIT0gb2xkX2ZsYWdzKQotCXsKLQkgIGVycm9yID0gdHJ1ZTsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IHVzZXMgZGlmZmVyZW50IGVfZmxhZ3MgKDB4JWx4KSBmaWVsZHMgdGhhbiBwcmV2aW91cyBtb2R1bGVzICgweCVseCkiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCAobG9uZyluZXdfZmxhZ3MsIChsb25nKW9sZF9mbGFncyk7Ci0JfQotCi0gICAgICBpZiAoZXJyb3IpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogSGFuZGxlIGEgUG93ZXJQQyBzcGVjaWZpYyBzZWN0aW9uIHdoZW4gcmVhZGluZyBhbiBvYmplY3QgZmlsZS4gIFRoaXMKLSAgIGlzIGNhbGxlZCB3aGVuIGVsZmNvZGUuaCBmaW5kcyBhIHNlY3Rpb24gd2l0aCBhbiB1bmtub3duIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIGlmICghIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG5ld3NlY3QgPSBoZHItPmJmZF9zZWN0aW9uOwotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgbmV3c2VjdCk7Ci0gIGlmIChoZHItPnNoX2ZsYWdzICYgU0hGX0VYQ0xVREUpCi0gICAgZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfT1JERVJFRCkKLSAgICBmbGFncyB8PSBTRUNfU09SVF9FTlRSSUVTOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgbmV3c2VjdCwgZmxhZ3MpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogU2V0IHVwIGFueSBvdGhlciBzZWN0aW9uIGZsYWdzIGFuZCBzdWNoIHRoYXQgbWF5IGJlIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIHNoZHIsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKnNoZHI7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLXsKLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkgIT0gMCkKLSAgICBzaGRyLT5zaF9mbGFncyB8PSBTSEZfRVhDTFVERTsKLQotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19TT1JUX0VOVFJJRVMpICE9IDApCi0gICAgc2hkci0+c2hfdHlwZSA9IFNIVF9PUkRFUkVEOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBDcmVhdGUgYSBzcGVjaWFsIGxpbmtlciBzZWN0aW9uICovCi1zdGF0aWMgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKgotcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIHdoaWNoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtIHdoaWNoOwotewotICBiZmQgKmR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3Q7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaXJzdCBiZmQgc2VjdGlvbiB0aGF0IG5lZWRzIHRoZSBzcGVjaWFsIHNlY3Rpb24gKi8KLSAgaWYgKCFkeW5vYmopCi0gICAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUsIGNyZWF0ZSB0aGUgc2VjdGlvbiAqLwotICBsc2VjdCA9IGVsZl9saW5rZXJfc2VjdGlvbiAoZHlub2JqLCB3aGljaCk7Ci0gIGlmICghbHNlY3QpCi0gICAgewotICAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgZGVmYXVsdHM7Ci0gICAgICBzdGF0aWMgZWxmX2xpbmtlcl9zZWN0aW9uX3QgemVyb19zZWN0aW9uOwotCi0gICAgICBkZWZhdWx0cyA9IHplcm9fc2VjdGlvbjsKLSAgICAgIGRlZmF1bHRzLndoaWNoID0gd2hpY2g7Ci0gICAgICBkZWZhdWx0cy5ob2xlX3dyaXR0ZW5fcCA9IGZhbHNlOwotICAgICAgZGVmYXVsdHMuYWxpZ25tZW50ID0gMjsKLQotICAgICAgLyogQm90aCBvZiB0aGVzZSBzZWN0aW9ucyBhcmUgKHRlY2huaWNhbGx5KSBjcmVhdGVkIGJ5IHRoZSB1c2VyCi0JIHB1dHRpbmcgZGF0YSBpbiB0aGVtLCBzbyB0aGV5IHNob3VsZG4ndCBiZSBtYXJrZWQKLQkgU0VDX0xJTktFUl9DUkVBVEVELgotCi0JIFRoZSBsaW5rZXIgY3JlYXRlcyB0aGVtIHNvIGl0IGhhcyBzb21ld2hlcmUgdG8gYXR0YWNoIHRoZWlyCi0JIHJlc3BlY3RpdmUgc3ltYm9scy4gSW4gZmFjdCwgaWYgdGhleSB3ZXJlIGVtcHR5IGl0IHdvdWxkCi0JIGJlIE9LIHRvIGxlYXZlIHRoZSBzeW1ib2wgc2V0IHRvIDAgKG9yIGFueSByYW5kb20gbnVtYmVyKSwgYmVjYXVzZQotCSB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIgc2hvdWxkIG5ldmVyIGJlIHVzZWQuICAqLwotICAgICAgZGVmYXVsdHMuZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQl8IFNFQ19JTl9NRU1PUlkpOwotCi0gICAgICBzd2l0Y2ggKHdoaWNoKQotCXsKLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogVW5rbm93biBzcGVjaWFsIGxpbmtlciB0eXBlICVkIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJCSAoaW50KXdoaWNoKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gKGVsZl9saW5rZXJfc2VjdGlvbl90ICopMDsKLQotCWNhc2UgTElOS0VSX1NFQ1RJT05fU0RBVEE6CS8qIC5zZGF0YS8uc2JzcyBzZWN0aW9uICovCi0JICBkZWZhdWx0cy5uYW1lCQkgID0gIi5zZGF0YSI7Ci0JICBkZWZhdWx0cy5yZWxfbmFtZQkgID0gIi5yZWxhLnNkYXRhIjsKLQkgIGRlZmF1bHRzLmJzc19uYW1lCSAgPSAiLnNic3MiOwotCSAgZGVmYXVsdHMuc3ltX25hbWUJICA9ICJfU0RBX0JBU0VfIjsKLQkgIGRlZmF1bHRzLnN5bV9vZmZzZXQJICA9IDMyNzY4OwotCSAgYnJlYWs7Ci0KLQljYXNlIExJTktFUl9TRUNUSU9OX1NEQVRBMjoJLyogLnNkYXRhMi8uc2JzczIgc2VjdGlvbiAqLwotCSAgZGVmYXVsdHMubmFtZQkJICA9ICIuc2RhdGEyIjsKLQkgIGRlZmF1bHRzLnJlbF9uYW1lCSAgPSAiLnJlbGEuc2RhdGEyIjsKLQkgIGRlZmF1bHRzLmJzc19uYW1lCSAgPSAiLnNic3MyIjsKLQkgIGRlZmF1bHRzLnN5bV9uYW1lCSAgPSAiX1NEQTJfQkFTRV8iOwotCSAgZGVmYXVsdHMuc3ltX29mZnNldAkgID0gMzI3Njg7Ci0JICBkZWZhdWx0cy5mbGFncwkgfD0gU0VDX1JFQURPTkxZOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBsc2VjdCA9IF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgd2hpY2gsICZkZWZhdWx0cyk7Ci0gICAgfQotCi0gIHJldHVybiBsc2VjdDsKLX0KLQotDAotLyogSWYgd2UgaGF2ZSBhIG5vbi16ZXJvIHNpemVkIC5zYnNzMiBvciAuUFBDLkVNQi5zYnNzMCBzZWN0aW9ucywgd2UgbmVlZCB0byBidW1wIHVwCi0gICB0aGUgbnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVycy4gICovCi0KLXN0YXRpYyBpbnQKLXBwY19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGludCByZXQ7Ci0KLSAgcmV0ID0gMDsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaW50ZXJwIik7Ci0gIGlmIChzICE9IE5VTEwpCi0gICAgKytyZXQ7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNic3MyIik7Ci0gIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAgJiYgcy0+X3Jhd19zaXplID4gMCkKLSAgICArK3JldDsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuUFBDLkVNQi5zYnNzMCIpOwotICBpZiAocyAhPSBOVUxMICYmIChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwICYmIHMtPl9yYXdfc2l6ZSA+IDApCi0gICAgKytyZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogTW9kaWZ5IHRoZSBzZWdtZW50IG1hcCBpZiBuZWVkZWQgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyogV2UgaGF2ZSB0byBjcmVhdGUgLmR5bnNic3MgYW5kIC5yZWxhLnNic3MgaGVyZSBzbyB0aGF0IHRoZXkgZ2V0IG1hcHBlZAotICAgdG8gb3V0cHV0IHNlY3Rpb25zIChqdXN0IGxpa2UgX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgaGFzCi0gICB0byBjcmVhdGUgLmR5bmJzcyBhbmQgLnJlbGEuYnNzKS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgaWYgKCFfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyhhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5zYnNzIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBTRUNfQUxMT0MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucmVsYS5zYnNzIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmQgKmR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLSAgYmZkX3ZtYSBwbHRfb2Zmc2V0OwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgY2FsbGVkIGZvciAlc1xuIiwgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0jZW5kaWYKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlciwKLSAgICAgd2hlbiB3ZSBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgfHwgKCghaW5mby0+c2hhcmVkIHx8IGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApCi0JICB8fCAoaW5mby0+c2hhcmVkICYmIGgtPnBsdC5yZWZjb3VudCA8PSAwKSkKLQl7Ci0JICAvKiBBIFBMVCBlbnRyeSBpcyBub3QgcmVxdWlyZWQvYWxsb3dlZCB3aGVuOgotCi0JICAgICAxLiBXZSBhcmUgbm90IHVzaW5nIGxkLnNvOyBiZWNhdXNlIHRoZW4gdGhlIFBMVCBlbnRyeQotCSAgICAgY2FuJ3QgYmUgc2V0IHVwLCBzbyB3ZSBjYW4ndCB1c2Ugb25lLgotCi0JICAgICAyLiBXZSBrbm93IGZvciBjZXJ0YWluIHRoYXQgYSBzeW1ib2wgaXMgZGVmaW5lZCBpbgotCSAgICAgdGhpcyBvYmplY3QsIGJlY2F1c2UgdGhpcyBvYmplY3QgaXMgdGhlIGFwcGxpY2F0aW9uLAotCSAgICAgaXMgbGlua2VkIHdpdGggLUJzeW1ib2xpYywgb3IgYmVjYXVzZSB0aGUgc3ltYm9sIGlzIGxvY2FsLgotCi0JICAgICAzLiBHQyBoYXMgcmVuZGVyZWQgdGhlIGVudHJ5IHVudXNlZC4KLQkgICAgIE5vdGUsIGhvd2V2ZXIsIHRoYXQgaW4gYW4gZXhlY3V0YWJsZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUKLQkgICAgIHN5bWJvbCBnbyB0byB0aGUgUExULCBzbyB3ZSBjYW4ndCB0dXJuIGl0IG9mZiBpbiB0aGF0IGNhc2UuCi0JICAgICA/Pz8gVGhlIGNvcnJlY3QgdGhpbmcgdG8gZG8gaGVyZSBpcyB0byByZWZlcmVuY2UgY291bnQKLQkgICAgIGFsbCB1c2VzIG9mIHRoZSBzeW1ib2wsIG5vdCBqdXN0IHRob3NlIHRvIHRoZSBHT1Qgb3IgUExULiAgKi8KLQkgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH5FTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCAucGx0IGVudHJ5LCBtYWtlIHJvb20gZm9yIHRoZSBzcGVjaWFsCi0JIGZpcnN0IGVudHJ5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgKz0gUExUX0lOSVRJQUxfRU5UUllfU0laRTsKLQotICAgICAgLyogVGhlIFBvd2VyUEMgUExUIGlzIGFjdHVhbGx5IGNvbXBvc2VkIG9mIHR3byBwYXJ0cywgdGhlIGZpcnN0IHBhcnQKLQkgaXMgMiB3b3JkcyAoZm9yIGEgbG9hZCBhbmQgYSBqdW1wKSwgYW5kIHRoZW4gdGhlcmUgaXMgYSByZW1haW5pbmcKLQkgd29yZCBhdmFpbGFibGUgYXQgdGhlIGVuZC4gICovCi0gICAgICBwbHRfb2Zmc2V0ID0gKFBMVF9JTklUSUFMX0VOVFJZX1NJWkUKLQkJICAgICsgKFBMVF9TTE9UX1NJWkUKLQkJICAgICAgICogKChzLT5fcmF3X3NpemUgLSBQTFRfSU5JVElBTF9FTlRSWV9TSVpFKQotCQkJICAvIFBMVF9FTlRSWV9TSVpFKSkpOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZQotCSBub3QgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoaXMKLQkgbG9jYXRpb24gaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24KLQkgcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQKLQkgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gcGx0X29mZnNldDsKLQl9Ci0KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBwbHRfb2Zmc2V0OwotCi0gICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICBBZnRlciB0aGUgODE5Mm5kIGVudHJ5LCByb29tCi0gICAgICAgICBmb3IgdHdvIGVudHJpZXMgaXMgYWxsb2NhdGVkLiAgKi8KLSAgICAgIGlmICgocy0+X3Jhd19zaXplIC0gUExUX0lOSVRJQUxfRU5UUllfU0laRSkgLyBQTFRfRU5UUllfU0laRQotCSAgPj0gUExUX05VTV9TSU5HTEVfRU5UUklFUykKLQlzLT5fcmF3X3NpemUgKz0gMiAqIFBMVF9FTlRSWV9TSVpFOwotICAgICAgZWxzZQotCXMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuCi0KLSAgICAgT2YgY291cnNlLCBpZiB0aGUgc3ltYm9sIGlzIHN1ZmZpY2llbnRseSBzbWFsbCwgd2UgbXVzdCBpbnN0ZWFkCi0gICAgIGFsbG9jYXRlIGl0IGluIC5zYnNzLiAgRklYTUU6IEl0IHdvdWxkIGJlIGJldHRlciB0byBkbyB0aGlzIGlmIGFuZAotICAgICBvbmx5IGlmIHRoZXJlIHdlcmUgYWN0dWFsbHkgU0RBUkVMIHJlbG9jcyBmb3IgdGhhdCBzeW1ib2wuICAqLwotCi0gIGlmIChoLT5zaXplIDw9IGVsZl9ncF9zaXplIChkeW5vYmopKQotICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnNic3MiKTsKLSAgZWxzZQotICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSX1BQQ19DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0gICAgIGNvcHkgdGhlIGluaXRpYWwgdmFsdWUgb3V0IG9mIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgaW50byB0aGUKLSAgICAgcnVudGltZSBwcm9jZXNzIGltYWdlLiAgV2UgbmVlZCB0byByZW1lbWJlciB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgIC5yZWxhLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIGlmIChoLT5zaXplIDw9IGVsZl9ncF9zaXplIChkeW5vYmopKQotCXNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuc2JzcyIpOwotICAgICAgZWxzZQotCXNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gNCkKLSAgICBwb3dlcl9vZl90d28gPSA0OwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBJbmNyZW1lbnQgdGhlIGluZGV4IG9mIGEgZHluYW1pYyBzeW1ib2wgYnkgYSBnaXZlbiBhbW91bnQuICBDYWxsZWQKLSAgIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfYWRqdXN0X2R5bmluZHggKGgsIGNwYXJnKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGNwYXJnOwotewotICBpbnQgKmNwID0gKGludCAqKSBjcGFyZzsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfYWRqdXN0X2R5bmluZHggY2FsbGVkLCBoLT5keW5pbmR4ID0gJWQsICpjcCA9ICVkXG4iLCBoLT5keW5pbmR4LCAqY3ApOwotI2VuZGlmCi0KLSAgaWYgKGgtPmR5bmluZHggIT0gLTEpCi0gICAgaC0+ZHluaW5keCArPSAqY3A7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgYm9vbGVhbiBwbHQ7Ci0gIGJvb2xlYW4gcmVsb2NzOwotICBib29sZWFuIHJlbHRleHQ7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyBjYWxsZWRcbiIpOwotI2VuZGlmCi0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSAucmVsYS5nb3QsIC5yZWxhLnNkYXRhLCBhbmQKLQkgLnJlbGEuc2RhdGEyIHNlY3Rpb25zLiAgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUKLQkgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbCBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldAotCSB0aGUgc2l6ZSBvZiAucmVsYS5nb3QsIGV0IGFsLCB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldAotCSBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZSBiZWxvdy4gICovCi0gICAgICBzdGF0aWMgY2hhciAqcmVsYV9zZWN0aW9uc1tdID0geyAiLnJlbGEuZ290IiwgIi5yZWxhLnNkYXRhIiwKLQkJCQkgICAgICAgIi5yZWxhLnNkYXRhMiIsICIucmVsYS5zYnNzIiwKLQkJCQkgICAgICAgKGNoYXIgKikwIH07Ci0gICAgICBjaGFyICoqcDsKLQotICAgICAgZm9yIChwID0gcmVsYV9zZWN0aW9uczsgKnAgIT0gKGNoYXIgKikwOyBwKyspCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICpwKTsKLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIHMtPl9yYXdfc2l6ZSA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHBsdCA9IGZhbHNlOwotICByZWxvY3MgPSBmYWxzZTsKLSAgcmVsdGV4dCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFN0cmlwIHRoaXMgc2VjdGlvbiBpZiB3ZSBkb24ndCBuZWVkIGl0OyBzZWUgdGhlCi0gICAgICAgICAgICAgICAgIGNvbW1lbnQgYmVsb3cuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBpcyBhIFBMVC4gICovCi0JICAgICAgcGx0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCi0JCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgbW9zdGx5IHRvIGhhbmRsZSAucmVsYS5ic3MgYW5kCi0JCSAucmVsYS5wbHQuICBXZSBtdXN0IGNyZWF0ZSBib3RoIHNlY3Rpb25zIGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSB0aGV5IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0JICAgICAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZWxvY2F0aW9uIHNlY3Rpb25zLiAqLwotCSAgICAgIHJlbG9jcyA9IHRydWU7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMIGVudHJ5LiAgKi8KLQkgICAgICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDUpOwotCSAgICAgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCXJlbHRleHQgPSB0cnVlOwotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5nb3QiKSAhPSAwCi0JICAgICAgICYmIHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpICE9IDAKLQkgICAgICAgJiYgc3RyY21wIChuYW1lLCAiLnNkYXRhMiIpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMQSkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbG9jcykKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQUVOVCwKLQkJCQkJCXNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBnZW5lcmF0ZSBhIHNlY3Rpb24KLSAgICAgc3ltYm9sIGZvciBlYWNoIG91dHB1dCBzZWN0aW9uLiAgVGhlc2UgYXJlIGxvY2FsIHN5bWJvbHMsIHdoaWNoCi0gICAgIG1lYW5zIHRoYXQgdGhleSBtdXN0IGNvbWUgZmlyc3QgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotICAgICBUaGF0IG1lYW5zIHdlIG11c3QgaW5jcmVtZW50IHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBvZiBldmVyeQotICAgICBvdGhlciBkeW5hbWljIHN5bWJvbC4KLQotICAgICBGSVhNRTogV2UgYXNzdW1lIHRoYXQgdGhlcmUgd2lsbCBuZXZlciBiZSByZWxvY2F0aW9ucyB0bwotICAgICBsb2NhdGlvbnMgaW4gbGlua2VyLWNyZWF0ZWQgc2VjdGlvbnMgdGhhdCBkbyBub3QgaGF2ZQotICAgICBleHRlcm5hbGx5LXZpc2libGUgbmFtZXMuIEluc3RlYWQsIHdlIHNob3VsZCB3b3JrIG91dCBwcmVjaXNlbHkKLSAgICAgd2hpY2ggc2VjdGlvbnMgcmVsb2NhdGlvbnMgYXJlIHRhcmdldHRlZCBhdC4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgaW50IGM7Ci0KLSAgICAgIGZvciAoYyA9IDAsIHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSAhPSAwCi0JICAgICAgfHwgKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotCSAgICB7Ci0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHggPSAtMTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBUaGVzZSBzeW1ib2xzIHdpbGwgaGF2ZSBubyBuYW1lcywgc28gd2UgZG9uJ3QgbmVlZCB0bwotCSAgICAgZmlkZGxlIHdpdGggZHluc3RyX2luZGV4LiAgKi8KLQotCSAgZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHggPSBjICsgMTsKLQotCSAgYysrOwotCX0KLQotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgcHBjX2VsZl9hZGp1c3RfZHluaW5keCwKLQkJCSAgICAgIChQVFIpICZjKTsKLSAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgKz0gYzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZSwgYW5kCi0gICBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBvciBwcm9jZWR1cmUgbGlua2FnZQotICAgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3RfcmVmY291bnRzOwotICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqc2RhdGE7Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl90ICpzZGF0YTI7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIGFzZWN0aW9uICpzZ290ID0gTlVMTDsKLSAgYXNlY3Rpb24gKnNyZWxnb3QgPSBOVUxMOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX2NoZWNrX3JlbG9jcyBjYWxsZWQgZm9yIHNlY3Rpb24gJXMgaW4gJXNcbiIsCi0JICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotI2VuZGlmCi0KLSAgLyogQ3JlYXRlIHRoZSBsaW5rZXIgZ2VuZXJhdGVkIHNlY3Rpb25zIGFsbCB0aGUgdGltZSBzbyB0aGF0IHRoZQotICAgICBzcGVjaWFsIHN5bWJvbHMgYXJlIGNyZWF0ZWQuICAqLwotCi0gIGlmICgoc2RhdGEgPSBlbGZfbGlua2VyX3NlY3Rpb24gKGFiZmQsIExJTktFUl9TRUNUSU9OX1NEQVRBKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZGF0YSA9IHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCBMSU5LRVJfU0VDVElPTl9TREFUQSk7Ci0gICAgICBpZiAoIXNkYXRhKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICBpZiAoKHNkYXRhMiA9IGVsZl9saW5rZXJfc2VjdGlvbiAoYWJmZCwgTElOS0VSX1NFQ1RJT05fU0RBVEEyKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZGF0YTIgPSBwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgTElOS0VSX1NFQ1RJT05fU0RBVEEyKTsKLSAgICAgIGlmICghc2RhdGEyKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgbG9jYWxfZ290X3JlZmNvdW50cyA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKTsKLQotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplL3NpemVvZihFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCi0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgLyogSWYgYSByZWxvY2F0aW9uIHJlZmVycyB0byBfR0xPQkFMX09GRlNFVF9UQUJMRV8sIGNyZWF0ZSB0aGUgLmdvdC4KLQkgVGhpcyBzaG93cyB1cCBpbiBwYXJ0aWN1bGFyIGluIGFuIFJfUFBDX0FERFIzMiBpbiB0aGUgZWFiaQotCSBzdGFydHVwIGNvZGUuICAqLwotICAgICAgaWYgKGggJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQl7Ci0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCQllbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JLyogR09UMTYgcmVsb2NhdGlvbnMgKi8KLQljYXNlIFJfUFBDX0dPVDE2OgotCWNhc2UgUl9QUENfR09UMTZfTE86Ci0JY2FzZSBSX1BQQ19HT1QxNl9ISToKLQljYXNlIFJfUFBDX0dPVDE2X0hBOgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KLQotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkJZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCSAgICAgICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgewotCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdC5yZWZjb3VudCA9PSAtMSkKLQkJewotCQkgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCSAgICBpZiAoIWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQotCQkgIC8qIEFsbG9jYXRlIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQkJICAvKiBBbGxvY2F0ZSByZWxvY2F0aW9uIHNwYWNlLiAgKi8KLQkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotCQkgIGgtPmdvdC5yZWZjb3VudCA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWgtPmdvdC5yZWZjb3VudCsrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbCBzeW1ib2wuICAqLwotCSAgICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzID09IE5VTEwpCi0JCXsKLQkJICBzaXplX3Qgc2l6ZTsKLQotCQkgIHNpemUgPSBzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChiZmRfc2lnbmVkX3ZtYSk7Ci0JCSAgbG9jYWxfZ290X3JlZmNvdW50cyA9IChiZmRfc2lnbmVkX3ZtYSAqKQotCQkgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLQkJICBpZiAobG9jYWxfZ290X3JlZmNvdW50cyA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKSA9IGxvY2FsX2dvdF9yZWZjb3VudHM7Ci0JCSAgbWVtc2V0IChsb2NhbF9nb3RfcmVmY291bnRzLCAtMSwgc2l6ZSk7Ci0JCX0KLQkgICAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPT0gLTEpCi0JCXsKLQkJICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQotCQkgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGEgUl9QUENfUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLwotCQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotCQkgIGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0rKzsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQkvKiBJbmRpcmVjdCAuc2RhdGEgcmVsb2NhdGlvbiAqLwotCWNhc2UgUl9QUENfRU1CX1NEQUkxNjoKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogcmVsb2NhdGlvbiAlcyBjYW5ub3QgYmUgdXNlZCB3aGVuIG1ha2luZyBhIHNoYXJlZCBvYmplY3QiKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICJSX1BQQ19FTUJfU0RBSTE2IikpOwotCSAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTCAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgIHsKLQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCFiZmRfZWxmMzJfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIHNkYXRhLCBoLCByZWwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGJyZWFrOwotCi0JLyogSW5kaXJlY3QgLnNkYXRhMiByZWxvY2F0aW9uICovCi0JY2FzZSBSX1BQQ19FTUJfU0RBMkkxNjoKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogcmVsb2NhdGlvbiAlcyBjYW5ub3QgYmUgdXNlZCB3aGVuIG1ha2luZyBhIHNoYXJlZCBvYmplY3QiKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICJSX1BQQ19FTUJfU0RBMkkxNiIpKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTCAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgIHsKLQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCFiZmRfZWxmMzJfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIHNkYXRhMiwgaCwgcmVsKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9QUENfU0RBUkVMMTY6Ci0JY2FzZSBSX1BQQ19FTUJfU0RBMlJFTDoKLQljYXNlIFJfUFBDX0VNQl9TREEyMToKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogcmVsb2NhdGlvbiAlcyBjYW5ub3QgYmUgdXNlZCB3aGVuIG1ha2luZyBhIHNoYXJlZCBvYmplY3QiKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCXBwY19lbGZfaG93dG9fdGFibGVbKGludClFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKV0tPm5hbWUpKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1BQQ19QTFQzMjoKLQljYXNlIFJfUFBDX1BMVFJFTDI0OgotCWNhc2UgUl9QUENfUExUMTZfTE86Ci0JY2FzZSBSX1BQQ19QTFQxNl9ISToKLQljYXNlIFJfUFBDX1BMVDE2X0hBOgotI2lmZGVmIERFQlVHCi0JICBmcHJpbnRmIChzdGRlcnIsICJSZWxvYyByZXF1aXJlcyBhIFBMVCBlbnRyeVxuIik7Ci0jZW5kaWYKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICBXZQotICAgICAgICAgICAgIGFjdHVhbGx5IGJ1aWxkIHRoZSBlbnRyeSBpbiBhZGp1c3RfZHluYW1pY19zeW1ib2wsCi0gICAgICAgICAgICAgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGEgY2FzZSBvZiBsaW5raW5nIFBJQyBjb2RlIHdpdGhvdXQKLSAgICAgICAgICAgICBsaW5raW5nIGluIGFueSBkeW5hbWljIG9iamVjdHMsIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QKLSAgICAgICAgICAgICBuZWVkIHRvIGdlbmVyYXRlIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgYWZ0ZXIgYWxsLiAgKi8KLQotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBhIHByb2NlZHVyZSBsaW5rYWdlCi0gICAgICAgICAgICAgICAgIHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsIHN5bWJvbC4gICovCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaWYgKGgtPnBsdC5yZWZjb3VudCA9PSAtMSkKLQkgICAgewotCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICAgICAgaC0+cGx0LnJlZmNvdW50ID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBoLT5wbHQucmVmY291bnQrKzsKLQkgIGJyZWFrOwotCi0JICAvKiBUaGUgZm9sbG93aW5nIHJlbG9jYXRpb25zIGRvbid0IG5lZWQgdG8gcHJvcGFnYXRlIHRoZQotCSAgICAgcmVsb2NhdGlvbiBpZiBsaW5raW5nIGEgc2hhcmVkIG9iamVjdCBzaW5jZSB0aGV5IGFyZQotCSAgICAgc2VjdGlvbiByZWxhdGl2ZS4gICovCi0JY2FzZSBSX1BQQ19TRUNUT0ZGOgotCWNhc2UgUl9QUENfU0VDVE9GRl9MTzoKLQljYXNlIFJfUFBDX1NFQ1RPRkZfSEk6Ci0JY2FzZSBSX1BQQ19TRUNUT0ZGX0hBOgotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVmZXJzIG9ubHkgdG8gZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5ICovCi0JY2FzZSBSX1BQQ19MT0NBTDI0UEM6Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotCSAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl9QUENfR05VX1ZUSU5IRVJJVDoKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0JICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfUFBDX0dOVV9WVEVOVFJZOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCSAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZQotCSAgICAgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgV2UgY3JlYXRlIGEgcmVsb2MKLQkgICAgIHNlY3Rpb24gaW4gZHlub2JqIGFuZCBtYWtlIHJvb20gZm9yIHRoZSByZWxvYy4gICovCi0JY2FzZSBSX1BQQ19SRUwyNDoKLQljYXNlIFJfUFBDX1JFTDE0OgotCWNhc2UgUl9QUENfUkVMMTRfQlJUQUtFTjoKLQljYXNlIFJfUFBDX1JFTDE0X0JSTlRBS0VOOgotCWNhc2UgUl9QUENfUkVMMzI6Ci0JICBpZiAoaCA9PSBOVUxMCi0JICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCWRlZmF1bHQ6Ci0JICBpZiAoaW5mby0+c2hhcmVkKQotCSAgICB7Ci0jaWZkZWYgREVCVUcKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX2NoZWNrX3JlbG9jcyBuZWVkIHRvIGNyZWF0ZSByZWxvY2F0aW9uIGZvciAlc1xuIiwKLQkJICAgICAgIChoICYmIGgtPnJvb3Qucm9vdC5zdHJpbmcpID8gaC0+cm9vdC5yb290LnN0cmluZyA6ICI8dW5rbm93bj4iKTsKLSNlbmRpZgotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGFiZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCQkJCQkgbmFtZSArIDUpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBmbGFnd29yZCBmbGFnczsKLQotCQkgICAgICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIG5hbWUpOwotCQkgICAgICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZCi0JCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQkJICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkJZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsIGZsYWdzKQotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotCSAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgaGVyZSBkbyB3aGF0IHRoZSBtNjhrIGFuZCBpMzg2Ci0JCSBiYWNrZW5kcyBkbzogaWYgdGhlIHJlbG9jIGlzIHBjLXJlbGF0aXZlLCByZWNvcmQgaXQKLQkJIGluIGNhc2UgaXQgdHVybnMgb3V0IHRoYXQgdGhlIHJlbG9jIGlzIHVubmVjZXNzYXJ5Ci0JCSBiZWNhdXNlIHRoZSBzeW1ib2wgaXMgZm9yY2VkIGxvY2FsIGJ5IHZlcnNpb25pbmcgb3IKLQkJIHdlIGFyZSBsaW5raW5nIHdpdGggLUJkeW5hbWljLiAgRm9ydHVuYXRlbHkgdGhpcwotCQkgY2FzZSBpcyBub3QgZnJlcXVlbnQuICAqLwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgc2VjdGlvbiB0aGF0IHNob3VsZCBiZSBtYXJrZWQgYWdhaW5zdCBHQyBmb3IgYSBnaXZlbgotICAgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1wcGNfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSX1BQQ19HTlVfVlRJTkhFUklUOgotCWNhc2UgUl9QUENfR05VX1ZURU5UUlk6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0JICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotCXsKLQkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBsb2NhbF9nb3RfcmVmY291bnRzID0gZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpOwotCi0gIHJlbGVuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfUFBDX0dPVDE2OgotICAgICAgY2FzZSBSX1BQQ19HT1QxNl9MTzoKLSAgICAgIGNhc2UgUl9QUENfR09UMTZfSEk6Ci0gICAgICBjYXNlIFJfUFBDX0dPVDE2X0hBOgotCXJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQlpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgIHsKLQkgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgICAgaWYgKGgtPmdvdC5yZWZjb3VudCA+IDApCi0JICAgICAgaC0+Z290LnJlZmNvdW50LS07Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPiAwKQotCSAgICAgIGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdLS07Ci0JICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFJfUFBDX1BMVDMyOgotICAgICAgY2FzZSBSX1BQQ19QTFRSRUwyNDoKLSAgICAgIGNhc2UgUl9QUENfUExUMTZfTE86Ci0gICAgICBjYXNlIFJfUFBDX1BMVDE2X0hJOgotICAgICAgY2FzZSBSX1BQQ19QTFQxNl9IQToKLQlyX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0JaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICB7Ci0JICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAgIGlmIChoLT5wbHQucmVmY291bnQgPiAwKQotCSAgICAgIGgtPnBsdC5yZWZjb3VudC0tOwotCSAgfQotCWJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogSG9vayBjYWxsZWQgYnkgdGhlIGxpbmtlciByb3V0aW5lIHdoaWNoIGFkZHMgc3ltYm9scyBmcm9tIGFuIG9iamVjdAotICAgZmlsZS4gIFdlIHVzZSBpdCB0byBwdXQgLmNvbW0gaXRlbXMgaW4gLnNic3MsIGFuZCBub3QgLmJzcy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfYWRkX3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBzeW0sIG5hbWVwLCBmbGFnc3AsIHNlY3AsIHZhbHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwOwotICAgICBmbGFnd29yZCAqZmxhZ3NwOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGJmZF92bWEgKnZhbHA7Ci17Ci0gIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04KLSAgICAgICYmICFpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIHN5bS0+c3Rfc2l6ZSA8PSAoYmZkX3ZtYSkgYmZkX2dldF9ncF9zaXplIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiBDb21tb24gc3ltYm9scyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gLUcgbm4gYnl0ZXMgYXJlIGF1dG9tYXRpY2FsbHkKLQkgcHV0IGludG8gLnNkYXRhLiAgKi8KLSAgICAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpzZGF0YQotCT0gcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIExJTktFUl9TRUNUSU9OX1NEQVRBKTsKLQotICAgICAgaWYgKCFzZGF0YS0+YnNzX3NlY3Rpb24pCi0JewotCSAgLyogV2UgZG9uJ3QgZ28gdGhyb3VnaCBiZmRfbWFrZV9zZWN0aW9uLCBiZWNhdXNlIHdlIGRvbid0Ci0gICAgICAgICAgICAgd2FudCB0byBhdHRhY2ggdGhpcyBjb21tb24gc2VjdGlvbiB0byBEWU5PQkouICBUaGUgbGlua2VyCi0gICAgICAgICAgICAgd2lsbCBtb3ZlIHRoZSBzeW1ib2xzIHRvIHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgc2VjdGlvbgotICAgICAgICAgICAgIHdoZW4gaXQgZGVmaW5lcyBjb21tb24gc3ltYm9scy4gICovCi0JICBzZGF0YS0+YnNzX3NlY3Rpb24gPSAoKGFzZWN0aW9uICopCi0JCQkJYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpKTsKLQkgIGlmIChzZGF0YS0+YnNzX3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5uYW1lID0gc2RhdGEtPmJzc19uYW1lOwotCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5mbGFncyA9IFNFQ19JU19DT01NT047Ci0JICBzZGF0YS0+YnNzX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uID0gc2RhdGEtPmJzc19zZWN0aW9uOwotCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2wgPQotCSAgICAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHIgPQotCSAgICAoYXN5bWJvbCAqKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sICopKTsKLQkgIGlmIChzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbCA9PSBOVUxMCi0JICAgICAgfHwgc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2xfcHRyX3B0ciA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbC0+bmFtZSA9IHNkYXRhLT5ic3NfbmFtZTsKLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sLT5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sLT5zZWN0aW9uID0gc2RhdGEtPmJzc19zZWN0aW9uOwotCSAgKnNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHIgPSBzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbDsKLQl9Ci0KLSAgICAgICpzZWNwID0gc2RhdGEtPmJzc19zZWN0aW9uOwotICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBiZmQgKmR5bm9iajsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIGNhbGxlZCBmb3IgJXMiLAotCSAgIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotI2VuZGlmCi0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBhc2VjdGlvbiAqc3JlbGE7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotICAgICAgYmZkX3ZtYSByZWxvY19pbmRleDsKLQotI2lmZGVmIERFQlVHCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIsIHBsdF9vZmZzZXQgPSAlZCIsIGgtPnBsdC5vZmZzZXQpOwotI2VuZGlmCi0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBTZXQKLSAgICAgICAgIGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc3JlbGEgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIFdlIGRvbid0IG5lZWQgdG8gZmlsbCBpbiB0aGUgLnBsdC4gIFRoZSBwcGMgZHluYW1pYyBsaW5rZXIKLQkgd2lsbCBmaWxsIGl0IGluLiAgKi8KLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGgtPnBsdC5vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfUFBDX0pNUF9TTE9UKTsKLSAgICAgIHJlbGEucl9hZGRlbmQgPSAwOwotCi0gICAgICByZWxvY19pbmRleCA9IChoLT5wbHQub2Zmc2V0IC0gUExUX0lOSVRJQUxfRU5UUllfU0laRSkgLyBQTFRfU0xPVF9TSVpFOwotICAgICAgaWYgKHJlbG9jX2luZGV4ID4gUExUX05VTV9TSU5HTEVfRU5UUklFUykKLQlyZWxvY19pbmRleCAtPSAocmVsb2NfaW5kZXggLSBQTFRfTlVNX1NJTkdMRV9FTlRSSUVTKSAvIDI7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyByZWxvY19pbmRleCkpOwotCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGFzIGRlZmluZWQgaW4KLQkgICAgIHRoZSAucGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQl9Ci0gICAgfQotCi0gIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFNldCBpdAotICAgICAgICAgdXAuICAqLwotCi0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOwotCi0gICAgICByZWxhLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyAoaC0+Z290Lm9mZnNldCAmfiAxKSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIGxpbmssIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLQkgbG9jYWxseSwgd2UganVzdCB3YW50IHRvIGVtaXQgYSBSRUxBVElWRSByZWxvYy4gIFRoZSBlbnRyeSBpbgotCSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGluCi0JIHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQl7Ci0JICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9QUENfUkVMQVRJVkUpOwotCSAgcmVsYS5yX2FkZGVuZCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBCRkRfQVNTRVJUKChoLT5nb3Qub2Zmc2V0ICYgMSkgPT0gMCk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyBoLT5nb3Qub2Zmc2V0KTsKLQkgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX1BQQ19HTE9CX0RBVCk7Ci0JICByZWxhLnJfYWRkZW5kID0gMDsKLQl9Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgc3JlbGEtPmNvbnRlbnRzCi0JCQkJICArIHNyZWxhLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzcmVsYS0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9scyBuZWVkcyBhIGNvcHkgcmVsb2MuICBTZXQgaXQgdXAuICAqLwotCi0jaWZkZWYgREVCVUcKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiwgY29weSIpOwotI2VuZGlmCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBpZiAoaC0+c2l6ZSA8PSBlbGZfZ3Bfc2l6ZSAoZHlub2JqKSkKLQlzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgICAiLnJlbGEuc2JzcyIpOwotICAgICAgZWxzZQotCXMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKLQkJCQkgICAgICIucmVsYS5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX1BQQ19DT1BZKTsKLSAgICAgIHJlbGEucl9hZGRlbmQgPSAwOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzLT5jb250ZW50cwotCQkJCSAgKyBzLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotI2VuZGlmCi0KLSAgLyogTWFyayBzb21lIHNwZWNpYWxseSBkZWZpbmVkIHN5bWJvbHMgYXMgYWJzb2x1dGUuICAqLwotICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzZHluOwotICBiZmQgKmR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBhc2VjdGlvbiAqc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIGNhbGxlZFxuIik7Ci0jZW5kaWYKLQotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgRWxmMzJfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBib29sZWFuIHNpemU7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBjYXNlIERUX1BMVEdPVDogICBuYW1lID0gIi5wbHQiOwkgIHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUExUUkVMU1o6IG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IHRydWU7ICBicmVhazsKLQkgICAgY2FzZSBEVF9KTVBSRUw6ICAgbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICBkZWZhdWx0OgkgICAgICBuYW1lID0gTlVMTDsJICBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChuYW1lICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgaWYgKHMgPT0gTlVMTCkKLQkJZHluLmRfdW4uZF92YWwgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghIHNpemUpCi0JCSAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplOwotCQkgICAgICBlbHNlCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFkZCBhIGJscmwgaW5zdHJ1Y3Rpb24gYXQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLTQgc28gdGhhdCBhIGZ1bmN0aW9uIGNhbgotICAgICBlYXNpbHkgZmluZCB0aGUgYWRkcmVzcyBvZiB0aGUgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLiAgKi8KLSAgaWYgKHNnb3QpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqY29udGVudHMgPSBzZ290LT5jb250ZW50czsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDB4NGU4MDAwMjEgLyogYmxybCAqLywgY29udGVudHMpOwotCi0gICAgICBpZiAoc2R5biA9PSBOVUxMKQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBjb250ZW50cys0KTsKLSAgICAgIGVsc2UKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNkeW4tPm91dHB1dF9vZmZzZXQsCi0JCSAgICBjb250ZW50cys0KTsKLQotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2R5bnN5bTsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgRWxmX0ludGVybmFsX1N5bSBzeW07Ci0gICAgICBpbnQgbWF4ZGluZHggPSAwOwotCi0gICAgICAvKiBTZXQgdXAgdGhlIHNlY3Rpb24gc3ltYm9scyBmb3IgdGhlIG91dHB1dCBzZWN0aW9ucy4gICovCi0KLSAgICAgIHNkeW5zeW0gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgQkZEX0FTU0VSVCAoc2R5bnN5bSAhPSBOVUxMKTsKLQotICAgICAgc3ltLnN0X3NpemUgPSAwOwotICAgICAgc3ltLnN0X25hbWUgPSAwOwotICAgICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfU0VDVElPTik7Ci0gICAgICBzeW0uc3Rfb3RoZXIgPSAwOwotCi0gICAgICBmb3IgKHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpbnQgaW5keCwgZGluZHg7Ci0KLQkgIHN5bS5zdF92YWx1ZSA9IHMtPnZtYTsKLQotCSAgaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2lkeDsKLQkgIGRpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHg7Ci0JICBpZiAoZGluZHggIT0gLTEpCi0JICAgIHsKLQkgICAgICBCRkRfQVNTRVJUKGluZHggPiAwKTsKLQkgICAgICBCRkRfQVNTRVJUKGRpbmR4ID4gMCk7Ci0KLQkgICAgICBpZiAoZGluZHggPiBtYXhkaW5keCkKLQkJbWF4ZGluZHggPSBkaW5keDsKLQotCSAgICAgIHN5bS5zdF9zaG5keCA9IGluZHg7Ci0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0IChvdXRwdXRfYmZkLCAmc3ltLAotCQkJCQkgKFBUUikgKCgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkJCQkgc2R5bnN5bS0+Y29udGVudHMpCi0JCQkJCQkrIGRpbmR4KSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFNldCB0aGUgc2hfaW5mbyBmaWVsZCBvZiB0aGUgb3V0cHV0IC5keW5zeW0gc2VjdGlvbiB0byB0aGUKLSAgICAgICAgIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgc3ltYm9sLiAgKi8KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNkeW5zeW0tPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfaW5mbyA9Ci0JbWF4ZGluZHggKyAxOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZCBsaW5rZXIKLSAgIHRvIGhhbmRsZSB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4KLQotICAgVGhlIHJlbG9jcyBhcmUgYWx3YXlzIHBhc3NlZCBhcyBSZWxhIHN0cnVjdHVyZXM7IGlmIHRoZSBzZWN0aW9uCi0gICBhY3R1YWxseSB1c2VzIFJlbCBzdHJ1Y3R1cmVzLCB0aGUgcl9hZGRlbmQgZmllbGQgd2lsbCBhbHdheXMgYmUKLSAgIHplcm8uCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdCB0aGUgc2VjdGlvbiBjb250ZW50cyBhcwotICAgbmVjZXNzYXJ5LCBhbmQgKGlmIHVzaW5nIFJlbGEgcmVsb2NzIGFuZCBnZW5lcmF0aW5nIGEKLSAgIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSkgYWRqdXN0aW5nIHRoZSByZWxvYyBhZGRlbmQgYXMKLSAgIG5lY2Vzc2FyeS4KLQotICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgdGhlIHJlbG9jCi0gICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLSAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCi0KLSAgIExPQ0FMX1NFQ1RJT05TIGlzIGFuIGFycmF5IGdpdmluZyB0aGUgc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZQotICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCi0KLSAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAotICAgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgotCi0gICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQotICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKLSAgIGdvaW5nIHRvIGJlIHRoZSBzZWN0aW9uIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQKLSAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCi0gICBhY2NvcmRpbmdseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcgkJICA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBiZmQgKmR5bm9iagkJCQkgID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl90ICpzZGF0YQkJICA9IChkeW5vYmopID8gZWxmX2xpbmtlcl9zZWN0aW9uIChkeW5vYmosIExJTktFUl9TRUNUSU9OX1NEQVRBKSAgOiBOVUxMOwotICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqc2RhdGEyCQkgID0gKGR5bm9iaikgPyBlbGZfbGlua2VyX3NlY3Rpb24gKGR5bm9iaiwgTElOS0VSX1NFQ1RJT05fU0RBVEEyKSA6IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwJCSAgPSByZWxvY3M7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQJCSAgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgYXNlY3Rpb24gKnNyZWxvYwkJCSAgPSBOVUxMOwotICBhc2VjdGlvbiAqc3BsdDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBib29sZWFuIHJldAkJCQkgID0gdHJ1ZTsKLSAgbG9uZyBpbnNuOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIGNhbGxlZCBmb3IgJXMgc2VjdGlvbiAlcywgJWxkIHJlbG9jYXRpb25zJXNcbiIsCi0JICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkgICBiZmRfc2VjdGlvbl9uYW1lKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiksCi0JICAgKGxvbmcpaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQsCi0JICAgKGluZm8tPnJlbG9jYXRlYWJsZSkgPyAiIChyZWxvY2F0YWJsZSkiIDogIiIpOwotI2VuZGlmCi0KLSAgaWYgKCFwcGNfZWxmX2hvd3RvX3RhYmxlWyBSX1BQQ19BRERSMzIgXSkJLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSBpZiBuZWVkZWQgKi8KLSAgICBwcGNfZWxmX2hvd3RvX2luaXQgKCk7Ci0KLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0KLSAgc3BsdCA9IHNnb3QgPSBOVUxMOwotICBpZiAoZHlub2JqICE9IE5VTEwpCi0gICAgewotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICB9Ci0KLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgZW51bSBlbGZfcHBjX3JlbG9jX3R5cGUgcl90eXBlCT0gKGVudW0gZWxmX3BwY19yZWxvY190eXBlKUVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgYmZkX3ZtYSBvZmZzZXQJCQk9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBiZmRfdm1hIGFkZGVuZAkJCT0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByCQk9IGJmZF9yZWxvY19vdGhlcjsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bQkJPSAoRWxmX0ludGVybmFsX1N5bSAqKTA7Ci0gICAgICBhc2VjdGlvbiAqc2VjCQkJPSAoYXNlY3Rpb24gKikwOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgJPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikwOwotICAgICAgY29uc3QgY2hhciAqc3ltX25hbWUJCT0gKGNvbnN0IGNoYXIgKikwOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gICAgICAvKiBVbmtub3duIHJlbG9jYXRpb24gaGFuZGxpbmcgKi8KLSAgICAgIGlmICgodW5zaWduZWQpcl90eXBlID49ICh1bnNpZ25lZClSX1BQQ19tYXggfHwgIXBwY19lbGZfaG93dG9fdGFibGVbKGludClyX3R5cGVdKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJIChpbnQpcl90eXBlKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaG93dG8gPSBwcGNfZWxmX2hvd3RvX3RhYmxlWyhpbnQpcl90eXBlXTsKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoKHVuc2lnbmVkKUVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAiXHR0eXBlID0gJXMgKCVkKSwgc3ltYm9sIGluZGV4ID0gJWxkLCBvZmZzZXQgPSAlbGQsIGFkZGVuZCA9ICVsZFxuIiwKLQkJICAgaG93dG8tPm5hbWUsCi0JCSAgIChpbnQpcl90eXBlLAotCQkgICByX3N5bW5keCwKLQkJICAgKGxvbmcpb2Zmc2V0LAotCQkgICAobG9uZylhZGRlbmQpOwotI2VuZGlmCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgc3ltX25hbWUgPSAiPGxvY2FsIHN5bWJvbD4iOwotCi0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIHN5bV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBpZiAoKHJfdHlwZSA9PSBSX1BQQ19QTFQzMgotCQkgICAmJiBoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJICB8fCAocl90eXBlID09IFJfUFBDX0xPQ0FMMjRQQwotCQkgICAgICAmJiBzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCSAgfHwgKChyX3R5cGUgPT0gUl9QUENfR09UMTYKLQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19HT1QxNl9MTwotCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX0dPVDE2X0hJCi0JCSAgICAgICB8fCByX3R5cGUgPT0gUl9QUENfR09UMTZfSEEpCi0JCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICAgICYmICghIGluZm8tPnNoYXJlZAotCQkJICB8fCAoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCQkgICAgICAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkJICAgICAgJiYgKHJfdHlwZSA9PSBSX1BQQ19BRERSMzIKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIyNAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTZfTE8KLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIxNl9ISQotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjE2X0hBCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTQKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIxNF9CUlRBS0VOCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTRfQlJOVEFLRU4KLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1BMVFJFTDI0Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19DT1BZCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19HTE9CX0RBVAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfSk1QX1NMT1QKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1VBRERSMzIKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1VBRERSMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1NEQVJFTDE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTkFERFIzMgotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX05BRERSMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9OQUREUjE2X0xPCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTkFERFIxNl9ISQotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX05BRERSMTZfSEEKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9TREFJMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9TREEySTE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfU0RBMlJFTAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX1NEQTIxCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTVJLUkVGCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfQklUX0ZMRAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX1JFTFNEQQotCQkJICB8fCAoKHJfdHlwZSA9PSBSX1BQQ19SRUwyNAotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwzMgotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwxNAotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwxNF9CUlRBS0VOCi0JCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX1JFTDE0X0JSTlRBS0VOCi0JCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX1JFTEFUSVZFKQotCQkJICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCQkgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpICE9IDApKSkpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0gICAgICAgICAgICAgICAgICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgICgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKShpbmZvLAotCQkJCQkJICAgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkJCSAgIGlucHV0X2JmZCwKLQkJCQkJCSAgIGlucHV0X3NlY3Rpb24sCi0JCQkJCQkgICByZWwtPnJfb2Zmc2V0KTsKLQkgICAgICByZXQgPSBmYWxzZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoICgoaW50KXJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkIGZvciBzeW1ib2wgJXMiKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgKGludClyX3R5cGUsIHN5bV9uYW1lKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGNvbnRpbnVlOwotCi0JLyogUmVsb2NhdGlvbnMgdGhhdCBuZWVkIG5vIHNwZWNpYWwgcHJvY2Vzc2luZy4gICovCi0JY2FzZSAoaW50KVJfUFBDX0xPQ0FMMjRQQzoKLQkgIC8qIEl0IG1ha2VzIG5vIHNlbnNlIHRvIHBvaW50IGEgbG9jYWwgcmVsb2NhdGlvbgotCSAgICAgYXQgYSBzeW1ib2wgbm90IGluIHRoaXMgb2JqZWN0LiAgKi8KLQkgIGlmIChoICE9IE5VTEwKLQkgICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgICAgJiYgc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpIChpbmZvLAotCQkJCQkJICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJCQkgICAgaW5wdXRfYmZkLAotCQkJCQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJCQkgICAgcmVsLT5yX29mZnNldCk7Ci0JICAgICAgcmV0ID0gZmFsc2U7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JLyogUmVsb2NhdGlvbnMgdGhhdCBtYXkgbmVlZCB0byBiZSBwcm9wYWdhdGVkIGlmIHRoaXMgaXMgYSBzaGFyZWQKLSAgICAgICAgICAgb2JqZWN0LiAgKi8KLQljYXNlIChpbnQpUl9QUENfUkVMMjQ6Ci0JY2FzZSAoaW50KVJfUFBDX1JFTDMyOgotCWNhc2UgKGludClSX1BQQ19SRUwxNDoKLQkgIC8qIElmIHRoZXNlIHJlbG9jYXRpb25zIGFyZSBub3QgdG8gYSBuYW1lZCBzeW1ib2wsIHRoZXkgY2FuIGJlCi0JICAgICBoYW5kbGVkIHJpZ2h0IGhlcmUsIG5vIG5lZWQgdG8gYm90aGVyIHRoZSBkeW5hbWljIGxpbmtlci4gICovCi0JICBpZiAoaCA9PSBOVUxMCi0JICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JLyogZmFsbCB0aHJvdWdoICovCi0KLQkvKiBSZWxvY2F0aW9ucyB0aGF0IGFsd2F5cyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgaWYgdGhpcyBpcyBhIHNoYXJlZAotICAgICAgICAgICBvYmplY3QuICAqLwotCWNhc2UgKGludClSX1BQQ19OT05FOgotCWNhc2UgKGludClSX1BQQ19BRERSMzI6Ci0JY2FzZSAoaW50KVJfUFBDX0FERFIyNDoKLQljYXNlIChpbnQpUl9QUENfQUREUjE2OgotCWNhc2UgKGludClSX1BQQ19BRERSMTZfTE86Ci0JY2FzZSAoaW50KVJfUFBDX0FERFIxNl9ISToKLQljYXNlIChpbnQpUl9QUENfQUREUjE2X0hBOgotCWNhc2UgKGludClSX1BQQ19BRERSMTQ6Ci0JY2FzZSAoaW50KVJfUFBDX1VBRERSMzI6Ci0JY2FzZSAoaW50KVJfUFBDX1VBRERSMTY6Ci0JICBpZiAoaW5mby0+c2hhcmVkKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCSAgICAgIGJvb2xlYW4gc2tpcDsKLQotI2lmZGVmIERFQlVHCi0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIG5lZWQgdG8gY3JlYXRlIHJlbG9jYXRpb24gZm9yICVzXG4iLAotCQkgICAgICAgKGggJiYgaC0+cm9vdC5yb290LnN0cmluZykgPyBoLT5yb290LnJvb3Quc3RyaW5nIDogIjx1bmtub3duPiIpOwotI2VuZGlmCi0KLQkgICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB0aGVzZSByZWxvY2F0aW9ucwotICAgICAgICAgICAgICAgICBhcmUgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlIHRvIGJlIHJlc29sdmVkIGF0IHJ1bgotICAgICAgICAgICAgICAgICB0aW1lLiAgKi8KLQotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGlucHV0X2JmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiksCi0JCQkJCSBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7Ci0JCX0KLQotCSAgICAgIHNraXAgPSBmYWxzZTsKLQotCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCi0JCW91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkX3ZtYSBvZmY7Ci0KLQkJICBvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0JCQkgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJCSAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgJmVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8sCi0JCQkgIHJlbC0+cl9vZmZzZXQpKTsKLQkJICBpZiAob2ZmID09IChiZmRfdm1hKSAtMSkKLQkJICAgIHNraXAgPSB0cnVlOwotCQkgIG91dHJlbC5yX29mZnNldCA9IG9mZjsKLQkJfQotCi0JICAgICAgb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JICAgICAgaWYgKHNraXApCi0JCW1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIG91dHJlbCk7Ci0JICAgICAgLyogaC0+ZHluaW5keCBtYXkgYmUgLTEgaWYgdGhpcyBzeW1ib2wgd2FzIG1hcmtlZCB0bwotICAgICAgICAgICAgICAgICBiZWNvbWUgbG9jYWwuICAqLwotCSAgICAgIGVsc2UgaWYgKGggIT0gTlVMTAotCQkgICAgICAgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCi0JCXsKLQkJICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCByX3R5cGUpOwotCQkgIG91dHJlbC5yX2FkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAocl90eXBlID09IFJfUFBDX0FERFIzMikKLQkJICAgIHsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9QUENfUkVMQVRJVkUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgaW5keDsKLQotCQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQkJc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCQkgICAgICB8fCAoaC0+cm9vdC50eXBlCi0JCQkJCSAgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSk7Ci0JCQkgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJCX0KLQkJICAgICAgaWYgKHNlYyAhPSBOVUxMICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLQkJCWluZHggPSAwOwotCQkgICAgICBlbHNlIGlmIChzZWMgPT0gTlVMTCB8fCBzZWMtPm93bmVyID09IE5VTEwpCi0JCQl7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYXNlY3Rpb24gKm9zZWM7Ci0KLQkJCSAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JCQkgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChvc2VjKS0+ZHluaW5keDsKLQkJCSAgQkZEX0FTU0VSVChpbmR4ID4gMCk7Ci0jaWZkZWYgREVCVUcKLQkJCSAgaWYgKGluZHggPD0gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBwcmludGYoImluZHg9JWQgc2VjdGlvbj0lcyBmbGFncz0lMDh4IG5hbWU9JXNcbiIsCi0JCQkJICAgICBpbmR4LCBvc2VjLT5uYW1lLCBvc2VjLT5mbGFncywKLQkJCQkgICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCQkJICAgIH0KLSNlbmRpZgotCQkJfQotCi0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGluZHgsIHJfdHlwZSk7Ci0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkgICBzcmVsb2MtPmNvbnRlbnRzKQotCQkJCQkgICsgc3JlbG9jLT5yZWxvY19jb3VudCkpOwotCSAgICAgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQotCSAgICAgIC8qIFRoaXMgcmVsb2Mgd2lsbCBiZSBjb21wdXRlZCBhdCBydW50aW1lLCBzbyB0aGVyZSdzIG5vCi0gICAgICAgICAgICAgICAgIG5lZWQgdG8gZG8gYW55dGhpbmcgbm93LCB1bmxlc3MgdGhpcyBpcyBhIFJFTEFUSVZFCi0gICAgICAgICAgICAgICAgIHJlbG9jIGluIGFuIHVuYWxsb2NhdGVkIHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChza2lwCi0JCSAgfHwgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCSAgfHwgRUxGMzJfUl9UWVBFIChvdXRyZWwucl9pbmZvKSAhPSBSX1BQQ19SRUxBVElWRSkKLQkJY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogQXJpdGhtZXRpYyBhZGp1c3QgcmVsb2NhdGlvbnMgdGhhdCBhcmVuJ3QgZ29pbmcgaW50byBhCi0JICAgICBzaGFyZWQgb2JqZWN0LiAgKi8KLQkgIGlmIChyX3R5cGUgPT0gUl9QUENfQUREUjE2X0hBCi0JICAgICAgLyogSXQncyBqdXN0IHBvc3NpYmxlIHRoYXQgdGhpcyBzeW1ib2wgaXMgYSB3ZWFrIHN5bWJvbAotCQkgdGhhdCdzIG5vdCBhY3R1YWxseSBkZWZpbmVkIGFueXdoZXJlLiBJbiB0aGF0IGNhc2UsCi0JCSAnc2VjJyB3b3VsZCBiZSBOVUxMLCBhbmQgd2Ugc2hvdWxkIGxlYXZlIHRoZSBzeW1ib2wKLQkJIGFsb25lIChpdCB3aWxsIGJlIHNldCB0byB6ZXJvIGVsc2V3aGVyZSBpbiB0aGUgbGluaykuICAqLwotCSAgICAgICYmIHNlYyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYWRkZW5kICs9ICgocmVsb2NhdGlvbiArIGFkZGVuZCkgJiAweDgwMDApIDw8IDE7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JLyogYnJhbmNoIHRha2VuIHByZWRpY3Rpb24gcmVsb2NhdGlvbnMgKi8KLQljYXNlIChpbnQpUl9QUENfQUREUjE0X0JSVEFLRU46Ci0JY2FzZSAoaW50KVJfUFBDX1JFTDE0X0JSVEFLRU46Ci0JICBpbnNuID0gYmZkX2dldF8zMiAob3V0cHV0X2JmZCwgY29udGVudHMgKyBvZmZzZXQpOwotCSAgaWYgKChyZWxvY2F0aW9uIC0gb2Zmc2V0KSAmIDB4ODAwMCkKLQkgICAgaW5zbiAmPSB+QlJBTkNIX1BSRURJQ1RfQklUOwotCSAgZWxzZQotCSAgICBpbnNuIHw9IEJSQU5DSF9QUkVESUNUX0JJVDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGluc24sIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgIGJyZWFrOwotCi0JLyogYnJhbmNoIG5vdCB0YWtlbiBwcmVkaWNpdGlvbiByZWxvY2F0aW9ucyAqLwotCWNhc2UgKGludClSX1BQQ19BRERSMTRfQlJOVEFLRU46Ci0JY2FzZSAoaW50KVJfUFBDX1JFTDE0X0JSTlRBS0VOOgotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKG91dHB1dF9iZmQsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgIGlmICgocmVsb2NhdGlvbiAtIG9mZnNldCkgJiAweDgwMDApCi0JICAgIGluc24gfD0gQlJBTkNIX1BSRURJQ1RfQklUOwotCSAgZWxzZQotCSAgICBpbnNuICY9IH5CUkFOQ0hfUFJFRElDVF9CSVQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBpbnNuLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICBicmVhazsKLQotCS8qIEdPVDE2IHJlbG9jYXRpb25zICovCi0JY2FzZSAoaW50KVJfUFBDX0dPVDE2OgotCWNhc2UgKGludClSX1BQQ19HT1QxNl9MTzoKLQljYXNlIChpbnQpUl9QUENfR09UMTZfSEk6Ci0JY2FzZSAoaW50KVJfUFBDX0dPVDE2X0hBOgotCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSBnbG9iYWwKLSAgICAgICAgICAgICBvZmZzZXQgdGFibGUuICAqLwotCSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JICAgICAgb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkgICAgICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCXsKLQkJICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEKLSAgICAgICAgICAgICAgICAgICAgIC1Cc3ltYm9saWMgbGluayBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0gICAgICAgICAgICAgICAgICAgICBsb2NhbGx5LiAgV2UgbXVzdCBpbml0aWFsaXplIHRoaXMgZW50cnkgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2luY2UgdGhlIG9mZnNldCBtdXN0Ci0gICAgICAgICAgICAgICAgICAgICBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LCB3ZSB1c2UgdGhlIGxlYXN0Ci0gICAgICAgICAgICAgICAgICAgICBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQgaXQgYWxyZWFkeS4KLQotCQkgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWxhLmdvdAotCQkgICAgIHJlbG9jYXRpb24gZW50cnkgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsdWUuICBUaGlzCi0JCSAgICAgaXMgZG9uZSBpbiB0aGUgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICAqLwotCQkgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJICAgIG9mZiAmPSB+MTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICBzZ290LT5jb250ZW50cyArIG9mZik7Ci0JCSAgICAgIGgtPmdvdC5vZmZzZXQgfD0gMTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmYgLSA0OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZjsKLQotCSAgICAgIEJGRF9BU1NFUlQgKGxvY2FsX2dvdF9vZmZzZXRzICE9IE5VTEwKLQkJCSAgJiYgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgICAgICBvZmYgPSBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF07Ci0KLQkgICAgICAvKiBUaGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNC4gIFdlIHVzZQotCQkgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0JCSBhbHJlYWR5IHByb2Nlc3NlZCB0aGlzIGVudHJ5LiAgKi8KLQkgICAgICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCW9mZiAmPSB+MTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLCBzZ290LT5jb250ZW50cyArIG9mZik7Ci0KLQkJICBpZiAoaW5mby0+c2hhcmVkKQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqc3JlbGdvdDsKLQkJICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCi0JCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBSX1BQQ19SRUxBVElWRSByZWxvYwotCQkJIGZvciB0aGUgZHluYW1pYyBsaW5rZXIuICAqLwotCQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgICAgICBCRkRfQVNTRVJUIChzcmVsZ290ICE9IE5VTEwpOwotCi0JCSAgICAgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCQkJICsgb2ZmKTsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9QUENfUkVMQVRJVkUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uOwotCQkgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkJICgoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKLQkJCQkJCSAgIHNyZWxnb3QtPmNvbnRlbnRzKQotCQkJCQkJICArIHNyZWxnb3QtPnJlbG9jX2NvdW50KSk7Ci0JCSAgICAgICsrc3JlbGdvdC0+cmVsb2NfY291bnQ7Ci0JCSAgICB9Ci0KLQkJICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gfD0gMTsKLQkJfQotCi0JICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmYgLSA0OwotCSAgICB9Ci0JICBicmVhazsKLQotCS8qIEluZGlyZWN0IC5zZGF0YSByZWxvY2F0aW9uICovCi0JY2FzZSAoaW50KVJfUFBDX0VNQl9TREFJMTY6Ci0JICBCRkRfQVNTRVJUIChzZGF0YSAhPSBOVUxMKTsKLQkgIHJlbG9jYXRpb24gPSBiZmRfZWxmMzJfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKG91dHB1dF9iZmQsIGlucHV0X2JmZCwgaW5mbywKLQkJCQkJCQkJc2RhdGEsIGgsIHJlbG9jYXRpb24sIHJlbCwKLQkJCQkJCQkJUl9QUENfUkVMQVRJVkUpOwotCSAgYnJlYWs7Ci0KLQkvKiBJbmRpcmVjdCAuc2RhdGEyIHJlbG9jYXRpb24gKi8KLQljYXNlIChpbnQpUl9QUENfRU1CX1NEQTJJMTY6Ci0JICBCRkRfQVNTRVJUIChzZGF0YTIgIT0gTlVMTCk7Ci0JICByZWxvY2F0aW9uID0gYmZkX2VsZjMyX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbnB1dF9iZmQsIGluZm8sCi0JCQkJCQkJCXNkYXRhMiwgaCwgcmVsb2NhdGlvbiwgcmVsLAotCQkJCQkJCQlSX1BQQ19SRUxBVElWRSk7Ci0JICBicmVhazsKLQotCS8qIEhhbmRsZSB0aGUgVE9DMTYgcmVsb2MuICBXZSB3YW50IHRvIHVzZSB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgLmdvdAotCSAgIHNlY3Rpb24sIG5vdCB0aGUgYWN0dWFsIFZNQS4gIFRoaXMgaXMgYXBwcm9wcmlhdGUgd2hlbiBnZW5lcmF0aW5nCi0JICAgYW4gZW1iZWRkZWQgRUxGIG9iamVjdCwgZm9yIHdoaWNoIHRoZSAuZ290IHNlY3Rpb24gYWN0cyBsaWtlIHRoZQotCSAgIEFJWCAudG9jIHNlY3Rpb24uICAqLwotCWNhc2UgKGludClSX1BQQ19UT0MxNjoJCQkvKiBwaG9ueSBHT1QxNiByZWxvY2F0aW9ucyAqLwotCSAgQkZEX0FTU0VSVCAoc2VjICE9IChhc2VjdGlvbiAqKTApOwotCSAgQkZEX0FTU0VSVCAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWMpCi0JCSAgICAgIHx8IHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuZ290IikgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLmNnb3QiKSA9PSAwKQotCi0JICBhZGRlbmQgLT0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0ICsgMHg4MDAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIChpbnQpUl9QUENfUExUUkVMMjQ6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCi0gICAgICAgICAgICAgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQotCSAgaWYgKGgtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xCi0JICAgICAgfHwgc3BsdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogV2UgZGlkbid0IG1ha2UgYSBQTFQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgVGhpcwotICAgICAgICAgICAgICAgICBoYXBwZW5zIHdoZW4gc3RhdGljYWxseSBsaW5raW5nIFBJQyBjb2RlLCBvciB3aGVuCi0gICAgICAgICAgICAgICAgIHVzaW5nIC1Cc3ltYm9saWMuICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIHJlbG9jYXRpb24gPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIGgtPnBsdC5vZmZzZXQpOwotIAkgIGJyZWFrOwotCi0JLyogcmVsb2NhdGUgYWdhaW5zdCBfU0RBX0JBU0VfICovCi0JY2FzZSAoaW50KVJfUFBDX1NEQVJFTDE2OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgIEJGRF9BU1NFUlQgKHNlYyAhPSAoYXNlY3Rpb24gKikwKTsKLQkgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpICE9IDAKLQkJJiYgc3RyY21wIChuYW1lLCAiLnNic3MiKSAhPSAwKQotCSAgICAgIHsKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogVGhlIHRhcmdldCAoJXMpIG9mIGEgJXMgcmVsb2NhdGlvbiBpcyBpbiB0aGUgd3Jvbmcgb3V0cHV0IHNlY3Rpb24gKCVzKSIpLAotCQkJCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJCSAgICAgICBzeW1fbmFtZSwKLQkJCQkgICAgICAgcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClyX3R5cGUgXS0+bmFtZSwKLQkJCQkgICAgICAgbmFtZSk7Ci0JICAgICAgfQotCSAgICBhZGRlbmQgLT0gKHNkYXRhLT5zeW1faGFzaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyBzZGF0YS0+c3ltX2hhc2gtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZGF0YS0+c3ltX2hhc2gtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICB9Ci0JICBicmVhazsKLQotCi0JLyogcmVsb2NhdGUgYWdhaW5zdCBfU0RBMl9CQVNFXyAqLwotCWNhc2UgKGludClSX1BQQ19FTUJfU0RBMlJFTDoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICBCRkRfQVNTRVJUIChzZWMgIT0gKGFzZWN0aW9uICopMCk7Ci0JICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEyIikgIT0gMCAmJiBzdHJjbXAgKG5hbWUsICIuc2JzczIiKSAhPSAwKQotCSAgICAgIHsKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogVGhlIHRhcmdldCAoJXMpIG9mIGEgJXMgcmVsb2NhdGlvbiBpcyBpbiB0aGUgd3Jvbmcgb3V0cHV0IHNlY3Rpb24gKCVzKSIpLAotCQkJCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJCSAgICAgICBzeW1fbmFtZSwKLQkJCQkgICAgICAgcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClyX3R5cGUgXS0+bmFtZSwKLQkJCQkgICAgICAgbmFtZSk7Ci0JCQotCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJcmV0ID0gZmFsc2U7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgYWRkZW5kIC09IChzZGF0YTItPnN5bV9oYXNoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIHNkYXRhMi0+c3ltX2hhc2gtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZGF0YTItPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQotCS8qIHJlbG9jYXRlIGFnYWluc3QgZWl0aGVyIF9TREFfQkFTRV8sIF9TREEyX0JBU0VfLCBvciAwICovCi0JY2FzZSAoaW50KVJfUFBDX0VNQl9TREEyMToKLQljYXNlIChpbnQpUl9QUENfRU1CX1JFTFNEQToKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgaW50IHJlZzsKLQotCSAgICBCRkRfQVNTRVJUIChzZWMgIT0gKGFzZWN0aW9uICopMCk7Ci0JICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwIHx8IHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKLQkgICAgICB7Ci0JCXJlZyA9IDEzOwotCQlhZGRlbmQgLT0gKHNkYXRhLT5zeW1faGFzaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgKyBzZGF0YS0+c3ltX2hhc2gtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyBzZGF0YS0+c3ltX2hhc2gtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgfQotCi0JICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YTIiKSA9PSAwIHx8IHN0cmNtcCAobmFtZSwgIi5zYnNzMiIpID09IDApCi0JICAgICAgewotCQlyZWcgPSAyOwotCQlhZGRlbmQgLT0gKHNkYXRhMi0+c3ltX2hhc2gtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICsgc2RhdGEyLT5zeW1faGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIHNkYXRhMi0+c3ltX2hhc2gtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgfQotCi0JICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5QUEMuRU1CLnNkYXRhMCIpID09IDAgfHwgc3RyY21wIChuYW1lLCAiLlBQQy5FTUIuc2JzczAiKSA9PSAwKQotCSAgICAgIHsKLQkJcmVnID0gMDsKLQkgICAgICB9Ci0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogVGhlIHRhcmdldCAoJXMpIG9mIGEgJXMgcmVsb2NhdGlvbiBpcyBpbiB0aGUgd3Jvbmcgb3V0cHV0IHNlY3Rpb24gKCVzKSIpLAotCQkJCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJCSAgICAgICBzeW1fbmFtZSwKLQkJCQkgICAgICAgcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClyX3R5cGUgXS0+bmFtZSwKLQkJCQkgICAgICAgbmFtZSk7Ci0KLQkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCXJldCA9IGZhbHNlOwotCQljb250aW51ZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKHJfdHlwZSA9PSBSX1BQQ19FTUJfU0RBMjEpCi0JICAgICAgewkJCS8qIGZpbGwgaW4gcmVnaXN0ZXIgZmllbGQgKi8KLQkJaW5zbiA9IGJmZF9nZXRfMzIgKG91dHB1dF9iZmQsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkJaW5zbiA9IChpbnNuICYgflJBX1JFR0lTVEVSX01BU0spIHwgKHJlZyA8PCBSQV9SRUdJU1RFUl9TSElGVCk7Ci0JCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGluc24sIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQotCS8qIFJlbG9jYXRlIGFnYWluc3QgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbiAqLwotCWNhc2UgKGludClSX1BQQ19TRUNUT0ZGOgotCWNhc2UgKGludClSX1BQQ19TRUNUT0ZGX0xPOgotCWNhc2UgKGludClSX1BQQ19TRUNUT0ZGX0hJOgotCSAgQkZEX0FTU0VSVCAoc2VjICE9IChhc2VjdGlvbiAqKTApOwotCSAgYWRkZW5kIC09IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCi0JY2FzZSAoaW50KVJfUFBDX1NFQ1RPRkZfSEE6Ci0JICBCRkRfQVNTRVJUIChzZWMgIT0gKGFzZWN0aW9uICopMCk7Ci0JICBhZGRlbmQgLT0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgYWRkZW5kICs9ICgocmVsb2NhdGlvbiArIGFkZGVuZCkgJiAweDgwMDApIDw8IDE7Ci0JICBicmVhazsKLQotCS8qIE5lZ2F0aXZlIHJlbG9jYXRpb25zICovCi0JY2FzZSAoaW50KVJfUFBDX0VNQl9OQUREUjMyOgotCWNhc2UgKGludClSX1BQQ19FTUJfTkFERFIxNjoKLQljYXNlIChpbnQpUl9QUENfRU1CX05BRERSMTZfTE86Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9OQUREUjE2X0hJOgotCSAgYWRkZW5kIC09IDIqcmVsb2NhdGlvbjsKLQkgIGJyZWFrOwotCi0JY2FzZSAoaW50KVJfUFBDX0VNQl9OQUREUjE2X0hBOgotCSAgYWRkZW5kIC09IDIqcmVsb2NhdGlvbjsKLQkgIGFkZGVuZCArPSAoKHJlbG9jYXRpb24gKyBhZGRlbmQpICYgMHg4MDAwKSA8PCAxOwotCSAgYnJlYWs7Ci0KLQkvKiBOT1AgcmVsb2NhdGlvbiB0aGF0IHByZXZlbnRzIGdhcmJhZ2UgY29sbGVjdGluZyBsaW5rZXJzIGZyb20gb21pdHRpbmcgYQotCSAgIHJlZmVyZW5jZS4gICovCi0JY2FzZSAoaW50KVJfUFBDX0VNQl9NUktSRUY6Ci0JICBjb250aW51ZTsKLQotCWNhc2UgKGludClSX1BQQ19DT1BZOgotCWNhc2UgKGludClSX1BQQ19HTE9CX0RBVDoKLQljYXNlIChpbnQpUl9QUENfSk1QX1NMT1Q6Ci0JY2FzZSAoaW50KVJfUFBDX1JFTEFUSVZFOgotCWNhc2UgKGludClSX1BQQ19QTFQzMjoKLQljYXNlIChpbnQpUl9QUENfUExUUkVMMzI6Ci0JY2FzZSAoaW50KVJfUFBDX1BMVDE2X0xPOgotCWNhc2UgKGludClSX1BQQ19QTFQxNl9ISToKLQljYXNlIChpbnQpUl9QUENfUExUMTZfSEE6Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9SRUxTRUMxNjoKLQljYXNlIChpbnQpUl9QUENfRU1CX1JFTFNUX0xPOgotCWNhc2UgKGludClSX1BQQ19FTUJfUkVMU1RfSEk6Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9SRUxTVF9IQToKLQljYXNlIChpbnQpUl9QUENfRU1CX0JJVF9GTEQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiBSZWxvY2F0aW9uICVzIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBzeW1ib2wgJXMuIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJIHBwY19lbGZfaG93dG9fdGFibGVbIChpbnQpcl90eXBlIF0tPm5hbWUsCi0JCQkJIHN5bV9uYW1lKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgIHJldCA9IGZhbHNlOwotCSAgY29udGludWU7Ci0KLQljYXNlIChpbnQpUl9QUENfR05VX1ZUSU5IRVJJVDoKLQljYXNlIChpbnQpUl9QUENfR05VX1ZURU5UUlk6Ci0JICAvKiBUaGVzZSBhcmUgbm8tb3BzIGluIHRoZSBlbmQuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0KLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXHR0eXBlID0gJXMgKCVkKSwgbmFtZSA9ICVzLCBzeW1ib2wgaW5kZXggPSAlbGQsIG9mZnNldCA9ICVsZCwgYWRkZW5kID0gJWxkXG4iLAotCSAgICAgICBob3d0by0+bmFtZSwKLQkgICAgICAgKGludClyX3R5cGUsCi0JICAgICAgIHN5bV9uYW1lLAotCSAgICAgICByX3N5bW5keCwKLQkgICAgICAgKGxvbmcpb2Zmc2V0LAotCSAgICAgICAobG9uZylhZGRlbmQpOwotI2VuZGlmCi0KLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLAotCQkJCSAgICBpbnB1dF9iZmQsCi0JCQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgIGNvbnRlbnRzLAotCQkJCSAgICBvZmZzZXQsCi0JCQkJICAgIHJlbG9jYXRpb24sCi0JCQkJICAgIGFkZGVuZCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICByZXQgPSBmYWxzZTsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaCAhPSBOVUxMKQotCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQllbHNlCi0JCSAgewotCQkgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQkgICAgc3ltLT5zdF9uYW1lKTsKLQkJICAgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0KLQkJKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KShpbmZvLAotCQkJCQkJICAgbmFtZSwKLQkJCQkJCSAgIGhvd3RvLT5uYW1lLAotCQkJCQkJICAgKGJmZF92bWEpIDAsCi0JCQkJCQkgICBpbnB1dF9iZmQsCi0JCQkJCQkgICBpbnB1dF9zZWN0aW9uLAotCQkJCQkJICAgb2Zmc2V0KTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgfQotCX0KLSAgICB9Ci0KLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0jZW5kaWYKLQotICByZXR1cm4gcmV0OwotfQotCi0MCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItcG93ZXJwY2xlIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX3Bvd2VycGNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLXBvd2VycGMiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9wb3dlcnBjCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fUFBDCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwMAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwlwcGNfZWxmX2luZm9fdG9faG93dG8KLQotI2lmZGVmICBFTV9DWUdOVVNfUE9XRVJQQwotI2RlZmluZSBFTEZfTUFDSElORV9BTFQxCUVNX0NZR05VU19QT1dFUlBDCi0jZW5kaWYKLQotI2lmZGVmIEVNX1BQQ19PTEQKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQUxUMglFTV9QUENfT0xECi0jZW5kaWYKLQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZAkxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9zeW1ib2xfb2Zmc2V0CTQKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCTEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTEyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQlQTFRfSU5JVElBTF9FTlRSWV9TSVpFCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEJcHBjX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCXBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24gICAgICAgICAgICAgcHBjX2VsZl9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCXBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwkJcHBjX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2ZpbmFsX2xpbmsJCV9iZmRfZWxmMzJfZ2NfY29tbW9uX2ZpbmFsX2xpbmsKLQotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJCXBwY19lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJCXBwY19lbGZfZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgkJcHBjX2VsZl9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCQlwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMJcHBjX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJCXBwY19lbGZfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbAlwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sJCXBwY19lbGZfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucwlwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wJcHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMJcHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCQlwcGNfZWxmX2Zha2Vfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMJcHBjX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwotI2RlZmluZSBlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAJCXBwY19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1zaC5jIGIvYmZkL2VsZjMyLXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYmUzNTIuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDU5ICswLDAgQEAKLS8qIEhpdGFjaGkgU0ggc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvc2guaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzaF9lbGZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNoX2VsZl9pZ25vcmVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqc2hfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIHNoX2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9yZWxheF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gc2hfZWxmX2FsaWduX2xvYWRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfYnl0ZSAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9zd2FwX2luc25zCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF9ieXRlICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYmZkX2J5dGUgKnNoX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAotCSAgIGJmZF9ieXRlICosIGJvb2xlYW4sIGFzeW1ib2wgKiopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgc2hfZWxmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBObyByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfU0hfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgU2V0dGluZyBwYXJ0aWFsX2lucGxhY2UgdG8gdHJ1ZSBhbmQKLSAgICAgc3JjX21hc2sgdG8gYSBub24temVybyB2YWx1ZSBpcyBzaW1pbGFyIHRvIHRoZSBDT0ZGIHRvb2xjaGFpbi4gICovCi0gIEhPV1RPIChSX1NIX0RJUjMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9ESVIzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9TSF9SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgUEMgcmVsYXRpdmUgYnJhbmNoIGRpdmlkZWQgYnkgMi4gICovCi0gIEhPV1RPIChSX1NIX0RJUjhXUE4sCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSOFdQTiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBQQyByZWxhdGl2ZSBicmFuY2ggZGl2aWRlZCBieSAyLiAgKi8KLSAgSE9XVE8gKFJfU0hfSU5EMTJXLAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9JTkQxMlciLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCB1bnNpZ25lZCBQQyByZWxhdGl2ZSBkaXZpZGVkIGJ5IDQuICAqLwotICBIT1dUTyAoUl9TSF9ESVI4V1BMLAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSOFdQTCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDggYml0IHVuc2lnbmVkIFBDIHJlbGF0aXZlIGRpdmlkZWQgYnkgMi4gICovCi0gIEhPV1RPIChSX1NIX0RJUjhXUFosCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9ESVI4V1BaIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgR0JSIHJlbGF0aXZlLiAgRklYTUU6IFRoaXMgb25seSBtYWtlcyBzZW5zZSBpZiB3ZSBoYXZlIHNvbWUKLSAgICAgc3BlY2lhbCBzeW1ib2wgZm9yIHRoZSBHQlIgcmVsYXRpdmUgYXJlYSwgYW5kIHRoYXQgaXMgbm90Ci0gICAgIGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfU0hfRElSOEJQLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0RJUjhCUCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgR0JSIHJlbGF0aXZlIGRpdmlkZWQgYnkgMi4gIEZJWE1FOiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYKLSAgICAgd2UgaGF2ZSBzb21lIHNwZWNpYWwgc3ltYm9sIGZvciB0aGUgR0JSIHJlbGF0aXZlIGFyZWEsIGFuZCB0aGF0Ci0gICAgIGlzIG5vdCBpbXBsZW1lbnRlZC4gICovCi0gIEhPV1RPIChSX1NIX0RJUjhXLAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0RJUjhXIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBHQlIgcmVsYXRpdmUgZGl2aWRlZCBieSA0LiAgRklYTUU6IFRoaXMgb25seSBtYWtlcyBzZW5zZSBpZgotICAgICB3ZSBoYXZlIHNvbWUgc3BlY2lhbCBzeW1ib2wgZm9yIHRoZSBHQlIgcmVsYXRpdmUgYXJlYSwgYW5kIHRoYXQKLSAgICAgaXMgbm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfU0hfRElSOEwsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSOEwiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIHsgMTAgfSwKLSAgeyAxMSB9LAotICB7IDEyIH0sCi0gIHsgMTMgfSwKLSAgeyAxNCB9LAotICB7IDE1IH0sCi0gIHsgMTYgfSwKLSAgeyAxNyB9LAotICB7IDE4IH0sCi0gIHsgMTkgfSwKLSAgeyAyMCB9LAotICB7IDIxIH0sCi0gIHsgMjIgfSwKLSAgeyAyMyB9LAotICB7IDI0IH0sCi0KLSAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGEgR05VIGV4dGVuc2lvbiB1c2VkIGZvciByZWxheGluZy4gIFRoZQotICAgICBmaW5hbCBwYXNzIG9mIHRoZSBsaW5rZXIgbmV2ZXIgbmVlZHMgdG8gZG8gYW55dGhpbmcgd2l0aCBhbnkgb2YKLSAgICAgdGhlc2UgcmVsb2NzLiAgQW55IHJlcXVpcmVkIG9wZXJhdGlvbnMgYXJlIGhhbmRsZWQgYnkgdGhlCi0gICAgIHJlbGF4YXRpb24gY29kZS4gICovCi0KLSAgLyogQSAxNiBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5LiAgVGhpcyBpcyBnZW5lcmF0ZWQgZm9yIGFuIGV4cHJlc3Npb24KLSAgICAgc3VjaCBhcyBgYC53b3JkIEwxIC0gTDInJy4gIFRoZSBvZmZzZXQgaG9sZHMgdGhlIGRpZmZlcmVuY2UKLSAgICAgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgTDIuICAqLwotICBIT1dUTyAoUl9TSF9TV0lUQ0gxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfU1dJVENIMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5LiAgVGhpcyBpcyBnZW5lcmF0ZWQgZm9yIGFuIGV4cHJlc3Npb24KLSAgICAgc3VjaCBhcyBgYC5sb25nIEwxIC0gTDInJy4gIFRoZSBvZmZzZXQgaG9sZHMgdGhlIGRpZmZlcmVuY2UKLSAgICAgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgTDIuICAqLwotICBIT1dUTyAoUl9TSF9TV0lUQ0gzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfU1dJVENIMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSW5kaWNhdGVzIGEgLnVzZXMgcHNldWRvLW9wLiAgVGhlIGNvbXBpbGVyIHdpbGwgZ2VuZXJhdGUgLnVzZXMKLSAgICAgcHNldWRvLW9wcyB3aGVuIGl0IGZpbmRzIGEgZnVuY3Rpb24gY2FsbCB3aGljaCBjYW4gYmUgcmVsYXhlZC4KLSAgICAgVGhlIG9mZnNldCBmaWVsZCBob2xkcyB0aGUgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIHRoZSBpbnN0cnVjdGlvbgotICAgICB3aGljaCBsb2FkcyB0aGUgcmVnaXN0ZXIgdXNlZCBpbiB0aGUgZnVuY3Rpb24gY2FsbC4gICovCi0gIEhPV1RPIChSX1NIX1VTRVMsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfVVNFUyIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIHRoaXMgcmVsb2MgZm9yIGFkZHJlc3NlcyByZWZlcnJlZCB0bwotICAgICBieSB0aGUgcmVnaXN0ZXIgbG9hZHMgYXNzb2NpYXRlZCB3aXRoIFVTRVMgcmVsb2NzLiAgVGhlIG9mZnNldAotICAgICBmaWVsZCBob2xkcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhZGRyZXNzIGlzIHJlZmVyZW5jZWQgaW4gdGhlCi0gICAgIG9iamVjdCBmaWxlLiAgKi8KLSAgSE9XVE8gKFJfU0hfQ09VTlQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfQ09VTlQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEluZGljYXRlcyBhbiBhbGlnbm1lbnQgc3RhdGVtZW50LiAgVGhlIG9mZnNldCBmaWVsZCBpcyB0aGUgcG93ZXIKLSAgICAgb2YgMiB0byB3aGljaCBzdWJzZXF1ZW50IHBvcnRpb25zIG9mIHRoZSBvYmplY3QgZmlsZSBtdXN0IGJlCi0gICAgIGFsaWduZWQuICAqLwotICBIT1dUTyAoUl9TSF9BTElHTiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9BTElHTiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgYXNzZW1ibGVyIHdpbGwgZ2VuZXJhdGUgdGhpcyByZWxvYyBiZWZvcmUgYSBibG9jayBvZgotICAgICBpbnN0cnVjdGlvbnMuICBBIHNlY3Rpb24gc2hvdWxkIGJlIHByb2Nlc3NlZCBhcyBhc3N1bWluaW5nIGl0Ci0gICAgIGNvbnRhaW5zIGRhdGEsIHVubGVzcyB0aGlzIHJlbG9jIGlzIHNlZW4uICAqLwotICBIT1dUTyAoUl9TSF9DT0RFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0NPREUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSB0aGlzIHJlbG9jIGFmdGVyIGEgYmxvY2sgb2YKLSAgICAgaW5zdHJ1Y3Rpb25zIHdoZW4gaXQgc2VlcyBkYXRhIHRoYXQgaXMgbm90IGluc3RydWN0aW9ucy4gICovCi0gIEhPV1RPIChSX1NIX0RBVEEsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfREFUQSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGFzc2VtYmxlciBnZW5lcmF0ZXMgdGhpcyByZWxvYyBmb3IgZWFjaCBsYWJlbCB3aXRoaW4gYSBibG9jawotICAgICBvZiBpbnN0cnVjdGlvbnMuICBUaGlzIHBlcm1pdHMgdGhlIGxpbmtlciB0byBhdm9pZCBzd2FwcGluZwotICAgICBpbnN0cnVjdGlvbnMgd2hpY2ggYXJlIHRoZSB0YXJnZXRzIG9mIGJyYW5jaGVzLiAgKi8KLSAgSE9XVE8gKFJfU0hfTEFCRUwsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfTEFCRUwiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIDggYml0IHN3aXRjaCB0YWJsZSBlbnRyeS4gIFRoaXMgaXMgZ2VuZXJhdGVkIGZvciBhbiBleHByZXNzaW9uCi0gICAgIHN1Y2ggYXMgYGAud29yZCBMMSAtIEwyJycuICBUaGUgb2Zmc2V0IGhvbGRzIHRoZSBkaWZmZXJlbmNlCi0gICAgIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kIEwyLiAgKi8KLSAgSE9XVE8gKFJfU0hfU1dJVENIOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9TV0lUQ0g4IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX1NIX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX1NIX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9TSF9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfU0hfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG5vcm1hbCByZWxvY3MuICBUaGlzIGlzIGxpa2UgdGhlIENPRkYKLSAgIGZ1bmN0aW9uLCBhbmQgaXMgYWxtb3N0IGNlcnRhaW5seSBpbmNvcnJlY3QgZm9yIG90aGVyIEVMRiB0YXJnZXRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc2hfZWxmX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgYmZkX3ZtYSBzeW1fdmFsdWU7Ci0gIGVudW0gZWxmX3NoX3JlbG9jX3R5cGUgcl90eXBlOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgYmZkX2J5dGUgKmhpdF9kYXRhID0gYWRkciArIChiZmRfYnl0ZSAqKSBkYXRhOwotCi0gIHJfdHlwZSA9IChlbnVtIGVsZl9zaF9yZWxvY190eXBlKSByZWxvY19lbnRyeS0+aG93dG8tPnR5cGU7Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBQYXJ0aWFsIGxpbmtpbmctLWRvIG5vdGhpbmcuICAqLwotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIEFsbW9zdCBhbGwgcmVsb2NzIGhhdmUgdG8gZG8gd2l0aCByZWxheGluZy4gIElmIGFueSB3b3JrIG11c3QgYmUKLSAgICAgZG9uZSBmb3IgdGhlbSwgaXQgaGFzIGJlZW4gZG9uZSBpbiBzaF9yZWxheF9zZWN0aW9uLiAgKi8KLSAgaWYgKHJfdHlwZSAhPSBSX1NIX0RJUjMyCi0gICAgICAmJiAocl90eXBlICE9IFJfU0hfSU5EMTJXCi0JICB8fCAoc3ltYm9sX2luLT5mbGFncyAmIEJTRl9MT0NBTCkgIT0gMCkpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICBpZiAoc3ltYm9sX2luICE9IE5VTEwKLSAgICAgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX2luLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQotICAgIHN5bV92YWx1ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGVsc2UgCi0gICAgc3ltX3ZhbHVlID0gKHN5bWJvbF9pbi0+dmFsdWUgKwotCQkgc3ltYm9sX2luLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQkJIHN5bWJvbF9pbi0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9TSF9ESVIzMjoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBoaXRfZGF0YSk7Ci0gICAgICBpbnNuICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfU0hfSU5EMTJXOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGhpdF9kYXRhKTsKLSAgICAgIHN5bV92YWx1ZSArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgICAgc3ltX3ZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICAgICsgYWRkcgotCQkgICAgKyA0KTsKLSAgICAgIHN5bV92YWx1ZSArPSAoaW5zbiAmIDB4ZmZmKSA8PCAxOwotICAgICAgaWYgKGluc24gJiAweDgwMCkKLQlzeW1fdmFsdWUgLT0gMHgxMDAwOwotICAgICAgaW5zbiA9IChpbnNuICYgMHhmMDAwKSB8IChzeW1fdmFsdWUgJiAweGZmZik7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBpZiAoc3ltX3ZhbHVlIDwgKGJmZF92bWEpIC0weDEwMDAgfHwgc3ltX3ZhbHVlID49IDB4MTAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgcmVsb2NzIHdoaWNoIGFyZSBvbmx5IHVzZWQgZm9yIHJlbGF4aW5nLAotICAgd2hpY2ggdGhlIGxpbmtlciBzaG91bGQgb3RoZXJ3aXNlIGlnbm9yZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNoX2VsZl9pZ25vcmVfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtYXAgQkZEIHJlbG9jIGNvZGVzIHRvIFNIIEVMRiByZWxvY3MuICAqLwotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotLyogQW4gYXJyYXkgbWFwcGluZyBCRkQgcmVsb2MgY29kZXMgdG8gU0ggRUxGIHJlbG9jcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBzaF9yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfU0hfTk9ORSB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9TSF9ESVIzMiB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSX1NIX0RJUjMyIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMLCBSX1NIX1JFTDMyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIsIFJfU0hfRElSOFdQTiB9LAotICB7IEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMiwgUl9TSF9JTkQxMlcgfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyLCBSX1NIX0RJUjhXUFogfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0LCBSX1NIX0RJUjhXUEwgfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9TSF9TV0lUQ0g4IH0sCi0gIHsgQkZEX1JFTE9DX1NIX1NXSVRDSDE2LCBSX1NIX1NXSVRDSDE2IH0sCi0gIHsgQkZEX1JFTE9DX1NIX1NXSVRDSDMyLCBSX1NIX1NXSVRDSDMyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1VTRVMsIFJfU0hfVVNFUyB9LAotICB7IEJGRF9SRUxPQ19TSF9DT1VOVCwgUl9TSF9DT1VOVCB9LAotICB7IEJGRF9SRUxPQ19TSF9BTElHTiwgUl9TSF9BTElHTiB9LAotICB7IEJGRF9SRUxPQ19TSF9DT0RFLCBSX1NIX0NPREUgfSwKLSAgeyBCRkRfUkVMT0NfU0hfREFUQSwgUl9TSF9EQVRBIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0xBQkVMLCBSX1NIX0xBQkVMIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX1NIX0dOVV9WVElOSEVSSVQgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCBSX1NIX0dOVV9WVEVOVFJZIH0sCi19OwotCi0vKiBHaXZlbiBhIEJGRCByZWxvYyBjb2RlLCByZXR1cm4gdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgdGhlCi0gICBjb3JyZXNwb25kaW5nIFNIIEVMZiByZWxvYy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXNoX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc2hfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOyBpKyspCi0gICAgewotICAgICAgaWYgKHNoX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZzaF9lbGZfaG93dG9fdGFibGVbKGludCkgc2hfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogR2l2ZW4gYW4gRUxGIHJlbG9jLCBmaWxsIGluIHRoZSBob3d0byBmaWVsZCBvZiBhIHJlbGVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zaF9lbGZfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcjsKLQotICByID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAociA8ICh1bnNpZ25lZCBpbnQpIFJfU0hfbWF4KTsKLSAgQkZEX0FTU0VSVCAociA8IFJfU0hfRklSU1RfSU5WQUxJRF9SRUxPQyB8fCByID4gUl9TSF9MQVNUX0lOVkFMSURfUkVMT0MpOwotCi0gIGNhY2hlX3B0ci0+aG93dG8gPSAmc2hfZWxmX2hvd3RvX3RhYmxlW3JdOwotfQotDAotLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlbGF4aW5nIGZvciBTSCBFTEYuICBTZWUgdGhlIGNvcnJlc3BvbmRpbmcKLSAgIGZ1bmN0aW9uIGluIGNvZmYtc2guYyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoaXMgZG9lcy4gIEZJWE1FOgotICAgVGhlcmUgaXMgYSBsb3Qgb2YgZHVwbGljYXRpb24gaGVyZSBiZXR3ZWVuIHRoaXMgY29kZSBhbmQgdGhlIENPRkYKLSAgIHNwZWNpZmljIGNvZGUuICBUaGUgZm9ybWF0IG9mIHJlbG9jcyBhbmQgc3ltYm9scyBpcyB3b3VuZCBkZWVwbHkKLSAgIGludG8gdGhpcyBjb2RlLCBidXQgaXQgd291bGQgc3RpbGwgYmUgYmV0dGVyIGlmIHRoZSBkdXBsaWNhdGlvbgotICAgY291bGQgYmUgZWxpbWluYXRlZCBzb21laG93LiAgTm90ZSBpbiBwYXJ0aWN1bGFyIHRoYXQgYWx0aG91Z2ggYm90aAotICAgZnVuY3Rpb25zIHVzZSBzeW1ib2xzIGxpa2UgUl9TSF9DT0RFLCB0aG9zZSBzeW1ib2xzIGhhdmUgZGlmZmVyZW50Ci0gICB2YWx1ZXM7IGluIGNvZmYtc2guYyB0aGV5IGNvbWUgZnJvbSBpbmNsdWRlL2NvZmYvc2guaCwgd2hlcmVhcyBoZXJlCi0gICB0aGV5IGNvbWUgZnJvbSBlbnVtIGVsZl9zaF9yZWxvY190eXBlIGluIGluY2x1ZGUvZWxmL3NoLmguICAqLwotCi1zdGF0aWMgYm9vbGVhbiAKLXNoX2VsZl9yZWxheF9zZWN0aW9uIChhYmZkLCBzZWMsIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBib29sZWFuIGhhdmVfY29kZTsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltcyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZnJlZV9leHRzeW1zID0gTlVMTDsKLQotICAqYWdhaW4gPSBmYWxzZTsKLQotICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0gICAgICB8fCBzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCi0gICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0KLSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkgICAgIChhYmZkLCBzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQotICBoYXZlX2NvZGUgPSBmYWxzZTsKLQotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgbGFkZHIsIHBhZGRyLCBzeW12YWw7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBpbnNuOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxmbiwgKmlyZWxzY2FuLCAqaXJlbGNvdW50OwotICAgICAgYmZkX3NpZ25lZF92bWEgZm9mZjsKLQotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0NPREUpCi0JaGF2ZV9jb2RlID0gdHJ1ZTsKLQotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX1VTRVMpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkgICAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRoZSByX2FkZGVuZCBmaWVsZCBvZiB0aGUgUl9TSF9VU0VTIHJlbG9jIHdpbGwgcG9pbnQgdXMgdG8KLSAgICAgICAgIHRoZSByZWdpc3RlciBsb2FkLiAgVGhlIDQgaXMgYmVjYXVzZSB0aGUgcl9hZGRlbmQgZmllbGQgaXMKLSAgICAgICAgIGNvbXB1dGVkIGFzIHRob3VnaCBpdCB3ZXJlIGEganVtcCBvZmZzZXQsIHdoaWNoIGFyZSBiYXNlZAotICAgICAgICAgZnJvbSA0IGJ5dGVzIGFmdGVyIHRoZSBqdW1wIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGxhZGRyID0gaXJlbC0+cl9vZmZzZXQgKyA0ICsgaXJlbC0+cl9hZGRlbmQ7Ci0gICAgICBpZiAobGFkZHIgPj0gc2VjLT5fcmF3X3NpemUpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgb2Zmc2V0IiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJCSAodW5zaWduZWQgbG9uZykgaXJlbC0+cl9vZmZzZXQpOwotCSAgY29udGludWU7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgbGFkZHIpOwotCi0gICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90IG1vdi5sIE5OLHJOLCB3ZSBkb24ndCBrbm93IHdoYXQgdG8KLSAgICAgICAgIGRvLiAgKi8KLSAgICAgIGlmICgoaW5zbiAmIDB4ZjAwMCkgIT0gMHhkMDAwKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoXygiJXM6IDB4JWx4OiB3YXJuaW5nOiBSX1NIX1VTRVMgcG9pbnRzIHRvIHVucmVjb2duaXplZCBpbnNuIDB4JXgiKSwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX29mZnNldCwgaW5zbikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3MgZnJvbSB3aGljaCB0aGUgcmVnaXN0ZXIgaXMgYmVpbmcgbG9hZGVkLiAgVGhlCi0gICAgICAJIGRpc3BsYWNlbWVudCBpbiB0aGUgbW92LmwgaW5zdHJ1Y3Rpb24gaXMgcXVhZHJ1cGxlZC4gIEl0IGlzIGEKLSAgICAgIAkgZGlzcGxhY2VtZW50IGZyb20gZm91ciBieXRlcyBhZnRlciB0aGUgbW92bCBpbnN0cnVjdGlvbiwgYnV0LAotICAgICAgCSBiZWZvcmUgYWRkaW5nIGluIHRoZSBQQyBhZGRyZXNzLCB0d28gbGVhc3Qgc2lnbmlmaWNhbnQgYml0cwotICAgICAgCSBvZiB0aGUgUEMgYXJlIGNsZWFyZWQuICBXZSBhc3N1bWUgdGhhdCB0aGUgc2VjdGlvbiBpcyBhbGlnbmVkCi0gICAgICAJIG9uIGEgZm91ciBieXRlIGJvdW5kYXJ5LiAgKi8KLSAgICAgIHBhZGRyID0gaW5zbiAmIDB4ZmY7Ci0gICAgICBwYWRkciAqPSA0OwotICAgICAgcGFkZHIgKz0gKGxhZGRyICsgNCkgJn4gMzsKLSAgICAgIGlmIChwYWRkciA+PSBzZWMtPl9yYXdfc2l6ZSkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKF8oIiVzOiAweCVseDogd2FybmluZzogYmFkIFJfU0hfVVNFUyBsb2FkIG9mZnNldCIpLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfb2Zmc2V0KSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgcmVsb2MgZm9yIHRoZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIHJlZ2lzdGVyIGlzCi0gICAgICAgICBiZWluZyBsb2FkZWQuICBUaGlzIHJlbG9jIHdpbGwgdGVsbCB1cyB3aGljaCBmdW5jdGlvbiBpcwotICAgICAgICAgYWN0dWFsbHkgYmVpbmcgY2FsbGVkLiAgKi8KLSAgICAgIGZvciAoaXJlbGZuID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsZm4gPCBpcmVsZW5kOyBpcmVsZm4rKykKLQlpZiAoaXJlbGZuLT5yX29mZnNldCA9PSBwYWRkcgotCSAgICAmJiBFTEYzMl9SX1RZUEUgKGlyZWxmbi0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0RJUjMyKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbGZuID49IGlyZWxlbmQpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgIChfKCIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIHJlbG9jIiksCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQl7Ci0JICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQkgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0JICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkJICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCi0JCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9TWU0gKGlyZWxmbi0+cl9pbmZvKSA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0JICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbGZuLT5yX2luZm8pLAotCQkJCSAgICAmaXN5bSk7Ci0KLQkgIGlmIChpc3ltLnN0X3NobmR4ICE9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKSkKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiAweCVseDogd2FybmluZzogc3ltYm9sIGluIHVuZXhwZWN0ZWQgc2VjdGlvbiIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc3ltdmFsID0gKGlzeW0uc3RfdmFsdWUKLQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBpbmR4ID0gRUxGMzJfUl9TWU0gKGlyZWxmbi0+cl9pbmZvKSAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZHhdOwotCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQkgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgYXBwZWFycyB0byBiZSBhIHJlZmVyZW5jZSB0byBhbiB1bmRlZmluZWQKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgSnVzdCBpZ25vcmUgaXQtLWl0IHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZQotICAgICAgICAgICAgICAgICByZWd1bGFyIHJlbG9jIHByb2Nlc3NpbmcuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIHN5bXZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCX0KLQotICAgICAgc3ltdmFsICs9IGJmZF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzICsgcGFkZHIpOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBmdW5jdGlvbiBjYWxsIGNhbiBiZSBzaG9ydGVuZWQuICAqLwotICAgICAgZm9mZiA9IChzeW12YWwKLQkgICAgICAtIChpcmVsLT5yX29mZnNldAotCQkgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIDQpKTsKLSAgICAgIGlmIChmb2ZmIDwgLTB4MTAwMCB8fCBmb2ZmID49IDB4MTAwMCkKLQl7Ci0JICAvKiBBZnRlciBhbGwgdGhhdCB3b3JrLCB3ZSBjYW4ndCBzaG9ydGVuIHRoaXMgZnVuY3Rpb24gY2FsbC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFNob3J0ZW4gdGhlIGZ1bmN0aW9uIGNhbGwuICAqLwotCi0gICAgICAvKiBGb3Igc2ltcGxpY2l0eSBvZiBjb2RpbmcsIHdlIGFyZSBnb2luZyB0byBtb2RpZnkgdGhlIHNlY3Rpb24KLQkgY29udGVudHMsIHRoZSBzZWN0aW9uIHJlbG9jcywgYW5kIHRoZSBCRkQgc3ltYm9sIHRhYmxlLiAgV2UKLQkgbXVzdCB0ZWxsIHRoZSByZXN0IG9mIHRoZSBjb2RlIG5vdCB0byBmcmVlIHVwIHRoaXMKLQkgaW5mb3JtYXRpb24uICBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBpbnN0ZWFkIGNyZWF0ZSBhIHRhYmxlCi0JIG9mIGNoYW5nZXMgd2hpY2ggaGF2ZSB0byBiZSBtYWRlLCBhcyBpcyBkb25lIGluIGNvZmYtbWlwcy5jOwotCSB0aGF0IHdvdWxkIGJlIG1vcmUgd29yaywgYnV0IHdvdWxkIHJlcXVpcmUgbGVzcyBtZW1vcnkgd2hlbgotCSB0aGUgbGlua2VyIGlzIHJ1bi4gICovCi0KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0gICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotICAgICAgLyogUmVwbGFjZSB0aGUganNyIHdpdGggYSBic3IuICAqLwotCi0gICAgICAvKiBDaGFuZ2UgdGhlIFJfU0hfVVNFUyByZWxvYyBpbnRvIGFuIFJfU0hfSU5EMTJXIHJlbG9jLCBhbmQKLSAgICAgICAgIHJlcGxhY2UgdGhlIGpzciB3aXRoIGEgYnNyLiAgKi8KLSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWxmbi0+cl9pbmZvKSwgUl9TSF9JTkQxMlcpOwotICAgICAgaWYgKEVMRjMyX1JfU1lNIChpcmVsZm4tPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIC8qIElmIHRoaXMgbmVlZHMgdG8gYmUgY2hhbmdlZCBiZWNhdXNlIG9mIGZ1dHVyZSByZWxheGluZywKLSAgICAgICAgICAgICBpdCB3aWxsIGJlIGhhbmRsZWQgaGVyZSBsaWtlIG90aGVyIGludGVybmFsIElORDEyVwotICAgICAgICAgICAgIHJlbG9jcy4gICovCi0JICBiZmRfcHV0XzE2IChhYmZkLAotCQkgICAgICAweGIwMDAgfCAoKGZvZmYgPj4gMSkgJiAweGZmZiksCi0JCSAgICAgIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBjYW4ndCBmdWxseSByZXNvbHZlIHRoaXMgeWV0LCBiZWNhdXNlIHRoZSBleHRlcm5hbAotICAgICAgICAgICAgIHN5bWJvbCB2YWx1ZSBtYXkgYmUgY2hhbmdlZCBieSBmdXR1cmUgcmVsYXhpbmcuICBXZSBsZXQKLSAgICAgICAgICAgICB0aGUgZmluYWwgbGluayBwaGFzZSBoYW5kbGUgaXQuICAqLwotCSAgYmZkX3B1dF8xNiAoYWJmZCwgMHhiMDAwLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGVyZSBpcyBhbm90aGVyIFJfU0hfVVNFUyByZWxvYyByZWZlcnJpbmcgdG8gdGhlIHNhbWUKLSAgICAgICAgIHJlZ2lzdGVyIGxvYWQuICAqLwotICAgICAgZm9yIChpcmVsc2NhbiA9IGludGVybmFsX3JlbG9jczsgaXJlbHNjYW4gPCBpcmVsZW5kOyBpcmVsc2NhbisrKQotCWlmIChFTEYzMl9SX1RZUEUgKGlyZWxzY2FuLT5yX2luZm8pID09IChpbnQpIFJfU0hfVVNFUwotCSAgICAmJiBsYWRkciA9PSBpcmVsc2Nhbi0+cl9vZmZzZXQgKyA0ICsgaXJlbHNjYW4tPnJfYWRkZW5kKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbHNjYW4gPCBpcmVsZW5kKQotCXsKLQkgIC8qIFNvbWUgb3RoZXIgZnVuY3Rpb24gY2FsbCBkZXBlbmRzIHVwb24gdGhpcyByZWdpc3RlciBsb2FkLAotCSAgICAgYW5kIHdlIGhhdmUgbm90IHlldCBjb252ZXJ0ZWQgdGhhdCBmdW5jdGlvbiBjYWxsLgotCSAgICAgSW5kZWVkLCB3ZSBtYXkgbmV2ZXIgYmUgYWJsZSB0byBjb252ZXJ0IGl0LiAgVGhlcmUgaXMKLQkgICAgIG5vdGhpbmcgZWxzZSB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIExvb2sgZm9yIGEgUl9TSF9DT1VOVCByZWxvYyBvbiB0aGUgbG9jYXRpb24gd2hlcmUgdGhlCi0gICAgICAgICBmdW5jdGlvbiBhZGRyZXNzIGlzIHN0b3JlZC4gIERvIHRoaXMgYmVmb3JlIGRlbGV0aW5nIGFueQotICAgICAgICAgYnl0ZXMsIHRvIGF2b2lkIGNvbmZ1c2lvbiBhYm91dCB0aGUgYWRkcmVzcy4gICovCi0gICAgICBmb3IgKGlyZWxjb3VudCA9IGludGVybmFsX3JlbG9jczsgaXJlbGNvdW50IDwgaXJlbGVuZDsgaXJlbGNvdW50KyspCi0JaWYgKGlyZWxjb3VudC0+cl9vZmZzZXQgPT0gcGFkZHIKLQkgICAgJiYgRUxGMzJfUl9UWVBFIChpcmVsY291bnQtPnJfaW5mbykgPT0gKGludCkgUl9TSF9DT1VOVCkKLQkgIGJyZWFrOwotCi0gICAgICAvKiBEZWxldGUgdGhlIHJlZ2lzdGVyIGxvYWQuICAqLwotICAgICAgaWYgKCEgc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBsYWRkciwgMikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywganVzdCBpbiBjYXNlIGl0IHBlcm1pdHMgc29tZQotICAgICAgICAgb3RoZXIgZnVuY3Rpb24gY2FsbCB0byBjb21lIHdpdGhpbiByYW5nZSwgd2Ugc2hvdWxkIHJlbGF4Ci0gICAgICAgICBhZ2Fpbi4gIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLSAgICAgICphZ2FpbiA9IHRydWU7Ci0KLSAgICAgIC8qIE5vdyBjaGVjayB3aGV0aGVyIHdlIGdvdCBhIENPVU5UIHJlbG9jLiAgKi8KLSAgICAgIGlmIChpcmVsY291bnQgPj0gaXJlbGVuZCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKF8oIiVzOiAweCVseDogd2FybmluZzogY291bGQgbm90IGZpbmQgZXhwZWN0ZWQgQ09VTlQgcmVsb2MiKSwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGUgbnVtYmVyIG9mIHVzZXMgaXMgc3RvcmVkIGluIHRoZSByX2FkZGVuZCBmaWVsZC4gIFdlJ3ZlCi0gICAgICAgICBqdXN0IGRlbGV0ZWQgb25lLiAgKi8KLSAgICAgIGlmIChpcmVsY291bnQtPnJfYWRkZW5kID09IDApCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgY291bnQiKSwKLQkJCQkgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJCSAgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC0taXJlbGNvdW50LT5yX2FkZGVuZDsKLQotICAgICAgLyogSWYgdGhlcmUgYXJlIG5vIG1vcmUgdXNlcywgd2UgY2FuIGRlbGV0ZSB0aGUgYWRkcmVzcy4gIFJlbG9hZAotICAgICAgICAgdGhlIGFkZHJlc3MgZnJvbSBpcmVsZm4sIGluIGNhc2UgaXQgd2FzIGNoYW5nZWQgYnkgdGhlCi0gICAgICAgICBwcmV2aW91cyBjYWxsIHRvIHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMuICAqLwotICAgICAgaWYgKGlyZWxjb3VudC0+cl9hZGRlbmQgPT0gMCkKLQl7Ci0JICBpZiAoISBzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGlyZWxmbi0+cl9vZmZzZXQsIDQpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIC8qIFdlJ3ZlIGRvbmUgYWxsIHdlIGNhbiB3aXRoIHRoYXQgZnVuY3Rpb24gY2FsbC4gICovCi0gICAgfQotCi0gIC8qIExvb2sgZm9yIGxvYWQgYW5kIHN0b3JlIGluc3RydWN0aW9ucyB0aGF0IHdlIGNhbiBhbGlnbiBvbiBmb3VyCi0gICAgIGJ5dGUgYm91bmRhcmllcy4gICovCi0gIGlmIChoYXZlX2NvZGUpCi0gICAgewotICAgICAgYm9vbGVhbiBzd2FwcGVkOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISBzaF9lbGZfYWxpZ25fbG9hZHMgKGFiZmQsIHNlYywgaW50ZXJuYWxfcmVsb2NzLCBjb250ZW50cywKLQkJCQkmc3dhcHBlZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChzd2FwcGVkKQotCXsKLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQl9Ci0gICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKLQl9Ci0gICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBEZWxldGUgc29tZSBieXRlcyBmcm9tIGEgc2VjdGlvbiB3aGlsZSByZWxheGluZy4gIEZJWE1FOiBUaGVyZSBpcyBhCi0gICBsb3Qgb2YgZHVwbGljYXRpb24gYmV0d2VlbiB0aGlzIGZ1bmN0aW9uIGFuZCBzaF9yZWxheF9kZWxldGVfYnl0ZXMKLSAgIGluIGNvZmYtc2guYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFkZHIsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgaW50IGNvdW50OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOwotICBpbnQgc2huZHgsIGluZGV4OwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhbGlnbjsKLSAgYmZkX3ZtYSB0b2FkZHI7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpzeW1faGFzaDsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQotICBzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKTsKLQotICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCi0gIC8qIFRoZSBkZWxldGlvbiBtdXN0IHN0b3AgYXQgdGhlIG5leHQgQUxJR04gcmVsb2MgZm9yIGFuIGFsaWdtZW50Ci0gICAgIHBvd2VyIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgYXJlIGRlbGV0aW5nLiAgKi8KLQotICBpcmVsYWxpZ24gPSBOVUxMOwotICB0b2FkZHIgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotICBpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOwotICBpcmVsZW5kID0gaXJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9BTElHTgotCSAgJiYgaXJlbC0+cl9vZmZzZXQgPiBhZGRyCi0JICAmJiBjb3VudCA8ICgxIDw8IGlyZWwtPnJfYWRkZW5kKSkKLQl7Ci0JICBpcmVsYWxpZ24gPSBpcmVsOwotCSAgdG9hZGRyID0gaXJlbC0+cl9vZmZzZXQ7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLwotICBtZW1tb3ZlIChjb250ZW50cyArIGFkZHIsIGNvbnRlbnRzICsgYWRkciArIGNvdW50LCB0b2FkZHIgLSBhZGRyIC0gY291bnQpOwotICBpZiAoaXJlbGFsaWduID09IE5VTEwpCi0gICAgc2VjLT5fY29va2VkX3NpemUgLT0gY291bnQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotI2RlZmluZSBOT1BfT1BDT0RFICgweDAwMDkpCi0KLSAgICAgIEJGRF9BU1NFUlQgKChjb3VudCAmIDEpID09IDApOwotICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpICs9IDIpCi0JYmZkX3B1dF8xNiAoYWJmZCwgTk9QX09QQ09ERSwgY29udGVudHMgKyB0b2FkZHIgLSBjb3VudCArIGkpOwotICAgIH0KLQotICAvKiBBZGp1c3QgYWxsIHRoZSByZWxvY3MuICAqLwotICBmb3IgKGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBucmFkZHIsIHN0b3A7Ci0gICAgICBiZmRfdm1hIHN0YXJ0ID0gMDsKLSAgICAgIGludCBpbnNuID0gMDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgaW50IG9mZiwgYWRqdXN0LCBvaW5zbjsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHZvZmYgPSAwOwotICAgICAgYm9vbGVhbiBvdmVyZmxvdzsKLQotICAgICAgLyogR2V0IHRoZSBuZXcgcmVsb2MgYWRkcmVzcy4gICovCi0gICAgICBucmFkZHIgPSBpcmVsLT5yX29mZnNldDsKLSAgICAgIGlmICgoaXJlbC0+cl9vZmZzZXQgPiBhZGRyCi0JICAgJiYgaXJlbC0+cl9vZmZzZXQgPCB0b2FkZHIpCi0JICB8fCAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfQUxJR04KLQkgICAgICAmJiBpcmVsLT5yX29mZnNldCA9PSB0b2FkZHIpKQotCW5yYWRkciAtPSBjb3VudDsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgcmVsb2Mgd2FzIGZvciB0aGUgYnl0ZXMgd2UgaGF2ZSBkZWxldGVkLCBpbiB3aGljaAotCSBjYXNlIHdlIG5vIGxvbmdlciBjYXJlIGFib3V0IGl0LiAgRG9uJ3QgZGVsZXRlIHJlbG9jcyB3aGljaAotCSByZXByZXNlbnQgYWRkcmVzc2VzLCB0aG91Z2guICAqLwotICAgICAgaWYgKGlyZWwtPnJfb2Zmc2V0ID49IGFkZHIKLQkgICYmIGlyZWwtPnJfb2Zmc2V0IDwgYWRkciArIGNvdW50Ci0JICAmJiBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgIT0gKGludCkgUl9TSF9BTElHTgotCSAgJiYgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfQ09ERQotCSAgJiYgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfREFUQQotCSAgJiYgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfTEFCRUwpCi0JaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkgICAgIChpbnQpIFJfU0hfTk9ORSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywgc2VlIGlmIHRoZSByYW5nZSBpdCBjb3ZlcnMKLSAgICAgICAgIGluY2x1ZGVzIHRoZSBieXRlcyB3ZSBoYXZlIGRlbGV0ZWQuICAqLwotICAgICAgc3dpdGNoICgoZW51bSBlbGZfc2hfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pKQotCXsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfRElSOFdQTjoKLQljYXNlIFJfU0hfSU5EMTJXOgotCWNhc2UgUl9TSF9ESVI4V1BaOgotCWNhc2UgUl9TSF9ESVI4V1BMOgotCSAgc3RhcnQgPSBpcmVsLT5yX29mZnNldDsKLQkgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoKGVudW0gZWxmX3NoX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIHN0YXJ0ID0gc3RvcCA9IGFkZHI7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9ESVIzMjoKLQkgIC8qIElmIHRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIGluIHRoaXMKLSAgICAgICAgICAgICBzZWN0aW9uLCBhbmQgdGhlIHN5bWJvbCB3aWxsIG5vdCBiZSBhZGp1c3RlZCBiZWxvdywgd2UKLSAgICAgICAgICAgICBtdXN0IGNoZWNrIHRoZSBhZGRlbmQgdG8gc2VlIGl0IHdpbGwgcHV0IHRoZSB2YWx1ZSBpbgotICAgICAgICAgICAgIHJhbmdlIHRvIGJlIGFkanVzdGVkLCBhbmQgaGVuY2UgbXVzdCBiZSBjaGFuZ2VkLiAgKi8KLQkgIGlmIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJCWV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJJnN5bSk7Ci0JICAgICAgaWYgKHN5bS5zdF9zaG5keCA9PSBzaG5keAotCQkgICYmIChzeW0uc3RfdmFsdWUgPD0gYWRkcgotCQkgICAgICB8fCBzeW0uc3RfdmFsdWUgPj0gdG9hZGRyKSkKLQkJewotCQkgIGJmZF92bWEgdmFsOwotCi0JCSAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCQkgIHZhbCArPSBzeW0uc3RfdmFsdWU7Ci0JCSAgaWYgKHZhbCA+IGFkZHIgJiYgdmFsIDwgdG9hZGRyKQotCQkgICAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsIC0gY291bnQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkJfQotCSAgICB9Ci0JICBzdGFydCA9IHN0b3AgPSBhZGRyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfRElSOFdQTjoKLQkgIG9mZiA9IGluc24gJiAweGZmOwotCSAgaWYgKG9mZiAmIDB4ODApCi0JICAgIG9mZiAtPSAweDEwMDsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyA0ICsgb2ZmICogMik7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9JTkQxMlc6Ci0JICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgc3RhcnQgPSBzdG9wID0gYWRkcjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG9mZiA9IGluc24gJiAweGZmZjsKLQkgICAgICBpZiAob2ZmICYgMHg4MDApCi0JCW9mZiAtPSAweDEwMDA7Ci0JICAgICAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIDQgKyBvZmYgKiAyKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfRElSOFdQWjoKLQkgIG9mZiA9IGluc24gJiAweGZmOwotCSAgc3RvcCA9IHN0YXJ0ICsgNCArIG9mZiAqIDI7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9ESVI4V1BMOgotCSAgb2ZmID0gaW5zbiAmIDB4ZmY7Ci0JICBzdG9wID0gKHN0YXJ0ICZ+IChiZmRfdm1hKSAzKSArIDQgKyBvZmYgKiA0OwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfU1dJVENIODoKLQljYXNlIFJfU0hfU1dJVENIMTY6Ci0JY2FzZSBSX1NIX1NXSVRDSDMyOgotCSAgLyogVGhlc2UgcmVsb2NzIHR5cGVzIHJlcHJlc2VudAotCSAgICAgICAud29yZCBMMi1MMQotCSAgICAgVGhlIHJfb2Zmc2V0IGZpZWxkIGhvbGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jCi0JICAgICBhZGRyZXNzIGFuZCBMMS4gIFRoYXQgaXMgdGhlIHN0YXJ0IG9mIHRoZSByZWxvYywgYW5kCi0JICAgICBhZGRpbmcgaW4gdGhlIGNvbnRlbnRzIGdpdmVzIHVzIHRoZSB0b3AuICBXZSBtdXN0IGFkanVzdAotCSAgICAgYm90aCB0aGUgcl9vZmZzZXQgZmllbGQgYW5kIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLQotCSAgc3RhcnQgPSBpcmVsLT5yX29mZnNldDsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgLSAobG9uZykgaXJlbC0+cl9hZGRlbmQpOwotCi0JICBpZiAoc3RhcnQgPiBhZGRyCi0JICAgICAgJiYgc3RhcnQgPCB0b2FkZHIKLQkgICAgICAmJiAoc3RvcCA8PSBhZGRyIHx8IHN0b3AgPj0gdG9hZGRyKSkKLQkgICAgaXJlbC0+cl9hZGRlbmQgKz0gY291bnQ7Ci0JICBlbHNlIGlmIChzdG9wID4gYWRkcgotCQkgICAmJiBzdG9wIDwgdG9hZGRyCi0JCSAgICYmIChzdGFydCA8PSBhZGRyIHx8IHN0YXJ0ID49IHRvYWRkcikpCi0JICAgIGlyZWwtPnJfYWRkZW5kIC09IGNvdW50OwotCi0JICBzdGFydCA9IHN0b3A7Ci0KLQkgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9TV0lUQ0gxNikKLQkgICAgdm9mZiA9IGJmZF9nZXRfc2lnbmVkXzE2IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBlbHNlIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9TV0lUQ0g4KQotCSAgICB2b2ZmID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBlbHNlCi0JICAgIHZvZmYgPSBiZmRfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIHZvZmYpOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9TSF9VU0VTOgotCSAgc3RhcnQgPSBpcmVsLT5yX29mZnNldDsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQKLQkJCSAgICArIChsb25nKSBpcmVsLT5yX2FkZGVuZAotCQkJICAgICsgNCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChzdGFydCA+IGFkZHIKLQkgICYmIHN0YXJ0IDwgdG9hZGRyCi0JICAmJiAoc3RvcCA8PSBhZGRyIHx8IHN0b3AgPj0gdG9hZGRyKSkKLQlhZGp1c3QgPSBjb3VudDsKLSAgICAgIGVsc2UgaWYgKHN0b3AgPiBhZGRyCi0JICAgICAgICYmIHN0b3AgPCB0b2FkZHIKLQkgICAgICAgJiYgKHN0YXJ0IDw9IGFkZHIgfHwgc3RhcnQgPj0gdG9hZGRyKSkKLQlhZGp1c3QgPSAtIGNvdW50OwotICAgICAgZWxzZQotCWFkanVzdCA9IDA7Ci0KLSAgICAgIGlmIChhZGp1c3QgIT0gMCkKLQl7Ci0JICBvaW5zbiA9IGluc247Ci0JICBvdmVyZmxvdyA9IGZhbHNlOwotCSAgc3dpdGNoICgoZW51bSBlbGZfc2hfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX0RJUjhXUE46Ci0JICAgIGNhc2UgUl9TSF9ESVI4V1BaOgotCSAgICAgIGluc24gKz0gYWRqdXN0IC8gMjsKLQkgICAgICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX0lORDEyVzoKLQkgICAgICBpbnNuICs9IGFkanVzdCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZjAwMCkgIT0gKGluc24gJiAweGYwMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9ESVI4V1BMOgotCSAgICAgIEJGRF9BU1NFUlQgKGFkanVzdCA9PSBjb3VudCB8fCBjb3VudCA+PSA0KTsKLQkgICAgICBpZiAoY291bnQgPj0gNCkKLQkJaW5zbiArPSBhZGp1c3QgLyA0OwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICgoaXJlbC0+cl9vZmZzZXQgJiAzKSA9PSAwKQotCQkgICAgKytpbnNuOwotCQl9Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9TV0lUQ0gxNjoKLQkgICAgICB2b2ZmICs9IGFkanVzdDsKLQkgICAgICBpZiAodm9mZiA8IC0gMHg4MDAwIHx8IHZvZmYgPj0gMHg4MDAwKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF9zaWduZWRfMTYgKGFiZmQsIHZvZmYsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfU1dJVENIMzI6Ci0JICAgICAgdm9mZiArPSBhZGp1c3Q7Ci0JICAgICAgYmZkX3B1dF9zaWduZWRfMzIgKGFiZmQsIHZvZmYsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfVVNFUzoKLQkgICAgICBpcmVsLT5yX2FkZGVuZCArPSBhZGp1c3Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG92ZXJmbG93KQotCSAgICB7Ci0JICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgICAoXygiJXM6IDB4JWx4OiBmYXRhbDogcmVsb2Mgb3ZlcmZsb3cgd2hpbGUgcmVsYXhpbmciKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX29mZnNldCkpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgaXJlbC0+cl9vZmZzZXQgPSBucmFkZHI7Ci0gICAgfQotCi0gIC8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIG90aGVyIHNlY3Rpb25zLiAgSWYgdGhlcmUgY29udGFpbiBhbnkgSU1NMzIKLSAgICAgcmVsb2NzIGFnYWluc3QgaW50ZXJuYWwgc3ltYm9scyB3aGljaCB3ZSBhcmUgbm90IGdvaW5nIHRvIGFkanVzdAotICAgICBiZWxvdywgd2UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZSBhZGRlbmRzLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsc2NhbiwgKmlyZWxzY2FuZW5kOwotICAgICAgYmZkX2J5dGUgKm9jb250ZW50czsKLQotICAgICAgaWYgKG8gPT0gc2VjCi0JICB8fCAoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkgIHx8IG8tPnJlbG9jX2NvdW50ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIGFsd2F5cyBjYWNoZSB0aGUgcmVsb2NzLiAgUGVyaGFwcywgaWYgaW5mby0+a2VlcF9tZW1vcnkgaXMKLSAgICAgICAgIGZhbHNlLCB3ZSBzaG91bGQgZnJlZSB0aGVtLCBpZiB3ZSBhcmUgcGVybWl0dGVkIHRvLCB3aGVuIHdlCi0gICAgICAgICBsZWF2ZSBzaF9jb2ZmX3JlbGF4X3NlY3Rpb24uICAqLwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkJIChhYmZkLCBvLCAoUFRSKSBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJCSAgdHJ1ZSkpOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgb2NvbnRlbnRzID0gTlVMTDsKLSAgICAgIGlyZWxzY2FuZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgby0+cmVsb2NfY291bnQ7Ci0gICAgICBmb3IgKGlyZWxzY2FuID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsc2NhbiA8IGlyZWxzY2FuZW5kOyBpcmVsc2NhbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotCi0JICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsc2Nhbi0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0RJUjMyKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKEVMRjMyX1JfU1lNIChpcmVsc2Nhbi0+cl9pbmZvKSA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICBjb250aW51ZTsKLQotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLAotCQkJCSAgICBleHRzeW1zICsgRUxGMzJfUl9TWU0gKGlyZWxzY2FuLT5yX2luZm8pLAotCQkJCSAgICAmc3ltKTsKLQotCSAgaWYgKHN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgICAgICYmIChzeW0uc3RfdmFsdWUgPD0gYWRkcgotCQkgIHx8IHN5bS5zdF92YWx1ZSA+PSB0b2FkZHIpKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCi0JCXsKLQkJICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JCSAgICBvY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHM7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBXZSBhbHdheXMgY2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGVyaGFwcywgaWYgaW5mby0+a2VlcF9tZW1vcnkgaXMgZmFsc2UsIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGZyZWUgdGhlbSwgaWYgd2UgYXJlIHBlcm1pdHRlZCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHdlIGxlYXZlIHNoX2NvZmZfcmVsYXhfc2VjdGlvbi4gICovCi0JCSAgICAgIG9jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChvLT5fcmF3X3NpemUpOwotCQkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbywgb2NvbnRlbnRzLAotCQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCQkJICAgICAgby0+X3Jhd19zaXplKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzID0gb2NvbnRlbnRzOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl9vZmZzZXQpOwotCSAgICAgIHZhbCArPSBzeW0uc3RfdmFsdWU7Ci0JICAgICAgaWYgKHZhbCA+IGFkZHIgJiYgdmFsIDwgdG9hZGRyKQotCQliZmRfcHV0XzMyIChhYmZkLCB2YWwgLSBjb3VudCwKLQkJCSAgICBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl9vZmZzZXQpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBBZGp1c3QgdGhlIGxvY2FsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotCi0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgaXN5bS5zdF92YWx1ZSA+IGFkZHIKLQkgICYmIGlzeW0uc3RfdmFsdWUgPCB0b2FkZHIpCi0JewotCSAgaXN5bS5zdF92YWx1ZSAtPSBjb3VudDsKLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZpc3ltLCBlc3ltKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhZGp1c3QgdGhlIGdsb2JhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXMgKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBlc3ltZW5kID0gZXh0c3ltcyArIChzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKTsKLSAgZm9yIChpbmRleCA9IDA7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyssIGluZGV4KyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLSAgICAgIHN5bV9oYXNoID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZGV4XTsKLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiAoKHN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IChzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlID4gYWRkcgotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIC09IGNvdW50OwotCX0KLSAgICB9Ci0KLSAgLyogU2VlIGlmIHdlIGNhbiBtb3ZlIHRoZSBBTElHTiByZWxvYyBmb3J3YXJkLiAgV2UgaGF2ZSBhZGp1c3RlZAotICAgICByX29mZnNldCBmb3IgaXQgYWxyZWFkeS4gICovCi0gIGlmIChpcmVsYWxpZ24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFsaWdudG8sIGFsaWduYWRkcjsKLQotICAgICAgYWxpZ250byA9IEJGRF9BTElHTiAodG9hZGRyLCAxIDw8IGlyZWxhbGlnbi0+cl9hZGRlbmQpOwotICAgICAgYWxpZ25hZGRyID0gQkZEX0FMSUdOIChpcmVsYWxpZ24tPnJfb2Zmc2V0LAotCQkJICAgICAxIDw8IGlyZWxhbGlnbi0+cl9hZGRlbmQpOwotICAgICAgaWYgKGFsaWdudG8gIT0gYWxpZ25hZGRyKQotCXsKLQkgIC8qIFRhaWwgcmVjdXJzaW9uLiAgKi8KLQkgIHJldHVybiBzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFsaWduYWRkciwKLQkJCQkJICAgIGFsaWdudG8gLSBhbGlnbmFkZHIpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgZm9yIGxvYWRzIGFuZCBzdG9yZXMgd2hpY2ggd2UgY2FuIGFsaWduIHRvIGZvdXIgYnl0ZQotICAgYm91bmRhcmllcy4gIFRoaXMgaXMgbGlrZSBzaF9hbGlnbl9sb2FkcyBpbiBjb2ZmLXNoLmMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX2FsaWduX2xvYWRzIChhYmZkLCBzZWMsIGludGVybmFsX3JlbG9jcywgY29udGVudHMsIHBzd2FwcGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYm9vbGVhbiAqcHN3YXBwZWQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX3ZtYSAqbGFiZWxzID0gTlVMTDsKLSAgYmZkX3ZtYSAqbGFiZWwsICpsYWJlbF9lbmQ7Ci0KLSAgKnBzd2FwcGVkID0gZmFsc2U7Ci0KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0KLSAgLyogR2V0IGFsbCB0aGUgYWRkcmVzc2VzIHdpdGggbGFiZWxzIG9uIHRoZW0uICAqLwotICBsYWJlbHMgPSAoYmZkX3ZtYSAqKSBiZmRfbWFsbG9jIChzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChiZmRfdm1hKSk7Ci0gIGlmIChsYWJlbHMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbGFiZWxfZW5kID0gbGFiZWxzOwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0xBQkVMKQotCXsKLQkgICpsYWJlbF9lbmQgPSBpcmVsLT5yX29mZnNldDsKLQkgICsrbGFiZWxfZW5kOwotCX0KLSAgICB9Ci0KLSAgLyogTm90ZSB0aGF0IHRoZSBhc3NlbWJsZXIgY3VycmVudGx5IGFsd2F5cyBvdXRwdXRzIHJlbG9jcyBpbgotICAgICBhZGRyZXNzIG9yZGVyLiAgSWYgdGhhdCBldmVyIGNoYW5nZXMsIHRoaXMgY29kZSB3aWxsIG5lZWQgdG8gc29ydAotICAgICB0aGUgbGFiZWwgdmFsdWVzIGFuZCB0aGUgcmVsb2NzLiAgKi8KLQotICBsYWJlbCA9IGxhYmVsczsKLQotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBzdGFydCwgc3RvcDsKLQotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0NPREUpCi0JY29udGludWU7Ci0KLSAgICAgIHN0YXJ0ID0gaXJlbC0+cl9vZmZzZXQ7Ci0KLSAgICAgIGZvciAoaXJlbCsrOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotCWlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9EQVRBKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbCA8IGlyZWxlbmQpCi0Jc3RvcCA9IGlyZWwtPnJfb2Zmc2V0OwotICAgICAgZWxzZQotCXN0b3AgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotICAgICAgaWYgKCEgX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4gKGFiZmQsIHNlYywgY29udGVudHMsIHNoX2VsZl9zd2FwX2luc25zLAotCQkJCSAgICAgKFBUUikgaW50ZXJuYWxfcmVsb2NzLCAmbGFiZWwsCi0JCQkJICAgICBsYWJlbF9lbmQsIHN0YXJ0LCBzdG9wLCBwc3dhcHBlZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGZyZWUgKGxhYmVscyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChsYWJlbHMgIT0gTlVMTCkKLSAgICBmcmVlIChsYWJlbHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFN3YXAgdHdvIFNIIGluc3RydWN0aW9ucy4gIFRoaXMgaXMgbGlrZSBzaF9zd2FwX2luc25zIGluIGNvZmYtc2guYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9lbGZfc3dhcF9pbnNucyAoYWJmZCwgc2VjLCByZWxvY3MsIGNvbnRlbnRzLCBhZGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiByZWxvY3M7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzID0gKEVsZl9JbnRlcm5hbF9SZWxhICopIHJlbG9jczsKLSAgdW5zaWduZWQgc2hvcnQgaTEsIGkyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0KLSAgLyogU3dhcCB0aGUgaW5zdHJ1Y3Rpb25zIHRoZW1zZWx2ZXMuICAqLwotICBpMSA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgYWRkcik7Ci0gIGkyID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBhZGRyICsgMik7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIGkyLCBjb250ZW50cyArIGFkZHIpOwotICBiZmRfcHV0XzE2IChhYmZkLCBpMSwgY29udGVudHMgKyBhZGRyICsgMik7Ci0KLSAgLyogQWRqdXN0IGFsbCByZWxvYyBhZGRyZXNzZXMuICAqLwotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGVudW0gZWxmX3NoX3JlbG9jX3R5cGUgdHlwZTsKLSAgICAgIGludCBhZGQ7Ci0KLSAgICAgIC8qIFRoZXJlIGFyZSBhIGZldyBzcGVjaWFsIHR5cGVzIG9mIHJlbG9jcyB0aGF0IHdlIGRvbid0IHdhbnQgdG8KLSAgICAgICAgIGFkanVzdC4gIFRoZXNlIHJlbG9jcyBkbyBub3QgYXBwbHkgdG8gdGhlIGluc3RydWN0aW9uIGl0c2VsZiwKLSAgICAgICAgIGJ1dCBhcmUgb25seSBhc3NvY2lhdGVkIHdpdGggdGhlIGFkZHJlc3MuICAqLwotICAgICAgdHlwZSA9IChlbnVtIGVsZl9zaF9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAodHlwZSA9PSBSX1NIX0FMSUdOCi0JICB8fCB0eXBlID09IFJfU0hfQ09ERQotCSAgfHwgdHlwZSA9PSBSX1NIX0RBVEEKLQkgIHx8IHR5cGUgPT0gUl9TSF9MQUJFTCkKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgYW4gUl9TSF9VU0VTIHJlbG9jIHBvaW50cyB0byBvbmUgb2YgdGhlIGFkZHJlc3NlcyBiZWluZwotICAgICAgICAgc3dhcHBlZCwgd2UgbXVzdCBhZGp1c3QgaXQuICBJdCB3b3VsZCBiZSBpbmNvcnJlY3QgdG8gZG8gdGhpcwotICAgICAgICAgZm9yIGEganVtcCwgdGhvdWdoLCBzaW5jZSB3ZSB3YW50IHRvIGV4ZWN1dGUgYm90aAotICAgICAgICAgaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoZSBqdW1wLiAgKFdlIGhhdmUgYXZvaWRlZCBzd2FwcGluZwotICAgICAgICAgYXJvdW5kIGEgbGFiZWwsIHNvIHRoZSBqdW1wIHdpbGwgbm90IHdpbmQgdXAgZXhlY3V0aW5nIGFuCi0gICAgICAgICBpbnN0cnVjdGlvbiBpdCBzaG91bGRuJ3QpLiAgKi8KLSAgICAgIGlmICh0eXBlID09IFJfU0hfVVNFUykKLQl7Ci0JICBiZmRfdm1hIG9mZjsKLQotCSAgb2ZmID0gaXJlbC0+cl9vZmZzZXQgKyA0ICsgaXJlbC0+cl9hZGRlbmQ7Ci0JICBpZiAob2ZmID09IGFkZHIpCi0JICAgIGlyZWwtPnJfb2Zmc2V0ICs9IDI7Ci0JICBlbHNlIGlmIChvZmYgPT0gYWRkciArIDIpCi0JICAgIGlyZWwtPnJfb2Zmc2V0IC09IDI7Ci0JfQotCi0gICAgICBpZiAoaXJlbC0+cl9vZmZzZXQgPT0gYWRkcikKLQl7Ci0JICBpcmVsLT5yX29mZnNldCArPSAyOwotCSAgYWRkID0gLTI7Ci0JfQotICAgICAgZWxzZSBpZiAoaXJlbC0+cl9vZmZzZXQgPT0gYWRkciArIDIpCi0JewotCSAgaXJlbC0+cl9vZmZzZXQgLT0gMjsKLQkgIGFkZCA9IDI7Ci0JfQotICAgICAgZWxzZQotCWFkZCA9IDA7Ci0KLSAgICAgIGlmIChhZGQgIT0gMCkKLQl7Ci0JICBiZmRfYnl0ZSAqbG9jOwotCSAgdW5zaWduZWQgc2hvcnQgaW5zbiwgb2luc247Ci0JICBib29sZWFuIG92ZXJmbG93OwotCi0JICBsb2MgPSBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0OwotCSAgb3ZlcmZsb3cgPSBmYWxzZTsKLQkgIHN3aXRjaCAodHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9ESVI4V1BOOgotCSAgICBjYXNlIFJfU0hfRElSOFdQWjoKLQkgICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgbG9jKTsKLQkgICAgICBvaW5zbiA9IGluc247Ci0JICAgICAgaW5zbiArPSBhZGQgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX0lORDEyVzoKLQkgICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgbG9jKTsKLQkgICAgICBvaW5zbiA9IGluc247Ci0JICAgICAgaW5zbiArPSBhZGQgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGYwMDApICE9IChpbnNuICYgMHhmMDAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX0RJUjhXUEw6Ci0JICAgICAgLyogVGhpcyByZWxvYyBpZ25vcmVzIHRoZSBsZWFzdCBzaWduaWZpY2FudCAzIGJpdHMgb2YKLSAgICAgICAgICAgICAgICAgdGhlIHByb2dyYW0gY291bnRlciBiZWZvcmUgYWRkaW5nIGluIHRoZSBvZmZzZXQuCi0gICAgICAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCBpZiBBRERSIGlzIGF0IGFuIGV2ZW4gYWRkcmVzcywgdGhlCi0gICAgICAgICAgICAgICAgIHN3YXAgd2lsbCBub3QgYWZmZWN0IHRoZSBvZmZzZXQuICBJZiBBRERSIGlzIGFuIGF0IGFuCi0gICAgICAgICAgICAgICAgIG9kZCBhZGRyZXNzLCB0aGVuIHRoZSBpbnN0cnVjdGlvbiB3aWxsIGJlIGNyb3NzaW5nIGEKLSAgICAgICAgICAgICAgICAgZm91ciBieXRlIGJvdW5kYXJ5LCBhbmQgbXVzdCBiZSBhZGp1c3RlZC4gICovCi0JICAgICAgaWYgKChhZGRyICYgMykgIT0gMCkKLQkJewotCQkgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBsb2MpOwotCQkgIG9pbnNuID0gaW5zbjsKLQkJICBpbnNuICs9IGFkZCAvIDI7Ci0JCSAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQkgICAgb3ZlcmZsb3cgPSB0cnVlOwotCQkgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7Ci0JCX0KLQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChvdmVyZmxvdykKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiAweCVseDogZmF0YWw6IHJlbG9jIG92ZXJmbG93IHdoaWxlIHJlbGF4aW5nIiksCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl9vZmZzZXQpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVsb2NhdGUgYW4gU0ggRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3ZtYSBhZGRlbmQgPSAoYmZkX3ZtYSkwOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotICAgICAgICAgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLSAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLSAgICAgICAgICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLQotICAgICAgLyogTWFueSBvZiB0aGUgcmVsb2NzIGFyZSBvbmx5IHVzZWQgZm9yIHJlbGF4aW5nLCBhbmQgYXJlCi0gICAgICAgICBoYW5kbGVkIGVudGlyZWx5IGJ5IHRoZSByZWxheGF0aW9uIGNvZGUuICAqLwotICAgICAgaWYgKHJfdHlwZSA+IChpbnQpIFJfU0hfTEFTVF9JTlZBTElEX1JFTE9DKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAocl90eXBlIDwgMAotCSAgfHwgcl90eXBlID49IChpbnQpIFJfU0hfRklSU1RfSU5WQUxJRF9SRUxPQykKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIEZJWE1FOiBUaGlzIGlzIGNlcnRhaW5seSBpbmNvcnJlY3QuICBIb3dldmVyLCBpdCBpcyBob3cgdGhlCi0gICAgICAgICBDT0ZGIGxpbmtlciB3b3Jrcy4gICovCi0gICAgICBpZiAocl90eXBlICE9IChpbnQpIFJfU0hfRElSMzIKLQkgICYmIHJfdHlwZSAhPSAoaW50KSBSX1NIX0lORDEyVykKLQljb250aW51ZTsKLQotICAgICAgaG93dG8gPSBzaF9lbGZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIC8qIFRoZXJlIGlzIG5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYW4gaW50ZXJuYWwgSU5EMTJXCi0gICAgICAgICAgICAgcmVsb2NhdGlvbi4gIEZJWE1FOiBUaGlzIGlzIHByb2JhYmx5IHdyb25nLCBidXQgaXQncyBob3cKLSAgICAgICAgICAgICB0aGUgQ09GRiByZWxvY2F0aW9ucyB3b3JrLiAgKi8KLQkgIGlmIChyX3R5cGUgPT0gKGludCkgUl9TSF9JTkQxMlcpCi0JICAgIGNvbnRpbnVlOwotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEZJWE1FOiBUaGlzIGlzIGhvdyB0aGUgQ09GRiByZWxvY2F0aW9ucyB3b3JrLiAgKi8KLSAgICAgIGlmIChyX3R5cGUgPT0gKGludCkgUl9TSF9JTkQxMlcpCi0JcmVsb2NhdGlvbiAtPSA0OwotCi0gICAgICBzd2l0Y2ggKChpbnQpcl90eXBlKQotCXsKLQljYXNlIChpbnQpUl9TSF9ESVIzMjoKLQkgIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIENPRkYgcmVsb2NzIGRvbid0IHVzZSB0aGUgYWRkZW5kLiBUaGUgYWRkZW5kIGlzIHVzZWQgZm9yIFJfU0hfRElSMzIgCi0JIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBjb21waWxlcnMuICovCi0gICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkgICAgcmVsb2NhdGlvbiwgYWRkZW5kKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOwotCQkgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgaWYgKCpuYW1lID09ICdcMCcpCi0JCSAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JCSAgfQotCQlpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgIHdoaWNoIHVzZXMgc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotc2hfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLAotCQkJCQlkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGJmZCAqaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICoqc2VjdGlvbnMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1N5bSAqaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0KLSAgLyogV2Ugb25seSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiByZWxheGluZywgb3Igb2YgaGF2aW5nIGEKLSAgICAgcGFydGljdWxhciBzZXQgb2Ygc2VjdGlvbiBjb250ZW50cywgc3BlY2lhbGx5LiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZQotICAgICAgfHwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJCQkgICAgICAgcmVsb2NhdGVhYmxlLAotCQkJCQkJICAgICAgIHN5bWJvbHMpOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotCi0gIG1lbWNweSAoZGF0YSwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzLAotCSAgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotICBpZiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0gICAgICAmJiBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSAqaXN5bXA7Ci0gICAgICBhc2VjdGlvbiAqKnNlY3BwOwotICAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLQotICAgICAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JZXh0ZXJuYWxfc3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gICAgICBlbHNlCi0JewotCSAgZXh0ZXJuYWxfc3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJICAgICAgICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSk7Ci0JICBpZiAoZXh0ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9zeW1zLCBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSksCi0JCQkgICAgc3ltdGFiX2hkci0+c2hfaW5mbywgaW5wdXRfYmZkKQotCQkgICE9IChzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkJIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIChQVFIpIE5VTEwsCi0JCQkgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCBmYWxzZSkpOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpbnRlcm5hbF9zeW1zID0gKChFbGZfSW50ZXJuYWxfU3ltICopCi0JCSAgICAgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCQkgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICAgICAgaWYgKHNlY3Rpb25zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlzeW1wID0gaW50ZXJuYWxfc3ltczsKLSAgICAgIHNlY3BwID0gc2VjdGlvbnM7Ci0gICAgICBlc3ltID0gZXh0ZXJuYWxfc3ltczsKLSAgICAgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICAgIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgKytlc3ltLCArK2lzeW1wLCArK3NlY3BwKQotCXsKLQkgIGFzZWN0aW9uICppc2VjOwotCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgaXN5bXApOwotCi0JICBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkgICAgaXNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPiAwICYmIGlzeW1wLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JICAgIGlzZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLCBpc3ltcC0+c3Rfc2huZHgpOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9BQlMpCi0JICAgIGlzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JICAgIGlzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2hvIGtub3dzPyAgKi8KLQkgICAgICBpc2VjID0gTlVMTDsKLQkgICAgfQotCi0JICAqc2VjcHAgPSBpc2VjOwotCX0KLQotICAgICAgaWYgKCEgc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgaW5wdXRfYmZkLAotCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgZGF0YSwgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSAgICAgaW50ZXJuYWxfc3ltcywgc2VjdGlvbnMpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLQlmcmVlIChzZWN0aW9ucyk7Ci0gICAgICBzZWN0aW9ucyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotCWZyZWUgKGludGVybmFsX3N5bXMpOwotICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0JZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gICAgICBleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLQlmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTAotICAgICAgJiYgaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0gICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3N5bXMpOwotICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBOVUxMOwotfQotc3RhdGljIGFzZWN0aW9uICoKLXNoX2VsZl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICAgIGJmZCAqYWJmZDsKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgewotICAgICAgY2FzZSBSX1NIX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYXNlIFJfU0hfR05VX1ZURU5UUlk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIGVsc2UKLSAgICAgewotICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0gICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLSAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNoX2VsZl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgLyogd2UgZG9uJ3QgdXNlIGdvdCBhbmQgcGx0IGVudHJpZXMgZm9yIHNoLiAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0gCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotIAotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotIAotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLSAgICAgICAgaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0gICAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0gCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgICB7Ci0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfU0hfR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0gICAgICAgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfU0hfR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX3NoX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1zaCIKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX3NobF92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCSJlbGYzMi1zaGwiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9zaAotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX1NICi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxCi0KLSNkZWZpbmUgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIgJ18nCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAlzaF9lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCXNoX2VsZl9pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsYXhfc2VjdGlvbglzaF9lbGZfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCXNoX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLQkJCQkJc2hfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vayAgICAgICAgc2hfZWxmX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rICAgICAgIHNoX2VsZl9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgc2hfZWxmX2NoZWNrX3JlbG9jcwotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyAxCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItc3BhcmMuYyBiL2JmZC9lbGYzMi1zcGFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzU3YzhjLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1zcGFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA1OSArMCwwIEBACi0vKiBTUEFSQy1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvc3BhcmMuaCIKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmVsZjMyX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIGVsZjMyX3NwYXJjX2luZm9fdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19hZGp1c3RfZHluaW5keAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19vYmplY3RfcAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgZWxmMzJfc3BhcmNfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotDAotLyogVGhlIHJlbG9jYXRpb24gImhvd3RvIiB0YWJsZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXJlbG9jX2hvd3RvX3R5cGUgX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzgsICAgICAgICAgMCwwLCA4LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfOCIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xNiwgICAgICAgIDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzE2IiwgICAgICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMzIsICAgICAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18zMiIsICAgICAgZmFsc2UsMCwweGZmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1A4LCAgICAgMCwwLCA4LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDgiLCAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMTYsICAgIDAsMSwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1AxNiIsICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDMyLCAgICAwLDIsMzIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQMzIiLCAgZmFsc2UsMCwweDAwZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMzAsICAgMiwyLDMwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV0RJU1AzMCIsIGZhbHNlLDAsMHgzZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDIyLCAgIDIsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dESVNQMjIiLCBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSEkyMiwgICAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ISTIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzIyLCAgICAgICAgMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMjIiLCAgICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xMywgICAgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzEzIiwgICAgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE8xMCwgICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19MTzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEwLCAgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR09UMTAiLCAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QxMywgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dPVDEzIiwgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMjIsICAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HT1QyMiIsICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMTAsICAgICAgMCwyLDEwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUEMxMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQzIyLCAgICAgMTAsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1BDMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV1BMVDMwLCAgICAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XUExUMzAiLCAgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0NPUFksICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfQ09QWSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HTE9CX0RBVCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dMT0JfREFUIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSk1QX1NMT1QsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19KTVBfU0xPVCIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1JFTEFUSVZFLCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUkVMQVRJVkUiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19VQTMyLCAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1VBMzIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUExUMzIsICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUExUMzIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSElQTFQyMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfSElQTFQyMiIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE9QTFQxMCwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfTE9QTFQxMCIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENQTFQzMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUENQTFQzMiIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENQTFQyMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUENQTFQyMiIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENQTFQxMCwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUENQTFQxMCIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTAsICAgICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xMCIsICAgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzExLCAgICAgICAgMCwyLDExLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTEiLCAgICAgIGZhbHNlLDAsMHgwMDAwMDdmZix0cnVlKSwKLSAgLyogVGhlc2UgYXJlIGZvciBzcGFyYzY0IGluIGEgNjQgYml0IGVudmlyb25tZW50LgotICAgICBWYWx1ZXMgbmVlZCB0byBiZSBoZXJlIGJlY2F1c2UgdGhlIHRhYmxlIGlzIGluZGV4ZWQgYnkgcmVsb2MgbnVtYmVyLiAgKi8KLSAgSE9XVE8oUl9TUEFSQ182NCwgICAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ182NCIsICAgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX09MTzEwLCAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX09MTzEwIiwgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSEgyMiwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfSEgyMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ITTEwLCAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19ITTEwIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0xNMjIsICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX0xNMjIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENfSEgyMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUENfSEgyMiIsIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ19ITTEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ19ITTEwIiwgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDX0xNMjIsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX1BDX0xNMjIiLCBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIC8qIEVuZCBzcGFyYzY0IGluIDY0IGJpdCBlbnZpcm9ubWVudCB2YWx1ZXMuCi0gICAgIFRoZSBmb2xsb3dpbmcgYXJlIGZvciBzcGFyYzY0IGluIGEgMzIgYml0IGVudmlyb25tZW50LiAgKi8KLSAgSE9XVE8oUl9TUEFSQ19XRElTUDE2LCAgIDIsMiwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIHNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jLCJSX1NQQVJDX1dESVNQMTYiLCBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AxOSwgICAyLDIsMTksdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XRElTUDE5IiwgZmFsc2UsMCwweDAwMDdmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VOVVNFRF80MiwgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVU5VU0VEXzQyIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfNywgICAgICAgICAwLDIsIDcsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ183IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMDdmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzUsICAgICAgICAgMCwyLCA1LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNSIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDAxZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ182LCAgICAgICAgIDAsMiwgNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzYiLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwM2YsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1JFVjMyLCAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1JFVjMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCi19Owotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfc3BhcmNfdnRpbmhlcml0X2hvd3RvID0KLSAgSE9XVE8gKFJfU1BBUkNfR05VX1ZUSU5IRVJJVCwgMCwyLDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9TUEFSQ19HTlVfVlRJTkhFUklUIiwgZmFsc2UsMCwgMCwgZmFsc2UpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfc3BhcmNfdnRlbnRyeV9ob3d0byA9Ci0gIEhPV1RPIChSX1NQQVJDX0dOVV9WVEVOVFJZLCAwLDIsMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sIlJfU1BBUkNfR05VX1ZURU5UUlkiLCBmYWxzZSwwLDAsIGZhbHNlKTsKLQotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcCB7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGVsZl9yZWxvY19tYXAgc3BhcmNfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX1NQQVJDX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX1NQQVJDXzE2LCB9LAotICB7IEJGRF9SRUxPQ184LCBSX1NQQVJDXzggfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9TUEFSQ19ESVNQOCB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSX1NQQVJDXzMyIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX1NQQVJDXzMyIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMLCBSX1NQQVJDX0RJU1AzMiB9LAotICB7IEJGRF9SRUxPQ19ISTIyLCBSX1NQQVJDX0hJMjIgfSwKLSAgeyBCRkRfUkVMT0NfTE8xMCwgUl9TUEFSQ19MTzEwLCB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiwgUl9TUEFSQ19XRElTUDMwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDMjIsIFJfU1BBUkNfMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkMxMywgUl9TUEFSQ18xMyB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QxMCwgUl9TUEFSQ19HT1QxMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QxMywgUl9TUEFSQ19HT1QxMyB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QyMiwgUl9TUEFSQ19HT1QyMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19QQzEwLCBSX1NQQVJDX1BDMTAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUEMyMiwgUl9TUEFSQ19QQzIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1dQTFQzMCwgUl9TUEFSQ19XUExUMzAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfQ09QWSwgUl9TUEFSQ19DT1BZIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dMT0JfREFULCBSX1NQQVJDX0dMT0JfREFUIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0pNUF9TTE9ULCBSX1NQQVJDX0pNUF9TTE9UIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1JFTEFUSVZFLCBSX1NQQVJDX1JFTEFUSVZFIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIsIFJfU1BBUkNfV0RJU1AyMiB9LAotICAvKiA/Pz8gRG9lc24ndCBkd2FyZiB1c2UgdGhpcz8gICovCi0vKnsgQkZEX1JFTE9DX1NQQVJDX1VBMzIsIFJfU1BBUkNfVUEzMiB9LCBub3QgdXNlZD8/ICovCi0gIHtCRkRfUkVMT0NfU1BBUkNfMTAsIFJfU1BBUkNfMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDXzExLCBSX1NQQVJDXzExfSwKLSAge0JGRF9SRUxPQ19TUEFSQ182NCwgUl9TUEFSQ182NH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfT0xPMTAsIFJfU1BBUkNfT0xPMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX0hIMjIsIFJfU1BBUkNfSEgyMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfSE0xMCwgUl9TUEFSQ19ITTEwfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19MTTIyLCBSX1NQQVJDX0xNMjJ9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BDX0hIMjIsIFJfU1BBUkNfUENfSEgyMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUENfSE0xMCwgUl9TUEFSQ19QQ19ITTEwfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19QQ19MTTIyLCBSX1NQQVJDX1BDX0xNMjJ9LAotICB7QkZEX1JFTE9DX1NQQVJDX1dESVNQMTYsIFJfU1BBUkNfV0RJU1AxNn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOSwgUl9TUEFSQ19XRElTUDE5fSwKLSAge0JGRF9SRUxPQ19TUEFSQ183LCBSX1NQQVJDXzd9LAotICB7QkZEX1JFTE9DX1NQQVJDXzUsIFJfU1BBUkNfNX0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfNiwgUl9TUEFSQ182fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19SRVYzMiwgUl9TUEFSQ19SRVYzMiB9LAotICB7QkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX1NQQVJDX0dOVV9WVElOSEVSSVR9LAotICB7QkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgUl9TUEFSQ19HTlVfVlRFTlRSWX0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1lbGYzMl9zcGFyY19yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIAotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgICAgcmV0dXJuICZlbGYzMl9zcGFyY192dGluaGVyaXRfaG93dG87Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICByZXR1cm4gJmVsZjMyX3NwYXJjX3Z0ZW50cnlfaG93dG87Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3BhcmNfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoc3BhcmNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQkgICAgcmV0dXJuICZfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZVsoaW50KSBzcGFyY19yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFdlIG5lZWQgdG8gdXNlIEVMRjMyX1JfVFlQRSBzbyB3ZSBoYXZlIG91ciBvd24gY29weSBvZiB0aGlzIGZ1bmN0aW9uLAotICAgYW5kIGVsZjY0LXNwYXJjLmMgaGFzIGl0cyBvd24gY29weS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGYzMl9zcGFyY19pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIEJGRF9BU1NFUlQgKEVMRjMyX1JfVFlQRShkc3QtPnJfaW5mbykgPCAodW5zaWduZWQgaW50KSBSX1NQQVJDX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGVbRUxGMzJfUl9UWVBFKGRzdC0+cl9pbmZvKV07Ci19Ci0MCi0vKiBGb3IgdW5zdXBwb3J0ZWQgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYyAoYWJmZCwKLQkJCSAgICAgcmVsb2NfZW50cnksCi0JCQkgICAgIHN5bWJvbCwKLQkJCSAgICAgZGF0YSwKLQkJCSAgICAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgb3V0cHV0X2JmZCwKLQkJCSAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotfQotCi0vKiBIYW5kbGUgdGhlIFdESVNQMTYgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zcGFyY19lbGZfd2Rpc3AxNl9yZWxvYyAoYWJmZCwKLQkJCSByZWxvY19lbnRyeSwKLQkJCSBzeW1ib2wsCi0JCQkgZGF0YSwKLQkJCSBpbnB1dF9zZWN0aW9uLAotCQkJIG91dHB1dF9iZmQsCi0JCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3ZtYSB4OwotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICByZWxvY2F0aW9uID0gKHN5bWJvbC0+dmFsdWUKLQkJKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gIHJlbG9jYXRpb24gLT0JKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gIHJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0KLSAgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICB4IHw9ICgoKChyZWxvY2F0aW9uID4+IDIpICYgMHhjMDAwKSA8PCA2KQotCXwgKChyZWxvY2F0aW9uID4+IDIpICYgMHgzZmZmKSk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIGlmICgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPCAtIDB4NDAwMDAKLSAgICAgIHx8IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+IDB4M2ZmZmYpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgZWxzZQotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgZm9yIHRoZSBTUEFSQyBFTEYgbGlua2VyLiAgKi8KLQotLyogVGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgaW50ZXJwcmV0ZXIuICBUaGlzIGlzIHB1dCBpbiB0aGUgLmludGVycAotICAgc2VjdGlvbi4gICovCi0KLSNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgIi91c3IvbGliL2xkLnNvLjEiCi0KLS8qIFRoZSBub3Agb3Bjb2RlIHdlIHVzZS4gICovCi0KLSNkZWZpbmUgU1BBUkNfTk9QIDB4MDEwMDAwMDAKLQotLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotI2RlZmluZSBQTFRfRU5UUllfU0laRSAxMgotCi0vKiBUaGUgZmlyc3QgZm91ciBlbnRyaWVzIGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgYXJlIHJlc2VydmVkLAotICAgYW5kIHRoZSBpbml0aWFsIGNvbnRlbnRzIGFyZSB1bmltcG9ydGFudCAod2UgemVybyB0aGVtIG91dCkuCi0gICBTdWJzZXF1ZW50IGVudHJpZXMgbG9vayBsaWtlIHRoaXMuICBTZWUgdGhlIFNWUjQgQUJJIFNQQVJDCi0gICBzdXBwbGVtZW50IHRvIHNlZSBob3cgdGhpcyB3b3Jrcy4gICovCi0KLS8qIHNldGhpICVoaSguLS5wbHQwKSwlZzEuICBXZSBmaWxsIGluIHRoZSBhZGRyZXNzIGxhdGVyLiAgKi8KLSNkZWZpbmUgUExUX0VOVFJZX1dPUkQwIDB4MDMwMDAwMDAKLS8qIGIsYSAucGx0MC4gIFdlIGZpbGwgaW4gdGhlIG9mZnNldCBsYXRlci4gICovCi0jZGVmaW5lIFBMVF9FTlRSWV9XT1JEMSAweDMwODAwMDAwCi0vKiBub3AuICAqLwotI2RlZmluZSBQTFRfRU5UUllfV09SRDIgU1BBUkNfTk9QCi0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZSwgYW5kCi0gICBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBvciBwcm9jZWR1cmUgbGlua2FnZQotICAgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsZ290OwotICBhc2VjdGlvbiAqc3JlbG9jOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpOwotCi0gIHNnb3QgPSBOVUxMOwotICBzcmVsZ290ID0gTlVMTDsKLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfU1BBUkNfR09UMTA6Ci0JY2FzZSBSX1NQQVJDX0dPVDEzOgotCWNhc2UgUl9TUEFSQ19HT1QyMjoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0KLQkgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCSAgICAgICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgewotCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQl7Ci0JCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBoLT5nb3Qub2Zmc2V0ID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkJewotCQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbAotICAgICAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQl7Ci0JCSAgc2l6ZV90IHNpemU7Ci0JCSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0KLQkJICBzaXplID0gc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoYmZkX3ZtYSk7Ci0JCSAgbG9jYWxfZ290X29mZnNldHMgPSAoYmZkX3ZtYSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotCQkgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCkgPSBsb2NhbF9nb3Rfb2Zmc2V0czsKLQkJICBmb3IgKGkgPSAwOyBpIDwgc3ltdGFiX2hkci0+c2hfaW5mbzsgaSsrKQotCQkgICAgbG9jYWxfZ290X29mZnNldHNbaV0gPSAoYmZkX3ZtYSkgLTE7Ci0JCX0KLQkgICAgICBpZiAobG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQkJewotCQkgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGEgUl9TUEFSQ19SRUxBVElWRSByZWxvYyBzbyB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBsaW5rZXIgY2FuIGFkanVzdCB0aGlzIEdPVCBlbnRyeS4gICovCi0JCSAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JCX0KLQkgICAgfQotCi0JICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQotCSAgLyogSWYgdGhlIC5nb3Qgc2VjdGlvbiBpcyBtb3JlIHRoYW4gMHgxMDAwIGJ5dGVzLCB3ZSBhZGQKLQkgICAgIDB4MTAwMCB0byB0aGUgdmFsdWUgb2YgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLCBzbyB0aGF0IDEzCi0JICAgICBiaXQgcmVsb2NhdGlvbnMgaGF2ZSBhIGdyZWF0ZXIgY2hhbmNlIG9mIHdvcmtpbmcuICAqLwotCSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+PSAweDEwMDAKLQkgICAgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QtPnJvb3QudS5kZWYudmFsdWUgPT0gMCkKLQkgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290LT5yb290LnUuZGVmLnZhbHVlID0gMHgxMDAwOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19XUExUMzA6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgV2UKLSAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotICAgICAgICAgICAgIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIGNhc2Ugb2YgbGlua2luZyBQSUMgY29kZSB3aXRob3V0Ci0gICAgICAgICAgICAgbGlua2luZyBpbiBhbnkgZHluYW1pYyBvYmplY3RzLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0Ci0gICAgICAgICAgICAgbmVlZCB0byBnZW5lcmF0ZSBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGFmdGVyIGFsbC4gICovCi0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgU29sYXJpcyBuYXRpdmUgYXNzZW1ibGVyIHdpbGwgZ2VuZXJhdGUgYSBXUExUMzAKLSAgICAgICAgICAgICAgICAgcmVsb2MgZm9yIGEgbG9jYWwgc3ltYm9sIGlmIHlvdSBhc3NlbWJsZSBhIGNhbGwgZnJvbQotICAgICAgICAgICAgICAgICBvbmUgc2VjdGlvbiB0byBhbm90aGVyIHdoZW4gdXNpbmcgLUsgcGljLiAgV2UgdHJlYXQKLSAgICAgICAgICAgICAgICAgaXQgYXMgV0RJU1AzMC4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1BDMTA6Ci0JY2FzZSBSX1NQQVJDX1BDMjI6Ci0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl9TUEFSQ19ESVNQODoKLQljYXNlIFJfU1BBUkNfRElTUDE2OgotCWNhc2UgUl9TUEFSQ19ESVNQMzI6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMzA6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMjI6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMTk6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMTY6Ci0JICAvKiBJZiB3ZSBhcmUgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIHdlIGRvIG5vdCBuZWVkIHRvIGNvcHkKLSAgICAgICAgICAgICBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sIHdoaWNoIGlzCi0gICAgICAgICAgICAgZGVmaW5lZCBpbiBhbiBvYmplY3Qgd2UgYXJlIGluY2x1ZGluZyBpbiB0aGUgbGluayAoaS5lLiwKLSAgICAgICAgICAgICBERUZfUkVHVUxBUiBpcyBzZXQpLiAgRklYTUU6IEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBub3QKLSAgICAgICAgICAgICBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMsIHNvIGl0IGlzIHBvc3NpYmxlIHRoYXQKLSAgICAgICAgICAgICBERUZfUkVHVUxBUiBpcyBub3Qgc2V0IG5vdyBidXQgd2lsbCBiZSBzZXQgbGF0ZXIgKGl0IGlzCi0gICAgICAgICAgICAgbmV2ZXIgY2xlYXJlZCkuICBUaGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgYXMgaW4KLSAgICAgICAgICAgICBlbGYzMi1pMzg2LmMuICAqLwotCSAgaWYgKGggPT0gTlVMTAotCSAgICAgIHx8IChpbmZvLT5zeW1ib2xpYwotCQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkpCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfU1BBUkNfODoKLQljYXNlIFJfU1BBUkNfMTY6Ci0JY2FzZSBSX1NQQVJDXzMyOgotCWNhc2UgUl9TUEFSQ19ISTIyOgotCWNhc2UgUl9TUEFSQ18yMjoKLQljYXNlIFJfU1BBUkNfMTM6Ci0JY2FzZSBSX1NQQVJDX0xPMTA6Ci0JY2FzZSBSX1NQQVJDX1VBMzI6Ci0JICBpZiAoaW5mby0+c2hhcmVkKQotCSAgICB7Ci0JICAgICAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZQotICAgICAgICAgICAgICAgICByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYwotICAgICAgICAgICAgICAgICBzZWN0aW9uIGluIGR5bm9iaiBhbmQgbWFrZSByb29tIGZvciB0aGUgcmVsb2MuICAqLwotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGFiZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCQkJCQkgbmFtZSArIDUpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBmbGFnd29yZCBmbGFnczsKLQotCQkgICAgICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIG5hbWUpOwotCQkgICAgICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZCi0JCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQkJICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkJZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsIGZsYWdzKQotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkgICAgfQotCi0JICBicmVhazsKLQotICAgICAgICBjYXNlIFJfU1BBUkNfR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJfU1BBUkNfR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1lbGYzMl9zcGFyY19nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICAgIGJmZCAqYWJmZDsKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLQotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfU1BBUkNfR05VX1ZUSU5IRVJJVDoKLSAgICAgIGNhc2UgUl9TUEFSQ19HTlVfVlRFTlRSWToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotCi0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3RfcmVmY291bnRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9TUEFSQ19HT1QxMDoKLSAgICAgIGNhc2UgUl9TUEFSQ19HT1QxMzoKLSAgICAgIGNhc2UgUl9TUEFSQ19HT1QyMjoKLQlyX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0JaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICB7Ci0JICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAgIGlmIChoLT5nb3QucmVmY291bnQgPiAwKQotCSAgICAgIGgtPmdvdC5yZWZjb3VudC0tOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID4gMCkKLQkgICAgICBsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XS0tOwotCSAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBSX1NQQVJDX1BMVDMyOgotICAgICAgY2FzZSBSX1NQQVJDX0hJUExUMjI6Ci0gICAgICBjYXNlIFJfU1BBUkNfTE9QTFQxMDoKLSAgICAgIGNhc2UgUl9TUEFSQ19QQ1BMVDMyOgotICAgICAgY2FzZSBSX1NQQVJDX1BDUExUMTA6Ci0Jcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCWlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgewotCSAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICBpZiAoaC0+cGx0LnJlZmNvdW50ID4gMCkKLQkgICAgICBoLT5wbHQucmVmY291bnQtLTsKLQkgIH0KLQlicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uLCBwdXQgaXQgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgV2UKLSAgICAgd2lsbCBmaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbGF0ZXIKLSAgICAgKGFsdGhvdWdoIHdlIGNvdWxkIGFjdHVhbGx5IGRvIGl0IGhlcmUpLiAgVGhlIFNUVF9OT1RZUEUKLSAgICAgY29uZGl0aW9uIGlzIGEgaGFjayBzcGVjaWZpY2FsbHkgZm9yIHRoZSBPcmFjbGUgbGlicmFyaWVzCi0gICAgIGRlbGl2ZXJlZCBmb3IgU29sYXJpczsgZm9yIHNvbWUgaW5leHBsaWNhYmxlIHJlYXNvbiwgdGhleSBkZWZpbmUKLSAgICAgc29tZSBvZiB0aGVpciBmdW5jdGlvbnMgYXMgU1RUX05PVFlQRSB3aGVuIHRoZXkgcmVhbGx5IHNob3VsZCBiZQotICAgICBTVFRfRlVOQy4gICovCi0gIGlmIChoLT50eXBlID09IFNUVF9GVU5DCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwCi0gICAgICB8fCAoaC0+dHlwZSA9PSBTVFRfTk9UWVBFCi0JICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKSkKLSAgICB7Ci0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgfHwgKCghaW5mby0+c2hhcmVkIHx8IGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApKQotCXsKLQkgIC8qIFRoaXMgY2FzZSBjYW4gb2NjdXIgaWYgd2Ugc2F3IGEgV1BMVDMwIHJlbG9jIGluIGFuIGlucHV0Ci0JICAgICBmaWxlLCBidXQgbm9uZSBvZiB0aGUgaW5wdXQgZmlsZXMgd2VyZSBkeW5hbWljIG9iamVjdHMuCi0JICAgICBPciwgd2hlbiBsaW5raW5nIHRoZSBtYWluIGFwcGxpY2F0aW9uIG9yIGEgLUJzeW1ib2xpYwotCSAgICAgc2hhcmVkIGxpYnJhcnkgYWdhaW5zdCBQSUMgY29kZS4gIE9yIHdoZW4gYSBnbG9iYWwgc3ltYm9sCi0JICAgICBoYXMgYmVlbiBtYWRlIHByaXZhdGUsIGUuZy4gdmlhIHZlcnNpb25pbmcuCi0KLQkgICAgIEluIHRoZXNlIGNhc2VzIHdlIGtub3cgd2hhdCB2YWx1ZSB0aGUgc3ltYm9sIHdpbGwgcmVzb2x2ZQotCSAgICAgdG8sIHNvIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gYnVpbGQgYSBwcm9jZWR1cmUgbGlua2FnZQotCSAgICAgdGFibGUsIGFuZCB3ZSBjYW4ganVzdCBkbyBhIFdESVNQMzAgcmVsb2MgaW5zdGVhZC4gICovCi0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfkVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCBmb3VyIGVudHJpZXMgaW4gLnBsdCBhcmUgcmVzZXJ2ZWQuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSA9IDQgKiBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogVGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGhhcyBhIG1heGltdW0gc2l6ZS4gICovCi0gICAgICBpZiAocy0+X3Jhd19zaXplID49IDB4NDAwMDAwKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZQotICAgICAgIG5vdCBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhpcwotICAgICAgIGxvY2F0aW9uIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uCi0gICAgICAgcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQKLSAgICAgICB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0gICAgICB7Ci0JaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQloLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotICAgICAgfQotCi0gICAgICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplOwotCi0gICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICAqLwotICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCi0KLSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG11c3QgcHJlc3VtZSB0aGF0IHRoZQotICAgICBvbmx5IHJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBhcmUgdmlhIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotICAgICBGb3Igc3VjaCBjYXNlcyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyBoZXJlOyB0aGUgcmVsb2NhdGlvbnMgd2lsbAotICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSByZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBzeW1ib2wgaW4gb3VyIC5keW5ic3Mgc2VjdGlvbiwgd2hpY2ggd2lsbAotICAgICBiZWNvbWUgcGFydCBvZiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgVGhlcmUgd2lsbCBiZQotICAgICBhbiBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gIFRoZSBkeW5hbWljCi0gICAgIG9iamVjdCB3aWxsIGNvbnRhaW4gcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgc28gYWxsIHJlZmVyZW5jZXMKLSAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgdG8gdGhpcyBzeW1ib2wgd2lsbCBnbyB0aHJvdWdoIHRoZSBnbG9iYWwKLSAgICAgb2Zmc2V0IHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpbGwgdXNlIHRoZSAuZHluc3ltIGVudHJ5IHRvCi0gICAgIGRldGVybWluZSB0aGUgYWRkcmVzcyBpdCBtdXN0IHB1dCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgc28KLSAgICAgYm90aCB0aGUgZHluYW1pYyBvYmplY3QgYW5kIHRoZSByZWd1bGFyIG9iamVjdCB3aWxsIHJlZmVyIHRvIHRoZQotICAgICBzYW1lIG1lbW9yeSBsb2NhdGlvbiBmb3IgdGhlIHZhcmlhYmxlLiAgKi8KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5ic3MiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAvKiBXZSBtdXN0IGdlbmVyYXRlIGEgUl9TUEFSQ19DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyCi0gICAgIHRvIGNvcHkgdGhlIGluaXRpYWwgdmFsdWUgb3V0IG9mIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgaW50byB0aGUKLSAgICAgcnVudGltZSBwcm9jZXNzIGltYWdlLiAgV2UgbmVlZCB0byByZW1lbWJlciB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgIC5yZWwuYnNzIHNlY3Rpb24gd2UgYXJlIGdvaW5nIHRvIHVzZS4gICovCi0gIGlmICgoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLQotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0gICAgICBzcmVsLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgdGhpcyBzeW1ib2wuICBJCi0gICAgIGhhdmUgbm8gaWRlYSBob3cgRUxGIGxpbmtlcnMgaGFuZGxlIHRoaXMuICAqLwotICBwb3dlcl9vZl90d28gPSBiZmRfbG9nMiAoaC0+c2l6ZSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiAzKQotICAgIHBvd2VyX29mX3R3byA9IDM7Ci0KLSAgLyogQXBwbHkgdGhlIHJlcXVpcmVkIGFsaWdubWVudC4gICovCi0gIHMtPl9yYXdfc2l6ZSA9IEJGRF9BTElHTiAocy0+X3Jhd19zaXplLAotCQkJICAgIChiZmRfc2l6ZV90eXBlKSAoMSA8PCBwb3dlcl9vZl90d28pKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcykpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBwb3dlcl9vZl90d28pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgYXMgYmVpbmcgYXQgdGhpcyBwb2ludCBpbiB0aGUgc2VjdGlvbi4gICovCi0gIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0gIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0KLSAgLyogSW5jcmVtZW50IHRoZSBzZWN0aW9uIHNpemUgdG8gbWFrZSByb29tIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgcy0+X3Jhd19zaXplICs9IGgtPnNpemU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLSAgYm9vbGVhbiByZWxwbHQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3BhY2UgZm9yIHRoZSB0cmFpbGluZyBub3AgaW4gLnBsdC4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBpZiAocy0+X3Jhd19zaXplID4gMCkKLQlzLT5fcmF3X3NpemUgKz0gNDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGVudHJpZXMgaW4gdGhlIC5yZWxhLmdvdCBzZWN0aW9uLgotICAgICAgICAgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbAotICAgICAgICAgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQgdGhlIHNpemUgb2YgLnJlbGEuZ290LAotICAgICAgICAgd2hpY2ggd2lsbCBjYXVzZSBpdCB0byBnZXQgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUKLSAgICAgICAgIGJlbG93LiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgfQotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcmVsdGV4dCA9IGZhbHNlOwotICByZWxwbHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKLQkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7Ci0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIHRvIGhhbmRsZSAucmVsYS5ic3MgYW5kCi0JCSAucmVsLnBsdC4gIFdlIG11c3QgY3JlYXRlIGl0IGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSBpdCBtdXN0IGJlIGNyZWF0ZWQKLQkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQotCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKLQkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbwotCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpvdXRuYW1lOwotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMIGVudHJ5LiAgKi8KLQkgICAgICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDUpOwotCSAgICAgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCXJlbHRleHQgPSB0cnVlOwotCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWxhLnBsdCIpID09IDApCi0JCXJlbHBsdCA9IHRydWU7Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpICE9IDAKLQkgICAgICAgJiYgc3RyY21wIChuYW1lLCAiLmdvdCIpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMQSkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBLCAwKQotCSAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFTWiwgMCkKLQkgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBRU5ULAotCQkJCQkgICAgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBnZW5lcmF0ZSBhIHNlY3Rpb24KLSAgICAgc3ltYm9sIGZvciBlYWNoIG91dHB1dCBzZWN0aW9uIGZvciB3aGljaCB3ZSBtaWdodCBuZWVkIHRvIGNvcHkKLSAgICAgcmVsb2NzLiAgVGhlc2UgYXJlIGxvY2FsIHN5bWJvbHMsIHdoaWNoIG1lYW5zIHRoYXQgdGhleSBtdXN0IGNvbWUKLSAgICAgZmlyc3QgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgVGhhdCBtZWFucyB3ZSBtdXN0IGluY3JlbWVudAotICAgICB0aGUgZHluYW1pYyBzeW1ib2wgaW5kZXggb2YgZXZlcnkgb3RoZXIgZHluYW1pYyBzeW1ib2wuICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGludCBjOwotCi0gICAgICBjID0gMDsKLSAgICAgIGZvciAocyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXsKLQkgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpICE9IDAKLQkgICAgICB8fCAocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCA9IGMgKyAxOwotCi0JICAvKiBUaGVzZSBzeW1ib2xzIHdpbGwgaGF2ZSBubyBuYW1lcywgc28gd2UgZG9uJ3QgbmVlZCB0bwotICAgICAgICAgICAgIGZpZGRsZSB3aXRoIGR5bnN0cl9pbmRleC4gICovCi0KLQkgICsrYzsKLQl9Ci0KLSAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICAgIGVsZjMyX3NwYXJjX2FkanVzdF9keW5pbmR4LAotCQkJICAgICAgKFBUUikgJmMpOwotICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCArPSBjOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSW5jcmVtZW50IHRoZSBpbmRleCBvZiBhIGR5bmFtaWMgc3ltYm9sIGJ5IGEgZ2l2ZW4gYW1vdW50LiAgQ2FsbGVkCi0gICB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19hZGp1c3RfZHluaW5keCAoaCwgY3BhcmcpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgY3Bhcmc7Ci17Ci0gIGludCAqY3AgPSAoaW50ICopIGNwYXJnOwotCi0gIGlmIChoLT5keW5pbmR4ICE9IC0xKQotICAgIGgtPmR5bmluZHggKz0gKmNwOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsb2NhdGUgYSBTUEFSQyBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgYmZkX3ZtYSBnb3RfYmFzZTsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcGx0OwotICBhc2VjdGlvbiAqc3JlbG9jOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoaW5wdXRfYmZkKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290ID09IE5VTEwpCi0gICAgZ290X2Jhc2UgPSAwOwotICBlbHNlCi0gICAgZ290X2Jhc2UgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QtPnJvb3QudS5kZWYudmFsdWU7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNwbHQgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3R5cGUgPT0gUl9TUEFSQ19HTlVfVlRJTkhFUklUIAotICAgICAgICAgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX0dOVV9WVEVOVFJZKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfU1BBUkNfbWF4KQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBpZiAoKHJfdHlwZSA9PSBSX1NQQVJDX1dQTFQzMAotCQkgICAmJiBoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJICB8fCAoKHJfdHlwZSA9PSBSX1NQQVJDX0dPVDEwCi0JCSAgICAgICB8fCByX3R5cGUgPT0gUl9TUEFSQ19HT1QxMwotCQkgICAgICAgfHwgcl90eXBlID09IFJfU1BBUkNfR09UMjIpCi0JCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICAgICYmICghIGluZm8tPnNoYXJlZAotCQkJICB8fCAoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCQkgICAgICAmJiAocl90eXBlID09IFJfU1BBUkNfOAotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ18xNgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ18zMgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19ESVNQOAotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19ESVNQMTYKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfRElTUDMyCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX1dESVNQMzAKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfV0RJU1AyMgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19XRElTUDE5Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX1dESVNQMTYKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfSEkyMgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ18yMgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ18xMwotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19MTzEwCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX1VBMzIKLQkJCSAgfHwgKChyX3R5cGUgPT0gUl9TUEFSQ19QQzEwCi0JCQkgICAgICAgfHwgcl90eXBlID09IFJfU1BBUkNfUEMyMikKLQkJCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkJICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSAhPSAwKSkpKQotCQl7Ci0JCSAgLyogSW4gdGhlc2UgY2FzZXMsIHdlIGRvbid0IG5lZWQgdGhlIHJlbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlLiAgV2UgY2hlY2sgc3BlY2lhbGx5IGJlY2F1c2UgaW4gc29tZQotICAgICAgICAgICAgICAgICAgICAgb2JzY3VyZSBjYXNlcyBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQljYXNlIFJfU1BBUkNfR09UMTA6Ci0JY2FzZSBSX1NQQVJDX0dPVDEzOgotCWNhc2UgUl9TUEFSQ19HT1QyMjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgZ2xvYmFsCi0gICAgICAgICAgICAgb2Zmc2V0IHRhYmxlLiAgKi8KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZjsKLQotCSAgICAgIG9mZiA9IGgtPmdvdC5vZmZzZXQ7Ci0JICAgICAgQkZEX0FTU0VSVCAob2ZmICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgIHx8IChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhCi0gICAgICAgICAgICAgICAgICAgICAtQnN5bWJvbGljIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotICAgICAgICAgICAgICAgICAgICAgbG9jYWxseSwgb3IgdGhlIHN5bWJvbCB3YXMgZm9yY2VkIHRvIGJlIGxvY2FsCi0gICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLiAgV2UgbXVzdCBpbml0aWFsaXplCi0gICAgICAgICAgICAgICAgICAgICB0aGlzIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2luY2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LCB3ZSB1c2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQgaXQgYWxyZWFkeS4KLQotCQkgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWxhLmdvdAotCQkgICAgIHJlbG9jYXRpb24gZW50cnkgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsdWUuICBUaGlzCi0JCSAgICAgaXMgZG9uZSBpbiB0aGUgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICAqLwotCQkgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJICAgIG9mZiAmPSB+MTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICBzZ290LT5jb250ZW50cyArIG9mZik7Ci0JCSAgICAgIGgtPmdvdC5vZmZzZXQgfD0gMTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmYgLSBnb3RfYmFzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMCi0JCQkgICYmIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICAgICAgb2ZmID0gbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdOwotCi0JICAgICAgLyogVGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQuICBXZSB1c2UKLQkJIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQotCQkgYWxyZWFkeSBwcm9jZXNzZWQgdGhpcyBlbnRyeS4gICovCi0JICAgICAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQlvZmYgJj0gfjE7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCi0JCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKnNyZWxnb3Q7Ci0JCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQotCQkgICAgICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgUl9TUEFSQ19SRUxBVElWRSByZWxvYwotCQkJIGZvciB0aGUgZHluYW1pYyBsaW5rZXIuICAqLwotCQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgICAgICBCRkRfQVNTRVJUIChzcmVsZ290ICE9IE5VTEwpOwotCi0JCSAgICAgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCQkJICsgb2ZmKTsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9TUEFSQ19SRUxBVElWRSk7Ci0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IDA7Ci0JCSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCQkgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkJICAgc3JlbGdvdC0+Y29udGVudHMpCi0JCQkJCQkgICsgc3JlbGdvdC0+cmVsb2NfY291bnQpKTsKLQkJICAgICAgKytzcmVsZ290LT5yZWxvY19jb3VudDsKLQkJICAgIH0KLQotCQkgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSB8PSAxOwotCQl9Ci0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZiAtIGdvdF9iYXNlOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1dQTFQzMDoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUKLSAgICAgICAgICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLQkgIC8qIFRoZSBTb2xhcmlzIG5hdGl2ZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSBhIFdQTFQzMCByZWxvYwotCSAgICAgZm9yIGEgbG9jYWwgc3ltYm9sIGlmIHlvdSBhc3NlbWJsZSBhIGNhbGwgZnJvbSBvbmUKLQkgICAgIHNlY3Rpb24gdG8gYW5vdGhlciB3aGVuIHVzaW5nIC1LIHBpYy4gIFdlIHRyZWF0IGl0IGFzCi0JICAgICBXRElTUDMwLiAgKi8KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGJyZWFrOwotCi0JICBpZiAoaC0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0JICAgIHsKLQkgICAgICAvKiBXZSBkaWRuJ3QgbWFrZSBhIFBMVCBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICBUaGlzCi0gICAgICAgICAgICAgICAgIGhhcHBlbnMgd2hlbiBzdGF0aWNhbGx5IGxpbmtpbmcgUElDIGNvZGUsIG9yIHdoZW4KLSAgICAgICAgICAgICAgICAgdXNpbmcgLUJzeW1ib2xpYy4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHNwbHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJCSsgaC0+cGx0Lm9mZnNldCk7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19QQzEwOgotCWNhc2UgUl9TUEFSQ19QQzIyOgotCSAgaWYgKGggIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfU1BBUkNfRElTUDg6Ci0JY2FzZSBSX1NQQVJDX0RJU1AxNjoKLQljYXNlIFJfU1BBUkNfRElTUDMyOgotCWNhc2UgUl9TUEFSQ19XRElTUDMwOgotCWNhc2UgUl9TUEFSQ19XRElTUDIyOgotCWNhc2UgUl9TUEFSQ19XRElTUDE5OgotCWNhc2UgUl9TUEFSQ19XRElTUDE2OgotCSAgaWYgKGggPT0gTlVMTAotCSAgICAgIHx8IChpbmZvLT5zeW1ib2xpYwotCQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkpCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfU1BBUkNfODoKLQljYXNlIFJfU1BBUkNfMTY6Ci0JY2FzZSBSX1NQQVJDXzMyOgotCWNhc2UgUl9TUEFSQ19ISTIyOgotCWNhc2UgUl9TUEFSQ18yMjoKLQljYXNlIFJfU1BBUkNfMTM6Ci0JY2FzZSBSX1NQQVJDX0xPMTA6Ci0JY2FzZSBSX1NQQVJDX1VBMzI6Ci0JICBpZiAoaW5mby0+c2hhcmVkKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCSAgICAgIGJvb2xlYW4gc2tpcDsKLQotCSAgICAgIC8qIFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHRoZXNlIHJlbG9jYXRpb25zCi0gICAgICAgICAgICAgICAgIGFyZSBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgcmVzb2x2ZWQgYXQgcnVuCi0gICAgICAgICAgICAgICAgIHRpbWUuICAqLwotCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoaW5wdXRfYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKSwKLQkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIEJGRF9BU1NFUlQgKHNyZWxvYyAhPSBOVUxMKTsKLQkJfQotCi0JICAgICAgc2tpcCA9IGZhbHNlOwotCi0JICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkJb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfdm1hIG9mZjsKLQotCQkgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJCSAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCSAgcmVsLT5yX29mZnNldCkpOwotCQkgIGlmIChvZmYgPT0gKGJmZF92bWEpIC0xKQotCQkgICAgc2tpcCA9IHRydWU7Ci0JCSAgb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCQl9Ci0KLQkgICAgICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgICAgICBpZiAoc2tpcCkKLQkJbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQkgICAgICAvKiBoLT5keW5pbmR4IG1heSBiZSAtMSBpZiB0aGUgc3ltYm9sIHdhcyBtYXJrZWQgdG8KLSAgICAgICAgICAgICAgICAgYmVjb21lIGxvY2FsLiAgKi8KLQkgICAgICBlbHNlIGlmIChoICE9IE5VTEwKLQkJICAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0JCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgcl90eXBlKTsKLQkJICBvdXRyZWwucl9hZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHJfdHlwZSA9PSBSX1NQQVJDXzMyKQotCQkgICAgewotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBsb25nIGluZHg7Ci0KLQkJICAgICAgaWYgKGggPT0gTlVMTCkKLQkJCXNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkJICAgICAgfHwgKGgtPnJvb3QudHlwZQotCQkJCQkgID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCQl9Ci0JCSAgICAgIGlmIChzZWMgIT0gTlVMTCAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0JCQlpbmR4ID0gMDsKLQkJICAgICAgZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQotCQkJewotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGFzZWN0aW9uICpvc2VjOwotCi0JCQkgIG9zZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCQkJICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAob3NlYyktPmR5bmluZHg7Ci0KLQkJCSAgLyogRklYTUU6IHdlIHJlYWxseSBzaG91bGQgYmUgYWJsZSB0byBsaW5rIG5vbi1waWMKLQkJCSAgICAgc2hhcmVkIGxpYnJhcmllcy4gICovCi0JCQkgIGlmIChpbmR4ID09IDApCi0JCQkgICAgewotCQkJICAgICAgQkZEX0ZBSUwgKCk7Ci0JCQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCQkoXygiJXM6IHByb2JhYmx5IGNvbXBpbGVkIHdpdGhvdXQgLWZQSUM/IiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotCQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGluZHgsIHJfdHlwZSk7Ci0KLQkJICAgICAgLyogRm9yIG5vbi1SRUxBVElWRSBkeW5hbWljIHJlbG9jYXRpb25zLCB3ZSBrZWVwIHRoZQotCQkJIHNhbWUgc3ltYm9sLCBhbmQgc28gZ2VuZXJhbGx5IHRoZSBzYW1lIGFkZGVuZC4gIEJ1dAotCQkJIHdlIGRvIG5lZWQgdG8gYWRqdXN0IHRob3NlIHJlbG9jYXRpb25zIHJlZmVyZW5jaW5nCi0JCQkgc2VjdGlvbnMuICAqLwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCQkgICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkgICYmIEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQkgICAgICAgIG91dHJlbC5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQrc3ltLT5zdF92YWx1ZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJICgoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKLQkJCQkJICAgc3JlbG9jLT5jb250ZW50cykKLQkJCQkJICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkgICAgICArK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICAvKiBUaGlzIHJlbG9jIHdpbGwgYmUgY29tcHV0ZWQgYXQgcnVudGltZSwgc28gdGhlcmUncyBubwotICAgICAgICAgICAgICAgICBuZWVkIHRvIGRvIGFueXRoaW5nIG5vdywgdW5sZXNzIHRoaXMgaXMgYSBSRUxBVElWRQotICAgICAgICAgICAgICAgICByZWxvYyBpbiBhbiB1bmFsbG9jYXRlZCBzZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoc2tpcAotCQkgIHx8IChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCQkgIHx8IEVMRjMyX1JfVFlQRSAob3V0cmVsLnJfaW5mbykgIT0gUl9TUEFSQ19SRUxBVElWRSkKLQkJY29udGludWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHJfdHlwZSA9PSBSX1NQQVJDX1dESVNQMTYpCi0JewotCSAgYmZkX3ZtYSB4OwotCi0JICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7Ci0JICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIHJlbG9jYXRpb24gLT0gcmVsLT5yX29mZnNldDsKLQotCSAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkgIHggfD0gKCgoKHJlbG9jYXRpb24gPj4gMikgJiAweGMwMDApIDw8IDYpCi0JCXwgKChyZWxvY2F0aW9uID4+IDIpICYgMHgzZmZmKSk7Ci0JICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0KLQkgIGlmICgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPCAtIDB4NDAwMDAKLQkgICAgICB8fCAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPiAweDNmZmZmKQotCSAgICByID0gYmZkX3JlbG9jX292ZXJmbG93OwotCSAgZWxzZQotCSAgICByID0gYmZkX3JlbG9jX29rOwotCX0KLSAgICAgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX1NQQVJDX1JFVjMyKQotCXsKLQkgIGJmZF92bWEgeDsKLQotCSAgcmVsb2NhdGlvbiA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCi0JICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgeCA9IHggKyByZWxvY2F0aW9uOwotCSAgYmZkX3B1dGwzMiAoLyppbnB1dF9iZmQsKi8geCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JfQotICAgICAgZWxzZQotCXIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJICAgICAgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCk7Ci0KLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJICAgIHN5bS0+c3RfbmFtZSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0JCWlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCBkeW5hbWljIHN5bWJvbCBoYW5kbGluZy4gIFdlIHNldCB0aGUgY29udGVudHMgb2YgdmFyaW91cwotICAgZHluYW1pYyBzZWN0aW9ucyBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBiZmQgKmR5bm9iajsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBhc2VjdGlvbiAqc3JlbGE7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgU2V0Ci0gICAgICAgICBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICBQTFRfRU5UUllfV09SRDAgKyBoLT5wbHQub2Zmc2V0LAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIChQTFRfRU5UUllfV09SRDEKLQkJICAgKyAoKCgtIChoLT5wbHQub2Zmc2V0ICsgNCkpID4+IDIpICYgMHgzZmZmZmYpKSwKLQkJICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyA0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFBMVF9FTlRSWV9XT1JEMiwKLQkJICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyA4KTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGgtPnBsdC5vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfU1BBUkNfSk1QX1NMT1QpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyBoLT5wbHQub2Zmc2V0IC8gUExUX0VOVFJZX1NJWkUgLSA0KSk7Ci0KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbgotCSAgICAgdGhlIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCi0JICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotICAgICAgYXNlY3Rpb24gKnNyZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0Ci0gICAgICAgICB1cC4gICovCi0KLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwgJiYgc3JlbGEgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIChoLT5nb3Qub2Zmc2V0ICZ+IDEpKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIC1Cc3ltYm9saWMgbGluaywgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCSBsb2NhbGx5LCB3ZSBqdXN0IHdhbnQgdG8gZW1pdCBhIFJFTEFUSVZFIHJlbG9jLiAgTGlrZXdpc2UgaWYKLQkgdGhlIHN5bWJvbCB3YXMgZm9yY2VkIHRvIGJlIGxvY2FsIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuCi0JIFRoZSBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuCi0JIGluaXRpYWxpemVkIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQlyZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9TUEFSQ19SRUxBVElWRSk7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgaC0+Z290Lm9mZnNldCk7Ci0JICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9TUEFSQ19HTE9CX0RBVCk7Ci0JfQotCi0gICAgICByZWxhLnJfYWRkZW5kID0gMDsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgc3JlbGEtPmNvbnRlbnRzCi0JCQkJICArIHNyZWxhLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzcmVsYS0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9scyBuZWVkcyBhIGNvcHkgcmVsb2MuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkJCSAgICIucmVsYS5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX1NQQVJDX0NPUFkpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHMtPmNvbnRlbnRzCi0JCQkJICArIHMtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3MtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICAvKiBNYXJrIHNvbWUgc3BlY2lhbGx5IGRlZmluZWQgc3ltYm9scyBhcyBhYnNvbHV0ZS4gICovCi0gIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc2R5bjsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgYm9vbGVhbiBzaXplOwotCi0JICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgY2FzZSBEVF9QTFRHT1Q6ICAgbmFtZSA9ICIucGx0Ijsgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRSRUxTWjogbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gdHJ1ZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOiAgIG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgZGVmYXVsdDoJICBuYW1lID0gTlVMTDsgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgfQotCi0JICBpZiAobmFtZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnM7Ci0KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIGlmIChzID09IE5VTEwpCi0JCWR5bi5kX3VuLmRfdmFsID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISBzaXplKQotCQkgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZTsKLQkJICAgICAgZWxzZQotCQkJZHluLmRfdW4uZF92YWwgPSBzLT5fcmF3X3NpemU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBDbGVhciB0aGUgZmlyc3QgZm91ciBlbnRyaWVzIGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwKLQkgYW5kIHB1dCBhIG5vcCBpbiB0aGUgbGFzdCBmb3VyIGJ5dGVzLiAgKi8KLSAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPiAwKQotCXsKLQkgIG1lbXNldCAoc3BsdC0+Y29udGVudHMsIDAsIDQgKiBQTFRfRU5UUllfU0laRSk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTUEFSQ19OT1AsCi0JCSAgICAgIHNwbHQtPmNvbnRlbnRzICsgc3BsdC0+X3Jhd19zaXplIC0gNCk7Ci0JfQotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPQotCVBMVF9FTlRSWV9TSVpFOwotICAgIH0KLQotICAvKiBTZXQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHRvIHRoZSBhZGRyZXNzIG9mCi0gICAgIHRoZSBkeW5hbWljIHNlY3Rpb24uICAqLwotICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKHNkeW4gPT0gTlVMTCkKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMpOwotICAgICAgZWxzZQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHNnb3QtPmNvbnRlbnRzKTsKLSAgICB9Ci0KLSAgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLQotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZHluc3ltOwotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLSAgICAgIGludCBjOwotCi0gICAgICAvKiBTZXQgdXAgdGhlIHNlY3Rpb24gc3ltYm9scyBmb3IgdGhlIG91dHB1dCBzZWN0aW9ucy4gICovCi0KLSAgICAgIHNkeW5zeW0gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgQkZEX0FTU0VSVCAoc2R5bnN5bSAhPSBOVUxMKTsKLQotICAgICAgc3ltLnN0X3NpemUgPSAwOwotICAgICAgc3ltLnN0X25hbWUgPSAwOwotICAgICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfU0VDVElPTik7Ci0gICAgICBzeW0uc3Rfb3RoZXIgPSAwOwotCi0gICAgICBjID0gMDsKLSAgICAgIGZvciAocyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXsKLQkgIGludCBpbmR4OwotCi0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHggPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIHN5bS5zdF92YWx1ZSA9IHMtPnZtYTsKLQotCSAgaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2lkeDsKLQkgIEJGRF9BU1NFUlQgKGluZHggPiAwKTsKLQkgIHN5bS5zdF9zaG5keCA9IGluZHg7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKG91dHB1dF9iZmQsICZzeW0sCi0JCQkJICAgICAoUFRSKSAoKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCQkJICAgICBzZHluc3ltLT5jb250ZW50cykKLQkJCQkJICAgICsgZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHgpKTsKLQotCSAgKytjOwotCX0KLQotICAgICAgLyogU2V0IHRoZSBzaF9pbmZvIGZpZWxkIG9mIHRoZSBvdXRwdXQgLmR5bnN5bSBzZWN0aW9uIHRvIHRoZQotICAgICAgICAgaW5kZXggb2YgdGhlIGZpcnN0IGdsb2JhbCBzeW1ib2wuICAqLwotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2R5bnN5bS0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9pbmZvID0gYyArIDE7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggdGhlIGVfZmxhZ3MgZmllbGQuCi0KLSAgIFdlIGRvbid0IGRlZmluZSBzZXRfcHJpdmF0ZV9mbGFncyBvciBjb3B5X3ByaXZhdGVfYmZkX2RhdGEgYmVjYXVzZQotICAgdGhlIG9ubHkgY3VycmVudGx5IGRlZmluZWQgdmFsdWVzIGFyZSBiYXNlZCBvbiB0aGUgYmZkIG1hY2ggbnVtYmVyLAotICAgc28gd2UgdXNlIHRoZSBsYXR0ZXIgaW5zdGVhZCBhbmQgZGVmZXIgc2V0dGluZyBlX2ZsYWdzIHVudGlsIHRoZQotICAgZmlsZSBpcyB3cml0dGVuIG91dC4gICovCi0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgYm9vbGVhbiBlcnJvcjsKLSAgc3RhdGljIGludCBwcmV2aW91c19pYmZkX2VfZmxhZ3MgPSAtMTsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZXJyb3IgPSBmYWxzZTsKLQotI2lmIDAKLSAgLyogPz8/IFRoZSBuYXRpdmUgbGlua2VyIGRvZXNuJ3QgZG8gdGhpcyBzbyB3ZSBjYW4ndCAob3RoZXJ3aXNlIGdjYyB3b3VsZAotICAgICBoYXZlIHRvIGtub3cgd2hpY2ggbGlua2VyIGlzIGJlaW5nIHVzZWQpLiAgSW5zdGVhZCwgdGhlIG5hdGl2ZSBsaW5rZXIKLSAgICAgYnVtcHMgdXAgdGhlIGFyY2hpdGVjdHVyZSBsZXZlbCB3aGVuIGl0IGhhcyB0by4gIEhvd2V2ZXIsIEkgc3RpbGwgdGhpbmsKLSAgICAgd2FybmluZ3MgbGlrZSB0aGVzZSBhcmUgZ29vZCwgc28gaXQgd291bGQgYmUgbmljZSB0byBoYXZlIHRoZW0gdHVybmVkIG9uCi0gICAgIGJ5IHNvbWUgb3B0aW9uLiAgKi8KLQotICAvKiBJZiB0aGUgb3V0cHV0IG1hY2hpbmUgaXMgbm9ybWFsIHNwYXJjLCB3ZSBjYW4ndCBhbGxvdyB2OSBpbnB1dCBmaWxlcy4gICovCi0gIGlmIChiZmRfZ2V0X21hY2ggKG9iZmQpID09IGJmZF9tYWNoX3NwYXJjCi0gICAgICAmJiAoYmZkX2dldF9tYWNoIChpYmZkKSA9PSBiZmRfbWFjaF9zcGFyY192OHBsdXMKLQkgIHx8IGJmZF9nZXRfbWFjaCAoaWJmZCkgPT0gYmZkX21hY2hfc3BhcmNfdjhwbHVzYSkpCi0gICAgewotICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjb21waWxlZCBmb3IgYSB2OHBsdXMgc3lzdGVtIGFuZCB0YXJnZXQgaXMgdjgiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgIH0KLSAgLyogSWYgdGhlIG91dHB1dCBtYWNoaW5lIGlzIHY5LCB3ZSBjYW4ndCBhbGxvdyB2OSt2aXMgaW5wdXQgZmlsZXMuICAqLwotICBpZiAoYmZkX2dldF9tYWNoIChvYmZkKSA9PSBiZmRfbWFjaF9zcGFyY192OHBsdXMKLSAgICAgICYmIGJmZF9nZXRfbWFjaCAoaWJmZCkgPT0gYmZkX21hY2hfc3BhcmNfdjhwbHVzYSkKLSAgICB7Ci0gICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGNvbXBpbGVkIGZvciBhIHY4cGx1c2Egc3lzdGVtIGFuZCB0YXJnZXQgaXMgdjhwbHVzIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgICB9Ci0jZWxzZQotICBpZiAoYmZkX2dldF9tYWNoIChpYmZkKSA+PSBiZmRfbWFjaF9zcGFyY192OSkKLSAgICB7Ci0gICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGNvbXBpbGVkIGZvciBhIDY0IGJpdCBzeXN0ZW0gYW5kIHRhcmdldCBpcyAzMiBiaXQiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgIH0KLSAgZWxzZSBpZiAoYmZkX2dldF9tYWNoIChvYmZkKSA8IGJmZF9nZXRfbWFjaCAoaWJmZCkpCi0gICAgYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfZ2V0X21hY2ggKGliZmQpKTsKLSNlbmRpZgotCi0gIGlmICgoKGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzICYgRUZfU1BBUkNfTEVEQVRBKQotICAgICAgICE9IHByZXZpb3VzX2liZmRfZV9mbGFncykKLSAgICAgICYmIHByZXZpb3VzX2liZmRfZV9mbGFncyA+PSAwKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogbGlua2luZyBsaXR0bGUgZW5kaWFuIGZpbGVzIHdpdGggYmlnIGVuZGlhbiBmaWxlcyIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgICBlcnJvciA9IHRydWU7Ci0gICAgfQotICBwcmV2aW91c19pYmZkX2VfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncyAmIEVGX1NQQVJDX0xFREFUQTsKLQotICBpZiAoZXJyb3IpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfbWFjaGluZSA9PSBFTV9TUEFSQzMyUExVUykKLSAgICB7Ci0gICAgICBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ19TVU5fVVMxKQotCXJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9zcGFyYywKLQkJCQkJICBiZmRfbWFjaF9zcGFyY192OHBsdXNhKTsKLSAgICAgIGVsc2UgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfU1BBUkNfMzJQTFVTKQotCXJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9zcGFyYywKLQkJCQkJICBiZmRfbWFjaF9zcGFyY192OHBsdXMpOwotICAgICAgZWxzZQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfU1BBUkNfTEVEQVRBKQotICAgIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9zcGFyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlKTsKLSAgZWxzZQotICAgIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmMpOwotfQotCi0vKiBUaGUgZmluYWwgcHJvY2Vzc2luZyBkb25lIGp1c3QgYmVmb3JlIHdyaXRpbmcgb3V0IHRoZSBvYmplY3QgZmlsZS4KLSAgIFdlIG5lZWQgdG8gc2V0IHRoZSBlX21hY2hpbmUgZmllbGQgYXBwcm9wcmlhdGVseS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXI7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyYyA6Ci0gICAgICBicmVhazsgLyogbm90aGluZyB0byBkbyAqLwotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjhwbHVzIDoKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX21hY2hpbmUgPSBFTV9TUEFSQzMyUExVUzsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9TUEFSQ18zMlBMVVNfTUFTSzsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDXzMyUExVUzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjhwbHVzYSA6Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9tYWNoaW5lID0gRU1fU1BBUkMzMlBMVVM7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmPX4gRUZfU1BBUkNfMzJQTFVTX01BU0s7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRl9TUEFSQ18zMlBMVVMgfCBFRl9TUEFSQ19TVU5fVVMxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUgOgotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfbWFjaGluZSA9IEVNX1NQQVJDOwotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNfTEVEQVRBOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQwKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JYmZkX2VsZjMyX3NwYXJjX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJImVsZjMyLXNwYXJjIgotI2RlZmluZSBFTEZfQVJDSAliZmRfYXJjaF9zcGFyYwotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFIEVNX1NQQVJDCi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDEgRU1fU1BBUkMzMlBMVVMKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFIDB4MTAwMDAKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWVsZjMyX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQllbGYzMl9zcGFyY19pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCWVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wgXAotCQkJCQllbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wgXAotCQkJCQllbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQllbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotCQkJCQllbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQllbGYzMl9zcGFyY19vYmplY3RfcAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIFwKLQkJCQkJZWxmMzJfc3BhcmNfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgIGVsZjMyX3NwYXJjX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rICAgICAgIGVsZjMyX3NwYXJjX2djX3N3ZWVwX2hvb2sKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgMAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgMAotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gMQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUgNAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUgKDQqUExUX0VOVFJZX1NJWkUpCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi12ODUwLmMgYi9iZmQvZWxmMzItdjg1MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGQ0Yjc1Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi12ODUwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMwICswLDAgQEAKLS8qIFY4NTAtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotCi0vKiBYWFggRklYTUU6IFRoaXMgY29kZSBpcyBsaXR0ZXJlZCB3aXRoIDMyYml0IGludCwgMTZiaXQgc2hvcnQsIDhiaXQgY2hhcgotICAgZGVwZW5kZW5jaWVzLiAgQXMgaXMgdGhlIGdhcyAmIHNpbXVsYXRvciBjb2RlIG9yIHRoZSB2ODUwLiAgKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvdjg1MC5oIgotCi0vKiBzaWduLWV4dGVuZCBhIDI0LWJpdCBudW1iZXIgKi8KLSNkZWZpbmUgU0VYVDI0KHgpCSgoKCh4KSAmIDB4ZmZmZmZmKSBeICh+IDB4N2ZmZmZmKSkgKyAweDgwMDAwMCkKLSAgICAgIAotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnY4NTBfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIHY4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci1zdGF0aWMgdm9pZCB2ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbGEKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHY4NTBfZWxmX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIGludCwgYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfY2hlY2tfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgdm9pZCByZW1lbWJlcl9oaTE2c19yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotc3RhdGljIGJmZF9ieXRlICogZmluZF9yZW1lbWJlcmVkX2hpMTZzX3JlbG9jCi0gIFBBUkFNUyAoKGJmZF92bWEsIGJvb2xlYW4gKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBiZmRfdm1hLAotCSAgIGJmZF92bWEsIGJmZF92bWEsIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfb2JqZWN0X3AKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX2Zha2Vfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgdjg1MF9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKiwgaW50ICopKTsKLXN0YXRpYyB2b2lkIHY4NTBfZWxmX3N5bWJvbF9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX2FkZF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCSAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosIGFzZWN0aW9uICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9zZWN0aW9uX2Zyb21fc2hkcgotICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgY2hhciAqKSk7Ci0KLS8qIE5vdGU6IEl0IGlzIFJFUVVJUkVEIHRoYXQgdGhlICd0eXBlJyB2YWx1ZSBvZiBlYWNoIGVudHJ5IGluIHRoaXMgYXJyYXkKLSAgIG1hdGNoIHRoZSBpbmRleCBvZiB0aGUgZW50cnkgaW4gdGhlIGFycmF5LiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHY4NTBfZWxmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX1Y4NTBfTk9ORSwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9OT05FIiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgUEMgcmVsYXRpdmUgOSBiaXQgYnJhbmNoLiAqLwotICBIT1dUTyAoUl9WODUwXzlfUENSRUwsCQkvKiB0eXBlICovCi0JIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfOV9QQ1JFTCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMGZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIFBDIHJlbGF0aXZlIDIyIGJpdCBicmFuY2guICovCi0gIEhPV1RPIChSX1Y4NTBfMjJfUENSRUwsCQkvKiB0eXBlICovCi0JIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIyLAkJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDcsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwXzIyX1BDUkVMIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZmZmZjgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDdmZmZmODAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9WODUwX0hJMTZfUywJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfSEkxNl9TIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9ISTE2LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9ISTE2IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9MTzE2LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9MTzE2IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU2ltcGxlIDMyYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF8zMiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfMzIiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNpbXBsZSAxNmJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX1Y4NTBfMTYsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF8xNiIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNpbXBsZSA4Yml0IHJlbG9jLgkgKi8KLSAgSE9XVE8gKFJfVjg1MF84LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF84IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9TREFfMTZfMTZfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE1IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDEsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9TREFfMTVfMTZfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZSwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmUsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCwJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTUgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9aREFfMTVfMTZfT0ZGU0VULAkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAxLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfWkRBXzE1XzE2X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmUsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZlLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfVERBXzZfOF9PRkZTRVQsCQkvKiB0eXBlICovCi0JIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDEsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9UREFfNl84X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdlLAkJCQkvKiBzcmNfbWFzayAqLwotCSAweDdlLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1REQV83XzhfT0ZGU0VULAkJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfVERBXzdfOF9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogNyBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1REQV83XzdfT0ZGU0VULAkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA3LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfVERBXzdfN19PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlciEgICovCi0gIEhPV1RPIChSX1Y4NTBfVERBXzE2XzE2X09GRlNFVCwJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1REQV8xNl8xNl9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNSBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1REQV80XzVfT0ZGU0VULAkJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfVERBXzRfNV9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDQgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9UREFfNF80X09GRlNFVCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNCwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1REQV80XzRfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MGYsCQkJCS8qIHNyY19tYXNrICovCi0JIDB4MGYsCQkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VULAkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZTAwMjAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZlMDAyMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VULAkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVCIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZTAwMjAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZlMDAyMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VULAkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDcsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9DQUxMVF82XzdfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2YsCQkJCS8qIHNyY19tYXNrICovCi0JIDB4M2YsCQkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLSAgSE9XVE8gKFJfVjg1MF9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9WODUwX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9WODUwX0dOVV9WVEVOVFJZLCAgICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9WODUwX0dOVV9WVEVOVFJZIiwgICAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAKLX07Ci0KLS8qIE1hcCBCRkQgcmVsb2MgdHlwZXMgdG8gVjg1MCBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3Qgdjg1MF9lbGZfcmVsb2NfbWFwCi17Ci0gIC8qIEJGRF9SRUxPQ19WODUwX0NBTExUXzE2XzE2X09GRlNFVCBpcyAyNTgsIHdoaWNoIHdpbGwgbm90IGZpeCBpbiBhbgotICAgICB1bnNpZ25lZCBjaGFyLiAgKi8KLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgdjg1MF9lbGZfcmVsb2NfbWFwIHY4NTBfZWxmX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwJCVJfVjg1MF9OT05FIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfOV9QQ1JFTCwJUl9WODUwXzlfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF8yMl9QQ1JFTCwJUl9WODUwXzIyX1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX0hJMTZfUywJCVJfVjg1MF9ISTE2X1MgfSwKLSAgeyBCRkRfUkVMT0NfSEkxNiwJCVJfVjg1MF9ISTE2IH0sCi0gIHsgQkZEX1JFTE9DX0xPMTYsCQlSX1Y4NTBfTE8xNiB9LAotICB7IEJGRF9SRUxPQ18zMiwJCVJfVjg1MF8zMiB9LAotICB7IEJGRF9SRUxPQ18xNiwJCVJfVjg1MF8xNiB9LAotICB7IEJGRF9SRUxPQ184LAkJUl9WODUwXzggfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfT0ZGU0VULCBSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCB9LAotICB7IEJGRF9SRUxPQ19WODUwX1NEQV8xNV8xNl9PRkZTRVQsIFJfVjg1MF9TREFfMTVfMTZfT0ZGU0VUIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCwgUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9aREFfMTVfMTZfT0ZGU0VULCBSX1Y4NTBfWkRBXzE1XzE2X09GRlNFVCB9LAotICB7IEJGRF9SRUxPQ19WODUwX1REQV82XzhfT0ZGU0VULCAgIFJfVjg1MF9UREFfNl84X09GRlNFVCAgIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfVERBXzdfOF9PRkZTRVQsICAgUl9WODUwX1REQV83XzhfT0ZGU0VUICAgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9UREFfN183X09GRlNFVCwgICBSX1Y4NTBfVERBXzdfN19PRkZTRVQgICB9LAotICB7IEJGRF9SRUxPQ19WODUwX1REQV8xNl8xNl9PRkZTRVQsIFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VUIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfVERBXzRfNV9PRkZTRVQsICAgICAgICAgUl9WODUwX1REQV80XzVfT0ZGU0VUICAgICAgICAgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9UREFfNF80X09GRlNFVCwgICAgICAgICBSX1Y4NTBfVERBXzRfNF9PRkZTRVQgICAgICAgICB9LAotICB7IEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQsIFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVCwgUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9DQUxMVF82XzdfT0ZGU0VULCAgICAgICBSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCAgICAgICB9LAotICB7IEJGRF9SRUxPQ19WODUwX0NBTExUXzE2XzE2X09GRlNFVCwgICAgIFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQgICAgIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCAgICAgICAgICAgICAgIFJfVjg1MF9HTlVfVlRJTkhFUklUIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgICAgICAgICAgICAgICAgIFJfVjg1MF9HTlVfVlRFTlRSWSB9LAotCi19OwotCi0MCi0vKiBNYXAgYSBiZmQgcmVsb2NhdGlvbiBpbnRvIHRoZSBhcHByb3ByaWF0ZSBob3d0byBzdHJ1Y3R1cmUgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXY4NTBfZWxmX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgICBpIDwgc2l6ZW9mICh2ODUwX2VsZl9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3Qgdjg1MF9lbGZfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKHY4NTBfZWxmX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JewotCSAgQkZEX0FTU0VSVCAodjg1MF9lbGZfaG93dG9fdGFibGVbdjg1MF9lbGZfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdLnR5cGUgPT0gdjg1MF9lbGZfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWwpOwotCSAgCi0JICByZXR1cm4gJiB2ODUwX2VsZl9ob3d0b190YWJsZVt2ODUwX2VsZl9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotDAotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBWODUwIEVMRiByZWxvYy4gICovCi1zdGF0aWMgdm9pZAotdjg1MF9lbGZfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgYXJlbGVudCAqICAgICAgICAgICAgIGNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICogIGRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9WODUwX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmdjg1MF9lbGZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhIFY4NTAgRUxGIHJlbG9jICh0eXBlIFJFTEEpLiAqLwotc3RhdGljIHZvaWQKLXY4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsYSAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICBhYmZkOwotICAgICBhcmVsZW50ICogICAgICAgICAgICAgY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICAgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9WODUwX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmdjg1MF9lbGZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotDAotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKLSAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIG9yIHByb2NlZHVyZSBsaW5rYWdlCi0gICB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgICBhYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICAgICBpbmZvOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICBzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogIHJlbG9jczsKLXsKLSAgYm9vbGVhbiByZXQgPSB0cnVlOwotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIGVudW0gdjg1MF9yZWxvY190eXBlIHJfdHlwZTsKLSAgaW50IG90aGVyID0gMDsKLSAgY29uc3QgY2hhciAqY29tbW9uID0gKGNvbnN0IGNoYXIgKikwOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJ2ODUwX2VsZl9jaGVja19yZWxvY3MgY2FsbGVkIGZvciBzZWN0aW9uICVzIGluICVzXG4iLAotCSAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSNlbmRpZgotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgcl90eXBlID0gKGVudW0gdjg1MF9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQlkZWZhdWx0OgotCWNhc2UgUl9WODUwX05PTkU6Ci0JY2FzZSBSX1Y4NTBfOV9QQ1JFTDoKLQljYXNlIFJfVjg1MF8yMl9QQ1JFTDoKLQljYXNlIFJfVjg1MF9ISTE2X1M6Ci0JY2FzZSBSX1Y4NTBfSEkxNjoKLQljYXNlIFJfVjg1MF9MTzE2OgotCWNhc2UgUl9WODUwXzMyOgotCWNhc2UgUl9WODUwXzE2OgotCWNhc2UgUl9WODUwXzg6Ci0JY2FzZSBSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVDoKLQljYXNlIFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQ6Ci0JICBicmVhazsKLQotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0gICAgICAgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX1Y4NTBfR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9WODUwX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQotCWNhc2UgUl9WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQ6Ci0JY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVDoKLQljYXNlIFJfVjg1MF9TREFfMTVfMTZfT0ZGU0VUOgotCSAgb3RoZXIgPSBWODUwX09USEVSX1NEQTsKLQkgIGNvbW1vbiA9ICIuc2NvbW1vbiI7Ci0JICBnb3RvIHNtYWxsX2RhdGFfY29tbW9uOwotCSAgCi0JY2FzZSBSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVDoKLQljYXNlIFJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQ6Ci0JICBvdGhlciA9IFY4NTBfT1RIRVJfWkRBOwotCSAgY29tbW9uID0gIi56Y29tbW9uIjsKLQkgIGdvdG8gc21hbGxfZGF0YV9jb21tb247Ci0JICAKLQljYXNlIFJfVjg1MF9UREFfNF81X09GRlNFVDoKLQljYXNlIFJfVjg1MF9UREFfNF80X09GRlNFVDoKLQljYXNlIFJfVjg1MF9UREFfNl84X09GRlNFVDoKLQljYXNlIFJfVjg1MF9UREFfN184X09GRlNFVDoKLQljYXNlIFJfVjg1MF9UREFfN183X09GRlNFVDoKLQljYXNlIFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VUOgotCSAgb3RoZXIgPSBWODUwX09USEVSX1REQTsKLQkgIGNvbW1vbiA9ICIudGNvbW1vbiI7Ci0JICAvKiBmYWxsIHRocm91Z2ggKi8KLQotI2RlZmluZSBWODUwX09USEVSX01BU0sgKFY4NTBfT1RIRVJfVERBIHwgVjg1MF9PVEhFUl9TREEgfCBWODUwX09USEVSX1pEQSkKLQotCXNtYWxsX2RhdGFfY29tbW9uOgotCSAgaWYgKGgpCi0JICAgIHsKLQkgICAgICBoLT5vdGhlciB8PSBvdGhlcjsJLyogZmxhZyB3aGljaCB0eXBlIG9mIHJlbG9jYXRpb24gd2FzIHVzZWQgKi8KLQkgICAgICBpZiAoKGgtPm90aGVyICYgVjg1MF9PVEhFUl9NQVNLKSAhPSAob3RoZXIgJiBWODUwX09USEVSX01BU0spCi0JCSAgJiYgKGgtPm90aGVyICYgVjg1MF9PVEhFUl9FUlJPUikgPT0gMCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKiBtc2c7Ci0JCSAgc3RhdGljIGNoYXIgIGJ1ZmZbMjAwXTsgLyogWFhYICovCi0KLQkJICBzd2l0Y2ggKGgtPm90aGVyICYgVjg1MF9PVEhFUl9NQVNLKQotCQkgICAgewotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgbXNnID0gXygiVmFyaWFibGUgYCVzJyBjYW5ub3Qgb2NjdXB5IGluIG11bHRpcGxlIHNtYWxsIGRhdGEgcmVnaW9ucyIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgVjg1MF9PVEhFUl9TREEgfCBWODUwX09USEVSX1pEQSB8IFY4NTBfT1RIRVJfVERBOgotCQkgICAgICBtc2cgPSBfKCJWYXJpYWJsZSBgJXMnIGNhbiBvbmx5IGJlIGluIG9uZSBvZiB0aGUgc21hbGwsIHplcm8sIGFuZCB0aW55IGRhdGEgcmVnaW9ucyIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgVjg1MF9PVEhFUl9TREEgfCBWODUwX09USEVSX1pEQToKLQkJICAgICAgbXNnID0gXygiVmFyaWFibGUgYCVzJyBjYW5ub3QgYmUgaW4gYm90aCBzbWFsbCBhbmQgemVybyBkYXRhIHJlZ2lvbnMgc2ltdWx0YW5lb3VzbHkiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIFY4NTBfT1RIRVJfU0RBIHwgVjg1MF9PVEhFUl9UREE6Ci0JCSAgICAgIG1zZyA9IF8oIlZhcmlhYmxlIGAlcycgY2Fubm90IGJlIGluIGJvdGggc21hbGwgYW5kIHRpbnkgZGF0YSByZWdpb25zIHNpbXVsdGFuZW91c2x5Iik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBWODUwX09USEVSX1pEQSB8IFY4NTBfT1RIRVJfVERBOgotCQkgICAgICBtc2cgPSBfKCJWYXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBpbiBib3RoIHplcm8gYW5kIHRpbnkgZGF0YSByZWdpb25zIHNpbXVsdGFuZW91c2x5Iik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCi0JCSAgc3ByaW50ZiAoYnVmZiwgbXNnLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQkJICBpbmZvLT5jYWxsYmFja3MtPndhcm5pbmcgKGluZm8sIGJ1ZmYsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJCSAgICBhYmZkLCBoLT5yb290LnUuZGVmLnNlY3Rpb24sIDApOwotCi0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgaC0+b3RoZXIgfD0gVjg1MF9PVEhFUl9FUlJPUjsKLQkJICByZXQgPSBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChoICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCSAgICAgICYmIGgtPnJvb3QudS5jLnAKLQkgICAgICAmJiAhc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgaC0+cm9vdC51LmMucC0+c2VjdGlvbiksICJDT01NT04iKSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWN0aW9uID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgY29tbW9uKTsKLQkgICAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotCSAgICB9Ci0KLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAidjg1MF9lbGZfY2hlY2tfcmVsb2NzLCBmb3VuZCAlcyByZWxvY2F0aW9uIGZvciAlcyVzXG4iLAotCQkgICB2ODUwX2VsZl9ob3d0b190YWJsZVsgKGludClyX3R5cGUgXS5uYW1lLAotCQkgICAoaCAmJiBoLT5yb290LnJvb3Quc3RyaW5nKSA/IGgtPnJvb3Qucm9vdC5zdHJpbmcgOiAiPHVua25vd24+IiwKLQkJICAgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikgPyAiLCBzeW1ib2wgaXMgY29tbW9uIiA6ICIiKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKgotICogSW4gdGhlIG9sZCB2ZXJzaW9uLCB3aGVuIGFuIGVudHJ5IHdhcyBjaGVja2VkIG91dCBmcm9tIHRoZSB0YWJsZSwKLSAqIGl0IHdhcyBkZWxldGVkLiAgVGhpcyBwcm9kdWNlZCBhbiBlcnJvciBpZiB0aGUgZW50cnkgd2FzIG5lZWRlZAotICogbW9yZSB0aGFuIG9uY2UsIGFzIHRoZSBzZWNvbmQgYXR0ZW1wdGVkIHJldHJ5IGZhaWxlZC4KLSAqCi0gKiBJbiB0aGUgY3VycmVudCB2ZXJzaW9uLCB0aGUgZW50cnkgaXMgbm90IGRlbGV0ZWQsIGluc3RlYWQgd2Ugc2V0Ci0gKiB0aGUgZmllbGQgJ2ZvdW5kJyB0byB0cnVlLiAgSWYgYSBzZWNvbmQgbG9va3VwIG1hdGNoZXMgdGhlIHNhbWUKLSAqIGVudHJ5LCB0aGVuIHdlIGtub3cgdGhhdCB0aGUgaGkxNnMgcmVsb2MgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkCi0gKiBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSB1cGRhdGVkIGEgc2Vjb25kIHRpbWUuCi0gKgotICogVE9ETyAtIFRPRklYOiBJZiBpdCBpcyBwb3NzaWJsZSB0aGF0IHdlIG5lZWQgdG8gcmVzdG9yZSAyIGRpZmZlcmVudAotICogYWRkcmVzc2VzIGZyb20gdGhlIHNhbWUgdGFibGUgZW50cnksIHdoZXJlIHRoZSBmaXJzdCBnZW5lcmF0ZXMgYW4KLSAqIG92ZXJmbG93LCB3aGlsc3QgdGhlIHNlY29uZCBkbyBub3QsIHRoZW4gdGhpcyBjb2RlIHdpbGwgZmFpbC4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBoaTE2c19sb2NhdGlvbgotewotICBiZmRfdm1hICAgICAgIGFkZGVuZDsKLSAgYmZkX2J5dGUgKiAgICBhZGRyZXNzOwotICB1bnNpZ25lZCBsb25nIGNvdW50ZXI7Ci0gIGJvb2xlYW4gICAgICAgZm91bmQ7Ci0gIHN0cnVjdCBoaTE2c19sb2NhdGlvbiAqIG5leHQ7Ci19Ci1oaTE2c19sb2NhdGlvbjsKLQotc3RhdGljIGhpMTZzX2xvY2F0aW9uICogIHByZXZpb3VzX2hpMTZzOwotc3RhdGljIGhpMTZzX2xvY2F0aW9uICogIGZyZWVfaGkxNnM7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyAgICAgaGkxNnNfY291bnRlcjsKLQotc3RhdGljIHZvaWQKLXJlbWVtYmVyX2hpMTZzX3JlbG9jIChhYmZkLCBhZGRlbmQsIGFkZHJlc3MpCi0gICAgIGJmZCAqICAgICAgYWJmZDsKLSAgICAgYmZkX3ZtYSAgICBhZGRlbmQ7Ci0gICAgIGJmZF9ieXRlICogYWRkcmVzczsKLXsKLSAgaGkxNnNfbG9jYXRpb24gKiBlbnRyeSA9IE5VTEw7Ci0gIAotICAvKiBGaW5kIGEgZnJlZSBzdHJ1Y3R1cmUuICAqLwotICBpZiAoZnJlZV9oaTE2cyA9PSBOVUxMKQotICAgIGZyZWVfaGkxNnMgPSAoaGkxNnNfbG9jYXRpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICgqIGZyZWVfaGkxNnMpKTsKLQotICBlbnRyeSAgICAgID0gZnJlZV9oaTE2czsKLSAgZnJlZV9oaTE2cyA9IGZyZWVfaGkxNnMtPm5leHQ7Ci0gIAotICBlbnRyeS0+YWRkZW5kICA9IGFkZGVuZDsKLSAgZW50cnktPmFkZHJlc3MgPSBhZGRyZXNzOwotICBlbnRyeS0+Y291bnRlciA9IGhpMTZzX2NvdW50ZXIgKys7Ci0gIGVudHJ5LT5mb3VuZCAgID0gZmFsc2U7Ci0gIGVudHJ5LT5uZXh0ICAgID0gcHJldmlvdXNfaGkxNnM7Ci0gIHByZXZpb3VzX2hpMTZzID0gZW50cnk7Ci0gIAotICAvKiBDb3BlIHdpdGggd3JhcCBhcm91bmQgb2Ygb3VyIGNvdW50ZXIuICAqLwotICBpZiAoaGkxNnNfY291bnRlciA9PSAwKQotICAgIHsKLSAgICAgIC8qIFhYWCAtIEFzc3VtZSB0aGF0IGFsbCBjb3VudGVyIGVudHJpZXMgZGlmZmVyIG9ubHkgaW4gdGhlaXIgbG93IDE2IGJpdHMuICAqLwotICAgICAgZm9yIChlbnRyeSA9IHByZXZpb3VzX2hpMTZzOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQotCWVudHJ5LT5jb3VudGVyICY9IDB4ZmZmZjsKLQotICAgICAgaGkxNnNfY291bnRlciA9IDB4MTAwMDA7Ci0gICAgfQotICAKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgYmZkX2J5dGUgKgotZmluZF9yZW1lbWJlcmVkX2hpMTZzX3JlbG9jIChhZGRlbmQsIGFscmVhZHlfZm91bmQpCi0gICAgIGJmZF92bWEgICBhZGRlbmQ7Ci0gICAgIGJvb2xlYW4gKiBhbHJlYWR5X2ZvdW5kOwotewotICBoaTE2c19sb2NhdGlvbiAqIG1hdGNoID0gTlVMTDsKLSAgaGkxNnNfbG9jYXRpb24gKiBlbnRyeTsKLSAgaGkxNnNfbG9jYXRpb24gKiBwcmV2aW91cyA9IE5VTEw7Ci0gIGhpMTZzX2xvY2F0aW9uICogcHJldjsKLSAgaW50ICAgICAgICAgICAgICBpOwotICBiZmRfYnl0ZSAqICAgICAgIGFkZHI7Ci0gIAotICAvKiBTZWFyY2ggdGhlIHRhYmxlLiAgUmVjb3JkIHRoZSBtb3N0IHJlY2VudCBlbnRyeSB0aGF0IG1hdGNoZXMuICAqLwotICBmb3IgKGVudHJ5ID0gcHJldmlvdXNfaGkxNnM7IGVudHJ5OyBlbnRyeSA9IGVudHJ5LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChlbnRyeS0+YWRkZW5kID09IGFkZGVuZAotCSAgJiYgKG1hdGNoID09IE5VTEwgfHwgbWF0Y2gtPmNvdW50ZXIgPCBlbnRyeS0+Y291bnRlcikpCi0JewotCSAgcHJldmlvdXMgPSBwcmV2OwotCSAgbWF0Y2ggICAgPSBlbnRyeTsKLQl9Ci0gICAgICAKLSAgICAgIHByZXYgPSBlbnRyeTsKLSAgICB9Ci0KLSAgaWYgKG1hdGNoID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogRXh0cmFjdCB0aGUgYWRkcmVzcy4gICovCi0gIGFkZHIgPSBtYXRjaC0+YWRkcmVzczsKLQotICAvKiBSZW1lYmVyIGlmIHRoaXMgZW50cnkgaGFzIGFscmVhZHkgYmVlbiB1c2VkIGJlZm9yZS4gICovCi0gIGlmIChhbHJlYWR5X2ZvdW5kKQotICAgICogYWxyZWFkeV9mb3VuZCA9IG1hdGNoLT5mb3VuZDsKLQotICAvKiBOb3RlIHRoYXQgdGhpcyBlbnRyeSBoYXMgbm93IGJlZW4gdXNlZC4gICovCi0gIG1hdGNoLT5mb3VuZCA9IHRydWU7Ci0gIAotICByZXR1cm4gYWRkcjsKLX0gICAgIAotCi0vKiBGSVhNRTogIFRoZSBjb2RlIGhlcmUgcHJvYmFibHkgb3VnaHQgdG8gYmUgcmVtb3ZlZCBhbmQgdGhlIGNvZGUgaW4gcmVsb2MuYwotICAgYWxsb3dlZCB0byBkbyBpdHMgIHN0dWZmIGluc3RlYWQuICBBdCBsZWFzdCBmb3IgbW9zdCBvZiB0aGUgcmVsb2NzLCBhbnd5YXkuICAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uIChhYmZkLCByX3R5cGUsIGFkZGVuZCwgYWRkcmVzcykKLSAgICAgYmZkICogICAgICBhYmZkOwotICAgICBpbnQgICAgICAgIHJfdHlwZTsKLSAgICAgYmZkX3ZtYSAgICBhZGRlbmQ7Ci0gICAgIGJmZF9ieXRlICogYWRkcmVzczsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBiZmRfc2lnbmVkX3ZtYSBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gIAotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIGZwcmludGYgKHN0ZGVyciwgInJlbG9jIHR5cGUgJWQgbm90IFNVUFBPUlRFRFxuIiwgcl90eXBlICk7ICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwXzMyOgotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgYWRkZW5kLCBhZGRyZXNzKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF8yMl9QQ1JFTDoKLSAgICAgIGlmIChzYWRkZW5kID4gMHgxZmZmZmYgfHwgc2FkZGVuZCA8IC0weDIwMDAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoKGFkZGVuZCAlIDIpICE9IDApCi0JcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgICAKLSAgICAgIGluc24gID0gYmZkX2dldF8zMiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBpbnNuICY9IH4weGZmZmUwMDNmOwotICAgICAgaW5zbiB8PSAoKChhZGRlbmQgJiAweGZmZmUpIDw8IDE2KSB8ICgoYWRkZW5kICYgMHgzZjAwMDApID4+IDE2KSk7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBhZGRyZXNzKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF85X1BDUkVMOgotICAgICAgaWYgKHNhZGRlbmQgPiAweGZmIHx8IHNhZGRlbmQgPCAtMHgxMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaWYgKChhZGRlbmQgJSAyKSAhPSAwKQotCXJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotICAgICAgCi0gICAgICBpbnNuICA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgaW5zbiAmPSB+IDB4Zjg3MDsKLSAgICAgIGluc24gfD0gKChhZGRlbmQgJiAweDFmMCkgPDwgNykgfCAoKGFkZGVuZCAmIDB4MGUpIDw8IDMpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9ISTE2OgotICAgICAgYWRkZW5kICs9IChiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKSA8PCAxNik7Ci0gICAgICBhZGRlbmQgPSAoYWRkZW5kID4+IDE2KTsKLSAgICAgIGluc24gPSBhZGRlbmQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX0hJMTZfUzoKLSAgICAgIC8qIFJlbWVtYmVyIHdoZXJlIHRoaXMgcmVsb2NhdGlvbiB0b29rIHBsYWNlLiAgKi8KLSAgICAgIHJlbWVtYmVyX2hpMTZzX3JlbG9jIChhYmZkLCBhZGRlbmQsIGFkZHJlc3MpOwotCi0gICAgICBhZGRlbmQgKz0gKGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpIDw8IDE2KTsKLSAgICAgIGFkZGVuZCA9IChhZGRlbmQgPj4gMTYpICsgKChhZGRlbmQgJiAweDgwMDApICE9IDApOwotICAgICAgCi0gICAgICAvKiBUaGlzIHJlbG9jYXRpb24gY2Fubm90IG92ZXJmbG93LiAqLwotICAgICAgaWYgKGFkZGVuZCA+IDB4N2ZmZikKLQlhZGRlbmQgPSAwOwotICAgICAgCi0gICAgICBpbnNuID0gYWRkZW5kOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9MTzE2OgotICAgICAgLyogQ2FsY3VsYXRlIHRoZSBzdW0gb2YgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gYW5kIHRoZQotCSBhZGRlbmQgYW5kIGNoZWNrIGZvciBvdmVyZmxvdyBmcm9tIHRoZSBsb3cgMTYgYml0cyBpbnRvIHRoZSBoaWdoCi0JIDE2IGJpdHMuICBUaGUgYXNzZW1ibGVyIGhhcyBhbHJlYWR5IGRvbmUgc29tZSBvZiB0aGlzOiAgSWYgdGhlCi0JIHZhbHVlIHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGl0cyAxNXRoIGJpdCBzZXQsIChjb3VudGluZwotCSBmcm9tIHplcm8pIHRoZW4gdGhlIGFzc2VtYmxlciB3aWxsIGhhdmUgYWRkZWQgMSB0byB0aGUgdmFsdWUKLQkgc3RvcmVkIGluIHRoZSBhc3NvY2lhdGVkIEhJMTZTIHJlbG9jLiAgU28gZm9yIGV4YW1wbGUsIHRoZXNlCi0JIHJlbG9jYXRpb25zOgotCi0JICAgICBtb3ZoaSBoaSggZnJlZCApLCByMCwgcjEKLQkgICAgIG1vdmVhIGxvKCBmcmVkICksIHIxLCByMQotCi0JIHdpbGwgc3RvcmUgMCBpbiB0aGUgdmFsdWUgZmllbGRzIGZvciB0aGUgTU9WSEkgYW5kIE1PVkVBIGluc3RydWN0aW9ucwotCSBhbmQgYWRkZW5kIHdpbGwgYmUgdGhlIGFkZHJlc3Mgb2YgZnJlZCwgYnV0IGZvciB0aGVzZSBpbnN0cnVjdGlvbnM6Ci0KLQkgICAgIG1vdmhpIGhpKCBmcmVkICsgMHgxMjM0NTYpLCByMCwgcjEKLQkgICAgIG1vdmVhIGxvKCBmcmVkICsgMHgxMjM0NTYpLCByMSwgcjEKLQotCSB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBNT1ZISSBpbnN0cnVjdGlvbiB3aWxsIGJlIDB4MTIgYW5kIHRoZSB2YWx1ZQotCSBzdG9yZWQgaW4gdGhlIE1PVkVBIGluc3RydWN0aW9uIHdpbGwgYmUgMHgzNDU2LiAgSWYgaG93ZXZlciB0aGUKLQkgaW5zdHJ1Y3Rpb25zIHdlcmU6Ci0KLQkgICAgIG1vdmhpIGhpKCBmcmVkICsgMHgxMGZmZmYpLCByMCwgcjEKLQkgICAgIG1vdmVhIGxvKCBmcmVkICsgMHgxMGZmZmYpLCByMSwgcjEKLQotCSB0aGVuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIE1PVkhJIGluc3RydWN0aW9uIHdvdWxkIGJlIDB4MTEgKG5vdAotCSAweDEwKSBhbmQgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgTU9WRUEgaW5zdHJ1Y3Rpb24gd291bGQgYmUgMHhmZmZmLgotCSBUaHVzIChhc3N1bWluZyBmb3IgdGhlIG1vbWVudCB0aGF0IHRoZSBhZGRlbmQgaXMgMCksIGF0IHJ1biB0aW1lIHRoZQotCSBNT1ZISSBpbnN0cnVjdGlvbiBsb2FkcyAweDExMDAwMCBpbnRvIHIxLCB0aGVuIHRoZSBNT1ZFQSBpbnN0cnVjdGlvbgotCSBhZGRzIDB4ZmZmZmZmZmYgKHNpZ24gZXh0ZW5zaW9uISkgcHJvZHVjaW5nIDB4MTBmZmZmLiAgU2ltaWxhcmx5IGlmCi0JIHRoZSBpbnN0cnVjdGlvbnMgd2VyZToKLQotCSAgICAgbW92aGkgaGkoIGZyZWQgLSAxKSwgcjAsIHIxCi0JICAgICBtb3ZlYSBsbyggZnJlZCAtIDEpLCByMSwgcjEKLQotCSB0aGVuIDAgaXMgc3RvcmVkIGluIHRoZSBNT1ZISSBpbnN0cnVjdGlvbiBhbmQgLTEgaXMgc3RvcmVkIGluIHRoZQotCSBNT1ZFQSBpbnN0cnVjdGlvbi4KLQotCSBPdmVyZmxvdyBjYW4gb2NjdXIgaWYgdGhlIGFkZGl0aW9uIG9mIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlCi0JIGluc3RydWN0aW9uIHBsdXMgdGhlIGFkZGVuZCBzZXRzIHRoZSAxNXRoIGJpdCB3aGVuIGJlZm9yZSBpdCB3YXMgY2xlYXIuCi0JIFRoaXMgaXMgYmVjYXVzZSB0aGUgMTV0aCBiaXQgd2lsbCBiZSBzaWduIGV4dGVuZGVkIGludG8gdGhlIGhpZ2ggcGFydCwKLQkgdGh1cyByZWR1Y2luZyBpdHMgdmFsdWUgYnkgb25lLCBidXQgc2luY2UgdGhlIDE1dGggYml0IHdhcyBvcmlnaW5hbGx5Ci0JIGNsZWFyLCB0aGUgYXNzZW1ibGVyIHdpbGwgbm90IGhhdmUgYWRkZWQgMSB0byB0aGUgcHJldmlvdXMgSEkxNlMgcmVsb2MKLQkgdG8gY29tcGVuc2F0ZSBmb3IgdGhpcyBlZmZlY3QuICBGb3IgZXhhbXBsZToKLQotCSAgICBtb3ZoaSBoaSggZnJlZCArIDB4MTIzNDU2KSwgcjAsIHIxCi0JICAgIG1vdmVhIGxvKCBmcmVkICsgMHgxMjM0NTYpLCByMSwgcjEKLQotCSBUaGUgdmFsdWUgc3RvcmVkIGluIEhJMTZTIHJlbG9jIGlzIDB4MTIsIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIExPMTYKLQkgcmVsb2MgaXMgMHgzNDU2LiAgSWYgd2UgYXNzdW1lIHRoYXQgdGhlIGFkZHJlc3Mgb2YgZnJlZCBpcyAweDAwMDA3MDAwCi0JIHRoZW4gdGhlIHJlbG9jYXRpb25zIGJlY29tZToKLQotCSAgIEhJMTZTOiAweDAwMTIgKyAoMHgwMDAwNzAwMCA+PiAxNikgICAgPSAweDEyCi0JICAgTE8xNjogIDB4MzQ1NiArICgweDAwMDA3MDAwICYgMHhmZmZmKSA9IDB4YTQ1NgotCi0JIGJ1dCB3aGVuIHRoZSBpbnN0cnVjdGlvbnMgYXJlIGV4ZWN1dGVkLCB0aGUgTU9WRUEgaW5zdHJ1Y3Rpb24ncyB2YWx1ZQotCSBpcyBzaWduZWQgZXh0ZW5kZWQsIHNvIHRoZSBzdW0gYmVjb21lczoKLQotCSAgICAgIDB4MDAxMjAwMDAKLQkgICAgKyAweGZmZmZhNDU2Ci0JICAgIC0tLS0tLS0tLS0tLQotCSAgICAgIDB4MDAxMWE0NTYgICAgYnV0ICdmcmVkICsgMHgxMjM0NTYnID0gMHgwMDEyYTQ1NgotCi0JIE5vdGUgdGhhdCBpZiB0aGUgMTV0aCBiaXQgd2FzIHNldCBpbiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBMTzE2Ci0JIHJlbG9jLCB0aGVuIHdlIGRvIG5vdCBoYXZlIHRvIGRvIGFueXRoaW5nOgotCi0JICAgIG1vdmhpIGhpKCBmcmVkICsgMHgxMGZmZmYpLCByMCwgcjEKLQkgICAgbW92ZWEgbG8oIGZyZWQgKyAweDEwZmZmZiksIHIxLCByMQotCi0JICAgIEhJMTZTOiAgMHgwMDExICsgKDB4MDAwMDcwMDAgPj4gMTYpICAgID0gMHgxMQotCSAgICBMTzE2OiAgIDB4ZmZmZiArICgweDAwMDA3MDAwICYgMHhmZmZmKSA9IDB4NmZmZgotCi0JICAgICAgMHgwMDExMDAwMAotCSAgICArIDB4MDAwMDZmZmYKLQkgICAgLS0tLS0tLS0tLS0tCi0JICAgICAgMHgwMDExNmZmZiAgPSBmcmVkICsgMHgxMGZmZmYgPSAweDcwMDAgKyAweDEwZmZmZgotCi0JIAotCSBPdmVyZmxvdyBjYW4gYWxzbyBvY2N1ciBpZiB0aGUgY29tcHV0YXRpb24gY2FycmllcyBpbnRvIHRoZSAxNnRoIGJpdAotCSBhbmQgaXQgYWxzbyByZXN1bHRzIGluIHRoZSAxNXRoIGJpdCBoYXZpbmcgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIDE1dGgKLQkgYml0IG9mIHRoZSBvcmlnaW5hbCB2YWx1ZS4gICBXaGF0IGhhcHBlbnMgaXMgdGhhdCB0aGUgSEkxNlMgcmVsb2MKLQkgd2lsbCBoYXZlIGFscmVhZHkgZXhhbWluZWQgdGhlIDE1dGggYml0IG9mIHRoZSBvcmlnaW5hbCB2YWx1ZSBhbmQKLQkgYWRkZWQgMSB0byB0aGUgaGlnaCBwYXJ0IGlmIHRoZSBiaXQgaXMgc2V0LiAgVGhpcyBjb21wZW5zYXRlcyBmb3IgdGhlCi0JIHNpZ24gZXh0ZW5zaW9uIG9mIDE1dGggYml0IG9mIHRoZSByZXN1bHQgb2YgdGhlIGNvbXB1dGF0aW9uLiAgQnV0IG5vdwotCSB0aGVyZSBpcyBhIGNhcnJ5IGludG8gdGhlIDE2dGggYml0LCBhbmQgdGhpcyBoYXMgbm90IGJlZW4gYWxsb3dlZCBmb3IuCi0KLQkgU28sIGZvciBleGFtcGxlIGlmIGZyZWQgaXMgYXQgYWRkcmVzcyAweGYwMDA6Ci0KLQkgICBtb3ZoaSBoaSggZnJlZCArIDB4ZmZmZiksIHIwLCByMSAgICBbYml0IDE1IG9mIHRoZSBvZmZzZXQgaXMgc2V0XQotCSAgIG1vdmVhIGxvKCBmcmVkICsgMHhmZmZmKSwgcjEsIHIxCi0KLQkgICBISTE2UzogMHgwMDAxICsgKDB4MDAwMGYwMDAgPj4gMTYpICAgID0gMHgwMDAxCi0JICAgTE8xNjogIDB4ZmZmZiArICgweDAwMDBmMDAwICYgMHhmZmZmKSA9IDB4ZWZmZiAgIChjYXJyeSBpbnRvIGJpdCAxNiBpcyBsb3N0KQotCi0JICAgICAweDAwMDEwMDAwCi0JICAgKyAweGZmZmZlZmZmCi0JICAgLS0tLS0tLS0tLS0tCi0JICAgICAweDAwMDBlZmZmICAgYnV0ICdmcmVkICsgMHhmZmZmJyA9IDB4MDAwMWVmZmYKLQotCSBTaW1pbGFybHksIGlmIHRoZSAxNXRoIGJpdCByZW1haW5zIGNsZWFyLCBidXQgb3ZlcmZsb3cgb2NjdXJzIGludG8KLQkgdGhlIDE2dGggYml0IHRoZW4gKGFzc3VtaW5nIHRoZSBhZGRyZXNzIG9mIGZyZWQgaXMgMHhmMDAwKToKLQotCSAgIG1vdmhpIGhpKCBmcmVkICsgMHg3MDAwKSwgcjAsIHIxICAgIFtiaXQgMTUgb2YgdGhlIG9mZnNldCBpcyBjbGVhcl0KLQkgICBtb3ZlYSBsbyggZnJlZCArIDB4NzAwMCksIHIxLCByMQotCi0JICAgSEkxNlM6IDB4MDAwMCArICgweDAwMDBmMDAwID4+IDE2KSAgICA9IDB4MDAwMAotCSAgIExPMTY6ICAweDcwMDAgKyAoMHgwMDAwZjAwMCAmIDB4ZmZmZikgPSAweDZmZmYgIChjYXJyeSBpbnRvIGJpdCAxNiBpcyBsb3N0KQotCi0JICAgICAweDAwMDAwMDAwCi0JICAgKyAweDAwMDA2ZmZmCi0JICAgLS0tLS0tLS0tLS0tCi0JICAgICAweDAwMDA2ZmZmICAgYnV0ICdmcmVkICsgMHg3MDAwJyA9IDB4MDAwMTZmZmYKLQkgICAKLQkgTm90ZSAtIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nIGlmIGEgY2Fycnkgb2NjdXJzLCBhbmQgdGhlCi0JIDE1dGggYml0IGNoYW5nZXMgaXRzIHZhbHVlIGZyb20gYmVpbmcgc2V0IHRvIGJlaW5nIGNsZWFyLCBhcyB0aGUgSEkxNlMKLQkgcmVsb2Mgd2lsbCBoYXZlIGFscmVhZHkgYWRkZWQgaW4gMSB0byB0aGUgaGlnaCBwYXJ0IGZvciB1czoKLQotCSAgIG1vdmhpIGhpKCBmcmVkICsgMHhmZmZmKSwgcjAsIHIxICAgICBbYml0IDE1IG9mIHRoZSBvZmZzZXQgaXMgc2V0XQotCSAgIG1vdmVhIGxvKCBmcmVkICsgMHhmZmZmKSwgcjEsIHIxCi0KLQkgICBISTE2UzogMHgwMDAxICsgKDB4MDAwMDcwMDAgPj4gMTYpCi0JICAgTE8xNjogIDB4ZmZmZiArICgweDAwMDA3MDAwICYgMHhmZmZmKSA9IDB4NmZmZiAgKGNhcnJ5IGludG8gYml0IDE2IGlzIGxvc3QpCi0KLQkgICAgIDB4MDAwMTAwMDAKLQkgICArIDB4MDAwMDZmZmYgICAoYml0IDE1IG5vdCBzZXQsIHNvIHRoZSB0b3AgaGFsZiBpcyB6ZXJvKQotCSAgIC0tLS0tLS0tLS0tLQotCSAgICAgMHgwMDAxNmZmZiAgIHdoaWNoIGlzIHJpZ2h0IChhc3N1bWluZyB0aGF0IGZyZWQgaXMgYXQgMHg3MDAwKQotCi0JIGJ1dCBpZiB0aGUgMTV0aCBiaXQgZ29lcyBmcm9tIGJlaW5nIGNsZWFyIHRvIGJlaW5nIHNldCwgdGhlbiB3ZSBtdXN0Ci0JIG9uY2UgYWdhaW4gaGFuZGxlIG92ZXJmbG93OgotCi0JICAgbW92aGkgaGkoIGZyZWQgKyAweDcwMDApLCByMCwgcjEgICAgIFtiaXQgMTUgb2YgdGhlIG9mZnNldCBpcyBjbGVhcl0KLQkgICBtb3ZlYSBsbyggZnJlZCArIDB4NzAwMCksIHIxLCByMQotCi0JICAgSEkxNlM6IDB4MDAwMCArICgweDAwMDBmZmZmID4+IDE2KQotCSAgIExPMTY6ICAweDcwMDAgKyAoMHgwMDAwZmZmZiAmIDB4ZmZmZikgPSAweDZmZmYgIChjYXJyeSBpbnRvIGJpdCAxNikKLQotCSAgICAgMHgwMDAwMDAwMAotCSAgICsgMHgwMDAwNmZmZiAgIChiaXQgMTUgbm90IHNldCwgc28gdGhlIHRvcCBoYWxmIGlzIHplcm8pCi0JICAgLS0tLS0tLS0tLS0tCi0JICAgICAweDAwMDA2ZmZmICAgd2hpY2ggaXMgd3JvbmcgKGFzc3VtaW5nIHRoYXQgZnJlZCBpcyBhdCAweGZmZmYpCi0JICovCi0KLSAgICAgIHsKLQlsb25nIHJlc3VsdDsKLQotCWluc24gICA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotCXJlc3VsdCA9IGluc24gKyBhZGRlbmQ7Ci0KLSNkZWZpbmUgQklUMTVfU0VUKHgpICgoeCkgJiAweDgwMDApCi0jZGVmaW5lIE9WRVJGTE9XUyhhLGkpICgoKChhKSAmIDB4ZmZmZikgKyAoaSkpID4gMHhmZmZmKQotCQotCWlmICgoQklUMTVfU0VUIChyZXN1bHQpICYmICEgQklUMTVfU0VUIChhZGRlbmQpKQotCSAgICB8fCAoT1ZFUkZMT1dTIChhZGRlbmQsIGluc24pCi0JCSYmICgoISBCSVQxNV9TRVQgKGluc24pKSB8fCAoQklUMTVfU0VUIChhZGRlbmQpKSkpKQotCSAgewotCSAgICBib29sZWFuIGFscmVhZHlfdXBkYXRlZDsKLQkgICAgYmZkX2J5dGUgKiBoaTE2c19hZGRyZXNzID0gZmluZF9yZW1lbWJlcmVkX2hpMTZzX3JlbG9jCi0JICAgICAgKGFkZGVuZCwgJiBhbHJlYWR5X3VwZGF0ZWQpOwotCSAgICAKLQkgICAgLyogQW1lbmQgdGhlIG1hdGNoaW5nIEhJMTZfUyByZWxvY2F0aW9uLiAgKi8KLQkgICAgaWYgKGhpMTZzX2FkZHJlc3MgIT0gTlVMTCkKLQkgICAgICB7Ci0JCWlmICghIGFscmVhZHlfdXBkYXRlZCkKLQkJICB7Ci0JCSAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgaGkxNnNfYWRkcmVzcyk7Ci0JCSAgICBpbnNuICs9IDE7Ci0JCSAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBoaTE2c19hZGRyZXNzKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlmcHJpbnRmIChzdGRlcnIsIF8oIkZBSUxFRCB0byBmaW5kIHByZXZpb3VzIEhJMTYgcmVsb2NcbiIpKTsKLQkJcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQkgICAgICB9Ci0JICB9Ci0JCi0JLyogRG8gbm90IGNvbXBsYWluIGlmIHZhbHVlIGhhcyB0b3AgYml0IHNldCwgYXMgdGhpcyBoYXMgYmVlbiBhbnRpY2lwYXRlZC4gICovCi0JaW5zbiA9IHJlc3VsdCAmIDB4ZmZmZjsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgUl9WODUwXzg6Ci0gICAgICBhZGRlbmQgKz0gKGNoYXIpIGJmZF9nZXRfOCAoYWJmZCwgYWRkcmVzcyk7Ci0KLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweDdmIHx8IHNhZGRlbmQgPCAtMHg4MCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIGFkZGVuZCwgYWRkcmVzcyk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUOgotICAgICAgYWRkZW5kICs9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHhmZmZmIHx8IHNhZGRlbmQgPCAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGluc24gPSBhZGRlbmQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwXzE2OgotCi0gICAgICAvKiBkcm9wIHRocm91Z2ggKi8gICAgICAgICAgICAKLSAgICBjYXNlIFJfVjg1MF9TREFfMTZfMTZfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfVERBXzE2XzE2X09GRlNFVDoKLSAgICAgIGFkZGVuZCArPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4N2ZmZiB8fCBzYWRkZW5kIDwgLTB4ODAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBpbnNuID0gYWRkZW5kOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9TREFfMTVfMTZfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQ6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBhZGRlbmQgKz0gKGluc24gJiAweGZmZmUpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHg3ZmZlIHx8IHNhZGRlbmQgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGlmIChhZGRlbmQgJiAxKQotICAgICAgICByZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiA9IChhZGRlbmQgJiB+MSkgfCAoaW5zbiAmIDEpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9UREFfNl84X09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSAoKGluc24gJiAweDdlKSA8PCAxKTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4ZmMgfHwgc2FkZGVuZCA8IDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaWYgKGFkZGVuZCAmIDMpCi0JcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgICAKLSAgICAgIGluc24gJj0gMHhmZjgxOwotICAgICAgaW5zbiB8PSAoYWRkZW5kID4+IDEpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9UREFfN184X09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSAoKGluc24gJiAweDdmKSA8PCAxKTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4ZmUgfHwgc2FkZGVuZCA8IDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaWYgKGFkZGVuZCAmIDEpCi0JcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgICAKLSAgICAgIGluc24gJj0gMHhmZjgwOwotICAgICAgaW5zbiB8PSAoYWRkZW5kID4+IDEpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9UREFfN183X09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSBpbnNuICYgMHg3ZjsKLQkKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweDdmIHx8IHNhZGRlbmQgPCAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGluc24gJj0gMHhmZjgwOwotICAgICAgaW5zbiB8PSBhZGRlbmQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1REQV80XzVfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9ICgoaW5zbiAmIDB4ZikgPDwgMSk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweDFlIHx8IHNhZGRlbmQgPCAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGlmIChhZGRlbmQgJiAxKQotCXJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotICAgICAgCi0gICAgICBpbnNuICY9IDB4ZmZmMDsKLSAgICAgIGluc24gfD0gKGFkZGVuZCA+PiAxKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfVERBXzRfNF9PRkZTRVQ6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBhZGRlbmQgKz0gaW5zbiAmIDB4ZjsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4ZiB8fCBzYWRkZW5kIDwgMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpbnNuICY9IDB4ZmZmMDsKLSAgICAgIGluc24gfD0gYWRkZW5kOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQ6Ci0gICAgICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBhZGRlbmQgKz0gKChpbnNuICYgMHhmZmZlMDAwMCkgPj4gMTYpICsgKChpbnNuICYgMHgyMCkgPj4gNSk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweDdmZmYgfHwgc2FkZGVuZCA8IC0weDgwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweDAwMDFmZmRmOwotICAgICAgaW5zbiB8PSAoYWRkZW5kICYgMSkgPDwgNTsKLSAgICAgIGluc24gfD0gKGFkZGVuZCAmIH4xKSA8PCAxNjsKLSAgICAgIAotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgYWRkcmVzcyk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSAoKGluc24gJiAweDNmKSA8PCAxKTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4N2UgfHwgc2FkZGVuZCA8IDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaWYgKGFkZGVuZCAmIDEpCi0JcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgICAKLSAgICAgIGluc24gJj0gMHhmZjgwOwotICAgICAgaW5zbiB8PSAoYWRkZW5kID4+IDEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVjg1MF9HTlVfVlRJTkhFUklUOgotICAgIGNhc2UgUl9WODUwX0dOVV9WVEVOVFJZOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIH0KLQotICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBhZGRyZXNzKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotDAotLyogSW5zZXJ0IHRoZSBhZGRlbmQgaW50byB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdjg1MF9lbGZfcmVsb2MgKGFiZmQsIHJlbG9jLCBzeW1ib2wsIGRhdGEsIGlzZWN0aW9uLCBvYmZkLCBlcnIpCi0gICAgIGJmZCAqICAgICAgIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiAgIHJlbG9jOwotICAgICBhc3ltYm9sICogICBzeW1ib2w7Ci0gICAgIFBUUiAgICAgICAgIGRhdGE7Ci0gICAgIGFzZWN0aW9uICogIGlzZWN0aW9uOwotICAgICBiZmQgKiAgICAgICBvYmZkOwotICAgICBjaGFyICoqICAgICBlcnI7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbjsKLSAgCi0gIC8qIElmIHRoZXJlIGlzIGFuIG91dHB1dCBCRkQsCi0gICAgIGFuZCB0aGUgc3ltYm9sIGlzIG5vdCBhIHNlY3Rpb24gbmFtZSAod2hpY2ggaXMgb25seSBkZWZpbmVkIGF0IGZpbmFsIGxpbmsgdGltZSksCi0gICAgIGFuZCBlaXRoZXIgd2UgYXJlIG5vdCBwdXR0aW5nIHRoZSBhZGRlbmQgaW50byB0aGUgaW5zdHJ1Y3Rpb24KLSAgICAgICAgIG9yIHRoZSBhZGRlbmQgaXMgemVybywgc28gdGhlcmUgaXMgbm90aGluZyB0byBhZGQgaW50byB0aGUgaW5zdHJ1Y3Rpb24KLSAgICAgdGhlbiBqdXN0IGZpeHVwIHRoZSBhZGRyZXNzIGFuZCByZXR1cm4uICAqLwotICBpZiAob2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvYy0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2MtPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvYy0+YWRkcmVzcyArPSBpc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotI2lmIDAgIAotICBlbHNlIGlmIChvYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0jZW5kaWYKLSAgCi0gIC8qIENhdGNoIHJlbG9jcyBpbnZvbHZpbmcgdW5kZWZpbmVkIHN5bWJvbHMuICAqLwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwCi0gICAgICAmJiBvYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogV2UgaGFuZGxlIGZpbmFsIGxpbmtpbmcgb2Ygc29tZSByZWxvY3Mgb3Vyc2VsdmVzLiAgKi8KLQotICAvKiBJcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiByZWFsbHkgd2l0aGluIHRoZSBzZWN0aW9uPyAgKi8KLSAgaWYgKHJlbG9jLT5hZGRyZXNzID4gaXNlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gIAotICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCi0gICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KLSAgCi0gIC8qIEdldCBzeW1ib2wgdmFsdWUuICAoQ29tbW9uIHN5bWJvbHMgYXJlIHNwZWNpYWwuKSAgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotICAKLSAgLyogQ29udmVydCBpbnB1dC1zZWN0aW9uLXJlbGF0aXZlIHN5bWJvbCB2YWx1ZSB0byBhYnNvbHV0ZSArIGFkZGVuZC4gICovCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvYy0+YWRkZW5kOwotICAKLSAgaWYgKHJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICAvKiBIZXJlIHRoZSB2YXJpYWJsZSByZWxvY2F0aW9uIGhvbGRzIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZQotCSBzeW1ib2wgd2UgYXJlIHJlbG9jYXRpbmcgYWdhaW5zdCwgcGx1cyBhbnkgYWRkZW5kLiAgKi8KLSAgICAgIHJlbG9jYXRpb24gLT0gaXNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIAotICAgICAgLyogRGVhbCB3aXRoIHBjcmVsX29mZnNldCAqLwotICAgICAgcmVsb2NhdGlvbiAtPSByZWxvYy0+YWRkcmVzczsKLSAgICB9Ci0KLSAgcmVsb2MtPmFkZGVuZCA9IHJlbG9jYXRpb247CQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0MCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKiAgICAgICAgIGFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKiAgbmFtZTsKLXsKLSAgcmV0dXJuICggICAobmFtZVswXSA9PSAnLicgJiYgKG5hbWVbMV0gPT0gJ0wnIHx8IG5hbWVbMV0gPT0gJy4nKSkKLQkgIHx8IChuYW1lWzBdID09ICdfJyAmJiAgbmFtZVsxXSA9PSAnLicgJiYgbmFtZVsyXSA9PSAnTCcgJiYgbmFtZVszXSA9PSAnXycpKTsKLX0KLQotDAotLyogUGVyZm9ybSBhIHJlbG9jYXRpb24gYXMgcGFydCBvZiBhIGZpbmFsIGxpbmsuICAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIG9mZnNldCwgdmFsdWUsCi0JCQkJICAgIGFkZGVuZCwgaW5mbywgc3ltX3NlYywgaXNfbG9jYWwpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgIGhvd3RvOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgIG91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogICAgICAgICAgICAgIGNvbnRlbnRzOwotICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICBvZmZzZXQ7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgIHZhbHVlOwotICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICBhZGRlbmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogIGluZm87Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgIHN5bV9zZWM7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgICAgIGlzX2xvY2FsOwotewotICB1bnNpZ25lZCBsb25nICByX3R5cGUgICA9IGhvd3RvLT50eXBlOwotICBiZmRfYnl0ZSAqICAgICBoaXRfZGF0YSA9IGNvbnRlbnRzICsgb2Zmc2V0OwotCi0gIC8qIEFkanVzdCB0aGUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9WODUwXzlfUENSRUw6Ci0gICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgdmFsdWUgLT0gb2Zmc2V0OwotICAgICAgYnJlYWs7Ci0gICAgCi0gICAgY2FzZSBSX1Y4NTBfMjJfUENSRUw6Ci0gICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJKyBvZmZzZXQpOwotCi0gICAgICB2YWx1ZSA9IFNFWFQyNCAodmFsdWUpOyAgLyogT25seSB0aGUgYm90dG9tIDI0IGJpdHMgb2YgdGhlIFBDIGFyZSB2YWxpZCAqLwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9ISTE2X1M6Ci0gICAgY2FzZSBSX1Y4NTBfSEkxNjoKLSAgICBjYXNlIFJfVjg1MF9MTzE2OgotICAgIGNhc2UgUl9WODUwXzE2OgotICAgIGNhc2UgUl9WODUwXzMyOgotICAgIGNhc2UgUl9WODUwXzg6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQ6CQotICAgIGNhc2UgUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVDoKLSAgICAgIGlmIChzeW1fc2VjID09IE5VTEwpCi0JcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0JICAKLSAgICAgIHZhbHVlIC09IHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUOgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgZ3A7Ci0Jc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiBoOwotCi0JaWYgKHN5bV9zZWMgPT0gTlVMTCkKLQkgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCSAgCi0JLyogR2V0IHRoZSB2YWx1ZSBvZiBfX2dwLiAgKi8KLQloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfX2dwIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQlpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICB8fCBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQkgIHJldHVybiBiZmRfcmVsb2Nfb3RoZXI7Ci0KLQlncCA9IChoLT51LmRlZi52YWx1ZQotCSAgICAgICsgaC0+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+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotI2lmIDAKLWZwcmludGYgKHN0ZGVyciwgInVua25vd246IG5hbWU6ICVzXG4iLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKLSNlbmRpZgotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIHVzZSB0aGUgYWRkZW5kLCBidXQgdGhlIENPRkYgcmVsb2NhdGlvbnMKLSAgICAgICAgIGRvbid0LiAgKi8KLSAgICAgIHIgPSB2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCQlpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkJcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCwKLQkJCQkJaW5mbywgc2VjLCBoID09IE5VTEwpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgY29uc3QgY2hhciAqIG5hbWU7Ci0JICBjb25zdCBjaGFyICogbXNnID0gKGNvbnN0IGNoYXIgKikwOwotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0JCW5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIHJlbG9jYXRpb24iKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdGhlcjoKLQkgICAgICBtc2cgPSBfKCJjb3VsZCBub3QgbG9jYXRlIHNwZWNpYWwgbGlua2VyIHN5bWJvbCBfX2dwIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfY29udGludWU6Ci0JICAgICAgbXNnID0gXygiY291bGQgbm90IGxvY2F0ZSBzcGVjaWFsIGxpbmtlciBzeW1ib2wgX19lcCIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgKGJmZF9yZWxvY19kYW5nZXJvdXMgKyAxKToKLQkgICAgICBtc2cgPSBfKCJjb3VsZCBub3QgbG9jYXRlIHNwZWNpYWwgbGlua2VyIHN5bWJvbCBfX2N0YnAiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQkgICAgICAKLQkgICAgZGVmYXVsdDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIpOwotCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0JICAgIGNvbW1vbl9lcnJvcjoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKLQkJICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgLyogTm8gZ290IGFuZCBwbHQgZW50cmllcyBmb3Igdjg1MC1lbGYgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi12ODUwX2VsZl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICAgIGJmZCAqYWJmZDsKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgewotICAgICAgY2FzZSBSX1Y4NTBfR05VX1ZUSU5IRVJJVDoKLSAgICAgIGNhc2UgUl9WODUwX0dOVV9WVEVOVFJZOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgICB9Ci0gICBlbHNlCi0gICAgIHsKLSAgICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLSAgICAgICAgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotICAgICAgICAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0gICAgICAgICAgICAgICAgJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0vKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyLiAgKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzd2l0Y2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfVjg1MF9BUkNIKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgRV9WODUwX0FSQ0g6ICAgKHZvaWQpIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3Y4NTAsIDApOyBicmVhazsKLSAgICBjYXNlIEVfVjg1MEVfQVJDSDogICh2b2lkKSBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF92ODUwLCBiZmRfbWFjaF92ODUwZSk7IGJyZWFrOwotICAgIGNhc2UgRV9WODUwRUFfQVJDSDogKHZvaWQpIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3Y4NTAsIGJmZF9tYWNoX3Y4NTBlYSk7IGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0b3JlIHRoZSBtYWNoaW5lIG51bWJlciBpbiB0aGUgZmxhZ3MgZmllbGQuICAqLwotc3RhdGljIHZvaWQKLXY4NTBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKLSAgICAgYmZkICogICBhYmZkOwotICAgICBib29sZWFuIGxpbmtlcjsKLXsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDogdmFsID0gRV9WODUwX0FSQ0g7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfdjg1MGU6ICB2YWwgPSBFX1Y4NTBFX0FSQ0g7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfdjg1MGVhOiB2YWwgPSBFX1Y4NTBFQV9BUkNIOyAgYnJlYWs7Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9WODUwX0FSQ0g7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IHZhbDsKLX0KLQotLyogRnVuY3Rpb24gdG8ga2VlcCBWODUwIHNwZWNpZmljIGZpbGUgZmxhZ3MuICovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKiAgICBhYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChhYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyICovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChvYmZkKQotCSAgICAgIHx8IChlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncwotCQkgID09IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzKSk7Ci0KLSAgZWxmX2dwIChvYmZkKSA9IGVsZl9ncCAoaWJmZCk7Ci0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqIGliZmQ7Ci0gICAgIGJmZCAqIG9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG91dF9mbGFnczsKLSAgZmxhZ3dvcmQgaW5fZmxhZ3M7Ci0KLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGluX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIG91dF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotCi0gIGlmICghIGVsZl9mbGFnc19pbml0IChvYmZkKSkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgaW5wdXQgaXMgdGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIHRoZW4gZG8gbm90Ci0JIGJvdGhlciBzZXR0aW5nIHRoZSBmbGFncyBmb3IgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUsCi0JIGluc3RlYWQgYWxsb3cgZnV0dXJlIG1lcmdlcyB0byBkbyB0aGlzLiAgSWYgbm8gZnV0dXJlCi0JIG1lcmdlcyBldmVyIHNldCB0aGVzZSBmbGFncyB0aGVuIHRoZXkgd2lsbCByZXRhaW4gdGhlaXIKLQkgdW5pdGlhbGlzZWQgdmFsdWVzLCB3aGljaCBzdXJwcmlzZSBzdXJwcmlzZSwgY29ycmVzcG9uZAotCSB0byB0aGUgZGVmYXVsdCB2YWx1ZXMuICAqLwotICAgICAgaWYgKGJmZF9nZXRfYXJjaF9pbmZvIChpYmZkKS0+dGhlX2RlZmF1bHQpCi0JcmV0dXJuIHRydWU7Ci0gICAgICAKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGluX2ZsYWdzOwotCi0gICAgICBpZiAoYmZkX2dldF9hcmNoIChvYmZkKSA9PSBiZmRfZ2V0X2FyY2ggKGliZmQpCi0JICAmJiBiZmRfZ2V0X2FyY2hfaW5mbyAob2JmZCktPnRoZV9kZWZhdWx0KQotCXsKLQkgIHJldHVybiBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwgYmZkX2dldF9tYWNoIChpYmZkKSk7Ci0JfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgZmxhZyBjb21wYXRpYmlsaXR5LiAgKi8KLSAgaWYgKGluX2ZsYWdzID09IG91dF9mbGFncykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGluX2ZsYWdzICYgRUZfVjg1MF9BUkNIKSAhPSAob3V0X2ZsYWdzICYgRUZfVjg1MF9BUkNIKQotICAgICAgJiYgKGluX2ZsYWdzICYgRUZfVjg1MF9BUkNIKSAhPSBFX1Y4NTBfQVJDSCkKLSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiBBcmNoaXRlY3R1cmUgbWlzbWF0Y2ggd2l0aCBwcmV2aW91cyBtb2R1bGVzIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0vKiBEaXNwbGF5IHRoZSBmbGFncyBmaWVsZCAqLwotCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKQotICAgICBiZmQgKiAgIGFiZmQ7Ci0gICAgIFBUUiAgICAgcHRyOwotewotICBGSUxFICogZmlsZSA9IChGSUxFICopIHB0cjsKLSAgCi0gIEJGRF9BU1NFUlQgKGFiZmQgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCk7Ci0gIAotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpOwotICAKLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgZnByaW50ZiAoZmlsZSwgXygicHJpdmF0ZSBmbGFncyA9ICVseDogIiksIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzKTsKLSAgCi0gIHN3aXRjaCAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9WODUwX0FSQ0gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBFX1Y4NTBfQVJDSDogZnByaW50ZiAoZmlsZSwgXygidjg1MCBhcmNoaXRlY3R1cmUiKSk7IGJyZWFrOwotICAgIGNhc2UgRV9WODUwRV9BUkNIOiAgZnByaW50ZiAoZmlsZSwgXygidjg1MGUgYXJjaGl0ZWN0dXJlIikpOyBicmVhazsKLSAgICBjYXNlIEVfVjg1MEVBX0FSQ0g6IGZwcmludGYgKGZpbGUsIF8oInY4NTBlYSBhcmNoaXRlY3R1cmUiKSk7IGJyZWFrOwotICAgIH0KLSAgCi0gIGZwdXRjICgnXG4nLCBmaWxlKTsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBWODUwIEVMRiB1c2VzIGZvdXIgY29tbW9uIHNlY3Rpb25zLiAgT25lIGlzIHRoZSB1c3VhbCBvbmUsIGFuZCB0aGUKLSAgIG90aGVycyBhcmUgZm9yIChzbWFsbCkgb2JqZWN0cyBpbiBvbmUgb2YgdGhlIHNwZWNpYWwgZGF0YSBhcmVhczoKLSAgIHNtYWxsLCB0aW55IGFuZCB6ZXJvLiAgQWxsIHRoZSBvYmplY3RzIGFyZSBrZXB0IHRvZ2V0aGVyLCBhbmQgdGhlbgotICAgcmVmZXJlbmNlZCB2aWEgdGhlIGdwIHJlZ2lzdGVyLCB0aGUgZXAgcmVnaXN0ZXIgb3IgdGhlIHIwIHJlZ2lzdGVyCi0gICByZXNwZWN0aXZlbHksIHdoaWNoIHlpZWxkcyBzbWFsbGVyLCBmYXN0ZXIgYXNzZW1ibGVyIGNvZGUuICBUaGlzCi0gICBhcHByb2FjaCBpcyBjb3BpZWQgZnJvbSBlbGYzMi1taXBzLmMuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gIHY4NTBfZWxmX3Njb21fc2VjdGlvbjsKLXN0YXRpYyBhc3ltYm9sICAgdjg1MF9lbGZfc2NvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqIHY4NTBfZWxmX3Njb21fc3ltYm9sX3B0cjsKLXN0YXRpYyBhc2VjdGlvbiAgdjg1MF9lbGZfdGNvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgICB2ODUwX2VsZl90Y29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICogdjg1MF9lbGZfdGNvbV9zeW1ib2xfcHRyOwotc3RhdGljIGFzZWN0aW9uICB2ODUwX2VsZl96Y29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCAgIHY4NTBfZWxmX3pjb21fc3ltYm9sOwotc3RhdGljIGFzeW1ib2wgKiB2ODUwX2VsZl96Y29tX3N5bWJvbF9wdHI7Ci0KLQotLyogR2l2ZW4gYSBCRkQgc2VjdGlvbiwgdHJ5IHRvIGxvY2F0ZSB0aGUgY29ycmVzcG9uZGluZyBFTEYgc2VjdGlvbgotICAgaW5kZXguICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBoZHIsIHNlYywgcmV0dmFsKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIGhkcjsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgIHNlYzsKLSAgICAgaW50ICogICAgICAgICAgICAgICAgIHJldHZhbDsKLXsKLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuc2NvbW1vbiIpID09IDApCi0gICAgKnJldHZhbCA9IFNITl9WODUwX1NDT01NT047Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIudGNvbW1vbiIpID09IDApCi0gICAgKnJldHZhbCA9IFNITl9WODUwX1RDT01NT047Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuemNvbW1vbiIpID09IDApCi0gICAgKnJldHZhbCA9IFNITl9WODUwX1pDT01NT047Ci0gIGVsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIHRoZSBzcGVjaWFsIFY4NTAgc2VjdGlvbiBudW1iZXJzIHRoYXQgYSBzeW1ib2wgbWF5IHVzZS4gICovCi0KLXN0YXRpYyB2b2lkCi12ODUwX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyAoYWJmZCwgYXN5bSkKLSAgICAgYmZkICogICAgIGFiZmQ7Ci0gICAgIGFzeW1ib2wgKiBhc3ltOwotewotICBlbGZfc3ltYm9sX3R5cGUgKiBlbGZzeW0gPSAoZWxmX3N5bWJvbF90eXBlICopIGFzeW07Ci0gIHVuc2lnbmVkIHNob3J0IGluZGV4OwotICAKLSAgaW5kZXggPSBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHg7Ci0KLSAgLyogSWYgdGhlIHNlY3Rpb24gaW5kZXggaXMgYW4gIm9yZGluYXJ5IiBpbmRleCwgdGhlbiBpdCBtYXkKLSAgICAgcmVmZXIgdG8gYSB2ODUwIHNwZWNpZmljIHNlY3Rpb24gY3JlYXRlZCBieSB0aGUgYXNzZW1ibGVyLgotICAgICBDaGVjayB0aGUgc2VjdGlvbidzIHR5cGUgYW5kIGNoYW5nZSB0aGUgaW5kZXggaXQgbWF0Y2hlcy4KLSAgICAgCi0gICAgIEZJWE1FOiBTaG91bGQgd2UgYWx0ZXIgdGhlIHN0X3NobmR4IGZpZWxkIGFzIHdlbGwgPyAgKi8KLSAgCi0gIGlmIChpbmRleCA8IGVsZl9lbGZoZWFkZXIoYWJmZClbMF0uZV9zaG51bSkKLSAgICBzd2l0Y2ggKGVsZl9lbGZzZWN0aW9ucyhhYmZkKVtpbmRleF0tPnNoX3R5cGUpCi0gICAgICB7Ci0gICAgICBjYXNlIFNIVF9WODUwX1NDT01NT046Ci0JaW5kZXggPSBTSE5fVjg1MF9TQ09NTU9OOwotCWJyZWFrOwotCQotICAgICAgY2FzZSBTSFRfVjg1MF9UQ09NTU9OOgotCWluZGV4ID0gU0hOX1Y4NTBfVENPTU1PTjsKLQlicmVhazsKLQkKLSAgICAgIGNhc2UgU0hUX1Y4NTBfWkNPTU1PTjoKLQlpbmRleCA9IFNITl9WODUwX1pDT01NT047Ci0JYnJlYWs7Ci0JCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotICAKLSAgc3dpdGNoIChpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBTSE5fVjg1MF9TQ09NTU9OOgotICAgICAgaWYgKHY4NTBfZWxmX3Njb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JewotCSAgLyogSW5pdGlhbGl6ZSB0aGUgc21hbGwgY29tbW9uIHNlY3Rpb24uICAqLwotCSAgdjg1MF9lbGZfc2NvbV9zZWN0aW9uLm5hbWUgICAgICAgICAgID0gIi5zY29tbW9uIjsKLQkgIHY4NTBfZWxmX3Njb21fc2VjdGlvbi5mbGFncyAgICAgICAgICA9IFNFQ19JU19DT01NT04gfCBTRUNfQUxMT0MgfCBTRUNfREFUQTsKLQkgIHY4NTBfZWxmX3Njb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICYgdjg1MF9lbGZfc2NvbV9zZWN0aW9uOwotCSAgdjg1MF9lbGZfc2NvbV9zZWN0aW9uLnN5bWJvbCAgICAgICAgID0gJiB2ODUwX2VsZl9zY29tX3N5bWJvbDsKLQkgIHY4NTBfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICYgdjg1MF9lbGZfc2NvbV9zeW1ib2xfcHRyOwotCSAgdjg1MF9lbGZfc2NvbV9zeW1ib2wubmFtZSAgICAgICAgICAgID0gIi5zY29tbW9uIjsKLQkgIHY4NTBfZWxmX3Njb21fc3ltYm9sLmZsYWdzICAgICAgICAgICA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIHY4NTBfZWxmX3Njb21fc3ltYm9sLnNlY3Rpb24gICAgICAgICA9ICYgdjg1MF9lbGZfc2NvbV9zZWN0aW9uOwotCSAgdjg1MF9lbGZfc2NvbV9zeW1ib2xfcHRyICAgICAgICAgICAgID0gJiB2ODUwX2VsZl9zY29tX3N5bWJvbDsKLQl9Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gJiB2ODUwX2VsZl9zY29tX3NlY3Rpb247Ci0gICAgICBhc3ltLT52YWx1ZSA9IGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFNITl9WODUwX1RDT01NT046Ci0gICAgICBpZiAodjg1MF9lbGZfdGNvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSB0Y29tbW9uIHNlY3Rpb24uICAqLwotCSAgdjg1MF9lbGZfdGNvbV9zZWN0aW9uLm5hbWUgICAgICAgICAgID0gIi50Y29tbW9uIjsKLQkgIHY4NTBfZWxmX3Rjb21fc2VjdGlvbi5mbGFncyAgICAgICAgICA9IFNFQ19JU19DT01NT047Ci0JICB2ODUwX2VsZl90Y29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmIHY4NTBfZWxmX3Rjb21fc2VjdGlvbjsKLQkgIHY4NTBfZWxmX3Rjb21fc2VjdGlvbi5zeW1ib2wgICAgICAgICA9ICYgdjg1MF9lbGZfdGNvbV9zeW1ib2w7Ci0JICB2ODUwX2VsZl90Y29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmIHY4NTBfZWxmX3Rjb21fc3ltYm9sX3B0cjsKLQkgIHY4NTBfZWxmX3Rjb21fc3ltYm9sLm5hbWUgICAgICAgICAgICA9ICIudGNvbW1vbiI7Ci0JICB2ODUwX2VsZl90Y29tX3N5bWJvbC5mbGFncyAgICAgICAgICAgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICB2ODUwX2VsZl90Y29tX3N5bWJvbC5zZWN0aW9uICAgICAgICAgPSAmIHY4NTBfZWxmX3Rjb21fc2VjdGlvbjsKLQkgIHY4NTBfZWxmX3Rjb21fc3ltYm9sX3B0ciAgICAgICAgICAgICA9ICYgdjg1MF9lbGZfdGNvbV9zeW1ib2w7Ci0JfQotICAgICAgYXN5bS0+c2VjdGlvbiA9ICYgdjg1MF9lbGZfdGNvbV9zZWN0aW9uOwotICAgICAgYXN5bS0+dmFsdWUgPSBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fVjg1MF9aQ09NTU9OOgotICAgICAgaWYgKHY4NTBfZWxmX3pjb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JewotCSAgLyogSW5pdGlhbGl6ZSB0aGUgemNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIHY4NTBfZWxmX3pjb21fc2VjdGlvbi5uYW1lICAgICAgICAgICA9ICIuemNvbW1vbiI7Ci0JICB2ODUwX2VsZl96Y29tX3NlY3Rpb24uZmxhZ3MgICAgICAgICAgPSBTRUNfSVNfQ09NTU9OOwotCSAgdjg1MF9lbGZfemNvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJiB2ODUwX2VsZl96Y29tX3NlY3Rpb247Ci0JICB2ODUwX2VsZl96Y29tX3NlY3Rpb24uc3ltYm9sICAgICAgICAgPSAmIHY4NTBfZWxmX3pjb21fc3ltYm9sOwotCSAgdjg1MF9lbGZfemNvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJiB2ODUwX2VsZl96Y29tX3N5bWJvbF9wdHI7Ci0JICB2ODUwX2VsZl96Y29tX3N5bWJvbC5uYW1lICAgICAgICAgICAgPSAiLnpjb21tb24iOwotCSAgdjg1MF9lbGZfemNvbV9zeW1ib2wuZmxhZ3MgICAgICAgICAgID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgdjg1MF9lbGZfemNvbV9zeW1ib2wuc2VjdGlvbiAgICAgICAgID0gJiB2ODUwX2VsZl96Y29tX3NlY3Rpb247Ci0JICB2ODUwX2VsZl96Y29tX3N5bWJvbF9wdHIgICAgICAgICAgICAgPSAmIHY4NTBfZWxmX3pjb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmIHY4NTBfZWxmX3pjb21fc2VjdGlvbjsKLSAgICAgIGFzeW0tPnZhbHVlID0gZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemU7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIEhvb2sgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgcm91dGluZSB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBXZSBtdXN0IGhhbmRsZSB0aGUgc3BlY2lhbCB2ODUwIHNlY3Rpb24gbnVtYmVycyBoZXJlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfYWRkX3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBzeW0sIG5hbWVwLCBmbGFnc3AsIHNlY3AsIHZhbHApCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICBhYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICAgaW5mbzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqIHN5bTsKLSAgICAgY29uc3QgY2hhciAqKiAgICAgICAgICAgIG5hbWVwOwotICAgICBmbGFnd29yZCAqICAgICAgICAgICAgICAgZmxhZ3NwOwotICAgICBhc2VjdGlvbiAqKiAgICAgICAgICAgICAgc2VjcDsKLSAgICAgYmZkX3ZtYSAqICAgICAgICAgICAgICAgIHZhbHA7Ci17Ci0gIGludCBpbmRleCA9IHN5bS0+c3Rfc2huZHg7Ci0gIAotICAvKiBJZiB0aGUgc2VjdGlvbiBpbmRleCBpcyBhbiAib3JkaW5hcnkiIGluZGV4LCB0aGVuIGl0IG1heQotICAgICByZWZlciB0byBhIHY4NTAgc3BlY2lmaWMgc2VjdGlvbiBjcmVhdGVkIGJ5IHRoZSBhc3NlbWJsZXIuCi0gICAgIENoZWNrIHRoZSBzZWN0aW9uJ3MgdHlwZSBhbmQgY2hhbmdlIHRoZSBpbmRleCBpdCBtYXRjaGVzLgotICAgICAKLSAgICAgRklYTUU6IFNob3VsZCB3ZSBhbHRlciB0aGUgc3Rfc2huZHggZmllbGQgYXMgd2VsbCA/ICAqLwotICAKLSAgaWYgKGluZGV4IDwgZWxmX2VsZmhlYWRlcihhYmZkKVswXS5lX3NobnVtKQotICAgIHN3aXRjaCAoZWxmX2VsZnNlY3Rpb25zKGFiZmQpW2luZGV4XS0+c2hfdHlwZSkKLSAgICAgIHsKLSAgICAgIGNhc2UgU0hUX1Y4NTBfU0NPTU1PTjoKLQlpbmRleCA9IFNITl9WODUwX1NDT01NT047Ci0JYnJlYWs7Ci0JCi0gICAgICBjYXNlIFNIVF9WODUwX1RDT01NT046Ci0JaW5kZXggPSBTSE5fVjg1MF9UQ09NTU9OOwotCWJyZWFrOwotCQotICAgICAgY2FzZSBTSFRfVjg1MF9aQ09NTU9OOgotCWluZGV4ID0gU0hOX1Y4NTBfWkNPTU1PTjsKLQlicmVhazsKLQkKLSAgICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIAotICBzd2l0Y2ggKGluZGV4KQotICAgIHsKLSAgICBjYXNlIFNITl9WODUwX1NDT01NT046Ci0gICAgICAqc2VjcCA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5zY29tbW9uIik7Ci0gICAgICAoKnNlY3ApLT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgU0hOX1Y4NTBfVENPTU1PTjoKLSAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnRjb21tb24iKTsKLSAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBTSE5fVjg1MF9aQ09NTU9OOgotICAgICAgKnNlY3AgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuemNvbW1vbiIpOwotICAgICAgKCpzZWNwKS0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKkFSR1NJR05PUkVEKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgbmFtZSwgc3ltLCBpbnB1dF9zZWMpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBjb25zdCBjaGFyICogICAgICAgICAgIG5hbWU7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgc3ltOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgIGlucHV0X3NlYzsKLXsKLSAgLyogSWYgd2Ugc2VlIGEgY29tbW9uIHN5bWJvbCwgd2hpY2ggaW1wbGllcyBhIHJlbG9jYXRhYmxlIGxpbmssIHRoZW4KLSAgICAgaWYgYSBzeW1ib2wgd2FzIGluIGEgc3BlY2lhbCBjb21tb24gc2VjdGlvbiBpbiBhbiBpbnB1dCBmaWxlLCBtYXJrCi0gICAgIGl0IGFzIGEgc3BlY2lhbCBjb21tb24gaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgCi0gIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04pCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoaW5wdXRfc2VjLT5uYW1lLCAiLnNjb21tb24iKSA9PSAwKQotCXN5bS0+c3Rfc2huZHggPSBTSE5fVjg1MF9TQ09NTU9OOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChpbnB1dF9zZWMtPm5hbWUsICIudGNvbW1vbiIpID09IDApCi0Jc3ltLT5zdF9zaG5keCA9IFNITl9WODUwX1RDT01NT047Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGlucHV0X3NlYy0+bmFtZSwgIi56Y29tbW9uIikgPT0gMCkKLQlzeW0tPnN0X3NobmR4ID0gU0hOX1Y4NTBfWkNPTU1PTjsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKiAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICogaGRyOwotICAgICBjaGFyICogICAgICAgICAgICAgIG5hbWU7Ci17Ci0gIC8qIFRoZXJlIG91Z2h0IHRvIGJlIGEgcGxhY2UgdG8ga2VlcCBFTEYgYmFja2VuZCBzcGVjaWZpYyBmbGFncywgYnV0Ci0gICAgIGF0IHRoZSBtb21lbnQgdGhlcmUgaXNuJ3Qgb25lLiAgV2UganVzdCBrZWVwIHRyYWNrIG9mIHRoZQotICAgICBzZWN0aW9ucyBieSB0aGVpciBuYW1lLCBpbnN0ZWFkLiAgKi8KLQotICBpZiAoISBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzd2l0Y2ggKGhkci0+c2hfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBTSFRfVjg1MF9TQ09NTU9OOgotICAgIGNhc2UgU0hUX1Y4NTBfVENPTU1PTjoKLSAgICBjYXNlIFNIVF9WODUwX1pDT01NT046Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24sCi0JCQkJICAgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwKLQkJCQkJCQkgICBoZHItPmJmZF9zZWN0aW9uKQotCQkJCSAgICB8IFNFQ19JU19DT01NT04pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIGNvcnJlY3QgdHlwZSBmb3IgYSBWODUwIEVMRiBzZWN0aW9uLiAgV2UgZG8gdGhpcyBieSB0aGUKLSAgIHNlY3Rpb24gbmFtZSwgd2hpY2ggaXMgYSBoYWNrLCBidXQgb3VnaHQgdG8gd29yay4gICovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfZmFrZV9zZWN0aW9ucyAoYWJmZCwgaGRyLCBzZWMpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICBhYmZkOwotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogaGRyOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgc2VjOwotewotICByZWdpc3RlciBjb25zdCBjaGFyICogbmFtZTsKLQotICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgIi5zY29tbW9uIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfVjg1MF9TQ09NTU9OOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnRjb21tb24iKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9WODUwX1RDT01NT047Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuemNvbW1vbiIpID09IDApCi0gICAgaGRyLT5zaF90eXBlID0gU0hUX1Y4NTBfWkNPTU1PTjsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi0KLQwKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCQliZmRfZWxmMzJfdjg1MF92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkJImVsZjMyLXY4NTAiCi0jZGVmaW5lIEVMRl9BUkNICQkJCWJmZF9hcmNoX3Y4NTAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJCUVNX0NZR05VU19WODUwCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCQkweDEwMDAKLQkKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCQl2ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbGEKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQkJdjg1MF9lbGZfaW5mb190b19ob3d0b19yZWwKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJCXY4NTBfZWxmX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uICAgIAl2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQkJdjg1MF9lbGZfb2JqZWN0X3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAJdjg1MF9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gCXY4NTBfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZwkJdjg1MF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCQl2ODUwX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgCXY4NTBfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyCQl2ODUwX2VsZl9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCQl2ODUwX2VsZl9mYWtlX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vayAgICAgICAgICAgICAgICB2ODUwX2VsZl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vayAgICAgICAgICAgICAgIHY4NTBfZWxmX2djX3N3ZWVwX2hvb2sKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgMQotCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCXY4NTBfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAkJdjg1MF9lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgCXY4NTBfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgCXY4NTBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwkJdjg1MF9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCXY4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQotI2RlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhcgkJCSdfJwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzIuYyBiL2JmZC9lbGYzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjIyOTY5Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogRUxGIDMyLWJpdCBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQVJDSF9TSVpFCQkzMgotCi0KLSNpbmNsdWRlICJlbGZjb2RlLmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmNjQtYWxwaGEuYyBiL2JmZC9lbGY2NC1hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTY0Zjg2Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGY2NC1hbHBoYS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDc2OCArMCwwIEBACi0vKiBBbHBoYSBzcGVjaWZpYyBzdXBwb3J0IGZvciA2NC1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogV2UgbmVlZCBhIHB1Ymxpc2hlZCBBQkkgc3BlYyBmb3IgdGhpcy4gIFVudGlsIG9uZSBjb21lcyBvdXQsIGRvbid0Ci0gICBhc3N1bWUgdGhpcydsbCByZW1haW4gdW5jaGFuZ2VkIGZvcmV2ZXIuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi0jaW5jbHVkZSAiZWxmL2FscGhhLmgiCi0KLSNkZWZpbmUgQUxQSEFFQ09GRgotCi0jZGVmaW5lIE5PX0NPRkZfUkVMT0NTCi0jZGVmaW5lIE5PX0NPRkZfU1lNQk9MUwotI2RlZmluZSBOT19DT0ZGX0xJTkVOT1MKLQotLyogR2V0IHRoZSBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gIE5lZWRlZCBmb3IgdGhlIGRlYnVnIGluZm9ybWF0aW9uLiAqLwotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAiY29mZi9hbHBoYS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0jaW5jbHVkZSAibGliZWNvZmYuaCIKLSNkZWZpbmUgRUNPRkZfNjQKLSNpbmNsdWRlICJlY29mZnN3YXAuaCIKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiBlbGY2NF9hbHBoYV9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiBlbGY2NF9hbHBoYV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMoKGJmZCAqKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmNjRfYWxwaGFfcmVsb2NfbmlsCi0gIFBBUkFNUygoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjY0X2FscGhhX3JlbG9jX2JhZAotICBQQVJBTVMoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGY2NF9hbHBoYV9kb19yZWxvY19ncGRpc3AKLSAgUEFSQU1TKChiZmQgKiwgYmZkX3ZtYSwgYmZkX2J5dGUgKiwgYmZkX2J5dGUgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGY2NF9hbHBoYV9yZWxvY19ncGRpc3AKLSAgUEFSQU1TKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiBlbGY2NF9hbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCBlbGY2NF9hbHBoYV9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUygoYmZkICosIGFyZWxlbnQgKiwgRWxmNjRfSW50ZXJuYWxfUmVsYSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX29iamVjdF9wCi0gIFBBUkFNUygoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX3NlY3Rpb25fZnJvbV9zaGRyCi0gIFBBUkFNUygoYmZkICosIEVsZjY0X0ludGVybmFsX1NoZHIgKiwgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9mYWtlX3NlY3Rpb25zCi0gIFBBUkFNUygoYmZkICosIEVsZjY0X0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfY3JlYXRlX2dvdF9zZWN0aW9uCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfcmVhZF9lY29mZl9pbmZvCi0gIFBBUkFNUygoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2lzX2xvY2FsX2xhYmVsX25hbWUKLSAgUEFSQU1TKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLAotCSAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi1zdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeTsKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9vdXRwdXRfZXh0c3ltCi0gIFBBUkFNUygoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2Nhbl9tZXJnZV9nb3RzCi0gIFBBUkFNUygoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBlbGY2NF9hbHBoYV9tZXJnZV9nb3RzCi0gIFBBUkFNUygoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9jYWxjX2dvdF9vZmZzZXRzX2Zvcl9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbGY2NF9hbHBoYV9jYWxjX2dvdF9vZmZzZXRzIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX3NpemVfZ290X3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9hbHdheXNfc2l6ZV9zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMKLSAgUEFSQU1TICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfYWRkX3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosCi0JICAgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfY2hlY2tfcmVsb2NzCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICpzZWMsCi0JICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmluZHgKLSAgUEFSQU1TKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKLQkgIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfZmluYWxfbGluawotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLQwKLXN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogRXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSAgRVhUUiBlc3ltOwotCi0gIC8qIEN1bXVsYXRpdmUgZmxhZ3MgZm9yIGFsbCB0aGUgLmdvdCBlbnRyaWVzLiAgKi8KLSAgaW50IGZsYWdzOwotCi0gIC8qIENvbnRleHRzIChMSVRVU0UpIGluIHdoaWNoIGEgbGl0ZXJhbCB3YXMgcmVmZXJlbmNlZC4gICovCi0jZGVmaW5lIEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfQUREUiAweDAxCi0jZGVmaW5lIEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfTUVNICAweDAyCi0jZGVmaW5lIEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfQllURSAweDA0Ci0jZGVmaW5lIEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfRlVOQyAweDA4Ci0KLSAgLyogVXNlZCB0byBpbXBsZW1lbnQgbXVsdGlwbGUgLmdvdCBzdWJzZWN0aW9ucy4gICovCi0gIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5Ci0gIHsKLSAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqbmV4dDsKLQotICAgIC8qIHdoaWNoIC5nb3Qgc3Vic2VjdGlvbj8gICovCi0gICAgYmZkICpnb3RvYmo7Ci0KLSAgICAvKiB0aGUgYWRkZW5kIGluIGVmZmVjdCBmb3IgdGhpcyBlbnRyeS4gICovCi0gICAgYmZkX3ZtYSBhZGRlbmQ7Ci0KLSAgICAvKiB0aGUgLmdvdCBvZmZzZXQgZm9yIHRoaXMgZW50cnkuICAqLwotICAgIGludCBnb3Rfb2Zmc2V0OwotCi0gICAgaW50IGZsYWdzOwotCi0gICAgLyogQW4gYWRkaXRpb25hbCBmbGFnLiAgKi8KLSNkZWZpbmUgQUxQSEFfRUxGX0dPVF9FTlRSWV9SRUxPQ1NfRE9ORSAweDEwCi0KLSAgICBpbnQgdXNlX2NvdW50OwotICB9ICpnb3RfZW50cmllczsKLQotICAvKiB1c2VkIHRvIGNvdW50IG5vbi1nb3QsIG5vbi1wbHQgcmVsb2NhdGlvbnMgZm9yIGRlbGF5ZWQgc2l6aW5nCi0gICAgIG9mIHJlbG9jYXRpb24gc2VjdGlvbnMuICAqLwotICBzdHJ1Y3QgYWxwaGFfZWxmX3JlbG9jX2VudHJ5Ci0gIHsKLSAgICBzdHJ1Y3QgYWxwaGFfZWxmX3JlbG9jX2VudHJ5ICpuZXh0OwotCi0gICAgLyogd2hpY2ggLnJlbG9jIHNlY3Rpb24/ICovCi0gICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAvKiB3aGF0IGtpbmQgb2YgcmVsb2NhdGlvbj8gKi8KLSAgICB1bnNpZ25lZCBsb25nIHJ0eXBlOwotCi0gICAgLyogaG93IG1hbnkgZGlkIHdlIGZpbmQ/ICAqLwotICAgIHVuc2lnbmVkIGxvbmcgY291bnQ7Ci0gIH0gKnJlbG9jX2VudHJpZXM7Ci19OwotCi0vKiBBbHBoYSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIFRoZSBoZWFkIG9mIGEgbGlzdCBvZiAuZ290IHN1YnNlY3Rpb25zIGxpbmtlZCB0aHJvdWdoCi0gICAgIGFscGhhX2VsZl90ZGF0YShhYmZkKS0+Z290X2xpbmtfbmV4dC4gICovCi0gIGJmZCAqZ290X2xpc3Q7Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhbHBoYV9lbGZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykJXAotICAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopCQkJCQlcCi0gICBlbGZfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwJCVwKLQkJCSAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBBbHBoYSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGFscGhhX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBBbHBoYSBFTEYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGFscGhhX2VsZl9oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogR2V0IHRoZSBvYmplY3QncyBzeW1ib2xzIGFzIG91ciBvd24gZW50cnkgdHlwZS4gICovCi0KLSNkZWZpbmUgYWxwaGFfZWxmX3N5bV9oYXNoZXMoYWJmZCkgXAotICAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICoqKWVsZl9zeW1faGFzaGVzKGFiZmQpKQotCi0vKiBTaG91bGQgd2UgZG8gZHluYW1pYyB0aGluZ3MgdG8gdGhpcyBzeW1ib2w/ICAqLwotCi0jZGVmaW5lIGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wKGgsIGluZm8pIAkJCQlcCi0gICgoKChpbmZvKS0+c2hhcmVkICYmICEoaW5mbyktPnN5bWJvbGljKQkJCQlcCi0gICAgfHwgKCgoaCktPmVsZl9saW5rX2hhc2hfZmxhZ3MJCQkJCVwKLQkgJiAoRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQyB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpKQlcCi0gICAgICAgID09IChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikpCVwKLSAgICB8fCAoaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawkJCVwKLSAgICB8fCAoaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCQkJCVwKLSAgICYmIChoKS0+ZHluaW5keCAhPSAtMSkKLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGEgQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGY2NF9hbHBoYV9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgbWVtc2V0ICgmcmV0LT5lc3ltLCAwLCBzaXplb2YgKEVYVFIpKTsKLSAgICAgIC8qIFdlIHVzZSAtMiBhcyBhIG1hcmtlciB0byBpbmRpY2F0ZSB0aGF0IHRoZSBpbmZvcm1hdGlvbiBoYXMKLQkgbm90IGJlZW4gc2V0LiAgLTEgbWVhbnMgdGhlcmUgaXMgbm8gYXNzb2NpYXRlZCBpZmQuICAqLwotICAgICAgcmV0LT5lc3ltLmlmZCA9IC0yOwotICAgICAgcmV0LT5mbGFncyA9IDA7Ci0gICAgICByZXQtPmdvdF9lbnRyaWVzID0gTlVMTDsKLSAgICAgIHJldC0+cmVsb2NfZW50cmllcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWVsZjY0X2FscGhhX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgICBlbGY2NF9hbHBoYV9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQwKLS8qIFdlIGhhdmUgc29tZSBwcml2YXRlIGZpZWxkcyBoYW5naW5nIG9mZiBvZiB0aGUgZWxmX3RkYXRhIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBhbHBoYV9lbGZfb2JqX3RkYXRhCi17Ci0gIHN0cnVjdCBlbGZfb2JqX3RkYXRhIHJvb3Q7Ci0KLSAgLyogRm9yIGV2ZXJ5IGlucHV0IGZpbGUsIHRoZXNlIGFyZSB0aGUgZ290IGVudHJpZXMgZm9yIHRoYXQgb2JqZWN0J3MKLSAgICAgbG9jYWwgc3ltYm9scy4gICovCi0gIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICoqIGxvY2FsX2dvdF9lbnRyaWVzOwotCi0gIC8qIEZvciBldmVyeSBpbnB1dCBmaWxlLCB0aGlzIGlzIHRoZSBvYmplY3QgdGhhdCBvd25zIHRoZSBnb3QgdGhhdAotICAgICB0aGlzIGlucHV0IGZpbGUgdXNlcy4gICovCi0gIGJmZCAqZ290b2JqOwotCi0gIC8qIEZvciBldmVyeSBnb3QsIHRoaXMgaXMgYSBsaW5rZWQgbGlzdCB0aHJvdWdoIHRoZSBvYmplY3RzIHVzaW5nIHRoaXMgZ290ICovCi0gIGJmZCAqaW5fZ290X2xpbmtfbmV4dDsKLQotICAvKiBGb3IgZXZlcnkgZ290LCB0aGlzIGlzIGEgbGluayB0byB0aGUgbmV4dCBnb3Qgc3Vic2VnbWVudC4gICovCi0gIGJmZCAqZ290X2xpbmtfbmV4dDsKLQotICAvKiBGb3IgZXZlcnkgZ290LCB0aGlzIGlzIHRoZSBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKmdvdDsKLQotICAvKiBGb3IgZXZlcnkgZ290LCB0aGlzIGlzIGl0J3MgdG90YWwgbnVtYmVyIG9mICplbnRyaWVzKi4gICovCi0gIGludCB0b3RhbF9nb3RfZW50cmllczsKLQotICAvKiBGb3IgZXZlcnkgZ290LCB0aGlzIGlzIHRoZSBzdW0gb2YgdGhlIG51bWJlciBvZiAqZW50cmllcyogcmVxdWlyZWQKLSAgICAgdG8gaG9sZCBhbGwgb2YgdGhlIG1lbWJlciBvYmplY3QncyBsb2NhbCBnb3QuICAqLwotICBpbnQgbl9sb2NhbF9nb3RfZW50cmllczsKLX07Ci0KLSNkZWZpbmUgYWxwaGFfZWxmX3RkYXRhKGFiZmQpIFwKLSAgKChzdHJ1Y3QgYWxwaGFfZWxmX29ial90ZGF0YSAqKSAoYWJmZCktPnRkYXRhLmFueSkKLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFiZmQtPnRkYXRhLmFueSA9IGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9vYmpfdGRhdGEpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLmFueSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAvKiBBbGxvY2F0ZSBvdXIgc3BlY2lhbCB0YXJnZXQgZGF0YS4gICovCi0gIHN0cnVjdCBhbHBoYV9lbGZfb2JqX3RkYXRhICpuZXdfdGRhdGE7Ci0gIG5ld190ZGF0YSA9IGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9vYmpfdGRhdGEpKTsKLSAgaWYgKG5ld190ZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmV3X3RkYXRhLT5yb290ID0gKmFiZmQtPnRkYXRhLmVsZl9vYmpfZGF0YTsKLSAgYWJmZC0+dGRhdGEuYW55ID0gbmV3X3RkYXRhOwotCi0gIC8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIgZm9yIGFuIEFscGhhIEVMRiBmaWxlLiAgKi8KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2FscGhhLCAwKTsKLX0KLQwKLS8qIEluIGNhc2Ugd2UncmUgb24gYSAzMi1iaXQgbWFjaGluZSwgY29uc3RydWN0IGEgNjQtYml0ICItMSIgdmFsdWUKLSAgIGZyb20gc21hbGxlciB2YWx1ZXMuICBTdGFydCB3aXRoIHplcm8sIHdpZGVuLCAqdGhlbiogZGVjcmVtZW50LiAgKi8KLSNkZWZpbmUgTUlOVVNfT05FCSgoKGJmZF92bWEpMCkgLSAxKQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGY2NF9hbHBoYV9ob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8gKFJfQUxQSEFfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX25pbCwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfUkVGTE9ORywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZMT05HIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfUkVGUVVBRCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZRVUFEIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IEdQIHJlbGF0aXZlIG9mZnNldC4gIFRoaXMgaXMganVzdCBsaWtlIFJFRkxPTkcgZXhjZXB0Ci0gICAgIHRoYXQgd2hlbiB0aGUgdmFsdWUgaXMgdXNlZCB0aGUgdmFsdWUgb2YgdGhlIGdwIHJlZ2lzdGVyIHdpbGwgYmUKLSAgICAgYWRkZWQgaW4uICAqLwotICBIT1dUTyAoUl9BTFBIQV9HUFJFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBVc2VkIGZvciBhbiBpbnN0cnVjdGlvbiB0aGF0IHJlZmVycyB0byBtZW1vcnkgb2ZmIHRoZSBHUCByZWdpc3Rlci4gICovCi0gIEhPV1RPIChSX0FMUEhBX0xJVEVSQUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkVMRl9MSVRFUkFMIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoaXMgcmVsb2Mgb25seSBhcHBlYXJzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhbiBFTEZfTElURVJBTCByZWxvYy4KLSAgICAgSXQgaWRlbnRpZmllcyBhIHVzZSBvZiB0aGUgbGl0ZXJhbC4gIFRoZSBzeW1ib2wgaW5kZXggaXMgc3BlY2lhbDoKLSAgICAgMSBtZWFucyB0aGUgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSBiYXNlIHJlZ2lzdGVyIG9mIGEgbWVtb3J5Ci0gICAgIGZvcm1hdCBpbnN0cnVjdGlvbjsgMiBtZWFucyB0aGUgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSBieXRlCi0gICAgIG9mZnNldCByZWdpc3RlciBvZiBhIGJ5dGUtbWFuaXB1bGF0aW9uIGluc3RydWN0aW9uOyAzIG1lYW5zIHRoZQotICAgICBsaXRlcmFsIGFkZHJlc3MgaXMgaW4gdGhlIHRhcmdldCByZWdpc3RlciBvZiBhIGpzciBpbnN0cnVjdGlvbi4KLSAgICAgVGhpcyBkb2VzIG5vdCBhY3R1YWxseSBkbyBhbnkgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0FMUEhBX0xJVFVTRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19uaWwsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJVFVTRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG9hZCB0aGUgZ3AgcmVnaXN0ZXIuICBUaGlzIGlzIGFsd2F5cyB1c2VkIGZvciBhIGxkYWggaW5zdHJ1Y3Rpb24KLSAgICAgd2hpY2ggbG9hZHMgdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhlIGdwIHJlZ2lzdGVyLiAgVGhlIHN5bWJvbAotICAgICBpbmRleCBvZiB0aGUgR1BESVNQIGluc3RydWN0aW9uIGlzIGFuIG9mZnNldCBpbiBieXRlcyB0byB0aGUgbGRhCi0gICAgIGluc3RydWN0aW9uIHRoYXQgbG9hZHMgdGhlIGxvd2VyIDE2IGJpdHMuICBUaGUgdmFsdWUgdG8gdXNlIGZvcgotICAgICB0aGUgcmVsb2NhdGlvbiBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBHUCB2YWx1ZSBhbmQgdGhlCi0gICAgIGN1cnJlbnQgbG9jYXRpb247IHRoZSBsb2FkIHdpbGwgYWx3YXlzIGJlIGRvbmUgYWdhaW5zdCBhIHJlZ2lzdGVyCi0gICAgIGhvbGRpbmcgdGhlIGN1cnJlbnQgYWRkcmVzcy4KLQotICAgICBOT1RFOiBVbmxpa2UgRUNPRkYsIHBhcnRpYWwgaW4tcGxhY2UgcmVsb2NhdGlvbiBpcyBub3QgZG9uZS4gIElmCi0gICAgIGFueSBvZmZzZXQgaXMgcHJlc2VudCBpbiB0aGUgaW5zdHJ1Y3Rpb25zLCBpdCBpcyBhbiBvZmZzZXQgZnJvbQotICAgICB0aGUgcmVnaXN0ZXIgdG8gdGhlIGxkYWggaW5zdHJ1Y3Rpb24uICBUaGlzIGxldHMgdXMgYXZvaWQgYW55Ci0gICAgIHN0dXBpZCBoYWNrZXJ5IGxpa2UgaW52ZW50aW5nIGEgZ3AgdmFsdWUgdG8gZG8gcGFydGlhbCByZWxvY2F0aW9uCi0gICAgIGFnYWluc3QuICBBbHNvIHVubGlrZSBFQ09GRiwgd2UgZG8gdGhlIHdob2xlIHJlbG9jYXRpb24gb2ZmIG9mCi0gICAgIHRoZSBHUERJU1AgcmF0aGVyIHRoYW4gYSBHUERJU1BfSEkxNi9HUERJU1BfTE8xNiBwYWlyLiAgQW4gb2RkLAotICAgICBzcGFjZSBjb25zdW1pbmcgYml0LCB0aGF0LCBzaW5jZSBhbGwgdGhlIGluZm9ybWF0aW9uIHdhcyBwcmVzZW50Ci0gICAgIGluIHRoZSBHUERJU1BfSEkxNiByZWxvYy4gICovCi0gIEhPV1RPIChSX0FMUEhBX0dQRElTUCwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfZ3BkaXNwLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUERJU1AiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAyMSBiaXQgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfQlJBRERSLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkJSQUREUiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBoaW50IGZvciBhIGp1bXAgdG8gYSByZWdpc3Rlci4gICovCi0gIEhPV1RPIChSX0FMUEhBX0hJTlQsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJISU5UIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9TUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9TUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfU1JFTDY0LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUw2NCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBQdXNoIGEgdmFsdWUgb24gdGhlIHJlbG9jIGV2YWx1YXRpb24gc3RhY2suICAqLwotICAvKiBOb3QgaW1wbGVtZW50ZWQgLS0gaXQncyBkdW1iLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfT1BfUFVTSCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFVTSCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU3RvcmUgdGhlIHZhbHVlIGZyb20gdGhlIHN0YWNrIGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAgU3RvcmUgaXQgaW4KLSAgICAgYSBiaXRmaWVsZCBvZiBzaXplIHJfc2l6ZSBzdGFydGluZyBhdCBiaXQgcG9zaXRpb24gcl9vZmZzZXQuICAqLwotICAvKiBOb3QgaW1wbGVtZW50ZWQgLS0gaXQncyBkdW1iLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfT1BfU1RPUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9TVE9SRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN1YnRyYWN0IHRoZSByZWxvYyBhZGRyZXNzIGZyb20gdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlCi0gICAgIHJlbG9jYXRpb24gc3RhY2suICAqLwotICAvKiBOb3QgaW1wbGVtZW50ZWQgLS0gaXQncyBkdW1iLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfT1BfUFNVQiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFNVQiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU2hpZnQgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHJlbG9jYXRpb24gc3RhY2sgcmlnaHQgYnkgdGhlCi0gICAgIGdpdmVuIHZhbHVlLiAgKi8KLSAgLyogTm90IGltcGxlbWVudGVkIC0tIGl0J3MgZHVtYi4gICovCi0gIEhPV1RPIChSX0FMUEhBX09QX1BSU0hJRlQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BSU0hJRlQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIENoYW5nZSB0aGUgdmFsdWUgb2YgR1AgdXNlZCBieSArcl9hZGRlbmQgdW50aWwgdGhlIG5leHQgR1BWQUxVRSBvciB0aGUKLSAgICAgZW5kIG9mIHRoZSBpbnB1dCBiZmQuICAqLwotICAvKiBOb3QgaW1wbGVtZW50ZWQgLS0gaXQncyBkdW1iLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfR1BWQUxVRSwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQVkFMVUUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIDE2IGJpdHMgb2YgdGhlIGRpc3BsYWNlbWVudCBmcm9tIEdQIHRvIHRoZSB0YXJnZXQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9HUFJFTEhJR0gsCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFJFTEhJR0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGxvdyAxNiBiaXRzIG9mIHRoZSBkaXNwbGFjZW1lbnQgZnJvbSBHUCB0byB0aGUgdGFyZ2V0LiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfR1BSRUxMT1csCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BSRUxMT1ciLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNi1iaXQgZGlzcGxhY2VtZW50IGZyb20gdGhlIEdQIHRvIHRoZSB0YXJnZXQuICAqLwotICAvKiBYWFg6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0lNTUVEX0dQXzE2LAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSU1NRURfR1BfMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggYml0cyBvZiBhIDMyLWJpdCBkaXNwbGFjZW1lbnQgZnJvbSB0aGUgR1AgdG8gdGhlIHRhcmdldDsgdGhlCi0gICAgIGxvdyBiaXRzIGFyZSBzdXBwbGllZCBpbiB0aGUgc3Vic2VxdWVudCBSX0FMUEhBX0lNTUVEX0xPMzIgcmVsb2NzLiAgKi8KLSAgLyogWFhYOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9JTU1FRF9HUF9ISTMyLAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSU1NRURfR1BfSEkzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggYml0cyBvZiBhIDMyLWJpdCBkaXNwbGFjZW1lbnQgdG8gdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlCi0gICAgIGN1cnJlbnQgc2VjdGlvbiAodGhlIHJlbG9jYXRpb24gdGFyZ2V0IGlzIGlnbm9yZWQpOyB0aGUgbG93IGJpdHMgYXJlIAotICAgICBzdXBwbGllZCBpbiB0aGUgc3Vic2VxdWVudCBSX0FMUEhBX0lNTUVEX0xPMzIgcmVsb2NzLiAgKi8KLSAgLyogWFhYOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9JTU1FRF9TQ05fSEkzMiwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTUVEX1NDTl9ISTMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBiaXRzIG9mIGEgMzItYml0IGRpc3BsYWNlbWVudCBmcm9tIHRoZSBwcmV2aW91cyBiciwgYnNyLCBqc3IKLSAgICAgb3Igam1wIGluc24gKGFzIHRhZ2dlZCBieSBhIEJSQUREUiBvciBISU5UIHJlbG9jKSB0byB0aGUgdGFyZ2V0OyB0aGUKLSAgICAgbG93IGJpdHMgYXJlIHN1cHBsaWVkIGJ5IHN1YnNlcXVlbnQgUl9BTFBIQV9JTU1FRF9MTzMyIHJlbG9jcy4gICovCi0gIC8qIFhYWDogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfSU1NRURfQlJfSEkzMiwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTUVEX0JSX0hJMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBsb3cgMTYgYml0cyBvZiBhIGRpc3BsYWNlbWVudCBjYWxjdWxhdGVkIGluIGEgcHJldmlvdXMgSEkzMiByZWxvYy4gICovCi0gIC8qIFhYWDogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfSU1NRURfTE8zMiwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTUVEX0xPMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIE1pc2MgRUxGIHJlbG9jYXRpb25zLiAqLwotCi0gIC8qIEEgZHluYW1pYyByZWxvY2F0aW9uIHRvIGNvcHkgdGhlIHRhcmdldCBpbnRvIG91ciAuZHluYnNzIHNlY3Rpb24uICAqLwotICAvKiBOb3QgZ2VuZXJhdGVkLCBhcyBhbGwgQWxwaGEgb2JqZWN0cyB1c2UgUElDLCBzbyBpdCBpcyBub3QgbmVlZGVkLiAgSXQKLSAgICAgaXMgcHJlc2VudCBiZWNhdXNlIGV2ZXJ5IG90aGVyIEVMRiBoYXMgb25lLCBidXQgc2hvdWxkIG5vdCBiZSB1c2VkCi0gICAgIGJlY2F1c2UgLmR5bmJzcyBpcyBhbiB1Z2x5IHRoaW5nLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfQ09QWSwKLQkgMCwKLQkgMCwKLQkgMCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIkNPUFkiLAotCSBmYWxzZSwKLQkgMCwKLQkgMCwKLQkgdHJ1ZSksCi0KLSAgLyogQSBkeW5hbWljIHJlbG9jYXRpb24gZm9yIGEgLmdvdCBlbnRyeS4gICovCi0gIEhPV1RPIChSX0FMUEhBX0dMT0JfREFULAotCSAwLAotCSAwLAotCSAwLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiR0xPQl9EQVQiLAotCSBmYWxzZSwKLQkgMCwKLQkgMCwKLQkgdHJ1ZSksCi0KLSAgLyogQSBkeW5hbWljIHJlbG9jYXRpb24gZm9yIGEgLnBsdCBlbnRyeS4gICovCi0gIEhPV1RPIChSX0FMUEhBX0pNUF9TTE9ULAotCSAwLAotCSAwLAotCSAwLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiSk1QX1NMT1QiLAotCSBmYWxzZSwKLQkgMCwKLQkgMCwKLQkgdHJ1ZSksCi0KLSAgLyogQSBkeW5hbWljIHJlbG9jYXRpb24gdG8gYWRkIHRoZSBiYXNlIG9mIHRoZSBEU08gdG8gYSA2NC1iaXQgZmllbGQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9SRUxBVElWRSwKLQkgMCwKLQkgMCwKLQkgMCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJFTEFUSVZFIiwKLQkgZmFsc2UsCi0JIDAsCi0JIDAsCi0JIHRydWUpCi19OwotCi0vKiBBIHJlbG9jYXRpb24gZnVuY3Rpb24gd2hpY2ggZG9lc24ndCBkbyBhbnl0aGluZy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjY0X2FscGhhX3JlbG9jX25pbCAoYWJmZCwgcmVsb2MsIHN5bSwgZGF0YSwgc2VjLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAob3V0cHV0X2JmZCkKLSAgICByZWxvYy0+YWRkcmVzcyArPSBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEEgcmVsb2NhdGlvbiBmdW5jdGlvbiB1c2VkIGZvciBhbiB1bnN1cHBvcnRlZCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjY0X2FscGhhX3JlbG9jX2JhZCAoYWJmZCwgcmVsb2MsIHN5bSwgZGF0YSwgc2VjLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAob3V0cHV0X2JmZCkKLSAgICByZWxvYy0+YWRkcmVzcyArPSBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotfQotCi0vKiBEbyB0aGUgd29yayBvZiB0aGUgR1BESVNQIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGY2NF9hbHBoYV9kb19yZWxvY19ncGRpc3AgKGFiZmQsIGdwZGlzcCwgcF9sZGFoLCBwX2xkYSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfdm1hIGdwZGlzcDsKLSAgICAgYmZkX2J5dGUgKnBfbGRhaDsKLSAgICAgYmZkX2J5dGUgKnBfbGRhOwotewotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0ID0gYmZkX3JlbG9jX29rOwotICBiZmRfdm1hIGFkZGVuZDsKLSAgdW5zaWduZWQgbG9uZyBpX2xkYWgsIGlfbGRhOwotCi0gIGlfbGRhaCA9IGJmZF9nZXRfMzIgKGFiZmQsIHBfbGRhaCk7Ci0gIGlfbGRhID0gYmZkX2dldF8zMiAoYWJmZCwgcF9sZGEpOwotCi0gIC8qIENvbXBsYWluIGlmIHRoZSBpbnN0cnVjdGlvbnMgYXJlIG5vdCBjb3JyZWN0LiAgKi8KLSAgaWYgKCgoaV9sZGFoID4+IDI2KSAmIDB4M2YpICE9IDB4MDkKLSAgICAgIHx8ICgoaV9sZGEgPj4gMjYpICYgMHgzZikgIT0gMHgwOCkKLSAgICByZXQgPSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCi0gIC8qIEV4dHJhY3QgdGhlIHVzZXItc3VwcGxpZWQgb2Zmc2V0LCBtaXJyb3JpbmcgdGhlIHNpZ24gZXh0ZW5zaW9ucwotICAgICB0aGF0IHRoZSBpbnN0cnVjdGlvbnMgcGVyZm9ybS4gICovCi0gIGFkZGVuZCA9ICgoaV9sZGFoICYgMHhmZmZmKSA8PCAxNikgfCAoaV9sZGEgJiAweGZmZmYpOwotICBhZGRlbmQgPSAoYWRkZW5kIF4gMHg4MDAwODAwMCkgLSAweDgwMDA4MDAwOwotCi0gIGdwZGlzcCArPSBhZGRlbmQ7Ci0KLSAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgZ3BkaXNwIDwgLShiZmRfc2lnbmVkX3ZtYSkgMHg4MDAwMDAwMAotICAgICAgfHwgKGJmZF9zaWduZWRfdm1hKSBncGRpc3AgPj0gKGJmZF9zaWduZWRfdm1hKSAweDdmZmY4MDAwKQotICAgIHJldCA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAvKiBjb21wZW5zYXRlIGZvciB0aGUgc2lnbiBleHRlbnNpb24gYWdhaW4uICAqLwotICBpX2xkYWggPSAoKGlfbGRhaCAmIDB4ZmZmZjAwMDApCi0JICAgIHwgKCgoZ3BkaXNwID4+IDE2KSArICgoZ3BkaXNwID4+IDE1KSAmIDEpKSAmIDB4ZmZmZikpOwotICBpX2xkYSA9IChpX2xkYSAmIDB4ZmZmZjAwMDApIHwgKGdwZGlzcCAmIDB4ZmZmZik7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgaV9sZGFoLCBwX2xkYWgpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpX2xkYSwgcF9sZGEpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoZSBzcGVjaWFsIGZ1bmN0aW9uIGZvciB0aGUgR1BESVNQIHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZWxmNjRfYWxwaGFfcmVsb2NfZ3BkaXNwIChhYmZkLCByZWxvY19lbnRyeSwgc3ltLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJICBvdXRwdXRfYmZkLCBlcnJfbXNnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyX21zZzsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSBncCwgcmVsb2NhdGlvbjsKLSAgYmZkX2J5dGUgKnBfbGRhaCwgKnBfbGRhOwotCi0gIC8qIERvbid0IGRvIGFueXRoaW5nIGlmIHdlJ3JlIG5vdCBkb2luZyBhIGZpbmFsIGxpbmsuICAqLwotICBpZiAob3V0cHV0X2JmZCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplIHx8Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArIHJlbG9jX2VudHJ5LT5hZGRlbmQgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFRoZSBncCB1c2VkIGluIHRoZSBwb3J0aW9uIG9mIHRoZSBvdXRwdXQgb2JqZWN0IHRvIHdoaWNoIHRoaXMKLSAgICAgaW5wdXQgb2JqZWN0IGJlbG9uZ3MgaXMgY2FjaGVkIG9uIHRoZSBpbnB1dCBiZmQuICAqLwotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChhYmZkKTsKLQotICByZWxvY2F0aW9uID0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIHBfbGRhaCA9IChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIHBfbGRhID0gcF9sZGFoICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICByZXQgPSBlbGY2NF9hbHBoYV9kb19yZWxvY19ncGRpc3AgKGFiZmQsIGdwIC0gcmVsb2NhdGlvbiwgcF9sZGFoLCBwX2xkYSk7Ci0KLSAgLyogQ29tcGxhaW4gaWYgdGhlIGluc3RydWN0aW9ucyBhcmUgbm90IGNvcnJlY3QuICAqLwotICBpZiAocmV0ID09IGJmZF9yZWxvY19kYW5nZXJvdXMpCi0gICAgKmVycl9tc2cgPSBfKCJHUERJU1AgcmVsb2NhdGlvbiBkaWQgbm90IGZpbmQgbGRhaCBhbmQgbGRhIGluc3RydWN0aW9ucyIpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEEgbWFwcGluZyBmcm9tIEJGRCByZWxvYyB0eXBlcyB0byBBbHBoYSBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgaW50IGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZl9yZWxvY19tYXAgZWxmNjRfYWxwaGFfcmVsb2NfbWFwW10gPQotewotICB7QkZEX1JFTE9DX05PTkUsCQlSX0FMUEhBX05PTkV9LAotICB7QkZEX1JFTE9DXzMyLAkJUl9BTFBIQV9SRUZMT05HfSwKLSAge0JGRF9SRUxPQ182NCwJCVJfQUxQSEFfUkVGUVVBRH0sCi0gIHtCRkRfUkVMT0NfQ1RPUiwJCVJfQUxQSEFfUkVGUVVBRH0sCi0gIHtCRkRfUkVMT0NfR1BSRUwzMiwJCVJfQUxQSEFfR1BSRUwzMn0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUwsCVJfQUxQSEFfTElURVJBTH0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfTElUVVNFLAlSX0FMUEhBX0xJVFVTRX0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfR1BESVNQLAlSX0FMUEhBX0dQRElTUH0sCi0gIHtCRkRfUkVMT0NfMjNfUENSRUxfUzIsCVJfQUxQSEFfQlJBRERSfSwKLSAge0JGRF9SRUxPQ19BTFBIQV9ISU5ULAlSX0FMUEhBX0hJTlR9LAotICB7QkZEX1JFTE9DXzE2X1BDUkVMLAkJUl9BTFBIQV9TUkVMMTZ9LAotICB7QkZEX1JFTE9DXzMyX1BDUkVMLAkJUl9BTFBIQV9TUkVMMzJ9LAotICB7QkZEX1JFTE9DXzY0X1BDUkVMLAkJUl9BTFBIQV9TUkVMNjR9LAotfTsKLQotLyogR2l2ZW4gYSBCRkQgcmVsb2MgdHlwZSwgcmV0dXJuIGEgSE9XVE8gc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZWxmNjRfYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBjb25zdCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCAqaSwgKmU7Ci0gIGkgPSBlID0gZWxmNjRfYWxwaGFfcmVsb2NfbWFwOwotICBlICs9IHNpemVvZiAoZWxmNjRfYWxwaGFfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOwotICBmb3IgKDsgaSAhPSBlOyArK2kpCi0gICAgewotICAgICAgaWYgKGktPmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZjY0X2FscGhhX2hvd3RvX3RhYmxlW2ktPmVsZl9yZWxvY192YWxdOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEdpdmVuIGFuIEFscGhhIEVMRiByZWxvYyB0eXBlLCBmaWxsIGluIGFuIGFyZWxlbnQgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZjY0X2FscGhhX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmNjRfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICB1bnNpZ25lZCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGNjRfUl9UWVBFKGRzdC0+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+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBkeW5hbWljIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQlfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotCSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyhkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0JICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgZ2VuZXJhdGUgYSBzZWN0aW9uCi0gICAgIHN5bWJvbCBmb3IgZWFjaCBvdXRwdXQgc2VjdGlvbi4gIFRoZXNlIGFyZSBsb2NhbCBzeW1ib2xzLCB3aGljaAotICAgICBtZWFucyB0aGF0IHRoZXkgbXVzdCBjb21lIGZpcnN0IGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLSAgICAgVGhhdCBtZWFucyB3ZSBtdXN0IGluY3JlbWVudCB0aGUgZHluYW1pYyBzeW1ib2wgaW5kZXggb2YgZXZlcnkKLSAgICAgb3RoZXIgZHluYW1pYyBzeW1ib2wuICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGxvbmcgY1syXSwgaTsKLSAgICAgIGFzZWN0aW9uICpwOwotCi0gICAgICBjWzBdID0gMDsKLSAgICAgIGNbMV0gPSBiZmRfY291bnRfc2VjdGlvbnMgKG91dHB1dF9iZmQpOwotCi0gICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ICs9IGNbMV07Ci0gICAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZShpbmZvKSwKLQkJCSAgICAgIGVsZjY0X2FscGhhX2FkanVzdF9keW5pbmR4LAotCQkJICAgICAgKFBUUikgYyk7Ci0KLSAgICAgIGZvciAoaSA9IDEsIHAgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsKLQkgICBwICE9IE5VTEw7Ci0JICAgcCA9IHAtPm5leHQsIGkrKykKLQl7Ci0JICBlbGZfc2VjdGlvbl9kYXRhIChwKS0+ZHluaW5keCA9IGk7Ci0JICAvKiBUaGVzZSBzeW1ib2xzIHdpbGwgaGF2ZSBubyBuYW1lcywgc28gd2UgZG9uJ3QgbmVlZCB0bwotCSAgICAgZmlkZGxlIHdpdGggZHluc3RyX2luZGV4LiAgKi8KLQl9Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpZiAoIWluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoIWJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfREVCVUcsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAocmVscGx0KQotCXsKLQkgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMQSkKLQkgICAgICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBLCAwKQotCSAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFTWiwgMCkKLQkgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBRU5ULAotCQkJCQkgICAgc2l6ZW9mKEVsZjY0X0V4dGVybmFsX1JlbGEpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChyZWx0ZXh0KQotCXsKLQkgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJbmNyZW1lbnQgdGhlIGluZGV4IG9mIGEgZHluYW1pYyBzeW1ib2wgYnkgYSBnaXZlbiBhbW91bnQuICBDYWxsZWQKLSAgIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2FkanVzdF9keW5pbmR4IChoLCBjcGFyZykKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBjcGFyZzsKLXsKLSAgbG9uZyAqY3AgPSAobG9uZyAqKWNwYXJnOwotCi0gIGlmIChoLT5keW5pbmR4ID49IGNwWzBdKQotICAgIGgtPmR5bmluZHggKz0gY3BbMV07Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIEFscGhhIEVMRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0gIGFzZWN0aW9uICpzZWMsICpzZ290LCAqc3JlbCwgKnNyZWxnb3Q7Ci0gIGJmZCAqZHlub2JqLCAqZ290b2JqOwotICBiZmRfdm1hIGdwOwotCi0gIHNyZWxnb3QgPSBzcmVsID0gTlVMTDsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBpZiAoZHlub2JqKQotICAgIHsKLSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgfQotCi0gIC8qIEZpbmQgdGhlIGdwIHZhbHVlIGZvciB0aGlzIGlucHV0IGJmZC4gICovCi0gIHNnb3QgPSBOVUxMOwotICBncCA9IDA7Ci0gIGdvdG9iaiA9IGFscGhhX2VsZl90ZGF0YSAoaW5wdXRfYmZkKS0+Z290b2JqOwotICBpZiAoZ290b2JqKQotICAgIHsKLSAgICAgIHNnb3QgPSBhbHBoYV9lbGZfdGRhdGEgKGdvdG9iaiktPmdvdDsKLSAgICAgIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKGdvdG9iaik7Ci0gICAgICBpZiAoZ3AgPT0gMCkKLQl7Ci0JICBncCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkrIDB4ODAwMCk7Ci0JICBfYmZkX3NldF9ncF92YWx1ZSAoZ290b2JqLCBncCk7Ci0JfQotICAgIH0KLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3R5cGUgPSBFTEY2NF9SX1RZUEUocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfQUxQSEFfbWF4KQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gZWxmNjRfYWxwaGFfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGNjRfUl9TWU0ocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRShzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IGFscGhhX2VsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0KLQkgIHdoaWxlIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiloLT5yb290LnJvb3QudS5pLmxpbms7Ci0KLQkgIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQotI2lmIHJ0aF9ub3RkZWYKLQkgICAgICBpZiAoKHJfdHlwZSA9PSBSX0FMUEhBX0xJVEVSQUwKLQkJICAgJiYgZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAmJiAoIWluZm8tPnNoYXJlZAotCQkgICAgICAgfHwgIWluZm8tPnN5bWJvbGljCi0JCSAgICAgICB8fCAhKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCQkgIHx8IChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKCFpbmZvLT5zeW1ib2xpYwotCQkJICB8fCAhKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JCSAgICAgICYmIChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykKLQkJICAgICAgJiYgKHJfdHlwZSA9PSBSX0FMUEhBX1JFRkxPTkcKLQkJCSAgfHwgcl90eXBlID09IFJfQUxQSEFfUkVGUVVBRAotCQkJICB8fCByX3R5cGUgPT0gUl9BTFBIQV9MSVRFUkFMKSkpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbiB2YWx1ZS4KLQkJICAgICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lIG9ic2N1cmUgY2FzZXMKLQkJICAgICBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLSNlbHNlCi0JICAgICAgLyogRklYTUU6IEFyZSBub3QgdGhlc2Ugb2JzY3VyZSBjYXNlcyBzaW1wbHkgYnVncz8gIExldCdzCi0JCSBnZXQgc29tZXRoaW5nIHdvcmtpbmcgYW5kIGNvbWUgYmFjayB0byB0aGlzLiAgKi8KLQkgICAgICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCQlyZWxvY2F0aW9uID0gMDsKLSNlbmRpZiAvKiBydGhfbm90ZGVmICovCi0JICAgICAgZWxzZQotCQl7Ci0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUKLQkJCQkrIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBhZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JY2FzZSBSX0FMUEhBX0dQRElTUDoKLQkgIHsKLQkgICAgYmZkX2J5dGUgKnBfbGRhaCwgKnBfbGRhOwotCi0JICAgIEJGRF9BU1NFUlQoZ3AgIT0gMCk7Ci0KLQkgICAgcmVsb2NhdGlvbiA9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICArIHJlbC0+cl9vZmZzZXQpOwotCi0JICAgIHBfbGRhaCA9IGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgcF9sZGEgPSBwX2xkYWggKyByZWwtPnJfYWRkZW5kOwotCi0JICAgIHIgPSBlbGY2NF9hbHBoYV9kb19yZWxvY19ncGRpc3AgKGlucHV0X2JmZCwgZ3AgLSByZWxvY2F0aW9uLAotCQkJCQkgICAgIHBfbGRhaCwgcF9sZGEpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfQUxQSEFfT1BfUFVTSDoKLQljYXNlIFJfQUxQSEFfT1BfU1RPUkU6Ci0JY2FzZSBSX0FMUEhBX09QX1BTVUI6Ci0JY2FzZSBSX0FMUEhBX09QX1BSU0hJRlQ6Ci0JICAvKiBXZSBoYXRlIHRoZXNlIHNpbGx5IGJlYXN0cy4gICovCi0JICBhYm9ydCgpOwotCi0JY2FzZSBSX0FMUEhBX0xJVEVSQUw6Ci0JICB7Ci0JICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0JICAgIGJvb2xlYW4gZHluYW1pY19zeW1ib2w7Ci0KLQkgICAgQkZEX0FTU0VSVChzZ290ICE9IE5VTEwpOwotCSAgICBCRkRfQVNTRVJUKGdwICE9IDApOwotCi0JICAgIGlmIChoICE9IE5VTEwpCi0JICAgICAgewotCQlnb3RlbnQgPSBoLT5nb3RfZW50cmllczsKLQkJZHluYW1pY19zeW1ib2wgPSBhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCAoJmgtPnJvb3QsIGluZm8pOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJZ290ZW50ID0gKGFscGhhX2VsZl90ZGF0YShpbnB1dF9iZmQpLT4KLQkJCSAgbG9jYWxfZ290X2VudHJpZXNbcl9zeW1uZHhdKTsKLQkJZHluYW1pY19zeW1ib2wgPSBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgQkZEX0FTU0VSVChnb3RlbnQgIT0gTlVMTCk7Ci0KLQkgICAgd2hpbGUgKGdvdGVudC0+Z290b2JqICE9IGdvdG9iaiB8fCBnb3RlbnQtPmFkZGVuZCAhPSBhZGRlbmQpCi0JICAgICAgZ290ZW50ID0gZ290ZW50LT5uZXh0OwotCi0JICAgIEJGRF9BU1NFUlQoZ290ZW50LT51c2VfY291bnQgPj0gMSk7Ci0KLQkgICAgLyogSW5pdGlhbGl6ZSB0aGUgLmdvdCBlbnRyeSdzIHZhbHVlLiAgKi8KLQkgICAgaWYgKCEoZ290ZW50LT5mbGFncyAmIEFMUEhBX0VMRl9HT1RfRU5UUllfUkVMT0NTX0RPTkUpKQotCSAgICAgIHsKLQkJYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbithZGRlbmQsCi0JCQkgICAgc2dvdC0+Y29udGVudHMgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotCi0JCS8qIElmIHRoZSBzeW1ib2wgaGFzIGJlZW4gZm9yY2VkIGxvY2FsLCBvdXRwdXQgYQotCQkgICBSRUxBVElWRSByZWxvYywgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgaGFuZGxlZCBpbgotCQkgICBmaW5pc2hfZHluYW1pY19zeW1ib2wuICAqLwotCQlpZiAoaW5mby0+c2hhcmVkICYmICFkeW5hbWljX3N5bWJvbCkKLQkJICB7Ci0JCSAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0KLQkJICAgIEJGRF9BU1NFUlQoc3JlbGdvdCAhPSBOVUxMKTsKLQotCQkgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgICAgICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLQkJICAgIG91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8oMCwgUl9BTFBIQV9SRUxBVElWRSk7Ci0JCSAgICBvdXRyZWwucl9hZGRlbmQgPSAwOwotCi0JCSAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgICAgICAgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopCi0JCQkJCSAgICAgICAgc3JlbGdvdC0+Y29udGVudHMpCi0JCQkJCSAgICAgICArIHNyZWxnb3QtPnJlbG9jX2NvdW50KyspOwotCQkgICAgQkZEX0FTU0VSVCAoc2l6ZW9mKEVsZjY0X0V4dGVybmFsX1JlbGEpCi0JCQkJKiBzcmVsZ290LT5yZWxvY19jb3VudAotCQkJCTw9IHNyZWxnb3QtPl9jb29rZWRfc2l6ZSk7Ci0JCSAgfQotCi0JCWdvdGVudC0+ZmxhZ3MgfD0gQUxQSEFfRUxGX0dPVF9FTlRSWV9SRUxPQ1NfRE9ORTsKLQkgICAgICB9Ci0KLQkgICAgLyogRmlndXJlIHRoZSBncHJlbCByZWxvY2F0aW9uLiAgKi8KLQkgICAgYWRkZW5kID0gMDsKLQkgICAgcmVsb2NhdGlvbiA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJICArIGdvdGVudC0+Z290X29mZnNldCk7Ci0JICAgIHJlbG9jYXRpb24gLT0gZ3A7Ci0JICB9Ci0JICAvKiBvdmVyZmxvdyBoYW5kbGVkIGJ5IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAqLwotCSAgZ290byBkZWZhdWx0X3JlbG9jOwotCi0JY2FzZSBSX0FMUEhBX0dQUkVMMzI6Ci0JY2FzZSBSX0FMUEhBX0dQUkVMTE9XOgotCSAgQkZEX0FTU0VSVChncCAhPSAwKTsKLQkgIHJlbG9jYXRpb24gLT0gZ3A7Ci0JICBnb3RvIGRlZmF1bHRfcmVsb2M7Ci0KLQljYXNlIFJfQUxQSEFfR1BSRUxISUdIOgotCSAgQkZEX0FTU0VSVChncCAhPSAwKTsKLQkgIHJlbG9jYXRpb24gLT0gZ3A7Ci0JICByZWxvY2F0aW9uICs9IGFkZGVuZDsKLQkgIGFkZGVuZCA9IDA7Ci0JICByZWxvY2F0aW9uID0gKCgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPj4gMTYpCi0JCQkrICgocmVsb2NhdGlvbiA+PiAxNSkgJiAxKSk7Ci0JICBnb3RvIGRlZmF1bHRfcmVsb2M7Ci0KLQljYXNlIFJfQUxQSEFfQlJBRERSOgotCWNhc2UgUl9BTFBIQV9ISU5UOgotCSAgLyogVGhlIHJlZ3VsYXIgUEMtcmVsYXRpdmUgc3R1ZmYgbWVhc3VyZXMgZnJvbSB0aGUgc3RhcnQgb2YKLQkgICAgIHRoZSBpbnN0cnVjdGlvbiByYXRoZXIgdGhhbiB0aGUgZW5kLiAgKi8KLQkgIGFkZGVuZCAtPSA0OwotCSAgZ290byBkZWZhdWx0X3JlbG9jOwotCi0JY2FzZSBSX0FMUEhBX1JFRkxPTkc6Ci0JY2FzZSBSX0FMUEhBX1JFRlFVQUQ6Ci0JICB7Ci0JICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQkgICAgYm9vbGVhbiBza2lwOwotCi0JICAgIC8qIENhcmVmdWwgaGVyZSB0byByZW1lbWJlciBSRUxBVElWRSByZWxvY2F0aW9ucyBmb3IgZ2xvYmFsCi0JICAgICAgIHZhcmlhYmxlcyBmb3Igc3ltYm9saWMgc2hhcmVkIG9iamVjdHMuICAqLwotCi0JICAgIGlmIChoICYmIGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wICgmaC0+cm9vdCwgaW5mbykpCi0JICAgICAgewotCQlCRkRfQVNTRVJUKGgtPnJvb3QuZHluaW5keCAhPSAtMSk7Ci0JCW91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8oaC0+cm9vdC5keW5pbmR4LCByX3R5cGUpOwotCQlvdXRyZWwucl9hZGRlbmQgPSBhZGRlbmQ7Ci0JCWFkZGVuZCA9IDAsIHJlbG9jYXRpb24gPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoaW5mby0+c2hhcmVkKQotCSAgICAgIHsKLQkJb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTygwLCBSX0FMUEhBX1JFTEFUSVZFKTsKLQkJb3V0cmVsLnJfYWRkZW5kID0gMDsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICBnb3RvIGRlZmF1bHRfcmVsb2M7Ci0KLQkgICAgaWYgKCFzcmVsKQotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQluYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCShpbnB1dF9iZmQsIGVsZl9lbGZoZWFkZXIoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSBlbGZfc2VjdGlvbl9kYXRhKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJQkZEX0FTU0VSVChuYW1lICE9IE5VTEwpOwotCi0JCXNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJQkZEX0FTU0VSVChzcmVsICE9IE5VTEwpOwotCSAgICAgIH0KLQotCSAgICBza2lwID0gZmFsc2U7Ci0KLQkgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkgICAgICBvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCSAgICBlbHNlCi0JICAgICAgewotCQliZmRfdm1hIG9mZjsKLQotCQlvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0JCSAgICAgICAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkJaW5wdXRfc2VjdGlvbiwKLQkJCSZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCQkJcmVsLT5yX29mZnNldCkpOwotCQlpZiAob2ZmID09IChiZmRfdm1hKSAtMSkKLQkJICBza2lwID0gdHJ1ZTsKLQkJb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCSAgICAgIH0KLQotCSAgICBpZiAoISBza2lwKQotCSAgICAgIG91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgZWxzZQotCSAgICAgIG1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIG91dHJlbCk7Ci0KLQkgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkgICAgICAgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopCi0JCQkJCXNyZWwtPmNvbnRlbnRzKQotCQkJCSAgICAgICArIHNyZWwtPnJlbG9jX2NvdW50KyspOwotCSAgICBCRkRfQVNTRVJUIChzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkgKiBzcmVsLT5yZWxvY19jb3VudAotCQkJPD0gc3JlbC0+X2Nvb2tlZF9zaXplKTsKLQkgIH0KLQkgIGdvdG8gZGVmYXVsdF9yZWxvYzsKLQotCWRlZmF1bHQ6Ci0JZGVmYXVsdF9yZWxvYzoKLQkgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCWNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCByZWxvY2F0aW9uLAotCQkJCQlhZGRlbmQpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHIpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICBpZiAoaCAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICAgIH0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqID0gZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bm9iajsKLQotICBpZiAoaC0+cGx0Lm9mZnNldCAhPSBNSU5VU19PTkUpCi0gICAgewotICAgICAgLyogRmlsbCBpbiB0aGUgLnBsdCBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICAqLwotICAgICAgYXNlY3Rpb24gKnNwbHQsICpzZ290LCAqc3JlbDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLSAgICAgIGJmZF92bWEgZ290X2FkZHIsIHBsdF9hZGRyOwotICAgICAgYmZkX3ZtYSBwbHRfaW5kZXg7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgLyogVGhlIGZpcnN0IC5nb3QgZW50cnkgd2lsbCBiZSB1cGRhdGVkIGJ5IHRoZSAucGx0IHdpdGggdGhlCi0JIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBmdW5jdGlvbi4gICovCi0gICAgICBnb3RlbnQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopIGgpLT5nb3RfZW50cmllczsKLSAgICAgIEJGRF9BU1NFUlQgKGdvdGVudCAmJiBnb3RlbnQtPmFkZGVuZCA9PSAwKTsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwpOwotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0gICAgICBzZ290ID0gYWxwaGFfZWxmX3RkYXRhIChnb3RlbnQtPmdvdG9iaiktPmdvdDsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0KLSAgICAgIGdvdF9hZGRyID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICArIGdvdGVudC0+Z290X29mZnNldCk7Ci0gICAgICBwbHRfYWRkciA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgKyBoLT5wbHQub2Zmc2V0KTsKLQotICAgICAgcGx0X2luZGV4ID0gKGgtPnBsdC5vZmZzZXQgLSBQTFRfSEVBREVSX1NJWkUpIC8gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICB7Ci0JdW5zaWduZWQgaW5zbjEsIGluc24yLCBpbnNuMzsKLQotCWluc24xID0gUExUX0VOVFJZX1dPUkQxIHwgKCgtKGgtPnBsdC5vZmZzZXQgKyA0KSA+PiAyKSAmIDB4MWZmZmZmKTsKLQlpbnNuMiA9IFBMVF9FTlRSWV9XT1JEMjsKLQlpbnNuMyA9IFBMVF9FTlRSWV9XT1JEMzsKLQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGluc24xLCBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQpOwotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGluc24yLCBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyA0KTsKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBpbnNuMywgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgOCk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCi0gICAgICBvdXRyZWwucl9vZmZzZXQgPSBnb3RfYWRkcjsKLSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8oaC0+ZHluaW5keCwgUl9BTFBIQV9KTVBfU0xPVCk7Ci0gICAgICBvdXRyZWwucl9hZGRlbmQgPSAwOwotCi0gICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCSAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKilzcmVsLT5jb250ZW50cwotCQkJCSAgKyBwbHRfaW5kZXgpKTsKLQotICAgICAgaWYgKCEoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCXsKLQkgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGFzIGRlZmluZWQgaW4gdGhlCi0JICAgICAucGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQl9Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJpZXMgaW4gdGhlIC5nb3QuICAqLwotICAgICAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgcGx0X2FkZHIsIHNnb3QtPmNvbnRlbnRzICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLQotICAgICAgLyogU3Vic2VxdWVudCAuZ290IGVudHJpZXMgd2lsbCBjb250aW51ZSB0byBib3VuY2UgdGhyb3VnaCB0aGUgLnBsdC4gICovCi0gICAgICBpZiAoZ290ZW50LT5uZXh0KQotCXsKLQkgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICBCRkRfQVNTRVJUICghIGluZm8tPnNoYXJlZCB8fCBzcmVsICE9IE5VTEwpOwotCi0JICBnb3RlbnQgPSBnb3RlbnQtPm5leHQ7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgc2dvdCA9IGFscGhhX2VsZl90ZGF0YShnb3RlbnQtPmdvdG9iaiktPmdvdDsKLQkgICAgICBCRkRfQVNTRVJUKHNnb3QgIT0gTlVMTCk7Ci0JICAgICAgQkZEX0FTU0VSVChnb3RlbnQtPmFkZGVuZCA9PSAwKTsKLQotCSAgICAgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIHBsdF9hZGRyLAotCQkgICAgICAgICAgc2dvdC0+Y29udGVudHMgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotCi0JICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQkJewotCQkgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCQkgICAgICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPKDAsIFJfQUxQSEFfUkVMQVRJVkUpOwotCQkgIG91dHJlbC5yX2FkZGVuZCA9IDA7Ci0KLQkJICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgICAgICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkgICAgICBzcmVsLT5jb250ZW50cykKLQkJCQkJICAgICArIHNyZWwtPnJlbG9jX2NvdW50KyspOwotCQkgIEJGRF9BU1NFUlQgKHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKSAqIHNyZWwtPnJlbG9jX2NvdW50Ci0JCQkgICAgICA8PSBzcmVsLT5fY29va2VkX3NpemUpOwotCQl9Ci0KLQkgICAgICBnb3RlbnQgPSBnb3RlbnQtPm5leHQ7Ci0JICAgIH0KLSAgICAgICAgICB3aGlsZSAoZ290ZW50ICE9IE5VTEwpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wIChoLCBpbmZvKSkKLSAgICB7Ci0gICAgICAvKiBGaWxsIGluIHRoZSBkeW5hbWljIHJlbG9jYXRpb25zIGZvciB0aGlzIHN5bWJvbCdzIC5nb3QgZW50cmllcy4gICovCi0gICAgICBhc2VjdGlvbiAqc3JlbDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0KLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotCi0gICAgICBvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FMUEhBX0dMT0JfREFUKTsKLSAgICAgIGZvciAoZ290ZW50ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoKS0+Z290X2VudHJpZXM7Ci0JICAgZ290ZW50ICE9IE5VTEw7Ci0JICAgZ290ZW50ID0gZ290ZW50LT5uZXh0KQotCXsKLQkgIGFzZWN0aW9uICpzZ290ID0gYWxwaGFfZWxmX3RkYXRhIChnb3RlbnQtPmdvdG9iaiktPmdvdDsKLQkgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJICAgICArIGdvdGVudC0+Z290X29mZnNldCk7Ci0JICBvdXRyZWwucl9hZGRlbmQgPSBnb3RlbnQtPmFkZGVuZDsKLQotCSAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkgICAgICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKXNyZWwtPmNvbnRlbnRzCi0JCQkJICAgICAgKyBzcmVsLT5yZWxvY19jb3VudCsrKSk7Ci0JICBCRkRfQVNTRVJUIChzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkgKiBzcmVsLT5yZWxvY19jb3VudAotCQkgICAgICA8PSBzcmVsLT5fY29va2VkX3NpemUpOwotCX0KLSAgICB9Ci0KLSAgLyogTWFyayBzb21lIHNwZWNpYWxseSBkZWZpbmVkIHN5bWJvbHMgYXMgYWJzb2x1dGUuICAqLwotICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNkeW47Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBFbGY2NF9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2R5biAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZjY0X0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGY2NF9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGFzZWN0aW9uICpzOwotCi0JICBiZmRfZWxmNjRfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgY2FzZSBEVF9QTFRHT1Q6Ci0JICAgICAgbmFtZSA9ICIucGx0IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfUExUUkVMU1o6Ci0JICAgICAgbmFtZSA9ICIucmVsYS5wbHQiOwotCSAgICAgIGdvdG8gZ2V0X3NpemU7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOgotCSAgICAgIG5hbWUgPSAiLnJlbGEucGx0IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0KLQkgICAgY2FzZSBEVF9SRUxBU1o6Ci0JICAgICAgLyogTXkgaW50ZXJwcmV0YXRpb24gb2YgdGhlIFRJUyB2MS4xIEVMRiBkb2N1bWVudCBpbmRpY2F0ZXMKLQkJIHRoYXQgUkVMQVNaIHNob3VsZCBub3QgaW5jbHVkZSBKTVBSRUwuICBUaGlzIGlzIG5vdCB3aGF0Ci0JCSB0aGUgcmVzdCBvZiB0aGUgQkZEIGRvZXMuICBJdCBpcywgaG93ZXZlciwgd2hhdCB0aGUKLQkJIGdsaWJjIGxkLnNvIHdhbnRzLiAgRG8gdGhpcyBmaXh1cCBoZXJlIHVudGlsIHdlIGZvdW5kCi0JCSBvdXQgd2hvIGlzIHJpZ2h0LiAgKi8KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsYS5wbHQiKTsKLQkgICAgICBpZiAocykKLQkJewotCQkgIGR5bi5kX3VuLmRfdmFsIC09Ci0JCSAgICAocy0+X2Nvb2tlZF9zaXplID8gcy0+X2Nvb2tlZF9zaXplIDogcy0+X3Jhd19zaXplKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGdldF92bWE6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IChzID8gcy0+dm1hIDogMCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZ2V0X3NpemU6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9Ci0JCShzLT5fY29va2VkX3NpemUgPyBzLT5fY29va2VkX3NpemUgOiBzLT5fcmF3X3NpemUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JfQotCi0gICAgICAvKiBJbml0aWFsaXplIHRoZSBQTFQwIGVudHJ5ICovCi0gICAgICBpZiAoc3BsdC0+X3Jhd19zaXplID4gMCkKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBQTFRfSEVBREVSX1dPUkQxLCBzcGx0LT5jb250ZW50cyk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBQTFRfSEVBREVSX1dPUkQyLCBzcGx0LT5jb250ZW50cyArIDQpOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgUExUX0hFQURFUl9XT1JEMywgc3BsdC0+Y29udGVudHMgKyA4KTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFBMVF9IRUFERVJfV09SRDQsIHNwbHQtPmNvbnRlbnRzICsgMTIpOwotCi0JICAvKiBUaGUgbmV4dCB0d28gd29yZHMgd2lsbCBiZSBmaWxsZWQgaW4gYnkgbGQuc28gKi8KLQkgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIDAsIHNwbHQtPmNvbnRlbnRzICsgMTYpOwotCSAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgMCwgc3BsdC0+Y29udGVudHMgKyAyNCk7Ci0KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9Ci0JICAgIFBMVF9IRUFERVJfU0laRTsKLQl9Ci0gICAgfQotCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNkeW5zeW07Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotCi0gICAgICAvKiBTZXQgdXAgdGhlIHNlY3Rpb24gc3ltYm9scyBmb3IgdGhlIG91dHB1dCBzZWN0aW9ucy4gICovCi0KLSAgICAgIHNkeW5zeW0gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgQkZEX0FTU0VSVCAoc2R5bnN5bSAhPSBOVUxMKTsKLQotICAgICAgc3ltLnN0X3NpemUgPSAwOwotICAgICAgc3ltLnN0X25hbWUgPSAwOwotICAgICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfU0VDVElPTik7Ci0gICAgICBzeW0uc3Rfb3RoZXIgPSAwOwotCi0gICAgICBmb3IgKHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpbnQgaW5keDsKLQotCSAgc3ltLnN0X3ZhbHVlID0gcy0+dm1hOwotCi0JICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgQkZEX0FTU0VSVCAoaW5keCA+IDApOwotCSAgc3ltLnN0X3NobmR4ID0gaW5keDsKLQotCSAgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCAob3V0cHV0X2JmZCwgJnN5bSwKLQkJCQkgICAgIChQVFIpICgoKEVsZjY0X0V4dGVybmFsX1N5bSAqKQotCQkJCQkgICAgIHNkeW5zeW0tPmNvbnRlbnRzKQotCQkJCQkgICAgKyBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCkpOwotCX0KLQotICAgICAgLyogU2V0IHRoZSBzaF9pbmZvIGZpZWxkIG9mIHRoZSBvdXRwdXQgLmR5bnN5bSBzZWN0aW9uIHRvIHRoZQotICAgICAgICAgaW5kZXggb2YgdGhlIGZpcnN0IGdsb2JhbCBzeW1ib2wuICAqLwotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2R5bnN5bS0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9pbmZvID0KLQliZmRfY291bnRfc2VjdGlvbnMgKG91dHB1dF9iZmQpICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIG5lZWQgdG8gdXNlIGEgc3BlY2lhbCBsaW5rIHJvdXRpbmUgdG8gaGFuZGxlIHRoZSAucmVnaW5mbyBhbmQKLSAgIHRoZSAubWRlYnVnIHNlY3Rpb25zLiAgV2UgbmVlZCB0byBtZXJnZSBhbGwgaW5zdGFuY2VzIG9mIHRoZXNlCi0gICBzZWN0aW9ucyB0b2dldGhlciwgbm90IHdyaXRlIHRoZW0gYWxsIG91dCBzZXF1ZW50aWFsbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgYXNlY3Rpb24gKnJlZ2luZm9fc2VjLCAqbWRlYnVnX3NlYywgKmdwdGFiX2RhdGFfc2VjLCAqZ3B0YWJfYnNzX3NlYzsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gZGVidWc7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwCi0gICAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0gIEhEUlIgKnN5bWhkciA9ICZkZWJ1Zy5zeW1ib2xpY19oZWFkZXI7Ci0gIFBUUiBtZGVidWdfaGFuZGxlID0gTlVMTDsKLQotI2lmIDAKLQkgICAgICBpZiAoKytuZ290cyA9PSAyKQotCQl7Ci0JCSAgKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgXygidXNpbmcgbXVsdGlwbGUgZ3AgdmFsdWVzIiksIChjaGFyICopIE5VTEwsCi0JCSAgICAgb3V0cHV0X2JmZCwgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKTsKLQkJfQotI2VuZGlmCi0KLSAgLyogR28gdGhyb3VnaCB0aGUgc2VjdGlvbnMgYW5kIGNvbGxlY3QgdGhlIC5yZWdpbmZvIGFuZCAubWRlYnVnCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgcmVnaW5mb19zZWMgPSBOVUxMOwotICBtZGVidWdfc2VjID0gTlVMTDsKLSAgZ3B0YWJfZGF0YV9zZWMgPSBOVUxMOwotICBncHRhYl9ic3Nfc2VjID0gTlVMTDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSNpZmRlZiBFUklDX25ldmVyZGVmCi0gICAgICBpZiAoc3RyY21wIChvLT5uYW1lLCAiLnJlZ2luZm8iKSA9PSAwKQotCXsKLQkgIG1lbXNldCAoJnJlZ2luZm8sIDAsIHNpemVvZiByZWdpbmZvKTsKLQotCSAgLyogV2UgaGF2ZSBmb3VuZCB0aGUgLnJlZ2luZm8gc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuCi0JICAgICBMb29rIHRocm91Z2ggYWxsIHRoZSBsaW5rX29yZGVycyBjb21wcmlzaW5nIGl0IGFuZCBtZXJnZQotCSAgICAgdGhlIGluZm9ybWF0aW9uIHRvZ2V0aGVyLiAgKi8KLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JICAgICAgYmZkICppbnB1dF9iZmQ7Ci0JICAgICAgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyBleHQ7Ci0JICAgICAgRWxmNjRfUmVnSW5mbyBzdWI7Ci0KLQkgICAgICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJewotCQkgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCSAgICBjb250aW51ZTsKLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaW5wdXRfc2VjdGlvbiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQkgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLQotCSAgICAgIC8qIFRoZSBsaW5rZXIgZW11bGF0aW9uIGNvZGUgaGFzIHByb2JhYmx5IGNsb2JiZXJlZCB0aGUKLSAgICAgICAgICAgICAgICAgc2l6ZSB0byBiZSB6ZXJvIGJ5dGVzLiAgKi8KLQkgICAgICBpZiAoaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplID09IDApCi0JCWlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSA9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyk7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgICAgKFBUUikgJmV4dCwKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCQkgICAgICBzaXplb2YgZXh0KSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgYmZkX2FscGhhX2VsZjY0X3N3YXBfcmVnaW5mb19pbiAoaW5wdXRfYmZkLCAmZXh0LCAmc3ViKTsKLQotCSAgICAgIHJlZ2luZm8ucmlfZ3BybWFzayB8PSBzdWIucmlfZ3BybWFzazsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbMF0gfD0gc3ViLnJpX2Nwcm1hc2tbMF07Ci0JICAgICAgcmVnaW5mby5yaV9jcHJtYXNrWzFdIHw9IHN1Yi5yaV9jcHJtYXNrWzFdOwotCSAgICAgIHJlZ2luZm8ucmlfY3BybWFza1syXSB8PSBzdWIucmlfY3BybWFza1syXTsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbM10gfD0gc3ViLnJpX2Nwcm1hc2tbM107Ci0KLQkgICAgICAvKiByaV9ncF92YWx1ZSBpcyBzZXQgYnkgdGhlIGZ1bmN0aW9uCi0JCSBhbHBoYV9lbGZfc2VjdGlvbl9wcm9jZXNzaW5nIHdoZW4gdGhlIHNlY3Rpb24gaXMKLQkJIGZpbmFsbHkgd3JpdHRlbiBvdXQuICAqLwotCi0JICAgICAgLyogSGFjazogcmVzZXQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBzbyB0aGF0Ci0JCSBlbGZfbGlua19pbnB1dF9iZmQgaWdub3JlcyB0aGlzIHNlY3Rpb24uICAqLwotCSAgICAgIGlucHV0X3NlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICB9Ci0KLQkgIC8qIEZvcmNlIHRoZSBzZWN0aW9uIHNpemUgdG8gdGhlIHZhbHVlIHdlIHdhbnQuICAqLwotCSAgby0+X3Jhd19zaXplID0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKTsKLQotCSAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKLQkgICAgIG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0KLQkgIHJlZ2luZm9fc2VjID0gbzsKLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5tZGVidWciKSA9PSAwKQotCXsKLQkgIHN0cnVjdCBleHRzeW1faW5mbyBlaW5mbzsKLQotCSAgLyogV2UgaGF2ZSBmb3VuZCB0aGUgLm1kZWJ1ZyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4KLQkgICAgIExvb2sgdGhyb3VnaCBhbGwgdGhlIGxpbmtfb3JkZXJzIGNvbXByaXNpbmcgaXQgYW5kIG1lcmdlCi0JICAgICB0aGUgaW5mb3JtYXRpb24gdG9nZXRoZXIuICAqLwotCSAgc3ltaGRyLT5tYWdpYyA9IHN3YXAtPnN5bV9tYWdpYzsKLQkgIC8qIEZJWE1FOiBXaGF0IHNob3VsZCB0aGUgdmVyc2lvbiBzdGFtcCBiZT8gICovCi0JICBzeW1oZHItPnZzdGFtcCA9IDA7Ci0JICBzeW1oZHItPmlsaW5lTWF4ID0gMDsKLQkgIHN5bWhkci0+Y2JMaW5lID0gMDsKLQkgIHN5bWhkci0+aWRuTWF4ID0gMDsKLQkgIHN5bWhkci0+aXBkTWF4ID0gMDsKLQkgIHN5bWhkci0+aXN5bU1heCA9IDA7Ci0JICBzeW1oZHItPmlvcHRNYXggPSAwOwotCSAgc3ltaGRyLT5pYXV4TWF4ID0gMDsKLQkgIHN5bWhkci0+aXNzTWF4ID0gMDsKLQkgIHN5bWhkci0+aXNzRXh0TWF4ID0gMDsKLQkgIHN5bWhkci0+aWZkTWF4ID0gMDsKLQkgIHN5bWhkci0+Y3JmZCA9IDA7Ci0JICBzeW1oZHItPmlleHRNYXggPSAwOwotCi0JICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXRzZWxmIGluIHRoZQotCSAgICAgZGVidWdfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCSAgZGVidWcubGluZSA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9kbnIgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfcGRyID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX3N5bSA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9vcHQgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfYXV4ID0gTlVMTDsKLQkgIGRlYnVnLnNzID0gTlVMTDsKLQkgIGRlYnVnLnNzZXh0ID0gZGVidWcuc3NleHRfZW5kID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX2ZkciA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9yZmQgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfZXh0ID0gZGVidWcuZXh0ZXJuYWxfZXh0X2VuZCA9IE5VTEw7Ci0KLQkgIG1kZWJ1Z19oYW5kbGUgPSBiZmRfZWNvZmZfZGVidWdfaW5pdCAoYWJmZCwgJmRlYnVnLCBzd2FwLCBpbmZvKTsKLQkgIGlmIChtZGVidWdfaGFuZGxlID09IChQVFIpIE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKDEpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQkgICAgICBFWFRSIGVzeW07Ci0JICAgICAgYmZkX3ZtYSBsYXN0OwotCSAgICAgIHVuc2lnbmVkIGludCBpOwotCSAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZVtdID0KLQkJewotCQkgICIudGV4dCIsICIuaW5pdCIsICIuZmluaSIsICIuZGF0YSIsCi0JCSAgIi5yb2RhdGEiLCAiLnNkYXRhIiwgIi5zYnNzIiwgIi5ic3MiCi0JCX07Ci0JICAgICAgc3RhdGljIGNvbnN0IGludCBzY1tdID0geyBzY1RleHQsIHNjSW5pdCwgc2NGaW5pLCBzY0RhdGEsCi0JCQkJCSAgc2NSRGF0YSwgc2NTRGF0YSwgc2NTQnNzLCBzY0JzcyB9OwotCi0JICAgICAgZXN5bS5qbXB0YmwgPSAwOwotCSAgICAgIGVzeW0uY29ib2xfbWFpbiA9IDA7Ci0JICAgICAgZXN5bS53ZWFrZXh0ID0gMDsKLQkgICAgICBlc3ltLnJlc2VydmVkID0gMDsKLQkgICAgICBlc3ltLmlmZCA9IGlmZE5pbDsKLQkgICAgICBlc3ltLmFzeW0uaXNzID0gaXNzTmlsOwotCSAgICAgIGVzeW0uYXN5bS5zdCA9IHN0TG9jYWw7Ci0JICAgICAgZXN5bS5hc3ltLnJlc2VydmVkID0gMDsKLQkgICAgICBlc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQl7Ci0JCSAgZXN5bS5hc3ltLnNjID0gc2NbaV07Ci0JCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lW2ldKTsKLQkJICBpZiAocyAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBlc3ltLmFzeW0udmFsdWUgPSBzLT52bWE7Ci0JCSAgICAgIGxhc3QgPSBzLT52bWEgKyBzLT5fcmF3X3NpemU7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgZXN5bS5hc3ltLnZhbHVlID0gbGFzdDsKLQotCQkgIGlmICghIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgKGFiZmQsICZkZWJ1Zywgc3dhcCwKLQkJCQkJCSAgICAgIG5hbWVbaV0sICZlc3ltKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JICAgICAgYmZkICppbnB1dF9iZmQ7Ci0JICAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmlucHV0X3N3YXA7Ci0JICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gaW5wdXRfZGVidWc7Ci0JICAgICAgY2hhciAqZXJhd19zcmM7Ci0JICAgICAgY2hhciAqZXJhd19lbmQ7Ci0KLQkgICAgICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJewotCQkgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCSAgICBjb250aW51ZTsKLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaW5wdXRfc2VjdGlvbiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQkgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLQotCSAgICAgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGlucHV0X2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCQkgIHx8IChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoaW5wdXRfYmZkKQotCQkgICAgICAtPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXApID09IE5VTEwpCi0JCXsKLQkJICAvKiBJIGRvbid0IGtub3cgd2hhdCBhIG5vbiBBTFBIQSBFTEYgYmZkIHdvdWxkIGJlCi0JCSAgICAgZG9pbmcgd2l0aCBhIC5tZGVidWcgc2VjdGlvbiwgYnV0IEkgZG9uJ3QgcmVhbGx5Ci0JCSAgICAgd2FudCB0byBkZWFsIHdpdGggaXQuICAqLwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zd2FwID0gKGdldF9lbGZfYmFja2VuZF9kYXRhIChpbnB1dF9iZmQpCi0JCQkgICAgLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwKTsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHAtPnNpemUgPT0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotCSAgICAgIC8qIFRoZSBFQ09GRiBsaW5raW5nIGNvZGUgZXhwZWN0cyB0aGF0IHdlIGhhdmUgYWxyZWFkeQotCQkgcmVhZCBpbiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFuZCBzZXQgdXAgYW4KLQkJIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLCBzbyB3ZSBkbyB0aGF0IG5vdy4gICovCi0JICAgICAgaWYgKCFlbGY2NF9hbHBoYV9yZWFkX2Vjb2ZmX2luZm8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJCSZpbnB1dF9kZWJ1ZykpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmICghIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZQotCQkgICAgIChtZGVidWdfaGFuZGxlLCBhYmZkLCAmZGVidWcsIHN3YXAsIGlucHV0X2JmZCwKLQkJICAgICAgJmlucHV0X2RlYnVnLCBpbnB1dF9zd2FwLCBpbmZvKSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gIEZvciBlYWNoIG9uZSB3aXRoCi0JCSBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiwgdHJ5IHRvIGZpbmQgdGhlIHN5bWJvbCBpbgotCQkgdGhlIGxpbmtlciBnbG9iYWwgaGFzaCB0YWJsZSBhbmQgc2F2ZSB0aGUgaW5mb3JtYXRpb24KLQkJIGZvciB0aGUgb3V0cHV0IGV4dGVybmFsIHN5bWJvbHMuICAqLwotCSAgICAgIGVyYXdfc3JjID0gaW5wdXRfZGVidWcuZXh0ZXJuYWxfZXh0OwotCSAgICAgIGVyYXdfZW5kID0gKGVyYXdfc3JjCi0JCQkgICsgKGlucHV0X2RlYnVnLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4Ci0JCQkgICAgICogaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpKTsKLQkgICAgICBmb3IgKDsKLQkJICAgZXJhd19zcmMgPCBlcmF3X2VuZDsKLQkJICAgZXJhd19zcmMgKz0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpCi0JCXsKLQkJICBFWFRSIGV4dDsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCQkgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgKCppbnB1dF9zd2FwLT5zd2FwX2V4dF9pbikgKGlucHV0X2JmZCwgKFBUUikgZXJhd19zcmMsICZleHQpOwotCQkgIGlmIChleHQuYXN5bS5zYyA9PSBzY05pbAotCQkgICAgICB8fCBleHQuYXN5bS5zYyA9PSBzY1VuZGVmaW5lZAotCQkgICAgICB8fCBleHQuYXN5bS5zYyA9PSBzY1NVbmRlZmluZWQpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIG5hbWUgPSBpbnB1dF9kZWJ1Zy5zc2V4dCArIGV4dC5hc3ltLmlzczsKLQkJICBoID0gYWxwaGFfZWxmX2xpbmtfaGFzaF9sb29rdXAgKGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJICBpZiAoaCA9PSBOVUxMIHx8IGgtPmVzeW0uaWZkICE9IC0yKQotCQkgICAgY29udGludWU7Ci0KLQkJICBpZiAoZXh0LmlmZCAhPSAtMSkKLQkJICAgIHsKLQkJICAgICAgQkZEX0FTU0VSVCAoZXh0LmlmZAotCQkJCSAgPCBpbnB1dF9kZWJ1Zy5zeW1ib2xpY19oZWFkZXIuaWZkTWF4KTsKLQkJICAgICAgZXh0LmlmZCA9IGlucHV0X2RlYnVnLmlmZG1hcFtleHQuaWZkXTsKLQkJICAgIH0KLQotCQkgIGgtPmVzeW0gPSBleHQ7Ci0JCX0KLQotCSAgICAgIC8qIEZyZWUgdXAgdGhlIGluZm9ybWF0aW9uIHdlIGp1c3QgcmVhZC4gICovCi0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcubGluZSk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZG5yKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9wZHIpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3N5bSk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfb3B0KTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9hdXgpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLnNzKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5zc2V4dCk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZmRyKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9yZmQpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX2V4dCk7Ci0KLQkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotI2lmZGVmIEVSSUNfbmV2ZXJkZWYKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICAvKiBDcmVhdGUgLnJ0cHJvYyBzZWN0aW9uLiAgKi8KLQkgICAgICBydHByb2Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucnRwcm9jIik7Ci0JICAgICAgaWYgKHJ0cHJvY19zZWMgPT0gTlVMTCkKLQkJewotCQkgIGZsYWd3b3JkIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJICAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJICAgIHwgU0VDX1JFQURPTkxZKTsKLQotCQkgIHJ0cHJvY19zZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJ0cHJvYyIpOwotCQkgIGlmIChydHByb2Nfc2VjID09IE5VTEwKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHJ0cHJvY19zZWMsIGZsYWdzKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHJ0cHJvY19zZWMsIDEyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgaWYgKCEgYWxwaGFfZWxmX2NyZWF0ZV9wcm9jZWR1cmVfdGFibGUgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsCi0JCQkJCQkgICAgIGluZm8sIHJ0cHJvY19zZWMsICZkZWJ1ZykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotI2VuZGlmCi0KLQotCSAgLyogQnVpbGQgdGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0JICBlaW5mby5hYmZkID0gYWJmZDsKLQkgIGVpbmZvLmluZm8gPSBpbmZvOwotCSAgZWluZm8uZGVidWcgPSAmZGVidWc7Ci0JICBlaW5mby5zd2FwID0gc3dhcDsKLQkgIGVpbmZvLmZhaWxlZCA9IGZhbHNlOwotCSAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgZWxmNjRfYWxwaGFfb3V0cHV0X2V4dHN5bSwKLQkJCQkgIChQVFIpICZlaW5mbyk7Ci0JICBpZiAoZWluZm8uZmFpbGVkKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgLm1kZWJ1ZyBzZWN0aW9uLiAgKi8KLQkgIG8tPl9yYXdfc2l6ZSA9IGJmZF9lY29mZl9kZWJ1Z19zaXplIChhYmZkLCAmZGVidWcsIHN3YXApOwotCi0JICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQotCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQotCSAgbWRlYnVnX3NlYyA9IG87Ci0JfQotCi0jaWZkZWYgRVJJQ19uZXZlcmRlZgotICAgICAgaWYgKHN0cm5jbXAgKG8tPm5hbWUsICIuZ3B0YWIuIiwgc2l6ZW9mICIuZ3B0YWIuIiAtIDEpID09IDApCi0JewotCSAgY29uc3QgY2hhciAqc3VibmFtZTsKLQkgIHVuc2lnbmVkIGludCBjOwotCSAgRWxmNjRfZ3B0YWIgKnRhYjsKLQkgIEVsZjY0X0V4dGVybmFsX2dwdGFiICpleHRfdGFiOwotCSAgdW5zaWduZWQgaW50IGk7Ci0KLQkgIC8qIFRoZSAuZ3B0YWIuc2RhdGEgYW5kIC5ncHRhYi5zYnNzIHNlY3Rpb25zIGhvbGQKLQkgICAgIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgaG93IHRoZSBzbWFsbCBkYXRhIGFyZWEgd291bGQKLQkgICAgIGNoYW5nZSBkZXBlbmRpbmcgdXBvbiB0aGUgLUcgc3dpdGNoLiAgVGhlc2Ugc2VjdGlvbnMKLQkgICAgIG5vdCB1c2VkIGluIGV4ZWN1dGFibGVzIGZpbGVzLiAgKi8KLQkgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0KLQkgICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JCSAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCQkgICBwID0gcC0+bmV4dCkKLQkJewotCQkgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotCi0JCSAgaWYgKHAtPnR5cGUgIT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCQljb250aW51ZTsKLQkJICAgICAgYWJvcnQgKCk7Ci0JCSAgICB9Ci0KLQkJICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0JCSAgLyogSGFjazogcmVzZXQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBzbyB0aGF0Ci0JCSAgICAgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkJICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkJfQotCi0JICAgICAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcwotCQkgY3VycmVudGx5IG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICAgICAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCi0JICAgICAgLyogUmVhbGx5IHJlbW92ZSB0aGUgc2VjdGlvbi4gICovCi0JICAgICAgZm9yIChzZWNwcCA9ICZhYmZkLT5zZWN0aW9uczsKLQkJICAgKnNlY3BwICE9IG87Ci0JCSAgIHNlY3BwID0gJigqc2VjcHApLT5uZXh0KQotCQk7Ci0JICAgICAgKnNlY3BwID0gKCpzZWNwcCktPm5leHQ7Ci0JICAgICAgLS1hYmZkLT5zZWN0aW9uX2NvdW50OwotCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogVGhlcmUgaXMgb25lIGdwdGFiIGZvciBpbml0aWFsaXplZCBkYXRhLCBhbmQgb25lIGZvcgotCSAgICAgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLQkgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIuZ3B0YWIuc2RhdGEiKSA9PSAwKQotCSAgICBncHRhYl9kYXRhX3NlYyA9IG87Ci0JICBlbHNlIGlmIChzdHJjbXAgKG8tPm5hbWUsICIuZ3B0YWIuc2JzcyIpID09IDApCi0JICAgIGdwdGFiX2Jzc19zZWMgPSBvOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczogaWxsZWdhbCBzZWN0aW9uIG5hbWUgYCVzJyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG8tPm5hbWUpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBUaGUgbGlua2VyIHNjcmlwdCBhbHdheXMgY29tYmluZXMgLmdwdGFiLmRhdGEgYW5kCi0JICAgICAuZ3B0YWIuc2RhdGEgaW50byAuZ3B0YWIuc2RhdGEsIGFuZCBsaWtld2lzZSBmb3IKLQkgICAgIC5ncHRhYi5ic3MgYW5kIC5ncHRhYi5zYnNzLiAgSXQgaXMgcG9zc2libGUgdGhhdCB0aGVyZSBpcwotCSAgICAgbm8gLnNkYXRhIG9yIC5zYnNzIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBpbiB3aGljaAotCSAgICAgY2FzZSB3ZSBtdXN0IGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgc3VibmFtZSA9IG8tPm5hbWUgKyBzaXplb2YgIi5ncHRhYiIgLSAxOwotCSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzdWJuYW1lKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKG8gPT0gZ3B0YWJfZGF0YV9zZWMpCi0JCW8tPm5hbWUgPSAiLmdwdGFiLmRhdGEiOwotCSAgICAgIGVsc2UKLQkJby0+bmFtZSA9ICIuZ3B0YWIuYnNzIjsKLQkgICAgICBzdWJuYW1lID0gby0+bmFtZSArIHNpemVvZiAiLmdwdGFiIiAtIDE7Ci0JICAgICAgQkZEX0FTU0VSVCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN1Ym5hbWUpICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIC8qIFNldCB1cCB0aGUgZmlyc3QgZW50cnkuICAqLwotCSAgYyA9IDE7Ci0JICB0YWIgPSAoRWxmNjRfZ3B0YWIgKikgYmZkX21hbGxvYyAoYyAqIHNpemVvZiAoRWxmNjRfZ3B0YWIpKTsKLQkgIGlmICh0YWIgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgdGFiWzBdLmd0X2hlYWRlci5ndF9jdXJyZW50X2dfdmFsdWUgPSBlbGZfZ3Bfc2l6ZSAoYWJmZCk7Ci0JICB0YWJbMF0uZ3RfaGVhZGVyLmd0X3VudXNlZCA9IDA7Ci0KLQkgIC8qIENvbWJpbmUgdGhlIGlucHV0IHNlY3Rpb25zLiAgKi8KLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JICAgICAgYmZkICppbnB1dF9iZmQ7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgbGFzdDsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGdwZW50cnk7Ci0KLQkgICAgICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJewotCQkgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCSAgICBjb250aW51ZTsKLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaW5wdXRfc2VjdGlvbiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQkgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLQotCSAgICAgIC8qIENvbWJpbmUgdGhlIGdwdGFiIGVudHJpZXMgZm9yIHRoaXMgaW5wdXQgc2VjdGlvbiBvbmUKLQkJIGJ5IG9uZS4gIFdlIGtub3cgdGhhdCB0aGUgaW5wdXQgZ3B0YWIgZW50cmllcyBhcmUKLQkJIHNvcnRlZCBieSBhc2NlbmRpbmcgLUcgdmFsdWUuICAqLwotCSAgICAgIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotCSAgICAgIGxhc3QgPSAwOwotCSAgICAgIGZvciAoZ3BlbnRyeSA9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfZ3B0YWIpOwotCQkgICBncGVudHJ5IDwgc2l6ZTsKLQkJICAgZ3BlbnRyeSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX2dwdGFiKSkKLQkJewotCQkgIEVsZjY0X0V4dGVybmFsX2dwdGFiIGV4dF9ncHRhYjsKLQkJICBFbGY2NF9ncHRhYiBpbnRfZ3B0YWI7Ci0JCSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JCSAgdW5zaWduZWQgbG9uZyBhZGQ7Ci0JCSAgYm9vbGVhbiBleGFjdDsKLQkJICB1bnNpZ25lZCBpbnQgbG9vazsKLQotCQkgIGlmICghIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMKLQkJCSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoUFRSKSAmZXh0X2dwdGFiLAotCQkJICBncGVudHJ5LCBzaXplb2YgKEVsZjY0X0V4dGVybmFsX2dwdGFiKSkpKQotCQkgICAgewotCQkgICAgICBmcmVlICh0YWIpOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICBiZmRfYWxwaGFfZWxmNjRfc3dhcF9ncHRhYl9pbiAoaW5wdXRfYmZkLCAmZXh0X2dwdGFiLAotCQkJCQkJJmludF9ncHRhYik7Ci0JCSAgdmFsID0gaW50X2dwdGFiLmd0X2VudHJ5Lmd0X2dfdmFsdWU7Ci0JCSAgYWRkID0gaW50X2dwdGFiLmd0X2VudHJ5Lmd0X2J5dGVzIC0gbGFzdDsKLQotCQkgIGV4YWN0ID0gZmFsc2U7Ci0JCSAgZm9yIChsb29rID0gMTsgbG9vayA8IGM7IGxvb2srKykKLQkJICAgIHsKLQkJICAgICAgaWYgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlID49IHZhbCkKLQkJCXRhYltsb29rXS5ndF9lbnRyeS5ndF9ieXRlcyArPSBhZGQ7Ci0KLQkJICAgICAgaWYgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlID09IHZhbCkKLQkJCWV4YWN0ID0gdHJ1ZTsKLQkJICAgIH0KLQotCQkgIGlmICghIGV4YWN0KQotCQkgICAgewotCQkgICAgICBFbGY2NF9ncHRhYiAqbmV3X3RhYjsKLQkJICAgICAgdW5zaWduZWQgaW50IG1heDsKLQotCQkgICAgICAvKiBXZSBuZWVkIGEgbmV3IHRhYmxlIGVudHJ5LiAgKi8KLQkJICAgICAgbmV3X3RhYiA9ICgoRWxmNjRfZ3B0YWIgKikKLQkJCQkgYmZkX3JlYWxsb2MgKChQVFIpIHRhYiwKLQkJCQkJICAgICAgKGMgKyAxKSAqIHNpemVvZiAoRWxmNjRfZ3B0YWIpKSk7Ci0JCSAgICAgIGlmIChuZXdfdGFiID09IE5VTEwpCi0JCQl7Ci0JCQkgIGZyZWUgKHRhYik7Ci0JCQkgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgICAgdGFiID0gbmV3X3RhYjsKLQkJICAgICAgdGFiW2NdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPSB2YWw7Ci0JCSAgICAgIHRhYltjXS5ndF9lbnRyeS5ndF9ieXRlcyA9IGFkZDsKLQotCQkgICAgICAvKiBNZXJnZSBpbiB0aGUgc2l6ZSBmb3IgdGhlIG5leHQgc21hbGxlc3QgLUcKLQkJCSB2YWx1ZSwgc2luY2UgdGhhdCB3aWxsIGJlIGltcGxpZWQgYnkgdGhpcyBuZXcKLQkJCSB2YWx1ZS4gICovCi0JCSAgICAgIG1heCA9IDA7Ci0JCSAgICAgIGZvciAobG9vayA9IDE7IGxvb2sgPCBjOyBsb29rKyspCi0JCQl7Ci0JCQkgIGlmICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA8IHZhbAotCQkJICAgICAgJiYgKG1heCA9PSAwCi0JCQkJICB8fCAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUKLQkJCQkgICAgICA+IHRhYlttYXhdLmd0X2VudHJ5Lmd0X2dfdmFsdWUpKSkKLQkJCSAgICBtYXggPSBsb29rOwotCQkJfQotCQkgICAgICBpZiAobWF4ICE9IDApCi0JCQl0YWJbY10uZ3RfZW50cnkuZ3RfYnl0ZXMgKz0KLQkJCSAgdGFiW21heF0uZ3RfZW50cnkuZ3RfYnl0ZXM7Ci0KLQkJICAgICAgKytjOwotCQkgICAgfQotCi0JCSAgbGFzdCA9IGludF9ncHRhYi5ndF9lbnRyeS5ndF9ieXRlczsKLQkJfQotCi0JICAgICAgLyogSGFjazogcmVzZXQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBzbyB0aGF0Ci0JCSBlbGZfbGlua19pbnB1dF9iZmQgaWdub3JlcyB0aGlzIHNlY3Rpb24uICAqLwotCSAgICAgIGlucHV0X3NlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICB9Ci0KLQkgIC8qIFRoZSB0YWJsZSBtdXN0IGJlIHNvcnRlZCBieSAtRyB2YWx1ZS4gICovCi0JICBpZiAoYyA+IDIpCi0JICAgIHFzb3J0ICh0YWIgKyAxLCBjIC0gMSwgc2l6ZW9mICh0YWJbMF0pLCBncHRhYl9jb21wYXJlKTsKLQotCSAgLyogU3dhcCBvdXQgdGhlIHRhYmxlLiAgKi8KLQkgIGV4dF90YWIgPSAoKEVsZjY0X0V4dGVybmFsX2dwdGFiICopCi0JCSAgICAgYmZkX2FsbG9jIChhYmZkLCBjICogc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9ncHRhYikpKTsKLQkgIGlmIChleHRfdGFiID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmcmVlICh0YWIpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQotCSAgICBiZmRfYWxwaGFfZWxmNjRfc3dhcF9ncHRhYl9vdXQgKGFiZmQsIHRhYiArIGksIGV4dF90YWIgKyBpKTsKLQkgIGZyZWUgKHRhYik7Ci0KLQkgIG8tPl9yYXdfc2l6ZSA9IGMgKiBzaXplb2YgKEVsZjY0X0V4dGVybmFsX2dwdGFiKTsKLQkgIG8tPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dF90YWI7Ci0KLQkgIC8qIFNraXAgdGhpcyBzZWN0aW9uIGxhdGVyIG9uIChJIGRvbid0IHRoaW5rIHRoaXMgY3VycmVudGx5Ci0JICAgICBtYXR0ZXJzLCBidXQgc29tZWRheSBpdCBtaWdodCkuICAqLwotCSAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCX0KLSNlbmRpZgotCi0gICAgfQotCi0gIC8qIEludm9rZSB0aGUgcmVndWxhciBFTEYgYmFja2VuZCBsaW5rZXIgdG8gZG8gYWxsIHRoZSB3b3JrLiAgKi8KLSAgaWYgKCEgYmZkX2VsZjY0X2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdyaXRlIG91dCB0aGUgY29tcHV0ZWQgc2VjdGlvbnMuICAqLwotCi0gIC8qIFRoZSAuZ290IHN1YnNlY3Rpb25zLi4uICAqLwotICB7Ci0gICAgYmZkICppLCAqZHlub2JqID0gZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bm9iajsKLSAgICBmb3IgKGkgPSBhbHBoYV9lbGZfaGFzaF90YWJsZShpbmZvKS0+Z290X2xpc3Q7Ci0JIGkgIT0gTlVMTDsKLQkgaSA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290X2xpbmtfbmV4dCkKLSAgICAgIHsKLQlhc2VjdGlvbiAqc2dvdDsKLQotCS8qIGVsZl9iZmRfZmluYWxfbGluayBhbHJlYWR5IGRpZCBldmVyeXRoaW5nIGluIGR5bm9iai4gICovCi0JaWYgKGkgPT0gZHlub2JqKQotCSAgY29udGludWU7Ci0KLQlzZ290ID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3Q7Ci0JaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZ290LT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkJc2dvdC0+Y29udGVudHMsIHNnb3QtPm91dHB1dF9vZmZzZXQsCi0JCQkJCXNnb3QtPl9yYXdfc2l6ZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gIH0KLQotI2lmZGVmIEVSSUNfbmV2ZXJkZWYKLSAgaWYgKHJlZ2luZm9fc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gZXh0OwotCi0gICAgICBiZmRfYWxwaGFfZWxmNjRfc3dhcF9yZWdpbmZvX291dCAoYWJmZCwgJnJlZ2luZm8sICZleHQpOwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCByZWdpbmZvX3NlYywgKFBUUikgJmV4dCwKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNpemVvZiBleHQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAobWRlYnVnX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKTsKLSAgICAgIGlmICghIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZyAobWRlYnVnX2hhbmRsZSwgYWJmZCwgJmRlYnVnLAotCQkJCQkgICAgICAgc3dhcCwgaW5mbywKLQkJCQkJICAgICAgIG1kZWJ1Z19zZWMtPmZpbGVwb3MpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgYmZkX2Vjb2ZmX2RlYnVnX2ZyZWUgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsICZkZWJ1Zywgc3dhcCwgaW5mbyk7Ci0gICAgfQotCi0gIGlmIChncHRhYl9kYXRhX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGdwdGFiX2RhdGFfc2VjLAotCQkJCSAgICAgIGdwdGFiX2RhdGFfc2VjLT5jb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgZ3B0YWJfZGF0YV9zZWMtPl9yYXdfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZ3B0YWJfYnNzX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGdwdGFiX2Jzc19zZWMsCi0JCQkJICAgICAgZ3B0YWJfYnNzX3NlYy0+Y29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAgIGdwdGFiX2Jzc19zZWMtPl9yYXdfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhlc2UgYXJlIHVzZWQgd2hlbiBkZWFsaW5nIHdpdGggdGhlCi0gICAubWRlYnVnIHNlY3Rpb24sIHdoaWNoIGlzIGluIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgZm9ybWF0LiAgQ29waWVkCi0gICBmcm9tIGVsZjMyLW1pcHMuYy4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcAotZWxmNjRfYWxwaGFfZWNvZmZfZGVidWdfc3dhcCA9Ci17Ci0gIC8qIFN5bWJvbCB0YWJsZSBtYWdpYyBudW1iZXIuICAqLwotICBtYWdpY1N5bTIsCi0gIC8qIEFsaWdubWVudCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBFLmcuLCA0LiAgKi8KLSAgOCwKLSAgLyogU2l6ZXMgb2YgZXh0ZXJuYWwgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBzaXplb2YgKHN0cnVjdCBoZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZG5yX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHBkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBzeW1fZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3Qgb3B0X2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGZkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCByZmRfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZXh0X2V4dCksCi0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIGluIGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICBlY29mZl9zd2FwX2hkcl9pbiwKLSAgZWNvZmZfc3dhcF9kbnJfaW4sCi0gIGVjb2ZmX3N3YXBfcGRyX2luLAotICBlY29mZl9zd2FwX3N5bV9pbiwKLSAgZWNvZmZfc3dhcF9vcHRfaW4sCi0gIGVjb2ZmX3N3YXBfZmRyX2luLAotICBlY29mZl9zd2FwX3JmZF9pbiwKLSAgZWNvZmZfc3dhcF9leHRfaW4sCi0gIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4sCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luLAotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIGVjb2ZmX3N3YXBfaGRyX291dCwKLSAgZWNvZmZfc3dhcF9kbnJfb3V0LAotICBlY29mZl9zd2FwX3Bkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfc3ltX291dCwKLSAgZWNvZmZfc3dhcF9vcHRfb3V0LAotICBlY29mZl9zd2FwX2Zkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfcmZkX291dCwKLSAgZWNvZmZfc3dhcF9leHRfb3V0LAotICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCwKLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0LAotICAvKiBGdW5jdGlvbiB0byByZWFkIGluIHN5bWJvbGljIGRhdGEuICAqLwotICBlbGY2NF9hbHBoYV9yZWFkX2Vjb2ZmX2luZm8KLX07Ci0MCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGY2NF9hbHBoYV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCSJlbGY2NC1hbHBoYSIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2FscGhhCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUgCUVNX0FMUEhBCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRSAJMHgxMDAwMAotCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0gIGVsZjY0X2FscGhhX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0KLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gIGVsZjY0X2FscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byBcCi0gIGVsZjY0X2FscGhhX2luZm9fdG9faG93dG8KLQotI2RlZmluZSBiZmRfZWxmNjRfbWtvYmplY3QgXAotICBlbGY2NF9hbHBoYV9ta29iamVjdAotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcCBcCi0gIGVsZjY0X2FscGhhX29iamVjdF9wCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIgXAotICBlbGY2NF9hbHBoYV9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zIFwKLSAgZWxmNjRfYWxwaGFfZmFrZV9zZWN0aW9ucwotCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0gIGVsZjY0X2FscGhhX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgYmZkX2VsZjY0X2ZpbmRfbmVhcmVzdF9saW5lIFwKLSAgZWxmNjRfYWxwaGFfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxheF9zZWN0aW9uIFwKLSAgZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbgotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vayBcCi0gIGVsZjY0X2FscGhhX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgXAotICBlbGY2NF9hbHBoYV9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotICBlbGY2NF9hbHBoYV9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wgXAotICBlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMgXAotICBlbGY2NF9hbHBoYV9hbHdheXNfc2l6ZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotICBlbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiBcCi0gIGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKLSAgZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKLSAgZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9maW5hbF9saW5rIFwKLSAgZWxmNjRfYWxwaGFfZmluYWxfbGluawotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXAgXAotICAmZWxmNjRfYWxwaGFfZWNvZmZfZGVidWdfc3dhcAotCi0vKgotICogQSBmZXcgY29uc3RhbnRzIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgLnBsdCBzZWN0aW9uIGlzIHNldCB1cC4KLSAqLwotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgMAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgMAotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gMQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUgMAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUgUExUX0hFQURFUl9TSVpFCi0KLSNpbmNsdWRlICJlbGY2NC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC1nZW4uYyBiL2JmZC9lbGY2NC1nZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0NzBmZi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmNjQtZ2VuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKiBHZW5lcmljIHN1cHBvcnQgZm9yIDY0LWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTkzLCAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLS8qIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBhbnkgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiwgYnV0IHNob3VsZCBiZQotICAgZ29vZCBlbm91Z2ggZm9yIEdEQiBvciBvYmpkdW1wIHRvIHJlYWQgdGhlIGZpbGUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBkdW1teSA9Ci0gIEhPV1RPICgwLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlVOS05PV04iLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKTsJCS8qIHBjcmVsX29mZnNldCAqLwotCi1zdGF0aWMgdm9pZAotZWxmX2dlbmVyaWNfaW5mb190b19ob3d0byAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGY2NF9JbnRlcm5hbF9SZWxhICplbGZfcmVsb2M7Ci17Ci0gIGJmZF9yZWxvYy0+aG93dG8gPSAmZHVtbXk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGY2NF9JbnRlcm5hbF9SZWwgKmVsZl9yZWxvYzsKLXsKLSAgYmZkX3JlbG9jLT5ob3d0byA9ICZkdW1teTsKLX0KLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJlbGY2NC1saXR0bGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmNjQtYmlnIgotI2RlZmluZSBFTEZfQVJDSAkJCWJmZF9hcmNoX3Vua25vd24KLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fTk9ORQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQllbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJZWxmX2dlbmVyaWNfaW5mb190b19ob3d0b19yZWwKLQotI2luY2x1ZGUgImVsZjY0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LW1pcHMuYyBiL2JmZC9lbGY2NC1taXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYjhiYjkuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjY0LW1pcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMjcgKzAsMCBAQAotLyogTUlQUy1zcGVjaWZpYyBzdXBwb3J0IGZvciA2NC1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIHN1cHBvcnRzIHRoZSA2NC1iaXQgTUlQUyBFTEYgQUJJLgotCi0gICBUaGUgTUlQUyA2NC1iaXQgRUxGIEFCSSB1c2VzIGFuIHVudXN1YWwgcmVsb2MgZm9ybWF0LiAgVGhpcyBmaWxlCi0gICBvdmVycmlkZXMgdGhlIHVzdWFsIEVMRiByZWxvYyBoYW5kbGluZywgYW5kIGhhbmRsZXMgcmVhZGluZyBhbmQKLSAgIHdyaXRpbmcgdGhlIHJlbG9jYXRpb25zIGhlcmUuCi0KLSAgIFRoZSBNSVBTIDY0LWJpdCBFTEYgQUJJIGFsc28gdXNlcyBhbiB1bnVzdWFsIGFyY2hpdmUgbWFwIGZvcm1hdC4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdlbmxpbmsuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL21pcHMuaCIKLQotLyogR2V0IHRoZSBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gIFRoZSA2NC1iaXQgQUJJIGlzIG5vdCBzdXBwb3NlZCB0bwotICAgdXNlIEVDT0ZGLiAgSG93ZXZlciwgd2Ugc3VwcG9ydCBpdCBhbnlob3cgZm9yIGFuIGVhc2llciBjaGFuZ2VvdmVyLiAgKi8KLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9lY29mZi5oIgotLyogVGhlIDY0IGJpdCB2ZXJzaW9ucyBvZiB0aGUgbWRlYnVnIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gYWxwaGEuaC4gICovCi0jaW5jbHVkZSAiY29mZi9hbHBoYS5oIgotI2RlZmluZSBFQ09GRl82NAotI2luY2x1ZGUgImVjb2Zmc3dhcC5oIgotCi1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X3N3YXBfcmVsb2NfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICosCi0JICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICosCi0JICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhICopKTsKLSNpZiAwCi1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X3N3YXBfcmVsb2Nfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9NaXBzX0ludGVybmFsX1JlbCAqLAotCSAgIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICopKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSAqLAotCSAgIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqbWlwc19lbGY2NF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgbG9uZyBtaXBzX2VsZjY0X2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGY2NF9zbHVycF9vbmVfcmVsb2NfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGNvbnN0IEVsZl9JbnRlcm5hbF9TaGRyICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmNjRfc2x1cnBfcmVsb2NfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLXN0YXRpYyB2b2lkIG1pcHNfZWxmNjRfd3JpdGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmNjRfc2VjdGlvbl9mcm9tX3NoZHIKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGY2NF9zZWN0aW9uX3Byb2Nlc3NpbmcKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmNjRfc2x1cnBfYXJtYXAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmNjRfd3JpdGVfYXJtYXAKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpOwotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKLQotLyogVGhlIHJlbG9jYXRpb24gdGFibGUgdXNlZCBmb3IgU0hUX1JFTCBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsW10gPQotewotICAvKiBObyByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU18xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBzeW1ib2wgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUwzMiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAyNiBiaXQgYnJhbmNoIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NSVBTXzI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKLQkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKLQkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMjYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISTE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISTE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19MTzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19MTzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR1AgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HUFJFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR1BSRUwxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVmZXJlbmNlIHRvIGxpdGVyYWwgc2VjdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0xJVEVSQUwiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlZmVyZW5jZSB0byBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1QxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dvdDE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBQQyByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX1BDMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19QQzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IGNhbGwgdGhyb3VnaCBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IFRoaXMgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgR1AgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HUFJFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dwcmVsMzJfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HUFJFTDMyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gICAgeyAxMyB9LAotICAgIHsgMTQgfSwKLSAgICB7IDE1IH0sCi0KLSAgLyogQSA1IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ1LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDUiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3YzAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2MwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseTsgYSBzcGVjaWFsIGZ1bmN0aW9uIGlzCi0gICAgIG5lZWRlZCB0byBwdXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluIHRoZSByaWdodCBwbGFjZS4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3YzQsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2M0LAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNjQgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzY0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfNjQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBEaXNwbGFjZW1lbnQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfRElTUCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0RJU1AiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogRGlzcGxhY2VtZW50IHRvIHBhZ2UgcG9pbnRlciBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9QQUdFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfUEFHRSIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBPZmZzZXQgZnJvbSBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfT0ZTVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX09GU1QiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0hJMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0hJMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfTE8xNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2NCBiaXQgc3Vic3RyYWN0aW9uLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfU1VCLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU1VCIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSW5zZXJ0IHRoZSBhZGRlbmQgYXMgYW4gaW5zdHJ1Y3Rpb24uICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19JTlNFUlRfQSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0lOU0VSVF9BIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEluc2VydCB0aGUgYWRkZW5kIGFzIGFuIGluc3RydWN0aW9uLCBhbmQgY2hhbmdlIGFsbCByZWxvY2F0aW9ucwotICAgICB0byByZWZlciB0byB0aGUgb2xkIGluc3RydWN0aW9uIGF0IHRoZSBhZGRyZXNzLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSU5TRVJUX0IsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19JTlNFUlRfQiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBEZWxldGUgYSAzMiBiaXQgaW5zdHJ1Y3Rpb24uICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ERUxFVEUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfREVMRVRFIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdldCB0aGUgaGlnaGVyIHZhbHVlIG9mIGEgNjQgYml0IGFkZGVuZC4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJR0hFUiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSElHSEVSIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHZXQgdGhlIGhpZ2hlc3QgdmFsdWUgb2YgYSA2NCBiaXQgYWRkZW5kLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSElHSEVTVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISUdIRVNUIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMX0hJMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTF9MTzE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTExfTE8xNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJJ20gbm90IHN1cmUgd2hhdCB0aGUgcmVtYWluaW5nIHJlbG9jcyBhcmUsIGJ1dCB0aGV5IGFyZSBkZWZpbmVkCi0gICAgIG9uIElyaXggNi4gICovCi0KLSAgSE9XVE8gKFJfTUlQU19TQ05fRElTUCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NDTl9ESVNQIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfUkVMMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUkVMMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19BRERfSU1NRURJQVRFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQUREX0lNTUVESUFURSIsIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX1BKVU1QLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1BKVU1QIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfUkVMR09ULAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1JFTEdPVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLS8qIFRoZSByZWxvY2F0aW9uIHRhYmxlIHVzZWQgZm9yIFNIVF9SRUxBIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbWlwc19lbGY2NF9ob3d0b190YWJsZV9yZWxhW10gPQotewotICAvKiBObyByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU18xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18zMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBzeW1ib2wgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUwzMiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMjYgYml0IGJyYW5jaCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKFJfTUlQU18yNiwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgCQkJLyogVGhpcyBuZWVkcyBjb21wbGV4IG92ZXJmbG93Ci0JCQkJICAgZGV0ZWN0aW9uLCBiZWNhdXNlIHRoZSB1cHBlciBmb3VyCi0JCQkJICAgYml0cyBtdXN0IG1hdGNoIHRoZSBQQy4gICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzI2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISTE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISTE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9NSVBTX0xPMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0xPMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdQIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPIChSX01JUFNfR1BSRUwxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dQUkVMMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVmZXJlbmNlIHRvIGxpdGVyYWwgc2VjdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0xJVEVSQUwiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVmZXJlbmNlIHRvIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogVGhpcyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19QQzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUEMxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IGNhbGwgdGhyb3VnaCBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IFRoaXMgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgR1AgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HUFJFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dwcmVsMzJfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HUFJFTDMyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAgIHsgMTMgfSwKLSAgICB7IDE0IH0sCi0gICAgeyAxNSB9LAotCi0gIC8qIEEgNSBiaXQgc2hpZnQgZmllbGQuICAqLwotICBIT1dUTyAoUl9NSVBTX1NISUZUNSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDUsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0hJRlQ1IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3YzAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDYgYml0IHNoaWZ0IGZpZWxkLiAgKi8KLSAgLyogRklYTUU6IFRoaXMgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5OyBhIHNwZWNpYWwgZnVuY3Rpb24gaXMKLSAgICAgbmVlZGVkIHRvIHB1dCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaW4gdGhlIHJpZ2h0IHBsYWNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TSElGVDYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NISUZUNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2M0LAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNjQgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzY0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfNjQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERpc3BsYWNlbWVudCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9ESVNQLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfRElTUCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogRGlzcGxhY2VtZW50IHRvIHBhZ2UgcG9pbnRlciBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9QQUdFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfUEFHRSIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogT2Zmc2V0IGZyb20gcGFnZSBwb2ludGVyIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX09GU1QsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9PRlNUIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfSEkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfSEkxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfTE8xNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNjQgYml0IHN1YnN0cmFjdGlvbi4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX1NVQiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NVQiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSW5zZXJ0IHRoZSBhZGRlbmQgYXMgYW4gaW5zdHJ1Y3Rpb24uICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19JTlNFUlRfQSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0lOU0VSVF9BIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEluc2VydCB0aGUgYWRkZW5kIGFzIGFuIGluc3RydWN0aW9uLCBhbmQgY2hhbmdlIGFsbCByZWxvY2F0aW9ucwotICAgICB0byByZWZlciB0byB0aGUgb2xkIGluc3RydWN0aW9uIGF0IHRoZSBhZGRyZXNzLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSU5TRVJUX0IsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19JTlNFUlRfQiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBEZWxldGUgYSAzMiBiaXQgaW5zdHJ1Y3Rpb24uICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ERUxFVEUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfREVMRVRFIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdldCB0aGUgaGlnaGVyIHZhbHVlIG9mIGEgNjQgYml0IGFkZGVuZC4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJR0hFUiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSElHSEVSIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdldCB0aGUgaGlnaGVzdCB2YWx1ZSBvZiBhIDY0IGJpdCBhZGRlbmQuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISUdIRVNULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJR0hFU1QiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTF9ISTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTExfSEkxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMX0xPMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTF9MTzE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJJ20gbm90IHN1cmUgd2hhdCB0aGUgcmVtYWluaW5nIHJlbG9jcyBhcmUsIGJ1dCB0aGV5IGFyZSBkZWZpbmVkCi0gICAgIG9uIElyaXggNi4gICovCi0KLSAgSE9XVE8gKFJfTUlQU19TQ05fRElTUCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NDTl9ESVNQIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfUkVMMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUkVMMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19BRERfSU1NRURJQVRFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQUREX0lNTUVESUFURSIsIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX1BKVU1QLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1BKVU1QIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfUkVMR09ULAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1JFTEdPVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLS8qIFN3YXAgaW4gYSBNSVBTIDY0LWJpdCBSZWwgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19lbGY2NF9zd2FwX3JlbG9jX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCAqc3JjOwotICAgICBFbGY2NF9NaXBzX0ludGVybmFsX1JlbCAqZHN0OwotewotICBkc3QtPnJfb2Zmc2V0ID0gYmZkX2hfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX29mZnNldCk7Ci0gIGRzdC0+cl9zeW0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfc3ltKTsKLSAgZHN0LT5yX3NzeW0gPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9zc3ltKTsKLSAgZHN0LT5yX3R5cGUzID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfdHlwZTMpOwotICBkc3QtPnJfdHlwZTIgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl90eXBlMik7Ci0gIGRzdC0+cl90eXBlID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfdHlwZSk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBNSVBTIDY0LWJpdCBSZWxhIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmNjRfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqc3JjOwotICAgICBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgZHN0LT5yX29mZnNldCA9IGJmZF9oX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9vZmZzZXQpOwotICBkc3QtPnJfc3ltID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3N5bSk7Ci0gIGRzdC0+cl9zc3ltID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfc3N5bSk7Ci0gIGRzdC0+cl90eXBlMyA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3R5cGUzKTsKLSAgZHN0LT5yX3R5cGUyID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfdHlwZTIpOwotICBkc3QtPnJfdHlwZSA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3R5cGUpOwotICBkc3QtPnJfYWRkZW5kID0gYmZkX2hfZ2V0X3NpZ25lZF82NCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9hZGRlbmQpOwotfQotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgdXNlZC4gICovCi0KLS8qIFN3YXAgb3V0IGEgTUlQUyA2NC1iaXQgUmVsIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmNjRfc3dhcF9yZWxvY19vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsICpzcmM7Ci0gICAgIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF82NCAoYWJmZCwgc3JjLT5yX29mZnNldCwgKGJmZF9ieXRlICopIGRzdC0+cl9vZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cl9zeW0sIChiZmRfYnl0ZSAqKSBkc3QtPnJfc3ltKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl9zc3ltLCAoYmZkX2J5dGUgKikgZHN0LT5yX3NzeW0pOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5yX3R5cGUzLCAoYmZkX2J5dGUgKikgZHN0LT5yX3R5cGUzKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl90eXBlMiwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlMik7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlKTsKLX0KLQotI2VuZGlmIC8qIDAgKi8KLQotLyogU3dhcCBvdXQgYSBNSVBTIDY0LWJpdCBSZWxhIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGEgKnNyYzsKLSAgICAgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF82NCAoYWJmZCwgc3JjLT5yX29mZnNldCwgKGJmZF9ieXRlICopIGRzdC0+cl9vZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cl9zeW0sIChiZmRfYnl0ZSAqKSBkc3QtPnJfc3ltKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl9zc3ltLCAoYmZkX2J5dGUgKikgZHN0LT5yX3NzeW0pOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5yX3R5cGUzLCAoYmZkX2J5dGUgKikgZHN0LT5yX3R5cGUzKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl90eXBlMiwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlMik7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlKTsKLSAgYmZkX2hfcHV0XzY0IChhYmZkLCBzcmMtPnJfYWRkZW5kLCAoYmZkX2J5dGUgKikgZHN0LT5yX2FkZGVuZCk7Ci19Ci0KLS8qIEEgbWFwcGluZyBmcm9tIEJGRCByZWxvYyB0eXBlcyB0byBNSVBTIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICBlbnVtIGVsZl9taXBzX3JlbG9jX3R5cGUgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBtaXBzX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NSVBTX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX01JUFNfMTYgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfTUlQU18zMiB9LAotICB7IEJGRF9SRUxPQ182NCwgUl9NSVBTXzY0IH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfTUlQU182NCB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl9NSVBTX1JFTDMyIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfSk1QLCBSX01JUFNfMjYgfSwKLSAgeyBCRkRfUkVMT0NfSEkxNl9TLCBSX01JUFNfSEkxNiB9LAotICB7IEJGRF9SRUxPQ19MTzE2LCBSX01JUFNfTE8xNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dQUkVMLCBSX01JUFNfR1BSRUwxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIFJfTUlQU19MSVRFUkFMIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UMTYsIFJfTUlQU19HT1QxNiB9LAotICB7IEJGRF9SRUxPQ18xNl9QQ1JFTCwgUl9NSVBTX1BDMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19DQUxMMTYsIFJfTUlQU19DQUxMMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HUFJFTDMyLCBSX01JUFNfR1BSRUwzMiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2LCBSX01JUFNfR09UX0hJMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwgUl9NSVBTX0dPVF9MTzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2LCBSX01JUFNfQ0FMTF9ISTE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2LCBSX01JUFNfQ0FMTF9MTzE2IH0KLX07Ci0KLS8qIEdpdmVuIGEgQkZEIHJlbG9jIHR5cGUsIHJldHVybiBhIGhvd3RvIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLW1pcHNfZWxmNjRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG1pcHNfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOyBpKyspCi0gICAgewotICAgICAgaWYgKG1pcHNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQl7Ci0JICBpbnQgdjsKLQotCSAgdiA9IChpbnQpIG1pcHNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWw7Ci0JICByZXR1cm4gJm1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsW3ZdOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNpbmNlIGVhY2ggZW50cnkgaW4gYW4gU0hUX1JFTCBvciBTSFRfUkVMQSBzZWN0aW9uIGNhbiByZXByZXNlbnQgdXAKLSAgIHRvIHRocmVlIHJlbG9jcywgd2UgbXVzdCB0ZWxsIHRoZSB1c2VyIHRvIGFsbG9jYXRlIG1vcmUgc3BhY2UuICAqLwotCi1zdGF0aWMgbG9uZwotbWlwc19lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICByZXR1cm4gKHNlYy0+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+Y29udGVudHMKLQkgICAgICA9PSBjb3VudCk7Ci19Ci0MCi0vKiBIYW5kbGUgYSA2NC1iaXQgTUlQUyBFTEYgc3BlY2lmaWMgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZjY0X3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaWYgKCEgX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRm9yIGEgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLCBsb29rIGZvciBhIE9ES19SRUdJTkZPIGVudHJ5LCBhbmQKLSAgICAgc2V0IHRoZSBncCB2YWx1ZSBiYXNlZCBvbiB3aGF0IHdlIGZpbmQuICBXZSBtYXkgc2VlIGJvdGgKLSAgICAgU0hUX01JUFNfUkVHSU5GTyBhbmQgU0hUX01JUFNfT1BUSU9OUy9PREtfUkVHSU5GTzsgaW4gdGhhdCBjYXNlLAotICAgICB0aGV5IHNob3VsZCBhZ3JlZS4gICovCi0gIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX01JUFNfT1BUSU9OUykKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqY29udGVudHMsICpsLCAqbGVuZDsKLQotICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoaGRyLT5zaF9zaXplKTsKLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaGRyLT5iZmRfc2VjdGlvbiwgY29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBoZHItPnNoX3NpemUpKQotCXsKLQkgIGZyZWUgKGNvbnRlbnRzKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBsID0gY29udGVudHM7Ci0gICAgICBsZW5kID0gY29udGVudHMgKyBoZHItPnNoX3NpemU7Ci0gICAgICB3aGlsZSAobCArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpIDw9IGxlbmQpCi0JewotCSAgRWxmX0ludGVybmFsX09wdGlvbnMgaW50b3B0OwotCi0JICBiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX2luIChhYmZkLCAoRWxmX0V4dGVybmFsX09wdGlvbnMgKikgbCwKLQkJCQkJJmludG9wdCk7Ci0JICBpZiAoaW50b3B0LmtpbmQgPT0gT0RLX1JFR0lORk8pCi0JICAgIHsKLQkgICAgICBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvIGludHJlZzsKLQotCSAgICAgIGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbgotCQkoYWJmZCwKLQkJICgoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqKQotCQkgIChsICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykpKSwKLQkJICZpbnRyZWcpOwotCSAgICAgIGVsZl9ncCAoYWJmZCkgPSBpbnRyZWcucmlfZ3BfdmFsdWU7Ci0JICAgIH0KLQkgIGwgKz0gaW50b3B0LnNpemU7Ci0JfQotICAgICAgZnJlZSAoY29udGVudHMpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV29yayBvdmVyIGEgc2VjdGlvbiBqdXN0IGJlZm9yZSB3cml0aW5nIGl0IG91dC4gIFdlIHVwZGF0ZSB0aGUgR1AKLSAgIHZhbHVlIGluIHRoZSBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24gYmFzZWQgb24gdGhlIHZhbHVlIHdlIGFyZQotICAgdXNpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGY2NF9zZWN0aW9uX3Byb2Nlc3NpbmcgKGFiZmQsIGhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotewotICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9NSVBTX09QVElPTlMKLSAgICAgICYmIGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTAotICAgICAgJiYgZWxmX3NlY3Rpb25fZGF0YSAoaGRyLT5iZmRfc2VjdGlvbikgIT0gTlVMTAotICAgICAgJiYgZWxmX3NlY3Rpb25fZGF0YSAoaGRyLT5iZmRfc2VjdGlvbiktPnRkYXRhICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLCAqbCwgKmxlbmQ7Ci0KLSAgICAgIC8qIFdlIHN0b3JlZCB0aGUgc2VjdGlvbiBjb250ZW50cyBpbiB0aGUgZWxmX3NlY3Rpb25fZGF0YSB0ZGF0YQotCSBmaWVsZCBpbiB0aGUgc2V0X3NlY3Rpb25fY29udGVudHMgcm91dGluZS4gIFdlIHNhdmUgdGhlCi0JIHNlY3Rpb24gY29udGVudHMgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHJlYWQgdGhlbSBhZ2Fpbi4KLQkgQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgZWxmX2dwIGlzIHNldCwgc28gd2UgY2FuIGxvb2sKLQkgdGhyb3VnaCB0aGUgc2VjdGlvbiBjb250ZW50cyB0byBzZWUgaWYgdGhlcmUgaXMgYW4KLQkgT0RLX1JFR0lORk8gc3RydWN0dXJlLiAgKi8KLQotICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgZWxmX3NlY3Rpb25fZGF0YSAoaGRyLT5iZmRfc2VjdGlvbiktPnRkYXRhOwotICAgICAgbCA9IGNvbnRlbnRzOwotICAgICAgbGVuZCA9IGNvbnRlbnRzICsgaGRyLT5zaF9zaXplOwotICAgICAgd2hpbGUgKGwgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKSA8PSBsZW5kKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9PcHRpb25zIGludG9wdDsKLQotCSAgYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbiAoYWJmZCwgKEVsZl9FeHRlcm5hbF9PcHRpb25zICopIGwsCi0JCQkJCSZpbnRvcHQpOwotCSAgaWYgKGludG9wdC5raW5kID09IE9ES19SRUdJTkZPKQotCSAgICB7Ci0JICAgICAgYmZkX2J5dGUgYnVmWzhdOwotCi0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkJICAgIChoZHItPnNoX29mZnNldAotCQkJICAgICArIChsIC0gY29udGVudHMpCi0JCQkgICAgICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykKLQkJCSAgICAgKyAoc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKSAtIDgpKSwKLQkJCSAgICAgU0VFS19TRVQpID09IC0xKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYmZkX2hfcHV0XzY0IChhYmZkLCBlbGZfZ3AgKGFiZmQpLCBidWYpOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgOCwgYWJmZCkgIT0gOCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBsICs9IGludG9wdC5zaXplOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIF9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nIChhYmZkLCBoZHIpOwotfQotDAotLyogSXJpeCA2IGRlZmluZXMgYSBicmFuZCBuZXcgYXJjaGl2ZSBtYXAgZm9ybWF0LCBzbyB0aGF0IHRoZXkgY2FuCi0gICBoYXZlIGFyY2hpdmVzIG1vcmUgdGhhbiA0IEdCIGluIHNpemUuICAqLwotCi0vKiBSZWFkIGFuIElyaXggNiBhcm1hcC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZjY0X3NsdXJwX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcnRkYXRhICphcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKLSAgY2hhciBuZXh0bmFtZVsxN107Ci0gIGZpbGVfcHRyIGFyaGRycG9zOwotICBiZmRfc2l6ZV90eXBlIGksIHBhcnNlZF9zaXplLCBuc3lteiwgc3RyaW5nc2l6ZSwgY2Fyc3ltX3NpemUsIHB0cnNpemU7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKm1hcGRhdGE7Ci0gIGJmZF9ieXRlIGludF9idWZbOF07Ci0gIGNoYXIgKnN0cmluZ2Jhc2U7Ci0gIGJmZF9ieXRlICpyYXdfYXJtYXAgPSBOVUxMOwotICBjYXJzeW0gKmNhcnN5bXM7Ci0KLSAgYXJkYXRhLT5zeW1kZWZzID0gTlVMTDsKLQotICAvKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQuICAqLwotICBhcmhkcnBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgaSA9IGJmZF9yZWFkICgoUFRSKSBuZXh0bmFtZSwgMSwgMTYsIGFiZmQpOwotICBpZiAoaSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoaSAhPSAxNikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIC0gMTYsIFNFRUtfQ1VSKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBBcmNoaXZlcyB3aXRoIHRyYWRpdGlvbmFsIGFybWFwcyBhcmUgc3RpbGwgcGVybWl0dGVkLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSA9PSAwKQotICAgIHJldHVybiBiZmRfc2x1cnBfYXJtYXAgKGFiZmQpOwotCi0gIGlmIChzdHJuY21wIChuZXh0bmFtZSwgIi9TWU02NC8gICAgICAgICAiLCAxNikgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBtYXBkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7Ci0gIGlmIChtYXBkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBwYXJzZWRfc2l6ZSA9IG1hcGRhdGEtPnBhcnNlZF9zaXplOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgbWFwZGF0YSk7Ci0KLSAgaWYgKGJmZF9yZWFkIChpbnRfYnVmLCAxLCA4LCBhYmZkKSAhPSA4KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBuc3lteiA9IGJmZF9nZXRiNjQgKGludF9idWYpOwotICBzdHJpbmdzaXplID0gcGFyc2VkX3NpemUgLSA4ICogbnN5bXogLSA4OwotCi0gIGNhcnN5bV9zaXplID0gbnN5bXogKiBzaXplb2YgKGNhcnN5bSk7Ci0gIHB0cnNpemUgPSA4ICogbnN5bXo7Ci0KLSAgYXJkYXRhLT5zeW1kZWZzID0gKGNhcnN5bSAqKSBiZmRfemFsbG9jIChhYmZkLCBjYXJzeW1fc2l6ZSArIHN0cmluZ3NpemUgKyAxKTsKLSAgaWYgKGFyZGF0YS0+c3ltZGVmcyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgY2Fyc3ltcyA9IGFyZGF0YS0+c3ltZGVmczsKLSAgc3RyaW5nYmFzZSA9ICgoY2hhciAqKSBhcmRhdGEtPnN5bWRlZnMpICsgY2Fyc3ltX3NpemU7Ci0KLSAgcmF3X2FybWFwID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgcHRyc2l6ZSk7Ci0gIGlmIChyYXdfYXJtYXAgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3JlYWQgKHJhd19hcm1hcCwgMSwgcHRyc2l6ZSwgYWJmZCkgIT0gcHRyc2l6ZQotICAgICAgfHwgYmZkX3JlYWQgKHN0cmluZ2Jhc2UsIDEsIHN0cmluZ3NpemUsIGFiZmQpICE9IHN0cmluZ3NpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IG5zeW16OyBpKyspCi0gICAgewotICAgICAgY2Fyc3ltcy0+ZmlsZV9vZmZzZXQgPSBiZmRfZ2V0YjY0IChyYXdfYXJtYXAgKyBpICogOCk7Ci0gICAgICBjYXJzeW1zLT5uYW1lID0gc3RyaW5nYmFzZTsKLSAgICAgIHN0cmluZ2Jhc2UgKz0gc3RybGVuIChzdHJpbmdiYXNlKSArIDE7Ci0gICAgICArK2NhcnN5bXM7Ci0gICAgfQotICAqc3RyaW5nYmFzZSA9ICdcMCc7Ci0KLSAgYXJkYXRhLT5zeW1kZWZfY291bnQgPSBuc3ltejsKLSAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgPSBhcmhkcnBvcyArIHNpemVvZiAoc3RydWN0IGFyX2hkcikgKyBwYXJzZWRfc2l6ZTsKLQotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgcmF3X2FybWFwKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHJhd19hcm1hcCAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCByYXdfYXJtYXApOwotICBpZiAoYXJkYXRhLT5zeW1kZWZzICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFiZmQsIGFyZGF0YS0+c3ltZGVmcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIElyaXggNiBhcm1hcC4gIFRoZSBJcml4IDYgdG9vbHMgYXJlIHN1cHBvc2VkIHRvIGJlCi0gICBhYmxlIHRvIGhhbmRsZSBvcmRpbmFyeSBFTEYgYXJtYXBzLCBidXQgYXQgbGVhc3Qgb24gSXJpeCA2LjIgdGhlCi0gICBsaW5rZXIgY3Jhc2hlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZjY0X3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoLCBtYXAsIHN5bWJvbF9jb3VudCwgc3RyaWR4KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOwotICAgICBzdHJ1Y3Qgb3JsICptYXA7Ci0gICAgIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQ7Ci0gICAgIGludCBzdHJpZHg7Ci17Ci0gIHVuc2lnbmVkIGludCByYW5saWJzaXplID0gKHN5bWJvbF9jb3VudCAqIDgpICsgODsKLSAgdW5zaWduZWQgaW50IHN0cmluZ3NpemUgPSBzdHJpZHg7Ci0gIHVuc2lnbmVkIGludCBtYXBzaXplID0gc3RyaW5nc2l6ZSArIHJhbmxpYnNpemU7Ci0gIGZpbGVfcHRyIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyOwotICBiZmQgKmN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgc3RydWN0IGFyX2hkciBoZHI7Ci0gIHVuc2lnbmVkIGludCBpOwotICBpbnQgcGFkZGluZzsKLSAgYmZkX2J5dGUgYnVmWzhdOwotCi0gIHBhZGRpbmcgPSBCRkRfQUxJR04gKG1hcHNpemUsIDgpIC0gbWFwc2l6ZTsKLSAgbWFwc2l6ZSArPSBwYWRkaW5nOwotCi0gIC8qIHdvcmsgb3V0IHdoZXJlIHRoZSBmaXJzdCBvYmplY3QgZmlsZSB3aWxsIGdvIGluIHRoZSBhcmNoaXZlICovCi0gIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyID0gKG1hcHNpemUKLQkJCSAgICAgKyBlbGVuZ3RoCi0JCQkgICAgICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKQotCQkJICAgICArIFNBUk1BRyk7Ci0KLSAgbWVtc2V0ICgoY2hhciAqKSAoJmhkciksIDAsIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICBzdHJjcHkgKGhkci5hcl9uYW1lLCAiL1NZTTY0LyIpOwotICBzcHJpbnRmIChoZHIuYXJfc2l6ZSwgIiUtMTBkIiwgKGludCkgbWFwc2l6ZSk7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgKGxvbmcpIHRpbWUgKE5VTEwpKTsKLSAgLyogVGhpcywgYXQgbGVhc3QsIGlzIHdoYXQgSW50ZWwgY29mZiBzZXRzIHRoZSB2YWx1ZXMgdG8uOiAqLwotICBzcHJpbnRmICgoaGRyLmFyX3VpZCksICIlZCIsIDApOwotICBzcHJpbnRmICgoaGRyLmFyX2dpZCksICIlZCIsIDApOwotICBzcHJpbnRmICgoaGRyLmFyX21vZGUpLCAiJS03byIsICh1bnNpZ25lZCkgMCk7Ci0gIHN0cm5jcHkgKGhkci5hcl9mbWFnLCBBUkZNQUcsIDIpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOyBpKyspCi0gICAgaWYgKCgoY2hhciAqKSAoJmhkcikpW2ldID09ICdcMCcpCi0gICAgICAoKChjaGFyICopICgmaGRyKSlbaV0pID0gJyAnOwotCi0gIC8qIFdyaXRlIHRoZSBhciBoZWFkZXIgZm9yIHRoaXMgaXRlbSBhbmQgdGhlIG51bWJlciBvZiBzeW1ib2xzICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYXJjaCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9wdXRiNjQgKHN5bWJvbF9jb3VudCwgYnVmKTsKLSAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCA4LCBhcmNoKSAhPSA4KQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUd28gcGFzc2VzLCBmaXJzdCB3cml0ZSB0aGUgZmlsZSBvZmZzZXRzIGZvciBlYWNoIHN5bWJvbCAtCi0gICAgIHJlbWVtYmVyaW5nIHRoYXQgZWFjaCBvZmZzZXQgaXMgb24gYSB0d28gYnl0ZSBib3VuZGFyeS4gICovCi0KLSAgLyogV3JpdGUgb3V0IHRoZSBmaWxlIG9mZnNldCBmb3IgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGVhY2gKLSAgICAgc3ltYm9sLCBhbmQgcmVtZW1iZXIgdG8ga2VlcCB0aGUgb2Zmc2V0cyBwYWRkZWQgb3V0LiAgKi8KLQotICBjdXJyZW50ID0gYXJjaC0+YXJjaGl2ZV9oZWFkOwotICBjb3VudCA9IDA7Ci0gIHdoaWxlIChjdXJyZW50ICE9IChiZmQgKikgTlVMTCAmJiBjb3VudCA8IHN5bWJvbF9jb3VudCkKLSAgICB7Ci0gICAgICAvKiBGb3IgZWFjaCBzeW1ib2wgd2hpY2ggaXMgdXNlZCBkZWZpbmVkIGluIHRoaXMgb2JqZWN0LCB3cml0ZSBvdXQKLQkgdGhlIG9iamVjdCBmaWxlJ3MgYWRkcmVzcyBpbiB0aGUgYXJjaGl2ZSAqLwotCi0gICAgICB3aGlsZSAoKChiZmQgKikgKG1hcFtjb3VudF0pLnBvcykgPT0gY3VycmVudCkKLQl7Ci0JICBiZmRfcHV0YjY0IChhcmNoaXZlX21lbWJlcl9maWxlX3B0ciwgYnVmKTsKLQkgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgOCwgYXJjaCkgIT0gOCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgY291bnQrKzsKLQl9Ci0gICAgICAvKiBBZGQgc2l6ZSBvZiB0aGlzIGFyY2hpdmUgZW50cnkgKi8KLSAgICAgIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyICs9IChhcmVsdF9zaXplIChjdXJyZW50KQotCQkJCSAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgICAgIC8qIHJlbWVtYmVyIGFib3V0IHRoZSBldmVuIGFsaWdubWVudCAqLwotICAgICAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgKz0gYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgJSAyOwotICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7Ci0gICAgfQotCi0gIC8qIG5vdyB3cml0ZSB0aGUgc3RyaW5ncyB0aGVtc2VsdmVzICovCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHN5bWJvbF9jb3VudDsgY291bnQrKykKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuID0gc3RybGVuICgqbWFwW2NvdW50XS5uYW1lKSArIDE7Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUgKCptYXBbY291bnRdLm5hbWUsIDEsIGxlbiwgYXJjaCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIHNwZWMgc2F5cyB0aGF0IHRoaXMgc2hvdWxkIGJlIHBhZGRlZCB0byBhbiA4IGJ5dGUgYm91bmRhcnkuCi0gICAgIEhvd2V2ZXIsIHRoZSBJcml4IDYuMiB0b29scyBkbyBub3QgYXBwZWFyIHRvIGRvIHRoaXMuICAqLwotICB3aGlsZSAocGFkZGluZyAhPSAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfd3JpdGUgKCIiLCAxLCAxLCBhcmNoKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC0tcGFkZGluZzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gIFRoZXNlIGFyZSB1c2VkIHdoZW4gZGVhbGluZyB3aXRoIHRoZQotICAgLm1kZWJ1ZyBzZWN0aW9uLCB3aGljaCBpcyBpbiB0aGUgRUNPRkYgZGVidWdnaW5nIGZvcm1hdC4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgbWlwc19lbGY2NF9lY29mZl9kZWJ1Z19zd2FwID0KLXsKLSAgLyogU3ltYm9sIHRhYmxlIG1hZ2ljIG51bWJlci4gICovCi0gIG1hZ2ljU3ltMiwKLSAgLyogQWxpZ25tZW50IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEUuZy4sIDQuICAqLwotICA4LAotICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gIHNpemVvZiAoc3RydWN0IGhkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBkbnJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgcGRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHN5bV9leHQpLAotICBzaXplb2YgKHN0cnVjdCBvcHRfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZmRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHJmZF9leHQpLAotICBzaXplb2YgKHN0cnVjdCBleHRfZXh0KSwKLSAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIGVjb2ZmX3N3YXBfaGRyX2luLAotICBlY29mZl9zd2FwX2Rucl9pbiwKLSAgZWNvZmZfc3dhcF9wZHJfaW4sCi0gIGVjb2ZmX3N3YXBfc3ltX2luLAotICBlY29mZl9zd2FwX29wdF9pbiwKLSAgZWNvZmZfc3dhcF9mZHJfaW4sCi0gIGVjb2ZmX3N3YXBfcmZkX2luLAotICBlY29mZl9zd2FwX2V4dF9pbiwKLSAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiwKLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4sCi0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIG91dCBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgZWNvZmZfc3dhcF9oZHJfb3V0LAotICBlY29mZl9zd2FwX2Rucl9vdXQsCi0gIGVjb2ZmX3N3YXBfcGRyX291dCwKLSAgZWNvZmZfc3dhcF9zeW1fb3V0LAotICBlY29mZl9zd2FwX29wdF9vdXQsCi0gIGVjb2ZmX3N3YXBfZmRyX291dCwKLSAgZWNvZmZfc3dhcF9yZmRfb3V0LAotICBlY29mZl9zd2FwX2V4dF9vdXQsCi0gIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0LAotICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQsCi0gIC8qIEZ1bmN0aW9uIHRvIHJlYWQgaW4gc3ltYm9saWMgZGF0YS4gICovCi0gIF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvCi19OwotDAotLyogUmVsb2NhdGlvbnMgaW4gdGhlIDY0IGJpdCBNSVBTIEVMRiBBQkkgYXJlIG1vcmUgY29tcGxleCB0aGFuIGluCi0gICBzdGFuZGFyZCBFTEYuICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJlZGlyZWN0IHRoZSByZWxvY2F0aW9uCi0gICBoYW5kbGluZyByb3V0aW5lcy4gICovCi0KLWNvbnN0IHN0cnVjdCBlbGZfc2l6ZV9pbmZvIG1pcHNfZWxmNjRfc2l6ZV9pbmZvID0KLXsKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9FaGRyKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9QaGRyKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9TaGRyKSwKLSAgc2l6ZW9mIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCksCi0gIHNpemVvZiAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9TeW0pLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX0R5biksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX05vdGUpLAotICA2NCwJCS8qIGFyY2hfc2l6ZSAqLwotICA4LAkJLyogZmlsZV9hbGlnbiAqLwotICBFTEZDTEFTUzY0LAotICBFVl9DVVJSRU5ULAotICBiZmRfZWxmNjRfd3JpdGVfb3V0X3BoZHJzLAotICBiZmRfZWxmNjRfd3JpdGVfc2hkcnNfYW5kX2VoZHIsCi0gIG1pcHNfZWxmNjRfd3JpdGVfcmVsb2NzLAotICBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0LAotICBtaXBzX2VsZjY0X3NsdXJwX3JlbG9jX3RhYmxlLAotICBiZmRfZWxmNjRfc2x1cnBfc3ltYm9sX3RhYmxlLAotICBiZmRfZWxmNjRfc3dhcF9keW5faW4KLX07Ci0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCWJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJlbGY2NC1saXR0bGVtaXBzIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCWJmZF9lbGY2NF9iaWdtaXBzX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmNjQtYmlnbWlwcyIKLSNkZWZpbmUgRUxGX0FSQ0gJCQliZmRfYXJjaF9taXBzCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNX01JUFMKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkJMHgxMDAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfaW5mbwkJbWlwc19lbGY2NF9zaXplX2luZm8KLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJCV9iZmRfbWlwc19lbGZfb2JqZWN0X3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIJbWlwc19lbGY2NF9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCV9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gXAotCQkJCQlfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcJbWlwc19lbGY2NF9zZWN0aW9uX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXAJJm1pcHNfZWxmNjRfZWNvZmZfZGVidWdfc3dhcAotCi0jZGVmaW5lIGJmZF9lbGY2NF9maW5kX25lYXJlc3RfbGluZQlfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIGJmZF9lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgbWlwc19lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cAltaXBzX2VsZjY0X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGJmZF9lbGY2NF9zZXRfc2VjdGlvbl9jb250ZW50cwlfYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJX2JmZF9taXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX2Z1bmN0aW9ucwotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9zbHVycF9hcm1hcAltaXBzX2VsZjY0X3NsdXJwX2FybWFwCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgXAotCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3RydW5jYXRlX2FybmFtZSBcCi0JCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV93cml0ZV9hcm1hcAltaXBzX2VsZjY0X3dyaXRlX2FybWFwCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3JlYWRfYXJfaGRyCV9iZmRfYXJjaGl2ZV9jb2ZmX3JlYWRfYXJfaGRyCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0JCQkJX2JmZF9hcmNoaXZlX2NvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX2dldF9lbHRfYXRfaW5kZXggXAotCQkJCQlfYmZkX2FyY2hpdmVfY29mZl9nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBcCi0JCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV91cGRhdGVfYXJtYXBfdGltZXN0YW1wIFwKLQkJCQlfYmZkX2FyY2hpdmVfY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wCi0KLSNpbmNsdWRlICJlbGY2NC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC1zcGFyYy5jIGIvYmZkL2VsZjY0LXNwYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZmU5OGQuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjY0LXNwYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjc1ICswLDAgQEAKLS8qIFNQQVJDLXNwZWNpZmljIHN1cHBvcnQgZm9yIDY0LWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotLyogVGhpcyBpcyBkZWZpbmVkIGlmIG9uZSB3YW50cyB0byBidWlsZCB1cHdhcmQgY29tcGF0aWJsZSBiaW5hcmllcwotICAgd2l0aCB0aGUgb3JpZ2luYWwgc3BhcmM2NC1lbGYgdG9vbGNoYWluLiAgVGhlIHN1cHBvcnQgaXMga2VwdCBpbiBmb3IKLSAgIG5vdyBidXQgaXMgdHVybmVkIG9mZiBieSBkZWZhdWx0LiAgZGplIDk3MDkzMCAgKi8KLS8qI2RlZmluZSBTUEFSQzY0X09MRF9SRUxPQ1MqLwotCi0jaW5jbHVkZSAiZWxmL3NwYXJjLmgiCi0KLS8qIEluIGNhc2Ugd2UncmUgb24gYSAzMi1iaXQgbWFjaGluZSwgY29uc3RydWN0IGEgNjQtYml0ICItMSIgdmFsdWUuICAqLwotI2RlZmluZSBNSU5VU19PTkUgKH4gKGJmZF92bWEpIDApCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpzcGFyYzY0X2VsZl9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCBzcGFyYzY0X2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLQotc3RhdGljIHZvaWQgc3BhcmM2NF9lbGZfYnVpbGRfcGx0Ci0gIFBBUkFNUygoYmZkICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgYmZkX3ZtYSBzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0Ci0gIFBBUkFNUygoaW50KSk7Ci1zdGF0aWMgYmZkX3ZtYSBzcGFyYzY0X2VsZl9wbHRfcHRyX29mZnNldAotICBQQVJBTVMoKGludCwgaW50KSk7Ci0KLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX2NoZWNrX3JlbG9jcwotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqc2VjLAotCSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUygoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX2FkanVzdF9keW5pbmR4Ci0gIFBBUkFNUygoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci0MCi0vKiBUaGUgcmVsb2NhdGlvbiAiaG93dG8iIHRhYmxlLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfbm90c3VwX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX2hpeDIyX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfbG94MTBfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlW10gPQotewotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ184LCAgICAgICAgIDAsMCwgOCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzgiLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTYsICAgICAgICAwLDEsMTYsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xNiIsICAgICAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzMyLCAgICAgICAgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMzIiLCAgICAgIGZhbHNlLDAsMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQOCwgICAgIDAsMCwgOCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1A4IiwgICBmYWxzZSwwLDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDE2LCAgICAwLDEsMTYsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQMTYiLCAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AzMiwgICAgMCwyLDMyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDMyIiwgIGZhbHNlLDAsMHgwMGZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDMwLCAgIDIsMiwzMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dESVNQMzAiLCBmYWxzZSwwLDB4M2ZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AyMiwgICAyLDIsMjIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XRElTUDIyIiwgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hJMjIsICAgICAxMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfSEkyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18yMiwgICAgICAgIDAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzIyIiwgICAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTMsICAgICAgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xMyIsICAgICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0xPMTAsICAgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTE8xMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QxMCwgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dPVDEwIiwgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTMsICAgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HT1QxMyIsICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDIyLCAgICAxMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR09UMjIiLCAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQzEwLCAgICAgIDAsMiwxMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1BDMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMyMiwgICAgIDEwLDIsMjIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQzIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dQTFQzMCwgICAgMiwyLDMwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV1BMVDMwIiwgIGZhbHNlLDAsMHgzZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19DT1BZLCAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0NPUFkiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR0xPQl9EQVQsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HTE9CX0RBVCIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0pNUF9TTE9ULCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfSk1QX1NMT1QiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19SRUxBVElWRSwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1JFTEFUSVZFIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfVUEzMiwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19VQTMyIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotI2lmbmRlZiBTUEFSQzY0X09MRF9SRUxPQ1MKLSAgLyogVGhlc2UgYXJlbid0IGltcGxlbWVudGVkIHlldC4gICovCi0gIEhPV1RPKFJfU1BBUkNfUExUMzIsICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19QTFQzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISVBMVDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX0hJUExUMjIiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0xPUExUMTAsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfTE9QTFQxMCIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENQTFQzMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19QQ1BMVDMyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX1BDUExUMjIiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDUExUMTAsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfUENQTFQxMCIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0jZW5kaWYKLSAgSE9XVE8oUl9TUEFSQ18xMCwgICAgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzEwIiwgICAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTEsICAgICAgICAwLDIsMTEsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xMSIsICAgICAgZmFsc2UsMCwweDAwMDAwN2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzY0LCAgICAgICAgMCw0LDY0LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNjQiLCAgICAgIGZhbHNlLDAsTUlOVVNfT05FLCB0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19PTE8xMCwgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX09MTzEwIiwgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSEgyMiwgICAgIDQyLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ISDIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hNMTAsICAgICAzMiwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfSE0xMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MTTIyLCAgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0xNMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENfSEgyMiwgIDQyLDIsMjIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQ19ISDIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDX0hNMTAsICAzMiwyLDEwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUENfSE0xMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ19MTTIyLCAgMTAsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1BDX0xNMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AxNiwgICAyLDIsMTYsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYywiUl9TUEFSQ19XRElTUDE2IiwgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMTksICAgMiwyLDE5LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV0RJU1AxOSIsIGZhbHNlLDAsMHgwMDA3ZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19VTlVTRURfNDIsIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1VOVVNFRF80MiIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzcsICAgICAgICAgMCwyLCA3LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNyIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDA3Zix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ181LCAgICAgICAgIDAsMiwgNSxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzUiLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwMWYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfNiwgICAgICAgICAwLDIsIDYsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ182IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMDNmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1A2NCwgICAgMCw0LDY0LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDY0IiwgIGZhbHNlLDAsTUlOVVNfT05FLCB0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QTFQ2NCwgICAgIDAsNCw2NCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX1BMVDY0IiwgICBmYWxzZSwwLE1JTlVTX09ORSwgZmFsc2UpLAotICBIT1dUTyhSX1NQQVJDX0hJWDIyLCAgICAgMCw0LCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsc3BhcmNfZWxmX2hpeDIyX3JlbG9jLCAgIlJfU1BBUkNfSElYMjIiLCAgIGZhbHNlLDAsTUlOVVNfT05FLCBmYWxzZSksCi0gIEhPV1RPKFJfU1BBUkNfTE9YMTAsICAgICAwLDQsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbG94MTBfcmVsb2MsICAiUl9TUEFSQ19MT1gxMCIsICAgZmFsc2UsMCxNSU5VU19PTkUsIGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19INDQsICAgICAgMjIsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0g0NCIsICAgICBmYWxzZSwwLDB4MDAzZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSX1NQQVJDX000NCwgICAgICAxMiwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTTQ0IiwgICAgIGZhbHNlLDAsMHgwMDAwMDNmZixmYWxzZSksCi0gIEhPV1RPKFJfU1BBUkNfTDQ0LCAgICAgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19MNDQiLCAgICAgZmFsc2UsMCwweDAwMDAwZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19SRUdJU1RFUiwgIDAsNCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX1JFR0lTVEVSIixmYWxzZSwwLE1JTlVTX09ORSwgZmFsc2UpLAotICBIT1dUTyhSX1NQQVJDX1VBNjQsICAgICAgICAwLDQsNjQsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19VQTY0IiwgICAgICBmYWxzZSwwLE1JTlVTX09ORSwgdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfVUExNiwgICAgICAgIDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1VBMTYiLCAgICAgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKQotfTsKLQotc3RydWN0IGVsZl9yZWxvY19tYXAgewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBlbGZfcmVsb2NfbWFwIHNwYXJjX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9TUEFSQ19OT05FLCB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl9TUEFSQ18xNiwgfSwKLSAgeyBCRkRfUkVMT0NfOCwgUl9TUEFSQ184IH0sCi0gIHsgQkZEX1JFTE9DXzhfUENSRUwsIFJfU1BBUkNfRElTUDggfSwKLSAgeyBCRkRfUkVMT0NfQ1RPUiwgUl9TUEFSQ182NCB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9TUEFSQ18zMiB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl9TUEFSQ19ESVNQMzIgfSwKLSAgeyBCRkRfUkVMT0NfSEkyMiwgUl9TUEFSQ19ISTIyIH0sCi0gIHsgQkZEX1JFTE9DX0xPMTAsIFJfU1BBUkNfTE8xMCwgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUxfUzIsIFJfU1BBUkNfV0RJU1AzMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQzIyLCBSX1NQQVJDXzIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDMTMsIFJfU1BBUkNfMTMgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR09UMTAsIFJfU1BBUkNfR09UMTAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR09UMTMsIFJfU1BBUkNfR09UMTMgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR09UMjIsIFJfU1BBUkNfR09UMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUEMxMCwgUl9TUEFSQ19QQzEwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1BDMjIsIFJfU1BBUkNfUEMyMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19XUExUMzAsIFJfU1BBUkNfV1BMVDMwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0NPUFksIFJfU1BBUkNfQ09QWSB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HTE9CX0RBVCwgUl9TUEFSQ19HTE9CX0RBVCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19KTVBfU0xPVCwgUl9TUEFSQ19KTVBfU0xPVCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19SRUxBVElWRSwgUl9TUEFSQ19SRUxBVElWRSB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyLCBSX1NQQVJDX1dESVNQMjIgfSwKLSAgLyogPz8/IERvZXNuJ3QgZHdhcmYgdXNlIHRoaXM/ICAqLwotLyp7IEJGRF9SRUxPQ19TUEFSQ19VQTMyLCBSX1NQQVJDX1VBMzIgfSwgbm90IHVzZWQ/PyAqLwotICB7QkZEX1JFTE9DX1NQQVJDXzEwLCBSX1NQQVJDXzEwfSwKLSAge0JGRF9SRUxPQ19TUEFSQ18xMSwgUl9TUEFSQ18xMX0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfNjQsIFJfU1BBUkNfNjR9LAotICB7QkZEX1JFTE9DX1NQQVJDX09MTzEwLCBSX1NQQVJDX09MTzEwfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19ISDIyLCBSX1NQQVJDX0hIMjJ9LAotICB7QkZEX1JFTE9DX1NQQVJDX0hNMTAsIFJfU1BBUkNfSE0xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfTE0yMiwgUl9TUEFSQ19MTTIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19QQ19ISDIyLCBSX1NQQVJDX1BDX0hIMjJ9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BDX0hNMTAsIFJfU1BBUkNfUENfSE0xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUENfTE0yMiwgUl9TUEFSQ19QQ19MTTIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19XRElTUDE2LCBSX1NQQVJDX1dESVNQMTZ9LAotICB7QkZEX1JFTE9DX1NQQVJDX1dESVNQMTksIFJfU1BBUkNfV0RJU1AxOX0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfNywgUl9TUEFSQ183fSwKLSAge0JGRF9SRUxPQ19TUEFSQ181LCBSX1NQQVJDXzV9LAotICB7QkZEX1JFTE9DX1NQQVJDXzYsIFJfU1BBUkNfNn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfRElTUDY0LCBSX1NQQVJDX0RJU1A2NH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUExUNjQsIFJfU1BBUkNfUExUNjR9LAotICB7QkZEX1JFTE9DX1NQQVJDX0hJWDIyLCBSX1NQQVJDX0hJWDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19MT1gxMCwgUl9TUEFSQ19MT1gxMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfSDQ0LCBSX1NQQVJDX0g0NH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfTTQ0LCBSX1NQQVJDX000NH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfTDQ0LCBSX1NQQVJDX0w0NH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUkVHSVNURVIsIFJfU1BBUkNfUkVHSVNURVJ9Ci19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1zcGFyYzY0X2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHNwYXJjX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzcGFyY19yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmc3BhcmM2NF9lbGZfaG93dG9fdGFibGVbKGludCkgc3BhcmNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zcGFyYzY0X2VsZl9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjY0X0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgQkZEX0FTU0VSVCAoRUxGNjRfUl9UWVBFIChkc3QtPnJfaW5mbykgPCAodW5zaWduZWQgaW50KSBSX1NQQVJDX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmc3BhcmM2NF9lbGZfaG93dG9fdGFibGVbRUxGNjRfUl9UWVBFIChkc3QtPnJfaW5mbyldOwotfQotDAotLyogVXRpbGl0eSBmb3IgcGVyZm9ybWluZyB0aGUgc3RhbmRhcmQgaW5pdGlhbCB3b3JrIG9mIGFuIGluc3RydWN0aW9uCi0gICByZWxvY2F0aW9uLgotICAgKlBSRUxPQ0FUSU9OIHdpbGwgY29udGFpbiB0aGUgcmVsb2NhdGVkIGl0ZW0uCi0gICAqUElOU04gd2lsbCBjb250YWluIHRoZSBpbnN0cnVjdGlvbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uCi0gICBJZiB0aGUgcmVzdWx0IGlzIGBiZmRfcmVsb2Nfb3RoZXInIHRoZSBjYWxsZXIgY2FuIGNvbnRpbnVlIHdpdGgKLSAgIHBlcmZvcm1pbmcgdGhlIHJlbG9jYXRpb24uICBPdGhlcndpc2UgaXQgbXVzdCBzdG9wIGFuZCByZXR1cm4gdGhlCi0gICB2YWx1ZSB0byBpdHMgY2FsbGVyLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaW5pdF9pbnNuX3JlbG9jIChhYmZkLAotCQkgcmVsb2NfZW50cnksCi0JCSBzeW1ib2wsCi0JCSBkYXRhLAotCQkgaW5wdXRfc2VjdGlvbiwKLQkJIG91dHB1dF9iZmQsCi0JCSBwcmVsb2NhdGlvbiwKLQkJIHBpbnNuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBiZmRfdm1hICpwcmVsb2NhdGlvbjsKLSAgICAgYmZkX3ZtYSAqcGluc247Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgKCEgaG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogVGhpcyB3b3JrcyBiZWNhdXNlIHBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIHJlbG9jYXRpb24gPSAoc3ltYm9sLT52YWx1ZQotCQkrIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICB7Ci0gICAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgfQotCi0gICpwcmVsb2NhdGlvbiA9IHJlbG9jYXRpb247Ci0gICpwaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICByZXR1cm4gYmZkX3JlbG9jX290aGVyOwotfQotCi0vKiBGb3IgdW5zdXBwb3J0ZWQgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc3BhcmNfZWxmX25vdHN1cF9yZWxvYyAoYWJmZCwKLQkJCXJlbG9jX2VudHJ5LAotCQkJc3ltYm9sLAotCQkJZGF0YSwKLQkJCWlucHV0X3NlY3Rpb24sCi0JCQlvdXRwdXRfYmZkLAotCQkJZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotfQotCi0vKiBIYW5kbGUgdGhlIFdESVNQMTYgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zcGFyY19lbGZfd2Rpc3AxNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfdm1hIGluc247Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gaW5pdF9pbnNuX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsICZyZWxvY2F0aW9uLCAmaW5zbik7Ci0gIGlmIChzdGF0dXMgIT0gYmZkX3JlbG9jX290aGVyKQotICAgIHJldHVybiBzdGF0dXM7Ci0KLSAgaW5zbiA9IChpbnNuICYgfjB4MzAzZmZmKSB8ICgoKChyZWxvY2F0aW9uID4+IDIpICYgMHhjMDAwKSA8PCA2KQotCQkJICAgICAgIHwgKChyZWxvY2F0aW9uID4+IDIpICYgMHgzZmZmKSk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIGlmICgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPCAtIDB4NDAwMDAKLSAgICAgIHx8IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+IDB4M2ZmZmYpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgZWxzZQotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgSElYMjIgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zcGFyY19lbGZfaGl4MjJfcmVsb2MgKGFiZmQsCi0JCSAgICAgICByZWxvY19lbnRyeSwKLQkJICAgICAgIHN5bWJvbCwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgb3V0cHV0X2JmZCwKLQkJICAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgaW5zbjsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHN0YXR1czsKLQotICBzdGF0dXMgPSBpbml0X2luc25fcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgJnJlbG9jYXRpb24sICZpbnNuKTsKLSAgaWYgKHN0YXR1cyAhPSBiZmRfcmVsb2Nfb3RoZXIpCi0gICAgcmV0dXJuIHN0YXR1czsKLQotICByZWxvY2F0aW9uIF49IE1JTlVTX09ORTsKLSAgaW5zbiA9IChpbnNuICYgfjB4M2ZmZmZmKSB8ICgocmVsb2NhdGlvbiA+PiAxMCkgJiAweDNmZmZmZik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIGlmICgocmVsb2NhdGlvbiAmIH4gKGJmZF92bWEpIDB4ZmZmZmZmZmYpICE9IDApCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgZWxzZQotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTE9YMTAgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zcGFyY19lbGZfbG94MTBfcmVsb2MgKGFiZmQsCi0JCSAgICAgICByZWxvY19lbnRyeSwKLQkJICAgICAgIHN5bWJvbCwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgb3V0cHV0X2JmZCwKLQkJICAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgaW5zbjsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHN0YXR1czsKLQotICBzdGF0dXMgPSBpbml0X2luc25fcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgJnJlbG9jYXRpb24sICZpbnNuKTsKLSAgaWYgKHN0YXR1cyAhPSBiZmRfcmVsb2Nfb3RoZXIpCi0gICAgcmV0dXJuIHN0YXR1czsKLQotICBpbnNuID0gKGluc24gJiB+MHgxZmZmKSB8IDB4MWMwMCB8IChyZWxvY2F0aW9uICYgMHgzZmYpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotDAotLyogUExUL0dPVCBzdHVmZiAqLwotCi0vKiBCb3RoIHRoZSBoZWFkZXJzIGFuZCB0aGUgZW50cmllcyBhcmUgaWNhY2hlIGFsaWduZWQuICAqLwotI2RlZmluZSBQTFRfRU5UUllfU0laRQkJMzIKLSNkZWZpbmUgUExUX0hFQURFUl9TSVpFCQkoNCAqIFBMVF9FTlRSWV9TSVpFKQotI2RlZmluZSBMQVJHRV9QTFRfVEhSRVNIT0xECTMyNzY4Ci0jZGVmaW5lIEdPVF9SRVNFUlZFRF9FTlRSSUVTCTEKLQotI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAiL3Vzci9saWIvc3BhcmN2OS9sZC5zby4xIgotCi0KLS8qIEZpbGwgaW4gdGhlIC5wbHQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1zcGFyYzY0X2VsZl9idWlsZF9wbHQgKG91dHB1dF9iZmQsIGNvbnRlbnRzLCBuZW50cmllcykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICB1bnNpZ25lZCBjaGFyICpjb250ZW50czsKLSAgICAgaW50IG5lbnRyaWVzOwotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbm9wID0gMHgwMTAwMDAwMDsKLSAgaW50IGksIGo7Ci0gIAotICAvKiBUaGUgZmlyc3QgZm91ciBlbnRyaWVzIGFyZSByZXNlcnZlZCwgYW5kIGFyZSBpbml0aWFsbHkgdW5kZWZpbmVkLgotICAgICBXZSBmaWxsIHRoZW0gd2l0aCBgaWxsdHJhcCAwJyB0byBmb3JjZSBsZC5zbyB0byBkbyBzb21ldGhpbmcuICAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCBQTFRfSEVBREVSX1NJWkUvNDsgKytpKQotICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGNvbnRlbnRzK2kqNCk7Ci0KLSAgLyogVGhlIGZpcnN0IDMyNzY4IGVudHJpZXMgYXJlIGNsb3NlIGVub3VnaCB0byBwbHQxIHRvIGdldCB0aGVyZSB2aWEKLSAgICAgYSBzdHJhaWdodCBicmFuY2guICAqLwotCi0gIGZvciAoaSA9IDQ7IGkgPCBMQVJHRV9QTFRfVEhSRVNIT0xEICYmIGkgPCBuZW50cmllczsgKytpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmVudHJ5ID0gY29udGVudHMgKyBpICogUExUX0VOVFJZX1NJWkU7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2V0aGksIGJhOwotCi0gICAgICAvKiBzZXRoaSAoLiAtIHBsdDApLCAlZzEgKi8KLSAgICAgIHNldGhpID0gMHgwMzAwMDAwMCB8IChpICogUExUX0VOVFJZX1NJWkUpOwotCi0gICAgICAvKiBiYSxhLHB0ICVpY2MsIHBsdDEgKi8KLSAgICAgIGJhID0gMHgzMDQ4MDAwMCB8ICgoKGNvbnRlbnRzK1BMVF9FTlRSWV9TSVpFKSAtIChlbnRyeSs0KSkgLyA0ICYgMHg3ZmZmZik7Ci0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHNldGhpLCBlbnRyeSk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBiYSwgZW50cnkrNCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzgpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbm9wLCBlbnRyeSsxMik7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzE2KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrMjApOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbm9wLCBlbnRyeSsyNCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzI4KTsKLSAgICB9Ci0KLSAgLyogTm93IHRoZSB0cmlja3kgYml0LiAgRW50cmllcyAzMjc2OCBhbmQgaGlnaGVyIGFyZSBncm91cGVkIGluIGJsb2NrcyBvZgotICAgICAxNjA6IDE2MCBlbnRyaWVzIGFuZCAxNjAgcG9pbnRlcnMuICBUaGlzIGlzIHRvIHNlcGFyYXRlIGNvZGUgZnJvbSBkYXRhLAotICAgICB3aGljaCBpcyBtdWNoIGZyaWVuZGxpZXIgb24gdGhlIGNhY2hlLiAgKi8KLSAgCi0gIGZvciAoOyBpIDwgbmVudHJpZXM7IGkgKz0gMTYwKQotICAgIHsKLSAgICAgIGludCBibG9jayA9IChpICsgMTYwIDw9IG5lbnRyaWVzID8gMTYwIDogbmVudHJpZXMgLSBpKTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBibG9jazsgKytqKQotCXsKLQkgIHVuc2lnbmVkIGNoYXIgKmVudHJ5LCAqcHRyOwotCSAgdW5zaWduZWQgaW50IGxkeDsKLQotCSAgZW50cnkgPSBjb250ZW50cyArIGkqUExUX0VOVFJZX1NJWkUgKyBqKjQqNjsKLQkgIHB0ciA9IGNvbnRlbnRzICsgaSpQTFRfRU5UUllfU0laRSArIGJsb2NrKjQqNiArIGoqODsKLQotCSAgLyogbGR4IFslbzcgKyBwdHIgLSBlbnRyeSs0XSwgJWcxICovCi0JICBsZHggPSAweGMyNWJlMDAwIHwgKChwdHIgLSBlbnRyeSs0KSAmIDB4MWZmZik7Ci0KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDB4OGExMDAwMGYsIGVudHJ5KTsgICAgLyogbW92ICVvNywlZzUgKi8KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDB4NDAwMDAwMDIsIGVudHJ5KzQpOyAgLyogY2FsbCAuKzggKi8KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrOCk7ICAgICAgICAgLyogbm9wICovCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBsZHgsIGVudHJ5KzEyKTsgICAgICAgIC8qIGxkeCBbJW83K1BdLCVnMSAqLwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMHg4M2MzYzAwMSwgZW50cnkrMTYpOyAvKiBqbXBsICVvNyslZzEsJWcxICovCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAweDllMTAwMDA1LCBlbnRyeSsyMCk7IC8qIG1vdiAlZzUsJW83ICovCi0KLQkgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIGNvbnRlbnRzIC0gZW50cnkrNCwgcHRyKTsKLQl9Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gdGhlIG9mZnNldCBvZiBhIHBhcnRpY3VsYXIgcGx0IGVudHJ5IHdpdGhpbiB0aGUgLnBsdCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLXNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQgKGluZGV4KQotICAgICBpbnQgaW5kZXg7Ci17Ci0gIGludCBibG9jaywgb2ZzOwotCi0gIGlmIChpbmRleCA8IExBUkdFX1BMVF9USFJFU0hPTEQpCi0gICAgcmV0dXJuIGluZGV4ICogUExUX0VOVFJZX1NJWkU7Ci0KLSAgLyogU2VlIGFib3ZlIGZvciBkZXRhaWxzLiAgKi8KLQotICBibG9jayA9IChpbmRleCAtIExBUkdFX1BMVF9USFJFU0hPTEQpIC8gMTYwOwotICBvZnMgPSAoaW5kZXggLSBMQVJHRV9QTFRfVEhSRVNIT0xEKSAlIDE2MDsKLQotICByZXR1cm4gKChiZmRfdm1hKShMQVJHRV9QTFRfVEhSRVNIT0xEICsgYmxvY2sqMTYwKSAqIFBMVF9FTlRSWV9TSVpFCi0JICArIG9mcyAqIDYqNCk7Ci19Ci0KLXN0YXRpYyBiZmRfdm1hCi1zcGFyYzY0X2VsZl9wbHRfcHRyX29mZnNldCAoaW5kZXgsIG1heCkKLSAgICAgaW50IGluZGV4LCBtYXg7Ci17Ci0gIGludCBibG9jaywgb2ZzLCBsYXN0OwotCi0gIEJGRF9BU1NFUlQoaW5kZXggPj0gTEFSR0VfUExUX1RIUkVTSE9MRCk7Ci0KLSAgLyogU2VlIGFib3ZlIGZvciBkZXRhaWxzLiAgKi8KLQotICBibG9jayA9IChpbmRleCAtIExBUkdFX1BMVF9USFJFU0hPTEQpIC8gMTYwOwotICBvZnMgPSAoaW5kZXggLSBMQVJHRV9QTFRfVEhSRVNIT0xEKSAlIDE2MDsKLSAgbGFzdCA9IChtYXggLSBMQVJHRV9QTFRfVEhSRVNIT0xEKSAlIDE2MDsKLQotICByZXR1cm4gKChMQVJHRV9QTFRfVEhSRVNIT0xEICsgYmxvY2sqMTYwKSAqIFBMVF9FTlRSWV9TSVpFCi0JICArIGxhc3QgKiA2KjQKLQkgICsgb2ZzICogOCk7Ci19Ci0KLQotDAotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKLSAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIG9yIHByb2NlZHVyZSBsaW5rYWdlCi0gICB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNyZWxnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSB8fCAhKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKTsKLQotICBzZ290ID0gTlVMTDsKLSAgc3JlbGdvdCA9IE5VTEw7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGNjRfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgc3dpdGNoIChFTEY2NF9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSX1NQQVJDX0dPVDEwOgotCWNhc2UgUl9TUEFSQ19HT1QxMzoKLQljYXNlIFJfU1BBUkNfR09UMjI6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoZHlub2JqID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBDcmVhdGUgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0JICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIGlmIChzcmVsZ290ID09IE5VTEwgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICB7Ci0JICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQotCQl7Ci0JCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbGdvdCwKLQkJCQkJCSAgKFNFQ19BTExPQwotCQkJCQkJICAgfCBTRUNfTE9BRAotCQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICB8IFNFQ19SRUFET05MWSkpCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsZ290LCAzKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0JCXsKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGgtPmdvdC5vZmZzZXQgPSBzZ290LT5fcmF3X3NpemU7Ci0KLQkgICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCQl7Ci0JCSAgaWYgKCEgYmZkX2VsZjY0X2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCi0JCXsKLQkJICBzaXplX3Qgc2l6ZTsKLQkJICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKLQotCQkgIHNpemUgPSBzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChiZmRfdm1hKTsKLQkJICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IChiZmRfdm1hICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0JCSAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKSA9IGxvY2FsX2dvdF9vZmZzZXRzOwotCQkgIGZvciAoaSA9IDA7IGkgPCBzeW10YWJfaGRyLT5zaF9pbmZvOyBpKyspCi0JCSAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tpXSA9IChiZmRfdm1hKSAtMTsKLQkJfQotCSAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKQotCQl7Ci0JCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gPSBzZ290LT5fcmF3X3NpemU7Ci0KLQkgICAgICBpZiAoaW5mby0+c2hhcmVkKQotCQl7Ci0JCSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgICAgICBvdXRwdXQgYSBSX1NQQVJDX1JFTEFUSVZFIHJlbG9jIHNvIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICBkeW5hbWljIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KLQkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQkJfQotCSAgICB9Ci0KLQkgIHNnb3QtPl9yYXdfc2l6ZSArPSA4OwotCi0jaWYgMAotCSAgLyogRG9lc24ndCB3b3JrIGZvciA2NC1iaXQgLWZQSUMsIHNpbmNlIHNldGhpL29yIGJ1aWxkcwotCSAgICAgdW5zaWduZWQgbnVtYmVycy4gIElmIHdlIHBlcm1pdCBvdXJzZWx2ZXMgdG8gbW9kaWZ5Ci0JICAgICBjb2RlIHNvIHdlIGdldCBzZXRoaS94b3IsIHRoaXMgY291bGQgd29yay4KLQkgICAgIFF1ZXN0aW9uOiBkbyB3ZSBjb25zaWRlciBjb25kaXRpb25hbGx5IHJlLWVuYWJsaW5nCi0gICAgICAgICAgICAgdGhpcyBmb3IgLWZwaWMsIG9uY2Ugd2Uga25vdyBhYm91dCBvYmplY3QgY29kZSBtb2RlbHM/ICAqLwotCSAgLyogSWYgdGhlIC5nb3Qgc2VjdGlvbiBpcyBtb3JlIHRoYW4gMHgxMDAwIGJ5dGVzLCB3ZSBhZGQKLQkgICAgIDB4MTAwMCB0byB0aGUgdmFsdWUgb2YgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLCBzbyB0aGF0IDEzCi0JICAgICBiaXQgcmVsb2NhdGlvbnMgaGF2ZSBhIGdyZWF0ZXIgY2hhbmNlIG9mIHdvcmtpbmcuICAqLwotCSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+PSAweDEwMDAKLQkgICAgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QtPnJvb3QudS5kZWYudmFsdWUgPT0gMCkKLQkgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290LT5yb290LnUuZGVmLnZhbHVlID0gMHgxMDAwOwotI2VuZGlmCi0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1dQTFQzMDoKLQljYXNlIFJfU1BBUkNfUExUMzI6Ci0JY2FzZSBSX1NQQVJDX0hJUExUMjI6Ci0JY2FzZSBSX1NQQVJDX0xPUExUMTA6Ci0JY2FzZSBSX1NQQVJDX1BDUExUMzI6Ci0JY2FzZSBSX1NQQVJDX1BDUExUMjI6Ci0JY2FzZSBSX1NQQVJDX1BDUExUMTA6Ci0JY2FzZSBSX1NQQVJDX1BMVDY0OgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gIFdlCi0gICAgICAgICAgICAgYWN0dWFsbHkgYnVpbGQgdGhlIGVudHJ5IGluIGFkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgICAgICAgICAgICBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgYSBjYXNlIG9mIGxpbmtpbmcgUElDIGNvZGUgd2l0aG91dAotICAgICAgICAgICAgIGxpbmtpbmcgaW4gYW55IGR5bmFtaWMgb2JqZWN0cywgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndAotICAgICAgICAgICAgIG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBhZnRlciBhbGwuICAqLwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBoYXZlIGEgcHJvY2VkdXJlIGxpbmthZ2UKLSAgICAgICAgICAgICAgICAgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX2VsZjY0X2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19QQzEwOgotCWNhc2UgUl9TUEFSQ19QQzIyOgotCWNhc2UgUl9TUEFSQ19QQ19ISDIyOgotCWNhc2UgUl9TUEFSQ19QQ19ITTEwOgotCWNhc2UgUl9TUEFSQ19QQ19MTTIyOgotCSAgaWYgKGggIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfU1BBUkNfRElTUDg6Ci0JY2FzZSBSX1NQQVJDX0RJU1AxNjoKLQljYXNlIFJfU1BBUkNfRElTUDMyOgotCWNhc2UgUl9TUEFSQ19ESVNQNjQ6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMzA6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMjI6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMTk6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMTY6Ci0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSX1NQQVJDXzg6Ci0JY2FzZSBSX1NQQVJDXzE2OgotCWNhc2UgUl9TUEFSQ18zMjoKLQljYXNlIFJfU1BBUkNfSEkyMjoKLQljYXNlIFJfU1BBUkNfMjI6Ci0JY2FzZSBSX1NQQVJDXzEzOgotCWNhc2UgUl9TUEFSQ19MTzEwOgotCWNhc2UgUl9TUEFSQ19VQTMyOgotCWNhc2UgUl9TUEFSQ18xMDoKLQljYXNlIFJfU1BBUkNfMTE6Ci0JY2FzZSBSX1NQQVJDXzY0OgotCWNhc2UgUl9TUEFSQ19PTE8xMDoKLQljYXNlIFJfU1BBUkNfSEgyMjoKLQljYXNlIFJfU1BBUkNfSE0xMDoKLQljYXNlIFJfU1BBUkNfTE0yMjoKLQljYXNlIFJfU1BBUkNfNzoKLQljYXNlIFJfU1BBUkNfNToKLQljYXNlIFJfU1BBUkNfNjoKLQljYXNlIFJfU1BBUkNfSElYMjI6Ci0JY2FzZSBSX1NQQVJDX0xPWDEwOgotCWNhc2UgUl9TUEFSQ19INDQ6Ci0JY2FzZSBSX1NQQVJDX000NDoKLQljYXNlIFJfU1BBUkNfTDQ0OgotCWNhc2UgUl9TUEFSQ19VQTY0OgotCWNhc2UgUl9TUEFSQ19VQTE2OgotCSAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZSByZWxvY3MKLQkgICAgIGludG8gdGhlIG91dHB1dCBmaWxlLiAgV2UgY3JlYXRlIGEgcmVsb2Mgc2VjdGlvbiBpbgotCSAgICAgZHlub2JqIGFuZCBtYWtlIHJvb20gZm9yIHRoZSByZWxvYy4gCi0KLQkgICAgIEJ1dCBkb24ndCBkbyB0aGlzIGZvciBkZWJ1Z2dpbmcgc2VjdGlvbnMgLS0gdGhpcyBzaG93cyB1cAotCSAgICAgd2l0aCBEV0FSRjIgLS0gZmlyc3QgYmVjYXVzZSB0aGV5IGFyZSBub3QgbG9hZGVkLCBhbmQKLQkgICAgIHNlY29uZCBiZWNhdXNlIERXQVJGIHNleiB0aGUgZGVidWcgaW5mbyBpcyBub3QgdG8gYmUKLQkgICAgIGJpYXNlZCBieSB0aGUgbG9hZCBhZGRyZXNzLiAgKi8KLQkgIGlmIChpbmZvLT5zaGFyZWQgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpKQotCSAgICB7Ci0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoYWJmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JCQkJCSBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0JCSAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICAgIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkKLQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCQkgICAgICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCQlmbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLQkJICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywgZmxhZ3MpCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsb2MsIDMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19SRUdJU1RFUjoKLQkgIC8qIE5vdGhpbmcgdG8gZG8uICAqLwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpKF8oIiVzOiBjaGVja19yZWxvY3M6IHVuaGFuZGxlZCByZWxvYyB0eXBlICVkIiksCi0JCQkJYmZkX2dldF9maWxlbmFtZShhYmZkKSwKLQkJCQlFTEY2NF9SX1RZUEUgKHJlbC0+cl9pbmZvKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uLCBwdXQgaXQgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgV2UKLSAgICAgd2lsbCBmaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbGF0ZXIKLSAgICAgKGFsdGhvdWdoIHdlIGNvdWxkIGFjdHVhbGx5IGRvIGl0IGhlcmUpLiAgVGhlIFNUVF9OT1RZUEUKLSAgICAgY29uZGl0aW9uIGlzIGEgaGFjayBzcGVjaWZpY2FsbHkgZm9yIHRoZSBPcmFjbGUgbGlicmFyaWVzCi0gICAgIGRlbGl2ZXJlZCBmb3IgU29sYXJpczsgZm9yIHNvbWUgaW5leHBsaWNhYmxlIHJlYXNvbiwgdGhleSBkZWZpbmUKLSAgICAgc29tZSBvZiB0aGVpciBmdW5jdGlvbnMgYXMgU1RUX05PVFlQRSB3aGVuIHRoZXkgcmVhbGx5IHNob3VsZCBiZQotICAgICBTVFRfRlVOQy4gICovCi0gIGlmIChoLT50eXBlID09IFNUVF9GVU5DCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwCi0gICAgICB8fCAoaC0+dHlwZSA9PSBTVFRfTk9UWVBFCi0JICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKSkKLSAgICB7Ci0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLQl7Ci0JICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIGlmIHdlIHNhdyBhIFdQTFQzMCByZWxvYyBpbiBhbiBpbnB1dAotICAgICAgICAgICAgIGZpbGUsIGJ1dCBub25lIG9mIHRoZSBpbnB1dCBmaWxlcyB3ZXJlIGR5bmFtaWMgb2JqZWN0cy4KLSAgICAgICAgICAgICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBidWlsZCBhCi0gICAgICAgICAgICAgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGFuZCB3ZSBjYW4ganVzdCBkbyBhIFdESVNQMzAKLSAgICAgICAgICAgICByZWxvYyBpbnN0ZWFkLiAgKi8KLQkgIEJGRF9BU1NFUlQgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCBmb3VyIGJpdCBpbiAucGx0IGlzIHJlc2VydmVkLiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgPSBQTFRfSEVBREVSX1NJWkU7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlCi0JIG5vdCBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhpcwotCSBsb2NhdGlvbiBpbiB0aGUgLnBsdC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBmdW5jdGlvbgotCSBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZAotCSB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0JfQotCi0gICAgICAvKiBUbyBzaW1wbGlmeSBtYXR0ZXJzIGxhdGVyLCBqdXN0IHN0b3JlIHRoZSBwbHQgaW5kZXggaGVyZS4gICovCi0gICAgICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplIC8gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBlbnRyeS4gICovCi0gICAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBUaGUgZmlyc3QgcGx0IGVudHJpZXMgYXJlIHJlc2VydmVkLCBhbmQgdGhlIHJlbG9jYXRpb25zIG11c3QKLQkgcGFpciB1cCBleGFjdGx5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgKz0gKFBMVF9IRUFERVJfU0laRS9QTFRfRU5UUllfU0laRQotCQkJICogc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKSk7Ci0KLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotCi0gICAgICAvKiBUaGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgc2l6ZSBpcyBib3VuZGVkIGJ5IHRoZSBtYWduaXR1ZGUKLQkgb2YgdGhlIG9mZnNldCB3ZSBjYW4gZGVzY3JpYmUgaW4gdGhlIGVudHJ5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPj0gKGJmZF92bWEpMSA8PCAzMikKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuICAqLwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSX1NQQVJDX0NPUFkgcmVsb2MgdG8gdGVsbCB0aGUgZHluYW1pYyBsaW5rZXIKLSAgICAgdG8gY29weSB0aGUgaW5pdGlhbCB2YWx1ZSBvdXQgb2YgdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCBpbnRvIHRoZQotICAgICBydW50aW1lIHByb2Nlc3MgaW1hZ2UuICBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBvZmZzZXQgaW50byB0aGUKLSAgICAgLnJlbC5ic3Mgc2VjdGlvbiB3ZSBhcmUgZ29pbmcgdG8gdXNlLiAgKi8KLSAgaWYgKChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKLSAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gIDE2LWJ5dGVzIGlzIHRoZSBzaXplCi0gICAgIG9mIHRoZSBsYXJnZXN0IHR5cGUgdGhhdCByZXF1aXJlcyBoYXJkIGFsaWdubWVudCAtLSBsb25nIGRvdWJsZS4gICovCi0gIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IDQpCi0gICAgcG93ZXJfb2ZfdHdvID0gNDsKLQotICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KLSAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCi0JCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIHBvd2VyX29mX3R3bykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBhcyBiZWluZyBhdCB0aGlzIHBvaW50IGluIHRoZSBzZWN0aW9uLiAgKi8KLSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQotICAvKiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB0byBtYWtlIHJvb20gZm9yIHRoZSBzeW1ib2wuICAqLwotICBzLT5fcmF3X3NpemUgKz0gaC0+c2l6ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotICBib29sZWFuIHJlbHBsdDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGVudHJpZXMgaW4gdGhlIC5yZWxhLmdvdCBzZWN0aW9uLgotICAgICAgICAgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbAotICAgICAgICAgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQgdGhlIHNpemUgb2YgLnJlbGEuZ290LAotICAgICAgICAgd2hpY2ggd2lsbCBjYXVzZSBpdCB0byBnZXQgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUKLSAgICAgICAgIGJlbG93LiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgfQotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcmVsdGV4dCA9IGZhbHNlOwotICByZWxwbHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKLQkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7Ci0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIHRvIGhhbmRsZSAucmVsYS5ic3MgYW5kCi0JCSAucmVsLnBsdC4gIFdlIG11c3QgY3JlYXRlIGl0IGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSBpdCBtdXN0IGJlIGNyZWF0ZWQKLQkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQotCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKLQkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbwotCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpvdXRuYW1lOwotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMIGVudHJ5LiAgKi8KLQkgICAgICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDUpOwotCSAgICAgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwKQotCQlyZWx0ZXh0ID0gdHJ1ZTsKLQotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVsYS5wbHQiKSA9PSAwKQotCQlyZWxwbHQgPSB0cnVlOwotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSAhPSAwCi0JICAgICAgICYmIHN0cm5jbXAgKG5hbWUsICIuZ290IiwgNCkgIT0gMCkKLQl7Ci0JICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQl7Ci0JICBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKHMpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgWmVybyB0aGUgbWVtb3J5Ci0JIGZvciB0aGUgYmVuZWZpdCBvZiAucmVsYS5wbHQsIHdoaWNoIGhhcyA0IHVudXNlZCBlbnRyaWVzCi0JIGF0IHRoZSBiZWdpbm5pbmcsIGFuZCB3ZSBkb24ndCB3YW50IGdhcmJhZ2UuICAqLwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfREVCVUcsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVscGx0KQotCXsKLQkgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUxBKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApCi0JICAgICAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NQQVJDX1BMVEZNVCwKLQkJCQkJCShpbmZvLT5zaGFyZWQgIT0gMCkgKyAxKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBLCAwKQotCSAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFTWiwgMCkKLQkgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBRU5ULAotCQkJCQkgICAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBnZW5lcmF0ZSBhIHNlY3Rpb24KLSAgICAgc3ltYm9sIGZvciBlYWNoIG91dHB1dCBzZWN0aW9uIGZvciB3aGljaCB3ZSBtaWdodCBuZWVkIHRvIGNvcHkKLSAgICAgcmVsb2NzLiAgVGhlc2UgYXJlIGxvY2FsIHN5bWJvbHMsIHdoaWNoIG1lYW5zIHRoYXQgdGhleSBtdXN0IGNvbWUKLSAgICAgZmlyc3QgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgVGhhdCBtZWFucyB3ZSBtdXN0IGluY3JlbWVudAotICAgICB0aGUgZHluYW1pYyBzeW1ib2wgaW5kZXggb2YgZXZlcnkgb3RoZXIgZHluYW1pYyBzeW1ib2wuICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGludCBjOwotCi0gICAgICBjID0gMDsKLSAgICAgIGZvciAocyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXsKLQkgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpICE9IDAKLQkgICAgICB8fCAocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCA9IGMgKyAxOwotCi0JICAvKiBUaGVzZSBzeW1ib2xzIHdpbGwgaGF2ZSBubyBuYW1lcywgc28gd2UgZG9uJ3QgbmVlZCB0bwotICAgICAgICAgICAgIGZpZGRsZSB3aXRoIGR5bnN0cl9pbmRleC4gICovCi0KLQkgICsrYzsKLQl9Ci0KLSAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICAgIHNwYXJjNjRfZWxmX2FkanVzdF9keW5pbmR4LAotCQkJICAgICAgKFBUUikgJmMpOwotICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCArPSBjOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSW5jcmVtZW50IHRoZSBpbmRleCBvZiBhIGR5bmFtaWMgc3ltYm9sIGJ5IGEgZ2l2ZW4gYW1vdW50LiAgQ2FsbGVkCi0gICB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9hZGp1c3RfZHluaW5keCAoaCwgY3BhcmcpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgY3Bhcmc7Ci17Ci0gIGludCAqY3AgPSAoaW50ICopIGNwYXJnOwotCi0gIGlmIChoLT5keW5pbmR4ICE9IC0xKQotICAgIGgtPmR5bmluZHggKz0gKmNwOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogUmVsb2NhdGUgYSBTUEFSQzY0IEVMRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBiZmRfdm1hIGdvdF9iYXNlOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNwbHQ7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChpbnB1dF9iZmQpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZShpbmZvKS0+aGdvdCA9PSBOVUxMKQotICAgIGdvdF9iYXNlID0gMDsKLSAgZWxzZQotICAgIGdvdF9iYXNlID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290LT5yb290LnUuZGVmLnZhbHVlOwotCi0gIHNnb3QgPSBzcGx0ID0gc3JlbG9jID0gTlVMTDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfdHlwZSA9IEVMRjY0X1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfU1BBUkNfbWF4KQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gc3BhcmM2NF9lbGZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGNjRfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGJvb2xlYW4gc2tpcF9pdCA9IGZhbHNlOwotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICAgIHN3aXRjaCAocl90eXBlKQotCQl7Ci0JCWNhc2UgUl9TUEFSQ19XUExUMzA6Ci0JCWNhc2UgUl9TUEFSQ19QTFQzMjoKLQkJY2FzZSBSX1NQQVJDX0hJUExUMjI6Ci0JCWNhc2UgUl9TUEFSQ19MT1BMVDEwOgotCQljYXNlIFJfU1BBUkNfUENQTFQzMjoKLQkJY2FzZSBSX1NQQVJDX1BDUExUMjI6Ci0JCWNhc2UgUl9TUEFSQ19QQ1BMVDEwOgotCQljYXNlIFJfU1BBUkNfUExUNjQ6Ci0JCSAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQkgICAgc2tpcF9pdCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX1NQQVJDX0dPVDEwOgotCQljYXNlIFJfU1BBUkNfR09UMTM6Ci0JCWNhc2UgUl9TUEFSQ19HT1QyMjoKLQkJICBpZiAoZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAgICAmJiAoIWluZm8tPnNoYXJlZAotCQkJICB8fCAoIWluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgIHx8ICEoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCQkgICAgc2tpcF9pdCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX1NQQVJDX1BDMTA6Ci0JCWNhc2UgUl9TUEFSQ19QQzIyOgotCQljYXNlIFJfU1BBUkNfUENfSEgyMjoKLQkJY2FzZSBSX1NQQVJDX1BDX0hNMTA6Ci0JCWNhc2UgUl9TUEFSQ19QQ19MTTIyOgotCQkgIGlmICghc3RyY21wKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSkKLQkJICAgIGJyZWFrOwotCQkgIC8qIEZBTExUSFJVICovCi0KLQkJY2FzZSBSX1NQQVJDXzg6Ci0JCWNhc2UgUl9TUEFSQ18xNjoKLQkJY2FzZSBSX1NQQVJDXzMyOgotCQljYXNlIFJfU1BBUkNfRElTUDg6Ci0JCWNhc2UgUl9TUEFSQ19ESVNQMTY6Ci0JCWNhc2UgUl9TUEFSQ19ESVNQMzI6Ci0JCWNhc2UgUl9TUEFSQ19XRElTUDMwOgotCQljYXNlIFJfU1BBUkNfV0RJU1AyMjoKLQkJY2FzZSBSX1NQQVJDX0hJMjI6Ci0JCWNhc2UgUl9TUEFSQ18yMjoKLQkJY2FzZSBSX1NQQVJDXzEzOgotCQljYXNlIFJfU1BBUkNfTE8xMDoKLQkJY2FzZSBSX1NQQVJDX1VBMzI6Ci0JCWNhc2UgUl9TUEFSQ18xMDoKLQkJY2FzZSBSX1NQQVJDXzExOgotCQljYXNlIFJfU1BBUkNfNjQ6Ci0JCWNhc2UgUl9TUEFSQ19PTE8xMDoKLQkJY2FzZSBSX1NQQVJDX0hIMjI6Ci0JCWNhc2UgUl9TUEFSQ19ITTEwOgotCQljYXNlIFJfU1BBUkNfTE0yMjoKLQkJY2FzZSBSX1NQQVJDX1dESVNQMTk6Ci0JCWNhc2UgUl9TUEFSQ19XRElTUDE2OgotCQljYXNlIFJfU1BBUkNfNzoKLQkJY2FzZSBSX1NQQVJDXzU6Ci0JCWNhc2UgUl9TUEFSQ182OgotCQljYXNlIFJfU1BBUkNfRElTUDY0OgotCQljYXNlIFJfU1BBUkNfSElYMjI6Ci0JCWNhc2UgUl9TUEFSQ19MT1gxMDoKLQkJY2FzZSBSX1NQQVJDX0g0NDoKLQkJY2FzZSBSX1NQQVJDX000NDoKLQkJY2FzZSBSX1NQQVJDX0w0NDoKLQkJY2FzZSBSX1NQQVJDX1VBNjQ6Ci0JCWNhc2UgUl9TUEFSQ19VQTE2OgotCQkgIGlmIChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKCghaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgIShoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCSAgICBza2lwX2l0ID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgaWYgKHNraXBfaXQpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0gICAgICAgICAgICAgICAgICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB0aGVzZSByZWxvY2F0aW9ucyBhcmUgY29waWVkCi0JIGludG8gdGhlIG91dHB1dCBmaWxlIHRvIGJlIHJlc29sdmVkIGF0IHJ1biB0aW1lLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSkKLQl7Ci0JICBzd2l0Y2ggKHJfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIFJfU1BBUkNfUEMxMDoKLQkgICAgY2FzZSBSX1NQQVJDX1BDMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ19QQ19ISDIyOgotCSAgICBjYXNlIFJfU1BBUkNfUENfSE0xMDoKLQkgICAgY2FzZSBSX1NQQVJDX1BDX0xNMjI6Ci0JICAgICAgaWYgKGggIT0gTlVMTAotCQkgICYmICFzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSkKLQkJYnJlYWs7Ci0JICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgY2FzZSBSX1NQQVJDX0RJU1A4OgotCSAgICBjYXNlIFJfU1BBUkNfRElTUDE2OgotCSAgICBjYXNlIFJfU1BBUkNfRElTUDMyOgotCSAgICBjYXNlIFJfU1BBUkNfV0RJU1AzMDoKLQkgICAgY2FzZSBSX1NQQVJDX1dESVNQMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ19XRElTUDE5OgotCSAgICBjYXNlIFJfU1BBUkNfV0RJU1AxNjoKLQkgICAgY2FzZSBSX1NQQVJDX0RJU1A2NDoKLQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQlicmVhazsKLQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICBjYXNlIFJfU1BBUkNfODoKLQkgICAgY2FzZSBSX1NQQVJDXzE2OgotCSAgICBjYXNlIFJfU1BBUkNfMzI6Ci0JICAgIGNhc2UgUl9TUEFSQ19ISTIyOgotCSAgICBjYXNlIFJfU1BBUkNfMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ18xMzoKLQkgICAgY2FzZSBSX1NQQVJDX0xPMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ19VQTMyOgotCSAgICBjYXNlIFJfU1BBUkNfMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ18xMToKLQkgICAgY2FzZSBSX1NQQVJDXzY0OgotCSAgICBjYXNlIFJfU1BBUkNfT0xPMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ19ISDIyOgotCSAgICBjYXNlIFJfU1BBUkNfSE0xMDoKLQkgICAgY2FzZSBSX1NQQVJDX0xNMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ183OgotCSAgICBjYXNlIFJfU1BBUkNfNToKLQkgICAgY2FzZSBSX1NQQVJDXzY6Ci0JICAgIGNhc2UgUl9TUEFSQ19ISVgyMjoKLQkgICAgY2FzZSBSX1NQQVJDX0xPWDEwOgotCSAgICBjYXNlIFJfU1BBUkNfSDQ0OgotCSAgICBjYXNlIFJfU1BBUkNfTTQ0OgotCSAgICBjYXNlIFJfU1BBUkNfTDQ0OgotCSAgICBjYXNlIFJfU1BBUkNfVUE2NDoKLQkgICAgY2FzZSBSX1NQQVJDX1VBMTY6Ci0JICAgICAgewotCQlFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0JCWJvb2xlYW4gc2tpcDsKLQotCQlpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgewotCQkgICAgY29uc3QgY2hhciAqbmFtZSA9Ci0JCSAgICAgIChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCSAgICAgICAoaW5wdXRfYmZkLAotCQkJZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJCWVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQotCQkgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkJJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZShpbnB1dF9iZmQsCi0JCQkJCQkJCWlucHV0X3NlY3Rpb24pLAotCQkJCQkgICBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICAgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgICAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOwotCQkgIH0KLQotCQlza2lwID0gZmFsc2U7Ci0KLQkJaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkJICBvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCQllbHNlCi0JCSAgewotCQkgICAgYmZkX3ZtYSBvZmY7Ci0KLQkJICAgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJCSAgIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCSAgICByZWwtPnJfb2Zmc2V0KSk7Ci0JCSAgICBpZiAob2ZmID09IE1JTlVTX09ORSkKLQkJICAgICAgc2tpcCA9IHRydWU7Ci0JCSAgICBvdXRyZWwucl9vZmZzZXQgPSBvZmY7Ci0JCSAgfQotCi0JCW91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JCS8qIE9wdGltaXplIHVuYWxpZ25lZCByZWxvYyB1c2FnZSBub3cgdGhhdCB3ZSBrbm93IHdoZXJlCi0JCSAgIGl0IGZpbmFsbHkgcmVzaWRlcy4gICovCi0JCXN3aXRjaCAocl90eXBlKQotCQkgIHsKLQkJICBjYXNlIFJfU1BBUkNfMTY6Ci0JCSAgICBpZiAob3V0cmVsLnJfb2Zmc2V0ICYgMSkgcl90eXBlID0gUl9TUEFSQ19VQTE2OwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBSX1NQQVJDX1VBMTY6Ci0JCSAgICBpZiAoIShvdXRyZWwucl9vZmZzZXQgJiAxKSkgcl90eXBlID0gUl9TUEFSQ18xNjsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgUl9TUEFSQ18zMjoKLQkJICAgIGlmIChvdXRyZWwucl9vZmZzZXQgJiAzKSByX3R5cGUgPSBSX1NQQVJDX1VBMzI7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIFJfU1BBUkNfVUEzMjoKLQkJICAgIGlmICghKG91dHJlbC5yX29mZnNldCAmIDMpKSByX3R5cGUgPSBSX1NQQVJDXzMyOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBSX1NQQVJDXzY0OgotCQkgICAgaWYgKG91dHJlbC5yX29mZnNldCAmIDcpIHJfdHlwZSA9IFJfU1BBUkNfVUE2NDsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgUl9TUEFSQ19VQTY0OgotCQkgICAgaWYgKCEob3V0cmVsLnJfb2Zmc2V0ICYgNykpIHJfdHlwZSA9IFJfU1BBUkNfNjQ7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0KLQkJaWYgKHNraXApCi0JCSAgbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQkJLyogaC0+ZHluaW5keCBtYXkgYmUgLTEgaWYgdGhlIHN5bWJvbCB3YXMgbWFya2VkIHRvCi0JCSAgIGJlY29tZSBsb2NhbC4gICovCi0JCWVsc2UgaWYgKGggIT0gTlVMTAotCQkJICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCSAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQkgIHsKLQkJICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCQkgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoaC0+ZHluaW5keCwgcl90eXBlKTsKLQkJICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKHJfdHlwZSA9PSBSX1NQQVJDXzY0KQotCQkgICAgICB7Ci0JCQlvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKLQkJCW91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWxvbmcgaW5keDsKLQotCQkJaWYgKGggPT0gTlVMTCkKLQkJCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJCQl8fCAoaC0+cm9vdC50eXBlCi0JCQkJCSAgICA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLQkJCSAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCQkgIH0KLQkJCWlmIChzZWMgIT0gTlVMTCAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0JCQkgIGluZHggPSAwOwotCQkJZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQotCQkJICB7Ci0JCQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBhc2VjdGlvbiAqb3NlYzsKLQotCQkJICAgIG9zZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCQkJICAgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChvc2VjKS0+ZHluaW5keDsKLQotCQkJICAgIC8qIEZJWE1FOiB3ZSByZWFsbHkgc2hvdWxkIGJlIGFibGUgdG8gbGluayBub24tcGljCi0JCQkgICAgICAgc2hhcmVkIGxpYnJhcmllcy4gICovCi0JCQkgICAgaWYgKGluZHggPT0gMCkKLQkJCSAgICAgIHsKLQkJCQlCRkRfRkFJTCAoKTsKLQkJCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCQkgIChfKCIlczogcHJvYmFibHkgY29tcGlsZWQgd2l0aG91dCAtZlBJQz8iKSwKLQkJCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLQkJCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkgICAgICB9Ci0JCQkgIH0KLQotCQkJb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoaW5keCwgcl90eXBlKTsKLQotCQkJLyogRm9yIG5vbi1SRUxBVElWRSBkeW5hbWljIHJlbG9jYXRpb25zLCB3ZSBrZWVwIHRoZQotCQkJICAgc2FtZSBzeW1ib2wsIGFuZCBzbyBnZW5lcmFsbHkgdGhlIHNhbWUgYWRkZW5kLiAgQnV0Ci0JCQkgICB3ZSBkbyBuZWVkIHRvIGFkanVzdCB0aG9zZSByZWxvY2F0aW9ucyByZWZlcmVuY2luZwotCQkJICAgc2VjdGlvbnMuICAqLwotCQkJb3V0cmVsLnJfYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQkJCWlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCSAgICAmJiBFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJCSAgb3V0cmVsLnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCtzeW0tPnN0X3ZhbHVlOwotCQkgICAgICB9Ci0JCSAgfQotCi0JCWJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCSAgICgoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikKLQkJCQkJICAgICBzcmVsb2MtPmNvbnRlbnRzKQotCQkJCQkgICAgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7Ci0JCSsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQotCQkvKiBUaGlzIHJlbG9jIHdpbGwgYmUgY29tcHV0ZWQgYXQgcnVudGltZSwgc28gdGhlcmUncyBubwotCQkgICBuZWVkIHRvIGRvIGFueXRoaW5nIG5vdywgdW5sZXNzIHRoaXMgaXMgYSBSRUxBVElWRQotCQkgICByZWxvYyBpbiBhbiB1bmFsbG9jYXRlZCBzZWN0aW9uLiAgKi8KLQkJaWYgKHNraXAKLQkJICAgIHx8IChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCQkgICAgfHwgRUxGNjRfUl9UWVBFIChvdXRyZWwucl9pbmZvKSAhPSBSX1NQQVJDX1JFTEFUSVZFKQotCQkgIGNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQljYXNlIFJfU1BBUkNfR09UMTA6Ci0JY2FzZSBSX1NQQVJDX0dPVDEzOgotCWNhc2UgUl9TUEFSQ19HT1QyMjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgZ2xvYmFsCi0JICAgICBvZmZzZXQgdGFibGUuICAqLwotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmID0gaC0+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+X3Jhd19zaXplIC8gUExUX0VOVFJZX1NJWkU7Ci0JICByZWxhLnJfb2Zmc2V0ID0gc3BhcmM2NF9lbGZfcGx0X3B0cl9vZmZzZXQgKGgtPnBsdC5vZmZzZXQsIG1heCk7Ci0JICByZWxhLnJfYWRkZW5kID0gLShzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0IChoLT5wbHQub2Zmc2V0KSArIDQpOwotCX0KLSAgICAgIHJlbGEucl9vZmZzZXQgKz0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbGEucl9pbmZvID0gRUxGNjRfUl9JTkZPIChoLT5keW5pbmR4LCBSX1NQQVJDX0pNUF9TTE9UKTsKLQotICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKLQkJCQkgICsgaC0+cGx0Lm9mZnNldCkpOwotCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGFzIGRlZmluZWQgaW4KLQkgICAgIHRoZSAucGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQl9Ci0gICAgfQotCi0gIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgR09ULiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBMaWtld2lzZSBpZgotCSB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwgYmVjYXVzZSBvZiBhIHZlcnNpb24gZmlsZS4KLQkgVGhlIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4KLQkgaW5pdGlhbGl6ZWQgaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24uICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCXsKLQkgIGFzZWN0aW9uICpzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICByZWxhLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9TUEFSQ19SRUxBVElWRSk7Ci0JICByZWxhLnJfYWRkZW5kID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIGgtPmdvdC5vZmZzZXQpOwotCSAgcmVsYS5yX2luZm8gPSBFTEY2NF9SX0lORk8gKGgtPmR5bmluZHgsIFJfU1BBUkNfR0xPQl9EQVQpOwotCSAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0JfQotCi0gICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyBzcmVsYS0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrc3JlbGEtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX0NPUFkpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbHMgbmVlZHMgYSBjb3B5IHJlbG9jLiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKLQkJCQkgICAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICByZWxhLnJfb2Zmc2V0ID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICByZWxhLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoaC0+ZHluaW5keCwgUl9TUEFSQ19DT1BZKTsKLSAgICAgIHJlbGEucl9hZGRlbmQgPSAwOwotICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKSBzLT5jb250ZW50cwotCQkJCSAgKyBzLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgLyogTWFyayBzb21lIHNwZWNpYWxseSBkZWZpbmVkIHN5bWJvbHMgYXMgYWJzb2x1dGUuICAqLwotICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNkeW47Ci0gIGFzZWN0aW9uICpzZ290OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBFbGY2NF9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2R5biAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZjY0X0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGY2NF9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGJvb2xlYW4gc2l6ZTsKLQotCSAgYmZkX2VsZjY0X3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGNhc2UgRFRfUExUR09UOiAgIG5hbWUgPSAiLnBsdCI7IHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUExUUkVMU1o6IG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IHRydWU7IGJyZWFrOwotCSAgICBjYXNlIERUX0pNUFJFTDogICBuYW1lID0gIi5yZWxhLnBsdCI7IHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6CSAgICAgIG5hbWUgPSBOVUxMOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChuYW1lICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgaWYgKHMgPT0gTlVMTCkKLQkJZHluLmRfdW4uZF92YWwgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghIHNpemUpCi0JCSAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplOwotCQkgICAgICBlbHNlCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mIHRoZSAucGx0IHNlY3Rpb24uICAqLwotICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA+IDApCi0JewotCSAgc3BhcmM2NF9lbGZfYnVpbGRfcGx0KG91dHB1dF9iZmQsIHNwbHQtPmNvbnRlbnRzLAotCQkJCXNwbHQtPl9yYXdfc2l6ZSAvIFBMVF9FTlRSWV9TSVpFKTsKLQl9Ci0KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9Ci0JUExUX0VOVFJZX1NJWkU7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgdG8gdGhlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIGR5bmFtaWMgc2VjdGlvbi4gICovCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBpZiAoc2dvdC0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBpZiAoc2R5biA9PSBOVUxMKQotCWJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dF82NCAob3V0cHV0X2JmZCwKLQkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgc2dvdC0+Y29udGVudHMpOwotICAgIH0KLQotICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA4OwotCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNkeW5zeW07Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgaW50IGM7Ci0KLSAgICAgIC8qIFNldCB1cCB0aGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgKi8KLQotICAgICAgc2R5bnN5bSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7Ci0gICAgICBCRkRfQVNTRVJUIChzZHluc3ltICE9IE5VTEwpOwotCi0gICAgICBzeW0uc3Rfc2l6ZSA9IDA7Ci0gICAgICBzeW0uc3RfbmFtZSA9IDA7Ci0gICAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKLSAgICAgIHN5bS5zdF9vdGhlciA9IDA7Ci0KLSAgICAgIGMgPSAwOwotICAgICAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgaW50IGluZHg7Ci0KLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgc3ltLnN0X3ZhbHVlID0gcy0+dm1hOwotCi0JICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgQkZEX0FTU0VSVCAoaW5keCA+IDApOwotCSAgc3ltLnN0X3NobmR4ID0gaW5keDsKLQotCSAgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCAob3V0cHV0X2JmZCwgJnN5bSwKLQkJCQkgICAgIChQVFIpICgoKEVsZjY0X0V4dGVybmFsX1N5bSAqKQotCQkJCQkgICAgIHNkeW5zeW0tPmNvbnRlbnRzKQotCQkJCQkgICAgKyBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCkpOwotCi0JICArK2M7Ci0JfQotCi0gICAgICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIG91dHB1dCAuZHluc3ltIHNlY3Rpb24gdG8gdGhlCi0gICAgICAgICBpbmRleCBvZiB0aGUgZmlyc3QgZ2xvYmFsIHN5bWJvbC4gICovCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZHluc3ltLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2luZm8gPSBjICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCB0aGUgZV9mbGFncyBmaWVsZC4gKi8KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBib29sZWFuIGVycm9yOwotICBmbGFnd29yZCBuZXdfZmxhZ3MsIG9sZF9mbGFnczsKLSAgaW50IG5ld19tbSwgb2xkX21tOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuZXdfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb2xkX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0KLSAgaWYgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkpICAgLyogRmlyc3QgY2FsbCwgbm8gZmxhZ3Mgc2V0ICovCi0gICAgewotICAgICAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gbmV3X2ZsYWdzOwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAKLSAgZWxzZSBpZiAobmV3X2ZsYWdzID09IG9sZF9mbGFncykgICAgICAvKiBDb21wYXRpYmxlIGZsYWdzIGFyZSBvayAqLwotICAgIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNvbXBhdGlibGUgZmxhZ3MgKi8KLSAgICB7Ci0gICAgICBlcnJvciA9IGZhbHNlOwotICAKLSAgICAgIG9sZF9mbGFncyB8PSAobmV3X2ZsYWdzICYgKEVGX1NQQVJDX1NVTl9VUzF8RUZfU1BBUkNfSEFMX1IxKSk7Ci0gICAgICBuZXdfZmxhZ3MgfD0gKG9sZF9mbGFncyAmIChFRl9TUEFSQ19TVU5fVVMxfEVGX1NQQVJDX0hBTF9SMSkpOwotICAgICAgaWYgKChvbGRfZmxhZ3MgJiAoRUZfU1BBUkNfU1VOX1VTMXxFRl9TUEFSQ19IQUxfUjEpKSA9PQotICAgICAgICAgICAoRUZfU1BBUkNfU1VOX1VTMXxFRl9TUEFSQ19IQUxfUjEpKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAgKF8oIiVzOiBsaW5raW5nIFVsdHJhU1BBUkMgc3BlY2lmaWMgd2l0aCBIQUwgc3BlY2lmaWMgY29kZSIpLAotICAgICAgICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIC8qIENob29zZSB0aGUgbW9zdCByZXN0cmljdGl2ZSBtZW1vcnkgb3JkZXJpbmcgKi8KLSAgICAgIG9sZF9tbSA9IChvbGRfZmxhZ3MgJiBFRl9TUEFSQ1Y5X01NKTsKLSAgICAgIG5ld19tbSA9IChuZXdfZmxhZ3MgJiBFRl9TUEFSQ1Y5X01NKTsKLSAgICAgIG9sZF9mbGFncyAmPSB+RUZfU1BBUkNWOV9NTTsKLSAgICAgIG5ld19mbGFncyAmPSB+RUZfU1BBUkNWOV9NTTsKLSAgICAgIGlmIChuZXdfbW0gPCBvbGRfbW0pIG9sZF9tbSA9IG5ld19tbTsKLSAgICAgIG9sZF9mbGFncyB8PSBvbGRfbW07Ci0gICAgICBuZXdfZmxhZ3MgfD0gb2xkX21tOwotCi0gICAgICAvKiBXYXJuIGFib3V0IGFueSBvdGhlciBtaXNtYXRjaGVzICovCi0gICAgICBpZiAobmV3X2ZsYWdzICE9IG9sZF9mbGFncykKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgIChfKCIlczogdXNlcyBkaWZmZXJlbnQgZV9mbGFncyAoMHglbHgpIGZpZWxkcyB0aGFuIHByZXZpb3VzIG1vZHVsZXMgKDB4JWx4KSIpLAotICAgICAgICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCAobG9uZyluZXdfZmxhZ3MsIChsb25nKW9sZF9mbGFncyk7Ci0gICAgICAgIH0KLQotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBvbGRfZmxhZ3M7Ci0KLSAgICAgIGlmIChlcnJvcikKLSAgICAgICAgewotICAgICAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIgZm9yIGEgU1BBUkM2NCBFTEYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBsb25nIG1hY2ggPSBiZmRfbWFjaF9zcGFyY192OTsKLSAgCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1NQQVJDX1NVTl9VUzEpCi0gICAgbWFjaCA9IGJmZF9tYWNoX3NwYXJjX3Y5YTsKLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLCBtYWNoKTsKLX0KLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQliZmRfZWxmNjRfc3BhcmNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkiZWxmNjQtc3BhcmMiCi0jZGVmaW5lIEVMRl9BUkNICWJmZF9hcmNoX3NwYXJjCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRSAweDEwMDAwMAotCi0vKiBUaGlzIGlzIHRoZSBvZmZpY2lhbCBBQkkgdmFsdWUuICAqLwotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFIEVNX1NQQVJDVjkKLQotLyogVGhpcyBpcyB0aGUgdmFsdWUgdGhhdCB3ZSB1c2VkIGJlZm9yZSB0aGUgQUJJIHdhcyByZWxlYXNlZC4gICovCi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDEgRU1fT0xEX1NQQVJDVjkKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byBcCi0gIHNwYXJjNjRfZWxmX2luZm9fdG9faG93dG8KLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gIHNwYXJjNjRfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotICBfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgXAotICBzcGFyYzY0X2VsZl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFwKLSAgc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyBcCi0gIHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uIFwKLSAgc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wgXAotICBzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgXAotICBzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gIHNwYXJjNjRfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLQotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcCBcCi0gIHNwYXJjNjRfZWxmX29iamVjdF9wCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0IDAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5IDAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltIDEKLQotLyogU2VjdGlvbiA1LjIuNCBvZiB0aGUgQUJJIHNwZWNpZmllcyBhIDI1Ni1ieXRlIGJvdW5kYXJ5IGZvciB0aGUgdGFibGUuICAqLwotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50IDgKLQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUgOAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUgUExUX0hFQURFUl9TSVpFCi0KLSNpbmNsdWRlICJlbGY2NC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC5jIGIvYmZkL2VsZjY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZmI1YjUuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiBFTEYgNjQtYml0IGV4ZWN1dGFibGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUJCTY0Ci0KLSNpbmNsdWRlICJlbGZjb2RlLmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmYXJtLW5hYmkuYyBiL2JmZC9lbGZhcm0tbmFiaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTUyZTc0Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGZhcm0tbmFiaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjcwICswLDAgQEAKLS8qIDMyLWJpdCBFTEYgc3VwcG9ydCBmb3IgQVJNIG5ldyBhYmkgb3B0aW9uLgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImVsZi9hcm0uaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLSNpZm5kZWYgTlVNX0VMRU0KLSNkZWZpbmUgTlVNX0VMRU0oYSkgIChzaXplb2YgKGEpIC8gKHNpemVvZiAoYSlbMF0pKQotI2VuZGlmCi0KLSNkZWZpbmUgVVNFX1JFTAotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgICAgICAgICAgICAgYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgICAgICAgICAgICAiZWxmMzItbGl0dGxlYXJtIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICAgICAgICAgIGJmZF9lbGYzMl9iaWdhcm1fdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICAgICAgICAgICAgImVsZjMyLWJpZ2FybSIKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsICAgICAgICAgICBlbGYzMl9hcm1faW5mb190b19ob3d0b19yZWwgCi0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiBlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICogYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBObyByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fUEMyNCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9QQzI0IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDBmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IGFic29sdXRlICovCi0gIEhPV1RPIChSX0FSTV9BQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlMzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIHN0YW5kYXJkIDMyYml0IHBjLXJlbGF0aXZlIHJlbG9jICovCi0gIEhPV1RPIChSX0FSTV9SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1JFTDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX1BDMTMsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9QQzEzIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgIC8qIDE2IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMTIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMTIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDhmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA4ZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX0FCUzUsCS8qIHR5cGUgKi8KLQkgNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDUsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9BQlM1IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdlMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3ZTAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FCUzgiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fU0JSRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fU0JSRUwzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX1BDMjIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIzLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fUEMyMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDdmZjA3ZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDA3ZmYwN2ZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1RITV9QQzgsCSAgICAgICAgLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDOCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX0FNUF9WQ0FMTDksCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FNUF9WQ0FMTDkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9TV0kyNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9TV0kyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9USE1fU1dJOCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1NXSTgiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGVzZSBuZXh0IHR3byByZWxvY3MgYXJlIGRlZmluZWQsIGJ1dCBJIGRvIG5vdCBrbm93IHdoYXQgdGhleSBkby4gICovCi0gIAotICBIT1dUTyAoUl9BUk1fWFBDMjUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fWFBDMjUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX1hQQzIyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1hQQzIyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIFRoZXNlIG5leHQgdGhyZWUgcmVsb2NzIGFyZSBub3QgZGVmaW5lZCwgYnV0IHdlIG5lZWQgdG8gZmlsbCB0aGUgc3BhY2UuICAqLwotCi0gIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV91bmtub3duXzE3IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV91bmtub3duXzE4IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV91bmtub3duXzE5IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlbG9jcyB1c2VkIGluIEFSTSBMaW51eCAqLwotICAKLSAgSE9XVE8gKFJfQVJNX0NPUFksCQkvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fQ09QWSIsCQkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX0dMT0JfREFULAkvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fR0xPQl9EQVQiLAkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX0pVTVBfU0xPVCwJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0pVTVBfU0xPVCIsCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgICAgICAgIAotICBIT1dUTyAoUl9BUk1fUkVMQVRJVkUsCS8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9SRUxBVElWRSIsCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgICAgICAgIAotICBIT1dUTyAoUl9BUk1fR09UT0ZGLAkJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dPVE9GRiIsCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgICAgICAgIAotICBIT1dUTyAoUl9BUk1fR09UUEMsCQkvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fR09UUEMiLAkJLyogbmFtZSAqLwotICAgICAgICAgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0gICAgICAgICB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgICAgICAgIAotICBIT1dUTyAoUl9BUk1fR09UMzIsCQkvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dPVDMyIiwJCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX1BMVDMyLAkJLyogdHlwZSAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMjYsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX1BMVDMyIiwJCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweDAwZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4MDBmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBFbmQgb2YgcmVsb2NzIHVzZWQgaW4gQVJNIExpbnV4ICovIAotCi0gIEhPV1RPIChSX0FSTV9SUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1JSRUwzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fUkFCUzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SQUJTMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JQQzI0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SUEMyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JCQVNFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SQkFTRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV92dGluaGVyaXRfaG93dG8gPQotICBIT1dUTyAoUl9BUk1fR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpOyAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX3Z0ZW50cnlfaG93dG8gPQotICBIT1dUTyAoUl9BUk1fR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9HTlVfVlRFTlRSWSIsICAgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKTsgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTIgYml0IHBjIHJlbGF0aXZlICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9hcm1fdGhtX3BjMTFfaG93dG8gPQotICBIT1dUTyAoUl9BUk1fVEhNX1BDMTEsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDExLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDMTEiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwN2ZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpOwkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBwYyByZWxhdGl2ZSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX3RobV9wYzlfaG93dG8gPQotICBIT1dUTyAoUl9BUk1fVEhNX1BDOSwJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fUEM5IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKTsJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotIAotc3RhdGljIHZvaWQKLWVsZjMyX2FybV9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiBiZmRfcmVsb2M7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqIGVsZl9yZWxvYzsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLSAgCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZWxmX3JlbG9jLT5yX2luZm8pOwotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfQVJNX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBiZmRfcmVsb2MtPmhvd3RvID0gJiBlbGYzMl9hcm1fdnRpbmhlcml0X2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfQVJNX0dOVV9WVEVOVFJZOgotICAgICAgYmZkX3JlbG9jLT5ob3d0byA9ICYgZWxmMzJfYXJtX3Z0ZW50cnlfaG93dG87Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9BUk1fVEhNX1BDMTE6Ci0gICAgICBiZmRfcmVsb2MtPmhvd3RvID0gJiBlbGYzMl9hcm1fdGhtX3BjMTFfaG93dG87Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9BUk1fVEhNX1BDOToKLSAgICAgIGJmZF9yZWxvYy0+aG93dG8gPSAmIGVsZjMyX2FybV90aG1fcGM5X2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHJfdHlwZSA+PSBOVU1fRUxFTSAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKSkKLQliZmRfcmVsb2MtPmhvd3RvID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgYmZkX3JlbG9jLT5ob3d0byA9ICYgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0gIAotc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXAKLSAgewotICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgYmZkX3JlbG9jX3ZhbDsKLSAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgIGVsZl9yZWxvY192YWw7Ci0gIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxmMzJfYXJtX3JlbG9jX21hcCBlbGYzMl9hcm1fcmVsb2NfbWFwW10gPQotewotICB7QkZEX1JFTE9DX05PTkUsICAgICAgICAgICAgICAgICBSX0FSTV9OT05FfSwKLSAge0JGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILCAgICAgUl9BUk1fUEMyNH0sCi0gIHtCRkRfUkVMT0NfMzIsICAgICAgICAgICAgICAgICAgIFJfQVJNX0FCUzMyfSwKLSAge0JGRF9SRUxPQ18zMl9QQ1JFTCwgICAgICAgICAgICAgUl9BUk1fUkVMMzJ9LAotICB7QkZEX1JFTE9DXzgsICAgICAgICAgICAgICAgICAgICBSX0FSTV9BQlM4fSwKLSAge0JGRF9SRUxPQ18xNiwgICAgICAgICAgICAgICAgICAgUl9BUk1fQUJTMTZ9LAotICB7QkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NLCAgICAgICBSX0FSTV9BQlMxMn0sCi0gIHtCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCwgICAgIFJfQVJNX1RITV9BQlM1fSwKLSAge0JGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMywgUl9BUk1fVEhNX1BDMjJ9LAotICB7QkZEX1JFTE9DX0FSTV9DT1BZLCAgICAgICAgICAgICBSX0FSTV9DT1BZfSwKLSAge0JGRF9SRUxPQ19BUk1fR0xPQl9EQVQsICAgICAgICAgUl9BUk1fR0xPQl9EQVR9LAotICB7QkZEX1JFTE9DX0FSTV9KVU1QX1NMT1QsICAgICAgICBSX0FSTV9KVU1QX1NMT1R9LAotICB7QkZEX1JFTE9DX0FSTV9SRUxBVElWRSwgICAgICAgICBSX0FSTV9SRUxBVElWRX0sCi0gIHtCRkRfUkVMT0NfQVJNX0dPVE9GRiwgICAgICAgICAgIFJfQVJNX0dPVE9GRn0sCi0gIHtCRkRfUkVMT0NfQVJNX0dPVFBDLCAgICAgICAgICAgIFJfQVJNX0dPVFBDfSwKLSAge0JGRF9SRUxPQ19BUk1fR09UMzIsICAgICAgICAgICAgUl9BUk1fR09UMzJ9LAotICB7QkZEX1JFTE9DX0FSTV9QTFQzMiwgICAgICAgICAgICBSX0FSTV9QTFQzMn0KLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWVsZjMyX2FybV9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIHJldHVybiAmIGVsZjMyX2FybV92dGluaGVyaXRfaG93dG87Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICByZXR1cm4gJiBlbGYzMl9hcm1fdnRlbnRyeV9ob3d0bzsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyOgotICAgICAgcmV0dXJuICYgZWxmMzJfYXJtX3RobV9wYzExX2hvd3RvOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOToKLSAgICAgIHJldHVybiAmIGVsZjMyX2FybV90aG1fcGM5X2hvd3RvOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRUxFTSAoZWxmMzJfYXJtX3JlbG9jX21hcCk7IGkgKyspCi0JaWYgKGVsZjMyX2FybV9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCSAgcmV0dXJuICYgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW2VsZjMyX2FybV9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgICAKLSAgICAgIHJldHVybiBOVUxMOwotICAgfQotfQotCi0jaW5jbHVkZSAiZWxmMzItYXJtLmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmYXJtLW9hYmkuYyBiL2JmZC9lbGZhcm0tb2FiaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjE5YjkyLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGZhcm0tb2FiaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLS8qIDMyLWJpdCBFTEYgc3VwcG9ydCBmb3IgQVJNIG9sZCBhYmkgb3B0aW9uLgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImVsZi9hcm0tb2FiaS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotI2RlZmluZSBVU0VfUkVMQQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgICAgICAgICAgICAgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAgICAgICAgICAgICJlbGYzMi1saXR0bGVhcm0tb2FiaSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgICAgICAgICAgICBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICAgICAgICAgICAgImVsZjMyLWJpZ2FybS1vYWJpIgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvICAgICAgICAgICAgICAgZWxmMzJfYXJtX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsICAgICAgICAgICAwCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogTm8gcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9QQzI0LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9QQzI0IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDBmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IGFic29sdXRlICovCi0gIEhPV1RPIChSX0FSTV9BQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBzdGFuZGFyZCAzMmJpdCBwYy1yZWxhdGl2ZSByZWxvYyAqLwotICBIT1dUTyAoUl9BUk1fUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlM4IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgIC8qIDE2IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FCUzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxMiBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX0FCUzEyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlMxMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwOGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDhmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9USE1fQUJTNSwJLyogdHlwZSAqLwotCSA2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9BQlM1IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdlMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3ZTAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX1BDMjIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIzLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDMjIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZmYwN2ZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmMDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9TQlJFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fU0JSRUwzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fQU1QX1ZDQUxMOSwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FNUF9WQ0FMTDkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBwYyByZWxhdGl2ZSAqLwotICBIT1dUTyAoUl9BUk1fVEhNX1BDMTEsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDExLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDMTEiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwN2ZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBwYyByZWxhdGl2ZSAqLwotICBIT1dUTyAoUl9BUk1fVEhNX1BDOSwJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fUEM5IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9BUk1fR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9BUk1fR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9HTlVfVlRFTlRSWSIsICAgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gCi0KLSAgSE9XVE8gKFJfQVJNX1JSRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1JSRUwzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fUkFCUzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkFCUzMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9SUEMyNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1JQQzI0IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fUkJBU0UsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SQkFTRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLXN0YXRpYyB2b2lkCi1lbGYzMl9hcm1faW5mb190b19ob3d0byAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICplbGZfcmVsb2M7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChlbGZfcmVsb2MtPnJfaW5mbyk7Ci0gIC8qIGZpeG1lOiBuZWVkIHJhbmdlIHRlc3QgKi8KLSAgLyogQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9FTEYzMl9BUk1fTUFYKTsgKi8KLSAgYmZkX3JlbG9jLT5ob3d0byA9ICZlbGYzMl9hcm1faG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXAKLSAgewotICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICAgIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLSAgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwIGVsZjMyX2FybV9yZWxvY19tYXBbXSA9Ci17Ci0gIHtCRkRfUkVMT0NfTk9ORSwgUl9BUk1fTk9ORSx9LAotICB7QkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gsIFJfQVJNX1BDMjQsfSwKLSAge0JGRF9SRUxPQ18zMiwgUl9BUk1fQUJTMzIsfSwKLSAge0JGRF9SRUxPQ18zMl9QQ1JFTCwgUl9BUk1fUkVMMzIsfSwKLSAge0JGRF9SRUxPQ184LCBSX0FSTV9BQlM4LH0sCi0gIHtCRkRfUkVMT0NfMTYsIFJfQVJNX0FCUzE2LH0sCi0gIHtCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU0sIFJfQVJNX0FCUzEyLH0sCi0gIHtCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCwgUl9BUk1fVEhNX0FCUzUsfSwKLSAge0JGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMywgUl9BUk1fVEhNX1BDMjIsfSwKLSAge0JGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgUl9BUk1fR05VX1ZUSU5IRVJJVCB9LAotICB7QkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgUl9BUk1fR05VX1ZURU5UUlkgfSwKLSAge0JGRF9SRUxPQ19OT05FLCBSX0FSTV9TQlJFTDMyLH0sCi0gIHtCRkRfUkVMT0NfTk9ORSwgUl9BUk1fQU1QX1ZDQUxMOSx9LAotICB7QkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyLCBSX0FSTV9USE1fUEMxMSx9LAotICB7QkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDksIFJfQVJNX1RITV9QQzksfQotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKiBhYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgaSA8IHNpemVvZiAoZWxmMzJfYXJtX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKGVsZjMyX2FybV9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmIGVsZjMyX2FybV9ob3d0b190YWJsZVtlbGYzMl9hcm1fcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotI2RlZmluZSBiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBcCi0JYmZkX2VsZjMyX2FybV9vYWJpX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotI2RlZmluZSBiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyBcCi0JYmZkX2VsZjMyX2FybV9vYWJpX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotI2RlZmluZSBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gXAotCWJmZF9lbGYzMl9hcm1fb2FiaV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0KLSNpbmNsdWRlICJlbGYzMi1hcm0uaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGZjb2RlLmggYi9iZmQvZWxmY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmY2NDg4Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGZjb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUyICswLDAgQEAKLS8qIEVMRiBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0LCBmcm9tIGluZm9ybWF0aW9uIHB1Ymxpc2hlZAotICAgaW4gIlVOSVggU3lzdGVtIFYgUmVsZWFzZSA0LCBQcm9ncmFtbWVycyBHdWlkZTogQU5TSSBDIGFuZAotICAgUHJvZ3JhbW1pbmcgU3VwcG9ydCBUb29scyIuICBTdWZmaWNpZW50IHN1cHBvcnQgZm9yIGdkYi4KLQotICAgUmV3cml0dGVuIGJ5IE1hcmsgRWljaGluIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24KLSAgIHB1Ymxpc2hlZCBpbiAiU3lzdGVtIFYgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSIsIGNoYXB0ZXJzIDQKLSAgIGFuZCA1LCBhcyB3ZWxsIGFzIHRoZSB2YXJpb3VzICJQcm9jZXNzb3IgU3VwcGxlbWVudCIgZG9jdW1lbnRzCi0gICBkZXJpdmVkIGZyb20gaXQuIEFkZGVkIHN1cHBvcnQgZm9yIGFzc2VtYmxlciBhbmQgb3RoZXIgb2JqZWN0IGZpbGUKLSAgIHV0aWxpdGllcy4gIEZ1cnRoZXIgd29yayBkb25lIGJ5IEtlbiBSYWVidXJuIChDeWdudXMgU3VwcG9ydCksIE1pY2hhZWwKLSAgIE1laXNzbmVyIChPcGVuIFNvZnR3YXJlIEZvdW5kYXRpb24pLCBhbmQgUGV0ZXIgSG9vZ2VuYm9vbSAoVW5pdmVyc2l0eQotICAgb2YgVXRhaCkgdG8gZmluaXNoIGFuZCBleHRlbmQgdGhpcy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBQcm9ibGVtcyBhbmQgb3RoZXIgaXNzdWVzIHRvIHJlc29sdmUuCi0KLSAgICgxKQlCRkQgZXhwZWN0cyB0aGVyZSB0byBiZSBzb21lIGZpeGVkIG51bWJlciBvZiAic2VjdGlvbnMiIGluCi0gICAgICAgIHRoZSBvYmplY3QgZmlsZS4gIEkuRS4gdGhlcmUgaXMgYSAic2VjdGlvbl9jb3VudCIgdmFyaWFibGUgaW4gdGhlCi0JYmZkIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyB0aGUgbnVtYmVyIG9mIHNlY3Rpb25zLiAgSG93ZXZlciwgRUxGCi0Jc3VwcG9ydHMgbXVsdGlwbGUgInZpZXdzIiBvZiBhIGZpbGUuICBJbiBwYXJ0aWN1bGFyLCB3aXRoIGN1cnJlbnQKLQlpbXBsZW1lbnRhdGlvbnMsIGV4ZWN1dGFibGUgZmlsZXMgdHlwaWNhbGx5IGhhdmUgdHdvIHRhYmxlcywgYQotCXByb2dyYW0gaGVhZGVyIHRhYmxlIGFuZCBhIHNlY3Rpb24gaGVhZGVyIHRhYmxlLCBib3RoIG9mIHdoaWNoCi0JcGFydGl0aW9uIHRoZSBleGVjdXRhYmxlLgotCi0JSW4gRUxGLXNwZWFrLCB0aGUgImxpbmtpbmcgdmlldyIgb2YgdGhlIGZpbGUgdXNlcyB0aGUgc2VjdGlvbiBoZWFkZXIKLQl0YWJsZSB0byBhY2Nlc3MgInNlY3Rpb25zIiB3aXRoaW4gdGhlIGZpbGUsIGFuZCB0aGUgImV4ZWN1dGlvbiB2aWV3IgotCXVzZXMgdGhlIHByb2dyYW0gaGVhZGVyIHRhYmxlIHRvIGFjY2VzcyAic2VnbWVudHMiIHdpdGhpbiB0aGUgZmlsZS4KLQkiU2VnbWVudHMiIHR5cGljYWxseSBtYXkgY29udGFpbiBhbGwgdGhlIGRhdGEgZnJvbSBvbmUgb3IgbW9yZQotCSJzZWN0aW9ucyIuCi0KLQlOb3RlIHRoYXQgdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGlzIG9wdGlvbmFsIGluIEVMRiBleGVjdXRhYmxlcywKLQlidXQgaXQgaXMgdGhpcyBpbmZvcm1hdGlvbiB0aGF0IGlzIG1vc3QgdXNlZnVsIHRvIGdkYi4gIElmIHRoZQotCXNlY3Rpb24gaGVhZGVyIHRhYmxlIGlzIG1pc3NpbmcsIHRoZW4gZ2RiIHNob3VsZCBwcm9iYWJseSB0cnkKLQl0byBtYWtlIGRvIHdpdGggdGhlIHByb2dyYW0gaGVhZGVyIHRhYmxlLiAgKEZJWE1FKQotCi0gICAoMikgIFRoZSBjb2RlIGluIHRoaXMgZmlsZSBpcyBjb21waWxlZCB0d2ljZSwgb25jZSBpbiAzMi1iaXQgbW9kZSBhbmQKLQlvbmNlIGluIDY0LWJpdCBtb2RlLiAgTW9yZSBvZiBpdCBzaG91bGQgYmUgbWFkZSBzaXplLWluZGVwZW5kZW50Ci0JYW5kIG1vdmVkIGludG8gZWxmLmMuCi0KLSAgICgzKQlFTEYgc2VjdGlvbiBzeW1ib2xzIGFyZSBoYW5kbGVkIHJhdGhlciBzbG9wcGlseSBub3cuICBUaGlzIHNob3VsZAotCWJlIGNsZWFuZWQgdXAsIGFuZCBFTEYgc2VjdGlvbiBzeW1ib2xzIHJlY29uY2lsZWQgd2l0aCBCRkQgc2VjdGlvbgotCXN5bWJvbHMuCi0KLSAgICg0KSAgV2UgbmVlZCBhIHB1Ymxpc2hlZCBzcGVjIGZvciA2NC1iaXQgRUxGLiAgV2UndmUgZ290IHNvbWUgc3R1ZmYgaGVyZQotCXRoYXQgd2UncmUgdXNpbmcgZm9yIFNQQVJDIFY5IDY0LWJpdCBjaGlwcywgYnV0IGRvbid0IGFzc3VtZSB0aGF0Ci0JaXQncyBjYXN0IGluIHN0b25lLgotICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi0vKiBSZW5hbWluZyBzdHJ1Y3R1cmVzLCB0eXBlZGVmcywgbWFjcm9zIGFuZCBmdW5jdGlvbnMgdG8gYmUgc2l6ZS1zcGVjaWZpYy4gICovCi0jZGVmaW5lIEVsZl9FeHRlcm5hbF9FaGRyCU5BTUUoRWxmLEV4dGVybmFsX0VoZHIpCi0jZGVmaW5lIEVsZl9FeHRlcm5hbF9TeW0JTkFNRShFbGYsRXh0ZXJuYWxfU3ltKQotI2RlZmluZSBFbGZfRXh0ZXJuYWxfU2hkcglOQU1FKEVsZixFeHRlcm5hbF9TaGRyKQotI2RlZmluZSBFbGZfRXh0ZXJuYWxfUGhkcglOQU1FKEVsZixFeHRlcm5hbF9QaGRyKQotI2RlZmluZSBFbGZfRXh0ZXJuYWxfUmVsCU5BTUUoRWxmLEV4dGVybmFsX1JlbCkKLSNkZWZpbmUgRWxmX0V4dGVybmFsX1JlbGEJTkFNRShFbGYsRXh0ZXJuYWxfUmVsYSkKLSNkZWZpbmUgRWxmX0V4dGVybmFsX0R5bglOQU1FKEVsZixFeHRlcm5hbF9EeW4pCi0KLSNkZWZpbmUgZWxmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQJTkFNRShiZmRfZWxmLGNvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpCi0jZGVmaW5lIGVsZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwJTkFNRShiZmRfZWxmLGNvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkKLSNkZWZpbmUgZWxmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBcCi0gIE5BTUUoYmZkX2VsZixjb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApCi0jZGVmaW5lIGVsZl9vYmplY3RfcAkJCU5BTUUoYmZkX2VsZixvYmplY3RfcCkKLSNkZWZpbmUgZWxmX2NvcmVfZmlsZV9wCQkJTkFNRShiZmRfZWxmLGNvcmVfZmlsZV9wKQotI2RlZmluZSBlbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAlOQU1FKGJmZF9lbGYsZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkKLSNkZWZpbmUgZWxmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBcCi0gIE5BTUUoYmZkX2VsZixnZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpCi0jZGVmaW5lIGVsZl9zd2FwX3JlbG9jX2luCQlOQU1FKGJmZF9lbGYsc3dhcF9yZWxvY19pbikKLSNkZWZpbmUgZWxmX3N3YXBfcmVsb2NhX2luCQlOQU1FKGJmZF9lbGYsc3dhcF9yZWxvY2FfaW4pCi0jZGVmaW5lIGVsZl9zd2FwX3JlbG9jX291dAkJTkFNRShiZmRfZWxmLHN3YXBfcmVsb2Nfb3V0KQotI2RlZmluZSBlbGZfc3dhcF9yZWxvY2Ffb3V0CQlOQU1FKGJmZF9lbGYsc3dhcF9yZWxvY2Ffb3V0KQotI2RlZmluZSBlbGZfc3dhcF9zeW1ib2xfaW4JCU5BTUUoYmZkX2VsZixzd2FwX3N5bWJvbF9pbikKLSNkZWZpbmUgZWxmX3N3YXBfc3ltYm9sX291dAkJTkFNRShiZmRfZWxmLHN3YXBfc3ltYm9sX291dCkKLSNkZWZpbmUgZWxmX3N3YXBfcGhkcl9pbgkJTkFNRShiZmRfZWxmLHN3YXBfcGhkcl9pbikKLSNkZWZpbmUgZWxmX3N3YXBfcGhkcl9vdXQJCU5BTUUoYmZkX2VsZixzd2FwX3BoZHJfb3V0KQotI2RlZmluZSBlbGZfc3dhcF9keW5faW4JCQlOQU1FKGJmZF9lbGYsc3dhcF9keW5faW4pCi0jZGVmaW5lIGVsZl9zd2FwX2R5bl9vdXQJCU5BTUUoYmZkX2VsZixzd2FwX2R5bl9vdXQpCi0jZGVmaW5lIGVsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQJTkFNRShiZmRfZWxmLGdldF9yZWxvY191cHBlcl9ib3VuZCkKLSNkZWZpbmUgZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYwkJTkFNRShiZmRfZWxmLGNhbm9uaWNhbGl6ZV9yZWxvYykKLSNkZWZpbmUgZWxmX3NsdXJwX3N5bWJvbF90YWJsZQkJTkFNRShiZmRfZWxmLHNsdXJwX3N5bWJvbF90YWJsZSkKLSNkZWZpbmUgZWxmX2dldF9zeW10YWIJCQlOQU1FKGJmZF9lbGYsZ2V0X3N5bXRhYikKLSNkZWZpbmUgZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBcCi0gIE5BTUUoYmZkX2VsZixjYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpCi0jZGVmaW5lIGVsZl9tYWtlX2VtcHR5X3N5bWJvbAkJTkFNRShiZmRfZWxmLG1ha2VfZW1wdHlfc3ltYm9sKQotI2RlZmluZSBlbGZfZ2V0X3N5bWJvbF9pbmZvCQlOQU1FKGJmZF9lbGYsZ2V0X3N5bWJvbF9pbmZvKQotI2RlZmluZSBlbGZfZ2V0X2xpbmVubwkJCU5BTUUoYmZkX2VsZixnZXRfbGluZW5vKQotI2RlZmluZSBlbGZfc2V0X2FyY2hfbWFjaAkJTkFNRShiZmRfZWxmLHNldF9hcmNoX21hY2gpCi0jZGVmaW5lIGVsZl9maW5kX25lYXJlc3RfbGluZQkJTkFNRShiZmRfZWxmLGZpbmRfbmVhcmVzdF9saW5lKQotI2RlZmluZSBlbGZfc2l6ZW9mX2hlYWRlcnMJCU5BTUUoYmZkX2VsZixzaXplb2ZfaGVhZGVycykKLSNkZWZpbmUgZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzCU5BTUUoYmZkX2VsZixzZXRfc2VjdGlvbl9jb250ZW50cykKLSNkZWZpbmUgZWxmX25vX2luZm9fdG9faG93dG8JCU5BTUUoYmZkX2VsZixub19pbmZvX3RvX2hvd3RvKQotI2RlZmluZSBlbGZfbm9faW5mb190b19ob3d0b19yZWwJTkFNRShiZmRfZWxmLG5vX2luZm9fdG9faG93dG9fcmVsKQotI2RlZmluZSBlbGZfZmluZF9zZWN0aW9uCQlOQU1FKGJmZF9lbGYsZmluZF9zZWN0aW9uKQotI2RlZmluZSBlbGZfYmZkX2xpbmtfYWRkX3N5bWJvbHMJTkFNRShiZmRfZWxmLGJmZF9saW5rX2FkZF9zeW1ib2xzKQotI2RlZmluZSBlbGZfYWRkX2R5bmFtaWNfZW50cnkJCU5BTUUoYmZkX2VsZixhZGRfZHluYW1pY19lbnRyeSkKLSNkZWZpbmUgZWxmX3dyaXRlX3NoZHJzX2FuZF9laGRyCU5BTUUoYmZkX2VsZix3cml0ZV9zaGRyc19hbmRfZWhkcikKLSNkZWZpbmUgZWxmX3dyaXRlX291dF9waGRycwkJTkFNRShiZmRfZWxmLHdyaXRlX291dF9waGRycykKLSNkZWZpbmUgZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotICBOQU1FKGJmZF9lbGYsbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucykKLSNkZWZpbmUgZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sICBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmZkX2ZpbmFsX2xpbmsJCU5BTUUoYmZkX2VsZixiZmRfZmluYWxfbGluaykKLSNkZWZpbmUgZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIE5BTUUoYmZkX2VsZixjcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbikKLSNkZWZpbmUgZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIE5BTUUoYmZkX2VsZixmaW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbikKLSNkZWZpbmUgZWxmX2djX3NlY3Rpb25zCQkJTkFNRShfYmZkX2VsZixnY19zZWN0aW9ucykKLSNkZWZpbmUgZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyBcCi0gIE5BTUUoX2JmZF9lbGYsZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzKQotI2RlZmluZSBlbGZfZ2NfY29tbW9uX2ZpbmFsX2xpbmsJTkFNRShfYmZkX2VsZixnY19jb21tb25fZmluYWxfbGluaykKLSNkZWZpbmUgZWxmX2djX3JlY29yZF92dGluaGVyaXQJCU5BTUUoX2JmZF9lbGYsZ2NfcmVjb3JkX3Z0aW5oZXJpdCkKLSNkZWZpbmUgZWxmX2djX3JlY29yZF92dGVudHJ5CQlOQU1FKF9iZmRfZWxmLGdjX3JlY29yZF92dGVudHJ5KQotCi0jaWYgQVJDSF9TSVpFID09IDY0Ci0jZGVmaW5lIEVMRl9SX0lORk8oWCxZKQlFTEY2NF9SX0lORk8oWCxZKQotI2RlZmluZSBFTEZfUl9TWU0oWCkJRUxGNjRfUl9TWU0oWCkKLSNkZWZpbmUgRUxGX1JfVFlQRShYKQlFTEY2NF9SX1RZUEUoWCkKLSNkZWZpbmUgRUxGQ0xBU1MJRUxGQ0xBU1M2NAotI2RlZmluZSBGSUxFX0FMSUdOCTgKLSNkZWZpbmUgTE9HX0ZJTEVfQUxJR04JMwotI2VuZGlmCi0jaWYgQVJDSF9TSVpFID09IDMyCi0jZGVmaW5lIEVMRl9SX0lORk8oWCxZKQlFTEYzMl9SX0lORk8oWCxZKQotI2RlZmluZSBFTEZfUl9TWU0oWCkJRUxGMzJfUl9TWU0oWCkKLSNkZWZpbmUgRUxGX1JfVFlQRShYKQlFTEYzMl9SX1RZUEUoWCkKLSNkZWZpbmUgRUxGQ0xBU1MJRUxGQ0xBU1MzMgotI2RlZmluZSBGSUxFX0FMSUdOCTQKLSNkZWZpbmUgTE9HX0ZJTEVfQUxJR04JMgotI2VuZGlmCi0KLS8qIFN0YXRpYyBmdW5jdGlvbnMgKi8KLQotc3RhdGljIHZvaWQgZWxmX3N3YXBfZWhkcl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX0VoZHIgKiwgRWxmX0ludGVybmFsX0VoZHIgKikpOwotc3RhdGljIHZvaWQgZWxmX3N3YXBfZWhkcl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9FaGRyICosIEVsZl9FeHRlcm5hbF9FaGRyICopKTsKLXN0YXRpYyB2b2lkIGVsZl9zd2FwX3NoZHJfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9TaGRyICosIEVsZl9JbnRlcm5hbF9TaGRyICopKTsKLXN0YXRpYyB2b2lkIGVsZl9zd2FwX3NoZHJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU2hkciAqLCBFbGZfRXh0ZXJuYWxfU2hkciAqKSk7Ci0KLSNkZWZpbmUgZWxmX3N0cmluZ3RhYl9pbml0IF9iZmRfZWxmX3N0cmluZ3RhYl9pbml0Ci0KLSNkZWZpbmUgc2VjdGlvbl9mcm9tX2VsZl9pbmRleCBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleAotCi1zdGF0aWMgYm9vbGVhbiBlbGZfc2x1cnBfcmVsb2NfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLQotc3RhdGljIHZvaWQgd3JpdGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2ZpbGVfcCBQQVJBTVMgKChFbGZfRXh0ZXJuYWxfRWhkciAqKSk7Ci0KLSNpZmRlZiBERUJVRwotc3RhdGljIHZvaWQgZWxmX2RlYnVnX3NlY3Rpb24gUEFSQU1TICgoaW50LCBFbGZfSW50ZXJuYWxfU2hkciAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfZGVidWdfZmlsZSBQQVJBTVMgKChFbGZfSW50ZXJuYWxfRWhkciAqKSk7Ci1zdGF0aWMgY2hhciAqZWxmX3N5bWJvbF9mbGFncyBQQVJBTVMgKChmbGFnd29yZCkpOwotI2VuZGlmCi0MCi0vKiBTdHJ1Y3R1cmUgc3dhcHBpbmcgcm91dGluZXMgKi8KLQotLyogU2hvdWxkIHBlcmhhcHMgdXNlIHB1dF9vZmZzZXQsIHB1dF93b3JkLCBldGMuICBGb3Igbm93LCB0aGUgdHdvIHZlcnNpb25zCi0gICBjYW4gYmUgaGFuZGxlZCBieSBleHBsaWNpdGx5IHNwZWNpZnlpbmcgMzIgYml0cyBvciAidGhlIGxvbmcgdHlwZSIuICAqLwotI2lmIEFSQ0hfU0laRSA9PSA2NAotI2RlZmluZSBwdXRfd29yZAliZmRfaF9wdXRfNjQKLSNkZWZpbmUgcHV0X3NpZ25lZF93b3JkCWJmZF9oX3B1dF9zaWduZWRfNjQKLSNkZWZpbmUgZ2V0X3dvcmQJYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIGdldF9zaWduZWRfd29yZAliZmRfaF9nZXRfc2lnbmVkXzY0Ci0jZW5kaWYKLSNpZiBBUkNIX1NJWkUgPT0gMzIKLSNkZWZpbmUgcHV0X3dvcmQJYmZkX2hfcHV0XzMyCi0jZGVmaW5lIHB1dF9zaWduZWRfd29yZAliZmRfaF9wdXRfc2lnbmVkXzMyCi0jZGVmaW5lIGdldF93b3JkCWJmZF9oX2dldF8zMgotI2RlZmluZSBnZXRfc2lnbmVkX3dvcmQJYmZkX2hfZ2V0X3NpZ25lZF8zMgotI2VuZGlmCi0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgc3ltYm9sIGluIGV4dGVybmFsIGZvcm1hdCBpbnRvIGFuIEVMRiBzeW1ib2wgaW4gaW50ZXJuYWwKLSAgIGZvcm1hdC4gKi8KLQotdm9pZAotZWxmX3N3YXBfc3ltYm9sX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfU3ltICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmRzdDsKLXsKLSAgZHN0LT5zdF9uYW1lID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF9uYW1lKTsKLSAgZHN0LT5zdF92YWx1ZSA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF92YWx1ZSk7Ci0gIGRzdC0+c3Rfc2l6ZSA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF9zaXplKTsKLSAgZHN0LT5zdF9pbmZvID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnN0X2luZm8pOwotICBkc3QtPnN0X290aGVyID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnN0X290aGVyKTsKLSAgZHN0LT5zdF9zaG5keCA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3Rfc2huZHgpOwotfQotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIHN5bWJvbCBpbiBpbnRlcm5hbCBmb3JtYXQgaW50byBhbiBFTEYgc3ltYm9sIGluIGV4dGVybmFsCi0gICBmb3JtYXQuICovCi0KLXZvaWQKLWVsZl9zd2FwX3N5bWJvbF9vdXQgKGFiZmQsIHNyYywgY2RzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzcmM7Ci0gICAgIFBUUiBjZHN0OwotewotICBFbGZfRXh0ZXJuYWxfU3ltICpkc3QgPSAoRWxmX0V4dGVybmFsX1N5bSAqKSBjZHN0OwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+c3RfbmFtZSwgZHN0LT5zdF9uYW1lKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c3RfdmFsdWUsIGRzdC0+c3RfdmFsdWUpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5zdF9zaXplLCBkc3QtPnN0X3NpemUpOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5zdF9pbmZvLCBkc3QtPnN0X2luZm8pOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5zdF9vdGhlciwgZHN0LT5zdF9vdGhlcik7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5zdF9zaG5keCwgZHN0LT5zdF9zaG5keCk7Ci19Ci0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiBmaWxlIGhlYWRlciBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbiBFTEYgZmlsZSBoZWFkZXIgaW4KLSAgIGludGVybmFsIGZvcm1hdC4gKi8KLQotc3RhdGljIHZvaWQKLWVsZl9zd2FwX2VoZHJfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9FaGRyICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9FaGRyICpkc3Q7Ci17Ci0gIG1lbWNweSAoZHN0LT5lX2lkZW50LCBzcmMtPmVfaWRlbnQsIEVJX05JREVOVCk7Ci0gIGRzdC0+ZV90eXBlID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3R5cGUpOwotICBkc3QtPmVfbWFjaGluZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9tYWNoaW5lKTsKLSAgZHN0LT5lX3ZlcnNpb24gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfdmVyc2lvbik7Ci0gIGRzdC0+ZV9lbnRyeSA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX2VudHJ5KTsKLSAgZHN0LT5lX3Bob2ZmID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfcGhvZmYpOwotICBkc3QtPmVfc2hvZmYgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9zaG9mZik7Ci0gIGRzdC0+ZV9mbGFncyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9mbGFncyk7Ci0gIGRzdC0+ZV9laHNpemUgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfZWhzaXplKTsKLSAgZHN0LT5lX3BoZW50c2l6ZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9waGVudHNpemUpOwotICBkc3QtPmVfcGhudW0gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfcGhudW0pOwotICBkc3QtPmVfc2hlbnRzaXplID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3NoZW50c2l6ZSk7Ci0gIGRzdC0+ZV9zaG51bSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9zaG51bSk7Ci0gIGRzdC0+ZV9zaHN0cm5keCA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9zaHN0cm5keCk7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgZmlsZSBoZWFkZXIgaW4gaW50ZXJuYWwgZm9ybWF0IGludG8gYW4gRUxGIGZpbGUgaGVhZGVyIGluCi0gICBleHRlcm5hbCBmb3JtYXQuICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfc3dhcF9laGRyX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX0VoZHIgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX0VoZHIgKmRzdDsKLXsKLSAgbWVtY3B5IChkc3QtPmVfaWRlbnQsIHNyYy0+ZV9pZGVudCwgRUlfTklERU5UKTsKLSAgLyogbm90ZSB0aGF0IGFsbCBlbGVtZW50cyBvZiBkc3QgYXJlICphcnJheXMgb2YgdW5zaWduZWQgY2hhciogYWxyZWFkeS4uLiAqLwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV90eXBlLCBkc3QtPmVfdHlwZSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX21hY2hpbmUsIGRzdC0+ZV9tYWNoaW5lKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPmVfdmVyc2lvbiwgZHN0LT5lX3ZlcnNpb24pOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5lX2VudHJ5LCBkc3QtPmVfZW50cnkpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5lX3Bob2ZmLCBkc3QtPmVfcGhvZmYpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5lX3Nob2ZmLCBkc3QtPmVfc2hvZmYpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+ZV9mbGFncywgZHN0LT5lX2ZsYWdzKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfZWhzaXplLCBkc3QtPmVfZWhzaXplKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfcGhlbnRzaXplLCBkc3QtPmVfcGhlbnRzaXplKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfcGhudW0sIGRzdC0+ZV9waG51bSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX3NoZW50c2l6ZSwgZHN0LT5lX3NoZW50c2l6ZSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX3NobnVtLCBkc3QtPmVfc2hudW0pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9zaHN0cm5keCwgZHN0LT5lX3Noc3RybmR4KTsKLX0KLQotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGluIGV4dGVybmFsIGZvcm1hdCBpbnRvIGFuCi0gICBFTEYgc2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgaW4gaW50ZXJuYWwgZm9ybWF0LiAqLwotCi1zdGF0aWMgdm9pZAotZWxmX3N3YXBfc2hkcl9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1NoZHIgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKmRzdDsKLXsKLSAgZHN0LT5zaF9uYW1lID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9uYW1lKTsKLSAgZHN0LT5zaF90eXBlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF90eXBlKTsKLSAgZHN0LT5zaF9mbGFncyA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9mbGFncyk7Ci0gIGRzdC0+c2hfYWRkciA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9hZGRyKTsKLSAgZHN0LT5zaF9vZmZzZXQgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfb2Zmc2V0KTsKLSAgZHN0LT5zaF9zaXplID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX3NpemUpOwotICBkc3QtPnNoX2xpbmsgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX2xpbmspOwotICBkc3QtPnNoX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX2luZm8pOwotICBkc3QtPnNoX2FkZHJhbGlnbiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9hZGRyYWxpZ24pOwotICBkc3QtPnNoX2VudHNpemUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfZW50c2l6ZSk7Ci0gIGRzdC0+YmZkX3NlY3Rpb24gPSBOVUxMOwotICBkc3QtPmNvbnRlbnRzID0gTlVMTDsKLX0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBpbnRlcm5hbCBmb3JtYXQgaW50byBhbgotICAgRUxGIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGluIGV4dGVybmFsIGZvcm1hdC4gKi8KLQotc3RhdGljIHZvaWQKLWVsZl9zd2FwX3NoZHJfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU2hkciAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfU2hkciAqZHN0OwotewotICAvKiBub3RlIHRoYXQgYWxsIGVsZW1lbnRzIG9mIGRzdCBhcmUgKmFycmF5cyBvZiB1bnNpZ25lZCBjaGFyKiBhbHJlYWR5Li4uICovCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5zaF9uYW1lLCBkc3QtPnNoX25hbWUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+c2hfdHlwZSwgZHN0LT5zaF90eXBlKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfZmxhZ3MsIGRzdC0+c2hfZmxhZ3MpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5zaF9hZGRyLCBkc3QtPnNoX2FkZHIpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5zaF9vZmZzZXQsIGRzdC0+c2hfb2Zmc2V0KTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfc2l6ZSwgZHN0LT5zaF9zaXplKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnNoX2xpbmssIGRzdC0+c2hfbGluayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5zaF9pbmZvLCBkc3QtPnNoX2luZm8pOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5zaF9hZGRyYWxpZ24sIGRzdC0+c2hfYWRkcmFsaWduKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfZW50c2l6ZSwgZHN0LT5zaF9lbnRzaXplKTsKLX0KLQotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGluIGV4dGVybmFsIGZvcm1hdCBpbnRvIGFuCi0gICBFTEYgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgaW4gaW50ZXJuYWwgZm9ybWF0LiAqLwotCi12b2lkCi1lbGZfc3dhcF9waGRyX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfUGhkciAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfUGhkciAqZHN0OwotewotICBkc3QtPnBfdHlwZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF90eXBlKTsKLSAgZHN0LT5wX2ZsYWdzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX2ZsYWdzKTsKLSAgZHN0LT5wX29mZnNldCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX29mZnNldCk7Ci0gIGRzdC0+cF92YWRkciA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX3ZhZGRyKTsKLSAgZHN0LT5wX3BhZGRyID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfcGFkZHIpOwotICBkc3QtPnBfZmlsZXN6ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfZmlsZXN6KTsKLSAgZHN0LT5wX21lbXN6ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfbWVtc3opOwotICBkc3QtPnBfYWxpZ24gPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF9hbGlnbik7Ci19Ci0KLXZvaWQKLWVsZl9zd2FwX3BoZHJfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfUGhkciAqZHN0OwotewotICAvKiBub3RlIHRoYXQgYWxsIGVsZW1lbnRzIG9mIGRzdCBhcmUgKmFycmF5cyBvZiB1bnNpZ25lZCBjaGFyKiBhbHJlYWR5Li4uICovCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5wX3R5cGUsIGRzdC0+cF90eXBlKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF9vZmZzZXQsIGRzdC0+cF9vZmZzZXQpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5wX3ZhZGRyLCBkc3QtPnBfdmFkZHIpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5wX3BhZGRyLCBkc3QtPnBfcGFkZHIpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5wX2ZpbGVzeiwgZHN0LT5wX2ZpbGVzeik7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnBfbWVtc3osIGRzdC0+cF9tZW1zeik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5wX2ZsYWdzLCBkc3QtPnBfZmxhZ3MpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5wX2FsaWduLCBkc3QtPnBfYWxpZ24pOwotfQotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIHJlbG9jIGZyb20gZXh0ZXJuYWwgZm9ybWF0IHRvIGludGVybmFsIGZvcm1hdC4gKi8KLUlOTElORSB2b2lkCi1lbGZfc3dhcF9yZWxvY19pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1JlbCAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIGRzdC0+cl9vZmZzZXQgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9vZmZzZXQpOwotICBkc3QtPnJfaW5mbyA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX2luZm8pOwotfQotCi1JTkxJTkUgdm9pZAotZWxmX3N3YXBfcmVsb2NhX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfUmVsYSAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBkc3QtPnJfb2Zmc2V0ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfb2Zmc2V0KTsKLSAgZHN0LT5yX2luZm8gPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9pbmZvKTsKLSAgZHN0LT5yX2FkZGVuZCA9IGdldF9zaWduZWRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9hZGRlbmQpOwotfQotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIHJlbG9jIGZyb20gaW50ZXJuYWwgZm9ybWF0IHRvIGV4dGVybmFsIGZvcm1hdC4gKi8KLUlOTElORSB2b2lkCi1lbGZfc3dhcF9yZWxvY19vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWwgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1JlbCAqZHN0OwotewotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5yX29mZnNldCwgZHN0LT5yX29mZnNldCk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnJfaW5mbywgZHN0LT5yX2luZm8pOwotfQotCi1JTkxJTkUgdm9pZAotZWxmX3N3YXBfcmVsb2NhX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cl9vZmZzZXQsIGRzdC0+cl9vZmZzZXQpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5yX2luZm8sIGRzdC0+cl9pbmZvKTsKLSAgcHV0X3NpZ25lZF93b3JkIChhYmZkLCBzcmMtPnJfYWRkZW5kLCBkc3QtPnJfYWRkZW5kKTsKLX0KLQotSU5MSU5FIHZvaWQKLWVsZl9zd2FwX2R5bl9pbiAoYWJmZCwgcCwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IFBUUiBwOwotICAgICBFbGZfSW50ZXJuYWxfRHluICpkc3Q7Ci17Ci0gIGNvbnN0IEVsZl9FeHRlcm5hbF9EeW4gKnNyYyA9IChjb25zdCBFbGZfRXh0ZXJuYWxfRHluICopIHA7Ci0KLSAgZHN0LT5kX3RhZyA9IGdldF93b3JkIChhYmZkLCBzcmMtPmRfdGFnKTsKLSAgZHN0LT5kX3VuLmRfdmFsID0gZ2V0X3dvcmQgKGFiZmQsIHNyYy0+ZF91bi5kX3ZhbCk7Ci19Ci0KLUlOTElORSB2b2lkCi1lbGZfc3dhcF9keW5fb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfRHluICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9EeW4gKmRzdDsKLXsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZF90YWcsIGRzdC0+ZF90YWcpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5kX3VuLmRfdmFsLCBkc3QtPmRfdW4uZF92YWwpOwotfQotDAotLyogRUxGIC5vL2V4ZWMgZmlsZSByZWFkaW5nICovCi0KLQotLyogQmVnaW4gcHJvY2Vzc2luZyBhIGdpdmVuIG9iamVjdC4KLQotICAgRmlyc3Qgd2UgdmFsaWRhdGUgdGhlIGZpbGUgYnkgcmVhZGluZyBpbiB0aGUgRUxGIGhlYWRlciBhbmQgY2hlY2tpbmcKLSAgIHRoZSBtYWdpYyBudW1iZXIuICAqLwotCi1zdGF0aWMgSU5MSU5FIGJvb2xlYW4KLWVsZl9maWxlX3AgKHhfZWhkcnApCi0gICAgIEVsZl9FeHRlcm5hbF9FaGRyICp4X2VoZHJwOwotewotICByZXR1cm4gKCh4X2VoZHJwLT5lX2lkZW50W0VJX01BRzBdID09IEVMRk1BRzApCi0JICAmJiAoeF9laGRycC0+ZV9pZGVudFtFSV9NQUcxXSA9PSBFTEZNQUcxKQotCSAgJiYgKHhfZWhkcnAtPmVfaWRlbnRbRUlfTUFHMl0gPT0gRUxGTUFHMikKLQkgICYmICh4X2VoZHJwLT5lX2lkZW50W0VJX01BRzNdID09IEVMRk1BRzMpKTsKLX0KLQotLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBBQkZEIG1hdGNoZXMgdGhlIHRhcmdldCB2ZWN0b3IKLSAgIHRoYXQgQUJGRCBwb2ludHMgdG8uCi0KLSAgIE5vdGUgdGhhdCB3ZSBtYXkgYmUgY2FsbGVkIHNldmVyYWwgdGltZXMgd2l0aCB0aGUgc2FtZSBBQkZELCBidXQgZGlmZmVyZW50Ci0gICB0YXJnZXQgdmVjdG9ycywgbW9zdCBvZiB3aGljaCB3aWxsIG5vdCBtYXRjaC4gIFdlIGhhdmUgdG8gYXZvaWQgbGVhdmluZwotICAgYW55IHNpZGUgZWZmZWN0cyBpbiBBQkZELCBvciBhbnkgZGF0YSBpdCBwb2ludHMgdG8gKGxpa2UgdGRhdGEpLCBpZiB0aGUKLSAgIGZpbGUgZG9lcyBub3QgbWF0Y2ggdGhlIHRhcmdldCB2ZWN0b3IuICAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWVsZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBFbGZfRXh0ZXJuYWxfRWhkciB4X2VoZHI7CS8qIEVsZiBmaWxlIGhlYWRlciwgZXh0ZXJuYWwgZm9ybSAqLwotICBFbGZfSW50ZXJuYWxfRWhkciAqaV9laGRycDsJLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0gIEVsZl9FeHRlcm5hbF9TaGRyIHhfc2hkcjsJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnksIGV4dGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgKmlfc2hkcnAgPSBOVUxMOyAvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSwgaW50ZXJuYWwgZm9ybSAqLwotICB1bnNpZ25lZCBpbnQgc2hpbmRleDsKLSAgY2hhciAqc2hzdHJ0YWI7CQkvKiBJbnRlcm5hbCBjb3B5IG9mIHNlY3Rpb24gaGVhZGVyIHN0cmluZ3RhYiAqLwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqZWJkOwotICBzdHJ1Y3QgZWxmX29ial90ZGF0YSAqcHJlc2VydmVkX3RkYXRhID0gZWxmX3RkYXRhIChhYmZkKTsKLSAgc3RydWN0IGVsZl9vYmpfdGRhdGEgKm5ld190ZGF0YSA9IE5VTEw7Ci0gIGFzZWN0aW9uICpzOwotCi0gIC8qIFJlYWQgaW4gdGhlIEVMRiBoZWFkZXIgaW4gZXh0ZXJuYWwgZm9ybWF0LiAgKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgeF9laGRyLCBzaXplb2YgKHhfZWhkciksIDEsIGFiZmQpICE9IHNpemVvZiAoeF9laGRyKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgICAgZWxzZQotCWdvdG8gZ290X25vX21hdGNoOwotICAgIH0KLQotICAvKiBOb3cgY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSB2YWxpZCBFTEYgZmlsZSwgYW5kIG9uZSB0aGF0IEJGRCBjYW4KLSAgICAgbWFrZSB1c2Ugb2YuICBUaGUgbWFnaWMgbnVtYmVyIG11c3QgbWF0Y2gsIHRoZSBhZGRyZXNzIHNpemUgKCdjbGFzcycpCi0gICAgIGFuZCBieXRlLXN3YXBwaW5nIG11c3QgbWF0Y2ggb3VyIFhWRUMgZW50cnksIGFuZCBpdCBtdXN0IGhhdmUgYQotICAgICBzZWN0aW9uIGhlYWRlciB0YWJsZSAoRklYTUU6IFNlZSBjb21tZW50cyByZSBzZWN0aW9ucyBhdCB0b3Agb2YgdGhpcwotICAgICBmaWxlKS4gKi8KLQotICBpZiAoKGVsZl9maWxlX3AgKCZ4X2VoZHIpID09IGZhbHNlKSB8fAotICAgICAgKHhfZWhkci5lX2lkZW50W0VJX1ZFUlNJT05dICE9IEVWX0NVUlJFTlQpIHx8Ci0gICAgICAoeF9laGRyLmVfaWRlbnRbRUlfQ0xBU1NdICE9IEVMRkNMQVNTKSkKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0KLSAgLyogQ2hlY2sgdGhhdCBmaWxlJ3MgYnl0ZSBvcmRlciBtYXRjaGVzIHh2ZWMncyAqLwotICBzd2l0Y2ggKHhfZWhkci5lX2lkZW50W0VJX0RBVEFdKQotICAgIHsKLSAgICBjYXNlIEVMRkRBVEEyTVNCOgkJLyogQmlnLWVuZGlhbiAqLwotICAgICAgaWYgKCEgYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLQlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEVMRkRBVEEyTFNCOgkJLyogTGl0dGxlLWVuZGlhbiAqLwotICAgICAgaWYgKCEgYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChhYmZkKSkKLQlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEVMRkRBVEFOT05FOgkJLyogTm8gZGF0YSBlbmNvZGluZyBzcGVjaWZpZWQgKi8KLSAgICBkZWZhdWx0OgkJCS8qIFVua25vd24gZGF0YSBlbmNvZGluZyBzcGVjaWZpZWQgKi8KLSAgICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGVsZl9vYmpfdGRhdGEgc3RydWN0dXJlIGFuZCBob29rIGl0IHVwIHRvCi0gICAgIHRoZSB0ZGF0YSBwb2ludGVyIGluIHRoZSBiZmQuICAqLwotCi0gIG5ld190ZGF0YSA9ICgoc3RydWN0IGVsZl9vYmpfdGRhdGEgKikKLQkgICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX29ial90ZGF0YSkpKTsKLSAgaWYgKG5ld190ZGF0YSA9PSBOVUxMKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotICBlbGZfdGRhdGEgKGFiZmQpID0gbmV3X3RkYXRhOwotCi0gIC8qIE5vdyB0aGF0IHdlIGtub3cgdGhlIGJ5dGUgb3JkZXIsIHN3YXAgaW4gdGhlIHJlc3Qgb2YgdGhlIGhlYWRlciAqLwotICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoYWJmZCk7Ci0gIGVsZl9zd2FwX2VoZHJfaW4gKGFiZmQsICZ4X2VoZHIsIGlfZWhkcnApOwotI2lmIERFQlVHICYgMQotICBlbGZfZGVidWdfZmlsZSAoaV9laGRycCk7Ci0jZW5kaWYKLQotICAvKiBSZWplY3QgRVRfQ09SRSAoaGVhZGVyIGluZGljYXRlcyBjb3JlIGZpbGUsIG5vdCBvYmplY3QgZmlsZSkgKi8KLSAgaWYgKGlfZWhkcnAtPmVfdHlwZSA9PSBFVF9DT1JFKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICAvKiBJZiB0aGVyZSBpcyBubyBzZWN0aW9uIGhlYWRlciB0YWJsZSwgd2UncmUgaG9zZWQuICovCi0gIGlmIChpX2VoZHJwLT5lX3Nob2ZmID09IDApCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotCi0gIC8qIEFzIGEgc2ltcGxlIHNhbml0eSBjaGVjaywgdmVyaWZ5IHRoYXQgdGhlIHdoYXQgQkZEIHRoaW5rcyBpcyB0aGUKLSAgICAgc2l6ZSBvZiBlYWNoIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGFjdHVhbGx5IG1hdGNoZXMgdGhlIHNpemUKLSAgICAgcmVjb3JkZWQgaW4gdGhlIGZpbGUuICovCi0gIGlmIChpX2VoZHJwLT5lX3NoZW50c2l6ZSAhPSBzaXplb2YgKHhfc2hkcikpCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotCi0gIGViZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQotICAvKiBDaGVjayB0aGF0IHRoZSBFTEYgZV9tYWNoaW5lIGZpZWxkIG1hdGNoZXMgd2hhdCB0aGlzIHBhcnRpY3VsYXIKLSAgICAgQkZEIGZvcm1hdCBleHBlY3RzLiAgKi8KLSAgaWYgKGViZC0+ZWxmX21hY2hpbmVfY29kZSAhPSBpX2VoZHJwLT5lX21hY2hpbmUKLSAgICAgICYmIChlYmQtPmVsZl9tYWNoaW5lX2FsdDEgPT0gMCB8fCBpX2VoZHJwLT5lX21hY2hpbmUgIT0gZWJkLT5lbGZfbWFjaGluZV9hbHQxKQotICAgICAgJiYgKGViZC0+ZWxmX21hY2hpbmVfYWx0MiA9PSAwIHx8IGlfZWhkcnAtPmVfbWFjaGluZSAhPSBlYmQtPmVsZl9tYWNoaW5lX2FsdDIpKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCAqdGFyZ2V0X3B0cjsKLQotICAgICAgaWYgKGViZC0+ZWxmX21hY2hpbmVfY29kZSAhPSBFTV9OT05FKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICAgICAgLyogVGhpcyBpcyB0aGUgZ2VuZXJpYyBFTEYgdGFyZ2V0LiAgTGV0IGl0IG1hdGNoIGFueSBFTEYgdGFyZ2V0Ci0JIGZvciB3aGljaCB3ZSBkbyBub3QgaGF2ZSBhIHNwZWNpZmljIGJhY2tlbmQuICAqLwotICAgICAgZm9yICh0YXJnZXRfcHRyID0gYmZkX3RhcmdldF92ZWN0b3I7ICp0YXJnZXRfcHRyICE9IE5VTEw7IHRhcmdldF9wdHIrKykKLQl7Ci0JICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmFjazsKLQotCSAgaWYgKCgqdGFyZ2V0X3B0ciktPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQkgICAgY29udGludWU7Ci0JICBiYWNrID0gKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICopICgqdGFyZ2V0X3B0ciktPmJhY2tlbmRfZGF0YTsKLQkgIGlmIChiYWNrLT5lbGZfbWFjaGluZV9jb2RlID09IGlfZWhkcnAtPmVfbWFjaGluZQotCSAgICAgIHx8IChiYWNrLT5lbGZfbWFjaGluZV9hbHQxICE9IDAKLQkJICAmJiBiYWNrLT5lbGZfbWFjaGluZV9hbHQxID09IGlfZWhkcnAtPmVfbWFjaGluZSkKLQkgICAgICB8fCAoYmFjay0+ZWxmX21hY2hpbmVfYWx0MiAhPSAwCi0JCSAgJiYgYmFjay0+ZWxmX21hY2hpbmVfYWx0MiA9PSBpX2VoZHJwLT5lX21hY2hpbmUpKQotCSAgICB7Ci0JICAgICAgLyogdGFyZ2V0X3B0ciBpcyBhbiBFTEYgYmFja2VuZCB3aGljaCBtYXRjaGVzIHRoaXMKLQkJIG9iamVjdCBmaWxlLCBzbyByZWplY3QgdGhlIGdlbmVyaWMgRUxGIHRhcmdldC4gICovCi0JICAgICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoaV9laGRycC0+ZV90eXBlID09IEVUX0VYRUMpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICBlbHNlIGlmIChpX2VoZHJwLT5lX3R5cGUgPT0gRVRfRFlOKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0KLSAgaWYgKGlfZWhkcnAtPmVfcGhudW0gPiAwKQotICAgIGFiZmQtPmZsYWdzIHw9IERfUEFHRUQ7Ci0KLSAgaWYgKCEgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgZWJkLT5hcmNoLCAwKSkKLSAgICB7Ci0gICAgICAvKiBJdCdzIE9LIGlmIHRoaXMgZmFpbHMgZm9yIHRoZSBnZW5lcmljIHRhcmdldC4gICovCi0gICAgICBpZiAoZWJkLT5lbGZfbWFjaGluZV9jb2RlICE9IEVNX05PTkUpCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgfQotCi0gIC8qIFJlbWVtYmVyIHRoZSBlbnRyeSBwb2ludCBzcGVjaWZpZWQgaW4gdGhlIEVMRiBmaWxlIGhlYWRlci4gKi8KLSAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IGlfZWhkcnAtPmVfZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIGEgY29weSBvZiB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgaW4KLSAgICAgaW50ZXJuYWwgZm9ybSwgc2VlayB0byB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgaW4gdGhlIGZpbGUsCi0gICAgIHJlYWQgaXQgaW4sIGFuZCBjb252ZXJ0IGl0IHRvIGludGVybmFsIGZvcm0uICAqLwotICBpX3NoZHJwID0gKChFbGZfSW50ZXJuYWxfU2hkciAqKQotCSAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCppX3NoZHJwKSAqIGlfZWhkcnAtPmVfc2hudW0pKTsKLSAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKSA9ICgoRWxmX0ludGVybmFsX1NoZHIgKiopCi0JCQkgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgICAgICBzaXplb2YgKGlfc2hkcnApICogaV9laGRycC0+ZV9zaG51bSkpOwotICBpZiAoIWlfc2hkcnAgfHwgIWVsZl9lbGZzZWN0aW9ucyAoYWJmZCkpCi0gICAgZ290byBnb3Rfbm9fbWF0Y2g7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgaV9laGRycC0+ZV9zaG9mZiwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBnb3Rfbm9fbWF0Y2g7Ci0gIGZvciAoc2hpbmRleCA9IDA7IHNoaW5kZXggPCBpX2VoZHJwLT5lX3NobnVtOyBzaGluZGV4KyspCi0gICAgewotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHhfc2hkciwgc2l6ZW9mIHhfc2hkciwgMSwgYWJmZCkgIT0gc2l6ZW9mICh4X3NoZHIpKQotCWdvdG8gZ290X25vX21hdGNoOwotICAgICAgZWxmX3N3YXBfc2hkcl9pbiAoYWJmZCwgJnhfc2hkciwgaV9zaGRycCArIHNoaW5kZXgpOwotICAgICAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9IGlfc2hkcnAgKyBzaGluZGV4OwotCi0gICAgICAvKiBJZiB0aGUgc2VjdGlvbiBpcyBsb2FkZWQsIGJ1dCBub3QgcGFnZSBhbGlnbmVkLCBjbGVhcgotICAgICAgICAgRF9QQUdFRC4gICovCi0gICAgICBpZiAoKGlfc2hkcnBbc2hpbmRleF0uc2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDAKLQkgICYmIGlfc2hkcnBbc2hpbmRleF0uc2hfdHlwZSAhPSBTSFRfTk9CSVRTCi0JICAmJiAoKChpX3NoZHJwW3NoaW5kZXhdLnNoX2FkZHIgLSBpX3NoZHJwW3NoaW5kZXhdLnNoX29mZnNldCkKLQkgICAgICAgJSBlYmQtPm1heHBhZ2VzaXplKQotCSAgICAgICE9IDApKQotCWFiZmQtPmZsYWdzICY9IH5EX1BBR0VEOwotICAgIH0KLSAgaWYgKGlfZWhkcnAtPmVfc2hzdHJuZHgpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBpX2VoZHJwLT5lX3Noc3RybmR4KSkKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICB9Ci0KLSAgLyogUmVhZCBpbiB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLSAgaWYgKGlfZWhkcnAtPmVfcGhudW0gPT0gMCkKLSAgICBlbGZfdGRhdGEgKGFiZmQpLT5waGRyID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9QaGRyICppX3BoZHI7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+cGhkciA9ICgoRWxmX0ludGVybmFsX1BoZHIgKikKLQkJCQliZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgIChpX2VoZHJwLT5lX3BobnVtCi0JCQkJCSAgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1BoZHIpKSkpOwotICAgICAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnBoZHIgPT0gTlVMTCkKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaV9laGRycC0+ZV9waG9mZiwgU0VFS19TRVQpICE9IDApCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgICBpX3BoZHIgPSBlbGZfdGRhdGEgKGFiZmQpLT5waGRyOwotICAgICAgZm9yIChpID0gMDsgaSA8IGlfZWhkcnAtPmVfcGhudW07IGkrKywgaV9waGRyKyspCi0JewotCSAgRWxmX0V4dGVybmFsX1BoZHIgeF9waGRyOwotCi0JICBpZiAoYmZkX3JlYWQgKChQVFIpICZ4X3BoZHIsIHNpemVvZiB4X3BoZHIsIDEsIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mIHhfcGhkcikKLQkgICAgZ290byBnb3Rfbm9fbWF0Y2g7Ci0JICBlbGZfc3dhcF9waGRyX2luIChhYmZkLCAmeF9waGRyLCBpX3BoZHIpOwotCX0KLSAgICB9Ci0KLSAgLyogUmVhZCBpbiB0aGUgc3RyaW5nIHRhYmxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBzZWN0aW9ucy4gIFdlCi0gICAgIHdpbGwgbmVlZCB0aGUgYmFzZSBwb2ludGVyIHRvIHRoaXMgdGFibGUgbGF0ZXIuICovCi0gIC8qIFdlIHJlYWQgdGhpcyBpbmxpbmUgbm93LCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZ28gdGhyb3VnaAotICAgICBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgd2l0aCBpdCAoc2luY2UgdGhpcyBwYXJ0aWN1bGFyIHN0cnRhYiBpcwotICAgICB1c2VkIHRvIGZpbmQgYWxsIG9mIHRoZSBFTEYgc2VjdGlvbiBuYW1lcy4pICovCi0KLSAgc2hzdHJ0YWIgPSBiZmRfZWxmX2dldF9zdHJfc2VjdGlvbiAoYWJmZCwgaV9laGRycC0+ZV9zaHN0cm5keCk7Ci0gIGlmICghc2hzdHJ0YWIpCi0gICAgZ290byBnb3Rfbm9fbWF0Y2g7Ci0KLSAgLyogT25jZSBhbGwgb2YgdGhlIHNlY3Rpb24gaGVhZGVycyBoYXZlIGJlZW4gcmVhZCBhbmQgY29udmVydGVkLCB3ZQotICAgICBjYW4gc3RhcnQgcHJvY2Vzc2luZyB0aGVtLiAgTm90ZSB0aGF0IHRoZSBmaXJzdCBzZWN0aW9uIGhlYWRlciBpcwotICAgICBhIGR1bW15IHBsYWNlaG9sZGVyIGVudHJ5LCBzbyB3ZSBpZ25vcmUgaXQuICAqLwotCi0gIGZvciAoc2hpbmRleCA9IDE7IHNoaW5kZXggPCBpX2VoZHJwLT5lX3NobnVtOyBzaGluZGV4KyspCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBzaGluZGV4KSkKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICB9Ci0KLSAgLyogTGV0IHRoZSBiYWNrZW5kIGRvdWJsZSBjaGVjayB0aGUgZm9ybWF0IGFuZCBvdmVycmlkZSBnbG9iYWwKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICBpZiAoZWJkLT5lbGZfYmFja2VuZF9vYmplY3RfcCkKLSAgICB7Ci0gICAgICBpZiAoKCplYmQtPmVsZl9iYWNrZW5kX29iamVjdF9wKSAoYWJmZCkgPT0gZmFsc2UpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgIH0KLQotICAvKiBJZiB3ZSBoYXZlIGNyZWF0ZWQgYW55IHJlbG9jIHNlY3Rpb25zIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aAotICAgICBkZWJ1Z2dpbmcgc2VjdGlvbnMsIG1hcmsgdGhlIHJlbG9jIHNlY3Rpb25zIGFzIGRlYnVnZ2luZyBhcyB3ZWxsLiAgKi8KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKChlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMCi0JICAgfHwgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTEEpCi0JICAmJiBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfaW5mbyA+IDApCi0JewotCSAgdW5zaWduZWQgbG9uZyB0YXJnX2luZGV4OwotCSAgYXNlY3Rpb24gKnRhcmdfc2VjOwotCi0JICB0YXJnX2luZGV4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2luZm87Ci0JICB0YXJnX3NlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCB0YXJnX2luZGV4KTsKLQkgIGlmICh0YXJnX3NlYyAhPSBOVUxMCi0JICAgICAgJiYgKHRhcmdfc2VjLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0JICAgIHMtPmZsYWdzIHw9IFNFQ19ERUJVR0dJTkc7Ci0JfQotICAgIH0KLQotICByZXR1cm4gKGFiZmQtPnh2ZWMpOwotCi0gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjoKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gZ290X25vX21hdGNoOgotICBpZiAobmV3X3RkYXRhICE9IE5VTEwKLSAgICAgICYmIG5ld190ZGF0YS0+ZWxmX3NlY3RfcHRyICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFiZmQsIG5ld190ZGF0YS0+ZWxmX3NlY3RfcHRyKTsKLSAgaWYgKGlfc2hkcnAgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgaV9zaGRycCk7Ci0gIGlmIChuZXdfdGRhdGEgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgbmV3X3RkYXRhKTsKLSAgZWxmX3RkYXRhIChhYmZkKSA9IHByZXNlcnZlZF90ZGF0YTsKLSAgcmV0dXJuIChOVUxMKTsKLX0KLQwKLS8qIEVMRiAuby9leGVjIGZpbGUgd3JpdGluZyAqLwotCi0vKiBXcml0ZSBvdXQgdGhlIHJlbG9jcy4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLXsKLSAgYm9vbGVhbiAqZmFpbGVkcCA9IChib29sZWFuICopIGRhdGE7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxhX2hkcjsKLSAgRWxmX0V4dGVybmFsX1JlbGEgKm91dGJvdW5kX3JlbG9jYXM7Ci0gIEVsZl9FeHRlcm5hbF9SZWwgKm91dGJvdW5kX3JlbG9jczsKLSAgdW5zaWduZWQgaW50IGlkeDsKLSAgaW50IHVzZV9yZWxhX3AgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnVzZV9yZWxhX3A7Ci0gIGFzeW1ib2wgKmxhc3Rfc3ltID0gMDsKLSAgaW50IGxhc3Rfc3ltX2lkeCA9IDA7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGZhaWxlZCwgZG9uJ3QgZG8gYW55dGhpbmcuICAqLwotICBpZiAoKmZhaWxlZHApCi0gICAgcmV0dXJuOwotCi0gIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgLyogVGhlIGxpbmtlciBiYWNrZW5kIHdyaXRlcyB0aGUgcmVsb2NzIG91dCBpdHNlbGYsIGFuZCBzZXRzIHRoZQotICAgICByZWxvY19jb3VudCBmaWVsZCB0byB6ZXJvIHRvIGluaGliaXQgd3JpdGluZyB0aGVtIGhlcmUuICBBbHNvLAotICAgICBzb21ldGltZXMgdGhlIFNFQ19SRUxPQyBmbGFnIGdldHMgc2V0IGV2ZW4gd2hlbiB0aGVyZSBhcmVuJ3QgYW55Ci0gICAgIHJlbG9jcy4gICovCi0gIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuOwotCi0gIHJlbGFfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHI7Ci0KLSAgcmVsYV9oZHItPnNoX3NpemUgPSByZWxhX2hkci0+c2hfZW50c2l6ZSAqIHNlYy0+cmVsb2NfY291bnQ7Ci0gIHJlbGFfaGRyLT5jb250ZW50cyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmVsYV9oZHItPnNoX3NpemUpOwotICBpZiAocmVsYV9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0gICAgewotICAgICAgKmZhaWxlZHAgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBvcmVsb2NhdGlvbiBoYXMgdGhlIGRhdGEsIHJlbG9jX2NvdW50IGhhcyB0aGUgY291bnQuLi4gKi8KLSAgaWYgKHVzZV9yZWxhX3ApCi0gICAgewotICAgICAgb3V0Ym91bmRfcmVsb2NhcyA9IChFbGZfRXh0ZXJuYWxfUmVsYSAqKSByZWxhX2hkci0+Y29udGVudHM7Ci0KLSAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgc2VjLT5yZWxvY19jb3VudDsgaWR4KyspCi0JewotCSAgRWxmX0ludGVybmFsX1JlbGEgZHN0X3JlbGE7Ci0JICBFbGZfRXh0ZXJuYWxfUmVsYSAqc3JjX3JlbGE7Ci0JICBhcmVsZW50ICpwdHI7Ci0JICBhc3ltYm9sICpzeW07Ci0JICBpbnQgbjsKLQotCSAgcHRyID0gc2VjLT5vcmVsb2NhdGlvbltpZHhdOwotCSAgc3JjX3JlbGEgPSBvdXRib3VuZF9yZWxvY2FzICsgaWR4OwotCi0JICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4gb2JqZWN0Ci0JICAgICBmaWxlLCBhbmQgYWJzb2x1dGUgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZSBvciBzaGFyZWQgbGlicmFyeS4KLQkgICAgIFRoZSBhZGRyZXNzIG9mIGEgQkZEIHJlbG9jIGlzIGFsd2F5cyBzZWN0aW9uIHJlbGF0aXZlLiAgKi8KLQkgIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpID09IDApCi0JICAgIGRzdF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzOwotCSAgZWxzZQotCSAgICBkc3RfcmVsYS5yX29mZnNldCA9IHB0ci0+YWRkcmVzcyArIHNlYy0+dm1hOwotCi0JICBzeW0gPSAqcHRyLT5zeW1fcHRyX3B0cjsKLQkgIGlmIChzeW0gPT0gbGFzdF9zeW0pCi0JICAgIG4gPSBsYXN0X3N5bV9pZHg7Ci0JICBlbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikgJiYgc3ltLT52YWx1ZSA9PSAwKQotCSAgICBuID0gU1ROX1VOREVGOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbGFzdF9zeW0gPSBzeW07Ci0JICAgICAgbiA9IF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgKGFiZmQsICZzeW0pOwotCSAgICAgIGlmIChuIDwgMCkKLQkJewotCQkgICpmYWlsZWRwID0gdHJ1ZTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBsYXN0X3N5bV9pZHggPSBuOwotCSAgICB9Ci0KLQkgIGlmICgoKnB0ci0+c3ltX3B0cl9wdHIpLT50aGVfYmZkICE9IE5VTEwKLQkgICAgICAmJiAoKnB0ci0+c3ltX3B0cl9wdHIpLT50aGVfYmZkLT54dmVjICE9IGFiZmQtPnh2ZWMKLQkgICAgICAmJiAhIF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jIChhYmZkLCBwdHIpKQotCSAgICB7Ci0JICAgICAgKmZhaWxlZHAgPSB0cnVlOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBkc3RfcmVsYS5yX2luZm8gPSBFTEZfUl9JTkZPIChuLCBwdHItPmhvd3RvLT50eXBlKTsKLQotCSAgZHN0X3JlbGEucl9hZGRlbmQgPSBwdHItPmFkZGVuZDsKLQkgIGVsZl9zd2FwX3JlbG9jYV9vdXQgKGFiZmQsICZkc3RfcmVsYSwgc3JjX3JlbGEpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICAvKiBSRUwgcmVsb2NhdGlvbnMgKi8KLSAgICB7Ci0gICAgICBvdXRib3VuZF9yZWxvY3MgPSAoRWxmX0V4dGVybmFsX1JlbCAqKSByZWxhX2hkci0+Y29udGVudHM7Ci0KLSAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgc2VjLT5yZWxvY19jb3VudDsgaWR4KyspCi0JewotCSAgRWxmX0ludGVybmFsX1JlbCBkc3RfcmVsOwotCSAgRWxmX0V4dGVybmFsX1JlbCAqc3JjX3JlbDsKLQkgIGFyZWxlbnQgKnB0cjsKLQkgIGludCBuOwotCSAgYXN5bWJvbCAqc3ltOwotCi0JICBwdHIgPSBzZWMtPm9yZWxvY2F0aW9uW2lkeF07Ci0JICBzeW0gPSAqcHRyLT5zeW1fcHRyX3B0cjsKLQkgIHNyY19yZWwgPSBvdXRib3VuZF9yZWxvY3MgKyBpZHg7Ci0KLQkgIC8qIFRoZSBhZGRyZXNzIG9mIGFuIEVMRiByZWxvYyBpcyBzZWN0aW9uIHJlbGF0aXZlIGZvciBhbiBvYmplY3QKLQkgICAgIGZpbGUsIGFuZCBhYnNvbHV0ZSBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCSAgICAgVGhlIGFkZHJlc3Mgb2YgYSBCRkQgcmVsb2MgaXMgYWx3YXlzIHNlY3Rpb24gcmVsYXRpdmUuICAqLwotCSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCkKLQkgICAgZHN0X3JlbC5yX29mZnNldCA9IHB0ci0+YWRkcmVzczsKLQkgIGVsc2UKLQkgICAgZHN0X3JlbC5yX29mZnNldCA9IHB0ci0+YWRkcmVzcyArIHNlYy0+dm1hOwotCi0JICBpZiAoc3ltID09IGxhc3Rfc3ltKQotCSAgICBuID0gbGFzdF9zeW1faWR4OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbGFzdF9zeW0gPSBzeW07Ci0JICAgICAgbiA9IF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgKGFiZmQsICZzeW0pOwotCSAgICAgIGlmIChuIDwgMCkKLQkJewotCQkgICpmYWlsZWRwID0gdHJ1ZTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBsYXN0X3N5bV9pZHggPSBuOwotCSAgICB9Ci0KLQkgIGlmICgoKnB0ci0+c3ltX3B0cl9wdHIpLT50aGVfYmZkLT54dmVjICE9IGFiZmQtPnh2ZWMKLQkgICAgICAmJiAhIF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jIChhYmZkLCBwdHIpKQotCSAgICB7Ci0JICAgICAgKmZhaWxlZHAgPSB0cnVlOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBkc3RfcmVsLnJfaW5mbyA9IEVMRl9SX0lORk8gKG4sIHB0ci0+aG93dG8tPnR5cGUpOwotCi0JICBlbGZfc3dhcF9yZWxvY19vdXQgKGFiZmQsICZkc3RfcmVsLCBzcmNfcmVsKTsKLQl9Ci0gICAgfQotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHByb2dyYW0gaGVhZGVycy4gICovCi0KLWludAotZWxmX3dyaXRlX291dF9waGRycyAoYWJmZCwgcGhkciwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKnBoZHI7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgd2hpbGUgKGNvdW50LS0pCi0gICAgewotICAgICAgRWxmX0V4dGVybmFsX1BoZHIgZXh0cGhkcjsKLSAgICAgIGVsZl9zd2FwX3BoZHJfb3V0IChhYmZkLCBwaGRyLCAmZXh0cGhkcik7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgmZXh0cGhkciwgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUGhkciksIDEsIGFiZmQpCi0JICAhPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9QaGRyKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBwaGRyKys7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBzZWN0aW9uIGhlYWRlcnMgYW5kIHRoZSBFTEYgZmlsZSBoZWFkZXIuICAqLwotCi1ib29sZWFuCi1lbGZfd3JpdGVfc2hkcnNfYW5kX2VoZHIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgRWxmX0V4dGVybmFsX0VoZHIgeF9laGRyOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGV4dGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX0VoZHIgKmlfZWhkcnA7CS8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICBFbGZfRXh0ZXJuYWxfU2hkciAqeF9zaGRycDsJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUsIGV4dGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgKippX3NoZHJwOwkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSwgaW50ZXJuYWwgZm9ybSAqLwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOwotICBpX3NoZHJwID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKTsKLQotICAvKiBzd2FwIHRoZSBoZWFkZXIgYmVmb3JlIHNwaXR0aW5nIGl0IG91dC4uLiAqLwotCi0jaWYgREVCVUcgJiAxCi0gIGVsZl9kZWJ1Z19maWxlIChpX2VoZHJwKTsKLSNlbmRpZgotICBlbGZfc3dhcF9laGRyX291dCAoYWJmZCwgaV9laGRycCwgJnhfZWhkcik7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgJiB4X2VoZHIsIHNpemVvZiAoeF9laGRyKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoeF9laGRyKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIGF0IHRoaXMgcG9pbnQgd2UndmUgY29uY29jdGVkIGFsbCB0aGUgRUxGIHNlY3Rpb25zLi4uICovCi0gIHhfc2hkcnAgPSAoRWxmX0V4dGVybmFsX1NoZHIgKikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoKnhfc2hkcnApICogKGlfZWhkcnAtPmVfc2hudW0pKTsKLSAgaWYgKCF4X3NoZHJwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBpX2VoZHJwLT5lX3NobnVtOyBjb3VudCsrKQotICAgIHsKLSNpZiBERUJVRyAmIDIKLSAgICAgIGVsZl9kZWJ1Z19zZWN0aW9uIChjb3VudCwgaV9zaGRycFtjb3VudF0pOwotI2VuZGlmCi0gICAgICBlbGZfc3dhcF9zaGRyX291dCAoYWJmZCwgaV9zaGRycFtjb3VudF0sIHhfc2hkcnAgKyBjb3VudCk7Ci0gICAgfQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgaV9laGRycC0+ZV9zaG9mZiwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpIHhfc2hkcnAsIHNpemVvZiAoKnhfc2hkcnApLCBpX2VoZHJwLT5lX3NobnVtLCBhYmZkKQotCSAgIT0gc2l6ZW9mICgqeF9zaGRycCkgKiBpX2VoZHJwLT5lX3NobnVtKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogbmVlZCB0byBkdW1wIHRoZSBzdHJpbmcgdGFibGUgdG9vLi4uICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWxvbmcKLWVsZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQsIHN5bXB0cnMsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN5bXB0cnM7CQkvKiBCdWZmZXIgZm9yIGdlbmVyYXRlZCBiZmQgc3ltYm9scyAqLwotICAgICBib29sZWFuIGR5bmFtaWM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICp2ZXJoZHI7Ci0gIHVuc2lnbmVkIGxvbmcgc3ltY291bnQ7CS8qIE51bWJlciBvZiBleHRlcm5hbCBFTEYgc3ltYm9scyAqLwotICBlbGZfc3ltYm9sX3R5cGUgKnN5bTsJCS8qIFBvaW50ZXIgdG8gY3VycmVudCBiZmQgc3ltYm9sICovCi0gIGVsZl9zeW1ib2xfdHlwZSAqc3ltYmFzZTsJLyogQnVmZmVyIGZvciBnZW5lcmF0ZWQgYmZkIHN5bWJvbHMgKi8KLSAgRWxmX0ludGVybmFsX1N5bSBpX3N5bTsKLSAgRWxmX0V4dGVybmFsX1N5bSAqeF9zeW1wID0gTlVMTDsKLSAgRWxmX0V4dGVybmFsX1ZlcnN5bSAqeF92ZXJzeW1wID0gTlVMTDsKLQotICAvKiBSZWFkIGVhY2ggcmF3IEVMRiBzeW1ib2wsIGNvbnZlcnRpbmcgZnJvbSBleHRlcm5hbCBFTEYgZm9ybSB0bwotICAgICBpbnRlcm5hbCBFTEYgZm9ybSwgYW5kIHRoZW4gdXNpbmcgdGhlIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSBhCi0gICAgIGNhbm9uaWNhbCBiZmQgc3ltYm9sIHRhYmxlIGVudHJ5LgotCi0gICAgIE5vdGUgdGhhdCB3ZSBhbGxvY2F0ZSB0aGUgaW5pdGlhbCBiZmQgY2Fub25pY2FsIHN5bWJvbCBidWZmZXIKLSAgICAgYmFzZWQgb24gYSBvbmUtdG8tb25lIG1hcHBpbmcgb2YgdGhlIEVMRiBzeW1ib2xzIHRvIGNhbm9uaWNhbAotICAgICBzeW1ib2xzLiAgV2UgYWN0dWFsbHkgdXNlIGFsbCB0aGUgRUxGIHN5bWJvbHMsIHNvIHRoZXJlIHdpbGwgYmUgbm8KLSAgICAgc3BhY2UgbGVmdCBvdmVyIGF0IHRoZSBlbmQuICBXaGVuIHdlIGhhdmUgYWxsIHRoZSBzeW1ib2xzLCB3ZQotICAgICBidWlsZCB0aGUgY2FsbGVyJ3MgcG9pbnRlciB2ZWN0b3IuICovCi0KLSAgaWYgKCEgZHluYW1pYykKLSAgICB7Ci0gICAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIHZlcmhkciA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnN5bXRhYl9oZHI7Ci0gICAgICBpZiAoZWxmX2R5bnZlcnN5bSAoYWJmZCkgPT0gMCkKLQl2ZXJoZHIgPSBOVUxMOwotICAgICAgZWxzZQotCXZlcmhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJzeW1faGRyOwotICAgICAgaWYgKChlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJkZWZfc2VjdGlvbiAhPSAwCi0JICAgJiYgZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmID09IE5VTEwpCi0JICB8fCAoZWxmX3RkYXRhIChhYmZkKS0+ZHludmVycmVmX3NlY3Rpb24gIT0gMAotCSAgICAgICYmIGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZiA9PSBOVUxMKSkKLQl7Ci0JICBpZiAoISBfYmZkX2VsZl9zbHVycF92ZXJzaW9uX3RhYmxlcyAoYWJmZCkpCi0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgc3ltY291bnQgPSBoZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotCi0gIGlmIChzeW1jb3VudCA9PSAwKQotICAgIHN5bSA9IHN5bWJhc2UgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCi0JcmV0dXJuIC0xOwotCi0gICAgICBzeW1iYXNlID0gKChlbGZfc3ltYm9sX3R5cGUgKikKLQkJIGJmZF96YWxsb2MgKGFiZmQsIHN5bWNvdW50ICogc2l6ZW9mIChlbGZfc3ltYm9sX3R5cGUpKSk7Ci0gICAgICBpZiAoc3ltYmFzZSA9PSAoZWxmX3N5bWJvbF90eXBlICopIE5VTEwpCi0JcmV0dXJuIC0xOwotICAgICAgc3ltID0gc3ltYmFzZTsKLQotICAgICAgLyogVGVtcG9yYXJpbHkgYWxsb2NhdGUgcm9vbSBmb3IgdGhlIHJhdyBFTEYgc3ltYm9scy4gICovCi0gICAgICB4X3N5bXAgPSAoKEVsZl9FeHRlcm5hbF9TeW0gKikKLQkJYmZkX21hbGxvYyAoc3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSk7Ci0gICAgICBpZiAoeF9zeW1wID09IE5VTEwgJiYgc3ltY291bnQgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSB4X3N5bXAsIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksIHN5bWNvdW50LCBhYmZkKQotCSAgIT0gc3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBSZWFkIHRoZSByYXcgRUxGIHZlcnNpb24gc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLQotICAgICAgaWYgKHZlcmhkciAhPSBOVUxMCi0JICAmJiB2ZXJoZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJzeW0pICE9IHN5bWNvdW50KQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IHZlcnNpb24gY291bnQgKCVsZCkgZG9lcyBub3QgbWF0Y2ggc3ltYm9sIGNvdW50ICglbGQpIiksCi0JICAgICBhYmZkLT5maWxlbmFtZSwKLQkgICAgIChsb25nKSAodmVyaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyc3ltKSksCi0JICAgICBzeW1jb3VudCk7Ci0KLQkgIC8qIFNsdXJwIGluIHRoZSBzeW1ib2xzIHdpdGhvdXQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24sCi0gICAgICAgICAgICAgc2luY2UgdGhhdCBpcyBtb3JlIGhlbHBmdWwgdGhhbiBqdXN0IHF1aXR0aW5nLiAgKi8KLQkgIHZlcmhkciA9IE5VTEw7Ci0JfQotCi0gICAgICBpZiAodmVyaGRyICE9IE5VTEwpCi0JewotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCB2ZXJoZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICB4X3ZlcnN5bXAgPSAoRWxmX0V4dGVybmFsX1ZlcnN5bSAqKSBiZmRfbWFsbG9jICh2ZXJoZHItPnNoX3NpemUpOwotCSAgaWYgKHhfdmVyc3ltcCA9PSBOVUxMICYmIHZlcmhkci0+c2hfc2l6ZSAhPSAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSB4X3ZlcnN5bXAsIDEsIHZlcmhkci0+c2hfc2l6ZSwgYWJmZCkKLQkgICAgICAhPSB2ZXJoZHItPnNoX3NpemUpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgLyogU2tpcCBmaXJzdCBzeW1ib2wsIHdoaWNoIGlzIGEgbnVsbCBkdW1teS4gICovCi0gICAgICBmb3IgKGkgPSAxOyBpIDwgc3ltY291bnQ7IGkrKykKLQl7Ci0JICBlbGZfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIHhfc3ltcCArIGksICZpX3N5bSk7Ci0JICBtZW1jcHkgKCZzeW0tPmludGVybmFsX2VsZl9zeW0sICZpX3N5bSwgc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSk7Ci0jaWZkZWYgRUxGX0tFRVBfRVhUU1lNCi0JICBtZW1jcHkgKCZzeW0tPm5hdGl2ZV9lbGZfc3ltLCB4X3N5bXAgKyBpLCBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKTsKLSNlbmRpZgotCSAgc3ltLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0KLQkgIHN5bS0+c3ltYm9sLm5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLAotCQkJCQkJCSAgICAgIGhkci0+c2hfbGluaywKLQkJCQkJCQkgICAgICBpX3N5bS5zdF9uYW1lKTsKLQotCSAgc3ltLT5zeW1ib2wudmFsdWUgPSBpX3N5bS5zdF92YWx1ZTsKLQotCSAgaWYgKGlfc3ltLnN0X3NobmR4ID4gMCAmJiBpX3N5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwKLQkJCQkJCQkgICAgaV9zeW0uc3Rfc2huZHgpOwotCSAgICAgIGlmIChzeW0tPnN5bWJvbC5zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICAvKiBUaGlzIHN5bWJvbCBpcyBpbiBhIHNlY3Rpb24gZm9yIHdoaWNoIHdlIGRpZCBub3QKLQkJICAgICBjcmVhdGUgYSBCRkQgc2VjdGlvbi4gIEp1c3QgdXNlIGJmZF9hYnNfc2VjdGlvbiwKLQkJICAgICBhbHRob3VnaCBpdCBpcyB3cm9uZy4gIEZJWE1FLiAgKi8KLQkJICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChpX3N5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQotCSAgICB7Ci0JICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGlfc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgICAgICAvKiBFbGYgcHV0cyB0aGUgYWxpZ25tZW50IGludG8gdGhlIGB2YWx1ZScgZmllbGQsIGFuZAotCQkgdGhlIHNpemUgaW50byB0aGUgYHNpemUnIGZpZWxkLiAgQkZEIHdhbnRzIHRvIHNlZSB0aGUKLQkJIHNpemUgaW4gdGhlIHZhbHVlIGZpZWxkLCBhbmQgZG9lc24ndCBjYXJlIChhdCB0aGUKLQkJIG1vbWVudCkgYWJvdXQgdGhlIGFsaWdubWVudC4gICovCi0JICAgICAgc3ltLT5zeW1ib2wudmFsdWUgPSBpX3N5bS5zdF9zaXplOwotCSAgICB9Ci0JICBlbHNlIGlmIChpX3N5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgICAgfQotCSAgZWxzZQotCSAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQotCSAgLyogSWYgdGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBmaWxlLCB0aGVuIHRoZSBzeW1ib2wgdmFsdWUgaXMKLSAgICAgICAgICAgICBhbHJlYWR5IHNlY3Rpb24gcmVsYXRpdmUuICAqLwotCSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgIT0gMCkKLQkgICAgc3ltLT5zeW1ib2wudmFsdWUgLT0gc3ltLT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotCi0JICBzd2l0Y2ggKEVMRl9TVF9CSU5EIChpX3N5bS5zdF9pbmZvKSkKLQkgICAgewotCSAgICBjYXNlIFNUQl9MT0NBTDoKLQkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfTE9DQUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1RCX0dMT0JBTDoKLQkgICAgICBpZiAoaV9zeW0uc3Rfc2huZHggIT0gU0hOX1VOREVGCi0JCSAgJiYgaV9zeW0uc3Rfc2huZHggIT0gU0hOX0NPTU1PTikKLQkJc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0dMT0JBTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTVEJfV0VBSzoKLQkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfV0VBSzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBzd2l0Y2ggKEVMRl9TVF9UWVBFIChpX3N5bS5zdF9pbmZvKSkKLQkgICAgewotCSAgICBjYXNlIFNUVF9TRUNUSU9OOgotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9TRUNUSU9OX1NZTSB8IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1RUX0ZJTEU6Ci0JICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZJTEUgfCBCU0ZfREVCVUdHSU5HOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNUVF9GVU5DOgotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTVFRfT0JKRUNUOgotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9PQkpFQ1Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKGR5bmFtaWMpCi0JICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9EWU5BTUlDOwotCi0JICBpZiAoeF92ZXJzeW1wICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfVmVyc3ltIGl2ZXJzeW07Ci0KLQkgICAgICBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9pbiAoYWJmZCwgeF92ZXJzeW1wICsgaSwgJml2ZXJzeW0pOwotCSAgICAgIHN5bS0+dmVyc2lvbiA9IGl2ZXJzeW0udnNfdmVyczsKLQkgICAgfQotCi0JICAvKiBEbyBzb21lIGJhY2tlbmQtc3BlY2lmaWMgcHJvY2Vzc2luZyBvbiB0aGlzIHN5bWJvbC4gICovCi0JICB7Ci0JICAgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICplYmQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0JICAgIGlmIChlYmQtPmVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nKQotCSAgICAgICgqZWJkLT5lbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZykgKGFiZmQsICZzeW0tPnN5bWJvbCk7Ci0JICB9Ci0KLQkgIHN5bSsrOwotCX0KLSAgICB9Ci0KLSAgLyogRG8gc29tZSBiYWNrZW5kLXNwZWNpZmljIHByb2Nlc3Npbmcgb24gdGhpcyBzeW1ib2wgdGFibGUuICAqLwotICB7Ci0gICAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmViZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgICBpZiAoZWJkLT5lbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZykKLSAgICAgICgqZWJkLT5lbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZykgKGFiZmQsIHN5bWJhc2UsIHN5bWNvdW50KTsKLSAgfQotCi0gIC8qIFdlIHJlbHkgb24gdGhlIHphbGxvYyB0byBjbGVhciBvdXQgdGhlIGZpbmFsIHN5bWJvbCBlbnRyeS4gICovCi0KLSAgc3ltY291bnQgPSBzeW0gLSBzeW1iYXNlOwotCi0gIC8qIEZpbGwgaW4gdGhlIHVzZXIncyBzeW1ib2wgcG9pbnRlciB2ZWN0b3IgaWYgbmVlZGVkLiAgKi8KLSAgaWYgKHN5bXB0cnMpCi0gICAgewotICAgICAgbG9uZyBsID0gc3ltY291bnQ7Ci0KLSAgICAgIHN5bSA9IHN5bWJhc2U7Ci0gICAgICB3aGlsZSAobC0tID4gMCkKLQl7Ci0JICAqc3ltcHRycysrID0gJnN5bS0+c3ltYm9sOwotCSAgc3ltKys7Ci0JfQotICAgICAgKnN5bXB0cnMgPSAwOwkJLyogRmluYWwgbnVsbCBwb2ludGVyICovCi0gICAgfQotCi0gIGlmICh4X3ZlcnN5bXAgIT0gTlVMTCkKLSAgICBmcmVlICh4X3ZlcnN5bXApOwotICBpZiAoeF9zeW1wICE9IE5VTEwpCi0gICAgZnJlZSAoeF9zeW1wKTsKLSAgcmV0dXJuIHN5bWNvdW50OwotZXJyb3JfcmV0dXJuOgotICBpZiAoeF92ZXJzeW1wICE9IE5VTEwpCi0gICAgZnJlZSAoeF92ZXJzeW1wKTsKLSAgaWYgKHhfc3ltcCAhPSBOVUxMKQotICAgIGZyZWUgKHhfc3ltcCk7Ci0gIHJldHVybiAtMTsKLX0KLQotLyogUmVhZCBpbiBhbmQgc3dhcCB0aGUgZXh0ZXJuYWwgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGViZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICogY29uc3QgZCA9IGVsZl9zZWN0aW9uX2RhdGEgKGFzZWN0KTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2NfY291bnQ7Ci0gIFBUUiBhbGxvY2F0ZWQgPSBOVUxMOwotICBiZmRfYnl0ZSAqbmF0aXZlX3JlbG9jczsKLSAgYXJlbGVudCAqcmVsZW50czsKLSAgYXJlbGVudCAqcmVsZW50OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IGVudHNpemU7Ci0KLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKCEgZHluYW1pYykKLSAgICB7Ci0gICAgICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotCSAgfHwgYXNlY3QtPnJlbG9jX2NvdW50ID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIHJlbF9oZHIgPSAmZC0+cmVsX2hkcjsKLSAgICAgIHJlbG9jX2NvdW50ID0gYXNlY3QtPnJlbG9jX2NvdW50OwotCi0gICAgICBCRkRfQVNTRVJUIChhc2VjdC0+cmVsX2ZpbGVwb3MgPT0gcmVsX2hkci0+c2hfb2Zmc2V0Ci0JCSAgJiYgcmVsb2NfY291bnQgPT0gcmVsX2hkci0+c2hfc2l6ZSAvIHJlbF9oZHItPnNoX2VudHNpemUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChhc2VjdC0+X3Jhd19zaXplID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIHJlbF9oZHIgPSAmZC0+dGhpc19oZHI7Ci0gICAgICByZWxvY19jb3VudCA9IHJlbF9oZHItPnNoX3NpemUgLyByZWxfaGRyLT5zaF9lbnRzaXplOwotICAgIH0KLQotICBhbGxvY2F0ZWQgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSByZWxfaGRyLT5zaF9zaXplKTsKLSAgaWYgKGFsbG9jYXRlZCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgcmVsX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkIChhbGxvY2F0ZWQsIDEsIHJlbF9oZHItPnNoX3NpemUsIGFiZmQpCi0JICAhPSByZWxfaGRyLT5zaF9zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBuYXRpdmVfcmVsb2NzID0gKGJmZF9ieXRlICopIGFsbG9jYXRlZDsKLQotICByZWxlbnRzID0gKGFyZWxlbnQgKikgYmZkX2FsbG9jIChhYmZkLCByZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCkpOwotICBpZiAocmVsZW50cyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGVudHNpemUgPSByZWxfaGRyLT5zaF9lbnRzaXplOwotICBCRkRfQVNTRVJUIChlbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbCkKLQkgICAgICB8fCBlbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpKTsKLQotICBmb3IgKGkgPSAwLCByZWxlbnQgPSByZWxlbnRzOwotICAgICAgIGkgPCByZWxvY19jb3VudDsKLSAgICAgICBpKyssIHJlbGVudCsrLCBuYXRpdmVfcmVsb2NzICs9IGVudHNpemUpCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICBpZiAoZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSkKLQllbGZfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIChFbGZfRXh0ZXJuYWxfUmVsYSAqKSBuYXRpdmVfcmVsb2NzLCAmcmVsYSk7Ci0gICAgICBlbHNlCi0JewotCSAgZWxmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChFbGZfRXh0ZXJuYWxfUmVsICopIG5hdGl2ZV9yZWxvY3MsICZyZWwpOwotCSAgcmVsYS5yX29mZnNldCA9IHJlbC5yX29mZnNldDsKLQkgIHJlbGEucl9pbmZvID0gcmVsLnJfaW5mbzsKLQkgIHJlbGEucl9hZGRlbmQgPSAwOwotCX0KLQotICAgICAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gRUxGIHJlbG9jIGlzIHNlY3Rpb24gcmVsYXRpdmUgZm9yIGFuIG9iamVjdAotCSBmaWxlLCBhbmQgYWJzb2x1dGUgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZSBvciBzaGFyZWQgbGlicmFyeS4KLQkgVGhlIGFkZHJlc3Mgb2YgYSBub3JtYWwgQkZEIHJlbG9jIGlzIGFsd2F5cyBzZWN0aW9uIHJlbGF0aXZlLAotCSBhbmQgdGhlIGFkZHJlc3Mgb2YgYSBkeW5hbWljIHJlbG9jIGlzIGFic29sdXRlLi4gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwIHx8IGR5bmFtaWMpCi0JcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldDsKLSAgICAgIGVsc2UKLQlyZWxlbnQtPmFkZHJlc3MgPSByZWxhLnJfb2Zmc2V0IC0gYXNlY3QtPnZtYTsKLQotICAgICAgaWYgKEVMRl9SX1NZTSAocmVsYS5yX2luZm8pID09IDApCi0JcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgICAgZWxzZQotCXsKLQkgIGFzeW1ib2wgKipwcywgKnM7Ci0KLQkgIHBzID0gc3ltYm9scyArIEVMRl9SX1NZTSAocmVsYS5yX2luZm8pIC0gMTsKLQkgIHMgPSAqcHM7Ci0KLQkgIC8qIENhbm9uaWNhbGl6ZSBFTEYgc2VjdGlvbiBzeW1ib2xzLiAgRklYTUU6IFdoeT8gICovCi0JICBpZiAoKHMtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotCSAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gcHM7Ci0JICBlbHNlCi0JICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzLT5zZWN0aW9uLT5zeW1ib2xfcHRyX3B0cjsKLQl9Ci0KLSAgICAgIHJlbGVudC0+YWRkZW5kID0gcmVsYS5yX2FkZGVuZDsKLQotICAgICAgaWYgKGVudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSkpCi0JKCplYmQtPmVsZl9pbmZvX3RvX2hvd3RvKSAoYWJmZCwgcmVsZW50LCAmcmVsYSk7Ci0gICAgICBlbHNlCi0JKCplYmQtPmVsZl9pbmZvX3RvX2hvd3RvX3JlbCkgKGFiZmQsIHJlbGVudCwgJnJlbCk7Ci0gICAgfQotCi0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsZW50czsKLQotICBpZiAoYWxsb2NhdGVkICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2NhdGVkKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGFsbG9jYXRlZCAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jYXRlZCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotI2lmZGVmIERFQlVHCi1zdGF0aWMgdm9pZAotZWxmX2RlYnVnX3NlY3Rpb24gKG51bSwgaGRyKQotICAgICBpbnQgbnVtOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotewotICBmcHJpbnRmIChzdGRlcnIsICJcblNlY3Rpb24jJWQgJyVzJyAweCUuOGx4XG4iLCBudW0sCi0JICAgaGRyLT5iZmRfc2VjdGlvbiAhPSBOVUxMID8gaGRyLT5iZmRfc2VjdGlvbi0+bmFtZSA6ICIiLAotCSAgIChsb25nKSBoZHIpOwotICBmcHJpbnRmIChzdGRlcnIsCi0JICAgInNoX25hbWUgICAgICA9ICVsZFx0c2hfdHlwZSAgICAgID0gJWxkXHRzaF9mbGFncyAgICAgPSAlbGRcbiIsCi0JICAgKGxvbmcpIGhkci0+c2hfbmFtZSwKLQkgICAobG9uZykgaGRyLT5zaF90eXBlLAotCSAgIChsb25nKSBoZHItPnNoX2ZsYWdzKTsKLSAgZnByaW50ZiAoc3RkZXJyLAotCSAgICJzaF9hZGRyICAgICAgPSAlbGRcdHNoX29mZnNldCAgICA9ICVsZFx0c2hfc2l6ZSAgICAgID0gJWxkXG4iLAotCSAgIChsb25nKSBoZHItPnNoX2FkZHIsCi0JICAgKGxvbmcpIGhkci0+c2hfb2Zmc2V0LAotCSAgIChsb25nKSBoZHItPnNoX3NpemUpOwotICBmcHJpbnRmIChzdGRlcnIsCi0JICAgInNoX2xpbmsgICAgICA9ICVsZFx0c2hfaW5mbyAgICAgID0gJWxkXHRzaF9hZGRyYWxpZ24gPSAlbGRcbiIsCi0JICAgKGxvbmcpIGhkci0+c2hfbGluaywKLQkgICAobG9uZykgaGRyLT5zaF9pbmZvLAotCSAgIChsb25nKSBoZHItPnNoX2FkZHJhbGlnbik7Ci0gIGZwcmludGYgKHN0ZGVyciwgInNoX2VudHNpemUgICA9ICVsZFxuIiwKLQkgICAobG9uZykgaGRyLT5zaF9lbnRzaXplKTsKLSAgZmZsdXNoIChzdGRlcnIpOwotfQotCi1zdGF0aWMgdm9pZAotZWxmX2RlYnVnX2ZpbGUgKGVoZHJwKQotICAgICBFbGZfSW50ZXJuYWxfRWhkciAqZWhkcnA7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgImVfZW50cnkgICAgICA9IDB4JS44bHhcbiIsIChsb25nKSBlaGRycC0+ZV9lbnRyeSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImVfcGhvZmYgICAgICA9ICVsZFxuIiwgKGxvbmcpIGVoZHJwLT5lX3Bob2ZmKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZV9waG51bSAgICAgID0gJWxkXG4iLCAobG9uZykgZWhkcnAtPmVfcGhudW0pOwotICBmcHJpbnRmIChzdGRlcnIsICJlX3BoZW50c2l6ZSAgPSAlbGRcbiIsIChsb25nKSBlaGRycC0+ZV9waGVudHNpemUpOwotICBmcHJpbnRmIChzdGRlcnIsICJlX3Nob2ZmICAgICAgPSAlbGRcbiIsIChsb25nKSBlaGRycC0+ZV9zaG9mZik7Ci0gIGZwcmludGYgKHN0ZGVyciwgImVfc2hudW0gICAgICA9ICVsZFxuIiwgKGxvbmcpIGVoZHJwLT5lX3NobnVtKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZV9zaGVudHNpemUgID0gJWxkXG4iLCAobG9uZykgZWhkcnAtPmVfc2hlbnRzaXplKTsKLX0KLQotc3RhdGljIGNoYXIgKgotZWxmX3N5bWJvbF9mbGFncyAoZmxhZ3MpCi0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBzdGF0aWMgY2hhciBidWZmZXJbMTAyNF07Ci0KLSAgYnVmZmVyWzBdID0gJ1wwJzsKLSAgaWYgKGZsYWdzICYgQlNGX0xPQ0FMKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGxvY2FsIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0dMT0JBTCkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBnbG9iYWwiKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGRlYnVnIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0ZVTkNUSU9OKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGZ1bmN0aW9uIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0tFRVApCi0gICAgc3RyY2F0IChidWZmZXIsICIga2VlcCIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9LRUVQX0cpCi0gICAgc3RyY2F0IChidWZmZXIsICIga2VlcF9nIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX1dFQUspCi0gICAgc3RyY2F0IChidWZmZXIsICIgd2VhayIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBzZWN0aW9uLXN5bSIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9PTERfQ09NTU9OKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIG9sZC1jb21tb24iKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfTk9UX0FUX0VORCkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBub3QtYXQtZW5kIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGNvbnN0cnVjdG9yIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX1dBUk5JTkcpCi0gICAgc3RyY2F0IChidWZmZXIsICIgd2FybmluZyIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9JTkRJUkVDVCkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBpbmRpcmVjdCIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9GSUxFKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGZpbGUiKTsKLQotICBpZiAoZmxhZ3MgJiBEWU5BTUlDKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGR5bmFtaWMiKTsKLQotICBpZiAoZmxhZ3MgJiB+KEJTRl9MT0NBTAotCQl8IEJTRl9HTE9CQUwKLQkJfCBCU0ZfREVCVUdHSU5HCi0JCXwgQlNGX0ZVTkNUSU9OCi0JCXwgQlNGX0tFRVAKLQkJfCBCU0ZfS0VFUF9HCi0JCXwgQlNGX1dFQUsKLQkJfCBCU0ZfU0VDVElPTl9TWU0KLQkJfCBCU0ZfT0xEX0NPTU1PTgotCQl8IEJTRl9OT1RfQVRfRU5ECi0JCXwgQlNGX0NPTlNUUlVDVE9SCi0JCXwgQlNGX1dBUk5JTkcKLQkJfCBCU0ZfSU5ESVJFQ1QKLQkJfCBCU0ZfRklMRQotCQl8IEJTRl9EWU5BTUlDKSkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiB1bmtub3duLWJpdHMiKTsKLQotICByZXR1cm4gYnVmZmVyOwotfQotI2VuZGlmCi0MCi0jaW5jbHVkZSAiZWxmY29yZS5oIgotI2luY2x1ZGUgImVsZmxpbmsuaCIKLQwKLS8qIFNpemUtZGVwZW5kZW50IGRhdGEgYW5kIGZ1bmN0aW9ucy4gICovCi1jb25zdCBzdHJ1Y3QgZWxmX3NpemVfaW5mbyBOQU1FKF9iZmRfZWxmLHNpemVfaW5mbykgPSB7Ci0gIHNpemVvZiAoRWxmX0V4dGVybmFsX0VoZHIpLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9QaGRyKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU2hkciksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbCksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9EeW4pLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9Ob3RlKSwKLQotICBBUkNIX1NJWkUsIEZJTEVfQUxJR04sCi0gIEVMRkNMQVNTLCBFVl9DVVJSRU5ULAotICBlbGZfd3JpdGVfb3V0X3BoZHJzLAotICBlbGZfd3JpdGVfc2hkcnNfYW5kX2VoZHIsCi0gIHdyaXRlX3JlbG9jcywKLSAgZWxmX3N3YXBfc3ltYm9sX291dCwKLSAgZWxmX3NsdXJwX3JlbG9jX3RhYmxlLAotICBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlLAotICBlbGZfc3dhcF9keW5faW4KLX07CmRpZmYgLS1naXQgYS9iZmQvZWxmY29yZS5oIGIvYmZkL2VsZmNvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0NTRhYS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qIEVMRiBjb3JlIGZpbGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotY2hhcioKLWVsZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2NvbW1hbmQ7Ci19Ci0KLWludAotZWxmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9zaWduYWw7Ci19Ci0KLQotYm9vbGVhbgotZWxmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkOwotICAgICBiZmQgKmV4ZWNfYmZkOwotewotICBjaGFyKiBjb3JlbmFtZTsKLQotICAvKiB4dmVjcyBtdXN0IG1hdGNoIGlmIGJvdGggYXJlIEVMRiBmaWxlcyBmb3IgdGhlIHNhbWUgdGFyZ2V0LiAqLwotCi0gIGlmIChjb3JlX2JmZC0+eHZlYyAhPSBleGVjX2JmZC0+eHZlYykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTZWUgaWYgdGhlIG5hbWUgaW4gdGhlIGNvcmVmaWxlIG1hdGNoZXMgdGhlIGV4ZWN1dGFibGUgbmFtZS4gKi8KLQotICBjb3JlbmFtZSA9IGVsZl90ZGF0YSAoY29yZV9iZmQpLT5jb3JlX3Byb2dyYW07Ci0gIGlmIChjb3JlbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIqIGV4ZWNuYW1lID0gc3RycmNociAoZXhlY19iZmQtPmZpbGVuYW1lLCAnLycpOwotICAgICAgZXhlY25hbWUgPSBleGVjbmFtZSA/IGV4ZWNuYW1lICsgMSA6IGV4ZWNfYmZkLT5maWxlbmFtZTsKLQotICAgICAgaWYgKHN0cmNtcChleGVjbmFtZSwgY29yZW5hbWUpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiAgQ29yZSBmaWxlcyBhcmUgc2ltcGx5IHN0YW5kYXJkIEVMRiBmb3JtYXR0ZWQgZmlsZXMgdGhhdCBwYXJ0aXRpb24KLSAgICB0aGUgZmlsZSB1c2luZyB0aGUgZXhlY3V0aW9uIHZpZXcgb2YgdGhlIGZpbGUgKHByb2dyYW0gaGVhZGVyIHRhYmxlKQotICAgIHJhdGhlciB0aGFuIHRoZSBsaW5raW5nIHZpZXcuICBJbiBmYWN0LCB0aGVyZSBpcyBubyBzZWN0aW9uIGhlYWRlcgotICAgIHRhYmxlIGluIGEgY29yZSBmaWxlLgotCi0gICAgVGhlIHByb2Nlc3Mgc3RhdHVzIGluZm9ybWF0aW9uIChpbmNsdWRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBnZW5lcmFsCi0gICAgcmVnaXN0ZXIgc2V0KSBhbmQgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHNldCBhcmUgc3RvcmVkIGluIGEKLSAgICBzZWdtZW50IG9mIHR5cGUgUFRfTk9URS4gIFdlIGhhbmRjcmFmdCBhIGNvdXBsZSBvZiBleHRyYSBiZmQgc2VjdGlvbnMKLSAgICB0aGF0IGFsbG93IHN0YW5kYXJkIGJmZCBhY2Nlc3MgdG8gdGhlIGdlbmVyYWwgcmVnaXN0ZXJzICgucmVnKSBhbmQgdGhlCi0gICAgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzICgucmVnMikuCi0KLSAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWVsZl9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBFbGZfRXh0ZXJuYWxfRWhkciB4X2VoZHI7CS8qIEVsZiBmaWxlIGhlYWRlciwgZXh0ZXJuYWwgZm9ybSAqLwotICBFbGZfSW50ZXJuYWxfRWhkciAqaV9laGRycDsJLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0gIEVsZl9JbnRlcm5hbF9QaGRyICppX3BoZHJwOwkvKiBFbGYgcHJvZ3JhbSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KLSAgdW5zaWduZWQgaW50IHBoaW5kZXg7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICplYmQ7Ci0KLSAgLyogUmVhZCBpbiB0aGUgRUxGIGhlYWRlciBpbiBleHRlcm5hbCBmb3JtYXQuICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgeF9laGRyLCBzaXplb2YgKHhfZWhkciksIDEsIGFiZmQpICE9IHNpemVvZiAoeF9laGRyKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgdGhlIG1hZ2ljIG51bWJlci4gKi8KLSAgaWYgKGVsZl9maWxlX3AgKCZ4X2VoZHIpID09IGZhbHNlKQotICAgIHsKLSAgICB3cm9uZzoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBDaGVjayBFSV9WRVJTSU9OIGhlcmUgISAqLwotCi0gIC8qIENoZWNrIHRoZSBhZGRyZXNzIHNpemUgKCJjbGFzcyIpLiAqLwotICBpZiAoeF9laGRyLmVfaWRlbnRbRUlfQ0xBU1NdICE9IEVMRkNMQVNTKQotICAgIGdvdG8gd3Jvbmc7Ci0KLSAgLyogQ2hlY2sgdGhlIGJ5dGVvcmRlci4gKi8KLSAgc3dpdGNoICh4X2VoZHIuZV9pZGVudFtFSV9EQVRBXSkKLSAgICB7Ci0gICAgY2FzZSBFTEZEQVRBMk1TQjoJCS8qIEJpZy1lbmRpYW4gKi8KLSAgICAgIGlmICghIGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLQlnb3RvIHdyb25nOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFTEZEQVRBMkxTQjoJCS8qIExpdHRsZS1lbmRpYW4gKi8KLSAgICAgIGlmICghIGJmZF9saXR0bGVfZW5kaWFuIChhYmZkKSkKLQlnb3RvIHdyb25nOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGdvdG8gd3Jvbmc7Ci0gICAgfQotCi0gIC8qIEdpdmUgYWJmZCBhbiBlbGZfb2JqX3RkYXRhLiAqLwotICBlbGZfdGRhdGEgKGFiZmQpID0KLSAgICAoc3RydWN0IGVsZl9vYmpfdGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX29ial90ZGF0YSkpOwotICBpZiAoZWxmX3RkYXRhIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIEZJWE1FOiBmcm9tIGhlcmUgb24gZG93biwgImdvdG8gd3JvbmciIHdpbGwgbGVhayBtZW1vcnkuICAqLwotCi0gIC8qIFN3YXAgaW4gdGhlIHJlc3Qgb2YgdGhlIGhlYWRlciwgbm93IHRoYXQgd2UgaGF2ZSB0aGUgYnl0ZSBvcmRlci4gKi8KLSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOwotICBlbGZfc3dhcF9laGRyX2luIChhYmZkLCAmeF9laGRyLCBpX2VoZHJwKTsKLQotI2lmIERFQlVHICYgMQotICBlbGZfZGVidWdfZmlsZSAoaV9laGRycCk7Ci0jZW5kaWYKLQotICBlYmQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgLyogQ2hlY2sgdGhhdCB0aGUgRUxGIGVfbWFjaGluZSBmaWVsZCBtYXRjaGVzIHdoYXQgdGhpcyBwYXJ0aWN1bGFyCi0gICAgIEJGRCBmb3JtYXQgZXhwZWN0cy4gICovCi0KLSAgaWYgKGViZC0+ZWxmX21hY2hpbmVfY29kZSAhPSBpX2VoZHJwLT5lX21hY2hpbmUKLSAgICAgICYmIChlYmQtPmVsZl9tYWNoaW5lX2FsdDEgPT0gMAotCSAgfHwgaV9laGRycC0+ZV9tYWNoaW5lICE9IGViZC0+ZWxmX21hY2hpbmVfYWx0MSkKLSAgICAgICYmIChlYmQtPmVsZl9tYWNoaW5lX2FsdDIgPT0gMAotCSAgfHwgaV9laGRycC0+ZV9tYWNoaW5lICE9IGViZC0+ZWxmX21hY2hpbmVfYWx0MikpCi0gICAgewotICAgICAgY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0ICp0YXJnZXRfcHRyOwotCi0gICAgICBpZiAoZWJkLT5lbGZfbWFjaGluZV9jb2RlICE9IEVNX05PTkUpCi0JZ290byB3cm9uZzsKLQotICAgICAgLyogVGhpcyBpcyB0aGUgZ2VuZXJpYyBFTEYgdGFyZ2V0LiAgTGV0IGl0IG1hdGNoIGFueSBFTEYgdGFyZ2V0Ci0JIGZvciB3aGljaCB3ZSBkbyBub3QgaGF2ZSBhIHNwZWNpZmljIGJhY2tlbmQuICAqLwotCi0gICAgICBmb3IgKHRhcmdldF9wdHIgPSBiZmRfdGFyZ2V0X3ZlY3RvcjsgKnRhcmdldF9wdHIgIT0gTlVMTDsgdGFyZ2V0X3B0cisrKQotCXsKLQkgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiYWNrOwotCi0JICBpZiAoKCp0YXJnZXRfcHRyKS0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCSAgICBjb250aW51ZTsKLQkgIGJhY2sgPSAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKikgKCp0YXJnZXRfcHRyKS0+YmFja2VuZF9kYXRhOwotCSAgaWYgKGJhY2stPmVsZl9tYWNoaW5lX2NvZGUgPT0gaV9laGRycC0+ZV9tYWNoaW5lKQotCSAgICB7Ci0JICAgICAgLyogdGFyZ2V0X3B0ciBpcyBhbiBFTEYgYmFja2VuZCB3aGljaCBtYXRjaGVzIHRoaXMKLQkJIG9iamVjdCBmaWxlLCBzbyByZWplY3QgdGhlIGdlbmVyaWMgRUxGIHRhcmdldC4gICovCi0JICAgICAgZ290byB3cm9uZzsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhlcmUgaXMgbm8gcHJvZ3JhbSBoZWFkZXIsIG9yIHRoZSB0eXBlIGlzIG5vdCBhIGNvcmUgZmlsZSwgdGhlbgotICAgICB3ZSBhcmUgaG9zZWQuICovCi0gIGlmIChpX2VoZHJwLT5lX3Bob2ZmID09IDAgfHwgaV9laGRycC0+ZV90eXBlICE9IEVUX0NPUkUpCi0gICAgZ290byB3cm9uZzsKLQotICAvKiBEb2VzIEJGRCdzIGlkZWEgb2YgdGhlIHBoZHIgc2l6ZSBtYXRjaCB0aGUgc2l6ZQotICAgICByZWNvcmRlZCBpbiB0aGUgZmlsZT8gKi8KLSAgaWYgKGlfZWhkcnAtPmVfcGhlbnRzaXplICE9IHNpemVvZiAoRWxmX0V4dGVybmFsX1BoZHIpKQotICAgIGdvdG8gd3Jvbmc7Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBwcm9ncmFtIGhlYWRlcnMuICovCi0gIGlfcGhkcnAgPSAoRWxmX0ludGVybmFsX1BoZHIgKikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoKmlfcGhkcnApICogaV9laGRycC0+ZV9waG51bSk7Ci0gIGlmICghaV9waGRycCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBlbGZfdGRhdGEgKGFiZmQpLT5waGRyID0gaV9waGRycDsKLQotICAvKiBSZWFkIGFuZCBjb252ZXJ0IHRvIGludGVybmFsIGZvcm0uICovCi0gIGZvciAocGhpbmRleCA9IDA7IHBoaW5kZXggPCBpX2VoZHJwLT5lX3BobnVtOyArK3BoaW5kZXgpCi0gICAgewotICAgICAgRWxmX0V4dGVybmFsX1BoZHIgeF9waGRyOwotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmeF9waGRyLCBzaXplb2YgKHhfcGhkciksIDEsIGFiZmQpCi0JICAhPSBzaXplb2YgKHhfcGhkcikpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIGVsZl9zd2FwX3BoZHJfaW4gKGFiZmQsICZ4X3BoZHIsIGlfcGhkcnAgKyBwaGluZGV4KTsKLSAgICB9Ci0KLSAgLyogUHJvY2VzcyBlYWNoIHByb2dyYW0gaGVhZGVyLiAqLwotICBmb3IgKHBoaW5kZXggPSAwOyBwaGluZGV4IDwgaV9laGRycC0+ZV9waG51bTsgKytwaGluZGV4KQotICAgIHsKLSAgICAgIGlmICghX2JmZF9lbGZjb3JlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBpX3BoZHJwICsgcGhpbmRleCwgcGhpbmRleCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgbWFjaGluZSBhcmNoaXRlY3R1cmUuICovCi0gIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGViZC0+YXJjaCwgMCkpCi0gICAgewotICAgICAgLyogSXQncyBPSyBpZiB0aGlzIGZhaWxzIGZvciB0aGUgZ2VuZXJpYyB0YXJnZXQuICAqLwotICAgICAgaWYgKGViZC0+ZWxmX21hY2hpbmVfY29kZSAhPSBFTV9OT05FKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBTYXZlIHRoZSBlbnRyeSBwb2ludCBmcm9tIHRoZSBFTEYgaGVhZGVyLiAqLwotICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gaV9laGRycC0+ZV9lbnRyeTsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KZGlmZiAtLWdpdCBhL2JmZC9lbGZsaW5rLmMgYi9iZmQvZWxmbGluay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzBiMDQyLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGZsaW5rLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyogRUxGIGxpbmtpbmcgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNkZWZpbmUgQVJDSF9TSVpFIDAKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgaW50IHB0cmFsaWduOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZS4gICovCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5nb3QiKSAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN3aXRjaCAoYmVkLT5zLT5hcmNoX3NpemUpCi0gICAgewotICAgIGNhc2UgMzI6IHB0cmFsaWduID0gMjsgYnJlYWs7Ci0gICAgY2FzZSA2NDogcHRyYWxpZ24gPSAzOyBicmVhazsKLSAgICBkZWZhdWx0OiBhYm9ydCgpOwotICAgIH0KLQotICBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZCi0JICAgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdvdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBwdHJhbGlnbikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZWQtPndhbnRfZ290X3BsdCkKLSAgICB7Ci0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5nb3QucGx0Iik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBwdHJhbGlnbikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYXQgdGhlIHN0YXJ0IG9mIHRoZSAuZ290Ci0gICAgIChvciAuZ290LnBsdCkgc2VjdGlvbi4gIFdlIGRvbid0IGRvIHRoaXMgaW4gdGhlIGxpbmtlciBzY3JpcHQKLSAgICAgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGRlZmluZSB0aGUgc3ltYm9sIGlmIHdlIGFyZSBub3QgY3JlYXRpbmcKLSAgICAgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgaCA9IE5VTEw7Ci0gIGlmICghKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JKGluZm8sIGFiZmQsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iLCBCU0ZfR0xPQkFMLCBzLAotCSBiZWQtPmdvdF9zeW1ib2xfb2Zmc2V0LCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkgYmVkLT5jb2xsZWN0LCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0gIGlmIChpbmZvLT5zaGFyZWQKLSAgICAgICYmICEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QgPSBoOwotCi0gIC8qIFRoZSBmaXJzdCBiaXQgb2YgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgaXMgdGhlIGhlYWRlci4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBiZWQtPmdvdF9oZWFkZXJfc2l6ZSArIGJlZC0+Z290X3N5bWJvbF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0KLS8qIENyZWF0ZSBkeW5hbWljIHNlY3Rpb25zIHdoZW4gbGlua2luZyBhZ2FpbnN0IGEgZHluYW1pYyBvYmplY3QuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3MsIHBsdGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgaW50IHB0cmFsaWduOwotCi0gIHN3aXRjaCAoYmVkLT5zLT5hcmNoX3NpemUpCi0gICAgewotICAgIGNhc2UgMzI6IHB0cmFsaWduID0gMjsgYnJlYWs7Ci0gICAgY2FzZSA2NDogcHRyYWxpZ24gPSAzOyBicmVhazsKLSAgICBkZWZhdWx0OiBhYm9ydCgpOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSAucGx0LCAucmVsW2FdLnBsdCwgLmdvdCwgLmdvdC5wbHQsIC5keW5ic3MsIGFuZAotICAgICAucmVsW2FdLmJzcyBzZWN0aW9ucy4gICovCi0KLSAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQotICBwbHRmbGFncyA9IGZsYWdzOwotICBwbHRmbGFncyB8PSBTRUNfQ09ERTsKLSAgaWYgKGJlZC0+cGx0X25vdF9sb2FkZWQpCi0gICAgcGx0ZmxhZ3MgJj0gfiAoU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTKTsKLSAgaWYgKGJlZC0+cGx0X3JlYWRvbmx5KQotICAgIHBsdGZsYWdzIHw9IFNFQ19SRUFET05MWTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5wbHQiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIHBsdGZsYWdzKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBiZWQtPnBsdF9hbGlnbm1lbnQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmVkLT53YW50X3BsdF9zeW0pCi0gICAgewotICAgICAgLyogRGVmaW5lIHRoZSBzeW1ib2wgX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyBhdCB0aGUgc3RhcnQgb2YgdGhlCi0JIC5wbHQgc2VjdGlvbi4gICovCi0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7Ci0gICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgICAgIChpbmZvLCBhYmZkLCAiX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyIsIEJTRl9HTE9CQUwsIHMsCi0JICAgICAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCSAgICAgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICAgICAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmICEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIGJlZC0+dXNlX3JlbGFfcCA/ICIucmVsYS5wbHQiIDogIi5yZWwucGx0Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgcHRyYWxpZ24pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgLmR5bmJzcyBzZWN0aW9uIGlzIGEgcGxhY2UgdG8gcHV0IHN5bWJvbHMgd2hpY2ggYXJlIGRlZmluZWQKLSAgICAgYnkgZHluYW1pYyBvYmplY3RzLCBhcmUgcmVmZXJlbmNlZCBieSByZWd1bGFyIG9iamVjdHMsIGFuZCBhcmUKLSAgICAgbm90IGZ1bmN0aW9ucy4gIFdlIG11c3QgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZW0gaW4gdGhlIHByb2Nlc3MKLSAgICAgaW1hZ2UgYW5kIHVzZSBhIFJfKl9DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0gICAgIGluaXRpYWxpemUgdGhlbSBhdCBydW4gdGltZS4gIFRoZSBsaW5rZXIgc2NyaXB0IHB1dHMgdGhlIC5keW5ic3MKLSAgICAgc2VjdGlvbiBpbnRvIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGZpbmFsIGltYWdlLiAgKi8KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluYnNzIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBTRUNfQUxMT0MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgLnJlbFthXS5ic3Mgc2VjdGlvbiBob2xkcyBjb3B5IHJlbG9jcy4gIFRoaXMgc2VjdGlvbiBpcyBub3QKLSAgICAgbm9ybWFsbHkgbmVlZGVkLiAgV2UgbmVlZCB0byBjcmVhdGUgaXQgaGVyZSwgdGhvdWdoLCBzbyB0aGF0IHRoZQotICAgICBsaW5rZXIgd2lsbCBtYXAgaXQgdG8gYW4gb3V0cHV0IHNlY3Rpb24uICBXZSBjYW4ndCBqdXN0IGNyZWF0ZSBpdAotICAgICBvbmx5IGlmIHdlIG5lZWQgaXQsIGJlY2F1c2Ugd2Ugd2lsbCBub3Qga25vdyB3aGV0aGVyIHdlIG5lZWQgaXQKLSAgICAgdW50aWwgd2UgaGF2ZSBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMsIGFuZCB0aGUgZmlyc3QgdGltZSB0aGUKLSAgICAgbWFpbiBsaW5rZXIgY29kZSBjYWxscyBCRkQgYWZ0ZXIgZXhhbWluaW5nIGFsbCB0aGUgaW5wdXQgZmlsZXMKLSAgICAgKHNpemVfZHluYW1pY19zZWN0aW9ucykgdGhlIGlucHV0IHNlY3Rpb25zIGhhdmUgYWxyZWFkeSBiZWVuCi0gICAgIG1hcHBlZCB0byB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgSWYgdGhlIHNlY3Rpb24gdHVybnMgb3V0IG5vdCB0bwotICAgICBiZSBuZWVkZWQsIHdlIGNhbiBkaXNjYXJkIGl0IGxhdGVyLiAgV2Ugd2lsbCBuZXZlciBuZWVkIHRoaXMKLSAgICAgc2VjdGlvbiB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCBzaW5jZSB0aGV5IGRvIG5vdCB1c2UKLSAgICAgY29weSByZWxvY3MuICAqLwotICBpZiAoISBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIGJlZC0+dXNlX3JlbGFfcCA/ICIucmVsYS5ic3MiIDogIi5yZWwuYnNzIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIHB0cmFsaWduKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotCi0vKiBSZWNvcmQgYSBuZXcgZHluYW1pYyBzeW1ib2wuICBXZSByZWNvcmQgdGhlIGR5bmFtaWMgc3ltYm9scyBhcyB3ZQotICAgcmVhZCB0aGUgaW5wdXQgZmlsZXMsIHNpbmNlIHdlIG5lZWQgdG8gaGF2ZSBhIGxpc3Qgb2YgYWxsIG9mIHRoZW0KLSAgIGJlZm9yZSB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSBmaW5hbCBzaXplcyBvZiB0aGUgb3V0cHV0IHNlY3Rpb25zLgotICAgTm90ZSB0aGF0IHdlIG1heSBhY3R1YWxseSBjYWxsIHRoaXMgZnVuY3Rpb24gZXZlbiB0aG91Z2ggd2UgYXJlIG5vdAotICAgZ29pbmcgdG8gb3V0cHV0IGFueSBkeW5hbWljIHN5bWJvbHM7IGluIHNvbWUgY2FzZXMgd2Uga25vdyB0aGF0IGEKLSAgIHN5bWJvbCBzaG91bGQgYmUgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBidXQgb25seSBpZiB0aGVyZSBpcwotICAgb25lLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZHluc3RyOwotICAgICAgY2hhciAqcCwgKmFsYzsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIGNvcHk7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLSAgICAgIGgtPmR5bmluZHggPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotICAgICAgKytlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCi0gICAgICBkeW5zdHIgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cjsKLSAgICAgIGlmIChkeW5zdHIgPT0gTlVMTCkKLQl7Ci0JICAvKiBDcmVhdGUgYSBzdHJ0YWIgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2wgbmFtZXMuICAqLwotCSAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIgPSBkeW5zdHIgPSBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLQkgIGlmIChkeW5zdHIgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogV2UgZG9uJ3QgcHV0IGFueSB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIHRoZSBkeW5hbWljIHN0cmluZwotICAgICAgICAgdGFibGUuICAqLwotICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBwID0gc3RyY2hyIChuYW1lLCBFTEZfVkVSX0NIUik7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCXsKLQkgIGFsYyA9IE5VTEw7Ci0JICBjb3B5ID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFsYyA9IGJmZF9tYWxsb2MgKHAgLSBuYW1lICsgMSk7Ci0JICBpZiAoYWxjID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHN0cm5jcHkgKGFsYywgbmFtZSwgcCAtIG5hbWUpOwotCSAgYWxjW3AgLSBuYW1lXSA9ICdcMCc7Ci0JICBuYW1lID0gYWxjOwotCSAgY29weSA9IHRydWU7Ci0JfQotCi0gICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChkeW5zdHIsIG5hbWUsIHRydWUsIGNvcHkpOwotCi0gICAgICBpZiAoYWxjICE9IE5VTEwpCi0JZnJlZSAoYWxjKTsKLQotICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGgtPmR5bnN0cl9pbmRleCA9IGluZHg7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogQ3JlYXRlIGEgc3BlY2lhbCBsaW5rZXIgc2VjdGlvbiwgb3IgcmV0dXJuIGEgcG9pbnRlciB0byBhIGxpbmtlciBzZWN0aW9uIGFscmVhZHkgY3JlYXRlZCAgKi8KLQotZWxmX2xpbmtlcl9zZWN0aW9uX3QgKgotX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCB3aGljaCwgZGVmYXVsdHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0gd2hpY2g7Ci0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpkZWZhdWx0czsKLXsKLSAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0OwotCi0gIC8qIFJlY29yZCB0aGUgZmlyc3QgYmZkIHNlY3Rpb24gdGhhdCBuZWVkcyB0aGUgc3BlY2lhbCBzZWN0aW9uICovCi0gIGlmICghZHlub2JqKQotICAgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lLCBjcmVhdGUgdGhlIHNlY3Rpb24gKi8KLSAgbHNlY3QgPSBlbGZfbGlua2VyX3NlY3Rpb24gKGR5bm9iaiwgd2hpY2gpOwotICBpZiAoIWxzZWN0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBsc2VjdCA9IChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKQotCWJmZF9hbGxvYyAoZHlub2JqLCBzaXplb2YgKGVsZl9saW5rZXJfc2VjdGlvbl90KSk7Ci0KLSAgICAgICpsc2VjdCA9ICpkZWZhdWx0czsKLSAgICAgIGVsZl9saW5rZXJfc2VjdGlvbiAoZHlub2JqLCB3aGljaCkgPSBsc2VjdDsKLSAgICAgIGxzZWN0LT53aGljaCA9IHdoaWNoOwotICAgICAgbHNlY3QtPmhvbGVfd3JpdHRlbl9wID0gZmFsc2U7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGUgc2VjdGlvbnMgYWxyZWFkeSBleGlzdCAqLwotICAgICAgbHNlY3QtPnNlY3Rpb24gPSBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbHNlY3QtPm5hbWUpOwotICAgICAgaWYgKCFzIHx8IChzLT5mbGFncyAmIGRlZmF1bHRzLT5mbGFncykgIT0gZGVmYXVsdHMtPmZsYWdzKQotCXsKLQkgIGxzZWN0LT5zZWN0aW9uID0gcyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChkeW5vYmosIGxzZWN0LT5uYW1lKTsKLQotCSAgaWYgKHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0KLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzLCBkZWZhdWx0cy0+ZmxhZ3MpOwotCSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBsc2VjdC0+YWxpZ25tZW50KTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpIDwgbHNlY3QtPmFsaWdubWVudCkKLQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIGxzZWN0LT5hbGlnbm1lbnQpOwotCi0gICAgICBzLT5fcmF3X3NpemUgPSBhbGlnbl9wb3dlciAocy0+X3Jhd19zaXplLCBsc2VjdC0+YWxpZ25tZW50KTsKLQotICAgICAgLyogSXMgdGhlcmUgYSBob2xlIHdlIGhhdmUgdG8gcHJvdmlkZT8gIElmIHNvIGNoZWNrIHdoZXRoZXIgdGhlIHNlZ21lbnQgaXMKLQkgdG9vIGJpZyBhbHJlYWR5ICovCi0gICAgICBpZiAobHNlY3QtPmhvbGVfc2l6ZSkKLQl7Ci0JICBsc2VjdC0+aG9sZV9vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0JICBzLT5fcmF3X3NpemUgKz0gbHNlY3QtPmhvbGVfc2l6ZTsKLQkgIGlmIChsc2VjdC0+aG9sZV9vZmZzZXQgPiBsc2VjdC0+bWF4X2hvbGVfb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogU2VjdGlvbiAlcyBpcyBhbHJlYWR5IHRvIGxhcmdlIHRvIHB1dCBob2xlIG9mICVsZCBieXRlcyBpbiIpLAotCQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkJICAgICBsc2VjdC0+bmFtZSwKLQkJCQkgICAgIChsb25nKWxzZWN0LT5ob2xlX3NpemUpOwotCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0JICAgIH0KLQl9Ci0KLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ3JlYXRpbmcgc2VjdGlvbiAlcywgY3VycmVudCBzaXplID0gJWxkXG4iLAotCSAgICAgICBsc2VjdC0+bmFtZSwgKGxvbmcpcy0+X3Jhd19zaXplKTsKLSNlbmRpZgotCi0gICAgICBpZiAobHNlY3QtPnN5bV9uYW1lKQotCXsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAiQWRkaW5nICVzIHRvIHNlY3Rpb24gJXNcbiIsCi0JCSAgIGxzZWN0LT5zeW1fbmFtZSwKLQkJICAgbHNlY3QtPm5hbWUpOwotI2VuZGlmCi0JICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgIGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBsc2VjdC0+c3ltX25hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0JICBpZiAoKGggPT0gTlVMTCB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgICAgJiYgIShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywKLQkJCQkJCSAgICAgYWJmZCwKLQkJCQkJCSAgICAgbHNlY3QtPnN5bV9uYW1lLAotCQkJCQkJICAgICBCU0ZfR0xPQkFMLAotCQkJCQkJICAgICBzLAotCQkJCQkJICAgICAoKGxzZWN0LT5ob2xlX3NpemUpCi0JCQkJCQkgICAgICA/IHMtPl9yYXdfc2l6ZSAtIGxzZWN0LT5ob2xlX3NpemUgKyBsc2VjdC0+c3ltX29mZnNldAotCQkJCQkJICAgICAgOiBsc2VjdC0+c3ltX29mZnNldCksCi0JCQkJCQkgICAgIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCQkgICAgIGZhbHNlLAotCQkJCQkJICAgICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JCQkJCQkgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0KLQkgIGlmICgoZGVmYXVsdHMtPndoaWNoICE9IExJTktFUl9TRUNUSU9OX1NEQVRBKQotCSAgICAgICYmIChkZWZhdWx0cy0+d2hpY2ggIT0gTElOS0VSX1NFQ1RJT05fU0RBVEEyKSkKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDOwotCi0JICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQkgIGxzZWN0LT5zeW1faGFzaCA9IGg7Ci0KLQkgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICAmJiAhIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0JfQotICAgIH0KLQotI2lmIDAKLSAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIHNlbnNlLiAgVGhlIHNlY3Rpb25zIHdoaWNoIG1heSBleGlzdCBpbiB0aGUKLSAgICAgb2JqZWN0IGZpbGUgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggdGhlIHNlY3Rpb25zIHdlIHdhbnQgdG8KLSAgICAgY3JlYXRlLiAgKi8KLQotICAvKiBGaW5kIHRoZSByZWxhdGVkIHNlY3Rpb25zIGlmIHRoZXkgaGF2ZSBiZWVuIGNyZWF0ZWQgKi8KLSAgaWYgKGxzZWN0LT5ic3NfbmFtZSAmJiAhbHNlY3QtPmJzc19zZWN0aW9uKQotICAgIGxzZWN0LT5ic3Nfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIGxzZWN0LT5ic3NfbmFtZSk7Ci0KLSAgaWYgKGxzZWN0LT5yZWxfbmFtZSAmJiAhbHNlY3QtPnJlbF9zZWN0aW9uKQotICAgIGxzZWN0LT5yZWxfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIGxzZWN0LT5yZWxfbmFtZSk7Ci0jZW5kaWYKLQotICByZXR1cm4gbHNlY3Q7Ci19Ci0KLQwKLS8qIEZpbmQgYSBsaW5rZXIgZ2VuZXJhdGVkIHBvaW50ZXIgd2l0aCBhIGdpdmVuIGFkZGVuZCBhbmQgdHlwZS4gICovCi0KLWVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoKLV9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAobGlua2VyX3BvaW50ZXJzLCBhZGRlbmQsIHdoaWNoKQotICAgICBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqbGlua2VyX3BvaW50ZXJzOwotICAgICBiZmRfc2lnbmVkX3ZtYSBhZGRlbmQ7Ci0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Qgd2hpY2g7Ci17Ci0gIGZvciAoIDsgbGlua2VyX3BvaW50ZXJzICE9IE5VTEw7IGxpbmtlcl9wb2ludGVycyA9IGxpbmtlcl9wb2ludGVycy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAod2hpY2ggPT0gbGlua2VyX3BvaW50ZXJzLT53aGljaCAmJiBhZGRlbmQgPT0gbGlua2VyX3BvaW50ZXJzLT5hZGRlbmQpCi0JcmV0dXJuIGxpbmtlcl9wb2ludGVyczsKLSAgICB9Ci0KLSAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKTA7Ci19Ci0KLQwKLS8qIE1ha2UgdGhlIC5yZWxhIHNlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2VuZXJhdGVkIGxpbmtlciBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhIChkeW5vYmosIGxzZWN0LCBhbGlnbm1lbnQpCi0gICAgIGJmZCAqZHlub2JqOwotICAgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3Q7Ci0gICAgIGludCBhbGlnbm1lbnQ7Ci17Ci0gIGlmIChsc2VjdC0+cmVsX3NlY3Rpb24pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbHNlY3QtPnJlbF9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbHNlY3QtPnJlbF9uYW1lKTsKLSAgaWYgKGxzZWN0LT5yZWxfc2VjdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGxzZWN0LT5yZWxfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbHNlY3QtPnJlbF9uYW1lKTsKLSAgICAgIGlmIChsc2VjdC0+cmVsX3NlY3Rpb24gPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwKLQkJCQkgICAgICBsc2VjdC0+cmVsX3NlY3Rpb24sCi0JCQkJICAgICAgKFNFQ19BTExPQwotCQkJCSAgICAgICB8IFNFQ19MT0FECi0JCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkpKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIGxzZWN0LT5yZWxfc2VjdGlvbiwgYWxpZ25tZW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2VsZmxpbmsuaCBiL2JmZC9lbGZsaW5rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYmZhYjAuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZmxpbmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxNTAgKzAsMCBAQAotLyogRUxGIGxpbmtlciBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRUxGIGxpbmtlciBjb2RlLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIHJvdXRpbmVzIGNhbGxlZCB2aWEKLSAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2Ugd2hpY2ggbXVzdCByZXR1cm4gZmFpbHVyZS4gICovCi0KLXN0cnVjdCBlbGZfaW5mb19mYWlsZWQKLXsKLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotfTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbWVyZ2Vfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiwKLQkgICBib29sZWFuICosIGJvb2xlYW4gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfZXhwb3J0X3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9maXhfc3ltYm9sX2ZsYWdzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9jb2xsZWN0X2hhc2hfY29kZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLS8qIEdpdmVuIGFuIEVMRiBCRkQsIGFkZCBzeW1ib2xzIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBhcwotICAgYXBwcm9wcmlhdGUuICAqLwotCi1ib29sZWFuCi1lbGZfYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9mb3JtYXQgKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9vYmplY3Q6Ci0gICAgICByZXR1cm4gZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLSAgICBjYXNlIGJmZF9hcmNoaXZlOgotICAgICAgcmV0dXJuIGVsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8pOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0MCi0KLS8qIEFkZCBzeW1ib2xzIGZyb20gYW4gRUxGIGFyY2hpdmUgZmlsZSB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuICBXZQotICAgZG9uJ3QgdXNlIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgYmVjYXVzZSBvZiBhCi0gICBwcm9ibGVtIHdoaWNoIGFyaXNlcyBvbiBVbml4V2FyZS4gIFRoZSBVbml4V2FyZSBsaWJjLnNvIGlzIGFuCi0gICBhcmNoaXZlIHdoaWNoIGluY2x1ZGVzIGFuIGVudHJ5IGxpYmMuc28uMSB3aGljaCBkZWZpbmVzIGEgYnVuY2ggb2YKLSAgIHN5bWJvbHMuICBUaGUgbGliYy5zbyBhcmNoaXZlIGFsc28gaW5jbHVkZXMgYSBudW1iZXIgb2Ygb3RoZXIKLSAgIG9iamVjdCBmaWxlcywgd2hpY2ggYWxzbyBkZWZpbmUgc3ltYm9scywgc29tZSBvZiB3aGljaCBhcmUgdGhlIHNhbWUKLSAgIGFzIHRob3NlIGRlZmluZWQgaW4gbGliYy5zby4xLiAgQ29ycmVjdCBsaW5raW5nIHJlcXVpcmVzIHRoYXQgd2UKLSAgIGNvbnNpZGVyIGVhY2ggb2JqZWN0IGZpbGUgaW4gdHVybiwgYW5kIGluY2x1ZGUgaXQgaWYgaXQgZGVmaW5lcyBhbnkKLSAgIHN5bWJvbHMgd2UgbmVlZC4gIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgZG9lcyBub3QgZG8KLSAgIHRoaXM7IGl0IGxvb2tzIHRocm91Z2ggdGhlIGxpc3Qgb2YgdW5kZWZpbmVkIHN5bWJvbHMsIGFuZCBpbmNsdWRlcwotICAgYW55IG9iamVjdCBmaWxlIHdoaWNoIGRlZmluZXMgdGhlbS4gIFdoZW4gdGhpcyBhbGdvcml0aG0gaXMgdXNlZCBvbgotICAgVW5peFdhcmUsIGl0IHdpbmRzIHVwIHB1bGxpbmcgaW4gbGliYy5zby4xIGVhcmx5IGFuZCBkZWZpbmluZyBhCi0gICBidW5jaCBvZiBzeW1ib2xzLiAgVGhpcyBtZWFucyB0aGF0IHNvbWUgb2YgdGhlIG90aGVyIG9iamVjdHMgaW4gdGhlCi0gICBhcmNoaXZlIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGxpbmssIHdoaWNoIGlzIGluY29ycmVjdCBzaW5jZSB0aGV5Ci0gICBwcmVjZWRlIGxpYmMuc28uMSBpbiB0aGUgYXJjaGl2ZS4KLQotICAgRm9ydHVuYXRlbHksIEVMRiBhcmNoaXZlIGhhbmRsaW5nIGlzIHNpbXBsZXIgdGhhbiB0aGF0IGRvbmUgYnkKLSAgIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMsIHdoaWNoIGhhcyB0byBhbGxvdyBmb3IgYS5vdXQKLSAgIG9kZGl0aWVzLiAgSW4gRUxGLCBpZiB3ZSBmaW5kIGEgc3ltYm9sIGluIHRoZSBhcmNoaXZlIG1hcCwgYW5kIHRoZQotICAgc3ltYm9sIGlzIGN1cnJlbnRseSB1bmRlZmluZWQsIHdlIGtub3cgdGhhdCB3ZSBtdXN0IHB1bGwgaW4gdGhhdAotICAgb2JqZWN0IGZpbGUuCi0KLSAgIFVuZm9ydHVuYXRlbHksIHdlIGRvIGhhdmUgdG8gbWFrZSBtdWx0aXBsZSBwYXNzZXMgb3ZlciB0aGUgc3ltYm9sCi0gICB0YWJsZSB1bnRpbCBub3RoaW5nIGZ1cnRoZXIgaXMgcmVzb2x2ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3ltaW5kZXggYzsKLSAgYm9vbGVhbiAqZGVmaW5lZCA9IE5VTEw7Ci0gIGJvb2xlYW4gKmluY2x1ZGVkID0gTlVMTDsKLSAgY2Fyc3ltICpzeW1kZWZzOwotICBib29sZWFuIGxvb3A7Ci0KLSAgaWYgKCEgYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIEFuIGVtcHR5IGFyY2hpdmUgaXMgYSBzcGVjaWFsIGNhc2UuICAqLwotICAgICAgaWYgKGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCkgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19hcm1hcCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEtlZXAgdHJhY2sgb2YgYWxsIHN5bWJvbHMgd2Uga25vdyB0byBiZSBhbHJlYWR5IGRlZmluZWQsIGFuZCBhbGwKLSAgICAgZmlsZXMgd2Uga25vdyB0byBiZSBhbHJlYWR5IGluY2x1ZGVkLiAgVGhpcyBpcyB0byBzcGVlZCB1cCB0aGUKLSAgICAgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IHBhc3Nlcy4gICovCi0gIGMgPSBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmX2NvdW50OwotICBpZiAoYyA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICBkZWZpbmVkID0gKGJvb2xlYW4gKikgYmZkX21hbGxvYyAoYyAqIHNpemVvZiAoYm9vbGVhbikpOwotICBpbmNsdWRlZCA9IChib29sZWFuICopIGJmZF9tYWxsb2MgKGMgKiBzaXplb2YgKGJvb2xlYW4pKTsKLSAgaWYgKGRlZmluZWQgPT0gKGJvb2xlYW4gKikgTlVMTCB8fCBpbmNsdWRlZCA9PSAoYm9vbGVhbiAqKSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBtZW1zZXQgKGRlZmluZWQsIDAsIGMgKiBzaXplb2YgKGJvb2xlYW4pKTsKLSAgbWVtc2V0IChpbmNsdWRlZCwgMCwgYyAqIHNpemVvZiAoYm9vbGVhbikpOwotCi0gIHN5bWRlZnMgPSBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmczsKLQotICBkbwotICAgIHsKLSAgICAgIGZpbGVfcHRyIGxhc3Q7Ci0gICAgICBzeW1pbmRleCBpOwotICAgICAgY2Fyc3ltICpzeW1kZWY7Ci0gICAgICBjYXJzeW0gKnN5bWRlZmVuZDsKLQotICAgICAgbG9vcCA9IGZhbHNlOwotICAgICAgbGFzdCA9IC0xOwotCi0gICAgICBzeW1kZWYgPSBzeW1kZWZzOwotICAgICAgc3ltZGVmZW5kID0gc3ltZGVmICsgYzsKLSAgICAgIGZvciAoaSA9IDA7IHN5bWRlZiA8IHN5bWRlZmVuZDsgc3ltZGVmKyssIGkrKykKLQl7Ci0JICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQkgIGJmZCAqZWxlbWVudDsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICp1bmRlZnNfdGFpbDsKLQkgIHN5bWluZGV4IG1hcms7Ci0KLQkgIGlmIChkZWZpbmVkW2ldIHx8IGluY2x1ZGVkW2ldKQotCSAgICBjb250aW51ZTsKLQkgIGlmIChzeW1kZWYtPmZpbGVfb2Zmc2V0ID09IGxhc3QpCi0JICAgIHsKLQkgICAgICBpbmNsdWRlZFtpXSA9IHRydWU7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIHN5bWRlZi0+bmFtZSwKLQkJCQkgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBjaGFyICpwLCAqY29weTsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBkZWZhdWx0IHZlcnNpb24gKHRoZSBuYW1lIGNvbnRhaW5zIEBAKSwKLQkJIGxvb2sgdXAgdGhlIHN5bWJvbCBhZ2FpbiB3aXRob3V0IHRoZSB2ZXJzaW9uLiAgVGhlCi0JCSBlZmZlY3QgaXMgdGhhdCByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgd2l0aG91dCB0aGUKLQkJIHZlcnNpb24gd2lsbCBiZSBtYXRjaGVkIGJ5IHRoZSBkZWZhdWx0IHN5bWJvbCBpbiB0aGUKLQkJIGFyY2hpdmUuICAqLwotCi0JICAgICAgcCA9IHN0cmNociAoc3ltZGVmLT5uYW1lLCBFTEZfVkVSX0NIUik7Ci0JICAgICAgaWYgKHAgPT0gTlVMTCB8fCBwWzFdICE9IEVMRl9WRVJfQ0hSKQotCQljb250aW51ZTsKLQotCSAgICAgIGNvcHkgPSBiZmRfYWxsb2MgKGFiZmQsIHAgLSBzeW1kZWYtPm5hbWUgKyAxKTsKLQkgICAgICBpZiAoY29weSA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBtZW1jcHkgKGNvcHksIHN5bWRlZi0+bmFtZSwgcCAtIHN5bWRlZi0+bmFtZSk7Ci0JICAgICAgY29weVtwIC0gc3ltZGVmLT5uYW1lXSA9ICdcMCc7Ci0KLQkgICAgICBoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgY29weSwKLQkJCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLQkgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgY29weSk7Ci0JICAgIH0KLQotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQlkZWZpbmVkW2ldID0gdHJ1ZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBXZSBuZWVkIHRvIGluY2x1ZGUgdGhpcyBhcmNoaXZlIG1lbWJlci4gICovCi0KLQkgIGVsZW1lbnQgPSBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYWJmZCwgc3ltZGVmLT5maWxlX29mZnNldCk7Ci0JICBpZiAoZWxlbWVudCA9PSAoYmZkICopIE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChlbGVtZW50LCBiZmRfb2JqZWN0KSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIERvdWJsZWNoZWNrIHRoYXQgd2UgaGF2ZSBub3QgaW5jbHVkZWQgdGhpcyBvYmplY3QKLQkgICAgIGFscmVhZHktLWl0IHNob3VsZCBiZSBpbXBvc3NpYmxlLCBidXQgdGhlcmUgbWF5IGJlCi0JICAgICBzb21ldGhpbmcgd3Jvbmcgd2l0aCB0aGUgYXJjaGl2ZS4gICovCi0JICBpZiAoZWxlbWVudC0+YXJjaGl2ZV9wYXNzICE9IDApCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgZWxlbWVudC0+YXJjaGl2ZV9wYXNzID0gMTsKLQotCSAgdW5kZWZzX3RhaWwgPSBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbDsKLQotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBlbGVtZW50LAotCQkJCQkJCSBzeW1kZWYtPm5hbWUpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmICghIGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoZWxlbWVudCwgaW5mbykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBJZiB0aGVyZSBhcmUgYW55IG5ldyB1bmRlZmluZWQgc3ltYm9scywgd2UgbmVlZCB0byBtYWtlCi0JICAgICBhbm90aGVyIHBhc3MgdGhyb3VnaCB0aGUgYXJjaGl2ZSBpbiBvcmRlciB0byBzZWUgd2hldGhlcgotCSAgICAgdGhleSBjYW4gYmUgZGVmaW5lZC4gIEZJWE1FOiBUaGlzIGlzbid0IHBlcmZlY3QsIGJlY2F1c2UKLQkgICAgIGNvbW1vbiBzeW1ib2xzIHdpbmQgdXAgb24gdW5kZWZzX3RhaWwgYW5kIGJlY2F1c2UgYW4KLQkgICAgIHVuZGVmaW5lZCBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBsYXRlciBvbiBpbiB0aGlzIHBhc3MKLQkgICAgIGRvZXMgbm90IHJlcXVpcmUgYW5vdGhlciBwYXNzLiAgVGhpcyBpc24ndCBhIGJ1ZywgYnV0IGl0Ci0JICAgICBkb2VzIG1ha2UgdGhlIGNvZGUgbGVzcyBlZmZpY2llbnQgdGhhbiBpdCBjb3VsZCBiZS4gICovCi0JICBpZiAodW5kZWZzX3RhaWwgIT0gaW5mby0+aGFzaC0+dW5kZWZzX3RhaWwpCi0JICAgIGxvb3AgPSB0cnVlOwotCi0JICAvKiBMb29rIGJhY2t3YXJkIHRvIG1hcmsgYWxsIHN5bWJvbHMgZnJvbSB0aGlzIG9iamVjdCBmaWxlCi0JICAgICB3aGljaCB3ZSBoYXZlIGFscmVhZHkgc2VlbiBpbiB0aGlzIHBhc3MuICAqLwotCSAgbWFyayA9IGk7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgaW5jbHVkZWRbbWFya10gPSB0cnVlOwotCSAgICAgIGlmIChtYXJrID09IDApCi0JCWJyZWFrOwotCSAgICAgIC0tbWFyazsKLQkgICAgfQotCSAgd2hpbGUgKHN5bWRlZnNbbWFya10uZmlsZV9vZmZzZXQgPT0gc3ltZGVmLT5maWxlX29mZnNldCk7Ci0KLQkgIC8qIFdlIG1hcmsgc3Vic2VxdWVudCBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QgZmlsZSBhcyB3ZSBnbwotCSAgICAgb24gdGhyb3VnaCB0aGUgbG9vcC4gICovCi0JICBsYXN0ID0gc3ltZGVmLT5maWxlX29mZnNldDsKLQl9Ci0gICAgfQotICB3aGlsZSAobG9vcCk7Ci0KLSAgZnJlZSAoZGVmaW5lZCk7Ci0gIGZyZWUgKGluY2x1ZGVkKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGRlZmluZWQgIT0gKGJvb2xlYW4gKikgTlVMTCkKLSAgICBmcmVlIChkZWZpbmVkKTsKLSAgaWYgKGluY2x1ZGVkICE9IChib29sZWFuICopIE5VTEwpCi0gICAgZnJlZSAoaW5jbHVkZWQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2Ugd2FudCB0byBkZWZpbmUgYSBuZXcgc3ltYm9sLiAgSXQKLSAgIGhhbmRsZXMgdGhlIHZhcmlvdXMgY2FzZXMgd2hpY2ggYXJpc2Ugd2hlbiB3ZSBmaW5kIGEgZGVmaW5pdGlvbiBpbgotICAgYSBkeW5hbWljIG9iamVjdCwgb3Igd2hlbiB0aGVyZSBpcyBhbHJlYWR5IGEgZGVmaW5pdGlvbiBpbiBhCi0gICBkeW5hbWljIG9iamVjdC4gIFRoZSBuZXcgc3ltYm9sIGlzIGRlc2NyaWJlZCBieSBOQU1FLCBTWU0sIFBTRUMsCi0gICBhbmQgUFZBTFVFLiAgV2Ugc2V0IFNZTV9IQVNIIHRvIHRoZSBoYXNoIHRhYmxlIGVudHJ5LiAgV2Ugc2V0Ci0gICBPVkVSUklERSBpZiB0aGUgb2xkIHN5bWJvbCBpcyBvdmVycmlkaW5nIGEgbmV3IGRlZmluaXRpb24uICBXZSBzZXQKLSAgIFRZUEVfQ0hBTkdFX09LIGlmIGl0IGlzIE9LIGZvciB0aGUgdHlwZSB0byBjaGFuZ2UuICBXZSBzZXQKLSAgIFNJWkVfQ0hBTkdFX09LIGlmIGl0IGlzIE9LIGZvciB0aGUgc2l6ZSB0byBjaGFuZ2UuICBCeSBPSyB0bwotICAgY2hhbmdlLCB3ZSBtZWFuIHRoYXQgd2Ugc2hvdWxkbid0IHdhcm4gaWYgdGhlIHR5cGUgb3Igc2l6ZSBkb2VzCi0gICBjaGFuZ2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX21lcmdlX3N5bWJvbCAoYWJmZCwgaW5mbywgbmFtZSwgc3ltLCBwc2VjLCBwdmFsdWUsIHN5bV9oYXNoLAotCQkgIG92ZXJyaWRlLCB0eXBlX2NoYW5nZV9vaywgc2l6ZV9jaGFuZ2Vfb2spCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgYXNlY3Rpb24gKipwc2VjOwotICAgICBiZmRfdm1hICpwdmFsdWU7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7Ci0gICAgIGJvb2xlYW4gKm92ZXJyaWRlOwotICAgICBib29sZWFuICp0eXBlX2NoYW5nZV9vazsKLSAgICAgYm9vbGVhbiAqc2l6ZV9jaGFuZ2Vfb2s7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBpbnQgYmluZDsKLSAgYmZkICpvbGRiZmQ7Ci0gIGJvb2xlYW4gbmV3ZHluLCBvbGRkeW4sIG9sZGRlZiwgbmV3ZGVmLCBuZXdkeW5jb21tb24sIG9sZGR5bmNvbW1vbjsKLQotICAqb3ZlcnJpZGUgPSBmYWxzZTsKLQotICBzZWMgPSAqcHNlYzsKLSAgYmluZCA9IEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pOwotCi0gIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSkKLSAgICBoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLSAgZWxzZQotICAgIGggPSAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sIG5hbWUsIHRydWUsIGZhbHNlLCBmYWxzZSkpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgKnN5bV9oYXNoID0gaDsKLQotICAvKiBUaGlzIGNvZGUgaXMgZm9yIGNvcGluZyB3aXRoIGR5bmFtaWMgb2JqZWN0cywgYW5kIGlzIG9ubHkgdXNlZnVsCi0gICAgIGlmIHdlIGFyZSBkb2luZyBhbiBFTEYgbGluay4gICovCi0gIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yICE9IGFiZmQtPnh2ZWMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRm9yIG1lcmdpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCByZWFsIHN5bWJvbHMuICAqLwotCi0gIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQotICAvKiBJZiB3ZSBqdXN0IGNyZWF0ZWQgdGhlIHN5bWJvbCwgbWFyayBpdCBhcyBiZWluZyBhbiBFTEYgc3ltYm9sLgotICAgICBPdGhlciB0aGFuIHRoYXQsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8tLXRoZXJlIGlzIG5vIG1lcmdlIGlzc3VlCi0gICAgIHdpdGggYSBuZXdseSBkZWZpbmVkIHN5bWJvbC0tc28gd2UganVzdCByZXR1cm4uICAqLwotCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0gICAgewotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBPTERCRkQgaXMgYSBCRkQgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGlzdGluZyBzeW1ib2wuICAqLwotCi0gIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgb2xkYmZkID0gTlVMTDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgb2xkYmZkID0gaC0+cm9vdC51LnVuZGVmLmFiZmQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgb2xkYmZkID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIG9sZGJmZCA9IGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPm93bmVyOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIE5FV0RZTiBhbmQgT0xERFlOIGluZGljYXRlIHdoZXRoZXIgdGhlIG5ldyBvciBvbGQgc3ltYm9sLAotICAgICByZXNwZWN0aXZlbHksIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdC4gICovCi0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgbmV3ZHluID0gdHJ1ZTsKLSAgZWxzZQotICAgIG5ld2R5biA9IGZhbHNlOwotCi0gIGlmIChvbGRiZmQgPT0gTlVMTCB8fCAob2xkYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0gICAgb2xkZHluID0gZmFsc2U7Ci0gIGVsc2UKLSAgICBvbGRkeW4gPSB0cnVlOwotCi0gIC8qIE5FV0RFRiBhbmQgT0xEREVGIGluZGljYXRlIHdoZXRoZXIgdGhlIG5ldyBvciBvbGQgc3ltYm9sLAotICAgICByZXNwZWN0aXZlbHksIGFwcGVhciB0byBiZSBhIGRlZmluaXRpb24gcmF0aGVyIHRoYW4gcmVmZXJlbmNlLiAgKi8KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWMpIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKLSAgICBuZXdkZWYgPSBmYWxzZTsKLSAgZWxzZQotICAgIG5ld2RlZiA9IHRydWU7Ci0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0gICAgb2xkZGVmID0gZmFsc2U7Ci0gIGVsc2UKLSAgICBvbGRkZWYgPSB0cnVlOwotCi0gIC8qIE5FV0RZTkNPTU1PTiBhbmQgT0xERFlOQ09NTU9OIGluZGljYXRlIHdoZXRoZXIgdGhlIG5ldyBvciBvbGQKLSAgICAgc3ltYm9sLCByZXNwZWN0aXZlbHksIGFwcGVhcnMgdG8gYmUgYSBjb21tb24gc3ltYm9sIGluIGEgZHluYW1pYwotICAgICBvYmplY3QuICBJZiBhIHN5bWJvbCBhcHBlYXJzIGluIGFuIHVuaW5pdGlhbGl6ZWQgc2VjdGlvbiwgYW5kIGlzCi0gICAgIG5vdCB3ZWFrLCBhbmQgaXMgbm90IGEgZnVuY3Rpb24sIHRoZW4gaXQgbWF5IGJlIGEgY29tbW9uIHN5bWJvbAotICAgICB3aGljaCB3YXMgcmVzb2x2ZWQgd2hlbiB0aGUgZHluYW1pYyBvYmplY3Qgd2FzIGNyZWF0ZWQuICBXZSB3YW50Ci0gICAgIHRvIHRyZWF0IHN1Y2ggc3ltYm9scyBzcGVjaWFsbHksIGJlY2F1c2UgdGhleSByYWlzZSBzcGVjaWFsCi0gICAgIGNvbnNpZGVyYXRpb25zIHdoZW4gc2V0dGluZyB0aGUgc3ltYm9sIHNpemU6IGlmIHRoZSBzeW1ib2wKLSAgICAgYXBwZWFycyBhcyBhIGNvbW1vbiBzeW1ib2wgaW4gYSByZWd1bGFyIG9iamVjdCwgYW5kIHRoZSBzaXplIGluCi0gICAgIHRoZSByZWd1bGFyIG9iamVjdCBpcyBsYXJnZXIsIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgd2UgdXNlIHRoZQotICAgICBsYXJnZXIgc2l6ZS4gIFRoaXMgcHJvYmxlbWF0aWMgY2FzZSBjYW4gYWx3YXlzIGJlIGF2b2lkZWQgaW4gQywKLSAgICAgYnV0IGl0IG11c3QgYmUgaGFuZGxlZCBjb3JyZWN0bHkgd2hlbiB1c2luZyBGb3J0cmFuIHNoYXJlZAotICAgICBsaWJyYXJpZXMuCi0KLSAgICAgTm90ZSB0aGF0IGlmIE5FV0RZTkNPTU1PTiBpcyBzZXQsIE5FV0RFRiB3aWxsIGJlIHNldCwgYW5kCi0gICAgIGxpa2V3aXNlIGZvciBPTEREWU5DT01NT04gYW5kIE9MRERFRi4KLQotICAgICBOb3RlIHRoYXQgdGhpcyB0ZXN0IGlzIGp1c3QgYSBoZXVyaXN0aWMsIGFuZCB0aGF0IGl0IGlzIHF1aXRlCi0gICAgIHBvc3NpYmxlIHRvIGhhdmUgYW4gdW5pbml0aWFsaXplZCBzeW1ib2wgaW4gYSBzaGFyZWQgb2JqZWN0IHdoaWNoCi0gICAgIGlzIHJlYWxseSBhIGRlZmluaXRpb24sIHJhdGhlciB0aGFuIGEgY29tbW9uIHN5bWJvbC4gIFRoaXMgY291bGQKLSAgICAgbGVhZCB0byBzb21lIG1pbm9yIGNvbmZ1c2lvbiB3aGVuIHRoZSBzeW1ib2wgcmVhbGx5IGlzIGEgY29tbW9uCi0gICAgIHN5bWJvbCBpbiBzb21lIHJlZ3VsYXIgb2JqZWN0LiAgSG93ZXZlciwgSSB0aGluayBpdCB3aWxsIGJlCi0gICAgIGhhcm1sZXNzLiAgKi8KLQotICBpZiAobmV3ZHluCi0gICAgICAmJiBuZXdkZWYKLSAgICAgICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0gICAgICAmJiAoc2VjLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwCi0gICAgICAmJiBzeW0tPnN0X3NpemUgPiAwCi0gICAgICAmJiBiaW5kICE9IFNUQl9XRUFLCi0gICAgICAmJiBFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfRlVOQykKLSAgICBuZXdkeW5jb21tb24gPSB0cnVlOwotICBlbHNlCi0gICAgbmV3ZHluY29tbW9uID0gZmFsc2U7Ci0KLSAgaWYgKG9sZGR5bgotICAgICAgJiYgb2xkZGVmCi0gICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLSAgICAgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0gICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwCi0gICAgICAmJiBoLT5zaXplID4gMAotICAgICAgJiYgaC0+dHlwZSAhPSBTVFRfRlVOQykKLSAgICBvbGRkeW5jb21tb24gPSB0cnVlOwotICBlbHNlCi0gICAgb2xkZHluY29tbW9uID0gZmFsc2U7Ci0KLSAgLyogSXQncyBPSyB0byBjaGFuZ2UgdGhlIHR5cGUgaWYgZWl0aGVyIHRoZSBleGlzdGluZyBzeW1ib2wgb3IgdGhlCi0gICAgIG5ldyBzeW1ib2wgaXMgd2Vhay4gICovCi0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawotICAgICAgfHwgYmluZCA9PSBTVEJfV0VBSykKLSAgICAqdHlwZV9jaGFuZ2Vfb2sgPSB0cnVlOwotCi0gIC8qIEl0J3MgT0sgdG8gY2hhbmdlIHRoZSBzaXplIGlmIGVpdGhlciB0aGUgZXhpc3Rpbmcgc3ltYm9sIG9yIHRoZQotICAgICBuZXcgc3ltYm9sIGlzIHdlYWssIG9yIGlmIHRoZSBvbGQgc3ltYm9sIGlzIHVuZGVmaW5lZC4gICovCi0KLSAgaWYgKCp0eXBlX2NoYW5nZV9vawotICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotICAgICpzaXplX2NoYW5nZV9vayA9IHRydWU7Ci0KLSAgLyogSWYgYm90aCB0aGUgb2xkIGFuZCB0aGUgbmV3IHN5bWJvbHMgbG9vayBsaWtlIGNvbW1vbiBzeW1ib2xzIGluIGEKLSAgICAgZHluYW1pYyBvYmplY3QsIHNldCB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIHRvIHRoZSBsYXJnZXIgb2YgdGhlCi0gICAgIHR3by4gICovCi0KLSAgaWYgKG9sZGR5bmNvbW1vbgotICAgICAgJiYgbmV3ZHluY29tbW9uCi0gICAgICAmJiBzeW0tPnN0X3NpemUgIT0gaC0+c2l6ZSkKLSAgICB7Ci0gICAgICAvKiBTaW5jZSB3ZSB0aGluayB3ZSBoYXZlIHR3byBjb21tb24gc3ltYm9scywgaXNzdWUgYSBtdWx0aXBsZQotICAgICAgICAgY29tbW9uIHdhcm5pbmcgaWYgZGVzaXJlZC4gIE5vdGUgdGhhdCB3ZSBvbmx5IHdhcm4gaWYgdGhlCi0gICAgICAgICBzaXplIGlzIGRpZmZlcmVudC4gIElmIHRoZSBzaXplIGlzIHRoZSBzYW1lLCB3ZSBzaW1wbHkgbGV0Ci0gICAgICAgICB0aGUgb2xkIHN5bWJvbCBvdmVycmlkZSB0aGUgbmV3IG9uZSBhcyBub3JtYWxseSBoYXBwZW5zIHdpdGgKLSAgICAgICAgIHN5bWJvbHMgZGVmaW5lZCBpbiBkeW5hbWljIG9iamVjdHMuICAqLwotCi0gICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2NvbW1vbikKLQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBvbGRiZmQsIGJmZF9saW5rX2hhc2hfY29tbW9uLAotCSAgICAgIGgtPnNpemUsIGFiZmQsIGJmZF9saW5rX2hhc2hfY29tbW9uLCBzeW0tPnN0X3NpemUpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChzeW0tPnN0X3NpemUgPiBoLT5zaXplKQotCWgtPnNpemUgPSBzeW0tPnN0X3NpemU7Ci0KLSAgICAgICpzaXplX2NoYW5nZV9vayA9IHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBsb29raW5nIGF0IGEgZHluYW1pYyBvYmplY3QsIGFuZCB3ZSBoYXZlIGZvdW5kIGEKLSAgICAgZGVmaW5pdGlvbiwgd2UgbmVlZCB0byBzZWUgaWYgdGhlIHN5bWJvbCB3YXMgYWxyZWFkeSBkZWZpbmVkIGJ5Ci0gICAgIHNvbWUgb3RoZXIgb2JqZWN0LiAgSWYgc28sIHdlIHdhbnQgdG8gdXNlIHRoZSBleGlzdGluZwotICAgICBkZWZpbml0aW9uLCBhbmQgd2UgZG8gbm90IHdhbnQgdG8gcmVwb3J0IGEgbXVsdGlwbGUgc3ltYm9sCi0gICAgIGRlZmluaXRpb24gZXJyb3I7IHdlIGRvIHRoaXMgYnkgY2xvYmJlcmluZyAqUFNFQyB0byBiZQotICAgICBiZmRfdW5kX3NlY3Rpb25fcHRyLgotCi0gICAgIFdlIHRyZWF0IGEgY29tbW9uIHN5bWJvbCBhcyBhIGRlZmluaXRpb24gaWYgdGhlIHN5bWJvbCBpbiB0aGUKLSAgICAgc2hhcmVkIGxpYnJhcnkgaXMgYSBmdW5jdGlvbiwgc2luY2UgY29tbW9uIHN5bWJvbHMgYWx3YXlzCi0gICAgIHJlcHJlc2VudCB2YXJpYWJsZXM7IHRoaXMgY2FuIGNhdXNlIGNvbmZ1c2lvbiBpbiBwcmluY2lwbGUsIGJ1dAotICAgICBhbnkgc3VjaCBjb25mdXNpb24gd291bGQgc2VlbSB0byBpbmRpY2F0ZSBhbiBlcnJvbmVvdXMgcHJvZ3JhbSBvcgotICAgICBzaGFyZWQgbGlicmFyeS4gIFdlIGFsc28gcGVybWl0IGEgY29tbW9uIHN5bWJvbCBpbiBhIHJlZ3VsYXIKLSAgICAgb2JqZWN0IHRvIG92ZXJyaWRlIGEgd2VhayBzeW1ib2wgaW4gYSBzaGFyZWQgb2JqZWN0LiAgKi8KLQotICBpZiAobmV3ZHluCi0gICAgICAmJiBuZXdkZWYKLSAgICAgICYmIChvbGRkZWYKLQkgIHx8IChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkgICAgICAmJiAoYmluZCA9PSBTVEJfV0VBSwotCQkgIHx8IEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9GVU5DKSkpKQotICAgIHsKLSAgICAgICpvdmVycmlkZSA9IHRydWU7Ci0gICAgICBuZXdkZWYgPSBmYWxzZTsKLSAgICAgIG5ld2R5bmNvbW1vbiA9IGZhbHNlOwotCi0gICAgICAqcHNlYyA9IHNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICAqc2l6ZV9jaGFuZ2Vfb2sgPSB0cnVlOwotCi0gICAgICAvKiBJZiB3ZSBnZXQgaGVyZSB3aGVuIHRoZSBvbGQgc3ltYm9sIGlzIGEgY29tbW9uIHN5bWJvbCwgdGhlbgotICAgICAgICAgd2UgYXJlIGV4cGxpY2l0bHkgbGV0dGluZyBpdCBvdmVycmlkZSBhIHdlYWsgc3ltYm9sIG9yCi0gICAgICAgICBmdW5jdGlvbiBpbiBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgd2UgZG9uJ3Qgd2FudCB0byB3YXJuIGFib3V0Ci0gICAgICAgICBhIHR5cGUgY2hhbmdlLiAgSWYgdGhlIG9sZCBzeW1ib2wgaXMgYSBkZWZpbmVkIHN5bWJvbCwgYSB0eXBlCi0gICAgICAgICBjaGFuZ2Ugd2FybmluZyBtYXkgc3RpbGwgYmUgYXBwcm9wcmlhdGUuICAqLwotCi0gICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCSp0eXBlX2NoYW5nZV9vayA9IHRydWU7Ci0gICAgfQotCi0gIC8qIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIGFuIG9sZCBjb21tb24gc3ltYm9sIG1lcmdpbmcgd2l0aCBhCi0gICAgIG5ldyBzeW1ib2wgd2hpY2ggbG9va3MgbGlrZSBhIGNvbW1vbiBzeW1ib2wgaW4gYSBzaGFyZWQgb2JqZWN0LgotICAgICBXZSBjaGFuZ2UgKlBTRUMgYW5kICpQVkFMVUUgdG8gbWFrZSB0aGUgbmV3IHN5bWJvbCBsb29rIGxpa2UgYQotICAgICBjb21tb24gc3ltYm9sLCBhbmQgbGV0IF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIHdpbGwgZG8KLSAgICAgdGhlIHJpZ2h0IHRoaW5nLiAgKi8KLQotICBpZiAobmV3ZHluY29tbW9uCi0gICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0gICAgewotICAgICAgKm92ZXJyaWRlID0gdHJ1ZTsKLSAgICAgIG5ld2RlZiA9IGZhbHNlOwotICAgICAgbmV3ZHluY29tbW9uID0gZmFsc2U7Ci0gICAgICAqcHZhbHVlID0gc3ltLT5zdF9zaXplOwotICAgICAgKnBzZWMgPSBzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotICAgICAgKnNpemVfY2hhbmdlX29rID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIG9sZCBzeW1ib2wgaXMgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgdGhlIG5ldyBzeW1ib2wgaXMKLSAgICAgYSBkZWZpbml0aW9uIHdoaWNoIGlzIG5vdCBmcm9tIGEgZHluYW1pYyBvYmplY3QsIHRoZW4gdGhlIG5ldwotICAgICBzeW1ib2wgb3ZlcnJpZGVzIHRoZSBvbGQgc3ltYm9sLiAgU3ltYm9scyBmcm9tIHJlZ3VsYXIgZmlsZXMKLSAgICAgYWx3YXlzIHRha2UgcHJlY2VkZW5jZSBvdmVyIHN5bWJvbHMgZnJvbSBkeW5hbWljIG9iamVjdHMsIGV2ZW4gaWYKLSAgICAgdGhleSBhcmUgZGVmaW5lZCBhZnRlciB0aGUgZHluYW1pYyBvYmplY3QgaW4gdGhlIGxpbmsuCi0KLSAgICAgQXMgYWJvdmUsIHdlIGFnYWluIHBlcm1pdCBhIGNvbW1vbiBzeW1ib2wgaW4gYSByZWd1bGFyIG9iamVjdCB0bwotICAgICBvdmVycmlkZSBhIGRlZmluaXRpb24gaW4gYSBzaGFyZWQgb2JqZWN0IGlmIHRoZSBzaGFyZWQgb2JqZWN0Ci0gICAgIHN5bWJvbCBpcyBhIGZ1bmN0aW9uIG9yIGlzIHdlYWsuICAqLwotCi0gIGlmICghIG5ld2R5bgotICAgICAgJiYgKG5ld2RlZgotCSAgfHwgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKQotCSAgICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCSAgfHwgaC0+dHlwZSA9PSBTVFRfRlVOQykpKQotICAgICAgJiYgb2xkZHluCi0gICAgICAmJiBvbGRkZWYKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBDaGFuZ2UgdGhlIGhhc2ggdGFibGUgZW50cnkgdG8gdW5kZWZpbmVkLCBhbmQgbGV0Ci0JIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIGRvIHRoZSByaWdodCB0aGluZyB3aXRoIHRoZQotCSBuZXcgZGVmaW5pdGlvbi4gICovCi0KLSAgICAgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotICAgICAgaC0+cm9vdC51LnVuZGVmLmFiZmQgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotICAgICAgKnNpemVfY2hhbmdlX29rID0gdHJ1ZTsKLQotICAgICAgb2xkZGVmID0gZmFsc2U7Ci0gICAgICBvbGRkeW5jb21tb24gPSBmYWxzZTsKLQotICAgICAgLyogV2UgYWdhaW4gcGVybWl0IGEgdHlwZSBjaGFuZ2Ugd2hlbiBhIGNvbW1vbiBzeW1ib2wgbWF5IGJlCi0gICAgICAgICBvdmVycmlkaW5nIGEgZnVuY3Rpb24uICAqLwotCi0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQotCSp0eXBlX2NoYW5nZV9vayA9IHRydWU7Ci0KLSAgICAgIC8qIFRoaXMgdW5pb24gbWF5IGhhdmUgYmVlbiBzZXQgdG8gYmUgbm9uLU5VTEwgd2hlbiB0aGlzIHN5bWJvbAotCSB3YXMgc2VlbiBpbiBhIGR5bmFtaWMgb2JqZWN0LiAgV2UgbXVzdCBmb3JjZSB0aGUgdW5pb24gdG8gYmUKLQkgTlVMTCwgc28gdGhhdCBpdCBpcyBjb3JyZWN0IGZvciBhIHJlZ3VsYXIgc3ltYm9sLiAgKi8KLQotICAgICAgaC0+dmVyaW5mby52ZXJ0cmVlID0gTlVMTDsKLQotICAgICAgLyogSW4gdGhpcyBzcGVjaWFsIGNhc2UsIGlmIEggaXMgdGhlIHRhcmdldCBvZiBhbiBpbmRpcmVjdGlvbiwKLSAgICAgICAgIHdlIHdhbnQgdGhlIGNhbGxlciB0byBmcm9iIHdpdGggSCByYXRoZXIgdGhhbiB3aXRoIHRoZQotICAgICAgICAgaW5kaXJlY3Qgc3ltYm9sLiAgVGhhdCB3aWxsIHBlcm1pdCB0aGUgY2FsbGVyIHRvIHJlZGVmaW5lIHRoZQotICAgICAgICAgdGFyZ2V0IG9mIHRoZSBpbmRpcmVjdGlvbiwgcmF0aGVyIHRoYW4gdGhlIGluZGlyZWN0IHN5bWJvbAotICAgICAgICAgaXRzZWxmLiAgRklYTUU6IFRoaXMgd2lsbCBicmVhayB0aGUgLXkgb3B0aW9uIGlmIHdlIHN0b3JlIGEKLSAgICAgICAgIHN5bWJvbCB3aXRoIGEgZGlmZmVyZW50IG5hbWUuICAqLwotICAgICAgKnN5bV9oYXNoID0gaDsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugb2YgYSBuZXcgY29tbW9uIHN5bWJvbCBtZXJnaW5nIHdpdGggYW4KLSAgICAgb2xkIHN5bWJvbCB0aGF0IGxvb2tzIGxpa2UgaXQgbWlnaHQgYmUgYSBjb21tb24gc3ltYm9sIGRlZmluZWQgaW4KLSAgICAgYSBzaGFyZWQgb2JqZWN0LiAgTm90ZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBjYXNlIGluCi0gICAgIHdoaWNoIGEgbmV3IGNvbW1vbiBzeW1ib2wgc2hvdWxkIHNpbXBseSBvdmVycmlkZSB0aGUgZGVmaW5pdGlvbgotICAgICBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCi0gIGlmICghIG5ld2R5bgotICAgICAgJiYgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpCi0gICAgICAmJiBvbGRkeW5jb21tb24pCi0gICAgewotICAgICAgLyogSXQgd291bGQgYmUgYmVzdCBpZiB3ZSBjb3VsZCBzZXQgdGhlIGhhc2ggdGFibGUgZW50cnkgdG8gYQotCSBjb21tb24gc3ltYm9sLCBidXQgd2UgZG9uJ3Qga25vdyB3aGF0IHRvIHVzZSBmb3IgdGhlIHNlY3Rpb24KLQkgb3IgdGhlIGFsaWdubWVudC4gICovCi0gICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2NvbW1vbikKLQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBvbGRiZmQsIGJmZF9saW5rX2hhc2hfY29tbW9uLAotCSAgICAgIGgtPnNpemUsIGFiZmQsIGJmZF9saW5rX2hhc2hfY29tbW9uLCBzeW0tPnN0X3NpemUpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIElmIHRoZSBwcmVkdW1lZCBjb21tb24gc3ltYm9sIGluIHRoZSBkeW5hbWljIG9iamVjdCBpcwotICAgICAgICAgbGFyZ2VyLCBwcmV0ZW5kIHRoYXQgdGhlIG5ldyBzeW1ib2wgaGFzIGl0cyBzaXplLiAgKi8KLQotICAgICAgaWYgKGgtPnNpemUgPiAqcHZhbHVlKQotCSpwdmFsdWUgPSBoLT5zaXplOwotCi0gICAgICAvKiBGSVhNRTogV2Ugbm8gbG9uZ2VyIGtub3cgdGhlIGFsaWdubWVudCByZXF1aXJlZCBieSB0aGUgc3ltYm9sCi0JIGluIHRoZSBkeW5hbWljIG9iamVjdCwgc28gd2UganVzdCB3aW5kIHVwIHVzaW5nIHRoZSBvbmUgZnJvbQotCSB0aGUgcmVndWxhciBvYmplY3QuICAqLwotCi0gICAgICBvbGRkZWYgPSBmYWxzZTsKLSAgICAgIG9sZGR5bmNvbW1vbiA9IGZhbHNlOwotCi0gICAgICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLSAgICAgIGgtPnJvb3QudS51bmRlZi5hYmZkID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQotICAgICAgKnNpemVfY2hhbmdlX29rID0gdHJ1ZTsKLSAgICAgICp0eXBlX2NoYW5nZV9vayA9IHRydWU7Ci0KLSAgICAgIGgtPnZlcmluZm8udmVydHJlZSA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIEVMRiBvYmplY3QgZmlsZSB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBib29sZWFuICgqYWRkX3N5bWJvbF9ob29rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosCi0JCQkJICAgICAgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwKLQkJCQkgICAgICBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7Ci0gIGJvb2xlYW4gKCpjaGVja19yZWxvY3MpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgIGFzZWN0aW9uICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLSAgYm9vbGVhbiBjb2xsZWN0OwotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotICBzaXplX3Qgc3ltY291bnQ7Ci0gIHNpemVfdCBleHRzeW1jb3VudDsKLSAgc2l6ZV90IGV4dHN5bW9mZjsKLSAgRWxmX0V4dGVybmFsX1N5bSAqYnVmID0gTlVMTDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgYm9vbGVhbiBkeW5hbWljOwotICBiZmRfYnl0ZSAqZHludmVyID0gTlVMTDsKLSAgRWxmX0V4dGVybmFsX1ZlcnN5bSAqZXh0dmVyc3ltID0gTlVMTDsKLSAgRWxmX0V4dGVybmFsX1ZlcnN5bSAqZXZlcjsKLSAgRWxmX0V4dGVybmFsX0R5biAqZHluYnVmID0gTlVMTDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKndlYWtzOwotICBFbGZfRXh0ZXJuYWxfU3ltICplc3ltOwotICBFbGZfRXh0ZXJuYWxfU3ltICplc3ltZW5kOwotCi0gIGFkZF9zeW1ib2xfaG9vayA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2FkZF9zeW1ib2xfaG9vazsKLSAgY29sbGVjdCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICBkeW5hbWljID0gZmFsc2U7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkeW5hbWljID0gdHJ1ZTsKLQotICAgICAgLyogWW91IGNhbid0IHVzZSAtciBhZ2FpbnN0IGEgZHluYW1pYyBvYmplY3QuICBBbHNvLCB0aGVyZSdzIG5vCi0JIGhvcGUgb2YgdXNpbmcgYSBkeW5hbWljIG9iamVjdCB3aGljaCBkb2VzIG5vdCBleGFjdGx5IG1hdGNoCi0JIHRoZSBmb3JtYXQgb2YgdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUgfHwgaW5mby0+aGFzaC0+Y3JlYXRvciAhPSBhYmZkLT54dmVjKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIEFzIGEgR05VIGV4dGVuc2lvbiwgYW55IGlucHV0IHNlY3Rpb25zIHdoaWNoIGFyZSBuYW1lZAotICAgICAuZ251Lndhcm5pbmcuU1lNQk9MIGFyZSB0cmVhdGVkIGFzIHdhcm5pbmcgc3ltYm9scyBmb3IgdGhlIGdpdmVuCi0gICAgIHN5bWJvbC4gIFRoaXMgZGlmZmVycyBmcm9tIC5nbnUud2FybmluZyBzZWN0aW9ucywgd2hpY2ggZ2VuZXJhdGUKLSAgICAgd2FybmluZ3Mgd2hlbiB0aGV5IGFyZSBpbmNsdWRlZCBpbiBhbiBvdXRwdXQgZmlsZS4gICovCi0gIGlmICghIGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzKTsKLQkgIGlmIChzdHJuY21wIChuYW1lLCAiLmdudS53YXJuaW5nLiIsIHNpemVvZiAiLmdudS53YXJuaW5nLiIgLSAxKSA9PSAwKQotCSAgICB7Ci0JICAgICAgY2hhciAqbXNnOwotCSAgICAgIGJmZF9zaXplX3R5cGUgc3o7Ci0KLQkgICAgICBuYW1lICs9IHNpemVvZiAiLmdudS53YXJuaW5nLiIgLSAxOwotCi0JICAgICAgLyogSWYgdGhpcyBpcyBhIHNoYXJlZCBvYmplY3QsIHRoZW4gbG9vayB1cCB0aGUgc3ltYm9sCi0JCSBpbiB0aGUgaGFzaCB0YWJsZS4gIElmIGl0IGlzIHRoZXJlLCBhbmQgaXQgaXMgYWxyZWFkeQotCQkgYmVlbiBkZWZpbmVkLCB0aGVuIHdlIHdpbGwgbm90IGJlIHVzaW5nIHRoZSBlbnRyeQotCQkgZnJvbSB0aGlzIHNoYXJlZCBvYmplY3QsIHNvIHdlIGRvbid0IG5lZWQgdG8gd2Fybi4KLQkJIEZJWE1FOiBJZiB3ZSBzZWUgdGhlIGRlZmluaXRpb24gaW4gYSByZWd1bGFyIG9iamVjdAotCQkgbGF0ZXIgb24sIHdlIHdpbGwgd2FybiwgYnV0IHdlIHNob3VsZG4ndC4gIFRoZSBvbmx5Ci0JCSBmaXggaXMgdG8ga2VlcCB0cmFjayBvZiB3aGF0IHdhcm5pbmdzIHdlIGFyZSBzdXBwb3NlZAotCQkgdG8gZW1pdCwgYW5kIHRoZW4gaGFuZGxlIHRoZW0gYWxsIGF0IHRoZSBlbmQgb2YgdGhlCi0JCSBsaW5rLiAgKi8KLQkgICAgICBpZiAoZHluYW1pYyAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0JCXsKLQkJICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCQkgIGggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLAotCQkJCQkgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotCQkgIC8qIEZJWE1FOiBXaGF0IGFib3V0IGJmZF9saW5rX2hhc2hfY29tbW9uPyAgKi8KLQkJICBpZiAoaCAhPSBOVUxMCi0JCSAgICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCQkgICAgewotCQkgICAgICAvKiBXZSBkb24ndCB3YW50IHRvIGlzc3VlIHRoaXMgd2FybmluZy4gIENsb2JiZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2VjdGlvbiBzaXplIHNvIHRoYXQgdGhlIHdhcm5pbmcgZG9lcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkJICAgICAgcy0+X3Jhd19zaXplID0gMDsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcyk7Ci0JICAgICAgbXNnID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzeiArIDEpOwotCSAgICAgIGlmIChtc2cgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHMsIG1zZywgKGZpbGVfcHRyKSAwLCBzeikpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgbXNnW3N6XSA9ICdcMCc7Ci0KLQkgICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJICAgICAoaW5mbywgYWJmZCwgbmFtZSwgQlNGX1dBUk5JTkcsIHMsIChiZmRfdm1hKSAwLCBtc2csCi0JCSAgICAgIGZhbHNlLCBjb2xsZWN0LCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopIE5VTEwpKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JCXsKLQkJICAvKiBDbG9iYmVyIHRoZSBzZWN0aW9uIHNpemUgc28gdGhhdCB0aGUgd2FybmluZyBkb2VzCi0gICAgICAgICAgICAgICAgICAgICBub3QgZ2V0IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JCSAgcy0+X3Jhd19zaXplID0gMDsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgZHluYW1pYyBvYmplY3QsIHdlIGFsd2F5cyBsaW5rIGFnYWluc3QgdGhlIC5keW5zeW0KLSAgICAgc3ltYm9sIHRhYmxlLCBub3QgdGhlIC5zeW10YWIgc3ltYm9sIHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyCi0gICAgIHdpbGwgb25seSBzZWUgdGhlIC5keW5zeW0gc3ltYm9sIHRhYmxlLCBzbyB0aGVyZSBpcyBubyByZWFzb24gdG8KLSAgICAgbG9vayBhdCAuc3ltdGFiIGZvciBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLQotICBpZiAoISBkeW5hbWljIHx8IGVsZl9keW5zeW10YWIgKGFiZmQpID09IDApCi0gICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIGVsc2UKLSAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHluc3ltdGFiX2hkcjsKLQotICBpZiAoZHluYW1pYykKLSAgICB7Ci0gICAgICAvKiBSZWFkIGluIGFueSB2ZXJzaW9uIGRlZmluaXRpb25zLiAgKi8KLQotICAgICAgaWYgKCEgX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMgKGFiZmQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBSZWFkIGluIHRoZSBzeW1ib2wgdmVyc2lvbnMsIGJ1dCBkb24ndCBib3RoZXIgdG8gY29udmVydCB0aGVtCi0gICAgICAgICB0byBpbnRlcm5hbCBmb3JtYXQuICAqLwotICAgICAgaWYgKGVsZl9keW52ZXJzeW0gKGFiZmQpICE9IDApCi0JewotCSAgRWxmX0ludGVybmFsX1NoZHIgKnZlcnN5bWhkcjsKLQotCSAgdmVyc3ltaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnN5bV9oZHI7Ci0JICBleHR2ZXJzeW0gPSAoRWxmX0V4dGVybmFsX1ZlcnN5bSAqKSBiZmRfbWFsbG9jIChoZHItPnNoX3NpemUpOwotCSAgaWYgKGV4dHZlcnN5bSA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgdmVyc3ltaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF9yZWFkICgoUFRSKSBleHR2ZXJzeW0sIDEsIHZlcnN5bWhkci0+c2hfc2l6ZSwgYWJmZCkKLQkJICAhPSB2ZXJzeW1oZHItPnNoX3NpemUpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIHN5bWNvdW50ID0gaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLQotICAvKiBUaGUgc2hfaW5mbyBmaWVsZCBvZiB0aGUgc3ltdGFiIGhlYWRlciB0ZWxscyB1cyB3aGVyZSB0aGUKLSAgICAgZXh0ZXJuYWwgc3ltYm9scyBzdGFydC4gIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGxvY2FsIHN5bWJvbHMgYXQKLSAgICAgdGhpcyBwb2ludC4gICovCi0gIGlmIChlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgewotICAgICAgZXh0c3ltY291bnQgPSBzeW1jb3VudDsKLSAgICAgIGV4dHN5bW9mZiA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZXh0c3ltY291bnQgPSBzeW1jb3VudCAtIGhkci0+c2hfaW5mbzsKLSAgICAgIGV4dHN5bW9mZiA9IGhkci0+c2hfaW5mbzsKLSAgICB9Ci0KLSAgYnVmID0gKChFbGZfRXh0ZXJuYWxfU3ltICopCi0JIGJmZF9tYWxsb2MgKGV4dHN5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpOwotICBpZiAoYnVmID09IE5VTEwgJiYgZXh0c3ltY291bnQgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXZSBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIGhhc2ggdGFibGUgZW50cnkgZm9yIGVhY2ggZXh0ZXJuYWwKLSAgICAgc3ltYm9sLiAgKi8KLSAgc3ltX2hhc2ggPSAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSBleHRzeW1jb3VudCAqIHNpemVvZiAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpKTsKLSAgaWYgKHN5bV9oYXNoID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGVsZl9zeW1faGFzaGVzIChhYmZkKSA9IHN5bV9oYXNoOwotCi0gIGlmICghIGR5bmFtaWMpCi0gICAgewotICAgICAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGNyZWF0ZSBhbGwgdGhlIGR5bmFtaWMKLSAgICAgICAgIHNlY3Rpb25zIGltbWVkaWF0ZWx5LiAgV2UgbmVlZCB0byBhdHRhY2ggdGhlbSB0byBzb21ldGhpbmcsCi0gICAgICAgICBzbyB3ZSBhdHRhY2ggdGhlbSB0byB0aGlzIEJGRCwgcHJvdmlkZWQgaXQgaXMgdGhlIHJpZ2h0Ci0gICAgICAgICBmb3JtYXQuICBGSVhNRTogSWYgdGhlcmUgYXJlIG5vIGlucHV0IEJGRCdzIG9mIHRoZSBzYW1lCi0gICAgICAgICBmb3JtYXQgYXMgdGhlIG91dHB1dCwgd2UgY2FuJ3QgbWFrZSBhIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmICEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLQl7Ci0JICBpZiAoISBlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIGJvb2xlYW4gYWRkX25lZWRlZDsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBiZmRfc2l6ZV90eXBlIG9sZHNpemU7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN0cmluZGV4OwotCi0gICAgICAvKiBGaW5kIHRoZSBuYW1lIHRvIHVzZSBpbiBhIERUX05FRURFRCBlbnRyeSB0aGF0IHJlZmVycyB0byB0aGlzCi0JIG9iamVjdC4gIElmIHRoZSBvYmplY3QgaGFzIGEgRFRfU09OQU1FIGVudHJ5LCB3ZSB1c2UgaXQuCi0JIE90aGVyd2lzZSwgaWYgdGhlIGdlbmVyaWMgbGlua2VyIHN0dWNrIHNvbWV0aGluZyBpbgotCSBlbGZfZHRfbmFtZSwgd2UgdXNlIHRoYXQuICBPdGhlcndpc2UsIHdlIGp1c3QgdXNlIHRoZSBmaWxlCi0JIG5hbWUuICBJZiB0aGUgZ2VuZXJpYyBsaW5rZXIgcHV0IGEgbnVsbCBzdHJpbmcgaW50bwotCSBlbGZfZHRfbmFtZSwgd2UgZG9uJ3QgbWFrZSBhIERUX05FRURFRCBlbnRyeSBhdCBhbGwsIGV2ZW4gaWYKLQkgdGhlcmUgaXMgYSBEVF9TT05BTUUgZW50cnkuICAqLwotICAgICAgYWRkX25lZWRlZCA9IHRydWU7Ci0gICAgICBuYW1lID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7Ci0gICAgICBpZiAoZWxmX2R0X25hbWUgKGFiZmQpICE9IE5VTEwpCi0JewotCSAgbmFtZSA9IGVsZl9kdF9uYW1lIChhYmZkKTsKLQkgIGlmICgqbmFtZSA9PSAnXDAnKQotCSAgICBhZGRfbmVlZGVkID0gZmFsc2U7Ci0JfQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JewotCSAgRWxmX0V4dGVybmFsX0R5biAqZXh0ZHluOwotCSAgRWxmX0V4dGVybmFsX0R5biAqZXh0ZHluZW5kOwotCSAgaW50IGVsZnNlYzsKLQkgIHVuc2lnbmVkIGxvbmcgbGluazsKLQotCSAgZHluYnVmID0gKEVsZl9FeHRlcm5hbF9EeW4gKikgYmZkX21hbGxvYyAoKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKLQkgIGlmIChkeW5idWYgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgKFBUUikgZHluYnVmLAotCQkJCQkgIChmaWxlX3B0cikgMCwgcy0+X3Jhd19zaXplKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGVsZnNlYyA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgcyk7Ci0JICBpZiAoZWxmc2VjID09IC0xKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGxpbmsgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2VsZnNlY10tPnNoX2xpbms7Ci0KLQkgIGV4dGR5biA9IGR5bmJ1ZjsKLQkgIGV4dGR5bmVuZCA9IGV4dGR5biArIHMtPl9yYXdfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX0R5bik7Ci0JICBmb3IgKDsgZXh0ZHluIDwgZXh0ZHluZW5kOyBleHRkeW4rKykKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCi0JICAgICAgZWxmX3N3YXBfZHluX2luIChhYmZkLCBleHRkeW4sICZkeW4pOwotCSAgICAgIGlmIChkeW4uZF90YWcgPT0gRFRfU09OQU1FKQotCQl7Ci0JCSAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGxpbmssCi0JCQkJCQkJICBkeW4uZF91bi5kX3ZhbCk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgICAgaWYgKGR5bi5kX3RhZyA9PSBEVF9ORUVERUQpCi0JCXsKLQkJICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm4sICoqcG47Ci0JCSAgY2hhciAqZm5tLCAqYW5tOwotCi0JCSAgbiA9ICgoc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICopCi0JCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0KSkpOwotCQkgIGZubSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGxpbmssCi0JCQkJCQkJIGR5bi5kX3VuLmRfdmFsKTsKLQkJICBpZiAobiA9PSBOVUxMIHx8IGZubSA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgYW5tID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKGZubSkgKyAxKTsKLQkJICBpZiAoYW5tID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzdHJjcHkgKGFubSwgZm5tKTsKLQkJICBuLT5uYW1lID0gYW5tOwotCQkgIG4tPmJ5ID0gYWJmZDsKLQkJICBuLT5uZXh0ID0gTlVMTDsKLQkJICBmb3IgKHBuID0gJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+bmVlZGVkOwotCQkgICAgICAgKnBuICE9IE5VTEw7Ci0JCSAgICAgICBwbiA9ICYoKnBuKS0+bmV4dCkKLQkJICAgIDsKLQkJICAqcG4gPSBuOwotCQl9Ci0JICAgIH0KLQotCSAgZnJlZSAoZHluYnVmKTsKLQkgIGR5bmJ1ZiA9IE5VTEw7Ci0JfQotCi0gICAgICAvKiBXZSBkbyBub3Qgd2FudCB0byBpbmNsdWRlIGFueSBvZiB0aGUgc2VjdGlvbnMgaW4gYSBkeW5hbWljCi0JIG9iamVjdCBpbiB0aGUgb3V0cHV0IGZpbGUuICBXZSBoYWNrIGJ5IHNpbXBseSBjbG9iYmVyaW5nIHRoZQotCSBsaXN0IG9mIHNlY3Rpb25zIGluIHRoZSBCRkQuICBUaGlzIGNvdWxkIGJlIGhhbmRsZWQgbW9yZQotCSBjbGVhbmx5IGJ5LCBzYXksIGEgbmV3IHNlY3Rpb24gZmxhZzsgdGhlIGV4aXN0aW5nCi0JIFNFQ19ORVZFUl9MT0FEIGZsYWcgaXMgbm90IHRoZSBvbmUgd2Ugd2FudCwgYmVjYXVzZSB0aGF0IG9uZQotCSBzdGlsbCBpbXBsaWVzIHRoYXQgdGhlIHNlY3Rpb24gdGFrZXMgdXAgc3BhY2UgaW4gdGhlIG91dHB1dAotCSBmaWxlLiAgKi8KLSAgICAgIGFiZmQtPnNlY3Rpb25zID0gTlVMTDsKLSAgICAgIGFiZmQtPnNlY3Rpb25fY291bnQgPSAwOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBkeW5hbWljIG9iamVjdCBmb3VuZCBpbiB0aGUgbGluaywgY3JlYXRlCi0JIHRoZSBzcGVjaWFsIHNlY3Rpb25zIHJlcXVpcmVkIGZvciBkeW5hbWljIGxpbmtpbmcuICAqLwotICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0JewotCSAgaWYgKCEgZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGlmIChhZGRfbmVlZGVkKQotCXsKLQkgIC8qIEFkZCBhIERUX05FRURFRCBlbnRyeSBmb3IgdGhpcyBkeW5hbWljIG9iamVjdC4gICovCi0JICBvbGRzaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIpOwotCSAgc3RyaW5kZXggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyLCBuYW1lLAotCQkJCQkgdHJ1ZSwgZmFsc2UpOwotCSAgaWYgKHN0cmluZGV4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChvbGRzaXplID09IF9iZmRfc3RyaW5ndGFiX3NpemUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyKSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZHluOwotCSAgICAgIEVsZl9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotCSAgICAgIC8qIFRoZSBoYXNoIHRhYmxlIHNpemUgZGlkIG5vdCBjaGFuZ2UsIHdoaWNoIG1lYW5zIHRoYXQKLQkJIHRoZSBkeW5hbWljIG9iamVjdCBuYW1lIHdhcyBhbHJlYWR5IGVudGVyZWQuICBJZiB3ZQotCQkgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIHRoaXMgZHluYW1pYyBvYmplY3QgaW4gdGhlCi0JCSBsaW5rLCBqdXN0IGlnbm9yZSBpdC4gIFRoZXJlIGlzIG5vIHJlYXNvbiB0byBpbmNsdWRlCi0JCSBhIHBhcnRpY3VsYXIgZHluYW1pYyBvYmplY3QgbW9yZSB0aGFuIG9uY2UuICAqLwotCSAgICAgIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0JCQkJCSAgICAgICIuZHluYW1pYyIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNkeW4gIT0gTlVMTCk7Ci0KLQkgICAgICBkeW5jb24gPSAoRWxmX0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLQkgICAgICBkeW5jb25lbmQgPSAoRWxmX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKwotCQkJCQkJc2R5bi0+X3Jhd19zaXplKTsKLQkgICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQkJewotCQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCi0JCSAgZWxmX3N3YXBfZHluX2luIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwgZHluY29uLAotCQkJCSAgICZkeW4pOwotCQkgIGlmIChkeW4uZF90YWcgPT0gRFRfTkVFREVECi0JCSAgICAgICYmIGR5bi5kX3VuLmRfdmFsID09IHN0cmluZGV4KQotCQkgICAgewotCQkgICAgICBpZiAoYnVmICE9IE5VTEwpCi0JCQlmcmVlIChidWYpOwotCQkgICAgICBpZiAoZXh0dmVyc3ltICE9IE5VTEwpCi0JCQlmcmVlIChleHR2ZXJzeW0pOwotCQkgICAgICByZXR1cm4gdHJ1ZTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTkVFREVELCBzdHJpbmRleCkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgLyogU2F2ZSB0aGUgU09OQU1FLCBpZiB0aGVyZSBpcyBvbmUsIGJlY2F1c2Ugc29tZXRpbWVzIHRoZQotICAgICAgICAgbGlua2VyIGVtdWxhdGlvbiBjb2RlIHdpbGwgbmVlZCB0byBrbm93IGl0LiAgKi8KLSAgICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKLSAgICAgIGVsZl9kdF9uYW1lIChhYmZkKSA9IG5hbWU7Ci0gICAgfQotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJaGRyLT5zaF9vZmZzZXQgKyBleHRzeW1vZmYgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLAotCQlTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkICgoUFRSKSBidWYsIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksIGV4dHN5bWNvdW50LCBhYmZkKQotCSAgIT0gZXh0c3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICB3ZWFrcyA9IE5VTEw7Ci0KLSAgZXZlciA9IGV4dHZlcnN5bSAhPSBOVUxMID8gZXh0dmVyc3ltICsgZXh0c3ltb2ZmIDogTlVMTDsKLSAgZXN5bWVuZCA9IGJ1ZiArIGV4dHN5bWNvdW50OwotICBmb3IgKGVzeW0gPSBidWY7Ci0gICAgICAgZXN5bSA8IGVzeW1lbmQ7Ci0gICAgICAgZXN5bSsrLCBzeW1faGFzaCsrLCBldmVyID0gKGV2ZXIgIT0gTlVMTCA/IGV2ZXIgKyAxIDogTlVMTCkpCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBzeW07Ci0gICAgICBpbnQgYmluZDsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBib29sZWFuIGRlZmluaXRpb247Ci0gICAgICBib29sZWFuIHNpemVfY2hhbmdlX29rLCB0eXBlX2NoYW5nZV9vazsKLSAgICAgIGJvb2xlYW4gbmV3X3dlYWtkZWY7Ci0gICAgICB1bnNpZ25lZCBpbnQgb2xkX2FsaWdubWVudDsKLQotICAgICAgZWxmX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmc3ltKTsKLQotICAgICAgZmxhZ3MgPSBCU0ZfTk9fRkxBR1M7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgdmFsdWUgPSBzeW0uc3RfdmFsdWU7Ci0gICAgICAqc3ltX2hhc2ggPSBOVUxMOwotCi0gICAgICBiaW5kID0gRUxGX1NUX0JJTkQgKHN5bS5zdF9pbmZvKTsKLSAgICAgIGlmIChiaW5kID09IFNUQl9MT0NBTCkKLQl7Ci0JICAvKiBUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlLCBzaW5jZSBFTEYgcmVxdWlyZXMgdGhhdCBhbGwKLQkgICAgIGdsb2JhbCBzeW1ib2xzIGZvbGxvdyBhbGwgbG9jYWwgc3ltYm9scywgYW5kIHRoYXQgc2hfaW5mbwotCSAgICAgcG9pbnQgdG8gdGhlIGZpcnN0IGdsb2JhbCBzeW1ib2wuICBVbmZvcnR1bmF0ZWFseSwgSXJpeCA1Ci0JICAgICBzY3Jld3MgdGhpcyB1cC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChiaW5kID09IFNUQl9HTE9CQUwpCi0JewotCSAgaWYgKHN5bS5zdF9zaG5keCAhPSBTSE5fVU5ERUYKLQkgICAgICAmJiBzeW0uc3Rfc2huZHggIT0gU0hOX0NPTU1PTikKLQkgICAgZmxhZ3MgPSBCU0ZfR0xPQkFMOwotCSAgZWxzZQotCSAgICBmbGFncyA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoYmluZCA9PSBTVEJfV0VBSykKLQlmbGFncyA9IEJTRl9XRUFLOwotICAgICAgZWxzZQotCXsKLQkgIC8qIExlYXZlIGl0IHVwIHRvIHRoZSBwcm9jZXNzb3IgYmFja2VuZC4gICovCi0JfQotCi0gICAgICBpZiAoc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQlzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgZWxzZSBpZiAoc3ltLnN0X3NobmR4ID4gMCAmJiBzeW0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCXsKLQkgIHNlYyA9IHNlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS5zdF9zaG5keCk7Ci0JICBpZiAoc2VjID09IE5VTEwpCi0JICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpICE9IDApCi0JICAgIHZhbHVlIC09IHNlYy0+dm1hOwotCX0KLSAgICAgIGVsc2UgaWYgKHN5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQotCXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBlbHNlIGlmIChzeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQl7Ci0JICBzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgLyogV2hhdCBFTEYgY2FsbHMgdGhlIHNpemUgd2UgY2FsbCB0aGUgdmFsdWUuICBXaGF0IEVMRgotCSAgICAgY2FsbHMgdGhlIHZhbHVlIHdlIGNhbGwgdGhlIGFsaWdubWVudC4gICovCi0JICB2YWx1ZSA9IHN5bS5zdF9zaXplOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBMZWF2ZSBpdCB1cCB0byB0aGUgcHJvY2Vzc29yIGJhY2tlbmQuICAqLwotCX0KLQotICAgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGhkci0+c2hfbGluaywgc3ltLnN0X25hbWUpOwotICAgICAgaWYgKG5hbWUgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKGFkZF9zeW1ib2xfaG9vaykKLQl7Ci0JICBpZiAoISAoKmFkZF9zeW1ib2xfaG9vaykgKGFiZmQsIGluZm8sICZzeW0sICZuYW1lLCAmZmxhZ3MsICZzZWMsCi0JCQkJICAgICZ2YWx1ZSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBUaGUgaG9vayBmdW5jdGlvbiBzZXRzIHRoZSBuYW1lIHRvIE5VTEwgaWYgdGhpcyBzeW1ib2wKLQkgICAgIHNob3VsZCBiZSBza2lwcGVkIGZvciBzb21lIHJlYXNvbi4gICovCi0JICBpZiAobmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjayB0aGF0IGFsbCBwb3NzaWJpbGl0aWVzIHdlcmUgaGFuZGxlZC4gICovCi0gICAgICBpZiAoc2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWMpCi0JICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykpCi0JZGVmaW5pdGlvbiA9IGZhbHNlOwotICAgICAgZWxzZQotCWRlZmluaXRpb24gPSB0cnVlOwotCi0gICAgICBzaXplX2NoYW5nZV9vayA9IGZhbHNlOwotICAgICAgdHlwZV9jaGFuZ2Vfb2sgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnR5cGVfY2hhbmdlX29rOwotICAgICAgb2xkX2FsaWdubWVudCA9IDA7Ci0gICAgICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9WZXJzeW0gaXZlcjsKLQkgIHVuc2lnbmVkIGludCB2ZXJudW0gPSAwOwotCSAgYm9vbGVhbiBvdmVycmlkZTsKLQotCSAgaWYgKGV2ZXIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIF9iZmRfZWxmX3N3YXBfdmVyc3ltX2luIChhYmZkLCBldmVyLCAmaXZlcik7Ci0JICAgICAgdmVybnVtID0gaXZlci52c192ZXJzICYgVkVSU1lNX1ZFUlNJT047Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgaGlkZGVuIHN5bWJvbCwgb3IgaWYgaXQgaXMgbm90IHZlcnNpb24KLSAgICAgICAgICAgICAgICAgMSwgd2UgYXBwZW5kIHRoZSB2ZXJzaW9uIG5hbWUgdG8gdGhlIHN5bWJvbCBuYW1lLgotICAgICAgICAgICAgICAgICBIb3dldmVyLCB3ZSBkbyBub3QgbW9kaWZ5IGEgbm9uLWhpZGRlbiBhYnNvbHV0ZQotICAgICAgICAgICAgICAgICBzeW1ib2wsIGJlY2F1c2UgaXQgbWlnaHQgYmUgdGhlIHZlcnNpb24gc3ltYm9sCi0gICAgICAgICAgICAgICAgIGl0c2VsZi4gIEZJWE1FOiBXaGF0IGlmIGl0IGlzbid0PyAgKi8KLQkgICAgICBpZiAoKGl2ZXIudnNfdmVycyAmIFZFUlNZTV9ISURERU4pICE9IDAKLQkJICB8fCAodmVybnVtID4gMSAmJiAhIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkpCi0JCXsKLQkJICBjb25zdCBjaGFyICp2ZXJzdHI7Ci0JCSAgaW50IG5hbWVsZW4sIG5ld2xlbjsKLQkJICBjaGFyICpuZXduYW1lLCAqcDsKLQotCQkgIGlmIChzeW0uc3Rfc2huZHggIT0gU0hOX1VOREVGKQotCQkgICAgewotCQkgICAgICBpZiAodmVybnVtID4gZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyZGVmX2hkci5zaF9pbmZvKQotCQkJewotCQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCSAgICAoXygiJXM6ICVzOiBpbnZhbGlkIHZlcnNpb24gJXUgKG1heCAlZCkiKSwKLQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUsIHZlcm51bSwKLQkJCSAgICAgZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyZGVmX2hkci5zaF9pbmZvKTsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkJfQotCQkgICAgICBlbHNlIGlmICh2ZXJudW0gPiAxKQotCQkJdmVyc3RyID0KLQkJCSAgZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmW3Zlcm51bSAtIDFdLnZkX25vZGVuYW1lOwotCQkgICAgICBlbHNlCi0JCQl2ZXJzdHIgPSAiIjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIGNhbm5vdCBzaW1wbHkgdGVzdCBmb3IgdGhlIG51bWJlciBvZgotCQkJIGVudHJpZXMgaW4gdGhlIFZFUk5FRUQgc2VjdGlvbiBzaW5jZSB0aGUKLQkJCSBudW1iZXJzIGZvciB0aGUgbmVlZGVkIHZlcnNpb25zIGRvIG5vdCBzdGFydAotCQkJIGF0IDAuICAqLwotCQkgICAgICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKLQotCQkgICAgICB2ZXJzdHIgPSBOVUxMOwotCQkgICAgICBmb3IgKHQgPSBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWY7Ci0JCQkgICB0ICE9IE5VTEw7Ci0JCQkgICB0ID0gdC0+dm5fbmV4dHJlZikKLQkJCXsKLQkJCSAgRWxmX0ludGVybmFsX1Zlcm5hdXggKmE7Ci0KLQkJCSAgZm9yIChhID0gdC0+dm5fYXV4cHRyOyBhICE9IE5VTEw7IGEgPSBhLT52bmFfbmV4dHB0cikKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoYS0+dm5hX290aGVyID09IHZlcm51bSkKLQkJCQl7Ci0JCQkJICB2ZXJzdHIgPSBhLT52bmFfbm9kZW5hbWU7Ci0JCQkJICBicmVhazsKLQkJCQl9Ci0JCQkgICAgfQotCQkJICBpZiAoYSAhPSBOVUxMKQotCQkJICAgIGJyZWFrOwotCQkJfQotCQkgICAgICBpZiAodmVyc3RyID09IE5VTEwpCi0JCQl7Ci0JCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJICAgIChfKCIlczogJXM6IGludmFsaWQgbmVlZGVkIHZlcnNpb24gJWQiKSwKLQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUsIHZlcm51bSk7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJCX0KLQkJICAgIH0KLQotCQkgIG5hbWVsZW4gPSBzdHJsZW4gKG5hbWUpOwotCQkgIG5ld2xlbiA9IG5hbWVsZW4gKyBzdHJsZW4gKHZlcnN0cikgKyAyOwotCQkgIGlmICgoaXZlci52c192ZXJzICYgVkVSU1lNX0hJRERFTikgPT0gMCkKLQkJICAgICsrbmV3bGVuOwotCi0JCSAgbmV3bmFtZSA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgbmV3bGVuKTsKLQkJICBpZiAobmV3bmFtZSA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3RyY3B5IChuZXduYW1lLCBuYW1lKTsKLQkJICBwID0gbmV3bmFtZSArIG5hbWVsZW47Ci0JCSAgKnArKyA9IEVMRl9WRVJfQ0hSOwotCQkgIGlmICgoaXZlci52c192ZXJzICYgVkVSU1lNX0hJRERFTikgPT0gMCkKLQkJICAgICpwKysgPSBFTEZfVkVSX0NIUjsKLQkJICBzdHJjcHkgKHAsIHZlcnN0cik7Ci0KLQkJICBuYW1lID0gbmV3bmFtZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmICghIGVsZl9tZXJnZV9zeW1ib2wgKGFiZmQsIGluZm8sIG5hbWUsICZzeW0sICZzZWMsICZ2YWx1ZSwKLQkJCQkgIHN5bV9oYXNoLCAmb3ZlcnJpZGUsICZ0eXBlX2NoYW5nZV9vaywKLQkJCQkgICZzaXplX2NoYW5nZV9vaykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAob3ZlcnJpZGUpCi0JICAgIGRlZmluaXRpb24gPSBmYWxzZTsKLQotCSAgaCA9ICpzeW1faGFzaDsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCi0JICAvKiBSZW1lbWJlciB0aGUgb2xkIGFsaWdubWVudCBpZiB0aGlzIGlzIGEgY29tbW9uIHN5bWJvbCwgc28KLSAgICAgICAgICAgICB0aGF0IHdlIGRvbid0IHJlZHVjZSB0aGUgYWxpZ25tZW50IGxhdGVyIG9uLiAgV2UgY2FuJ3QKLSAgICAgICAgICAgICBjaGVjayBsYXRlciwgYmVjYXVzZSBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotICAgICAgICAgICAgIHdpbGwgc2V0IGEgZGVmYXVsdCBmb3IgdGhlIGFsaWdubWVudCB3aGljaCB3ZSB3YW50IHRvCi0gICAgICAgICAgICAgb3ZlcnJpZGUuICAqLwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkgICAgb2xkX2FsaWdubWVudCA9IGgtPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlcjsKLQotCSAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZiAhPSBOVUxMCi0JICAgICAgJiYgISBvdmVycmlkZQotCSAgICAgICYmIHZlcm51bSA+IDEKLQkgICAgICAmJiBkZWZpbml0aW9uKQotCSAgICBoLT52ZXJpbmZvLnZlcmRlZiA9ICZlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWZbdmVybnVtIC0gMV07Ci0JfQotCi0gICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgICAgIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjLCB2YWx1ZSwgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkgICAgICBmYWxzZSwgY29sbGVjdCwgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBzeW1faGFzaCkpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBoID0gKnN5bV9oYXNoOwotICAgICAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCWggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLSAgICAgICpzeW1faGFzaCA9IGg7Ci0KLSAgICAgIG5ld193ZWFrZGVmID0gZmFsc2U7Ci0gICAgICBpZiAoZHluYW1pYwotCSAgJiYgZGVmaW5pdGlvbgotCSAgJiYgKGZsYWdzICYgQlNGX1dFQUspICE9IDAKLQkgICYmIEVMRl9TVF9UWVBFIChzeW0uc3RfaW5mbykgIT0gU1RUX0ZVTkMKLQkgICYmIGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCSAgJiYgaC0+d2Vha2RlZiA9PSBOVUxMKQotCXsKLQkgIC8qIEtlZXAgYSBsaXN0IG9mIGFsbCB3ZWFrIGRlZmluZWQgbm9uIGZ1bmN0aW9uIHN5bWJvbHMgZnJvbQotCSAgICAgYSBkeW5hbWljIG9iamVjdCwgdXNpbmcgdGhlIHdlYWtkZWYgZmllbGQuICBMYXRlciBpbiB0aGlzCi0JICAgICBmdW5jdGlvbiB3ZSB3aWxsIHNldCB0aGUgd2Vha2RlZiBmaWVsZCB0byB0aGUgY29ycmVjdAotCSAgICAgdmFsdWUuICBXZSBvbmx5IHB1dCBub24tZnVuY3Rpb24gc3ltYm9scyBmcm9tIGR5bmFtaWMKLQkgICAgIG9iamVjdHMgb24gdGhpcyBsaXN0LCBiZWNhdXNlIHRoYXQgaGFwcGVucyB0byBiZSB0aGUgb25seQotCSAgICAgdGltZSB3ZSBuZWVkIHRvIGtub3cgdGhlIG5vcm1hbCBzeW1ib2wgY29ycmVzcG9uZGluZyB0byBhCi0JICAgICB3ZWFrIHN5bWJvbCwgYW5kIHRoZSBpbmZvcm1hdGlvbiBpcyB0aW1lIGNvbnN1bWluZyB0bwotCSAgICAgZmlndXJlIG91dC4gIElmIHRoZSB3ZWFrZGVmIGZpZWxkIGlzIG5vdCBhbHJlYWR5IE5VTEwsCi0JICAgICB0aGVuIHRoaXMgc3ltYm9sIHdhcyBhbHJlYWR5IGRlZmluZWQgYnkgc29tZSBwcmV2aW91cwotCSAgICAgZHluYW1pYyBvYmplY3QsIGFuZCB3ZSB3aWxsIGJlIHVzaW5nIHRoYXQgcHJldmlvdXMKLQkgICAgIGRlZmluaXRpb24gYW55aG93LiAgKi8KLQotCSAgaC0+d2Vha2RlZiA9IHdlYWtzOwotCSAgd2Vha3MgPSBoOwotCSAgbmV3X3dlYWtkZWYgPSB0cnVlOwotCX0KLQotICAgICAgLyogU2V0IHRoZSBhbGlnbm1lbnQgb2YgYSBjb21tb24gc3ltYm9sLiAgKi8KLSAgICAgIGlmIChzeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTgotCSAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCXsKLQkgIHVuc2lnbmVkIGludCBhbGlnbjsKLQotCSAgYWxpZ24gPSBiZmRfbG9nMiAoc3ltLnN0X3ZhbHVlKTsKLQkgIGlmIChhbGlnbiA+IG9sZF9hbGlnbm1lbnQpCi0JICAgIGgtPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlciA9IGFsaWduOwotCX0KLQotICAgICAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQl7Ci0JICBpbnQgb2xkX2ZsYWdzOwotCSAgYm9vbGVhbiBkeW5zeW07Ci0JICBpbnQgbmV3X2ZsYWc7Ci0KLQkgIC8qIFJlbWVtYmVyIHRoZSBzeW1ib2wgc2l6ZSBhbmQgdHlwZS4gICovCi0JICBpZiAoc3ltLnN0X3NpemUgIT0gMAotCSAgICAgICYmIChkZWZpbml0aW9uIHx8IGgtPnNpemUgPT0gMCkpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+c2l6ZSAhPSAwICYmIGgtPnNpemUgIT0gc3ltLnN0X3NpemUgJiYgISBzaXplX2NoYW5nZV9vaykKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgKF8oIldhcm5pbmc6IHNpemUgb2Ygc3ltYm9sIGAlcycgY2hhbmdlZCBmcm9tICVsdSB0byAlbHUgaW4gJXMiKSwKLQkJICAgbmFtZSwgKHVuc2lnbmVkIGxvbmcpIGgtPnNpemUsICh1bnNpZ25lZCBsb25nKSBzeW0uc3Rfc2l6ZSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0JICAgICAgaC0+c2l6ZSA9IHN5bS5zdF9zaXplOwotCSAgICB9Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSBjb21tb24gc3ltYm9sLCB0aGVuIHdlIGFsd2F5cyB3YW50IEgtPlNJWkUKLSAgICAgICAgICAgICB0byBiZSB0aGUgc2l6ZSBvZiB0aGUgY29tbW9uIHN5bWJvbC4gIFRoZSBjb2RlIGp1c3QgYWJvdmUKLSAgICAgICAgICAgICB3b24ndCBmaXggdGhlIHNpemUgaWYgYSBjb21tb24gc3ltYm9sIGJlY29tZXMgbGFyZ2VyLiAgV2UKLSAgICAgICAgICAgICBkb24ndCB3YXJuIGFib3V0IGEgc2l6ZSBjaGFuZ2UgaGVyZSwgYmVjYXVzZSB0aGF0IGlzCi0gICAgICAgICAgICAgY292ZXJlZCBieSAtLXdhcm4tY29tbW9uLiAgKi8KLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JICAgIGgtPnNpemUgPSBoLT5yb290LnUuYy5zaXplOwotCi0JICBpZiAoRUxGX1NUX1RZUEUgKHN5bS5zdF9pbmZvKSAhPSBTVFRfTk9UWVBFCi0JICAgICAgJiYgKGRlZmluaXRpb24gfHwgaC0+dHlwZSA9PSBTVFRfTk9UWVBFKSkKLQkgICAgewotCSAgICAgIGlmIChoLT50eXBlICE9IFNUVF9OT1RZUEUKLQkJICAmJiBoLT50eXBlICE9IEVMRl9TVF9UWVBFIChzeW0uc3RfaW5mbykKLQkJICAmJiAhIHR5cGVfY2hhbmdlX29rKQotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAoXygiV2FybmluZzogdHlwZSBvZiBzeW1ib2wgYCVzJyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQgaW4gJXMiKSwKLQkJICAgbmFtZSwgaC0+dHlwZSwgRUxGX1NUX1RZUEUgKHN5bS5zdF9pbmZvKSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0JICAgICAgaC0+dHlwZSA9IEVMRl9TVF9UWVBFIChzeW0uc3RfaW5mbyk7Ci0JICAgIH0KLQotCSAgaWYgKHN5bS5zdF9vdGhlciAhPSAwCi0JICAgICAgJiYgKGRlZmluaXRpb24gfHwgaC0+b3RoZXIgPT0gMCkpCi0JICAgIGgtPm90aGVyID0gc3ltLnN0X290aGVyOwotCi0JICAvKiBTZXQgYSBmbGFnIGluIHRoZSBoYXNoIHRhYmxlIGVudHJ5IGluZGljYXRpbmcgdGhlIHR5cGUgb2YKLQkgICAgIHJlZmVyZW5jZSBvciBkZWZpbml0aW9uIHdlIGp1c3QgZm91bmQuICBLZWVwIGEgY291bnQgb2YKLQkgICAgIHRoZSBudW1iZXIgb2YgZHluYW1pYyBzeW1ib2xzIHdlIGZpbmQuICBBIGR5bmFtaWMgc3ltYm9sCi0JICAgICBpcyBvbmUgd2hpY2ggaXMgcmVmZXJlbmNlZCBvciBkZWZpbmVkIGJ5IGJvdGggYSByZWd1bGFyCi0JICAgICBvYmplY3QgYW5kIGEgc2hhcmVkIG9iamVjdC4gICovCi0JICBvbGRfZmxhZ3MgPSBoLT5lbGZfbGlua19oYXNoX2ZsYWdzOwotCSAgZHluc3ltID0gZmFsc2U7Ci0JICBpZiAoISBkeW5hbWljKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZGVmaW5pdGlvbikKLQkJewotCQkgIG5ld19mbGFnID0gRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUjsKLQkJICBpZiAoYmluZCAhPSBTVEJfV0VBSykKLQkJICAgIG5ld19mbGFnIHw9IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSzsKLQkJfQotCSAgICAgIGVsc2UKLQkJbmV3X2ZsYWcgPSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkJICB8fCAob2xkX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMKLQkJCQkgICB8IEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpKSAhPSAwKQotCQlkeW5zeW0gPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBkZWZpbml0aW9uKQotCQluZXdfZmxhZyA9IEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUM7Ci0JICAgICAgZWxzZQotCQluZXdfZmxhZyA9IEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUM7Ci0JICAgICAgaWYgKChvbGRfZmxhZ3MgJiAoRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUgotCQkJCXwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikpICE9IDAKLQkJICB8fCAoaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgICAgICYmICEgbmV3X3dlYWtkZWYKLQkJICAgICAgJiYgaC0+d2Vha2RlZi0+ZHluaW5keCAhPSAtMSkpCi0JCWR5bnN5bSA9IHRydWU7Ci0JICAgIH0KLQotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBuZXdfZmxhZzsKLQotCSAgLyogSWYgdGhpcyBzeW1ib2wgaGFzIGEgdmVyc2lvbiwgYW5kIGl0IGlzIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgdmVyc2lvbiwgd2UgY3JlYXRlIGFuIGluZGlyZWN0IHN5bWJvbCBmcm9tIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgbmFtZSB0byB0aGUgZnVsbHkgZGVjb3JhdGVkIG5hbWUuICBUaGlzIHdpbGwgY2F1c2UKLSAgICAgICAgICAgICBleHRlcm5hbCByZWZlcmVuY2VzIHdoaWNoIGRvIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiB0byBiZQotICAgICAgICAgICAgIGJvdW5kIHRvIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3ltYm9sLiAgKi8KLQkgIGlmIChkZWZpbml0aW9uKQotCSAgICB7Ci0JICAgICAgY2hhciAqcDsKLQotCSAgICAgIHAgPSBzdHJjaHIgKG5hbWUsIEVMRl9WRVJfQ0hSKTsKLQkgICAgICBpZiAocCAhPSBOVUxMICYmIHBbMV0gPT0gRUxGX1ZFUl9DSFIpCi0JCXsKLQkJICBjaGFyICpzaG9ydG5hbWU7Ci0JCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmhpOwotCQkgIGJvb2xlYW4gb3ZlcnJpZGU7Ci0KLQkJICBzaG9ydG5hbWUgPSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkJIHAgLSBuYW1lICsgMSk7Ci0JCSAgaWYgKHNob3J0bmFtZSA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3RybmNweSAoc2hvcnRuYW1lLCBuYW1lLCBwIC0gbmFtZSk7Ci0JCSAgc2hvcnRuYW1lW3AgLSBuYW1lXSA9ICdcMCc7Ci0KLQkJICAvKiBXZSBhcmUgZ29pbmcgdG8gY3JlYXRlIGEgbmV3IHN5bWJvbC4gIE1lcmdlIGl0Ci0gICAgICAgICAgICAgICAgICAgICB3aXRoIGFueSBleGlzdGluZyBzeW1ib2wgd2l0aCB0aGlzIG5hbWUuICBGb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICBwdXJwb3NlcyBvZiB0aGUgbWVyZ2UsIGFjdCBhcyB0aG91Z2ggd2Ugd2VyZQotICAgICAgICAgICAgICAgICAgICAgZGVmaW5pbmcgdGhlIHN5bWJvbCB3ZSBqdXN0IGRlZmluZWQsIGFsdGhvdWdoIHdlCi0gICAgICAgICAgICAgICAgICAgICBhY3R1YWxseSBnb2luZyB0byBkZWZpbmUgYW4gaW5kaXJlY3Qgc3ltYm9sLiAgKi8KLQkJICB0eXBlX2NoYW5nZV9vayA9IGZhbHNlOwotCQkgIHNpemVfY2hhbmdlX29rID0gZmFsc2U7Ci0JCSAgaWYgKCEgZWxmX21lcmdlX3N5bWJvbCAoYWJmZCwgaW5mbywgc2hvcnRuYW1lLCAmc3ltLCAmc2VjLAotCQkJCQkgICZ2YWx1ZSwgJmhpLCAmb3ZlcnJpZGUsCi0JCQkJCSAgJnR5cGVfY2hhbmdlX29rLCAmc2l6ZV9jaGFuZ2Vfb2spKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICBpZiAoISBvdmVycmlkZSkKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCQkgICAgIChpbmZvLCBhYmZkLCBzaG9ydG5hbWUsIEJTRl9JTkRJUkVDVCwKLQkJCSAgICAgIGJmZF9pbmRfc2VjdGlvbl9wdHIsIChiZmRfdm1hKSAwLCBuYW1lLCBmYWxzZSwKLQkJCSAgICAgIGNvbGxlY3QsIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmhpKSkpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIEluIHRoaXMgY2FzZSB0aGUgc3ltYm9sIG5hbWVkIFNIT1JUTkFNRSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRpbmcgdGhlIGluZGlyZWN0IHN5bWJvbCB3ZSB3YW50IHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWRkLiAgV2Ugd2VyZSBwbGFubmluZyBvbiBtYWtpbmcgU0hPUlROQU1FIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5kaXJlY3Qgc3ltYm9sIHJlZmVycmluZyB0byBOQU1FLiAgU0hPUlROQU1FCi0gICAgICAgICAgICAgICAgICAgICAgICAgaXMgdGhlIG5hbWUgd2l0aG91dCBhIHZlcnNpb24uICBOQU1FIGlzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHZlcnNpb25lZCBuYW1lLCBhbmQgaXQgaXMgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLgotCi0JCQkgT3ZlcnJpZGluZyBtZWFucyB0aGF0IHdlIGFscmVhZHkgc2F3IGEKLQkJCSBkZWZpbml0aW9uIGZvciB0aGUgc3ltYm9sIFNIT1JUTkFNRSBpbiBhCi0JCQkgcmVndWxhciBvYmplY3QsIGFuZCBpdCBpcyBvdmVycmlkaW5nIHRoZQotCQkJIHN5bWJvbCBkZWZpbmVkIGluIHRoZSBkeW5hbWljIG9iamVjdC4KLQotCQkJIFdoZW4gdGhpcyBoYXBwZW5zLCB3ZSBhY3R1YWxseSB3YW50IHRvIGNoYW5nZQotCQkJIE5BTUUsIHRoZSBzeW1ib2wgd2UganVzdCBhZGRlZCwgdG8gcmVmZXIgdG8KLQkJCSBTSE9SVE5BTUUuICBUaGlzIHdpbGwgY2F1c2UgcmVmZXJlbmNlcyB0bwotCQkJIE5BTUUgaW4gdGhlIHNoYXJlZCBvYmplY3QgdG8gYmVjb21lCi0JCQkgcmVmZXJlbmNlcyB0byBTSE9SVE5BTUUgaW4gdGhlIHJlZ3VsYXIKLQkJCSBvYmplY3QuICBUaGlzIGlzIHdoYXQgd2UgZXhwZWN0IHdoZW4gd2UKLQkJCSBvdmVycmlkZSBhIGZ1bmN0aW9uIGluIGEgc2hhcmVkIG9iamVjdDogdGhhdAotCQkJIHRoZSByZWZlcmVuY2VzIGluIHRoZSBzaGFyZWQgb2JqZWN0IHdpbGwgYmUKLQkJCSBtYXBwZWQgdG8gdGhlIGRlZmluaXRpb24gaW4gdGhlIHJlZ3VsYXIKLQkJCSBvYmplY3QuICAqLwotCi0JCSAgICAgIHdoaWxlIChoaS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJCSAgICAgfHwgaGktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JCQloaSA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoaS0+cm9vdC51LmkubGluazsKLQotCQkgICAgICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX2luZGlyZWN0OwotCQkgICAgICBoLT5yb290LnUuaS5saW5rID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIGhpOwotCQkgICAgICBpZiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpCi0JCQl7Ci0JCQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUM7Ci0JCQkgIGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUM7Ci0JCQkgIGlmIChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiAoRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCQkJCSB8IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCQkJICAgIHsKLQkJCSAgICAgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLAotCQkJCQkJCQkJIGhpKSkKLQkJCQlnb3RvIGVycm9yX3JldHVybjsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgLyogTm93IHNldCBISSB0byBILCBzbyB0aGF0IHRoZSBmb2xsb3dpbmcgY29kZQotICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgc2V0IHRoZSBvdGhlciBmaWVsZHMgY29ycmVjdGx5LiAgKi8KLQkJICAgICAgaGkgPSBoOwotCQkgICAgfQotCi0JCSAgLyogSWYgdGhlcmUgaXMgYSBkdXBsaWNhdGUgZGVmaW5pdGlvbiBzb21ld2hlcmUsCi0JCSAgICAgdGhlbiBISSBtYXkgbm90IHBvaW50IHRvIGFuIGluZGlyZWN0IHN5bWJvbC4gIFdlCi0JCSAgICAgd2lsbCBoYXZlIHJlcG9ydGVkIGFuIGVycm9yIHRvIHRoZSB1c2VyIGluIHRoYXQKLQkJICAgICBjYXNlLiAgKi8KLQotCQkgIGlmIChoaS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0JCSAgICB7Ci0JCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpodDsKLQotCQkgICAgICAvKiBJZiB0aGUgc3ltYm9sIGJlY2FtZSBpbmRpcmVjdCwgdGhlbiB3ZSBhc3N1bWUKLQkJCSB0aGF0IHdlIGhhdmUgbm90IHNlZW4gYSBkZWZpbml0aW9uIGJlZm9yZS4gICovCi0JCSAgICAgIEJGRF9BU1NFUlQgKChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCSAgICYgKEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMKLQkJCQkgICAgICB8IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCQkJCSAgPT0gMCk7Ci0KLQkJICAgICAgaHQgPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaGktPnJvb3QudS5pLmxpbms7Ci0KLQkJICAgICAgLyogQ29weSBkb3duIGFueSByZWZlcmVuY2VzIHRoYXQgd2UgbWF5IGhhdmUKLQkJCSBhbHJlYWR5IHNlZW4gdG8gdGhlIHN5bWJvbCB3aGljaCBqdXN0IGJlY2FtZQotCQkJIGluZGlyZWN0LiAgKi8KLQkJICAgICAgaHQtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0KLQkJCShoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICYgKEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMKLQkJCSAgICB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKLQkJCSAgICB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSykpOwotCi0JCSAgICAgIC8qIENvcHkgb3ZlciB0aGUgZ2xvYmFsIGFuZCBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZQotCQkJIG9mZnNldCBlbnRyaWVzLiAgVGhlc2UgbWF5IGhhdmUgYmVlbiBhbHJlYWR5IHNldAotCQkJIHVwIGJ5IGEgY2hlY2tfcmVsb2NzIHJvdXRpbmUuICAqLwotCQkgICAgICBpZiAoaHQtPmdvdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQotCQkJewotCQkJICBodC0+Z290Lm9mZnNldCA9IGhpLT5nb3Qub2Zmc2V0OwotCQkJICBoaS0+Z290Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkJCX0KLQkJICAgICAgQkZEX0FTU0VSVCAoaGktPmdvdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKTsKLQotCQkgICAgICBpZiAoaHQtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQotCQkJewotCQkJICBodC0+cGx0Lm9mZnNldCA9IGhpLT5wbHQub2Zmc2V0OwotCQkJICBoaS0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkJCX0KLQkJICAgICAgQkZEX0FTU0VSVCAoaGktPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKTsKLQotCQkgICAgICBpZiAoaHQtPmR5bmluZHggPT0gLTEpCi0JCQl7Ci0JCQkgIGh0LT5keW5pbmR4ID0gaGktPmR5bmluZHg7Ci0JCQkgIGh0LT5keW5zdHJfaW5kZXggPSBoaS0+ZHluc3RyX2luZGV4OwotCQkJICBoaS0+ZHluaW5keCA9IC0xOwotCQkJICBoaS0+ZHluc3RyX2luZGV4ID0gMDsKLQkJCX0KLQkJICAgICAgQkZEX0FTU0VSVCAoaGktPmR5bmluZHggPT0gLTEpOwotCi0JCSAgICAgIC8qIEZJWE1FOiBUaGVyZSBtYXkgYmUgb3RoZXIgaW5mb3JtYXRpb24gdG8gY29weQotCQkJIG92ZXIgZm9yIHBhcnRpY3VsYXIgdGFyZ2V0cy4gICovCi0KLQkJICAgICAgLyogU2VlIGlmIHRoZSBuZXcgZmxhZ3MgbGVhZCB1cyB0byByZWFsaXplIHRoYXQKLQkJCSB0aGUgc3ltYm9sIG11c3QgYmUgZHluYW1pYy4gICovCi0JCSAgICAgIGlmICghIGR5bnN5bSkKLQkJCXsKLQkJCSAgaWYgKCEgZHluYW1pYykKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoaW5mby0+c2hhcmVkCi0JCQkJICB8fCAoKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykKLQkJCQkgICAgICAhPSAwKSkKLQkJCQlkeW5zeW0gPSB0cnVlOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGlmICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDApCi0JCQkJZHluc3ltID0gdHJ1ZTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICAvKiBXZSBhbHNvIG5lZWQgdG8gZGVmaW5lIGFuIGluZGlyZWN0aW9uIGZyb20gdGhlCi0gICAgICAgICAgICAgICAgICAgICBub25kZWZhdWx0IHZlcnNpb24gb2YgdGhlIHN5bWJvbC4gICovCi0KLQkJICBzaG9ydG5hbWUgPSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkJIHN0cmxlbiAobmFtZSkpOwotCQkgIGlmIChzaG9ydG5hbWUgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN0cm5jcHkgKHNob3J0bmFtZSwgbmFtZSwgcCAtIG5hbWUpOwotCQkgIHN0cmNweSAoc2hvcnRuYW1lICsgKHAgLSBuYW1lKSwgcCArIDEpOwotCi0JCSAgLyogT25jZSBhZ2FpbiwgbWVyZ2Ugd2l0aCBhbnkgZXhpc3Rpbmcgc3ltYm9sLiAgKi8KLQkJICB0eXBlX2NoYW5nZV9vayA9IGZhbHNlOwotCQkgIHNpemVfY2hhbmdlX29rID0gZmFsc2U7Ci0JCSAgaWYgKCEgZWxmX21lcmdlX3N5bWJvbCAoYWJmZCwgaW5mbywgc2hvcnRuYW1lLCAmc3ltLCAmc2VjLAotCQkJCQkgICZ2YWx1ZSwgJmhpLCAmb3ZlcnJpZGUsCi0JCQkJCSAgJnR5cGVfY2hhbmdlX29rLCAmc2l6ZV9jaGFuZ2Vfb2spKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICBpZiAob3ZlcnJpZGUpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEhlcmUgU0hPUlROQU1FIGlzIGEgdmVyc2lvbmVkIG5hbWUsIHNvIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgZXhwZWN0IHRvIHNlZSB0aGUgdHlwZSBvZiBvdmVycmlkZSB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgIGRvIGluIHRoZSBjYXNlIGFib3ZlLiAgKi8KLQkJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkoXygiJXM6IHdhcm5pbmc6IHVuZXhwZWN0ZWQgcmVkZWZpbml0aW9uIG9mIGAlcyciKSwKLQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc2hvcnRuYW1lKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkJICAgICAoaW5mbywgYWJmZCwgc2hvcnRuYW1lLCBCU0ZfSU5ESVJFQ1QsCi0JCQkgICAgICBiZmRfaW5kX3NlY3Rpb25fcHRyLCAoYmZkX3ZtYSkgMCwgbmFtZSwgZmFsc2UsCi0JCQkgICAgICBjb2xsZWN0LCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoaSkpKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgICAgLyogSWYgdGhlcmUgaXMgYSBkdXBsaWNhdGUgZGVmaW5pdGlvbiBzb21ld2hlcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBISSBtYXkgbm90IHBvaW50IHRvIGFuIGluZGlyZWN0IHN5bWJvbC4KLSAgICAgICAgICAgICAgICAgICAgICAgICBXZSB3aWxsIGhhdmUgcmVwb3J0ZWQgYW4gZXJyb3IgdG8gdGhlIHVzZXIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGNhc2UuICAqLwotCi0JCSAgICAgIGlmIChoaS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0JCQl7Ci0JCQkgIC8qIElmIHRoZSBzeW1ib2wgYmVjYW1lIGluZGlyZWN0LCB0aGVuIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc3VtZSB0aGF0IHdlIGhhdmUgbm90IHNlZW4gYSBkZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZS4gICovCi0JCQkgIEJGRF9BU1NFUlQgKChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCSAgICAgICAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDCi0JCQkJCSAgfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQkJCQkgICAgICA9PSAwKTsKLQotCQkJICAvKiBDb3B5IGRvd24gYW55IHJlZmVyZW5jZXMgdGhhdCB3ZSBtYXkgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IHNlZW4gdG8gdGhlIHN5bWJvbCB3aGljaCBqdXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlY2FtZSBpbmRpcmVjdC4gICovCi0JCQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0KLQkJCSAgICAoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgJiAoRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQwotCQkJCXwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCQkJCXwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLKSk7Ci0KLQkJCSAgLyogQ29weSBvdmVyIHRoZSBnbG9iYWwgYW5kIHByb2NlZHVyZSBsaW5rYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlIG9mZnNldCBlbnRyaWVzLiAgVGhlc2UgbWF5IGhhdmUgYmVlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IHNldCB1cCBieSBhIGNoZWNrX3JlbG9jcyByb3V0aW5lLiAgKi8KLQkJCSAgaWYgKGgtPmdvdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQotCQkJICAgIHsKLQkJCSAgICAgIGgtPmdvdC5vZmZzZXQgPSBoaS0+Z290Lm9mZnNldDsKLQkJCSAgICAgIGhpLT5nb3Qub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCQkJICAgIH0KLQkJCSAgQkZEX0FTU0VSVCAoaGktPmdvdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKTsKLQotCQkJICBpZiAoaC0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0JCQkgICAgewotCQkJICAgICAgaC0+cGx0Lm9mZnNldCA9IGhpLT5wbHQub2Zmc2V0OwotCQkJICAgICAgaGktPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JCQkgICAgfQotCQkJICBCRkRfQVNTRVJUIChoaS0+Z290Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpOwotCi0JCQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCQkJICAgIHsKLQkJCSAgICAgIGgtPmR5bmluZHggPSBoaS0+ZHluaW5keDsKLQkJCSAgICAgIGgtPmR5bnN0cl9pbmRleCA9IGhpLT5keW5zdHJfaW5kZXg7Ci0JCQkgICAgICBoaS0+ZHluaW5keCA9IC0xOwotCQkJICAgICAgaGktPmR5bnN0cl9pbmRleCA9IDA7Ci0JCQkgICAgfQotCQkJICBCRkRfQVNTRVJUIChoaS0+ZHluaW5keCA9PSAtMSk7Ci0KLQkJCSAgLyogRklYTUU6IFRoZXJlIG1heSBiZSBvdGhlciBpbmZvcm1hdGlvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5IG92ZXIgZm9yIHBhcnRpY3VsYXIgdGFyZ2V0cy4gICovCi0KLQkJCSAgLyogU2VlIGlmIHRoZSBuZXcgZmxhZ3MgbGVhZCB1cyB0byByZWFsaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIHN5bWJvbCBtdXN0IGJlIGR5bmFtaWMuICAqLwotCQkJICBpZiAoISBkeW5zeW0pCi0JCQkgICAgewotCQkJICAgICAgaWYgKCEgZHluYW1pYykKLQkJCQl7Ci0JCQkJICBpZiAoaW5mby0+c2hhcmVkCi0JCQkJICAgICAgfHwgKChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCQkgICAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpCi0JCQkJCSAgIT0gMCkpCi0JCQkJICAgIGR5bnN5bSA9IHRydWU7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLQkJCQkgIGlmICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgICAgICAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwKQotCQkJCSAgICBkeW5zeW0gPSB0cnVlOwotCQkJCX0KLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoZHluc3ltICYmIGgtPmR5bmluZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGlmIChoLT53ZWFrZGVmICE9IE5VTEwKLQkJICAmJiAhIG5ld193ZWFrZGVmCi0JCSAgJiYgaC0+d2Vha2RlZi0+ZHluaW5keCA9PSAtMSkKLQkJewotCQkgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLAotCQkJCQkJCSAgICAgaC0+d2Vha2RlZikpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBOb3cgc2V0IHRoZSB3ZWFrZGVmcyBmaWVsZCBjb3JyZWN0bHkgZm9yIGFsbCB0aGUgd2VhayBkZWZpbmVkCi0gICAgIHN5bWJvbHMgd2UgZm91bmQuICBUaGUgb25seSB3YXkgdG8gZG8gdGhpcyBpcyB0byBzZWFyY2ggYWxsIHRoZQotICAgICBzeW1ib2xzLiAgU2luY2Ugd2Ugb25seSBuZWVkIHRoZSBpbmZvcm1hdGlvbiBmb3Igbm9uIGZ1bmN0aW9ucyBpbgotICAgICBkeW5hbWljIG9iamVjdHMsIHRoYXQncyB0aGUgb25seSB0aW1lIHdlIGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbgotICAgICB0aGUgbGlzdCBXRUFLUy4gIFdlIG5lZWQgdGhpcyBpbmZvcm1hdGlvbiBzbyB0aGF0IGlmIGEgcmVndWxhcgotICAgICBvYmplY3QgcmVmZXJzIHRvIGEgc3ltYm9sIGRlZmluZWQgd2Vha2x5IGluIGEgZHluYW1pYyBvYmplY3QsIHRoZQotICAgICByZWFsIHN5bWJvbCBpbiB0aGUgZHluYW1pYyBvYmplY3QgaXMgYWxzbyBwdXQgaW4gdGhlIGR5bmFtaWMKLSAgICAgc3ltYm9sczsgd2UgYWxzbyBtdXN0IGFycmFuZ2UgZm9yIGJvdGggc3ltYm9scyB0byBwb2ludCB0byB0aGUKLSAgICAgc2FtZSBtZW1vcnkgbG9jYXRpb24uICBXZSBjb3VsZCBoYW5kbGUgdGhlIGdlbmVyYWwgY2FzZSBvZiBzeW1ib2wKLSAgICAgYWxpYXNpbmcsIGJ1dCBhIGdlbmVyYWwgc3ltYm9sIGFsaWFzIGNhbiBvbmx5IGJlIGdlbmVyYXRlZCBpbgotICAgICBhc3NlbWJsZXIgY29kZSwgaGFuZGxpbmcgaXQgY29ycmVjdGx5IHdvdWxkIGJlIHZlcnkgdGltZQotICAgICBjb25zdW1pbmcsIGFuZCBvdGhlciBFTEYgbGlua2VycyBkb24ndCBoYW5kbGUgZ2VuZXJhbCBhbGlhc2luZwotICAgICBlaXRoZXIuICAqLwotICB3aGlsZSAod2Vha3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaGxvb2s7Ci0gICAgICBhc2VjdGlvbiAqc2xvb2s7Ci0gICAgICBiZmRfdm1hIHZsb29rOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipocHA7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKmhwcGVuZDsKLQotICAgICAgaGxvb2sgPSB3ZWFrczsKLSAgICAgIHdlYWtzID0gaGxvb2stPndlYWtkZWY7Ci0gICAgICBobG9vay0+d2Vha2RlZiA9IE5VTEw7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGhsb29rLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaGxvb2stPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJICB8fCBobG9vay0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JCSAgfHwgaGxvb2stPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KTsKLSAgICAgIHNsb29rID0gaGxvb2stPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHZsb29rID0gaGxvb2stPnJvb3QudS5kZWYudmFsdWU7Ci0KLSAgICAgIGhwcCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgICAgIGhwcGVuZCA9IGhwcCArIGV4dHN5bWNvdW50OwotICAgICAgZm9yICg7IGhwcCA8IGhwcGVuZDsgaHBwKyspCi0JewotCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIGggPSAqaHBwOwotCSAgaWYgKGggIT0gTlVMTCAmJiBoICE9IGhsb29rCi0JICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzbG9vawotCSAgICAgICYmIGgtPnJvb3QudS5kZWYudmFsdWUgPT0gdmxvb2spCi0JICAgIHsKLQkgICAgICBobG9vay0+d2Vha2RlZiA9IGg7Ci0KLQkgICAgICAvKiBJZiB0aGUgd2VhayBkZWZpbml0aW9uIGlzIGluIHRoZSBsaXN0IG9mIGR5bmFtaWMKLQkJIHN5bWJvbHMsIG1ha2Ugc3VyZSB0aGUgcmVhbCBkZWZpbml0aW9uIGlzIHB1dCB0aGVyZQotCQkgYXMgd2VsbC4gICovCi0JICAgICAgaWYgKGhsb29rLT5keW5pbmR4ICE9IC0xCi0JCSAgJiYgaC0+ZHluaW5keCA9PSAtMSkKLQkJewotCQkgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICAvKiBJZiB0aGUgcmVhbCBkZWZpbml0aW9uIGlzIGluIHRoZSBsaXN0IG9mIGR5bmFtaWMKLSAgICAgICAgICAgICAgICAgc3ltYm9scywgbWFrZSBzdXJlIHRoZSB3ZWFrIGRlZmluaXRpb24gaXMgcHV0IHRoZXJlCi0gICAgICAgICAgICAgICAgIGFzIHdlbGwuICBJZiB3ZSBkb24ndCBkbyB0aGlzLCB0aGVuIHRoZSBkeW5hbWljCi0gICAgICAgICAgICAgICAgIGxvYWRlciBtaWdodCBub3QgbWVyZ2UgdGhlIGVudHJpZXMgZm9yIHRoZSByZWFsCi0gICAgICAgICAgICAgICAgIGRlZmluaXRpb24gYW5kIHRoZSB3ZWFrIGRlZmluaXRpb24uICAqLwotCSAgICAgIGlmIChoLT5keW5pbmR4ICE9IC0xCi0JCSAgJiYgaGxvb2stPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaGxvb2spKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoYnVmKTsKLSAgICAgIGJ1ZiA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChleHR2ZXJzeW0gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChleHR2ZXJzeW0pOwotICAgICAgZXh0dmVyc3ltID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBvYmplY3QgaXMgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBvdXRwdXQgb2JqZWN0LCBhbmQgaXQgaXMKLSAgICAgbm90IGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gbGV0IHRoZSBiYWNrZW5kIGxvb2sgdGhyb3VnaCB0aGUKLSAgICAgcmVsb2NzLgotCi0gICAgIFRoaXMgaXMgcmVxdWlyZWQgdG8gYnVpbGQgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyaWVzIGFuZCB0bwotICAgICBhcnJhbmdlIGZvciBkeW5hbWljIHJlbG9jcy4gIEl0IGlzIG5vdCByZXF1aXJlZCBmb3IgdGhlCi0gICAgIHBhcnRpY3VsYXIgY29tbW9uIGNhc2Ugb2YgbGlua2luZyBub24gUElDIGNvZGUsIGV2ZW4gd2hlbiBsaW5raW5nCi0gICAgIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcywgYnV0IHVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgbm8gd2F5IG9mCi0gICAgIGtub3dpbmcgd2hldGhlciBhbiBvYmplY3QgZmlsZSBoYXMgYmVlbiBjb21waWxlZCBQSUMgb3Igbm90LgotICAgICBMb29raW5nIHRocm91Z2ggdGhlIHJlbG9jcyBpcyBub3QgcGFydGljdWxhcmx5IHRpbWUgY29uc3VtaW5nLgotICAgICBUaGUgcHJvYmxlbSBpcyB0aGF0IHdlIG11c3QgZWl0aGVyICgxKSBrZWVwIHRoZSByZWxvY3MgaW4gbWVtb3J5LAotICAgICB3aGljaCBjYXVzZXMgdGhlIGxpbmtlciB0byByZXF1aXJlIGFkZGl0aW9uYWwgcnVudGltZSBtZW1vcnkgb3IKLSAgICAgKDIpIHJlYWQgdGhlIHJlbG9jcyB0d2ljZSBmcm9tIHRoZSBpbnB1dCBmaWxlLCB3aGljaCB3YXN0ZXMgdGltZS4KLSAgICAgVGhpcyB3b3VsZCBiZSBhIGdvb2QgY2FzZSBmb3IgdXNpbmcgbW1hcC4KLQotICAgICBJIGhhdmUgbm8gaWRlYSBob3cgdG8gaGFuZGxlIGxpbmtpbmcgUElDIGNvZGUgaW50byBhIGZpbGUgb2YgYQotICAgICBkaWZmZXJlbnQgZm9ybWF0LiAgSXQgcHJvYmFibHkgY2FuJ3QgYmUgZG9uZS4gICovCi0gIGNoZWNrX3JlbG9jcyA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y2hlY2tfcmVsb2NzOwotICBpZiAoISBkeW5hbWljCi0gICAgICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IKLSAgICAgICYmIGNoZWNrX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpvOwotCi0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotCSAgYm9vbGVhbiBvazsKLQotCSAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotCSAgICAgIHx8IG8tPnJlbG9jX2NvdW50ID09IDAKLQkgICAgICB8fCAoKGluZm8tPnN0cmlwID09IHN0cmlwX2FsbCB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9kZWJ1Z2dlcikKLQkJICAmJiAoby0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotCSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAoby0+b3V0cHV0X3NlY3Rpb24pKQotCSAgICBjb250aW51ZTsKLQotCSAgaW50ZXJuYWxfcmVsb2NzID0gKE5BTUUoX2JmZF9lbGYsbGlua19yZWFkX3JlbG9jcykKLQkJCSAgICAgKGFiZmQsIG8sIChQVFIpIE5VTEwsCi0JCQkgICAgICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJCSAgICAgIGluZm8tPmtlZXBfbWVtb3J5KSk7Ci0JICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBvayA9ICgqY2hlY2tfcmVsb2NzKSAoYWJmZCwgaW5mbywgbywgaW50ZXJuYWxfcmVsb2NzKTsKLQotCSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkpCi0JICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0KLQkgIGlmICghIG9rKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBub24tdHJhZGl0aW9uYWwsIG5vbi1yZWxvY2F0ZWFibGUgbGluaywgdHJ5IHRvCi0gICAgIG9wdGltaXplIHRoZSBoYW5kbGluZyBvZiB0aGUgLnN0YWIvLnN0YWJzdHIgc2VjdGlvbnMuICAqLwotICBpZiAoISBkeW5hbWljCi0gICAgICAmJiAhIGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgISBpbmZvLT50cmFkaXRpb25hbF9mb3JtYXQKLSAgICAgICYmIGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgJiYgKGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCAmJiBpbmZvLT5zdHJpcCAhPSBzdHJpcF9kZWJ1Z2dlcikpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN0YWIsICpzdGFic3RyOwotCi0gICAgICBzdGFiID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc3RhYiIpOwotICAgICAgaWYgKHN0YWIgIT0gTlVMTCkKLQl7Ci0JICBzdGFic3RyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc3RhYnN0ciIpOwotCi0JICBpZiAoc3RhYnN0ciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICpzZWNkYXRhOwotCi0JICAgICAgc2VjZGF0YSA9IGVsZl9zZWN0aW9uX2RhdGEgKHN0YWIpOwotCSAgICAgIGlmICghIF9iZmRfbGlua19zZWN0aW9uX3N0YWJzIChhYmZkLAotCQkJCQkgICAgICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJCQkJICAgICBzdGFiLCBzdGFic3RyLAotCQkJCQkgICAgICZzZWNkYXRhLT5zdGFiX2luZm8pKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotICBpZiAoZHluYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoZHluYnVmKTsKLSAgaWYgKGR5bnZlciAhPSBOVUxMKQotICAgIGZyZWUgKGR5bnZlcik7Ci0gIGlmIChleHR2ZXJzeW0gIT0gTlVMTCkKLSAgICBmcmVlIChleHR2ZXJzeW0pOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIENyZWF0ZSBzb21lIHNlY3Rpb25zIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGggZHluYW1pYyBsaW5raW5nCi0gICBpbmZvcm1hdGlvbi4gIEFCRkQgaXMgYW4gaW5wdXQgZmlsZSB3aGljaCByZXF1aXJlcyBkeW5hbWljIHNlY3Rpb25zCi0gICB0byBiZSBjcmVhdGVkLiAgVGhlIGR5bmFtaWMgc2VjdGlvbnMgdGFrZSB1cCB2aXJ0dWFsIG1lbW9yeSBzcGFjZQotICAgd2hlbiB0aGUgZmluYWwgZXhlY3V0YWJsZSBpcyBydW4sIHNvIHdlIG5lZWQgdG8gY3JlYXRlIHRoZW0gYmVmb3JlCi0gICBhZGRyZXNzZXMgYXJlIGFzc2lnbmVkIHRvIHRoZSBvdXRwdXQgc2VjdGlvbnMuICBXZSB3b3JrIG91dCB0aGUKLSAgIGFjdHVhbCBjb250ZW50cyBhbmQgc2l6ZSBvZiB0aGVzZSBzZWN0aW9ucyBsYXRlci4gICovCi0KLWJvb2xlYW4KLWVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBNYWtlIHN1cmUgdGhhdCBhbGwgZHluYW1pYyBzZWN0aW9ucyB1c2UgdGhlIHNhbWUgaW5wdXQgQkZELiAgKi8KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCi0gICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotICBlbHNlCi0gICAgYWJmZCA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE5vdGUgdGhhdCB3ZSBzZXQgdGhlIFNFQ19JTl9NRU1PUlkgZmxhZyBmb3IgYWxsIG9mIHRoZXNlCi0gICAgIHNlY3Rpb25zLiAgKi8KLSAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JICAgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQotICAvKiBBIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlIGhhcyBhIC5pbnRlcnAgc2VjdGlvbiwgYnV0IGEKLSAgICAgc2hhcmVkIGxpYnJhcnkgZG9lcyBub3QuICAqLwotICBpZiAoISBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuaW50ZXJwIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIHNlY3Rpb25zIHRvIGhvbGQgdmVyc2lvbiBpbmZvcm1hdGlvbnMuICBUaGVzZSBhcmUgcmVtb3ZlZAotICAgICBpZiB0aGV5IGFyZSBub3QgbmVlZGVkLiAgKi8KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ251LnZlcnNpb25fZCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIExPR19GSUxFX0FMSUdOKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ251LnZlcnNpb24iKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAxKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ251LnZlcnNpb25fciIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIExPR19GSUxFX0FMSUdOKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluc3ltIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgTE9HX0ZJTEVfQUxJR04pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5zdHIiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQ3JlYXRlIGEgc3RydGFiIHRvIGhvbGQgdGhlIGR5bmFtaWMgc3ltYm9sIG5hbWVzLiAgKi8KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyID09IE5VTEwpCi0gICAgewotICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIgPSBlbGZfc3RyaW5ndGFiX2luaXQgKCk7Ci0gICAgICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bmFtaWMiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBMT0dfRklMRV9BTElHTikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBzcGVjaWFsIHN5bWJvbCBfRFlOQU1JQyBpcyBhbHdheXMgc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUKLSAgICAgLmR5bmFtaWMgc2VjdGlvbi4gIFRoaXMgY2FsbCBvY2N1cnMgYmVmb3JlIHdlIGhhdmUgcHJvY2Vzc2VkIHRoZQotICAgICBzeW1ib2xzIGZvciBhbnkgZHluYW1pYyBvYmplY3QsIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQKLSAgICAgb3ZlcnJpZGluZyBhIGR5bmFtaWMgZGVmaW5pdGlvbi4gIFdlIGNvdWxkIHNldCBfRFlOQU1JQyBpbiBhCi0gICAgIGxpbmtlciBzY3JpcHQsIGJ1dCB3ZSBvbmx5IHdhbnQgdG8gZGVmaW5lIGl0IGlmIHdlIGFyZSwgaW4gZmFjdCwKLSAgICAgY3JlYXRpbmcgYSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgaXQgaWYgdGhlcmUKLSAgICAgaXMgbm8gLmR5bmFtaWMgc2VjdGlvbiwgc2luY2Ugb24gc29tZSBFTEYgcGxhdGZvcm1zIHRoZSBzdGFydCB1cAotICAgICBjb2RlIGV4YW1pbmVzIGl0IHRvIGRlY2lkZSBob3cgdG8gaW5pdGlhbGl6ZSB0aGUgcHJvY2Vzcy4gICovCi0gIGggPSBOVUxMOwotICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgKGluZm8sIGFiZmQsICJfRFlOQU1JQyIsIEJTRl9HTE9CQUwsIHMsIChiZmRfdm1hKSAwLAotCSAgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZAotICAgICAgJiYgISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmhhc2giKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBMT0dfRklMRV9BTElHTikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIExldCB0aGUgYmFja2VuZCBjcmVhdGUgdGhlIHJlc3Qgb2YgdGhlIHNlY3Rpb25zLiAgVGhpcyBsZXRzIHRoZQotICAgICBiYWNrZW5kIHNldCB0aGUgcmlnaHQgZmxhZ3MuICBUaGUgYmFja2VuZCB3aWxsIG5vcm1hbGx5IGNyZWF0ZQotICAgICB0aGUgLmdvdCBhbmQgLnBsdCBzZWN0aW9ucy4gICovCi0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgaWYgKCEgKCpiZWQtPmVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKSAoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGFuIGVudHJ5IHRvIHRoZSAuZHluYW1pYyB0YWJsZS4gICovCi0KLWJvb2xlYW4KLWVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgdGFnLCB2YWwpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmRfdm1hIHRhZzsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIHNpemVfdCBuZXdzaXplOwotICBiZmRfYnl0ZSAqbmV3Y29udGVudHM7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIG5ld3NpemUgPSBzLT5fcmF3X3NpemUgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9EeW4pOwotICBuZXdjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfcmVhbGxvYyAocy0+Y29udGVudHMsIG5ld3NpemUpOwotICBpZiAobmV3Y29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZHluLmRfdGFnID0gdGFnOwotICBkeW4uZF91bi5kX3ZhbCA9IHZhbDsKLSAgZWxmX3N3YXBfZHluX291dCAoZHlub2JqLCAmZHluLAotCQkgICAgKEVsZl9FeHRlcm5hbF9EeW4gKikgKG5ld2NvbnRlbnRzICsgcy0+X3Jhd19zaXplKSk7Ci0KLSAgcy0+X3Jhd19zaXplID0gbmV3c2l6ZTsKLSAgcy0+Y29udGVudHMgPSBuZXdjb250ZW50czsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLQotLyogUmVhZCBhbmQgc3dhcCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24uICBUaGV5IG1heSBoYXZlIGJlZW4gY2FjaGVkLgotICAgSWYgdGhlIEVYVEVSTkFMX1JFTE9DUyBhbmQgSU5URVJOQUxfUkVMT0NTIGFyZ3VtZW50cyBhcmUgbm90IE5VTEwsCi0gICB0aGV5IGFyZSB1c2VkIGFzIGJ1ZmZlcnMgdG8gcmVhZCBpbnRvLiAgVGhleSBhcmUga25vd24gdG8gYmUgbGFyZ2UKLSAgIGVub3VnaC4gIElmIHRoZSBJTlRFUk5BTF9SRUxPQ1MgcmVsb2NzIGFyZ3VtZW50IGlzIE5VTEwsIHRoZSByZXR1cm4KLSAgIHZhbHVlIGlzIGFsbG9jYXRlZCB1c2luZyBlaXRoZXIgbWFsbG9jIG9yIGJmZF9hbGxvYywgYWNjb3JkaW5nIHRvCi0gICB0aGUgS0VFUF9NRU1PUlkgYXJndW1lbnQuICAqLwotCi1FbGZfSW50ZXJuYWxfUmVsYSAqCi1OQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpIChhYmZkLCBvLCBleHRlcm5hbF9yZWxvY3MsIGludGVybmFsX3JlbG9jcywKLQkJCQkga2VlcF9tZW1vcnkpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKm87Ci0gICAgIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci0gICAgIGJvb2xlYW4ga2VlcF9tZW1vcnk7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotICBQVFIgYWxsb2MxID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmFsbG9jMiA9IE5VTEw7Ci0KLSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxvY3MgIT0gTlVMTCkKLSAgICByZXR1cm4gZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbG9jczsKLQotICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZWxfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyOwotCi0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaXplX3Qgc2l6ZTsKLQotICAgICAgc2l6ZSA9IG8tPnJlbG9jX2NvdW50ICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUmVsYSk7Ci0gICAgICBpZiAoa2VlcF9tZW1vcnkpCi0JaW50ZXJuYWxfcmVsb2NzID0gKEVsZl9JbnRlcm5hbF9SZWxhICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gICAgICBlbHNlCi0JaW50ZXJuYWxfcmVsb2NzID0gYWxsb2MyID0gKEVsZl9JbnRlcm5hbF9SZWxhICopIGJmZF9tYWxsb2MgKHNpemUpOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBpZiAoZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgewotICAgICAgYWxsb2MxID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgcmVsX2hkci0+c2hfc2l6ZSk7Ci0gICAgICBpZiAoYWxsb2MxID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBleHRlcm5hbF9yZWxvY3MgPSBhbGxvYzE7Ci0gICAgfQotCi0gIGlmICgoYmZkX3NlZWsgKGFiZmQsIHJlbF9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgMSwgcmVsX2hkci0+c2hfc2l6ZSwgYWJmZCkKLQkgICE9IHJlbF9oZHItPnNoX3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFN3YXAgaW4gdGhlIHJlbG9jcy4gIEZvciBjb252ZW5pZW5jZSwgd2UgYWx3YXlzIHByb2R1Y2UgYW4KLSAgICAgRWxmX0ludGVybmFsX1JlbGEgYXJyYXk7IGlmIHRoZSByZWxvY3MgYXJlIFJlbCwgd2Ugc2V0IHRoZSBhZGRlbmQKLSAgICAgdG8gMC4gICovCi0gIGlmIChyZWxfaGRyLT5zaF9lbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbCkpCi0gICAgewotICAgICAgRWxmX0V4dGVybmFsX1JlbCAqZXJlbDsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWxlbmQ7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGE7Ci0KLSAgICAgIGVyZWwgPSAoRWxmX0V4dGVybmFsX1JlbCAqKSBleHRlcm5hbF9yZWxvY3M7Ci0gICAgICBlcmVsZW5kID0gZXJlbCArIG8tPnJlbG9jX2NvdW50OwotICAgICAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBmb3IgKDsgZXJlbCA8IGVyZWxlbmQ7IGVyZWwrKywgaXJlbGErKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsIGlyZWw7Ci0KLQkgIGVsZl9zd2FwX3JlbG9jX2luIChhYmZkLCBlcmVsLCAmaXJlbCk7Ci0JICBpcmVsYS0+cl9vZmZzZXQgPSBpcmVsLnJfb2Zmc2V0OwotCSAgaXJlbGEtPnJfaW5mbyA9IGlyZWwucl9pbmZvOwotCSAgaXJlbGEtPnJfYWRkZW5kID0gMDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRWxmX0V4dGVybmFsX1JlbGEgKmVyZWxhOwotICAgICAgRWxmX0V4dGVybmFsX1JlbGEgKmVyZWxhZW5kOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhOwotCi0gICAgICBCRkRfQVNTRVJUIChyZWxfaGRyLT5zaF9lbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpKTsKLQotICAgICAgZXJlbGEgPSAoRWxmX0V4dGVybmFsX1JlbGEgKikgZXh0ZXJuYWxfcmVsb2NzOwotICAgICAgZXJlbGFlbmQgPSBlcmVsYSArIG8tPnJlbG9jX2NvdW50OwotICAgICAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBmb3IgKDsgZXJlbGEgPCBlcmVsYWVuZDsgZXJlbGErKywgaXJlbGErKykKLQllbGZfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIGVyZWxhLCBpcmVsYSk7Ci0gICAgfQotCi0gIC8qIENhY2hlIHRoZSByZXN1bHRzIGZvciBuZXh0IHRpbWUsIGlmIHdlIGNhbi4gICovCi0gIGlmIChrZWVwX21lbW9yeSkKLSAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIGlmIChhbGxvYzEgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvYzEpOwotCi0gIC8qIERvbid0IGZyZWUgYWxsb2MyLCBzaW5jZSBpZiBpdCB3YXMgYWxsb2NhdGVkIHdlIGFyZSBwYXNzaW5nIGl0Ci0gICAgIGJhY2sgKHVuZGVyIHRoZSBuYW1lIG9mIGludGVybmFsX3JlbG9jcykuICAqLwotCi0gIHJldHVybiBpbnRlcm5hbF9yZWxvY3M7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChhbGxvYzEgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvYzEpOwotICBpZiAoYWxsb2MyICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2MyKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0MCi0KLS8qIFJlY29yZCBhbiBhc3NpZ25tZW50IHRvIGEgc3ltYm9sIG1hZGUgYnkgYSBsaW5rZXIgc2NyaXB0LiAgV2UgbmVlZAotICAgdGhpcyBpbiBjYXNlIHNvbWUgZHluYW1pYyBvYmplY3QgcmVmZXJzIHRvIHRoaXMgc3ltYm9sLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1OQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkgKG91dHB1dF9iZmQsIGluZm8sIG5hbWUsIHByb3ZpZGUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJvb2xlYW4gcHJvdmlkZTsKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgYmVpbmcgcHJvdmlkZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQsIGFuZCBpdCBpcwotICAgICBjdXJyZW50bHkgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBidXQgbm90IGJ5IGEgcmVndWxhcgotICAgICBvYmplY3QsIHRoZW4gbWFyayBpdCBhcyB1bmRlZmluZWQgc28gdGhhdCB0aGUgZ2VuZXJpYyBsaW5rZXIgd2lsbAotICAgICBmb3JjZSB0aGUgY29ycmVjdCB2YWx1ZS4gICovCi0gIGlmIChwcm92aWRlCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLSAgICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgYmVpbmcgcHJvdmlkZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQsIGFuZCBpdCBpcwotICAgICBjdXJyZW50bHkgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBidXQgbm90IGJ5IGEgcmVndWxhciBvYmplY3QsCi0gICAgIHRoZW4gY2xlYXIgb3V0IGFueSB2ZXJzaW9uIGluZm9ybWF0aW9uIGJlY2F1c2UgdGhlIHN5bWJvbCB3aWxsIG5vdCBiZQotICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIGR5bmFtaWMgb2JqZWN0IGFueSBtb3JlLiAgKi8KLSAgaWYgKCFwcm92aWRlCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLSAgICBoLT52ZXJpbmZvLnZlcmRlZiA9IE5VTEw7Ci0KLSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotICBpZiAoKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMKLQkJCQkgIHwgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykpICE9IDAKLSAgICAgICB8fCBpbmZvLT5zaGFyZWQpCi0gICAgICAmJiBoLT5keW5pbmR4ID09IC0xKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSB3ZWFrIGRlZmluZWQgc3ltYm9sLCBhbmQgd2Uga25vdyBhIGNvcnJlc3BvbmRpbmcKLQkgcmVhbCBzeW1ib2wgZnJvbSB0aGUgc2FtZSBkeW5hbWljIG9iamVjdCwgbWFrZSBzdXJlIHRoZSByZWFsCi0JIHN5bWJvbCBpcyBhbHNvIG1hZGUgaW50byBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChoLT53ZWFrZGVmICE9IE5VTEwKLQkgICYmIGgtPndlYWtkZWYtPmR5bmluZHggPT0gLTEpCi0JewotCSAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgtPndlYWtkZWYpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0bwotICAgZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uLiAgKi8KLQotc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbwotewotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBHZW5lcmFsIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgLyogVmVyc2lvbiB0cmVlLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp2ZXJkZWZzOwotICAvKiBXaGV0aGVyIHdlIGFyZSBleHBvcnRpbmcgYWxsIGR5bmFtaWMgc3ltYm9scy4gICovCi0gIGJvb2xlYW4gZXhwb3J0X2R5bmFtaWM7Ci0gIC8qIFdoZXRoZXIgd2UgcmVtb3ZlZCBhbnkgc3ltYm9scyBmcm9tIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gICovCi0gIGJvb2xlYW4gcmVtb3ZlZF9keW5hbWljOwotICAvKiBXaGV0aGVyIHdlIGhhZCBhIGZhaWx1cmUuICAqLwotICBib29sZWFuIGZhaWxlZDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0bwotICAgZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcy4gICovCi0KLXN0cnVjdCBlbGZfZmluZF92ZXJkZXBfaW5mbwotewotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBHZW5lcmFsIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgLyogVGhlIG51bWJlciBvZiBkZXBlbmRlbmNpZXMuICAqLwotICB1bnNpZ25lZCBpbnQgdmVyczsKLSAgLyogV2hldGhlciB3ZSBoYWQgYSBmYWlsdXJlLiAgKi8KLSAgYm9vbGVhbiBmYWlsZWQ7Ci19OwotCi0vKiBBcnJheSB1c2VkIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGhhc2ggdGFibGUgYnVja2V0cyB0byB1c2UKLSAgIGJhc2VkIG9uIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0aGVyZSBhcmUuICBJZiB0aGVyZSBhcmUgZmV3ZXIgdGhhbgotICAgMyBzeW1ib2xzIHdlIHVzZSAxIGJ1Y2tldCwgZmV3ZXIgdGhhbiAxNyBzeW1ib2xzIHdlIHVzZSAzIGJ1Y2tldHMsCi0gICBmZXdlciB0aGFuIDM3IHdlIHVzZSAxNyBidWNrZXRzLCBhbmQgc28gZm9ydGguICBXZSBuZXZlciB1c2UgbW9yZQotICAgdGhhbiAzMjc3MSBidWNrZXRzLiAgKi8KLQotc3RhdGljIGNvbnN0IHNpemVfdCBlbGZfYnVja2V0c1tdID0KLXsKLSAgMSwgMywgMTcsIDM3LCA2NywgOTcsIDEzMSwgMTk3LCAyNjMsIDUyMSwgMTAzMSwgMjA1MywgNDA5OSwgODIwOSwKLSAgMTY0MTEsIDMyNzcxLCAwCi19OwotCi0vKiBDb21wdXRlIGJ1Y2tldCBjb3VudCBmb3IgaGFzaGluZyB0YWJsZS4gIFdlIGRvIG5vdCB1c2UgYSBzdGF0aWMgc2V0Ci0gICBvZiBwb3NzaWJsZSB0YWJsZXMgc2l6ZXMgYW55bW9yZS4gIEluc3RlYWQgd2UgZGV0ZXJtaW5lIGZvciBhbGwKLSAgIHBvc3NpYmxlIHJlYXNvbmFibGUgc2l6ZXMgb2YgdGhlIHRhYmxlIHRoZSBvdXRjb21lIChpLmUuLCB0aGUKLSAgIG51bWJlciBvZiBjb2xsaXNpb25zIGV0YykgYW5kIGNob29zZSB0aGUgYmVzdCBzb2x1dGlvbi4gIFRoZQotICAgd2VpZ2h0aW5nIGZ1bmN0aW9ucyBhcmUgbm90IHRvbyBzaW1wbGUgdG8gYWxsb3cgdGhlIHRhYmxlIHRvIGdyb3cKLSAgIHdpdGhvdXQgYm91bmRzLiAgSW5zdGVhZCBvbmUgb2YgdGhlIHdlaWdodGluZyBmYWN0b3JzIGlzIHRoZSBzaXplLgotICAgVGhlcmVmb3JlIHRoZSByZXN1bHQgaXMgYWx3YXlzIGEgZ29vZCBwYXlvZmYgYmV0d2VlbiBmZXcgY29sbGlzaW9ucwotICAgKD0gc2hvcnQgY2hhaW4gbGVuZ3RocykgYW5kIHRhYmxlIHNpemUuICAqLwotc3RhdGljIHNpemVfdAotY29tcHV0ZV9idWNrZXRfY291bnQgKGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzaXplX3QgZHluc3ltY291bnQgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotICBzaXplX3QgYmVzdF9zaXplOwotICB1bnNpZ25lZCBsb25nIGludCAqaGFzaGNvZGVzOwotICB1bnNpZ25lZCBsb25nIGludCAqaGFzaGNvZGVzcDsKLSAgdW5zaWduZWQgbG9uZyBpbnQgaTsKLQotICAvKiBDb21wdXRlIHRoZSBoYXNoIHZhbHVlcyBmb3IgYWxsIGV4cG9ydGVkIHN5bWJvbHMuICBBdCB0aGUgc2FtZQotICAgICB0aW1lIHN0b3JlIHRoZSB2YWx1ZXMgaW4gYW4gYXJyYXkgc28gdGhhdCB3ZSBjb3VsZCB1c2UgdGhlbSBmb3IKLSAgICAgb3B0aW1pemF0aW9ucy4gICovCi0gIGhhc2hjb2RlcyA9ICh1bnNpZ25lZCBsb25nIGludCAqKSBiZmRfbWFsbG9jIChkeW5zeW1jb3VudAotCQkJCQkJKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcgaW50KSk7Ci0gIGlmIChoYXNoY29kZXMgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgaGFzaGNvZGVzcCA9IGhhc2hjb2RlczsKLQotICAvKiBQdXQgYWxsIGhhc2ggdmFsdWVzIGluIEhBU0hDT0RFUy4gICovCi0gIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgZWxmX2NvbGxlY3RfaGFzaF9jb2RlcywgJmhhc2hjb2Rlc3ApOwotCi0vKiBXZSBoYXZlIGEgcHJvYmxlbSBoZXJlLiAgVGhlIGZvbGxvd2luZyBjb2RlIHRvIG9wdGltaXplIHRoZSB0YWJsZQotICAgc2l6ZSByZXF1aXJlcyBhbiBpbnRlZ2VyIHR5cGUgd2l0aCBtb3JlIHRoZSAzMiBiaXRzLiAgSWYKLSAgIEJGRF9IT1NUX1VfNjRfQklUIGlzIHNldCB3ZSBrbm93IGFib3V0IHN1Y2ggYSB0eXBlLiAgKi8KLSNpZmRlZiBCRkRfSE9TVF9VXzY0X0JJVAotICBpZiAoaW5mby0+b3B0aW1pemUgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGludCBuc3ltcyA9IGhhc2hjb2Rlc3AgLSBoYXNoY29kZXM7Ci0gICAgICBzaXplX3QgbWluc2l6ZTsKLSAgICAgIHNpemVfdCBtYXhzaXplOwotICAgICAgQkZEX0hPU1RfVV82NF9CSVQgYmVzdF9jaGxlbiA9IH4oKEJGRF9IT1NUX1VfNjRfQklUKSAwKTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaW50ICpjb3VudHMgOwotCi0gICAgICAvKiBQb3NzaWJsZSBvcHRpbWl6YXRpb24gcGFyYW1ldGVyczogaWYgd2UgaGF2ZSBOU1lNUyBzeW1ib2xzIHdlIHNheQotCSB0aGF0IHRoZSBoYXNoaW5nIHRhYmxlIG11c3QgYXQgbGVhc3QgaGF2ZSBOU1lNUy80IGFuZCBhdCBtb3N0Ci0JIDIqTlNZTVMgYnVja2V0cy4gICovCi0gICAgICBtaW5zaXplID0gbnN5bXMgLyA0OwotICAgICAgaWYgKG1pbnNpemUgPT0gMCkKLQltaW5zaXplID0gMTsKLSAgICAgIGJlc3Rfc2l6ZSA9IG1heHNpemUgPSBuc3ltcyAqIDI7Ci0KLSAgICAgIC8qIENyZWF0ZSBhcnJheSB3aGVyZSB3ZSBjb3VudCB0aGUgY29sbGlzaW9ucyBpbi4gIFdlIG11c3QgdXNlIGJmZF9tYWxsb2MKLQkgc2luY2UgdGhlIHNpemUgY291bGQgYmUgbGFyZ2UuICAqLwotICAgICAgY291bnRzID0gKHVuc2lnbmVkIGxvbmcgaW50ICopIGJmZF9tYWxsb2MgKG1heHNpemUKLQkJCQkJCSAqIHNpemVvZiAodW5zaWduZWQgbG9uZyBpbnQpKTsKLSAgICAgIGlmIChjb3VudHMgPT0gTlVMTCkKLQl7Ci0JICBmcmVlIChoYXNoY29kZXMpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICAvKiBDb21wdXRlIHRoZSAib3B0aW1hbCIgc2l6ZSBmb3IgdGhlIGhhc2ggdGFibGUuICBUaGUgY3JpdGVyaWEgaXMgYQotCSBtaW5pbWFsIGNoYWluIGxlbmd0aC4gIFRoZSBtaW5vciBjcml0ZXJpYSBpcyAob2YgY291cnNlKSB0aGUgc2l6ZQotCSBvZiB0aGUgdGFibGUuICAqLwotICAgICAgZm9yIChpID0gbWluc2l6ZTsgaSA8IG1heHNpemU7ICsraSkKLQl7Ci0JICAvKiBXYWxrIHRocm91Z2ggdGhlIGFycmF5IG9mIGhhc2hjb2RlcyBhbmQgY291bnQgdGhlIGNvbGxpc2lvbnMuICAqLwotCSAgQkZEX0hPU1RfVV82NF9CSVQgbWF4OwotCSAgdW5zaWduZWQgbG9uZyBpbnQgajsKLQkgIHVuc2lnbmVkIGxvbmcgaW50IGZhY3Q7Ci0KLQkgIG1lbXNldCAoY291bnRzLCAnXDAnLCBpICogc2l6ZW9mICh1bnNpZ25lZCBsb25nIGludCkpOwotCi0JICAvKiBEZXRlcm1pbmUgaG93IG9mdGVuIGVhY2ggaGFzaCBidWNrZXQgaXMgdXNlZC4gICovCi0JICBmb3IgKGogPSAwOyBqIDwgbnN5bXM7ICsraikKLQkgICAgKytjb3VudHNbaGFzaGNvZGVzW2pdICUgaV07Ci0KLQkgIC8qIEZvciB0aGUgd2VpZ2h0IGZ1bmN0aW9uIHdlIG5lZWQgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQkgICAgIHBhZ2VzaXplIG9uIHRoZSB0YXJnZXQuICBUaGlzIGlzIGluZm9ybWF0aW9uIG5lZWQgbm90IGJlIDEwMCUKLQkgICAgIGFjY3VyYXRlLiAgU2luY2UgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIChzbyBmYXIpIHdlCi0JICAgICBkZWZpbmUgaXQgaGVyZSB0byBhIHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZS4gIElmIGl0IGlzIGNydWNpYWwKLQkgICAgIHRvIGhhdmUgYSBiZXR0ZXIgdmFsdWUgc29tZSBkYXkgc2ltcGx5IGRlZmluZSB0aGlzIHZhbHVlLiAgKi8KLSMgaWZuZGVmIEJGRF9UQVJHRVRfUEFHRVNJWkUKLSMgIGRlZmluZSBCRkRfVEFSR0VUX1BBR0VTSVpFCSg0MDk2KQotIyBlbmRpZgotCi0JICAvKiBXZSBpbiBhbnkgY2FzZSBuZWVkIDIgKyBOU1lNUyBlbnRyaWVzIGZvciB0aGUgc2l6ZSB2YWx1ZXMgYW5kCi0JICAgICB0aGUgY2hhaW5zLiAgKi8KLQkgIG1heCA9ICgyICsgbnN5bXMpICogKEFSQ0hfU0laRSAvIDgpOwotCi0jIGlmIDEKLQkgIC8qIFZhcmlhbnQgMTogb3B0aW1pemUgZm9yIHNob3J0IGNoYWlucy4gIFdlIGFkZCB0aGUgc3F1YXJlcwotCSAgICAgb2YgYWxsIHRoZSBjaGFpbiBsZW5ndGhzICh3aGljaCBmYXZvdXMgbWFueSBzbWFsbCBjaGFpbgotCSAgICAgb3ZlciBhIGZldyBsb25nIGNoYWlucykuICAqLwotCSAgZm9yIChqID0gMDsgaiA8IGk7ICsraikKLQkgICAgbWF4ICs9IGNvdW50c1tqXSAqIGNvdW50c1tqXTsKLQotCSAgLyogVGhpcyBhZGRzIHBlbmFsdGllcyBmb3IgdGhlIG92ZXJhbGwgc2l6ZSBvZiB0aGUgdGFibGUuICAqLwotCSAgZmFjdCA9IGkgLyAoQkZEX1RBUkdFVF9QQUdFU0laRSAvIChBUkNIX1NJWkUgLyA4KSkgKyAxOwotCSAgbWF4ICo9IGZhY3QgKiBmYWN0OwotIyBlbHNlCi0JICAvKiBWYXJpYW50IDI6IE9wdGltaXplIGEgbG90IG1vcmUgZm9yIHNtYWxsIHRhYmxlLiAgSGVyZSB3ZQotCSAgICAgYWxzbyBhZGQgc3F1YXJlcyBvZiB0aGUgc2l6ZSBidXQgd2UgYWxzbyBhZGQgcGVuYWx0aWVzIGZvcgotCSAgICAgZW1wdHkgc2xvdHMgKHRoZSArMSB0ZXJtKS4gICovCi0JICBmb3IgKGogPSAwOyBqIDwgaTsgKytqKQotCSAgICBtYXggKz0gKDEgKyBjb3VudHNbal0pICogKDEgKyBjb3VudHNbal0pOwotCi0JICAvKiBUaGUgb3ZlcmFsbCBzaXplIG9mIHRoZSB0YWJsZSBpcyBjb25zaWRlcmVkLCBidXQgbm90IGFzCi0JICAgICBzdHJvbmcgYXMgaW4gdmFyaWFudCAxLCB3aGVyZSBpdCBpcyBzcXVhcmVkLiAgKi8KLQkgIGZhY3QgPSBpIC8gKEJGRF9UQVJHRVRfUEFHRVNJWkUgLyAoQVJDSF9TSVpFIC8gOCkpICsgMTsKLQkgIG1heCAqPSBmYWN0OwotIyBlbmRpZgotCi0JICAvKiBDb21wYXJlIHdpdGggY3VycmVudCBiZXN0IHJlc3VsdHMuICAqLwotCSAgaWYgKG1heCA8IGJlc3RfY2hsZW4pCi0JICAgIHsKLQkgICAgICBiZXN0X2NobGVuID0gbWF4OwotCSAgICAgIGJlc3Rfc2l6ZSA9IGk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZyZWUgKGNvdW50cyk7Ci0gICAgfQotICBlbHNlCi0jZW5kaWYgLyogZGVmaW5lZCAoQkZEX0hPU1RfVV82NF9CSVQpICovCi0gICAgewotICAgICAgLyogVGhpcyBpcyB0aGUgZmFsbGJhY2sgc29sdXRpb24gaWYgbm8gNjRiaXQgdHlwZSBpcyBhdmFpbGFibGUgb3IgaWYgd2UKLQkgYXJlIG5vdCBzdXBwb3NlZCB0byBzcGVuZCBtdWNoIHRpbWUgb24gb3B0aW1pemF0aW9ucy4gIFdlIHNlbGVjdCB0aGUKLQkgYnVja2V0IGNvdW50IHVzaW5nIGEgZml4ZWQgc2V0IG9mIG51bWJlcnMuICAqLwotICAgICAgZm9yIChpID0gMDsgZWxmX2J1Y2tldHNbaV0gIT0gMDsgaSsrKQotCXsKLQkgIGJlc3Rfc2l6ZSA9IGVsZl9idWNrZXRzW2ldOwotCSAgaWYgKGR5bnN5bWNvdW50IDwgZWxmX2J1Y2tldHNbaSArIDFdKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIEZyZWUgdGhlIGFycmF5cyB3ZSBuZWVkZWQuICAqLwotICBmcmVlIChoYXNoY29kZXMpOwotCi0gIHJldHVybiBiZXN0X3NpemU7Ci19Ci0KLS8qIFNldCB1cCB0aGUgc2l6ZXMgYW5kIGNvbnRlbnRzIG9mIHRoZSBFTEYgZHluYW1pYyBzZWN0aW9ucy4gIFRoaXMgaXMKLSAgIGNhbGxlZCBieSB0aGUgRUxGIGxpbmtlciBlbXVsYXRpb24gYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZS4gIFdlCi0gICBtdXN0IHNldCB0aGUgc2l6ZXMgb2YgdGhlIHNlY3Rpb25zIGJlZm9yZSB0aGUgbGlua2VyIHNldHMgdGhlCi0gICBhZGRyZXNzZXMgb2YgdGhlIHZhcmlvdXMgc2VjdGlvbnMuICAqLwotCi1ib29sZWFuCi1OQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSAob3V0cHV0X2JmZCwgc29uYW1lLCBycGF0aCwKLQkJCQkgICAgIGV4cG9ydF9keW5hbWljLCBmaWx0ZXJfc2hsaWIsCi0JCQkJICAgICBhdXhpbGlhcnlfZmlsdGVycywgaW5mbywgc2ludGVycHB0ciwKLQkJCQkgICAgIHZlcmRlZnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY29uc3QgY2hhciAqc29uYW1lOwotICAgICBjb25zdCBjaGFyICpycGF0aDsKLSAgICAgYm9vbGVhbiBleHBvcnRfZHluYW1pYzsKLSAgICAgY29uc3QgY2hhciAqZmlsdGVyX3NobGliOwotICAgICBjb25zdCBjaGFyICogY29uc3QgKmF1eGlsaWFyeV9maWx0ZXJzOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKipzaW50ZXJwcHRyOwotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnZlcmRlZnM7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc29uYW1lX2luZHg7Ci0gIGJmZCAqZHlub2JqOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotICBiZmRfc2l6ZV90eXBlIG9sZF9keW5zeW1jb3VudDsKLSAgc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbyBhc3ZpbmZvOwotCi0gICpzaW50ZXJwcHRyID0gTlVMTDsKLQotICBzb25hbWVfaW5keCA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLQotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRoZSBiYWNrZW5kIG1heSBoYXZlIHRvIGNyZWF0ZSBzb21lIHNlY3Rpb25zIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgotICAgICB3ZSdyZSBkeW5hbWljIG9yIG5vdC4gICovCi0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChvdXRwdXRfYmZkKTsKLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSAgICAgICYmICEgKCpiZWQtPmVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zKSAob3V0cHV0X2JmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIElmIHRoZXJlIHdlcmUgbm8gZHluYW1pYyBvYmplY3RzIGluIHRoZSBsaW5rLCB0aGVyZSBpcyBub3RoaW5nIHRvCi0gICAgIGRvIGhlcmUuICAqLwotICBpZiAoZHlub2JqID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgd2UgYXJlIHN1cHBvc2VkIHRvIGV4cG9ydCBhbGwgc3ltYm9scyBpbnRvIHRoZSBkeW5hbWljIHN5bWJvbAotICAgICB0YWJsZSAodGhpcyBpcyBub3QgdGhlIG5vcm1hbCBjYXNlKSwgdGhlbiBkbyBzby4gICovCi0gIGlmIChleHBvcnRfZHluYW1pYykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkIGVpZjsKLQotICAgICAgZWlmLmZhaWxlZCA9IGZhbHNlOwotICAgICAgZWlmLmluZm8gPSBpbmZvOwotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBlbGZfZXhwb3J0X3N5bWJvbCwKLQkJCSAgICAgIChQVFIpICZlaWYpOwotICAgICAgaWYgKGVpZi5mYWlsZWQpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCBlaWY7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3Ryc2l6ZTsKLQotICAgICAgKnNpbnRlcnBwdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotICAgICAgQkZEX0FTU0VSVCAoKnNpbnRlcnBwdHIgIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpOwotCi0gICAgICBpZiAoc29uYW1lICE9IE5VTEwpCi0JewotCSAgc29uYW1lX2luZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyLAotCQkJCQkgICAgc29uYW1lLCB0cnVlLCB0cnVlKTsKLQkgIGlmIChzb25hbWVfaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEKLQkgICAgICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU09OQU1FLCBzb25hbWVfaW5keCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5zeW1ib2xpYykKLQl7Ci0JICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NZTUJPTElDLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJwYXRoICE9IE5VTEwpCi0JewotCSAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwgcnBhdGgsCi0JCQkJICAgICB0cnVlLCB0cnVlKTsKLQkgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMQotCSAgICAgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SUEFUSCwgaW5keCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChmaWx0ZXJfc2hsaWIgIT0gTlVMTCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyLAotCQkJCSAgICAgZmlsdGVyX3NobGliLCB0cnVlLCB0cnVlKTsKLQkgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMQotCSAgICAgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9GSUxURVIsIGluZHgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoYXV4aWxpYXJ5X2ZpbHRlcnMgIT0gTlVMTCkKLQl7Ci0JICBjb25zdCBjaGFyICogY29uc3QgKnA7Ci0KLQkgIGZvciAocCA9IGF1eGlsaWFyeV9maWx0ZXJzOyAqcCAhPSBOVUxMOyBwKyspCi0JICAgIHsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICpwLCB0cnVlLCB0cnVlKTsKLQkgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEKLQkJICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfQVVYSUxJQVJZLCBpbmR4KSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBBdHRhY2ggYWxsIHRoZSBzeW1ib2xzIHRvIHRoZWlyIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotICAgICAgYXN2aW5mby5vdXRwdXRfYmZkID0gb3V0cHV0X2JmZDsKLSAgICAgIGFzdmluZm8uaW5mbyA9IGluZm87Ci0gICAgICBhc3ZpbmZvLnZlcmRlZnMgPSB2ZXJkZWZzOwotICAgICAgYXN2aW5mby5leHBvcnRfZHluYW1pYyA9IGV4cG9ydF9keW5hbWljOwotICAgICAgYXN2aW5mby5yZW1vdmVkX2R5bmFtaWMgPSBmYWxzZTsKLSAgICAgIGFzdmluZm8uZmFpbGVkID0gZmFsc2U7Ci0KLSAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICAgIGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbiwKLQkJCSAgICAgIChQVFIpICZhc3ZpbmZvKTsKLSAgICAgIGlmIChhc3ZpbmZvLmZhaWxlZCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEZpbmQgYWxsIHN5bWJvbHMgd2hpY2ggd2VyZSBkZWZpbmVkIGluIGEgZHluYW1pYyBvYmplY3QgYW5kIG1ha2UKLQkgdGhlIGJhY2tlbmQgcGljayBhIHJlYXNvbmFibGUgdmFsdWUgZm9yIHRoZW0uICAqLwotICAgICAgZWlmLmZhaWxlZCA9IGZhbHNlOwotICAgICAgZWlmLmluZm8gPSBpbmZvOwotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCwKLQkJCSAgICAgIChQVFIpICZlaWYpOwotICAgICAgaWYgKGVpZi5mYWlsZWQpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiBzb21lIG9mIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZl9iZmRfZmluYWxfbGluaywgYnV0IHdlIG11c3QgYWRkIHRoZSBlbnRyaWVzCi0JIG5vdyBzbyB0aGF0IHdlIGtub3cgdGhlIGZpbmFsIHNpemUgb2YgdGhlIC5keW5hbWljIHNlY3Rpb24uICAqLwotICAgICAgaCA9ICBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCAiX2luaXQiLCBmYWxzZSwKLQkJCQlmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggIT0gTlVMTAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiAoRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCQkJCQl8IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSAhPSAwKQotCXsKLQkgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSU5JVCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBoID0gIGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksICJfZmluaSIsIGZhbHNlLAotCQkJCSBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggIT0gTlVMTAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiAoRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCQkJCQl8IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSAhPSAwKQotCXsKLQkgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfRklOSSwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBzdHJzaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIpOwotICAgICAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9IQVNILCAwKQotCSAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NUUlRBQiwgMCkKLQkgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9TWU1UQUIsIDApCi0JICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1RSU1osIHN0cnNpemUpCi0JICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1lNRU5ULAotCQkJCSAgICAgIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIGJhY2tlbmQgbXVzdCB3b3JrIG91dCB0aGUgc2l6ZXMgb2YgYWxsIHRoZSBvdGhlciBkeW5hbWljCi0gICAgIHNlY3Rpb25zLiAgKi8KLSAgb2xkX2R5bnN5bWNvdW50ID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gICAgICAmJiAhICgqYmVkLT5lbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpIChvdXRwdXRfYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIHNpemVfdCBkeW5zeW1jb3VudDsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgc2l6ZV90IGJ1Y2tldGNvdW50ID0gMDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgLyogU2V0IHVwIHRoZSB2ZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbi4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nbnUudmVyc2lvbl9kIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGFkZGl0aW9uYWwgdmVyc2lvbiBkZWZpbml0aW9ucyBpZiB3ZSBhcmUKLSAgICAgICAgIGp1c3QgbGlua2luZyBhIHJlZ3VsYXIgYXBwbGljYXRpb24uICAqLwotICAgICAgdmVyZGVmcyA9IGFzdmluZm8udmVyZGVmczsKLQotICAgICAgaWYgKHZlcmRlZnMgPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqKnNwcDsKLQotCSAgLyogRG9uJ3QgaW5jbHVkZSB0aGlzIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgIGZvciAoc3BwID0gJm91dHB1dF9iZmQtPnNlY3Rpb25zOwotCSAgICAgICAqc3BwICE9IHMtPm91dHB1dF9zZWN0aW9uOwotCSAgICAgICBzcHAgPSAmKCpzcHApLT5uZXh0KQotCSAgICA7Ci0JICAqc3BwID0gcy0+b3V0cHV0X3NlY3Rpb24tPm5leHQ7Ci0JICAtLW91dHB1dF9iZmQtPnNlY3Rpb25fY291bnQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGludCBjZGVmczsKLQkgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQkgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdDsKLQkgIGJmZF9ieXRlICpwOwotCSAgRWxmX0ludGVybmFsX1ZlcmRlZiBkZWY7Ci0JICBFbGZfSW50ZXJuYWxfVmVyZGF1eCBkZWZhdXg7Ci0KLQkgIGlmIChhc3ZpbmZvLnJlbW92ZWRfZHluYW1pYykKLQkgICAgewotCSAgICAgIC8qIFNvbWUgZHluYW1pYyBzeW1ib2xzIHdlcmUgY2hhbmdlZCB0byBiZSBsb2NhbAotCQkgc3ltYm9scy4gIEluIHRoaXMgY2FzZSwgd2UgcmVudW1iZXIgYWxsIG9mIHRoZQotCQkgZHluYW1pYyBzeW1ib2xzLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgYSBob2xlLiAgSWYKLQkJIHRoZSBiYWNrZW5kIGNoYW5nZWQgZHluc3ltY291bnQsIHRoZW4gYXNzdW1lIHRoYXQgdGhlCi0JCSBuZXcgc3ltYm9scyBhcmUgYXQgdGhlIHN0YXJ0LiAgVGhpcyBpcyB0aGUgY2FzZSBvbgotCQkgdGhlIE1JUFMuICBGSVhNRTogVGhlIG5hbWVzIG9mIHRoZSByZW1vdmVkIHN5bWJvbHMKLQkJIHdpbGwgc3RpbGwgYmUgaW4gdGhlIGR5bmFtaWMgc3RyaW5nIHRhYmxlLCB3YXN0aW5nCi0JCSBzcGFjZS4gICovCi0JICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCA9Ci0JCTEgKyAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCAtIG9sZF9keW5zeW1jb3VudCk7Ci0JICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgICAgIGVsZl9saW5rX3JlbnVtYmVyX2R5bnN5bXMsCi0JCQkJICAgICAgKFBUUikgaW5mbyk7Ci0JICAgIH0KLQotCSAgY2RlZnMgPSAwOwotCSAgc2l6ZSA9IDA7Ci0KLQkgIC8qIE1ha2Ugc3BhY2UgZm9yIHRoZSBiYXNlIHZlcnNpb24uICAqLwotCSAgc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpOwotCSAgc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQkgICsrY2RlZnM7Ci0KLQkgIGZvciAodCA9IHZlcmRlZnM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKm47Ci0KLQkgICAgICBzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0JICAgICAgc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQkgICAgICArK2NkZWZzOwotCi0JICAgICAgZm9yIChuID0gdC0+ZGVwczsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKLQkJc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQkgICAgfQotCi0JICBzLT5fcmF3X3NpemUgPSBzaXplOwotCSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotCSAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogRmlsbCBpbiB0aGUgdmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24uICAqLwotCi0JICBwID0gcy0+Y29udGVudHM7Ci0KLQkgIGRlZi52ZF92ZXJzaW9uID0gVkVSX0RFRl9DVVJSRU5UOwotCSAgZGVmLnZkX2ZsYWdzID0gVkVSX0ZMR19CQVNFOwotCSAgZGVmLnZkX25keCA9IDE7Ci0JICBkZWYudmRfY250ID0gMTsKLQkgIGRlZi52ZF9hdXggPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpOwotCSAgZGVmLnZkX25leHQgPSAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKQotCQkJICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCkpOwotCi0JICBpZiAoc29uYW1lX2luZHggIT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCSAgICB7Ci0JICAgICAgZGVmLnZkX2hhc2ggPSBiZmRfZWxmX2hhc2ggKChjb25zdCB1bnNpZ25lZCBjaGFyICopIHNvbmFtZSk7Ci0JICAgICAgZGVmYXV4LnZkYV9uYW1lID0gc29uYW1lX2luZHg7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICAgICAgbmFtZSA9IG91dHB1dF9iZmQtPmZpbGVuYW1lOwotCSAgICAgIGRlZi52ZF9oYXNoID0gYmZkX2VsZl9oYXNoICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSBuYW1lKTsKLQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgIG5hbWUsIHRydWUsIGZhbHNlKTsKLQkgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBkZWZhdXgudmRhX25hbWUgPSBpbmR4OwotCSAgICB9Ci0JICBkZWZhdXgudmRhX25leHQgPSAwOwotCi0JICBfYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQgKG91dHB1dF9iZmQsICZkZWYsCi0JCQkJICAgIChFbGZfRXh0ZXJuYWxfVmVyZGVmICopcCk7Ci0JICBwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0JICBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfb3V0IChvdXRwdXRfYmZkLCAmZGVmYXV4LAotCQkJCSAgICAgKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopIHApOwotCSAgcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQotCSAgZm9yICh0ID0gdmVyZGVmczsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCBjZGVwczsKLQkgICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKm47Ci0JICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgICBjZGVwcyA9IDA7Ci0JICAgICAgZm9yIChuID0gdC0+ZGVwczsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKLQkJKytjZGVwczsKLQotCSAgICAgIC8qIEFkZCBhIHN5bWJvbCByZXByZXNlbnRpbmcgdGhpcyB2ZXJzaW9uLiAgKi8KLQkgICAgICBoID0gTlVMTDsKLQkgICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJICAgICAoaW5mbywgZHlub2JqLCB0LT5uYW1lLCBCU0ZfR0xPQkFMLCBiZmRfYWJzX3NlY3Rpb25fcHRyLAotCQkgICAgICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JCSAgICAgIGdldF9lbGZfYmFja2VuZF9kYXRhIChkeW5vYmopLT5jb2xsZWN0LAotCQkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH4gRUxGX0xJTktfTk9OX0VMRjsKLQkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0JICAgICAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0JICAgICAgaC0+dmVyaW5mby52ZXJ0cmVlID0gdDsKLQotCSAgICAgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgZGVmLnZkX3ZlcnNpb24gPSBWRVJfREVGX0NVUlJFTlQ7Ci0JICAgICAgZGVmLnZkX2ZsYWdzID0gMDsKLQkgICAgICBpZiAodC0+Z2xvYmFscyA9PSBOVUxMICYmIHQtPmxvY2FscyA9PSBOVUxMICYmICEgdC0+dXNlZCkKLQkJZGVmLnZkX2ZsYWdzIHw9IFZFUl9GTEdfV0VBSzsKLQkgICAgICBkZWYudmRfbmR4ID0gdC0+dmVybnVtICsgMTsKLQkgICAgICBkZWYudmRfY250ID0gY2RlcHMgKyAxOwotCSAgICAgIGRlZi52ZF9oYXNoID0gYmZkX2VsZl9oYXNoICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSB0LT5uYW1lKTsKLQkgICAgICBkZWYudmRfYXV4ID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKTsKLQkgICAgICBpZiAodC0+bmV4dCAhPSBOVUxMKQotCQlkZWYudmRfbmV4dCA9IChzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpCi0JCQkgICAgICAgKyAoY2RlcHMgKyAxKSAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpKTsKLQkgICAgICBlbHNlCi0JCWRlZi52ZF9uZXh0ID0gMDsKLQotCSAgICAgIF9iZmRfZWxmX3N3YXBfdmVyZGVmX291dCAob3V0cHV0X2JmZCwgJmRlZiwKLQkJCQkJKEVsZl9FeHRlcm5hbF9WZXJkZWYgKikgcCk7Ci0JICAgICAgcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpOwotCi0JICAgICAgZGVmYXV4LnZkYV9uYW1lID0gaC0+ZHluc3RyX2luZGV4OwotCSAgICAgIGlmICh0LT5kZXBzID09IE5VTEwpCi0JCWRlZmF1eC52ZGFfbmV4dCA9IDA7Ci0JICAgICAgZWxzZQotCQlkZWZhdXgudmRhX25leHQgPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQkgICAgICB0LT5uYW1lX2luZHggPSBkZWZhdXgudmRhX25hbWU7Ci0KLQkgICAgICBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfb3V0IChvdXRwdXRfYmZkLCAmZGVmYXV4LAotCQkJCQkgKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopIHApOwotCSAgICAgIHAgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCk7Ci0KLQkgICAgICBmb3IgKG4gPSB0LT5kZXBzOyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCQl7Ci0JCSAgaWYgKG4tPnZlcnNpb25fbmVlZGVkID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gdGhlCi0JCQkgdmVyc2lvbiBzY3JpcHQuICAqLwotCQkgICAgICBkZWZhdXgudmRhX25hbWUgPSAwOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGRlZmF1eC52ZGFfbmFtZSA9IG4tPnZlcnNpb25fbmVlZGVkLT5uYW1lX2luZHg7Ci0JCSAgaWYgKG4tPm5leHQgPT0gTlVMTCkKLQkJICAgIGRlZmF1eC52ZGFfbmV4dCA9IDA7Ci0JCSAgZWxzZQotCQkgICAgZGVmYXV4LnZkYV9uZXh0ID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCk7Ci0KLQkJICBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfb3V0IChvdXRwdXRfYmZkLCAmZGVmYXV4LAotCQkJCQkgICAgIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqKSBwKTsKLQkJICBwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9WRVJERUYsIDApCi0JICAgICAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1ZFUkRFRk5VTSwgY2RlZnMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPmN2ZXJkZWZzID0gY2RlZnM7Ci0JfQotCi0gICAgICAvKiBXb3JrIG91dCB0aGUgc2l6ZSBvZiB0aGUgdmVyc2lvbiByZWZlcmVuY2Ugc2VjdGlvbi4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdudS52ZXJzaW9uX3IiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICB7Ci0Jc3RydWN0IGVsZl9maW5kX3ZlcmRlcF9pbmZvIHNpbmZvOwotCi0Jc2luZm8ub3V0cHV0X2JmZCA9IG91dHB1dF9iZmQ7Ci0Jc2luZm8uaW5mbyA9IGluZm87Ci0Jc2luZm8udmVycyA9IGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPmN2ZXJkZWZzOwotCWlmIChzaW5mby52ZXJzID09IDApCi0JICBzaW5mby52ZXJzID0gMTsKLQlzaW5mby5mYWlsZWQgPSBmYWxzZTsKLQotCWVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQllbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzLAotCQkJCShQVFIpICZzaW5mbyk7Ci0KLQlpZiAoZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+dmVycmVmID09IE5VTEwpCi0JICB7Ci0JICAgIGFzZWN0aW9uICoqc3BwOwotCi0JICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IHZlcnNpb24gZGVmaW5pdGlvbnMsIHNvIHdlIGNhbiBqdXN0Ci0gICAgICAgICAgICAgICByZW1vdmUgdGhlIHNlY3Rpb24uICAqLwotCi0JICAgIGZvciAoc3BwID0gJm91dHB1dF9iZmQtPnNlY3Rpb25zOwotCQkgKnNwcCAhPSBzLT5vdXRwdXRfc2VjdGlvbjsKLQkJIHNwcCA9ICYoKnNwcCktPm5leHQpCi0JICAgICAgOwotCSAgICAqc3BwID0gcy0+b3V0cHV0X3NlY3Rpb24tPm5leHQ7Ci0JICAgIC0tb3V0cHV0X2JmZC0+c2VjdGlvbl9jb3VudDsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICp0OwotCSAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLQkgICAgdW5zaWduZWQgaW50IGNyZWZzOwotCSAgICBiZmRfYnl0ZSAqcDsKLQotCSAgICAvKiBCdWlsZCB0aGUgdmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24uICAqLwotCSAgICBzaXplID0gMDsKLQkgICAgY3JlZnMgPSAwOwotCSAgICBmb3IgKHQgPSBlbGZfdGRhdGEgKG91dHB1dF9iZmQpLT52ZXJyZWY7Ci0JCSB0ICE9IE5VTEw7Ci0JCSB0ID0gdC0+dm5fbmV4dHJlZikKLQkgICAgICB7Ci0JCUVsZl9JbnRlcm5hbF9WZXJuYXV4ICphOwotCi0JCXNpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmVlZCk7Ci0JCSsrY3JlZnM7Ci0JCWZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCi0JCSAgc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuYXV4KTsKLQkgICAgICB9Ci0KLQkgICAgcy0+X3Jhd19zaXplID0gc2l6ZTsKLQkgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzaXplKTsKLQkgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIHAgPSBzLT5jb250ZW50czsKLQkgICAgZm9yICh0ID0gZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+dmVycmVmOwotCQkgdCAhPSBOVUxMOwotCQkgdCA9IHQtPnZuX25leHRyZWYpCi0JICAgICAgewotCQl1bnNpZ25lZCBpbnQgY2F1eDsKLQkJRWxmX0ludGVybmFsX1Zlcm5hdXggKmE7Ci0JCWJmZF9zaXplX3R5cGUgaW5keDsKLQotCQljYXV4ID0gMDsKLQkJZm9yIChhID0gdC0+dm5fYXV4cHRyOyBhICE9IE5VTEw7IGEgPSBhLT52bmFfbmV4dHB0cikKLQkJICArK2NhdXg7Ci0KLQkJdC0+dm5fdmVyc2lvbiA9IFZFUl9ORUVEX0NVUlJFTlQ7Ci0JCXQtPnZuX2NudCA9IGNhdXg7Ci0JCWlmIChlbGZfZHRfbmFtZSAodC0+dm5fYmZkKSAhPSBOVUxMKQotCQkgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyLAotCQkJCQkgICAgIGVsZl9kdF9uYW1lICh0LT52bl9iZmQpLAotCQkJCQkgICAgIHRydWUsIGZhbHNlKTsKLQkJZWxzZQotCQkgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyLAotCQkJCQkgICAgIHQtPnZuX2JmZC0+ZmlsZW5hbWUsIHRydWUsIGZhbHNlKTsKLQkJaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQkgIHJldHVybiBmYWxzZTsKLQkJdC0+dm5fZmlsZSA9IGluZHg7Ci0JCXQtPnZuX2F1eCA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5lZWQpOwotCQlpZiAodC0+dm5fbmV4dHJlZiA9PSBOVUxMKQotCQkgIHQtPnZuX25leHQgPSAwOwotCQllbHNlCi0JCSAgdC0+dm5fbmV4dCA9IChzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuZWVkKQotCQkJCSsgY2F1eCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5hdXgpKTsKLQotCQlfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfb3V0IChvdXRwdXRfYmZkLCB0LAotCQkJCQkgICAoRWxmX0V4dGVybmFsX1Zlcm5lZWQgKikgcCk7Ci0JCXAgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmVlZCk7Ci0KLQkJZm9yIChhID0gdC0+dm5fYXV4cHRyOyBhICE9IE5VTEw7IGEgPSBhLT52bmFfbmV4dHB0cikKLQkJICB7Ci0JCSAgICBhLT52bmFfaGFzaCA9IGJmZF9lbGZfaGFzaCAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikKLQkJCQkJCWEtPnZuYV9ub2RlbmFtZSk7Ci0JCSAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgICAgIGEtPnZuYV9ub2RlbmFtZSwgdHJ1ZSwgZmFsc2UpOwotCQkgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBhLT52bmFfbmFtZSA9IGluZHg7Ci0JCSAgICBpZiAoYS0+dm5hX25leHRwdHIgPT0gTlVMTCkKLQkJICAgICAgYS0+dm5hX25leHQgPSAwOwotCQkgICAgZWxzZQotCQkgICAgICBhLT52bmFfbmV4dCA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5hdXgpOwotCi0JCSAgICBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfb3V0IChvdXRwdXRfYmZkLCBhLAotCQkJCQkgICAgICAgKEVsZl9FeHRlcm5hbF9WZXJuYXV4ICopIHApOwotCQkgICAgcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuYXV4KTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVkVSTkVFRCwgMCkKLQkJfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1ZFUk5FRUROVU0sIGNyZWZzKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+Y3ZlcnJlZnMgPSBjcmVmczsKLQkgIH0KLSAgICAgIH0KLQotICAgICAgZHluc3ltY291bnQgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCi0gICAgICAvKiBXb3JrIG91dCB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIHZlcnNpb24gc2VjdGlvbi4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nbnUudmVyc2lvbiIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIGlmIChkeW5zeW1jb3VudCA9PSAwCi0JICB8fCAodmVyZGVmcyA9PSBOVUxMICYmIGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPnZlcnJlZiA9PSBOVUxMKSkKLQl7Ci0JICBhc2VjdGlvbiAqKnNwcDsKLQotCSAgLyogV2UgZG9uJ3QgbmVlZCBhbnkgc3ltYm9sIHZlcnNpb25zOyBqdXN0IGRpc2NhcmQgdGhlCi0gICAgICAgICAgICAgc2VjdGlvbi4gICovCi0JICBmb3IgKHNwcCA9ICZvdXRwdXRfYmZkLT5zZWN0aW9uczsKLQkgICAgICAgKnNwcCAhPSBzLT5vdXRwdXRfc2VjdGlvbjsKLQkgICAgICAgc3BwID0gJigqc3BwKS0+bmV4dCkKLQkgICAgOwotCSAgKnNwcCA9IHMtPm91dHB1dF9zZWN0aW9uLT5uZXh0OwotCSAgLS1vdXRwdXRfYmZkLT5zZWN0aW9uX2NvdW50OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzLT5fcmF3X3NpemUgPSBkeW5zeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcnN5bSk7Ci0JICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotCSAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9WRVJTWU0sIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIC5keW5zeW0gYW5kIC5oYXNoIHNlY3Rpb25zLiAgV2UgY291bnRlZAotCSB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scyBpbiBlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMuCi0JIFdlIHdpbGwgYnVpbGQgdGhlIGNvbnRlbnRzIG9mIC5keW5zeW0gYW5kIC5oYXNoIHdoZW4gd2UgYnVpbGQKLQkgdGhlIGZpbmFsIHN5bWJvbCB0YWJsZSwgYmVjYXVzZSB1bnRpbCB0aGVuIHdlIGRvIG5vdCBrbm93IHRoZQotCSBjb3JyZWN0IHZhbHVlIHRvIGdpdmUgdGhlIHN5bWJvbHMuICBXZSBidWlsdCB0aGUgLmR5bnN0cgotCSBzZWN0aW9uIGFzIHdlIHdlbnQgYWxvbmcgaW4gZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IGR5bnN5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIGZpcnN0IGVudHJ5IGluIC5keW5zeW0gaXMgYSBkdW1teSBzeW1ib2wuICAqLwotICAgICAgaXN5bS5zdF92YWx1ZSA9IDA7Ci0gICAgICBpc3ltLnN0X3NpemUgPSAwOwotICAgICAgaXN5bS5zdF9uYW1lID0gMDsKLSAgICAgIGlzeW0uc3RfaW5mbyA9IDA7Ci0gICAgICBpc3ltLnN0X290aGVyID0gMDsKLSAgICAgIGlzeW0uc3Rfc2huZHggPSAwOwotICAgICAgZWxmX3N3YXBfc3ltYm9sX291dCAob3V0cHV0X2JmZCwgJmlzeW0sCi0JCQkgICAoUFRSKSAoRWxmX0V4dGVybmFsX1N5bSAqKSBzLT5jb250ZW50cyk7Ci0KLSAgICAgIC8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGhhc2hpbmcgdGFibGUuICBBcyBhIHNpZGUgZWZmZWN0IHRoaXMKLQkgY29tcHV0ZXMgdGhlIGhhc2ggdmFsdWVzIGZvciBhbGwgdGhlIG5hbWVzIHdlIGV4cG9ydC4gICovCi0gICAgICBidWNrZXRjb3VudCA9IGNvbXB1dGVfYnVja2V0X2NvdW50IChpbmZvKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaGFzaCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9ICgyICsgYnVja2V0Y291bnQgKyBkeW5zeW1jb3VudCkgKiAoQVJDSF9TSVpFIC8gOCk7Ci0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBtZW1zZXQgKHMtPmNvbnRlbnRzLCAwLCAoc2l6ZV90KSBzLT5fcmF3X3NpemUpOwotCi0gICAgICBwdXRfd29yZCAob3V0cHV0X2JmZCwgYnVja2V0Y291bnQsIHMtPmNvbnRlbnRzKTsKLSAgICAgIHB1dF93b3JkIChvdXRwdXRfYmZkLCBkeW5zeW1jb3VudCwgcy0+Y29udGVudHMgKyAoQVJDSF9TSVpFIC8gOCkpOwotCi0gICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmJ1Y2tldGNvdW50ID0gYnVja2V0Y291bnQ7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN0ciIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyKTsKLQotICAgICAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9OVUxMLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRml4IHVwIHRoZSBmbGFncyBmb3IgYSBzeW1ib2wuICBUaGlzIGhhbmRsZXMgdmFyaW91cyBjYXNlcyB3aGljaAotICAgY2FuIG9ubHkgYmUgZml4ZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBhcmUgc2Vlbi4gIFRoaXMgaXMKLSAgIGN1cnJlbnRseSBjYWxsZWQgYnkgYm90aCBhZGp1c3RfZHluYW1pY19zeW1ib2wgYW5kCi0gICBhc3NpZ25fc3ltX3ZlcnNpb24sIHdoaWNoIGlzIHVubmVjZXNzYXJ5IGJ1dCBwZXJoYXBzIG1vcmUgcm9idXN0IGluCi0gICB0aGUgZmFjZSBvZiBmdXR1cmUgY2hhbmdlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZml4X3N5bWJvbF9mbGFncyAoaCwgZWlmKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCAqZWlmOwotewotICAvKiBJZiB0aGlzIHN5bWJvbCB3YXMgbWVudGlvbmVkIGluIGEgbm9uLUVMRiBmaWxlLCB0cnkgdG8gc2V0Ci0gICAgIERFRl9SRUdVTEFSIGFuZCBSRUZfUkVHVUxBUiBjb3JyZWN0bHkuICBUaGlzIGlzIHRoZSBvbmx5IHdheSB0bwotICAgICBwZXJtaXQgYSBub24tRUxGIGZpbGUgdG8gY29ycmVjdGx5IHJlZmVyIHRvIGEgc3ltYm9sIGRlZmluZWQgaW4KLSAgICAgYW4gRUxGIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfTk9OX0VMRikgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQloLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkJICAgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUspOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpKQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkJICAgICAgIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLKTsKLQkgIGVsc2UKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotCX0KLQotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEKLQkgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpICE9IDApKQotCXsKLQkgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChlaWYtPmluZm8sIGgpKQotCSAgICB7Ci0JICAgICAgZWlmLT5mYWlsZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBVbmZvcnR1bmF0ZWx5LCBFTEZfTElOS19OT05fRUxGIGlzIG9ubHkgY29ycmVjdCBpZiB0aGUgc3ltYm9sCi0gICAgICAgICB3YXMgZmlyc3Qgc2VlbiBpbiBhIG5vbi1FTEYgZmlsZS4gIEZvcnR1bmF0ZWx5LCBpZiB0aGUgc3ltYm9sCi0gICAgICAgICB3YXMgZmlyc3Qgc2VlbiBpbiBhbiBFTEYgZmlsZSwgd2UncmUgcHJvYmFibHkgT0sgdW5sZXNzIHRoZQotICAgICAgICAgc3ltYm9sIHdhcyBkZWZpbmVkIGluIGEgbm9uLUVMRiBmaWxlLiAgQ2F0Y2ggdGhhdCBjYXNlIGhlcmUuCi0gICAgICAgICBGSVhNRTogV2UncmUgc3RpbGwgaW4gdHJvdWJsZSBpZiB0aGUgc3ltYm9sIHdhcyBmaXJzdCBzZWVuIGluCi0gICAgICAgICBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgdGhlbiBsYXRlciBpbiBhIG5vbi1FTEYgcmVndWxhciBvYmplY3QuICAqLwotICAgICAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMAotCSAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIgIT0gTlVMTAotCSAgICAgID8gKGJmZF9nZXRfZmxhdm91ciAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcikKLQkJICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgICAgOiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnUuZGVmLnNlY3Rpb24pCi0JCSAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMCkpKQotCWgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZpbmFsIGxpbmssIGFuZCB0aGUgc3ltYm9sIHdhcyBkZWZpbmVkIGFzIGEgY29tbW9uCi0gICAgIHN5bWJvbCBpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsIGFuZCB0aGVyZSB3YXMgbm8gZGVmaW5pdGlvbiBpbgotICAgICBhbnkgZHluYW1pYyBvYmplY3QsIHRoZW4gdGhlIGxpbmtlciB3aWxsIGhhdmUgYWxsb2NhdGVkIHNwYWNlIGZvcgotICAgICB0aGUgc3ltYm9sIGluIGEgY29tbW9uIHNlY3Rpb24gYnV0IHRoZSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSCi0gICAgIGZsYWcgd2lsbCBub3QgaGF2ZSBiZWVuIHNldC4gICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0gICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQotICAvKiBJZiAtQnN5bWJvbGljIHdhcyB1c2VkICh3aGljaCBtZWFucyB0byBiaW5kIHJlZmVyZW5jZXMgdG8gZ2xvYmFsCi0gICAgIHN5bWJvbHMgdG8gdGhlIGRlZmluaXRpb24gd2l0aGluIHRoZSBzaGFyZWQgb2JqZWN0KSwgYW5kIHRoaXMKLSAgICAgc3ltYm9sIHdhcyBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QsIHRoZW4gaXQgYWN0dWFsbHkgZG9lc24ndAotICAgICBuZWVkIGEgUExUIGVudHJ5LiAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDAKLSAgICAgICYmIGVpZi0+aW5mby0+c2hhcmVkCi0gICAgICAmJiBlaWYtPmluZm8tPnN5bWJvbGljCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApCi0gICAgewotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0gICAgICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSB0aGUgYmFja2VuZCBwaWNrIGEgZ29vZCB2YWx1ZSBmb3IgYSBkeW5hbWljIHN5bWJvbC4gIFRoaXMgaXMKLSAgIGNhbGxlZCB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSwgYW5kIGFsc28gY2FsbHMgaXRzZWxmCi0gICByZWN1cnNpdmVseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKmVpZiA9IChzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkICopIGRhdGE7Ci0gIGJmZCAqZHlub2JqOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gIC8qIElnbm9yZSBpbmRpcmVjdCBzeW1ib2xzLiAgVGhlc2UgYXJlIGFkZGVkIGJ5IHRoZSB2ZXJzaW9uaW5nIGNvZGUuICAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRml4IHRoZSBzeW1ib2wgZmxhZ3MuICAqLwotICBpZiAoISBlbGZfZml4X3N5bWJvbF9mbGFncyAoaCwgZWlmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgZG9lcyBub3QgcmVxdWlyZSBhIFBMVCBlbnRyeSwgYW5kIGl0IGlzIG5vdAotICAgICBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIG9yIGlzIG5vdCByZWZlcmVuY2VkIGJ5IGEgcmVndWxhcgotICAgICBvYmplY3QsIGlnbm9yZSBpdC4gIFdlIGRvIGhhdmUgdG8gaGFuZGxlIGEgd2VhayBkZWZpbmVkIHN5bWJvbCwKLSAgICAgZXZlbiBpZiBubyByZWd1bGFyIG9iamVjdCByZWZlcnMgdG8gaXQsIGlmIHdlIGRlY2lkZWQgdG8gYWRkIGl0Ci0gICAgIHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gIEZJWE1FOiBEbyB3ZSBub3JtYWxseSBuZWVkIHRvIHdvcnJ5Ci0gICAgIGFib3V0IHN5bWJvbHMgd2hpY2ggYXJlIGRlZmluZWQgYnkgb25lIGR5bmFtaWMgb2JqZWN0IGFuZAotICAgICByZWZlcmVuY2VkIGJ5IGFub3RoZXIgb25lPyAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpID09IDAKLSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDAKLQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAotCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgPT0gMAotCSAgICAgICYmIChoLT53ZWFrZGVmID09IE5VTEwgfHwgaC0+d2Vha2RlZi0+ZHluaW5keCA9PSAtMSkpKSkKLSAgICB7Ci0gICAgICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHdlJ3ZlIGFscmVhZHkgYWRqdXN0ZWQgdGhpcyBzeW1ib2wsIGRvbid0IGRvIGl0IGFnYWluLiAgVGhpcwotICAgICBjYW4gaGFwcGVuIHZpYSBhIHJlY3Vyc2l2ZSBjYWxsLiAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9EWU5BTUlDX0FESlVTVEVEKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIERvbid0IGxvb2sgYXQgdGhpcyBzeW1ib2wgYWdhaW4uICBOb3RlIHRoYXQgd2UgbXVzdCBzZXQgdGhpcwotICAgICBhZnRlciBjaGVja2luZyB0aGUgYWJvdmUgY29uZGl0aW9ucywgYmVjYXVzZSB3ZSBtYXkgbG9vayBhdCBhCi0gICAgIHN5bWJvbCBvbmNlLCBkZWNpZGUgbm90IHRvIGRvIGFueXRoaW5nLCBhbmQgdGhlbiBnZXQgY2FsbGVkCi0gICAgIHJlY3Vyc2l2ZWx5IGxhdGVyIGFmdGVyIFJFRl9SRUdVTEFSIGlzIHNldCBiZWxvdy4gICovCi0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9EWU5BTUlDX0FESlVTVEVEOwotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIGRlZmluaXRpb24sIGFuZCB3ZSBrbm93IGEgcmVhbCBkZWZpbml0aW9uLCBhbmQKLSAgICAgdGhlIHJlYWwgc3ltYm9sIGlzIG5vdCBpdHNlbGYgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsCi0gICAgIHRoZW4gZ2V0IGEgZ29vZCB2YWx1ZSBmb3IgdGhlIHJlYWwgZGVmaW5pdGlvbi4gIFdlIGhhbmRsZSB0aGUKLSAgICAgcmVhbCBzeW1ib2wgZmlyc3QsIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgdGhlIGJhY2tlbmQgcm91dGluZS4KLQotICAgICBOb3RlIHRoYXQgdGhlcmUgaXMgYSBjb25mdXNpbmcgY2FzZSBoZXJlLiAgSWYgdGhlIHJlYWwgZGVmaW5pdGlvbgotICAgICBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QgZmlsZSwgd2UgZG9uJ3QgZ2V0IHRoZSByZWFsIHN5bWJvbAotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCwgYnV0IHdlIGRvIGdldCB0aGUgd2VhayBzeW1ib2wuICBJZiB0aGUKLSAgICAgcHJvY2Vzc29yIGJhY2tlbmQgdXNlcyBhIENPUFkgcmVsb2MsIHRoZW4gaWYgc29tZSByb3V0aW5lIGluIHRoZQotICAgICBkeW5hbWljIG9iamVjdCBjaGFuZ2VzIHRoZSByZWFsIHN5bWJvbCwgd2Ugd2lsbCBub3Qgc2VlIHRoYXQKLSAgICAgY2hhbmdlIGluIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgc3ltYm9sLiAgVGhpcyBpcyB0aGUgd2F5IG90aGVyCi0gICAgIEVMRiBsaW5rZXJzIHdvcmsgYXMgd2VsbCwgYW5kIHNlZW1zIHRvIGJlIGEgcmVzdWx0IG9mIHRoZSBzaGFyZWQKLSAgICAgbGlicmFyeSBtb2RlbC4KLQotICAgICBJIHdpbGwgY2xhcmlmeSB0aGlzIGlzc3VlLiAgTW9zdCBTVlI0IHNoYXJlZCBsaWJyYXJpZXMgZGVmaW5lIHRoZQotICAgICB2YXJpYWJsZSBfdGltZXpvbmUgYW5kIGRlZmluZSB0aW1lem9uZSBhcyBhIHdlYWsgc3lub255bS4gIFRoZQotICAgICB0enNldCBjYWxsIGNoYW5nZXMgX3RpbWV6b25lLiAgSWYgeW91IHdyaXRlCi0gICAgICAgZXh0ZXJuIGludCB0aW1lem9uZTsKLSAgICAgICBpbnQgX3RpbWV6b25lID0gNTsKLSAgICAgICBpbnQgbWFpbiAoKSB7IHR6c2V0ICgpOyBwcmludGYgKCIlZCAlZFxuIiwgdGltZXpvbmUsIF90aW1lem9uZSk7IH0KLSAgICAgeW91IG1pZ2h0IGV4cGVjdCB0aGF0LCBzaW5jZSB0aW1lem9uZSBpcyBhIHN5bm9ueW0gZm9yIF90aW1lem9uZSwKLSAgICAgdGhlIHNhbWUgbnVtYmVyIHdpbGwgcHJpbnQgYm90aCB0aW1lcy4gIEhvd2V2ZXIsIGlmIHRoZSBwcm9jZXNzb3IKLSAgICAgYmFja2VuZCB1c2VzIGEgQ09QWSByZWxvYywgdGhlbiBhY3R1YWxseSB0aW1lem9uZSB3aWxsIGJlIGNvcGllZAotICAgICBpbnRvIHlvdXIgcHJvY2VzcyBpbWFnZSwgYW5kLCBzaW5jZSB5b3UgZGVmaW5lIF90aW1lem9uZQotICAgICB5b3Vyc2VsZiwgX3RpbWV6b25lIHdpbGwgbm90LiAgVGh1cyB0aW1lem9uZSBhbmQgX3RpbWV6b25lIHdpbGwKLSAgICAgd2luZCB1cCBhdCBkaWZmZXJlbnQgbWVtb3J5IGxvY2F0aW9ucy4gIFRoZSB0enNldCBjYWxsIHdpbGwgc2V0Ci0gICAgIF90aW1lem9uZSwgbGVhdmluZyB0aW1lem9uZSB1bmNoYW5nZWQuICAqLwotCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKndlYWtkZWY7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIHdlYWtkZWYgPSBoLT53ZWFrZGVmOwotICAgICAgQkZEX0FTU0VSVCAod2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IHdlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgQkZEX0FTU0VSVCAod2Vha2RlZi0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpOwotICAgICAgaWYgKCh3ZWFrZGVmLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkKLQl7Ci0JICAvKiBUaGlzIHN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QgZmlsZSwgc28gd2UKLQkgICAgIHdpbGwgbm90IGRvIGFueXRoaW5nIHNwZWNpYWwuICBDbGVhciB3ZWFrZGVmIGZvciB0aGUKLQkgICAgIGNvbnZlbmllbmNlIG9mIHRoZSBwcm9jZXNzb3IgYmFja2VuZC4gICovCi0JICBoLT53ZWFrZGVmID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhlcmUgaXMgYW4gaW1wbGljaXQgcmVmZXJlbmNlIGJ5IGEgcmVndWxhciBvYmplY3QgZmlsZQotCSAgICAgdmlhIHRoZSB3ZWFrIHN5bWJvbC4gICovCi0JICB3ZWFrZGVmLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVI7Ci0JICBpZiAoaC0+d2Vha2RlZi0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCSAgICAgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLKQotCSAgICB3ZWFrZGVmLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSzsKLQkgIGlmICghIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKHdlYWtkZWYsIChQVFIpIGVpZikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIGEgc3ltYm9sIGhhcyBubyB0eXBlIGFuZCBubyBzaXplIGFuZCBkb2VzIG5vdCByZXF1aXJlIGEgUExUCi0gICAgIGVudHJ5LCB0aGVuIHdlIGFyZSBwcm9iYWJseSBhYm91dCB0byBkbyB0aGUgd3JvbmcgdGhpbmcgaGVyZTogd2UKLSAgICAgYXJlIHByb2JhYmx5IGdvaW5nIHRvIGNyZWF0ZSBhIENPUFkgcmVsb2MgZm9yIGFuIGVtcHR5IG9iamVjdC4KLSAgICAgVGhpcyBjYXNlIGNhbiBhcmlzZSB3aGVuIGEgc2hhcmVkIG9iamVjdCBpcyBidWlsdCB3aXRoIGFzc2VtYmx5Ci0gICAgIGNvZGUsIGFuZCB0aGUgYXNzZW1ibHkgY29kZSBmYWlscyB0byBzZXQgdGhlIHN5bWJvbCB0eXBlLiAgKi8KLSAgaWYgKGgtPnNpemUgPT0gMAotICAgICAgJiYgaC0+dHlwZSA9PSBTVFRfTk9UWVBFCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSA9PSAwKQotICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgKF8oIndhcm5pbmc6IHR5cGUgYW5kIHNpemUgb2YgZHluYW1pYyBzeW1ib2wgYCVzJyBhcmUgbm90IGRlZmluZWQiKSwKLQkgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGVpZi0+aW5mbyktPmR5bm9iajsKLSAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGR5bm9iaik7Ci0gIGlmICghICgqYmVkLT5lbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wpIChlaWYtPmluZm8sIGgpKQotICAgIHsKLSAgICAgIGVpZi0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBleHBvcnQgYWxsIGRlZmluZWQgc3ltYm9scyBpbnRvIHRoZSBkeW5hbWljCi0gICBzeW1ib2wgdGFibGUuICBJdCBpcyBjYWxsZWQgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2V4cG9ydF9zeW1ib2wgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCAqZWlmID0gKHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKikgZGF0YTsKLQotICAvKiBJZ25vcmUgaW5kaXJlY3Qgc3ltYm9scy4gIFRoZXNlIGFyZSBhZGRlZCBieSB0aGUgdmVyc2lvbmluZyBjb2RlLiAgKi8KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChoLT5keW5pbmR4ID09IC0xCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCSAgJiAoRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUiB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChlaWYtPmluZm8sIGgpKQotCXsKLQkgIGVpZi0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogTG9vayB0aHJvdWdoIHRoZSBzeW1ib2xzIHdoaWNoIGFyZSBkZWZpbmVkIGluIG90aGVyIHNoYXJlZAotICAgbGlicmFyaWVzIGFuZCByZWZlcmVuY2VkIGhlcmUuICBVcGRhdGUgdGhlIGxpc3Qgb2YgdmVyc2lvbgotICAgZGVwZW5kZW5jaWVzLiAgVGhpcyB3aWxsIGJlIHB1dCBpbnRvIHRoZSAuZ251LnZlcnNpb25fciBzZWN0aW9uLgotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZWxmX2ZpbmRfdmVyZGVwX2luZm8gKnJpbmZvID0gKHN0cnVjdCBlbGZfZmluZF92ZXJkZXBfaW5mbyAqKSBkYXRhOwotICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKLSAgRWxmX0ludGVybmFsX1Zlcm5hdXggKmE7Ci0KLSAgLyogV2Ugb25seSBjYXJlIGFib3V0IHN5bWJvbHMgZGVmaW5lZCBpbiBzaGFyZWQgb2JqZWN0cyB3aXRoIHZlcnNpb24KLSAgICAgaW5mb3JtYXRpb24uICAqLwotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDAKLSAgICAgIHx8IGgtPmR5bmluZHggPT0gLTEKLSAgICAgIHx8IGgtPnZlcmluZm8udmVyZGVmID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogU2VlIGlmIHdlIGFscmVhZHkga25vdyBhYm91dCB0aGlzIHZlcnNpb24uICAqLwotICBmb3IgKHQgPSBlbGZfdGRhdGEgKHJpbmZvLT5vdXRwdXRfYmZkKS0+dmVycmVmOyB0ICE9IE5VTEw7IHQgPSB0LT52bl9uZXh0cmVmKQotICAgIHsKLSAgICAgIGlmICh0LT52bl9iZmQgIT0gaC0+dmVyaW5mby52ZXJkZWYtPnZkX2JmZCkKLQljb250aW51ZTsKLQotICAgICAgZm9yIChhID0gdC0+dm5fYXV4cHRyOyBhICE9IE5VTEw7IGEgPSBhLT52bmFfbmV4dHB0cikKLQlpZiAoYS0+dm5hX25vZGVuYW1lID09IGgtPnZlcmluZm8udmVyZGVmLT52ZF9ub2RlbmFtZSkKLQkgIHJldHVybiB0cnVlOwotCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIG5ldyB2ZXJzaW9uLiAgQWRkIGl0IHRvIHRyZWUgd2UgYXJlIGJ1aWxkaW5nLiAgKi8KLQotICBpZiAodCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHQgPSAoRWxmX0ludGVybmFsX1Zlcm5lZWQgKikgYmZkX3phbGxvYyAocmluZm8tPm91dHB1dF9iZmQsIHNpemVvZiAqdCk7Ci0gICAgICBpZiAodCA9PSBOVUxMKQotCXsKLQkgIHJpbmZvLT5mYWlsZWQgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgdC0+dm5fYmZkID0gaC0+dmVyaW5mby52ZXJkZWYtPnZkX2JmZDsKLSAgICAgIHQtPnZuX25leHRyZWYgPSBlbGZfdGRhdGEgKHJpbmZvLT5vdXRwdXRfYmZkKS0+dmVycmVmOwotICAgICAgZWxmX3RkYXRhIChyaW5mby0+b3V0cHV0X2JmZCktPnZlcnJlZiA9IHQ7Ci0gICAgfQotCi0gIGEgPSAoRWxmX0ludGVybmFsX1Zlcm5hdXggKikgYmZkX3phbGxvYyAocmluZm8tPm91dHB1dF9iZmQsIHNpemVvZiAqYSk7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIGFyZSBjb3B5aW5nIGEgc3RyaW5nIHBvaW50ZXIgaGVyZSwgYW5kIHRlc3RpbmcgaXQKLSAgICAgYWJvdmUuICBJZiBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIGlzIGV2ZXIgY2hhbmdlZCB0bwotICAgICBkaXNjYXJkIHRoZSBzdHJpbmcgZGF0YSB3aGVuIGxvdyBpbiBtZW1vcnksIHRoaXMgd2lsbCBoYXZlIHRvIGJlCi0gICAgIGZpeGVkLiAgKi8KLSAgYS0+dm5hX25vZGVuYW1lID0gaC0+dmVyaW5mby52ZXJkZWYtPnZkX25vZGVuYW1lOwotCi0gIGEtPnZuYV9mbGFncyA9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9mbGFnczsKLSAgYS0+dm5hX25leHRwdHIgPSB0LT52bl9hdXhwdHI7Ci0KLSAgaC0+dmVyaW5mby52ZXJkZWYtPnZkX2V4cF9yZWZubyA9IHJpbmZvLT52ZXJzOwotICArK3JpbmZvLT52ZXJzOwotCi0gIGEtPnZuYV9vdGhlciA9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9leHBfcmVmbm8gKyAxOwotCi0gIHQtPnZuX2F1eHB0ciA9IGE7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpZ3VyZSBvdXQgYXBwcm9wcmlhdGUgdmVyc2lvbnMgZm9yIGFsbCB0aGUgc3ltYm9scy4gIFdlIG1heSBub3QKLSAgIGhhdmUgdGhlIHZlcnNpb24gbnVtYmVyIHNjcmlwdCB1bnRpbCB3ZSBoYXZlIHJlYWQgYWxsIG9mIHRoZSBpbnB1dAotICAgZmlsZXMsIHNvIHVudGlsIHRoYXQgcG9pbnQgd2UgZG9uJ3Qga25vdyB3aGljaCBzeW1ib2xzIHNob3VsZCBiZQotICAgbG9jYWwuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24gKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbyAqc2luZm8gPQotICAgIChzdHJ1Y3QgZWxmX2Fzc2lnbl9zeW1fdmVyc2lvbl9pbmZvICopIGRhdGE7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gc2luZm8tPmluZm87Ci0gIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgZWlmOwotICBjaGFyICpwOwotCi0gIC8qIEZpeCB0aGUgc3ltYm9sIGZsYWdzLiAgKi8KLSAgZWlmLmZhaWxlZCA9IGZhbHNlOwotICBlaWYuaW5mbyA9IGluZm87Ci0gIGlmICghIGVsZl9maXhfc3ltYm9sX2ZsYWdzIChoLCAmZWlmKSkKLSAgICB7Ci0gICAgICBpZiAoZWlmLmZhaWxlZCkKLQlzaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV2Ugb25seSBuZWVkIHZlcnNpb24gbnVtYmVycyBmb3Igc3ltYm9scyBkZWZpbmVkIGluIHJlZ3VsYXIKLSAgICAgb2JqZWN0cy4gICovCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcCA9IHN0cmNociAoaC0+cm9vdC5yb290LnN0cmluZywgRUxGX1ZFUl9DSFIpOwotICBpZiAocCAhPSBOVUxMICYmIGgtPnZlcmluZm8udmVydHJlZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdDsKLSAgICAgIGJvb2xlYW4gaGlkZGVuOwotCi0gICAgICBoaWRkZW4gPSB0cnVlOwotCi0gICAgICAvKiBUaGVyZSBhcmUgdHdvIGNvbnNlY3V0aXZlIEVMRl9WRVJfQ0hSIGNoYXJhY3RlcnMgaWYgdGhpcyBpcwotICAgICAgICAgbm90IGEgaGlkZGVuIHN5bWJvbC4gICovCi0gICAgICArK3A7Ci0gICAgICBpZiAoKnAgPT0gRUxGX1ZFUl9DSFIpCi0JewotCSAgaGlkZGVuID0gZmFsc2U7Ci0JICArK3A7Ci0JfQotCi0gICAgICAvKiBJZiB0aGVyZSBpcyBubyB2ZXJzaW9uIHN0cmluZywgd2UgY2FuIGp1c3QgcmV0dXJuIG91dC4gICovCi0gICAgICBpZiAoKnAgPT0gJ1wwJykKLQl7Ci0JICBpZiAoaGlkZGVuKQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hJRERFTjsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogTG9vayBmb3IgdGhlIHZlcnNpb24uICBJZiB3ZSBmaW5kIGl0LCBpdCBpcyBubyBsb25nZXIgd2Vhay4gICovCi0gICAgICBmb3IgKHQgPSBzaW5mby0+dmVyZGVmczsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQl7Ci0JICBpZiAoc3RyY21wICh0LT5uYW1lLCBwKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW50IGxlbjsKLQkgICAgICBjaGFyICphbGM7Ci0JICAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpkOwotCi0JICAgICAgbGVuID0gcCAtIGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgICAgYWxjID0gYmZkX2FsbG9jIChzaW5mby0+b3V0cHV0X2JmZCwgbGVuKTsKLQkgICAgICBpZiAoYWxjID09IE5VTEwpCi0JICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICAgc3RybmNweSAoYWxjLCBoLT5yb290LnJvb3Quc3RyaW5nLCBsZW4gLSAxKTsKLQkgICAgICBhbGNbbGVuIC0gMV0gPSAnXDAnOwotCSAgICAgIGlmIChhbGNbbGVuIC0gMl0gPT0gRUxGX1ZFUl9DSFIpCi0JICAgICAgICBhbGNbbGVuIC0gMl0gPSAnXDAnOwotCi0JICAgICAgaC0+dmVyaW5mby52ZXJ0cmVlID0gdDsKLQkgICAgICB0LT51c2VkID0gdHJ1ZTsKLQkgICAgICBkID0gTlVMTDsKLQotCSAgICAgIGlmICh0LT5nbG9iYWxzICE9IE5VTEwpCi0JCXsKLQkJICBmb3IgKGQgPSB0LT5nbG9iYWxzOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotCQkgICAgaWYgKCgqZC0+bWF0Y2gpIChkLCBhbGMpKQotCQkgICAgICBicmVhazsKLQkJfQotCi0JICAgICAgLyogU2VlIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvIGZvcmNlIHRoaXMgc3ltYm9sIHRvCi0gICAgICAgICAgICAgICAgIGxvY2FsIHNjb3BlLiAgKi8KLQkgICAgICBpZiAoZCA9PSBOVUxMICYmIHQtPmxvY2FscyAhPSBOVUxMKQotCQl7Ci0JCSAgZm9yIChkID0gdC0+bG9jYWxzOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotCQkgICAgewotCQkgICAgICBpZiAoKCpkLT5tYXRjaCkgKGQsIGFsYykpCi0JCQl7Ci0JCQkgIGlmIChoLT5keW5pbmR4ICE9IC0xCi0JCQkgICAgICAmJiBpbmZvLT5zaGFyZWQKLQkJCSAgICAgICYmICEgc2luZm8tPmV4cG9ydF9keW5hbWljKQotCQkJICAgIHsKLQkJCSAgICAgIHNpbmZvLT5yZW1vdmVkX2R5bmFtaWMgPSB0cnVlOwotCQkJICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19GT1JDRURfTE9DQUw7Ci0JCQkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fgotCQkJCUVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCQkJICAgICAgaC0+ZHluaW5keCA9IC0xOwotCQkJICAgICAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkJCSAgICAgIC8qIEZJWE1FOiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGhhcwotCQkJCSBhbHJlYWR5IGJlZW4gcmVjb3JkZWQgaW4gdGhlIGR5bmFtaWMKLQkJCQkgc3RyaW5nIHRhYmxlIHNlY3Rpb24uICAqLwotCQkJICAgIH0KLQotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgYmZkX3JlbGVhc2UgKHNpbmZvLT5vdXRwdXRfYmZkLCBhbGMpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBhcmUgYnVpbGRpbmcgYW4gYXBwbGljYXRpb24sIHdlIG5lZWQgdG8gY3JlYXRlIGEKLSAgICAgICAgIHZlcnNpb24gbm9kZSBmb3IgdGhpcyB2ZXJzaW9uLiAgKi8KLSAgICAgIGlmICh0ID09IE5VTEwgJiYgISBpbmZvLT5zaGFyZWQpCi0JewotCSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICoqcHA7Ci0JICBpbnQgdmVyc2lvbl9pbmRleDsKLQotCSAgLyogSWYgd2UgYXJlbid0IGdvaW5nIHRvIGV4cG9ydCB0aGlzIHN5bWJvbCwgd2UgZG9uJ3QgbmVlZAotICAgICAgICAgICAgIHRvIHdvcnJ5IGFib3V0IGl0LiAqLwotCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JICAgIHJldHVybiB0cnVlOwotCi0JICB0ID0gKChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKikKLQkgICAgICAgYmZkX2FsbG9jIChzaW5mby0+b3V0cHV0X2JmZCwgc2l6ZW9mICp0KSk7Ci0JICBpZiAodCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2luZm8tPmZhaWxlZCA9IHRydWU7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIHQtPm5leHQgPSBOVUxMOwotCSAgdC0+bmFtZSA9IHA7Ci0JICB0LT5nbG9iYWxzID0gTlVMTDsKLQkgIHQtPmxvY2FscyA9IE5VTEw7Ci0JICB0LT5kZXBzID0gTlVMTDsKLQkgIHQtPm5hbWVfaW5keCA9ICh1bnNpZ25lZCBpbnQpIC0xOwotCSAgdC0+dXNlZCA9IHRydWU7Ci0KLQkgIHZlcnNpb25faW5kZXggPSAxOwotCSAgZm9yIChwcCA9ICZzaW5mby0+dmVyZGVmczsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotCSAgICArK3ZlcnNpb25faW5kZXg7Ci0JICB0LT52ZXJudW0gPSB2ZXJzaW9uX2luZGV4OwotCi0JICAqcHAgPSB0OwotCi0JICBoLT52ZXJpbmZvLnZlcnRyZWUgPSB0OwotCX0KLSAgICAgIGVsc2UgaWYgKHQgPT0gTlVMTCkKLQl7Ci0JICAvKiBXZSBjb3VsZCBub3QgZmluZCB0aGUgdmVyc2lvbiBmb3IgYSBzeW1ib2wgd2hlbgotICAgICAgICAgICAgIGdlbmVyYXRpbmcgYSBzaGFyZWQgYXJjaGl2ZS4gIFJldHVybiBhbiBlcnJvci4gICovCi0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiB1bmRlZmluZWQgdmVyc2lvbmVkIHN5bWJvbCBuYW1lICVzIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChzaW5mby0+b3V0cHV0X2JmZCksIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICBzaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChoaWRkZW4pCi0JaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19ISURERU47Ci0gICAgfQotCi0gIC8qIElmIHdlIGRvbid0IGhhdmUgYSB2ZXJzaW9uIGZvciB0aGlzIHN5bWJvbCwgc2VlIGlmIHdlIGNhbiBmaW5kCi0gICAgIHNvbWV0aGluZy4gICovCi0gIGlmIChoLT52ZXJpbmZvLnZlcnRyZWUgPT0gTlVMTCAmJiBzaW5mby0+dmVyZGVmcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdDsKLSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqZGVmbHQ7Ci0gICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmQ7Ci0KLSAgICAgIC8qIFNlZSBpZiBjYW4gZmluZCB3aGF0IHZlcnNpb24gdGhpcyBzeW1ib2wgaXMgaW4uICBJZiB0aGUKLSAgICAgICAgIHN5bWJvbCBpcyBzdXBwb3NlZCB0byBiZSBsb2NhbCwgdGhlbiBkb24ndCBhY3R1YWxseSByZWdpc3RlcgotICAgICAgICAgaXQuICAqLwotICAgICAgZGVmbHQgPSBOVUxMOwotICAgICAgZm9yICh0ID0gc2luZm8tPnZlcmRlZnM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JewotCSAgaWYgKHQtPmdsb2JhbHMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZvciAoZCA9IHQtPmdsb2JhbHM7IGQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCi0JCXsKLQkJICBpZiAoKCpkLT5tYXRjaCkgKGQsIGgtPnJvb3Qucm9vdC5zdHJpbmcpKQotCQkgICAgewotCQkgICAgICBoLT52ZXJpbmZvLnZlcnRyZWUgPSB0OwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKGQgIT0gTlVMTCkKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHQtPmxvY2FscyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZm9yIChkID0gdC0+bG9jYWxzOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotCQl7Ci0JCSAgaWYgKGQtPnBhdHRlcm5bMF0gPT0gJyonICYmIGQtPnBhdHRlcm5bMV0gPT0gJ1wwJykKLQkJICAgIGRlZmx0ID0gdDsKLQkJICBlbHNlIGlmICgoKmQtPm1hdGNoKSAoZCwgaC0+cm9vdC5yb290LnN0cmluZykpCi0JCSAgICB7Ci0JCSAgICAgIGgtPnZlcmluZm8udmVydHJlZSA9IHQ7Ci0JCSAgICAgIGlmIChoLT5keW5pbmR4ICE9IC0xCi0JCQkgICYmIGluZm8tPnNoYXJlZAotCQkJICAmJiAhIHNpbmZvLT5leHBvcnRfZHluYW1pYykKLQkJCXsKLQkJCSAgc2luZm8tPnJlbW92ZWRfZHluYW1pYyA9IHRydWU7Ci0JCQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfRk9SQ0VEX0xPQ0FMOwotCQkJICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkJCSAgaC0+ZHluaW5keCA9IC0xOwotCQkJICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCQkJICAvKiBGSVhNRTogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBoYXMgYWxyZWFkeQotCQkJICAgICBiZWVuIHJlY29yZGVkIGluIHRoZSBkeW5hbWljIHN0cmluZyB0YWJsZQotCQkJICAgICBzZWN0aW9uLiAgKi8KLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGlmIChkICE9IE5VTEwpCi0JCWJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoZGVmbHQgIT0gTlVMTCAmJiBoLT52ZXJpbmZvLnZlcnRyZWUgPT0gTlVMTCkKLQl7Ci0JICBoLT52ZXJpbmZvLnZlcnRyZWUgPSBkZWZsdDsKLQkgIGlmIChoLT5keW5pbmR4ICE9IC0xCi0JICAgICAgJiYgaW5mby0+c2hhcmVkCi0JICAgICAgJiYgISBzaW5mby0+ZXhwb3J0X2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBzaW5mby0+cmVtb3ZlZF9keW5hbWljID0gdHJ1ZTsKLQkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0ZPUkNFRF9MT0NBTDsKLQkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgICAgICBoLT5keW5pbmR4ID0gLTE7Ci0JICAgICAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkgICAgICAvKiBGSVhNRTogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBoYXMgYWxyZWFkeSBiZWVuCi0JCSByZWNvcmRlZCBpbiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGUgc2VjdGlvbi4gICovCi0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVudW1iZXIgdGhlIGR5bmFtaWMgc3ltYm9scywgaWYgc29tZSBvZgotICAgdGhlbSBhcmUgcmVtb3ZlZCBiZWNhdXNlIHRoZXkgYXJlIG1hcmtlZCBhcyBsb2NhbC4gIFRoaXMgaXMgY2FsbGVkCi0gICB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19yZW51bWJlcl9keW5zeW1zIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopIGRhdGE7Ci0KLSAgaWYgKGgtPmR5bmluZHggIT0gLTEpCi0gICAgewotICAgICAgaC0+ZHluaW5keCA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0gICAgICArK2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRmluYWwgcGhhc2Ugb2YgRUxGIGxpbmtlci4gICovCi0KLS8qIEEgc3RydWN0dXJlIHdlIHVzZSB0byBhdm9pZCBwYXNzaW5nIGxhcmdlIG51bWJlcnMgb2YgYXJndW1lbnRzLiAgKi8KLQotc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8KLXsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIE91dHB1dCBCRkQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIFN5bWJvbCBzdHJpbmcgdGFibGUuICAqLwotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzeW1zdHJ0YWI7Ci0gIC8qIC5keW5zeW0gc2VjdGlvbi4gICovCi0gIGFzZWN0aW9uICpkeW5zeW1fc2VjOwotICAvKiAuaGFzaCBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKmhhc2hfc2VjOwotICAvKiBzeW1ib2wgdmVyc2lvbiBzZWN0aW9uICguZ251LnZlcnNpb24pLiAgKi8KLSAgYXNlY3Rpb24gKnN5bXZlcl9zZWM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBjb250ZW50cyBvZiBhbnkgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIHJlbG9jcyBvZiBhbnkgc2VjdGlvbi4gICovCi0gIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBpbnRlcm5hbCByZWxvY3Mgb2YgYW55IHNlY3Rpb24uICAqLwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgZXh0ZXJuYWwgbG9jYWwgc3ltYm9scyBvZiBhbnkgaW5wdXQKLSAgICAgQkZELiAgKi8KLSAgRWxmX0V4dGVybmFsX1N5bSAqZXh0ZXJuYWxfc3ltczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGludGVybmFsIGxvY2FsIHN5bWJvbHMgb2YgYW55IGlucHV0Ci0gICAgIEJGRC4gICovCi0gIEVsZl9JbnRlcm5hbF9TeW0gKmludGVybmFsX3N5bXM7Ci0gIC8qIEFycmF5IGxhcmdlIGVub3VnaCB0byBob2xkIGEgc3ltYm9sIGluZGV4IGZvciBlYWNoIGxvY2FsIHN5bWJvbAotICAgICBvZiBhbnkgaW5wdXQgQkZELiAgKi8KLSAgbG9uZyAqaW5kaWNlczsKLSAgLyogQXJyYXkgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYSBzZWN0aW9uIHBvaW50ZXIgZm9yIGVhY2ggbG9jYWwKLSAgICAgc3ltYm9sIG9mIGFueSBpbnB1dCBCRkQuICAqLwotICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotICAvKiBCdWZmZXIgdG8gaG9sZCBzd2FwcGVkIG91dCBzeW1ib2xzLiAgKi8KLSAgRWxmX0V4dGVybmFsX1N5bSAqc3ltYnVmOwotICAvKiBOdW1iZXIgb2Ygc3dhcHBlZCBvdXQgc3ltYm9scyBpbiBidWZmZXIuICAqLwotICBzaXplX3Qgc3ltYnVmX2NvdW50OwotICAvKiBOdW1iZXIgb2Ygc3ltYm9scyB3aGljaCBmaXQgaW4gc3ltYnVmLiAgKi8KLSAgc2l6ZV90IHN5bWJ1Zl9zaXplOwotfTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfb3V0cHV0X3N5bQotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19mbHVzaF9vdXRwdXRfc3ltcwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19vdXRwdXRfZXh0c3ltCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfaW5wdXRfYmZkCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0vKiBUaGlzIHN0cnVjdCBpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gZWxmX2xpbmtfb3V0cHV0X2V4dHN5bS4gICovCi0KLXN0cnVjdCBlbGZfb3V0ZXh0X2luZm8KLXsKLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIGJvb2xlYW4gbG9jYWxzeW1zOwotICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci19OwotCi0vKiBEbyB0aGUgZmluYWwgc3RlcCBvZiBhbiBFTEYgbGluay4gICovCi0KLWJvb2xlYW4KLWVsZl9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYm9vbGVhbiBkeW5hbWljOwotICBiZmQgKmR5bm9iajsKLSAgc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gZmluZm87Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpvOwotICByZWdpc3RlciBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci0gIHJlZ2lzdGVyIGJmZCAqc3ViOwotICBzaXplX3QgbWF4X2NvbnRlbnRzX3NpemU7Ci0gIHNpemVfdCBtYXhfZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgc2l6ZV90IG1heF9pbnRlcm5hbF9yZWxvY19jb3VudDsKLSAgc2l6ZV90IG1heF9zeW1fY291bnQ7Ci0gIGZpbGVfcHRyIG9mZjsKLSAgRWxmX0ludGVybmFsX1N5bSBlbGZzeW07Ci0gIHVuc2lnbmVkIGludCBpOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXN0cnRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIHN0cnVjdCBlbGZfb3V0ZXh0X2luZm8gZW9pbmZvOwotCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLQotICBkeW5hbWljID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQ7Ci0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGZpbmZvLmluZm8gPSBpbmZvOwotICBmaW5mby5vdXRwdXRfYmZkID0gYWJmZDsKLSAgZmluZm8uc3ltc3RydGFiID0gZWxmX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAoZmluZm8uc3ltc3RydGFiID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGR5bmFtaWMpCi0gICAgewotICAgICAgZmluZm8uZHluc3ltX3NlYyA9IE5VTEw7Ci0gICAgICBmaW5mby5oYXNoX3NlYyA9IE5VTEw7Ci0gICAgICBmaW5mby5zeW12ZXJfc2VjID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmaW5mby5keW5zeW1fc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKLSAgICAgIGZpbmZvLmhhc2hfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5oYXNoIik7Ci0gICAgICBCRkRfQVNTRVJUIChmaW5mby5keW5zeW1fc2VjICE9IE5VTEwgJiYgZmluZm8uaGFzaF9zZWMgIT0gTlVMTCk7Ci0gICAgICBmaW5mby5zeW12ZXJfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nbnUudmVyc2lvbiIpOwotICAgICAgLyogTm90ZSB0aGF0IGl0IGlzIE9LIGlmIHN5bXZlcl9zZWMgaXMgTlVMTC4gICovCi0gICAgfQotCi0gIGZpbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgZmluZm8uaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgZmluZm8uZXh0ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gIGZpbmZvLmludGVybmFsX3N5bXMgPSBOVUxMOwotICBmaW5mby5pbmRpY2VzID0gTlVMTDsKLSAgZmluZm8uc2VjdGlvbnMgPSBOVUxMOwotICBmaW5mby5zeW1idWYgPSBOVUxMOwotICBmaW5mby5zeW1idWZfY291bnQgPSAwOwotCi0gIC8qIENvdW50IHVwIHRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbnMgd2Ugd2lsbCBvdXRwdXQgZm9yIGVhY2ggb3V0cHV0Ci0gICAgIHNlY3Rpb24sIHNvIHRoYXQgd2Uga25vdyB0aGUgc2l6ZXMgb2YgdGhlIHJlbG9jIHNlY3Rpb25zLiAgV2UKLSAgICAgYWxzbyBmaWd1cmUgb3V0IHNvbWUgbWF4aW11bSBzaXplcy4gICovCi0gIG1heF9jb250ZW50c19zaXplID0gMDsKLSAgbWF4X2V4dGVybmFsX3JlbG9jX3NpemUgPSAwOwotICBtYXhfaW50ZXJuYWxfcmVsb2NfY291bnQgPSAwOwotICBtYXhfc3ltX2NvdW50ID0gMDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKLQotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkgICAgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkgICAgKytvLT5yZWxvY19jb3VudDsKLQkgIGVsc2UgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0JICAgICAgLyogTWFyayBhbGwgc2VjdGlvbnMgd2hpY2ggYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZQotCQkgbGluay4gIFRoaXMgd2lsbCBub3JtYWxseSBiZSBldmVyeSBzZWN0aW9uLiAgV2UgbmVlZAotCQkgdG8gZG8gdGhpcyBzbyB0aGF0IHdlIGNhbiBpZGVudGlmeSBhbnkgc2VjdGlvbnMgd2hpY2gKLQkJIHRoZSBsaW5rZXIgaGFzIGRlY2lkZWQgdG8gbm90IGluY2x1ZGUuICAqLwotCSAgICAgIHNlYy0+bGlua2VyX21hcmsgPSB0cnVlOwotCi0JICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkJby0+cmVsb2NfY291bnQgKz0gc2VjLT5yZWxvY19jb3VudDsKLQotCSAgICAgIGlmIChzZWMtPl9yYXdfc2l6ZSA+IG1heF9jb250ZW50c19zaXplKQotCQltYXhfY29udGVudHNfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCSAgICAgIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA+IG1heF9jb250ZW50c19zaXplKQotCQltYXhfY29udGVudHNfc2l6ZSA9IHNlYy0+X2Nvb2tlZF9zaXplOwotCi0JICAgICAgLyogV2UgYXJlIGludGVyZXN0ZWQgaW4ganVzdCBsb2NhbCBzeW1ib2xzLCBub3QgYWxsCi0JCSBzeW1ib2xzLiAgKi8KLQkgICAgICBpZiAoYmZkX2dldF9mbGF2b3VyIChzZWMtPm93bmVyKSA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0JCSAgJiYgKHNlYy0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLQkJewotCQkgIHNpemVfdCBzeW1fY291bnQ7Ci0KLQkJICBpZiAoZWxmX2JhZF9zeW10YWIgKHNlYy0+b3duZXIpKQotCQkgICAgc3ltX2NvdW50ID0gKGVsZl90ZGF0YSAoc2VjLT5vd25lciktPnN5bXRhYl9oZHIuc2hfc2l6ZQotCQkJCSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpOwotCQkgIGVsc2UKLQkJICAgIHN5bV9jb3VudCA9IGVsZl90ZGF0YSAoc2VjLT5vd25lciktPnN5bXRhYl9oZHIuc2hfaW5mbzsKLQotCQkgIGlmIChzeW1fY291bnQgPiBtYXhfc3ltX2NvdW50KQotCQkgICAgbWF4X3N5bV9jb3VudCA9IHN5bV9jb3VudDsKLQotCQkgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgc2l6ZV90IGV4dF9zaXplOwotCi0JCSAgICAgIGV4dF9zaXplID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9zaXplOwotCQkgICAgICBpZiAoZXh0X3NpemUgPiBtYXhfZXh0ZXJuYWxfcmVsb2Nfc2l6ZSkKLQkJCW1heF9leHRlcm5hbF9yZWxvY19zaXplID0gZXh0X3NpemU7Ci0JCSAgICAgIGlmIChzZWMtPnJlbG9jX2NvdW50ID4gbWF4X2ludGVybmFsX3JlbG9jX2NvdW50KQotCQkJbWF4X2ludGVybmFsX3JlbG9jX2NvdW50ID0gc2VjLT5yZWxvY19jb3VudDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoby0+cmVsb2NfY291bnQgPiAwKQotCW8tPmZsYWdzIHw9IFNFQ19SRUxPQzsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBFeHBsaWNpdGx5IGNsZWFyIHRoZSBTRUNfUkVMT0MgZmxhZy4gIFRoZSBsaW5rZXIgdGVuZHMgdG8KLQkgICAgIHNldCBpdCAodGhpcyBpcyBwcm9iYWJseSBhIGJ1ZykgYW5kIGlmIGl0IGlzIHNldAotCSAgICAgYXNzaWduX3NlY3Rpb25fbnVtYmVycyB3aWxsIGNyZWF0ZSBhIHJlbG9jIHNlY3Rpb24uICAqLwotCSAgby0+ZmxhZ3MgJj1+IFNFQ19SRUxPQzsKLQl9Ci0KLSAgICAgIC8qIElmIHRoZSBTRUNfQUxMT0MgZmxhZyBpcyBub3Qgc2V0LCBmb3JjZSB0aGUgc2VjdGlvbiBWTUEgdG8KLQkgemVyby4gIFRoaXMgaXMgZG9uZSBpbiBlbGZfZmFrZV9zZWN0aW9ucyBhcyB3ZWxsLCBidXQgZm9yY2luZwotCSB0aGUgVk1BIHRvIDAgaGVyZSB3aWxsIGVuc3VyZSB0aGF0IHJlbG9jcyBhZ2FpbnN0IHRoZXNlCi0JIHNlY3Rpb25zIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwCi0JICAmJiAhIG8tPnVzZXJfc2V0X3ZtYSkKLQlvLT52bWEgPSAwOwotICAgIH0KLQotICAvKiBGaWd1cmUgb3V0IHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgZXZlcnl0aGluZyBidXQgdGhlIHN5bWJvbCB0YWJsZQotICAgICBhbmQgdGhlIHJlbG9jcy4gIFdlIHNldCBzeW1jb3VudCB0byBmb3JjZSBhc3NpZ25fc2VjdGlvbl9udW1iZXJzCi0gICAgIHRvIGNyZWF0ZSBhIHN5bWJvbCB0YWJsZS4gICovCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gaW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsID8gMCA6IDE7Ci0gIEJGRF9BU1NFUlQgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bik7Ci0gIGlmICghIF9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCwgaW5mbykpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhhdCBjcmVhdGVkIHRoZSByZWxvYyBzZWN0aW9ucy4gIFNldCB0aGVpciBzaXplcywgYW5kIGFzc2lnbgotICAgICB0aGVtIGZpbGUgcG9zaXRpb25zLCBhbmQgYWxsb2NhdGUgc29tZSBidWZmZXJzLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLQkgIHJlZ2lzdGVyIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqcCwgKipwZW5kOwotCi0JICByZWxfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyOwotCi0JICByZWxfaGRyLT5zaF9zaXplID0gcmVsX2hkci0+c2hfZW50c2l6ZSAqIG8tPnJlbG9jX2NvdW50OwotCi0JICAvKiBUaGUgY29udGVudHMgZmllbGQgbXVzdCBsYXN0IGludG8gd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotCSAgICAgc28gd2UgYWxsb2NhdGUgaXQgd2l0aCBiZmRfYWxsb2MgcmF0aGVyIHRoYW4gbWFsbG9jLiAgKi8KLQkgIHJlbF9oZHItPmNvbnRlbnRzID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCByZWxfaGRyLT5zaF9zaXplKTsKLQkgIGlmIChyZWxfaGRyLT5jb250ZW50cyA9PSBOVUxMICYmIHJlbF9oZHItPnNoX3NpemUgIT0gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIHAgPSAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudAotCQkJICAgKiBzaXplb2YgKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKSk7Ci0JICBpZiAocCA9PSBOVUxMICYmIG8tPnJlbG9jX2NvdW50ICE9IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oYXNoZXMgPSBwOwotCSAgcGVuZCA9IHAgKyBvLT5yZWxvY19jb3VudDsKLQkgIGZvciAoOyBwIDwgcGVuZDsgcCsrKQotCSAgICAqcCA9IE5VTEw7Ci0KLQkgIC8qIFVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYW4gaW5kZXggd2hlbiBvdXRwdXR0aW5nIHRoZQotCSAgICAgcmVsb2NzLiAgKi8KLQkgIG8tPnJlbG9jX2NvdW50ID0gMDsKLQl9Ci0gICAgfQotCi0gIF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzIChhYmZkKTsKLQotICAvKiBXZSBoYXZlIG5vdyBhc3NpZ25lZCBmaWxlIHBvc2l0aW9ucyBmb3IgYWxsIHRoZSBzZWN0aW9ucyBleGNlcHQKLSAgICAgLnN5bXRhYiBhbmQgLnN0cnRhYi4gIFdlIHN0YXJ0IHRoZSAuc3ltdGFiIHNlY3Rpb24gYXQgdGhlIGN1cnJlbnQKLSAgICAgZmlsZSBwb3NpdGlvbiwgYW5kIHdyaXRlIGRpcmVjdGx5IHRvIGl0LiAgV2UgYnVpbGQgdGhlIC5zdHJ0YWIKLSAgICAgc2VjdGlvbiBpbiBtZW1vcnkuICAqLwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IDA7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgLyogc2hfbmFtZSBpcyBzZXQgaW4gcHJlcF9oZWFkZXJzLiAgKi8KLSAgc3ltdGFiX2hkci0+c2hfdHlwZSA9IFNIVF9TWU1UQUI7Ci0gIHN5bXRhYl9oZHItPnNoX2ZsYWdzID0gMDsKLSAgc3ltdGFiX2hkci0+c2hfYWRkciA9IDA7Ci0gIHN5bXRhYl9oZHItPnNoX3NpemUgPSAwOwotICBzeW10YWJfaGRyLT5zaF9lbnRzaXplID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgLyogc2hfbGluayBpcyBzZXQgaW4gYXNzaWduX3NlY3Rpb25fbnVtYmVycy4gICovCi0gIC8qIHNoX2luZm8gaXMgc2V0IGJlbG93LiAgKi8KLSAgLyogc2hfb2Zmc2V0IGlzIHNldCBqdXN0IGJlbG93LiAgKi8KLSAgc3ltdGFiX2hkci0+c2hfYWRkcmFsaWduID0gNDsgIC8qIEZJWE1FOiBzeXN0ZW0gZGVwZW5kZW50PyAgKi8KLQotICBvZmYgPSBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zOwotICBvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoc3ltdGFiX2hkciwgb2ZmLCB0cnVlKTsKLQotICAvKiBOb3RlIHRoYXQgYXQgdGhpcyBwb2ludCBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zIGlzCi0gICAgIGluY29ycmVjdC4gIFdlIGRvIG5vdCB5ZXQga25vdyB0aGUgc2l6ZSBvZiB0aGUgLnN5bXRhYiBzZWN0aW9uLgotICAgICBXZSBjb3JyZWN0IG5leHRfZmlsZV9wb3MgYmVsb3csIGFmdGVyIHdlIGRvIGtub3cgdGhlIHNpemUuICAqLwotCi0gIC8qIEFsbG9jYXRlIGEgYnVmZmVyIHRvIGhvbGQgc3dhcHBlZCBvdXQgc3ltYm9scy4gIFRoaXMgaXMgdG8gYXZvaWQKLSAgICAgY29udGludW91c2x5IHNlZWtpbmcgdG8gdGhlIHJpZ2h0IHBvc2l0aW9uIGluIHRoZSBmaWxlLiAgKi8KLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkgfHwgbWF4X3N5bV9jb3VudCA8IDIwKQotICAgIGZpbmZvLnN5bWJ1Zl9zaXplID0gMjA7Ci0gIGVsc2UKLSAgICBmaW5mby5zeW1idWZfc2l6ZSA9IG1heF9zeW1fY291bnQ7Ci0gIGZpbmZvLnN5bWJ1ZiA9ICgoRWxmX0V4dGVybmFsX1N5bSAqKQotCQkgIGJmZF9tYWxsb2MgKGZpbmZvLnN5bWJ1Zl9zaXplICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpOwotICBpZiAoZmluZm8uc3ltYnVmID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogU3RhcnQgd3JpdGluZyBvdXQgdGhlIHN5bWJvbCB0YWJsZS4gIFRoZSBmaXJzdCBzeW1ib2wgaXMgYWx3YXlzIGEKLSAgICAgZHVtbXkgc3ltYm9sLiAgKi8KLSAgaWYgKGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCB8fCBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgZWxmc3ltLnN0X3ZhbHVlID0gMDsKLSAgICAgIGVsZnN5bS5zdF9zaXplID0gMDsKLSAgICAgIGVsZnN5bS5zdF9pbmZvID0gMDsKLSAgICAgIGVsZnN5bS5zdF9vdGhlciA9IDA7Ci0gICAgICBlbGZzeW0uc3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0gICAgICBpZiAoISBlbGZfbGlua19vdXRwdXRfc3ltICgmZmluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICZlbGZzeW0sIGJmZF91bmRfc2VjdGlvbl9wdHIpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotI2lmIDAKLSAgLyogU29tZSBzdGFuZGFyZCBFTEYgbGlua2VycyBkbyB0aGlzLCBidXQgd2UgZG9uJ3QgYmVjYXVzZSBpdCBjYXVzZXMKLSAgICAgYm9vdHN0cmFwIGNvbXBhcmlzb24gZmFpbHVyZXMuICAqLwotICAvKiBPdXRwdXQgYSBmaWxlIHN5bWJvbCBmb3IgdGhlIG91dHB1dCBmaWxlIGFzIHRoZSBzZWNvbmQgc3ltYm9sLgotICAgICBXZSBvdXRwdXQgdGhpcyBldmVuIGlmIHdlIGFyZSBkaXNjYXJkaW5nIGxvY2FsIHN5bWJvbHMsIGFsdGhvdWdoCi0gICAgIEknbSBub3Qgc3VyZSBpZiB0aGlzIGlzIGNvcnJlY3QuICAqLwotICBlbGZzeW0uc3RfdmFsdWUgPSAwOwotICBlbGZzeW0uc3Rfc2l6ZSA9IDA7Ci0gIGVsZnN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX0ZJTEUpOwotICBlbGZzeW0uc3Rfb3RoZXIgPSAwOwotICBlbGZzeW0uc3Rfc2huZHggPSBTSE5fQUJTOwotICBpZiAoISBlbGZfbGlua19vdXRwdXRfc3ltICgmZmluZm8sIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJICAgICAmZWxmc3ltLCBiZmRfYWJzX3NlY3Rpb25fcHRyKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSNlbmRpZgotCi0gIC8qIE91dHB1dCBhIHN5bWJvbCBmb3IgZWFjaCBzZWN0aW9uLiAgV2Ugb3V0cHV0IHRoZXNlIGV2ZW4gaWYgd2UgYXJlCi0gICAgIGRpc2NhcmRpbmcgbG9jYWwgc3ltYm9scywgc2luY2UgdGhleSBhcmUgdXNlZCBmb3IgcmVsb2NzLiAgVGhlc2UKLSAgICAgc3ltYm9scyBoYXZlIG5vIG5hbWVzLiAgV2Ugc3RvcmUgdGhlIGluZGV4IG9mIGVhY2ggb25lIGluIHRoZQotICAgICBpbmRleCBmaWVsZCBvZiB0aGUgc2VjdGlvbiwgc28gdGhhdCB3ZSBjYW4gZmluZCBpdCBhZ2FpbiB3aGVuCi0gICAgIG91dHB1dHRpbmcgcmVsb2NzLiAgKi8KLSAgaWYgKGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCB8fCBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgZWxmc3ltLnN0X3NpemUgPSAwOwotICAgICAgZWxmc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfU0VDVElPTik7Ci0gICAgICBlbGZzeW0uc3Rfb3RoZXIgPSAwOwotICAgICAgZm9yIChpID0gMTsgaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtOyBpKyspCi0JewotCSAgbyA9IHNlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIGkpOwotCSAgaWYgKG8gIT0gTlVMTCkKLQkgICAgby0+dGFyZ2V0X2luZGV4ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0JICBlbGZzeW0uc3Rfc2huZHggPSBpOwotCSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSB8fCBvID09IE5VTEwpCi0JICAgIGVsZnN5bS5zdF92YWx1ZSA9IDA7Ci0JICBlbHNlCi0JICAgIGVsZnN5bS5zdF92YWx1ZSA9IG8tPnZtYTsKLQkgIGlmICghIGVsZl9saW5rX291dHB1dF9zeW0gKCZmaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkgICAgICZlbGZzeW0sIG8pKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIHNvbWUgbWVtb3J5IHRvIGhvbGQgaW5mb3JtYXRpb24gcmVhZCBpbiBmcm9tIHRoZSBpbnB1dAotICAgICBmaWxlcy4gICovCi0gIGZpbmZvLmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9jb250ZW50c19zaXplKTsKLSAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gKFBUUikgYmZkX21hbGxvYyAobWF4X2V4dGVybmFsX3JlbG9jX3NpemUpOwotICBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPSAoKEVsZl9JbnRlcm5hbF9SZWxhICopCi0JCQkgICBiZmRfbWFsbG9jIChtYXhfaW50ZXJuYWxfcmVsb2NfY291bnQKLQkJCQkgICAgICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWxhKSkpOwotICBmaW5mby5leHRlcm5hbF9zeW1zID0gKChFbGZfRXh0ZXJuYWxfU3ltICopCi0JCQkgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudAotCQkJCSAgICAgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSk7Ci0gIGZpbmZvLmludGVybmFsX3N5bXMgPSAoKEVsZl9JbnRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpKTsKLSAgZmluZm8uaW5kaWNlcyA9IChsb25nICopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGxvbmcpKTsKLSAgZmluZm8uc2VjdGlvbnMgPSAoKGFzZWN0aW9uICoqKQotCQkgICAgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLSAgaWYgKChmaW5mby5jb250ZW50cyA9PSBOVUxMICYmIG1heF9jb250ZW50c19zaXplICE9IDApCi0gICAgICB8fCAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgbWF4X2V4dGVybmFsX3JlbG9jX3NpemUgIT0gMCkKLSAgICAgIHx8IChmaW5mby5pbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfaW50ZXJuYWxfcmVsb2NfY291bnQgIT0gMCkKLSAgICAgIHx8IChmaW5mby5leHRlcm5hbF9zeW1zID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCAhPSAwKQotICAgICAgfHwgKGZpbmZvLmludGVybmFsX3N5bXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ICE9IDApCi0gICAgICB8fCAoZmluZm8uaW5kaWNlcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgIT0gMCkKLSAgICAgIHx8IChmaW5mby5zZWN0aW9ucyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgIT0gMCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogU2luY2UgRUxGIHBlcm1pdHMgcmVsb2NhdGlvbnMgdG8gYmUgYWdhaW5zdCBsb2NhbCBzeW1ib2xzLCB3ZQotICAgICBtdXN0IGhhdmUgdGhlIGxvY2FsIHN5bWJvbHMgYXZhaWxhYmxlIHdoZW4gd2UgZG8gdGhlIHJlbG9jYXRpb25zLgotICAgICBTaW5jZSB3ZSB3b3VsZCByYXRoZXIgb25seSByZWFkIHRoZSBsb2NhbCBzeW1ib2xzIG9uY2UsIGFuZCB3ZQotICAgICB3b3VsZCByYXRoZXIgbm90IGtlZXAgdGhlbSBpbiBtZW1vcnksIHdlIGhhbmRsZSBhbGwgdGhlCi0gICAgIHJlbG9jYXRpb25zIGZvciBhIHNpbmdsZSBpbnB1dCBmaWxlIGF0IHRoZSBzYW1lIHRpbWUuCi0KLSAgICAgVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgdGhlIHRvdGFsIG51bWJlciBvZiBsb2NhbAotICAgICBzeW1ib2xzIHVudGlsIHdlIGhhdmUgc2VlbiBhbGwgb2YgdGhlbSwgYW5kIHRoZSBsb2NhbCBzeW1ib2wKLSAgICAgaW5kaWNlcyBwcmVjZWRlIHRoZSBnbG9iYWwgc3ltYm9sIGluZGljZXMuICBUaGlzIG1lYW5zIHRoYXQgd2hlbgotICAgICB3ZSBhcmUgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgd2Ugc2VlIGEgcmVsb2MgYWdhaW5zdAotICAgICBhIGdsb2JhbCBzeW1ib2wsIHdlIGNhbiBub3Qga25vdyB0aGUgc3ltYm9sIGluZGV4IHVudGlsIHdlIGhhdmUKLSAgICAgZmluaXNoZWQgZXhhbWluaW5nIGFsbCB0aGUgbG9jYWwgc3ltYm9scyB0byBzZWUgd2hpY2ggb25lcyB3ZSBhcmUKLSAgICAgZ29pbmcgdG8gb3V0cHV0LiAgVG8gZGVhbCB3aXRoIHRoaXMsIHdlIGtlZXAgdGhlIHJlbG9jYXRpb25zIGluCi0gICAgIG1lbW9yeSwgYW5kIGRvbid0IG91dHB1dCB0aGVtIHVudGlsIHRoZSBlbmQgb2YgdGhlIGxpbmsuICBUaGlzIGlzCi0gICAgIGFuIHVuZm9ydHVuYXRlIHdhc3RlIG9mIG1lbW9yeSwgYnV0IEkgZG9uJ3Qgc2VlIGEgZ29vZCB3YXkgYXJvdW5kCi0gICAgIGl0LiAgRm9ydHVuYXRlbHksIGl0IG9ubHkgaGFwcGVucyB3aGVuIHBlcmZvcm1pbmcgYSByZWxvY2F0ZWFibGUKLSAgICAgbGluaywgd2hpY2ggaXMgbm90IHRoZSBjb21tb24gY2FzZS4gIEZJWE1FOiBJZiBrZWVwX21lbW9yeSBpcyBzZXQKLSAgICAgd2UgY291bGQgd3JpdGUgdGhlIHJlbG9jcyBvdXQgYW5kIHRoZW4gcmVhZCB0aGVtIGFnYWluOyBJIGRvbid0Ci0gICAgIGtub3cgaG93IGJhZCB0aGUgbWVtb3J5IGxvc3Mgd2lsbCBiZS4gICovCi0KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gZmFsc2U7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcgotCSAgICAgICYmIChiZmRfZ2V0X2ZsYXZvdXIgKHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXIpCi0JCSAgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikpCi0JICAgIHsKLQkgICAgICBzdWIgPSBwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotCSAgICAgIGlmICghIHN1Yi0+b3V0cHV0X2hhc19iZWd1bikKLQkJewotCQkgIGlmICghIGVsZl9saW5rX2lucHV0X2JmZCAoJmZpbmZvLCBzdWIpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICBpZiAoISBlbGZfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBUaGF0IHdyb3RlIG91dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMuICBGaW5pc2ggdXAgdGhlIHN5bWJvbCB0YWJsZQotICAgICB3aXRoIHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0KLSAgaWYgKGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCAmJiBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgLyogT3V0cHV0IGFueSBnbG9iYWwgc3ltYm9scyB0aGF0IGdvdCBjb252ZXJ0ZWQgdG8gbG9jYWwgaW4gYQotICAgICAgICAgdmVyc2lvbiBzY3JpcHQuICBXZSBkbyB0aGlzIGluIGEgc2VwYXJhdGUgc3RlcCBzaW5jZSBFTEYKLSAgICAgICAgIHJlcXVpcmVzIGFsbCBsb2NhbCBzeW1ib2xzIHRvIGFwcGVhciBwcmlvciB0byBhbnkgZ2xvYmFsCi0gICAgICAgICBzeW1ib2xzLiAgRklYTUU6IFdlIHNob3VsZCBvbmx5IGRvIHRoaXMgaWYgc29tZSBnbG9iYWwKLSAgICAgICAgIHN5bWJvbHMgd2VyZSwgaW4gZmFjdCwgY29udmVydGVkIHRvIGJlY29tZSBsb2NhbC4gIEZJWE1FOgotICAgICAgICAgV2lsbCB0aGlzIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIElyaXggNSBsaW5rZXI/ICAqLwotICAgICAgZW9pbmZvLmZhaWxlZCA9IGZhbHNlOwotICAgICAgZW9pbmZvLmZpbmZvID0gJmZpbmZvOwotICAgICAgZW9pbmZvLmxvY2Fsc3ltcyA9IHRydWU7Ci0gICAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIGVsZl9saW5rX291dHB1dF9leHRzeW0sCi0JCQkgICAgICAoUFRSKSAmZW9pbmZvKTsKLSAgICAgIGlmIChlb2luZm8uZmFpbGVkKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIHNoX2luZm8gZmllbGQgcmVjb3JkcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG5vbiBsb2NhbAotICAgICBzeW1ib2wuICAqLwotICBzeW10YWJfaGRyLT5zaF9pbmZvID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIGlmIChkeW5hbWljKQotICAgIGVsZl9zZWN0aW9uX2RhdGEgKGZpbmZvLmR5bnN5bV9zZWMtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfaW5mbyA9IDE7Ci0KLSAgLyogV2UgZ2V0IHRoZSBnbG9iYWwgc3ltYm9scyBmcm9tIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgZW9pbmZvLmZhaWxlZCA9IGZhbHNlOwotICBlb2luZm8ubG9jYWxzeW1zID0gZmFsc2U7Ci0gIGVvaW5mby5maW5mbyA9ICZmaW5mbzsKLSAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBlbGZfbGlua19vdXRwdXRfZXh0c3ltLAotCQkJICAoUFRSKSAmZW9pbmZvKTsKLSAgaWYgKGVvaW5mby5mYWlsZWQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEZsdXNoIGFsbCBzeW1ib2xzIHRvIHRoZSBmaWxlLiAgKi8KLSAgaWYgKCEgZWxmX2xpbmtfZmx1c2hfb3V0cHV0X3N5bXMgKCZmaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB3ZSBrbm93IHRoZSBzaXplIG9mIHRoZSBzeW10YWIgc2VjdGlvbi4gICovCi0gIG9mZiArPSBzeW10YWJfaGRyLT5zaF9zaXplOwotCi0gIC8qIEZpbmlzaCB1cCBhbmQgd3JpdGUgb3V0IHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlICguc3RydGFiKQotICAgICBzZWN0aW9uLiAgKi8KLSAgc3ltc3RydGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zdHJ0YWJfaGRyOwotICAvKiBzaF9uYW1lIHdhcyBzZXQgaW4gcHJlcF9oZWFkZXJzLiAgKi8KLSAgc3ltc3RydGFiX2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7Ci0gIHN5bXN0cnRhYl9oZHItPnNoX2ZsYWdzID0gMDsKLSAgc3ltc3RydGFiX2hkci0+c2hfYWRkciA9IDA7Ci0gIHN5bXN0cnRhYl9oZHItPnNoX3NpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChmaW5mby5zeW1zdHJ0YWIpOwotICBzeW1zdHJ0YWJfaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgc3ltc3RydGFiX2hkci0+c2hfbGluayA9IDA7Ci0gIHN5bXN0cnRhYl9oZHItPnNoX2luZm8gPSAwOwotICAvKiBzaF9vZmZzZXQgaXMgc2V0IGp1c3QgYmVsb3cuICAqLwotICBzeW1zdHJ0YWJfaGRyLT5zaF9hZGRyYWxpZ24gPSAxOwotCi0gIG9mZiA9IF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uIChzeW1zdHJ0YWJfaGRyLCBvZmYsIHRydWUpOwotICBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zID0gb2ZmOwotCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW1zdHJ0YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAhIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIGZpbmZvLnN5bXN0cnRhYikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBBZGp1c3QgdGhlIHJlbG9jcyB0byBoYXZlIHRoZSBjb3JyZWN0IHN5bWJvbCBpbmRpY2VzLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICByZWxfaGFzaCA9IGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzOwotICAgICAgcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBvLT5yZWxvY19jb3VudDsgaSsrLCByZWxfaGFzaCsrKQotCXsKLQkgIGlmICgqcmVsX2hhc2ggPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIEJGRF9BU1NFUlQgKCgqcmVsX2hhc2gpLT5pbmR4ID49IDApOwotCi0JICBpZiAocmVsX2hkci0+c2hfZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWwpKQotCSAgICB7Ci0JICAgICAgRWxmX0V4dGVybmFsX1JlbCAqZXJlbDsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsIGlyZWw7Ci0KLQkgICAgICBlcmVsID0gKEVsZl9FeHRlcm5hbF9SZWwgKikgcmVsX2hkci0+Y29udGVudHMgKyBpOwotCSAgICAgIGVsZl9zd2FwX3JlbG9jX2luIChhYmZkLCBlcmVsLCAmaXJlbCk7Ci0JICAgICAgaXJlbC5yX2luZm8gPSBFTEZfUl9JTkZPICgoKnJlbF9oYXNoKS0+aW5keCwKLQkJCQkJRUxGX1JfVFlQRSAoaXJlbC5yX2luZm8pKTsKLQkgICAgICBlbGZfc3dhcF9yZWxvY19vdXQgKGFiZmQsICZpcmVsLCBlcmVsKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgRWxmX0V4dGVybmFsX1JlbGEgKmVyZWxhOwotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIGlyZWxhOwotCi0JICAgICAgQkZEX0FTU0VSVCAocmVsX2hkci0+c2hfZW50c2l6ZQotCQkJICA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSk7Ci0KLQkgICAgICBlcmVsYSA9IChFbGZfRXh0ZXJuYWxfUmVsYSAqKSByZWxfaGRyLT5jb250ZW50cyArIGk7Ci0JICAgICAgZWxmX3N3YXBfcmVsb2NhX2luIChhYmZkLCBlcmVsYSwgJmlyZWxhKTsKLQkgICAgICBpcmVsYS5yX2luZm8gPSBFTEZfUl9JTkZPICgoKnJlbF9oYXNoKS0+aW5keCwKLQkJCQkJIEVMRl9SX1RZUEUgKGlyZWxhLnJfaW5mbykpOwotCSAgICAgIGVsZl9zd2FwX3JlbG9jYV9vdXQgKGFiZmQsICZpcmVsYSwgZXJlbGEpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBTZXQgdGhlIHJlbG9jX2NvdW50IGZpZWxkIHRvIDAgdG8gcHJldmVudCB3cml0ZV9yZWxvY3MgZnJvbQotCSB0cnlpbmcgdG8gc3dhcCB0aGUgcmVsb2NzIG91dCBpdHNlbGYuICAqLwotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgbGlua2luZyBhZ2FpbnN0IGEgZHluYW1pYyBvYmplY3QsIG9yIGdlbmVyYXRpbmcgYQotICAgICBzaGFyZWQgbGlicmFyeSwgZmluaXNoIHVwIHRoZSBkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24uICAqLwotICBpZiAoZHluYW1pYykKLSAgICB7Ci0gICAgICBFbGZfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIC8qIEZpeCB1cCAuZHluYW1pYyBlbnRyaWVzLiAgKi8KLSAgICAgIG8gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLSAgICAgIEJGRF9BU1NFUlQgKG8gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGZfRXh0ZXJuYWxfRHluICopIG8tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZl9FeHRlcm5hbF9EeW4gKikgKG8tPmNvbnRlbnRzICsgby0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIHVuc2lnbmVkIGludCB0eXBlOwotCi0JICBlbGZfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICAgIC8qIFNWUjQgbGlua2VycyBzZWVtIHRvIHNldCBEVF9JTklUIGFuZCBEVF9GSU5JIGJhc2VkIG9uCi0gICAgICAgICAgICAgICAgIG1hZ2ljIF9pbml0IGFuZCBfZmluaSBzeW1ib2xzLiAgVGhpcyBpcyBwcmV0dHkgdWdseSwKLSAgICAgICAgICAgICAgICAgYnV0IHdlIGFyZSBjb21wYXRpYmxlLiAgKi8KLQkgICAgY2FzZSBEVF9JTklUOgotCSAgICAgIG5hbWUgPSAiX2luaXQiOwotCSAgICAgIGdvdG8gZ2V0X3N5bTsKLQkgICAgY2FzZSBEVF9GSU5JOgotCSAgICAgIG5hbWUgPSAiX2ZpbmkiOwotCSAgICBnZXRfc3ltOgotCSAgICAgIHsKLQkJc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkJaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsCi0JCQkJCSAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJaWYgKGggIT0gTlVMTAotCQkgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCXx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCQkgIHsKLQkJICAgIGR5bi5kX3VuLmRfdmFsID0gaC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJICAgIG8gPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgICBpZiAoby0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQkJICAgICAgZHluLmRfdW4uZF92YWwgKz0gKG8tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJICsgby0+b3V0cHV0X29mZnNldCk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCS8qIFRoZSBzeW1ib2wgaXMgaW1wb3J0ZWQgZnJvbSBhbm90aGVyIHNoYXJlZAotCQkJICAgbGlicmFyeSBhbmQgZG9lcyBub3QgYXBwbHkgdG8gdGhpcyBvbmUuICAqLwotCQkJZHluLmRfdW4uZF92YWwgPSAwOwotCQkgICAgICB9Ci0KLQkJICAgIGVsZl9zd2FwX2R5bl9vdXQgKGR5bm9iaiwgJmR5biwgZHluY29uKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfSEFTSDoKLQkgICAgICBuYW1lID0gIi5oYXNoIjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfU1RSVEFCOgotCSAgICAgIG5hbWUgPSAiLmR5bnN0ciI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX1NZTVRBQjoKLQkgICAgICBuYW1lID0gIi5keW5zeW0iOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9WRVJERUY6Ci0JICAgICAgbmFtZSA9ICIuZ251LnZlcnNpb25fZCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX1ZFUk5FRUQ6Ci0JICAgICAgbmFtZSA9ICIuZ251LnZlcnNpb25fciI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX1ZFUlNZTToKLQkgICAgICBuYW1lID0gIi5nbnUudmVyc2lvbiI7Ci0JICAgIGdldF92bWE6Ci0JICAgICAgbyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLQkgICAgICBCRkRfQVNTRVJUIChvICE9IE5VTEwpOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gby0+dm1hOwotCSAgICAgIGVsZl9zd2FwX2R5bl9vdXQgKGR5bm9iaiwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1JFTDoKLQkgICAgY2FzZSBEVF9SRUxBOgotCSAgICBjYXNlIERUX1JFTFNaOgotCSAgICBjYXNlIERUX1JFTEFTWjoKLQkgICAgICBpZiAoZHluLmRfdGFnID09IERUX1JFTCB8fCBkeW4uZF90YWcgPT0gRFRfUkVMU1opCi0JCXR5cGUgPSBTSFRfUkVMOwotCSAgICAgIGVsc2UKLQkJdHlwZSA9IFNIVF9SRUxBOwotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gMDsKLQkgICAgICBmb3IgKGkgPSAxOyBpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW07IGkrKykKLQkJewotCQkgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0KLQkJICBoZHIgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2ldOwotCQkgIGlmIChoZHItPnNoX3R5cGUgPT0gdHlwZQotCQkgICAgICAmJiAoaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGR5bi5kX3RhZyA9PSBEVF9SRUxTWiB8fCBkeW4uZF90YWcgPT0gRFRfUkVMQVNaKQotCQkJZHluLmRfdW4uZF92YWwgKz0gaGRyLT5zaF9zaXplOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGlmIChkeW4uZF91bi5kX3ZhbCA9PSAwCi0JCQkgICAgICB8fCBoZHItPnNoX2FkZHIgPCBkeW4uZF91bi5kX3ZhbCkKLQkJCSAgICBkeW4uZF91bi5kX3ZhbCA9IGhkci0+c2hfYWRkcjsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgIGVsZl9zd2FwX2R5bl9vdXQgKGR5bm9iaiwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZSBjcmVhdGVkIGFueSBkeW5hbWljIHNlY3Rpb25zLCB0aGVuIG91dHB1dCB0aGVtLiAgKi8KLSAgaWYgKGR5bm9iaiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghICgqYmVkLT5lbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucykgKGFiZmQsIGluZm8pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBmb3IgKG8gPSBkeW5vYmotPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0JICAgICAgfHwgby0+X3Jhd19zaXplID09IDApCi0JICAgIGNvbnRpbnVlOwotCSAgaWYgKChvLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gc2VjdGlvbnMKLSAgICAgICAgICAgICAgICAgY3JlYXRlZCBieSBlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGlmICgoZWxmX3NlY3Rpb25fZGF0YSAoby0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF90eXBlCi0JICAgICAgICE9IFNIVF9TVFJUQUIpCi0JICAgICAgfHwgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgbyksICIuZHluc3RyIikgIT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgby0+b3V0cHV0X3NlY3Rpb24sCi0JCQkJCSAgICAgIG8tPmNvbnRlbnRzLCBvLT5vdXRwdXRfb2Zmc2V0LAotCQkJCQkgICAgICBvLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZmlsZV9wdHIgb2ZmOwotCi0JICAgICAgLyogVGhlIGNvbnRlbnRzIG9mIHRoZSAuZHluc3RyIHNlY3Rpb24gYXJlIGFjdHVhbGx5IGluIGEKLSAgICAgICAgICAgICAgICAgc3RyaW5ndGFiLiAgKi8KLQkgICAgICBvZmYgPSBlbGZfc2VjdGlvbl9kYXRhIChvLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX29mZnNldDsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZiwgU0VFS19TRVQpICE9IDAKLQkJICB8fCAhIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsCi0JCQkJCSAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cikpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBoYXZlIG9wdGltaXplZCBzdGFicyBzdHJpbmdzLCBvdXRwdXQgdGhlbS4gICovCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzIChhYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBpZiAoZmluZm8uc3ltc3RydGFiICE9IE5VTEwpCi0gICAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3ltc3RydGFiKTsKLSAgaWYgKGZpbmZvLmNvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uY29udGVudHMpOwotICBpZiAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGZpbmZvLmludGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3JlbG9jcyk7Ci0gIGlmIChmaW5mby5leHRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfc3ltcyk7Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChmaW5mby5pbmRpY2VzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW5kaWNlcyk7Ci0gIGlmIChmaW5mby5zZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25zKTsKLSAgaWYgKGZpbmZvLnN5bWJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLnN5bWJ1Zik7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLQkgICYmIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzICE9IE5VTEwpCi0JZnJlZSAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oYXNoZXMpOwotICAgIH0KLQotICBlbGZfdGRhdGEgKGFiZmQpLT5saW5rZXIgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZmluZm8uc3ltc3RydGFiICE9IE5VTEwpCi0gICAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3ltc3RydGFiKTsKLSAgaWYgKGZpbmZvLmNvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uY29udGVudHMpOwotICBpZiAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGZpbmZvLmludGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3JlbG9jcyk7Ci0gIGlmIChmaW5mby5leHRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfc3ltcyk7Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChmaW5mby5pbmRpY2VzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW5kaWNlcyk7Ci0gIGlmIChmaW5mby5zZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25zKTsKLSAgaWYgKGZpbmZvLnN5bWJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLnN5bWJ1Zik7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLQkgICYmIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzICE9IE5VTEwpCi0JZnJlZSAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oYXNoZXMpOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEFkZCBhIHN5bWJvbCB0byB0aGUgb3V0cHV0IHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19vdXRwdXRfc3ltIChmaW5mbywgbmFtZSwgZWxmc3ltLCBpbnB1dF9zZWMpCi0gICAgIHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqZWxmc3ltOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjOwotewotICBib29sZWFuICgqb3V0cHV0X3N5bWJvbF9ob29rKSBQQVJBTVMgKChiZmQgKiwKLQkJCQkJIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCQkJCQkgY29uc3QgY2hhciAqLAotCQkJCQkgRWxmX0ludGVybmFsX1N5bSAqLAotCQkJCQkgYXNlY3Rpb24gKikpOwotCi0gIG91dHB1dF9zeW1ib2xfaG9vayA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChmaW5mby0+b3V0cHV0X2JmZCktPgotICAgIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rOwotICBpZiAob3V0cHV0X3N5bWJvbF9ob29rICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgKCgqb3V0cHV0X3N5bWJvbF9ob29rKQotCSAgICAgKGZpbmZvLT5vdXRwdXRfYmZkLCBmaW5mby0+aW5mbywgbmFtZSwgZWxmc3ltLCBpbnB1dF9zZWMpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChuYW1lID09IChjb25zdCBjaGFyICopIE5VTEwgfHwgKm5hbWUgPT0gJ1wwJykKLSAgICBlbGZzeW0tPnN0X25hbWUgPSAwOwotICBlbHNlIGlmIChpbnB1dF9zZWMtPmZsYWdzICYgU0VDX0VYQ0xVREUpCi0gICAgZWxmc3ltLT5zdF9uYW1lID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGVsZnN5bS0+c3RfbmFtZSA9ICh1bnNpZ25lZCBsb25nKSBfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLT5zeW1zdHJ0YWIsCi0JCQkJCQkJICAgIG5hbWUsIHRydWUsCi0JCQkJCQkJICAgIGZhbHNlKTsKLSAgICAgIGlmIChlbGZzeW0tPnN0X25hbWUgPT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGZpbmZvLT5zeW1idWZfY291bnQgPj0gZmluZm8tPnN5bWJ1Zl9zaXplKQotICAgIHsKLSAgICAgIGlmICghIGVsZl9saW5rX2ZsdXNoX291dHB1dF9zeW1zIChmaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlbGZfc3dhcF9zeW1ib2xfb3V0IChmaW5mby0+b3V0cHV0X2JmZCwgZWxmc3ltLAotCQkgICAgICAgKFBUUikgKGZpbmZvLT5zeW1idWYgKyBmaW5mby0+c3ltYnVmX2NvdW50KSk7Ci0gICsrZmluZm8tPnN5bWJ1Zl9jb3VudDsKLQotICArKyBiZmRfZ2V0X3N5bWNvdW50IChmaW5mby0+b3V0cHV0X2JmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZsdXNoIHRoZSBvdXRwdXQgc3ltYm9scyB0byB0aGUgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19mbHVzaF9vdXRwdXRfc3ltcyAoZmluZm8pCi0gICAgIHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLXsKLSAgaWYgKGZpbmZvLT5zeW1idWZfY291bnQgPiAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWI7Ci0KLSAgICAgIHN5bXRhYiA9ICZlbGZfdGRhdGEgKGZpbmZvLT5vdXRwdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICAgICAgaWYgKGJmZF9zZWVrIChmaW5mby0+b3V0cHV0X2JmZCwgc3ltdGFiLT5zaF9vZmZzZXQgKyBzeW10YWItPnNoX3NpemUsCi0JCSAgICBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF93cml0ZSAoKFBUUikgZmluZm8tPnN5bWJ1ZiwgZmluZm8tPnN5bWJ1Zl9jb3VudCwKLQkJCSBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLCBmaW5mby0+b3V0cHV0X2JmZCkKLQkgICAgICAhPSBmaW5mby0+c3ltYnVmX2NvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzeW10YWItPnNoX3NpemUgKz0gZmluZm8tPnN5bWJ1Zl9jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0KLSAgICAgIGZpbmZvLT5zeW1idWZfY291bnQgPSAwOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGFuIGV4dGVybmFsIHN5bWJvbCB0byB0aGUgc3ltYm9sIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgZnJvbQotICAgdGhlIGhhc2ggdGFibGUgdHJhdmVyc2FsIHJvdXRpbmUuICBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LAotICAgd2UgZ28gdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIHR3aWNlLiAgVGhlIGZpcnN0IHRpbWUgd2Ugb3V0cHV0Ci0gICBhbnl0aGluZyB0aGF0IG1pZ2h0IGhhdmUgYmVlbiBmb3JjZWQgdG8gbG9jYWwgc2NvcGUgaW4gYSB2ZXJzaW9uCi0gICBzY3JpcHQuICBUaGUgc2Vjb25kIHRpbWUgd2Ugb3V0cHV0IHRoZSBzeW1ib2xzIHRoYXQgYXJlIHN0aWxsCi0gICBnbG9iYWwgc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19vdXRwdXRfZXh0c3ltIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGZfb3V0ZXh0X2luZm8gKmVvaW5mbyA9IChzdHJ1Y3QgZWxmX291dGV4dF9pbmZvICopIGRhdGE7Ci0gIHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvICpmaW5mbyA9IGVvaW5mby0+ZmluZm87Ci0gIGJvb2xlYW4gc3RyaXA7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjOwotCi0gIC8qIERlY2lkZSB3aGV0aGVyIHRvIG91dHB1dCB0aGlzIHN5bWJvbCBpbiB0aGlzIHBhc3MuICAqLwotICBpZiAoZW9pbmZvLT5sb2NhbHN5bXMpCi0gICAgewotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfRk9SQ0VEX0xPQ0FMKSA9PSAwKQotCXJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCkgIT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIG5vdCBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgdGhpcyBzeW1ib2wgaXMKLSAgICAgcmVmZXJlbmNlZCBieSBhIHNoYXJlZCBsaWJyYXJ5IGJ1dCBpcyBub3QgZGVmaW5lZCBhbnl3aGVyZSwgdGhlbgotICAgICB3YXJuIHRoYXQgaXQgaXMgdW5kZWZpbmVkLiAgSWYgd2UgZG8gbm90IGRvIHRoaXMsIHRoZSBydW50aW1lCi0gICAgIGxpbmtlciB3aWxsIGNvbXBsYWluIHRoYXQgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQgd2hlbiB0aGUKLSAgICAgcHJvZ3JhbSBpcyBydW4uICBXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHN5bWJvbHMgdGhhdCBhcmUKLSAgICAgcmVmZXJlbmNlZCBieSByZWd1bGFyIGZpbGVzLCBiZWNhdXNlIHdlIHdpbGwgYWxyZWFkeSBoYXZlIGlzc3VlZAotICAgICB3YXJuaW5ncyBmb3IgdGhlbS4gICovCi0gIGlmICghIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmICEgKGZpbmZvLT5pbmZvLT5zaGFyZWQKLQkgICAgJiYgIWZpbmZvLT5pbmZvLT5zeW1ib2xpYwotCSAgICAmJiAhZmluZm8tPmluZm8tPm5vX3VuZGVmaW5lZCkKLSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpID09IDApCi0gICAgewotICAgICAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkgICAgIChmaW5mby0+aW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaC0+cm9vdC51LnVuZGVmLmFiZmQsCi0JICAgICAgKGFzZWN0aW9uICopIE5VTEwsIDApKSkKLQl7Ci0JICBlb2luZm8tPmZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBXZSBkb24ndCB3YW50IHRvIG91dHB1dCBzeW1ib2xzIHRoYXQgaGF2ZSBuZXZlciBiZWVuIG1lbnRpb25lZCBieQotICAgICBhIHJlZ3VsYXIgZmlsZSwgb3IgdGhhdCB3ZSBoYXZlIGJlZW4gdG9sZCB0byBzdHJpcC4gIEhvd2V2ZXIsIGlmCi0gICAgIGgtPmluZHggaXMgc2V0IHRvIC0yLCB0aGUgc3ltYm9sIGlzIHVzZWQgYnkgYSByZWxvYyBhbmQgd2UgbXVzdAotICAgICBvdXRwdXQgaXQuICAqLwotICBpZiAoaC0+aW5keCA9PSAtMikKLSAgICBzdHJpcCA9IGZhbHNlOwotICBlbHNlIGlmICgoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgIT0gMCkKLQkgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLQkgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpID09IDApCi0gICAgc3RyaXAgPSB0cnVlOwotICBlbHNlIGlmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0JICAgfHwgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgICYmIGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwKLQkJCQkgICBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCSAgIGZhbHNlLCBmYWxzZSkgPT0gTlVMTCkpCi0gICAgc3RyaXAgPSB0cnVlOwotICBlbHNlCi0gICAgc3RyaXAgPSBmYWxzZTsKLQotICAvKiBJZiB3ZSdyZSBzdHJpcHBpbmcgaXQsIGFuZCBpdCdzIG5vdCBhIGR5bmFtaWMgc3ltYm9sLCB0aGVyZSdzCi0gICAgIG5vdGhpbmcgZWxzZSB0byBkby4gICovCi0gIGlmIChzdHJpcCAmJiBoLT5keW5pbmR4ID09IC0xKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN5bS5zdF92YWx1ZSA9IDA7Ci0gIHN5bS5zdF9zaXplID0gaC0+c2l6ZTsKLSAgc3ltLnN0X290aGVyID0gaC0+b3RoZXI7Ci0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCkgIT0gMCkKLSAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIGgtPnR5cGUpOwotICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsKLQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9XRUFLLCBoLT50eXBlKTsKLSAgZWxzZQotICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIGgtPnR5cGUpOwotCi0gIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9uZXc6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0gICAgICBpbnB1dF9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgc3ltLnN0X3NobmR4ID0gU0hOX1VOREVGOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgaW5wdXRfc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIHN5bS5zdF9zaG5keCA9IFNITl9VTkRFRjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICB7Ci0JaW5wdXRfc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCWlmIChpbnB1dF9zZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0JICB7Ci0JICAgIHN5bS5zdF9zaG5keCA9Ci0JICAgICAgX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChmaW5mby0+b3V0cHV0X2JmZCwKLQkJCQkJCSBpbnB1dF9zZWMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgaWYgKHN5bS5zdF9zaG5keCA9PSAodW5zaWduZWQgc2hvcnQpIC0xKQotCSAgICAgIHsKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgKF8oIiVzOiBjb3VsZCBub3QgZmluZCBvdXRwdXQgc2VjdGlvbiAlcyBmb3IgaW5wdXQgc2VjdGlvbiAlcyIpLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChmaW5mby0+b3V0cHV0X2JmZCksCi0JCSAgIGlucHV0X3NlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsCi0JCSAgIGlucHV0X3NlYy0+bmFtZSk7Ci0JCWVvaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICAvKiBFTEYgc3ltYm9scyBpbiByZWxvY2F0ZWFibGUgZmlsZXMgYXJlIHNlY3Rpb24gcmVsYXRpdmUsCi0JICAgICAgIGJ1dCBpbiBub25yZWxvY2F0ZWFibGUgZmlsZXMgdGhleSBhcmUgdmlydHVhbAotCSAgICAgICBhZGRyZXNzZXMuICAqLwotCSAgICBzeW0uc3RfdmFsdWUgPSBoLT5yb290LnUuZGVmLnZhbHVlICsgaW5wdXRfc2VjLT5vdXRwdXRfb2Zmc2V0OwotCSAgICBpZiAoISBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICAgIHN5bS5zdF92YWx1ZSArPSBpbnB1dF9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBCRkRfQVNTRVJUIChpbnB1dF9zZWMtPm93bmVyID09IE5VTEwKLQkJCXx8IChpbnB1dF9zZWMtPm93bmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDApOwotCSAgICBzeW0uc3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0JICAgIGlucHV0X3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICBpbnB1dF9zZWMgPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotICAgICAgc3ltLnN0X3NobmR4ID0gU0hOX0NPTU1PTjsKLSAgICAgIHN5bS5zdF92YWx1ZSA9IDEgPDwgaC0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q6Ci0gICAgICAvKiBUaGVzZSBzeW1ib2xzIGFyZSBjcmVhdGVkIGJ5IHN5bWJvbCB2ZXJzaW9uaW5nLiAgVGhleSBwb2ludAotICAgICAgICAgdG8gdGhlIGRlY29yYXRlZCB2ZXJzaW9uIG9mIHRoZSBuYW1lLiAgRm9yIGV4YW1wbGUsIGlmIHRoZQotICAgICAgICAgc3ltYm9sIGZvb0BAR05VXzEuMiBpcyB0aGUgZGVmYXVsdCwgd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2hlbgotICAgICAgICAgZm9vIGlzIHVzZWQgd2l0aCBubyB2ZXJzaW9uLCB0aGVuIHdlIGFkZCBhbiBpbmRpcmVjdCBzeW1ib2wKLSAgICAgICAgIGZvbyB3aGljaCBwb2ludHMgdG8gZm9vQEBHTlVfMS4yLiAgV2UgaWdub3JlIHRoZXNlIHN5bWJvbHMsCi0gICAgICAgICBzaW5jZSB0aGUgaW5kaXJlY3RlZCBzeW1ib2wgaXMgYWxyZWFkeSBpbiB0aGUgaGFzaCB0YWJsZS4gIElmCi0gICAgICAgICB0aGUgaW5kaXJlY3Qgc3ltYm9sIGlzIG5vbi1FTEYsIGZhbGwgdGhyb3VnaCBhbmQgb3V0cHV0IGl0LiAgKi8KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX05PTl9FTEYpID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX3dhcm5pbmc6Ci0gICAgICAvKiBXZSBjYW4ndCByZXByZXNlbnQgdGhlc2Ugc3ltYm9scyBpbiBFTEYsIGFsdGhvdWdoIGEgd2FybmluZwotICAgICAgICAgc3ltYm9sIG1heSBoYXZlIGNvbWUgZnJvbSBhIC5nbnUud2FybmluZy5TWU1CT0wgc2VjdGlvbi4gIFdlCi0gICAgICAgICBqdXN0IHB1dCB0aGUgdGFyZ2V0IHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZS4gIElmIHRoZSB0YXJnZXQKLSAgICAgICAgIHN5bWJvbCBkb2VzIG5vdCByZWFsbHkgZXhpc3QsIGRvbid0IGRvIGFueXRoaW5nLiAgKi8KLSAgICAgIGlmIChoLT5yb290LnUuaS5saW5rLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotCXJldHVybiB0cnVlOwotICAgICAgcmV0dXJuIChlbGZfbGlua19vdXRwdXRfZXh0c3ltCi0JICAgICAgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rLCBkYXRhKSk7Ci0gICAgfQotCi0gIC8qIEdpdmUgdGhlIHByb2Nlc3NvciBiYWNrZW5kIGEgY2hhbmNlIHRvIHR3ZWFrIHRoZSBzeW1ib2wgdmFsdWUsCi0gICAgIGFuZCBhbHNvIHRvIGZpbmlzaCB1cCBhbnl0aGluZyB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIHRoaXMKLSAgICAgc3ltYm9sLiAgKi8KLSAgaWYgKChoLT5keW5pbmR4ICE9IC0xCi0gICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19GT1JDRURfTE9DQUwpICE9IDApCi0gICAgICAmJiBlbGZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICAgICAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGZpbmZvLT5vdXRwdXRfYmZkKTsKLSAgICAgIGlmICghICgoKmJlZC0+ZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sKQotCSAgICAgKGZpbmZvLT5vdXRwdXRfYmZkLCBmaW5mby0+aW5mbywgaCwgJnN5bSkpKQotCXsKLQkgIGVvaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBtYXJraW5nIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCBhbmQgdGhlcmUgYXJlIG5vCi0gICAgIG5vbi13ZWFrIHJlZmVyZW5jZXMgdG8gdGhpcyBzeW1ib2wgZnJvbSBhIHJlZ3VsYXIgb2JqZWN0LCB0aGVuCi0gICAgIG1hcmsgdGhlIHN5bWJvbCBhcyB3ZWFrIHVuZGVmaW5lZC4gIFdlIGNhbid0IGRvIHRoaXMgZWFybGllciwKLSAgICAgYmVjYXVzZSBpdCBtaWdodCBub3QgYmUgbWFya2VkIGFzIHVuZGVmaW5lZCB1bnRpbCB0aGUKLSAgICAgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUgZ2V0cyB0aHJvdWdoIHdpdGggaXQuICAqLwotICBpZiAoc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRgotICAgICAgJiYgc3ltLnN0X2luZm8gPT0gRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIGgtPnR5cGUpCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLKSA9PSAwKQotICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9XRUFLLCBoLT50eXBlKTsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBzaG91bGQgYmUgcHV0IGluIHRoZSAuZHluc3ltIHNlY3Rpb24sIHRoZW4gcHV0IGl0Ci0gICAgIHRoZXJlIG5vdy4gIFdlIGhhdmUgYWxyZWFkeSBrbm93IHRoZSBzeW1ib2wgaW5kZXguICBXZSBhbHNvIGZpbGwKLSAgICAgaW4gdGhlIGVudHJ5IGluIHRoZSAuaGFzaCBzZWN0aW9uLiAgKi8KLSAgaWYgKGgtPmR5bmluZHggIT0gLTEKLSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBzaXplX3QgYnVja2V0Y291bnQ7Ci0gICAgICBzaXplX3QgYnVja2V0OwotICAgICAgYmZkX2J5dGUgKmJ1Y2tldHBvczsKLSAgICAgIGJmZF92bWEgY2hhaW47Ci0KLSAgICAgIHN5bS5zdF9uYW1lID0gaC0+ZHluc3RyX2luZGV4OwotCi0gICAgICBlbGZfc3dhcF9zeW1ib2xfb3V0IChmaW5mby0+b3V0cHV0X2JmZCwgJnN5bSwKLQkJCSAgIChQVFIpICgoKEVsZl9FeHRlcm5hbF9TeW0gKikKLQkJCQkgICBmaW5mby0+ZHluc3ltX3NlYy0+Y29udGVudHMpCi0JCQkJICArIGgtPmR5bmluZHgpKTsKLQotICAgICAgYnVja2V0Y291bnQgPSBlbGZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5idWNrZXRjb3VudDsKLSAgICAgIGJ1Y2tldCA9IGgtPmVsZl9oYXNoX3ZhbHVlICUgYnVja2V0Y291bnQ7Ci0gICAgICBidWNrZXRwb3MgPSAoKGJmZF9ieXRlICopIGZpbmZvLT5oYXNoX3NlYy0+Y29udGVudHMKLQkJICAgKyAoYnVja2V0ICsgMikgKiAoQVJDSF9TSVpFIC8gOCkpOwotICAgICAgY2hhaW4gPSBnZXRfd29yZCAoZmluZm8tPm91dHB1dF9iZmQsIGJ1Y2tldHBvcyk7Ci0gICAgICBwdXRfd29yZCAoZmluZm8tPm91dHB1dF9iZmQsIGgtPmR5bmluZHgsIGJ1Y2tldHBvcyk7Ci0gICAgICBwdXRfd29yZCAoZmluZm8tPm91dHB1dF9iZmQsIGNoYWluLAotCQkoKGJmZF9ieXRlICopIGZpbmZvLT5oYXNoX3NlYy0+Y29udGVudHMKLQkJICsgKGJ1Y2tldGNvdW50ICsgMiArIGgtPmR5bmluZHgpICogKEFSQ0hfU0laRSAvIDgpKSk7Ci0KLSAgICAgIGlmIChmaW5mby0+c3ltdmVyX3NlYyAhPSBOVUxMICYmIGZpbmZvLT5zeW12ZXJfc2VjLT5jb250ZW50cyAhPSBOVUxMKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9WZXJzeW0gaXZlcnN5bTsKLQotCSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChoLT52ZXJpbmZvLnZlcmRlZiA9PSBOVUxMKQotCQlpdmVyc3ltLnZzX3ZlcnMgPSAwOwotCSAgICAgIGVsc2UKLQkJaXZlcnN5bS52c192ZXJzID0gaC0+dmVyaW5mby52ZXJkZWYtPnZkX2V4cF9yZWZubyArIDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChoLT52ZXJpbmZvLnZlcnRyZWUgPT0gTlVMTCkKLQkJaXZlcnN5bS52c192ZXJzID0gMTsKLQkgICAgICBlbHNlCi0JCWl2ZXJzeW0udnNfdmVycyA9IGgtPnZlcmluZm8udmVydHJlZS0+dmVybnVtICsgMTsKLQkgICAgfQotCi0JICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19ISURERU4pICE9IDApCi0JICAgIGl2ZXJzeW0udnNfdmVycyB8PSBWRVJTWU1fSElEREVOOwotCi0JICBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9vdXQgKGZpbmZvLT5vdXRwdXRfYmZkLCAmaXZlcnN5bSwKLQkJCQkgICAgKCgoRWxmX0V4dGVybmFsX1ZlcnN5bSAqKQotCQkJCSAgICAgIGZpbmZvLT5zeW12ZXJfc2VjLT5jb250ZW50cykKLQkJCQkgICAgICsgaC0+ZHluaW5keCkpOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UncmUgc3RyaXBwaW5nIGl0LCB0aGVuIGl0IHdhcyBqdXN0IGEgZHluYW1pYyBzeW1ib2wsIGFuZAotICAgICB0aGVyZSdzIG5vdGhpbmcgZWxzZSB0byBkby4gICovCi0gIGlmIChzdHJpcCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBoLT5pbmR4ID0gYmZkX2dldF9zeW1jb3VudCAoZmluZm8tPm91dHB1dF9iZmQpOwotCi0gIGlmICghIGVsZl9saW5rX291dHB1dF9zeW0gKGZpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCAmc3ltLCBpbnB1dF9zZWMpKQotICAgIHsKLSAgICAgIGVvaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExpbmsgYW4gaW5wdXQgZmlsZSBpbnRvIHRoZSBsaW5rZXIgb3V0cHV0IGZpbGUuICBUaGlzIGZ1bmN0aW9uCi0gICBoYW5kbGVzIGFsbCB0aGUgc2VjdGlvbnMgYW5kIHJlbG9jYXRpb25zIG9mIHRoZSBpbnB1dCBmaWxlIGF0IG9uY2UuCi0gICBUaGlzIGlzIHNvIHRoYXQgd2Ugb25seSBoYXZlIHRvIHJlYWQgdGhlIGxvY2FsIHN5bWJvbHMgb25jZSwgYW5kCi0gICBkb24ndCBoYXZlIHRvIGtlZXAgdGhlbSBpbiBtZW1vcnkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfaW5wdXRfYmZkIChmaW5mbywgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotewotICBib29sZWFuICgqcmVsb2NhdGVfc2VjdGlvbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCQkJCSAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCQkJCSAgICAgICBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHNpemVfdCBsb2NzeW1jb3VudDsKLSAgc2l6ZV90IGV4dHN5bW9mZjsKLSAgRWxmX0V4dGVybmFsX1N5bSAqZXh0ZXJuYWxfc3ltczsKLSAgRWxmX0V4dGVybmFsX1N5bSAqZXN5bTsKLSAgRWxmX0V4dGVybmFsX1N5bSAqZXN5bWVuZDsKLSAgRWxmX0ludGVybmFsX1N5bSAqaXN5bTsKLSAgbG9uZyAqcGluZGV4OwotICBhc2VjdGlvbiAqKnBwc2VjdGlvbjsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgb3V0cHV0X2JmZCA9IGZpbmZvLT5vdXRwdXRfYmZkOwotICByZWxvY2F0ZV9zZWN0aW9uID0KLSAgICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAob3V0cHV0X2JmZCktPmVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb247Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGR5bmFtaWMgb2JqZWN0LCB3ZSBkb24ndCB3YW50IHRvIGRvIGFueXRoaW5nIGhlcmU6Ci0gICAgIHdlIGRvbid0IHdhbnQgdGhlIGxvY2FsIHN5bWJvbHMsIGFuZCB3ZSBkb24ndCB3YW50IHRoZSBzZWN0aW9uCi0gICAgIGNvbnRlbnRzLiAgKi8KLSAgaWYgKChpbnB1dF9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgaWYgKGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpKQotICAgIHsKLSAgICAgIGxvY3N5bWNvdW50ID0gc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0gICAgICBleHRzeW1vZmYgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxvY3N5bWNvdW50ID0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICAgIGV4dHN5bW9mZiA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgfQotCi0gIC8qIFJlYWQgdGhlIGxvY2FsIHN5bWJvbHMuICAqLwotICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLSAgICBleHRlcm5hbF9zeW1zID0gKEVsZl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gIGVsc2UgaWYgKGxvY3N5bWNvdW50ID09IDApCi0gICAgZXh0ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHRlcm5hbF9zeW1zID0gZmluZm8tPmV4dGVybmFsX3N5bXM7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9zeW1zLCBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLAotCQkJbG9jc3ltY291bnQsIGlucHV0X2JmZCkKLQkgICAgICAhPSBsb2NzeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU3dhcCBpbiB0aGUgbG9jYWwgc3ltYm9scyBhbmQgd3JpdGUgb3V0IHRoZSBvbmVzIHdoaWNoIHdlIGtub3cKLSAgICAgYXJlIGdvaW5nIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgZXN5bSA9IGV4dGVybmFsX3N5bXM7Ci0gIGVzeW1lbmQgPSBlc3ltICsgbG9jc3ltY291bnQ7Ci0gIGlzeW0gPSBmaW5mby0+aW50ZXJuYWxfc3ltczsKLSAgcGluZGV4ID0gZmluZm8tPmluZGljZXM7Ci0gIHBwc2VjdGlvbiA9IGZpbmZvLT5zZWN0aW9uczsKLSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyssIGlzeW0rKywgcGluZGV4KyssIHBwc2VjdGlvbisrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICppc2VjOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gb3N5bTsKLQotICAgICAgZWxmX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsIGVzeW0sIGlzeW0pOwotICAgICAgKnBpbmRleCA9IC0xOwotCi0gICAgICBpZiAoZWxmX2JhZF9zeW10YWIgKGlucHV0X2JmZCkpCi0JewotCSAgaWYgKEVMRl9TVF9CSU5EIChpc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAgIHsKLQkgICAgICAqcHBzZWN0aW9uID0gTlVMTDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGlzeW0tPnN0X3NobmR4ID09IFNITl9VTkRFRikKLQlpc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIGVsc2UgaWYgKGlzeW0tPnN0X3NobmR4ID4gMCAmJiBpc3ltLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JaXNlYyA9IHNlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwgaXN5bS0+c3Rfc2huZHgpOwotICAgICAgZWxzZSBpZiAoaXN5bS0+c3Rfc2huZHggPT0gU0hOX0FCUykKLQlpc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIGVsc2UgaWYgKGlzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JaXNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2hvIGtub3dzPyAgKi8KLQkgIGlzZWMgPSBOVUxMOwotCX0KLQotICAgICAgKnBwc2VjdGlvbiA9IGlzZWM7Ci0KLSAgICAgIC8qIERvbid0IG91dHB1dCB0aGUgZmlyc3QsIHVuZGVmaW5lZCwgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChlc3ltID09IGV4dGVybmFsX3N5bXMpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBzdHJpcHBpbmcgYWxsIHN5bWJvbHMsIHdlIGRvbid0IHdhbnQgdG8gb3V0cHV0IHRoaXMKLQkgb25lLiAgKi8KLSAgICAgIGlmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBuZXZlciBvdXRwdXQgc2VjdGlvbiBzeW1ib2xzLiAgSW5zdGVhZCwgd2UgdXNlIHRoZSBzZWN0aW9uCi0JIHN5bWJvbCBvZiB0aGUgY29ycmVzcG9uZGluZyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gICAgICBpZiAoRUxGX1NUX1RZUEUgKGlzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB3ZSBhcmUgZGlzY2FyZGluZyBhbGwgbG9jYWwgc3ltYm9scywgd2UgZG9uJ3Qgd2FudCB0bwotCSBvdXRwdXQgdGhpcyBvbmUuICBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvdXRwdXQKLQkgZmlsZSwgdGhlbiBzb21lIG9mIHRoZSBsb2NhbCBzeW1ib2xzIG1heSBiZSByZXF1aXJlZCBieQotCSByZWxvY3M7IHdlIG91dHB1dCB0aGVtIGJlbG93IGFzIHdlIGRpc2NvdmVyIHRoYXQgdGhleSBhcmUKLQkgbmVlZGVkLiAgKi8KLSAgICAgIGlmIChmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2FsbCkKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBpbiBhIHNlY3Rpb24gd2hpY2ggd2UgYXJlCi0gICAgICAgICBkaXNjYXJkaW5nLCB3ZSBkb24ndCBuZWVkIHRvIGtlZXAgaXQsIGJ1dCBub3RlIHRoYXQKLSAgICAgICAgIGxpbmtlcl9tYXJrIGlzIG9ubHkgcmVsaWFibGUgZm9yIHNlY3Rpb25zIHRoYXQgaGF2ZSBjb250ZW50cy4KLSAgICAgICAgIEZvciB0aGUgYmVuZWZpdCBvZiB0aGUgTUlQUyBFTEYgbGlua2VyLCB3ZSBjaGVjayBTRUNfRVhDTFVERQotICAgICAgICAgYXMgd2VsbCBhcyBsaW5rZXJfbWFyay4gICovCi0gICAgICBpZiAoaXN5bS0+c3Rfc2huZHggPiAwCi0JICAmJiBpc3ltLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUKLQkgICYmIGlzZWMgIT0gTlVMTAotCSAgJiYgKCghIGlzZWMtPmxpbmtlcl9tYXJrICYmIChpc2VjLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JICAgICAgfHwgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZQotCQkgICYmIChpc2VjLT5mbGFncyAmIFNFQ19FWENMVURFKSAhPSAwKSkpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCSAgICAgIGlzeW0tPnN0X25hbWUpOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFNlZSBpZiB3ZSBhcmUgZGlzY2FyZGluZyBzeW1ib2xzIHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgICAgIGlmICgoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAmJiAoYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UpCi0JICAgICAgID09IE5VTEwpKQotCSAgfHwgKGZpbmZvLT5pbmZvLT5kaXNjYXJkID09IGRpc2NhcmRfbAotCSAgICAgICYmIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChpbnB1dF9iZmQsIG5hbWUpKSkKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlIGFyZSBnb2luZyB0byBvdXRwdXQgdGhpcyBzeW1ib2wuICAqLwotCi0gICAgICBvc3ltID0gKmlzeW07Ci0KLSAgICAgIC8qIEFkanVzdCB0aGUgc2VjdGlvbiBpbmRleCBmb3IgdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgICAgIG9zeW0uc3Rfc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKG91dHB1dF9iZmQsCi0JCQkJCQkJIGlzZWMtPm91dHB1dF9zZWN0aW9uKTsKLSAgICAgIGlmIChvc3ltLnN0X3NobmR4ID09ICh1bnNpZ25lZCBzaG9ydCkgLTEpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAqcGluZGV4ID0gYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCk7Ci0KLSAgICAgIC8qIEVMRiBzeW1ib2xzIGluIHJlbG9jYXRlYWJsZSBmaWxlcyBhcmUgc2VjdGlvbiByZWxhdGl2ZSwgYnV0Ci0JIGluIGV4ZWN1dGFibGUgZmlsZXMgdGhleSBhcmUgdmlydHVhbCBhZGRyZXNzZXMuICBOb3RlIHRoYXQKLQkgdGhpcyBjb2RlIGFzc3VtZXMgdGhhdCBhbGwgRUxGIHNlY3Rpb25zIGhhdmUgYW4gYXNzb2NpYXRlZAotCSBCRkQgc2VjdGlvbiB3aXRoIGEgcmVhc29uYWJsZSB2YWx1ZSBmb3Igb3V0cHV0X29mZnNldDsgYmVsb3cKLQkgd2UgYXNzdW1lIHRoYXQgdGhleSBhbHNvIGhhdmUgYSByZWFzb25hYmxlIHZhbHVlIGZvcgotCSBvdXRwdXRfc2VjdGlvbi4gIEFueSBzcGVjaWFsIHNlY3Rpb25zIG11c3QgYmUgc2V0IHVwIHRvIG1lZXQKLQkgdGhlc2UgcmVxdWlyZW1lbnRzLiAgKi8KLSAgICAgIG9zeW0uc3RfdmFsdWUgKz0gaXNlYy0+b3V0cHV0X29mZnNldDsKLSAgICAgIGlmICghIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCi0Jb3N5bS5zdF92YWx1ZSArPSBpc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gICAgICBpZiAoISBlbGZfbGlua19vdXRwdXRfc3ltIChmaW5mbywgbmFtZSwgJm9zeW0sIGlzZWMpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogUmVsb2NhdGUgdGhlIGNvbnRlbnRzIG9mIGVhY2ggc2VjdGlvbi4gICovCi0gIGZvciAobyA9IGlucHV0X2JmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotCi0gICAgICBpZiAoISBvLT5saW5rZXJfbWFyaykKLQl7Ci0JICAvKiBUaGlzIHNlY3Rpb24gd2FzIG9taXR0ZWQgZnJvbSB0aGUgbGluay4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0JICB8fCAoby0+X3Jhd19zaXplID09IDAgJiYgKG8tPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwKSkKLQljb250aW51ZTsKLQotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgIT0gMCkKLQl7Ci0JICAvKiBTZWN0aW9uIHdhcyBjcmVhdGVkIGJ5IGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0JICAgICBvciBzb21lc3VjaC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24uICBUaGV5IGhhdmUgYmVlbiBjYWNoZWQgYnkgYQotICAgICAgICAgcmVsYXhhdGlvbiByb3V0aW5lLiAgTm90ZSB0aGF0IG8gaXMgYSBzZWN0aW9uIGluIGFuIGlucHV0Ci0gICAgICAgICBmaWxlLCBzbyB0aGUgY29udGVudHMgZmllbGQgd2lsbCBub3QgaGF2ZSBiZWVuIHNldCBieSBhbnkgb2YKLSAgICAgICAgIHRoZSByb3V0aW5lcyB3aGljaCB3b3JrIG9uIG91dHB1dCBmaWxlcy4gICovCi0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHM7Ci0gICAgICBlbHNlCi0JewotCSAgY29udGVudHMgPSBmaW5mby0+Y29udGVudHM7Ci0JICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgbywgY29udGVudHMsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBvLT5fcmF3X3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci0KLQkgIC8qIEdldCB0aGUgc3dhcHBlZCByZWxvY3MuICAqLwotCSAgaW50ZXJuYWxfcmVsb2NzID0gKE5BTUUoX2JmZF9lbGYsbGlua19yZWFkX3JlbG9jcykKLQkJCSAgICAgKGlucHV0X2JmZCwgbywgZmluZm8tPmV4dGVybmFsX3JlbG9jcywKLQkJCSAgICAgIGZpbmZvLT5pbnRlcm5hbF9yZWxvY3MsIGZhbHNlKSk7Ci0JICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwKLQkgICAgICAmJiBvLT5yZWxvY19jb3VudCA+IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogUmVsb2NhdGUgdGhlIHNlY3Rpb24gYnkgaW52b2tpbmcgYSBiYWNrIGVuZCByb3V0aW5lLgotCi0JICAgICBUaGUgYmFjayBlbmQgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3IgYWRqdXN0aW5nIHRoZQotCSAgICAgc2VjdGlvbiBjb250ZW50cyBhcyBuZWNlc3NhcnksIGFuZCAoaWYgdXNpbmcgUmVsYSByZWxvY3MKLQkgICAgIGFuZCBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlKSBhZGp1c3RpbmcgdGhlCi0JICAgICByZWxvYyBhZGRlbmQgYXMgbmVjZXNzYXJ5LgotCi0JICAgICBUaGUgYmFjayBlbmQgcm91dGluZSBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcKLQkgICAgIHRoZSByZWxvYyBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLQkgICAgIFRoZSBiYWNrIGVuZCByb3V0aW5lIGlzIGdpdmVuIGEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCBpbgotCSAgICAgaW50ZXJuYWwgc3ltYm9scywgYW5kIGNhbiBhY2Nlc3MgdGhlIGhhc2ggdGFibGUgZW50cmllcwotCSAgICAgZm9yIHRoZSBleHRlcm5hbCBzeW1ib2xzIHZpYSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKS4KLQotCSAgICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoZSBiYWNrIGVuZCByb3V0aW5lCi0JICAgICBtdXN0IGhhbmRsZSBTVEJfTE9DQUwvU1RUX1NFQ1RJT04gc3ltYm9scyBzcGVjaWFsbHkuICBUaGUKLQkgICAgIG91dHB1dCBzeW1ib2wgaXMgZ29pbmcgdG8gYmUgYSBzZWN0aW9uIHN5bWJvbAotCSAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0IHNlY3Rpb24sIHdoaWNoIHdpbGwgcmVxdWlyZQotCSAgICAgdGhlIGFkZGVuZCB0byBiZSBhZGp1c3RlZC4gICovCi0KLQkgIGlmICghICgqcmVsb2NhdGVfc2VjdGlvbikgKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLAotCQkJCSAgICAgaW5wdXRfYmZkLCBvLCBjb250ZW50cywKLQkJCQkgICAgIGludGVybmFsX3JlbG9jcywKLQkJCQkgICAgIGZpbmZvLT5pbnRlcm5hbF9zeW1zLAotCQkJCSAgICAgZmluZm8tPnNlY3Rpb25zKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYTsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGFlbmQ7Ci0JICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaDsKLQkgICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaW5wdXRfcmVsX2hkcjsKLQkgICAgICBFbGZfSW50ZXJuYWxfU2hkciAqb3V0cHV0X3JlbF9oZHI7Ci0KLQkgICAgICAvKiBBZGp1c3QgdGhlIHJlbG9jIGFkZHJlc3NlcyBhbmQgc3ltYm9sIGluZGljZXMuICAqLwotCi0JICAgICAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICAgICAgaXJlbGFlbmQgPSBpcmVsYSArIG8tPnJlbG9jX2NvdW50OwotCSAgICAgIHJlbF9oYXNoID0gKGVsZl9zZWN0aW9uX2RhdGEgKG8tPm91dHB1dF9zZWN0aW9uKS0+cmVsX2hhc2hlcwotCQkJICArIG8tPm91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCk7Ci0JICAgICAgZm9yICg7IGlyZWxhIDwgaXJlbGFlbmQ7IGlyZWxhKyssIHJlbF9oYXNoKyspCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotCQkgIEVsZl9JbnRlcm5hbF9TeW0gKmlzeW07Ci0JCSAgYXNlY3Rpb24gKnNlYzsKLQotCQkgIGlyZWxhLT5yX29mZnNldCArPSBvLT5vdXRwdXRfb2Zmc2V0OwotCi0JCSAgcl9zeW1uZHggPSBFTEZfUl9TWU0gKGlyZWxhLT5yX2luZm8pOwotCi0JCSAgaWYgKHJfc3ltbmR4ID09IDApCi0JCSAgICBjb250aW51ZTsKLQotCQkgIGlmIChyX3N5bW5keCA+PSBsb2NzeW1jb3VudAotCQkgICAgICB8fCAoZWxmX2JhZF9zeW10YWIgKGlucHV0X2JmZCkKLQkJCSAgJiYgZmluZm8tPnNlY3Rpb25zW3Jfc3ltbmR4XSA9PSBOVUxMKSkKLQkJICAgIHsKLQkJICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKnJoOwotCQkgICAgICBsb25nIGluZHg7Ci0KLQkJICAgICAgLyogVGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLiAgV2UKLQkJCSBoYXZlIG5vdCB5ZXQgb3V0cHV0IGFsbCB0aGUgbG9jYWwgc3ltYm9scywgc28KLQkJCSB3ZSBkbyBub3Qga25vdyB0aGUgc3ltYm9sIGluZGV4IG9mIGFueSBnbG9iYWwKLQkJCSBzeW1ib2wuICBXZSBzZXQgdGhlIHJlbF9oYXNoIGVudHJ5IGZvciB0aGlzCi0JCQkgcmVsb2MgdG8gcG9pbnQgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlIGVudHJ5Ci0JCQkgZm9yIHRoaXMgc3ltYm9sLiAgVGhlIHN5bWJvbCBpbmRleCBpcyB0aGVuCi0JCQkgc2V0IGF0IHRoZSBlbmQgb2YgZWxmX2JmZF9maW5hbF9saW5rLiAgKi8KLQkJICAgICAgaW5keCA9IHJfc3ltbmR4IC0gZXh0c3ltb2ZmOwotCQkgICAgICByaCA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2luZHhdOwotCQkgICAgICB3aGlsZSAocmgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCQkgICAgIHx8IHJoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCQkJcmggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgcmgtPnJvb3QudS5pLmxpbms7Ci0KLQkJICAgICAgLyogU2V0dGluZyB0aGUgaW5kZXggdG8gLTIgdGVsbHMKLQkJCSBlbGZfbGlua19vdXRwdXRfZXh0c3ltIHRoYXQgdGhpcyBzeW1ib2wgaXMKLQkJCSB1c2VkIGJ5IGEgcmVsb2MuICAqLwotCQkgICAgICBCRkRfQVNTRVJUIChyaC0+aW5keCA8IDApOwotCQkgICAgICByaC0+aW5keCA9IC0yOwotCi0JCSAgICAgICpyZWxfaGFzaCA9IHJoOwotCi0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCi0JCSAgLyogVGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wuICovCi0KLQkJICAqcmVsX2hhc2ggPSBOVUxMOwotCQkgIGlzeW0gPSBmaW5mby0+aW50ZXJuYWxfc3ltcyArIHJfc3ltbmR4OwotCQkgIHNlYyA9IGZpbmZvLT5zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgaWYgKEVMRl9TVF9UWVBFIChpc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJICAgIHsKLQkJICAgICAgLyogSSBzdXBwb3NlIHRoZSBiYWNrZW5kIG91Z2h0IHRvIGZpbGwgaW4gdGhlCi0JCQkgc2VjdGlvbiBvZiBhbnkgU1RUX1NFQ1RJT04gc3ltYm9sIGFnYWluc3QgYQotCQkJIHByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uLiAgSWYgd2UgaGF2ZQotCQkJIGRpc2NhcmRlZCBhIHNlY3Rpb24sIHRoZSBvdXRwdXRfc2VjdGlvbiB3aWxsCi0JCQkgYmUgdGhlIGFic29sdXRlIHNlY3Rpb24uICAqLwotCQkgICAgICBpZiAoc2VjICE9IE5VTEwKLQkJCSAgJiYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKQotCQkJICAgICAgfHwgKHNlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTAotCQkJCSAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChzZWMtPm91dHB1dF9zZWN0aW9uKSkpKQotCQkJcl9zeW1uZHggPSAwOwotCQkgICAgICBlbHNlIGlmIChzZWMgPT0gTlVMTCB8fCBzZWMtPm93bmVyID09IE5VTEwpCi0JCQl7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgcl9zeW1uZHggPSBzZWMtPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JCQkgIEJGRF9BU1NFUlQgKHJfc3ltbmR4ICE9IDApOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKGZpbmZvLT5pbmRpY2VzW3Jfc3ltbmR4XSA9PSAtMSkKLQkJCXsKLQkJCSAgdW5zaWduZWQgbG9uZyBsaW5rOwotCQkJICBjb25zdCBjaGFyICpuYW1lOwotCQkJICBhc2VjdGlvbiAqb3NlYzsKLQotCQkJICBpZiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbCkKLQkJCSAgICB7Ci0JCQkgICAgICAvKiBZb3UgY2FuJ3QgZG8gbGQgLXIgLXMuICAqLwotCQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkJCSAgICAgIHJldHVybiBmYWxzZTsKLQkJCSAgICB9Ci0KLQkJCSAgLyogVGhpcyBzeW1ib2wgd2FzIHNraXBwZWQgZWFybGllciwgYnV0Ci0JCQkgICAgIHNpbmNlIGl0IGlzIG5lZWRlZCBieSBhIHJlbG9jLCB3ZQotCQkJICAgICBtdXN0IG91dHB1dCBpdCBub3cuICAqLwotCQkJICBsaW5rID0gc3ltdGFiX2hkci0+c2hfbGluazsKLQkJCSAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQkJICBsaW5rLAotCQkJCQkJCQkgIGlzeW0tPnN0X25hbWUpOwotCQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkJICBvc2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQkJCSAgaXN5bS0+c3Rfc2huZHggPQotCQkJICAgIF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAob3V0cHV0X2JmZCwKLQkJCQkJCQkgICAgICAgb3NlYyk7Ci0JCQkgIGlmIChpc3ltLT5zdF9zaG5keCA9PSAodW5zaWduZWQgc2hvcnQpIC0xKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkJICBpc3ltLT5zdF92YWx1ZSArPSBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0JCQkgIGlmICghIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCi0JCQkgICAgaXN5bS0+c3RfdmFsdWUgKz0gb3NlYy0+dm1hOwotCi0JCQkgIGZpbmZvLT5pbmRpY2VzW3Jfc3ltbmR4XSA9IGJmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpOwotCi0JCQkgIGlmICghIGVsZl9saW5rX291dHB1dF9zeW0gKGZpbmZvLCBuYW1lLCBpc3ltLCBzZWMpKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkgICAgICByX3N5bW5keCA9IGZpbmZvLT5pbmRpY2VzW3Jfc3ltbmR4XTsKLQkJICAgIH0KLQotCQkgIGlyZWxhLT5yX2luZm8gPSBFTEZfUl9JTkZPIChyX3N5bW5keCwKLQkJCQkJICAgICAgRUxGX1JfVFlQRSAoaXJlbGEtPnJfaW5mbykpOwotCQl9Ci0KLQkgICAgICAvKiBTd2FwIG91dCB0aGUgcmVsb2NzLiAgKi8KLQkgICAgICBpbnB1dF9yZWxfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyOwotCSAgICAgIG91dHB1dF9yZWxfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKG8tPm91dHB1dF9zZWN0aW9uKS0+cmVsX2hkcjsKLQkgICAgICBCRkRfQVNTRVJUIChvdXRwdXRfcmVsX2hkci0+c2hfZW50c2l6ZQotCQkJICA9PSBpbnB1dF9yZWxfaGRyLT5zaF9lbnRzaXplKTsKLQkgICAgICBpcmVsYSA9IGludGVybmFsX3JlbG9jczsKLQkgICAgICBpcmVsYWVuZCA9IGlyZWxhICsgby0+cmVsb2NfY291bnQ7Ci0JICAgICAgaWYgKGlucHV0X3JlbF9oZHItPnNoX2VudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsKSkKLQkJewotCQkgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWw7Ci0KLQkJICBlcmVsID0gKChFbGZfRXh0ZXJuYWxfUmVsICopIG91dHB1dF9yZWxfaGRyLT5jb250ZW50cwotCQkJICArIG8tPm91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCk7Ci0JCSAgZm9yICg7IGlyZWxhIDwgaXJlbGFlbmQ7IGlyZWxhKyssIGVyZWwrKykKLQkJICAgIHsKLQkJICAgICAgRWxmX0ludGVybmFsX1JlbCBpcmVsOwotCi0JCSAgICAgIGlyZWwucl9vZmZzZXQgPSBpcmVsYS0+cl9vZmZzZXQ7Ci0JCSAgICAgIGlyZWwucl9pbmZvID0gaXJlbGEtPnJfaW5mbzsKLQkJICAgICAgQkZEX0FTU0VSVCAoaXJlbGEtPnJfYWRkZW5kID09IDApOwotCQkgICAgICBlbGZfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZpcmVsLCBlcmVsKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYTsKLQotCQkgIEJGRF9BU1NFUlQgKGlucHV0X3JlbF9oZHItPnNoX2VudHNpemUKLQkJCSAgICAgID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpKTsKLQkJICBlcmVsYSA9ICgoRWxmX0V4dGVybmFsX1JlbGEgKikgb3V0cHV0X3JlbF9oZHItPmNvbnRlbnRzCi0JCQkgICArIG8tPm91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCk7Ci0JCSAgZm9yICg7IGlyZWxhIDwgaXJlbGFlbmQ7IGlyZWxhKyssIGVyZWxhKyspCi0JCSAgICBlbGZfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCBpcmVsYSwgZXJlbGEpOwotCQl9Ci0KLQkgICAgICBvLT5vdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKz0gby0+cmVsb2NfY291bnQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgbW9kaWZpZWQgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnN0YWJfaW5mbyA9PSBOVUxMKQotCXsKLQkgIGlmICghIChvLT5mbGFncyAmIFNFQ19FWENMVURFKSAmJgotCSAgICAgICEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkJICBjb250ZW50cywgby0+b3V0cHV0X29mZnNldCwKLQkJCQkJICAoby0+X2Nvb2tlZF9zaXplICE9IDAKLQkJCQkJICAgPyBvLT5fY29va2VkX3NpemUKLQkJCQkJICAgOiBvLT5fcmF3X3NpemUpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzCi0JCSAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPnN0YWJfaW5mbywKLQkJICBvLCAmZWxmX3NlY3Rpb25fZGF0YSAobyktPnN0YWJfaW5mbywgY29udGVudHMpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdlbmVyYXRlIGEgcmVsb2Mgd2hlbiBsaW5raW5nIGFuIEVMRiBmaWxlLiAgVGhpcyBpcyBhIHJlbG9jCi0gICByZXF1ZXN0ZWQgYnkgdGhlIGxpbmtlciwgYW5kIGRvZXMgY29tZSBmcm9tIGFueSBpbnB1dCBmaWxlLiAgVGhpcwotICAgaXMgdXNlZCB0byBidWlsZCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0YWJsZXMgd2hlbiBsaW5raW5nCi0gICB3aXRoIC1Vci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfcmVsb2NfbGlua19vcmRlciAob3V0cHV0X2JmZCwgaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgbG9uZyBpbmR4OwotICBiZmRfdm1hIG9mZnNldDsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2hfcHRyOwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLQotICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAob3V0cHV0X2JmZCwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5yZWxvYyk7Ci0gIGlmIChob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBhZGRlbmQgPSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZDsKLQotICAvKiBGaWd1cmUgb3V0IHRoZSBzeW1ib2wgaW5kZXguICAqLwotICByZWxfaGFzaF9wdHIgPSAoZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfaGFzaGVzCi0JCSAgKyBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOwotICBpZiAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyKQotICAgIHsKLSAgICAgIGluZHggPSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUuc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgICAgQkZEX0FTU0VSVCAoaW5keCAhPSAwKTsKLSAgICAgICpyZWxfaGFzaF9wdHIgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAvKiBUcmVhdCBhIHJlbG9jIGFnYWluc3QgYSBkZWZpbmVkIHN5bWJvbCBhcyB0aG91Z2ggaXQgd2VyZQotICAgICAgICAgYWN0dWFsbHkgYWdhaW5zdCB0aGUgc2VjdGlvbi4gICovCi0gICAgICBoID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sCi0JCQkJCSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJCQkJIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotICAgICAgaWYgKGggIT0gTlVMTAotCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotCSAgc2VjdGlvbiA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIGluZHggPSBzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgKnJlbF9oYXNoX3B0ciA9IE5VTEw7Ci0JICAvKiBJdCBzZWVtcyB0aGF0IHdlIG91Z2h0IHRvIGFkZCB0aGUgc3ltYm9sIHZhbHVlIHRvIHRoZQotICAgICAgICAgICAgIGFkZGVuZCBoZXJlLCBidXQgaW4gcHJhY3RpY2UgaXQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZAotICAgICAgICAgICAgIGJlY2F1c2UgaXQgd2FzIHBhc3NlZCB0byBjb25zdHJ1Y3Rvcl9jYWxsYmFjay4gICovCi0JICBhZGRlbmQgKz0gc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JfQotICAgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCXsKLQkgIC8qIFNldHRpbmcgdGhlIGluZGV4IHRvIC0yIHRlbGxzIGVsZl9saW5rX291dHB1dF9leHRzeW0gdGhhdAotCSAgICAgdGhpcyBzeW1ib2wgaXMgdXNlZCBieSBhIHJlbG9jLiAgKi8KLQkgIGgtPmluZHggPSAtMjsKLQkgICpyZWxfaGFzaF9wdHIgPSBoOwotCSAgaW5keCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJIChpbmZvLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwgKGJmZCAqKSBOVUxMLAotCQkgIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpbmR4ID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYW4gaW5wbGFjZSByZWxvYywgd2UgbXVzdCB3cml0ZSB0aGUgYWRkZW5kIGludG8gdGhlCi0gICAgIG9iamVjdCBmaWxlLiAgKi8KLSAgaWYgKGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgJiYgYWRkZW5kICE9IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotICAgICAgYmZkX2J5dGUgKmJ1ZjsKLSAgICAgIGJvb2xlYW4gb2s7Ci0KLSAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfem1hbGxvYyAoc2l6ZSk7Ci0gICAgICBpZiAoYnVmID09IChiZmRfYnl0ZSAqKSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIG91dHB1dF9iZmQsIGFkZGVuZCwgYnVmKTsKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGluZm8sCi0JCSAgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICA/IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJICAgICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uKQotCQkgICA6IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lKSwKLQkJICBob3d0by0+bmFtZSwgYWRkZW5kLCAoYmZkICopIE5VTEwsIChhc2VjdGlvbiAqKSBOVUxMLAotCQkgIChiZmRfdm1hKSAwKSkpCi0JICAgIHsKLQkgICAgICBmcmVlIChidWYpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgb2sgPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uLCAoUFRSKSBidWYsCi0JCQkJICAgICAoZmlsZV9wdHIpIGxpbmtfb3JkZXItPm9mZnNldCwgc2l6ZSk7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgaWYgKCEgb2spCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgYWRkcmVzcyBvZiBhIHJlbG9jIGlzIHJlbGF0aXZlIHRvIHRoZSBzZWN0aW9uIGluIGEKLSAgICAgcmVsb2NhdGVhYmxlIGZpbGUsIGFuZCBpcyBhIHZpcnR1YWwgYWRkcmVzcyBpbiBhbiBleGVjdXRhYmxlCi0gICAgIGZpbGUuICAqLwotICBvZmZzZXQgPSBsaW5rX29yZGVyLT5vZmZzZXQ7Ci0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICBvZmZzZXQgKz0gb3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICByZWxfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2hkcjsKLQotICBpZiAocmVsX2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgaXJlbDsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWw7Ci0KLSAgICAgIGlyZWwucl9vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICBpcmVsLnJfaW5mbyA9IEVMRl9SX0lORk8gKGluZHgsIGhvd3RvLT50eXBlKTsKLSAgICAgIGVyZWwgPSAoKEVsZl9FeHRlcm5hbF9SZWwgKikgcmVsX2hkci0+Y29udGVudHMKLQkgICAgICArIG91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCk7Ci0gICAgICBlbGZfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZpcmVsLCBlcmVsKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSBpcmVsYTsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYTsKLQotICAgICAgaXJlbGEucl9vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICBpcmVsYS5yX2luZm8gPSBFTEZfUl9JTkZPIChpbmR4LCBob3d0by0+dHlwZSk7Ci0gICAgICBpcmVsYS5yX2FkZGVuZCA9IGFkZGVuZDsKLSAgICAgIGVyZWxhID0gKChFbGZfRXh0ZXJuYWxfUmVsYSAqKSByZWxfaGRyLT5jb250ZW50cwotCSAgICAgICArIG91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCk7Ci0gICAgICBlbGZfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmaXJlbGEsIGVyZWxhKTsKLSAgICB9Ci0KLSAgKytvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIEFsbG9jYXRlIGEgcG9pbnRlciB0byBsaXZlIGluIGEgbGlua2VyIGNyZWF0ZWQgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLWVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgbHNlY3QsIGgsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0OwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLXsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKipwdHJfbGlua2VyX3NlY3Rpb25fcHRyID0gTlVMTDsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKmxpbmtlcl9zZWN0aW9uX3B0cjsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keCA9IEVMRl9SX1NZTSAocmVsLT5yX2luZm8pOzsKLQotICBCRkRfQVNTRVJUIChsc2VjdCAhPSBOVUxMKTsKLQotICAvKiBJcyB0aGlzIGEgZ2xvYmFsIHN5bWJvbD8gKi8KLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBIYXMgdGhpcyBzeW1ib2wgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCwgaWYgc28sIG91ciB3b3JrIGlzIGRvbmUgKi8KLSAgICAgIGlmIChfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGgtPmxpbmtlcl9zZWN0aW9uX3BvaW50ZXIsCi0JCQkJCQlyZWwtPnJfYWRkZW5kLAotCQkJCQkJbHNlY3QtPndoaWNoKSkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgcHRyX2xpbmtlcl9zZWN0aW9uX3B0ciA9ICZoLT5saW5rZXJfc2VjdGlvbl9wb2ludGVyOwotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIGVsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChsc2VjdC0+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+b2Zmc2V0KTsKLQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGX1JfSU5GTyAoMCwgcmVsYXRpdmVfcmVsb2MpOwotCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IDA7Ci0JICAgICAgZWxmX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkgICAoKChFbGZfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCSAgICAgbHNlY3QtPnNlY3Rpb24tPmNvbnRlbnRzKQotCQkJCSAgICArIGxzZWN0LT5zZWN0aW9uLT5yZWxvY19jb3VudCkpOwotCSAgICAgICsrbHNlY3QtPnNlY3Rpb24tPnJlbG9jX2NvdW50OwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZWxvY2F0aW9uID0gKGxzZWN0LT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSsgbGlua2VyX3NlY3Rpb25fcHRyLT5vZmZzZXQKLQkJLSBsc2VjdC0+aG9sZV9vZmZzZXQKLQkJLSBsc2VjdC0+c3ltX29mZnNldCk7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJGaW5pc2ggcG9pbnRlciBpbiBsaW5rZXIgc2VjdGlvbiAlcywgb2Zmc2V0ID0gJWxkICgweCVseClcbiIsCi0JICAgbHNlY3QtPm5hbWUsIChsb25nKXJlbG9jYXRpb24sIChsb25nKXJlbG9jYXRpb24pOwotI2VuZGlmCi0KLSAgLyogU3VidHJhY3Qgb3V0IHRoZSBhZGRlbmQsIGJlY2F1c2UgaXQgd2lsbCBnZXQgYWRkZWQgYmFjayBpbiBieSB0aGUgbm9ybWFsCi0gICAgIHByb2Nlc3NpbmcuICAqLwotICByZXR1cm4gcmVsb2NhdGlvbiAtIGxpbmtlcl9zZWN0aW9uX3B0ci0+YWRkZW5kOwotfQotDAotLyogR2FyYmFnZSBjb2xsZWN0IHVudXNlZCBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuIGVsZl9nY19tYXJrCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqc2VjLAotCSAgIGFzZWN0aW9uICogKCpnY19tYXJrX2hvb2spCi0JICAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkJICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgRWxmX0ludGVybmFsX1N5bSAqKSkpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2djX3N3ZWVwCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgIGJvb2xlYW4gKCpnY19zd2VlcF9ob29rKQotCSAgICAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgYXNlY3Rpb24gKm8sCi0JCSAgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MpKSkpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfZ2Nfc3dlZXBfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBQVFIgaWR4cHRyKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9nY19hbGxvY2F0ZV9nb3Rfb2Zmc2V0cwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgUFRSIG9mZmFyZykpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfZ2NfcHJvcGFnYXRlX3Z0YWJsZV9lbnRyaWVzX3VzZWQKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIFBUUiBkdW1teSkpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfZ2Nfc21hc2hfdW51c2VkX3Z0ZW50cnlfcmVsb2NzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBQVFIgZHVtbXkpKTsKLQotLyogVGhlIG1hcmsgcGhhc2Ugb2YgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgRm9yIGEgZ2l2ZW4gc2VjdGlvbiwgbWFyawotICAgaXQsIGFuZCBhbGwgdGhlIHNlY3Rpb25zIHdoaWNoIGRlZmluZSBzeW1ib2xzIHRvIHdoaWNoIGl0IHJlZmVycy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZ2NfbWFyayAoaW5mbywgc2VjLCBnY19tYXJrX2hvb2spCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhc2VjdGlvbiAqICgqZ2NfbWFya19ob29rKQotICAgICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCQlzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLXsKLSAgYm9vbGVhbiByZXQgPSB0cnVlOwotCi0gIHNlYy0+Z2NfbWFyayA9IDE7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzZWN0aW9uIHJlbG9jcy4gICovCi0KLSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwICYmIHNlYy0+cmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxzdGFydCwgKnJlbCwgKnJlbGVuZDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICAgICAgc2l6ZV90IG5sb2NzeW1zOwotICAgICAgc2l6ZV90IGV4dHN5bW9mZjsKLSAgICAgIEVsZl9FeHRlcm5hbF9TeW0gKmxvY3N5bXMsICpmcmVlc3ltcyA9IE5VTEw7Ci0gICAgICBiZmQgKmlucHV0X2JmZCA9IHNlYy0+b3duZXI7Ci0KLSAgICAgIC8qIEdDRklYTUU6IGhvdyB0byBhcnJhbmdlIHNvIHRoYXQgcmVsb2NzIGFuZCBzeW1ib2xzIGFyZSBub3QKLQkgcmVyZWFkIGNvbnRpbnVhbGx5PyAgKi8KLQotICAgICAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gICAgICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0KLSAgICAgIC8qIFJlYWQgdGhlIGxvY2FsIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpKQotCXsKLQkgIG5sb2NzeW1zID0gc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0gICAgICAgICAgZXh0c3ltb2ZmID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JZXh0c3ltb2ZmID0gbmxvY3N5bXMgPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzKQotCWxvY3N5bXMgPSAoRWxmX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLSAgICAgIGVsc2UgaWYgKG5sb2NzeW1zID09IDApCi0JbG9jc3ltcyA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgbG9jc3ltcyA9IGZyZWVzeW1zID0KLQkgICAgYmZkX21hbGxvYyAobmxvY3N5bXMgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKTsKLQkgIGlmIChmcmVlc3ltcyA9PSBOVUxMCi0JICAgICAgfHwgYmZkX3NlZWsgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IChiZmRfcmVhZCAobG9jc3ltcywgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwKLQkJCSAgICBubG9jc3ltcywgaW5wdXRfYmZkKQotCQkgICE9IG5sb2NzeW1zICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpCi0JICAgIHsKLQkgICAgICByZXQgPSBmYWxzZTsKLQkgICAgICBnb3RvIG91dDE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFJlYWQgdGhlIHJlbG9jYXRpb25zLiAgKi8KLSAgICAgIHJlbHN0YXJ0ID0gKE5BTUUoX2JmZF9lbGYsbGlua19yZWFkX3JlbG9jcykKLQkJICAoc2VjLT5vd25lciwgc2VjLCBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJICAgaW5mby0+a2VlcF9tZW1vcnkpKTsKLSAgICAgIGlmIChyZWxzdGFydCA9PSBOVUxMKQotCXsKLQkgIHJldCA9IGZhbHNlOwotCSAgZ290byBvdXQxOwotCX0KLSAgICAgIHJlbGVuZCA9IHJlbHN0YXJ0ICsgc2VjLT5yZWxvY19jb3VudDsKLQotICAgICAgZm9yIChyZWwgPSByZWxzdGFydDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotCSAgYXNlY3Rpb24gKnJzZWM7Ci0JICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gczsKLQotCSAgcl9zeW1uZHggPSBFTEZfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQkgIGlmIChyX3N5bW5keCA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGVsZl9iYWRfc3ltdGFiIChzZWMtPm93bmVyKSkKLQkgICAgewotCSAgICAgIGVsZl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCAmbG9jc3ltc1tyX3N5bW5keF0sICZzKTsKLQkgICAgICBpZiAoRUxGX1NUX0JJTkQgKHMuc3RfaW5mbykgPT0gU1RCX0xPQ0FMKQotCSAgICAgICAgcnNlYyA9ICgqZ2NfbWFya19ob29rKShzZWMtPm93bmVyLCBpbmZvLCByZWwsIE5VTEwsICZzKTsKLQkgICAgICBlbHNlCi0JCXsKLQkgICAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdOwotCSAgICAgICAgICByc2VjID0gKCpnY19tYXJrX2hvb2spKHNlYy0+b3duZXIsIGluZm8sIHJlbCwgaCwgTlVMTCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocl9zeW1uZHggPj0gbmxvY3N5bXMpCi0JICAgIHsKLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl07Ci0JICAgICAgcnNlYyA9ICgqZ2NfbWFya19ob29rKShzZWMtPm93bmVyLCBpbmZvLCByZWwsIGgsIE5VTEwpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBlbGZfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgJmxvY3N5bXNbcl9zeW1uZHhdLCAmcyk7Ci0JICAgICAgcnNlYyA9ICgqZ2NfbWFya19ob29rKShzZWMtPm93bmVyLCBpbmZvLCByZWwsIE5VTEwsICZzKTsKLQkgICAgfQotCi0JICBpZiAocnNlYyAmJiAhcnNlYy0+Z2NfbWFyaykKLQkgICAgaWYgKCFlbGZfZ2NfbWFyayAoaW5mbywgcnNlYywgZ2NfbWFya19ob29rKSkKLQkgICAgICB7Ci0JCXJldCA9IGZhbHNlOwotCQlnb3RvIG91dDI7Ci0JICAgICAgfQotCX0KLQotICAgIG91dDI6Ci0gICAgICBpZiAoIWluZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKHJlbHN0YXJ0KTsKLSAgICBvdXQxOgotICAgICAgaWYgKGZyZWVzeW1zKQotCWZyZWUgKGZyZWVzeW1zKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhlIHN3ZWVwIHBoYXNlIG9mIGdhcmJhZ2UgY29sbGVjdGlvbi4gIFJlbW92ZSBhbGwgZ2FyYmFnZSBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZ2Nfc3dlZXAgKGluZm8sIGdjX3N3ZWVwX2hvb2spCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICgqZ2Nfc3dlZXBfaG9vaykKLSAgICAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqbywKLQkJY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcykpOwotewotICBiZmQgKnN1YjsKLQotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbzsKLQotICAgICAgZm9yIChvID0gc3ViLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICAvKiBLZWVwIHNwZWNpYWwgc2VjdGlvbnMuICBLZWVwIC5kZWJ1ZyBzZWN0aW9ucy4gICovCi0JICBpZiAoKG8tPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKQotCSAgICAgIHx8IChvLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpKQotCSAgICBvLT5nY19tYXJrID0gMTsKLQotCSAgaWYgKG8tPmdjX21hcmspCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBTa2lwIHN3ZWVwaW5nIHNlY3Rpb25zIGFscmVhZHkgZXhjbHVkZWQuICAqLwotCSAgaWYgKG8tPmZsYWdzICYgU0VDX0VYQ0xVREUpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBTaW5jZSB0aGlzIGlzIGVhcmx5IGluIHRoZSBsaW5rIHByb2Nlc3MsIGl0IGlzIHNpbXBsZQotCSAgICAgdG8gcmVtb3ZlIGEgc2VjdGlvbiBmcm9tIHRoZSBvdXRwdXQuICAqLwotCSAgby0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0KLQkgIC8qIEJ1dCB3ZSBhbHNvIGhhdmUgdG8gdXBkYXRlIHNvbWUgb2YgdGhlIHJlbG9jYXRpb24KLQkgICAgIGluZm8gd2UgY29sbGVjdGVkIGJlZm9yZS4gICovCi0JICBpZiAoZ2Nfc3dlZXBfaG9vawotCSAgICAgICYmIChvLT5mbGFncyAmIFNFQ19SRUxPQykgJiYgby0+cmVsb2NfY291bnQgPiAwKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLQkgICAgICBib29sZWFuIHI7Ci0KLQkgICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKQotCQkJCSAoby0+b3duZXIsIG8sIE5VTEwsIE5VTEwsIGluZm8tPmtlZXBfbWVtb3J5KSk7Ci0JICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICByID0gKCpnY19zd2VlcF9ob29rKShvLT5vd25lciwgaW5mbywgbywgaW50ZXJuYWxfcmVsb2NzKTsKLQotCSAgICAgIGlmICghaW5mby0+a2VlcF9tZW1vcnkpCi0JCWZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0KLQkgICAgICBpZiAoIXIpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogUmVtb3ZlIHRoZSBzeW1ib2xzIHRoYXQgd2VyZSBpbiB0aGUgc3dlcHQgc2VjdGlvbnMgZnJvbSB0aGUgZHluYW1pYwotICAgICBzeW1ib2wgdGFibGUuICBHQ0ZJWE1FOiBBbnlvbmUga25vdyBob3cgdG8gZ2V0IHRoZW0gb3V0IG9mIHRoZQotICAgICBzdGF0aWMgc3ltYm9sIHRhYmxlIGFzIHdlbGw/ICAqLwotICB7Ci0gICAgaW50IGkgPSAwOwotCi0gICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgIGVsZl9nY19zd2VlcF9zeW1ib2wsCi0JCQkgICAgKFBUUikgJmkpOwotCi0gICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCA9IGk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3dlZXAgc3ltYm9scyBpbiBzd2VwdCBzZWN0aW9ucy4gIENhbGxlZCB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZ2Nfc3dlZXBfc3ltYm9sIChoLCBpZHhwdHIpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgaWR4cHRyOwotewotICBpbnQgKmlkeCA9IChpbnQgKikgaWR4cHRyOwotCi0gIGlmIChoLT5keW5pbmR4ICE9IC0xCi0gICAgICAmJiAoKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgfHwgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5nY19tYXJrKSkKLSAgICBoLT5keW5pbmR4ID0gKCppZHgpKys7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFByb3BvZ2F0ZSBjb2xsZWN0ZWQgdnRhYmxlIGluZm9ybWF0aW9uLiAgVGhpcyBpcyBjYWxsZWQgdGhyb3VnaAotICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZ2NfcHJvcGFnYXRlX3Z0YWJsZV9lbnRyaWVzX3VzZWQgKGgsIG9rcCkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBva3A7Ci17Ci0gIC8qIFRob3NlIHRoYXQgYXJlIG5vdCB2dGFibGVzLiAqLwotICBpZiAoaC0+dnRhYmxlX3BhcmVudCA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRob3NlIHZ0YWJsZXMgdGhhdCBkbyBub3QgaGF2ZSBwYXJlbnRzLCB3ZSBjYW5ub3QgbWVyZ2UuICAqLwotICBpZiAoaC0+dnRhYmxlX3BhcmVudCA9PSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgLTEpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgd2UndmUgYWxyZWFkeSBiZWVuIGRvbmUsIGV4aXQuICAqLwotICBpZiAoaC0+dnRhYmxlX2VudHJpZXNfdXNlZCAmJiBoLT52dGFibGVfZW50cmllc191c2VkWy0xXSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBNYWtlIHN1cmUgdGhlIHBhcmVudCdzIHRhYmxlIGlzIHVwIHRvIGRhdGUuICAqLwotICBlbGZfZ2NfcHJvcGFnYXRlX3Z0YWJsZV9lbnRyaWVzX3VzZWQgKGgtPnZ0YWJsZV9wYXJlbnQsIG9rcCk7Ci0KLSAgaWYgKGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBOb25lIG9mIHRoaXMgdGFibGUncyBlbnRyaWVzIHdlcmUgcmVmZXJlbmNlZC4gIFJlLXVzZSB0aGUKLQkgcGFyZW50J3MgdGFibGUuICAqLwotICAgICAgaC0+dnRhYmxlX2VudHJpZXNfdXNlZCA9IGgtPnZ0YWJsZV9wYXJlbnQtPnZ0YWJsZV9lbnRyaWVzX3VzZWQ7Ci0gICAgICBoLT52dGFibGVfZW50cmllc19zaXplID0gaC0+dnRhYmxlX3BhcmVudC0+dnRhYmxlX2VudHJpZXNfc2l6ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaXplX3QgbjsKLSAgICAgIGJvb2xlYW4gKmN1LCAqcHU7Ci0KLSAgICAgIC8qIE9yIHRoZSBwYXJlbnQncyBlbnRyaWVzIGludG8gb3Vycy4gICovCi0gICAgICBjdSA9IGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWQ7Ci0gICAgICBjdVstMV0gPSB0cnVlOwotICAgICAgcHUgPSBoLT52dGFibGVfcGFyZW50LT52dGFibGVfZW50cmllc191c2VkOwotICAgICAgaWYgKHB1ICE9IE5VTEwpCi0JewotCSAgbiA9IGgtPnZ0YWJsZV9wYXJlbnQtPnZ0YWJsZV9lbnRyaWVzX3NpemUgLyBGSUxFX0FMSUdOOwotCSAgd2hpbGUgKC0tbiAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCpwdSkgKmN1ID0gdHJ1ZTsKLQkgICAgICBwdSsrLCBjdSsrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19zbWFzaF91bnVzZWRfdnRlbnRyeV9yZWxvY3MgKGgsIG9rcCkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBva3A7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF92bWEgaHN0YXJ0LCBoZW5kOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsc3RhcnQsICpyZWxlbmQsICpyZWw7Ci0KLSAgLyogVGFrZSBjYXJlIG9mIGJvdGggdGhvc2Ugc3ltYm9scyB0aGF0IGRvIG5vdCBkZXNjcmliZSB2dGFibGVzIGFzCi0gICAgIHdlbGwgYXMgdGhvc2UgdGhhdCBhcmUgbm90IGxvYWRlZC4gICovCi0gIGlmIChoLT52dGFibGVfcGFyZW50ID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotCi0gIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgaHN0YXJ0ID0gaC0+cm9vdC51LmRlZi52YWx1ZTsKLSAgaGVuZCA9IGhzdGFydCArIGgtPnNpemU7Ci0KLSAgcmVsc3RhcnQgPSAoTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKQotCSAgICAgIChzZWMtPm93bmVyLCBzZWMsIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCB0cnVlKSk7Ci0gIGlmICghcmVsc3RhcnQpCi0gICAgcmV0dXJuICooYm9vbGVhbiAqKW9rcCA9IGZhbHNlOwotICByZWxlbmQgPSByZWxzdGFydCArIHNlYy0+cmVsb2NfY291bnQ7Ci0KLSAgZm9yIChyZWwgPSByZWxzdGFydDsgcmVsIDwgcmVsZW5kOyArK3JlbCkKLSAgICBpZiAocmVsLT5yX29mZnNldCA+PSBoc3RhcnQgJiYgcmVsLT5yX29mZnNldCA8IGhlbmQpCi0gICAgICB7Ci0JLyogSWYgdGhlIGVudHJ5IGlzIGluIHVzZSwgZG8gbm90aGluZy4gICovCi0JaWYgKGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWQKLQkgICAgJiYgKHJlbC0+cl9vZmZzZXQgLSBoc3RhcnQpIDwgaC0+dnRhYmxlX2VudHJpZXNfc2l6ZSkKLQkgIHsKLQkgICAgYmZkX3ZtYSBlbnRyeSA9IChyZWwtPnJfb2Zmc2V0IC0gaHN0YXJ0KSAvIEZJTEVfQUxJR047Ci0JICAgIGlmIChoLT52dGFibGVfZW50cmllc191c2VkW2VudHJ5XSkKLQkgICAgICBjb250aW51ZTsKLQkgIH0KLQkvKiBPdGhlcndpc2UsIGtpbGwgaXQuICAqLwotCXJlbC0+cl9vZmZzZXQgPSByZWwtPnJfaW5mbyA9IHJlbC0+cl9hZGRlbmQgPSAwOwotICAgICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEbyBtYXJrIGFuZCBzd2VlcCBvZiB1bnVzZWQgc2VjdGlvbnMuICAqLwotCi1ib29sZWFuCi1lbGZfZ2Nfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJvb2xlYW4gb2sgPSB0cnVlOwotICBiZmQgKnN1YjsKLSAgYXNlY3Rpb24gKiAoKmdjX21hcmtfaG9vaykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosCi0gICAgICAgICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotCi0gIGlmICghZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jYW5fZ2Nfc2VjdGlvbnMKLSAgICAgIHx8IGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQXBwbHkgdHJhbnNpdGl2ZSBjbG9zdXJlIHRvIHRoZSB2dGFibGUgZW50cnkgdXNhZ2UgaW5mby4gICovCi0gIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgZWxmX2djX3Byb3BhZ2F0ZV92dGFibGVfZW50cmllc191c2VkLAotCQkJICAoUFRSKSAmb2spOwotICBpZiAoIW9rKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBLaWxsIHRoZSB2dGFibGUgcmVsb2NhdGlvbnMgdGhhdCB3ZXJlIG5vdCB1c2VkLiAgKi8KLSAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICBlbGZfZ2Nfc21hc2hfdW51c2VkX3Z0ZW50cnlfcmVsb2NzLAotCQkJICAoUFRSKSAmb2spOwotICBpZiAoIW9rKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHcm92ZWwgdGhyb3VnaCByZWxvY3MgdG8gZmluZCBvdXQgd2hvIHN0YXlzIC4uLiAgKi8KLQotICBnY19tYXJrX2hvb2sgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmdjX21hcmtfaG9vazsKLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKm87Ci0gICAgICBmb3IgKG8gPSBzdWItPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIGlmIChvLT5mbGFncyAmIFNFQ19LRUVQKQotICAJICAgIGlmICghZWxmX2djX21hcmsgKGluZm8sIG8sIGdjX21hcmtfaG9vaykpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogLi4uIGFuZCBtYXJrIFNFQ19FWENMVURFIGZvciB0aG9zZSB0aGF0IGdvLiAgKi8KLSAgaWYgKCFlbGZfZ2Nfc3dlZXAoaW5mbywgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5nY19zd2VlcF9ob29rKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBDYWxsZWQgZnJvbSBjaGVja19yZWxvY3MgdG8gcmVjb3JkIHRoZSBleGlzdGFuY2Ugb2YgYSBWVElOSEVSSVQgcmVsb2MuICAqLwotCi1ib29sZWFuCi1lbGZfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCBvZmZzZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc2VhcmNoLCAqY2hpbGQ7Ci0gIGJmZF9zaXplX3R5cGUgZXh0c3ltY291bnQ7Ci0KLSAgLyogVGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIHN5bXRhYiBoZWFkZXIgdGVsbHMgdXMgd2hlcmUgdGhlCi0gICAgIGV4dGVybmFsIHN5bWJvbHMgc3RhcnQuICBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBsb2NhbCBzeW1ib2xzIGF0Ci0gICAgIHRoaXMgcG9pbnQuICAqLwotICBleHRzeW1jb3VudCA9IGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIuc2hfc2l6ZS9zaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBleHRzeW1jb3VudCAtPSBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyLnNoX2luZm87Ci0KLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgZXh0c3ltY291bnQ7Ci0KLSAgLyogSHVudCBkb3duIHRoZSBjaGlsZCBzeW1ib2wsIHdoaWNoIGlzIGluIHRoaXMgc2VjdGlvbiBhdCB0aGUgc2FtZQotICAgICBvZmZzZXQgYXMgdGhlIHJlbG9jYXRpb24uICAqLwotICBmb3IgKHNlYXJjaCA9IHN5bV9oYXNoZXM7IHNlYXJjaCAhPSBzeW1faGFzaGVzX2VuZDsgKytzZWFyY2gpCi0gICAgewotICAgICAgaWYgKChjaGlsZCA9ICpzZWFyY2gpICE9IE5VTEwKLQkgICYmIChjaGlsZC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGNoaWxkLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgY2hpbGQtPnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWMKLQkgICYmIGNoaWxkLT5yb290LnUuZGVmLnZhbHVlID09IG9mZnNldCkKLQlnb3RvIHdpbjsKLSAgICB9Ci0KLSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiJXM6ICVzKyVsdTogTm8gc3ltYm9sIGZvdW5kIGZvciBJTkhFUklUIiwKLQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc2VjLT5uYW1lLAotCQkJICh1bnNpZ25lZCBsb25nKW9mZnNldCk7Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLQotd2luOgotICBpZiAoIWgpCi0gICAgewotICAgICAgLyogVGhpcyAqc2hvdWxkKiBvbmx5IGJlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLiAgSXQgY291bGQgcG90ZW50aWFsbHkKLQkgYmUgdGhhdCBzb21lb25lIGhhcyBkZWZpbmVkIGEgbm9uLWdsb2JhbCB2dGFibGUgdGhvdWdoLCB3aGljaAotCSB3b3VsZCBiZSBiYWQuICBJdCBpc24ndCB3b3J0aCBwYWdpbmcgaW4gdGhlIGxvY2FsIHN5bWJvbHMgdG8gYmUKLQkgc3VyZSB0aG91Z2g7IHRoYXQgY2FzZSBzaG91bGQgc2ltcGx5IGJlIGhhbmRsZWQgYnkgdGhlIGFzc2VtYmxlci4gICovCi0KLSAgICAgIGNoaWxkLT52dGFibGVfcGFyZW50ID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIC0xOwotICAgIH0KLSAgZWxzZQotICAgIGNoaWxkLT52dGFibGVfcGFyZW50ID0gaDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2FsbGVkIGZyb20gY2hlY2tfcmVsb2NzIHRvIHJlY29yZCB0aGUgZXhpc3RhbmNlIG9mIGEgVlRFTlRSWSByZWxvYy4gICovCi0KLWJvb2xlYW4KLWVsZl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCBhZGRlbmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotewotICBpZiAoYWRkZW5kID49IGgtPnZ0YWJsZV9lbnRyaWVzX3NpemUpCi0gICAgewotICAgICAgc2l6ZV90IHNpemUsIGJ5dGVzOwotICAgICAgYm9vbGVhbiAqcHRyID0gaC0+dnRhYmxlX2VudHJpZXNfdXNlZDsKLQotICAgICAgLyogV2hpbGUgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQsIHdlIGhhdmUgdG8gYmUgcHJlcGFyZWQgdG8gaGFuZGxlCi0JIGEgemVybyBzaXplLiAgKi8KLSAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0Jc2l6ZSA9IGFkZGVuZDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzaXplID0gaC0+c2l6ZTsKLQkgIGlmIChzaXplIDwgYWRkZW5kKQotCSAgICB7Ci0JICAgICAgLyogT29wcyEgIFdlJ3ZlIGdvdCBhIHJlZmVyZW5jZSBwYXN0IHRoZSBkZWZpbmVkIGVuZCBvZgotCQkgdGhlIHRhYmxlLiAgVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyAtLSBzaGFsbCB3ZSB3YXJuPyAgKi8KLQkgICAgICBzaXplID0gYWRkZW5kOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBBbGxvY2F0ZSBvbmUgZXh0cmEgZW50cnkgZm9yIHVzZSBhcyBhICJkb25lIiBmbGFnIGZvciB0aGUKLQkgY29uc29saWRhdGlvbiBwYXNzLiAgKi8KLSAgICAgIGJ5dGVzID0gKHNpemUgLyBGSUxFX0FMSUdOICsgMSkgKiBzaXplb2YoYm9vbGVhbik7Ci0KLSAgICAgIGlmIChwdHIpCi0JewotCSAgc2l6ZV90IG9sZGJ5dGVzOwotCi0JICBwdHIgPSByZWFsbG9jIChwdHItMSwgYnl0ZXMpOwotCSAgaWYgKHB0ciA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIG9sZGJ5dGVzID0gKGgtPnZ0YWJsZV9lbnRyaWVzX3NpemUvRklMRV9BTElHTiArIDEpICogc2l6ZW9mKGJvb2xlYW4pOwotCSAgbWVtc2V0IChwdHIgKyBvbGRieXRlcywgMCwgYnl0ZXMgLSBvbGRieXRlcyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHB0ciA9IGNhbGxvYyAoMSwgYnl0ZXMpOwotCSAgaWYgKHB0ciA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBBbmQgYXJyYW5nZSBmb3IgdGhhdCBkb25lIGZsYWcgdG8gYmUgYXQgaW5kZXggLTEuICAqLwotICAgICAgaC0+dnRhYmxlX2VudHJpZXNfdXNlZCA9IHB0cisxOwotICAgICAgaC0+dnRhYmxlX2VudHJpZXNfc2l6ZSA9IHNpemU7Ci0gICAgfQotICBoLT52dGFibGVfZW50cmllc191c2VkW2FkZGVuZCAvIEZJTEVfQUxJR05dID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQW5kIGFuIGFjY29tcGFueWluZyBiaXQgdG8gd29yayBvdXQgZmluYWwgZ290IGVudHJ5IG9mZnNldHMgb25jZQotICAgd2UncmUgZG9uZS4gIFNob3VsZCBiZSBjYWxsZWQgZnJvbSBmaW5hbF9saW5rLiAgKi8KLQotYm9vbGVhbgotZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICppOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBiZmRfdm1hIGdvdG9mZjsKLQotICAvKiBUaGUgR09UIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgLmdvdCBzZWN0aW9uLCBidXQgdGhlIEdPVCBoZWFkZXIgaXMKLSAgICAgcHV0IGludG8gdGhlIC5nb3QucGx0IHNlY3Rpb24sIGlmIHRoZSBiYWNrZW5kIHVzZXMgaXQuICAqLwotICBpZiAoYmVkLT53YW50X2dvdF9wbHQpCi0gICAgZ290b2ZmID0gMDsKLSAgZWxzZQotICAgIGdvdG9mZiA9IGJlZC0+Z290X2hlYWRlcl9zaXplOwotCi0gIC8qIERvIHRoZSBsb2NhbCAuZ290IGVudHJpZXMgZmlyc3QuICAqLwotICBmb3IgKGkgPSBpbmZvLT5pbnB1dF9iZmRzOyBpOyBpID0gaS0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3QgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoaSk7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGosIGxvY3N5bWNvdW50OwotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0KLSAgICAgIGlmICghbG9jYWxfZ290KQotCWNvbnRpbnVlOwotCi0gICAgICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaSktPnN5bXRhYl9oZHI7Ci0gICAgICBpZiAoZWxmX2JhZF9zeW10YWIgKGkpKQotCWxvY3N5bWNvdW50ID0gc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0gICAgICBlbHNlCi0JbG9jc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCi0gICAgICBmb3IgKGogPSAwOyBqIDwgbG9jc3ltY291bnQ7ICsraikKLQl7Ci0JICBpZiAobG9jYWxfZ290W2pdID4gMCkKLQkgICAgewotCSAgICAgIGxvY2FsX2dvdFtqXSA9IGdvdG9mZjsKLQkgICAgICBnb3RvZmYgKz0gQVJDSF9TSVpFIC8gODsKLQkgICAgfQotCSAgZWxzZQotCSAgICBsb2NhbF9nb3Rbal0gPSAoYmZkX3ZtYSkgLTE7Ci0JfQotICAgIH0KLQotICAvKiBUaGVuIHRoZSBnbG9iYWwgLmdvdCBhbmQgLnBsdCBlbnRyaWVzLiAgKi8KLSAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICBlbGZfZ2NfYWxsb2NhdGVfZ290X29mZnNldHMsCi0JCQkgIChQVFIpICZnb3RvZmYpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgbmVlZCBhIHNwZWNpYWwgdG9wLWxldmVsIGxpbmsgcm91dGluZSB0byBjb252ZXJ0IGdvdCByZWZlcmVuY2UgY291bnRzCi0gICB0byByZWFsIGdvdCBvZmZzZXRzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19hbGxvY2F0ZV9nb3Rfb2Zmc2V0cyAoaCwgb2ZmYXJnKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIG9mZmFyZzsKLXsKLSAgYmZkX3ZtYSAqb2ZmID0gKGJmZF92bWEgKikgb2ZmYXJnOwotCi0gIGlmIChoLT5nb3QucmVmY291bnQgPiAwKQotICAgIHsKLSAgICAgIGgtPmdvdC5vZmZzZXQgPSBvZmZbMF07Ci0gICAgICBvZmZbMF0gKz0gQVJDSF9TSVpFIC8gODsKLSAgICB9Ci0gIGVsc2UKLSAgICBoLT5nb3Qub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYW55IGZvbGsgbmVlZCBubyBtb3JlIGluIHRoZSB3YXkgb2YgZmluYWwgbGluayB0aGFuIHRoaXMsIG9uY2UKLSAgIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRpbmcgaXMgZW5hYmxlZC4gICovCi0KLWJvb2xlYW4KLWVsZl9nY19jb21tb25fZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKCFlbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSW52b2tlIHRoZSByZWd1bGFyIEVMRiBiYWNrZW5kIGxpbmtlciB0byBkbyBhbGwgdGhlIHdvcmsuICAqLwotICByZXR1cm4gZWxmX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB0aG91Z2ggZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSB0byBzdG9yZQotICAgYWxsIGhhc2ggdmFsdWUgb2YgdGhlIGV4cG9ydGVkIHN5bWJvbHMgaW4gYW4gYXJyYXkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2NvbGxlY3RfaGFzaF9jb2RlcyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICB1bnNpZ25lZCBsb25nICoqdmFsdWVwID0gKHVuc2lnbmVkIGxvbmcgKiopIGRhdGE7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGxvbmcgaGE7Ci0gIGNoYXIgKmFsYyA9IE5VTEw7Ci0KLSAgLyogSWdub3JlIGluZGlyZWN0IHN5bWJvbHMuICBUaGVzZSBhcmUgYWRkZWQgYnkgdGhlIHZlcnNpb25pbmcgY29kZS4gICovCi0gIGlmIChoLT5keW5pbmR4ID09IC0xKQotICAgIHJldHVybiB0cnVlOwotCi0gIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICBwID0gc3RyY2hyIChuYW1lLCBFTEZfVkVSX0NIUik7Ci0gIGlmIChwICE9IE5VTEwpCi0gICAgewotICAgICAgYWxjID0gYmZkX21hbGxvYyAocCAtIG5hbWUgKyAxKTsKLSAgICAgIG1lbWNweSAoYWxjLCBuYW1lLCBwIC0gbmFtZSk7Ci0gICAgICBhbGNbcCAtIG5hbWVdID0gJ1wwJzsKLSAgICAgIG5hbWUgPSBhbGM7Ci0gICAgfQotCi0gIC8qIENvbXB1dGUgdGhlIGhhc2ggdmFsdWUuICAqLwotICBoYSA9IGJmZF9lbGZfaGFzaCAobmFtZSk7Ci0KLSAgLyogU3RvcmUgdGhlIGZvdW5kIGhhc2ggdmFsdWUgaW4gdGhlIGFycmF5IGdpdmVuIGFzIHRoZSBhcmd1bWVudC4gICovCi0gICooKnZhbHVlcCkrKyA9IGhhOwotCi0gIC8qIEFuZCBzdG9yZSBpdCBpbiB0aGUgc3RydWN0IHNvIHRoYXQgd2UgY2FuIHB1dCBpdCBpbiB0aGUgaGFzaCB0YWJsZQotICAgICBsYXRlci4gICovCi0gIGgtPmVsZl9oYXNoX3ZhbHVlID0gaGE7Ci0KLSAgaWYgKGFsYyAhPSBOVUxMKQotICAgIGZyZWUgKGFsYyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvZWxmeHgtdGFyZ2V0LmggYi9iZmQvZWxmeHgtdGFyZ2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhY2FiZDEuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZnh4LXRhcmdldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTM2ICswLDAgQEAKLS8qIFRhcmdldCBkZWZpbml0aW9ucyBmb3IgTk4tYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgZXZlcnl0aGluZyB0aGF0IEJGRCBrbm93cyBhYm91dCBhIHRhcmdldC4KLSAgIEl0IGluY2x1ZGVzIHRoaW5ncyBsaWtlIGl0cyBieXRlIG9yZGVyLCBuYW1lLCB3aGF0IHJvdXRpbmVzIHRvIGNhbGwKLSAgIHRvIGRvIHZhcmlvdXMgb3BlcmF0aW9ucywgZXRjLiAgRXZlcnkgQkZEIHBvaW50cyB0byBhIHRhcmdldCBzdHJ1Y3R1cmUKLSAgIHdpdGggaXRzICJ4dmVjIiBtZW1iZXIuCi0KLSAgIFRoZXJlIGFyZSB0d28gc3VjaCBzdHJ1Y3R1cmVzIGhlcmU6ICBvbmUgZm9yIGJpZy1lbmRpYW4gbWFjaGluZXMgYW5kCi0gICBvbmUgZm9yIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMuICAgKi8KLQotI2RlZmluZQliZmRfZWxmTk5fY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9lbGZfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2lmbmRlZiBiZmRfZWxmTk5fZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9zZWN0aW9uX2NvbnRlbnRzIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmCi0KLSNkZWZpbmUgYmZkX2VsZk5OX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBfYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSNkZWZpbmUgYmZkX2VsZk5OX2Nhbm9uaWNhbGl6ZV9yZWxvYwlfYmZkX2VsZl9jYW5vbmljYWxpemVfcmVsb2MKLSNpZm5kZWYgYmZkX2VsZk5OX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIGJmZF9lbGZOTl9maW5kX25lYXJlc3RfbGluZQlfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZQotI2VuZGlmCi0jZGVmaW5lIGJmZF9lbGZOTl9yZWFkX21pbmlzeW1ib2xzCV9iZmRfZWxmX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgYmZkX2VsZk5OX21pbmlzeW1ib2xfdG9fc3ltYm9sCV9iZmRfZWxmX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9lbGZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfbGluZW5vCQlfYmZkX2VsZl9nZXRfbGluZW5vCi0jaWZuZGVmIGJmZF9lbGZOTl9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9yZWxvY191cHBlcl9ib3VuZCBfYmZkX2VsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLSNlbmRpZgotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X3N5bWJvbF9pbmZvCV9iZmRfZWxmX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X3N5bXRhYgkJX2JmZF9lbGZfZ2V0X3N5bXRhYgotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX2VsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jaWYgMCAvKiBkb25lIGluIGVsZi1iZmQuaCAqLwotI2RlZmluZSBiZmRfZWxmTk5fbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wKLSNlbmRpZgotI2RlZmluZSBiZmRfZWxmTk5fbWFrZV9lbXB0eV9zeW1ib2wJX2JmZF9lbGZfbWFrZV9lbXB0eV9zeW1ib2wKLSNkZWZpbmUgYmZkX2VsZk5OX25ld19zZWN0aW9uX2hvb2sJX2JmZF9lbGZfbmV3X3NlY3Rpb25faG9vawotI2RlZmluZSBiZmRfZWxmTk5fc2V0X2FyY2hfbWFjaAkJX2JmZF9lbGZfc2V0X2FyY2hfbWFjaAotI2lmbmRlZiBiZmRfZWxmTk5fc2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZk5OX3NldF9zZWN0aW9uX2NvbnRlbnRzCV9iZmRfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLSNkZWZpbmUgYmZkX2VsZk5OX3NpemVvZl9oZWFkZXJzCV9iZmRfZWxmX3NpemVvZl9oZWFkZXJzCi0jZGVmaW5lIGJmZF9lbGZOTl93cml0ZV9vYmplY3RfY29udGVudHMgX2JmZF9lbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGZOTl93cml0ZV9jb3JlZmlsZV9jb250ZW50cyBfYmZkX2VsZl93cml0ZV9jb3JlZmlsZV9jb250ZW50cwotCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNpZm5kZWYgZWxmX2JhY2tlbmRfZ290X3N5bWJvbF9vZmZzZXQKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X3N5bWJvbF9vZmZzZXQgKGJmZF92bWEpIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0IDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5IDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZCAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfcGx0X2FsaWdubWVudAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50IDIKLSNlbmRpZgotCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfZGVidWdfaW5mb19zdGFydAliZmRfdm9pZAotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2RlYnVnX2luZm9fZW5kCWJmZF92b2lkCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCShQUk9UTyh2b2lkLCgqKSwoYmZkKiwgc3RydWN0IHNlYyAqKSkpIGJmZF92b2lkCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCU5VTEwKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJTlVMTAotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9nY19zZWN0aW9ucyBfYmZkX2VsZk5OX2djX3NlY3Rpb25zCi0jZW5kaWYKLQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX21ha2VfZGVidWdfc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICosIHZvaWQgKiwgdW5zaWduZWQgbG9uZykpKSBiZmRfbnVsbHZvaWRwdHIpCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgXAotICBfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgXAotICBfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKLSNlbmRpZgotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFwKLSAgX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKLSNlbmRpZgotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpKSBiZmRfdHJ1ZSkKLSNlbmRpZgotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgXAotICBfYmZkX2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotI2RlZmluZSBiZmRfZWxmTk5fY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgXAotICBfYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotI2VuZGlmCi0KLSNpZmRlZiBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2VuZGlmCi0jZWxzZSAvKiAhIGRlZmluZWQgKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pICovCi0vKiBJZiBubyBiYWNrZW5kIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZSwgdXNlIHRoZSBnZW5lcmljIGxpbmtlci4gICovCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2xpbmtfYWRkX3N5bWJvbHMJX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNlbmRpZgotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2ZpbmFsX2xpbmsKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9maW5hbF9saW5rCV9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZW5kaWYKLSNlbmRpZiAvKiAhIGRlZmluZWQgKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pICovCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfbGlua19zcGxpdF9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl9hcmNoaXZlX3AKLSNkZWZpbmUgYmZkX2VsZk5OX2FyY2hpdmVfcCBiZmRfZ2VuZXJpY19hcmNoaXZlX3AKLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGZOTl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cwotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX21rb2JqZWN0Ci0jZGVmaW5lIGJmZF9lbGZOTl9ta29iamVjdCBiZmRfZWxmX21rb2JqZWN0Ci0jZW5kaWYKLQotI2lmbmRlZiBiZmRfZWxmTk5fbWtjb3JlZmlsZQotI2RlZmluZSBiZmRfZWxmTk5fbWtjb3JlZmlsZSBiZmRfZWxmX21rY29yZWZpbGUKLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl9ta2FyY2hpdmUKLSNkZWZpbmUgYmZkX2VsZk5OX21rYXJjaGl2ZSBfYmZkX2dlbmVyaWNfbWthcmNoaXZlCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhcgotI2RlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciAwCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byAwCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfaW5mb190b19ob3d0b19yZWwKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsIDAKLSNlbmRpZgotCi0jaWZuZGVmIEVMRl9NQVhQQUdFU0laRQotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUgMQotI2VuZGlmCi0KLSNpZm5kZWYgZWxmX2JhY2tlbmRfY29sbGVjdAotI2RlZmluZSBlbGZfYmFja2VuZF9jb2xsZWN0IGZhbHNlCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfdHlwZV9jaGFuZ2Vfb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfdHlwZV9jaGFuZ2Vfb2sgZmFsc2UKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbAkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfb2JqZWN0X3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZQotI2RlZmluZSBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24JMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbAkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcAkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcAotI2RlZmluZSBlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplCTAKLSNlbmRpZgotCi0jaWZuZGVmIEVMRl9NQUNISU5FX0FMVDEKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQUxUMSAwCi0jZW5kaWYKLQotI2lmbmRlZiBFTEZfTUFDSElORV9BTFQyCi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDIgMAotI2VuZGlmCi0KLSNpZm5kZWYgZWxmX2JhY2tlbmRfc2l6ZV9pbmZvCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfaW5mbyBfYmZkX2VsZk5OX3NpemVfaW5mbwotI2VuZGlmCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZWxmX3NpemVfaW5mbyBfYmZkX2VsZk5OX3NpemVfaW5mbzsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhIGVsZk5OX2JlZCA9Ci17Ci0jaWZkZWYgVVNFX1JFTAotICAwLAkJCQkvKiB1c2VfcmVsYV9wICovCi0jZWxzZQotICAxLAkJCQkvKiB1c2VfcmVsYV9wICovCi0jZW5kaWYKLSAgRUxGX0FSQ0gsCQkJLyogYXJjaCAqLwotICBFTEZfTUFDSElORV9DT0RFLAkJLyogZWxmX21hY2hpbmVfY29kZSAqLwotICBFTEZfTUFYUEFHRVNJWkUsCQkvKiBtYXhwYWdlc2l6ZSAqLwotICBlbGZfYmFja2VuZF9jb2xsZWN0LAotICBlbGZfYmFja2VuZF90eXBlX2NoYW5nZV9vaywKLSAgZWxmX2luZm9fdG9faG93dG8sCi0gIGVsZl9pbmZvX3RvX2hvd3RvX3JlbCwKLSAgZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCwKLSAgZWxmX2JhY2tlbmRfb2JqZWN0X3AsCi0gIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nLAotICBlbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZywKLSAgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLAotICBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcsCi0gIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyLAotICBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zLAotICBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24sCi0gIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vaywKLSAgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2ssCi0gIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLAotICBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MsCi0gIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMsCi0gIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucywKLSAgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiwKLSAgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sLAotICBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucywKLSAgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZywKLSAgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZywKLSAgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMsCi0gIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCwKLSAgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rLAotICBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rLAotICBlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwLAotICBFTEZfTUFDSElORV9BTFQxLAotICBFTEZfTUFDSElORV9BTFQyLAotICAmZWxmX2JhY2tlbmRfc2l6ZV9pbmZvLAotICBlbGZfYmFja2VuZF9nb3Rfc3ltYm9sX29mZnNldCwKLSAgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplLAotICBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUsCi0gIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCwKLSAgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5LAotICBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0sCi0gIGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkLAotICBlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50LAotICBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMKLX07Ci0KLSNpZmRlZiBUQVJHRVRfQklHX1NZTQotY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfQklHX1NZTSA9Ci17Ci0gIC8qIG5hbWU6IGlkZW50aWZ5IGtpbmQgb2YgdGFyZ2V0ICovCi0gIFRBUkdFVF9CSUdfTkFNRSwKLQotICAvKiBmbGF2b3VyOiBnZW5lcmFsIGluZGljYXRpb24gYWJvdXQgZmlsZSAqLwotICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAotCi0gIC8qIGJ5dGVvcmRlcjogZGF0YSBpcyBiaWcgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fQklHLAotCi0gIC8qIGhlYWRlcl9ieXRlb3JkZXI6IGhlYWRlciBpcyBhbHNvIGJpZyBlbmRpYW4gKi8KLSAgQkZEX0VORElBTl9CSUcsCi0KLSAgLyogb2JqZWN0X2ZsYWdzOiBtYXNrIG9mIGFsbCBmaWxlIGZsYWdzICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwKLSAgIERZTkFNSUMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgLyogc2VjdGlvbl9mbGFnczogbWFzayBvZiBhbGwgc2VjdGlvbiBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX1JFQURPTkxZIHwKLSAgIFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfREVCVUdHSU5HIHwgU0VDX0VYQ0xVREUgfCBTRUNfU09SVF9FTlRSSUVTKSwKLQotICAgLyogbGVhZGluZ19zeW1ib2xfY2hhcjogaXMgdGhlIGZpcnN0IGNoYXIgb2YgYSB1c2VyIHN5bWJvbAotICAgICAgcHJlZGljdGFibGUsIGFuZCBpZiBzbyB3aGF0IGlzIGl0ICovCi0gIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyLAotCi0gIC8qIGFyX3BhZF9jaGFyOiBwYWQgY2hhcmFjdGVyIGZvciBmaWxlbmFtZXMgd2l0aGluIGFuIGFyY2hpdmUgaGVhZGVyCi0gICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBFTEYsIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYwotICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kL29yIG9zIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlICovCi0gICcvJywKLQotICAvKiBhcl9tYXhfbmFtZWxlbjogbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggRUxGLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlLiAgVGhpcyB2YWx1ZSBpcwotICAgICBhIFdBRyAod2lsZCBhKiogZ3Vlc3MpICovCi0gIDE0LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGRhdGEgc2VjdGlvbnMgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0KLSAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZmlsZSBoZWFkZXJzICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAotCi0gIC8qIGJmZF9jaGVja19mb3JtYXQ6IGNoZWNrIHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHJlYWQgKi8KLSAgeyBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgYmZkX2VsZk5OX29iamVjdF9wLAkJLyogYXNzZW1ibGVyL2xpbmtlciBvdXRwdXQgKG9iamVjdCBmaWxlKSAqLwotICAgIGJmZF9lbGZOTl9hcmNoaXZlX3AsCS8qIGFuIGFyY2hpdmUgKi8KLSAgICBiZmRfZWxmTk5fY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgfSwKLQotICAvKiBiZmRfc2V0X2Zvcm1hdDogc2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgYmZkX2VsZk5OX21rb2JqZWN0LAotICAgIGJmZF9lbGZOTl9ta2FyY2hpdmUsCi0gICAgYmZkX2VsZk5OX21rY29yZWZpbGUKLSAgfSwKLQotICAvKiBiZmRfd3JpdGVfY29udGVudHM6IHdyaXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBpbnRvIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIGJmZF9lbGZOTl93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2VsZk5OX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzLAotICB9LAotCi0gICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGJmZF9lbGZOTiksCi0jaWZkZWYgYmZkX2VsZk5OX2FyY2hpdmVfZnVuY3Rpb25zCi0gICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChiZmRfZWxmTk5fYXJjaGl2ZSksCi0jZWxzZQotICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotI2VuZGlmCi0gICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoYmZkX2VsZk5OKSwKLQotICAvKiBiYWNrZW5kX2RhdGE6ICovCi0gIChQVFIpICZlbGZOTl9iZWQsCi19OwotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfTElUVExFX1NZTQotY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfTElUVExFX1NZTSA9Ci17Ci0gIC8qIG5hbWU6IGlkZW50aWZ5IGtpbmQgb2YgdGFyZ2V0ICovCi0gIFRBUkdFVF9MSVRUTEVfTkFNRSwKLQotICAvKiBmbGF2b3VyOiBnZW5lcmFsIGluZGljYXRpb24gYWJvdXQgZmlsZSAqLwotICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAotCi0gIC8qIGJ5dGVvcmRlcjogZGF0YSBpcyBsaXR0bGUgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAotCi0gIC8qIGhlYWRlcl9ieXRlb3JkZXI6IGhlYWRlciBpcyBhbHNvIGxpdHRsZSBlbmRpYW4gKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCi0KLSAgLyogb2JqZWN0X2ZsYWdzOiBtYXNrIG9mIGFsbCBmaWxlIGZsYWdzICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwKLSAgIERZTkFNSUMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgLyogc2VjdGlvbl9mbGFnczogbWFzayBvZiBhbGwgc2VjdGlvbiBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX1JFQURPTkxZIHwKLSAgIFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfREVCVUdHSU5HIHwgU0VDX0VYQ0xVREUgfCBTRUNfU09SVF9FTlRSSUVTKSwKLQotICAgLyogbGVhZGluZ19zeW1ib2xfY2hhcjogaXMgdGhlIGZpcnN0IGNoYXIgb2YgYSB1c2VyIHN5bWJvbAotICAgICAgcHJlZGljdGFibGUsIGFuZCBpZiBzbyB3aGF0IGlzIGl0ICovCi0gIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyLAotCi0gIC8qIGFyX3BhZF9jaGFyOiBwYWQgY2hhcmFjdGVyIGZvciBmaWxlbmFtZXMgd2l0aGluIGFuIGFyY2hpdmUgaGVhZGVyCi0gICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBFTEYsIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYwotICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kL29yIG9zIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlICovCi0gICcvJywKLQotICAvKiBhcl9tYXhfbmFtZWxlbjogbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggRUxGLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlLiAgVGhpcyB2YWx1ZSBpcwotICAgICBhIFdBRyAod2lsZCBhKiogZ3Vlc3MpICovCi0gIDE0LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGRhdGEgc2VjdGlvbnMgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCi0KLSAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZmlsZSBoZWFkZXJzICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotCi0gIC8qIGJmZF9jaGVja19mb3JtYXQ6IGNoZWNrIHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHJlYWQgKi8KLSAgeyBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgYmZkX2VsZk5OX29iamVjdF9wLAkJLyogYXNzZW1ibGVyL2xpbmtlciBvdXRwdXQgKG9iamVjdCBmaWxlKSAqLwotICAgIGJmZF9lbGZOTl9hcmNoaXZlX3AsCS8qIGFuIGFyY2hpdmUgKi8KLSAgICBiZmRfZWxmTk5fY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgfSwKLQotICAvKiBiZmRfc2V0X2Zvcm1hdDogc2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgYmZkX2VsZk5OX21rb2JqZWN0LAotICAgIGJmZF9lbGZOTl9ta2FyY2hpdmUsCi0gICAgYmZkX2VsZk5OX21rY29yZWZpbGUKLSAgfSwKLQotICAvKiBiZmRfd3JpdGVfY29udGVudHM6IHdyaXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBpbnRvIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIGJmZF9lbGZOTl93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2VsZk5OX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzLAotICB9LAotCi0gICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGJmZF9lbGZOTiksCi0jaWZkZWYgYmZkX2VsZk5OX2FyY2hpdmVfZnVuY3Rpb25zCi0gICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChiZmRfZWxmTk5fYXJjaGl2ZSksCi0jZWxzZQotICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotI2VuZGlmCi0gICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoYmZkX2VsZk5OKSwKLQotICAvKiBiYWNrZW5kX2RhdGE6ICovCi0gIChQVFIpICZlbGZOTl9iZWQsCi19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvZXBvYy1wZS1hcm0uYyBiL2JmZC9lcG9jLXBlLWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTg5YTBiLi4wMDAwMDAwCi0tLSBhL2JmZC9lcG9jLXBlLWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBBUk0gRVBPQyBQRSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgICAgMAotI2RlZmluZSBVU0VSX0xBQkVMX1BSRUZJWCAgICAiIgotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgIGFybV9lcG9jX3BlX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgImVwb2MtcGUtYXJtLWxpdHRsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgYXJtX2Vwb2NfcGVfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAiZXBvYy1wZS1hcm0tYmlnIgotCi0KLSNpbmNsdWRlICJwZS1hcm0uYyIKLQpkaWZmIC0tZ2l0IGEvYmZkL2Vwb2MtcGVpLWFybS5jIGIvYmZkL2Vwb2MtcGVpLWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjI1NDhkLi4wMDAwMDAwCi0tLSBhL2JmZC9lcG9jLXBlaS1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQVJNIEVQT0MgUEUgSU1BR0UgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgICAgMAotI2RlZmluZSBVU0VSX0xBQkVMX1BSRUZJWCAgICAiIgotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgIGFybV9lcG9jX3BlaV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICJlcG9jLXBlaS1hcm0tbGl0dGxlIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICBhcm1fZXBvY19wZWlfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAiZXBvYy1wZWktYXJtLWJpZyIKLQotI2luY2x1ZGUgInBlaS1hcm0uYyIKLQpkaWZmIC0tZ2l0IGEvYmZkL2Zvcm1hdC5jIGIvYmZkL2Zvcm1hdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWYxZjljLi4wMDAwMDAwCi0tLSBhL2JmZC9mb3JtYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKiBHZW5lcmljIEJGRCBzdXBwb3J0IGZvciBmaWxlIGZvcm1hdHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQlGaWxlIGZvcm1hdHMKLQotCUEgZm9ybWF0IGlzIGEgQkZEIGNvbmNlcHQgb2YgaGlnaCBsZXZlbCBmaWxlIGNvbnRlbnRzIHR5cGUuIFRoZQotCWZvcm1hdHMgc3VwcG9ydGVkIGJ5IEJGRCBhcmU6IAotCi0JbyA8PGJmZF9vYmplY3Q+PgotCi0JVGhlIEJGRCBtYXkgY29udGFpbiBkYXRhLCBzeW1ib2xzLCByZWxvY2F0aW9ucyBhbmQgZGVidWcgaW5mby4KLQotCW8gPDxiZmRfYXJjaGl2ZT4+Ci0KLQlUaGUgQkZEIGNvbnRhaW5zIG90aGVyIEJGRHMgYW5kIGFuIG9wdGlvbmFsIGluZGV4LgotCi0JbyA8PGJmZF9jb3JlPj4KLQotCVRoZSBCRkQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiBhbiBleGVjdXRhYmxlIGNvcmUgZHVtcC4KLQotCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIElNUE9SVCBmcm9tIHRhcmdldHMuYy4gICovCi1leHRlcm4gY29uc3Qgc2l6ZV90IF9iZmRfdGFyZ2V0X3ZlY3Rvcl9lbnRyaWVzOwotCi0vKgotRlVOQ1RJT04KLQliZmRfY2hlY2tfZm9ybWF0Ci0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY2hlY2tfZm9ybWF0KGJmZCAqYWJmZCwgYmZkX2Zvcm1hdCBmb3JtYXQpOwotCi1ERVNDUklQVElPTgotCVZlcmlmeSBpZiB0aGUgZmlsZSBhdHRhY2hlZCB0byB0aGUgQkZEIEB2YXJ7YWJmZH0gaXMgY29tcGF0aWJsZQotCXdpdGggdGhlIGZvcm1hdCBAdmFye2Zvcm1hdH0gKGkuZS4sIG9uZSBvZiA8PGJmZF9vYmplY3Q+PiwKLQk8PGJmZF9hcmNoaXZlPj4gb3IgPDxiZmRfY29yZT4+KS4KLQotCUlmIHRoZSBCRkQgaGFzIGJlZW4gc2V0IHRvIGEgc3BlY2lmaWMgdGFyZ2V0IGJlZm9yZSB0aGUKLQljYWxsLCBvbmx5IHRoZSBuYW1lZCB0YXJnZXQgYW5kIGZvcm1hdCBjb21iaW5hdGlvbiBpcwotCWNoZWNrZWQuIElmIHRoZSB0YXJnZXQgaGFzIG5vdCBiZWVuIHNldCwgb3IgaGFzIGJlZW4gc2V0IHRvCi0JPDxkZWZhdWx0Pj4sIHRoZW4gYWxsIHRoZSBrbm93biB0YXJnZXQgYmFja2VuZHMgaXMKLQlpbnRlcnJvZ2F0ZWQgdG8gZGV0ZXJtaW5lIGEgbWF0Y2guICBJZiB0aGUgZGVmYXVsdCB0YXJnZXQKLQltYXRjaGVzLCBpdCBpcyB1c2VkLiAgSWYgbm90LCBleGFjdGx5IG9uZSB0YXJnZXQgbXVzdCByZWNvZ25pemUKLQl0aGUgZmlsZSwgb3IgYW4gZXJyb3IgcmVzdWx0cy4KLQotCVRoZSBmdW5jdGlvbiByZXR1cm5zIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSA8PGZhbHNlPj4KLQl3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzOiAgCi0KLQlvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLQotCWlmIDw8Zm9ybWF0Pj4gaXMgbm90IG9uZSBvZiA8PGJmZF9vYmplY3Q+PiwgPDxiZmRfYXJjaGl2ZT4+IG9yCi0JPDxiZmRfY29yZT4+LgotCi0JbyA8PGJmZF9lcnJvcl9zeXN0ZW1fY2FsbD4+IC0KLQlpZiBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyBhIHJlYWQgLSBldmVuIHNvbWUgZmlsZSBtaXNtYXRjaGVzCi0JY2FuIGNhdXNlIGJmZF9lcnJvcl9zeXN0ZW1fY2FsbHMuCi0KLQlvIDw8ZmlsZV9ub3RfcmVjb2duaXNlZD4+IC0KLQlub25lIG9mIHRoZSBiYWNrZW5kcyByZWNvZ25pc2VkIHRoZSBmaWxlIGZvcm1hdC4KLQotCW8gPDxiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkPj4gLQotCW1vcmUgdGhhbiBvbmUgYmFja2VuZCByZWNvZ25pc2VkIHRoZSBmaWxlIGZvcm1hdC4KLSovCi0KLWJvb2xlYW4KLWJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGZvcm1hdCkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfZm9ybWF0IGZvcm1hdDsKLXsKLSAgcmV0dXJuIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgZm9ybWF0LCBOVUxMKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMoYmZkICphYmZkLCBiZmRfZm9ybWF0IGZvcm1hdCwgY2hhciAqKiptYXRjaGluZyk7Ci0KLURFU0NSSVBUSU9OCi0JTGlrZSA8PGJmZF9jaGVja19mb3JtYXQ+PiwgZXhjZXB0IHdoZW4gaXQgcmV0dXJucyBmYWxzZSB3aXRoCi0JPDxiZmRfZXJybm8+PiBzZXQgdG8gPDxiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkPj4uICBJbiB0aGF0Ci0JY2FzZSwgaWYgQHZhcnttYXRjaGluZ30gaXMgbm90IE5VTEwsIGl0IHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKLQlhIE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUgZm9ybWF0cyB0aGF0IG1hdGNoZWQsCi0JYWxsb2NhdGVkIHdpdGggPDxtYWxsb2M+Pi4KLQlUaGVuIHRoZSB1c2VyIG1heSBjaG9vc2UgYSBmb3JtYXQgYW5kIHRyeSBhZ2Fpbi4KLQotCVdoZW4gZG9uZSB3aXRoIHRoZSBsaXN0IHRoYXQgQHZhcnttYXRjaGluZ30gcG9pbnRzIHRvLCB0aGUgY2FsbGVyCi0Jc2hvdWxkIGZyZWUgaXQuICAKLSovCi0KLWJvb2xlYW4KLWJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgZm9ybWF0LCBtYXRjaGluZykKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfZm9ybWF0IGZvcm1hdDsKLSAgICAgY2hhciAqKiptYXRjaGluZzsKLXsKLSAgZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmluYXJ5X3ZlYzsKLSAgY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0ICp0YXJnZXQsICpzYXZlX3RhcmcsICpyaWdodF90YXJnOwotICBjaGFyICoqbWF0Y2hpbmdfdmVjdG9yID0gTlVMTDsKLSAgaW50IG1hdGNoX2NvdW50OwotCi0gIGlmICghYmZkX3JlYWRfcCAoYWJmZCkgfHwKLSAgICAgICgoaW50KShhYmZkLT5mb3JtYXQpIDwgKGludCliZmRfdW5rbm93bikgfHwKLSAgICAgICgoaW50KShhYmZkLT5mb3JtYXQpID49IChpbnQpYmZkX3R5cGVfZW5kKSkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfdW5rbm93bikKLSAgICByZXR1cm4gKGFiZmQtPmZvcm1hdCA9PSBmb3JtYXQpPyB0cnVlOiBmYWxzZTsKLQotCi0gIC8qIFNpbmNlIHRoZSB0YXJnZXQgdHlwZSB3YXMgZGVmYXVsdGVkLCBjaGVjayB0aGVtIAotICAgICBhbGwgaW4gdGhlIGhvcGUgdGhhdCBvbmUgd2lsbCBiZSB1bmlxdWVseSByZWNvZ25pemVkLiAgKi8KLQotICBzYXZlX3RhcmcgPSBhYmZkLT54dmVjOwotICBtYXRjaF9jb3VudCA9IDA7Ci0gIGlmIChtYXRjaGluZykKLSAgICB7Ci0gICAgICBtYXRjaGluZ192ZWN0b3IgPQotCShjaGFyICoqKSBiZmRfbWFsbG9jIChzaXplb2YgKGNoYXIgKikgKgotCQkJICAgICAgKF9iZmRfdGFyZ2V0X3ZlY3Rvcl9lbnRyaWVzICsgMSkpOwotICAgICAgaWYgKCFtYXRjaGluZ192ZWN0b3IpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbWF0Y2hpbmdfdmVjdG9yWzBdID0gTlVMTDsKLSAgICAgICptYXRjaGluZyA9IG1hdGNoaW5nX3ZlY3RvcjsKLSAgICB9Ci0gIHJpZ2h0X3RhcmcgPSAwOwotCi0KLSAgLyogcHJlc3VtZSB0aGUgYW5zd2VyIGlzIHllcyAqLwotICBhYmZkLT5mb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgLyogSWYgdGhlIHRhcmdldCB0eXBlIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZCwganVzdCBjaGVjayB0aGF0IHRhcmdldC4gICovCi0KLSAgaWYgKCFhYmZkLT50YXJnZXRfZGVmYXVsdGVkKSB7Ci0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpMCwgU0VFS19TRVQpICE9IDApCS8qIHJld2luZCEgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByaWdodF90YXJnID0gQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX2NoZWNrX2Zvcm1hdCwgKGFiZmQpKTsKLSAgICBpZiAocmlnaHRfdGFyZykgewotICAgICAgYWJmZC0+eHZlYyA9IHJpZ2h0X3Rhcmc7CQkvKiBTZXQgdGhlIHRhcmdldCBhcyByZXR1cm5lZCAqLwotICAgICAgaWYgKG1hdGNoaW5nKQotCWZyZWUgKG1hdGNoaW5nX3ZlY3Rvcik7Ci0gICAgICByZXR1cm4gdHJ1ZTsJCQkvKiBGaWxlIHBvc2l0aW9uIGhhcyBtb3ZlZCwgQlRXICovCi0gICAgfQotCi0gICAgLyogRm9yIGEgbG9uZyB0aW1lIHRoZSBjb2RlIGhhcyBkcm9wcGVkIHRocm91Z2ggdG8gY2hlY2sgYWxsCi0gICAgICAgdGFyZ2V0cyBpZiB0aGUgc3BlY2lmaWVkIHRhcmdldCB3YXMgd3JvbmcuICBJIGRvbid0IGtub3cgd2h5LAotICAgICAgIGFuZCBJJ20gcmVsdWN0YW50IHRvIGNoYW5nZSBpdC4gIEhvd2V2ZXIsIGluIHRoZSBjYXNlIG9mIGFuCi0gICAgICAgYXJjaGl2ZSwgaXQgY2FuIGNhdXNlIHByb2JsZW1zLiAgSWYgdGhlIHNwZWNpZmllZCB0YXJnZXQgZG9lcwotICAgICAgIG5vdCBwZXJtaXQgYXJjaGl2ZXMgKGUuZy4sIHRoZSBiaW5hcnkgdGFyZ2V0KSwgdGhlbiB3ZSBzaG91bGQKLSAgICAgICBub3QgYWxsb3cgc29tZSBvdGhlciB0YXJnZXQgdG8gcmVjb2duaXplIGl0IGFzIGFuIGFyY2hpdmUsIGJ1dAotICAgICAgIHNob3VsZCBpbnN0ZWFkIGFsbG93IHRoZSBzcGVjaWZpZWQgdGFyZ2V0IHRvIHJlY29nbml6ZSBpdCBhcyBhbgotICAgICAgIG9iamVjdC4gIFdoZW4gSSBmaXJzdCBtYWRlIHRoaXMgY2hhbmdlLCBpdCBicm9rZSB0aGUgUEUgdGFyZ2V0LAotICAgICAgIGJlY2F1c2UgdGhlIHNwZWNpZmllZCBwZWktaTM4NiB0YXJnZXQgZGlkIG5vdCByZWNvZ25pemUgdGhlCi0gICAgICAgYWN0dWFsIHBlLWkzODYgYXJjaGl2ZS4gIFNpbmNlIHRoZXJlIG1heSBiZSBvdGhlciBwcm9ibGVtcyBvZgotICAgICAgIHRoaXMgc29ydCwgSSBjaGFuZ2VkIHRoaXMgdGVzdCB0byBjaGVjayBvbmx5IGZvciB0aGUgYmluYXJ5Ci0gICAgICAgdGFyZ2V0LiAgKi8KLQotICAgIGlmIChmb3JtYXQgPT0gYmZkX2FyY2hpdmUgJiYgc2F2ZV90YXJnID09ICZiaW5hcnlfdmVjKQotICAgICAgewotCWFiZmQtPnh2ZWMgPSBzYXZlX3Rhcmc7Ci0JYWJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247Ci0JaWYgKG1hdGNoaW5nKQotCSAgZnJlZSAobWF0Y2hpbmdfdmVjdG9yKTsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV9ub3RfcmVjb2duaXplZCk7Ci0JcmV0dXJuIGZhbHNlOwotICAgICAgfQotICB9Ci0KLSAgZm9yICh0YXJnZXQgPSBiZmRfdGFyZ2V0X3ZlY3RvcjsgKnRhcmdldCAhPSBOVUxMOyB0YXJnZXQrKykgewotICAgIGNvbnN0IGJmZF90YXJnZXQgKnRlbXA7Ci0KLSAgICBpZiAoKnRhcmdldCA9PSAmYmluYXJ5X3ZlYykKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgYWJmZC0+eHZlYyA9ICp0YXJnZXQ7CS8qIENoYW5nZSBCRkQncyB0YXJnZXQgdGVtcG9yYXJpbHkgKi8KLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAvKiBJZiBfYmZkX2NoZWNrX2Zvcm1hdCBuZWdsZWN0cyB0byBzZXQgYmZkX2Vycm9yLCBhc3N1bWUgYmZkX2Vycm9yX3dyb25nX2Zvcm1hdC4KLSAgICAgICBXZSBkaWRuJ3QgdXNlZCB0byBldmVuIHBheSBhbnkgYXR0ZW50aW9uIHRvIGJmZF9lcnJvciwgc28gSSBzdXNwZWN0Ci0gICAgICAgdGhhdCBzb21lIF9iZmRfY2hlY2tfZm9ybWF0IG1pZ2h0IGhhdmUgdGhpcyBwcm9ibGVtLiAgKi8KLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICB0ZW1wID0gQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX2NoZWNrX2Zvcm1hdCwgKGFiZmQpKTsKLSAgICBpZiAodGVtcCkgewkJCQkvKiBUaGlzIGZvcm1hdCBjaGVja3Mgb3V0IGFzIG9rISAqLwotICAgICAgcmlnaHRfdGFyZyA9IHRlbXA7Ci0gICAgICBpZiAobWF0Y2hpbmcpCi0JewotCSAgbWF0Y2hpbmdfdmVjdG9yW21hdGNoX2NvdW50XSA9IHRlbXAtPm5hbWU7Ci0JICBtYXRjaGluZ192ZWN0b3JbbWF0Y2hfY291bnQgKyAxXSA9IE5VTEw7Ci0JfQotICAgICAgbWF0Y2hfY291bnQrKzsKLSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGRlZmF1bHQgdGFyZ2V0LCBhY2NlcHQgaXQsIGV2ZW4gaWYgb3RoZXIgdGFyZ2V0cwotCSBtaWdodCBtYXRjaC4gIFBlb3BsZSB3aG8gd2FudCB0aG9zZSBvdGhlciB0YXJnZXRzIGhhdmUgdG8gc2V0IAotCSB0aGUgR05VVEFSR0VUIHZhcmlhYmxlLiAgKi8KLSAgICAgIGlmICh0ZW1wID09IGJmZF9kZWZhdWx0X3ZlY3RvclswXSkKLQl7Ci0JICBpZiAobWF0Y2hpbmcpCi0JICAgIHsKLQkgICAgICBtYXRjaGluZ192ZWN0b3JbMF0gPSB0ZW1wLT5uYW1lOwotCSAgICAgIG1hdGNoaW5nX3ZlY3RvclsxXSA9IE5VTEw7Ci0JICAgIH0KLQkgIG1hdGNoX2NvdW50ID0gMTsKLQkgIGJyZWFrOwotCX0KLSNpZmRlZiBHTlU5NjAKLSAgICAgIC8qIEJpZy0gYW5kIGxpdHRsZS1lbmRpYW4gYi5vdXQgYXJjaGl2ZXMgbG9vayB0aGUgc2FtZSwgYnV0IGl0IGRvZXNuJ3QKLSAgICAgICAqIG1hdHRlcjogdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBpbiB0aGVpciBoZWFkZXJzLCBhbmQgbWVtYmVyIGZpbGUgYnl0ZQotICAgICAgICogb3JkZXJzIHdpbGwgKEkgaG9wZSkgYmUgaGFuZGxlZCBhcHByb3ByaWF0ZWx5IGJ5IGJmZC4gIERpdHRvIGZvciBiaWcKLSAgICAgICAqIGFuZCBsaXR0bGUgY29mZiBhcmNoaXZlcy4gIEFuZCB0aGUgNCBjb2ZmL2Iub3V0IG9iamVjdCBmb3JtYXRzIGFyZQotICAgICAgICogdW5hbWJpZ3VvdXMuICBTbyBhY2NlcHQgdGhlIGZpcnN0IG1hdGNoIHdlIGZpbmQuCi0gICAgICAgKi8KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgfSBlbHNlIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpIHsKLSAgICAgIGFiZmQtPnh2ZWMgPSBzYXZlX3Rhcmc7Ci0gICAgICBhYmZkLT5mb3JtYXQgPSBiZmRfdW5rbm93bjsKLSAgICAgIGlmIChtYXRjaGluZyAmJiBiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JZnJlZSAobWF0Y2hpbmdfdmVjdG9yKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBpZiAobWF0Y2hfY291bnQgPT0gMSkgewotICAgIGFiZmQtPnh2ZWMgPSByaWdodF90YXJnOwkJLyogQ2hhbmdlIEJGRCdzIHRhcmdldCBwZXJtYW5lbnRseSAqLwotICAgIGlmIChtYXRjaGluZykKLSAgICAgIGZyZWUgKG1hdGNoaW5nX3ZlY3Rvcik7Ci0gICAgcmV0dXJuIHRydWU7CQkJLyogRmlsZSBwb3NpdGlvbiBoYXMgbW92ZWQsIEJUVyAqLwotICB9Ci0KLSAgYWJmZC0+eHZlYyA9IHNhdmVfdGFyZzsJCS8qIFJlc3RvcmUgb3JpZ2luYWwgdGFyZ2V0IHR5cGUgKi8KLSAgYWJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247CQkvKiBSZXN0b3JlIG9yaWdpbmFsIGZvcm1hdCAqLwotICBpZiAobWF0Y2hfY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV9ub3RfcmVjb2duaXplZCk7Ci0gICAgICBpZiAobWF0Y2hpbmcpCi0JZnJlZSAobWF0Y2hpbmdfdmVjdG9yKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2Zvcm1hdAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9mb3JtYXQoYmZkICphYmZkLCBiZmRfZm9ybWF0IGZvcm1hdCk7Ci0KLURFU0NSSVBUSU9OCi0JVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBmaWxlIGZvcm1hdCBvZiB0aGUgQkZEIEB2YXJ7YWJmZH0gdG8gdGhlCi0JZm9ybWF0IEB2YXJ7Zm9ybWF0fS4gSWYgdGhlIHRhcmdldCBzZXQgaW4gdGhlIEJGRCBkb2VzIG5vdAotCXN1cHBvcnQgdGhlIGZvcm1hdCByZXF1ZXN0ZWQsIHRoZSBmb3JtYXQgaXMgaW52YWxpZCwgb3IgdGhlIEJGRAotCWlzIG5vdCBvcGVuIGZvciB3cml0aW5nLCB0aGVuIGFuIGVycm9yIG9jY3Vycy4KLQotKi8KLQotYm9vbGVhbgotYmZkX3NldF9mb3JtYXQgKGFiZmQsIGZvcm1hdCkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfZm9ybWF0IGZvcm1hdDsKLXsKLQotICBpZiAoYmZkX3JlYWRfcCAoYWJmZCkgfHwKLSAgICAgICgoaW50KWFiZmQtPmZvcm1hdCA8IChpbnQpYmZkX3Vua25vd24pIHx8Ci0gICAgICAoKGludClhYmZkLT5mb3JtYXQgPj0gKGludCliZmRfdHlwZV9lbmQpKSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF91bmtub3duKQotICAgIHJldHVybiAoYWJmZC0+Zm9ybWF0ID09IGZvcm1hdCkgPyB0cnVlOmZhbHNlOwotCi0gIC8qIHByZXN1bWUgdGhlIGFuc3dlciBpcyB5ZXMgKi8KLSAgYWJmZC0+Zm9ybWF0ID0gZm9ybWF0OwotCi0gIGlmICghQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX3NldF9mb3JtYXQsIChhYmZkKSkpIHsKLSAgICBhYmZkLT5mb3JtYXQgPSBiZmRfdW5rbm93bjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfZm9ybWF0X3N0cmluZwotCi1TWU5PUFNJUwotCUNPTlNUIGNoYXIgKmJmZF9mb3JtYXRfc3RyaW5nKGJmZF9mb3JtYXQgZm9ybWF0KTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBwb2ludGVyIHRvIGEgY29uc3Qgc3RyaW5nCi0JPDxpbnZhbGlkPj4sIDw8b2JqZWN0Pj4sIDw8YXJjaGl2ZT4+LCA8PGNvcmU+Piwgb3IgPDx1bmtub3duPj4sCi0JZGVwZW5kaW5nIHVwb24gdGhlIHZhbHVlIG9mIEB2YXJ7Zm9ybWF0fS4KLSovCi0KLUNPTlNUIGNoYXIgKgotYmZkX2Zvcm1hdF9zdHJpbmcgKGZvcm1hdCkKLSAgICAgYmZkX2Zvcm1hdCBmb3JtYXQ7Ci17Ci0gIGlmICgoKGludClmb3JtYXQgPChpbnQpIGJmZF91bmtub3duKSAKLSAgICAgIHx8ICgoaW50KWZvcm1hdCA+PShpbnQpIGJmZF90eXBlX2VuZCkpIAotICAgIHJldHVybiAiaW52YWxpZCI7Ci0gIAotICBzd2l0Y2ggKGZvcm1hdCkgewotICBjYXNlIGJmZF9vYmplY3Q6Ci0gICAgcmV0dXJuICJvYmplY3QiOwkJLyogbGlua2VyL2Fzc2VtYmVyL2NvbXBpbGVyIG91dHB1dCAqLwotICBjYXNlIGJmZF9hcmNoaXZlOiAKLSAgICByZXR1cm4gImFyY2hpdmUiOwkJLyogb2JqZWN0IGFyY2hpdmUgZmlsZSAqLwotICBjYXNlIGJmZF9jb3JlOiAKLSAgICByZXR1cm4gImNvcmUiOwkJLyogY29yZSBkdW1wICovCi0gIGRlZmF1bHQ6IAotICAgIHJldHVybiAidW5rbm93biI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2JmZC9mcmVlYnNkLmggYi9iZmQvZnJlZWJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmIxOWFjLi4wMDAwMDAwCi0tLSBhL2JmZC9mcmVlYnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGRlZmluaXRpb25zIHVzZWQgYnkgYWxsIEZyZWVCU0QgdGFyZ2V0cy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0qLwotCi0vKiBGcmVlQlNEIFpNQUdJQyBmaWxlcyBuZXZlciBoYXZlIHRoZSBoZWFkZXIgaW4gdGhlIHRleHQuICovCi0jZGVmaW5lCU5fSEVBREVSX0lOX1RFWFQoeCkJMAotCi0vKiBaTUFHSUMgZmlsZXMgc3RhcnQgYXQgb2Zmc2V0IDAuICBEb2VzIG5vdCBhcHBseSB0byBRTUFHSUMgZmlsZXMuICovCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUgkJMAotCi0jZGVmaW5lIE5fR0VUTUFHSUNfTkVUKGV4ZWMpIFwKLQkoKGV4ZWMpLmFfaW5mbyAmIDB4ZmZmZikKLSNkZWZpbmUgTl9HRVRNSURfTkVUKGV4ZWMpIFwKLQkoKChleGVjKS5hX2luZm8gPj4gMTYpICYgMHgzZmYpCi0jZGVmaW5lIE5fR0VURkxBR19ORVQoZXgpIFwKLQkoKChleGVjKS5hX2luZm8gPj4gMjYpICYgMHgzZikKLQotI2RlZmluZSBOX01BQ0hUWVBFKGV4ZWMpIFwKLQkoKGVudW0gbWFjaGluZV90eXBlKSBcCi0JICgoTl9HRVRNQUdJQ19ORVQgKGV4ZWMpID09IFpNQUdJQykgPyBOX0dFVE1JRF9ORVQgKGV4ZWMpIDogXAotCSAgKChleGVjKS5hX2luZm8gPj4gMTYpICYgMHgzZmYpKQotI2RlZmluZSBOX0ZMQUdTKGV4ZWMpIFwKLQkoKE5fR0VUTUFHSUNfTkVUIChleGVjKSA9PSBaTUFHSUMpID8gTl9HRVRGTEFHX05FVCAoZXhlYykgOiBcCi0JICgoZXhlYykuYV9pbmZvID4+IDI2KSAmIDB4M2YpCi0KLSNkZWZpbmUgTl9TRVRfSU5GTyhleGVjLCBtYWdpYywgdHlwZSwgZmxhZ3MpIFwKLQkoKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKSBcCi0JIHwgKCgoaW50KSh0eXBlKSAmIDB4M2ZmKSA8PCAxNikgXAotCSB8ICgoKGZsYWdzKSAmIDB4M2YpIDw8IDI2KSkKLSNkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpIFwKLQkoKGV4ZWMpLmFfaW5mbyA9IFwKLSAgICAgICAgICgoZXhlYykuYV9pbmZvICYgMHhmYjAwZmZmZikgfCAoKCgoaW50KShtYWNodHlwZSkpJjB4M2ZmKSA8PCAxNikpCi0jZGVmaW5lIE5fU0VUX0ZMQUdTKGV4ZWMsIGZsYWdzKSBcCi0JKChleGVjKS5hX2luZm8gPSBcCi0JICgoZXhlYykuYV9pbmZvICYgMHgwM2ZmZmZmZikgfCAoKGZsYWdzICYgMHgwM2YpIDw8IDI2KSkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotLyogT24gRnJlZUJTRCwgdGhlIG1hZ2ljIG51bWJlciBpcyBhbHdheXMgaW4gaTM4NiAobGl0dGxlLWVuZGlhbikKLSAgIGZvcm1hdC4gIEkgdGhpbmsuICAqLwotI2RlZmluZSBTV0FQX01BR0lDKGV4dCkgYmZkX2dldGwzMiAoZXh0KQotCi0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLXN0YXRpYyBib29sZWFuIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZS4KLSAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLU1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0jaWYgQ0hPT1NFX1JFTE9DX1NJWkUKLSAgQ0hPT1NFX1JFTE9DX1NJWkUoYWJmZCk7Ci0jZWxzZQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSNlbmRpZgotCi0gIC8qIE1hZ2ljIG51bWJlciwgbWFlc3RybywgcGxlYXNlISAgKi8KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2goYWJmZCkpIHsKLSAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgIGlmIChzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJhLm91dC1tNjhrNGstbmV0YnNkIikgPT0gMCkKLSAgICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV82OEs0S19ORVRCU0QpOwotICAgIGVsc2UKLSAgICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV82OEtfTkVUQlNEKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fU1BBUkNfTkVUQlNEKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV8zODZfTkVUQlNEKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9uczMyazoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fNTMyX05FVEJTRCk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX1VOS05PV04pOwotICAgIGJyZWFrOwotICB9Ci0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvZ2VuLWFvdXQuYyBiL2JmZC9nZW4tYW91dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWVkOTFhLi4wMDAwMDAwCi0tLSBhL2JmZC9nZW4tYW91dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qIEdlbmVyYXRlIHBhcmFtZXRlcnMgZm9yIGFuIGEub3V0IHN5c3RlbS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICIvdXNyL2luY2x1ZGUvYS5vdXQuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOyBjaGFyKiogYXJndjsKLXsKLSAgc3RydWN0IGV4ZWMgbXlfZXhlYzsKLSAgaW50IHBhZ2Vfc2l6ZTsKLSAgY2hhciAqdGFyZ2V0ID0gInVua25vd24iLCAqYXJjaCA9ICJ1bmtub3duIjsKLSAgRklMRSAqZmlsZSA9IGZvcGVuKCJnZW4tYW91dCIsICJyIik7Ci0KLSAgaWYgKGZpbGUgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBnZW4tYW91dCFcbiIpOwotICAgICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChmcmVhZCgmbXlfZXhlYywgc2l6ZW9mKHN0cnVjdCBleGVjKSwgMSwgZmlsZSkgIT0gMSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3QgcmVhZCBnZW4tYW91dCFcbiIpOwotICAgICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgdGFyZ2V0ID0gYXJndlsxXTsKLSAgaWYgKHRhcmdldCA9PSBOVUxMKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBnZW4tYW91dCB0YXJnZXRfbmFtZVxuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgfQotCi0jaWZkZWYgTl9UWFRPRkYKLSAgcGFnZV9zaXplID0gTl9UWFRPRkYobXlfZXhlYyk7Ci0gIGlmIChwYWdlX3NpemUgPT0gMCkKLSAgICBwcmludGYoIiNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAxXG4iKTsKLSAgZWxzZQotICAgIHByaW50ZigiI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDBcbiIpOwotI2VuZGlmCi0KLSAgcHJpbnRmKCIjZGVmaW5lIEJZVEVTX0lOX1dPUkQgJWRcbiIsIHNpemVvZiAoaW50KSk7Ci0gIGlmIChteV9leGVjLmFfZW50cnkgPT0gMCkgewotICAgICAgcHJpbnRmKCIjZGVmaW5lIEVOVFJZX0NBTl9CRV9aRVJPXG4iKTsKLSAgICAgIHByaW50ZigiI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMCAvKiBBdm9pZHMgd2FybmluZyAqL1xuIik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgICBwcmludGYoIi8qI2RlZmluZSBFTlRSWV9DQU5fQkVfWkVSTyovXG4iKTsKLSAgICAgIHByaW50ZigiLyojZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwKi9cbiIpOwotICB9Ci0KLSAgcHJpbnRmKCIjZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAlZFxuIiwgbXlfZXhlYy5hX2VudHJ5KTsKLQotI2lmZGVmIFBBR1NJWgotICBpZiAocGFnZV9zaXplID09IDApCi0gICAgcGFnZV9zaXplID0gUEFHU0laOwotI2VuZGlmCi0gIGlmIChwYWdlX3NpemUgIT0gMCkKLSAgICBwcmludGYoIiNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAlZFxuIiwgcGFnZV9zaXplKTsKLSAgZWxzZQotICAgIHByaW50ZigiLyogI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFID8/PyAqL1xuIik7Ci0gIHByaW50ZigiI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRVxuIik7Ci0KLSNpZmRlZiB2YXgKLSAgYXJjaCA9ICJ2YXgiOwotI2VuZGlmCi0jaWZkZWYgbTY4awotICBhcmNoID0gIm02OGsiOwotI2VuZGlmCi0gIGlmIChhcmNoWzBdID09ICcxJykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIndhcm5pbmc6IHByZXByb2Nlc3NvciBzdWJzdGl0dXRlZCBhcmNoaXRlY3R1cmUgbmFtZSBpbnNpZGUgc3RyaW5nOyIpKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiICAgICAgICAgZml4IERFRkFVTFRfQVJDSCBpbiB0aGUgb3V0cHV0IGZpbGUgeW91cnNlbGZcbiIpKTsKLSAgICAgIGFyY2ggPSAidW5rbm93biI7Ci0gICAgfQotICBwcmludGYoIiNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoXyVzXG4iLCBhcmNoKTsKLQotICBwcmludGYoIlxuI2RlZmluZSBNWShPUCkgQ0FUKCVzXyxPUClcbiIsIHRhcmdldCk7Ci0gIHByaW50ZigiI2RlZmluZSBUQVJHRVROQU1FIFwiYS5vdXQtJXNcIlxuXG4iLCB0YXJnZXQpOwotCi0gIHByaW50ZigiI2luY2x1ZGUgXCJiZmQuaFwiXG4iKTsKLSAgcHJpbnRmKCIjaW5jbHVkZSBcInN5c2RlcC5oXCJcbiIpOwotICBwcmludGYoIiNpbmNsdWRlIFwibGliYmZkLmhcIlxuIik7Ci0gIHByaW50ZigiI2luY2x1ZGUgXCJsaWJhb3V0LmhcIlxuIik7Ci0gIHByaW50ZigiXG4jaW5jbHVkZSBcImFvdXQtdGFyZ2V0LmhcIlxuIik7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iZmQvZ2VubGluay5oIGIvYmZkL2dlbmxpbmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUwYThkZS4uMDAwMDAwMAotLS0gYS9iZmQvZ2VubGluay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qIGdlbmxpbmsuaCAtLSBpbnRlcmZhY2UgdG8gdGhlIEJGRCBnZW5lcmljIGxpbmtlcgotICAgQ29weXJpZ2h0IDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgR0VOTElOS19ICi0jZGVmaW5lIEdFTkxJTktfSAotCi0vKiBUaGlzIGhlYWRlciBmaWxlIGlzIGludGVybmFsIHRvIEJGRC4gIEl0IGRlc2NyaWJlcyB0aGUgaW50ZXJuYWwKLSAgIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBCRkQgZ2VuZXJpYyBsaW5rZXIsIGluIGNhc2UKLSAgIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBsaW5rZXJzIHdhbnQgdG8gdXNlIG9yIGNhbGwgdGhlbS4gIE5vdGUKLSAgIHRoYXQgc29tZSBmdW5jdGlvbnMsIHN1Y2ggYXMgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsCi0gICBhcmUgZGVjbGFyZWQgaW4gbGliYmZkLmgsIGJlY2F1c2UgdGhleSBhcmUgZXhwZWN0ZWQgdG8gYmUgd2lkZWx5Ci0gICB1c2VkLiAgVGhlIGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgd2lsbCBwcm9iYWJseSBvbmx5Ci0gICBiZSB1c2VkIGJ5IGEgZmV3IGZpbGVzIGJlc2lkZXMgbGlua2VyLmMgaXRzZWxmLiAgSW4gZmFjdCwgdGhpcyBmaWxlCi0gICBpcyBub3QgcGFydGljdWxhcmx5IGNvbXBsZXRlOyBJIGhhdmUgb25seSBwdXQgaW4gdGhlIGludGVyZmFjZXMgSQotICAgYWN0dWFsbHkgbmVlZGVkLiAgKi8KLQotLyogVGhlIGdlbmVyaWMgbGlua2VyIHVzZXMgYSBoYXNoIHRhYmxlIHdoaWNoIGlzIGEgZGVyaXZlZCBjbGFzcyBvZgotICAgdGhlIHN0YW5kYXJkIGxpbmtlciBoYXNoIHRhYmxlLCBqdXN0IGFzIHRoZSBvdGhlciBiYWNrZW5kIHNwZWNpZmljCi0gICBsaW5rZXJzIGRvLiAgRG8gbm90IGNvbmZ1c2UgdGhlIGdlbmVyaWMgbGlua2VyIGhhc2ggdGFibGUgd2l0aCB0aGUKLSAgIHN0YW5kYXJkIEJGRCBsaW5rZXIgaGFzaCB0YWJsZSBpdCBpcyBidWlsdCB1cG9uLiAgKi8KLQotLyogR2VuZXJpYyBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIFdoZXRoZXIgdGhpcyBzeW1ib2wgaGFzIGJlZW4gd3JpdHRlbiBvdXQuICAqLwotICBib29sZWFuIHdyaXR0ZW47Ci0gIC8qIFN5bWJvbCBmcm9tIGlucHV0IEJGRC4gICovCi0gIGFzeW1ib2wgKnN5bTsKLX07Ci0KLS8qIEdlbmVyaWMgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gZ2VuZXJpYyBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYW4gZ2VuZXJpYyBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIFRoZSBnZW5lcmljIGxpbmtlciByZWFkcyBpbiB0aGUgYXN5bWJvbCBzdHJ1Y3R1cmVzIGZvciBhbiBpbnB1dCBCRkQKLSAgIGFuZCBrZWVwcyB0aGVtIGluIHRoZSBvdXRzeW1ib2wgYW5kIHN5bWNvdW50IGZpZWxkcy4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMoYWJmZCkgKChhYmZkKS0+b3V0c3ltYm9scykKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50KGFiZmQpICgoYWJmZCktPnN5bWNvdW50KQotCi0vKiBBZGQgdGhlIHN5bWJvbHMgb2YgaW5wdXRfYmZkIHRvIHRoZSBzeW1ib2xzIGJlaW5nIGJ1aWx0IGZvcgotICAgb3V0cHV0X2JmZC4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIGJmZCAqaW5wdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCSAgIHNpemVfdCAqcHN5bWFsbG9jKSk7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0bwotICAgX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCwgd2hpY2ggbWF5IGJlIGNhbGxlZCB2aWEKLSAgIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8KLXsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgc2l6ZV90ICpwc3ltYWxsb2M7Ci19OwotCi0vKiBXcml0ZSBvdXQgYSBzaW5nbGUgZ2xvYmFsIHN5bWJvbC4gIFRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkCi0gICB2aWEgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90cmF2ZXJzZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdAotICAgYWN0dWFsbHkgYmUgYSBzdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8gKi4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotLyogR2VuZXJpYyBsaW5rIGhhc2ggdGFibGUgZW50cnkgY3JlYXRpb24gcm91dGluZS4gICovCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0gICAgICAgICAgIGNvbnN0IGNoYXIgKikpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9nbzMyc3R1Yi5oIGIvYmZkL2dvMzJzdHViLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNDM4OGMuLjAwMDAwMDAKLS0tIGEvYmZkL2dvMzJzdHViLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotMHg0ZCwweDVhLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MjAsMHgwMCwweDI3LDB4MDAsMHhmZiwweGZmLDB4MDAsMHgwMCwKLTB4NjAsMHgwNywweDAwLDB4MDAsMHg1NCwweDAwLDB4MDAsMHgwMCwweDBkLDB4MGEsMHg3MywweDc0LDB4NzUsMHg2MiwweDJlLDB4NjgsCi0weDIwLDB4NjcsMHg2NSwweDZlLDB4NjUsMHg3MiwweDYxLDB4NzQsMHg2NSwweDY0LDB4MjAsMHg2NiwweDcyLDB4NmYsMHg2ZCwweDIwLAotMHg3MywweDc0LDB4NzUsMHg2MiwweDJlLDB4NjEsMHg3MywweDZkLDB4MjAsMHg2MiwweDc5LDB4MjAsMHg2NCwweDZhLDB4NjEsMHg3MywKLTB4NmQsMHgyYywweDIwLDB4NmYsMHg2ZSwweDIwLDB4NTcsMHg2NSwweDY0LDB4MjAsMHg0YSwweDc1LDB4NmUsMHgyMCwweDMxLDB4MzEsCi0weDIwLDB4MzEsMHgzNiwweDNhLDB4MzAsMHgzOSwweDNhLDB4MzEsMHgzNSwweDIwLDB4MzEsMHgzOSwweDM5LDB4MzcsMHgwZCwweDBhLAotMHg1NCwweDY4LDB4NjUsMHgyMCwweDUzLDB4NTQsMHg1NSwweDQyLDB4MmUsMHg0NSwweDU4LDB4NDUsMHgyMCwweDczLDB4NzQsMHg3NSwKLTB4NjIsMHgyMCwweDZjLDB4NmYsMHg2MSwweDY0LDB4NjUsMHg3MiwweDIwLDB4NjksMHg3MywweDIwLDB4NDMsMHg2ZiwweDcwLDB4NzksCi0weDcyLDB4NjksMHg2NywweDY4LDB4NzQsMHgyMCwweDI4LDB4NDMsMHgyOSwweDIwLDB4MzEsMHgzOSwweDM5LDB4MzMsMHgyZCwweDMxLAotMHgzOSwweDM5LDB4MzUsMHgyMCwweDQ0LDB4NGEsMHgyMCwweDQ0LDB4NjUsMHg2YywweDZmLDB4NzIsMHg2OSwweDY1LDB4MmUsMHgyMCwKLTB4MGQsMHgwYSwweDUwLDB4NjUsMHg3MiwweDZkLDB4NjksMHg3MywweDczLDB4NjksMHg2ZiwweDZlLDB4MjAsMHg2NywweDcyLDB4NjEsCi0weDZlLDB4NzQsMHg2NSwweDY0LDB4MjAsMHg3NCwweDZmLDB4MjAsMHg3NSwweDczLDB4NjUsMHgyMCwweDY2LDB4NmYsMHg3MiwweDIwLAotMHg2MSwweDZlLDB4NzksMHgyMCwweDcwLDB4NzUsMHg3MiwweDcwLDB4NmYsMHg3MywweDY1LDB4MjAsMHg3MCwweDcyLDB4NmYsMHg3NiwKLTB4NjksMHg2NCwweDY1LDB4NjQsMHgyMCwweDc0LDB4NjgsMHg2OSwweDczLDB4MjAsMHg2MywweDZmLDB4NzAsMHg3OSwweDcyLDB4NjksCi0weDY3LDB4NjgsMHg3NCwweDIwLDB4MGQsMHgwYSwweDcyLDB4NjUsMHg2ZCwweDYxLDB4NjksMHg2ZSwweDczLDB4MjAsMHg3MCwweDcyLAotMHg2NSwweDczLDB4NjUsMHg2ZSwweDc0LDB4MjAsMHg2MSwweDZlLDB4NjQsMHgyMCwweDc1LDB4NmUsMHg2ZCwweDZmLDB4NjQsMHg2OSwKLTB4NjYsMHg2OSwweDY1LDB4NjQsMHgyZSwweDIwLDB4MGQsMHgwYSwweDU0LDB4NjgsMHg2OSwweDczLDB4MjAsMHg2ZiwweDZlLDB4NmMsCi0weDc5LDB4MjAsMHg2MSwweDcwLDB4NzAsMHg2YywweDY5LDB4NjUsMHg3MywweDIwLDB4NzQsMHg2ZiwweDIwLDB4NzQsMHg2OCwweDY1LAotMHgyMCwweDczLDB4NzQsMHg3NSwweDYyLDB4MmMsMHgyMCwweDYxLDB4NmUsMHg2NCwweDIwLDB4NmUsMHg2ZiwweDc0LDB4MjAsMHg2ZSwKLTB4NjUsMHg2MywweDYzLDB4NjUsMHg3MywweDczLDB4NjEsMHg3MiwweDY5LDB4NmMsMHg3OSwweDIwLDB4NzQsMHg2OCwweDY1LDB4MjAsCi0weDc3LDB4NjgsMHg2ZiwweDZjLDB4NjUsMHgyMCwweDcwLDB4NzIsMHg2ZiwweDY3LDB4NzIsMHg2MSwweDZkLDB4MmUsMHgwYSwweDBkLAotMHgwYSwweDI0LDB4NDksMHg2NCwweDNhLDB4MjAsMHg3MywweDc0LDB4NzUsMHg2MiwweDJlLDB4NjEsMHg3MywweDZkLDB4MjAsMHg2MiwKLTB4NzUsMHg2OSwweDZjLDB4NzQsMHgyMCwweDMwLDB4MzYsMHgyZiwweDMxLDB4MzEsMHgyZiwweDM5LDB4MzcsMHgyMCwweDMxLDB4MzYsCi0weDNhLDB4MzAsMHgzOSwweDNhLDB4MzEsMHgzNSwweDIwLDB4NjIsMHg3OSwweDIwLDB4NjQsMHg2YSwweDYxLDB4NzMsMHg2ZCwweDIwLAotMHgyNCwweDBhLDB4MGQsMHgwYSwweDQwLDB4MjgsMHgyMywweDI5LDB4MjAsMHg3MywweDc0LDB4NzUsMHg2MiwweDJlLDB4NjEsMHg3MywKLTB4NmQsMHgyMCwweDYyLDB4NzUsMHg2OSwweDZjLDB4NzQsMHgyMCwweDMwLDB4MzYsMHgyZiwweDMxLDB4MzEsMHgyZiwweDM5LDB4MzcsCi0weDIwLDB4MzEsMHgzNiwweDNhLDB4MzAsMHgzOSwweDNhLDB4MzEsMHgzNSwweDIwLDB4NjIsMHg3OSwweDIwLDB4NjQsMHg2YSwweDYxLAotMHg3MywweDZkLDB4MGEsMHgwZCwweDBhLDB4MWEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDY3LDB4NmYsMHgzMywweDMyLDB4NzMsMHg3NCwweDc1LDB4NjIsMHgyYywweDIwLDB4NzYsMHgyMCwweDMyLDB4MmUsMHgzMCwweDMwLAotMHg1NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDQzLDB4NTcsMHg1MywweDQ0LDB4NTAsMHg0ZCwweDQ5LDB4MmUsMHg0NSwweDU4LDB4NDUsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwZSwweDFmLDB4OGMsMHgxZSwweDI0LDB4MDAsMHg4YywweDA2LDB4NjAsMHgwNywweGZjLDB4YjQsCi0weDMwLDB4Y2QsMHgyMSwweDNjLDB4MDMsMHg3MywweDA2LDB4YmEsMHg4NiwweDA1LDB4ZTksMHhiMiwweDAzLDB4YTIsMHg2OSwweDA4LAotMHhiYiwweDcwLDB4MDgsMHhhMSwweDIwLDB4MDAsMHgzOSwweGMzLDB4NzMsMHgwMiwweDg5LDB4YzMsMHg4OSwweDFlLDB4MjAsMHgwMCwKLTB4ZmUsMHhjNywweGI5LDB4MDQsMHhmZiwweGQzLDB4ZWIsMHhiNCwweDRhLDB4Y2QsMHgyMSwweDczLDB4MGEsMHhkMywweGUzLDB4ZmUsCi0weGNmLDB4ODksMHgxZSwweDIwLDB4MDAsMHhlYiwweGQ5LDB4MjYsMHg4ZSwweDA2LDB4MmMsMHgwMCwweDMxLDB4ZmYsMHgzMCwweGMwLAotMHhhOSwweGYyLDB4YWUsMHgyNiwweDgxLDB4M2QsMHg1MCwweDQxLDB4NzUsMHgxNSwweGFmLDB4MjYsMHg4MSwweDNkLDB4NTQsMHg0OCwKLTB4NzUsMHgwZCwweGFmLDB4MjYsMHg4MCwweDNkLDB4M2QsMHg3NSwweDA2LDB4NDcsMHg4OSwweDNlLDB4NjcsMHgwNCwweDRmLDB4YWUsCi0weDc1LDB4ZGYsMHhhZiwweDA2LDB4NTcsMHgzMSwweGM5LDB4NzQsMHgxMCwweGJhLDB4NWQsMHgwNSwweGU5LDB4NTAsMHgwMywweDA5LAotMHhjOSwweDc1LDB4ZjYsMHg0MSwweGU4LDB4OTIsMHgwMywweDcyLDB4ZjAsMHhiOCwweDg3LDB4MTYsMHhjZCwweDJmLDB4MDksMHhjMCwKLTB4NzUsMHhlZCwweDgwLDB4ZTMsMHgwMSwweDc0LDB4ZTgsMHg4OSwweDNlLDB4MDAsMHgwNiwweDhjLDB4MDYsMHgwMiwweDA2LDB4ODksCi0weDM2LDB4MDQsMHgwNiwweDVmLDB4MDcsMHhlOCwweGQ1LDB4MDIsMHg4OSwweDNlLDB4MmEsMHgwMCwweDg5LDB4MzYsMHg2MiwweDA3LAotMHg4MCwweDNlLDB4MmMsMHgwMCwweDAwLDB4NzQsMHgyNCwweGI5LDB4MDgsMHgwMCwweGJmLDB4MmMsMHgwMCwweDhhLDB4MDUsMHg0NywKLTB4MDgsMHhjMCwweDc0LDB4MDUsMHg4OCwweDA3LDB4NDMsMHhlMiwweGY0LDB4NjYsMHhjNywweDA3LDB4MmUsMHg0NSwweDU4LDB4NDUsCi0weDgxLDB4YzMsMHgwNCwweDAwLDB4YzYsMHgwNywweDAwLDB4ODksMHgxZSwweDYyLDB4MDcsMHhiOCwweDAwLDB4M2QsMHhiYSwweDY0LAotMHgwNywweGNkLDB4MjEsMHgwZiwweDgyLDB4YjQsMHgwMiwweGEzLDB4MDYsMHgwNiwweDg5LDB4YzMsMHhiOSwweDA2LDB4MDAsMHhiYSwKLTB4YjUsMHgwNywweGI0LDB4M2YsMHhjZCwweDIxLDB4MzEsMHhkMiwweDMxLDB4YzksMHhhMSwweGI1LDB4MDcsMHgzZCwweDRjLDB4MDEsCi0weDc0LDB4MWIsMHgzZCwweDRkLDB4NWEsMHgwZiwweDg1LDB4OTcsMHgwMiwweDhiLDB4MTYsMHhiOSwweDA3LDB4YzEsMHhlMiwweDA5LAotMHg4YiwweDFlLDB4YjcsMHgwNywweDA5LDB4ZGIsMHg3NCwweDA1LDB4ODAsMHhlZSwweDAyLDB4MDEsMHhkYSwweDg5LDB4MTYsMHhiYiwKLTB4MDcsMHg4OSwweDBlLDB4YmQsMHgwNywweGI4LDB4MDAsMHg0MiwweDhiLDB4MWUsMHgwNiwweDA2LDB4Y2QsMHgyMSwweGI5LDB4YTgsCi0weDAwLDB4YmEsMHhiZiwweDA3LDB4YjQsMHgzZiwweGNkLDB4MjEsMHgzZCwweGE4LDB4MDAsMHg3NSwweDA2LDB4ODEsMHgzZSwweGJmLAotMHgwNywweDRjLDB4MDEsMHgwZiwweDg1LDB4NWUsMHgwMiwweDY2LDB4YTEsMHhlMywweDA3LDB4NjYsMHhhMywweDEwLDB4MDYsMHg2NiwKLTB4OGIsMHgwZSwweGJiLDB4MDcsMHg2NiwweGExLDB4MDMsMHgwOCwweDY2LDB4MDEsMHhjOCwweDY2LDB4YTMsMHgwOCwweDA2LDB4NjYsCi0weGExLDB4MmIsMHgwOCwweDY2LDB4MDEsMHhjOCwweDY2LDB4YTMsMHgwYywweDA2LDB4NjYsMHg4YiwweDFlLDB4NGIsMHgwOCwweDY2LAotMHhhMSwweDRmLDB4MDgsMHg2NiwweDAxLDB4YzMsMHg2NiwweGI4LDB4MDEsMHgwMCwweDAxLDB4MDAsMHg2NiwweDM5LDB4YzMsMHg3MywKLTB4MDMsMHg2NiwweDg5LDB4YzMsMHg2NiwweDgxLDB4YzMsMHhmZiwweGZmLDB4MDAsMHgwMCwweDMxLDB4ZGIsMHg2NiwweDg5LDB4MWUsCi0weDFjLDB4MDAsMHhlOCwweGU4LDB4MDIsMHg4YiwweDFlLDB4MDQsMHgwNiwweDA5LDB4ZGIsMHg3NCwweDBhLDB4YjQsMHg0OCwweGNkLAotMHgyMSwweDBmLDB4ODIsMHgxMCwweDAyLDB4OGUsMHhjMCwweGU4LDB4ZmIsMHgwMiwweGI4LDB4MDEsMHgwMCwweGZmLDB4MWUsMHgwMCwKLTB4MDYsMHgwZiwweDgyLDB4MDgsMHgwMiwweDhjLDB4MDYsMHgyNiwweDAwLDB4OGMsMHgwZSwweDI4LDB4MDAsMHg4YywweGQ4LDB4YTMsCi0weDIyLDB4MDAsMHg4ZSwweGMwLDB4MzEsMHhjMCwweGI5LDB4MDEsMHgwMCwweGNkLDB4MzEsMHg3MiwweDA3LDB4YTMsMHgxNCwweDA2LAotMHgzMSwweGMwLDB4Y2QsMHgzMSwweDBmLDB4ODIsMHhlYSwweDAxLDB4YTMsMHgxNiwweDA2LDB4NjYsMHg4YiwweDBlLDB4MWMsMHgwMCwKLTB4YjgsMHgwMSwweDA1LDB4OGIsMHgxZSwweDFlLDB4MDAsMHhjZCwweDMxLDB4MGYsMHg4MiwweGRhLDB4MDEsMHg4OSwweDFlLDB4MWEsCi0weDA2LDB4ODksMHgwZSwweDE4LDB4MDYsMHg4OSwweDM2LDB4MWEsMHgwMCwweDg5LDB4M2UsMHgxOCwweDAwLDB4YjgsMHgwNywweDAwLAotMHg4YiwweDFlLDB4MTQsMHgwNiwweDhiLDB4MGUsMHgxYSwweDA2LDB4OGIsMHgxNiwweDE4LDB4MDYsMHhjZCwweDMxLDB4YjgsMHgwOSwKLTB4MDAsMHg4YywweGM5LDB4ODEsMHhlMSwweDAzLDB4MDAsMHhjMSwweGUxLDB4MDUsMHg1MSwweDgxLDB4YzksMHg5YiwweGMwLDB4Y2QsCi0weDMxLDB4YjgsMHgwOCwweDAwLDB4OGIsMHgwZSwweDFlLDB4MDAsMHg0OSwweGJhLDB4ZmYsMHhmZiwweGNkLDB4MzEsMHhiOCwweDA3LAotMHgwMCwweDhiLDB4MWUsMHgxNiwweDA2LDB4OGIsMHgwZSwweDFhLDB4MDYsMHg4YiwweDE2LDB4MTgsMHgwNiwweGNkLDB4MzEsMHhiOCwKLTB4MDksMHgwMCwweDU5LDB4ODEsMHhjOSwweDkzLDB4YzAsMHhjZCwweDMxLDB4YjgsMHgwOCwweDAwLDB4OGIsMHgwZSwweDFlLDB4MDAsCi0weDQ5LDB4YmEsMHhmZiwweGZmLDB4Y2QsMHgzMSwweGI4LDB4MDAsMHgwMSwweGJiLDB4MDAsMHgwZiwweGNkLDB4MzEsMHg3MywweDEwLAotMHgzZCwweDA4LDB4MDAsMHgwZiwweDg1LDB4NjUsMHgwMSwweGI4LDB4MDAsMHgwMSwweGNkLDB4MzEsMHgwZiwweDgyLDB4NWMsMHgwMSwKLTB4YTMsMHgxYywweDA2LDB4ODksMHgxNiwweDFlLDB4MDYsMHhjMSwweGUzLDB4MDQsMHg4OSwweDFlLDB4MjAsMHgwNiwweDY2LDB4OGIsCi0weDM2LDB4MDgsMHgwNiwweDY2LDB4OGIsMHgzZSwweGZiLDB4MDcsMHg2NiwweDhiLDB4MGUsMHhmZiwweDA3LDB4ZTgsMHg0OSwweDAwLAotMHg2NiwweDhiLDB4MzYsMHgwYywweDA2LDB4NjYsMHg4YiwweDNlLDB4MjMsMHgwOCwweDY2LDB4OGIsMHgwZSwweDI3LDB4MDgsMHhlOCwKLTB4MzcsMHgwMCwweDhlLDB4MDYsMHgxNiwweDA2LDB4NjYsMHg4YiwweDNlLDB4NGIsMHgwOCwweDY2LDB4OGIsMHgwZSwweDRmLDB4MDgsCi0weDY2LDB4MzEsMHhjMCwweDY2LDB4YzEsMHhlOSwweDAyLDB4NjcsMHhmMywweDY2LDB4YWIsMHhiNCwweDNlLDB4OGIsMHgxZSwweDA2LAotMHgwNiwweGNkLDB4MjEsMHhiOCwweDAxLDB4MDEsMHg4YiwweDE2LDB4MWUsMHgwNiwweGNkLDB4MzEsMHgxZSwweDBmLDB4YTEsMHg4ZSwKLTB4MWUsMHgxNiwweDA2LDB4NjYsMHg2NCwweGZmLDB4MmUsMHgxMCwweDA2LDB4NjYsMHg4OSwweGYwLDB4NjYsMHgyNSwweGZmLDB4MDEsCi0weDAwLDB4MDAsMHg2NiwweDAxLDB4YzEsMHgyOSwweGM2LDB4NjYsMHgyOSwweGM3LDB4NjYsMHg4OSwweDBlLDB4MjYsMHgwNiwweDY2LAotMHg4OSwweDNlLDB4MjIsMHgwNiwweGU4LDB4ZmUsMHgwMCwweDg5LDB4MzYsMHgzZSwweDA2LDB4NjYsMHhjMSwweGVlLDB4MTAsMHg4OSwKLTB4MzYsMHg0MiwweDA2LDB4OGIsMHgxZSwweDA2LDB4MDYsMHg4OSwweDFlLDB4M2EsMHgwNiwweGM3LDB4MDYsMHg0NiwweDA2LDB4MDAsCi0weDQyLDB4ZTgsMHhmMiwweDAwLDB4YTEsMHgxYywweDA2LDB4YTMsMHg0ZSwweDA2LDB4YzcsMHgwNiwweDNlLDB4MDYsMHgwMCwweDAwLAotMHhjNiwweDA2LDB4NDcsMHgwNiwweDNmLDB4YTEsMHgyOCwweDA2LDB4MDksMHhjMCwweDc1LDB4MDksMHhhMSwweDI2LDB4MDYsMHgzYiwKLTB4MDYsMHgyMCwweDA2LDB4NzYsMHgwMywweGExLDB4MjAsMHgwNiwweGEzLDB4NDIsMHgwNiwweGU4LDB4YzgsMHgwMCwweDY2LDB4MzEsCi0weGM5LDB4OGIsMHgwZSwweDQ2LDB4MDYsMHg2NiwweDhiLDB4M2UsMHgyMiwweDA2LDB4NjYsMHgwMSwweDBlLDB4MjIsMHgwNiwweDY2LAotMHgyOSwweDBlLDB4MjYsMHgwNiwweDY2LDB4MzEsMHhmNiwweGMxLDB4ZTksMHgwMiwweDFlLDB4MDYsMHg4ZSwweDA2LDB4MTYsMHgwNiwKLTB4OGUsMHgxZSwweDFlLDB4MDYsMHg2NywweGYzLDB4NjYsMHhhNSwweDA3LDB4MWYsMHg2NiwweDAzLDB4MGUsMHgyNiwweDA2LDB4NzUsCi0weGFmLDB4YzMsMHgzYywweDNhLDB4NzQsMHgwNiwweDNjLDB4MmYsMHg3NCwweDAyLDB4M2MsMHg1YywweGMzLDB4YmUsMHg2NCwweDA3LAotMHg4OSwweGYzLDB4MjYsMHg4YSwweDA1LDB4NDcsMHg4OCwweDA0LDB4MzgsMHhlMCwweDc0LDB4MGUsMHgwOCwweGMwLDB4NzQsMHgwYSwKLTB4NDYsMHhlOCwweGRlLDB4ZmYsMHg3NSwweGVjLDB4ODksMHhmMywweDc0LDB4ZTgsMHhjMywweGJhLDB4MjYsMHgwNSwweGViLDB4MDgsCi0weGJhLDB4MzQsMHgwNSwweGViLDB4MDMsMHhiYSwweDNlLDB4MDUsMHg1MiwweDhiLDB4MWUsMHg2MiwweDA3LDB4YzYsMHgwNywweDI0LAotMHhiYiwweDY0LDB4MDcsMHhlYiwweDFlLDB4ZTgsMHhlZCwweDAwLDB4YmEsMHg3OCwweDA1LDB4ZWIsMHgxMiwweGJhLDB4OTEsMHgwNSwKLTB4ZWIsMHgwZCwweGJhLDB4YTMsMHgwNSwweGViLDB4MDgsMHhiYSwweGI1LDB4MDUsMHhlYiwweDAzLDB4YmEsMHg3OCwweDA1LDB4NTIsCi0weGJiLDB4MTksMHgwNSwweGU4LDB4MTQsMHgwMCwweDViLDB4ZTgsMHgxMCwweDAwLDB4YmIsMHg0MiwweDA0LDB4ZTgsMHgwYSwweDAwLAotMHhiOCwweGZmLDB4NGMsMHhjZCwweDIxLDB4NDMsMHhiNCwweDAyLDB4Y2QsMHgyMSwweDhhLDB4MTcsMHg4MCwweGZhLDB4MjQsMHg3NSwKLTB4ZjQsMHhjMywweDBkLDB4MGEsMHgyNCwweDUwLDB4NTEsMHg1NywweDMxLDB4YzAsMHhiZiwweDJhLDB4MDYsMHhiOSwweDE5LDB4MDAsCi0weGYzLDB4YWIsMHg1ZiwweDU5LDB4NTgsMHhjMywweGI4LDB4MDAsMHgwMywweGJiLDB4MjEsMHgwMCwweDMxLDB4YzksMHg2NiwweGJmLAotMHgyYSwweDA2LDB4MDAsMHgwMCwweGNkLDB4MzEsMHhjMywweDAwLDB4MDAsMHgzMCwweGU0LDB4ZTgsMHg1ZiwweGZmLDB4ODksMHhkZSwKLTB4OGIsMHgzZSwweDY3LDB4MDQsMHhlYiwweDE4LDB4YjQsMHgzYiwweGU4LDB4NTIsMHhmZiwweDgxLDB4ZmUsMHg2NCwweDA3LDB4NzQsCi0weDEzLDB4OGEsMHg4NCwweGZmLDB4ZmYsMHhlOCwweDNhLDB4ZmYsMHg3NCwweDA0LDB4YzYsMHgwNCwweDVjLDB4NDYsMHhlOCwweDAzLAotMHgwMCwweDcyLDB4ZTMsMHhjMywweGU4LDB4MzYsMHgwMCwweGJiLDB4NDQsMHgwMCwweDhhLDB4MDcsMHg4OCwweDA0LDB4NDMsMHg0NiwKLTB4MDgsMHhjMCwweDc1LDB4ZjYsMHgwNiwweDU3LDB4MWUsMHgwNywweGU4LDB4OWEsMHhmZiwweGJiLDB4MmEsMHgwNiwweDhjLDB4OWYsCi0weDA0LDB4MDAsMHg4OSwweDlmLDB4MDIsMHgwMCwweGJhLDB4NjQsMHgwNywweGI4LDB4MDAsMHg0YiwweGNkLDB4MjEsMHg1ZiwweDA3LAotMHg3MiwweDA5LDB4YjQsMHg0ZCwweGNkLDB4MjEsMHgyZCwweDAwLDB4MDMsMHhmNywweGQ4LDB4ZWIsMHgyOCwweDgwLDB4M2UsMHg2OSwKLTB4MDgsMHgwNSwweDcyLDB4MjAsMHhiOCwweDAwLDB4NTgsMHhjZCwweDIxLDB4YTIsMHg2NywweDA4LDB4YjgsMHgwMiwweDU4LDB4Y2QsCi0weDIxLDB4YTIsMHg2OCwweDA4LDB4YjgsMHgwMSwweDU4LDB4YmIsMHg4MCwweDAwLDB4Y2QsMHgyMSwweGI4LDB4MDMsMHg1OCwweGJiLAotMHgwMSwweDAwLDB4Y2QsMHgyMSwweGMzLDB4OWMsMHg4MCwweDNlLDB4NjksMHgwOCwweDA1LDB4NzIsMHgxYSwweDUwLDB4NTMsMHhiOCwKLTB4MDMsMHg1OCwweDhhLDB4MWUsMHg2OCwweDA4LDB4MzAsMHhmZiwweGNkLDB4MjEsMHhiOCwweDAxLDB4NTgsMHg4YSwweDFlLDB4NjcsCi0weDA4LDB4MzAsMHhmZiwweGNkLDB4MjEsMHg1YiwweDU4LDB4OWQsMHhjMywweDRjLDB4NmYsMHg2MSwweDY0LDB4MjAsMHg2NSwweDcyLAotMHg3MiwweDZmLDB4NzIsMHgzYSwweDIwLDB4MjQsMHgzYSwweDIwLDB4NjMsMHg2MSwweDZlLDB4NmUsMHg2ZiwweDc0LDB4MjAsMHg2ZiwKLTB4NzAsMHg2NSwweDZlLDB4MjQsMHgzYSwweDIwLDB4NmUsMHg2ZiwweDc0LDB4MjAsMHg0NSwweDU4LDB4NDUsMHgyNCwweDNhLDB4MjAsCi0weDZlLDB4NmYsMHg3NCwweDIwLDB4NDMsMHg0ZiwweDQ2LDB4NDYsMHgyMCwweDI4LDB4NDMsMHg2OCwweDY1LDB4NjMsMHg2YiwweDIwLAotMHg2NiwweDZmLDB4NzIsMHgyMCwweDc2LDB4NjksMHg3MiwweDc1LDB4NzMsMHg2NSwweDczLDB4MjksMHgyNCwweDZlLDB4NmYsMHgyMCwKLTB4NDQsMHg1MCwweDRkLDB4NDksMHgyMCwweDJkLDB4MjAsMHg0NywweDY1LDB4NzQsMHgyMCwweDYzLDB4NzMsMHg2NCwweDcwLDB4NmQsCi0weDY5LDB4MmEsMHg2MiwweDJlLDB4N2EsMHg2OSwweDcwLDB4MjQsMHg2ZSwweDZmLDB4MjAsMHg0NCwweDRmLDB4NTMsMHgyMCwweDZkLAotMHg2NSwweDZkLDB4NmYsMHg3MiwweDc5LDB4MjQsMHg2ZSwweDY1LDB4NjUsMHg2NCwweDIwLDB4NDQsMHg0ZiwweDUzLDB4MjAsMHgzMywKLTB4MjQsMHg2MywweDYxLDB4NmUsMHgyNywweDc0LDB4MjAsMHg3MywweDc3LDB4NjksMHg3NCwweDYzLDB4NjgsMHgyMCwweDZkLDB4NmYsCi0weDY0LDB4NjUsMHgyNCwweDZlLDB4NmYsMHgyMCwweDQ0LDB4NTAsMHg0ZCwweDQ5LDB4MjAsMHg3MywweDY1LDB4NmMsMHg2NSwweDYzLAotMHg3NCwweDZmLDB4NzIsMHg3MywweDI0LDB4NmUsMHg2ZiwweDIwLDB4NDQsMHg1MCwweDRkLDB4NDksMHgyMCwweDZkLDB4NjUsMHg2ZCwKLTB4NmYsMHg3MiwweDc5LDB4MjQsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsCi0weDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLAotMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwKLTB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAKZGlmZiAtLWdpdCBhL2JmZC9oYXNoLmMgYi9iZmQvaGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzZlOTg3Li4wMDAwMDAwCi0tLSBhL2JmZC9oYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MzQgKzAsMCBAQAotLyogaGFzaC5jIC0tIGhhc2ggdGFibGUgcm91dGluZXMgZm9yIEJGRAotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAib2JqYWxsb2MuaCIKLQotLyoKLVNFQ1RJT04KLQlIYXNoIFRhYmxlcwotCi1AY2luZGV4IEhhc2ggdGFibGVzCi0JQkZEIHByb3ZpZGVzIGEgc2ltcGxlIHNldCBvZiBoYXNoIHRhYmxlIGZ1bmN0aW9ucy4gIFJvdXRpbmVzCi0JYXJlIHByb3ZpZGVkIHRvIGluaXRpYWxpemUgYSBoYXNoIHRhYmxlLCB0byBmcmVlIGEgaGFzaCB0YWJsZSwKLQl0byBsb29rIHVwIGEgc3RyaW5nIGluIGEgaGFzaCB0YWJsZSBhbmQgb3B0aW9uYWxseSBjcmVhdGUgYW4KLQllbnRyeSBmb3IgaXQsIGFuZCB0byB0cmF2ZXJzZSBhIGhhc2ggdGFibGUuICBUaGVyZSBpcwotCWN1cnJlbnRseSBubyByb3V0aW5lIHRvIGRlbGV0ZSBhbiBzdHJpbmcgZnJvbSBhIGhhc2ggdGFibGUuCi0KLQlUaGUgYmFzaWMgaGFzaCB0YWJsZSBkb2VzIG5vdCBwZXJtaXQgYW55IGRhdGEgdG8gYmUgc3RvcmVkCi0Jd2l0aCBhIHN0cmluZy4gIEhvd2V2ZXIsIGEgaGFzaCB0YWJsZSBpcyBkZXNpZ25lZCB0byBwcmVzZW50IGEKLQliYXNlIGNsYXNzIGZyb20gd2hpY2ggb3RoZXIgdHlwZXMgb2YgaGFzaCB0YWJsZXMgbWF5IGJlCi0JZGVyaXZlZC4gIFRoZXNlIGRlcml2ZWQgdHlwZXMgbWF5IHN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLQl3aXRoIHRoZSBzdHJpbmcuICBIYXNoIHRhYmxlcyB3ZXJlIGltcGxlbWVudGVkIGluIHRoaXMgd2F5LAotCXJhdGhlciB0aGFuIHNpbXBseSBwcm92aWRpbmcgYSBkYXRhIHBvaW50ZXIgaW4gYSBoYXNoIHRhYmxlCi0JZW50cnksIGJlY2F1c2UgdGhleSB3ZXJlIGRlc2lnbmVkIGZvciB1c2UgYnkgdGhlIGxpbmtlciBiYWNrCi0JZW5kcy4gIFRoZSBsaW5rZXIgbWF5IGNyZWF0ZSB0aG91c2FuZHMgb2YgaGFzaCB0YWJsZSBlbnRyaWVzLAotCWFuZCB0aGUgb3ZlcmhlYWQgb2YgYWxsb2NhdGluZyBwcml2YXRlIGRhdGEgYW5kIHN0b3JpbmcgYW5kCi0JZm9sbG93aW5nIHBvaW50ZXJzIGJlY29tZXMgbm90aWNlYWJsZS4KLQotCVRoZSBiYXNpYyBoYXNoIHRhYmxlIGNvZGUgaXMgaW4gPDxoYXNoLmM+Pi4KLQotQG1lbnUKLUAqIENyZWF0aW5nIGFuZCBGcmVlaW5nIGEgSGFzaCBUYWJsZTo6Ci1AKiBMb29raW5nIFVwIG9yIEVudGVyaW5nIGEgU3RyaW5nOjoKLUAqIFRyYXZlcnNpbmcgYSBIYXNoIFRhYmxlOjoKLUAqIERlcml2aW5nIGEgTmV3IEhhc2ggVGFibGUgVHlwZTo6Ci1AZW5kIG1lbnUKLQotSU5PREUKLUNyZWF0aW5nIGFuZCBGcmVlaW5nIGEgSGFzaCBUYWJsZSwgTG9va2luZyBVcCBvciBFbnRlcmluZyBhIFN0cmluZywgSGFzaCBUYWJsZXMsIEhhc2ggVGFibGVzCi1TVUJTRUNUSU9OCi0JQ3JlYXRpbmcgYW5kIGZyZWVpbmcgYSBoYXNoIHRhYmxlCi0KLUBmaW5kZXggYmZkX2hhc2hfdGFibGVfaW5pdAotQGZpbmRleCBiZmRfaGFzaF90YWJsZV9pbml0X24KLQlUbyBjcmVhdGUgYSBoYXNoIHRhYmxlLCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSA8PHN0cnVjdAotCWJmZF9oYXNoX3RhYmxlPj4gKGRlZmluZWQgaW4gPDxiZmQuaD4+KSBhbmQgY2FsbAotCTw8YmZkX2hhc2hfdGFibGVfaW5pdD4+IChpZiB5b3Uga25vdyBhcHByb3hpbWF0ZWx5IGhvdyBtYW55Ci0JZW50cmllcyB5b3Ugd2lsbCBuZWVkLCB0aGUgZnVuY3Rpb24gPDxiZmRfaGFzaF90YWJsZV9pbml0X24+PiwKLQl3aGljaCB0YWtlcyBhIEB2YXJ7c2l6ZX0gYXJndW1lbnQsIG1heSBiZSB1c2VkKS4KLQk8PGJmZF9oYXNoX3RhYmxlX2luaXQ+PiByZXR1cm5zIDw8ZmFsc2U+PiBpZiBzb21lIHNvcnQgb2YKLQllcnJvciBvY2N1cnMuCi0KLUBmaW5kZXggYmZkX2hhc2hfbmV3ZnVuYwotCVRoZSBmdW5jdGlvbiA8PGJmZF9oYXNoX3RhYmxlX2luaXQ+PiB0YWtlIGFzIGFuIGFyZ3VtZW50IGEKLQlmdW5jdGlvbiB0byB1c2UgdG8gY3JlYXRlIG5ldyBlbnRyaWVzLiAgRm9yIGEgYmFzaWMgaGFzaAotCXRhYmxlLCB1c2UgdGhlIGZ1bmN0aW9uIDw8YmZkX2hhc2hfbmV3ZnVuYz4+LiAgQHhyZWZ7RGVyaXZpbmcKLQlhIE5ldyBIYXNoIFRhYmxlIFR5cGV9IGZvciB3aHkgeW91IHdvdWxkIHdhbnQgdG8gdXNlIGEKLQlkaWZmZXJlbnQgdmFsdWUgZm9yIHRoaXMgYXJndW1lbnQuCi0KLUBmaW5kZXggYmZkX2hhc2hfYWxsb2NhdGUKLQk8PGJmZF9oYXNoX3RhYmxlX2luaXQ+PiB3aWxsIGNyZWF0ZSBhbiBvYmphbGxvYyB3aGljaCB3aWxsIGJlCi0JdXNlZCB0byBhbGxvY2F0ZSBuZXcgZW50cmllcy4gIFlvdSBtYXkgYWxsb2NhdGUgbWVtb3J5IG9uIHRoaXMKLQlvYmphbGxvYyB1c2luZyA8PGJmZF9oYXNoX2FsbG9jYXRlPj4uCi0KLUBmaW5kZXggYmZkX2hhc2hfdGFibGVfZnJlZQotCVVzZSA8PGJmZF9oYXNoX3RhYmxlX2ZyZWU+PiB0byBmcmVlIHVwIGFsbCB0aGUgbWVtb3J5IHRoYXQgaGFzCi0JYmVlbiBhbGxvY2F0ZWQgZm9yIGEgaGFzaCB0YWJsZS4gIFRoaXMgd2lsbCBub3QgZnJlZSB1cCB0aGUKLQk8PHN0cnVjdCBiZmRfaGFzaF90YWJsZT4+IGl0c2VsZiwgd2hpY2ggeW91IG11c3QgcHJvdmlkZS4KLQotSU5PREUKLUxvb2tpbmcgVXAgb3IgRW50ZXJpbmcgYSBTdHJpbmcsIFRyYXZlcnNpbmcgYSBIYXNoIFRhYmxlLCBDcmVhdGluZyBhbmQgRnJlZWluZyBhIEhhc2ggVGFibGUsIEhhc2ggVGFibGVzCi1TVUJTRUNUSU9OCi0JTG9va2luZyB1cCBvciBlbnRlcmluZyBhIHN0cmluZwotCi1AZmluZGV4IGJmZF9oYXNoX2xvb2t1cAotCVRoZSBmdW5jdGlvbiA8PGJmZF9oYXNoX2xvb2t1cD4+IGlzIHVzZWQgYm90aCB0byBsb29rIHVwIGEKLQlzdHJpbmcgaW4gdGhlIGhhc2ggdGFibGUgYW5kIHRvIGNyZWF0ZSBhIG5ldyBlbnRyeS4KLQotCUlmIHRoZSBAdmFye2NyZWF0ZX0gYXJndW1lbnQgaXMgPDxmYWxzZT4+LCA8PGJmZF9oYXNoX2xvb2t1cD4+Ci0Jd2lsbCBsb29rIHVwIGEgc3RyaW5nLiAgSWYgdGhlIHN0cmluZyBpcyBmb3VuZCwgaXQgd2lsbAotCXJldHVybnMgYSBwb2ludGVyIHRvIGEgPDxzdHJ1Y3QgYmZkX2hhc2hfZW50cnk+Pi4gIElmIHRoZQotCXN0cmluZyBpcyBub3QgZm91bmQgaW4gdGhlIHRhYmxlIDw8YmZkX2hhc2hfbG9va3VwPj4gd2lsbAotCXJldHVybiA8PE5VTEw+Pi4gIFlvdSBzaG91bGQgbm90IG1vZGlmeSBhbnkgb2YgdGhlIGZpZWxkcyBpbgotCXRoZSByZXR1cm5zIDw8c3RydWN0IGJmZF9oYXNoX2VudHJ5Pj4uCi0KLQlJZiB0aGUgQHZhcntjcmVhdGV9IGFyZ3VtZW50IGlzIDw8dHJ1ZT4+LCB0aGUgc3RyaW5nIHdpbGwgYmUKLQllbnRlcmVkIGludG8gdGhlIGhhc2ggdGFibGUgaWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmUuCi0JRWl0aGVyIHdheSBhIHBvaW50ZXIgdG8gYSA8PHN0cnVjdCBiZmRfaGFzaF9lbnRyeT4+IHdpbGwgYmUKLQlyZXR1cm5lZCwgZWl0aGVyIHRvIHRoZSBleGlzdGluZyBzdHJ1Y3R1cmUgb3IgdG8gYSBuZXdseQotCWNyZWF0ZWQgb25lLiAgSW4gdGhpcyBjYXNlLCBhIDw8TlVMTD4+IHJldHVybiBtZWFucyB0aGF0IGFuCi0JZXJyb3Igb2NjdXJyZWQuCi0KLQlJZiB0aGUgQHZhcntjcmVhdGV9IGFyZ3VtZW50IGlzIDw8dHJ1ZT4+LCBhbmQgYSBuZXcgZW50cnkgaXMKLQljcmVhdGVkLCB0aGUgQHZhcntjb3B5fSBhcmd1bWVudCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRvCi0JY29weSB0aGUgc3RyaW5nIG9udG8gdGhlIGhhc2ggdGFibGUgb2JqYWxsb2Mgb3Igbm90LiAgSWYKLQlAdmFye2NvcHl9IGlzIHBhc3NlZCBhcyA8PGZhbHNlPj4sIHlvdSBtdXN0IGJlIGNhcmVmdWwgbm90IHRvCi0JZGVhbGxvY2F0ZSBvciBtb2RpZnkgdGhlIHN0cmluZyBhcyBsb25nIGFzIHRoZSBoYXNoIHRhYmxlCi0JZXhpc3RzLgotCi1JTk9ERQotVHJhdmVyc2luZyBhIEhhc2ggVGFibGUsIERlcml2aW5nIGEgTmV3IEhhc2ggVGFibGUgVHlwZSwgTG9va2luZyBVcCBvciBFbnRlcmluZyBhIFN0cmluZywgSGFzaCBUYWJsZXMKLVNVQlNFQ1RJT04KLQlUcmF2ZXJzaW5nIGEgaGFzaCB0YWJsZQotCi1AZmluZGV4IGJmZF9oYXNoX3RyYXZlcnNlCi0JVGhlIGZ1bmN0aW9uIDw8YmZkX2hhc2hfdHJhdmVyc2U+PiBtYXkgYmUgdXNlZCB0byB0cmF2ZXJzZSBhCi0JaGFzaCB0YWJsZSwgY2FsbGluZyBhIGZ1bmN0aW9uIG9uIGVhY2ggZWxlbWVudC4gIFRoZSB0cmF2ZXJzYWwKLQlpcyBkb25lIGluIGEgcmFuZG9tIG9yZGVyLgotCi0JPDxiZmRfaGFzaF90cmF2ZXJzZT4+IHRha2VzIGFzIGFyZ3VtZW50cyBhIGZ1bmN0aW9uIGFuZCBhCi0JZ2VuZXJpYyA8PHZvaWQgKj4+IHBvaW50ZXIuICBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYQotCWhhc2ggdGFibGUgZW50cnkgKGEgPDxzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKj4+KSBhbmQgdGhlCi0JZ2VuZXJpYyBwb2ludGVyIHBhc3NlZCB0byA8PGJmZF9oYXNoX3RyYXZlcnNlPj4uICBUaGUgZnVuY3Rpb24KLQltdXN0IHJldHVybiBhIDw8Ym9vbGVhbj4+IHZhbHVlLCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0bwotCWNvbnRpbnVlIHRyYXZlcnNpbmcgdGhlIGhhc2ggdGFibGUuICBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucwotCTw8ZmFsc2U+PiwgPDxiZmRfaGFzaF90cmF2ZXJzZT4+IHdpbGwgc3RvcCB0aGUgdHJhdmVyc2FsIGFuZAotCXJldHVybiBpbW1lZGlhdGVseS4KLQotSU5PREUKLURlcml2aW5nIGEgTmV3IEhhc2ggVGFibGUgVHlwZSwgLCBUcmF2ZXJzaW5nIGEgSGFzaCBUYWJsZSwgSGFzaCBUYWJsZXMKLVNVQlNFQ1RJT04KLQlEZXJpdmluZyBhIG5ldyBoYXNoIHRhYmxlIHR5cGUKLQotCU1hbnkgdXNlcyBvZiBoYXNoIHRhYmxlcyB3YW50IHRvIHN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLQl3aGljaCBlYWNoIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLiAgU29tZSBhbHNvIGZpbmQgaXQKLQljb252ZW5pZW50IHRvIHN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2l0aCB0aGUgaGFzaCB0YWJsZQotCWl0c2VsZi4gIFRoaXMgbWF5IGJlIGRvbmUgdXNpbmcgYSBkZXJpdmVkIGhhc2ggdGFibGUuCi0KLQlTaW5jZSBDIGlzIG5vdCBhbiBvYmplY3Qgb3JpZW50ZWQgbGFuZ3VhZ2UsIGNyZWF0aW5nIGEgZGVyaXZlZAotCWhhc2ggdGFibGUgcmVxdWlyZXMgc3RpY2tpbmcgdG9nZXRoZXIgc29tZSBib2lsZXJwbGF0ZQotCXJvdXRpbmVzIHdpdGggYSBmZXcgZGlmZmVyZW5jZXMgc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgaGFzaAotCXRhYmxlIHlvdSB3YW50IHRvIGNyZWF0ZS4KLQotCUFuIGV4YW1wbGUgb2YgYSBkZXJpdmVkIGhhc2ggdGFibGUgaXMgdGhlIGxpbmtlciBoYXNoIHRhYmxlLgotCVRoZSBzdHJ1Y3R1cmVzIGZvciB0aGlzIGFyZSBkZWZpbmVkIGluIDw8YmZkbGluay5oPj4uICBUaGUKLQlmdW5jdGlvbnMgYXJlIGluIDw8bGlua2VyLmM+Pi4KLQotCVlvdSBtYXkgYWxzbyBkZXJpdmUgYSBoYXNoIHRhYmxlIGZyb20gYW4gYWxyZWFkeSBkZXJpdmVkIGhhc2gKLQl0YWJsZS4gIEZvciBleGFtcGxlLCB0aGUgYS5vdXQgbGlua2VyIGJhY2tlbmQgY29kZSB1c2VzIGEgaGFzaAotCXRhYmxlIGRlcml2ZWQgZnJvbSB0aGUgbGlua2VyIGhhc2ggdGFibGUuCi0KLUBtZW51Ci1AKiBEZWZpbmUgdGhlIERlcml2ZWQgU3RydWN0dXJlczo6Ci1AKiBXcml0ZSB0aGUgRGVyaXZlZCBDcmVhdGlvbiBSb3V0aW5lOjoKLUAqIFdyaXRlIE90aGVyIERlcml2ZWQgUm91dGluZXM6OgotQGVuZCBtZW51Ci0KLUlOT0RFCi1EZWZpbmUgdGhlIERlcml2ZWQgU3RydWN0dXJlcywgV3JpdGUgdGhlIERlcml2ZWQgQ3JlYXRpb24gUm91dGluZSwgRGVyaXZpbmcgYSBOZXcgSGFzaCBUYWJsZSBUeXBlLCBEZXJpdmluZyBhIE5ldyBIYXNoIFRhYmxlIFR5cGUKLVNVQlNVQlNFQ1RJT04KLQlEZWZpbmUgdGhlIGRlcml2ZWQgc3RydWN0dXJlcwotCi0JWW91IG11c3QgZGVmaW5lIGEgc3RydWN0dXJlIGZvciBhbiBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSwKLQlhbmQgYSBzdHJ1Y3R1cmUgZm9yIHRoZSBoYXNoIHRhYmxlIGl0c2VsZi4KLQotCVRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgc3RydWN0dXJlIGZvciBhbiBlbnRyeSBpbiB0aGUgaGFzaAotCXRhYmxlIG11c3QgYmUgb2YgdGhlIHR5cGUgdXNlZCBmb3IgYW4gZW50cnkgaW4gdGhlIGhhc2ggdGFibGUKLQl5b3UgYXJlIGRlcml2aW5nIGZyb20uICBJZiB5b3UgYXJlIGRlcml2aW5nIGZyb20gYSBiYXNpYyBoYXNoCi0JdGFibGUgdGhpcyBpcyA8PHN0cnVjdCBiZmRfaGFzaF9lbnRyeT4+LCB3aGljaCBpcyBkZWZpbmVkIGluCi0JPDxiZmQuaD4+LiAgVGhlIGZpcnN0IGZpZWxkIGluIHRoZSBzdHJ1Y3R1cmUgZm9yIHRoZSBoYXNoCi0JdGFibGUgaXRzZWxmIG11c3QgYmUgb2YgdGhlIHR5cGUgb2YgdGhlIGhhc2ggdGFibGUgeW91IGFyZQotCWRlcml2aW5nIGZyb20gaXRzZWxmLiAgSWYgeW91IGFyZSBkZXJpdmluZyBmcm9tIGEgYmFzaWMgaGFzaAotCXRhYmxlLCB0aGlzIGlzIDw8c3RydWN0IGJmZF9oYXNoX3RhYmxlPj4uCi0KLQlGb3IgZXhhbXBsZSwgdGhlIGxpbmtlciBoYXNoIHRhYmxlIGRlZmluZXMgPDxzdHJ1Y3QKLQliZmRfbGlua19oYXNoX2VudHJ5Pj4gKGluIDw8YmZkbGluay5oPj4pLiAgVGhlIGZpcnN0IGZpZWxkLAotCTw8cm9vdD4+LCBpcyBvZiB0eXBlIDw8c3RydWN0IGJmZF9oYXNoX2VudHJ5Pj4uICBTaW1pbGFybHksCi0JdGhlIGZpcnN0IGZpZWxkIGluIDw8c3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGU+PiwgPDx0YWJsZT4+LAotCWlzIG9mIHR5cGUgPDxzdHJ1Y3QgYmZkX2hhc2hfdGFibGU+Pi4KLQotSU5PREUKLVdyaXRlIHRoZSBEZXJpdmVkIENyZWF0aW9uIFJvdXRpbmUsIFdyaXRlIE90aGVyIERlcml2ZWQgUm91dGluZXMsIERlZmluZSB0aGUgRGVyaXZlZCBTdHJ1Y3R1cmVzLCBEZXJpdmluZyBhIE5ldyBIYXNoIFRhYmxlIFR5cGUKLVNVQlNVQlNFQ1RJT04KLQlXcml0ZSB0aGUgZGVyaXZlZCBjcmVhdGlvbiByb3V0aW5lCi0KLQlZb3UgbXVzdCB3cml0ZSBhIHJvdXRpbmUgd2hpY2ggd2lsbCBjcmVhdGUgYW5kIGluaXRpYWxpemUgYW4KLQllbnRyeSBpbiB0aGUgaGFzaCB0YWJsZS4gIFRoaXMgcm91dGluZSBpcyBwYXNzZWQgYXMgdGhlCi0JZnVuY3Rpb24gYXJndW1lbnQgdG8gPDxiZmRfaGFzaF90YWJsZV9pbml0Pj4uCi0KLQlJbiBvcmRlciB0byBwZXJtaXQgb3RoZXIgaGFzaCB0YWJsZXMgdG8gYmUgZGVyaXZlZCBmcm9tIHRoZQotCWhhc2ggdGFibGUgeW91IGFyZSBjcmVhdGluZywgdGhpcyByb3V0aW5lIG11c3QgYmUgd3JpdHRlbiBpbiBhCi0Jc3RhbmRhcmQgd2F5LgotCi0JVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBjcmVhdGlvbiByb3V0aW5lIGlzIGEgcG9pbnRlciB0byBhCi0JaGFzaCB0YWJsZSBlbnRyeS4gIFRoaXMgbWF5IGJlIDw8TlVMTD4+LCBpbiB3aGljaCBjYXNlIHRoZQotCXJvdXRpbmUgc2hvdWxkIGFsbG9jYXRlIHRoZSByaWdodCBhbW91bnQgb2Ygc3BhY2UuICBPdGhlcndpc2UKLQl0aGUgc3BhY2UgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYSBoYXNoIHRhYmxlIHR5cGUKLQlkZXJpdmVkIGZyb20gdGhpcyBvbmUuCi0KLQlBZnRlciBhbGxvY2F0aW5nIHNwYWNlLCB0aGUgY3JlYXRpb24gcm91dGluZSBtdXN0IGNhbGwgdGhlCi0JY3JlYXRpb24gcm91dGluZSBvZiB0aGUgaGFzaCB0YWJsZSB0eXBlIGl0IGlzIGRlcml2ZWQgZnJvbSwKLQlwYXNzaW5nIGluIGEgcG9pbnRlciB0byB0aGUgc3BhY2UgaXQganVzdCBhbGxvY2F0ZWQuICBUaGlzCi0Jd2lsbCBpbml0aWFsaXplIGFueSBmaWVsZHMgdXNlZCBieSB0aGUgYmFzZSBoYXNoIHRhYmxlLgotCi0JRmluYWxseSB0aGUgY3JlYXRpb24gcm91dGluZSBtdXN0IGluaXRpYWxpemUgYW55IGxvY2FsIGZpZWxkcwotCWZvciB0aGUgbmV3IGhhc2ggdGFibGUgdHlwZS4KLQotCUhlcmUgaXMgYSBib2lsZXJwbGF0ZSBleGFtcGxlIG9mIGEgY3JlYXRpb24gcm91dGluZS4KLQlAdmFye2Z1bmN0aW9uX25hbWV9IGlzIHRoZSBuYW1lIG9mIHRoZSByb3V0aW5lLgotCUB2YXJ7ZW50cnlfdHlwZX0gaXMgdGhlIHR5cGUgb2YgYW4gZW50cnkgaW4gdGhlIGhhc2ggdGFibGUgeW91Ci0JYXJlIGNyZWF0aW5nLiAgQHZhcntiYXNlX25ld2Z1bmN9IGlzIHRoZSBuYW1lIG9mIHRoZSBjcmVhdGlvbgotCXJvdXRpbmUgb2YgdGhlIGhhc2ggdGFibGUgdHlwZSB5b3VyIGhhc2ggdGFibGUgaXMgZGVyaXZlZAotCWZyb20uCi0KLUVYQU1QTEUKLQotLnN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi0uQHZhcntmdW5jdGlvbl9uYW1lfSAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0uICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotLiAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLS4gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLS57Ci0uICBzdHJ1Y3QgQHZhcntlbnRyeV90eXBlfSAqcmV0ID0gKEB2YXJ7ZW50cnlfdHlwZX0gKikgZW50cnk7Ci0uCi0uIHsqIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLS4gICAgZGVyaXZlZCBjbGFzcy4gICp9Ci0uICBpZiAocmV0ID09IChAdmFye2VudHJ5X3R5cGV9ICopIE5VTEwpCi0uICAgIHsKLS4gICAgICByZXQgPSAoKEB2YXJ7ZW50cnlfdHlwZX0gKikKLS4JICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKEB2YXJ7ZW50cnlfdHlwZX0pKSk7Ci0uICAgICAgaWYgKHJldCA9PSAoQHZhcntlbnRyeV90eXBlfSAqKSBOVUxMKQotLiAgICAgICAgcmV0dXJuIE5VTEw7Ci0uICAgIH0KLS4KLS4geyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIGJhc2UgY2xhc3MuICAqfQotLiAgcmV0ID0gKChAdmFye2VudHJ5X3R5cGV9ICopCi0uCSBAdmFye2Jhc2VfbmV3ZnVuY30gKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0uCi0uIHsqIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcyBoZXJlLiAgKn0KLS4KLS4gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLS59Ci0KLURFU0NSSVBUSU9OCi0JVGhlIGNyZWF0aW9uIHJvdXRpbmUgZm9yIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSwgd2hpY2ggaXMgaW4KLQk8PGxpbmtlci5jPj4sIGxvb2tzIGp1c3QgbGlrZSB0aGlzIGV4YW1wbGUuCi0JQHZhcntmdW5jdGlvbl9uYW1lfSBpcyA8PF9iZmRfbGlua19oYXNoX25ld2Z1bmM+Pi4KLQlAdmFye2VudHJ5X3R5cGV9IGlzIDw8c3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnk+Pi4KLQlAdmFye2Jhc2VfbmV3ZnVuY30gaXMgPDxiZmRfaGFzaF9uZXdmdW5jPj4sIHRoZSBjcmVhdGlvbgotCXJvdXRpbmUgZm9yIGEgYmFzaWMgaGFzaCB0YWJsZS4KLQotCTw8X2JmZF9saW5rX2hhc2hfbmV3ZnVuYz4+IGFsc28gaW5pdGlhbGl6ZXMgdGhlIGxvY2FsIGZpZWxkcwotCWluIGEgbGlua2VyIGhhc2ggdGFibGUgZW50cnk6IDw8dHlwZT4+LCA8PHdyaXR0ZW4+PiBhbmQKLQk8PG5leHQ+Pi4KLQotSU5PREUKLVdyaXRlIE90aGVyIERlcml2ZWQgUm91dGluZXMsICwgV3JpdGUgdGhlIERlcml2ZWQgQ3JlYXRpb24gUm91dGluZSwgRGVyaXZpbmcgYSBOZXcgSGFzaCBUYWJsZSBUeXBlCi1TVUJTVUJTRUNUSU9OCi0JV3JpdGUgb3RoZXIgZGVyaXZlZCByb3V0aW5lcwotCi0JWW91IHdpbGwgd2FudCB0byB3cml0ZSBvdGhlciByb3V0aW5lcyBmb3IgeW91ciBuZXcgaGFzaCB0YWJsZSwKLQlhcyB3ZWxsLiAgCi0KLQlZb3Ugd2lsbCB3YW50IGFuIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgd2hpY2ggY2FsbHMgdGhlCi0JaW5pdGlhbGl6YXRpb24gcm91dGluZSBvZiB0aGUgaGFzaCB0YWJsZSB5b3UgYXJlIGRlcml2aW5nIGZyb20KLQlhbmQgaW5pdGlhbGl6ZXMgYW55IG90aGVyIGxvY2FsIGZpZWxkcy4gIEZvciB0aGUgbGlua2VyIGhhc2gKLQl0YWJsZSwgdGhpcyBpcyA8PF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQ+PiBpbiA8PGxpbmtlci5jPj4uCi0KLQlZb3Ugd2lsbCB3YW50IGEgbG9va3VwIHJvdXRpbmUgd2hpY2ggY2FsbHMgdGhlIGxvb2t1cCByb3V0aW5lCi0Jb2YgdGhlIGhhc2ggdGFibGUgeW91IGFyZSBkZXJpdmluZyBmcm9tIGFuZCBjYXN0cyB0aGUgcmVzdWx0LgotCVRoZSBsaW5rZXIgaGFzaCB0YWJsZSB1c2VzIDw8YmZkX2xpbmtfaGFzaF9sb29rdXA+PiBpbgotCTw8bGlua2VyLmM+PiAodGhpcyBhY3R1YWxseSB0YWtlcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoaWNoCi0JaXQgdXNlcyB0byBkZWNpZGUgaG93IHRvIHJldHVybiB0aGUgbG9va2VkIHVwIHZhbHVlKS4KLQotCVlvdSBtYXkgd2FudCBhIHRyYXZlcnNhbCByb3V0aW5lLiAgVGhpcyBzaG91bGQganVzdCBjYWxsIHRoZQotCXRyYXZlcnNhbCByb3V0aW5lIG9mIHRoZSBoYXNoIHRhYmxlIHlvdSBhcmUgZGVyaXZpbmcgZnJvbSB3aXRoCi0JYXBwcm9wcmlhdGUgY2FzdHMuICBUaGUgbGlua2VyIGhhc2ggdGFibGUgdXNlcwotCTw8YmZkX2xpbmtfaGFzaF90cmF2ZXJzZT4+IGluIDw8bGlua2VyLmM+Pi4KLQotCVRoZXNlIHJvdXRpbmVzIG1heSBzaW1wbHkgYmUgZGVmaW5lZCBhcyBtYWNyb3MuICBGb3IgZXhhbXBsZSwKLQl0aGUgYS5vdXQgYmFja2VuZCBsaW5rZXIgaGFzaCB0YWJsZSwgd2hpY2ggaXMgZGVyaXZlZCBmcm9tIHRoZQotCWxpbmtlciBoYXNoIHRhYmxlLCB1c2VzIG1hY3JvcyBmb3IgdGhlIGxvb2t1cCBhbmQgdHJhdmVyc2FsCi0Jcm91dGluZXMuICBUaGVzZSBhcmUgPDxhb3V0X2xpbmtfaGFzaF9sb29rdXA+PiBhbmQKLQk8PGFvdXRfbGlua19oYXNoX3RyYXZlcnNlPj4gaW4gYW91dHguaC4KLSovCi0KLS8qIFRoZSBkZWZhdWx0IG51bWJlciBvZiBlbnRyaWVzIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEgaGFzaCB0YWJsZS4gICovCi0jZGVmaW5lIERFRkFVTFRfU0laRSAoNDA1MSkKLQotLyogQ3JlYXRlIGEgbmV3IGhhc2ggdGFibGUsIGdpdmVuIGEgbnVtYmVyIG9mIGVudHJpZXMuICAqLwotCi1ib29sZWFuCi1iZmRfaGFzaF90YWJsZV9pbml0X24gKHRhYmxlLCBuZXdmdW5jLCBzaXplKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgdW5zaWduZWQgaW50IGFsbG9jOwotCi0gIGFsbG9jID0gc2l6ZSAqIHNpemVvZiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopOwotCi0gIHRhYmxlLT5tZW1vcnkgPSAoUFRSKSBvYmphbGxvY19jcmVhdGUgKCk7Ci0gIGlmICh0YWJsZS0+bWVtb3J5ID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB0YWJsZS0+dGFibGUgPSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKikKLQkJICBvYmphbGxvY19hbGxvYyAoKHN0cnVjdCBvYmphbGxvYyAqKSB0YWJsZS0+bWVtb3J5LCBhbGxvYykpOwotICBpZiAodGFibGUtPnRhYmxlID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBtZW1zZXQgKChQVFIpIHRhYmxlLT50YWJsZSwgMCwgYWxsb2MpOwotICB0YWJsZS0+c2l6ZSA9IHNpemU7Ci0gIHRhYmxlLT5uZXdmdW5jID0gbmV3ZnVuYzsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSBhIG5ldyBoYXNoIHRhYmxlIHdpdGggdGhlIGRlZmF1bHQgbnVtYmVyIG9mIGVudHJpZXMuICAqLwotCi1ib29sZWFuCi1iZmRfaGFzaF90YWJsZV9pbml0ICh0YWJsZSwgbmV3ZnVuYykKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCQljb25zdCBjaGFyICopKTsKLXsKLSAgcmV0dXJuIGJmZF9oYXNoX3RhYmxlX2luaXRfbiAodGFibGUsIG5ld2Z1bmMsIERFRkFVTFRfU0laRSk7Ci19Ci0KLS8qIEZyZWUgYSBoYXNoIHRhYmxlLiAgKi8KLQotdm9pZAotYmZkX2hhc2hfdGFibGVfZnJlZSAodGFibGUpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci17Ci0gIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgdGFibGUtPm1lbW9yeSk7Ci0gIHRhYmxlLT5tZW1vcnkgPSBOVUxMOwotfQotCi0vKiBMb29rIHVwIGEgc3RyaW5nIGluIGEgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1iZmRfaGFzaF9sb29rdXAgKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNyZWF0ZTsKLSAgICAgYm9vbGVhbiBjb3B5OwotewotICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpzOwotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGhhc2g7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBjOwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmhhc2hwOwotICB1bnNpZ25lZCBpbnQgbGVuOwotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0gIAotICBoYXNoID0gMDsKLSAgbGVuID0gMDsKLSAgcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHN0cmluZzsKLSAgd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBoYXNoICs9IGMgKyAoYyA8PCAxNyk7Ci0gICAgICBoYXNoIF49IGhhc2ggPj4gMjsKLSAgICAgICsrbGVuOwotICAgIH0KLSAgaGFzaCArPSBsZW4gKyAobGVuIDw8IDE3KTsKLSAgaGFzaCBePSBoYXNoID4+IDI7Ci0KLSAgaW5kZXggPSBoYXNoICUgdGFibGUtPnNpemU7Ci0gIGZvciAoaGFzaHAgPSB0YWJsZS0+dGFibGVbaW5kZXhdOwotICAgICAgIGhhc2hwICE9IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTDsKLSAgICAgICBoYXNocCA9IGhhc2hwLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChoYXNocC0+aGFzaCA9PSBoYXNoCi0JICAmJiBzdHJjbXAgKGhhc2hwLT5zdHJpbmcsIHN0cmluZykgPT0gMCkKLQlyZXR1cm4gaGFzaHA7Ci0gICAgfQotCi0gIGlmICghIGNyZWF0ZSkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMOwotCi0gIGhhc2hwID0gKCp0YWJsZS0+bmV3ZnVuYykgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCwgdGFibGUsIHN0cmluZyk7Ci0gIGlmIChoYXNocCA9PSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTDsKLSAgaWYgKGNvcHkpCi0gICAgewotICAgICAgY2hhciAqbmV3OwotCi0gICAgICBuZXcgPSAoY2hhciAqKSBvYmphbGxvY19hbGxvYyAoKHN0cnVjdCBvYmphbGxvYyAqKSB0YWJsZS0+bWVtb3J5LAotCQkJCSAgICAgbGVuICsgMSk7Ci0gICAgICBpZiAoIW5ldykKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEw7Ci0JfQotICAgICAgc3RyY3B5IChuZXcsIHN0cmluZyk7Ci0gICAgICBzdHJpbmcgPSBuZXc7Ci0gICAgfQotICBoYXNocC0+c3RyaW5nID0gc3RyaW5nOwotICBoYXNocC0+aGFzaCA9IGhhc2g7Ci0gIGhhc2hwLT5uZXh0ID0gdGFibGUtPnRhYmxlW2luZGV4XTsKLSAgdGFibGUtPnRhYmxlW2luZGV4XSA9IGhhc2hwOwotCi0gIHJldHVybiBoYXNocDsKLX0KLQotLyogUmVwbGFjZSBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUuICAqLwotCi12b2lkCi1iZmRfaGFzaF9yZXBsYWNlICh0YWJsZSwgb2xkLCBudykKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpvbGQ7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqbnc7Ci17Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoqcHBoOwotCi0gIGluZGV4ID0gb2xkLT5oYXNoICUgdGFibGUtPnNpemU7Ci0gIGZvciAocHBoID0gJnRhYmxlLT50YWJsZVtpbmRleF07Ci0gICAgICAgKCpwcGgpICE9IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTDsKLSAgICAgICBwcGggPSAmKCpwcGgpLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgqcHBoID09IG9sZCkKLQl7Ci0JICAqcHBoID0gbnc7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBhYm9ydCAoKTsKLX0KLQotLyogQmFzZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgbmV3IGhhc2ggdGFibGUgZW50cnkuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1iZmRfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBpZiAoZW50cnkgPT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIGVudHJ5ID0gKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikKLQkgICAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkpKSk7Ci0gIHJldHVybiBlbnRyeTsKLX0KLQotLyogQWxsb2NhdGUgc3BhY2UgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLQotUFRSCi1iZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemUpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBQVFIgcmV0OwotCi0gIHJldCA9IG9iamFsbG9jX2FsbG9jICgoc3RydWN0IG9iamFsbG9jICopIHRhYmxlLT5tZW1vcnksIHNpemUpOwotICBpZiAocmV0ID09IE5VTEwgJiYgc2l6ZSAhPSAwKQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBUcmF2ZXJzZSBhIGhhc2ggdGFibGUuICAqLwotCi12b2lkCi1iZmRfaGFzaF90cmF2ZXJzZSAodGFibGUsIGZ1bmMsIGluZm8pCi0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJvb2xlYW4gKCpmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0gICAgIFBUUiBpbmZvOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgdGFibGUtPnNpemU7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnA7Ci0KLSAgICAgIGZvciAocCA9IHRhYmxlLT50YWJsZVtpXTsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAoISAoKmZ1bmMpIChwLCBpbmZvKSkKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci19Ci0MCi0vKiBBIGZldyBkaWZmZXJlbnQgb2JqZWN0IGZpbGUgZm9ybWF0cyAoYS5vdXQsIENPRkYsIEVMRikgdXNlIGEgc3RyaW5nCi0gICB0YWJsZS4gIFRoZXNlIGZ1bmN0aW9ucyBzdXBwb3J0IGFkZGluZyBzdHJpbmdzIHRvIGEgc3RyaW5nIHRhYmxlLAotICAgcmV0dXJuaW5nIHRoZSBieXRlIG9mZnNldCwgYW5kIHdyaXRpbmcgb3V0IHRoZSB0YWJsZS4KLQotICAgUG9zc2libGUgaW1wcm92ZW1lbnRzOgotICAgKyBsb29rIGZvciBzdHJpbmdzIG1hdGNoaW5nIHRyYWlsaW5nIHN1YnN0cmluZ3Mgb2Ygb3RoZXIgc3RyaW5ncwotICAgKyBiZXR0ZXIgZGF0YSBzdHJ1Y3R1cmVzPyAgYmFsYW5jZWQgdHJlZXM/Ci0gICArIGxvb2sgYXQgcmVkdWNpbmcgbWVtb3J5IHVzZSBlbHNld2hlcmUgLS0gbWF5YmUgaWYgd2UgZGlkbid0IGhhdmUKLSAgICAgdG8gY29uc3RydWN0IHRoZSBlbnRpcmUgc3ltYm9sIHRhYmxlIGF0IG9uY2UsIHdlIGNvdWxkIGdldCBieQotICAgICB3aXRoIHNtYWxsZXIgYW1vdW50cyBvZiBWTT8gIChXaGF0IGVmZmVjdCBkb2VzIHRoYXQgaGF2ZSBvbiB0aGUKLSAgICAgc3RyaW5nIHRhYmxlIHJlZHVjdGlvbnM/KSAgKi8KLQotLyogQW4gZW50cnkgaW4gdGhlIHN0cnRhYiBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICAvKiBJbmRleCBpbiBzdHJpbmcgdGFibGUuICAqLwotICBiZmRfc2l6ZV90eXBlIGluZGV4OwotICAvKiBOZXh0IHN0cmluZyBpbiBzdHJ0YWIuICAqLwotICBzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKm5leHQ7Ci19OwotCi0vKiBUaGUgc3RydGFiIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSB0YWJsZTsKLSAgLyogU2l6ZSBvZiBzdHJ0YWItLWFsc28gbmV4dCBhdmFpbGFibGUgaW5kZXguICAqLwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIC8qIEZpcnN0IHN0cmluZyBpbiBzdHJ0YWIuICAqLwotICBzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKmZpcnN0OwotICAvKiBMYXN0IHN0cmluZyBpbiBzdHJ0YWIuICAqLwotICBzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKmxhc3Q7Ci0gIC8qIFdoZXRoZXIgdG8gcHJlY2VkZSBzdHJpbmdzIHdpdGggYSB0d28gYnl0ZSBsZW5ndGgsIGFzIGluIHRoZQotICAgICBYQ09GRiAuZGVidWcgc2VjdGlvbi4gICovCi0gIGJvb2xlYW4geGNvZmY7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpzdHJ0YWJfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGEgc3RydGFiLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1zdHJ0YWJfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+aW5kZXggPSAoYmZkX3NpemVfdHlwZSkgLTE7Ci0gICAgICByZXQtPm5leHQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gc3RydGFiLiAgKi8KLQotI2RlZmluZSBzdHJ0YWJfaGFzaF9sb29rdXAodCwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHQpLT50YWJsZSwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBDcmVhdGUgYSBuZXcgc3RydGFiLiAgKi8KLQotc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqCi1fYmZkX3N0cmluZ3RhYl9pbml0ICgpCi17Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnRhYmxlOwotCi0gIHRhYmxlID0gKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopCi0JICAgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoKSkpOwotICBpZiAodGFibGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnRhYmxlLCBzdHJ0YWJfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBmcmVlICh0YWJsZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgdGFibGUtPnNpemUgPSAwOwotICB0YWJsZS0+Zmlyc3QgPSBOVUxMOwotICB0YWJsZS0+bGFzdCA9IE5VTEw7Ci0gIHRhYmxlLT54Y29mZiA9IGZhbHNlOwotCi0gIHJldHVybiB0YWJsZTsKLX0KLQotLyogQ3JlYXRlIGEgbmV3IHN0cnRhYiBpbiB3aGljaCB0aGUgc3RyaW5ncyBhcmUgb3V0cHV0IGluIHRoZSBmb3JtYXQKLSAgIHVzZWQgaW4gdGhlIFhDT0ZGIC5kZWJ1ZyBzZWN0aW9uOiBhIHR3byBieXRlIGxlbmd0aCBwcmVjZWRlcyBlYWNoCi0gICBzdHJpbmcuICAqLwotCi1zdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICoKLV9iZmRfeGNvZmZfc3RyaW5ndGFiX2luaXQgKCkKLXsKLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqcmV0OwotCi0gIHJldCA9IF9iZmRfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIGlmIChyZXQgIT0gTlVMTCkKLSAgICByZXQtPnhjb2ZmID0gdHJ1ZTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRnJlZSBhIHN0cnRhYi4gICovCi0KLXZvaWQKLV9iZmRfc3RyaW5ndGFiX2ZyZWUgKHRhYmxlKQotICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWJsZTsKLXsKLSAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJnRhYmxlLT50YWJsZSk7Ci0gIGZyZWUgKHRhYmxlKTsKLX0KLQotLyogR2V0IHRoZSBpbmRleCBvZiBhIHN0cmluZyBpbiBhIHN0cnRhYiwgYWRkaW5nIGl0IGlmIGl0IGlzIG5vdAotICAgYWxyZWFkeSBwcmVzZW50LiAgSWYgSEFTSCBpcyBmYWxzZSwgd2UgZG9uJ3QgcmVhbGx5IHVzZSB0aGUgaGFzaAotICAgdGFibGUsIGFuZCB3ZSBkb24ndCBlbGltaW5hdGUgZHVwbGljYXRlIHN0cmluZ3MuICAqLwotCi1iZmRfc2l6ZV90eXBlCi1fYmZkX3N0cmluZ3RhYl9hZGQgKHRhYiwgc3RyLCBoYXNoLCBjb3B5KQotICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWI7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cjsKLSAgICAgYm9vbGVhbiBoYXNoOwotICAgICBib29sZWFuIGNvcHk7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqZW50cnk7Ci0KLSAgaWYgKGhhc2gpCi0gICAgewotICAgICAgZW50cnkgPSBzdHJ0YWJfaGFzaF9sb29rdXAgKHRhYiwgc3RyLCB0cnVlLCBjb3B5KTsKLSAgICAgIGlmIChlbnRyeSA9PSBOVUxMKQotCXJldHVybiAoYmZkX3NpemVfdHlwZSkgLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZW50cnkgPSAoKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKQotCSAgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJnRhYi0+dGFibGUsCi0JCQkJICBzaXplb2YgKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSkpKTsKLSAgICAgIGlmIChlbnRyeSA9PSBOVUxMKQotCXJldHVybiAoYmZkX3NpemVfdHlwZSkgLTE7Ci0gICAgICBpZiAoISBjb3B5KQotCWVudHJ5LT5yb290LnN0cmluZyA9IHN0cjsKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICpuOwotCi0JICBuID0gKGNoYXIgKikgYmZkX2hhc2hfYWxsb2NhdGUgKCZ0YWItPnRhYmxlLCBzdHJsZW4gKHN0cikgKyAxKTsKLQkgIGlmIChuID09IE5VTEwpCi0JICAgIHJldHVybiAoYmZkX3NpemVfdHlwZSkgLTE7Ci0JICBlbnRyeS0+cm9vdC5zdHJpbmcgPSBuOwotCX0KLSAgICAgIGVudHJ5LT5pbmRleCA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLSAgICAgIGVudHJ5LT5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGVudHJ5LT5pbmRleCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0gICAgewotICAgICAgZW50cnktPmluZGV4ID0gdGFiLT5zaXplOwotICAgICAgdGFiLT5zaXplICs9IHN0cmxlbiAoc3RyKSArIDE7Ci0gICAgICBpZiAodGFiLT54Y29mZikKLQl7Ci0JICBlbnRyeS0+aW5kZXggKz0gMjsKLQkgIHRhYi0+c2l6ZSArPSAyOwotCX0KLSAgICAgIGlmICh0YWItPmZpcnN0ID09IE5VTEwpCi0JdGFiLT5maXJzdCA9IGVudHJ5OwotICAgICAgZWxzZQotCXRhYi0+bGFzdC0+bmV4dCA9IGVudHJ5OwotICAgICAgdGFiLT5sYXN0ID0gZW50cnk7Ci0gICAgfQotCi0gIHJldHVybiBlbnRyeS0+aW5kZXg7Ci19Ci0KLS8qIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgc3RydGFiLiAgKi8KLQotYmZkX3NpemVfdHlwZQotX2JmZF9zdHJpbmd0YWJfc2l6ZSAodGFiKQotICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWI7Ci17Ci0gIHJldHVybiB0YWItPnNpemU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN0cnRhYi4gIEFCRkQgbXVzdCBhbHJlYWR5IGJlIGF0IHRoZSByaWdodCBsb2NhdGlvbiBpbgotICAgdGhlIGZpbGUuICAqLwotCi1ib29sZWFuCi1fYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCB0YWIpCi0gICAgIHJlZ2lzdGVyIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFiOwotewotICByZWdpc3RlciBib29sZWFuIHhjb2ZmOwotICByZWdpc3RlciBzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKmVudHJ5OwotCi0gIHhjb2ZmID0gdGFiLT54Y29mZjsKLQotICBmb3IgKGVudHJ5ID0gdGFiLT5maXJzdDsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBlbnRyeS0+bmV4dCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBjb25zdCBjaGFyICpzdHI7Ci0gICAgICByZWdpc3RlciBzaXplX3QgbGVuOwotCi0gICAgICBzdHIgPSBlbnRyeS0+cm9vdC5zdHJpbmc7Ci0gICAgICBsZW4gPSBzdHJsZW4gKHN0cikgKyAxOwotCi0gICAgICBpZiAoeGNvZmYpCi0JewotCSAgYmZkX2J5dGUgYnVmWzJdOwotCi0JICAvKiBUaGUgb3V0cHV0IGxlbmd0aCBpbmNsdWRlcyB0aGUgbnVsbCBieXRlLiAgKi8KLQkgIGJmZF9wdXRfMTYgKGFiZmQsIGxlbiwgYnVmKTsKLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZiwgMSwgMiwgYWJmZCkgIT0gMikKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgc3RyLCAxLCBsZW4sIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3QtYW91dC5jIGIvYmZkL2hvc3QtYW91dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTY0M2RjLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0LWFvdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBsb2NhbCBob3N0J3MgYS5vdXQgYmluYXJpZXMKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LiAgUHJvYmFibHkgSm9obiBHaWxtb3JlJ3MgZmF1bHQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lCUFSQ0hfU0laRQkzMgotCi0vKiBXaGVuIHBvcnRpbmcgdG8gYSBuZXcgc3lzdGVtLCB5b3UgbXVzdCBzdXBwbHk6Ci0KLQlIT1NUX1BBR0VfU0laRQkJKG9wdGlvbmFsKQotCUhPU1RfU0VHTUVOVF9TSVpFCShvcHRpb25hbCAtLSBkZWZhdWx0cyB0byBwYWdlIHNpemUpCi0JSE9TVF9NQUNISU5FX0FSQ0gJKG9wdGlvbmFsKQotCUhPU1RfTUFDSElORV9NQUNISU5FCShvcHRpb25hbCkKLQlIT1NUX1RFWFRfU1RBUlRfQUREUgkob3B0aW9uYWwpCi0JSE9TVF9TVEFDS19FTkRfQUREUgkobm90IHVzZWQsIGV4Y2VwdCBieSB0cmFkLWNvcmUgPz8/KQotCUhPU1RfQklHX0VORElBTl9QCShyZXF1aXJlZCAtLSBkZWZpbmUgaWYgYmlnLWVuZGlhbikKLQotICAgaW4gdGhlIC4vaG9zdHMvaC1zeXN0ZW1uYW1lLmggZmlsZS4gICovCi0KLSNpZmRlZiBUUkFEX0hFQURFUgotI2luY2x1ZGUgVFJBRF9IRUFERVIKLSNlbmRpZgotCi0jaWZkZWYJCQlIT1NUX1BBR0VfU0laRQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCUhPU1RfUEFHRV9TSVpFCi0jZW5kaWYKLQotI2lmZGVmCQkJSE9TVF9TRUdNRU5UX1NJWkUKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCUhPU1RfU0VHTUVOVF9TSVpFCi0jZWxzZQotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotI2VuZGlmCi0KLSNpZmRlZgkJCUhPU1RfVEVYVF9TVEFSVF9BRERSCi0jZGVmaW5lCVRFWFRfU1RBUlRfQUREUglIT1NUX1RFWFRfU1RBUlRfQUREUgotI2VuZGlmCi0KLSNpZmRlZgkJCUhPU1RfU1RBQ0tfRU5EX0FERFIKLSNkZWZpbmUJU1RBQ0tfRU5EX0FERFIJSE9TVF9TVEFDS19FTkRfQUREUgotI2VuZGlmCi0KLSNpZmRlZgkJCUhPU1RfQklHX0VORElBTl9QCi0jZGVmaW5lCVRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSNlbHNlCi0jdW5kZWYgIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSNlbmRpZgotCi0jaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLSNpZmRlZiBIT1NUX01BQ0hJTkVfQVJDSAotI2lmZGVmIEhPU1RfTUFDSElORV9NQUNISU5FCi0jZGVmaW5lIFNFVF9BUkNIX01BQ0goYWJmZCwgZXhlY3ApIFwKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChhYmZkLCBIT1NUX01BQ0hJTkVfQVJDSCwgSE9TVF9NQUNISU5FX01BQ0hJTkUpCi0jZWxzZQotI2RlZmluZSBTRVRfQVJDSF9NQUNIKGFiZmQsIGV4ZWNwKSBcCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYWJmZCwgSE9TVF9NQUNISU5FX0FSQ0gsIDApCi0jZW5kaWYKLSNlbmRpZiAvKiBIT1NUX01BQ0hJTkVfQVJDSCAqLwotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaG9zdF9hb3V0XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQiCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2FscGhhbGludXguaCBiL2JmZC9ob3N0cy9hbHBoYWxpbnV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YmExYjcuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2FscGhhbGludXguaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotLyogTGludXggZHVtcHMgInN0cnVjdCB0YXNrX3N0cnVjdCIgYXQgdGhlIGVuZCBvZiB0aGUgY29yZS1maWxlLiAgVGhpcwotICAgc3RydWN0dXJlIGlzIGN1cnJlbnRseSA5MjAgYnl0ZXMgbG9uZywgYnV0IHdlIGFsbG93IHVwIHRvIDEwMjQKLSAgIGJ5dGVzIHRvIGFsbG93IGZvciBzb21lIGZ1dHVyZSBncm93dGguICAqLwotI2RlZmluZSBUUkFEX0NPUkVfRVhUUkFfU0laRV9BTExPV0VECQkxMDI0Ci0jZGVmaW5lIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoYWJmZCkgXAotICAoKGFiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS5zaWduYWwpCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvYWxwaGF2bXMuaCBiL2JmZC9ob3N0cy9hbHBoYXZtcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWUzOTFhLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9hbHBoYXZtcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyogYWxwaGF2bXMuaCAtLSBCRkQgZGVmaW5pdGlvbnMgZm9yIGFuIG9wZW5WTVMgaG9zdAotICAgQ29weXJpZ2h0IDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEtsYXVzIEvkbXBmIChra2FlbXBmQHByb2dpcy5kZSkKLSAgIG9mIHByb0dJUyBTb2Z0d2FyZWVudHdpY2tsdW5nLCBBYWNoZW4sIEdlcm1hbnkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2luY2x1ZGUgPHVuaXhpby5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotCi0jaWZuZGVmIEJGRF9IT1NUXzY0X0JJVAotLyogTWFrZSB0aGUgYmFzaWMgdHlwZXMgNjQtYml0IHF1YW50aXRpZXMgb24gdGhlIGhvc3QuCi0gICBBbHNvIHByb3ZpZGUgdGhlIHN1cHBvcnQgbWFjcm9zIEJGRCBuZWVkcy4gICovCi0jIGlmZGVmIF9fR05VQ19fCi0jICBkZWZpbmUJQkZEX0hPU1RfNjRfQklUCWxvbmcgbG9uZwotIyBlbHNlCi0jICBkZWZpbmUJQkZEX0hPU1RfNjRfQklUCWxvbmcKLSMgZW5kaWYKLXR5cGVkZWYgdW5zaWduZWQgQkZEX0hPU1RfNjRfQklUIHVpbnQ2NF90eXBlOwotdHlwZWRlZiBCRkRfSE9TVF82NF9CSVQgaW50NjRfdHlwZTsKLQotIyBkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBzcHJpbnRmIChzLCAiJTAxNmx4IiwgeCkgLyogQkZEX0hPU1RfNjRfQklUICovCi0jIGRlZmluZSBmcHJpbnRmX3ZtYShmLHgpIGZwcmludGYgKGYsICIlMDE2bHgiLCB4KSAvKiBCRkRfSE9TVF82NF9CSVQgKi8KLQotIyBkZWZpbmUgQllURVNfSU5fUFJJTlRGX0lOVCA0Ci0KLS8qIFRoZXNlIG11c3QgaGF2ZSB0eXBlIHVuc2lnbmVkIGxvbmcgYmVjYXVzZSB0aGV5IGFyZSB1c2VkIGFzCi0gICBhcmd1bWVudHMgaW4gcHJpbnRmIGZ1bmN0aW9ucy4gICovCi0jIGRlZmluZSB1aW50NjRfdHlwZUxPVyh4KSAoKHVuc2lnbmVkIGxvbmcpICgoKHgpICYgMHhmZmZmZmZmZikpKSAvKiBCRkRfSE9TVF82NF9CSVQgKi8KLSMgZGVmaW5lIHVpbnQ2NF90eXBlSElHSCh4KSAoKHVuc2lnbmVkIGxvbmcpICgoKHgpID4+IDMyKSAmIDB4ZmZmZmZmZmYpKSAvKiBCRkRfSE9TVF82NF9CSVQgKi8KLQotI2VuZGlmIC8qIEJGRF9IT1NUXzY0X0JJVCAqLwotCi0jaW5jbHVkZSAiZm9wZW4tdm1zLmgiCi0KLSNkZWZpbmUgTk9fRkNOVEwgMQotCi0jaWZuZGVmIE9fQUNDTU9ERQotI2RlZmluZSBPX0FDQ01PREUgKE9fUkRPTkxZIHwgT19XUk9OTFkgfCBPX1JEV1IpCi0jZW5kaWYKLQotZXh0ZXJuIGludCBnZXRwYWdlc2l6ZSBQQVJBTVMgKCh2b2lkKSk7CmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvZGVjc3RhdGlvbi5oIGIvYmZkL2hvc3RzL2RlY3N0YXRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwYzE0My4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvZGVjc3RhdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyogSG9wZWZ1bGx5IHRoaXMgc2hvdWxkIGluY2x1ZGUgZWl0aGVyIG1hY2hpbmUvcGFyYW0uaCAoVWx0cml4KSBvcgotICAgbWFjaGluZS9tYWNocGFyYW0uaCAoTWFjaCksIHdoaWNoZXZlciBpcyBpdHMgbmFtZSBvbiB0aGlzIHN5c3RlbS4gICovCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRwotLyogI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHIC0tIHdlIHVzZSBIT1NUX0RBVEFfU1RBUlRfQUREUiAqLwotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9taXBzCi0vKiAjZGVmaW5lCUhPU1RfTUFDSElORV9NQUNISU5FCSAqLwotCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCQlVU1JURVhUCi0jZGVmaW5lCUhPU1RfREFUQV9TVEFSVF9BRERSCQlVU1JEQVRBCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCVVTUlNUQUNLCi0KLSNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChjb3JlX2JmZCkgXAotICAoKGNvcmVfYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUudV9hcmdbMF0pCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvZGVsdGE2OC5oIGIvYmZkL2hvc3RzL2RlbHRhNjguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE2YTZlNi4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvZGVsdGE2OC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgZm9yIGEgTW90b3JvbGEgRGVsdGEgMzMwMCBib3ggcnVubmluZyBTeXN0ZW0gViBSMy4wLgotICAgQ29udHJpYnV0ZWQgYnkgbWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGUuICAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLS8qIERlZmluaXRpb25zIHVzZWQgYnkgdHJhZC1jb3JlLmMuICAqLwotI2RlZmluZQlOQlBHCQkJTkJQQwotI2RlZmluZQlIT1NUX0RBVEFfU1RBUlRfQUREUgl1LnVfZXhkYXRhLnV4X2RhdG9yZwotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgl1LnVfZXhkYXRhLnV4X3R4dG9yZwotI2lmIDAKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkweDQwMDAwMDAwCi0jZWxzZQotLyogVXNlcidzIHN0YWNrLCBjb3BpZWQgZnJvbSBzeXMvcGFyYW0uaCAgKi8KLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUglVU1JTVEFDSwotI2VuZGlmCi0jZGVmaW5lCVVQQUdFUwkJCVVTSVpFCi0jZGVmaW5lCVRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoYWJmZCkgXAotICBhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X2Fib3J0CmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvZHB4Mi5oIGIvYmZkL2hvc3RzL2RweDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE2Mzk1Zi4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvZHB4Mi5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0vKiBEZWZpbml0aW9ucyB0aGF0IGFyZSBuZWVkZWQgZm9yIGNvcmUgZmlsZXMuICBDb3JlIHNlY3Rpb24gc2l6ZXMgZm9yCi0gICB0aGUgRFBYMiBhcmUgaW4gYnl0ZXMuICAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZGVmaW5lIE5CUEcgMQotI2RlZmluZSBVUEFHRVMgKFVTSVpFICogTkJQUCkKLSNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgKHUudV9leGRhdGEudXhfZGF0b3JnKQotI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSIChVU0VSU1RBQ0spCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaHAzMDBic2QuaCBiL2JmZC9ob3N0cy9ocDMwMGJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODI4NzE3Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9ocDMwMGJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2lmZGVmIEJTRDRfNAotI2RlZmluZSBOT19DT1JFX0NPTU1BTkQKLSNlbmRpZgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0jZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcJLyogRGF0YSBzZWcgc3RhcnQgYWRkciByb3VuZHMgdG8gTkJQRyAqLwotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9tNjhrCi0vKiAjZGVmaW5lCUhPU1RfTUFDSElORV9NQUNISU5FCSAqLwotCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCQkwCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCTB4ZmZmMDAwMDAKLSNkZWZpbmUJSE9TVF9CSUdfRU5ESUFOX1AKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9pMzg2YnNkLmggYi9iZmQvaG9zdHMvaTM4NmJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWVlM2Q4Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9pMzg2YnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBJbnRlbCAzODYgcnVubmluZyBhbnkgQlNEIFVuaXggKi8KLQotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLQotLyogUmVjZW50IHZlcnNpb25zIG9mIEZyZWVCU0QgZG9uJ3QgZGVmaW5lIE5CUEcuICAqLwotI2lmbmRlZiBOQlBHCi0jaWZkZWYgUEFHRV9TSVpFCi0jZGVmaW5lIE5CUEcgUEFHRV9TSVpFCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJCVVTUlRFWFQKLQotLyogSm9saXR6IHN1Z2dlc3RlZCBkZWZpbmluZyBIT1NUX1NUQUNLX0VORF9BRERSIHRvCi0gICAodS51X2twcm9jLmtwX2Vwcm9jLmVfdm0udm1fbWF4c2FkZHIgKyBNQVhTU0laKSwgd2hpY2ggc2hvdWxkIHdvcmsgb24KLSAgIGJvdGggQlNESSBhbmQgMzg2QlNELCBidXQgdGhhdCBpcyBiZWxpZXZlZCBub3QgdG8gd29yayBmb3IgQlNEIDQuNC4gICovCi0KLSNpZmRlZiBfX2JzZGlfXwotLyogVGhpcyBzZWVtcyB0byBiZSB0aGUgcmlnaHQgdGhpbmcgZm9yIEJTREkuICAqLwotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCQlVU1JTVEFDSwotI2RlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUiAoKGJmZF92bWEpdS51X2twcm9jLmtwX2Vwcm9jLmVfdm0udm1fZGFkZHIpCi0jZWxzZQotLyogVGhpcyBzZWVtcyB0byBiZSB0aGUgcmlnaHQgdGhpbmcgZm9yIDM4NkJTRCByZWxlYXNlIDAuMS4gICovCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCShVU1JTVEFDSyAtIE1BWFNTSVopCi0jZW5kaWYKLQotI2RlZmluZSBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGNvcmVfYmZkKSBcCi0gICgoY29yZV9iZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X3NpZykKLSNkZWZpbmUgdV9jb21tIHVfa3Byb2Mua3BfcHJvYy5wX2NvbW0KZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9pMzg2bGludXguaCBiL2JmZC9ob3N0cy9pMzg2bGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhNTFmMS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvaTM4NmxpbnV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLS8qIExpbnV4IHdyaXRlcyB0aGUgdGFzayBzdHJ1Y3R1cmUgYXQgdGhlIGVuZCBvZiB0aGUgY29yZSBmaWxlLiAgQ3VycmVudGx5IGl0Ci0gICBpcyAyOTEyIGJ5dGVzLiAgSXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIHNob3VsZCBiZSBhIHBpY2tpZXIgY2hlY2ssIGJ1dAotICAgd2Ugc2hvdWxkIHByb2JhYmx5IG5vdCBiZSB0b28gcGlja3kgKHRoZSBzaXplIG9mIHRoZSB0YXNrIHN0cnVjdHVyZSBtaWdodAotICAgdmFyeSwgYW5kIGlmIGl0J3Mgbm90IHRoZSBsZW5ndGggd2UgZXhwZWN0IGl0IHRvIGJlLCBpdCBkb2Vzbid0IGFmZmVjdAotICAgb3VyIGFiaWxpdHkgdG8gcHJvY2VzcyB0aGUgY29yZSBmaWxlKS4gIFNvIGFsbG93IDAtNDA5NiBleHRyYSBieXRlcyBhdAotICAgdGhlIGVuZC4gICovCi0KLSNkZWZpbmUgVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRCA0MDk2CmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaTM4Nm1hY2gzLmggYi9iZmQvaG9zdHMvaTM4Nm1hY2gzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYzYxZTMuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2kzODZtYWNoMy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0vKiBUaGlzIGlzIGFuIHVnbHkgd2F5IHRvIGhhY2sgYXJvdW5kIHRoZSBpbmNvcnJlY3QKLSAqIGRlZmluaXRpb24gb2YgVVBBR0VTIGluIGkzODYvbWFjaHBhcmFtLmguCi0gKgotICogVGhlIGRlZmluaXRpb24gc2hvdWxkIHNwZWNpZnkgdGhlIHNpemUgcmVzZXJ2ZWQKLSAqIGZvciAic3RydWN0IHVzZXIiIGluIGNvcmUgZmlsZXMgaW4gUEFHRVMsCi0gKiBidXQgaW5zdGVhZCBpdCBnaXZlcyBpdCBpbiA1MTItYnl0ZSBjb3JlLWNsaWNrcwotICogZm9yIGkzODYgYW5kIGk4NjAuIFVQQUdFUyBpcyB1c2VkIG9ubHkgaW4gdHJhZC1jb3JlLmMuCi0gKi8KLSNpZiBVUEFHRVMgPT0gMTYKLSN1bmRlZiAgVVBBR0VTCi0jZGVmaW5lIFVQQUdFUyAyCi0jZW5kaWYKLQotI2lmIFVQQUdFUyAhPSAyCi1GSVhNRSEhIFVQQUdFUyBpcyBuZWl0aGVyIDIgbm9yIDE2Ci0jZW5kaWYKLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJMQotI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaTM4NnNjby5oIGIvYmZkL2hvc3RzL2kzODZzY28uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4NjA4Yy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvaTM4NnNjby5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyogQ29yZSBmaWxlIHN0dWZmLiAgQXQgbGVhc3Qgc29tZSwgcGVyaGFwcyBhbGwsIG9mIHRoZSBmb2xsb3dpbmcKLSAgIGRlZmluZXMgd29yayBvbiBtYW55IG1vcmUgc3lzdGVtcyB0aGFuIGp1c3QgU0NPLiAgKi8KLQotI2RlZmluZSBOQlBHIE5CUEMKLSNkZWZpbmUgVVBBR0VTIFVTSVpFCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIHUudV9leGRhdGEudXhfZGF0b3JnCi0jZGVmaW5lIEhPU1RfU1RBQ0tfU1RBUlRfQUREUiB1LnVfc3ViCi0jZGVmaW5lIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoYWJmZCkgXAotICAoKGNvcmVfdXBhZ2UoYWJmZCktPnVfc3lzYWJvcnQgIT0gMCkgXAotICAgPyBjb3JlX3VwYWdlKGFiZmQpLT51X3N5c2Fib3J0IFwKLSAgIDogLTEpCi0KLS8qIEFjY29yZGluZyB0byB0aGUgbWFucGFnZSwgYSB2ZXJzaW9uIDIgU0NPIGNvcmVmaWxlIGNhbiBjb250YWluCi0gICB2YXJpb3VzIGFkZGl0aW9uYWwgc2VjdGlvbnMgKGl0IGlzIGNsZXZlcmx5IGFycmFuZ2VkIHNvIHRoZSB1IGFyZWEsCi0gICBkYXRhLCBhbmQgc3RhY2sgYXJlIGZpcnN0IHdoZXJlIHdlIGNhbiBmaW5kIHRoZW0pLiAgU28gd2l0aG91dAotICAgd3JpdGluZyBsb3RzIG9mIGNvZGUgdG8gcGFyc2UgYWxsIHRoZWlyIGhlYWRlcnMgYW5kIHN0dWZmLCB3ZSBjYW4ndAotICAga25vdyB3aGV0aGVyIGEgY29yZWZpbGUgaXMgYmlnZ2VyIHRoYW4gaXQgc2hvdWxkIGJlLiAgKi8KLQotI2RlZmluZSBUUkFEX0NPUkVfQUxMT1dfQU5ZX0VYVFJBX1NJWkUgMQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2k4NjBtYWNoMy5oIGIvYmZkL2hvc3RzL2k4NjBtYWNoMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGQyYWExLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9pODYwbWFjaDMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qIFRoaXMgZmlsZSB3YXMgaGFja2VkIGZyb20gaTM4Nm1hY2gzLmggICBbZG9sYW5Ac3NkLmludGVsLmNvbV0gKi8KLQotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0vKiBUaGlzIGlzIGFuIHVnbHkgd2F5IHRvIGhhY2sgYXJvdW5kIHRoZSBpbmNvcnJlY3QKLSAqIGRlZmluaXRpb24gb2YgVVBBR0VTIGluIGkzODYvbWFjaHBhcmFtLmguCi0gKgotICogVGhlIGRlZmluaXRpb24gc2hvdWxkIHNwZWNpZnkgdGhlIHNpemUgcmVzZXJ2ZWQKLSAqIGZvciAic3RydWN0IHVzZXIiIGluIGNvcmUgZmlsZXMgaW4gUEFHRVMsCi0gKiBidXQgaW5zdGVhZCBpdCBnaXZlcyBpdCBpbiA1MTItYnl0ZSBjb3JlLWNsaWNrcwotICogZm9yIGkzODYgYW5kIGk4NjAuIFVQQUdFUyBpcyB1c2VkIG9ubHkgaW4gdHJhZC1jb3JlLmMuCi0gKi8KLSNpZiBVUEFHRVMgPT0gMTYKLSN1bmRlZiAgVVBBR0VTCi0jZGVmaW5lIFVQQUdFUyAyCi0jZW5kaWYKLQotI2lmIFVQQUdFUyAhPSAyCi1GSVhNRSEhIFVQQUdFUyBpcyBuZWl0aGVyIDIgbm9yIDE2Ci0jZW5kaWYKLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJMQotI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX2k4NjAKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbTY4a2F1eC5oIGIvYmZkL2hvc3RzL202OGthdXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIzNzc1NS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbTY4a2F1eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgZm9yIGFuIEFwcGxlIE1hY2ludG9zaCBydW5uaW5nIEEvVVggMy54LiAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3BhZ2UuaD4KLQotLyogRGVmaW5pdGlvbnMgdXNlZCBieSB0cmFkLWNvcmUuYy4gICovCi0jZGVmaW5lCU5CUEcJCQlOQlBQCi0KLSNkZWZpbmUJSE9TVF9EQVRBX1NUQVJUX0FERFIJdS51X2V4ZGF0YS51eF9kYXRvcmcKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJdS51X2V4ZGF0YS51eF90eHRvcmcKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkweDEwMDAwMDAwMAotCi0jZGVmaW5lCVVQQUdFUwkJCVVTSVpFCi0KLSNkZWZpbmUJVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCi0gIChhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X2FyZ1swXSkKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9tNjhrbGludXguaCBiL2JmZC9ob3N0cy9tNjhrbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2N2RmYS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbTY4a2xpbnV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS8qIExpbnV4IGR1bXBzICJzdHJ1Y3QgdGFza19zdHJ1Y3QiIGF0IHRoZSBlbmQgb2YgdGhlIGNvcmUtZmlsZS4gIFRoaXMKLSAgIHN0cnVjdHVyZSBpcyBjdXJyZW50bHkgMjUxMiBieXRlcyBsb25nLCBidXQgd2UgYWxsb3cgdXAgdG8gNDA5NgotICAgYnl0ZXMgdG8gYWxsb3cgZm9yIHNvbWUgZnV0dXJlIGdyb3d0aC4gICovCi0jZGVmaW5lIFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQJCTQwOTYKLSNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCi0gICgoYWJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnNpZ25hbCkKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9tODhrbWFjaDMuaCBiL2JmZC9ob3N0cy9tODhrbWFjaDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxNTUzOC4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbTg4a21hY2gzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLSN1bmRlZiBVUEFHRVMKLSNkZWZpbmUgVVBBR0VTIDMKLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRwotI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX204OGsKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbWlwc2JzZC5oIGIvYmZkL2hvc3RzL21pcHNic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmYWQyMS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbWlwc2JzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSN1bmRlZiBBTElHTgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0vKiAjZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcgLS0gd2UgdXNlIEhPU1RfREFUQV9TVEFSVF9BRERSICovCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX21pcHMKLS8qICNkZWZpbmUJSE9TVF9NQUNISU5FX01BQ0hJTkUJICovCi0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJCVVTUlRFWFQKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkJVVNSU1RBQ0sKLSNkZWZpbmUgTk9fQ09SRV9DT01NQU5ECmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbWlwc21hY2gzLmggYi9iZmQvaG9zdHMvbWlwc21hY2gzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YzQ2OGQuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL21pcHNtYWNoMy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2luY2x1ZGUgPG1hY2hpbmUvbWFjaHBhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKLS8qICNkZWZpbmUJSE9TVF9TRUdNRU5UX1NJWkUJTkJQRyAgKi8KLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfbWlwcwotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfREFUQV9TVEFSVF9BRERSCVVTUkRBVEEKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUglVU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL25ld3MtbWlwcy5oIGIvYmZkL2hvc3RzL25ld3MtbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTc5OWJlLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9uZXdzLW1pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qIFNvbnkgTmV3cyBydW5uaW5nIE5ld3NPUyAzLjIuICAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0KLSNkZWZpbmUgSE9TVF9QQUdFX1NJWkUgTkJQRwotCi0jZGVmaW5lIEhPU1RfTUFDSElORV9BUkNIIGJmZF9hcmNoX21pcHMKLQotI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUiBVU1JURVhUCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIFVTUkRBVEEKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiBVU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL25ld3MuaCBiL2JmZC9ob3N0cy9uZXdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzk0NmMuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL25ld3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLyogU29ueSBOZXdzIHJ1bm5pbmcgTmV3c09TIDMuMi4gICovCi0KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLQotI2RlZmluZSBIT1NUX1BBR0VfU0laRSBOQlBHCi0jZGVmaW5lIEhPU1RfU0VHTUVOVF9TSVpFIE5CUEcKLSNkZWZpbmUgSE9TVF9NQUNISU5FX0FSQ0ggYmZkX2FyY2hfbTY4awotI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIgKEtFUk5CQVNFIC0gKFVQQUdFUyAqIE5CUEcpKQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3BjNTMybWFjaC5oIGIvYmZkL2hvc3RzL3BjNTMybWFjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjk2ZjU5Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9wYzUzMm1hY2guaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotLyogVGhpcyBpcyBhbiB1Z2x5IHdheSB0byBoYWNrIGFyb3VuZCB0aGUgaW5jb3JyZWN0Ci0gKiBkZWZpbml0aW9uIG9mIFVQQUdFUyBpbiBuczUzMi9tYWNocGFyYW0uaC4KLSAqCi0gKiBUaGUgZGVmaW5pdGlvbiBzaG91bGQgc3BlY2lmeSB0aGUgc2l6ZSByZXNlcnZlZAotICogZm9yICJzdHJ1Y3QgdXNlciIgaW4gY29yZSBmaWxlcyBpbiBQQUdFUywKLSAqIGJ1dCBpbnN0ZWFkIGl0IGdpdmVzIGl0IGluIDUxMi1ieXRlIGNvcmUtY2xpY2tzCi0gKiBmb3IgbnM1MzIsIGkzODYgYW5kIGk4NjAuIFVQQUdFUyBpcyB1c2VkIG9ubHkgaW4gdHJhZC1jb3JlLmMuCi0gKi8KLSNpZiBVUEFHRVMgPT0gMTYKLSN1bmRlZiAgVVBBR0VTCi0jZGVmaW5lIFVQQUdFUyAyCi0jZW5kaWYKLQotI2lmIFVQQUdFUyAhPSAyCi0jZXJyb3IgVVBBR0VTIGlzIG5laXRoZXIgMiBub3IgMTYKLSNlbmRpZgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQkxCi0jZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvcmlzY29zLmggYi9iZmQvaG9zdHMvcmlzY29zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZmE4MjYuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3Jpc2Nvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLyogUklTQy9vcyA0LjUyQywgYW5kIHByZXN1bWFibHkgb3RoZXIgdmVyc2lvbnMuICAqLwotCi0jaW5jbHVkZSA8YnNkNDMvbWFjaGluZS9tYWNocGFyYW0uaD4KLSNpbmNsdWRlIDxic2Q0My9tYWNoaW5lL3ZtcGFyYW0uaD4KLQotI2RlZmluZSBOQlBHIEJTRDQzX05CUEcKLSNkZWZpbmUgVVBBR0VTIEJTRDQzX1VQQUdFUwotI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUiBCU0Q0M19VU1JURVhUCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIEJTRDQzX1VTUkRBVEEKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiBCU0Q0M19VU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3N5bW1ldHJ5LmggYi9iZmQvaG9zdHMvc3ltbWV0cnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3MTdiMy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvc3ltbWV0cnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qIFN5bW1ldHJ5IHJ1bm5pbmcgZWl0aGVyIGR5bml4IDMuMSAoYnNkKSBvciBwdHggKHN5c3YpLiAgKi8KLQotI2RlZmluZSBOQlBHIDQwOTYKLSNkZWZpbmUgVVBBR0VTIDEKLQotI2lmZGVmIF9TRVFVRU5UXwotLyogcHR4ICovCi0jZGVmaW5lIEhPU1RfVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiAweDNmZmZlMDAwCi0jZGVmaW5lIFRSQURfQ09SRV9VU0VSX09GRlNFVCAoKFVQQUdFUyAqIE5CUEcpIC0gc2l6ZW9mIChzdHJ1Y3QgdXNlcikpCi0jZWxzZQotLyogZHluaXggKi8KLSNkZWZpbmUgSE9TVF9URVhUX1NUQVJUX0FERFIgMHgxMDAwCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIChOQlBHICogdS51X3RzaXplKQotI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSIDB4M2ZmZmYwMDAKLSNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChjb3JlX2JmZCkgXAotICAoKGNvcmVfYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUudV9hcmdbMF0pCi0jZW5kaWYKLQotI2RlZmluZSBUUkFEX0NPUkVfRFNJWkVfSU5DTFVERVNfVFNJWkUKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy90YWhvZS5oIGIvYmZkL2hvc3RzL3RhaG9lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNmNlZTIuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3RhaG9lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jZGVmaW5lCU5PX0NPUkVfQ09NTUFORAotCi0jdW5kZWYJQUxJR04JCQkvKiBUaGV5IHVzZSBpdCwgd2UgdXNlIGl0IHRvbyAqLwotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSN1bmRlZglBTElHTgkJCS8qIFRoZXkgdXNlIGl0LCB3ZSB1c2UgaXQgdG9vICovCi0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfdGFob2UKLQotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgkwCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJKEtFUk5CQVNFIC0gKFVQQUdFUyAqIE5CUEcpKQotI2RlZmluZQlIT1NUX0JJR19FTkRJQU5fUApkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3ZheGJzZC5oIGIvYmZkL2hvc3RzL3ZheGJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWI5Y2NlLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy92YXhic2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSNkZWZpbmUJTk9fQ09SRV9DT01NQU5ECQkvKiBObyBjb21tYW5kIG5hbWUgaW4gY29yZSBmaWxlICovCi0KLSNpZiAwCi0jdW5kZWYJQUxJR04JCQkvKiBUaGV5IHVzZSBpdCwgd2UgdXNlIGl0IHRvbyAqLwotLyogRG9lcyBub3QgZXhpc3Qgb24gQlNEIDQuMywgaXQgdXNlcyBtYWNoaW5lL21hY2hwYXJhbS5oLgotICAgV2hhdGV2ZXIgaXQgaXMsIGl0J3MgaW5jbHVkZWQgYnkgPHN5cy9wYXJhbS5oPiwgd2hpY2ggdHJhZC1jb3JlLmMsCi0gICB0aGUgb25seSBwbGFjZSB0aGF0IHVzZXMgdGhpcyAoSSB0aGluayksIGFscmVhZHkgaW5jbHVkZXMuICAqLwotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSNlbmRpZgotI3VuZGVmCUFMSUdOCQkJLyogVGhleSB1c2UgaXQsIHdlIHVzZSBpdCB0b28gKi8KLQotLyogTm90ZSB0aGF0IEhPU1RfUEFHRV9TSVpFIC0tIHRoZSBwYWdlIHNpemUgYXMgZmFyIGFzIGV4ZWN1dGFibGUgZmlsZXMKLSAgIGFyZSBjb25jZXJuZWQgLS0gaXMgbm90IHRoZSBzYW1lIGFzIE5CUEcsIGJlY2F1c2Ugb2YgcGFnZSBjbHVzdGVyaW5nLiAgKi8KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCTEwMjQKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfdmF4Ci0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJMAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCSgweDgwMDAwMDAwIC0gKFVQQUdFUyAqIE5CUEcpKQotI3VuZGVmCUhPU1RfQklHX0VORElBTl9QCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvdmF4dWx0LmggYi9iZmQvaG9zdHMvdmF4dWx0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNzMxYjcuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3ZheHVsdC5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJKE5CUEcqQ0xTSVpFKQotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF92YXgKLQotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKLSN1bmRlZglIT1NUX0JJR19FTkRJQU5fUApkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3ZheHVsdDIuaCBiL2JmZC9ob3N0cy92YXh1bHQyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNzMxYjcuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3ZheHVsdDIuaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCShOQlBHKkNMU0laRSkKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfdmF4Ci0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCi0jdW5kZWYJSE9TVF9CSUdfRU5ESUFOX1AKZGlmZiAtLWdpdCBhL2JmZC9ocDMwMGJzZC5jIGIvYmZkL2hwMzAwYnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NjdiMTguLjAwMDAwMDAKLS0tIGEvYmZkL2hwMzAwYnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhQIDkwMDAvMzAwICg2ODAwMC1iYXNlZCkgbWFjaGluZXMgcnVubmluZyBCU0QgVW5peC4KLSAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIEVOVFJZX0NBTl9CRV9aRVJPCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwIC8qIEF2b2lkcyB3YXJuaW5nICovCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaHAzMDBic2RfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1ocDMwMGJzZCIKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaHAzMDBocHV4LmMgYi9iZmQvaHAzMDBocHV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NTIzMTguLjAwMDAwMDAKLS0tIGEvYmZkL2hwMzAwaHB1eC5jCisrKyAvZGV2L251bGwKQEAgLTEsODcwICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBocC11eCA5MDAwLzMwMAotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBHbGVubiBFbmdlbC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotCi0gICAgaHB1eCBuYXRpdmUgIC0tLS0tLS0tLS0tLT4gfCAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhwMzAwaHB1eCBiZmQgfCAtLS0tLS0tLS0tPiBocHV4IHcvZ251IGV4dAotICAgIGhwdXggdy9nbnUgZXh0ZW5zaW9uIC0tLS0+IHwgICAgICAgICAgICAgICB8Ci0KLQotICAgIFN1cHBvcnQgZm9yIHRoZSA5MDAwL1szNF0wMCBoYXMgc2V2ZXJhbCBsaW1pdGF0aW9ucy4KLSAgICAgIDEuIFNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAyLiBUaGUgb3V0cHV0IGZvcm1hdCBmcm9tIHRoaXMgYmZkIGlzIG5vdCB1c2FibGUgYnkgbmF0aXZlIHRvb2xzLgotCi0gICAgVGhlIHByaW1hcnkgbW90aXZhdGlvbiBmb3Igd3JpdGluZyB0aGlzIGJmZCB3YXMgdG8gYWxsb3cgdXNlIG9mCi0gICAgZ2RiIGFuZCBnY2MgZm9yIGhvc3QgYmFzZWQgZGVidWdnaW5nIGFuZCBub3QgdG8gbWltaWMgdGhlIGhwLXV4IHRvb2xzCi0gICAgaW4gZXZlcnkgZGV0YWlsLiAgVGhpcyBsZWFkcyB0byBhIHNpZ25pZmljYW50IHNpbXBsaWZpY2F0aW9uIG9mIHRoZQotICAgIGNvZGUgYW5kIGEgbGVhcCBpbiBwZXJmb3JtYW5jZS4gIFRoZSBkZWNpc2lvbiB0byBub3Qgb3V0cHV0IGhwIG5hdGl2ZQotICAgIGNvbXBhdGlibGUgb2JqZWN0cyB3YXMgZnVydGhlciBzdHJlbmd0aGVuZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcmljaG5lc3MKLSAgICBvZiB0aGUgZ2NjIGNvbXBpbGVkIG9iamVjdHMgY291bGQgbm90IGJlIHJlcHJlc2VudGVkIHdpdGhvdXQgbG9zcyBvZgotICAgIGluZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIHdoaWxlIHRoZSBocCBmb3JtYXQgc3VwcG9ydHMgdGhlIGNvbmNlcHQgb2YKLSAgICBzZWNvbmRhcnkgc3ltYm9scywgaXQgZG9lcyBub3Qgc3VwcG9ydCBpbmRpcmVjdCBzeW1ib2xzLiAgQW5vdGhlcgotICAgIHJlYXNvbiBpcyB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGltcGxlbWVudGF0aW9ucwotICAgIG9mIGdjYyBvbiBocHV4IHdoaWNoIHVzZWQgJ2hweHQnIHRvIHRyYW5zbGF0ZSAuYSBhbmQgLm8gZmlsZXMgaW50byBhCi0gICAgZm9ybWF0IHdoaWNoIGNvdWxkIGJlIHJlYWRpbHkgdW5kZXJzdG9vZCBieSB0aGUgZ251IGxpbmtlciBhbmQgZ2RiLgotICAgIFRoaXMgYWxsb3dzIHJlYWRpbmcgaHAgc2Vjb25kYXJ5IHN5bWJvbHMgYW5kIGNvbnZlcnRpbmcgdGhlbSBpbnRvCi0gICAgaW5kaXJlY3Qgc3ltYm9scyBidXQgdGhlIHJldmVyc2UgaXQgbm90IGFsd2F5cyBwb3NzaWJsZS4KLQotICAgIEFub3RoZXIgZXhhbXBsZSBvZiBkaWZmZXJlbmNlcyBpcyB0aGF0IHRoZSBocCBmb3JtYXQgc3RvcmVzIHN5bWJvbCBvZmZzZXRzCi0gICAgaW4gdGhlIG9iamVjdCBjb2RlIHdoaWxlIHRoZSBnbnUgdXRpbGl0aWVzIHVzZSBhIGZpZWxkIGluIHRoZQotICAgIHJlbG9jYXRpb24gcmVjb3JkIGZvciB0aGlzLiAgVG8gc3VwcG9ydCB0aGUgaHAgbmF0aXZlIGZvcm1hdCwgdGhlIG9iamVjdAotICAgIGNvZGUgd291bGQgbmVlZCB0byBiZSBwYXRjaGVkIHdpdGggdGhlIG9mZnNldHMgd2hlbiBwcm9kdWNpbmcgLm8gZmlsZXMuCi0KLSAgICBUaGUgYmFzaWMgdGVjaG5pcXVlIHRha2VuIGluIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdG8gI2luY2x1ZGUgdGhlIGNvZGUKLSAgICBmcm9tIGFvdXR4LmggYW5kIGFvdXQtdGFyZ2V0Lmggd2l0aCBhcHByb3ByaWF0ZSAjZGVmaW5lcyB0byBvdmVycmlkZQotICAgIGNvZGUgd2hlcmUgYSB1bmlxdWUgaW1wbGVtZW50YXRpb24gaXMgbmVlZGVkOgotCi0gICAgewotICAgICAgICAjZGVmaW5lIGEgYnVuY2ggb2Ygc3R1ZmYKLSAgICAgICAgI2luY2x1ZGUgPGFvdXR4Lmg+Ci0KLSAgICAgICAgaW1wbGVtZW50IGEgYnVuY2ggb2YgZnVuY3Rpb25zCi0KLSAgICAgICAgI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCi0gICAgfQotCi0gICAgVGhlIGhwIHN5bWJvbCB0YWJsZSBpcyBhIGJpdCBkaWZmZXJlbnQgdGhhbiBvdGhlciBhLm91dCB0YXJnZXRzLiAgSW5zdGVhZAotICAgIG9mIGhhdmluZyBhbiBhcnJheSBvZiBubGlzdCBpdGVtcyBhbmQgYW4gYXJyYXkgb2Ygc3RyaW5ncywgaHAncyBmb3JtYXQKLSAgICBoYXMgdGhlbSBtaXhlZCB0b2dldGhlciBpbiBvbmUgc3RydWN0dXJlLiAgSW4gYWRkaXRpb24sIHRoZSBzdHJpbmdzIGFyZQotICAgIG5vdCBudWxsIHRlcm1pbmF0ZWQuICBJdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0gICAgbmxpc3QgZWxlbWVudCAxCi0gICAgc3RyaW5nMQotICAgIG5saXN0IGVsZW1lbnQgMgotICAgIHN0cmluZzIKLSAgICAuLi4KLQotICAgIFRoZSB3aG9sZSBzeW1ib2wgdGFibGUgaXMgcmVhZCBhcyBvbmUgY2h1bmsgYW5kIHRoZW4gd2UgbWFyY2ggdGhydSBpdAotICAgIGFuZCBjb252ZXJ0IGl0IHRvIGNhbm9uaWNhbCBmb3JtLiAgQXMgd2UgbWFyY2ggdGhydSB0aGUgdGFibGUsIHdlIGNvcHkKLSAgICB0aGUgbmxpc3QgZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCBmb3JtIGFuZCB3ZSBjb21wYWN0IHRoZSBzdHJpbmdzIGFuZCBudWxsCi0gICAgdGVybWluYXRlIHRoZW0sIHVzaW5nIHN0b3JhZ2UgZnJvbSB0aGUgYWxyZWFkeSBhbGxvY2F0ZWQgc3ltYm9sIHRhYmxlOgotCi0gICAgc3RyaW5nMQotICAgIG51bGwKLSAgICBzdHJpbmcyCi0gICAgbnVsbAotICovCi0KLS8qIEBAIElzIHRoaXMgcmVhbGx5IHNvIGRpZmZlcmVudCBmcm9tIG5vcm1hbCBhLm91dCB0aGF0IGl0IG5lZWRzIHRvIGluY2x1ZGUKLSAgIGFvdXR4Lmg/ICBXZSBzaG91bGQgZ28gdGhyb3VnaCB0aGlzIGZpbGUgc29tZXRpbWUgYW5kIHNlZSB3aGF0IGNhbiBiZSBtYWRlCi0gICBtb3JlIGRlcGVuZGVudCBvbiBhb3V0MzIubyBhbmQgd2hhdCBtaWdodCBuZWVkIHRvIGJlIGJyb2tlbiBvZmYgYW5kIGFjY2Vzc2VkCi0gICB0aHJvdWdoIHRoZSBiYWNrZW5kX2RhdGEgZmllbGQuICBPciwgbWF5YmUgd2UgcmVhbGx5IGRvIG5lZWQgc3VjaCBhCi0gICBjb21wbGV0ZWx5IHNlcGFyYXRlIGltcGxlbWVudGF0aW9uLiAgSSBkb24ndCBoYXZlIHRpbWUgdG8gaW52ZXN0aWdhdGUgdGhpcwotICAgbXVjaCBmdXJ0aGVyIHJpZ2h0IG5vdy4gIFtyYWVidXJuOjE5OTMwNDI4LjIxMjRFU1RdICovCi0vKiBAQCBBbHNvLCBub3RlIHRoYXQgdGhlcmUgd2luZCB1cCBiZWluZyB0d28gdmVyc2lvbnMgb2Ygc29tZSByb3V0aW5lcywgd2l0aAotICAgZGlmZmVyZW50IG5hbWVzLCBvbmx5IG9uZSBvZiB3aGljaCBhY3R1YWxseSBnZXRzIHVzZWQuICBGb3IgZXhhbXBsZToKLQlzbHVycF9zeW1ib2xfdGFibGUKLQlzd2FwX3N0ZF9yZWxvY19pbgotCXNsdXJwX3JlbG9jX3RhYmxlCi0JZ2V0X3N5bXRhYgotCWdldF9zeW10YWJfdXBwZXJfYm91bmQKLQljYW5vbmljYWxpemVfcmVsb2MKLQlta29iamVjdAotICAgVGhpcyBzaG91bGQgYWxzbyBiZSBmaXhlZC4gICovCi0KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaHAzMDBocHV4IgotI2RlZmluZSBNWShPUCkgQ0FUKGhwMzAwaHB1eF8sT1ApCi0KLSNkZWZpbmUgZXh0ZXJuYWxfZXhlYyBocDMwMGhwdXhfZXhlY19ieXRlcwotI2RlZmluZSBleHRlcm5hbF9ubGlzdCBocDMwMGhwdXhfbmxpc3RfYnl0ZXMKLQotI2luY2x1ZGUgImFvdXQvaHAzMDBocHV4LmgiCi0KLS8qIGRlZmluZSB0aGVzZSBzbyB3ZSBjYW4gY29tcGlsZSB1bnVzZWQgcm91dGluZXMgaW4gYW91dHguaCAqLwotI2RlZmluZSBlX3N0cnggIGVfc2hsaWIKLSNkZWZpbmUgZV9vdGhlciBlX2xlbmd0aAotI2RlZmluZSBlX2Rlc2MgIGVfYWxtb2QKLQotI2RlZmluZSBBUl9QQURfQ0hBUiAnLycKLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2JzZF9hcm1hcF9mMgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBwcm92aWRlIG92ZXJyaWRlcyBmb3Igcm91dGluZXMgaW4gdGhpcyBmaWxlICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiB0aGVzZSBkb24ndCB1c2UgTVkgYmVjYXVzZSB0aGF0IGNhdXNlcyBwcm9ibGVtcyB3aXRoaW4gSlVNUF9UQUJMRQotICAgKENBVCB3aW5kcyB1cCBiZWluZyBleHBhbmRlZCByZWN1cnNpdmVseSwgd2hpY2ggQU5TSSBDIGNvbXBpbGVycwotICAgd2lsbCBub3QgZG8pLiAgKi8KLSNkZWZpbmUgTVlfZ2V0X3N5bXRhYiBocDMwMGhwdXhfZ2V0X3N5bXRhYgotI2RlZmluZSBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGhwMzAwaHB1eF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBocDMwMGhwdXhfY2Fub25pY2FsaXplX3JlbG9jCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBocDMwMGhwdXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0KLSNkZWZpbmUgTVlfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBNWV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBNWV9maW5hbF9saW5rX2NhbGxiYWNrIHVudXNlZAotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCi0vKiBVbnRpbCBhbmQgdW5sZXNzIHdlIGNvbnZlcnQgdGhlIHNsdXJwX3JlbG9jIGFuZCBzbHVycF9zeW10YWIKLSAgIHJvdXRpbmVzIGluIHRoaXMgZmlsZSwgd2UgY2FuIG5vdCB1c2UgdGhlIGRlZmF1bHQgYW91dAotICAgZnJlZV9jYWNoZWRfaW5mbyByb3V0aW5lIHdoaWNoIGFzc3VtZXMgdGhhdCB0aGUgcmVsb2NzIGFuZCBzeW10YWJzCi0gICB3ZXJlIGFsbG9jYXRlZCB1c2luZyBtYWxsb2MuICAqLwotI2RlZmluZSBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBiZmRfdHJ1ZQotCi0jZGVmaW5lIGhwMzAwaHB1eF93cml0ZV9zeW1zIGFvdXRfMzJfd3JpdGVfc3ltcwotCi0jZGVmaW5lIE1ZX2NhbGxiYWNrIE1ZKGNhbGxiYWNrKQotCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDB4MgotCi0jZGVmaW5lIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbiBOQU1FKGhwMzAwaHB1eF8zMl8sc3dhcF9leGVjX2hlYWRlcl9pbikKLQotI2RlZmluZSBIUF9TWU1UWVBFX1VOREVGSU5FRAkweDAwCi0jZGVmaW5lIEhQX1NZTVRZUEVfQUJTT0xVVEUJMHgwMQotI2RlZmluZSBIUF9TWU1UWVBFX1RFWFQJCTB4MDIKLSNkZWZpbmUgSFBfU1lNVFlQRV9EQVRBCQkweDAzCi0jZGVmaW5lIEhQX1NZTVRZUEVfQlNTCQkweDA0Ci0jZGVmaW5lIEhQX1NZTVRZUEVfQ09NTU9OCTB4MDUKLQotI2RlZmluZSBIUF9TWU1UWVBFX1RZUEUJCTB4MEYKLSNkZWZpbmUgSFBfU1lNVFlQRV9GSUxFTkFNRQkweDFGCi0KLSNkZWZpbmUgSFBfU1lNVFlQRV9BTElHTgkweDEwCi0jZGVmaW5lIEhQX1NZTVRZUEVfRVhURVJOQUwJMHgyMAotI2RlZmluZSBIUF9TRUNPTkRBUllfU1lNQk9MICAgICAweDQwCi0KLS8qIFJFTE9DQVRJT04gREVGSU5JVElPTlMgKi8KLSNkZWZpbmUgSFBfUlNFR01FTlRfVEVYVAkweDAwCi0jZGVmaW5lIEhQX1JTRUdNRU5UX0RBVEEJMHgwMQotI2RlZmluZSBIUF9SU0VHTUVOVF9CU1MJCTB4MDIKLSNkZWZpbmUgSFBfUlNFR01FTlRfRVhURVJOQUwJMHgwMwotI2RlZmluZSBIUF9SU0VHTUVOVF9QQ1JFTCAgICAgICAweDA0Ci0jZGVmaW5lIEhQX1JTRUdNRU5UX1JETFQgICAgICAgIDB4MDUKLSNkZWZpbmUgSFBfUlNFR01FTlRfUlBMVCAgICAgICAgMHgwNgotI2RlZmluZSBIUF9SU0VHTUVOVF9OT09QCTB4M0YKLQotI2RlZmluZSBIUF9STEVOR1RIX0JZVEUJCTB4MDAKLSNkZWZpbmUgSFBfUkxFTkdUSF9XT1JECQkweDAxCi0jZGVmaW5lIEhQX1JMRU5HVEhfTE9ORwkJMHgwMgotI2RlZmluZSBIUF9STEVOR1RIX0FMSUdOCTB4MDMKLQotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhocDMwMGhwdXgsXzMyXyx5KQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotLyogYW91dHguaCByZXF1aXJlcyBkZWZpbml0aW9ucyBmb3IgQk1BR0lDIGFuZCBRTUFHSUMuICAqLwotI2RlZmluZSBCTUFHSUMgSFBVWF9ET1RfT19NQUdJQwotI2RlZmluZSBRTUFHSUMgMDMxNAotCi0jaW5jbHVkZSAiYW91dHguaCIKLQotLyogU2luY2UgdGhlIGhwdXggc3ltYm9sIHRhYmxlIGhhcyBubGlzdCBlbGVtZW50cyBpbnRlcnNwZXJzZWQgd2l0aAotICAgc3RyaW5ncyBhbmQgd2UgbmVlZCB0byBpbnNlcnQgc29tIHN0cmluZ3MgZm9yIHNlY29uZGFyeSBzeW1ib2xzLCB3ZQotICAgZ2l2ZSBvdXJzZWx2ZXMgYSBsaXR0bGUgZXh0cmEgcGFkZGluZyB1cCBmcm9udCB0byBhY2NvdW50IGZvcgotICAgdGhpcy4gIE5vdGUgdGhhdCBmb3IgZWFjaCBub24tc2Vjb25kYXJ5IHN5bWJvbCB3ZSBwcm9jZXNzLCB3ZSBnYWluCi0gICA5IGJ5dGVzIG9mIHNwYWNlIGZvciB0aGUgZGlzY2FyZGVkIG5saXN0IGVsZW1lbnQgKG9uZSBieXRlIHVzZWQgZm9yCi0gICBudWxsKS4gIFNZTV9FWFRSQV9CWVRFUyBpcyB0aGUgZXh0cmEgc3BhY2UuICAqLwotI2RlZmluZSBTWU1fRVhUUkFfQllURVMgICAxMDI0Ci0KLS8qIFNldCBwYXJhbWV0ZXJzIGFib3V0IHRoaXMgYS5vdXQgZmlsZSB0aGF0IGFyZSBtYWNoaW5lLWRlcGVuZGVudC4KLSAgIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBzb21lX2FvdXRfb2JqZWN0X3AganVzdCBiZWZvcmUgaXQgcmV0dXJucy4gICovCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1NWSAoY2FsbGJhY2spIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICAvKiBDYWxjdWxhdGUgdGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSBwYXJ0cyBvZiBhIG5ld2x5IHJlYWQgYW91dCBoZWFkZXIgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBOX1RYVFNJWkUgKCpleGVjcCk7Ci0KLSAgLyogVGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBOX1RYVEFERFIgKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSICgqZXhlY3ApOwotICBvYmpfYnNzc2VjIChhYmZkKS0+dm1hID0gTl9CU1NBRERSICgqZXhlY3ApOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+bG1hID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+bG1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGICgqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRiAoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fRFJFTE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOwotCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSNpZmRlZiBTRVRfQVJDSF9NQUNICi0gIFNFVF9BUkNIX01BQ0ggKGFiZmQsICpleGVjcCk7Ci0jZWxzZQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBERUZBVUxUX0FSQ0gsIDApOwotI2VuZGlmCi0KLQotICBpZiAob2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9PSBnbnVfZW5jYXBfZm9ybWF0KQotICAgIHsKLSAgICAgIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHJlbG9jYXRpb24gaW5mbyAqLwotICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fR05VX1RSRUxPRkYgKCpleGVjcCk7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9HTlVfRFJFTE9GRiAoKmV4ZWNwKTsKLQotICAgICAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICAgICAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IE5fR05VX1NZTU9GRiAoKmV4ZWNwKTsKLSAgICAgIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSAob2JqX3N5bV9maWxlcG9zIChhYmZkKSArIGV4ZWNwLT5hX3N5bXMpOwotCi0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTOwotICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBleGVjcC0+YV9zeW1zIC8gMTI7Ci0gICAgICBvYmpfc3ltYm9sX2VudHJ5X3NpemUgKGFiZmQpID0gMTI7Ci0gICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSAgICB9Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLWV4dGVybiBib29sZWFuIGFvdXRfMzJfd3JpdGVfc3ltcyBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1NWSAod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwkvKiBkdW1teSB2YXJzICovCi0gIGZpbGVfcHRyIHRleHRfZW5kOwotCi0gIG1lbXNldCAoJmV4ZWNfYnl0ZXMsIDAsIHNpemVvZiAoZXhlY19ieXRlcykpOwotI2lmIENIT09TRV9SRUxPQ19TSVpFCi0gIENIT09TRV9SRUxPQ19TSVpFIChhYmZkKTsKLSNlbHNlCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotI2VuZGlmCi0KLSAgaWYgKGFkYXRhIChhYmZkKS5tYWdpYyA9PSB1bmRlY2lkZWRfbWFnaWMpCi0gICAgTkFNRSAoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOwotICBleGVjcC0+YV9zeW1zID0gMDsKLQotICBleGVjcC0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0KLSAgZXhlY3AtPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0JCSAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLSAgZXhlY3AtPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0JCSAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLQotICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCAweGMpOwotICBOX1NFVF9GTEFHUyAoKmV4ZWNwLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKLQotICBOQU1FIChhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsKLQotICAvKiB1cGRhdGUgZmllbGRzIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgc3dhcF9leGVjX2hlYWRlcl9vdXQgKi8KLQotICAvKiB0aGlzIGlzIHJlYWxseSB0aGUgc3ltIHRhYmxlIHNpemUgYnV0IHdlIHN0b3JlIGl0IGluIGRyZWxvY3MgKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIDEyLCBleGVjX2J5dGVzLmVfZHJlbG9jcyk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwTCwgZmFsc2UpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICYgZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQotCSAgIT0gRVhFQ19CWVRFU19TSVpFKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzeW1ib2xzLCBhbmQgdGhlbiB0aGUgcmVsb2NzLiAgV2UgbXVzdCB3cml0ZSBvdXQKLSAgICAgICB0aGUgc3ltYm9scyBmaXJzdCBzbyB0aGF0IHdlIGtub3cgdGhlIHN5bWJvbCBpbmRpY2VzLiAgKi8KLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTa2lwIHRoZSByZWxvY3MgdG8gd2hlcmUgd2Ugd2FudCB0byBwdXQgdGhlIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIE5fRFJFTE9GRiAoKmV4ZWNwKSArIGV4ZWNwLT5hX2Ryc2l6ZSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCFNWSAod3JpdGVfc3ltcykgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChsb25nKSAoTl9UUkVMT0ZGICgqZXhlY3ApKSwgZmFsc2UpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFOQU1FIChhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChsb25nKSAoTl9EUkVMT0ZGICgqZXhlY3ApKSwgZmFsc2UpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFOQU1FIChhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBjb252ZXJ0IHRoZSBocCBzeW1ib2wgdHlwZSB0byBiZSB0aGUgc2FtZSBhcyBhb3V0NjQuaCB1c2FnZSBzbyB3ZSAqLwotLyogY2FuIHBpZ2d5YmFjayByb3V0aW5lcyBpbiBhb3V0eC5oLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotc3RhdGljIHZvaWQKLWNvbnZlcnRfc3ltX3R5cGUgKHN5bV9wb2ludGVyLCBjYWNoZV9wdHIsIGFiZmQpCi0gICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX3BvaW50ZXI7Ci0gICAgIGFvdXRfc3ltYm9sX3R5cGUgKmNhY2hlX3B0cjsKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgbmFtZV90eXBlOwotICBpbnQgbmV3X3R5cGU7Ci0KLSAgbmFtZV90eXBlID0gKGNhY2hlX3B0ci0+dHlwZSk7Ci0gIG5ld190eXBlID0gMDsKLQotICBpZiAoKG5hbWVfdHlwZSAmIEhQX1NZTVRZUEVfQUxJR04pICE9IDApCi0gICAgewotICAgICAgLyogaW91X2Vycm9yICgiYWxpZ25lZCBzeW1ib2wgZW5jb3VudGVyZWQ6ICVzIiwgbmFtZSk7Ki8KLSAgICAgIG5hbWVfdHlwZSA9IDA7Ci0gICAgfQotCi0gIGlmIChuYW1lX3R5cGUgPT0gSFBfU1lNVFlQRV9GSUxFTkFNRSkKLSAgICBuZXdfdHlwZSA9IE5fRk47Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG5hbWVfdHlwZSAmIEhQX1NZTVRZUEVfVFlQRSkKLQl7Ci0JY2FzZSBIUF9TWU1UWVBFX1VOREVGSU5FRDoKLQkgIG5ld190eXBlID0gTl9VTkRGOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfQUJTT0xVVEU6Ci0JICBuZXdfdHlwZSA9IE5fQUJTOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfVEVYVDoKLQkgIG5ld190eXBlID0gTl9URVhUOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfREFUQToKLQkgIG5ld190eXBlID0gTl9EQVRBOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfQlNTOgotCSAgbmV3X3R5cGUgPSBOX0JTUzsKLQkgIGJyZWFrOwotCi0JY2FzZSBIUF9TWU1UWVBFX0NPTU1PTjoKLQkgIG5ld190eXBlID0gTl9DT01NOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAobmFtZV90eXBlICYgSFBfU1lNVFlQRV9FWFRFUk5BTCkKLQluZXdfdHlwZSB8PSBOX0VYVDsKLQotICAgICAgaWYgKG5hbWVfdHlwZSAmIEhQX1NFQ09OREFSWV9TWU1CT0wpCi0JewotCSAgc3dpdGNoIChuZXdfdHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIE5fVU5ERiB8IE5fRVhUOgotCSAgICAgIC8qIElmIHRoZSB2YWx1ZSBpcyBub256ZXJvLCB0aGVuIGp1c3QgdHJlYXQgdGhpcyBhcyBhCi0gICAgICAgICAgICAgICAgIGNvbW1vbiBzeW1ib2wuICBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyBjb3JyZWN0IGluCi0gICAgICAgICAgICAgICAgIGFsbCBjYXNlcywgYnV0IGl0IGlzIG1vcmUgY29ycmVjdCB0aGFuIHRyZWF0aW5nIGl0IGFzCi0gICAgICAgICAgICAgICAgIGEgd2VhayB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgPT0gMCkKLQkJbmV3X3R5cGUgPSBOX1dFQUtVOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6Ci0JICAgICAgbmV3X3R5cGUgPSBOX1dFQUtBOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE5fVEVYVCB8IE5fRVhUOgotCSAgICAgIG5ld190eXBlID0gTl9XRUFLVDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBOX0RBVEEgfCBOX0VYVDoKLQkgICAgICBuZXdfdHlwZSA9IE5fV0VBS0Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTl9CU1MgfCBOX0VYVDoKLQkgICAgICBuZXdfdHlwZSA9IE5fV0VBS0I7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBjYWNoZV9wdHItPnR5cGUgPSBuZXdfdHlwZTsKLQotfQotCi0KLS8qCi1ERVNDUklQVElPTgotICAgICAgICBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gZXhlY3V0YWJsZSBoZWFkZXIgdGFrZW4gZnJvbSBhIHJhdwotICAgICAgICBieXRlIHN0cmVhbSBtZW1vcnkgaW1hZ2UsIGludG8gdGhlIGludGVybmFsIGV4ZWNfaGVhZGVyCi0gICAgICAgIHN0cnVjdHVyZS4KLSovCi0KLXZvaWQKLU5BTUUgKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikgKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKikgcmF3X2J5dGVzOwotCi0gIC8qIFRoZSBpbnRlcm5hbF9leGVjIHN0cnVjdHVyZSBoYXMgc29tZSBmaWVsZHMgdGhhdCBhcmUgdW51c2VkIGluIHRoaXMKLSAgICAgY29uZmlndXJhdGlvbiAoSUUgZm9yIGk5NjApLCBzbyBlbnN1cmUgdGhhdCBhbGwgc3VjaCB1bmluaXRpYWxpemVkCi0gICAgIGZpZWxkcyBhcmUgemVybydkIG91dC4gIFRoZXJlIGFyZSBwbGFjZXMgd2hlcmUgdHdvIG9mIHRoZXNlIHN0cnVjdHMKLSAgICAgYXJlIG1lbWNtcCdkLCBhbmQgdGh1cyB0aGUgY29udGVudHMgZG8gbWF0dGVyLiAqLwotICBtZW1zZXQgKGV4ZWNwLCAwLCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9leGVjKSk7Ci0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgZXhlY3AsIGZyb20gdGhlIGJ5dGVzIGluIHRoZSByYXcgZGF0YS4gICovCi0gIGV4ZWNwLT5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX2luZm8pOwotICBleGVjcC0+YV90ZXh0ID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOwotICBleGVjcC0+YV9kYXRhID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2RhdGEpOwotICBleGVjcC0+YV9ic3MgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfYnNzKTsKLSAgZXhlY3AtPmFfc3ltcyA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9zeW1zKTsKLSAgZXhlY3AtPmFfZW50cnkgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZW50cnkpOwotICBleGVjcC0+YV90cnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdHJzaXplKTsKLSAgZXhlY3AtPmFfZHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Ryc2l6ZSk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogY2hlY2sgdGhlIGhlYWRlciB0byBzZWUgaWYgaXQgd2FzIGdlbmVyYXRlZCBieSBhIGJmZCBvdXRwdXQgKi8KLSAgLyogdGhpcyBpcyBkZXRlY3RlZCByYXRoZXIgYml6YXJlbHkgYnkgcmVxdWlyaW5nIGEgYnVuY2ggb2YgICAgKi8KLSAgLyogaGVhZGVyIGZpZWxkcyB0byBiZSB6ZXJvIGFuZCBhbiBvbGQgdW51c2VkIGZpZWxkIChub3cgdXNlZCkgKi8KLSAgLyogdG8gYmUgc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgZG8KLSAgICB7Ci0gICAgICBsb25nIHN5bXM7Ci0gICAgICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqcmF3cHRyOwotICAgICAgaWYgKGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPmVfcGFzc2l6ZSkgIT0gMCkKLQlicmVhazsKLSAgICAgIGlmIChiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX3N5bXMpICE9IDApCi0JYnJlYWs7Ci0gICAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9zdXBzaXplKSAhPSAwKQotCWJyZWFrOwotCi0gICAgICBzeW1zID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9kcmVsb2NzKTsKLSAgICAgIGlmIChzeW1zID09IDApCi0JYnJlYWs7Ci0KLSAgICAgIC8qIE9LLCB3ZSd2ZSBwYXNzZWQgdGhlIHRlc3QgYXMgYmVzdCBhcyB3ZSBjYW4gZGV0ZXJtaW5lICovCi0gICAgICBleGVjcC0+YV9zeW1zID0gc3ltczsKLQotICAgICAgLyogYWxsb2NhdGUgc3RvcmFnZSBmb3Igd2hlcmUgd2Ugd2lsbCBzdG9yZSB0aGlzIHJlc3VsdCAqLwotICAgICAgcmF3cHRyID0gKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoKnJhd3B0cikpOwotCi0gICAgICBpZiAocmF3cHRyID09IE5VTEwpCi0JcmV0dXJuOwotICAgICAgYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gcmF3cHRyOwotICAgICAgb2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9IGdudV9lbmNhcF9mb3JtYXQ7Ci0gICAgfQotICB3aGlsZSAoMCk7Ci19Ci0KLQotLyogVGhlIGhwIHN5bWJvbCB0YWJsZSBpcyBhIGJpdCBkaWZmZXJlbnQgdGhhbiBvdGhlciBhLm91dCB0YXJnZXRzLiAgSW5zdGVhZAotICAgb2YgaGF2aW5nIGFuIGFycmF5IG9mIG5saXN0IGl0ZW1zIGFuZCBhbiBhcnJheSBvZiBzdHJpbmdzLCBocCdzIGZvcm1hdAotICAgaGFzIHRoZW0gbWl4ZWQgdG9nZXRoZXIgaW4gb25lIHN0cnVjdHVyZS4gIEluIGFkZGl0aW9uLCB0aGUgc3RyaW5ncyBhcmUKLSAgIG5vdCBudWxsIHRlcm1pbmF0ZWQuICBJdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0gICBubGlzdCBlbGVtZW50IDEKLSAgIHN0cmluZzEKLSAgIG5saXN0IGVsZW1lbnQgMgotICAgc3RyaW5nMgotICAgLi4uCi0KLSAgIFRoZSB3aG9sZSBzeW1ib2wgdGFibGUgaXMgcmVhZCBhcyBvbmUgY2h1bmsgYW5kIHRoZW4gd2UgbWFyY2ggdGhydSBpdAotICAgYW5kIGNvbnZlcnQgaXQgdG8gY2Fub25pY2FsIGZvcm0uICBBcyB3ZSBtYXJjaCB0aHJ1IHRoZSB0YWJsZSwgd2UgY29weQotICAgdGhlIG5saXN0IGRhdGEgaW50byB0aGUgaW50ZXJuYWwgZm9ybSBhbmQgd2UgY29tcGFjdCB0aGUgc3RyaW5ncyBhbmQgbnVsbAotICAgdGVybWluYXRlIHRoZW0sIHVzaW5nIHN0b3JhZ2UgZnJvbSB0aGUgYWxyZWFkeSBhbGxvY2F0ZWQgc3ltYm9sIHRhYmxlOgotCi0gICBzdHJpbmcxCi0gICBudWxsCi0gICBzdHJpbmcyCi0gICBudWxsCi0gICAuLi4KLSovCi0KLWJvb2xlYW4KLU1ZIChzbHVycF9zeW1ib2xfdGFibGUpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltYm9sX2J5dGVzOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bXM7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX3BvaW50ZXI7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX2VuZDsKLSAgY2hhciAqc3RyaW5nczsKLSAgYW91dF9zeW1ib2xfdHlwZSAqY2FjaGVkOwotICB1bnNpZ25lZCBudW1fc3ltcyA9IDA7Ci0KLSAgLyogSWYgdGhlcmUncyBubyB3b3JrIHRvIGJlIGRvbmUsIGRvbid0IGRvIGFueSAqLwotICBpZiAob2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgIT0gKGFvdXRfc3ltYm9sX3R5cGUgKikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgc3ltYm9sX2J5dGVzID0gZXhlY19oZHIgKGFiZmQpLT5hX3N5bXM7Ci0KLSAgc3RyaW5ncyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQlzeW1ib2xfYnl0ZXMgKyBTWU1fRVhUUkFfQllURVMpOwotICBpZiAoIXN0cmluZ3MpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW1zID0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSAoc3RyaW5ncyArIFNZTV9FWFRSQV9CWVRFUyk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkICgoUFRSKSBzeW1zLCBzeW1ib2xfYnl0ZXMsIDEsIGFiZmQpICE9IHN5bWJvbF9ieXRlcykKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgc3ltcyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0KLSAgc3ltX2VuZCA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgKCgoY2hhciAqKSBzeW1zKSArIHN5bWJvbF9ieXRlcyk7Ci0KLSAgLyogZmlyc3QsIG1hcmNoIHRocnUgdGhlIHRhYmxlIGFuZCBmaWd1cmUgb3V0IGhvdyBtYW55IHN5bWJvbHMgdGhlcmUgYXJlICovCi0gIGZvciAoc3ltX3BvaW50ZXIgPSBzeW1zOyBzeW1fcG9pbnRlciA8IHN5bV9lbmQ7IHN5bV9wb2ludGVyKyssIG51bV9zeW1zKyspCi0gICAgewotICAgICAgLyogc2tpcCBvdmVyIHRoZSBlbWJlZGRlZCBzeW1ib2wuICovCi0gICAgICBzeW1fcG9pbnRlciA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgKCgoY2hhciAqKSBzeW1fcG9pbnRlcikgKwotCQkJCQkgICAgICAgc3ltX3BvaW50ZXItPmVfbGVuZ3RoWzBdKTsKLSAgICB9Ci0KLSAgLyogbm93IHRoYXQgd2Uga25vdyB0aGUgc3ltYm9sIGNvdW50LCB1cGRhdGUgdGhlIGJmZCBoZWFkZXIgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBudW1fc3ltczsKLQotICBjYWNoZWQgPSAoKGFvdXRfc3ltYm9sX3R5cGUgKikKLQkgICAgYmZkX3phbGxvYyAoYWJmZCwKLQkJCWJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlKSkpOwotICBpZiAoY2FjaGVkID09IE5VTEwgJiYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogYXMgd2UgbWFyY2ggdGhydSB0aGUgaHAgc3ltYm9sIHRhYmxlLCBjb252ZXJ0IGl0IGludG8gYSBsaXN0IG9mCi0gICAgIG51bGwgdGVybWluYXRlZCBzdHJpbmdzIHRvIGhvbGQgdGhlIHN5bWJvbCBuYW1lcy4gIE1ha2Ugc3VyZSBhbnkKLSAgICAgYXNzaWdubWVudCB0byB0aGUgc3RyaW5ncyBwb2ludGVyIGlzIGRvbmUgYWZ0ZXIgd2UncmUgdGhydSB1c2luZwotICAgICB0aGUgbmxpc3Qgc28gd2UgZG9uJ3Qgb3ZlcndyaXRlIGFueXRoaW5nIGltcG9ydGFudC4gKi8KLQotICAvKiBPSywgbm93IHdhbGsgdGhlIG5ldyBzeW10YWJsZSwgY2FjaGVpbmcgc3ltYm9sIHByb3BlcnRpZXMgKi8KLSAgewotICAgIGFvdXRfc3ltYm9sX3R5cGUgKmNhY2hlX3B0ciA9IGNhY2hlZDsKLSAgICBhb3V0X3N5bWJvbF90eXBlIGNhY2hlX3NhdmU7Ci0gICAgLyogUnVuIHRocm91Z2ggdGFibGUgYW5kIGNvcHkgdmFsdWVzICovCi0gICAgZm9yIChzeW1fcG9pbnRlciA9IHN5bXMsIGNhY2hlX3B0ciA9IGNhY2hlZDsKLQkgc3ltX3BvaW50ZXIgPCBzeW1fZW5kOyBzeW1fcG9pbnRlcisrLCBjYWNoZV9wdHIrKykKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCWNhY2hlX3B0ci0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCWNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlID0gR0VUX1NXT1JEIChhYmZkLCBzeW1fcG9pbnRlci0+ZV92YWx1ZSk7Ci0JY2FjaGVfcHRyLT5kZXNjID0gYmZkX2dldF8xNiAoYWJmZCwgc3ltX3BvaW50ZXItPmVfYWxtb2QpOwotCWNhY2hlX3B0ci0+dHlwZSA9IGJmZF9nZXRfOCAoYWJmZCwgc3ltX3BvaW50ZXItPmVfdHlwZSk7Ci0JY2FjaGVfcHRyLT5zeW1ib2wudWRhdGEucCA9IE5VTEw7Ci0JbGVuZ3RoID0gYmZkX2dldF84IChhYmZkLCBzeW1fcG9pbnRlci0+ZV9sZW5ndGgpOwotCWNhY2hlX3B0ci0+b3RoZXIgPSBsZW5ndGg7CS8qIG90aGVyIG5vdCB1c2VkLCBzYXZlIGxlbmd0aCBoZXJlICovCi0KLQljYWNoZV9zYXZlID0gKmNhY2hlX3B0cjsKLQljb252ZXJ0X3N5bV90eXBlIChzeW1fcG9pbnRlciwgY2FjaGVfcHRyLCBhYmZkKTsKLQlpZiAoIXRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGNhY2hlX3B0cikpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogZm9yIGhwdXgsIHRoZSAnbGVuZ2h0JyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiAqLwotCS8qIHRoZSBzeW1ib2wgbmFtZSB3aGljaCBmb2xsb3dzIHRoZSBubGlzdCBlbnRyeS4gICAgICAgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JaWYgKGxlbmd0aCkKLQkgIHsKLQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCSAgICAvKiB0aGUgaHAgc3RyaW5nIGlzIG5vdCBudWxsIHRlcm1pbmF0ZWQgc28gd2UgY3JlYXRlIGEgbmV3IG9uZSovCi0JICAgIC8qIGJ5IGNvcHlpbmcgdGhlIHN0cmluZyB0byBvdmVybGFwIHRoZSBqdXN0IHZhY2F0ZWQgbmxpc3QgICAgKi8KLQkgICAgLyogc3RydWN0dXJlIGJlZm9yZSBpdCBpbiBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JICAgIGNhY2hlX3B0ci0+c3ltYm9sLm5hbWUgPSBzdHJpbmdzOwotCSAgICBtZW1jcHkgKHN0cmluZ3MsIHN5bV9wb2ludGVyICsgMSwgbGVuZ3RoKTsKLQkgICAgc3RyaW5nc1tsZW5ndGhdID0gJ1wwJzsKLQkgICAgc3RyaW5ncyArPSBsZW5ndGggKyAxOwotCSAgfQotCWVsc2UKLQkgIGNhY2hlX3B0ci0+c3ltYm9sLm5hbWUgPSAoY2hhciAqKSBOVUxMOwotCi0JLyogc2tpcCBvdmVyIHRoZSBlbWJlZGRlZCBzeW1ib2wuICovCi0Jc3ltX3BvaW50ZXIgPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopICgoKGNoYXIgKikgc3ltX3BvaW50ZXIpICsKLQkJCQkJCSBsZW5ndGgpOwotICAgICAgfQotICB9Ci0KLSAgb2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgPSBjYWNoZWQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi12b2lkCi1NWSAoc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaHAzMDBocHV4X3JlbG9jICpieXRlczsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybiA9IDA7Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWwgPSAwOwotICBzdHJ1Y3QgYW91dGRhdGEgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOwotCi0gIGNhY2hlX3B0ci0+YWRkcmVzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcyk7Ci0gIHJfaW5kZXggPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGJ5dGVzLT5yX2luZGV4KTsKLQotICBzd2l0Y2ggKGJ5dGVzLT5yX3R5cGVbMF0pCi0gICAgewotICAgIGNhc2UgSFBfUlNFR01FTlRfVEVYVDoKLSAgICAgIHJfaW5kZXggPSBOX1RFWFQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhQX1JTRUdNRU5UX0RBVEE6Ci0gICAgICByX2luZGV4ID0gTl9EQVRBOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9CU1M6Ci0gICAgICByX2luZGV4ID0gTl9CU1M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhQX1JTRUdNRU5UX0VYVEVSTkFMOgotICAgICAgcl9leHRlcm4gPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9QQ1JFTDoKLSAgICAgIHJfZXh0ZXJuID0gMTsKLSAgICAgIHJfcGNyZWwgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9SRExUOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9SUExUOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9OT09QOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHN3aXRjaCAoYnl0ZXMtPnJfbGVuZ3RoWzBdKQotICAgIHsKLSAgICBjYXNlIEhQX1JMRU5HVEhfQllURToKLSAgICAgIHJfbGVuZ3RoID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUkxFTkdUSF9XT1JEOgotICAgICAgcl9sZW5ndGggPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9STEVOR1RIX0xPTkc6Ci0gICAgICByX2xlbmd0aCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgY2FjaGVfcHRyLT5ob3d0byA9IGhvd3RvX3RhYmxlX3N0ZCArIHJfbGVuZ3RoICsgNCAqIHJfcGNyZWw7Ci0gIC8qIEZJWE1FLXNvb246ICBSb2xsIGJhc2VyZWwsIGptcHRhYmxlLCByZWxhdGl2ZSBiaXRzIGludG8gaG93dG8gc2V0dGluZyAqLwotCi0gIC8qIFRoaXMgbWFjcm8gdXNlcyB0aGUgcl9pbmRleCB2YWx1ZSBjb21wdXRlZCBhYm92ZSAqLwotICBpZiAocl9wY3JlbCAmJiByX2V4dGVybikKLSAgICB7Ci0gICAgICAvKiBUaGUgR05VIGxpbmtlciBhc3N1bWVzIGFueSBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2Ygc2VjdGlvbiAqLwotICAgICAgLyogaXMgYWxyZWFkeSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgaW1hZ2Ugd2hpbGUgdGhlIEhQIGxpbmtlciAgKi8KLSAgICAgIC8qIGFkZHMgdGhpcyBpbiBsYXRlci4gIEFkZCBpdCBpbiBub3cuLi4gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBNT1ZFX0FERFJFU1MgKC1jYWNoZV9wdHItPmFkZHJlc3MpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIE1PVkVfQUREUkVTUyAoMCk7Ci0gICAgfQotfQotCi1ib29sZWFuCi1NWSAoc2x1cnBfcmVsb2NfdGFibGUpIChhYmZkLCBhc2VjdCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBiZmRfc2l6ZV90eXBlIHJlbG9jX3NpemU7Ci0gIFBUUiByZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbG9jX2NhY2hlOwotICBzaXplX3QgZWFjaF9zaXplOwotICBzdHJ1Y3QgaHAzMDBocHV4X3JlbG9jICpycHRyOwotICB1bnNpZ25lZCBpbnQgY291bnRlcjsKLSAgYXJlbGVudCAqY2FjaGVfcHRyOwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgewotICAgICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemU7Ci0gICAgICBnb3RvIGRvaXQ7Ci0gICAgfQotCi0gIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCi0gICAgewotICAgICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemU7Ci0gICAgICBnb3RvIGRvaXQ7Ci0gICAgfQotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLQotZG9pdDoKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBhc2VjdC0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWFjaF9zaXplID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotCi0gIGNvdW50ID0gcmVsb2Nfc2l6ZSAvIGVhY2hfc2l6ZTsKLQotCi0gIHJlbG9jX2NhY2hlID0gKGFyZWxlbnQgKikgYmZkX3phbGxvYyAoYWJmZCwgKHNpemVfdCkgKGNvdW50ICogc2l6ZW9mCi0JCQkJCQkJKGFyZWxlbnQpKSk7Ci0gIGlmICghcmVsb2NfY2FjaGUgJiYgY291bnQgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmVsb2NzID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCByZWxvY19zaXplKTsKLSAgaWYgKCFyZWxvY3MgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxvY19zaXplLCBhYmZkKSAhPSByZWxvY19zaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY3MpOwotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jX2NhY2hlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcnB0ciA9IChzdHJ1Y3QgaHAzMDBocHV4X3JlbG9jICopIHJlbG9jczsKLSAgY291bnRlciA9IDA7Ci0gIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlOwotCi0gIGZvciAoOyBjb3VudGVyIDwgY291bnQ7IGNvdW50ZXIrKywgcnB0cisrLCBjYWNoZV9wdHIrKykKLSAgICB7Ci0gICAgICBNWSAoc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBycHRyLCBjYWNoZV9wdHIsIHN5bWJvbHMsCi0JCQkgICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSk7Ci0gICAgfQotCi0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jcyk7Ci0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7Ci0gIGFzZWN0LT5yZWxvY19jb3VudCA9IGNvdW50OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGlkZW50aWNhbCB0byBmdW5jdGlvbnMgaW4gYW91dHguaCBleGNlcHQgKi8KLS8qIHRoZXkgcmVmZXIgdG8gTVkoZnVuYykgcmF0aGVyIHRoYW4gTkFNRShhb3V0LGZ1bmMpIGFuZCB0aGV5IGFsc28gICAgICovCi0vKiBjYWxsIGFvdXRfMzIgdmVyc2lvbnMgaWYgdGhlIGlucHV0IGZpbGUgd2FzIGdlbmVyYXRlZCBieSBnY2MgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotbG9uZyBhb3V0XzMyX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICogYWJmZCwgYXN5bWJvbCAqKiBsb2NhdGlvbikpOwotbG9uZyBhb3V0XzMyX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi1sb25nIGFvdXRfMzJfY2Fub25pY2FsaXplX3JlbG9jIFBBUkFNUyAoKGJmZCAqIGFiZmQsIHNlY19wdHIgc2VjdGlvbiwKLQkJCQkJIGFyZWxlbnQgKiogcmVscHRyLAotCQkJCQkgYXN5bWJvbCAqKiBzeW1ib2xzKSk7Ci0KLWxvbmcKLU1ZIChnZXRfc3ltdGFiKSAoYWJmZCwgbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmxvY2F0aW9uOwotewotICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7Ci0gIGFvdXRfc3ltYm9sX3R5cGUgKnN5bWJhc2U7Ci0KLSAgaWYgKG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPT0gZ251X2VuY2FwX2Zvcm1hdCkKLSAgICByZXR1cm4gYW91dF8zMl9nZXRfc3ltdGFiIChhYmZkLCBsb2NhdGlvbik7Ci0KLSAgaWYgKCFNWSAoc2x1cnBfc3ltYm9sX3RhYmxlKSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGZvciAoc3ltYmFzZSA9IG9ial9hb3V0X3N5bWJvbHMgKGFiZmQpOyBjb3VudGVyKysgPCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTspCi0gICAgKihsb2NhdGlvbisrKSA9IChhc3ltYm9sICopIChzeW1iYXNlKyspOwotICAqbG9jYXRpb24rKyA9IDA7Ci0gIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotbG9uZwotTVkgKGdldF9zeW10YWJfdXBwZXJfYm91bmQpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IGdudV9lbmNhcF9mb3JtYXQpCi0gICAgcmV0dXJuIGFvdXRfMzJfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGlmICghTVkgKHNsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiAoc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlICopKTsKLX0KLQotCi0KLQotbG9uZwotTVkgKGNhbm9uaWNhbGl6ZV9yZWxvYykgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGlmIChvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IGdudV9lbmNhcF9mb3JtYXQpCi0gICAgcmV0dXJuIGFvdXRfMzJfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpOwotCi0gIGlmICghKHRibHB0ciB8fCBNWSAoc2x1cnBfcmVsb2NfdGFibGUpIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKLSAgICB7Ci0gICAgICBhcmVsZW50X2NoYWluICpjaGFpbiA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOwotICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGNvdW50KyspCi0JewotCSAgKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0JICBjaGFpbiA9IGNoYWluLT5uZXh0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotCi0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykKLQl7Ci0JICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLQl9Ci0gICAgfQotICAqcmVscHRyID0gMDsKLQotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaHBwYV9zdHVicy5oIGIvYmZkL2hwcGFfc3R1YnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4OTNlOC4uMDAwMDAwMAotLS0gYS9iZmQvaHBwYV9zdHVicy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogSFBQQSBsaW5rZXIgc3R1YiBpbnN0cnVjdGlvbnMgICovCi0KLS8qIFRoZXNlIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIHdoaWNoIHRoZSBsaW5rZXIgbWF5IGluc2VydCBpbnRvIHRoZQotICAgY29kZSBzdHJlYW0gd2hlbiBidWlsZGluZyBmaW5hbCBleGVjdXRhYmxlcyB0byBoYW5kbGUgb3V0LW9mLXJhbmdlCi0gICBjYWxscyBhbmQgYXJndW1lbnQgcmVsb2NhdGlvbnMuICAqLwotCi0jZGVmaW5lIExET19NNF9SMzFfUjMxCQkweDM3ZmYzZmY5CS8qIGxkbyAtNCglcjMxKSwlcjMxCSAgKi8KLSNkZWZpbmUgTERJTF9SMQkJCTB4MjAyMDAwMDAJLyogbGRpbCBYWFgsJXIxCQkgICovCi0jZGVmaW5lIEJFX1NSNF9SMQkJMHhlMDIwMjAwMAkvKiBiZSBYWFgoJXNyNCwlcjEpCSAgKi8KLSNkZWZpbmUgQ09QWV9SMzFfUjIgICAgICAgICAgCTB4MDgxZjAyNDIJLyogY29weSAlcjMxLCVyMgkgICovCi0jZGVmaW5lIEJMRV9TUjRfUjAJCTB4ZTQwMDIwMDAJLyogYmxlIFhYWCglc3I0LCVyMCkJICAqLwotI2RlZmluZSBCTEVfU1I0X1IxCQkweGU0MjAyMDAwCS8qIGJsZSBYWFgoJXNyNCwlcjEpCSAgKi8KLSNkZWZpbmUgQlZfTl8wX1IzMQkJMHhlYmUwYzAwMgkvKiBidixuIDAoJXIzMSkJCSAgKi8KLSNkZWZpbmUgU1RXX1IzMV9NOFIzMAkJMHg2YmRmM2ZmMQkvKiBzdHcgJXIzMSwtOCglcjMwKQkgICovCi0jZGVmaW5lIExEV19NOFIzMF9SMzEJCTB4NGJkZjNmZjEJLyogbGR3IC04KCVyMzApLCVyMzEJICAqLwotI2RlZmluZSBTVFdfQVJHX00xNlIzMAkJMHg2YmMwM2ZlMQkvKiBzdHcgJWFyZ1gsLTE2KCVyMzApCSAgKi8KLSNkZWZpbmUgTERXX00xNlIzMF9BUkcJCTB4NGJjMDNmZTEJLyogbGR3IC0xMiglcjMwKSwlYXJnWAkgICovCi0jZGVmaW5lIFNUV19BUkdfTTEyUjMwCQkweDZiYzAzZmU5CS8qIHN0dyAlYXJnWCwtMTYoJXIzMCkJICAqLwotI2RlZmluZSBMRFdfTTEyUjMwX0FSRwkJMHg0YmMwM2ZlOQkvKiBsZHcgLTEyKCVyMzApLCVhcmdYCSAgKi8KLSNkZWZpbmUgRlNUV19GQVJHX00xNlIzMAkweDI3YzExMjAwCS8qIGZzdHdzICVmYXJnWCwtMTYoJXIzMCkgKi8KLSNkZWZpbmUgRkxEV19NMTZSMzBfRkFSRwkweDI3YzExMDAwCS8qIGZsZHdzIC0xNiglcjMwKSwlZmFyZ1ggKi8KLSNkZWZpbmUgRlNURF9GQVJHX00xNlIzMAkweDJmYzExMjAwCS8qIGZzdGRzICVmYXJnWCwtMTYoJXIzMCkgKi8KLSNkZWZpbmUgRkxERF9NMTZSMzBfRkFSRwkweDJmYzExMDAwCS8qIGZsZGRzIC0xNiglcjMwKSwlZmFyZ1ggKi8KZGlmZiAtLWdpdCBhL2JmZC9ocHBhYnNkLWNvcmUuYyBiL2JmZC9ocHBhYnNkLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjMjJmNS4uMDAwMDAwMAotLS0gYS9iZmQvaHBwYWJzZC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBIUFBBIEJTRCBjb3JlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0gICBXcml0dGVuIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaAotICAgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LiAKLQotICAgVGhlIGNvcmUgZmlsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBVdGFoIDQuM0JTRCBhbmQgT1NGMSBwb3J0cyBvbiB0aGUKLSAgIFBBIGlzIGEgbWl4IGJldHdlZW4gdHJhZGl0aW9uYWwgY29yZXMgYW5kIGhwdXggY29yZXMgLS0ganVzdAotICAgZGlmZmVyZW50IGVub3VnaCB0aGF0IHN1cHBvcnRpbmcgdGhpcyBmb3JtYXQgd291bGQgdGVuZCB0byBhZGQKLSAgIGdyb3NzIGhhY2tzIHRvIHRyYWQtY29yZS5jIG9yIGhwdXgtY29yZS5jLiAgU28gaW5zdGVhZCB3ZSBrZWVwIGFueQotICAgZ3Jvc3MgaGFja3MgaXNvbGF0ZWQgdG8gdGhpcyBmaWxlLiAgKi8KLSAgIAotCi0vKiBUaGlzIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gc3lzdGVtcyB3aGljaCB1c2UgSFBQQS1CU0Qgc3R5bGUKLSAgIGNvcmUgZmlsZXMuCi0KLSAgIEkgd291bGQgbm90IGV4cGVjdCB0aGlzIHRvIGJlIG9mIHVzZSB0byBhbnkgb3RoZXIgaG9zdC90YXJnZXQsIGJ1dAotICAgeW91IG5ldmVyIGtub3cuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFCU0QpCi0KLSNpbmNsdWRlICJtYWNoaW5lL3ZtcGFyYW0uaCIKLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9kaXIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgotI2luY2x1ZGUgPHN5cy91c2VyLmg+CQkvKiBBZnRlciBhLm91dC5oICAqLwotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0KLXN0YXRpYyBhc2VjdGlvbiAqbWFrZV9iZmRfYXNlY3Rpb24gUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKiwKLQkJCQkJICAgIGZsYWd3b3JkLCBiZmRfc2l6ZV90eXBlLAotCQkJCQkgICAgZmlsZV9wdHIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGFzeW1ib2wgKmhwcGFic2RfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmhwcGFic2RfY29yZV9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNoYXIgKmhwcGFic2RfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IGhwcGFic2RfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGhwcGFic2RfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEuICAqLwotCi1zdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdAotICB7Ci0gICAgaW50IHNpZzsKLSAgICBjaGFyIGNtZFtNQVhDT01MRU4gKyAxXTsKLSAgICBhc2VjdGlvbiAqZGF0YV9zZWN0aW9uOwotICAgIGFzZWN0aW9uICpzdGFja19zZWN0aW9uOwotICAgIGFzZWN0aW9uICpyZWdfc2VjdGlvbjsKLSAgfTsKLQotI2RlZmluZSBjb3JlX2hkcihiZmQpICgoYmZkKS0+dGRhdGEuaHBwYWJzZF9jb3JlX2RhdGEpCi0jZGVmaW5lIGNvcmVfc2lnbmFsKGJmZCkgKGNvcmVfaGRyKGJmZCktPnNpZykKLSNkZWZpbmUgY29yZV9jb21tYW5kKGJmZCkgKGNvcmVfaGRyKGJmZCktPmNtZCkKLSNkZWZpbmUgY29yZV9kYXRhc2VjKGJmZCkgKGNvcmVfaGRyKGJmZCktPmRhdGFfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9zdGFja3NlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5zdGFja19zZWN0aW9uKQotI2RlZmluZSBjb3JlX3JlZ3NlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5yZWdfc2VjdGlvbikKLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBuYW1lLCBmbGFncywgX3Jhd19zaXplLCBvZmZzZXQsIGFsaWdubWVudF9wb3dlcikKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLXsKLSAgYXNlY3Rpb24gKmFzZWN0OwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT5maWxlcG9zID0gb2Zmc2V0OwotICBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gYWxpZ25tZW50X3Bvd2VyOwotCi0gIHJldHVybiBhc2VjdDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotaHBwYWJzZF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWhwcGFic2RfY29yZV9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgdmFsOwotICBzdHJ1Y3QgdXNlciB1OwotICBzdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdCAqY29yZWRhdGE7Ci0gIGludCBjbGlja3N6OwotCi0gIC8qIFRyeSB0byByZWFkIGluIHRoZSB1LWFyZWEuICBXZSB3aWxsIG5lZWQgaW5mb3JtYXRpb24gZnJvbSB0aGlzCi0gICAgIHRvIGtub3cgaG93IHRvIGdyb2sgdGhlIHJlc3Qgb2YgdGhlIGNvcmUgc3RydWN0dXJlcy4gICovCi0gIHZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSAmdSwgMSwgc2l6ZW9mIHUsIGFiZmQpOwotICBpZiAodmFsICE9IHNpemVvZiB1KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBHZXQgdGhlIHBhZ2Ugc2l6ZSBvdXQgb2YgdGhlIHUgc3RydWN0dXJlLiAgVGhpcyB3aWxsIGJlIGRpZmZlcmVudAotICAgICBmb3IgUEEgMS4wIG1hY2hpbmVzIGFuZCBQQSAxLjEgbWFjaGluZXMuICAgWXVrISAgKi8KLSAgY2xpY2tzeiA9IHUudV9wY2IucGNiX3Bnc3o7Ci0KLSAgLyogY2xpY2tzeiBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvID49IDJrLiAgKi8KLSAgaWYgKGNsaWNrc3ogPCAweDgwMAotICAgICAgfHwgY2xpY2tzeiAhPSAoY2xpY2tzeiAmIC1jbGlja3N6KSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotCi0gIC8qIFNhbml0eSBjaGVja3MuICBNYWtlIHN1cmUgdGhlIHNpemUgb2YgdGhlIGNvcmUgZmlsZSBtYXRjaGVzIHRoZQotICAgICB0aGUgc2l6ZSBjb21wdXRlZCBmcm9tIGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgY29yZSBpdHNlbGYuICAqLwotICB7Ci0gICAgRklMRSAqc3RyZWFtID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgICBpZiAoc3RyZWFtID09IE5VTEwgfHwgZnN0YXQgKGZpbGVubyAoc3RyZWFtKSwgJnN0YXRidWYpIDwgMCkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotICAgIGlmIChOQlBHICogKFVQQUdFUyArIHUudV9kc2l6ZSArIHUudV9zc2l6ZSkgPiBzdGF0YnVmLnN0X3NpemUpCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICBpZiAoY2xpY2tzeiAqIChVUEFHRVMgKyB1LnVfZHNpemUgKyB1LnVfc3NpemUpIDwgc3RhdGJ1Zi5zdF9zaXplKQotICAgICAgewotCS8qIFRoZSBmaWxlIGlzIHRvbyBiaWcuICBNYXliZSBpdCdzIG5vdCBhIGNvcmUgZmlsZQotCSAgIG9yIHdlIG90aGVyd2lzZSBoYXZlIGJhZCB2YWx1ZXMgZm9yIHVfZHNpemUgYW5kIHVfc3NpemUpLiAgKi8KLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIGNvcmVkYXRhID0gKHN0cnVjdCBocHBhYnNkX2NvcmVfc3RydWN0ICopCi0gICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdCkpOwotICBpZiAoIWNvcmVkYXRhKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIE1ha2UgdGhlIGNvcmUgZGF0YSBhbmQgYXZhaWxhYmxlIHZpYSB0aGUgdGRhdGEgcGFydCBvZiB0aGUgQkZELiAgKi8KLSAgYWJmZC0+dGRhdGEuaHBwYWJzZF9jb3JlX2RhdGEgPSBjb3JlZGF0YTsKLQotICAvKiBDcmVhdGUgdGhlIHNlY3Rpb25zLiAgKi8KLSAgY29yZV9zdGFja3NlYyAoYWJmZCkgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5zdGFjayIsCi0JCQkJCSAgIFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJCSAgIGNsaWNrc3ogKiB1LnVfc3NpemUsCi0JCQkJCSAgIE5CUEcgKiAoVVNJWkUgKyBLU1RBS1NJWkUpIAotCQkJCQkgICAgICsgY2xpY2tzeiAqIHUudV9kc2l6ZSwgMik7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT52bWEgPSBVU1JTVEFDSzsgCi0KLSAgY29yZV9kYXRhc2VjIChhYmZkKSA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLmRhdGEiLAotCQkJCQkgIFNFQ19BTExPQyArIFNFQ19MT0FECi0JCQkJCSAgICArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJCSAgY2xpY2tzeiAqIHUudV9kc2l6ZSwKLQkJCQkJICBOQlBHICogKFVTSVpFICsgS1NUQUtTSVpFKSwgMik7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPnZtYSA9IFVEQVRBU0VHOwotCi0gIGNvcmVfcmVnc2VjIChhYmZkKSA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZyIsCi0JCQkJCSBTRUNfSEFTX0NPTlRFTlRTLAotCQkJCQkgS1NUQUtTSVpFICogTkJQRywKLQkJCQkJIE5CUEcgKiBVU0laRSwgMik7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+dm1hID0gMDsKLQotICBzdHJuY3B5IChjb3JlX2NvbW1hbmQgKGFiZmQpLCB1LnVfY29tbSwgTUFYQ09NTEVOICsgMSk7Ci0gIGNvcmVfc2lnbmFsIChhYmZkKSA9IHUudV9jb2RlOwotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGNoYXIgKgotaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfY29tbWFuZCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgaW50Ci1ocHBhYnNkX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgYm9vbGVhbgotaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIC8qIFRoZXJlJ3Mgbm8gd2F5IHRvIGtub3cgdGhpcy4uLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2dldF9zeW10YWJfdXBwZXJfYm91bmQgXAotICBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGhwcGFic2RfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBocHBhYnNkX2NvcmVfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBocHBhYnNkX2NvcmVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQgKCkKLXsKLSAgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwLiAgKi8KLSAgYWJvcnQgKCk7CQotfQotCi0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IGhwcGFic2RfY29yZV92ZWMgPQotICB7Ci0gICAgImhwcGFic2QtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBocHBhYnNkX2NvcmVfY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChocHBhYnNkX2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChocHBhYnNkX2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9ocHV4LWNvcmUuYyBiL2JmZC9ocHV4LWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlNzA5Zi4uMDAwMDAwMAotLS0gYS9iZmQvaHB1eC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBIUC9VWCBjb3JlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdHUgR3Jvc3NtYW4sIEN5Z251cyBTdXBwb3J0LgotICAgQ29udmVydGVkIHRvIGJhY2stZW5kIGZvcm0gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFNVcHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gc3lzdGVtcyB3aGljaCB1c2UgSFAvVVggc3R5bGUKLSAgIGNvcmUgZmlsZXMuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSB8fCBkZWZpbmVkIChIT1NUX0hQMzAwSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBTVBFSVgpCi0KLS8qIEZJWE1FOiBzeXMvY29yZS5oIGRvZXNuJ3QgZXhpc3QgZm9yIEhQVVggdmVyc2lvbiA3LiAgSFBVWCB2ZXJzaW9uCi0gICA1LCA2LCBhbmQgNyBjb3JlIGZpbGVzIHNlZW0gdG8gYmUgc3RhbmRhcmQgdHJhZC1jb3JlLmMgdHlwZSBjb3JlCi0gICBmaWxlczsgY2FuIHdlIGp1c3QgdXNlIHRyYWQtY29yZS5jIGluIGFkZGl0aW9uIHRvIHRoaXMgZmlsZT8gICovCi0KLSNpbmNsdWRlIDxzeXMvY29yZS5oPgotI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0KLSNlbmRpZiAvKiBIT1NUX0hQUEFIUFVYICovCi0KLSNpZmRlZiBIT1NUX0hQUEFCU0QKLQotLyogTm90IGEgdmVyeSBzd2lmdCBwbGFjZSB0byBwdXQgaXQsIGJ1dCB0aGF0J3Mgd2hlcmUgdGhlIEJTRCBwb3J0Ci0gICBwdXRzIHRoZW0uICAqLwotI2luY2x1ZGUgIi9ocHV4L3Vzci9pbmNsdWRlL3N5cy9jb3JlLmgiCi0KLSNlbmRpZiAvKiBIT1NUX0hQUEFCU0QgKi8KLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2lmZGVmIEhBVkVfRElSRU5UX0gKLSMgaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jZWxzZQotIyBpZmRlZiBIQVZFX1NZU19ORElSX0gKLSMgIGluY2x1ZGUgPHN5cy9uZGlyLmg+Ci0jIGVuZGlmCi0jIGlmZGVmIEhBVkVfU1lTX0RJUl9ICi0jICBpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jIGVuZGlmCi0jIGlmZGVmIEhBVkVfTkRJUl9ICi0jICBpbmNsdWRlIDxuZGlyLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgotI2luY2x1ZGUgPHN5cy91c2VyLmg+CQkvKiBBZnRlciBhLm91dC5oICAqLwotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0KLS8qIEtsdWRnZTogVGhlcmUncyBubyBleHBsaWNpdCBtZWNoYW5pc20gcHJvdmlkZWQgYnkgc3lzL2NvcmUuaCB0bwotICAgY29uZGl0aW9uYWxseSBrbm93IHdoZXRoZXIgYSBwcm9jX2luZm8gaGFzIHRocmVhZCBpZCBmaWVsZHMuCi0gICBIb3dldmVyLCBDT1JFX0FOT05fU0hNRU0gc2hvd3MgdXAgZmlyc3QgYXQgMTAuMzAsIHdoaWNoIGlzCi0gICBoYXBwaWx5IGFsc28gd2hlbiBtZWFuaW5nZnVsIHRocmVhZCBpZCdzIHNob3cgdXAgaW4gcHJvY19pbmZvLiAqLwotI2lmIGRlZmluZWQoQ09SRV9BTk9OX1NITUVNKQotI2RlZmluZSBQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCAoMSkKLSNlbmRpZgotCi0vKiBUaGlzIHR5cGUgYXBwZWFycyBhdCBIUC1VWCAxMC4zMC4gIERlZmluaW5nIGl0IGlmIG5vdCBkZWZpbmVkCi0gICBieSBzeXMvY29yZS5oIGFsbG93cyB1cyB0byBidWlsZCBmb3Igb2xkZXIgSFAtVVgncywgYW5kIChzaW5jZQotICAgaXQgd29uJ3QgYmUgZW5jb3VudGVyZWQgaW4gY29yZS1kdW1wcyBmcm9tIG9sZGVyIEhQLVVYJ3MpIGlzCi0gICBoYXJtbGVzcy4gKi8KLSNpZiAhZGVmaW5lZChDT1JFX0FOT05fU0hNRU0pCi0jZGVmaW5lIENPUkVfQU5PTl9TSE1FTSAweDAwMDAwMjAwICAgICAgICAgLyogYW5vbnltb3VzIHNoYXJlZCBtZW1vcnkgKi8KLSNlbmRpZgotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotCi0vKiAubHdwaWQgYW5kIC51c2VyX3RpZCBhcmUgb25seSB2YWxpZCBpZiBQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCwgZWxzZSB0aGV5Ci0gICBhcmUgc2V0IHRvIDAuICBBbHNvLCB1bnRpbCBIUC1VWCBpbXBsZW1lbnRzIE14TiB0aHJlYWRzLCAudXNlcl90aWQgYW5kCi0gICAubHdwaWQgYXJlIHN5bm9ueW1vdXMuICovCi1zdHJ1Y3QgaHB1eF9jb3JlX3N0cnVjdCAKLXsKLSAgaW50IHNpZzsKLSAgaW50IGx3cGlkOyAgICAgICAgICAgICAgIC8qIEtlcm5lbCB0aHJlYWQgSUQuICovCi0gIHVuc2lnbmVkIGxvbmcgdXNlcl90aWQ7ICAvKiBVc2VyIHRocmVhZCBJRC4gKi8KLSAgY2hhciBjbWRbTUFYQ09NTEVOICsgMV07Ci19OwotCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgKChiZmQpLT50ZGF0YS5ocHV4X2NvcmVfZGF0YSkKLSNkZWZpbmUgY29yZV9zaWduYWwoYmZkKSAoY29yZV9oZHIoYmZkKS0+c2lnKQotI2RlZmluZSBjb3JlX2NvbW1hbmQoYmZkKSAoY29yZV9oZHIoYmZkKS0+Y21kKQotI2RlZmluZSBjb3JlX2tlcm5lbF90aHJlYWRfaWQoYmZkKSAoY29yZV9oZHIoYmZkKS0+bHdwaWQpCi0jZGVmaW5lIGNvcmVfdXNlcl90aHJlYWRfaWQoYmZkKSAoY29yZV9oZHIoYmZkKS0+dXNlcl90aWQpCi0KLXN0YXRpYyB2b2lkIHN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgYWxpZ25tZW50X3Bvd2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfcG93ZXI7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLSAgY2hhciAqbmV3bmFtZTsKLQotICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWUpICsgMSk7Ci0gIGlmICghbmV3bmFtZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJjcHkgKG5ld25hbWUsIG5hbWUpOwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5ld25hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+dm1hID0gdm1hOwotICBhc2VjdC0+ZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGFsaWdubWVudF9wb3dlcjsKLQotICByZXR1cm4gYXNlY3Q7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLWhwdXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi0KLS8qIHRoaXMgZnVuY3Rpb24gYnVpbGRzIGEgYmZkIHRhcmdldCBpZiB0aGUgZmlsZSBpcyBhIGNvcmVmaWxlLgotICAgSXQgcmV0dXJucyBudWxsIG9yIDAgaWYgaXQgZmluZHMgb3V0IHRoYWF0IGl0IGlzIG5vdCBhIGNvcmUgZmlsZS4KLSAgIFRoZSB3YXkgaXQgY2hlY2tzIHRoaXMgaXMgYnkgbG9va2luZyBmb3IgYWxsb3dlZCAndHlwZScgZmllbGQgdmFsdWVzLgotICAgVGhlc2UgYXJlIGRlY2xhcmVkIGluIHN5cy9jb3JlLmgKLSAgIFRoZXJlIGFyZSBzb21lIHZhbHVlcyB3aGljaCBhcmUgJ3Jlc2VydmVkIGZvciBmdXR1cmUgdXNlJy4gSW4gcGFydGljdWxhcgotICAgQ09SRV9OT05FIGlzIGFjdHVhbGx5IGRlZmluZWQgYXMgMC4gVGhpcyBtYXkgYmUgYSBjYXRjaC1hbGwgZm9yIGNhc2VzCi0gICBpbiB3aGljaCB0aGUgY29yZSBmaWxlIGlzIGdlbmVyYXRlZCBieSBzb21lIG5vbi1ocHV4IGFwcGxpY2F0aW9uLgotICAgKEkgYW0ganVzdCBndWVzc2luZyBoZXJlISkKLSovCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1ocHV4X2NvcmVfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50ICBnb29kX3NlY3Rpb25zID0gMDsKLSAgaW50ICB1bmtub3duX3NlY3Rpb25zID0gMDsKLQotICBjb3JlX2hkciAoYWJmZCkgPSAoc3RydWN0IGhwdXhfY29yZV9zdHJ1Y3QgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBocHV4X2NvcmVfc3RydWN0KSk7Ci0gIGlmICghY29yZV9oZHIgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCB2YWw7Ci0gICAgICBzdHJ1Y3QgY29yZWhlYWQgY29yZV9oZWFkZXI7Ci0KLSAgICAgIHZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSAmY29yZV9oZWFkZXIsIDEsIHNpemVvZiBjb3JlX2hlYWRlciwgYWJmZCk7Ci0gICAgICBpZiAodmFsIDw9IDApCi0JYnJlYWs7Ci0gICAgICBzd2l0Y2ggKGNvcmVfaGVhZGVyLnR5cGUpCi0JewotCWNhc2UgQ09SRV9LRVJORUw6Ci0JY2FzZSBDT1JFX0ZPUk1BVDoKLQkgIGJmZF9zZWVrIChhYmZkLCBjb3JlX2hlYWRlci5sZW4sIFNFRUtfQ1VSKTsJLyogSnVzdCBza2lwIHRoaXMgKi8KLSAgICAgICAgICBnb29kX3NlY3Rpb25zKys7Ci0JICBicmVhazsKLQljYXNlIENPUkVfRVhFQzoKLQkgIHsKLQkgICAgc3RydWN0IHByb2NfZXhlYyBwcm9jX2V4ZWM7Ci0JICAgIGlmIChiZmRfcmVhZCAoKHZvaWQgKikgJnByb2NfZXhlYywgMSwgY29yZV9oZWFkZXIubGVuLCBhYmZkKQotCQkhPSBjb3JlX2hlYWRlci5sZW4pCi0JICAgICAgYnJlYWs7Ci0JICAgIHN0cm5jcHkgKGNvcmVfY29tbWFuZCAoYWJmZCksIHByb2NfZXhlYy5jbWQsIE1BWENPTUxFTiArIDEpOwotICAgICAgICAgICAgZ29vZF9zZWN0aW9ucysrOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDT1JFX1BST0M6Ci0JICB7Ci0JICAgIHN0cnVjdCBwcm9jX2luZm8gcHJvY19pbmZvOwotCSAgICBjaGFyICBzZWNuYW1lWzEwMF07ICAvKiBPZiBhcmJpdHJhcnkgc2l6ZSwgYnV0IHBsZW50eSBsYXJnZS4gKi8KLQotICAgICAgICAgICAgLyogV2UgbmVlZCB0byByZWFkIHRoaXMgc2VjdGlvbiwgJ2NhdXNlIHdlIG5lZWQgdG8gZGV0ZXJtaW5lCi0gICAgICAgICAgICAgICB3aGV0aGVyIHRoZSBjb3JlLWR1bXBlZCBhcHAgd2FzIHRocmVhZGVkIGJlZm9yZSB3ZSBjcmVhdGUKLSAgICAgICAgICAgICAgIGFueSAucmVnIHNlY3Rpb25zLiAqLwotCSAgICBpZiAoYmZkX3JlYWQgKCZwcm9jX2luZm8sIDEsIGNvcmVfaGVhZGVyLmxlbiwgYWJmZCkKLQkJIT0gY29yZV9oZWFkZXIubGVuKQotCSAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIC8qIEhvd2V2ZXIsIHdlIGFsc28gd2FudCB0byBjcmVhdGUgdGhvc2Ugc2VjdGlvbnMgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgZmlsZSBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVjb3JkLCBpdCBzZWVtcy4gKi8KLSAgICAgICAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgLWNvcmVfaGVhZGVyLmxlbiwgU0VFS19DVVIpICE9IDApCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0jaWYgZGVmaW5lZChQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCkKLSAgICAgICAgICAgIGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkgPSBwcm9jX2luZm8ubHdwaWQ7Ci0gICAgICAgICAgICBjb3JlX3VzZXJfdGhyZWFkX2lkIChhYmZkKSA9IHByb2NfaW5mby51c2VyX3RpZDsKLSNlbHNlCi0gICAgICAgICAgICBjb3JlX2tlcm5lbF90aHJlYWRfaWQgKGFiZmQpID0gMDsKLSAgICAgICAgICAgIGNvcmVfdXNlcl90aHJlYWRfaWQgKGFiZmQpID0gMDsKLSNlbmRpZgotICAgICAgICAgICAgLyogSWYgdGhlIHByb2dyYW0gd2FzIHVudGhyZWFkZWQsIHRoZW4gd2UnbGwganVzdCBjcmVhdGUgYQotICAgICAgICAgICAgICAgLnJlZyBzZWN0aW9uLgotCi0gICAgICAgICAgICAgICBJZiB0aGUgcHJvZ3JhbSB3YXMgdGhyZWFkZWQsIHRoZW4gd2UnbGwgY3JlYXRlIC5yZWcvWFhYWFgKLSAgICAgICAgICAgICAgIHNlY3Rpb24gZm9yIGVhY2ggdGhyZWFkLCB3aGVyZSBYWFhYWCBpcyBhIHByaW50YWJsZQotICAgICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gb2YgdGhlIGtlcm5lbCB0aHJlYWQgaWQuICBXZSdsbCBhbHNvCi0gICAgICAgICAgICAgICBjcmVhdGUgYSAucmVnIHNlY3Rpb24gZm9yIHRoZSB0aHJlYWQgdGhhdCB3YXMgcnVubmluZwotICAgICAgICAgICAgICAgYW5kIHNpZ25hbGxlZCBhdCB0aGUgdGltZSBvZiB0aGUgY29yZS1kdW1wIChpLmUuLCB0aGlzCi0gICAgICAgICAgICAgICBpcyBlZmZlY3RpdmVseSBhbiBhbGlhcywgbmVlZGVkIHRvIGtlZXAgR0RCIGhhcHB5LikKLQotICAgICAgICAgICAgICAgTm90ZSB0aGF0IHdlIHVzZSBgLnJlZy9YWFhYWCcgYXMgb3Bwb3NlZCB0byAnLnJlZ1hYWFhYJwotICAgICAgICAgICAgICAgYmVjYXVzZSBHREIgZXhwZWN0cyB0aGF0IC5yZWcyIHdpbGwgYmUgdGhlIGZsb2F0aW5nLQotICAgICAgICAgICAgICAgcG9pbnQgcmVnaXN0ZXJzLiAqLwotICAgICAgICAgICAgaWYgKGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkgPT0gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIucmVnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNfSEFTX0NPTlRFTlRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVfaGVhZGVyLmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAmcHJvY19pbmZvIC0gKGludCkgJiBwcm9jX2luZm8uaHdfcmVncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSkKLSAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUaGVyZSBhcmUgdGhyZWFkcy4gIElzIHRoaXMgdGhlIG9uZSB0aGF0IGNhdXNlZCB0aGUKLSAgICAgICAgICAgICAgICAgICBjb3JlLWR1bXA/ICBXZSdsbCBjbGFpbSBpdCB3YXMgdGhlIHJ1bm5pbmcgdGhyZWFkLiAqLwotICAgICAgICAgICAgICAgIGlmIChwcm9jX2luZm8uc2lnICE9IC0xKQotICAgICAgICAgICAgICAgICAgewotCQkgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAotCQkJCQkgICAgU0VDX0hBU19DT05URU5UUywKLQkJCQkJICAgIGNvcmVfaGVhZGVyLmxlbiwKLQkJCQkJICAgIChpbnQpICZwcm9jX2luZm8gLSAoaW50KSAmIHByb2NfaW5mby5od19yZWdzLAotCQkJCQkgICAgMikpCi0JCSAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFdlIGFsd2F5cyBtYWtlIG9uZSBvZiB0aGVzZSBzZWN0aW9ucywgZm9yIGV2ZXJ5IHRocmVhZC4gKi8KLSAgICAgICAgICAgICAgICBzcHJpbnRmIChzZWNuYW1lLCAiLnJlZy8lZCIsIGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkpOwotICAgICAgICAgICAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX0hBU19DT05URU5UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX2hlYWRlci5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgJnByb2NfaW5mbyAtIChpbnQpICYgcHJvY19pbmZvLmh3X3JlZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikpCi0gICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgfQotCSAgICBjb3JlX3NpZ25hbCAoYWJmZCkgPSBwcm9jX2luZm8uc2lnOwotICAgICAgICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBjb3JlX2hlYWRlci5sZW4sIFNFRUtfQ1VSKSAhPSAwKQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGdvb2Rfc2VjdGlvbnMrKzsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBDT1JFX0RBVEE6Ci0JY2FzZSBDT1JFX1NUQUNLOgotCWNhc2UgQ09SRV9URVhUOgotCWNhc2UgQ09SRV9NTUY6Ci0JY2FzZSBDT1JFX1NITToKLQljYXNlIENPUkVfQU5PTl9TSE1FTToKLQkgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCi0JCQkJICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJICBjb3JlX2hlYWRlci5sZW4sIGNvcmVfaGVhZGVyLmFkZHIsIDIpKQotCSAgICByZXR1cm4gTlVMTDsKLQotCSAgYmZkX3NlZWsgKGFiZmQsIGNvcmVfaGVhZGVyLmxlbiwgU0VFS19DVVIpOwotICAgICAgICAgIGdvb2Rfc2VjdGlvbnMrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSBDT1JFX05PTkU6Ci0gICAgICAgICAgLyogTGV0J3Mgbm90IHB1bnQgaWYgd2UgZW5jb3VudGVyIGEgc2VjdGlvbiBvZiB1bmtub3duCi0gICAgICAgICAgICAgdHlwZS4gIFJhdGhlciwgbGV0J3MgbWFrZSBhIG5vdGUgb2YgaXQuICBJZiB3ZSBsYXRlcgotICAgICAgICAgICAgIHNlZSB0aGF0IHRoZXJlIHdlcmUgYWxzbyAiZ29vZCIgc2VjdGlvbnMsIHRoZW4gd2UnbGwKLSAgICAgICAgICAgICBkZWNsYXJlIHRoYXQgdGhpcyBhIGNvcmUgZmlsZSwgYnV0IHdlJ2xsIGFsc28gd2FybiB0aGF0Ci0gICAgICAgICAgICAgaXQgbWF5IGJlIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgZ2RiLgotICAgICAgICAgICAgICovCi0JICB1bmtub3duX3NlY3Rpb25zKys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgCi0gICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsgLyp1bnJlY29nbml6ZWQgY29yZSBmaWxlIHR5cGUgKi8KLQl9Ci0gICAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIC8qIFdlcmUgdGhlcmUgc2VjdGlvbnMgb2YgdW5rbm93biB0eXBlPyAgSWYgc28sIHlldCB0aGVyZSB3ZXJlCi0gICAgIGF0IGxlYXN0IHNvbWUgY29tcGxldGUgc2VjdGlvbnMgb2Yga25vd24gdHlwZSwgdGhlbiwgaXNzdWUKLSAgICAgYSB3YXJuaW5nLiAgUG9zc2libHkgdGhlIGNvcmUgZmlsZSB3YXMgZ2VuZXJhdGVkIG9uIGEgdmVyc2lvbgotICAgICBvZiBIUC1VWCB0aGF0IGlzIGluY29tcGF0aWJsZSB3aXRoIHRoYXQgZm9yIHdoaWNoIHRoaXMgZ2RiIHdhcwotICAgICBidWlsdC4KLSAgICAgKi8KLSAgaWYgKCh1bmtub3duX3NlY3Rpb25zID4gMCkgJiYgKGdvb2Rfc2VjdGlvbnMgPiAwKSkKLSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICgiJXMgYXBwZWFycyB0byBiZSBhIGNvcmUgZmlsZSxcbmJ1dCBjb250YWlucyB1bmtub3duIHNlY3Rpb25zLiAgSXQgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIG9uIGFuIGluY29tcGF0aWJsZVxudmVyc2lvbiBvZiBIUC1VWC4gIEFzIGEgcmVzdWx0LCBzb21lIGluZm9ybWF0aW9uIG1heSBiZSB1bmF2YWlsYWJsZS5cbiIsCi0gICAgICAgYWJmZC0+ZmlsZW5hbWUpOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgY2hhciAqCi1ocHV4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBpbnQKLWhwdXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfc2lnbmFsIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBib29sZWFuCi1ocHV4X2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgcmV0dXJuIHRydWU7CQkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotDAotI2RlZmluZSBocHV4X2NvcmVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGhwdXhfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKLSNkZWZpbmUgaHB1eF9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgaHB1eF9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgaHB1eF9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgaHB1eF9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBocHV4X2NvcmVfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgaHB1eF9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgaHB1eF9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBocHV4X2NvcmVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgaHB1eF9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAiaHB1eC1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIGhwdXhfY29yZV9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGhwdXhfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGhwdXhfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC9pMzg2YW91dC5jIGIvYmZkL2kzODZhb3V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYjJjZmYuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZhb3V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhlIG9ubHkgMzg2IGFvdXQgc3lzdGVtIHdlIGhhdmUgaGVyZSBpcyBHTzMyIGZyb20gREouIAotICAgVGhlc2UgbnVtYmVycyBtYWtlIEJGRCB3b3JrIHdpdGggdGhhdC4gSWYgeW91ciBhb3V0IDM4NiBzeXN0ZW0KLSAgIGRvZXNuJ3Qgd29yayB3aXRoIHRoZXNlLCB3ZSdsbCBoYXZlIHRvIHNwbGl0IHRoZW0gaW50byBkaWZmZXJlbnQKLSAgIGZpbGVzLiAgU2VuZCBtZSAoc2FjQGN5Z251cy5jb20pIHRoZSBydW5lcyB0byBtYWtlIGl0IHdvcmsgb24geW91cgotICAgc3lzdGVtLCBhbmQgSSdsbCBzdGljayBpdCBpbiBmb3IgdGhlIG5leHQgcmVsZWFzZS4gICovCi0KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAwCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotCi0jZGVmaW5lIE5fVFhUT0ZGKHgpIDB4MjAKLSNkZWZpbmUgTl9UWFRBRERSKHgpIChOX01BR0lDKHgpPT1aTUFHSUMgPyAweDEwMjAgOiAwKQotCi0jZGVmaW5lIE5fVFhUU0laRSh4KSAoKHgpLmFfdGV4dCkKLSNpZiAwCi0jZGVmaW5lIE5fREFUQUREUih4KSAoTl9NQUdJQyh4KT09T01BR0lDPyAoTl9UWFRBRERSKHgpKyh4KS5hX3RleHQpIDogKFNFR01FTlRfU0laRSArICgoMHgxMDIwKyh4KS5hX3RleHQtMSkgJiB+KFNFR01FTlRfU0laRS0xKSkpKQotI2RlZmluZSBOT1NVQkVYRUNCCi0KLSNlbmRpZgotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4NDAwMDAwCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9pMzg2Ci0KLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2YW91dF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWkzODYiCi0jZGVmaW5lIE5PX1dSSVRFX0hFQURFUl9LTFVER0UgMQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLS8qIFNldCB0aGUgbWFjaGluZSB0eXBlIGNvcnJlY3RseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pMzg2YW91dF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMzg2KTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICBXUklURV9IRUFERVJTIChhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIGkzODZhb3V0X3dyaXRlX29iamVjdF9jb250ZW50cwotCi1zdGF0aWMgYm9vbGVhbiBNWShzZXRfc2l6ZXMpKCk7Ci0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmTVkoYmFja2VuZF9kYXRhKQotc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBNWShiYWNrZW5kX2RhdGEpID0gewotICAwLAkJCQkvKiB6bWFnaWMgY29udGlndW91cyAqLwotICAxLAkJCQkvKiB0ZXh0IGluY2wgaGVhZGVyICovCi0gIDAsCQkJCS8qIGVudHJ5IGlzIHRleHQgYWRkcmVzcyAqLwotICAwLAkJCQkvKiBleGVjX2hkcl9mbGFncyAqLwotICAwLAkJCQkvKiB0ZXh0IHZtYT8gKi8KLSAgTVkoc2V0X3NpemVzKSwKLSAgMSwJCQkJLyogZXhlYyBoZWFkZXIgbm90IGNvdW50ZWQgKi8KLSAgMCwJCQkJLyogYWRkX2R5bmFtaWNfc3ltYm9scyAqLwotICAwLAkJCQkvKiBhZGRfb25lX3N5bWJvbCAqLwotICAwLAkJCQkvKiBsaW5rX2R5bmFtaWNfb2JqZWN0ICovCi0gIDAsCQkJCS8qIHdyaXRlX2R5bmFtaWNfc3ltYm9sICovCi0gIDAsCQkJCS8qIGNoZWNrX2R5bmFtaWNfcmVsb2MgKi8KLSAgMAkJCQkvKiBmaW5pc2hfZHluYW1pY19saW5rICovCi19OwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2YnNkLmMgYi9iZmQvaTM4NmJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzI4ZmUzLi4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2YnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMgdW5kZXIgQlNELgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZGF0YSBzaG91bGQgYmUgY29ycmVjdCBmb3IgdGhlIGZvcm1hdCB1c2VkIHVuZGVyIGFsbCB0aGUgdmFyaW91cwotICAgQlNEIHBvcnRzIGZvciAzODYgbWFjaGluZXMuICAqLwotCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJNAotCi0vKiBaTUFHSUMgZmlsZXMgbmV2ZXIgaGF2ZSB0aGUgaGVhZGVyIGluIHRoZSB0ZXh0LiAgKi8KLSNkZWZpbmUJTl9IRUFERVJfSU5fVEVYVCh4KQkwCi0KLS8qIFpNQUdJQyBmaWxlcyBzdGFydCBhdCBhZGRyZXNzIDAuICBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIFFNQUdJQy4gICovCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQk0MDk2Ci0jZGVmaW5lCVNFR01FTlRfU0laRQlUQVJHRVRfUEFHRV9TSVpFCi0KLSNkZWZpbmUJREVGQVVMVF9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fMzg2IHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaTM4NmJzZF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWkzODYtYnNkIgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2ZHluaXguYyBiL2JmZC9pMzg2ZHluaXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1MGExNC4uMDAwMDAwMAotLS0gYS9iZmQvaTM4NmR5bml4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMgdW5kZXIgZHluaXguCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBCRkQgaXMgY3VycmVudGx5IG9ubHkgdGVzdGVkIHdpdGggZ2RiLCB3cml0aW5nIG9iamVjdCBmaWxlcwotICAgbWF5IG5vdCB3b3JrLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JECTQKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgNDA5NgotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLQotI2luY2x1ZGUgImFvdXQvZHluaXgzLmgiCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fMzg2IHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaTM4NmR5bml4XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1keW5peCIKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMoaTM4NmR5bml4LF8zMl8seSkKLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0jZGVmaW5lIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbiBOQU1FKGkzODZkeW5peF8zMl8sc3dhcF9leGVjX2hlYWRlcl9pbikKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cwotCi0vKiBhb3V0eC5oIHJlcXVpcmVzIGRlZmluaXRpb25zIGZvciBOTUFHSUMsIEJNQUdJQyBhbmQgUU1BR0lDLiAgKi8KLSNkZWZpbmUgTk1BR0lDIDAKLSNkZWZpbmUgQk1BR0lDIE9NQUdJQwotI2RlZmluZSBRTUFHSUMgWE1BR0lDCi0KLSNpbmNsdWRlICJhb3V0eC5oIgotCi0vKiAoQWIpdXNlIHNvbWUgZmllbGRzIGluIHRoZSBpbnRlcm5hbCBleGVjIGhlYWRlciB0byBiZSBhYmxlIHRvIHJlYWQKLSAgIGV4ZWN1dGFibGVzIHRoYXQgY29udGFpbiBzaGFyZWQgZGF0YS4gICovCi0KLSNkZWZpbmUgYV9zaGRhdGEgYV90bG9hZAotI2RlZmluZSBhX3NoZHJzaXplIGFfZGxvYWQKLQotdm9pZAotaTM4NmR5bml4XzMyX3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogVGhlIGludGVybmFsX2V4ZWMgc3RydWN0dXJlIGhhcyBzb21lIGZpZWxkcyB0aGF0IGFyZSB1bnVzZWQgaW4gdGhpcwotICAgICBjb25maWd1cmF0aW9uIChJRSBmb3IgaTk2MCksIHNvIGVuc3VyZSB0aGF0IGFsbCBzdWNoIHVuaW5pdGlhbGl6ZWQKLSAgICAgZmllbGRzIGFyZSB6ZXJvJ2Qgb3V0LiAgVGhlcmUgYXJlIHBsYWNlcyB3aGVyZSB0d28gb2YgdGhlc2Ugc3RydWN0cwotICAgICBhcmUgbWVtY21wJ2QsIGFuZCB0aHVzIHRoZSBjb250ZW50cyBkbyBtYXR0ZXIuICovCi0gIG1lbXNldCAoKFBUUikgZXhlY3AsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpKTsKLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9pbmZvKTsKLSAgZXhlY3AtPmFfdGV4dCAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOwotICBleGVjcC0+YV9kYXRhICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGF0YSk7Ci0gIGV4ZWNwLT5hX2JzcyAgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9ic3MpOwotICBleGVjcC0+YV9zeW1zICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc3ltcyk7Ci0gIGV4ZWNwLT5hX2VudHJ5ICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90cnNpemUpOwotICBleGVjcC0+YV9kcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZHJzaXplKTsKLSAgZXhlY3AtPmFfc2hkYXRhID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3NoZGF0YSk7Ci0gIGV4ZWNwLT5hX3NoZHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3NoZHJzaXplKTsKLX0KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4NmZyZWVic2QuYyBiL2JmZC9pMzg2ZnJlZWJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTYzNzFiLi4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2ZnJlZWJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBGcmVlQlNELzM4NiBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJNAotI3VuZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLQotI2RlZmluZQlERUZBVUxUX0FSQ0gJYmZkX2FyY2hfaTM4NgotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV8zODZfTkVUQlNEIHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaTM4NmZyZWVic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1mcmVlYnNkIgotCi0jaW5jbHVkZSAiZnJlZWJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZsaW51eC5jIGIvYmZkL2kzODZsaW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDRiZGNkLi4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2bGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDc2NyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGxpbnV4IGZsYXZvcmVkIGkzODYgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQk0MDk2Ci0jZGVmaW5lIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgMTAyNAotI2RlZmluZQlTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJMHgwCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNXzM4NiB8fCAobXR5cGUpID09IE1fVU5LTk9XTikKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2kzODYKLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2bGludXhfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LWxpbnV4IgotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBNWSh2ZWMpOwotCi0vKiBXZSBhbHdheXMgZ2VuZXJhdGUgUU1BR0lDIGZpbGVzIGluIHByZWZlcmVuY2UgdG8gWk1BR0lDIGZpbGVzLiAgSXQKLSAgIHdvdWxkIGJlIHBvc3NpYmxlIHRvIG1ha2UgdGhpcyBhIGxpbmtlciBvcHRpb24sIGlmIHRoYXQgZXZlcgotICAgYmVjb21lcyBpbXBvcnRhbnQuICAqLwotCi1zdGF0aWMgdm9pZCBNWV9maW5hbF9saW5rX2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpMzg2bGludXhfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGkzODZsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWkzODZsaW51eF9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgb2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9IHFfbWFnaWNfZm9ybWF0OwotICByZXR1cm4gTkFNRShhb3V0LGZpbmFsX2xpbmspIChhYmZkLCBpbmZvLCBNWV9maW5hbF9saW5rX2NhbGxiYWNrKTsKLX0KLQotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBpMzg2bGludXhfYmZkX2ZpbmFsX2xpbmsKLQotLyogU2V0IHRoZSBtYWNoaW5lIHR5cGUgY29ycmVjdGx5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWkzODZsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMzg2KTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgaTM4NmxpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cwotDAotLyogQ29kZSB0byBsaW5rIGFnYWluc3QgTGludXggYS5vdXQgc2hhcmVkIGxpYnJhcmllcy4gICovCi0KLS8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotI2lmbmRlZiBHT1RfUkVGX1BSRUZJWAotI2RlZmluZQlHT1RfUkVGX1BSRUZJWAkiX19HT1RfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfR09UX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBHT1RfUkVGX1BSRUZJWCwgc2l6ZW9mIEdPVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogU2VlIGlmIGEgc3ltYm9sIG5hbWUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotI2lmbmRlZiBQTFRfUkVGX1BSRUZJWAotI2RlZmluZQlQTFRfUkVGX1BSRUZJWAkiX19QTFRfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfUExUX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBQTFRfUkVGX1BSRUZJWCwgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogVGhpcyBzdHJpbmcgaXMgdXNlZCB0byBnZW5lcmF0ZSBzcGVjaWFsaXplZCBlcnJvciBtZXNzYWdlcy4gICovCi0KLSNpZm5kZWYgTkVFRFNfU0hSTElCCi0jZGVmaW5lIE5FRURTX1NIUkxJQiAiX19ORUVEU19TSFJMSUJfIgotI2VuZGlmCi0KLS8qIFRoaXMgc3BlY2lhbCBzeW1ib2wgaXMgYSBzZXQgdmVjdG9yIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mCi0gICBwb2ludGVycyB0byBmaXh1cCB0YWJsZXMuICBJdCB3aWxsIGJlIHByZXNlbnQgaW4gYW55IGR5bmFtaWNseQotICAgbGlua2VkIGZpbGUuICBUaGUgbGlua2VyIGdlbmVyYXRlZCBmaXh1cCB0YWJsZSBzaG91bGQgYWxzbyBiZSBhZGRlZAotICAgdG8gdGhlIGxpc3QsIGFuZCBpdCBzaG91bGQgYWx3YXlzIGFwcGVhciBpbiB0aGUgc2Vjb25kIHNsb3QgKHRoZQotICAgZmlyc3Qgb25lIGlzIGEgZHVtbXkgd2l0aCBhIG1hZ2ljIG51bWJlciB0aGF0IGlzIGRlZmluZWQgaW4KLSAgIGNydDAubykuICAqLwotCi0jaWZuZGVmIFNIQVJBQkxFX0NPTkZMSUNUUwotI2RlZmluZSBTSEFSQUJMRV9DT05GTElDVFMgIl9fU0hBUkFCTEVfQ09ORkxJQ1RTX18iCi0jZW5kaWYKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgZml4dXBzLiAgVGhlIHRlcm1pbm9sb2d5IGlzIGEgYml0IHN0cmFuZ2UsIGJ1dAotICAgZWFjaCBmaXh1cCBjb250YWlucyB0d28gMzIgYml0IG51bWJlcnMuICBBIHJlZ3VsYXIgZml4dXAgY29udGFpbnMKLSAgIGFuIGFkZHJlc3MgYW5kIGEgcG9pbnRlciwgYW5kIGF0IHJ1bnRpbWUgd2Ugc2hvdWxkIHN0b3JlIHRoZQotICAgYWRkcmVzcyBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgcG9pbnRlci4gIEEgYnVpbHRpbiBmaXh1cAotICAgY29udGFpbnMgdHdvIHBvaW50ZXJzLCBhbmQgd2Ugc2hvdWxkIHJlYWQgdGhlIGFkZHJlc3MgdXNpbmcgb25lCi0gICBwb2ludGVyIGFuZCBzdG9yZSBpdCBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgb3RoZXIKLSAgIHBvaW50ZXIuICBCdWlsdGluIGZpeHVwcyBjb21lIGludG8gcGxheSB3aGVuIHdlIGhhdmUgZHVwbGljYXRlCi0gICBfX0dPVF9fIHN5bWJvbHMgZm9yIHRoZSBzYW1lIHZhcmlhYmxlLiAgVGhlIGJ1aWx0aW4gZml4dXAgd2lsbCBjb3B5Ci0gICB0aGUgR09UIHBvaW50ZXIgZnJvbSBvbmUgb3ZlciBpbnRvIHRoZSBvdGhlci4gICovCi0KLXN0cnVjdCBmaXh1cAotewotICBzdHJ1Y3QgZml4dXAgKm5leHQ7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEganVtcCBpbnN0cnVjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLAotICAgICB6ZXJvIGlmIHRoaXMgaXMganVzdCBhIHBvaW50ZXIgKi8KLSAgY2hhciBqdW1wOwotCi0gIGNoYXIgYnVpbHRpbjsKLX07Ci0KLS8qIFdlIGRvbid0IG5lZWQgYSBzcGVjaWFsIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLCBidXQgd2UgZG8gbmVlZAotICAgdG8ga2VlcCBzb21lIGluZm9ybWF0aW9uIGJldHdlZW4gbGlua2VyIHBhc3Nlcywgc28gd2UgdXNlIGEgc3BlY2lhbAotICAgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci19OwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIEZpcnN0IGR5bmFtaWMgb2JqZWN0IGZvdW5kIGluIGxpbmsuICAqLwotICBiZmQgKmR5bm9iajsKLQotICAvKiBOdW1iZXIgb2YgZml4dXBzLiAgKi8KLSAgc2l6ZV90IGZpeHVwX2NvdW50OwotCi0gIC8qIE51bWJlciBvZiBidWlsdGluIGZpeHVwcy4gICovCi0gIHNpemVfdCBsb2NhbF9idWlsdGluczsKLQotICAvKiBMaXN0IG9mIGZpeHVwcy4gICovCi0gIHN0cnVjdCBmaXh1cCAqZml4dXBfbGlzdDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgZml4dXAgKm5ld19maXh1cAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgYXNlY3Rpb24gKiwKLQkgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sCi0JICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X3RhbGx5X3N5bWJvbHMKLSAgUEFSQU1TICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1saW51eF9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKQotCSBOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkczsgdGhlcmUgYXJlbid0IGFueS4gICovCi0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkJIGxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBmcmVlIChyZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmR5bm9iaiA9IE5VTEw7Ci0gIHJldC0+Zml4dXBfY291bnQgPSAwOwotICByZXQtPmxvY2FsX2J1aWx0aW5zID0gMDsKLSAgcmV0LT5maXh1cF9saXN0ID0gTlVMTDsKLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBsaW51eF9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKSBcCi0gICBhb3V0X2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSxcCi0JCQkgIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgTGludXggbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIGxpbnV4X2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBTdG9yZSB0aGUgaW5mb3JtYXRpb24gZm9yIGEgbmV3IGZpeHVwLiAgKi8KLQotc3RhdGljIHN0cnVjdCBmaXh1cCAqCi1uZXdfZml4dXAgKGluZm8sIGgsIHZhbHVlLCBidWlsdGluKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgaW50IGJ1aWx0aW47Ci17Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLQotICBmID0gKHN0cnVjdCBmaXh1cCAqKSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkgIHNpemVvZiAoc3RydWN0IGZpeHVwKSk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgcmV0dXJuIGY7Ci0gIGYtPm5leHQgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLSAgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3QgPSBmOwotICBmLT5oID0gaDsKLSAgZi0+dmFsdWUgPSB2YWx1ZTsKLSAgZi0+YnVpbHRpbiA9IGJ1aWx0aW47Ci0gIGYtPmp1bXAgPSAwOwotICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLSAgcmV0dXJuIGY7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIHJlYWxpemUgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gbGluayB0byBhIHNoYXJlZAotICAgbGlicmFyeS4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBzZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlCi0gICBmaXh1cCB0YWJsZSwgYW5kIHdlIHVsdGltYXRlbHkgbmVlZCB0byBhZGQgYSBwb2ludGVyIHRvIHRoaXMgaW50bwotICAgdGhlIHNldCB2ZWN0b3IgZm9yIFNIQVJBQkxFX0NPTkZMSUNUUy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90Ci0gICBrbm93IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLCBidXQgdGhhdCdzIE9LIC0gd2UganVzdCBuZWVkIHRvCi0gICBjcmVhdGUgaXQgZm9yIG5vdy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIHNldCB0aGUgU0VDX0lOX01FTU9SWSBmbGFnLiAgKi8KLSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCi0gIC8qIFdlIGNob29zZSB0byB1c2UgdGhlIG5hbWUgIi5saW51eC1keW5hbWljIiBmb3IgdGhlIGZpeHVwIHRhYmxlLgotICAgICBXaHkgbm90PyAqLwotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5saW51eC1keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzLT5fcmF3X3NpemUgPSAwOwotICBzLT5jb250ZW50cyA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhpcyBpcwotICAgYSB3cmFwcGVyIGFyb3VuZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aGljaCBoYW5kbGVzIHRoZQotICAgdHdlYWtpbmcgbmVlZGVkIGZvciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsCi0JCSAgICAgIGNvcHksIGNvbGxlY3QsIGhhc2hwKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHA7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJvb2xlYW4gaW5zZXJ0OwotCi0gIC8qIExvb2sgdXAgYW5kIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuCi0gICAgIElmIHdlIGRvLCBhbmQgdGhlIGRlZmluaW5nIGVudHJ5IGlzIGZyb20gYSBzaGFyZWQgbGlicmFyeSwgd2UKLSAgICAgbmVlZCB0byBjcmVhdGUgdGhlIGR5bmFtaWMgc2VjdGlvbnMuCi0KLSAgICAgRklYTUU6IFdoYXQgaWYgYWJmZC0+eHZlYyAhPSBpbmZvLT5oYXNoLT5jcmVhdG9yPyAgV2UgbWF5IHdhbnQgdG8KLSAgICAgYmUgYWJsZSB0byBsaW5rIExpbnV4IGEub3V0IGFuZCBFTEYgb2JqZWN0cyB0b2dldGhlciwgYnV0IHNlcmlvdXMKLSAgICAgY29uZnVzaW9uIGlzIHBvc3NpYmxlLiAgKi8KLQotICBpbnNlcnQgPSBmYWxzZTsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTAotICAgICAgJiYgc3RyY21wIChuYW1lLCBTSEFSQUJMRV9DT05GTElDVFMpID09IDAKLSAgICAgICYmIChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMAotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotICAgIHsKLSAgICAgIGlmICghIGxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotICAgICAgaW5zZXJ0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIGZhbHNlLAotCQkJCSAgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXsKLQkgIHN0cnVjdCBmaXh1cCAqZjsKLQotCSAgaWYgKGhhc2hwICE9IE5VTEwpCi0JICAgICpoYXNocCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0JICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoLCB2YWx1ZSwgISBJU19QTFRfU1lNIChuYW1lKSk7Ci0JICBpZiAoZiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmLT5qdW1wID0gSVNfUExUX1NZTSAobmFtZSk7Ci0KLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogRG8gdGhlIHVzdWFsIHByb2NlZHVyZSBmb3IgYWRkaW5nIGEgc3ltYm9sLiAgKi8KLSAgaWYgKCEgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLAotCQkJCQkgIHZhbHVlLCBzdHJpbmcsIGNvcHksIGNvbGxlY3QsCi0JCQkJCSAgaGFzaHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJbnNlcnQgYSBwb2ludGVyIHRvIG91ciB0YWJsZSBpbiB0aGUgc2V0IHZlY3Rvci4gIFRoZSBkeW5hbWljCi0gICAgIGxpbmtlciByZXF1aXJlcyB0aGlzIGluZm9ybWF0aW9uICovCi0gIGlmIChpbnNlcnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIC8qIEhlcmUgd2UgZG8gb3VyIHNwZWNpYWwgdGhpbmcgdG8gYWRkIHRoZSBwb2ludGVyIHRvIHRoZQotCSBkeW5hbWljIHNlY3Rpb24gaW4gdGhlIFNIQVJBQkxFX0NPTkZMSUNUUyBzZXQgdmVjdG9yLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosIFNIQVJBQkxFX0NPTkZMSUNUUywKLQkgICAgICBCU0ZfR0xPQkFMIHwgQlNGX0NPTlNUUlVDVE9SLCBzLCAwLCBOVUxMLCBmYWxzZSwgZmFsc2UsIE5VTEwpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSB3aWxsIGNyYXdsIHRoZSBoYXNoIHRhYmxlIGFuZCBjb21lIGhlcmUgZm9yIGV2ZXJ5IGdsb2JhbCBzeW1ib2wuCi0gICBXZSB3aWxsIGV4YW1pbmUgZWFjaCBlbnRyeSBhbmQgc2VlIGlmIHRoZXJlIGFyZSBpbmRpY2F0aW9ucyB0aGF0IHdlCi0gICBuZWVkIHRvIGFkZCBhIGZpeHVwLiAgVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBjYXNlcyAtIG9uZSBpcyB3aGVyZQotICAgeW91IGhhdmUgZHVwbGljYXRlIGRlZmluaXRpb25zIG9mIFBMVCBvciBHT1Qgc3ltYm9scyAtIHRoZXNlIHdpbGwKLSAgIGhhdmUgYWxyZWFkeSBiZWVuIGNhdWdodCBhbmQgYWRkZWQgYXMgImJ1aWx0aW4iIGZpeHVwcy4gIElmIHdlIGZpbmQKLSAgIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgbm9uIFBMVC9HT1Qgc3ltYm9sIGlzIGFsc28gcHJlc2VudCwgd2UKLSAgIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyIGZpeHVwIGluc3RlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfdGFsbHlfc3ltYm9scyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopIGRhdGE7Ci0gIHN0cnVjdCBmaXh1cCAqZiwgKmYxOwotICBpbnQgaXNfcGx0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoMSwgKmgyOwotICBib29sZWFuIGV4aXN0czsKLQotICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIHN0cm5jbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgTkVFRFNfU0hSTElCLAotCQkgIHNpemVvZiBORUVEU19TSFJMSUIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyICpwOwotICAgICAgY2hhciAqYWxsb2MgPSBOVUxMOwotCi0gICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nICsgc2l6ZW9mIE5FRURTX1NIUkxJQiAtIDE7Ci0gICAgICBwID0gc3RycmNociAobmFtZSwgJ18nKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JYWxsb2MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0KLSAgICAgIGlmIChwID09IE5VTEwgfHwgYWxsb2MgPT0gTlVMTCkKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcydcbiIpLAotCQkJICAgICAgIG5hbWUpOwotICAgICAgZWxzZQotCXsKLQkgIHN0cmNweSAoYWxsb2MsIG5hbWUpOwotCSAgcCA9IHN0cnJjaHIgKGFsbG9jLCAnXycpOwotCSAgKnArKyA9ICdcMCc7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcy5zby4lcydcbiIpLAotCSAgICAgYWxsb2MsIHApOwotCSAgZnJlZSAoYWxsb2MpOwotCX0KLQotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBhIFBMVC9HT1QsIHdlIGRvIG5vdCBldmVuIG5lZWQgdG8gbG9vayBhdCBpdCAqLwotICBpc19wbHQgPSBJU19QTFRfU1lNIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotCi0gIGlmIChpc19wbHQgfHwgSVNfR09UX1NZTSAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKSkKLSAgICB7Ci0gICAgICAvKiBMb29rIHVwIHRoaXMgc3ltYm9sIHR3aWNlLiAgT25jZSBqdXN0IGFzIGEgcmVndWxhciBsb29rdXAsCi0JIGFuZCB0aGVuIGFnYWluIGZvbGxvd2luZyBhbGwgb2YgdGhlIGluZGlyZWN0IGxpbmtzIHVudGlsIHdlCi0JIHJlYWNoIGEgcmVhbCBzeW1ib2wuICAqLwotICAgICAgaDEgPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgICAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nCi0JCQkJICAgICsgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSksCi0JCQkJICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIC8qIGgyIGRvZXMgbm90IGZvbGxvdyBpbmRpcmVjdCBzeW1ib2xzLiAqLwotICAgICAgaDIgPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwgCi0JCQkJICAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZwotCQkJCSAgICArIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpLAotCQkJCSAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gICAgICAvKiBUaGUgcmVhbCBzeW1ib2wgbXVzdCBleGlzdCBidXQgaWYgaXQgaXMgYWxzbyBhbiBBQlMgc3ltYm9sLAotCSB0aGVyZSBpcyBubyBuZWVkIHRvIGhhdmUgYSBmaXh1cC4gIFRoaXMgaXMgYmVjYXVzZSB0aGV5IGJvdGgKLQkgY2FtZSBmcm9tIHRoZSBzYW1lIGxpYnJhcnkuICBJZiBvbiB0aGUgb3RoZXIgaGFuZCwgd2UgaGFkIHRvCi0JIHVzZSBhbiBpbmRpcmVjdCBzeW1ib2wgdG8gZ2V0IHRvIHRoZSByZWFsIHN5bWJvbCwgd2UgYWRkIHRoZQotCSBmaXh1cCBhbnl3YXksIHNpbmNlIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGVzZSBzeW1ib2xzIGNvbWUKLQkgZnJvbSBkaWZmZXJlbnQgc2hhcmVkIGxpYnJhcmllcyAqLwotICAgICAgaWYgKGgxICE9IE5VTEwKLQkgICYmICgoKGgxLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJfHwgaDEtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgICAgJiYgISBiZmRfaXNfYWJzX3NlY3Rpb24gKGgxLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JICAgICAgfHwgaDItPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpKQotCXsKLQkgIC8qIFNlZSBpZiB0aGVyZSBpcyBhICJidWlsdGluIiBmaXh1cCBhbHJlYWR5IHByZXNlbnQKLQkgICAgIGludm9sdmluZyB0aGlzIHN5bWJvbC4gIElmIHNvLCBjb252ZXJ0IGl0IHRvIGEgcmVndWxhcgotCSAgICAgZml4dXAuICBJbiB0aGUgZW5kLCB0aGlzIHJlbGF4ZXMgc29tZSBvZiB0aGUgcmVxdWlyZW1lbnRzCi0JICAgICBhYm91dCB0aGUgb3JkZXIgb2YgcGVyZm9ybWluZyBmaXh1cHMuICAqLwotCSAgZXhpc3RzID0gZmFsc2U7Ci0JICBmb3IgKGYxID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7Ci0JICAgICAgIGYxICE9IE5VTEw7Ci0JICAgICAgIGYxID0gZjEtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoKGYxLT5oICE9IGggJiYgZjEtPmggIT0gaDEpCi0JCSAgfHwgKCEgZjEtPmJ1aWx0aW4gJiYgISBmMS0+anVtcCkpCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmIChmMS0+aCA9PSBoMSkKLQkJZXhpc3RzID0gdHJ1ZTsKLQkgICAgICBpZiAoISBleGlzdHMKLQkJICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLQkJewotCQkgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgxLCBmMS0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLQkJICBmLT5qdW1wID0gaXNfcGx0OwotCQl9Ci0JICAgICAgZjEtPmggPSBoMTsKLQkgICAgICBmMS0+anVtcCA9IGlzX3BsdDsKLQkgICAgICBmMS0+YnVpbHRpbiA9IDA7Ci0JICAgICAgZXhpc3RzID0gdHJ1ZTsKLQkgICAgfQotCSAgaWYgKCEgZXhpc3RzCi0JICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JICAgIHsKLQkgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLQkgICAgICBpZiAoZiA9PSBOVUxMKQotCQl7Ci0JCSAgLyogRklYTUU6IE5vIHdheSB0byByZXR1cm4gZXJyb3IuICAqLwotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgZi0+anVtcCA9IGlzX3BsdDsKLQkgICAgfQotCX0KLQotICAgICAgLyogUXVpY2sgYW5kIGRpcnR5IHdheSBvZiBzdHJpcHBpbmcgdGhlc2Ugc3ltYm9scyBmcm9tIHRoZQotCSBzeW10YWIuICovCi0gICAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JaC0+cm9vdC53cml0dGVuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgLmxpbnV4LWR5bmFtaWMgc2VjdGlvbiBpcy4KLSAgIEl0IGlzIGNhbGxlZCBieSB0aGUgTGludXggbGlua2VyIGVtdWxhdGlvbiBiZWZvcmVfYWxsb2NhdGlvbgotICAgcm91dGluZS4gIFdlIGhhdmUgZmluaXNoZWQgcmVhZGluZyBhbGwgb2YgdGhlIGlucHV0IGZpbGVzLCBhbmQgbm93Ci0gICB3ZSBqdXN0IHNjYW4gdGhlIGhhc2ggdGFibGVzIHRvIGZpbmQgb3V0IGhvdyBtYW55IGFkZGl0aW9uYWwgZml4dXBzCi0gICBhcmUgcmVxdWlyZWQuICAqLwotCi1ib29sZWFuCi1iZmRfaTM4NmxpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGZpeHVwICpmOwotICBhc2VjdGlvbiAqczsKLQotICBpZiAob3V0cHV0X2JmZC0+eHZlYyAhPSAmTVkodmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGaXJzdCBmaW5kIHRoZSBmaXh1cHMuLi4gKi8KLSAgbGludXhfbGlua19oYXNoX3RyYXZlcnNlIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICBsaW51eF90YWxseV9zeW1ib2xzLAotCQkJICAgIChQVFIpIGluZm8pOwotCi0gIC8qIElmIHRoZXJlIGFyZSBidWlsdGluIGZpeHVwcywgbGVhdmUgcm9vbSBmb3IgYSBtYXJrZXIuICBUaGlzIGlzCi0gICAgIHVzZWQgYnkgdGhlIGR5bmFtaWMgbGlua2VyIHNvIHRoYXQgaXQga25vd3MgdGhhdCBhbGwgdGhhdCBmb2xsb3cKLSAgICAgYXJlIGJ1aWx0aW4gZml4dXBzIGluc3RlYWQgb2YgcmVndWxhciBmaXh1cHMuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLQl7Ci0JICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLQkgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiAwKQotCWFib3J0ICgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGZpeHVwIHRhYmxlLiAgV2Ugd2lsbCBmaWxsIGl0IGluIGxhdGVyLiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBpZiAocyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IDggKyBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgKiA4OwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIGFyZSByZWFkeSB0byBhY3R1YWxseSB3cml0ZSB0aGUgZml4dXAgdGFibGUgdG8KLSAgIHRoZSBvdXRwdXQgZmlsZS4gIFNjYW4gdGhlIGZpeHVwIHRhYmxlcyBhbmQgc28gZm9ydGggYW5kIGdlbmVyYXRlCi0gICB0aGUgc3R1ZmYgd2UgbmVlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9maW5pc2hfZHluYW1pY19saW5rIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqcywgKm9zLCAqaXM7Ci0gIGJmZF9ieXRlICpmaXh1cF90YWJsZTsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGZpeHVwICpmOwotICB1bnNpZ25lZCBpbnQgbmV3X2FkZHI7Ci0gIGludCBzZWN0aW9uX29mZnNldDsKLSAgdW5zaWduZWQgaW50IGZpeHVwc193cml0dGVuOwotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotICBmaXh1cHNfd3JpdHRlbiA9IDA7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gIHByaW50ZiAoIkZpeHVwIHRhYmxlIGZpbGUgb2Zmc2V0OiAleCAgVk1BOiAleFxuIiwgCi0JICBvcy0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCi0JICBvcy0+dm1hICsgcy0+b3V0cHV0X29mZnNldCk7Ci0jZW5kaWYKLQotICBmaXh1cF90YWJsZSA9IHMtPmNvbnRlbnRzOwotICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQsIGZpeHVwX3RhYmxlKTsKLSAgZml4dXBfdGFibGUgKz0gNDsKLQotICAvKiBGaWxsIGluIGZpeHVwIHRhYmxlLiAgKi8KLSAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgewotICAgICAgaWYgKGYtPmJ1aWx0aW4pCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iKSwKLQkgICAgIGYtPmgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlzID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBuZXdfYWRkciA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgcHJpbnRmICgiRml4dXAoJWQpICVzOiAleCAleFxuIixmLT5qdW1wLCBmLT5oLT5yb290LnJvb3Quc3RyaW5nLAotCSAgICAgIG5ld19hZGRyLCBmLT52YWx1ZSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKGYtPmp1bXApCi0JewotCSAgLyogUmVsYXRpdmUgYWRkcmVzcyAqLwotCSAgbmV3X2FkZHIgPSBuZXdfYWRkciAtIChmLT52YWx1ZSArIDUpOyAKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUgKyAxLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCX0KLSAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+bG9jYWxfYnVpbHRpbnMgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTcGVjaWFsIG1hcmtlciBzbyB3ZSBrbm93IHRvIHN3aXRjaCB0byB0aGUgb3RoZXIgdHlwZSBvZiBmaXh1cCAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLSAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICArK2ZpeHVwc193cml0dGVuOwotICAgICAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0JewotCSAgaWYgKCEgZi0+YnVpbHRpbikKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICAmJiBmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iKSwKLQkJIGYtPmgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgaXMgPSBmLT5oLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLQkgIG5ld19hZGRyID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0JICBwcmludGYgKCJGaXh1cChCKSAlczogJXggJXhcbiIsIGYtPmgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCSAgbmV3X2FkZHIsIGYtPnZhbHVlKTsKLSNlbmRpZgotCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgKytmaXh1cHNfd3JpdHRlbjsKLQl9Ci0gIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ICE9IGZpeHVwc193cml0dGVuKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiV2FybmluZzogZml4dXAgY291bnQgbWlzbWF0Y2hcbiIpKTsKLSAgICAgIHdoaWxlIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiBmaXh1cHNfd3JpdHRlbikKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgICsrZml4dXBzX3dyaXR0ZW47Ci0JfQotICAgIH0KLQotICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIAotCQkJICAgICAgIl9fQlVJTFRJTl9GSVhVUFNfXyIsCi0JCQkgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICBpZiAoaCAhPSBOVUxMCi0gICAgICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgIHsKLSAgICAgIGlzID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBuZXdfYWRkciA9IGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgcHJpbnRmICgiQnVpbHRpbiBmaXh1cCB0YWJsZSBhdCAleFxuIiwgbmV3X2FkZHIpOwotI2VuZGlmCi0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0gICAgfQotICBlbHNlCi0gICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotCi0gIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwgb3MtPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgcy0+Y29udGVudHMsIDEsIHMtPl9yYXdfc2l6ZSwgb3V0cHV0X2JmZCkKLSAgICAgICE9IHMtPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgbGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCBsaW51eF9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLQotI2RlZmluZSBNWV96bWFnaWNfY29udGlndW91cyAxCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZseW54LmMgYi9iZmQvaTM4Nmx5bnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYwMzQ0ZS4uMDAwMDAwMAotLS0gYS9iZmQvaTM4Nmx5bnguYworKysgL2Rldi9udWxsCkBAIC0xLDU2MiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMgdW5kZXIgTHlueE9TLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2kzODYKLQotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZseW54X2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LWx5bngiCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmbmRlZiBXUklURV9IRUFERVJTCi0jZGVmaW5lIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApCQkJCQkgICAgICBcCi0gICAgICB7CQkJCQkJCQkJICAgICAgXAotCWJmZF9zaXplX3R5cGUgdGV4dF9zaXplOyAvKiBkdW1teSB2YXJzICovCQkJICAgICAgXAotCWZpbGVfcHRyIHRleHRfZW5kOwkJCQkJCSAgICAgIFwKLQlpZiAoYWRhdGEoYWJmZCkubWFnaWMgPT0gdW5kZWNpZGVkX21hZ2ljKQkJCSAgICAgIFwKLQkgIE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOyAgICAgXAotICAgIAkJCQkJCQkJCSAgICAgIFwKLQlleGVjcC0+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+YWRkZW5kID0gYWQ7CQkJCQkJXAotICAgICAgYnJlYWs7CQkJCQkJCQlcCi0gICAgfQkJCQkJCQkJCVwKLSAgfSAgICAgCQkJCQkJCQlcCi0KLXZvaWQKLU5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19pbikgKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OwotewotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotICBzdHJ1Y3QgYW91dGRhdGEgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOwotCi0gIGNhY2hlX3B0ci0+YWRkcmVzcyA9IChHRVRfU1dPUkQgKGFiZmQsIGJ5dGVzLT5yX2FkZHJlc3MpKTsKLQotICByX2luZGV4ID0gYnl0ZXMtPnJfaW5kZXhbMV07Ci0gIHJfZXh0ZXJuID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRykpOwotICByX3R5cGUgPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0JJRykKLSAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRzsKLQotICBjYWNoZV9wdHItPmhvd3RvID0gYW91dF8zMl9leHRfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gIE1PVkVfQUREUkVTUyAoR0VUX1NXT1JEIChhYmZkLCBieXRlcy0+cl9hZGRlbmQpKTsKLX0KLQotdm9pZAotTkFNRShseW54LHN3YXBfc3RkX3JlbG9jX2luKSAoYWJmZCwgYnl0ZXMsIGNhY2hlX3B0ciwgc3ltYm9scywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqYnl0ZXM7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX2Jhc2VyZWwsIHJfam1wdGFibGUsIHJfcmVsYXRpdmU7Ci0gIHN0cnVjdCBhb3V0ZGF0YSAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKTsKLQotICByX2luZGV4ID0gYnl0ZXMtPnJfaW5kZXhbMV07Ci0gIHJfZXh0ZXJuID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRykpOwotICByX3BjcmVsID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHKSk7Ci0gIHJfYmFzZXJlbCA9ICgwICE9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHKSk7Ci0gIHJfam1wdGFibGUgPSAoMCAhPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcpKTsKLSAgcl9yZWxhdGl2ZSA9ICgwICE9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRykpOwotICByX2xlbmd0aCA9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpCi0gICAgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRzsKLQotICBjYWNoZV9wdHItPmhvd3RvID0gYW91dF8zMl9zdGRfaG93dG9fdGFibGUgKyByX2xlbmd0aCArIDQgKiByX3BjcmVsOwotICAvKiBGSVhNRS1zb29uOiAgUm9sbCBiYXNlcmVsLCBqbXB0YWJsZSwgcmVsYXRpdmUgYml0cyBpbnRvIGhvd3RvIHNldHRpbmcgKi8KLQotICBNT1ZFX0FERFJFU1MgKDApOwotfQotCi0vKiBSZWxvYyBoYWNrZXJ5ICovCi0KLWJvb2xlYW4KLU5BTUUobHlueCxzbHVycF9yZWxvY190YWJsZSkgKGFiZmQsIGFzZWN0LCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2Nfc2l6ZTsKLSAgUFRSIHJlbG9jczsKLSAgYXJlbGVudCAqcmVsb2NfY2FjaGU7Ci0gIHNpemVfdCBlYWNoX3NpemU7Ci0KLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9kYXRhc2VjIChhYmZkKSkKLSAgICB7Ci0gICAgICByZWxvY19zaXplID0gZXhlY19oZHIgKGFiZmQpLT5hX2Ryc2l6ZTsKLSAgICAgIGdvdG8gZG9pdDsKLSAgICB9Ci0KLSAgaWYgKGFzZWN0ID09IG9ial90ZXh0c2VjIChhYmZkKSkKLSAgICB7Ci0gICAgICByZWxvY19zaXplID0gZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZTsKLSAgICAgIGdvdG8gZG9pdDsKLSAgICB9Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIGZhbHNlOwotCi1kb2l0OgotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGFzZWN0LT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBlYWNoX3NpemUgPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0KLSAgY291bnQgPSByZWxvY19zaXplIC8gZWFjaF9zaXplOwotCi0KLSAgcmVsb2NfY2FjaGUgPSAoYXJlbGVudCAqKSBiZmRfbWFsbG9jIChjb3VudCAqIHNpemVvZiAoYXJlbGVudCkpOwotICBpZiAoIXJlbG9jX2NhY2hlICYmIGNvdW50ICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1zZXQgKHJlbG9jX2NhY2hlLCAwLCBjb3VudCAqIHNpemVvZiAoYXJlbGVudCkpOwotCi0gIHJlbG9jcyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmVsb2Nfc2l6ZSk7Ci0gIGlmICghcmVsb2NzICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBmcmVlIChyZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxvY19zaXplLCBhYmZkKSAhPSByZWxvY19zaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY3MpOwotICAgICAgZnJlZSAocmVsb2NfY2FjaGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWFjaF9zaXplID09IFJFTE9DX0VYVF9TSVpFKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJwdHIgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSByZWxvY3M7Ci0gICAgICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7Ci0gICAgICBhcmVsZW50ICpjYWNoZV9wdHIgPSByZWxvY19jYWNoZTsKLQotICAgICAgZm9yICg7IGNvdW50ZXIgPCBjb3VudDsgY291bnRlcisrLCBycHRyKyssIGNhY2hlX3B0cisrKQotCXsKLQkgIE5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19pbikgKGFiZmQsIHJwdHIsIGNhY2hlX3B0ciwgc3ltYm9scywKLQkJCQkJYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWdpc3RlciBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpycHRyID0gKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2NzOwotICAgICAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICAgICAgYXJlbGVudCAqY2FjaGVfcHRyID0gcmVsb2NfY2FjaGU7Ci0KLSAgICAgIGZvciAoOyBjb3VudGVyIDwgY291bnQ7IGNvdW50ZXIrKywgcnB0cisrLCBjYWNoZV9wdHIrKykKLQl7Ci0JICBOQU1FKGx5bngsc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBycHRyLCBjYWNoZV9wdHIsIHN5bWJvbHMsCi0JCQkJCWJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKLQl9Ci0KLSAgICB9Ci0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jcyk7Ci0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7Ci0gIGFzZWN0LT5yZWxvY19jb3VudCA9IGNvdW50OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0KLS8qIFdyaXRlIG91dCBhIHJlbG9jYXRpb24gc2VjdGlvbiBpbnRvIGFuIG9iamVjdCBmaWxlLiAgKi8KLQotYm9vbGVhbgotTkFNRShseW54LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgYXJlbGVudCAqKmdlbmVyaWM7Ci0gIHVuc2lnbmVkIGNoYXIgKm5hdGl2ZSwgKm5hdHB0cjsKLSAgc2l6ZV90IGVhY2hfc2l6ZTsKLQotICB1bnNpZ25lZCBpbnQgY291bnQgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgc2l6ZV90IG5hdHNpemU7Ci0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZWFjaF9zaXplID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotICBuYXRzaXplID0gZWFjaF9zaXplICogY291bnQ7Ci0gIG5hdGl2ZSA9ICh1bnNpZ25lZCBjaGFyICopIGJmZF96YWxsb2MgKGFiZmQsIG5hdHNpemUpOwotICBpZiAoIW5hdGl2ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZ2VuZXJpYyA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOwotCi0gIGlmIChlYWNoX3NpemUgPT0gUkVMT0NfRVhUX1NJWkUpCi0gICAgewotICAgICAgZm9yIChuYXRwdHIgPSBuYXRpdmU7Ci0JICAgY291bnQgIT0gMDsKLQkgICAtLWNvdW50LCBuYXRwdHIgKz0gZWFjaF9zaXplLCArK2dlbmVyaWMpCi0JTkFNRShseW54LHN3YXBfZXh0X3JlbG9jX291dCkgKGFiZmQsICpnZW5lcmljLCAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSBuYXRwdHIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAobmF0cHRyID0gbmF0aXZlOwotCSAgIGNvdW50ICE9IDA7Ci0JICAgLS1jb3VudCwgbmF0cHRyICs9IGVhY2hfc2l6ZSwgKytnZW5lcmljKQotCU5BTUUobHlueCxzd2FwX3N0ZF9yZWxvY19vdXQpIChhYmZkLCAqZ2VuZXJpYywgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgbmF0cHRyKTsKLSAgICB9Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmF0aXZlLCAxLCBuYXRzaXplLCBhYmZkKSAhPSBuYXRzaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBuYXRpdmUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIG5hdGl2ZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgc3R1cGlkLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYSBib29sZWFuIHByZWRpY2F0ZSAqLwotbG9uZwotTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgaWYgKCEodGJscHRyIHx8IE5BTUUobHlueCxzbHVycF9yZWxvY190YWJsZSkgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHsKLSAgICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKLQl7Ci0JICAqcmVscHRyKysgPSAmY2hhaW4tPnJlbGVudDsKLQkgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQotCXsKLQkgICpyZWxwdHIrKyA9IHRibHB0cisrOwotCX0KLSAgICB9Ci0gICpyZWxwdHIgPSAwOwotCi0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4Nm1hY2gzLmMgYi9iZmQvaTM4Nm1hY2gzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZjc1ODIuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZtYWNoMy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBpMzg2IGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGlzIGZvciBNYWNoIDMsIHdoaWNoIHVzZXMgYS5vdXQsIG5vdCBNYWNoLU8uICAqLwotCi0vKiBUaGVyZSBpcyBubyBtYWdpYyBudW1iZXIgb3IgYW55dGhpbmcgd2hpY2ggbGV0cyB1cyBkaXN0aW5ndWlzaCB0aGlzIHRhcmdldAotICAgZnJvbSBpMzg2YW91dCBvciBpMzg2YnNkLiAgU28gdGhpcyB0YXJnZXQgaXMgb25seSB1c2VmdWwgaWYgaXQgaXMgdGhlCi0gICBkZWZhdWx0IHRhcmdldC4gICovCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQkxCi0jZGVmaW5lCVNFR01FTlRfU0laRQkweDEwMDAKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCTB4MTAwMDAKLSNkZWZpbmUgQVJDSCAzMgotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLS8qIFRoaXMgbWFjcm8gaXMgb25seSByZWxldmFudCB3aGVuIE5fTUFHSUMoeCkgPT0gWk1BR0lDLiAgKi8KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KQkxCi0KLSNkZWZpbmUgTl9UWFRTSVpFKHgpCSgoeCkuYV90ZXh0KQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfaTM4NgotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZtYWNoM18sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW1hY2gzIgotCi1zdGF0aWMgYm9vbGVhbiBNWShzZXRfc2l6ZXMpKCk7Ci0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmTVkoYmFja2VuZF9kYXRhKQotc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBNWShiYWNrZW5kX2RhdGEpID0gewotICAwLAkJCQkvKiB6bWFnaWMgY29udGlndW91cyAqLwotICAxLAkJCQkvKiB0ZXh0IGluY2wgaGVhZGVyICovCi0gIDAsCQkJCS8qIGVudHJ5IGlzIHRleHQgYWRkcmVzcyAqLwotICAwLAkJCQkvKiBleGVjX2hkcl9mbGFncyAqLwotICAwLAkJCQkvKiB0ZXh0IHZtYT8gKi8KLSAgTVkoc2V0X3NpemVzKSwKLSAgMSwJCQkJLyogZXhlYyBoZWFkZXIgbm90IGNvdW50ZWQgKi8KLSAgMCwJCQkJLyogYWRkX2R5bmFtaWNfc3ltYm9scyAqLwotICAwLAkJCQkvKiBhZGRfb25lX3N5bWJvbCAqLwotICAwLAkJCQkvKiBsaW5rX2R5bmFtaWNfb2JqZWN0ICovCi0gIDAsCQkJCS8qIHdyaXRlX2R5bmFtaWNfc3ltYm9sICovCi0gIDAsCQkJCS8qIGNoZWNrX2R5bmFtaWNfcmVsb2MgKi8KLSAgMAkJCQkvKiBmaW5pc2hfZHluYW1pY19saW5rICovCi19OwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2bXNkb3MuYyBiL2JmZC9pMzg2bXNkb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmMjRiMi4uMDAwMDAwMAotLS0gYS9iZmQvaTM4Nm1zZG9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNUy1ET1MgZXhlY3V0YWJsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQnJ5YW4gRm9yZCBvZiB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLgotCi0gICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0jaWYgMAotc3RydWN0IGV4ZV9oZWFkZXIKLXsKLQl1bnNpZ25lZCBzaG9ydCBtYWdpYzsKLQl1bnNpZ25lZCBzaG9ydCBieXRlc19pbl9sYXN0X3BhZ2U7Ci0JdW5zaWduZWQgc2hvcnQgbnBhZ2VzOwkvKiBudW1iZXIgb2YgNTEyLWJ5dGUgInBhZ2VzIiBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgKi8KLQl1bnNpZ25lZCBzaG9ydCBucmVsb2NzOwotCXVuc2lnbmVkIHNob3J0IGhlYWRlcl9wYXJhczsJLyogbnVtYmVyIG9mIDE2LWJ5dGUgcGFyYWdyYXBocyBpbiBoZWFkZXIgKi8KLQl1bnNpZ25lZCBzaG9ydCByZXNlcnZlZDsKLQl1bnNpZ25lZCBzaG9ydCBsb2FkX3N3aXRjaDsKLQl1bnNpZ25lZCBzaG9ydCBzc19vZnM7Ci0JdW5zaWduZWQgc2hvcnQgc3A7Ci0JdW5zaWduZWQgc2hvcnQgY2hlY2tzdW07Ci0JdW5zaWduZWQgc2hvcnQgaXA7Ci0JdW5zaWduZWQgc2hvcnQgY3Nfb2ZzOwotCXVuc2lnbmVkIHNob3J0IHJlbG9jX29mczsKLQl1bnNpZ25lZCBzaG9ydCByZXNlcnZlZDI7Ci0JdW5zaWduZWQgc2hvcnQgc29tZXRoaW5nMTsKLQl1bnNpZ25lZCBzaG9ydCBzb21ldGhpbmcyOwotCXVuc2lnbmVkIHNob3J0IHNvbWV0aGluZzM7Ci19OwotI2VuZGlmCi0KLSNkZWZpbmUgRVhFX01BR0lDCTB4NWE0ZAotI2RlZmluZSBFWEVfTE9BRF9ISUdICTB4MDAwMAotI2RlZmluZSBFWEVfTE9BRF9MT1cJMHhmZmZmCi0jZGVmaW5lIEVYRV9QQUdFX1NJWkUJNTEyCi0KLQotc3RhdGljIGludAotbXNkb3Nfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjOwotewotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW1zZG9zX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdGF0aWMgY2hhciBoZHJbRVhFX1BBR0VfU0laRV07Ci0gIGZpbGVfcHRyIG91dGZpbGVfc2l6ZSA9IHNpemVvZihoZHIpOwotICBiZmRfdm1hIGhpZ2hfdm1hID0gMDsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICAvKiBGaW5kIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBwcm9ncmFtIG9uIGRpc2sgYW5kIGluIG1lbW9yeS4gICovCi0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYykgPT0gMCkKLSAgICAgICAgY29udGludWU7Ci0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0FMTE9DKQotICAgICAgICB7Ci0JICBiZmRfdm1hIHNlY192bWEgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpCi0JICAJCSAgICArIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKTsKLQkgIGlmIChzZWNfdm1hID4gaGlnaF92bWEpCi0JICAgIGhpZ2hfdm1hID0gc2VjX3ZtYTsKLQl9Ci0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0xPQUQpCi0gICAgICAgIHsKLQkgIGZpbGVfcHRyIHNlY19lbmQgPSBzaXplb2YoaGRyKQotCSAgCQkgICAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCQkJICAgICArIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKTsKLQkgIGlmIChzZWNfZW5kID4gb3V0ZmlsZV9zaXplKQotCSAgICBvdXRmaWxlX3NpemUgPSBzZWNfZW5kOwotCX0KLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSBwcm9ncmFtIGlzbid0IHRvbyBiaWcuICAqLwotICBpZiAoaGlnaF92bWEgPiAoYmZkX3ZtYSkweGZmZmYpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvcihiZmRfZXJyb3JfZmlsZV90b29fYmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogY29uc3RhbnRzICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBFWEVfTUFHSUMsICZoZHJbMF0pOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgRVhFX1BBR0VfU0laRSAvIDE2LCAmaGRyWzhdKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIEVYRV9MT0FEX0xPVywgJmhkclsxMl0pOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMHgzZSwgJmhkclsyNF0pOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMHgwMDAxLCAmaGRyWzI4XSk7IC8qIFhYWD8/PyAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMHgzMGZiLCAmaGRyWzMwXSk7IC8qIFhYWD8/PyAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMHg3MjZhLCAmaGRyWzMyXSk7IC8qIFhYWD8/PyAqLwotCi0gIC8qIGJ5dGVzIGluIGxhc3QgcGFnZSAoMCA9IGZ1bGwgcGFnZSkgKi8KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIG91dGZpbGVfc2l6ZSAmIChFWEVfUEFHRV9TSVpFIC0gMSksICZoZHJbMl0pOwotCi0gIC8qIG51bWJlciBvZiBwYWdlcyAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgKG91dGZpbGVfc2l6ZSArIEVYRV9QQUdFX1NJWkUgLSAxKSAvIEVYRV9QQUdFX1NJWkUsCi0gIAkgICAgICAgJmhkcls0XSk7Ci0KLSAgLyogU2V0IHRoZSBpbml0aWFsIHN0YWNrIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgYnNzLgotICAgICBUaGUgcHJvZ3JhbSdzIGNydDAgY29kZSBtdXN0IHJlbG9jYXRlIGl0IHRvIGEgcmVhbCBzdGFjay4gICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBoaWdoX3ZtYSwgJmhkclsxNl0pOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3dyaXRlIChoZHIsIDEsIHNpemVvZihoZHIpLCBhYmZkKSAhPSBzaXplb2YoaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1tc2Rvc19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWN0aW9uLT5maWxlcG9zID0gRVhFX1BBR0VfU0laRSArIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3Rpb24pICYgU0VDX0xPQUQpCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpICE9IDAKLSAgICAgICAgICB8fCBiZmRfd3JpdGUgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi0jZGVmaW5lIG1zZG9zX21rb2JqZWN0IGFvdXRfMzJfbWtvYmplY3QKLSNkZWZpbmUgbXNkb3NfbWFrZV9lbXB0eV9zeW1ib2wgYW91dF8zMl9tYWtlX2VtcHR5X3N5bWJvbAotI2RlZmluZSBtc2Rvc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgYW91dF8zMl9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lCW1zZG9zX2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBtc2Rvc19iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgbXNkb3NfbmV3X3NlY3Rpb25faG9vayBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vawotI2RlZmluZSBtc2Rvc19nZXRfc2VjdGlvbl9jb250ZW50cyBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgbXNkb3NfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotI2RlZmluZSBtc2Rvc19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIG1zZG9zX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgbXNkb3NfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIG1zZG9zX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIG1zZG9zX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIG1zZG9zX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIG1zZG9zX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBtc2Rvc19zZXRfYXJjaF9tYWNoIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoCi0KLSNkZWZpbmUgbXNkb3NfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIG1zZG9zX2dldF9zeW10YWIgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYgotI2RlZmluZSBtc2Rvc19wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIG1zZG9zX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgbXNkb3NfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgbXNkb3NfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIG1zZG9zX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIG1zZG9zX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgbXNkb3NfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIG1zZG9zX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgbXNkb3NfY2Fub25pY2FsaXplX3JlbG9jIF9iZmRfbm9yZWxvY3NfY2Fub25pY2FsaXplX3JlbG9jCi0jZGVmaW5lIG1zZG9zX2dldF9yZWxvY191cHBlcl9ib3VuZCBfYmZkX25vcmVsb2NzX2dldF9yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBtc2Rvc18zMl9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgaTM4Nm1zZG9zX3ZlYyA9Ci17Ci0gICJtc2RvcyIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X21zZG9zX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChFWEVDX1ApLAkJCS8qIG9iamVjdCBmbGFncyAqLwotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGhkcnMgKi8KLQotICB7Ci0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgbXNkb3NfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgYmZkX2ZhbHNlLAotICAgIG1zZG9zX3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKG1zZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKG1zZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChtc2RvcyksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChtc2RvcyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKG1zZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpIDAKLX07Ci0KLQpkaWZmIC0tZ2l0IGEvYmZkL2kzODZuZXRic2QuYyBiL2JmZC9pMzg2bmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyN2I2ZjkuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZuZXRic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTmV0QlNELzM4NiBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAk0Ci0jdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotCi0jZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF9pMzg2Ci0jZGVmaW5lCURFRkFVTFRfTUlEIAlNXzM4Nl9ORVRCU0QKLQotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZuZXRic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1uZXRic2QiCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2b3M5ay5jIGIvYmZkL2kzODZvczlrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMDFmNWIuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZvczlrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBvczkwMDAgaTM4NiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgkJLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotI2luY2x1ZGUgIm9zOWsuaCIKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKm9zOWtfY2FsbGJhY2sgUEFSQU1TICgoYmZkICopKTsKLQotLyogU3dhcHMgdGhlIGluZm9ybWF0aW9uIGluIGFuIGV4ZWN1dGFibGUgaGVhZGVyIHRha2VuIGZyb20gYSByYXcgYnl0ZQotICAgc3RyZWFtIG1lbW9yeSBpbWFnZSwgaW50byB0aGUgaW50ZXJuYWwgZXhlY19oZWFkZXIgc3RydWN0dXJlLiAgKi8KLWJvb2xlYW4KLW9zOWtfc3dhcF9leGVjX2hlYWRlcl9pbiAoYWJmZCwgcmF3X2J5dGVzLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBtaF9jb20gKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBtaF9jb20gKmJ5dGVzID0gKG1oX2NvbSAqKSByYXdfYnl0ZXM7Ci0gIHVuc2lnbmVkIGludCBkbG9hZCwgZG1lbXNpemUsIGRtZW1zdGFydDsKLQotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIGV4ZWNwLCBmcm9tIHRoZSBieXRlcyBpbiB0aGUgcmF3IGRhdGEuICAqLwotICBleGVjcC0+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+X3Jhd19zaXplOwotCi0gICAgfQotICAvKiByZWdhcmRsZXNzLCBvbmNlIHdlIGtub3cgd2hhdCB3ZSdyZSBkb2luZywgd2UgbWlnaHQgYXMgd2VsbCBnZXQgZ29pbmcgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvdW50ICE9IDApCi0gICAgewotICAgICAgcmV0dXJuIChiZmRfd3JpdGUgKChQVFIpIGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgPT0gY291bnQpID8gdHJ1ZSA6IGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYJLyogMCAqLwotCi1zdGF0aWMgaW50Ci1vczlrX3NpemVvZl9oZWFkZXJzIChpZ25vcmVfYWJmZCwgaWdub3JlKQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBib29sZWFuIGlnbm9yZTsKLXsKLSAgcmV0dXJuIHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwIGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBhb3V0XzMyX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLQotI2RlZmluZSBhb3V0XzMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0jZGVmaW5lIG9zOWtfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBvczlrX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgb3M5a19iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgb3M5a19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBvczlrX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIG9zOWtfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgb3M5a19iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgaTM4Nm9zOWtfdmVjID0KLXsKLSAgImkzODZvczlrIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZHIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8IFdQX1RFWFQpLAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sIGxlYWRpbmcgY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJLyogaGRycyAqLwotICB7X2JmZF9kdW1teV90YXJnZXQsIG9zOWtfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBiZmRfZmFsc2UsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBiZmRfZmFsc2UsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9ic2QpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChvczlrKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpIDAsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2llZWUuYyBiL2JmZC9pZWVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNmIxMzYuLjAwMDAwMDAKLS0tIGEvYmZkL2llZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDM5NzAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBpZWVlLTY5NSBvYmplY3RzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBLRUVQTUlOVVNQQ0lOSU5TVCAwCi0KLS8qIElFRUUgNjk1IGZvcm1hdCBpcyBhIHN0cmVhbSBvZiByZWNvcmRzLCB3aGljaCB3ZSBwYXJzZSB1c2luZyBhIHNpbXBsZSBvbmUtCi0gICB0b2tlbiAod2hpY2ggaXMgb25lIGJ5dGUgaW4gdGhpcyBsZXhpY29uKSBsb29rYWhlYWQgcmVjdXJzaXZlIGRlY2VudAotICAgcGFyc2VyLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImllZWUuaCIKLSNpbmNsdWRlICJsaWJpZWVlLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2J5dGUgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV8yYnl0ZXMgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9pbnQgUEFSQU1TICgoYmZkICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfaWQgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9leHByZXNzaW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hLCBhc3ltYm9sICosIGJvb2xlYW4sIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgaWVlZV93cml0ZV9pbnQ1IFBBUkFNUyAoKGJmZF9ieXRlICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfaW50NV9vdXQgUEFSQU1TICgoYmZkICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfc2VjdGlvbl9wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkb193aXRoX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gZG9fYXNfcmVwZWF0IFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkb193aXRob3V0X3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9leHRlcm5hbF9wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2RhdGFfcGFydCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9kZWJ1Z19wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX21lX3BhcnQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfcHJvY2Vzc29yIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGllZWVfc2x1cnBfZGVidWcgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEZ1bmN0aW9ucyBmb3Igd3JpdGluZyB0byBpZWVlIGZpbGVzIGluIHRoZSBzdHJhbmdlIHdheSB0aGF0IHRoZQotICAgc3RhbmRhcmQgcmVxdWlyZXMuICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGJhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGJhcmc7Ci17Ci0gIGJmZF9ieXRlIGJ5dGU7Ci0KLSAgYnl0ZSA9IGJhcmc7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZieXRlLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgYnl0ZXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGJ5dGVzOwotewotICBiZmRfYnl0ZSBidWZmZXJbMl07Ci0KLSAgYnVmZmVyWzBdID0gYnl0ZXMgPj4gODsKLSAgYnVmZmVyWzFdID0gYnl0ZXMgJiAweGZmOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmZXIsIDEsIDIsIGFiZmQpICE9IDIpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfaW50IChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBpZiAodmFsdWUgPD0gMTI3KQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0KLSAgICAgIC8qIEhvdyBtYW55IHNpZ25pZmljYW50IGJ5dGVzID8gKi8KLSAgICAgIC8qIEZJWE1FIEZPUiBMT05HRVIgSU5UUyAqLwotICAgICAgaWYgKHZhbHVlICYgMHhmZjAwMDAwMCkKLQlsZW5ndGggPSA0OwotICAgICAgZWxzZSBpZiAodmFsdWUgJiAweDAwZmYwMDAwKQotCWxlbmd0aCA9IDM7Ci0gICAgICBlbHNlIGlmICh2YWx1ZSAmIDB4MDAwMGZmMDApCi0JbGVuZ3RoID0gMjsKLSAgICAgIGVsc2UKLQlsZW5ndGggPSAxOwotCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkgICAgIChiZmRfYnl0ZSkgKChpbnQpIGllZWVfbnVtYmVyX3JlcGVhdF9zdGFydF9lbnVtCi0JCQkJCSArIGxlbmd0aCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN3aXRjaCAobGVuZ3RoKQotCXsKLQljYXNlIDQ6Ci0JICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgKHZhbHVlID4+IDI0KSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAzOgotCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAoYmZkX2J5dGUpICh2YWx1ZSA+PiAxNikpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgMjoKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSAodmFsdWUgPj4gOCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgMToKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSAodmFsdWUpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2lkIChhYmZkLCBpZCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICppZDsKLXsKLSAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbiAoaWQpOwotCi0gIGlmIChsZW5ndGggPD0gMTI3KQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSBsZW5ndGgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlbmd0aCA8IDI1NSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8xX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSBsZW5ndGgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlbmd0aCA8IDY1NTM1KQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9leHRlbnNpb25fbGVuZ3RoXzJfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIChpbnQpIGxlbmd0aCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogc3RyaW5nIHRvbyBsb25nICglZCBjaGFycywgbWF4IDY1NTM1KSIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGVuZ3RoKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGlkLCAxLCBsZW5ndGgsIGFiZmQpICE9IGxlbmd0aCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRnVuY3Rpb25zIGZvciByZWFkaW5nIGZyb20gaWVlZSBmaWxlcyBpbiB0aGUgc3RyYW5nZSB3YXkgdGhhdCB0aGUKLXN0YW5kYXJkIHJlcXVpcmVzOgotKi8KLQotI2RlZmluZSB0aGlzX2J5dGUoaWVlZSkgKigoaWVlZSktPmlucHV0X3ApCi0jZGVmaW5lIG5leHRfYnl0ZShpZWVlKSAoKGllZWUpLT5pbnB1dF9wKyspCi0jZGVmaW5lIHRoaXNfYnl0ZV9hbmRfbmV4dChpZWVlKSAoKigoaWVlZSktPmlucHV0X3ArKykpCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydAotcmVhZF8yYnl0ZXMgKGllZWUpCi0gICAgIGNvbW1vbl9oZWFkZXJfdHlwZSAqaWVlZTsKLXsKLSAgdW5zaWduZWQgY2hhciBjMSA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gIHVuc2lnbmVkIGNoYXIgYzIgPSB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICByZXR1cm4gKGMxIDw8IDgpIHwgYzI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZmRfZ2V0X3N0cmluZyAoaWVlZSwgc3RyaW5nLCBsZW5ndGgpCi0gICAgIGNvbW1vbl9oZWFkZXJfdHlwZSAqaWVlZTsKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBzaXplX3QgbGVuZ3RoOwotewotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHN0cmluZ1tpXSA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1yZWFkX2lkIChpZWVlKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci17Ci0gIHNpemVfdCBsZW5ndGg7Ci0gIGNoYXIgKnN0cmluZzsKLSAgbGVuZ3RoID0gdGhpc19ieXRlX2FuZF9uZXh0IChpZWVlKTsKLSAgaWYgKGxlbmd0aCA8PSAweDdmKQotICAgIHsKLSAgICAgIC8qIFNpbXBsZSBzdHJpbmcgb2YgbGVuZ3RoIDAgdG8gMTI3ICovCi0gICAgfQotICBlbHNlIGlmIChsZW5ndGggPT0gMHhkZSkKLSAgICB7Ci0gICAgICAvKiBMZW5ndGggaXMgbmV4dCBieXRlLCBhbGxvd2luZyAwLi4yNTUgKi8KLSAgICAgIGxlbmd0aCA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gICAgfQotICBlbHNlIGlmIChsZW5ndGggPT0gMHhkZikKLSAgICB7Ci0gICAgICAvKiBMZW5ndGggaXMgbmV4dCB0d28gYnl0ZXMsIGFsbG93aW5nIDAuLjY1NTM1ICovCi0gICAgICBsZW5ndGggPSB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICAgICAgbGVuZ3RoID0gKGxlbmd0aCAqIDI1NikgKyB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICAgIH0KLSAgLyogQnV5IG1lbW9yeSBhbmQgcmVhZCBzdHJpbmcgKi8KLSAgc3RyaW5nID0gYmZkX2FsbG9jIChpZWVlLT5hYmZkLCBsZW5ndGggKyAxKTsKLSAgaWYgKCFzdHJpbmcpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGJmZF9nZXRfc3RyaW5nIChpZWVlLCBzdHJpbmcsIGxlbmd0aCk7Ci0gIHN0cmluZ1tsZW5ndGhdID0gMDsKLSAgcmV0dXJuIHN0cmluZzsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwgdmFsdWUsIHN5bWJvbCwgcGNyZWwsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYm9vbGVhbiBwY3JlbDsKLSAgICAgdW5zaWduZWQgaW50IGluZGV4OwotewotICB1bnNpZ25lZCBpbnQgdGVybV9jb3VudCA9IDA7Ci0KLSAgaWYgKHZhbHVlICE9IDApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB0ZXJtX2NvdW50Kys7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBEZWYgb2YgYSBjb21tb24gc3ltYm9sICovCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfWF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgc3ltYm9sLT52YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgdGVybV9jb3VudCsrOwotICAgIH0KLSAgZWxzZSBpZiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgLyogUmVmIHRvIGRlZmluZWQgc3ltYm9sIC0gKi8KLQotICAgICAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKQotCXsKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9JX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgc3ltYm9sLT52YWx1ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHRlcm1fY291bnQrKzsKLQl9Ci0gICAgICBlbHNlIGlmIChzeW1ib2wtPmZsYWdzICYgKEJTRl9MT0NBTCB8IEJTRl9TRUNUSU9OX1NZTSkpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIGRlZmluZWQgbG9jYWwgc3ltYm9sLiAgV2UgY2FuCi0JICAgICBlYXNpbHkgZG8gYSBsb2NhbCBhcyBhIHNlY3Rpb24rb2Zmc2V0LiAgKi8KLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9SX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJICAgIChiZmRfYnl0ZSkgKHN5bWJvbC0+c2VjdGlvbi0+aW5kZXgKLQkJCQkJCSsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHRlcm1fY291bnQrKzsKLQkgIGlmIChzeW1ib2wtPnZhbHVlICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgc3ltYm9sLT52YWx1ZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICB0ZXJtX2NvdW50Kys7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogdW5yZWNvZ25pemVkIHN5bWJvbCBgJXMnIGZsYWdzIDB4JXgiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBiZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAotCSAgICAgc3ltYm9sLT5mbGFncyk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKHBjcmVsKQotICAgIHsKLSAgICAgIC8qIHN1YnRyYWN0IHRoZSBwYyBmcm9tIGhlcmUgYnkgYXNraW5nIGZvciBQQyBvZiB0aGlzIHNlY3Rpb24qLwotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX1BfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCShiZmRfYnl0ZSkgKGluZGV4ICsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2Z1bmN0aW9uX21pbnVzX2VudW0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBkZWdlbmVyYXRlIGNhc2Ugb2YgYSAwIGFkZHJlc3MuICAqLwotICBpZiAodGVybV9jb3VudCA9PSAwKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfaW50IChhYmZkLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHdoaWxlICh0ZXJtX2NvdW50ID4gMSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZnVuY3Rpb25fcGx1c19lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB0ZXJtX2NvdW50LS07Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotd3JpdGVzIGFueSBpbnRlZ2VyIGludG8gdGhlIGJ1ZmZlciBzdXBwbGllZCBhbmQgYWx3YXlzIHRha2VzIDUgYnl0ZXMKLSovCi1zdGF0aWMgdm9pZAotaWVlZV93cml0ZV9pbnQ1IChidWZmZXIsIHZhbHVlKQotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBidWZmZXJbMF0gPSAoYmZkX2J5dGUpIGllZWVfbnVtYmVyX3JlcGVhdF80X2VudW07Ci0gIGJ1ZmZlclsxXSA9ICh2YWx1ZSA+PiAyNCkgJiAweGZmOwotICBidWZmZXJbMl0gPSAodmFsdWUgPj4gMTYpICYgMHhmZjsKLSAgYnVmZmVyWzNdID0gKHZhbHVlID4+IDgpICYgMHhmZjsKLSAgYnVmZmVyWzRdID0gKHZhbHVlID4+IDApICYgMHhmZjsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfaW50NV9vdXQgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGJmZF9ieXRlIGJbNV07Ci0KLSAgaWVlZV93cml0ZV9pbnQ1IChiLCB2YWx1ZSk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGIsIDEsIDUsIGFiZmQpICE9IDUpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2ludCAoaWVlZSwgdmFsdWVfcHRyKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci0gICAgIGJmZF92bWEgKnZhbHVlX3B0cjsKLXsKLSAgaW50IHZhbHVlID0gdGhpc19ieXRlIChpZWVlKTsKLSAgaW50IHJlc3VsdDsKLSAgaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMTI3KQotICAgIHsKLSAgICAgICp2YWx1ZV9wdHIgPSB2YWx1ZTsKLSAgICAgIG5leHRfYnl0ZSAoaWVlZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHZhbHVlID49IDB4ODAgJiYgdmFsdWUgPD0gMHg4OCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgY291bnQgPSB2YWx1ZSAmIDB4ZjsKLSAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICBuZXh0X2J5dGUgKGllZWUpOwotICAgICAgd2hpbGUgKGNvdW50KQotCXsKLQkgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgfCB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotCSAgY291bnQtLTsKLQl9Ci0gICAgICAqdmFsdWVfcHRyID0gcmVzdWx0OwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhcnNlX2kgKGllZWUsIG9rKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci0gICAgIGJvb2xlYW4gKm9rOwotewotICBiZmRfdm1hIHg7Ci0gICpvayA9IHBhcnNlX2ludCAoaWVlZSwgJngpOwotICByZXR1cm4geDsKLX0KLQotc3RhdGljIGJmZF92bWEKLW11c3RfcGFyc2VfaW50IChpZWVlKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci17Ci0gIGJmZF92bWEgcmVzdWx0OwotICBCRkRfQVNTRVJUIChwYXJzZV9pbnQgKGllZWUsICZyZXN1bHQpID09IHRydWUpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmRfdm1hIHZhbHVlOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeW1ib2w7Ci19IGllZWVfdmFsdWVfdHlwZTsKLQotCi0jaWYgS0VFUE1JTlVTUENJTklOU1QKLQotI2RlZmluZSBTUkNfTUFTSyhhcmcpIGFyZwotI2RlZmluZSBQQ1JFTF9PRkZTRVQgZmFsc2UKLQotI2Vsc2UKLQotI2RlZmluZSBTUkNfTUFTSyhhcmcpIDAKLSNkZWZpbmUgUENSRUxfT0ZGU0VUIHRydWUKLQotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGFiczMyX2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIDAsCi0JICJhYnMzMiIsCi0JIHRydWUsCi0JIDB4ZmZmZmZmZmYsCi0JIDB4ZmZmZmZmZmYsCi0JIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYWJzMTZfaG93dG8gPQotICBIT1dUTyAoMSwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgMCwKLQkgImFiczE2IiwKLQkgdHJ1ZSwKLQkgMHgwMDAwZmZmZiwKLQkgMHgwMDAwZmZmZiwKLQkgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBhYnM4X2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDAsCi0JIDgsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgMCwKLQkgImFiczgiLAotCSB0cnVlLAotCSAweDAwMDAwMGZmLAotCSAweDAwMDAwMGZmLAotCSBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJlbDMyX2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIDAsCi0JICJyZWwzMiIsCi0JIHRydWUsCi0JIFNSQ19NQVNLICgweGZmZmZmZmZmKSwKLQkgMHhmZmZmZmZmZiwKLQkgUENSRUxfT0ZGU0VUKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcmVsMTZfaG93dG8gPQotICBIT1dUTyAoMSwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgMCwKLQkgInJlbDE2IiwKLQkgdHJ1ZSwKLQkgU1JDX01BU0sgKDB4MDAwMGZmZmYpLAotCSAweDAwMDBmZmZmLAotCSBQQ1JFTF9PRkZTRVQpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByZWw4X2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDAsCi0JIDgsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgMCwKLQkgInJlbDgiLAotCSB0cnVlLAotCSBTUkNfTUFTSyAoMHgwMDAwMDBmZiksCi0JIDB4MDAwMDAwZmYsCi0JIFBDUkVMX09GRlNFVCk7Ci0KLXN0YXRpYyBpZWVlX3N5bWJvbF9pbmRleF90eXBlIE5PU1lNQk9MID0gezAsIDB9OwotCi1zdGF0aWMgdm9pZAotcGFyc2VfZXhwcmVzc2lvbiAoaWVlZSwgdmFsdWUsIHN5bWJvbCwgcGNyZWwsIGV4dHJhLCBzZWN0aW9uKQotICAgICBpZWVlX2RhdGFfdHlwZSAqaWVlZTsKLSAgICAgYmZkX3ZtYSAqdmFsdWU7Ci0gICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgKnN5bWJvbDsKLSAgICAgYm9vbGVhbiAqcGNyZWw7Ci0gICAgIHVuc2lnbmVkIGludCAqZXh0cmE7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbjsKLQotewotI2RlZmluZSBQT1Mgc3BbMV0KLSNkZWZpbmUgVE9TIHNwWzBdCi0jZGVmaW5lIE5PUyBzcFstMV0KLSNkZWZpbmUgSU5DIHNwKys7Ci0jZGVmaW5lIERFQyBzcC0tOwotCi0gIGJvb2xlYW4gbG9vcCA9IHRydWU7Ci0gIGllZWVfdmFsdWVfdHlwZSBzdGFja1sxMF07Ci0KLSAgLyogVGhlIHN0YWNrIHBvaW50ZXIgYWx3YXlzIHBvaW50cyB0byB0aGUgbmV4dCB1bnVzZWQgbG9jYXRpb24gKi8KLSNkZWZpbmUgUFVTSCh4LHkseikgVE9TLnN5bWJvbD14O1RPUy5zZWN0aW9uPXk7VE9TLnZhbHVlPXo7SU5DOwotI2RlZmluZSBQT1AoeCx5LHopIERFQzt4PVRPUy5zeW1ib2w7eT1UT1Muc2VjdGlvbjt6PVRPUy52YWx1ZTsKLSAgaWVlZV92YWx1ZV90eXBlICpzcCA9IHN0YWNrOwotCi0gIHdoaWxlIChsb29wKQotICAgIHsKLSAgICAgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKLQl7Ci0JY2FzZSBpZWVlX3ZhcmlhYmxlX1BfZW51bToKLQkgIC8qIFAgdmFyaWFibGUsIGN1cnJlbnQgcHJvZ3JhbSBjb3VudGVyIGZvciBzZWN0aW9uIG4gKi8KLQkgIHsKLQkgICAgaW50IHNlY3Rpb25fbjsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgKnBjcmVsID0gdHJ1ZTsKLQkgICAgc2VjdGlvbl9uID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICBQVVNIIChOT1NZTUJPTCwgYmZkX2Fic19zZWN0aW9uX3B0ciwgMCk7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgaWVlZV92YXJpYWJsZV9MX2VudW06Ci0JICAvKiBMIHZhcmlhYmxlICBhZGRyZXNzIG9mIHNlY3Rpb24gTiAqLwotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgIFBVU0ggKE5PU1lNQk9MLCBpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV0sIDApOwotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX3ZhcmlhYmxlX1JfZW51bToKLQkgIC8qIFIgdmFyaWFibGUsIGxvZ2ljYWwgYWRkcmVzcyBvZiBzZWN0aW9uIG1vZHVsZSAqLwotCSAgLyogRklYTUUsIHRoaXMgc2hvdWxkIGJlIGRpZmZlcmVudCB0byBMICovCi0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgUFVTSCAoTk9TWU1CT0wsIGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXSwgMCk7Ci0JICBicmVhazsKLQljYXNlIGllZWVfdmFyaWFibGVfU19lbnVtOgotCSAgLyogUyB2YXJpYWJsZSwgc2l6ZSBpbiBNQVVTIG9mIHNlY3Rpb24gbW9kdWxlICovCi0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgUFVTSCAoTk9TWU1CT0wsCi0JCTAsCi0JCWllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXS0+X3Jhd19zaXplKTsKLQkgIGJyZWFrOwotCWNhc2UgaWVlZV92YXJpYWJsZV9JX2VudW06Ci0JICAvKiBQdXNoIHRoZSBhZGRyZXNzIG9mIHZhcmlhYmxlIG4gKi8KLQkgIHsKLQkgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgc3kuaW5kZXggPSAoaW50KSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgIHN5LmxldHRlciA9ICdJJzsKLQotCSAgICBQVVNIIChzeSwgYmZkX2Fic19zZWN0aW9uX3B0ciwgMCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfdmFyaWFibGVfWF9lbnVtOgotCSAgLyogUHVzaCB0aGUgYWRkcmVzcyBvZiBleHRlcm5hbCB2YXJpYWJsZSBuICovCi0JICB7Ci0JICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3k7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIHN5LmluZGV4ID0gKGludCkgKG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKSk7Ci0JICAgIHN5LmxldHRlciA9ICdYJzsKLQotCSAgICBQVVNIIChzeSwgYmZkX3VuZF9zZWN0aW9uX3B0ciwgMCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfZnVuY3Rpb25fbWludXNfZW51bToKLQkgIHsKLQkgICAgYmZkX3ZtYSB2YWx1ZTEsIHZhbHVlMjsKLQkgICAgYXNlY3Rpb24gKnNlY3Rpb24xLCAqc2VjdGlvbl9kdW1teTsKLQkgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgICBQT1AgKHN5LCBzZWN0aW9uMSwgdmFsdWUxKTsKLQkgICAgUE9QIChzeSwgc2VjdGlvbl9kdW1teSwgdmFsdWUyKTsKLQkgICAgUFVTSCAoc3ksIHNlY3Rpb24xID8gc2VjdGlvbjEgOiBzZWN0aW9uX2R1bW15LCB2YWx1ZTIgLSB2YWx1ZTEpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX2Z1bmN0aW9uX3BsdXNfZW51bToKLQkgIHsKLQkgICAgYmZkX3ZtYSB2YWx1ZTEsIHZhbHVlMjsKLQkgICAgYXNlY3Rpb24gKnNlY3Rpb24xOwotCSAgICBhc2VjdGlvbiAqc2VjdGlvbjI7Ci0JICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3kxOwotCSAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5MjsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgICBQT1AgKHN5MSwgc2VjdGlvbjEsIHZhbHVlMSk7Ci0JICAgIFBPUCAoc3kyLCBzZWN0aW9uMiwgdmFsdWUyKTsKLQkgICAgUFVTSCAoc3kxLmxldHRlciA/IHN5MSA6IHN5MiwKLQkJICBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24xKSA/IHNlY3Rpb24yIDogc2VjdGlvbjEsCi0JCSAgdmFsdWUxICsgdmFsdWUyKTsKLQkgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICB7Ci0JICAgIGJmZF92bWEgdmE7Ci0JICAgIEJGRF9BU1NFUlQgKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPCAoaW50KSBpZWVlX3ZhcmlhYmxlX0FfZW51bQotCQkgICAgfHwgdGhpc19ieXRlICgmKGllZWUtPmgpKSA+IChpbnQpIGllZWVfdmFyaWFibGVfWl9lbnVtKTsKLQkgICAgaWYgKHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhKSkKLQkgICAgICB7Ci0JCVBVU0ggKE5PU1lNQk9MLCBiZmRfYWJzX3NlY3Rpb25fcHRyLCB2YSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQkvKgotCQkgIFRoYXRzIGFsbCB0aGF0IHdlIGNhbiB1bmRlcnN0YW5kLiBBcyBmYXIgYXMgSSBjYW4gc2VlCi0JCSAgdGhlcmUgaXMgYSBidWcgaW4gdGhlIE1pY3JvdGVjIElFRUUgb3V0cHV0IHdoaWNoIEknbQotCQkgIHVzaW5nIHRvIHNjYW4sIHdoZXJlYnkgdGhlIGNvbW1hIG9wZXJhdG9yIGlzIG9taXR0ZWQKLQkJICBzb21ldGltZXMgaW4gYW4gZXhwcmVzc2lvbiwgZ2l2aW5nIGV4cHJlc3Npb25zIHdpdGggdG9vCi0JCSAgbWFueSB0ZXJtcy4gV2UgY2FuIHRlbGwgaWYgdGhhdCdzIHRoZSBjYXNlIGJ5IGVuc3VyaW5nCi0JCSAgdGhhdCBzcCA9PSBzdGFjayBoZXJlLiBJZiBub3QsIHRoZW4gd2UndmUgcHVzaGVkCi0JCSAgc29tZXRoaW5nIHRvbyBmYXIsIHNvIHdlIGtlZXAgYWRkaW5nLiAgKi8KLQotCQl3aGlsZSAoc3AgIT0gc3RhY2sgKyAxKQotCQkgIHsKLQkJICAgIGFzZWN0aW9uICpzZWN0aW9uMTsKLQkJICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3kxOwotCQkgICAgUE9QIChzeTEsIHNlY3Rpb24xLCAqZXh0cmEpOwotCQkgIH0KLQkJewotCQkgIGFzZWN0aW9uICpkdW1teTsKLQotCQkgIFBPUCAoKnN5bWJvbCwgZHVtbXksICp2YWx1ZSk7Ci0JCSAgaWYgKHNlY3Rpb24pCi0JCSAgICAqc2VjdGlvbiA9IGR1bW15OwotCQl9Ci0KLQkJbG9vcCA9IGZhbHNlOwotCSAgICAgIH0KLQkgIH0KLQl9Ci0gICAgfQotfQotCi0KLSNkZWZpbmUgaWVlZV9zZWVrKGFiZmQsIG9mZnNldCkgXAotICBJRUVFX0RBVEEoYWJmZCktPmguaW5wdXRfcCA9IElFRUVfREFUQShhYmZkKS0+aC5maXJzdF9ieXRlICsgb2Zmc2V0Ci0KLSNkZWZpbmUgaWVlZV9wb3MoYWJmZCkgXAotICAoSUVFRV9EQVRBKGFiZmQpLT5oLmlucHV0X3AgLSBJRUVFX0RBVEEoYWJmZCktPmguZmlyc3RfYnl0ZSkKLQotc3RhdGljIHVuc2lnbmVkIGludCBsYXN0X2luZGV4Owotc3RhdGljIGNoYXIgbGFzdF90eXBlOwkJLyogaXMgdGhlIGluZGV4IGZvciBhbiBYIG9yIGEgRCAqLwotCi1zdGF0aWMgaWVlZV9zeW1ib2xfdHlwZSAqCi1nZXRfc3ltYm9sIChhYmZkLAotCSAgICBpZWVlLAotCSAgICBsYXN0X3N5bWJvbCwKLQkgICAgc3ltYm9sX2NvdW50LAotCSAgICBwcHRyLAotCSAgICBtYXhfaW5kZXgsCi0JICAgIHRoaXNfdHlwZQotKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGllZWVfZGF0YV90eXBlICppZWVlOwotICAgICBpZWVlX3N5bWJvbF90eXBlICpsYXN0X3N5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50ICpzeW1ib2xfY291bnQ7Ci0gICAgIGllZWVfc3ltYm9sX3R5cGUgKioqcHB0cjsKLSAgICAgdW5zaWduZWQgaW50ICptYXhfaW5kZXg7Ci0gICAgIGNoYXIgdGhpc190eXBlCi0gICAgICA7Ci17Ci0gIC8qIE5lZWQgYSBuZXcgc3ltYm9sICovCi0gIHVuc2lnbmVkIGludCBuZXdfaW5kZXggPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0gIGlmIChuZXdfaW5kZXggIT0gbGFzdF9pbmRleCB8fCB0aGlzX3R5cGUgIT0gbGFzdF90eXBlKQotICAgIHsKLSAgICAgIGllZWVfc3ltYm9sX3R5cGUgKm5ld19zeW1ib2wgPSAoaWVlZV9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGllZWUtPmguYWJmZCwKLQkJCQkJCSBzaXplb2YgKGllZWVfc3ltYm9sX3R5cGUpKTsKLSAgICAgIGlmICghbmV3X3N5bWJvbCkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgbmV3X3N5bWJvbC0+aW5kZXggPSBuZXdfaW5kZXg7Ci0gICAgICBsYXN0X2luZGV4ID0gbmV3X2luZGV4OwotICAgICAgKCpzeW1ib2xfY291bnQpKys7Ci0gICAgICAqKnBwdHIgPSBuZXdfc3ltYm9sOwotICAgICAgKnBwdHIgPSAmbmV3X3N5bWJvbC0+bmV4dDsKLSAgICAgIGlmIChuZXdfaW5kZXggPiAqbWF4X2luZGV4KQotCXsKLQkgICptYXhfaW5kZXggPSBuZXdfaW5kZXg7Ci0JfQotICAgICAgbGFzdF90eXBlID0gdGhpc190eXBlOwotICAgICAgbmV3X3N5bWJvbC0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgcmV0dXJuIG5ld19zeW1ib2w7Ci0gICAgfQotICByZXR1cm4gbGFzdF9zeW1ib2w7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBmaWxlX3B0ciBvZmZzZXQgPSBpZWVlLT53LnIuZXh0ZXJuYWxfcGFydDsKLQotICBpZWVlX3N5bWJvbF90eXBlICoqcHJldl9zeW1ib2xzX3B0ciA9ICZpZWVlLT5leHRlcm5hbF9zeW1ib2xzOwotICBpZWVlX3N5bWJvbF90eXBlICoqcHJldl9yZWZlcmVuY2VfcHRyID0gJmllZWUtPmV4dGVybmFsX3JlZmVyZW5jZTsKLSAgaWVlZV9zeW1ib2xfdHlwZSAqc3ltYm9sID0gKGllZWVfc3ltYm9sX3R5cGUgKikgTlVMTDsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9jb3VudCA9IDA7Ci0gIGJvb2xlYW4gbG9vcCA9IHRydWU7Ci0gIGxhc3RfaW5kZXggPSAweGZmZmZmZjsKLSAgaWVlZS0+c3ltYm9sX3RhYmxlX2Z1bGwgPSB0cnVlOwotCi0gIGllZWVfc2VlayAoYWJmZCwgb2Zmc2V0KTsKLQotICB3aGlsZSAobG9vcCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0JewotCWNhc2UgaWVlZV9ubl9yZWNvcmQ6Ci0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCi0JICBzeW1ib2wgPSBnZXRfc3ltYm9sIChhYmZkLCBpZWVlLCBzeW1ib2wsICZzeW1ib2xfY291bnQsCi0JCQkgICAgICAgJnByZXZfc3ltYm9sc19wdHIsCi0JCQkgICAgICAgJmllZWUtPmV4dGVybmFsX3N5bWJvbF9tYXhfaW5kZXgsICdJJyk7Ci0JICBpZiAoc3ltYm9sID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgc3ltYm9sLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0JICBzeW1ib2wtPnN5bWJvbC5uYW1lID0gcmVhZF9pZCAoJihpZWVlLT5oKSk7Ci0JICBzeW1ib2wtPnN5bWJvbC51ZGF0YS5wID0gKFBUUikgTlVMTDsKLQkgIHN5bWJvbC0+c3ltYm9sLmZsYWdzID0gQlNGX05PX0ZMQUdTOwotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX2V4dGVybmFsX3N5bWJvbF9lbnVtOgotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgc3ltYm9sID0gZ2V0X3N5bWJvbCAoYWJmZCwgaWVlZSwgc3ltYm9sLCAmc3ltYm9sX2NvdW50LAotCQkJICAgICAgICZwcmV2X3N5bWJvbHNfcHRyLAotCQkJICAgICAgICZpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWF4X2luZGV4LCAnRCcpOwotCSAgaWYgKHN5bWJvbCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIEJGRF9BU1NFUlQgKHN5bWJvbC0+aW5kZXggPj0gaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21pbl9pbmRleCk7Ci0KLQkgIHN5bWJvbC0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCSAgc3ltYm9sLT5zeW1ib2wubmFtZSA9IHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotCSAgc3ltYm9sLT5zeW1ib2wudWRhdGEucCA9IChQVFIpIE5VTEw7Ci0JICBzeW1ib2wtPnN5bWJvbC5mbGFncyA9IEJTRl9OT19GTEFHUzsKLQkgIGJyZWFrOwotCWNhc2UgaWVlZV9hdHRyaWJ1dGVfcmVjb3JkX2VudW0gPj4gODoKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHN5bWJvbF9uYW1lX2luZGV4OwotCSAgICB1bnNpZ25lZCBpbnQgc3ltYm9sX3R5cGVfaW5kZXg7Ci0JICAgIHVuc2lnbmVkIGludCBzeW1ib2xfYXR0cmlidXRlX2RlZjsKLQkgICAgYmZkX3ZtYSB2YWx1ZTsKLQkgICAgc3dpdGNoIChyZWFkXzJieXRlcyAoaWVlZSkpCi0JICAgICAgewotCSAgICAgIGNhc2UgaWVlZV9hdHRyaWJ1dGVfcmVjb3JkX2VudW06Ci0JCXN5bWJvbF9uYW1lX2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQlzeW1ib2xfdHlwZV9pbmRleCA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJc3ltYm9sX2F0dHJpYnV0ZV9kZWYgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCXN3aXRjaCAoc3ltYm9sX2F0dHJpYnV0ZV9kZWYpCi0JCSAgewotCQkgIGNhc2UgODoKLQkJICBjYXNlIDE5OgotCQkgICAgcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJICAgIGJyZWFrOwotCQkgIGRlZmF1bHQ6Ci0JCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgICAgKF8oIiVzOiB1bmltcGxlbWVudGVkIEFUSSByZWNvcmQgICV1IGZvciBzeW1ib2wgJXUiKSwKLQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzeW1ib2xfYXR0cmlidXRlX2RlZiwKLQkJICAgICAgIHN5bWJvbF9uYW1lX2luZGV4KTsKLQkJICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQlicmVhazsKLQkgICAgICBjYXNlIGllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2luZm9fcmVjb3JkX2VudW06Ci0JCS8qIFNraXAgb3ZlciBBVFggcmVjb3JkLiAqLwotCQlwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSk7Ci0JCXBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmdmFsdWUpOwotCQlwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgaWVlZV9hdG5fcmVjb3JkX2VudW06Ci0JCS8qIFdlIG1heSBnZXQgY2FsbCBvcHRpbWl6YXRpb24gaW5mb3JtYXRpb24gaGVyZSwKLQkJICAgd2hpY2ggd2UganVzdCBpZ25vcmUuICBUaGUgZm9ybWF0IGlzCi0JCSAgIHskRjF9JHtDRX17aW5kZXh9eyQwMH17JDNGfXskM0Z9eyNfb2ZfQVNOc30gKi8KLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJaWYgKHZhbHVlICE9IDB4M2YpCi0JCSAgewotCQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAgIChfKCIlczogdW5leHBlY3RlZCBBVE4gdHlwZSAlZCBpbiBleHRlcm5hbCBwYXJ0IiksCi0JCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIChpbnQpIHZhbHVlKTsKLQkJICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJd2hpbGUgKHZhbHVlID4gMCkKLQkJICB7Ci0JCSAgICBiZmRfdm1hIHZhbDE7Ci0KLQkJICAgIC0tdmFsdWU7Ci0KLQkJICAgIHN3aXRjaCAocmVhZF8yYnl0ZXMgKGllZWUpKQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgaWVlZV9hc25fcmVjb3JkX2VudW06Ci0JCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsMSk7Ci0JCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsMSk7Ci0JCQlicmVhazsKLQotCQkgICAgICBkZWZhdWx0OgotCQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkgIChfKCIlczogdW5leHBlY3RlZCB0eXBlIGFmdGVyIEFUTiIpLAotCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfdmFsdWVfcmVjb3JkX2VudW0gPj4gODoKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHN5bWJvbF9uYW1lX2luZGV4OwotCSAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5bWJvbF9pZ25vcmU7Ci0JICAgIGJvb2xlYW4gcGNyZWxfaWdub3JlOwotCSAgICB1bnNpZ25lZCBpbnQgZXh0cmE7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0KLQkgICAgc3ltYm9sX25hbWVfaW5kZXggPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgIHBhcnNlX2V4cHJlc3Npb24gKGllZWUsCi0JCQkgICAgICAmc3ltYm9sLT5zeW1ib2wudmFsdWUsCi0JCQkgICAgICAmc3ltYm9sX2lnbm9yZSwKLQkJCSAgICAgICZwY3JlbF9pZ25vcmUsCi0JCQkgICAgICAmZXh0cmEsCi0JCQkgICAgICAmc3ltYm9sLT5zeW1ib2wuc2VjdGlvbik7Ci0KLQkgICAgLyogRnVsbHkgbGlua2VkIElFRUUtNjk1IGZpbGVzIHRlbmQgdG8gZ2l2ZSBldmVyeSBzeW1ib2wKLSAgICAgICAgICAgICAgIGFuIGFic29sdXRlIHZhbHVlLiAgVHJ5IHRvIGNvbnZlcnQgdGhhdCBiYWNrIGludG8gYQotICAgICAgICAgICAgICAgc2VjdGlvbiByZWxhdGl2ZSB2YWx1ZS4gIEZJWE1FOiBUaGlzIHdvbid0IGFsd2F5cyB0bwotICAgICAgICAgICAgICAgdGhlIHJpZ2h0IHRoaW5nLiAgKi8KLQkgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zeW1ib2wuc2VjdGlvbikKLQkJJiYgKGFiZmQtPmZsYWdzICYgSEFTX1JFTE9DKSA9PSAwKQotCSAgICAgIHsKLQkJYmZkX3ZtYSB2YWw7Ci0JCWFzZWN0aW9uICpzOwotCi0JCXZhbCA9IHN5bWJvbC0+c3ltYm9sLnZhbHVlOwotCQlmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQkJICB7Ci0JCSAgICBpZiAodmFsID49IHMtPnZtYSAmJiB2YWwgPCBzLT52bWEgKyBzLT5fcmF3X3NpemUpCi0JCSAgICAgIHsKLQkJCXN5bWJvbC0+c3ltYm9sLnNlY3Rpb24gPSBzOwotCQkJc3ltYm9sLT5zeW1ib2wudmFsdWUgLT0gcy0+dm1hOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCi0JICAgIHN5bWJvbC0+c3ltYm9sLmZsYWdzID0gQlNGX0dMT0JBTCB8IEJTRl9FWFBPUlQ7Ci0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgaWVlZV93ZWFrX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtOgotCSAgewotCSAgICBiZmRfdm1hIHNpemU7Ci0JICAgIGJmZF92bWEgdmFsdWU7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIC8qIFRocm93IGF3YXkgdGhlIGV4dGVybmFsIHJlZmVyZW5jZSBpbmRleCAqLwotCSAgICAodm9pZCkgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICAvKiBGZXRjaCB0aGUgZGVmYXVsdCBzaXplIGlmIG5vdCByZXNvbHZlZCAqLwotCSAgICBzaXplID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICAvKiBGZXRjaCB0aGUgZGVmYXV0bHQgdmFsdWUgaWYgYXZhaWxhYmxlICovCi0JICAgIGlmIChwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSkgPT0gZmFsc2UpCi0JICAgICAgewotCQl2YWx1ZSA9IDA7Ci0JICAgICAgfQotCSAgICAvKiBUaGlzIHR1cm5zIGludG8gYSBjb21tb24gKi8KLQkgICAgc3ltYm9sLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICAgIHN5bWJvbC0+c3ltYm9sLnZhbHVlID0gc2l6ZTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtOgotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgc3ltYm9sID0gZ2V0X3N5bWJvbCAoYWJmZCwgaWVlZSwgc3ltYm9sLCAmc3ltYm9sX2NvdW50LAotCQkJICAgICAgICZwcmV2X3JlZmVyZW5jZV9wdHIsCi0JCQkgICAgICAgJmllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9tYXhfaW5kZXgsICdYJyk7Ci0JICBpZiAoc3ltYm9sID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgc3ltYm9sLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0JICBzeW1ib2wtPnN5bWJvbC5uYW1lID0gcmVhZF9pZCAoJihpZWVlLT5oKSk7Ci0JICBzeW1ib2wtPnN5bWJvbC51ZGF0YS5wID0gKFBUUikgTlVMTDsKLQkgIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgc3ltYm9sLT5zeW1ib2wudmFsdWUgPSAoYmZkX3ZtYSkgMDsKLQkgIHN5bWJvbC0+c3ltYm9sLmZsYWdzID0gMDsKLQotCSAgQkZEX0FTU0VSVCAoc3ltYm9sLT5pbmRleCA+PSBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWluX2luZGV4KTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGxvb3AgPSBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWF4X2luZGV4ICE9IDApCi0gICAgewotICAgICAgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX2NvdW50ID0KLQlpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWF4X2luZGV4IC0KLQlpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWluX2luZGV4ICsgMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZWVlLT5leHRlcm5hbF9zeW1ib2xfY291bnQgPSAwOwotICAgIH0KLQotICBpZiAoaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21heF9pbmRleCAhPSAwKQotICAgIHsKLSAgICAgIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9jb3VudCA9Ci0JaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21heF9pbmRleCAtCi0JaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21pbl9pbmRleCArIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgYWJmZC0+c3ltY291bnQgPQotICAgIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9jb3VudCArIGllZWUtPmV4dGVybmFsX3N5bWJvbF9jb3VudDsKLQotICBpZiAoc3ltYm9sX2NvdW50ICE9IGFiZmQtPnN5bWNvdW50KQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGFyZSBnYXBzIGluIHRoZSB0YWJsZSAtLSAqLwotICAgICAgaWVlZS0+c3ltYm9sX3RhYmxlX2Z1bGwgPSBmYWxzZTsKLSAgICB9Ci0KLSAgKnByZXZfc3ltYm9sc19wdHIgPSAoaWVlZV9zeW1ib2xfdHlwZSAqKSBOVUxMOwotICAqcHJldl9yZWZlcmVuY2VfcHRyID0gKGllZWVfc3ltYm9sX3R5cGUgKikgTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChJRUVFX0RBVEEgKGFiZmQpLT5yZWFkX3N5bWJvbHMgPT0gZmFsc2UpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBJRUVFX0RBVEEgKGFiZmQpLT5yZWFkX3N5bWJvbHMgPSB0cnVlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWxvbmcKLWllZWVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoISBpZWVlX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAoYWJmZC0+c3ltY291bnQgIT0gMCkgPwotICAgIChhYmZkLT5zeW1jb3VudCArIDEpICogKHNpemVvZiAoaWVlZV9zeW1ib2xfdHlwZSAqKSkgOiAwOwotfQotCi0vKgotTW92ZSBmcm9tIG91ciBpbnRlcm5hbCBsaXN0cyB0byB0aGUgY2Fub24gdGFibGUsIGFuZCBpbnNlcnQgaW4KLXN5bWJvbCBpbmRleCBvcmRlcgotKi8KLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaWVlZV92ZWM7Ci0KLWxvbmcKLWllZWVfZ2V0X3N5bXRhYiAoYWJmZCwgbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmxvY2F0aW9uOwotewotICBpZWVlX3N5bWJvbF90eXBlICpzeW1wOwotICBzdGF0aWMgYmZkIGR1bW15X2JmZDsKLSAgc3RhdGljIGFzeW1ib2wgZW1wdHlfc3ltYm9sID0KLSAgLyogdGhlX2JmZCwgbmFtZSwgdmFsdWUsIGF0dHIsIHNlY3Rpb24gKi8KLSAgeyZkdW1teV9iZmQsICIgaWVlZSBlbXB0eSIsIChzeW12YWx1ZSkgMCwgQlNGX0RFQlVHR0lORywgYmZkX2Fic19zZWN0aW9uX3B0cn07Ci0KLSAgaWYgKGFiZmQtPnN5bWNvdW50KQotICAgIHsKLSAgICAgIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgICAgIGR1bW15X2JmZC54dmVjID0gJmllZWVfdmVjOwotICAgICAgaWYgKCEgaWVlZV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotCXJldHVybiAtMTsKLQotICAgICAgaWYgKGllZWUtPnN5bWJvbF90YWJsZV9mdWxsID09IGZhbHNlKQotCXsKLQkgIC8qIEFycmdoIC0gdGhlcmUgYXJlIGdhcHMgaW4gdGhlIHRhYmxlLCBydW4gdGhyb3VnaCBhbmQgZmlsbCB0aGVtICovCi0JICAvKiB1cCB3aXRoIHBvaW50ZXJzIHRvIGEgbnVsbCBwbGFjZSAqLwotCSAgdW5zaWduZWQgaW50IGk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+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+aCkpXTsKLQkJICAgIHNlY3Rpb24tPnZtYSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIHNlY3Rpb24tPmxtYSA9IHNlY3Rpb24tPnZtYTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgaWVlZV9zZWN0aW9uX29mZnNldF9lbnVtOgotCQkgICAgKHZvaWQpIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgICh2b2lkKSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICBicmVhazsKLQkJICBkZWZhdWx0OgotCQkgICAgcmV0dXJuOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogTWFrZSBhIHNlY3Rpb24gZm9yIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGlmIGFueS4gIFdlIGRvbid0IHRyeQotICAgdG8gaW50ZXJwcmV0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb247IHdlIGp1c3QgcG9pbnQgdGhlIHNlY3Rpb24KLSAgIGF0IHRoZSBhcmVhIGluIHRoZSBmaWxlIHNvIHRoYXQgcHJvZ3JhbSB3aGljaCB1bmRlcnN0YW5kIGNhbiBkaWcgaXQKLSAgIG91dC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3NsdXJwX2RlYnVnIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICBpZiAoaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmRlYnVnIik7Ci0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHNlYy0+ZmxhZ3MgfD0gU0VDX0RFQlVHR0lORyB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHNlYy0+ZmlsZXBvcyA9IGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0OwotICBzZWMtPl9yYXdfc2l6ZSA9IGllZWUtPncuci5kYXRhX3BhcnQgLSBpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgYXJjaGl2ZSBzdHVmZgotKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1pZWVlX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICpsaWJyYXJ5OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgY2hhciBidWZmZXJbNTEyXTsKLSAgZmlsZV9wdHIgYnVmZmVyX29mZnNldCA9IDA7Ci0gIGllZWVfYXJfZGF0YV90eXBlICpzYXZlID0gYWJmZC0+dGRhdGEuaWVlZV9hcl9kYXRhOwotICBpZWVlX2FyX2RhdGFfdHlwZSAqaWVlZTsKLSAgdW5zaWduZWQgaW50IGFsY19lbHRzOwotICBpZWVlX2FyX29ic3RhY2tfdHlwZSAqZWx0cyA9IE5VTEw7Ci0KLSAgYWJmZC0+dGRhdGEuaWVlZV9hcl9kYXRhID0KLSAgICAoaWVlZV9hcl9kYXRhX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGllZWVfYXJfZGF0YV90eXBlKSk7Ci0gIGlmICghYWJmZC0+dGRhdGEuaWVlZV9hcl9kYXRhKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZWVlID0gSUVFRV9BUl9EQVRBIChhYmZkKTsKLQotICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMgdG8gcmVhZAotICAgICB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLwotICBiZmRfcmVhZCAoKFBUUikgYnVmZmVyLCAxLCBzaXplb2YgKGJ1ZmZlciksIGFiZmQpOwotCi0gIGllZWUtPmguZmlyc3RfYnl0ZSA9IGJ1ZmZlcjsKLSAgaWVlZS0+aC5pbnB1dF9wID0gYnVmZmVyOwotCi0gIGllZWUtPmguYWJmZCA9IGFiZmQ7Ci0KLSAgaWYgKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgIT0gTW9kdWxlX0JlZ2lubmluZykKLSAgICB7Ci0gICAgICBhYmZkLT50ZGF0YS5pZWVlX2FyX2RhdGEgPSBzYXZlOwotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0gIGxpYnJhcnkgPSByZWFkX2lkICgmKGllZWUtPmgpKTsKLSAgaWYgKHN0cmNtcCAobGlicmFyeSwgIkxJQlJBUlkiKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBpZWVlKTsKLSAgICAgIGFiZmQtPnRkYXRhLmllZWVfYXJfZGF0YSA9IHNhdmU7Ci0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0gIC8qIFRocm93IGF3YXkgdGhlIGZpbGVuYW1lICovCi0gIHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotCi0gIGllZWUtPmVsZW1lbnRfY291bnQgPSAwOwotICBpZWVlLT5lbGVtZW50X2luZGV4ID0gMDsKLQotICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwkvKiBEcm9wIHRoZSBhZCBwYXJ0ICovCi0gIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsJLyogQW5kIHRoZSB0d28gZHVtbXkgbnVtYmVycyAqLwotICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0KLSAgYWxjX2VsdHMgPSAxMDsKLSAgZWx0cyA9IChpZWVlX2FyX29ic3RhY2tfdHlwZSAqKSBiZmRfbWFsbG9jIChhbGNfZWx0cyAqIHNpemVvZiAqZWx0cyk7Ci0gIGlmIChlbHRzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogUmVhZCB0aGUgaW5kZXggb2YgdGhlIEJCIHRhYmxlICovCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCByZWM7Ci0gICAgICBpZWVlX2FyX29ic3RhY2tfdHlwZSAqdDsKLQotICAgICAgcmVjID0gcmVhZF8yYnl0ZXMgKCYoaWVlZS0+aCkpOwotICAgICAgaWYgKHJlYyAhPSAoaW50KSBpZWVlX2Fzc2lnbl92YWx1ZV90b192YXJpYWJsZV9lbnVtKQotCWJyZWFrOwotCi0gICAgICBpZiAoaWVlZS0+ZWxlbWVudF9jb3VudCA+PSBhbGNfZWx0cykKLQl7Ci0JICBpZWVlX2FyX29ic3RhY2tfdHlwZSAqbjsKLQotCSAgYWxjX2VsdHMgKj0gMjsKLQkgIG4gPSAoKGllZWVfYXJfb2JzdGFja190eXBlICopCi0JICAgICAgIGJmZF9yZWFsbG9jIChlbHRzLCBhbGNfZWx0cyAqIHNpemVvZiAqZWx0cykpOwotCSAgaWYgKG4gPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBlbHRzID0gbjsKLQl9Ci0KLSAgICAgIHQgPSAmZWx0c1tpZWVlLT5lbGVtZW50X2NvdW50XTsKLSAgICAgIGllZWUtPmVsZW1lbnRfY291bnQrKzsKLQotICAgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotICAgICAgdC0+ZmlsZV9vZmZzZXQgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0gICAgICB0LT5hYmZkID0gKGJmZCAqKSBOVUxMOwotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBnbyBvdmVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLwotCi0gICAgICBpZiAoKHNpemVfdCkgaWVlZV9wb3MgKGFiZmQpID4gc2l6ZW9mIChidWZmZXIpIC8gMikKLQl7Ci0JICAvKiBQYXN0IGhhbGYgd2F5LCByZXNlZWsgYW5kIHJlcHJpbWUgKi8KLQkgIGJ1ZmZlcl9vZmZzZXQgKz0gaWVlZV9wb3MgKGFiZmQpOwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBidWZmZXJfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMKLQkgICAgIHRvIHJlYWQgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KLQkgIGJmZF9yZWFkICgoUFRSKSBidWZmZXIsIDEsIHNpemVvZiAoYnVmZmVyKSwgYWJmZCk7Ci0JICBpZWVlLT5oLmZpcnN0X2J5dGUgPSBidWZmZXI7Ci0JICBpZWVlLT5oLmlucHV0X3AgPSBidWZmZXI7Ci0JfQotICAgIH0KLQotICBpZWVlLT5lbGVtZW50cyA9ICgoaWVlZV9hcl9vYnN0YWNrX3R5cGUgKikKLQkJICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAgICAgICBpZWVlLT5lbGVtZW50X2NvdW50ICogc2l6ZW9mICppZWVlLT5lbGVtZW50cykpOwotICBpZiAoaWVlZS0+ZWxlbWVudHMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbWVtY3B5IChpZWVlLT5lbGVtZW50cywgZWx0cywKLQkgIGllZWUtPmVsZW1lbnRfY291bnQgKiBzaXplb2YgKmllZWUtPmVsZW1lbnRzKTsKLSAgZnJlZSAoZWx0cyk7Ci0gIGVsdHMgPSBOVUxMOwotCi0gIC8qIE5vdyBzY2FuIHRoZSBhcmVhIGFnYWluLCBhbmQgcmVwbGFjZSBCQiBvZmZzZXRzIHdpdGggZmlsZSAqLwotICAvKiBvZmZzZXRzICovCi0KLSAgZm9yIChpID0gMjsgaSA8IGllZWUtPmVsZW1lbnRfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGllZWUtPmVsZW1lbnRzW2ldLmZpbGVfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIC8qIEZJWE1FOiBDaGVjayByZXR1cm4gdmFsdWUuICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBuZWVkcyB0bwotCSByZWFkIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCi0gICAgICBiZmRfcmVhZCAoKFBUUikgYnVmZmVyLCAxLCBzaXplb2YgKGJ1ZmZlciksIGFiZmQpOwotICAgICAgaWVlZS0+aC5maXJzdF9ieXRlID0gYnVmZmVyOwotICAgICAgaWVlZS0+aC5pbnB1dF9wID0gYnVmZmVyOwotCi0gICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwkvKiBEcm9wIEY4ICovCi0gICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwkvKiBEcm9wIDE0ICovCi0gICAgICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7CS8qIERyb3Agc2l6ZSBvZiBibG9jayAqLwotICAgICAgaWYgKG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKSAhPSAwKQotCXsKLQkgIC8qIFRoaXMgb2JqZWN0IGhhcyBiZWVuIGRlbGV0ZWQgKi8KLQkgIGllZWUtPmVsZW1lbnRzW2ldLmZpbGVfb2Zmc2V0ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWVlZS0+ZWxlbWVudHNbaV0uZmlsZV9vZmZzZXQgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JfQotICAgIH0KLQotICAvKiAgYWJmZC0+aGFzX2FybWFwID0gOyovCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChlbHRzICE9IE5VTEwpCi0gICAgZnJlZSAoZWx0cyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhYmZkLT50ZGF0YS5pZWVlX2RhdGEgPSAoaWVlZV9kYXRhX3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChpZWVlX2RhdGFfdHlwZSkpOwotICByZXR1cm4gYWJmZC0+dGRhdGEuaWVlZV9kYXRhID8gdHJ1ZSA6IGZhbHNlOwotfQotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWllZWVfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqcHJvY2Vzc29yOwotICB1bnNpZ25lZCBpbnQgcGFydDsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWU7Ci0gIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzMwMF07Ci0gIGllZWVfZGF0YV90eXBlICpzYXZlID0gSUVFRV9EQVRBIChhYmZkKTsKLQotICBhYmZkLT50ZGF0YS5pZWVlX2RhdGEgPSAwOwotICBpZWVlX21rb2JqZWN0IChhYmZkKTsKLQotICBpZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZmFpbDsKLSAgLyogUmVhZCB0aGUgZmlyc3QgZmV3IGJ5dGVzIGluIHRvIHNlZSBpZiBpdCBtYWtlcyBzZW5zZSAqLwotICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMgdG8gcmVhZAotICAgICB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLwotICBiZmRfcmVhZCAoKFBUUikgYnVmZmVyLCAxLCBzaXplb2YgKGJ1ZmZlciksIGFiZmQpOwotCi0gIGllZWUtPmguaW5wdXRfcCA9IGJ1ZmZlcjsKLSAgaWYgKHRoaXNfYnl0ZV9hbmRfbmV4dCAoJihpZWVlLT5oKSkgIT0gTW9kdWxlX0JlZ2lubmluZykKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXQ7Ci0KLSAgaWVlZS0+cmVhZF9zeW1ib2xzID0gZmFsc2U7Ci0gIGllZWUtPnJlYWRfZGF0YSA9IGZhbHNlOwotICBpZWVlLT5zZWN0aW9uX2NvdW50ID0gMDsKLSAgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21heF9pbmRleCA9IDA7Ci0gIGllZWUtPmV4dGVybmFsX3N5bWJvbF9taW5faW5kZXggPSBJRUVFX1BVQkxJQ19CQVNFOwotICBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWluX2luZGV4ID0gSUVFRV9SRUZFUkVOQ0VfQkFTRTsKLSAgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21heF9pbmRleCA9IDA7Ci0gIGllZWUtPmguYWJmZCA9IGFiZmQ7Ci0gIGllZWUtPnNlY3Rpb25fdGFibGUgPSBOVUxMOwotICBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemUgPSAwOwotCi0gIHByb2Nlc3NvciA9IGllZWUtPm1iLnByb2Nlc3NvciA9IHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotICBpZiAoc3RyY21wIChwcm9jZXNzb3IsICJMSUJSQVJZIikgPT0gMCkKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXQ7Ci0gIGllZWUtPm1iLm1vZHVsZV9uYW1lID0gcmVhZF9pZCAoJihpZWVlLT5oKSk7Ci0gIGlmIChhYmZkLT5maWxlbmFtZSA9PSAoQ09OU1QgY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFiZmQtPmZpbGVuYW1lID0gaWVlZS0+bWIubW9kdWxlX25hbWU7Ci0gICAgfQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4KLSAgICAgKi8KLSAgewotICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaDsKLSAgICBjaGFyIGZhbWlseVsxMF07Ci0KLSAgICAvKiBJRUVFIGRvZXMgbm90IHNwZWNpZnkgdGhlIGZvcm1hdCBvZiB0aGUgcHJvY2Vzc29yIGlkZW50aWZpY2F0b24KLSAgICAgICBzdHJpbmcsIHNvIHRoZSBjb21waWxlciBpcyBmcmVlIHRvIHB1dCBpbiBpdCB3aGF0ZXZlciBpdCB3YW50cy4KLSAgICAgICBXZSB0cnkgaGVyZSB0byByZWNvZ25pemUgZGlmZmVyZW50IHByb2Nlc3NvcnMgYmVsb25naW5nIHRvIHRoZQotICAgICAgIG02OGsgZmFtaWx5LiAgQ29kZSBmb3Igb3RoZXIgcHJvY2Vzc29ycyBjYW4gYmUgYWRkZWQgaGVyZS4gICovCi0gICAgaWYgKChwcm9jZXNzb3JbMF0gPT0gJzYnKSAmJiAocHJvY2Vzc29yWzFdID09ICc4JykpCi0gICAgICB7Ci0JaWYgKHByb2Nlc3NvclsyXSA9PSAnMycpCSAgICAvKiA2ODN4eCBpbnRlZ3JhdGVkIHByb2Nlc3NvcnMgKi8KLQkgIHsKLQkgICAgc3dpdGNoIChwcm9jZXNzb3JbM10pCi0JICAgICAgewotCSAgICAgIGNhc2UgJzAnOgkJCSAgICAvKiA2ODMwMiwgNjgzMDYsIDY4MzA3ICovCi0JICAgICAgY2FzZSAnMic6CQkJICAgIC8qIDY4MzIyLCA2ODMyOCAqLwotCSAgICAgIGNhc2UgJzUnOgkJCSAgICAvKiA2ODM1NiAqLwotCQlzdHJjcHkgKGZhbWlseSwgIjY4MDAwIik7ICAgLyogTUM2ODAwMC1iYXNlZCBjb250cm9sbGVycyAqLwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzMnOgkJCSAgICAvKiA2ODMzMCwgNjgzMzEsIDY4MzMyLCA2ODMzMywKLQkJCQkJICAgICAgIDY4MzM0LCA2ODMzNSwgNjgzMzYsIDY4MzM4ICovCi0JICAgICAgY2FzZSAnNic6CQkJICAgIC8qIDY4MzYwICovCi0JICAgICAgY2FzZSAnNyc6CQkJICAgIC8qIDY4Mzc2ICovCi0JCXN0cmNweSAoZmFtaWx5LCAiNjgzMzIiKTsgICAvKiBDUFUzMiBhbmQgQ1BVMzIrICovCi0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnNCc6Ci0JCWlmIChwcm9jZXNzb3JbNF0gPT0gJzknKSAgICAvKiA2ODM0OSAqLwotCQkgIHN0cmNweSAoZmFtaWx5LCAiNjgwMzAiKTsgLyogQ1BVMDMwICovCi0JCWVsc2UJCSAgICAgICAgICAgIC8qIDY4MzQwLCA2ODM0MSAqLwotCQkgIHN0cmNweSAoZmFtaWx5LCAiNjgzMzIiKTsgLyogQ1BVMzIgYW5kIENQVTMyKyAqLwotCQlicmVhazsKLQotCSAgICAgIGRlZmF1bHQ6CQkJICAgIC8qIERvZXMgbm90IGV4aXN0IHlldCAqLwotCQlzdHJjcHkgKGZhbWlseSwgIjY4MzMyIik7ICAgLyogR3Vlc3MgaXQgd2lsbCBiZSBDUFUzMiAqLwotCSAgICAgIH0KLQkgIH0KLQllbHNlIGlmICh0b3VwcGVyIChwcm9jZXNzb3JbM10pID09ICdGJykgICAvKiA2OEYzMzMgKi8KLQkgIHN0cmNweSAoZmFtaWx5LCAiNjgzMzIiKTsJICAgICAgICAgIC8qIENQVTMyICovCi0JZWxzZSBpZiAoKHRvdXBwZXIgKHByb2Nlc3NvclszXSkgPT0gJ0MnKSAgLyogRW1iZWRkZWQgY29udHJvbGxlcnMgKi8KLQkJICYmICgodG91cHBlciAocHJvY2Vzc29yWzJdKSA9PSAnRScpCi0JCSAgICAgfHwgKHRvdXBwZXIgKHByb2Nlc3NvclsyXSkgPT0gJ0gnKQotCQkgICAgIHx8ICh0b3VwcGVyIChwcm9jZXNzb3JbMl0pID09ICdMJykpKQotCSAgewotCSAgICBzdHJjcHkgKGZhbWlseSwgIjY4Iik7Ci0JICAgIHN0cm5jYXQgKGZhbWlseSwgcHJvY2Vzc29yICsgNCwgNyk7Ci0JICAgIGZhbWlseVs5XSA9ICdcMCc7Ci0JICB9Ci0JZWxzZQkJCQkgLyogIlJlZ3VsYXIiIHByb2Nlc3NvcnMgKi8KLQkgIHsKLQkgICAgc3RybmNweSAoZmFtaWx5LCBwcm9jZXNzb3IsIDkpOwotCSAgICBmYW1pbHlbOV0gPSAnXDAnOwotCSAgfQotICAgICAgfQotICAgIGVsc2UgaWYgKChzdHJuY21wIChwcm9jZXNzb3IsICJjcHUzMiIsIDUpID09IDApIC8qIENQVTMyIGFuZCBDUFUzMisgKi8KLQkgICAgIHx8IChzdHJuY21wIChwcm9jZXNzb3IsICJDUFUzMiIsIDUpID09IDApKQotICAgICAgc3RyY3B5IChmYW1pbHksICI2ODMzMiIpOwotICAgIGVsc2UKLSAgICAgIHsKLQlzdHJuY3B5IChmYW1pbHksIHByb2Nlc3NvciwgOSk7Ci0JZmFtaWx5WzldID0gJ1wwJzsKLSAgICAgIH0KLQotICAgIGFyY2ggPSBiZmRfc2Nhbl9hcmNoIChmYW1pbHkpOwotICAgIGlmIChhcmNoID09IDApCi0gICAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXQ7Ci0gICAgYWJmZC0+YXJjaF9pbmZvID0gYXJjaDsKLSAgfQotCi0gIGlmICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpICE9IChpbnQpIGllZWVfYWRkcmVzc19kZXNjcmlwdG9yX2VudW0pCi0gICAgewotICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotICBpZiAocGFyc2VfaW50ICgmKGllZWUtPmgpLCAmaWVlZS0+YWQubnVtYmVyX29mX2JpdHNfbWF1KSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfQotICBpZiAocGFyc2VfaW50ICgmKGllZWUtPmgpLCAmaWVlZS0+YWQubnVtYmVyX29mX21hdXNfaW5fYWRkcmVzcykgPT0gZmFsc2UpCi0gICAgewotICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAvKiBJZiB0aGVyZSBpcyBhIGJ5dGUgb3JkZXIgaW5mbywgdGFrZSBpdCAqLwotICBpZiAodGhpc19ieXRlICgmKGllZWUtPmgpKSA9PSAoaW50KSBpZWVlX3ZhcmlhYmxlX0xfZW51bSB8fAotICAgICAgdGhpc19ieXRlICgmKGllZWUtPmgpKSA9PSAoaW50KSBpZWVlX3ZhcmlhYmxlX01fZW51bSkKLSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCi0gIGZvciAocGFydCA9IDA7IHBhcnQgPCBOX1dfVkFSSUFCTEVTOyBwYXJ0KyspCi0gICAgewotICAgICAgYm9vbGVhbiBvazsKLSAgICAgIGlmIChyZWFkXzJieXRlcyAoJihpZWVlLT5oKSkgIT0gKGludCkgaWVlZV9hc3NpZ25fdmFsdWVfdG9fdmFyaWFibGVfZW51bSkKLQl7Ci0JICBnb3RvIGZhaWw7Ci0JfQotICAgICAgaWYgKHRoaXNfYnl0ZV9hbmRfbmV4dCAoJihpZWVlLT5oKSkgIT0gcGFydCkKLQl7Ci0JICBnb3RvIGZhaWw7Ci0JfQotCi0gICAgICBpZWVlLT53Lm9mZnNldFtwYXJ0XSA9IHBhcnNlX2kgKCYoaWVlZS0+aCksICZvayk7Ci0gICAgICBpZiAob2sgPT0gZmFsc2UpCi0JewotCSAgZ290byBmYWlsOwotCX0KLQotICAgIH0KLQotICBpZiAoaWVlZS0+dy5yLmV4dGVybmFsX3BhcnQgIT0gMCkKLSAgICBhYmZkLT5mbGFncyA9IEhBU19TWU1TOwotCi0gIC8qIEJ5IG5vdyB3ZSBrbm93IHRoYXQgdGhpcyBpcyBhIHJlYWwgSUVFRSBmaWxlLCB3ZSdyZSBnb2luZyB0byByZWFkCi0gICAgIHRoZSB3aG9sZSB0aGluZyBpbnRvIG1lbW9yeSBzbyB0aGF0IHdlIGNhbiBydW4gdXAgYW5kIGRvd24gaXQKLSAgICAgcXVpY2tseS4gIFdlIGNhbiB3b3JrIG91dCBob3cgYmlnIHRoZSBmaWxlIGlzIGZyb20gdGhlIHRyYWlsZXIKLSAgICAgcmVjb3JkICovCi0KLSAgSUVFRV9EQVRBIChhYmZkKS0+aC5maXJzdF9ieXRlID0KLSAgICAodW5zaWduZWQgY2hhciAqKSBiZmRfYWxsb2MgKGllZWUtPmguYWJmZCwgaWVlZS0+dy5yLm1lX3JlY29yZCArIDEpOwotICBpZiAoIUlFRUVfREFUQSAoYWJmZCktPmguZmlyc3RfYnl0ZSkKLSAgICBnb3RvIGZhaWw7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGZhaWw7Ci0gIC8qIEZJWE1FOiBDaGVjayByZXR1cm4gdmFsdWUuICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBuZWVkcyB0byByZWFkCi0gICAgIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCi0gIGJmZF9yZWFkICgoUFRSKSAoSUVFRV9EQVRBIChhYmZkKS0+aC5maXJzdF9ieXRlKSwgMSwKLQkgICAgaWVlZS0+dy5yLm1lX3JlY29yZCArIDEsIGFiZmQpOwotCi0gIGllZWVfc2x1cnBfc2VjdGlvbnMgKGFiZmQpOwotCi0gIGlmICghIGllZWVfc2x1cnBfZGVidWcgKGFiZmQpKQotICAgIGdvdG8gZmFpbDsKLQotICAvKiBQYXJzZSBzZWN0aW9uIGRhdGEgdG8gYWN0aXZhdGUgZmlsZSBhbmQgc2VjdGlvbiBmbGFncyBpbXBsaWVkIGJ5Ci0gICAgIHNlY3Rpb24gY29udGVudHMuICovCi0KLSAgaWYgKCEgaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpKQotICAgIGdvdG8gZmFpbDsKLSAgICAKLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci1nb3Rfd3JvbmdfZm9ybWF0OgotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLWZhaWw6Ci0gICh2b2lkKSBiZmRfcmVsZWFzZSAoYWJmZCwgaWVlZSk7Ci0gIGFiZmQtPnRkYXRhLmllZWVfZGF0YSA9IHNhdmU7Ci0gIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotfQotCi12b2lkCi1pZWVlX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotICBpZiAoc3ltYm9sLT5uYW1lWzBdID09ICcgJykKLSAgICByZXQtPm5hbWUgPSAiKiBlbXB0eSB0YWJsZSBlbnRyeSAiOwotICBpZiAoIXN5bWJvbC0+c2VjdGlvbikKLSAgICByZXQtPnR5cGUgPSAoc3ltYm9sLT5mbGFncyAmIEJTRl9MT0NBTCkgPyAnYScgOiAnQSc7Ci19Ci0KLXZvaWQKLWllZWVfcHJpbnRfc3ltYm9sIChpZ25vcmVfYWJmZCwgYWZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSNpZiAwCi0gICAgICBmcHJpbnRmIChmaWxlLCAiJTR4ICUyeCIsIGFvdXRfc3ltYm9sIChzeW1ib2wpLT5kZXNjICYgMHhmZmZmLAotCSAgICAgICBhb3V0X3N5bWJvbCAoc3ltYm9sKS0+b3RoZXIgJiAweGZmKTsKLSNlbmRpZgotICAgICAgQkZEX0ZBSUwgKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgICAgewotCWNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZSA9Ci0JICAoc3ltYm9sLT5zZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMCi0JICAgPyAiKmFicyIKLQkgICA6IHN5bWJvbC0+c2VjdGlvbi0+bmFtZSk7Ci0JaWYgKHN5bWJvbC0+bmFtZVswXSA9PSAnICcpCi0JICB7Ci0JICAgIGZwcmludGYgKGZpbGUsICIqIGVtcHR5IHRhYmxlIGVudHJ5ICIpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLQotCSAgICBmcHJpbnRmIChmaWxlLCAiICUtNXMgJTA0eCAlMDJ4ICVzIiwKLQkJICAgICBzZWN0aW9uX25hbWUsCi0JCSAgICAgKHVuc2lnbmVkKSBpZWVlX3N5bWJvbCAoc3ltYm9sKS0+aW5kZXgsCi0JCSAgICAgKHVuc2lnbmVkKSAwLAotCQkgICAgIHN5bWJvbC0+bmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1kb19vbmUgKGllZWUsIGN1cnJlbnRfbWFwLCBsb2NhdGlvbl9wdHIsIHMsIGl0ZXJhdGlvbnMpCi0gICAgIGllZWVfZGF0YV90eXBlICppZWVlOwotICAgICBpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKmN1cnJlbnRfbWFwOwotICAgICB1bnNpZ25lZCBjaGFyICpsb2NhdGlvbl9wdHI7Ci0gICAgIGFzZWN0aW9uICpzOwotICAgICBpbnQgaXRlcmF0aW9uczsKLXsKLSAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQotICAgIHsKLSAgICBjYXNlIGllZWVfbG9hZF9jb25zdGFudF9ieXRlc19lbnVtOgotICAgICAgewotCXVuc2lnbmVkIGludCBudW1iZXJfb2ZfbWF1czsKLQl1bnNpZ25lZCBpbnQgaTsKLQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCW51bWJlcl9vZl9tYXVzID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl9tYXVzOyBpKyspCi0JICB7Ci0JICAgIGxvY2F0aW9uX3B0cltjdXJyZW50X21hcC0+cGMrK10gPSB0aGlzX2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGllZWVfbG9hZF93aXRoX3JlbG9jYXRpb25fZW51bToKLSAgICAgIHsKLQlib29sZWFuIGxvb3AgPSB0cnVlOwotCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0Jd2hpbGUgKGxvb3ApCi0JICB7Ci0JICAgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSBpZWVlX3ZhcmlhYmxlX1JfZW51bToKLQotCSAgICAgIGNhc2UgaWVlZV9mdW5jdGlvbl9zaWduZWRfb3Blbl9iX2VudW06Ci0JICAgICAgY2FzZSBpZWVlX2Z1bmN0aW9uX3Vuc2lnbmVkX29wZW5fYl9lbnVtOgotCSAgICAgIGNhc2UgaWVlZV9mdW5jdGlvbl9laXRoZXJfb3Blbl9iX2VudW06Ci0JCXsKLQkJICB1bnNpZ25lZCBpbnQgZXh0cmEgPSA0OwotCQkgIGJvb2xlYW4gcGNyZWwgPSBmYWxzZTsKLQkJICBhc2VjdGlvbiAqc2VjdGlvbjsKLQkJICBpZWVlX3JlbG9jX3R5cGUgKnIgPQotCQkgIChpZWVlX3JlbG9jX3R5cGUgKikgYmZkX2FsbG9jIChpZWVlLT5oLmFiZmQsCi0JCQkJCQkgc2l6ZW9mIChpZWVlX3JlbG9jX3R5cGUpKTsKLQkJICBpZiAoIXIpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICAqKGN1cnJlbnRfbWFwLT5yZWxvY190YWlsX3B0cikgPSByOwotCQkgIGN1cnJlbnRfbWFwLT5yZWxvY190YWlsX3B0ciA9ICZyLT5uZXh0OwotCQkgIHItPm5leHQgPSAoaWVlZV9yZWxvY190eXBlICopIE5VTEw7Ci0JCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLS8qCQkJICAgIGFib3J0KCk7Ki8KLQkJICByLT5yZWxlbnQuc3ltX3B0cl9wdHIgPSAwOwotCQkgIHBhcnNlX2V4cHJlc3Npb24gKGllZWUsCi0JCQkJICAgICZyLT5yZWxlbnQuYWRkZW5kLAotCQkJCSAgICAmci0+c3ltYm9sLAotCQkJCSAgICAmcGNyZWwsICZleHRyYSwgJnNlY3Rpb24pOwotCQkgIHItPnJlbGVudC5hZGRyZXNzID0gY3VycmVudF9tYXAtPnBjOwotCQkgIHMtPmZsYWdzIHw9IFNFQ19SRUxPQzsKLQkJICBzLT5vd25lci0+ZmxhZ3MgfD0gSEFTX1JFTE9DOwotCQkgIHMtPnJlbG9jX2NvdW50Kys7Ci0JCSAgaWYgKHItPnJlbGVudC5zeW1fcHRyX3B0ciA9PSBOVUxMICYmIHNlY3Rpb24gIT0gTlVMTCkKLQkJICAgIHItPnJlbGVudC5zeW1fcHRyX3B0ciA9IHNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCi0JCSAgaWYgKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPT0gKGludCkgaWVlZV9jb21tYSkKLQkJICAgIHsKLQkJICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJICAgICAgLyogRmV0Y2ggbnVtYmVyIG9mIGJ5dGVzIHRvIHBhZCAqLwotCQkgICAgICBleHRyYSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIH07Ci0KLQkJICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0JCSAgICB7Ci0JCSAgICBjYXNlIGllZWVfZnVuY3Rpb25fc2lnbmVkX2Nsb3NlX2JfZW51bToKLQkJICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGllZWVfZnVuY3Rpb25fdW5zaWduZWRfY2xvc2VfYl9lbnVtOgotCQkgICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgaWVlZV9mdW5jdGlvbl9laXRoZXJfY2xvc2VfYl9lbnVtOgotCQkgICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIC8qIEJ1aWxkIGEgcmVsb2NhdGlvbiBlbnRyeSBmb3IgdGhpcyB0eXBlICovCi0JCSAgLyogSWYgcGMgcmVsIHRoZW4gc3RpY2sgLXZlIHBjIGludG8gaW5zdHJ1Y3Rpb24KLQkJICAgICBhbmQgdGFrZSBvdXQgb2YgcmVsb2MgLi4KLQotCQkgICAgIEkndmUgY2hhbmdlZCB0aGlzLiBJdCdzIGFsbCB0b28gY29tcGxpY2F0ZWQuIEkKLQkJICAgICBrZWVwIDAgaW4gdGhlIGluc3RydWN0aW9uIG5vdy4gICovCi0KLQkJICBzd2l0Y2ggKGV4dHJhKQotCQkgICAgewotCQkgICAgY2FzZSAwOgotCQkgICAgY2FzZSA0OgotCi0JCSAgICAgIGlmIChwY3JlbCA9PSB0cnVlKQotCQkJewotI2lmIEtFRVBNSU5VU1BDSU5JTlNUCi0JCQkgIGJmZF9wdXRfMzIgKGllZWUtPmguYWJmZCwgLWN1cnJlbnRfbWFwLT5wYywgbG9jYXRpb25fcHRyICsKLQkJCQkgICAgICBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmcmVsMzJfaG93dG87Ci0JCQkgIHItPnJlbGVudC5hZGRlbmQgLT0KLQkJCSAgICBjdXJyZW50X21hcC0+cGM7Ci0jZWxzZQotCQkJICBiZmRfcHV0XzMyIChpZWVlLT5oLmFiZmQsIDAsIGxvY2F0aW9uX3B0ciArCi0JCQkJICAgICAgY3VycmVudF9tYXAtPnBjKTsKLQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJnJlbDMyX2hvd3RvOwotI2VuZGlmCi0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYmZkX3B1dF8zMiAoaWVlZS0+aC5hYmZkLCAwLCBsb2NhdGlvbl9wdHIgKwotCQkJCSAgICAgIGN1cnJlbnRfbWFwLT5wYyk7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZhYnMzMl9ob3d0bzsKLQkJCX0KLQkJICAgICAgY3VycmVudF9tYXAtPnBjICs9IDQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAyOgotCQkgICAgICBpZiAocGNyZWwgPT0gdHJ1ZSkKLQkJCXsKLSNpZiBLRUVQTUlOVVNQQ0lOSU5TVAotCQkJICBiZmRfcHV0XzE2IChpZWVlLT5oLmFiZmQsIChpbnQpICgtY3VycmVudF9tYXAtPnBjKSwgbG9jYXRpb25fcHRyICsgY3VycmVudF9tYXAtPnBjKTsKLQkJCSAgci0+cmVsZW50LmFkZGVuZCAtPSBjdXJyZW50X21hcC0+cGM7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZyZWwxNl9ob3d0bzsKLSNlbHNlCi0KLQkJCSAgYmZkX3B1dF8xNiAoaWVlZS0+aC5hYmZkLCAwLCBsb2NhdGlvbl9wdHIgKyBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmcmVsMTZfaG93dG87Ci0jZW5kaWYKLQkJCX0KLQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGJmZF9wdXRfMTYgKGllZWUtPmguYWJmZCwgMCwgbG9jYXRpb25fcHRyICsgY3VycmVudF9tYXAtPnBjKTsKLQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJmFiczE2X2hvd3RvOwotCQkJfQotCQkgICAgICBjdXJyZW50X21hcC0+cGMgKz0gMjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDE6Ci0JCSAgICAgIGlmIChwY3JlbCA9PSB0cnVlKQotCQkJewotI2lmIEtFRVBNSU5VU1BDSU5JTlNUCi0JCQkgIGJmZF9wdXRfOCAoaWVlZS0+aC5hYmZkLCAoaW50KSAoLWN1cnJlbnRfbWFwLT5wYyksIGxvY2F0aW9uX3B0ciArIGN1cnJlbnRfbWFwLT5wYyk7Ci0JCQkgIHItPnJlbGVudC5hZGRlbmQgLT0gY3VycmVudF9tYXAtPnBjOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmcmVsOF9ob3d0bzsKLSNlbHNlCi0JCQkgIGJmZF9wdXRfOCAoaWVlZS0+aC5hYmZkLCAwLCBsb2NhdGlvbl9wdHIgKyBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmcmVsOF9ob3d0bzsKLSNlbmRpZgotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGJmZF9wdXRfOCAoaWVlZS0+aC5hYmZkLCAwLCBsb2NhdGlvbl9wdHIgKyBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmYWJzOF9ob3d0bzsKLQkJCX0KLQkJICAgICAgY3VycmVudF9tYXAtPnBjICs9IDE7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBkZWZhdWx0OgotCQkgICAgICBCRkRfRkFJTCAoKTsKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCXsKLQkJICBiZmRfdm1hIHRoaXNfc2l6ZTsKLQkJICBpZiAocGFyc2VfaW50ICgmKGllZWUtPmgpLCAmdGhpc19zaXplKSA9PSB0cnVlKQotCQkgICAgewotCQkgICAgICB1bnNpZ25lZCBpbnQgaTsKLQkJICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXNfc2l6ZTsgaSsrKQotCQkJewotCQkJICBsb2NhdGlvbl9wdHJbY3VycmVudF9tYXAtPnBjKytdID0gdGhpc19ieXRlICgmKGllZWUtPmgpKTsKLQkJCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxvb3AgPSBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIH0KLQotCSAgICAvKiBQcmV2ZW50IG1vcmUgdGhhbiB0aGUgZmlyc3QgbG9hZC1pdGVtIG9mIGFuIExSIHJlY29yZAotCSAgICAgICBmcm9tIGJlaW5nIHJlcGVhdGVkIChNUkkgY29udmVudGlvbikuICovCi0JICAgIGlmIChpdGVyYXRpb25zICE9IDEpCi0JICAgICAgbG9vcCA9IGZhbHNlOwotCSAgfQotICAgICAgfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgaW4gYWxsIHRoZSBzZWN0aW9uIGRhdGEgYW5kIHJlbG9jYXRpb24gc3R1ZmYgdG9vICovCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX2J5dGUgKmxvY2F0aW9uX3B0ciA9IChiZmRfYnl0ZSAqKSBOVUxMOwotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBzZWN0aW9uX251bWJlcjsKLQotICBpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKmN1cnJlbnRfbWFwID0gKGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqKSBOVUxMOwotICBhc2VjdGlvbiAqczsKLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgYXJlYSAqLwotICBpZiAoaWVlZS0+cmVhZF9kYXRhID09IHRydWUpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGllZWUtPnJlYWRfZGF0YSA9IHRydWU7Ci0gIGllZWVfc2VlayAoYWJmZCwgaWVlZS0+dy5yLmRhdGFfcGFydCk7Ci0KLSAgLyogQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciBhbGwgdGhlIHNlY3Rpb24gY29udGVudHMgKi8KLQotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWVlZV9wZXJfc2VjdGlvbl90eXBlICpwZXIgPSAoaWVlZV9wZXJfc2VjdGlvbl90eXBlICopIHMtPnVzZWRfYnlfYmZkOwotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0JY29udGludWU7Ci0gICAgICBwZXItPmRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChpZWVlLT5oLmFiZmQsIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoIXBlci0+ZGF0YSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAvKlNVUFBSRVNTIDY4Ki8KLSAgICAgIHBlci0+cmVsb2NfdGFpbF9wdHIgPQotCShpZWVlX3JlbG9jX3R5cGUgKiopICYgKHMtPnJlbG9jYXRpb24pOwotICAgIH0KLQotICB3aGlsZSAodHJ1ZSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0JewotCSAgLyogSUYgd2Ugc2VlIGFueXRoaW5nIHN0cmFuZ2UgdGhlbiBxdWl0ICovCi0JZGVmYXVsdDoKLQkgIHJldHVybiB0cnVlOwotCi0JY2FzZSBpZWVlX3NldF9jdXJyZW50X3NlY3Rpb25fZW51bToKLQkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICBzZWN0aW9uX251bWJlciA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkgIHMgPSBpZWVlLT5zZWN0aW9uX3RhYmxlW3NlY3Rpb25fbnVtYmVyXTsKLQkgIHMtPmZsYWdzIHw9IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUzsKLQkgIGN1cnJlbnRfbWFwID0gKGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqKSBzLT51c2VkX2J5X2JmZDsKLQkgIGxvY2F0aW9uX3B0ciA9IGN1cnJlbnRfbWFwLT5kYXRhIC0gcy0+dm1hOwotCSAgLyogVGhlIGRvY3VtZW50IEkgaGF2ZSBzYXlzIHRoYXQgTWljcm90ZWMncyBjb21waWxlcnMgcmVzZXQgKi8KLQkgIC8qIHRoaXMgYWZ0ZXIgYSBzZWMgc2VjdGlvbiwgZXZlbiB0aG91Z2ggdGhlIHN0YW5kYXJkIHNheXMgbm90ICovCi0JICAvKiB0by4gU08gLi4gKi8KLQkgIGN1cnJlbnRfbWFwLT5wYyA9IHMtPnZtYTsKLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX2UyX2ZpcnN0X2J5dGVfZW51bToKLQkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0JICAgIHsKLQkgICAgY2FzZSBpZWVlX3NldF9jdXJyZW50X3BjX2VudW0gJiAweGZmOgotCSAgICAgIHsKLQkJYmZkX3ZtYSB2YWx1ZTsKLQkJaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeW1ib2w7Ci0JCXVuc2lnbmVkIGludCBleHRyYTsKLQkJYm9vbGVhbiBwY3JlbDsKLQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwkvKiBUaG93IGF3YXkgc2VjdGlvbiAjKi8KLQkJcGFyc2VfZXhwcmVzc2lvbiAoaWVlZSwgJnZhbHVlLAotCQkJCSAgJnN5bWJvbCwKLQkJCQkgICZwY3JlbCwgJmV4dHJhLAotCQkJCSAgMCk7Ci0JCWN1cnJlbnRfbWFwLT5wYyA9IHZhbHVlOwotCQlCRkRfQVNTRVJUICgodW5zaWduZWQpICh2YWx1ZSAtIHMtPnZtYSkgPD0gcy0+X3Jhd19zaXplKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBpZWVlX3ZhbHVlX3N0YXJ0aW5nX2FkZHJlc3NfZW51bSAmIDB4ZmY6Ci0JICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgICBpZiAodGhpc19ieXRlICgmKGllZWUtPmgpKSA9PSBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9vcGVuX2JfZW51bSkKLQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgICBhYmZkLT5zdGFydF9hZGRyZXNzID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICAgIC8qIFdlJ3ZlIGdvdCB0byB0aGUgZW5kIG9mIHRoZSBkYXRhIG5vdyAtICovCi0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgQkZEX0ZBSUwgKCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfcmVwZWF0X2RhdGFfZW51bToKLQkgIHsKLQkgICAgLyogUmVwZWF0IHRoZSBmb2xsb3dpbmcgTEQgb3IgTFIgbiB0aW1lcyAtIHdlIGRvIHRoaXMgYnkKLQkJIHJlbWVtYmVyaW5nIHRoZSBzdHJlYW0gcG9pbnRlciBiZWZvcmUgcnVubmluZyBpdCBhbmQKLQkJIHJlc2V0dGluZyBpdCBhbmQgcnVubmluZyBpdCBuIHRpbWVzLiBXZSBzcGVjaWFsIGNhc2UKLQkJIHRoZSByZXBldGl0aW9uIG9mIGEgcmVwZWF0X2RhdGEvbG9hZF9jb25zdGFudAotCQkgKi8KLQotCSAgICB1bnNpZ25lZCBpbnQgaXRlcmF0aW9uczsKLQkgICAgdW5zaWduZWQgY2hhciAqc3RhcnQ7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIGl0ZXJhdGlvbnMgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgIHN0YXJ0ID0gaWVlZS0+aC5pbnB1dF9wOwotCSAgICBpZiAoc3RhcnRbMF0gPT0gKGludCkgaWVlZV9sb2FkX2NvbnN0YW50X2J5dGVzX2VudW0gJiYKLQkJc3RhcnRbMV0gPT0gMSkKLQkgICAgICB7Ci0JCXdoaWxlIChpdGVyYXRpb25zICE9IDApCi0JCSAgewotCQkgICAgbG9jYXRpb25fcHRyW2N1cnJlbnRfbWFwLT5wYysrXSA9IHN0YXJ0WzJdOwotCQkgICAgaXRlcmF0aW9ucy0tOwotCQkgIH0KLQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXdoaWxlIChpdGVyYXRpb25zICE9IDApCi0JCSAgewotCQkgICAgaWVlZS0+aC5pbnB1dF9wID0gc3RhcnQ7Ci0JCSAgICBpZiAoIWRvX29uZSAoaWVlZSwgY3VycmVudF9tYXAsIGxvY2F0aW9uX3B0ciwgcywKLQkJCQkgaXRlcmF0aW9ucykpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGl0ZXJhdGlvbnMtLTsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX2xvYWRfY29uc3RhbnRfYnl0ZXNfZW51bToKLQljYXNlIGllZWVfbG9hZF93aXRoX3JlbG9jYXRpb25fZW51bToKLQkgIHsKLQkgICAgaWYgKCFkb19vbmUgKGllZWUsIGN1cnJlbnRfbWFwLCBsb2NhdGlvbl9wdHIsIHMsIDEpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl9Ci0gICAgfQotfQotCi1ib29sZWFuCi1pZWVlX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIG5ld3NlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci17Ci0gIG5ld3NlY3QtPnVzZWRfYnlfYmZkID0gKFBUUikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaWVlZV9wZXJfc2VjdGlvbl90eXBlKSk7Ci0gIGlmICghbmV3c2VjdC0+dXNlZF9ieV9iZmQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZWVlX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+ZGF0YSA9IChiZmRfYnl0ZSAqKSBOVUxMOwotICBpZWVlX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+c2VjdGlvbiA9IG5ld3NlY3Q7Ci0gIHJldHVybiB0cnVlOwotfQotCi1sb25nCi1pZWVlX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotICAgIHJldHVybiAwOwotICBpZiAoISBpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotICByZXR1cm4gKGFzZWN0LT5yZWxvY19jb3VudCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWVlZV9wZXJfc2VjdGlvbl90eXBlICpwID0gKGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqKSBzZWN0aW9uLT51c2VkX2J5X2JmZDsKLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0gICAgcmV0dXJuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sCi0JCQkJCSAgICAgIG9mZnNldCwgY291bnQpOwotICBpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCk7Ci0gICh2b2lkKSBtZW1jcHkgKChQVFIpIGxvY2F0aW9uLCAoUFRSKSAocC0+ZGF0YSArIG9mZnNldCksICh1bnNpZ25lZCkgY291bnQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotbG9uZwotaWVlZV9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotLyogIGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqcCA9IChpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKikgc2VjdGlvbi0+dXNlZF9ieV9iZmQ7Ki8KLSAgaWVlZV9yZWxvY190eXBlICpzcmMgPSAoaWVlZV9yZWxvY190eXBlICopIChzZWN0aW9uLT5yZWxvY2F0aW9uKTsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotCi0gIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotICAgIHJldHVybiAwOwotCi0gIHdoaWxlIChzcmMgIT0gKGllZWVfcmVsb2NfdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdvcmsgb3V0IHdoaWNoIHN5bWJvbCB0byBhdHRhY2ggaXQgdGhpcyByZWxvYyB0byAqLwotICAgICAgc3dpdGNoIChzcmMtPnN5bWJvbC5sZXR0ZXIpCi0JewotCWNhc2UgJ0knOgotCSAgc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHIgPQotCSAgICBzeW1ib2xzICsgc3JjLT5zeW1ib2wuaW5kZXggKyBpZWVlLT5leHRlcm5hbF9zeW1ib2xfYmFzZV9vZmZzZXQ7Ci0JICBicmVhazsKLQljYXNlICdYJzoKLQkgIHNyYy0+cmVsZW50LnN5bV9wdHJfcHRyID0KLQkgICAgc3ltYm9scyArIHNyYy0+c3ltYm9sLmluZGV4ICsgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX2Jhc2Vfb2Zmc2V0OwotCSAgYnJlYWs7Ci0JY2FzZSAwOgotCSAgaWYgKHNyYy0+cmVsZW50LnN5bV9wdHJfcHRyICE9IE5VTEwpCi0JICAgIHNyYy0+cmVsZW50LnN5bV9wdHJfcHRyID0KLQkgICAgICBzcmMtPnJlbGVudC5zeW1fcHRyX3B0clswXS0+c2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCi0JICBCRkRfRkFJTCAoKTsKLQl9Ci0gICAgICAqcmVscHRyKysgPSAmc3JjLT5yZWxlbnQ7Ci0gICAgICBzcmMgPSBzcmMtPm5leHQ7Ci0gICAgfQotICAqcmVscHRyID0gKGFyZWxlbnQgKikgTlVMTDsKLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotfQotCi1zdGF0aWMgaW50Ci1jb21wIChhcCwgYnApCi0gICAgIENPTlNUIFBUUiBhcDsKLSAgICAgQ09OU1QgUFRSIGJwOwotewotICBhcmVsZW50ICphID0gKigoYXJlbGVudCAqKikgYXApOwotICBhcmVsZW50ICpiID0gKigoYXJlbGVudCAqKikgYnApOwotICByZXR1cm4gYS0+YWRkcmVzcyAtIGItPmFkZHJlc3M7Ci19Ci0KLS8qIFdyaXRlIHRoZSBzZWN0aW9uIGhlYWRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9zZWN0aW9uX3BhcnQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBhc2VjdGlvbiAqczsKLSAgaWVlZS0+dy5yLnNlY3Rpb25fcGFydCA9IGJmZF90ZWxsIChhYmZkKTsKLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGJmZF9pc19hYnNfc2VjdGlvbiAocykKLQkgICYmIChzLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpID09IDApCi0JewotCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3NlY3Rpb25fdHlwZV9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCSAgICAoYmZkX2J5dGUpIChzLT5pbmRleAotCQkJCQkJKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGltYWdlIGlzIGV4ZWN1dGFibGUsIHNvIG91dHB1dCBhYnNvbHV0ZSBzZWN0aW9ucyAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9BX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfU19lbnVtKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfQ19lbnVtKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAocy0+ZmxhZ3MgJiAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00pKQotCSAgICB7Ci0JICAgIGNhc2UgU0VDX0NPREUgfCBTRUNfTE9BRDoKLQkgICAgY2FzZSBTRUNfQ09ERToKLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfUF9lbnVtKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNFQ19EQVRBOgotCSAgICBkZWZhdWx0OgotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9EX2VudW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU0VDX1JPTToKLQkgICAgY2FzZSBTRUNfUk9NIHwgU0VDX0RBVEE6Ci0JICAgIGNhc2UgU0VDX1JPTSB8IFNFQ19MT0FEOgotCSAgICBjYXNlIFNFQ19ST00gfCBTRUNfREFUQSB8IFNFQ19MT0FEOgotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9SX2VudW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCi0JICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCBzLT5uYW1lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotI2lmIDAKLQkgIGllZWVfd3JpdGVfaW50IChhYmZkLCAwKTsJLyogUGFyZW50ICovCi0JICBpZWVlX3dyaXRlX2ludCAoYWJmZCwgMCk7CS8qIEJyb3RoZXIgKi8KLQkgIGllZWVfd3JpdGVfaW50IChhYmZkLCAwKTsJLyogQ29udGV4dCAqLwotI2VuZGlmCi0JICAvKiBBbGlnbm1lbnQgKi8KLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9zZWN0aW9uX2FsaWdubWVudF9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCSAgICAoYmZkX2J5dGUpIChzLT5pbmRleAotCQkJCQkJKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIDEgPDwgcy0+YWxpZ25tZW50X3Bvd2VyKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBTaXplICovCi0JICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV9zZWN0aW9uX3NpemVfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkgICAgKGJmZF9ieXRlKSAocy0+aW5kZXgKLQkJCQkJCSsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBzLT5fcmF3X3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0JICAgIHsKLQkgICAgICAvKiBSZWxvY2F0ZWFibGUgc2VjdGlvbnMgZG9uJ3QgaGF2ZSBhc2wgcmVjb3JkcyAqLwotCSAgICAgIC8qIFZtYSAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX3NlY3Rpb25fYmFzZV9hZGRyZXNzX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJCSgoYmZkX2J5dGUpCi0JCQkJCSAocy0+aW5kZXgKLQkJCQkJICArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHMtPmxtYSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGJvb2xlYW4KLWRvX3dpdGhfcmVsb2NzIChhYmZkLCBzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzOwotewotICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX21hdXNfaW5fYWRkcmVzcyA9Ci0gICAgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCkgLyBiZmRfYXJjaF9iaXRzX3Blcl9ieXRlIChhYmZkKTsKLSAgdW5zaWduZWQgaW50IHJlbG9jc190b19nbyA9IHMtPnJlbG9jX2NvdW50OwotICBiZmRfYnl0ZSAqc3RyZWFtID0gaWVlZV9wZXJfc2VjdGlvbiAocyktPmRhdGE7Ci0gIGFyZWxlbnQgKipwID0gcy0+b3JlbG9jYXRpb247Ci0gIGJmZF9zaXplX3R5cGUgY3VycmVudF9ieXRlX2luZGV4ID0gMDsKLQotICBxc29ydCAocy0+b3JlbG9jYXRpb24sCi0JIHJlbG9jc190b19nbywKLQkgc2l6ZW9mIChhcmVsZW50ICoqKSwKLQkgY29tcCk7Ci0KLSAgLyogT3V0cHV0IHRoZSBzZWN0aW9uIHByZWhlYWRlciAqLwotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfc2V0X2N1cnJlbnRfc2VjdGlvbl9lbnVtKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkgICAgKGJmZF9ieXRlKSAocy0+aW5kZXggKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKQotICAgICAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV9zZXRfY3VycmVudF9wY19lbnVtKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkgICAgKGJmZF9ieXRlKSAocy0+aW5kZXggKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApICE9IDAgJiYgcmVsb2NzX3RvX2dvID09IDApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHMtPmxtYSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwgMCwgcy0+c3ltYm9sLCAwLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChyZWxvY3NfdG9fZ28gPT0gMCkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGVyZSBhcmVuJ3QgYW55IHJlbG9jYXRpb25zIHRoZW4gb3V0cHV0IHRoZSBsb2FkIGNvbnN0YW50Ci0JIGJ5dGUgb3Bjb2RlIHJhdGhlciB0aGFuIHRoZSBsb2FkIHdpdGggcmVsb2NhdGlvbiBvcGNvZGUgKi8KLQotICAgICAgd2hpbGUgKGN1cnJlbnRfYnl0ZV9pbmRleCA8IHMtPl9yYXdfc2l6ZSkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIHJ1bjsKLQkgIHVuc2lnbmVkIGludCBNQVhSVU4gPSAxMjc7Ci0JICBydW4gPSBNQVhSVU47Ci0JICBpZiAocnVuID4gcy0+X3Jhd19zaXplIC0gY3VycmVudF9ieXRlX2luZGV4KQotCSAgICB7Ci0JICAgICAgcnVuID0gcy0+X3Jhd19zaXplIC0gY3VycmVudF9ieXRlX2luZGV4OwotCSAgICB9Ci0KLQkgIGlmIChydW4gIT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9sb2FkX2NvbnN0YW50X2J5dGVzX2VudW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgLyogT3V0cHV0IGEgc3RyZWFtIG9mIGJ5dGVzICovCi0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHJ1bikpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAoc3RyZWFtICsgY3VycmVudF9ieXRlX2luZGV4KSwKLQkJCSAgICAgMSwKLQkJCSAgICAgcnVuLAotCQkJICAgICBhYmZkKQotCQkgICE9IHJ1bikKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGN1cnJlbnRfYnl0ZV9pbmRleCArPSBydW47Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2xvYWRfd2l0aF9yZWxvY2F0aW9uX2VudW0pKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogT3V0cHV0IHRoZSBkYXRhIHN0cmVhbSBhcyB0aGUgbG9uZ2VzdCBzZXF1ZW5jZSBvZiBieXRlcwotCSBwb3NzaWJsZSwgYWxsb3dpbmcgZm9yIHRoZSBhIHJlYXNvbmFibGUgcGFja2V0IHNpemUgYW5kCi0JIHJlbG9jYXRpb24gc3R1ZmZzLiAgKi8KLQotICAgICAgaWYgKChQVFIpIHN0cmVhbSA9PSAoUFRSKSBOVUxMKQotCXsKLQkgIC8qIE91dHB1dHRpbmcgYSBzZWN0aW9uIHdpdGhvdXQgZGF0YSwgZmlsbCBpdCB1cCAqLwotCSAgc3RyZWFtID0gKHVuc2lnbmVkIGNoYXIgKikgKGJmZF9hbGxvYyAoYWJmZCwgcy0+X3Jhd19zaXplKSk7Ci0JICBpZiAoIXN0cmVhbSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgbWVtc2V0ICgoUFRSKSBzdHJlYW0sIDAsIChzaXplX3QpIHMtPl9yYXdfc2l6ZSk7Ci0JfQotICAgICAgd2hpbGUgKGN1cnJlbnRfYnl0ZV9pbmRleCA8IHMtPl9yYXdfc2l6ZSkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIHJ1bjsKLQkgIHVuc2lnbmVkIGludCBNQVhSVU4gPSAxMjc7Ci0JICBpZiAocmVsb2NzX3RvX2dvKQotCSAgICB7Ci0JICAgICAgcnVuID0gKCpwKS0+YWRkcmVzcyAtIGN1cnJlbnRfYnl0ZV9pbmRleDsKLQkgICAgICBpZiAocnVuID4gTUFYUlVOKQotCQlydW4gPSBNQVhSVU47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJ1biA9IE1BWFJVTjsKLQkgICAgfQotCSAgaWYgKHJ1biA+IHMtPl9yYXdfc2l6ZSAtIGN1cnJlbnRfYnl0ZV9pbmRleCkKLQkgICAgewotCSAgICAgIHJ1biA9IHMtPl9yYXdfc2l6ZSAtIGN1cnJlbnRfYnl0ZV9pbmRleDsKLQkgICAgfQotCi0JICBpZiAocnVuICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBPdXRwdXQgYSBzdHJlYW0gb2YgYnl0ZXMgKi8KLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcnVuKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIChzdHJlYW0gKyBjdXJyZW50X2J5dGVfaW5kZXgpLAotCQkJICAgICAxLAotCQkJICAgICBydW4sCi0JCQkgICAgIGFiZmQpCi0JCSAgIT0gcnVuKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgY3VycmVudF9ieXRlX2luZGV4ICs9IHJ1bjsKLQkgICAgfQotCSAgLyogT3V0cHV0IGFueSByZWxvY2F0aW9ucyBoZXJlICovCi0JICBpZiAocmVsb2NzX3RvX2dvICYmICgqcCkgJiYgKCpwKS0+YWRkcmVzcyA9PSBjdXJyZW50X2J5dGVfaW5kZXgpCi0JICAgIHsKLQkgICAgICB3aGlsZSAocmVsb2NzX3RvX2dvCi0JCSAgICAgJiYgKCpwKSAmJiAoKnApLT5hZGRyZXNzID09IGN1cnJlbnRfYnl0ZV9pbmRleCkKLQkJewotCQkgIGFyZWxlbnQgKnIgPSAqcDsKLQkJICBiZmRfc2lnbmVkX3ZtYSBvdjsKLQotI2lmIDAKLQkJICBpZiAoci0+aG93dG8tPnBjX3JlbGF0aXZlKQotCQkgICAgewotCQkgICAgICByLT5hZGRlbmQgKz0gY3VycmVudF9ieXRlX2luZGV4OwotCQkgICAgfQotI2VuZGlmCi0KLQkJICBzd2l0Y2ggKHItPmhvd3RvLT5zaXplKQotCQkgICAgewotCQkgICAgY2FzZSAyOgotCi0JCSAgICAgIG92ID0gYmZkX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgIHN0cmVhbSArIGN1cnJlbnRfYnl0ZV9pbmRleCk7Ci0JCSAgICAgIGN1cnJlbnRfYnl0ZV9pbmRleCArPSA0OwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMToKLQkJICAgICAgb3YgPSBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwKLQkJCQkJICAgICAgc3RyZWFtICsgY3VycmVudF9ieXRlX2luZGV4KTsKLQkJICAgICAgY3VycmVudF9ieXRlX2luZGV4ICs9IDI7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAwOgotCQkgICAgICBvdiA9IGJmZF9nZXRfc2lnbmVkXzggKGFiZmQsCi0JCQkJCSAgICAgc3RyZWFtICsgY3VycmVudF9ieXRlX2luZGV4KTsKLQkJICAgICAgY3VycmVudF9ieXRlX2luZGV4Kys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgb3YgPSAwOwotCQkgICAgICBCRkRfRkFJTCAoKTsKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCi0JCSAgb3YgJj0gci0+aG93dG8tPnNyY19tYXNrOwotCi0JCSAgaWYgKHItPmhvd3RvLT5wY19yZWxhdGl2ZQotCQkgICAgICAmJiAhIHItPmhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JCSAgICBvdiArPSByLT5hZGRyZXNzOwotCi0JCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCQkgaWVlZV9mdW5jdGlvbl9laXRoZXJfb3Blbl9iX2VudW0pKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0vKgkJICBhYm9ydCgpOyovCi0KLQkJICBpZiAoci0+c3ltX3B0cl9wdHIgIT0gKGFzeW1ib2wgKiopIE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIGllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwgci0+YWRkZW5kICsgb3YsCi0JCQkJCQkgICAqKHItPnN5bV9wdHJfcHRyKSwKLQkJCQkJCSAgIHItPmhvd3RvLT5wY19yZWxhdGl2ZSwKLQkJCQkJCSAgIHMtPmluZGV4KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIGllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwgci0+YWRkZW5kICsgb3YsCi0JCQkJCQkgICAoYXN5bWJvbCAqKSBOVUxMLAotCQkJCQkJICAgci0+aG93dG8tPnBjX3JlbGF0aXZlLAotCQkJCQkJICAgcy0+aW5kZXgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCi0JCSAgaWYgKG51bWJlcl9vZl9tYXVzX2luX2FkZHJlc3MKLQkJICAgICAgIT0gYmZkX2dldF9yZWxvY19zaXplIChyLT5ob3d0bykpCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIGllZWVfd3JpdGVfaW50IChhYmZkLAotCQkJCQkgICAgYmZkX2dldF9yZWxvY19zaXplIChyLT5ob3d0bykpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkJIGllZWVfZnVuY3Rpb25fZWl0aGVyX2Nsb3NlX2JfZW51bSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICByZWxvY3NfdG9fZ28tLTsKLQkJICBwKys7Ci0JCX0KLQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSWYgdGhlcmUgYXJlIG5vIHJlbG9jYXRpb25zIGluIHRoZSBvdXRwdXQgc2VjdGlvbiB0aGVuIHdlIGNhbiBiZQotICAgY2xldmVyIGFib3V0IGhvdyB3ZSB3cml0ZS4gIFdlIGJsb2NrIGl0ZW1zIHVwIGludG8gYSBtYXggb2YgMTI3Ci0gICBieXRlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kb19hc19yZXBlYXQgKGFiZmQsIHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGlmIChzLT5fcmF3X3NpemUpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3NldF9jdXJyZW50X3NlY3Rpb25fZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCShiZmRfYnl0ZSkgKHMtPmluZGV4Ci0JCQkJCSAgICArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9zZXRfY3VycmVudF9wY19lbnVtID4+IDgpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9zZXRfY3VycmVudF9wY19lbnVtICYgMHhmZikKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCShiZmRfYnl0ZSkgKHMtPmluZGV4Ci0JCQkJCSAgICArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpCi0JICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBzLT5sbWEpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9yZXBlYXRfZGF0YV9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcy0+X3Jhd19zaXplKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfbG9hZF9jb25zdGFudF9ieXRlc19lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDEpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWRvX3dpdGhvdXRfcmVsb2NzIChhYmZkLCBzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzOwotewotICBiZmRfYnl0ZSAqc3RyZWFtID0gaWVlZV9wZXJfc2VjdGlvbiAocyktPmRhdGE7Ci0KLSAgaWYgKHN0cmVhbSA9PSAwIHx8ICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkpCi0gICAgewotICAgICAgaWYgKCEgZG9fYXNfcmVwZWF0IChhYmZkLCBzKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+X3Jhd19zaXplOyBpKyspCi0JewotCSAgaWYgKHN0cmVhbVtpXSAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZG9fd2l0aF9yZWxvY3MgKGFiZmQsIHMpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoISBkb19hc19yZXBlYXQgKGFiZmQsIHMpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHJfc3RhcnQ7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0cjsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyX2VuZDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICppbnB1dF9wdHJfc3RhcnQ7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqaW5wdXRfcHRyOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKmlucHV0X3B0cl9lbmQ7Ci1zdGF0aWMgYmZkICppbnB1dF9iZmQ7Ci1zdGF0aWMgYmZkICpvdXRwdXRfYmZkOwotc3RhdGljIGludCBvdXRwdXRfYnVmZmVyOwotCi1zdGF0aWMgdm9pZAotZmlsbCAoKQotewotICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMgdG8gcmVhZAotICAgICB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLwotICBiZmRfcmVhZCAoKFBUUikgaW5wdXRfcHRyX3N0YXJ0LCAxLCBpbnB1dF9wdHJfZW5kIC0gaW5wdXRfcHRyX3N0YXJ0LCBpbnB1dF9iZmQpOwotICBpbnB1dF9wdHIgPSBpbnB1dF9wdHJfc3RhcnQ7Ci19Ci1zdGF0aWMgdm9pZAotZmx1c2ggKCkKLXsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgKG91dHB1dF9wdHJfc3RhcnQpLCAxLCBvdXRwdXRfcHRyIC0gb3V0cHV0X3B0cl9zdGFydCwKLQkJIG91dHB1dF9iZmQpCi0gICAgICAhPSAoYmZkX3NpemVfdHlwZSkgKG91dHB1dF9wdHIgLSBvdXRwdXRfcHRyX3N0YXJ0KSkKLSAgICBhYm9ydCAoKTsKLSAgb3V0cHV0X3B0ciA9IG91dHB1dF9wdHJfc3RhcnQ7Ci0gIG91dHB1dF9idWZmZXIrKzsKLX0KLQotI2RlZmluZSBUSElTKCkgKCAqaW5wdXRfcHRyICkKLSNkZWZpbmUgTkVYVCgpIHsgaW5wdXRfcHRyKys7IGlmIChpbnB1dF9wdHIgPT0gaW5wdXRfcHRyX2VuZCkgZmlsbCgpOyB9Ci0jZGVmaW5lIE9VVCh4KSB7ICpvdXRwdXRfcHRyKysgPSAoeCk7IGlmKG91dHB1dF9wdHIgPT0gb3V0cHV0X3B0cl9lbmQpICBmbHVzaCgpOyB9Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9pbnQgKHZhbHVlKQotICAgICBpbnQgdmFsdWU7Ci17Ci0gIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDEyNykKLSAgICB7Ci0gICAgICBPVVQgKHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotICAgICAgLyogSG93IG1hbnkgc2lnbmlmaWNhbnQgYnl0ZXMgPyAqLwotICAgICAgLyogRklYTUUgRk9SIExPTkdFUiBJTlRTICovCi0gICAgICBpZiAodmFsdWUgJiAweGZmMDAwMDAwKQotCXsKLQkgIGxlbmd0aCA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAodmFsdWUgJiAweDAwZmYwMDAwKQotCXsKLQkgIGxlbmd0aCA9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAodmFsdWUgJiAweDAwMDBmZjAwKQotCXsKLQkgIGxlbmd0aCA9IDI7Ci0JfQotICAgICAgZWxzZQotCWxlbmd0aCA9IDE7Ci0KLSAgICAgIE9VVCAoKGludCkgaWVlZV9udW1iZXJfcmVwZWF0X3N0YXJ0X2VudW0gKyBsZW5ndGgpOwotICAgICAgc3dpdGNoIChsZW5ndGgpCi0JewotCWNhc2UgNDoKLQkgIE9VVCAodmFsdWUgPj4gMjQpOwotCWNhc2UgMzoKLQkgIE9VVCAodmFsdWUgPj4gMTYpOwotCWNhc2UgMjoKLQkgIE9VVCAodmFsdWUgPj4gOCk7Ci0JY2FzZSAxOgotCSAgT1VUICh2YWx1ZSk7Ci0JfQotCi0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotY29weV9pZCAoKQotewotICBpbnQgbGVuZ3RoID0gVEhJUyAoKTsKLSAgY2hhciBjaDsKLSAgT1VUIChsZW5ndGgpOwotICBORVhUICgpOwotICB3aGlsZSAobGVuZ3RoLS0pCi0gICAgewotICAgICAgY2ggPSBUSElTICgpOwotICAgICAgT1VUIChjaCk7Ci0gICAgICBORVhUICgpOwotICAgIH0KLX0KLQotI2RlZmluZSBWQVIoeCkgKCh4IHwgMHg4MCkpCi1zdGF0aWMgdm9pZAotY29weV9leHByZXNzaW9uICgpCi17Ci0gIGludCBzdGFja1sxMF07Ci0gIGludCAqdG9zID0gc3RhY2s7Ci0gIGludCB2YWx1ZSA9IDA7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIHN3aXRjaCAoVEhJUyAoKSkKLQl7Ci0JY2FzZSAweDg0OgotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICAqdG9zKysgPSB2YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMHg4MzoKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICAqdG9zKysgPSB2YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMHg4MjoKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgICp0b3MrKyA9IHZhbHVlOwotCSAgYnJlYWs7Ci0JY2FzZSAweDgxOgotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICAqdG9zKysgPSB2YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMHg4MDoKLQkgIE5FWFQgKCk7Ci0JICAqdG9zKysgPSAwOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGlmIChUSElTICgpID4gMHg4NCkKLQkgICAgewotCSAgICAgIC8qIE5vdCBhIG51bWJlciwganVzdCBidWcgb3V0IHdpdGggdGhlIGFuc3dlciAqLwotCSAgICAgIHdyaXRlX2ludCAoKigtLXRvcykpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgKnRvcysrID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9IDA7Ci0JICBicmVhazsKLQljYXNlIDB4YTU6Ci0JICAvKiBQTFVTIGFueXRoaW5nICovCi0JICB7Ci0JICAgIGludCB2YWx1ZSA9ICooLS10b3MpOwotCSAgICB2YWx1ZSArPSAqKC0tdG9zKTsKLQkgICAgKnRvcysrID0gdmFsdWU7Ci0JICAgIE5FWFQgKCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIFZBUiAoJ1InKToKLQkgIHsKLQkgICAgaW50IHNlY3Rpb25fbnVtYmVyOwotCSAgICBpZWVlX2RhdGFfdHlwZSAqaWVlZTsKLQkgICAgYXNlY3Rpb24gKnM7Ci0JICAgIE5FWFQgKCk7Ci0JICAgIHNlY3Rpb25fbnVtYmVyID0gVEhJUyAoKTsKLQotCSAgICBORVhUICgpOwotCSAgICBpZWVlID0gSUVFRV9EQVRBIChpbnB1dF9iZmQpOwotCSAgICBzID0gaWVlZS0+c2VjdGlvbl90YWJsZVtzZWN0aW9uX251bWJlcl07Ci0JICAgIGlmIChzLT5vdXRwdXRfc2VjdGlvbikKLQkgICAgICB7Ci0JCXZhbHVlID0gcy0+b3V0cHV0X3NlY3Rpb24tPmxtYTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXZhbHVlID0gMDsKLQkgICAgICB9Ci0JICAgIHZhbHVlICs9IHMtPm91dHB1dF9vZmZzZXQ7Ci0JICAgICp0b3MrKyA9IHZhbHVlOwotCSAgICB2YWx1ZSA9IDA7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIDB4OTA6Ci0JICB7Ci0JICAgIE5FWFQgKCk7Ci0JICAgIHdyaXRlX2ludCAoKigtLXRvcykpOwotCSAgICBPVVQgKDB4OTApOwotCSAgICByZXR1cm47Ci0KLQkgIH0KLQl9Ci0gICAgfQotCi19Ci0KLS8qIERyb3AgdGhlIGludCBpbiB0aGUgYnVmZmVyLCBhbmQgY29weSBhIG51bGwgaW50byB0aGUgZ2FwLCB3aGljaCB3ZQotICAgd2lsbCBvdmVyd3JpdGUgbGF0ZXIgKi8KLQotc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKnB0cnA7Ci0gIGludCBidWZmZXI7Ci19OwotCi1zdGF0aWMgdm9pZAotZmlsbF9pbnQgKGJ1ZikKLSAgICAgc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0ICpidWY7Ci17Ci0gIGlmIChidWYtPmJ1ZmZlciA9PSBvdXRwdXRfYnVmZmVyKQotICAgIHsKLSAgICAgIC8qIFN0aWxsIGEgY2hhbmNlIHRvIG91dHB1dCB0aGUgc2l6ZSAqLwotICAgICAgaW50IHZhbHVlID0gb3V0cHV0X3B0ciAtIGJ1Zi0+cHRycCArIDM7Ci0gICAgICBidWYtPnB0cnBbMF0gPSB2YWx1ZSA+PiAyNDsKLSAgICAgIGJ1Zi0+cHRycFsxXSA9IHZhbHVlID4+IDE2OwotICAgICAgYnVmLT5wdHJwWzJdID0gdmFsdWUgPj4gODsKLSAgICAgIGJ1Zi0+cHRycFszXSA9IHZhbHVlID4+IDA7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZHJvcF9pbnQgKGJ1ZikKLSAgICAgc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0ICpidWY7Ci17Ci0gIGludCB0eXBlID0gVEhJUyAoKTsKLSAgaW50IGNoOwotICBpZiAodHlwZSA8PSAweDg0KQotICAgIHsKLSAgICAgIE5FWFQgKCk7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgMHg4NDoKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgzOgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQljYXNlIDB4ODI6Ci0JICBjaCA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCWNhc2UgMHg4MToKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgwOgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgT1VUICgweDg0KTsKLSAgYnVmLT5wdHJwID0gb3V0cHV0X3B0cjsKLSAgYnVmLT5idWZmZXIgPSBvdXRwdXRfYnVmZmVyOwotICBPVVQgKDApOwotICBPVVQgKDApOwotICBPVVQgKDApOwotICBPVVQgKDApOwotfQotCi1zdGF0aWMgdm9pZAotY29weV9pbnQgKCkKLXsKLSAgaW50IHR5cGUgPSBUSElTICgpOwotICBpbnQgY2g7Ci0gIGlmICh0eXBlIDw9IDB4ODQpCi0gICAgewotICAgICAgT1VUICh0eXBlKTsKLSAgICAgIE5FWFQgKCk7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgMHg4NDoKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICBPVVQgKGNoKTsKLQljYXNlIDB4ODM6Ci0JICBjaCA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgT1VUIChjaCk7Ci0JY2FzZSAweDgyOgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIE9VVCAoY2gpOwotCWNhc2UgMHg4MToKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICBPVVQgKGNoKTsKLQljYXNlIDB4ODA6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0jZGVmaW5lIElEIGNvcHlfaWQoKQotI2RlZmluZSBJTlQgY29weV9pbnQoKQotI2RlZmluZSBFWFAgY29weV9leHByZXNzaW9uKCkKLXN0YXRpYyB2b2lkIGNvcHlfdGlsbF9lbmQgKCk7Ci0jZGVmaW5lIElOVG4ocSkgY29weV9pbnQoKQotI2RlZmluZSBFWFBuKHEpIGNvcHlfZXhwcmVzc2lvbigpCi0KLXN0YXRpYyB2b2lkCi1mMV9yZWNvcmQgKCkKLXsKLSAgaW50IGNoOwotICAvKiBBVE4gcmVjb3JkICovCi0gIE5FWFQgKCk7Ci0gIGNoID0gVEhJUyAoKTsKLSAgc3dpdGNoIChjaCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIE9VVCAoMHhmMSk7Ci0gICAgICBPVVQgKGNoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhjOToKLSAgICAgIE5FWFQgKCk7Ci0gICAgICBPVVQgKDB4ZjEpOwotICAgICAgT1VUICgweGM5KTsKLSAgICAgIElOVDsKLSAgICAgIElOVDsKLSAgICAgIGNoID0gVEhJUyAoKTsKLSAgICAgIHN3aXRjaCAoY2gpCi0JewotCWNhc2UgMHgxNjoKLQkgIE5FWFQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4MDE6Ci0JICBORVhUICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDAwOgotCSAgTkVYVCAoKTsKLQkgIElOVDsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMzoKLQkgIE5FWFQgKCk7Ci0JICBJTlQ7Ci0JICBicmVhazsKLQljYXNlIDB4MTM6Ci0JICBFWFBuIChpbnN0cnVjdGlvbiBhZGRyZXNzKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4ZDg6Ci0gICAgICAvKiBFWHRlcm5hbCByZWYgKi8KLSAgICAgIE5FWFQgKCk7Ci0gICAgICBPVVQgKDB4ZjEpOwotICAgICAgT1VUICgweGQ4KTsKLSAgICAgIEVYUDsKLSAgICAgIEVYUDsKLSAgICAgIEVYUDsKLSAgICAgIEVYUDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhjZToKLSAgICAgIE5FWFQgKCk7Ci0gICAgICBPVVQgKDB4ZjEpOwotICAgICAgT1VUICgweGNlKTsKLSAgICAgIElOVDsKLSAgICAgIElOVDsKLSAgICAgIGNoID0gVEhJUyAoKTsKLSAgICAgIElOVDsKLSAgICAgIHN3aXRjaCAoY2gpCi0JewotCWNhc2UgMHgwMToKLQkgIElOVDsKLQkgIElOVDsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMjoKLQkgIElOVDsKLQkgIGJyZWFrOwotCWNhc2UgMHgwNDoKLQkgIEVYUG4gKGV4dGVybmFsIGZ1bmN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgwNToKLQkgIGJyZWFrOwotCWNhc2UgMHgwNzoKLQkgIElOVG4gKGxpbmUgbnVtYmVyKTsKLQkgIElOVDsKLQljYXNlIDB4MDg6Ci0JICBicmVhazsKLQljYXNlIDB4MGE6Ci0JICBJTlRuIChsb2NrZWQgcmVnaXN0ZXIpOwotCSAgSU5UOwotCSAgYnJlYWs7Ci0JY2FzZSAweDNmOgotCSAgY29weV90aWxsX2VuZCAoKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgzZToKLQkgIGNvcHlfdGlsbF9lbmQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4NDA6Ci0JICBjb3B5X3RpbGxfZW5kICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDQxOgotCSAgSUQ7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkCi1mMF9yZWNvcmQgKCkKLXsKLSAgLyogQXR0cmlidXRlIHJlY29yZCAqLwotICBORVhUICgpOwotICBPVVQgKDB4ZjApOwotICBJTlRuIChTeW1ib2wgbmFtZSk7Ci0gIElEOwotfQotCi1zdGF0aWMgdm9pZAotY29weV90aWxsX2VuZCAoKQotewotICBpbnQgY2ggPSBUSElTICgpOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICB3aGlsZSAoY2ggPD0gMHg4MCkKLQl7Ci0JICBPVVQgKGNoKTsKLQkgIE5FWFQgKCk7Ci0JICBjaCA9IFRISVMgKCk7Ci0JfQotICAgICAgc3dpdGNoIChjaCkKLQl7Ci0JY2FzZSAweDg0OgotCSAgT1VUIChUSElTICgpKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgzOgotCSAgT1VUIChUSElTICgpKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgyOgotCSAgT1VUIChUSElTICgpKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgxOgotCSAgT1VUIChUSElTICgpKTsKLQkgIE5FWFQgKCk7Ci0JICBPVVQgKFRISVMgKCkpOwotCSAgTkVYVCAoKTsKLQotCSAgY2ggPSBUSElTICgpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkCi1mMl9yZWNvcmQgKCkKLXsKLSAgTkVYVCAoKTsKLSAgT1VUICgweGYyKTsKLSAgSU5UOwotICBORVhUICgpOwotICBPVVQgKDB4Y2UpOwotICBJTlQ7Ci0gIGNvcHlfdGlsbF9lbmQgKCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgYmxvY2sgKCk7Ci1zdGF0aWMgdm9pZAotZjhfcmVjb3JkICgpCi17Ci0gIGludCBjaDsKLSAgTkVYVCAoKTsKLSAgY2ggPSBUSElTICgpOwotICBzd2l0Y2ggKGNoKQotICAgIHsKLSAgICBjYXNlIDB4MDE6Ci0gICAgY2FzZSAweDAyOgotICAgIGNhc2UgMHgwMzoKLSAgICAgIC8qIFVuaXF1ZSB0eXBlZGVmcyBmb3IgbW9kdWxlICovCi0gICAgICAvKiBHTG9iYWwgdHlwZWRlZnMgICovCi0gICAgICAvKiBIaWdoIGxldmVsIG1vZHVsZSBzY29wZSBiZWdpbm5pbmcgKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoY2gpOwotCWRyb3BfaW50ICgmb2IpOwotCUlEOwotCi0JYmxvY2sgKCk7Ci0KLQlORVhUICgpOwotCWZpbGxfaW50ICgmb2IpOwotCU9VVCAoMHhmOSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MDQ6Ci0gICAgICAvKiBHbG9iYWwgZnVuY3Rpb24gKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoMHgwNCk7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0JSU5UbiAoc3RhY2sgc2l6ZSk7Ci0JSU5UbiAocmV0IHZhbCk7Ci0JRVhQbiAob2Zmc2V0KTsKLQotCWJsb2NrICgpOwotCi0JTkVYVCAoKTsKLQlPVVQgKDB4ZjkpOwotCUVYUG4gKHNpemUgb2YgYmxvY2spOwotCWZpbGxfaW50ICgmb2IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4MDU6Ci0gICAgICAvKiBGaWxlIG5hbWUgZm9yIHNvdXJjZSBsaW5lIG51bWJlcnMgKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoMHgwNSk7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0JSU5UbiAoeWVhcik7Ci0JSU5UbiAobW9udGgpOwotCUlOVG4gKGRheSk7Ci0JSU5UbiAoaG91cik7Ci0JSU5UbiAobW9udXRlKTsKLQlJTlRuIChzZWNvbmQpOwotCWJsb2NrICgpOwotCU5FWFQgKCk7Ci0JT1VUICgweGY5KTsKLQlmaWxsX2ludCAoJm9iKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAweDA2OgotICAgICAgLyogTG9jYWwgZnVuY3Rpb24gKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoMHgwNik7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0JSU5UbiAoc3RhY2sgc2l6ZSk7Ci0JSU5UbiAodHlwZSByZXR1cm4pOwotCUVYUG4gKG9mZnNldCk7Ci0JYmxvY2sgKCk7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjkpOwotCUVYUG4gKHNpemUpOwotCWZpbGxfaW50ICgmb2IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4MGE6Ci0gICAgICAvKiBBc3NlbWJsZXIgbW9kdWxlIHNjb3BlIGJlZ2lubmluZyAtKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0KLQlORVhUICgpOwotCU9VVCAoMHhmOCk7Ci0JT1VUICgweDBhKTsKLQlkcm9wX2ludCAoJm9iKTsKLQlJRDsKLQlJRDsKLQlJTlQ7Ci0JSUQ7Ci0JSU5UOwotCUlOVDsKLQlJTlQ7Ci0JSU5UOwotCUlOVDsKLQlJTlQ7Ci0KLQlibG9jayAoKTsKLQotCU5FWFQgKCk7Ci0JT1VUICgweGY5KTsKLQlmaWxsX2ludCAoJm9iKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgwYjoKLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoMHgwYik7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0JSU5UOwotCUlOVG4gKHNlY3Rpb24gaW5kZXgpOwotCUVYUG4gKG9mZnNldCk7Ci0JSU5UbiAoc3R1ZmYpOwotCi0JYmxvY2sgKCk7Ci0KLQlPVVQgKDB4ZjkpOwotCU5FWFQgKCk7Ci0JRVhQbiAoU2l6ZSBpbiBNYXVzKTsKLQlmaWxsX2ludCAoJm9iKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWUyX3JlY29yZCAoKQotewotICBPVVQgKDB4ZTIpOwotICBORVhUICgpOwotICBPVVQgKDB4Y2UpOwotICBORVhUICgpOwotICBJTlQ7Ci0gIEVYUDsKLX0KLQotc3RhdGljIHZvaWQKLWJsb2NrICgpCi17Ci0gIGludCBjaDsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY2ggPSBUSElTICgpOwotICAgICAgc3dpdGNoIChjaCkKLQl7Ci0JY2FzZSAweGUxOgotCWNhc2UgMHhlNToKLQkgIHJldHVybjsKLQljYXNlIDB4Zjk6Ci0JICByZXR1cm47Ci0JY2FzZSAweGYwOgotCSAgZjBfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweGYxOgotCSAgZjFfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweGYyOgotCSAgZjJfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweGY4OgotCSAgZjhfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUyOgotCSAgZTJfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0KLQl9Ci0gICAgfQotfQotCi0KLQotLyogcmVsb2NhdGVfZGVidWcsCi0gICBtb3ZlcyBhbGwgdGhlIGRlYnVnIGluZm9ybWF0aW9uIGZyb20gdGhlIHNvdXJjZSBiZmQgdG8gdGhlIG91dHB1dAotICAgYmZkLCBhbmQgcmVsb2NhdGVzIGFueSBleHByZXNzaW9ucyBpdCBmaW5kcwotKi8KLQotc3RhdGljIHZvaWQKLXJlbG9jYXRlX2RlYnVnIChvdXRwdXQsIGlucHV0KQotICAgICBiZmQgKm91dHB1dDsKLSAgICAgYmZkICppbnB1dDsKLXsKLSNkZWZpbmUgSUJTIDQwMAotI2RlZmluZSBPQlMgNDAwCi0gIHVuc2lnbmVkIGNoYXIgaW5wdXRfYnVmZmVyW0lCU107Ci0KLSAgaW5wdXRfcHRyX3N0YXJ0ID0gaW5wdXRfcHRyID0gaW5wdXRfYnVmZmVyOwotICBpbnB1dF9wdHJfZW5kID0gaW5wdXRfYnVmZmVyICsgSUJTOwotICBpbnB1dF9iZmQgPSBpbnB1dDsKLSAgLyogRklYTUU6IENoZWNrIHJldHVybiB2YWx1ZS4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IG5lZWRzIHRvIHJlYWQKLSAgICAgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KLSAgYmZkX3JlYWQgKChQVFIpIGlucHV0X3B0cl9zdGFydCwgMSwgSUJTLCBpbnB1dCk7Ci0gIGJsb2NrICgpOwotfQotCi0vKgotICBEdXJpbmcgbGlua2luZywgd2Ugd2UgdG9sZCBhYm91dCB0aGUgYmZkcyB3aGljaCBtYWRlIHVwIG91cgotICBjb250ZW50cywgd2UgaGF2ZSBhIGxpc3Qgb2YgdGhlbS4gVGhleSB3aWxsIHN0aWxsIGJlIG9wZW4sIHNvIGdvIHRvCi0gIHRoZSBkZWJ1ZyBpbmZvIGluIGVhY2gsIGFuZCBjb3B5IGl0IG91dCwgcmVsb2NhdGluZyBpdCBhcyB3ZSBnby4KLSovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2RlYnVnX3BhcnQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBiZmRfY2hhaW5fdHlwZSAqY2hhaW4gPSBpZWVlLT5jaGFpbl9yb290OwotICB1bnNpZ25lZCBjaGFyIG91dHB1dF9idWZmZXJbT0JTXTsKLSAgYm9vbGVhbiBzb21lX2RlYnVnID0gZmFsc2U7Ci0gIGZpbGVfcHRyIGhlcmUgPSBiZmRfdGVsbCAoYWJmZCk7Ci0KLSAgb3V0cHV0X3B0cl9zdGFydCA9IG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmZmVyOwotICBvdXRwdXRfcHRyX2VuZCA9IG91dHB1dF9idWZmZXIgKyBPQlM7Ci0gIG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmZmVyOwotICBvdXRwdXRfYmZkID0gYWJmZDsKLQotICBpZiAoY2hhaW4gPT0gKGJmZF9jaGFpbl90eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCWlmICgocy0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotCSAgYnJlYWs7Ci0gICAgICBpZiAocyA9PSBOVUxMKQotCXsKLQkgIGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0ID0gMDsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPSBoZXJlOwotICAgICAgaWYgKGJmZF93cml0ZSAocy0+Y29udGVudHMsIDEsIHMtPl9yYXdfc2l6ZSwgYWJmZCkgIT0gcy0+X3Jhd19zaXplKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAoY2hhaW4gIT0gKGJmZF9jaGFpbl90eXBlICopIE5VTEwpCi0JewotCSAgYmZkICplbnRyeSA9IGNoYWluLT50aGlzOwotCSAgaWVlZV9kYXRhX3R5cGUgKmVudHJ5X2llZWUgPSBJRUVFX0RBVEEgKGVudHJ5KTsKLQkgIGlmIChlbnRyeV9pZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCkKLQkgICAgewotCSAgICAgIGlmIChiZmRfc2VlayAoZW50cnksIGVudHJ5X2llZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0LAotCQkJICAgIFNFRUtfU0VUKQotCQkgICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0ZV9kZWJ1ZyAoYWJmZCwgZW50cnkpOwotCSAgICB9Ci0KLQkgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0JfQotICAgICAgaWYgKHNvbWVfZGVidWcpCi0JewotCSAgaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPSBoZXJlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCA9IDA7Ci0JfQotCi0gICAgICBmbHVzaCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIHRoZSBkYXRhIGluIGFuIGllZWUgd2F5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfZGF0YV9wYXJ0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIGllZWUtPncuci5kYXRhX3BhcnQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICAvKiBTa2lwIHNlY3Rpb25zIHRoYXQgaGF2ZSBubyBsb2FkYWJsZSBjb250ZW50cyAoLmJzcywKLSAgICAgICAgIGRlYnVnZ2luZywgZXRjLikgICovCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNvcnQgdGhlIHJlbG9jIHJlY29yZHMgc28gd2UgY2FuIGluc2VydCB0aGVtIGluIHRoZSBjb3JyZWN0Ci0JIHBsYWNlcyAqLwotICAgICAgaWYgKHMtPnJlbG9jX2NvdW50ICE9IDApCi0JewotCSAgaWYgKCEgZG9fd2l0aF9yZWxvY3MgKGFiZmQsIHMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGRvX3dpdGhvdXRfcmVsb2NzIChhYmZkLCBzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGJvb2xlYW4KLWluaXRfZm9yX291dHB1dCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotCWNvbnRpbnVlOwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSAhPSAwKQotCXsKLQkgIGllZWVfcGVyX3NlY3Rpb24gKHMpLT5kYXRhID0gKGJmZF9ieXRlICopIChiZmRfYWxsb2MgKGFiZmQsIHMtPl9yYXdfc2l6ZSkpOwotCSAgaWYgKCFpZWVlX3Blcl9zZWN0aW9uIChzKS0+ZGF0YSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyoqIGV4ZWMgYW5kIGNvcmUgZmlsZSBzZWN0aW9ucyAqLwotCi0vKiBzZXQgc2VjdGlvbiBjb250ZW50cyBpcyBjb21wbGljYXRlZCB3aXRoIElFRUUgc2luY2UgdGhlIGZvcm1hdCBpcwotKiBub3QgYSBieXRlIGltYWdlLCBidXQgYSByZWNvcmQgc3RyZWFtLgotKi8KLWJvb2xlYW4KLWllZWVfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzZWN0aW9uLT5jb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIHNlY3Rpb24tPmNvbnRlbnRzID0gKCh1bnNpZ25lZCBjaGFyICopCi0JCQkgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzZWN0aW9uLT5fcmF3X3NpemUpKTsKLQkgIGlmIChzZWN0aW9uLT5jb250ZW50cyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgLyogYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBldmVyeXRoaW5nCi0gICAgICAgICBpcyB3aXRoaW4gcmFuZ2UuICAqLwotICAgICAgbWVtY3B5IChzZWN0aW9uLT5jb250ZW50cyArIG9mZnNldCwgbG9jYXRpb24sIGNvdW50KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoaWVlZV9wZXJfc2VjdGlvbiAoc2VjdGlvbiktPmRhdGEgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKCFpbml0X2Zvcl9vdXRwdXQgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIG1lbWNweSAoKFBUUikgKGllZWVfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhICsgb2Zmc2V0KSwKLQkgIChQVFIpIGxvY2F0aW9uLAotCSAgKHVuc2lnbmVkIGludCkgY291bnQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgdGhlIGV4dGVybmFsIHN5bWJvbHMgb2YgYSBmaWxlLiAgSUVFRSBjb25zaWRlcnMgdHdvIHNvcnRzIG9mCi0gICBleHRlcm5hbCBzeW1ib2xzLCBwdWJsaWMsIGFuZCByZWZlcmVuY2VkLiAgSXQgdXNlcyB0byBpbnRlcm5hbAotICAgZm9ybXMgdG8gaW5kZXggdGhlbSBhcyB3ZWxsLiAgV2hlbiB3ZSB3cml0ZSB0aGVtIG91dCB3ZSB0dXJuIHRoZWlyCi0gICBzeW1ib2wgdmFsdWVzIGludG8gaW5kZXhlcyBmcm9tIHRoZSByaWdodCBiYXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfZXh0ZXJuYWxfcGFydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICoqcTsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotCi0gIHVuc2lnbmVkIGludCByZWZlcmVuY2VfaW5kZXggPSBJRUVFX1JFRkVSRU5DRV9CQVNFOwotICB1bnNpZ25lZCBpbnQgcHVibGljX2luZGV4ID0gSUVFRV9QVUJMSUNfQkFTRSArIDI7Ci0gIGZpbGVfcHRyIGhlcmUgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGJvb2xlYW4gaGFkb25lID0gZmFsc2U7Ci0gIGlmIChhYmZkLT5vdXRzeW1ib2xzICE9IChhc3ltYm9sICoqKSBOVUxMKQotICAgIHsKLQotICAgICAgZm9yIChxID0gYWJmZC0+b3V0c3ltYm9sczsgKnEgIT0gKGFzeW1ib2wgKikgTlVMTDsgcSsrKQotCXsKLQkgIGFzeW1ib2wgKnAgPSAqcTsKLQkgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHAtPnNlY3Rpb24pKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBtdXN0IGJlIGEgc3ltYm9sIHJlZmVyZW5jZSAuLiAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9leHRlcm5hbF9yZWZlcmVuY2VfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCByZWZlcmVuY2VfaW5kZXgpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2lkIChhYmZkLCBwLT5uYW1lKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHAtPnZhbHVlID0gcmVmZXJlbmNlX2luZGV4OwotCSAgICAgIHJlZmVyZW5jZV9pbmRleCsrOwotCSAgICAgIGhhZG9uZSA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAocC0+c2VjdGlvbikpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgd2VhayByZWZlcmVuY2UgKi8KLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcmVmZXJlbmNlX2luZGV4KQotCQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoYWJmZCwgcC0+bmFtZSkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkJaWVlZV93ZWFrX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHJlZmVyZW5jZV9pbmRleCkKLQkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBwLT52YWx1ZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBwLT52YWx1ZSA9IHJlZmVyZW5jZV9pbmRleDsKLQkgICAgICByZWZlcmVuY2VfaW5kZXgrKzsKLQkgICAgICBoYWRvbmUgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChwLT5mbGFncyAmIEJTRl9HTE9CQUwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIG11c3QgYmUgYSBzeW1ib2wgZGVmaW5pdGlvbiAqLwotCi0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2V4dGVybmFsX3N5bWJvbF9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHB1YmxpY19pbmRleCkKLQkJICB8fCAhIGllZWVfd3JpdGVfaWQgKGFiZmQsIHAtPm5hbWUpCi0JCSAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV9hdHRyaWJ1dGVfcmVjb3JkX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcHVibGljX2luZGV4KQotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAxNSkgLyogaW5zdHJ1Y3Rpb24gYWRkcmVzcyAqLwotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAxOSkgLyogc3RhdGljIHN5bWJvbCAqLwotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAxKSkgLyogb25lIG9mIHRoZW0gKi8KLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgLyogV3JpdGUgb3V0IHRoZSB2YWx1ZSAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX3ZhbHVlX3JlY29yZF9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHB1YmxpY19pbmRleCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKHAtPnNlY3Rpb24pKQotCQl7Ci0JCSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQotCQkgICAgewotCQkgICAgICAvKiBJZiBmdWxseSBsaW5rZWQsIHRoZW4gb3V0cHV0IGFsbCBzeW1ib2xzCi0JCQkgcmVsb2NhdGVkICovCi0JCSAgICAgIGlmICghIChpZWVlX3dyaXRlX2ludAotCQkJICAgICAoYWJmZCwKLQkJCSAgICAgIChwLT52YWx1ZQotCQkJICAgICAgICsgcC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgICsgcC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSkpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIChpZWVlX3dyaXRlX2V4cHJlc3Npb24KLQkJCSAgICAgKGFiZmQsCi0JCQkgICAgICBwLT52YWx1ZSArIHAtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQsCi0JCQkgICAgICBwLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+c3ltYm9sLAotCQkJICAgICAgZmFsc2UsIDApKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghIGllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwKLQkJCQkJICAgICAgIHAtPnZhbHVlLAotCQkJCQkgICAgICAgYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sLAotCQkJCQkgICAgICAgZmFsc2UsIDApKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgcC0+dmFsdWUgPSBwdWJsaWNfaW5kZXg7Ci0JICAgICAgcHVibGljX2luZGV4Kys7Ci0JICAgICAgaGFkb25lID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIC0gd2hlbiB0aGVyZSBhcmUgZ2FwcyBpbiB0aGUgc3ltYm9scyByZWFkICovCi0JICAgICAgLyogZnJvbSBhbiBpbnB1dCBpZWVlIGZpbGUgKi8KLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChoYWRvbmUpCi0gICAgaWVlZS0+dy5yLmV4dGVybmFsX3BhcnQgPSBoZXJlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLXN0YXRpYyBDT05TVCB1bnNpZ25lZCBjaGFyIGV4dGVuW10gPQotewotICAweGYwLCAweDIwLCAweDAwLAotICAweGYxLCAweGNlLCAweDIwLCAweDAwLCAzNywgMywgMywJLyogU2V0IHZlcnNpb24gMyByZXYgMyAgIAkqLwotICAweGYxLCAweGNlLCAweDIwLCAweDAwLCAzOSwgMiwvKiBrZWVwIHN5bWJvbCBpbiAgb3JpZ2luYWwgY2FzZSAqLwotICAweGYxLCAweGNlLCAweDIwLCAweDAwLCAzOAkvKiBzZXQgb2JqZWN0IHR5cGUgcmVsb2NhdGVhYmxlIHRvIHggKi8KLX07Ci0KLXN0YXRpYyBDT05TVCB1bnNpZ25lZCBjaGFyIGVudmlbXSA9Ci17Ci0gIDB4ZjAsIDB4MjEsIDB4MDAsCi0KLS8qICAgIDB4ZjEsIDB4Y2UsIDB4MjEsIDAwLCA1MCwgMHg4MiwgMHgwNywgMHhjNywgMHgwOSwgMHgxMSwgMHgxMSwKLSAgICAweDE5LCAweDJjLAotKi8KLSAgMHhmMSwgMHhjZSwgMHgyMSwgMDAsIDUyLCAweDAwLAkvKiBleGVjIG9rICovCi0KLSAgMHhmMSwgMHhjZSwgMHgyMSwgMCwgNTMsIDB4MDMsLyogaG9zdCB1bml4ICovCi0vKiAgICAweGYxLCAweGNlLCAweDIxLCAwLCA1NCwgMiwxLDEJdG9vbCAmIHZlcnNpb24gIyAqLwotfTsKLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfbWVfcGFydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIGllZWUtPncuci50cmFpbGVyX3BhcnQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChhYmZkLT5zdGFydF9hZGRyZXNzKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX3ZhbHVlX3N0YXJ0aW5nX2FkZHJlc3NfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9vcGVuX2JfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIGFiZmQtPnN0YXJ0X2FkZHJlc3MpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9mdW5jdGlvbl9laXRoZXJfY2xvc2VfYl9lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZWVlLT53LnIubWVfcmVjb3JkID0gYmZkX3RlbGwgKGFiZmQpOwotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfbW9kdWxlX2VuZF9lbnVtKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIElFRUUgcHJvY2Vzc29yIElELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfcHJvY2Vzc29yIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaDsKLQotICBhcmNoID0gYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpOwotICBzd2l0Y2ggKGFyY2gtPmFyY2gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCBiZmRfcHJpbnRhYmxlX25hbWUgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICIyOTAwMCIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9oODMwMDoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICJIOC8zMDAiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfaDg1MDA6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiSDgvNTAwIikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2k5NjA6Ci0gICAgICBzd2l0Y2ggKGFyY2gtPm1hY2gpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfbWFjaF9pOTYwX2NvcmU6Ci0JY2FzZSBiZmRfbWFjaF9pOTYwX2thX3NhOgotCSAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgIjgwOTYwS0EiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9tYWNoX2k5NjBfa2Jfc2I6Ci0JICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiODA5NjBLQiIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX21hY2hfaTk2MF9jYToKLQkgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICI4MDk2MENBIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfbWFjaF9pOTYwX21jOgotCWNhc2UgYmZkX21hY2hfaTk2MF94YToKLQkgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICI4MDk2ME1DIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgewotCWNvbnN0IGNoYXIgKmlkOwotCi0Jc3dpdGNoIChhcmNoLT5tYWNoKQotCSAgewotCSAgZGVmYXVsdDoJCWlkID0gIjY4MDIwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODAwMDogaWQgPSAiNjgwMDAiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfbTY4MDA4OiBpZCA9ICI2ODAwOCI7IGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9tNjgwMTA6IGlkID0gIjY4MDEwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODAyMDogaWQgPSAiNjgwMjAiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfbTY4MDMwOiBpZCA9ICI2ODAzMCI7IGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9tNjgwNDA6IGlkID0gIjY4MDQwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODA2MDogaWQgPSAiNjgwNjAiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfY3B1MzI6ICBpZCA9ICJjcHUzMiI7IGJyZWFrOwotCSAgfQotCi0JaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgaWQpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1pZWVlX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBpOwotICBmaWxlX3B0ciBvbGQ7Ci0KLSAgLyogRmFzdCBmb3J3YXJkIG92ZXIgdGhlIGhlYWRlciBhcmVhICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX21vZHVsZV9iZWdpbm5pbmdfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9wcm9jZXNzb3IgKGFiZmQpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGFiZmQsIGFiZmQtPmZpbGVuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRmFzdCBmb3J3YXJkIG92ZXIgdGhlIHZhcmlhYmxlIGJpdHMgKi8KLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2FkZHJlc3NfZGVzY3JpcHRvcl9lbnVtKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQml0cyBwZXIgTUFVICovCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSAoYmZkX2FyY2hfYml0c19wZXJfYnl0ZSAoYWJmZCkpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIC8qIE1BVSdzIHBlciBhZGRyZXNzICovCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCSAoYmZkX2J5dGUpIChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChhYmZkKQotCQkJCSAgICAgLyBiZmRfYXJjaF9iaXRzX3Blcl9ieXRlIChhYmZkKSkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBvbGQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoOCAqIE5fV19WQVJJQUJMRVMpLCBTRUVLX0NVUikgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWVlZS0+dy5yLmV4dGVuc2lvbl9yZWNvcmQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChiZmRfd3JpdGUgKChjaGFyICopIGV4dGVuLCAxLCBzaXplb2YgKGV4dGVuKSwgYWJmZCkgIT0gc2l6ZW9mIChleHRlbikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAweDEpKSAvKiBBYnNvbHV0ZSAqLwotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDB4MikpIC8qIFJlbG9jYXRlYWJsZSAqLwotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWVlZS0+dy5yLmVudmlyb25tZW50YWxfcmVjb3JkID0gYmZkX3RlbGwgKGFiZmQpOwotICBpZiAoYmZkX3dyaXRlICgoY2hhciAqKSBlbnZpLCAxLCBzaXplb2YgKGVudmkpLCBhYmZkKSAhPSBzaXplb2YgKGVudmkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgSFAgZW11bGF0b3IgZGF0YWJhc2UgcmVxdWlyZXMgYSB0aW1lc3RhbXAgaW4gdGhlIGZpbGUuICAqLwotICB7Ci0gICAgdGltZV90IG5vdzsKLSAgICBjb25zdCBzdHJ1Y3QgdG0gKnQ7Ci0KLSAgICB0aW1lICgmbm93KTsKLSAgICB0ID0gKHN0cnVjdCB0bSAqKSBsb2NhbHRpbWUgKCZub3cpOwotICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKLQl8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMHgyMSkKLQl8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMCkKLQl8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgNTApCi0JfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdC0+dG1feWVhciArIDE5MDApCi0JfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdC0+dG1fbW9uICsgMSkKLQl8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCB0LT50bV9tZGF5KQotCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX2hvdXIpCi0JfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdC0+dG1fbWluKQotCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX3NlYykpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBvdXRwdXRfYmZkID0gYWJmZDsKLQotICBmbHVzaCAoKTsKLQotICBpZiAoISBpZWVlX3dyaXRlX3NlY3Rpb25fcGFydCAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICAvKiBGaXJzdCB3cml0ZSB0aGUgc3ltYm9scy4gIFRoaXMgY2hhbmdlcyB0aGVpciB2YWx1ZXMgaW50byB0YWJsZQotICAgIGluZGVjZXMgc28gd2UgY2FudCB1c2UgaXQgYWZ0ZXIgdGhpcyBwb2ludC4gICovCi0gIGlmICghIGllZWVfd3JpdGVfZXh0ZXJuYWxfcGFydCAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qICBpZWVlX3dyaXRlX2J5dGUoYWJmZCwgaWVlZV9yZWNvcmRfc2VwZXJhdG9yX2VudW0pOyovCi0KLSAgLyogIGllZWVfd3JpdGVfYnl0ZShhYmZkLCBpZWVlX3JlY29yZF9zZXBlcmF0b3JfZW51bSk7Ki8KLQotCi0gIC8qIFdyaXRlIGFueSBkZWJ1Z3Mgd2UgaGF2ZSBiZWVuIHRvbGQgYWJvdXQuICAqLwotICBpZiAoISBpZWVlX3dyaXRlX2RlYnVnX3BhcnQgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDYW4gb25seSB3cml0ZSB0aGUgZGF0YSBvbmNlIHRoZSBzeW1ib2xzIGhhdmUgYmVlbiB3cml0dGVuLCBzaW5jZQotICAgICB0aGUgZGF0YSBjb250YWlucyByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHdoaWNoIHBvaW50cyB0byB0aGUKLSAgICAgc3ltYm9scy4gICovCi0gIGlmICghIGllZWVfd3JpdGVfZGF0YV9wYXJ0IChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQXQgdGhlIGVuZCB3ZSBwdXQgdGhlIGVuZCEgICovCi0gIGlmICghIGllZWVfd3JpdGVfbWVfcGFydCAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdlbmVyYXRlIHRoZSBoZWFkZXIgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvbGQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTl9XX1ZBUklBQkxFUzsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX2Fzc2lnbl92YWx1ZV90b192YXJpYWJsZV9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgaSkKLQkgIHx8ICEgaWVlZV93cml0ZV9pbnQ1X291dCAoYWJmZCwgaWVlZS0+dy5vZmZzZXRbaV0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBOYXRpdmUtbGV2ZWwgaW50ZXJmYWNlIHRvIHN5bWJvbHMuICovCi0KLS8qIFdlIHJlYWQgdGhlIHN5bWJvbHMgaW50byBhIGJ1ZmZlciwgd2hpY2ggaXMgZGlzY2FyZGVkIHdoZW4gdGhpcwotICAgZnVuY3Rpb24gZXhpdHMuICBXZSByZWFkIHRoZSBzdHJpbmdzIGludG8gYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvCi0gICBob2xkIHRoZW0gYWxsIHBsdXMgYWxsIHRoZSBjYWNoZWQgc3ltYm9sIGVudHJpZXMuICovCi0KLWFzeW1ib2wgKgotaWVlZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZWVlX3N5bWJvbF90eXBlICpuZXcgPQotICAgIChpZWVlX3N5bWJvbF90eXBlICopIGJmZF96bWFsbG9jIChzaXplb2YgKGllZWVfc3ltYm9sX3R5cGUpKTsKLSAgaWYgKCFuZXcpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi1zdGF0aWMgYmZkICoKLWllZWVfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoLCBwcmV2KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIGJmZCAqcHJldjsKLXsKLSAgaWVlZV9hcl9kYXRhX3R5cGUgKmFyID0gSUVFRV9BUl9EQVRBIChhcmNoKTsKLSAgLyogdGFrZSB0aGUgbmV4dCBvbmUgZnJvbSB0aGUgYXJjaCBzdGF0ZSwgb3IgcmVzZXQgKi8KLSAgaWYgKHByZXYgPT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFJlc2V0IHRoZSBpbmRleCAtIHRoZSBmaXJzdCB0d28gZW50cmllcyBhcmUgYm9ndXMqLwotICAgICAgYXItPmVsZW1lbnRfaW5kZXggPSAyOwotICAgIH0KLSAgd2hpbGUgKHRydWUpCi0gICAgewotICAgICAgaWVlZV9hcl9vYnN0YWNrX3R5cGUgKnAgPSBhci0+ZWxlbWVudHMgKyBhci0+ZWxlbWVudF9pbmRleDsKLSAgICAgIGFyLT5lbGVtZW50X2luZGV4Kys7Ci0gICAgICBpZiAoYXItPmVsZW1lbnRfaW5kZXggPD0gYXItPmVsZW1lbnRfY291bnQpCi0JewotCSAgaWYgKHAtPmZpbGVfb2Zmc2V0ICE9IChmaWxlX3B0cikgMCkKLQkgICAgewotCSAgICAgIGlmIChwLT5hYmZkID09IChiZmQgKikgTlVMTCkKLQkJewotCQkgIHAtPmFiZmQgPSBfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgKGFyY2gpOwotCQkgIHAtPmFiZmQtPm9yaWdpbiA9IHAtPmZpbGVfb2Zmc2V0OwotCQl9Ci0JICAgICAgcmV0dXJuIHAtPmFiZmQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpOwotCSAgcmV0dXJuIChiZmQgKikgTlVMTDsKLQl9Ci0KLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLAotCQkJc2VjdGlvbiwKLQkJCXN5bWJvbHMsCi0JCQlvZmZzZXQsCi0JCQlmaWxlbmFtZV9wdHIsCi0JCQlmdW5jdGlvbm5hbWVfcHRyLAotCQkJbGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHI7Ci17Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGludAotaWVlZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc3RhdCAqYnVmOwotewotICBpZWVlX2FyX2RhdGFfdHlwZSAqYXIgPSAoaWVlZV9hcl9kYXRhX3R5cGUgKikgTlVMTDsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWU7Ci0KLSAgaWYgKGFiZmQtPm15X2FyY2hpdmUgIT0gTlVMTCkKLSAgICBhciA9IGFiZmQtPm15X2FyY2hpdmUtPnRkYXRhLmllZWVfYXJfZGF0YTsKLSAgaWYgKGFyID09IChpZWVlX2FyX2RhdGFfdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChJRUVFX0RBVEEgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGllZWVfb2JqZWN0X3AgKGFiZmQpID09IE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLQotICBpZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLQotICBidWYtPnN0X3NpemUgPSBpZWVlLT53LnIubWVfcmVjb3JkICsgMTsKLSAgYnVmLT5zdF9tb2RlID0gMDY0NDsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWllZWVfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiB4OwotewotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUaGUgZGVidWcgaW5mbyByb3V0aW5lcyBhcmUgbmV2ZXIgdXNlZC4gICovCi0jaWYgMAotCi1zdGF0aWMgdm9pZAotaWVlZV9iZmRfZGVidWdfaW5mb19zdGFydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotCi19Ci0KLXN0YXRpYyB2b2lkCi1pZWVlX2JmZF9kZWJ1Z19pbmZvX2VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotCi19Ci0KLQotLyogQWRkIHRoaXMgc2VjdGlvbiB0byB0aGUgbGlzdCBvZiBzZWN0aW9ucyB3ZSBoYXZlIGRlYnVnIGluZm8gZm9yLCB0bwotICAgYmUgcmVhZHkgdG8gb3V0cHV0IGl0IGF0IGNsb3NlIHRpbWUKLSAgICovCi1zdGF0aWMgdm9pZAotaWVlZV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoc2VjdGlvbi0+b3duZXIpOwotICBpZWVlX2RhdGFfdHlwZSAqb3V0cHV0X2llZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICAvKiBjYW4gb25seSBhY2N1bXVsYXRlIGRhdGEgZnJvbSBvdGhlciBpZWVlIGJmZHMgKi8KLSAgaWYgKHNlY3Rpb24tPm93bmVyLT54dmVjICE9IGFiZmQtPnh2ZWMpCi0gICAgcmV0dXJuOwotICAvKiBPbmx5IGJvdGhlciBvbmNlIHBlciBiZmQgKi8KLSAgaWYgKGllZWUtPmRvbmVfZGVidWcgPT0gdHJ1ZSkKLSAgICByZXR1cm47Ci0gIGllZWUtPmRvbmVfZGVidWcgPSB0cnVlOwotCi0gIC8qIERvbid0IGJvdGhlciBpZiB0aGVyZSBpcyBubyBkZWJ1ZyBpbmZvICovCi0gIGlmIChpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCA9PSAwKQotICAgIHJldHVybjsKLQotCi0gIC8qIEFkZCB0byBjaGFpbiAqLwotICB7Ci0gICAgYmZkX2NoYWluX3R5cGUgKm4gPSAoYmZkX2NoYWluX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGJmZF9jaGFpbl90eXBlKSk7Ci0gICAgaWYgKCFuKQotICAgICAgYWJvcnQgKCk7CQkvKiBGSVhNRSAqLwotICAgIG4tPnRoaXMgPSBzZWN0aW9uLT5vd25lcjsKLSAgICBuLT5uZXh0ID0gKGJmZF9jaGFpbl90eXBlICopIE5VTEw7Ci0KLSAgICBpZiAob3V0cHV0X2llZWUtPmNoYWluX2hlYWQpCi0gICAgICB7Ci0Jb3V0cHV0X2llZWUtPmNoYWluX2hlYWQtPm5leHQgPSBuOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlvdXRwdXRfaWVlZS0+Y2hhaW5fcm9vdCA9IG47Ci0KLSAgICAgIH0KLSAgICBvdXRwdXRfaWVlZS0+Y2hhaW5faGVhZCA9IG47Ci0gIH0KLX0KLQotI2VuZGlmCi0KLSNkZWZpbmUJaWVlZV9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgaWVlZV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBpZWVlX3NsdXJwX2FybWFwIGJmZF90cnVlCi0jZGVmaW5lIGllZWVfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZmRfdHJ1ZQotI2RlZmluZSBpZWVlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSkpIFwKLSAgIGJmZF90cnVlKQotI2RlZmluZSBpZWVlX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgaWVlZV93cml0ZV9hcm1hcCBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKSkgXAotICAgYmZkX3RydWUpCi0jZGVmaW5lIGllZWVfcmVhZF9hcl9oZHIgYmZkX251bGx2b2lkcHRyCi0jZGVmaW5lIGllZWVfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQotI2RlZmluZSBpZWVlX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLQotI2RlZmluZSBpZWVlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgaWVlZV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgaWVlZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIGllZWVfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBpZWVlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIGllZWVfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgaWVlZV9zZXRfYXJjaF9tYWNoIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoCi0KLSNkZWZpbmUgaWVlZV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0jZGVmaW5lIGllZWVfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBpZWVlX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgaWVlZV9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgaWVlZV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBpZWVlX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGllZWVfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgaWVlZV9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLS8qU1VQUFJFU1MgNDYwICovCi1jb25zdCBiZmRfdGFyZ2V0IGllZWVfdmVjID0KLXsKLSAgImllZWUiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsCi0gICBpZWVlX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgaWVlZV9hcmNoaXZlX3AsCi0gICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICBpZWVlX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgaWVlZV93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChpZWVlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChpZWVlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChpZWVlKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2loZXguYyBiL2JmZC9paGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OTUzZDMuLjAwMDAwMDAKLS0tIGEvYmZkL2loZXguYworKysgL2Rldi9udWxsCkBAIC0xLDEwNDEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCBIZXggb2JqZWN0cy4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIG9mIEN5Z251cyBTdXBwb3J0IDxpYW5AY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBpcyB3aGF0IEludGVsIEhleCBmaWxlcyBsb29rIGxpa2U6Ci0KLTEuIElOVEVMIEZPUk1BVFMKLQotQS4gSW50ZWwgMQotCi0gICAxNi1iaXQgYWRkcmVzcy1maWVsZCBmb3JtYXQsIGZvciBmaWxlcyA2NGsgYnl0ZXMgaW4gbGVuZ3RoIG9yIGxlc3MuCi0KLSAgIERBVEEgUkVDT1JECi0gICBCeXRlIDEJSGVhZGVyID0gY29sb24oOikKLSAgIDIuLjMJCVRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBpbiBoZXggbm90YXRpb24KLSAgIDQuLjUJCUhpZ2ggYnl0ZSBvZiB0aGUgcmVjb3JkIGxvYWQgYWRkcmVzcwotICAgNi4uNwkJTG93IGJ5dGUgb2YgdGhlIHJlY29yZCBsb2FkIGFkZHJlc3MKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwMCIKLSAgIDEwLi54CURhdGEgYnl0ZXMgaW4gaGV4IG5vdGF0aW9uOgotCXggPSAobnVtYmVyIG9mIGJ5dGVzIC0gMSkgKiAyICsgMTEKLSAgIHgrMS4ueCsyCUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgotICAgeCszLi54KzQJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotICAgRU5EIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uICg6KQotICAgMi4uMwkJVGhlIGJ5dGUgY291bnQsIG11c3QgYmUgIjAwIgotICAgNC4uNwkJVHJhbnNmZXItYWRkcmVzcyAodXN1YWxseSAiMDAwMCIpCi0JCXRoZSBqdW1wLXRvIGFkZHJlc3MsIGV4ZWN1dGlvbiBzdGFydCBhZGRyZXNzCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDEiCi0gICAxMC4uMTEJQ2hlY2tzdW0sIGluIGhleCBub3RhdGlvbgotICAgMTIuLjEzCUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0KLUIuIElOVEVMIDIKLQotICAgTUNTLTg2IGZvcm1hdCwgdXNpbmcgYSAyMC1iaXQgYWRkcmVzcyBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNjRLIGJ5dGVzLgotCi0gICBEQVRBIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uICg6KQotICAgMi4uMwkJVGhlIGJ5dGUgY291bnQgb2YgdGhpcyByZWNvcmQsIGhleCBub3RhdGlvbgotICAgNC4uNQkJSGlnaCBieXRlIG9mIHRoZSByZWNvcmQgbG9hZCBhZGRyZXNzCi0gICA2Li43CQlMb3cgYnl0ZSBvZiB0aGUgcmVjb3JkIGxvYWQgYWRkcmVzcwotICAgOC4uOQkJUmVjb3JkIHR5cGUsIG11c3QgYmUgIjAwIgotICAgMTAuLngJVGhlIGRhdGEgYnl0ZXMgaW4gaGV4IG5vdGF0aW9uOgotCXggPSAobnVtYmVyIG9mIGRhdGEgYnl0ZXMgLSAxKSAqIDIgKyAxMQotICAgeCsxLi54KzIJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICB4KzMuLngrNAlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAotCi0gICBFWFRFTkRFRCBBRERSRVNTIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uKDopCi0gICAyLi4zCQlUaGUgYnl0ZSBjb3VudCwgbXVzdCBiZSAiMDIiCi0gICA0Li43CQlMb2FkIGFkZHJlc3MsIG11c3QgYmUgIjAwMDAiCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDIiCi0gICAxMC4uMTEJSGlnaCBieXRlIG9mIHRoZSBvZmZzZXQgYWRkcmVzcwotICAgMTIuLjEzCUxvdyBieXRlIG9mIHRoZSBvZmZzZXQgYWRkcmVzcwotICAgMTQuLjE1CUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgotICAgMTYuLjE3CUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0KLSAgIFRoZSBjaGVja3N1bXMgYXJlIHRoZSB0d28ncyBjb21wbGVtZW50IG9mIHRoZSA4LWJpdCBzdW0KLSAgIHdpdGhvdXQgY2Fycnkgb2YgdGhlIGJ5dGUgY291bnQsIG9mZnNldCBhZGRyZXNzLCBhbmQgdGhlCi0gICByZWNvcmQgdHlwZS4KLQotICAgU1RBUlQgQUREUkVTUyBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwNCIKLSAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwMyIKLSAgIDEwLi4xMwk4MDg2IENTIHZhbHVlCi0gICAxNC4uMTcJODA4NiBJUCB2YWx1ZQotICAgMTguLjE5CUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgotICAgMjAuLjIxCUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0KLUFub3RoZXIgZG9jdW1lbnQgcmVwb3J0cyB0aGVzZSBhZGRpdGlvbmFsIHR5cGVzOgotCi0gICBFWFRFTkRFRCBMSU5FQVIgQUREUkVTUyBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwMiIKLSAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwNCIKLSAgIDEwLi4xMwlVcHBlciAxNiBiaXRzIG9mIGFkZHJlc3Mgb2Ygc3Vic2VxdWVudCByZWNvcmRzCi0gICAxNC4uMTUJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICAxNi4uMTcJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotICAgU1RBUlQgTElORUFSIEFERFJFU1MgUkVDT1JECi0gICBCeXRlIDEJSGVhZGVyID0gY29sb24gKDopCi0gICAyLi4zCQlUaGUgYnl0ZSBjb3VudCwgbXVzdCBiZSAiMDIiCi0gICA0Li43CQlMb2FkIGFkZHJlc3MsIG11c3QgYmUgIjAwMDAiCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDUiCi0gICAxMC4uMTMJVXBwZXIgMTYgYml0cyBvZiBzdGFydCBhZGRyZXNzCi0gICAxNC4uMTUJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICAxNi4uMTcJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotVGhlIE1SSSBjb21waWxlciB1c2VzIHRoaXMsIHdoaWNoIGlzIGEgcmVwZWF0IG9mIHR5cGUgNToKLQotICBFWFRFTkRFRCBTVEFSVCBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwNCIKLSAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwNSIKLSAgIDEwLi4xMwlVcHBlciAxNiBiaXRzIG9mIHN0YXJ0IGFkZHJlc3MKLSAgIDE0Li4xNwlMb3dlciAxNiBiaXRzIG9mIHN0YXJ0IGFkZHJlc3MKLSAgIDE4Li4xOQlDaGVja3N1bSBpbiBoZXggbm90YXRpb24KLSAgIDIwLi4yMQlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotc3RhdGljIHZvaWQgaWhleF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGloZXhfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBJTkxJTkUgaW50IGloZXhfZ2V0X2J5dGUgUEFSQU1TICgoYmZkICosIGJvb2xlYW4gKikpOwotc3RhdGljIHZvaWQgaWhleF9iYWRfYnl0ZSBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGloZXhfc2NhbiBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmloZXhfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGloZXhfcmVhZF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X3dyaXRlX3JlY29yZAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3NpemVfdHlwZSwgYmZkX3ZtYSwgdW5zaWduZWQgaW50LCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGFzeW1ib2wgKmloZXhfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGloZXhfc2V0X2FyY2hfbWFjaAotICBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgaW50IGloZXhfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLQotLyogVGhlIG51bWJlciBvZiBieXRlcyB3ZSBwdXQgb24gb25lIGxpbmUgZHVyaW5nIG91dHB1dC4gICovCi0KLSNkZWZpbmUgQ0hVTksgKDIxKQotCi0vKiBNYWNyb3MgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBoZXggYW5kIGJpbmFyeS4gKi8KLQotI2RlZmluZSBOSUJCTEUoeCkgKGhleF92YWx1ZSAoeCkpCi0jZGVmaW5lIEhFWDIoYnVmZmVyKSAoKE5JQkJMRSAoKGJ1ZmZlcilbMF0pIDw8IDQpICsgTklCQkxFICgoYnVmZmVyKVsxXSkpCi0jZGVmaW5lIEhFWDQoYnVmZmVyKSAoKEhFWDIgKGJ1ZmZlcikgPDwgOCkgKyBIRVgyICgoYnVmZmVyKSArIDIpKQotI2RlZmluZSBJU0hFWCh4KSAoaGV4X3AgKHgpKQotCi0vKiBXaGVuIHdlIHdyaXRlIG91dCBhbiBpaGV4IHZhbHVlLCB0aGUgdmFsdWVzIGNhbiBub3QgYmUgb3V0cHV0IGFzCi0gICB0aGV5IGFyZSBzZWVuLiAgSW5zdGVhZCwgd2UgaG9sZCB0aGVtIGluIG1lbW9yeSBpbiB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBpaGV4X2RhdGFfbGlzdAotewotICBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKm5leHQ7Ci0gIGJmZF9ieXRlICpkYXRhOwotICBiZmRfdm1hIHdoZXJlOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci19OwotCi0vKiBUaGUgaWhleCB0ZGF0YSBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBpaGV4X2RhdGFfc3RydWN0Ci17Ci0gIHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqaGVhZDsKLSAgc3RydWN0IGloZXhfZGF0YV9saXN0ICp0YWlsOwotfTsKLQotLyogSW5pdGlhbGl6ZSBieSBmaWxsaW5nIGluIHRoZSBoZXggY29udmVyc2lvbiBhcnJheS4gICovCi0KLXN0YXRpYyB2b2lkCi1paGV4X2luaXQgKCkKLXsKLSAgc3RhdGljIGJvb2xlYW4gaW5pdGVkOwotCi0gIGlmICghIGluaXRlZCkKLSAgICB7Ci0gICAgICBpbml0ZWQgPSB0cnVlOwotICAgICAgaGV4X2luaXQgKCk7Ci0gICAgfQotfQotCi0vKiBDcmVhdGUgYW4gaWhleCBvYmplY3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+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+PiA4KSAmIDB4ZmY7Ci0JICBzdGFydGJ1ZlszXSA9IChiZmRfYnl0ZSlzdGFydCAmIDB4ZmY7Ci0JICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgNCwgMCwgNSwgc3RhcnRidWYpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgMCwgMCwgMSwgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGFuIGVtcHR5IHN5bWJvbC4gIFRoaXMgaXMgcmVxdWlyZWQgb25seSBiZWNhdXNlCi0gICBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSB3YW50cyB0byBjcmVhdGUgYSBzeW1ib2wgZm9yIHRoZSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotaWhleF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXc7Ci0KLSAgbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChuZXcgIT0gTlVMTCkKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSBmb3IgdGhlIG91dHB1dCBmaWxlLiAgVGhlIGFyY2hpdGVjdHVyZSBpcwotICAgaXJyZWxldmFudCwgc28gd2UgaWdub3JlIGVycm9ycyBhYm91dCB1bmtub3duIGFyY2hpdGVjdHVyZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2g7Ci17Ci0gIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpKQotICAgIHsKLSAgICAgIGlmIChhcmNoICE9IGJmZF9hcmNoX3Vua25vd24pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVycywgZm9yIHRoZSBsaW5rZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLWloZXhfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjOwotewotICByZXR1cm4gMDsKLX0KLQotLyogU29tZSByYW5kb20gZGVmaW5pdGlvbnMgZm9yIHRoZSB0YXJnZXQgdmVjdG9yLiAgKi8KLQotI2RlZmluZQlpaGV4X2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBpaGV4X2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBpaGV4X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLSNkZWZpbmUgaWhleF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgaWhleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGJmZF8wbAotI2RlZmluZSBpaGV4X2dldF9zeW10YWIgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIGJmZF8wbCkKLSNkZWZpbmUgaWhleF9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIGloZXhfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBpaGV4X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGloZXhfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIGloZXhfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgaWhleF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIGloZXhfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIGloZXhfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBpaGV4X2dldF9yZWxvY191cHBlcl9ib3VuZCBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkXzBsKQotI2RlZmluZSBpaGV4X2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgYmZkXzBsKQotI2RlZmluZSBpaGV4X2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIGloZXhfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBpaGV4X2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgaWhleF9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgaWhleF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBpaGV4X2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGloZXhfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgaWhleF9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotLyogVGhlIEludGVsIEhleCB0YXJnZXQgdmVjdG9yLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCBpaGV4X3ZlYyA9Ci17Ci0gICJpaGV4IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfaWhleF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIDAsCQkJCS8qIG9iamVjdCBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAgewotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIGloZXhfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgaWhleF9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgaWhleF93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChpaGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGloZXgpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGloZXgpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoaWhleCksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGloZXgpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9pbml0LmMgYi9iZmQvaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmExZDUwLi4wMDAwMDAwCi0tLSBhL2JmZC9pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBiZmQgaW5pdGlhbGl6YXRpb24gc3R1ZmYKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotLyoKLVNFQ1RJT04KLQlJbml0aWFsaXphdGlvbgotCi0JVGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgaW5pdGlhbGl6aW5nIGEgQkZELgotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2luaXQKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9pbml0KHZvaWQpOwotCi1ERVNDUklQVElPTgotCVRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIEJGRCBmdW5jdGlvbiB0bwotCWluaXRpYWxpemUgbWFnaWNhbCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuCi0qLwotCi0vKiBBY3R1YWxseSwgdGhlcmUgaXMgY3VycmVudGx5IG5vdGhpbmcgZm9yIHRoaXMgZnVuY3Rpb24gdG8gZG8uCi0gICBIb3dldmVyLCBzb21lZGF5IGl0IG1heSBiZSBuZWVkZWQsIHNvIGtlZXAgaXQgYXJvdW5kLiAgKi8KLQotdm9pZAotYmZkX2luaXQgKCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JmZC9pcml4LWNvcmUuYyBiL2JmZC9pcml4LWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0Y2EyMC4uMDAwMDAwMAotLS0gYS9iZmQvaXJpeC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJcml4IGNvcmUgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3R1IEdyb3NzbWFuLCBDeWdudXMgU3VwcG9ydC4KLSAgIENvbnZlcnRlZCB0byBiYWNrLWVuZCBmb3JtIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNhbiBvbmx5IGJlIGNvbXBpbGVkIG9uIHN5c3RlbXMgd2hpY2ggdXNlIElyaXggc3R5bGUgY29yZQotICAgZmlsZXMgKG5hbWVseSwgSXJpeCA0IGFuZCBJcml4IDUsIHNvIGZhcikuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZmRlZiBJUklYX0NPUkUKLQotI2luY2x1ZGUgPGNvcmUub3V0Lmg+Ci0KLXN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QgCi17Ci0gIGludCBzaWc7Ci0gIGNoYXIgY21kW0NPUkVfTkFNRVNJWkVdOwotfTsKLQotI2RlZmluZSBjb3JlX2hkcihiZmQpICgoYmZkKS0+dGRhdGEuc2dpX2NvcmVfZGF0YSkKLSNkZWZpbmUgY29yZV9zaWduYWwoYmZkKSAoY29yZV9oZHIoYmZkKS0+c2lnKQotI2RlZmluZSBjb3JlX2NvbW1hbmQoYmZkKSAoY29yZV9oZHIoYmZkKS0+Y21kKQotCi1zdGF0aWMgYXNlY3Rpb24gKm1ha2VfYmZkX2FzZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICosIGZsYWd3b3JkLCBiZmRfc2l6ZV90eXBlLCBiZmRfdm1hLCBmaWxlX3B0cikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmlyaXhfY29yZV9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNoYXIgKmlyaXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IGlyaXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGlyaXhfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGFzeW1ib2wgKmlyaXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgbmFtZSwgZmxhZ3MsIF9yYXdfc2l6ZSwgdm1hLCBmaWxlcG9zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLQotICBhc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLSAgaWYgKCFhc2VjdCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBhc2VjdC0+ZmxhZ3MgPSBmbGFnczsKLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IF9yYXdfc2l6ZTsKLSAgYXNlY3QtPnZtYSA9IHZtYTsKLSAgYXNlY3QtPmZpbGVwb3MgPSBmaWxlcG9zOwotICBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gNDsKLQotICByZXR1cm4gYXNlY3Q7Ci19Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWlyaXhfY29yZV9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgdmFsOwotICBpbnQgaTsKLSAgY2hhciAqc2VjbmFtZTsKLSAgc3RydWN0IGNvcmVvdXQgY29yZW91dDsKLSAgc3RydWN0IGlkZXNjICppZGcsICppZGYsICppZHM7Ci0KLSAgdmFsID0gYmZkX3JlYWQgKChQVFIpJmNvcmVvdXQsIDEsIHNpemVvZiBjb3Jlb3V0LCBhYmZkKTsKLSAgaWYgKHZhbCAhPSBzaXplb2YgY29yZW91dCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSNpZm5kZWYgQ09SRV9NQUdJQ04zMgotI2RlZmluZSBDT1JFX01BR0lDTjMyIENPUkVfTUFHSUMKLSNlbmRpZgotICBpZiAoKGNvcmVvdXQuY19tYWdpYyAhPSBDT1JFX01BR0lDICYmIGNvcmVvdXQuY19tYWdpYyAhPSBDT1JFX01BR0lDTjMyKQotICAgICAgfHwgY29yZW91dC5jX3ZlcnNpb24gIT0gQ09SRV9WRVJTSU9OMSkKLSAgICByZXR1cm4gMDsKLQotICBjb3JlX2hkciAoYWJmZCkgPSAoc3RydWN0IHNnaV9jb3JlX3N0cnVjdCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QpKTsKLSAgaWYgKCFjb3JlX2hkciAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3RybmNweSAoY29yZV9jb21tYW5kIChhYmZkKSwgY29yZW91dC5jX25hbWUsIENPUkVfTkFNRVNJWkUpOwotICBjb3JlX3NpZ25hbCAoYWJmZCkgPSBjb3Jlb3V0LmNfc2lnY2F1c2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBjb3Jlb3V0LmNfdm1hcG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvcmVvdXQuY19udm1hcDsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCB2bWFwIHZtYXA7Ci0KLSAgICAgIHZhbCA9IGJmZF9yZWFkICgoUFRSKSZ2bWFwLCAxLCBzaXplb2Ygdm1hcCwgYWJmZCk7Ci0gICAgICBpZiAodmFsICE9IHNpemVvZiB2bWFwKQotCWJyZWFrOwotCi0gICAgICBzd2l0Y2ggKHZtYXAudl90eXBlKQotCXsKLQljYXNlIFZEQVRBOgotCSAgc2VjbmFtZSA9ICIuZGF0YSI7Ci0JICBicmVhazsKLQljYXNlIFZTVEFDSzoKLQkgIHNlY25hbWUgPSAiLnN0YWNrIjsKLQkgIGJyZWFrOwotI2lmZGVmIFZNQVBGSUxFCi0JY2FzZSBWTUFQRklMRToKLQkgIHNlY25hbWUgPSAiLm1hcGZpbGUiOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBIGZpbGUgb2Zmc2V0IG9mIHplcm8gbWVhbnMgdGhhdCB0aGUgc2VjdGlvbiBpcyBub3QgY29udGFpbmVkCi0JIGluIHRoZSBjb3JlZmlsZS4gICovCi0gICAgICBpZiAodm1hcC52X29mZnNldCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBzZWNuYW1lLAotCQkJICAgICAgU0VDX0FMTE9DK1NFQ19MT0FEK1NFQ19IQVNfQ09OVEVOVFMsCi0JCQkgICAgICB2bWFwLnZfbGVuLAotCQkJICAgICAgdm1hcC52X3ZhZGRyLAotCQkJICAgICAgdm1hcC52X29mZnNldCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSByZWdzIGFyZSBjb250aWd1b3VzIHdpdGhpbiB0aGUgY29yZSBmaWxlLiAqLwotCi0gIGlkZyA9ICZjb3Jlb3V0LmNfaWRlc2NbSV9HUFJFR1NdOwotICBpZGYgPSAmY29yZW91dC5jX2lkZXNjW0lfRlBSRUdTXTsKLSAgaWRzID0gJmNvcmVvdXQuY19pZGVzY1tJX1NQRUNSRUdTXTsKLQotICBpZiAoaWRnLT5pX29mZnNldCArIGlkZy0+aV9sZW4gIT0gaWRmLT5pX29mZnNldAotICAgICAgfHwgaWRmLT5pX29mZnNldCArIGlkZi0+aV9sZW4gIT0gaWRzLT5pX29mZnNldCkKLSAgICByZXR1cm4gMDsJCQkvKiBDYW4ndCBkZWFsIHdpdGggbm9uLWNvbnRpZyByZWdzICovCi0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBpZGctPmlfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAotCQkgICAgIFNFQ19IQVNfQ09OVEVOVFMsCi0JCSAgICAgaWRnLT5pX2xlbiArIGlkZi0+aV9sZW4gKyBpZHMtPmlfbGVuLAotCQkgICAgIDAsCi0JCSAgICAgaWRnLT5pX29mZnNldCk7Ci0KLSAgLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWlyaXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX2NvbW1hbmQgKGFiZmQpOwotfQotCi1zdGF0aWMgaW50Ci1pcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pcml4X2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgcmV0dXJuIHRydWU7CQkJLyogWFhYIC0gRklYTUUgKi8KLX0KLQotc3RhdGljIGFzeW1ib2wgKgotaXJpeF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLSNkZWZpbmUgaXJpeF9jb3JlX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBpcml4X2NvcmVfZ2V0X3N5bXRhYiBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiCi0jZGVmaW5lIGlyaXhfY29yZV9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIGlyaXhfY29yZV9nZXRfc3ltYm9sX2luZm8gX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIGlyaXhfY29yZV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0gIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGlyaXhfY29yZV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgaXJpeF9jb3JlX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIGlyaXhfY29yZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIGlyaXhfY29yZV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgaXJpeF9jb3JlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IGlyaXhfY29yZV92ZWMgPQotICB7Ci0gICAgImlyaXgtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBpcml4X2NvcmVfY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChpcml4X2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChpcml4X2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07Ci0KLSNlbmRpZiAvKiBJUklYX0NPUkUgKi8KZGlmZiAtLWdpdCBhL2JmZC9saWJhb3V0LmggYi9iZmQvbGliYW91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDAxZDNkLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJhb3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MjQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgYS5vdXQgKGFuZCBzaW1pbGFyKSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTElCQU9VVF9ICi0jZGVmaW5lIExJQkFPVVRfSAotCi0vKiBXZSB0cnkgdG8gZW5jYXBzdWxhdGUgdGhlIGRpZmZlcmVuY2VzIGluIHRoZSB2YXJpb3VzIGEub3V0IGZpbGUKLSAgIHZhcmlhbnRzIGluIGEgZmV3IHJvdXRpbmVzLCBhbmQgb3RoZXJ3aXNlIHNoYXJlIGxhcmdlIG1hc3NlcyBvZiBjb2RlLgotICAgVGhpcyBtZWFucyB3ZSBvbmx5IGhhdmUgdG8gZml4IGJ1Z3MgaW4gb25lIHBsYWNlLCBtb3N0IG9mIHRoZSB0aW1lLiAgKi8KLQotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotLyogUGFyYW1ldGVyaXplIHRoZSBhLm91dCBjb2RlIGJhc2VkIG9uIHdoZXRoZXIgaXQgaXMgYmVpbmcgYnVpbHQKLSAgIGZvciBhIDMyLWJpdCBhcmNoaXRlY3R1cmUgb3IgYSA2NC1iaXQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNpZiBBUkNIX1NJWkU9PTY0Ci0jZGVmaW5lIEdFVF9XT1JEIGJmZF9oX2dldF82NAotI2RlZmluZSBHRVRfU1dPUkQgYmZkX2hfZ2V0X3NpZ25lZF82NAotI2RlZmluZSBQVVRfV09SRCBiZmRfaF9wdXRfNjQKLSNpZm5kZWYgTkFNRQotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyh4LF82NF8seSkKLSNlbmRpZgotI2RlZmluZSBKTkFNRSh4KSBDQVQoeCxfNjQpCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgOAotI2Vsc2UgLyogQVJDSF9TSVpFID09IDMyICovCi0jZGVmaW5lIEdFVF9XT1JEIGJmZF9oX2dldF8zMgotI2RlZmluZSBHRVRfU1dPUkQgYmZkX2hfZ2V0X3NpZ25lZF8zMgotI2RlZmluZSBQVVRfV09SRCBiZmRfaF9wdXRfMzIKLSNpZm5kZWYgTkFNRQotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyh4LF8zMl8seSkKLSNlbmRpZgotI2RlZmluZSBKTkFNRSh4KSBDQVQoeCxfMzIpCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotI2VuZGlmIC8qIEFSQ0hfU0laRT09MzIgKi8KLQotLyogRGVjbGFyZSBhdCBmaWxlIGxldmVsLCBzaW5jZSB1c2VkIGluIHBhcmFtZXRlciBsaXN0cywgd2hpY2ggaGF2ZQotICAgd2VpcmQgc2NvcGUuICAqLwotc3RydWN0IGV4dGVybmFsX2V4ZWM7Ci1zdHJ1Y3QgZXh0ZXJuYWxfbmxpc3Q7Ci1zdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsOwotc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbDsKLQwKLS8qIGEub3V0IGJhY2tlbmQgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotICAvKiBXaGV0aGVyIHRoaXMgc3ltYm9sIGhhcyBiZWVuIHdyaXR0ZW4gb3V0LiAgKi8KLSAgYm9vbGVhbiB3cml0dGVuOwotICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICAqLwotICBpbnQgaW5keDsKLX07Ci0KLS8qIGEub3V0IGJhY2tlbmQgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhb3V0X2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKLSAgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhbiBhLm91dCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGFvdXRfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGJmZF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgYS5vdXQgbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIGFvdXRfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQwKLS8qIEJhY2stZW5kIGluZm9ybWF0aW9uIGZvciB2YXJpb3VzIGEub3V0IHRhcmdldHMuICAqLwotc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhCi17Ci0gIC8qIEFyZSBaTUFHSUMgZmlsZXMgbWFwcGVkIGNvbnRpZ3VvdXNseT8gIElmIHNvLCB0aGUgdGV4dCBzZWN0aW9uIG1heQotICAgICBuZWVkIG1vcmUgcGFkZGluZywgaWYgdGhlIHNlZ21lbnQgc2l6ZSAoZ3JhbnVsYXJpdHkgZm9yIG1lbW9yeSBhY2Nlc3MKLSAgICAgY29udHJvbCkgaXMgbGFyZ2VyIHRoYW4gdGhlIHBhZ2Ugc2l6ZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgem1hZ2ljX21hcHBlZF9jb250aWd1b3VzOwotICAvKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCBaTUFHSUMvTk1BR0lDIGZpbGUgaGVhZGVycyBnZXQgbWFwcGVkIGluIHdpdGggdGhlCi0gICAgIHRleHQgc2VjdGlvbiwgd2hpY2ggc3RhcnRzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaWxlIGhlYWRlci4KLSAgICAgSWYgbm90LCB0aGUgdGV4dCBzZWN0aW9uIHN0YXJ0cyBvbiB0aGUgbmV4dCBwYWdlLiAgKi8KLSAgdW5zaWduZWQgY2hhciB0ZXh0X2luY2x1ZGVzX2hlYWRlcjsKLQotICAvKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIGlmIHRoZSBlbnRyeSBhZGRyZXNzIGlzIG5vdCBpbiB0aGUKLSAgICAgZmlyc3QgU0VHTUVOVF9TSVpFIGJ5dGVzIG9mIHRoZSB0ZXh0IHNlY3Rpb24sIGl0IGlzIHRha2VuIHRvIGJlCi0gICAgIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgVGhpcyBjYW4gYmUgdXNlZnVsCi0gICAgIGZvciBrZXJuZWxzLiAgKi8KLSAgdW5zaWduZWQgY2hhciBlbnRyeV9pc190ZXh0X2FkZHJlc3M7Ci0KLSAgLyogVGhlIHZhbHVlIHRvIHBhc3MgdG8gTl9TRVRfRkxBR1MuICAqLwotICB1bnNpZ25lZCBjaGFyIGV4ZWNfaGRyX2ZsYWdzOwotCi0gIC8qIElmIHRoZSB0ZXh0IHNlY3Rpb24gVk1BIGlzbid0IHNwZWNpZmllZCwgYW5kIHdlIG5lZWQgYW4gYWJzb2x1dGUKLSAgICAgYWRkcmVzcywgdXNlIHRoaXMgYXMgdGhlIGRlZmF1bHQuICBJZiB3ZSdyZSBwcm9kdWNpbmcgYSByZWxvY2F0YWJsZQotICAgICBmaWxlLCB6ZXJvIGlzIGFsd2F5cyB1c2VkLiAgKi8KLSAgLyogPz8gUGVyaGFwcyBhIGNhbGxiYWNrIHdvdWxkIGJlIGEgYmV0dGVyIGNob2ljZT8gIFdpbGwgdGhpcyBkbyBhbnl0aGluZwotICAgICByZWFzb25hYmxlIGZvciBhIGZvcm1hdCB0aGF0IGhhbmRsZXMgbXVsdGlwbGUgQ1BVcyB3aXRoIGRpZmZlcmVudAotICAgICBsb2FkIGFkZHJlc3NlcyBmb3IgZWFjaD8gICovCi0gIGJmZF92bWEgZGVmYXVsdF90ZXh0X3ZtYTsKLQotICAvKiBDYWxsYmFjayBmb3Igc2V0dGluZyB0aGUgcGFnZSBhbmQgc2VnbWVudCBzaXplcywgaWYgdGhleSBjYW4ndCBiZQotICAgICB0cml2aWFsbHkgZGV0ZXJtaW5lZCBmcm9tIHRoZSBhcmNoaXRlY3R1cmUuICAqLwotICBib29sZWFuICgqc2V0X3NpemVzKSBQQVJBTVMgKChiZmQgKikpOwotCi0gIC8qIHptYWdpYyBmaWxlcyBvbmx5LiBGb3IgZ28zMiwgdGhlIGxlbmd0aCBvZiB0aGUgZXhlYyBoZWFkZXIgY29udHJpYnV0ZXMKLSAgICAgdG8gdGhlIHNpemUgb2YgdGhlIHRleHQgc2VjdGlvbiBpbiB0aGUgZmlsZSBmb3IgYWxpZ25tZW50IHB1cnBvc2VzIGJ1dAotICAgICBkb2VzICpub3QqIGdldCBjb3VudGVkIGluIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgc2VjdGlvbi4gKi8KLSAgdW5zaWduZWQgY2hhciBleGVjX2hlYWRlcl9ub3RfY291bnRlZDsKLQotICAvKiBDYWxsYmFjayBmcm9tIHRoZSBhZGQgc3ltYm9scyBwaGFzZSBvZiB0aGUgbGlua2VyIGNvZGUgdG8gaGFuZGxlCi0gICAgIGEgZHluYW1pYyBvYmplY3QuICAqLwotICBib29sZWFuICgqYWRkX2R5bmFtaWNfc3ltYm9scykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgc3RydWN0IGV4dGVybmFsX25saXN0ICoqLAotCQkJCQkgIGJmZF9zaXplX3R5cGUgKiwgY2hhciAqKikpOwotCi0gIC8qIENhbGxiYWNrIGZyb20gdGhlIGFkZCBzeW1ib2xzIHBoYXNlIG9mIHRoZSBsaW5rZXIgY29kZSB0byBoYW5kbGUKLSAgICAgYWRkaW5nIGEgc2luZ2xlIHN5bWJvbCB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLSAgYm9vbGVhbiAoKmFkZF9vbmVfc3ltYm9sKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0JCQkJICAgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sCi0JCQkJICAgICBib29sZWFuLAotCQkJCSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLQotICAvKiBDYWxsZWQgdG8gaGFuZGxlIGxpbmtpbmcgYSBkeW5hbWljIG9iamVjdC4gICovCi0gIGJvb2xlYW4gKCpsaW5rX2R5bmFtaWNfb2JqZWN0KSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotCi0gIC8qIENhbGxlZCBmb3IgZWFjaCBnbG9iYWwgc3ltYm9sIGJlaW5nIHdyaXR0ZW4gb3V0IGJ5IHRoZSBsaW5rZXIuCi0gICAgIFRoaXMgc2hvdWxkIHdyaXRlIG91dCB0aGUgZHluYW1pYyBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICBib29sZWFuICgqd3JpdGVfZHluYW1pY19zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikpOwotCi0gIC8qIElmIHRoaXMgY2FsbGJhY2sgaXMgbm90IE5VTEwsIHRoZSBsaW5rZXIgY2FsbHMgaXQgZm9yIGVhY2ggcmVsb2MuCi0gICAgIFJFTE9DIGlzIGEgcG9pbnRlciB0byB0aGUgdW5zd2FwcGVkIHJlbG9jLiAgSWYgKlNLSVAgaXMgc2V0IHRvCi0gICAgIHRydWUsIHRoZSByZWxvYyB3aWxsIGJlIHNraXBwZWQuICAqUkVMT0NBVElPTiBtYXkgYmUgY2hhbmdlZCB0bwotICAgICBjaGFuZ2UgdGhlIGVmZmVjdHMgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotICBib29sZWFuICgqY2hlY2tfZHluYW1pY19yZWxvYykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JCQkJCSAgYmZkICppbnB1dF9iZmQsCi0JCQkJCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0JCQkJCSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoLAotCQkJCQkgIFBUUiByZWxvYywgYmZkX2J5dGUgKmNvbnRlbnRzLAotCQkJCQkgIGJvb2xlYW4gKnNraXAsCi0JCQkJCSAgYmZkX3ZtYSAqcmVsb2NhdGlvbikpOwotCi0gIC8qIENhbGxlZCBhdCB0aGUgZW5kIG9mIGEgbGluayB0byBmaW5pc2ggdXAgYW55IGR5bmFtaWMgbGlua2luZwotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIGJvb2xlYW4gKCpmaW5pc2hfZHluYW1pY19saW5rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotfTsKLSNkZWZpbmUgYW91dF9iYWNrZW5kX2luZm8oYWJmZCkgXAotCSgoQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhICopKChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKSkKLQotLyogVGhpcyBpcyB0aGUgbGF5b3V0IGluIG1lbW9yeSBvZiBhICJzdHJ1Y3QgZXhlYyIgd2hpbGUgd2UgcHJvY2VzcyBpdC4KLSAgIEFsbCAnbGVuZ3RocycgYXJlIGdpdmVuIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgotICAgQWxsICdhbGlnbm1lbnRzJyBhcmUgZm9yIHJlbGlua2FibGUgZmlsZXMgb25seTsgIGFuIGFsaWdubWVudCBvZgotCSduJyBpbmRpY2F0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgc2VnbWVudCBtdXN0IGJlZ2luIGF0IGFuCi0JYWRkcmVzcyB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgKDIqKm4pLiAgKi8KLQotc3RydWN0IGludGVybmFsX2V4ZWMKLXsKLSAgICBsb25nIGFfaW5mbzsJCS8qIE1hZ2ljIG51bWJlciBhbmQgZmxhZ3MsIHBhY2tlZCAqLwotICAgIGJmZF92bWEgYV90ZXh0OwkJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICAqLwotICAgIGJmZF92bWEgYV9kYXRhOwkJLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICAqLwotICAgIGJmZF92bWEgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgaW4gbWVtICovCi0gICAgYmZkX3ZtYSBhX3N5bXM7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSAqLwotICAgIGJmZF92bWEgYV9lbnRyeTsJCS8qIHN0YXJ0IGFkZHJlc3MgKi8KLSAgICBiZmRfdm1hIGFfdHJzaXplOwkJLyogbGVuZ3RoIG9mIHRleHQncyByZWxvY2F0aW9uIGluZm8sIGluIGJ5dGVzICovCi0gICAgYmZkX3ZtYSBhX2Ryc2l6ZTsJCS8qIGxlbmd0aCBvZiBkYXRhJ3MgcmVsb2NhdGlvbiBpbmZvLCBpbiBieXRlcyAqLwotICAgIC8qIEFkZGVkIGZvciBpOTYwICovCi0gICAgYmZkX3ZtYSBhX3Rsb2FkOwkJLyogVGV4dCBydW50aW1lIGxvYWQgYWRkcmVzcyAqLwotICAgIGJmZF92bWEgYV9kbG9hZDsJCS8qIERhdGEgcnVudGltZSBsb2FkIGFkZHJlc3MgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGFfdGFsaWduOwkvKiBBbGlnbm1lbnQgb2YgdGV4dCBzZWdtZW50ICovCi0gICAgdW5zaWduZWQgY2hhciBhX2RhbGlnbjsJLyogQWxpZ25tZW50IG9mIGRhdGEgc2VnbWVudCAqLwotICAgIHVuc2lnbmVkIGNoYXIgYV9iYWxpZ247CS8qIEFsaWdubWVudCBvZiBic3Mgc2VnbWVudCAqLwotICAgIGNoYXIgYV9yZWxheGFibGU7ICAgICAgICAgICAvKiBFbm91Z2ggaW5mbyBmb3IgbGlua2VyIHJlbGF4ICovCi19OwotCi0vKiBNYWdpYyBudW1iZXIgaXMgd3JpdHRlbiAKLTwgTVNCICAgICAgICAgID4KLTMxMzAyOTI4MjcyNjI1MjQyMzIyMjEyMDE5MTgxNzE2MTUxNDEzMTIxMTEwMDkwODA3MDYwNTA0MDMwMjAxMDAKLTwgRkxBR1MgICAgICAgID48IE1BQ0hJTkUgVFlQRSA+PCAgTUFHSUMgTlVNQkVSICAgICAgICAgICAgICAgID4KLSovCi0vKiBNYWdpYyBudW1iZXIgZm9yIE5ldEJTRCBpcwotPE1TQiAgICAgICAgICAgPgotMzEzMDI5MjgyNzI2MjUyNDIzMjIyMTIwMTkxODE3MTYxNTE0MTMxMjExMTAwOTA4MDcwNjA1MDQwMzAyMDEwMAotPCBGTEFHUyAgICA+PCBNQUNISU5FIFRZUEUgICAgID48ICBNQUdJQyBOVU1CRVIgICAgICAgICAgICAgICAgPgotKi8KLQotZW51bSBtYWNoaW5lX3R5cGUgewotICBNX1VOS05PV04gPSAwLAotICBNXzY4MDEwID0gMSwKLSAgTV82ODAyMCA9IDIsCi0gIE1fU1BBUkMgPSAzLAotICAvKiBza2lwIGEgYnVuY2ggc28gd2UgZG9uJ3QgcnVuIGludG8gYW55IG9mIHN1bnMgbnVtYmVycyAqLwotICAvKiBtYWtlIHRoZXNlIHVwIGZvciB0aGUgbnMzMmsqLwotICBNX05TMzIwMzIgPSAoNjQpLAkJLyogbnMzMjAzMiBydW5uaW5nID8gKi8KLSAgTV9OUzMyNTMyID0gKDY0ICsgNSksCQkvKiBuczMyNTMyIHJ1bm5pbmcgbWFjaCAqLwotCi0gIE1fMzg2ID0gMTAwLAotICBNXzI5SyA9IDEwMSwgICAgICAgICAgLyogQU1EIDI5MDAwICovCi0gIE1fMzg2X0RZTklYID0gMTAyLAkvKiBTZXF1ZW50IHJ1bm5pbmcgZHluaXggKi8KLSAgTV9BUk0gPSAxMDMsCQkvKiBBZHZhbmNlZCBSaXNjIE1hY2hpbmVzIEFSTSAqLwotICBNX1NQQVJDTEVUID0gMTMxLAkvKiBTUEFSQ2xldCA9IE1fU1BBUkMgKyAxMjggKi8KLSAgTV8zODZfTkVUQlNEID0gMTM0LAkvKiBOZXRCU0QvaTM4NiBiaW5hcnkgKi8KLSAgTV82OEtfTkVUQlNEID0gMTM1LAkvKiBOZXRCU0QvbTY4ayBiaW5hcnkgKi8KLSAgTV82OEs0S19ORVRCU0QgPSAxMzYsCS8qIE5ldEJTRC9tNjhrNGsgYmluYXJ5ICovCi0gIE1fNTMyX05FVEJTRCA9IDEzNywJLyogTmV0QlNEL25zMzJrIGJpbmFyeSAqLwotICBNX1NQQVJDX05FVEJTRCA9IDEzOCwJLyogTmV0QlNEL3NwYXJjIGJpbmFyeSAqLwotICBNX1BNQVhfTkVUQlNEID0gMTM5LAkvKiBOZXRCU0QvcG1heCAoTUlQUyBsaXR0bGUtZW5kaWFuKSBiaW5hcnkgKi8KLSAgTV9WQVhfTkVUQlNEID0gMTQwLAkvKiBOZXRCU0QvdmF4IGJpbmFyeSAqLwotICBNX0FMUEhBX05FVEJTRCA9IDE0MSwJLyogTmV0QlNEL2FscGhhIGJpbmFyeSAqLwotICBNX0FSTTZfTkVUQlNEID0gMTQzLAkvKiBOZXRCU0QvYXJtMzIgYmluYXJ5ICovCi0gIE1fU1BBUkNMRVRfMSA9IDE0NywJLyogMHg5MywgcmVzZXJ2ZWQgKi8KLSAgTV9NSVBTMSA9IDE1MSwgICAgICAgIC8qIE1JUFMgUjIwMDAvUjMwMDAgYmluYXJ5ICovCi0gIE1fTUlQUzIgPSAxNTIsICAgICAgICAvKiBNSVBTIFI0MDAwL1I2MDAwIGJpbmFyeSAqLwotICBNX1NQQVJDTEVUXzIgPSAxNjMsCS8qIDB4YTMsIHJlc2VydmVkICovCi0gIE1fU1BBUkNMRVRfMyA9IDE3OSwJLyogMHhiMywgcmVzZXJ2ZWQgKi8KLSAgTV9TUEFSQ0xFVF80ID0gMTk1LAkvKiAweGMzLCByZXNlcnZlZCAqLwotICBNX0hQMjAwID0gMjAwLAkvKiBIUCAyMDAgKDY4MDEwKSBCU0QgYmluYXJ5ICovCi0gIE1fSFAzMDAgPSAoMzAwICUgMjU2KSwgLyogSFAgMzAwICg2ODAyMCs2ODg4MSkgQlNEIGJpbmFyeSAqLwotICBNX0hQVVggPSAoMHgyMGMgJSAyNTYpLCAvKiBIUCAyMDAvMzAwIEhQVVggYmluYXJ5ICovCi0gIE1fU1BBUkNMRVRfNSA9IDIxMSwJLyogMHhkMywgcmVzZXJ2ZWQgKi8KLSAgTV9TUEFSQ0xFVF82ID0gMjI3LAkvKiAweGUzLCByZXNlcnZlZCAqLwotICAvKiAgTV9TUEFSQ0xFVF83ID0gMjQzCS8gKiAweGYzLCByZXNlcnZlZCAqLwotICBNX1NQQVJDTElURV9MRSA9IDI0MwotfTsKLQotI2RlZmluZSBOX0RZTkFNSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweDgwMDAwMDAwKQotCi0jaWZuZGVmIE5fTUFHSUMKLSMgZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweGZmZmYpCi0jZW5kaWYKLQotI2lmbmRlZiBOX01BQ0hUWVBFCi0jIGRlZmluZSBOX01BQ0hUWVBFKGV4ZWMpICgoZW51bSBtYWNoaW5lX3R5cGUpKCgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4ZmYpKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9GTEFHUwotIyBkZWZpbmUgTl9GTEFHUyhleGVjKSAoKChleGVjKS5hX2luZm8gPj4gMjQpICYgMHhmZikKLSNlbmRpZgotCi0jaWZuZGVmIE5fU0VUX0lORk8KLSMgZGVmaW5lIE5fU0VUX0lORk8oZXhlYywgbWFnaWMsIHR5cGUsIGZsYWdzKSBcCi0oKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKSBcCi0gfCAoKChpbnQpKHR5cGUpICYgMHhmZikgPDwgMTYpIFwKLSB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKLSNlbmRpZgotCi0jaWZuZGVmIE5fU0VUX0RZTkFNSUMKLSMgZGVmaW5lIE5fU0VUX0RZTkFNSUMoZXhlYywgZHluYW1pYykgXAotKChleGVjKS5hX2luZm8gPSAoZHluYW1pYykgPyAoKGV4ZWMpLmFfaW5mbyB8IDB4ODAwMDAwMDApIDogXAotKChleGVjKS5hX2luZm8gJiAweDdmZmZmZmZmKSkKLSNlbmRpZgotCi0jaWZuZGVmIE5fU0VUX01BR0lDCi0jIGRlZmluZSBOX1NFVF9NQUdJQyhleGVjLCBtYWdpYykgXAotKChleGVjKS5hX2luZm8gPSAoKChleGVjKS5hX2luZm8gJiAweGZmZmYwMDAwKSB8ICgobWFnaWMpICYgMHhmZmZmKSkpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NFVF9NQUNIVFlQRQotIyBkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpIFwKLSgoZXhlYykuYV9pbmZvID0gXAotICgoZXhlYykuYV9pbmZvJjB4ZmYwMGZmZmYpIHwgKCgoKGludCkobWFjaHR5cGUpKSYweGZmKSA8PCAxNikpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NFVF9GTEFHUwotIyBkZWZpbmUgTl9TRVRfRkxBR1MoZXhlYywgZmxhZ3MpIFwKLSgoZXhlYykuYV9pbmZvID0gXAotICgoZXhlYykuYV9pbmZvJjB4MDBmZmZmZmYpIHwgKCgoZmxhZ3MpICYgMHhmZikgPDwgMjQpKQotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IGFvdXRfc3ltYm9sIHsKLSAgYXN5bWJvbCBzeW1ib2w7Ci0gIHNob3J0IGRlc2M7Ci0gIGNoYXIgb3RoZXI7Ci0gIHVuc2lnbmVkIGNoYXIgdHlwZTsKLX0gYW91dF9zeW1ib2xfdHlwZTsKLQotLyogVGhlIGB0ZGF0YScgc3RydWN0IGZvciBhbGwgYS5vdXQtbGlrZSBvYmplY3QgZmlsZSBmb3JtYXRzLgotICAgVmFyaW91cyB0aGluZ3MgZGVwZW5kIG9uIHRoaXMgc3RydWN0IGJlaW5nIGFyb3VuZCBhbnkgdGltZSBhbiBhLm91dAotICAgZmlsZSBpcyBiZWluZyBoYW5kbGVkLiAgQW4gZXhhbXBsZSBpcyBkYnhyZWFkLmMgaW4gR0RCLiAgKi8KLQotc3RydWN0IGFvdXRkYXRhIHsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmhkcjsJCS8qIGV4ZWMgZmlsZSBoZWFkZXIgKi8KLSAgYW91dF9zeW1ib2xfdHlwZSAqc3ltYm9sczsJCS8qIHN5bXRhYiBmb3IgaW5wdXQgYmZkICovCi0gIAotICAvKiBGb3IgZWFzZSwgd2UgZG8gdGhpcyAqLwotICBhc2VjdGlvbiAqdGV4dHNlYzsKLSAgYXNlY3Rpb24gKmRhdGFzZWM7Ci0gIGFzZWN0aW9uICpic3NzZWM7Ci0KLSAgLyogV2UgcmVtZW1iZXIgdGhlc2Ugb2Zmc2V0cyBzbyB0aGF0IGFmdGVyIGNoZWNrX2ZpbGVfZm9ybWF0LCB3ZSBoYXZlCi0gICAgIG5vIGRlcGVuZGVuY2llcyBvbiB0aGUgcGFydGljdWxhciBmb3JtYXQgb2YgdGhlIGV4ZWNfaGRyLiAgKi8KLSAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0gIGZpbGVfcHRyIHN0cl9maWxlcG9zOwotCi0gIC8qIFNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5IGluIGV4dGVybmFsIGZvcm0gKi8KLSAgdW5zaWduZWQgcmVsb2NfZW50cnlfc2l6ZTsKLQotICAvKiBTaXplIG9mIGEgc3ltYm9sIHRhYmxlIGVudHJ5IGluIGV4dGVybmFsIGZvcm0gKi8KLSAgdW5zaWduZWQgc3ltYm9sX2VudHJ5X3NpemU7Ci0KLSAgLyogUGFnZSBzaXplIC0gbmVlZGVkIGZvciBhbGlnbm1lbnQgb2YgZGVtYW5kIHBhZ2VkIGZpbGVzLiAqLwotICB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTsKLQotICAvKiBTZWdtZW50IHNpemUgLSBuZWVkZWQgZm9yIGFsaWdubWVudCBvZiBkZW1hbmQgcGFnZWQgZmlsZXMuICovCi0gIHVuc2lnbmVkIGxvbmcgc2VnbWVudF9zaXplOwotCi0gIC8qIFptYWdpYyBkaXNrIGJsb2NrIHNpemUgLSBuZWVkIHRvIGFsaWduIHRoZSBzdGFydCBvZiB0aGUgdGV4dAotICAgICBzZWN0aW9uIGluIFpNQUdJQyBiaW5hcmllcy4gIE5vcm1hbGx5IHRoZSBzYW1lIGFzIHBhZ2Vfc2l6ZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZTsKLQotICB1bnNpZ25lZCBleGVjX2J5dGVzX3NpemU7Ci0gIHVuc2lnbmVkIHZtYV9hZGp1c3RlZCA6IDE7Ci0KLSAgLyogdXNlZCB3aGVuIGEgYmZkIHN1cHBvcnRzIHNldmVyYWwgaGlnaGx5IHNpbWlsYXIgZm9ybWF0cyAqLwotICBlbnVtCi0gICAgewotICAgICAgZGVmYXVsdF9mb3JtYXQgPSAwLAotICAgICAgLyogVXNlZCBvbiBIUCA5MDAwLzMwMCBydW5uaW5nIEhQL1VYLiAgU2VlIGhwMzAwaHB1eC5jLiAgKi8KLSAgICAgIGdudV9lbmNhcF9mb3JtYXQsCi0gICAgICAvKiBVc2VkIG9uIExpbnV4LCAzODZCU0QsIGV0Yy4gIFNlZSBpbmNsdWRlL2FvdXQvYW91dDY0LmguICAqLwotICAgICAgcV9tYWdpY19mb3JtYXQKLSAgICB9IHN1YmZvcm1hdDsKLQotICBlbnVtCi0gICAgewotICAgICAgdW5kZWNpZGVkX21hZ2ljID0gMCwKLSAgICAgIHpfbWFnaWMsCi0gICAgICBvX21hZ2ljLAotICAgICAgbl9tYWdpYwotICAgIH0gbWFnaWM7Ci0KLSAgLyogQSBidWZmZXIgZm9yIGZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgY2hhciAqbGluZV9idWY7Ci0KLSAgLyogVGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqZXh0ZXJuYWxfc3ltczsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fY291bnQ7Ci0gIGJmZF93aW5kb3cgc3ltX3dpbmRvdzsKLSAgY2hhciAqZXh0ZXJuYWxfc3RyaW5nczsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zdHJpbmdfc2l6ZTsKLSAgYmZkX3dpbmRvdyBzdHJpbmdfd2luZG93OwotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotCi0gIC8qIEEgcG9pbnRlciBmb3Igc2hhcmVkIGxpYnJhcnkgaW5mb3JtYXRpb24uICAqLwotICBQVFIgZHluYW1pY19pbmZvOwotCi0gIC8qIEEgbWFwcGluZyBmcm9tIGxvY2FsIHN5bWJvbHMgdG8gb2Zmc2V0cyBpbnRvIHRoZSBnbG9iYWwgb2Zmc2V0Ci0gICAgIHRhYmxlLCB1c2VkIHdoZW4gbGlua2luZyBvbiBTdW5PUy4gIFRoaXMgaXMgaW5kZXhlZCBieSB0aGUgc3ltYm9sCi0gICAgIGluZGV4LiAgKi8KLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci19OwotCi1zdHJ1Y3QgIGFvdXRfZGF0YV9zdHJ1Y3QgewotICAgIHN0cnVjdCBhb3V0ZGF0YSBhOwotICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjIGU7Ci19OwotCi0jZGVmaW5lCWFkYXRhKGJmZCkJCSgoYmZkKS0+dGRhdGEuYW91dF9kYXRhLT5hKQotI2RlZmluZQlleGVjX2hkcihiZmQpCQkoYWRhdGEoYmZkKS5oZHIpCi0jZGVmaW5lCW9ial9hb3V0X3N5bWJvbHMoYmZkKQkoYWRhdGEoYmZkKS5zeW1ib2xzKQotI2RlZmluZQlvYmpfdGV4dHNlYyhiZmQpCShhZGF0YShiZmQpLnRleHRzZWMpCi0jZGVmaW5lCW9ial9kYXRhc2VjKGJmZCkJKGFkYXRhKGJmZCkuZGF0YXNlYykKLSNkZWZpbmUJb2JqX2Jzc3NlYyhiZmQpCQkoYWRhdGEoYmZkKS5ic3NzZWMpCi0jZGVmaW5lCW9ial9zeW1fZmlsZXBvcyhiZmQpCShhZGF0YShiZmQpLnN5bV9maWxlcG9zKQotI2RlZmluZQlvYmpfc3RyX2ZpbGVwb3MoYmZkKQkoYWRhdGEoYmZkKS5zdHJfZmlsZXBvcykKLSNkZWZpbmUJb2JqX3JlbG9jX2VudHJ5X3NpemUoYmZkKSAoYWRhdGEoYmZkKS5yZWxvY19lbnRyeV9zaXplKQotI2RlZmluZQlvYmpfc3ltYm9sX2VudHJ5X3NpemUoYmZkKSAoYWRhdGEoYmZkKS5zeW1ib2xfZW50cnlfc2l6ZSkKLSNkZWZpbmUgb2JqX2FvdXRfc3ViZm9ybWF0KGJmZCkJKGFkYXRhKGJmZCkuc3ViZm9ybWF0KQotI2RlZmluZSBvYmpfYW91dF9leHRlcm5hbF9zeW1zKGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3ltcykKLSNkZWZpbmUgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50KGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3ltX2NvdW50KQotI2RlZmluZSBvYmpfYW91dF9zeW1fd2luZG93KGJmZCkgKGFkYXRhKGJmZCkuc3ltX3dpbmRvdykKLSNkZWZpbmUgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyhiZmQpIChhZGF0YShiZmQpLmV4dGVybmFsX3N0cmluZ3MpCi0jZGVmaW5lIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ19zaXplKGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3RyaW5nX3NpemUpCi0jZGVmaW5lIG9ial9hb3V0X3N0cmluZ193aW5kb3coYmZkKSAoYWRhdGEoYmZkKS5zdHJpbmdfd2luZG93KQotI2RlZmluZSBvYmpfYW91dF9zeW1faGFzaGVzKGJmZCkgKGFkYXRhKGJmZCkuc3ltX2hhc2hlcykKLSNkZWZpbmUgb2JqX2FvdXRfZHluYW1pY19pbmZvKGJmZCkgKGFkYXRhKGJmZCkuZHluYW1pY19pbmZvKQotCi0vKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFuIGFzeW1ib2wgdG8gZW5zdXJlIHRoYXQgdGhlCi0gICBtYWNybyBpcyBvbmx5IGV2ZXIgYXBwbGllZCB0byBhbiBhc3ltYm9sICovCi0jZGVmaW5lIGFvdXRfc3ltYm9sKGFzeW1ib2wpICgoYW91dF9zeW1ib2xfdHlwZSAqKSgmKGFzeW1ib2wpLT50aGVfYmZkKSkKLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgZWFjaCBhLm91dCBzZWN0aW9uLiAgVGhpcyBpcyBjdXJyZW50bHkgb25seQotICAgdXNlZCBieSB0aGUgYS5vdXQgYmFja2VuZCBsaW5rZXIuICAqLwotCi1zdHJ1Y3QgYW91dF9zZWN0aW9uX2RhdGFfc3RydWN0Ci17Ci0gIC8qIFRoZSB1bnN3YXBwZWQgcmVsb2NhdGlvbiBlbnRyaWVzIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICBQVFIgcmVsb2NzOwotfTsKLQotI2RlZmluZSBhb3V0X3NlY3Rpb25fZGF0YShzKSBcCi0gICgoc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCAqKSAocyktPnVzZWRfYnlfYmZkKQotCi0jZGVmaW5lIHNldF9hb3V0X3NlY3Rpb25fZGF0YShzLHYpIFwKLSAgKChzKS0+dXNlZF9ieV9iZmQgPSAoUFRSKSYodiktPnJlbG9jcykKLQotLyogUHJvdG90eXBlIGRlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIGRlZmluZWQgaW4gYW91dHguaCAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSBQQVJBTVMgKChiZmQgKikpOwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLU5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkgICAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwLAotCQkJCSAgICAgICBjb25zdCBiZmRfdGFyZ2V0ICooKmNhbGxiYWNrKShiZmQgKikpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LG1rb2JqZWN0KSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotZW51bSBtYWNoaW5lX3R5cGUKLU5BTUUoYW91dCxtYWNoaW5lX3R5cGUpIFBBUkFNUyAoKGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotCQkJCSB1bnNpZ25lZCBsb25nIG1hY2hpbmUsCi0JCQkJIGJvb2xlYW4gKnVua25vd24pKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LHNldF9hcmNoX21hY2gpIFBBUkFNUyAoKGJmZCAqYWJmZCwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsCi0JCSAJCSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxuZXdfc2VjdGlvbl9ob29rKSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpuZXdzZWN0KSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICphYmZkLCBzZWNfcHRyIHNlY3Rpb24sCi0JCQkgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciBvZmZzZXQsIGJmZF9zaXplX3R5cGUgY291bnQpKTsKLQotYXN5bWJvbCAqCi1OQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkgUEFSQU1TICgoYmZkICosIGFvdXRfc3ltYm9sX3R5cGUgKiwKLQkJCQkJICAgc3RydWN0IGV4dGVybmFsX25saXN0ICosCi0JCQkJCSAgIGJmZF9zaXplX3R5cGUsIGNoYXIgKiwKLQkJCQkJICAgYmZkX3NpemVfdHlwZSwKLQkJCQkJICAgYm9vbGVhbiBkeW5hbWljKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsd3JpdGVfc3ltcykgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxyZWNsYWltX3N5bWJvbF90YWJsZSkgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWxvbmcKLU5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotbG9uZwotTkFNRShhb3V0LGdldF9zeW10YWIpIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKmxvY2F0aW9uKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKiwKLQkJCQkgICAgICBhcmVsZW50ICosIGFzeW1ib2wgKiosIGJmZF9zaXplX3R5cGUpKTsKLXZvaWQKLU5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKiwKLQkJCQkgICAgICBhcmVsZW50ICosIGFzeW1ib2wgKiosIGJmZF9zaXplX3R5cGUpKTsKLQotcmVsb2NfaG93dG9fdHlwZSAqCi1OQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkgICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VjX3B0ciBhc2VjdCwKLQkJCQkgICAgICBhc3ltYm9sICoqc3ltYm9scykpOwotCi1sb25nCi1OQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSBQQVJBTVMgKChiZmQgKmFiZmQsIHNlY19wdHIgc2VjdGlvbiwKLQkJCQkgICAgICAgYXJlbGVudCAqKnJlbHB0ciwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLQotbG9uZwotTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICphYmZkLCBzZWNfcHRyIGFzZWN0KSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxyZWNsYWltX3JlbG9jKSBQQVJBTVMgKChiZmQgKmlnbm9yZV9hYmZkLCBzZWNfcHRyIGlnbm9yZSkpOwotCi1hbGVudCAqCi1OQU1FKGFvdXQsZ2V0X2xpbmVubykgUEFSQU1TICgoYmZkICppZ25vcmVfYWJmZCwgYXN5bWJvbCAqaWdub3JlX3N5bWJvbCkpOwotCi12b2lkCi1OQU1FKGFvdXQscHJpbnRfc3ltYm9sKSBQQVJBTVMgKChiZmQgKmlnbm9yZV9hYmZkLCBQVFIgZmlsZSwKLQkJCSAgICBhc3ltYm9sICpzeW1ib2wsIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3cpKTsKLQotdm9pZAotTkFNRShhb3V0LGdldF9zeW1ib2xfaW5mbykgUEFSQU1TICgoYmZkICppZ25vcmVfYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW1ib2wgKnN5bWJvbCwgc3ltYm9sX2luZm8gKnJldCkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0gICAgICBhc3ltYm9sICoqc3ltYm9scywgYmZkX3ZtYSBvZmZzZXQsIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHIsCi0gICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0ciwgdW5zaWduZWQgaW50ICpsaW5lX3B0cikpOwotCi1sb25nCi1OQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLCB1bnNpZ25lZCBpbnQgKikpOwotCi1hc3ltYm9sICoKLU5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwKLQkJCQkJIGFzeW1ib2wgKikpOwotCi1pbnQKLU5BTUUoYW91dCxzaXplb2ZfaGVhZGVycykgUEFSQU1TICgoYmZkICphYmZkLCBib29sZWFuIGV4ZWMpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgIGJmZF9zaXplX3R5cGUgKnRleHRfc2l6ZSwgZmlsZV9wdHIgKnRleHRfZW5kKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcywgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX291dCkgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCwgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcykpOwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpCi0gICAgIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqLCBiZmQgKiwKLQkgICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCSAgY29uc3QgY2hhciAqKSkpOwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1OQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkgUEFSQU1TICgoYmZkICopKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxmaW5hbF9saW5rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCSAgICAgICB2b2lkICgqKSAoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosCi0JCQkJCSBmaWxlX3B0ciAqKSkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEEub3V0IHVzZXMgdGhlIGdlbmVyaWMgdmVyc2lvbnMgb2YgdGhlc2Ugcm91dGluZXMuLi4gKi8KLQotI2RlZmluZQlhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCV9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotCi0jZGVmaW5lCWFvdXRfNjRfZ2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jaWZuZGVmIE5PX1dSSVRFX0hFQURFUl9LTFVER0UKLSNkZWZpbmUgTk9fV1JJVEVfSEVBREVSX0tMVURHRSAwCi0jZW5kaWYKLQotI2lmbmRlZiBhb3V0XzMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgV1JJVEVfSEVBREVSUwotI2RlZmluZSBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKQkJCQkJICAgICAgXAotICAgICAgewkJCQkJCQkJCSAgICAgIFwKLQliZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsgLyogZHVtbXkgdmFycyAqLwkJCSAgICAgIFwKLQlmaWxlX3B0ciB0ZXh0X2VuZDsJCQkJCQkgICAgICBcCi0JaWYgKGFkYXRhKGFiZmQpLm1hZ2ljID09IHVuZGVjaWRlZF9tYWdpYykJCQkgICAgICBcCi0JICBOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKTsgICAgIFwKLSAgICAJCQkJCQkJCQkgICAgICBcCi0JZXhlY3AtPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogRVhURVJOQUxfTkxJU1RfU0laRTsJICAgICAgXAotCWV4ZWNwLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsJCQkgICAgICBcCi0gICAgCQkJCQkJCQkJICAgICAgXAotCWV4ZWNwLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgICAgXAotCQkJICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCSAgICAgIFwKLQlleGVjcC0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoJCSAgICAgIFwKLQkJCSAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CQkgICAgICBcCi0JTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkgcmV0dXJuIGZhbHNlOwkgICAgICBcCi0JaWYgKGJmZF93cml0ZSAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkJICAgICAgXAotCSAgICAhPSBFWEVDX0JZVEVTX1NJWkUpCQkJCQkJICAgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICAgICBcCi0JLyogTm93IHdyaXRlIG91dCByZWxvYyBpbmZvLCBmb2xsb3dlZCBieSBzeW1zIGFuZCBzdHJpbmdzICovCSAgICAgIFwKLSAgCQkJCQkJCQkJICAgICAgXAotCWlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpICE9IChhc3ltYm9sICoqKSBOVUxMCQkgICAgICBcCi0JICAgICYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApIAkJCQkgICAgICBcCi0JICB7CQkJCQkJCQkgICAgICBcCi0JICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1NZTU9GRigqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApIFwKLQkgICAgICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCSAgICBpZiAoISBOQU1FKGFvdXQsd3JpdGVfc3ltcykoYWJmZCkpIHJldHVybiBmYWxzZTsJCSAgICAgIFwKLQkgIH0JCQkJCQkJCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9UUkVMT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIAkgICAgICBcCi0JaWYgKCFOQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKSAgICAgICAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkgICAgICAJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX0RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSAgICBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgCSAgICAgIFwKLQlpZiAoIU5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkgICAgICAgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIAkgICAgICBcCi0gICAgICB9CQkJCQkJCQkJICAgICAgCi0jZW5kaWYKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoTElCQU9VVF9IKSAqLwpkaWZmIC0tZ2l0IGEvYmZkL2xpYmJmZC1pbi5oIGIvYmZkL2xpYmJmZC1pbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjRhNGRmLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJiZmQtaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDUzOCArMCwwIEBACi0vKiBsaWJiZmQuaCAtLSBEZWNsYXJhdGlvbnMgdXNlZCBieSBiZmQgbGlicmFyeSAqaW1wbGVtZW50YXRpb24qLgotICAgKFRoaXMgaW5jbHVkZSBmaWxlIGlzIG5vdCBmb3IgdXNlcnMgb2YgdGhlIGxpYnJhcnkuKQotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotKiogTk9URTogbGliYmZkLmggaXMgYSBHRU5FUkFURUQgZmlsZS4gIERvbid0IGNoYW5nZSBpdDsgaW5zdGVhZCwKLSoqIGNoYW5nZSBsaWJiZmQtaW4uaCBvciB0aGUgb3RoZXIgQkZEIHNvdXJjZSBmaWxlcyBwcm9jZXNzZWQgdG8KLSoqIGdlbmVyYXRlIHRoaXMgZmlsZS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBbGlnbiBhbiBhZGRyZXNzIHVwd2FyZCB0byBhIGJvdW5kYXJ5LCBleHByZXNzZWQgYXMgYSBudW1iZXIgb2YgYnl0ZXMuCi0gICBFLmcuIGFsaWduIHRvIGFuIDgtYnl0ZSBib3VuZGFyeSB3aXRoIGFyZ3VtZW50IG9mIDguICBUYWtlIGNhcmUgbmV2ZXIKLSAgIHRvIHdyYXAgYXJvdW5kIGlmIHRoZSBhZGRyZXNzIGlzIHdpdGhpbiBib3VuZGFyeS0xIG9mIHRoZSBlbmQgb2YgdGhlCi0gICBhZGRyZXNzIHNwYWNlLiAgKi8KLSNkZWZpbmUgQkZEX0FMSUdOKHRoaXMsIGJvdW5kYXJ5KQkJCQkJXAotICAoKCgoYmZkX3ZtYSkgKHRoaXMpICsgKGJvdW5kYXJ5KSAtIDEpID49IChiZmRfdm1hKSAodGhpcykpCQlcCi0gICA/ICgoKGJmZF92bWEpICh0aGlzKSArICgoYm91bmRhcnkpIC0gMSkpICYgKH4oKGJvdW5kYXJ5KS0xKSkpCVwKLSAgIDogfiAoYmZkX3ZtYSkgMCkKLQotLyogSWYgeW91IHdhbnQgdG8gcmVhZCBhbmQgd3JpdGUgbGFyZ2UgYmxvY2tzLCB5b3UgbWlnaHQgd2FudCB0byBkbyBpdAotICAgaW4gcXVhbnRhIG9mIHRoaXMgYW1vdW50ICovCi0jZGVmaW5lIERFRkFVTFRfQlVGRkVSU0laRSA4MTkyCi0KLS8qIFNldCBhIHRkYXRhIGZpZWxkLiAgQ2FuJ3QgdXNlIHRoZSBvdGhlciBtYWNyb3MgZm9yIHRoaXMsIHNpbmNlIHRoZXkKLSAgIGRvIGNhc3RzLCBhbmQgY2FzdGluZyB0byB0aGUgbGVmdCBvZiBhc3NpZ25tZW50IGlzbid0IHBvcnRhYmxlLiAgKi8KLSNkZWZpbmUgc2V0X3RkYXRhKGJmZCwgdikgKChiZmQpLT50ZGF0YS5hbnkgPSAoUFRSKSAodikpCi0KLS8qIElmIEJGRF9JTl9NRU1PUlkgaXMgc2V0IGZvciBhIEJGRCwgdGhlbiB0aGUgaW9zdHJlYW0gZmllbGRzIHBvaW50cwotICAgdG8gYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgYmZkX2luX21lbW9yeQotewotICAvKiBTaXplIG9mIGJ1ZmZlci4gICovCi0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgLyogQnVmZmVyIGhvbGRpbmcgY29udGVudHMgb2YgQkZELiAgKi8KLSAgYmZkX2J5dGUgKmJ1ZmZlcjsKLX07Ci0KLS8qIHRkYXRhIGZvciBhbiBhcmNoaXZlLiAgRm9yIGFuIGlucHV0IGFyY2hpdmUsIGNhY2hlCi0gICBuZWVkcyB0byBiZSBmcmVlKCknZC4gIEZvciBhbiBvdXRwdXQgYXJjaGl2ZSwgc3ltZGVmcyBkby4gICovCi0KLXN0cnVjdCBhcnRkYXRhIHsKLSAgZmlsZV9wdHIgZmlyc3RfZmlsZV9maWxlcG9zOwotICAvKiBTcGVlZCB1cCBzZWFyY2hpbmcgdGhlIGFybWFwICovCi0gIHN0cnVjdCBhcl9jYWNoZSAqY2FjaGU7Ci0gIGJmZCAqYXJjaGl2ZV9oZWFkOyAgICAgICAgICAgIC8qIE9ubHkgaW50ZXJlc3RpbmcgaW4gb3V0cHV0IHJvdXRpbmVzICovCi0gIGNhcnN5bSAqc3ltZGVmczsJCS8qIHRoZSBzeW1kZWYgZW50cmllcyAqLwotICBzeW1pbmRleCBzeW1kZWZfY291bnQ7ICAgICAgICAgICAgIC8qIGhvdyBtYW55IHRoZXJlIGFyZSAqLwotICBjaGFyICpleHRlbmRlZF9uYW1lczsJCS8qIGNsZXZlciBpbnRlbCBleHRlbnNpb24gKi8KLSAgLyogd2hlbiBtb3JlIGNvbXBpbGVycyBhcmUgc3RhbmRhcmQgQywgdGhpcyBjYW4gYmUgYSB0aW1lX3QgKi8KLSAgbG9uZyAgYXJtYXBfdGltZXN0YW1wOwkvKiBUaW1lc3RhbXAgdmFsdWUgd3JpdHRlbiBpbnRvIGFybWFwLgotCQkJCSAgIFRoaXMgaXMgdXNlZCBmb3IgQlNEIGFyY2hpdmVzIHRvIGNoZWNrCi0JCQkJICAgdGhhdCB0aGUgdGltZXN0YW1wIGlzIHJlY2VudCBlbm91Z2gKLQkJCQkgICBmb3IgdGhlIEJTRCBsaW5rZXIgdG8gbm90IGNvbXBsYWluLAotCQkJCSAgIGp1c3QgYmVmb3JlIHdlIGZpbmlzaCB3cml0aW5nIGFuCi0JCQkJICAgYXJjaGl2ZS4gICovCi0gIGZpbGVfcHRyIGFybWFwX2RhdGVwb3M7CS8qIFBvc2l0aW9uIHdpdGhpbiBhcmNoaXZlIHRvIHNlZWsgdG8KLQkJCQkgICByZXdyaXRlIHRoZSBkYXRlIGZpZWxkLiAgKi8KLSAgUFRSIHRkYXRhOwkJCS8qIEJhY2tlbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotfTsKLQotI2RlZmluZSBiZmRfYXJkYXRhKGJmZCkgKChiZmQpLT50ZGF0YS5hb3V0X2FyX2RhdGEpCi0KLS8qIEdvZXMgaW4gYmZkJ3MgYXJlbHRfZGF0YSBzbG90ICovCi1zdHJ1Y3QgYXJlbHRkYXRhIHsKLSAgY2hhciAqIGFyY2hfaGVhZGVyOwkJCSAgICAgLyogaXQncyBhY3R1YWxseSBhIHN0cmluZyAqLwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7ICAgICAvKiBvY3RldHMgb2YgZmlsZXNpemUgbm90IGluY2x1ZGluZyBhcl9oZHIgKi8KLSAgY2hhciAqZmlsZW5hbWU7CQkJICAgICAvKiBudWxsLXRlcm1pbmF0ZWQgKi8KLX07Ci0KLSNkZWZpbmUgYXJlbHRfc2l6ZShiZmQpICgoKHN0cnVjdCBhcmVsdGRhdGEgKikoKGJmZCktPmFyZWx0X2RhdGEpKS0+cGFyc2VkX3NpemUpCi0KLWV4dGVybiBQVFIgYmZkX21hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3JlYWxsb2MgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3ptYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci0KLWV4dGVybiBiZmRfZXJyb3JfaGFuZGxlcl90eXBlIF9iZmRfZXJyb3JfaGFuZGxlcjsKLQotLyogVGhlc2Ugcm91dGluZXMgYWxsb2NhdGUgYW5kIGZyZWUgdGhpbmdzIG9uIHRoZSBCRkQncyBvYmphbGxvYy4gICovCi0KLWV4dGVybiBQVFIgYmZkX2FsbG9jIFBBUkFNUyAoKGJmZCAqLCBzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3phbGxvYyBQQVJBTVMgKChiZmQgKiwgc2l6ZV90KSk7Ci1leHRlcm4gdm9pZCBiZmRfcmVsZWFzZSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci0KLWJmZCAqCV9iZmRfY3JlYXRlX2VtcHR5X2FyY2hpdmVfZWxlbWVudF9zaGVsbCBQQVJBTVMgKChiZmQgKm9iZmQpKTsKLWJmZCAqCV9iZmRfbG9va19mb3JfYmZkX2luX2NhY2hlIFBBUkFNUyAoKGJmZCAqYXJjaF9iZmQsIGZpbGVfcHRyIGluZGV4KSk7Ci1ib29sZWFuIF9iZmRfYWRkX2JmZF90b19hcmNoaXZlX2NhY2hlIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciwgYmZkICopKTsKLWJvb2xlYW4JX2JmZF9nZW5lcmljX21rYXJjaGl2ZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWNvbnN0IGJmZF90YXJnZXQgKmJmZF9nZW5lcmljX2FyY2hpdmVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4JYmZkX3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbiBiZmRfc2x1cnBfYnNkX2FybWFwX2YyIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotI2RlZmluZSBiZmRfc2x1cnBfYnNkX2FybWFwIGJmZF9zbHVycF9hcm1hcAotI2RlZmluZSBiZmRfc2x1cnBfY29mZl9hcm1hcCBiZmRfc2x1cnBfYXJtYXAKLWJvb2xlYW4JX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1ib29sZWFuCV9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4gX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50IGVsZW5ndGgpKTsKLWJmZCAqX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgUEFSQU1TICgoYmZkICphcmNoaXZlLCBmaWxlX3B0ciBmaWxlcG9zKSk7Ci1leHRlcm4gYmZkICpfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleCBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKTsKLWJmZCAqIF9iZmRfbmV3X2JmZCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWJvb2xlYW4JYmZkX2ZhbHNlIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1ib29sZWFuCWJmZF90cnVlIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1QVFIJYmZkX251bGx2b2lkcHRyIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1pbnQJYmZkXzAgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLXVuc2lnbmVkIGludAliZmRfMHUgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLWxvbmcJYmZkXzBsIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1sb25nCV9iZmRfbjEgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLXZvaWQJYmZkX3ZvaWQgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLQotYmZkICpfYmZkX25ld19iZmRfY29udGFpbmVkX2luIFBBUkFNUyAoKGJmZCAqKSk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpfYmZkX2R1bW15X3RhcmdldCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotdm9pZAliZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpmaWxlbmFtZSwKLQkJCQkJY2hhciAqaGRyKSk7Ci12b2lkCWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqZmlsZW5hbWUsCi0JCQkJCWNoYXIgKmhkcikpOwotdm9pZAliZmRfZ251X3RydW5jYXRlX2FybmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKmZpbGVuYW1lLAotCQkJCQljaGFyICpoZHIpKTsKLQotYm9vbGVhbglic2Rfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICphcmNoLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKLQkJCQkgIHN0cnVjdCBvcmwgKm1hcCwgdW5zaWduZWQgaW50IG9ybF9jb3VudCwgaW50IHN0cmlkeCkpOwotCi1ib29sZWFuCWNvZmZfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICphcmNoLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKLQkJCQkgICBzdHJ1Y3Qgb3JsICptYXAsIHVuc2lnbmVkIGludCBvcmxfY291bnQsIGludCBzdHJpZHgpKTsKLQotZXh0ZXJuIFBUUiBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIgUEFSQU1TICgoYmZkICopKTsKLQotZXh0ZXJuIFBUUiBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotYmZkICoJYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFBBUkFNUyAoKGJmZCAqYXJjaGl2ZSwKLQkJCQkJCSAgICAgYmZkICpsYXN0X2ZpbGUpKTsKLQotaW50CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzdGF0ICopKTsKLQotI2RlZmluZSBfYmZkX3JlYWRfYXJfaGRyKGFiZmQpIFwKLSAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfcmVhZF9hcl9oZHJfZm4sIChhYmZkKSkKLQwKLS8qIEdlbmVyaWMgcm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9HRU5FUklDLiAgVXNlCi0gICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAgYmZkX3RydWUKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvIGJmZF90cnVlCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfdHJ1ZSkKLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciBvZmZzZXQsCi0JICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3dpbmRvdyAqLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0vKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQ09QWS4gIFVzZQotICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKS4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkICosIGFzZWN0aW9uICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBiZmQgKiwgYXN5bWJvbCAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBQVFIpKSkgYmZkX3RydWUpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQ09SRSB3aGVuIHRoZXJlIGlzIG5vIGNvcmUgZmlsZQotICAgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSkuICAqLwotCi1leHRlcm4gY2hhciAqX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGludCBfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHdoZW4gdGhlcmUgaXMgbm8gYXJjaGl2ZQotICAgZmlsZSBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfc2x1cnBfYXJtYXAgYmZkX2ZhbHNlCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgYmZkX2ZhbHNlCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfdHJ1bmNhdGVfYXJuYW1lIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjaGFyICopKSkgYmZkX3ZvaWQpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3dyaXRlX2FybWFwIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3JlYWRfYXJfaGRyIGJmZF9udWxsdm9pZHB0cgotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAotICAoKGJmZCAqKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2dldF9lbHRfYXRfaW5kZXggXAotICAoKGJmZCAqKCopIFBBUkFNUyAoKGJmZCAqLCBzeW1pbmRleCkpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX2ZhbHNlCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSB0byBnZXQgQlNEIHN0eWxlCi0gICBhcmNoaXZlcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKS4gICovCi0KLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9zbHVycF9hcm1hcCBiZmRfc2x1cnBfYnNkX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfdHJ1bmNhdGVfYXJuYW1lIGJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfd3JpdGVfYXJtYXAgYnNkX3dyaXRlX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfcmVhZF9hcl9oZHIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLSAgYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBcCi0gIGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLWV4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgdG8gZ2V0IENPRkYgc3R5bGUKLSAgIGFyY2hpdmVzLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKS4gICovCi0KLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2NvZmZfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpOwotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl90cnVuY2F0ZV9hcm5hbWUgYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3dyaXRlX2FybWFwIGNvZmZfd3JpdGVfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfcmVhZF9hcl9oZHIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gIGJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBcCi0gIGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgd2hlcmUgdGhlcmUgaXMgbm8gc3ltYm9sCi0gICBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX24xCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX21ha2VfZW1wdHlfc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wgXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKiwgYmZkX3ByaW50X3N5bWJvbF90eXBlKSkpIGJmZF92b2lkKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8gXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKSkgYmZkX3ZvaWQpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSkpIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubyBcCi0gICgoYWxlbnQgKigqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUgXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwgXAotCSAgICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgUFRSLCB1bnNpZ25lZCBsb25nKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLCB1bnNpZ25lZCBpbnQgKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbCBcCi0gICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjb25zdCBQVFIsIGFzeW1ib2wgKikpKSBcCi0gICBiZmRfbnVsbHZvaWRwdHIpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIHdoZW4gdGhlcmUgaXMgbm8gcmVsb2MKLSAgIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub3JlbG9jc19nZXRfcmVsb2NfdXBwZXJfYm91bmQgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9yZWxvY3NfY2Fub25pY2FsaXplX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gICgocmVsb2NfaG93dG9fdHlwZSAqKCopIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKSkgXAotICAgYmZkX251bGx2b2lkcHRyKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1dSSVRFIGZvciB0YXJnZXRzIHdoaWNoIG1heSBub3QKLSAgIGJlIHdyaXR0ZW4uICBVc2UgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfbm93cml0ZSkuICAqLwotCi0jZGVmaW5lIF9iZmRfbm93cml0ZV9zZXRfYXJjaF9tYWNoIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub3dyaXRlX3NldF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpKSBcCi0gICBiZmRfZmFsc2UpCi0KLS8qIEdlbmVyaWMgcm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9XUklURS4gIFVzZQotICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYykuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gKLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0xJTksgZm9yIHRhcmdldHMgd2hpY2ggZG8gbm90Ci0gICBzdXBwb3J0IGxpbmtpbmcuICBVc2UgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLiAgKi8KLQotI2RlZmluZSBfYmZkX25vbGlua19zaXplb2ZfaGVhZGVycyAoKGludCAoKikgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKSkgYmZkXzApCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICAoKGJmZF9ieXRlICooKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgXAotCSAgICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpKSBcCi0gICBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9yZWxheF9zZWN0aW9uIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9nY19zZWN0aW9ucyBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICooKikgUEFSQU1TICgoYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfbGlua19hZGRfc3ltYm9scyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKSkgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfZmluYWxfbGluayBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKSkgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfbGlua19zcGxpdF9zZWN0aW9uIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSkpIGJmZF9mYWxzZSkKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIGZvciB0YXJnZXRzIHdoaWNoIGRvIG5vdAotICAgaGF2ZSBkeW5hbWljIHN5bWJvbHMgb3IgcmVsb2NzLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMKLSAgIChfYmZkX25vZHluYW1pYykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX24xCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgX2JmZF9uMQotI2RlZmluZSBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLQwKLS8qIEdlbmVyaWMgcm91dGluZSB0byBkZXRlcm1pbmUgb2YgdGhlIGdpdmVuIHN5bWJvbCBpcyBhIGxvY2FsCi0gICBsYWJlbC4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotLyogR2VuZXJpYyBtaW5pc3ltYm9sIHJvdXRpbmVzLiAgKi8KLWV4dGVybiBsb25nIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwgdW5zaWduZWQgaW50ICopKTsKLWV4dGVybiBhc3ltYm9sICpfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwgYXN5bWJvbCAqKSk7Ci0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB1c2luZyAuc3RhYi8uc3RhYnN0ciBzZWN0aW9ucy4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYm9vbGVhbiAqLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqLCBQVFIgKikpOwotCi0vKiBGaW5kIHRoZSBuZWFkZXJzdCBsaW5lIHVzaW5nIERXQVJGIDEgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB1c2luZyBEV0FSRiAyIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotCi0vKiBBIHJvdXRpbmUgdG8gY3JlYXRlIGVudHJpZXMgZm9yIGEgYmZkX2xpbmtfaGFzaF90YWJsZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnksCi0JICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZSwKLQkgICBjb25zdCBjaGFyICpzdHJpbmcpKTsKLQotLyogSW5pdGlhbGl6ZSBhIGJmZF9saW5rX2hhc2hfdGFibGUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqLCBiZmQgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICopKSk7Ci0KLS8qIEdlbmVyaWMgbGluayBoYXNoIHRhYmxlIGNyZWF0aW9uIHJvdXRpbmUuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBHZW5lcmljIGFkZCBzeW1ib2wgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBHZW5lcmljIGFkZCBzeW1ib2wgcm91dGluZS4gIFRoaXMgdmVyc2lvbiBpcyB1c2VkIGJ5IHRhcmdldHMgZm9yCi0gICB3aGljaCB0aGUgbGlua2VyIG11c3QgY29sbGVjdCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGJ5IG5hbWUsCi0gICBhcyB0aGUgY29sbGVjdDIgcHJvZ3JhbSBkb2VzLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzX2NvbGxlY3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogR2VuZXJpYyBhcmNoaXZlIGFkZCBzeW1ib2wgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCSAgIGJvb2xlYW4gKCpjaGVja2ZuKSAoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpKTsKLQotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gdG8gYXZvaWQgcHJvdG90eXBlIGVycm9ycy4gICovCi10eXBlZGVmIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IF9iZmRfbGlua19oYXNoX2VudHJ5OwotCi0vKiBHZW5lcmljIHJvdXRpbmUgdG8gYWRkIGEgc2luZ2xlIHN5bWJvbC4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqbmFtZSwgZmxhZ3dvcmQsCi0JICAgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuIGNvcHksCi0JICAgYm9vbGVhbiBjb25zdHJ1Y3Rvciwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLQotLyogR2VuZXJpYyBsaW5rIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSk7Ci0KLS8qIEdlbmVyaWMgcmVsb2NfbGlua19vcmRlciBwcm9jZXNzaW5nIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogRGVmYXVsdCBsaW5rIG9yZGVyIHByb2Nlc3Npbmcgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2RlZmF1bHRfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0vKiBDb3VudCB0aGUgbnVtYmVyIG9mIHJlbG9jIGVudHJpZXMgaW4gYSBsaW5rIG9yZGVyIGxpc3QuICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBfYmZkX2NvdW50X2xpbmtfb3JkZXJfcmVsb2NzCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIEZpbmFsIGxpbmsgcmVsb2NhdGlvbiByb3V0aW5lLiAgKi8KLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgYmZkX3ZtYSBhZGRyZXNzLCBiZmRfdm1hIHZhbHVlLCBiZmRfdm1hIGFkZGVuZCkpOwotCi0vKiBSZWxvY2F0ZSBhIHBhcnRpY3VsYXIgbG9jYXRpb24gYnkgYSBob3d0byBhbmQgYSB2YWx1ZS4gICovCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfcmVsb2NhdGVfY29udGVudHMKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotCi0vKiBMaW5rIHN0YWJzIGluIHNlY3Rpb25zIGluIHRoZSBmaXJzdCBwYXNzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMKLSAgUEFSQU1TICgoYmZkICosIFBUUiAqLCBhc2VjdGlvbiAqLCBhc2VjdGlvbiAqLCBQVFIgKikpOwotCi0vKiBXcml0ZSBvdXQgdGhlIC5zdGFiIHNlY3Rpb24gd2hlbiBsaW5raW5nIHN0YWJzIGluIHNlY3Rpb25zLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIgKiwgYXNlY3Rpb24gKiwgUFRSICosIGJmZF9ieXRlICopKTsKLQotLyogV3JpdGUgb3V0IHRoZSAuc3RhYnN0ciBzdHJpbmcgdGFibGUgd2hlbiBsaW5raW5nIHN0YWJzIGluIHNlY3Rpb25zLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF93cml0ZV9zdGFiX3N0cmluZ3MgUEFSQU1TICgoYmZkICosIFBUUiAqKSk7Ci0KLS8qIEZpbmQgYW4gb2Zmc2V0IHdpdGhpbiBhIC5zdGFiIHNlY3Rpb24gd2hlbiBsaW5raW5nIHN0YWJzIGluCi0gICBzZWN0aW9ucy4gICovCi0KLWV4dGVybiBiZmRfdm1hIF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotICBQQVJBTVMgKChiZmQgKiwgUFRSICosIGFzZWN0aW9uICosIFBUUiAqLCBiZmRfdm1hKSk7Ci0KLS8qIENyZWF0ZSBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqX2JmZF9zdHJpbmd0YWJfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIENyZWF0ZSBhbiBYQ09GRiAuZGVidWcgc2VjdGlvbiBzdHlsZSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKl9iZmRfeGNvZmZfc3RyaW5ndGFiX2luaXQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBGcmVlIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIF9iZmRfc3RyaW5ndGFiX2ZyZWUgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKSk7Ci0KLS8qIEdldCB0aGUgc2l6ZSBvZiBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gYmZkX3NpemVfdHlwZSBfYmZkX3N0cmluZ3RhYl9zaXplIFBBUkFNUyAoKHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOwotCi0vKiBBZGQgYSBzdHJpbmcgdG8gYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgX2JmZF9zdHJpbmd0YWJfYWRkCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKiwgY29uc3QgY2hhciAqLCBib29sZWFuIGhhc2gsCi0JICAgYm9vbGVhbiBjb3B5KSk7Ci0KLS8qIFdyaXRlIG91dCBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX3N0cmluZ3RhYl9lbWl0IFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQwKLS8qIE1hY3JvcyB0byB0ZWxsIGlmIGJmZHMgYXJlIHJlYWQgb3Igd3JpdGUgZW5hYmxlZC4KLQotICAgTm90ZSB0aGF0IGJmZHMgb3BlbiBmb3IgcmVhZCBtYXkgYmUgc2NyaWJibGVkIGludG8gaWYgdGhlIGZkIHBhc3NlZAotICAgdG8gYmZkX2Zkb3BlbnIgaXMgYWN0dWFsbHkgb3BlbiBib3RoIGZvciByZWFkIGFuZCB3cml0ZQotICAgc2ltdWx0YW5lb3VzbHkuICBIb3dldmVyIGFuIG91dHB1dCBiZmQgd2lsbCBuZXZlciBiZSBvcGVuIGZvcgotICAgcmVhZC4gIFRoZXJlZm9yZSBzb21ldGltZXMgeW91IHdhbnQgdG8gY2hlY2sgYmZkX3JlYWRfcCBvcgotICAgIWJmZF9yZWFkX3AsIGFuZCBvbmx5IHNvbWV0aW1lcyBiZmRfd3JpdGVfcC4KLSovCi0KLSNkZWZpbmUJYmZkX3JlYWRfcChhYmZkKSAoKGFiZmQpLT5kaXJlY3Rpb24gPT0gcmVhZF9kaXJlY3Rpb24gfHwgKGFiZmQpLT5kaXJlY3Rpb24gPT0gYm90aF9kaXJlY3Rpb24pCi0jZGVmaW5lCWJmZF93cml0ZV9wKGFiZmQpICgoYWJmZCktPmRpcmVjdGlvbiA9PSB3cml0ZV9kaXJlY3Rpb24gfHwgKGFiZmQpLT5kaXJlY3Rpb24gPT0gYm90aF9kaXJlY3Rpb24pCi0KLXZvaWQJYmZkX2Fzc2VydCBQQVJBTVMgKChjb25zdCBjaGFyKixpbnQpKTsKLQotI2RlZmluZSBCRkRfQVNTRVJUKHgpIFwKLXsgaWYgKCEoeCkpIGJmZF9hc3NlcnQoX19GSUxFX18sX19MSU5FX18pOyB9Ci0KLSNkZWZpbmUgQkZEX0ZBSUwoKSBcCi17IGJmZF9hc3NlcnQoX19GSUxFX18sX19MSU5FX18pOyB9Ci0KLUZJTEUgKgliZmRfY2FjaGVfbG9va3VwX3dvcmtlciBQQVJBTVMgKChiZmQgKikpOwotCi1leHRlcm4gYmZkICpiZmRfbGFzdF9jYWNoZTsKLQotLyogTGlzdCBvZiBzdXBwb3J0ZWQgdGFyZ2V0IHZlY3RvcnMsIGFuZCB0aGUgZGVmYXVsdCB2ZWN0b3IgKGlmCi0gICBiZmRfZGVmYXVsdF92ZWN0b3JbMF0gaXMgTlVMTCwgdGhlcmUgaXMgbm8gZGVmYXVsdCkuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCBiZmRfdGFyZ2V0X3ZlY3RvcltdOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9kZWZhdWx0X3ZlY3RvcltdOwotCi0vKiBGdW5jdGlvbnMgc2hhcmVkIGJ5IHRoZSBFQ09GRiBhbmQgTUlQUyBFTEYgYmFja2VuZHMsIHdoaWNoIGhhdmUgbm8KLSAgIG90aGVyIGNvbW1vbiBoZWFkZXIgZmlsZXMuICAqLwotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLXN0cnVjdCBlY29mZl9maW5kX2xpbmU7Ci0jZW5kaWYKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9sb2NhdGVfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCwKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0LCBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICosCi0JICAgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3BkciBQQVJBTVMgKChQVFIsIGJmZF9ieXRlICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3N5bSBQQVJBTVMgKChQVFIsIGJmZF9ieXRlICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOwotCi1leHRlcm4gYmZkX3ZtYSBfYmZkX2dldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9zZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICosIGJmZF92bWEpKTsKLQotLyogRnVuY3Rpb24gc2hhcmVkIGJ5IHRoZSBDT0ZGIGFuZCBFTEYgU0ggYmFja2VuZHMsIHdoaWNoIGhhdmUgbm8KLSAgIG90aGVyIGNvbW1vbiBoZWFkZXIgZmlsZXMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3NoX2FsaWduX2xvYWRfc3BhbgotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBib29sZWFuICgqKSAoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSksCi0JICAgUFRSLCBiZmRfdm1hICoqLCBiZmRfdm1hICosIGJmZF92bWEsIGJmZF92bWEsIGJvb2xlYW4gKikpOwotCi0vKiBBbmQgbW9yZSBmb2xsb3dzICovCi0KZGlmZiAtLWdpdCBhL2JmZC9saWJiZmQuYyBiL2JmZC9saWJiZmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFiZDFmNS4uMDAwMDAwMAotLS0gYS9iZmQvbGliYmZkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYzICswLDAgQEAKLS8qIEFzc29ydGVkIEJGRCBzdXBwb3J0IHJvdXRpbmVzLCBvbmx5IHVzZWQgaW50ZXJuYWxseS4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jZGVmaW5lIGdldHBhZ2VzaXplKCkgMjA0OAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgcmVhbF9yZWFkIFBBUkFNUyAoKFBUUiwgc2l6ZV90LCBzaXplX3QsIEZJTEUgKikpOwotCi0vKgotU0VDVElPTgotCUludGVybmFsIGZ1bmN0aW9ucwotCi1ERVNDUklQVElPTgotCVRoZXNlIHJvdXRpbmVzIGFyZSB1c2VkIHdpdGhpbiBCRkQuCi0JVGhleSBhcmUgbm90IGludGVuZGVkIGZvciBleHBvcnQsIGJ1dCBhcmUgZG9jdW1lbnRlZCBoZXJlIGZvcgotCWNvbXBsZXRlbmVzcy4KLSovCi0KLS8qIEEgcm91dGluZSB3aGljaCBpcyB1c2VkIGluIHRhcmdldCB2ZWN0b3JzIGZvciB1bnN1cHBvcnRlZAotICAgb3BlcmF0aW9ucy4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotYmZkX2ZhbHNlIChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEEgcm91dGluZSB3aGljaCBpcyB1c2VkIGluIHRhcmdldCB2ZWN0b3JzIGZvciBzdXBwb3J0ZWQgb3BlcmF0aW9ucwotICAgd2hpY2ggZG8gbm90IGFjdHVhbGx5IGRvIGFueXRoaW5nLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1iZmRfdHJ1ZSAoaWdub3JlKQotICAgICBiZmQgKmlnbm9yZTsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEEgcm91dGluZSB3aGljaCBpcyB1c2VkIGluIHRhcmdldCB2ZWN0b3JzIGZvciB1bnN1cHBvcnRlZAotICAgb3BlcmF0aW9ucyB3aGljaCByZXR1cm4gYSBwb2ludGVyIHZhbHVlLiAgKi8KLQotLypBUkdTVVNFRCovCi1QVFIKLWJmZF9udWxsdm9pZHB0ciAoaWdub3JlKQotICAgICBiZmQgKmlnbm9yZTsKLXsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qQVJHU1VTRUQqLwotaW50IAotYmZkXzAgKGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmU7Ci17Ci0gIHJldHVybiAwOwotfQotCi0vKkFSR1NVU0VEKi8KLXVuc2lnbmVkIGludCAKLWJmZF8wdSAoaWdub3JlKQotICAgICBiZmQgKmlnbm9yZTsKLXsKLSAgIHJldHVybiAwOwotfQotCi0vKkFSR1VTRUQqLwotbG9uZwotYmZkXzBsIChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlOwotewotICByZXR1cm4gMDsKLX0KLQotLyogQSByb3V0aW5lIHdoaWNoIGlzIHVzZWQgaW4gdGFyZ2V0IHZlY3RvcnMgZm9yIHVuc3VwcG9ydGVkCi0gICBvcGVyYXRpb25zIHdoaWNoIHJldHVybiAtMSBvbiBlcnJvci4gICovCi0KLS8qQVJHU1VTRUQqLwotbG9uZwotX2JmZF9uMSAoaWdub3JlX2FiZmQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci17Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiAtMTsKLX0KLQotLypBUkdTVVNFRCovCi12b2lkIAotYmZkX3ZvaWQgKGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmU7Ci17Ci19Ci0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF9ub2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChpZ25vcmVfY29yZV9iZmQsIGlnbm9yZV9leGVjX2JmZCkKLSAgICAgYmZkICppZ25vcmVfY29yZV9iZmQ7Ci0gICAgIGJmZCAqaWdub3JlX2V4ZWNfYmZkOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJvdXRpbmUgdG8gaGFuZGxlIGNvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgZW50cnkgcG9pbnQgZm9yIHRhcmdldHMKLSAgIHdpdGhvdXQgY29yZSBmaWxlIHN1cHBvcnQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWNoYXIgKgotX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoaWdub3JlX2FiZmQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci17Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiAoY2hhciAqKU5VTEw7Ci19Ci0KLS8qIFJvdXRpbmUgdG8gaGFuZGxlIGNvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBlbnRyeSBwb2ludCBmb3IgdGFyZ2V0cwotICAgd2l0aG91dCBjb3JlIGZpbGUgc3VwcG9ydC4gICovCi0KLS8qQVJHU1VTRUQqLwotaW50Ci1fYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGlnbm9yZV9hYmZkKQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gMDsKLX0KLQotLypBUkdTVVNFRCovCi1jb25zdCBiZmRfdGFyZ2V0ICoKLV9iZmRfZHVtbXlfdGFyZ2V0IChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLXsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gIHJldHVybiAwOwotfQotDAotLyogQWxsb2NhdGUgbWVtb3J5IHVzaW5nIG1hbGxvYy4gICovCi0KLVBUUgotYmZkX21hbGxvYyAoc2l6ZSkKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIFBUUiBwdHI7Ci0KLSAgcHRyID0gKFBUUikgbWFsbG9jIChzaXplKTsKLSAgaWYgKHB0ciA9PSBOVUxMICYmIHNpemUgIT0gMCkKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogUmVhbGxvY2F0ZSBtZW1vcnkgdXNpbmcgcmVhbGxvYy4gICovCi0KLVBUUgotYmZkX3JlYWxsb2MgKHB0ciwgc2l6ZSkKLSAgICAgUFRSIHB0cjsKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIFBUUiByZXQ7Ci0KLSAgaWYgKHB0ciA9PSBOVUxMKQotICAgIHJldCA9IG1hbGxvYyAoc2l6ZSk7Ci0gIGVsc2UKLSAgICByZXQgPSByZWFsbG9jIChwdHIsIHNpemUpOwotCi0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBBbGxvY2F0ZSBtZW1vcnkgdXNpbmcgbWFsbG9jIGFuZCBjbGVhciBpdC4gICovCi0KLVBUUgotYmZkX3ptYWxsb2MgKHNpemUpCi0gICAgIHNpemVfdCBzaXplOwotewotICBQVFIgcHRyOwotCi0gIHB0ciA9IChQVFIpIG1hbGxvYyAoc2l6ZSk7Ci0KLSAgaWYgKHNpemUgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAocHRyID09IE5VTEwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICBlbHNlCi0JbWVtc2V0IChwdHIsIDAsIHNpemUpOwotICAgIH0KLQotICByZXR1cm4gcHRyOwotfQotDAotLyogU29tZSBJTyBjb2RlICovCi0KLQotLyogTm90ZSB0aGF0IGFyY2hpdmUgZW50cmllcyBkb24ndCBoYXZlIHN0cmVhbXM7IHRoZXkgc2hhcmUgdGhlaXIgcGFyZW50J3MuCi0gICBUaGlzIGFsbG93cyBzb21lb25lIHRvIHBsYXkgd2l0aCB0aGUgaW9zdHJlYW0gYmVoaW5kIEJGRCdzIGJhY2suCi0KLSAgIEFsc28sIG5vdGUgdGhhdCB0aGUgb3JpZ2luIHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBmaWxlJ3MKLSAgIGNvbnRlbnRzICgwIGZvciBub24tYXJjaGl2ZSBlbGVtZW50cykuICBGb3IgYXJjaGl2ZSBlbnRyaWVzIHRoaXMgaXMgdGhlCi0gICBmaXJzdCBvY3RldCBpbiB0aGUgZmlsZSwgTk9UIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFyY2hpdmUgaGVhZGVyLiAqLwotCi1zdGF0aWMgaW50Ci1yZWFsX3JlYWQgKHdoZXJlLCBhLGIsIGZpbGUpCi0gICAgIFBUUiB3aGVyZTsKLSAgICAgc2l6ZV90IGE7Ci0gICAgIHNpemVfdCBiOwotICAgICBGSUxFICpmaWxlOwotewotICAvKiBGSVhNRSAtIHRoaXMgbG9va3MgbGlrZSBhbiBvcHRpbWl6YXRpb24sIGJ1dCBpdCdzIHJlYWxseSB0byBjb3ZlcgotICAgICB1cCBmb3IgYSBmZWF0dXJlIG9mIHNvbWUgT1NzIChub3Qgc29sYXJpcyAtIHNpZ2gpIHRoYXQKLSAgICAgbGQvcGUtZGxsLmMgdGFrZXMgYWR2YW50YWdlIG9mIChhcHBhcmVudGx5KSB3aGVuIGl0IGNyZWF0ZXMgQkZEcwotICAgICBpbnRlcm5hbGx5IGFuZCB0cmllcyB0byBsaW5rIGFnYWluc3QgdGhlbS4gIEJGRCBzZWVtcyB0byBiZSBzbWFydAotICAgICBlbm91Z2ggdG8gcmVhbGl6ZSB0aGVyZSBhcmUgbm8gc3ltYm9sIHJlY29yZHMgaW4gdGhlICJmaWxlIiB0aGF0Ci0gICAgIGRvZXNuJ3QgZXhpc3QgYnV0IGF0dGVtcHRzIHRvIHJlYWQgdGhlbSBhbnl3YXkuICBPbiBTb2xhcmlzLAotICAgICBhdHRlbXB0aW5nIHRvIHJlYWQgemVybyBieXRlcyBmcm9tIGEgTlVMTCBmaWxlIHJlc3VsdHMgaW4gYSBjb3JlCi0gICAgIGR1bXAsIGJ1dCBvbiBvdGhlciBwbGF0Zm9ybXMgaXQganVzdCByZXR1cm5zIHplcm8gYnl0ZXMgcmVhZC4KLSAgICAgVGhpcyBtYWtlcyBpdCB0byBzb21ldGhpbmcgcmVhc29uYWJsZS4gLSBESiAqLwotICBpZiAoYSA9PSAwIHx8IGIgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotI2lmIGRlZmluZWQgKF9fVkFYKSAmJiBkZWZpbmVkIChWTVMpCi0gIC8qIEFwcGFyZW50bHkgZnJlYWQgb24gVmF4IFZNUyBkb2VzIG5vdCBrZWVwIHRoZSByZWNvcmQgbGVuZ3RoCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgcmV0dXJuIHJlYWQgKGZpbGVubyAoZmlsZSksIHdoZXJlLCBhICogYik7Ci0jZWxzZQotICByZXR1cm4gZnJlYWQgKHdoZXJlLCBhLCBiLCBmaWxlKTsKLSNlbmRpZgotfQotCi0vKiBSZXR1cm4gdmFsdWUgaXMgYW1vdW50IHJlYWQgKEZJWE1FOiBob3cgYXJlIGVycm9ycyBhbmQgZW5kIG9mIGZpbGUgZGVhbHQKLSAgIHdpdGg/ICBXZSBuZXZlciBjYWxsIGJmZF9zZXRfZXJyb3IsIHdoaWNoIGlzIHByb2JhYmx5IGEgbWlzdGFrZSkuICAqLwotCi1iZmRfc2l6ZV90eXBlCi1iZmRfcmVhZCAocHRyLCBzaXplLCBuaXRlbXMsIGFiZmQpCi0gICAgIFBUUiBwdHI7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgYmZkX3NpemVfdHlwZSBuaXRlbXM7Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IG5yZWFkOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfaW5fbWVtb3J5ICpiaW07Ci0gICAgICBiZmRfc2l6ZV90eXBlIGdldDsKLQotICAgICAgYmltID0gKHN0cnVjdCBiZmRfaW5fbWVtb3J5ICopIGFiZmQtPmlvc3RyZWFtOwotICAgICAgZ2V0ID0gc2l6ZSAqIG5pdGVtczsKLSAgICAgIGlmIChhYmZkLT53aGVyZSArIGdldCA+IGJpbS0+c2l6ZSkKLQl7Ci0JICBnZXQgPSBiaW0tPnNpemUgLSBhYmZkLT53aGVyZTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JfQotICAgICAgbWVtY3B5IChwdHIsIGJpbS0+YnVmZmVyICsgYWJmZC0+d2hlcmUsIGdldCk7Ci0gICAgICBhYmZkLT53aGVyZSArPSBnZXQ7Ci0gICAgICByZXR1cm4gZ2V0OwotICAgIH0KLQotICBucmVhZCA9IHJlYWxfcmVhZCAocHRyLCAxLCAoc2l6ZV90KShzaXplKm5pdGVtcyksIGJmZF9jYWNoZV9sb29rdXAoYWJmZCkpOwotICBpZiAobnJlYWQgPiAwKQotICAgIGFiZmQtPndoZXJlICs9IG5yZWFkOwotCi0gIC8qIFNldCBiZmRfZXJyb3IgaWYgd2UgZGlkIG5vdCByZWFkIGFzIG11Y2ggZGF0YSBhcyB3ZSBleHBlY3RlZC4KLQotICAgICBJZiB0aGUgcmVhZCBmYWlsZWQgZHVlIHRvIGFuIGVycm9yIHNldCB0aGUgYmZkX2Vycm9yX3N5c3RlbV9jYWxsLAotICAgICBlbHNlIHNldCBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQuCi0KLSAgICAgQSBCRkQgYmFja2VuZCBtYXkgd2lzaCB0byBvdmVycmlkZSBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQgdG8KLSAgICAgcHJvdmlkZSBzb21ldGhpbmcgbW9yZSB1c2VmdWwgKGVnLiBub19zeW1ib2xzIG9yIHdyb25nX2Zvcm1hdCkuICAqLwotICBpZiAobnJlYWQgPCAoaW50KShzaXplICogbml0ZW1zKSkKLSAgICB7Ci0gICAgICBpZiAoZmVycm9yIChiZmRfY2FjaGVfbG9va3VwIChhYmZkKSkpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIGVsc2UKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgIH0KLQotICByZXR1cm4gbnJlYWQ7Ci19Ci0KLS8qIFRoZSB3aW5kb3cgc3VwcG9ydCBzdHVmZiBzaG91bGQgcHJvYmFibHkgYmUgYnJva2VuIG91dCBpbnRvCi0gICBhbm90aGVyIGZpbGUuLi4uICAqLwotLyogVGhlIGlkZWEgYmVoaW5kIHRoZSBuZXh0IGFuZCByZWZjb3VudCBmaWVsZHMgaXMgdGhhdCBvbmUgbWFwcGVkCi0gICByZWdpb24gY2FuIHN1ZmZpY2UgZm9yIG11bHRpcGxlIHJlYWQtb25seSB3aW5kb3dzIG9yIG11bHRpcGxlCi0gICBub24tb3ZlcmxhcHBpbmcgcmVhZC13cml0ZSB3aW5kb3dzLiAgSXQncyBub3QgaW1wbGVtZW50ZWQgeWV0Ci0gICB0aG91Z2guICAqLwotc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsIHsKLSAgc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsICpuZXh0OwotICBQVFIgZGF0YTsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBpbnQgcmVmY291bnQgOiAzMTsJCS8qIHNob3VsZCBiZSBlbm91Z2guLi4gKi8KLSAgdW5zaWduZWQgbWFwcGVkIDogMTsJCS8qIDEgPSBtbWFwLCAwID0gbWFsbG9jICovCi19OwotCi12b2lkCi1iZmRfaW5pdF93aW5kb3cgKHdpbmRvd3ApCi0gICAgIGJmZF93aW5kb3cgKndpbmRvd3A7Ci17Ci0gIHdpbmRvd3AtPmRhdGEgPSAwOwotICB3aW5kb3dwLT5pID0gMDsKLSAgd2luZG93cC0+c2l6ZSA9IDA7Ci19Ci0MCi0vKiBDdXJyZW50bHksIGlmIFVTRV9NTUFQIGlzIHVuZGVmaW5lZCwgbm9uZSBpZiB0aGUgd2luZG93IHN0dWZmIGlzCi0gICB1c2VkLiAgT2theSwgc28gaXQncyBtaXMtbmFtZWQuICBBdCBsZWFzdCB0aGUgY29tbWFuZC1saW5lIG9wdGlvbgotICAgIi0td2l0aG91dC1tbWFwIiBpcyBtb3JlIG9idmlvdXMgdGhhbiAiLS13aXRob3V0LXdpbmRvd3MiIG9yIHNvbWUKLSAgIHN1Y2guICAqLwotI2lmZGVmIFVTRV9NTUFQCi0KLSN1bmRlZiBIQVZFX01QUk9URUNUIC8qIGNvZGUncyBub3QgdGVzdGVkIHlldCAqLwotCi0jaWYgSEFWRV9NTUFQIHx8IEhBVkVfTVBST1RFQ1QgfHwgSEFWRV9NQURWSVNFCi0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNlbmRpZgotCi0jaWZuZGVmIE1BUF9GSUxFCi0jZGVmaW5lIE1BUF9GSUxFIDAKLSNlbmRpZgotCi1zdGF0aWMgaW50IGRlYnVnX3dpbmRvd3M7Ci0KLXZvaWQKLWJmZF9mcmVlX3dpbmRvdyAod2luZG93cCkKLSAgICAgYmZkX3dpbmRvdyAqd2luZG93cDsKLXsKLSAgYmZkX3dpbmRvd19pbnRlcm5hbCAqaSA9IHdpbmRvd3AtPmk7Ci0gIHdpbmRvd3AtPmkgPSAwOwotICB3aW5kb3dwLT5kYXRhID0gMDsKLSAgaWYgKGkgPT0gMCkKLSAgICByZXR1cm47Ci0gIGktPnJlZmNvdW50LS07Ci0gIGlmIChkZWJ1Z193aW5kb3dzKQotICAgIGZwcmludGYgKHN0ZGVyciwgImZyZWVpbmcgd2luZG93IEAlcDwlcCwlbHgsJXA+XG4iLAotCSAgICAgd2luZG93cCwgd2luZG93cC0+ZGF0YSwgd2luZG93cC0+c2l6ZSwgd2luZG93cC0+aSk7Ci0gIGlmIChpLT5yZWZjb3VudCAhPSAwKQotICAgIHJldHVybjsKLQotICBpZiAoaS0+bWFwcGVkKQotICAgIHsKLSNpZmRlZiBIQVZFX01NQVAKLSAgICAgIG11bm1hcCAoaS0+ZGF0YSwgaS0+c2l6ZSk7Ci0gICAgICBnb3RvIG5vX2ZyZWU7Ci0jZWxzZQotICAgICAgYWJvcnQgKCk7Ci0jZW5kaWYKLSAgICB9Ci0jaWZkZWYgSEFWRV9NUFJPVEVDVAotICBtcHJvdGVjdCAoaS0+ZGF0YSwgaS0+c2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7Ci0jZW5kaWYKLSAgZnJlZSAoaS0+ZGF0YSk7Ci0jaWZkZWYgSEFWRV9NTUFQCi0gbm9fZnJlZToKLSNlbmRpZgotICBpLT5kYXRhID0gMDsKLSAgLyogVGhlcmUgc2hvdWxkIGJlIG5vIG1vcmUgcmVmZXJlbmNlcyB0byBpIGF0IHRoaXMgcG9pbnQuICAqLwotICBmcmVlIChpKTsKLX0KLQotc3RhdGljIGludCBva190b19tYXAgPSAxOwotCi1ib29sZWFuCi1iZmRfZ2V0X2ZpbGVfd2luZG93IChhYmZkLCBvZmZzZXQsIHNpemUsIHdpbmRvd3AsIHdyaXRhYmxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICBiZmRfd2luZG93ICp3aW5kb3dwOwotICAgICBib29sZWFuIHdyaXRhYmxlOwotewotICBzdGF0aWMgc2l6ZV90IHBhZ2VzaXplOwotICBiZmRfd2luZG93X2ludGVybmFsICppID0gd2luZG93cC0+aTsKLSAgc2l6ZV90IHNpemVfdG9fYWxsb2MgPSBzaXplOwotCi0gIGlmIChkZWJ1Z193aW5kb3dzKQotICAgIGZwcmludGYgKHN0ZGVyciwgImJmZF9nZXRfZmlsZV93aW5kb3cgKCVwLCAlNmxkLCAlNmxkLCAlcDwlcCwlbHgsJXA+LCAlZCkiLAotCSAgICAgYWJmZCwgKGxvbmcpIG9mZnNldCwgKGxvbmcpIHNpemUsCi0JICAgICB3aW5kb3dwLCB3aW5kb3dwLT5kYXRhLCAodW5zaWduZWQgbG9uZykgd2luZG93cC0+c2l6ZSwKLQkgICAgIHdpbmRvd3AtPmksIHdyaXRhYmxlKTsKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB0aGUgcGFnZSBzaXplLCBzbyB3ZSBjYW4gYmUgZnJpZW5kbHkgdG8gbW1hcC4gICovCi0gIGlmIChwYWdlc2l6ZSA9PSAwKQotICAgIHBhZ2VzaXplID0gZ2V0cGFnZXNpemUgKCk7Ci0gIGlmIChwYWdlc2l6ZSA9PSAwKQotICAgIGFib3J0ICgpOwotCi0gIGlmIChpID09IDApCi0gICAgewotICAgICAgd2luZG93cC0+aSA9IGkgPSAoYmZkX3dpbmRvd19pbnRlcm5hbCAqKSBiZmRfem1hbGxvYyAoc2l6ZW9mIChiZmRfd2luZG93X2ludGVybmFsKSk7Ci0gICAgICBpZiAoaSA9PSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGktPmRhdGEgPSAwOwotICAgIH0KLSNpZmRlZiBIQVZFX01NQVAKLSAgaWYgKG9rX3RvX21hcAotICAgICAgJiYgKGktPmRhdGEgPT0gMCB8fCBpLT5tYXBwZWQgPT0gMSkKLSAgICAgICYmIChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpID09IDApCi0gICAgewotICAgICAgZmlsZV9wdHIgZmlsZV9vZmZzZXQsIG9mZnNldDI7Ci0gICAgICBzaXplX3QgcmVhbF9zaXplOwotICAgICAgaW50IGZkOwotICAgICAgRklMRSAqZjsKLQotICAgICAgLyogRmluZCB0aGUgcmVhbCBmaWxlIGFuZCB0aGUgcmVhbCBvZmZzZXQgaW50byBpdC4gICovCi0gICAgICB3aGlsZSAoYWJmZC0+bXlfYXJjaGl2ZSAhPSBOVUxMKQotCXsKLQkgIG9mZnNldCArPSBhYmZkLT5vcmlnaW47Ci0JICBhYmZkID0gYWJmZC0+bXlfYXJjaGl2ZTsKLQl9Ci0gICAgICBmID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gICAgICBmZCA9IGZpbGVubyAoZik7Ci0KLSAgICAgIC8qIENvbXB1dGUgb2Zmc2V0cyBhbmQgc2l6ZSBmb3IgbW1hcCBhbmQgZm9yIHRoZSB1c2VyJ3MgZGF0YS4gICovCi0gICAgICBvZmZzZXQyID0gb2Zmc2V0ICUgcGFnZXNpemU7Ci0gICAgICBpZiAob2Zmc2V0MiA8IDApCi0JYWJvcnQgKCk7Ci0gICAgICBmaWxlX29mZnNldCA9IG9mZnNldCAtIG9mZnNldDI7Ci0gICAgICByZWFsX3NpemUgPSBvZmZzZXQgKyBzaXplIC0gZmlsZV9vZmZzZXQ7Ci0gICAgICByZWFsX3NpemUgPSByZWFsX3NpemUgKyBwYWdlc2l6ZSAtIDE7Ci0gICAgICByZWFsX3NpemUgLT0gcmVhbF9zaXplICUgcGFnZXNpemU7Ci0KLSAgICAgIC8qIElmIHdlJ3JlIHJlLXVzaW5nIGEgbWVtb3J5IHJlZ2lvbiwgbWFrZSBzdXJlIGl0J3MgYmlnIGVub3VnaC4gICovCi0gICAgICBpZiAoaS0+ZGF0YSAmJiBpLT5zaXplIDwgc2l6ZSkKLQl7Ci0JICBtdW5tYXAgKGktPmRhdGEsIGktPnNpemUpOwotCSAgaS0+ZGF0YSA9IDA7Ci0JfQotICAgICAgaS0+ZGF0YSA9IG1tYXAgKGktPmRhdGEsIHJlYWxfc2l6ZSwKLQkJICAgICAgd3JpdGFibGUgPyBQUk9UX1dSSVRFIHwgUFJPVF9SRUFEIDogUFJPVF9SRUFELAotCQkgICAgICAod3JpdGFibGUKLQkJICAgICAgID8gTUFQX0ZJTEUgfCBNQVBfUFJJVkFURQotCQkgICAgICAgOiBNQVBfRklMRSB8IE1BUF9TSEFSRUQpLAotCQkgICAgICBmZCwgZmlsZV9vZmZzZXQpOwotICAgICAgaWYgKGktPmRhdGEgPT0gKFBUUikgLTEpCi0JewotCSAgLyogQW4gZXJyb3IgaGFwcGVuZWQuICBSZXBvcnQgaXQsIG9yIHRyeSB1c2luZyBtYWxsb2MsIG9yCi0JICAgICBzb21ldGhpbmcuICAqLwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQkgIGktPmRhdGEgPSAwOwotCSAgd2luZG93cC0+ZGF0YSA9IDA7Ci0JICBpZiAoZGVidWdfd2luZG93cykKLQkgICAgZnByaW50ZiAoc3RkZXJyLCAiXHRcdG1tYXAgZmFpbGVkIVxuIik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKGRlYnVnX3dpbmRvd3MpCi0JZnByaW50ZiAoc3RkZXJyLCAiXG5cdG1hcHBlZCAlbGQgYXQgJXAsIG9mZnNldCBpcyAlbGRcbiIsCi0JCSAobG9uZykgcmVhbF9zaXplLCBpLT5kYXRhLCAobG9uZykgb2Zmc2V0Mik7Ci0gICAgICBpLT5zaXplID0gcmVhbF9zaXplOwotICAgICAgd2luZG93cC0+ZGF0YSA9IChQVFIpICgoYmZkX2J5dGUgKikgaS0+ZGF0YSArIG9mZnNldDIpOwotICAgICAgd2luZG93cC0+c2l6ZSA9IHNpemU7Ci0gICAgICBpLT5tYXBwZWQgPSAxOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlIGlmIChkZWJ1Z193aW5kb3dzKQotICAgIHsKLSAgICAgIGlmIChva190b19tYXApCi0JZnByaW50ZiAoc3RkZXJyLCBfKCJub3QgbWFwcGluZzogZGF0YT0lbHggbWFwcGVkPSVkXG4iKSwKLQkJICh1bnNpZ25lZCBsb25nKSBpLT5kYXRhLCAoaW50KSBpLT5tYXBwZWQpOwotICAgICAgZWxzZQotCWZwcmludGYgKHN0ZGVyciwgXygibm90IG1hcHBpbmc6IGVudiB2YXIgbm90IHNldFxuIikpOwotICAgIH0KLSNlbHNlCi0gIG9rX3RvX21hcCA9IDA7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfTVBST1RFQ1QKLSAgaWYgKCF3cml0YWJsZSkKLSAgICB7Ci0gICAgICBzaXplX3RvX2FsbG9jICs9IHBhZ2VzaXplIC0gMTsKLSAgICAgIHNpemVfdG9fYWxsb2MgLT0gc2l6ZV90b19hbGxvYyAlIHBhZ2VzaXplOwotICAgIH0KLSNlbmRpZgotICBpZiAoZGVidWdfd2luZG93cykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJcblx0JXMoJTZsZCkiLAotCSAgICAgaS0+ZGF0YSA/ICJyZWFsbG9jIiA6ICIgbWFsbG9jIiwgKGxvbmcpIHNpemVfdG9fYWxsb2MpOwotICBpLT5kYXRhID0gKFBUUikgYmZkX3JlYWxsb2MgKGktPmRhdGEsIHNpemVfdG9fYWxsb2MpOwotICBpZiAoZGVidWdfd2luZG93cykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJcdC0+ICVwXG4iLCBpLT5kYXRhKTsKLSAgaS0+cmVmY291bnQgPSAxOwotICBpZiAoaS0+ZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzaXplX3RvX2FsbG9jID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGktPnNpemUgPSBiZmRfcmVhZCAoaS0+ZGF0YSwgc2l6ZSwgMSwgYWJmZCk7Ci0gIGlmIChpLT5zaXplICE9IHNpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpLT5tYXBwZWQgPSAwOwotI2lmZGVmIEhBVkVfTVBST1RFQ1QKLSAgaWYgKCF3cml0YWJsZSkKLSAgICB7Ci0gICAgICBpZiAoZGVidWdfd2luZG93cykKLQlmcHJpbnRmIChzdGRlcnIsICJcdG1wcm90ZWN0ICglcCwgJWxkLCBQUk9UX1JFQUQpXG4iLCBpLT5kYXRhLAotCQkgKGxvbmcpIGktPnNpemUpOwotICAgICAgbXByb3RlY3QgKGktPmRhdGEsIGktPnNpemUsIFBST1RfUkVBRCk7Ci0gICAgfQotI2VuZGlmCi0gIHdpbmRvd3AtPmRhdGEgPSBpLT5kYXRhOwotICB3aW5kb3dwLT5zaXplID0gaS0+c2l6ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbmRpZiAvKiBVU0VfTU1BUCAqLwotDAotYmZkX3NpemVfdHlwZQotYmZkX3dyaXRlIChwdHIsIHNpemUsIG5pdGVtcywgYWJmZCkKLSAgICAgQ09OU1QgUFRSIHB0cjsKLSAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICBiZmRfc2l6ZV90eXBlIG5pdGVtczsKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIG53cm90ZTsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2luX21lbW9yeSAqYmltID0gKHN0cnVjdCBiZmRfaW5fbWVtb3J5ICopIChhYmZkLT5pb3N0cmVhbSk7Ci0gICAgICBzaXplICo9IG5pdGVtczsKLSAgICAgIGlmIChhYmZkLT53aGVyZSArIHNpemUgPiBiaW0tPnNpemUpCi0JewotCSAgbG9uZyBuZXdzaXplLCBvbGRzaXplID0gKGJpbS0+c2l6ZSArIDEyNykgJiB+MTI3OwotCSAgYmltLT5zaXplID0gYWJmZC0+d2hlcmUgKyBzaXplOwotCSAgLyogUm91bmQgdXAgdG8gY3V0IGRvd24gb24gbWVtb3J5IGZyYWdtZW50YXRpb24gKi8KLQkgIG5ld3NpemUgPSAoYmltLT5zaXplICsgMTI3KSAmIH4xMjc7Ci0JICBpZiAobmV3c2l6ZSA+IG9sZHNpemUpCi0JICAgIHsKLQkgICAgICBiaW0tPmJ1ZmZlciA9IGJmZF9yZWFsbG9jIChiaW0tPmJ1ZmZlciwgbmV3c2l6ZSk7Ci0JICAgICAgaWYgKGJpbS0+YnVmZmVyID09IDApCi0JCXsKLQkJICBiaW0tPnNpemUgPSAwOwotCQkgIHJldHVybiAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBtZW1jcHkgKGJpbS0+YnVmZmVyICsgYWJmZC0+d2hlcmUsIHB0ciwgc2l6ZSk7Ci0gICAgICBhYmZkLT53aGVyZSArPSBzaXplOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gIG53cm90ZSA9IGZ3cml0ZSAocHRyLCAxLCAoc2l6ZV90KSAoc2l6ZSAqIG5pdGVtcyksCi0JCSAgIGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpKTsKLSAgaWYgKG53cm90ZSA+IDApCi0gICAgYWJmZC0+d2hlcmUgKz0gbndyb3RlOwotICBpZiAoKGJmZF9zaXplX3R5cGUpIG53cm90ZSAhPSBzaXplICogbml0ZW1zKQotICAgIHsKLSNpZmRlZiBFTk9TUEMKLSAgICAgIGlmIChud3JvdGUgPj0gMCkKLQllcnJubyA9IEVOT1NQQzsKLSNlbmRpZgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICB9Ci0gIHJldHVybiBud3JvdGU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50Ci0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludChiZmQgKmFiZmQsICBpbnQgaSk7Ci0KLURFU0NSSVBUSU9OCi0JV3JpdGUgYSA0IGJ5dGUgaW50ZWdlciBAdmFye2l9IHRvIHRoZSBvdXRwdXQgQkZEIEB2YXJ7YWJmZH0sIGluIGJpZwotCWVuZGlhbiBvcmRlciByZWdhcmRsZXNzIG9mIHdoYXQgZWxzZSBpcyBnb2luZyBvbi4gIFRoaXMgaXMgdXNlZnVsIGluCi0JYXJjaGl2ZXMuCi0KLSovCi12b2lkCi1iZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludCAoYWJmZCwgaSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgaTsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICBiZmRfcHV0YjMyKGksIGJ1ZmZlcik7Ci0gIGlmIChiZmRfd3JpdGUoKFBUUilidWZmZXIsIDQsIDEsIGFiZmQpICE9IDQpCi0gICAgYWJvcnQgKCk7Ci19Ci0KLWxvbmcKLWJmZF90ZWxsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGZpbGVfcHRyIHB0cjsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICByZXR1cm4gYWJmZC0+d2hlcmU7Ci0KLSAgcHRyID0gZnRlbGwgKGJmZF9jYWNoZV9sb29rdXAoYWJmZCkpOwotCi0gIGlmIChhYmZkLT5teV9hcmNoaXZlKQotICAgIHB0ciAtPSBhYmZkLT5vcmlnaW47Ci0gIGFiZmQtPndoZXJlID0gcHRyOwotICByZXR1cm4gcHRyOwotfQotCi1pbnQKLWJmZF9mbHVzaCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIGZmbHVzaCAoYmZkX2NhY2hlX2xvb2t1cChhYmZkKSk7Ci19Ci0KLS8qIFJldHVybnMgMCBmb3Igc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgZm9yIGZhaWx1cmUgKGluIHdoaWNoIGNhc2UKLSAgIGJmZF9nZXRfZXJyb3IgY2FuIHJldHJpZXZlIHRoZSBlcnJvciBjb2RlKS4gICovCi1pbnQKLWJmZF9zdGF0IChhYmZkLCBzdGF0YnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzdGF0ICpzdGF0YnVmOwotewotICBGSUxFICpmOwotICBpbnQgcmVzdWx0OwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQotICAgIGFib3J0ICgpOwotCi0gIGYgPSBiZmRfY2FjaGVfbG9va3VwIChhYmZkKTsKLSAgaWYgKGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgcmVzdWx0ID0gZnN0YXQgKGZpbGVubyAoZiksIHN0YXRidWYpOwotICBpZiAocmVzdWx0IDwgMCkKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbnplcm8gZm9yIGZhaWx1cmUgKGluIHdoaWNoIGNhc2UgYmZkX2dldF9lcnJvcgotICAgY2FuIHJldHJpZXZlIHRoZSBlcnJvciBjb2RlKS4gICovCi0KLWludAotYmZkX3NlZWsgKGFiZmQsIHBvc2l0aW9uLCBkaXJlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmlsZV9wdHIgcG9zaXRpb247Ci0gICAgIGludCBkaXJlY3Rpb247Ci17Ci0gIGludCByZXN1bHQ7Ci0gIEZJTEUgKmY7Ci0gIGZpbGVfcHRyIGZpbGVfcG9zaXRpb247Ci0gIC8qIEZvciB0aGUgdGltZSBiZWluZywgYSBCRkQgbWF5IG5vdCBzZWVrIHRvIGl0J3MgZW5kLiAgVGhlIHByb2JsZW0KLSAgICAgaXMgdGhhdCB3ZSBkb24ndCBlYXNpbHkgaGF2ZSBhIHdheSB0byByZWNvZ25pemUgdGhlIGVuZCBvZiBhbgotICAgICBlbGVtZW50IGluIGFuIGFyY2hpdmUuICovCi0KLSAgQkZEX0FTU0VSVCAoZGlyZWN0aW9uID09IFNFRUtfU0VUIHx8IGRpcmVjdGlvbiA9PSBTRUVLX0NVUik7Ci0KLSAgaWYgKGRpcmVjdGlvbiA9PSBTRUVLX0NVUiAmJiBwb3NpdGlvbiA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChkaXJlY3Rpb24gPT0gU0VFS19TRVQpCi0JYWJmZC0+d2hlcmUgPSBwb3NpdGlvbjsKLSAgICAgIGVsc2UKLQlhYmZkLT53aGVyZSArPSBwb3NpdGlvbjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9hcmNoaXZlICYmIGFiZmQtPm15X2FyY2hpdmUgPT0gMCkKLSAgICB7Ci0jaWYgMAotICAgICAgLyogRXhwbGFuYXRpb24gZm9yIHRoaXMgY29kZTogSSdtIG9ubHkgYWJvdXQgOTUrJSBzdXJlIHRoYXQgdGhlIGFib3ZlCi0JIGNvbmRpdGlvbnMgYXJlIHN1ZmZpY2llbnQgYW5kIHRoYXQgYWxsIGkvbyBjYWxscyBhcmUgcHJvcGVybHkKLQkgYWRqdXN0aW5nIHRoZSBgd2hlcmUnIGZpZWxkLiAgU28gdGhpcyBpcyBzb3J0IG9mIGFuIGBhc3NlcnQnCi0JIHRoYXQgdGhlIGB3aGVyZScgZmllbGQgaXMgY29ycmVjdC4gIElmIHdlIGNhbiBnbyBhIHdoaWxlIHdpdGhvdXQKLQkgdHJpcHBpbmcgdGhlIGFib3J0LCB3ZSBjYW4gcHJvYmFibHkgc2FmZWx5IGRpc2FibGUgdGhpcyBjb2RlLAotCSBzbyB0aGF0IHRoZSByZWFsIG9wdGltaXphdGlvbnMgaGFwcGVuLiAgKi8KLSAgICAgIGZpbGVfcHRyIHdoZXJlX2FtX2lfbm93OwotICAgICAgd2hlcmVfYW1faV9ub3cgPSBmdGVsbCAoYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCkpOwotICAgICAgaWYgKGFiZmQtPm15X2FyY2hpdmUpCi0Jd2hlcmVfYW1faV9ub3cgLT0gYWJmZC0+b3JpZ2luOwotICAgICAgaWYgKHdoZXJlX2FtX2lfbm93ICE9IGFiZmQtPndoZXJlKQotCWFib3J0ICgpOwotI2VuZGlmCi0gICAgICBpZiAoZGlyZWN0aW9uID09IFNFRUtfU0VUICYmIHBvc2l0aW9uID09IGFiZmQtPndoZXJlKQotCXJldHVybiAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgc29tZXRoaW5nIHNtYXJ0ZXIgdG8gb3B0aW1pemUgYWNjZXNzIHRvIGFyY2hpdmVzLgotCSBDdXJyZW50bHksIGFueXRoaW5nIGluc2lkZSBhbiBhcmNoaXZlIGlzIHJlYWQgdmlhIHRoZSBmaWxlCi0JIGhhbmRsZSBmb3IgdGhlIGFyY2hpdmUuICBXaGljaCBtZWFucyB0aGF0IGEgYmZkX3NlZWsgb24gb25lCi0JIGNvbXBvbmVudCBhZmZlY3RzIHRoZSBgY3VycmVudCBwb3NpdGlvbicgaW4gdGhlIGFyY2hpdmUsIGFzCi0JIHdlbGwgYXMgaW4gYW55IG90aGVyIGNvbXBvbmVudC4KLQotCSBJdCBtaWdodCBiZSBzdWZmaWNpZW50IHRvIHB1dCBhIHNwaWtlIHRocm91Z2ggdGhlIGNhY2hlCi0JIGFic3RyYWN0aW9uLCBhbmQgbG9vayB0byB0aGUgYXJjaGl2ZSBmb3IgdGhlIGZpbGUgcG9zaXRpb24sCi0JIGJ1dCBJIHRoaW5rIHdlIHNob3VsZCB0cnkgZm9yIHNvbWV0aGluZyBjbGVhbmVyLgotCi0JIEluIHRoZSBtZWFudGltZSwgbm8gb3B0aW1pemF0aW9uIGZvciBhcmNoaXZlcy4gICovCi0gICAgfQotCi0gIGYgPSBiZmRfY2FjaGVfbG9va3VwIChhYmZkKTsKLSAgZmlsZV9wb3NpdGlvbiA9IHBvc2l0aW9uOwotICBpZiAoZGlyZWN0aW9uID09IFNFRUtfU0VUICYmIGFiZmQtPm15X2FyY2hpdmUgIT0gTlVMTCkKLSAgICBmaWxlX3Bvc2l0aW9uICs9IGFiZmQtPm9yaWdpbjsKLQotICByZXN1bHQgPSBmc2VlayAoZiwgZmlsZV9wb3NpdGlvbiwgZGlyZWN0aW9uKTsKLQotICBpZiAocmVzdWx0ICE9IDApCi0gICAgewotICAgICAgaW50IGhvbGRfZXJybm8gPSBlcnJubzsKLQotICAgICAgLyogRm9yY2UgcmVkZXRlcm1pbmF0aW9uIG9mIGB3aGVyZScgZmllbGQuICAqLwotICAgICAgYmZkX3RlbGwgKGFiZmQpOwotCi0gICAgICAvKiBBbiBFSU5WQUwgZXJyb3IgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgZmlsZSBvZmZzZXQgd2FzCi0gICAgICAgICBhYnN1cmQuICAqLwotICAgICAgaWYgKGhvbGRfZXJybm8gPT0gRUlOVkFMKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQkgIGVycm5vID0gaG9sZF9lcnJubzsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQWRqdXN0IGB3aGVyZScgZmllbGQuICAqLwotICAgICAgaWYgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCkKLQlhYmZkLT53aGVyZSA9IHBvc2l0aW9uOwotICAgICAgZWxzZQotCWFiZmQtPndoZXJlICs9IHBvc2l0aW9uOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQwKLS8qKiBUaGUgZG8taXQteW91cnNlbGYgKGJ5dGUpIHNleC1jaGFuZ2Uga2l0ICovCi0KLS8qIFRoZSBtaWRkbGUgbGV0dGVyIGUuZy4gZ2V0PGI+c2hvcnQgaW5kaWNhdGVzIEJpZyBvciBMaXR0bGUgZW5kaWFuCi0gICB0YXJnZXQgbWFjaGluZS4gIEl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGJ5dGUgb3JkZXIgb2YgdGhlIGhvc3QKLSAgIG1hY2hpbmUgaXM7IHRoZXNlIHJvdXRpbmVzIHdvcmsgZm9yIGVpdGhlci4gICovCi0KLS8qIEZJWE1FOiBTaG91bGQgdGhlc2UgdGFrZSBhIGNvdW50IGFyZ3VtZW50PwotICAgQW5zd2VyIChnbnVAY3lnbnVzLmNvbSk6ICBObywgYnV0IHBlcmhhcHMgdGhleSBzaG91bGQgYmUgaW5saW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyBpbiBzd2FwLmggI2lmZGVmIF9fR05VQ19fLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3Byb2YgdGhlbSBsYXRlciBhbmQgZmluZCBvdXQuICAqLwotCi0vKgotRlVOQ1RJT04KLQliZmRfcHV0X3NpemUKLUZVTkNUSU9OCi0JYmZkX2dldF9zaXplCi0KLURFU0NSSVBUSU9OCi0JVGhlc2UgbWFjcm9zIGFzIHVzZWQgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgcmF3IGRhdGEgaW4KLQlzZWN0aW9uczsgZWFjaCBhY2Nlc3MgKGV4Y2VwdCBmb3IgYnl0ZXMpIGlzIHZlY3RvcmVkIHRocm91Z2gKLQl0aGUgdGFyZ2V0IGZvcm1hdCBvZiB0aGUgQkZEIGFuZCBtYW5nbGVkIGFjY29yZGluZ2x5LiBUaGUKLQltYW5nbGluZyBwZXJmb3JtcyBhbnkgbmVjZXNzYXJ5IGVuZGlhbiB0cmFuc2xhdGlvbnMgYW5kCi0JcmVtb3ZlcyBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zLiAgTm90ZSB0aGF0IHR5cGVzIGFjY2VwdGVkIGFuZAotCXJldHVybmVkIGJ5IHRoZXNlIG1hY3JvcyBhcmUgaWRlbnRpY2FsIHNvIHRoZXkgY2FuIGJlIHN3YXBwZWQKLQlhcm91bmQgaW4gbWFjcm9zLS0tZm9yIGV4YW1wbGUsIEBmaWxle2xpYmFvdXQuaH0gZGVmaW5lcyA8PEdFVF9XT1JEPj4KLQl0byBlaXRoZXIgPDxiZmRfZ2V0XzMyPj4gb3IgPDxiZmRfZ2V0XzY0Pj4uCi0KLQlJbiB0aGUgcHV0IHJvdXRpbmVzLCBAdmFye3ZhbH0gbXVzdCBiZSBhIDw8YmZkX3ZtYT4+LiAgSWYgd2UgYXJlIG9uIGEKLQlzeXN0ZW0gd2l0aG91dCBwcm90b3R5cGVzLCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcKLQlzdXJlIHRoYXQgaXMgdHJ1ZSwgd2l0aCBhIGNhc3QgaWYgbmVjZXNzYXJ5LiAgV2UgZG9uJ3QgY2FzdAotCXRoZW0gaW4gdGhlIG1hY3JvIGRlZmluaXRpb25zIGJlY2F1c2UgdGhhdCB3b3VsZCBwcmV2ZW50IDw8bGludD4+Ci0Jb3IgPDxnY2MgLVdhbGw+PiBmcm9tIGRldGVjdGluZyBzaW5zIHN1Y2ggYXMgcGFzc2luZyBhIHBvaW50ZXIuCi0JVG8gZGV0ZWN0IGNhbGxpbmcgdGhlc2Ugd2l0aCBsZXNzIHRoYW4gYSA8PGJmZF92bWE+PiwgdXNlCi0JPDxnY2MgLVdjb252ZXJzaW9uPj4gb24gYSBob3N0IHdpdGggNjQgYml0IDw8YmZkX3ZtYT4+J3MuCi0KLS4KLS57KiBCeXRlIHN3YXBwaW5nIG1hY3JvcyBmb3IgdXNlciBzZWN0aW9uIGRhdGEuICAqfQotLgotLiNkZWZpbmUgYmZkX3B1dF84KGFiZmQsIHZhbCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgICgqKCh1bnNpZ25lZCBjaGFyICopKHB0cikpID0gKHVuc2lnbmVkIGNoYXIpKHZhbCkpCi0uI2RlZmluZSBiZmRfcHV0X3NpZ25lZF84IFwKLS4JCWJmZF9wdXRfOAotLiNkZWZpbmUgYmZkX2dldF84KGFiZmQsIHB0cikgXAotLiAgICAgICAgICAgICAgICAoKih1bnNpZ25lZCBjaGFyICopKHB0cikpCi0uI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF84KGFiZmQsIHB0cikgXAotLgkJKCgqKHVuc2lnbmVkIGNoYXIgKikocHRyKSBeIDB4ODApIC0gMHg4MCkKLS4KLS4jZGVmaW5lIGJmZF9wdXRfMTYoYWJmZCwgdmFsLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX3B1dHgxNiwgKCh2YWwpLChwdHIpKSkKLS4jZGVmaW5lIGJmZF9wdXRfc2lnbmVkXzE2IFwKLS4JCSBiZmRfcHV0XzE2Ci0uI2RlZmluZSBiZmRfZ2V0XzE2KGFiZmQsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eDE2LCAocHRyKSkKLS4jZGVmaW5lIGJmZF9nZXRfc2lnbmVkXzE2KGFiZmQsIHB0cikgXAotLiAgICAgICAgIAkgQkZEX1NFTkQgKGFiZmQsIGJmZF9nZXR4X3NpZ25lZF8xNiwgKHB0cikpCi0uCi0uI2RlZmluZSBiZmRfcHV0XzMyKGFiZmQsIHZhbCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4MzIsICgodmFsKSwocHRyKSkpCi0uI2RlZmluZSBiZmRfcHV0X3NpZ25lZF8zMiBcCi0uCQkgYmZkX3B1dF8zMgotLiNkZWZpbmUgYmZkX2dldF8zMihhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHgzMiwgKHB0cikpCi0uI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF8zMihhYmZkLCBwdHIpIFwKLS4JCSBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfMzIsIChwdHIpKQotLgotLiNkZWZpbmUgYmZkX3B1dF82NChhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfcHV0eDY0LCAoKHZhbCksIChwdHIpKSkKLS4jZGVmaW5lIGJmZF9wdXRfc2lnbmVkXzY0IFwKLS4JCSBiZmRfcHV0XzY0Ci0uI2RlZmluZSBiZmRfZ2V0XzY0KGFiZmQsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eDY0LCAocHRyKSkKLS4jZGVmaW5lIGJmZF9nZXRfc2lnbmVkXzY0KGFiZmQsIHB0cikgXAotLgkJIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4X3NpZ25lZF82NCwgKHB0cikpCi0uCi0qLyAKLQotLyoKLUZVTkNUSU9OCi0JYmZkX2hfcHV0X3NpemUKLQliZmRfaF9nZXRfc2l6ZQotCi1ERVNDUklQVElPTgotCVRoZXNlIG1hY3JvcyBoYXZlIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIHRoZWlyIDw8YmZkX2dldF94Pj4KLQlicmV0aGVyZW4sIGV4Y2VwdCB0aGF0IHRoZXkgYXJlIHVzZWQgZm9yIHJlbW92aW5nIGluZm9ybWF0aW9uCi0JZm9yIHRoZSBoZWFkZXIgcmVjb3JkcyBvZiBvYmplY3QgZmlsZXMuIEJlbGlldmUgaXQgb3Igbm90LAotCXNvbWUgb2JqZWN0IGZpbGVzIGtlZXAgdGhlaXIgaGVhZGVyIHJlY29yZHMgaW4gYmlnIGVuZGlhbgotCW9yZGVyIGFuZCB0aGVpciBkYXRhIGluIGxpdHRsZSBlbmRpYW4gb3JkZXIuCi0uCi0ueyogQnl0ZSBzd2FwcGluZyBtYWNyb3MgZm9yIGZpbGUgaGVhZGVyIGRhdGEuICAqfQotLgotLiNkZWZpbmUgYmZkX2hfcHV0XzgoYWJmZCwgdmFsLCBwdHIpIFwKLS4JCWJmZF9wdXRfOCAoYWJmZCwgdmFsLCBwdHIpCi0uI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzgoYWJmZCwgdmFsLCBwdHIpIFwKLS4JCWJmZF9wdXRfOCAoYWJmZCwgdmFsLCBwdHIpCi0uI2RlZmluZSBiZmRfaF9nZXRfOChhYmZkLCBwdHIpIFwKLS4JCWJmZF9nZXRfOCAoYWJmZCwgcHRyKQotLiNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF84KGFiZmQsIHB0cikgXAotLgkJYmZkX2dldF9zaWduZWRfOCAoYWJmZCwgcHRyKQotLgotLiNkZWZpbmUgYmZkX2hfcHV0XzE2KGFiZmQsIHZhbCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHgxNiwodmFsLHB0cikpCi0uI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzE2IFwKLS4JCSBiZmRfaF9wdXRfMTYKLS4jZGVmaW5lIGJmZF9oX2dldF8xNihhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eDE2LChwdHIpKQotLiNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF8xNihhYmZkLCBwdHIpIFwKLS4JCSBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF8xNiwgKHB0cikpCi0uCi0uI2RlZmluZSBiZmRfaF9wdXRfMzIoYWJmZCwgdmFsLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfcHV0eDMyLCh2YWwscHRyKSkKLS4jZGVmaW5lIGJmZF9oX3B1dF9zaWduZWRfMzIgXAotLgkJIGJmZF9oX3B1dF8zMgotLiNkZWZpbmUgYmZkX2hfZ2V0XzMyKGFiZmQsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4MzIsKHB0cikpCi0uI2RlZmluZSBiZmRfaF9nZXRfc2lnbmVkXzMyKGFiZmQsIHB0cikgXAotLgkJIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHhfc2lnbmVkXzMyLCAocHRyKSkKLS4KLS4jZGVmaW5lIGJmZF9oX3B1dF82NChhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9wdXR4NjQsKHZhbCwgcHRyKSkKLS4jZGVmaW5lIGJmZF9oX3B1dF9zaWduZWRfNjQgXAotLgkJIGJmZF9oX3B1dF82NAotLiNkZWZpbmUgYmZkX2hfZ2V0XzY0KGFiZmQsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4NjQsKHB0cikpCi0uI2RlZmluZSBiZmRfaF9nZXRfc2lnbmVkXzY0KGFiZmQsIHB0cikgXAotLgkJIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHhfc2lnbmVkXzY0LCAocHRyKSkKLS4KLSovIAotCi0vKiBTaWduIGV4dGVuc2lvbiB0byBiZmRfc2lnbmVkX3ZtYS4gICovCi0jZGVmaW5lIENPRVJDRTE2KHgpICgoKGJmZF9zaWduZWRfdm1hKSAoeCkgXiAweDgwMDApIC0gMHg4MDAwKQotI2RlZmluZSBDT0VSQ0UzMih4KSBcCi0gICgoYmZkX3NpZ25lZF92bWEpIChsb25nKSAoKCh1bnNpZ25lZCBsb25nKSAoeCkgXiAweDgwMDAwMDAwKSAtIDB4ODAwMDAwMDApKQotI2RlZmluZSBFSUdIVF9HQVpJTExJT04gKCgoQkZEX0hPU1RfNjRfQklUKTB4ODAwMDAwMDApIDw8IDMyKQotI2RlZmluZSBDT0VSQ0U2NCh4KSBcCi0gICgoKGJmZF9zaWduZWRfdm1hKSAoeCkgXiBFSUdIVF9HQVpJTExJT04pIC0gRUlHSFRfR0FaSUxMSU9OKQotCi1iZmRfdm1hCi1iZmRfZ2V0YjE2IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgcmV0dXJuIChhZGRyWzBdIDw8IDgpIHwgYWRkclsxXTsKLX0KLQotYmZkX3ZtYQotYmZkX2dldGwxNiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHJldHVybiAoYWRkclsxXSA8PCA4KSB8IGFkZHJbMF07Ci19Ci0KLWJmZF9zaWduZWRfdm1hCi1iZmRfZ2V0Yl9zaWduZWRfMTYgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICByZXR1cm4gQ09FUkNFMTYoKGFkZHJbMF0gPDwgOCkgfCBhZGRyWzFdKTsKLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRsX3NpZ25lZF8xNiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHJldHVybiBDT0VSQ0UxNigoYWRkclsxXSA8PCA4KSB8IGFkZHJbMF0pOwotfQotCi12b2lkCi1iZmRfcHV0YjE2IChkYXRhLCBhZGRyKQotICAgICBiZmRfdm1hIGRhdGE7Ci0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyOwotewotICBhZGRyWzBdID0gKGJmZF9ieXRlKShkYXRhID4+IDgpOwotICBhZGRyWzFdID0gKGJmZF9ieXRlIClkYXRhOwotfQotCi12b2lkCi1iZmRfcHV0bDE2IChkYXRhLCBhZGRyKQotICAgICBiZmRfdm1hIGRhdGE7ICAgICAgICAgICAgIAotICAgICByZWdpc3RlciBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgYWRkclswXSA9IChiZmRfYnl0ZSApZGF0YTsKLSAgYWRkclsxXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiA4KTsKLX0KLQotYmZkX3ZtYQotYmZkX2dldGIzMiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdjsKLQotICB2ID0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMF0gPDwgMjQ7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMV0gPDwgMTY7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMl0gPDwgODsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclszXTsKLSAgcmV0dXJuIChiZmRfdm1hKSB2OwotfQotCi1iZmRfdm1hCi1iZmRfZ2V0bDMyIChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgdW5zaWduZWQgbG9uZyB2OwotCi0gIHYgPSAodW5zaWduZWQgbG9uZykgYWRkclswXTsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsxXSA8PCA4OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzJdIDw8IDE2OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzNdIDw8IDI0OwotICByZXR1cm4gKGJmZF92bWEpIHY7Ci19Ci0KLWJmZF9zaWduZWRfdm1hCi1iZmRfZ2V0Yl9zaWduZWRfMzIgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICB1bnNpZ25lZCBsb25nIHY7Ci0KLSAgdiA9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzBdIDw8IDI0OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzFdIDw8IDE2OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzJdIDw8IDg7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbM107Ci0gIHJldHVybiBDT0VSQ0UzMiAodik7Ci19Ci0KLWJmZF9zaWduZWRfdm1hCi1iZmRfZ2V0bF9zaWduZWRfMzIgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICB1bnNpZ25lZCBsb25nIHY7Ci0KLSAgdiA9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzBdOwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzFdIDw8IDg7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMl0gPDwgMTY7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbM10gPDwgMjQ7Ci0gIHJldHVybiBDT0VSQ0UzMiAodik7Ci19Ci0KLWJmZF92bWEKLWJmZF9nZXRiNjQgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotI2lmZGVmIEJGRDY0Ci0gIGJmZF92bWEgbG93LCBoaWdoOwotCi0gIGhpZ2g9ICgoKCgoKCgoYWRkclswXSkgPDwgOCkgfAotICAgICAgICAgICAgICBhZGRyWzFdKSA8PCA4KSB8Ci0gICAgICAgICAgICBhZGRyWzJdKSA8PCA4KSB8Ci0gICAgICAgICAgYWRkclszXSkgKTsKLQotICBsb3cgPSAoKCgoKCgoKChiZmRfdm1hKWFkZHJbNF0pIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkcls1XSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkcls2XSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbN10pKTsKLQotICByZXR1cm4gaGlnaCA8PCAzMiB8IGxvdzsKLSNlbHNlCi0gIEJGRF9GQUlMKCk7Ci0gIHJldHVybiAwOwotI2VuZGlmCi19Ci0KLWJmZF92bWEKLWJmZF9nZXRsNjQgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotI2lmZGVmIEJGRDY0Ci0gIGJmZF92bWEgbG93LCBoaWdoOwotICBoaWdoPSAoKCgoKCgoYWRkcls3XSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbNl0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbNV0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzRdKSk7Ci0KLSAgbG93ID0gKCgoKCgoKChiZmRfdm1hKWFkZHJbM10gPDwgOCkgfAotICAgICAgICAgICAgICBhZGRyWzJdKSA8PCA4KSB8Ci0gICAgICAgICAgICBhZGRyWzFdKSA8PCA4KSB8Ci0gICAgICAgICAgYWRkclswXSkgKTsKLQotICByZXR1cm4gaGlnaCA8PCAzMiB8IGxvdzsKLSNlbHNlCi0gIEJGRF9GQUlMKCk7Ci0gIHJldHVybiAwOwotI2VuZGlmCi0KLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRiX3NpZ25lZF82NCAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0jaWZkZWYgQkZENjQKLSAgYmZkX3ZtYSBsb3csIGhpZ2g7Ci0KLSAgaGlnaD0gKCgoKCgoKChhZGRyWzBdKSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbMV0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbMl0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzNdKSApOwotCi0gIGxvdyA9ICgoKCgoKCgoKGJmZF92bWEpYWRkcls0XSkgPDwgOCkgfAotICAgICAgICAgICAgICBhZGRyWzVdKSA8PCA4KSB8Ci0gICAgICAgICAgICBhZGRyWzZdKSA8PCA4KSB8Ci0gICAgICAgICAgYWRkcls3XSkpOwotCi0gIHJldHVybiBDT0VSQ0U2NChoaWdoIDw8IDMyIHwgbG93KTsKLSNlbHNlCi0gIEJGRF9GQUlMKCk7Ci0gIHJldHVybiAwOwotI2VuZGlmCi19Ci0KLWJmZF9zaWduZWRfdm1hCi1iZmRfZ2V0bF9zaWduZWRfNjQgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotI2lmZGVmIEJGRDY0Ci0gIGJmZF92bWEgbG93LCBoaWdoOwotICBoaWdoPSAoKCgoKCgoYWRkcls3XSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbNl0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbNV0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzRdKSk7Ci0KLSAgbG93ID0gKCgoKCgoKChiZmRfdm1hKWFkZHJbM10gPDwgOCkgfAotICAgICAgICAgICAgICBhZGRyWzJdKSA8PCA4KSB8Ci0gICAgICAgICAgICBhZGRyWzFdKSA8PCA4KSB8Ci0gICAgICAgICAgYWRkclswXSkgKTsKLQotICByZXR1cm4gQ09FUkNFNjQoaGlnaCA8PCAzMiB8IGxvdyk7Ci0jZWxzZQotICBCRkRfRkFJTCgpOwotICByZXR1cm4gMDsKLSNlbmRpZgotfQotCi12b2lkCi1iZmRfcHV0YjMyIChkYXRhLCBhZGRyKQotICAgICBiZmRfdm1hIGRhdGE7Ci0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyOwotewotICAgICAgICBhZGRyWzBdID0gKGJmZF9ieXRlKShkYXRhID4+IDI0KTsKLSAgICAgICAgYWRkclsxXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAxNik7Ci0gICAgICAgIGFkZHJbMl0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gIDgpOwotICAgICAgICBhZGRyWzNdID0gKGJmZF9ieXRlKWRhdGE7Ci19Ci0KLXZvaWQKLWJmZF9wdXRsMzIgKGRhdGEsIGFkZHIpCi0gICAgIGJmZF92bWEgZGF0YTsKLSAgICAgcmVnaXN0ZXIgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gICAgICAgIGFkZHJbMF0gPSAoYmZkX2J5dGUpZGF0YTsKLSAgICAgICAgYWRkclsxXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAgOCk7Ci0gICAgICAgIGFkZHJbMl0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gMTYpOwotICAgICAgICBhZGRyWzNdID0gKGJmZF9ieXRlKShkYXRhID4+IDI0KTsKLX0KLQotdm9pZAotYmZkX3B1dGI2NCAoZGF0YSwgYWRkcikKLSAgICAgYmZkX3ZtYSBkYXRhOwotICAgICByZWdpc3RlciBiZmRfYnl0ZSAqYWRkcjsKLXsKLSNpZmRlZiBCRkQ2NAotICBhZGRyWzBdID0gKGJmZF9ieXRlKShkYXRhID4+ICg3KjgpKTsKLSAgYWRkclsxXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNio4KSk7Ci0gIGFkZHJbMl0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDUqOCkpOwotICBhZGRyWzNdID0gKGJmZF9ieXRlKShkYXRhID4+ICg0KjgpKTsKLSAgYWRkcls0XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMyo4KSk7Ci0gIGFkZHJbNV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDIqOCkpOwotICBhZGRyWzZdID0gKGJmZF9ieXRlKShkYXRhID4+ICgxKjgpKTsKLSAgYWRkcls3XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMCo4KSk7Ci0jZWxzZQotICBCRkRfRkFJTCgpOwotI2VuZGlmCi19Ci0KLXZvaWQKLWJmZF9wdXRsNjQgKGRhdGEsIGFkZHIpCi0gICAgIGJmZF92bWEgZGF0YTsKLSAgICAgcmVnaXN0ZXIgYmZkX2J5dGUgKmFkZHI7Ci17Ci0jaWZkZWYgQkZENjQKLSAgYWRkcls3XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNyo4KSk7Ci0gIGFkZHJbNl0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDYqOCkpOwotICBhZGRyWzVdID0gKGJmZF9ieXRlKShkYXRhID4+ICg1KjgpKTsKLSAgYWRkcls0XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNCo4KSk7Ci0gIGFkZHJbM10gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDMqOCkpOwotICBhZGRyWzJdID0gKGJmZF9ieXRlKShkYXRhID4+ICgyKjgpKTsKLSAgYWRkclsxXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMSo4KSk7Ci0gIGFkZHJbMF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDAqOCkpOwotI2Vsc2UKLSAgQkZEX0ZBSUwoKTsKLSNlbmRpZgotfQotDAotLyogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gICAgaWYgKGNvdW50ID09IDApCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGlmICgoYmZkX3NpemVfdHlwZSkob2Zmc2V0K2NvdW50KSA+IHNlY3Rpb24tPl9yYXdfc2l6ZQotICAgICAgICB8fCBiZmRfc2VlayhhYmZkLCAoZmlsZV9wdHIpKHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQpLCBTRUVLX1NFVCkgPT0gLTEKLSAgICAgICAgfHwgYmZkX3JlYWQobG9jYXRpb24sIChiZmRfc2l6ZV90eXBlKTEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICAgICAgcmV0dXJuIChmYWxzZSk7IC8qIG9uIGVycm9yICovCi0gICAgcmV0dXJuICh0cnVlKTsKLX0KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyAoYWJmZCwgc2VjdGlvbiwgdywgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGJmZF93aW5kb3cgKnc7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSNpZmRlZiBVU0VfTU1BUAotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGFiZmQtPnh2ZWMtPl9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgIT0gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzKQotICAgIHsKLSAgICAgIC8qIFdlIGRvbid0IGtub3cgd2hhdCBjaGFuZ2VzIHRoZSBiZmQncyBnZXRfc2VjdGlvbl9jb250ZW50cwotCSBtZXRob2QgbWF5IGhhdmUgdG8gbWFrZS4gIFNvIHB1bnQgdHJ5aW5nIHRvIG1hcCB0aGUgZmlsZQotCSB3aW5kb3csIGFuZCBsZXQgZ2V0X3NlY3Rpb25fY29udGVudHMgZG8gaXRzIHRoaW5nLiAgKi8KLSAgICAgIC8qIEBAIEZJWE1FIDogSWYgdGhlIGludGVybmFsIHdpbmRvdyBoYXMgYSByZWZjb3VudCBvZiAxIGFuZCB3YXMKLQkgYWxsb2NhdGVkIHdpdGggbWFsbG9jIGluc3RlYWQgb2YgbW1hcCwganVzdCByZXVzZSBpdC4gICovCi0gICAgICBiZmRfZnJlZV93aW5kb3cgKHcpOwotICAgICAgdy0+aSA9IChiZmRfd2luZG93X2ludGVybmFsICopIGJmZF96bWFsbG9jIChzaXplb2YgKGJmZF93aW5kb3dfaW50ZXJuYWwpKTsKLSAgICAgIGlmICh3LT5pID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgdy0+aS0+ZGF0YSA9IChQVFIpIGJmZF9tYWxsb2MgKChzaXplX3QpIGNvdW50KTsKLSAgICAgIGlmICh3LT5pLT5kYXRhID09IE5VTEwpCi0JewotCSAgZnJlZSAody0+aSk7Ci0JICB3LT5pID0gTlVMTDsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICB3LT5pLT5tYXBwZWQgPSAwOwotICAgICAgdy0+aS0+cmVmY291bnQgPSAxOwotICAgICAgdy0+c2l6ZSA9IHctPmktPnNpemUgPSBjb3VudDsKLSAgICAgIHctPmRhdGEgPSB3LT5pLT5kYXRhOwotICAgICAgcmV0dXJuIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgdy0+ZGF0YSwgb2Zmc2V0LCBjb3VudCk7Ci0gICAgfQotICBpZiAoKGJmZF9zaXplX3R5cGUpIChvZmZzZXQrY291bnQpID4gc2VjdGlvbi0+X3Jhd19zaXplCi0gICAgICB8fCAoYmZkX2dldF9maWxlX3dpbmRvdyAoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCwgY291bnQsIHcsIHRydWUpCi0JICA9PSBmYWxzZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLSNlbHNlCi0gIGFib3J0ICgpOwotI2VuZGlmCi19Ci0KLS8qIFRoaXMgZ2VuZXJpYyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGluIGltcGxlbWVudGF0aW9ucyB3aGVyZSBjcmVhdGluZwotICAgTkVXIHNlY3Rpb25zIGlzIGRpc2FsbG93ZWQuICBJdCBpcyB1c2VmdWwgaW4gcGF0Y2hpbmcgZXhpc3Rpbmcgc2VjdGlvbnMKLSAgIGluIHJlYWQtd3JpdGUgZmlsZXMsIHRob3VnaC4gIFNlZSBvdGhlciBzZXRfc2VjdGlvbl9jb250ZW50cyBmdW5jdGlvbnMKLSAgIHRvIHNlZSB3aHkgaXQgZG9lc24ndCB3b3JrIGZvciBuZXcgc2VjdGlvbnMuICAqLwotYm9vbGVhbgotX2JmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQpLCBTRUVLX1NFVCkgPT0gLTEKLSAgICAgIHx8IGJmZF93cml0ZSAobG9jYXRpb24sIChiZmRfc2l6ZV90eXBlKSAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfbG9nMgotCi1TWU5PUFNJUwotCXVuc2lnbmVkIGludCBiZmRfbG9nMihiZmRfdm1hIHgpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbG9nIGJhc2UgMiBvZiB0aGUgdmFsdWUgc3VwcGxpZWQsIHJvdW5kZWQgdXAuICBFLmcuLCBhbgotCUB2YXJ7eH0gb2YgMTAyNSByZXR1cm5zIDExLgotKi8KLQotdW5zaWduZWQgaW50Ci1iZmRfbG9nMiAoeCkKLSAgICAgYmZkX3ZtYSB4OwotewotICB1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKLQotICB3aGlsZSAoKCgoYmZkX3ZtYSkgMSkgPDwgcmVzdWx0KSA8IHgpCi0gICAgKytyZXN1bHQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLWJvb2xlYW4KLWJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY2hhciBsb2NhbHNfcHJlZml4ID0gKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkgPT0gJ18nKSA/ICdMJyA6ICcuJzsKLQotICByZXR1cm4gKG5hbWVbMF0gPT0gbG9jYWxzX3ByZWZpeCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2JmZC9saWJiZmQuaCBiL2JmZC9saWJiZmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwNGJkZS4uMDAwMDAwMAotLS0gYS9iZmQvbGliYmZkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ODUgKzAsMCBAQAotLyogbGliYmZkLmggLS0gRGVjbGFyYXRpb25zIHVzZWQgYnkgYmZkIGxpYnJhcnkgKmltcGxlbWVudGF0aW9uKi4KLSAgIChUaGlzIGluY2x1ZGUgZmlsZSBpcyBub3QgZm9yIHVzZXJzIG9mIHRoZSBsaWJyYXJ5LikKLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSoqIE5PVEU6IGxpYmJmZC5oIGlzIGEgR0VORVJBVEVEIGZpbGUuICBEb24ndCBjaGFuZ2UgaXQ7IGluc3RlYWQsCi0qKiBjaGFuZ2UgbGliYmZkLWluLmggb3IgdGhlIG90aGVyIEJGRCBzb3VyY2UgZmlsZXMgcHJvY2Vzc2VkIHRvCi0qKiBnZW5lcmF0ZSB0aGlzIGZpbGUuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQWxpZ24gYW4gYWRkcmVzcyB1cHdhcmQgdG8gYSBib3VuZGFyeSwgZXhwcmVzc2VkIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgotICAgRS5nLiBhbGlnbiB0byBhbiA4LWJ5dGUgYm91bmRhcnkgd2l0aCBhcmd1bWVudCBvZiA4LiAgVGFrZSBjYXJlIG5ldmVyCi0gICB0byB3cmFwIGFyb3VuZCBpZiB0aGUgYWRkcmVzcyBpcyB3aXRoaW4gYm91bmRhcnktMSBvZiB0aGUgZW5kIG9mIHRoZQotICAgYWRkcmVzcyBzcGFjZS4gICovCi0jZGVmaW5lIEJGRF9BTElHTih0aGlzLCBib3VuZGFyeSkJCQkJCVwKLSAgKCgoKGJmZF92bWEpICh0aGlzKSArIChib3VuZGFyeSkgLSAxKSA+PSAoYmZkX3ZtYSkgKHRoaXMpKQkJXAotICAgPyAoKChiZmRfdm1hKSAodGhpcykgKyAoKGJvdW5kYXJ5KSAtIDEpKSAmICh+KChib3VuZGFyeSktMSkpKQlcCi0gICA6IH4gKGJmZF92bWEpIDApCi0KLS8qIElmIHlvdSB3YW50IHRvIHJlYWQgYW5kIHdyaXRlIGxhcmdlIGJsb2NrcywgeW91IG1pZ2h0IHdhbnQgdG8gZG8gaXQKLSAgIGluIHF1YW50YSBvZiB0aGlzIGFtb3VudCAqLwotI2RlZmluZSBERUZBVUxUX0JVRkZFUlNJWkUgODE5MgotCi0vKiBTZXQgYSB0ZGF0YSBmaWVsZC4gIENhbid0IHVzZSB0aGUgb3RoZXIgbWFjcm9zIGZvciB0aGlzLCBzaW5jZSB0aGV5Ci0gICBkbyBjYXN0cywgYW5kIGNhc3RpbmcgdG8gdGhlIGxlZnQgb2YgYXNzaWdubWVudCBpc24ndCBwb3J0YWJsZS4gICovCi0jZGVmaW5lIHNldF90ZGF0YShiZmQsIHYpICgoYmZkKS0+dGRhdGEuYW55ID0gKFBUUikgKHYpKQotCi0vKiBJZiBCRkRfSU5fTUVNT1JZIGlzIHNldCBmb3IgYSBCRkQsIHRoZW4gdGhlIGlvc3RyZWFtIGZpZWxkcyBwb2ludHMKLSAgIHRvIGFuIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGJmZF9pbl9tZW1vcnkKLXsKLSAgLyogU2l6ZSBvZiBidWZmZXIuICAqLwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIC8qIEJ1ZmZlciBob2xkaW5nIGNvbnRlbnRzIG9mIEJGRC4gICovCi0gIGJmZF9ieXRlICpidWZmZXI7Ci19OwotCi0vKiB0ZGF0YSBmb3IgYW4gYXJjaGl2ZS4gIEZvciBhbiBpbnB1dCBhcmNoaXZlLCBjYWNoZQotICAgbmVlZHMgdG8gYmUgZnJlZSgpJ2QuICBGb3IgYW4gb3V0cHV0IGFyY2hpdmUsIHN5bWRlZnMgZG8uICAqLwotCi1zdHJ1Y3QgYXJ0ZGF0YSB7Ci0gIGZpbGVfcHRyIGZpcnN0X2ZpbGVfZmlsZXBvczsKLSAgLyogU3BlZWQgdXAgc2VhcmNoaW5nIHRoZSBhcm1hcCAqLwotICBzdHJ1Y3QgYXJfY2FjaGUgKmNhY2hlOwotICBiZmQgKmFyY2hpdmVfaGVhZDsgICAgICAgICAgICAvKiBPbmx5IGludGVyZXN0aW5nIGluIG91dHB1dCByb3V0aW5lcyAqLwotICBjYXJzeW0gKnN5bWRlZnM7CQkvKiB0aGUgc3ltZGVmIGVudHJpZXMgKi8KLSAgc3ltaW5kZXggc3ltZGVmX2NvdW50OyAgICAgICAgICAgICAvKiBob3cgbWFueSB0aGVyZSBhcmUgKi8KLSAgY2hhciAqZXh0ZW5kZWRfbmFtZXM7CQkvKiBjbGV2ZXIgaW50ZWwgZXh0ZW5zaW9uICovCi0gIC8qIHdoZW4gbW9yZSBjb21waWxlcnMgYXJlIHN0YW5kYXJkIEMsIHRoaXMgY2FuIGJlIGEgdGltZV90ICovCi0gIGxvbmcgIGFybWFwX3RpbWVzdGFtcDsJLyogVGltZXN0YW1wIHZhbHVlIHdyaXR0ZW4gaW50byBhcm1hcC4KLQkJCQkgICBUaGlzIGlzIHVzZWQgZm9yIEJTRCBhcmNoaXZlcyB0byBjaGVjawotCQkJCSAgIHRoYXQgdGhlIHRpbWVzdGFtcCBpcyByZWNlbnQgZW5vdWdoCi0JCQkJICAgZm9yIHRoZSBCU0QgbGlua2VyIHRvIG5vdCBjb21wbGFpbiwKLQkJCQkgICBqdXN0IGJlZm9yZSB3ZSBmaW5pc2ggd3JpdGluZyBhbgotCQkJCSAgIGFyY2hpdmUuICAqLwotICBmaWxlX3B0ciBhcm1hcF9kYXRlcG9zOwkvKiBQb3NpdGlvbiB3aXRoaW4gYXJjaGl2ZSB0byBzZWVrIHRvCi0JCQkJICAgcmV3cml0ZSB0aGUgZGF0ZSBmaWVsZC4gICovCi0gIFBUUiB0ZGF0YTsJCQkvKiBCYWNrZW5kIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KLX07Ci0KLSNkZWZpbmUgYmZkX2FyZGF0YShiZmQpICgoYmZkKS0+dGRhdGEuYW91dF9hcl9kYXRhKQotCi0vKiBHb2VzIGluIGJmZCdzIGFyZWx0X2RhdGEgc2xvdCAqLwotc3RydWN0IGFyZWx0ZGF0YSB7Ci0gIGNoYXIgKiBhcmNoX2hlYWRlcjsJCQkgICAgIC8qIGl0J3MgYWN0dWFsbHkgYSBzdHJpbmcgKi8KLSAgdW5zaWduZWQgaW50IHBhcnNlZF9zaXplOyAgICAgLyogb2N0ZXRzIG9mIGZpbGVzaXplIG5vdCBpbmNsdWRpbmcgYXJfaGRyICovCi0gIGNoYXIgKmZpbGVuYW1lOwkJCSAgICAgLyogbnVsbC10ZXJtaW5hdGVkICovCi19OwotCi0jZGVmaW5lIGFyZWx0X3NpemUoYmZkKSAoKChzdHJ1Y3QgYXJlbHRkYXRhICopKChiZmQpLT5hcmVsdF9kYXRhKSktPnBhcnNlZF9zaXplKQotCi1leHRlcm4gUFRSIGJmZF9tYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci1leHRlcm4gUFRSIGJmZF9yZWFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7Ci1leHRlcm4gUFRSIGJmZF96bWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotCi1leHRlcm4gYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSBfYmZkX2Vycm9yX2hhbmRsZXI7Ci0KLS8qIFRoZXNlIHJvdXRpbmVzIGFsbG9jYXRlIGFuZCBmcmVlIHRoaW5ncyBvbiB0aGUgQkZEJ3Mgb2JqYWxsb2MuICAqLwotCi1leHRlcm4gUFRSIGJmZF9hbGxvYyBQQVJBTVMgKChiZmQgKiwgc2l6ZV90KSk7Ci1leHRlcm4gUFRSIGJmZF96YWxsb2MgUEFSQU1TICgoYmZkICosIHNpemVfdCkpOwotZXh0ZXJuIHZvaWQgYmZkX3JlbGVhc2UgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi1iZmQgKglfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgUEFSQU1TICgoYmZkICpvYmZkKSk7Ci1iZmQgKglfYmZkX2xvb2tfZm9yX2JmZF9pbl9jYWNoZSBQQVJBTVMgKChiZmQgKmFyY2hfYmZkLCBmaWxlX3B0ciBpbmRleCkpOwotYm9vbGVhbiBfYmZkX2FkZF9iZmRfdG9fYXJjaGl2ZV9jYWNoZSBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIsIGJmZCAqKSk7Ci1ib29sZWFuCV9iZmRfZ2VuZXJpY19ta2FyY2hpdmUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpiZmRfZ2VuZXJpY19hcmNoaXZlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuCWJmZF9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4gYmZkX3NsdXJwX2JzZF9hcm1hcF9mMiBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSNkZWZpbmUgYmZkX3NsdXJwX2JzZF9hcm1hcCBiZmRfc2x1cnBfYXJtYXAKLSNkZWZpbmUgYmZkX3NsdXJwX2NvZmZfYXJtYXAgYmZkX3NsdXJwX2FybWFwCi1ib29sZWFuCV9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKikpOwotYm9vbGVhbglfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuIF9iZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCBlbGVuZ3RoKSk7Ci1iZmQgKl9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIFBBUkFNUyAoKGJmZCAqYXJjaGl2ZSwgZmlsZV9wdHIgZmlsZXBvcykpOwotZXh0ZXJuIGJmZCAqX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXggUEFSQU1TICgoYmZkICosIHN5bWluZGV4KSk7Ci1iZmQgKiBfYmZkX25ld19iZmQgUEFSQU1TICgodm9pZCkpOwotCi1ib29sZWFuCWJmZF9mYWxzZSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotYm9vbGVhbgliZmRfdHJ1ZSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotUFRSCWJmZF9udWxsdm9pZHB0ciBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotaW50CWJmZF8wIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci11bnNpZ25lZCBpbnQJYmZkXzB1IFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1sb25nCWJmZF8wbCBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotbG9uZwlfYmZkX24xIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci12b2lkCWJmZF92b2lkIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci0KLWJmZCAqX2JmZF9uZXdfYmZkX2NvbnRhaW5lZF9pbiBQQVJBTVMgKChiZmQgKikpOwotY29uc3QgYmZkX3RhcmdldCAqX2JmZF9kdW1teV90YXJnZXQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXZvaWQJYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqZmlsZW5hbWUsCi0JCQkJCWNoYXIgKmhkcikpOwotdm9pZAliZmRfYnNkX3RydW5jYXRlX2FybmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKmZpbGVuYW1lLAotCQkJCQljaGFyICpoZHIpKTsKLXZvaWQJYmZkX2dudV90cnVuY2F0ZV9hcm5hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpmaWxlbmFtZSwKLQkJCQkJY2hhciAqaGRyKSk7Ci0KLWJvb2xlYW4JYnNkX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqYXJjaCwgdW5zaWduZWQgaW50IGVsZW5ndGgsCi0JCQkJICBzdHJ1Y3Qgb3JsICptYXAsIHVuc2lnbmVkIGludCBvcmxfY291bnQsIGludCBzdHJpZHgpKTsKLQotYm9vbGVhbgljb2ZmX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqYXJjaCwgdW5zaWduZWQgaW50IGVsZW5ndGgsCi0JCQkJICAgc3RydWN0IG9ybCAqbWFwLCB1bnNpZ25lZCBpbnQgb3JsX2NvdW50LCBpbnQgc3RyaWR4KSk7Ci0KLWV4dGVybiBQVFIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWV4dGVybiBQVFIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLWJmZCAqCWJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBQQVJBTVMgKChiZmQgKmFyY2hpdmUsCi0JCQkJCQkgICAgIGJmZCAqbGFzdF9maWxlKSk7Ci0KLWludAliZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0KLSNkZWZpbmUgX2JmZF9yZWFkX2FyX2hkcihhYmZkKSBcCi0gIEJGRF9TRU5EIChhYmZkLCBfYmZkX3JlYWRfYXJfaGRyX2ZuLCAoYWJmZCkpCi0MCi0vKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfR0VORVJJQy4gIFVzZQotICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKS4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwIGJmZF90cnVlCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbyBiZmRfdHJ1ZQotI2RlZmluZSBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vayBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkX3RydWUpCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiBsb2NhdGlvbiwgZmlsZV9wdHIgb2Zmc2V0LAotCSAgIGJmZF9zaXplX3R5cGUgY291bnQpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF93aW5kb3cgKiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotLyogR2VuZXJpYyByb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0NPUFkuICBVc2UKLSAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYykuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZCAqLCBhc2VjdGlvbiAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgYmZkICosIGFzeW1ib2wgKikpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgUFRSKSkpIGJmZF90cnVlKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0NPUkUgd2hlbiB0aGVyZSBpcyBubyBjb3JlIGZpbGUKLSAgIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLiAgKi8KLQotZXh0ZXJuIGNoYXIgKl9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBpbnQgX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX25vY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSB3aGVuIHRoZXJlIGlzIG5vIGFyY2hpdmUKLSAgIGZpbGUgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSkuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3NsdXJwX2FybWFwIGJmZF9mYWxzZQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIGJmZF9mYWxzZQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3RydW5jYXRlX2FybmFtZSBcCi0gICgodm9pZCAoKikgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY2hhciAqKSkpIGJmZF92b2lkKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV93cml0ZV9hcm1hcCBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9yZWFkX2FyX2hkciBiZmRfbnVsbHZvaWRwdHIKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLSAgKChiZmQgKigqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9nZXRfZWx0X2F0X2luZGV4IFwKLSAgKChiZmQgKigqKSBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF9mYWxzZQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgdG8gZ2V0IEJTRCBzdHlsZQotICAgYXJjaGl2ZXMuICBVc2UgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2JzZCkuICAqLwotCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2JzZF9hcm1hcAotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLWV4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpOwotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3RydW5jYXRlX2FybmFtZSBiZmRfYnNkX3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3dyaXRlX2FybWFwIGJzZF93cml0ZV9hcm1hcAotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3JlYWRfYXJfaGRyIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gIGJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQgXAotICBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgUEFSQU1TICgoYmZkICopKTsKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHRvIGdldCBDT0ZGIHN0eWxlCi0gICBhcmNoaXZlcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZikuICAqLwotCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3NsdXJwX2FybWFwIGJmZF9zbHVycF9jb2ZmX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLWV4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKTsKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfdHJ1bmNhdGVfYXJuYW1lIGJmZF9kb250X3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl93cml0ZV9hcm1hcCBjb2ZmX3dyaXRlX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3JlYWRfYXJfaGRyIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAotICBiZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgXAotICBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX3RydWUKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIHdoZXJlIHRoZXJlIGlzIG5vIHN5bWJvbAotICAgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9uMQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19tYWtlX2VtcHR5X3N5bWJvbCBcCi0gICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpKSBiZmRfdm9pZCkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSkpIGJmZF92b2lkKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpKSBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8gXAotICAoKGFsZW50ICooKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosIFwKLQkgICAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICosIFBUUiwgdW5zaWduZWQgbG9uZykpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwgdW5zaWduZWQgaW50ICopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY29uc3QgUFRSLCBhc3ltYm9sICopKSkgXAotICAgYmZkX251bGx2b2lkcHRyKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyB3aGVuIHRoZXJlIGlzIG5vIHJlbG9jCi0gICBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9yZWxvY3NfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vcmVsb2NzX2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgXAotICAoKHJlbG9jX2hvd3RvX3R5cGUgKigqKSBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSkpIFwKLSAgIGJmZF9udWxsdm9pZHB0cikKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9XUklURSBmb3IgdGFyZ2V0cyB3aGljaCBtYXkgbm90Ci0gICBiZSB3cml0dGVuLiAgVXNlIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX25vd3JpdGUpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vd3JpdGVfc2V0X2FyY2hfbWFjaCBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm93cml0ZV9zZXRfc2VjdGlvbl9jb250ZW50cyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKSkgXAotICAgYmZkX2ZhbHNlKQotCi0vKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfV1JJVEUuICBVc2UKLSAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfc2V0X2FyY2hfbWFjaCBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9MSU5LIGZvciB0YXJnZXRzIHdoaWNoIGRvIG5vdAotICAgc3VwcG9ydCBsaW5raW5nLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub2xpbmtfc2l6ZW9mX2hlYWRlcnMgKChpbnQgKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSkpIGJmZF8wKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgKChiZmRfYnl0ZSAqKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosIFwKLQkgICAgIGJmZF9ieXRlICosIGJvb2xlYW4sIGFzeW1ib2wgKiopKSkgXAotICAgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfcmVsYXhfc2VjdGlvbiBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfZ2Nfc2VjdGlvbnMgXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLSAgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKCopIFBBUkFNUyAoKGJmZCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfYWRkX3N5bWJvbHMgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2ZpbmFsX2xpbmsgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpKSBiZmRfZmFsc2UpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyBmb3IgdGFyZ2V0cyB3aGljaCBkbyBub3QKLSAgIGhhdmUgZHluYW1pYyBzeW1ib2xzIG9yIHJlbG9jcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDCi0gICAoX2JmZF9ub2R5bmFtaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9uMQotI2RlZmluZSBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIF9iZmRfbjEKLSNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0MCi0vKiBHZW5lcmljIHJvdXRpbmUgdG8gZGV0ZXJtaW5lIG9mIHRoZSBnaXZlbiBzeW1ib2wgaXMgYSBsb2NhbAotICAgbGFiZWwuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIEdlbmVyaWMgbWluaXN5bWJvbCByb3V0aW5lcy4gICovCi1leHRlcm4gbG9uZyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgUFRSICosIHVuc2lnbmVkIGludCAqKSk7Ci1leHRlcm4gYXN5bWJvbCAqX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjb25zdCBQVFIsIGFzeW1ib2wgKikpOwotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdXNpbmcgLnN0YWIvLnN0YWJzdHIgc2VjdGlvbnMuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGFzZWN0aW9uICosIGJmZF92bWEsIGJvb2xlYW4gKiwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKiwgUFRSICopKTsKLQotLyogRmluZCB0aGUgbmVhZGVyc3QgbGluZSB1c2luZyBEV0FSRiAxIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdXNpbmcgRFdBUkYgMiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosCi0JICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKLQotLyogQSByb3V0aW5lIHRvIGNyZWF0ZSBlbnRyaWVzIGZvciBhIGJmZF9saW5rX2hhc2hfdGFibGUuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5LAotCSAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGUsCi0JICAgY29uc3QgY2hhciAqc3RyaW5nKSk7Ci0KLS8qIEluaXRpYWxpemUgYSBiZmRfbGlua19oYXNoX3RhYmxlLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotCi0vKiBHZW5lcmljIGxpbmsgaGFzaCB0YWJsZSBjcmVhdGlvbiByb3V0aW5lLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLQotLyogR2VuZXJpYyBhZGQgc3ltYm9sIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogR2VuZXJpYyBhZGQgc3ltYm9sIHJvdXRpbmUuICBUaGlzIHZlcnNpb24gaXMgdXNlZCBieSB0YXJnZXRzIGZvcgotICAgd2hpY2ggdGhlIGxpbmtlciBtdXN0IGNvbGxlY3QgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBieSBuYW1lLAotICAgYXMgdGhlIGNvbGxlY3QyIHByb2dyYW0gZG9lcy4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9sc19jb2xsZWN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEdlbmVyaWMgYXJjaGl2ZSBhZGQgc3ltYm9sIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBib29sZWFuICgqY2hlY2tmbikgKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKSk7Ci0KLQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9uIHRvIGF2b2lkIHByb3RvdHlwZSBlcnJvcnMuICAqLwotdHlwZWRlZiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSBfYmZkX2xpbmtfaGFzaF9lbnRyeTsKLQotLyogR2VuZXJpYyByb3V0aW5lIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGNvbnN0IGNoYXIgKm5hbWUsIGZsYWd3b3JkLAotCSAgIGFzZWN0aW9uICosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjb3B5LAotCSAgIGJvb2xlYW4gY29uc3RydWN0b3IsIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci0KLS8qIEdlbmVyaWMgbGluayByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpOwotCi0vKiBHZW5lcmljIHJlbG9jX2xpbmtfb3JkZXIgcHJvY2Vzc2luZyByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIERlZmF1bHQgbGluayBvcmRlciBwcm9jZXNzaW5nIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogQ291bnQgdGhlIG51bWJlciBvZiByZWxvYyBlbnRyaWVzIGluIGEgbGluayBvcmRlciBsaXN0LiAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgX2JmZF9jb3VudF9saW5rX29yZGVyX3JlbG9jcwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0vKiBGaW5hbCBsaW5rIHJlbG9jYXRpb24gcm91dGluZS4gICovCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIGJmZF92bWEgYWRkcmVzcywgYmZkX3ZtYSB2YWx1ZSwgYmZkX3ZtYSBhZGRlbmQpKTsKLQotLyogUmVsb2NhdGUgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uIGJ5IGEgaG93dG8gYW5kIGEgdmFsdWUuICAqLwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICopKTsKLQotLyogTGluayBzdGFicyBpbiBzZWN0aW9ucyBpbiB0aGUgZmlyc3QgcGFzcy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfbGlua19zZWN0aW9uX3N0YWJzCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIgKiwgYXNlY3Rpb24gKiwgYXNlY3Rpb24gKiwgUFRSICopKTsKLQotLyogV3JpdGUgb3V0IHRoZSAuc3RhYiBzZWN0aW9uIHdoZW4gbGlua2luZyBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicwotICBQQVJBTVMgKChiZmQgKiwgUFRSICosIGFzZWN0aW9uICosIFBUUiAqLCBiZmRfYnl0ZSAqKSk7Ci0KLS8qIFdyaXRlIG91dCB0aGUgLnN0YWJzdHIgc3RyaW5nIHRhYmxlIHdoZW4gbGlua2luZyBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzIFBBUkFNUyAoKGJmZCAqLCBQVFIgKikpOwotCi0vKiBGaW5kIGFuIG9mZnNldCB3aXRoaW4gYSAuc3RhYiBzZWN0aW9uIHdoZW4gbGlua2luZyBzdGFicyBpbgotICAgc2VjdGlvbnMuICAqLwotCi1leHRlcm4gYmZkX3ZtYSBfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLSAgUEFSQU1TICgoYmZkICosIFBUUiAqLCBhc2VjdGlvbiAqLCBQVFIgKiwgYmZkX3ZtYSkpOwotCi0vKiBDcmVhdGUgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKl9iZmRfc3RyaW5ndGFiX2luaXQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBDcmVhdGUgYW4gWENPRkYgLmRlYnVnIHNlY3Rpb24gc3R5bGUgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpfYmZkX3hjb2ZmX3N0cmluZ3RhYl9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogRnJlZSBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gdm9pZCBfYmZkX3N0cmluZ3RhYl9mcmVlIFBBUkFNUyAoKHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOwotCi0vKiBHZXQgdGhlIHNpemUgb2YgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgX2JmZF9zdHJpbmd0YWJfc2l6ZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQotLyogQWRkIGEgc3RyaW5nIHRvIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBiZmRfc2l6ZV90eXBlIF9iZmRfc3RyaW5ndGFiX2FkZAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBoYXNoLAotCSAgIGJvb2xlYW4gY29weSkpOwotCi0vKiBXcml0ZSBvdXQgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zdHJpbmd0YWJfZW1pdCBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKSk7Ci0MCi0vKiBNYWNyb3MgdG8gdGVsbCBpZiBiZmRzIGFyZSByZWFkIG9yIHdyaXRlIGVuYWJsZWQuCi0KLSAgIE5vdGUgdGhhdCBiZmRzIG9wZW4gZm9yIHJlYWQgbWF5IGJlIHNjcmliYmxlZCBpbnRvIGlmIHRoZSBmZCBwYXNzZWQKLSAgIHRvIGJmZF9mZG9wZW5yIGlzIGFjdHVhbGx5IG9wZW4gYm90aCBmb3IgcmVhZCBhbmQgd3JpdGUKLSAgIHNpbXVsdGFuZW91c2x5LiAgSG93ZXZlciBhbiBvdXRwdXQgYmZkIHdpbGwgbmV2ZXIgYmUgb3BlbiBmb3IKLSAgIHJlYWQuICBUaGVyZWZvcmUgc29tZXRpbWVzIHlvdSB3YW50IHRvIGNoZWNrIGJmZF9yZWFkX3Agb3IKLSAgICFiZmRfcmVhZF9wLCBhbmQgb25seSBzb21ldGltZXMgYmZkX3dyaXRlX3AuCi0qLwotCi0jZGVmaW5lCWJmZF9yZWFkX3AoYWJmZCkgKChhYmZkKS0+ZGlyZWN0aW9uID09IHJlYWRfZGlyZWN0aW9uIHx8IChhYmZkKS0+ZGlyZWN0aW9uID09IGJvdGhfZGlyZWN0aW9uKQotI2RlZmluZQliZmRfd3JpdGVfcChhYmZkKSAoKGFiZmQpLT5kaXJlY3Rpb24gPT0gd3JpdGVfZGlyZWN0aW9uIHx8IChhYmZkKS0+ZGlyZWN0aW9uID09IGJvdGhfZGlyZWN0aW9uKQotCi12b2lkCWJmZF9hc3NlcnQgUEFSQU1TICgoY29uc3QgY2hhciosaW50KSk7Ci0KLSNkZWZpbmUgQkZEX0FTU0VSVCh4KSBcCi17IGlmICghKHgpKSBiZmRfYXNzZXJ0KF9fRklMRV9fLF9fTElORV9fKTsgfQotCi0jZGVmaW5lIEJGRF9GQUlMKCkgXAoteyBiZmRfYXNzZXJ0KF9fRklMRV9fLF9fTElORV9fKTsgfQotCi1GSUxFICoJYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIgUEFSQU1TICgoYmZkICopKTsKLQotZXh0ZXJuIGJmZCAqYmZkX2xhc3RfY2FjaGU7Ci0KLS8qIExpc3Qgb2Ygc3VwcG9ydGVkIHRhcmdldCB2ZWN0b3JzLCBhbmQgdGhlIGRlZmF1bHQgdmVjdG9yIChpZgotICAgYmZkX2RlZmF1bHRfdmVjdG9yWzBdIGlzIE5VTEwsIHRoZXJlIGlzIG5vIGRlZmF1bHQpLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgYmZkX3RhcmdldF92ZWN0b3JbXTsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICpiZmRfZGVmYXVsdF92ZWN0b3JbXTsKLQotLyogRnVuY3Rpb25zIHNoYXJlZCBieSB0aGUgRUNPRkYgYW5kIE1JUFMgRUxGIGJhY2tlbmRzLCB3aGljaCBoYXZlIG5vCi0gICBvdGhlciBjb21tb24gaGVhZGVyIGZpbGVzLiAgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi1zdHJ1Y3QgZWNvZmZfZmluZF9saW5lOwotI2VuZGlmCi0KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCwgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqLAotCSAgIGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9wZHIgUEFSQU1TICgoUFRSLCBiZmRfYnl0ZSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zeW0gUEFSQU1TICgoUFRSLCBiZmRfYnl0ZSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zcyBQQVJBTVMgKChQVFIsIGJmZF9ieXRlICopKTsKLQotZXh0ZXJuIGJmZF92bWEgX2JmZF9nZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiB2b2lkIF9iZmRfc2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hKSk7Ci0KLS8qIEZ1bmN0aW9uIHNoYXJlZCBieSB0aGUgQ09GRiBhbmQgRUxGIFNIIGJhY2tlbmRzLCB3aGljaCBoYXZlIG5vCi0gICBvdGhlciBjb21tb24gaGVhZGVyIGZpbGVzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgYm9vbGVhbiAoKikgKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF9ieXRlICosIGJmZF92bWEpLAotCSAgIFBUUiwgYmZkX3ZtYSAqKiwgYmZkX3ZtYSAqLCBiZmRfdm1hLCBiZmRfdm1hLCBib29sZWFuICopKTsKLQotLyogQW5kIG1vcmUgZm9sbG93cyAqLwotCi12b2lkIAotYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQgUEFSQU1TICgoYmZkICphYmZkLCAgaW50IGkpKTsKLQotdW5zaWduZWQgaW50IAotYmZkX2xvZzIgUEFSQU1TICgoYmZkX3ZtYSB4KSk7Ci0KLSNkZWZpbmUgQkZEX0NBQ0hFX01BWF9PUEVOIDEwCi1leHRlcm4gYmZkICpiZmRfbGFzdF9jYWNoZTsKLQotI2RlZmluZSBiZmRfY2FjaGVfbG9va3VwKHgpIFwKLSAgICAoKHgpPT1iZmRfbGFzdF9jYWNoZT8gXAotICAgICAgKEZJTEUqKShiZmRfbGFzdF9jYWNoZS0+aW9zdHJlYW0pOiBcCi0gICAgICAgYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIoeCkpCi1ib29sZWFuIAotYmZkX2NhY2hlX2luaXQgIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1ib29sZWFuIAotYmZkX2NhY2hlX2Nsb3NlICBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotRklMRSogCi1iZmRfb3Blbl9maWxlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1GSUxFICoKLWJmZF9jYWNoZV9sb29rdXBfd29ya2VyIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi0jaWZkZWYgX0JGRF9NQUtFX1RBQkxFX2JmZF9yZWxvY19jb2RlX3JlYWwKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGJmZF9yZWxvY19jb2RlX3JlYWxfbmFtZXNbXSA9IHsgIkBAdW5pbml0aWFsaXplZEBAIiwKLQotICAiQkZEX1JFTE9DXzY0IiwKLSAgIkJGRF9SRUxPQ18zMiIsCi0gICJCRkRfUkVMT0NfMjYiLAotICAiQkZEX1JFTE9DXzI0IiwKLSAgIkJGRF9SRUxPQ18xNiIsCi0gICJCRkRfUkVMT0NfMTQiLAotICAiQkZEX1JFTE9DXzgiLAotICAiQkZEX1JFTE9DXzY0X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18zMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMjRfUENSRUwiLAotICAiQkZEX1JFTE9DXzE2X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18xMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfOF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMzJfR09UX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18xNl9HT1RfUENSRUwiLAotICAiQkZEX1JFTE9DXzhfR09UX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18zMl9HT1RPRkYiLAotICAiQkZEX1JFTE9DXzE2X0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfTE8xNl9HT1RPRkYiLAotICAiQkZEX1JFTE9DX0hJMTZfR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ184X0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfMzJfUExUX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18yNF9QTFRfUENSRUwiLAotICAiQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfOF9QTFRfUENSRUwiLAotICAiQkZEX1JFTE9DXzMyX1BMVE9GRiIsCi0gICJCRkRfUkVMT0NfMTZfUExUT0ZGIiwKLSAgIkJGRF9SRUxPQ19MTzE2X1BMVE9GRiIsCi0gICJCRkRfUkVMT0NfSEkxNl9QTFRPRkYiLAotICAiQkZEX1JFTE9DX0hJMTZfU19QTFRPRkYiLAotICAiQkZEX1JFTE9DXzhfUExUT0ZGIiwKLSAgIkJGRF9SRUxPQ182OEtfR0xPQl9EQVQiLAotICAiQkZEX1JFTE9DXzY4S19KTVBfU0xPVCIsCi0gICJCRkRfUkVMT0NfNjhLX1JFTEFUSVZFIiwKLSAgIkJGRF9SRUxPQ18zMl9CQVNFUkVMIiwKLSAgIkJGRF9SRUxPQ18xNl9CQVNFUkVMIiwKLSAgIkJGRF9SRUxPQ19MTzE2X0JBU0VSRUwiLAotICAiQkZEX1JFTE9DX0hJMTZfQkFTRVJFTCIsCi0gICJCRkRfUkVMT0NfSEkxNl9TX0JBU0VSRUwiLAotICAiQkZEX1JFTE9DXzhfQkFTRVJFTCIsCi0gICJCRkRfUkVMT0NfUlZBIiwKLSAgIkJGRF9SRUxPQ184X0ZGbm4iLAotICAiQkZEX1JFTE9DXzMyX1BDUkVMX1MyIiwKLSAgIkJGRF9SRUxPQ18xNl9QQ1JFTF9TMiIsCi0gICJCRkRfUkVMT0NfMjNfUENSRUxfUzIiLAotICAiQkZEX1JFTE9DX0hJMjIiLAotICAiQkZEX1JFTE9DX0xPMTAiLAotICAiQkZEX1JFTE9DX0dQUkVMMTYiLAotICAiQkZEX1JFTE9DX0dQUkVMMzIiLAotICAiQkZEX1JFTE9DX0k5NjBfQ0FMTEoiLAotICAiQkZEX1JFTE9DX05PTkUiLAotICAiQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDMTMiLAotICAiQkZEX1JFTE9DX1NQQVJDX0dPVDEwIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19HT1QxMyIsCi0gICJCRkRfUkVMT0NfU1BBUkNfR09UMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDX1BDMTAiLAotICAiQkZEX1JFTE9DX1NQQVJDX1BDMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDX1dQTFQzMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfQ09QWSIsCi0gICJCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQiLAotICAiQkZEX1JFTE9DX1NQQVJDX0pNUF9TTE9UIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19SRUxBVElWRSIsCi0gICJCRkRfUkVMT0NfU1BBUkNfVUEzMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfQkFTRTEzIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19CQVNFMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDXzEwIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ18xMSIsCi0gICJCRkRfUkVMT0NfU1BBUkNfT0xPMTAiLAotICAiQkZEX1JFTE9DX1NQQVJDX0hIMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDX0hNMTAiLAotICAiQkZEX1JFTE9DX1NQQVJDX0xNMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDX1BDX0hIMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDX1BDX0hNMTAiLAotICAiQkZEX1JFTE9DX1NQQVJDX1BDX0xNMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDX1dESVNQMTYiLAotICAiQkZEX1JFTE9DX1NQQVJDX1dESVNQMTkiLAotICAiQkZEX1JFTE9DX1NQQVJDXzciLAotICAiQkZEX1JFTE9DX1NQQVJDXzYiLAotICAiQkZEX1JFTE9DX1NQQVJDXzUiLAotICAiQkZEX1JFTE9DX1NQQVJDX1BMVDY0IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19ISVgyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfTE9YMTAiLAotICAiQkZEX1JFTE9DX1NQQVJDX0g0NCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfTTQ0IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19MNDQiLAotICAiQkZEX1JFTE9DX1NQQVJDX1JFR0lTVEVSIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19SRVYzMiIsCi0gICJCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTYiLAotICAiQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2IiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9HUERJU1AiLAotICAiQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUwiLAotICAiQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9MSVRVU0UiLAotICAiQkZEX1JFTE9DX0FMUEhBX0hJTlQiLAotICAiQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UiLAotICAiQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSIiwKLSAgIkJGRF9SRUxPQ19NSVBTX0pNUCIsCi0gICJCRkRfUkVMT0NfTUlQUzE2X0pNUCIsCi0gICJCRkRfUkVMT0NfTUlQUzE2X0dQUkVMIiwKLSAgIkJGRF9SRUxPQ19ISTE2IiwKLSAgIkJGRF9SRUxPQ19ISTE2X1MiLAotICAiQkZEX1JFTE9DX0xPMTYiLAotICAiQkZEX1JFTE9DX1BDUkVMX0hJMTZfUyIsCi0gICJCRkRfUkVMT0NfUENSRUxfTE8xNiIsCi0gICJCRkRfUkVMT0NfTUlQU19MSVRFUkFMIiwKLSAgIkJGRF9SRUxPQ19NSVBTX0dPVDE2IiwKLSAgIkJGRF9SRUxPQ19NSVBTX0NBTEwxNiIsCi0gICJCRkRfUkVMT0NfTUlQU19HT1RfSEkxNiIsCi0gICJCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiIsCi0gICJCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYiLAotICAiQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2IiwKLQotICAiQkZEX1JFTE9DXzM4Nl9HT1QzMiIsCi0gICJCRkRfUkVMT0NfMzg2X1BMVDMyIiwKLSAgIkJGRF9SRUxPQ18zODZfQ09QWSIsCi0gICJCRkRfUkVMT0NfMzg2X0dMT0JfREFUIiwKLSAgIkJGRF9SRUxPQ18zODZfSlVNUF9TTE9UIiwKLSAgIkJGRF9SRUxPQ18zODZfUkVMQVRJVkUiLAotICAiQkZEX1JFTE9DXzM4Nl9HT1RPRkYiLAotICAiQkZEX1JFTE9DXzM4Nl9HT1RQQyIsCi0gICJCRkRfUkVMT0NfTlMzMktfSU1NXzgiLAotICAiQkZEX1JFTE9DX05TMzJLX0lNTV8xNiIsCi0gICJCRkRfUkVMT0NfTlMzMktfSU1NXzMyIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTlMzMktfSU1NXzE2X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19JTU1fMzJfUENSRUwiLAotICAiQkZEX1JFTE9DX05TMzJLX0RJU1BfOCIsCi0gICJCRkRfUkVMT0NfTlMzMktfRElTUF8xNiIsCi0gICJCRkRfUkVMT0NfTlMzMktfRElTUF8zMiIsCi0gICJCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzE2X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzMyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19QUENfQjI2IiwKLSAgIkJGRF9SRUxPQ19QUENfQkEyNiIsCi0gICJCRkRfUkVMT0NfUFBDX1RPQzE2IiwKLSAgIkJGRF9SRUxPQ19QUENfQjE2IiwKLSAgIkJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU4iLAotICAiQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU4iLAotICAiQkZEX1JFTE9DX1BQQ19CQTE2IiwKLSAgIkJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOIiwKLSAgIkJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTiIsCi0gICJCRkRfUkVMT0NfUFBDX0NPUFkiLAotICAiQkZEX1JFTE9DX1BQQ19HTE9CX0RBVCIsCi0gICJCRkRfUkVMT0NfUFBDX0pNUF9TTE9UIiwKLSAgIkJGRF9SRUxPQ19QUENfUkVMQVRJVkUiLAotICAiQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEMiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMiIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2IiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE8iLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9ISSIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hBIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNiIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2IiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUwiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfU0RBMjEiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfTVJLUkVGIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNFQzE2IiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0RBIiwKLSAgIkJGRF9SRUxPQ19DVE9SIiwKLSAgIkJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNIIiwKLSAgIkJGRF9SRUxPQ19BUk1fSU1NRURJQVRFIiwKLSAgIkJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTSIsCi0gICJCRkRfUkVMT0NfQVJNX1NISUZUX0lNTSIsCi0gICJCRkRfUkVMT0NfQVJNX1NXSSIsCi0gICJCRkRfUkVMT0NfQVJNX01VTFRJIiwKLSAgIkJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTSIsCi0gICJCRkRfUkVMT0NfQVJNX0FEUl9JTU0iLAotICAiQkZEX1JFTE9DX0FSTV9MRFJfSU1NIiwKLSAgIkJGRF9SRUxPQ19BUk1fTElURVJBTCIsCi0gICJCRkRfUkVMT0NfQVJNX0lOX1BPT0wiLAotICAiQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOCIsCi0gICJCRkRfUkVMT0NfQVJNX0hXTElURVJBTCIsCi0gICJCRkRfUkVMT0NfQVJNX1RIVU1CX0FERCIsCi0gICJCRkRfUkVMT0NfQVJNX1RIVU1CX0lNTSIsCi0gICJCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZUIiwKLSAgIkJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19BUk1fR09UMTIiLAotICAiQkZEX1JFTE9DX0FSTV9HT1QzMiIsCi0gICJCRkRfUkVMT0NfQVJNX0pVTVBfU0xPVCIsCi0gICJCRkRfUkVMT0NfQVJNX0NPUFkiLAotICAiQkZEX1JFTE9DX0FSTV9HTE9CX0RBVCIsCi0gICJCRkRfUkVMT0NfQVJNX1BMVDMyIiwKLSAgIkJGRF9SRUxPQ19BUk1fUkVMQVRJVkUiLAotICAiQkZEX1JFTE9DX0FSTV9HT1RPRkYiLAotICAiQkZEX1JFTE9DX0FSTV9HT1RQQyIsCi0gICJCRkRfUkVMT0NfU0hfUENESVNQOEJZMiIsCi0gICJCRkRfUkVMT0NfU0hfUENESVNQMTJCWTIiLAotICAiQkZEX1JFTE9DX1NIX0lNTTQiLAotICAiQkZEX1JFTE9DX1NIX0lNTTRCWTIiLAotICAiQkZEX1JFTE9DX1NIX0lNTTRCWTQiLAotICAiQkZEX1JFTE9DX1NIX0lNTTgiLAotICAiQkZEX1JFTE9DX1NIX0lNTThCWTIiLAotICAiQkZEX1JFTE9DX1NIX0lNTThCWTQiLAotICAiQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMiIsCi0gICJCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0IiwKLSAgIkJGRF9SRUxPQ19TSF9TV0lUQ0gxNiIsCi0gICJCRkRfUkVMT0NfU0hfU1dJVENIMzIiLAotICAiQkZEX1JFTE9DX1NIX1VTRVMiLAotICAiQkZEX1JFTE9DX1NIX0NPVU5UIiwKLSAgIkJGRF9SRUxPQ19TSF9BTElHTiIsCi0gICJCRkRfUkVMT0NfU0hfQ09ERSIsCi0gICJCRkRfUkVMT0NfU0hfREFUQSIsCi0gICJCRkRfUkVMT0NfU0hfTEFCRUwiLAotICAiQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDkiLAotICAiQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyIiwKLSAgIkJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMyIsCi0gICJCRkRfUkVMT0NfQVJDX0IyMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfQVJDX0IyNiIsCi0gICJCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SIiwKLSAgIkJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0wiLAotICAiQkZEX1JFTE9DX0QxMFZfMTgiLAotICAiQkZEX1JFTE9DX0QxMFZfMThfUENSRUwiLAotICAiQkZEX1JFTE9DX0QzMFZfNiIsCi0gICJCRkRfUkVMT0NfRDMwVl85X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzlfUENSRUxfUiIsCi0gICJCRkRfUkVMT0NfRDMwVl8xNSIsCi0gICJCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzIxIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMX1IiLAotICAiQkZEX1JFTE9DX0QzMFZfMzIiLAotICAiQkZEX1JFTE9DX0QzMFZfMzJfUENSRUwiLAotICAiQkZEX1JFTE9DX00zMlJfMjQiLAotICAiQkZEX1JFTE9DX00zMlJfMTBfUENSRUwiLAotICAiQkZEX1JFTE9DX00zMlJfMThfUENSRUwiLAotICAiQkZEX1JFTE9DX00zMlJfMjZfUENSRUwiLAotICAiQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8iLAotICAiQkZEX1JFTE9DX00zMlJfSEkxNl9TTE8iLAotICAiQkZEX1JFTE9DX00zMlJfTE8xNiIsCi0gICJCRkRfUkVMT0NfTTMyUl9TREExNiIsCi0gICJCRkRfUkVMT0NfVjg1MF85X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19WODUwXzIyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1pEQV8xNV8xNl9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzZfOF9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzdfOF9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzdfN19PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzE2XzE2X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9UREFfNF81X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9UREFfNF80X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQiLAotCi0gICJCRkRfUkVMT0NfTU4xMDMwMF8zMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTU4xMDMwMF8xNl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfVElDMzBfTERQIiwKLSAgIkJGRF9SRUxPQ19GUjMwXzQ4IiwKLSAgIkJGRF9SRUxPQ19GUjMwXzIwIiwKLSAgIkJGRF9SRUxPQ19GUjMwXzZfSU5fNCIsCi0gICJCRkRfUkVMT0NfRlIzMF84X0lOXzgiLAotICAiQkZEX1JFTE9DX0ZSMzBfOV9JTl84IiwKLSAgIkJGRF9SRUxPQ19GUjMwXzEwX0lOXzgiLAotICAiQkZEX1JFTE9DX0ZSMzBfOV9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfRlIzMF8xMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNCIsCi0gICJCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTIiLAotICAiQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTIiLAotICAiQkZEX1JFTE9DX01DT1JFX1BDUkVMXzMyIiwKLSAgIkJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIiLAotICAiQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUIiwKLSAgIkJGRF9SRUxPQ19WVEFCTEVfRU5UUlkiLAotICJAQG92ZXJmbG93OiBCRkRfUkVMT0NfVU5VU0VEQEAiLAotfTsKLSNlbmRpZgotCi1yZWxvY19ob3d0b190eXBlICoKLWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0gUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgIGNvZGUpKTsKLQotYm9vbGVhbiAKLWJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0gICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLSAgICBib29sZWFuICopKTsKLQotYm9vbGVhbiAKLWJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0gUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotYmZkX2J5dGUgKgotCi1iZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlciwKLSAgICBiZmRfYnl0ZSAqZGF0YSwKLSAgICBib29sZWFuIHJlbG9jYXRlYWJsZSwKLSAgICBhc3ltYm9sICoqc3ltYm9scykpOwotCi1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0OwotYm9vbGVhbiAKLWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggUEFSQU1TICgoYmZkICphYmZkLAotICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotICAgIHVuc2lnbmVkIGxvbmcgbWFjaCkpOwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2RlZmF1bHRfY29tcGF0aWJsZQotIFBBUkFNUyAoKGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYSwKLSAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmIpKTsKLQotYm9vbGVhbiAKLWJmZF9kZWZhdWx0X3NjYW4gUEFSQU1TICgoY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKnN0cmluZykpOwotCi1zdHJ1Y3QgZWxmX2ludGVybmFsX3NoZHIgKgotYmZkX2VsZl9maW5kX3NlY3Rpb24gIFBBUkFNUyAoKGJmZCAqYWJmZCwgY2hhciAqbmFtZSkpOwotCmRpZmYgLS1naXQgYS9iZmQvbGliY29mZi1pbi5oIGIvYmZkL2xpYmNvZmYtaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjMjEyMS4uMDAwMDAwMAotLS0gYS9iZmQvbGliY29mZi1pbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTI5ICswLDAgQEAKLS8qIEJGRCBDT0ZGIG9iamVjdCBmaWxlIHByaXZhdGUgc3RydWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi0qKiBOT1RFOiBsaWJjb2ZmLmggaXMgYSBHRU5FUkFURUQgZmlsZS4gIERvbid0IGNoYW5nZSBpdDsgaW5zdGVhZCwKLSoqIGNoYW5nZSBsaWJjb2ZmLWluLmggb3IgY29mZmNvZGUuaC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0vKiBPYmplY3QgZmlsZSB0ZGF0YTsgYWNjZXNzIG1hY3JvcyAqLwotCi0jZGVmaW5lIGNvZmZfZGF0YShiZmQpCQkoKGJmZCktPnRkYXRhLmNvZmZfb2JqX2RhdGEpCi0jZGVmaW5lIGV4ZWNfaGRyKGJmZCkJCShjb2ZmX2RhdGEoYmZkKS0+aGRyKQotI2RlZmluZSBvYmpfcGUoYmZkKSAgICAgICAgICAgICAoY29mZl9kYXRhKGJmZCktPnBlKQotI2RlZmluZSBvYmpfc3ltYm9scyhiZmQpCShjb2ZmX2RhdGEoYmZkKS0+c3ltYm9scykKLSNkZWZpbmUJb2JqX3N5bV9maWxlcG9zKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5zeW1fZmlsZXBvcykKLQotI2RlZmluZSBvYmpfcmVsb2NiYXNlKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yZWxvY2Jhc2UpCi0jZGVmaW5lIG9ial9yYXdfc3ltZW50cyhiZmQpCShjb2ZmX2RhdGEoYmZkKS0+cmF3X3N5bWVudHMpCi0jZGVmaW5lIG9ial9yYXdfc3ltZW50X2NvdW50KGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yYXdfc3ltZW50X2NvdW50KQotI2RlZmluZSBvYmpfY29udmVydChiZmQpCShjb2ZmX2RhdGEoYmZkKS0+Y29udmVyc2lvbl90YWJsZSkKLSNkZWZpbmUgb2JqX2NvbnZfdGFibGVfc2l6ZShiZmQpIChjb2ZmX2RhdGEoYmZkKS0+Y29udl90YWJsZV9zaXplKQotCi0jZGVmaW5lIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5leHRlcm5hbF9zeW1zKQotI2RlZmluZSBvYmpfY29mZl9rZWVwX3N5bXMoYmZkKQkoY29mZl9kYXRhIChiZmQpLT5rZWVwX3N5bXMpCi0jZGVmaW5lIG9ial9jb2ZmX3N0cmluZ3MoYmZkKQkoY29mZl9kYXRhIChiZmQpLT5zdHJpbmdzKQotI2RlZmluZSBvYmpfY29mZl9rZWVwX3N0cmluZ3MoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5rZWVwX3N0cmluZ3MpCi0jZGVmaW5lIG9ial9jb2ZmX3N5bV9oYXNoZXMoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5zeW1faGFzaGVzKQotCi0jZGVmaW5lIG9ial9jb2ZmX2xvY2FsX3RvY190YWJsZShiZmQpIChjb2ZmX2RhdGEoYmZkKS0+bG9jYWxfdG9jX3N5bV9tYXApCi0KLS8qIGBUZGF0YScgaW5mb3JtYXRpb24ga2VwdCBmb3IgQ09GRiBmaWxlcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNvZmZfdGRhdGEKLXsKLSAgc3RydWN0ICAgY29mZl9zeW1ib2xfc3RydWN0ICpzeW1ib2xzOwkvKiBzeW10YWIgZm9yIGlucHV0IGJmZCAqLwotICB1bnNpZ25lZCBpbnQgKmNvbnZlcnNpb25fdGFibGU7Ci0gIGludCBjb252X3RhYmxlX3NpemU7Ci0gIGZpbGVfcHRyIHN5bV9maWxlcG9zOwotCi0gIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnJhd19zeW1lbnRzOwotICB1bnNpZ25lZCBpbnQgcmF3X3N5bWVudF9jb3VudDsKLQotICAvKiBUaGVzZSBhcmUgb25seSB2YWxpZCBvbmNlIHdyaXRpbmcgaGFzIGJlZ3VuICovCi0gIGxvbmcgaW50IHJlbG9jYmFzZTsKLQotICAvKiBUaGVzZSBtZW1iZXJzIGNvbW11bmljYXRlIGltcG9ydGFudCBjb25zdGFudHMgYWJvdXQgdGhlIHN5bWJvbCB0YWJsZQotICAgICB0byBHREIncyBzeW1ib2wtcmVhZGluZyBjb2RlLiAgVGhlc2UgYGNvbnN0YW50cycgdW5mb3J0dW5hdGVseSB2YXJ5Ci0gICAgIGZyb20gY29mZiBpbXBsZW1lbnRhdGlvbiB0byBpbXBsZW1lbnRhdGlvbi4uLiAgKi8KLSAgdW5zaWduZWQgbG9jYWxfbl9idG1hc2s7Ci0gIHVuc2lnbmVkIGxvY2FsX25fYnRzaGZ0OwotICB1bnNpZ25lZCBsb2NhbF9uX3RtYXNrOwotICB1bnNpZ25lZCBsb2NhbF9uX3RzaGlmdDsKLSAgdW5zaWduZWQgbG9jYWxfc3ltZXN6OwotICB1bnNpZ25lZCBsb2NhbF9hdXhlc3o7Ci0gIHVuc2lnbmVkIGxvY2FsX2xpbmVzejsKLQotICAvKiBUaGUgdW5zd2FwcGVkIGV4dGVybmFsIHN5bWJvbHMuICBNYXkgYmUgTlVMTC4gIFJlYWQgYnkKLSAgICAgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzLiAgKi8KLSAgUFRSIGV4dGVybmFsX3N5bXM7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGV4dGVybmFsX3N5bXMgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9zeW1zOwotCi0gIC8qIFRoZSBzdHJpbmcgdGFibGUuICBNYXkgYmUgTlVMTC4gIFJlYWQgYnkKLSAgICAgX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlLiAgKi8KLSAgY2hhciAqc3RyaW5nczsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgc3RyaW5ncyBtYXkgbm90IGJlIGZyZWVkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX3N0cmluZ3M7Ci0KLSAgLyogaXMgdGhpcyBhIFBFIGZvcm1hdCBjb2ZmIGZpbGUgKi8KLSAgaW50IHBlOwotICAvKiBVc2VkIGJ5IHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLQotICAvKiB1c2VkIGJ5IHRoZSBwZSBsaW5rZXIgZm9yIFBvd2VyUEMgKi8KLSAgaW50ICpsb2NhbF90b2Nfc3ltX21hcDsKLQotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotCi0gIC8qIFVzZWQgYnkgY29mZl9maW5kX25lYXJlc3RfbGluZS4gICovCi0gIFBUUiBsaW5lX2luZm87Ci0KLSAgLyogQ29weSBvZiBzb21lIG9mIHRoZSBmX2ZsYWdzIGJpdHMgaW4gdGhlIENPRkYgZmlsZWhkciBzdHJ1Y3R1cmUsCi0gICAgIHVzZWQgYnkgQVJNIGNvZGUuICAqLwotICBmbGFnd29yZCBmbGFnczsKLQotfSBjb2ZmX2RhdGFfdHlwZTsKLQotLyogVGRhdGEgZm9yIHBlIGltYWdlIGZpbGVzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgcGVfdGRhdGEKLXsKLSAgY29mZl9kYXRhX3R5cGUgY29mZjsKLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgcGVfb3B0aGRyOwotICBpbnQgZGxsOwotICBpbnQgaGFzX3JlbG9jX3NlY3Rpb247Ci0gIGJvb2xlYW4gKCppbl9yZWxvY19wKSBQQVJBTVMoKGJmZCAqLCByZWxvY19ob3d0b190eXBlICopKTsKLSAgZmxhZ3dvcmQgcmVhbF9mbGFnczsKLX0gcGVfZGF0YV90eXBlOwotCi0jZGVmaW5lIHBlX2RhdGEoYmZkKQkJKChiZmQpLT50ZGF0YS5wZV9vYmpfZGF0YSkKLQotLyogVGRhdGEgZm9yIFhDT0ZGIGZpbGVzLiAgKi8KLQotc3RydWN0IHhjb2ZmX3RkYXRhCi17Ci0gIC8qIEJhc2ljIENPRkYgaW5mb3JtYXRpb24uICAqLwotICBjb2ZmX2RhdGFfdHlwZSBjb2ZmOwotCi0gIC8qIFRydWUgaWYgYSBsYXJnZSBhLm91dCBoZWFkZXIgc2hvdWxkIGJlIGdlbmVyYXRlZC4gICovCi0gIGJvb2xlYW4gZnVsbF9hb3V0aGRyOwotCi0gIC8qIFRPQyB2YWx1ZS4gICovCi0gIGJmZF92bWEgdG9jOwotCi0gIC8qIEluZGV4IG9mIHNlY3Rpb24gaG9sZGluZyBUT0MuICAqLwotICBpbnQgc250b2M7Ci0KLSAgLyogSW5kZXggb2Ygc2VjdGlvbiBob2xkaW5nIGVudHJ5IHBvaW50LiAgKi8KLSAgaW50IHNuZW50cnk7Ci0KLSAgLyogLnRleHQgYWxpZ25tZW50IGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgaW50IHRleHRfYWxpZ25fcG93ZXI7Ci0KLSAgLyogLmRhdGEgYWxpZ25tZW50IGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgaW50IGRhdGFfYWxpZ25fcG93ZXI7Ci0KLSAgLyogbW9kdHlwZSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIHNob3J0IG1vZHR5cGU7Ci0KLSAgLyogY3B1dHlwZSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIHNob3J0IGNwdXR5cGU7Ci0KLSAgLyogbWF4ZGF0YSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGJmZF9zaXplX3R5cGUgbWF4ZGF0YTsKLQotICAvKiBtYXhzdGFjayBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGJmZF9zaXplX3R5cGUgbWF4c3RhY2s7Ci0KLSAgLyogVXNlZCBieSB0aGUgWENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotICBhc2VjdGlvbiAqKmNzZWN0czsKLSAgdW5zaWduZWQgbG9uZyAqZGVidWdfaW5kaWNlczsKLSAgdW5zaWduZWQgaW50IGltcG9ydF9maWxlX2lkOwotfTsKLQotI2RlZmluZSB4Y29mZl9kYXRhKGFiZmQpICgoYWJmZCktPnRkYXRhLnhjb2ZmX29ial9kYXRhKQotCi0vKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgYXN5bWJvbCB0byBlbnN1cmUgdGhhdCB0aGUKLSAqIG1hY3JvIGlzIG9ubHkgZXZlciBhcHBsaWVkIHRvIGFuIGFzeW1ib2wuICAqLwotI2RlZmluZSBjb2Zmc3ltYm9sKGFzeW1ib2wpICgoY29mZl9zeW1ib2xfdHlwZSAqKSgmKChhc3ltYm9sKS0+dGhlX2JmZCkpKQotCi0vKiBUaGUgdXNlZF9ieV9iZmQgZmllbGQgb2YgYSBzZWN0aW9uIG1heSBiZSBzZXQgdG8gYSBwb2ludGVyIHRvIHRoaXMKLSAgIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVGhlIHJlbG9jcywgc3dhcHBlZCBpbnRvIENPRkYgaW50ZXJuYWwgZm9ybS4gIFRoaXMgbWF5IGJlIE5VTEwuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgcmVsb2NzIGVudHJ5IG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfcmVsb2NzOwotICAvKiBUaGUgc2VjdGlvbiBjb250ZW50cy4gIFRoaXMgbWF5IGJlIE5VTEwuICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGNvbnRlbnRzIGVudHJ5IG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfY29udGVudHM7Ci0gIC8qIEluZm9ybWF0aW9uIGNhY2hlZCBieSBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBpOwotICBjb25zdCBjaGFyICpmdW5jdGlvbjsKLSAgaW50IGxpbmVfYmFzZTsKLSAgLyogQSBwb2ludGVyIHVzZWQgZm9yIC5zdGFiIGxpbmtpbmcgb3B0aW1pemF0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci0gIC8qIEF2YWlsYWJsZSBmb3IgaW5kaXZpZHVhbCBiYWNrZW5kcy4gICovCi0gIFBUUiB0ZGF0YTsKLX07Ci0KLS8qIEFuIGFjY2Vzc29yIG1hY3JvIGZvciB0aGUgY29mZl9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIGNvZmZfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEgKikgKHNlYyktPnVzZWRfYnlfYmZkKQotCi0vKiBUZGF0YSBmb3Igc2VjdGlvbnMgaW4gWENPRkYgZmlsZXMuICBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmtlci4gICovCi0KLXN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhCi17Ci0gIC8qIFVzZWQgZm9yIFhDT0ZGIGNzZWN0cyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXI7IHBvaW50cyB0byB0aGUgcmVhbAotICAgICBYQ09GRiBzZWN0aW9uIHdoaWNoIGNvbnRhaW5zIHRoaXMgY3NlY3QuICAqLwotICBhc2VjdGlvbiAqZW5jbG9zaW5nOwotICAvKiBUaGUgbGluZW5vX2NvdW50IGZpZWxkIGZvciB0aGUgZW5jbG9zaW5nIHNlY3Rpb24sIGJlY2F1c2Ugd2UgYXJlCi0gICAgIGdvaW5nIHRvIGNsb2JiZXIgaXQgdGhlcmUuICAqLwotICB1bnNpZ25lZCBpbnQgbGluZW5vX2NvdW50OwotICAvKiBUaGUgZmlyc3QgYW5kIG9uZSBwYXN0IHRoZSBsYXN0IHN5bWJvbCBpbmRpY2VzIGZvciBzeW1ib2xzIHVzZWQKLSAgICAgYnkgdGhpcyBjc2VjdC4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmlyc3Rfc3ltbmR4OwotICB1bnNpZ25lZCBsb25nIGxhc3Rfc3ltbmR4OwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gdGhlIHhjb2ZmX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgeGNvZmZfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhICopIGNvZmZfc2VjdGlvbl9kYXRhICgoYWJmZCksIChzZWMpKS0+dGRhdGEpCi0KLS8qIFRkYXRhIGZvciBzZWN0aW9ucyBpbiBQRUkgaW1hZ2UgZmlsZXMuICAqLwotCi1zdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVGhlIHZpcnR1YWwgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgdmlydF9zaXplOwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gZm9yIHRoZSBwZWlfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBwZWlfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSAqKSBjb2ZmX3NlY3Rpb25fZGF0YSAoKGFiZmQpLCAoc2VjKSktPnRkYXRhKQotCi0vKiBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMuICAqLwotCi1zdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICBTZXQgdG8gLTEgaW5pdGlhbGx5LiAgU2V0IHRvIC0yIGlmCi0gICAgIHRoZXJlIGlzIGEgcmVsb2MgYWdhaW5zdCB0aGlzIHN5bWJvbC4gICovCi0gIGxvbmcgaW5keDsKLQotICAvKiBTeW1ib2wgdHlwZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHR5cGU7Ci0KLSAgLyogU3ltYm9sIGNsYXNzLiAgKi8KLSAgdW5zaWduZWQgY2hhciBjbGFzczsKLQotICAvKiBOdW1iZXIgb2YgYXV4aWxpYXJ5IGVudHJpZXMuICAqLwotICBjaGFyIG51bWF1eDsKLQotICAvKiBCRkQgdG8gdGFrZSBhdXhpbGlhcnkgZW50cmllcyBmcm9tLiAgKi8KLSAgYmZkICphdXhiZmQ7Ci0KLSAgLyogUG9pbnRlciB0byBhcnJheSBvZiBhdXhpbGlhcnkgZW50cmllcywgaWYgYW55LiAgKi8KLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXg7Ci19OwotCi0vKiBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0gIC8qIEEgcG9pbnRlciB0byBpbmZvcm1hdGlvbiB1c2VkIHRvIGxpbmsgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotICBQVFIgc3RhYl9pbmZvOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykJXAotICAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQkJCQkJXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCi0JCQkgKGNvcHkpLCAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIEZ1bmN0aW9ucyBpbiBjb2ZmZ2VuLmMuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmNvZmZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBzdHJ1Y3Qgc2VjICpjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggUEFSQU1TICgoYmZkICosIGludCkpOwotZXh0ZXJuIGxvbmcgY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBpbnQgY29mZl9jb3VudF9saW5lbnVtYmVycyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBjb2ZmX3N5bWJvbF9zdHJ1Y3QgKmNvZmZfc3ltYm9sX2Zyb20gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl9yZW51bWJlcl9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBpbnQgKikpOwotZXh0ZXJuIHZvaWQgY29mZl9tYW5nbGVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl93cml0ZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3dyaXRlX2xpbmVudW1iZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYWxlbnQgKmNvZmZfZ2V0X2xpbmVubyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1leHRlcm4gYXN5bWJvbCAqY29mZl9zZWN0aW9uX3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICpjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYiBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLWV4dGVybiBhc3ltYm9sICpjb2ZmX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX3ByaW50X3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVwLCBhc3ltYm9sICosCi0JCQkJICAgICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3cpKTsKLWV4dGVybiB2b2lkIGNvZmZfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0JCQkJCSAgc3ltYm9sX2luZm8gKnJldCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGFzeW1ib2wgKmNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJCQkgICAgdW5zaWduZWQgbG9uZykpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl9maW5kX25lYXJlc3RfbGluZSBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgICAgIGFzZWN0aW9uICosCi0JCQkJCSAgICAgICBhc3ltYm9sICoqLAotCQkJCQkgICAgICAgYmZkX3ZtYSBvZmZzZXQsCi0JCQkJCSAgICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyLAotCQkJCQkgICAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyKSk7Ci1leHRlcm4gaW50IGNvZmZfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4gcmVsb2MpKTsKLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1leHRlcm4gYmZkX2J5dGUgKmJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqLCBib29sZWFuIHJlbG9jYXRlYWJsZSwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGJmZF92bWEgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgUEFSQU1TICgoYXJlbGVudCAqLAotCQkJCQkJICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJCSAgIGFzZWN0aW9uICopKTsKLWV4dGVybiB2b2lkIGJmZF9wZXJmb3JtX3NsaXAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgc2xpcCwKLQkJCQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBiZmRfdm1hIHZhbCkpOwotCi0vKiBGdW5jdGlvbnMgYW5kIHR5cGVzIGluIGNvZmZsaW5rLmMuICAqLwotCi0jZGVmaW5lIFNUUklOR19TSVpFX1NJWkUgKDQpCi0KLS8qIFdlIHVzZSBhIGhhc2ggdGFibGUgdG8gbWVyZ2UgaWRlbnRpY2FsIGVudW0sIHN0cnVjdCwgYW5kIHVuaW9uCi0gICBkZWZpbml0aW9ucyBpbiB0aGUgbGlua2VyLiAgKi8KLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYSBzaW5nbGUgZWxlbWVudCAoYW4gZW51bSB2YWx1ZSwgYQotICAgc3RydWN0dXJlIG9yIHVuaW9uIGZpZWxkKSBpbiB0aGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQKLXsKLSAgLyogTmV4dCBlbGVtZW50LiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqbmV4dDsKLQotICAvKiBOYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUeXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0KLSAgLyogU3ltYm9sIGluZGV4IGZvciBjb21wbGV4IHR5cGUuICAqLwotICBsb25nIHRhZ25keDsKLX07Ci0KLS8qIEEgbGlua2VkIGxpc3Qgb2YgZGVidWcgbWVyZ2UgZW50cmllcyBmb3IgYSBnaXZlbiBuYW1lLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZQotewotICAvKiBOZXh0IHR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqbmV4dDsKLQotICAvKiBDbGFzcyBvZiB0eXBlLiAgKi8KLSAgaW50IGNsYXNzOwotCi0gIC8qIFN5bWJvbCBpbmRleCB3aGVyZSB0aGlzIHR5cGUgaXMgZGVmaW5lZC4gICovCi0gIGxvbmcgaW5keDsKLQotICAvKiBMaXN0IG9mIGVsZW1lbnRzLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqZWxlbWVudHM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB3ZSBzdG9yZSBpbiB0aGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogQSBsaXN0IG9mIHR5cGVzIHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqdHlwZXM7Ci19OwotCi0vKiBUaGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBJbml0aWFsaXplIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfaW5pdCh0YWJsZSkgXAotICAoYmZkX2hhc2hfdGFibGVfaW5pdCAoJih0YWJsZSktPnJvb3QsIF9iZmRfY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMpKQotCi0vKiBGcmVlIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSh0YWJsZSkgXAotICAoYmZkX2hhc2hfdGFibGVfZnJlZSAoJih0YWJsZSktPnJvb3QpKQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBlYWNoIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlIHdoZW4gZG9pbmcKLSAgIGEgcmVsb2NhdGVhYmxlIGxpbmsuICAqLwotCi1zdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbwotewotICAvKiBUaGUgcmVsb2NzIHRvIGJlIG91dHB1dC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAvKiBGb3IgZWFjaCByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aG9zZSBpbmRleCB3YXMgbm90IGtub3duCi0gICAgIHdoZW4gdGhlIHJlbG9jIHdhcyBoYW5kbGVkLCB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaGVzOwotfTsKLQotLyogSW5mb3JtYXRpb24gdGhhdCB3ZSBwYXNzIGFyb3VuZCB3aGlsZSBkb2luZyB0aGUgZmluYWwgbGluayBzdGVwLiAgKi8KLQotc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvCi17Ci0gIC8qIEdlbmVyYWwgbGluayBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBVc2VkIHRvIGluZGljYXRlIGZhaWx1cmUgaW4gdHJhdmVyc2FsIHJvdXRpbmUuICAqLwotICBib29sZWFuIGZhaWxlZDsKLSAgLyogSWYgZG9pbmcgInRhc2sgbGlua2luZyIgc2V0IG9ubHkgZHVyaW5nIHRoZSB0aW1lIHdoZW4gd2Ugd2FudCB0aGUKLSAgICAgZ2xvYmFsIHN5bWJvbCB3cml0ZXIgdG8gY29udmVydCB0aGUgc3RvcmFnZSBjbGFzcyBvZiBkZWZpbmVkIGdsb2JhbAotICAgICBzeW1ib2xzIGZyb20gZ2xvYmFsIHRvIHN0YXRpYy4gKi8KLSAgYm9vbGVhbiBnbG9iYWxfdG9fc3RhdGljOwotICAvKiBIYXNoIHRhYmxlIGZvciBsb25nIHN5bWJvbCBuYW1lcy4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKLSAgLyogV2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbiBhcnJheSBvZiBpbmZvcm1hdGlvbiBrZXB0IGZvcgotICAgICBlYWNoIG91dHB1dCBzZWN0aW9uLCBpbmRleGVkIGJ5IHRoZSB0YXJnZXRfaW5kZXggZmllbGQuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbyAqc2VjdGlvbl9pbmZvOwotICAvKiBTeW1ib2wgaW5kZXggb2YgbGFzdCBDX0ZJTEUgc3ltYm9sICgtMSBpZiBub25lKS4gICovCi0gIGxvbmcgbGFzdF9maWxlX2luZGV4OwotICAvKiBDb250ZW50cyBvZiBsYXN0IENfRklMRSBzeW1ib2wuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGxhc3RfZmlsZTsKLSAgLyogU3ltYm9sIGluZGV4IG9mIGZpcnN0IGF1eCBlbnRyeSBvZiBsYXN0IC5iZiBzeW1ib2wgd2l0aCBhbiBlbXB0eQotICAgICBlbmRuZHggZmllbGQgKC0xIGlmIG5vbmUpLiAgKi8KLSAgbG9uZyBsYXN0X2JmX2luZGV4OwotICAvKiBDb250ZW50cyBvZiBsYXN0X2JmX2luZGV4IGF1eCBlbnRyeS4gICovCi0gIHVuaW9uIGludGVybmFsX2F1eGVudCBsYXN0X2JmOwotICAvKiBIYXNoIHRhYmxlIHVzZWQgdG8gbWVyZ2UgZGVidWcgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlIGRlYnVnX21lcmdlOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc3dhcHBlZCBzeW1ib2xzIG9mIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaW50ZXJuYWxfc3ltczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHNlY3Rpb25zIG9mIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLwotICBhc2VjdGlvbiAqKnNlY19wdHJzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IGluZGljZXMgb2Ygc3ltYm9scyBvZiBhbnkKLSAgICAgaW5wdXQgZmlsZS4gICovCi0gIGxvbmcgKnN5bV9pbmRpY2VzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IHN5bWJvbHMgZm9yIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgYmZkX2J5dGUgKm91dHN5bXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCBsaW5lIG51bWJlcnMgZm9yIGFueSBpbnB1dAotICAgICBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmxpbmVub3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKl9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYm9vbGVhbiwgYmZkX2J5dGUgKiwgYm9vbGVhbiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9jb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0KLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscwotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQKLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotCi0jZGVmaW5lIGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0vKiBGdW5jdGlvbnMgaW4geGNvZmZsaW5rLmMuICAqLwotCi1leHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF94Y29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF94Y29mZl9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotLyogRnVuY3Rpb25zIGluIGNvZmYtcHBjLmMuICBGSVhNRTogVGhlc2UgYXJlIGNhbGxlZCBiZSBwZS5lbSBpbiB0aGUKLSAgIGxpbmtlciwgYW5kIHNvIHNob3VsZCBzdGFydCB3aXRoIGJmZCBhbmQgYmUgZGVjbGFyZWQgaW4gYmZkLmguICAqLwotCi1leHRlcm4gYm9vbGVhbiBwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gcHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogQW5kIG1vcmUgdGFrZW4gZnJvbSB0aGUgc291cmNlIC4uICovCi0KZGlmZiAtLWdpdCBhL2JmZC9saWJjb2ZmLmggYi9iZmQvbGliY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE4YTRkLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJjb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ODggKzAsMCBAQAotLyogQkZEIENPRkYgb2JqZWN0IGZpbGUgcHJpdmF0ZSBzdHJ1Y3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSoqIE5PVEU6IGxpYmNvZmYuaCBpcyBhIEdFTkVSQVRFRCBmaWxlLiAgRG9uJ3QgY2hhbmdlIGl0OyBpbnN0ZWFkLAotKiogY2hhbmdlIGxpYmNvZmYtaW4uaCBvciBjb2ZmY29kZS5oLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLS8qIE9iamVjdCBmaWxlIHRkYXRhOyBhY2Nlc3MgbWFjcm9zICovCi0KLSNkZWZpbmUgY29mZl9kYXRhKGJmZCkJCSgoYmZkKS0+dGRhdGEuY29mZl9vYmpfZGF0YSkKLSNkZWZpbmUgZXhlY19oZHIoYmZkKQkJKGNvZmZfZGF0YShiZmQpLT5oZHIpCi0jZGVmaW5lIG9ial9wZShiZmQpICAgICAgICAgICAgIChjb2ZmX2RhdGEoYmZkKS0+cGUpCi0jZGVmaW5lIG9ial9zeW1ib2xzKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5zeW1ib2xzKQotI2RlZmluZQlvYmpfc3ltX2ZpbGVwb3MoYmZkKQkoY29mZl9kYXRhKGJmZCktPnN5bV9maWxlcG9zKQotCi0jZGVmaW5lIG9ial9yZWxvY2Jhc2UoYmZkKQkoY29mZl9kYXRhKGJmZCktPnJlbG9jYmFzZSkKLSNkZWZpbmUgb2JqX3Jhd19zeW1lbnRzKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yYXdfc3ltZW50cykKLSNkZWZpbmUgb2JqX3Jhd19zeW1lbnRfY291bnQoYmZkKQkoY29mZl9kYXRhKGJmZCktPnJhd19zeW1lbnRfY291bnQpCi0jZGVmaW5lIG9ial9jb252ZXJ0KGJmZCkJKGNvZmZfZGF0YShiZmQpLT5jb252ZXJzaW9uX3RhYmxlKQotI2RlZmluZSBvYmpfY29udl90YWJsZV9zaXplKGJmZCkgKGNvZmZfZGF0YShiZmQpLT5jb252X3RhYmxlX3NpemUpCi0KLSNkZWZpbmUgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPmV4dGVybmFsX3N5bXMpCi0jZGVmaW5lIG9ial9jb2ZmX2tlZXBfc3ltcyhiZmQpCShjb2ZmX2RhdGEgKGJmZCktPmtlZXBfc3ltcykKLSNkZWZpbmUgb2JqX2NvZmZfc3RyaW5ncyhiZmQpCShjb2ZmX2RhdGEgKGJmZCktPnN0cmluZ3MpCi0jZGVmaW5lIG9ial9jb2ZmX2tlZXBfc3RyaW5ncyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPmtlZXBfc3RyaW5ncykKLSNkZWZpbmUgb2JqX2NvZmZfc3ltX2hhc2hlcyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPnN5bV9oYXNoZXMpCi0KLSNkZWZpbmUgb2JqX2NvZmZfbG9jYWxfdG9jX3RhYmxlKGJmZCkgKGNvZmZfZGF0YShiZmQpLT5sb2NhbF90b2Nfc3ltX21hcCkKLQotLyogYFRkYXRhJyBpbmZvcm1hdGlvbiBrZXB0IGZvciBDT0ZGIGZpbGVzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY29mZl90ZGF0YQotewotICBzdHJ1Y3QgICBjb2ZmX3N5bWJvbF9zdHJ1Y3QgKnN5bWJvbHM7CS8qIHN5bXRhYiBmb3IgaW5wdXQgYmZkICovCi0gIHVuc2lnbmVkIGludCAqY29udmVyc2lvbl90YWJsZTsKLSAgaW50IGNvbnZfdGFibGVfc2l6ZTsKLSAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0KLSAgc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcmF3X3N5bWVudHM7Ci0gIHVuc2lnbmVkIGludCByYXdfc3ltZW50X2NvdW50OwotCi0gIC8qIFRoZXNlIGFyZSBvbmx5IHZhbGlkIG9uY2Ugd3JpdGluZyBoYXMgYmVndW4gKi8KLSAgbG9uZyBpbnQgcmVsb2NiYXNlOwotCi0gIC8qIFRoZXNlIG1lbWJlcnMgY29tbXVuaWNhdGUgaW1wb3J0YW50IGNvbnN0YW50cyBhYm91dCB0aGUgc3ltYm9sIHRhYmxlCi0gICAgIHRvIEdEQidzIHN5bWJvbC1yZWFkaW5nIGNvZGUuICBUaGVzZSBgY29uc3RhbnRzJyB1bmZvcnR1bmF0ZWx5IHZhcnkKLSAgICAgZnJvbSBjb2ZmIGltcGxlbWVudGF0aW9uIHRvIGltcGxlbWVudGF0aW9uLi4uICAqLwotICB1bnNpZ25lZCBsb2NhbF9uX2J0bWFzazsKLSAgdW5zaWduZWQgbG9jYWxfbl9idHNoZnQ7Ci0gIHVuc2lnbmVkIGxvY2FsX25fdG1hc2s7Ci0gIHVuc2lnbmVkIGxvY2FsX25fdHNoaWZ0OwotICB1bnNpZ25lZCBsb2NhbF9zeW1lc3o7Ci0gIHVuc2lnbmVkIGxvY2FsX2F1eGVzejsKLSAgdW5zaWduZWQgbG9jYWxfbGluZXN6OwotCi0gIC8qIFRoZSB1bnN3YXBwZWQgZXh0ZXJuYWwgc3ltYm9scy4gIE1heSBiZSBOVUxMLiAgUmVhZCBieQotICAgICBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMuICAqLwotICBQVFIgZXh0ZXJuYWxfc3ltczsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgZXh0ZXJuYWxfc3ltcyBtYXkgbm90IGJlIGZyZWVkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX3N5bXM7Ci0KLSAgLyogVGhlIHN0cmluZyB0YWJsZS4gIE1heSBiZSBOVUxMLiAgUmVhZCBieQotICAgICBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUuICAqLwotICBjaGFyICpzdHJpbmdzOwotICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSBzdHJpbmdzIG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfc3RyaW5nczsKLQotICAvKiBpcyB0aGlzIGEgUEUgZm9ybWF0IGNvZmYgZmlsZSAqLwotICBpbnQgcGU7Ci0gIC8qIFVzZWQgYnkgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotCi0gIC8qIHVzZWQgYnkgdGhlIHBlIGxpbmtlciBmb3IgUG93ZXJQQyAqLwotICBpbnQgKmxvY2FsX3RvY19zeW1fbWFwOwotCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0KLSAgLyogVXNlZCBieSBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgUFRSIGxpbmVfaW5mbzsKLQotICAvKiBDb3B5IG9mIHNvbWUgb2YgdGhlIGZfZmxhZ3MgYml0cyBpbiB0aGUgQ09GRiBmaWxlaGRyIHN0cnVjdHVyZSwKLSAgICAgdXNlZCBieSBBUk0gY29kZS4gICovCi0gIGZsYWd3b3JkIGZsYWdzOwotCi19IGNvZmZfZGF0YV90eXBlOwotCi0vKiBUZGF0YSBmb3IgcGUgaW1hZ2UgZmlsZXMuICovCi10eXBlZGVmIHN0cnVjdCBwZV90ZGF0YQotewotICBjb2ZmX2RhdGFfdHlwZSBjb2ZmOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciBwZV9vcHRoZHI7Ci0gIGludCBkbGw7Ci0gIGludCBoYXNfcmVsb2Nfc2VjdGlvbjsKLSAgYm9vbGVhbiAoKmluX3JlbG9jX3ApIFBBUkFNUygoYmZkICosIHJlbG9jX2hvd3RvX3R5cGUgKikpOwotICBmbGFnd29yZCByZWFsX2ZsYWdzOwotfSBwZV9kYXRhX3R5cGU7Ci0KLSNkZWZpbmUgcGVfZGF0YShiZmQpCQkoKGJmZCktPnRkYXRhLnBlX29ial9kYXRhKQotCi0vKiBUZGF0YSBmb3IgWENPRkYgZmlsZXMuICAqLwotCi1zdHJ1Y3QgeGNvZmZfdGRhdGEKLXsKLSAgLyogQmFzaWMgQ09GRiBpbmZvcm1hdGlvbi4gICovCi0gIGNvZmZfZGF0YV90eXBlIGNvZmY7Ci0KLSAgLyogVHJ1ZSBpZiBhIGxhcmdlIGEub3V0IGhlYWRlciBzaG91bGQgYmUgZ2VuZXJhdGVkLiAgKi8KLSAgYm9vbGVhbiBmdWxsX2FvdXRoZHI7Ci0KLSAgLyogVE9DIHZhbHVlLiAgKi8KLSAgYmZkX3ZtYSB0b2M7Ci0KLSAgLyogSW5kZXggb2Ygc2VjdGlvbiBob2xkaW5nIFRPQy4gICovCi0gIGludCBzbnRvYzsKLQotICAvKiBJbmRleCBvZiBzZWN0aW9uIGhvbGRpbmcgZW50cnkgcG9pbnQuICAqLwotICBpbnQgc25lbnRyeTsKLQotICAvKiAudGV4dCBhbGlnbm1lbnQgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBpbnQgdGV4dF9hbGlnbl9wb3dlcjsKLQotICAvKiAuZGF0YSBhbGlnbm1lbnQgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBpbnQgZGF0YV9hbGlnbl9wb3dlcjsKLQotICAvKiBtb2R0eXBlIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgc2hvcnQgbW9kdHlwZTsKLQotICAvKiBjcHV0eXBlIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgc2hvcnQgY3B1dHlwZTsKLQotICAvKiBtYXhkYXRhIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBtYXhkYXRhOwotCi0gIC8qIG1heHN0YWNrIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBtYXhzdGFjazsKLQotICAvKiBVc2VkIGJ5IHRoZSBYQ09GRiBiYWNrZW5kIGxpbmtlci4gICovCi0gIGFzZWN0aW9uICoqY3NlY3RzOwotICB1bnNpZ25lZCBsb25nICpkZWJ1Z19pbmRpY2VzOwotICB1bnNpZ25lZCBpbnQgaW1wb3J0X2ZpbGVfaWQ7Ci19OwotCi0jZGVmaW5lIHhjb2ZmX2RhdGEoYWJmZCkgKChhYmZkKS0+dGRhdGEueGNvZmZfb2JqX2RhdGEpCi0KLS8qIFdlIHRha2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBhc3ltYm9sIHRvIGVuc3VyZSB0aGF0IHRoZQotICogbWFjcm8gaXMgb25seSBldmVyIGFwcGxpZWQgdG8gYW4gYXN5bWJvbC4gICovCi0jZGVmaW5lIGNvZmZzeW1ib2woYXN5bWJvbCkgKChjb2ZmX3N5bWJvbF90eXBlICopKCYoKGFzeW1ib2wpLT50aGVfYmZkKSkpCi0KLS8qIFRoZSB1c2VkX2J5X2JmZCBmaWVsZCBvZiBhIHNlY3Rpb24gbWF5IGJlIHNldCB0byBhIHBvaW50ZXIgdG8gdGhpcwotICAgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YQotewotICAvKiBUaGUgcmVsb2NzLCBzd2FwcGVkIGludG8gQ09GRiBpbnRlcm5hbCBmb3JtLiAgVGhpcyBtYXkgYmUgTlVMTC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSByZWxvY3MgZW50cnkgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9yZWxvY3M7Ci0gIC8qIFRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgVGhpcyBtYXkgYmUgTlVMTC4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgY29udGVudHMgZW50cnkgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9jb250ZW50czsKLSAgLyogSW5mb3JtYXRpb24gY2FjaGVkIGJ5IGNvZmZfZmluZF9uZWFyZXN0X2xpbmUuICAqLwotICBiZmRfdm1hIG9mZnNldDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGNvbnN0IGNoYXIgKmZ1bmN0aW9uOwotICBpbnQgbGluZV9iYXNlOwotICAvKiBBIHBvaW50ZXIgdXNlZCBmb3IgLnN0YWIgbGlua2luZyBvcHRpbWl6YXRpb25zLiAgKi8KLSAgUFRSIHN0YWJfaW5mbzsKLSAgLyogQXZhaWxhYmxlIGZvciBpbmRpdmlkdWFsIGJhY2tlbmRzLiAgKi8KLSAgUFRSIHRkYXRhOwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gZm9yIHRoZSBjb2ZmX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgY29mZl9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSAqKSAoc2VjKS0+dXNlZF9ieV9iZmQpCi0KLS8qIFRkYXRhIGZvciBzZWN0aW9ucyBpbiBYQ09GRiBmaWxlcy4gIFRoaXMgaXMgdXNlZCBieSB0aGUgbGlua2VyLiAgKi8KLQotc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVXNlZCBmb3IgWENPRkYgY3NlY3RzIGNyZWF0ZWQgYnkgdGhlIGxpbmtlcjsgcG9pbnRzIHRvIHRoZSByZWFsCi0gICAgIFhDT0ZGIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgdGhpcyBjc2VjdC4gICovCi0gIGFzZWN0aW9uICplbmNsb3Npbmc7Ci0gIC8qIFRoZSBsaW5lbm9fY291bnQgZmllbGQgZm9yIHRoZSBlbmNsb3Npbmcgc2VjdGlvbiwgYmVjYXVzZSB3ZSBhcmUKLSAgICAgZ29pbmcgdG8gY2xvYmJlciBpdCB0aGVyZS4gICovCi0gIHVuc2lnbmVkIGludCBsaW5lbm9fY291bnQ7Ci0gIC8qIFRoZSBmaXJzdCBhbmQgb25lIHBhc3QgdGhlIGxhc3Qgc3ltYm9sIGluZGljZXMgZm9yIHN5bWJvbHMgdXNlZAotICAgICBieSB0aGlzIGNzZWN0LiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaXJzdF9zeW1uZHg7Ci0gIHVuc2lnbmVkIGxvbmcgbGFzdF9zeW1uZHg7Ci19OwotCi0vKiBBbiBhY2Nlc3NvciBtYWNybyB0aGUgeGNvZmZfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSB4Y29mZl9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEgKikgY29mZl9zZWN0aW9uX2RhdGEgKChhYmZkKSwgKHNlYykpLT50ZGF0YSkKLQotLyogVGRhdGEgZm9yIHNlY3Rpb25zIGluIFBFSSBpbWFnZSBmaWxlcy4gICovCi0KLXN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YQotewotICAvKiBUaGUgdmlydHVhbCBzaXplIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSB2aXJ0X3NpemU7Ci19OwotCi0vKiBBbiBhY2Nlc3NvciBtYWNybyBmb3IgdGhlIHBlaV9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIHBlaV9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhICopIGNvZmZfc2VjdGlvbl9kYXRhICgoYWJmZCksIChzZWMpKS0+dGRhdGEpCi0KLS8qIENPRkYgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIFN5bWJvbCBpbmRleCBpbiBvdXRwdXQgZmlsZS4gIFNldCB0byAtMSBpbml0aWFsbHkuICBTZXQgdG8gLTIgaWYKLSAgICAgdGhlcmUgaXMgYSByZWxvYyBhZ2FpbnN0IHRoaXMgc3ltYm9sLiAgKi8KLSAgbG9uZyBpbmR4OwotCi0gIC8qIFN5bWJvbCB0eXBlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdHlwZTsKLQotICAvKiBTeW1ib2wgY2xhc3MuICAqLwotICB1bnNpZ25lZCBjaGFyIGNsYXNzOwotCi0gIC8qIE51bWJlciBvZiBhdXhpbGlhcnkgZW50cmllcy4gICovCi0gIGNoYXIgbnVtYXV4OwotCi0gIC8qIEJGRCB0byB0YWtlIGF1eGlsaWFyeSBlbnRyaWVzIGZyb20uICAqLwotICBiZmQgKmF1eGJmZDsKLQotICAvKiBQb2ludGVyIHRvIGFycmF5IG9mIGF1eGlsaWFyeSBlbnRyaWVzLCBpZiBhbnkuICAqLwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eDsKLX07Ci0KLS8qIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLSAgLyogQSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHVzZWQgdG8gbGluayBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQlcCi0gICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopCQkJCQlcCi0gICBiZmRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwJCVwKLQkJCSAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIENPRkYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGNvZmZfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogRnVuY3Rpb25zIGluIGNvZmZnZW4uYy4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqY29mZl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBzZWMgKmNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIGNvZmZfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGludCBjb2ZmX2NvdW50X2xpbmVudW1iZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gc3RydWN0IGNvZmZfc3ltYm9sX3N0cnVjdCAqY29mZl9zeW1ib2xfZnJvbSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIGludCAqKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX21hbmdsZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3dyaXRlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGNvZmZfd3JpdGVfbGluZW51bWJlcnMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBhbGVudCAqY29mZl9nZXRfbGluZW5vIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBhc3ltYm9sICpjb2ZmX3NlY3Rpb25fc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKmNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKiwgc2VjX3B0cikpOwotZXh0ZXJuIGFzeW1ib2wgKmNvZmZfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiB2b2lkIGNvZmZfcHJpbnRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIgZmlsZXAsIGFzeW1ib2wgKiwKLQkJCQkgICAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdykpOwotZXh0ZXJuIHZvaWQgY29mZl9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJICBzeW1ib2xfaW5mbyAqcmV0KSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYXN5bWJvbCAqY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgUEFSQU1TICgoYmZkICosIFBUUiwKLQkJCQkJCSAgICB1bnNpZ25lZCBsb25nKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgICAgYXNlY3Rpb24gKiwKLQkJCQkJICAgICAgIGFzeW1ib2wgKiosCi0JCQkJCSAgICAgICBiZmRfdm1hIG9mZnNldCwKLQkJCQkJICAgICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHIsCi0JCQkJCSAgICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHIpKTsKLWV4dGVybiBpbnQgY29mZl9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiByZWxvYykpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLWV4dGVybiBiZmRfYnl0ZSAqYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAotCSAgIGJmZF9ieXRlICosIGJvb2xlYW4gcmVsb2NhdGVhYmxlLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gYmZkX3ZtYSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSBQQVJBTVMgKChhcmVsZW50ICosCi0JCQkJCQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkJICAgYXNlY3Rpb24gKikpOwotZXh0ZXJuIHZvaWQgYmZkX3BlcmZvcm1fc2xpcCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCBzbGlwLAotCQkJCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIGJmZF92bWEgdmFsKSk7Ci0KLS8qIEZ1bmN0aW9ucyBhbmQgdHlwZXMgaW4gY29mZmxpbmsuYy4gICovCi0KLSNkZWZpbmUgU1RSSU5HX1NJWkVfU0laRSAoNCkKLQotLyogV2UgdXNlIGEgaGFzaCB0YWJsZSB0byBtZXJnZSBpZGVudGljYWwgZW51bSwgc3RydWN0LCBhbmQgdW5pb24KLSAgIGRlZmluaXRpb25zIGluIHRoZSBsaW5rZXIuICAqLwotCi0vKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBhIHNpbmdsZSBlbGVtZW50IChhbiBlbnVtIHZhbHVlLCBhCi0gICBzdHJ1Y3R1cmUgb3IgdW5pb24gZmllbGQpIGluIHRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudAotewotICAvKiBOZXh0IGVsZW1lbnQuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICpuZXh0OwotCi0gIC8qIE5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgdHlwZTsKLQotICAvKiBTeW1ib2wgaW5kZXggZm9yIGNvbXBsZXggdHlwZS4gICovCi0gIGxvbmcgdGFnbmR4OwotfTsKLQotLyogQSBsaW5rZWQgbGlzdCBvZiBkZWJ1ZyBtZXJnZSBlbnRyaWVzIGZvciBhIGdpdmVuIG5hbWUuICAqLwotCi1zdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlCi17Ci0gIC8qIE5leHQgdHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICpuZXh0OwotCi0gIC8qIENsYXNzIG9mIHR5cGUuICAqLwotICBpbnQgY2xhc3M7Ci0KLSAgLyogU3ltYm9sIGluZGV4IHdoZXJlIHRoaXMgdHlwZSBpcyBkZWZpbmVkLiAgKi8KLSAgbG9uZyBpbmR4OwotCi0gIC8qIExpc3Qgb2YgZWxlbWVudHMuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICplbGVtZW50czsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHdlIHN0b3JlIGluIHRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBBIGxpc3Qgb2YgdHlwZXMgd2l0aCB0aGlzIG5hbWUuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICp0eXBlczsKLX07Ci0KLS8qIFRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIEluaXRpYWxpemUgYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0KHRhYmxlKSBcCi0gIChiZmRfaGFzaF90YWJsZV9pbml0ICgmKHRhYmxlKS0+cm9vdCwgX2JmZF9jb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYykpCi0KLS8qIEZyZWUgYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlKHRhYmxlKSBcCi0gIChiZmRfaGFzaF90YWJsZV9mcmVlICgmKHRhYmxlKS0+cm9vdCkpCi0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGVhY2ggc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgd2hlbiBkb2luZwotICAgYSByZWxvY2F0ZWFibGUgbGluay4gICovCi0KLXN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvCi17Ci0gIC8qIFRoZSByZWxvY3MgdG8gYmUgb3V0cHV0LiAgKi8KLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gIC8qIEZvciBlYWNoIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sIHdob3NlIGluZGV4IHdhcyBub3Qga25vd24KLSAgICAgd2hlbiB0aGUgcmVsb2Mgd2FzIGhhbmRsZWQsIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoZXM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB0aGF0IHdlIHBhc3MgYXJvdW5kIHdoaWxlIGRvaW5nIHRoZSBmaW5hbCBsaW5rIHN0ZXAuICAqLwotCi1zdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8KLXsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIE91dHB1dCBCRkQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIFVzZWQgdG8gaW5kaWNhdGUgZmFpbHVyZSBpbiB0cmF2ZXJzYWwgcm91dGluZS4gICovCi0gIGJvb2xlYW4gZmFpbGVkOwotICAvKiBJZiBkb2luZyAidGFzayBsaW5raW5nIiBzZXQgb25seSBkdXJpbmcgdGhlIHRpbWUgd2hlbiB3ZSB3YW50IHRoZQotICAgICBnbG9iYWwgc3ltYm9sIHdyaXRlciB0byBjb252ZXJ0IHRoZSBzdG9yYWdlIGNsYXNzIG9mIGRlZmluZWQgZ2xvYmFsCi0gICAgIHN5bWJvbHMgZnJvbSBnbG9iYWwgdG8gc3RhdGljLiAqLwotICBib29sZWFuIGdsb2JhbF90b19zdGF0aWM7Ci0gIC8qIEhhc2ggdGFibGUgZm9yIGxvbmcgc3ltYm9sIG5hbWVzLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RydGFiOwotICAvKiBXaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIGFuIGFycmF5IG9mIGluZm9ybWF0aW9uIGtlcHQgZm9yCi0gICAgIGVhY2ggb3V0cHV0IHNlY3Rpb24sIGluZGV4ZWQgYnkgdGhlIHRhcmdldF9pbmRleCBmaWVsZC4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICpzZWN0aW9uX2luZm87Ci0gIC8qIFN5bWJvbCBpbmRleCBvZiBsYXN0IENfRklMRSBzeW1ib2wgKC0xIGlmIG5vbmUpLiAgKi8KLSAgbG9uZyBsYXN0X2ZpbGVfaW5kZXg7Ci0gIC8qIENvbnRlbnRzIG9mIGxhc3QgQ19GSUxFIHN5bWJvbC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgbGFzdF9maWxlOwotICAvKiBTeW1ib2wgaW5kZXggb2YgZmlyc3QgYXV4IGVudHJ5IG9mIGxhc3QgLmJmIHN5bWJvbCB3aXRoIGFuIGVtcHR5Ci0gICAgIGVuZG5keCBmaWVsZCAoLTEgaWYgbm9uZSkuICAqLwotICBsb25nIGxhc3RfYmZfaW5kZXg7Ci0gIC8qIENvbnRlbnRzIG9mIGxhc3RfYmZfaW5kZXggYXV4IGVudHJ5LiAgKi8KLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGxhc3RfYmY7Ci0gIC8qIEhhc2ggdGFibGUgdXNlZCB0byBtZXJnZSBkZWJ1ZyBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUgZGVidWdfbWVyZ2U7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbnRlcm5hbF9zeW1zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc2VjdGlvbnMgb2Ygc3ltYm9scyBvZiBhbnkgaW5wdXQgZmlsZS4gICovCi0gIGFzZWN0aW9uICoqc2VjX3B0cnM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgaW5kaWNlcyBvZiBzeW1ib2xzIG9mIGFueQotICAgICBpbnB1dCBmaWxlLiAgKi8KLSAgbG9uZyAqc3ltX2luZGljZXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgc3ltYm9scyBmb3IgYW55IGlucHV0IGZpbGUuICAqLwotICBiZmRfYnl0ZSAqb3V0c3ltczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIGxpbmUgbnVtYmVycyBmb3IgYW55IGlucHV0Ci0gICAgIHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqbGluZW5vczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgZXh0ZXJuYWwgcmVsb2NzIG9mIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHN3YXBwZWQgcmVsb2NzIG9mIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci19OwotCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBib29sZWFuLCBiZmRfYnl0ZSAqLCBib29sZWFuLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2NvZmZfZGVidWdfbWVyZ2VfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bQotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzCi0gIFBBUkFNUyAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2lucHV0X2JmZAotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiwgYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0KLSNkZWZpbmUgY29mZl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLS8qIEZ1bmN0aW9ucyBpbiB4Y29mZmxpbmsuYy4gICovCi0KLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotCi0vKiBGdW5jdGlvbnMgaW4gY29mZi1wcGMuYy4gIEZJWE1FOiBUaGVzZSBhcmUgY2FsbGVkIGJlIHBlLmVtIGluIHRoZQotICAgbGlua2VyLCBhbmQgc28gc2hvdWxkIHN0YXJ0IHdpdGggYmZkIGFuZCBiZSBkZWNsYXJlZCBpbiBiZmQuaC4gICovCi0KLWV4dGVybiBib29sZWFuIHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBBbmQgbW9yZSB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgLi4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0Ci17Ci0KLSAgICAgICAgLyogUmVtZW1iZXJzIHRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoZSBmaWxlIGZvcgotICAgICAgICAgIHRoaXMgc3ltYm9sLiBHZW5lcmF0ZWQgYnkgY29mZl9yZW51bWJlcl9zeW1ib2xzLiAqLwotdW5zaWduZWQgaW50IG9mZnNldDsKLQotICAgICAgICAvKiBTaG91bGQgdGhlIHZhbHVlIG9mIHRoaXMgc3ltYm9sIGJlIHJlbnVtYmVyZWQuICBVc2VkIGZvcgotICAgICAgICAgIFhDT0ZGIENfQlNUQVQgc3ltYm9scy4gIFNldCBieSBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4gICovCi11bnNpZ25lZCBpbnQgZml4X3ZhbHVlIDogMTsKLQotICAgICAgICAvKiBTaG91bGQgdGhlIHRhZyBmaWVsZCBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLgotICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKi8KLXVuc2lnbmVkIGludCBmaXhfdGFnIDogMTsKLQotICAgICAgICAvKiBTaG91bGQgdGhlIGVuZGlkeCBmaWVsZCBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLgotICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKi8KLXVuc2lnbmVkIGludCBmaXhfZW5kIDogMTsKLQotICAgICAgICAvKiBTaG91bGQgdGhlIHhfY3NlY3QueF9zY25sZW4gZmllbGQgYmUgcmVudW1iZXJlZC4KLSAgICAgICAgICBDcmVhdGVkIGJ5IGNvZmZfcG9pbnRlcml6ZV9hdXguICovCi11bnNpZ25lZCBpbnQgZml4X3NjbmxlbiA6IDE7Ci0KLSAgICAgICAgLyogRml4IHVwIGFuIFhDT0ZGIENfQklOQ0wvQ19FSU5DTCBzeW1ib2wuICBUaGUgdmFsdWUgaXMgdGhlCi0gICAgICAgICAgaW5kZXggaW50byB0aGUgbGluZSBudW1iZXIgZW50cmllcy4gIFNldCBieQotICAgICAgICAgIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLiAgKi8KLXVuc2lnbmVkIGludCBmaXhfbGluZSA6IDE7Ci0KLSAgICAgICAgLyogVGhlIGNvbnRhaW5lciBmb3IgdGhlIHN5bWJvbCBzdHJ1Y3R1cmUgYXMgcmVhZCBhbmQgdHJhbnNsYXRlZAotICAgICAgICAgICBmcm9tIHRoZSBmaWxlLiAqLwotCi11bmlvbiB7Ci0gICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4ZW50OwotICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW1lbnQ7Ci0gfSB1OwotfSBjb21iaW5lZF9lbnRyeV90eXBlOwotCi0KLSAvKiBFYWNoIGNhbm9uaWNhbCBhc3ltYm9sIHJlYWxseSBsb29rcyBsaWtlIHRoaXM6ICovCi0KLXR5cGVkZWYgc3RydWN0IGNvZmZfc3ltYm9sX3N0cnVjdAotewotICAgIC8qIFRoZSBhY3R1YWwgc3ltYm9sIHdoaWNoIHRoZSByZXN0IG9mIEJGRCB3b3JrcyB3aXRoICovCi1hc3ltYm9sIHN5bWJvbDsKLQotICAgIC8qIEEgcG9pbnRlciB0byB0aGUgaGlkZGVuIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbCAqLwotY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlOwotCi0gICAgLyogQSBwb2ludGVyIHRvIHRoZSBsaW5lbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbCAqLwotc3RydWN0IGxpbmVub19jYWNoZV9lbnRyeSAqbGluZW5vOwotCi0gICAgLyogSGF2ZSB0aGUgbGluZSBudW1iZXJzIGJlZW4gcmVsb2NhdGVkIHlldCA/ICovCi1ib29sZWFuIGRvbmVfbGluZW5vOwotfSBjb2ZmX3N5bWJvbF90eXBlOwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdm9pZCAoKl9iZmRfY29mZl9zd2FwX2F1eF9pbikgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAgICAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICAgICAgICAgIGV4dCwKLSAgICAgICBpbnQgICAgICAgICAgICAgdHlwZSwKLSAgICAgICBpbnQgICAgICAgICAgICAgY2xhc3MsCi0gICAgICAgaW50ICAgICAgICAgICAgIGluZGF1eCwKLSAgICAgICBpbnQgICAgICAgICAgICAgbnVtYXV4LAotICAgICAgIFBUUiAgICAgICAgICAgICBpbikpOwotCi0gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9zeW1faW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgICAgICAgICphYmZkICwKLSAgICAgICBQVFIgICAgICAgICAgICAgZXh0LAotICAgICAgIFBUUiAgICAgICAgICAgICBpbikpOwotCi0gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9saW5lbm9faW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgICAgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgICAgICAgIGV4dCwKLSAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKLQotIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2F1eF9vdXQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbiwKLSAgICAgICBpbnQgICAgIHR5cGUsCi0gICAgICAgaW50ICAgICBjbGFzcywKLSAgICAgICBpbnQgICAgIGluZGF1eCwKLSAgICAgICBpbnQgICAgIG51bWF1eCwKLSAgICAgICBQVFIgICAgIGV4dCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfc3ltX291dCkgUEFSQU1TICgoCi0gICAgICBiZmQgICAgICAqYWJmZCwKLSAgICAgIFBUUiAgICAgIGluLAotICAgICAgUFRSICAgICAgZXh0KSk7Ci0KLSB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0KSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW4sCi0gICAgICAgUFRSICAgICBleHQpKTsKLQotIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3JlbG9jX291dCkgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIHNyYywKLSAgICAgICBQVFIgICAgIGRzdCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbiwKLSAgICAgICBQVFIgICAgIG91dCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbiwKLSAgICAgICBQVFIgICAgIG91dCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCkgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGluLAotICAgICAgIFBUUiAgICAgb3V0KSk7Ci0KLSB1bnNpZ25lZCBpbnQgX2JmZF9maWxoc3o7Ci0gdW5zaWduZWQgaW50IF9iZmRfYW91dHN6OwotIHVuc2lnbmVkIGludCBfYmZkX3NjbmhzejsKLSB1bnNpZ25lZCBpbnQgX2JmZF9zeW1lc3o7Ci0gdW5zaWduZWQgaW50IF9iZmRfYXV4ZXN6OwotIHVuc2lnbmVkIGludCBfYmZkX3JlbHN6OwotIHVuc2lnbmVkIGludCBfYmZkX2xpbmVzejsKLSBib29sZWFuIF9iZmRfY29mZl9sb25nX2ZpbGVuYW1lczsKLSBib29sZWFuIF9iZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXM7Ci0gdW5zaWduZWQgaW50IF9iZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyOwotIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgZXh0LAotICAgICAgIFBUUiAgICAgaW4pKTsKLSB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbikgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGV4dCwKLSAgICAgICBQVFIgICAgIGluKSk7Ci0gdm9pZCAoKl9iZmRfY29mZl9zd2FwX3Njbmhkcl9pbikgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGV4dCwKLSAgICAgICBQVFIgICAgIGluKSk7Ci0gdm9pZCAoKl9iZmRfY29mZl9zd2FwX3JlbG9jX2luKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgZXh0LAotICAgICAgIFBUUiAgICAgaW4pKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIpKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIpKTsKLSBQVFIgKCpfYmZkX2NvZmZfbWtvYmplY3RfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIsCi0gICAgICAgUFRSICAgICBpbnRlcm5hbF9hb3V0aGRyKSk7Ci0gZmxhZ3dvcmQgKCpfYmZkX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2spIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbnRlcm5hbF9zY25oZHIsCi0gICAgICAgY29uc3QgY2hhciAqbmFtZSkpOwotIHZvaWQgKCpfYmZkX3NldF9hbGlnbm1lbnRfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBhc2VjdGlvbiAqc2VjLAotICAgICAgIFBUUiAgICAgaW50ZXJuYWxfc2NuaGRyKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQpKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZSwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wsCi0gICAgICAgdW5zaWduZWQgaW50IGluZGF1eCwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXgpKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3ByaW50X2F1eCkgUEFSQU1TICgoCi0gICAgICAgYmZkICphYmZkLAotICAgICAgIEZJTEUgKmZpbGUsCi0gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZSwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wsCi0gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4LAotICAgICAgIHVuc2lnbmVkIGludCBpbmRhdXgpKTsKLSB2b2lkICgqX2JmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIsCi0gICAgICAgYXJlbGVudCAqcmVsb2MsCi0gICAgICAgYmZkX2J5dGUgKmRhdGEsCi0gICAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyLAotICAgICAgIHVuc2lnbmVkIGludCAqZHN0X3B0cikpOwotIGludCAoKl9iZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgICAgYXJlbGVudCAqciwKLSAgICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rLAotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8pKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3N5bV9pc19nbG9iYWwpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCwKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucykgUEFSQU1TICgoCi0gICAgICAgYmZkICphYmZkKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pIFBBUkFNUyAoKAotICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLSAgICAgICBiZmQgKmlucHV0X2JmZCwKLSAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICAgICBiZmRfYnl0ZSAqY29udGVudHMsCi0gICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3MsCi0gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltcywKLSAgICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zKSk7Ci0gcmVsb2NfaG93dG9fdHlwZSAqKCpfYmZkX2NvZmZfcnR5cGVfdG9faG93dG8pIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCwKLSAgICAgICBhc2VjdGlvbiAqc2VjLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsLAotICAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCwKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0sCi0gICAgICAgYmZkX3ZtYSAqYWRkZW5kcCkpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfYWRqdXN0X3N5bW5keCkgUEFSQU1TICgoCi0gICAgICAgYmZkICpvYmZkLAotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotICAgICAgIGJmZCAqaWJmZCwKLSAgICAgICBhc2VjdGlvbiAqc2VjLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2MsCi0gICAgICAgYm9vbGVhbiAqYWRqdXN0ZWRwKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKSBQQVJBTVMgKCgKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICBmbGFnd29yZCBmbGFncywgCi0gICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0gICAgICAgYmZkX3ZtYSB2YWx1ZSwKLSAgICAgICBjb25zdCBjaGFyICpzdHJpbmcsCi0gICAgICAgYm9vbGVhbiBjb3B5LAotICAgICAgIGJvb2xlYW4gY29sbGVjdCwgCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocCkpOwotCi0gYm9vbGVhbiAoKl9iZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAqIGFiZmQsCi0gICAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogcGZpbmZvKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqIGFiZmQsCi0gICAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogcGZpbmZvKSk7Ci0KLX0gYmZkX2NvZmZfYmFja2VuZF9kYXRhOwotCi0jZGVmaW5lIGNvZmZfYmFja2VuZF9pbmZvKGFiZmQpICgoYmZkX2NvZmZfYmFja2VuZF9kYXRhICopIChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYXV4X2luKGEsZSx0LGMsaW5kLG51bSxpKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfc3dhcF9hdXhfaW4pIChhLGUsdCxjLGluZCxudW0saSkpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zeW1faW4oYSxlLGkpIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9zd2FwX3N5bV9pbikgKGEsZSxpKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2xpbmVub19pbihhLGUsaSkgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvICggYSktPl9iZmRfY29mZl9zd2FwX2xpbmVub19pbikgKGEsZSxpKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX3JlbG9jX291dChhYmZkLCBpLCBvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQpIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQoYWJmZCwgaSwgbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfbGluZW5vX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYXV4X291dChhLGksdCxjLGluZCxudW0sbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX3N3YXBfYXV4X291dCkgKGEsaSx0LGMsaW5kLG51bSxvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX3N5bV9vdXQoYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zeW1fb3V0KSAoYWJmZCwgaSwgbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0KGFiZmQsIGksbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQoYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQoYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX2ZpbGhzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2ZpbGhzeikKLSNkZWZpbmUgYmZkX2NvZmZfYW91dHN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfYW91dHN6KQotI2RlZmluZSBiZmRfY29mZl9zY25oc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zY25oc3opCi0jZGVmaW5lIGJmZF9jb2ZmX3N5bWVzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3N5bWVzeikKLSNkZWZpbmUgYmZkX2NvZmZfYXV4ZXN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfYXV4ZXN6KQotI2RlZmluZSBiZmRfY29mZl9yZWxzeihhYmZkKSAgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9yZWxzeikKLSNkZWZpbmUgYmZkX2NvZmZfbGluZXN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfbGluZXN6KQotI2RlZmluZSBiZmRfY29mZl9sb25nX2ZpbGVuYW1lcyhhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbG9uZ19maWxlbmFtZXMpCi0jZGVmaW5lIGJmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyhhYmZkKSBcCi0gICAgICAgIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMpCi0jZGVmaW5lIGJmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIoYWJmZCkgXAotICAgICAgICAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlcikKLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luKGFiZmQsIGksbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbikgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbihhYmZkLCBpLG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfaW4pIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX3Njbmhkcl9pbihhYmZkLCBpLG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3Njbmhkcl9pbikgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfcmVsb2NfaW4oYWJmZCwgaSwgbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfcmVsb2NfaW4pIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9iYWRfZm9ybWF0X2hvb2soYWJmZCwgZmlsZWhkcikgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vaykgKGFiZmQsIGZpbGVoZHIpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vayhhYmZkLCBmaWxlaGRyKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spIChhYmZkLCBmaWxlaGRyKSkKLSNkZWZpbmUgYmZkX2NvZmZfbWtvYmplY3RfaG9vayhhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9ta29iamVjdF9ob29rKSAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3R5cF90b19zZWNfZmxhZ3NfaG9vayhhYmZkLCBzY25oZHIsIG5hbWUpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zdHlwX3RvX3NlY19mbGFnc19ob29rKSAoYWJmZCwgc2NuaGRyLCBuYW1lKSkKLQotI2RlZmluZSBiZmRfY29mZl9zZXRfYWxpZ25tZW50X2hvb2soYWJmZCwgc2VjLCBzY25oZHIpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zZXRfYWxpZ25tZW50X2hvb2spIChhYmZkLCBzZWMsIHNjbmhkcikpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKGFiZmQpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcoYWJmZCwgc3ltKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnKSAoYWJmZCwgc3ltKSkKLQotI2RlZmluZSBiZmRfY29mZl9wcmludF9hdXgoYWJmZCwgZmlsZSwgYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eClcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcHJpbnRfYXV4KVwKLSAgICAgICAgIChhYmZkLCBmaWxlLCBiYXNlLCBzeW1ib2wsIGF1eCwgaW5kYXV4KSkKLQotI2RlZmluZSBiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMpXAotICAgICAgICAgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUoYWJmZCwgc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKVwKLSAgICAgICAgIChhYmZkLCBzZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N5bV9pc19nbG9iYWwoYWJmZCwgc3ltKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zeW1faXNfZ2xvYmFsKVwKLSAgICAgICAgIChhYmZkLCBzeW0pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyhhYmZkKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpXAotICAgICAgICAgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsob2JmZCwgaW5mbylcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKG9iZmQpLT5fYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluaylcCi0gICAgICAgICAob2JmZCwgaW5mbykpCi0jZGVmaW5lIGJmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24ob2JmZCxpbmZvLGliZmQsbyxjb24scmVsLGlzeW1zLHNlY3MpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChpYmZkKS0+X2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pXAotICAgICAgICAgKG9iZmQsIGluZm8sIGliZmQsIG8sIGNvbiwgcmVsLCBpc3ltcywgc2VjcykpCi0jZGVmaW5lIGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKVwKLSAgICAgICAgIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKSkKLSNkZWZpbmUgYmZkX2NvZmZfYWRqdXN0X3N5bW5keChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIHJlbCwgYWRqdXN0ZWRwKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9hZGp1c3Rfc3ltbmR4KVwKLSAgICAgICAgIChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIHJlbCwgYWRqdXN0ZWRwKSkKLSNkZWZpbmUgYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbChpbmZvLGFiZmQsbmFtZSxmbGFncyxzZWN0aW9uLHZhbHVlLHN0cmluZyxjcCxjb2xsLGhhc2hwKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKVwKLSAgICAgICAgIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywgY3AsIGNvbGwsIGhhc2hwKSkKLQotI2RlZmluZSBiZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4oYSxwKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKSAoYSxwKSkKLSNkZWZpbmUgYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KGEscCkgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCkgKGEscCkpCi0KZGlmZiAtLWdpdCBhL2JmZC9saWJlY29mZi5oIGIvYmZkL2xpYmVjb2ZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjY5YTUuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYmVjb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLyogQkZEIEVDT0ZGIG9iamVjdCBmaWxlIHByaXZhdGUgc3RydWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaWZuZGVmIEVDT0ZGX0gKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jZW5kaWYKLQotLyogVGhpcyBpcyB0aGUgYmFja2VuZCBpbmZvcm1hdGlvbiBrZXB0IGZvciBFQ09GRiBmaWxlcy4gIFRoaXMKLSAgIHN0cnVjdHVyZSBpcyBjb25zdGFudCBmb3IgYSBwYXJ0aWN1bGFyIGJhY2tlbmQuICBUaGUgZmlyc3QgZWxlbWVudAotICAgaXMgdGhlIENPRkYgYmFja2VuZCBkYXRhIHN0cnVjdHVyZSwgc28gdGhhdCBFQ09GRiB0YXJnZXRzIGNhbiB1c2UKLSAgIHRoZSBnZW5lcmljIENPRkYgY29kZS4gICovCi0KLSNkZWZpbmUgZWNvZmZfYmFja2VuZChhYmZkKSBcCi0gICgoc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqKSAoYWJmZCktPnh2ZWMtPmJhY2tlbmRfZGF0YSkKLQotc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YQotewotICAvKiBDT0ZGIGJhY2tlbmQgaW5mb3JtYXRpb24uICBUaGlzIG11c3QgYmUgdGhlIGZpcnN0IGZpZWxkLiAgKi8KLSAgYmZkX2NvZmZfYmFja2VuZF9kYXRhIGNvZmY7Ci0gIC8qIFN1cHBvcnRlZCBhcmNoaXRlY3R1cmUuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgLyogSW5pdGlhbCBwb3J0aW9uIG9mIGFybWFwIHN0cmluZy4gICovCi0gIGNvbnN0IGNoYXIgKmFybWFwX3N0YXJ0OwotICAvKiBUaGUgcGFnZSBib3VuZGFyeSB1c2VkIHRvIGFsaWduIHNlY3Rpb25zIGluIGEgZGVtYW5kLXBhZ2VkCi0gICAgIGV4ZWN1dGFibGUgZmlsZS4gIEUuZy4sIDB4MTAwMC4gICovCi0gIGJmZF92bWEgcm91bmQ7Ci0gIC8qIFRydWUgaWYgdGhlIC5yZGF0YSBzZWN0aW9uIGlzIHBhcnQgb2YgdGhlIHRleHQgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIEFscGhhLiAgRmFsc2UgaWYgLnJkYXRhIGlzIHBhcnQgb2YgdGhlIGRhdGEgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIE1JUFMuICAqLwotICBib29sZWFuIHJkYXRhX2luX3RleHQ7Ci0gIC8qIEJpdHNpemUgb2YgY29uc3RydWN0b3IgZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGludCBjb25zdHJ1Y3Rvcl9iaXRzaXplOwotICAvKiBSZWxvYyB0byB1c2UgZm9yIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLwotICByZWxvY19ob3d0b190eXBlICpjb25zdHJ1Y3Rvcl9yZWxvYzsKLSAgLyogSG93IHRvIHN3YXAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgZGVidWdfc3dhcDsKLSAgLyogRXh0ZXJuYWwgcmVsb2Mgc2l6ZS4gICovCi0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgLyogUmVsb2Mgc3dhcHBpbmcgZnVuY3Rpb25zLiAgKi8KLSAgdm9pZCAoKnN3YXBfcmVsb2NfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci0gIHZvaWQgKCpzd2FwX3JlbG9jX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBQVFIpKTsKLSAgLyogQmFja2VuZCByZWxvYyB0d2Vha2luZy4gICovCi0gIHZvaWQgKCphZGp1c3RfcmVsb2NfaW4pIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkgICBhcmVsZW50ICopKTsKLSAgdm9pZCAoKmFkanVzdF9yZWxvY19vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBhcmVsZW50ICosCi0JCQkJICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci0gIC8qIFJlbG9jYXRlIHNlY3Rpb24gY29udGVudHMgd2hpbGUgbGlua2luZy4gICovCi0gIGJvb2xlYW4gKCpyZWxvY2F0ZV9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgIGJmZCAqaW5wdXRfYmZkLCBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLAotCQkJCSAgICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzKSk7Ci0gIC8qIERvIGZpbmFsIGFkanVzdG1lbnRzIHRvIGZpbGVoZHIgYW5kIGFvdXRoZHIuICAqLwotICBib29sZWFuICgqYWRqdXN0X2hlYWRlcnMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqLAotCQkJCSAgICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikpOwotICAvKiBSZWFkIGFuIGVsZW1lbnQgZnJvbSBhbiBhcmNoaXZlIGF0IGEgZ2l2ZW4gZmlsZSBwb3NpdGlvbi4gIFRoaXMKLSAgICAgaXMgbmVlZGVkIGJlY2F1c2UgT1NGLzEgMy4yIHVzZXMgYSB3ZWlyZCBhcmNoaXZlIGZvcm1hdC4gICovCi0gIGJmZCAqKCpnZXRfZWx0X2F0X2ZpbGVwb3MpIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0cikpOwotfTsKLQotLyogVGhpcyBpcyB0aGUgdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIGtlcHQgZm9yIEVDT0ZGIGZpbGVzLiAgKi8KLQotI2RlZmluZSBlY29mZl9kYXRhKGFiZmQpICgoYWJmZCktPnRkYXRhLmVjb2ZmX29ial9kYXRhKQotCi10eXBlZGVmIHN0cnVjdCBlY29mZl90ZGF0YQotewotICAvKiBUaGUgcmVsb2MgZmlsZSBwb3NpdGlvbiwgc2V0IGJ5Ci0gICAgIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gICovCi0gIGZpbGVfcHRyIHJlbG9jX2ZpbGVwb3M7Ci0KLSAgLyogVGhlIHN5bWJvbCB0YWJsZSBmaWxlIHBvc2l0aW9uLCBzZXQgYnkgX2JmZF9lY29mZl9ta29iamVjdF9ob29rLiAgKi8KLSAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0KLSAgLyogVGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHRleHQgc2VnbWVudC4gIE9ubHkgdmFsaWQgZm9yIGFuCi0gICAgIGV4aXN0aW5nIGZpbGUsIG5vdCBmb3Igb25lIHdlIGFyZSBjcmVhdGluZy4gICovCi0gIHVuc2lnbmVkIGxvbmcgdGV4dF9zdGFydDsKLSAgdW5zaWduZWQgbG9uZyB0ZXh0X2VuZDsKLQotICAvKiBUaGUgY2FjaGVkIGdwIHZhbHVlLiAgVGhpcyBpcyB1c2VkIHdoZW4gcmVsb2NhdGluZy4gICovCi0gIGJmZF92bWEgZ3A7Ci0KLSAgLyogVGhlIG1heGltdW0gc2l6ZSBvZiBvYmplY3RzIHRvIG9wdGltaXplIHVzaW5nIGdwLiAgVGhpcyBpcwotICAgICB0eXBpY2FsbHkgc2V0IGJ5IHRoZSAtRyBvcHRpb24gdG8gdGhlIGNvbXBpbGVyLCBhc3NlbWJsZXIgb3IKLSAgICAgbGlua2VyLiAgKi8KLSAgdW5zaWduZWQgaW50IGdwX3NpemU7Ci0KLSAgLyogVGhlIHJlZ2lzdGVyIG1hc2tzLiAgV2hlbiBsaW5raW5nLCBhbGwgdGhlIG1hc2tzIGZvdW5kIGluIHRoZQotICAgICBpbnB1dCBmaWxlcyBhcmUgY29tYmluZWQgaW50byB0aGUgbWFza3Mgb2YgdGhlIG91dHB1dCBmaWxlLgotICAgICBUaGVzZSBhcmUgbm90IGFsbCB1c2VkIGZvciBhbGwgdGFyZ2V0cywgYnV0IHRoYXQncyBPSywgYmVjYXVzZQotICAgICB0aGUgcmVsZXZhbnQgb25lcyBhcmUgdGhlIG9ubHkgb25lcyBzd2FwcGVkIGluIGFuZCBvdXQuICAqLwotICB1bnNpZ25lZCBsb25nIGdwcm1hc2s7Ci0gIHVuc2lnbmVkIGxvbmcgZnBybWFzazsKLSAgdW5zaWduZWQgbG9uZyBjcHJtYXNrWzRdOwotCi0gIC8qIFRoZSBFQ09GRiBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBkZWJ1Z19pbmZvOwotCi0gIC8qIFRoZSB1bnN3YXBwZWQgRUNPRkYgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBQVFIgcmF3X3N5bWVudHM7Ci0KLSAgLyogVGhlIGNhbm9uaWNhbCBCRkQgc3ltYm9scy4gICovCi0gIHN0cnVjdCBlY29mZl9zeW1ib2xfc3RydWN0ICpjYW5vbmljYWxfc3ltYm9sczsKLQotICAvKiBBIG1hcHBpbmcgZnJvbSBleHRlcm5hbCBzeW1ib2wgbnVtYmVycyB0byBlbnRyaWVzIGluIHRoZSBsaW5rZXIKLSAgICAgaGFzaCB0YWJsZSwgdXNlZCB3aGVuIGxpbmtpbmcuICAqLwotICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLQotICAvKiBBIG1hcHBpbmcgZnJvbSByZWxvYyBzeW1ib2wgaW5kaWNlcyB0byBzZWN0aW9ucywgdXNlZCB3aGVuCi0gICAgIGxpbmtpbmcuICAqLwotICBhc2VjdGlvbiAqKnN5bW5keF90b19zZWN0aW9uOwotCi0gIC8qIFRydWUgaWYgdGhpcyBCRkQgd2FzIHdyaXR0ZW4gYnkgdGhlIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgYm9vbGVhbiBsaW5rZXI7Ci0KLSAgLyogVHJ1ZSBpZiBhIHdhcm5pbmcgdGhhdCBtdWx0aXBsZSBnbG9iYWwgcG9pbnRlciB2YWx1ZXMgYXJlCi0gICAgIG5lZWRlZCBpbiB0aGUgb3V0cHV0IGJpbmFyeSB3YXMgaXNzdWVkIGFscmVhZHkuICAqLwotICBib29sZWFuIGlzc3VlZF9tdWx0aXBsZV9ncF93YXJuaW5nOwotCi0gIC8qIFVzZWQgYnkgZmluZF9uZWFyZXN0X2xpbmUgZW50cnkgcG9pbnQuICBUaGUgc3RydWN0dXJlIGNvdWxkIGJlCi0gICAgIGluY2x1ZGVkIGRpcmVjdGx5IGluIHRoaXMgb25lLCBidXQgdGhlcmUncyBubyBwb2ludCB0byB3YXN0aW5nCi0gICAgIHRoZSBtZW1vcnkganVzdCBmb3IgdGhlIGluZnJlcXVlbnRseSBjYWxsZWQgZmluZF9uZWFyZXN0X2xpbmUuICAqLwotICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpmaW5kX2xpbmVfaW5mbzsKLQotICAvKiBXaGV0aGVyIHRoZSAucmRhdGEgc2VjdGlvbiBpcyBpbiB0aGUgdGV4dCBzZWdtZW50IGZvciB0aGlzCi0gICAgIHBhcnRpY3VsYXIgRUNPRkYgZmlsZS4gIFRoaXMgaXMgbm90IHZhbGlkIHVudGlsCi0gICAgIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBpcyBjYWxsZWQuICAqLwotICBib29sZWFuIHJkYXRhX2luX3RleHQ7Ci0KLX0gZWNvZmZfZGF0YV90eXBlOwotCi0vKiBFYWNoIGNhbm9uaWNhbCBhc3ltYm9sIHJlYWxseSBsb29rcyBsaWtlIHRoaXMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBlY29mZl9zeW1ib2xfc3RydWN0Ci17Ci0gIC8qIFRoZSBhY3R1YWwgc3ltYm9sIHdoaWNoIHRoZSByZXN0IG9mIEJGRCB3b3JrcyB3aXRoICovCi0gIGFzeW1ib2wgc3ltYm9sOwotCi0gIC8qIFRoZSBmZHIgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgRkRSICpmZHI7Ci0KLSAgLyogdHJ1ZSBpZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sIHJhdGhlciB0aGFuIGFuIGV4dGVybmFsIG9uZS4gICovCi0gIGJvb2xlYW4gbG9jYWw7Ci0KLSAgLyogQSBwb2ludGVyIHRvIHRoZSB1bnN3YXBwZWQgaGlkZGVuIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbC4KLSAgICAgVGhpcyBpcyBlaXRoZXIgYSBzdHJ1Y3Qgc3ltX2V4dCBvciBhIHN0cnVjdCBleHRfZXh0LCBkZXBlbmRpbmcgb24KLSAgICAgdGhlIHZhbHVlIG9mIHRoZSBsb2NhbCBmaWVsZCBhYm92ZS4gICovCi0gIFBUUiBuYXRpdmU7Ci19IGVjb2ZmX3N5bWJvbF90eXBlOwotCi0vKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgYXN5bWJvbCB0byBlbnN1cmUgdGhhdCB0aGUKLSAgIG1hY3JvIGlzIG9ubHkgZXZlciBhcHBsaWVkIHRvIGFuIGFzeW1ib2wuICAqLwotI2RlZmluZSBlY29mZnN5bWJvbChhc3ltYm9sKSAoKGVjb2ZmX3N5bWJvbF90eXBlICopICgmKChhc3ltYm9sKS0+dGhlX2JmZCkpKQotCi0vKiBXZSBuZWVkIHRvIHNhdmUgdGhlIGluZGV4IG9mIGFuIGV4dGVybmFsIHN5bWJvbCB3aGVuIHdlIHdyaXRlIGl0Ci0gICBvdXQgc28gdGhhdCBjYW4gc2V0IHRoZSBzeW1ib2wgaW5kZXggY29ycmVjdGx5IHdoZW4gd2Ugd3JpdGUgb3V0Ci0gICB0aGUgcmVsb2NzLiAgKi8KLSNkZWZpbmUgZWNvZmZfZ2V0X3N5bV9pbmRleChzeW1ib2wpICgoc3ltYm9sKS0+dWRhdGEuaSkKLSNkZWZpbmUgZWNvZmZfc2V0X3N5bV9pbmRleChzeW1ib2wsIGlkeCkgKChzeW1ib2wpLT51ZGF0YS5pID0gKGlkeCkpCi0KLS8qIFdoZW4gZ2VuZXJhdGluZyBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLCB0aGUgbGlua2VyIHJlbGF4ZXMgdGhlIGNvZGUKLSAgIHRvIHR1cm4gUEMgcmVsYXRpdmUgYnJhbmNoZXMgaW50byBsb25nZXIgY29kZSBzZXF1ZW5jZXMgd2hlbiB0aGUgUEMKLSAgIHJlbGF0aXZlIGJyYW5jaCBpcyBvdXQgb2YgcmFuZ2UuICBUaGlzIGludm9sdmVzIHJlYWRpbmcgdGhlIHJlbG9jcwotICAgaW4gYmZkX3JlbGF4X3NlY3Rpb24gYXMgd2VsbCBhcyBpbiBiZmRfZmluYWxfbGluaywgYW5kIHJlcXVpcmVzIHRoZQotICAgY29kZSB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIHJlbG9jcyBoYXZlIGJlZW4gZXhwYW5kZWQuICBBIHBvaW50ZXIKLSAgIHRvIHRoaXMgc3RydWN0dXJlIGlzIHB1dCBpbiB0aGUgdXNlZF9ieV9iZmQgcG9pbnRlciBvZiBhIHNlY3Rpb24gdG8KLSAgIGtlZXAgdHJhY2sgb2YgdGhpcyBpbmZvcm1hdGlvbi4gIFRoZSB1c2VyX2J5X2JmZCBwb2ludGVyIHdpbGwgYmUKLSAgIE5VTEwgaWYgdGhlIGluZm9ybWF0aW9uIHdhcyBub3QgbmVlZGVkLiAgKi8KLQotc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVGhlIHVuc3dhcHBlZCByZWxvY3MgZm9yIHRoaXMgc2VjdGlvbi4gIFRoZXNlIGFyZSBzdG9yZWQgaW4KLSAgICAgbWVtb3J5IHNvIHRoZSBpbnB1dCBmaWxlIGRvZXMgbm90IGhhdmUgdG8gYmUgcmVhZCB0d2ljZS4gICovCi0gIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci0KLSAgLyogVGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uLiAgVGhlc2UgYnl0ZXMgbWF5IG9yIG1heSBub3QgYmUgc2F2ZWQKLSAgICAgaW4gbWVtb3J5LCBidXQgaWYgaXQgaXMgdGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlbS4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLQotICAvKiBPZmZzZXQgYWRqdXN0bWVudHMgZm9yIFBDIHJlbGF0aXZlIGJyYW5jaGVzLiAgQSBudW1iZXIgb3RoZXIgdGhhbgotICAgICAxIGlzIGFuIGFkZGVuZCBmb3IgYSBQQyByZWxhdGl2ZSBicmFuY2gsIG9yIGEgc3dpdGNoIHRhYmxlIGVudHJ5Ci0gICAgIHdoaWNoIGlzIHRoZSBkaWZmZXJlbmNlIG9mIHR3byAudGV4dCBsb2NhdGlvbnM7IHRoaXMgYWRkZW5kCi0gICAgIGFyaXNlcyBiZWNhdXNlIHRoZSBicmFuY2ggb3IgZGlmZmVyZW5jZSBjcm9zc2VzIG9uZSBvciBtb3JlCi0gICAgIGJyYW5jaGVzIHdoaWNoIHdlcmUgZXhwYW5kZWQgaW50byBhIGxhcmdlciBjb2RlIHNlcXVlbmNlLiAgQSAxCi0gICAgIG1lYW5zIHRoYXQgdGhpcyBicmFuY2ggd2FzIGl0c2VsZiBleHBhbmRlZCBpbnRvIGEgbGFyZ2VyIGNvZGUKLSAgICAgc2VxdWVuY2UuICAxIGlzIG5vdCBhIHBvc3NpYmxlIG9mZnNldCwgc2luY2UgYWxsIG9mZnNldHMgbXVzdCBiZQotICAgICBtdWx0aXBsZXMgb2YgdGhlIGluc3RydWN0aW9uIHNpemUsIHdoaWNoIGlzIDQ7IGFsc28sIHRoZSBvbmx5Ci0gICAgIHJlbG9jcyB3aXRoIG5vbi16ZXJvIG9mZnNldHMgd2lsbCBiZSBQQyByZWxhdGl2ZSBicmFuY2hlcyBvcgotICAgICBzd2l0Y2ggdGFibGUgZW50cmllcyB3aXRoaW4gdGhlIHNhbWUgb2JqZWN0IGZpbGUuICBJZiB0aGlzIGZpZWxkCi0gICAgIGlzIE5VTEwsIG5vIGJyYW5jaGVzIHdlcmUgZXhwYW5kZWQgYW5kIG5vIG9mZnNldHMgYXJlIHJlcXVpcmVkLgotICAgICBPdGhlcndpc2UgdGhlcmUgYXJlIGFzIG1hbnkgZW50cmllcyBhcyB0aGVyZSBhcmUgcmVsb2NzIGluIHRoZQotICAgICBzZWN0aW9uLCBhbmQgdGhlIGVudHJ5IGZvciBhbnkgcmVsb2MgdGhhdCBpcyBub3QgUEMgcmVsYXRpdmUgaXMKLSAgICAgemVyby4gICovCi0gIGxvbmcgKm9mZnNldHM7Ci0KLSAgLyogV2hlbiBwcm9kdWNpbmcgYW4gZXhlY3V0YWJsZSAoaS5lLiwgZmluYWwsIG5vbi1yZWxvY2F0YWJsZSBsaW5rKQotICAgICBvbiB0aGUgQWxwaGEsIHdlIG1heSBuZWVkIHRvIHVzZSBtdWx0aXBsZSBnbG9iYWwgcG9pbnRlciB2YWx1ZXMKLSAgICAgdG8gc3BhbiB0aGUgZW50aXJlIC5saXRhIHNlY3Rpb24uICBJbiBlc3NlbmNlLCB3ZSBhbGxvdyBlYWNoCi0gICAgIGlucHV0IC5saXRhIHNlY3Rpb24gdG8gaGF2ZSBpdHMgb3duIGdwIHZhbHVlLiAgVG8gc3VwcG9ydCB0aGlzLAotICAgICB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGdwIHZhbHVlcyB0aGF0IHdlIHBpY2tlZCBmb3IgZWFjaAotICAgICBpbnB1dCAubGl0YSBzZWN0aW9uIC4gKi8KLSAgYmZkX3ZtYSBncDsKLX07Ci0KLS8qIEFuIGFjY2Vzc29yIG1hY3JvIGZvciB0aGUgZWNvZmZfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBlY29mZl9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgKHNlYyktPnVzZWRfYnlfYmZkKQotCi0vKiBFQ09GRiBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICAqLwotICBsb25nIGluZHg7Ci0gIC8qIEJGRCB0aGF0IGV4dCBmaWVsZCB2YWx1ZSBjYW1lIGZyb20uICAqLwotICBiZmQgKmFiZmQ7Ci0gIC8qIEVDT0ZGIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIEVYVFIgZXN5bTsKLSAgLyogTm9uemVybyBpZiB0aGlzIHN5bWJvbCBoYXMgYmVlbiB3cml0dGVuIG91dC4gICovCi0gIGNoYXIgd3JpdHRlbjsKLSAgLyogTm9uemVybyBpZiB0aGlzIHN5bWJvbCB3YXMgcmVmZXJyZWQgdG8gYXMgc21hbGwgdW5kZWZpbmVkLiAgKi8KLSAgY2hhciBzbWFsbDsKLX07Ci0KLS8qIEVDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogTWFrZSBhbiBFQ09GRiBvYmplY3QuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBSZWFkIGluIHRoZSBFQ09GRiBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqKSk7Ci0KLS8qIEdlbmVyaWMgRUNPRkYgQkZEIGJhY2tlbmQgdmVjdG9ycy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKl9iZmRfZWNvZmZfYXJjaGl2ZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi0jZGVmaW5lCV9iZmRfZWNvZmZfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX25ld19zZWN0aW9uX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiBsb2NhdGlvbiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgXAotICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgXAotICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotICBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSNkZWZpbmUgX2JmZF9lY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBfYmZkX2Vjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBfYmZkX2Vjb2ZmX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfd3JpdGVfYXJtYXAKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpOwotI2RlZmluZSBfYmZkX2Vjb2ZmX3JlYWRfYXJfaGRyIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2RlZmluZSBfYmZkX2Vjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gIGJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBfYmZkX2Vjb2ZmX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgX2JmZF9lY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZSBfYmZkX2Vjb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX3RydWUKLQotZXh0ZXJuIGxvbmcgX2JmZF9lY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGxvbmcgX2JmZF9lY29mZl9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKmFsb2NhdGlvbikpOwotZXh0ZXJuIGFzeW1ib2wgKl9iZmRfZWNvZmZfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3ByaW50X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVwLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9nZXRfc3ltYm9sX2luZm8KLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hIG9mZnNldCwKLQkgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyLCBjb25zdCBjaGFyICoqZm5uYW1lX3B0ciwKLQkgICB1bnNpZ25lZCBpbnQgKnJldGxpbmVfcHRyKSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBfYmZkX2Vjb2ZmX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgX2JmZF9lY29mZl9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZCBjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZAotZXh0ZXJuIGxvbmcgX2JmZF9lY29mZl9jYW5vbmljYWxpemVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci0vKiBlY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgZGVmaW5lZCBieSBiYWNrZW5kLiAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2gKLSAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIgbG9jYXRpb24sIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLWV4dGVybiBpbnQgX2JmZF9lY29mZl9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gcmVsb2MpKTsKLS8qIGVjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgZGVmaW5lZCBieSBiYWNrZW5kLiAgKi8KLS8qIGVjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGRlZmluZWQgYnkgYmFja2VuZC4gICovCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfZWNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogSG9vayBmdW5jdGlvbnMgZm9yIHRoZSBnZW5lcmljIENPRkYgc2VjdGlvbiByZWFkaW5nIGNvZGUuICAqLwotCi1leHRlcm4gUFRSIF9iZmRfZWNvZmZfbWtvYmplY3RfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVoZHIsIFBUUiBhb3V0aGRyKSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfc2V0X2FsaWdubWVudF9ob29rIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSkpIGJmZF92b2lkKQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgZmlsZWhkcikpOwotZXh0ZXJuIGZsYWd3b3JkIF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgaGRyLCBjb25zdCBjaGFyICpuYW1lKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotLyogRUNPRkYgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhlc2UgYXJlIHRoZSBzYW1lCi0gICBmb3IgYWxsIEVDT0ZGIHRhcmdldHMsIHNvIHRoZXkgYXJlIGRlZmluZWQgaW4gZWNvZmZsaW5rLmMuICAqLwotCi1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luCi0gIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHRpcl9leHQgKiwgVElSICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0Ci0gIFBBUkFNUyAoKGludCwgY29uc3QgVElSICosIHN0cnVjdCB0aXJfZXh0ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luCi0gIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHJuZHhfZXh0ICosIFJORFhSICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dAotICBQQVJBTVMgKChpbnQsIGNvbnN0IFJORFhSICosIHN0cnVjdCBybmR4X2V4dCAqKSk7CmRpZmYgLS1naXQgYS9iZmQvbGliaHBwYS5oIGIvYmZkL2xpYmhwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViNDBlZi4uMDAwMDAwMAotLS0gYS9iZmQvbGliaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAwICswLDAgQEAKLS8qIEhQIFBBLVJJU0MgU09NIG9iamVjdCBmaWxlIGZvcm1hdDogIGRlZmluaXRpb25zIGludGVybmFsIHRvIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgLCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKLSAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0hQUEFfSAotI2RlZmluZSBfSFBQQV9ICi0KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIFBBX1BBR0VTSVpFIDB4MTAwMAotCi0jaWZuZGVmIElOTElORQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIElOTElORSBpbmxpbmUKLSNlbHNlCi0jZGVmaW5lIElOTElORQotI2VuZGlmIC8qIEdOVSBDPyAqLwotI2VuZGlmIC8qIElOTElORSAqLwotCi0jaWYgX19HTlVDX18gPj0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA3Ci0vKiBEZWNsYXJlIHRoZSBmdW5jdGlvbnMgd2l0aCB0aGUgdW51c2VkIGF0dHJpYnV0ZSB0byBhdm9pZCB3YXJuaW5ncy4gICovCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCBhc3NlbWJsZV8zICh1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgZGlzX2Fzc2VtYmxlXzMgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50ICopCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCBhc3NlbWJsZV8xMiAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgZGlzX2Fzc2VtYmxlXzEyICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgKikKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZyBhc3NlbWJsZV8xNyAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCi0JCQkJCSB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgZGlzX2Fzc2VtYmxlXzE3ICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgaW50ICopCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcgYXNzZW1ibGVfMjEgKHVuc2lnbmVkIGludCkKLSAgICAgX19hdHRyaWJ1dGUgKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgZGlzX2Fzc2VtYmxlXzIxICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nIHNpZ25fZXh0ZW5kICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCkKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50IG9uZXMgKGludCkgX19hdHRyaWJ1dGUgKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgc2lnbl91bmV4dCAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nIGxvd19zaWduX2V4dGVuZCAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgbG93X3NpZ25fdW5leHQgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQgKikKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZyBocHBhX2ZpZWxkX2FkanVzdCAodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKLQkJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSBjaGFyIGJmZF9ocHBhX2luc24yZm10ICh1bnNpZ25lZCBsb25nKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSAgdW5zaWduZWQgbG9uZyBocHBhX3JlYnVpbGRfaW5zbiAoYmZkICosIHVuc2lnbmVkIGxvbmcsCi0JCQkJCQl1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotI2VuZGlmIC8qIGdjYyAyLjcgb3IgaGlnaGVyICovCi0KLQotLyogVGhlIFBBIGluc3RydWN0aW9uIHNldCB2YXJpYW50cy4gICovCi1lbnVtIHBhX2FyY2gge3BhMTAgPSAxMCwgcGExMSA9IDExLCBwYTIwID0gMjB9OwotCi0vKiBIUCBQQS1SSVNDIHJlbG9jYXRpb24gdHlwZXMgKi8KLQotZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGUKLSAgewotICAgIFJfSFBQQV9GU0VMID0gMHgwLAotICAgIFJfSFBQQV9MU1NFTCA9IDB4MSwKLSAgICBSX0hQUEFfUlNTRUwgPSAweDIsCi0gICAgUl9IUFBBX0xTRUwgPSAweDMsCi0gICAgUl9IUFBBX1JTRUwgPSAweDQsCi0gICAgUl9IUFBBX0xEU0VMID0gMHg1LAotICAgIFJfSFBQQV9SRFNFTCA9IDB4NiwKLSAgICBSX0hQUEFfTFJTRUwgPSAweDcsCi0gICAgUl9IUFBBX1JSU0VMID0gMHg4LAotICAgIFJfSFBQQV9OU0VMICA9IDB4OSwKLSAgICBSX0hQUEFfTkxTRUwgID0gMHhhLAotICAgIFJfSFBQQV9OTFJTRUwgID0gMHhiLAotICAgIFJfSFBQQV9QU0VMID0gMHhjLAotICAgIFJfSFBQQV9MUFNFTCA9IDB4ZCwKLSAgICBSX0hQUEFfUlBTRUwgPSAweGUsCi0gICAgUl9IUFBBX1RTRUwgPSAweGYsCi0gICAgUl9IUFBBX0xUU0VMID0gMHgxMCwKLSAgICBSX0hQUEFfUlRTRUwgPSAweDExCi0gIH07Ci0KLS8qIC91c3IvaW5jbHVkZS9yZWxvYy5oIGRlZmluZXMgdGhlc2UgdG8gY29uc3RhbnRzLiAgV2Ugd2FudCB0byB1c2UKLSAgIHRoZW0gaW4gZW51bXMsIHNvICN1bmRlZiB0aGVtIGJlZm9yZSB3ZSBzdGFydCB1c2luZyB0aGVtLiAgV2UgbWlnaHQKLSAgIGJlIGFibGUgdG8gZml4IHRoaXMgYW5vdGhlciB3YXkgYnkgc2ltcGx5IG1hbmFnaW5nIG5vdCB0byBpbmNsdWRlCi0gICAvdXNyL2luY2x1ZGUvcmVsb2MuaCwgYnV0IGN1cnJlbnRseSBHREIgcGlja3MgdXAgdGhlc2UgZGVmaW5lcwotICAgc29tZXdoZXJlLiAgKi8KLSN1bmRlZiBlX2ZzZWwKLSN1bmRlZiBlX2xzc2VsCi0jdW5kZWYgZV9yc3NlbAotI3VuZGVmIGVfbHNlbAotI3VuZGVmIGVfcnNlbAotI3VuZGVmIGVfbGRzZWwKLSN1bmRlZiBlX3Jkc2VsCi0jdW5kZWYgZV9scnNlbAotI3VuZGVmIGVfcnJzZWwKLSN1bmRlZiBlX25zZWwKLSN1bmRlZiBlX25sc2VsCi0jdW5kZWYgZV9ubHJzZWwKLSN1bmRlZiBlX3BzZWwKLSN1bmRlZiBlX2xwc2VsCi0jdW5kZWYgZV9ycHNlbAotI3VuZGVmIGVfdHNlbAotI3VuZGVmIGVfbHRzZWwKLSN1bmRlZiBlX3J0c2VsCi0jdW5kZWYgZV9vbmUKLSN1bmRlZiBlX3R3bwotI3VuZGVmIGVfcGNyZWwKLSN1bmRlZiBlX2NvbgotI3VuZGVmIGVfcGxhYmVsCi0jdW5kZWYgZV9hYnMKLQotLyogZm9yIGNvbXBhdGliaWxpdHkgKi8KLWVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdAotICB7Ci0gICAgZV9mc2VsID0gUl9IUFBBX0ZTRUwsCi0gICAgZV9sc3NlbCA9IFJfSFBQQV9MU1NFTCwKLSAgICBlX3Jzc2VsID0gUl9IUFBBX1JTU0VMLAotICAgIGVfbHNlbCA9IFJfSFBQQV9MU0VMLAotICAgIGVfcnNlbCA9IFJfSFBQQV9SU0VMLAotICAgIGVfbGRzZWwgPSBSX0hQUEFfTERTRUwsCi0gICAgZV9yZHNlbCA9IFJfSFBQQV9SRFNFTCwKLSAgICBlX2xyc2VsID0gUl9IUFBBX0xSU0VMLAotICAgIGVfcnJzZWwgPSBSX0hQUEFfUlJTRUwsCi0gICAgZV9uc2VsID0gUl9IUFBBX05TRUwsCi0gICAgZV9ubHNlbCA9IFJfSFBQQV9OTFNFTCwKLSAgICBlX25scnNlbCA9IFJfSFBQQV9OTFJTRUwsCi0gICAgZV9wc2VsID0gUl9IUFBBX1BTRUwsCi0gICAgZV9scHNlbCA9IFJfSFBQQV9MUFNFTCwKLSAgICBlX3Jwc2VsID0gUl9IUFBBX1JQU0VMLAotICAgIGVfdHNlbCA9IFJfSFBQQV9UU0VMLAotICAgIGVfbHRzZWwgPSBSX0hQUEFfTFRTRUwsCi0gICAgZV9ydHNlbCA9IFJfSFBQQV9SVFNFTAotICB9OwotCi1lbnVtIGhwcGFfcmVsb2NfZXhwcl90eXBlCi0gIHsKLSAgICBSX0hQUEFfRV9PTkUgPSAwLAotICAgIFJfSFBQQV9FX1RXTyA9IDEsCi0gICAgUl9IUFBBX0VfUENSRUwgPSAyLAotICAgIFJfSFBQQV9FX0NPTiA9IDMsCi0gICAgUl9IUFBBX0VfUExBQkVMID0gNywKLSAgICBSX0hQUEFfRV9BQlMgPSAxOAotICB9OwotCi0vKiBmb3IgY29tcGF0aWJpbGl0eSAqLwotZW51bSBocHBhX3JlbG9jX2V4cHJfdHlwZV9hbHQKLSAgewotICAgIGVfb25lID0gUl9IUFBBX0VfT05FLAotICAgIGVfdHdvID0gUl9IUFBBX0VfVFdPLAotICAgIGVfcGNyZWwgPSBSX0hQUEFfRV9QQ1JFTCwKLSAgICBlX2NvbiA9IFJfSFBQQV9FX0NPTiwKLSAgICBlX3BsYWJlbCA9IFJfSFBQQV9FX1BMQUJFTCwKLSAgICBlX2FicyA9IFJfSFBQQV9FX0FCUwotICB9OwotCi0KLS8qIFJlbG9jYXRpb25zIGZvciBmdW5jdGlvbiBjYWxscyBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHBhcmFtZXRlcgotICAgcmVsb2NhdGlvbiBiaXRzLiAgVGhlc2UgYml0cyBkZXNjcmliZSBleGFjdGx5IHdoZXJlIHRoZSBjYWxsZXIgaGFzCi0gICBwbGFjZWQgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnRzIGFuZCB3aGVyZSBpdCBleHBlY3RzIHRvIGZpbmQgYSByZXR1cm4KLSAgIHZhbHVlLgotCi0gICBCb3RoIEVMRiBhbmQgU09NIGVuY29kZSB0aGlzIGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgYWRkZW5kIGZpZWxkCi0gICBvZiB0aGUgY2FsbCByZWxvY2F0aW9uLiAgKE5vdGUgdGhpcyBjb3VsZCBicmVhayB2ZXJ5IGJhZGx5IGlmIG9uZQotICAgd2FzIHRvIG1ha2UgYSBjYWxsIGxpa2UgYmwgZm9vICsgMHgxMjM0NTY3OCkuCi0KLSAgIFRoZSBoaWdoIG9yZGVyIDEwIGJpdHMgY29udGFpbiBwYXJhbWV0ZXIgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiwKLSAgIHRoZSBsb3cgb3JkZXIgMjIgYml0cyBjb250YWluIHRoZSBjb25zdGFudCBvZmZzZXQuICAqLwotICAgCi0jZGVmaW5lIEhQUEFfUl9BUkdfUkVMT0MoYSkJKCgoYSkgPj4gMjIpICYgMHgzRkYpCi0jZGVmaW5lIEhQUEFfUl9DT05TVEFOVChhKQkoKCgoaW50KShhKSkgPDwgMTApID4+IDEwKQotI2RlZmluZSBIUFBBX1JfQURERU5EKHIsYykJKCgocikgPDwgMjIpICsgKChjKSAmIDB4M0ZGRkZGKSkKLSNkZWZpbmUgSFBQQV9XSURFICAgICAgICAgICAgICAgKDApIC8qIFBTVyBXLWJpdCwgbmVlZCB0byBjaGVjayEgRklYTUUgKi8KLQotLyogVGhlc2UgbWFjcm9zIGdldCBiaXQgZmllbGRzIHVzaW5nIEhQJ3MgbnVtYmVyaW5nIChNU0IgPSAwKSwKLSAqIGJ1dCBub3RlIHRoYXQgIk1BU0siIGFzc3VtZXMgdGhhdCB0aGUgTFNCIGJpdHMgYXJlIHdoYXQncwotICogd2FudGVkLgotICovCi0jaWZuZGVmIEdFVF9GSUVMRAotI2RlZmluZSBHRVRfRklFTEQoWCwgRlJPTSwgVE8pIFwKLSAgKChYKSA+PiAoMzEgLSAoVE8pKSAmICgoMSA8PCAoKFRPKSAtIChGUk9NKSArIDEpKSAtIDEpKQotI2VuZGlmICAKLSNkZWZpbmUgR0VUX0JJVCggWCwgV0hJQ0ggKSBcCi0gIEdFVF9GSUVMRCggWCwgV0hJQ0gsIFdISUNIICkKLQotI2RlZmluZSBNQVNLKCBTSVpFICkgXAotICAofigoLTEpIDw8IFNJWkUpKQotICAKLSNkZWZpbmUgQ0FURU5BVEUoIFgsIFhTSVpFLCBZLCBZU0laRSApIFwKLSAgKCgoWCAmIE1BU0soIFhTSVpFICkpIDw8IFlTSVpFKSB8IChZICYgTUFTSyggWVNJWkUgKSkpCi0KLSNkZWZpbmUgRUxFVkVOKCBYICkgXAotICBDQVRFTkFURSggR0VUX0JJVCggWCwgMTAgKSwgMSwgR0VUX0ZJRUxEKCBYLCAwLCA5ICksIDEwKQotICAKLS8qIFNvbWUgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgUEEgaW5zdHJ1Y3Rpb25zLiAgKi8KLQotLyogTk9URTogdGhlc2UgdXNlIHRoZSBIUCBjb252ZW50aW9uIHRoYXQgZnsxfSBpcyB0aGUgX2xlZnRfIG1vc3QKLSAqICAgICAgIGJpdCAoTVNCKSBvZiBmOyB0aGV5IHNvbWV0aW1lcyBoYXZlIHRvIGltcG9zZSBhbiBhc3N1bXB0aW9uCi0gKiAgICAgICBhYm91dCB0aGUgc2l6ZSBvZiBhIGZpZWxkOyBhbmQgYXMgZmFyIGFzIEkgY2FuIHRlbGwsIG1vc3QKLSAqICAgICAgIGFyZW4ndCB1c2VkLgotICovCi0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZwotc2lnbl9leHRlbmQgKHgsIGxlbikKLSAgICAgdW5zaWduZWQgaW50IHgsIGxlbjsKLXsKLSAgcmV0dXJuIChpbnQpKHggPj4gKGxlbiAtIDEpID8gKC0xIDw8IGxlbikgfCB4IDogeCk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50Ci1hc3NlbWJsZV8zICh4KQotICAgICB1bnNpZ25lZCBpbnQgeDsKLXsKLSAgcmV0dXJuICgoKHggJiAxKSA8PCAyKSB8ICgoeCAmIDYpID4+IDEpKSAmIDc7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotZGlzX2Fzc2VtYmxlXzMgKHgsIHIpCi0gICAgIHVuc2lnbmVkIGludCB4OwotICAgICB1bnNpZ25lZCBpbnQgKnI7Ci17Ci0gICpyID0gKCgoeCAmIDQpID4+IDIpIHwgKCh4ICYgMykgPDwgMSkpICYgNzsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQgICAgICAvKiBQQSAyLjAgKi8KLWFzc2VtYmxlXzYgKHgsIHkpCi0gICAgIHVuc2lnbmVkIGludCB4LCB5OwotewotICByZXR1cm4gKCgoeCAmIDB4MSkgPDwgNSkgKyAoMzIgLSAoeSAmIDB4MWYpKSk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50Ci1hc3NlbWJsZV8xMiAoeCwgeSkKLSAgICAgdW5zaWduZWQgaW50IHgsIHk7Ci17Ci0gIHJldHVybiBDQVRFTkFURSggQ0FURU5BVEUoIHksICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9CSVQoIHgsIDEwICksIDEpLCAyLAotICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRCggeCwgMCwgOSApLCAgICAgICAgICAgOSk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotZGlzX2Fzc2VtYmxlXzEyIChhczEyLCB4LCB5KQotICAgICB1bnNpZ25lZCBpbnQgYXMxMjsKLSAgICAgdW5zaWduZWQgaW50ICp4LCAqeTsKLXsKLSAgKnkgPSAoYXMxMiAmIDB4ODAwKSA+PiAxMTsKLSAgKnggPSAoKGFzMTIgJiAweDNmZikgPDwgMSkgfCAoKGFzMTIgJiAweDQwMCkgPj4gMTApOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcgICAgIC8qIFBBIDIuMCAqLwotYXNzZW1ibGVfMTYgKHgsIHkpCi0gICAgIHVuc2lnbmVkIGludCB4LCB5OwotewotICAvKiBEZXBlbmRzIG9uIFBTVyBXLWJpdCAhKi8KLSAgdW5zaWduZWQgaW50IHRlbXA7Ci0KLSAgaWYoIEhQUEFfV0lERSApIHsKLSAgICAgIHRlbXAgPSBDQVRFTkFURSggQ0FURU5BVEUoIEdFVF9CSVQoIHksIDEzICksIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0VUX0JJVCggeSwgMTMgKV5HRVRfQklUKCB4LCAwKSksIDEgKSwgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0FURU5BVEUoIChHRVRfQklUKCB5LCAxMyApXkdFVF9CSVQoIHgsIDEpKSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRCggeSwgMCwgMTIgKSwgMTMgKSwgMTQgKTsKLSAgfQotICBlbHNlIHsgCi0gICAgICB0ZW1wID0gQ0FURU5BVEUoIENBVEVOQVRFKCBHRVRfQklUKCB5LCAxMyApLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0JJVCggeSwgMTMgKSwgMSApLCAyLAotICAgICAgICAgICAgICAgICAgICAgICBDQVRFTkFURSggR0VUX0JJVCggeSwgMTMgKSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRCggeSwgMCwgMTIgKSwgMTMgKSwgMTQgKTsKLSAgfQotCi0gIHJldHVybiBzaWduX2V4dGVuZCggdGVtcCwgMTYgKTsKLX0KLQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcgICAgIC8qIFBBIDIuMCAqLwotYXNzZW1ibGVfMTZhICh4LCB5LCB6KQotICAgICB1bnNpZ25lZCBpbnQgeCwgeSwgejsKLXsKLSAgLyogRGVwZW5kcyBvbiBQU1cgVy1iaXQgISovCi0gIHVuc2lnbmVkIGludCB0ZW1wOwotCi0gIGlmKCBIUFBBX1dJREUgKSB7Ci0gICAgICB0ZW1wID0gQ0FURU5BVEUoIENBVEVOQVRFKCB6LCAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHpeR0VUX0JJVCggeCwgMCApKSwgMSksICAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIENBVEVOQVRFKCAoel5HRVRfQklUKCB4LCAxICkpLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSwgICAgICAgICAgICAgICAgICAgMTEpLCAxMik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgICB0ZW1wID0gQ0FURU5BVEUoIENBVEVOQVRFKCB6LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiwgMSksIDIsCi0gICAgICAgICAgICAgICAgICAgICAgIENBVEVOQVRFKCB6LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSwgMTEpLCAxMik7Ci0KLSAgfQotCi0gIHJldHVybiBzaWduX2V4dGVuZCggKHRlbXAgPDwgMiksIDE2ICk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZwotYXNzZW1ibGVfMTcgKHgsIHksIHopCi0gICAgIHVuc2lnbmVkIGludCB4LCB5LCB6OwotewotICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0gIGludCAgICAgICAgICAgcTsKLQotICB0ZW1wID0gQ0FURU5BVEUoIENBVEVOQVRFKCB6LCBxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCBxKSwgcSwKLSAgICAgICAgICAgICAgICAgICBDQVRFTkFURSggR0VUX0JJVCggeSwgMSApLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfRklFTEQoIHksIDAsIDkgKSwgMTApLCAxMSk7Ci0gIAotICByZXR1cm4gdGVtcDsKLX0KLQotc3RhdGljIElOTElORSB2b2lkCi1kaXNfYXNzZW1ibGVfMTcgKGFzMTcsIHgsIHksIHopCi0gICAgIHVuc2lnbmVkIGludCBhczE3OwotICAgICB1bnNpZ25lZCBpbnQgKngsICp5LCAqejsKLXsKLQotICAqeiA9IChhczE3ICYgMHgxMDAwMCkgPj4gMTY7Ci0gICp4ID0gKGFzMTcgJiAweDBmODAwKSA+PiAxMTsKLSAgKnkgPSAoKChhczE3ICYgMHgwMDQwMCkgPj4gMTApIHwgKChhczE3ICYgMHgzZmYpIDw8IDEpKSAmIDB4N2ZmOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWFzc2VtYmxlXzIxICh4KQotICAgICB1bnNpZ25lZCBpbnQgeDsKLXsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotCi0gIHRlbXAgPSAoKHggJiAxKSA8PCAyMCkgfAotICAgICgoeCAmIDB4ZmZlKSA8PCA4KSB8Ci0gICAgKCh4ICYgMHhjMDAwKSA+PiA3KSB8Ci0gICAgKCh4ICYgMHgxZjAwMDApID4+IDE0KSB8Ci0gICAgKCh4ICYgMHgwMDMwMDApID4+IDEyKTsKLSAgcmV0dXJuIHRlbXAgJiAweDFmZmZmZjsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nICAgICAvKiBQQSAyLjAgKi8KLWFzc2VtYmxlXzIyIChhLGIsYyxkKQotICAgICB1bnNpZ25lZCBpbnQgYSxiLGMsZDsKLXsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotICAKLSAgdGVtcCA9IENBVEVOQVRFKCBDQVRFTkFURSggZCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSwgNSApLCA2LAotICAgICAgICAgICAgICAgICAgIENBVEVOQVRFKCBiLCA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEVWRU4oIGMgKSwgMTEgKSwgMTYgKTsKLQotICByZXR1cm4gc2lnbl9leHRlbmQoIHRlbXAsIDIyICk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotZGlzX2Fzc2VtYmxlXzIxIChhczIxLCB4KQotICAgICB1bnNpZ25lZCBpbnQgYXMyMSwgKng7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdGVtcDsKLQotCi0gIHRlbXAgPSAoYXMyMSAmIDB4MTAwMDAwKSA+PiAyMDsKLSAgdGVtcCB8PSAoYXMyMSAmIDB4MGZmZTAwKSA+PiA4OwotICB0ZW1wIHw9IChhczIxICYgMHgwMDAxODApIDw8IDc7Ci0gIHRlbXAgfD0gKGFzMjEgJiAweDAwMDA3YykgPDwgMTQ7Ci0gIHRlbXAgfD0gKGFzMjEgJiAweDAwMDAwMykgPDwgMTI7Ci0gICp4ID0gdGVtcDsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQKLW9uZXMgKG4pCi0gICAgIGludCBuOwotewotICB1bnNpZ25lZCBpbnQgbGVuX29uZXM7Ci0gIGludCBpOwotCi0gIGkgPSAwOwotICBsZW5fb25lcyA9IDA7Ci0gIHdoaWxlIChpIDwgbikKLSAgICB7Ci0gICAgICBsZW5fb25lcyA9IChsZW5fb25lcyA8PCAxKSB8IDE7Ci0gICAgICBpKys7Ci0gICAgfQotCi0gIHJldHVybiBsZW5fb25lczsKLX0KLQotc3RhdGljIElOTElORSB2b2lkCi1zaWduX3VuZXh0ICh4LCBsZW4sIHJlc3VsdCkKLSAgICAgdW5zaWduZWQgaW50IHgsIGxlbjsKLSAgICAgdW5zaWduZWQgaW50ICpyZXN1bHQ7Ci17Ci0gIHVuc2lnbmVkIGludCBsZW5fb25lczsKLQotICBsZW5fb25lcyA9IG9uZXMgKGxlbik7Ci0KLSAgKnJlc3VsdCA9IHggJiBsZW5fb25lczsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nCi1sb3dfc2lnbl9leHRlbmQgKHgsIGxlbikKLSAgICAgdW5zaWduZWQgaW50IHgsIGxlbjsKLXsKLSAgcmV0dXJuIChpbnQpKCh4ICYgMHgxID8gKC0xIDw8IChsZW4gLSAxKSkgOiAwKSB8IHggPj4gMSk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotbG93X3NpZ25fdW5leHQgKHgsIGxlbiwgcmVzdWx0KQotICAgICB1bnNpZ25lZCBpbnQgeCwgbGVuOwotICAgICB1bnNpZ25lZCBpbnQgKnJlc3VsdDsKLXsKLSAgdW5zaWduZWQgaW50IHRlbXA7Ci0gIHVuc2lnbmVkIGludCBzaWduOwotICB1bnNpZ25lZCBpbnQgcmVzdDsKLSAgdW5zaWduZWQgaW50IG9uZV9iaXRfYXRfbGVuOwotICB1bnNpZ25lZCBpbnQgbGVuX29uZXM7Ci0KLSAgbGVuX29uZXMgPSBvbmVzIChsZW4pOwotICBvbmVfYml0X2F0X2xlbiA9IDEgPDwgKGxlbiAtIDEpOwotCi0gIHNpZ25fdW5leHQgKHgsIGxlbiwgJnRlbXApOwotICBzaWduID0gdGVtcCAmIG9uZV9iaXRfYXRfbGVuOwotICBzaWduID4+PSAobGVuIC0gMSk7Ci0KLSAgcmVzdCA9IHRlbXAgJiAobGVuX29uZXMgXiBvbmVfYml0X2F0X2xlbik7Ci0gIHJlc3QgPDw9IDE7Ci0KLSAgKnJlc3VsdCA9IHJlc3QgfCBzaWduOwotfQotCi0vKiBIYW5kbGUgZmllbGQgc2VsZWN0b3JzIGZvciBQQSBpbnN0cnVjdGlvbnMuICAqLwotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgY29uc3RhbnRfdmFsdWUsIHJfZmllbGQpCi0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY29uc3RhbnRfdmFsdWU7Ci0gICAgIHVuc2lnbmVkIHNob3J0IHJfZmllbGQ7Ci17Ci0gIHN3aXRjaCAocl9maWVsZCkKLSAgICB7Ci0gICAgY2FzZSBlX2ZzZWw6CQkvKiBGICA6IG5vIGNoYW5nZSAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGNhc2UgZV9uc2VsOgkJLyogTiAgOiBubyBjaGFuZ2UJCSAgICAgICAqLwotICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9sc3NlbDoJCS8qIExTIDogaWYgKGJpdCAyMSkgdGhlbiBhZGQgMHg4MDAKLQkJCQkgICBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExIGJpdHMgKi8KLSAgICAgIHZhbHVlICs9IGNvbnN0YW50X3ZhbHVlOwotICAgICAgaWYgKHZhbHVlICYgMHgwMDAwMDQwMCkKLQl2YWx1ZSArPSAweDgwMDsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9yc3NlbDoJCS8qIFJTIDogU2lnbiBleHRlbmQgZnJvbSBiaXQgMjEgICAgICAgICovCi0gICAgICB2YWx1ZSArPSBjb25zdGFudF92YWx1ZTsKLSAgICAgIGlmICh2YWx1ZSAmIDB4MDAwMDA0MDApCi0JdmFsdWUgfD0gMHhmZmZmZjgwMDsKLSAgICAgIGVsc2UKLQl2YWx1ZSAmPSAweDdmZjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX2xzZWw6CQkvKiBMICA6IEFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEgYml0cyAqLwotICAgIGNhc2UgZV9ubHNlbDoJCS8qIE5MICA6IEFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEgYml0cyAqLwotICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4ZmZmZmY4MDApID4+IDExOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfcnNlbDoJCS8qIFIgIDogU2V0IGJpdHMgMC0yMCB0byB6ZXJvICAgICAgICAgICovCi0gICAgICB2YWx1ZSArPSBjb25zdGFudF92YWx1ZTsKLSAgICAgIHZhbHVlID0gdmFsdWUgJiAweDdmZjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX2xkc2VsOgkJLyogTEQgOiBBZGQgMHg4MDAsIGFyaXRobWV0aWMgc2hpZnQKLQkJCQkgICByaWdodCAxMSBiaXRzICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIHZhbHVlICs9IGNvbnN0YW50X3ZhbHVlOwotICAgICAgdmFsdWUgKz0gMHg4MDA7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4ZmZmZmY4MDApID4+IDExOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfcmRzZWw6CQkvKiBSRCA6IFNldCBiaXRzIDAtMjAgdG8gb25lICAgICAgICAgICAqLwotICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7Ci0gICAgICB2YWx1ZSB8PSAweGZmZmZmODAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfbHJzZWw6CQkvKiBMUiA6IEwgd2l0aCAicm91bmRlZCIgY29uc3RhbnQgICAgICAqLwotICAgIGNhc2UgZV9ubHJzZWw6CQkvKiBOTFIgOiBOTCB3aXRoICJyb3VuZGVkIiBjb25zdGFudCAgICAgICovCi0gICAgICB2YWx1ZSA9IHZhbHVlICsgKChjb25zdGFudF92YWx1ZSArIDB4MTAwMCkgJiAweGZmZmZlMDAwKTsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9ycnNlbDoJCS8qIFJSIDogUiB3aXRoICJyb3VuZGVkIiBjb25zdGFudCAgICAgICovCi0gICAgICB2YWx1ZSA9IHZhbHVlICsgKChjb25zdGFudF92YWx1ZSArIDB4MTAwMCkgJiAweGZmZmZlMDAwKTsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHg3ZmYpICsgY29uc3RhbnRfdmFsdWUgLSAoKGNvbnN0YW50X3ZhbHVlICsgMHgxMDAwKSAmIDB4ZmZmZmUwMDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICByZXR1cm4gdmFsdWU7Ci0KLX0KLQotLyogUEEtUklTQyBPUENPREVTICovCi0jZGVmaW5lIGdldF9vcGNvZGUoaW5zbikJKChpbnNuKSAmIDB4ZmMwMDAwMDApID4+IDI2Ci0KLS8qIEZJWE1FOiB0aGlzIGxpc3QgaXMgaW5jb21wbGV0ZS4gIEl0IHNob3VsZCBhbHNvIGJlIGFuIGVudW1lcmF0ZWQKLSAgIHR5cGUgcmF0aGVyIHRoYW4gI2RlZmluZXMuICAqLwotCi0jZGVmaW5lIExETwkweDBkCi0jZGVmaW5lIExEQgkweDEwCi0jZGVmaW5lIExESAkweDExCi0jZGVmaW5lIExEVwkweDEyCi0jZGVmaW5lIExEV00JMHgxMwotI2RlZmluZSBTVEIJMHgxOAotI2RlZmluZSBTVEgJMHgxOQotI2RlZmluZSBTVFcJMHgxYQotI2RlZmluZSBTVFdNCTB4MWIKLSNkZWZpbmUgQ09NSUNMUgkweDI0Ci0jZGVmaW5lIFNVQkkJMHgyNQotI2RlZmluZSBTVUJJTwkweDI1Ci0jZGVmaW5lIEFERElUCTB4MmMKLSNkZWZpbmUgQURESVRPCTB4MmMKLSNkZWZpbmUgQURESQkweDJkCi0jZGVmaW5lIEFERElPCTB4MmQKLSNkZWZpbmUgTERJTAkweDA4Ci0jZGVmaW5lIEFERElMCTB4MGEKLQotI2RlZmluZSBNT1ZCCTB4MzIKLSNkZWZpbmUgTU9WSUIJMHgzMwotI2RlZmluZSBDT01CVAkweDIwCi0jZGVmaW5lIENPTUJGCTB4MjIKLSNkZWZpbmUgQ09NSUJUCTB4MjEKLSNkZWZpbmUgQ09NSUJGCTB4MjMKLSNkZWZpbmUgQUREQlQJMHgyOAotI2RlZmluZSBBRERCRgkweDJhCi0jZGVmaW5lIEFERElCVAkweDI5Ci0jZGVmaW5lIEFERElCRgkweDJiCi0jZGVmaW5lIEJWQgkweDMwCi0jZGVmaW5lIEJCCTB4MzEKLQotI2RlZmluZSBCTAkweDNhCi0jZGVmaW5lIEJMRQkweDM5Ci0jZGVmaW5lIEJFCTB4MzgKLQotICAKLS8qIEdpdmVuIGEgbWFjaGluZSBpbnN0cnVjdGlvbiwgcmV0dXJuIGl0cyBmb3JtYXQuCi0KLSAgIEZJWE1FOiAgb3Bjb2RlcyB3aGljaCBkbyBub3QgbWFwIHRvIGEga25vd24gZm9ybWF0Ci0gICBzaG91bGQgcmV0dXJuIGFuIGVycm9yIG9mIHNvbWUgc29ydC4gICovCi0KLXN0YXRpYyBJTkxJTkUgY2hhcgotYmZkX2hwcGFfaW5zbjJmbXQgKGluc24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLXsKLSAgY2hhciBmbXQgPSAtMTsKLSAgdW5zaWduZWQgY2hhciBvcCA9IGdldF9vcGNvZGUgKGluc24pOwotICAKLSAgc3dpdGNoIChvcCkKLSAgICB7Ci0gICAgY2FzZSBBRERJOgotICAgIGNhc2UgQURESVQ6Ci0gICAgY2FzZSBTVUJJOgotICAgICAgZm10ID0gMTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1PVkI6Ci0gICAgY2FzZSBNT1ZJQjoKLSAgICBjYXNlIENPTUJUOgotICAgIGNhc2UgQ09NQkY6Ci0gICAgY2FzZSBDT01JQlQ6Ci0gICAgY2FzZSBDT01JQkY6Ci0gICAgY2FzZSBBRERCVDoKLSAgICBjYXNlIEFEREJGOgotICAgIGNhc2UgQURESUJUOgotICAgIGNhc2UgQURESUJGOgotICAgIGNhc2UgQlZCOgotICAgIGNhc2UgQkI6Ci0gICAgICBmbXQgPSAxMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTERPOgotICAgIGNhc2UgTERCOgotICAgIGNhc2UgTERIOgotICAgIGNhc2UgTERXOgotICAgIGNhc2UgTERXTToKLSAgICBjYXNlIFNUQjoKLSAgICBjYXNlIFNUSDoKLSAgICBjYXNlIFNUVzoKLSAgICBjYXNlIFNUV006Ci0gICAgICBmbXQgPSAxNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkw6Ci0gICAgY2FzZSBCRToKLSAgICBjYXNlIEJMRToKLSAgICAgIGZtdCA9IDE3OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMRElMOgotICAgIGNhc2UgQURESUw6Ci0gICAgICBmbXQgPSAyMTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmbXQgPSAzMjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIGZtdDsKLX0KLQotCi0vKiBJbnNlcnQgVkFMVUUgaW50byBJTlNOIHVzaW5nIFJfRk9STUFUIHRvIGRldGVybWluZSBleGFjdGx5IHdoYXQKLSAgIGJpdHMgdG8gY2hhbmdlLiAgKi8KLSAgIAotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nCi1ocHBhX3JlYnVpbGRfaW5zbiAoYWJmZCwgaW5zbiwgdmFsdWUsIHJfZm9ybWF0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgbG9uZyByX2Zvcm1hdDsKLXsKLSAgdW5zaWduZWQgbG9uZyBjb25zdF9wYXJ0OwotICB1bnNpZ25lZCBsb25nIHJlYnVpbHRfcGFydDsKLQotICBzd2l0Y2ggKHJfZm9ybWF0KQotICAgIHsKLSAgICBjYXNlIDExOgotICAgICAgewotCXVuc2lnbmVkIHcxLCB3OwotCi0JY29uc3RfcGFydCA9IGluc24gJiAweGZmZmZlMDAyOwotCWRpc19hc3NlbWJsZV8xMiAodmFsdWUsICZ3MSwgJncpOwotCXJlYnVpbHRfcGFydCA9ICh3MSA8PCAyKSB8IHc7Ci0JcmV0dXJuIGNvbnN0X3BhcnQgfCByZWJ1aWx0X3BhcnQ7Ci0gICAgICB9Ci0KLSAgICBjYXNlIDEyOgotICAgICAgewotCXVuc2lnbmVkIHcxLCB3OwotCi0JY29uc3RfcGFydCA9IGluc24gJiAweGZmZmZlMDAyOwotCWRpc19hc3NlbWJsZV8xMiAodmFsdWUsICZ3MSwgJncpOwotCXJlYnVpbHRfcGFydCA9ICh3MSA8PCAyKSB8IHc7Ci0JcmV0dXJuIGNvbnN0X3BhcnQgfCByZWJ1aWx0X3BhcnQ7Ci0gICAgICB9Ci0KLSAgICBjYXNlIDE0OgotICAgICAgewotCXVuc2lnbmVkIGludCBleHQ7Ci0JCi0JY29uc3RfcGFydCA9IGluc24gJiAweGZmZmZjMDAwOwotCWxvd19zaWduX3VuZXh0ICh2YWx1ZSwgMTQsICZleHQpOwotCXJldHVybiBjb25zdF9wYXJ0IHwgZXh0OwotICAgICAgfQotCi0gICAgY2FzZSAxNzoKLSAgICAgIHsKLQl1bnNpZ25lZCB3MSwgdzIsIHc7Ci0KLQljb25zdF9wYXJ0ID0gaW5zbiAmIDB4ZmZlMGUwMDI7Ci0JZGlzX2Fzc2VtYmxlXzE3ICh2YWx1ZSwgJncxLCAmdzIsICZ3KTsKLQlyZWJ1aWx0X3BhcnQgPSAodzIgPDwgMikgfCAodzEgPDwgMTYpIHwgdzsKLQlyZXR1cm4gY29uc3RfcGFydCB8IHJlYnVpbHRfcGFydDsKLSAgICAgIH0KLQotICAgIGNhc2UgMjE6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IHc7Ci0KLQljb25zdF9wYXJ0ID0gaW5zbiAmIDB4ZmZlMDAwMDA7Ci0JZGlzX2Fzc2VtYmxlXzIxICh2YWx1ZSwgJncpOwotCXJldHVybiBjb25zdF9wYXJ0IHwgdzsKLSAgICAgIH0KLQotICAgIGNhc2UgMzI6Ci0gICAgICBjb25zdF9wYXJ0ID0gMDsKLSAgICAgIHJldHVybiB2YWx1ZTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIHJldHVybiBpbnNuOwotfQotCi0jZW5kaWYgLyogX0hQUEFfSCAqLwpkaWZmIC0tZ2l0IGEvYmZkL2xpYmllZWUuaCBiL2JmZC9saWJpZWVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZTgwNmUuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYmllZWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKiBJRUVFLTY5NSBvYmplY3QgZmlsZSBmb3JtYXRzOiAgZGVmaW5pdGlvbnMgaW50ZXJuYWwgdG8gQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LiAgTW9zdGx5IFN0ZXZlIENoYW1iZXJsYWluJ3MgZmF1bHQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBpbnQgaW5kZXg6MjQ7Ci0gIGNoYXIgbGV0dGVyOwotfSBpZWVlX3N5bWJvbF9pbmRleF90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBjdCB7Ci0gIGJmZCAqdGhpczsKLSAgc3RydWN0IGN0ICpuZXh0OwotfSBiZmRfY2hhaW5fdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgaWVlZV9zeW1ib2wgCi17Ci0gIGFzeW1ib2wgc3ltYm9sOwotICBzdHJ1Y3QgaWVlZV9zeW1ib2wgKm5leHQ7Ci0KLSAgdW5zaWduZWQgaW50IGluZGV4OwotfSBpZWVlX3N5bWJvbF90eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0IGllZWVfcmVsb2MgewotICBhcmVsZW50IHJlbGVudDsKLSAgc3RydWN0IGllZWVfcmVsb2MgKm5leHQ7Ci0gIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3ltYm9sOwotCi19IGllZWVfcmVsb2NfdHlwZTsKLQotI2RlZmluZSBpZWVlX3N5bWJvbCh4KSAoKGllZWVfc3ltYm9sX3R5cGUgKikoeCkpCi0KLXR5cGVkZWYgc3RydWN0IGllZWVfcGVyX3NlY3Rpb24KLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGJmZF9ieXRlICpkYXRhOwotICBiZmRfdm1hIG9mZnNldDsKLSAgYmZkX3ZtYSBwYzsKLSAgLyogRm9yIG91dHB1dCAqLwotICBmaWxlX3B0ciBjdXJyZW50X3BvczsKLSAgdW5zaWduZWQgaW50IGN1cnJlbnRfYnl0ZTsKLSAgYm9vbGVhbiBpbml0aWFsaXplZDsKLSAgaWVlZV9yZWxvY190eXBlICoqcmVsb2NfdGFpbF9wdHI7Ci19IGllZWVfcGVyX3NlY3Rpb25fdHlwZTsKLQotI2RlZmluZSBpZWVlX3Blcl9zZWN0aW9uKHgpICgoaWVlZV9wZXJfc2VjdGlvbl90eXBlICopKCh4KS0+dXNlZF9ieV9iZmQpKQotICAKLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgIGNoYXIgKmlucHV0X3A7Ci0gIHVuc2lnbmVkIGNoYXIgKmZpcnN0X2J5dGU7Ci0gIGJmZCAqYWJmZDsKLX0gY29tbW9uX2hlYWRlcl90eXBlIDsKLQotdHlwZWRlZiBzdHJ1Y3QgaWVlZV9kYXRhX3N0cnVjdAotewotICBjb21tb25faGVhZGVyX3R5cGUgaDsKLSAgYm9vbGVhbiByZWFkX3N5bWJvbHM7Ci0gIGJvb2xlYW4gcmVhZF9kYXRhOwkKLSAgZmlsZV9wdHIgb3V0cHV0X2N1cnNvcjsKLSAgLyogTWFwIG9mIHNlY3Rpb24gaW5kZXhlcyB0byBzZWN0aW9uIHB0cnMgKi8KLSAgYXNlY3Rpb24gKipzZWN0aW9uX3RhYmxlOwotICB1bnNpZ25lZCBpbnQgc2VjdGlvbl90YWJsZV9zaXplOwotICBpZWVlX2FkZHJlc3NfZGVzY3JpcHRvcl90eXBlIGFkOwotICBpZWVlX21vZHVsZV9iZWdpbl90eXBlIG1iOwotICBpZWVlX3dfdmFyaWFibGVfdHlwZSB3OwotICAKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25fY291bnQ7Ci0gIAotICB1bnNpZ25lZCBpbnQgbWFwX2lkeDsKLSAgLyogTGlzdCBvZiBHTE9CQUwgRVhQT1JUIHN5bWJvbHMgKi8KLSAgaWVlZV9zeW1ib2xfdHlwZSAqZXh0ZXJuYWxfc3ltYm9sczsKLSAgLyogTGlzdCBvZiBVTkRFRklORUQgc3ltYm9scyAqLwotICBpZWVlX3N5bWJvbF90eXBlICpleHRlcm5hbF9yZWZlcmVuY2U7Ci0gIAotICAvKiBXaGVuIHRoZSBzeW1ib2xzIGhhdmUgYmVlbiBjYW5vbmljYWxpemVkLCB0aGV5IGFyZSBpbiBhCi0gICAgKiBzcGVjaWFsIG9yZGVyLCB3ZSByZW1lbWJlciB2YXJpb3VzIGJhc2VzIGhlcmUuLiAqLwotICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfc3ltYm9sX21heF9pbmRleDsKLSAgdW5zaWduZWQgaW50IGV4dGVybmFsX3N5bWJvbF9taW5faW5kZXg7Ci0gIHVuc2lnbmVkIGludCBleHRlcm5hbF9zeW1ib2xfY291bnQ7Ci0gIGludCBleHRlcm5hbF9zeW1ib2xfYmFzZV9vZmZzZXQ7Ci0gIAotICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfcmVmZXJlbmNlX21heF9pbmRleDsKLSAgdW5zaWduZWQgaW50IGV4dGVybmFsX3JlZmVyZW5jZV9taW5faW5kZXg7Ci0gIHVuc2lnbmVkIGludCBleHRlcm5hbF9yZWZlcmVuY2VfY291bnQ7Ci0gIGludCBleHRlcm5hbF9yZWZlcmVuY2VfYmFzZV9vZmZzZXQ7Ci0gIAotCi0gIGJvb2xlYW4gc3ltYm9sX3RhYmxlX2Z1bGw7Ci0KLSAgCi1ib29sZWFuIGRvbmVfZGVidWc7Ci0KLQotYmZkX2NoYWluX3R5cGUgKmNoYWluX2hlYWQ7Ci1iZmRfY2hhaW5fdHlwZSAqY2hhaW5fcm9vdDsKLQotfSBpZWVlX2RhdGFfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBmaWxlX3B0ciBmaWxlX29mZnNldDsKLSAgYmZkICphYmZkOwotfSBpZWVlX2FyX29ic3RhY2tfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgaWVlZV9hcl9kYXRhX3N0cnVjdCAKLXsKLSAgY29tbW9uX2hlYWRlcl90eXBlIGg7Ci0gIGllZWVfYXJfb2JzdGFja190eXBlICplbGVtZW50czsKLSAgCi0gIHVuc2lnbmVkICBpbnQgZWxlbWVudF9pbmRleCA7Ci0gIHVuc2lnbmVkIGludCBlbGVtZW50X2NvdW50OwotCi19IGllZWVfYXJfZGF0YV90eXBlOwotCi0jZGVmaW5lIElFRUVfREFUQShhYmZkKSAoKGFiZmQpLT50ZGF0YS5pZWVlX2RhdGEpCi0jZGVmaW5lIElFRUVfQVJfREFUQShhYmZkKSAoKGFiZmQpLT50ZGF0YS5pZWVlX2FyX2RhdGEpCi0KLSNkZWZpbmUgcHRyKGFiZmQpIChpZWVlX2RhdGEoYWJmZCktPmlucHV0X3ApCmRpZmYgLS1naXQgYS9iZmQvbGlibmxtLmggYi9iZmQvbGlibmxtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZDJlNGUuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYm5sbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBkYXRhIHN0cnVjdHVyZXMgZm9yIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGVzKSBmaWxlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfTElCTkxNX0hfCi0jZGVmaW5lIF9MSUJOTE1fSF8gMQotCi0jaWZkZWYgQVJDSF9TSVpFCi0jICBkZWZpbmUgTkxNX0FSQ0hfU0laRSBBUkNIX1NJWkUKLSNlbmRpZgotI2luY2x1ZGUgIm5sbS9jb21tb24uaCIKLSNpbmNsdWRlICJubG0vaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJubG0vZXh0ZXJuYWwuaCIKLQotLyogQSByZWxvYyBmb3IgYW4gaW1wb3J0ZWQgTkxNIHN5bWJvbC4gIE5vcm1hbCByZWxvY3MgYXJlIGFzc29jaWF0ZWQKLSAgIHdpdGggc2VjdGlvbnMsIGFuZCBpbmNsdWRlIGEgc3ltYm9sLiAgVGhlc2UgcmVsb2NzIGFyZSBhc3NvY2lhdGVkCi0gICB3aXRoICh1bmRlZmluZWQpIHN5bWJvbHMsIGFuZCBpbmNsdWRlIGEgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBubG1fcmVsZW50Ci17Ci0gIC8qIFNlY3Rpb24gb2YgcmVsb2MuICAqLwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgLyogUmVsb2MgaW5mbyAoc3ltX3B0cl9wdHIgZmllbGQgc2V0IG9ubHkgd2hlbiBjYW5vbmljYWxpemVkKS4gICovCi0gIGFyZWxlbnQgcmVsb2M7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBhbiBOTE0gc3ltYm9sLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogQkZEIHN5bWJvbC4gICovCi0gIGFzeW1ib2wgc3ltYm9sOwotICAvKiBOdW1iZXIgb2YgcmVsb2MgZW50cmllcyBmb3IgaW1wb3J0ZWQgc3ltYm9sLiAgKi8KLSAgYmZkX3NpemVfdHlwZSByY250OwotICAvKiBBcnJheSBvZiByZWxvYyBpbmZvcm1hdGlvbiBmb3IgaW1wb3J0ZWQgc3ltYm9sLiAgKi8KLSAgc3RydWN0IG5sbV9yZWxlbnQgKnJlbG9jczsKLX0gbmxtTkFNRShzeW1ib2xfdHlwZSk7Ci0KLWV4dGVybiBib29sZWFuIG5sbV9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gbmxtX3NldF9hcmNoX21hY2ggUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKLQkJCQkJICB1bnNpZ25lZCBsb25nKSk7Ci0KLWV4dGVybiB2b2lkIG5sbU5BTUUoZ2V0X3N5bWJvbF9pbmZvKQotICAgICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSk7Ci1leHRlcm4gbG9uZyBubG1OQU1FKGdldF9zeW10YWJfdXBwZXJfYm91bmQpCi0gICAgIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBubG1OQU1FKGdldF9zeW10YWIpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gYXN5bWJvbCAqbmxtTkFNRShtYWtlX2VtcHR5X3N5bWJvbCkKLSAgICAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiB2b2lkIG5sbU5BTUUocHJpbnRfc3ltYm9sKQotICAgICBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotZXh0ZXJuIGxvbmcgbmxtTkFNRShnZXRfcmVsb2NfdXBwZXJfYm91bmQpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gbG9uZyBubG1OQU1FKGNhbm9uaWNhbGl6ZV9yZWxvYykKLSAgICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICpubG1OQU1FKG9iamVjdF9wKQotICAgICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gbmxtTkFNRShzZXRfYXJjaF9tYWNoKQotICAgICBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSk7Ci1leHRlcm4gYm9vbGVhbiBubG1OQU1FKHNldF9zZWN0aW9uX2NvbnRlbnRzKQotICAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotZXh0ZXJuIGJvb2xlYW4gbmxtTkFNRSh3cml0ZV9vYmplY3RfY29udGVudHMpCi0gICAgIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIFNvbWUgcHJpdmF0ZSBkYXRhIGlzIHN0YXNoZWQgYXdheSBmb3IgZnV0dXJlIHVzZSB1c2luZyB0aGUgdGRhdGEgcG9pbnRlcgotICAgaW4gdGhlIGJmZCBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgbmxtX29ial90ZGF0YQotewotICAvKiBBY3R1YWwgZGF0YSwgYnV0IHJlZiBsaWtlIHB0ciAqLwotICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyCW5sbV9maXhlZF9oZHJbMV07Ci0gIE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIJbmxtX3ZhcmlhYmxlX2hkclsxXTsKLSAgTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyCW5sbV92ZXJzaW9uX2hkclsxXTsKLSAgTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIJbmxtX2NvcHlyaWdodF9oZHJbMV07Ci0gIE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIJbmxtX2V4dGVuZGVkX2hkclsxXTsKLSAgTmxtX0ludGVybmFsX0N1c3RvbV9IZWFkZXIJbmxtX2N1c3RvbV9oZHJbMV07Ci0gIE5sbV9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlciBubG1fY3lnbnVzX2V4dF9oZHJbMV07Ci0gIC8qIEJGRCBOTE0gc3ltYm9scy4gICovCi0gIG5sbU5BTUUoc3ltYm9sX3R5cGUpCQkqbmxtX3N5bWJvbHM7Ci0gIC8qIExvd2VzdCB0ZXh0IGFuZCBkYXRhIFZNQSB2YWx1ZXMuICAqLwotICBiZmRfdm1hCQkJbmxtX3RleHRfbG93OwotICBiZmRfdm1hCQkJbmxtX2RhdGFfbG93OwotICAvKiBDYWNoZXMgZm9yIGRhdGEgcmVhZCBmcm9tIG9iamVjdCBmaWxlLiAgKi8KLSAgYXJlbGVudCAqCQkJbmxtX3JlbG9jX2ZpeHVwczsKLSAgYXNlY3Rpb24gKioJCQlubG1fcmVsb2NfZml4dXBfc2VjczsKLSAgLyogQmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGEgcG9pbnRlciwKLSAgICAgYnV0IHRoYXQgd291bGQgcmVxdWlyZSB5ZXQgYW5vdGhlciBlbnRyeSBwb2ludCB0byBpbml0aWFsaXplIHRoZQotICAgICBzdHJ1Y3R1cmUuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIHN0cnVjdAkvKiBBbHBoYSBiYWNrZW5kIGluZm9ybWF0aW9uLiAgKi8KLQl7Ci0JICBiZmRfdm1hIGdwOwkJCS8qIEdQIHZhbHVlLiAgKi8KLQkgIGJmZF92bWEgbGl0YV9hZGRyZXNzOwkJLyogLmxpdGEgc2VjdGlvbiBhZGRyZXNzLiAgKi8KLQkgIGJmZF9zaXplX3R5cGUgbGl0YV9zaXplOwkvKiAubGl0YSBzZWN0aW9uIHNpemUuICAqLwotCX0KLSAgICAgIGFscGhhX2JhY2tlbmRfZGF0YTsKLSAgICB9Ci0gIGJhY2tlbmRfZGF0YTsKLX07Ci0KLSNkZWZpbmUgbmxtX3RkYXRhKGJmZCkJCQkoKGJmZCkgLT4gdGRhdGEubmxtX29ial9kYXRhKQotI2RlZmluZSBubG1fZml4ZWRfaGVhZGVyKGJmZCkJCShubG1fdGRhdGEoYmZkKSAtPiBubG1fZml4ZWRfaGRyKQotI2RlZmluZSBubG1fdmFyaWFibGVfaGVhZGVyKGJmZCkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV92YXJpYWJsZV9oZHIpCi0jZGVmaW5lIG5sbV92ZXJzaW9uX2hlYWRlcihiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3ZlcnNpb25faGRyKQotI2RlZmluZSBubG1fY29weXJpZ2h0X2hlYWRlcihiZmQpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fY29weXJpZ2h0X2hkcikKLSNkZWZpbmUgbmxtX2V4dGVuZGVkX2hlYWRlcihiZmQpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fZXh0ZW5kZWRfaGRyKQotI2RlZmluZSBubG1fY3VzdG9tX2hlYWRlcihiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2N1c3RvbV9oZHIpCi0jZGVmaW5lIG5sbV9jeWdudXNfZXh0X2hlYWRlcihiZmQpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fY3lnbnVzX2V4dF9oZHIpCi0jZGVmaW5lIG5sbV9nZXRfc3ltYm9scyhiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3N5bWJvbHMpCi0jZGVmaW5lIG5sbV9zZXRfc3ltYm9scyhiZmQsIHApCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3N5bWJvbHMgPSAocCkpCi0jZGVmaW5lIG5sbV9zZXRfdGV4dF9sb3coYmZkLCBpKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3RleHRfbG93ID0gKGkpKQotI2RlZmluZSBubG1fZ2V0X3RleHRfbG93KGJmZCkJCShubG1fdGRhdGEoYmZkKSAtPiBubG1fdGV4dF9sb3cpCi0jZGVmaW5lIG5sbV9zZXRfZGF0YV9sb3coYmZkLCBpKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2RhdGFfbG93ID0gKGkpKQotI2RlZmluZSBubG1fZ2V0X2RhdGFfbG93KGJmZCkJCShubG1fdGRhdGEoYmZkKSAtPiBubG1fZGF0YV9sb3cpCi0jZGVmaW5lIG5sbV9yZWxvY2F0aW9uX2ZpeHVwcyhiZmQpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fcmVsb2NfZml4dXBzKQotI2RlZmluZSBubG1fcmVsb2NhdGlvbl9maXh1cF9zZWNzKGJmZCkJKG5sbV90ZGF0YShiZmQpLT5ubG1fcmVsb2NfZml4dXBfc2VjcykKLQotI2RlZmluZSBubG1fYWxwaGFfYmFja2VuZF9kYXRhKGJmZCkgXAotICAoJm5sbV90ZGF0YSAoYmZkKS0+YmFja2VuZF9kYXRhLmFscGhhX2JhY2tlbmRfZGF0YSkKLQotLyogVGhpcyBpcyB1c2VkIHdoZW4gd3JpdGluZyBvdXQgdGhlIGV4dGVybmFsIHJlbG9jcy4gKi8KLQotc3RydWN0IHJlbG9jX2FuZF9zZWMKLXsKLSAgYXJlbGVudCAqcmVsOwotICBhc2VjdGlvbiAqc2VjOwotfTsKLQotLyogV2Ugc3RvcmUgc29tZSBmdW5jdGlvbiBwb2ludGVyIGluIHRoZSBiYWNrZW5kIHN0cnVjdHVyZS4gIFRoaXMgbGV0cwotICAgZGlmZmVyZW50IE5MTSB0YXJnZXRzIHNoYXJlIG1vc3Qgb2YgdGhlIHNhbWUgY29kZSwgd2hpbGUgcHJvdmlkaW5nCi0gICBzbGlnaHRseSBkaWZmZXJlbnQgY29kZSB3aGVyZSBuZWNlc3NhcnkuICAqLwotCi1zdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YQotewotICAvKiBTaWduYXR1cmUgZm9yIHRoaXMgYmFja2VuZC4gICovCi0gIGNoYXIgc2lnbmF0dXJlW05MTV9TSUdOQVRVUkVfU0laRV07Ci0gIC8qIFNpemUgb2YgdGhlIGZpeGVkIGhlYWRlci4gICovCi0gIGJmZF9zaXplX3R5cGUgZml4ZWRfaGVhZGVyX3NpemU7Ci0gIC8qIFNpemUgb2Ygb3B0aW9uYWwgcHJlZml4IGZvciB0aGlzIGJhY2tlbmQuICBTb21lIGJhY2tlbmQgbWF5Ci0gICAgIHJlcXVpcmUgdGhpcyB0byBiZSBhIGZ1bmN0aW9uLCBidXQgc28gZmFyIGEgY29uc3RhbnQgaXMgT0suICBUaGlzCi0gICAgIGlzIGZvciBhIHByZWZpeCB3aGljaCBwcmVjZWRlcyB0aGUgc3RhbmRhcmQgTkxNIGZpeGVkIGhlYWRlci4gICovCi0gIGJmZF9zaXplX3R5cGUgb3B0aW9uYWxfcHJlZml4X3NpemU7Ci0gIC8qIEFyY2hpdGVjdHVyZS4gICovCi0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAvKiBNYWNoaW5lLiAgKi8KLSAgbG9uZyBtYWNoOwotICAvKiBTb21lIE5MTSBmb3JtYXRzIGRvIG5vdCB1c2UgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uLCBzbwotICAgICBhbGwgdW5pbml0aWFsaXplZCBkYXRhIG11c3QgYmUgcHV0IGludG8gdGhlIHJlZ3VsYXIgZGF0YSBzZWN0aW9uCi0gICAgIGluc3RlYWQuICAqLwotICBib29sZWFuIG5vX3VuaW5pdGlhbGl6ZWRfZGF0YTsKLSAgLyogU29tZSBOTE0gZm9ybWF0cyBoYXZlIGEgcHJlZml4IG9uIHRoZSBmaWxlLiAgSWYgdGhpcyBmdW5jdGlvbiBpcwotICAgICBub3QgTlVMTCwgaXQgd2lsbCBiZSBjYWxsZWQgYnkgbmxtX29iamVjdF9wLiAgSXQgc2hvdWxkIHJldHVybgotICAgICB0cnVlIGlmIHRoaXMgZmlsZSBjb3VsZCBtYXRjaCB0aGlzIGZvcm1hdCwgYW5kIGl0IHNob3VsZCBsZWF2ZQotICAgICB0aGUgQkZEIHN1Y2ggdGhhdCBhIGJmZF9yZWFkIHdpbGwgcGljayB1cCB0aGUgZml4ZWQgaGVhZGVyLiAgKi8KLSAgYm9vbGVhbiAoKm5sbV9iYWNrZW5kX29iamVjdF9wKSBQQVJBTVMgKChiZmQgKikpOwotICAvKiBXcml0ZSBvdXQgdGhlIHByZWZpeC4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIE5VTEwuICBUaGlzIG11c3QKLSAgICAgd3JpdGUgb3V0IHRoZSBzYW1lIG51bWJlciBvZiBieXRlcyBhcyBpcyBpbiB0aGUgZmllbGQKLSAgICAgb3B0aW9uYWxfcHJlZml4X3NpemUuICAqLwotICBib29sZWFuICgqbmxtX3dyaXRlX3ByZWZpeCkgUEFSQU1TICgoYmZkICopKTsKLSAgLyogUmVhZCBhIHJlbG9jYXRpb24gZml4dXAgZnJvbSBhYmZkLiAgVGhlIHJlbG9jIGluZm9ybWF0aW9uIGlzCi0gICAgIG1hY2hpbmUgc3BlY2lmaWMuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBzeW1ib2wgaWYgdGhpcyBpcwotICAgICBhbiBpbXBvcnQsIG9yIE5VTEwgaWYgdGhpcyBpcyBhIHJlbG9jIGZpeHVwLiAgVGhpcyBmdW5jdGlvbgotICAgICBzaG91bGQgc2V0IHRoZSB0aGlyZCBhcmd1bWVudCB0byB0aGUgc2VjdGlvbiB3aGljaCB0aGUgcmVsb2MKLSAgICAgYmVsb25ncyBpbiwgYW5kIHRoZSBmb3VydGggYXJndW1lbnQgdG8gdGhlIHJlbG9jIGl0c2VsZjsgaXQgZG9lcwotICAgICBub3QgbmVlZCB0byBmaWxsIGluIHRoZSBzeW1fcHRyX3B0ciBmaWVsZCBmb3IgYSByZWxvYyBhZ2FpbnN0IGFuCi0gICAgIGltcG9ydCBzeW1ib2wuICAqLwotICBib29sZWFuICgqbmxtX3JlYWRfcmVsb2MpIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqLAotCQkJCSAgICAgYXNlY3Rpb24gKiosIGFyZWxlbnQgKikpOwotICAvKiBUbyBtYWtlIG9iamNvcHkgdG8gYW4gaTM4NiBOTE0gd29yaywgdGhlIGkzODYgYmFja2VuZCBuZWVkcyBhCi0gICAgIGNoYW5jZSB0byB3b3JrIG92ZXIgdGhlIHJlbG9jcy4gIFRoaXMgaXMgYSBiaXQgaWNreS4gICovCi0gIGJvb2xlYW4gKCpubG1fbWFuZ2xlX3JlbG9jcykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiBkYXRhLAotCQkJCQliZmRfdm1hIG9mZnNldCwKLQkJCQkJYmZkX3NpemVfdHlwZSBjb3VudCkpOwotICAvKiBSZWFkIGFuIGltcG9ydCByZWNvcmQgZnJvbSBhYmZkLiAgSXQgd291bGQgYmUgbmljZSBpZiB0aGlzCi0gICAgIHdlcmUgaW4gYSBtYWNoaW5lLWRlcGVuZGVudCBmb3JtYXQsIGJ1dCBpdCBkb2Vzbid0IHNlZW0gdG8gYmUuICovCi0gIGJvb2xlYW4gKCpubG1fcmVhZF9pbXBvcnQpIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7Ci0gIC8qIFdyaXRlIGFuIGltcG9ydCByZWNvcmQgdG8gYWJmZC4gKi8KLSAgYm9vbGVhbiAoKm5sbV93cml0ZV9pbXBvcnQpIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKLSAgLyogU2V0IHRoZSBzZWN0aW9uIGZvciBhIHB1YmxpYyBzeW1ib2wuICBUaGlzIG1heSBiZSBOVUxMLCBpbiB3aGljaAotICAgICBjYXNlIGEgZGVmYXVsdCBtZXRob2Qgd2lsbCBiZSB1c2VkLiAgKi8KLSAgYm9vbGVhbiAoKm5sbV9zZXRfcHVibGljX3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7Ci0gIC8qIEdldCB0aGUgb2Zmc2V0IHRvIHdyaXRlIG91dCBmb3IgYSBwdWJsaWMgc3ltYm9sLiAgVGhpcyBtYXkgYmUKLSAgICAgTlVMTCwgaW4gd2hpY2ggY2FzZSBhIGRlZmF1bHQgbWV0aG9kIHdpbGwgYmUgdXNlZC4gICovCi0gIGJmZF92bWEgKCpubG1fZ2V0X3B1YmxpY19vZmZzZXQpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLSAgLyogU3dhcCB0aGUgZml4ZWQgaGVhZGVyIGluIGFuZCBvdXQgKi8KLSAgdm9pZCAoKm5sbV9zd2FwX2ZoZHJfaW4pIFBBUkFNUyAoKGJmZCAqLAotCQkJCSAgICBQVFIsCi0JCQkJICAgIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKikpOwotICB2b2lkICgqbmxtX3N3YXBfZmhkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLAotCQkJCSAgICAgc3RydWN0IG5sbV9pbnRlcm5hbF9maXhlZF9oZWFkZXIgKiwKLQkJCQkgICAgIFBUUikpOwotICAvKiBXcml0ZSBvdXQgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlLiAgKi8KLSAgYm9vbGVhbiAoKm5sbV93cml0ZV9leHRlcm5hbCkgUEFSQU1TICgoYmZkICosIGJmZF9zaXplX3R5cGUsCi0JCQkJCSBhc3ltYm9sICosCi0JCQkJCSBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqKSk7Ci0gIGJvb2xlYW4gKCpubG1fd3JpdGVfZXhwb3J0KSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBiZmRfdm1hKSk7Ci19OwotCi0jZGVmaW5lIG5sbV9iYWNrZW5kKGJmZCkgXAotICAoKHN0cnVjdCBubG1fYmFja2VuZF9kYXRhICopKChiZmQpIC0+IHh2ZWMgLT4gYmFja2VuZF9kYXRhKSkKLSNkZWZpbmUgbmxtX3NpZ25hdHVyZShiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gc2lnbmF0dXJlKQotI2RlZmluZSBubG1fZml4ZWRfaGVhZGVyX3NpemUoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IGZpeGVkX2hlYWRlcl9zaXplKQotI2RlZmluZSBubG1fb3B0aW9uYWxfcHJlZml4X3NpemUoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG9wdGlvbmFsX3ByZWZpeF9zaXplKQotI2RlZmluZSBubG1fYXJjaGl0ZWN0dXJlKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBhcmNoKQotI2RlZmluZSBubG1fbWFjaGluZShiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbWFjaCkKLSNkZWZpbmUgbmxtX25vX3VuaW5pdGlhbGl6ZWRfZGF0YShiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbm9fdW5pbml0aWFsaXplZF9kYXRhKQotI2RlZmluZSBubG1fYmFja2VuZF9vYmplY3RfcF9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fYmFja2VuZF9vYmplY3RfcCkKLSNkZWZpbmUgbmxtX3dyaXRlX3ByZWZpeF9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fd3JpdGVfcHJlZml4KQotI2RlZmluZSBubG1fcmVhZF9yZWxvY19mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fcmVhZF9yZWxvYykKLSNkZWZpbmUgbmxtX21hbmdsZV9yZWxvY3NfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX21hbmdsZV9yZWxvY3MpCi0jZGVmaW5lIG5sbV9yZWFkX2ltcG9ydF9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fcmVhZF9pbXBvcnQpCi0jZGVmaW5lIG5sbV93cml0ZV9pbXBvcnRfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3dyaXRlX2ltcG9ydCkKLSNkZWZpbmUgbmxtX3NldF9wdWJsaWNfc2VjdGlvbl9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fc2V0X3B1YmxpY19zZWN0aW9uKQotI2RlZmluZSBubG1fZ2V0X3B1YmxpY19vZmZzZXRfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX2dldF9wdWJsaWNfb2Zmc2V0KQotI2RlZmluZSBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW5fZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3N3YXBfZmhkcl9pbikKLSNkZWZpbmUgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dF9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fc3dhcF9maGRyX291dCkKLSNkZWZpbmUgbmxtX3dyaXRlX2V4dGVybmFsX2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV93cml0ZV9leHRlcm5hbCkKLSNkZWZpbmUgbmxtX3dyaXRlX2V4cG9ydF9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fd3JpdGVfZXhwb3J0KQotCi0vKiBUaGUgTkxNIGNvZGUsIGRhdGEsIGFuZCB1bmluaXRpYWxpemVkIHNlY3Rpb25zIGhhdmUgbm8gbmFtZXMgZGVmaW5lZAotICAgaW4gdGhlIE5MTSwgYnV0IGJmZCB3YW50cyB0byBnaXZlIHRoZW0gbmFtZXMsIHNvIHVzZSB0aGUgdHJhZGl0aW9uYWwKLSAgIFVOSVggbmFtZXMuICAqLwotCi0jZGVmaW5lIE5MTV9DT0RFX05BTUUJCQkiLnRleHQiCi0jZGVmaW5lIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUJIi5kYXRhIgotI2RlZmluZSBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUJIi5ic3MiCi0KLSNlbmRpZiAvKiBfTElCTkxNX0hfICovCmRpZmYgLS1naXQgYS9iZmQvbGlib2FzeXMuaCBiL2JmZC9saWJvYXN5cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdlYTU5Li4wMDAwMDAwCi0tLSBhL2JmZC9saWJvYXN5cy5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyogQkZEIGludGVybmFsIGRlY2xhcmF0aW9ucyBmb3IgT2FzeXMgZmlsZSBmb3JtYXQgaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFNjcmF3bGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLXR5cGVkZWYgc3RydWN0IF9vYXN5c19zeW1ib2wKLXsKLSAgYXN5bWJvbCBzeW1ib2w7Ci19IG9hc3lzX3N5bWJvbF90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBfb2FzeXNfcmVsb2MgewotICBhcmVsZW50IHJlbGVudDsKLSAgc3RydWN0IF9vYXN5c19yZWxvYyAqbmV4dDsKLSAgdW5zaWduZWQgaW50IHN5bWJvbDsKLX0gb2FzeXNfcmVsb2NfdHlwZTsKLQotCi0jZGVmaW5lIG9hc3lzX3N5bWJvbCh4KSAoKG9hc3lzX3N5bWJvbF90eXBlICopKHgpKQotI2RlZmluZSBvYXN5c19wZXJfc2VjdGlvbih4KSAoKG9hc3lzX3Blcl9zZWN0aW9uX3R5cGUgKikoeC0+dXNlZF9ieV9iZmQpKQotCi10eXBlZGVmIHN0cnVjdCBfb2FzeXNfcGVyX3NlY3Rpb24KLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGJmZF9ieXRlICpkYXRhOwotICBiZmRfdm1hIG9mZnNldDsKLSAgYm9vbGVhbiBoYWRfdm1hOwotICBvYXN5c19yZWxvY190eXBlICoqcmVsb2NfdGFpbF9wdHI7Ci0gIGJmZF92bWEgcGM7Ci0KLQotICBmaWxlX3B0ciBjdXJyZW50X3BvczsKLSAgdW5zaWduZWQgaW50IGN1cnJlbnRfYnl0ZTsKLSAgYm9vbGVhbiBpbml0aWFsaXplZDsKLX0gb2FzeXNfcGVyX3NlY3Rpb25fdHlwZTsKLQotI2RlZmluZSBOU0VDVElPTlMgMTAKLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX2FyX29ic3RhY2sgewotICBmaWxlX3B0ciBmaWxlX29mZnNldDsKLSAgYmZkICphYmZkOwotfSBvYXN5c19hcl9vYnN0YWNrX3R5cGU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX21vZHVsZV9pbmZvIHsKLSAgZmlsZV9wdHIgcG9zOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgYmZkICphYmZkOwotICBjaGFyICpuYW1lOwotfSBvYXN5c19tb2R1bGVfaW5mb190eXBlOwotCi10eXBlZGVmIHN0cnVjdCBfb2FzeXNfYXJfZGF0YSB7Ci0gIG9hc3lzX21vZHVsZV9pbmZvX3R5cGUgKm1vZHVsZTsKLSAgdW5zaWduZWQgaW50IG1vZHVsZV9jb3VudDsKLSAgdW5zaWduZWQgaW50IG1vZHVsZV9pbmRleDsKLX0gb2FzeXNfYXJfZGF0YV90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBfb2FzeXNfZGF0YSB7Ci0gIGNoYXIgKnN0cmluZ3M7Ci0gIGFzeW1ib2wgKnN5bWJvbHM7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfc3RyaW5nX2xlbmd0aDsKLSAgYXNlY3Rpb24gKnNlY3Rpb25zW09BU1lTX01BWF9TRUNfQ09VTlRdOwotICBmaWxlX3B0ciBmaXJzdF9kYXRhX3JlY29yZDsKLX0gb2FzeXNfZGF0YV90eXBlOwotCi0jZGVmaW5lIE9BU1lTX0RBVEEoYWJmZCkJKChhYmZkKS0+dGRhdGEub2FzeXNfb2JqX2RhdGEpCi0jZGVmaW5lIE9BU1lTX0FSX0RBVEEoYWJmZCkJKChhYmZkKS0+dGRhdGEub2FzeXNfYXJfZGF0YSkKLQpkaWZmIC0tZ2l0IGEvYmZkL2xpbmtlci5jIGIvYmZkL2xpbmtlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDc1MTRjLi4wMDAwMDAwCi0tLSBhL2JmZC9saW5rZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MDQgKzAsMCBAQAotLyogbGlua2VyLmMgLS0gQkZEIGxpbmtlciByb3V0aW5lcwotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gYW5kIElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0KLS8qCi1TRUNUSU9OCi0JTGlua2VyIEZ1bmN0aW9ucwotCi1AY2luZGV4IExpbmtlcgotCVRoZSBsaW5rZXIgdXNlcyB0aHJlZSBzcGVjaWFsIGVudHJ5IHBvaW50cyBpbiB0aGUgQkZEIHRhcmdldAotCXZlY3Rvci4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gd3JpdGUgc3BlY2lhbCByb3V0aW5lcyBmb3IKLQl0aGVzZSBlbnRyeSBwb2ludHMgd2hlbiBjcmVhdGluZyBhIG5ldyBCRkQgYmFjayBlbmQsIHNpbmNlCi0JZ2VuZXJpYyB2ZXJzaW9ucyBhcmUgcHJvdmlkZWQuICBIb3dldmVyLCB3cml0aW5nIHRoZW0gY2FuCi0Jc3BlZWQgdXAgbGlua2luZyBhbmQgbWFrZSBpdCB1c2Ugc2lnbmlmaWNhbnRseSBsZXNzIHJ1bnRpbWUKLQltZW1vcnkuCi0KLQlUaGUgZmlyc3Qgcm91dGluZSBjcmVhdGVzIGEgaGFzaCB0YWJsZSB1c2VkIGJ5IHRoZSBvdGhlcgotCXJvdXRpbmVzLiAgVGhlIHNlY29uZCByb3V0aW5lIGFkZHMgdGhlIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLQlmaWxlIHRvIHRoZSBoYXNoIHRhYmxlLiAgVGhlIHRoaXJkIHJvdXRpbmUgdGFrZXMgYWxsIHRoZQotCW9iamVjdCBmaWxlcyBhbmQgbGlua3MgdGhlbSB0b2dldGhlciB0byBjcmVhdGUgdGhlIG91dHB1dAotCWZpbGUuICBUaGVzZSByb3V0aW5lcyBhcmUgZGVzaWduZWQgc28gdGhhdCB0aGUgbGlua2VyIHByb3BlcgotCWRvZXMgbm90IG5lZWQgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgc3ltYm9scyBpbiB0aGUgb2JqZWN0Ci0JZmlsZXMgdGhhdCBpdCBpcyBsaW5raW5nLiAgVGhlIGxpbmtlciBtZXJlbHkgYXJyYW5nZXMgdGhlCi0Jc2VjdGlvbnMgYXMgZGlyZWN0ZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQgYW5kIGxldHMgQkZEIGhhbmRsZQotCXRoZSBkZXRhaWxzIG9mIHN5bWJvbHMgYW5kIHJlbG9jcy4KLQotCVRoZSBzZWNvbmQgcm91dGluZSBhbmQgdGhpcmQgcm91dGluZXMgYXJlIHBhc3NlZCBhIHBvaW50ZXIgdG8KLQlhIDw8c3RydWN0IGJmZF9saW5rX2luZm8+PiBzdHJ1Y3R1cmUgKGRlZmluZWQgaW4KLQk8PGJmZGxpbmsuaD4+KSB3aGljaCBob2xkcyBpbmZvcm1hdGlvbiByZWxldmFudCB0byB0aGUgbGluaywKLQlpbmNsdWRpbmcgdGhlIGxpbmtlciBoYXNoIHRhYmxlICh3aGljaCB3YXMgY3JlYXRlZCBieSB0aGUKLQlmaXJzdCByb3V0aW5lKSBhbmQgYSBzZXQgb2YgY2FsbGJhY2sgZnVuY3Rpb25zIHRvIHRoZSBsaW5rZXIKLQlwcm9wZXIuCi0KLQlUaGUgZ2VuZXJpYyBsaW5rZXIgcm91dGluZXMgYXJlIGluIDw8bGlua2VyLmM+PiwgYW5kIHVzZSB0aGUKLQloZWFkZXIgZmlsZSA8PGdlbmxpbmsuaD4+LiAgQXMgb2YgdGhpcyB3cml0aW5nLCB0aGUgb25seSBiYWNrCi0JZW5kcyB3aGljaCBoYXZlIGltcGxlbWVudGVkIHZlcnNpb25zIG9mIHRoZXNlIHJvdXRpbmVzIGFyZQotCWEub3V0IChpbiA8PGFvdXR4Lmg+PikgYW5kIEVDT0ZGIChpbiA8PGVjb2ZmLmM+PikuICBUaGUgYS5vdXQKLQlyb3V0aW5lcyBhcmUgdXNlZCBhcyBleGFtcGxlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbi4KLQotQG1lbnUJCi1AKiBDcmVhdGluZyBhIExpbmtlciBIYXNoIFRhYmxlOjoKLUAqIEFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlOjoKLUAqIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbms6OgotQGVuZCBtZW51Ci0KLUlOT0RFCi1DcmVhdGluZyBhIExpbmtlciBIYXNoIFRhYmxlLCBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZSwgTGlua2VyIEZ1bmN0aW9ucywgTGlua2VyIEZ1bmN0aW9ucwotU1VCU0VDVElPTgotCUNyZWF0aW5nIGEgbGlua2VyIGhhc2ggdGFibGUKLQotQGNpbmRleCBfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgaW4gdGFyZ2V0IHZlY3RvcgotQGNpbmRleCB0YXJnZXQgdmVjdG9yIChfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpCi0JVGhlIGxpbmtlciByb3V0aW5lcyBtdXN0IGNyZWF0ZSBhIGhhc2ggdGFibGUsIHdoaWNoIG11c3QgYmUKLQlkZXJpdmVkIGZyb20gPDxzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZT4+IGRlc2NyaWJlZCBpbgotCTw8YmZkbGluay5jPj4uICBAeHJlZntIYXNoIFRhYmxlc30gZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0bwotCWNyZWF0ZSBhIGRlcml2ZWQgaGFzaCB0YWJsZS4gIFRoaXMgZW50cnkgcG9pbnQgaXMgY2FsbGVkIHVzaW5nCi0JdGhlIHRhcmdldCB2ZWN0b3Igb2YgdGhlIGxpbmtlciBvdXRwdXQgZmlsZS4KLQotCVRoZSA8PF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZT4+IGVudHJ5IHBvaW50IG11c3QgYWxsb2NhdGUKLQlhbmQgaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZGVzaXJlZCBoYXNoIHRhYmxlLiAgSWYgdGhlCi0JYmFjayBlbmQgZG9lcyBub3QgcmVxdWlyZSBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBiZQotCXN0b3JlZCB3aXRoIHRoZSBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlLCB0aGUgZW50cnkgcG9pbnQgbWF5Ci0Jc2ltcGx5IGNyZWF0ZSBhIDw8c3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGU+Pi4gIE1vc3QgbGlrZWx5LAotCWhvd2V2ZXIsIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3aWxsIGJlIG5lZWRlZC4KLQotCUZvciBleGFtcGxlLCB3aXRoIGVhY2ggZW50cnkgaW4gdGhlIGhhc2ggdGFibGUgdGhlIGEub3V0Ci0JbGlua2VyIGtlZXBzIHRoZSBpbmRleCB0aGUgc3ltYm9sIGhhcyBpbiB0aGUgZmluYWwgb3V0cHV0IGZpbGUKLQkodGhpcyBpbmRleCBudW1iZXIgaXMgdXNlZCBzbyB0aGF0IHdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUKLQlsaW5rIHRoZSBzeW1ib2wgaW5kZXggdXNlZCBpbiB0aGUgb3V0cHV0IGZpbGUgY2FuIGJlIHF1aWNrbHkKLQlmaWxsZWQgaW4gd2hlbiBjb3B5aW5nIG92ZXIgYSByZWxvYykuICBUaGUgYS5vdXQgbGlua2VyIGNvZGUKLQlkZWZpbmVzIHRoZSByZXF1aXJlZCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMgZm9yIGEgaGFzaCB0YWJsZQotCWRlcml2ZWQgZnJvbSA8PHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlPj4uICBUaGUgYS5vdXQgbGlua2VyCi0JaGFzaCB0YWJsZSBpcyBjcmVhdGVkIGJ5IHRoZSBmdW5jdGlvbgotCTw8TkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpPj47IGl0IHNpbXBseSBhbGxvY2F0ZXMKLQlzcGFjZSBmb3IgdGhlIGhhc2ggdGFibGUsIGluaXRpYWxpemVzIGl0LCBhbmQgcmV0dXJucyBhCi0JcG9pbnRlciB0byBpdC4KLQotCVdoZW4gd3JpdGluZyB0aGUgbGlua2VyIHJvdXRpbmVzIGZvciBhIG5ldyBiYWNrIGVuZCwgeW91IHdpbGwKLQlnZW5lcmFsbHkgbm90IGtub3cgZXhhY3RseSB3aGljaCBmaWVsZHMgd2lsbCBiZSByZXF1aXJlZCB1bnRpbAotCXlvdSBoYXZlIGZpbmlzaGVkLiAgWW91IHNob3VsZCBzaW1wbHkgY3JlYXRlIGEgbmV3IGhhc2ggdGFibGUKLQl3aGljaCBkZWZpbmVzIG5vIGFkZGl0aW9uYWwgZmllbGRzLCBhbmQgdGhlbiBzaW1wbHkgYWRkIGZpZWxkcwotCWFzIHRoZXkgYmVjb21lIG5lY2Vzc2FyeS4KLQotSU5PREUKLUFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlLCBQZXJmb3JtaW5nIHRoZSBGaW5hbCBMaW5rLCBDcmVhdGluZyBhIExpbmtlciBIYXNoIFRhYmxlLCBMaW5rZXIgRnVuY3Rpb25zCi1TVUJTRUNUSU9OCi0JQWRkaW5nIHN5bWJvbHMgdG8gdGhlIGhhc2ggdGFibGUKLQotQGNpbmRleCBfYmZkX2xpbmtfYWRkX3N5bWJvbHMgaW4gdGFyZ2V0IHZlY3RvcgotQGNpbmRleCB0YXJnZXQgdmVjdG9yIChfYmZkX2xpbmtfYWRkX3N5bWJvbHMpCi0JVGhlIGxpbmtlciBwcm9wZXIgd2lsbCBjYWxsIHRoZSA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+Ci0JZW50cnkgcG9pbnQgZm9yIGVhY2ggb2JqZWN0IGZpbGUgb3IgYXJjaGl2ZSB3aGljaCBpcyB0byBiZQotCWxpbmtlZCAodHlwaWNhbGx5IHRoZXNlIGFyZSB0aGUgZmlsZXMgbmFtZWQgb24gdGhlIGNvbW1hbmQKLQlsaW5lLCBidXQgc29tZSBtYXkgYWxzbyBjb21lIGZyb20gdGhlIGxpbmtlciBzY3JpcHQpLiAgVGhlCi0JZW50cnkgcG9pbnQgaXMgcmVzcG9uc2libGUgZm9yIGV4YW1pbmluZyB0aGUgZmlsZS4gIEZvciBhbgotCW9iamVjdCBmaWxlLCBCRkQgbXVzdCBhZGQgYW55IHJlbGV2YW50IHN5bWJvbCBpbmZvcm1hdGlvbiB0bwotCXRoZSBoYXNoIHRhYmxlLiAgRm9yIGFuIGFyY2hpdmUsIEJGRCBtdXN0IGRldGVybWluZSB3aGljaAotCWVsZW1lbnRzIG9mIHRoZSBhcmNoaXZlIHNob3VsZCBiZSB1c2VkIGFuZCBhZGRpbmcgdGhlbSB0byB0aGUKLQlsaW5rLgotCi0JVGhlIGEub3V0IHZlcnNpb24gb2YgdGhpcyBlbnRyeSBwb2ludCBpcwotCTw8TkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpPj4uCi0KLUBtZW51Ci1AKiBEaWZmZXJpbmcgZmlsZSBmb3JtYXRzOjoKLUAqIEFkZGluZyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGU6OgotQCogQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBhcmNoaXZlOjoKLUBlbmQgbWVudQotCi1JTk9ERQotRGlmZmVyaW5nIGZpbGUgZm9ybWF0cywgQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSwgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUsIEFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlCi1TVUJTVUJTRUNUSU9OCi0JRGlmZmVyaW5nIGZpbGUgZm9ybWF0cwotCi0JTm9ybWFsbHkgYWxsIHRoZSBmaWxlcyBpbnZvbHZlZCBpbiBhIGxpbmsgd2lsbCBiZSBvZiB0aGUgc2FtZQotCWZvcm1hdCwgYnV0IGl0IGlzIGFsc28gcG9zc2libGUgdG8gbGluayB0b2dldGhlciBkaWZmZXJlbnQKLQlmb3JtYXQgb2JqZWN0IGZpbGVzLCBhbmQgdGhlIGJhY2sgZW5kIG11c3Qgc3VwcG9ydCB0aGF0LiAgVGhlCi0JPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiBlbnRyeSBwb2ludCBpcyBjYWxsZWQgdmlhIHRoZSB0YXJnZXQKLQl2ZWN0b3Igb2YgdGhlIGZpbGUgdG8gYmUgYWRkZWQuICBUaGlzIGhhcyBhbiBpbXBvcnRhbnQKLQljb25zZXF1ZW5jZTogdGhlIGZ1bmN0aW9uIG1heSBub3QgYXNzdW1lIHRoYXQgdGhlIGhhc2ggdGFibGUKLQlpcyB0aGUgdHlwZSBjcmVhdGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nCi0JPDxfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGU+PiB2ZWN0b3IuICBBbGwgdGhlCi0JPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiBmdW5jdGlvbiBjYW4gYXNzdW1lIGFib3V0IHRoZSBoYXNoCi0JdGFibGUgaXMgdGhhdCBpdCBpcyBkZXJpdmVkIGZyb20gPDxzdHJ1Y3QKLQliZmRfbGlua19oYXNoX3RhYmxlPj4uCi0KLQlTb21ldGltZXMgdGhlIDw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gZnVuY3Rpb24gbXVzdCBzdG9yZQotCXNvbWUgaW5mb3JtYXRpb24gaW4gdGhlIGhhc2ggdGFibGUgZW50cnkgdG8gYmUgdXNlZCBieSB0aGUKLQk8PF9iZmRfZmluYWxfbGluaz4+IGZ1bmN0aW9uLiAgSW4gc3VjaCBhIGNhc2UgdGhlIDw8Y3JlYXRvcj4+Ci0JZmllbGQgb2YgdGhlIGhhc2ggdGFibGUgbXVzdCBiZSBjaGVja2VkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQotCWhhc2ggdGFibGUgd2FzIGNyZWF0ZWQgYnkgYW4gb2JqZWN0IGZpbGUgb2YgdGhlIHNhbWUgZm9ybWF0LgotCi0JVGhlIDw8X2JmZF9maW5hbF9saW5rPj4gcm91dGluZSBtdXN0IGJlIHByZXBhcmVkIHRvIGhhbmRsZSBhCi0JaGFzaCBlbnRyeSB3aXRob3V0IGFueSBleHRyYSBpbmZvcm1hdGlvbiBhZGRlZCBieSB0aGUKLQk8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IGZ1bmN0aW9uLiAgQSBoYXNoIGVudHJ5IHdpdGhvdXQKLQlleHRyYSBpbmZvcm1hdGlvbiB3aWxsIGFsc28gb2NjdXIgd2hlbiB0aGUgbGlua2VyIHNjcmlwdAotCWRpcmVjdHMgdGhlIGxpbmtlciB0byBjcmVhdGUgYSBzeW1ib2wuICBOb3RlIHRoYXQsIHJlZ2FyZGxlc3MKLQlvZiBob3cgYSBoYXNoIHRhYmxlIGVudHJ5IGlzIGFkZGVkLCBhbGwgdGhlIGZpZWxkcyB3aWxsIGJlCi0JaW5pdGlhbGl6ZWQgdG8gc29tZSBzb3J0IG9mIG51bGwgdmFsdWUgYnkgdGhlIGhhc2ggdGFibGUgZW50cnkKLQlpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KLQotCVNlZSA8PGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscz4+IGZvciBhbiBleGFtcGxlIG9mIGhvdyB0bwotCWNoZWNrIHRoZSA8PGNyZWF0b3I+PiBmaWVsZCBiZWZvcmUgc2F2aW5nIGluZm9ybWF0aW9uIChpbiB0aGlzCi0JY2FzZSwgdGhlIEVDT0ZGIGV4dGVybmFsIHN5bWJvbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24pIGluIGEKLQloYXNoIHRhYmxlIGVudHJ5LgotCi1JTk9ERQotQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSwgQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBhcmNoaXZlLCBEaWZmZXJpbmcgZmlsZSBmb3JtYXRzLCBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZQotU1VCU1VCU0VDVElPTgotCUFkZGluZyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUKLQotCVdoZW4gdGhlIDw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gcm91dGluZSBpcyBwYXNzZWQgYW4gb2JqZWN0Ci0JZmlsZSwgaXQgbXVzdCBhZGQgYWxsIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2xzIGluIHRoYXQKLQlvYmplY3QgZmlsZSB0byB0aGUgaGFzaCB0YWJsZS4gIFRoZSBhY3R1YWwgd29yayBvZiBhZGRpbmcgdGhlCi0Jc3ltYm9sIHRvIHRoZSBoYXNoIHRhYmxlIGlzIG5vcm1hbGx5IGhhbmRsZWQgYnkgdGhlIGZ1bmN0aW9uCi0JPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbD4+LiAgVGhlCi0JPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciByZWFkaW5nCi0JYWxsIHRoZSBzeW1ib2xzIGZyb20gdGhlIG9iamVjdCBmaWxlIGFuZCBwYXNzaW5nIHRoZSBjb3JyZWN0Ci0JaW5mb3JtYXRpb24gdG8gPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbD4+LgotCi0JVGhlIDw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gcm91dGluZSBzaG91bGQgbm90IHVzZQotCTw8YmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWI+PiB0byByZWFkIHRoZSBzeW1ib2xzLiAgVGhlIHBvaW50IG9mCi0JcHJvdmlkaW5nIHRoaXMgcm91dGluZSBpcyB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgY29udmVydGluZwotCXRoZSBzeW1ib2xzIGludG8gZ2VuZXJpYyA8PGFzeW1ib2w+PiBzdHJ1Y3R1cmVzLgotCi1AZmluZGV4IF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbD4+IGhhbmRsZXMgdGhlIGRldGFpbHMgb2YKLQljb21iaW5pbmcgY29tbW9uIHN5bWJvbHMsIHdhcm5pbmcgYWJvdXQgbXVsdGlwbGUgZGVmaW5pdGlvbnMsCi0JYW5kIHNvIGZvcnRoLiAgSXQgdGFrZXMgYXJndW1lbnRzIHdoaWNoIGRlc2NyaWJlIHRoZSBzeW1ib2wgdG8KLQlhZGQsIG5vdGFibHkgc3ltYm9sIGZsYWdzLCBhIHNlY3Rpb24sIGFuZCBhbiBvZmZzZXQuICBUaGUKLQlzeW1ib2wgZmxhZ3MgaW5jbHVkZSBzdWNoIHRoaW5ncyBhcyA8PEJTRl9XRUFLPj4gb3IKLQk8PEJTRl9JTkRJUkVDVD4+LiAgVGhlIHNlY3Rpb24gaXMgYSBzZWN0aW9uIGluIHRoZSBvYmplY3QKLQlmaWxlLCBvciBzb21ldGhpbmcgbGlrZSA8PGJmZF91bmRfc2VjdGlvbl9wdHI+PiBmb3IgYW4gdW5kZWZpbmVkCi0Jc3ltYm9sIG9yIDw8YmZkX2NvbV9zZWN0aW9uX3B0cj4+IGZvciBhIGNvbW1vbiBzeW1ib2wuCi0KLQlJZiB0aGUgPDxfYmZkX2ZpbmFsX2xpbms+PiByb3V0aW5lIGlzIGFsc28gZ29pbmcgdG8gbmVlZCB0bwotCXJlYWQgdGhlIHN5bWJvbCBpbmZvcm1hdGlvbiwgdGhlIDw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4KLQlyb3V0aW5lIHNob3VsZCBzYXZlIGl0IHNvbWV3aGVyZSBhdHRhY2hlZCB0byB0aGUgb2JqZWN0IGZpbGUKLQlCRkQuICBIb3dldmVyLCB0aGUgaW5mb3JtYXRpb24gc2hvdWxkIG9ubHkgYmUgc2F2ZWQgaWYgdGhlCi0JPDxrZWVwX21lbW9yeT4+IGZpZWxkIG9mIHRoZSA8PGluZm8+PiBhcmd1bWVudCBpcyB0cnVlLCBzbwotCXRoYXQgdGhlIDw8LW5vLWtlZXAtbWVtb3J5Pj4gbGlua2VyIHN3aXRjaCBpcyBlZmZlY3RpdmUuCi0KLQlUaGUgYS5vdXQgZnVuY3Rpb24gd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgaXMKLQk8PGFvdXRfbGlua19hZGRfb2JqZWN0X3N5bWJvbHM+PiwgYW5kIG1vc3Qgb2YgdGhlIGludGVyZXN0aW5nCi0Jd29yayBpcyBpbiA8PGFvdXRfbGlua19hZGRfc3ltYm9scz4+LiAgVGhlIGxhdHRlciBzYXZlcwotCXBvaW50ZXJzIHRvIHRoZSBoYXNoIHRhYmxlcyBlbnRyaWVzIGNyZWF0ZWQgYnkKLQk8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sPj4gaW5kZXhlZCBieSBzeW1ib2wgbnVtYmVyLAotCXNvIHRoYXQgdGhlIDw8X2JmZF9maW5hbF9saW5rPj4gcm91dGluZSBkb2VzIG5vdCBoYXZlIHRvIGNhbGwKLQl0aGUgaGFzaCB0YWJsZSBsb29rdXAgcm91dGluZSB0byBsb2NhdGUgdGhlIGVudHJ5LgotCi1JTk9ERQotQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBhcmNoaXZlLCAsIEFkZGluZyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUsIEFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlCi1TVUJTVUJTRUNUSU9OCi0JQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBhcmNoaXZlCi0KLQlXaGVuIHRoZSA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IHJvdXRpbmUgaXMgcGFzc2VkIGFuCi0JYXJjaGl2ZSwgaXQgbXVzdCBsb29rIHRocm91Z2ggdGhlIHN5bWJvbHMgZGVmaW5lZCBieSB0aGUKLQlhcmNoaXZlIGFuZCBkZWNpZGUgd2hpY2ggZWxlbWVudHMgb2YgdGhlIGFyY2hpdmUgc2hvdWxkIGJlCi0JaW5jbHVkZWQgaW4gdGhlIGxpbmsuICBGb3IgZWFjaCBzdWNoIGVsZW1lbnQgaXQgbXVzdCBjYWxsIHRoZQotCTw8YWRkX2FyY2hpdmVfZWxlbWVudD4+IGxpbmtlciBjYWxsYmFjaywgYW5kIGl0IG11c3QgYWRkIHRoZQotCXN5bWJvbHMgZnJvbSB0aGUgb2JqZWN0IGZpbGUgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLgotCi1AZmluZGV4IF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLQlJbiBtb3N0IGNhc2VzIHRoZSB3b3JrIG9mIGxvb2tpbmcgdGhyb3VnaCB0aGUgc3ltYm9scyBpbiB0aGUKLQlhcmNoaXZlIHNob3VsZCBiZSBkb25lIGJ5IHRoZQotCTw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scz4+IGZ1bmN0aW9uLiAgVGhpcwotCWZ1bmN0aW9uIGJ1aWxkcyBhIGhhc2ggdGFibGUgZnJvbSB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUgYW5kCi0JbG9va3MgdGhyb3VnaCB0aGUgbGlzdCBvZiB1bmRlZmluZWQgc3ltYm9scyB0byBzZWUgd2hpY2gKLQllbGVtZW50cyBzaG91bGQgYmUgaW5jbHVkZWQuCi0JPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzPj4gaXMgcGFzc2VkIGEgZnVuY3Rpb24KLQl0byBjYWxsIHRvIG1ha2UgdGhlIGZpbmFsIGRlY2lzaW9uIGFib3V0IGFkZGluZyBhbiBhcmNoaXZlCi0JZWxlbWVudCB0byB0aGUgbGluayBhbmQgdG8gZG8gdGhlIGFjdHVhbCB3b3JrIG9mIGFkZGluZyB0aGUKLQlzeW1ib2xzIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4KLQotCVRoZSBmdW5jdGlvbiBwYXNzZWQgdG8KLQk8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHM+PiBtdXN0IHJlYWQgdGhlCi0Jc3ltYm9scyBvZiB0aGUgYXJjaGl2ZSBlbGVtZW50IGFuZCBkZWNpZGUgd2hldGhlciB0aGUgYXJjaGl2ZQotCWVsZW1lbnQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgSWYgdGhlIGVsZW1lbnQgaXMgdG8KLQliZSBpbmNsdWRlZCwgdGhlIDw8YWRkX2FyY2hpdmVfZWxlbWVudD4+IGxpbmtlciBjYWxsYmFjawotCXJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgZWxlbWVudCBhcyBhbiBhcmd1bWVudCwgYW5kCi0JdGhlIGVsZW1lbnRzIHN5bWJvbHMgbXVzdCBiZSBhZGRlZCB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUKLQlqdXN0IGFzIHRob3VnaCB0aGUgZWxlbWVudCBoYWQgaXRzZWxmIGJlZW4gcGFzc2VkIHRvIHRoZQotCTw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gZnVuY3Rpb24uCi0KLQlXaGVuIHRoZSBhLm91dCA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IGZ1bmN0aW9uIHJlY2VpdmVzIGFuCi0JYXJjaGl2ZSwgaXQgY2FsbHMgPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzPj4KLQlwYXNzaW5nIDw8YW91dF9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudD4+IGFzIHRoZSBmdW5jdGlvbgotCWFyZ3VtZW50LiA8PGFvdXRfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQ+PiBjYWxscwotCTw8YW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHM+Pi4gIElmIHRoZSBsYXR0ZXIgZGVjaWRlcyB0byBhZGQKLQl0aGUgZWxlbWVudCAoYW4gZWxlbWVudCBpcyBvbmx5IGFkZGVkIGlmIGl0IHByb3ZpZGVzIGEgcmVhbCwKLQlub24tY29tbW9uLCBkZWZpbml0aW9uIGZvciBhIHByZXZpb3VzbHkgdW5kZWZpbmVkIG9yIGNvbW1vbgotCXN5bWJvbCkgaXQgY2FsbHMgdGhlIDw8YWRkX2FyY2hpdmVfZWxlbWVudD4+IGNhbGxiYWNrIGFuZCB0aGVuCi0JPDxhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Pj4gY2FsbHMKLQk8PGFvdXRfbGlua19hZGRfc3ltYm9scz4+IHRvIGFjdHVhbGx5IGFkZCB0aGUgc3ltYm9scyB0byB0aGUKLQlsaW5rZXIgaGFzaCB0YWJsZS4KLQotCVRoZSBFQ09GRiBiYWNrIGVuZCBpcyB1bnVzdWFsIGluIHRoYXQgaXQgZG9lcyBub3Qgbm9ybWFsbHkKLQljYWxsIDw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scz4+LCBiZWNhdXNlIEVDT0ZGCi0JYXJjaGl2ZXMgYWxyZWFkeSBjb250YWluIGEgaGFzaCB0YWJsZSBvZiBzeW1ib2xzLiAgVGhlIEVDT0ZGCi0JYmFjayBlbmQgc2VhcmNoZXMgdGhlIGFyY2hpdmUgaXRzZWxmIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZgotCWNyZWF0aW5nIGEgbmV3IGhhc2ggdGFibGUuCi0KLUlOT0RFCi1QZXJmb3JtaW5nIHRoZSBGaW5hbCBMaW5rLCAsIEFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlLCBMaW5rZXIgRnVuY3Rpb25zCi1TVUJTRUNUSU9OCi0JUGVyZm9ybWluZyB0aGUgZmluYWwgbGluawotCi1AY2luZGV4IF9iZmRfbGlua19maW5hbF9saW5rIGluIHRhcmdldCB2ZWN0b3IKLUBjaW5kZXggdGFyZ2V0IHZlY3RvciAoX2JmZF9maW5hbF9saW5rKQotCVdoZW4gYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gcHJvY2Vzc2VkLCB0aGUgbGlua2VyIGNhbGxzCi0JdGhlIDw8X2JmZF9maW5hbF9saW5rPj4gZW50cnkgcG9pbnQgb2YgdGhlIG91dHB1dCBCRkQuICBUaGlzCi0Jcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3IgcHJvZHVjaW5nIHRoZSBmaW5hbCBvdXRwdXQgZmlsZSwKLQl3aGljaCBoYXMgc2V2ZXJhbCBhc3BlY3RzLiAgSXQgbXVzdCByZWxvY2F0ZSB0aGUgY29udGVudHMgb2YKLQl0aGUgaW5wdXQgc2VjdGlvbnMgYW5kIGNvcHkgdGhlIGRhdGEgaW50byB0aGUgb3V0cHV0IHNlY3Rpb25zLgotCUl0IG11c3QgYnVpbGQgYW4gb3V0cHV0IHN5bWJvbCB0YWJsZSBpbmNsdWRpbmcgYW55IGxvY2FsCi0Jc3ltYm9scyBmcm9tIHRoZSBpbnB1dCBmaWxlcyBhbmQgdGhlIGdsb2JhbCBzeW1ib2xzIGZyb20gdGhlCi0JaGFzaCB0YWJsZS4gIFdoZW4gcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGl0IG11c3QKLQltb2RpZnkgdGhlIGlucHV0IHJlbG9jcyBhbmQgd3JpdGUgdGhlbSBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KLQlUaGVyZSBtYXkgYWxzbyBiZSBvYmplY3QgZm9ybWF0IGRlcGVuZGVudCB3b3JrIHRvIGJlIGRvbmUuCi0KLQlUaGUgbGlua2VyIHdpbGwgYWxzbyBjYWxsIHRoZSA8PHdyaXRlX29iamVjdF9jb250ZW50cz4+IGVudHJ5Ci0JcG9pbnQgd2hlbiB0aGUgQkZEIGlzIGNsb3NlZC4gIFRoZSB0d28gZW50cnkgcG9pbnRzIG11c3Qgd29yawotCXRvZ2V0aGVyIGluIG9yZGVyIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3Qgb3V0cHV0IGZpbGUuCi0KLQlUaGUgZGV0YWlscyBvZiBob3cgdGhpcyB3b3JrcyBhcmUgaW5ldml0YWJseSBkZXBlbmRlbnQgdXBvbgotCXRoZSBzcGVjaWZpYyBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGUgYS5vdXQKLQk8PF9iZmRfZmluYWxfbGluaz4+IHJvdXRpbmUgaXMgPDxOQU1FKGFvdXQsZmluYWxfbGluayk+Pi4KLQotQG1lbnUKLUAqIEluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBsaW5rZXI6OgotQCogUmVsb2NhdGluZyB0aGUgc2VjdGlvbiBjb250ZW50czo6Ci1AKiBXcml0aW5nIHRoZSBzeW1ib2wgdGFibGU6OgotQGVuZCBtZW51Ci0KLUlOT0RFCi1JbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgbGlua2VyLCBSZWxvY2F0aW5nIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBQZXJmb3JtaW5nIHRoZSBGaW5hbCBMaW5rLCBQZXJmb3JtaW5nIHRoZSBGaW5hbCBMaW5rCi1TVUJTVUJTRUNUSU9OCi0JSW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIGxpbmtlcgotCi0JQmVmb3JlIHRoZSBsaW5rZXIgY2FsbHMgdGhlIDw8X2JmZF9maW5hbF9saW5rPj4gZW50cnkgcG9pbnQsCi0JaXQgc2V0cyB1cCBzb21lIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIGZ1bmN0aW9uIHRvIHVzZS4KLQotCVRoZSA8PGlucHV0X2JmZHM+PiBmaWVsZCBvZiB0aGUgPDxiZmRfbGlua19pbmZvPj4gc3RydWN0dXJlCi0Jd2lsbCBwb2ludCB0byBhIGxpc3Qgb2YgYWxsIHRoZSBpbnB1dCBmaWxlcyBpbmNsdWRlZCBpbiB0aGUKLQlsaW5rLiAgVGhlc2UgZmlsZXMgYXJlIGxpbmtlZCB0aHJvdWdoIHRoZSA8PGxpbmtfbmV4dD4+IGZpZWxkCi0Jb2YgdGhlIDw8YmZkPj4gc3RydWN0dXJlLgotCi0JRWFjaCBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZSB3aWxsIGhhdmUgYSBsaXN0IG9mCi0JPDxsaW5rX29yZGVyPj4gc3RydWN0dXJlcyBhdHRhY2hlZCB0byB0aGUgPDxsaW5rX29yZGVyX2hlYWQ+PgotCWZpZWxkICh0aGUgPDxsaW5rX29yZGVyPj4gc3RydWN0dXJlIGlzIGRlZmluZWQgaW4KLQk8PGJmZGxpbmsuaD4+KS4gIFRoZXNlIHN0cnVjdHVyZXMgZGVzY3JpYmUgaG93IHRvIGNyZWF0ZSB0aGUKLQljb250ZW50cyBvZiB0aGUgb3V0cHV0IHNlY3Rpb24gaW4gdGVybXMgb2YgdGhlIGNvbnRlbnRzIG9mCi0JdmFyaW91cyBpbnB1dCBzZWN0aW9ucywgZmlsbCBjb25zdGFudHMsIGFuZCwgZXZlbnR1YWxseSwgb3RoZXIKLQl0eXBlcyBvZiBpbmZvcm1hdGlvbi4gIFRoZXkgYWxzbyBkZXNjcmliZSByZWxvY3MgdGhhdCBtdXN0IGJlCi0JY3JlYXRlZCBieSB0aGUgQkZEIGJhY2tlbmQsIGJ1dCBkbyBub3QgY29ycmVzcG9uZCB0byBhbnkgaW5wdXQKLQlmaWxlOyB0aGlzIGlzIHVzZWQgdG8gc3VwcG9ydCAtVXIsIHdoaWNoIGJ1aWxkcyBjb25zdHJ1Y3RvcnMKLQl3aGlsZSBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIG9iamVjdCBmaWxlLgotCi1JTk9ERQotUmVsb2NhdGluZyB0aGUgc2VjdGlvbiBjb250ZW50cywgV3JpdGluZyB0aGUgc3ltYm9sIHRhYmxlLCBJbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgbGlua2VyLCBQZXJmb3JtaW5nIHRoZSBGaW5hbCBMaW5rCi1TVUJTVUJTRUNUSU9OCi0JUmVsb2NhdGluZyB0aGUgc2VjdGlvbiBjb250ZW50cwotCi0JVGhlIDw8X2JmZF9maW5hbF9saW5rPj4gZnVuY3Rpb24gc2hvdWxkIGxvb2sgdGhyb3VnaCB0aGUKLQk8PGxpbmtfb3JkZXI+PiBzdHJ1Y3R1cmVzIGF0dGFjaGVkIHRvIGVhY2ggc2VjdGlvbiBvZiB0aGUKLQlvdXRwdXQgZmlsZS4gIEVhY2ggPDxsaW5rX29yZGVyPj4gc3RydWN0dXJlIHNob3VsZCBlaXRoZXIgYmUKLQloYW5kbGVkIHNwZWNpYWxseSwgb3IgaXQgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24KLQk8PF9iZmRfZGVmYXVsdF9saW5rX29yZGVyPj4gd2hpY2ggd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcKLQkoPDxfYmZkX2RlZmF1bHRfbGlua19vcmRlcj4+IGlzIGRlZmluZWQgaW4gPDxsaW5rZXIuYz4+KS4KLQotCUZvciBlZmZpY2llbmN5LCBhIDw8bGlua19vcmRlcj4+IG9mIHR5cGUKLQk8PGJmZF9pbmRpcmVjdF9saW5rX29yZGVyPj4gd2hvc2UgYXNzb2NpYXRlZCBzZWN0aW9uIGJlbG9uZ3MKLQl0byBhIEJGRCBvZiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIG91dHB1dCBCRkQgbXVzdCBiZSBoYW5kbGVkCi0Jc3BlY2lhbGx5LiAgVGhpcyB0eXBlIG9mIDw8bGlua19vcmRlcj4+IGRlc2NyaWJlcyBwYXJ0IG9mIGFuCi0Jb3V0cHV0IHNlY3Rpb24gaW4gdGVybXMgb2YgYSBzZWN0aW9uIGJlbG9uZ2luZyB0byBvbmUgb2YgdGhlCi0JaW5wdXQgZmlsZXMuICBUaGUgPDxfYmZkX2ZpbmFsX2xpbms+PiBmdW5jdGlvbiBzaG91bGQgcmVhZCB0aGUKLQljb250ZW50cyBvZiB0aGUgc2VjdGlvbiBhbmQgYW55IGFzc29jaWF0ZWQgcmVsb2NzLCBhcHBseSB0aGUKLQlyZWxvY3MgdG8gdGhlIHNlY3Rpb24gY29udGVudHMsIGFuZCB3cml0ZSBvdXQgdGhlIG1vZGlmaWVkCi0Jc2VjdGlvbiBjb250ZW50cy4gIElmIHBlcmZvcm1pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgdGhlCi0JcmVsb2NzIHRoZW1zZWx2ZXMgbXVzdCBhbHNvIGJlIG1vZGlmaWVkIGFuZCB3cml0dGVuIG91dC4KLQotQGZpbmRleCBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzCi1AZmluZGV4IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZQotCVRoZSBmdW5jdGlvbnMgPDxfYmZkX3JlbG9jYXRlX2NvbnRlbnRzPj4gYW5kCi0JPDxfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGU+PiBwcm92aWRlIHNvbWUgZ2VuZXJhbCBzdXBwb3J0IGZvcgotCXBlcmZvcm1pbmcgdGhlIGFjdHVhbCByZWxvY2F0aW9ucywgbm90YWJseSBvdmVyZmxvdyBjaGVja2luZy4KLQlUaGVpciBhcmd1bWVudHMgaW5jbHVkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3ltYm9sIHRoZQotCXJlbG9jYXRpb24gaXMgYWdhaW5zdCBhbmQgYSA8PHJlbG9jX2hvd3RvX3R5cGU+PiBhcmd1bWVudAotCXdoaWNoIGRlc2NyaWJlcyB0aGUgcmVsb2NhdGlvbiB0byBwZXJmb3JtLiAgVGhlc2UgZnVuY3Rpb25zCi0JYXJlIGRlZmluZWQgaW4gPDxyZWxvYy5jPj4uCi0KLQlUaGUgYS5vdXQgZnVuY3Rpb24gd2hpY2ggaGFuZGxlcyByZWFkaW5nLCByZWxvY2F0aW5nLCBhbmQKLQl3cml0aW5nIHNlY3Rpb24gY29udGVudHMgaXMgPDxhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbj4+LiAgVGhlCi0JYWN0dWFsIHJlbG9jYXRpb24gaXMgZG9uZSBpbiA8PGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZD4+Ci0JYW5kIDw8YW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0Pj4uCi0KLUlOT0RFCi1Xcml0aW5nIHRoZSBzeW1ib2wgdGFibGUsICwgUmVsb2NhdGluZyB0aGUgc2VjdGlvbiBjb250ZW50cywgUGVyZm9ybWluZyB0aGUgRmluYWwgTGluawotU1VCU1VCU0VDVElPTgotCVdyaXRpbmcgdGhlIHN5bWJvbCB0YWJsZQotCi0JVGhlIDw8X2JmZF9maW5hbF9saW5rPj4gZnVuY3Rpb24gbXVzdCBnYXRoZXIgYWxsIHRoZSBzeW1ib2xzCi0JaW4gdGhlIGlucHV0IGZpbGVzIGFuZCB3cml0ZSB0aGVtIG91dC4gIEl0IG11c3QgYWxzbyB3cml0ZSBvdXQKLQlhbGwgdGhlIHN5bWJvbHMgaW4gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgVGhpcyBtdXN0IGJlCi0JY29udHJvbGxlZCBieSB0aGUgPDxzdHJpcD4+IGFuZCA8PGRpc2NhcmQ+PiBmaWVsZHMgb2YgdGhlCi0JPDxiZmRfbGlua19pbmZvPj4gc3RydWN0dXJlLgotCi0JVGhlIGxvY2FsIHN5bWJvbHMgb2YgdGhlIGlucHV0IGZpbGVzIHdpbGwgbm90IGhhdmUgYmVlbgotCWVudGVyZWQgaW50byB0aGUgbGlua2VyIGhhc2ggdGFibGUuICBUaGUgPDxfYmZkX2ZpbmFsX2xpbms+PgotCXJvdXRpbmUgbXVzdCBjb25zaWRlciBlYWNoIGlucHV0IGZpbGUgYW5kIGluY2x1ZGUgdGhlIHN5bWJvbHMKLQlpbiB0aGUgb3V0cHV0IGZpbGUuICBJdCBtYXkgYmUgY29udmVuaWVudCB0byBkbyB0aGlzIHdoZW4KLQlsb29raW5nIHRocm91Z2ggdGhlIDw8bGlua19vcmRlcj4+IHN0cnVjdHVyZXMsIG9yIGl0IG1heSBiZQotCWRvbmUgYnkgc3RlcHBpbmcgdGhyb3VnaCB0aGUgPDxpbnB1dF9iZmRzPj4gbGlzdC4KLQotCVRoZSA8PF9iZmRfZmluYWxfbGluaz4+IHJvdXRpbmUgbXVzdCBhbHNvIHRyYXZlcnNlIHRoZSBnbG9iYWwKLQloYXNoIHRhYmxlIHRvIGdhdGhlciBhbGwgdGhlIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2xzLiAgSXQKLQlpcyBwb3NzaWJsZSB0aGF0IG1vc3Qgb2YgdGhlIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2xzIG1heSBiZQotCXdyaXR0ZW4gb3V0IHdoZW4gY29uc2lkZXJpbmcgdGhlIHN5bWJvbHMgb2YgZWFjaCBpbnB1dCBmaWxlLAotCWJ1dCBpdCBpcyBzdGlsbCBuZWNlc3NhcnkgdG8gdHJhdmVyc2UgdGhlIGhhc2ggdGFibGUgc2luY2UgdGhlCi0JbGlua2VyIHNjcmlwdCBtYXkgaGF2ZSBkZWZpbmVkIHNvbWUgc3ltYm9scyB0aGF0IGFyZSBub3QgaW4KLQlhbnkgb2YgdGhlIGlucHV0IGZpbGVzLgotCi0JVGhlIDw8c3RyaXA+PiBmaWVsZCBvZiB0aGUgPDxiZmRfbGlua19pbmZvPj4gc3RydWN0dXJlCi0JY29udHJvbHMgd2hpY2ggc3ltYm9scyBhcmUgd3JpdHRlbiBvdXQuICBUaGUgcG9zc2libGUgdmFsdWVzCi0JYXJlIGxpc3RlZCBpbiA8PGJmZGxpbmsuaD4+LiAgSWYgdGhlIHZhbHVlIGlzIDw8c3RyaXBfc29tZT4+LAotCXRoZW4gdGhlIDw8a2VlcF9oYXNoPj4gZmllbGQgb2YgdGhlIDw8YmZkX2xpbmtfaW5mbz4+Ci0Jc3RydWN0dXJlIGlzIGEgaGFzaCB0YWJsZSBvZiBzeW1ib2xzIHRvIGtlZXA7IGVhY2ggc3ltYm9sCi0Jc2hvdWxkIGJlIGxvb2tlZCB1cCBpbiB0aGlzIGhhc2ggdGFibGUsIGFuZCBvbmx5IHN5bWJvbHMgd2hpY2gKLQlhcmUgcHJlc2VudCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLgotCi0JSWYgdGhlIDw8c3RyaXA+PiBmaWVsZCBvZiB0aGUgPDxiZmRfbGlua19pbmZvPj4gc3RydWN0dXJlCi0JcGVybWl0cyBsb2NhbCBzeW1ib2xzIHRvIGJlIHdyaXR0ZW4gb3V0LCB0aGUgPDxkaXNjYXJkPj4gZmllbGQKLQlpcyB1c2VkIHRvIGZ1cnRoZXIgY29udHJvbHMgd2hpY2ggbG9jYWwgc3ltYm9scyBhcmUgaW5jbHVkZWQKLQlpbiB0aGUgb3V0cHV0IGZpbGUuICBJZiB0aGUgdmFsdWUgaXMgPDxkaXNjYXJkX2w+PiwgdGhlbiBhbGwKLQlsb2NhbCBzeW1ib2xzIHdoaWNoIGJlZ2luIHdpdGggYSBjZXJ0YWluIHByZWZpeCBhcmUgZGlzY2FyZGVkOwotCXRoaXMgaXMgY29udHJvbGxlZCBieSB0aGUgPDxiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZT4+IGVudHJ5IHBvaW50LgotCi0JVGhlIGEub3V0IGJhY2tlbmQgaGFuZGxlcyBzeW1ib2xzIGJ5IGNhbGxpbmcKLQk8PGFvdXRfbGlua193cml0ZV9zeW1ib2xzPj4gb24gZWFjaCBpbnB1dCBCRkQgYW5kIHRoZW4KLQl0cmF2ZXJzaW5nIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSB3aXRoIHRoZSBmdW5jdGlvbgotCTw8YW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbD4+LiAgSXQgYnVpbGRzIGEgc3RyaW5nIHRhYmxlCi0Jd2hpbGUgd3JpdGluZyBvdXQgdGhlIHN5bWJvbHMsIHdoaWNoIGlzIHdyaXR0ZW4gdG8gdGhlIG91dHB1dAotCWZpbGUgYXQgdGhlIGVuZCBvZiA8PE5BTUUoYW91dCxmaW5hbF9saW5rKT4+LgotKi8KLQotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuIGNvbGxlY3QpKTsKLXN0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gY29sbGVjdCkpOwotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9ub19jb2xsZWN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICpwbmVlZGVkKSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X2NvbGxlY3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKnBuZWVkZWQpKTsKLXN0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKnBuZWVkZWQsIGJvb2xlYW4gY29sbGVjdCkpOwotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkX3NpemVfdHlwZSBjb3VudCwgYXN5bWJvbCAqKiwKLQkgICBib29sZWFuIGNvbGxlY3QpKTsKLXN0YXRpYyBiZmQgKmhhc2hfZW50cnlfYmZkIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyB2b2lkIHNldF9zeW1ib2xfZnJvbV9oYXNoCi0gIFBBUkFNUyAoKGFzeW1ib2wgKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19hZGRfb3V0cHV0X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc2l6ZV90ICpwc3ltYWxsb2MsIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gZGVmYXVsdF9maWxsX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLXN0YXRpYyBib29sZWFuIGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgYm9vbGVhbikpOwotCi0vKiBUaGUgbGluayBoYXNoIHRhYmxlIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIGJmZGxpbmsuaC4gIEl0IHByb3ZpZGVzCi0gICBhIGJhc2UgaGFzaCB0YWJsZSB3aGljaCB0aGUgYmFja2VuZCBzcGVjaWZpYyBoYXNoIHRhYmxlcyBhcmUgYnVpbHQKLSAgIHVwb24uICAqLwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLV9iZmRfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPnR5cGUgPSBiZmRfbGlua19oYXNoX25ldzsKLSAgICAgIHJldC0+bmV4dCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogSW5pdGlhbGl6ZSBhIGxpbmsgaGFzaCB0YWJsZS4gIFRoZSBCRkQgYXJndW1lbnQgaXMgdGhlIG9uZQotICAgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgdGFibGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICh0YWJsZSwgYWJmZCwgbmV3ZnVuYykKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci17Ci0gIHRhYmxlLT5jcmVhdG9yID0gYWJmZC0+eHZlYzsKLSAgdGFibGUtPnVuZGVmcyA9IE5VTEw7Ci0gIHRhYmxlLT51bmRlZnNfdGFpbCA9IE5VTEw7Ci0gIHJldHVybiBiZmRfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnRhYmxlLCBuZXdmdW5jKTsKLX0KLQotLyogTG9vayB1cCBhIHN5bWJvbCBpbiBhIGxpbmsgaGFzaCB0YWJsZS4gIElmIGZvbGxvdyBpcyB0cnVlLCB3ZQotICAgZm9sbG93IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QgYW5kIGJmZF9saW5rX2hhc2hfd2FybmluZyBsaW5rcyB0bwotICAgdGhlIHJlYWwgc3ltYm9sLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKgotYmZkX2xpbmtfaGFzaF9sb29rdXAgKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjcmVhdGU7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBmb2xsb3c7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9sb29rdXAgKCZ0YWJsZS0+dGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSk7Ci0KLSAgaWYgKGZvbGxvdyAmJiByZXQgIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgd2hpbGUgKHJldC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JICAgICB8fCByZXQtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCXJldCA9IHJldC0+dS5pLmxpbms7Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIExvb2sgdXAgYSBzeW1ib2wgaW4gdGhlIG1haW4gbGlua2VyIGhhc2ggdGFibGUgaWYgdGhlIHN5bWJvbCBtaWdodAotICAgYmUgd3JhcHBlZC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgcmVmZXJlbmNlcyB0byBhbgotICAgdW5kZWZpbmVkIHN5bWJvbCwgbm90IGZvciBkZWZpbml0aW9ucyBvZiBhIHN5bWJvbC4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoKLWJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjcmVhdGU7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBmb2xsb3c7Ci17Ci0gIGlmIChpbmZvLT53cmFwX2hhc2ggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpsOwotCi0gICAgICBsID0gc3RyaW5nOwotICAgICAgaWYgKCpsID09IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkpCi0JKytsOwotCi0jdW5kZWYgV1JBUAotI2RlZmluZSBXUkFQICJfX3dyYXBfIgotCi0gICAgICBpZiAoYmZkX2hhc2hfbG9va3VwIChpbmZvLT53cmFwX2hhc2gsIGwsIGZhbHNlLCBmYWxzZSkgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICpuOwotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIC8qIFRoaXMgc3ltYm9sIGlzIGJlaW5nIHdyYXBwZWQuICBXZSB3YW50IHRvIHJlcGxhY2UgYWxsCi0gICAgICAgICAgICAgcmVmZXJlbmNlcyB0byBTWU0gd2l0aCByZWZlcmVuY2VzIHRvIF9fd3JhcF9TWU0uICAqLwotCi0JICBuID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChsKSArIHNpemVvZiBXUkFQICsgMSk7Ci0JICBpZiAobiA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQotCSAgLyogTm90ZSB0aGF0IHN5bWJvbF9sZWFkaW5nX2NoYXIgbWF5IGJlICdcMCcuICAqLwotCSAgblswXSA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCk7Ci0JICBuWzFdID0gJ1wwJzsKLQkgIHN0cmNhdCAobiwgV1JBUCk7Ci0JICBzdHJjYXQgKG4sIGwpOwotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuLCBjcmVhdGUsIHRydWUsIGZvbGxvdyk7Ci0JICBmcmVlIChuKTsKLQkgIHJldHVybiBoOwotCX0KLQotI3VuZGVmIFdSQVAKLQotI3VuZGVmIFJFQUwKLSNkZWZpbmUgUkVBTCAiX19yZWFsXyIKLQotICAgICAgaWYgKCpsID09ICdfJwotCSAgJiYgc3RybmNtcCAobCwgUkVBTCwgc2l6ZW9mIFJFQUwgLSAxKSA9PSAwCi0JICAmJiBiZmRfaGFzaF9sb29rdXAgKGluZm8tPndyYXBfaGFzaCwgbCArIHNpemVvZiBSRUFMIC0gMSwKLQkJCSAgICAgIGZhbHNlLCBmYWxzZSkgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICpuOwotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gX19yZWFsX1NZTSwgd2hlcmUgU1lNIGlzIGJlaW5nCi0gICAgICAgICAgICAgd3JhcHBlZC4gIFdlIHdhbnQgdG8gcmVwbGFjZSBhbGwgcmVmZXJlbmNlcyB0byBfX3JlYWxfU1lNCi0gICAgICAgICAgICAgd2l0aCByZWZlcmVuY2VzIHRvIFNZTS4gICovCi0KLQkgIG4gPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKGwgKyBzaXplb2YgUkVBTCAtIDEpICsgMik7Ci0JICBpZiAobiA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQotCSAgLyogTm90ZSB0aGF0IHN5bWJvbF9sZWFkaW5nX2NoYXIgbWF5IGJlICdcMCcuICAqLwotCSAgblswXSA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCk7Ci0JICBuWzFdID0gJ1wwJzsKLQkgIHN0cmNhdCAobiwgbCArIHNpemVvZiBSRUFMIC0gMSk7Ci0JICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG4sIGNyZWF0ZSwgdHJ1ZSwgZm9sbG93KTsKLQkgIGZyZWUgKG4pOwotCSAgcmV0dXJuIGg7Ci0JfQotCi0jdW5kZWYgUkVBTAotICAgIH0KLQotICByZXR1cm4gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpOwotfQotCi0vKiBUcmF2ZXJzZSBhIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlLiAgVGhlIG9ubHkgcmVhc29uIHRoaXMgaXMgbm90IGEKLSAgIG1hY3JvIGlzIHRvIGRvIGJldHRlciB0eXBlIGNoZWNraW5nLiAgVGhpcyBjb2RlIHByZXN1bWVzIHRoYXQgYW4KLSAgIGFyZ3VtZW50IHBhc3NlZCBhcyBhIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqIG1heSBiZSBjYXVnaHQgYXMgYQotICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiB3aXRoIG5vIGV4cGxpY2l0IGNhc3QgcmVxdWlyZWQgb24gdGhlCi0gICBjYWxsLiAgKi8KLQotdm9pZCAKLWJmZF9saW5rX2hhc2hfdHJhdmVyc2UgKHRhYmxlLCBmdW5jLCBpbmZvKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJvb2xlYW4gKCpmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLSAgICAgUFRSIGluZm87Ci17Ci0gIGJmZF9oYXNoX3RyYXZlcnNlICgmdGFibGUtPnRhYmxlLAotCQkgICAgICgoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpKQotCQkgICAgICBmdW5jKSwKLQkJICAgICBpbmZvKTsKLX0KLQotLyogQWRkIGEgc3ltYm9sIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSB1bmRlZnMgbGlzdC4gICovCi0KLUlOTElORSB2b2lkCi1iZmRfbGlua19hZGRfdW5kZWYgKHRhYmxlLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBCRkRfQVNTRVJUIChoLT5uZXh0ID09IE5VTEwpOwotICBpZiAodGFibGUtPnVuZGVmc190YWlsICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHRhYmxlLT51bmRlZnNfdGFpbC0+bmV4dCA9IGg7Ci0gIGlmICh0YWJsZS0+dW5kZWZzID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHRhYmxlLT51bmRlZnMgPSBoOwotICB0YWJsZS0+dW5kZWZzX3RhaWwgPSBoOwotfQotDAotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gZ2VuZXJpYyBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotX2JmZF9nZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+d3JpdHRlbiA9IGZhbHNlOwotICAgICAgcmV0LT5zeW0gPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhbiBnZW5lcmljIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLV9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gIGlmICghIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBmcmVlIChyZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLSAgcmV0dXJuICZyZXQtPnJvb3Q7Ci19Ci0KLS8qIEdyYWIgdGhlIHN5bWJvbHMgZm9yIGFuIG9iamVjdCBmaWxlIHdoZW4gZG9pbmcgYSBnZW5lcmljIGxpbmsuICBXZQotICAgc3RvcmUgdGhlIHN5bWJvbHMgaW4gdGhlIG91dHN5bWJvbHMgZmllbGQuICBXZSBuZWVkIHRvIGtlZXAgdGhlbQotICAgYXJvdW5kIGZvciB0aGUgZW50aXJlIGxpbmsgdG8gZW5zdXJlIHRoYXQgd2Ugb25seSByZWFkIHRoZW0gb25jZS4KLSAgIElmIHdlIHJlYWQgdGhlbSBtdWx0aXBsZSB0aW1lcywgd2UgbWlnaHQgd2luZCB1cCB3aXRoIHJlbG9jcyBhbmQKLSAgIHRoZSBoYXNoIHRhYmxlIHBvaW50aW5nIHRvIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHN5bWJvbAotICAgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkgPT0gKGFzeW1ib2wgKiopIE5VTEwpCi0gICAgewotICAgICAgbG9uZyBzeW1zaXplOwotICAgICAgbG9uZyBzeW1jb3VudDsKLQotICAgICAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLSAgICAgIGlmIChzeW1zaXplIDwgMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpID0gKGFzeW1ib2wgKiopIGJmZF9hbGxvYyAoYWJmZCwgc3ltc2l6ZSk7Ci0gICAgICBpZiAoYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSA9PSBOVUxMICYmIHN5bXNpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChhYmZkLCBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpKTsKLSAgICAgIGlmIChzeW1jb3VudCA8IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBzeW1jb3VudDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBHZW5lcmljIGZ1bmN0aW9uIHRvIGFkZCBzeW1ib2xzIHRvIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlCi0gICBnbG9iYWwgaGFzaCB0YWJsZS4gIFRoaXMgdmVyc2lvbiBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGNvbGxlY3QKLSAgIGNvbnN0cnVjdG9ycyBieSBuYW1lLiAgKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8sIGZhbHNlKTsKLX0KLQotLyogR2VuZXJpYyBmdW5jdGlvbiB0byBhZGQgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBnbG9iYWwKLSAgIGhhc2ggdGFibGUuICBUaGlzIHZlcnNpb24gYXV0b21hdGljYWxseSBjb2xsZWN0cyBjb25zdHJ1Y3RvcnMgYnkKLSAgIG5hbWUsIGFzIHRoZSBjb2xsZWN0MiBwcm9ncmFtIGRvZXMuICBJdCBzaG91bGQgYmUgdXNlZCBmb3IgYW55Ci0gICB0YXJnZXQgd2hpY2ggZG9lcyBub3QgcHJvdmlkZSBzb21lIG90aGVyIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB1cAotICAgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9yczsgdGhlc2UgYXJlIGFwcHJveGltYXRlbHkgdGhvc2UgdGFyZ2V0cwotICAgZm9yIHdoaWNoIGdjYyB1c2VzIGNvbGxlY3QyIGFuZCBkbyBub3Qgc3VwcG9ydCBzdGFicy4gICovCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzX2NvbGxlY3QgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8sIHRydWUpOwotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8sIGNvbGxlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLXsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX29iamVjdDoKLSAgICAgIHJldCA9IGdlbmVyaWNfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8sIGNvbGxlY3QpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaGl2ZToKLSAgICAgIHJldCA9IChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0JICAgICAoYWJmZCwgaW5mbywKLQkgICAgICAoY29sbGVjdAotCSAgICAgICA/IGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfY29sbGVjdAotCSAgICAgICA6IGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfbm9fY29sbGVjdCkpKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldCA9IGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZW5lcmljX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvLCBjb2xsZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci17Ci0gIGlmICghIGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QgKGFiZmQsIGluZm8sCi0JCQkJICAgICAgIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudCAoYWJmZCksCi0JCQkJICAgICAgIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKSwKLQkJCQkgICAgICAgY29sbGVjdCk7Ci19Ci0MCi0vKiBXZSBidWlsZCBhIGhhc2ggdGFibGUgb2YgYWxsIHN5bWJvbHMgZGVmaW5lZCBpbiBhbiBhcmNoaXZlLiAgKi8KLQotLyogQW4gYXJjaGl2ZSBzeW1ib2wgbWF5IGJlIGRlZmluZWQgYnkgbXVsdGlwbGUgYXJjaGl2ZSBlbGVtZW50cy4KLSAgIFRoaXMgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBob2xkIHRoZSBlbGVtZW50cy4gICovCi0KLXN0cnVjdCBhcmNoaXZlX2xpc3QKLXsKLSAgc3RydWN0IGFyY2hpdmVfbGlzdCAqbmV4dDsKLSAgaW50IGluZHg7Ci19OwotCi0vKiBBbiBlbnRyeSBpbiBhbiBhcmNoaXZlIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICAvKiBXaGVyZSB0aGUgc3ltYm9sIGlzIGRlZmluZWQuICAqLwotICBzdHJ1Y3QgYXJjaGl2ZV9saXN0ICpkZWZzOwotfTsKLQotLyogQW4gYXJjaGl2ZSBoYXNoIHRhYmxlIGl0c2VsZi4gICovCi0KLXN0cnVjdCBhcmNoaXZlX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHRhYmxlOwotfTsKLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqYXJjaGl2ZV9oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGFyY2hpdmVfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBhcmNoaXZlX2hhc2hfdGFibGUgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICopKSk7Ci0KLS8qIENyZWF0ZSBhIG5ldyBlbnRyeSBmb3IgYW4gYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1hcmNoaXZlX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5kZWZzID0gKHN0cnVjdCBhcmNoaXZlX2xpc3QgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBJbml0aWFsaXplIGFuIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hcmNoaXZlX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBhcmNoaXZlX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICByZXR1cm4gYmZkX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT50YWJsZSwgbmV3ZnVuYyk7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhcmNoaXZlX2hhc2hfbG9va3VwKHQsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodCktPnRhYmxlLCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIEFsbG9jYXRlIHNwYWNlIGluIGFuIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgYXJjaGl2ZV9oYXNoX2FsbG9jYXRlKHQsIHNpemUpIGJmZF9oYXNoX2FsbG9jYXRlICgmKHQpLT50YWJsZSwgKHNpemUpKQotCi0vKiBGcmVlIGFuIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgYXJjaGl2ZV9oYXNoX3RhYmxlX2ZyZWUodCkgYmZkX2hhc2hfdGFibGVfZnJlZSAoJih0KS0+dGFibGUpCi0KLS8qIEdlbmVyaWMgZnVuY3Rpb24gdG8gYWRkIHN5bWJvbHMgZnJvbSBhbiBhcmNoaXZlIGZpbGUgdG8gdGhlIGdsb2JhbAotICAgaGFzaCBmaWxlLiAgVGhpcyBmdW5jdGlvbiBwcmVzdW1lcyB0aGF0IHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZQotICAgaGFzIGFscmVhZHkgYmVlbiByZWFkIGluICh0aGlzIGlzIG5vcm1hbGx5IGRvbmUgYnkgdGhlCi0gICBiZmRfY2hlY2tfZm9ybWF0IGVudHJ5IHBvaW50KS4gIEl0IGxvb2tzIHRocm91Z2ggdGhlIHVuZGVmaW5lZCBhbmQKLSAgIGNvbW1vbiBzeW1ib2xzIGFuZCBzZWFyY2hlcyB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUgZm9yIHRoZW0uICBJZgotICAgaXQgZmluZHMgYW4gZW50cnksIGl0IGluY2x1ZGVzIHRoZSBhc3NvY2lhdGVkIG9iamVjdCBmaWxlIGluIHRoZQotICAgbGluay4KLQotICAgVGhlIG9sZCBsaW5rZXIgbG9va2VkIHRocm91Z2ggdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIGZvcgotICAgdW5kZWZpbmVkIHN5bWJvbHMuICBXZSBkbyBpdCB0aGUgb3RoZXIgd2F5IGFyb3VuZCwgbG9va2luZyB0aHJvdWdoCi0gICB1bmRlZmluZWQgc3ltYm9scyBmb3Igc3ltYm9scyBkZWZpbmVkIGluIHRoZSBhcmNoaXZlLiAgVGhlCi0gICBhZHZhbnRhZ2Ugb2YgdGhlIG5ld2VyIHNjaGVtZSBpcyB0aGF0IHdlIG9ubHkgaGF2ZSB0byBsb29rIHRocm91Z2gKLSAgIHRoZSBsaXN0IG9mIHVuZGVmaW5lZCBzeW1ib2xzIG9uY2UsIHdoZXJlYXMgdGhlIG9sZCBtZXRob2QgaGFkIHRvCi0gICByZS1zZWFyY2ggdGhlIHN5bWJvbCB0YWJsZSBlYWNoIHRpbWUgYSBuZXcgb2JqZWN0IGZpbGUgd2FzIGFkZGVkLgotCi0gICBUaGUgQ0hFQ0tGTiBhcmd1bWVudCBpcyB1c2VkIHRvIHNlZSBpZiBhbiBvYmplY3QgZmlsZSBzaG91bGQgYmUKLSAgIGluY2x1ZGVkLiAgQ0hFQ0tGTiBzaG91bGQgc2V0ICpQTkVFREVEIHRvIHRydWUgaWYgdGhlIG9iamVjdCBmaWxlCi0gICBzaG91bGQgYmUgaW5jbHVkZWQsIGFuZCBtdXN0IGFsc28gY2FsbCB0aGUgYmZkX2xpbmtfaW5mbwotICAgYWRkX2FyY2hpdmVfZWxlbWVudCBjYWxsYmFjayBmdW5jdGlvbiBhbmQgaGFuZGxlIGFkZGluZyB0aGUgc3ltYm9scwotICAgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgQ0hFQ0tGTiBzaG91bGQgb25seSByZXR1cm4gZmFsc2UgaWYgc29tZQotICAgc29ydCBvZiBlcnJvciBvY2N1cnMuCi0KLSAgIEZvciBzb21lIGZvcm1hdHMsIHN1Y2ggYXMgYS5vdXQsIGl0IGlzIHBvc3NpYmxlIHRvIGxvb2sgdGhyb3VnaCBhbgotICAgb2JqZWN0IGZpbGUgYnV0IG5vdCBhY3R1YWxseSBpbmNsdWRlIGl0IGluIHRoZSBsaW5rLiAgVGhlCi0gICBhcmNoaXZlX3Bhc3MgZmllbGQgaW4gYSBCRkQgaXMgdXNlZCB0byBhdm9pZCBjaGVja2luZyB0aGUgc3ltYm9scwotICAgb2YgYW4gb2JqZWN0IGZpbGVzIHRvbyBtYW55IHRpbWVzLiAgV2hlbiBhbiBvYmplY3QgaXMgaW5jbHVkZWQgaW4KLSAgIHRoZSBsaW5rLCBhcmNoaXZlX3Bhc3MgaXMgc2V0IHRvIC0xLiAgSWYgYW4gb2JqZWN0IGlzIHNjYW5uZWQgYnV0Ci0gICBub3QgaW5jbHVkZWQsIGFyY2hpdmVfcGFzcyBpcyBzZXQgdG8gdGhlIHBhc3MgbnVtYmVyLiAgVGhlIHBhc3MKLSAgIG51bWJlciBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgYSBuZXcgb2JqZWN0IGZpbGUgaXMgaW5jbHVkZWQuICBUaGUKLSAgIHBhc3MgbnVtYmVyIGlzIHVzZWQgYmVjYXVzZSB3aGVuIGEgbmV3IG9iamVjdCBmaWxlIGlzIGluY2x1ZGVkIGl0Ci0gICBtYXkgY3JlYXRlIG5ldyB1bmRlZmluZWQgc3ltYm9scyB3aGljaCBjYXVzZSBhIHByZXZpb3VzbHkgZXhhbWluZWQKLSAgIG9iamVjdCBmaWxlIHRvIGJlIGluY2x1ZGVkLiAgKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyAoYWJmZCwgaW5mbywgY2hlY2tmbikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAoKmNoZWNrZm4pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSBib29sZWFuICpwbmVlZGVkKSk7Ci17Ci0gIGNhcnN5bSAqYXJzeW1zOwotICBjYXJzeW0gKmFyc3ltX2VuZDsKLSAgcmVnaXN0ZXIgY2Fyc3ltICphcnN5bTsKLSAgaW50IHBhc3M7Ci0gIHN0cnVjdCBhcmNoaXZlX2hhc2hfdGFibGUgYXJzeW1faGFzaDsKLSAgaW50IGluZHg7Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqcHVuZGVmOwotCi0gIGlmICghIGJmZF9oYXNfbWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiBBbiBlbXB0eSBhcmNoaXZlIGlzIGEgc3BlY2lhbCBjYXNlLiAgKi8KLSAgICAgIGlmIChiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhYmZkLCAoYmZkICopIE5VTEwpID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fYXJtYXApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBhcnN5bXMgPSBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmczsKLSAgYXJzeW1fZW5kID0gYXJzeW1zICsgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZl9jb3VudDsKLQotICAvKiBJbiBvcmRlciB0byBxdWlja2x5IGRldGVybWluZSB3aGV0aGVyIGFuIHN5bWJvbCBpcyBkZWZpbmVkIGluCi0gICAgIHRoaXMgYXJjaGl2ZSwgd2UgYnVpbGQgYSBoYXNoIHRhYmxlIG9mIHRoZSBzeW1ib2xzLiAgKi8KLSAgaWYgKCEgYXJjaGl2ZV9oYXNoX3RhYmxlX2luaXQgKCZhcnN5bV9oYXNoLCBhcmNoaXZlX2hhc2hfbmV3ZnVuYykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKGFyc3ltID0gYXJzeW1zLCBpbmR4ID0gMDsgYXJzeW0gPCBhcnN5bV9lbmQ7IGFyc3ltKyssIGluZHgrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICphcmg7Ci0gICAgICBzdHJ1Y3QgYXJjaGl2ZV9saXN0ICpsLCAqKnBwOwotCi0gICAgICBhcmggPSBhcmNoaXZlX2hhc2hfbG9va3VwICgmYXJzeW1faGFzaCwgYXJzeW0tPm5hbWUsIHRydWUsIGZhbHNlKTsKLSAgICAgIGlmIChhcmggPT0gKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikgTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGwgPSAoKHN0cnVjdCBhcmNoaXZlX2xpc3QgKikKLQkgICBhcmNoaXZlX2hhc2hfYWxsb2NhdGUgKCZhcnN5bV9oYXNoLCBzaXplb2YgKHN0cnVjdCBhcmNoaXZlX2xpc3QpKSk7Ci0gICAgICBpZiAobCA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgbC0+aW5keCA9IGluZHg7Ci0gICAgICBmb3IgKHBwID0gJmFyaC0+ZGVmczsKLQkgICAqcHAgIT0gKHN0cnVjdCBhcmNoaXZlX2xpc3QgKikgTlVMTDsKLQkgICBwcCA9ICYoKnBwKS0+bmV4dCkKLQk7Ci0gICAgICAqcHAgPSBsOwotICAgICAgbC0+bmV4dCA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIFRoZSBhcmNoaXZlX3Bhc3MgZmllbGQgaW4gdGhlIGFyY2hpdmUgaXRzZWxmIGlzIHVzZWQgdG8KLSAgICAgaW5pdGlhbGl6ZSBQQVNTLCBzaW5lIHdlIG1heSBzZWFyY2ggdGhlIHNhbWUgYXJjaGl2ZSBtdWx0aXBsZQotICAgICB0aW1lcy4gICovCi0gIHBhc3MgPSBhYmZkLT5hcmNoaXZlX3Bhc3MgKyAxOwotCi0gIC8qIE5ldyB1bmRlZmluZWQgc3ltYm9scyBhcmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCwgc28gd2UKLSAgICAgb25seSBuZWVkIHRvIGxvb2sgdGhyb3VnaCBpdCBvbmNlLiAgKi8KLSAgcHVuZGVmID0gJmluZm8tPmhhc2gtPnVuZGVmczsKLSAgd2hpbGUgKCpwdW5kZWYgIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICphcmg7Ci0gICAgICBzdHJ1Y3QgYXJjaGl2ZV9saXN0ICpsOwotCi0gICAgICBoID0gKnB1bmRlZjsKLQotICAgICAgLyogV2hlbiBhIHN5bWJvbCBpcyBkZWZpbmVkLCBpdCBpcyBub3QgbmVjZXNzYXJpbHkgcmVtb3ZlZCBmcm9tCi0JIHRoZSBsaXN0LiAgKi8KLSAgICAgIGlmIChoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAmJiBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCXsKLQkgIC8qIFJlbW92ZSB0aGlzIGVudHJ5IGZyb20gdGhlIGxpc3QsIGZvciBnZW5lcmFsIGNsZWFubGluZXNzCi0JICAgICBhbmQgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gbG9vayB0aHJvdWdoIHRoZSBsaXN0IGFnYWluCi0JICAgICBpZiB3ZSBzZWFyY2ggYW55IG1vcmUgbGlicmFyaWVzLiAgV2UgY2FuJ3QgcmVtb3ZlIHRoZQotCSAgICAgZW50cnkgaWYgaXQgaXMgdGhlIHRhaWwsIGJlY2F1c2UgdGhhdCB3b3VsZCBsb3NlIGFueQotCSAgICAgZW50cmllcyB3ZSBhZGQgdG8gdGhlIGxpc3QgbGF0ZXIgb24gKGl0IHdvdWxkIGFsc28gY2F1c2UKLQkgICAgIHVzIHRvIGxvc2UgdHJhY2sgb2Ygd2hldGhlciB0aGUgc3ltYm9sIGhhcyBiZWVuCi0JICAgICByZWZlcmVuY2VkKS4gICovCi0JICBpZiAoKnB1bmRlZiAhPSBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbCkKLQkgICAgKnB1bmRlZiA9ICgqcHVuZGVmKS0+bmV4dDsKLQkgIGVsc2UKLQkgICAgcHVuZGVmID0gJigqcHVuZGVmKS0+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTG9vayBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIGFyY2hpdmUgc3ltYm9sIG1hcC4gICovCi0gICAgICBhcmggPSBhcmNoaXZlX2hhc2hfbG9va3VwICgmYXJzeW1faGFzaCwgaC0+cm9vdC5zdHJpbmcsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoYXJoID09IChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0JewotCSAgcHVuZGVmID0gJigqcHVuZGVmKS0+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTG9vayBhdCBhbGwgdGhlIG9iamVjdHMgd2hpY2ggZGVmaW5lIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIGZvciAobCA9IGFyaC0+ZGVmczsgbCAhPSAoc3RydWN0IGFyY2hpdmVfbGlzdCAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLQl7Ci0JICBiZmQgKmVsZW1lbnQ7Ci0JICBib29sZWFuIG5lZWRlZDsKLQotCSAgLyogSWYgdGhlIHN5bWJvbCBoYXMgZ290dGVuIGRlZmluZWQgYWxvbmcgdGhlIHdheSwgcXVpdC4gICovCi0JICBpZiAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgICYmIGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JICAgIGJyZWFrOwotCi0JICBlbGVtZW50ID0gYmZkX2dldF9lbHRfYXRfaW5kZXggKGFiZmQsIGwtPmluZHgpOwotCSAgaWYgKGVsZW1lbnQgPT0gKGJmZCAqKSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogSWYgd2UndmUgYWxyZWFkeSBpbmNsdWRlZCB0aGlzIGVsZW1lbnQsIG9yIGlmIHdlJ3ZlCi0JICAgICBhbHJlYWR5IGNoZWNrZWQgaXQgb24gdGhpcyBwYXNzLCBjb250aW51ZS4gICovCi0JICBpZiAoZWxlbWVudC0+YXJjaGl2ZV9wYXNzID09IC0xCi0JICAgICAgfHwgZWxlbWVudC0+YXJjaGl2ZV9wYXNzID09IHBhc3MpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB3ZSBjYW4ndCBmaWd1cmUgdGhpcyBlbGVtZW50IG91dCwganVzdCBpZ25vcmUgaXQuICAqLwotCSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoZWxlbWVudCwgYmZkX29iamVjdCkpCi0JICAgIHsKLQkgICAgICBlbGVtZW50LT5hcmNoaXZlX3Bhc3MgPSAtMTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBDSEVDS0ZOIHdpbGwgc2VlIGlmIHRoaXMgZWxlbWVudCBzaG91bGQgYmUgaW5jbHVkZWQsIGFuZAotCSAgICAgZ28gYWhlYWQgYW5kIGluY2x1ZGUgaXQgaWYgYXBwcm9wcmlhdGUuICAqLwotCSAgaWYgKCEgKCpjaGVja2ZuKSAoZWxlbWVudCwgaW5mbywgJm5lZWRlZCkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoISBuZWVkZWQpCi0JICAgIGVsZW1lbnQtPmFyY2hpdmVfcGFzcyA9IHBhc3M7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBlbGVtZW50LT5hcmNoaXZlX3Bhc3MgPSAtMTsKLQotCSAgICAgIC8qIEluY3JlbWVudCB0aGUgcGFzcyBjb3VudCB0byBzaG93IHRoYXQgd2UgbWF5IG5lZWQgdG8KLQkJIHJlY2hlY2sgb2JqZWN0IGZpbGVzIHdoaWNoIHdlcmUgYWxyZWFkeSBjaGVja2VkLiAgKi8KLQkgICAgICArK3Bhc3M7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHB1bmRlZiA9ICYoKnB1bmRlZiktPm5leHQ7Ci0gICAgfQotCi0gIGFyY2hpdmVfaGFzaF90YWJsZV9mcmVlICgmYXJzeW1faGFzaCk7Ci0KLSAgLyogU2F2ZSBQQVNTIGluIGNhc2Ugd2UgYXJlIGNhbGxlZCBhZ2Fpbi4gICovCi0gIGFiZmQtPmFyY2hpdmVfcGFzcyA9IHBhc3M7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGFyY2hpdmVfaGFzaF90YWJsZV9mcmVlICgmYXJzeW1faGFzaCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIFNlZSBpZiB3ZSBzaG91bGQgaW5jbHVkZSBhbiBhcmNoaXZlIGVsZW1lbnQuICBUaGlzIHZlcnNpb24gaXMgdXNlZAotICAgd2hlbiB3ZSBkbyBub3Qgd2FudCB0byBhdXRvbWF0aWNhbGx5IGNvbGxlY3QgY29uc3RydWN0b3JzIGJhc2VkIG9uCi0gICB0aGUgc3ltYm9sIG5hbWUsIHByZXN1bWFibHkgYmVjYXVzZSB3ZSBoYXZlIHNvbWUgb3RoZXIgbWVjaGFuaXNtCi0gICBmb3IgZmluZGluZyB0aGVtLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfbm9fY29sbGVjdCAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgcmV0dXJuIGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQgKGFiZmQsIGluZm8sIHBuZWVkZWQsIGZhbHNlKTsKLX0KLQotLyogU2VlIGlmIHdlIHNob3VsZCBpbmNsdWRlIGFuIGFyY2hpdmUgZWxlbWVudC4gIFRoaXMgdmVyc2lvbiBpcyB1c2VkCi0gICB3aGVuIHdlIHdhbnQgdG8gYXV0b21hdGljYWxseSBjb2xsZWN0IGNvbnN0cnVjdG9ycyBiYXNlZCBvbiB0aGUKLSAgIHN5bWJvbCBuYW1lLCBhcyBjb2xsZWN0MiBkb2VzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfY29sbGVjdCAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgcmV0dXJuIGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQgKGFiZmQsIGluZm8sIHBuZWVkZWQsIHRydWUpOwotfQotCi0vKiBTZWUgaWYgd2Ugc2hvdWxkIGluY2x1ZGUgYW4gYXJjaGl2ZSBlbGVtZW50LiAgT3B0aW9uYWxseSBjb2xsZWN0Ci0gICBjb25zdHJ1Y3RvcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAoYWJmZCwgaW5mbywgcG5lZWRlZCwgY29sbGVjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotewotICBhc3ltYm9sICoqcHAsICoqcHBlbmQ7Ci0KLSAgKnBuZWVkZWQgPSBmYWxzZTsKLQotICBpZiAoISBnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcHAgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCk7Ci0gIHBwZW5kID0gcHAgKyBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQgKGFiZmQpOwotICBmb3IgKDsgcHAgPCBwcGVuZDsgcHArKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpwOwotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHAgPSAqcHA7Ci0KLSAgICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gZ2xvYmFsbHkgdmlzaWJsZSBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICghIGJmZF9pc19jb21fc2VjdGlvbiAocC0+c2VjdGlvbikKLQkgICYmIChwLT5mbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX0lORElSRUNUIHwgQlNGX1dFQUspKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGlmIHdlIGtub3cgc29tZXRoaW5nIGFib3V0IHRoaXMKLQkgc3ltYm9sLCBhbmQgaXQgaXMgdW5kZWZpbmVkIG9yIGNvbW1vbi4gIEFuIHVuZGVmaW5lZCB3ZWFrCi0JIHN5bWJvbCAodHlwZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykgaXMgbm90IGNvbnNpZGVyZWQgdG8gYmUKLQkgYSByZWZlcmVuY2Ugd2hlbiBwdWxsaW5nIGZpbGVzIG91dCBvZiBhbiBhcmNoaXZlLiAgU2VlIHRoZQotCSBTVlI0IEFCSSwgcC4gNC0yNy4gICovCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIGJmZF9hc3ltYm9sX25hbWUgKHApLCBmYWxzZSwKLQkJCQlmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgfHwgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICAgICAmJiBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKSkKLQljb250aW51ZTsKLQotICAgICAgLyogUCBpcyBhIHN5bWJvbCB3ZSBhcmUgbG9va2luZyBmb3IuICAqLwotCi0gICAgICBpZiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKHAtPnNlY3Rpb24pKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci0JICBhc3ltYm9sICoqc3ltYm9sczsKLQotCSAgLyogVGhpcyBvYmplY3QgZmlsZSBkZWZpbmVzIHRoaXMgc3ltYm9sLCBzbyBwdWxsIGl0IGluLiAgKi8KLQkgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwKLQkJCQkJCQkgYmZkX2FzeW1ib2xfbmFtZSAocCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBzeW1jb3VudCA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0JICBzeW1ib2xzID0gX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGFiZmQpOwotCSAgaWYgKCEgZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCAoYWJmZCwgaW5mbywgc3ltY291bnQsCi0JCQkJCSAgICAgIHN5bWJvbHMsIGNvbGxlY3QpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAqcG5lZWRlZCA9IHRydWU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIFAgaXMgYSBjb21tb24gc3ltYm9sLiAgKi8KLQotICAgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JewotCSAgYmZkICpzeW1iZmQ7Ci0JICBiZmRfdm1hIHNpemU7Ci0JICB1bnNpZ25lZCBpbnQgcG93ZXI7Ci0KLQkgIHN5bWJmZCA9IGgtPnUudW5kZWYuYWJmZDsKLQkgIGlmIChzeW1iZmQgPT0gKGJmZCAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBzeW1ib2wgd2FzIGNyZWF0ZWQgYXMgdW5kZWZpbmVkIGZyb20gb3V0c2lkZQotCQkgQkZELiAgV2UgYXNzdW1lIHRoYXQgd2Ugc2hvdWxkIGxpbmsgaW4gdGhlIG9iamVjdAotCQkgZmlsZS4gIFRoaXMgaXMgZm9yIHRoZSAtdSBvcHRpb24gaW4gdGhlIGxpbmtlci4gICovCi0JICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpCi0JCSAgKGluZm8sIGFiZmQsIGJmZF9hc3ltYm9sX25hbWUgKHApKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgICpwbmVlZGVkID0gdHJ1ZTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCi0JICAvKiBUdXJuIHRoZSBzeW1ib2wgaW50byBhIGNvbW1vbiBzeW1ib2wgYnV0IGRvIG5vdCBsaW5rIGluCi0JICAgICB0aGUgb2JqZWN0IGZpbGUuICBUaGlzIGlzIGhvdyBhLm91dCB3b3Jrcy4gIE9iamVjdAotCSAgICAgZm9ybWF0cyB0aGF0IHJlcXVpcmUgZGlmZmVyZW50IHNlbWFudGljcyBtdXN0IGltcGxlbWVudAotCSAgICAgdGhpcyBmdW5jdGlvbiBkaWZmZXJlbnRseS4gIFRoaXMgc3ltYm9sIGlzIGFscmVhZHkgb24gdGhlCi0JICAgICB1bmRlZnMgbGlzdC4gIFdlIGFkZCB0aGUgc2VjdGlvbiB0byBhIGNvbW1vbiBzZWN0aW9uCi0JICAgICBhdHRhY2hlZCB0byBzeW1iZmQgdG8gZW5zdXJlIHRoYXQgaXQgaXMgaW4gYSBCRkQgd2hpY2gKLQkgICAgIHdpbGwgYmUgbGlua2VkIGluLiAgKi8KLQkgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2NvbW1vbjsKLQkgIGgtPnUuYy5wID0KLQkgICAgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9jb21tb25fZW50cnkgKikKLQkgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJc2l6ZW9mIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9jb21tb25fZW50cnkpKSk7Ci0JICBpZiAoaC0+dS5jLnAgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBzaXplID0gYmZkX2FzeW1ib2xfdmFsdWUgKHApOwotCSAgaC0+dS5jLnNpemUgPSBzaXplOwotCi0JICBwb3dlciA9IGJmZF9sb2cyIChzaXplKTsKLQkgIGlmIChwb3dlciA+IDQpCi0JICAgIHBvd2VyID0gNDsKLQkgIGgtPnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIgPSBwb3dlcjsKLQotCSAgaWYgKHAtPnNlY3Rpb24gPT0gYmZkX2NvbV9zZWN0aW9uX3B0cikKLQkgICAgaC0+dS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHN5bWJmZCwgIkNPTU1PTiIpOwotCSAgZWxzZQotCSAgICBoLT51LmMucC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoc3ltYmZkLAotCQkJCQkJCSAgcC0+c2VjdGlvbi0+bmFtZSk7Ci0JICBoLT51LmMucC0+c2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgY29tbW9uIHN5bWJvbCBpZiBuZWNlc3NhcnkuICBUaGlzCi0JICAgICBpcyBob3cgYS5vdXQgd29ya3MuICBPYmplY3QgZm9ybWF0cyB0aGF0IHJlcXVpcmUKLQkgICAgIGRpZmZlcmVudCBzZW1hbnRpY3MgbXVzdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbgotCSAgICAgZGlmZmVyZW50bHkuICAqLwotCSAgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChwKSA+IGgtPnUuYy5zaXplKQotCSAgICBoLT51LmMuc2l6ZSA9IGJmZF9hc3ltYm9sX3ZhbHVlIChwKTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoaXMgYXJjaGl2ZSBlbGVtZW50IGlzIG5vdCBuZWVkZWQuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIHRoZSBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgQUJGRAotICAgaXMgdGhlIG9iamVjdCBmaWxlLiAgSU5GTyBpcyB0aGUgbGlua2VyIGluZm9ybWF0aW9uLiAgU1lNQk9MX0NPVU5UCi0gICBpcyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMuICBTWU1CT0xTIGlzIHRoZSBsaXN0IG9mIHN5bWJvbHMuICBDT0xMRUNUCi0gICBpcyB0cnVlIGlmIGNvbnN0cnVjdG9ycyBzaG91bGQgYmUgYXV0b21hdGljYWxseSBjb2xsZWN0ZWQgYnkgbmFtZQotICAgYXMgaXMgZG9uZSBieSBjb2xsZWN0Mi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0IChhYmZkLCBpbmZvLCBzeW1ib2xfY291bnQsIHN5bWJvbHMsIGNvbGxlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZF9zaXplX3R5cGUgc3ltYm9sX2NvdW50OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotewotICBhc3ltYm9sICoqcHAsICoqcHBlbmQ7Ci0KLSAgcHAgPSBzeW1ib2xzOwotICBwcGVuZCA9IHN5bWJvbHMgKyBzeW1ib2xfY291bnQ7Ci0gIGZvciAoOyBwcCA8IHBwZW5kOyBwcCsrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnA7Ci0KLSAgICAgIHAgPSAqcHA7Ci0KLSAgICAgIGlmICgocC0+ZmxhZ3MgJiAoQlNGX0lORElSRUNUCi0JCSAgICAgICB8IEJTRl9XQVJOSU5HCi0JCSAgICAgICB8IEJTRl9HTE9CQUwKLQkJICAgICAgIHwgQlNGX0NPTlNUUlVDVE9SCi0JCSAgICAgICB8IEJTRl9XRUFLKSkgIT0gMAotCSAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHApKQotCSAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHApKQotCSAgfHwgYmZkX2lzX2luZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHApKSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY29uc3QgY2hhciAqc3RyaW5nOwotCSAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAocCk7Ci0JICBpZiAoKChwLT5mbGFncyAmIEJTRl9JTkRJUkVDVCkgIT0gMAotCSAgICAgICB8fCBiZmRfaXNfaW5kX3NlY3Rpb24gKHAtPnNlY3Rpb24pKQotCSAgICAgICYmIHBwICsgMSA8IHBwZW5kKQotCSAgICB7Ci0JICAgICAgcHArKzsKLQkgICAgICBzdHJpbmcgPSBiZmRfYXN5bWJvbF9uYW1lICgqcHApOwotCSAgICB9Ci0JICBlbHNlIGlmICgocC0+ZmxhZ3MgJiBCU0ZfV0FSTklORykgIT0gMAotCQkgICAmJiBwcCArIDEgPCBwcGVuZCkKLQkgICAgewotCSAgICAgIC8qIFRoZSBuYW1lIG9mIFAgaXMgYWN0dWFsbHkgdGhlIHdhcm5pbmcgc3RyaW5nLCBhbmQgdGhlCi0JCSBuZXh0IHN5bWJvbCBpcyB0aGUgb25lIHRvIHdhcm4gYWJvdXQuICAqLwotCSAgICAgIHN0cmluZyA9IG5hbWU7Ci0JICAgICAgcHArKzsKLQkgICAgICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoKnBwKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBzdHJpbmcgPSBOVUxMOwotCi0JICBoID0gTlVMTDsKLQkgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkgKGluZm8sIGFiZmQsIG5hbWUsIHAtPmZsYWdzLCBiZmRfZ2V0X3NlY3Rpb24gKHApLAotCQkgIHAtPnZhbHVlLCBzdHJpbmcsIGZhbHNlLCBjb2xsZWN0LAotCQkgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBJZiB0aGlzIGlzIGEgY29uc3RydWN0b3Igc3ltYm9sLCBhbmQgdGhlIGxpbmtlciBkaWRuJ3QgZG8KLSAgICAgICAgICAgICBhbnl0aGluZyB3aXRoIGl0LCB0aGVuIHdlIHdhbnQgdG8ganVzdCBwYXNzIHRoZSBzeW1ib2wKLSAgICAgICAgICAgICB0aHJvdWdoIHRvIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMgd2lsbCBoYXBwZW4gd2hlbgotICAgICAgICAgICAgIGxpbmtpbmcgd2l0aCAtci4gICovCi0JICBpZiAoKHAtPmZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwCi0JICAgICAgJiYgKGggPT0gTlVMTCB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpKQotCSAgICB7Ci0JICAgICAgcC0+dWRhdGEucCA9IE5VTEw7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogU2F2ZSB0aGUgQkZEIHN5bWJvbCBzbyB0aGF0IHdlIGRvbid0IGxvc2UgYW55IGJhY2tlbmQKLQkgICAgIHNwZWNpZmljIGluZm9ybWF0aW9uIHRoYXQgbWF5IGJlIGF0dGFjaGVkIHRvIGl0LiAgV2Ugb25seQotCSAgICAgd2FudCB0aGlzIG9uZSBpZiBpdCBnaXZlcyBtb3JlIGluZm9ybWF0aW9uIHRoYW4gdGhlCi0JICAgICBleGlzdGluZyBvbmU7IHdlIGRvbid0IHdhbnQgdG8gcmVwbGFjZSBhIGRlZmluZWQgc3ltYm9sCi0JICAgICB3aXRoIGFuIHVuZGVmaW5lZCBvbmUuICBUaGlzIHJvdXRpbmUgbWF5IGJlIGNhbGxlZCB3aXRoIGEKLQkgICAgIGhhc2ggdGFibGUgb3RoZXIgdGhhbiB0aGUgZ2VuZXJpYyBoYXNoIHRhYmxlLCBzbyB3ZSBvbmx5Ci0JICAgICBkbyB0aGlzIGlmIHdlIGFyZSBjZXJ0YWluIHRoYXQgdGhlIGhhc2ggdGFibGUgaXMgYQotCSAgICAgZ2VuZXJpYyBvbmUuICAqLwotCSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYykKLQkgICAgewotCSAgICAgIGlmIChoLT5zeW0gPT0gKGFzeW1ib2wgKikgTlVMTAotCQkgIHx8ICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChwKSkKLQkJICAgICAgJiYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHApKQotCQkJICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoaC0+c3ltKSkpKSkKLQkJewotCQkgIGgtPnN5bSA9IHA7Ci0JCSAgLyogQlNGX09MRF9DT01NT04gaXMgYSBoYWNrIHRvIHN1cHBvcnQgQ09GRiByZWxvYwotCQkgICAgIHJlYWRpbmcsIGFuZCBpdCBzaG91bGQgZ28gYXdheSB3aGVuIHRoZSBDT0ZGCi0JCSAgICAgbGlua2VyIGlzIHN3aXRjaGVkIHRvIHRoZSBuZXcgdmVyc2lvbi4gICovCi0JCSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChwKSkpCi0JCSAgICBwLT5mbGFncyB8PSBCU0ZfT0xEX0NPTU1PTjsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIFN0b3JlIGEgYmFjayBwb2ludGVyIGZyb20gdGhlIHN5bWJvbCB0byB0aGUgaGFzaAotCSAgICAgdGFibGUgZW50cnkgZm9yIHRoZSBiZW5lZml0IG9mIHJlbGF4YXRpb24gY29kZSB1bnRpbAotCSAgICAgaXQgZ2V0cyByZXdyaXR0ZW4gdG8gbm90IHVzZSBhc3ltYm9sIHN0cnVjdHVyZXMuCi0JICAgICBTZXR0aW5nIHRoaXMgaXMgYWxzbyB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgdGhlc2UKLQkgICAgIHN5bWJvbHMgd2VyZSBzZXQgdXAgYnkgdGhlIGdlbmVyaWMgbGlua2VyLiAgKi8KLQkgIHAtPnVkYXRhLnAgPSAoUFRSKSBoOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBXZSB1c2UgYSBzdGF0ZSB0YWJsZSB0byBkZWFsIHdpdGggYWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBUaGUgZmlyc3QgaW5kZXggaW50byB0aGUgc3RhdGUgdGFibGUgZGVzY3JpYmVzIHRoZSBzeW1ib2wKLSAgIGZyb20gdGhlIG9iamVjdCBmaWxlLiAgVGhlIHNlY29uZCBpbmRleCBpbnRvIHRoZSBzdGF0ZSB0YWJsZSBpcyB0aGUKLSAgIHR5cGUgb2YgdGhlIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0KLS8qIFRoZSBzeW1ib2wgZnJvbSB0aGUgb2JqZWN0IGZpbGUgaXMgdHVybmVkIGludG8gb25lIG9mIHRoZXNlIHJvdwotICAgdmFsdWVzLiAgKi8KLQotZW51bSBsaW5rX3JvdwotewotICBVTkRFRl9ST1csCQkvKiBVbmRlZmluZWQuICAqLwotICBVTkRFRldfUk9XLAkJLyogV2VhayB1bmRlZmluZWQuICAqLwotICBERUZfUk9XLAkJLyogRGVmaW5lZC4gICovCi0gIERFRldfUk9XLAkJLyogV2VhayBkZWZpbmVkLiAgKi8KLSAgQ09NTU9OX1JPVywJCS8qIENvbW1vbi4gICovCi0gIElORFJfUk9XLAkJLyogSW5kaXJlY3QuICAqLwotICBXQVJOX1JPVywJCS8qIFdhcm5pbmcuICAqLwotICBTRVRfUk9XCQkvKiBNZW1iZXIgb2Ygc2V0LiAgKi8KLX07Ci0KLS8qIGFwcGFyZW50bHkgbmVlZGVkIGZvciBIaXRhY2hpIDMwNTBSKEhJLVVYL1dFMik/ICovCi0jdW5kZWYgRkFJTAotCi0vKiBUaGUgYWN0aW9ucyB0byB0YWtlIGluIHRoZSBzdGF0ZSB0YWJsZS4gICovCi0KLWVudW0gbGlua19hY3Rpb24KLXsKLSAgRkFJTCwJCS8qIEFib3J0LiAqLwotICBVTkQsCQkvKiBNYXJrIHN5bWJvbCB1bmRlZmluZWQuICAqLwotICBXRUFLLAkJLyogTWFyayBzeW1ib2wgd2VhayB1bmRlZmluZWQuICAqLwotICBERUYsCQkvKiBNYXJrIHN5bWJvbCBkZWZpbmVkLiAgKi8KLSAgREVGVywJCS8qIE1hcmsgc3ltYm9sIHdlYWsgZGVmaW5lZC4gICovCi0gIENPTSwJCS8qIE1hcmsgc3ltYm9sIGNvbW1vbi4gICovCi0gIFJFRiwJCS8qIE1hcmsgZGVmaW5lZCBzeW1ib2wgcmVmZXJlbmNlZC4gICovCi0gIENSRUYsCQkvKiBQb3NzaWJseSB3YXJuIGFib3V0IGNvbW1vbiByZWZlcmVuY2UgdG8gZGVmaW5lZCBzeW1ib2wuICAqLwotICBDREVGLAkJLyogRGVmaW5lIGV4aXN0aW5nIGNvbW1vbiBzeW1ib2wuICAqLwotICBOT0FDVCwJLyogTm8gYWN0aW9uLiAgKi8KLSAgQklHLAkJLyogTWFyayBzeW1ib2wgY29tbW9uIHVzaW5nIGxhcmdlc3Qgc2l6ZS4gICovCi0gIE1ERUYsCQkvKiBNdWx0aXBsZSBkZWZpbml0aW9uIGVycm9yLiAgKi8KLSAgTUlORCwJCS8qIE11bHRpcGxlIGluZGlyZWN0IHN5bWJvbHMuICAqLwotICBJTkQsCQkvKiBNYWtlIGluZGlyZWN0IHN5bWJvbC4gICovCi0gIENJTkQsCQkvKiBNYWtlIGluZGlyZWN0IHN5bWJvbCBmcm9tIGV4aXN0aW5nIGNvbW1vbiBzeW1ib2wuICAqLwotICBTRVQsCQkvKiBBZGQgdmFsdWUgdG8gc2V0LiAgKi8KLSAgTVdBUk4sCS8qIE1ha2Ugd2FybmluZyBzeW1ib2wuICAqLwotICBXQVJOLAkJLyogSXNzdWUgd2FybmluZy4gICovCi0gIENXQVJOLAkvKiBXYXJuIGlmIHJlZmVyZW5jZWQsIGVsc2UgTVdBUk4uICAqLwotICBDWUNMRSwJLyogUmVwZWF0IHdpdGggc3ltYm9sIHBvaW50ZWQgdG8uICAqLwotICBSRUZDLAkJLyogTWFyayBpbmRpcmVjdCBzeW1ib2wgcmVmZXJlbmNlZCBhbmQgdGhlbiBDWUNMRS4gICovCi0gIFdBUk5DCQkvKiBJc3N1ZSB3YXJuaW5nIGFuZCB0aGVuIENZQ0xFLiAgKi8KLX07Ci0KLS8qIFRoZSBzdGF0ZSB0YWJsZSBpdHNlbGYuICBUaGUgZmlyc3QgaW5kZXggaXMgYSBsaW5rX3JvdyBhbmQgdGhlCi0gICBzZWNvbmQgaW5kZXggaXMgYSBiZmRfbGlua19oYXNoX3R5cGUuICAqLwotCi1zdGF0aWMgY29uc3QgZW51bSBsaW5rX2FjdGlvbiBsaW5rX2FjdGlvbls4XVs4XSA9Ci17Ci0gIC8qIGN1cnJlbnRccHJldiAgICBuZXcgICAgdW5kZWYgIHVuZGVmdyBkZWYgICAgZGVmdyAgIGNvbSAgICBpbmRyICAgd2FybiAgKi8KLSAgLyogVU5ERUZfUk9XIAkqLyAge1VORCwgICBOT0FDVCwgVU5ELCAgIFJFRiwgICBSRUYsICAgTk9BQ1QsIFJFRkMsICBXQVJOQyB9LAotICAvKiBVTkRFRldfUk9XCSovICB7V0VBSywgIE5PQUNULCBOT0FDVCwgUkVGLCAgIFJFRiwgICBOT0FDVCwgUkVGQywgIFdBUk5DIH0sCi0gIC8qIERFRl9ST1cgCSovICB7REVGLCAgIERFRiwgICBERUYsICAgTURFRiwgIERFRiwgICBDREVGLCAgTURFRiwgIENZQ0xFIH0sCi0gIC8qIERFRldfUk9XIAkqLyAge0RFRlcsICBERUZXLCAgREVGVywgIE5PQUNULCBOT0FDVCwgTk9BQ1QsIE5PQUNULCBDWUNMRSB9LAotICAvKiBDT01NT05fUk9XCSovICB7Q09NLCAgIENPTSwgICBDT00sICAgQ1JFRiwgIENSRUYsICBCSUcsICAgUkVGQywgIFdBUk5DIH0sCi0gIC8qIElORFJfUk9XCSovICB7SU5ELCAgIElORCwgICBJTkQsICAgTURFRiwgIElORCwgICBDSU5ELCAgTUlORCwgIENZQ0xFIH0sCi0gIC8qIFdBUk5fUk9XICAgKi8gIHtNV0FSTiwgV0FSTiwgIFdBUk4sICBDV0FSTiwgQ1dBUk4sIFdBUk4sICBDV0FSTiwgTVdBUk4gfSwKLSAgLyogU0VUX1JPVwkqLyAge1NFVCwgICBTRVQsICAgU0VULCAgIFNFVCwgICBTRVQsICAgU0VULCAgIENZQ0xFLCBDWUNMRSB9Ci19OwotCi0vKiBNb3N0IG9mIHRoZSBlbnRyaWVzIGluIHRoZSBMSU5LX0FDVElPTiB0YWJsZSBhcmUgc3RyYWlnaHRmb3J3YXJkLAotICAgYnV0IGEgZmV3IGFyZSBzb21ld2hhdCBzdWJ0bGUuCi0KLSAgIEEgcmVmZXJlbmNlIHRvIGFuIGluZGlyZWN0IHN5bWJvbCAoVU5ERUZfUk9XL2luZHIgb3IKLSAgIFVOREVGV19ST1cvaW5kcikgaXMgY291bnRlZCBhcyBhIHJlZmVyZW5jZSBib3RoIHRvIHRoZSBpbmRpcmVjdAotICAgc3ltYm9sIGFuZCB0byB0aGUgc3ltYm9sIHRoZSBpbmRpcmVjdCBzeW1ib2wgcG9pbnRzIHRvLgotCi0gICBBIHJlZmVyZW5jZSB0byBhIHdhcm5pbmcgc3ltYm9sIChVTkRFRl9ST1cvd2FybiBvciBVTkRFRldfUk9XL3dhcm4pCi0gICBjYXVzZXMgdGhlIHdhcm5pbmcgdG8gYmUgaXNzdWVkLgotCi0gICBBIGNvbW1vbiBkZWZpbml0aW9uIG9mIGFuIGluZGlyZWN0IHN5bWJvbCAoQ09NTU9OX1JPVy9pbmRyKSBpcwotICAgdHJlYXRlZCBhcyBhIG11bHRpcGxlIGRlZmluaXRpb24gZXJyb3IuICBMaWtld2lzZSBmb3IgYW4gaW5kaXJlY3QKLSAgIGRlZmluaXRpb24gb2YgYSBjb21tb24gc3ltYm9sIChJTkRSX1JPVy9jb20pLgotCi0gICBBbiBpbmRpcmVjdCBkZWZpbml0aW9uIG9mIGEgd2FybmluZyAoSU5EUl9ST1cvd2FybikgZG9lcyBub3QgY2F1c2UKLSAgIHRoZSB3YXJuaW5nIHRvIGJlIGlzc3VlZC4KLQotICAgSWYgYSB3YXJuaW5nIGlzIGNyZWF0ZWQgZm9yIGFuIGluZGlyZWN0IHN5bWJvbCAoV0FSTl9ST1cvaW5kcikgbm8KLSAgIHdhcm5pbmcgaXMgY3JlYXRlZCBmb3IgdGhlIHN5bWJvbCB0aGUgaW5kaXJlY3Qgc3ltYm9sIHBvaW50cyB0by4KLQotICAgQWRkaW5nIGFuIGVudHJ5IHRvIGEgc2V0IGRvZXMgbm90IGNvdW50IGFzIGEgcmVmZXJlbmNlIHRvIGEgc2V0LAotICAgYW5kIG5vIHdhcm5pbmcgaXMgaXNzdWVkIChTRVRfUk9XL3dhcm4pLiAgKi8KLQotLyogUmV0dXJuIHRoZSBCRkQgaW4gd2hpY2ggYSBoYXNoIGVudHJ5IGhhcyBiZWVuIGRlZmluZWQsIGlmIGtub3duLiAgKi8KLQotc3RhdGljIGJmZCAqCi1oYXNoX2VudHJ5X2JmZCAoaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIHdoaWxlIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLSAgICBoID0gaC0+dS5pLmxpbms7Ci0gIHN3aXRjaCAoaC0+dHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLSAgICAgIHJldHVybiBoLT51LnVuZGVmLmFiZmQ7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICByZXR1cm4gaC0+dS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIHJldHVybiBoLT51LmMucC0+c2VjdGlvbi0+b3duZXI7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBBZGQgYSBzeW1ib2wgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLgotICAgQUJGRCBpcyB0aGUgQkZEIHRoZSBzeW1ib2wgY29tZXMgZnJvbS4KLSAgIE5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbC4KLSAgIEZMQUdTIGlzIHRoZSBCU0ZfKiBiaXRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ltYm9sLgotICAgU0VDVElPTiBpcyB0aGUgc2VjdGlvbiBpbiB3aGljaCB0aGUgc3ltYm9sIGlzIGRlZmluZWQ7IHRoaXMgbWF5IGJlCi0gICAgIGJmZF91bmRfc2VjdGlvbl9wdHIgb3IgYmZkX2NvbV9zZWN0aW9uX3B0ci4KLSAgIFZBTFVFIGlzIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLCByZWxhdGl2ZSB0byB0aGUgc2VjdGlvbi4KLSAgIFNUUklORyBpcyB1c2VkIGZvciBlaXRoZXIgYW4gaW5kaXJlY3Qgc3ltYm9sLCBpbiB3aGljaCBjYXNlIGl0IGlzCi0gICAgIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gaW5kaXJlY3QgdG8sIG9yIGEgd2FybmluZyBzeW1ib2wsIGluCi0gICAgIHdoaWNoIGNhc2UgaXQgaXMgdGhlIHdhcm5pbmcgc3RyaW5nLgotICAgQ09QWSBpcyB0cnVlIGlmIE5BTUUgb3IgU1RSSU5HIG11c3QgYmUgY29waWVkIGludG8gbG9jYWxseQotICAgICBhbGxvY2F0ZWQgbWVtb3J5IGlmIHRoZXkgbmVlZCB0byBiZSBzYXZlZC4KLSAgIENPTExFQ1QgaXMgdHJ1ZSBpZiB3ZSBzaG91bGQgYXV0b21hdGljYWxseSBjb2xsZWN0IGdjYyBjb25zdHJ1Y3RvcgotICAgICBvciBkZXN0cnVjdG9yIG5hbWVzIGFzIGNvbGxlY3QyIGRvZXMuCi0gICBIQVNIUCwgaWYgbm90IE5VTEwsIGlzIGEgcGxhY2UgdG8gc3RvcmUgdGhlIGNyZWF0ZWQgaGFzaCB0YWJsZQotICAgICBlbnRyeTsgaWYgKkhBU0hQIGlzIG5vdCBOVUxMLCB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGxvb2tlZCB1cAotICAgICB0aGUgaGFzaCB0YWJsZSBlbnRyeSwgYW5kIHN0b3JlZCBpdCBpbiAqSEFTSFAuICovCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsCi0JCQkJICBzdHJpbmcsIGNvcHksIGNvbGxlY3QsIGhhc2hwKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHA7Ci17Ci0gIGVudW0gbGlua19yb3cgcm93OwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgYm9vbGVhbiBjeWNsZTsKLQotICBpZiAoYmZkX2lzX2luZF9zZWN0aW9uIChzZWN0aW9uKQotICAgICAgfHwgKGZsYWdzICYgQlNGX0lORElSRUNUKSAhPSAwKQotICAgIHJvdyA9IElORFJfUk9XOwotICBlbHNlIGlmICgoZmxhZ3MgJiBCU0ZfV0FSTklORykgIT0gMCkKLSAgICByb3cgPSBXQVJOX1JPVzsKLSAgZWxzZSBpZiAoKGZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwKQotICAgIHJvdyA9IFNFVF9ST1c7Ci0gIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikpCi0gICAgewotICAgICAgaWYgKChmbGFncyAmIEJTRl9XRUFLKSAhPSAwKQotCXJvdyA9IFVOREVGV19ST1c7Ci0gICAgICBlbHNlCi0Jcm93ID0gVU5ERUZfUk9XOwotICAgIH0KLSAgZWxzZSBpZiAoKGZsYWdzICYgQlNGX1dFQUspICE9IDApCi0gICAgcm93ID0gREVGV19ST1c7Ci0gIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpCi0gICAgcm93ID0gQ09NTU9OX1JPVzsKLSAgZWxzZQotICAgIHJvdyA9IERFRl9ST1c7Ci0KLSAgaWYgKGhhc2hwICE9IE5VTEwgJiYgKmhhc2hwICE9IE5VTEwpCi0gICAgaCA9ICpoYXNocDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChyb3cgPT0gVU5ERUZfUk9XIHx8IHJvdyA9PSBVTkRFRldfUk9XKQotCWggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChhYmZkLCBpbmZvLCBuYW1lLCB0cnVlLCBjb3B5LCBmYWxzZSk7Ci0gICAgICBlbHNlCi0JaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCB0cnVlLCBjb3B5LCBmYWxzZSk7Ci0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGlmIChoYXNocCAhPSBOVUxMKQotCSAgICAqaGFzaHAgPSBOVUxMOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKGluZm8tPm5vdGljZV9hbGwKLSAgICAgIHx8IChpbmZvLT5ub3RpY2VfaGFzaCAhPSAoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopIE5VTEwKLQkgICYmIChiZmRfaGFzaF9sb29rdXAgKGluZm8tPm5vdGljZV9oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UpCi0JICAgICAgIT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMKSkpCi0gICAgewotICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPm5vdGljZSkgKGluZm8sIGgtPnJvb3Quc3RyaW5nLCBhYmZkLCBzZWN0aW9uLAotCQkJCQl2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoaGFzaHAgIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBOVUxMKQotICAgICpoYXNocCA9IGg7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBlbnVtIGxpbmtfYWN0aW9uIGFjdGlvbjsKLQotICAgICAgY3ljbGUgPSBmYWxzZTsKLSAgICAgIGFjdGlvbiA9IGxpbmtfYWN0aW9uWyhpbnQpIHJvd11bKGludCkgaC0+dHlwZV07Ci0gICAgICBzd2l0Y2ggKGFjdGlvbikKLQl7Ci0JY2FzZSBGQUlMOgotCSAgYWJvcnQgKCk7Ci0KLQljYXNlIE5PQUNUOgotCSAgLyogRG8gbm90aGluZy4gICovCi0JICBicmVhazsKLQotCWNhc2UgVU5EOgotCSAgLyogTWFrZSBhIG5ldyB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLQkgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkgIGgtPnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0JICBiZmRfbGlua19hZGRfdW5kZWYgKGluZm8tPmhhc2gsIGgpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFdFQUs6Ci0JICAvKiBNYWtlIGEgbmV3IHdlYWsgdW5kZWZpbmVkIHN5bWJvbC4gICovCi0JICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWs7Ci0JICBoLT51LnVuZGVmLmFiZmQgPSBhYmZkOwotCSAgYnJlYWs7Ci0KLQljYXNlIENERUY6Ci0JICAvKiBXZSBoYXZlIGZvdW5kIGEgZGVmaW5pdGlvbiBmb3IgYSBzeW1ib2wgd2hpY2ggd2FzCi0JICAgICBwcmV2aW91c2x5IGNvbW1vbi4gICovCi0JICBCRkRfQVNTRVJUIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKTsKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+bXVsdGlwbGVfY29tbW9uKQotCQkgKGluZm8sIGgtPnJvb3Quc3RyaW5nLAotCQkgIGgtPnUuYy5wLT5zZWN0aW9uLT5vd25lciwgYmZkX2xpbmtfaGFzaF9jb21tb24sIGgtPnUuYy5zaXplLAotCQkgIGFiZmQsIGJmZF9saW5rX2hhc2hfZGVmaW5lZCwgKGJmZF92bWEpIDApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIERFRjoKLQljYXNlIERFRlc6Ci0JICB7Ci0JICAgIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlIG9sZHR5cGU7Ci0KLQkgICAgLyogRGVmaW5lIGEgc3ltYm9sLiAgKi8KLQkgICAgb2xkdHlwZSA9IGgtPnR5cGU7Ci0JICAgIGlmIChhY3Rpb24gPT0gREVGVykKLQkgICAgICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOwotCSAgICBlbHNlCi0JICAgICAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkgICAgaC0+dS5kZWYuc2VjdGlvbiA9IHNlY3Rpb247Ci0JICAgIGgtPnUuZGVmLnZhbHVlID0gdmFsdWU7Ci0KLQkgICAgLyogSWYgd2UgaGF2ZSBiZWVuIGFza2VkIHRvLCB3ZSBhY3QgbGlrZSBjb2xsZWN0MiBhbmQKLQkgICAgICAgaWRlbnRpZnkgYWxsIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0IGJlIGdsb2JhbAotCSAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGFuZCBwYXNzIHRoZW0gdXAgaW4gYQotCSAgICAgICBjYWxsYmFjay4gIFdlIG9ubHkgZG8gdGhpcyBmb3IgY2VydGFpbiBvYmplY3QgZmlsZQotCSAgICAgICB0eXBlcywgc2luY2UgbWFueSBvYmplY3QgZmlsZSB0eXBlcyBjYW4gaGFuZGxlIHRoaXMKLQkgICAgICAgYXV0b21hdGljYWxseS4gICovCi0JICAgIGlmIChjb2xsZWN0ICYmIG5hbWVbMF0gPT0gJ18nKQotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqczsKLQotCQkvKiBBIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgbmFtZSBzdGFydHMgbGlrZSB0aGlzOgotCQkgICBfK0dMT0JBTF9bXy4kXVtJRF1bXy4kXSB3aGVyZSB0aGUgZmlyc3QgW18uJF0gYW5kCi0JCSAgIHRoZSBzZWNvbmQgYXJlIHRoZSBzYW1lIGNoYXJhY3RlciAod2UgYWNjZXB0IGFueQotCQkgICBjaGFyYWN0ZXIgdGhlcmUsIGluIGNhc2UgYSBuZXcgb2JqZWN0IGZpbGUgZm9ybWF0Ci0JCSAgIGNvbWVzIGFsb25nIHdpdGggZXZlbiB3b3JzZSBuYW1pbmcgcmVzdHJpY3Rpb25zKS4gICovCi0KLSNkZWZpbmUgQ09OU19QUkVGSVggIkdMT0JBTF8iCi0jZGVmaW5lIENPTlNfUFJFRklYX0xFTiAoc2l6ZW9mIENPTlNfUFJFRklYIC0gMSkKLQotCQlzID0gbmFtZSArIDE7Ci0JCXdoaWxlICgqcyA9PSAnXycpCi0JCSAgKytzOwotCQlpZiAoc1swXSA9PSAnRycKLQkJICAgICYmIHN0cm5jbXAgKHMsIENPTlNfUFJFRklYLCBDT05TX1BSRUZJWF9MRU4gLSAxKSA9PSAwKQotCQkgIHsKLQkJICAgIGNoYXIgYzsKLQotCQkgICAgYyA9IHNbQ09OU19QUkVGSVhfTEVOICsgMV07Ci0JCSAgICBpZiAoKGMgPT0gJ0knIHx8IGMgPT0gJ0QnKQotCQkJJiYgc1tDT05TX1BSRUZJWF9MRU5dID09IHNbQ09OU19QUkVGSVhfTEVOICsgMl0pCi0JCSAgICAgIHsKLQkJCS8qIElmIHRoaXMgaXMgYSBkZWZpbml0aW9uIG9mIGEgc3ltYm9sIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgcHJldmlvdXNseSB3ZWFrbHkgZGVmaW5lZCwgd2UgYXJlIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0cm91YmxlLiAgV2UgaGF2ZSBhbHJlYWR5IGFkZGVkIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yIGVudHJ5IGZvciB0aGUgd2VhayBkZWZpbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wsIGFuZCBub3cgd2UgYXJlIHRyeWluZyB0byBhZGQgb25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG5ldyBzeW1ib2wuICBGb3J0dW5hdGVseSwgdGhpcyBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgbmV2ZXIgYXJpc2UgaW4gcHJhY3RpY2UuICAqLwotCQkJaWYgKG9sZHR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkJICBhYm9ydCAoKTsKLQotCQkJaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5jb25zdHJ1Y3RvcikKLQkJCSAgICAgICAoaW5mbywKLQkJCQljID09ICdJJyA/IHRydWUgOiBmYWxzZSwKLQkJCQloLT5yb290LnN0cmluZywgYWJmZCwgc2VjdGlvbiwgdmFsdWUpKSkKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlIENPTToKLQkgIC8qIFdlIGhhdmUgZm91bmQgYSBjb21tb24gZGVmaW5pdGlvbiBmb3IgYSBzeW1ib2wuICAqLwotCSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JICAgIGJmZF9saW5rX2FkZF91bmRlZiAoaW5mby0+aGFzaCwgaCk7Ci0JICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9jb21tb247Ci0JICBoLT51LmMucCA9Ci0JICAgICgoc3RydWN0IGJmZF9saW5rX2hhc2hfY29tbW9uX2VudHJ5ICopCi0JICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCXNpemVvZiAoc3RydWN0IGJmZF9saW5rX2hhc2hfY29tbW9uX2VudHJ5KSkpOwotCSAgaWYgKGgtPnUuYy5wID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaC0+dS5jLnNpemUgPSB2YWx1ZTsKLQotCSAgLyogU2VsZWN0IGEgZGVmYXVsdCBhbGlnbm1lbnQgYmFzZWQgb24gdGhlIHNpemUuICBUaGlzIG1heQotICAgICAgICAgICAgIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNhbGxlci4gICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBwb3dlcjsKLQotCSAgICBwb3dlciA9IGJmZF9sb2cyICh2YWx1ZSk7Ci0JICAgIGlmIChwb3dlciA+IDQpCi0JICAgICAgcG93ZXIgPSA0OwotCSAgICBoLT51LmMucC0+YWxpZ25tZW50X3Bvd2VyID0gcG93ZXI7Ci0JICB9Ci0KLQkgIC8qIFRoZSBzZWN0aW9uIG9mIGEgY29tbW9uIHN5bWJvbCBpcyBvbmx5IHVzZWQgaWYgdGhlIGNvbW1vbgotICAgICAgICAgICAgIHN5bWJvbCBpcyBhY3R1YWxseSBhbGxvY2F0ZWQuICBJdCBiYXNpY2FsbHkgcHJvdmlkZXMgYQotICAgICAgICAgICAgIGhvb2sgZm9yIHRoZSBsaW5rZXIgc2NyaXB0IHRvIGRlY2lkZSB3aGljaCBvdXRwdXQgc2VjdGlvbgotICAgICAgICAgICAgIHRoZSBjb21tb24gc3ltYm9scyBzaG91bGQgYmUgcHV0IGluLiAgSW4gbW9zdCBjYXNlcywgdGhlCi0gICAgICAgICAgICAgc2VjdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wgd2lsbCBiZSBiZmRfY29tX3NlY3Rpb25fcHRyLAotICAgICAgICAgICAgIHRoZSBjb2RlIGhlcmUgd2lsbCBjaG9vc2UgYSBjb21tb24gc3ltYm9sIHNlY3Rpb24gbmFtZWQKLSAgICAgICAgICAgICAiQ09NTU9OIiwgYW5kIHRoZSBsaW5rZXIgc2NyaXB0IHdpbGwgY29udGFpbiAqKENPTU1PTikgaW4KLSAgICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgcGxhY2UuICBBIGZldyB0YXJnZXRzIHVzZSBzZXBhcmF0ZSBjb21tb24KLSAgICAgICAgICAgICBzZWN0aW9ucyBmb3Igc21hbGwgc3ltYm9scywgYW5kIHRoZXkgcmVxdWlyZSBzcGVjaWFsCi0gICAgICAgICAgICAgaGFuZGxpbmcuICAqLwotCSAgaWYgKHNlY3Rpb24gPT0gYmZkX2NvbV9zZWN0aW9uX3B0cikKLQkgICAgewotCSAgICAgIGgtPnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiQ09NTU9OIik7Ci0JICAgICAgaC0+dS5jLnAtPnNlY3Rpb24tPmZsYWdzID0gU0VDX0FMTE9DOwotCSAgICB9Ci0JICBlbHNlIGlmIChzZWN0aW9uLT5vd25lciAhPSBhYmZkKQotCSAgICB7Ci0JICAgICAgaC0+dS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsCi0JCQkJCQkJICAgIHNlY3Rpb24tPm5hbWUpOwotCSAgICAgIGgtPnUuYy5wLT5zZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQkgICAgfQotCSAgZWxzZQotCSAgICBoLT51LmMucC0+c2VjdGlvbiA9IHNlY3Rpb247Ci0JICBicmVhazsKLQotCWNhc2UgUkVGOgotCSAgLyogQSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkIHN5bWJvbC4gICovCi0JICBpZiAoaC0+bmV4dCA9PSBOVUxMICYmIGluZm8tPmhhc2gtPnVuZGVmc190YWlsICE9IGgpCi0JICAgIGgtPm5leHQgPSBoOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJJRzoKLQkgIC8qIFdlIGhhdmUgZm91bmQgYSBjb21tb24gZGVmaW5pdGlvbiBmb3IgYSBzeW1ib2wgd2hpY2gKLQkgICAgIGFscmVhZHkgaGFkIGEgY29tbW9uIGRlZmluaXRpb24uICBVc2UgdGhlIG1heGltdW0gb2YgdGhlCi0JICAgICB0d28gc2l6ZXMuICAqLwotCSAgQkZEX0FTU0VSVCAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbik7Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2NvbW1vbikKLQkJIChpbmZvLCBoLT5yb290LnN0cmluZywKLQkJICBoLT51LmMucC0+c2VjdGlvbi0+b3duZXIsIGJmZF9saW5rX2hhc2hfY29tbW9uLCBoLT51LmMuc2l6ZSwKLQkJICBhYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgdmFsdWUpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKHZhbHVlID4gaC0+dS5jLnNpemUpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgcG93ZXI7Ci0KLQkgICAgICBoLT51LmMuc2l6ZSA9IHZhbHVlOwotCi0JICAgICAgLyogU2VsZWN0IGEgZGVmYXVsdCBhbGlnbm1lbnQgYmFzZWQgb24gdGhlIHNpemUuICBUaGlzIG1heQotCQkgYmUgb3ZlcnJpZGRlbiBieSB0aGUgY2FsbGVyLiAgKi8KLQkgICAgICBwb3dlciA9IGJmZF9sb2cyICh2YWx1ZSk7Ci0JICAgICAgaWYgKHBvd2VyID4gNCkKLQkJcG93ZXIgPSA0OwotCSAgICAgIGgtPnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIgPSBwb3dlcjsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIENSRUY6Ci0JICB7Ci0JICAgIGJmZCAqb2JmZDsKLQotCSAgICAvKiBXZSBoYXZlIGZvdW5kIGEgY29tbW9uIGRlZmluaXRpb24gZm9yIGEgc3ltYm9sIHdoaWNoCi0JICAgICAgIHdhcyBhbHJlYWR5IGRlZmluZWQuICBGSVhNRTogSXQgd291bGQgbmljZSBpZiB3ZSBjb3VsZAotCSAgICAgICByZXBvcnQgdGhlIEJGRCB3aGljaCBkZWZpbmVkIGFuIGluZGlyZWN0IHN5bWJvbCwgYnV0IHdlCi0JICAgICAgIGRvbid0IGhhdmUgYW55d2hlcmUgdG8gc3RvcmUgdGhlIGluZm9ybWF0aW9uLiAgKi8KLQkgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCXx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICAgIG9iZmQgPSBoLT51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQkgICAgZWxzZQotCSAgICAgIG9iZmQgPSBOVUxMOwotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2NvbW1vbikKLQkJICAgKGluZm8sIGgtPnJvb3Quc3RyaW5nLCBvYmZkLCBoLT50eXBlLCAoYmZkX3ZtYSkgMCwKLQkJICAgIGFiZmQsIGJmZF9saW5rX2hhc2hfY29tbW9uLCB2YWx1ZSkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBNSU5EOgotCSAgLyogTXVsdGlwbGUgaW5kaXJlY3Qgc3ltYm9scy4gIFRoaXMgaXMgT0sgaWYgdGhleSBib3RoIHBvaW50Ci0JICAgICB0byB0aGUgc2FtZSBzeW1ib2wuICAqLwotCSAgaWYgKHN0cmNtcCAoaC0+dS5pLmxpbmstPnJvb3Quc3RyaW5nLCBzdHJpbmcpID09IDApCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIE1ERUY6Ci0JICAvKiBIYW5kbGUgYSBtdWx0aXBsZSBkZWZpbml0aW9uLiAgKi8KLQkgIHsKLQkgICAgYXNlY3Rpb24gKm1zZWM7Ci0JICAgIGJmZF92bWEgbXZhbDsKLQotCSAgICBzd2l0Y2ggKGgtPnR5cGUpCi0JICAgICAgewotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCQltc2VjID0gaC0+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+dS5yZWxvYy5wLT5hZGRlbmQsCi0JCSAgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgewotCSAgICAgIGZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCAoUFRSKSBidWYsCi0JCQkJICAgICAoZmlsZV9wdHIpIGxpbmtfb3JkZXItPm9mZnNldCwgc2l6ZSk7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgaWYgKCEgb2spCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICByLT5hZGRlbmQgPSAwOwotICAgIH0KLQotICBzZWMtPm9yZWxvY2F0aW9uW3NlYy0+cmVsb2NfY291bnRdID0gcjsKLSAgKytzZWMtPnJlbG9jX2NvdW50OwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogQWxsb2NhdGUgYSBuZXcgbGlua19vcmRlciBmb3IgYSBzZWN0aW9uLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX29yZGVyICoKLWJmZF9uZXdfbGlua19vcmRlciAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpuZXc7Ci0KLSAgbmV3ID0gKChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19vcmRlcikpKTsKLSAgaWYgKCFuZXcpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbmV3LT50eXBlID0gYmZkX3VuZGVmaW5lZF9saW5rX29yZGVyOwotICBuZXctPm9mZnNldCA9IDA7Ci0gIG5ldy0+c2l6ZSA9IDA7Ci0gIG5ldy0+bmV4dCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQotICBpZiAoc2VjdGlvbi0+bGlua19vcmRlcl90YWlsICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTCkKLSAgICBzZWN0aW9uLT5saW5rX29yZGVyX3RhaWwtPm5leHQgPSBuZXc7Ci0gIGVsc2UKLSAgICBzZWN0aW9uLT5saW5rX29yZGVyX2hlYWQgPSBuZXc7Ci0gIHNlY3Rpb24tPmxpbmtfb3JkZXJfdGFpbCA9IG5ldzsKLQotICByZXR1cm4gbmV3OwotfQotCi0vKiBEZWZhdWx0IGxpbmsgb3JkZXIgcHJvY2Vzc2luZyByb3V0aW5lLiAgTm90ZSB0aGF0IHdlIGNhbiBub3QgaGFuZGxlCi0gICB0aGUgcmVsb2NfbGlua19vcmRlciB0eXBlcyBoZXJlLCBzaW5jZSB0aGV5IGRlcGVuZCB1cG9uIHRoZSBkZXRhaWxzCi0gICBvZiBob3cgdGhlIHBhcnRpY3VsYXIgYmFja2VuZHMgZ2VuZXJhdGVzIHJlbG9jcy4gICovCi0KLWJvb2xlYW4KLV9iZmRfZGVmYXVsdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBzZWMsIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLXsKLSAgc3dpdGNoIChsaW5rX29yZGVyLT50eXBlKQotICAgIHsKLSAgICBjYXNlIGJmZF91bmRlZmluZWRfbGlua19vcmRlcjoKLSAgICBjYXNlIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXI6Ci0gICAgY2FzZSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXI6Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgYmZkX2luZGlyZWN0X2xpbmtfb3JkZXI6Ci0gICAgICByZXR1cm4gZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBzZWMsIGxpbmtfb3JkZXIsCi0JCQkJCSAgZmFsc2UpOwotICAgIGNhc2UgYmZkX2ZpbGxfbGlua19vcmRlcjoKLSAgICAgIHJldHVybiBkZWZhdWx0X2ZpbGxfbGlua19vcmRlciAoYWJmZCwgaW5mbywgc2VjLCBsaW5rX29yZGVyKTsKLSAgICBjYXNlIGJmZF9kYXRhX2xpbmtfb3JkZXI6Ci0gICAgICByZXR1cm4gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsCi0JCQkJICAgICAgIChQVFIpIGxpbmtfb3JkZXItPnUuZGF0YS5jb250ZW50cywKLQkJCQkgICAgICAgKGZpbGVfcHRyKSBsaW5rX29yZGVyLT5vZmZzZXQsCi0JCQkJICAgICAgIGxpbmtfb3JkZXItPnNpemUpOwotICAgIH0KLX0KLQotLyogRGVmYXVsdCByb3V0aW5lIHRvIGhhbmRsZSBhIGJmZF9maWxsX2xpbmtfb3JkZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1kZWZhdWx0X2ZpbGxfbGlua19vcmRlciAoYWJmZCwgaW5mbywgc2VjLCBsaW5rX29yZGVyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIHNpemVfdCBzaXplOwotICBjaGFyICpzcGFjZTsKLSAgc2l6ZV90IGk7Ci0gIGludCBmaWxsOwotICBib29sZWFuIHJlc3VsdDsKLQotICBCRkRfQVNTRVJUICgoc2VjLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApOwotCi0gIHNpemUgPSAoc2l6ZV90KSBsaW5rX29yZGVyLT5zaXplOwotICBzcGFjZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKHNpemUpOwotICBpZiAoc3BhY2UgPT0gTlVMTCAmJiBzaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZpbGwgPSBsaW5rX29yZGVyLT51LmZpbGwudmFsdWU7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IDIpCi0gICAgc3BhY2VbaV0gPSBmaWxsID4+IDg7Ci0gIGZvciAoaSA9IDE7IGkgPCBzaXplOyBpICs9IDIpCi0gICAgc3BhY2VbaV0gPSBmaWxsOwotICByZXN1bHQgPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgc3BhY2UsCi0JCQkJICAgICAoZmlsZV9wdHIpIGxpbmtfb3JkZXItPm9mZnNldCwKLQkJCQkgICAgIGxpbmtfb3JkZXItPnNpemUpOwotICBmcmVlIChzcGFjZSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIERlZmF1bHQgcm91dGluZSB0byBoYW5kbGUgYSBiZmRfaW5kaXJlY3RfbGlua19vcmRlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIGluZm8sIG91dHB1dF9zZWN0aW9uLCBsaW5rX29yZGVyLAotCQkJICAgICBnZW5lcmljX2xpbmtlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJvb2xlYW4gZ2VuZXJpY19saW5rZXI7Ci17Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICBiZmQgKmlucHV0X2JmZDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKm5ld19jb250ZW50czsKLQotICBCRkRfQVNTRVJUICgob3V0cHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCk7Ci0KLSAgaWYgKGxpbmtfb3JkZXItPnNpemUgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLQotICBCRkRfQVNTRVJUIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBvdXRwdXRfc2VjdGlvbik7Ci0gIEJGRF9BU1NFUlQgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgPT0gbGlua19vcmRlci0+b2Zmc2V0KTsKLSAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplID09IGxpbmtfb3JkZXItPnNpemUpOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMAotICAgICAgJiYgb3V0cHV0X3NlY3Rpb24tPm9yZWxvY2F0aW9uID09IChhcmVsZW50ICoqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNwYWNlIGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQgZm9yIHRoZSBvdXRwdXQgcmVsb2NhdGlvbnMuCi0JIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFyZSBjYWxsZWQgYnkgYSBzcGVjaWZpYyBiYWNrZW5kCi0JIGJlY2F1c2Ugc29tZWJvZHkgaXMgYXR0ZW1wdGluZyB0byBsaW5rIHRvZ2V0aGVyIGRpZmZlcmVudAotCSB0eXBlcyBvZiBvYmplY3QgZmlsZXMuICBIYW5kbGluZyB0aGlzIGNhc2UgY29ycmVjdGx5IGlzCi0JIGRpZmZpY3VsdCwgYW5kIHNvbWV0aW1lcyBpbXBvc3NpYmxlLiAgKi8KLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCJBdHRlbXB0IHRvIGRvIHJlbG9jYXRlYWJsZSBsaW5rIHdpdGggJXMgaW5wdXQgYW5kICVzIG91dHB1dCIpLAotCSBiZmRfZ2V0X3RhcmdldCAoaW5wdXRfYmZkKSwgYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBnZW5lcmljX2xpbmtlcikKLSAgICB7Ci0gICAgICBhc3ltYm9sICoqc3ltcHA7Ci0gICAgICBhc3ltYm9sICoqc3ltcHBlbmQ7Ci0KLSAgICAgIC8qIEdldCB0aGUgY2Fub25pY2FsIHN5bWJvbHMuICBUaGUgZ2VuZXJpYyBsaW5rZXIgd2lsbCBhbHdheXMKLQkgaGF2ZSByZXRyaWV2ZWQgdGhlbSBieSB0aGlzIHBvaW50LCBidXQgd2UgYXJlIGJlaW5nIGNhbGxlZCBieQotCSBhIHNwZWNpZmljIGxpbmtlciwgcHJlc3VtYWJseSBiZWNhdXNlIHdlIGFyZSBsaW5raW5nCi0JIGRpZmZlcmVudCB0eXBlcyBvZiBvYmplY3QgZmlsZXMgdG9nZXRoZXIuICAqLwotICAgICAgaWYgKCEgZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyAoaW5wdXRfYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFNpbmNlIHdlIGhhdmUgYmVlbiBjYWxsZWQgYnkgYSBzcGVjaWZpYyBsaW5rZXIsIHJhdGhlciB0aGFuCi0JIHRoZSBnZW5lcmljIGxpbmtlciwgdGhlIHZhbHVlcyBvZiB0aGUgc3ltYm9scyB3aWxsIG5vdCBiZQotCSByaWdodC4gIFRoZXkgd2lsbCBiZSB0aGUgdmFsdWVzIGFzIHNlZW4gaW4gdGhlIGlucHV0IGZpbGUsCi0JIG5vdCB0aGUgdmFsdWVzIG9mIHRoZSBmaW5hbCBsaW5rLiAgV2UgbmVlZCB0byBmaXggdGhlbSB1cAotCSBiZWZvcmUgd2UgY2FuIHJlbG9jYXRlIHRoZSBzZWN0aW9uLiAgKi8KLSAgICAgIHN5bXBwID0gX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGlucHV0X2JmZCk7Ci0gICAgICBzeW1wcGVuZCA9IHN5bXBwICsgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50IChpbnB1dF9iZmQpOwotICAgICAgZm9yICg7IHN5bXBwIDwgc3ltcHBlbmQ7IHN5bXBwKyspCi0JewotCSAgYXN5bWJvbCAqc3ltOwotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIHN5bSA9ICpzeW1wcDsKLQotCSAgaWYgKChzeW0tPmZsYWdzICYgKEJTRl9JTkRJUkVDVAotCQkJICAgICB8IEJTRl9XQVJOSU5HCi0JCQkgICAgIHwgQlNGX0dMT0JBTAotCQkJICAgICB8IEJTRl9DT05TVFJVQ1RPUgotCQkJICAgICB8IEJTRl9XRUFLKSkgIT0gMAotCSAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKQotCSAgICAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKQotCSAgICAgIHx8IGJmZF9pc19pbmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQkgICAgewotCSAgICAgIC8qIHN5bS0+dWRhdGEgbWF5IGhhdmUgYmVlbiBzZXQgYnkKLQkJIGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QuICAqLwotCSAgICAgIGlmIChzeW0tPnVkYXRhLnAgIT0gTlVMTCkKLQkJaCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBzeW0tPnVkYXRhLnA7Ci0JICAgICAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCQloID0gYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgaW5mbywKLQkJCQkJCSAgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwKLQkJCQkJCSAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkgICAgICBlbHNlCi0JCWggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwKLQkJCQkJICBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLAotCQkJCQkgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JICAgICAgaWYgKGggIT0gTlVMTCkKLQkJc2V0X3N5bWJvbF9mcm9tX2hhc2ggKHN5bSwgaCk7Ci0JICAgIH0KLQl9CSAgCi0gICAgfQotCi0gIC8qIEdldCBhbmQgcmVsb2NhdGUgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICBjb250ZW50cyA9ICgoYmZkX2J5dGUgKikKLQkgICAgICBiZmRfbWFsbG9jIChiZmRfc2VjdGlvbl9zaXplIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKSk7Ci0gIGlmIChjb250ZW50cyA9PSBOVUxMICYmIGJmZF9zZWN0aW9uX3NpemUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbmV3X2NvbnRlbnRzID0gKGJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLQkJICAob3V0cHV0X2JmZCwgaW5mbywgbGlua19vcmRlciwgY29udGVudHMsIGluZm8tPnJlbG9jYXRlYWJsZSwKLQkJICAgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGlucHV0X2JmZCkpKTsKLSAgaWYgKCFuZXdfY29udGVudHMpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogT3V0cHV0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBvdXRwdXRfc2VjdGlvbiwKLQkJCQkgIChQVFIpIG5ld19jb250ZW50cywKLQkJCQkgIGxpbmtfb3JkZXItPm9mZnNldCwgbGlua19vcmRlci0+c2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGNvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoY29udGVudHMpOwotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGNvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoY29udGVudHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEEgbGl0dGxlIHJvdXRpbmUgdG8gY291bnQgdGhlIG51bWJlciBvZiByZWxvY3MgaW4gYSBsaW5rX29yZGVyCi0gICBsaXN0LiAgKi8KLQotdW5zaWduZWQgaW50Ci1fYmZkX2NvdW50X2xpbmtfb3JkZXJfcmVsb2NzIChsaW5rX29yZGVyKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBjOwotICByZWdpc3RlciBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmw7Ci0KLSAgYyA9IDA7Ci0gIGZvciAobCA9IGxpbmtfb3JkZXI7IGwgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JICB8fCBsLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkrK2M7Ci0gICAgfQotCi0gIHJldHVybiBjOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfbGlua19zcGxpdF9zZWN0aW9uCi0KLVNZTk9QU0lTCi0gICAgICAgIGJvb2xlYW4gYmZkX2xpbmtfc3BsaXRfc2VjdGlvbihiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBub256ZXJvIGlmIEB2YXJ7c2VjfSBzaG91bGQgYmUgc3BsaXQgZHVyaW5nIGEKLQlyZWxvY2VhdGFibGUgb3IgZmluYWwgbGluay4KLQotLiNkZWZpbmUgYmZkX2xpbmtfc3BsaXRfc2VjdGlvbihhYmZkLCBzZWMpIFwKLS4gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbGlua19zcGxpdF9zZWN0aW9uLCAoYWJmZCwgc2VjKSkKLS4KLQotKi8KLQotCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24gKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9iZmQvbHlueC1jb3JlLmMgYi9iZmQvbHlueC1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNTgxNzcuLjAwMDAwMDAKLS0tIGEvYmZkL2x5bngtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qIEJGRCBiYWNrIGVuZCBmb3IgTHlueCBjb3JlIGZpbGVzCi0gICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3R1IEdyb3NzbWFuIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmZGVmIExZTlhfQ09SRQotCi0jaW5jbHVkZSA8c3lzL2NvbmYuaD4KLSNpbmNsdWRlIDxzeXMva2VybmVsLmg+Ci0vKiBzeXMva2VybmVsLmggc2hvdWxkIGRlZmluZSB0aGlzLCBidXQgZG9lc24ndCBhbHdheXMsIHNpZ2guICovCi0jaWZuZGVmIF9fTFlOWE9TCi0jZGVmaW5lIF9fTFlOWE9TCi0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvbWVtLmg+Ci0jaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jaW5jbHVkZSA8c3lzL2l0aW1lci5oPgotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8c3lzL3Byb2MuaD4KLQotLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEgKi8KLQotc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QgCi17Ci0gIGludCBzaWc7Ci0gIGNoYXIgY21kW1BOTUxFTiArIDFdOwotfTsKLQotI2RlZmluZSBjb3JlX2hkcihiZmQpICgoYmZkKS0+dGRhdGEubHlueF9jb3JlX2RhdGEpCi0jZGVmaW5lIGNvcmVfc2lnbmFsKGJmZCkgKGNvcmVfaGRyKGJmZCktPnNpZykKLSNkZWZpbmUgY29yZV9jb21tYW5kKGJmZCkgKGNvcmVfaGRyKGJmZCktPmNtZCkKLQotLyogSGFuZGxlIEx5bnggY29yZSBkdW1wIGZpbGUuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgZmlsZXBvcykKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBhc2VjdGlvbiAqYXNlY3Q7Ci0gIGNoYXIgKm5ld25hbWU7Ci0KLSAgbmV3bmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChuYW1lKSArIDEpOwotICBpZiAoIW5ld25hbWUpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3RyY3B5IChuZXduYW1lLCBuYW1lKTsKLQotICBhc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5ld25hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+dm1hID0gdm1hOwotICBhc2VjdC0+ZmlsZXBvcyA9IGZpbGVwb3M7Ci0gIGFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIHJldHVybiBhc2VjdDsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWNvbnN0IGJmZF90YXJnZXQgKgotbHlueF9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgdmFsOwotICBpbnQgc2VjbnVtOwotICBzdHJ1Y3QgcHNzZW50cnkgcHNzOwotICBzaXplX3QgdGNvbnRleHRfc2l6ZTsKLSAgY29yZV9zdF90ICp0aHJlYWRwOwotICBpbnQgcGFnZXNpemU7Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotCi0gIHBhZ2VzaXplID0gZ2V0cGFnZXNpemUgKCk7CS8qIFNlcmlvdXMgY3Jvc3MtdGFyZ2V0IGlzc3VlIGhlcmUuLi4gIFRoaXMKLQkJCQkgICByZWFsbHkgbmVlZHMgdG8gY29tZSBmcm9tIGEgc3lzdGVtLXNwZWNpZmljCi0JCQkJICAgaGVhZGVyIGZpbGUuICAqLwotCi0gIC8qIEdldCB0aGUgcHNzIGVudHJ5IGZyb20gdGhlIGNvcmUgZmlsZSAqLwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdmFsID0gYmZkX3JlYWQgKCh2b2lkICopJnBzcywgMSwgc2l6ZW9mIHBzcywgYWJmZCk7Ci0gIGlmICh2YWwgIT0gc2l6ZW9mIHBzcykKLSAgICB7Ci0gICAgICAvKiBUb28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBjb3JlX2hkciAoYWJmZCkgPSAoc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBseW54X2NvcmVfc3RydWN0KSk7Ci0KLSAgaWYgKCFjb3JlX2hkciAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3RybmNweSAoY29yZV9jb21tYW5kIChhYmZkKSwgcHNzLnBuYW1lLCBQTk1MRU4gKyAxKTsKLQotICAvKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSB0aHJlYWQgY29udGV4dHMgKi8KLQotICB0Y29udGV4dF9zaXplID0gcHNzLnRocmVhZGNudCAqIHNpemVvZiAoY29yZV9zdF90KTsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHRocmVhZCBjb250ZXh0cyAqLwotCi0gIHRocmVhZHAgPSAoY29yZV9zdF90ICopYmZkX2FsbG9jIChhYmZkLCB0Y29udGV4dF9zaXplKTsKLSAgaWYgKCF0aHJlYWRwKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFNhdmUgdGhyZWFkIGNvbnRleHRzICovCi0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBwYWdlc2l6ZSwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdmFsID0gYmZkX3JlYWQgKCh2b2lkICopdGhyZWFkcCwgcHNzLnRocmVhZGNudCwgc2l6ZW9mIChjb3JlX3N0X3QpLCBhYmZkKTsKLQotICBpZiAodmFsICE9IHRjb250ZXh0X3NpemUpCi0gICAgewotICAgICAgLyogUHJvYmFibHkgdG9vIHNtYWxsIHRvIGJlIGEgY29yZSBmaWxlICovCi0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIAotICBjb3JlX3NpZ25hbCAoYWJmZCkgPSB0aHJlYWRwLT5jdXJyc2lnOwotCi0gIG5ld3NlY3QgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5zdGFjayIsCi0JCQkgICAgICAgU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAgICAgIHBzcy5zc2l6ZSwKLQkJCSAgICAgICBwc3Muc2xpbWl0LAotCQkJICAgICAgIHBhZ2VzaXplICsgdGNvbnRleHRfc2l6ZSk7Ci0gIGlmICghbmV3c2VjdCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBuZXdzZWN0ID0gbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCi0JCQkgICAgICAgU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAgICAgIHBzcy5kYXRhX2xlbiArIHBzcy5ic3NfbGVuLAotCQkJICAgICAgIHBzcy5kYXRhX3N0YXJ0LAotCQkJICAgICAgIHBhZ2VzaXplICsgdGNvbnRleHRfc2l6ZSArIHBzcy5zc2l6ZQotI2lmIGRlZmluZWQgKFNQQVJDKSB8fCBkZWZpbmVkIChfX1NQQVJDX18pCi0JCQkgICAgICAgLyogU1BBUkMgTHlueCBzZWVtcyB0byBzdGFydCBkdW1waW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIC5kYXRhIHNlY3Rpb24gYXQgYSBwYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnkuICBJdCdzIE9LIHRvIGNoZWNrIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZGVmaW5lIGxpa2UgU1BBUkMgaGVyZSBiZWNhdXNlIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGNhbiBvbmx5IGJlIGNvbXBpbGVkIG9uIGEgTHlueAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QuICAqLwotCQkJICAgICAgICsgcHNzLmRhdGFfc3RhcnQgJSBwYWdlc2l6ZQotI2VuZGlmCi0JCQkgICAgICAgKTsKLSAgaWYgKCFuZXdzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0vKiBBbmQsIG5vdyBmb3IgdGhlIC5yZWcvWFhYIHBzZXVkbyBzZWN0aW9ucy4gIEVhY2ggdGhyZWFkIGhhcyBpdCdzIG93bgotICAgLnJlZy9YWFggc2VjdGlvbiwgd2hlcmUgWFhYIGlzIHRoZSB0aHJlYWQgaWQgKHdpdGhvdXQgbGVhZGluZyB6ZXJvcykuICBUaGUKLSAgIGN1cnJlbnRseSBydW5uaW5nIHRocmVhZCAoYXQgdGhlIHRpbWUgb2YgdGhlIGNvcmUgZHVtcCkgYWxzbyBoYXMgYW4gYWxpYXMKLSAgIGNhbGxlZCBgLnJlZycgKGp1c3QgdG8ga2VlcCBHREIgaGFwcHkpLiAgTm90ZSB0aGF0IHdlIHVzZSBgLnJlZy9YWFgnIGFzCi0gICBvcHBvc2VkIHRvIGAucmVnWFhYJyBiZWNhdXNlIEdEQiBleHBlY3RzIHRoYXQgLnJlZzIgd2lsbCBiZSB0aGUgZmxvYXRpbmctCi0gICBwb2ludCByZWdpc3RlcnMuICAqLwotCi0gIG5ld3NlY3QgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAotCQkJICAgICAgIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgICAgICAgc2l6ZW9mIChjb3JlX3N0X3QpLAotCQkJICAgICAgIDAsCi0JCQkgICAgICAgcGFnZXNpemUpOwotICBpZiAoIW5ld3NlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yIChzZWNudW0gPSAwOyBzZWNudW0gPCBwc3MudGhyZWFkY250OyBzZWNudW0rKykKLSAgICB7Ci0gICAgICBjaGFyIHNlY25hbWVbMTAwXTsKLQotICAgICAgc3ByaW50ZiAoc2VjbmFtZSwgIi5yZWcvJWQiLCBCVUlMRFBJRCAoMCwgdGhyZWFkcFtzZWNudW1dLnRpZCkpOwotICAgICAgbmV3c2VjdCA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBzZWNuYW1lLAotCQkJCSAgIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJICAgc2l6ZW9mIChjb3JlX3N0X3QpLAotCQkJCSAgIDAsCi0JCQkJICAgcGFnZXNpemUgKyBzZWNudW0gKiBzaXplb2YgKGNvcmVfc3RfdCkpOwotICAgICAgaWYgKCFuZXdzZWN0KQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotY2hhciAqCi1seW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfY29tbWFuZCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1pbnQKLWx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1ib29sZWFuCi1seW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsJCS8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KLX0KLQotI2VuZGlmIC8qIExZTlhfQ09SRSAqLwpkaWZmIC0tZ2l0IGEvYmZkL202OGs0a25ldGJzZC5jIGIvYmZkL202OGs0a25ldGJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDM0MzhkLi4wMDAwMDAwCi0tLSBhL2JmZC9tNjhrNGtuZXRic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTmV0QlNEL202OGsgYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQllURVNfSU5fV09SRAk0Ci0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFCTB4MTAwMAotCi0jZGVmaW5lIERFRkFVTFRfQVJDSAliZmRfYXJjaF9tNjhrCi0jZGVmaW5lIERFRkFVTFRfTUlEIAlNXzY4SzRLX05FVEJTRAotCi0jZGVmaW5lIE1ZKE9QKSBDQVQobTY4azRrbmV0YnNkXyxPUCkKLS8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW02OGs0ay1uZXRic2QiCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9tNjhrbGludXguYyBiL2JmZC9tNjhrbGludXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmNDdhOC4uMDAwMDAwMAotLS0gYS9iZmQvbTY4a2xpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzIgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBsaW51eCBmbGF2b3JlZCBtNjhrIGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBaTUFHSUNfRElTS19CTE9DS19TSVpFIDEwMjQKLSNkZWZpbmUJU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCTB4MAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLQotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV82ODAyMCB8fCAobXR5cGUpID09IE1fVU5LTk9XTikKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotI2RlZmluZSBNWShPUCkgQ0FUKG02OGtsaW51eF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW02OGstbGludXgiCi0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IE1ZKHZlYyk7Ci0KLS8qIFdlIGFsd2F5cyBnZW5lcmF0ZSBRTUFHSUMgZmlsZXMgaW4gcHJlZmVyZW5jZSB0byBaTUFHSUMgZmlsZXMuICBJdAotICAgd291bGQgYmUgcG9zc2libGUgdG8gbWFrZSB0aGlzIGEgbGlua2VyIG9wdGlvbiwgaWYgdGhhdCBldmVyCi0gICBiZWNvbWVzIGltcG9ydGFudC4gICovCi0KLXN0YXRpYyB2b2lkIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosIGZpbGVfcHRyICopKTsKLXN0YXRpYyBib29sZWFuIG02OGtsaW51eF9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gbTY4a2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotbTY4a2xpbnV4X2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID0gcV9tYWdpY19mb3JtYXQ7Ci0gIHJldHVybiBOQU1FKGFvdXQsZmluYWxfbGluaykgKGFiZmQsIGluZm8sIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOwotfQotCi0jZGVmaW5lIE1ZX2JmZF9maW5hbF9saW5rIG02OGtsaW51eF9iZmRfZmluYWxfbGluawotCi0vKiBTZXQgdGhlIG1hY2hpbmUgdHlwZSBjb3JyZWN0bHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbTY4a2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV82ODAyMCk7Ci0KLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIG02OGtsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMKLQwKLS8qIENvZGUgdG8gbGluayBhZ2FpbnN0IExpbnV4IGEub3V0IHNoYXJlZCBsaWJyYXJpZXMuICAqLwotCi0vKiBTZWUgaWYgYSBzeW1ib2wgbmFtZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0KLSNpZm5kZWYgR09UX1JFRl9QUkVGSVgKLSNkZWZpbmUJR09UX1JFRl9QUkVGSVgJIl9fR09UXyIKLSNlbmRpZgotCi0jZGVmaW5lIElTX0dPVF9TWU0obmFtZSkgXAotICAoc3RybmNtcCAobmFtZSwgR09UX1JFRl9QUkVGSVgsIHNpemVvZiBHT1RfUkVGX1BSRUZJWCAtIDEpID09IDApCi0KLS8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNpZm5kZWYgUExUX1JFRl9QUkVGSVgKLSNkZWZpbmUJUExUX1JFRl9QUkVGSVgJIl9fUExUXyIKLSNlbmRpZgotCi0jZGVmaW5lIElTX1BMVF9TWU0obmFtZSkgXAotICAoc3RybmNtcCAobmFtZSwgUExUX1JFRl9QUkVGSVgsIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpID09IDApCi0KLS8qIFRoaXMgc3RyaW5nIGlzIHVzZWQgdG8gZ2VuZXJhdGUgc3BlY2lhbGl6ZWQgZXJyb3IgbWVzc2FnZXMuICAqLwotCi0jaWZuZGVmIE5FRURTX1NIUkxJQgotI2RlZmluZSBORUVEU19TSFJMSUIgIl9fTkVFRFNfU0hSTElCXyIKLSNlbmRpZgotCi0vKiBUaGlzIHNwZWNpYWwgc3ltYm9sIGlzIGEgc2V0IHZlY3RvciB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZgotICAgcG9pbnRlcnMgdG8gZml4dXAgdGFibGVzLiAgSXQgd2lsbCBiZSBwcmVzZW50IGluIGFueSBkeW5hbWljbHkKLSAgIGxpbmtlZCBmaWxlLiAgVGhlIGxpbmtlciBnZW5lcmF0ZWQgZml4dXAgdGFibGUgc2hvdWxkIGFsc28gYmUgYWRkZWQKLSAgIHRvIHRoZSBsaXN0LCBhbmQgaXQgc2hvdWxkIGFsd2F5cyBhcHBlYXIgaW4gdGhlIHNlY29uZCBzbG90ICh0aGUKLSAgIGZpcnN0IG9uZSBpcyBhIGR1bW15IHdpdGggYSBtYWdpYyBudW1iZXIgdGhhdCBpcyBkZWZpbmVkIGluCi0gICBjcnQwLm8pLiAgKi8KLQotI2lmbmRlZiBTSEFSQUJMRV9DT05GTElDVFMKLSNkZWZpbmUgU0hBUkFCTEVfQ09ORkxJQ1RTICJfX1NIQVJBQkxFX0NPTkZMSUNUU19fIgotI2VuZGlmCi0KLS8qIFdlIGtlZXAgYSBsaXN0IG9mIGZpeHVwcy4gIFRoZSB0ZXJtaW5vbG9neSBpcyBhIGJpdCBzdHJhbmdlLCBidXQKLSAgIGVhY2ggZml4dXAgY29udGFpbnMgdHdvIDMyIGJpdCBudW1iZXJzLiAgQSByZWd1bGFyIGZpeHVwIGNvbnRhaW5zCi0gICBhbiBhZGRyZXNzIGFuZCBhIHBvaW50ZXIsIGFuZCBhdCBydW50aW1lIHdlIHNob3VsZCBzdG9yZSB0aGUKLSAgIGFkZHJlc3MgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIHBvaW50ZXIuICBBIGJ1aWx0aW4gZml4dXAKLSAgIGNvbnRhaW5zIHR3byBwb2ludGVycywgYW5kIHdlIHNob3VsZCByZWFkIHRoZSBhZGRyZXNzIHVzaW5nIG9uZQotICAgcG9pbnRlciBhbmQgc3RvcmUgaXQgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIG90aGVyCi0gICBwb2ludGVyLiAgQnVpbHRpbiBmaXh1cHMgY29tZSBpbnRvIHBsYXkgd2hlbiB3ZSBoYXZlIGR1cGxpY2F0ZQotICAgX19HT1RfXyBzeW1ib2xzIGZvciB0aGUgc2FtZSB2YXJpYWJsZS4gIFRoZSBidWlsdGluIGZpeHVwIHdpbGwgY29weQotICAgdGhlIEdPVCBwb2ludGVyIGZyb20gb25lIG92ZXIgaW50byB0aGUgb3RoZXIuICAqLwotCi1zdHJ1Y3QgZml4dXAKLXsKLSAgc3RydWN0IGZpeHVwICpuZXh0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBiZmRfdm1hIHZhbHVlOwotCi0gIC8qIE5vbnplcm8gaWYgdGhpcyBpcyBhIGp1bXAgaW5zdHJ1Y3Rpb24gdGhhdCBuZWVkcyB0byBiZSBmaXhlZCwKLSAgICAgemVybyBpZiB0aGlzIGlzIGp1c3QgYSBwb2ludGVyICovCi0gIGNoYXIganVtcDsKLQotICBjaGFyIGJ1aWx0aW47Ci19OwotCi0vKiBXZSBkb24ndCBuZWVkIGEgc3BlY2lhbCBoYXNoIHRhYmxlIGVudHJ5IHN0cnVjdHVyZSwgYnV0IHdlIGRvIG5lZWQKLSAgIHRvIGtlZXAgc29tZSBpbmZvcm1hdGlvbiBiZXR3ZWVuIGxpbmtlciBwYXNzZXMsIHNvIHdlIHVzZSBhIHNwZWNpYWwKLSAgIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSByb290OwotfTsKLQotc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBGaXJzdCBkeW5hbWljIG9iamVjdCBmb3VuZCBpbiBsaW5rLiAgKi8KLSAgYmZkICpkeW5vYmo7Ci0KLSAgLyogTnVtYmVyIG9mIGZpeHVwcy4gICovCi0gIHNpemVfdCBmaXh1cF9jb3VudDsKLQotICAvKiBOdW1iZXIgb2YgYnVpbHRpbiBmaXh1cHMuICAqLwotICBzaXplX3QgbG9jYWxfYnVpbHRpbnM7Ci0KLSAgLyogTGlzdCBvZiBmaXh1cHMuICAqLwotICBzdHJ1Y3QgZml4dXAgKmZpeHVwX2xpc3Q7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpsaW51eF9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgc3RydWN0IGZpeHVwICpuZXdfZml4dXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gbGludXhfYWRkX29uZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0JICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLAotCSAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF90YWxseV9zeW1ib2xzCi0gIFBBUkFNUyAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9maW5pc2hfZHluYW1pY19saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGFuIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotbGludXhfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLQkgTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHM7IHRoZXJlIGFyZW4ndCBhbnkuICAqLwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1saW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0gIGlmICghIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJCSBsaW51eF9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT5keW5vYmogPSBOVUxMOwotICByZXQtPmZpeHVwX2NvdW50ID0gMDsKLSAgcmV0LT5sb2NhbF9idWlsdGlucyA9IDA7Ci0gIHJldC0+Zml4dXBfbGlzdCA9IE5VTEw7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgbGludXhfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYW91dF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksXAotCQkJICAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYW91dF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIExpbnV4IGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKLSAgIGp1c3QgYSBjYXN0LiAgKi8KLQotI2RlZmluZSBsaW51eF9oYXNoX3RhYmxlKHApICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogU3RvcmUgdGhlIGluZm9ybWF0aW9uIGZvciBhIG5ldyBmaXh1cC4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZml4dXAgKgotbmV3X2ZpeHVwIChpbmZvLCBoLCB2YWx1ZSwgYnVpbHRpbikKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGludCBidWlsdGluOwotewotICBzdHJ1Y3QgZml4dXAgKmY7Ci0KLSAgZiA9IChzdHJ1Y3QgZml4dXAgKikgYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQkJICBzaXplb2YgKHN0cnVjdCBmaXh1cCkpOwotICBpZiAoZiA9PSBOVUxMKQotICAgIHJldHVybiBmOwotICBmLT5uZXh0ID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7Ci0gIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0ID0gZjsKLSAgZi0+aCA9IGg7Ci0gIGYtPnZhbHVlID0gdmFsdWU7Ci0gIGYtPmJ1aWx0aW4gPSBidWlsdGluOwotICBmLT5qdW1wID0gMDsKLSAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQ7Ci0gIHJldHVybiBmOwotfQotCi0vKiBXZSBjb21lIGhlcmUgb25jZSB3ZSByZWFsaXplIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGxpbmsgdG8gYSBzaGFyZWQKLSAgIGxpYnJhcnkuICBXZSBuZWVkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgc2VjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZQotICAgZml4dXAgdGFibGUsIGFuZCB3ZSB1bHRpbWF0ZWx5IG5lZWQgdG8gYWRkIGEgcG9pbnRlciB0byB0aGlzIGludG8KLSAgIHRoZSBzZXQgdmVjdG9yIGZvciBTSEFSQUJMRV9DT05GTElDVFMuICBBdCB0aGlzIHBvaW50IHdlIGRvIG5vdAotICAga25vdyB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiwgYnV0IHRoYXQncyBPSyAtIHdlIGp1c3QgbmVlZCB0bwotICAgY3JlYXRlIGl0IGZvciBub3cuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotCi0gIC8qIE5vdGUgdGhhdCB3ZSBzZXQgdGhlIFNFQ19JTl9NRU1PUlkgZmxhZy4gICovCi0gIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWTsKLQotICAvKiBXZSBjaG9vc2UgdG8gdXNlIHRoZSBuYW1lICIubGludXgtZHluYW1pYyIgZm9yIHRoZSBmaXh1cCB0YWJsZS4KLSAgICAgV2h5IG5vdD8gKi8KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIubGludXgtZHluYW1pYyIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgcy0+X3Jhd19zaXplID0gMDsKLSAgcy0+Y29udGVudHMgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGdW5jdGlvbiB0byBhZGQgYSBzaW5nbGUgc3ltYm9sIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4gIFRoaXMgaXMKLSAgIGEgd3JhcHBlciBhcm91bmQgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgd2hpY2ggaGFuZGxlcyB0aGUKLSAgIHR3ZWFraW5nIG5lZWRlZCBmb3IgZHluYW1pYyBsaW5raW5nIHN1cHBvcnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLCB2YWx1ZSwgc3RyaW5nLAotCQkgICAgICBjb3B5LCBjb2xsZWN0LCBoYXNocCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwOwotewotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBib29sZWFuIGluc2VydDsKLQotICAvKiBMb29rIHVwIGFuZCBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLgotICAgICBJZiB3ZSBkbywgYW5kIHRoZSBkZWZpbmluZyBlbnRyeSBpcyBmcm9tIGEgc2hhcmVkIGxpYnJhcnksIHdlCi0gICAgIG5lZWQgdG8gY3JlYXRlIHRoZSBkeW5hbWljIHNlY3Rpb25zLgotCi0gICAgIEZJWE1FOiBXaGF0IGlmIGFiZmQtPnh2ZWMgIT0gaW5mby0+aGFzaC0+Y3JlYXRvcj8gIFdlIG1heSB3YW50IHRvCi0gICAgIGJlIGFibGUgdG8gbGluayBMaW51eCBhLm91dCBhbmQgRUxGIG9iamVjdHMgdG9nZXRoZXIsIGJ1dCBzZXJpb3VzCi0gICAgIGNvbmZ1c2lvbiBpcyBwb3NzaWJsZS4gICovCi0KLSAgaW5zZXJ0ID0gZmFsc2U7Ci0KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwKLSAgICAgICYmIHN0cmNtcCAobmFtZSwgU0hBUkFCTEVfQ09ORkxJQ1RTKSA9PSAwCi0gICAgICAmJiAoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDAKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICBpZiAoISBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLSAgICAgIGluc2VydCA9IHRydWU7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24pCi0gICAgICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0gICAgewotICAgICAgaCA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCBmYWxzZSwKLQkJCQkgIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl7Ci0JICBzdHJ1Y3QgZml4dXAgKmY7Ci0KLQkgIGlmIChoYXNocCAhPSBOVUxMKQotCSAgICAqaGFzaHAgPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgaDsKLQotCSAgZiA9IG5ld19maXh1cCAoaW5mbywgaCwgdmFsdWUsICEgSVNfUExUX1NZTSAobmFtZSkpOwotCSAgaWYgKGYgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZi0+anVtcCA9IElTX1BMVF9TWU0gKG5hbWUpOwotCi0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIERvIHRoZSB1c3VhbCBwcm9jZWR1cmUgZm9yIGFkZGluZyBhIHN5bWJvbC4gICovCi0gIGlmICghIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwKLQkJCQkJICB2YWx1ZSwgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LAotCQkJCQkgIGhhc2hwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSW5zZXJ0IGEgcG9pbnRlciB0byBvdXIgdGFibGUgaW4gdGhlIHNldCB2ZWN0b3IuICBUaGUgZHluYW1pYwotICAgICBsaW5rZXIgcmVxdWlyZXMgdGhpcyBpbmZvcm1hdGlvbiAqLwotICBpZiAoaW5zZXJ0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICAvKiBIZXJlIHdlIGRvIG91ciBzcGVjaWFsIHRoaW5nIHRvIGFkZCB0aGUgcG9pbnRlciB0byB0aGUKLQkgZHluYW1pYyBzZWN0aW9uIGluIHRoZSBTSEFSQUJMRV9DT05GTElDVFMgc2V0IHZlY3Rvci4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0JCQkJICAgIi5saW51eC1keW5hbWljIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgICAgIChpbmZvLCBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLCBTSEFSQUJMRV9DT05GTElDVFMsCi0JICAgICAgQlNGX0dMT0JBTCB8IEJTRl9DT05TVFJVQ1RPUiwgcywgMCwgTlVMTCwgZmFsc2UsIGZhbHNlLCBOVUxMKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2Ugd2lsbCBjcmF3bCB0aGUgaGFzaCB0YWJsZSBhbmQgY29tZSBoZXJlIGZvciBldmVyeSBnbG9iYWwgc3ltYm9sLgotICAgV2Ugd2lsbCBleGFtaW5lIGVhY2ggZW50cnkgYW5kIHNlZSBpZiB0aGVyZSBhcmUgaW5kaWNhdGlvbnMgdGhhdCB3ZQotICAgbmVlZCB0byBhZGQgYSBmaXh1cC4gIFRoZXJlIGFyZSB0d28gcG9zc2libGUgY2FzZXMgLSBvbmUgaXMgd2hlcmUKLSAgIHlvdSBoYXZlIGR1cGxpY2F0ZSBkZWZpbml0aW9ucyBvZiBQTFQgb3IgR09UIHN5bWJvbHMgLSB0aGVzZSB3aWxsCi0gICBoYXZlIGFscmVhZHkgYmVlbiBjYXVnaHQgYW5kIGFkZGVkIGFzICJidWlsdGluIiBmaXh1cHMuICBJZiB3ZSBmaW5kCi0gICB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIG5vbiBQTFQvR09UIHN5bWJvbCBpcyBhbHNvIHByZXNlbnQsIHdlCi0gICBjb252ZXJ0IGl0IHRvIGEgcmVndWxhciBmaXh1cCBpbnN0ZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB2aWEgbGludXhfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxpbnV4X3RhbGx5X3N5bWJvbHMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSBkYXRhOwotICBzdHJ1Y3QgZml4dXAgKmYsICpmMTsKLSAgaW50IGlzX3BsdDsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDEsICpoMjsKLSAgYm9vbGVhbiBleGlzdHM7Ci0KLSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICAmJiBzdHJuY21wIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIE5FRURTX1NIUkxJQiwKLQkJICBzaXplb2YgTkVFRFNfU0hSTElCIC0gMSkgPT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY2hhciAqcDsKLSAgICAgIGNoYXIgKmFsbG9jID0gTlVMTDsKLQotICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyArIHNpemVvZiBORUVEU19TSFJMSUIgLSAxOwotICAgICAgcCA9IHN0cnJjaHIgKG5hbWUsICdfJyk7Ci0gICAgICBpZiAocCAhPSBOVUxMKQotCWFsbG9jID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotCi0gICAgICBpZiAocCA9PSBOVUxMIHx8IGFsbG9jID09IE5VTEwpCi0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJPdXRwdXQgZmlsZSByZXF1aXJlcyBzaGFyZWQgbGlicmFyeSBgJXMnXG4iKSwKLQkJCSAgICAgICBuYW1lKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJjcHkgKGFsbG9jLCBuYW1lKTsKLQkgIHAgPSBzdHJyY2hyIChhbGxvYywgJ18nKTsKLQkgICpwKysgPSAnXDAnOwotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCJPdXRwdXQgZmlsZSByZXF1aXJlcyBzaGFyZWQgbGlicmFyeSBgJXMuc28uJXMnXG4iKSwKLQkgICAgIGFsbG9jLCBwKTsKLQkgIGZyZWUgKGFsbG9jKTsKLQl9Ci0KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgYSBQTFQvR09ULCB3ZSBkbyBub3QgZXZlbiBuZWVkIHRvIGxvb2sgYXQgaXQgKi8KLSAgaXNfcGx0ID0gSVNfUExUX1NZTSAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLQotICBpZiAoaXNfcGx0IHx8IElTX0dPVF9TWU0gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZykpCi0gICAgewotICAgICAgLyogTG9vayB1cCB0aGlzIHN5bWJvbCB0d2ljZS4gIE9uY2UganVzdCBhcyBhIHJlZ3VsYXIgbG9va3VwLAotCSBhbmQgdGhlbiBhZ2FpbiBmb2xsb3dpbmcgYWxsIG9mIHRoZSBpbmRpcmVjdCBsaW5rcyB1bnRpbCB3ZQotCSByZWFjaCBhIHJlYWwgc3ltYm9sLiAgKi8KLSAgICAgIGgxID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZwotCQkJCSAgICArIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpLAotCQkJCSAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAvKiBoMiBkb2VzIG5vdCBmb2xsb3cgaW5kaXJlY3Qgc3ltYm9scy4gKi8KLSAgICAgIGgyID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIAotCQkJCSAgIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcKLQkJCQkgICAgKyBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSwKLQkJCQkgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICAgICAgLyogVGhlIHJlYWwgc3ltYm9sIG11c3QgZXhpc3QgYnV0IGlmIGl0IGlzIGFsc28gYW4gQUJTIHN5bWJvbCwKLQkgdGhlcmUgaXMgbm8gbmVlZCB0byBoYXZlIGEgZml4dXAuICBUaGlzIGlzIGJlY2F1c2UgdGhleSBib3RoCi0JIGNhbWUgZnJvbSB0aGUgc2FtZSBsaWJyYXJ5LiAgSWYgb24gdGhlIG90aGVyIGhhbmQsIHdlIGhhZCB0bwotCSB1c2UgYW4gaW5kaXJlY3Qgc3ltYm9sIHRvIGdldCB0byB0aGUgcmVhbCBzeW1ib2wsIHdlIGFkZCB0aGUKLQkgZml4dXAgYW55d2F5LCBzaW5jZSB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlc2Ugc3ltYm9scyBjb21lCi0JIGZyb20gZGlmZmVyZW50IHNoYXJlZCBsaWJyYXJpZXMgKi8KLSAgICAgIGlmIChoMSAhPSBOVUxMCi0JICAmJiAoKChoMS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCXx8IGgxLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgICAgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChoMS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotCSAgICAgIHx8IGgyLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KSkKLQl7Ci0JICAvKiBTZWUgaWYgdGhlcmUgaXMgYSAiYnVpbHRpbiIgZml4dXAgYWxyZWFkeSBwcmVzZW50Ci0JICAgICBpbnZvbHZpbmcgdGhpcyBzeW1ib2wuICBJZiBzbywgY29udmVydCBpdCB0byBhIHJlZ3VsYXIKLQkgICAgIGZpeHVwLiAgSW4gdGhlIGVuZCwgdGhpcyByZWxheGVzIHNvbWUgb2YgdGhlIHJlcXVpcmVtZW50cwotCSAgICAgYWJvdXQgdGhlIG9yZGVyIG9mIHBlcmZvcm1pbmcgZml4dXBzLiAgKi8KLQkgIGV4aXN0cyA9IGZhbHNlOwotCSAgZm9yIChmMSA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OwotCSAgICAgICBmMSAhPSBOVUxMOwotCSAgICAgICBmMSA9IGYxLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKChmMS0+aCAhPSBoICYmIGYxLT5oICE9IGgxKQotCQkgIHx8ICghIGYxLT5idWlsdGluICYmICEgZjEtPmp1bXApKQotCQljb250aW51ZTsKLQkgICAgICBpZiAoZjEtPmggPT0gaDEpCi0JCWV4aXN0cyA9IHRydWU7Ci0JICAgICAgaWYgKCEgZXhpc3RzCi0JCSAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JCXsKLQkJICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgZjEtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwgMCk7Ci0JCSAgZi0+anVtcCA9IGlzX3BsdDsKLQkJfQotCSAgICAgIGYxLT5oID0gaDE7Ci0JICAgICAgZjEtPmp1bXAgPSBpc19wbHQ7Ci0JICAgICAgZjEtPmJ1aWx0aW4gPSAwOwotCSAgICAgIGV4aXN0cyA9IHRydWU7Ci0JICAgIH0KLQkgIGlmICghIGV4aXN0cwotCSAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotCSAgICB7Ci0JICAgICAgZiA9IG5ld19maXh1cCAoaW5mbywgaDEsIGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwgMCk7Ci0JICAgICAgaWYgKGYgPT0gTlVMTCkKLQkJewotCQkgIC8qIEZJWE1FOiBObyB3YXkgdG8gcmV0dXJuIGVycm9yLiAgKi8KLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGYtPmp1bXAgPSBpc19wbHQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFF1aWNrIGFuZCBkaXJ0eSB3YXkgb2Ygc3RyaXBwaW5nIHRoZXNlIHN5bWJvbHMgZnJvbSB0aGUKLQkgc3ltdGFiLiAqLwotICAgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotCWgtPnJvb3Qud3JpdHRlbiA9IHRydWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB0byBzZXQgdGhlIHNpemUgb2YgdGhlIC5saW51eC1keW5hbWljIHNlY3Rpb24gaXMuCi0gICBJdCBpcyBjYWxsZWQgYnkgdGhlIExpbnV4IGxpbmtlciBlbXVsYXRpb24gYmVmb3JlX2FsbG9jYXRpb24KLSAgIHJvdXRpbmUuICBXZSBoYXZlIGZpbmlzaGVkIHJlYWRpbmcgYWxsIG9mIHRoZSBpbnB1dCBmaWxlcywgYW5kIG5vdwotICAgd2UganVzdCBzY2FuIHRoZSBoYXNoIHRhYmxlcyB0byBmaW5kIG91dCBob3cgbWFueSBhZGRpdGlvbmFsIGZpeHVwcwotICAgYXJlIHJlcXVpcmVkLiAgKi8KLQotYm9vbGVhbgotYmZkX202OGtsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKG91dHB1dF9iZmQtPnh2ZWMgIT0gJk1ZKHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRmlyc3QgZmluZCB0aGUgZml4dXBzLi4uICovCi0gIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgbGludXhfdGFsbHlfc3ltYm9scywKLQkJCSAgICAoUFRSKSBpbmZvKTsKLQotICAvKiBJZiB0aGVyZSBhcmUgYnVpbHRpbiBmaXh1cHMsIGxlYXZlIHJvb20gZm9yIGEgbWFya2VyLiAgVGhpcyBpcwotICAgICB1c2VkIGJ5IHRoZSBkeW5hbWljIGxpbmtlciBzbyB0aGF0IGl0IGtub3dzIHRoYXQgYWxsIHRoYXQgZm9sbG93Ci0gICAgIGFyZSBidWlsdGluIGZpeHVwcyBpbnN0ZWFkIG9mIHJlZ3VsYXIgZml4dXBzLiAgKi8KLSAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgewotICAgICAgaWYgKGYtPmJ1aWx0aW4pCi0JewotCSAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQ7Ci0JICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5sb2NhbF9idWlsdGluczsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ID4gMCkKLQlhYm9ydCAoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBmaXh1cCB0YWJsZS4gIFdlIHdpbGwgZmlsbCBpdCBpbiBsYXRlci4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCSAgICAgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzLT5fcmF3X3NpemUgPSA4ICsgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ICogODsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIG1lbXNldCAocy0+Y29udGVudHMsIDAsIChzaXplX3QpIHMtPl9yYXdfc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBjb21lIGhlcmUgb25jZSB3ZSBhcmUgcmVhZHkgdG8gYWN0dWFsbHkgd3JpdGUgdGhlIGZpeHVwIHRhYmxlIHRvCi0gICB0aGUgb3V0cHV0IGZpbGUuICBTY2FuIHRoZSBmaXh1cCB0YWJsZXMgYW5kIHNvIGZvcnRoIGFuZCBnZW5lcmF0ZQotICAgdGhlIHN0dWZmIHdlIG5lZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfZmluaXNoX2R5bmFtaWNfbGluayAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnMsICpvcywgKmlzOwotICBiZmRfYnl0ZSAqZml4dXBfdGFibGU7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLSAgdW5zaWduZWQgaW50IG5ld19hZGRyOwotICBpbnQgc2VjdGlvbl9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBmaXh1cHNfd3JpdHRlbjsKLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCSAgICAgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgb3MgPSBzLT5vdXRwdXRfc2VjdGlvbjsKLSAgZml4dXBzX3dyaXR0ZW4gPSAwOwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICBwcmludGYgKCJGaXh1cCB0YWJsZSBmaWxlIG9mZnNldDogJXggIFZNQTogJXhcbiIsIAotCSAgb3MtPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAotCSAgb3MtPnZtYSArIHMtPm91dHB1dF9vZmZzZXQpOwotI2VuZGlmCi0KLSAgZml4dXBfdGFibGUgPSBzLT5jb250ZW50czsKLSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50LCBmaXh1cF90YWJsZSk7Ci0gIGZpeHVwX3RhYmxlICs9IDQ7Ci0KLSAgLyogRmlsbCBpbiBmaXh1cCB0YWJsZS4gICovCi0gIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChmLT5idWlsdGluKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIiksCi0JICAgICBmLT5oLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpcyA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgbmV3X2FkZHIgPSBmLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgICAgIHByaW50ZiAoIkZpeHVwKCVkKSAlczogJXggJXhcbiIsZi0+anVtcCwgZi0+aC0+cm9vdC5yb290LnN0cmluZywKLQkgICAgICBuZXdfYWRkciwgZi0+dmFsdWUpOwotI2VuZGlmCi0KLSAgICAgIGlmIChmLT5qdW1wKQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUgKyAyLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCX0KLSAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+bG9jYWxfYnVpbHRpbnMgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTcGVjaWFsIG1hcmtlciBzbyB3ZSBrbm93IHRvIHN3aXRjaCB0byB0aGUgb3RoZXIgdHlwZSBvZiBmaXh1cCAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLSAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICArK2ZpeHVwc193cml0dGVuOwotICAgICAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0JewotCSAgaWYgKCEgZi0+YnVpbHRpbikKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICAmJiBmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iKSwKLQkJIGYtPmgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgaXMgPSBmLT5oLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLQkgIG5ld19hZGRyID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0JICBwcmludGYgKCJGaXh1cChCKSAlczogJXggJXhcbiIsIGYtPmgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCSAgbmV3X2FkZHIsIGYtPnZhbHVlKTsKLSNlbmRpZgotCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgKytmaXh1cHNfd3JpdHRlbjsKLQl9Ci0gIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ICE9IGZpeHVwc193cml0dGVuKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiV2FybmluZzogZml4dXAgY291bnQgbWlzbWF0Y2hcbiIpKTsKLSAgICAgIHdoaWxlIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiBmaXh1cHNfd3JpdHRlbikKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgICsrZml4dXBzX3dyaXR0ZW47Ci0JfQotICAgIH0KLQotICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIAotCQkJICAgICAgIl9fQlVJTFRJTl9GSVhVUFNfXyIsCi0JCQkgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICBpZiAoaCAhPSBOVUxMCi0gICAgICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgIHsKLSAgICAgIGlzID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBuZXdfYWRkciA9IGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgcHJpbnRmICgiQnVpbHRpbiBmaXh1cCB0YWJsZSBhdCAleFxuIiwgbmV3X2FkZHIpOwotI2VuZGlmCi0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0gICAgfQotICBlbHNlCi0gICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotCi0gIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwgb3MtPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgcy0+Y29udGVudHMsIDEsIHMtPl9yYXdfc2l6ZSwgb3V0cHV0X2JmZCkKLSAgICAgICE9IHMtPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgbGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCBsaW51eF9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLQotI2RlZmluZSBNWV96bWFnaWNfY29udGlndW91cyAxCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL202OGtseW54LmMgYi9iZmQvbTY4a2x5bnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FjZGZiYy4uMDAwMDAwMAotLS0gYS9iZmQvbTY4a2x5bnguYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgbTY4ayBiaW5hcmllcyB1bmRlciBMeW54T1MuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX202OGsKLQotI2RlZmluZSBNWShPUCkgQ0FUKG02OGtseW54X2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1tNjhrLWx5bngiCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2lmZGVmIExZTlhfQ09SRQotCi1jaGFyICpseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQoKTsKLWludCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCgpOwotYm9vbGVhbiBseW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCgpOwotY29uc3QgYmZkX3RhcmdldCAqbHlueF9jb3JlX2ZpbGVfcCgpOwotCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgbHlueF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUJTVlfY29yZV9maWxlX3AgbHlueF9jb3JlX2ZpbGVfcAotCi0jZW5kaWYgLyogTFlOWF9DT1JFICovCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL202OGtuZXRic2QuYyBiL2JmZC9tNjhrbmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZDE2NjUuLjAwMDAwMDAKLS0tIGEvYmZkL202OGtuZXRic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTmV0QlNEL202OGsgYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JECTQKLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0vKiBPdXIgbTY4ayBwb3J0cyB1c2UgZWl0aGVyIDRLIG9yIDhLIHBhZ2VzLCBidXQgb2JqZWN0IGZpbGVzIGFsd2F5cwotICAgYXNzdW1lIDhLIHBhZ2UgYWxpZ25tZW50IHNvIHRoZXkgd2lsbCB3b3JrIG9uIGFsbCBtNjhrIG1hY2hpbmVzLiAqLwotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFCTB4MjAwMAotCi0jZGVmaW5lIERFRkFVTFRfQVJDSAliZmRfYXJjaF9tNjhrCi0jZGVmaW5lIERFRkFVTFRfTUlEIAlNXzY4S19ORVRCU0QKLQotI2RlZmluZSBNWShPUCkgQ0FUKG02OGtuZXRic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbTY4ay1uZXRic2QiCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9tODhrbWFjaDMuYyBiL2JmZC9tODhrbWFjaDMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E1NjQwOC4uMDAwMDAwMAotLS0gYS9iZmQvbTg4a21hY2gzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE1vdG9yb2xhIG04OGsgYS5vdXQgKE1hY2ggMykgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCSg0MDk2KjIpCi0jZGVmaW5lIFNFR01FTlRfU0laRQkweDIwMDAwCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUgkwCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQJNAotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpCTEgCQkvKiAoTl9NQUdJRyh4KSA9PSBaTUFHSUMpICovCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0KLSNkZWZpbmUgTl9UWFRTSVpFKHgpCSgoeCkuYV90ZXh0KQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9tODhrCi0jZGVmaW5lIE1ZKE9QKSBDQVQobTg4a21hY2gzXyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbTg4ay1tYWNoMyIKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbWFrZWZpbGUuZG9zIGIvYmZkL21ha2VmaWxlLmRvcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyMmM2YS4uMDAwMDAwMAotLS0gYS9iZmQvbWFrZWZpbGUuZG9zCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotQ0ZMQUdTPS1PMgotCi0uYy5vIDoKLQlnY2MgJChDRkxBR1MpIC1JLiAtSS4uL2luY2x1ZGUgLWMgJDwKLQotYWxsIDogbGliYmZkLmEKLQotdGFyZ2V0cy5vIDogdGFyZ2V0cy5jCi0JZ2NjICQoQ0ZMQUdTKSAtSS4gLUkuLi9pbmNsdWRlIC1EU0VMRUNUX1ZFQ1M9JmdvMzJjb2ZmX3ZlYywmaTM4NmFvdXRfdmVjIC1EREVGQVVMVF9WRUNUT1I9Z28zMmNvZmZfdmVjIC1jICQqLmMKLQotYXJjaHVyZXMubyA6IGFyY2h1cmVzLmMKLQlnY2MgJChDRkxBR1MpIC1JLiAtSS4uL2luY2x1ZGUgLURTRUxFQ1RfQVJDSElURUNUVVJFUz1iZmRfaTM4Nl9hcmNoIC1jICQqLmMKLQotT0JKUyA9IFwKLQlsaWJiZmQubyBcCi0Jb3BuY2xzLm8gXAotCWJmZC5vIFwKLQlhcmNoaXZlLm8gXAotCXRhcmdldHMubyBcCi0JY2FjaGUubyBcCi0JYXJjaHVyZXMubyBcCi0JY29yZWZpbGUubyBcCi0Jc2VjdGlvbi5vIFwKLQlmb3JtYXQubyBcCi0Jc3ltcy5vIFwKLQlyZWxvYy5vIFwKLQlpbml0Lm8gXAotCWNvZmZnZW4ubyBcCi0Jc3JlYy5vIFwKLQloYXNoLm8gXAotCWxpbmtlci5vIFwKLQllY29mZi5vIFwKLQllY29mZmxpbmsubyBcCi0JZWxmLm8gXAotCWFvdXQzMi5vIFwKLQlzdGFiLXN5bS5vIFwKLQlpMzg2YW91dC5vIFwKLQljcHUtaTM4Ni5vIFwKLQljb2ZmLWdvMzIubyBcCi0JY29mZmxpbmsubyBcCi0JZWxmMzIubyBcCi0JYmluYXJ5Lm8gXAotCXRla2hleC5vIFwKLQkkRQotCi1saWJiZmQuYSA6ICQoT0JKUykKLQktcm0gbGliYmZkLmEKLQlhciBydnMgbGliYmZkLmEgJChPQkpTKQotCXJhbmxpYiBsaWJiZmQuYQpkaWZmIC0tZ2l0IGEvYmZkL21ha2VmaWxlLnZtcyBiL2JmZC9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNmIxZmYuLjAwMDAwMDAKLS0tIGEvYmZkL21ha2VmaWxlLnZtcworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGJmZCBsaWJyYXJ5IHVuZGVyIG9wZW5WTVMgKEFscGhhIGFuZCBWYXgpCi0jCi0jIEZvciB1c2Ugd2l0aCBnbnUtbWFrZSBmb3Igdm1zCi0jCi0jIENyZWF0ZWQgYnkgS2xhdXMgSyJhbXBmLCBra2FlbXBmQHJtaS5kZQotIwotIwotCi1DQz1jYwotCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotSE9TVEZJTEU9YWxwaGF2bXMuaAotVEFSR0VUT0JKUyA9IGNwdS1hbHBoYS5vYmoKLWVsc2UKLUhPU1RGSUxFPXZheHZtcy5oCi1UQVJHRVRPQkpTID0gY3B1LXZheC5vYmoKLWVuZGlmCi0KLQotT0JKUz1hcmNoaXZlLm9iaixhcmNodXJlcy5vYmosYmZkLm9iaixjYWNoZS5vYmosY29mZmdlbi5vYmosY29yZWZpbGUub2JqLFwKLSAgZm9ybWF0Lm9iaixpbml0Lm9iaixsaWJiZmQub2JqLG9wbmNscy5vYmoscmVsb2Mub2JqLHNlY3Rpb24ub2JqLHN5bXMub2JqLFwKLSAgdGFyZ2V0cy5vYmosaGFzaC5vYmosbGlua2VyLm9iaixlbGYub2JqLHNyZWMub2JqLGJpbmFyeS5vYmosdGVraGV4Lm9iaixcCi0gIGloZXgub2JqLHN0YWItc3ltcy5vYmosdm1zLm9iaix2bXMtaGRyLm9iaix2bXMtZ3NkLm9iaix2bXMtdGlyLm9iaixcCi0gIHZtcy1taXNjLm9iaiwkKFRBUkdFVE9CSlMpCi0KLWlmZXEgKCQoQ0MpLGdjYykKLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1ERUZTPS9kZWZpbmU9KFNFTEVDVF9WRUNTPSImdm1zX2FscGhhX3ZlYyIsU0VMRUNUX0FSQ0hJVEVDVFVSRVM9IiZiZmRfYWxwaGFfYXJjaCIsXAotIkhBVkVfdm1zX2FscGhhX3ZlYz0xIikKLWVsc2UKLURFRlM9L2RlZmluZT0oU0VMRUNUX1ZFQ1M9IiZ2bXNfdmF4X3ZlYyIsU0VMRUNUX0FSQ0hJVEVDVFVSRVM9IiZiZmRfdmF4X2FyY2giLFwKLSJIQVZFX3Ztc192YXhfdmVjPTEiLCJWTVNfREVCVUciKQotZW5kaWYKLUNGTEFHUz0vaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0pJChERUZTKQotZWxzZQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLURFRlM9L2RlZmluZT0oU0VMRUNUX1ZFQ1M9IiZ2bXNfYWxwaGFfdmVjIixTRUxFQ1RfQVJDSElURUNUVVJFUz0iJmJmZF9hbHBoYV9hcmNoIixcCi0iSEFWRV92bXNfYWxwaGFfdmVjPTEiLCJ1bmxpbms9cmVtb3ZlIiwiY29uc3Q9IiwiVk1TX0RFQlVHIiwpCi1lbHNlCi1ERUZTPS9kZWZpbmU9KFNFTEVDVF9WRUNTPSImdm1zX3ZheF92ZWMiLFNFTEVDVF9BUkNISVRFQ1RVUkVTPSImYmZkX3ZheF9hcmNoIixcCi0iSEFWRV92bXNfdmF4X3ZlYz0xIiwidW5saW5rPXJlbW92ZSIsImNvbnN0PSIsIlZNU19ERUJVRyIpCi1lbmRpZgotQ0ZMQUdTPS9ub29wdC9kZWJ1Zy9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSkkKERFRlMpL3dhcm5pbmdzPWRpc2FibGU9KG1pc3NpbmdyZXR1cm4saW1wbGljaXRmdW5jLGxvbmdleHRlcm4pCi1lbmRpZgotCi0KLWxpYmJmZC5vbGI6IHN5c2RlcC5oIGJmZC5oICQoT0JKUykKLQlwdXJnZQotCWxpYi9jcmVhdGUgbGliYmZkICQoT0JKUykKLQotc3lzZGVwLmg6IFsuaG9zdHNdJChIT1NURklMRSkgY29uZmlnLmgKLQkkKENQKSAkPCAkQAotCi1iZmQuaDogYmZkLWluMi5oCi0JJCQgQGNvbmZpZ3VyZQotCi10YXJnbWF0Y2guaDogYmZkLmgKLWNvbmZpZy5oOiBiZmQuaAotCi12bXMuYzogdm1zLmgKLXZtcy1taGQuYzogdm1zLmgKLXZtcy1nc2QuYzogdm1zLmgKLXZtcy10aXIuYzogdm1zLmgKLXZtcy1taXNjLmM6IHZtcy5oCi10YXJnZXRzLmM6IHRhcmdtYXRjaC5oCi0KLWNsZWFuOgotCSQkIHB1cmdlCi0JJChSTSkgbGliYmZkLm9sYjsKLQkkKFJNKSBzeXNkZXAuaDsKLQkkKFJNKSBiZmQuaDsKLQkkKFJNKSB0YXJnbWF0Y2guaDsKLQkkKFJNKSBjb25maWcuaDsKLQkkKFJNKSAqLm9iajsKZGlmZiAtLWdpdCBhL2JmZC9taXBzYnNkLmMgYi9iZmQvbWlwc2JzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2JhNjhkLi4wMDAwMDAwCi0tLSBhL2JmZC9taXBzYnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIE1JUFMgQlNEIChhLm91dCkgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFJhbHBoIENhbXBiZWxsLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0vKiAjZGVmaW5lIEVOVFJZX0NBTl9CRV9aRVJPICovCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMQotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotI2RlZmluZSBOX1RYVEFERFIoeCkgXAotICAgIChOX01BR0lDKHgpICE9IFpNQUdJQyA/ICh4KS5hX2VudHJ5IDoJLyogb2JqZWN0IGZpbGUgb3IgTk1BR0lDICovXAotCSAgICBURVhUX1NUQVJUX0FERFIgKyBFWEVDX0JZVEVTX1NJWkUJLyogbm8gcGFkZGluZyAqL1wKLSAgICApCi0jZGVmaW5lIE5fREFUQUREUih4KSAoTl9UWFRBRERSKHgpK05fVFhUU0laRSh4KSkKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDQwOTYKLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSA0MDk2Ci0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9taXBzCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNX1VOS05PV04gXAotCQkJICAgIHx8IChtdHlwZSkgPT0gTV9NSVBTMSB8fCAobXR5cGUpID09IE1fTUlQUzIpCi0jZGVmaW5lIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIgJ1wwJwotCi0jZGVmaW5lIE1ZKE9QKSBDQVQobWlwc2JzZF8sT1ApCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNkZWZpbmUgU0VUX0FSQ0hfTUFDSChBQkZELCBFWEVDKSBcCi0gIE1ZKHNldF9hcmNoX21hY2gpKEFCRkQsIE5fTUFDSFRZUEUgKEVYRUMpKTsgXAotICBNWShjaG9vc2VfcmVsb2Nfc2l6ZSkoQUJGRCk7Ci1zdGF0aWMgdm9pZCBNWShzZXRfYXJjaF9tYWNoKSBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBtYWNodHlwZSkpOwotc3RhdGljIHZvaWQgTVkoY2hvb3NlX3JlbG9jX3NpemUpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpCi1zdGF0aWMgYm9vbGVhbiBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi0vKiBXZSBjYW4ndCB1c2UgTVkoeCkgaGVyZSBiZWNhdXNlIGl0IGxlYWRzIHRvIGEgcmVjdXJzaXZlIGNhbGwgdG8gQ0FUCi0gICB3aGVuIGV4cGFuZGVkIGluc2lkZSBKVU1QX1RBQkxFLiAgKi8KLSNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIG1pcHNic2RfcmVsb2NfaG93dG9fdHlwZV9sb29rdXAKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX3JlbG9jIG1pcHNic2RfY2Fub25pY2FsaXplX3JlbG9jCi0KLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgTVlfZmluYWxfbGlua19jYWxsYmFjayB1bnVzZWQKLSNkZWZpbmUgTVlfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLQotI2RlZmluZSBNWV9iYWNrZW5kX2RhdGEgJk1ZKGJhY2tlbmRfZGF0YSkKLSNkZWZpbmUgTVlfQkZEX1RBUkdFVAotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKLQotc3RhdGljIHZvaWQKLU1ZKHNldF9hcmNoX21hY2gpIChhYmZkLCBtYWNodHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgbWFjaHR5cGU7Ci17Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICBsb25nIG1hY2hpbmU7Ci0KLSAgLyogRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBvZiB0aGUgb2JqZWN0IGZpbGUuICovCi0gIHN3aXRjaCAobWFjaHR5cGUpIHsKLQotICBjYXNlIE1fTUlQUzE6Ci0gICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgbWFjaGluZSA9IDMwMDA7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBNX01JUFMyOgotICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOwotICAgIG1hY2hpbmUgPSA0MDAwOwotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6Ci0gICAgYXJjaCA9IGJmZF9hcmNoX29ic2N1cmU7Ci0gICAgbWFjaGluZSA9IDA7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgYmZkX3NldF9hcmNoX21hY2goYWJmZCwgYXJjaCwgbWFjaGluZSk7ICAKLX0KLQotLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgcmVsb2NhdGlvbiBlbnRyeSwgYmFzZWQgb24gdGhlIGFyY2hpdGVjdHVyZSAqLwotc3RhdGljIHZvaWQKLU1ZKGNob29zZV9yZWxvY19zaXplKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaChhYmZkKSkgewotICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICBjYXNlIGJmZF9hcmNoX2EyOWs6Ci0gIGNhc2UgYmZkX2FyY2hfbWlwczoKLSAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19FWFRfU0laRTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSAgICBicmVhazsKLSAgfQotfQotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZSBpbiBCU0QgYS5vdXQgZm9ybWF0LgotICBTZWN0aW9uIGNvbnRlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uICBXZSB3cml0ZSB0aGUKLSAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLU1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIC8qIE1hZ2ljIG51bWJlciwgbWFlc3RybywgcGxlYXNlISAgKi8KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2goYWJmZCkpIHsKLSAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoKGFiZmQpKSB7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwMTA6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fNjgwMTApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9tYWNoX202ODAyMDoKLSAgICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV82ODAyMCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX1NQQVJDKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV8zODYpOwotICAgIGJyZWFrOwotICBjYXNlIGJmZF9hcmNoX2EyOWs6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzI5Syk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX2FyY2hfbWlwczoKLSAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaChhYmZkKSkgewotICAgIGNhc2UgNDAwMDoKLSAgICBjYXNlIDYwMDA6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fTUlQUzIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9NSVBTMSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX1VOS05PV04pOwotICB9Ci0KLSAgTVkoY2hvb3NlX3JlbG9jX3NpemUpKGFiZmQpOwotCi0gIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotICogTUlQUyByZWxvY2F0aW9uIHR5cGVzLgotICovCi0jZGVmaW5lIE1JUFNfUkVMT0NfMzIJCTAKLSNkZWZpbmUgTUlQU19SRUxPQ19KTVAJCTEKLSNkZWZpbmUgTUlQU19SRUxPQ19XRElTUDE2CTIKLSNkZWZpbmUgTUlQU19SRUxPQ19ISTE2CQkzCi0jZGVmaW5lIE1JUFNfUkVMT0NfSEkxNl9TCTQKLSNkZWZpbmUgTUlQU19SRUxPQ19MTzE2CQk1Ci0KLS8qCi0gKiBUaGlzIGlzIG9ubHkgY2FsbGVkIHdoZW4gcGVyZm9ybWluZyBhIEJGRF9SRUxPQ19NSVBTX0pNUCByZWxvY2F0aW9uLgotICogVGhlIGp1bXAgZGVzdGluYXRpb24gYWRkcmVzcyBpcyBmb3JtZWQgZnJvbSB0aGUgdXBwZXIgNCBiaXRzIG9mIHRoZQotICogImN1cnJlbnQiIHByb2dyYW0gY291bnRlciBjb25jYXRlbmF0ZWQgd2l0aCB0aGUganVtcCBpbnN0cnVjdGlvbidzCi0gKiAyNiBiaXQgZmllbGQgYW5kIHR3byB0cmFpbGluZyB6ZXJvcy4KLSAqIElmIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIG5vdCBpbiB0aGUgc2FtZSBzZWdtZW50IGFzIHRoZSAiY3VycmVudCIKLSAqIHByb2dyYW0gY291bnRlciwgdGhlbiB3ZSBuZWVkIHRvIHNpZ25hbCBhbiBlcnJvci4KLSAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19maXhfam1wX2FkZHIgKGFiZmQscmVsb2NfZW50cnksc3ltYm9sLGRhdGEsaW5wdXRfc2VjdGlvbixvdXRwdXRfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotewotICBiZmRfdm1hIHJlbG9jYXRpb24sIHBjOwotIAotICAvKiBJZiB0aGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBqdXN0IGNvbnRpbnVlLiAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIC8qIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgcmV0dXJuIGVycm9yICovCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogCi0gICAqIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICogaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuCi0gICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgcGMgPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKyA0OwotCi0gIGlmICgocmVsb2NhdGlvbiAmIDB4RjAwMDAwMDApICE9IChwYyAmIDB4RjAwMDAwMDApKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotLyoKLSAqIFRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiBwZXJmb3JtaW5nIGEgQkZEX1JFTE9DX0hJMTZfUyByZWxvY2F0aW9uLgotICogV2UgbmVlZCB0byBzZWUgaWYgYml0IDE1IGlzIHNldCBpbiB0aGUgcmVzdWx0LiBJZiBpdCBpcywgd2UgYWRkCi0gKiAweDEwMDAwIGFuZCBjb250aW51ZSBub3JtYWxseS4gVGhpcyB3aWxsIGNvbXBlbnNhdGUgZm9yIHRoZSBzaWduIGV4dGVuc2lvbgotICogd2hlbiB0aGUgbG93IGJpdHMgYXJlIGFkZGVkIGF0IHJ1biB0aW1lLgotICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2ZpeF9oaTE2X3MgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCQkgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19maXhfaGkxNl9zIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAKLSAgLyogSWYgdGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwganVzdCBjb250aW51ZS4gKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKU5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICAvKiBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHJldHVybiBlcnJvciAqLwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIC8qIAotICAgKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCi0gICAqIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLgotICAgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGlmIChyZWxvY2F0aW9uICYgMHg4MDAwKQotICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgKz0gMHgxMDAwMDsKLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtaXBzX2hvd3RvX3RhYmxlX2V4dFtdID0gewotICB7TUlQU19SRUxPQ18zMiwgICAgICAwLCAyLCAzMiwgZmFsc2UsIDAsICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwKLQkiMzIiLCAgICAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZiwgZmFsc2V9LAotICB7TUlQU19SRUxPQ19KTVAsICAgICAyLCAyLCAyNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0JbWlwc19maXhfam1wX2FkZHIsCi0JIk1JUFNfSk1QIiwgZmFsc2UsIDAsIDB4MDNmZmZmZmYsIGZhbHNlfSwKLSAge01JUFNfUkVMT0NfV0RJU1AxNiwgMiwgMiwgMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsCi0JIldESVNQMTYiLCAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsIGZhbHNlfSwKLSAge01JUFNfUkVMT0NfSEkxNiwgICAxNiwgMiwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwKLQkiSEkxNiIsICAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZiwgZmFsc2V9LAotICB7TUlQU19SRUxPQ19ISTE2X1MsIDE2LCAyLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotICAgICAgICBtaXBzX2ZpeF9oaTE2X3MsCi0gICAgICAgICJISTE2X1MiLCAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLCBmYWxzZX0sCi0gIHtNSVBTX1JFTE9DX0xPMTYsICAgIDAsIDIsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwKLQkiTE8xNiIsICAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZiwgZmFsc2V9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotTVkocmVsb2NfaG93dG9fdHlwZV9sb29rdXApIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotCi0gIGlmIChiZmRfZ2V0X2FyY2ggKGFiZmQpICE9IGJmZF9hcmNoX21pcHMpCi0gICAgcmV0dXJuIDA7Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgcmV0dXJuICgmbWlwc19ob3d0b190YWJsZV9leHRbTUlQU19SRUxPQ18zMl0pOwotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfSk1QOgotICAgICAgcmV0dXJuICgmbWlwc19ob3d0b190YWJsZV9leHRbTUlQU19SRUxPQ19KTVBdKTsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMjoKLSAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfV0RJU1AxNl0pOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTY6Ci0gICAgICByZXR1cm4gKCZtaXBzX2hvd3RvX3RhYmxlX2V4dFtNSVBTX1JFTE9DX0hJMTZdKTsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1M6Ci0gICAgICByZXR1cm4gKCZtaXBzX2hvd3RvX3RhYmxlX2V4dFtNSVBTX1JFTE9DX0hJMTZfU10pOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6Ci0gICAgICByZXR1cm4gKCZtaXBzX2hvd3RvX3RhYmxlX2V4dFtNSVBTX1JFTE9DX0xPMTZdKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0vKgotICogVGhpcyBpcyBqdXN0IGxpa2UgdGhlIHN0YW5kYXJkIGFvdXR4LmggdmVyc2lvbiBidXQgd2UgbmVlZCB0byBkbyBvdXIKLSAqIG93biBtYXBwaW5nIG9mIGV4dGVybmFsIHJlbG9jIHR5cGUgdmFsdWVzIHRvIGhvd3RvIGVudHJpZXMuCi0gKi8KLWxvbmcKLU1ZKGNhbm9uaWNhbGl6ZV9yZWxvYykoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICAgYmZkICphYmZkOwotICAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICB1bnNpZ25lZCBpbnQgY291bnQsIGM7Ci0gIGV4dGVybiByZWxvY19ob3d0b190eXBlIE5BTUUoYW91dCxleHRfaG93dG9fdGFibGUpW107Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IHJlYWQgaW4gdGhlIHJlbG9jYXRpb24gdGFibGUsIHJldHVybiB0aGUgdmFsdWVzLiAqLwotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpIHsKLSAgICBhcmVsZW50X2NoYWluICpjaGFpbiA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOwotCi0gICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGNvdW50KyspIHsKLSAgICAgICpyZWxwdHIrKyA9ICZjaGFpbi0+cmVsZW50OwotICAgICAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKLSAgICB9Ci0gICAgKnJlbHB0ciA9IDA7Ci0gICAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICB9Ci0gIGlmICh0YmxwdHIgJiYgc2VjdGlvbi0+cmVsb2NfY291bnQpIHsKLSAgICBmb3IgKGNvdW50ID0gMDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykgCi0gICAgICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLSAgICAqcmVscHRyID0gMDsKLSAgICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIH0KLQotICBpZiAoIU5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykpCi0gICAgcmV0dXJuIC0xOwotICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotCi0gIC8qIGZpeCB1cCBob3d0byBlbnRyaWVzICovCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KSAKLSAgICB7Ci0gICAgICBjID0gdGJscHRyLT5ob3d0byAtIE5BTUUoYW91dCxleHRfaG93dG9fdGFibGUpOwotICAgICAgdGJscHRyLT5ob3d0byA9ICZtaXBzX2hvd3RvX3RhYmxlX2V4dFtjXTsKLQotICAgICAgKnJlbHB0cisrID0gdGJscHRyKys7Ci0gICAgfQotICAqcmVscHRyID0gMDsKLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotfQotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhIE1ZKGJhY2tlbmRfZGF0YSkgPSB7Ci0gIDAsCQkJCS8qIHptYWdpYyBjb250aWd1b3VzICovCi0gIDEsCQkJCS8qIHRleHQgaW5jbCBoZWFkZXIgKi8KLSAgMCwJCQkJLyogZW50cnkgaXMgdGV4dCBhZGRyZXNzICovCi0gIDAsCQkJCS8qIGV4ZWNfaGRyX2ZsYWdzICovCi0gIFRBUkdFVF9QQUdFX1NJWkUsCQkJLyogdGV4dCB2bWEgKi8KLSAgTVlfc2V0X3NpemVzLAotICAwLAkJCQkvKiB0ZXh0IHNpemUgaW5jbHVkZXMgZXhlYyBoZWFkZXIgKi8KLSAgMCwJCQkJLyogYWRkX2R5bmFtaWNfc3ltYm9scyAqLwotICAwLAkJCQkvKiBhZGRfb25lX3N5bWJvbCAqLwotICAwLAkJCQkvKiBsaW5rX2R5bmFtaWNfb2JqZWN0ICovCi0gIDAsCQkJCS8qIHdyaXRlX2R5bmFtaWNfc3ltYm9sICovCi0gIDAsCQkJCS8qIGNoZWNrX2R5bmFtaWNfcmVsb2MgKi8KLSAgMAkJCQkvKiBmaW5pc2hfZHluYW1pY19saW5rICovCi19OwotCi1jb25zdCBiZmRfdGFyZ2V0IGFvdXRfbWlwc19saXR0bGVfdmVjID0KLXsKLSAgImEub3V0LW1pcHMtbGl0dGxlIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKGxpdHRsZSkgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyIChsaXR0bGUpICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICBNWV9zeW1ib2xfbGVhZGluZ19jaGFyLAotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBNWV9jb3JlX2ZpbGVfcH0sCi0gICAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YSwKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgYW91dF9taXBzX2JpZ192ZWMgPQotewotICAiYS5vdXQtbWlwcy1iaWciLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAoYmlnKSAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGJpZykgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIsCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgTVlfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgTVlfYmFja2VuZF9kYXRhLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9tcHctY29uZmlnLmluIGIvYmZkL21wdy1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYWRkZWUuLjAwMDAwMDAKLS0tIGEvYmZkL21wdy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0jIENvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIEJGRC4KLQotIyBUaGlzIGlzIGFsbW9zdCBhbHdheXMgY29ycmVjdC4KLQotU2V0IHNlbGFyY2hzICImYmZkX3t0YXJnZXRfY3B1fV9hcmNoIgotU2V0IGRlZnZlYyAiIgotU2V0IHNlbHZlY3MgIiIKLVNldCBoYXZldmVjcyAiIgotCi1JZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbTY4ay1hcHBsZS1tYWNvcy8KLQlTZXQgQkZEX0JBQ0tFTkRTICcie299ImNvZmYtbTY4ay5jLm8gIntvfSJjb2ZmbGluay5jLm8nCi0JU2V0IGRlZnZlYyBtNjhrY29mZl92ZWMKLQlTZXQgc2VsdmVjcyAnJm02OGtjb2ZmX3ZlYycKLQlTZXQgaGF2ZXZlY3MgJy1kIEhBVkVfbTY4a2NvZmZfdmVjJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9wb3dlcnBjLWFwcGxlLW1hY29zLwotCVNldCBCRkRfQkFDS0VORFMgJyJ7b30iY29mZi1wbWFjLmMubyAie299Inhjb2ZmbGluay5jLm8nCi0JU2V0IGRlZnZlYyBwbWFjX3hjb2ZmX3ZlYwotCVNldCBzZWx2ZWNzICcmcG1hY194Y29mZl92ZWMnCi0JU2V0IGhhdmV2ZWNzICctZCBIQVZFX3BtYWNfeGNvZmZfdmVjJwotCVNldCBzZWxhcmNocyAiJmJmZF9wb3dlcnBjX2FyY2giCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL2kzODYtXE9wdGlvbi14LWdvMzIvCi0JU2V0IEJGRF9CQUNLRU5EUyAnIntvfSJjb2ZmLWkzODYuYy5vJwotCVNldCBkZWZ2ZWMgaTM4NmNvZmZfdmVjCi0JU2V0IHNlbHZlY3MgJyZpMzg2Y29mZl92ZWMnCi0JU2V0IGhhdmV2ZWNzICctZCBIQVZFX2kzODZjb2ZmX3ZlYycKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbWlwcy1cT3B0aW9uLXgtXE9wdGlvbi14LwotCVNldCBCRkRfQkFDS0VORFMgJyJ7b30iY29mZi1taXBzLmMubyAie299ImVjb2ZmLmMubyAie299ImVjb2ZmbGluay5jLm8gIntvfSJlbGYzMi5jLm8gIntvfSJlbGYzMi1taXBzLmMubyAie299ImVsZmxpbmsuYy5vJwotCVNldCBkZWZ2ZWMgZWNvZmZfYmlnX3ZlYwotCVNldCBzZWx2ZWNzICcmZWNvZmZfYmlnX3ZlYywmZWNvZmZfbGl0dGxlX3ZlYywmYmZkX2VsZjMyX2JpZ21pcHNfdmVjJwotCVNldCBoYXZldmVjcyAnLWQgSEFWRV9lY29mZl9iaWdfdmVjIC1kIEhBVkVfZWNvZmZfbGl0dGxlX3ZlYyAtZCBIQVZFX2JmZF9lbGYzMl9iaWdtaXBzX3ZlYycKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvc2gtXE9wdGlvbi14LWhtcy8KLQlTZXQgQkZEX0JBQ0tFTkRTICcie299ImNvZmYtc2guYy5vICJ7b30iY29mZmxpbmsuYy5vJwotCVNldCBkZWZ2ZWMgc2hjb2ZmX3ZlYwotCVNldCBzZWx2ZWNzICcmc2hjb2ZmX3ZlYywmc2hsY29mZl92ZWMnCi0JU2V0IGhhdmV2ZWNzICctZCBIQVZFX3NoY29mZl92ZWMgLWQgSEFWRV9zaGxjb2ZmX3ZlYycKLUVuZCBJZgotCi1TZXQgdGEgYGVjaG8ge3NlbGFyY2hzfSB8IHNlZCAtZSAncy8mYmZkXy97b31jcHUtL2cnIC1lICdzL19hcmNoLy5jLm8vZydgCi0KLVNldCB0ZGVmYXVsdHMgIi1kIERFRkFVTFRfVkVDVE9SPXtkZWZ2ZWN9IC1kIFNFTEVDVF9WRUNTPXtzZWx2ZWNzfSAtZCBTRUxFQ1RfQVJDSElURUNUVVJFUz17c2VsYXJjaHN9IHtoYXZldmVjc30iCi0KLUVjaG8gJyMgRnJvbSBtcHctY29uZmlnLmluJwkJCQkgPiAie299Im1rLnRtcAotRWNobyAnV09SRFNJWkUgPSAzMicJCQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICdCRkRfTUFDSElORVMgPSAnIHt0YX0JCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJ0JGRF9CQUNLRU5EUyA9ICcge0JGRF9CQUNLRU5EU30JCQk+PiAie299Im1rLnRtcAotRWNobyAnVERFRkFVTFRTID0gJyB7dGRlZmF1bHRzfQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnSERFUEZJTEVTID0gJwkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJ1RERVBGSUxFUyA9ICcJCQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICcjIEVuZCBmcm9tIG1wdy1jb25maWcuaW4nCQkJCT4+ICJ7b30ibWsudG1wCi0KLUVjaG8gJy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IG1wdy1jb25maWd1cmUuICAqLycJID4gIntvfSJjb25maWcubmV3Ci1FY2hvICcjaW5jbHVkZSAibXB3LmgiJwkJCQkJPj4gIntvfSJjb25maWcubmV3Ci0KLU1vdmVJZkNoYW5nZSAie299ImNvbmZpZy5uZXcgIntvfSJjb25maWcuaAotCi0jIFdlIGNhbiBvbmx5IGhhbmRsZSAzMi1iaXQgdGFyZ2V0cyByaWdodCBub3cuCi0KLXNlZCAtZSAncy9AV09SRFNJWkVALzMyLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQHdvcmRzaXplQC8zMi8nIFxPcHRpb24tZAotICAgIC1lICJzL0BWRVJTSU9OQC9gQ2F0ZW5hdGUge3NyY2Rpcn1WRVJTSU9OYC8iIFxPcHRpb24tZAotICAgIC1lICdzL0BCRkRfSE9TVF82NF9CSVRfREVGSU5FREAvMC8nIFxPcHRpb24tZAotICAgIC1lICdzL0BCRkRfSE9TVF82NF9CSVRALy8nIFxPcHRpb24tZAotICAgIC1lICdzL0BCRkRfSE9TVF9VXzY0X0JJVEAvLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQEJGRF9IT1NUXzY0QklUX0xPTkdALzAvJyBcT3B0aW9uLWQKLSAgICAie3NyY2Rpcn0iYmZkLWluMi5oID4ie299ImJmZC5oLW5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJiZmQuaC1uZXcgIntvfSJiZmQuaAotCi1zZWQgLWUgJ3MvTk4vMzIvZycgIntzcmNkaXJ9ImVsZnh4LXRhcmdldC5oID4ie299ImVsZjMyLXRhcmdldC5oLW5ldwotTW92ZUlmQ2hhbmdlICJ7b30iZWxmMzItdGFyZ2V0LmgtbmV3ICJ7b30iZWxmMzItdGFyZ2V0LmgKLQotIyBQcmUtZXhwYW5kIHNvbWUgbWFjcm9zIGluIGNvZmZzd2FwLmgsIHNvIE1QVyBDIGRvZXNuJ3QgY2hva2UuCi0KLXNlZCAtZSAncy9eICBQVVRfQU9VVEhEUl9UU0laRSAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKLSAgICAtZSAncy9eICBQVVRfQU9VVEhEUl9EU0laRSAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKLSAgICAtZSAncy9eICBQVVRfQU9VVEhEUl9CU0laRSAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKLSAgICAtZSAncy9eICBQVVRfQU9VVEhEUl9FTlRSWSAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKLSAgICAtZSAncy9eICBQVVRfQU9VVEhEUl9URVhUX1NUQVJUICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgKC8gIGJmZF9oX3B1dF8zMiAoLycgXE9wdGlvbi1kCi0gICAgIntzcmNkaXJ9ImNvZmZzd2FwLmggPiJ7b30iY29mZnN3YXAuaC1uZXcKLQotTW92ZUlmQ2hhbmdlICJ7b30iY29mZnN3YXAuaC1uZXcgIntvfSJjb2Zmc3dhcC5oCmRpZmYgLS1naXQgYS9iZmQvbXB3LW1ha2Uuc2VkIGIvYmZkL21wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0NjNjNy4uMDAwMDAwMAotLS0gYS9iZmQvbXB3LW1ha2Uuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotIyBTZWQgY29tbWFuZHMgdG8gZmluaXNoIHRyYW5zbGF0aW5nIHRoZSBVbml4IEJGRCBNYWtlZmlsZSBpbnRvIE1QVyBzeW50YXguCi0KLSMgV2hhY2sgb3V0IHVudXNlZCBob3N0IGFuZCB0YXJnZXQgZGVmaW5lIGJpdHMuCi0vSERFRklORVMvcy9ASERFRklORVNALy8KLS9UREVGSU5FUy9zL0BUREVGSU5FU0AvLwotCi0jIEZpeCBwYXRobmFtZXMgdG8gaW5jbHVkZSBkaXJlY3Rvcmllcy4KLS9eSU5DRElSID0gL3MvXklOQ0RJUiA9IC4qJC9JTkNESVIgPSAie3RvcHNyY2Rpcn0iaW5jbHVkZS8KLS9eQ1NFQVJDSCA9IC9zLyQvIC1pICJ7SU5DRElSfSI6bXB3OiAtaSA6OmV4dHJhLWluY2x1ZGU6LwotCi0jIENvbW1lbnQgb3V0IHNldHRpbmcgb2YgdmFycywgY29uZmlndXJlIHNjcmlwdCB3aWxsIGFkZCB0aGVzZSBpdHNlbGYuCi0vXldPUkRTSVpFID0vcy9eLyMvCi0jIC9eQUxMX0JBQ0tFTkRTL3MvXi8jLwotL15CRkRfQkFDS0VORFMvcy9eLyMvCi0vXkJGRF9NQUNISU5FUy9zL14vIy8KLS9eVERFRkFVTFRTL3MvXi8jLwotCi0jIFJlbW92ZSBleHRyYSwgdXNlbGVzcywgImFsbCIuCi0vXmFsbCBcXE9wdGlvbi1mIF9vbGRlc3QvLC9eJC9kCi0KLSMgUmVtb3ZlIHRoZSBNYWtlZmlsZSByZWJ1aWxkIHJ1bGUuCi0vXk1ha2VmaWxlIC8sLy0tcmVjaGVjay9kCi0KLSMgRG9uJ3QgZG8gYW55IHJlY3Vyc2l2ZSBzdWJkaXIgc3R1ZmYuCi0vIHN1YmRpcl9kby9zL3tNQUtFfS9udWxsLWNvbW1hbmQvCi0KLS9CRkRfSC9zL157QkZEX0h9LyN7QkZEX0h9LwotCi0jIEFkZCBleHBsaWNpdCBzcmNkaXIgcGF0aHMgdG8gc3BlY2lhbCBmaWxlcy4KLS9jb25maWcuYmZkL3MvIGNvbmZpZy5iZmQvICJ7c30iY29uZmlnLmJmZC9nCi0vdGFyZ21hdGNoLnNlZC9zLyB0YXJnbWF0Y2guc2VkLyAie3N9InRhcmdtYXRjaC5zZWQvZwotCi0jIFBvaW50IGF0IGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgYWx3YXlzIGluIHRoZSBvYmpkaXIuCi0vYmZkL3MvIntzfSJiZmRcLmgvIntvfSJiZmQuaC9nCi0vY29uZmlnL3MvIntzfSJjb25maWdcLmgvIntvfSJjb25maWcuaC9nCi0vdGFyZ21hdGNoL3MvIntzfSJ0YXJnbWF0Y2hcLmgvIntvfSJ0YXJnbWF0Y2guaC9nCi0vdGFyZ21hdGNoL3MvXnRhcmdtYXRjaFwuaC8ie299InRhcmdtYXRjaC5oLwotL2VsZjMyLXRhcmdldC9zLyJ7c30iZWxmMzItdGFyZ2V0XC5oLyJ7b30iZWxmMzItdGFyZ2V0LmgvZwotL2VsZjMyLXRhcmdldC9zL15lbGYzMi10YXJnZXRcLmgvIntvfSJlbGYzMi10YXJnZXQuaC8KLS9lbGY2NC10YXJnZXQvcy8ie3N9ImVsZjY0LXRhcmdldFwuaC8ie299ImVsZjY0LXRhcmdldC5oL2cKLS9lbGY2NC10YXJnZXQvcy9eZWxmNjQtdGFyZ2V0XC5oLyJ7b30iZWxmNjQtdGFyZ2V0LmgvCi0KLS8ie3N9IntJTkNESVJ9L3MvIntzfSJ7SU5DRElSfS8ie0lOQ0RJUn0iL2cKLQotL2RlcC9zL1wuZGVwL19fZGVwL2cKLQotIyBSZW1vdmluZyBkdXBsaWNhdGVzIGlzIGNvb2wgYnV0IHByZXNlbnRseSB1bm5lY2Vzc2FyeSwKLSMgc28gd2hhY2sgdGhpcyBvdXQuCi0vXm9maWxlcyBcXE9wdGlvbi1mLywvXiQvZAotL29maWxlcy9zL3tPRklMRVN9IG9maWxlcy97T0ZJTEVTfS8KLS9lY2hvIG9maWxlcyA9IC9kCi0vY2F0IG9maWxlcy9zL2BjYXQgb2ZpbGVzYC97T0ZJTEVTfS8KLQotIyBObyBjb3JlZmlsZSBzdXBwb3J0LgotL0NPUkVGSUxFL3MvQENPUkVGSUxFQC8vCi0vQ09SRUZMQUcvcy9AQ09SRUZMQUdALy8KLQotIyBObyBQSUMgZm9vbGVyeSBpbiB0aGlzIGVudmlyb25tZW50LgotL0BBTExMSUJTQC9zL0BBTExMSUJTQC97VEFSR0VUTElCfS8KLS9AUElDTElTVEAvcy9AUElDTElTVEAvLwotL0BQSUNGTEFHQC9zL0BQSUNGTEFHQC8vCi0vXntPRklMRVN9IFxcT3B0aW9uLWYgc3RhbXAtcGljZGlyLywvXiQvZAotCi0jIFJlbW92ZSB0aGUgcGljIHRyaWNrZXJ5IGZyb20gdGhlIGRlZmF1bHQgYnVpbGQgcnVsZS4KLS9eXC5jXC5vIFxcT3B0aW9uLWYgLywvRW5kIElmL2NcCi0uYy5vIFxcT3B0aW9uLWYgLmMKLQotIyBNUFcgTWFrZSBkb2Vzbid0IGtub3cgYWJvdXQgJDwuCi0vIntvfSJ0YXJnZXRzLmMubyBcXE9wdGlvbi1mICJ7c30idGFyZ2V0cy5jIE1ha2VmaWxlLywvXiQvY1wKLSJ7b30idGFyZ2V0cy5jLm8gXFxPcHRpb24tZiAie3N9InRhcmdldHMuYyBNYWtlZmlsZVwKLQl7Q0N9IEBEQVNIX0NfRkxBR0Age0FMTF9DRkxBR1N9IHtUREVGQVVMVFN9ICJ7c30idGFyZ2V0cy5jIC1vICJ7b30idGFyZ2V0cy5jLm8KLQotLyJ7b30iYXJjaHVyZXMuYy5vIFxcT3B0aW9uLWYgIntzfSJhcmNodXJlcy5jIE1ha2VmaWxlLywvXiQvY1wKLSJ7b30iYXJjaHVyZXMuYy5vIFxcT3B0aW9uLWYgIntzfSJhcmNodXJlcy5jIE1ha2VmaWxlXAotCXtDQ30gQERBU0hfQ19GTEFHQCB7QUxMX0NGTEFHU30ge1RERUZBVUxUU30gIntzfSJhcmNodXJlcy5jIC1vICJ7b30iYXJjaHVyZXMuYy5vCi0KLSMgUmVtb3ZlIHRoZSAuaCByZWJ1aWxkaW5nIHJ1bGVzLCB3ZSBkb24ndCBjdXJyZW50bHkgaGF2ZSBhIGRvYyBzdWJkaXIsCi0jIG9yIGEgd2F5IHRvIGJ1aWxkIHRoZSBwcm90b3R5cGUtaGFja2luZyB0b29sIHRoYXQncyBpbiBpdC4KLS9eIntzcmNkaXJ9ImJmZC1pbjIuaCBcXE9wdGlvbi1mIC8sL14kL2QKLS9eIntzcmNkaXJ9ImxpYmJmZC5oIFxcT3B0aW9uLWYgLywvXiQvZAotL14ie3NyY2Rpcn0ibGliY29mZi5oIFxcT3B0aW9uLWYgLywvXiQvZApkaWZmIC0tZ2l0IGEvYmZkL25ldGJzZC1jb3JlLmMgYi9iZmQvbmV0YnNkLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiMTg0ZC4uMDAwMDAwMAotLS0gYS9iZmQvbmV0YnNkLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKiBCRkQgYmFjayBlbmQgZm9yIE5ldEJTRCBzdHlsZSBjb3JlIGZpbGVzCi0gICBDb3B5cmlnaHQgMTk4OCwgODksIDkxLCA5MiwgOTMsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBQYXVsIEtyYW5lbmJ1cmcsIEVVUgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9kaXIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvY29yZS5oPgotCi0vKgotICogRklYTUU6IE9uIE5ldEJTRC9zcGFyYyBDT1JFX0ZQVV9PRkZTRVQgc2hvdWxkIGJlIChzaXplb2Yoc3RydWN0IHRyYXBmcmFtZSkpCi0gKi8KLQotc3RydWN0IG5ldGJzZF9jb3JlX3N0cnVjdCB7Ci0Jc3RydWN0IGNvcmUgY29yZTsKLX0gKnJhd3B0cjsKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgluZXRic2RfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgY2hhciAqCQluZXRic2RfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBpbnQgCQluZXRic2RfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4JCW5ldGJzZF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQkJCSBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLCBiZmQgKmV4ZWNfYmZkKSk7Ci1zdGF0aWMgdm9pZAkJc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEhhbmRsZSBOZXRCU0Qtc3R5bGUgY29yZSBkdW1wIGZpbGUuICAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotbmV0YnNkX2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0KLXsKLQlpbnQJCWksIHZhbCwgb2Zmc2V0OwotCWFzZWN0aW9uCSphc2VjdCwgKmFzZWN0MjsKLQlzdHJ1Y3QgY29yZQljb3JlOwotCXN0cnVjdCBjb3Jlc2VnCWNvcmVzZWc7Ci0KLQl2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikmY29yZSwgMSwgc2l6ZW9mIGNvcmUsIGFiZmQpOwotCWlmICh2YWwgIT0gc2l6ZW9mIGNvcmUpIHsKLQkJLyogVG9vIHNtYWxsIHRvIGJlIGEgY29yZSBmaWxlICovCi0JCWJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChDT1JFX0dFVE1BR0lDKGNvcmUpICE9IENPUkVNQUdJQykgewotCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyYXdwdHIgPSAoc3RydWN0IG5ldGJzZF9jb3JlX3N0cnVjdCAqKQotCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBuZXRic2RfY29yZV9zdHJ1Y3QpKTsKLQlpZiAocmF3cHRyID09IE5VTEwpIHsKLQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmF3cHRyLT5jb3JlID0gY29yZTsKLQlhYmZkLT50ZGF0YS5uZXRic2RfY29yZV9kYXRhID0gcmF3cHRyOwotCi0Jb2Zmc2V0ID0gY29yZS5jX2hkcnNpemU7Ci0JZm9yIChpID0gMDsgaSA8IGNvcmUuY19uc2VnOyBpKyspIHsKLQotCQlpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0JCQlnb3RvIHB1bnQ7Ci0KLQkJdmFsID0gYmZkX3JlYWQgKCh2b2lkICopJmNvcmVzZWcsIDEsIHNpemVvZiBjb3Jlc2VnLCBhYmZkKTsKLQkJaWYgKHZhbCAhPSBzaXplb2YgY29yZXNlZykgewotCQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotCQkJZ290byBwdW50OwotCQl9Ci0JCWlmIChDT1JFX0dFVE1BR0lDKGNvcmVzZWcpICE9IENPUkVTRUdNQUdJQykgewotCQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkJCWdvdG8gcHVudDsKLQkJfQotCi0JCW9mZnNldCArPSBjb3JlLmNfc2VnaGRyc2l6ZTsKLQotCQlhc2VjdCA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YoYXNlY3Rpb24pKTsKLQkJaWYgKGFzZWN0ID09IE5VTEwpIHsKLQkJCWJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JCQlnb3RvIHB1bnQ7Ci0JCX0KLQotCQlhc2VjdC0+X3Jhd19zaXplID0gY29yZXNlZy5jX3NpemU7Ci0JCWFzZWN0LT52bWEgPSBjb3Jlc2VnLmNfYWRkcjsKLQkJYXNlY3QtPmZpbGVwb3MgPSBvZmZzZXQ7Ci0JCWFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCQlhc2VjdC0+bmV4dCA9IGFiZmQtPnNlY3Rpb25zOwotCQlhYmZkLT5zZWN0aW9ucyA9IGFzZWN0OwotCQlhYmZkLT5zZWN0aW9uX2NvdW50Kys7Ci0JCW9mZnNldCArPSBjb3Jlc2VnLmNfc2l6ZTsKLQotCQlzd2l0Y2ggKENPUkVfR0VURkxBRyhjb3Jlc2VnKSkgewotCQljYXNlIENPUkVfQ1BVOgotCQkJYXNlY3QtPm5hbWUgPSAiLnJlZyI7Ci0JCQlhc2VjdC0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfSEFTX0NPTlRFTlRTOwotI2lmZGVmIENPUkVfRlBVX09GRlNFVAotCQkJLyogSGFja2lzaC4uLiAqLwotCQkJYXNlY3QtPl9yYXdfc2l6ZSA9IENPUkVfRlBVX09GRlNFVDsKLQkJCWFzZWN0MiA9IChhc2VjdGlvbiAqKWJmZF96YWxsb2MgKGFiZmQsCi0JCQkJCQkJIHNpemVvZiAoYXNlY3Rpb24pKTsKLQkJCWlmIChhc2VjdDIgPT0gTlVMTCkgewotCQkJCWJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JCQkJZ290byBwdW50OwotCQkJfQotCQkJYXNlY3QyLT5fcmF3X3NpemUgPSBjb3Jlc2VnLmNfc2l6ZSAtIENPUkVfRlBVX09GRlNFVDsKLQkJCWFzZWN0Mi0+dm1hID0gMDsKLQkJCWFzZWN0Mi0+ZmlsZXBvcyA9IGFzZWN0LT5maWxlcG9zICsgQ09SRV9GUFVfT0ZGU0VUOwotCQkJYXNlY3QyLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCQkJYXNlY3QyLT5uZXh0ID0gYWJmZC0+c2VjdGlvbnM7Ci0JCQlhc2VjdDItPm5hbWUgPSAiLnJlZzIiOwotCQkJYXNlY3QyLT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFM7Ci0JCQlhYmZkLT5zZWN0aW9ucyA9IGFzZWN0MjsKLQkJCWFiZmQtPnNlY3Rpb25fY291bnQrKzsKLSNlbmRpZgotCi0JCQlicmVhazsKLQkJY2FzZSBDT1JFX0RBVEE6Ci0JCQlhc2VjdC0+bmFtZSA9ICIuZGF0YSI7Ci0JCQlhc2VjdC0+ZmxhZ3MgPSBTRUNfQUxMT0MrU0VDX0xPQUQrU0VDX0hBU19DT05URU5UUzsKLQkJCWJyZWFrOwotCQljYXNlIENPUkVfU1RBQ0s6Ci0JCQlhc2VjdC0+bmFtZSA9ICIuc3RhY2siOwotCQkJYXNlY3QtPmZsYWdzID0gU0VDX0FMTE9DK1NFQ19MT0FEK1NFQ19IQVNfQ09OVEVOVFM7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCXJldHVybiBhYmZkLT54dmVjOwotCi1wdW50Ogl7Ci0JCWFzZWN0aW9uCSphbmV4dDsKLQkJZm9yIChhc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBhc2VjdDsgYXNlY3QgPSBhbmV4dCkgewotCQkJYW5leHQgPSBhc2VjdC0+bmV4dDsKLQkJCWZyZWUoKHZvaWQgKilhc2VjdCk7Ci0JCX0KLQl9Ci0JZnJlZSAoKHZvaWQgKilyYXdwdHIpOwotCWFiZmQtPnRkYXRhLm5ldGJzZF9jb3JlX2RhdGEgPSBOVUxMOwotCWFiZmQtPnNlY3Rpb25zID0gTlVMTDsKLQlhYmZkLT5zZWN0aW9uX2NvdW50ID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNoYXIqCi1uZXRic2RfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLQliZmQgKmFiZmQ7Ci17Ci0gLypyZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsqLwotICByZXR1cm4gYWJmZC0+dGRhdGEubmV0YnNkX2NvcmVfZGF0YS0+Y29yZS5jX25hbWU7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgaW50Ci1uZXRic2RfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotCWJmZCAqYWJmZDsKLXsKLSAgLypyZXR1cm4gY29yZV9zaWduYWwgKGFiZmQpOyovCi0gIHJldHVybiBhYmZkLT50ZGF0YS5uZXRic2RfY29yZV9kYXRhLT5jb3JlLmNfc2lnbm87Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgYm9vbGVhbgotbmV0YnNkX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsJCS8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KLX0KLQwKLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IG5ldGJzZF9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAibmV0YnNkLWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBuZXRic2RfY29yZV9maWxlX3AJCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAobmV0YnNkKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvbmV0YnNkLmggYi9iZmQvbmV0YnNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NDgyZjAuLjAwMDAwMDAKLS0tIGEvYmZkL25ldGJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBkZWZpbml0aW9ucyB1c2VkIGJ5IGFsbCBOZXRCU0QgdGFyZ2V0cy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLVVTQS4gICovCi0KLS8qIENoZWNrIGZvciBvdXIgbWFjaGluZSB0eXBlIChwYXJ0IG9mIG1hZ2ljIG51bWJlcikuICovCi0jaWZuZGVmIE1BQ0hUWVBFX09LCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG0pICgobSkgPT0gREVGQVVMVF9NSUQgfHwgKG0pID09IE1fVU5LTk9XTikKLSNlbmRpZgotCi0vKiBUaGlzIGlzIHRoZSBub3JtYWwgbG9hZCBhZGRyZXNzIGZvciBleGVjdXRhYmxlcy4gKi8KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCQlUQVJHRVRfUEFHRV9TSVpFCi0KLS8qIE5ldEJTRCBaTUFHSUMgaGFzIGl0cyBoZWFkZXIgaW4gdGhlIHRleHQgc2VnbWVudC4gICovCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkJMQotCi0vKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhIHNoYXJlZCBsaWJyYXJ5IHVzaW5nIHRoZSBmbGFncy4gKi8KLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIAkoTl9EWU5BTUlDKHgpKQotCi0vKiBXZSBoYXZlIDYgYml0cyBvZiBmbGFncyBhbmQgMTAgYml0cyBvZiBtYWNoaW5lIElELiAgKi8KLSNkZWZpbmUgTl9NQUNIVFlQRShleGVjKSBcCi0JKChlbnVtIG1hY2hpbmVfdHlwZSkoKChleGVjKS5hX2luZm8gPj4gMTYpICYgMHgwM2ZmKSkKLSNkZWZpbmUgTl9GTEFHUyhleGVjKSBcCi0JKCgoZXhlYykuYV9pbmZvID4+IDI2KSAmIDB4M2YpCi0KLSNkZWZpbmUgTl9TRVRfSU5GTyhleGVjLCBtYWdpYywgdHlwZSwgZmxhZ3MpIFwKLQkoKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKSBcCi0JIHwgKCgoaW50KSh0eXBlKSAmIDB4M2ZmKSA8PCAxNikgXAotCSB8ICgoKGZsYWdzKSAmIDB4M2YpIDw8IDI0KSkKLSNkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpIFwKLQkoKGV4ZWMpLmFfaW5mbyA9IFwKLSAgICAgICAgICgoZXhlYykuYV9pbmZvICYgMHhmYjAwZmZmZikgfCAoKCgoaW50KShtYWNodHlwZSkpJjB4M2ZmKSA8PCAxNikpCi0jZGVmaW5lIE5fU0VUX0ZMQUdTKGV4ZWMsIGZsYWdzKSBcCi0JKChleGVjKS5hX2luZm8gPSBcCi0JICgoZXhlYykuYV9pbmZvICYgMHgwM2ZmZmZmZikgfCAoKGZsYWdzICYgMHgwM2YpIDw8IDI2KSkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotLyogT24gTmV0QlNELCB0aGUgbWFnaWMgbnVtYmVyIGlzIGFsd2F5cyBpbiBudG9obCdzICJuZXR3b3JrIiAoYmlnLWVuZGlhbikKLSAgIGZvcm1hdC4gICovCi0jZGVmaW5lIFNXQVBfTUFHSUMoZXh0KSBiZmRfZ2V0YjMyIChleHQpCi0KLS8qIE9uIE5ldEJTRCwgdGhlIGVudHJ5IHBvaW50IG1heSBiZSB0YWtlbiB0byBiZSB0aGUgc3RhcnQgb2YgdGhlIHRleHQKLSAgIHNlY3Rpb24uICAqLwotI2RlZmluZSBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MgMQotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpCi1zdGF0aWMgYm9vbGVhbiBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotI2RlZmluZSBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciAxCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZS4KLSAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLU1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIC8qIFdlIG11c3QgbWFrZSBjZXJ0YWluIHRoYXQgdGhlIG1hZ2ljIG51bWJlciBoYXMgYmVlbiBzZXQuICBUaGlzCi0gICAgIHdpbGwgbm9ybWFsbHkgaGF2ZSBiZWVuIGRvbmUgYnkgc2V0X3NlY3Rpb25fY29udGVudHMsIGJ1dCBvbmx5IGlmCi0gICAgIHRoZXJlIGFjdHVhbGx5IGFyZSBzb21lIHNlY3Rpb24gY29udGVudHMuICAqLwotICBpZiAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwotICAgICAgZmlsZV9wdHIgdGV4dF9lbmQ7Ci0KLSAgICAgIE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOwotICAgIH0KLQotI2lmIENIT09TRV9SRUxPQ19TSVpFCi0gIENIT09TRV9SRUxPQ19TSVpFKGFiZmQpOwotI2Vsc2UKLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0jZW5kaWYKLQotICAvKiBNYWdpYyBudW1iZXIsIG1hZXN0cm8sIHBsZWFzZSEgICovCi0gIHN3aXRjaCAoYmZkX2dldF9hcmNoKGFiZmQpKSB7Ci0gIGNhc2UgREVGQVVMVF9BUkNIOgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgREVGQVVMVF9NSUQpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9VTktOT1dOKTsKLSAgICBicmVhazsKLSAgfQotCi0gIC8qIFRoZSBOZXRCU0QgbWFnaWMgbnVtYmVyIGlzIGFsd2F5cyBiaWctZW5kaWFuICovCi0jaWZuZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSAgLyogWFhYIGFyZW4ndCB0aGVyZSBhbnkgbWFjcm8gdG8gY2hhbmdlIGJ5dGVvcmRlciBvZiBhIHdvcmQgaW5kZXBlbmRlbnQgb2YKLSAgICAgdGhlIGhvc3QncyBvciB0YXJnZXQncyBlbmRpYW5lc3Nlcz8gICovCi0gIGV4ZWNwLT5hX2luZm8KLSAgICA9IChleGVjcC0+YV9pbmZvICYgMHhmZikgPDwgMjQgfCAoZXhlY3AtPmFfaW5mbyAmIDB4ZmYwMCkgPDwgOAotICAgICAgfCAoZXhlY3AtPmFfaW5mbyAmIDB4ZmYwMDAwKSA+PiA4IHwgKGV4ZWNwLT5hX2luZm8gJiAweGZmMDAwMDAwKSA+PiAyNDsKLSNlbmRpZgotCi0gIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL25ld3NvczMuYyBiL2JmZC9uZXdzb3MzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzdhNzUuLjAwMDAwMDAKLS0tIGEvYmZkL25ld3NvczMuYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTmV3c09TMyAoU29ueSwgNjhrKSBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIE1ZKE9QKSBDQVQobmV3c29zM18sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW5ld3NvczMiCi0jZGVmaW5lIEVOVFJZX0NBTl9CRV9aRVJPCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwIC8qIEF2b2lkcyB3YXJuaW5nIHdoZW4gY29tcGlsZWQgd2l0aCAtV2FsbC4gKi8KLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX202OGsKLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDAKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL25sbS10YXJnZXQuaCBiL2JmZC9ubG0tdGFyZ2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMWQ0N2QuLjAwMDAwMDAKLS0tIGEvYmZkL25sbS10YXJnZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKiBUYXJnZXQgZGVmaW5pdGlvbnMgZm9yIDMyLzY0LWJpdCBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKQotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBubG1fY29yZV9maWxlX3AgX2JmZF9kdW1teV90YXJnZXQKLQotI2RlZmluZSBubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBubG1OQU1FKGdldF9zeW10YWJfdXBwZXJfYm91bmQpCi0jZGVmaW5lIG5sbV9nZXRfc3ltdGFiIG5sbU5BTUUoZ2V0X3N5bXRhYikKLSNkZWZpbmUgbmxtX21ha2VfZW1wdHlfc3ltYm9sIG5sbU5BTUUobWFrZV9lbXB0eV9zeW1ib2wpCi0jZGVmaW5lIG5sbV9wcmludF9zeW1ib2wgbmxtTkFNRShwcmludF9zeW1ib2wpCi0jZGVmaW5lIG5sbV9nZXRfc3ltYm9sX2luZm8gbmxtTkFNRShnZXRfc3ltYm9sX2luZm8pCi0jZGVmaW5lIG5sbV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIG5sbV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgbmxtX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIG5sbV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIG5sbV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIG5sbV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBubG1fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIG5sbU5BTUUoZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKQotI2RlZmluZSBubG1fY2Fub25pY2FsaXplX3JlbG9jIG5sbU5BTUUoY2Fub25pY2FsaXplX3JlbG9jKQotI2RlZmluZSBubG1fYmZkX3JlbG9jX3R5cGVfbG9va3VwIGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgbmxtX3NldF9zZWN0aW9uX2NvbnRlbnRzIG5sbU5BTUUoc2V0X3NlY3Rpb25fY29udGVudHMpCi0KLSNkZWZpbmUgbmxtX3NpemVvZl9oZWFkZXJzIF9iZmRfbm9saW5rX3NpemVvZl9oZWFkZXJzCi0jZGVmaW5lIG5sbV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIG5sbV9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIG5sbV9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgbmxtX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIG5sbV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBubG1fYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgbmxtX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi0vKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBldmVyeXRoaW5nIHRoYXQgQkZEIGtub3dzIGFib3V0IGEgdGFyZ2V0LgotICAgSXQgaW5jbHVkZXMgdGhpbmdzIGxpa2UgaXRzIGJ5dGUgb3JkZXIsIG5hbWUsIHdoYXQgcm91dGluZXMgdG8gY2FsbAotICAgdG8gZG8gdmFyaW91cyBvcGVyYXRpb25zLCBldGMuICBFdmVyeSBCRkQgcG9pbnRzIHRvIGEgdGFyZ2V0IHN0cnVjdHVyZQotICAgd2l0aCBpdHMgInh2ZWMiIG1lbWJlci4KLQotICAgVGhlcmUgYXJlIHR3byBzdWNoIHN0cnVjdHVyZXMgaGVyZTogIG9uZSBmb3IgYmlnLWVuZGlhbiBtYWNoaW5lcyBhbmQKLSAgIG9uZSBmb3IgbGl0dGxlLWVuZGlhbiBtYWNoaW5lcy4gICAqLwotCi0KLSNpZmRlZiBUQVJHRVRfQklHX1NZTQotY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfQklHX1NZTSA9Ci17Ci0gIC8qIG5hbWU6IGlkZW50aWZ5IGtpbmQgb2YgdGFyZ2V0ICovCi0gIFRBUkdFVF9CSUdfTkFNRSwKLQotICAvKiBmbGF2b3VyOiBnZW5lcmFsIGluZGljYXRpb24gYWJvdXQgZmlsZSAqLwotICBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLAotCi0gIC8qIGJ5dGVvcmRlcjogZGF0YSBpcyBiaWcgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fQklHLAotCi0gIC8qIGhlYWRlcl9ieXRlb3JkZXI6IGhlYWRlciBpcyBhbHNvIGJpZyBlbmRpYW4gKi8KLSAgQkZEX0VORElBTl9CSUcsCi0KLSAgLyogb2JqZWN0X2ZsYWdzOiBtYXNrIG9mIGFsbCBmaWxlIGZsYWdzICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTCi0gICB8IFdQX1RFWFQpLAotICAKLSAgLyogc2VjdGlvbl9mbGFnczogbWFzayBvZiBhbGwgc2VjdGlvbiBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX1JFQURPTkxZIHwKLSAgIFNFQ19DT0RFIHwgU0VDX0RBVEEpLCAKLQotICAgLyogbGVhZGluZ19zeW1ib2xfY2hhcjogaXMgdGhlIGZpcnN0IGNoYXIgb2YgYSB1c2VyIHN5bWJvbAotICAgICAgcHJlZGljdGFibGUsIGFuZCBpZiBzbyB3aGF0IGlzIGl0ICovCi0gICAwLAotCi0gIC8qIGFyX3BhZF9jaGFyOiBwYWQgY2hhcmFjdGVyIGZvciBmaWxlbmFtZXMgd2l0aGluIGFuIGFyY2hpdmUgaGVhZGVyCi0gICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBOTE0sIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYwotICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kL29yIG9zIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlICovCi0gICcvJywKLQotICAvKiBhcl9tYXhfbmFtZWxlbjogbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggTkxNLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlLiAgVGhpcyB2YWx1ZSBpcwotICAgICBhIFdBRyAod2lsZCBhKiogZ3Vlc3MpICovCi0gIDE1LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGRhdGEgc2VjdGlvbnMgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0KLSAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZmlsZSBoZWFkZXJzICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAotCi0gIC8qIGJmZF9jaGVja19mb3JtYXQ6IGNoZWNrIHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHJlYWQgKi8KLSAgeyBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgbmxtTkFNRShvYmplY3RfcCksCQkvKiBhc3NlbWJsZXIvbGlua2VyIG91dHB1dCAob2JqZWN0IGZpbGUpICovCi0gICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLAkvKiBhbiBhcmNoaXZlICovCi0gICAgbmxtX2NvcmVfZmlsZV9wCQkvKiBhIGNvcmUgZmlsZSAqLwotICB9LAotCi0gIC8qIGJmZF9zZXRfZm9ybWF0OiBzZXQgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBubG1fbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UKLSAgfSwKLQotICAvKiBiZmRfd3JpdGVfY29udGVudHM6IHdyaXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBpbnRvIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIG5sbU5BTUUod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSwKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0KLSAgLyogSW5pdGlhbGl6ZSBhIGp1bXAgdGFibGUgd2l0aCB0aGUgc3RhbmRhcmQgbWFjcm8uICBBbGwgbmFtZXMgc3RhcnQgd2l0aAotICAgICAibmxtIiAqLwotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAobmxtKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAobmxtKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAobmxtKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIC8qIGJhY2tlbmRfZGF0YTogKi8KLSAgKFBUUikgVEFSR0VUX0JBQ0tFTkRfREFUQQotfTsKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX0xJVFRMRV9TWU0KLWNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0xJVFRMRV9TWU0gPQotewotICAvKiBuYW1lOiBpZGVudGlmeSBraW5kIG9mIHRhcmdldCAqLwotICBUQVJHRVRfTElUVExFX05BTUUsCi0KLSAgLyogZmxhdm91cjogZ2VuZXJhbCBpbmRpY2F0aW9uIGFib3V0IGZpbGUgKi8KLSAgYmZkX3RhcmdldF9ubG1fZmxhdm91ciwKLQotICAvKiBieXRlb3JkZXI6IGRhdGEgaXMgbGl0dGxlIGVuZGlhbiAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwKLQotICAvKiBoZWFkZXJfYnl0ZW9yZGVyOiBoZWFkZXIgaXMgYWxzbyBsaXR0bGUgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAotCi0gIC8qIG9iamVjdF9mbGFnczogbWFzayBvZiBhbGwgZmlsZSBmbGFncyAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUwotICAgfCBXUF9URVhUKSwKLSAgCi0gIC8qIHNlY3Rpb25fZmxhZ3M6IG1hc2sgb2YgYWxsIHNlY3Rpb24gZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19SRUFET05MWSB8Ci0gICBTRUNfREFUQSksIAotCi0gICAvKiBsZWFkaW5nX3N5bWJvbF9jaGFyOiBpcyB0aGUgZmlyc3QgY2hhciBvZiBhIHVzZXIgc3ltYm9sCi0gICAgICBwcmVkaWN0YWJsZSwgYW5kIGlmIHNvIHdoYXQgaXMgaXQgKi8KLSAgIDAsCi0KLSAgLyogYXJfcGFkX2NoYXI6IHBhZCBjaGFyYWN0ZXIgZm9yIGZpbGVuYW1lcyB3aXRoaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIE5MTSwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQvb3Igb3MgYW5kIHNob3VsZCBiZSBpbmRlcGVuZGVudGx5IHR1bmFibGUgKi8KLSAgJy8nLAotCi0gIC8qIGFyX21heF9uYW1lbGVuOiBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGFuIGFyY2hpdmUgaGVhZGVyCi0gICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBOTE0sIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYwotICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kIHNob3VsZCBiZSBpbmRlcGVuZGVudGx5IHR1bmFibGUuICBUaGlzIHZhbHVlIGlzCi0gICAgIGEgV0FHICh3aWxkIGEqKiBndWVzcykgKi8KLSAgMTUsCi0KLSAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZGF0YSBzZWN0aW9ucyAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBmaWxlIGhlYWRlcnMgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCi0KLSAgLyogYmZkX2NoZWNrX2Zvcm1hdDogY2hlY2sgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgcmVhZCAqLwotICB7IF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICBubG1OQU1FKG9iamVjdF9wKSwJCS8qIGFzc2VtYmxlci9saW5rZXIgb3V0cHV0IChvYmplY3QgZmlsZSkgKi8KLSAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsCS8qIGFuIGFyY2hpdmUgKi8KLSAgICBubG1fY29yZV9maWxlX3AJCS8qIGEgY29yZSBmaWxlICovCi0gIH0sCi0KLSAgLyogYmZkX3NldF9mb3JtYXQ6IHNldCB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIG5sbV9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZQotICB9LAotCi0gIC8qIGJmZF93cml0ZV9jb250ZW50czogd3JpdGUgY2FjaGVkIGluZm9ybWF0aW9uIGludG8gYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgbmxtTkFNRSh3cml0ZV9vYmplY3RfY29udGVudHMpLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UKLSAgfSwKLQotICAvKiBJbml0aWFsaXplIGEganVtcCB0YWJsZSB3aXRoIHRoZSBzdGFuZGFyZCBtYWNyby4gIEFsbCBuYW1lcyBzdGFydCB3aXRoCi0gICAgICJubG0iICovCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgLyogYmFja2VuZF9kYXRhOiAqLwotICAoUFRSKSBUQVJHRVRfQkFDS0VORF9EQVRBCi19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvbmxtLmMgYi9iZmQvbmxtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzZiYWEuLjAwMDAwMDAKLS0tIGEvYmZkL25sbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYm5sbS5oIgotCi0vKiBNYWtlIGFuIE5MTSBvYmplY3QuICBXZSBqdXN0IG5lZWQgdG8gYWxsb2NhdGUgdGhlIGJhY2tlbmQKLSAgIGluZm9ybWF0aW9uLiAgKi8KLQotYm9vbGVhbgotbmxtX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICBubG1fdGRhdGEgKGFiZmQpID0KLSAgICAoc3RydWN0IG5sbV9vYmpfdGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbmxtX29ial90ZGF0YSkpOwotICBpZiAobmxtX3RkYXRhIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIGlmIChubG1fYXJjaGl0ZWN0dXJlIChhYmZkKSAhPSBiZmRfYXJjaF91bmtub3duKQotICAgIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIG5sbV9hcmNoaXRlY3R1cmUgKGFiZmQpLAotCQkJICAgICAgIG5sbV9tYWNoaW5lIChhYmZkKSk7Ci0KLSAgLyogc2luY2UgZXZlcnl0aGluZyBpcyBkb25lIGF0IGNsb3NlIHRpbWUsIGRvIHdlIG5lZWQgYW55IGluaXRpYWxpemF0aW9uPyAqLwotICByZXR1cm4gKHRydWUpOwotfQotCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBmb3IgYW4gTkxNIG9iamVjdC4gICovCi0KLWJvb2xlYW4KLW5sbV9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKiBhYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLSAgcmV0dXJuIGFyY2ggPT0gbmxtX2FyY2hpdGVjdHVyZSAoYWJmZCk7Ci19CmRpZmYgLS1naXQgYS9iZmQvbmxtMzItYWxwaGEuYyBiL2JmZC9ubG0zMi1hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGM4ZTUxLi4wMDAwMDAwCi0tLSBhL2JmZC9ubG0zMi1hbHBoYS5jCisrKyAvZGV2L251bGwKQEAgLTEsODkyICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIDMyLWJpdCBBbHBoYSBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKQotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSAzMiBiaXQgQWxwaGEgTkxNIGZvcm1hdC4gIFlvdSBtaWdodCB0aGluawotICAgdGhhdCBhbiBBbHBoYSBjaGlwIHdvdWxkIHVzZSBhIDY0IGJpdCBmb3JtYXQsIGJ1dCwgZm9yIHNvbWUgcmVhc29uLAotICAgaXQgZG9lc24ndC4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotI2luY2x1ZGUgIm5sbS9hbHBoYS1leHQuaCIKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlcglObG0zMl9hbHBoYV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIKLQotI2luY2x1ZGUgImxpYm5sbS5oIgotCi1zdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfYmFja2VuZF9vYmplY3RfcAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX3dyaXRlX3ByZWZpeAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX3JlYWRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICosIGFzZWN0aW9uICoqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9hbHBoYV9tYW5nbGVfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF92bWEsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIG5sbV9hbHBoYV9yZWFkX2ltcG9ydAotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX3dyaXRlX2ltcG9ydAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfc2V0X3B1YmxpY19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7Ci1zdGF0aWMgYmZkX3ZtYSBubG1fYWxwaGFfZ2V0X3B1YmxpY19vZmZzZXQKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX3dyaXRlX2V4dGVybmFsCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLCBhc3ltYm9sICosIHN0cnVjdCByZWxvY19hbmRfc2VjICopKTsKLQwKLS8qIEFscGhhIE5MTSdzIGhhdmUgYSBwcmVmaXggaGVhZGVyIGJlZm9yZSB0aGUgc3RhbmRhcmQgTkxNLiAgVGhpcwotICAgZnVuY3Rpb24gcmVhZHMgaXQgaW4sIHZlcmlmaWVzIHRoZSB2ZXJzaW9uLCBhbmQgc2Vla3MgdGhlIGJmZCB0bwotICAgdGhlIGxvY2F0aW9uIGJlZm9yZSB0aGUgcmVndWxhciBOTE0gaGVhZGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9hbHBoYV9iYWNrZW5kX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9wcmVmaXhfaGVhZGVyIHM7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZzLCBzaXplb2YgcywgMSwgYWJmZCkgIT0gc2l6ZW9mIHMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfaF9nZXRfMzIgKGFiZmQsIHMubWFnaWMpICE9IE5MTTMyX0FMUEhBX01BR0lDKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBGSVhNRTogU2hvdWxkIHdlIGNoZWNrIHRoZSBmb3JtYXQgbnVtYmVyPyAgKi8KLQotICAvKiBTa2lwIHRvIHRoZSBlbmQgb2YgdGhlIGhlYWRlci4gICovCi0gIHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHMuc2l6ZSk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2l6ZSwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHByZWZpeC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fYWxwaGFfd3JpdGVfcHJlZml4IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9wcmVmaXhfaGVhZGVyIHM7Ci0KLSAgbWVtc2V0ICgmcywgMCwgc2l6ZW9mIHMpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBOTE0zMl9BTFBIQV9NQUdJQywgcy5tYWdpYyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIDIsIHMuZm9ybWF0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc2l6ZW9mIHMsIHMuc2l6ZSk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZzLCBzaXplb2YgcywgMSwgYWJmZCkgIT0gc2l6ZW9mIHMpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEhvdyB0byBwcm9jZXNzIHRoZSB2YXJpb3VzIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtMzJfYWxwaGFfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFJlbG9jIHR5cGUgMCBpcyBpZ25vcmVkIGJ5IGl0c2VsZi4gIEhvd2V2ZXIsIGl0IGFwcGVhcnMgYWZ0ZXIgYQotICAgICBHUERJU1AgcmVsb2MgdG8gaWRlbnRpZnkgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBsb3cgb3JkZXIgMTYgYml0cwotICAgICBvZiB0aGUgZ3AgcmVnaXN0ZXIgYXJlIGxvYWRlZC4gICovCi0gIEhPV1RPIChBTFBIQV9SX0lHTk9SRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSUdOT1JFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wuICAqLwotICBIT1dUTyAoQUxQSEFfUl9SRUZMT05HLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkxPTkciLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1JFRlFVQUQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGUVVBRCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmZmZmZmZmZmZiwJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZmZmZmZmZmZmLAkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBHUCByZWxhdGl2ZSBvZmZzZXQuICBUaGlzIGlzIGp1c3QgbGlrZSBSRUZMT05HIGV4Y2VwdAotICAgICB0aGF0IHdoZW4gdGhlIHZhbHVlIGlzIHVzZWQgdGhlIHZhbHVlIG9mIHRoZSBncCByZWdpc3RlciB3aWxsIGJlCi0gICAgIGFkZGVkIGluLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfR1BSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFJFTDMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBVc2VkIGZvciBhbiBpbnN0cnVjdGlvbiB0aGF0IHJlZmVycyB0byBtZW1vcnkgb2ZmIHRoZSBHUAotICAgICByZWdpc3Rlci4gIFRoZSBvZmZzZXQgaXMgMTYgYml0cyBvZiB0aGUgMzIgYml0IGluc3RydWN0aW9uLiAgVGhpcwotICAgICByZWxvYyBhbHdheXMgc2VlbXMgdG8gYmUgYWdhaW5zdCB0aGUgLmxpdGEgc2VjdGlvbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0xJVEVSQUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJVEVSQUwiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGlzIHJlbG9jIG9ubHkgYXBwZWFycyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYSBMSVRFUkFMIHJlbG9jLgotICAgICBJdCBpZGVudGlmaWVzIGEgdXNlIG9mIHRoZSBsaXRlcmFsLiAgSXQgc2VlbXMgdGhhdCB0aGUgbGlua2VyIGNhbgotICAgICB1c2UgdGhpcyB0byBlbGltaW5hdGUgYSBwb3J0aW9uIG9mIHRoZSAubGl0YSBzZWN0aW9uLiAgVGhlIHN5bWJvbAotICAgICBpbmRleCBpcyBzcGVjaWFsOiAxIG1lYW5zIHRoZSBsaXRlcmFsIGFkZHJlc3MgaXMgaW4gdGhlIGJhc2UKLSAgICAgcmVnaXN0ZXIgb2YgYSBtZW1vcnkgZm9ybWF0IGluc3RydWN0aW9uOyAyIG1lYW5zIHRoZSBsaXRlcmFsCi0gICAgIGFkZHJlc3MgaXMgaW4gdGhlIGJ5dGUgb2Zmc2V0IHJlZ2lzdGVyIG9mIGEgYnl0ZS1tYW5pcHVsYXRpb24KLSAgICAgaW5zdHJ1Y3Rpb247IDMgbWVhbnMgdGhlIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgdGFyZ2V0Ci0gICAgIHJlZ2lzdGVyIG9mIGEganNyIGluc3RydWN0aW9uLiAgVGhpcyBkb2VzIG5vdCBhY3R1YWxseSBkbyBhbnkKLSAgICAgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0xJVFVTRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJVFVTRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG9hZCB0aGUgZ3AgcmVnaXN0ZXIuICBUaGlzIGlzIGFsd2F5cyB1c2VkIGZvciBhIGxkYWggaW5zdHJ1Y3Rpb24KLSAgICAgd2hpY2ggbG9hZHMgdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhlIGdwIHJlZ2lzdGVyLiAgVGhlIG5leHQgcmVsb2MKLSAgICAgd2lsbCBiZSBhbiBJR05PUkUgcmVsb2Mgd2hpY2ggaWRlbnRpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIGxkYQotICAgICBpbnN0cnVjdGlvbiB3aGljaCBsb2FkcyB0aGUgbG93ZXIgMTYgYml0cy4gIFRoZSBzeW1ib2wgaW5kZXggb2YKLSAgICAgdGhlIEdQRElTUCBpbnN0cnVjdGlvbiBhcHBlYXJzIHRvIGFjdHVhbGx5IGJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICAgYmV0d2VlbiB0aGUgbGRhaCBhbmQgbGRhIGluc3RydWN0aW9ucy4gIFRoaXMgZ2l2ZXMgdHdvIGRpZmZlcmVudAotICAgICB3YXlzIHRvIGRldGVybWluZSB3aGVyZSB0aGUgbGRhIGluc3RydWN0aW9uIGlzOyBJIGRvbid0IGtub3cgd2h5Ci0gICAgIGJvdGggYXJlIHVzZWQuICBUaGUgdmFsdWUgdG8gdXNlIGZvciB0aGUgcmVsb2NhdGlvbiBpcyB0aGUKLSAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBHUCB2YWx1ZSBhbmQgdGhlIGN1cnJlbnQgbG9jYXRpb247IHRoZQotICAgICBsb2FkIHdpbGwgYWx3YXlzIGJlIGRvbmUgYWdhaW5zdCBhIHJlZ2lzdGVyIGhvbGRpbmcgdGhlIGN1cnJlbnQKLSAgICAgYWRkcmVzcy4gICovCi0gIEhPV1RPIChBTFBIQV9SX0dQRElTUCwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQRElTUCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjEgYml0IGJyYW5jaC4gIFRoZSBuYXRpdmUgYXNzZW1ibGVyIGdlbmVyYXRlcyB0aGVzZSBmb3IKLSAgICAgYnJhbmNoZXMgd2l0aGluIHRoZSB0ZXh0IHNlZ21lbnQsIGFuZCBhbHNvIGZpbGxzIGluIHRoZSBQQwotICAgICByZWxhdGl2ZSBvZmZzZXQgaW4gdGhlIGluc3RydWN0aW9uLiAgSXQgc2VlbXMgdG8gbWUgdGhhdCB0aGlzCi0gICAgIHJlbG9jLCB1bmxpa2UgdGhlIG90aGVycywgaXMgbm90IHBhcnRpYWxfaW5wbGFjZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX0JSQUREUiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJCUkFERFIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgaGludCBmb3IgYSBqdW1wIHRvIGEgcmVnaXN0ZXIuICAqLwotICBIT1dUTyAoQUxQSEFfUl9ISU5ULAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkhJTlQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUwxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9TUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDY0IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9TUkVMNjQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZmZmZmZmZmZmLAkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmZmZmZmZmZmYsCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFB1c2ggYSB2YWx1ZSBvbiB0aGUgcmVsb2MgZXZhbHVhdGlvbiBzdGFjay4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BVU0gsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BVU0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjayBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIFN0b3JlIGl0IGluCi0gICAgIGEgYml0ZmllbGQgb2Ygc2l6ZSByX3NpemUgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHJfb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfU1RPUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9TVE9SRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmZmZmZmZmZmZiwJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU3VidHJhY3QgdGhlIHJlbG9jIGFkZHJlc3MgZnJvbSB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUKLSAgICAgcmVsb2NhdGlvbiBzdGFjay4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BTVUIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BTVUIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNoaWZ0IHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSByZWxvY2F0aW9uIHN0YWNrIHJpZ2h0IGJ5IHRoZQotICAgICBnaXZlbiB2YWx1ZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BSU0hJRlQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCSAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QUlNISUZUIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBZGp1c3QgdGhlIEdQIHZhbHVlIGZvciBhIG5ldyByYW5nZSBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBIT1dUTyAoQUxQSEFfUl9HUFZBTFVFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFZBTFVFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbTMyX2FscGhhX253X2hvd3RvID0KLSAgSE9XVE8gKEFMUEhBX1JfTldfUkVMT0MsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk5XX1JFTE9DIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogUmVhZCBhbiBBbHBoYSBOTE0gcmVsb2MuICBUaGlzIHJvdXRpbmUga2VlcHMgc29tZSBzdGF0aWMgZGF0YSB3aGljaAotICAgaXQgdXNlcyB3aGVuIGhhbmRsaW5nIGxvY2FsIHJlbG9jcy4gIFRoaXMgb25seSB3b3JrcyBjb3JyZWN0bHkKLSAgIGJlY2F1c2UgYWxsIHRoZSBsb2NhbCByZWxvY3MgYXJlIHJlYWQgYXQgb25jZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fYWxwaGFfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCBzZWNwLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIHN0YXRpYyBiZmRfdm1hIGdwX3ZhbHVlOwotICBzdGF0aWMgYmZkX3ZtYSBsaXRhX2FkZHJlc3M7Ci0gIHN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9yZWxvYyBleHQ7Ci0gIGJmZF92bWEgcl92YWRkcjsKLSAgbG9uZyByX3N5bW5keDsKLSAgaW50IHJfdHlwZSwgcl9leHRlcm4sIHJfb2Zmc2V0LCByX3NpemU7Ci0gIGFzZWN0aW9uICpjb2RlX3NlYywgKmRhdGFfc2VjOwotCi0gIC8qIFJlYWQgdGhlIHJlbG9jIGZyb20gdGhlIGZpbGUuICAqLwotICBpZiAoYmZkX3JlYWQgKCZleHQsIHNpemVvZiBleHQsIDEsIGFiZmQpICE9IHNpemVvZiBleHQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFN3YXAgaW4gdGhlIHJlbG9jIGluZm9ybWF0aW9uLiAgKi8KLSAgcl92YWRkciA9IGJmZF9oX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC5yX3ZhZGRyKTsKLSAgcl9zeW1uZHggPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQucl9zeW1uZHgpOwotCi0gIEJGRF9BU1NFUlQgKGJmZF9saXR0bGVfZW5kaWFuIChhYmZkKSk7Ci0KLSAgcl90eXBlID0gKChleHQucl9iaXRzWzBdICYgUkVMT0NfQklUUzBfVFlQRV9MSVRUTEUpCi0JICAgID4+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+bmFtZSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGNvdW50LCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobmxtX2kzODZfd3JpdGVfaW1wb3J0IChhYmZkLCByZWxvY3NbaV0uc2VjLAotCQkJCSByZWxvY3NbaV0ucmVsKSA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jaW5jbHVkZSAibmxtc3dhcC5oIgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEgbmxtMzJfaTM4Nl9iYWNrZW5kID0KLXsKLSAgIk5ldFdhcmUgTG9hZGFibGUgTW9kdWxlXDAzMiIsCi0gIHNpemVvZiAoTmxtMzJfaTM4Nl9FeHRlcm5hbF9GaXhlZF9IZWFkZXIpLAotICAwLAkvKiBvcHRpb25hbF9wcmVmaXhfc2l6ZSAqLwotICBiZmRfYXJjaF9pMzg2LAotICAwLAotICBmYWxzZSwKLSAgMCwJLyogYmFja2VuZF9vYmplY3RfcCAqLwotICAwLAkvKiB3cml0ZV9wcmVmaXhfZnVuYyAqLwotICBubG1faTM4Nl9yZWFkX3JlbG9jLAotICBubG1faTM4Nl9tYW5nbGVfcmVsb2NzLAotICBubG1faTM4Nl9yZWFkX2ltcG9ydCwKLSAgbmxtX2kzODZfd3JpdGVfaW1wb3J0LAotICAwLAkvKiBzZXRfcHVibGljX3NlY3Rpb24gKi8KLSAgMCwJLyogZ2V0X3B1YmxpY19vZmZzZXQgKi8KLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luLAotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0LAotICBubG1faTM4Nl93cml0ZV9leHRlcm5hbCwKLSAgMCwJLyogd3JpdGVfZXhwb3J0ICovCi19OwotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJIm5sbTMyLWkzODYiCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQlubG1OQU1FKGkzODZfdmVjKQotI2RlZmluZSBUQVJHRVRfQkFDS0VORF9EQVRBCQkmbmxtMzJfaTM4Nl9iYWNrZW5kCi0KLSNpbmNsdWRlICJubG0tdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtMzItcHBjLmMgYi9iZmQvbmxtMzItcHBjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZjJkZTguLjAwMDAwMDAKLS0tIGEvYmZkL25sbTMyLXBwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0NSArMCwwIEBACi0vKiBTdXBwb3J0IGZvciAzMi1iaXQgUG93ZXJQQyBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKQotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotLyogVGhlIGZvcm1hdCBvZiBhIFBvd2VyUEMgTkxNIGNoYW5nZWQuICBEZWZpbmUgT0xERk9STUFUIHRvIGdldCB0aGUKLSAgIG9sZCBmb3JtYXQuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgotCi0jaW5jbHVkZSAibmxtL3BwYy1leHQuaCIKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlcglObG0zMl9wb3dlcnBjX0V4dGVybmFsX0ZpeGVkX0hlYWRlcgotCi0jaW5jbHVkZSAibGlibmxtLmgiCi0KLSNpZmRlZiBPTERGT1JNQVQKLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX2JhY2tlbmRfb2JqZWN0X3AKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3dyaXRlX3ByZWZpeAotICBQQVJBTVMgKChiZmQgKikpOwotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3JlYWRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICosIGFzZWN0aW9uICoqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX21hbmdsZV9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX3ZtYSwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfcmVhZF9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKLQotI2lmZGVmIE9MREZPUk1BVAotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfd3JpdGVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiwgaW50KSk7Ci0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfd3JpdGVfaW1wb3J0Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3dyaXRlX2V4dGVybmFsCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLCBhc3ltYm9sICosIHN0cnVjdCByZWxvY19hbmRfc2VjICopKTsKLQotI2lmbmRlZiBPTERGT1JNQVQKLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3NldF9wdWJsaWNfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotc3RhdGljIGJmZF92bWEgbmxtX3Bvd2VycGNfZ2V0X3B1YmxpY19vZmZzZXQKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotI2VuZGlmCi0MCi0jaWZkZWYgT0xERk9STUFUCi0KLS8qIFRoZSBwcmVmaXggaGVhZGVyIGlzIG9ubHkgdXNlZCBpbiB0aGUgb2xkIGZvcm1hdC4gICovCi0KLS8qIFBvd2VyUEMgTkxNJ3MgaGF2ZSBhIHByZWZpeCBoZWFkZXIgYmVmb3JlIHRoZSBzdGFuZGFyZCBOTE0uICBUaGlzCi0gICBmdW5jdGlvbiByZWFkcyBpdCBpbiwgdmVyaWZpZXMgdGhlIHZlcnNpb24sIGFuZCBzZWVrcyB0aGUgYmZkIHRvCi0gICB0aGUgbG9jYXRpb24gYmVmb3JlIHRoZSByZWd1bGFyIE5MTSBoZWFkZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfYmFja2VuZF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgbmxtMzJfcG93ZXJwY19leHRlcm5hbF9wcmVmaXhfaGVhZGVyIHM7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmcywgc2l6ZW9mIHMsIDEsIGFiZmQpICE9IHNpemVvZiBzKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobWVtY21wIChzLnNpZ25hdHVyZSwgTkxNMzJfUE9XRVJQQ19TSUdOQVRVUkUsIHNpemVvZiBzLnNpZ25hdHVyZSkgIT0gMAotICAgICAgfHwgYmZkX2hfZ2V0XzMyIChhYmZkLCBzLmhlYWRlclZlcnNpb24pICE9IE5MTTMyX1BPV0VSUENfSEVBREVSX1ZFUlNJT04pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHByZWZpeC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY193cml0ZV9wcmVmaXggKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcHJlZml4X2hlYWRlciBzOwotCi0gIG1lbXNldCAoJnMsIDAsIHNpemVvZiBzKTsKLSAgbWVtY3B5IChzLnNpZ25hdHVyZSwgTkxNMzJfUE9XRVJQQ19TSUdOQVRVUkUsIHNpemVvZiBzLnNpZ25hdHVyZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIE5MTTMyX1BPV0VSUENfSEVBREVSX1ZFUlNJT04sIHMuaGVhZGVyVmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIDAsIHMub3JpZ2lucyk7Ci0KLSAgLyogRklYTUU6IFdoYXQgc2hvdWxkIHdlIGRvIGFib3V0IHRoZSBkYXRlPyAgKi8KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmcywgc2l6ZW9mIHMsIDEsIGFiZmQpICE9IHNpemVvZiBzKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmIC8qIE9MREZPUk1BVCAqLwotDAotI2lmbmRlZiBPTERGT1JNQVQKLQotLyogVGhlcmUgaXMgb25seSBvbmUgdHlwZSBvZiByZWxvYyBpbiBhIFBvd2VyUEMgTkxNLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtX3Bvd2VycGNfaG93dG8gPQotICBIT1dUTyAoMCwJCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIjMyIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFJlYWQgYSBQb3dlclBDIE5MTSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY19yZWFkX3JlbG9jIChhYmZkLCBzeW0sIHNlY3AsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgYmZkX2J5dGUgdGVtcFs0XTsKLSAgYmZkX3ZtYSB2YWw7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgaWYgKGJmZF9yZWFkICh0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCB0ZW1wKTsKLQotICAvKiBUaGUgdmFsdWUgaXMgYSB3b3JkIG9mZnNldCBpbnRvIGVpdGhlciB0aGUgY29kZSBvciBkYXRhIHNlZ21lbnQuCi0gICAgIFRoaXMgaXMgdGhlIGxvY2F0aW9uIHdoaWNoIG5lZWRzIHRvIGJlIGFkanVzdGVkLgotCi0gICAgIFRoZSBoaWdoIGJpdCBpcyAwIGlmIHRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQgaW50byB0aGUgZGF0YQotICAgICBzZWdtZW50LCBvciAxIGlmIHRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQgaW50byB0aGUgdGV4dCBzZWdtZW50LgotCi0gICAgIElmIHRoaXMgaXMgYSByZWxvY2F0aW9uIGZpeHVwIHJhdGhlciB0aGFuIGFuIGltcG9ydGVkIHN5bWJvbCAodGhlCi0gICAgIHN5bSBhcmd1bWVudCBpcyBOVUxMKSwgdGhlbiB0aGUgc2Vjb25kIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIDAKLSAgICAgaWYgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VnbWVudCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlCi0gICAgIGxvY2F0aW9uIGFkZHJlc3NlZCBieSB0aGUgdmFsdWUsIG9yIDEgaWYgdGhlIGFkZHJlc3Mgb2YgdGhlIHRleHQKLSAgICAgc2VnbWVudCBzaG91bGQgYmUgYWRkZWQuCi0KLSAgICAgSWYgdGhpcyBpcyBhbiBpbXBvcnRlZCBzeW1ib2wsIHRoZSBzZWNvbmQgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMKLSAgICAgbm90IHVzZWQgYW5kIG11c3QgYmUgMC4gICovCi0KLSAgaWYgKCh2YWwgJiBOTE1fSElCSVQpID09IDApCi0gICAgbmFtZSA9IE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYW1lID0gTkxNX0NPREVfTkFNRTsKLSAgICAgIHZhbCAmPX4gTkxNX0hJQklUOwotICAgIH0KLSAgKnNlY3AgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7Ci0KLSAgaWYgKHN5bSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICgodmFsICYgKE5MTV9ISUJJVCA+PiAxKSkgPT0gMCkKLQluYW1lID0gTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRTsKLSAgICAgIGVsc2UKLQl7Ci0JICBuYW1lID0gTkxNX0NPREVfTkFNRTsKLQkgIHZhbCAmPX4gKE5MTV9ISUJJVCA+PiAxKTsKLQl9Ci0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0KLSAgcmVsLT5ob3d0byA9ICZubG1fcG93ZXJwY19ob3d0bzsKLQotICByZWwtPmFkZHJlc3MgPSB2YWwgPDwgMjsKLSAgcmVsLT5hZGRlbmQgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZWxzZSAvKiBPTERGT1JNQVQgKi8KLQotLyogVGhpcyByZWxvYyBoYW5kbGluZyBpcyBvbmx5IGFwcGxpY2FibGUgdG8gdGhlIG9sZCBmb3JtYXQuICAqLwotCi0vKiBIb3cgdG8gcHJvY2VzcyB0aGUgdmFyaW91cyByZWxvYyB0eXBlcy4gIFBvd2VyUEMgTkxNcyB1c2UgWENPRkYKLSAgIHJlbG9jIHR5cGVzLCBhbmQgSSBoYXZlIGp1c3QgY29waWVkIHRoZSBYQ09GRiByZWxvYyB0YWJsZSBoZXJlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtX3Bvd2VycGNfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFN0YW5kYXJkIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKDAsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1BPUyIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHJlbG9jYXRpb24sIGJ1dCBzdG9yZSBuZWdhdGl2ZSB2YWx1ZS4gICovCi0gIEhPV1RPICgxLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAtMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfTkVHIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPICgyLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SRUwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogMTYgYml0IFRPQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKDMsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9UT0MiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEkgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCB0aGlzIGlzLiAgKi8KLSAgSE9XVE8gKDQsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JUQiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBFeHRlcm5hbCBUT0MgcmVsYXRpdmUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKDUsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX0dMIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTG9jYWwgVE9DIHJlbGF0aXZlIHN5bWJvbC4gICovCi0gIEhPV1RPICg2LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9UQ0wiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIHsgNyB9LAotICAKLSAgLyogTm9uIG1vZGlmaWFibGUgYWJzb2x1dGUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDgsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDI2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX0JBIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDNmZmZmZmMsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDNmZmZmZmMsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgeyA5IH0sCi0KLSAgLyogTm9uIG1vZGlmaWFibGUgcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4YSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQlIiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICB7IDB4YiB9LAotCi0gIC8qIEluZGlyZWN0IGxvYWQuICAqLwotICBIT1dUTyAoMHhjLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9STCIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIExvYWQgYWRkcmVzcy4gICovCi0gIEhPV1RPICgweGQsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JMQSIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgeyAweGUgfSwKLSAgCi0gIC8qIE5vbi1yZWxvY2F0aW5nIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPICgweGYsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFRiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLCAgICAgCSAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICB7IDB4MTAgfSwKLSAgeyAweDExIH0sCi0gIAotICAvKiBUT0MgcmVsYXRpdmUgaW5kaXJlY3QgbG9hZC4gICovCi0gIEhPV1RPICgweDEyLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9UUkwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIFRPQyByZWxhdGl2ZSBsb2FkIGFkZHJlc3MuICAqLwotICBIT1dUTyAoMHgxMywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVFJMQSIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIHJlbGF0aXZlIGJyYW5jaC4gICovCi0gIEhPV1RPICgweDE0LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SUlRCSSIsICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBhYnNvbHV0ZSBicmFuY2guICAqLwotICBIT1dUTyAoMHgxNSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUlJUQkEiLCAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgY2FsbCBhYnNvbHV0ZSBpbmRpcmVjdC4gICovCi0gIEhPV1RPICgweDE2LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9DQUkiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgY2FsbCByZWxhdGl2ZS4gICovCi0gIEhPV1RPICgweDE3LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SRUwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYnJhbmNoIGFic29sdXRlLiAgKi8KLSAgSE9XVE8gKDB4MTgsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JCQSIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggYWJzb2x1dGUuICAqLwotICBIT1dUTyAoMHgxOSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkJBQyIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCByZWxhdGl2ZS4gICovCi0gIEhPV1RPICgweDFhLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkVMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCBhYnNvbHV0ZS4gICovCi0gIEhPV1RPICgweDFiLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SRUwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLSNkZWZpbmUgSE9XVE9fQ09VTlQgKHNpemVvZiBubG1fcG93ZXJwY19ob3d0b190YWJsZQkJXAotCQkgICAgIC8gc2l6ZW9mIG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlWzBdKQotCi0vKiBSZWFkIGEgUG93ZXJQQyBOTE0gcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCBzZWNwLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIHN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3JlbG9jIGV4dDsKLSAgYmZkX3ZtYSBsX3ZhZGRyOwotICB1bnNpZ25lZCBsb25nIGxfc3ltbmR4OwotICBpbnQgbF9ydHlwZTsKLSAgaW50IGxfcnNlY25tOwotICBhc2VjdGlvbiAqY29kZV9zZWMsICpkYXRhX3NlYywgKmJzc19zZWM7Ci0KLSAgLyogUmVhZCB0aGUgcmVsb2MgZnJvbSB0aGUgZmlsZS4gICovCi0gIGlmIChiZmRfcmVhZCAoJmV4dCwgc2l6ZW9mIGV4dCwgMSwgYWJmZCkgIT0gc2l6ZW9mIGV4dCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU3dhcCBpbiB0aGUgZmllbGRzLiAgKi8KLSAgbF92YWRkciA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0LmxfdmFkZHIpOwotICBsX3N5bW5keCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0Lmxfc3ltbmR4KTsKLSAgbF9ydHlwZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXh0LmxfcnR5cGUpOwotICBsX3JzZWNubSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXh0LmxfcnNlY25tKTsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb25zIG5vdywgZm9yIGNvbnZlbmllbmNlLiAgKi8KLSAgY29kZV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gIGRhdGFfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBic3Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0KLSAgLyogV29yayBvdXQgdGhlIGFyZWxlbnQgZmllbGRzLiAgKi8KLSAgaWYgKHN5bSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYW4gaW1wb3J0LiAgc3ltX3B0cl9wdHIgaXMgZmlsbGVkIGluIGJ5Ci0JIG5sbV9jYW5vbmljYWxpemVfcmVsb2MuICAqLwotICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgaWYgKGxfc3ltbmR4ID09IDApCi0Jc2VjID0gY29kZV9zZWM7Ci0gICAgICBlbHNlIGlmIChsX3N5bW5keCA9PSAxKQotCXNlYyA9IGRhdGFfc2VjOwotICAgICAgZWxzZSBpZiAobF9zeW1uZHggPT0gMikKLQlzZWMgPSBic3Nfc2VjOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IHNlYy0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotCi0gIHJlbC0+YWRkZW5kID0gMDsKLQotICBCRkRfQVNTRVJUICgobF9ydHlwZSAmIDB4ZmYpIDwgSE9XVE9fQ09VTlQpOwotCi0gIHJlbC0+aG93dG8gPSBubG1fcG93ZXJwY19ob3d0b190YWJsZSArIChsX3J0eXBlICYgMHhmZik7Ci0KLSAgQkZEX0FTU0VSVCAocmVsLT5ob3d0by0+bmFtZSAhPSBOVUxMCi0JICAgICAgJiYgKChsX3J0eXBlICYgMHg4MDAwKSAhPSAwCi0JCSAgPyAocmVsLT5ob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cKLQkJICAgICA9PSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQpCi0JCSAgOiAocmVsLT5ob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cKLQkJICAgICA9PSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCkpCi0JICAgICAgJiYgKChsX3J0eXBlID4+IDgpICYgMHgxZikgPT0gcmVsLT5ob3d0by0+Yml0c2l6ZSAtIDEpOwotCi0gIGlmIChsX3JzZWNubSA9PSAwKQotICAgICpzZWNwID0gY29kZV9zZWM7Ci0gIGVsc2UgaWYgKGxfcnNlY25tID09IDEpCi0gICAgewotICAgICAgKnNlY3AgPSBkYXRhX3NlYzsKLSAgICAgIGxfdmFkZHIgLT0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZV9zZWMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZWwtPmFkZHJlc3MgPSBsX3ZhZGRyOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYgLyogT0xERk9STUFUICovCi0KLS8qIE1hbmdsZSBQb3dlclBDIE5MTSByZWxvY3MgZm9yIG91dHB1dC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY19tYW5nbGVfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhIFBvd2VyUEMgTkxNIGltcG9ydCByZWNvcmQgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3JlYWRfaW1wb3J0IChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLXsKLSAgc3RydWN0IG5sbV9yZWxlbnQgKm5sbV9yZWxvY3M7CS8qIHJlbG9jYXRpb24gcmVjb3JkcyBmb3Igc3ltYm9sICovCi0gIGJmZF9zaXplX3R5cGUgcmNvdW50OwkJCS8qIG51bWJlciBvZiByZWxvY3MgKi8KLSAgYmZkX2J5dGUgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CS8qIHRlbXBvcmFyeSAzMi1iaXQgdmFsdWUgKi8KLSAgdW5zaWduZWQgY2hhciBzeW1sZW5ndGg7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIG5hbWUgKi8KLSAgY2hhciAqbmFtZTsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZzeW1sZW5ndGgsIHNpemVvZiAoc3ltbGVuZ3RoKSwgMSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3ltbGVuZ3RoKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgc3ltIC0+IHN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltbGVuZ3RoICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3JlYWQgKG5hbWUsIHN5bWxlbmd0aCwgMSwgYWJmZCkgIT0gc3ltbGVuZ3RoKQotICAgIHJldHVybiAoZmFsc2UpOwotICBuYW1lW3N5bWxlbmd0aF0gPSAnXDAnOwotICBzeW0gLT4gc3ltYm9sLm5hbWUgPSBuYW1lOwotICBzeW0gLT4gc3ltYm9sLmZsYWdzID0gMDsKLSAgc3ltIC0+IHN5bWJvbC52YWx1ZSA9IDA7Ci0gIHN5bSAtPiBzeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgcmNvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCB0ZW1wKTsKLSAgbmxtX3JlbG9jcyA9ICgoc3RydWN0IG5sbV9yZWxlbnQgKikKLQkJYmZkX2FsbG9jIChhYmZkLCByY291bnQgKiBzaXplb2YgKHN0cnVjdCBubG1fcmVsZW50KSkpOwotICBpZiAobmxtX3JlbG9jcyA9PSAoc3RydWN0IG5sbV9yZWxlbnQgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bSAtPiByZWxvY3MgPSBubG1fcmVsb2NzOwotICBzeW0gLT4gcmNudCA9IDA7Ci0gIHdoaWxlIChzeW0gLT4gcmNudCA8IHJjb3VudCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgIAotICAgICAgaWYgKG5sbV9wb3dlcnBjX3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgJnNlY3Rpb24sCi0JCQkJICAmbmxtX3JlbG9jcyAtPiByZWxvYykKLQkgID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5sbV9yZWxvY3MgLT4gc2VjdGlvbiA9IHNlY3Rpb247Ci0gICAgICBubG1fcmVsb2NzKys7Ci0gICAgICBzeW0gLT4gcmNudCsrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZm5kZWYgT0xERk9STUFUCi0KLS8qIFdyaXRlIGEgUG93ZXJQQyBOTE0gcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfd3JpdGVfaW1wb3J0IChhYmZkLCBzZWMsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIGFzeW1ib2wgKnN5bTsKLSAgYmZkX3ZtYSB2YWw7Ci0gIGJmZF9ieXRlIHRlbXBbNF07Ci0KLSAgLyogUG93ZXJQQyBOZXRXYXJlIG9ubHkgc3VwcG9ydHMgb25lIGtpbmQgb2YgcmVsb2MuICAqLwotICBpZiAocmVsLT5hZGRlbmQgIT0gMAotICAgICAgfHwgcmVsLT5ob3d0byA9PSBOVUxMCi0gICAgICB8fCByZWwtPmhvd3RvLT5yaWdodHNoaWZ0ICE9IDAKLSAgICAgIHx8IHJlbC0+aG93dG8tPnNpemUgIT0gMgotICAgICAgfHwgcmVsLT5ob3d0by0+Yml0c2l6ZSAhPSAzMgotICAgICAgfHwgcmVsLT5ob3d0by0+Yml0cG9zICE9IDAKLSAgICAgIHx8IHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlCi0gICAgICB8fCAocmVsLT5ob3d0by0+c3JjX21hc2sgIT0gMHhmZmZmZmZmZiAmJiByZWwtPmFkZGVuZCAhPSAwKQotICAgICAgfHwgcmVsLT5ob3d0by0+ZHN0X21hc2sgIT0gMHhmZmZmZmZmZikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotICAvKiBUaGUgdmFsdWUgd2Ugd3JpdGUgb3V0IGlzIHRoZSBvZmZzZXQgaW50byB0aGUgYXBwcm9wcmlhdGUKLSAgICAgc2VnbWVudCwgcmlnaHRzaGlmdGVkIGJ5IHR3by4gIFRoaXMgb2Zmc2V0IGlzIHRoZSBzZWN0aW9uIHZtYSwKLSAgICAgYWRqdXN0ZWQgYnkgdGhlIHZtYSBvZiB0aGUgbG93ZXN0IHNlY3Rpb24gaW4gdGhhdCBzZWdtZW50LCBwbHVzCi0gICAgIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgdmFsID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKSArIHJlbC0+YWRkcmVzczsKLSAgaWYgKCh2YWwgJiAzKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgdmFsID4+PSAyOwotCi0gIC8qIFRoZSBoaWdoIGJpdCBpcyAwIGlmIHRoZSByZWxvYyBpcyBpbiB0aGUgZGF0YSBzZWN0aW9uLCBvciAxIGlmCi0gICAgIHRoZSByZWxvYyBpcyBpbiB0aGUgY29kZSBzZWN0aW9uLiAgKi8KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19EQVRBKQotICAgIHZhbCAtPSBubG1fZ2V0X2RhdGFfbG93IChhYmZkKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbCAtPSBubG1fZ2V0X3RleHRfbG93IChhYmZkKTsKLSAgICAgIHZhbCB8PSBOTE1fSElCSVQ7Ci0gICAgfQotICAgIAotICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhbiBpbnRlcm5hbCByZWxvY2F0aW9uIGZpeHVwLiAgVGhlIHNlY29uZCBtb3N0Ci0JIHNpZ25pZmljYW50IGJpdCBpcyAwIGlmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSBkYXRhCi0JIHNlZ21lbnQsIG9yIDEgaWYgaXQgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSB0ZXh0IHNlZ21lbnQuICAqLwotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKSAmIFNFQ19DT0RFKQotCXZhbCB8PSBOTE1fSElCSVQgPj4gMTsKLSAgICB9Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbHNlIC8qIE9MREZPUk1BVCAqLwotCi0vKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSByZWxvYyBoYW5kbGluZyBpbiB0aGUgb2xkIGZvcm1hdC4gICovCi0KLS8qIFdyaXRlIGEgUG93ZXJQQyBOTE0gcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfd3JpdGVfcmVsb2MgKGFiZmQsIHNlYywgcmVsLCBpbmR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLSAgICAgaW50IGluZHg7Ci17Ci0gIHN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3JlbG9jIGV4dDsKLSAgYXNlY3Rpb24gKmNvZGVfc2VjLCAqZGF0YV9zZWMsICpic3Nfc2VjOwotICBhc3ltYm9sICpzeW07Ci0gIGFzZWN0aW9uICpzeW1zZWM7Ci0gIHVuc2lnbmVkIGxvbmcgbF9zeW1uZHg7Ci0gIGludCBsX3J0eXBlOwotICBpbnQgbF9yc2Vjbm07Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICBiZmRfc2l6ZV90eXBlIGFkZHJlc3M7Ci0KLSAgLyogR2V0IHRoZSBzZWN0aW9ucyBub3csIGZvciBjb252ZW5pZW5jZS4gICovCi0gIGNvZGVfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotICBkYXRhX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgYnNzX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotCi0gIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotICBzeW1zZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSk7Ci0gIGlmIChpbmR4ICE9IC0xKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltc2VjKSk7Ci0gICAgICBsX3N5bW5keCA9IGluZHggKyAzOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChzeW1zZWMgPT0gY29kZV9zZWMpCi0JbF9zeW1uZHggPSAwOwotICAgICAgZWxzZSBpZiAoc3ltc2VjID09IGRhdGFfc2VjKQotCWxfc3ltbmR4ID0gMTsKLSAgICAgIGVsc2UgaWYgKHN5bXNlYyA9PSBic3Nfc2VjKQotCWxfc3ltbmR4ID0gMjsKLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGxfc3ltbmR4LCBleHQubF9zeW1uZHgpOwotCi0gIGZvciAoaG93dG8gPSBubG1fcG93ZXJwY19ob3d0b190YWJsZTsKLSAgICAgICBob3d0byA8IG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlICsgSE9XVE9fQ09VTlQ7Ci0gICAgICAgaG93dG8rKykKLSAgICB7Ci0gICAgICBpZiAoaG93dG8tPnJpZ2h0c2hpZnQgPT0gcmVsLT5ob3d0by0+cmlnaHRzaGlmdAotCSAgJiYgaG93dG8tPnNpemUgPT0gcmVsLT5ob3d0by0+c2l6ZQotCSAgJiYgaG93dG8tPmJpdHNpemUgPT0gcmVsLT5ob3d0by0+Yml0c2l6ZQotCSAgJiYgaG93dG8tPnBjX3JlbGF0aXZlID09IHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlCi0JICAmJiBob3d0by0+Yml0cG9zID09IHJlbC0+aG93dG8tPmJpdHBvcwotCSAgJiYgKGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gcmVsLT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICAgICAgfHwgKCEgcmVsLT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JCSAgJiYgcmVsLT5hZGRlbmQgPT0gMCkpCi0JICAmJiAoaG93dG8tPnNyY19tYXNrID09IHJlbC0+aG93dG8tPnNyY19tYXNrCi0JICAgICAgfHwgKHJlbC0+aG93dG8tPnNyY19tYXNrID09IDAKLQkJICAmJiByZWwtPmFkZGVuZCA9PSAwKSkKLQkgICYmIGhvd3RvLT5kc3RfbWFzayA9PSByZWwtPmhvd3RvLT5kc3RfbWFzawotCSAgJiYgaG93dG8tPnBjcmVsX29mZnNldCA9PSByZWwtPmhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JYnJlYWs7Ci0gICAgfQotICBpZiAoaG93dG8gPj0gbmxtX3Bvd2VycGNfaG93dG9fdGFibGUgKyBIT1dUT19DT1VOVCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgbF9ydHlwZSA9IGhvd3RvLT50eXBlOwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCkKLSAgICBsX3J0eXBlIHw9IDB4ODAwMDsKLSAgbF9ydHlwZSB8PSAoaG93dG8tPmJpdHNpemUgLSAxKSA8PCA4OwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIChiZmRfdm1hKSBsX3J0eXBlLCBleHQubF9ydHlwZSk7Ci0KLSAgYWRkcmVzcyA9IHJlbC0+YWRkcmVzczsKLQotICBpZiAoc2VjID09IGNvZGVfc2VjKQotICAgIGxfcnNlY25tID0gMDsKLSAgZWxzZSBpZiAoc2VjID09IGRhdGFfc2VjKQotICAgIHsKLSAgICAgIGxfcnNlY25tID0gMTsKLSAgICAgIGFkZHJlc3MgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZV9zZWMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBiZmRfaF9wdXRfMTYgKGFiZmQsIChiZmRfdm1hKSBsX3JzZWNubSwgZXh0LmxfcnNlY25tKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgYWRkcmVzcywgZXh0LmxfdmFkZHIpOwotCi0gIGlmIChiZmRfd3JpdGUgKCZleHQsIHNpemVvZiBleHQsIDEsIGFiZmQpICE9IHNpemVvZiBleHQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBhIFBvd2VyUEMgTkxNIGltcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY193cml0ZV9pbXBvcnQgKGFiZmQsIHNlYywgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgcmV0dXJuIG5sbV9wb3dlcnBjX3dyaXRlX3JlbG9jIChhYmZkLCBzZWMsIHJlbCwgLTEpOwotfQotCi0jZW5kaWYgLyogT0xERk9STUFUICovCi0KLS8qIFdyaXRlIGEgUG93ZXJQQyBOTE0gZXh0ZXJuYWwgc3ltYm9sLiAgVGhpcyByb3V0aW5lIGtlZXBzIGEgc3RhdGljCi0gICBjb3VudCBvZiB0aGUgc3ltYm9sIGluZGV4LiAgRklYTUU6IEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzCi0gICBuZWNlc3NhcnksIGFuZCB0aGUgaW5kZXggbmV2ZXIgZ2V0cyByZXNldC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY193cml0ZV9leHRlcm5hbCAoYWJmZCwgY291bnQsIHN5bSwgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgc3RydWN0IHJlbG9jX2FuZF9zZWMgKnJlbG9jczsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJmZF9ieXRlIGxlbjsKLSAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLSNpZmRlZiBPTERGT1JNQVQKLSAgc3RhdGljIGludCBpbmR4OwotI2VuZGlmCi0KLSAgbGVuID0gc3RybGVuIChzeW0tPm5hbWUpOwotICBpZiAoKGJmZF93cml0ZSAoJmxlbiwgc2l6ZW9mIChiZmRfYnl0ZSksIDEsIGFiZmQpICE9IHNpemVvZihiZmRfYnl0ZSkpCi0gICAgICB8fCBiZmRfd3JpdGUgKHN5bS0+bmFtZSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGNvdW50LCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0jaWZuZGVmIE9MREZPUk1BVAotICAgICAgaWYgKCEgbmxtX3Bvd2VycGNfd3JpdGVfaW1wb3J0IChhYmZkLCByZWxvY3NbaV0uc2VjLCByZWxvY3NbaV0ucmVsKSkKLQlyZXR1cm4gZmFsc2U7Ci0jZWxzZQotICAgICAgaWYgKCEgbmxtX3Bvd2VycGNfd3JpdGVfcmVsb2MgKGFiZmQsIHJlbG9jc1tpXS5zZWMsCi0JCQkJICAgICByZWxvY3NbaV0ucmVsLCBpbmR4KSkKLQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLSAgICB9Ci0KLSNpZmRlZiBPTERGT1JNQVQKLSAgKytpbmR4OwotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0jaWZuZGVmIE9MREZPUk1BVAotCi0vKiBQb3dlclBDIE5ldHdhcmUgdXNlcyBhIHdvcmQgb2Zmc2V0LCBub3QgYSBieXRlIG9mZnNldCwgZm9yIHB1YmxpYwotICAgc3ltYm9scy4gICovCi0KLS8qIFNldCB0aGUgc2VjdGlvbiBmb3IgYSBwdWJsaWMgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3NldF9wdWJsaWNfc2VjdGlvbiAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci17Ci0gIGlmIChzeW0tPnN5bWJvbC52YWx1ZSAmIE5MTV9ISUJJVCkKLSAgICB7Ci0gICAgICBzeW0tPnN5bWJvbC52YWx1ZSAmPSB+TkxNX0hJQklUOwotICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgICB9Ci0KLSAgc3ltLT5zeW1ib2wudmFsdWUgPDw9IDI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgb2Zmc2V0IHRvIHdyaXRlIG91dCBmb3IgYSBwdWJsaWMgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW5sbV9wb3dlcnBjX2dldF9wdWJsaWNfb2Zmc2V0IChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICBiZmRfdm1hIG9mZnNldDsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICBvZmZzZXQgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uIChzeW0pOwotICBpZiAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKQotICAgIHsKLSAgICAgIG9mZnNldCAtPSBubG1fZ2V0X3RleHRfbG93IChhYmZkKTsKLSAgICAgIG9mZnNldCB8PSBOTE1fSElCSVQ7Ci0gICAgfQotICBlbHNlIGlmIChzZWMtPmZsYWdzICYgKFNFQ19EQVRBIHwgU0VDX0FMTE9DKSkKLSAgICB7Ci0gICAgICAvKiBTRUNfQUxMT0MgaXMgZm9yIHRoZSAuYnNzIHNlY3Rpb24uICAqLwotICAgICAgb2Zmc2V0IC09IG5sbV9nZXRfZGF0YV9sb3cgKGFiZmQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIGNhbid0IGhhbmRsZSBhbiBleHBvcnRlZCBzeW1ib2wgdGhhdCBpcyBub3QgaW4gdGhlIGNvZGUgb3IKLQkgZGF0YSBzZWdtZW50LiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICAvKiBGSVhNRTogTm8gd2F5IHRvIHJldHVybiBlcnJvci4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIG9mZnNldDsKLX0KLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoT0xERk9STUFUKSAqLwotDAotI2luY2x1ZGUgIm5sbXN3YXAuaCIKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBubG1fYmFja2VuZF9kYXRhIG5sbTMyX3Bvd2VycGNfYmFja2VuZCA9Ci17Ci0gICJOZXRXYXJlIFBvd2VyUEMgTW9kdWxlIFwwMzIiLAotICBzaXplb2YgKE5sbTMyX3Bvd2VycGNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyKSwKLSNpZm5kZWYgT0xERk9STUFUCi0gIDAsCS8qIG9wdGlvbmFsX3ByZWZpeF9zaXplICovCi0jZWxzZQotICBzaXplb2YgKHN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3ByZWZpeF9oZWFkZXIpLAotI2VuZGlmCi0gIGJmZF9hcmNoX3Bvd2VycGMsCi0gIDAsCi0gIGZhbHNlLAotI2lmbmRlZiBPTERGT1JNQVQKLSAgMCwJLyogYmFja2VuZF9vYmplY3RfcCAqLwotICAwLAkvKiB3cml0ZV9wcmVmaXggKi8KLSNlbHNlCi0gIG5sbV9wb3dlcnBjX2JhY2tlbmRfb2JqZWN0X3AsCi0gIG5sbV9wb3dlcnBjX3dyaXRlX3ByZWZpeCwKLSNlbmRpZgotICBubG1fcG93ZXJwY19yZWFkX3JlbG9jLAotICBubG1fcG93ZXJwY19tYW5nbGVfcmVsb2NzLAotICBubG1fcG93ZXJwY19yZWFkX2ltcG9ydCwKLSAgbmxtX3Bvd2VycGNfd3JpdGVfaW1wb3J0LAotI2lmbmRlZiBPTERGT1JNQVQKLSAgbmxtX3Bvd2VycGNfc2V0X3B1YmxpY19zZWN0aW9uLAotICBubG1fcG93ZXJwY19nZXRfcHVibGljX29mZnNldCwKLSNlbHNlCi0gIDAsCS8qIHNldF9wdWJsaWNfc2VjdGlvbiAqLwotICAwLAkvKiBnZXRfcHVibGljX29mZnNldCAqLwotI2VuZGlmCi0gIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbiwKLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCwKLSAgbmxtX3Bvd2VycGNfd3JpdGVfZXh0ZXJuYWwsCi0gIDAsCS8qIHdyaXRlX2V4cG9ydCAqLwotfTsKLQotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkibmxtMzItcG93ZXJwYyIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCQlubG1OQU1FKHBvd2VycGNfdmVjKQotI2RlZmluZSBUQVJHRVRfQkFDS0VORF9EQVRBCQkmbmxtMzJfcG93ZXJwY19iYWNrZW5kCi0KLSNpbmNsdWRlICJubG0tdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtMzItc3BhcmMuYyBiL2JmZC9ubG0zMi1zcGFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTYzYWRiLi4wMDAwMDAwCi0tLSBhL2JmZC9ubG0zMi1zcGFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIDMyLWJpdCBTUEFSQyBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKQotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotI2luY2x1ZGUgIm5sbS9zcGFyYzMyLWV4dC5oIgotI2RlZmluZSBObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCU5sbTMyX3NwYXJjX0V4dGVybmFsX0ZpeGVkX0hlYWRlcgotCi0jaW5jbHVkZSAibGlibmxtLmgiCi0KLXN0YXRpYyBib29sZWFuIG5sbV9zcGFyY19yZWFkX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqLCBhc2VjdGlvbiAqKiwgYXJlbGVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3BhcmNfd3JpdGVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NwYXJjX21hbmdsZV9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX3ZtYSwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NwYXJjX3JlYWRfaW1wb3J0Ci0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3BhcmNfd3JpdGVfaW1wb3J0Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zcGFyY193cml0ZV9leHRlcm5hbAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3NpemVfdHlwZSwgYXN5bWJvbCAqLCBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqKSk7Ci0KLWVudW0gcmVsb2NfdHlwZQotICB7Ci0gICAgUl9TUEFSQ19OT05FID0gMCwKLSAgICBSX1NQQVJDXzgsCQlSX1NQQVJDXzE2LAkJUl9TUEFSQ18zMiwgCi0gICAgUl9TUEFSQ19ESVNQOCwJUl9TUEFSQ19ESVNQMTYsCQlSX1NQQVJDX0RJU1AzMiwgCi0gICAgUl9TUEFSQ19XRElTUDMwLAlSX1NQQVJDX1dESVNQMjIsCi0gICAgUl9TUEFSQ19ISTIyLAlSX1NQQVJDXzIyLAotICAgIFJfU1BBUkNfMTMsCQlSX1NQQVJDX0xPMTAsCi0gICAgUl9TUEFSQ19HT1QxMCwJUl9TUEFSQ19HT1QxMywJCVJfU1BBUkNfR09UMjIsCi0gICAgUl9TUEFSQ19QQzEwLAlSX1NQQVJDX1BDMjIsCi0gICAgUl9TUEFSQ19XUExUMzAsCi0gICAgUl9TUEFSQ19DT1BZLAotICAgIFJfU1BBUkNfR0xPQl9EQVQsCVJfU1BBUkNfSk1QX1NMT1QsCi0gICAgUl9TUEFSQ19SRUxBVElWRSwKLSAgICBSX1NQQVJDX1VBMzIsCi0gICAgUl9TUEFSQ19tYXgKLSAgfTsKLQotI2lmIDAKLXN0YXRpYyBDT05TVCBjaGFyICpDT05TVCByZWxvY190eXBlX25hbWVzW10gPQotewotICAiUl9TUEFSQ19OT05FIiwKLSAgIlJfU1BBUkNfOCIsCQkiUl9TUEFSQ18xNiIsCQkiUl9TUEFSQ18zMiIsCi0gICJSX1NQQVJDX0RJU1A4IiwJIlJfU1BBUkNfRElTUDE2IiwJIlJfU1BBUkNfRElTUDMyIiwKLSAgIlJfU1BBUkNfV0RJU1AzMCIsCSJSX1NQQVJDX1dESVNQMjIiLAotICAiUl9TUEFSQ19ISTIyIiwJIlJfU1BBUkNfMjIiLAotICAiUl9TUEFSQ18xMyIsCQkiUl9TUEFSQ19MTzEwIiwKLSAgIlJfU1BBUkNfR09UMTAiLAkiUl9TUEFSQ19HT1QxMyIsCSJSX1NQQVJDX0dPVDIyIiwKLSAgIlJfU1BBUkNfUEMxMCIsCSJSX1NQQVJDX1BDMjIiLAotICAiUl9TUEFSQ19XUExUMzAiLAotICAiUl9TUEFSQ19DT1BZIiwKLSAgIlJfU1BBUkNfR0xPQl9EQVQiLAkiUl9TUEFSQ19KTVBfU0xPVCIsCi0gICJSX1NQQVJDX1JFTEFUSVZFIiwKLSAgIlJfU1BBUkNfVUEzMiIsCi19OwotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbTMyX3NwYXJjX2hvd3RvX3RhYmxlW10gPSAKLXsKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfOCwgICAgICAgMCwwLCA4LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ184IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzE2LCAgICAgIDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfMTYiLCAgICAgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18zMiwgICAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDXzMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDgsICAgMCwwLCA4LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiUl9TUEFSQ19ESVNQOCIsICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AxNiwgIDAsMSwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIlJfU1BBUkNfRElTUDE2IiwgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMzIsICAwLDIsMzIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJSX1NQQVJDX0RJU1AzMiIsICBmYWxzZSwwLDB4MDBmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AzMCwgMiwyLDMwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiUl9TUEFSQ19XRElTUDMwIiwgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMjIsIDIsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIlJfU1BBUkNfV0RJU1AyMiIsIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISTIyLCAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX0hJMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMjIsICAgICAgMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ18yMiIsICAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzEzLCAgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfMTMiLCAgICAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MTzEwLCAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX0xPMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTAsICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ19HT1QxMCIsICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEzLCAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfR09UMTMiLCAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QyMiwgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDX0dPVDIyIiwgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMxMCwgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ19QQzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMjIsICAgIDAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfUEMyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XUExUMzAsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX1dQTFQzMCIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfQ09QWSwgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19DT1BZIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dMT0JfREFULDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfR0xPQl9EQVQiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19KTVBfU0xPVCwwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX0pNUF9TTE9UIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVMQVRJVkUsMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19SRUxBVElWRSIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMzIsICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfVUEzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLX07Ci0KLS8qIFJlYWQgYSBOZXRXYXJlIHNwYXJjIHJlbG9jLiAgKi8KLQotc3RydWN0IG5sbTMyX3NwYXJjX3JlbG9jX2V4dCB7Ci0gIHVuc2lnbmVkIGNoYXIgb2Zmc2V0WzRdOwotICB1bnNpZ25lZCBjaGFyIGFkZGVuZFs0XTsKLSAgdW5zaWduZWQgY2hhciB0eXBlWzFdOwotICB1bnNpZ25lZCBjaGFyIHBhZDFbM107Ci19OwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NwYXJjX3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgc2VjcCwgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBiZmRfdm1hIHZhbCwgYWRkZW5kOwotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0gIHVuc2lnbmVkIGludCB0eXBlOwotICBzdHJ1Y3QgbmxtMzJfc3BhcmNfcmVsb2NfZXh0IHRtcF9yZWxvYzsKLSAgYXNlY3Rpb24gKmNvZGVfc2VjLCAqZGF0YV9zZWM7Ci0KLSAgaWYgKGJmZF9yZWFkICgmdG1wX3JlbG9jLCAxMiwgMSwgYWJmZCkgIT0gMTIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvZGVfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotICBkYXRhX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLQotICAqc2VjcCA9IGNvZGVfc2VjOwotCi0gIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHRtcF9yZWxvYy5vZmZzZXQpOwotICBhZGRlbmQgPSBiZmRfZ2V0XzMyIChhYmZkLCB0bXBfcmVsb2MuYWRkZW5kKTsKLSAgdHlwZSA9IGJmZF9nZXRfOCAoYWJmZCwgdG1wX3JlbG9jLnR5cGUpOwotCi0gIHJlbC0+YWRkcmVzcyA9IHZhbDsKLSAgcmVsLT5hZGRlbmQgPSBhZGRlbmQ7Ci0gIHJlbC0+aG93dG8gPSBOVUxMOwotCi0gIGZvciAoaW5kZXggPSAwOwotICAgICAgIGluZGV4IDwgc2l6ZW9mKG5sbTMyX3NwYXJjX2hvd3RvX3RhYmxlKSAvIHNpemVvZihyZWxvY19ob3d0b190eXBlKTsKLSAgICAgICBpbmRleCsrKQotICAgIGlmIChubG0zMl9zcGFyY19ob3d0b190YWJsZVtpbmRleF0udHlwZSA9PSB0eXBlKSB7Ci0gICAgICByZWwtPmhvd3RvID0gJm5sbTMyX3NwYXJjX2hvd3RvX3RhYmxlW2luZGV4XTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAgYWRkcmVzcyA9ICUwOGx4LCBhZGRlbmQgPSAlMDhseCwgdHlwZSA9ICVkLCBob3d0byA9ICUwOGx4XG4iLAotCSAgIF9fRlVOQ1RJT05fXywgcmVsLT5hZGRyZXNzLCByZWwtPmFkZGVuZCwgdHlwZSwgcmVsLT5ob3d0byk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci0KLX0KLQotLyogV3JpdGUgYSBOZXRXYXJlIHNwYXJjIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zcGFyY193cml0ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBiZmRfdm1hIHZhbDsKLSAgc3RydWN0IG5sbTMyX3NwYXJjX3JlbG9jX2V4dCB0bXBfcmVsb2M7Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgaW50IHR5cGUgPSAtMTsKLSAgcmVsb2NfaG93dG9fdHlwZSAqdG1wOwotCi0gIAotICBmb3IgKGluZGV4ID0gMDsKLSAgICAgICBpbmRleCA8IHNpemVvZiAobmxtMzJfc3BhcmNfaG93dG9fdGFibGUpIC8gc2l6ZW9mKHJlbG9jX2hvd3RvX3R5cGUpOwotICAgICAgIGluZGV4KyspIHsKLSAgICB0bXAgPSAmbmxtMzJfc3BhcmNfaG93dG9fdGFibGVbaW5kZXhdOwotCi0gICAgaWYgKHRtcC0+cmlnaHRzaGlmdCA9PSByZWwtPmhvd3RvLT5yaWdodHNoaWZ0Ci0JJiYgdG1wLT5zaXplID09IHJlbC0+aG93dG8tPnNpemUKLQkmJiB0bXAtPmJpdHNpemUgPT0gcmVsLT5ob3d0by0+Yml0c2l6ZQotCSYmIHRtcC0+cGNfcmVsYXRpdmUgPT0gcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkmJiB0bXAtPmJpdHBvcyA9PSByZWwtPmhvd3RvLT5iaXRwb3MKLQkmJiB0bXAtPnNyY19tYXNrID09IHJlbC0+aG93dG8tPnNyY19tYXNrCi0JJiYgdG1wLT5kc3RfbWFzayA9PSByZWwtPmhvd3RvLT5kc3RfbWFzaykgewotICAgICAgdHlwZSA9IHRtcC0+dHlwZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBpZiAodHlwZSA9PSAtMSkKLSAgICBhYm9ydCgpOwotCi0gIC8qCi0gICAqIE5ldHdhcmUgd2FudHMgYSBsaXN0IG9mIHJlbG9jcyBmb3IgZWFjaCBhZGRyZXNzLgotICAgKiBGb3JtYXQgaXM6Ci0gICAqCWxvbmcJb2Zmc2V0Ci0gICAqCWxvbmcJYWRkZW5kCi0gICAqCWNoYXIJdHlwZQotICAgKiBUaGF0IHNob3VsZCBiZSBpdC4KLSAgICovCi0KLSAgLyogVGhlIHZhbHVlIHdlIHdyaXRlIG91dCBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIGFwcHJvcHJpYXRlCi0gICAgIHNlZ21lbnQuICBUaGlzIG9mZnNldCBpcyB0aGUgc2VjdGlvbiB2bWEsIGFkanVzdGVkIGJ5IHRoZSB2bWEgb2YKLSAgICAgdGhlIGxvd2VzdCBzZWN0aW9uIGluIHRoYXQgc2VnbWVudCwgcGx1cyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgICAgcmVsb2NhdGlvbi4gICovCi0jaWYgMAotICB2YWwgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCAoKnJlbC0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uKSArIHJlbC0+YWRkcmVzczsKLSNlbHNlCi0gIHZhbCA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykgKyByZWwtPmFkZHJlc3M7Ci0jZW5kaWYKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAgdmFsID0gJTA4bHgsIGFkZGVuZCA9ICUwOGx4LCB0eXBlID0gJWRcbiIsCi0JICAgX19GVU5DVElPTl9fLCB2YWwsIHJlbC0+YWRkZW5kLCByZWwtPmhvd3RvLT50eXBlKTsKLSNlbmRpZgotICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIHRtcF9yZWxvYy5vZmZzZXQpOwotICBiZmRfcHV0XzMyIChhYmZkLCByZWwtPmFkZGVuZCwgdG1wX3JlbG9jLmFkZGVuZCk7Ci0gIGJmZF9wdXRfOCAoYWJmZCwgKHNob3J0KShyZWwtPmhvd3RvLT50eXBlKSwgdG1wX3JlbG9jLnR5cGUpOwotCi0gIGlmIChiZmRfd3JpdGUgKCZ0bXBfcmVsb2MsIDEyLCAxLCBhYmZkKSAhPSAxMikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1hbmdsZSByZWxvY3MgZm9yIFNQQVJDIE5ldFdhcmUuICBXZSBjYW4ganVzdCB1c2UgdGhlIHN0YW5kYXJkCi0gICBTUEFSQyByZWxvY3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NwYXJjX21hbmdsZV9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgTmV0V2FyZSBzcGFyYyBpbXBvcnQgcmVjb3JkICovCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NwYXJjX3JlYWRfaW1wb3J0IChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLXsKLSAgc3RydWN0IG5sbV9yZWxlbnQgKm5sbV9yZWxvY3M7CS8qIHJlbG9jYXRpb24gcmVjb3JkcyBmb3Igc3ltYm9sICovCi0gIGJmZF9zaXplX3R5cGUgcmNvdW50OwkJCS8qIG51bWJlciBvZiByZWxvY3MgKi8KLSAgYmZkX2J5dGUgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CS8qIHRlbXBvcmFyeSAzMi1iaXQgdmFsdWUgKi8KLSAgdW5zaWduZWQgY2hhciBzeW1sZW5ndGg7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIG5hbWUgKi8KLSAgY2hhciAqbmFtZTsKLSAgCi0gIC8qCi0gICAqIEZpcnN0LCByZWFkIGluIHRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbgotICAgKiBlbnRyaWVzIGZvciB0aGlzIHN5bWJvbAotICAgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wLCA0LCAxLCBhYmZkKSAhPSA0KQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIHJjb3VudCA9IGJmZF9nZXRfMzIgKGFiZmQsIHRlbXApOwotICAKLSAgLyoKLSAgICogTmV4dCwgcmVhZCBpbiB0aGUgbGVuZ3RoIG9mIHRoZSBzeW1ib2wKLSAgICovCi0gIAotICBpZiAoYmZkX3JlYWQgKChQVFIpICZzeW1sZW5ndGgsIHNpemVvZiAoc3ltbGVuZ3RoKSwgMSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3ltbGVuZ3RoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bSAtPiBzeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN5bWxlbmd0aCArIDEpOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIC8qCi0gICAqIFRoZW4gcmVhZCBpbiB0aGUgc3ltYm9sCi0gICAqLwotICAKLSAgaWYgKGJmZF9yZWFkIChuYW1lLCBzeW1sZW5ndGgsIDEsIGFiZmQpICE9IHN5bWxlbmd0aCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5hbWVbc3ltbGVuZ3RoXSA9ICdcMCc7Ci0gIHN5bSAtPiBzeW1ib2wubmFtZSA9IG5hbWU7Ci0gIHN5bSAtPiBzeW1ib2wuZmxhZ3MgPSAwOwotICBzeW0gLT4gc3ltYm9sLnZhbHVlID0gMDsKLSAgc3ltIC0+IHN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgCi0gIC8qCi0gICAqIE5leHQsIHN0YXJ0IHJlYWRpbmcgaW4gdGhlIHJlbG9jcy4KLSAgICovCi0gIAotICBubG1fcmVsb2NzID0gKChzdHJ1Y3QgbmxtX3JlbGVudCAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHJjb3VudCAqIHNpemVvZiAoc3RydWN0IG5sbV9yZWxlbnQpKSk7Ci0gIGlmICghbmxtX3JlbG9jcykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bSAtPiByZWxvY3MgPSBubG1fcmVsb2NzOwotICBzeW0gLT4gcmNudCA9IDA7Ci0gIHdoaWxlIChzeW0gLT4gcmNudCA8IHJjb3VudCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgIAotICAgICAgaWYgKG5sbV9zcGFyY19yZWFkX3JlbG9jIChhYmZkLCBzeW0sICZzZWN0aW9uLAotCQkJICAgICAgJm5sbV9yZWxvY3MgLT4gcmVsb2MpCi0JICA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBubG1fcmVsb2NzIC0+IHNlY3Rpb24gPSBzZWN0aW9uOwotICAgICAgbmxtX3JlbG9jcysrOwotICAgICAgc3ltIC0+IHJjbnQrKzsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NwYXJjX3dyaXRlX2ltcG9ydCAoYWJmZCwgc2VjLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBjaGFyIHRlbXBbNF07Ci0gIGFzZWN0aW9uICpjb2RlLCAqZGF0YSwgKmJzcywgKnN5bXNlYzsKLSAgYmZkX3ZtYSBiYXNlOwotCi0gIGNvZGUgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gIGRhdGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIGJzcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBzeW1zZWMgPSAoKnJlbC0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uOwotCi0gIGlmIChzeW1zZWMgPT0gY29kZSkgewotICAgIGJhc2UgPSAwOwotICB9IGVsc2UgaWYgKHN5bXNlYyA9PSBkYXRhKSB7Ci0gICAgYmFzZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGUpOwotICB9IGVsc2UgaWYgKHN5bXNlYyA9PSBic3MpIHsKLSAgICBiYXNlID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZSkgKyBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBkYXRhKTsKLSAgfSBlbHNlCi0gICAgYmFzZSA9IDA7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICIlczogIDwleCwgMT5cblx0IiwKLQkgICBfX0ZVTkNUSU9OX18sIGJhc2UgKyAoKnJlbC0+c3ltX3B0cl9wdHIpLT52YWx1ZSk7Ci0jZW5kaWYKLSAgYmZkX3B1dF8zMiAoYWJmZCwgYmFzZSArICgqcmVsLT5zeW1fcHRyX3B0ciktPnZhbHVlLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUil0ZW1wLCA0LCAxLCBhYmZkKSAhPSA0KQotICAgIHJldHVybiBmYWxzZTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgMSwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpdGVtcCwgNCwgMSwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChubG1fc3BhcmNfd3JpdGVfcmVsb2MgKGFiZmQsIHNlYywgcmVsKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zcGFyY193cml0ZV9leHRlcm5hbCAoYWJmZCwgY291bnQsIHN5bSwgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgc3RydWN0IHJlbG9jX2FuZF9zZWMgKnJlbG9jczsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJmZF9ieXRlIGxlbjsKLSAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICBiZmRfcHV0XzMyIChhYmZkLCBjb3VudCwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKHRlbXAsIHNpemVvZih0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbGVuID0gc3RybGVuIChzeW0tPm5hbWUpOwotICBpZiAoKGJmZF93cml0ZSAoJmxlbiwgc2l6ZW9mIChiZmRfYnl0ZSksIDEsIGFiZmQpICE9IHNpemVvZihiZmRfYnl0ZSkpCi0gICAgICB8fCBiZmRfd3JpdGUgKHN5bS0+bmFtZSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChubG1fc3BhcmNfd3JpdGVfcmVsb2MgKGFiZmQsIHJlbG9jc1tpXS5zZWMsCi0JCQkJIHJlbG9jc1tpXS5yZWwpID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3BhcmNfd3JpdGVfZXhwb3J0IChhYmZkLCBzeW0sIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgYmZkX2J5dGUgbGVuOwotICBiZmRfYnl0ZSB0ZW1wWzRdOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IDwleCwgJWQsICVzPlxuIiwKLQkgICBfX0ZVTkNUSU9OX18sIHZhbHVlLCBzdHJsZW4gKHN5bS0+bmFtZSksIHN5bS0+bmFtZSk7Ci0jZW5kaWYKLSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsdWUsIHRlbXApOwotICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7Ci0KLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgNCwgMSwgYWJmZCkgIT0gNAotICAgICAgfHwgYmZkX3dyaXRlICgmbGVuLCAxLCAxLCBhYmZkKSAhPSAxCi0gICAgICB8fCBiZmRfd3JpdGUgKHN5bS0+bmFtZSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jdW5kZWYgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luCi0jdW5kZWYgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dAotCi0jaW5jbHVkZSAibmxtc3dhcC5oIgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEgbmxtMzJfc3BhcmNfYmFja2VuZCA9Ci17Ci0gICJOZXRXYXJlIFNQQVJDIE1vZHVsZSAgIFwwMzIiLAotICBzaXplb2YgKE5sbTMyX3NwYXJjX0V4dGVybmFsX0ZpeGVkX0hlYWRlciksCi0gIDAsCS8qIG9wdGlvbmFsX3ByZWZpeF9zaXplICovCi0gIGJmZF9hcmNoX3NwYXJjLAotICAwLAotICBmYWxzZSwKLSAgMCwJLyogYmFja2VuZF9vYmplY3RfcCAqLwotICAwLAkvKiB3cml0ZV9wcmVmaXhfZnVuYyAqLwotICBubG1fc3BhcmNfcmVhZF9yZWxvYywKLSAgbmxtX3NwYXJjX21hbmdsZV9yZWxvY3MsCi0gIG5sbV9zcGFyY19yZWFkX2ltcG9ydCwKLSAgbmxtX3NwYXJjX3dyaXRlX2ltcG9ydCwKLSAgMCwJLyogc2V0X3B1YmxpY19zZWN0aW9uICovCi0gIDAsCS8qIGdldF9wdWJsaWNfb2Zmc2V0ICovCi0gIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbiwKLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCwKLSAgbmxtX3NwYXJjX3dyaXRlX2V4dGVybmFsLAotICBubG1fc3BhcmNfd3JpdGVfZXhwb3J0Ci19OwotCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJIm5sbTMyLXNwYXJjIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJbmxtTkFNRShzcGFyY192ZWMpCi0jZGVmaW5lIFRBUkdFVF9CQUNLRU5EX0RBVEEJCSZubG0zMl9zcGFyY19iYWNrZW5kCi0KLSNpbmNsdWRlICJubG0tdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtMzIuYyBiL2JmZC9ubG0zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzMwZTRmLi4wMDAwMDAwCi0tLSBhL2JmZC9ubG0zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgMzItYml0IGV4ZWN1dGFibGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0jaW5jbHVkZSAibmxtY29kZS5oIgpkaWZmIC0tZ2l0IGEvYmZkL25sbTY0LmMgYi9iZmQvbmxtNjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRjZDk2YS4uMDAwMDAwMAotLS0gYS9iZmQvbmxtNjQuYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIDY0LWJpdCBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRSA2NAotI2luY2x1ZGUgIm5sbWNvZGUuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG1jb2RlLmggYi9iZmQvbmxtY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2FjMGMzLi4wMDAwMDAwCi0tLSBhL2JmZC9ubG1jb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDU2ICswLDAgQEAKLS8qIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIGV4ZWN1dGFibGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIHVzaW5nIEVMRiBzdXBwb3J0IGFzIHRoZQotICAgdGVtcGxhdGUuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYm5sbS5oIgotCi0vKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBkbyBub3QgdXNlIHRoZSBuYW1lcyB0aGV5IGFwcGVhciB0byB1c2UuCi0gICBUaGlzIGZpbGUgaXMgYWN0dWFsbHkgY29tcGlsZWQgbXVsdGlwbGUgdGltZXMsIG9uY2UgZm9yIGVhY2ggc2l6ZQotICAgb2YgTkxNIHRhcmdldCB3ZSBhcmUgdXNpbmcuICBBdCBlYWNoIHNpemUgd2UgdXNlIGEgZGlmZmVyZW50IG5hbWUsCi0gICBjb25zdHJ1Y3RlZCBieSB0aGUgbWFjcm8gbmxtTkFNRS4gIEZvciBleGFtcGxlLCB0aGUgZnVuY3Rpb24gd2hpY2gKLSAgIGlzIG5hbWVkIG5sbV9zeW1ib2xfdHlwZSBiZWxvdyBpcyBhY3R1YWxseSBuYW1lZCBubG0zMl9zeW1ib2xfdHlwZQotICAgaW4gdGhlIGZpbmFsIGV4ZWN1dGFibGUuICAqLwotCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIJTmxtTkFNRShFeHRlcm5hbF9GaXhlZF9IZWFkZXIpCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9WZXJzaW9uX0hlYWRlcglObG1OQU1FKEV4dGVybmFsX1ZlcnNpb25fSGVhZGVyKQotI2RlZmluZSBObG1fRXh0ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcglObG1OQU1FKEV4dGVybmFsX0NvcHlyaWdodF9IZWFkZXIpCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9FeHRlbmRlZF9IZWFkZXIJTmxtTkFNRShFeHRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9DdXN0b21fSGVhZGVyCU5sbU5BTUUoRXh0ZXJuYWxfQ3VzdG9tX0hlYWRlcikKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0N5Z251c19FeHRfSGVhZGVyCU5sbU5BTUUoRXh0ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIpCi0KLSNkZWZpbmUgbmxtX3N5bWJvbF90eXBlCQkJbmxtTkFNRShzeW1ib2xfdHlwZSkKLSNkZWZpbmUgbmxtX2dldF9zeW10YWJfdXBwZXJfYm91bmQJbmxtTkFNRShnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKQotI2RlZmluZSBubG1fZ2V0X3N5bXRhYgkJCW5sbU5BTUUoZ2V0X3N5bXRhYikKLSNkZWZpbmUgbmxtX21ha2VfZW1wdHlfc3ltYm9sCQlubG1OQU1FKG1ha2VfZW1wdHlfc3ltYm9sKQotI2RlZmluZSBubG1fcHJpbnRfc3ltYm9sCQlubG1OQU1FKHByaW50X3N5bWJvbCkKLSNkZWZpbmUgbmxtX2dldF9zeW1ib2xfaW5mbwkJbmxtTkFNRShnZXRfc3ltYm9sX2luZm8pCi0jZGVmaW5lIG5sbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQJbmxtTkFNRShnZXRfcmVsb2NfdXBwZXJfYm91bmQpCi0jZGVmaW5lIG5sbV9jYW5vbmljYWxpemVfcmVsb2MJCW5sbU5BTUUoY2Fub25pY2FsaXplX3JlbG9jKQotI2RlZmluZSBubG1fb2JqZWN0X3AJCQlubG1OQU1FKG9iamVjdF9wKQotI2RlZmluZSBubG1fc2V0X3NlY3Rpb25fY29udGVudHMJbmxtTkFNRShzZXRfc2VjdGlvbl9jb250ZW50cykKLSNkZWZpbmUgbmxtX3dyaXRlX29iamVjdF9jb250ZW50cwlubG1OQU1FKHdyaXRlX29iamVjdF9jb250ZW50cykKLQotI2RlZmluZSBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4oYWJmZCxzcmMsZHN0KSBcCi0gIChubG1fc3dhcF9maXhlZF9oZWFkZXJfaW5fZnVuYyhhYmZkKSkoYWJmZCxzcmMsZHN0KQotI2RlZmluZSBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0KGFiZmQsc3JjLGRzdCkgXAotICAobmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dF9mdW5jKGFiZmQpKShhYmZkLHNyYyxkc3QpCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIHN0YXRpYyBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGJvb2xlYW4gYWRkX2JmZF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBjaGFyICosIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gbmxtX3N3YXBfdmFyaWFibGVfaGVhZGVyX2luCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBmaW5kX25vbnplcm8KLSAgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zbHVycF9zeW1ib2xfdGFibGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zbHVycF9yZWxvY19maXh1cHMKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgbmxtX2V4dGVybmFsX3JlbG9jX2NvbXBhcmUKLSAgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLQotLyogU2hvdWxkIHBlcmhhcHMgdXNlIHB1dF9vZmZzZXQsIHB1dF93b3JkLCBldGMuICBGb3Igbm93LCB0aGUgdHdvIHZlcnNpb25zCi0gICBjYW4gYmUgaGFuZGxlZCBieSBleHBsaWNpdGx5IHNwZWNpZnlpbmcgMzIgYml0cyBvciAidGhlIGxvbmcgdHlwZSIuICAqLwotI2lmIEFSQ0hfU0laRSA9PSA2NAotI2RlZmluZSBwdXRfd29yZAliZmRfaF9wdXRfNjQKLSNkZWZpbmUgZ2V0X3dvcmQJYmZkX2hfZ2V0XzY0Ci0jZW5kaWYKLSNpZiBBUkNIX1NJWkUgPT0gMzIKLSNkZWZpbmUgcHV0X3dvcmQJYmZkX2hfcHV0XzMyCi0jZGVmaW5lIGdldF93b3JkCWJmZF9oX2dldF8zMgotI2VuZGlmCi0KLWNvbnN0IGJmZF90YXJnZXQgKgotbmxtX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBubG1fb2JqX3RkYXRhICpwcmVzZXJ2ZWRfdGRhdGEgPSBubG1fdGRhdGEgKGFiZmQpOwotICBib29sZWFuICgqYmFja2VuZF9vYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKLSAgUFRSIHhfZnhkaGRyID0gTlVMTDsKLSAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqaV9meGRoZHJwOwotICBzdHJ1Y3QgbmxtX29ial90ZGF0YSAqbmV3X3RkYXRhID0gTlVMTDsKLSAgY29uc3QgY2hhciAqc2lnbmF0dXJlOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLQotICAvKiBTb21lIE5MTSBmb3JtYXRzIGhhdmUgYSBwcmVmaXggYmVmb3JlIHRoZSBzdGFuZGFyZCBOTE0gZml4ZWQKLSAgICAgaGVhZGVyLiAgKi8KLSAgYmFja2VuZF9vYmplY3RfcCA9IG5sbV9iYWNrZW5kX29iamVjdF9wX2Z1bmMgKGFiZmQpOwotICBpZiAoYmFja2VuZF9vYmplY3RfcCkKLSAgICB7Ci0gICAgICBpZiAoISgqYmFja2VuZF9vYmplY3RfcCkgKGFiZmQpKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICB9Ci0KLSAgLyogUmVhZCBpbiB0aGUgZml4ZWQgbGVuZ3RoIHBvcnRpb24gb2YgdGhlIE5MTSBoZWFkZXIgaW4gZXh0ZXJuYWwgZm9ybWF0LiAgKi8KLQotICB4X2Z4ZGhkciA9IChQVFIpIGJmZF9tYWxsb2MgKChzaXplX3QpIG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCkpOwotICBpZiAoeF9meGRoZHIgPT0gTlVMTCkKLSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIHhfZnhkaGRyLCBubG1fZml4ZWRfaGVhZGVyX3NpemUgKGFiZmQpLCAxLCBhYmZkKSAhPQotICAgICAgbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgICAgZWxzZQotCWdvdG8gZ290X25vX21hdGNoOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgbmxtX29ial90ZGF0YSBzdHJ1Y3R1cmUgYW5kIGhvb2sgaXQgdXAgdG8KLSAgICAgdGhlIHRkYXRhIHBvaW50ZXIgaW4gdGhlIGJmZC4gICovCi0KLSAgbmV3X3RkYXRhID0gKChzdHJ1Y3QgbmxtX29ial90ZGF0YSAqKQotCSAgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBubG1fb2JqX3RkYXRhKSkpOwotICBpZiAobmV3X3RkYXRhID09IE5VTEwpCi0gICAgZ290byBnb3Rfbm9fbWF0Y2g7Ci0KLSAgbmxtX3RkYXRhIChhYmZkKSA9IG5ld190ZGF0YTsKLQotICBpX2Z4ZGhkcnAgPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKTsKLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luIChhYmZkLCB4X2Z4ZGhkciwgaV9meGRoZHJwKTsKLSAgZnJlZSAoeF9meGRoZHIpOwotICB4X2Z4ZGhkciA9IE5VTEw7Ci0KLSAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW4gTkxNIGZpbGUgZm9yIHRoaXMgYmFja2VuZCBieSBtYXRjaGluZwotICAgICB0aGUgTkxNIHNpZ25hdHVyZS4gKi8KLQotICBzaWduYXR1cmUgPSBubG1fc2lnbmF0dXJlIChhYmZkKTsKLSAgaWYgKHNpZ25hdHVyZSAhPSBOVUxMCi0gICAgICAmJiAqc2lnbmF0dXJlICE9ICdcMCcKLSAgICAgICYmIHN0cm5jbXAgKChjaGFyICopIGlfZnhkaGRycC0+c2lnbmF0dXJlLCBzaWduYXR1cmUsCi0JCSAgTkxNX1NJR05BVFVSRV9TSVpFKSAhPSAwKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICAvKiBUaGVyZSdzIG5vIHN1cHBvcnRlZCB3YXkgdG8gZGlzY292ZXIgdGhlIGVuZGlhbmVzcyBvZiBhbiBOTE0sIHNvIHRlc3QgZm9yCi0gICAgIGEgc2FuZSB2ZXJzaW9uIG51bWJlciBhZnRlciBkb2luZyBieXRlIHN3YXBwaW5nIGFwcHJvcHJpYXRlIGZvciB0aGlzCi0gICAgIFhWRUMuICAoSGFjayBhbGVydCEpICovCi0KLSAgaWYgKGlfZnhkaGRycC0+dmVyc2lvbiA+IDB4RkZGRikKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0KLSAgLyogVGhlcmUncyBubyBzdXBwb3J0ZWQgd2F5IHRvIGNoZWNrIGZvciAzMiBiaXQgdmVyc3VzIDY0IGJpdCBhZGRyZXNzZXMsCi0gICAgIHNvIGlnbm9yZSB0aGlzIGRpc3RpbmN0aW9uIGZvciBub3cuICAoRklYTUUpICovCi0KLSAgLyogU3dhcCBpbiB0aGUgcmVzdCBvZiB0aGUgcmVxdWlyZWQgaGVhZGVyLiAgKi8KLSAgaWYgKCFubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfaW4gKGFiZmQpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgICBlbHNlCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgfQotCi0gIC8qIEFkZCB0aGUgc2VjdGlvbnMgc3VwcGxpZWQgYnkgYWxsIE5MTSdzLCBhbmQgdGhlbiByZWFkIGluIHRoZQotICAgICBhdXhpbGlhcnkgaGVhZGVycy4gIFJlYWRpbmcgdGhlIGF1eGlsaWFyeSBoZWFkZXJzIG1heSBjcmVhdGUKLSAgICAgYWRkaXRpb25hbCBzZWN0aW9ucyBkZXNjcmliZWQgaW4gdGhlIGN5Z251c19leHQgaGVhZGVyLgotICAgICBGcm9tIHRoaXMgcG9pbnQgb24gd2UgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhbiBOTE0sIGFuZCBkbyBub3QKLSAgICAgdHJlYXQgZXJyb3JzIGFzIGluZGljYXRpbmcgdGhlIHdyb25nIGZvcm1hdC4gICovCi0KLSAgaWYgKCFhZGRfYmZkX3NlY3Rpb24gKGFiZmQsIE5MTV9DT0RFX05BTUUsCi0JCQlpX2Z4ZGhkcnAtPmNvZGVJbWFnZU9mZnNldCwKLQkJCWlfZnhkaGRycC0+Y29kZUltYWdlU2l6ZSwKLQkJCShTRUNfQ09ERSB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCQkJIHwgU0VDX1JFTE9DKSkKLSAgICAgIHx8ICFhZGRfYmZkX3NlY3Rpb24gKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUsCi0JCQkgICBpX2Z4ZGhkcnAtPmRhdGFJbWFnZU9mZnNldCwKLQkJCSAgIGlfZnhkaGRycC0+ZGF0YUltYWdlU2l6ZSwKLQkJCSAgIChTRUNfREFUQSB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCQkJICAgIHwgU0VDX1JFTE9DKSkKLSAgICAgIHx8ICFhZGRfYmZkX3NlY3Rpb24gKGFiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSwKLQkJCSAgIChmaWxlX3B0cikgMCwKLQkJCSAgIGlfZnhkaGRycC0+dW5pbml0aWFsaXplZERhdGFTaXplLAotCQkJICAgU0VDX0FMTE9DKSkKLSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLQotICBpZiAoIW5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luIChhYmZkKSkKLSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLQotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mUmVsb2NhdGlvbkZpeHVwcyAhPSAwCi0gICAgICB8fCBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMgIT0gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfUkVMT0M7Ci0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZQdWJsaWNzICE9IDAKLSAgICAgIHx8IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZkRlYnVnUmVjb3JkcyAhPSAwCi0gICAgICB8fCBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMgIT0gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQotICBhcmNoID0gbmxtX2FyY2hpdGVjdHVyZSAoYWJmZCk7Ci0gIGlmIChhcmNoICE9IGJmZF9hcmNoX3Vua25vd24pCi0gICAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCi0gIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jb2RlU3RhcnRPZmZzZXQ7Ci0KLSAgcmV0dXJuIChhYmZkLT54dmVjKTsKLQotZ290X3dyb25nX2Zvcm1hdF9lcnJvcjoKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci1nb3Rfbm9fbWF0Y2g6Ci0gIG5sbV90ZGF0YSAoYWJmZCkgPSBwcmVzZXJ2ZWRfdGRhdGE7Ci0gIGlmIChuZXdfdGRhdGEgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgbmV3X3RkYXRhKTsKLSAgaWYgKHhfZnhkaGRyICE9IE5VTEwpCi0gICAgZnJlZSAoeF9meGRoZHIpOwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKiBBZGQgYSBzZWN0aW9uIHRvIHRoZSBiZmQuICovCi0KLXN0YXRpYyBib29sZWFuCi1hZGRfYmZkX3NlY3Rpb24gKGFiZmQsIG5hbWUsIG9mZnNldCwgc2l6ZSwgZmxhZ3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBhc2VjdGlvbiAqbmV3c2VjdDsKLQotICBuZXdzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gIGlmIChuZXdzZWN0ID09IE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgfQotICBuZXdzZWN0LT52bWEgPSAwOwkJLyogTkxNJ3MgYXJlIHJlbG9jYXRhYmxlLiAqLwotICBuZXdzZWN0LT5fcmF3X3NpemUgPSBzaXplOwotICBuZXdzZWN0LT5maWxlcG9zID0gb2Zmc2V0OwotICBuZXdzZWN0LT5mbGFncyA9IGZsYWdzOwotICBuZXdzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSBiZmRfbG9nMiAoMCk7CS8qIEZJWE1FICovCi0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qIFJlYWQgYW5kIHN3YXAgaW4gdGhlIHZhcmlhYmxlIGxlbmd0aCBoZWFkZXIuICBBbGwgdGhlIGZpZWxkcyBtdXN0Ci0gICBleGlzdCBpbiB0aGUgTkxNLCBhbmQgbXVzdCBleGlzdCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgcmVhZCBoZXJlLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3N3YXBfdmFyaWFibGVfaGVhZGVyX2luIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgLyogUmVhZCB0aGUgZGVzY3JpcHRpb24gbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCwKLQkJc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgpLAotCQkxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvblRleHQsCi0JCW5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCArIDEsCi0JCTEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBSZWFkIGFuZCBjb252ZXJ0IHRoZSBzdGFja1NpemUgZmllbGQuICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiAoZmFsc2UpOwotICBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c3RhY2tTaXplID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0ZW1wKTsKLQotICAvKiBSZWFkIGFuZCBjb252ZXJ0IHRoZSByZXNlcnZlZCBmaWVsZC4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGVtcCk7Ci0KLSAgLyogUmVhZCB0aGUgb2xkVGhyZWFkTmFtZSBmaWVsZC4gIFRoaXMgZmllbGQgaXMgYSBmaXhlZCBsZW5ndGggc3RyaW5nLiAqLwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPm9sZFRocmVhZE5hbWUsCi0JCXNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPm9sZFRocmVhZE5hbWUpLAotCQkxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgLyogUmVhZCB0aGUgc2NyZWVuIG5hbWUgbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoLAotCQlzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoKSwKLQkJMSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lLAotCQlubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCArIDEsCi0JCTEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGggKyAxKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIFJlYWQgdGhlIHRocmVhZCBuYW1lIGxlbmd0aCBhbmQgdGV4dCBtZW1iZXJzLiAqLwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJiBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCwKLQkJc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCksCi0JCTEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZSwKLQkJbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGggKyAxLAotCQkxLCBhYmZkKSAhPQotICAgICAgKGJmZF9zaXplX3R5cGUpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoICsgMSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyogU3dhcCBhbmQgd3JpdGUgb3V0IHRoZSB2YXJpYWJsZSBsZW5ndGggaGVhZGVyLiAgQWxsIHRoZSBmaWVsZHMgbXVzdAotICAgZXhpc3QgaW4gdGhlIE5MTSwgYW5kIG11c3QgZXhpc3QgaW4gdGhpcyBvcmRlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfb3V0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgLyogV3JpdGUgdGhlIGRlc2NyaXB0aW9uIGxlbmd0aCBhbmQgdGV4dCBtZW1iZXJzLiAqLwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICYgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoLAotCQkgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgpLAotCQkgMSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uVGV4dCwKLQkJIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCArIDEsCi0JCSAxLCBhYmZkKSAhPQotICAgICAgKGJmZF9zaXplX3R5cGUpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCArIDEpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgLyogQ29udmVydCBhbmQgd3JpdGUgdGhlIHN0YWNrU2l6ZSBmaWVsZC4gKi8KLQotICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zdGFja1NpemUsCi0JICAgIChiZmRfYnl0ZSAqKSB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBDb252ZXJ0IGFuZCB3cml0ZSB0aGUgcmVzZXJ2ZWQgZmllbGQuICovCi0KLSAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQsCi0JICAgIChiZmRfYnl0ZSAqKSB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBXcml0ZSB0aGUgb2xkVGhyZWFkTmFtZSBmaWVsZC4gIFRoaXMgZmllbGQgaXMgYSBmaXhlZCBsZW5ndGggc3RyaW5nLiAqLwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lLAotCQkgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSksCi0JCSAxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgLyogV3JpdGUgdGhlIHNjcmVlbiBuYW1lIGxlbmd0aCBhbmQgdGV4dCBtZW1iZXJzLiAqLwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICYgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgsCi0JCSBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoKSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWUsCi0JCSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCArIDEsCi0JCSAxLCBhYmZkKSAhPQotICAgICAgKGJmZF9zaXplX3R5cGUpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoICsgMSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBXcml0ZSB0aGUgdGhyZWFkIG5hbWUgbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCwKLQkJIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGgpLAotCQkgMSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZSwKLQkJIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoICsgMSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGggKyAxKQotICAgIHJldHVybiAoZmFsc2UpOwotICByZXR1cm4gKHRydWUpOwotfQotCi0vKiBSZWFkIGFuZCBzd2FwIGluIHRoZSBjb250ZW50cyBvZiBhbGwgdGhlIGF1eGlsaWFyeSBoZWFkZXJzLiAgQmVjYXVzZSBvZgotICAgdGhlIGJyYWluZGVhZCBkZXNpZ24sIHdlIGhhdmUgdG8gZG8gc3RyY21wcyBvbiBzdHJpbmdzIG9mIGluZGV0ZXJtaW5hdGUKLSAgIGxlbmd0aCB0byBmaWd1cmUgb3V0IHdoYXQgZWFjaCBhdXhpbGlhcnkgaGVhZGVyIGlzLiAgRXZlbiB3b3JzZSwgd2UgaGF2ZQotICAgbm8gd2F5IG9mIGtub3dpbmcgaG93IG1hbnkgYXV4aWxpYXJ5IGhlYWRlcnMgdGhlcmUgYXJlIG9yIHdoZXJlIHRoZSBlbmQKLSAgIG9mIHRoZSBhdXhpbGlhcnkgaGVhZGVycyBhcmUsIGV4Y2VwdCBieSBmaW5kaW5nIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QKLSAgIGxvb2sgbGlrZSBhIGtub3duIGF1eGlsaWFyeSBoZWFkZXIuICBUaGlzIG1lYW5zIHRoYXQgdGhlIGZpcnN0IG5ldyB0eXBlCi0gICBvZiBhdXhpbGlhcnkgaGVhZGVyIGFkZGVkIHdpbGwgYnJlYWsgYWxsIGV4aXN0aW5nIHRvb2xzIHRoYXQgZG9uJ3QKLSAgIHJlY29nbml6ZSBpdC4gKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgdGVtcHN0clsxNl07Ci0gIGxvbmcgcG9zaXRpb247Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBwb3NpdGlvbiA9IGJmZF90ZWxsIChhYmZkKTsKLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcHN0ciwgc2l6ZW9mICh0ZW1wc3RyKSwgMSwgYWJmZCkgIT0KLQkgIHNpemVvZiAodGVtcHN0cikpCi0JcmV0dXJuIChmYWxzZSk7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHBvc2l0aW9uLCBTRUVLX1NFVCkgPT0gLTEpCi0JcmV0dXJuIChmYWxzZSk7Ci0gICAgICBpZiAoc3RybmNtcCAodGVtcHN0ciwgIlZlUnNJb04jIiwgOCkgPT0gMCkKLQl7Ci0JICBObG1fRXh0ZXJuYWxfVmVyc2lvbl9IZWFkZXIgdGhkcjsKLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgJiB0aGRyLCBzaXplb2YgKHRoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRoZHIpKQotCSAgICByZXR1cm4gKGZhbHNlKTsKLQkgIG1lbWNweSAobmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+c3RhbXAsIHRoZHIuc3RhbXAsCi0JCSAgc2l6ZW9mICh0aGRyLnN0YW1wKSk7Ci0JICBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5tYWpvclZlcnNpb24gPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIubWFqb3JWZXJzaW9uKTsKLQkgIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1pbm9yVmVyc2lvbiA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5taW5vclZlcnNpb24pOwotCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+cmV2aXNpb24gPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmV2aXNpb24pOwotCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+eWVhciA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci55ZWFyKTsKLQkgIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1vbnRoID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1vbnRoKTsKLQkgIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPmRheSA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5kYXkpOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHRlbXBzdHIsICJNZVNzQWdFcyIsIDgpID09IDApCi0JewotCSAgTmxtX0V4dGVybmFsX0V4dGVuZGVkX0hlYWRlciB0aGRyOwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCi0JICAgIHJldHVybiAoZmFsc2UpOwotCSAgbWVtY3B5IChubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c3RhbXAsIHRoZHIuc3RhbXAsCi0JCSAgc2l6ZW9mICh0aGRyLnN0YW1wKSk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bGFuZ3VhZ2VJRCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5sYW5ndWFnZUlEKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5tZXNzYWdlRmlsZU9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlRmlsZU9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bWVzc2FnZUZpbGVMZW5ndGggPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIubWVzc2FnZUZpbGVMZW5ndGgpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPm1lc3NhZ2VDb3VudCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlQ291bnQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPmhlbHBGaWxlT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmhlbHBGaWxlT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5oZWxwRmlsZUxlbmd0aCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5oZWxwRmlsZUxlbmd0aCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+UlBDRGF0YU9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5SUENEYXRhT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5SUENEYXRhTGVuZ3RoID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLlJQQ0RhdGFMZW5ndGgpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZENvZGVPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkQ29kZU9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkQ29kZUxlbmd0aCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRDb2RlTGVuZ3RoKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWREYXRhT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERhdGFPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERhdGFMZW5ndGggPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGF0YUxlbmd0aCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUmVsb2NhdGlvbkZpeHVwT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZFJlbG9jYXRpb25GaXh1cE9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRFeHRlcm5hbFJlZmVyZW5jZUNvdW50ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlQ291bnQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZFB1YmxpY3NPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUHVibGljc09mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUHVibGljc0NvdW50ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZFB1YmxpY3NDb3VudCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGVidWdSZWNvcmRPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGVidWdSZWNvcmRPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERlYnVnUmVjb3JkQ291bnQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGVidWdSZWNvcmRDb3VudCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+U2hhcmVkSW5pdGlhbGl6YXRpb25PZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkSW5pdGlhbGl6YXRpb25PZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlNoYXJlZEV4aXRQcm9jZWR1cmVPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuU2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cHJvZHVjdElEID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnByb2R1Y3RJRCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQwID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQxID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMSk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQyID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMik7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQzID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMyk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQ0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkNCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQ1ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkNSk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAodGVtcHN0ciwgIkNvUHlSaUdoVD0iLCAxMCkgPT0gMCkKLQl7Ci0JICBpZiAoYmZkX3JlYWQgKChQVFIpIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+c3RhbXAsCi0JCQlzaXplb2YgKG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+c3RhbXApLAotCQkJMSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2YgKG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+c3RhbXApKQotCSAgICByZXR1cm4gKGZhbHNlKTsKLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgJiAobmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpCi0JCQkJIC0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aCksCi0JCQkxLCAxLCBhYmZkKSAhPSAxKQotCSAgICByZXR1cm4gKGZhbHNlKTsKLQkgIC8qIFRoZSBjb3B5cmlnaHQgbWVzc2FnZSBpcyBhIHZhcmlhYmxlIGxlbmd0aCBzdHJpbmcuICovCi0JICBpZiAoYmZkX3JlYWQgKChQVFIpIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+Y29weXJpZ2h0TWVzc2FnZSwKLQkJICAgIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aCArIDEsCi0JCQkxLCBhYmZkKSAhPQotCSAgICAgICgoYmZkX3NpemVfdHlwZSkKLQkgICAgICAgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoICsgMSkpCi0JICAgIHJldHVybiAoZmFsc2UpOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHRlbXBzdHIsICJDdVN0SGVBZCIsIDgpID09IDApCi0JewotCSAgTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIgdGhkcjsKLQkgIGJmZF9zaXplX3R5cGUgaGRyTGVuZ3RoOwotCSAgZmlsZV9wdHIgZGF0YU9mZnNldDsKLQkgIGJmZF9zaXplX3R5cGUgZGF0YUxlbmd0aDsKLQkgIGNoYXIgZGF0YVN0YW1wWzhdOwotCSAgUFRSIGhkcjsKLQotCSAgLyogUmVhZCB0aGUgc3RhbXAgKCJDdVN0SGVBZCIpLiAgKi8KLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgdGhkci5zdGFtcCwgMSwgc2l6ZW9mICh0aGRyLnN0YW1wKSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2YgKHRoZHIuc3RhbXApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBSZWFkIHRoZSBsZW5ndGggb2YgdGhpcyBjdXN0b20gaGVhZGVyLiAgKi8KLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgdGhkci5sZW5ndGgsIDEsIHNpemVvZiAodGhkci5sZW5ndGgpLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAodGhkci5sZW5ndGgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBoZHJMZW5ndGggPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIubGVuZ3RoKTsKLQkgIC8qIFJlYWQgZnVydGhlciBmaWVsZHMgaWYgd2UgaGF2ZSB0aGVtLiAgKi8KLQkgIGlmIChoZHJMZW5ndGggPCBOTE1fVEFSR0VUX0xPTkdfU0laRSkKLQkgICAgZGF0YU9mZnNldCA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIHRoZHIuZGF0YU9mZnNldCwgMSwKLQkJCSAgICBzaXplb2YgKHRoZHIuZGF0YU9mZnNldCksIGFiZmQpCi0JCSAgIT0gc2l6ZW9mICh0aGRyLmRhdGFPZmZzZXQpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgZGF0YU9mZnNldCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5kYXRhT2Zmc2V0KTsKLQkgICAgfQotCSAgaWYgKGhkckxlbmd0aCA8IDIgKiBOTE1fVEFSR0VUX0xPTkdfU0laRSkKLQkgICAgZGF0YUxlbmd0aCA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIHRoZHIuZGF0YUxlbmd0aCwgMSwKLQkJCSAgICBzaXplb2YgKHRoZHIuZGF0YUxlbmd0aCksIGFiZmQpCi0JCSAgIT0gc2l6ZW9mICh0aGRyLmRhdGFMZW5ndGgpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgZGF0YUxlbmd0aCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5kYXRhTGVuZ3RoKTsKLQkgICAgfQotCSAgaWYgKGhkckxlbmd0aCA8IDIgKiBOTE1fVEFSR0VUX0xPTkdfU0laRSArIDgpCi0JICAgIG1lbXNldCAoZGF0YVN0YW1wLCAwLCBzaXplb2YgKGRhdGFTdGFtcCkpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSBkYXRhU3RhbXAsIDEsIHNpemVvZiAoZGF0YVN0YW1wKSwgYWJmZCkKLQkJICAhPSBzaXplb2YgKGRhdGFTdGFtcCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBSZWFkIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIsIGlmIGFueS4gICovCi0JICBpZiAoaGRyTGVuZ3RoIDw9IDIgKiBOTE1fVEFSR0VUX0xPTkdfU0laRSArIDgpCi0JICAgIHsKLQkgICAgICBoZHIgPSBOVUxMOwotCSAgICAgIGhkckxlbmd0aCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGhkckxlbmd0aCAtPSAyICogTkxNX1RBUkdFVF9MT05HX1NJWkUgKyA4OwotCSAgICAgIGhkciA9IGJmZF9hbGxvYyAoYWJmZCwgaGRyTGVuZ3RoKTsKLQkgICAgICBpZiAoaGRyID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoYmZkX3JlYWQgKGhkciwgMSwgaGRyTGVuZ3RoLCBhYmZkKSAhPSBoZHJMZW5ndGgpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSBoYXZlIGZvdW5kIGEgQ3lnbnVzIGhlYWRlciwgcHJvY2VzcyBpdC4gIE90aGVyd2lzZSwKLQkgICAgIGp1c3Qgc2F2ZSB0aGUgYXNzb2NpYXRlZCBkYXRhIHdpdGhvdXQgdHJ5aW5nIHRvIGludGVycHJldAotCSAgICAgaXQuICAqLwotCSAgaWYgKHN0cm5jbXAgKGRhdGFTdGFtcCwgIkN5R25Vc0V4IiwgOCkgPT0gMCkKLQkgICAgewotCSAgICAgIGZpbGVfcHRyIHBvczsKLQkgICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0JICAgICAgYmZkX2J5dGUgKnAsICpwZW5kOwotCi0JICAgICAgQkZEX0FTU0VSVCAoaGRyTGVuZ3RoID09IDAgJiYgaGRyID09IE5VTEwpOwotCi0JICAgICAgcG9zID0gYmZkX3RlbGwgKGFiZmQpOwotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgZGF0YU9mZnNldCwgU0VFS19TRVQpICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGFiZmQsIGRhdGFMZW5ndGgpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKGJmZF9yZWFkIChjb250ZW50cywgMSwgZGF0YUxlbmd0aCwgYWJmZCkgIT0gZGF0YUxlbmd0aCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgcG9zLCBTRUVLX1NFVCkgIT0gMCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgbWVtY3B5IChubG1fY3lnbnVzX2V4dF9oZWFkZXIgKGFiZmQpLCAiQ3lHblVzRXgiLCA4KTsKLQkgICAgICBubG1fY3lnbnVzX2V4dF9oZWFkZXIgKGFiZmQpLT5vZmZzZXQgPSBkYXRhT2Zmc2V0OwotCSAgICAgIG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCktPmxlbmd0aCA9IGRhdGFMZW5ndGg7Ci0KLQkgICAgICAvKiBUaGlzIGRhdGEgdGhpcyBoZWFkZXIgcG9pbnRzIHRvIHByb3ZpZGVzIGEgbGlzdCBvZgotCQkgdGhlIHNlY3Rpb25zIHdoaWNoIHdlcmUgaW4gdGhlIG9yaWdpbmFsIG9iamVjdCBmaWxlCi0JCSB3aGljaCB3YXMgY29udmVydGVkIHRvIGJlY29tZSBhbiBOTE0uICBXZSBsb2NhdGUKLQkJIHRob3NlIHNlY3Rpb25zIGFuZCBhZGQgdGhlbSB0byB0aGUgQkZELiAgTm90ZSB0aGF0Ci0JCSB0aGlzIGlzIGxpa2VseSB0byBjcmVhdGUgYSBzZWNvbmQgLnRleHQsIC5kYXRhIGFuZAotCQkgLmJzcyBzZWN0aW9uOyByZXRyaWV2aW5nIHRoZSBzZWN0aW9ucyBieSBuYW1lIHdpbGwKLQkJIGdldCB0aGUgYWN0dWFsIE5MTSBzZWN0aW9ucywgd2hpY2ggaXMgd2hhdCB3ZSB3YW50IHRvCi0JCSBoYXBwZW4uICBUaGUgc2VjdGlvbnMgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZSwgd2hpY2gKLQkJIG1heSBiZSBzdWJzZXRzIG9mIHRoZSBOTE0gc2VjdGlvbiwgY2FuIG9ubHkgYmUgZm91bmQKLQkJIHVzaW5nIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0JICAgICAgcCA9IGNvbnRlbnRzOwotCSAgICAgIHBlbmQgPSBwICsgZGF0YUxlbmd0aDsKLQkgICAgICB3aGlsZSAocCA8IHBlbmQpCi0JCXsKLQkJICBjaGFyICpuYW1lOwotCQkgIHNpemVfdCBsOwotCQkgIGZpbGVfcHRyIGZpbGVwb3M7Ci0JCSAgYmZkX3NpemVfdHlwZSBzaXplOwotCQkgIGFzZWN0aW9uICpuZXdzZWM7Ci0KLQkJICAvKiBUaGUgZm9ybWF0IG9mIHRoaXMgaW5mb3JtYXRpb24gaXMKLQkJICAgICBudWxsIHRlcm1pbmF0ZWQgc2VjdGlvbiBuYW1lCi0JCSAgICAgemVyb2VzIHRvIGFkanVzdCB0byA0IGJ5dGUgYm91bmRhcnkKLQkJICAgICA0IGJ5dGUgc2VjdGlvbiBkYXRhIGZpbGUgcG9pbnRlcgotCQkgICAgIDQgYnl0ZSBzZWN0aW9uIHNpemUKLQkJICAgICAqLwotCi0JCSAgbmFtZSA9IChjaGFyICopIHA7Ci0JCSAgbCA9IHN0cmxlbiAobmFtZSkgKyAxOwotCQkgIGwgPSAobCArIDMpICZ+IDM7Ci0JCSAgcCArPSBsOwotCQkgIGZpbGVwb3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHApOwotCQkgIHAgKz0gNDsKLQkJICBzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBwKTsKLQkJICBwICs9IDQ7Ci0KLQkJICBuZXdzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0JCSAgaWYgKG5ld3NlYyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBuZXdzZWMtPl9yYXdfc2l6ZSA9IHNpemU7Ci0JCSAgaWYgKGZpbGVwb3MgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgbmV3c2VjLT5maWxlcG9zID0gZmlsZXBvczsKLQkJICAgICAgbmV3c2VjLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1lbWNweSAobmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5zdGFtcCwgdGhkci5zdGFtcCwKLQkJICAgICAgc2l6ZW9mICh0aGRyLnN0YW1wKSk7Ci0JICAgICAgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGggPSBoZHJMZW5ndGg7Ci0JICAgICAgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5kYXRhT2Zmc2V0ID0gZGF0YU9mZnNldDsKLQkgICAgICBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFMZW5ndGggPSBkYXRhTGVuZ3RoOwotCSAgICAgIG1lbWNweSAobmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5kYXRhU3RhbXAsIGRhdGFTdGFtcCwKLQkJICAgICAgc2l6ZW9mIChkYXRhU3RhbXApKTsKLQkgICAgICBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmhkciA9IGhkcjsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gKHRydWUpOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciB0aGVyZSBpcyBhIG5vbi16ZXJvIGJ5dGUgaW4gYSBtZW1vcnkgYmxvY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZmluZF9ub256ZXJvIChidWYsIHNpemUpCi0gICAgIFBUUiBidWY7Ci0gICAgIHNpemVfdCBzaXplOwotewotICBjaGFyICpwID0gKGNoYXIgKikgYnVmOwotCi0gIHdoaWxlIChzaXplLS0gIT0gMCkKLSAgICBpZiAoKnArKyAhPSAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU3dhcCBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBhdXhpbGlhcnkgaGVhZGVycy4gIFdlIGNyZWF0ZSB0aG9zZQotICAgYXV4aWxpYXJ5IGhlYWRlcnMgd2hpY2ggaGF2ZSBiZWVuIHNldCBub24temVyby4gIFdlIGRvIG5vdCByZXF1aXJlCi0gICB0aGUgY2FsbGVyIHRvIHNldCB1cCB0aGUgc3RhbXAgZmllbGRzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAvKiBXcml0ZSBvdXQgdGhlIHZlcnNpb24gaGVhZGVyIGlmIHRoZXJlIGlzIG9uZS4gICovCi0gIGlmIChmaW5kX25vbnplcm8gKChQVFIpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlcikpKQotICAgIHsKLSAgICAgIE5sbV9FeHRlcm5hbF9WZXJzaW9uX0hlYWRlciB0aGRyOwotCi0gICAgICBtZW1jcHkgKHRoZHIuc3RhbXAsICJWZVJzSW9OIyIsIDgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5tYWpvclZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSB0aGRyLm1ham9yVmVyc2lvbik7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1pbm9yVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIHRoZHIubWlub3JWZXJzaW9uKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+cmV2aXNpb24sCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJldmlzaW9uKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+eWVhciwKLQkJKGJmZF9ieXRlICopIHRoZHIueWVhcik7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1vbnRoLAotCQkoYmZkX2J5dGUgKikgdGhkci5tb250aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPmRheSwKLQkJKGJmZF9ieXRlICopIHRoZHIuZGF5KTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICYgdGhkciwgc2l6ZW9mICh0aGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0aGRyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgZXh0ZW5kZWQgaGVhZGVyIGlmIHRoZXJlIGlzIG9uZS4gICovCi0gIGlmIChmaW5kX25vbnplcm8gKChQVFIpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX0V4dGVuZGVkX0hlYWRlciB0aGRyOwotCi0gICAgICBtZW1jcHkgKHRoZHIuc3RhbXAsICJNZVNzQWdFcyIsIDgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bGFuZ3VhZ2VJRCwKLQkJKGJmZF9ieXRlICopIHRoZHIubGFuZ3VhZ2VJRCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5tZXNzYWdlRmlsZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIubWVzc2FnZUZpbGVPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bWVzc2FnZUZpbGVMZW5ndGgsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLm1lc3NhZ2VGaWxlTGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPm1lc3NhZ2VDb3VudCwKLQkJKGJmZF9ieXRlICopIHRoZHIubWVzc2FnZUNvdW50KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPmhlbHBGaWxlT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5oZWxwRmlsZU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5oZWxwRmlsZUxlbmd0aCwKLQkJKGJmZF9ieXRlICopIHRoZHIuaGVscEZpbGVMZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+UlBDRGF0YU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuUlBDRGF0YU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5SUENEYXRhTGVuZ3RoLAotCQkoYmZkX2J5dGUgKikgdGhkci5SUENEYXRhTGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZENvZGVPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZENvZGVPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkQ29kZUxlbmd0aCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkQ29kZUxlbmd0aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWREYXRhT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREYXRhT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERhdGFMZW5ndGgsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERhdGFMZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JICAoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZFJlbG9jYXRpb25GaXh1cE9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUmVsb2NhdGlvbkZpeHVwT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCSAgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZFJlbG9jYXRpb25GaXh1cENvdW50KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCSAoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlQ291bnQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlQ291bnQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUHVibGljc09mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUHVibGljc09mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRQdWJsaWNzQ291bnQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZFB1YmxpY3NDb3VudCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkgICAgICAoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREZWJ1Z1JlY29yZE9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWREZWJ1Z1JlY29yZENvdW50LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREZWJ1Z1JlY29yZENvdW50KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCSAgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+U2hhcmVkSW5pdGlhbGl6YXRpb25PZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZEluaXRpYWxpemF0aW9uT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCSAgICAoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlNoYXJlZEV4aXRQcm9jZWR1cmVPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLlNoYXJlZEV4aXRQcm9jZWR1cmVPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cHJvZHVjdElELAotCQkoYmZkX2J5dGUgKikgdGhkci5wcm9kdWN0SUQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQwLAotCQkoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDApOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQxLAotCQkoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDEpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQyLAotCQkoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDIpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQzLAotCQkoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDMpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQ0LAotCQkoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQ1LAotCQkoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDUpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiB0aGRyLCBzaXplb2YgKHRoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRoZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGNvcHlyaWdodCBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcikpKQotICAgIHsKLSAgICAgIE5sbV9FeHRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyIHRoZHI7Ci0KLSAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIkNvUHlSaUdoVD0iLCAxMCk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0aGRyLnN0YW1wLCBzaXplb2YgKHRoZHIuc3RhbXApLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mICh0aGRyLnN0YW1wKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB0aGRyLmNvcHlyaWdodE1lc3NhZ2VMZW5ndGhbMF0gPQotCW5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aDsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHRoZHIuY29weXJpZ2h0TWVzc2FnZUxlbmd0aCwgMSwgMSwgYWJmZCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAvKiBUaGUgY29weXJpZ2h0IG1lc3NhZ2UgaXMgYSB2YXJpYWJsZSBsZW5ndGggc3RyaW5nLiAqLwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlLAotCQkgICAgIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aCArIDEsCi0JCSAgICAgMSwgYWJmZCkgIT0KLQkgICgoYmZkX3NpemVfdHlwZSkKLQkgICBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2VMZW5ndGggKyAxKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgY3VzdG9tIGhlYWRlciBpZiB0aGVyZSBpcyBvbmUuICAgKi8KLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfQ3VzdG9tX0hlYWRlcikpKQotICAgIHsKLSAgICAgIE5sbV9FeHRlcm5hbF9DdXN0b21fSGVhZGVyIHRoZHI7Ci0gICAgICBib29sZWFuIGRzOwotICAgICAgYmZkX3NpemVfdHlwZSBoZHJMZW5ndGg7Ci0KLSAgICAgIGRzID0gZmluZF9ub256ZXJvICgoUFRSKSBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFTdGFtcCwKLQkJCSBzaXplb2YgKG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YVN0YW1wKSk7Ci0gICAgICBtZW1jcHkgKHRoZHIuc3RhbXAsICJDdVN0SGVBZCIsIDgpOwotICAgICAgaGRyTGVuZ3RoID0gKDIgKiBOTE1fVEFSR0VUX0xPTkdfU0laRSArIChkcyA/IDggOiAwKQotCQkgICArIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyTGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCBoZHJMZW5ndGgsIHRoZHIubGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5kYXRhT2Zmc2V0LAotCQl0aGRyLmRhdGFPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFMZW5ndGgsCi0JCXRoZHIuZGF0YUxlbmd0aCk7Ci0gICAgICBpZiAoISBkcykKLQl7Ci0JICBCRkRfQVNTRVJUIChubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmhkckxlbmd0aCA9PSAwKTsKLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpICZ0aGRyLCAxLAotCQkJIHNpemVvZiAodGhkcikgLSBzaXplb2YgKHRoZHIuZGF0YVN0YW1wKSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2YgKHRoZHIpIC0gc2l6ZW9mICh0aGRyLmRhdGFTdGFtcCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWVtY3B5ICh0aGRyLmRhdGFTdGFtcCwgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5kYXRhU3RhbXAsCi0JCSAgc2l6ZW9mICh0aGRyLmRhdGFTdGFtcCkpOwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChiZmRfd3JpdGUgKG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyLCAxLAotCQkJIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyTGVuZ3RoLCBhYmZkKQotCSAgICAgICE9IG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyTGVuZ3RoKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIEN5Z251cyBkZWJ1Z2dpbmcgaGVhZGVyIGlmIHRoZXJlIGlzIG9uZS4gICovCi0gIGlmIChmaW5kX25vbnplcm8gKChQVFIpIG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcikpKQotICAgIHsKLSAgICAgIE5sbV9FeHRlcm5hbF9DdXN0b21fSGVhZGVyIHRoZHI7Ci0KLSAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIkN1U3RIZUFkIiwgOCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIDIgKiBOTE1fVEFSR0VUX0xPTkdfU0laRSArIDgsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLmxlbmd0aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCktPm9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuZGF0YU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCktPmxlbmd0aCwKLQkJKGJmZF9ieXRlICopIHRoZHIuZGF0YUxlbmd0aCk7Ci0gICAgICBtZW1jcHkgKHRoZHIuZGF0YVN0YW1wLCAiQ3lHblVzRXgiLCA4KTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICZ0aGRyLCBzaXplb2YgKHRoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRoZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIHJlYWQgdGhlIE5MTSdzIHB1YmxpYyBzeW1ib2xzIGFuZCB1c2UgaXQgdG8gZ2VuZXJhdGUgYSBiZmQgc3ltYm9sCi0gICB0YWJsZSAoaGV5LCBpdCdzIGJldHRlciB0aGFuIG5vdGhpbmcpIG9uIGEgb25lLWZvci1vbmUgYmFzaXMuICBUaHVzCi0gICB1c2UgdGhlIG51bWJlciBvZiBwdWJsaWMgc3ltYm9scyBhcyB0aGUgbnVtYmVyIG9mIGJmZCBzeW1ib2xzIHdlIHdpbGwKLSAgIGhhdmUgb25jZSB3ZSBhY3R1YWxseSBnZXQgYXJvdW5kIHRvIHJlYWRpbmcgdGhlbSBpbi4KLQotICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gaG9sZCB0aGUgc3ltdGFiIHZlY3RvciwgYmFzZWQgb24KLSAgIHRoZSBjb3VudCBwbHVzIDEsIHNpbmNlIHdlIHdpbGwgTlVMTCB0ZXJtaW5hdGUgdGhlIHZlY3RvciBhbGxvY2F0ZWQgYmFzZWQKLSAgIG9uIHRoaXMgc2l6ZS4gKi8KLQotbG9uZwotbmxtX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqaV9meGRoZHJwOwkvKiBObG0gZmlsZSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KLSAgbG9uZyBzeW1jb3VudDsKLSAgbG9uZyBzeW10YWJfc2l6ZSA9IDA7Ci0KLSAgaV9meGRoZHJwID0gbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCk7Ci0gIHN5bWNvdW50ID0gKGlfZnhkaGRycC0+bnVtYmVyT2ZQdWJsaWNzCi0JICAgICAgKyBpX2Z4ZGhkcnAtPm51bWJlck9mRGVidWdSZWNvcmRzCi0JICAgICAgKyBpX2Z4ZGhkcnAtPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzKTsKLSAgc3ltdGFiX3NpemUgPSAoc3ltY291bnQgKyAxKSAqIChzaXplb2YgKGFzeW1ib2wpKTsKLSAgcmV0dXJuIChzeW10YWJfc2l6ZSk7Ci19Ci0KLS8qIE5vdGUgdGhhdCBiZmRfZ2V0X3N5bWNvdW50IGlzIGd1YXJhbnRlZWQgdG8gYmUgemVybyBpZiBzbHVycGluZyB0aGUKLSAgIHN5bWJvbCB0YWJsZSBmYWlscy4gKi8KLQotbG9uZwotbmxtX2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICBubG1fc3ltYm9sX3R5cGUgKnN5bWJhc2U7Ci0gIGJmZF9zaXplX3R5cGUgY291bnRlciA9IDA7Ci0KLSAgaWYgKG5sbV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiAtMTsKLSAgc3ltYmFzZSA9IG5sbV9nZXRfc3ltYm9scyAoYWJmZCk7Ci0gIHdoaWxlIChjb3VudGVyIDwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpCi0gICAgewotICAgICAgKmFsb2NhdGlvbisrID0gJnN5bWJhc2UtPnN5bWJvbDsKLSAgICAgIHN5bWJhc2UrKzsKLSAgICAgIGNvdW50ZXIrKzsKLSAgICB9Ci0gICphbG9jYXRpb24gPSAoYXN5bWJvbCAqKSBOVUxMOwotICByZXR1cm4gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci19Ci0KLS8qIE1ha2UgYW4gTkxNIHN5bWJvbC4gIFRoZXJlIGlzIG5vdGhpbmcgc3BlY2lhbCB0byBkbyBoZXJlLiAgKi8KLQotYXN5bWJvbCAqCi1ubG1fbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbmxtX3N5bWJvbF90eXBlICpuZXc7Ci0KLSAgbmV3ID0gKG5sbV9zeW1ib2xfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKG5sbV9zeW1ib2xfdHlwZSkpOwotICBpZiAobmV3KQotICAgIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi0vKiBHZXQgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLQotdm9pZAotbmxtX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotfQotCi0vKiBQcmludCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotCi12b2lkCi1ubG1fcHJpbnRfc3ltYm9sIChhYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGFmaWxlOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhZmlsZTsKLQotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgICBpZiAoc3ltYm9sLT5uYW1lKQotCWZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+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+ZmxhZ3MsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmZsYWdzKTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9uczMyay5oIGIvYmZkL25zMzJrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2M2JhMDkuLjAwMDAwMDAKLS0tIGEvYmZkL25zMzJrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKiBIZWFkZXIgZmlsZSBmb3IgbnMzMmsgcm91dGluZXMuCi0gICBDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX25zMzJrX3JlbG9jYXRlX2NvbnRlbnRzCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICopKTsKLQotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX2RvX25zMzJrX3JlbG9jX2NvbnRlbnRzCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICosCi0JICAgbG9uZyAoKikgUEFSQU1TICgoYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpLAotCSAgIGludCAoKikgUEFSQU1TICgobG9uZywgYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpKSk7Ci0KLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9uczMya19maW5hbF9saW5rX3JlbG9jYXRlCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosIGJmZF92bWEsCi0JICAgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotCi1leHRlcm4gbG9uZyBfYmZkX25zMzJrX2dldF9kaXNwbGFjZW1lbnQgUEFSQU1TICgoYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpOwotZXh0ZXJuIGxvbmcgX2JmZF9uczMya19nZXRfaW1tZWRpYXRlIFBBUkFNUyAoKGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKLWV4dGVybiBpbnQgX2JmZF9uczMya19wdXRfZGlzcGxhY2VtZW50IFBBUkFNUyAoKGxvbmcsIGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKLWV4dGVybiBpbnQgX2JmZF9uczMya19wdXRfaW1tZWRpYXRlIFBBUkFNUyAoKGxvbmcsIGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKLQotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbnMzMmtfcmVsb2NfaW1tCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwpkaWZmIC0tZ2l0IGEvYmZkL25zMzJrbmV0YnNkLmMgYi9iZmQvbnMzMmtuZXRic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIyMzU2ZC4uMDAwMDAwMAotLS0gYS9iZmQvbnMzMmtuZXRic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTmV0QlNEL25zMzJrIGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJNAotI3VuZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCTQwOTYKLQotI2RlZmluZQlERUZBVUxUX0FSQ0gJYmZkX2FyY2hfbnMzMmsKLSNkZWZpbmUJREVGQVVMVF9NSUQgCU1fNTMyX05FVEJTRAotCi0jZGVmaW5lIE1ZKE9QKSBDQVQocGM1MzJuZXRic2RfLE9QKQotCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQzKG5zMzJrYW91dCxfMzJfLHkpCi0KLS8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW5zMzJrLW5ldGJzZCIKLQotI2RlZmluZSBuczMya2FvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cwotCi0jZGVmaW5lIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIDEKLQotLyogV2UgY2FuYHQgdXNlIHRoZSBNWU5TIG1hY3JvIGhlcmUgZm9yIGNwcCByZWFzb25zIHRvbyBzdWJ0bGUKLSAqIGZvciBtZSAtLSBJV0QKLSAqLwotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgbnMzMmthb3V0X2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jaW5jbHVkZSAiYmZkLmgiCQkvKiBUbyBlbnN1cmUgZm9sbG93aW5nIGRlY2xhcmF0aW9uIGlzIE9LICovCi0KLUNPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKgotTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUygoYmZkICphYmZkIEFORAotCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotCi0jaW5jbHVkZSAibmV0YnNkLmgiCmRpZmYgLS1naXQgYS9iZmQvb2FzeXMuYyBiL2JmZC9vYXN5cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTE1NjBlLi4wMDAwMDAwCi0tLSBhL2JmZC9vYXN5cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUzNSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIG9hc3lzIG9iamVjdHMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCwgPHNhY0BjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFVOREVSU0NPUkVfSEFDSyAxCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJvYXN5cy5oIgotI2luY2x1ZGUgImxpYm9hc3lzLmgiCi0KLS8qIFhYWCAtIEZJWE1FLiAgb2Zmc2V0b2YgYmVsb25ncyBpbiB0aGUgc3lzdGVtLXNwZWNpZmljIGZpbGVzIGluCi0gICAuLi9pbmNsdWRlL3N5cy4gKi8KLS8qIERlZmluZSBvZmZzZXRvZiBmb3IgdGhvc2Ugc3lzdGVtcyB3aGljaCBsYWNrIGl0ICovCi0KLSNpZm5kZWYgb2Zmc2V0b2YKLSNkZWZpbmUgb2Zmc2V0b2YodHlwZSwgaWRlbnRpZmllcikgKHNpemVfdCkgJigoKHR5cGUgKikgMCktPmlkZW50aWZpZXIpCi0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gb2FzeXNfcmVhZF9yZWNvcmQgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gb2FzeXNfd3JpdGVfc2VjdGlvbnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG9hc3lzX3dyaXRlX3JlY29yZCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgb2FzeXNfcmVjb3JkX2VudW1fdHlwZSwKLQkJCQkJICAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKiwKLQkJCQkJICAgc2l6ZV90KSk7Ci1zdGF0aWMgYm9vbGVhbiBvYXN5c193cml0ZV9zeW1zIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBvYXN5c193cml0ZV9oZWFkZXIgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG9hc3lzX3dyaXRlX2VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gb2FzeXNfd3JpdGVfZGF0YSBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBSZWFkIGluIGFsbCB0aGUgc2VjdGlvbiBkYXRhIGFuZCByZWxvY2F0aW9uIHN0dWZmIHRvbyAqLwotUFJPVE8gKHN0YXRpYyBib29sZWFuLCBvYXN5c19zbHVycF9zZWN0aW9uX2RhdGEsIChiZmQgKiBDT05TVCBhYmZkKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c19yZWFkX3JlY29yZCAoYWJmZCwgcmVjb3JkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG9hc3lzX3JlY29yZF91bmlvbl90eXBlICpyZWNvcmQ7Ci17Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgcmVjb3JkLCAxLCBzaXplb2YgKHJlY29yZC0+aGVhZGVyKSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAocmVjb3JkLT5oZWFkZXIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoKHNpemVfdCkgcmVjb3JkLT5oZWFkZXIubGVuZ3RoIDw9IChzaXplX3QpIHNpemVvZiAocmVjb3JkLT5oZWFkZXIpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoYmZkX3JlYWQgKChQVFIpICgoKGNoYXIgKikgcmVjb3JkKSArIHNpemVvZiAocmVjb3JkLT5oZWFkZXIpKSwKLQkJMSwgcmVjb3JkLT5oZWFkZXIubGVuZ3RoIC0gc2l6ZW9mIChyZWNvcmQtPmhlYWRlciksCi0JCWFiZmQpCi0gICAgICAhPSByZWNvcmQtPmhlYWRlci5sZW5ndGggLSBzaXplb2YgKHJlY29yZC0+aGVhZGVyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotc3RhdGljIHNpemVfdAotb2FzeXNfc3RyaW5nX2xlbmd0aCAocmVjb3JkKQotICAgICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqcmVjb3JkOwotewotICByZXR1cm4gcmVjb3JkLT5oZWFkZXIubGVuZ3RoCi0gICAgLSAoKGNoYXIgKikgcmVjb3JkLT5zeW1ib2wubmFtZSAtIChjaGFyICopIHJlY29yZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLQotU2x1cnAgdGhlIHN5bWJvbCB0YWJsZSBieSByZWFkaW5nIGluIGFsbCB0aGUgcmVjb3JkcyBhdCB0aGUgc3RhcnQgZmlsZQotdGlsbCB3ZSBnZXQgdG8gdGhlIGZpcnN0IHNlY3Rpb24gcmVjb3JkLgotCi1XZSdsbCBzb3J0IHRoZSBzeW1ib2xzcyBpbnRvICB0d28gbGlzdHMsIGRlZmluZWQgYW5kIHVuZGVmaW5lZC4gVGhlCi11bmRlZmluZWQgc3ltYm9scyB3aWxsIGJlIHBsYWNlZCBpbnRvIHRoZSB0YWJsZSBhY2NvcmRpbmcgdG8gdGhlaXIKLXJlZm5vLgotCi1XZSBkbyB0aGlzIGJ5IHBsYWNpbmcgYWxsIHVuZGVmaW5lZCBzeW1ib2xzIGF0IHRoZSBmcm9udCBvZiB0aGUgdGFibGUKLW1vdmluZyBpbiwgYW5kIHRoZSBkZWZpbmVkIHN5bWJvbHMgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUgbW92aW5nIGJhY2suCi0KLSovCi0KLXN0YXRpYyBib29sZWFuCi1vYXN5c19zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqQ09OU1QgYWJmZDsKLXsKLSAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgcmVjb3JkOwotICBvYXN5c19kYXRhX3R5cGUgKmRhdGEgPSBPQVNZU19EQVRBIChhYmZkKTsKLSAgYm9vbGVhbiBsb29wID0gdHJ1ZTsKLSAgYXN5bWJvbCAqZGVzdF9kZWZpbmVkOwotICBhc3ltYm9sICpkZXN0OwotICBjaGFyICpzdHJpbmdfcHRyOwotCi0KLSAgaWYgKGRhdGEtPnN5bWJvbHMgIT0gKGFzeW1ib2wgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIC8qIEJ1eSBlbm91Z2ggbWVtb3J5IGZvciBhbGwgdGhlIHN5bWJvbHMgYW5kIGFsbCB0aGUgbmFtZXMgKi8KLSAgZGF0YS0+c3ltYm9scyA9Ci0gICAgKGFzeW1ib2wgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpICogYWJmZC0+c3ltY291bnQpOwotI2lmZGVmIFVOREVSU0NPUkVfSEFDSwotICAvKiBidXkgMSBtb3JlIGNoYXIgZm9yIGVhY2ggc3ltYm9sIHRvIGtlZXAgdGhlIHVuZGVyc2NvcmUgaW4qLwotICBkYXRhLT5zdHJpbmdzID0gYmZkX2FsbG9jIChhYmZkLCBkYXRhLT5zeW1ib2xfc3RyaW5nX2xlbmd0aCArCi0JCQkgICAgIGFiZmQtPnN5bWNvdW50KTsKLSNlbHNlCi0gIGRhdGEtPnN0cmluZ3MgPSBiZmRfYWxsb2MgKGFiZmQsIGRhdGEtPnN5bWJvbF9zdHJpbmdfbGVuZ3RoKTsKLSNlbmRpZgotICBpZiAoIWRhdGEtPnN5bWJvbHMgfHwgIWRhdGEtPnN0cmluZ3MpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGRlc3RfZGVmaW5lZCA9IGRhdGEtPnN5bWJvbHMgKyBhYmZkLT5zeW1jb3VudCAtIDE7Ci0KLSAgc3RyaW5nX3B0ciA9IGRhdGEtPnN0cmluZ3M7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHdoaWxlIChsb29wKQotICAgIHsKLQotICAgICAgaWYgKCEgb2FzeXNfcmVhZF9yZWNvcmQgKGFiZmQsICZyZWNvcmQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN3aXRjaCAocmVjb3JkLmhlYWRlci50eXBlKQotCXsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19oZWFkZXJfZW51bToKLQkgIGJyZWFrOwotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfc3ltYm9sX2VudW06Ci0JICB7Ci0JICAgIGludCBmbGFnID0gcmVjb3JkLmhlYWRlci50eXBlID09IChpbnQpIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtID8KLQkgICAgKEJTRl9MT0NBTCkgOiAoQlNGX0dMT0JBTCB8IEJTRl9FWFBPUlQpOwotCi0KLQkgICAgc2l6ZV90IGxlbmd0aCA9IG9hc3lzX3N0cmluZ19sZW5ndGggKCZyZWNvcmQpOwotCSAgICBzd2l0Y2ggKHJlY29yZC5zeW1ib2wucmVsYiAmIFJFTE9DQVRJT05fVFlQRV9CSVRTKQotCSAgICAgIHsKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9BQlM6Ci0JCWRlc3QgPSBkZXN0X2RlZmluZWQtLTsKLQkJZGVzdC0+c2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JCWRlc3QtPmZsYWdzID0gMDsKLQotCQlicmVhazsKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9SRUw6Ci0JCWRlc3QgPSBkZXN0X2RlZmluZWQtLTsKLQkJZGVzdC0+c2VjdGlvbiA9Ci0JCSAgT0FTWVNfREFUQSAoYWJmZCktPnNlY3Rpb25zW3JlY29yZC5zeW1ib2wucmVsYiAmCi0JCQkJCSAgICAgIFJFTE9DQVRJT05fU0VDVF9CSVRTXTsKLQkJaWYgKHJlY29yZC5oZWFkZXIudHlwZSA9PSAoaW50KSBvYXN5c19yZWNvcmRfaXNfbG9jYWxfZW51bSkKLQkJICB7Ci0JCSAgICBkZXN0LT5mbGFncyA9IEJTRl9MT0NBTDsKLQkJICAgIGlmIChkZXN0LT5zZWN0aW9uID09IChhc2VjdGlvbiAqKSAofjApKQotCQkgICAgICB7Ci0JCQkvKiBJdCBzZWVtcyB0aGF0IHNvbWV0aW1lcyBpbnRlcm5hbCBzeW1ib2xzIGFyZSB0aWVkIHVwLCBidXQKLQkJICAgICAgIHN0aWxsIGdldCBvdXRwdXQsIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIG5vCi0JCSAgICAgICBzZWN0aW9uICovCi0JCQlkZXN0LT5zZWN0aW9uID0gMDsKLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQotCQkgICAgZGVzdC0+ZmxhZ3MgPSBmbGFnOwotCQkgIH0KLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfVU5EOgotCQlkZXN0ID0gZGF0YS0+c3ltYm9scyArIGJmZF9oX2dldF8xNiAoYWJmZCwgcmVjb3JkLnN5bWJvbC5yZWZubyk7Ci0JCWRlc3QtPnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCQlicmVhazsKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9DT006Ci0JCWRlc3QgPSBkZXN0X2RlZmluZWQtLTsKLQkJZGVzdC0+bmFtZSA9IHN0cmluZ19wdHI7Ci0JCWRlc3QtPnRoZV9iZmQgPSBhYmZkOwotCi0JCWRlc3QtPnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCi0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCWRlc3QgPSBkZXN0X2RlZmluZWQtLTsKLQkJQkZEX0FTU0VSVCAoMCk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgZGVzdC0+bmFtZSA9IHN0cmluZ19wdHI7Ci0JICAgIGRlc3QtPnRoZV9iZmQgPSBhYmZkOwotCSAgICBkZXN0LT51ZGF0YS5wID0gKFBUUikgTlVMTDsKLQkgICAgZGVzdC0+dmFsdWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZC5zeW1ib2wudmFsdWUpOwotCi0jaWZkZWYgVU5ERVJTQ09SRV9IQUNLCi0JICAgIGlmIChyZWNvcmQuc3ltYm9sLm5hbWVbMF0gIT0gJ18nKQotCSAgICAgIHsKLQkJc3RyaW5nX3B0clswXSA9ICdfJzsKLQkJc3RyaW5nX3B0cisrOwotCSAgICAgIH0KLSNlbmRpZgotCSAgICBtZW1jcHkgKHN0cmluZ19wdHIsIHJlY29yZC5zeW1ib2wubmFtZSwgbGVuZ3RoKTsKLQotCi0JICAgIHN0cmluZ19wdHJbbGVuZ3RoXSA9IDA7Ci0JICAgIHN0cmluZ19wdHIgKz0gbGVuZ3RoICsgMTsKLQkgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBsb29wID0gZmFsc2U7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBsb25nCi1vYXN5c19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKkNPTlNUIGFiZmQ7Ci17Ci0gIGlmICghIG9hc3lzX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAoYWJmZC0+c3ltY291bnQgKyAxKSAqIChzaXplb2YgKG9hc3lzX3N5bWJvbF90eXBlICopKTsKLX0KLQotLyoKLSovCi0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG9hc3lzX3ZlYzsKLQotbG9uZwotb2FzeXNfZ2V0X3N5bXRhYiAoYWJmZCwgbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmxvY2F0aW9uOwotewotICBhc3ltYm9sICpzeW1iYXNlOwotICB1bnNpZ25lZCBpbnQgY291bnRlcjsKLSAgaWYgKG9hc3lzX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgc3ltYmFzZSA9IE9BU1lTX0RBVEEgKGFiZmQpLT5zeW1ib2xzOwotICBmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgYWJmZC0+c3ltY291bnQ7IGNvdW50ZXIrKykKLSAgICB7Ci0gICAgICAqKGxvY2F0aW9uKyspID0gc3ltYmFzZSsrOwotICAgIH0KLSAgKmxvY2F0aW9uID0gMDsKLSAgcmV0dXJuIGFiZmQtPnN5bWNvdW50OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIGFyY2hpdmUgc3R1ZmYKLSovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLW9hc3lzX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBvYXN5c19hcmNoaXZlX2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgb2FzeXNfZXh0YXJjaGl2ZV9oZWFkZXJfdHlwZSBoZWFkZXJfZXh0OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgZmlsZV9wdHIgZmlsZXBvczsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgZmFsc2UpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoKFBUUikgJiBoZWFkZXJfZXh0LCAxLCBzaXplb2YgKGhlYWRlcl9leHQpLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChoZWFkZXJfZXh0KSkpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGhlYWRlci52ZXJzaW9uID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0LnZlcnNpb24pOwotICBoZWFkZXIubW9kX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0Lm1vZF9jb3VudCk7Ci0gIGhlYWRlci5tb2RfdGJsX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC5tb2RfdGJsX29mZnNldCk7Ci0gIGhlYWRlci5zeW1fdGJsX3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQuc3ltX3RibF9zaXplKTsKLSAgaGVhZGVyLnN5bV9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC5zeW1fY291bnQpOwotICBoZWFkZXIuc3ltX3RibF9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQuc3ltX3RibF9vZmZzZXQpOwotICBoZWFkZXIueHJlZl9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC54cmVmX2NvdW50KTsKLSAgaGVhZGVyLnhyZWZfbHN0X29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC54cmVmX2xzdF9vZmZzZXQpOwotCi0gIC8qCi0gICAgVGhlcmUgaXNuJ3QgYSBtYWdpYyBudW1iZXIgaW4gYW4gT2FzeXMgYXJjaGl2ZSwgc28gdGhlIGJlc3Qgd2UKLSAgICBjYW4gZG8gdG8gdmVyaWZ5IHJlYXNuYWJsZW5lc3MgaXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHZhbHVlcyBpbgotICAgIHRoZSBoZWFkZXIgYXJlIHRvbyB3ZWlyZAotICAgICovCi0KLSAgaWYgKGhlYWRlci52ZXJzaW9uID4gMTAwMDAgfHwKLSAgICAgIGhlYWRlci5tb2RfY291bnQgPiAxMDAwMCB8fAotICAgICAgaGVhZGVyLnN5bV9jb3VudCA+IDEwMDAwMCB8fAotICAgICAgaGVhZGVyLnhyZWZfY291bnQgPiAxMDAwMDApCi0gICAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci0KLSAgLyoKLSAgICBUaGF0IGFsbCB3b3JrZWQsIGxldCdzIGJ1eSB0aGUgc3BhY2UgZm9yIHRoZSBoZWFkZXIgYW5kIHJlYWQgaW4KLSAgICB0aGUgaGVhZGVycy4KLSAgICAqLwotICB7Ci0gICAgb2FzeXNfYXJfZGF0YV90eXBlICphciA9Ci0gICAgKG9hc3lzX2FyX2RhdGFfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAob2FzeXNfYXJfZGF0YV90eXBlKSk7Ci0KLSAgICBvYXN5c19tb2R1bGVfaW5mb190eXBlICptb2R1bGUgPQotICAgIChvYXN5c19tb2R1bGVfaW5mb190eXBlICopCi0gICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKG9hc3lzX21vZHVsZV9pbmZvX3R5cGUpICogaGVhZGVyLm1vZF9jb3VudCk7Ci0gICAgb2FzeXNfbW9kdWxlX3RhYmxlX3R5cGUgcmVjb3JkOwotCi0gICAgaWYgKCFhciB8fCAhbW9kdWxlKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBhYmZkLT50ZGF0YS5vYXN5c19hcl9kYXRhID0gYXI7Ci0gICAgYXItPm1vZHVsZSA9IG1vZHVsZTsKLSAgICBhci0+bW9kdWxlX2NvdW50ID0gaGVhZGVyLm1vZF9jb3VudDsKLQotICAgIGZpbGVwb3MgPSBoZWFkZXIubW9kX3RibF9vZmZzZXQ7Ci0gICAgZm9yIChpID0gMDsgaSA8IGhlYWRlci5tb2RfY291bnQ7IGkrKykKLSAgICAgIHsKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIGZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotCSAgcmV0dXJuIE5VTEw7Ci0KLQkvKiBUaGVyZSBhcmUgdHdvIHdheXMgb2Ygc3BlY2lmeWluZyB0aGUgYXJjaGl2ZSBoZWFkZXIgKi8KLQotCWlmICgwKQotCSAgewotCSAgICBvYXN5c19leHRtb2R1bGVfdGFibGVfdHlwZV9hX3R5cGUgcmVjb3JkX2V4dDsKLQkgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHJlY29yZF9leHQsIDEsIHNpemVvZiAocmVjb3JkX2V4dCksIGFiZmQpCi0JCSE9IHNpemVvZiAocmVjb3JkX2V4dCkpCi0JICAgICAgcmV0dXJuIE5VTEw7Ci0KLQkgICAgcmVjb3JkLm1vZF9zaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0Lm1vZF9zaXplKTsKLQkgICAgcmVjb3JkLmZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LmZpbGVfb2Zmc2V0KTsKLQotCSAgICByZWNvcmQuZGVwX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LmRlcF9jb3VudCk7Ci0JICAgIHJlY29yZC5kZXBlZV9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5kZXBlZV9jb3VudCk7Ci0JICAgIHJlY29yZC5zZWN0X2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LnNlY3RfY291bnQpOwotCi0JICAgIG1vZHVsZVtpXS5uYW1lID0gYmZkX2FsbG9jIChhYmZkLCAzMyk7Ci0JICAgIGlmICghbW9kdWxlW2ldLm5hbWUpCi0JICAgICAgcmV0dXJuIE5VTEw7Ci0KLQkgICAgbWVtY3B5IChtb2R1bGVbaV0ubmFtZSwgcmVjb3JkX2V4dC5tb2RfbmFtZSwgMzMpOwotCSAgICBmaWxlcG9zICs9Ci0JICAgICAgc2l6ZW9mIChyZWNvcmRfZXh0KSArCi0JICAgICAgcmVjb3JkLmRlcF9jb3VudCAqIDQgKwotCSAgICAgIHJlY29yZC5kZXBlZV9jb3VudCAqIDQgKwotCSAgICAgIHJlY29yZC5zZWN0X2NvdW50ICogOCArIDE4NzsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIG9hc3lzX2V4dG1vZHVsZV90YWJsZV90eXBlX2JfdHlwZSByZWNvcmRfZXh0OwotCSAgICBpZiAoYmZkX3JlYWQgKChQVFIpICYgcmVjb3JkX2V4dCwgMSwgc2l6ZW9mIChyZWNvcmRfZXh0KSwgYWJmZCkKLQkJIT0gc2l6ZW9mIChyZWNvcmRfZXh0KSkKLQkgICAgICByZXR1cm4gTlVMTDsKLQotCSAgICByZWNvcmQubW9kX3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQubW9kX3NpemUpOwotCSAgICByZWNvcmQuZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuZmlsZV9vZmZzZXQpOwotCi0JICAgIHJlY29yZC5kZXBfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuZGVwX2NvdW50KTsKLQkgICAgcmVjb3JkLmRlcGVlX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LmRlcGVlX2NvdW50KTsKLQkgICAgcmVjb3JkLnNlY3RfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuc2VjdF9jb3VudCk7Ci0JICAgIHJlY29yZC5tb2R1bGVfbmFtZV9zaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0Lm1vZF9uYW1lX2xlbmd0aCk7Ci0KLQkgICAgbW9kdWxlW2ldLm5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHJlY29yZC5tb2R1bGVfbmFtZV9zaXplICsgMSk7Ci0JICAgIGlmICghbW9kdWxlW2ldLm5hbWUpCi0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIGlmIChiZmRfcmVhZCAoKFBUUikgbW9kdWxlW2ldLm5hbWUsIDEsIHJlY29yZC5tb2R1bGVfbmFtZV9zaXplLAotCQkJICBhYmZkKQotCQkhPSByZWNvcmQubW9kdWxlX25hbWVfc2l6ZSkKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgbW9kdWxlW2ldLm5hbWVbcmVjb3JkLm1vZHVsZV9uYW1lX3NpemVdID0gMDsKLQkgICAgZmlsZXBvcyArPQotCSAgICAgIHNpemVvZiAocmVjb3JkX2V4dCkgKwotCSAgICAgIHJlY29yZC5kZXBfY291bnQgKiA0ICsKLQkgICAgICByZWNvcmQubW9kdWxlX25hbWVfc2l6ZSArIDE7Ci0KLQkgIH0KLQotCi0JbW9kdWxlW2ldLnNpemUgPSByZWNvcmQubW9kX3NpemU7Ci0JbW9kdWxlW2ldLnBvcyA9IHJlY29yZC5maWxlX29mZnNldDsKLQltb2R1bGVbaV0uYWJmZCA9IDA7Ci0gICAgICB9Ci0KLSAgfQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW9hc3lzX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0KLSAgYWJmZC0+dGRhdGEub2FzeXNfb2JqX2RhdGEgPSAob2FzeXNfZGF0YV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChvYXN5c19kYXRhX3R5cGUpKTsKLSAgcmV0dXJuIGFiZmQtPnRkYXRhLm9hc3lzX29ial9kYXRhID8gdHJ1ZSA6IGZhbHNlOwotfQotCi0jZGVmaW5lIE1BWF9TRUNTIDE2Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1vYXN5c19vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBvYXN5c19kYXRhX3R5cGUgKm9hc3lzOwotICBvYXN5c19kYXRhX3R5cGUgKnNhdmUgPSBPQVNZU19EQVRBIChhYmZkKTsKLSAgYm9vbGVhbiBsb29wID0gdHJ1ZTsKLSAgYm9vbGVhbiBoYWRfdXNlZnVsbCA9IGZhbHNlOwotCi0gIGFiZmQtPnRkYXRhLm9hc3lzX29ial9kYXRhID0gMDsKLSAgb2FzeXNfbWtvYmplY3QgKGFiZmQpOwotICBvYXN5cyA9IE9BU1lTX0RBVEEgKGFiZmQpOwotICBtZW1zZXQgKChQVFIpIG9hc3lzLT5zZWN0aW9ucywgMHhmZiwgc2l6ZW9mIChvYXN5cy0+c2VjdGlvbnMpKTsKLQotICAvKiBQb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGUgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZmFpbDsKLSAgb2FzeXMtPnN5bWJvbF9zdHJpbmdfbGVuZ3RoID0gMDsKLSAgLyogSW5zcGVjdCB0aGUgcmVjb3JkcywgYnV0IG9ubHkga2VlcCB0aGUgc2VjdGlvbiBpbmZvIC0KLSAgICAgcmVtZW1iZXIgdGhlIHNpemUgb2YgdGhlIHN5bWJvbHMKLSAgICAgKi8KLSAgb2FzeXMtPmZpcnN0X2RhdGFfcmVjb3JkID0gMDsKLSAgd2hpbGUgKGxvb3ApCi0gICAgewotICAgICAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgcmVjb3JkOwotICAgICAgaWYgKCEgb2FzeXNfcmVhZF9yZWNvcmQgKGFiZmQsICZyZWNvcmQpKQotCWdvdG8gZmFpbDsKLSAgICAgIGlmICgoc2l6ZV90KSByZWNvcmQuaGVhZGVyLmxlbmd0aCA8IChzaXplX3QpIHNpemVvZiAocmVjb3JkLmhlYWRlcikpCi0JZ290byBmYWlsOwotCi0KLSAgICAgIHN3aXRjaCAoKG9hc3lzX3JlY29yZF9lbnVtX3R5cGUpIChyZWNvcmQuaGVhZGVyLnR5cGUpKQotCXsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19oZWFkZXJfZW51bToKLQkgIGhhZF91c2VmdWxsID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX3N5bWJvbF9lbnVtOgotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW06Ci0JICAvKiBDb3VudCBzeW1ib2xzIGFuZCByZW1lbWJlciB0aGVpciBzaXplIGZvciBhIGZ1dHVyZSBtYWxsb2MgICAqLwotCSAgYWJmZC0+c3ltY291bnQrKzsKLQkgIG9hc3lzLT5zeW1ib2xfc3RyaW5nX2xlbmd0aCArPSAxICsgb2FzeXNfc3RyaW5nX2xlbmd0aCAoJnJlY29yZCk7Ci0JICBoYWRfdXNlZnVsbCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19zZWN0aW9uX2VudW06Ci0JICB7Ci0JICAgIGFzZWN0aW9uICpzOwotCSAgICBjaGFyICpidWZmZXI7Ci0JICAgIHVuc2lnbmVkIGludCBzZWN0aW9uX251bWJlcjsKLQkgICAgaWYgKHJlY29yZC5zZWN0aW9uLmhlYWRlci5sZW5ndGggIT0gc2l6ZW9mIChyZWNvcmQuc2VjdGlvbikpCi0JICAgICAgewotCQlnb3RvIGZhaWw7Ci0JICAgICAgfQotCSAgICBidWZmZXIgPSBiZmRfYWxsb2MgKGFiZmQsIDMpOwotCSAgICBpZiAoIWJ1ZmZlcikKLQkgICAgICBnb3RvIGZhaWw7Ci0JICAgIHNlY3Rpb25fbnVtYmVyID0gcmVjb3JkLnNlY3Rpb24ucmVsYiAmIFJFTE9DQVRJT05fU0VDVF9CSVRTOwotCSAgICBzcHJpbnRmIChidWZmZXIsICIldSIsIHNlY3Rpb25fbnVtYmVyKTsKLQkgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIGJ1ZmZlcik7Ci0JICAgIG9hc3lzLT5zZWN0aW9uc1tzZWN0aW9uX251bWJlcl0gPSBzOwotCSAgICBzd2l0Y2ggKHJlY29yZC5zZWN0aW9uLnJlbGIgJiBSRUxPQ0FUSU9OX1RZUEVfQklUUykKLQkgICAgICB7Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfQUJTOgotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX1JFTDoKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfVU5EOgotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX0NPTToKLQkJQkZEX0ZBSUwgKCk7Ci0JICAgICAgfQotCi0JICAgIHMtPl9yYXdfc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkLnNlY3Rpb24udmFsdWUpOwotCSAgICBzLT52bWEgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZC5zZWN0aW9uLnZtYSk7Ci0JICAgIHMtPmZsYWdzID0gMDsKLQkgICAgaGFkX3VzZWZ1bGwgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfZGF0YV9lbnVtOgotCSAgb2FzeXMtPmZpcnN0X2RhdGFfcmVjb3JkID0gYmZkX3RlbGwgKGFiZmQpIC0gcmVjb3JkLmhlYWRlci5sZW5ndGg7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfZGVidWdfZW51bToKLQljYXNlIG9hc3lzX3JlY29yZF9pc19tb2R1bGVfZW51bToKLQljYXNlIG9hc3lzX3JlY29yZF9pc19uYW1lZF9zZWN0aW9uX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfZW5kX2VudW06Ci0JICBpZiAoaGFkX3VzZWZ1bGwgPT0gZmFsc2UpCi0JICAgIGdvdG8gZmFpbDsKLQkgIGxvb3AgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBnb3RvIGZhaWw7Ci0JfQotICAgIH0KLSAgb2FzeXMtPnN5bWJvbHMgPSAoYXN5bWJvbCAqKSBOVUxMOwotICAvKgotICAgIE9hc3lzIHN1cHBvcnQgc2V2ZXJhbCBhcmNoaXRlY3R1cmVzLCBidXQgSSBjYW4ndCBzZWUgYSBzaW1wbGUgd2F5Ci0gICAgdG8gZGlzY292ZXIgd2hpY2ggb25lIGlzIGluIGEgcGFydGljdWxhciBmaWxlIC0gd2UnbGwgZ3Vlc3MKLSAgICAqLwotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9tNjhrLCAwKTsKLSAgaWYgKGFiZmQtPnN5bWNvdW50ICE9IDApCi0gICAgewotICAgICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0gICAgfQotCi0gIC8qCi0gICAgV2UgZG9uJ3Qga25vdyBpZiBhIHNlY3Rpb24gaGFzIGRhdGEgdW50aWwgd2UndmUgcmVhZCBpdC4uCi0gICAgKi8KLQotICBvYXN5c19zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpOwotCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci0KLWZhaWw6Ci0gICh2b2lkKSBiZmRfcmVsZWFzZSAoYWJmZCwgb2FzeXMpOwotICBhYmZkLT50ZGF0YS5vYXN5c19vYmpfZGF0YSA9IHNhdmU7Ci0gIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotfQotCi0KLXN0YXRpYyB2b2lkCi1vYXN5c19nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLSAgaWYgKCFzeW1ib2wtPnNlY3Rpb24pCi0gICAgcmV0LT50eXBlID0gKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfTE9DQUwpID8gJ2EnIDogJ0EnOwotfQotCi1zdGF0aWMgdm9pZAotb2FzeXNfcHJpbnRfc3ltYm9sIChpZ25vcmVfYWJmZCwgYWZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgICAgewotCUNPTlNUIGNoYXIgKnNlY3Rpb25fbmFtZSA9IHN5bWJvbC0+c2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCA/Ci0JKENPTlNUIGNoYXIgKikgIiphYnMiIDogc3ltYm9sLT5zZWN0aW9uLT5uYW1lOwotCi0JYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLQotCWZwcmludGYgKGZpbGUsICIgJS01cyAlcyIsCi0JCSBzZWN0aW9uX25hbWUsCi0JCSBzeW1ib2wtPm5hbWUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotfQotLyoKLSBUaGUgaG93dG8gdGFibGUgaXMgYnVpbGQgdXNpbmcgdGhlIHRvcCB0d28gYml0cyBvZiBhIHJlbG9jIGJ5dGUgdG8KLSBpbmRleCBpbnRvIGl0LiBUaGUgYml0cyBhcmUgUENSRUwsV09SRC9MT05HCi0qLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9Ci17Ci0KLSAgSE9XVE8gKDAsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJhYnMxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDAsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJhYnMzMiIsIHRydWUsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDAsIDAsIDEsIDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJwY3JlbDE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMCwgMCwgMiwgMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgInBjcmVsMzIiLCB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSkKLX07Ci0KLS8qIFJlYWQgaW4gYWxsIHRoZSBzZWN0aW9uIGRhdGEgYW5kIHJlbG9jYXRpb24gc3R1ZmYgdG9vICovCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKQotICAgICBiZmQgKkNPTlNUIGFiZmQ7Ci17Ci0gIG9hc3lzX3JlY29yZF91bmlvbl90eXBlIHJlY29yZDsKLSAgb2FzeXNfZGF0YV90eXBlICpkYXRhID0gT0FTWVNfREFUQSAoYWJmZCk7Ci0gIGJvb2xlYW4gbG9vcCA9IHRydWU7Ci0KLSAgb2FzeXNfcGVyX3NlY3Rpb25fdHlwZSAqcGVyOwotCi0gIGFzZWN0aW9uICpzOwotCi0gIC8qIFNlZSBpZiB0aGUgZGF0YSBoYXMgYmVlbiBzbHVycGVkIGFscmVhZHkgLi4gKi8KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIHBlciA9IG9hc3lzX3Blcl9zZWN0aW9uIChzKTsKLSAgICAgIGlmIChwZXItPmluaXRpYWxpemVkID09IHRydWUpCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChkYXRhLT5maXJzdF9kYXRhX3JlY29yZCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgZGF0YS0+Zmlyc3RfZGF0YV9yZWNvcmQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgd2hpbGUgKGxvb3ApCi0gICAgewotICAgICAgaWYgKCEgb2FzeXNfcmVhZF9yZWNvcmQgKGFiZmQsICZyZWNvcmQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN3aXRjaCAocmVjb3JkLmhlYWRlci50eXBlKQotCXsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19oZWFkZXJfZW51bToKLQkgIGJyZWFrOwotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2RhdGFfZW51bToKLQkgIHsKLQotCSAgICBiZmRfYnl0ZSAqc3JjID0gcmVjb3JkLmRhdGEuZGF0YTsKLQkgICAgYmZkX2J5dGUgKmVuZF9zcmMgPSAoKGJmZF9ieXRlICopICYgcmVjb3JkKSArIHJlY29yZC5oZWFkZXIubGVuZ3RoOwotCSAgICBiZmRfYnl0ZSAqZHN0X3B0cjsKLQkgICAgYmZkX2J5dGUgKmRzdF9iYXNlX3B0cjsKLQkgICAgdW5zaWduZWQgaW50IHJlbGJpdDsKLQkgICAgdW5zaWduZWQgaW50IGNvdW50OwotCSAgICBhc2VjdGlvbiAqc2VjdGlvbiA9Ci0JICAgIGRhdGEtPnNlY3Rpb25zW3JlY29yZC5kYXRhLnJlbGIgJiBSRUxPQ0FUSU9OX1NFQ1RfQklUU107Ci0JICAgIGJmZF92bWEgZHN0X29mZnNldDsKLQotCSAgICBwZXIgPSBvYXN5c19wZXJfc2VjdGlvbiAoc2VjdGlvbik7Ci0KLQkgICAgaWYgKHBlci0+aW5pdGlhbGl6ZWQgPT0gZmFsc2UpCi0JICAgICAgewotCQlwZXItPmRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJaWYgKCFwZXItPmRhdGEpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlwZXItPnJlbG9jX3RhaWxfcHRyID0gKG9hc3lzX3JlbG9jX3R5cGUgKiopICYgKHNlY3Rpb24tPnJlbG9jYXRpb24pOwotCQlwZXItPmhhZF92bWEgPSBmYWxzZTsKLQkJcGVyLT5pbml0aWFsaXplZCA9IHRydWU7Ci0JCXNlY3Rpb24tPnJlbG9jX2NvdW50ID0gMDsKLQkJc2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JICAgICAgfQotCi0JICAgIGRzdF9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZC5kYXRhLmFkZHIpOwotCSAgICBpZiAocGVyLT5oYWRfdm1hID09IGZhbHNlKQotCSAgICAgIHsKLQkJLyogVGFrZSB0aGUgZmlyc3Qgdm1hIHdlIHNlZSBhcyB0aGUgYmFzZSAqLwotCQlzZWN0aW9uLT52bWEgPSBkc3Rfb2Zmc2V0OwotCQlwZXItPmhhZF92bWEgPSB0cnVlOwotCSAgICAgIH0KLQotCSAgICBkc3Rfb2Zmc2V0IC09IHNlY3Rpb24tPnZtYTsKLQotCSAgICBkc3RfYmFzZV9wdHIgPSBvYXN5c19wZXJfc2VjdGlvbiAoc2VjdGlvbiktPmRhdGE7Ci0JICAgIGRzdF9wdHIgPSBvYXN5c19wZXJfc2VjdGlvbiAoc2VjdGlvbiktPmRhdGEgKwotCSAgICAgIGRzdF9vZmZzZXQ7Ci0KLQkgICAgaWYgKHNyYyA8IGVuZF9zcmMpCi0JICAgICAgewotCQlzZWN0aW9uLT5mbGFncyB8PSBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgICAgfQotCSAgICB3aGlsZSAoc3JjIDwgZW5kX3NyYykKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGNoYXIgbW9kX2J5dGUgPSAqc3JjKys7Ci0JCXNpemVfdCBnYXAgPSBlbmRfc3JjIC0gc3JjOwotCi0JCWNvdW50ID0gODsKLQkJaWYgKG1vZF9ieXRlID09IDAgJiYgZ2FwID49IDgpCi0JCSAgewotCQkgICAgZHN0X3B0clswXSA9IHNyY1swXTsKLQkJICAgIGRzdF9wdHJbMV0gPSBzcmNbMV07Ci0JCSAgICBkc3RfcHRyWzJdID0gc3JjWzJdOwotCQkgICAgZHN0X3B0clszXSA9IHNyY1szXTsKLQkJICAgIGRzdF9wdHJbNF0gPSBzcmNbNF07Ci0JCSAgICBkc3RfcHRyWzVdID0gc3JjWzVdOwotCQkgICAgZHN0X3B0cls2XSA9IHNyY1s2XTsKLQkJICAgIGRzdF9wdHJbN10gPSBzcmNbN107Ci0JCSAgICBkc3RfcHRyICs9IDg7Ci0JCSAgICBzcmMgKz0gODsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBmb3IgKHJlbGJpdCA9IDE7IGNvdW50LS0gIT0gMCAmJiBzcmMgPCBlbmRfc3JjOyByZWxiaXQgPDw9IDEpCi0JCSAgICAgIHsKLQkJCWlmIChyZWxiaXQgJiBtb2RfYnl0ZSkKLQkJCSAgewotCQkJICAgIHVuc2lnbmVkIGNoYXIgcmVsb2MgPSAqc3JjOwotCQkJICAgIC8qIFRoaXMgaXRlbSBuZWVkcyB0byBiZSByZWxvY2F0ZWQgKi8KLQkJCSAgICBzd2l0Y2ggKHJlbG9jICYgUkVMT0NBVElPTl9UWVBFX0JJVFMpCi0JCQkgICAgICB7Ci0JCQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9BQlM6Ci0KLQkJCQlicmVhazsKLQotCQkJICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfUkVMOgotCQkJCXsKLQkJCQkgIC8qIFJlbG9jYXRlIHRoZSBpdGVtIHJlbGF0aXZlIHRvIHRoZSBzZWN0aW9uICovCi0JCQkJICBvYXN5c19yZWxvY190eXBlICpyID0KLQkJCQkgIChvYXN5c19yZWxvY190eXBlICopCi0JCQkJICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgICAgc2l6ZW9mIChvYXN5c19yZWxvY190eXBlKSk7Ci0JCQkJICBpZiAoIXIpCi0JCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCQkgICoocGVyLT5yZWxvY190YWlsX3B0cikgPSByOwotCQkJCSAgcGVyLT5yZWxvY190YWlsX3B0ciA9ICZyLT5uZXh0OwotCQkJCSAgci0+bmV4dCA9IChvYXN5c19yZWxvY190eXBlICopIE5VTEw7Ci0JCQkJICAvKiBSZWZlcmVuY2UgdG8gdW5kZWZpbmVkIHN5bWJvbCAqLwotCQkJCSAgc3JjKys7Ci0JCQkJICAvKiBUaGVyZSBpcyBubyBzeW1ib2wgKi8KLQkJCQkgIHItPnN5bWJvbCA9IDA7Ci0JCQkJICAvKiBXb3JrIG91dCB0aGUgaG93dG8gKi8KLQkJCQkgIGFib3J0ICgpOwotI2lmIDAKLQkJCQkgIHItPnJlbGVudC5zZWN0aW9uID0KLQkJCQkgICAgZGF0YS0+c2VjdGlvbnNbcmVsb2MgJgotCQkJCQkJICAgUkVMT0NBVElPTl9TRUNUX0JJVFNdOwotCi0JCQkJICByLT5yZWxlbnQuYWRkZW5kID0gLQotCQkJCSAgICByLT5yZWxlbnQuc2VjdGlvbi0+dm1hOwotI2VuZGlmCi0JCQkJICByLT5yZWxlbnQuYWRkcmVzcyA9IGRzdF9wdHIgLSBkc3RfYmFzZV9wdHI7Ci0JCQkJICByLT5yZWxlbnQuaG93dG8gPSAmaG93dG9fdGFibGVbcmVsb2MgPj4gNl07Ci0JCQkJICByLT5yZWxlbnQuc3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgTlVMTDsKLQkJCQkgIHNlY3Rpb24tPnJlbG9jX2NvdW50Kys7Ci0KLQkJCQkgIC8qIEZha2UgdXAgdGhlIGRhdGEgdG8gbG9vayBsaWtlIGl0J3MgZ290IHRoZSAtdmUgcGMgaW4gaXQsIHRoaXMgbWFrZXMKLQkJCQkgICAgICAgaXQgbXVjaCBlYXNpZXIgdG8gY29udmVydCBpbnRvIG90aGVyIGZvcm1hdHMuIFRoaXMgaXMgZG9uZSBieQotCQkJCSAgICAgICBoaXR0aW5nIHRoZSBhZGRlbmQuCi0JCQkJICAgICAgICovCi0JCQkJICBpZiAoci0+cmVsZW50Lmhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotCQkJCSAgICB7Ci0JCQkJICAgICAgci0+cmVsZW50LmFkZGVuZCAtPSBkc3RfcHRyIC0gZHN0X2Jhc2VfcHRyOwotCQkJCSAgICB9Ci0KLQotCQkJCX0KLQkJCQlicmVhazsKLQotCi0JCQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9VTkQ6Ci0JCQkJewotCQkJCSAgb2FzeXNfcmVsb2NfdHlwZSAqciA9Ci0JCQkJICAob2FzeXNfcmVsb2NfdHlwZSAqKQotCQkJCSAgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAgIHNpemVvZiAob2FzeXNfcmVsb2NfdHlwZSkpOwotCQkJCSAgaWYgKCFyKQotCQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkJICAqKHBlci0+cmVsb2NfdGFpbF9wdHIpID0gcjsKLQkJCQkgIHBlci0+cmVsb2NfdGFpbF9wdHIgPSAmci0+bmV4dDsKLQkJCQkgIHItPm5leHQgPSAob2FzeXNfcmVsb2NfdHlwZSAqKSBOVUxMOwotCQkJCSAgLyogUmVmZXJlbmNlIHRvIHVuZGVmaW5lZCBzeW1ib2wgKi8KLQkJCQkgIHNyYysrOwotCQkJCSAgLyogR2V0IHN5bWJvbCBudW1iZXIgKi8KLQkJCQkgIHItPnN5bWJvbCA9IChzcmNbMF0gPDwgOCkgfCBzcmNbMV07Ci0JCQkJICAvKiBXb3JrIG91dCB0aGUgaG93dG8gKi8KLQkJCQkgIGFib3J0ICgpOwotCi0jaWYgMAotCQkJCSAgci0+cmVsZW50LnNlY3Rpb24gPSAoYXNlY3Rpb24KLQkJCQkJCSAgICAgICAqKSBOVUxMOwotI2VuZGlmCi0JCQkJICByLT5yZWxlbnQuYWRkZW5kID0gMDsKLQkJCQkgIHItPnJlbGVudC5hZGRyZXNzID0gZHN0X3B0ciAtIGRzdF9iYXNlX3B0cjsKLQkJCQkgIHItPnJlbGVudC5ob3d0byA9ICZob3d0b190YWJsZVtyZWxvYyA+PiA2XTsKLQkJCQkgIHItPnJlbGVudC5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSBOVUxMOwotCQkJCSAgc2VjdGlvbi0+cmVsb2NfY291bnQrKzsKLQotCQkJCSAgc3JjICs9IDI7Ci0JCQkJICAvKiBGYWtlIHVwIHRoZSBkYXRhIHRvIGxvb2sgbGlrZSBpdCdzIGdvdCB0aGUgLXZlIHBjIGluIGl0LCB0aGlzIG1ha2VzCi0JCQkJICAgICAgIGl0IG11Y2ggZWFzaWVyIHRvIGNvbnZlcnQgaW50byBvdGhlciBmb3JtYXRzLiBUaGlzIGlzIGRvbmUgYnkKLQkJCQkgICAgICAgaGl0dGluZyB0aGUgYWRkZW5kLgotCQkJCSAgICAgICAqLwotCQkJCSAgaWYgKHItPnJlbGVudC5ob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSkKLQkJCQkgICAgewotCQkJCSAgICAgIHItPnJlbGVudC5hZGRlbmQgLT0gZHN0X3B0ciAtIGRzdF9iYXNlX3B0cjsKLQkJCQkgICAgfQotCi0KLQotCQkJCX0KLQkJCQlicmVhazsKLQkJCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX0NPTToKLQkJCQlCRkRfRkFJTCAoKTsKLQkJCSAgICAgIH0KLQkJCSAgfQotCQkJKmRzdF9wdHIrKyA9ICpzcmMrKzsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtOgotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX3N5bWJvbF9lbnVtOgotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX3NlY3Rpb25fZW51bToKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBsb29wID0gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotfQotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgbmV3c2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqbmV3c2VjdDsKLXsKLSAgbmV3c2VjdC0+dXNlZF9ieV9iZmQgPSAoUFRSKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChvYXN5c19wZXJfc2VjdGlvbl90eXBlKSk7Ci0gIGlmICghbmV3c2VjdC0+dXNlZF9ieV9iZmQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBvYXN5c19wZXJfc2VjdGlvbiAobmV3c2VjdCktPmRhdGEgPSAoYmZkX2J5dGUgKikgTlVMTDsKLSAgb2FzeXNfcGVyX3NlY3Rpb24gKG5ld3NlY3QpLT5zZWN0aW9uID0gbmV3c2VjdDsKLSAgb2FzeXNfcGVyX3NlY3Rpb24gKG5ld3NlY3QpLT5vZmZzZXQgPSAwOwotICBvYXN5c19wZXJfc2VjdGlvbiAobmV3c2VjdCktPmluaXRpYWxpemVkID0gZmFsc2U7Ci0gIG5ld3NlY3QtPmFsaWdubWVudF9wb3dlciA9IDE7Ci0gIC8qIFR1cm4gdGhlIHNlY3Rpb24gc3RyaW5nIGludG8gYW4gaW5kZXggKi8KLQotICBzc2NhbmYgKG5ld3NlY3QtPm5hbWUsICIldSIsICZuZXdzZWN0LT50YXJnZXRfaW5kZXgpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLXN0YXRpYyBsb25nCi1vYXN5c19nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci17Ci0gIGlmICghIG9hc3lzX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotICByZXR1cm4gKGFzZWN0LT5yZWxvY19jb3VudCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIG9hc3lzX3Blcl9zZWN0aW9uX3R5cGUgKnAgPSAob2FzeXNfcGVyX3NlY3Rpb25fdHlwZSAqKSBzZWN0aW9uLT51c2VkX2J5X2JmZDsKLSAgb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKTsKLSAgaWYgKHAtPmluaXRpYWxpemVkID09IGZhbHNlKQotICAgIHsKLSAgICAgICh2b2lkKSBtZW1zZXQgKGxvY2F0aW9uLCAwLCAoaW50KSBjb3VudCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKHZvaWQpIG1lbWNweSAobG9jYXRpb24sIChQVFIpIChwLT5kYXRhICsgb2Zmc2V0KSwgKGludCkgY291bnQpOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotbG9uZwotb2FzeXNfY2Fub25pY2FsaXplX3JlbG9jIChpZ25vcmVfYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgcmVsb2NfY291bnQgPSAwOwotICBvYXN5c19yZWxvY190eXBlICpzcmMgPSAob2FzeXNfcmVsb2NfdHlwZSAqKSAoc2VjdGlvbi0+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+YXJlbHRfZGF0YSA9IChQVFIpIHA7Ci0JfQotICAgICAgcmV0dXJuIHAtPmFiZmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpOwotICAgICAgcmV0dXJuIChiZmQgKikgTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c19maW5kX25lYXJlc3RfbGluZSAoYWJmZCwKLQkJCSBzZWN0aW9uLAotCQkJIHN5bWJvbHMsCi0JCQkgb2Zmc2V0LAotCQkJIGZpbGVuYW1lX3B0ciwKLQkJCSBmdW5jdGlvbm5hbWVfcHRyLAotCQkJIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyOwotewotICByZXR1cm4gZmFsc2U7Ci0KLX0KLQotc3RhdGljIGludAotb2FzeXNfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IChhYmZkLCBidWYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHN0YXQgKmJ1ZjsKLXsKLSAgb2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqbW9kID0gKG9hc3lzX21vZHVsZV9pbmZvX3R5cGUgKikgYWJmZC0+YXJlbHRfZGF0YTsKLSAgaWYgKG1vZCA9PSAob2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYnVmLT5zdF9zaXplID0gbW9kLT5zaXplOwotICAgICAgYnVmLT5zdF9tb2RlID0gMDY2NjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotc3RhdGljIGludAotb2FzeXNfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjOwotewotICByZXR1cm4gMDsKLX0KLQotI2RlZmluZQlvYXN5c19jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgb2FzeXNfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgb2FzeXNfc2x1cnBfYXJtYXAgYmZkX3RydWUKLSNkZWZpbmUgb2FzeXNfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZmRfdHJ1ZQotI2RlZmluZSBvYXN5c19jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpKSBcCi0gICBiZmRfdHJ1ZSkKLSNkZWZpbmUgb2FzeXNfdHJ1bmNhdGVfYXJuYW1lIGJmZF9kb250X3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBvYXN5c193cml0ZV9hcm1hcCBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKSkgXAotICAgYmZkX3RydWUpCi0jZGVmaW5lIG9hc3lzX3JlYWRfYXJfaGRyIGJmZF9udWxsdm9pZHB0cgotI2RlZmluZSBvYXN5c19nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIG9hc3lzX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX3RydWUKLQotI2RlZmluZSBvYXN5c19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIG9hc3lzX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBvYXN5c19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIG9hc3lzX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgb2FzeXNfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgb2FzeXNfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgb2FzeXNfc2V0X2FyY2hfbWFjaCBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoCi0KLSNkZWZpbmUgb2FzeXNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0jZGVmaW5lIG9hc3lzX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgb2FzeXNfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBvYXN5c19iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgb2FzeXNfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgb2FzeXNfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgb2FzeXNfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgb2FzeXNfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLS8qU1VQUFJFU1MgNDYwICovCi1jb25zdCBiZmRfdGFyZ2V0IG9hc3lzX3ZlYyA9Ci17Ci0gICJvYXN5cyIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X29hc3lzX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUwotICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwKLSAgIG9hc3lzX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgb2FzeXNfYXJjaGl2ZV9wLAotICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgb2FzeXNfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgb2FzeXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKG9hc3lzKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKG9hc3lzKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKG9hc3lzKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9vcG5jbHMuYyBiL2JmZC9vcG5jbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxMDEzNS4uMDAwMDAwMAotLS0gYS9iZmQvb3BuY2xzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ODMgKzAsMCBAQAotLyogb3BuY2xzLmMgLS0gb3BlbiBhbmQgY2xvc2UgYSBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJvYmphbGxvYy5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaWZuZGVmIFNfSVhVU1IKLSNkZWZpbmUgU19JWFVTUiAwMTAwCS8qIEV4ZWN1dGUgYnkgb3duZXIuICAqLwotI2VuZGlmCi0jaWZuZGVmIFNfSVhHUlAKLSNkZWZpbmUgU19JWEdSUCAwMDEwCS8qIEV4ZWN1dGUgYnkgZ3JvdXAuICAqLwotI2VuZGlmCi0jaWZuZGVmIFNfSVhPVEgKLSNkZWZpbmUgU19JWE9USCAwMDAxCS8qIEV4ZWN1dGUgYnkgb3RoZXJzLiAgKi8KLSNlbmRpZgotCi0vKiBmZG9wZW4gaXMgYSBsb3NlciAtLSB3ZSBzaG91bGQgdXNlIHN0ZGlvIGV4Y2x1c2l2ZWx5LiAgVW5mb3J0dW5hdGVseQotICAgaWYgd2UgZG8gdGhhdCB3ZSBjYW4ndCB1c2UgZmNudGwuICAqLwotCi0vKiBGSVhNRTogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCi1sb25nIF9iZmRfY2h1bmtzaXplID0gLTE7Ci0KLS8qIFJldHVybiBhIG5ldyBCRkQuICBBbGwgQkZEJ3MgYXJlIGFsbG9jYXRlZCB0aHJvdWdoIHRoaXMgcm91dGluZS4gICovCi0KLWJmZCAqCi1fYmZkX25ld19iZmQgKCkKLXsKLSAgYmZkICpuYmZkOwotCi0gIG5iZmQgPSAoYmZkICopIGJmZF96bWFsbG9jIChzaXplb2YgKGJmZCkpOwotICBpZiAobmJmZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIG5iZmQtPm1lbW9yeSA9IChQVFIpIG9iamFsbG9jX2NyZWF0ZSAoKTsKLSAgaWYgKG5iZmQtPm1lbW9yeSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIG5iZmQtPmFyY2hfaW5mbyA9ICZiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKLQotICBuYmZkLT5kaXJlY3Rpb24gPSBub19kaXJlY3Rpb247Ci0gIG5iZmQtPmlvc3RyZWFtID0gTlVMTDsKLSAgbmJmZC0+d2hlcmUgPSAwOwotICBuYmZkLT5zZWN0aW9ucyA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBuYmZkLT5mb3JtYXQgPSBiZmRfdW5rbm93bjsKLSAgbmJmZC0+bXlfYXJjaGl2ZSA9IChiZmQgKikgTlVMTDsKLSAgbmJmZC0+b3JpZ2luID0gMDsJCQkJCi0gIG5iZmQtPm9wZW5lZF9vbmNlID0gZmFsc2U7Ci0gIG5iZmQtPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKLSAgbmJmZC0+c2VjdGlvbl9jb3VudCA9IDA7Ci0gIG5iZmQtPnVzcmRhdGEgPSAoUFRSKSBOVUxMOwotICBuYmZkLT5jYWNoZWFibGUgPSBmYWxzZTsKLSAgbmJmZC0+ZmxhZ3MgPSBCRkRfTk9fRkxBR1M7Ci0gIG5iZmQtPm10aW1lX3NldCA9IGZhbHNlOwotCi0gIHJldHVybiBuYmZkOwotfQotCi0vKiBBbGxvY2F0ZSBhIG5ldyBCRkQgYXMgYSBtZW1iZXIgb2YgYXJjaGl2ZSBPQkZELiAgKi8KLQotYmZkICoKLV9iZmRfbmV3X2JmZF9jb250YWluZWRfaW4gKG9iZmQpCi0gICAgIGJmZCAqb2JmZDsKLXsKLSAgYmZkICpuYmZkOwotCi0gIG5iZmQgPSBfYmZkX25ld19iZmQgKCk7Ci0gIG5iZmQtPnh2ZWMgPSBvYmZkLT54dmVjOwotICBuYmZkLT5teV9hcmNoaXZlID0gb2JmZDsKLSAgbmJmZC0+ZGlyZWN0aW9uID0gcmVhZF9kaXJlY3Rpb247Ci0gIG5iZmQtPnRhcmdldF9kZWZhdWx0ZWQgPSBvYmZkLT50YXJnZXRfZGVmYXVsdGVkOwotICByZXR1cm4gbmJmZDsKLX0KLQotLyoKLVNFQ1RJT04KLQlPcGVuaW5nIGFuZCBjbG9zaW5nIEJGRHMKLQotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX29wZW5yCi0KLVNZTk9QU0lTCi0gICAgICAgIGJmZCAqYmZkX29wZW5yKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQpOwotCi1ERVNDUklQVElPTgotCU9wZW4gdGhlIGZpbGUgQHZhcntmaWxlbmFtZX0gKHVzaW5nIDw8Zm9wZW4+Pikgd2l0aCB0aGUgdGFyZ2V0Ci0JQHZhcnt0YXJnZXR9LiAgUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBCRkQuCi0KLQlDYWxscyA8PGJmZF9maW5kX3RhcmdldD4+LCBzbyBAdmFye3RhcmdldH0gaXMgaW50ZXJwcmV0ZWQgYXMgYnkKLQl0aGF0IGZ1bmN0aW9uLgotCi0JSWYgPDxOVUxMPj4gaXMgcmV0dXJuZWQgdGhlbiBhbiBlcnJvciBoYXMgb2NjdXJlZC4gICBQb3NzaWJsZSBlcnJvcnMKLQlhcmUgPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4sIDw8YmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0Pj4gb3IgPDxzeXN0ZW1fY2FsbD4+IGVycm9yLgotKi8KLQotYmZkICoKLWJmZF9vcGVuciAoZmlsZW5hbWUsIHRhcmdldCkKLSAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIENPTlNUIGNoYXIgKnRhcmdldDsKLXsKLSAgYmZkICpuYmZkOwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXRfdmVjOwotCi0gIG5iZmQgPSBfYmZkX25ld19iZmQgKCk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdGFyZ2V0X3ZlYyA9IGJmZF9maW5kX3RhcmdldCAodGFyZ2V0LCBuYmZkKTsKLSAgaWYgKHRhcmdldF92ZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgbmJmZC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgbmJmZC0+ZGlyZWN0aW9uID0gcmVhZF9kaXJlY3Rpb247Ci0KLSAgaWYgKGJmZF9vcGVuX2ZpbGUgKG5iZmQpID09IE5VTEwpCi0gICAgewotICAgICAgLyogRmlsZSBkaWRuJ3QgZXhpc3QsIG9yIHNvbWUgc3VjaCAqLwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBuYmZkOwotfQotCi0vKiBEb24ndCB0cnkgdG8gYG9wdGltaXplJyB0aGlzIGZ1bmN0aW9uOgotCi0gICBvIC0gV2UgbG9jayB1c2luZyBzdGFjayBzcGFjZSBzbyB0aGF0IGludGVycnVwdGluZyB0aGUgbG9ja2luZwotICAgICAgIHdvbid0IGNhdXNlIGEgc3RvcmFnZSBsZWFrLgotICAgbyAtIFdlIG9wZW4gdGhlIGZpbGUgc3RyZWFtIGxhc3QsIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gaGF2ZSB0bwotICAgICAgIGNsb3NlIGl0IGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuICBDbG9zaW5nIHRoZSBzdHJlYW0gbWVhbnMgY2xvc2luZwotICAgICAgIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG9vLCBldmVuIHRob3VnaCB3ZSBkaWRuJ3Qgb3BlbiBpdC4KLSAqLwotLyoKLUZVTkNUSU9OCi0gICAgICAgICBiZmRfZmRvcGVucgotCi1TWU5PUFNJUwotICAgICAgICAgYmZkICpiZmRfZmRvcGVucihDT05TVCBjaGFyICpmaWxlbmFtZSwgQ09OU1QgY2hhciAqdGFyZ2V0LCBpbnQgZmQpOwotCi1ERVNDUklQVElPTgotICAgICAgICAgPDxiZmRfZmRvcGVucj4+IGlzIHRvIDw8YmZkX2ZvcGVucj4+IG11Y2ggbGlrZSA8PGZkb3Blbj4+IGlzIHRvIDw8Zm9wZW4+Pi4KLQkgSXQgb3BlbnMgYSBCRkQgb24gYSBmaWxlIGFscmVhZHkgZGVzY3JpYmVkIGJ5IHRoZSBAdmFye2ZkfQotCSBzdXBwbGllZC4KLQotCSBXaGVuIHRoZSBmaWxlIGlzIGxhdGVyIDw8YmZkX2Nsb3NlPj5kLCB0aGUgZmlsZSBkZXNjcmlwdG9yIHdpbGwgYmUgY2xvc2VkLgotCi0JIElmIHRoZSBjYWxsZXIgZGVzaXJlcyB0aGF0IHRoaXMgZmlsZSBkZXNjcmlwdG9yIGJlIGNhY2hlZCBieSBCRkQKLQkgKG9wZW5lZCBhcyBuZWVkZWQsIGNsb3NlZCBhcyBuZWVkZWQgdG8gZnJlZSBkZXNjcmlwdG9ycyBmb3IKLQkgb3RoZXIgb3BlbnMpLCB3aXRoIHRoZSBzdXBwbGllZCBAdmFye2ZkfSB1c2VkIGFzIGFuIGluaXRpYWwKLQkgZmlsZSBkZXNjcmlwdG9yIChidXQgc3ViamVjdCB0byBjbG9zdXJlIGF0IGFueSB0aW1lKSwgY2FsbAotCSBiZmRfc2V0X2NhY2hlYWJsZShiZmQsIDEpIG9uIHRoZSByZXR1cm5lZCBCRkQuICBUaGUgZGVmYXVsdCBpcyB0bwotCSBhc3N1bWUgbm8gY2FjaGVpbmc7IHRoZSBmaWxlIGRlc2NyaXB0b3Igd2lsbCByZW1haW4gb3BlbiB1bnRpbAotCSA8PGJmZF9jbG9zZT4+LCBhbmQgd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgQkZEIG9wZXJhdGlvbnMgb24gb3RoZXIKLQkgZmlsZXMuCi0KLSAgICAgICAgIFBvc3NpYmxlIGVycm9ycyBhcmUgPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4sIDw8YmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0Pj4gYW5kIDw8YmZkX2Vycm9yX3N5c3RlbV9jYWxsPj4uCi0qLwotCi1iZmQgKgotYmZkX2Zkb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQsIGZkKQotICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKLSAgICAgQ09OU1QgY2hhciAqdGFyZ2V0OwotICAgICBpbnQgZmQ7Ci17Ci0gIGJmZCAqbmJmZDsKLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0X3ZlYzsKLSAgaW50IGZkZmxhZ3M7Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSNpZiAhIGRlZmluZWQoSEFWRV9GQ05UTCkgfHwgISBkZWZpbmVkKEZfR0VURkwpCi0gIGZkZmxhZ3MgPSBPX1JEV1I7CQkJLyogQXNzdW1lIGZ1bGwgYWNjZXNzICovCi0jZWxzZQotICBmZGZsYWdzID0gZmNudGwgKGZkLCBGX0dFVEZMLCBOVUxMKTsKLSNlbmRpZgotICBpZiAoZmRmbGFncyA9PSAtMSkgcmV0dXJuIE5VTEw7Ci0KLSAgbmJmZCA9IF9iZmRfbmV3X2JmZCAoKTsKLSAgaWYgKG5iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB0YXJnZXRfdmVjID0gYmZkX2ZpbmRfdGFyZ2V0ICh0YXJnZXQsIG5iZmQpOwotICBpZiAodGFyZ2V0X3ZlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotI2lmbmRlZiBIQVZFX0ZET1BFTgotICBuYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZvcGVuIChmaWxlbmFtZSwgRk9QRU5fUkIpOwotI2Vsc2UKLSAgLyogKE9fQUNDTU9ERSkgcGFyZW5zIGFyZSB0byBhdm9pZCBVbHRyaXggaGVhZGVyIGZpbGUgYnVnICovCi0gIHN3aXRjaCAoZmRmbGFncyAmIChPX0FDQ01PREUpKQotICAgIHsKLSAgICBjYXNlIE9fUkRPTkxZOiBuYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZkb3BlbiAoZmQsIEZPUEVOX1JCKTsgICBicmVhazsKLSAgICBjYXNlIE9fV1JPTkxZOiBuYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZkb3BlbiAoZmQsIEZPUEVOX1JVQik7ICBicmVhazsKLSAgICBjYXNlIE9fUkRXUjogICBuYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZkb3BlbiAoZmQsIEZPUEVOX1JVQik7ICBicmVhazsKLSAgICBkZWZhdWx0OiBhYm9ydCAoKTsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAobmJmZC0+aW9zdHJlYW0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBPSywgcHV0IGV2ZXJ5dGhpbmcgd2hlcmUgaXQgYmVsb25ncyAqLwotCi0gIG5iZmQtPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0KLSAgLyogQXMgYSBzcGVjaWFsIGNhc2Ugd2UgYWxsb3cgYSBGRCBvcGVuIGZvciByZWFkL3dyaXRlIHRvCi0gICAgIGJlIHdyaXR0ZW4gdGhyb3VnaCwgYWx0aG91Z2ggZG9pbmcgc28gcmVxdWlyZXMgdGhhdCB3ZSBlbmQKLSAgICAgdGhlIHByZXZpb3VzIGNsYXVzZSB3aXRoIGEgcHJlcG9zaXRpb24uICAqLwotICAvKiAoT19BQ0NNT0RFKSBwYXJlbnMgYXJlIHRvIGF2b2lkIFVsdHJpeCBoZWFkZXIgZmlsZSBidWcgKi8KLSAgc3dpdGNoIChmZGZsYWdzICYgT19BQ0NNT0RFKQotICAgIHsKLSAgICBjYXNlIE9fUkRPTkxZOiBuYmZkLT5kaXJlY3Rpb24gPSByZWFkX2RpcmVjdGlvbjsgYnJlYWs7Ci0gICAgY2FzZSBPX1dST05MWTogbmJmZC0+ZGlyZWN0aW9uID0gd3JpdGVfZGlyZWN0aW9uOyBicmVhazsKLSAgICBjYXNlIE9fUkRXUjogbmJmZC0+ZGlyZWN0aW9uID0gYm90aF9kaXJlY3Rpb247IGJyZWFrOwotICAgIGRlZmF1bHQ6IGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoISBiZmRfY2FjaGVfaW5pdCAobmJmZCkpCi0gICAgewotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIG5iZmQtPm9wZW5lZF9vbmNlID0gdHJ1ZTsKLQotICByZXR1cm4gbmJmZDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX29wZW5zdHJlYW1yCi0KLVNZTk9QU0lTCi0JYmZkICpiZmRfb3BlbnN0cmVhbXIoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIFBUUik7Ci0KLURFU0NSSVBUSU9OCi0KLQlPcGVuIGEgQkZEIGZvciByZWFkIGFjY2VzcyBvbiBhbiBleGlzdGluZyBzdGRpbyBzdHJlYW0uICBXaGVuCi0JdGhlIEJGRCBpcyBwYXNzZWQgdG8gPDxiZmRfY2xvc2U+PiwgdGhlIHN0cmVhbSB3aWxsIGJlIGNsb3NlZC4KLSovCi0KLWJmZCAqCi1iZmRfb3BlbnN0cmVhbXIgKGZpbGVuYW1lLCB0YXJnZXQsIHN0cmVhbWFyZykKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRhcmdldDsKLSAgICAgUFRSIHN0cmVhbWFyZzsKLXsKLSAgRklMRSAqc3RyZWFtID0gKEZJTEUgKikgc3RyZWFtYXJnOwotICBiZmQgKm5iZmQ7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldF92ZWM7Ci0KLSAgbmJmZCA9IF9iZmRfbmV3X2JmZCAoKTsKLSAgaWYgKG5iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB0YXJnZXRfdmVjID0gYmZkX2ZpbmRfdGFyZ2V0ICh0YXJnZXQsIG5iZmQpOwotICBpZiAodGFyZ2V0X3ZlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBuYmZkLT5pb3N0cmVhbSA9IChQVFIpIHN0cmVhbTsKLSAgbmJmZC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgbmJmZC0+ZGlyZWN0aW9uID0gcmVhZF9kaXJlY3Rpb247Ci0JCQkJCi0gIGlmICghIGJmZF9jYWNoZV9pbml0IChuYmZkKSkKLSAgICB7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gbmJmZDsKLX0KLQwKLS8qKiBiZmRfb3BlbncgLS0gb3BlbiBmb3Igd3JpdGluZy4KLSAgUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBmcmVzaGx5LWFsbG9jYXRlZCBCRkQgb24gc3VjY2Vzcywgb3IgTlVMTC4KLQotICBTZWUgY29tbWVudCBieSBiZmRfZmRvcGVuciBiZWZvcmUgeW91IHRyeSB0byBtb2RpZnkgdGhpcyBmdW5jdGlvbi4gKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX29wZW53Ci0KLVNZTk9QU0lTCi0JYmZkICpiZmRfb3BlbncoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCk7Ci0KLURFU0NSSVBUSU9OCi0JQ3JlYXRlIGEgQkZELCBhc3NvY2lhdGVkIHdpdGggZmlsZSBAdmFye2ZpbGVuYW1lfSwgdXNpbmcgdGhlCi0JZmlsZSBmb3JtYXQgQHZhcnt0YXJnZXR9LCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4KLQotCVBvc3NpYmxlIGVycm9ycyBhcmUgPDxiZmRfZXJyb3Jfc3lzdGVtX2NhbGw+PiwgPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4sCi0JPDxiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQ+Pi4KLSovCi0KLWJmZCAqCi1iZmRfb3BlbncgKGZpbGVuYW1lLCB0YXJnZXQpCi0gICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotICAgICBDT05TVCBjaGFyICp0YXJnZXQ7Ci17Ci0gIGJmZCAqbmJmZDsKLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0X3ZlYzsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCi0gIC8qIG5iZmQgaGFzIHRvIHBvaW50IHRvIGhlYWQgb2YgbWFsbG9jJ2VkIGJsb2NrIHNvIHRoYXQgYmZkX2Nsb3NlIG1heQotICAgICByZWNsYWltIGl0IGNvcnJlY3RseS4gKi8KLQotICBuYmZkID0gX2JmZF9uZXdfYmZkICgpOwotICBpZiAobmJmZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHRhcmdldF92ZWMgPSBiZmRfZmluZF90YXJnZXQgKHRhcmdldCwgbmJmZCk7Ci0gIGlmICh0YXJnZXRfdmVjID09IE5VTEwpCi0gICAgewotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgbmJmZC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgbmJmZC0+ZGlyZWN0aW9uID0gd3JpdGVfZGlyZWN0aW9uOwotCi0gIGlmIChiZmRfb3Blbl9maWxlIChuYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CS8qIEZpbGUgbm90IHdyaXRlYWJsZSwgZXRjICovCi0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIG5iZmQ7Ci19Ci0KLS8qCi0KLUZVTkNUSU9OCi0JYmZkX2Nsb3NlCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY2xvc2UoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQotCUNsb3NlIGEgQkZELiBJZiB0aGUgQkZEIHdhcyBvcGVuIGZvciB3cml0aW5nLAotCXRoZW4gcGVuZGluZyBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZWQgYW5kIHRoZSBmaWxlIHdyaXR0ZW4gb3V0Ci0JYW5kIGNsb3NlZC4gSWYgdGhlIGNyZWF0ZWQgZmlsZSBpcyBleGVjdXRhYmxlLCB0aGVuCi0JPDxjaG1vZD4+IGlzIGNhbGxlZCB0byBtYXJrIGl0IGFzIHN1Y2guCi0KLQlBbGwgbWVtb3J5IGF0dGFjaGVkIHRvIHRoZSBCRkQgaXMgcmVsZWFzZWQuCi0KLQlUaGUgZmlsZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgQkZEIGlzIGNsb3NlZCAoZXZlbgotCWlmIGl0IHdhcyBwYXNzZWQgaW4gdG8gQkZEIGJ5IDw8YmZkX2Zkb3BlbnI+PikuCi0KLVJFVFVSTlMKLQk8PHRydWU+PiBpcyByZXR1cm5lZCBpZiBhbGwgaXMgb2ssIG90aGVyd2lzZSA8PGZhbHNlPj4uCi0qLwotCi0KLWJvb2xlYW4KLWJmZF9jbG9zZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBib29sZWFuIHJldDsKLQotICBpZiAoIWJmZF9yZWFkX3AgKGFiZmQpKQotICAgIHsKLSAgICAgIGlmICghIEJGRF9TRU5EX0ZNVCAoYWJmZCwgX2JmZF93cml0ZV9jb250ZW50cywgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIEJGRF9TRU5EIChhYmZkLCBfY2xvc2VfYW5kX2NsZWFudXAsIChhYmZkKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldCA9IGJmZF9jYWNoZV9jbG9zZSAoYWJmZCk7Ci0KLSAgLyogSWYgdGhlIGZpbGUgd2FzIG9wZW4gZm9yIHdyaXRpbmcgYW5kIGlzIG5vdyBleGVjdXRhYmxlLAotICAgICBtYWtlIGl0IHNvICovCi0gIGlmIChyZXQKLSAgICAgICYmIGFiZmQtPmRpcmVjdGlvbiA9PSB3cml0ZV9kaXJlY3Rpb24KLSAgICAgICYmIGFiZmQtPmZsYWdzICYgRVhFQ19QKQotICAgIHsKLSAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLQotICAgICAgaWYgKHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmYnVmKSA9PSAwKQotCXsKLSAJICBpbnQgbWFzayA9IHVtYXNrICgwKTsKLQkgIHVtYXNrIChtYXNrKTsKLQkgIGNobW9kIChhYmZkLT5maWxlbmFtZSwKLQkJICgwNzc3Ci0JCSAgJiAoYnVmLnN0X21vZGUgfCAoKFNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USCkgJn4gbWFzaykpKSk7Ci0JfQotICAgIH0KLQotICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIGFiZmQtPm1lbW9yeSk7Ci0gIGZyZWUgKGFiZmQpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jbG9zZV9hbGxfZG9uZQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2Nsb3NlX2FsbF9kb25lKGJmZCAqKTsKLQotREVTQ1JJUFRJT04KLQlDbG9zZSBhIEJGRC4gIERpZmZlcnMgZnJvbSA8PGJmZF9jbG9zZT4+Ci0Jc2luY2UgaXQgZG9lcyBub3QgY29tcGxldGUgYW55IHBlbmRpbmcgb3BlcmF0aW9ucy4gIFRoaXMKLQlyb3V0aW5lIHdvdWxkIGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGhhZCBqdXN0IHVzZWQgQkZEIGZvcgotCXN3YXBwaW5nIGFuZCBkaWRuJ3Qgd2FudCB0byB1c2UgYW55IG9mIHRoZSB3cml0aW5nIGNvZGUuCi0KLQlJZiB0aGUgY3JlYXRlZCBmaWxlIGlzIGV4ZWN1dGFibGUsIHRoZW4gPDxjaG1vZD4+IGlzIGNhbGxlZAotCXRvIG1hcmsgaXQgYXMgc3VjaC4KLQotCUFsbCBtZW1vcnkgYXR0YWNoZWQgdG8gdGhlIEJGRCBpcyByZWxlYXNlZC4KLQotUkVUVVJOUwotCTw8dHJ1ZT4+IGlzIHJldHVybmVkIGlmIGFsbCBpcyBvaywgb3RoZXJ3aXNlIDw8ZmFsc2U+Pi4KLQotKi8KLQotYm9vbGVhbgotYmZkX2Nsb3NlX2FsbF9kb25lIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJvb2xlYW4gcmV0OwotCi0gIHJldCA9IGJmZF9jYWNoZV9jbG9zZSAoYWJmZCk7Ci0KLSAgLyogSWYgdGhlIGZpbGUgd2FzIG9wZW4gZm9yIHdyaXRpbmcgYW5kIGlzIG5vdyBleGVjdXRhYmxlLAotICAgICBtYWtlIGl0IHNvICovCi0gIGlmIChyZXQKLSAgICAgICYmIGFiZmQtPmRpcmVjdGlvbiA9PSB3cml0ZV9kaXJlY3Rpb24KLSAgICAgICYmIGFiZmQtPmZsYWdzICYgRVhFQ19QKQotICAgIHsKLSAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLQotICAgICAgaWYgKHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmYnVmKSA9PSAwKQotCXsKLQkgIGludCBtYXNrID0gdW1hc2sgKDApOwotCSAgdW1hc2sgKG1hc2spOwotCSAgY2htb2QgKGFiZmQtPmZpbGVuYW1lLAotCQkgKDB4Nzc3Ci0JCSAgJiAoYnVmLnN0X21vZGUgfCAoKFNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USCkgJn4gbWFzaykpKSk7Ci0JfQotICAgIH0KLQotICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIGFiZmQtPm1lbW9yeSk7Ci0gIGZyZWUgKGFiZmQpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jcmVhdGUKLQotU1lOT1BTSVMKLQliZmQgKmJmZF9jcmVhdGUoQ09OU1QgY2hhciAqZmlsZW5hbWUsIGJmZCAqdGVtcGwpOwotCi1ERVNDUklQVElPTgotCUNyZWF0ZSBhIG5ldyBCRkQgaW4gdGhlIG1hbm5lciBvZgotCTw8YmZkX29wZW53Pj4sIGJ1dCB3aXRob3V0IG9wZW5pbmcgYSBmaWxlLiBUaGUgbmV3IEJGRAotCXRha2VzIHRoZSB0YXJnZXQgZnJvbSB0aGUgdGFyZ2V0IHVzZWQgYnkgQHZhcnt0ZW1wbGF0ZX0uIFRoZQotCWZvcm1hdCBpcyBhbHdheXMgc2V0IHRvIDw8YmZkX29iamVjdD4+LgotCi0qLwotCi1iZmQgKgotYmZkX2NyZWF0ZSAoZmlsZW5hbWUsIHRlbXBsKQotICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKLSAgICAgYmZkICp0ZW1wbDsKLXsKLSAgYmZkICpuYmZkOwotCi0gIG5iZmQgPSBfYmZkX25ld19iZmQgKCk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5iZmQtPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIGlmICh0ZW1wbCkKLSAgICBuYmZkLT54dmVjID0gdGVtcGwtPnh2ZWM7Ci0gIG5iZmQtPmRpcmVjdGlvbiA9IG5vX2RpcmVjdGlvbjsKLSAgYmZkX3NldF9mb3JtYXQgKG5iZmQsIGJmZF9vYmplY3QpOwotICByZXR1cm4gbmJmZDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2Vfd3JpdGFibGUKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9tYWtlX3dyaXRhYmxlKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JVGFrZXMgYSBCRkQgYXMgY3JlYXRlZCBieSA8PGJmZF9jcmVhdGU+PiBhbmQgY29udmVydHMgaXQKLQlpbnRvIG9uZSBsaWtlIGFzIHJldHVybmVkIGJ5IDw8YmZkX29wZW53Pj4uICBJdCBkb2VzIHRoaXMKLQlieSBjb252ZXJ0aW5nIHRoZSBCRkQgdG8gQkZEX0lOX01FTU9SWS4gIEl0J3MgYXNzdW1lZCB0aGF0Ci0JeW91IHdpbGwgY2FsbCA8PGJmZF9tYWtlX3JlYWRhYmxlPj4gb24gdGhpcyBiZmQgbGF0ZXIuCi0KLVJFVFVSTlMKLQk8PHRydWU+PiBpcyByZXR1cm5lZCBpZiBhbGwgaXMgb2ssIG90aGVyd2lzZSA8PGZhbHNlPj4uCi0qLwotCi1ib29sZWFuCi1iZmRfbWFrZV93cml0YWJsZShhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBiZmRfaW5fbWVtb3J5ICpiaW07Ci0KLSAgaWYgKGFiZmQtPmRpcmVjdGlvbiAhPSBub19kaXJlY3Rpb24pCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYmltID0gKHN0cnVjdCBiZmRfaW5fbWVtb3J5ICopIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9pbl9tZW1vcnkpKTsKLSAgYWJmZC0+aW9zdHJlYW0gPSAoUFRSKSBiaW07Ci0gIC8qIGJmZF93cml0ZSB3aWxsIGdyb3cgdGhlc2UgYXMgbmVlZGVkICovCi0gIGJpbS0+c2l6ZSA9IDA7Ci0gIGJpbS0+YnVmZmVyID0gMDsKLQotICBhYmZkLT5mbGFncyB8PSBCRkRfSU5fTUVNT1JZOwotICBhYmZkLT5kaXJlY3Rpb24gPSB3cml0ZV9kaXJlY3Rpb247Ci0gIGFiZmQtPndoZXJlID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2VfcmVhZGFibGUKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9tYWtlX3JlYWRhYmxlKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JVGFrZXMgYSBCRkQgYXMgY3JlYXRlZCBieSA8PGJmZF9jcmVhdGU+PiBhbmQKLQk8PGJmZF9tYWtlX3dyaXRhYmxlPj4gYW5kIGNvbnZlcnRzIGl0IGludG8gb25lIGxpa2UgYXMKLQlyZXR1cm5lZCBieSA8PGJmZF9vcGVucj4+LiAgSXQgZG9lcyB0aGlzIGJ5IHdyaXRpbmcgdGhlCi0JY29udGVudHMgb3V0IHRvIHRoZSBtZW1vcnkgYnVmZmVyLCB0aGVuIHJldmVyc2luZyB0aGUKLQlkaXJlY3Rpb24uCi0KLVJFVFVSTlMKLQk8PHRydWU+PiBpcyByZXR1cm5lZCBpZiBhbGwgaXMgb2ssIG90aGVyd2lzZSA8PGZhbHNlPj4uICAqLwotCi1ib29sZWFuCi1iZmRfbWFrZV9yZWFkYWJsZShhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT5kaXJlY3Rpb24gIT0gd3JpdGVfZGlyZWN0aW9uIHx8ICEoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBCRkRfU0VORF9GTVQgKGFiZmQsIF9iZmRfd3JpdGVfY29udGVudHMsIChhYmZkKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIEJGRF9TRU5EIChhYmZkLCBfY2xvc2VfYW5kX2NsZWFudXAsIChhYmZkKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0KLSAgYWJmZC0+YXJjaF9pbmZvID0gJmJmZF9kZWZhdWx0X2FyY2hfc3RydWN0OwotCi0gIGFiZmQtPndoZXJlID0gMDsKLSAgYWJmZC0+c2VjdGlvbnMgPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgYWJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247Ci0gIGFiZmQtPm15X2FyY2hpdmUgPSAoYmZkICopIE5VTEw7Ci0gIGFiZmQtPm9yaWdpbiA9IDA7CQkJCQotICBhYmZkLT5vcGVuZWRfb25jZSA9IGZhbHNlOwotICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gZmFsc2U7Ci0gIGFiZmQtPnNlY3Rpb25fY291bnQgPSAwOwotICBhYmZkLT51c3JkYXRhID0gKFBUUikgTlVMTDsKLSAgYWJmZC0+Y2FjaGVhYmxlID0gZmFsc2U7Ci0gIGFiZmQtPmZsYWdzID0gQkZEX0lOX01FTU9SWTsKLSAgYWJmZC0+bXRpbWVfc2V0ID0gZmFsc2U7Ci0KLSAgYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCA9IHRydWU7Ci0gIGFiZmQtPmRpcmVjdGlvbiA9IHJlYWRfZGlyZWN0aW9uOwotICBhYmZkLT5zZWN0aW9ucyA9IDA7Ci0gIGFiZmQtPnN5bWNvdW50ID0gMDsKLSAgYWJmZC0+b3V0c3ltYm9scyA9IDA7Ci0gIGFiZmQtPnRkYXRhLmFueSA9IDA7Ci0KLSAgYmZkX2NoZWNrX2Zvcm1hdChhYmZkLCBiZmRfb2JqZWN0KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2FsbG9jCi0KLVNZTk9QU0lTCi0JUFRSIGJmZF9hbGxvYyAoYmZkICphYmZkLCBzaXplX3Qgd2FudGVkKTsKLQotREVTQ1JJUFRJT04KLQlBbGxvY2F0ZSBhIGJsb2NrIG9mIEB2YXJ7d2FudGVkfSBieXRlcyBvZiBtZW1vcnkgYXR0YWNoZWQgdG8KLQk8PGFiZmQ+PiBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4KLSovCi0KLQotUFRSCi1iZmRfYWxsb2MgKGFiZmQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIFBUUiByZXQ7Ci0KLSAgcmV0ID0gb2JqYWxsb2NfYWxsb2MgKGFiZmQtPm1lbW9yeSwgKHVuc2lnbmVkIGxvbmcpIHNpemUpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLVBUUgotYmZkX3phbGxvYyAoYWJmZCwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIHJlczsKLQotICByZXMgPSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICBpZiAocmVzKQotICAgIG1lbXNldCAocmVzLCAwLCBzaXplKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotLyogRnJlZSBhIGJsb2NrIGFsbG9jYXRlZCBmb3IgYSBCRkQuICAqLwotCi12b2lkCi1iZmRfcmVsZWFzZSAoYWJmZCwgYmxvY2spCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGJsb2NrOwotewotICBvYmphbGxvY19mcmVlX2Jsb2NrICgoc3RydWN0IG9iamFsbG9jICopIGFiZmQtPm1lbW9yeSwgYmxvY2spOwotfQpkaWZmIC0tZ2l0IGEvYmZkL29zZi1jb3JlLmMgYi9iZmQvb3NmLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcxZjRhZi4uMDAwMDAwMAotLS0gYS9iZmQvb3NmLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE9TRi8xIGNvcmUgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gc3lzdGVtcyB3aGljaCB1c2UgT1NGLzEgc3R5bGUKLSAgIGNvcmUgZmlsZXMuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlIDxzeXMvdXNlci5oPgotI2luY2x1ZGUgPHN5cy9jb3JlLmg+Ci0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgQ09OU1QgY2hhciAqLCBmbGFnd29yZCwgYmZkX3NpemVfdHlwZSwKLQkJCSAgIGJmZF92bWEsIGZpbGVfcHRyKSk7Ci1zdGF0aWMgYXN5bWJvbCAqCi1vc2ZfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotb3NmX2NvcmVfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjaGFyICoKLW9zZl9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQKLW9zZl9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4KLW9zZl9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEgKi8KLQotc3RydWN0IG9zZl9jb3JlX3N0cnVjdCAKLXsKLSAgaW50IHNpZzsKLSAgY2hhciBjbWRbTUFYQ09NTEVOICsgMV07Ci19OwotCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgKChiZmQpLT50ZGF0YS5vc2ZfY29yZV9kYXRhKQotI2RlZmluZSBjb3JlX3NpZ25hbChiZmQpIChjb3JlX2hkcihiZmQpLT5zaWcpCi0jZGVmaW5lIGNvcmVfY29tbWFuZChiZmQpIChjb3JlX2hkcihiZmQpLT5jbWQpCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgbmFtZSwgZmxhZ3MsIF9yYXdfc2l6ZSwgdm1hLCBmaWxlcG9zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLQotICBhc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLSAgaWYgKCFhc2VjdCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBhc2VjdC0+ZmxhZ3MgPSBmbGFnczsKLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IF9yYXdfc2l6ZTsKLSAgYXNlY3QtPnZtYSA9IHZtYTsKLSAgYXNlY3QtPmZpbGVwb3MgPSBmaWxlcG9zOwotICBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gODsKLQotICByZXR1cm4gYXNlY3Q7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLW9zZl9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLW9zZl9jb3JlX2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCB2YWw7Ci0gIGludCBpOwotICBjaGFyICpzZWNuYW1lOwotICBzdHJ1Y3QgY29yZV9maWxlaGRyIGNvcmVfaGVhZGVyOwotCi0gIHZhbCA9IGJmZF9yZWFkICgoUFRSKSZjb3JlX2hlYWRlciwgMSwgc2l6ZW9mIGNvcmVfaGVhZGVyLCBhYmZkKTsKLSAgaWYgKHZhbCAhPSBzaXplb2YgY29yZV9oZWFkZXIpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKHN0cm5jbXAgKGNvcmVfaGVhZGVyLm1hZ2ljLCAiQ29yZSIsIDQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgY29yZV9oZHIgKGFiZmQpID0gKHN0cnVjdCBvc2ZfY29yZV9zdHJ1Y3QgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBvc2ZfY29yZV9zdHJ1Y3QpKTsKLSAgaWYgKCFjb3JlX2hkciAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3RybmNweSAoY29yZV9jb21tYW5kIChhYmZkKSwgY29yZV9oZWFkZXIubmFtZSwgTUFYQ09NTEVOICsgMSk7Ci0gIGNvcmVfc2lnbmFsIChhYmZkKSA9IGNvcmVfaGVhZGVyLnNpZ25vOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3JlX2hlYWRlci5uc2NuczsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBjb3JlX3NjbmhkciBjb3JlX3NjbmhkcjsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0gICAgICB2YWwgPSBiZmRfcmVhZCAoKFBUUikmY29yZV9zY25oZHIsIDEsIHNpemVvZiBjb3JlX3NjbmhkciwgYWJmZCk7Ci0gICAgICBpZiAodmFsICE9IHNpemVvZiBjb3JlX3NjbmhkcikKLQlicmVhazsKLQotICAgICAgLyogU2tpcCBlbXB0eSBzZWN0aW9ucy4gICovCi0gICAgICBpZiAoY29yZV9zY25oZHIuc2l6ZSA9PSAwIHx8IGNvcmVfc2NuaGRyLnNjbnB0ciA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBzd2l0Y2ggKGNvcmVfc2NuaGRyLnNjbnR5cGUpCi0JewotCWNhc2UgU0NOUkdOOgotCSAgc2VjbmFtZSA9ICIuZGF0YSI7Ci0JICBmbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLQkgIGJyZWFrOwotCWNhc2UgU0NOU1RBQ0s6Ci0JICBzZWNuYW1lID0gIi5zdGFjayI7Ci0JICBmbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLQkgIGJyZWFrOwotCWNhc2UgU0NOUkVHUzoKLQkgIHNlY25hbWUgPSAiLnJlZyI7Ci0JICBmbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJVbmhhbmRsZWQgT1NGLzEgY29yZSBmaWxlIHNlY3Rpb24gdHlwZSAlZFxuIiksCi0JCQkJIGNvcmVfc2NuaGRyLnNjbnR5cGUpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBzZWNuYW1lLCBmbGFncywKLQkJCSAgICAgIChiZmRfc2l6ZV90eXBlKSBjb3JlX3Njbmhkci5zaXplLAotCQkJICAgICAgKGJmZF92bWEpIGNvcmVfc2NuaGRyLnZhZGRyLAotCQkJICAgICAgKGZpbGVfcHRyKSBjb3JlX3Njbmhkci5zY25wdHIpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUgKHN1cmUsIHN1cmUpLiAgKi8KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGNoYXIgKgotb3NmX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBpbnQKLW9zZl9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9zaWduYWwgKGFiZmQpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIGJvb2xlYW4KLW9zZl9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotDAotI2RlZmluZSBvc2ZfY29yZV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgb3NmX2NvcmVfZ2V0X3N5bXRhYiBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiCi0jZGVmaW5lIG9zZl9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgb3NmX2NvcmVfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBvc2ZfY29yZV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBvc2ZfY29yZV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgb3NmX2NvcmVfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgb3NmX2NvcmVfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBvc2ZfY29yZV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgb3NmX2NvcmVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgb3NmX2NvcmVfdmVjID0KLSAgewotICAgICJvc2YtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBvc2ZfY29yZV9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKG9zZl9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAob3NmX2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvcGM1MzItbWFjaC5jIGIvYmZkL3BjNTMyLW1hY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNmNGFjNC4uMDAwMDAwMAotLS0gYS9iZmQvcGM1MzItbWFjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTWFjaDMvNTMyIGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IElhbiBEYWxsCi0gKiAgICAgICAgICAgIDE5LUFwci05NAotICoKLSAqIEZvcm1lcmx5IHBhcnQgb2YgYW91dC1wYzUzMi1tYWNoLmMuIFNwbGl0IG91dCB0byBhbGxvdyBtb3JlCi0gKiBmbGV4aWJpbGl0eSB3aXRoIG11bHRpcGxlIGZvcm1hdHMuCi0gKgotICovCi0vKiBUaGlzIGFyY2hpdGVjdHVyZSBoYXMgTl9UWFRPRkYgYW5kIE5fVFhUQUREUiBkZWZpbmVkIGFzIGlmCi0gKiBOX0hFQURFUl9JTl9URVhULCBidXQgdGhlIGFfdGV4dCBlbnRyeSAodGV4dCBzaXplKSBkb2VzIG5vdCBpbmNsdWRlIHRoZQotICogc3BhY2UgZm9yIHRoZSBoZWFkZXIuIFNvIHdlIGhhdmUgTl9IRUFERVJfSU5fVEVYVCBkZWZpbmVkIHRvCi0gKiAxIGFuZCBzcGVjaWFsbHkgZGVmaW5lIG91ciBvd24gTl9UWFRTSVpFCi0gKi8KLQotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDEKLSNkZWZpbmUgTl9UWFRTSVpFKHgpICgoeCkuYV90ZXh0KQotCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDB4MTAwMDAgICAgICAgLyogZnJvbSBvbGQgbGQgKi8KLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAweDEwMDAgICAgICAgLyogZnJvbSBvbGQgbGQsICAwMzIgJiA1MzIgYXJlIHJlYWxseSA1MTIvNGsgKi8KLQotLyogVXNlIGFfZW50cnkgb2YgMCB0byBkaXN0aW5ndWlzaCBvYmplY3QgZmlsZXMgZnJvbSBPTUFHSUMgZXhlY3V0YWJsZXMgKi8KLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLSAgKE5fTUFHSUMoeCkgPT0gT01BR0lDID8gXAotICAgKCh4KS5hX2VudHJ5IDwgVEVYVF9TVEFSVF9BRERSPyAwOiBURVhUX1NUQVJUX0FERFIpOiBcCi0gICAoTl9NQUdJQyh4KSA9PSBOTUFHSUM/IFRFWFRfU1RBUlRfQUREUjogXAotICAgIFRFWFRfU1RBUlRfQUREUiArIEVYRUNfQllURVNfU0laRSkpCi0KLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLQotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbnMzMmsKLSAgCi0jZGVmaW5lIE1ZKE9QKSBDQVQocGM1MzJtYWNoYW91dF8sT1ApCi0KLS8qIE11c3QgYmUgdGhlIHNhbWUgYXMgYW91dC1uczMyay5jICovCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQzKG5zMzJrYW91dCxfMzJfLHkpCi0KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtcGM1MzItbWFjaCIKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi0vKiBXZSBjYW5gdCB1c2UgdGhlIE1ZTlMgbWFjcm8gaGVyZSBmb3IgY3BwIHJlYXNvbnMgdG9vIHN1YnRsZSBmb3IgbWUgLS0gSVdEICovCi0KLSNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIG5zMzJrYW91dF9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogbGliYW91dCBkb2Vzbid0IHVzZSBOQU1FIGZvciB0aGVzZSAuLi4gKi8KLQotI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50cyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0KLSNkZWZpbmUgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIgMQotCi0jZGVmaW5lIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkIDEKLSAgICAgCi0jZGVmaW5lIE1ZTlNYKE9QKSBDQVQobnMzMmthb3V0XyxPUCkKLXJlbG9jX2hvd3RvX3R5cGUgKgotTVlOU1goYmZkX3JlbG9jX3R5cGVfbG9va3VwKQotICBQQVJBTVMoKGJmZCAqYWJmZCBBTkQKLQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLWJvb2xlYW4KLU1ZTlNYKHdyaXRlX29iamVjdF9jb250ZW50cykKLSAgUEFSQU1TKChiZmQgKmFiZmQpKTsKLQotc3RhdGljIGJvb2xlYW4KLU1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgKGFiZmQpCi1iZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLSAgCi0jaWYgQ0hPT1NFX1JFTE9DX1NJWkUKLSAgQ0hPT1NFX1JFTE9DX1NJWkUoYWJmZCk7Ci0jZWxzZQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSNlbmRpZgotICAKLSAgQkZEX0FTU0VSVCAoYmZkX2dldF9hcmNoIChhYmZkKSA9PSBiZmRfYXJjaF9uczMyayk7Ci0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSAzMjAzMjoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fTlMzMjAzMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyNTMyOgotICAgIGRlZmF1bHQ6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX05TMzI1MzIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBOX1NFVF9GTEFHUyAoKmV4ZWNwLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKLSAgCi0gIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvcGUtYXJtLmMgYi9iZmQvcGUtYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMTU4ODguLjAwMDAwMDAKLS0tIGEvYmZkL3BlLWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBBUk0gUEVDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaWZuZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgIGFybXBlX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgInBlLWFybS1saXR0bGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgIGFybXBlX2JpZ192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgInBlLWFybS1iaWciCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgICAgICAgICAgdHJ1ZQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jaW5jbHVkZSAiY29mZi1hcm0uYyIKZGlmZiAtLWdpdCBhL2JmZC9wZS1pMzg2LmMgYi9iZmQvcGUtaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2RiZTQ0Li4wMDAwMDAwCi0tLSBhL2JmZC9wZS1pMzg2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDM4NiBQRUNPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLQotI2RlZmluZSBUQVJHRVRfU1lNIGkzODZwZV92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUgInBlLWkzODYiCi0jZGVmaW5lIENPRkZfV0lUSF9QRQotI2RlZmluZSBQQ1JFTE9GRlNFVCB0cnVlCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFICdfJwotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jaW5jbHVkZSAiY29mZi1pMzg2LmMiCmRpZmYgLS1naXQgYS9iZmQvcGUtbWNvcmUuYyBiL2JmZC9wZS1tY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTE5ZjgxLi4wMDAwMDAwCi0tLSBhL2JmZC9wZS1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNQ29yZSBQRUNPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpZm5kZWYgVEFSR0VUX0JJR19TWU0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgbWNvcmVfcGVfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAicGUtbWNvcmUtYmlnIgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgICBtY29yZV9wZV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICJwZS1tY29yZS1saXR0bGUiCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgICAgICAgICAgdHJ1ZQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jZGVmaW5lIE1DT1JFX1BFCi0KLSNpbmNsdWRlICJjb2ZmLW1jb3JlLmMiCmRpZmYgLS1naXQgYS9iZmQvcGUtcHBjLmMgYi9iZmQvcGUtcHBjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYmFjMDQuLjAwMDAwMDAKLS0tIGEvYmZkL3BlLXBwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBQb3dlclBDIFBFQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLQotI2RlZmluZSBFX0ZJTEVOTUxFTiAgICAgMTgKLQotI2RlZmluZSBQUENfUEUKLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgIGJmZF9wb3dlcnBjbGVfcGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAicGUtcG93ZXJwY2xlIgotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgYmZkX3Bvd2VycGNfcGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAicGUtcG93ZXJwYyIKLQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0vKiBGSVhNRTogdmVyaWZ5IFBDUkVMT0ZGU0VUIGlzIGFsd2F5cyBmYWxzZSAqLwotCi0jaW5jbHVkZSAiY29mZi1wcGMuYyIKZGlmZiAtLWdpdCBhL2JmZC9wZWktYXJtLmMgYi9iZmQvcGVpLWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmE1YjNhLi4wMDAwMDAwCi0tLSBhL2JmZC9wZWktYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGFybSBQRSBJTUFHRSBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaWZuZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICBhcm1wZWlfbGl0dGxlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgInBlaS1hcm0tbGl0dGxlIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgYXJtcGVpX2JpZ192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICJwZWktYXJtLWJpZyIKLSNlbmRpZgotCi0jZGVmaW5lIElNQUdFX0JBU0UgICAgICAgICBOVF9JTUFHRV9CQVNFCi0jZGVmaW5lIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgICAgICAgIHRydWUKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotI2luY2x1ZGUgImNvZmYtYXJtLmMiCmRpZmYgLS1naXQgYS9iZmQvcGVpLWkzODYuYyBiL2JmZC9wZWktaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjUyOTY4Li4wMDAwMDAwCi0tLSBhL2JmZC9wZWktaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgUEUgSU1BR0UgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2RlZmluZSBUQVJHRVRfU1lNIGkzODZwZWlfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FICJwZWktaTM4NiIKLSNkZWZpbmUgSU1BR0VfQkFTRSBOVF9JTUFHRV9CQVNFCi0jZGVmaW5lIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgdHJ1ZQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAnXycKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotI2luY2x1ZGUgImNvZmYtaTM4Ni5jIgotCi0KLQpkaWZmIC0tZ2l0IGEvYmZkL3BlaS1tY29yZS5jIGIvYmZkL3BlaS1tY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGE4NzJjLi4wMDAwMDAwCi0tLSBhL2JmZC9wZWktbWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTUNvcmUgUEVDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaWZuZGVmIFRBUkdFVF9CSUdfU1lNCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgIG1jb3JlX3BlaV9iaWdfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICJwZWktbWNvcmUtYmlnIgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgICBtY29yZV9wZWlfbGl0dGxlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAicGVpLW1jb3JlLWxpdHRsZSIKLSNlbmRpZgotCi0jZGVmaW5lIElNQUdFX0JBU0UgICAgICAgICBOVF9JTUFHRV9CQVNFCi0jZGVmaW5lIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgICAgICAgIHRydWUKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotI2RlZmluZSBNQ09SRV9QRQotCi0jaW5jbHVkZSAiY29mZi1tY29yZS5jIgpkaWZmIC0tZ2l0IGEvYmZkL3BlaS1wcGMuYyBiL2JmZC9wZWktcHBjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzOWJjMGYuLjAwMDAwMDAKLS0tIGEvYmZkL3BlaS1wcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgUG93ZXJQQyBQRSBJTUFHRSBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotLyogc2V0dGluZyB1cCBmb3IgYSBQRSBlbnZpcm9ubWVudCBzdG9sZW4gZGlyZWN0bHkgZnJvbSB0aGUgaTM4NiBzdHJ1Y3R1cmUgKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0KLSNkZWZpbmUgUFBDX1BFCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICBiZmRfcG93ZXJwY2xlX3BlaV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICJwZWktcG93ZXJwY2xlIgotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgYmZkX3Bvd2VycGNfcGVpX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgInBlaS1wb3dlcnBjIgotCi0jZGVmaW5lIElNQUdFX0JBU0UgICAgICAgICAgTlRfSU1BR0VfQkFTRQotCi0jZGVmaW5lIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0vKiBGSVhNRTogVmVyaWZ5IFBDUkVMT0ZGU0VUIGlzIGFsd2F5cyBmYWxzZSAqLwotCi0jaW5jbHVkZSAiY29mZi1wcGMuYyIKLQotCi0KZGlmZiAtLWdpdCBhL2JmZC9wZWljb2RlLmggYi9iZmQvcGVpY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTQ3YmNhLi4wMDAwMDAwCi0tLSBhL2JmZC9wZWljb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTk1ICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIHRoZSBnZW5lcmljIHBhcnRzIG9mIG1vc3QgQ09GRiB2YXJpYW50cywgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotTW9zdCBvZiB0aGlzIGhhY2tlZCBieSAgU3RldmUgQ2hhbWJlcmxhaW4sCi0JCQlzYWNAY3lnbnVzLmNvbQotKi8KLQotLyogSGV5IGxvb2ssIHNvbWUgZG9jdW1lbnRhdGlvbiBbYW5kIGluIGEgcGxhY2UgeW91IGV4cGVjdCB0byBmaW5kIGl0XSEKLQotICAgVGhlIG1haW4gcmVmZXJlbmNlIGZvciB0aGUgcGVpIGZvcm1hdCBpcyAiTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUKLSAgIGFuZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0IFNwZWNpZmljYXRpb24gNC4xIi4gIEdldCBpdCBpZiB5b3UgbmVlZCB0bwotICAgZG8gc29tZSBzZXJpb3VzIGhhY2tpbmcgb24gdGhpcyBjb2RlLgotCi0gICBBbm90aGVyIHJlZmVyZW5jZToKLSAgICJQZWVyaW5nIEluc2lkZSB0aGUgUEU6IEEgVG91ciBvZiB0aGUgV2luMzIgUG9ydGFibGUgRXhlY3V0YWJsZQotICAgRmlsZSBGb3JtYXQiLCBNU0ogMTk5NCwgVm9sdW1lIDkuCi0KLSAgIFRoZSAqc29sZSogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwZSBmb3JtYXQgYW5kIHRoZSBwZWkgZm9ybWF0IGlzIHRoYXQgdGhlCi0gICBsYXR0ZXIgaGFzIGFuIE1TRE9TIDIuMCAuZXhlIGhlYWRlciBvbiB0aGUgZnJvbnQgdGhhdCBwcmludHMgdGhlIG1lc3NhZ2UKLSAgICJUaGlzIGFwcCBtdXN0IGJlIHJ1biB1bmRlciBXaW5kb3dzLiIgKG9yIHNvbWUgc3VjaCkuCi0gICAoRklYTUU6IFdoZXRoZXIgdGhhdCBzdGF0ZW1lbnQgaXMgKnJlYWxseSogdHJ1ZSBvciBub3QgaXMgdW5rbm93bi4KLSAgIEFyZSB0aGVyZSBtb3JlIHN1YnRsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHBlIGFuZCBwZWkgZm9ybWF0cz8KLSAgIEZvciBub3cgYXNzdW1lIHRoZXJlIGFyZW4ndC4gIElmIHlvdSBmaW5kIG9uZSwgdGhlbiBmb3IgR29kIHNha2VzCi0gICBkb2N1bWVudCBpdCBoZXJlISkKLQotICAgVGhlIE1pY3Jvc29mdCBkb2NzIHVzZSB0aGUgd29yZCAiaW1hZ2UiIGluc3RlYWQgb2YgImV4ZWN1dGFibGUiIGJlY2F1c2UKLSAgIHRoZSBmb3JtZXIgY2FuIGFsc28gcmVmZXIgdG8gYSBETEwgKHNoYXJlZCBsaWJyYXJ5KS4gIENvbmZ1c2lvbiBjYW4gYXJpc2UKLSAgIGJlY2F1c2UgdGhlIGBpJyBpbiBgcGVpJyBhbHNvIHJlZmVycyB0byAiaW1hZ2UiLiAgVGhlIGBwZScgZm9ybWF0IGNhbgotICAgYWxzbyBjcmVhdGUgaW1hZ2VzIChpLmUuIGV4ZWN1dGFibGVzKSwgaXQncyBqdXN0IHRoYXQgdG8gcnVuIG9uIGEgd2luMzIKLSAgIHN5c3RlbSB5b3UgbmVlZCB0byB1c2UgdGhlIHBlaSBmb3JtYXQuCi0KLSAgIEZJWE1FOiBQbGVhc2UgYWRkIG1vcmUgZG9jcyBoZXJlIHNvIHRoZSBuZXh0IHBvb3IgZm9vbCB0aGF0IGhhcyB0byBoYWNrCi0gICBvbiB0aGlzIGNvZGUgaGFzIGEgY2hhbmNlIG9mIGdldHRpbmcgc29tZXRoaW5nIGFjY29tcGxpc2hlZCB3aXRob3V0Ci0gICB3YXN0aW5nIHRvbyBtdWNoIHRpbWUuCi0qLwotCi0jaWZkZWYgY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotc3RhdGljIGJvb2xlYW4gKCpwZV9zYXZlZF9jb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKQotICAgICBQQVJBTVMgKChiZmQgKiwgUFRSKSkKLSAgICAgPSBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhOwotI3VuZGVmIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNlbHNlCi1zdGF0aWMgYm9vbGVhbiAoKnBlX3NhdmVkX2NvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBQVFIpKQotICAgICA9IE5VTEw7Ci0jZW5kaWYKLSNkZWZpbmUgY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgY29mZl9ta29iamVjdCAgICAgIHBlX21rb2JqZWN0Ci0jZGVmaW5lIGNvZmZfbWtvYmplY3RfaG9vayBwZV9ta29iamVjdF9ob29rCi0KLSNpZm5kZWYgR0VUX0ZDTl9MTk5PUFRSCi0jZGVmaW5lIEdFVF9GQ05fTE5OT1BUUihhYmZkLCBleHQpIFwKLSAgICAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNlbmRpZgotCi0jaWZuZGVmIEdFVF9GQ05fRU5ETkRYCi0jZGVmaW5lIEdFVF9GQ05fRU5ETkRYKGFiZmQsIGV4dCkgIFwKLQliZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZW5kaWYKLQotI2lmbmRlZiBQVVRfRkNOX0xOTk9QVFIKLSNkZWZpbmUgUFVUX0ZDTl9MTk5PUFRSKGFiZmQsIGluLCBleHQpICBiZmRfaF9wdXRfMzIoYWJmZCwgIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0ZDTl9FTkRORFgKLSNkZWZpbmUgUFVUX0ZDTl9FTkRORFgoYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCkKLSNlbmRpZgotI2lmbmRlZiBHRVRfTE5TWl9MTk5PCi0jZGVmaW5lIEdFVF9MTlNaX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0xOU1pfU0laRQotI2RlZmluZSBHRVRfTE5TWl9TSVpFKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9MTlNaX0xOTk8KLSNkZWZpbmUgUFVUX0xOU1pfTE5OTyhhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKWV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0xOU1pfU0laRQotI2RlZmluZSBQVVRfTE5TWl9TSVpFKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLCBpbiwgKGJmZF9ieXRlKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOX1NDTkxFTgotI2RlZmluZSBHRVRfU0NOX1NDTkxFTihhYmZkLCAgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9zY25sZW4pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTl9OUkVMT0MKLSNkZWZpbmUgR0VUX1NDTl9OUkVMT0MoYWJmZCwgIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ucmVsb2MpCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTl9OTElOTk8KLSNkZWZpbmUgR0VUX1NDTl9OTElOTk8oYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ubGlubm8pCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTl9TQ05MRU4KLSNkZWZpbmUgUFVUX1NDTl9TQ05MRU4oYWJmZCxpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfc2NubGVuKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05fTlJFTE9DCi0jZGVmaW5lIFBVVF9TQ05fTlJFTE9DKGFiZmQsaW4sIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsIGluLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbnJlbG9jKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05fTkxJTk5PCi0jZGVmaW5lIFBVVF9TQ05fTkxJTk5PKGFiZmQsaW4sIGV4dCkgIGJmZF9oX3B1dF8xNihhYmZkLGluLCAoYmZkX2J5dGUgICopIGV4dC0+eF9zY24ueF9ubGlubm8pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0xJTkVOT19MTk5PCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZW5kaWYKLSNpZm5kZWYgUFVUX0xJTkVOT19MTk5PCi0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZW5kaWYKLQotLyogVGhlIGZfc3ltcHRyIGZpZWxkIGluIHRoZSBmaWxlaGRyIGlzIHNvbWV0aW1lcyA2NCBiaXRzLiAgKi8KLSNpZm5kZWYgR0VUX0ZJTEVIRFJfU1lNUFRSCi0jZGVmaW5lIEdFVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfRklMRUhEUl9TWU1QVFIKLSNkZWZpbmUgUFVUX0ZJTEVIRFJfU1lNUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLS8qIFNvbWUgZmllbGRzIGluIHRoZSBhb3V0aGRyIGFyZSBzb21ldGltZXMgNjQgYml0cy4gICovCi0jaWZuZGVmIEdFVF9BT1VUSERSX1RTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX1RTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX1RTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX1RTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0RTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX0RTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0RTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX0RTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0JTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX0JTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0JTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX0JTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0VOVFJZCi0jZGVmaW5lIEdFVF9BT1VUSERSX0VOVFJZIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0VOVFJZCi0jZGVmaW5lIFBVVF9BT1VUSERSX0VOVFJZIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfVEVYVF9TVEFSVCBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9URVhUX1NUQVJUCi0jZGVmaW5lIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfREFUQV9TVEFSVAotI2RlZmluZSBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCBiZmRfaF9wdXRfMzIKLSNlbmRpZgotCi0vKiBTb21lIGZpZWxkcyBpbiB0aGUgc2NuaGRyIGFyZSBzb21ldGltZXMgNjQgYml0cy4gICovCi0jaWZuZGVmIEdFVF9TQ05IRFJfUEFERFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9QQUREUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1BBRERSCi0jZGVmaW5lIFBVVF9TQ05IRFJfUEFERFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9WQUREUgotI2RlZmluZSBHRVRfU0NOSERSX1ZBRERSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfVkFERFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9WQUREUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX1NJWkUKLSNkZWZpbmUgR0VUX1NDTkhEUl9TSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfU0laRQotI2RlZmluZSBQVVRfU0NOSERSX1NJWkUgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9TQ05QVFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9TQ05QVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9TQ05QVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9TQ05QVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9SRUxQVFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9SRUxQVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9SRUxQVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9SRUxQVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9MTk5PUFRSCi0jZGVmaW5lIEdFVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX0xOTk9QVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9MTk5PUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9maWxlaGRyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfc3ltX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfc3ltX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9hdXhfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgaW50LCBpbnQsIGludCwgaW50LCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX2F1eF9vdXQKLSAgUEFSQU1TICgoYmZkICosIFBUUiwgaW50LCBpbnQsIGludCwgaW50LCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9saW5lbm9faW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9saW5lbm9fb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHZvaWQgY29mZl9zd2FwX2FvdXRoZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBhZGRfZGF0YV9lbnRyeQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKiwgaW50LCBjaGFyICosIGJmZF92bWEpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX2FvdXRoZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHZvaWQgY29mZl9zd2FwX3Njbmhkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3Njbmhkcl9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9pZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9lZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9wZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9yZWxvYyBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHBlX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgUFRSIHBlX21rb2JqZWN0X2hvb2sgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHNyYzsKLSAgICAgUFRSIGRzdDsKLXsKLSAgUkVMT0MgKnJlbG9jX3NyYyA9IChSRUxPQyAqKSBzcmM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NfZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBkc3Q7Ci0KLSAgcmVsb2NfZHN0LT5yX3ZhZGRyID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKXJlbG9jX3NyYy0+cl92YWRkcik7Ci0gIHJlbG9jX2RzdC0+cl9zeW1uZHggPSBiZmRfaF9nZXRfc2lnbmVkXzMyKGFiZmQsIChiZmRfYnl0ZSAqKSByZWxvY19zcmMtPnJfc3ltbmR4KTsKLQotICByZWxvY19kc3QtPnJfdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX3R5cGUpOwotCi0jaWZkZWYgU1dBUF9JTl9SRUxPQ19PRkZTRVQKLSAgcmVsb2NfZHN0LT5yX29mZnNldCA9IFNXQVBfSU5fUkVMT0NfT0ZGU0VUKGFiZmQsCi0JCQkJCSAgICAgKGJmZF9ieXRlICopIHJlbG9jX3NyYy0+cl9vZmZzZXQpOwotI2VuZGlmCi19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCXNyYzsKLSAgICAgUFRSCWRzdDsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY19zcmMgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopc3JjOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKnJlbG9jX2RzdCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKilkc3Q7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCByZWxvY19zcmMtPnJfdmFkZHIsIChiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfdmFkZHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgcmVsb2Nfc3JjLT5yX3N5bW5keCwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl9zeW1uZHgpOwotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCByZWxvY19zcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopCi0JICAgICAgIHJlbG9jX2RzdC0+cl90eXBlKTsKLQotI2lmZGVmIFNXQVBfT1VUX1JFTE9DX09GRlNFVAotICBTV0FQX09VVF9SRUxPQ19PRkZTRVQoYWJmZCwKLQkJCXJlbG9jX3NyYy0+cl9vZmZzZXQsCi0JCQkoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX29mZnNldCk7Ci0jZW5kaWYKLSNpZmRlZiBTV0FQX09VVF9SRUxPQ19FWFRSQQotICBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLHJlbG9jX3NyYywgcmVsb2NfZHN0KTsKLSNlbmRpZgotICByZXR1cm4gUkVMU1o7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9maWxlaGRyX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUgkgICAgIHNyYzsKLSAgICAgUFRSCSAgICAgZHN0OwotewotICBGSUxIRFIgKmZpbGVoZHJfc3JjID0gKEZJTEhEUiAqKSBzcmM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2RzdCA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBkc3Q7Ci0gIGZpbGVoZHJfZHN0LT5mX21hZ2ljID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX3NyYy0+Zl9tYWdpYyk7Ci0gIGZpbGVoZHJfZHN0LT5mX25zY25zID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9uc2Nucyk7Ci0gIGZpbGVoZHJfZHN0LT5mX3RpbWRhdCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfdGltZGF0KTsKLQotICBmaWxlaGRyX2RzdC0+Zl9uc3ltcyA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfbnN5bXMpOwotICBmaWxlaGRyX2RzdC0+Zl9mbGFncyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfZmxhZ3MpOwotICBmaWxlaGRyX2RzdC0+Zl9zeW1wdHIgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX3NyYy0+Zl9zeW1wdHIpOwotCi0gIC8qIE90aGVyIHBlb3BsZSdzIHRvb2xzIHNvbWV0aW1lcyBnZW5lcmF0ZSBoZWFkZXJzIHdpdGggYW4gbnN5bXMgYnV0Ci0gICAgIGEgemVybyBzeW1wdHIuICAqLwotICBpZiAoZmlsZWhkcl9kc3QtPmZfbnN5bXMgIT0gMCAmJiBmaWxlaGRyX2RzdC0+Zl9zeW1wdHIgPT0gMCkKLSAgICB7Ci0gICAgICBmaWxlaGRyX2RzdC0+Zl9uc3ltcyA9IDA7Ci0gICAgICBmaWxlaGRyX2RzdC0+Zl9mbGFncyB8PSBGX0xTWU1TOwotICAgIH0KLQotICBmaWxlaGRyX2RzdC0+Zl9vcHRoZHIgPSBiZmRfaF9nZXRfMTYoYWJmZCwgCi0JCQkJICAgICAgIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9vcHRoZHIpOwotfQotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0KLXN0YXRpYyAgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBpbnQgaWR4OwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKWluOwotICBGSUxIRFIgKmZpbGVoZHJfb3V0ID0gKEZJTEhEUiAqKW91dDsKLQotICBpZiAocGVfZGF0YSAoYWJmZCktPmhhc19yZWxvY19zZWN0aW9uKQotICAgIGZpbGVoZHJfaW4tPmZfZmxhZ3MgJj0gfkZfUkVMRkxHOwotCi0gIGlmIChwZV9kYXRhIChhYmZkKS0+ZGxsKQotICAgIGZpbGVoZHJfaW4tPmZfZmxhZ3MgfD0gRl9ETEw7Ci0KLSAgZmlsZWhkcl9pbi0+cGUuZV9tYWdpYyAgICA9IERPU01BR0lDOwotICBmaWxlaGRyX2luLT5wZS5lX2NibHAgICAgID0gMHg5MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9jcCAgICAgICA9IDB4MzsKLSAgZmlsZWhkcl9pbi0+cGUuZV9jcmxjICAgICA9IDB4MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9jcGFyaGRyICA9IDB4NDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9taW5hbGxvYyA9IDB4MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9tYXhhbGxvYyA9IDB4ZmZmZjsKLSAgZmlsZWhkcl9pbi0+cGUuZV9zcyAgICAgICA9IDB4MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9zcCAgICAgICA9IDB4Yjg7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfY3N1bSAgICAgPSAweDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfaXAgICAgICAgPSAweDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfY3MgICAgICAgPSAweDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfbGZhcmxjICAgPSAweDQwOwotICBmaWxlaGRyX2luLT5wZS5lX292bm8gICAgID0gMHgwOwotCi0gIGZvciAoaWR4PTA7IGlkeCA8IDQ7IGlkeCsrKQotICAgIGZpbGVoZHJfaW4tPnBlLmVfcmVzW2lkeF0gPSAweDA7Ci0KLSAgZmlsZWhkcl9pbi0+cGUuZV9vZW1pZCAgID0gMHgwOwotICBmaWxlaGRyX2luLT5wZS5lX29lbWluZm8gPSAweDA7Ci0KLSAgZm9yIChpZHg9MDsgaWR4IDwgMTA7IGlkeCsrKQotICAgIGZpbGVoZHJfaW4tPnBlLmVfcmVzMltpZHhdID0gMHgwOwotCi0gIGZpbGVoZHJfaW4tPnBlLmVfbGZhbmV3ID0gMHg4MDsKLQotICAvKiB0aGlzIG5leHQgY29sbGVjdGlvbiBvZiBkYXRhIGFyZSBtb3N0bHkganVzdCBjaGFyYWN0ZXJzLiAgSXQgYXBwZWFycwotICAgICB0byBiZSBjb25zdGFudCB3aXRoaW4gdGhlIGhlYWRlcnMgcHV0IG9uIE5UIGV4ZXMgKi8KLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMF0gID0gMHgwZWJhMWYwZTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMV0gID0gMHhjZDA5YjQwMDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMl0gID0gMHg0YzAxYjgyMTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbM10gID0gMHg2ODU0MjFjZDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbNF0gID0gMHg3MDIwNzM2OTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbNV0gID0gMHg3MjY3NmY3MjsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbNl0gID0gMHg2MzIwNmQ2MTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbN10gID0gMHg2ZjZlNmU2MTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbOF0gID0gMHg2NTYyMjA3NDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbOV0gID0gMHg2ZTc1NzIyMDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTBdID0gMHgyMDZlNjkyMDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTFdID0gMHgyMDUzNGY0NDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTJdID0gMHg2NTY0NmY2ZDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTNdID0gMHgwYTBkMGQyZTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTRdID0gMHgyNDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTVdID0gMHgwOwotICBmaWxlaGRyX2luLT5wZS5udF9zaWduYXR1cmUgPSBOVF9TSUdOQVRVUkU7Ci0KLQotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX21hZ2ljLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbWFnaWMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc2NucywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zY25zKTsKLQotICBiZmRfaF9wdXRfMzIoYWJmZCwgdGltZSAoMCksIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl90aW1kYXQpOwotICBQVVRfRklMRUhEUl9TWU1QVFIgKGFiZmQsIChiZmRfdm1hKSBmaWxlaGRyX2luLT5mX3N5bXB0ciwKLQkJICAgICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX3N5bXB0cik7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBmaWxlaGRyX2luLT5mX25zeW1zLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbnN5bXMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9vcHRoZHIsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9vcHRoZHIpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9mbGFncywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX2ZsYWdzKTsKLQotICAvKiBwdXQgaW4gZXh0cmEgZG9zIGhlYWRlciBzdHVmZi4gIFRoaXMgZGF0YSByZW1haW5zIGVzc2VudGlhbGx5Ci0gICAgIGNvbnN0YW50LCBpdCBqdXN0IGhhcyB0byBiZSB0YWNrZWQgb24gdG8gdGhlIGJlZ2lubmluZyBvZiBhbGwgZXhlcyAKLSAgICAgZm9yIE5UICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX21hZ2ljLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfbWFnaWMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jYmxwLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY2JscCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NwLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3ApOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jcmxjLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3JsYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NwYXJoZHIsIAotCSAgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3Bhcmhkcik7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX21pbmFsbG9jLCAKLQkgICAgICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX21pbmFsbG9jKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfbWF4YWxsb2MsIAotCSAgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfbWF4YWxsb2MpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9zcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX3NzKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfc3AsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9zcCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NzdW0sIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9jc3VtKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfaXAsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9pcCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NzLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3MpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9sZmFybGMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9sZmFybGMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9vdm5vLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfb3Zubyk7Ci0gIHsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeCA8IDQ7IGlkeCsrKQotICAgICAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfcmVzW2lkeF0sIAotCQkgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfcmVzW2lkeF0pOwotICB9Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX29lbWlkLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfb2VtaWQpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9vZW1pbmZvLAotCSAgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfb2VtaW5mbyk7Ci0gIHsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeCA8IDEwOyBpZHgrKykKLSAgICAgIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX3JlczJbaWR4XSwKLQkJICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX3JlczJbaWR4XSk7Ci0gIH0KLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfbGZhbmV3LCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfbGZhbmV3KTsKLQotICB7Ci0gICAgaW50IGlkeDsKLSAgICBmb3IgKGlkeD0wOyBpZHggPCAxNjsgaWR4KyspCi0gICAgICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbaWR4XSwKLQkJICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5kb3NfbWVzc2FnZVtpZHhdKTsKLSAgfQotCi0gIC8qIGFsc28gcHV0IGluIHRoZSBOVCBzaWduYXR1cmUgKi8KLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPnBlLm50X3NpZ25hdHVyZSwgCi0JICAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+bnRfc2lnbmF0dXJlKTsKLQotCi0KLQotICByZXR1cm4gRklMSFNaOwotfQotI2Vsc2UKLQotc3RhdGljICB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW47Ci0gICAgIFBUUglvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2luID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopaW47Ci0gIEZJTEhEUiAqZmlsZWhkcl9vdXQgPSAoRklMSERSICopb3V0OwotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX21hZ2ljLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbWFnaWMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc2NucywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zY25zKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPmZfdGltZGF0LCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfdGltZGF0KTsKLSAgUFVUX0ZJTEVIRFJfU1lNUFRSIChhYmZkLCAoYmZkX3ZtYSkgZmlsZWhkcl9pbi0+Zl9zeW1wdHIsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9zeW1wdHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc3ltcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zeW1zKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfb3B0aGRyLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfb3B0aGRyKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfZmxhZ3MsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9mbGFncyk7Ci0KLSAgcmV0dXJuIEZJTEhTWjsKLX0KLQotI2VuZGlmCi0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9zeW1faW4gKGFiZmQsIGV4dDEsIGluMSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUiBleHQxOwotICAgICBQVFIgaW4xOwotewotICBTWU1FTlQgKmV4dCA9IChTWU1FTlQgKilleHQxOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICAgICAgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbjE7Ci0KLSAgaWYoIGV4dC0+ZS5lX25hbWVbMF0gPT0gMCkgewotICAgIGluLT5fbi5fbl9uLl9uX3plcm9lcyA9IDA7Ci0gICAgaW4tPl9uLl9uX24uX25fb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmUuZS5lX29mZnNldCk7Ci0gIH0KLSAgZWxzZSB7Ci0jaWYgU1lNTk1MRU4gIT0gRV9TWU1OTUxFTgotICAgIC0+IEVycm9yLCB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBTWU1OTUxFTiE7Ci0jZWxzZQotICAgIG1lbWNweShpbi0+X24uX25fbmFtZSwgZXh0LT5lLmVfbmFtZSwgU1lNTk1MRU4pOwotI2VuZGlmCi0gIH0KLQotICBpbi0+bl92YWx1ZSA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3ZhbHVlKTsgCi0gIGluLT5uX3NjbnVtID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfc2NudW0pOwotICBpZiAoc2l6ZW9mKGV4dC0+ZV90eXBlKSA9PSAyKXsKLSAgICBpbi0+bl90eXBlID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaW4tPm5fdHlwZSA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICB9Ci0gIGluLT5uX3NjbGFzcyA9IGJmZF9oX2dldF84KGFiZmQsIGV4dC0+ZV9zY2xhc3MpOwotICBpbi0+bl9udW1hdXggPSBiZmRfaF9nZXRfOChhYmZkLCBleHQtPmVfbnVtYXV4KTsKLQotICAvKiBUaGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgLmlkYXRhJCBzZWN0aW9ucyBoYXZlIGNsYXNzIDB4NjgKLSAgICAgKENfU0VDVElPTiksIHdoaWNoIE1TIGRvY3VtZW50YXRpb24gaW5kaWNhdGVzIGlzIGEgc2VjdGlvbgotICAgICBzeW1ib2wuICBVbmZvcnR1bmF0ZWx5LCB0aGUgdmFsdWUgZmllbGQgaW4gdGhlIHN5bWJvbCBpcyBzaW1wbHkgYQotICAgICBjb3B5IG9mIHRoZSAuaWRhdGEgc2VjdGlvbidzIGZsYWdzIHJhdGhlciB0aGFuIHNvbWV0aGluZyB1c2VmdWwuCi0gICAgIFdoZW4gdGhlc2Ugc3ltYm9scyBhcmUgZW5jb3VudGVyZWQsIGNoYW5nZSB0aGUgdmFsdWUgdG8gMCBzbyB0aGF0Ci0gICAgIHRoZXkgd2lsbCBiZSBoYW5kbGVkIHNvbWV3aGF0IGNvcnJlY3RseSBpbiB0aGUgYmZkIGNvZGUuICAqLwotICBpZiAoaW4tPm5fc2NsYXNzID09IENfU0VDVElPTikKLSAgICB7Ci0gICAgICBpbi0+bl92YWx1ZSA9IDB4MDsKLQotI2lmIDAKLSAgICAgIC8qIEZJWE1FOiBUaGlzIGlzIGNsZWFybHkgd3JvbmcuICBUaGUgcHJvYmxlbSBzZWVtcyB0byBiZSB0aGF0Ci0gICAgICAgICB1bmRlZmluZWQgQ19TRUNUSU9OIHN5bWJvbHMgYXBwZWFyIGluIHRoZSBmaXJzdCBvYmplY3Qgb2YgYQotICAgICAgICAgTVMgZ2VuZXJhdGVkIC5saWIgZmlsZSwgYW5kIHRoZSBzeW1ib2xzIGFyZSBub3QgZGVmaW5lZAotICAgICAgICAgYW55d2hlcmUuICAqLwotICAgICAgaW4tPm5fc2NudW0gPSAxOwotCi0gICAgICAvKiBJIGhhdmUgdHJpZWQgc2V0dGluZyB0aGUgY2xhc3MgdG8gMyBhbmQgdXNpbmcgdGhlIGZvbGxvd2luZwotCSB0byBzZXQgdGhlIHNlY3Rpb24gbnVtYmVyLiAgVGhpcyB3aWxsIHB1dCB0aGUgYWRkcmVzcyBvZiB0aGUKLQkgcG9pbnRlciB0byB0aGUgc3RyaW5nIGtlcm5lbDMyLmRsbCBhdCBhZGRyZXNzZXMgMCBhbmQgMHgxMAotCSBvZmYgc3RhcnQgb2YgaWRhdGEgc2VjdGlvbiB3aGljaCBpcyBub3QgY29ycmVjdCAqLwotICAgICAgLyogICAgaWYgKHN0cmNtcCAoaW4tPl9uLl9uX25hbWUsICIuaWRhdGEkNCIpID09IDApICovCi0gICAgICAvKiAgICAgIGluLT5uX3NjbnVtID0gMzsgKi8KLSAgICAgIC8qICAgIGVsc2UgKi8KLSAgICAgIC8qICAgICAgaW4tPm5fc2NudW0gPSAyOyAqLwotI2Vsc2UKLSAgICAgIC8qIENyZWF0ZSBzeW50aGV0aWMgZW1wdHkgc2VjdGlvbnMgYXMgbmVlZGVkLiAgREogKi8KLSAgICAgIGlmIChpbi0+bl9zY251bSA9PSAwKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0JICBmb3IgKHNlYz1hYmZkLT5zZWN0aW9uczsgc2VjOyBzZWM9c2VjLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAoc2VjLT5uYW1lLCBpbi0+bl9uYW1lKSA9PSAwKQotCQl7Ci0JCSAgaW4tPm5fc2NudW0gPSBzZWMtPnRhcmdldF9pbmRleDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgaWYgKGluLT5uX3NjbnVtID09IDApCi0JewotCSAgaW50IHVudXNlZF9zZWN0aW9uX251bWJlciA9IDA7Ci0JICBhc2VjdGlvbiAqc2VjOwotCSAgY2hhciAqbmFtZTsKLQkgIGZvciAoc2VjPWFiZmQtPnNlY3Rpb25zOyBzZWM7IHNlYz1zZWMtPm5leHQpCi0JICAgIGlmICh1bnVzZWRfc2VjdGlvbl9udW1iZXIgPD0gc2VjLT50YXJnZXRfaW5kZXgpCi0JICAgICAgdW51c2VkX3NlY3Rpb25fbnVtYmVyID0gc2VjLT50YXJnZXRfaW5kZXgrMTsKLQotCSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChpbi0+bl9uYW1lKSArIDEwKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybjsKLQkgIHN0cmNweSAobmFtZSwgaW4tPm5fbmFtZSk7Ci0JICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0KLQkgIHNlYy0+dm1hID0gMDsKLQkgIHNlYy0+bG1hID0gMDsKLQkgIHNlYy0+X2Nvb2tlZF9zaXplID0gMDsKLQkgIHNlYy0+X3Jhd19zaXplID0gMDsKLQkgIHNlYy0+ZmlsZXBvcyA9IDA7Ci0JICBzZWMtPnJlbF9maWxlcG9zID0gMDsKLQkgIHNlYy0+cmVsb2NfY291bnQgPSAwOwotCSAgc2VjLT5saW5lX2ZpbGVwb3MgPSAwOwotCSAgc2VjLT5saW5lbm9fY291bnQgPSAwOwotCSAgc2VjLT51c2VyZGF0YSA9IE5VTEw7Ci0JICBzZWMtPm5leHQgPSAoYXNlY3Rpb24gKikgTlVMTDsKLQkgIHNlYy0+ZmxhZ3MgPSAwOwotCSAgc2VjLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCSAgc2VjLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfREFUQSB8IFNFQ19MT0FEOwotCi0JICBzZWMtPnRhcmdldF9pbmRleCA9IHVudXNlZF9zZWN0aW9uX251bWJlcjsKLQotCSAgaW4tPm5fc2NudW0gPSB1bnVzZWRfc2VjdGlvbl9udW1iZXI7Ci0JfQotICAgICAgaW4tPm5fc2NsYXNzID0gQ19TVEFUOwotI2VuZGlmCi0gICAgfQotCi0jaWZkZWYgY29mZl9zd2FwX3N5bV9pbl9ob29rCi0gIGNvZmZfc3dhcF9zeW1faW5faG9vayhhYmZkLCBleHQxLCBpbjEpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCBpbnAsIGV4dHApCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWlucDsKLSAgICAgUFRSCWV4dHA7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbnA7Ci0gIFNZTUVOVCAqZXh0ID0oU1lNRU5UICopZXh0cDsKLSAgaWYoaW4tPl9uLl9uX25hbWVbMF0gPT0gMCkgewotICAgIGJmZF9oX3B1dF8zMihhYmZkLCAwLCAoYmZkX2J5dGUgKikgZXh0LT5lLmUuZV96ZXJvZXMpOwotICAgIGJmZF9oX3B1dF8zMihhYmZkLCBpbi0+X24uX25fbi5fbl9vZmZzZXQsIChiZmRfYnl0ZSAqKSAgZXh0LT5lLmUuZV9vZmZzZXQpOwotICB9Ci0gIGVsc2UgewotI2lmIFNZTU5NTEVOICE9IEVfU1lNTk1MRU4KLSAgICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgU1lNTk1MRU4hOwotI2Vsc2UKLSAgICBtZW1jcHkoZXh0LT5lLmVfbmFtZSwgaW4tPl9uLl9uX25hbWUsIFNZTU5NTEVOKTsKLSNlbmRpZgotICB9Ci0KLSAgYmZkX2hfcHV0XzMyKGFiZmQsICBpbi0+bl92YWx1ZSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfdmFsdWUpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgIGluLT5uX3NjbnVtICwgKGJmZF9ieXRlICopIGV4dC0+ZV9zY251bSk7Ci0gIGlmIChzaXplb2YoZXh0LT5lX3R5cGUpID09IDIpCi0gICAgewotICAgICAgYmZkX2hfcHV0XzE2KGFiZmQsICBpbi0+bl90eXBlICwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfaF9wdXRfMzIoYWJmZCwgIGluLT5uX3R5cGUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICAgIH0KLSAgYmZkX2hfcHV0XzgoYWJmZCwgIGluLT5uX3NjbGFzcyAsIGV4dC0+ZV9zY2xhc3MpOwotICBiZmRfaF9wdXRfOChhYmZkLCAgaW4tPm5fbnVtYXV4ICwgZXh0LT5lX251bWF1eCk7Ci0KLSAgcmV0dXJuIFNZTUVTWjsKLX0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9hdXhfaW4gKGFiZmQsIGV4dDEsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGluMSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUiAJICAgICAgZXh0MTsKLSAgICAgaW50ICAgICAgICAgICAgIHR5cGU7Ci0gICAgIGludCAgICAgICAgICAgICBjbGFzczsKLSAgICAgaW50CSAgICAgIGluZHg7Ci0gICAgIGludAkgICAgICBudW1hdXg7Ci0gICAgIFBUUiAJICAgICAgaW4xOwotewotICBBVVhFTlQgICAgKmV4dCA9IChBVVhFTlQgKilleHQxOwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKWluMTsKLQotICBzd2l0Y2ggKGNsYXNzKSB7Ci0gIGNhc2UgQ19GSUxFOgotICAgIGlmIChleHQtPnhfZmlsZS54X2ZuYW1lWzBdID09IDApIHsKLSAgICAgIGluLT54X2ZpbGUueF9uLnhfemVyb2VzID0gMDsKLSAgICAgIGluLT54X2ZpbGUueF9uLnhfb2Zmc2V0ID0gCi0JYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF9vZmZzZXQpOwotICAgIH0gZWxzZSB7Ci0jaWYgRklMTk1MRU4gIT0gRV9GSUxOTUxFTgotICAgICAgLT4gRXJyb3IsIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIEZJTE5NTEVOITsKLSNlbHNlCi0gICAgICBtZW1jcHkgKGluLT54X2ZpbGUueF9mbmFtZSwgZXh0LT54X2ZpbGUueF9mbmFtZSwgRklMTk1MRU4pOwotI2VuZGlmCi0gICAgfQotICAgIHJldHVybjsKLQotCi0gIGNhc2UgQ19TVEFUOgotI2lmZGVmIENfTEVBRlNUQVQKLSAgY2FzZSBDX0xFQUZTVEFUOgotI2VuZGlmCi0gIGNhc2UgQ19ISURERU46Ci0gICAgaWYgKHR5cGUgPT0gVF9OVUxMKSB7Ci0gICAgICBpbi0+eF9zY24ueF9zY25sZW4gPSBHRVRfU0NOX1NDTkxFTihhYmZkLCBleHQpOwotICAgICAgaW4tPnhfc2NuLnhfbnJlbG9jID0gR0VUX1NDTl9OUkVMT0MoYWJmZCwgZXh0KTsKLSAgICAgIGluLT54X3Njbi54X25saW5ubyA9IEdFVF9TQ05fTkxJTk5PKGFiZmQsIGV4dCk7Ci0gICAgICBpbi0+eF9zY24ueF9jaGVja3N1bSA9IGJmZF9oX2dldF8zMiAoYWJmZCwKLQkJCQkJICAgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9jaGVja3N1bSk7Ci0gICAgICBpbi0+eF9zY24ueF9hc3NvY2lhdGVkID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfYXNzb2NpYXRlZCk7Ci0gICAgICBpbi0+eF9zY24ueF9jb21kYXQgPSBiZmRfaF9nZXRfOCAoYWJmZCwKLQkJCQkJKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9jb21kYXQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGluLT54X3N5bS54X3RhZ25keC5sID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdGFnbmR4KTsKLSNpZm5kZWYgTk9fVFZORFgKLSAgaW4tPnhfc3ltLnhfdHZuZHggPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90dm5keCk7Ci0jZW5kaWYKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0gR0VUX0ZDTl9MTk5PUFRSIChhYmZkLCBleHQpOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPSBHRVRfRkNOX0VORE5EWCAoYWJmZCwgZXh0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWYgRElNTlVNICE9IEVfRElNTlVNCi0gI2Vycm9yIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIERJTU5VTQotI2VuZGlmCi0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdKTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0pOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSk7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdKTsKLSAgICB9Ci0KLSAgaWYgKElTRkNOKHR5cGUpKSB7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2ZzaXplID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2ZzaXplKTsKLSAgfQotICBlbHNlIHsKLSAgICBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8gPSBHRVRfTE5TWl9MTk5PKGFiZmQsIGV4dCk7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplID0gR0VUX0xOU1pfU0laRShhYmZkLCBleHQpOwotICB9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9hdXhfb3V0IChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApCi0gICAgIGJmZCAgICphYmZkOwotICAgICBQVFIgCWlucDsKLSAgICAgaW50ICAgdHlwZTsKLSAgICAgaW50ICAgY2xhc3M7Ci0gICAgIGludCAgIGluZHg7Ci0gICAgIGludCAgIG51bWF1eDsKLSAgICAgUFRSCWV4dHA7Ci17Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopaW5wOwotICBBVVhFTlQgKmV4dCA9IChBVVhFTlQgKilleHRwOwotCi0gIG1lbXNldCgoUFRSKWV4dCwgMCwgQVVYRVNaKTsKLSAgc3dpdGNoIChjbGFzcykgewotICBjYXNlIENfRklMRToKLSAgICBpZiAoaW4tPnhfZmlsZS54X2ZuYW1lWzBdID09IDApIHsKLSAgICAgIGJmZF9oX3B1dF8zMihhYmZkLCAwLCAoYmZkX2J5dGUgKikgZXh0LT54X2ZpbGUueF9uLnhfemVyb2VzKTsKLSAgICAgIGJmZF9oX3B1dF8zMihhYmZkLAotCSAgICAgIGluLT54X2ZpbGUueF9uLnhfb2Zmc2V0LAotCSAgICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF9vZmZzZXQpOwotICAgIH0KLSAgICBlbHNlIHsKLSNpZiBGSUxOTUxFTiAhPSBFX0ZJTE5NTEVOCi0gICAgICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgRklMTk1MRU4hOwotI2Vsc2UKLSAgICAgIG1lbWNweSAoZXh0LT54X2ZpbGUueF9mbmFtZSwgaW4tPnhfZmlsZS54X2ZuYW1lLCBGSUxOTUxFTik7Ci0jZW5kaWYKLSAgICB9Ci0gICAgcmV0dXJuIEFVWEVTWjsKLQotCi0gIGNhc2UgQ19TVEFUOgotI2lmZGVmIENfTEVBRlNUQVQKLSAgY2FzZSBDX0xFQUZTVEFUOgotI2VuZGlmCi0gIGNhc2UgQ19ISURERU46Ci0gICAgaWYgKHR5cGUgPT0gVF9OVUxMKSB7Ci0gICAgICBQVVRfU0NOX1NDTkxFTihhYmZkLCBpbi0+eF9zY24ueF9zY25sZW4sIGV4dCk7Ci0gICAgICBQVVRfU0NOX05SRUxPQyhhYmZkLCBpbi0+eF9zY24ueF9ucmVsb2MsIGV4dCk7Ci0gICAgICBQVVRfU0NOX05MSU5OTyhhYmZkLCBpbi0+eF9zY24ueF9ubGlubm8sIGV4dCk7Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT54X3Njbi54X2NoZWNrc3VtLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9jaGVja3N1bSk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3Njbi54X2Fzc29jaWF0ZWQsCi0JCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X2Fzc29jaWF0ZWQpOwotICAgICAgYmZkX2hfcHV0XzggKGFiZmQsIGluLT54X3Njbi54X2NvbWRhdCwKLQkJICAgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9jb21kYXQpOwotICAgICAgcmV0dXJuIEFVWEVTWjsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBiZmRfaF9wdXRfMzIoYWJmZCwgaW4tPnhfc3ltLnhfdGFnbmR4LmwsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdGFnbmR4KTsKLSNpZm5kZWYgTk9fVFZORFgKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGluLT54X3N5bS54X3R2bmR4ICwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90dm5keCk7Ci0jZW5kaWYKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBQVVRfRkNOX0xOTk9QVFIoYWJmZCwgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsIGV4dCk7Ci0gICAgICBQVVRfRkNOX0VORE5EWChhYmZkLCAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwsIGV4dCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmIERJTU5VTSAhPSBFX0RJTU5VTQotICNlcnJvciB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBESU1OVU0KLSNlbmRpZgotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10pOwotICAgIH0KLQotICBpZiAoSVNGQ04gKHR5cGUpKQotICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPnhfc3ltLnhfbWlzYy54X2ZzaXplLAotCSAgICAgKGJmZF9ieXRlICopICBleHQtPnhfc3ltLnhfbWlzYy54X2ZzaXplKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIFBVVF9MTlNaX0xOTk8gKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubywgZXh0KTsKLSAgICAgIFBVVF9MTlNaX1NJWkUgKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSwgZXh0KTsKLSAgICB9Ci0KLSAgcmV0dXJuIEFVWEVTWjsKLX0KLQotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX2xpbmVub19pbiAoYWJmZCwgZXh0MSwgaW4xKQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSIGV4dDE7Ci0gICAgIFBUUiBpbjE7Ci17Ci0gIExJTkVOTyAqZXh0ID0gKExJTkVOTyAqKWV4dDE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gICAgICAqaW4gPSAoc3RydWN0IGludGVybmFsX2xpbmVubyAqKWluMTsKLQotICBpbi0+bF9hZGRyLmxfc3ltbmR4ID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmxfYWRkci5sX3N5bW5keCk7Ci0gIGluLT5sX2xubm8gPSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX2xpbmVub19vdXQgKGFiZmQsIGlucCwgb3V0cCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW5wOwotICAgICBQVFIJb3V0cDsKLXsKLSAgc3RydWN0IGludGVybmFsX2xpbmVubyAqaW4gPSAoc3RydWN0IGludGVybmFsX2xpbmVubyAqKWlucDsKLSAgc3RydWN0IGV4dGVybmFsX2xpbmVubyAqZXh0ID0gKHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKilvdXRwOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgaW4tPmxfYWRkci5sX3N5bW5keCwgKGJmZF9ieXRlICopCi0JICBleHQtPmxfYWRkci5sX3N5bW5keCk7Ci0KLSAgUFVUX0xJTkVOT19MTk5PIChhYmZkLCBpbi0+bF9sbm5vLCBleHQpOwotICByZXR1cm4gTElORVNaOwotfQotCi0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9hb3V0aGRyX2luIChhYmZkLCBhb3V0aGRyX2V4dDEsIGFvdXRoZHJfaW50MSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUiBhb3V0aGRyX2V4dDE7Ci0gICAgIFBUUiBhb3V0aGRyX2ludDE7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyICphOwotICBQRUFPVVRIRFIgKnNyYyA9IChQRUFPVVRIRFIgKikoYW91dGhkcl9leHQxKTsKLSAgQU9VVEhEUiAgICAgICAgKmFvdXRoZHJfZXh0ID0gKEFPVVRIRFIgKikgYW91dGhkcl9leHQxOwotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqYW91dGhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKilhb3V0aGRyX2ludDE7Ci0KLSAgYW91dGhkcl9pbnQtPm1hZ2ljID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+bWFnaWMpOwotICBhb3V0aGRyX2ludC0+dnN0YW1wID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dnN0YW1wKTsKLSAgYW91dGhkcl9pbnQtPnRzaXplID0KLSAgICBHRVRfQU9VVEhEUl9UU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT50c2l6ZSk7Ci0gIGFvdXRoZHJfaW50LT5kc2l6ZSA9Ci0gICAgR0VUX0FPVVRIRFJfRFNJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+ZHNpemUpOwotICBhb3V0aGRyX2ludC0+YnNpemUgPQotICAgIEdFVF9BT1VUSERSX0JTSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmJzaXplKTsKLSAgYW91dGhkcl9pbnQtPmVudHJ5ID0KLSAgICBHRVRfQU9VVEhEUl9FTlRSWSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5lbnRyeSk7Ci0gIGFvdXRoZHJfaW50LT50ZXh0X3N0YXJ0ID0KLSAgICBHRVRfQU9VVEhEUl9URVhUX1NUQVJUIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnRleHRfc3RhcnQpOwotICBhb3V0aGRyX2ludC0+ZGF0YV9zdGFydCA9Ci0gICAgR0VUX0FPVVRIRFJfREFUQV9TVEFSVCAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5kYXRhX3N0YXJ0KTsKLQotICBhID0gJmFvdXRoZHJfaW50LT5wZTsKLSAgYS0+SW1hZ2VCYXNlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5JbWFnZUJhc2UpOwotICBhLT5TZWN0aW9uQWxpZ25tZW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5TZWN0aW9uQWxpZ25tZW50KTsKLSAgYS0+RmlsZUFsaWdubWVudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+RmlsZUFsaWdubWVudCk7Ci0gIGEtPk1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiA9IAotICAgIGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+TWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKLSAgYS0+TWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uID0gCi0gICAgYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5NaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBhLT5NYWpvckltYWdlVmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+TWFqb3JJbWFnZVZlcnNpb24pOwotICBhLT5NaW5vckltYWdlVmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+TWlub3JJbWFnZVZlcnNpb24pOwotICBhLT5NYWpvclN1YnN5c3RlbVZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPk1ham9yU3Vic3lzdGVtVmVyc2lvbik7Ci0gIGEtPk1pbm9yU3Vic3lzdGVtVmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+TWlub3JTdWJzeXN0ZW1WZXJzaW9uKTsKLSAgYS0+UmVzZXJ2ZWQxID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5SZXNlcnZlZDEpOwotICBhLT5TaXplT2ZJbWFnZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+U2l6ZU9mSW1hZ2UpOwotICBhLT5TaXplT2ZIZWFkZXJzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5TaXplT2ZIZWFkZXJzKTsKLSAgYS0+Q2hlY2tTdW0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPkNoZWNrU3VtKTsKLSAgYS0+U3Vic3lzdGVtID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5TdWJzeXN0ZW0pOwotICBhLT5EbGxDaGFyYWN0ZXJpc3RpY3MgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPkRsbENoYXJhY3RlcmlzdGljcyk7Ci0gIGEtPlNpemVPZlN0YWNrUmVzZXJ2ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+U2l6ZU9mU3RhY2tSZXNlcnZlKTsKLSAgYS0+U2l6ZU9mU3RhY2tDb21taXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPlNpemVPZlN0YWNrQ29tbWl0KTsKLSAgYS0+U2l6ZU9mSGVhcFJlc2VydmUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPlNpemVPZkhlYXBSZXNlcnZlKTsKLSAgYS0+U2l6ZU9mSGVhcENvbW1pdCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+U2l6ZU9mSGVhcENvbW1pdCk7Ci0gIGEtPkxvYWRlckZsYWdzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5Mb2FkZXJGbGFncyk7Ci0gIGEtPk51bWJlck9mUnZhQW5kU2l6ZXMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPk51bWJlck9mUnZhQW5kU2l6ZXMpOwotCi0gIHsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeCA8IDE2OyBpZHgrKykKLSAgICAgIHsKLQlhLT5EYXRhRGlyZWN0b3J5W2lkeF0uVmlydHVhbEFkZHJlc3MgPQotCSAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5EYXRhRGlyZWN0b3J5W2lkeF1bMF0pOwotCWEtPkRhdGFEaXJlY3RvcnlbaWR4XS5TaXplID0KLQkgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+RGF0YURpcmVjdG9yeVtpZHhdWzFdKTsKLSAgICAgIH0KLSAgfQotCi0gIGlmIChhb3V0aGRyX2ludC0+ZW50cnkpCi0gICAgewotICAgICAgYW91dGhkcl9pbnQtPmVudHJ5ICs9IGEtPkltYWdlQmFzZTsKLSAgICAgIGFvdXRoZHJfaW50LT5lbnRyeSAmPSAweGZmZmZmZmZmOwotICAgIH0KLSAgaWYgKGFvdXRoZHJfaW50LT50c2l6ZSkgCi0gICAgewotICAgICAgYW91dGhkcl9pbnQtPnRleHRfc3RhcnQgKz0gYS0+SW1hZ2VCYXNlOwotICAgICAgYW91dGhkcl9pbnQtPnRleHRfc3RhcnQgJj0gMHhmZmZmZmZmZjsKLSAgICB9Ci0gIGlmIChhb3V0aGRyX2ludC0+ZHNpemUpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW50LT5kYXRhX3N0YXJ0ICs9IGEtPkltYWdlQmFzZTsKLSAgICAgIGFvdXRoZHJfaW50LT5kYXRhX3N0YXJ0ICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotCi0jaWZkZWYgUE9XRVJQQ19MRV9QRQotICAvKiBUaGVzZSB0aHJlZSBmaWVsZHMgYXJlIG5vcm1hbGx5IHNldCB1cCBieSBwcGNfcmVsb2NhdGVfc2VjdGlvbi4KLSAgICAgSW4gdGhlIGNhc2Ugb2YgcmVhZGluZyBhIGZpbGUgaW4sIHdlIGNhbiBwaWNrIHRoZW0gdXAgZnJvbQotICAgICB0aGUgRGF0YURpcmVjdG9yeS4KLSAgKi8KLSAgZmlyc3RfdGh1bmtfYWRkcmVzcyA9IGEtPkRhdGFEaXJlY3RvcnlbMTJdLlZpcnR1YWxBZGRyZXNzIDsKLSAgdGh1bmtfc2l6ZSA9IGEtPkRhdGFEaXJlY3RvcnlbMTJdLlNpemU7Ci0gIGltcG9ydF90YWJsZV9zaXplID0gYS0+RGF0YURpcmVjdG9yeVsxXS5TaXplOwotI2VuZGlmCi19Ci0KLQotc3RhdGljIHZvaWQgYWRkX2RhdGFfZW50cnkgKGFiZmQsIGFvdXQsIGlkeCwgbmFtZSwgYmFzZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqYW91dDsKLSAgICAgaW50IGlkeDsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSBiYXNlOwotewotICBhc2VjdGlvbiAqc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCi0gIC8qIGFkZCBpbXBvcnQgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGlmIGl0IGV4aXN0cyAqLwotICBpZiAoKHNlYyAhPSBOVUxMKQotICAgICAgJiYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwpCi0gICAgICAmJiAocGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMKSkKLSAgICB7Ci0gICAgICBhb3V0LT5EYXRhRGlyZWN0b3J5W2lkeF0uVmlydHVhbEFkZHJlc3MgPSAoc2VjLT52bWEgLSBiYXNlKSAmIDB4ZmZmZmZmZmY7Ci0gICAgICBhb3V0LT5EYXRhRGlyZWN0b3J5W2lkeF0uU2l6ZSA9IHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnZpcnRfc2l6ZTsKLSAgICAgIHNlYy0+ZmxhZ3MgfD0gU0VDX0RBVEE7Ci0gICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfYW91dGhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqYW91dGhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWluOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqZXh0cmEgPSAmcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkcjsKLSAgUEVBT1VUSERSICphb3V0aGRyX291dCA9IChQRUFPVVRIRFIgKilvdXQ7Ci0KLSAgYmZkX3ZtYSBzYSA9IGV4dHJhLT5TZWN0aW9uQWxpZ25tZW50OwotICBiZmRfdm1hIGZhID0gZXh0cmEtPkZpbGVBbGlnbm1lbnQ7Ci0gIGJmZF92bWEgaWIgPSBleHRyYS0+SW1hZ2VCYXNlIDsKLQotICBpZiAoYW91dGhkcl9pbi0+dHNpemUpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW4tPnRleHRfc3RhcnQgLT0gaWI7Ci0gICAgICBhb3V0aGRyX2luLT50ZXh0X3N0YXJ0ICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotICBpZiAoYW91dGhkcl9pbi0+ZHNpemUpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW4tPmRhdGFfc3RhcnQgLT0gaWI7Ci0gICAgICBhb3V0aGRyX2luLT5kYXRhX3N0YXJ0ICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotICBpZiAoYW91dGhkcl9pbi0+ZW50cnkpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW4tPmVudHJ5IC09IGliOwotICAgICAgYW91dGhkcl9pbi0+ZW50cnkgJj0gMHhmZmZmZmZmZjsKLSAgICB9Ci0KLSNkZWZpbmUgRkEoeCkgICgoKHgpICsgZmEgLTEgKSAmICgtIGZhKSkKLSNkZWZpbmUgU0EoeCkgICgoKHgpICsgc2EgLTEgKSAmICgtIHNhKSkKLQotICAvKiBXZSBsaWtlIHRvIGhhdmUgdGhlIHNpemVzIGFsaWduZWQgKi8KLQotICBhb3V0aGRyX2luLT5ic2l6ZSA9IEZBIChhb3V0aGRyX2luLT5ic2l6ZSk7Ci0KLQotICBleHRyYS0+TnVtYmVyT2ZSdmFBbmRTaXplcyA9IElNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTOwotCi0gIC8qIGZpcnN0IG51bGwgb3V0IGFsbCBkYXRhIGRpcmVjdG9yeSBlbnRyaWVzIC4uICovCi0gIG1lbXNldCAoZXh0cmEtPkRhdGFEaXJlY3RvcnksIHNpemVvZiAoZXh0cmEtPkRhdGFEaXJlY3RvcnkpLCAwKTsKLQotICBhZGRfZGF0YV9lbnRyeSAoYWJmZCwgZXh0cmEsIDAsICIuZWRhdGEiLCBpYik7Ci0gIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBleHRyYSwgMSwgIi5pZGF0YSIsIGliKTsKLSAgYWRkX2RhdGFfZW50cnkgKGFiZmQsIGV4dHJhLCAyLCAiLnJzcmMiICxpYik7Ci0KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0gIC8qIEZJWE1FOiBkbyBvdGhlciBQRSBwbGF0Zm9ybXMgdXNlIHRoaXM/ICovCi0gIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBleHRyYSwgMywgIi5wZGF0YSIgLGliKTsKLSNlbmRpZgotCi0gIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBleHRyYSwgNSwgIi5yZWxvYyIsIGliKTsKLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgLyogT24gdGhlIFBQQyBOVCBzeXN0ZW0sIHRoaXMgZmllbGQgaXMgc2V0IHVwIGFzIGZvbGxvd3MuIEl0IGlzCi0gICAgIG5vdCBhbiAib2ZmaWNpYWxseSIgcmVzZXJ2ZWQgZmllbGQsIHNvIGl0IGN1cnJlbnRseSBoYXMgbm8gdGl0bGUuCi0gICAgIGZpcnN0X3RodW5rX2FkZHJlc3MgaXMgaWRhdGEkNSwgYW5kIHRoZSB0aHVua19zaXplIGlzIHRoZSBzaXplCi0gICAgIG9mIHRoZSBpZGF0YSQ1IGNodW5rIG9mIHRoZSBpZGF0YSBzZWN0aW9uLgotICAqLwotICBleHRyYS0+RGF0YURpcmVjdG9yeVsxMl0uVmlydHVhbEFkZHJlc3MgPSBmaXJzdF90aHVua19hZGRyZXNzOwotICBleHRyYS0+RGF0YURpcmVjdG9yeVsxMl0uU2l6ZSA9IHRodW5rX3NpemU7Ci0KLSAgLyogT24gdGhlIFBQQyBOVCBzeXN0ZW0sIHRoZSBzaXplIG9mIHRoZSBkaXJlY3RvcnkgZW50cnkgaXMgbm90IHRoZQotICAgICBzaXplIG9mIHRoZSBlbnRpcmUgc2VjdGlvbi4gSXQncyBhY3R1YWxseSBvZmZzZXQgdG8gdGhlIGVuZCBvZiAKLSAgICAgdGhlIGlkYXRhJDMgY29tcG9uZW50IG9mIHRoZSBpZGF0YSBzZWN0aW9uLiBUaGlzIGlzIHRoZSBzaXplIG9mCi0gICAgIHRoZSBlbnRpcmUgaW1wb3J0IHRhYmxlLiAoYWxzbyBrbm93biBhcyB0aGUgc3RhcnQgb2YgaWRhdGEkNCkKLSAgKi8KLSAgZXh0cmEtPkRhdGFEaXJlY3RvcnlbMV0uU2l6ZSA9IGltcG9ydF90YWJsZV9zaXplOwotI2VuZGlmCi0KLSAgewotICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgYmZkX3ZtYSBkc2l6ZT0gMDsKLSAgICBiZmRfdm1hIGlzaXplID0gU0EoYWJmZC0+c2VjdGlvbnMtPmZpbGVwb3MpOwotICAgIGJmZF92bWEgdHNpemU9IDA7Ci0KLSAgICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWM7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICAgIHsKLQlpbnQgcm91bmRlZCA9IEZBKHNlYy0+X3Jhd19zaXplKTsKLQotCWlmIChzZWMtPmZsYWdzICYgU0VDX0RBVEEpIAotCSAgZHNpemUgKz0gcm91bmRlZDsKLQlpZiAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKQotCSAgdHNpemUgKz0gcm91bmRlZDsKLQlpc2l6ZSArPSBTQShyb3VuZGVkKTsKLSAgICAgIH0KLQotICAgIGFvdXRoZHJfaW4tPmRzaXplID0gZHNpemU7Ci0gICAgYW91dGhkcl9pbi0+dHNpemUgPSB0c2l6ZTsKLSAgICBleHRyYS0+U2l6ZU9mSW1hZ2UgPSBpc2l6ZTsKLSAgfQotCi0gIGV4dHJhLT5TaXplT2ZIZWFkZXJzID0gYWJmZC0+c2VjdGlvbnMtPmZpbGVwb3M7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBhb3V0aGRyX2luLT5tYWdpYywgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC5tYWdpYyk7Ci0KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0gIC8qIHRoaXMgbGl0dGxlIHBpZWNlIG9mIG1hZ2ljIHNldHMgdGhlICJsaW5rZXIgdmVyc2lvbiIgZmllbGQgdG8gMi42MCAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMiAgKyA2MCAqIDI1NiwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC52c3RhbXApOwotI2Vsc2UKLSAgLyogdGhpcyBsaXR0bGUgcGllY2Ugb2YgbWFnaWMgc2V0cyB0aGUgImxpbmtlciB2ZXJzaW9uIiBmaWVsZCB0byAyLjU1ICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCAyICArIDU1ICogMjU2LCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLnZzdGFtcCk7Ci0jZW5kaWYKLQotICBQVVRfQU9VVEhEUl9UU0laRSAoYWJmZCwgYW91dGhkcl9pbi0+dHNpemUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQudHNpemUpOwotICBQVVRfQU9VVEhEUl9EU0laRSAoYWJmZCwgYW91dGhkcl9pbi0+ZHNpemUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQuZHNpemUpOwotICBQVVRfQU9VVEhEUl9CU0laRSAoYWJmZCwgYW91dGhkcl9pbi0+YnNpemUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQuYnNpemUpOwotICBQVVRfQU9VVEhEUl9FTlRSWSAoYWJmZCwgYW91dGhkcl9pbi0+ZW50cnksIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQuZW50cnkpOwotICBQVVRfQU9VVEhEUl9URVhUX1NUQVJUIChhYmZkLCBhb3V0aGRyX2luLT50ZXh0X3N0YXJ0LAotCQkJICAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLnRleHRfc3RhcnQpOwotCi0gIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgKGFiZmQsIGFvdXRoZHJfaW4tPmRhdGFfc3RhcnQsCi0JCQkgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQuZGF0YV9zdGFydCk7Ci0KLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5JbWFnZUJhc2UsIAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkltYWdlQmFzZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNlY3Rpb25BbGlnbm1lbnQsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U2VjdGlvbkFsaWdubWVudCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPkZpbGVBbGlnbm1lbnQsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+RmlsZUFsaWdubWVudCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPk1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+TWFqb3JJbWFnZVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWFqb3JJbWFnZVZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NaW5vckltYWdlVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NaW5vckltYWdlVmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPk1ham9yU3Vic3lzdGVtVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NYWpvclN1YnN5c3RlbVZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NaW5vclN1YnN5c3RlbVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWlub3JTdWJzeXN0ZW1WZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+UmVzZXJ2ZWQxLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlJlc2VydmVkMSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZkltYWdlLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlNpemVPZkltYWdlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+U2l6ZU9mSGVhZGVycywKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZIZWFkZXJzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+Q2hlY2tTdW0sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Q2hlY2tTdW0pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5TdWJzeXN0ZW0sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U3Vic3lzdGVtKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+RGxsQ2hhcmFjdGVyaXN0aWNzLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkRsbENoYXJhY3RlcmlzdGljcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZlN0YWNrUmVzZXJ2ZSwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZTdGFja1Jlc2VydmUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5TaXplT2ZTdGFja0NvbW1pdCwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZTdGFja0NvbW1pdCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZkhlYXBSZXNlcnZlLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlNpemVPZkhlYXBSZXNlcnZlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+U2l6ZU9mSGVhcENvbW1pdCwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZIZWFwQ29tbWl0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+TG9hZGVyRmxhZ3MsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TG9hZGVyRmxhZ3MpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5OdW1iZXJPZlJ2YUFuZFNpemVzLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPk51bWJlck9mUnZhQW5kU2l6ZXMpOwotICB7Ci0gICAgaW50IGlkeDsKLSAgICBmb3IgKGlkeD0wOyBpZHggPCAxNjsgaWR4KyspCi0gICAgICB7Ci0JYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+RGF0YURpcmVjdG9yeVtpZHhdLlZpcnR1YWxBZGRyZXNzLAotCQkgICAgICAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkRhdGFEaXJlY3RvcnlbaWR4XVswXSk7Ci0JYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+RGF0YURpcmVjdG9yeVtpZHhdLlNpemUsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+RGF0YURpcmVjdG9yeVtpZHhdWzFdKTsKLSAgICAgIH0KLSAgfQotCi0gIHJldHVybiBBT1VUU1o7Ci19Ci0KLXN0YXRpYyB2b2lkCi0gICAgY29mZl9zd2FwX3Njbmhkcl9pbiAoYWJmZCwgZXh0LCBpbikKLSAgICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICBQVFIJICAgICBleHQ7Ci0gIFBUUgkgICAgIGluOwotewotICBTQ05IRFIgKnNjbmhkcl9leHQgPSAoU0NOSERSICopIGV4dDsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGluOwotCi0gIG1lbWNweShzY25oZHJfaW50LT5zX25hbWUsIHNjbmhkcl9leHQtPnNfbmFtZSwgc2l6ZW9mKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotICBzY25oZHJfaW50LT5zX3ZhZGRyID0KLSAgICBHRVRfU0NOSERSX1ZBRERSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c192YWRkcik7Ci0gIHNjbmhkcl9pbnQtPnNfcGFkZHIgPQotICAgIEdFVF9TQ05IRFJfUEFERFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLSAgc2NuaGRyX2ludC0+c19zaXplID0KLSAgICBHRVRfU0NOSERSX1NJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NpemUpOwotICBzY25oZHJfaW50LT5zX3NjbnB0ciA9Ci0gICAgR0VUX1NDTkhEUl9TQ05QVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NjbnB0cik7Ci0gIHNjbmhkcl9pbnQtPnNfcmVscHRyID0KLSAgICBHRVRfU0NOSERSX1JFTFBUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfcmVscHRyKTsKLSAgc2NuaGRyX2ludC0+c19sbm5vcHRyID0KLSAgICBHRVRfU0NOSERSX0xOTk9QVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2xubm9wdHIpOwotICBzY25oZHJfaW50LT5zX2ZsYWdzID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKLQotICBzY25oZHJfaW50LT5zX25yZWxvYyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotICBzY25oZHJfaW50LT5zX25sbm5vID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLQotICBpZiAoc2NuaGRyX2ludC0+c192YWRkciAhPSAwKSAKLSAgICB7Ci0gICAgICBzY25oZHJfaW50LT5zX3ZhZGRyICs9IHBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotICAgICAgc2NuaGRyX2ludC0+c192YWRkciAmPSAweGZmZmZmZmZmOwotICAgIH0KLSAgaWYgKHN0cmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCBfQlNTKSA9PSAwKSAKLSAgICB7Ci0gICAgICBzY25oZHJfaW50LT5zX3NpemUgPSBzY25oZHJfaW50LT5zX3BhZGRyOwotICAgICAgc2NuaGRyX2ludC0+c19wYWRkciA9IDA7Ci0gICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfc2NuaGRyX291dCAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW47Ci0gICAgIFBUUglvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnNjbmhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKWluOwotICBTQ05IRFIgKnNjbmhkcl9leHQgPSAoU0NOSERSICopb3V0OwotICB1bnNpZ25lZCBpbnQgcmV0ID0gU0NOSFNaOwotICBiZmRfdm1hIHBzOwotICBiZmRfdm1hIHNzOwotCi0gIG1lbWNweShzY25oZHJfZXh0LT5zX25hbWUsIHNjbmhkcl9pbnQtPnNfbmFtZSwgc2l6ZW9mKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotCi0gIFBVVF9TQ05IRFJfVkFERFIgKGFiZmQsIAotCQkgICAgKChzY25oZHJfaW50LT5zX3ZhZGRyIAotCQkgICAgICAtIHBlX2RhdGEoYWJmZCktPnBlX29wdGhkci5JbWFnZUJhc2UpCi0JCSAgICAgJiAweGZmZmZmZmZmKSwKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3ZhZGRyKTsKLQotICAvKiBOVCB3YW50cyB0aGUgc2l6ZSBkYXRhIHRvIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgTlRfRklMRV9BTElHTk1FTlQKLSAgICAgdmFsdWUgZXhjZXB0IGZvciB0aGUgQlNTIHNlY3Rpb24sIGl0cyBzX3NpemUgc2hvdWxkIGJlIDAgKi8KLQotCi0gIGlmIChzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgX0JTUykgPT0gMCkgCi0gICAgewotICAgICAgcHMgPSBzY25oZHJfaW50LT5zX3NpemU7Ci0gICAgICBzcyA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHMgPSBzY25oZHJfaW50LT5zX3BhZGRyOwotICAgICAgc3MgPSBzY25oZHJfaW50LT5zX3NpemU7Ci0gICAgfQotCi0gIFBVVF9TQ05IRFJfU0laRSAoYWJmZCwgc3MsCi0JCSAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NpemUpOwotCi0KLSAgUFVUX1NDTkhEUl9QQUREUiAoYWJmZCwgcHMsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLQotICBQVVRfU0NOSERSX1NDTlBUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19zY25wdHIsCi0JCSAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2NucHRyKTsKLSAgUFVUX1NDTkhEUl9SRUxQVFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfcmVscHRyLAotCQkgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3JlbHB0cik7Ci0gIFBVVF9TQ05IRFJfTE5OT1BUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19sbm5vcHRyLAotCQkgICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19sbm5vcHRyKTsKLQotICAvKiBFeHRyYSBmbGFncyBtdXN0IGJlIHNldCB3aGVuIGRlYWxpbmcgd2l0aCBOVC4gIEFsbCBzZWN0aW9ucyBzaG91bGQgYWxzbwotICAgICBoYXZlIHRoZSBJTUFHRV9TQ05fTUVNX1JFQUQgKDB4NDAwMDAwMDApIGZsYWcgc2V0LiAgSW4gYWRkaXRpb24sIHRoZQotICAgICAudGV4dCBzZWN0aW9uIG11c3QgaGF2ZSBJTUFHRV9TQ05fTUVNX0VYRUNVVEUgKDB4MjAwMDAwMDApIGFuZCB0aGUgZGF0YQotICAgICBzZWN0aW9ucyAoLmlkYXRhLCAuZGF0YSwgLmJzcywgLkNSVCkgbXVzdCBoYXZlIElNQUdFX1NDTl9NRU1fV1JJVEUgc2V0Ci0gICAgICh0aGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHdoZW4gZGVhbGluZyB3aXRoIHRoZSAuaWRhdGEgc2VjdGlvbiBzaW5jZQotICAgICB0aGUgYWRkcmVzc2VzIGZvciByb3V0aW5lcyBmcm9tIC5kbGxzIG11c3QgYmUgb3ZlcndyaXR0ZW4pLiAgSWYgLnJlbG9jCi0gICAgIHNlY3Rpb24gZGF0YSBpcyBldmVyIGdlbmVyYXRlZCwgd2UgbXVzdCBhZGQgSU1BR0VfU0NOX01FTV9ESVNDQVJEQUJMRQotICAgICAoMHgwMjAwMDAwMCkuICBBbHNvLCB0aGUgcmVzb3VyY2UgZGF0YSBzaG91bGQgYWxzbyBiZSByZWFkIGFuZAotICAgICB3cml0YWJsZS4gICovCi0KLSAgLyogRklYTUU6IGFsaWdubWVudCBpcyBhbHNvIGVuY29kZWQgaW4gdGhpcyBmaWVsZCwgYXQgbGVhc3Qgb24gcHBjIChrcmspICovCi0gIC8qIEZJWE1FOiBldmVuIHdvcnNlLCBJIGRvbid0IHNlZSBob3cgdG8gZ2V0IHRoZSBvcmlnaW5hbCBhbGlnbm1lbnQgZmllbGQqLwotICAvKiAgICAgICAgYmFjay4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBGSVhNRTogQmFzaW5nIHRoaXMgb24gc2VjdGlvbiBuYW1lcyBpcyBib2d1cy4gIEFsc28sIHRoaXMgc2hvdWxkCi0gICAgIGJlIGluIHNlY190b19zdHlwX2ZsYWdzLiAgKi8KLQotICB7Ci0gICAgaW50IGZsYWdzID0gc2NuaGRyX2ludC0+c19mbGFnczsKLSAgICBpZiAoc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIuZGF0YSIpICA9PSAwIHx8Ci0Jc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIuQ1JUIikgICA9PSAwIHx8Ci0Jc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIuYnNzIikgICA9PSAwKQotICAgICAgZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9SRUFEIHwgSU1BR0VfU0NOX01FTV9XUklURTsKLSAgICBlbHNlIGlmIChzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICAgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fUkVBRCB8IElNQUdFX1NDTl9NRU1fRVhFQ1VURTsKLSAgICBlbHNlIGlmIChzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi5yZWxvYyIpID09IDApCi0gICAgICBmbGFncyA9IChTRUNfREFUQSB8IElNQUdFX1NDTl9NRU1fUkVBRCB8IElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUKLQkgICAgICAgfCBJTUFHRV9TQ05fTUVNX1NIQVJFRCk7Ci0gICAgZWxzZSBpZiAoc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIuaWRhdGEiKSA9PSAwKQotICAgICAgZmxhZ3MgPSBJTUFHRV9TQ05fTUVNX1JFQUQgfCBJTUFHRV9TQ05fTUVNX1dSSVRFIHwgU0VDX0RBVEE7ICAgICAKLSAgICBlbHNlIGlmIChzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi5yZGF0YSIpID09IDAKLQkgICAgIHx8IHN0cmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCAiLmVkYXRhIikgPT0gMCkKLSAgICAgIGZsYWdzID0gIElNQUdFX1NDTl9NRU1fUkVBRCB8IFNFQ19EQVRBOyAgICAgCi0gICAgZWxzZSBpZiAoc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIucGRhdGEiKSA9PSAwKQotICAgICAgZmxhZ3MgPSBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgfCBJTUFHRV9TQ05fQUxJR05fNEJZVEVTIHwKLQkJCSAgSU1BR0VfU0NOX01FTV9SRUFEIDsKLSAgICAvKiBSZW1lbWJlciB0aGlzIGZpZWxkIGlzIGEgbWF4IG9mIDggY2hhcnMsIHNvIHRoZSBudWxsIGlzIF9ub3RfIHRoZXJlCi0gICAgICAgZm9yIGFuIDggY2hhcmFjdGVyIG5hbWUgbGlrZSAiLnJlbGRhdGEiLiAoeWVwLiBTdHVwaWQgYnVnKSAqLwotICAgIGVsc2UgaWYgKHN0cm5jbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi5yZWxkYXRhIiwgOCkgPT0gMCkKLSAgICAgIGZsYWdzID0gIElNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQSB8IElNQUdFX1NDTl9BTElHTl84QllURVMgfAotCSAgICAgICBJTUFHRV9TQ05fTUVNX1JFQUQgfCBJTUFHRV9TQ05fTUVNX1dSSVRFIDsKLSAgICBlbHNlIGlmIChzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi55ZGF0YSIpID09IDApCi0gICAgICBmbGFncyA9ICBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgfCBJTUFHRV9TQ05fQUxJR05fOEJZVEVTIHwKLQkgICAgICAgSU1BR0VfU0NOX01FTV9SRUFEIHwgSU1BR0VfU0NOX01FTV9XUklURSA7Ci0gICAgZWxzZSBpZiAoc3RybmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCAiLmRyZWN0dmUiLCA4KSA9PSAwKQotICAgICAgZmxhZ3MgPSAgSU1BR0VfU0NOX0xOS19JTkZPIHwgSU1BR0VfU0NOX0xOS19SRU1PVkUgOwotICAgIGVsc2UgaWYgKHN0cm5jbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi5zdGFiIiwgNSkgPT0gMCkKLSAgICAgIGZsYWdzIHw9IChJTUFHRV9TQ05fTE5LX0lORk8gfCBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFCi0JCXwgSU1BR0VfU0NOX01FTV9TSEFSRUQgfCBJTUFHRV9TQ05fTUVNX1JFQUQpOwotICAgIGVsc2UgaWYgKHN0cmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCAiLnJzcmMiKSAgPT0gMCkKLSAgICAgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fUkVBRCB8IElNQUdFX1NDTl9NRU1fU0hBUkVEOwotICAgIGVsc2UKLSAgICAgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fUkVBRDsKLQotICAgIGJmZF9oX3B1dF8zMihhYmZkLCBmbGFncywgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfZmxhZ3MpOwotICB9Ci0KLSAgaWYgKHNjbmhkcl9pbnQtPnNfbmxubm8gPD0gMHhmZmZmKQotICAgIGJmZF9oX3B1dF8xNihhYmZkLCBzY25oZHJfaW50LT5zX25sbm5vLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiBsaW5lIG51bWJlciBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiKSwKLQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkgICAgIHNjbmhkcl9pbnQtPnNfbmxubm8pOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgMHhmZmZmLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0gICAgICByZXQgPSAwOwotICAgIH0KLSAgaWYgKHNjbmhkcl9pbnQtPnNfbnJlbG9jIDw9IDB4ZmZmZikKLSAgICBiZmRfaF9wdXRfMTYoYWJmZCwgc2NuaGRyX2ludC0+c19ucmVsb2MsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiByZWxvYyBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiKSwKLQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkgICAgIHNjbmhkcl9pbnQtPnNfbnJlbG9jKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIDB4ZmZmZiwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbnJlbG9jKTsKLSAgICAgIHJldCA9IDA7Ci0gICAgfQotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY2hhciAqIGRpcl9uYW1lc1tJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFU10gPSAKLXsKLSAgTl8gKCJFeHBvcnQgRGlyZWN0b3J5IFsuZWRhdGEgKG9yIHdoZXJlIGV2ZXIgd2UgZm91bmQgaXQpXSIpLAotICBOXyAoIkltcG9ydCBEaXJlY3RvcnkgW3BhcnRzIG9mIC5pZGF0YV0iKSwKLSAgTl8gKCJSZXNvdXJjZSBEaXJlY3RvcnkgWy5yc3JjXSIpLAotICBOXyAoIkV4Y2VwdGlvbiBEaXJlY3RvcnkgWy5wZGF0YV0iKSwKLSAgTl8gKCJTZWN1cml0eSBEaXJlY3RvcnkiKSwKLSAgTl8gKCJCYXNlIFJlbG9jYXRpb24gRGlyZWN0b3J5IFsucmVsb2NdIiksCi0gIE5fICgiRGVidWcgRGlyZWN0b3J5IiksCi0gIE5fICgiRGVzY3JpcHRpb24gRGlyZWN0b3J5IiksCi0gIE5fICgiU3BlY2lhbCBEaXJlY3RvcnkiKSwKLSAgTl8gKCJUaHJlYWQgU3RvcmFnZSBEaXJlY3RvcnkgWy50bHNdIiksCi0gIE5fICgiTG9hZCBDb25maWd1cmF0aW9uIERpcmVjdG9yeSIpLAotICBOXyAoIkJvdW5kIEltcG9ydCBEaXJlY3RvcnkiKSwKLSAgTl8gKCJJbXBvcnQgQWRkcmVzcyBUYWJsZSBEaXJlY3RvcnkiKSwKLSAgTl8gKCJSZXNlcnZlZCIpLAotICBOXyAoIlJlc2VydmVkIiksCi0gIE5fICgiUmVzZXJ2ZWQiKQotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbGVhbgotcGVfcHJpbnRfaWRhdGEoYWJmZCwgdmZpbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHZmaWxlOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgdmZpbGU7Ci0gIGJmZF9ieXRlICpkYXRhID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5pZGF0YSIpOwotICB1bnNpZ25lZCBsb25nIGFkajsKLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgYXNlY3Rpb24gKnJlbF9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmVsZGF0YSIpOwotI2VuZGlmCi0KLSAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBkYXRhb2ZmOwotICBiZmRfc2l6ZV90eXBlIHNlY3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgaTsKLSAgYmZkX3NpemVfdHlwZSBzdGFydCwgc3RvcDsKLSAgaW50IG9uYWxpbmUgPSAyMDsKLQotICBwZV9kYXRhX3R5cGUgKnBlID0gcGVfZGF0YSAoYWJmZCk7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyICpleHRyYSA9ICZwZS0+cGVfb3B0aGRyOwotCi0gIGlmIChzZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLSAgICAgIGRhdGFvZmYgPSAwOwotCi0gICAgICBpZiAoZGF0YXNpemUgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFkZHIsIHNpemU7Ci0KLSAgICAgIGFkZHIgPSBleHRyYS0+RGF0YURpcmVjdG9yeVsxXS5WaXJ0dWFsQWRkcmVzczsKLSAgICAgIHNpemUgPSBleHRyYS0+RGF0YURpcmVjdG9yeVsxXS5TaXplOwotCi0gICAgICBpZiAoYWRkciA9PSAwIHx8IHNpemUgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JewotCSAgaWYgKHNlY3Rpb24tPnZtYSAtIGV4dHJhLT5JbWFnZUJhc2UgPD0gYWRkcgotCSAgICAgICYmICgoc2VjdGlvbi0+dm1hIC0gZXh0cmEtPkltYWdlQmFzZQotCQkgICArIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKQotCQkgID49IGFkZHIgKyBzaXplKSkKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgaWYgKHNlY3Rpb24gPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgLyogRm9yIHNvbWUgcmVhc29uIHRoZSBpbXBvcnQgdGFibGUgc2l6ZSBpcyBub3QgcmVsaWFibGUuICBUaGUKLSAgICAgICAgIGltcG9ydCBkYXRhIHdpbGwgZXh0ZW5kIHBhc3QgdGhlIGluZGljYXRlZCBzaXplLCBhbmQgYmVmb3JlCi0gICAgICAgICB0aGUgaW5kaWNhdGVkIGFkZHJlc3MuICAqLwotICAgICAgZGF0YW9mZiA9IGFkZHIgLSAoc2VjdGlvbi0+dm1hIC0gZXh0cmEtPkltYWdlQmFzZSk7Ci0gICAgICBkYXRhc2l6ZSA9IHNpemU7Ci0gICAgfQotCi0jaWZkZWYgUE9XRVJQQ19MRV9QRQotICBpZiAocmVsX3NlY3Rpb24gIT0gMCAmJiBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCByZWxfc2VjdGlvbikgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGUgdG9jIGFkZHJlc3MgY2FuIGJlIGZvdW5kIGJ5IHRha2luZyB0aGUgc3RhcnRpbmcgYWRkcmVzcywKLQkgd2hpY2ggb24gdGhlIFBQQyBsb2NhdGVzIGEgZnVuY3Rpb24gZGVzY3JpcHRvci4gVGhlIGRlc2NyaXB0b3IKLQkgY29uc2lzdHMgb2YgdGhlIGZ1bmN0aW9uIGNvZGUgc3RhcnRpbmcgYWRkcmVzcyBmb2xsb3dlZCBieSB0aGUKLQkgYWRkcmVzcyBvZiB0aGUgdG9jLiBUaGUgc3RhcnRpbmcgYWRkcmVzcyB3ZSBnZXQgZnJvbSB0aGUgYmZkLAotCSBhbmQgdGhlIGRlc2NyaXB0b3IgaXMgc3VwcG9zZWQgdG8gYmUgaW4gdGhlIC5yZWxkYXRhIHNlY3Rpb24uIAotICAgICAgKi8KLQotICAgICAgYmZkX3ZtYSBsb2FkYWJsZV90b2NfYWRkcmVzczsKLSAgICAgIGJmZF92bWEgdG9jX2FkZHJlc3M7Ci0gICAgICBiZmRfdm1hIHN0YXJ0X2FkZHJlc3M7Ci0gICAgICBiZmRfYnl0ZSAqZGF0YSA9IDA7Ci0gICAgICBpbnQgb2Zmc2V0OwotICAgICAgZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCAKLQkJCQkJCQkJIHJlbF9zZWN0aW9uKSk7Ci0gICAgICBpZiAoZGF0YSA9PSBOVUxMICYmIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHJlbF9zZWN0aW9uKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCByZWxfc2VjdGlvbik7Ci0gIAotICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCAKLQkJCQlyZWxfc2VjdGlvbiwgCi0JCQkJKFBUUikgZGF0YSwgMCwgCi0JCQkJYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcmVsX3NlY3Rpb24pKTsKLQotICAgICAgb2Zmc2V0ID0gYWJmZC0+c3RhcnRfYWRkcmVzcyAtIHJlbF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIHN0YXJ0X2FkZHJlc3MgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErb2Zmc2V0KTsKLSAgICAgIGxvYWRhYmxlX3RvY19hZGRyZXNzID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK29mZnNldCs0KTsKLSAgICAgIHRvY19hZGRyZXNzID0gbG9hZGFibGVfdG9jX2FkZHJlc3MgLSAzMjc2ODsKLQotICAgICAgZnByaW50ZihmaWxlLAotCSAgICAgIF8oIlxuRnVuY3Rpb24gZGVzY3JpcHRvciBsb2NhdGVkIGF0IHRoZSBzdGFydCBhZGRyZXNzOiAlMDRseFxuIiksCi0JICAgICAgKHVuc2lnbmVkIGxvbmcgaW50KSAoYWJmZC0+c3RhcnRfYWRkcmVzcykpOwotICAgICAgZnByaW50ZiAoZmlsZSwKLQkgICAgICAgXygiXHRjb2RlLWJhc2UgJTA4bHggdG9jIChsb2FkYWJsZS9hY3R1YWwpICUwOGx4LyUwOGx4XG4iKSwgCi0JICAgICAgIHN0YXJ0X2FkZHJlc3MsIGxvYWRhYmxlX3RvY19hZGRyZXNzLCB0b2NfYWRkcmVzcyk7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIGZwcmludGYoZmlsZSwKLQkgICAgICBfKCJcbk5vIHJlbGRhdGEgc2VjdGlvbiEgRnVuY3Rpb24gZGVzY3JpcHRvciBub3QgZGVjb2RlZC5cbiIpKTsKLSAgICB9Ci0jZW5kaWYKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJcblRoZSBJbXBvcnQgVGFibGVzIChpbnRlcnByZXRlZCAuaWRhdGEgc2VjdGlvbiBjb250ZW50cylcbiIpKTsKLSAgZnByaW50ZihmaWxlLAotCSAgXygiIHZtYTogICAgICAgICAgICBIaW50ICAgIFRpbWUgICAgICBGb3J3YXJkICBETEwgICAgICAgRmlyc3RcbiIpKTsKLSAgZnByaW50ZihmaWxlLAotCSAgXygiICAgICAgICAgICAgICAgICBUYWJsZSAgIFN0YW1wICAgICBDaGFpbiAgICBOYW1lICAgICAgVGh1bmtcbiIpKTsKLQotICBzZWNzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0gIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2Vjc2l6ZSk7Ci0gIGlmIChkYXRhID09IE5VTEwgJiYgc2Vjc2l6ZSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIChQVFIpIGRhdGEsIDAsIHNlY3NpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhZGogPSAoZXh0cmEtPkltYWdlQmFzZSAtIHNlY3Rpb24tPnZtYSkgJiAweGZmZmZmZmZmOwotCi0gIHN0YXJ0ID0gZGF0YW9mZjsKLSAgc3RvcCA9IGRhdGFvZmYgKyBkYXRhc2l6ZTsKLSAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IG9uYWxpbmUpCi0gICAgewotICAgICAgYmZkX3ZtYSBoaW50X2FkZHI7Ci0gICAgICBiZmRfdm1hIHRpbWVfc3RhbXA7Ci0gICAgICBiZmRfdm1hIGZvcndhcmRfY2hhaW47Ci0gICAgICBiZmRfdm1hIGRsbF9uYW1lOwotICAgICAgYmZkX3ZtYSBmaXJzdF90aHVuazsKLSAgICAgIGludCBpZHggPSAwOwotICAgICAgYmZkX3NpemVfdHlwZSBqOwotICAgICAgY2hhciAqZGxsOwotCi0gICAgICBmcHJpbnRmIChmaWxlLAotCSAgICAgICAiICUwOGx4XHQiLCAKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcgaW50KSAoaSArIHNlY3Rpb24tPnZtYSArIGRhdGFvZmYpKTsKLSAgICAgIAotICAgICAgaWYgKGkrMjAgPiBzdG9wKQotCXsKLQkgIC8qIGNoZWNrIHN0dWZmICovCi0JICA7Ci0JfQotICAgICAgCi0gICAgICBoaW50X2FkZHIgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGEraSk7Ci0gICAgICB0aW1lX3N0YW1wID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krNCk7Ci0gICAgICBmb3J3YXJkX2NoYWluID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krOCk7Ci0gICAgICBkbGxfbmFtZSA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzEyKTsKLSAgICAgIGZpcnN0X3RodW5rID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krMTYpOwotICAgICAgCi0gICAgICBmcHJpbnRmKGZpbGUsICIlMDhseCAlMDhseCAlMDhseCAlMDhseCAlMDhseFxuIiwKLQkgICAgICBoaW50X2FkZHIsCi0JICAgICAgdGltZV9zdGFtcCwKLQkgICAgICBmb3J3YXJkX2NoYWluLAotCSAgICAgIGRsbF9uYW1lLAotCSAgICAgIGZpcnN0X3RodW5rKTsKLQotICAgICAgaWYgKGhpbnRfYWRkciA9PSAwICYmIGZpcnN0X3RodW5rID09IDApCi0JYnJlYWs7Ci0KLSAgICAgIC8qIHRoZSBpbWFnZSBiYXNlIGlzIHByZXNlbnQgaW4gdGhlIHNlY3Rpb24tPnZtYSAqLwotICAgICAgZGxsID0gKGNoYXIgKikgZGF0YSArIGRsbF9uYW1lICsgYWRqOwotICAgICAgZnByaW50ZihmaWxlLCBfKCJcblx0RExMIE5hbWU6ICVzXG4iKSwgZGxsKTsKLQotICAgICAgaWYgKGhpbnRfYWRkciAhPSAwKQotCXsKLQkgIGZwcmludGYgKGZpbGUsIF8oIlx0dm1hOiAgSGludC9PcmQgTWVtYmVyLU5hbWVcbiIpKTsKLQotCSAgaWR4ID0gaGludF9hZGRyICsgYWRqOwotCi0JICBmb3IgKGogPSAwOyBqIDwgc3RvcDsgaiArPSA0KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyBtZW1iZXIgPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgaWR4ICsgaik7Ci0KLQkgICAgICBpZiAobWVtYmVyID09IDApCi0JCWJyZWFrOwotCSAgICAgIGlmIChtZW1iZXIgJiAweDgwMDAwMDAwKQotCQlmcHJpbnRmIChmaWxlLCAiXHQlMDRseFx0ICU0bHUiLCBtZW1iZXIsCi0JCQkgbWVtYmVyICYgMHg3ZmZmZmZmZik7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW50IG9yZGluYWw7Ci0JCSAgY2hhciAqbWVtYmVyX25hbWU7Ci0KLQkJICBvcmRpbmFsID0gYmZkX2dldF8xNiAoYWJmZCwgZGF0YSArIG1lbWJlciArIGFkaik7Ci0JCSAgbWVtYmVyX25hbWUgPSAoY2hhciAqKSBkYXRhICsgbWVtYmVyICsgYWRqICsgMjsKLQkJICBmcHJpbnRmIChmaWxlLCAiXHQlMDRseFx0ICU0ZCAgJXMiLAotCQkJICAgbWVtYmVyLCBvcmRpbmFsLCBtZW1iZXJfbmFtZSk7Ci0JCX0KLQotCSAgICAgIC8qIElmIHRoZSB0aW1lIHN0YW1wIGlzIG5vdCB6ZXJvLCB0aGUgaW1wb3J0IGFkZHJlc3MKLSAgICAgICAgICAgICAgICAgdGFibGUgaG9sZHMgYWN0dWFsIGFkZHJlc3Nlcy4gICovCi0JICAgICAgaWYgKHRpbWVfc3RhbXAgIT0gMAotCQkgICYmIGZpcnN0X3RodW5rICE9IDAKLQkJICAmJiBmaXJzdF90aHVuayAhPSBoaW50X2FkZHIpCi0JCWZwcmludGYgKGZpbGUsICJcdCUwNGx4IiwKLQkJCSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgZmlyc3RfdGh1bmsgKyBhZGogKyBqKSk7Ci0KLQkgICAgICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGhpbnRfYWRkciAhPSBmaXJzdF90aHVuayAmJiB0aW1lX3N0YW1wID09IDApCi0JewotCSAgaW50IGRpZmZlciA9IDA7Ci0JICBpbnQgaWR4MjsKLQotCSAgaWR4MiA9IGZpcnN0X3RodW5rICsgYWRqOwotCi0JICBmb3IgKGo9MDtqPHN0b3A7ais9NCkKLQkgICAgewotCSAgICAgIGludCBvcmRpbmFsOwotCSAgICAgIGNoYXIgKm1lbWJlcl9uYW1lOwotCSAgICAgIGJmZF92bWEgaGludF9tZW1iZXIgPSAwOwotCSAgICAgIGJmZF92bWEgaWF0X21lbWJlcjsKLQotCSAgICAgIGlmIChoaW50X2FkZHIgIT0gMCkKLQkJaGludF9tZW1iZXIgPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgaWR4ICsgaik7Ci0JICAgICAgaWF0X21lbWJlciA9IGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyBpZHgyICsgaik7Ci0KLQkgICAgICBpZiAoaGludF9hZGRyID09IDAgJiYgaWF0X21lbWJlciA9PSAwKQotCQlicmVhazsKLQotCSAgICAgIGlmIChoaW50X2FkZHIgPT0gMCB8fCBoaW50X21lbWJlciAhPSBpYXRfbWVtYmVyKQotCQl7Ci0JCSAgaWYgKGRpZmZlciA9PSAwKQotCQkgICAgewotCQkgICAgICBmcHJpbnRmIChmaWxlLCAKLQkJCSAgICAgICBfKCJcdFRoZSBJbXBvcnQgQWRkcmVzcyBUYWJsZSAoZGlmZmVyZW5jZSBmb3VuZClcbiIpKTsKLQkJICAgICAgZnByaW50ZihmaWxlLCBfKCJcdHZtYTogIEhpbnQvT3JkIE1lbWJlci1OYW1lXG4iKSk7Ci0JCSAgICAgIGRpZmZlciA9IDE7Ci0JCSAgICB9Ci0JCSAgaWYgKGlhdF9tZW1iZXIgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgZnByaW50ZihmaWxlLAotCQkJICAgICAgXygiXHQ+Pj4gUmFuIG91dCBvZiBJQVQgbWVtYmVycyFcbiIpKTsKLQkJICAgIH0KLQkJICBlbHNlIAotCQkgICAgewotCQkgICAgICBvcmRpbmFsID0gYmZkX2dldF8xNihhYmZkLAotCQkJCQkgICBkYXRhICsgaWF0X21lbWJlciArIGFkaik7Ci0JCSAgICAgIG1lbWJlcl9uYW1lID0gKGNoYXIgKikgZGF0YSArIGlhdF9tZW1iZXIgKyBhZGogKyAyOwotCQkgICAgICBmcHJpbnRmKGZpbGUsICJcdCUwNGx4XHQgJTRkICAlc1xuIiwKLQkJCSAgICAgIGlhdF9tZW1iZXIsIG9yZGluYWwsIG1lbWJlcl9uYW1lKTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKGhpbnRfYWRkciAhPSAwICYmIGhpbnRfbWVtYmVyID09IDApCi0JCWJyZWFrOwotCSAgICB9Ci0JICBpZiAoZGlmZmVyID09IDApCi0JICAgIHsKLQkgICAgICBmcHJpbnRmKGZpbGUsCi0JCSAgICAgIF8oIlx0VGhlIEltcG9ydCBBZGRyZXNzIFRhYmxlIGlzIGlkZW50aWNhbFxuIikpOwotCSAgICB9Ci0JfQotCi0gICAgICBmcHJpbnRmKGZpbGUsICJcbiIpOwotCi0gICAgfQotCi0gIGZyZWUgKGRhdGEpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotcGVfcHJpbnRfZWRhdGEgKGFiZmQsIHZmaWxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiB2ZmlsZTsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOwotICBiZmRfYnl0ZSAqZGF0YSA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZWRhdGEiKTsKLQotICBiZmRfc2l6ZV90eXBlIGRhdGFzaXplOwotICBiZmRfc2l6ZV90eXBlIGRhdGFvZmY7Ci0gIGJmZF9zaXplX3R5cGUgaTsKLQotICBpbnQgYWRqOwotICBzdHJ1Y3QgRURUX3R5cGUgCi0gICAgewotICAgICAgbG9uZyBleHBvcnRfZmxhZ3M7ICAgICAgICAgICAgIC8qIHJlc2VydmVkIC0gc2hvdWxkIGJlIHplcm8gKi8KLSAgICAgIGxvbmcgdGltZV9zdGFtcDsKLSAgICAgIHNob3J0IG1ham9yX3ZlcjsKLSAgICAgIHNob3J0IG1pbm9yX3ZlcjsKLSAgICAgIGJmZF92bWEgbmFtZTsgICAgICAgICAgICAgICAgICAvKiBydmEgLSByZWxhdGl2ZSB0byBpbWFnZSBiYXNlICovCi0gICAgICBsb25nIGJhc2U7ICAgICAgICAgICAgICAgICAgICAgLyogb3JkaW5hbCBiYXNlICovCi0gICAgICB1bnNpZ25lZCBsb25nIG51bV9mdW5jdGlvbnM7ICAgLyogTnVtYmVyIGluIHRoZSBleHBvcnQgYWRkcmVzcyB0YWJsZSAqLwotICAgICAgdW5zaWduZWQgbG9uZyBudW1fbmFtZXM7ICAgICAgIC8qIE51bWJlciBpbiB0aGUgbmFtZSBwb2ludGVyIHRhYmxlICovCi0gICAgICBiZmRfdm1hIGVhdF9hZGRyOyAgICAvKiBydmEgdG8gdGhlIGV4cG9ydCBhZGRyZXNzIHRhYmxlICovCi0gICAgICBiZmRfdm1hIG5wdF9hZGRyOyAgICAgICAgLyogcnZhIHRvIHRoZSBFeHBvcnQgTmFtZSBQb2ludGVyIFRhYmxlICovCi0gICAgICBiZmRfdm1hIG90X2FkZHI7IC8qIHJ2YSB0byB0aGUgT3JkaW5hbCBUYWJsZSAqLwotICAgIH0gZWR0OwotCi0gIHBlX2RhdGFfdHlwZSAqcGUgPSBwZV9kYXRhIChhYmZkKTsKLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKmV4dHJhID0gJnBlLT5wZV9vcHRoZHI7Ci0KLSAgaWYgKHNlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkYXRhc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotICAgICAgZGF0YW9mZiA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGRyLCBzaXplOwotCi0gICAgICBhZGRyID0gZXh0cmEtPkRhdGFEaXJlY3RvcnlbMF0uVmlydHVhbEFkZHJlc3M7Ci0gICAgICBzaXplID0gZXh0cmEtPkRhdGFEaXJlY3RvcnlbMF0uU2l6ZTsKLQotICAgICAgaWYgKGFkZHIgPT0gMCB8fCBzaXplID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCXsKLQkgIGlmIChzZWN0aW9uLT52bWEgLSBleHRyYS0+SW1hZ2VCYXNlIDw9IGFkZHIKLQkgICAgICAmJiAoKHNlY3Rpb24tPnZtYSAtIGV4dHJhLT5JbWFnZUJhc2UKLQkJICAgKyBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSkKLQkJICA+PSBhZGRyICsgc2l6ZSkpCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIGlmIChzZWN0aW9uID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGRhdGFzaXplID0gc2l6ZTsKLSAgICAgIGRhdGFvZmYgPSBhZGRyIC0gKHNlY3Rpb24tPnZtYSAtIGV4dHJhLT5JbWFnZUJhc2UpOwotICAgIH0KLQotICBkYXRhID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGRhdGFzaXplKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCAmJiBkYXRhc2l6ZSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIChQVFIpIGRhdGEsIGRhdGFvZmYsCi0JCQkJICBkYXRhc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdvIGdldCBFeHBvcnQgRGlyZWN0b3J5IFRhYmxlICovCi0gIGVkdC5leHBvcnRfZmxhZ3MgICA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YSswKTsgCi0gIGVkdC50aW1lX3N0YW1wICAgICA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YSs0KTsKLSAgZWR0Lm1ham9yX3ZlciAgICAgID0gYmZkX2dldF8xNihhYmZkLCBkYXRhKzgpOwotICBlZHQubWlub3JfdmVyICAgICAgPSBiZmRfZ2V0XzE2KGFiZmQsIGRhdGErMTApOwotICBlZHQubmFtZSAgICAgICAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMTIpOwotICBlZHQuYmFzZSAgICAgICAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMTYpOwotICBlZHQubnVtX2Z1bmN0aW9ucyAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMjApOyAKLSAgZWR0Lm51bV9uYW1lcyAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzI0KTsgCi0gIGVkdC5lYXRfYWRkciAgICAgICA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YSsyOCk7Ci0gIGVkdC5ucHRfYWRkciAgICAgICA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YSszMik7IAotICBlZHQub3RfYWRkciAgICAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMzYpOwotCi0gIGFkaiA9IChleHRyYS0+SW1hZ2VCYXNlIC0gKHNlY3Rpb24tPnZtYSArIGRhdGFvZmYpKSAmIDB4ZmZmZmZmZmY7Ci0KLQotICAvKiBEdW1wIHRoZSBFRFQgZmlyc3QgZmlyc3QgKi8KLSAgZnByaW50ZihmaWxlLAotCSAgXygiXG5UaGUgRXhwb3J0IFRhYmxlcyAoaW50ZXJwcmV0ZWQgLmVkYXRhIHNlY3Rpb24gY29udGVudHMpXG5cbiIpKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJFeHBvcnQgRmxhZ3MgXHRcdFx0JWx4XG4iKSwgKHVuc2lnbmVkIGxvbmcpIGVkdC5leHBvcnRfZmxhZ3MpOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlRpbWUvRGF0ZSBzdGFtcCBcdFx0JWx4XG4iKSwgKHVuc2lnbmVkIGxvbmcpIGVkdC50aW1lX3N0YW1wKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJNYWpvci9NaW5vciBcdFx0XHQlZC8lZFxuIiksIGVkdC5tYWpvcl92ZXIsIGVkdC5taW5vcl92ZXIpOwotCi0gIGZwcmludGYgKGZpbGUsCi0JICAgXygiTmFtZSBcdFx0XHRcdCIpKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGVkdC5uYW1lKTsKLSAgZnByaW50ZiAoZmlsZSwKLQkgICAiICVzXG4iLCBkYXRhICsgZWR0Lm5hbWUgKyBhZGopOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIk9yZGluYWwgQmFzZSBcdFx0XHQlbGRcbiIpLCBlZHQuYmFzZSk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiTnVtYmVyIGluOlxuIikpOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlx0RXhwb3J0IEFkZHJlc3MgVGFibGUgXHRcdCVseFxuIiksCi0JICBlZHQubnVtX2Z1bmN0aW9ucyk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiXHRbTmFtZSBQb2ludGVyL09yZGluYWxdIFRhYmxlXHQlbHVcbiIpLCBlZHQubnVtX25hbWVzKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJUYWJsZSBBZGRyZXNzZXNcbiIpKTsKLQotICBmcHJpbnRmIChmaWxlLAotCSAgIF8oIlx0RXhwb3J0IEFkZHJlc3MgVGFibGUgXHRcdCIpKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGVkdC5lYXRfYWRkcik7Ci0gIGZwcmludGYgKGZpbGUsICJcbiIpOwotCi0gIGZwcmludGYgKGZpbGUsCi0JICBfKCJcdE5hbWUgUG9pbnRlciBUYWJsZSBcdFx0IikpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgZWR0Lm5wdF9hZGRyKTsKLSAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0KLSAgZnByaW50ZiAoZmlsZSwKLQkgICBfKCJcdE9yZGluYWwgVGFibGUgXHRcdFx0IikpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgZWR0Lm90X2FkZHIpOwotICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQotICAKLSAgLyogVGhlIG5leHQgdGFibGUgdG8gZmluZCBzaSB0aGUgRXhwb3J0IEFkZHJlc3MgVGFibGUuIEl0J3MgYmFzaWNhbGx5Ci0gICAgIGEgbGlzdCBvZiBwb2ludGVycyB0aGF0IGVpdGhlciBsb2NhdGUgYSBmdW5jdGlvbiBpbiB0aGlzIGRsbCwgb3IKLSAgICAgZm9yd2FyZCB0aGUgY2FsbCB0byBhbm90aGVyIGRsbC4gU29tZXRoaW5nIGxpa2U6Ci0gICAgICB0eXBlZGVmIHVuaW9uIAotICAgICAgewotICAgICAgICBsb25nIGV4cG9ydF9ydmE7Ci0gICAgICAgIGxvbmcgZm9yd2FyZGVyX3J2YTsKLSAgICAgIH0gZXhwb3J0X2FkZHJlc3NfdGFibGVfZW50cnk7Ci0gICovCi0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiXG5FeHBvcnQgQWRkcmVzcyBUYWJsZSAtLSBPcmRpbmFsIEJhc2UgJWxkXG4iKSwKLQkgIGVkdC5iYXNlKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgZWR0Lm51bV9mdW5jdGlvbnM7ICsraSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGVhdF9tZW1iZXIgPSBiZmRfZ2V0XzMyIChhYmZkLCAKLQkJCQkgICAgICAgZGF0YSArIGVkdC5lYXRfYWRkciArIChpICogNCkgKyBhZGopOwotICAgICAgYmZkX3ZtYSBlYXRfYWN0dWFsID0gKGV4dHJhLT5JbWFnZUJhc2UgKyBlYXRfbWVtYmVyKSAmIDB4ZmZmZmZmZmY7Ci0gICAgICBiZmRfdm1hIGVkYXRhX3N0YXJ0ID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCxzZWN0aW9uKSArIGRhdGFvZmY7Ci0gICAgICBiZmRfdm1hIGVkYXRhX2VuZCA9IGVkYXRhX3N0YXJ0ICsgZGF0YXNpemU7Ci0KLSAgICAgIGlmIChlYXRfbWVtYmVyID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChlZGF0YV9zdGFydCA8IGVhdF9hY3R1YWwgJiYgZWF0X2FjdHVhbCA8IGVkYXRhX2VuZCkgCi0JewotCSAgLyogdGhpcyBydmEgaXMgdG8gYSBuYW1lIChmb3J3YXJkaW5nIGZ1bmN0aW9uKSBpbiBvdXIgc2VjdGlvbiAqLwotCSAgLyogU2hvdWxkIGxvY2F0ZSBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IgKi8KLQkgIGZwcmludGYoZmlsZSwKLQkJICAiXHRbJTRsZF0gK2Jhc2VbJTRsZF0gJTA0bHggJXMgLS0gJXNcbiIsIAotCQkgIChsb25nKSBpLCAobG9uZykgKGkgKyBlZHQuYmFzZSksIGVhdF9tZW1iZXIsCi0JCSAgIkZvcndhcmRlciBSVkEiLCBkYXRhICsgZWF0X21lbWJlciArIGFkaik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFNob3VsZCBsb2NhdGUgYSBmdW5jdGlvbiBkZXNjcmlwdG9yIGluIHRoZSByZWxkYXRhIHNlY3Rpb24gKi8KLQkgIGZwcmludGYoZmlsZSwKLQkJICAiXHRbJTRsZF0gK2Jhc2VbJTRsZF0gJTA0bHggJXNcbiIsIAotCQkgIChsb25nKSBpLCAobG9uZykgKGkgKyBlZHQuYmFzZSksIGVhdF9tZW1iZXIsICJFeHBvcnQgUlZBIik7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgRXhwb3J0IE5hbWUgUG9pbnRlciBUYWJsZSBpcyBwYWlyZWQgd2l0aCB0aGUgRXhwb3J0IE9yZGluYWwgVGFibGUgKi8KLSAgLyogRHVtcCB0aGVtIGluIHBhcmFsbGVsIGZvciBjbGFyaXR5ICovCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlxuW09yZGluYWwvTmFtZSBQb2ludGVyXSBUYWJsZVxuIikpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBlZHQubnVtX25hbWVzOyArK2kpCi0gICAgewotICAgICAgYmZkX3ZtYSBuYW1lX3B0ciA9IGJmZF9nZXRfMzIoYWJmZCwgCi0JCQkJICAgIGRhdGEgKyAKLQkJCQkgICAgZWR0Lm5wdF9hZGRyCi0JCQkJICAgICsgKGkqNCkgKyBhZGopOwotICAgICAgCi0gICAgICBjaGFyICpuYW1lID0gKGNoYXIgKikgZGF0YSArIG5hbWVfcHRyICsgYWRqOwotCi0gICAgICBiZmRfdm1hIG9yZCA9IGJmZF9nZXRfMTYoYWJmZCwgCi0JCQkJICAgIGRhdGEgKyAKLQkJCQkgICAgZWR0Lm90X2FkZHIKLQkJCQkgICAgKyAoaSoyKSArIGFkaik7Ci0gICAgICBmcHJpbnRmKGZpbGUsCi0JICAgICAgIlx0WyU0bGRdICVzXG4iLCAobG9uZykgb3JkLCBuYW1lKTsKLQotICAgIH0KLQotICBmcmVlIChkYXRhKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBlX3ByaW50X3BkYXRhIChhYmZkLCB2ZmlsZSkKLSAgICAgYmZkICAqYWJmZDsKLSAgICAgUFRSIHZmaWxlOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgdmZpbGU7Ci0gIGJmZF9ieXRlICpkYXRhID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5wZGF0YSIpOwotICBiZmRfc2l6ZV90eXBlIGRhdGFzaXplID0gMDsKLSAgYmZkX3NpemVfdHlwZSBpOwotICBiZmRfc2l6ZV90eXBlIHN0YXJ0LCBzdG9wOwotICBpbnQgb25hbGluZSA9IDIwOwotCi0gIGlmIChzZWN0aW9uID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3RvcCA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoKHN0b3AgJSBvbmFsaW5lKSAhPSAwKQotICAgIGZwcmludGYgKGZpbGUsIF8oIldhcm5pbmcsIC5wZGF0YSBzZWN0aW9uIHNpemUgKCVsZCkgaXMgbm90IGEgbXVsdGlwbGUgb2YgJWRcbiIpLAotCSAgICAgKGxvbmcpc3RvcCwgb25hbGluZSk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiXG5UaGUgRnVuY3Rpb24gVGFibGUgKGludGVycHJldGVkIC5wZGF0YSBzZWN0aW9uIGNvbnRlbnRzKVxuIikpOwotICBmcHJpbnRmKGZpbGUsCi0JICBfKCIgdm1hOlx0XHRCZWdpbiAgICBFbmQgICAgICBFSCAgICAgICBFSCAgICAgICBQcm9sb2dFbmRcbiIpKTsKLSAgZnByaW50ZihmaWxlLAotCSAgXygiICAgICBcdFx0QWRkcmVzcyAgQWRkcmVzcyAgSGFuZGxlciAgRGF0YSAgICAgQWRkcmVzc1xuIikpOwotCi0gIGlmIChiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotICBkYXRhc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoZGF0YSA9PSBOVUxMICYmIGRhdGFzaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgCi0JCQkgICAgc2VjdGlvbiwgCi0JCQkgICAgKFBUUikgZGF0YSwgMCwgCi0JCQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotCi0gIHN0YXJ0ID0gMDsKLQotICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gb25hbGluZSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGJlZ2luX2FkZHI7Ci0gICAgICBiZmRfdm1hIGVuZF9hZGRyOwotICAgICAgYmZkX3ZtYSBlaF9oYW5kbGVyOwotICAgICAgYmZkX3ZtYSBlaF9kYXRhOwotICAgICAgYmZkX3ZtYSBwcm9sb2dfZW5kX2FkZHI7Ci0KLSAgICAgIGlmIChpKzIwID4gc3RvcCkKLQkgIGJyZWFrOwotICAgICAgCi0gICAgICBiZWdpbl9hZGRyID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2kpOwotICAgICAgZW5kX2FkZHIgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGEraSs0KTsKLSAgICAgIGVoX2hhbmRsZXIgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGEraSs4KTsKLSAgICAgIGVoX2RhdGEgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGEraSsxMik7Ci0gICAgICBwcm9sb2dfZW5kX2FkZHIgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGEraSsxNik7Ci0gICAgICAKLSAgICAgIGlmIChiZWdpbl9hZGRyID09IDAgJiYgZW5kX2FkZHIgPT0gMCAmJiBlaF9oYW5kbGVyID09IDAKLQkgICYmIGVoX2RhdGEgPT0gMCAmJiBwcm9sb2dfZW5kX2FkZHIgPT0gMCkKLQl7Ci0JICAvKiBXZSBhcmUgcHJvYmFibHkgaW50byB0aGUgcGFkZGluZyBvZiB0aGUKLQkgICAgIHNlY3Rpb24gbm93ICovCi0JICBicmVhazsKLQl9Ci0KLSAgICAgIGZwcmludGYgKGZpbGUsCi0JICAgICAgICIgJTA4bHhcdCIsIAotCSAgICAgICAodW5zaWduZWQgbG9uZyBpbnQpIChpICsgc2VjdGlvbi0+dm1hKSk7Ci0KLSAgICAgIGZwcmludGYoZmlsZSwgIiUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4IiwKLQkgICAgICBiZWdpbl9hZGRyLAotCSAgICAgIGVuZF9hZGRyLAotCSAgICAgIGVoX2hhbmRsZXIsCi0JICAgICAgZWhfZGF0YSwKLQkgICAgICBwcm9sb2dfZW5kX2FkZHIpOwotCi0jaWZkZWYgUE9XRVJQQ19MRV9QRQotICAgICAgaWYgKGVoX2hhbmRsZXIgPT0gMCAmJiBlaF9kYXRhICE9IDApCi0JewotCSAgLyogU3BlY2lhbCBiaXRzIGhlcmUsIGFsdGhvdWdoIHRoZSBtZWFuaW5nIG1heSAqLwotCSAgLyogYmUgYSBsaXR0bGUgbXlzdGVyaW91cy4gVGhlIG9ubHkgb25lIEkga25vdyAqLwotCSAgLyogZm9yIHN1cmUgaXMgMHgwMy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgLyogQ29kZSBTaWduaWZpY2FuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgLyogMHgwMCBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgLyogMHgwMSBSZWdpc3RlciBTYXZlIE1pbGxpY29kZSAgICAgICAgICAgICAgICAqLwotCSAgLyogMHgwMiBSZWdpc3RlciBSZXN0b3JlIE1pbGxpY29kZSAgICAgICAgICAgICAqLwotCSAgLyogMHgwMyBHbHVlIENvZGUgU2VxdWVuY2UgICAgICAgICAgICAgICAgICAgICAqLwotCSAgc3dpdGNoIChlaF9kYXRhKQotCSAgICB7Ci0JICAgIGNhc2UgMHgwMToKLQkgICAgICBmcHJpbnRmKGZpbGUsIF8oIiBSZWdpc3RlciBzYXZlIG1pbGxpY29kZSIpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweDAyOgotCSAgICAgIGZwcmludGYoZmlsZSwgXygiIFJlZ2lzdGVyIHJlc3RvcmUgbWlsbGljb2RlIikpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDB4MDM6Ci0JICAgICAgZnByaW50ZihmaWxlLCBfKCIgR2x1ZSBjb2RlIHNlcXVlbmNlIikpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotI2VuZGlmCSAgIAotICAgICAgZnByaW50ZihmaWxlLCAiXG4iKTsKLSAgICB9Ci0KLSAgZnJlZSAoZGF0YSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICp0YmxbNl0gPQotewotIkFCU09MVVRFIiwKLSJISUdIIiwKLSJMT1ciLAotIkhJR0hMT1ciLAotIkhJR0hBREoiLAotIk1JUFNfSk1QQUREUiIKLX07Ci0KLXN0YXRpYyBib29sZWFuCi1wZV9wcmludF9yZWxvYyAoYWJmZCwgdmZpbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHZmaWxlOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgdmZpbGU7Ci0gIGJmZF9ieXRlICpkYXRhID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yZWxvYyIpOwotICBiZmRfc2l6ZV90eXBlIGRhdGFzaXplID0gMDsKLSAgYmZkX3NpemVfdHlwZSBpOwotICBiZmRfc2l6ZV90eXBlIHN0YXJ0LCBzdG9wOwotCi0gIGlmIChzZWN0aW9uID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiXG5cblBFIEZpbGUgQmFzZSBSZWxvY2F0aW9ucyAoaW50ZXJwcmV0ZWQgLnJlbG9jIHNlY3Rpb24gY29udGVudHMpXG4iKSk7Ci0KLSAgZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSk7Ci0gIGRhdGFzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0gIGlmIChkYXRhID09IE5VTEwgJiYgZGF0YXNpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCAKLQkJCSAgICBzZWN0aW9uLCAKLQkJCSAgICAoUFRSKSBkYXRhLCAwLCAKLQkJCSAgICBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSk7Ci0KLSAgc3RhcnQgPSAwOwotCi0gIHN0b3AgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLQotICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0b3A7KQotICAgIHsKLSAgICAgIGludCBqOwotICAgICAgYmZkX3ZtYSB2aXJ0dWFsX2FkZHJlc3M7Ci0gICAgICBsb25nIG51bWJlciwgc2l6ZTsKLQotICAgICAgLyogVGhlIC5yZWxvYyBzZWN0aW9uIGlzIGEgc2VxdWVuY2Ugb2YgYmxvY2tzLCB3aXRoIGEgaGVhZGVyIGNvbnNpc3RpbmcKLQkgb2YgdHdvIDMyIGJpdCBxdWFudGl0aWVzLCBmb2xsb3dlZCBieSBhIG51bWJlciBvZiAxNiBiaXQgZW50cmllcyAqLwotCi0gICAgICB2aXJ0dWFsX2FkZHJlc3MgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGEraSk7Ci0gICAgICBzaXplID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krNCk7Ci0gICAgICBudW1iZXIgPSAoc2l6ZSAtIDgpIC8gMjsKLQotICAgICAgaWYgKHNpemUgPT0gMCkgCi0JewotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBmcHJpbnRmIChmaWxlLAotCSAgICAgICBfKCJcblZpcnR1YWwgQWRkcmVzczogJTA4bHggQ2h1bmsgc2l6ZSAlbGQgKDB4JWx4KSBOdW1iZXIgb2YgZml4dXBzICVsZFxuIiksCi0JICAgICAgIHZpcnR1YWxfYWRkcmVzcywgc2l6ZSwgc2l6ZSwgbnVtYmVyKTsKLQotICAgICAgZm9yIChqID0gMDsgaiA8IG51bWJlcjsgKytqKQotCXsKLQkgIHVuc2lnbmVkIHNob3J0IGUgPSBiZmRfZ2V0XzE2KGFiZmQsIGRhdGEgKyBpICsgOCArIGoqMik7Ci0JICBpbnQgdCA9ICAgKGUgJiAweEYwMDApID4+IDEyOwotCSAgaW50IG9mZiA9IGUgJiAweDBGRkY7Ci0KLQkgIGlmICh0ID4gNSkgCi0JICAgIGFib3J0KCk7Ci0KLQkgIGZwcmludGYoZmlsZSwKLQkJICBfKCJcdHJlbG9jICU0ZCBvZmZzZXQgJTR4IFslNGx4XSAlc1xuIiksIAotCQkgIGosIG9mZiwgKGxvbmcpIChvZmYgKyB2aXJ0dWFsX2FkZHJlc3MpLCB0YmxbdF0pOwotCSAgCi0JfQotICAgICAgaSArPSBzaXplOwotICAgIH0KLQotICBmcmVlIChkYXRhKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHZmaWxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiB2ZmlsZTsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOwotICBpbnQgajsKLSAgcGVfZGF0YV90eXBlICpwZSA9IHBlX2RhdGEgKGFiZmQpOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqaSA9ICZwZS0+cGVfb3B0aGRyOwotCi0gIC8qIFRoZSBNUyBkdW1wYmluIHByb2dyYW0gcmVwb3J0ZWRseSBhbmRzIHdpdGggMHhmZjBmIGJlZm9yZQotICAgICBwcmludGluZyB0aGUgY2hhcmFjdGVyaXN0aWNzIGZpZWxkLiAgTm90IHN1cmUgd2h5LiAgTm8gcmVhc29uIHRvCi0gICAgIGVtdWxhdGUgaXQgaGVyZS4gICovCi0gIGZwcmludGYgKGZpbGUsIF8oIlxuQ2hhcmFjdGVyaXN0aWNzIDB4JXhcbiIpLCBwZS0+cmVhbF9mbGFncyk7Ci0jdW5kZWYgUEYKLSNkZWZpbmUgUEYoeCwgeSkgICAgaWYgKHBlLT5yZWFsX2ZsYWdzICYgeCkgeyBmcHJpbnRmIChmaWxlLCAiXHQlc1xuIiwgeSk7IH0KLSAgUEYgKEZfUkVMRkxHLCAicmVsb2NhdGlvbnMgc3RyaXBwZWQiKTsKLSAgUEYgKEZfRVhFQywgImV4ZWN1dGFibGUiKTsKLSAgUEYgKEZfTE5OTywgImxpbmUgbnVtYmVycyBzdHJpcHBlZCIpOwotICBQRiAoRl9MU1lNUywgInN5bWJvbHMgc3RyaXBwZWQiKTsKLSAgUEYgKDB4ODAsICJsaXR0bGUgZW5kaWFuIik7Ci0gIFBGIChGX0FSMzJXUiwgIjMyIGJpdCB3b3JkcyIpOwotICBQRiAoMHgyMDAsICJkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gcmVtb3ZlZCIpOwotICBQRiAoMHgxMDAwLCAic3lzdGVtIGZpbGUiKTsKLSAgUEYgKEZfRExMLCAiRExMIik7Ci0gIFBGICgweDgwMDAsICJiaWcgZW5kaWFuIik7Ci0jdW5kZWYgUEYKLQotICBmcHJpbnRmIChmaWxlLCJcbkltYWdlQmFzZVx0XHQiKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGktPkltYWdlQmFzZSk7Ci0gIGZwcmludGYgKGZpbGUsIlxuU2VjdGlvbkFsaWdubWVudFx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5TZWN0aW9uQWxpZ25tZW50KTsKLSAgZnByaW50ZiAoZmlsZSwiXG5GaWxlQWxpZ25tZW50XHRcdCIpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+RmlsZUFsaWdubWVudCk7Ci0gIGZwcmludGYgKGZpbGUsIlxuTWFqb3JPU3lzdGVtVmVyc2lvblx0JWRcbiIsIGktPk1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbik7Ci0gIGZwcmludGYgKGZpbGUsIk1pbm9yT1N5c3RlbVZlcnNpb25cdCVkXG4iLCBpLT5NaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBmcHJpbnRmIChmaWxlLCJNYWpvckltYWdlVmVyc2lvblx0JWRcbiIsIGktPk1ham9ySW1hZ2VWZXJzaW9uKTsKLSAgZnByaW50ZiAoZmlsZSwiTWlub3JJbWFnZVZlcnNpb25cdCVkXG4iLCBpLT5NaW5vckltYWdlVmVyc2lvbik7Ci0gIGZwcmludGYgKGZpbGUsIk1ham9yU3Vic3lzdGVtVmVyc2lvblx0JWRcbiIsIGktPk1ham9yU3Vic3lzdGVtVmVyc2lvbik7Ci0gIGZwcmludGYgKGZpbGUsIk1pbm9yU3Vic3lzdGVtVmVyc2lvblx0JWRcbiIsIGktPk1pbm9yU3Vic3lzdGVtVmVyc2lvbik7Ci0gIGZwcmludGYgKGZpbGUsIlJlc2VydmVkMVx0XHQlMDhseFxuIiwgaS0+UmVzZXJ2ZWQxKTsKLSAgZnByaW50ZiAoZmlsZSwiU2l6ZU9mSW1hZ2VcdFx0JTA4bHhcbiIsIGktPlNpemVPZkltYWdlKTsKLSAgZnByaW50ZiAoZmlsZSwiU2l6ZU9mSGVhZGVyc1x0XHQlMDhseFxuIiwgaS0+U2l6ZU9mSGVhZGVycyk7Ci0gIGZwcmludGYgKGZpbGUsIkNoZWNrU3VtXHRcdCUwOGx4XG4iLCBpLT5DaGVja1N1bSk7Ci0gIGZwcmludGYgKGZpbGUsIlN1YnN5c3RlbVx0XHQlMDh4XG4iLCBpLT5TdWJzeXN0ZW0pOwotICBmcHJpbnRmIChmaWxlLCJEbGxDaGFyYWN0ZXJpc3RpY3NcdCUwOHhcbiIsIGktPkRsbENoYXJhY3RlcmlzdGljcyk7Ci0gIGZwcmludGYgKGZpbGUsIlNpemVPZlN0YWNrUmVzZXJ2ZVx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5TaXplT2ZTdGFja1Jlc2VydmUpOwotICBmcHJpbnRmIChmaWxlLCJcblNpemVPZlN0YWNrQ29tbWl0XHQiKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGktPlNpemVPZlN0YWNrQ29tbWl0KTsKLSAgZnByaW50ZiAoZmlsZSwiXG5TaXplT2ZIZWFwUmVzZXJ2ZVx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5TaXplT2ZIZWFwUmVzZXJ2ZSk7Ci0gIGZwcmludGYgKGZpbGUsIlxuU2l6ZU9mSGVhcENvbW1pdFx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5TaXplT2ZIZWFwQ29tbWl0KTsKLSAgZnByaW50ZiAoZmlsZSwiXG5Mb2FkZXJGbGFnc1x0XHQlMDhseFxuIiwgaS0+TG9hZGVyRmxhZ3MpOwotICBmcHJpbnRmIChmaWxlLCJOdW1iZXJPZlJ2YUFuZFNpemVzXHQlMDhseFxuIiwgaS0+TnVtYmVyT2ZSdmFBbmRTaXplcyk7Ci0KLSAgZnByaW50ZiAoZmlsZSwiXG5UaGUgRGF0YSBEaXJlY3RvcnlcbiIpOwotICBmb3IgKGogPSAwOyBqIDwgSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVM7IGorKykgCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsZSwgIkVudHJ5ICUxeCAiLCBqKTsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBpLT5EYXRhRGlyZWN0b3J5W2pdLlZpcnR1YWxBZGRyZXNzKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgJTA4bHggIiwgaS0+RGF0YURpcmVjdG9yeVtqXS5TaXplKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIlc1xuIiwgZGlyX25hbWVzW2pdKTsKLSAgICB9Ci0KLSAgcGVfcHJpbnRfaWRhdGEgKGFiZmQsIHZmaWxlKTsKLSAgcGVfcHJpbnRfZWRhdGEgKGFiZmQsIHZmaWxlKTsKLSAgcGVfcHJpbnRfcGRhdGEgKGFiZmQsIHZmaWxlKTsKLSAgcGVfcHJpbnRfcmVsb2MgKGFiZmQsIHZmaWxlKTsKLQotICBpZiAocGVfc2F2ZWRfY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZwdXRjICgnXG4nLCBmaWxlKTsKLSAgCi0gICAgICByZXR1cm4gcGVfc2F2ZWRfY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgdmZpbGUpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBlX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICBwZV9kYXRhX3R5cGUgKnBlOwotICBhYmZkLT50ZGF0YS5wZV9vYmpfZGF0YSA9IAotICAgIChzdHJ1Y3QgcGVfdGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChwZV9kYXRhX3R5cGUpKTsKLQotICBpZiAoYWJmZC0+dGRhdGEucGVfb2JqX2RhdGEgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcGUgPSBwZV9kYXRhIChhYmZkKTsKLQotICBwZS0+Y29mZi5wZSA9IDE7Ci0gIHBlLT5pbl9yZWxvY19wID0gaW5fcmVsb2NfcDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgQ09GRiBiYWNrZW5kIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KLXN0YXRpYyBQVFIKLXBlX21rb2JqZWN0X2hvb2sgKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotICAgICBQVFIgYW91dGhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLSAgcGVfZGF0YV90eXBlICpwZTsKLQotICBpZiAocGVfbWtvYmplY3QgKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiBOVUxMOwotCi0gIHBlID0gcGVfZGF0YSAoYWJmZCk7Ci0gIHBlLT5jb2ZmLnN5bV9maWxlcG9zID0gaW50ZXJuYWxfZi0+Zl9zeW1wdHI7Ci0gIC8qIFRoZXNlIG1lbWJlcnMgY29tbXVuaWNhdGUgaW1wb3J0YW50IGNvbnN0YW50cyBhYm91dCB0aGUgc3ltYm9sCi0gICAgIHRhYmxlIHRvIEdEQidzIHN5bWJvbC1yZWFkaW5nIGNvZGUuICBUaGVzZSBgY29uc3RhbnRzJwotICAgICB1bmZvcnR1bmF0ZWx5IHZhcnkgYW1vbmcgY29mZiBpbXBsZW1lbnRhdGlvbnMuLi4gICovCi0gIHBlLT5jb2ZmLmxvY2FsX25fYnRtYXNrID0gTl9CVE1BU0s7Ci0gIHBlLT5jb2ZmLmxvY2FsX25fYnRzaGZ0ID0gTl9CVFNIRlQ7Ci0gIHBlLT5jb2ZmLmxvY2FsX25fdG1hc2sgPSBOX1RNQVNLOwotICBwZS0+Y29mZi5sb2NhbF9uX3RzaGlmdCA9IE5fVFNISUZUOwotICBwZS0+Y29mZi5sb2NhbF9zeW1lc3ogPSBTWU1FU1o7Ci0gIHBlLT5jb2ZmLmxvY2FsX2F1eGVzeiA9IEFVWEVTWjsKLSAgcGUtPmNvZmYubG9jYWxfbGluZXN6ID0gTElORVNaOwotCi0gIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9Ci0gICAgb2JqX2NvbnZfdGFibGVfc2l6ZSAoYWJmZCkgPQotICAgICAgaW50ZXJuYWxfZi0+Zl9uc3ltczsKLQotICBwZS0+cmVhbF9mbGFncyA9IGludGVybmFsX2YtPmZfZmxhZ3M7Ci0KLSAgaWYgKChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9ETEwpICE9IDApCi0gICAgcGUtPmRsbCA9IDE7Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgaWYgKGFvdXRoZHIpIAotICAgIHBlLT5wZV9vcHRoZHIgPSAoKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopYW91dGhkciktPnBlOwotI2VuZGlmCi0KLSNpZmRlZiBBUk0gCi0gIGlmICghIF9iZmRfY29mZl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGludGVybmFsX2YtPmZfZmxhZ3MpKQotICAgIGNvZmZfZGF0YSAoYWJmZCkgLT5mbGFncyA9IDA7Ci0jZW5kaWYKLSAgCi0gIHJldHVybiAoUFRSKSBwZTsKLX0KLQotCi0KLS8qIENvcHkgYW55IHByaXZhdGUgaW5mbyB3ZSB1bmRlcnN0YW5kIGZyb20gdGhlIGlucHV0IGJmZAotICAgdG8gdGhlIG91dHB1dCBiZmQuICAqLwotCi0jaWZkZWYgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi1zdGF0aWMgYm9vbGVhbiAoKnBlX3NhdmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSkKLSAgICAgUEFSQU1TICgoYmZkICosIGJmZCAqKSkKLSAgICAgPSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGE7Ci0jdW5kZWYgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZWxzZQotc3RhdGljIGJvb2xlYW4gKCpwZV9zYXZlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpCi0gICAgID0gTlVMTDsKLSNlbmRpZgotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgcGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotCi1zdGF0aWMgYm9vbGVhbgotcGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkLCAqb2JmZDsKLXsKLSAgLyogT25lIGRheSB3ZSBtYXkgdHJ5IHRvIGdyb2sgb3RoZXIgcHJpdmF0ZSBkYXRhLiAgKi8KLSAgaWYgKGliZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IG9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcGVfZGF0YSAob2JmZCktPnBlX29wdGhkciA9IHBlX2RhdGEgKGliZmQpLT5wZV9vcHRoZHI7Ci0gIHBlX2RhdGEgKG9iZmQpLT5kbGwgPSBwZV9kYXRhIChpYmZkKS0+ZGxsOwotCi0gIGlmIChwZV9zYXZlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpCi0gICAgcmV0dXJuIHBlX3NhdmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCk7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotCi0vKiBDb3B5IHByaXZhdGUgc2VjdGlvbiBkYXRhLiAgKi8KLQotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIHBlX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0KLXN0YXRpYyBib29sZWFuIHBlX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmQgKiwgYXNlY3Rpb24gKikpOwotCi1zdGF0aWMgYm9vbGVhbgotcGVfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMsIG9iZmQsIG9zZWMpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKmlzZWM7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXNlY3Rpb24gKm9zZWM7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlYykgIT0gTlVMTAotICAgICAgJiYgcGVpX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlYykgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpID09IE5VTEwpCi0JewotCSAgb3NlYy0+dXNlZF9ieV9iZmQgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChvYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChvc2VjLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKHBlaV9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpID09IE5VTEwpCi0JewotCSAgY29mZl9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpLT50ZGF0YSA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKG9iZmQsIHNpemVvZiAoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhKSk7Ci0JICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpLT50ZGF0YSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgcGVpX3NlY3Rpb25fZGF0YSAob2JmZCwgb3NlYyktPnZpcnRfc2l6ZSA9Ci0JcGVpX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlYyktPnZpcnRfc2l6ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL3BvL01ha2UtaW4gYi9iZmQvcG8vTWFrZS1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MmRiMS4uMDAwMDAwMAotLS0gYS9iZmQvcG8vTWFrZS1pbgorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBwcm9ncmFtIHNvdXJjZSBkaXJlY3RvcnkgaW4gR05VIE5MUyB1dGlsaXRpZXMgcGFja2FnZS4KLSMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi1QQUNLQUdFID0gQFBBQ0tBR0VACi1WRVJTSU9OID0gQFZFUlNJT05ACi0KLVNIRUxMID0gL2Jpbi9zaAotQFNFVF9NQUtFQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1kYXRhZGlyID0gJChwcmVmaXgpL0BEQVRBRElSTkFNRUAKLWxvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCi1nbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCi1nZXR0ZXh0c3JjZGlyID0gJChwcmVmaXgpL3NoYXJlL2dldHRleHQvcG8KLXN1YmRpciA9IHBvCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi0KLUNDID0gQENDQAotR0VOQ0FUID0gQEdFTkNBVEAKLUdNU0dGTVQgPSBQQVRIPS4uL3NyYzokJFBBVEggQEdNU0dGTVRACi1NU0dGTVQgPSBATVNHRk1UQAotWEdFVFRFWFQgPSBQQVRIPS4uL3NyYzokJFBBVEggQFhHRVRURVhUQAotTVNHTUVSR0UgPSBQQVRIPS4uL3NyYzokJFBBVEggbXNnbWVyZ2UKLQotREVGUyA9IEBERUZTQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotCi1JTkNMVURFUyA9IC1JLi4gLUkkKHRvcF9zcmNkaXIpL2ludGwKLQotQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKLQotU09VUkNFUyA9IGNhdC1pZC10YmwuYwotUE9GSUxFUyA9IEBQT0ZJTEVTQAotR01PRklMRVMgPSBAR01PRklMRVNACi1ESVNURklMRVMgPSBDaGFuZ2VMb2cgTWFrZWZpbGUuaW4uaW4gUE9URklMRVMuaW4gJChQQUNLQUdFKS5wb3QgXAotc3RhbXAtY2F0LWlkICQoUE9GSUxFUykgJChHTU9GSUxFUykgJChTT1VSQ0VTKQotCi1QT1RGSUxFUyA9IFwKLQotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5wbyAucG94IC5nbW8gLm1vIC5tc2cgLmNhdAotCi0uYy5vOgotCSQoQ09NUElMRSkgJDwKLQotLnBvLnBveDoKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JJChNU0dNRVJHRSkgJDwgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IC1vICQqLnBveAotCi0ucG8ubW86Ci0JJChNU0dGTVQpIC1vICRAICQ8Ci0KLS5wby5nbW86Ci0JZmlsZT0kKHNyY2RpcikvYGVjaG8gJCogfCBzZWQgJ3MsLiovLCwnYC5nbW8gXAotCSAgJiYgcm0gLWYgJCRmaWxlICYmICQoR01TR0ZNVCkgLW8gJCRmaWxlICQ8Ci0KLS5wby5jYXQ6Ci0Jc2VkIC1mIC4uL2ludGwvcG8ybXNnLnNlZCA8ICQ8ID4gJCoubXNnIFwKLQkgICYmIHJtIC1mICRAICYmICQoR0VOQ0FUKSAkQCAkKi5tc2cKLQotCi1hbGw6IGFsbC1AVVNFX05MU0AKLQotYWxsLXllczogJChDQVRBTE9HUykgQE1BSU5UQCAkKFBBQ0tBR0UpLnBvdAotYWxsLW5vOgotCi0kKHNyY2RpcikvJChQQUNLQUdFKS5wb3Q6ICQoUE9URklMRVMpCi0JJChYR0VUVEVYVCkgLS1kZWZhdWx0LWRvbWFpbj0kKFBBQ0tBR0UpIC0tZGlyZWN0b3J5PSQodG9wX3NyY2RpcikgXAotCSAgLS1hZGQtY29tbWVudHMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKLQkgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4KLQlybSAtZiAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQltdiAkKFBBQ0tBR0UpLnBvICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCi0kKHNyY2RpcikvY2F0LWlkLXRibC5jOiBzdGFtcC1jYXQtaWQ7IEA6Ci0kKHNyY2Rpcikvc3RhbXAtY2F0LWlkOiAkKFBBQ0tBR0UpLnBvdAotCXJtIC1mIGNhdC1pZC10YmwudG1wCi0Jc2VkIC1mIC4uL2ludGwvcG8ydGJsLnNlZCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgXAotCQl8IHNlZCAtZSAicy9AUEFDS0FHRSBOQU1FQC8kKFBBQ0tBR0UpLyIgPiBjYXQtaWQtdGJsLnRtcAotCWlmIGNtcCAtcyBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyB0aGVuIFwKLQkgIHJtIGNhdC1pZC10YmwudG1wOyBcCi0JZWxzZSBcCi0JICBlY2hvIGNhdC1pZC10YmwuYyBjaGFuZ2VkOyBcCi0JICBybSAtZiAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JICBtdiBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JZmkKLQljZCAkKHNyY2RpcikgJiYgcm0gLWYgc3RhbXAtY2F0LWlkICYmIGVjaG8gdGltZXN0YW1wID4gc3RhbXAtY2F0LWlkCi0KLQotaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQotaW5zdGFsbC1leGVjOgotaW5zdGFsbC1pbmZvOgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtQFVTRV9OTFNACi1pbnN0YWxsLWRhdGEtbm86IGFsbAotaW5zdGFsbC1kYXRhLXllczogYWxsCi0JaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICQoTUtJTlNUQUxMRElSUykgJChkYXRhZGlyKTsgXAotCWVsc2UgXAotCSAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZGF0YWRpcik7IFwKLQlmaQotCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgY2FzZSAiJCRjYXQiIGluIFwKLQkgICAgKi5nbW8pIGRlc3RkaXI9JChnbnVsb2NhbGVkaXIpOzsgXAotCSAgICAqKSAgICAgZGVzdGRpcj0kKGxvY2FsZWRpcik7OyBcCi0JICBlc2FjOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIGRpcj0kJGRlc3RkaXIvJCRsYW5nL0xDX01FU1NBR0VTOyBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQkZGlyOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQkZGlyOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0IGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZWxzZSBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0Lm07IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQubSAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQubSBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgZWxzZSBcCi0JICAgIGlmIHRlc3QgLXIgJChzcmNkaXIpLyQkY2F0Lm0gOyB0aGVuIFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0Lm0gXAotCQkkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICAgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5pbiBcCi0JCQkgICQoZ2V0dGV4dHNyY2RpcikvTWFrZWZpbGUuaW4uaW47IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQotIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgotaW5zdGFsbGNoZWNrOgotCi11bmluc3RhbGw6Ci0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQlkb25lCi0Jcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS9wby1NYWtlZmlsZS5pbi5pbgotCi1jaGVjazogYWxsCi0KLWNhdC1pZC10YmwubzogLi4vaW50bC9saWJnZXR0ZXh0LmgKLQotZHZpIGluZm8gdGFncyBUQUdTIElEOgotCi1tb3N0bHljbGVhbjoKLQlybSAtZiBjb3JlIGNvcmUuKiAqLnBveCAkKFBBQ0tBR0UpLnBvICoub2xkLnBvIGNhdC1pZC10YmwudG1wCi0Jcm0gLWZyICoubwotCi1jbGVhbjogbW9zdGx5Y2xlYW4KLQotZGlzdGNsZWFuOiBjbGVhbgotCXJtIC1mIE1ha2VmaWxlIE1ha2VmaWxlLmluIFBPVEZJTEVTICoubW8gKi5tc2cgKi5jYXQgKi5jYXQubQotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQlybSAtZiAkKEdNT0ZJTEVTKQotCi1kaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotZGlzdCBkaXN0ZGlyOiB1cGRhdGUtcG8gJChESVNURklMRVMpCi0JZGlzdHM9IiQoRElTVEZJTEVTKSI7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCi0JZG9uZQotCi11cGRhdGUtcG86IE1ha2VmaWxlCi0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCVBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgXAotCWNkICQoc3JjZGlyKTsgXAotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIG12ICQkbGFuZy5wbyAkJGxhbmcub2xkLnBvOyBcCi0JICBlY2hvICIkJGxhbmc6IjsgXAotCSAgaWYgJChNU0dNRVJHRSkgJCRsYW5nLm9sZC5wbyAkKFBBQ0tBR0UpLnBvdCAtbyAkJGxhbmcucG87IHRoZW4gXAotCSAgICBybSAtZiAkJGxhbmcub2xkLnBvOyBcCi0JICBlbHNlIFwKLQkgICAgZWNobyAibXNnbWVyZ2UgZm9yICQkY2F0IGZhaWxlZCEiOyBcCi0JICAgIHJtIC1mICQkbGFuZy5wbzsgXAotCSAgICBtdiAkJGxhbmcub2xkLnBvICQkbGFuZy5wbzsgXAotCSAgZmk7IFwKLQlkb25lCi0KLVBPVEZJTEVTOiBQT1RGSUxFUy5pbgotCSggaWYgdGVzdCAneCQoc3JjZGlyKScgIT0gJ3guJzsgdGhlbiBcCi0JICAgIHBvc3JjcHJlZml4PSckKHRvcF9zcmNkaXIpLyc7IFwKLQkgIGVsc2UgXAotCSAgICBwb3NyY3ByZWZpeD0iLi4vIjsgXAotCSAgZmk7IFwKLQkgIHJtIC1mICRALXQgJEAgXAotCSAgICAmJiAoc2VkIC1lICcvXiMvZCcgLWUgJy9eWyAJXSokJC9kJyBcCi0JCSAgICAtZSAic0AuKkAJJCRwb3NyY3ByZWZpeCYgXFxcXEAiIDwgJChzcmNkaXIpLyRALmluIFwKLQkJfCBzZWQgLWUgJyQkcy9cXCQkLy8nKSA+ICRALXQgXAotCSAgICAmJiBjaG1vZCBhLXcgJEAtdCBcCi0JICAgICYmIG12ICRALXQgJEAgKQotCi1QT1RGSUxFUy5pbjogQE1BSU5UQCAuLi9NYWtlZmlsZQotCWNkIC4uICYmICQoTUFLRSkgcG8vUE9URklMRVMuaW4KLQotTWFrZWZpbGU6IE1ha2UtaW4gLi4vY29uZmlnLnN0YXR1cyBQT1RGSUxFUwotCWNkIC4uIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvTWFrZWZpbGUuaW46JChzdWJkaXIpL01ha2UtaW4gXAotCSAgICAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9iZmQvcG8vUE9URklMRVMuaW4gYi9iZmQvcG8vUE9URklMRVMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNDk5NjYuLjAwMDAwMDAKLS0tIGEvYmZkL3BvL1BPVEZJTEVTLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLWFyY2h1cmVzLmMKLWJmZC1pbjIuaAotYWl4Mzg2LWNvcmUuYwotYW91dC1hZG9iZS5jCi1hb3V0LWFybS5jCi1hb3V0LWVuY2FwLmMKLWFvdXQtbnMzMmsuYwotYW91dC1zcGFyY2xlLmMKLWFvdXQtdGFyZ2V0LmgKLWFvdXQtdGljMzAuYwotYW91dDAuYwotYW91dDMyLmMKLWFvdXQ2NC5jCi1hb3V0ZjEuaAotYW91dHguaAotYXJjaGl2ZS5jCi1iZmQtaW4uaAotYmZkLmMKLWJpbmFyeS5jCi1ib3V0LmMKLWNhY2hlLmMKLWNmLWkzODZseW54LmMKLWNmLW02OGtseW54LmMKLWNmLXNwYXJjbHlueC5jCi1jaXNjby1jb3JlLmMKLWNvZmYtYTI5ay5jCi1jb2ZmLWFscGhhLmMKLWNvZmYtYXBvbGxvLmMKLWNvZmYtYXJtLmMKLWNvZmYtYXV4LmMKLWNvZmYtZ28zMi5jCi1jb2ZmLWg4MzAwLmMKLWNvZmYtaDg1MDAuYwotY29mZi1pMzg2LmMKLWNvZmYtaTg2MC5jCi1jb2ZmLWk5NjAuYwotY29mZi1tNjhrLmMKLWNvZmYtbTg4ay5jCi1jb2ZmLW1jb3JlLmMKLWNvZmYtbWlwcy5jCi1jb2ZmLXBtYWMuYwotY29mZi1wcGMuYwotY29mZi1yczYwMDAuYwotY29mZi1zaC5jCi1jb2ZmLXNwYXJjLmMKLWNvZmYtc3RnbzMyLmMKLWNvZmYtc3ZtNjhrLmMKLWNvZmYtdGljMzAuYwotY29mZi10aWM4MC5jCi1jb2ZmLXU2OGsuYwotY29mZi13NjUuYwotY29mZi13ZTMyay5jCi1jb2ZmLXo4ay5jCi1jb2ZmY29kZS5oCi1jb2ZmZ2VuLmMKLWNvZmZsaW5rLmMKLWNvZmZzd2FwLmgKLWNwdS1tMTAzMDAuYwotY3B1LW0zMnIuYwotY3B1LW1pcHMuYwotY29yZWZpbGUuYwotY3B1LWEyOWsuYwotY3B1LWFscGhhLmMKLWNwdS1hcmMuYwotY3B1LWFybS5jCi1jcHUtZDEwdi5jCi1jcHUtZDMwdi5jCi1jcHUtZnIzMC5jCi1jcHUtaDgzMDAuYwotY3B1LWg4NTAwLmMKLWNwdS1ocHBhLmMKLWNwdS1pMzg2LmMKLWNwdS1pODYwLmMKLWNwdS1pOTYwLmMKLWNwdS1tMTAyMDAuYwotY3B1LXNoLmMKLWVsZi1tMTAzMDAuYwotY3B1LW02OGsuYwotY3B1LW04OGsuYwotY3B1LW1jb3JlLmMKLWVsZjMyLW0zMnIuYwotY3B1LW5zMzJrLmMKLWNwdS1wb3dlcnBjLmMKLWNwdS1yczYwMDAuYwotbGliYmZkLmgKLWNwdS1zcGFyYy5jCi1jcHUtdGljMzAuYwotY3B1LXRpYzgwLmMKLWNwdS12ODUwLmMKLWNwdS12YXguYwotZWxmMzItbWlwcy5jCi1jcHUtdzY1LmMKLWNwdS13ZTMyay5jCi1jcHUtejhrLmMKLWRlbW82NC5jCi1kd2FyZjEuYwotZHdhcmYyLmMKLWVjb2ZmLmMKLWVjb2ZmbGluay5jCi1lY29mZnN3YXAuaAotZWxmLWJmZC5oCi1lbGYtbTEwMjAwLmMKLWxpYmhwcGEuaAotZWxmLmMKLWVsZjMyLWFyYy5jCi1lbGYzMi1hcm0uaAotZWxmMzItZDEwdi5jCi1lbGYzMi1kMzB2LmMKLWVsZjMyLWZyMzAuYwotZWxmMzItZ2VuLmMKLWVsZjMyLWhwcGEuYwotZWxmMzItaHBwYS5oCi1lbGYzMi1pMzg2LmMKLWVsZjMyLWk4NjAuYwotcmVsb2MuYwotZWxmMzItbTY4ay5jCi1lbGYzMi1tODhrLmMKLWVsZjMyLW1jb3JlLmMKLXRhcmdldHMuYwotZWxmMzItcHBjLmMKLWVsZjMyLXNoLmMKLWVsZjMyLXNwYXJjLmMKLWVsZjMyLXY4NTAuYwotZWxmMzIuYwotZWxmNjQtYWxwaGEuYwotZWxmNjQtZ2VuLmMKLWVsZjY0LW1pcHMuYwotZWxmNjQtc3BhcmMuYwotZWxmNjQuYwotZWxmYXJtLW5hYmkuYwotZWxmYXJtLW9hYmkuYwotZWxmY29kZS5oCi1lbGZjb3JlLmgKLWVsZmxpbmsuYwotZWxmbGluay5oCi1lbGZ4eC10YXJnZXQuaAotZXBvYy1wZS1hcm0uYwotZXBvYy1wZWktYXJtLmMKLWZvcm1hdC5jCi1mcmVlYnNkLmgKLWdlbi1hb3V0LmMKLWdlbmxpbmsuaAotZ28zMnN0dWIuaAotaGFzaC5jCi1ob3N0LWFvdXQuYwotaHAzMDBic2QuYwotaHAzMDBocHV4LmMKLWhwcGFfc3R1YnMuaAotaHBwYWJzZC1jb3JlLmMKLWhwdXgtY29yZS5jCi1pMzg2YW91dC5jCi1pMzg2YnNkLmMKLWkzODZkeW5peC5jCi1pMzg2ZnJlZWJzZC5jCi1pMzg2bGludXguYwotaTM4Nmx5bnguYwotaTM4Nm1hY2gzLmMKLWkzODZtc2Rvcy5jCi1pMzg2bmV0YnNkLmMKLWkzODZvczlrLmMKLWllZWUuYwotaWhleC5jCi1pbml0LmMKLWlyaXgtY29yZS5jCi1saWJhb3V0LmgKLWxpYmJmZC1pbi5oCi1saWJiZmQuYwotbGliY29mZi1pbi5oCi1saWJjb2ZmLmgKLWxpYmVjb2ZmLmgKLWxpYmllZWUuaAotbGlibmxtLmgKLWxpYm9hc3lzLmgKLWxpbmtlci5jCi1seW54LWNvcmUuYwotbTY4azRrbmV0YnNkLmMKLW02OGtsaW51eC5jCi1tNjhrbHlueC5jCi1tNjhrbmV0YnNkLmMKLWRvYy9jaGV3LmMKLW04OGttYWNoMy5jCi1taXBzYnNkLmMKLW5ldGJzZC1jb3JlLmMKLW5ldGJzZC5oCi1uZXdzb3MzLmMKLW5sbS10YXJnZXQuaAotbmxtLmMKLW5sbTMyLWFscGhhLmMKLW5sbTMyLWkzODYuYwotbmxtMzItcHBjLmMKLW5sbTMyLXNwYXJjLmMKLW5sbTMyLmMKLW5sbTY0LmMKLW5sbWNvZGUuaAotbmxtc3dhcC5oCi1uczMyay5oCi1uczMya25ldGJzZC5jCi1vYXN5cy5jCi1vcG5jbHMuYwotb3NmLWNvcmUuYwotcGM1MzItbWFjaC5jCi1wZS1hcm0uYwotcGUtaTM4Ni5jCi1wZS1tY29yZS5jCi1wZS1wcGMuYwotcGVpLWFybS5jCi1wZWktaTM4Ni5jCi1wZWktbWNvcmUuYwotcGVpLXBwYy5jCi1wZWljb2RlLmgKLXBwY2Jvb3QuYwotcHRyYWNlLWNvcmUuYwotcmVsb2MxNi5jCi1yaXNjaXguYwotcnM2MDAwLWNvcmUuYwotc2NvNS1jb3JlLmMKLXNlY3Rpb24uYwotc29tLmMKLXNvbS5oCi1zcGFyY2xpbnV4LmMKLXNwYXJjbHlueC5jCi1zcGFyY25ldGJzZC5jCi1zcmVjLmMKLXN0YWItc3ltcy5jCi1zdGFicy5jCi1zdW5vcy5jCi1zeW1zLmMKLXN5c2RlcC5oCi10ZWtoZXguYwotdHJhZC1jb3JlLmMKLXZheG5ldGJzZC5jCi12ZXJzYWRvcy5jCi12bXMtZ3NkLmMKLXZtcy1oZHIuYwotdm1zLW1pc2MuYwotdm1zLXRpci5jCi12bXMuYwotdm1zLmgKLXhjb2ZmbGluay5jCi1ob3N0cy9hbHBoYWxpbnV4LmgKLWhvc3RzL2FscGhhdm1zLmgKLWhvc3RzL2RlY3N0YXRpb24uaAotaG9zdHMvZGVsdGE2OC5oCi1ob3N0cy9kcHgyLmgKLWhvc3RzL2hwMzAwYnNkLmgKLWhvc3RzL2kzODZic2QuaAotaG9zdHMvaTM4NmxpbnV4LmgKLWhvc3RzL2kzODZtYWNoMy5oCi1ob3N0cy9pMzg2c2NvLmgKLWhvc3RzL2k4NjBtYWNoMy5oCi1ob3N0cy9tNjhrYXV4LmgKLWhvc3RzL202OGtsaW51eC5oCi1ob3N0cy9tODhrbWFjaDMuaAotaG9zdHMvbWlwc2JzZC5oCi1ob3N0cy9taXBzbWFjaDMuaAotaG9zdHMvbmV3cy1taXBzLmgKLWhvc3RzL25ld3MuaAotaG9zdHMvcGM1MzJtYWNoLmgKLWhvc3RzL3Jpc2Nvcy5oCi1ob3N0cy9zeW1tZXRyeS5oCi1ob3N0cy90YWhvZS5oCi1ob3N0cy92YXhic2QuaAotaG9zdHMvdmF4dWx0LmgKLWhvc3RzL3ZheHVsdDIuaApkaWZmIC0tZ2l0IGEvYmZkL3BvL2JmZC5wb3QgYi9iZmQvcG8vYmZkLnBvdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmZmJiNC4uMDAwMDAwMAotLS0gYS9iZmQvcG8vYmZkLnBvdAorKysgL2Rldi9udWxsCkBAIC0xLDYzMiArMCwwIEBACi0jIFNPTUUgREVTQ1JJUFRJVkUgVElUTEUuCi0jIENvcHlyaWdodCAoQykgWUVBUiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgRklSU1QgQVVUSE9SIDxFTUFJTEBBRERSRVNTPiwgWUVBUi4KLSMKLSMsIGZ1enp5Ci1tc2dpZCAiIgotbXNnc3RyICIiCi0iUHJvamVjdC1JZC1WZXJzaW9uOiBQQUNLQUdFIFZFUlNJT05cbiIKLSJQT1QtQ3JlYXRpb24tRGF0ZTogMTk5OS0wNC0xOCAxODoyNi0wNDAwXG4iCi0iUE8tUmV2aXNpb24tRGF0ZTogWUVBUi1NTy1EQSBITzpNSStaT05FXG4iCi0iTGFzdC1UcmFuc2xhdG9yOiBGVUxMIE5BTUUgPEVNQUlMQEFERFJFU1M+XG4iCi0iTGFuZ3VhZ2UtVGVhbTogTEFOR1VBR0UgPExMQGxpLm9yZz5cbiIKLSJNSU1FLVZlcnNpb246IDEuMFxuIgotIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1DSEFSU0VUXG4iCi0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogRU5DT0RJTkdcbiIKLQotIzogYW91dC1hZG9iZS5jOjE4MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogVW5rbm93biBzZWN0aW9uIHR5cGUgaW4gYS5vdXQuYWRvYmUgZmlsZTogJXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBhb3V0eC5oOjEyMzcgYW91dHguaDoxNjUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW4gbm90IHJlcHJlc2VudCBzZWN0aW9uIGAlcycgaW4gYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGFvdXR4Lmg6MTYyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IGNhbiBub3QgcmVwcmVzZW50IHNlY3Rpb24gZm9yIHN5bWJvbCBgJXMnIGluIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBhb3V0eC5oOjE2MjMKLW1zZ2lkICIqdW5rbm93bioiCi1tc2dzdHIgIiIKLQotIzogYW91dHguaDozNjY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiByZWxvY2F0ZWFibGUgbGluayBmcm9tICVzIHRvICVzIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogYXJjaGl2ZS5jOjE3MTYKLW1zZ2lkICJXYXJuaW5nOiB3cml0aW5nIGFyY2hpdmUgd2FzIHNsb3c6IHJld3JpdGluZyB0aW1lc3RhbXBcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcmNoaXZlLmM6MTk4NwotbXNnaWQgIlJlYWRpbmcgYXJjaGl2ZSBmaWxlIG1vZCB0aW1lc3RhbXAiCi1tc2dzdHIgIiIKLQotIy4gRklYTUU6IGJmZCBjYW4ndCBjYWxsIHBlcnJvci4KLSM6IGFyY2hpdmUuYzoyMDExCi1tc2dpZCAiV3JpdGluZyB1cGRhdGVkIGFybWFwIHRpbWVzdGFtcCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzQKLW1zZ2lkICJObyBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzUKLW1zZ2lkICJTeXN0ZW0gY2FsbCBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzYKLW1zZ2lkICJJbnZhbGlkIGJmZCB0YXJnZXQiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjc3Ci1tc2dpZCAiRmlsZSBpbiB3cm9uZyBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjc4Ci1tc2dpZCAiSW52YWxpZCBvcGVyYXRpb24iCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjc5Ci1tc2dpZCAiTWVtb3J5IGV4aGF1c3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODAKLW1zZ2lkICJObyBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4MQotbXNnaWQgIkFyY2hpdmUgaGFzIG5vIGluZGV4OyBydW4gcmFubGliIHRvIGFkZCBvbmUiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjgyCi1tc2dpZCAiTm8gbW9yZSBhcmNoaXZlZCBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODMKLW1zZ2lkICJNYWxmb3JtZWQgYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODQKLW1zZ2lkICJGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODUKLW1zZ2lkICJGaWxlIGZvcm1hdCBpcyBhbWJpZ3VvdXMiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjg2Ci1tc2dpZCAiU2VjdGlvbiBoYXMgbm8gY29udGVudHMiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjg3Ci1tc2dpZCAiTm9ucmVwcmVzZW50YWJsZSBzZWN0aW9uIG9uIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODgKLW1zZ2lkICJTeW1ib2wgbmVlZHMgZGVidWcgc2VjdGlvbiB3aGljaCBkb2VzIG5vdCBleGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODkKLW1zZ2lkICJCYWQgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjkwCi1tc2dpZCAiRmlsZSB0cnVuY2F0ZWQiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjkxCi1tc2dpZCAiRmlsZSB0b28gYmlnIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI5MgotbXNnaWQgIiM8SW52YWxpZCBlcnJvciBjb2RlPiIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzo2NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmZkIGFzc2VydGlvbiBmYWlsICVzOiVkIgotbXNnc3RyICIiCi0KLSM6IGJpbmFyeS5jOjI5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBXcml0aW5nIHNlY3Rpb24gYCVzJyB0byBodWdlIChpZSBuZWdhdGl2ZSkgZmlsZSBvZmZzZXQgMHglbHguIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYTI5ay5jOjEyMQotbXNnaWQgIk1pc3NpbmcgSUhDT05TVCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWEyOWsuYzoxODEKLW1zZ2lkICJNaXNzaW5nIElISUhBTEYiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hMjlrLmM6MjEzCi1tc2dpZCAiVW5yZWNvZ25pemVkIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYTI5ay5jOjQwNgotbXNnaWQgIm1pc3NpbmcgSUhDT05TVCByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWEyOWsuYzo0OTcKLW1zZ2lkICJtaXNzaW5nIElISUhBTEYgcmVsb2MiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hbHBoYS5jOjg4MCBjb2ZmLWFscGhhLmM6OTE3Ci1tc2dpZCAiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB1c2VkIHdoZW4gR1Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hbHBoYS5jOjE0ODYgZWxmNjQtYWxwaGEuYzo0MDUxCi1tc2dpZCAidXNpbmcgbXVsdGlwbGUgZ3AgdmFsdWVzIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYWxwaGEuYzoxOTkyIGNvZmYtbWlwcy5jOjE0MzUgZWxmMzItbWlwcy5jOjUxNzUKLW1zZ2lkICJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gR1Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzo4ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuYWJsZSB0byBmaW5kIFRIVU1CIGdsdWUgJyVzJyBmb3IgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjkxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5hYmxlIHRvIGZpbmQgQVJNIGdsdWUgJyVzJyBmb3IgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjExOTIgY29mZi1hcm0uYzoxMjg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKCVzKTogd2FybmluZzogaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjExOTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBmaXJzdCBvY2N1cnJlbmNlOiAlczogYXJtIGNhbGwgdG8gdGh1bWIiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoxMjkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IHRodW1iIGNhbGwgdG8gYXJtIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MTI5MwotbXNnaWQgIiAgY29uc2lkZXIgcmVsaW5raW5nIHdpdGggLS1zdXBwb3J0LW9sZC1jb2RlIGVuYWJsZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoxNTgxIGNvZmYtdGljODAuYzo2ODIgY29mZmxpbmsuYzoyNzIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiYWQgcmVsb2MgYWRkcmVzcyAweCVseCBpbiBzZWN0aW9uIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMDM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBFUlJPUjogY29tcGlsZWQgZm9yIEFQQ1MtJWQgd2hlcmVhcyB0YXJnZXQgJXMgdXNlcyBBUENTLSVkIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjA1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IEVSUk9SOiBwYXNzZXMgZmxvYXRzIGluIGZsb2F0IHJlZ2lzdGVycyB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIGludGVnZXIgIgotInJlZ2lzdGVycyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIwNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBFUlJPUjogcGFzc2VzIGZsb2F0cyBpbiBpbnRlZ2VyIHJlZ2lzdGVycyB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIGZsb2F0ICIKLSJyZWdpc3RlcnMiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMDY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogRVJST1I6IGNvbXBpbGVkIGFzIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHdoZXJlYXMgdGFyZ2V0ICVzIGlzICIKLSJhYnNvbHV0ZSBwb3NpdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIwNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBFUlJPUjogY29tcGlsZWQgYXMgYWJzb2x1dGUgcG9zaXRpb24gY29kZSwgd2hlcmVhcyB0YXJnZXQgJXMgaXMgcG9zaXRpb24gIgotImluZGVwZW5kZW50IgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjEwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBpbnB1dCBmaWxlICVzIHN1cHBvcnRzIGludGVyd29ya2luZywgd2hlcmVhcyAlcyBkb2VzIG5vdC4iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IGlucHV0IGZpbGUgJXMgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcndvcmtpbmcsIHdoZXJlYXMgJXMgZG9lcy4iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTMyCi0jLCBjLWZvcm1hdAotbXNnaWQgInByaXZhdGUgZmxhZ3MgPSAleDoiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTQwCi1tc2dpZCAiIFtmbG9hdHMgcGFzc2VkIGluIGZsb2F0IHJlZ2lzdGVyc10iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTQyCi1tc2dpZCAiIFtmbG9hdHMgcGFzc2VkIGluIGludGVnZXIgcmVnaXN0ZXJzXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNDUKLW1zZ2lkICIgW3Bvc2l0aW9uIGluZGVwZW5kZW50XSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNDcKLW1zZ2lkICIgW2Fic29sdXRlIHBvc2l0aW9uXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNTEKLW1zZ2lkICIgW2ludGVyd29ya2luZyBmbGFnIG5vdCBpbml0aWFsaXNlZF0iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTUzCi1tc2dpZCAiIFtpbnRlcndvcmtpbmcgc3VwcG9ydGVkXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNTUKLW1zZ2lkICIgW2ludGVyd29ya2luZyBub3Qgc3VwcG9ydGVkXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIyMDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIldhcm5pbmc6IE5vdCBzZXR0aW5nIGludGVyd29ya2luZyBmbGFnIG9mICVzLCBzaW5jZSBpdCBoYXMgYWxyZWFkeSBiZWVuICIKLSJzcGVjaWZpZWQgYXMgbm9uLWludGVyd29ya2luZyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIyMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogQ2xlYXJpbmcgdGhlIGludGVyd29ya2luZyBmbGFnIG9mICVzIGR1ZSB0byBvdXRzaWRlIHJlcXVlc3QiCi1tc2dzdHIgIiIKLQotIzogY29mZi1pOTYwLmM6MTM1IGNvZmYtaTk2MC5jOjQ4NAotbXNnaWQgInVuY2VydGFpbiBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIG5vbi1DT0ZGIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLW1pcHMuYzo4NzUgZWxmMzItbWlwcy5jOjExODMKLW1zZ2lkICJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gX2dwIG5vdCBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtbWlwcy5jOjI0MzMKLW1zZ2lkICJ1bnN1cHBvcnRlZCByZWxvYyB0eXBlIgotbXNnc3RyICIiCi0KLSMuIE5vIG90aGVyIHNlY3Rpb25zIHNob3VsZCBhcHBlYXIgaW4gLW1lbWJlZGRlZC1waWMKLSMuIGNvZGUuCi0jOiBjb2ZmLW1pcHMuYzoyNDcwCi1tc2dpZCAicmVsb2MgYWdhaW5zdCB1bnN1cHBvcnRlZCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtbWlwcy5jOjI0NzgKLW1zZ2lkICJyZWxvYyBub3QgcHJvcGVybHkgYWxpZ25lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLXRpYzgwLmM6NDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCByZWxvYyB0eXBlIDB4JXgiCi1tc2dzdHIgIiIKLQotIzogY29mZi13NjUuYzozODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWdub3JpbmcgcmVsb2MgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmY29kZS5oOjM0MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IGlsbGVnYWwgc3ltYm9sIGluZGV4ICVsZCBpbiBsaW5lIG51bWJlcnMiCi1tc2dzdHIgIiIKLQotIzogY29mZmNvZGUuaDozNDI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBkdXBsaWNhdGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29mZmNvZGUuaDozNzQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBVbnJlY29nbml6ZWQgc3RvcmFnZSBjbGFzcyAlZCBmb3IgJXMgc3ltYm9sIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29mZmNvZGUuaDozOTMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gcmVsb2NzIgotbXNnc3RyICIiCi0KLSM6IGNvZmZjb2RlLmg6Mzk3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaWxsZWdhbCByZWxvY2F0aW9uIHR5cGUgJWQgYXQgYWRkcmVzcyAweCVseCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmZ2VuLmM6MTYwNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmFkIHN0cmluZyB0YWJsZSBzaXplICVsdSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmbGluay5jOjQyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiB0eXBlIG9mIHN5bWJvbCBgJXMnIGNoYW5nZWQgZnJvbSAlZCB0byAlZCBpbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmbGluay5jOjIwOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJlbG9jcyBpbiBzZWN0aW9uIGAlcycsIGJ1dCBpdCBoYXMgbm8gY29udGVudHMiCi1tc2dzdHIgIiIKLQotIzogY29mZnN3YXAuaDo4NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6ICVzOiBsaW5lIG51bWJlciBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiCi1tc2dzdHIgIiIKLQotIzogY29mZnN3YXAuaDo4OTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiByZWxvYyBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6NDIwCi1tc2dpZCAiRHdhcmYgRXJyb3I6IENhbid0IGZpbmQgLmRlYnVnX2FiYnJldiBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRHdhcmYgRXJyb3I6IEFiYnJldiBvZmZzZXQgKCV1KSBiaWdnZXIgdGhhbiBhYmJyZXYgc2l6ZSAoJXUpLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo2MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRHdhcmYgRXJyb3I6IEludmFsaWQgb3IgdW5oYW5kbGVkIEZPUk0gdmFsdWU6ICVkLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo3MjAKLW1zZ2lkICJEd2FyZiBFcnJvcjogQ2FuJ3QgZmluZCAuZGVidWdfbGluZSBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo4ODEKLW1zZ2lkICJEd2FyZiBFcnJvcjogbWFuZ2xlZCBsaW5lIG51bWJlciBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzoxMDU0IGR3YXJmMi5jOjEyMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRHdhcmYgRXJyb3I6IENvdWxkIG5vdCBmaW5kIGFiYnJldiBudW1iZXIgJWQuIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjExNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkR3YXJmIEVycm9yOiBmb3VuZCBkd2FyZiB2ZXJzaW9uICclaHUnLCB0aGlzIHJlYWRlciBvbmx5IGhhbmRsZXMgdmVyc2lvbiAyICIKLSJpbmZvcm1hdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6MTE2OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iRHdhcmYgRXJyb3I6IGZvdW5kIGFkZHJlc3Mgc2l6ZSAnJXUnLCB0aGlzIHJlYWRlciBjYW4gbm90IGhhbmRsZSBzaXplcyAiCi0iZ3JlYXRlciB0aGFuICcldScuIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjExOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRHdhcmYgRXJyb3I6IEJhZCBhYmJyZXYgbnVtYmVyOiAlZC4iCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxMzA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gYmFzaWMgdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE1ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIEVuZCsxIHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTU4NyBlY29mZi5jOjE1OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIEZpcnN0IHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgRW5kKzEgc3ltYm9sOiAlLTdsZCAgIFR5cGU6ICAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIExvY2FsIHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYxNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgc3RydWN0OyBFbmQrMSBzeW1ib2w6ICVsZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIHVuaW9uOyBFbmQrMSBzeW1ib2w6ICVsZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIGVudW07IEVuZCsxIHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgVHlwZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZWxmLW0xMDIwMC5jOjQ1NSBlbGYtbTEwMzAwLmM6NjY3IGVsZjMyLWQxMHYuYzo0OTAgZWxmMzItZnIzMC5jOjY1MAotIzogZWxmMzItbTMyci5jOjExNTcgZWxmMzItdjg1MC5jOjE2NzQKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGVsZi1tMTAyMDAuYzo0NTkgZWxmLW0xMDMwMC5jOjY3MSBlbGYzMi1kMTB2LmM6NDk0IGVsZjMyLWZyMzAuYzo2NTQKLSM6IGVsZjMyLW0zMnIuYzoxMTYxIGVsZjMyLXY4NTAuYzoxNjc4Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogZWxmLW0xMDIwMC5jOjQ2MyBlbGYtbTEwMzAwLmM6Njc1IGVsZjMyLWQxMHYuYzo0OTggZWxmMzItbTMyci5jOjExNjUKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGVsZi1tMTAyMDAuYzo0NjcgZWxmLW0xMDMwMC5jOjY3OSBlbGYzMi1kMTB2LmM6NTAyIGVsZjMyLWZyMzAuYzo2NjIKLSM6IGVsZjMyLW0zMnIuYzoxMTY5IGVsZjMyLXY4NTAuYzoxNjk4Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MzIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnZhbGlkIHN0cmluZyBvZmZzZXQgJXUgPj0gJWx1IGZvciBzZWN0aW9uIGAlcyciCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NTQzCi1tc2dpZCAiIgotIlxuIgotIlByb2dyYW0gSGVhZGVyOlxuIgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjU5MQotbXNnaWQgIiIKLSJcbiIKLSJEeW5hbWljIFNlY3Rpb246XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NjkzCi1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gZGVmaW5pdGlvbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NzE2Ci1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gUmVmZXJlbmNlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzo3MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICByZXF1aXJlZCBmcm9tICVzOlxuIgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjE4ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImNyZWF0aW5nIHNlY3Rpb24gc3ltYm9sLCBuYW1lID0gJXMsIHZhbHVlID0gMHglLjhseCwgaW5kZXggPSAlZCwgc2VjdGlvbiA9ICIKLSIweCUuOGx4XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjQ4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogTm90IGVub3VnaCByb29tIGZvciBwcm9ncmFtIGhlYWRlcnMgKGFsbG9jYXRlZCAldSwgbmVlZCAldSkiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjU4NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogTm90IGVub3VnaCByb29tIGZvciBwcm9ncmFtIGhlYWRlcnMsIHRyeSBsaW5raW5nIHdpdGggLU4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjcxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvcjogRmlyc3Qgc2VjdGlvbiBpbiBzZWdtZW50ICglcykgc3RhcnRzIGF0IDB4JXgiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjcxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAgd2hlcmVhcyBzZWdtZW50IHN0YXJ0cyBhdCAweCV4IgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjI5ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IGFsbG9jYXRlZCBzZWN0aW9uIGAlcycgbm90IGluIHNlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MzM1MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3ltYm9sIGAlcycgcmVxdWlyZWQgYnV0IG5vdCBwcmVzZW50IgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjMzNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIDB4JS44bHgsIG5hbWUgPSAlcywgc3ltIG51bSA9ICVkLCBmbGFncyA9ICIKLSIweCUuOGx4JXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzozNTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBFbXB0eSBsb2FkYWJsZSBzZWdtZW50IGRldGVjdGVkXG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NDc3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlICVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWZyMzAuYzo2NTggZWxmMzItdjg1MC5jOjE2ODIKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItaHBwYS5jOjEyMTUKLW1zZ2lkICJVbnN1cHBvcnRlZCBjYWxsIHRvIGhwcGFfZWxmX3JlbG9jIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWkzODYuYzoxMjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogd2FybmluZzogdW5yZXNvbHZhYmxlIHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgYCVzJyBmcm9tICVzIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbTMyci5jOjgwOAotbXNnaWQgIlNEQSByZWxvY2F0aW9uIHdoZW4gX1NEQV9CQVNFXyBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tMzJyLmM6ODkyIGVsZjMyLXBwYy5jOjMwNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW0zMnIuYzoxMTAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBUaGUgdGFyZ2V0ICglcykgb2YgYW4gJXMgcmVsb2NhdGlvbiBpcyBpbiB0aGUgd3Jvbmcgc2VjdGlvbiAoJXMpIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW0zMnIuYzoxOTA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBJbnN0cnVjdGlvbiBzZXQgbWlzbWF0Y2ggd2l0aCBwcmV2aW91cyBtb2R1bGVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW0zMnIuYzoxOTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInByaXZhdGUgZmxhZ3MgPSAlbHgiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbTMyci5jOjE5MzQKLW1zZ2lkICI6IG0zMnIgaW5zdHJ1Y3Rpb25zIgotbXNnc3RyICIiCi0KZGlmZiAtLWdpdCBhL2JmZC9wcGNib290LmMgYi9iZmQvcHBjYm9vdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmRhNDA3Li4wMDAwMDAwCi0tLSBhL2JmZC9wcGNib290LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBQUENidWcgYm9vdCByZWNvcmRzLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1pY2hhZWwgTWVpc3NuZXIsIEN5Z251cyBTdXBwb3J0LCA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGlzIGEgQkZEIGJhY2tlbmQgd2hpY2ggbWF5IGJlIHVzZWQgdG8gd3JpdGUgUG93ZXJQQ0J1ZyBib290IG9iamVjdHMuCi0gICBJdCBtYXkgb25seSBiZSB1c2VkIGZvciBvdXRwdXQsIG5vdCBpbnB1dC4gIFRoZSBpbnRlbnRpb24gaXMgdGhhdCB0aGlzIG1heQotICAgYmUgdXNlZCBhcyBhbiBvdXRwdXQgZm9ybWF0IGZvciBvYmpjb3B5IGluIG9yZGVyIHRvIGdlbmVyYXRlIHJhdyBiaW5hcnkKLSAgIGRhdGEuCi0KLSAgIFRoaXMgaXMgdmVyeSBzaW1wbGUuICBUaGUgb25seSBjb21wbGljYXRpb24gaXMgdGhhdCB0aGUgcmVhbCBkYXRhCi0gICB3aWxsIHN0YXJ0IGF0IHNvbWUgYWRkcmVzcyBYLCBhbmQgaW4gc29tZSBjYXNlcyB3ZSB3aWxsIG5vdCB3YW50IHRvCi0gICBpbmNsdWRlIFggemVyb2VzIGp1c3QgdG8gZ2V0IHRvIHRoYXQgcG9pbnQuICBTaW5jZSB0aGUgc3RhcnQKLSAgIGFkZHJlc3MgaXMgbm90IG1lYW5pbmdmdWwgZm9yIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0LCB3ZSB1c2UgaXQKLSAgIGluc3RlYWQgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiB6ZXJvZXMgdG8gc2tpcCBhdCB0aGUgc3RhcnQgb2YKLSAgIHRoZSBmaWxlLiAgb2JqY29weSBjb29wZXJhdGVzIGJ5IHNwZWNpYWxseSBzZXR0aW5nIHRoZSBzdGFydAotICAgYWRkcmVzcyB0byB6ZXJvIGJ5IGRlZmF1bHQuICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKiBQUENidWcgbG9jYXRpb24gc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCBwcGNib290X2xvY2F0aW9uIHsKLSAgYmZkX2J5dGUJaW5kOwotICBiZmRfYnl0ZQloZWFkOwotICBiZmRfYnl0ZQlzZWN0b3I7Ci0gIGJmZF9ieXRlCWN5bGluZGVyOwotfSBwcGNib290X2xvY2F0aW9uX3Q7Ci0KLS8qIFBQQ2J1ZyBwYXJ0aXRpb24gdGFibGUgbGF5b3V0ICovCi10eXBlZGVmIHN0cnVjdCBwcGNib290X3BhcnRpdGlvbiB7Ci0gIHBwY2Jvb3RfbG9jYXRpb25fdAlwYXJ0aXRpb25fYmVnaW47CS8qIHBhcnRpdGlvbiBiZWdpbiAqLwotICBwcGNib290X2xvY2F0aW9uX3QJcGFydGl0aW9uX2VuZDsJCS8qIHBhcnRpdGlvbiBlbmQgKi8KLSAgYmZkX2J5dGUJCXNlY3Rvcl9iZWdpbls0XTsJLyogMzItYml0IHN0YXJ0IFJCQSAoemVyby1iYXNlZCksIGxpdHRsZSBlbmRpYW4gKi8KLSAgYmZkX2J5dGUJCXNlY3Rvcl9sZW5ndGhbNF07CS8qIDMyLWJpdCBSQkEgY291bnQgKG9uZS1iYXNlZCksIGxpdHRsZSBlbmRpYW4gKi8KLX0gcHBjYm9vdF9wYXJ0aXRpb25fdDsKLQotLyogUFBDYnVnIGJvb3QgbGF5b3V0LiAgKi8KLXR5cGVkZWYgc3RydWN0IHBwY2Jvb3RfaGRyIHsKLSAgYmZkX2J5dGUJCXBjX2NvbXBhdGliaWxpdHlbNDQ2XTsJLyogeDg2IGluc3RydWN0aW9uIGZpZWxkICovCi0gIHBwY2Jvb3RfcGFydGl0aW9uX3QJcGFydGl0aW9uWzRdOwkJLyogcGFydGl0aW9uIGluZm9ybWF0aW9uICovCi0gIGJmZF9ieXRlCQlzaWduYXR1cmVbMl07CQkvKiAweDU1IGFuZCAweGFhICovCi0gIGJmZF9ieXRlCQllbnRyeV9vZmZzZXRbNF07CS8qIGVudHJ5IHBvaW50IG9mZnNldCwgbGl0dGxlIGVuZGlhbiAqLwotICBiZmRfYnl0ZQkJbGVuZ3RoWzRdOwkJLyogbG9hZCBpbWFnZSBsZW5ndGgsIGxpdHRsZSBlbmRpYW4gKi8KLSAgYmZkX2J5dGUJCWZsYWdzOwkJCS8qIGZsYWcgZmllbGQgKi8KLSAgYmZkX2J5dGUJCW9zX2lkOwkJCS8qIE9TX0lEICovCi0gIGNoYXIJCQlwYXJ0aXRpb25fbmFtZVszMl07CS8qIHBhcnRpdGlvbiBuYW1lICovCi0gIGJmZF9ieXRlCQlyZXNlcnZlZDFbNDcwXTsJCS8qIHJlc2VydmVkICovCi19IHBwY2Jvb3RfaGRyX3Q7Ci0KLS8qIFNpZ25hdHVyZSBieXRlcyBmb3IgbGFzdCAyIGJ5dGVzIG9mIHRoZSA1MTIgYnl0ZSByZWNvcmQgKi8KLSNkZWZpbmUgU0lHTkFUVVJFMCAweDU1Ci0jZGVmaW5lIFNJR05BVFVSRTEgMHhhYQotCi0vKiBQb3dlclBDIGJvb3QgdHlwZSAqLwotI2RlZmluZSBQUENfSU5EIDB4NDEKLQotLyogSW5mb3JtYXRpb24gbmVlZGVkIGZvciBwcGNib290IGhlYWRlciAqLwotdHlwZWRlZiBzdHJ1Y3QgcHBjYm9vdF9kYXRhIHsKLSAgcHBjYm9vdF9oZHJfdAloZWFkZXI7CQkJCS8qIHJhdyBoZWFkZXIgKi8KLSAgYXNlY3Rpb24gKnNlYzsJCQkJLyogc2luZ2xlIHNlY3Rpb24gKi8KLX0gcHBjYm9vdF9kYXRhX3Q7Ci0KLS8qIEFueSBiZmQgd2UgY3JlYXRlIGJ5IHJlYWRpbmcgYSBwcGNib290IGZpbGUgaGFzIHRocmVlIHN5bWJvbHM6Ci0gICBhIHN0YXJ0IHN5bWJvbCwgYW4gZW5kIHN5bWJvbCwgYW5kIGFuIGFic29sdXRlIGxlbmd0aCBzeW1ib2wuICAqLwotI2RlZmluZSBQUENCT09UX1NZTVMgMwotCi1zdGF0aWMgYm9vbGVhbiBwcGNib290X21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqcHBjYm9vdF9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gcHBjYm9vdF9zZXRfYXJjaF9tYWNoCi0gIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHBwY2Jvb3RfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBsb25nIHBwY2Jvb3RfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNoYXIgKm1hbmdsZV9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjaGFyICopKTsKLXN0YXRpYyBsb25nIHBwY2Jvb3RfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGFzeW1ib2wgKnBwY2Jvb3RfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHBwY2Jvb3RfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIHBwY2Jvb3Rfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBpbnQgcHBjYm9vdF9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci0KLSNkZWZpbmUgcHBjYm9vdF9zZXRfdGRhdGEoYWJmZCwgcHRyKSAoKGFiZmQpLT50ZGF0YS5hbnkgPSAoUFRSKSAocHRyKSkKLSNkZWZpbmUgcHBjYm9vdF9nZXRfdGRhdGEoYWJmZCkgKChwcGNib290X2RhdGFfdCAqKSAoKGFiZmQpLT50ZGF0YS5hbnkpKQotDAotLyogQ3JlYXRlIGEgcHBjYm9vdCBvYmplY3QuICBJbnZva2VkIHZpYSBiZmRfc2V0X2Zvcm1hdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNib290X21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmICghcHBjYm9vdF9nZXRfdGRhdGEgKGFiZmQpKQotICAgIHBwY2Jvb3Rfc2V0X3RkYXRhIChhYmZkLCBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHBwY2Jvb3RfZGF0YV90KSkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSB0byBQb3dlclBDICovCi1zdGF0aWMgYm9vbGVhbgotcHBjYm9vdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGlmIChhcmNoID09IGJmZF9hcmNoX3Vua25vd24pCi0gICAgYXJjaCA9IGJmZF9hcmNoX3Bvd2VycGM7Ci0KLSAgZWxzZSBpZiAoYXJjaCAhPSBiZmRfYXJjaF9wb3dlcnBjKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci19Ci0KLQwKLS8qIEFueSBmaWxlIG1heSBiZSBjb25zaWRlcmVkIHRvIGJlIGEgcHBjYm9vdCBmaWxlLCBwcm92aWRlZCB0aGUgdGFyZ2V0Ci0gICB3YXMgbm90IGRlZmF1bHRlZC4gIFRoYXQgaXMsIGl0IG11c3QgYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgYXMKLSAgIGJlaW5nIHBwY2Jvb3QuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1wcGNib290X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHBwY2Jvb3RfaGRyX3QgaGRyOwotICBzaXplX3QgaTsKLSAgcHBjYm9vdF9kYXRhX3QgKnRkYXRhOwotCi0gIEJGRF9BU1NFUlQgKHNpemVvZiAocHBjYm9vdF9oZHJfdCkgPT0gMTAyNCk7Ci0KLSAgaWYgKGFiZmQtPnRhcmdldF9kZWZhdWx0ZWQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogRmluZCB0aGUgZmlsZSBzaXplLiAgKi8KLSAgaWYgKGJmZF9zdGF0IChhYmZkLCAmc3RhdGJ1ZikgPCAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKChzaXplX3QpIHN0YXRidWYuc3Rfc2l6ZSA8IHNpemVvZiAocHBjYm9vdF9oZHJfdCkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmaGRyLCBzaXplb2YgKGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAoaGRyKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBOb3cgZG8gc29tZSBiYXNpYyBjaGVja3MuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChoZHIucGNfY29tcGF0aWJpbGl0eSk7IGkrKykKLSAgICBpZiAoaGRyLnBjX2NvbXBhdGliaWxpdHlbaV0pCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0KLSAgaWYgKGhkci5zaWduYXR1cmVbMF0gIT0gU0lHTkFUVVJFMCB8fCBoZHIuc2lnbmF0dXJlWzFdICE9IFNJR05BVFVSRTEpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGhkci5wYXJ0aXRpb25bMF0ucGFydGl0aW9uX2VuZC5pbmQgIT0gUFBDX0lORCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBhYmZkLT5zeW1jb3VudCA9IFBQQ0JPT1RfU1lNUzsKLQotICAvKiBPbmUgZGF0YSBzZWN0aW9uLiAgKi8KLSAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5kYXRhIik7Ci0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgc2VjLT5mbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfQ09ERSB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHNlYy0+dm1hID0gMDsKLSAgc2VjLT5fcmF3X3NpemUgPSBzdGF0YnVmLnN0X3NpemUgLSBzaXplb2YgKHBwY2Jvb3RfaGRyX3QpOwotICBzZWMtPmZpbGVwb3MgPSBzaXplb2YgKHBwY2Jvb3RfaGRyX3QpOwotCi0gIHBwY2Jvb3RfbWtvYmplY3QgKGFiZmQpOwotICB0ZGF0YSA9IHBwY2Jvb3RfZ2V0X3RkYXRhIChhYmZkKTsKLSAgdGRhdGEtPnNlYyA9IHNlYzsKLSAgbWVtY3B5ICgoUFRSKSAmdGRhdGEtPmhlYWRlciwgKFBUUikgJmhkciwgc2l6ZW9mIChwcGNib290X2hkcl90KSk7Ci0KLSAgcHBjYm9vdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9wb3dlcnBjLCAwKTsKLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLSNkZWZpbmUgcHBjYm9vdF9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgcHBjYm9vdF9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgcHBjYm9vdF9uZXdfc2VjdGlvbl9ob29rIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rCi0KLQwKLS8qIEdldCBjb250ZW50cyBvZiB0aGUgb25seSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY2Jvb3RfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQgKyBzaXplb2YocHBjYm9vdF9oZHJfdCksIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgbmVlZGVkIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1wcGNib290X2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIChQUENCT09UX1NZTVMgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKTsKLX0KLQotDAotLyogQ3JlYXRlIGEgc3ltYm9sIG5hbWUgYmFzZWQgb24gdGhlIGJmZCdzIGZpbGVuYW1lLiAgKi8KLQotc3RhdGljIGNoYXIgKgotbWFuZ2xlX25hbWUgKGFiZmQsIHN1ZmZpeCkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpzdWZmaXg7Ci17Ci0gIGludCBzaXplOwotICBjaGFyICpidWY7Ci0gIGNoYXIgKnA7Ci0KLSAgc2l6ZSA9IChzdHJsZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKQotCSAgKyBzdHJsZW4gKHN1ZmZpeCkKLQkgICsgc2l6ZW9mICJfcHBjYm9vdF9fIik7Ci0KLSAgYnVmID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKGJ1ZiA9PSBOVUxMKQotICAgIHJldHVybiAiIjsKLQotICBzcHJpbnRmIChidWYsICJfcHBjYm9vdF8lc18lcyIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzdWZmaXgpOwotCi0gIC8qIENoYW5nZSBhbnkgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIHRvIHVuZGVyc2NvcmVzLiAgKi8KLSAgZm9yIChwID0gYnVmOyAqcDsgcCsrKQotICAgIGlmICghIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcCkpCi0gICAgICAqcCA9ICdfJzsKLQotICByZXR1cm4gYnVmOwotfQotCi0MCi0vKiBSZXR1cm4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1wcGNib290X2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICBhc2VjdGlvbiAqc2VjID0gcHBjYm9vdF9nZXRfdGRhdGEgKGFiZmQpLT5zZWM7Ci0gIGFzeW1ib2wgKnN5bXM7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIHN5bXMgPSAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIFBQQ0JPT1RfU1lNUyAqIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAoc3ltcyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTdGFydCBzeW1ib2wuICAqLwotICBzeW1zWzBdLnRoZV9iZmQgPSBhYmZkOwotICBzeW1zWzBdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgInN0YXJ0Iik7Ci0gIHN5bXNbMF0udmFsdWUgPSAwOwotICBzeW1zWzBdLmZsYWdzID0gQlNGX0dMT0JBTDsKLSAgc3ltc1swXS5zZWN0aW9uID0gc2VjOwotICBzeW1zWzBdLnVkYXRhLnAgPSBOVUxMOwotCi0gIC8qIEVuZCBzeW1ib2wuICAqLwotICBzeW1zWzFdLnRoZV9iZmQgPSBhYmZkOwotICBzeW1zWzFdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgImVuZCIpOwotICBzeW1zWzFdLnZhbHVlID0gc2VjLT5fcmF3X3NpemU7Ci0gIHN5bXNbMV0uZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICBzeW1zWzFdLnNlY3Rpb24gPSBzZWM7Ci0gIHN5bXNbMV0udWRhdGEucCA9IE5VTEw7Ci0KLSAgLyogU2l6ZSBzeW1ib2wuICAqLwotICBzeW1zWzJdLnRoZV9iZmQgPSBhYmZkOwotICBzeW1zWzJdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgInNpemUiKTsKLSAgc3ltc1syXS52YWx1ZSA9IHNlYy0+X3Jhd19zaXplOwotICBzeW1zWzJdLmZsYWdzID0gQlNGX0dMT0JBTDsKLSAgc3ltc1syXS5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgc3ltc1syXS51ZGF0YS5wID0gTlVMTDsKLQotICBmb3IgKGkgPSAwOyBpIDwgUFBDQk9PVF9TWU1TOyBpKyspCi0gICAgKmFsb2NhdGlvbisrID0gc3ltcysrOwotICAqYWxvY2F0aW9uID0gTlVMTDsKLQotICByZXR1cm4gUFBDQk9PVF9TWU1TOwotfQotCi0MCi0vKiBNYWtlIGFuIGVtcHR5IHN5bWJvbC4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLXBwY2Jvb3RfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci19Ci0KLQwKLSNkZWZpbmUgcHBjYm9vdF9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0KLS8qIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNib290X2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotfQotCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBwcGNib290X2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBwcGNib290X2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBwcGNib290X3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgcHBjYm9vdF9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBwcGNib290X2dldF9yZWxvY191cHBlcl9ib3VuZCBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkXzBsKQotI2RlZmluZSBwcGNib290X2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgYmZkXzBsKQotI2RlZmluZSBwcGNib290X2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotDAotLyogV3JpdGUgc2VjdGlvbiBjb250ZW50cyBvZiBhIHBwY2Jvb3QgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNib290X3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci17Ci0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgYmZkX3ZtYSBsb3c7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgLyogVGhlIGxvd2VzdCBzZWN0aW9uIFZNQSBzZXRzIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0Ci0gICAgICAgICBvZiB0aGUgZmlsZS4gIFdlIHVzZSB0aGUgc2V0IHRoZSBmaWxlIHBvc2l0aW9uIG9mIGFsbCB0aGUKLSAgICAgICAgIHNlY3Rpb25zLiAgKi8KLSAgICAgIGxvdyA9IGFiZmQtPnNlY3Rpb25zLT52bWE7Ci0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9ucy0+bmV4dDsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQlpZiAocy0+dm1hIDwgbG93KQotCSAgbG93ID0gcy0+dm1hOwotCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQlzLT5maWxlcG9zID0gcy0+dm1hIC0gbG93OwotCi0gICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIHNpemUpOwotfQotCi0MCi1zdGF0aWMgaW50Ci1wcGNib290X3NpemVvZl9oZWFkZXJzIChhYmZkLCBleGVjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZXhlYzsKLXsKLSAgcmV0dXJuIHNpemVvZiAocHBjYm9vdF9oZHJfdCk7Ci19Ci0KLQwKLS8qIFByaW50IG91dCB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIGZhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZhcmc7Ci17Ci0gIEZJTEUgKmYgPSAoRklMRSAqKWZhcmc7Ci0gIHBwY2Jvb3RfZGF0YV90ICp0ZGF0YSA9IHBwY2Jvb3RfZ2V0X3RkYXRhIChhYmZkKTsKLSAgbG9uZyBlbnRyeV9vZmZzZXQgPSBiZmRfZ2V0bF9zaWduZWRfMzIgKChQVFIpIHRkYXRhLT5oZWFkZXIuZW50cnlfb2Zmc2V0KTsKLSAgbG9uZyBsZW5ndGggPSBiZmRfZ2V0bF9zaWduZWRfMzIgKChQVFIpIHRkYXRhLT5oZWFkZXIubGVuZ3RoKTsKLSAgaW50IGk7Ci0KLSAgZnByaW50ZiAoZiwgXygiXG5wcGNib290IGhlYWRlcjpcbiIpKTsKLSAgZnByaW50ZiAoZiwgXygiRW50cnkgb2Zmc2V0ICAgICAgICA9IDB4JS44bHggKCVsZClcbiIpLCBlbnRyeV9vZmZzZXQsIGVudHJ5X29mZnNldCk7Ci0gIGZwcmludGYgKGYsIF8oIkxlbmd0aCAgICAgICAgICAgICAgPSAweCUuOGx4ICglbGQpXG4iKSwgbGVuZ3RoLCBsZW5ndGgpOwotCi0gIGlmICh0ZGF0YS0+aGVhZGVyLmZsYWdzKQotICAgIGZwcmludGYgKGYsIF8oIkZsYWcgZmllbGQgICAgICAgICAgPSAweCUuMnhcbiIpLCB0ZGF0YS0+aGVhZGVyLmZsYWdzKTsKLQotICBpZiAodGRhdGEtPmhlYWRlci5vc19pZCkKLSAgICBmcHJpbnRmIChmLCAiT1NfSUQgICAgICAgICAgICAgICA9IDB4JS4yeFxuIiwgdGRhdGEtPmhlYWRlci5vc19pZCk7Ci0KLSAgaWYgKHRkYXRhLT5oZWFkZXIucGFydGl0aW9uX25hbWUpCi0gICAgZnByaW50ZiAoZiwgXygiUGFydGl0aW9uIG5hbWUgICAgICA9IFwiJXNcIlxuIiksIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uX25hbWUpOwotCi0gIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgbG9uZyBzZWN0b3JfYmVnaW4gID0gYmZkX2dldGxfc2lnbmVkXzMyICgoUFRSKSB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5zZWN0b3JfYmVnaW4pOwotICAgICAgbG9uZyBzZWN0b3JfbGVuZ3RoID0gYmZkX2dldGxfc2lnbmVkXzMyICgoUFRSKSB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5zZWN0b3JfbGVuZ3RoKTsKLQotICAgICAgLyogU2tpcCBhbGwgMCBlbnRyaWVzICovCi0gICAgICBpZiAoIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5pbmQKLQkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uaGVhZAotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5zZWN0b3IKLQkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uY3lsaW5kZXIKLQkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fZW5kLmluZAotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuaGVhZAotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuc2VjdG9yCi0JICAmJiAhdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5jeWxpbmRlcgotCSAgJiYgIXNlY3Rvcl9iZWdpbiAmJiAhc2VjdG9yX2xlbmd0aCkKLQljb250aW51ZTsKLQotICAgICAgZnByaW50ZiAoZiwgXygiXG5QYXJ0aXRpb25bJWRdIHN0YXJ0ICA9IHsgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4IH1cbiIpLCBpLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uaW5kLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uaGVhZCwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLnNlY3RvciwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLmN5bGluZGVyKTsKLQotICAgICAgZnByaW50ZiAoZiwgXygiUGFydGl0aW9uWyVkXSBlbmQgICAgPSB7IDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4JS4yeCB9XG4iKSwgaSwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5pbmQsCi0JICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuaGVhZCwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5zZWN0b3IsCi0JICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuY3lsaW5kZXIpOwotCi0gICAgICBmcHJpbnRmIChmLCBfKCJQYXJ0aXRpb25bJWRdIHNlY3RvciA9IDB4JS44bHggKCVsZClcbiIpLCBpLCBzZWN0b3JfYmVnaW4sIHNlY3Rvcl9iZWdpbik7Ci0gICAgICBmcHJpbnRmIChmLCBfKCJQYXJ0aXRpb25bJWRdIGxlbmd0aCA9IDB4JS44bHggKCVsZClcbiIpLCBpLCBzZWN0b3JfbGVuZ3RoLCBzZWN0b3JfbGVuZ3RoKTsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZiwgIlxuIik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0MCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBwcGNib290X2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgcHBjYm9vdF9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgcHBjYm9vdF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBwcGNib290X2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgcHBjYm9vdF9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgcHBjYm9vdF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgcHBjYm9vdF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2RlZmluZSBwcGNib290X2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdCBwcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLWNvbnN0IGJmZF90YXJnZXQgcHBjYm9vdF92ZWMgPQotewotICAicHBjYm9vdCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwJLyogZmxhdm91ciAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGJ5dGVvcmRlciBpcyBiaWcgZW5kaWFuIGZvciBjb2RlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyX2J5dGVvcmRlciAqLwotICBFWEVDX1AsCQkJLyogb2JqZWN0X2ZsYWdzICovCi0gIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUFET05MWSB8IFNFQ19DT0RFIHwgU0VDX0RBVEEKLSAgIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMpLCAvKiBzZWN0aW9uX2ZsYWdzICovCi0gIDAsCQkJCS8qIHN5bWJvbF9sZWFkaW5nX2NoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBoZHJzICovCi0gIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIHBwY2Jvb3Rfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgcHBjYm9vdF9ta29iamVjdCwKLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfdHJ1ZSwKLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHBwY2Jvb3QpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChwcGNib290KSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHBwY2Jvb3QpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHBwY2Jvb3QpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAocHBjYm9vdCksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHBwY2Jvb3QpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTAotfTsKZGlmZiAtLWdpdCBhL2JmZC9wdHJhY2UtY29yZS5jIGIvYmZkL3B0cmFjZS1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNGZkYmIuLjAwMDAwMDAKLS0tIGEvYmZkL3B0cmFjZS1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIGNvcmUgZmlsZXMgd2hpY2ggdXNlIHRoZSBwdHJhY2VfdXNlciBzdHJ1Y3R1cmUKLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgVGhlIHN0cnVjdHVyZSBvZiB0aGlzIGZpbGUgaXMgYmFzZWQgb24gdHJhZC1jb3JlLmMgd3JpdHRlbiBieSBKb2huIEdpbG1vcmUKLSAgIG9mIEN5Z251cyBTdXBwb3J0LgotICAgTW9kaWZpZWQgdG8gd29yayB3aXRoIHRoZSBwdHJhY2VfdXNlciBzdHJ1Y3R1cmUgYnkgS2V2aW4gQS4gQnVldHRuZXIuCi0gICAoTG9uZ3Rlcm0gaXQgbWF5IGJlIGJldHRlciB0byBtZXJnZSB0aGlzIGZpbGUgd2l0aCB0cmFkLWNvcmUuYykKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgUFRSQUNFX0NPUkUKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL2Rpci5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLQotCi1zdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdAotICB7Ci0gICAgYXNlY3Rpb24gKmRhdGFfc2VjdGlvbjsKLSAgICBhc2VjdGlvbiAqc3RhY2tfc2VjdGlvbjsKLSAgICBhc2VjdGlvbiAqcmVnX3NlY3Rpb247Ci0gICAgc3RydWN0IHB0cmFjZV91c2VyIHU7Ci0gIH07Ci0KLSNkZWZpbmUgY29yZV91cGFnZShiZmQpICgmKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dSkpCi0jZGVmaW5lIGNvcmVfZGF0YXNlYyhiZmQpICgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPmRhdGFfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9zdGFja3NlYyhiZmQpICgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnN0YWNrX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfcmVnc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+cmVnX3NlY3Rpb24pCi0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKnB0cmFjZV91bml4X2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotY2hhciAqCQlwdHJhY2VfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotaW50CQlwdHJhY2VfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuCQlwdHJhY2VfdW5peF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQkJCSBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLCBiZmQgKmV4ZWNfYmZkKSk7Ci1zdGF0aWMgdm9pZAlzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogQVJHU1VTRUQgKi8KLWNvbnN0IGJmZF90YXJnZXQgKgotcHRyYWNlX3VuaXhfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLQotewotICBpbnQgdmFsOwotICBzdHJ1Y3QgcHRyYWNlX3VzZXIgdTsKLSAgc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgKnJhd3B0cjsKLQotICB2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikmdSwgMSwgc2l6ZW9mIHUsIGFiZmQpOwotICBpZiAodmFsICE9IHNpemVvZiB1IHx8IHUucHRfbWFnaWMgIT0gX0JDU19QVFJBQ0VfTUFHSUMgCi0gICAgICB8fCB1LnB0X3JldiAhPSBfQkNTX1BUUkFDRV9SRVYpCi0gICAgewotICAgICAgLyogVG9vIHNtYWxsIHRvIGJlIGEgY29yZSBmaWxlICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUgKHN1cmUsIHN1cmUpLiAgKi8KLQotICAvKiBBbGxvY2F0ZSBib3RoIHRoZSB1cGFnZSBhbmQgdGhlIHN0cnVjdCBjb3JlX2RhdGEgYXQgb25jZSwgc28KLSAgICAgYSBzaW5nbGUgZnJlZSgpIHdpbGwgZnJlZSB0aGVtIGJvdGguICAqLwotICByYXdwdHIgPSAoc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgKikKLQkJYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCkpOwotCi0gIGlmIChyYXdwdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgCi0gIGFiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhID0gcmF3cHRyOwotCi0gIHJhd3B0ci0+dSA9IHU7IC8qQ29weSB0aGUgdWFyZWEgaW50byB0aGUgdGRhdGEgcGFydCBvZiB0aGUgYmZkICovCi0KLSAgLyogQ3JlYXRlIHRoZSBzZWN0aW9ucy4gIFRoaXMgaXMgcmF1bmNoeSwgYnV0IGJmZF9jbG9zZSB3YW50cyB0byBmcmVlCi0gICAgIHRoZW0gc2VwYXJhdGVseS4gICovCi0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9zdGFja3NlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgY29yZV9kYXRhc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX2RhdGFzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX3JlZ3NlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+bmFtZSA9ICIuc3RhY2siOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5uYW1lID0gIi5kYXRhIjsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5uYW1lID0gIi5yZWciOwotCi0gIC8qIEZJWE1FOiAgTmVlZCB0byB3b3JyeSBhYm91dCBzaGFyZWQgbWVtb3J5LCBsaWJyYXJ5IGRhdGEsIGFuZCBsaWJyYXJ5Ci0gICAgIHRleHQuICBJIGRvbid0IHRoaW5rIHRoYXQgYW55IG9mIHRoZXNlIHRoaW5ncyBhcmUgc3VwcG9ydGVkIG9uIHRoZQotICAgICBzeXN0ZW0gb24gd2hpY2ggSSBhbSBkZXZlbG9waW5nIHRoaXMgZm9yIHRob3VnaC4gKi8KLQotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotCi0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9ICB1LnB0X2RzaXplOwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+X3Jhd19zaXplID0gdS5wdF9zc2l6ZTsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBzaXplb2YodSk7Ci0KLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+dm1hID0gdS5wdF9vX2RhdGFfc3RhcnQ7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT52bWEgPSBVU1JTVEFDSyAtIHUucHRfc3NpemU7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+dm1hID0gMCAtIHNpemVvZih1KTsJLyogc2VlIHRyYWQtY29yZS5jICovCi0KLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IChpbnQpIHUucHRfZGF0YXB0cjsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPmZpbGVwb3MgPSAoaW50KSAodS5wdF9kYXRhcHRyICsgdS5wdF9kc2l6ZSk7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmlsZXBvcyA9IDA7IC8qIFJlZ2lzdGVyIHNlZ21lbnQgaXMgcHRyYWNlX3VzZXIgKi8KLQotICAvKiBBbGlnbiB0byB3b3JkIGF0IGxlYXN0ICovCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgYWJmZC0+c2VjdGlvbnMgPSBjb3JlX3N0YWNrc2VjIChhYmZkKTsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPm5leHQgPSBjb3JlX2RhdGFzZWMgKGFiZmQpOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9yZWdzZWMgKGFiZmQpOwotICBhYmZkLT5zZWN0aW9uX2NvdW50ID0gMzsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotY2hhciAqCi1wdHJhY2VfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKmNvbSA9IGFiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnB0X2NvbW07Ci0gIGlmICgqY29tKQotICAgIHJldHVybiBjb207Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWludAotcHRyYWNlX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS5wdF9zaWdmcmFtZS5zaWdfbnVtOwotfQotCi0vKiBBUkdTVVNFRCAqLwotYm9vbGVhbgotcHRyYWNlX3VuaXhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIC8qIEZJWE1FOiBVc2UgcHRfdGltZGF0IGZpZWxkIG9mIHRoZSBwdHJhY2VfdXNlciBzdHJ1Y3R1cmUgdG8gbWF0Y2ggCi0gICAgIHRoZSBkYXRlIG9mIHRoZSBleGVjdXRhYmxlICovCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgcHRyYWNlX2NvcmVfdmVjID0KLSAgewotICAgICJ0cmFkLWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKHB0cmFjZV91bml4KSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07Ci0KLSNlbmRpZiAvKiBQVFJBQ0VfQ09SRSAqLwpkaWZmIC0tZ2l0IGEvYmZkL3JlbG9jLmMgYi9iZmQvcmVsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxNDFiMS4uMDAwMDAwMAotLS0gYS9iZmQvcmVsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NDQgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIGhhbmRsaW5nIHJlbG9jYXRpb24gZW50cmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQlSZWxvY2F0aW9ucwotCi0JQkZEIG1haW50YWlucyByZWxvY2F0aW9ucyBpbiBtdWNoIHRoZSBzYW1lIHdheSBpdCBtYWludGFpbnMKLQlzeW1ib2xzOiB0aGV5IGFyZSBsZWZ0IGFsb25lIHVudGlsIHJlcXVpcmVkLCB0aGVuIHJlYWQgaW4KLQllbi1tYXNzIGFuZCB0cmFuc2xhdGVkIGludG8gYW4gaW50ZXJuYWwgZm9ybS4gIEEgY29tbW9uCi0Jcm91dGluZSA8PGJmZF9wZXJmb3JtX3JlbG9jYXRpb24+PiBhY3RzIHVwb24gdGhlCi0JY2Fub25pY2FsIGZvcm0gdG8gZG8gdGhlIGZpeHVwLgotCi0JUmVsb2NhdGlvbnMgYXJlIG1haW50YWluZWQgb24gYSBwZXIgc2VjdGlvbiBiYXNpcywKLQl3aGlsZSBzeW1ib2xzIGFyZSBtYWludGFpbmVkIG9uIGEgcGVyIEJGRCBiYXNpcy4KLQotCUFsbCB0aGF0IGEgYmFjayBlbmQgaGFzIHRvIGRvIHRvIGZpdCB0aGUgQkZEIGludGVyZmFjZSBpcyB0byBjcmVhdGUKLQlhIDw8c3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5Pj4gZm9yIGVhY2ggcmVsb2NhdGlvbgotCWluIGEgcGFydGljdWxhciBzZWN0aW9uLCBhbmQgZmlsbCBpbiB0aGUgcmlnaHQgYml0cyBvZiB0aGUgc3RydWN0dXJlcy4KLQotQG1lbnUKLUAqIHR5cGVkZWYgYXJlbGVudDo6Ci1AKiBob3d0byBtYW5hZ2VyOjoKLUBlbmQgbWVudQotCi0qLwotCi0vKiBETyBjb21waWxlIGluIHRoZSByZWxvY19jb2RlIG5hbWUgdGFibGUgZnJvbSBsaWJiZmQuaC4gICovCi0jZGVmaW5lIF9CRkRfTUFLRV9UQUJMRV9iZmRfcmVsb2NfY29kZV9yZWFsCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0vKgotRE9DREQKLUlOT0RFCi0JdHlwZWRlZiBhcmVsZW50LCBob3d0byBtYW5hZ2VyLCBSZWxvY2F0aW9ucywgUmVsb2NhdGlvbnMKLQotU1VCU0VDVElPTgotCXR5cGVkZWYgYXJlbGVudAotCi0JVGhpcyBpcyB0aGUgc3RydWN0dXJlIG9mIGEgcmVsb2NhdGlvbiBlbnRyeToKLQotQ09ERV9GUkFHTUVOVAotLgotLnR5cGVkZWYgZW51bSBiZmRfcmVsb2Nfc3RhdHVzCi0uewotLiAgICAgICB7KiBObyBlcnJvcnMgZGV0ZWN0ZWQgKn0KLS4gIGJmZF9yZWxvY19vaywKLS4KLS4gICAgICAgeyogVGhlIHJlbG9jYXRpb24gd2FzIHBlcmZvcm1lZCwgYnV0IHRoZXJlIHdhcyBhbiBvdmVyZmxvdy4gKn0KLS4gIGJmZF9yZWxvY19vdmVyZmxvdywKLS4KLS4gICAgICAgeyogVGhlIGFkZHJlc3MgdG8gcmVsb2NhdGUgd2FzIG5vdCB3aXRoaW4gdGhlIHNlY3Rpb24gc3VwcGxpZWQuICp9Ci0uICBiZmRfcmVsb2Nfb3V0b2ZyYW5nZSwKLS4KLS4gICAgICAgeyogVXNlZCBieSBzcGVjaWFsIGZ1bmN0aW9ucyAqfQotLiAgYmZkX3JlbG9jX2NvbnRpbnVlLAotLgotLiAgICAgICB7KiBVbnN1cHBvcnRlZCByZWxvY2F0aW9uIHNpemUgcmVxdWVzdGVkLiAqfQotLiAgYmZkX3JlbG9jX25vdHN1cHBvcnRlZCwKLS4KLS4gICAgICAgeyogVW51c2VkICp9Ci0uICBiZmRfcmVsb2Nfb3RoZXIsCi0uCi0uICAgICAgIHsqIFRoZSBzeW1ib2wgdG8gcmVsb2NhdGUgYWdhaW5zdCB3YXMgdW5kZWZpbmVkLiAqfQotLiAgYmZkX3JlbG9jX3VuZGVmaW5lZCwKLS4KLS4gICAgICAgeyogVGhlIHJlbG9jYXRpb24gd2FzIHBlcmZvcm1lZCwgYnV0IG1heSBub3QgYmUgb2sgLSBwcmVzZW50bHkKLS4gICAgICAgICAgZ2VuZXJhdGVkIG9ubHkgd2hlbiBsaW5raW5nIGk5NjAgY29mZiBmaWxlcyB3aXRoIGk5NjAgYi5vdXQKLS4gICAgICAgICAgc3ltYm9scy4gIElmIHRoaXMgdHlwZSBpcyByZXR1cm5lZCwgdGhlIGVycm9yX21lc3NhZ2UgYXJndW1lbnQKLS4gICAgICAgICAgdG8gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiB3aWxsIGJlIHNldC4gICp9Ci0uICBiZmRfcmVsb2NfZGFuZ2Vyb3VzCi0uIH0KLS4gYmZkX3JlbG9jX3N0YXR1c190eXBlOwotLgotLgotLnR5cGVkZWYgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5Ci0uewotLiAgICAgICB7KiBBIHBvaW50ZXIgaW50byB0aGUgY2Fub25pY2FsIHRhYmxlIG9mIHBvaW50ZXJzICAqfQotLiAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKnN5bV9wdHJfcHRyOwotLgotLiAgICAgICB7KiBvZmZzZXQgaW4gc2VjdGlvbiAqfQotLiAgYmZkX3NpemVfdHlwZSBhZGRyZXNzOwotLgotLiAgICAgICB7KiBhZGRlbmQgZm9yIHJlbG9jYXRpb24gdmFsdWUgKn0KLS4gIGJmZF92bWEgYWRkZW5kOwotLgotLiAgICAgICB7KiBQb2ludGVyIHRvIGhvdyB0byBwZXJmb3JtIHRoZSByZXF1aXJlZCByZWxvY2F0aW9uICp9Ci0uICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLS4KLS59IGFyZWxlbnQ7Ci0KLSovCi0KLS8qCi1ERVNDUklQVElPTgotCi0gICAgICAgIEhlcmUgaXMgYSBkZXNjcmlwdGlvbiBvZiBlYWNoIG9mIHRoZSBmaWVsZHMgd2l0aGluIGFuIDw8YXJlbGVudD4+OgotCi0gICAgICAgIG8gPDxzeW1fcHRyX3B0cj4+Ci0KLSAgICAgICAgVGhlIHN5bWJvbCB0YWJsZSBwb2ludGVyIHBvaW50cyB0byBhIHBvaW50ZXIgdG8gdGhlIHN5bWJvbAotICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbG9jYXRpb24gcmVxdWVzdC4gIEl0IGlzCi0gICAgICAgIHRoZSBwb2ludGVyIGludG8gdGhlIHRhYmxlIHJldHVybmVkIGJ5IHRoZSBiYWNrIGVuZCdzCi0gICAgICAgIDw8Z2V0X3N5bXRhYj4+IGFjdGlvbi4gQHhyZWZ7U3ltYm9sc30uIFRoZSBzeW1ib2wgaXMgcmVmZXJlbmNlZAotICAgICAgICB0aHJvdWdoIGEgcG9pbnRlciB0byBhIHBvaW50ZXIgc28gdGhhdCB0b29scyBsaWtlIHRoZSBsaW5rZXIKLSAgICAgICAgY2FuIGZpeCB1cCBhbGwgdGhlIHN5bWJvbHMgb2YgdGhlIHNhbWUgbmFtZSBieSBtb2RpZnlpbmcgb25seQotICAgICAgICBvbmUgcG9pbnRlci4gVGhlIHJlbG9jYXRpb24gcm91dGluZSBsb29rcyBpbiB0aGUgc3ltYm9sIGFuZAotICAgICAgICB1c2VzIHRoZSBiYXNlIG9mIHRoZSBzZWN0aW9uIHRoZSBzeW1ib2wgaXMgYXR0YWNoZWQgdG8gYW5kIHRoZQotICAgICAgICB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFzIHRoZSBpbml0aWFsIHJlbG9jYXRpb24gb2Zmc2V0LiBJZiB0aGUKLSAgICAgICAgc3ltYm9sIHBvaW50ZXIgaXMgemVybywgdGhlbiB0aGUgc2VjdGlvbiBwcm92aWRlZCBpcyBsb29rZWQgdXAuCi0KLSAgICAgICAgbyA8PGFkZHJlc3M+PgotCi0gICAgICAgIFRoZSA8PGFkZHJlc3M+PiBmaWVsZCBnaXZlcyB0aGUgb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIGJhc2Ugb2YKLSAgICAgICAgdGhlIHNlY3Rpb24gZGF0YSB3aGljaCBvd25zIHRoZSByZWxvY2F0aW9uIHJlY29yZCB0byB0aGUgZmlyc3QKLSAgICAgICAgYnl0ZSBvZiByZWxvY2F0YWJsZSBpbmZvcm1hdGlvbi4gVGhlIGFjdHVhbCBkYXRhIHJlbG9jYXRlZAotICAgICAgICB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXMgcG9pbnQ7IGZvciBleGFtcGxlLCBhIHJlbG9jYXRpb24KLSAgICAgICAgdHlwZSB3aGljaCBtb2RpZmllcyB0aGUgYm90dG9tIHR3byBieXRlcyBvZiBhIGZvdXIgYnl0ZSB3b3JkCi0gICAgICAgIHdvdWxkIG5vdCB0b3VjaCB0aGUgZmlyc3QgYnl0ZSBwb2ludGVkIHRvIGluIGEgYmlnIGVuZGlhbgotICAgICAgICB3b3JsZC4KLQotCW8gPDxhZGRlbmQ+PgotCi0JVGhlIDw8YWRkZW5kPj4gaXMgYSB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYmFjayBlbmQgdG8gYmUgYWRkZWQgKCEpCi0JdG8gdGhlIHJlbG9jYXRpb24gb2Zmc2V0LiBJdHMgaW50ZXJwcmV0YXRpb24gaXMgZGVwZW5kZW50IHVwb24KLQl0aGUgaG93dG8uIEZvciBleGFtcGxlLCBvbiB0aGUgNjhrIHRoZSBjb2RlOgotCi0KLXwgICAgICAgIGNoYXIgZm9vW107Ci18ICAgICAgICBtYWluKCkKLXwgICAgICAgICAgICAgICAgewotfCAgICAgICAgICAgICAgICByZXR1cm4gZm9vWzB4MTIzNDU2NzhdOwotfCAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgQ291bGQgYmUgY29tcGlsZWQgaW50bzoKLQotfCAgICAgICAgbGlua3cgZnAsIy00Ci18ICAgICAgICBtb3ZlYiBAQCMxMjM0NTY3OCxkMAotfCAgICAgICAgZXh0YmwgZDAKLXwgICAgICAgIHVubGsgZnAKLXwgICAgICAgIHJ0cwotCi0KLSAgICAgICAgVGhpcyBjb3VsZCBjcmVhdGUgYSByZWxvYyBwb2ludGluZyB0byA8PGZvbz4+LCBidXQgbGVhdmUgdGhlCi0gICAgICAgIG9mZnNldCBpbiB0aGUgZGF0YSwgc29tZXRoaW5nIGxpa2U6Ci0KLQotfFJFTE9DQVRJT04gUkVDT1JEUyBGT1IgWy50ZXh0XToKLXxvZmZzZXQgICB0eXBlICAgICAgdmFsdWUKLXwwMDAwMDAwNiAzMiAgICAgICAgX2ZvbwotfAotfDAwMDAwMDAwIDRlNTYgZmZmYyAgICAgICAgICA7IGxpbmt3IGZwLCMtNAotfDAwMDAwMDA0IDEwMzkgMTIzNCA1Njc4ICAgICA7IG1vdmViIEBAIzEyMzQ1Njc4LGQwCi18MDAwMDAwMGEgNDljMCAgICAgICAgICAgICAgIDsgZXh0YmwgZDAKLXwwMDAwMDAwYyA0ZTVlICAgICAgICAgICAgICAgOyB1bmxrIGZwCi18MDAwMDAwMGUgNGU3NSAgICAgICAgICAgICAgIDsgcnRzCi0KLQotICAgICAgICBVc2luZyBjb2ZmIGFuZCBhbiA4OGssIHNvbWUgaW5zdHJ1Y3Rpb25zIGRvbid0IGhhdmUgZW5vdWdoCi0gICAgICAgIHNwYWNlIGluIHRoZW0gdG8gcmVwcmVzZW50IHRoZSBmdWxsIGFkZHJlc3MgcmFuZ2UsIGFuZAotICAgICAgICBwb2ludGVycyBoYXZlIHRvIGJlIGxvYWRlZCBpbiB0d28gcGFydHMuIFNvIHlvdSdkIGdldCBzb21ldGhpbmcgbGlrZToKLQotCi18ICAgICAgICBvci51ICAgICByMTMscjAsaGkxNihfZm9vKzB4MTIzNDU2NzgpCi18ICAgICAgICBsZC5iICAgICByMixyMTMsbG8xNihfZm9vKzB4MTIzNDU2NzgpCi18ICAgICAgICBqbXAgICAgICByMQotCi0KLSAgICAgICAgVGhpcyBzaG91bGQgY3JlYXRlIHR3byByZWxvY3MsIGJvdGggcG9pbnRpbmcgdG8gPDxfZm9vPj4sIGFuZCB3aXRoCi0gICAgICAgIDB4MTIzNDAwMDAgaW4gdGhlaXIgYWRkZW5kIGZpZWxkLiBUaGUgZGF0YSB3b3VsZCBjb25zaXN0IG9mOgotCi0KLXxSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFsudGV4dF06Ci18b2Zmc2V0ICAgdHlwZSAgICAgIHZhbHVlCi18MDAwMDAwMDIgSFZSVDE2ICAgIF9mb28rMHgxMjM0MDAwMAotfDAwMDAwMDA2IExWUlQxNiAgICBfZm9vKzB4MTIzNDAwMDAKLXwKLXwwMDAwMDAwMCA1ZGEwNTY3OCAgICAgICAgICAgOyBvci51IHIxMyxyMCwweDU2NzgKLXwwMDAwMDAwNCAxYzRkNTY3OCAgICAgICAgICAgOyBsZC5iIHIyLHIxMywweDU2NzgKLXwwMDAwMDAwOCBmNDAwYzAwMSAgICAgICAgICAgOyBqbXAgcjEKLQotCi0gICAgICAgIFRoZSByZWxvY2F0aW9uIHJvdXRpbmUgZGlncyBvdXQgdGhlIHZhbHVlIGZyb20gdGhlIGRhdGEsIGFkZHMKLSAgICAgICAgaXQgdG8gdGhlIGFkZGVuZCB0byBnZXQgdGhlIG9yaWdpbmFsIG9mZnNldCwgYW5kIHRoZW4gYWRkcyB0aGUKLSAgICAgICAgdmFsdWUgb2YgPDxfZm9vPj4uIE5vdGUgdGhhdCBhbGwgMzIgYml0cyBoYXZlIHRvIGJlIGtlcHQgYXJvdW5kCi0gICAgICAgIHNvbWV3aGVyZSwgdG8gY29wZSB3aXRoIGNhcnJ5IGZyb20gYml0IDE1IHRvIGJpdCAxNi4KLQotICAgICAgICBPbmUgZnVydGhlciBleGFtcGxlIGlzIHRoZSBzcGFyYyBhbmQgdGhlIGEub3V0IGZvcm1hdC4gVGhlCi0gICAgICAgIHNwYXJjIGhhcyBhIHNpbWlsYXIgcHJvYmxlbSB0byB0aGUgODhrLCBpbiB0aGF0IHNvbWUKLSAgICAgICAgaW5zdHJ1Y3Rpb25zIGRvbid0IGhhdmUgcm9vbSBmb3IgYW4gZW50aXJlIG9mZnNldCwgYnV0IG9uIHRoZQotICAgICAgICBzcGFyYyB0aGUgcGFydHMgYXJlIGNyZWF0ZWQgaW4gb2RkIHNpemVkIGx1bXBzLiBUaGUgZGVzaWduZXJzIG9mCi0gICAgICAgIHRoZSBhLm91dCBmb3JtYXQgY2hvc2UgdG8gbm90IHVzZSB0aGUgZGF0YSB3aXRoaW4gdGhlIHNlY3Rpb24KLSAgICAgICAgZm9yIHN0b3JpbmcgcGFydCBvZiB0aGUgb2Zmc2V0OyBhbGwgdGhlIG9mZnNldCBpcyBrZXB0IHdpdGhpbgotICAgICAgICB0aGUgcmVsb2MuIEFueXRoaW5nIGluIHRoZSBkYXRhIHNob3VsZCBiZSBpZ25vcmVkLgotCi18ICAgICAgICBzYXZlICVzcCwtMTEyLCVzcAotfCAgICAgICAgc2V0aGkgJWhpKF9mb28rMHgxMjM0NTY3OCksJWcyCi18ICAgICAgICBsZHNiIFslZzIrJWxvKF9mb28rMHgxMjM0NTY3OCldLCVpMAotfCAgICAgICAgcmV0Ci18ICAgICAgICByZXN0b3JlCi0KLSAgICAgICAgQm90aCByZWxvY3MgY29udGFpbiBhIHBvaW50ZXIgdG8gPDxmb28+PiwgYW5kIHRoZSBvZmZzZXRzCi0gICAgICAgIGNvbnRhaW4ganVuay4KLQotCi18UkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbLnRleHRdOgotfG9mZnNldCAgIHR5cGUgICAgICB2YWx1ZQotfDAwMDAwMDA0IEhJMjIgICAgICBfZm9vKzB4MTIzNDU2NzgKLXwwMDAwMDAwOCBMTzEwICAgICAgX2ZvbysweDEyMzQ1Njc4Ci18Ci18MDAwMDAwMDAgOWRlM2JmOTAgICAgIDsgc2F2ZSAlc3AsLTExMiwlc3AKLXwwMDAwMDAwNCAwNTAwMDAwMCAgICAgOyBzZXRoaSAlaGkoX2ZvbyswKSwlZzIKLXwwMDAwMDAwOCBmMDQ4YTAwMCAgICAgOyBsZHNiIFslZzIrJWxvKF9mb28rMCldLCVpMAotfDAwMDAwMDBjIDgxYzdlMDA4ICAgICA7IHJldAotfDAwMDAwMDEwIDgxZTgwMDAwICAgICA7IHJlc3RvcmUKLQotCi0gICAgICAgIG8gPDxob3d0bz4+Ci0KLSAgICAgICAgVGhlIDw8aG93dG8+PiBmaWVsZCBjYW4gYmUgaW1hZ2luZWQgYXMgYQotICAgICAgICByZWxvY2F0aW9uIGluc3RydWN0aW9uLiBJdCBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgd2hpY2gKLSAgICAgICAgY29udGFpbnMgaW5mb3JtYXRpb24gb24gd2hhdCB0byBkbyB3aXRoIGFsbCBvZiB0aGUgb3RoZXIKLSAgICAgICAgaW5mb3JtYXRpb24gaW4gdGhlIHJlbG9jIHJlY29yZCBhbmQgZGF0YSBzZWN0aW9uLiBBIGJhY2sgZW5kCi0gICAgICAgIHdvdWxkIG5vcm1hbGx5IGhhdmUgYSByZWxvY2F0aW9uIGluc3RydWN0aW9uIHNldCBhbmQgdHVybgotICAgICAgICByZWxvY2F0aW9ucyBpbnRvIHBvaW50ZXJzIHRvIHRoZSBjb3JyZWN0IHN0cnVjdHVyZSBvbiBpbnB1dCAtCi0gICAgICAgIGJ1dCBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBjcmVhdGUgZWFjaCBob3d0byBmaWVsZCBvbiBkZW1hbmQuCi0KLSovCi0KLS8qCi1TVUJTVUJTRUNUSU9OCi0JPDxlbnVtIGNvbXBsYWluX292ZXJmbG93Pj4KLQotCUluZGljYXRlcyB3aGF0IHNvcnQgb2Ygb3ZlcmZsb3cgY2hlY2tpbmcgc2hvdWxkIGJlIGRvbmUgd2hlbgotCXBlcmZvcm1pbmcgYSByZWxvY2F0aW9uLgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0uZW51bSBjb21wbGFpbl9vdmVyZmxvdwotLnsKLS4JeyogRG8gbm90IGNvbXBsYWluIG9uIG92ZXJmbG93LiAqfQotLiAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLS4KLS4JeyogQ29tcGxhaW4gaWYgdGhlIGJpdGZpZWxkIG92ZXJmbG93cywgd2hldGhlciBpdCBpcyBjb25zaWRlcmVkCi0uCSAgIGFzIHNpZ25lZCBvciB1bnNpZ25lZC4gKn0KLS4gIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotLgotLgl7KiBDb21wbGFpbiBpZiB0aGUgdmFsdWUgb3ZlcmZsb3dzIHdoZW4gY29uc2lkZXJlZCBhcyBzaWduZWQKLS4JICAgbnVtYmVyLiAqfQotLiAgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotLgotLgl7KiBDb21wbGFpbiBpZiB0aGUgdmFsdWUgb3ZlcmZsb3dzIHdoZW4gY29uc2lkZXJlZCBhcyBhbgotLgkgICB1bnNpZ25lZCBudW1iZXIuICp9Ci0uICBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZAotLn07Ci0KLSovCi0KLS8qCi1TVUJTVUJTRUNUSU9OCi0gICAgICAgIDw8cmVsb2NfaG93dG9fdHlwZT4+Ci0KLSAgICAgICAgVGhlIDw8cmVsb2NfaG93dG9fdHlwZT4+IGlzIGEgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUKLSAgICAgICAgaW5mb3JtYXRpb24gdGhhdCBsaWJiZmQgbmVlZHMgdG8ga25vdyB0byB0aWUgdXAgYSBiYWNrIGVuZCdzIGRhdGEuCi0KLUNPREVfRlJBR01FTlQKLS5zdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5OwkJeyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqfQotLgotLnN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QKLS57Ci0uICAgICAgIHsqICBUaGUgdHlwZSBmaWVsZCBoYXMgbWFpbmx5IGEgZG9jdW1lbnRhcnkgdXNlIC0gdGhlIGJhY2sgZW5kIGNhbgotLiAgICAgICAgICAgZG8gd2hhdCBpdCB3YW50cyB3aXRoIGl0LCB0aG91Z2ggbm9ybWFsbHkgdGhlIGJhY2sgZW5kJ3MKLS4gICAgICAgICAgIGV4dGVybmFsIGlkZWEgb2Ygd2hhdCBhIHJlbG9jIG51bWJlciBpcyBzdG9yZWQKLS4gICAgICAgICAgIGluIHRoaXMgZmllbGQuIEZvciBleGFtcGxlLCBhIFBDIHJlbGF0aXZlIHdvcmQgcmVsb2NhdGlvbgotLiAgICAgICAgICAgaW4gYSBjb2ZmIGVudmlyb25tZW50IGhhcyB0aGUgdHlwZSAwMjMgLSBiZWNhdXNlIHRoYXQncwotLiAgICAgICAgICAgd2hhdCB0aGUgb3V0c2lkZSB3b3JsZCBjYWxscyBhIFJfUENSV09SRCByZWxvYy4gKn0KLS4gIHVuc2lnbmVkIGludCB0eXBlOwotLgotLiAgICAgICB7KiAgVGhlIHZhbHVlIHRoZSBmaW5hbCByZWxvY2F0aW9uIGlzIHNoaWZ0ZWQgcmlnaHQgYnkuIFRoaXMgZHJvcHMKLS4gICAgICAgICAgIHVud2FudGVkIGRhdGEgZnJvbSB0aGUgcmVsb2NhdGlvbi4gICp9Ci0uICB1bnNpZ25lZCBpbnQgcmlnaHRzaGlmdDsKLS4KLS4JeyogIFRoZSBzaXplIG9mIHRoZSBpdGVtIHRvIGJlIHJlbG9jYXRlZC4gIFRoaXMgaXMgKm5vdCogYQotLgkgICAgcG93ZXItb2YtdHdvIG1lYXN1cmUuICBUbyBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBvcGVyYXRlZAotLgkgICAgb24gYnkgYSB0eXBlIG9mIHJlbG9jYXRpb24sIHVzZSBiZmRfZ2V0X3JlbG9jX3NpemUuICAqfQotLiAgaW50IHNpemU7Ci0uCi0uICAgICAgIHsqICBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGl0ZW0gdG8gYmUgcmVsb2NhdGVkLiAgVGhpcyBpcyB1c2VkCi0uCSAgICB3aGVuIGRvaW5nIG92ZXJmbG93IGNoZWNraW5nLiAgKn0KLS4gIHVuc2lnbmVkIGludCBiaXRzaXplOwotLgotLiAgICAgICB7KiAgTm90ZXMgdGhhdCB0aGUgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gaW4gdGhlCi0uICAgICAgICAgICBkYXRhIHNlY3Rpb24gb2YgdGhlIGFkZGVuZC4gVGhlIHJlbG9jYXRpb24gZnVuY3Rpb24gd2lsbAotLiAgICAgICAgICAgc3VidHJhY3QgZnJvbSB0aGUgcmVsb2NhdGlvbiB2YWx1ZSB0aGUgYWRkcmVzcyBvZiB0aGUgbG9jYXRpb24KLS4gICAgICAgICAgIGJlaW5nIHJlbG9jYXRlZC4gKn0KLS4gIGJvb2xlYW4gcGNfcmVsYXRpdmU7Ci0uCi0uCXsqICBUaGUgYml0IHBvc2l0aW9uIG9mIHRoZSByZWxvYyB2YWx1ZSBpbiB0aGUgZGVzdGluYXRpb24uCi0uCSAgICBUaGUgcmVsb2NhdGVkIHZhbHVlIGlzIGxlZnQgc2hpZnRlZCBieSB0aGlzIGFtb3VudC4gKn0KLS4gIHVuc2lnbmVkIGludCBiaXRwb3M7Ci0uCi0uCXsqIFdoYXQgdHlwZSBvZiBvdmVyZmxvdyBlcnJvciBzaG91bGQgYmUgY2hlY2tlZCBmb3Igd2hlbgotLgkgICByZWxvY2F0aW5nLiAqfQotLiAgZW51bSBjb21wbGFpbl9vdmVyZmxvdyBjb21wbGFpbl9vbl9vdmVyZmxvdzsKLS4KLS4gICAgICAgeyogSWYgdGhpcyBmaWVsZCBpcyBub24gbnVsbCwgdGhlbiB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gaXMKLS4gICAgICAgICAgY2FsbGVkIHJhdGhlciB0aGFuIHRoZSBub3JtYWwgZnVuY3Rpb24uIFRoaXMgYWxsb3dzIHJlYWxseQotLiAgICAgICAgICBzdHJhbmdlIHJlbG9jYXRpb24gbWV0aG9kcyB0byBiZSBhY2NvbW9kYXRlZCAoZS5nLiwgaTk2MCBjYWxsagotLiAgICAgICAgICBpbnN0cnVjdGlvbnMpLiAqfQotLiAgYmZkX3JlbG9jX3N0YXR1c190eXBlICgqc3BlY2lhbF9mdW5jdGlvbikKLS4JCQkJICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwKLS4JCQkJCSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnksCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2wsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFIgZGF0YSwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkICpvdXRwdXRfYmZkLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKLS4KLS4gICAgICAgeyogVGhlIHRleHR1YWwgbmFtZSBvZiB0aGUgcmVsb2NhdGlvbiB0eXBlLiAqfQotLiAgY2hhciAqbmFtZTsKLS4KLS4gICAgICAgeyogV2hlbiBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rLCBzb21lIGZvcm1hdHMgbXVzdCBtb2RpZnkgdGhlCi0uICAgICAgICAgIHJlbG9jYXRpb25zIHJhdGhlciB0aGFuIHRoZSBkYXRhIC0gdGhpcyBmbGFnIHNpZ25hbHMgdGhpcy4qfQotLiAgYm9vbGVhbiBwYXJ0aWFsX2lucGxhY2U7Ci0uCi0uICAgICAgIHsqIFRoZSBzcmNfbWFzayBzZWxlY3RzIHdoaWNoIHBhcnRzIG9mIHRoZSByZWFkIGluIGRhdGEKLS4gICAgICAgICAgYXJlIHRvIGJlIHVzZWQgaW4gdGhlIHJlbG9jYXRpb24gc3VtLiAgRS5nLiwgaWYgdGhpcyB3YXMgYW4gOCBiaXQKLS4gICAgICAgICAgYml0IG9mIGRhdGEgd2hpY2ggd2UgcmVhZCBhbmQgcmVsb2NhdGVkLCB0aGlzIHdvdWxkIGJlCi0uICAgICAgICAgIDB4MDAwMDAwZmYuIFdoZW4gd2UgaGF2ZSByZWxvY3Mgd2hpY2ggaGF2ZSBhbiBhZGRlbmQsIHN1Y2ggYXMKLS4gICAgICAgICAgc3VuNCBleHRlbmRlZCByZWxvY3MsIHRoZSB2YWx1ZSBpbiB0aGUgb2Zmc2V0IHBhcnQgb2YgYQotLiAgICAgICAgICByZWxvY2F0aW5nIGZpZWxkIGlzIGdhcmJhZ2Ugc28gd2UgbmV2ZXIgdXNlIGl0LiBJbiB0aGlzIGNhc2UKLS4gICAgICAgICAgdGhlIG1hc2sgd291bGQgYmUgMHgwMDAwMDAwMC4gKn0KLS4gIGJmZF92bWEgc3JjX21hc2s7Ci0uCi0uICAgICAgIHsqIFRoZSBkc3RfbWFzayBzZWxlY3RzIHdoaWNoIHBhcnRzIG9mIHRoZSBpbnN0cnVjdGlvbiBhcmUgcmVwbGFjZWQKLS4gICAgICAgICAgaW50byB0aGUgaW5zdHJ1Y3Rpb24uIEluIG1vc3QgY2FzZXMgc3JjX21hc2sgPT0gZHN0X21hc2ssCi0uICAgICAgICAgIGV4Y2VwdCBpbiB0aGUgYWJvdmUgc3BlY2lhbCBjYXNlLCB3aGVyZSBkc3RfbWFzayB3b3VsZCBiZQotLiAgICAgICAgICAweDAwMDAwMGZmLCBhbmQgc3JjX21hc2sgd291bGQgYmUgMHgwMDAwMDAwMC4gICAqfQotLiAgYmZkX3ZtYSBkc3RfbWFzazsKLS4KLS4gICAgICAgeyogV2hlbiBzb21lIGZvcm1hdHMgY3JlYXRlIFBDIHJlbGF0aXZlIGluc3RydWN0aW9ucywgdGhleSBsZWF2ZQotLiAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBjIG9mIHRoZSBwbGFjZSBiZWluZyByZWxvY2F0ZWQgaW4gdGhlIG9mZnNldAotLiAgICAgICAgICBzbG90IG9mIHRoZSBpbnN0cnVjdGlvbiwgc28gdGhhdCBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gY2FuCi0uICAgICAgICAgIGJlIG1hZGUganVzdCBieSBhZGRpbmcgaW4gYW4gb3JkaW5hcnkgb2Zmc2V0IChlLmcuLCBzdW4zIGEub3V0KS4KLS4gICAgICAgICAgU29tZSBmb3JtYXRzIGxlYXZlIHRoZSBkaXNwbGFjZW1lbnQgcGFydCBvZiBhbiBpbnN0cnVjdGlvbgotLiAgICAgICAgICBlbXB0eSAoZS5nLiwgbTg4ayBiY3MpOyB0aGlzIGZsYWcgc2lnbmFscyB0aGUgZmFjdC4qfQotLiAgYm9vbGVhbiBwY3JlbF9vZmZzZXQ7Ci0uCi0ufTsKLQotKi8KLQotLyoKLUZVTkNUSU9OCi0JVGhlIEhPV1RPIE1hY3JvCi0KLURFU0NSSVBUSU9OCi0JVGhlIEhPV1RPIGRlZmluZSBpcyBob3JyaWJsZSBhbmQgd2lsbCBnbyBhd2F5LgotCi0KLS4jZGVmaW5lIEhPV1RPKEMsIFIsUyxCLCBQLCBCSSwgTywgU0YsIE5BTUUsIElOUExBQ0UsIE1BU0tTUkMsIE1BU0tEU1QsIFBDKSBcCi0uICB7KHVuc2lnbmVkKUMsUixTLEIsIFAsIEJJLCBPLFNGLE5BTUUsSU5QTEFDRSxNQVNLU1JDLE1BU0tEU1QsUEN9Ci0KLURFU0NSSVBUSU9OCi0JQW5kIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG90YWxseSBtYWdpYyB3YXkuIEJ1dCBmb3IgdGhlCi0JbW9tZW50LCB3ZSBhcmUgY29tcGF0aWJsZSwgc28gZG8gaXQgdGhpcyB3YXkuCi0KLQotLiNkZWZpbmUgTkVXSE9XVE8oIEZVTkNUSU9OLCBOQU1FLFNJWkUsUkVMLElOKSBIT1dUTygwLDAsU0laRSwwLFJFTCwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsRlVOQ1RJT04sIE5BTUUsZmFsc2UsMCwwLElOKQotLgotREVTQ1JJUFRJT04KLQlIZWxwZXIgcm91dGluZSB0byB0dXJuIGEgc3ltYm9sIGludG8gYSByZWxvY2F0aW9uIHZhbHVlLgotCi0uI2RlZmluZSBIT1dUT19QUkVQQVJFKHJlbG9jYXRpb24sIHN5bWJvbCkgICAgICBcCi0uICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0uICBpZiAoc3ltYm9sICE9IChhc3ltYm9sICopTlVMTCkgeyAgICAgICAgICAgICBcCi0uICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpIHsgXAotLiAgICAgIHJlbG9jYXRpb24gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLiAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLiAgICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOyAgICAgICAgICAgICAgXAotLiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLiAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLn0KLQotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9yZWxvY19zaXplCi0KLVNZTk9QU0lTCi0JdW5zaWduZWQgaW50IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG9fdHlwZSAqKTsKLQotREVTQ1JJUFRJT04KLQlGb3IgYSByZWxvY19ob3d0b190eXBlIHRoYXQgb3BlcmF0ZXMgb24gYSBmaXhlZCBudW1iZXIgb2YgYnl0ZXMsCi0JdGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb3BlcmF0ZWQgb24uCi0gKi8KLQotdW5zaWduZWQgaW50Ci1iZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLXsKLSAgc3dpdGNoIChob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOiByZXR1cm4gMTsKLSAgICBjYXNlIDE6IHJldHVybiAyOwotICAgIGNhc2UgMjogcmV0dXJuIDQ7Ci0gICAgY2FzZSAzOiByZXR1cm4gMDsKLSAgICBjYXNlIDQ6IHJldHVybiA4OwotICAgIGNhc2UgODogcmV0dXJuIDE2OwotICAgIGNhc2UgLTI6IHJldHVybiA0OwotICAgIGRlZmF1bHQ6IGFib3J0ICgpOwotICAgIH0KLX0KLQotLyoKLVRZUEVERUYKLQlhcmVsZW50X2NoYWluCi0KLURFU0NSSVBUSU9OCi0KLQlIb3cgcmVsb2NzIGFyZSB0aWVkIHRvZ2V0aGVyIGluIGFuIDw8YXNlY3Rpb24+PjoKLQotLnR5cGVkZWYgc3RydWN0IHJlbGVudF9jaGFpbiB7Ci0uICBhcmVsZW50IHJlbGVudDsKLS4gIHN0cnVjdCAgIHJlbGVudF9jaGFpbiAqbmV4dDsKLS59IGFyZWxlbnRfY2hhaW47Ci0KLSovCi0KLS8qIE5fT05FUyBwcm9kdWNlcyBOIG9uZSBiaXRzLCB3aXRob3V0IG92ZXJmbG93aW5nIG1hY2hpbmUgYXJpdGhtZXRpYy4gICovCi0jZGVmaW5lIE5fT05FUyhuKSAoKCgoKGJmZF92bWEpIDEgPDwgKChuKSAtIDEpKSAtIDEpIDw8IDEpIHwgMSkKLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NoZWNrX292ZXJmbG93Ci0KLVNZTk9QU0lTCi0JYmZkX3JlbG9jX3N0YXR1c190eXBlCi0JCWJmZF9jaGVja19vdmVyZmxvdwotCQkJKGVudW0gY29tcGxhaW5fb3ZlcmZsb3cgaG93LAotCQkJIHVuc2lnbmVkIGludCBiaXRzaXplLAotCQkJIHVuc2lnbmVkIGludCByaWdodHNoaWZ0LAotCQkJIHVuc2lnbmVkIGludCBhZGRyc2l6ZSwKLQkJCSBiZmRfdm1hIHJlbG9jYXRpb24pOwotCi1ERVNDUklQVElPTgotCVBlcmZvcm0gb3ZlcmZsb3cgY2hlY2tpbmcgb24gQHZhcntyZWxvY2F0aW9ufSB3aGljaCBoYXMKLQlAdmFye2JpdHNpemV9IHNpZ25pZmljYW50IGJpdHMgYW5kIHdpbGwgYmUgc2hpZnRlZCByaWdodCBieQotCUB2YXJ7cmlnaHRzaGlmdH0gYml0cywgb24gYSBtYWNoaW5lIHdpdGggYWRkcmVzc2VzIGNvbnRhaW5pbmcKLQlAdmFye2FkZHJzaXplfSBzaWduaWZpY2FudCBiaXRzLiAgVGhlIHJlc3VsdCBpcyBlaXRoZXIgb2YKLQlAY29kZXtiZmRfcmVsb2Nfb2t9IG9yIEBjb2Rle2JmZF9yZWxvY19vdmVyZmxvd30uCi0KLSovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX2NoZWNrX292ZXJmbG93IChob3csIGJpdHNpemUsIHJpZ2h0c2hpZnQsIGFkZHJzaXplLCByZWxvY2F0aW9uKQotICAgICBlbnVtIGNvbXBsYWluX292ZXJmbG93IGhvdzsKLSAgICAgdW5zaWduZWQgaW50IGJpdHNpemU7Ci0gICAgIHVuc2lnbmVkIGludCByaWdodHNoaWZ0OwotICAgICB1bnNpZ25lZCBpbnQgYWRkcnNpemU7Ci0gICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLXsKLSAgYmZkX3ZtYSBmaWVsZG1hc2ssIGFkZHJtYXNrLCBzaWdubWFzaywgc3MsIGE7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotCi0gIGEgPSByZWxvY2F0aW9uOwotCi0gIC8qIE5vdGU6IEJJVFNJWkUgc2hvdWxkIGFsd2F5cyBiZSA8PSBBRERSU0laRSwgYnV0IGluIGNhc2UgaXQncyBub3QsCi0gICAgIHdlJ2xsIGJlIHBlcm1pc3NpdmU6IGV4dHJhIGJpdHMgaW4gdGhlIGZpZWxkIG1hc2sgd2lsbAotICAgICBhdXRvbWF0aWNhbGx5IGV4dGVuZCB0aGUgYWRkcmVzcyBtYXNrIGZvciBwdXJwb3NlcyBvZiB0aGUKLSAgICAgb3ZlcmZsb3cgY2hlY2suICAqLwotICBmaWVsZG1hc2sgPSBOX09ORVMgKGJpdHNpemUpOwotICBhZGRybWFzayA9IE5fT05FUyAoYWRkcnNpemUpIHwgZmllbGRtYXNrOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGNvbXBsYWluX292ZXJmbG93X2RvbnQ6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkOgotICAgICAgLyogSWYgYW55IHNpZ24gYml0cyBhcmUgc2V0LCBhbGwgc2lnbiBiaXRzIG11c3QgYmUgc2V0LiAgVGhhdAotICAgICAgICAgaXMsIEEgbXVzdCBiZSBhIHZhbGlkIG5lZ2F0aXZlIGFkZHJlc3MgYWZ0ZXIgc2hpZnRpbmcuICAqLwotICAgICAgYSA9IChhICYgYWRkcm1hc2spID4+IHJpZ2h0c2hpZnQ7Ci0gICAgICBzaWdubWFzayA9IH4gKGZpZWxkbWFzayA+PiAxKTsKLSAgICAgIHNzID0gYSAmIHNpZ25tYXNrOwotICAgICAgaWYgKHNzICE9IDAgJiYgc3MgIT0gKChhZGRybWFzayA+PiByaWdodHNoaWZ0KSAmIHNpZ25tYXNrKSkKLQlmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkOgotICAgICAgLyogV2UgaGF2ZSBhbiBvdmVyZmxvdyBpZiB0aGUgYWRkcmVzcyBkb2VzIG5vdCBmaXQgaW4gdGhlIGZpZWxkLiAgKi8KLSAgICAgIGEgPSAoYSAmIGFkZHJtYXNrKSA+PiByaWdodHNoaWZ0OwotICAgICAgaWYgKChhICYgfiBmaWVsZG1hc2spICE9IDApCi0JZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZDoKLSAgICAgIC8qIEJpdGZpZWxkcyBhcmUgc29tZXRpbWVzIHNpZ25lZCwgc29tZXRpbWVzIHVuc2lnbmVkLiAgV2UKLSAgICAgICAgIG92ZXJmbG93IGlmIHRoZSB2YWx1ZSBoYXMgc29tZSwgYnV0IG5vdCBhbGwsIGJpdHMgc2V0IG91dHNpZGUKLSAgICAgICAgIHRoZSBmaWVsZCwgb3IgaWYgaXQgaGFzIGFueSBiaXRzIHNldCBvdXRzaWRlIHRoZSBmaWVsZCBidXQKLSAgICAgICAgIHRoZSBzaWduIGJpdCBpcyBub3Qgc2V0LiAgKi8KLSAgICAgIGEgPj49IHJpZ2h0c2hpZnQ7Ci0gICAgICBpZiAoKGEgJiB+IGZpZWxkbWFzaykgIT0gMCkKLQl7Ci0JICBzaWdubWFzayA9IChmaWVsZG1hc2sgPj4gMSkgKyAxOwotCSAgc3MgPSAoc2lnbm1hc2sgPDwgcmlnaHRzaGlmdCkgLSAxOwotCSAgaWYgKChzcyB8IHJlbG9jYXRpb24pICE9IH4gKGJmZF92bWEpIDApCi0JICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHVybiBmbGFnOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfcGVyZm9ybV9yZWxvY2F0aW9uCi0KLVNZTk9QU0lTCi0JYmZkX3JlbG9jX3N0YXR1c190eXBlCi0gICAgICAgICAgICAgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgKGJmZCAqYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQVFIgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkgY2hhciAqKmVycm9yX21lc3NhZ2UpOwotCi1ERVNDUklQVElPTgotCUlmIEB2YXJ7b3V0cHV0X2JmZH0gaXMgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiwgdGhlCi0JZ2VuZXJhdGVkIGltYWdlIHdpbGwgYmUgcmVsb2NhdGFibGU7IHRoZSByZWxvY2F0aW9ucyBhcmUKLQljb3BpZWQgdG8gdGhlIG91dHB1dCBmaWxlIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGNoYW5nZWQgdG8KLQlyZWZsZWN0IHRoZSBuZXcgc3RhdGUgb2YgdGhlIHdvcmxkLiBUaGVyZSBhcmUgdHdvIHdheXMgb2YKLQlyZWZsZWN0aW5nIHRoZSByZXN1bHRzIG9mIHBhcnRpYWwgbGlua2FnZSBpbiBhbiBvdXRwdXQgZmlsZToKLQlieSBtb2RpZnlpbmcgdGhlIG91dHB1dCBkYXRhIGluIHBsYWNlLCBhbmQgYnkgbW9kaWZ5aW5nIHRoZQotCXJlbG9jYXRpb24gcmVjb3JkLiAgU29tZSBuYXRpdmUgZm9ybWF0cyAoZS5nLiwgYmFzaWMgYS5vdXQgYW5kCi0JYmFzaWMgY29mZikgaGF2ZSBubyB3YXkgb2Ygc3BlY2lmeWluZyBhbiBhZGRlbmQgaW4gdGhlCi0JcmVsb2NhdGlvbiB0eXBlLCBzbyB0aGUgYWRkZW5kIGhhcyB0byBnbyBpbiB0aGUgb3V0cHV0IGRhdGEuCi0JVGhpcyBpcyBubyBiaWcgZGVhbCBzaW5jZSBpbiB0aGVzZSBmb3JtYXRzIHRoZSBvdXRwdXQgZGF0YQotCXNsb3Qgd2lsbCBhbHdheXMgYmUgYmlnIGVub3VnaCBmb3IgdGhlIGFkZGVuZC4gQ29tcGxleCByZWxvYwotCXR5cGVzIHdpdGggYWRkZW5kcyB3ZXJlIGludmVudGVkIHRvIHNvbHZlIGp1c3QgdGhpcyBwcm9ibGVtLgotCVRoZSBAdmFye2Vycm9yX21lc3NhZ2V9IGFyZ3VtZW50IGlzIHNldCB0byBhbiBlcnJvciBtZXNzYWdlIGlmCi0JdGhpcyByZXR1cm4gQGNvZGV7YmZkX3JlbG9jX2Rhbmdlcm91c30uCi0KLSovCi0KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChhYmZkLCByZWxvY19lbnRyeSwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkJCWVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLSAgYXNlY3Rpb24gKnJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbjsKLSAgYXN5bWJvbCAqc3ltYm9sOwotCi0gIHN5bWJvbCA9ICoocmVsb2NfZW50cnktPnN5bV9wdHJfcHRyKTsKLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHJldHVybiBhbiBlcnJvciBpZgotICAgICB0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkLiAgQW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sIGlzCi0gICAgIGNvbnNpZGVyZWQgdG8gaGF2ZSBhIHZhbHVlIG9mIHplcm8gKFNWUjQgQUJJLCBwLiA0LTI3KS4gICovCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDAKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIGZsYWcgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIC8qIElmIHRoZXJlIGlzIGEgZnVuY3Rpb24gc3VwcGxpZWQgdG8gaGFuZGxlIHRoaXMgcmVsb2NhdGlvbiB0eXBlLAotICAgICBjYWxsIGl0LiAgSXQnbGwgcmV0dXJuIGBiZmRfcmVsb2NfY29udGludWUnIGlmIGZ1cnRoZXIgcHJvY2Vzc2luZwotICAgICBjYW4gYmUgZG9uZS4gICovCi0gIGlmIChob3d0by0+c3BlY2lhbF9mdW5jdGlvbikKLSAgICB7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29udDsKLSAgICAgIGNvbnQgPSBob3d0by0+c3BlY2lhbF9mdW5jdGlvbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCQkgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkJCSAgICAgIGVycm9yX21lc3NhZ2UpOwotICAgICAgaWYgKGNvbnQgIT0gYmZkX3JlbG9jX2NvbnRpbnVlKQotCXJldHVybiBjb250OwotICAgIH0KLQotICAvKiBJcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiByZWFsbHkgd2l0aGluIHRoZSBzZWN0aW9uPyAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCi0gICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KLQotICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotCi0gIHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbiA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgLyogQ29udmVydCBpbnB1dC1zZWN0aW9uLXJlbGF0aXZlIHN5bWJvbCB2YWx1ZSB0byBhYnNvbHV0ZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICYmIGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UpCi0gICAgb3V0cHV0X2Jhc2UgPSAwOwotICBlbHNlCi0gICAgb3V0cHV0X2Jhc2UgPSByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICByZWxvY2F0aW9uICs9IG91dHB1dF9iYXNlICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIC8qIEFkZCBpbiBzdXBwbGllZCBhZGRlbmQuICAqLwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgLyogSGVyZSB0aGUgdmFyaWFibGUgcmVsb2NhdGlvbiBob2xkcyB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUKLSAgICAgc3ltYm9sIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QsIHBsdXMgYW55IGFkZGVuZC4gICovCi0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgV2Ugd2FudCB0byBzZXQgUkVMT0NBVElPTgotCSB0byB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIGFuZCB0aGUKLQkgbG9jYXRpb24uICBSRUxPQ0FUSU9OIGlzIGFscmVhZHkgdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4KLQotCSBXZSBzdGFydCBieSBzdWJ0cmFjdGluZyB0aGUgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBjb250YWluaW5nCi0JIHRoZSBsb2NhdGlvbi4KLQotCSBJZiBwY3JlbF9vZmZzZXQgaXMgc2V0LCB3ZSBtdXN0IGZ1cnRoZXIgc3VidHJhY3QgdGhlIHBvc2l0aW9uCi0JIG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24uICBTb21lIHRhcmdldHMgYXJyYW5nZSBmb3IKLQkgdGhlIGFkZGVuZCB0byBiZSB0aGUgbmVnYXRpdmUgb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbgotCSB3aXRoaW4gdGhlIHNlY3Rpb247IGZvciBleGFtcGxlLCBpMzg2LWFvdXQgZG9lcyB0aGlzLiAgRm9yCi0JIGkzODYtYW91dCwgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlLiAgU29tZSBvdGhlciB0YXJnZXRzIGRvIG5vdAotCSBpbmNsdWRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgbG9jYXRpb247IGZvciBleGFtcGxlLCBtODhrYmNzLAotCSBvciBFTEYuICBGb3IgdGhvc2UgdGFyZ2V0cywgcGNyZWxfb2Zmc2V0IGlzIHRydWUuCi0KLQkgSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGVuIHdlIG11c3QgZW5zdXJlCi0JIHRoYXQgdGhpcyByZWxvYyB3aWxsIGJlIGNvcnJlY3RseSBjb21wdXRlZCB3aGVuIHRoZSBmaW5hbAotCSByZWxvY2F0aW9uIGlzIGRvbmUuICBJZiBwY3JlbF9vZmZzZXQgaXMgZmFsc2Ugd2Ugd2FudCB0byB3aW5kCi0JIHVwIHdpdGggdGhlIG5lZ2F0aXZlIG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24sCi0JIHdoaWNoIG1lYW5zIHdlIG11c3QgYWRqdXN0IHRoZSBleGlzdGluZyBhZGRlbmQgYnkgdGhlIGNoYW5nZQotCSBpbiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIHRydWUKLQkgd2UgZG8gbm90IHdhbnQgdG8gYWRqdXN0IHRoZSBleGlzdGluZyBhZGRlbmQgYXQgYWxsLgotCi0JIEZJWE1FOiBUaGlzIHNlZW1zIGxvZ2ljYWwgdG8gbWUsIGJ1dCBmb3IgdGhlIGNhc2Ugb2YKLQkgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQgaXQgaXMgbm90IHdoYXQgdGhlIGNvZGUKLQkgYWN0dWFsbHkgZG9lcy4gIEkgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgaXQsIGJlY2F1c2UgaXQgc2VlbXMKLQkgZmFyIHRvbyBsaWtlbHkgdGhhdCBzb21ldGhpbmcgd2lsbCBicmVhay4gICovCi0KLSAgICAgIHJlbG9jYXRpb24gLT0KLQlpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQgPT0gdHJ1ZSkKLQlyZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UpCi0JewotCSAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYW5kIHdlIHdhbnQgdG8gYXBwbHkgdGhlIHJlbG9jYXRpb24KLQkgICAgIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuIE1vZGlmeSB0aGUgcmVsb2MKLQkgICAgIGlucGxhY2UgdG8gcmVmbGVjdCB3aGF0IHdlIG5vdyBrbm93LiAgKi8KLQkgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOwotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIHJldHVybiBmbGFnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBidXQgaW5wbGFjZSwgc28gbW9kaWZ5IHRoZQotCSAgICAgcmVsb2MgcmVjb3JkIGEgYml0LgotCi0JICAgICBJZiB3ZSd2ZSByZWxvY2F0ZWQgd2l0aCBhIHN5bWJvbCB3aXRoIGEgc2VjdGlvbiwgY2hhbmdlCi0JICAgICBpbnRvIGEgcmVmIHRvIHRoZSBzZWN0aW9uIGJlbG9uZ2luZyB0byB0aGUgc3ltYm9sLiAgKi8KLQotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotCSAgLyogV1RGPz8gKi8KLQkgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0JICAgICAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiYWl4Y29mZi1yczYwMDAiKSAhPSAwCi0JICAgICAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAieGNvZmYtcG93ZXJtYWMiKSAhPSAwCi0JICAgICAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiY29mZi1JbnRlbC1saXR0bGUiKSAhPSAwCi0JICAgICAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiY29mZi1JbnRlbC1iaWciKSAhPSAwKQotCSAgICB7Ci0jaWYgMQotCSAgICAgIC8qIEZvciBtNjhrLWNvZmYsIHRoZSBhZGRlbmQgd2FzIGJlaW5nIHN1YnRyYWN0ZWQgdHdpY2UgZHVyaW5nCi0JCSByZWxvY2F0aW9uIHdpdGggLXIuICBSZW1vdmluZyB0aGUgbGluZSBiZWxvdyB0aGlzIGNvbW1lbnQKLQkJIGZpeGVzIHRoYXQgcHJvYmxlbTsgc2VlIFBSIDI5NTMuCi0KLUhvd2V2ZXIsIElhbiB3cm90ZSB0aGUgZm9sbG93aW5nLCByZWdhcmRpbmcgcmVtb3ZpbmcgdGhlIGxpbmUgYmVsb3csCi13aGljaCBleHBsYWlucyB3aHkgaXQgaXMgc3RpbGwgZW5hYmxlZDogIC0tZGptCi0KLUlmIHlvdSBwdXQgYSBwYXRjaCBsaWtlIHRoYXQgaW50byBCRkQgeW91IG5lZWQgdG8gY2hlY2sgYWxsIHRoZSBDT0ZGCi1saW5rZXJzLiAgSSBhbSBmYWlybHkgY2VydGFpbiB0aGF0IHBhdGNoIHdpbGwgYnJlYWsgY29mZi1pMzg2IChlLmcuLAotU0NPKTsgc2VlIGNvZmZfaTM4Nl9yZWxvYyBpbiBjb2ZmLWkzODYuYyB3aGVyZSBJIHdvcmtlZCBhcm91bmQgdGhlCi1wcm9ibGVtIGluIGEgZGlmZmVyZW50IHdheS4gIFRoZXJlIG1heSB2ZXJ5IHdlbGwgYmUgYSByZWFzb24gdGhhdCB0aGUKLWNvZGUgd29ya3MgYXMgaXQgZG9lcy4KLQotSG1tbS4gIFRoZSBmaXJzdCBvYnZpb3VzIHBvaW50IGlzIHRoYXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBzaG91bGQKLW5vdCBoYXZlIGFueSB0ZXN0cyB0aGF0IGRlcGVuZCB1cG9uIHRoZSBmbGF2b3VyLiAgSXQncyBzZWVtIGxpa2UKLWVudGlyZWx5IHRoZSB3cm9uZyBwbGFjZSBmb3Igc3VjaCBhIHRoaW5nLiAgVGhlIHNlY29uZCBvYnZpb3VzIHBvaW50Ci1pcyB0aGF0IHRoZSBjdXJyZW50IGNvZGUgaWdub3JlcyB0aGUgcmVsb2MgYWRkZW5kIHdoZW4gcHJvZHVjaW5nCi1yZWxvY2F0ZWFibGUgb3V0cHV0IGZvciBDT0ZGLiAgVGhhdCdzIHBlY3VsaWFyLiAgSW4gZmFjdCwgSSByZWFsbHkKLWhhdmUgbm8gaWRlYSB3aGF0IHRoZSBwb2ludCBvZiB0aGUgbGluZSB5b3Ugd2FudCB0byByZW1vdmUgaXMuCi0KLUEgdHlwaWNhbCBDT0ZGIHJlbG9jIHN1YnRyYWN0cyB0aGUgb2xkIHZhbHVlIG9mIHRoZSBzeW1ib2wgYW5kIGFkZHMgaW4KLXRoZSBuZXcgdmFsdWUgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBvYmplY3QgZmlsZSAoaWYgaXQncyBhIHBjCi1yZWxhdGl2ZSByZWxvYyBpdCBhZGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN5bWJvbCB2YWx1ZSBhbmQgdGhlCi1sb2NhdGlvbikuICBXaGVuIHJlbG9jYXRpbmcgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGF0IHByb3BlcnR5LgotCi1CRkQgaGFuZGxlcyB0aGlzIGJ5IHNldHRpbmcgdGhlIGFkZGVuZCB0byB0aGUgbmVnYXRpdmUgb2YgdGhlIG9sZAotdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFVuZm9ydHVuYXRlbHkgaXQgaGFuZGxlcyBjb21tb24gc3ltYm9scyBpbiBhCi1ub24tc3RhbmRhcmQgd2F5IChpdCBkb2Vzbid0IHN1YnRyYWN0IHRoZSBvbGQgdmFsdWUpIGJ1dCB0aGF0J3MgYQotZGlmZmVyZW50IHN0b3J5ICh3ZSBjYW4ndCBjaGFuZ2UgaXQgd2l0aG91dCBsb3NpbmcgYmFja3dhcmQKLWNvbXBhdGliaWxpdHkgd2l0aCBvbGQgb2JqZWN0IGZpbGVzKSAoY29mZi1pMzg2IGRvZXMgc3VidHJhY3QgdGhlIG9sZAotdmFsdWUsIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBleGlzdGluZyBjb2ZmLWkzODYgdGFyZ2V0cywgbGlrZSBTQ08pLgotCi1TbyBldmVyeXRoaW5nIHdvcmtzIGZpbmUgd2hlbiBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBXaGVuCi13ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGxvZ2ljYWxseSB3ZSBzaG91bGQgZG8gZXhhY3RseQotd2hhdCB3ZSBkbyB3aGVuIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFRoZXJlZm9yZSwgeW91cgotcGF0Y2ggaXMgY29ycmVjdC4gIEluIGZhY3QsIGl0IHNob3VsZCBwcm9iYWJseSBhbHdheXMganVzdCBzZXQKLXJlbG9jX2VudHJ5LT5hZGRlbmQgdG8gMCBmb3IgYWxsIGNhc2VzLCBzaW5jZSBpdCBpcywgaW4gZmFjdCwgZ29pbmcgdG8KLWFkZCB0aGUgdmFsdWUgaW50byB0aGUgb2JqZWN0IGZpbGUuICBUaGlzIHdvbid0IGh1cnQgdGhlIENPRkYgY29kZSwKLXdoaWNoIGRvZXNuJ3QgdXNlIHRoZSBhZGRlbmQ7IEknbSBub3Qgc3VyZSB3aGF0IGl0IHdpbGwgZG8gdG8gb3RoZXIKLWZvcm1hdHMgKHRoZSB0aGluZyB0byBjaGVjayBmb3Igd291bGQgYmUgd2hldGhlciBhbnkgZm9ybWF0cyBib3RoIHVzZQotdGhlIGFkZGVuZCBhbmQgc2V0IHBhcnRpYWxfaW5wbGFjZSkuCi0KLVdoZW4gSSB3YW50ZWQgdG8gbWFrZSBjb2ZmLWkzODYgcHJvZHVjZSByZWxvY2F0ZWFibGUgb3V0cHV0LCBJIHJhbgotaW50byB0aGUgcHJvYmxlbSB0aGF0IHlvdSBhcmUgcnVubmluZyBpbnRvOiBJIHdhbnRlZCB0byByZW1vdmUgdGhhdAotbGluZS4gIFJhdGhlciB0aGFuIHJpc2sgaXQsIEkgbWFkZSB0aGUgY29mZi1pMzg2IHJlbG9jcyB1c2UgYSBzcGVjaWFsCi1mdW5jdGlvbjsgaXQncyBjb2ZmX2kzODZfcmVsb2MgaW4gY29mZi1pMzg2LmMuICBUaGUgZnVuY3Rpb24KLXNwZWNpZmljYWxseSBhZGRzIHRoZSBhZGRlbmQgZmllbGQgaW50byB0aGUgb2JqZWN0IGZpbGUsIGtub3dpbmcgdGhhdAotYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBpcyBub3QgZ29pbmcgdG8uICBJZiB5b3UgcmVtb3ZlIHRoYXQgbGluZSwgdGhlbgotY29mZi1pMzg2LmMgd2lsbCB3aW5kIHVwIGFkZGluZyB0aGUgYWRkZW5kIGZpZWxkIGluIHR3aWNlLiAgSXQncwotdHJpdmlhbCB0byBmaXg7IGl0IGp1c3QgbmVlZHMgdG8gYmUgZG9uZS4KLQotVGhlIHByb2JsZW0gd2l0aCByZW1vdmluZyB0aGUgbGluZSBpcyBqdXN0IHRoYXQgaXQgbWF5IGJyZWFrIHNvbWUKLXdvcmtpbmcgY29kZS4gIFdpdGggQkZEIGl0J3MgaGFyZCB0byBiZSBzdXJlIG9mIGFueXRoaW5nLiAgVGhlIHJpZ2h0Ci13YXkgdG8gZGVhbCB3aXRoIHRoaXMgaXMgc2ltcGx5IHRvIGJ1aWxkIGFuZCB0ZXN0IGF0IGxlYXN0IGFsbCB0aGUKLXN1cHBvcnRlZCBDT0ZGIHRhcmdldHMuICBJdCBzaG91bGQgYmUgc3RyYWlnaHRmb3J3YXJkIGlmIHRpbWUgYW5kIGRpc2sKLXNwYWNlIGNvbnN1bWluZy4gIEZvciBlYWNoIHRhcmdldDoKLSAgICAxKSBidWlsZCB0aGUgbGlua2VyCi0gICAgMikgZ2VuZXJhdGUgc29tZSBleGVjdXRhYmxlLCBhbmQgbGluayBpdCB1c2luZyAtciAoSSB3b3VsZAotICAgICAgIHByb2JhYmx5IHVzZSBwYXJhbm9pYS5vIGFuZCBsaW5rIGFnYWluc3QgbmV3bGliL2xpYmMuYSwgd2hpY2gKLSAgICAgICBmb3IgYWxsIHRoZSBzdXBwb3J0ZWQgdGFyZ2V0cyB3b3VsZCBiZSBhdmFpbGFibGUgaW4KLSAgICAgICAvdXNyL2N5Z251cy9wcm9ncmVzc2l2ZS9ILWhvc3QvdGFyZ2V0L2xpYi9saWJjLmEpLgotICAgIDMpIG1ha2UgdGhlIGNoYW5nZSB0byByZWxvYy5jCi0gICAgNCkgcmVidWlsZCB0aGUgbGlua2VyCi0gICAgNSkgcmVwZWF0IHN0ZXAgMgotICAgIDYpIGlmIHRoZSByZXN1bHRpbmcgb2JqZWN0IGZpbGVzIGFyZSB0aGUgc2FtZSwgeW91IGhhdmUgYXQgbGVhc3QKLSAgICAgICBtYWRlIGl0IG5vIHdvcnNlCi0gICAgNykgaWYgdGhleSBhcmUgZGlmZmVyZW50IHlvdSBoYXZlIHRvIGZpZ3VyZSBvdXQgd2hpY2ggdmVyc2lvbiBpcwotICAgICAgIHJpZ2h0Ci0qLwotCSAgICAgIHJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSNlbmRpZgotCSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gMDsKLSAgICB9Ci0KLSAgLyogRklYTUU6IFRoaXMgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgaW5jb21wbGV0ZSwgYmVjYXVzZSB0aGUgdmFsdWUKLSAgICAgbWlnaHQgaGF2ZSBvdmVyZmxvd2VkIGJlZm9yZSB3ZSBnZXQgaGVyZS4gIEZvciBhIGNvcnJlY3QgY2hlY2sgd2UKLSAgICAgbmVlZCB0byBjb21wdXRlIHRoZSB2YWx1ZSBpbiBhIHNpemUgbGFyZ2VyIHRoYW4gYml0c2l6ZSwgYnV0IHdlCi0gICAgIGNhbid0IHJlYXNvbmFibHkgZG8gdGhhdCBmb3IgYSByZWxvYyB0aGUgc2FtZSBzaXplIGFzIGEgaG9zdAotICAgICBtYWNoaW5lIHdvcmQuCi0gICAgIEZJWE1FOiBXZSBzaG91bGQgYWxzbyBkbyBvdmVyZmxvdyBjaGVja2luZyBvbiB0aGUgcmVzdWx0IGFmdGVyCi0gICAgIGFkZGluZyBpbiB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfZG9udAotICAgICAgJiYgZmxhZyA9PSBiZmRfcmVsb2Nfb2spCi0gICAgZmxhZyA9IGJmZF9jaGVja19vdmVyZmxvdyAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93LAotCQkJICAgICAgIGhvd3RvLT5iaXRzaXplLAotCQkJICAgICAgIGhvd3RvLT5yaWdodHNoaWZ0LAotCQkJICAgICAgIGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGFiZmQpLAotCQkJICAgICAgIHJlbG9jYXRpb24pOwotCi0gIC8qCi0gICAgRWl0aGVyIHdlIGFyZSByZWxvY2F0aW5nIGFsbCB0aGUgd2F5LCBvciB3ZSBkb24ndCB3YW50IHRvIGFwcGx5Ci0gICAgdGhlIHJlbG9jYXRpb24gdG8gdGhlIHJlbG9jIGVudHJ5IChwcm9iYWJseSBiZWNhdXNlIHRoZXJlIGlzbid0Ci0gICAgYW55IHJvb20gaW4gdGhlIG91dHB1dCBmb3JtYXQgdG8gZGVzY3JpYmUgYWRkZW5kcyB0byByZWxvY3MpCi0gICAgKi8KLQotICAvKiBUaGUgY2FzdCB0byBiZmRfdm1hIGF2b2lkcyBhIGJ1ZyBpbiB0aGUgQWxwaGEgT1NGLzEgQyBjb21waWxlcgotICAgICAoT1NGIHZlcnNpb24gMS4zLCBjb21waWxlciB2ZXJzaW9uIDMuMTEpLiAgSXQgbWlzY29tcGlsZXMgdGhlCi0gICAgIGZvbGxvd2luZyBwcm9ncmFtOgotCi0gICAgIHN0cnVjdCBzdHIKLSAgICAgewotICAgICAgIHVuc2lnbmVkIGludCBpMDsKLSAgICAgfSBzID0geyAwIH07Ci0KLSAgICAgaW50Ci0gICAgIG1haW4gKCkKLSAgICAgewotICAgICAgIHVuc2lnbmVkIGxvbmcgeDsKLQotICAgICAgIHggPSAweDEwMDAwMDAwMDsKLSAgICAgICB4IDw8PSAodW5zaWduZWQgbG9uZykgcy5pMDsKLSAgICAgICBpZiAoeCA9PSAwKQotCSBwcmludGYgKCJmYWlsZWRcbiIpOwotICAgICAgIGVsc2UKLQkgcHJpbnRmICgic3VjY2VlZGVkICglbHgpXG4iLCB4KTsKLSAgICAgfQotICAgICAqLwotCi0gIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKLQotICAvKiBTaGlmdCBldmVyeXRoaW5nIHVwIHRvIHdoZXJlIGl0J3MgZ29pbmcgdG8gYmUgdXNlZCAqLwotCi0gIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBob3d0by0+Yml0cG9zOwotCi0gIC8qIFdhaXQgZm9yIHRoZSBkYXkgd2hlbiBhbGwgaGF2ZSB0aGUgbWFzayBpbiB0aGVtICovCi0KLSAgLyogV2hhdCB3ZSBkbzoKLSAgICAgaSBpbnN0cnVjdGlvbiB0byBiZSBsZWZ0IGFsb25lCi0gICAgIG8gb2Zmc2V0IHdpdGhpbiBpbnN0cnVjdGlvbgotICAgICByIHJlbG9jYXRpb24gb2Zmc2V0IHRvIGFwcGx5Ci0gICAgIFMgc3JjIG1hc2sKLSAgICAgRCBkc3QgbWFzawotICAgICBOIH5kc3QgbWFzawotICAgICBBIHBhcnQgMQotICAgICBCIHBhcnQgMgotICAgICBSIHJlc3VsdAotCi0gICAgIERvIHRoaXM6Ci0gICAgIGkgaSBpIGkgaSBvIG8gbyBvIG8gICAgICAgIGZyb20gYmZkX2dldDxzaXplPgotICAgICBhbmQgICAgICAgICAgIFMgUyBTIFMgUyAgICB0byBnZXQgdGhlIHNpemUgb2Zmc2V0IHdlIHdhbnQKLSAgICAgKyAgIHIgciByIHIgciByIHIgciByIHIgIHRvIGdldCB0aGUgZmluYWwgdmFsdWUgdG8gcGxhY2UKLSAgICAgYW5kICAgICAgICAgICBEIEQgRCBEIEQgIHRvIGNob3AgdG8gcmlnaHQgc2l6ZQotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBBIEEgQSBBIEEKLSAgICAgQW5kIHRoaXM6Ci0gICAgIC4uLiAgIGkgaSBpIGkgaSBvIG8gbyBvIG8gIGZyb20gYmZkX2dldDxzaXplPgotICAgICBhbmQgICBOIE4gTiBOIE4gICAgICAgICAgICBnZXQgaW5zdHJ1Y3Rpb24KLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgLi4uICAgQiBCIEIgQiBCCi0KLSAgICAgQW5kIHRoZW46Ci0gICAgIEIgQiBCIEIgQgotICAgICBvciAgICAgICAgICAgICAgQSBBIEEgQSBBCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIFIgUiBSIFIgUiBSIFIgUiBSIFIgICAgICAgIHB1dCBpbnRvIGJmZF9wdXQ8c2l6ZT4KLSAgICAgKi8KLQotI2RlZmluZSBET0lUKHgpIFwKLSAgeCA9ICggKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgIHJlbG9jYXRpb24pICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICBzd2l0Y2ggKGhvd3RvLT5zaXplKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICB7Ci0JY2hhciB4ID0gYmZkX2dldF84IChhYmZkLCAoY2hhciAqKSBkYXRhICsgYWRkcik7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF84IChhYmZkLCB4LCAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgYWRkcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIHsKLQlzaG9ydCB4ID0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQlET0lUICh4KTsKLQliZmRfcHV0XzE2IChhYmZkLCB4LCAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgYWRkcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICB7Ci0JbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQlET0lUICh4KTsKLQliZmRfcHV0XzMyIChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAtMjoKLSAgICAgIHsKLQlsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCXJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQlET0lUICh4KTsKLQliZmRfcHV0XzMyIChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIC0xOgotICAgICAgewotCWxvbmcgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0JcmVsb2NhdGlvbiA9IC1yZWxvY2F0aW9uOwotCURPSVQgKHgpOwotCWJmZF9wdXRfMTYgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICAgIC8qIERvIG5vdGhpbmcgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotI2lmZGVmIEJGRDY0Ci0gICAgICB7Ci0JYmZkX3ZtYSB4ID0gYmZkX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQlET0lUICh4KTsKLQliZmRfcHV0XzY0IChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICAgICAgfQotI2Vsc2UKLSAgICAgIGFib3J0ICgpOwotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdGhlcjsKLSAgICB9Ci0KLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9pbnN0YWxsX3JlbG9jYXRpb24KLQotU1lOT1BTSVMKLQliZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLSAgICAgICAgICAgICAgICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAoYmZkICphYmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIFBUUiBkYXRhLCBiZmRfdm1hIGRhdGFfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0JCQkgY2hhciAqKmVycm9yX21lc3NhZ2UpOwotCi1ERVNDUklQVElPTgotCVRoaXMgbG9va3MgcmVtYXJrYWJseSBsaWtlIDw8YmZkX3BlcmZvcm1fcmVsb2NhdGlvbj4+LCBleGNlcHQgaXQKLQlkb2VzIG5vdCBleHBlY3QgdGhhdCB0aGUgc2VjdGlvbiBjb250ZW50cyBoYXZlIGJlZW4gZmlsbGVkIGluLgotCUkuZS4sIGl0J3Mgc3VpdGFibGUgZm9yIHVzZSB3aGVuIGNyZWF0aW5nLCByYXRoZXIgdGhhbiBhcHBseWluZwotCWEgcmVsb2NhdGlvbi4KLQotCUZvciBub3csIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgcmVzZXJ2ZWQgZm9yIHRoZQotCWFzc2VtYmxlci4KLQotKi8KLQotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWJmZF9pbnN0YWxsX3JlbG9jYXRpb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBkYXRhX3N0YXJ0LCBkYXRhX3N0YXJ0X29mZnNldCwKLQkJCWlucHV0X3NlY3Rpb24sIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIFBUUiBkYXRhX3N0YXJ0OwotICAgICBiZmRfdm1hIGRhdGFfc3RhcnRfb2Zmc2V0OwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBiZmRfdm1hIG91dHB1dF9iYXNlID0gMDsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0gIGFzZWN0aW9uICpyZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb247Ci0gIGFzeW1ib2wgKnN5bWJvbDsKLSAgYmZkX2J5dGUgKmRhdGE7Ci0KLSAgc3ltYm9sID0gKihyZWxvY19lbnRyeS0+c3ltX3B0cl9wdHIpOwotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBJZiB0aGVyZSBpcyBhIGZ1bmN0aW9uIHN1cHBsaWVkIHRvIGhhbmRsZSB0aGlzIHJlbG9jYXRpb24gdHlwZSwKLSAgICAgY2FsbCBpdC4gIEl0J2xsIHJldHVybiBgYmZkX3JlbG9jX2NvbnRpbnVlJyBpZiBmdXJ0aGVyIHByb2Nlc3NpbmcKLSAgICAgY2FuIGJlIGRvbmUuICAqLwotICBpZiAoaG93dG8tPnNwZWNpYWxfZnVuY3Rpb24pCi0gICAgewotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvbnQ7Ci0gIAotICAgICAgLyogWFhYIC0gVGhlIHNwZWNpYWxfZnVuY3Rpb24gY2FsbHMgaGF2ZW4ndCBiZWVuIGZpeGVkIHVwIHRvIGRlYWwKLQkgd2l0aCBjcmVhdGluZyBuZXcgcmVsb2NhdGlvbnMgYW5kIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgY29udCA9IGhvd3RvLT5zcGVjaWFsX2Z1bmN0aW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLAotCQkJCSAgICAgIC8qIFhYWCAtIE5vbi1wb3J0YWJsZSEgKi8KLQkJCQkgICAgICAoKGJmZF9ieXRlICopIGRhdGFfc3RhcnQKLQkJCQkgICAgICAgLSBkYXRhX3N0YXJ0X29mZnNldCksCi0JCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgYWJmZCwgZXJyb3JfbWVzc2FnZSk7Ci0gICAgICBpZiAoY29udCAhPSBiZmRfcmVsb2NfY29udGludWUpCi0JcmV0dXJuIGNvbnQ7Ci0gICAgfQotCi0gIC8qIElzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uIHJlYWxseSB3aXRoaW4gdGhlIHNlY3Rpb24/ICAqLwotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotCi0gIC8qIEdldCBzeW1ib2wgdmFsdWUuICAoQ29tbW9uIHN5bWJvbHMgYXJlIHNwZWNpYWwuKSAgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbiA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgLyogQ29udmVydCBpbnB1dC1zZWN0aW9uLXJlbGF0aXZlIHN5bWJvbCB2YWx1ZSB0byBhYnNvbHV0ZS4gICovCi0gIGlmIChob3d0by0+cGFydGlhbF9pbnBsYWNlID09IGZhbHNlKQotICAgIG91dHB1dF9iYXNlID0gMDsKLSAgZWxzZQotICAgIG91dHB1dF9iYXNlID0gcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgcmVsb2NhdGlvbiArPSBvdXRwdXRfYmFzZSArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAvKiBBZGQgaW4gc3VwcGxpZWQgYWRkZW5kLiAgKi8KLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIC8qIEhlcmUgdGhlIHZhcmlhYmxlIHJlbG9jYXRpb24gaG9sZHMgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlCi0gICAgIHN5bWJvbCB3ZSBhcmUgcmVsb2NhdGluZyBhZ2FpbnN0LCBwbHVzIGFueSBhZGRlbmQuICAqLwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFdlIHdhbnQgdG8gc2V0IFJFTE9DQVRJT04KLQkgdG8gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCBhbmQgdGhlCi0JIGxvY2F0aW9uLiAgUkVMT0NBVElPTiBpcyBhbHJlYWR5IHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wuCi0KLQkgV2Ugc3RhcnQgYnkgc3VidHJhY3RpbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gY29udGFpbmluZwotCSB0aGUgbG9jYXRpb24uCi0KLQkgSWYgcGNyZWxfb2Zmc2V0IGlzIHNldCwgd2UgbXVzdCBmdXJ0aGVyIHN1YnRyYWN0IHRoZSBwb3NpdGlvbgotCSBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLiAgU29tZSB0YXJnZXRzIGFycmFuZ2UgZm9yCi0JIHRoZSBhZGRlbmQgdG8gYmUgdGhlIG5lZ2F0aXZlIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgbG9jYXRpb24KLQkgd2l0aGluIHRoZSBzZWN0aW9uOyBmb3IgZXhhbXBsZSwgaTM4Ni1hb3V0IGRvZXMgdGhpcy4gIEZvcgotCSBpMzg2LWFvdXQsIHBjcmVsX29mZnNldCBpcyBmYWxzZS4gIFNvbWUgb3RoZXIgdGFyZ2V0cyBkbyBub3QKLQkgaW5jbHVkZSB0aGUgcG9zaXRpb24gb2YgdGhlIGxvY2F0aW9uOyBmb3IgZXhhbXBsZSwgbTg4a2JjcywKLQkgb3IgRUxGLiAgRm9yIHRob3NlIHRhcmdldHMsIHBjcmVsX29mZnNldCBpcyB0cnVlLgotCi0JIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlbiB3ZSBtdXN0IGVuc3VyZQotCSB0aGF0IHRoaXMgcmVsb2Mgd2lsbCBiZSBjb3JyZWN0bHkgY29tcHV0ZWQgd2hlbiB0aGUgZmluYWwKLQkgcmVsb2NhdGlvbiBpcyBkb25lLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlIHdlIHdhbnQgdG8gd2luZAotCSB1cCB3aXRoIHRoZSBuZWdhdGl2ZSBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLAotCSB3aGljaCBtZWFucyB3ZSBtdXN0IGFkanVzdCB0aGUgZXhpc3RpbmcgYWRkZW5kIGJ5IHRoZSBjaGFuZ2UKLQkgaW4gdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbi4gIElmIHBjcmVsX29mZnNldCBpcyB0cnVlCi0JIHdlIGRvIG5vdCB3YW50IHRvIGFkanVzdCB0aGUgZXhpc3RpbmcgYWRkZW5kIGF0IGFsbC4KLQotCSBGSVhNRTogVGhpcyBzZWVtcyBsb2dpY2FsIHRvIG1lLCBidXQgZm9yIHRoZSBjYXNlIG9mCi0JIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0IGl0IGlzIG5vdCB3aGF0IHRoZSBjb2RlCi0JIGFjdHVhbGx5IGRvZXMuICBJIGRvbid0IHdhbnQgdG8gY2hhbmdlIGl0LCBiZWNhdXNlIGl0IHNlZW1zCi0JIGZhciB0b28gbGlrZWx5IHRoYXQgc29tZXRoaW5nIHdpbGwgYnJlYWsuICAqLwotCi0gICAgICByZWxvY2F0aW9uIC09Ci0JaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0ID09IHRydWUgJiYgaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSB0cnVlKQotCXJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgfQotCi0gIGlmIChob3d0by0+cGFydGlhbF9pbnBsYWNlID09IGZhbHNlKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZSByZWxvY2F0aW9uCi0JIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuIE1vZGlmeSB0aGUgcmVsb2MKLQkgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGZsYWc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYnV0IGlucGxhY2UsIHNvIG1vZGlmeSB0aGUKLQkgcmVsb2MgcmVjb3JkIGEgYml0LgotCi0JIElmIHdlJ3ZlIHJlbG9jYXRlZCB3aXRoIGEgc3ltYm9sIHdpdGggYSBzZWN0aW9uLCBjaGFuZ2UKLQkgaW50byBhIHJlZiB0byB0aGUgc2VjdGlvbiBiZWxvbmdpbmcgdG8gdGhlIHN5bWJvbC4gICovCi0KLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgICAgIC8qIFdURj8/ICovCi0gICAgICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotCSAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiYWl4Y29mZi1yczYwMDAiKSAhPSAwCi0JICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJ4Y29mZi1wb3dlcm1hYyIpICE9IDAKLQkgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImNvZmYtSW50ZWwtbGl0dGxlIikgIT0gMAotCSAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiY29mZi1JbnRlbC1iaWciKSAhPSAwKQotCXsKLSNpZiAxCi0vKiBGb3IgbTY4ay1jb2ZmLCB0aGUgYWRkZW5kIHdhcyBiZWluZyBzdWJ0cmFjdGVkIHR3aWNlIGR1cmluZwotICAgcmVsb2NhdGlvbiB3aXRoIC1yLiAgUmVtb3ZpbmcgdGhlIGxpbmUgYmVsb3cgdGhpcyBjb21tZW50Ci0gICBmaXhlcyB0aGF0IHByb2JsZW07IHNlZSBQUiAyOTUzLgotCi1Ib3dldmVyLCBJYW4gd3JvdGUgdGhlIGZvbGxvd2luZywgcmVnYXJkaW5nIHJlbW92aW5nIHRoZSBsaW5lIGJlbG93LAotd2hpY2ggZXhwbGFpbnMgd2h5IGl0IGlzIHN0aWxsIGVuYWJsZWQ6ICAtLWRqbQotCi1JZiB5b3UgcHV0IGEgcGF0Y2ggbGlrZSB0aGF0IGludG8gQkZEIHlvdSBuZWVkIHRvIGNoZWNrIGFsbCB0aGUgQ09GRgotbGlua2Vycy4gIEkgYW0gZmFpcmx5IGNlcnRhaW4gdGhhdCBwYXRjaCB3aWxsIGJyZWFrIGNvZmYtaTM4NiAoZS5nLiwKLVNDTyk7IHNlZSBjb2ZmX2kzODZfcmVsb2MgaW4gY29mZi1pMzg2LmMgd2hlcmUgSSB3b3JrZWQgYXJvdW5kIHRoZQotcHJvYmxlbSBpbiBhIGRpZmZlcmVudCB3YXkuICBUaGVyZSBtYXkgdmVyeSB3ZWxsIGJlIGEgcmVhc29uIHRoYXQgdGhlCi1jb2RlIHdvcmtzIGFzIGl0IGRvZXMuCi0KLUhtbW0uICBUaGUgZmlyc3Qgb2J2aW91cyBwb2ludCBpcyB0aGF0IGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gc2hvdWxkCi1ub3QgaGF2ZSBhbnkgdGVzdHMgdGhhdCBkZXBlbmQgdXBvbiB0aGUgZmxhdm91ci4gIEl0J3Mgc2VlbSBsaWtlCi1lbnRpcmVseSB0aGUgd3JvbmcgcGxhY2UgZm9yIHN1Y2ggYSB0aGluZy4gIFRoZSBzZWNvbmQgb2J2aW91cyBwb2ludAotaXMgdGhhdCB0aGUgY3VycmVudCBjb2RlIGlnbm9yZXMgdGhlIHJlbG9jIGFkZGVuZCB3aGVuIHByb2R1Y2luZwotcmVsb2NhdGVhYmxlIG91dHB1dCBmb3IgQ09GRi4gIFRoYXQncyBwZWN1bGlhci4gIEluIGZhY3QsIEkgcmVhbGx5Ci1oYXZlIG5vIGlkZWEgd2hhdCB0aGUgcG9pbnQgb2YgdGhlIGxpbmUgeW91IHdhbnQgdG8gcmVtb3ZlIGlzLgotCi1BIHR5cGljYWwgQ09GRiByZWxvYyBzdWJ0cmFjdHMgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFuZCBhZGRzIGluCi10aGUgbmV3IHZhbHVlIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgb2JqZWN0IGZpbGUgKGlmIGl0J3MgYSBwYwotcmVsYXRpdmUgcmVsb2MgaXQgYWRkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2wgdmFsdWUgYW5kIHRoZQotbG9jYXRpb24pLiAgV2hlbiByZWxvY2F0aW5nIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhhdCBwcm9wZXJ0eS4KLQotQkZEIGhhbmRsZXMgdGhpcyBieSBzZXR0aW5nIHRoZSBhZGRlbmQgdG8gdGhlIG5lZ2F0aXZlIG9mIHRoZSBvbGQKLXZhbHVlIG9mIHRoZSBzeW1ib2wuICBVbmZvcnR1bmF0ZWx5IGl0IGhhbmRsZXMgY29tbW9uIHN5bWJvbHMgaW4gYQotbm9uLXN0YW5kYXJkIHdheSAoaXQgZG9lc24ndCBzdWJ0cmFjdCB0aGUgb2xkIHZhbHVlKSBidXQgdGhhdCdzIGEKLWRpZmZlcmVudCBzdG9yeSAod2UgY2FuJ3QgY2hhbmdlIGl0IHdpdGhvdXQgbG9zaW5nIGJhY2t3YXJkCi1jb21wYXRpYmlsaXR5IHdpdGggb2xkIG9iamVjdCBmaWxlcykgKGNvZmYtaTM4NiBkb2VzIHN1YnRyYWN0IHRoZSBvbGQKLXZhbHVlLCB0byBiZSBjb21wYXRpYmxlIHdpdGggZXhpc3RpbmcgY29mZi1pMzg2IHRhcmdldHMsIGxpa2UgU0NPKS4KLQotU28gZXZlcnl0aGluZyB3b3JrcyBmaW5lIHdoZW4gbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgV2hlbgotd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBsb2dpY2FsbHkgd2Ugc2hvdWxkIGRvIGV4YWN0bHkKLXdoYXQgd2UgZG8gd2hlbiBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGVyZWZvcmUsIHlvdXIKLXBhdGNoIGlzIGNvcnJlY3QuICBJbiBmYWN0LCBpdCBzaG91bGQgcHJvYmFibHkgYWx3YXlzIGp1c3Qgc2V0Ci1yZWxvY19lbnRyeS0+YWRkZW5kIHRvIDAgZm9yIGFsbCBjYXNlcywgc2luY2UgaXQgaXMsIGluIGZhY3QsIGdvaW5nIHRvCi1hZGQgdGhlIHZhbHVlIGludG8gdGhlIG9iamVjdCBmaWxlLiAgVGhpcyB3b24ndCBodXJ0IHRoZSBDT0ZGIGNvZGUsCi13aGljaCBkb2Vzbid0IHVzZSB0aGUgYWRkZW5kOyBJJ20gbm90IHN1cmUgd2hhdCBpdCB3aWxsIGRvIHRvIG90aGVyCi1mb3JtYXRzICh0aGUgdGhpbmcgdG8gY2hlY2sgZm9yIHdvdWxkIGJlIHdoZXRoZXIgYW55IGZvcm1hdHMgYm90aCB1c2UKLXRoZSBhZGRlbmQgYW5kIHNldCBwYXJ0aWFsX2lucGxhY2UpLgotCi1XaGVuIEkgd2FudGVkIHRvIG1ha2UgY29mZi1pMzg2IHByb2R1Y2UgcmVsb2NhdGVhYmxlIG91dHB1dCwgSSByYW4KLWludG8gdGhlIHByb2JsZW0gdGhhdCB5b3UgYXJlIHJ1bm5pbmcgaW50bzogSSB3YW50ZWQgdG8gcmVtb3ZlIHRoYXQKLWxpbmUuICBSYXRoZXIgdGhhbiByaXNrIGl0LCBJIG1hZGUgdGhlIGNvZmYtaTM4NiByZWxvY3MgdXNlIGEgc3BlY2lhbAotZnVuY3Rpb247IGl0J3MgY29mZl9pMzg2X3JlbG9jIGluIGNvZmYtaTM4Ni5jLiAgVGhlIGZ1bmN0aW9uCi1zcGVjaWZpY2FsbHkgYWRkcyB0aGUgYWRkZW5kIGZpZWxkIGludG8gdGhlIG9iamVjdCBmaWxlLCBrbm93aW5nIHRoYXQKLWJmZF9pbnN0YWxsX3JlbG9jYXRpb24gaXMgbm90IGdvaW5nIHRvLiAgSWYgeW91IHJlbW92ZSB0aGF0IGxpbmUsIHRoZW4KLWNvZmYtaTM4Ni5jIHdpbGwgd2luZCB1cCBhZGRpbmcgdGhlIGFkZGVuZCBmaWVsZCBpbiB0d2ljZS4gIEl0J3MKLXRyaXZpYWwgdG8gZml4OyBpdCBqdXN0IG5lZWRzIHRvIGJlIGRvbmUuCi0KLVRoZSBwcm9ibGVtIHdpdGggcmVtb3ZpbmcgdGhlIGxpbmUgaXMganVzdCB0aGF0IGl0IG1heSBicmVhayBzb21lCi13b3JraW5nIGNvZGUuICBXaXRoIEJGRCBpdCdzIGhhcmQgdG8gYmUgc3VyZSBvZiBhbnl0aGluZy4gIFRoZSByaWdodAotd2F5IHRvIGRlYWwgd2l0aCB0aGlzIGlzIHNpbXBseSB0byBidWlsZCBhbmQgdGVzdCBhdCBsZWFzdCBhbGwgdGhlCi1zdXBwb3J0ZWQgQ09GRiB0YXJnZXRzLiAgSXQgc2hvdWxkIGJlIHN0cmFpZ2h0Zm9yd2FyZCBpZiB0aW1lIGFuZCBkaXNrCi1zcGFjZSBjb25zdW1pbmcuICBGb3IgZWFjaCB0YXJnZXQ6Ci0gICAgMSkgYnVpbGQgdGhlIGxpbmtlcgotICAgIDIpIGdlbmVyYXRlIHNvbWUgZXhlY3V0YWJsZSwgYW5kIGxpbmsgaXQgdXNpbmcgLXIgKEkgd291bGQKLSAgICAgICBwcm9iYWJseSB1c2UgcGFyYW5vaWEubyBhbmQgbGluayBhZ2FpbnN0IG5ld2xpYi9saWJjLmEsIHdoaWNoCi0gICAgICAgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIHRhcmdldHMgd291bGQgYmUgYXZhaWxhYmxlIGluCi0gICAgICAgL3Vzci9jeWdudXMvcHJvZ3Jlc3NpdmUvSC1ob3N0L3RhcmdldC9saWIvbGliYy5hKS4KLSAgICAzKSBtYWtlIHRoZSBjaGFuZ2UgdG8gcmVsb2MuYwotICAgIDQpIHJlYnVpbGQgdGhlIGxpbmtlcgotICAgIDUpIHJlcGVhdCBzdGVwIDIKLSAgICA2KSBpZiB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlcyBhcmUgdGhlIHNhbWUsIHlvdSBoYXZlIGF0IGxlYXN0Ci0gICAgICAgbWFkZSBpdCBubyB3b3JzZQotICAgIDcpIGlmIHRoZXkgYXJlIGRpZmZlcmVudCB5b3UgaGF2ZSB0byBmaWd1cmUgb3V0IHdoaWNoIHZlcnNpb24gaXMKLSAgICAgICByaWdodAotKi8KLQkgIHJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSNlbmRpZgotCSAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOwotCX0KLSAgICB9Ci0KLSAgLyogRklYTUU6IFRoaXMgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgaW5jb21wbGV0ZSwgYmVjYXVzZSB0aGUgdmFsdWUKLSAgICAgbWlnaHQgaGF2ZSBvdmVyZmxvd2VkIGJlZm9yZSB3ZSBnZXQgaGVyZS4gIEZvciBhIGNvcnJlY3QgY2hlY2sgd2UKLSAgICAgbmVlZCB0byBjb21wdXRlIHRoZSB2YWx1ZSBpbiBhIHNpemUgbGFyZ2VyIHRoYW4gYml0c2l6ZSwgYnV0IHdlCi0gICAgIGNhbid0IHJlYXNvbmFibHkgZG8gdGhhdCBmb3IgYSByZWxvYyB0aGUgc2FtZSBzaXplIGFzIGEgaG9zdAotICAgICBtYWNoaW5lIHdvcmQuCi0gICAgIEZJWE1FOiBXZSBzaG91bGQgYWxzbyBkbyBvdmVyZmxvdyBjaGVja2luZyBvbiB0aGUgcmVzdWx0IGFmdGVyCi0gICAgIGFkZGluZyBpbiB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfZG9udCkKLSAgICBmbGFnID0gYmZkX2NoZWNrX292ZXJmbG93IChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3csCi0JCQkgICAgICAgaG93dG8tPmJpdHNpemUsCi0JCQkgICAgICAgaG93dG8tPnJpZ2h0c2hpZnQsCi0JCQkgICAgICAgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCksCi0JCQkgICAgICAgcmVsb2NhdGlvbik7Ci0KLSAgLyoKLSAgICBFaXRoZXIgd2UgYXJlIHJlbG9jYXRpbmcgYWxsIHRoZSB3YXksIG9yIHdlIGRvbid0IHdhbnQgdG8gYXBwbHkKLSAgICB0aGUgcmVsb2NhdGlvbiB0byB0aGUgcmVsb2MgZW50cnkgKHByb2JhYmx5IGJlY2F1c2UgdGhlcmUgaXNuJ3QKLSAgICBhbnkgcm9vbSBpbiB0aGUgb3V0cHV0IGZvcm1hdCB0byBkZXNjcmliZSBhZGRlbmRzIHRvIHJlbG9jcykKLSAgICAqLwotCi0gIC8qIFRoZSBjYXN0IHRvIGJmZF92bWEgYXZvaWRzIGEgYnVnIGluIHRoZSBBbHBoYSBPU0YvMSBDIGNvbXBpbGVyCi0gICAgIChPU0YgdmVyc2lvbiAxLjMsIGNvbXBpbGVyIHZlcnNpb24gMy4xMSkuICBJdCBtaXNjb21waWxlcyB0aGUKLSAgICAgZm9sbG93aW5nIHByb2dyYW06Ci0KLSAgICAgc3RydWN0IHN0cgotICAgICB7Ci0gICAgICAgdW5zaWduZWQgaW50IGkwOwotICAgICB9IHMgPSB7IDAgfTsKLQotICAgICBpbnQKLSAgICAgbWFpbiAoKQotICAgICB7Ci0gICAgICAgdW5zaWduZWQgbG9uZyB4OwotCi0gICAgICAgeCA9IDB4MTAwMDAwMDAwOwotICAgICAgIHggPDw9ICh1bnNpZ25lZCBsb25nKSBzLmkwOwotICAgICAgIGlmICh4ID09IDApCi0JIHByaW50ZiAoImZhaWxlZFxuIik7Ci0gICAgICAgZWxzZQotCSBwcmludGYgKCJzdWNjZWVkZWQgKCVseClcbiIsIHgpOwotICAgICB9Ci0gICAgICovCi0KLSAgcmVsb2NhdGlvbiA+Pj0gKGJmZF92bWEpIGhvd3RvLT5yaWdodHNoaWZ0OwotCi0gIC8qIFNoaWZ0IGV2ZXJ5dGhpbmcgdXAgdG8gd2hlcmUgaXQncyBnb2luZyB0byBiZSB1c2VkICovCi0KLSAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7Ci0KLSAgLyogV2FpdCBmb3IgdGhlIGRheSB3aGVuIGFsbCBoYXZlIHRoZSBtYXNrIGluIHRoZW0gKi8KLQotICAvKiBXaGF0IHdlIGRvOgotICAgICBpIGluc3RydWN0aW9uIHRvIGJlIGxlZnQgYWxvbmUKLSAgICAgbyBvZmZzZXQgd2l0aGluIGluc3RydWN0aW9uCi0gICAgIHIgcmVsb2NhdGlvbiBvZmZzZXQgdG8gYXBwbHkKLSAgICAgUyBzcmMgbWFzawotICAgICBEIGRzdCBtYXNrCi0gICAgIE4gfmRzdCBtYXNrCi0gICAgIEEgcGFydCAxCi0gICAgIEIgcGFydCAyCi0gICAgIFIgcmVzdWx0Ci0KLSAgICAgRG8gdGhpczoKLSAgICAgaSBpIGkgaSBpIG8gbyBvIG8gbyAgICAgICAgZnJvbSBiZmRfZ2V0PHNpemU+Ci0gICAgIGFuZCAgICAgICAgICAgUyBTIFMgUyBTICAgIHRvIGdldCB0aGUgc2l6ZSBvZmZzZXQgd2Ugd2FudAotICAgICArICAgciByIHIgciByIHIgciByIHIgciAgdG8gZ2V0IHRoZSBmaW5hbCB2YWx1ZSB0byBwbGFjZQotICAgICBhbmQgICAgICAgICAgIEQgRCBEIEQgRCAgdG8gY2hvcCB0byByaWdodCBzaXplCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIEEgQSBBIEEgQQotICAgICBBbmQgdGhpczoKLSAgICAgLi4uICAgaSBpIGkgaSBpIG8gbyBvIG8gbyAgZnJvbSBiZmRfZ2V0PHNpemU+Ci0gICAgIGFuZCAgIE4gTiBOIE4gTiAgICAgICAgICAgIGdldCBpbnN0cnVjdGlvbgotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAuLi4gICBCIEIgQiBCIEIKLQotICAgICBBbmQgdGhlbjoKLSAgICAgQiBCIEIgQiBCCi0gICAgIG9yICAgICAgICAgICAgICBBIEEgQSBBIEEKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgUiBSIFIgUiBSIFIgUiBSIFIgUiAgICAgICAgcHV0IGludG8gYmZkX3B1dDxzaXplPgotICAgICAqLwotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCAoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyAgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spKQotCi0gIGRhdGEgPSAoYmZkX2J5dGUgKikgZGF0YV9zdGFydCArIChhZGRyIC0gZGF0YV9zdGFydF9vZmZzZXQpOwotCi0gIHN3aXRjaCAoaG93dG8tPnNpemUpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIHsKLQljaGFyIHggPSBiZmRfZ2V0XzggKGFiZmQsIChjaGFyICopIGRhdGEpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfOCAoYWJmZCwgeCwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIHsKLQlzaG9ydCB4ID0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfMTYgKGFiZmQsIHgsICh1bnNpZ25lZCBjaGFyICopIGRhdGEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgewotCWxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhKTsKLQlET0lUICh4KTsKLQliZmRfcHV0XzMyIChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIC0yOgotICAgICAgewotCWxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhKTsKLQlyZWxvY2F0aW9uID0gLXJlbG9jYXRpb247Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF8zMiAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICAvKiBEbyBub3RoaW5nICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDoKLSAgICAgIHsKLQliZmRfdm1hIHggPSBiZmRfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSk7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF82NCAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3RoZXI7Ci0gICAgfQotCi0gIHJldHVybiBmbGFnOwotfQotCi0vKiBUaGlzIHJlbG9jYXRpb24gcm91dGluZSBpcyB1c2VkIGJ5IHNvbWUgb2YgdGhlIGJhY2tlbmQgbGlua2Vycy4KLSAgIFRoZXkgZG8gbm90IGNvbnN0cnVjdCBhc3ltYm9sIG9yIGFyZWxlbnQgc3RydWN0dXJlcywgc28gdGhlcmUgaXMgbm8KLSAgIHJlYXNvbiBmb3IgdGhlbSB0byB1c2UgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gIEFsc28sCi0gICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGlzIHNvIGhhY2tlZCB1cCBpdCBpcyBlYXNpZXIgdG8gd3JpdGUgYSBuZXcKLSAgIGZ1bmN0aW9uIHRoYW4gdG8gdHJ5IHRvIGRlYWwgd2l0aCBpdC4KLQotICAgVGhpcyByb3V0aW5lIGRvZXMgYSBmaW5hbCByZWxvY2F0aW9uLiAgV2hldGhlciBpdCBpcyB1c2VmdWwgZm9yIGEKLSAgIHJlbG9jYXRlYWJsZSBsaW5rIGRlcGVuZHMgdXBvbiBob3cgdGhlIG9iamVjdCBmb3JtYXQgZGVmaW5lcwotICAgcmVsb2NhdGlvbnMuCi0KLSAgIEZJWE1FOiBUaGlzIHJvdXRpbmUgaWdub3JlcyBhbnkgc3BlY2lhbF9mdW5jdGlvbiBpbiB0aGUgSE9XVE8sCi0gICBzaW5jZSB0aGUgZXhpc3Rpbmcgc3BlY2lhbF9mdW5jdGlvbiB2YWx1ZXMgaGF2ZSBiZWVuIHdyaXR0ZW4gZm9yCi0gICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLgotCi0gICBIT1dUTyBpcyB0aGUgcmVsb2MgaG93dG8gaW5mb3JtYXRpb24uCi0gICBJTlBVVF9CRkQgaXMgdGhlIEJGRCB3aGljaCB0aGUgcmVsb2MgYXBwbGllcyB0by4KLSAgIElOUFVUX1NFQ1RJT04gaXMgdGhlIHNlY3Rpb24gd2hpY2ggdGhlIHJlbG9jIGFwcGxpZXMgdG8uCi0gICBDT05URU5UUyBpcyB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24uCi0gICBBRERSRVNTIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvYyB3aXRoaW4gSU5QVVRfU0VDVElPTi4KLSAgIFZBTFVFIGlzIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHRoZSByZWxvYyByZWZlcnMgdG8uCi0gICBBRERFTkQgaXMgdGhlIGFkZGVuZCBvZiB0aGUgcmVsb2MuICAqLwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIGFkZHJlc3MsCi0JCQkgIHZhbHVlLCBhZGRlbmQpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcy4gICovCi0gIGlmIChhZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgYmFzaWMgcmVsb2NhdGlvbgotICAgICBhZ2FpbnN0IGEgc3ltYm9sLiAgV2Ugd2FudCB0byBjb21wdXRlIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHRvCi0gICAgIHJlbG9jYXRlIHRvLiAgVGhpcyBpcyBqdXN0IFZBTFVFLCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCwgcGx1cwotICAgICBBRERFTkQsIGFueSBhZGRlbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWxvYy4gICovCi0gIHJlbG9jYXRpb24gPSB2YWx1ZSArIGFkZGVuZDsKLQotICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBQQyByZWxhdGl2ZSwgd2Ugd2FudCB0byBzZXQgUkVMT0NBVElPTiB0bwotICAgICB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3ltYm9sIChjdXJyZW50bHkgaW4gUkVMT0NBVElPTikgYW5kIHRoZQotICAgICBsb2NhdGlvbiB3ZSBhcmUgcmVsb2NhdGluZy4gIFNvbWUgdGFyZ2V0cyAoZS5nLiwgaTM4Ni1hb3V0KQotICAgICBhcnJhbmdlIGZvciB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gdG8gYmUgdGhlIG5lZ2F0aXZlIG9mIHRoZQotICAgICBvZmZzZXQgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbjsgZm9yIHN1Y2ggdGFyZ2V0cwotICAgICBwY3JlbF9vZmZzZXQgaXMgZmFsc2UuICBPdGhlciB0YXJnZXRzIChlLmcuLCBtODhrYmNzIG9yIEVMRikKLSAgICAgc2ltcGx5IGxlYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBhcyB6ZXJvOyBmb3Igc3VjaAotICAgICB0YXJnZXRzIHBjcmVsX29mZnNldCBpcyB0cnVlLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlIHdlIGRvIG5vdAotICAgICBuZWVkIHRvIHN1YnRyYWN0IG91dCB0aGUgb2Zmc2V0IG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlCi0gICAgIHNlY3Rpb24gKHdoaWNoIGlzIGp1c3QgQUREUkVTUykuICAqLwotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JcmVsb2NhdGlvbiAtPSBhZGRyZXNzOwotICAgIH0KLQotICByZXR1cm4gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgY29udGVudHMgKyBhZGRyZXNzKTsKLX0KLQotLyogUmVsb2NhdGUgYSBnaXZlbiBsb2NhdGlvbiB1c2luZyBhIGdpdmVuIHZhbHVlIGFuZCBob3d0by4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgbG9jYXRpb24pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICBiZmRfYnl0ZSAqbG9jYXRpb247Ci17Ci0gIGludCBzaXplOwotICBiZmRfdm1hIHg7Ci0gIGJvb2xlYW4gb3ZlcmZsb3c7Ci0gIHVuc2lnbmVkIGludCByaWdodHNoaWZ0ID0gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0gIHVuc2lnbmVkIGludCBiaXRwb3MgPSBob3d0by0+Yml0cG9zOwotCi0gIC8qIElmIHRoZSBzaXplIGlzIG5lZ2F0aXZlLCBuZWdhdGUgUkVMT0NBVElPTi4gIFRoaXMgaXNuJ3QgdmVyeQotICAgICBnZW5lcmFsLiAgKi8KLSAgaWYgKGhvd3RvLT5zaXplIDwgMCkKLSAgICByZWxvY2F0aW9uID0gLXJlbG9jYXRpb247Ci0KLSAgLyogR2V0IHRoZSB2YWx1ZSB3ZSBhcmUgZ29pbmcgdG8gcmVsb2NhdGUuICAqLwotICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIDE6Ci0gICAgICB4ID0gYmZkX2dldF84IChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHggPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSNpZmRlZiBCRkQ2NAotICAgICAgeCA9IGJmZF9nZXRfNjQgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotI2Vsc2UKLSAgICAgIGFib3J0ICgpOwotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgZm9yIG92ZXJmbG93LiAgRklYTUU6IFdlIG1heSBkcm9wIGJpdHMgZHVyaW5nIHRoZSBhZGRpdGlvbgotICAgICB3aGljaCB3ZSBkb24ndCBjaGVjayBmb3IuICBXZSBtdXN0IGVpdGhlciBjaGVjayBhdCBldmVyeSBzaW5nbGUKLSAgICAgb3BlcmF0aW9uLCB3aGljaCB3b3VsZCBiZSB0ZWRpb3VzLCBvciB3ZSBtdXN0IGRvIHRoZSBjb21wdXRhdGlvbnMKLSAgICAgaW4gYSB0eXBlIGxhcmdlciB0aGFuIGJmZF92bWEsIHdoaWNoIHdvdWxkIGJlIGluZWZmaWNpZW50LiAgKi8KLSAgb3ZlcmZsb3cgPSBmYWxzZTsKLSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyAhPSBjb21wbGFpbl9vdmVyZmxvd19kb250KQotICAgIHsKLSAgICAgIGJmZF92bWEgYWRkcm1hc2ssIGZpZWxkbWFzaywgc2lnbm1hc2ssIHNzOwotICAgICAgYmZkX3ZtYSBhLCBiLCBzdW07Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWVzIHRvIGJlIGFkZGVkIHRvZ2V0aGVyLiAgRm9yIHNpZ25lZCBhbmQgdW5zaWduZWQKLSAgICAgICAgIHJlbG9jYXRpb25zLCB3ZSBhc3N1bWUgdGhhdCBhbGwgdmFsdWVzIHNob3VsZCBiZSB0cnVuY2F0ZWQgdG8KLSAgICAgICAgIHRoZSBzaXplIG9mIGFuIGFkZHJlc3MuICBGb3IgYml0ZmllbGRzLCBhbGwgdGhlIGJpdHMgbWF0dGVyLgotICAgICAgICAgU2VlIGFsc28gYmZkX2NoZWNrX292ZXJmbG93LiAgKi8KLSAgICAgIGZpZWxkbWFzayA9IE5fT05FUyAoaG93dG8tPmJpdHNpemUpOwotICAgICAgYWRkcm1hc2sgPSBOX09ORVMgKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGlucHV0X2JmZCkpIHwgZmllbGRtYXNrOwotICAgICAgYSA9IHJlbG9jYXRpb247Ci0gICAgICBiID0geCAmIGhvd3RvLT5zcmNfbWFzazsKLQotICAgICAgc3dpdGNoIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cpCi0JewotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkOgotCSAgYSA9IChhICYgYWRkcm1hc2spID4+IHJpZ2h0c2hpZnQ7Ci0KLQkgIC8qIElmIGFueSBzaWduIGJpdHMgYXJlIHNldCwgYWxsIHNpZ24gYml0cyBtdXN0IGJlIHNldC4KLQkgICAgIFRoYXQgaXMsIEEgbXVzdCBiZSBhIHZhbGlkIG5lZ2F0aXZlIGFkZHJlc3MgYWZ0ZXIKLQkgICAgIHNoaWZ0aW5nLiAgKi8KLQkgIHNpZ25tYXNrID0gfiAoZmllbGRtYXNrID4+IDEpOwotCSAgc3MgPSBhICYgc2lnbm1hc2s7Ci0JICBpZiAoc3MgIT0gMCAmJiBzcyAhPSAoKGFkZHJtYXNrID4+IHJpZ2h0c2hpZnQpICYgc2lnbm1hc2spKQotCSAgICBvdmVyZmxvdyA9IHRydWU7Ci0KLQkgIC8qIFdlIG9ubHkgbmVlZCB0aGlzIG5leHQgYml0IG9mIGNvZGUgaWYgdGhlIHNpZ24gYml0IG9mIEIKLSAgICAgICAgICAgICBpcyBiZWxvdyB0aGUgc2lnbiBiaXQgb2YgQS4gIFRoaXMgd291bGQgb25seSBoYXBwZW4gaWYKLSAgICAgICAgICAgICBTUkNfTUFTSyBoYWQgZmV3ZXIgYml0cyB0aGFuIEJJVFNJWkUuICBOb3RlIHRoYXQgaWYKLSAgICAgICAgICAgICBTUkNfTUFTSyBoYXMgbW9yZSBiaXRzIHRoYW4gQklUU0laRSwgd2UgY2FuIGdldCBpbnRvCi0gICAgICAgICAgICAgdHJvdWJsZTsgd2Ugd291bGQgbmVlZCB0byB2ZXJpZnkgdGhhdCBCIGlzIGluIHJhbmdlLCBhcwotICAgICAgICAgICAgIHdlIGRvIGZvciBBIGFib3ZlLiAgKi8KLQkgIHNpZ25tYXNrID0gKCh+IGhvd3RvLT5zcmNfbWFzaykgPj4gMSkgJiBob3d0by0+c3JjX21hc2s7Ci0JICBpZiAoKGIgJiBzaWdubWFzaykgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIFNldCBhbGwgdGhlIGJpdHMgYWJvdmUgdGhlIHNpZ24gYml0LiAgKi8KLQkgICAgICBiIC09IHNpZ25tYXNrIDw8PSAxOwotCSAgICB9Ci0KLQkgIGIgPSAoYiAmIGFkZHJtYXNrKSA+PiBiaXRwb3M7Ci0KLQkgIC8qIE5vdyB3ZSBjYW4gZG8gdGhlIGFkZGl0aW9uLiAgKi8KLQkgIHN1bSA9IGEgKyBiOwotCi0JICAvKiBTZWUgaWYgdGhlIHJlc3VsdCBoYXMgdGhlIGNvcnJlY3Qgc2lnbi4gIEJpdHMgYWJvdmUgdGhlCi0gICAgICAgICAgICAgc2lnbiBiaXQgYXJlIGp1bmsgbm93OyBpZ25vcmUgdGhlbS4gIElmIHRoZSBzdW0gaXMKLSAgICAgICAgICAgICBwb3NpdGl2ZSwgbWFrZSBzdXJlIHdlIGRpZCBub3QgaGF2ZSBhbGwgbmVnYXRpdmUgaW5wdXRzOwotICAgICAgICAgICAgIGlmIHRoZSBzdW0gaXMgbmVnYXRpdmUsIG1ha2Ugc3VyZSB3ZSBkaWQgbm90IGhhdmUgYWxsCi0gICAgICAgICAgICAgcG9zaXRpdmUgaW5wdXRzLiAgVGhlIHRlc3QgYmVsb3cgbG9va3Mgb25seSBhdCB0aGUgc2lnbgotICAgICAgICAgICAgIGJpdHMsIGFuZCBpdCByZWFsbHkganVzdAotCSAgICAgICAgIFNJR04gKEEpID09IFNJR04gKEIpICYmIFNJR04gKEEpICE9IFNJR04gKFNVTSkKLQkgICAgICovCi0JICBzaWdubWFzayA9IChmaWVsZG1hc2sgPj4gMSkgKyAxOwotCSAgaWYgKCgofiAoYSBeIGIpKSAmIChhIF4gc3VtKSkgJiBzaWdubWFzaykKLQkgICAgb3ZlcmZsb3cgPSB0cnVlOwotCi0JICBicmVhazsKLQotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQ6Ci0JICAvKiBDaGVja2luZyBmb3IgYW4gdW5zaWduZWQgb3ZlcmZsb3cgaXMgcmVsYXRpdmVseSBlYXN5OgotICAgICAgICAgICAgIHRyaW0gdGhlIGFkZHJlc3NlcyBhbmQgYWRkLCBhbmQgdHJpbSB0aGUgcmVzdWx0IGFzIHdlbGwuCi0gICAgICAgICAgICAgT3ZlcmZsb3cgaXMgbm9ybWFsbHkgaW5kaWNhdGVkIHdoZW4gdGhlIHJlc3VsdCBkb2VzIG5vdAotICAgICAgICAgICAgIGZpdCBpbiB0aGUgZmllbGQuICBIb3dldmVyLCB3ZSBhbHNvIG5lZWQgdG8gY29uc2lkZXIgdGhlCi0gICAgICAgICAgICAgY2FzZSB3aGVuLCBlLmcuLCBmaWVsZG1hc2sgaXMgMHg3ZmZmZmZmZiBvciBzbWFsbGVyLCBhbgotICAgICAgICAgICAgIGlucHV0IGlzIDB4ODAwMDAwMDAsIGFuZCBiZmRfdm1hIGlzIG9ubHkgMzIgYml0czsgdGhlbiB3ZQotICAgICAgICAgICAgIHdpbGwgZ2V0IHN1bSA9PSAwLCBidXQgdGhlcmUgaXMgYW4gb3ZlcmZsb3csIHNpbmNlIHRoZQotICAgICAgICAgICAgIGlucHV0cyBkaWQgbm90IGZpdCBpbiB0aGUgZmllbGQuICBJbnN0ZWFkIG9mIGRvaW5nIGEKLSAgICAgICAgICAgICBzZXBhcmF0ZSB0ZXN0LCB3ZSBjYW4gY2hlY2sgZm9yIHRoaXMgYnkgb3ItaW5nIGluIHRoZQotICAgICAgICAgICAgIG9wZXJhbmRzIHdoZW4gdGVzdGluZyBmb3IgdGhlIHN1bSBvdmVyZmxvd2luZyBpdHMgZmluYWwKLSAgICAgICAgICAgICBmaWVsZC4gICovCi0JICBhID0gKGEgJiBhZGRybWFzaykgPj4gcmlnaHRzaGlmdDsKLQkgIGIgPSAoYiAmIGFkZHJtYXNrKSA+PiBiaXRwb3M7Ci0JICBzdW0gPSAoYSArIGIpICYgYWRkcm1hc2s7Ci0JICBpZiAoKGEgfCBiIHwgc3VtKSAmIH4gZmllbGRtYXNrKQotCSAgICBvdmVyZmxvdyA9IHRydWU7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZDoKLQkgIC8qIE11Y2ggbGlrZSB1bnNpZ25lZCwgZXhjZXB0IG5vIHRyaW1taW5nIHdpdGggYWRkcm1hc2suICBJbgotICAgICAgICAgICAgIGFkZGl0aW9uLCB0aGUgc3VtIG92ZXJmbG93cyBpZiB0aGVyZSBpcyBhIGNhcnJ5IG91dCBvZgotICAgICAgICAgICAgIHRoZSBiZmRfdm1hLCBpLmUuLCB0aGUgc3VtIGlzIGxlc3MgdGhhbiBlaXRoZXIgaW5wdXQKLSAgICAgICAgICAgICBvcGVyYW5kLiAgKi8KLQkgIGEgPj49IHJpZ2h0c2hpZnQ7Ci0JICBiID4+PSBiaXRwb3M7Ci0KLQkgIC8qIEJpdGZpZWxkcyBhcmUgc29tZXRpbWVzIHVzZWQgZm9yIHNpZ25lZCBudW1iZXJzOyBmb3IKLSAgICAgICAgICAgICBleGFtcGxlLCBhIDEzLWJpdCBmaWVsZCBzb21ldGltZXMgcmVwcmVzZW50cyB2YWx1ZXMgaW4KLSAgICAgICAgICAgICAwLi44MTkxIGFuZCBzb21ldGltZXMgcmVwcmVzZW50cyB2YWx1ZXMgaW4gLTQwOTYuLjQwOTUuCi0gICAgICAgICAgICAgSWYgdGhlIGZpZWxkIGlzIHNpZ25lZCBhbmQgYSBpcyAtNDA5NSAoMHgxMDAxKSBhbmQgYiBpcwotICAgICAgICAgICAgIC0xICgweDFmZmYpLCB0aGUgc3VtIGlzIC00MDk2ICgweDEwMDApLCBidXQgKDB4MTAwMSArCi0gICAgICAgICAgICAgMHgxZmZmIGlzIDB4MzAwMCkuICBJdCdzIG5vdCBjbGVhciBob3cgdG8gaGFuZGxlIHRoaXMKLSAgICAgICAgICAgICBldmVyeXdoZXJlLCBzaW5jZSB0aGVyZSBpcyBub3Qgd2F5IHRvIGtub3cgaG93IG1hbnkgYml0cwotICAgICAgICAgICAgIGFyZSBzaWduaWZpY2FudCBpbiB0aGUgcmVsb2NhdGlvbiwgYnV0IHRoZSBvcmlnaW5hbCBjb2RlCi0gICAgICAgICAgICAgYXNzdW1lZCB0aGF0IGl0IHdhcyBmdWxseSBzaWduIGV4dGVuZGVkLCBhbmQgd2Ugd2lsbCBrZWVwCi0gICAgICAgICAgICAgdGhhdCBhc3N1bXB0aW9uLiAgKi8KLQkgIHNpZ25tYXNrID0gKGZpZWxkbWFzayA+PiAxKSArIDE7Ci0KLQkgIGlmICgoYSAmIH4gZmllbGRtYXNrKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogU29tZSBiaXRzIG91dCBvZiB0aGUgZmllbGQgYXJlIHNldC4gIFRoaXMgbWlnaHQgbm90Ci0gICAgICAgICAgICAgICAgIGJlIGEgcHJvYmxlbTogaWYgdGhpcyBpcyBhIHNpZ25lZCBiaXRmaWVsZCwgaXQgaXMgT0sKLSAgICAgICAgICAgICAgICAgaWZmIGFsbCB0aGUgaGlnaCBiaXRzIGFyZSBzZXQsIGluY2x1ZGluZyB0aGUgc2lnbgotICAgICAgICAgICAgICAgICBiaXQuICBXZSdsbCB0cnkgc2V0dGluZyBhbGwgYnV0IHRoZSBtb3N0IHNpZ25pZmljYW50Ci0gICAgICAgICAgICAgICAgIGJpdCBpbiB0aGUgb3JpZ2luYWwgcmVsb2NhdGlvbiB2YWx1ZTogaWYgdGhpcyBpcyBhbGwKLSAgICAgICAgICAgICAgICAgb25lcywgd2UgYXJlIE9LLCBhc3N1bWluZyBhIHNpZ25lZCBiaXRmaWVsZC4gICovCi0JICAgICAgc3MgPSAoc2lnbm1hc2sgPDwgcmlnaHRzaGlmdCkgLSAxOwotCSAgICAgIGlmICgoc3MgfCByZWxvY2F0aW9uKSAhPSB+IChiZmRfdm1hKSAwKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYSAmPSBmaWVsZG1hc2s7Ci0JICAgIH0KLQotCSAgLyogV2UganVzdCBhc3N1bWUgKGIgJiB+IGZpZWxkbWFzaykgPT0gMC4gICovCi0KLQkgIHN1bSA9IGEgKyBiOwotCSAgaWYgKHN1bSA8IGEgfHwgKHN1bSAmIH4gZmllbGRtYXNrKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhlcmUgd2FzIGEgY2Fycnkgb3V0LCBvciB0aGUgZmllbGQgb3ZlcmZsb3cuICBUZXN0Ci0gICAgICAgICAgICAgICAgIGZvciBzaWduZWQgb3BlcmFuZHMgYWdhaW4uICBIZXJlIGlzIHRoZSBvdmVyZmxvdyB0ZXN0Ci0gICAgICAgICAgICAgICAgIGlzIGFzIGZvciBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQuICAqLwotCSAgICAgIGlmICgoKH4gKGEgXiBiKSkgJiAoYSBeIHN1bSkpICYgc2lnbm1hc2spCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgfQotCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIC8qIFB1dCBSRUxPQ0FUSU9OIGluIHRoZSByaWdodCBiaXRzLiAgKi8KLSAgcmVsb2NhdGlvbiA+Pj0gKGJmZF92bWEpIHJpZ2h0c2hpZnQ7Ci0gIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBiaXRwb3M7Ci0KLSAgLyogQWRkIFJFTE9DQVRJT04gdG8gdGhlIHJpZ2h0IGJpdHMgb2YgWC4gICovCi0gIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKQotICAgICAgIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpOwotCi0gIC8qIFB1dCB0aGUgcmVsb2NhdGVkIHZhbHVlIGJhY2sgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgMToKLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotI2lmZGVmIEJGRDY0Ci0gICAgICBiZmRfcHV0XzY0IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBvdmVyZmxvdyA/IGJmZF9yZWxvY19vdmVyZmxvdyA6IGJmZF9yZWxvY19vazsKLX0KLQotLyoKLURPQ0RECi1JTk9ERQotCWhvd3RvIG1hbmFnZXIsICAsIHR5cGVkZWYgYXJlbGVudCwgUmVsb2NhdGlvbnMKLQotU0VDVElPTgotCVRoZSBob3d0byBtYW5hZ2VyCi0KLQlXaGVuIGFuIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGNyZWF0ZSBhIHJlbG9jYXRpb24sIGJ1dCBkb2Vzbid0Ci0Ja25vdyB3aGF0IHRoZSB0YXJnZXQgbWFjaGluZSBtaWdodCBjYWxsIGl0LCBpdCBjYW4gZmluZCBvdXQgYnkKLQl1c2luZyB0aGlzIGJpdCBvZiBjb2RlLgotCi0qLwotCi0vKgotVFlQRURFRgotCWJmZF9yZWxvY19jb2RlX3R5cGUKLQotREVTQ1JJUFRJT04KLQlUaGUgaW5zaWRlcyBvZiBhIHJlbG9jIGNvZGUuICBUaGUgaWRlYSBpcyB0aGF0LCBldmVudHVhbGx5LCB0aGVyZQotCXdpbGwgYmUgb25lIGVudW1lcmF0b3IgZm9yIGV2ZXJ5IHR5cGUgb2YgcmVsb2NhdGlvbiB3ZSBldmVyIGRvLgotCVBhc3Mgb25lIG9mIHRoZXNlIHZhbHVlcyB0byA8PGJmZF9yZWxvY190eXBlX2xvb2t1cD4+LCBhbmQgaXQnbGwKLQlyZXR1cm4gYSBob3d0byBwb2ludGVyLgotCi0JVGhpcyBkb2VzIG1lYW4gdGhhdCB0aGUgYXBwbGljYXRpb24gbXVzdCBkZXRlcm1pbmUgdGhlIGNvcnJlY3QKLQllbnVtZXJhdG9yIHZhbHVlOyB5b3UgY2FuJ3QgZ2V0IGEgaG93dG8gcG9pbnRlciBmcm9tIGEgcmFuZG9tIHNldAotCW9mIGF0dHJpYnV0ZXMuCi0KLVNFTlVNCi0gICBiZmRfcmVsb2NfY29kZV9yZWFsCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzY0Ci1FTlVNWAotICBCRkRfUkVMT0NfMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18yNgotRU5VTVgKLSAgQkZEX1JFTE9DXzI0Ci1FTlVNWAotICBCRkRfUkVMT0NfMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNAotRU5VTVgKLSAgQkZEX1JFTE9DXzgKLUVOVU1ET0MKLSAgQmFzaWMgYWJzb2x1dGUgcmVsb2NhdGlvbnMgb2YgTiBiaXRzLgotCi1FTlVNCi0gIEJGRF9SRUxPQ182NF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzMyX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMjRfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNl9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzEyX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfOF9QQ1JFTAotRU5VTURPQwotICBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucy4gIFNvbWV0aW1lcyB0aGVzZSBhcmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3MKLW9mIHRoZSByZWxvY2F0aW9uIGl0c2VsZjsgc29tZXRpbWVzIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZgotdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgcmVsb2NhdGlvbi4gIEl0IGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIHRhcmdldC4KLQotVGhlIDI0LWJpdCByZWxvY2F0aW9uIGlzIHVzZWQgaW4gc29tZSBJbnRlbCA5NjAgY29uZmlndXJhdGlvbnMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzhfR09UX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMzJfR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfTE8xNl9HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ19ISTE2X0dPVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ184X0dPVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzhfUExUX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMzJfUExUT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfUExUT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfTE8xNl9QTFRPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ19ISTE2X1BMVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfU19QTFRPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ184X1BMVE9GRgotRU5VTURPQwotICBGb3IgRUxGLgotCi1FTlVNCi0gIEJGRF9SRUxPQ182OEtfR0xPQl9EQVQKLUVOVU1YCi0gIEJGRF9SRUxPQ182OEtfSk1QX1NMT1QKLUVOVU1YCi0gIEJGRF9SRUxPQ182OEtfUkVMQVRJVkUKLUVOVU1ET0MKLSAgUmVsb2NhdGlvbnMgdXNlZCBieSA2OEsgRUxGLgotCi1FTlVNCi0gIEJGRF9SRUxPQ18zMl9CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfQkFTRVJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX0xPMTZfQkFTRVJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfQkFTRVJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfOF9CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfUlZBCi1FTlVNRE9DCi0gIExpbmthZ2UtdGFibGUgcmVsYXRpdmUuCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzhfRkZubgotRU5VTURPQwotICBBYnNvbHV0ZSA4LWJpdCByZWxvY2F0aW9uLCBidXQgdXNlZCB0byBmb3JtIGFuIGFkZHJlc3MgbGlrZSAweEZGbm4uCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzMyX1BDUkVMX1MyCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfUENSRUxfUzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18yM19QQ1JFTF9TMgotRU5VTURPQwotICBUaGVzZSBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucyBhcmUgc3RvcmVkIGFzIHdvcmQgZGlzcGxhY2VtZW50cyAtLQotaS5lLiwgYnl0ZSBkaXNwbGFjZW1lbnRzIHNoaWZ0ZWQgcmlnaHQgdHdvIGJpdHMuICBUaGUgMzAtYml0IHdvcmQKLWRpc3BsYWNlbWVudCAoPDwzMl9QQ1JFTF9TMj4+IC0tIDMyIGJpdHMsIHNoaWZ0ZWQgMikgaXMgdXNlZCBvbiB0aGUKLVNQQVJDLiAgKFNQQVJDIHRvb2xzIGdlbmVyYWxseSByZWZlciB0byB0aGlzIGFzIDw8V0RJU1AzMD4+LikgIFRoZQotc2lnbmVkIDE2LWJpdCBkaXNwbGFjZW1lbnQgaXMgdXNlZCBvbiB0aGUgTUlQUywgYW5kIHRoZSAyMy1iaXQKLWRpc3BsYWNlbWVudCBpcyB1c2VkIG9uIHRoZSBBbHBoYS4KLQotRU5VTQotICBCRkRfUkVMT0NfSEkyMgotRU5VTVgKLSAgQkZEX1JFTE9DX0xPMTAKLUVOVU1ET0MKLSAgSGlnaCAyMiBiaXRzIGFuZCBsb3cgMTAgYml0cyBvZiAzMi1iaXQgdmFsdWUsIHBsYWNlZCBpbnRvIGxvd2VyIGJpdHMgb2YKLXRoZSB0YXJnZXQgd29yZC4gIFRoZXNlIGFyZSB1c2VkIG9uIHRoZSBTUEFSQy4KLQotRU5VTQotICBCRkRfUkVMT0NfR1BSRUwxNgotRU5VTVgKLSAgQkZEX1JFTE9DX0dQUkVMMzIKLUVOVU1ET0MKLSAgRm9yIHN5c3RlbXMgdGhhdCBhbGxvY2F0ZSBhIEdsb2JhbCBQb2ludGVyIHJlZ2lzdGVyLCB0aGVzZSBhcmUKLWRpc3BsYWNlbWVudHMgb2ZmIHRoYXQgcmVnaXN0ZXIuICBUaGVzZSByZWxvY2F0aW9uIHR5cGVzIGFyZQotaGFuZGxlZCBzcGVjaWFsbHksIGJlY2F1c2UgdGhlIHZhbHVlIHRoZSByZWdpc3RlciB3aWxsIGhhdmUgaXMKLWRlY2lkZWQgcmVsYXRpdmVseSBsYXRlLgotCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0k5NjBfQ0FMTEoKLUVOVU1ET0MKLSAgUmVsb2MgdHlwZXMgdXNlZCBmb3IgaTk2MC9iLm91dC4KLQotRU5VTQotICBCRkRfUkVMT0NfTk9ORQotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQzIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkMxMwotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0dPVDEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfR09UMTMKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19HT1QyMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1BDMTAKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19QQzIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfQ09QWQotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0dMT0JfREFUCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19SRUxBVElWRQotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1VBMzIKLUVOVU1ET0MKLSAgU1BBUkMgRUxGIHJlbG9jYXRpb25zLiAgVGhlcmUgaXMgcHJvYmFibHkgc29tZSBvdmVybGFwIHdpdGggb3RoZXIKLSAgcmVsb2NhdGlvbiB0eXBlcyBhbHJlYWR5IGRlZmluZWQuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1NQQVJDX0JBU0UxMwotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0JBU0UyMgotRU5VTURPQwotICBJIHRoaW5rIHRoZXNlIGFyZSBzcGVjaWZpYyB0byBTUEFSQyBhLm91dCAoZS5nLiwgU3VuIDQpLgotCi1FTlVNRVEKLSAgQkZEX1JFTE9DX1NQQVJDXzY0Ci0gIEJGRF9SRUxPQ182NAotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDXzEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfMTEKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19PTE8xMAotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0hIMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19ITTEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfTE0yMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1BDX0hIMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19QQ19ITTEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUENfTE0yMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfNwotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDXzYKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ181Ci1FTlVNRVFYCi0gIEJGRF9SRUxPQ19TUEFSQ19ESVNQNjQKLSAgQkZEX1JFTE9DXzY0X1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUExUNjQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19ISVgyMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0xPWDEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfSDQ0Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfTTQ0Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfTDQ0Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUkVHSVNURVIKLUVOVU1ET0MKLSAgU1BBUkM2NCByZWxvY2F0aW9ucwotCi1FTlVNCi0gIEJGRF9SRUxPQ19TUEFSQ19SRVYzMgotRU5VTURPQwotICBTUEFSQyBsaXR0bGUgZW5kaWFuIHJlbG9jYXRpb24KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTYKLUVOVU1ET0MKLSAgQWxwaGEgRUNPRkYgYW5kIEVMRiByZWxvY2F0aW9ucy4gIFNvbWUgb2YgdGhlc2UgdHJlYXQgdGhlIHN5bWJvbCBvcgotICAgICAiYWRkZW5kIiBpbiBzb21lIHNwZWNpYWwgd2F5LgotICBGb3IgR1BESVNQX0hJMTYgKCJncGRpc3AiKSByZWxvY2F0aW9ucywgdGhlIHN5bWJvbCBpcyBpZ25vcmVkIHdoZW4KLSAgICAgd3JpdGluZzsgd2hlbiByZWFkaW5nLCBpdCB3aWxsIGJlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbC4gIFRoZQotICAgICBhZGRlbmQgaXMgdGhlIGRpc3BsYWNlbWVudCBpbiBieXRlcyBvZiB0aGUgImxkYSIgaW5zdHJ1Y3Rpb24gZnJvbQotICAgICB0aGUgImxkYWgiIGluc3RydWN0aW9uICh3aGljaCBpcyBhdCB0aGUgYWRkcmVzcyBvZiB0aGlzIHJlbG9jKS4KLUVOVU0KLSAgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2Ci1FTlVNRE9DCi0gIEZvciBHUERJU1BfTE8xNiAoImlnbm9yZSIpIHJlbG9jYXRpb25zLCB0aGUgc3ltYm9sIGlzIGhhbmRsZWQgYXMKLSAgICAgd2l0aCBHUERJU1BfSEkxNiByZWxvY3MuICBUaGUgYWRkZW5kIGlzIGlnbm9yZWQgd2hlbiB3cml0aW5nIHRoZQotICAgICByZWxvY2F0aW9ucyBvdXQsIGFuZCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgZmlsZSdzIEdQIHZhbHVlIG9uCi0gICAgIHJlYWRpbmcsIGZvciBjb252ZW5pZW5jZS4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfR1BESVNQCi1FTlVNRE9DCi0gIFRoZSBFTEYgR1BESVNQIHJlbG9jYXRpb24gaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgR1BESVNQX0hJMTYKLSAgICAgcmVsb2NhdGlvbiBleGNlcHQgdGhhdCB0aGVyZSBpcyBubyBhY2NvbXBhbnlpbmcgR1BESVNQX0xPMTYKLSAgICAgcmVsb2NhdGlvbi4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfTElURVJBTAotRU5VTVgKLSAgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMCi1FTlVNWAotICBCRkRfUkVMT0NfQUxQSEFfTElUVVNFCi1FTlVNRE9DCi0gIFRoZSBBbHBoYSBMSVRFUkFML0xJVFVTRSByZWxvY3MgYXJlIHByb2R1Y2VkIGJ5IGEgc3ltYm9sIHJlZmVyZW5jZTsKLSAgICAgdGhlIGFzc2VtYmxlciB0dXJucyBpdCBpbnRvIGEgTERRIGluc3RydWN0aW9uIHRvIGxvYWQgdGhlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIHN5bWJvbCwgYW5kIHRoZW4gZmlsbHMgaW4gYSByZWdpc3RlciBpbiB0aGUgcmVhbCBpbnN0cnVjdGlvbi4KLQotICAgICBUaGUgTElURVJBTCByZWxvYywgYXQgdGhlIExEUSBpbnN0cnVjdGlvbiwgcmVmZXJzIHRvIHRoZSAubGl0YQotICAgICBzZWN0aW9uIHN5bWJvbC4gIFRoZSBhZGRlbmQgaXMgaWdub3JlZCB3aGVuIHdyaXRpbmcsIGJ1dCBpcyBmaWxsZWQKLSAgICAgaW4gd2l0aCB0aGUgZmlsZSdzIEdQIHZhbHVlIG9uIHJlYWRpbmcsIGZvciBjb252ZW5pZW5jZSwgYXMgd2l0aCB0aGUKLSAgICAgR1BESVNQX0xPMTYgcmVsb2MuCi0KLSAgICAgVGhlIEVMRl9MSVRFUkFMIHJlbG9jIGlzIHNvbWV3aGVyZSBiZXR3ZWVuIDE2X0dPVE9GRiBhbmQgR1BESVNQX0xPMTYuCi0gICAgIEl0IHNob3VsZCByZWZlciB0byB0aGUgc3ltYm9sIHRvIGJlIHJlZmVyZW5jZWQsIGFzIHdpdGggMTZfR09UT0ZGLAotICAgICBidXQgaXQgZ2VuZXJhdGVzIG91dHB1dCBub3QgYmFzZWQgb24gdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgLmdvdAotICAgICBzZWN0aW9uLCBidXQgcmVsYXRpdmUgdG8gdGhlIEdQIHZhbHVlIGNob3NlbiBmb3IgdGhlIGZpbGUgZHVyaW5nIHRoZQotICAgICBmaW5hbCBsaW5rIHN0YWdlLgotCi0gICAgIFRoZSBMSVRVU0UgcmVsb2MsIG9uIHRoZSBpbnN0cnVjdGlvbiB1c2luZyB0aGUgbG9hZGVkIGFkZHJlc3MsIGdpdmVzCi0gICAgIGluZm9ybWF0aW9uIHRvIHRoZSBsaW5rZXIgdGhhdCBpdCBtaWdodCBiZSBhYmxlIHRvIHVzZSB0byBvcHRpbWl6ZQotICAgICBhd2F5IHNvbWUgbGl0ZXJhbCBzZWN0aW9uIHJlZmVyZW5jZXMuICBUaGUgc3ltYm9sIGlzIGlnbm9yZWQgKHJlYWQKLSAgICAgYXMgdGhlIGFic29sdXRlIHNlY3Rpb24gc3ltYm9sKSwgYW5kIHRoZSAiYWRkZW5kIiBpbmRpY2F0ZXMgdGhlIHR5cGUKLSAgICAgb2YgaW5zdHJ1Y3Rpb24gdXNpbmcgdGhlIHJlZ2lzdGVyOgotICAgICAgICAgICAgICAxIC0gIm1lbW9yeSIgZm10IGluc24KLSAgICAgICAgICAgICAgMiAtIGJ5dGUtbWFuaXB1bGF0aW9uIChieXRlIG9mZnNldCByZWcpCi0gICAgICAgICAgICAgIDMgLSBqc3IgKHRhcmdldCBvZiBicmFuY2gpCi0KLSAgICAgVGhlIEdOVSBsaW5rZXIgY3VycmVudGx5IGRvZXNuJ3QgZG8gYW55IG9mIHRoaXMgb3B0aW1pemluZy4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfSElOVAotRU5VTURPQwotICBUaGUgSElOVCByZWxvY2F0aW9uIGluZGljYXRlcyBhIHZhbHVlIHRoYXQgc2hvdWxkIGJlIGZpbGxlZCBpbnRvIHRoZQotICAgICAiaGludCIgZmllbGQgb2YgYSBqbXAvanNyL3JldCBpbnN0cnVjdGlvbiwgZm9yIHBvc3NpYmxlIGJyYW5jaC0KLSAgICAgcHJlZGljdGlvbiBsb2dpYyB3aGljaCBtYXkgYmUgcHJvdmlkZWQgb24gc29tZSBwcm9jZXNzb3JzLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFCi1FTlVNRE9DCi0gIFRoZSBMSU5LQUdFIHJlbG9jYXRpb24gb3V0cHV0cyBhIGxpbmthZ2UgcGFpciBpbiB0aGUgb2JqZWN0IGZpbGUsCi0gICAgIHdoaWNoIGlzIGZpbGxlZCBieSB0aGUgbGlua2VyLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUgotRU5VTURPQwotICBUaGUgQ09ERUFERFIgcmVsb2NhdGlvbiBvdXRwdXRzIGEgU1RPX0NBIGluIHRoZSBvYmplY3QgZmlsZSwKLSAgICAgd2hpY2ggaXMgZmlsbGVkIGJ5IHRoZSBsaW5rZXIuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01JUFNfSk1QCi1FTlVNRE9DCi0gIEJpdHMgMjcuLjIgb2YgdGhlIHJlbG9jYXRpb24gYWRkcmVzcyBzaGlmdGVkIHJpZ2h0IDIgYml0czsKLSAgICAgc2ltcGxlIHJlbG9jIG90aGVyd2lzZS4KLQotRU5VTQotICBCRkRfUkVMT0NfTUlQUzE2X0pNUAotRU5VTURPQwotICBUaGUgTUlQUzE2IGp1bXAgaW5zdHJ1Y3Rpb24uCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01JUFMxNl9HUFJFTAotRU5VTURPQwotICBNSVBTMTYgR1AgcmVsYXRpdmUgcmVsb2MuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0hJMTYKLUVOVU1ET0MKLSAgSGlnaCAxNiBiaXRzIG9mIDMyLWJpdCB2YWx1ZTsgc2ltcGxlIHJlbG9jLgotRU5VTQotICBCRkRfUkVMT0NfSEkxNl9TCi1FTlVNRE9DCi0gIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWUgYnV0IHRoZSBsb3cgMTYgYml0cyB3aWxsIGJlIHNpZ24KLSAgICAgZXh0ZW5kZWQgYW5kIGFkZGVkIHRvIGZvcm0gdGhlIGZpbmFsIHJlc3VsdC4gIElmIHRoZSBsb3cgMTYKLSAgICAgYml0cyBmb3JtIGEgbmVnYXRpdmUgbnVtYmVyLCB3ZSBuZWVkIHRvIGFkZCBvbmUgdG8gdGhlIGhpZ2ggdmFsdWUKLSAgICAgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGJvcnJvdyB3aGVuIHRoZSBsb3cgYml0cyBhcmUgYWRkZWQuCi1FTlVNCi0gIEJGRF9SRUxPQ19MTzE2Ci1FTlVNRE9DCi0gIExvdyAxNiBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfUENSRUxfSEkxNl9TCi1FTlVNRE9DCi0gIExpa2UgQkZEX1JFTE9DX0hJMTZfUywgYnV0IFBDIHJlbGF0aXZlLgotRU5VTQotICBCRkRfUkVMT0NfUENSRUxfTE8xNgotRU5VTURPQwotICBMaWtlIEJGRF9SRUxPQ19MTzE2LCBidXQgUEMgcmVsYXRpdmUuCi0KLUVOVU1FUQotICBCRkRfUkVMT0NfTUlQU19HUFJFTAotICBCRkRfUkVMT0NfR1BSRUwxNgotRU5VTURPQwotICBSZWxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBnbG9iYWwgcG9pbnRlci4KLQotRU5VTQotICBCRkRfUkVMT0NfTUlQU19MSVRFUkFMCi1FTlVNRE9DCi0gIFJlbG9jYXRpb24gYWdhaW5zdCBhIE1JUFMgbGl0ZXJhbCBzZWN0aW9uLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19NSVBTX0dPVDE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19DQUxMMTYKLUVOVU1FUVgKLSAgQkZEX1JFTE9DX01JUFNfR1BSRUwzMgotICBCRkRfUkVMT0NfR1BSRUwzMgotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNgotQ09NTUVOVAotRU5VTURPQwotICBNSVBTIEVMRiByZWxvY2F0aW9ucy4KLQotQ09NTUVOVAotCi1FTlVNCi0gIEJGRF9SRUxPQ18zODZfR09UMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18zODZfUExUMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18zODZfQ09QWQotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9HTE9CX0RBVAotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9KVU1QX1NMT1QKLUVOVU1YCi0gIEJGRF9SRUxPQ18zODZfUkVMQVRJVkUKLUVOVU1YCi0gIEJGRF9SRUxPQ18zODZfR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfMzg2X0dPVFBDCi1FTlVNRE9DCi0gIGkzODYvZWxmIHJlbG9jYXRpb25zCi0KLUVOVU0KLSAgQkZEX1JFTE9DX05TMzJLX0lNTV84Ci1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzMyCi1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzhfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMTZfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMzJfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzgKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfRElTUF8zMgotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfOF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyX1BDUkVMCi1FTlVNRE9DCi0gIG5zMzJrIHJlbG9jYXRpb25zCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1BQQ19CMjYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQkEyNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19UT0MxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19CMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU4KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0JBMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0JBMTZfQlJOVEFLRU4KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQ09QWQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19HTE9CX0RBVAotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19KTVBfU0xPVAotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19SRUxBVElWRQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEMKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE8KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEkKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEEKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMkkxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMlJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMjEKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX01SS1JFRgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0VDMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9ISQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEEKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNEQQotRU5VTURPQwotICBQb3dlcihyczYwMDApIGFuZCBQb3dlclBDIHJlbG9jYXRpb25zLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19DVE9SCi1FTlVNRE9DCi0gIFRoZSB0eXBlIG9mIHJlbG9jIHVzZWQgdG8gYnVpbGQgYSBjb250cnVjdG9yIHRhYmxlIC0gYXQgdGhlIG1vbWVudAotICBwcm9iYWJseSBhIDMyIGJpdCB3aWRlIGFic29sdXRlIHJlbG9jYXRpb24sIGJ1dCB0aGUgdGFyZ2V0IGNhbiBjaG9vc2UuCi0gIEl0IGdlbmVyYWxseSBkb2VzIG1hcCB0byBvbmUgb2YgdGhlIG90aGVyIHJlbG9jYXRpb24gdHlwZXMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gKLUVOVU1ET0MKLSAgQVJNIDI2IGJpdCBwYy1yZWxhdGl2ZSBicmFuY2guICBUaGUgbG93ZXN0IHR3byBiaXRzIG11c3QgYmUgemVybyBhbmQgYXJlCi0gIG5vdCBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLgotRU5VTQotICBCRkRfUkVMT0NfQVJNX0lNTUVESUFURQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1NISUZUX0lNTQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9TV0kKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fTVVMVEkKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9BRFJfSU1NCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0xEUl9JTU0KLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fTElURVJBTAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9JTl9QT09MCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04Ci1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0hXTElURVJBTAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9USFVNQl9BREQKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfSU1NCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZUCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9HT1QxMgotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9HT1QzMgotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9KVU1QX1NMT1QKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fQ09QWQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9HTE9CX0RBVAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9QTFQzMgotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9SRUxBVElWRQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fR09UUEMKLUVOVU1ET0MKLSAgVGhlc2UgcmVsb2NzIGFyZSBvbmx5IHVzZWQgd2l0aGluIHRoZSBBUk0gYXNzZW1ibGVyLiAgVGhleSBhcmUgbm90Ci0gIChhdCBwcmVzZW50KSB3cml0dGVuIHRvIGFueSBvYmplY3QgZmlsZXMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0lNTTQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9JTU00QlkyCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfSU1NNEJZNAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0lNTTgKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9JTU04QlkyCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfSU1NOEJZNAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZNAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX1NXSVRDSDE2Ci1FTlVNWAotICBCRkRfUkVMT0NfU0hfU1dJVENIMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9VU0VTCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfQ09VTlQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9BTElHTgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0NPREUKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9EQVRBCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfTEFCRUwKLUVOVU1ET0MKLSAgSGl0YWNoaSBTSCByZWxvY3MuICBOb3QgYWxsIG9mIHRoZXNlIGFwcGVhciBpbiBvYmplY3QgZmlsZXMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDkKLUVOVU1YCi0gIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMgotRU5VTVgKLSAgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzCi1FTlVNRE9DCi0gIFRodW1iIDIzLSwgMTItIGFuZCA5LWJpdCBwYy1yZWxhdGl2ZSBicmFuY2hlcy4gIFRoZSBsb3dlc3QgYml0IG11c3QKLSAgYmUgemVybyBhbmQgaXMgbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0FSQ19CMjJfUENSRUwKLUVOVU1ET0MKLSAgQXJnb25hdXQgUklTQyBDb3JlIChBUkMpIHJlbG9jcy4KLSAgQVJDIDIyIGJpdCBwYy1yZWxhdGl2ZSBicmFuY2guICBUaGUgbG93ZXN0IHR3byBiaXRzIG11c3QgYmUgemVybyBhbmQgYXJlCi0gIG5vdCBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgVGhlIGhpZ2ggMjAgYml0cyBhcmUgaW5zdGFsbGVkIGluIGJpdHMgMjYKLSAgdGhyb3VnaCA3IG9mIHRoZSBpbnN0cnVjdGlvbi4KLUVOVU0KLSAgQkZEX1JFTE9DX0FSQ19CMjYKLUVOVU1ET0MKLSAgQVJDIDI2IGJpdCBhYnNvbHV0ZSBicmFuY2guICBUaGUgbG93ZXN0IHR3byBiaXRzIG11c3QgYmUgemVybyBhbmQgYXJlIG5vdAotICBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgVGhlIGhpZ2ggMjQgYml0cyBhcmUgaW5zdGFsbGVkIGluIGJpdHMgMjMKLSAgdGhyb3VnaCAwLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IKLUVOVU1ET0MKLSAgTWl0c3ViaXNoaSBEMTBWIHJlbG9jcy4KLSAgVGhpcyBpcyBhIDEwLWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLSAgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MCi1FTlVNRE9DCi0gIE1pdHN1YmlzaGkgRDEwViByZWxvY3MuCi0gIFRoaXMgaXMgYSAxMC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCi0gIGFzc3VtZWQgdG8gYmUgMC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIHJlbG9jCi0gIGV4Y2VwdCBpdCBpcyBpbiB0aGUgbGVmdCBjb250YWluZXIsIGkuZS4sCi0gIHNoaWZ0ZWQgbGVmdCAxNSBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfRDEwVl8xOAotRU5VTURPQwotICBUaGlzIGlzIGFuIDE4LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLSAgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfRDEwVl8xOF9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGFuIDE4LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLSAgYXNzdW1lZCB0byBiZSAwLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzYKLUVOVU1ET0MKLSAgTWl0c3ViaXNoaSBEMzBWIHJlbG9jcy4KLSAgVGhpcyBpcyBhIDYtYml0IGFic29sdXRlIHJlbG9jLgotRU5VTQotICBCRkRfUkVMT0NfRDMwVl85X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA2LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotICB0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gIAotRU5VTQotICBCRkRfUkVMT0NfRDMwVl85X1BDUkVMX1IKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDYtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiBTYW1lCi0gIGFzIHRoZSBwcmV2aW91cyByZWxvYyBidXQgb24gdGhlIHJpZ2h0IHNpZGUKLSAgb2YgdGhlIGNvbnRhaW5lci4gIAotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8xNQotRU5VTURPQwotICBUaGlzIGlzIGEgMTItYml0IGFic29sdXRlIHJlbG9jIHdpdGggdGhlIAotICByaWdodCAzIGJpdHNhc3N1bWVkIHRvIGJlIDAuICAKLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfMTVfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDEyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotICB0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gIAotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxMi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKLSAgdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuIFNhbWUKLSAgYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQotICBvZiB0aGUgY29udGFpbmVyLiAgCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzIxCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IGFic29sdXRlIHJlbG9jIHdpdGggCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGFuIDE4LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotICB0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4KLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUxfUgotRU5VTURPQwotICBUaGlzIGlzIGFuIDE4LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotICB0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gU2FtZQotICBhcyB0aGUgcHJldmlvdXMgcmVsb2MgYnV0IG9uIHRoZSByaWdodCBzaWRlCi0gIG9mIHRoZSBjb250YWluZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzMyCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAzMi1iaXQgYWJzb2x1dGUgcmVsb2MuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzMyX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAzMi1iaXQgcGMtcmVsYXRpdmUgcmVsb2MuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfMjQKLUVOVU1ET0MKLSAgTWl0c3ViaXNoaSBNMzJSIHJlbG9jcy4KLSAgVGhpcyBpcyBhIDI0IGJpdCBhYnNvbHV0ZSBhZGRyZXNzLgotRU5VTQotICBCRkRfUkVMT0NfTTMyUl8xMF9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMTAtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cyBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19NMzJSXzE4X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cyBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19NMzJSXzI2X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAyNi1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzIGFzc3VtZWQgdG8gYmUgMC4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8KLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBoaWdoIDE2IGJpdHMgb2YgYW4gYWRkcmVzcwotICB1c2VkIHdoZW4gdGhlIGxvd2VyIDE2IGJpdHMgYXJlIHRyZWF0ZWQgYXMgdW5zaWduZWQuCi1FTlVNCi0gIEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgaGlnaCAxNiBiaXRzIG9mIGFuIGFkZHJlc3MKLSAgdXNlZCB3aGVuIHRoZSBsb3dlciAxNiBiaXRzIGFyZSB0cmVhdGVkIGFzIHNpZ25lZC4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfTE8xNgotRU5VTURPQwotICBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIGxvd2VyIDE2IGJpdHMgb2YgYW4gYWRkcmVzcy4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfU0RBMTYKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBzbWFsbCBkYXRhIGFyZWEgb2Zmc2V0IGZvciB1c2UgaW4KLSAgYWRkMywgbG9hZCwgYW5kIHN0b3JlIGluc3RydWN0aW9ucy4KLQotRU5VTQotICBCRkRfUkVMT0NfVjg1MF85X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA5LWJpdCByZWxvYwotRU5VTQotICBCRkRfUkVMT0NfVjg1MF8yMl9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMjItYml0IHJlbG9jCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfU0RBXzE1XzE2X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSAxNSBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZQotICBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9aREFfMTVfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDE1IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlCi0gIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1REQV82XzhfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gOCBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDYgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUKLSAgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzdfOF9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhbiA4Yml0IG9mZnNldCAob2Ygd2hpY2ggb25seSA3IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlIHRpbnkKLSAgZGF0YSBhcmVhIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1REQV83XzdfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA3IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzE2XzE2X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLgotQ09NTUVOVAotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9UREFfNF81X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgNSBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDQgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUgdGlueQotICBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzRfNF9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDQgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLCB3aXRoIHRoZQotICBiaXRzIHBsYWNlZCBub24tY29udGlnb3VzbHkgaW4gdGhlIGluc3RydWN0aW9uLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIsIHdpdGggdGhlCi0gIGJpdHMgcGxhY2VkIG5vbi1jb250aWdvdXNseSBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX0NBTExUXzZfN19PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDYgYml0IG9mZnNldCBmcm9tIHRoZSBjYWxsIHRhYmxlIGJhc2UgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLgotQ09NTUVOVAotCi1FTlVNCi0gIEJGRF9SRUxPQ19NTjEwMzAwXzMyX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAzMmJpdCBwY3JlbCByZWxvYyBmb3IgdGhlIG1uMTAzMDAsIG9mZnNldCBieSB0d28gYnl0ZXMgaW4gdGhlCi0gIGluc3RydWN0aW9uLgotRU5VTQotICBCRkRfUkVMT0NfTU4xMDMwMF8xNl9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMTZiaXQgcGNyZWwgcmVsb2MgZm9yIHRoZSBtbjEwMzAwLCBvZmZzZXQgYnkgdHdvIGJ5dGVzIGluIHRoZQotICBpbnN0cnVjdGlvbi4KLQotRU5VTQotICBCRkRfUkVMT0NfVElDMzBfTERQCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA4Yml0IERQIHJlbG9jIGZvciB0aGUgdG1zMzIwYzMwLCB3aGVyZSB0aGUgbW9zdAotICBzaWduaWZpY2FudCA4IGJpdHMgb2YgYSAyNCBiaXQgd29yZCBhcmUgcGxhY2VkIGludG8gdGhlIGxlYXN0Ci0gIHNpZ25pZmljYW50IDggYml0cyBvZiB0aGUgb3Bjb2RlLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzQ4Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSA0OCBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIDMyIGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzIwCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAzMiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIDIwIGJpdHMgc3BsaXQgdXAgaW50bwotICB0d28gc2VjdGlvbnMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzZfSU5fNAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDYgYml0IHdvcmQgb2Zmc2V0IGluCi0gIDQgYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfOF9JTl84Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGFuIDggYml0IGJ5dGUgb2Zmc2V0Ci0gIGludG8gOCBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfRlIzMF85X0lOXzgKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSA5IGJpdCBzaG9ydCBvZmZzZXQKLSAgaW50byA4IGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzEwX0lOXzgKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSAxMCBiaXQgd29yZCBvZmZzZXQKLSAgaW50byA4IGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzlfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSA5IGJpdCBwYyByZWxhdGl2ZQotICBzaG9ydCBvZmZzZXQgaW50byA4IGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzEyX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgMTIgYml0IHBjIHJlbGF0aXZlCi0gIHNob3J0IG9mZnNldCBpbnRvIDExIGJpdHMuCi0gIAotRU5VTQotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNAotRU5VTVgKLSAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyCi1FTlVNWAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMgotRU5VTVgKLSAgQkZEX1JFTE9DX01DT1JFX1BDUkVMXzMyCi1FTlVNWAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyCi1FTlVNWAotICBCRkRfUkVMT0NfTUNPUkVfUlZBCi1FTlVNRE9DCi0gIE1vdG9yb2xhIE1jb3JlIHJlbG9jYXRpb25zLgotICAKLUVOVU0KLSAgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi1FTlVNWAotICBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZCi1FTlVNRE9DCi0gIFRoZXNlIHR3byByZWxvY2F0aW9ucyBhcmUgdXNlZCBieSB0aGUgbGlua2VyIHRvIGRldGVybWluZSB3aGljaCBvZiAKLSAgdGhlIGVudHJpZXMgaW4gYSBDKysgdmlydHVhbCBmdW5jdGlvbiB0YWJsZSBhcmUgYWN0dWFsbHkgdXNlZC4gIFdoZW4KLSAgdGhlIC0tZ2Mtc2VjdGlvbnMgb3B0aW9uIGlzIGdpdmVuLCB0aGUgbGlua2VyIHdpbGwgemVybyBvdXQgdGhlIGVudHJpZXMKLSAgdGhhdCBhcmUgbm90IHVzZWQsIHNvIHRoYXQgdGhlIGNvZGUgZm9yIHRob3NlIGZ1bmN0aW9ucyBuZWVkIG5vdCBiZQotICBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LgotCi0gIFZUQUJMRV9JTkhFUklUIGlzIGEgemVyby1zcGFjZSByZWxvY2F0aW9uIHVzZWQgdG8gZGVzY3JpYmUgdG8gdGhlCi0gIGxpbmtlciB0aGUgaW5oZXJpdGVuY2UgdHJlZSBvZiBhIEMrKyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLiAgVGhlCi0gIHJlbG9jYXRpb24ncyBzeW1ib2wgc2hvdWxkIGJlIHRoZSBwYXJlbnQgY2xhc3MnIHZ0YWJsZSwgYW5kIHRoZQotICByZWxvY2F0aW9uIHNob3VsZCBiZSBsb2NhdGVkIGF0IHRoZSBjaGlsZCB2dGFibGUuCi0KLSAgVlRBQkxFX0VOVFJZIGlzIGEgemVyby1zcGFjZSByZWxvY2F0aW9uIHRoYXQgZGVzY3JpYmVzIHRoZSB1c2Ugb2YgYQotICB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGVudHJ5LiAgVGhlIHJlbG9jJ3Mgc3ltYm9sIHNob3VsZCByZWZlciB0byB0aGUKLSAgdGFibGUgb2YgdGhlIGNsYXNzIG1lbnRpb25lZCBpbiB0aGUgY29kZS4gIE9mZiBvZiB0aGF0IGJhc2UsIGFuIG9mZnNldAotICBkZXNjcmliZXMgdGhlIGVudHJ5IHRoYXQgaXMgYmVpbmcgdXNlZC4gIEZvciBSZWxhIGhvc3RzLCB0aGlzIG9mZnNldCAKLSAgaXMgc3RvcmVkIGluIHRoZSByZWxvYydzIGFkZGVuZC4gIEZvciBSZWwgaG9zdHMsIHdlIGFyZSBmb3JjZWQgdG8gcHV0Ci0gIHRoaXMgb2Zmc2V0IGluIHRoZSByZWxvYydzIHNlY3Rpb24gb2Zmc2V0LgotCi1FTkRTRU5VTQotICBCRkRfUkVMT0NfVU5VU0VECi1DT0RFX0ZSQUdNRU5UCi0uCi0udHlwZWRlZiBlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlOwotKi8KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotU1lOT1BTSVMKLQlyZWxvY19ob3d0b190eXBlICoKLQliZmRfcmVsb2NfdHlwZV9sb29rdXAgKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIHBvaW50ZXIgdG8gYSBob3d0byBzdHJ1Y3R1cmUgd2hpY2gsIHdoZW4KLQlpbnZva2VkLCB3aWxsIHBlcmZvcm0gdGhlIHJlbG9jYXRpb24gQHZhcntjb2RlfSBvbiBkYXRhIGZyb20gdGhlCi0JYXJjaGl0ZWN0dXJlIG5vdGVkLgotCi0qLwotCi0KLXJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICByZXR1cm4gQkZEX1NFTkQgKGFiZmQsIHJlbG9jX3R5cGVfbG9va3VwLCAoYWJmZCwgY29kZSkpOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBiZmRfaG93dG9fMzIgPQotSE9XVE8gKDAsIDAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiVlJUMzIiLCBmYWxzZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgdHJ1ZSk7Ci0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAKLQotU1lOT1BTSVMKLQlyZWxvY19ob3d0b190eXBlICpiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotCShiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgY29kZSk7Ci0KLURFU0NSSVBUSU9OCi0JUHJvdmlkZXMgYSBkZWZhdWx0IHJlbG9jYXRpb24gbG9va3VwIHJvdXRpbmUgZm9yIGFueSBhcmNoaXRlY3R1cmUuCi0KLQotKi8KLQotcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgLyogVGhlIHR5cGUgb2YgcmVsb2MgdXNlZCBpbiBhIGN0b3IsIHdoaWNoIHdpbGwgYmUgYXMgd2lkZSBhcyB0aGUKLQkgYWRkcmVzcyAtIHNvIGVpdGhlciBhIDY0LCAzMiwgb3IgMTYgYml0dGVyLiAgKi8KLSAgICAgIHN3aXRjaCAoYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5iaXRzX3Blcl9hZGRyZXNzKQotCXsKLQljYXNlIDY0OgotCSAgQkZEX0ZBSUwgKCk7Ci0JY2FzZSAzMjoKLQkgIHJldHVybiAmYmZkX2hvd3RvXzMyOwotCWNhc2UgMTY6Ci0JICBCRkRfRkFJTCAoKTsKLQlkZWZhdWx0OgotCSAgQkZEX0ZBSUwgKCk7Ci0JfQotICAgIGRlZmF1bHQ6Ci0gICAgICBCRkRfRkFJTCAoKTsKLSAgICB9Ci0gIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZQotCi1TWU5PUFNJUwotCWNvbnN0IGNoYXIgKmJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSk7Ci0KLURFU0NSSVBUSU9OCi0JUHJvdmlkZXMgYSBwcmludGFibGUgbmFtZSBmb3IgdGhlIHN1cHBsaWVkIHJlbG9jYXRpb24gY29kZS4KLQlVc2VmdWwgbWFpbmx5IGZvciBwcmludGluZyBlcnJvciBtZXNzYWdlcy4KLSovCi0KLWNvbnN0IGNoYXIgKgotYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpCi0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBpZiAoY29kZSA+IEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBiZmRfcmVsb2NfY29kZV9yZWFsX25hbWVzWyhpbnQpY29kZV07Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLQkgKGJmZCAqYWJmZCwKLQkgIGFzZWN0aW9uICpzZWN0aW9uLAotCSAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgIGJvb2xlYW4gKik7Ci0KLURFU0NSSVBUSU9OCi0JUHJvdmlkZXMgZGVmYXVsdCBoYW5kbGluZyBmb3IgcmVsYXhpbmcgZm9yIGJhY2sgZW5kcyB3aGljaAotCWRvbid0IGRvIHJlbGF4aW5nIC0tIGkuZS4sIGRvZXMgbm90aGluZy4KLSovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgbGlua19pbmZvLCBhZ2FpbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gICphZ2FpbiA9IGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0JIChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKik7Ci0KLURFU0NSSVBUSU9OCi0JUHJvdmlkZXMgZGVmYXVsdCBoYW5kbGluZyBmb3IgcmVsYXhpbmcgZm9yIGJhY2sgZW5kcyB3aGljaAotCWRvbid0IGRvIHNlY3Rpb24gZ2MgLS0gaS5lLiwgZG9lcyBub3RoaW5nLgotKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1iZmRfZ2VuZXJpY19nY19zZWN0aW9ucyAoYWJmZCwgbGlua19pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLQotU1lOT1BTSVMKLQliZmRfYnl0ZSAqCi0JICAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChiZmQgKmFiZmQsCi0JICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotCSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyLAotCSAgICAgYmZkX2J5dGUgKmRhdGEsCi0JICAgICBib29sZWFuIHJlbG9jYXRlYWJsZSwKLQkgICAgIGFzeW1ib2wgKipzeW1ib2xzKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBkZWZhdWx0IGhhbmRsaW5nIG9mIHJlbG9jYXRpb24gZWZmb3J0IGZvciBiYWNrIGVuZHMKLQl3aGljaCBjYW4ndCBiZSBib3RoZXJlZCB0byBkbyBpdCBlZmZpY2llbnRseS4KLQotKi8KLQotYmZkX2J5dGUgKgotYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJCSAgICByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICAvKiBHZXQgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBzdHVmZiAqLwotICBiZmQgKmlucHV0X2JmZCA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0gIGxvbmcgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0gIGFyZWxlbnQgKipyZWxvY192ZWN0b3IgPSBOVUxMOwotICBsb25nIHJlbG9jX2NvdW50OwotCi0gIGlmIChyZWxvY19zaXplIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAoKHNpemVfdCkgcmVsb2Nfc2l6ZSk7Ci0gIGlmIChyZWxvY192ZWN0b3IgPT0gTlVMTCAmJiByZWxvY19zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogcmVhZCBpbiB0aGUgc2VjdGlvbiAqLwotICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLAotCQkJCSBpbnB1dF9zZWN0aW9uLAotCQkJCSAoUFRSKSBkYXRhLAotCQkJCSAwLAotCQkJCSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdlJ3JlIG5vdCByZWxheGluZyB0aGUgc2VjdGlvbiwgc28ganVzdCBjb3B5IHRoZSBzaXplIGluZm8gKi8KLSAgaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplOwotICBpbnB1dF9zZWN0aW9uLT5yZWxvY19kb25lID0gdHJ1ZTsKLQotICByZWxvY19jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwKLQkJCQkJaW5wdXRfc2VjdGlvbiwKLQkJCQkJcmVsb2NfdmVjdG9yLAotCQkJCQlzeW1ib2xzKTsKLSAgaWYgKHJlbG9jX2NvdW50IDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAocmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipwYXJlbnQ7Ci0gICAgICBmb3IgKHBhcmVudCA9IHJlbG9jX3ZlY3RvcjsgKnBhcmVudCAhPSAoYXJlbGVudCAqKSBOVUxMOwotCSAgIHBhcmVudCsrKQotCXsKLQkgIGNoYXIgKmVycm9yX21lc3NhZ2UgPSAoY2hhciAqKSBOVUxMOwotCSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHIgPQotCSAgICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsCi0JCQkJICAgICpwYXJlbnQsCi0JCQkJICAgIChQVFIpIGRhdGEsCi0JCQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgIHJlbG9jYXRlYWJsZSA/IGFiZmQgOiAoYmZkICopIE5VTEwsCi0JCQkJICAgICZlcnJvcl9tZXNzYWdlKTsKLQotCSAgaWYgKHJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpvcyA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0JICAgICAgLyogQSBwYXJ0aWFsIGxpbmssIHNvIGtlZXAgdGhlIHJlbG9jcyAqLwotCSAgICAgIG9zLT5vcmVsb2NhdGlvbltvcy0+cmVsb2NfY291bnRdID0gKnBhcmVudDsKLQkgICAgICBvcy0+cmVsb2NfY291bnQrKzsKLQkgICAgfQotCi0JICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKHIpCi0JCXsKLQkJY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCQkgIGlmICghKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCQkobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqKCpwYXJlbnQpLT5zeW1fcHRyX3B0ciksCi0JCQkgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoKnBhcmVudCktPmFkZHJlc3MpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JCSAgQkZEX0FTU0VSVCAoZXJyb3JfbWVzc2FnZSAhPSAoY2hhciAqKSBOVUxMKTsKLQkJICBpZiAoISgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCQkobGlua19pbmZvLCBlcnJvcl9tZXNzYWdlLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgKCpwYXJlbnQpLT5hZGRyZXNzKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCQkobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqKCpwYXJlbnQpLT5zeW1fcHRyX3B0ciksCi0JCQkgKCpwYXJlbnQpLT5ob3d0by0+bmFtZSwgKCpwYXJlbnQpLT5hZGRlbmQsCi0JCQkgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoKnBhcmVudCktPmFkZHJlc3MpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCQlkZWZhdWx0OgotCQkgIGFib3J0ICgpOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gZGF0YTsKLQotZXJyb3JfcmV0dXJuOgotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9iZmQvcmVsb2MxNi5jIGIvYmZkL3JlbG9jMTYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3OTUyZS4uMDAwMDAwMAotLS0gYS9iZmQvcmVsb2MxNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qIDggYW5kIDE2IGJpdCBDT0ZGIHJlbG9jYXRpb24gZnVuY3Rpb25zLCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogCi1Nb3N0IG9mIHRoaXMgaGFja2VkIGJ5ICBTdGV2ZSBDaGFtYmVybGFpbiwKLQkJCXNhY0BjeWdudXMuY29tIAotKi8KLQotLyogVGhlc2Ugcm91dGluZXMgYXJlIHVzZWQgYnkgY29mZi1oODMwMCBhbmQgY29mZi16OGsgdG8gZG8KLSAgIHJlbG9jYXRpb24uCi0KLSAgIEZJWE1FOiBUaGlzIGNvZGUgc2hvdWxkIGJlIHJld3JpdHRlbiB0byBzdXBwb3J0IHRoZSBuZXcgQ09GRgotICAgbGlua2VyLiAgQmFzaWNhbGx5LCB0aGV5IG5lZWQgdG8gZGVhbCB3aXRoIENPRkYgcmVsb2NzIHJhdGhlciB0aGFuCi0gICBCRkQgZ2VuZXJpYyByZWxvY3MuICBUaGV5IHNob3VsZCBzdG9yZSB0aGUgcmVsb2NzIGluIHNvbWUgbG9jYXRpb24KLSAgIHdoZXJlIGNvZmZfbGlua19pbnB1dF9iZmQgY2FuIGZpbmQgdGhlbSAoYW5kIGNvZmZfbGlua19pbnB1dF9iZmQKLSAgIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHVzZSB0aGlzIGxvY2F0aW9uIHJhdGhlciB0aGFuIHJlcmVhZGluZyB0aGUKLSAgIGZpbGUpICh1bmxlc3MgaW5mby0+a2VlcF9tZW1vcnkgaXMgZmFsc2UsIGluIHdoaWNoIGNhc2UgdGhleSBzaG91bGQKLSAgIGZyZWUgdXAgdGhlIHJlbG9jcyBhZnRlciBkZWFsaW5nIHdpdGggdGhlbSkuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdlbmxpbmsuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1iZmRfdm1hCi1iZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbikKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotewotICBiZmRfdm1hIHZhbHVlOwotICBhc3ltYm9sICpzeW1ib2wgPSAqKHJlbG9jLT5zeW1fcHRyX3B0cik7Ci0gIC8qIEEgc3ltYm9sIGhvbGRzIGEgcG9pbnRlciB0byBhIHNlY3Rpb24sIGFuZCBhbiBvZmZzZXQgZnJvbSB0aGUKLSAgICAgYmFzZSBvZiB0aGUgc2VjdGlvbi4gIFRvIHJlbG9jYXRlLCB3ZSBmaW5kIHdoZXJlIHRoZSBzZWN0aW9uIHdpbGwKLSAgICAgbGl2ZSBpbiB0aGUgb3V0cHV0IGFuZCBhZGQgdGhhdCBpbiAqLwotCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQgaW4gdGhpcyBCRkQuICBMb29rIGl0IHVwIGluIHRoZQotCSBnbG9iYWwgbGlua2VyIGhhc2ggdGFibGUuICBGSVhNRTogVGhpcyBzaG91bGQgYmUgY2hhbmdlZCB3aGVuCi0JIHdlIGNvbnZlcnQgdGhpcyBzdHVmZiB0byB1c2UgYSBzcGVjaWZpYyBmaW5hbF9saW5rIGZ1bmN0aW9uCi0JIGFuZCBjaGFuZ2UgdGhlIGludGVyZmFjZSB0byBiZmRfcmVsYXhfc2VjdGlvbiB0byBub3QgcmVxdWlyZQotCSB0aGUgZ2VuZXJpYyBzeW1ib2xzLiAgKi8KLSAgICAgIGggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChpbnB1dF9zZWN0aW9uLT5vd25lciwgbGlua19pbmZvLAotCQkJCQliZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAotCQkJCQlmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl2YWx1ZSA9IChoLT51LmRlZi52YWx1ZQotCQkgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgZWxzZSBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCXZhbHVlID0gaC0+dS5jLnNpemU7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAotCQkgIGlucHV0X3NlY3Rpb24tPm93bmVyLCBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQkgIHZhbHVlID0gMDsKLQl9Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIHZhbHVlID0gc3ltYm9sLT52YWx1ZSArCi0Jc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsKLQkgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgICB9Ci0gIAotICAvKiBBZGQgdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgcmVsb2NhdGlvbiAqLwotICB2YWx1ZSArPSByZWxvYy0+YWRkZW5kOwotICAKLSAgcmV0dXJuIHZhbHVlOwotfQotCi12b2lkCi1iZmRfcGVyZm9ybV9zbGlwKGFiZmQsIHNsaXAsIGlucHV0X3NlY3Rpb24sIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBzbGlwOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgYXN5bWJvbCAqKnM7Ci0KLSAgcyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgQkZEX0FTU0VSVCAocyAhPSAoYXN5bWJvbCAqKikgTlVMTCk7Ci0KLSAgLyogRmluZCBhbGwgc3ltYm9scyBwYXN0IHRoaXMgcG9pbnQsIGFuZCBtYWtlIHRoZW0ga25vdwotICAgICB3aGF0J3MgaGFwcGVuZWQgKi8KLSAgd2hpbGUgKCpzKSAKLSAgICB7Ci0gICAgICBhc3ltYm9sICpwID0gKnM7Ci0gICAgICBpZiAocC0+c2VjdGlvbiA9PSBpbnB1dF9zZWN0aW9uKSAKLQl7Ci0JICAvKiBUaGlzIHdhcyBwb2ludGluZyBpbnRvIHRoaXMgc2VjdGlvbiwgc28gbWFuZ2xlIGl0ICovCi0JICBpZiAocC0+dmFsdWUgPiB2YWx1ZSkKLQkgICAgewotCSAgICAgIHAtPnZhbHVlIC09IHNsaXA7Ci0JICAgICAgaWYgKHAtPnVkYXRhLnAgIT0gTlVMTCkKLQkJewotCQkgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCQkgIGggPSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIHAtPnVkYXRhLnA7Ci0JCSAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0JCSAgaC0+cm9vdC51LmRlZi52YWx1ZSAtPSBzbGlwOwotCQkgIEJGRF9BU1NFUlQgKGgtPnJvb3QudS5kZWYudmFsdWUgPT0gcC0+dmFsdWUpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBzKys7Ci0gICAgfSAgICAKLX0KLQotYm9vbGVhbiAKLWJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgaSwgbGlua19pbmZvLCBhZ2FpbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqaTsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gIC8qIEdldCBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIHN0dWZmICovCi0gIGJmZCAqaW5wdXRfYmZkID0gaS0+b3duZXI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gaTsKLSAgaW50ICpzaHJpbmtzOwotICBpbnQgc2hyaW5rID0gMDsKLSAgbG9uZyByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKLSAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7Ci0gIGxvbmcgcmVsb2NfY291bnQ7Ci0KLSAgLyogV2Ugb25seSBkbyBnbG9iYWwgcmVsYXhhdGlvbiBvbmNlLiAgSXQgaXMgbm90IHNhZmUgdG8gZG8gaXQgbXVsdGlwbGUKLSAgICAgdGltZXMgKHNlZSBkaXNjdXNzaW9uIG9mIHRoZSAic2hyaW5rcyIgYXJyYXkgYmVsb3cpLiAgKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gIGlmICghcmVsb2NfdmVjdG9yICYmIHJlbG9jX3NpemUgPiAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHZXQgdGhlIHJlbG9jcyBhbmQgdGhpbmsgYWJvdXQgdGhlbSAqLwotICByZWxvY19jb3VudCA9Ci0gICAgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvY192ZWN0b3IsCi0JCQkgICAgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGlucHV0X2JmZCkpOwotICBpZiAocmVsb2NfY291bnQgPCAwKQotICAgIHsKLSAgICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSByZWxvYzE2LmMgYW5kIHJlbGF0ZWQgcmVsYXhpbmcgY29kZSBpcyB2ZXJ5IHNpbXBsZSwgdGhlIHByaWNlCi0gICAgIGZvciB0aGF0IHNpbXBsaWNpdHkgaXMgd2UgY2FuIG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uIG9uY2UgZm9yCi0gICAgIGVhY2ggc2VjdGlvbi4KLQotICAgICBTbywgdG8gZ2V0IHRoZSBiZXN0IHJlc3VsdHMgd2l0aGluIHRoYXQgbGltaXRhdGlvbiwgd2UgZG8gbXVsdGlwbGUKLSAgICAgcmVsYXhpbmcgcGFzc2VzIG92ZXIgZWFjaCBzZWN0aW9uIGhlcmUuICBUaGF0IGludm9sdmVzIGtlZXBpbmcgdHJhY2sKLSAgICAgb2YgdGhlICJzaHJpbmsiIGF0IGVhY2ggcmVsb2MgaW4gdGhlIHNlY3Rpb24uICBUaGlzIGFsbG93cyB1cyB0bwotICAgICBhY2N1cmF0ZWx5IGRldGVybWluZSB0aGUgcmVsYXRpdmUgbG9jYXRpb24gb2YgdHdvIHJlbG9jcyB3aXRoaW4KLSAgICAgdGhpcyBzZWN0aW9uLgotCi0gICAgIEluIHRoZW9yeSwgaWYgd2Uga2VwdCB0aGUgInNocmlua3MiIGFycmF5IGZvciBlYWNoIHNlY3Rpb24gZm9yIHRoZQotICAgICBlbnRpcmUgbGluaywgd2UgY291bGQgdXNlIHRoZSBnZW5lcmljIHJlbGF4aW5nIGNvZGUgaW4gdGhlIGxpbmtlcgotICAgICBhbmQgZ2V0IGJldHRlciByZXN1bHRzLCBwYXJ0aWN1bGFybHkgZm9yIGpzci0+YnNyIGFuZCAyNC0+MTYgYml0Ci0gICAgIG1lbW9yeSByZWZlcmVuY2UgcmVsYXhhdGlvbnMuICAqLwotICAgICAKLSAgaWYgKHJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBpbnQgYW5vdGhlcl9wYXNzID0gMDsKLQotICAgICAgLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIHNocmlua3MgYXJyYXkgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICBzaHJpbmtzID0gKGludCAqKSBiZmRfbWFsbG9jIChyZWxvY19jb3VudCAqIHNpemVvZiAoaW50KSk7Ci0gICAgICBtZW1zZXQgKHNocmlua3MsIDAsIHJlbG9jX2NvdW50ICogc2l6ZW9mIChpbnQpKTsKLQotICAgICAgLyogTG9vcCB1bnRpbCBub3RoaW5nIGNoYW5nZXMgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgICAgIGRvIHsKLQlhcmVsZW50ICoqcGFyZW50OwotCXVuc2lnbmVkIGludCBpOwotCWxvbmcgajsKLQotCWFub3RoZXJfcGFzcyA9IDA7Ci0KLQlmb3IgKGkgPSAwLCBwYXJlbnQgPSByZWxvY192ZWN0b3I7ICpwYXJlbnQ7IHBhcmVudCsrLCBpKyspIAotCSAgewotCSAgICAvKiBMZXQgdGhlIHRhcmdldC9tYWNoaW5lIGRlcGVuZGVudCBjb2RlIGV4YW1pbmUgZWFjaCByZWxvYwotCSAgICAgICBpbiB0aGlzIHNlY3Rpb24gYW5kIGF0dGVtcHQgdG8gc2hyaW5rIGl0LiAgKi8KLQkgICAgc2hyaW5rID0gYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgKnBhcmVudCwKLQkJCQkJCXNocmlua3NbaV0sIGxpbmtfaW5mbyk7Ci0KLQkgICAgLyogSWYgaXQgc2hydW5rLCBub3RlIGl0IGluIHRoZSBzaHJpbmtzIGFycmF5IGFuZCBzZXQgdXAgZm9yCi0JICAgICAgIGFub3RoZXIgcGFzcy4gICovCi0JICAgIGlmIChzaHJpbmsgIT0gc2hyaW5rc1tpXSkKLQkgICAgICB7Ci0JICAgICAgICBhbm90aGVyX3Bhc3MgPSAxOwotCQlmb3IgKGogPSBpICsgMTsgaiA8IHJlbG9jX2NvdW50OyBqKyspCi0JCSAgc2hyaW5rc1tqXSArPSBzaHJpbmsgLSBzaHJpbmtzW2ldOwotCSAgICAgIH0KLQkgIH0KLSAgCi0gICAgICB9IHdoaWxlIChhbm90aGVyX3Bhc3MpOwotCi0gICAgICBmcmVlKChjaGFyICopc2hyaW5rcyk7Ci0gICAgfQotCi0gIGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSAtPSBzaHJpbms7ICAKLSAgZnJlZSgoY2hhciAqKXJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiB0cnVlOwotfQotCi1iZmRfYnl0ZSAqCi1iZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyhpbl9hYmZkLAotCQkJCQkJbGlua19pbmZvLAotCQkJCQkJbGlua19vcmRlciwKLQkJCQkJCWRhdGEsCi0JCQkJCQlyZWxvY2F0ZWFibGUsCi0JCQkJCQlzeW1ib2xzKQotICAgICBiZmQgKmluX2FiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KLSAgYmZkICppbnB1dF9iZmQgPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgbG9uZyByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKLSAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvcjsKLSAgbG9uZyByZWxvY19jb3VudDsKLQotICBpZiAocmVsb2Nfc2l6ZSA8IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogSWYgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGRvbid0IGJvdGhlciB0byByZWxheC4gICovCi0gIGlmIChyZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAoaW5fYWJmZCwgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGxpbmtfb3JkZXIsCi0JCQkJCQkgICAgICAgZGF0YSwgcmVsb2NhdGVhYmxlLAotCQkJCQkJICAgICAgIHN5bWJvbHMpOwotCi0gIC8qIHJlYWQgaW4gdGhlIHNlY3Rpb24gKi8KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKGlucHV0X2JmZCwKLQkJCQkgaW5wdXRfc2VjdGlvbiwKLQkJCQkgZGF0YSwKLQkJCQkgMCwKLQkJCQkgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKSkKLSAgICByZXR1cm4gTlVMTDsKLSAgCi0gIAotICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYygoc2l6ZV90KSByZWxvY19zaXplKTsKLSAgaWYgKCFyZWxvY192ZWN0b3IgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotICAKLSAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsIAotCQkJCQlpbnB1dF9zZWN0aW9uLAotCQkJCQlyZWxvY192ZWN0b3IsCi0JCQkJCXN5bWJvbHMpOwotICBpZiAocmVsb2NfY291bnQgPCAwKQotICAgIHsKLSAgICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgCi0gIGlmIChyZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgYXJlbGVudCAqKnBhcmVudCA9IHJlbG9jX3ZlY3RvcjsKLSAgICAgIGFyZWxlbnQgKnJlbG9jIDsKLSAgICAgIHVuc2lnbmVkIGludCBkc3RfYWRkcmVzcyA9IDA7Ci0gICAgICB1bnNpZ25lZCBpbnQgc3JjX2FkZHJlc3MgPSAwOwotICAgICAgdW5zaWduZWQgaW50IHJ1bjsKLSAgICAgIHVuc2lnbmVkIGludCBpZHg7Ci0gICAgCi0gICAgICAvKiBGaW5kIGhvdyBsb25nIGEgcnVuIHdlIGNhbiBkbyAqLwotICAgICAgd2hpbGUgKGRzdF9hZGRyZXNzIDwgbGlua19vcmRlci0+c2l6ZSkgCi0JewotCSAgcmVsb2MgPSAqcGFyZW50OwotCSAgaWYgKHJlbG9jKSAKLQkgICAgewotCSAgICAgIC8qIE5vdGUgdGhhdCB0aGUgcmVsYXhpbmcgZGlkbid0IHRpZSB1cCB0aGUgYWRkcmVzc2VzIGluIHRoZQotCQkgcmVsb2NhdGlvbiwgc28gd2UgdXNlIHRoZSBvcmlnaW5hbCBhZGRyZXNzIHRvIHdvcmsgb3V0IHRoZQotCQkgcnVuIG9mIG5vbi1yZWxvY2F0ZWQgZGF0YSAqLwotCSAgICAgIHJ1biA9IHJlbG9jLT5hZGRyZXNzIC0gc3JjX2FkZHJlc3M7Ci0JICAgICAgcGFyZW50Kys7Ci0JICAgIH0KLQkgIGVsc2UgCi0JICAgIHsKLQkgICAgICBydW4gPSBsaW5rX29yZGVyLT5zaXplIC0gZHN0X2FkZHJlc3M7Ci0JICAgIH0KLQkgIC8qIENvcHkgdGhlIGJ5dGVzICovCi0JICBmb3IgKGlkeCA9IDA7IGlkeCA8IHJ1bjsgaWR4KyspCi0JICAgIHsKLQkgICAgICBkYXRhW2RzdF9hZGRyZXNzKytdID0gZGF0YVtzcmNfYWRkcmVzcysrXTsKLQkgICAgfQotICAgIAotCSAgLyogTm93IGRvIHRoZSByZWxvY2F0aW9uICovCi0gICAgCi0JICBpZiAocmVsb2MpIAotCSAgICB7Ci0JICAgICAgYmZkX2NvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyAoaW5wdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCSAgICByZWxvYywgZGF0YSwgJnNyY19hZGRyZXNzLAotCQkJCQkgICAgJmRzdF9hZGRyZXNzKTsKLQkgICAgfSAgICAKLQl9Ci0gICAgfQotICBmcmVlKChjaGFyICopcmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIGRhdGE7Ci19Ci0KZGlmZiAtLWdpdCBhL2JmZC9yaXNjaXguYyBiL2JmZC9yaXNjaXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVhYjQ5YS4uMDAwMDAwMAotLS0gYS9iZmQvcmlzY2l4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBSSVNDIGlYIChBY29ybiwgYXJtKSBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0gICAKLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBSSVNDIGlYIG92ZXJsb2FkcyB0aGUgTUFHSUMgZmllbGQgdG8gaW5kaWNhdGUgbW9yZSB0aGFuIGp1c3QgdGhlIHVzdWFsCi0gICBbWk5PXU1BR0lDIHZhbHVlcy4gIEFsc28gaW5jbHVkZWQgYXJlIHNxdWVlemluZyBpbmZvcm1hdGlvbiBhbmQKLSAgIHNoYXJlZCBsaWJyYXJ5IHVzYWdlLiAgKi8KLQotLyogVGhlIGZvbGxvd2luZyBjb21lIGZyb20gdGhlIG1hbiBwYWdlLiAgKi8KLSNkZWZpbmUgU0hMSUJMRU4gNjAKLQotI2RlZmluZSBNRl9JTVBVUkUgICAgICAgMDAyMDAKLSNkZWZpbmUgTUZfU1FVRUVaRUQgICAgIDAxMDAwCi0jZGVmaW5lIE1GX1VTRVNfU0wgICAgICAwMjAwMAotI2RlZmluZSBNRl9JU19TTCAgICAgICAgMDQwMDAKLQotLyogQ29tbW9uIGNvbWJpbmF0aW9ucy4gICovCi0jZGVmaW5lIElNQUdJQyAgICAgICAgICAoTUZfSU1QVVJFfFpNQUdJQykgICAgICAvKiBEZW1hbmQgbG9hZCAoaW1wdXJlIHRleHQpICovCi0jZGVmaW5lIFNQT01BR0lDICAgICAgICAoTUZfVVNFU19TTHxPTUFHSUMpICAgICAvKiBPTUFHSUMgd2l0aCBsYXJnZSBoZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtLSBtYXkgY29udGFpbiBhIHJlZiB0byBhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhcmVkIGxpYiByZXF1aXJlZCBieSB0aGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYmplY3QuICovCi0jZGVmaW5lIFNMT01BR0lDICAgICAgICAoTUZfSVNfU0x8T01BR0lDKSAvKiBBIHJlZmVyZW5jZSB0byBhIHNoYXJlZCBsaWJyYXJ5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgdGV4dCBwb3J0aW9uIG9mIHRoZSBvYmplY3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRhaW5zICJvdmVyZmxvdyB0ZXh0IiBmcm9tICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgc2hhcmVkIGxpYnJhcnkgdG8gYmUgbGlua2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiB3aXRoIGFuIG9iamVjdCAqLwotI2RlZmluZSBRTUFHSUMgICAgICAgICAgKE1GX1NRVUVFWkVEfFpNQUdJQykgICAgLyogU3FlZXplZCBkZW1hbmQgcGFnZWQuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT1RFOiBUaGlzIGludGVycHJldGF0aW9uIG9mICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRTUFHSUMgc2VlbXMgdG8gYmUgYXQgdmFyaWFuY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdpdGggdGhhdCB1c2VkIG9uIG90aGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcmNoaXRlY3R1cmVzLiAqLwotI2RlZmluZSBTUFpNQUdJQyAgICAgICAgKE1GX1VTRVNfU0x8Wk1BR0lDKSAgICAgLyogcHJvZ3JhbSB3aGljaCB1c2VzIHNsICovCi0jZGVmaW5lIFNQUU1BR0lDICAgICAgICAoTUZfVVNFU19TTHxRTUFHSUMpICAgICAvKiBzcWVlemVkIGRpdHRvICovCi0jZGVmaW5lIFNMWk1BR0lDICAgICAgICAoTUZfSVNfU0x8Wk1BR0lDKSAgICAgICAvKiBzaGFyZWQgbGliIHBhcnQgb2YgcHJvZyAqLwotI2RlZmluZSBTTFBaTUFHSUMgICAgICAgKE1GX1VTRVNfU0x8U0xaTUFHSUMpICAgLyogc2wgd2hpY2ggdXNlcyBhbm90aGVyICovCi0KLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpICgoeCkuYV9pbmZvICYgTUZfVVNFU19TTCkKLQotLyogT25seSBhIHB1cmUgT01BR0lDIGZpbGUgaGFzIHRoZSBtaW5pbWFsIGhlYWRlciAqLwotI2RlZmluZSBOX1RYVE9GRih4KSAgICAgICAgICAgICAgICAgICAgIFwKLSAoKHgpLmFfaW5mbyA9PSBPTUFHSUMgPyAzMiAgICAgICAgICAgICBcCi0gIDogKE5fTUFHSUMoeCkgPT0gWk1BR0lDKSA/IFRBUkdFVF9QQUdFX1NJWkUgIFwKLSAgOiA5OTkpCi0KLSNkZWZpbmUgTl9UWFRBRERSKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoTl9NQUdJQyh4KSAhPSBaTUFHSUMgPyAwIC8qIG9iamVjdCBmaWxlIG9yIE5NQUdJQyAqLyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAvKiBQcm9ncmFtcyB3aXRoIHNoYXJlZCBsaWJzIGFyZSBsb2FkZWQgYXQgdGhlIGZpcnN0IHBhZ2UgYWZ0ZXIgYWxsIHRoZSAgIFwKLSAgICAgIHRleHQgc2VnbWVudHMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IHByb2dyYW1zLiAgV2l0aG91dCBsb29raW5nIHRoaXMgICAgXAotICAgICAgdXAgd2UgY2FuJ3Qga25vdyBleGFjdGx5IHdoYXQgdGhlIGFkZHJlc3Mgd2lsbCBiZS4gIEEgcmVhc29uYWJsZSBndWVzcyBcCi0gICAgICBpcyB0aGF0IGFfZW50cnkgd2lsbCBiZSBpbiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgZXhlY3V0YWJsZS4gICovICAgICAgIFwKLSAgIDogTl9TSEFSRURfTElCKHgpID8gKCh4KS5hX2VudHJ5ICYgfihUQVJHRVRfUEFHRV9TSVpFIC0gMSkpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIDogVEVYVF9TVEFSVF9BRERSKQotCi0jZGVmaW5lIE5fU1lNT0ZGKHgpIFwKLSAgKE5fVFhUT0ZGICh4KSArICh4KS5hX3RleHQgKyAoeCkuYV9kYXRhICsgKHgpLmFfdHJzaXplICsgKHgpLmFfZHJzaXplKQotCi0jZGVmaW5lIE5fU1RST0ZGKHgpIChOX1NZTU9GRiAoeCkgKyAoeCkuYV9zeW1zKQotCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAzMjc2OAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDMyNzY4Ci0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9hcm0KLQotI2RlZmluZSBNWShPUCkgQ0FUKHJpc2NpeF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXJpc2NpeCIKLSNkZWZpbmUgTl9CQURNQUcoeCkgKCgoKHgpLmFfaW5mbyAmIH4wMDcyMDApICE9IFpNQUdJQykgJiYgXAotICAgICAgICAgICAgICAgICAgICAgKCgoeCkuYV9pbmZvICYgfjAwNjAwMCkgIT0gT01BR0lDKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAoKHgpLmFfaW5mbyAhPSBOTUFHSUMpKQotI2RlZmluZSBOX01BR0lDKHgpICgoeCkuYV9pbmZvICYgfjA3MjAwKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCkJCQkJCSAgIFwKLSAgewkJCQkJCQkJCSAgIFwKLSAgICBiZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsgLyogZHVtbXkgdmFycyAqLwkJCQkgICBcCi0gICAgZmlsZV9wdHIgdGV4dF9lbmQ7CQkJCQkJCSAgIFwKLSAgICBpZiAoYWRhdGEoYWJmZCkubWFnaWMgPT0gdW5kZWNpZGVkX21hZ2ljKQkJCQkgICBcCi0gICAgICBOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKTsJICAgXAotICAgIAkJCQkJCQkJCSAgIFwKLSAgICBleGVjcC0+YV9zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKiBFWFRFUk5BTF9OTElTVF9TSVpFOwkgICBcCi0gICAgZXhlY3AtPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwkJCSAgIFwKLSAgICAJCQkJCQkJCQkgICBcCi0gICAgZXhlY3AtPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCQkgICBcCi0JCSAgICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwkJCSAgIFwKLSAgICBleGVjcC0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoJCSAgIFwKLQkJICAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CQkJICAgXAotICAgIE5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX291dCkgKGFiZmQsIGV4ZWNwLCAmZXhlY19ieXRlcyk7CQkgICBcCi0gICAgCQkJCQkJCQkJICAgXAotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkgcmV0dXJuIGZhbHNlOwkgICBcCi0gICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkJCSAgIFwKLQkhPSBFWEVDX0JZVEVTX1NJWkUpCQkJCQkJICAgXAotICAgICAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICBcCi0gICAgLyogTm93IHdyaXRlIG91dCByZWxvYyBpbmZvLCBmb2xsb3dlZCBieSBzeW1zIGFuZCBzdHJpbmdzICovCSAgIFwKLQkJCQkJCQkJCSAgIFwKLSAgICBpZiAoYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSAhPSAoYXN5bWJvbCAqKikgTlVMTAkJCSAgIFwKLQkmJiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKQkJCQkgICBcCi0gICAgICB7CQkJCQkJCQkJICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1NZTU9GRigqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApICBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKLQkJCQkJCQkJCSAgIFwKLQlpZiAoISBOQU1FKGFvdXQsd3JpdGVfc3ltcykoYWJmZCkpIHJldHVybiBmYWxzZTsJCSAgIFwKLQkJCQkJCQkJCSAgIFwKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9UUkVMT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICBcCi0JCQkJCQkJCQkgICBcCi0JaWYgKCEgcmlzY2l4X3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKQkgICBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9EUkVMT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICBcCi0JCQkJCQkJCQkgICBcCi0JaWYgKCFOQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSkpCSAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgXAotICAgICAgfQkJCQkJCQkJCSAgIFwKLSAgfQotCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXJpc2NpeF9maXhfcGNyZWxfMjZfZG9uZSBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKLQkJCQkgIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXJpc2NpeF9maXhfcGNyZWxfMjYgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCQkgICAgIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJpc2NpeF9zdGRfcmVsb2NfaG93dG9bXSA9IHsKLSAgLyogdHlwZSAgICAgICAgICAgICAgcnMgc2l6ZSBic3ogIHBjcmVsIGJpdHBvcyBvdnJmICAgICAgICAgICAgICAgICAgICAgc2YgbmFtZSAgICAgcGFydF9pbnBsIHJlYWRtYXNrICBzZXRtYXNrICAgIHBjZG9uZSAqLwotICBIT1dUTyggMCwgICAgICAgICAgICAgIDAsICAwLCAgIDgsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiOCIsICAgICAgICB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oIDEsICAgICAgICAgICAgICAwLCAgMSwgICAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjE2IiwgICAgICAgIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyggMiwgICAgICAgICAgICAgIDAsICAyLCAgIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMzIiLCAgICAgICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKCAzLCAgICAgICAgICAgICAgMiwgIDMsICAgMjYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIHJpc2NpeF9maXhfcGNyZWxfMjYgLCAiQVJNMjYiLCAgICAgIHRydWUsIDB4MDBmZmZmZmYsMHgwMGZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyggNCwgICAgICAgICAgICAgIDAsICAwLCAgIDgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDgiLCAgICAgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCB0cnVlKSwKLSAgSE9XVE8oIDUsICAgICAgICAgICAgICAwLCAgMSwgICAxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIkRJU1AxNiIsICAgIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgdHJ1ZSksCi0gIEhPV1RPKCA2LCAgICAgICAgICAgICAgMCwgIDIsICAgMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQMzIiLCAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIHRydWUpLAotICBIT1dUTyggNywgICAgICAgICAgICAgIDIsICAzLCAgIDI2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgcmlzY2l4X2ZpeF9wY3JlbF8yNl9kb25lLCAiQVJNMjZEIix0cnVlLDB4MDBmZmZmZmYsMHgwMGZmZmZmZiwgZmFsc2UpLAotICB7LTF9LAotICBIT1dUTyggOSwgICAgICAgICAgICAgIDAsIC0xLCAgIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiTkVHMTYiLCAgICAgICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKCAxMCwgICAgICAgICAgICAgIDAsIC0yLCAgIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiTkVHMzIiLCAgICAgICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSkKLX07Ci0KLSNkZWZpbmUgUklTQ0lYX1RBQkxFX1NJWkUgXAotICAoc2l6ZW9mIChyaXNjaXhfc3RkX3JlbG9jX2hvd3RvKSAvIHNpemVvZiAocmVsb2NfaG93dG9fdHlwZSkpCi0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmlzY2l4X2ZpeF9wY3JlbF8yNl9kb25lIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogVGhpcyBpcyBkZWFkIHNpbXBsZSBhdCBwcmVzZW50LiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmlzY2l4X2ZpeF9wY3JlbF8yNiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+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+dGRhdGEuYW91dF9kYXRhID0gb2xkcmF3cHRyOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1NWShvYmplY3RfcCkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsgICAgICAvKiBSYXcgZXhlYyBoZWFkZXIgZnJvbSBmaWxlICovCi0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGV4ZWM7ICAgICAgICAgICAgLyogQ2xlYW5lZC11cCBleGVjIGhlYWRlciAqLwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQ7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQotICAgICAgIT0gRVhFQ19CWVRFU19TSVpFKSB7Ci0gICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBleGVjLmFfaW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXhlY19ieXRlcy5lX2luZm8pOwotCi0gIGlmIChOX0JBRE1BRyAoZXhlYykpIHJldHVybiAwOwotI2lmZGVmIE1BQ0hUWVBFX09LCi0gIGlmICghKE1BQ0hUWVBFX09LIChOX01BQ0hUWVBFIChleGVjKSkpKSByZXR1cm4gMDsKLSNlbmRpZgotCi0gIE5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKShhYmZkLCAmZXhlY19ieXRlcywgJmV4ZWMpOwotCi0gIHRhcmdldCA9IHJpc2NpeF9zb21lX2FvdXRfb2JqZWN0X3AgKGFiZmQsICZleGVjLCBNWShjYWxsYmFjaykpOwotCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvcnM2MDAwLWNvcmUuYyBiL2JmZC9yczYwMDAtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjA1NTVmLi4wMDAwMDAwCi0tLSBhL2JmZC9yczYwMDAtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA3ICswLDAgQEAKLS8qIElCTSBSUy82MDAwICJYQ09GRiIgYmFjay1lbmQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBGSVhNRTogQ2FuIHNvbWVvbmUgcHJvdmlkZSBhIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGlzIG5hbWUgaW50byBBU0NJST8KLSAgIFVzaW5nIHRoZSBmb2xsb3dpbmcgY2hhcnMgY2F1c2VkIGEgY29tcGlsZXIgd2FybmluZyBvbiBISVVYIChzbyBJIHJlcGxhY2VkCi0gICB0aGVtIHdpdGggb2N0YWwgZXNjYXBlcyksIGFuZCBpc24ndCB1c2VmdWwgd2l0aG91dCBhbiB1bmRlcnN0YW5kaW5nIG9mIHdoYXQKLSAgIGNoYXJhY3RlciBzZXQgaXQgaXMuCi0gICBXcml0dGVuIGJ5IE1ldGluIEcuIE96aXNpaywgTWltaSBQaFwzNzNcMzY0bmctVGhcMzQ1byBWXDM2NSwgCi0gICAgIGFuZCBKb2huIEdpbG1vcmUuCi0gICBBcmNoaXZlIHN1cHBvcnQgZnJvbSBEYW1vbiBBLiBQZXJtZXplbC4KLSAgIENvbnRyaWJ1dGVkIGJ5IElCTSBDb3Jwb3JhdGlvbiBhbmQgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBwb3J0IGN1cnJlbnRseSBvbmx5IGhhbmRsZXMgcmVhZGluZyBvYmplY3QgZmlsZXMsIGV4Y2VwdCB3aGVuCi0gICBjb21waWxlZCBvbiBhbiBSUy82MDAwIGhvc3QuICAtLSBubyBhcmNoaXZlIHN1cHBvcnQsIG5vIGNvcmUgZmlsZXMuCi0gICBJbiBhbGwgY2FzZXMsIGl0IGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZy4KLQotICAgRklYTUVtZ28gY29tbWVudHMgYXJlIGxlZnQgZnJvbSBNZXRpbiBPemlzaWsncyBvcmlnaW5hbCBwb3J0LgotCi0gICBUaGlzIGlzIGluIGEgc2VwYXJhdGUgZmlsZSBmcm9tIGNvZmYtcnM2MDAwLmMsIGJlY2F1c2UgaXQgaW5jbHVkZXMKLSAgIHN5c3RlbSBpbmNsdWRlIGZpbGVzIHRoYXQgY29uZmxpY3Qgd2l0aCBjb2ZmL3JzNjAwMC5oLgotICAqLwotCi0vKiBJbnRlcm5hbGNvZmYuaCBhbmQgY29mZmNvZGUuaCBtb2RpZnkgdGhlbXNlbHZlcyBiYXNlZCBvbiB0aGlzIGZsYWcuICAqLwotI2RlZmluZSBSUzYwMDBDT0ZGX0MgMQotCi0vKiBUaGUgQUlYIDQuMSBrZXJuZWwgaXMgb2J2aW91c2x5IGNvbXBpbGVkIHdpdGggLURfTE9OR19MT05HLCBzbwotICAgd2UgaGF2ZSB0byBkZWZpbmUgX0xPTkdfTE9ORyBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgZ2NjIHRvIGdldCB0aGUKLSAgIHByb3BlciBhbGlnbm1lbnRzIGluIHRoZSB1c2VyIHN0cnVjdHVyZS4gICovCi0jaWYgZGVmaW5lZChfQUlYNDEpICYmICFkZWZpbmVkKF9MT05HX0xPTkcpCi0jZGVmaW5lIF9MT05HX0xPTkcKLSNlbmRpZgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZmRlZiBBSVhfQ09SRQotCi0vKiBBT1VUSERSIGlzIGRlZmluZWQgYnkgdGhlIGFib3ZlLiAgV2UgbmVlZCBhbm90aGVyIGRlZm4gb2YgaXQsIGZyb20gdGhlCi0gICBzeXN0ZW0gaW5jbHVkZSBmaWxlcy4gIFB1bnQgdGhlIG9sZCBvbmUgYW5kIGdldCB1cyBhIG5ldyBuYW1lIGZvciB0aGUKLSAgIHR5cGVkZWYgaW4gdGhlIHN5c3RlbSBpbmNsdWRlIGZpbGVzLiAgKi8KLSNpZmRlZiBBT1VUSERSCi0jdW5kZWYgQU9VVEhEUgotI2VuZGlmCi0jZGVmaW5lCUFPVVRIRFIJc2Vjb25kX0FPVVRIRFIKLQotI3VuZGVmCVNDTkhEUgotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoJU3VwcG9ydCBmb3IgY29yZSBmaWxlIHN0dWZmLi4gCQkJCQkgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaW5jbHVkZSA8c3lzL3VzZXIuaD4KLSNpbmNsdWRlIDxzeXMvbGRyLmg+Ci0jaW5jbHVkZSA8c3lzL2NvcmUuaD4KLQotCi0vKiBOdW1iZXIgb2Ygc3BlY2lhbCBwdXJwb3NlIHJlZ2lzdGVycyBzdXBwb3J0ZWQgYnkgZ2RiLiAgVGhpcyB2YWx1ZQotICAgc2hvdWxkIG1hdGNoIGB0bS5oJyBpbiBnZGIgZGlyZWN0b3J5LiAgQ2xlYW4gdGhpcyBtZXNzIHVwIGFuZCB1c2UKLSAgIHRoZSBtYWNyb3MgaW4gc3lzL3JlZy5oLiAgRklYTUVtZ28uICovCi0KLSNkZWZpbmUJTlVNX09GX1NQRUNfUkVHUyAgNwotCi0jZGVmaW5lCWNvcmVfaGRyKGJmZCkJCSgoKFJzNmtDb3JEYXRhKikoYmZkLT50ZGF0YS5hbnkpKS0+aGRyKQotCi0vKiBBSVggNC4xIENoYW5nZWQgdGhlIG5hbWVzIGFuZCBsb2NhdGlvbnMgb2YgYSBmZXcgaXRlbXMgaW4gdGhlIGNvcmUgZmlsZSwKLSAgIHRoaXMgc2VlbXMgdG8gYmUgdGhlIHF1aWNrZXN0IGVhc2lldCB3YXkgdG8gZGVhbCB3aXRoIGl0LiAKLQotICAgTm90ZSBob3dldmVyIHRoYXQgZW5jb2RpbmcgbWFnaWMgYWRkcmVzc2VzIChTVEFDS19FTkRfQUREUikgaXMgZ29pbmcKLSAgIHRvIGJlIF92ZXJ5XyBmcmFnaWxlLiAgQnV0IEkgZG9uJ3Qgc2VlIGFueSBlYXN5IHdheSB0byBnZXQgdGhhdCBpbmZvCi0gICByaWdodCBub3cuICAqLwotI2lmZGVmIENPUkVfVkVSU0lPTl8xCi0jZGVmaW5lIENPUkVfREFUQV9TSVpFX0ZJRUxEIGNfdS5VX2RzaXplCi0jZGVmaW5lIENPUkVfQ09NTV9GSUVMRCBjX3UuVV9jb21tCi0jZGVmaW5lIFNBVkVfRklFTEQgY19tc3QKLSNkZWZpbmUJU1RBQ0tfRU5EX0FERFIgMHgyZmYyMzAwMAotI2Vsc2UKLSNkZWZpbmUgQ09SRV9EQVRBX1NJWkVfRklFTEQgY191LnVfZHNpemUKLSNkZWZpbmUgQ09SRV9DT01NX0ZJRUxEIGNfdS51X2NvbW0KLSNkZWZpbmUgU0FWRV9GSUVMRCBjX3UudV9zYXZlCi0jZGVmaW5lCVNUQUNLX0VORF9BRERSIDB4MmZmODAwMDAKLSNlbmRpZgotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QgY29yZV9kdW1wIGhkcjsJCS8qIGNvcmUgZmlsZSBoZWFkZXIgKi8KLX0gUnM2a0NvckRhdGE7Ci0KLXN0YXRpYyBhc2VjdGlvbiAqbWFrZV9iZmRfYXNlY3Rpb24gUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKiwgZmxhZ3dvcmQsCi0JCQkJCSAgICBiZmRfc2l6ZV90eXBlLCBiZmRfdm1hLCBmaWxlX3B0cikpOwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgZmlsZXBvcykKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBhc2VjdGlvbiAqYXNlY3Q7Ci0KLSAgYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT52bWEgPSB2bWE7Ci0gIGFzZWN0LT5maWxlcG9zID0gZmlsZXBvczsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDg7Ci0KLSAgcmV0dXJuIGFzZWN0OwotfQotCi0vKiBEZWNpZGUgaWYgYSBnaXZlbiBiZmQgcmVwcmVzZW50cyBhIGBjb3JlJyBmaWxlIG9yIG5vdC4gVGhlcmUgcmVhbGx5IGlzIG5vCi0gICBtYWdpYyBudW1iZXIgb3IgYW55dGhpbmcgbGlrZSwgaW4gcnM2MDAwY29mZi4gKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1yczYwMDBjb2ZmX2NvcmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgY29yZV9kdW1wIGNvcmVkYXRhOwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICBiZmRfc2l6ZV90eXBlIG5yZWFkOwotICBjaGFyICp0bXBwdHI7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBucmVhZCA9IGJmZF9yZWFkICgmY29yZWRhdGEsIDEsIHNpemVvZiAoc3RydWN0IGNvcmVfZHVtcCksIGFiZmQpOwotICBpZiAobnJlYWQgIT0gc2l6ZW9mIChzdHJ1Y3QgY29yZV9kdW1wKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zdGF0IChhYmZkLCAmc3RhdGJ1ZikgPCAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIGNvcmUgZmlsZSB1bGltaXQgaXMgdG9vIHNtYWxsLCB0aGUgc3lzdGVtIHdpbGwgZmlyc3QKLSAgICAgb21pdCB0aGUgZGF0YSBzZWdtZW50LCB0aGVuIG9taXQgdGhlIHN0YWNrLCB0aGVuIGRlY2xpbmUgdG8KLSAgICAgZHVtcCBjb3JlIGFsdG9nZXRoZXIgKGFzIGZhciBhcyBJIGtub3cgVUJMT0NLX1ZBTElEIGFuZCBMRV9WQUxJRAotICAgICBhcmUgYWx3YXlzIHNldCkgKHRoaXMgaXMgYmFzZWQgb24gZXhwZXJpbWVudGF0aW9uIG9uIEFJWCAzLjIpLgotICAgICBOb3csIHRoZSB0aGluZyBpcyB0aGF0IEdEQiB1c2VycyB3aWxsIGJlIHN1cnByaXNlZAotICAgICBpZiBzZWdtZW50cyBqdXN0IHNpbGVudGx5IGRvbid0IGFwcGVhciAod2VsbCwgbWF5YmUgdGhleSB3b3VsZAotICAgICB0aGluayB0byBjaGVjayAiaW5mbyBmaWxlcyIsIEkgZG9uJ3Qga25vdykuCi0KLSAgICAgRm9yIHRoZSBkYXRhIHNlZ21lbnQsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBrZWVwIGdvaW5nIGlmIGl0J3MKLSAgICAgbm90IHRoZXJlLCBzaW5jZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyBub3QgdG8gZHVtcCBpdCAocmVnYXJkbGVzcwotICAgICBvZiB0aGUgdWxpbWl0LCBpdCdzIGJhc2VkIG9uIFNBX0ZVTExEVU1QKS4gIEJ1dCBmb3IgdGhlIHN0YWNrIHNlZ21lbnQsCi0gICAgIGlmIGl0J3Mgbm90IHRoZXJlLCB3ZSByZWZ1c2UgdG8gaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoIHRoaXMgY29yZQotICAgICBmaWxlLiAgVGhlIHVzZWZ1bG5lc3Mgb2YgYSBjb3JlIGR1bXAgd2l0aG91dCBhIHN0YWNrIHNlZ21lbnQgaXMgcHJldHR5Ci0gICAgIGxpbWl0ZWQgYW55d2F5LiAgKi8KLSAgICAgCi0gIGlmICghKGNvcmVkYXRhLmNfZmxhZyAmIFVCTE9DS19WQUxJRCkKLSAgICAgIHx8ICEoY29yZWRhdGEuY19mbGFnICYgTEVfVkFMSUQpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghKGNvcmVkYXRhLmNfZmxhZyAmIFVTVEFDS19WQUxJRCkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBEb24ndCBjaGVjayB0aGUgY29yZSBmaWxlIHNpemUgZm9yIGEgZnVsbCBjb3JlLCBBSVggNC4xIGluY2x1ZGVzCi0gICAgIGFkZGl0aW9uYWwgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbnMgaW4gYSBmdWxsIGNvcmUuICAqLwotICBpZiAoIShjb3JlZGF0YS5jX2ZsYWcgJiAoRlVMTF9DT1JFIHwgQ09SRV9UUlVOQykpCi0gICAgICAmJiAoKGJmZF92bWEpY29yZWRhdGEuY19zdGFjayArIGNvcmVkYXRhLmNfc2l6ZSkgIT0gc3RhdGJ1Zi5zdF9zaXplKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBzaXplIGlzIHdyb25nLCBpdCBtZWFucyB3ZSdyZSBtaXNpbnRlcnByZXRpbmcgc29tZXRoaW5nLiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFNhbml0eSBjaGVjayBvbiB0aGUgY190YWIgZmllbGQuICAqLwotICBpZiAoKHVfbG9uZykgY29yZWRhdGEuY190YWIgPCBzaXplb2YgY29yZWRhdGEgfHwKLSAgICAgICh1X2xvbmcpIGNvcmVkYXRhLmNfdGFiID49IHN0YXRidWYuc3Rfc2l6ZSB8fAotICAgICAgKGxvbmcpIGNvcmVkYXRhLmNfdGFiID49IChsb25nKWNvcmVkYXRhLmNfc3RhY2spCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogSXNzdWUgd2FybmluZyBpZiB0aGUgY29yZSBmaWxlIHdhcyB0cnVuY2F0ZWQgZHVyaW5nIHdyaXRpbmcuICAqLwotICBpZiAoY29yZWRhdGEuY19mbGFnICYgQ09SRV9UUlVOQykKLSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiB3YXJuaW5nIGNvcmUgZmlsZSB0cnVuY2F0ZWQiKSwKLQkJCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAvKiBBbGxvY2F0ZSBjb3JlIGZpbGUgaGVhZGVyLiAgKi8KLSAgdG1wcHRyID0gKGNoYXIqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKFJzNmtDb3JEYXRhKSk7Ci0gIGlmICghdG1wcHRyKQotICAgIHJldHVybiBOVUxMOwotICAgICAgCi0gIHNldF90ZGF0YSAoYWJmZCwgdG1wcHRyKTsKLQotICAvKiBDb3B5IGNvcmUgZmlsZSBoZWFkZXIuICAqLwotICBjb3JlX2hkciAoYWJmZCkgPSBjb3JlZGF0YTsKLQotICAvKiAuc3RhY2sgc2VjdGlvbi4gKi8KLSAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5zdGFjayIsCi0gIAkJCSAgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAoYmZkX3NpemVfdHlwZSkgY29yZWRhdGEuY19zaXplLAotCQkJICAoYmZkX3ZtYSkgKFNUQUNLX0VORF9BRERSIC0gY29yZWRhdGEuY19zaXplKSwKLQkJCSAgKGZpbGVfcHRyKSBjb3JlZGF0YS5jX3N0YWNrKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiAucmVnIHNlY3Rpb24gZm9yIEdQUnMgYW5kIHNwZWNpYWwgcmVnaXN0ZXJzLiAqLwotICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZyIsCi0gIAkJCSAgU0VDX0hBU19DT05URU5UUywKLQkJCSAgKGJmZF9zaXplX3R5cGUpICgoMzIgKyBOVU1fT0ZfU1BFQ19SRUdTKSAqIDQpLAotCQkJICAoYmZkX3ZtYSkgMCwKLQkJCSAgKGZpbGVfcHRyKSAoKGNoYXIgKikgJmNvcmVkYXRhLlNBVkVfRklFTEQKLQkJCQkgICAgICAtIChjaGFyICopICZjb3JlZGF0YSkpKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIC5yZWcyIHNlY3Rpb24gZm9yIEZQUnMgKGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycykuICovCi0gIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIucmVnMiIsCi0gIAkJCSAgU0VDX0hBU19DT05URU5UUywKLQkJCSAgKGJmZF9zaXplX3R5cGUpIDggKiAzMiwJLyogMzIgRlBScy4gKi8KLQkJCSAgKGJmZF92bWEpIDAsCi0JCQkgIChmaWxlX3B0cikgKChjaGFyICopICZjb3JlZGF0YS5TQVZFX0ZJRUxELmZwclswXQotCQkJCSAgICAgIC0gKGNoYXIgKikgJmNvcmVkYXRhKSkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogLmxkaW5mbyBzZWN0aW9uLgotICAgICBUbyBhY3R1YWxseSBmaW5kIG91dCBob3cgbG9uZyB0aGlzIHNlY3Rpb24gaXMgaW4gdGhpcyBwYXJ0aWN1bGFyCi0gICAgIGNvcmUgZHVtcCB3b3VsZCByZXF1aXJlIGdvaW5nIGRvd24gdGhlIHdob2xlIGxpc3Qgb2Ygc3RydWN0IGxkX2luZm8ncy4KLSAgICAgU2VlIGlmIHdlIGNhbiBqdXN0IGZha2UgaXQuICAqLwotICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLmxkaW5mbyIsCi0gIAkJCSAgU0VDX0hBU19DT05URU5UUywKLQkJCSAgKGJmZF9zaXplX3R5cGUpIDB4N2ZmZmZmZmYsCi0JCQkgIChiZmRfdm1hKSAwLAotCQkJICAoZmlsZV9wdHIpIGNvcmVkYXRhLmNfdGFiKSkKLSAgICByZXR1cm4gTlVMTDsKLQotI2lmbmRlZiBDT1JFX1ZFUlNJT05fMQotICAvKiAuZGF0YSBzZWN0aW9uIGlmIHByZXNlbnQuCi0gICAgIEFJWCAzIGR1bXBzIHRoZSBjb21wbGV0ZSBkYXRhIHNlY3Rpb24gYW5kIHNldHMgRlVMTF9DT1JFIGlmIHRoZQotICAgICB1bGltaXQgaXMgbGFyZ2UgZW5vdWdoLCBvdGhlcndpc2UgdGhlIGRhdGEgc2VjdGlvbiBpcyBvbWl0dGVkLgotICAgICBBSVggNCBzZXRzIEZVTExfQ09SRSBldmVuIGlmIHRoZSBjb3JlIGZpbGUgaXMgdHJ1bmNhdGVkLCB3ZSBoYXZlCi0gICAgIHRvIGV4YW1pbmUgY29yZWRhdGEuY19kYXRhc2l6ZSBiZWxvdyB0byBmaW5kIG91dCB0aGUgYWN0dWFsIHNpemUgb2YKLSAgICAgdGhlIC5kYXRhIHNlY3Rpb24uICAqLwotICBpZiAoY29yZWRhdGEuY19mbGFnICYgRlVMTF9DT1JFKQotICAgIHsKLSAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCi0JCQkgICAgICBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgICAgICAoYmZkX3NpemVfdHlwZSkgY29yZWRhdGEuQ09SRV9EQVRBX1NJWkVfRklFTEQsCi0JCQkgICAgICAoYmZkX3ZtYSkKLQkJCQlDREFUQV9BRERSIChjb3JlZGF0YS5DT1JFX0RBVEFfU0laRV9GSUVMRCksCi0JCQkgICAgICAoZmlsZV9wdHIpIGNvcmVkYXRhLmNfc3RhY2sgKyBjb3JlZGF0YS5jX3NpemUpKQotCXJldHVybiBOVUxMOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQ09SRV9WRVJTSU9OXzEKLSAgLyogQUlYIDQgYWRkcyBkYXRhIHNlY3Rpb25zIGZyb20gbG9hZGVkIG9iamVjdHMgdG8gdGhlIGNvcmUgZmlsZSwKLSAgICAgd2hpY2ggY2FuIGJlIGZvdW5kIGJ5IGV4YW1pbmluZyBsZGluZm8sIGFuZCBhbm9ueW1vdXNseSBtbWFwcGVkCi0gICAgIHJlZ2lvbnMuICAqLwotICB7Ci0gICAgc3RydWN0IGxkX2luZm8gbGRpbmZvOwotICAgIGJmZF9zaXplX3R5cGUgbGRpbmZvX3NpemU7Ci0gICAgZmlsZV9wdHIgbGRpbmZvX29mZnNldCA9IChmaWxlX3B0cikgY29yZWRhdGEuY190YWI7Ci0KLSAgICAvKiAuZGF0YSBzZWN0aW9uIGZyb20gZXhlY3V0YWJsZS4gICovCi0gICAgaWYgKGNvcmVkYXRhLmNfZGF0YXNpemUpCi0gICAgICB7Ci0JaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5kYXRhIiwKLQkJCQlTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJKGJmZF9zaXplX3R5cGUpIGNvcmVkYXRhLmNfZGF0YXNpemUsCi0JCQkJKGJmZF92bWEpCi0JCQkJICBDREFUQV9BRERSIChjb3JlZGF0YS5DT1JFX0RBVEFfU0laRV9GSUVMRCksCi0JCQkJKGZpbGVfcHRyKSBjb3JlZGF0YS5jX2RhdGEpKQotCSAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0KLSAgICAvKiAuZGF0YSBzZWN0aW9ucyBmcm9tIGxvYWRlZCBvYmplY3RzLiAgKi8KLSAgICBsZGluZm9fc2l6ZSA9IChjaGFyICopICZsZGluZm8ubGRpbmZvX2ZpbGVuYW1lWzBdCi0JCSAgLSAoY2hhciAqKSAmbGRpbmZvLmxkaW5mb19uZXh0OwotICAgIHdoaWxlICgxKQotICAgICAgewotCWlmIChiZmRfc2VlayAoYWJmZCwgbGRpbmZvX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0JICByZXR1cm4gTlVMTDsKLQlpZiAoYmZkX3JlYWQgKCZsZGluZm8sIGxkaW5mb19zaXplLCAxLCBhYmZkKSAhPSBsZGluZm9fc2l6ZSkKLQkgIHJldHVybiBOVUxMOwotCWlmIChsZGluZm8ubGRpbmZvX2NvcmUpCi0JICB7Ci0JICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCi0JCQkJICAgIFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUywKLQkJCQkgICAgKGJmZF9zaXplX3R5cGUpIGxkaW5mby5sZGluZm9fZGF0YXNpemUsCi0JCQkJICAgIChiZmRfdm1hKSBsZGluZm8ubGRpbmZvX2RhdGFvcmcsCi0JCQkJICAgIChmaWxlX3B0cikgbGRpbmZvLmxkaW5mb19jb3JlKSkKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgIH0KLQlpZiAobGRpbmZvLmxkaW5mb19uZXh0ID09IDApCi0JICBicmVhazsKLQlsZGluZm9fb2Zmc2V0ICs9IGxkaW5mby5sZGluZm9fbmV4dDsKLSAgICAgIH0KLQotICAgIC8qIC52bWRhdGEgc2VjdGlvbnMgZnJvbSBhbm9ueW1vdXNseSBtbWFwcGVkIHJlZ2lvbnMuICAqLwotICAgIGlmIChjb3JlZGF0YS5jX3ZtcmVnaW9ucykKLSAgICAgIHsKLQlpbnQgaTsKLQotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBjb3JlZGF0YS5jX3ZtbSwgU0VFS19TRVQpICE9IDApCi0JICByZXR1cm4gTlVMTDsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3JlZGF0YS5jX3ZtcmVnaW9uczsgaSsrKQotCSAgewotCSAgICBzdHJ1Y3Qgdm1faW5mbyB2bWluZm87Ci0KLQkgICAgaWYgKGJmZF9yZWFkICgmdm1pbmZvLCBzaXplb2YgKHZtaW5mbyksIDEsIGFiZmQpICE9IHNpemVvZiAodm1pbmZvKSkKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgaWYgKHZtaW5mby52bWluZm9fb2Zmc2V0KQotCSAgICAgIHsKLQkJaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi52bWRhdGEiLAotCQkJCQlTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJCShiZmRfc2l6ZV90eXBlKSB2bWluZm8udm1pbmZvX3NpemUsCi0JCQkJCShiZmRfdm1hKSB2bWluZm8udm1pbmZvX2FkZHIsCi0JCQkJCShmaWxlX3B0cikgdm1pbmZvLnZtaW5mb19vZmZzZXQpKQotCQkgIHJldHVybiBOVUxMOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7CQkJCS8qIHRoaXMgaXMgZ2FyYmFnZSBmb3Igbm93LiAqLwotfQotCi0KLQotLyogcmV0dXJuIGB0cnVlJyBpZiBnaXZlbiBjb3JlIGlzIGZyb20gdGhlIGdpdmVuIGV4ZWN1dGFibGUuLiAqLwotYm9vbGVhbgotcnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZDsKLSAgICAgYmZkICpleGVjX2JmZDsKLXsKLSAgc3RydWN0IGNvcmVfZHVtcCBjb3JlZGF0YTsKLSAgc3RydWN0IGxkX2luZm8gbGRpbmZvOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGNoYXIgKnBhdGgsICpzOwotICBzaXplX3QgYWxsb2M7Ci0gIGNvbnN0IGNoYXIgKnN0cjEsICpzdHIyOwotICBib29sZWFuIHJldDsKLQotICBpZiAoYmZkX3NlZWsgKGNvcmVfYmZkLCAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKCZjb3JlZGF0YSwgc2l6ZW9mIGNvcmVkYXRhLCAxLCBjb3JlX2JmZCkgIT0gc2l6ZW9mIGNvcmVkYXRhKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGNvcmVfYmZkLCAobG9uZykgY29yZWRhdGEuY190YWIsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzaXplID0gKGNoYXIgKikgJmxkaW5mby5sZGluZm9fZmlsZW5hbWVbMF0gLSAoY2hhciAqKSAmbGRpbmZvLmxkaW5mb19uZXh0OwotICBpZiAoYmZkX3JlYWQgKCZsZGluZm8sIHNpemUsIDEsIGNvcmVfYmZkKSAhPSBzaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhbGxvYyA9IDEwMDsKLSAgcGF0aCA9IGJmZF9tYWxsb2MgKGFsbG9jKTsKLSAgaWYgKHBhdGggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHMgPSBwYXRoOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmIChiZmRfcmVhZCAocywgMSwgMSwgY29yZV9iZmQpICE9IDEpCi0JewotCSAgZnJlZSAocGF0aCk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCpzID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICArK3M7Ci0gICAgICBpZiAocyA9PSBwYXRoICsgYWxsb2MpCi0JewotCSAgY2hhciAqbjsKLQotCSAgYWxsb2MgKj0gMjsKLQkgIG4gPSBiZmRfcmVhbGxvYyAocGF0aCwgYWxsb2MpOwotCSAgaWYgKG4gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZyZWUgKHBhdGgpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgcyA9IG4gKyAocGF0aCAtIHMpOwotCSAgcGF0aCA9IG47Ci0JfQotICAgIH0KLSAgCi0gIHN0cjEgPSBzdHJyY2hyIChwYXRoLCAnLycpOwotICBzdHIyID0gc3RycmNociAoZXhlY19iZmQtPmZpbGVuYW1lLCAnLycpOwotCi0gIC8qIHN0ZXAgb3ZlciBjaGFyYWN0ZXIgJy8nICovCi0gIHN0cjEgPSBzdHIxICE9IE5VTEwgPyBzdHIxICsgMSA6IHBhdGg7Ci0gIHN0cjIgPSBzdHIyICE9IE5VTEwgPyBzdHIyICsgMSA6IGV4ZWNfYmZkLT5maWxlbmFtZTsKLQotICBpZiAoc3RyY21wIChzdHIxLCBzdHIyKSA9PSAwKQotICAgIHJldCA9IHRydWU7Ci0gIGVsc2UKLSAgICByZXQgPSBmYWxzZTsKLQotICBmcmVlIChwYXRoKTsKLQotICByZXR1cm4gcmV0OwotfQotCi1jaGFyICoKLXJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICpjb20gPSBjb3JlX2hkciAoYWJmZCkuQ09SRV9DT01NX0ZJRUxEOwotICBpZiAoKmNvbSkKLSAgICByZXR1cm4gY29tOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludAotcnM2MDAwY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfaGRyIChhYmZkKS5jX3NpZ25vOwotfQotCi0KLWJvb2xlYW4KLXJzNjAwMGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gICAgaWYgKGNvdW50ID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAvKiBSZWFkaW5nIGEgY29yZSBmaWxlJ3Mgc2VjdGlvbnMgd2lsbCBiZSBzbGlnaHRseSBkaWZmZXJlbnQuIEZvciB0aGUKLSAgICAgICByZXN0IG9mIHRoZW0gd2UgY2FuIHVzZSBiZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cyAoKSBJIHN1cHBvc2UuICovCi0gICAgLyogTWFrZSBzdXJlIHRoaXMgcm91dGluZSB3b3JrcyBmb3IgYW55IGJmZCBhbmQgYW55IHNlY3Rpb24uIEZJWE1FbWdvLiAqLwotCi0gICAgaWYgKGFiZmQtPmZvcm1hdCA9PSBiZmRfY29yZSAmJiBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIucmVnIikgPT0gMCkgewotCi0gICAgICBzdHJ1Y3QgbXN0c2F2ZSBtc3RhdHVzOwotICAgICAgaW50ICAgIHJlZ29mZnNldCA9IChjaGFyKikmbXN0YXR1cy5ncHJbMF0gLSAoY2hhciopJm1zdGF0dXM7Ci0KLSAgICAgIC8qIEFzc2VydCB0aGF0IHRoZSBvbmx5IHdheSB0aGlzIGNvZGUgd2lsbCBiZSBleGVjdXRlZCBpcyByZWFkaW5nIHRoZQotICAgICAgICAgd2hvbGUgc2VjdGlvbi4gKi8KLSAgICAgIGlmIChvZmZzZXQgfHwgY291bnQgIT0gKHNpemVvZihtc3RhdHVzLmdwcikgKyAoNCAqIE5VTV9PRl9TUEVDX1JFR1MpKSkKLSAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAoXygiRVJST1IhIGluIHJzNjAwMGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMoKVxuIikpOwotCi0gICAgICAvKiBmb3IgYC5yZWcnIHNlY3Rpb24sIGBmaWxlcG9zJyBpcyBhIHBvaW50ZXIgdG8gdGhlIGBtc3RzYXZlJyBzdHJ1Y3R1cmUKLSAgICAgICAgIGluIHRoZSBjb3JlIGZpbGUuICovCi0KLSAgICAgIC8qIHJlYWQgR1BSJ3MgaW50byB0aGUgbG9jYXRpb24uICovCi0gICAgICBpZiAoIGJmZF9zZWVrKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MgKyByZWdvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMQotCXx8IGJmZF9yZWFkKGxvY2F0aW9uLCBzaXplb2YgKG1zdGF0dXMuZ3ByKSwgMSwgYWJmZCkgIT0gc2l6ZW9mIChtc3RhdHVzLmdwcikpCi0JcmV0dXJuIChmYWxzZSk7IC8qIG9uIGVycm9yICovCi0KLSAgICAgIC8qIGluY3JlbWVudCBsb2NhdGlvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHNwZWNpYWwgcmVnaXN0ZXJzIGluIHRoZSBzZWN0aW9uLAotICAgICAgICAgcmVzZXQgcmVnaXN0ZXIgb2Zmc2V0IHZhbHVlIHRvIHRoZSBiZWdpbm5pbmcgb2YgZmlyc3Qgc3BlY2lhbCByZWdpc3RlcgotCSBpbiBtc3RzYXZlIHN0cnVjdHVyZSwgYW5kIHJlYWQgc3BlY2lhbCByZWdpc3RlcnMuICovCi0KLSAgICAgIGxvY2F0aW9uID0gKFBUUikgKChjaGFyKilsb2NhdGlvbiArIHNpemVvZiAobXN0YXR1cy5ncHIpKTsKLSAgICAgIHJlZ29mZnNldCA9IChjaGFyKikmbXN0YXR1cy5pYXIgLSAoY2hhciopJm1zdGF0dXM7Ci0KLSAgICAgIGlmICggYmZkX3NlZWsoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIHJlZ29mZnNldCwgU0VFS19TRVQpID09IC0xCi0JfHwgYmZkX3JlYWQobG9jYXRpb24sIDQgKiBOVU1fT0ZfU1BFQ19SRUdTLCAxLCBhYmZkKSAhPSAKLQkJCQkJCQk0ICogTlVNX09GX1NQRUNfUkVHUykKLQlyZXR1cm4gKGZhbHNlKTsgLyogb24gZXJyb3IgKi8KLSAgICAgIAotICAgICAgLyogaW5jcmVtZW50IGxvY2F0aW9uIGFkZHJlc3MsIGFuZCByZWFkIHRoZSBzcGVjaWFsIHJlZ2lzdGVycy4uICovCi0gICAgICAvKiBGSVhNRW1nbyAqLwotICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKiBlbHNlLCB1c2UgZGVmYXVsdCBiZmQgc2VjdGlvbiBjb250ZW50IHRyYW5zZmVyLiAqLwotICAgIGVsc2UKLSAgICAgIHJldHVybiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMgCi0gICAgICAJCQkoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpOwotfQotCi0jZW5kaWYgLyogQUlYX0NPUkUgKi8KZGlmZiAtLWdpdCBhL2JmZC9zY281LWNvcmUuYyBiL2JmZC9zY281LWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwYzhmMS4uMDAwMDAwMAotLS0gYS9iZmQvc2NvNS1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjkgKzAsMCBAQAotLyogQkZEIGJhY2sgZW5kIGZvciBTQ081IGNvcmUgZmlsZXMgKFUtYXJlYSBhbmQgcmF3IHNlY3Rpb25zKQotICAgQ29weXJpZ2h0IDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEpvdWtlIE51bWFuIDxqbnVtYW5AaGlzY29tLm5sPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9kaXIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2luY2x1ZGUgPHN5cy91c2VyLmg+ICAgICAgICAgICAvKiBBZnRlciBhLm91dC5oICAqLwotI2luY2x1ZGUgPHN5cy9wYWNjZXNzLmg+Ci0jaW5jbHVkZSA8c3lzL3JlZ2lvbi5oPgotCi1zdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdAotewotICBzdHJ1Y3QgdXNlciB1OwotfTsKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGZsYWd3b3JkLCBiZmRfc2l6ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX3ZtYSwgZmlsZV9wdHIpKTsKLXN0YXRpYyBhc3ltYm9sICpzY281X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgdXNlciAqcmVhZF91YXJlYSBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpzY281X2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotY2hhciAqc2NvNV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotaW50IHNjbzVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbiBzY281X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLAotCQkJCQkJICAgICBiZmQgKmV4ZWNfYmZkKSk7Ci1zdGF0aWMgdm9pZCBzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBuYW1lLCBmbGFncywgX3Jhd19zaXplLCB2bWEsIGZpbGVwb3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOwotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgZmlsZV9wdHIgZmlsZXBvczsKLXsKLSAgYXNlY3Rpb24gKmFzZWN0OwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotICBhc2VjdC0+ZmxhZ3MgPSBmbGFnczsKLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IF9yYXdfc2l6ZTsKLSAgYXNlY3QtPnZtYSA9IHZtYTsKLSAgYXNlY3QtPmZpbGVwb3MgPSBmaWxlcG9zOwotICBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotICByZXR1cm4gYXNlY3Q7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLXNjbzVfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotIAotc3RhdGljIHN0cnVjdCB1c2VyICoKLXJlYWRfdWFyZWEoYWJmZCwgZmlsZXBvcykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgZmlsZXBvczsKLQotewotICBzdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdCAqcmF3cHRyOwotCi0gIHJhd3B0ciA9ICgoc3RydWN0IHNjbzVfY29yZV9zdHJ1Y3QgKikKLQkgICAgYmZkX3ptYWxsb2MgKHNpemVvZiAoc3RydWN0IHNjbzVfY29yZV9zdHJ1Y3QpKSk7Ci0gIGlmIChyYXdwdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBhYmZkLT50ZGF0YS5zY281X2NvcmVfZGF0YSA9IHJhd3B0cjsKLQotICBpZiAoKGJmZF9zZWVrIChhYmZkLCBmaWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmcmF3cHRyLT51LCAxLCBzaXplb2YgcmF3cHRyLT51LCBhYmZkKQotCSAgIT0gc2l6ZW9mIHJhd3B0ci0+dSkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogU2FuaXR5IGNoZWNrIHBlcmhhcHM/Pz8gKi8KLSAgaWYgKHJhd3B0ci0+dS51X2RzaXplID4gMHgxMDAwMDAwKSAgICAvKiBSZW1lbWJlciwgaXQncyBpbiBwYWdlcy4uLiAqLwotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBpZiAocmF3cHRyLT51LnVfc3NpemUgPiAweDEwMDAwMDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldHVybiAmcmF3cHRyLT51OwotfQotCi0vKiBBUkdTVVNFRCAqLwotY29uc3QgYmZkX3RhcmdldCAqCi1zY281X2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBjb2Zmc2V0X3NpeiwgdmFsLCBuc2VjcywgY2hlYWRvZmZzOwotICBpbnQgY29yZXNpemU7Ci0gIHN0cnVjdCB1c2VyICp1OwotICBzdHJ1Y3QgY29yZW9mZnNldHMgY29mZnNldHM7Ci0gIHN0cnVjdCBjb3Jlc2VjdGhlYWQgY2hlYWQ7Ci0gIGNoYXIgKnNlY25hbWU7Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIC8qIFJlYWQgY29yZW9mZnNldHMgcmVnaW9uIGF0IGVuZCBvZiBjb3JlIChzZWUgY29yZShGUCkpICovCi0KLSAgewotICAgIEZJTEUgKnN0cmVhbSA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gICAgaWYgKHN0cmVhbSA9PSBOVUxMKQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKGZzdGF0IChmaWxlbm8gKHN0cmVhbSksICZzdGF0YnVmKSA8IDApCi0gICAgICB7Ci0gICAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgICAgfQotICAgIGNvcmVzaXplID0gc3RhdGJ1Zi5zdF9zaXplOwotICB9Ci0gIC8qIExhc3QgbG9uZyBpbiBjb3JlIGlzIHNpemVvZiBzdHJ1Y3QgY29yZW9mZnNldHMsIHJlYWQgaXQgKi8KLSAgaWYgKChiZmRfc2VlayAoYWJmZCwgY29yZXNpemUtc2l6ZW9mIGNvZmZzZXRfc2l6LCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmY29mZnNldF9zaXosIDEsIHNpemVvZiBjb2Zmc2V0X3NpeiwgYWJmZCkKLQkgICE9IHNpemVvZiBjb2Zmc2V0X3NpeikgKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOyAKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBVc2UgaXQgdG8gc2VlayBzdGFydCBvZiBjb3Jlb2Zmc2V0cyByZWdpb24sIHJlYWQgaXQgYW5kIGRldGVybWluZQotICAgICB2YWxpZGl0eSAqLwotICBpZiAoKGJmZF9zZWVrIChhYmZkLCBjb3Jlc2l6ZS1jb2Zmc2V0X3NpeiwgU0VFS19TRVQpICE9IDApCi0gICAgICB8fCAoYmZkX3JlYWQgKCh2b2lkICopJmNvZmZzZXRzLCAxLCBzaXplb2YgY29mZnNldHMsIGFiZmQpCi0JICAhPSBzaXplb2YgY29mZnNldHMpCi0gICAgICB8fCAoKGNvZmZzZXRzLnVfaW5mbyAhPSAxKSAmJiAoY29mZnNldHMudV9pbmZvICE9IENfVkVSU0lPTikpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOyAKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotCi0gIGlmIChjb2Zmc2V0cy51X2luZm8gPT0gMSkgCi0gICAgeyAKLSAgICAgIC8qIE9sZCB2ZXJzaW9uLCBubyBzZWN0aW9uIGhlYWRzLCByZWFkIGluZm8gZnJvbSB1c2VyIHN0cnVjdCAqLwotCi0gICAgICB1ID0gcmVhZF91YXJlYShhYmZkLCBjb2Zmc2V0cy51X3VzZXIpOwotICAgICAgaWYgKCEgdSkKLSAgICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLCBTRUNfSEFTX0NPTlRFTlRTLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfc2l6ZV90eXBlKSBjb2Zmc2V0cy51X3VzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIChiZmRfdm1hKSB1LT51X2FyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlX3B0cikgY29mZnNldHMudV91c2VyKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgCi0gICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLmRhdGEiLCAKLQkJCSAgICAgIFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmZkX3NpemVfdHlwZSkgdS0+dV9leGRhdGEudXhfZHNpemUKLQkJCSAgICAgICArIHUtPnVfZXhkYXRhLnV4X2JzaXplKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfdm1hKSB1LT51X2V4ZGF0YS51eF9kYXRvcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZV9wdHIpIGNvZmZzZXRzLnVfZGF0YSkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIAotICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5zdGFjayIsIAotCQkJICAgICAgU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfc2l6ZV90eXBlKSB1LT51X3NzaXplICogTkJQQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfdm1hKSB1LT51X3N1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlX3B0cikgY29mZnNldHMudV9zdGFjaykpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgICByZXR1cm4gYWJmZC0+eHZlYzsJCS8qIERvbmUgZm9yIHZlcnNpb24gMSAqLwotICAgIH0gICAgICAKLQotICAvKiBJbW1lZGlhdGVseSBiZWZvcmUgY29yZW9mZnNldHMgcmVnaW9uIGlzIGEgbG9uZyB3aXRoIG9mZnNldCBpbiBjb3JlCi0gICAgIHRvIGZpcnN0IGNvcmVzZWN0aGVhZCAoQ09SRVNfT0ZGU0VUUyksIHRoZSBsb25nIGJlZm9yZSB0aGlzIGlzIHRoZQotICAgICBudW1iZXIgb2Ygc2VjdGlvbiBoZWFkcyBpbiB0aGUgbGlzdC4gUmVhZCBib3RoIGxvbmdzIGFuZCByZWFkIHRoZQotICAgICBjb3Jlc2VjdGhlYWQgYW5kIGNoZWNrIGl0cyB2YWxpZGl0eSAqLwotICAgIAotICBpZiAoKGJmZF9zZWVrIChhYmZkLCAKLQkJIGNvcmVzaXplIC0gY29mZnNldF9zaXogLSAyICogc2l6ZW9mIGNvZmZzZXRfc2l6LCAKLQkJIFNFRUtfU0VUKSAhPSAwKQotICAgICAgfHwgKGJmZF9yZWFkICgodm9pZCAqKSZuc2VjcywgMSwgc2l6ZW9mIG5zZWNzLCBhYmZkKSAhPSBzaXplb2YgbnNlY3MpCi0gICAgICB8fCAoYmZkX3JlYWQgKCh2b2lkICopJmNoZWFkb2ZmcywgMSwgc2l6ZW9mIGNoZWFkb2ZmcywgYWJmZCkKLQkgICE9IHNpemVvZiBjaGVhZG9mZnMpCi0gICAgICB8fCAoYmZkX3NlZWsgKGFiZmQsIGNoZWFkb2ZmcywgU0VFS19TRVQpICE9IDApCi0gICAgICB8fCAoYmZkX3JlYWQgKCh2b2lkICopJmNoZWFkLCAxLCBzaXplb2YgY2hlYWQsIGFiZmQpICE9IHNpemVvZiBjaGVhZCkKLSAgICAgIHx8IChjaGVhZC5jc19zdHlwZSAhPSBDT1JFU19PRkZTRVRTKQotICAgICAgfHwgKGNoZWFkLmNzX3guY3N4X21hZ2ljICE9IENPUkVNQUdJQ19OVU1CRVIpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIC8qIE5vdyBsb29wIG92ZXIgYWxsIHJlZ2lvbnMgYW5kIG1hcCB0aGVtICovCi0gIG5zZWNzLS07CQkJCS8qIFdlJ3ZlIHNlZW4gQ09SRVNfT0ZGU0VUUyBhbHJlYWR5ICovCi0gIGZvciAoOyBuc2VjczsgbnNlY3MtLSkgCi0gICAgewotICAgICAgaWYgKChiZmRfc2VlayAoYWJmZCwgY2hlYWQuY3NfaHNlZWssIFNFRUtfU0VUKSAhPSAwKQotCSAgfHwgYmZkX3JlYWQgKCh2b2lkICopJmNoZWFkLCAxLCBzaXplb2YgY2hlYWQsIGFiZmQpICE9IHNpemVvZiBjaGVhZCkKLSAgICAgICAgewotICAgICAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOyAKLSAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICBzd2l0Y2ggKGNoZWFkLmNzX3N0eXBlKSAKLQl7Ci0JY2FzZSBDT1JFU19NQUdJQzoJCQkvKiBDb3JlIGhlYWRlciwgY2hlY2sgbWFnaWMgKi8KLQkgIGlmIChjaGVhZC5jc194LmNzeF9tYWdpYyAhPSBDT1JFTUFHSUNfTlVNQkVSKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIHNlY25hbWUgPSBOVUxMOwotCSAgbnNlY3MrKzsJCQkJLyogTUFHSUMgbm90IGluIHNlY3Rpb24gY250ISovCi0JICBicmVhazsKLQljYXNlIENPUkVTX1VBUkVBOgkJCS8qIFUtYXJlYSwgcmVhZCBpbiB0ZGF0YSAqLwotCSAgdSA9IHJlYWRfdWFyZWEoYWJmZCwgY2hlYWQuY3Nfc3NlZWspOwotCSAgaWYgKCEgdSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgICAgICAvKiBUaGlzIGlzIHRyaWNreS4gIEFzIHRoZSAicmVnaXN0ZXIgc2VjdGlvbiIsIHdlIGdpdmUgdGhlbQotCSAgICAgdGhlIGVudGlyZSB1cGFnZSBhbmQgc3RhY2suICB1LnVfYXIwIHBvaW50cyB0byB3aGVyZQotCSAgICAgInJlZ2lzdGVyIDAiIGlzIHN0b3JlZC4gIFRoZXJlIGFyZSB0d28gdHJpY2tzIHdpdGggdGhpcywKLQkgICAgIHRob3VnaC4gIE9uZSBpcyB0aGF0IHRoZSByZXN0IG9mIHRoZSByZWdpc3RlcnMgbWlnaHQgYmUKLQkgICAgIGF0IHBvc2l0aXZlIG9yIG5lZ2F0aXZlIChvciBib3RoKSBkaXNwbGFjZW1lbnRzIGZyb20KLQkgICAgICp1X2FyMC4gIFRoZSBvdGhlciBpcyB0aGF0IHVfYXIwIGlzIHNvbWV0aW1lcyBhbiBhYnNvbHV0ZQotCSAgICAgYWRkcmVzcyBpbiBrZXJuZWwgbWVtb3J5LCBhbmQgb24gb3RoZXIgc3lzdGVtcyBpdCBpcyBhbgotCSAgICAgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYHN0cnVjdCB1c2VyJy4KLQkKLQkgICAgIEFzIGEgcHJhY3RpY2FsIG1hdHRlciwgd2UgZG9uJ3Qga25vdyB3aGVyZSB0aGUgcmVnaXN0ZXJzCi0JICAgICBhY3R1YWxseSBhcmUsIHNvIHdlIGhhdmUgdG8gcGFzcyB0aGUgd2hvbGUgYXJlYSB0byBHREIuCi0JICAgICBXZSBlbmNvZGUgdGhlIHZhbHVlIG9mIHVfYXIwIGJ5IHNldHRpbmcgdGhlIC5yZWdzIHNlY3Rpb24KLQkgICAgIHVwIHNvIHRoYXQgaXRzIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MgMCBpcyBhdCB0aGUgcGxhY2UKLQkgICAgIHBvaW50ZWQgdG8gYnkgdV9hcjAgKGJ5IHNldHRpbmcgdGhlIHZtYSBvZiB0aGUgc3RhcnQgb2YKLQkgICAgIHRoZSBzZWN0aW9uIHRvIC11X2FyMCkuICBHREIgdXNlcyB0aGlzIGluZm8gdG8gbG9jYXRlIHRoZQotCSAgICAgcmVncywgdXNpbmcgbWlub3IgdHJpY2tlcnkgdG8gZ2V0IGFyb3VuZCB0aGUKLQkgICAgIG9mZnNldC1vci1hYnNvbHV0ZS1hZGRyIHByb2JsZW0uICovCi0KLQkgIGNoZWFkLmNzX3ZhZGRyID0gMCAtIChiZmRfdm1hKSB1LT51X2FyMDsKLQotCi0gICAgICAgICAgc2VjbmFtZSA9ICIucmVnIjsKLSAgICAgICAgICBmbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgICAgICAgICBicmVhazsKLQljYXNlIENPUkVTX1BSRUdJT046CQkJLyogQSBwcm9ncmFtIHJlZ2lvbiwgbWFwIGl0ICovCi0JICBzd2l0Y2ggKGNoZWFkLmNzX3guY3N4X3ByZWcuY3N4cF9ydHlwKQotCSAgICB7Ci0JICAgIGNhc2UgUFRfREFUQToKLQkgICAgICBzZWNuYW1lID0gIi5kYXRhIjsgIAkvKiBEYXRhIHJlZ2lvbi4gICAgICAgICAgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQVF9TVEFDSzoKLQkgICAgICBzZWNuYW1lID0gIi5zdGFjayI7IAkvKiBTdGFjayByZWdpb24uICAgICAgICAgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQVF9TSE1FTToKLQkgICAgICBzZWNuYW1lID0gIi5zaG1lbSI7IAkvKiBTaGFyZWQgbWVtb3J5ICAgICAgICAgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQVF9MSUJEQVQ6Ci0JICAgICAgc2VjbmFtZSA9ICIubGliZGF0IjsJLyogU2hhcmVkIGxpYnJhcnkgZGF0YSAgICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUFRfVjg2OgotCSAgICAgIHNlY25hbWUgPSAiLnZpcnQ4NiI7CS8qIFZpcnR1YWwgODA4NiBtb2RlICAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBUX1NIRklMOgotCSAgICAgIHNlY25hbWUgPSAiLm1tZmlsZSI7CS8qIE1lbW9yeSBtYXBwZWQgZmlsZSAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBUX1hEQVRBMDoKLQkgICAgICBzZWNuYW1lID0gIi5YZGF0MCI7IAkvKiBYRU5JWCBkYXRhIHJlZ2lvbiwgdmlydHVhbCAwICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgc2VjbmFtZSA9ICIiOwotCSAgICB9Ci0JICBmbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLQkgIGJyZWFrOwotCWNhc2UgQ09SRVNfUFJPQzoJCQkvKiBzdHJ1Y3QgcHJvYyAqLwotCWNhc2UgQ09SRVNfSVRJTUVSOgkJCS8qIGludGVydmFsIHRpbWVycyAqLwotCWNhc2UgQ09SRVNfU0NPVVRTTkFNRToJCQkvKiBzdHJ1Y3Qgc2NvdXRzbmFtZSAqLwotCSAgc2VjbmFtZSA9IE5VTEw7CS8qIElnbm9yZSB0aGVzZSAqLwotCSAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiVW5oYW5kbGVkIFNDTyBjb3JlIGZpbGUgc2VjdGlvbiB0eXBlICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlYWQuY3Nfc3R5cGUpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgIGlmIChzZWNuYW1lCi0JICAmJiAhbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsIGZsYWdzLAotCQkJCSAoYmZkX3NpemVfdHlwZSkgY2hlYWQuY3NfdnNpemUsCi0JCQkJIChiZmRfdm1hKSBjaGVhZC5jc192YWRkciwKLQkJCQkgKGZpbGVfcHRyKSBjaGVhZC5jc19zc2VlaykpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotCi19Ci0KLWNoYXIgKgotc2NvNV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKmNvbSA9IGFiZmQtPnRkYXRhLnNjbzVfY29yZV9kYXRhLT51LnVfY29tbTsKLSAgaWYgKCpjb20pCi0gICAgcmV0dXJuIGNvbTsKLSAgZWxzZQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKiBBUkdTVVNFRCAqLwotaW50Ci1zY281X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoaWdub3JlX2FiZmQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci17Ci0gIHJldHVybiAoKGlnbm9yZV9hYmZkLT50ZGF0YS5zY281X2NvcmVfZGF0YS0+dS51X3N5c2Fib3J0ICE9IDApIAotCSAgPyBpZ25vcmVfYWJmZC0+dGRhdGEuc2NvNV9jb3JlX2RhdGEtPnUudV9zeXNhYm9ydCAKLQkgIDogLTEpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotYm9vbGVhbgotc2NvNV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgcmV0dXJuIHRydWU7ICAgICAgICAgIC8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KLX0KLQotI2RlZmluZSBzY281X2NvcmVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIHNjbzVfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKLSNkZWZpbmUgc2NvNV9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgc2NvNV9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgc2NvNV9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIHNjbzVfY29yZV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgc2NvNV9jb3JlX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIHNjbzVfY29yZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHNjbzVfY29yZV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgc2NvNV9jb3JlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lIE5PX0dFVCAgKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZSBOT19QVVQgICgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUgTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgc2NvNV9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAic2NvNS1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0xJVFRMRSwgICAgICAgICAvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fTElUVExFLCAgICAgICAgIC8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgICAgICAgLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULCAgICAgIC8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsICAgICAgLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwgICAgICAvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULCAgICAgIC8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsICAgICAgLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwgICAgICAvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsICAgICAgICAgLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsICAgICAgICAgLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsICAgICAgICAgLyogYXJjaGl2ZSAqLwotICAgICBzY281X2NvcmVfZmlsZV9wICAgICAgCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0KLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoc2NvNSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHNjbzVfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgKFBUUikgMCAgICAgICAgICAgICAgICAgICAgIC8qIGJhY2tlbmRfZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC9zZWN0aW9uLmMgYi9iZmQvc2VjdGlvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODc3OGI1Li4wMDAwMDAwCi0tLSBhL2JmZC9zZWN0aW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc1ICswLDAgQEAKLS8qIE9iamVjdCBmaWxlICJzZWN0aW9uIiBzdXBwb3J0IGZvciB0aGUgQkZEIGxpYnJhcnkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCVNlY3Rpb25zCi0KLQlUaGUgcmF3IGRhdGEgY29udGFpbmVkIHdpdGhpbiBhIEJGRCBpcyBtYWludGFpbmVkIHRocm91Z2ggdGhlCi0Jc2VjdGlvbiBhYnN0cmFjdGlvbi4gIEEgc2luZ2xlIEJGRCBtYXkgaGF2ZSBhbnkgbnVtYmVyIG9mCi0Jc2VjdGlvbnMuICBJdCBrZWVwcyBob2xkIG9mIHRoZW0gYnkgcG9pbnRpbmcgdG8gdGhlIGZpcnN0OwotCWVhY2ggb25lIHBvaW50cyB0byB0aGUgbmV4dCBpbiB0aGUgbGlzdC4KLQotCVNlY3Rpb25zIGFyZSBzdXBwb3J0ZWQgaW4gQkZEIGluIDw8c2VjdGlvbi5jPj4uCi0KLUBtZW51Ci1AKiBTZWN0aW9uIElucHV0OjoKLUAqIFNlY3Rpb24gT3V0cHV0OjoKLUAqIHR5cGVkZWYgYXNlY3Rpb246OgotQCogc2VjdGlvbiBwcm90b3R5cGVzOjoKLUBlbmQgbWVudQotCi1JTk9ERQotU2VjdGlvbiBJbnB1dCwgU2VjdGlvbiBPdXRwdXQsIFNlY3Rpb25zLCBTZWN0aW9ucwotU1VCU0VDVElPTgotCVNlY3Rpb24gaW5wdXQKLQotCVdoZW4gYSBCRkQgaXMgb3BlbmVkIGZvciByZWFkaW5nLCB0aGUgc2VjdGlvbiBzdHJ1Y3R1cmVzIGFyZQotCWNyZWF0ZWQgYW5kIGF0dGFjaGVkIHRvIHRoZSBCRkQuCi0KLQlFYWNoIHNlY3Rpb24gaGFzIGEgbmFtZSB3aGljaCBkZXNjcmliZXMgdGhlIHNlY3Rpb24gaW4gdGhlCi0Jb3V0c2lkZSB3b3JsZC0tLWZvciBleGFtcGxlLCA8PGEub3V0Pj4gd291bGQgY29udGFpbiBhdCBsZWFzdAotCXRocmVlIHNlY3Rpb25zLCBjYWxsZWQgPDwudGV4dD4+LCA8PC5kYXRhPj4gYW5kIDw8LmJzcz4+LgotCi0JTmFtZXMgbmVlZCBub3QgYmUgdW5pcXVlOyBmb3IgZXhhbXBsZSBhIENPRkYgZmlsZSBtYXkgaGF2ZSBzZXZlcmFsCi0Jc2VjdGlvbnMgbmFtZWQgPDwuZGF0YT4+LgotCi0JU29tZXRpbWVzIGEgQkZEIHdpbGwgY29udGFpbiBtb3JlIHRoYW4gdGhlIGBgbmF0dXJhbCcnIG51bWJlciBvZgotCXNlY3Rpb25zLiBBIGJhY2sgZW5kIG1heSBhdHRhY2ggb3RoZXIgc2VjdGlvbnMgY29udGFpbmluZwotCWNvbnN0cnVjdG9yIGRhdGEsIG9yIGFuIGFwcGxpY2F0aW9uIG1heSBhZGQgYSBzZWN0aW9uICh1c2luZwotCTw8YmZkX21ha2Vfc2VjdGlvbj4+KSB0byB0aGUgc2VjdGlvbnMgYXR0YWNoZWQgdG8gYW4gYWxyZWFkeSBvcGVuCi0JQkZELiBGb3IgZXhhbXBsZSwgdGhlIGxpbmtlciBjcmVhdGVzIGFuIGV4dHJhIHNlY3Rpb24KLQk8PENPTU1PTj4+IGZvciBlYWNoIGlucHV0IGZpbGUncyBCRkQgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dAotCWNvbW1vbiBzdG9yYWdlLgotCi0JVGhlIHJhdyBkYXRhIGlzIG5vdCBuZWNlc3NhcmlseSByZWFkIGluIHdoZW4KLQl0aGUgc2VjdGlvbiBkZXNjcmlwdG9yIGlzIGNyZWF0ZWQuIFNvbWUgdGFyZ2V0cyBtYXkgbGVhdmUgdGhlCi0JZGF0YSBpbiBwbGFjZSB1bnRpbCBhIDw8YmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzPj4gY2FsbCBpcwotCW1hZGUuIE90aGVyIGJhY2sgZW5kcyBtYXkgcmVhZCBpbiBhbGwgdGhlIGRhdGEgYXQgb25jZS4gIEZvcgotCWV4YW1wbGUsIGFuIFMtcmVjb3JkIGZpbGUgaGFzIHRvIGJlIHJlYWQgb25jZSB0byBkZXRlcm1pbmUgdGhlCi0Jc2l6ZSBvZiB0aGUgZGF0YS4gQW4gSUVFRS02OTUgZmlsZSBkb2Vzbid0IGNvbnRhaW4gcmF3IGRhdGEgaW4KLQlzZWN0aW9ucywgYnV0IGRhdGEgYW5kIHJlbG9jYXRpb24gZXhwcmVzc2lvbnMgaW50ZXJtaXhlZCwgc28KLQl0aGUgZGF0YSBhcmVhIGhhcyB0byBiZSBwYXJzZWQgdG8gZ2V0IG91dCB0aGUgZGF0YSBhbmQKLQlyZWxvY2F0aW9ucy4KLQotSU5PREUKLVNlY3Rpb24gT3V0cHV0LCB0eXBlZGVmIGFzZWN0aW9uLCBTZWN0aW9uIElucHV0LCBTZWN0aW9ucwotCi1TVUJTRUNUSU9OCi0JU2VjdGlvbiBvdXRwdXQKLQotCVRvIHdyaXRlIGEgbmV3IG9iamVjdCBzdHlsZSBCRkQsIHRoZSB2YXJpb3VzIHNlY3Rpb25zIHRvIGJlCi0Jd3JpdHRlbiBoYXZlIHRvIGJlIGNyZWF0ZWQuIFRoZXkgYXJlIGF0dGFjaGVkIHRvIHRoZSBCRkQgaW4KLQl0aGUgc2FtZSB3YXkgYXMgaW5wdXQgc2VjdGlvbnM7IGRhdGEgaXMgd3JpdHRlbiB0byB0aGUKLQlzZWN0aW9ucyB1c2luZyA8PGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cz4+LgotCi0JQW55IHByb2dyYW0gdGhhdCBjcmVhdGVzIG9yIGNvbWJpbmVzIHNlY3Rpb25zIChlLmcuLCB0aGUgYXNzZW1ibGVyCi0JYW5kIGxpbmtlcikgbXVzdCB1c2UgdGhlIDw8YXNlY3Rpb24+PiBmaWVsZHMgPDxvdXRwdXRfc2VjdGlvbj4+IGFuZAotCTw8b3V0cHV0X29mZnNldD4+IHRvIGluZGljYXRlIHRoZSBmaWxlIHNlY3Rpb25zIHRvIHdoaWNoIGVhY2gKLQlzZWN0aW9uIG11c3QgYmUgd3JpdHRlbi4gIChJZiB0aGUgc2VjdGlvbiBpcyBiZWluZyBjcmVhdGVkIGZyb20KLQlzY3JhdGNoLCA8PG91dHB1dF9zZWN0aW9uPj4gc2hvdWxkIHByb2JhYmx5IHBvaW50IHRvIHRoZSBzZWN0aW9uCi0JaXRzZWxmIGFuZCA8PG91dHB1dF9vZmZzZXQ+PiBzaG91bGQgcHJvYmFibHkgYmUgemVyby4pCi0KLQlUaGUgZGF0YSB0byBiZSB3cml0dGVuIGNvbWVzIGZyb20gaW5wdXQgc2VjdGlvbnMgYXR0YWNoZWQKLQkodmlhIDw8b3V0cHV0X3NlY3Rpb24+PiBwb2ludGVycykgdG8KLQl0aGUgb3V0cHV0IHNlY3Rpb25zLiAgVGhlIG91dHB1dCBzZWN0aW9uIHN0cnVjdHVyZSBjYW4gYmUKLQljb25zaWRlcmVkIGEgZmlsdGVyIGZvciB0aGUgaW5wdXQgc2VjdGlvbjogdGhlIG91dHB1dCBzZWN0aW9uCi0JZGV0ZXJtaW5lcyB0aGUgdm1hIG9mIHRoZSBvdXRwdXQgZGF0YSBhbmQgdGhlIG5hbWUsIGJ1dCB0aGUKLQlpbnB1dCBzZWN0aW9uIGRldGVybWluZXMgdGhlIG9mZnNldCBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbiBvZgotCXRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4uCi0KLQlFLmcuLCB0byBjcmVhdGUgYSBzZWN0aW9uICJPIiwgc3RhcnRpbmcgYXQgMHgxMDAsIDB4MTIzIGxvbmcsCi0JY29udGFpbmluZyB0d28gc3Vic2VjdGlvbnMsICJBIiBhdCBvZmZzZXQgMHgwIChpLmUuLCBhdCB2bWEKLQkweDEwMCkgYW5kICJCIiBhdCBvZmZzZXQgMHgyMCAoaS5lLiwgYXQgdm1hIDB4MTIwKSB0aGUgPDxhc2VjdGlvbj4+Ci0Jc3RydWN0dXJlcyB3b3VsZCBsb29rIGxpa2U6Ci0KLXwgICBzZWN0aW9uIG5hbWUgICAgICAgICAgIkEiCi18ICAgICBvdXRwdXRfb2Zmc2V0ICAgMHgwMAotfCAgICAgc2l6ZSAgICAgICAgICAgIDB4MjAKLXwgICAgIG91dHB1dF9zZWN0aW9uIC0tLS0tLS0tLS0tPiAgc2VjdGlvbiBuYW1lICAgICJPIgotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICB2bWEgICAgICAgICAgICAgMHgxMDAKLXwgICBzZWN0aW9uIG5hbWUgICAgICAgICAgIkIiIHwgICAgc2l6ZSAgICAgICAgICAgIDB4MTIzCi18ICAgICBvdXRwdXRfb2Zmc2V0ICAgMHgyMCAgICB8Ci18ICAgICBzaXplICAgICAgICAgICAgMHgxMDMgICB8Ci18ICAgICBvdXRwdXRfc2VjdGlvbiAgLS0tLS0tLS18Ci0KLQotU1VCU0VDVElPTgotCUxpbmsgb3JkZXJzCi0KLQlUaGUgZGF0YSB3aXRoaW4gYSBzZWN0aW9uIGlzIHN0b3JlZCBpbiBhIEBkZm57bGlua19vcmRlcn0uCi0JVGhlc2UgYXJlIG11Y2ggbGlrZSB0aGUgZml4dXBzIGluIDw8Z2FzPj4uICBUaGUgbGlua19vcmRlcgotCWFic3RyYWN0aW9uIGFsbG93cyBhIHNlY3Rpb24gdG8gZ3JvdyBhbmQgc2hyaW5rIHdpdGhpbiBpdHNlbGYuCi0KLQlBIGxpbmtfb3JkZXIga25vd3MgaG93IGJpZyBpdCBpcywgYW5kIHdoaWNoIGlzIHRoZSBuZXh0Ci0JbGlua19vcmRlciBhbmQgd2hlcmUgdGhlIHJhdyBkYXRhIGZvciBpdCBpczsgaXQgYWxzbyBwb2ludHMgdG8KLQlhIGxpc3Qgb2YgcmVsb2NhdGlvbnMgd2hpY2ggYXBwbHkgdG8gaXQuCi0KLQlUaGUgbGlua19vcmRlciBpcyB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gcGVyZm9ybSByZWxheGluZyBvbgotCWZpbmFsIGNvZGUuICBUaGUgY29tcGlsZXIgY3JlYXRlcyBjb2RlIHdoaWNoIGlzIGFzIGJpZyBhcwotCW5lY2Vzc2FyeSB0byBtYWtlIGl0IHdvcmsgd2l0aG91dCByZWxheGluZywgYW5kIHRoZSB1c2VyIGNhbgotCXNlbGVjdCB3aGV0aGVyIHRvIHJlbGF4LiAgU29tZXRpbWVzIHJlbGF4aW5nIHRha2VzIGEgbG90IG9mCi0JdGltZS4gIFRoZSBsaW5rZXIgcnVucyBhcm91bmQgdGhlIHJlbG9jYXRpb25zIHRvIHNlZSBpZiBhbnkKLQlhcmUgYXR0YWNoZWQgdG8gZGF0YSB3aGljaCBjYW4gYmUgc2hydW5rLCBpZiBzbyBpdCBkb2VzIGl0IG9uCi0JYSBsaW5rX29yZGVyIGJ5IGxpbmtfb3JkZXIgYmFzaXMuCi0KLSovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotLyoKLURPQ0RECi1JTk9ERQotdHlwZWRlZiBhc2VjdGlvbiwgc2VjdGlvbiBwcm90b3R5cGVzLCBTZWN0aW9uIE91dHB1dCwgU2VjdGlvbnMKLVNVQlNFQ1RJT04KLQl0eXBlZGVmIGFzZWN0aW9uCi0KLQlIZXJlIGlzIHRoZSBzZWN0aW9uIHN0cnVjdHVyZToKLQotQ09ERV9GUkFHTUVOVAotLgotLnR5cGVkZWYgc3RydWN0IHNlYwotLnsKLS4gICAgICAgIHsqIFRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uOyB0aGUgbmFtZSBpc24ndCBhIGNvcHksIHRoZSBwb2ludGVyIGlzCi0uICAgICAgICB0aGUgc2FtZSBhcyB0aGF0IHBhc3NlZCB0byBiZmRfbWFrZV9zZWN0aW9uLiAqfQotLgotLiAgICBDT05TVCBjaGFyICpuYW1lOwotLgotLiAgICAgICAgeyogV2hpY2ggc2VjdGlvbiBpcyBpdDsgMC4ubnRoLiAgICAgICp9Ci0uCi0uICAgaW50IGluZGV4OwotLgotLiAgICAgICAgeyogVGhlIG5leHQgc2VjdGlvbiBpbiB0aGUgbGlzdCBiZWxvbmdpbmcgdG8gdGhlIEJGRCwgb3IgTlVMTC4gKn0KLS4KLS4gICAgc3RydWN0IHNlYyAqbmV4dDsKLS4KLS4gICAgICAgIHsqIFRoZSBmaWVsZCBmbGFncyBjb250YWlucyBhdHRyaWJ1dGVzIG9mIHRoZSBzZWN0aW9uLiBTb21lCi0uICAgICAgICAgICBmbGFncyBhcmUgcmVhZCBpbiBmcm9tIHRoZSBvYmplY3QgZmlsZSwgYW5kIHNvbWUgYXJlCi0uICAgICAgICAgICBzeW50aGVzaXplZCBmcm9tIG90aGVyIGluZm9ybWF0aW9uLiAgKn0KLS4KLS4gICAgZmxhZ3dvcmQgZmxhZ3M7Ci0uCi0uI2RlZmluZSBTRUNfTk9fRkxBR1MgICAweDAwMAotLgotLiAgICAgICAgeyogVGVsbHMgdGhlIE9TIHRvIGFsbG9jYXRlIHNwYWNlIGZvciB0aGlzIHNlY3Rpb24gd2hlbiBsb2FkaW5nLgotLiAgICAgICAgICAgVGhpcyBpcyBjbGVhciBmb3IgYSBzZWN0aW9uIGNvbnRhaW5pbmcgZGVidWcgaW5mb3JtYXRpb24KLS4gICAgICAgICAgIG9ubHkuICp9Ci0uI2RlZmluZSBTRUNfQUxMT0MgICAgICAweDAwMQotLgotLiAgICAgICAgeyogVGVsbHMgdGhlIE9TIHRvIGxvYWQgdGhlIHNlY3Rpb24gZnJvbSB0aGUgZmlsZSB3aGVuIGxvYWRpbmcuCi0uICAgICAgICAgICBUaGlzIGlzIGNsZWFyIGZvciBhIC5ic3Mgc2VjdGlvbi4gKn0KLS4jZGVmaW5lIFNFQ19MT0FEICAgICAgIDB4MDAyCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBjb250YWlucyBkYXRhIHN0aWxsIHRvIGJlIHJlbG9jYXRlZCwgc28gdGhlcmUgaXMKLS4gICAgICAgICAgIHNvbWUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0b28uICp9Ci0uI2RlZmluZSBTRUNfUkVMT0MgICAgICAweDAwNAotLgotLiNpZiAwICAgeyogT2Jzb2xldGUgPyAqfQotLiNkZWZpbmUgU0VDX0JBTElHTiAgICAgMHgwMDgKLS4jZW5kaWYKLS4KLS4gICAgICAgIHsqIEEgc2lnbmFsIHRvIHRoZSBPUyB0aGF0IHRoZSBzZWN0aW9uIGNvbnRhaW5zIHJlYWQgb25seQotLiAgICAgICAgICBkYXRhLiAqfQotLiNkZWZpbmUgU0VDX1JFQURPTkxZICAgMHgwMTAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvZGUgb25seS4gKn0KLS4jZGVmaW5lIFNFQ19DT0RFICAgICAgIDB4MDIwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBjb250YWlucyBkYXRhIG9ubHkuICp9Ci0uI2RlZmluZSBTRUNfREFUQSAgICAgICAweDA0MAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gd2lsbCByZXNpZGUgaW4gUk9NLiAqfQotLiNkZWZpbmUgU0VDX1JPTSAgICAgICAgMHgwODAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvbnN0cnVjdG9yIGluZm9ybWF0aW9uLiBUaGlzIHNlY3Rpb24KLS4gICAgICAgICAgIHR5cGUgaXMgdXNlZCBieSB0aGUgbGlua2VyIHRvIGNyZWF0ZSBsaXN0cyBvZiBjb25zdHJ1Y3RvcnMgYW5kCi0uICAgICAgICAgICBkZXN0cnVjdG9ycyB1c2VkIGJ5IDw8ZysrPj4uIFdoZW4gYSBiYWNrIGVuZCBzZWVzIGEgc3ltYm9sCi0uICAgICAgICAgICB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiBhIGNvbnN0cnVjdG9yIGxpc3QsIGl0IGNyZWF0ZXMgYSBuZXcKLS4gICAgICAgICAgIHNlY3Rpb24gZm9yIHRoZSB0eXBlIG9mIG5hbWUgKGUuZy4sIDw8X19DVE9SX0xJU1RfXz4+KSwgYXR0YWNoZXMKLS4gICAgICAgICAgIHRoZSBzeW1ib2wgdG8gaXQsIGFuZCBidWlsZHMgYSByZWxvY2F0aW9uLiBUbyBidWlsZCB0aGUgbGlzdHMKLS4gICAgICAgICAgIG9mIGNvbnN0cnVjdG9ycywgYWxsIHRoZSBsaW5rZXIgaGFzIHRvIGRvIGlzIGNhdGVuYXRlIGFsbCB0aGUKLS4gICAgICAgICAgIHNlY3Rpb25zIGNhbGxlZCA8PF9fQ1RPUl9MSVNUX18+PiBhbmQgcmVsb2NhdGUgdGhlIGRhdGEKLS4gICAgICAgICAgIGNvbnRhaW5lZCB3aXRoaW4gLSBleGFjdGx5IHRoZSBvcGVyYXRpb25zIGl0IHdvdWxkIHBlZm9ybSBvbgotLiAgICAgICAgICAgc3RhbmRhcmQgZGF0YS4gKn0KLS4jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUiAweDEwMAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gaXMgYSBjb25zdHJ1Y3RvciwgYW5kIHNob3VsZCBiZSBwbGFjZWQgYXQgdGhlCi0uICAgICAgICAgIGVuZCBvZiB0aGUgdGV4dCwgZGF0YSwgb3IgYnNzIHNlY3Rpb24oPykuICp9Ci0uI2RlZmluZSBTRUNfQ09OU1RSVUNUT1JfVEVYVCAweDExMDAKLS4jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9EQVRBIDB4MjEwMAotLiNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SX0JTUyAgMHgzMTAwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBoYXMgY29udGVudHMgLSBhIGRhdGEgc2VjdGlvbiBjb3VsZCBiZQotLiAgICAgICAgICAgPDxTRUNfQUxMT0M+PiB8IDw8U0VDX0hBU19DT05URU5UUz4+OyBhIGRlYnVnIHNlY3Rpb24gY291bGQgYmUKLS4gICAgICAgICAgIDw8U0VDX0hBU19DT05URU5UUz4+ICp9Ci0uI2RlZmluZSBTRUNfSEFTX0NPTlRFTlRTIDB4MjAwCi0uCi0uICAgICAgICB7KiBBbiBpbnN0cnVjdGlvbiB0byB0aGUgbGlua2VyIHRvIG5vdCBvdXRwdXQgdGhlIHNlY3Rpb24KLS4gICAgICAgICAgIGV2ZW4gaWYgaXQgaGFzIGluZm9ybWF0aW9uIHdoaWNoIHdvdWxkIG5vcm1hbGx5IGJlIHdyaXR0ZW4uICp9Ci0uI2RlZmluZSBTRUNfTkVWRVJfTE9BRCAweDQwMAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gaXMgYSBDT0ZGIHNoYXJlZCBsaWJyYXJ5IHNlY3Rpb24uICBUaGlzIGZsYWcgaXMKLS4gICAgICAgICAgIG9ubHkgZm9yIHRoZSBsaW5rZXIuICBJZiB0aGlzIHR5cGUgb2Ygc2VjdGlvbiBhcHBlYXJzIGluCi0uICAgICAgICAgICB0aGUgaW5wdXQgZmlsZSwgdGhlIGxpbmtlciBtdXN0IGNvcHkgaXQgdG8gdGhlIG91dHB1dCBmaWxlCi0uICAgICAgICAgICB3aXRob3V0IGNoYW5naW5nIHRoZSB2bWEgb3Igc2l6ZS4gIEZJWE1FOiBBbHRob3VnaCB0aGlzCi0uICAgICAgICAgICB3YXMgb3JpZ2luYWxseSBpbnRlbmRlZCB0byBiZSBnZW5lcmFsLCBpdCByZWFsbHkgaXMgQ09GRgotLiAgICAgICAgICAgc3BlY2lmaWMgKGFuZCB0aGUgZmxhZyB3YXMgcmVuYW1lZCB0byBpbmRpY2F0ZSB0aGlzKS4gIEl0Ci0uICAgICAgICAgICBtaWdodCBiZSBjbGVhbmVyIHRvIGhhdmUgc29tZSBtb3JlIGdlbmVyYWwgbWVjaGFuaXNtIHRvCi0uICAgICAgICAgICBhbGxvdyB0aGUgYmFjayBlbmQgdG8gY29udHJvbCB3aGF0IHRoZSBsaW5rZXIgZG9lcyB3aXRoCi0uICAgICAgICAgICBzZWN0aW9ucy4gKn0KLS4jZGVmaW5lIFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZIDB4ODAwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBjb250YWlucyBjb21tb24gc3ltYm9scyAoc3ltYm9scyBtYXkgYmUgZGVmaW5lZAotLiAgICAgICAgICAgbXVsdGlwbGUgdGltZXMsIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCBpcyB0aGUgYW1vdW50IG9mCi0uICAgICAgICAgICBzcGFjZSBpdCByZXF1aXJlcywgYW5kIHRoZSBsYXJnZXN0IHN5bWJvbCB2YWx1ZSBpcyB0aGUgb25lCi0uICAgICAgICAgICB1c2VkKS4gIE1vc3QgdGFyZ2V0cyBoYXZlIGV4YWN0bHkgb25lIG9mIHRoZXNlICh3aGljaCB3ZQotLgkgICAgdHJhbnNsYXRlIHRvIGJmZF9jb21fc2VjdGlvbl9wdHIpLCBidXQgRUNPRkYgaGFzIHR3by4gKn0KLS4jZGVmaW5lIFNFQ19JU19DT01NT04gMHg4MDAwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBjb250YWlucyBvbmx5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEZvcgotLiAgICAgICAgICAgZXhhbXBsZSwgdGhpcyBpcyBzZXQgZm9yIEVMRiAuZGVidWcgYW5kIC5zdGFiIHNlY3Rpb25zLgotLiAgICAgICAgICAgc3RyaXAgdGVzdHMgdGhpcyBmbGFnIHRvIHNlZSBpZiBhIHNlY3Rpb24gY2FuIGJlCi0uICAgICAgICAgICBkaXNjYXJkZWQuICp9Ci0uI2RlZmluZSBTRUNfREVCVUdHSU5HIDB4MTAwMDAKLS4KLS4gICAgICAgIHsqIFRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24gYXJlIGhlbGQgaW4gbWVtb3J5IHBvaW50ZWQgdG8KLS4gICAgICAgICAgIGJ5IHRoZSBjb250ZW50cyBmaWVsZC4gIFRoaXMgaXMgY2hlY2tlZCBieQotLiAgICAgICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzLCBhbmQgdGhlIGRhdGEgaXMgcmV0cmlldmVkIGZyb20KLS4gICAgICAgICAgIG1lbW9yeSBpZiBhcHByb3ByaWF0ZS4gICp9Ci0uI2RlZmluZSBTRUNfSU5fTUVNT1JZIDB4MjAwMDAKLS4KLS4gICAgICAgIHsqIFRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24gYXJlIHRvIGJlIGV4Y2x1ZGVkIGJ5IHRoZQotLgkgICAgbGlua2VyIGZvciBleGVjdXRhYmxlIGFuZCBzaGFyZWQgb2JqZWN0cyB1bmxlc3MgdGhvc2UKLS4JICAgIG9iamVjdHMgYXJlIHRvIGJlIGZ1cnRoZXIgcmVsb2NhdGVkLiAgKn0KLS4jZGVmaW5lIFNFQ19FWENMVURFIDB4NDAwMDAKLS4KLS4JeyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgdG8gYmUgc29ydGVkIGJ5IHRoZQotLgkgICBiYXNlZCBvbiB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgaW4gdGhlIGFzc29jaWF0ZWQgc3ltYm9sCi0uCSAgIHRhYmxlLiAgKn0KLS4jZGVmaW5lIFNFQ19TT1JUX0VOVFJJRVMgMHg4MDAwMAotLgotLgl7KiBXaGVuIGxpbmtpbmcsIGR1cGxpY2F0ZSBzZWN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIHNob3VsZCBiZQotLgkgICBkaXNjYXJkZWQsIHJhdGhlciB0aGFuIGJlaW5nIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgc2VjdGlvbiBhcwotLgkgICBpcyB1c3VhbGx5IGRvbmUuICBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IGNvbW1vbiBzeW1ib2xzIGFyZQotLgkgICBoYW5kbGVkLiAgU2VlIFNFQ19MSU5LX0RVUExJQ0FURVMgYmVsb3cuICAqfQotLiNkZWZpbmUgU0VDX0xJTktfT05DRSAweDEwMDAwMAotLgotLgl7KiBJZiBTRUNfTElOS19PTkNFIGlzIHNldCwgdGhpcyBiaXRmaWVsZCBkZXNjcmliZXMgaG93IHRoZSBsaW5rZXIKLS4JICAgc2hvdWxkIGhhbmRsZSBkdXBsaWNhdGUgc2VjdGlvbnMuICAqfQotLiNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFUyAweDYwMDAwMAotLgotLgl7KiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgZHVwbGljYXRlCi0uCSAgIHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSBzaG91bGQgc2ltcGx5IGJlIGRpc2NhcmRlZC4gKn0KLS4jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRCAweDAKLS4KLS4JeyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IHRoZSBsaW5rZXIKLS4JICAgc2hvdWxkIHdhcm4gaWYgdGhlcmUgYXJlIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMsIGFsdGhvdWdoCi0uCSAgIGl0IHNob3VsZCBzdGlsbCBvbmx5IGxpbmsgb25lIGNvcHkuICAqfQotLiNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19PTkVfT05MWSAweDIwMDAwMAotLgotLgl7KiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgdGhlIGxpbmtlcgotLgkgICBzaG91bGQgd2FybiBpZiBhbnkgZHVwbGljYXRlIHNlY3Rpb25zIGFyZSBhIGRpZmZlcmVudCBzaXplLiAgKn0KLS4jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFIDB4NDAwMDAwCi0uCi0uCXsqIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0uCSAgIHNob3VsZCB3YXJuIGlmIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMgY29udGFpbiBkaWZmZXJlbnQKLS4JICAgY29udGVudHMuICAqfQotLiNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTIDB4NjAwMDAwCi0uCi0uCXsqIFRoaXMgc2VjdGlvbiB3YXMgY3JlYXRlZCBieSB0aGUgbGlua2VyIGFzIHBhcnQgb2YgZHluYW1pYwotLgkgICByZWxvY2F0aW9uIG9yIG90aGVyIGFyY2FuZSBwcm9jZXNzaW5nLiAgSXQgaXMgc2tpcHBlZCB3aGVuCi0uCSAgIGdvaW5nIHRocm91Z2ggdGhlIGZpcnN0LXBhc3Mgb3V0cHV0LCB0cnVzdGluZyB0aGF0IHNvbWVvbmUKLS4JICAgZWxzZSB1cCB0aGUgbGluZSB3aWxsIHRha2UgY2FyZSBvZiBpdCBsYXRlci4gICp9Ci0uI2RlZmluZSBTRUNfTElOS0VSX0NSRUFURUQgMHg4MDAwMDAKLS4KLS4JeyogVGhpcyBzZWN0aW9uIHNob3VsZCBub3QgYmUgc3ViamVjdCB0byBnYXJiYWdlIGNvbGxlY3Rpb24uICAqfQotLiNkZWZpbmUgU0VDX0tFRVAgMHgxMDAwMDAwCi0uCi0uCXsqICBFbmQgb2Ygc2VjdGlvbiBmbGFncy4gICp9Ci0uCi0uCXsqIFNvbWUgaW50ZXJuYWwgcGFja2VkIGJvb2xlYW4gZmllbGRzLiAgKn0KLS4KLS4JeyogU2VlIHRoZSB2bWEgZmllbGQuICAqfQotLgl1bnNpZ25lZCBpbnQgdXNlcl9zZXRfdm1hIDogMTsKLS4KLS4JeyogV2hldGhlciByZWxvY2F0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgKn0KLS4JdW5zaWduZWQgaW50IHJlbG9jX2RvbmUgOiAxOwotLgotLgl7KiBBIG1hcmsgZmxhZyB1c2VkIGJ5IHNvbWUgb2YgdGhlIGxpbmtlciBiYWNrZW5kcy4gICp9Ci0uCXVuc2lnbmVkIGludCBsaW5rZXJfbWFyayA6IDE7Ci0uCi0uCXsqIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBsaW5rZXIgYmFja2VuZHMgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4gICp9Ci0uCXVuc2lnbmVkIGludCBnY19tYXJrIDogMTsKLS4KLS4JeyogRW5kIG9mIGludGVybmFsIHBhY2tlZCBib29sZWFuIGZpZWxkcy4gICp9Ci0uCi0uICAgICAgIHsqICBUaGUgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiAtIHdoZXJlIGl0IHdpbGwgYmUKLS4gICAgICAgICAgIGF0IHJ1biB0aW1lLiAgVGhlIHN5bWJvbHMgYXJlIHJlbG9jYXRlZCBhZ2FpbnN0IHRoaXMuICBUaGUKLS4JICAgIHVzZXJfc2V0X3ZtYSBmbGFnIGlzIG1haW50YWluZWQgYnkgYmZkOyBpZiBpdCdzIG5vdCBzZXQsIHRoZQotLgkgICAgYmFja2VuZCBjYW4gYXNzaWduIGFkZHJlc3NlcyAoZm9yIGV4YW1wbGUsIGluIDw8YS5vdXQ+Piwgd2hlcmUKLS4JICAgIHRoZSBkZWZhdWx0IGFkZHJlc3MgZm9yIDw8LmRhdGE+PiBpcyBkZXBlbmRlbnQgb24gdGhlIHNwZWNpZmljCi0uCSAgICB0YXJnZXQgYW5kIHZhcmlvdXMgZmxhZ3MpLiAgKn0KLS4KLS4gICBiZmRfdm1hIHZtYTsKLS4KLS4gICAgICAgeyogIFRoZSBsb2FkIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gLSB3aGVyZSBpdCB3b3VsZCBiZSBpbiBhCi0uICAgICAgICAgICByb20gaW1hZ2U7IHJlYWxseSBvbmx5IHVzZWQgZm9yIHdyaXRpbmcgc2VjdGlvbiBoZWFkZXIKLS4JICAgIGluZm9ybWF0aW9uLiAqfQotLgotLiAgIGJmZF92bWEgbG1hOwotLgotLiAgICAgICAgeyogVGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gaW4gYnl0ZXMsIGFzIGl0IHdpbGwgYmUgb3V0cHV0LgotLiAgICAgICAgICAgY29udGFpbnMgYSB2YWx1ZSBldmVuIGlmIHRoZSBzZWN0aW9uIGhhcyBubyBjb250ZW50cyAoZS5nLiwgdGhlCi0uICAgICAgICAgICBzaXplIG9mIDw8LmJzcz4+KS4gVGhpcyB3aWxsIGJlIGZpbGxlZCBpbiBhZnRlciByZWxvY2F0aW9uICp9Ci0uCi0uICAgYmZkX3NpemVfdHlwZSBfY29va2VkX3NpemU7Ci0uCi0uICAgICAgICB7KiBUaGUgb3JpZ2luYWwgc2l6ZSBvbiBkaXNrIG9mIHRoZSBzZWN0aW9uLCBpbiBieXRlcy4gIE5vcm1hbGx5IHRoaXMKLS4JICAgIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBzaXplLCBidXQgaWYgc29tZSByZWxheGluZyBoYXMKLS4JICAgIGJlZW4gZG9uZSwgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgYmlnZ2VyLiAgKn0KLS4KLS4gICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLS4KLS4gICAgICAgIHsqIElmIHRoaXMgc2VjdGlvbiBpcyBnb2luZyB0byBiZSBvdXRwdXQsIHRoZW4gdGhpcyB2YWx1ZSBpcyB0aGUKLS4gICAgICAgICAgIG9mZnNldCBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgaW5wdXQKLS4gICAgICAgICAgIHNlY3Rpb24uIEUuZy4sIGlmIHRoaXMgd2FzIGdvaW5nIHRvIHN0YXJ0IGF0IHRoZSAxMDB0aCBieXRlIGluCi0uICAgICAgICAgICB0aGUgb3V0cHV0IHNlY3Rpb24sIHRoaXMgdmFsdWUgd291bGQgYmUgMTAwLiAqfQotLgotLiAgIGJmZF92bWEgb3V0cHV0X29mZnNldDsKLS4KLS4gICAgICAgIHsqIFRoZSBvdXRwdXQgc2VjdGlvbiB0aHJvdWdoIHdoaWNoIHRvIG1hcCBvbiBvdXRwdXQuICp9Ci0uCi0uICAgc3RydWN0IHNlYyAqb3V0cHV0X3NlY3Rpb247Ci0uCi0uICAgICAgICB7KiBUaGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IG9mIHRoZSBzZWN0aW9uLCBhcyBhbiBleHBvbmVudCBvZiAyIC0KLS4gICAgICAgICAgIGUuZy4sIDMgYWxpZ25zIHRvIDJeMyAob3IgOCkuICp9Ci0uCi0uICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLS4KLS4gICAgICAgIHsqIElmIGFuIGlucHV0IHNlY3Rpb24sIGEgcG9pbnRlciB0byBhIHZlY3RvciBvZiByZWxvY2F0aW9uCi0uICAgICAgICAgICByZWNvcmRzIGZvciB0aGUgZGF0YSBpbiB0aGlzIHNlY3Rpb24uICp9Ci0uCi0uICAgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5ICpyZWxvY2F0aW9uOwotLgotLiAgICAgICAgeyogSWYgYW4gb3V0cHV0IHNlY3Rpb24sIGEgcG9pbnRlciB0byBhIHZlY3RvciBvZiBwb2ludGVycyB0bwotLiAgICAgICAgICAgcmVsb2NhdGlvbiByZWNvcmRzIGZvciB0aGUgZGF0YSBpbiB0aGlzIHNlY3Rpb24uICp9Ci0uCi0uICAgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5ICoqb3JlbG9jYXRpb247Ci0uCi0uICAgICAgICB7KiBUaGUgbnVtYmVyIG9mIHJlbG9jYXRpb24gcmVjb3JkcyBpbiBvbmUgb2YgdGhlIGFib3ZlICAqfQotLgotLiAgIHVuc2lnbmVkIHJlbG9jX2NvdW50OwotLgotLiAgICAgICAgeyogSW5mb3JtYXRpb24gYmVsb3cgaXMgYmFjayBlbmQgc3BlY2lmaWMgLSBhbmQgbm90IGFsd2F5cyB1c2VkCi0uICAgICAgICAgICBvciB1cGRhdGVkLiAgKn0KLS4KLS4gICAgICAgIHsqIEZpbGUgcG9zaXRpb24gb2Ygc2VjdGlvbiBkYXRhICAgICp9Ci0uCi0uICAgZmlsZV9wdHIgZmlsZXBvczsKLS4KLS4gICAgICAgIHsqIEZpbGUgcG9zaXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvICp9Ci0uCi0uICAgZmlsZV9wdHIgcmVsX2ZpbGVwb3M7Ci0uCi0uICAgICAgICB7KiBGaWxlIHBvc2l0aW9uIG9mIGxpbmUgZGF0YSAgICAgICAqfQotLgotLiAgIGZpbGVfcHRyIGxpbmVfZmlsZXBvczsKLS4KLS4gICAgICAgIHsqIFBvaW50ZXIgdG8gZGF0YSBmb3IgYXBwbGljYXRpb25zICp9Ci0uCi0uICAgUFRSIHVzZXJkYXRhOwotLgotLiAgICAgICAgeyogSWYgdGhlIFNFQ19JTl9NRU1PUlkgZmxhZyBpcyBzZXQsIHRoaXMgcG9pbnRzIHRvIHRoZSBhY3R1YWwKLS4gICAgICAgICAgIGNvbnRlbnRzLiAgKn0KLS4gICB1bnNpZ25lZCBjaGFyICpjb250ZW50czsKLS4KLS4gICAgICAgIHsqIEF0dGFjaGVkIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uICp9Ci0uCi0uICAgYWxlbnQgKmxpbmVubzsKLS4KLS4gICAgICAgIHsqIE51bWJlciBvZiBsaW5lIG51bWJlciByZWNvcmRzICAgKn0KLS4KLS4gICB1bnNpZ25lZCBpbnQgbGluZW5vX2NvdW50OwotLgotLiAgICAgICAgeyogV2hlbiBhIHNlY3Rpb24gaXMgYmVpbmcgb3V0cHV0LCB0aGlzIHZhbHVlIGNoYW5nZXMgYXMgbW9yZQotLiAgICAgICAgICAgbGluZW51bWJlcnMgYXJlIHdyaXR0ZW4gb3V0ICp9Ci0uCi0uICAgZmlsZV9wdHIgbW92aW5nX2xpbmVfZmlsZXBvczsKLS4KLS4gICAgICAgIHsqIFdoYXQgdGhlIHNlY3Rpb24gbnVtYmVyIGlzIGluIHRoZSB0YXJnZXQgd29ybGQgICp9Ci0uCi0uICAgaW50IHRhcmdldF9pbmRleDsKLS4KLS4gICBQVFIgdXNlZF9ieV9iZmQ7Ci0uCi0uICAgICAgICB7KiBJZiB0aGlzIGlzIGEgY29uc3RydWN0b3Igc2VjdGlvbiB0aGVuIGhlcmUgaXMgYSBsaXN0IG9mIHRoZQotLiAgICAgICAgICAgcmVsb2NhdGlvbnMgY3JlYXRlZCB0byByZWxvY2F0ZSBpdGVtcyB3aXRoaW4gaXQuICp9Ci0uCi0uICAgc3RydWN0IHJlbGVudF9jaGFpbiAqY29uc3RydWN0b3JfY2hhaW47Ci0uCi0uICAgICAgICB7KiBUaGUgQkZEIHdoaWNoIG93bnMgdGhlIHNlY3Rpb24uICp9Ci0uCi0uICAgYmZkICpvd25lcjsKLS4KLS4JIHsqIEEgc3ltYm9sIHdoaWNoIHBvaW50cyBhdCB0aGlzIHNlY3Rpb24gb25seSAqfQotLiAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLS4gICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9sX3B0cl9wdHI7Ci0uCi0uICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX2hlYWQ7Ci0uICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX3RhaWw7Ci0ufSBhc2VjdGlvbiA7Ci0uCi0uICAgIHsqIFRoZXNlIHNlY3Rpb25zIGFyZSBnbG9iYWwsIGFuZCBhcmUgbWFuYWdlZCBieSBCRkQuICBUaGUgYXBwbGljYXRpb24KLS4gICAgICAgYW5kIHRhcmdldCBiYWNrIGVuZCBhcmUgbm90IHBlcm1pdHRlZCB0byBjaGFuZ2UgdGhlIHZhbHVlcyBpbgotLgl0aGVzZSBzZWN0aW9ucy4gIE5ldyBjb2RlIHNob3VsZCB1c2UgdGhlIHNlY3Rpb25fcHRyIG1hY3JvcyByYXRoZXIKLS4gICAgICAgdGhhbiByZWZlcnJpbmcgZGlyZWN0bHkgdG8gdGhlIGNvbnN0IHNlY3Rpb25zLiAgVGhlIGNvbnN0IHNlY3Rpb25zCi0uICAgICAgIG1heSBldmVudHVhbGx5IHZhbmlzaC4gICp9Ci0uI2RlZmluZSBCRkRfQUJTX1NFQ1RJT05fTkFNRSAiKkFCUyoiCi0uI2RlZmluZSBCRkRfVU5EX1NFQ1RJT05fTkFNRSAiKlVORCoiCi0uI2RlZmluZSBCRkRfQ09NX1NFQ1RJT05fTkFNRSAiKkNPTSoiCi0uI2RlZmluZSBCRkRfSU5EX1NFQ1RJT05fTkFNRSAiKklORCoiCi0uCi0uICAgIHsqIHRoZSBhYnNvbHV0ZSBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9hYnNfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9hYnNfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2Fic19zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX2Fic19zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF9hYnNfc2VjdGlvbl9wdHIpCi0uICAgIHsqIFBvaW50ZXIgdG8gdGhlIHVuZGVmaW5lZCBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF91bmRfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF91bmRfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX3VuZF9zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX3VuZF9zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF91bmRfc2VjdGlvbl9wdHIpCi0uICAgIHsqIFBvaW50ZXIgdG8gdGhlIGNvbW1vbiBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9jb21fc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9jb21fc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2NvbV9zZWN0aW9uKQotLiAgICB7KiBQb2ludGVyIHRvIHRoZSBpbmRpcmVjdCBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9pbmRfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9pbmRfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2luZF9zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX2luZF9zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF9pbmRfc2VjdGlvbl9wdHIpCi0uCi0uZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfYWJzX3N5bWJvbDsKLS5leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF9jb21fc3ltYm9sOwotLmV4dGVybiBjb25zdCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICogY29uc3QgYmZkX3VuZF9zeW1ib2w7Ci0uZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfaW5kX3N5bWJvbDsKLS4jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyhzZWN0aW9uKSBcCi0uICAgICAoc2VjdGlvbi0+cmVsb2NfZG9uZSA/IChhYm9ydCgpLDEpOiAoc2VjdGlvbiktPl9yYXdfc2l6ZSkKLS4jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX2FmdGVyX3JlbG9jKHNlY3Rpb24pIFwKLS4gICAgICgoc2VjdGlvbi0+cmVsb2NfZG9uZSkgPyAoc2VjdGlvbiktPl9jb29rZWRfc2l6ZTogKGFib3J0KCksMSkpCi0qLwotCi0vKiBUaGVzZSBzeW1ib2xzIGFyZSBnbG9iYWwsIG5vdCBzcGVjaWZpYyB0byBhbnkgQkZELiAgVGhlcmVmb3JlLCBhbnl0aGluZwotICAgdGhhdCB0cmllcyB0byBjaGFuZ2UgdGhlbSBpcyBicm9rZW4sIGFuZCBzaG91bGQgYmUgcmVwYWlyZWQuICAqLwotc3RhdGljIGNvbnN0IGFzeW1ib2wgZ2xvYmFsX3N5bXNbXSA9Ci17Ci0gLyogdGhlX2JmZCwgbmFtZSwgdmFsdWUsIGF0dHIsIHNlY3Rpb24gWywgdWRhdGFdICovCi0gIHswLCBCRkRfQ09NX1NFQ1RJT05fTkFNRSwgMCwgQlNGX1NFQ1RJT05fU1lNLCAoYXNlY3Rpb24gKikgJmJmZF9jb21fc2VjdGlvbn0sCi0gIHswLCBCRkRfVU5EX1NFQ1RJT05fTkFNRSwgMCwgQlNGX1NFQ1RJT05fU1lNLCAoYXNlY3Rpb24gKikgJmJmZF91bmRfc2VjdGlvbn0sCi0gIHswLCBCRkRfQUJTX1NFQ1RJT05fTkFNRSwgMCwgQlNGX1NFQ1RJT05fU1lNLCAoYXNlY3Rpb24gKikgJmJmZF9hYnNfc2VjdGlvbn0sCi0gIHswLCBCRkRfSU5EX1NFQ1RJT05fTkFNRSwgMCwgQlNGX1NFQ1RJT05fU1lNLCAoYXNlY3Rpb24gKikgJmJmZF9pbmRfc2VjdGlvbn0sCi19OwotCi0jZGVmaW5lIFNURF9TRUNUSU9OKFNFQywgRkxBR1MsIFNZTSwgTkFNRSwgSURYKQlcCi0gIGNvbnN0IGFzeW1ib2wgKiBjb25zdCBTWU0gPSAoYXN5bWJvbCAqKSAmZ2xvYmFsX3N5bXNbSURYXTsgXAotICBjb25zdCBhc2VjdGlvbiBTRUMgPSBcCi0gICAgeyBOQU1FLCAwLCAwLCBGTEFHUywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgKGFzZWN0aW9uICopICZTRUMsIFwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBcCi0gICAgICAoYXN5bWJvbCAqKSAmZ2xvYmFsX3N5bXNbSURYXSwgKGFzeW1ib2wgKiopICZTWU0sIDAsIDAgfQotCi1TVERfU0VDVElPTiAoYmZkX2NvbV9zZWN0aW9uLCBTRUNfSVNfQ09NTU9OLCBiZmRfY29tX3N5bWJvbCwKLQkgICAgIEJGRF9DT01fU0VDVElPTl9OQU1FLCAwKTsKLVNURF9TRUNUSU9OIChiZmRfdW5kX3NlY3Rpb24sIDAsIGJmZF91bmRfc3ltYm9sLCBCRkRfVU5EX1NFQ1RJT05fTkFNRSwgMSk7Ci1TVERfU0VDVElPTiAoYmZkX2Fic19zZWN0aW9uLCAwLCBiZmRfYWJzX3N5bWJvbCwgQkZEX0FCU19TRUNUSU9OX05BTUUsIDIpOwotU1REX1NFQ1RJT04gKGJmZF9pbmRfc2VjdGlvbiwgMCwgYmZkX2luZF9zeW1ib2wsIEJGRF9JTkRfU0VDVElPTl9OQU1FLCAzKTsKLSN1bmRlZiBTVERfU0VDVElPTgotCi0vKgotRE9DREQKLUlOT0RFCi1zZWN0aW9uIHByb3RvdHlwZXMsICAsIHR5cGVkZWYgYXNlY3Rpb24sIFNlY3Rpb25zCi1TVUJTRUNUSU9OCi0JU2VjdGlvbiBwcm90b3R5cGVzCi0KLVRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoZSBzZWN0aW9uIGhhbmRsaW5nIHBhcnQgb2YgQkZELgotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLQotU1lOT1BTSVMKLQlhc2VjdGlvbiAqYmZkX2dldF9zZWN0aW9uX2J5X25hbWUoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLQlSdW4gdGhyb3VnaCBAdmFye2FiZmR9IGFuZCByZXR1cm4gdGhlIG9uZSBvZiB0aGUKLQk8PGFzZWN0aW9uPj5zIHdob3NlIG5hbWUgbWF0Y2hlcyBAdmFye25hbWV9LCBvdGhlcndpc2UgPDxOVUxMPj4uCi0JQHhyZWZ7U2VjdGlvbnN9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotCVRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBzcGVjaWFsIGNhc2VzOyB0aGUgbm9ybWFsIHdheSB0byBwcm9jZXNzCi0JYWxsIHNlY3Rpb25zIG9mIGEgZ2l2ZW4gbmFtZSBpcyB0byB1c2UgPDxiZmRfbWFwX292ZXJfc2VjdGlvbnM+PiBhbmQKLQk8PHN0cmNtcD4+IG9uIHRoZSBuYW1lIChvciBiZXR0ZXIgeWV0LCBiYXNlIGl0IG9uIHRoZSBzZWN0aW9uIGZsYWdzCi0Jb3Igc29tZXRoaW5nIGVsc2UpIGZvciBlYWNoIHNlY3Rpb24uCi0qLwotCi1hc2VjdGlvbiAqCi1iZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqc2VjdDsKLQotICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdCAhPSBOVUxMOyBzZWN0ID0gc2VjdC0+bmV4dCkKLSAgICBpZiAoIXN0cmNtcCAoc2VjdC0+bmFtZSwgbmFtZSkpCi0gICAgICByZXR1cm4gc2VjdDsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5Ci0KLVNZTk9QU0lTCi0JYXNlY3Rpb24gKmJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheShiZmQgKmFiZmQsIENPTlNUIGNoYXIgKm5hbWUpOwotCi1ERVNDUklQVElPTgotCUNyZWF0ZSBhIG5ldyBlbXB0eSBzZWN0aW9uIGNhbGxlZCBAdmFye25hbWV9Ci0JYW5kIGF0dGFjaCBpdCB0byB0aGUgZW5kIG9mIHRoZSBjaGFpbiBvZiBzZWN0aW9ucyBmb3IgdGhlCi0JQkZEIEB2YXJ7YWJmZH0uIEFuIGF0dGVtcHQgdG8gY3JlYXRlIGEgc2VjdGlvbiB3aXRoIGEgbmFtZSB3aGljaAotCWlzIGFscmVhZHkgaW4gdXNlIHJldHVybnMgaXRzIHBvaW50ZXIgd2l0aG91dCBjaGFuZ2luZyB0aGUKLQlzZWN0aW9uIGNoYWluLgotCi0JSXQgaGFzIHRoZSBmdW5ueSBuYW1lIHNpbmNlIHRoaXMgaXMgdGhlIHdheSBpdCB1c2VkIHRvIGJlCi0JYmVmb3JlIGl0IHdhcyByZXdyaXR0ZW4uLi4uCi0KLQlQb3NzaWJsZSBlcnJvcnMgYXJlOgotCW8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtCi0JSWYgb3V0cHV0IGhhcyBhbHJlYWR5IHN0YXJ0ZWQgZm9yIHRoaXMgQkZELgotCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotCUlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgotCi0qLwotCi0KLWFzZWN0aW9uICoKLWJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICAgIH0KLSAgcmV0dXJuIHNlYzsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkKLQotU1lOT1BTSVMKLQlhc2VjdGlvbiAqYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLSAgIENyZWF0ZSBhIG5ldyBlbXB0eSBzZWN0aW9uIGNhbGxlZCBAdmFye25hbWV9IGFuZCBhdHRhY2ggaXQgdG8gdGhlIGVuZCBvZgotICAgdGhlIGNoYWluIG9mIHNlY3Rpb25zIGZvciBAdmFye2FiZmR9LiAgQ3JlYXRlIGEgbmV3IHNlY3Rpb24gZXZlbiBpZiB0aGVyZQotICAgaXMgYWxyZWFkeSBhIHNlY3Rpb24gd2l0aCB0aGF0IG5hbWUuCi0KLSAgIFJldHVybiA8PE5VTEw+PiBhbmQgc2V0IDw8YmZkX2Vycm9yPj4gb24gZXJyb3I7IHBvc3NpYmxlIGVycm9ycyBhcmU6Ci0gICBvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLSBJZiBvdXRwdXQgaGFzIGFscmVhZHkgc3RhcnRlZCBmb3IgQHZhcnthYmZkfS4KLSAgIG8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLSBJZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KLSovCi0KLXNlY19wdHIKLWJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotICBhc2VjdGlvbiAqKnByZXYgPSAmYWJmZC0+c2VjdGlvbnM7Ci0gIGFzZWN0aW9uICpzZWN0ID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICB3aGlsZSAoc2VjdCkKLSAgICB7Ci0gICAgICBwcmV2ID0gJnNlY3QtPm5leHQ7Ci0gICAgICBzZWN0ID0gc2VjdC0+bmV4dDsKLSAgICB9Ci0KLSAgbmV3c2VjdCA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChuZXdzZWN0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbmV3c2VjdC0+bmFtZSA9IG5hbWU7Ci0gIG5ld3NlY3QtPmluZGV4ID0gYWJmZC0+c2VjdGlvbl9jb3VudCsrOwotICBuZXdzZWN0LT5mbGFncyA9IFNFQ19OT19GTEFHUzsKLQotICBuZXdzZWN0LT51c2VyZGF0YSA9IE5VTEw7Ci0gIG5ld3NlY3QtPmNvbnRlbnRzID0gTlVMTDsKLSAgbmV3c2VjdC0+bmV4dCA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBuZXdzZWN0LT5yZWxvY2F0aW9uID0gKGFyZWxlbnQgKikgTlVMTDsKLSAgbmV3c2VjdC0+cmVsb2NfY291bnQgPSAwOwotICBuZXdzZWN0LT5saW5lX2ZpbGVwb3MgPSAwOwotICBuZXdzZWN0LT5vd25lciA9IGFiZmQ7Ci0KLSAgLyogQ3JlYXRlIGEgc3ltYm9sIHdob3Mgb25seSBqb2IgaXMgdG8gcG9pbnQgdG8gdGhpcyBzZWN0aW9uLiBUaGlzIGlzCi0gICAgIHVzZWZ1bCBmb3IgdGhpbmdzIGxpa2UgcmVsb2NzIHdoaWNoIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZSBvZiBhCi0gICAgIHNlY3Rpb24uICAqLwotICBuZXdzZWN0LT5zeW1ib2wgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAobmV3c2VjdC0+c3ltYm9sID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ld3NlY3QtPnN5bWJvbC0+bmFtZSA9IG5hbWU7Ci0gIG5ld3NlY3QtPnN5bWJvbC0+dmFsdWUgPSAwOwotICBuZXdzZWN0LT5zeW1ib2wtPnNlY3Rpb24gPSBuZXdzZWN0OwotICBuZXdzZWN0LT5zeW1ib2wtPmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCi0gIG5ld3NlY3QtPnN5bWJvbF9wdHJfcHRyID0gJm5ld3NlY3QtPnN5bWJvbDsKLQotICBpZiAoQkZEX1NFTkQgKGFiZmQsIF9uZXdfc2VjdGlvbl9ob29rLCAoYWJmZCwgbmV3c2VjdCkpICE9IHRydWUpCi0gICAgewotICAgICAgZnJlZSAobmV3c2VjdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgKnByZXYgPSBuZXdzZWN0OwotICByZXR1cm4gbmV3c2VjdDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2Vfc2VjdGlvbgotCi1TWU5PUFNJUwotCWFzZWN0aW9uICpiZmRfbWFrZV9zZWN0aW9uKGJmZCAqLCBDT05TVCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLSAgIExpa2UgPDxiZmRfbWFrZV9zZWN0aW9uX2FueXdheT4+LCBidXQgcmV0dXJuIDw8TlVMTD4+ICh3aXRob3V0IGNhbGxpbmcKLSAgIGJmZF9zZXRfZXJyb3IgKCkpIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNlY3Rpb24gY2hhaW4gaWYgdGhlcmUgaXMgYWxyZWFkeSBhCi0gICBzZWN0aW9uIG5hbWVkIEB2YXJ7bmFtZX0uICBJZiB0aGVyZSBpcyBhbiBlcnJvciwgcmV0dXJuIDw8TlVMTD4+IGFuZCBzZXQKLSAgIDw8YmZkX2Vycm9yPj4uCi0qLwotCi1hc2VjdGlvbiAqCi1iZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpzZWN0ID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgQkZEX0FCU19TRUNUSU9OX05BTUUpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgfQotICBpZiAoc3RyY21wIChuYW1lLCBCRkRfQ09NX1NFQ1RJT05fTkFNRSkgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLSAgICB9Ci0gIGlmIChzdHJjbXAgKG5hbWUsIEJGRF9VTkRfU0VDVElPTl9OQU1FKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgIH0KLQotICBpZiAoc3RyY21wIChuYW1lLCBCRkRfSU5EX1NFQ1RJT05fTkFNRSkgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX2luZF9zZWN0aW9uX3B0cjsKLSAgICB9Ci0KLSAgd2hpbGUgKHNlY3QpCi0gICAgewotICAgICAgaWYgKCFzdHJjbXAgKHNlY3QtPm5hbWUsIG5hbWUpKQotCXJldHVybiBOVUxMOwotICAgICAgc2VjdCA9IHNlY3QtPm5leHQ7Ci0gICAgfQotCi0gIC8qIFRoZSBuYW1lIGlzIG5vdCBhbHJlYWR5IHVzZWQ7IGdvIGFoZWFkIGFuZCBtYWtlIGEgbmV3IHNlY3Rpb24uICAqLwotICByZXR1cm4gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfc2VjdGlvbl9mbGFncwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9zZWN0aW9uX2ZsYWdzKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgZmxhZ3dvcmQgZmxhZ3MpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgc2VjdGlvbiBAdmFye3NlY30gaW4gdGhlIEJGRAotCUB2YXJ7YWJmZH0gdG8gdGhlIHZhbHVlIEB2YXJ7ZmxhZ3N9LiBSZXR1cm4gPDx0cnVlPj4gb24gc3VjY2VzcywKLQk8PGZhbHNlPj4gb24gZXJyb3IuIFBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotCi0JbyA8PGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbj4+IC0KLQlUaGUgc2VjdGlvbiBjYW5ub3QgaGF2ZSBvbmUgb3IgbW9yZSBvZiB0aGUgYXR0cmlidXRlcwotCXJlcXVlc3RlZC4gRm9yIGV4YW1wbGUsIGEgLmJzcyBzZWN0aW9uIGluIDw8YS5vdXQ+PiBtYXkgbm90Ci0JaGF2ZSB0aGUgPDxTRUNfSEFTX0NPTlRFTlRTPj4gZmllbGQgc2V0LgotCi0qLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbiwgZmxhZ3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSNpZiAwCi0gIC8qIElmIHlvdSB0cnkgdG8gY29weSBhIHRleHQgc2VjdGlvbiBmcm9tIGFuIGlucHV0IGZpbGUgKHdoZXJlIGl0Ci0gICAgIGhhcyB0aGUgU0VDX0NPREUgZmxhZyBzZXQpIHRvIGFuIG91dHB1dCBmaWxlLCB0aGlzIGxvc2VzIGJpZyBpZgotICAgICB0aGUgYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoYWJmZCkgZG9lc24ndCBoYXZlIHRoZSBTRUNfQ09ERQotICAgICBzZXQgLSB3aGljaCBpdCBkb2Vzbid0LCBhdCBsZWFzdCBub3QgZm9yIGEub3V0LiAgRklYTUUgKi8KLQotICBpZiAoKGZsYWdzICYgYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoYWJmZCkpICE9IGZsYWdzKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgc2VjdGlvbi0+ZmxhZ3MgPSBmbGFnczsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21hcF9vdmVyX3NlY3Rpb25zCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfbWFwX292ZXJfc2VjdGlvbnMoYmZkICphYmZkLAotCQkJCSAgIHZvaWQgKCpmdW5jKShiZmQgKmFiZmQsCi0JCQkJCQlhc2VjdGlvbiAqc2VjdCwKLQkJCQkJCVBUUiBvYmopLAotCQkJCSAgIFBUUiBvYmopOwotCi1ERVNDUklQVElPTgotCUNhbGwgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIEB2YXJ7ZnVuY30gZm9yIGVhY2ggc2VjdGlvbgotCWF0dGFjaGVkIHRvIHRoZSBCRkQgQHZhcnthYmZkfSwgcGFzc2luZyBAdmFye29ian0gYXMgYW4KLQlhcmd1bWVudC4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFzIGlmIGJ5Ci0KLXwJZnVuYyhhYmZkLCB0aGVfc2VjdGlvbiwgb2JqKTsKLQotCVRoaXMgaXMgdGhlIHByZWZlcmVkIG1ldGhvZCBmb3IgaXRlcmF0aW5nIG92ZXIgc2VjdGlvbnM7IGFuCi0JYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gdXNlIGEgbG9vcDoKLQotfAkgICBzZWN0aW9uICpwOwotfAkgICBmb3IgKHAgPSBhYmZkLT5zZWN0aW9uczsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLXwJICAgICAgZnVuYyhhYmZkLCBwLCAuLi4pCi0KLQotKi8KLQotLypWQVJBUkdTMiovCi12b2lkCi1iZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIG9wZXJhdGlvbiwgdXNlcl9zdG9yYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHZvaWQgKCpvcGVyYXRpb24pIFBBUkFNUyAoKGJmZCAqIGFiZmQsIGFzZWN0aW9uICogc2VjdCwgUFRSIG9iaikpOwotICAgICBQVFIgdXNlcl9zdG9yYWdlOwotewotICBhc2VjdGlvbiAqc2VjdDsKLSAgdW5zaWduZWQgaW50IGkgPSAwOwotCi0gIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0ICE9IE5VTEw7IGkrKywgc2VjdCA9IHNlY3QtPm5leHQpCi0gICAgKCpvcGVyYXRpb24pIChhYmZkLCBzZWN0LCB1c2VyX3N0b3JhZ2UpOwotCi0gIGlmIChpICE9IGFiZmQtPnNlY3Rpb25fY291bnQpCS8qIERlYnVnZ2luZyAqLwotICAgIGFib3J0ICgpOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfc2VjdGlvbl9zaXplCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X3NlY3Rpb25fc2l6ZShiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMsIGJmZF9zaXplX3R5cGUgdmFsKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgQHZhcntzZWN9IHRvIHRoZSBzaXplIEB2YXJ7dmFsfS4gSWYgdGhlIG9wZXJhdGlvbiBpcwotCW9rLCB0aGVuIDw8dHJ1ZT4+IGlzIHJldHVybmVkLCBlbHNlIDw8ZmFsc2U+Pi4KLQotCVBvc3NpYmxlIGVycm9yIHJldHVybnM6Ci0JbyA8PGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbj4+IC0KLQlXcml0aW5nIGhhcyBzdGFydGVkIHRvIHRoZSBCRkQsIHNvIHNldHRpbmcgdGhlIHNpemUgaXMgaW52YWxpZC4KLQotKi8KLQotYm9vbGVhbgotYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHB0ciwgdmFsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgcHRyOwotICAgICBiZmRfc2l6ZV90eXBlIHZhbDsKLXsKLSAgLyogT25jZSB5b3UndmUgc3RhcnRlZCB3cml0aW5nIHRvIGFueSBzZWN0aW9uIHlvdSBjYW5ub3QgY3JlYXRlIG9yIGNoYW5nZQotICAgICB0aGUgc2l6ZSBvZiBhbnkgb3RoZXJzLiAqLwotCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHB0ci0+X2Nvb2tlZF9zaXplID0gdmFsOwotICBwdHItPl9yYXdfc2l6ZSA9IHZhbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgICAgICAgIChiZmQgKmFiZmQsCi0gICAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLSAgICAgICAgIFBUUiBkYXRhLAotICAgICAgICAgZmlsZV9wdHIgb2Zmc2V0LAotICAgICAgICAgYmZkX3NpemVfdHlwZSBjb3VudCk7Ci0KLQotREVTQ1JJUFRJT04KLQlTZXRzIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBAdmFye3NlY3Rpb259IGluIEJGRAotCUB2YXJ7YWJmZH0gdG8gdGhlIGRhdGEgc3RhcnRpbmcgaW4gbWVtb3J5IGF0IEB2YXJ7ZGF0YX0uIFRoZQotCWRhdGEgaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHNlY3Rpb24gc3RhcnRpbmcgYXQgb2Zmc2V0Ci0JQHZhcntvZmZzZXR9IGZvciBAdmFye2NvdW50fSBieXRlcy4KLQotCi0KLQlOb3JtYWxseSA8PHRydWU+PiBpcyByZXR1cm5lZCwgZWxzZSA8PGZhbHNlPj4uIFBvc3NpYmxlIGVycm9yCi0JcmV0dXJucyBhcmU6Ci0JbyA8PGJmZF9lcnJvcl9ub19jb250ZW50cz4+IC0KLQlUaGUgb3V0cHV0IHNlY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGUgPDxTRUNfSEFTX0NPTlRFTlRTPj4KLQlhdHRyaWJ1dGUsIHNvIG5vdGhpbmcgY2FuIGJlIHdyaXR0ZW4gdG8gaXQuCi0JbyBhbmQgc29tZSBtb3JlIHRvbwotCi0JVGhpcyByb3V0aW5lIGlzIGZyb250IGVuZCB0byB0aGUgYmFjayBlbmQgZnVuY3Rpb24KLQk8PF9iZmRfc2V0X3NlY3Rpb25fY29udGVudHM+Pi4KLQotCi0qLwotCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX25vdyhhYmZkLHNlYykgXAotKHNlYy0+cmVsb2NfZG9uZSBcCi0gPyBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9hZnRlcl9yZWxvYyAoc2VjKSBcCi0gOiBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYykpCi0KLWJvb2xlYW4KLWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgYmZkX3NpemVfdHlwZSBzejsKLQotICBpZiAoIShiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3Rpb24pICYgU0VDX0hBU19DT05URU5UUykpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2NvbnRlbnRzKTsKLSAgICAgIHJldHVybiAoZmFsc2UpOwotICAgIH0KLQotICBpZiAob2Zmc2V0IDwgMCkKLSAgICB7Ci0gICAgYmFkX3ZhbDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgc3ogPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9ub3cgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoKGJmZF9zaXplX3R5cGUpIG9mZnNldCA+IHN6Ci0gICAgICB8fCBjb3VudCA+IHN6Ci0gICAgICB8fCBvZmZzZXQgKyBjb3VudCA+IHN6KQotICAgIGdvdG8gYmFkX3ZhbDsKLQotICBzd2l0Y2ggKGFiZmQtPmRpcmVjdGlvbikKLSAgICB7Ci0gICAgY2FzZSByZWFkX2RpcmVjdGlvbjoKLSAgICBjYXNlIG5vX2RpcmVjdGlvbjoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlIHdyaXRlX2RpcmVjdGlvbjoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBib3RoX2RpcmVjdGlvbjoKLSAgICAgIC8qIEZpbGUgaXMgb3BlbmVkIGZvciB1cGRhdGUuIGBvdXRwdXRfaGFzX2JlZ3VuJyBzb21lIHRpbWUgYWdvIHdoZW4KLQkgICB0aGUgZmlsZSB3YXMgY3JlYXRlZC4gIERvIG5vdCByZWNvbXB1dGUgc2VjdGlvbnMgc2l6ZXMgb3IgYWxpZ25tZW50cwotCSAgIGluIF9iZmRfc2V0X3NlY3Rpb25fY29udGVudC4gICovCi0gICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2V0X3NlY3Rpb25fY29udGVudHMsCi0JCShhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkpKQotICAgIHsKLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgICAgICAgKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIFBUUiBsb2NhdGlvbiwKLSAgICAgICAgIGZpbGVfcHRyIG9mZnNldCwgYmZkX3NpemVfdHlwZSBjb3VudCk7Ci0KLURFU0NSSVBUSU9OCi0JUmVhZCBkYXRhIGZyb20gQHZhcntzZWN0aW9ufSBpbiBCRkQgQHZhcnthYmZkfQotCWludG8gbWVtb3J5IHN0YXJ0aW5nIGF0IEB2YXJ7bG9jYXRpb259LiBUaGUgZGF0YSBpcyByZWFkIGF0IGFuCi0Jb2Zmc2V0IG9mIEB2YXJ7b2Zmc2V0fSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgc2VjdGlvbiwKLQlhbmQgaXMgcmVhZCBmb3IgQHZhcntjb3VudH0gYnl0ZXMuCi0KLQlJZiB0aGUgY29udGVudHMgb2YgYSBjb25zdHJ1Y3RvciB3aXRoIHRoZSA8PFNFQ19DT05TVFJVQ1RPUj4+Ci0JZmxhZyBzZXQgYXJlIHJlcXVlc3RlZCBvciBpZiB0aGUgc2VjdGlvbiBkb2VzIG5vdCBoYXZlIHRoZQotCTw8U0VDX0hBU19DT05URU5UUz4+IGZsYWcgc2V0LCB0aGVuIHRoZSBAdmFye2xvY2F0aW9ufSBpcyBmaWxsZWQKLQl3aXRoIHplcm9lcy4gSWYgbm8gZXJyb3JzIG9jY3VyLCA8PHRydWU+PiBpcyByZXR1cm5lZCwgZWxzZQotCTw8ZmFsc2U+Pi4KLQotCi0KLSovCi1ib29sZWFuCi1iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3o7Ci0KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHsKLSAgICAgIG1lbXNldCAobG9jYXRpb24sIDAsICh1bnNpZ25lZCkgY291bnQpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChvZmZzZXQgPCAwKQotICAgIHsKLSAgICBiYWRfdmFsOgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBFdmVuIGlmIHJlbG9jX2RvbmUgaXMgdHJ1ZSwgdGhpcyBmdW5jdGlvbiByZWFkcyB1bnJlbG9jYXRlZAotICAgICBjb250ZW50cywgc28gd2Ugd2FudCB0aGUgcmF3IHNpemUuICAqLwotICBzeiA9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgaWYgKChiZmRfc2l6ZV90eXBlKSBvZmZzZXQgPiBzeiB8fCBjb3VudCA+IHN6IHx8IG9mZnNldCArIGNvdW50ID4gc3opCi0gICAgZ290byBiYWRfdmFsOwotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIC8qIERvbid0IGJvdGhlci4gICovCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0gICAgewotICAgICAgbWVtc2V0IChsb2NhdGlvbiwgMCwgKHVuc2lnbmVkKSBjb3VudCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgbWVtY3B5IChsb2NhdGlvbiwgc2VjdGlvbi0+Y29udGVudHMgKyBvZmZzZXQsIChzaXplX3QpIGNvdW50KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICByZXR1cm4gQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMsCi0JCSAgIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEoYmZkICppYmZkLCBhc2VjdGlvbiAqaXNlYywgYmZkICpvYmZkLCBhc2VjdGlvbiAqb3NlYyk7Ci0KLURFU0NSSVBUSU9OCi0JQ29weSBwcml2YXRlIHNlY3Rpb24gaW5mb3JtYXRpb24gZnJvbSBAdmFye2lzZWN9IGluIHRoZSBCRkQKLQlAdmFye2liZmR9IHRvIHRoZSBzZWN0aW9uIEB2YXJ7b3NlY30gaW4gdGhlIEJGRCBAdmFye29iZmR9LgotCVJldHVybiA8PHRydWU+PiBvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb24gZXJyb3IuICBQb3NzaWJsZSBlcnJvcgotCXJldHVybnMgYXJlOgotCi0JbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCi0JTm90IGVub3VnaCBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEgZm9yIEB2YXJ7b3NlY30uCi0KLS4jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikgXAotLiAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSwgXAotLgkJKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikpCi0qLwotCi0vKgotRlVOQ1RJT04KLQlfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQKLQotU1lOT1BTSVMKLQl2b2lkIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dAotCShhc2VjdGlvbiAqc2VjdGlvbik7Ci0KLURFU0NSSVBUSU9OCi0JUmVtb3ZlIEB2YXJ7c2VjdGlvbn0gZnJvbSB0aGUgb3V0cHV0LiAgSWYgdGhlIG91dHB1dCBzZWN0aW9uIGJlY29tZXMKLQllbXB0eSwgcmVtb3ZlIGl0IGZyb20gdGhlIG91dHB1dCBiZmQuCi0qLwotdm9pZAotX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKQotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgYXNlY3Rpb24gKipzcHAsICpvczsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwLCAqcHA7Ci0KLSAgb3MgPSBzLT5vdXRwdXRfc2VjdGlvbjsKLSAgZm9yIChwID0gb3MtPmxpbmtfb3JkZXJfaGVhZCwgcHAgPSBOVUxMOyBwICE9IE5VTEw7IHBwID0gcCwgcCA9IHAtPm5leHQpCi0gICAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKLQkmJiBwLT51LmluZGlyZWN0LnNlY3Rpb24gPT0gcykKLSAgICAgIHsKLQkvKiBFeGNpc2UgdGhlIGlucHV0IHNlY3Rpb24uICAqLwotCWlmIChwcCkKLQkgIHBwLT5uZXh0ID0gcC0+bmV4dDsKLQllbHNlCi0JICBvcy0+bGlua19vcmRlcl9oZWFkID0gcC0+bmV4dDsKLQlpZiAoIXAtPm5leHQpCi0JICBvcy0+bGlua19vcmRlcl90YWlsID0gcHA7Ci0KLQlpZiAoIW9zLT5saW5rX29yZGVyX2hlYWQpCi0JICB7Ci0JICAgIC8qIEV4Y2lzZSB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgICBmb3IgKHNwcCA9ICZvcy0+b3duZXItPnNlY3Rpb25zOyAqc3BwOyBzcHAgPSAmKCpzcHApLT5uZXh0KQotCSAgICAgIGlmICgqc3BwID09IG9zKQotCQl7Ci0JCSAgKnNwcCA9IG9zLT5uZXh0OwotCQkgIG9zLT5vd25lci0+c2VjdGlvbl9jb3VudC0tOwotCQkgIGJyZWFrOwotCQl9Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICB9Ci19CmRpZmYgLS1naXQgYS9iZmQvc29tLmMgYi9iZmQvc29tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMWZhYzAuLjAwMDAwMDAKLS0tIGEvYmZkL3NvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjI2MyArMCwwIEBACi0vKiBiZmQgYmFjay1lbmQgZm9yIEhQIFBBLVJJU0MgU09NIG9iamVjdHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKLSAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFCU0QpIHx8IGRlZmluZWQgKEhPU1RfSFBQQU9TRikgfHwgZGVmaW5lZChIT1NUX0hQUEFNUEVJWCkKLQotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgInNvbS5oIgotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8bWFjaGluZS9yZWcuaD4KLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLS8qIE1hZ2ljIG5vdCBkZWZpbmVkIGluIHN0YW5kYXJkIEhQLVVYIGhlYWRlciBmaWxlcyB1bnRpbCA4LjAgKi8KLQotI2lmbmRlZiBDUFVfUEFfUklTQzFfMAotI2RlZmluZSBDUFVfUEFfUklTQzFfMCAweDIwQgotI2VuZGlmIC8qIENQVV9QQV9SSVNDMV8wICovCi0KLSNpZm5kZWYgQ1BVX1BBX1JJU0MxXzEKLSNkZWZpbmUgQ1BVX1BBX1JJU0MxXzEgMHgyMTAKLSNlbmRpZiAvKiBDUFVfUEFfUklTQzFfMSAqLwotCi0jaWZuZGVmIENQVV9QQV9SSVNDMl8wCi0jZGVmaW5lIENQVV9QQV9SSVNDMl8wIDB4MjE0Ci0jZW5kaWYgLyogQ1BVX1BBX1JJU0MyXzAgKi8KLQotI2lmbmRlZiBfUEFfUklTQzFfMF9JRAotI2RlZmluZSBfUEFfUklTQzFfMF9JRCBDUFVfUEFfUklTQzFfMAotI2VuZGlmIC8qIF9QQV9SSVNDMV8wX0lEICovCi0KLSNpZm5kZWYgX1BBX1JJU0MxXzFfSUQKLSNkZWZpbmUgX1BBX1JJU0MxXzFfSUQgQ1BVX1BBX1JJU0MxXzEKLSNlbmRpZiAvKiBfUEFfUklTQzFfMV9JRCAqLwotCi0jaWZuZGVmIF9QQV9SSVNDMl8wX0lECi0jZGVmaW5lIF9QQV9SSVNDMl8wX0lEIENQVV9QQV9SSVNDMl8wCi0jZW5kaWYgLyogX1BBX1JJU0MyXzBfSUQgKi8KLQotI2lmbmRlZiBfUEFfUklTQ19NQVhJRAotI2RlZmluZSBfUEFfUklTQ19NQVhJRAkweDJGRgotI2VuZGlmIC8qIF9QQV9SSVNDX01BWElEICovCi0KLSNpZm5kZWYgX1BBX1JJU0NfSUQKLSNkZWZpbmUgX1BBX1JJU0NfSUQoX19tX251bSkJCVwKLSAgICAoKChfX21fbnVtKSA9PSBfUEFfUklTQzFfMF9JRCkgfHwJXAotICAgICAoKF9fbV9udW0pID49IF9QQV9SSVNDMV8xX0lEICYmIChfX21fbnVtKSA8PSBfUEFfUklTQ19NQVhJRCkpCi0jZW5kaWYgLyogX1BBX1JJU0NfSUQgKi8KLQotCi0vKiBISVVYIGluIGl0J3MgaW5maW5pdGUgc3R1cGlkaXR5IGNoYW5nZWQgdGhlIG5hbWVzIGZvciBzZXZlcmFsICJ3ZWxsCi0gICBrbm93biIgY29uc3RhbnRzLiAgV29yayBhcm91bmQgc3VjaCBicmFpbmRhbWFnZS4gIFRyeSB0aGUgSFBVWCB2ZXJzaW9uCi0gICBmaXJzdCwgdGhlbiB0aGUgSElVWCB2ZXJzaW9uLCBhbmQgZmluYWxseSBwcm92aWRlIGEgZGVmYXVsdC4gICovCi0jaWZkZWYgSFBVWF9BVVhfSUQKLSNkZWZpbmUgRVhFQ19BVVhfSUQgSFBVWF9BVVhfSUQKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKEVYRUNfQVVYX0lEKSAmJiBkZWZpbmVkIChISVVYX0FVWF9JRCkKLSNkZWZpbmUgRVhFQ19BVVhfSUQgSElVWF9BVVhfSUQKLSNlbmRpZgotCi0jaWZuZGVmIEVYRUNfQVVYX0lECi0jZGVmaW5lIEVYRUNfQVVYX0lEIDAKLSNlbmRpZgotCi0vKiBTaXplIChpbiBjaGFycykgb2YgdGhlIHRlbXBvcmFyeSBidWZmZXJzIHVzZWQgZHVyaW5nIGZpeHVwIGFuZCBzdHJpbmcKLSAgIHRhYmxlIHdyaXRlcy4gICAqLwotICAgCi0jZGVmaW5lIFNPTV9UTVBfQlVGU0laRSA4MTkyCi0KLS8qIFNpemUgb2YgdGhlIGhhc2ggdGFibGUgaW4gYXJjaGl2ZXMuICAqLwotI2RlZmluZSBTT01fTFNUX0hBU0hfU0laRSAzMQotCi0vKiBNYXggbnVtYmVyIG9mIFNPTXMgdG8gYmUgZm91bmQgaW4gYW4gYXJjaGl2ZS4gICovCi0jZGVmaW5lIFNPTV9MU1RfTU9EVUxFX0xJTUlUIDEwMjQKLQotLyogR2VuZXJpYyBhbGlnbm1lbnQgbWFjcm8uICAqLwotI2RlZmluZSBTT01fQUxJR04odmFsLCBhbGlnbm1lbnQpIFwKLSAgKCgodmFsKSArIChhbGlnbm1lbnQpIC0gMSkgJiB+KChhbGlnbm1lbnQpIC0gMSkpCi0KLS8qIFNPTSBhbGxvd3MgYW55IG9uZSBvZiB0aGUgZm91ciBwcmV2aW91cyByZWxvY2F0aW9ucyB0byBiZSByZXVzZWQKLSAgIHdpdGggYSAiUl9QUkVWX0ZJWFVQIiByZWxvY2F0aW9uIGVudHJ5LiAgU2luY2UgUl9QUkVWX0ZJWFVQCi0gICByZWxvY2F0aW9ucyBhcmUgYWx3YXlzIGEgc2luZ2xlIGJ5dGUsIHVzaW5nIGEgUl9QUkVWX0ZJWFVQIGluc3RlYWQKLSAgIG9mIHNvbWUgbXVsdGktYnl0ZSByZWxvY2F0aW9uIG1ha2VzIG9iamVjdCBmaWxlcyBzbWFsbGVyLiAKLQotICAgTm90ZSBvbmUgc2lkZSBlZmZlY3Qgb2YgdXNpbmcgYSBSX1BSRVZfRklYVVAgaXMgdGhlIHJlbG9jYXRpb24gdGhhdAotICAgaXMgYmVpbmcgcmVwZWF0ZWQgbW92ZXMgdG8gdGhlIGZyb250IG9mIHRoZSBxdWV1ZS4gICovCi1zdHJ1Y3QgcmVsb2NfcXVldWUKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgKnJlbG9jOwotICAgIHVuc2lnbmVkIGludCBzaXplOwotICB9IHJlbG9jX3F1ZXVlWzRdOwotCi0vKiBUaGlzIGZ1bGx5IGRlc2NyaWJlcyB0aGUgc3ltYm9sIHR5cGVzIHdoaWNoIG1heSBiZSBhdHRhY2hlZCB0bwotICAgYW4gRVhQT1JUIG9yIElNUE9SVCBkaXJlY3RpdmUuICBPbmx5IFNPTSB1c2VzIHRoaXMgZm9ybWF0aW9uCi0gICAoRUxGIGhhcyBubyBuZWVkIGZvciBpdCkuICAqLwotdHlwZWRlZiBlbnVtCi17Ci0gIFNZTUJPTF9UWVBFX1VOS05PV04sCi0gIFNZTUJPTF9UWVBFX0FCU09MVVRFLAotICBTWU1CT0xfVFlQRV9DT0RFLAotICBTWU1CT0xfVFlQRV9EQVRBLAotICBTWU1CT0xfVFlQRV9FTlRSWSwKLSAgU1lNQk9MX1RZUEVfTUlMTElDT0RFLAotICBTWU1CT0xfVFlQRV9QTEFCRUwsCi0gIFNZTUJPTF9UWVBFX1BSSV9QUk9HLAotICBTWU1CT0xfVFlQRV9TRUNfUFJPRywKLX0gcGFfc3ltYm9sX3R5cGU7Ci0KLXN0cnVjdCBzZWN0aW9uX3RvX3R5cGUKLXsKLSAgY2hhciAqc2VjdGlvbjsKLSAgY2hhciB0eXBlOwotfTsKLQotLyogQXNzb3J0ZWQgc3ltYm9sIGluZm9ybWF0aW9uIHRoYXQgbmVlZHMgdG8gYmUgZGVyaXZlZCBmcm9tIHRoZSBCRkQgc3ltYm9sCi0gICBhbmQvb3IgdGhlIEJGRCBiYWNrZW5kIHByaXZhdGUgc3ltYm9sIGRhdGEuICAqLwotc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvCi17Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfdHlwZTsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9zY29wZTsKLSAgdW5zaWduZWQgaW50IGFyZ19yZWxvYzsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9pbmZvOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX3ZhbHVlOwotICB1bnNpZ25lZCBpbnQgcHJpdl9sZXZlbDsKLX07Ci0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi0KLXN0YXRpYyBib29sZWFuIHNvbV9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKiBzb21fb2JqZWN0X3NldHVwIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgIHN0cnVjdCBoZWFkZXIgKiwKLQkJCQkJCSAgICBzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyICosCi0JCQkJCQkgICAgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gc2V0dXBfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBoZWFkZXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKiBzb21fb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9zbHVycF9zdHJpbmdfdGFibGUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc29tX3NsdXJwX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgc29tX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHNvbV9jYW5vbmljYWxpemVfcmVsb2MgUEFSQU1TICgoYmZkICosIHNlY19wdHIsCi0JCQkJCSAgICBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgbG9uZyBzb21fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHNvbV9zZXRfcmVsb2NfaW5mbyBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCwKLQkJCQkJCWFyZWxlbnQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJCWFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHNvbV9zbHVycF9yZWxvY190YWJsZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICAgICAgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotc3RhdGljIGxvbmcgc29tX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyBhc3ltYm9sICogc29tX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzb21fcHJpbnRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJICAgICAgYXN5bWJvbCAqLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9uZXdfc2VjdGlvbl9ob29rIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAotCQkJCQkJCSAgYmZkICosIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJCSAgYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotI2RlZmluZSBzb21fYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIHNvbV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9zZXRfc2VjdGlvbl9jb250ZW50cyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAotCQkJCQkJIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fZ2V0X3NlY3Rpb25fY29udGVudHMgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwKLQkJCQkJCSBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc29tX3NldF9hcmNoX21hY2ggUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKLQkJCQkJICB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fZmluZF9uZWFyZXN0X2xpbmUgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosCi0JCQkJCSAgICAgIGFzeW1ib2wgKiosIGJmZF92bWEsCi0JCQkJCSAgICAgIENPTlNUIGNoYXIgKiosCi0JCQkJCSAgICAgIENPTlNUIGNoYXIgKiosCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgdm9pZCBzb21fZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKTsKLXN0YXRpYyBhc2VjdGlvbiAqIGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgCi0JCQkJCXN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQgKikpOwotc3RhdGljIGludCBsb2cyIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBocHBhX3NvbV9yZWxvYyBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLAotCQkJCQkJICAgICBhc3ltYm9sICosIFBUUiwKLQkJCQkJCSAgICAgYXNlY3Rpb24gKiwgYmZkICosCi0JCQkJCQkgICAgIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlIFBBUkFNUyAoKHN0cnVjdCByZWxvY19xdWV1ZSAqKSk7Ci1zdGF0aWMgdm9pZCBzb21fcmVsb2NfcXVldWVfaW5zZXJ0IFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJCQkgICAgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB2b2lkIHNvbV9yZWxvY19xdWV1ZV9maXggUEFSQU1TICgoc3RydWN0IHJlbG9jX3F1ZXVlICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGludCBzb21fcmVsb2NfcXVldWVfZmluZCBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCwKLQkJCQkJIHN0cnVjdCByZWxvY19xdWV1ZSAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqIHRyeV9wcmV2X2ZpeHVwIFBBUkFNUyAoKGJmZCAqLCBpbnQgKiwgdW5zaWduZWQgY2hhciAqLAotCQkJCQkgICAgICAgdW5zaWduZWQgaW50LAotCQkJCQkgICAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKiBzb21fcmVsb2Nfc2tpcCBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LAotCQkJCQkgICAgICAgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQgKiwKLQkJCQkJICAgICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqIHNvbV9yZWxvY19hZGRlbmQgUEFSQU1TICgoYmZkICosIGludCwgdW5zaWduZWQgY2hhciAqLAotCQkJCQkgICAgICAgICB1bnNpZ25lZCBpbnQgKiwKLQkJCQkJCSBzdHJ1Y3QgcmVsb2NfcXVldWUgKikpOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKiBzb21fcmVsb2NfY2FsbCBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgY2hhciAqLAotCQkJCQkgICAgICAgdW5zaWduZWQgaW50ICosCi0JCQkJCSAgICAgICBhcmVsZW50ICosIGludCwKLQkJCQkJICAgICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBzb21fY291bnRfc3BhY2VzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBzb21fY291bnRfc3Vic3BhY2VzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IGNvbXBhcmVfc3ltcyBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotc3RhdGljIGludCBjb21wYXJlX3N1YnNwYWNlcyBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgc29tX2NvbXB1dGVfY2hlY2tzdW0gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9wcmVwX2hlYWRlcnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgc29tX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fZmluaXNoX3dyaXRpbmcgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9idWlsZF9hbmRfd3JpdGVfc3ltYm9sX3RhYmxlIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzb21fcHJlcF9mb3JfZml4dXBzIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fd3JpdGVfZml4dXBzIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBpbnQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3dyaXRlX3NwYWNlX3N0cmluZ3MgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGxvbmcsCi0JCQkJCQl1bnNpZ25lZCBpbnQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBsb25nLAotCQkJCQkJIGFzeW1ib2wgKiosIHVuc2lnbmVkIGludCwKLQkJCQkJCSB1bnNpZ25lZCAqLAotCQkJCQkJIENPTVBVTklUICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9iZWdpbl93cml0aW5nIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqIHNvbV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQlQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgY2hhciBzb21fc2VjdGlvbl90eXBlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBzb21fZGVjb2RlX3N5bWNsYXNzIFBBUkFNUyAoKGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9jb3VudF9hcl9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgbHN0X2hlYWRlciAqLAotCQkJCQkJIHN5bWluZGV4ICopKTsKLQotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9maWxsX2luX2FyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBsc3RfaGVhZGVyICosCi0JCQkJCQkgICBjYXJzeW0gKipzeW1zKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fc2x1cnBfYXJtYXAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV93cml0ZV9hcm1hcCBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosCi0JCQkJCXVuc2lnbmVkIGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0JCQkJCSAgICAgc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9iZmRfcHJlcF9mb3JfYXJfd3JpdGUgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCAqLAotCQkJCQkJICB1bnNpZ25lZCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBzb21fYmZkX2FyX3N5bWJvbF9oYXNoIFBBUkFNUyAoKGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwKLQkJCQkJCSAgICAgIHVuc2lnbmVkIGludCwKLQkJCQkJCSAgICAgIHN0cnVjdCBsc3RfaGVhZGVyLAotCQkJCQkJICAgICAgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21faXNfc3BhY2UgUEFSQU1TICgoYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2lzX3N1YnNwYWNlIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9pc19jb250YWluZXIgUEFSQU1TICgoYXNlY3Rpb24gKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9mcmVlX2NhY2hlZF9pbmZvIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotCQotLyogTWFwIFNPTSBzZWN0aW9uIG5hbWVzIHRvIFBPU0lYL0JTRCBzaW5nbGUtY2hhcmFjdGVyIHN5bWJvbCB0eXBlcy4KLQotICAgVGhpcyB0YWJsZSBpbmNsdWRlcyBhbGwgdGhlIHN0YW5kYXJkIHN1YnNwYWNlcyBhcyBkZWZpbmVkIGluIHRoZSAKLSAgIGN1cnJlbnQgIlBSTyBBQkkgZm9yIFBBLVJJU0MgU3lzdGVtcyIsICRVTldJTkQkIHdoaWNoIGZvciAKLSAgIHNvbWUgcmVhc29uIHdhcyBsZWZ0IG91dCwgYW5kIHNlY3Rpb25zIHNwZWNpZmljIHRvIGVtYmVkZGVkIHN0YWJzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzZWN0aW9uX3RvX3R5cGUgc3R0W10gPSB7Ci0gIHsiJFRFWFQkIiwgJ3QnfSwKLSAgeyIkU0hMSUJfSU5GTyQiLCAndCd9LAotICB7IiRNSUxMSUNPREUkIiwgJ3QnfSwKLSAgeyIkTElUJCIsICd0J30sCi0gIHsiJENPREUkIiwgJ3QnfSwKLSAgeyIkVU5XSU5EX1NUQVJUJCIsICd0J30sCi0gIHsiJFVOV0lORCQiLCAndCd9LAotICB7IiRQUklWQVRFJCIsICdkJ30sCi0gIHsiJFBMVCQiLCAnZCd9LAotICB7IiRTSExJQl9EQVRBJCIsICdkJ30sCi0gIHsiJERBVEEkIiwgJ2QnfSwKLSAgeyIkU0hPUlREQVRBJCIsICdnJ30sCi0gIHsiJERMVCQiLCAnZCd9LAotICB7IiRHTE9CQUwkIiwgJ2cnfSwKLSAgeyIkU0hPUlRCU1MkIiwgJ3MnfSwKLSAgeyIkQlNTJCIsICdiJ30sCi0gIHsiJEdEQl9TVFJJTkdTJCIsICdOJ30sCi0gIHsiJEdEQl9TWU1CT0xTJCIsICdOJ30sCi0gIHswLCAwfQotfTsKLQotLyogQWJvdXQgdGhlIHJlbG9jYXRpb24gZm9ybWF0dGluZyB0YWJsZS4uLgotCi0gICBUaGVyZSBhcmUgMjU2IGVudHJpZXMgaW4gdGhlIHRhYmxlLCBvbmUgZm9yIGVhY2ggcG9zc2libGUKLSAgIHJlbG9jYXRpb24gb3Bjb2RlIGF2YWlsYWJsZSBpbiBTT00uICBXZSBpbmRleCB0aGUgdGFibGUgYnkKLSAgIHRoZSByZWxvY2F0aW9uIG9wY29kZS4gIFRoZSBuYW1lcyBhbmQgb3BlcmF0aW9ucyBhcmUgdGhvc2UKLSAgIGRlZmluZWQgYnkgYS5vdXRfODAwICg0KS4KLQotICAgUmlnaHQgbm93IHRoaXMgdGFibGUgaXMgb25seSB1c2VkIHRvIGNvdW50IGFuZCBwZXJmb3JtIG1pbmltYWwKLSAgIHByb2Nlc3Npbmcgb24gcmVsb2NhdGlvbiBzdHJlYW1zIHNvIHRoYXQgdGhleSBjYW4gYmUgaW50ZXJuYWxpemVkCi0gICBpbnRvIEJGRCBhbmQgc3ltYm9saWNhbGx5IHByaW50ZWQgYnkgdXRpbGl0aWVzLiAgVG8gbWFrZSBhY3R1YWwgdXNlIAotICAgb2YgdGhlbSB3b3VsZCBiZSBtdWNoIG1vcmUgZGlmZmljdWx0LCBCRkQncyBjb25jZXB0IG9mIHJlbG9jYXRpb25zCi0gICBpcyBmYXIgdG9vIHNpbXBsZSB0byBoYW5kbGUgU09NIHJlbG9jYXRpb25zLiAgVGhlIGJhc2ljIGFzc3VtcHRpb24KLSAgIHRoYXQgYSByZWxvY2F0aW9uIGNhbiBiZSBjb21wbGV0ZWx5IHByb2Nlc3NlZCBpbmRlcGVuZGVudCBvZiBvdGhlcgotICAgcmVsb2NhdGlvbnMgYmVmb3JlIGFuIG9iamVjdCBmaWxlIGlzIHdyaXR0ZW4gaXMgaW52YWxpZCBmb3IgU09NLgotCi0gICBUaGUgU09NIHJlbG9jYXRpb25zIGFyZSBtZWFudCB0byBiZSBwcm9jZXNzZWQgYXMgYSBzdHJlYW0sIHRoZXkKLSAgIHNwZWNpZnkgY29weWluZyBvZiBkYXRhIGZyb20gdGhlIGlucHV0IHNlY3Rpb24gdG8gdGhlIG91dHB1dCBzZWN0aW9uCi0gICB3aGlsZSBwb3NzaWJseSBtb2RpZnlpbmcgdGhlIGRhdGEgaW4gc29tZSBtYW5uZXIuICBUaGV5IGFsc28gY2FuIAotICAgc3BlY2lmeSB0aGF0IGEgdmFyaWFibGUgbnVtYmVyIG9mIHplcm9zIG9yIHVuaW5pdGlhbGl6ZWQgZGF0YSBiZQotICAgaW5zZXJ0ZWQgb24gaW4gdGhlIG91dHB1dCBzZWdtZW50IGF0IHRoZSBjdXJyZW50IG9mZnNldC4gIFNvbWUKLSAgIHJlbG9jYXRpb25zIHNwZWNpZnkgdGhhdCBzb21lIHByZXZpb3VzIHJlbG9jYXRpb24gYmUgcmUtYXBwbGllZCBhdAotICAgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGlucHV0L291dHB1dCBzZWN0aW9ucy4gIEFuZCBmaW5hbGx5IGEgbnVtYmVyCi0gICBvZiByZWxvY2F0aW9ucyBoYXZlIGVmZmVjdHMgb24gb3RoZXIgc2VjdGlvbnMgKFJfRU5UUlksIFJfRVhJVCwKLSAgIFJfVU5XSU5EX0FVWCBhbmQgYSB2YXJpZXR5IG9mIG90aGVycykuICBUaGVyZSBpc24ndCBldmVuIGVub3VnaCByb29tCi0gICBpbiB0aGUgQkZEIHJlbG9jYXRpb24gZGF0YSBzdHJ1Y3R1cmUgdG8gc3RvcmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvCi0gICBwZXJmb3JtIGFsbCB0aGUgcmVsb2NhdGlvbnMuCi0KLSAgIEVhY2ggZW50cnkgaW4gdGhlIHRhYmxlIGhhcyB0aHJlZSBmaWVsZHMuIAotCi0gICBUaGUgZmlyc3QgZW50cnkgaXMgYW4gaW5kZXggaW50byB0aGlzICJjbGFzcyIgb2YgcmVsb2NhdGlvbnMuICBUaGlzCi0gICBpbmRleCBjYW4gdGhlbiBiZSB1c2VkIGFzIGEgdmFyaWFibGUgd2l0aGluIHRoZSByZWxvY2F0aW9uIGl0c2VsZi4KLQotICAgVGhlIHNlY29uZCBmaWVsZCBpcyBhIGZvcm1hdCBzdHJpbmcgd2hpY2ggYWN0dWFsbHkgY29udHJvbHMgcHJvY2Vzc2luZwotICAgb2YgdGhlIHJlbG9jYXRpb24uICBJdCB1c2VzIGEgc2ltcGxlIHBvc3RmaXggbWFjaGluZSB0byBkbyBjYWxjdWxhdGlvbnMKLSAgIGJhc2VkIG9uIHZhcmlhYmxlcy9jb25zdGFudHMgZm91bmQgaW4gdGhlIHN0cmluZyBhbmQgdGhlIHJlbG9jYXRpb24KLSAgIHN0cmVhbS4gIAotCi0gICBUaGUgdGhpcmQgZmllbGQgc3BlY2lmeXMgd2hldGhlciBvciBub3QgdGhpcyByZWxvY2F0aW9uIG1heSB1c2UgCi0gICBhIGNvbnN0YW50IChWKSBmcm9tIHRoZSBwcmV2aW91cyBSX0RBVEFfT1ZFUlJJREUgcmF0aGVyIHRoYW4gYSBjb25zdGFudAotICAgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4KLQotICAgVmFyaWFibGVzOiAgCi0gIAotICAgTCA9IGlucHV0IHNwYWNlIGJ5dGUgY291bnQKLSAgIEQgPSBpbmRleCBpbnRvIGNsYXNzIG9mIHJlbG9jYXRpb25zCi0gICBNID0gb3V0cHV0IHNwYWNlIGJ5dGUgY291bnQKLSAgIE4gPSBzdGF0ZW1lbnQgbnVtYmVyICh1bnVzZWQ/KQotICAgTyA9IHN0YWNrIG9wZXJhdGlvbgotICAgUiA9IHBhcmFtZXRlciByZWxvY2F0aW9uIGJpdHMKLSAgIFMgPSBzeW1ib2wgaW5kZXgKLSAgIFQgPSBmaXJzdCAzMiBiaXRzIG9mIHN0YWNrIHVud2luZCBpbmZvcm1hdGlvbgotICAgVSA9IHNlY29uZCAzMiBiaXRzIG9mIHN0YWNrIHVud2luZCBpbmZvcm1hdGlvbgotICAgViA9IGEgbGl0ZXJhbCBjb25zdGFudCAodXN1YWxseSB1c2VkIGluIHRoZSBuZXh0IHJlbG9jYXRpb24pCi0gICBQID0gYSBwcmV2aW91cyByZWxvY2F0aW9uCi0gIAotICAgTG93ZXIgY2FzZSBsZXR0ZXJzIChzdGFydGluZyB3aXRoICdiJykgcmVmZXIgdG8gZm9sbG93aW5nIAotICAgYnl0ZXMgaW4gdGhlIHJlbG9jYXRpb24gc3RyZWFtLiAgJ2InIGlzIHRoZSBuZXh0IDEgYnl0ZSwKLSAgIGMgaXMgdGhlIG5leHQgMiBieXRlcywgZCBpcyB0aGUgbmV4dCAzIGJ5dGVzLCBldGMuLi4gIAotICAgVGhpcyBpcyB0aGUgdmFyaWFibGUgcGFydCBvZiB0aGUgcmVsb2NhdGlvbiBlbnRyaWVzIHRoYXQKLSAgIG1ha2VzIG91ciBsaWZlIGEgbGl2aW5nIGhlbGwuCi0KLSAgIG51bWVyaWNhbCBjb25zdGFudHMgYXJlIGFsc28gdXNlZCBpbiB0aGUgZm9ybWF0IHN0cmluZy4gIE5vdGUKLSAgIHRoZSBjb25zdGFudHMgYXJlIHJlcHJlc2VudGVkIGluIGRlY2ltYWwuIAotCi0gICAnKycsICIqIiBhbmQgIj0iIHJlcHJlc2VudHMgdGhlIG9idmlvdXMgcG9zdGZpeCBvcGVyYXRvcnMuCi0gICAnPCcgcmVwcmVzZW50cyBhIGxlZnQgc2hpZnQuIAotCi0gICBTdGFjayBPcGVyYXRpb25zOgotCi0gICBQYXJhbWV0ZXIgUmVsb2NhdGlvbiBCaXRzOgotCi0gICBVbndpbmQgRW50cmllczogIAotICAgCi0gICBQcmV2aW91cyBSZWxvY2F0aW9uczogIFRoZSBpbmRleCBmaWVsZCByZXByZXNlbnRzIHdoaWNoIGluIHRoZSBxdWV1ZQotICAgb2YgNCBwcmV2aW91cyBmaXh1cHMgc2hvdWxkIGJlIHJlLWFwcGxpZWQuCi0KLSAgIExpdGVyYWwgQ29uc3RhbnRzOiAgVGhlc2UgYXJlIGdlbmVyYWxseSB1c2VkIHRvIHJlcHJlc2VudCBhZGRlbmQKLSAgIHBhcnRzIG9mIHJlbG9jYXRpb25zIHdoZW4gdGhlc2UgY29uc3RhbnRzIGFyZSBub3Qgc3RvcmVkIGluIHRoZQotICAgZmllbGRzIG9mIHRoZSBpbnN0cnVjdGlvbnMgdGhlbXNlbHZlcy4gIEZvciBleGFtcGxlIHRoZSBpbnN0cnVjdGlvbgotICAgYWRkaWwgZm9vLSRnbG9iYWwkLTB4MTIzNCB3b3VsZCB1c2UgYW4gb3ZlcnJpZGUgZm9yICIweDEyMzQiIHJhdGhlcgotICAgdGhhbiBzdG9yaW5nIGl0IGludG8gdGhlIGFkZGlsIGl0c2VsZi4gICovCi0KLXN0cnVjdCBmaXh1cF9mb3JtYXQKLXsKLSAgaW50IEQ7Ci0gIGNoYXIgKmZvcm1hdDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZml4dXBfZm9ybWF0IHNvbV9maXh1cF9mb3JtYXRzWzI1Nl0gPQotewotICAvKiBSX05PX1JFTE9DQVRJT04gKi8KLSAgMCwgICAiTEQxKzQqPSIsICAgICAgIC8qIDB4MDAgKi8KLSAgMSwgICAiTEQxKzQqPSIsCS8qIDB4MDEgKi8KLSAgMiwgICAiTEQxKzQqPSIsCS8qIDB4MDIgKi8KLSAgMywgICAiTEQxKzQqPSIsCS8qIDB4MDMgKi8KLSAgNCwgICAiTEQxKzQqPSIsCS8qIDB4MDQgKi8KLSAgNSwgICAiTEQxKzQqPSIsCS8qIDB4MDUgKi8KLSAgNiwgICAiTEQxKzQqPSIsCS8qIDB4MDYgKi8KLSAgNywgICAiTEQxKzQqPSIsCS8qIDB4MDcgKi8KLSAgOCwgICAiTEQxKzQqPSIsCS8qIDB4MDggKi8KLSAgOSwgICAiTEQxKzQqPSIsCS8qIDB4MDkgKi8KLSAgMTAsICAiTEQxKzQqPSIsCS8qIDB4MGEgKi8KLSAgMTEsICAiTEQxKzQqPSIsCS8qIDB4MGIgKi8KLSAgMTIsICAiTEQxKzQqPSIsCS8qIDB4MGMgKi8KLSAgMTMsICAiTEQxKzQqPSIsCS8qIDB4MGQgKi8KLSAgMTQsICAiTEQxKzQqPSIsCS8qIDB4MGUgKi8KLSAgMTUsICAiTEQxKzQqPSIsCS8qIDB4MGYgKi8KLSAgMTYsICAiTEQxKzQqPSIsCS8qIDB4MTAgKi8KLSAgMTcsICAiTEQxKzQqPSIsCS8qIDB4MTEgKi8KLSAgMTgsICAiTEQxKzQqPSIsCS8qIDB4MTIgKi8KLSAgMTksICAiTEQxKzQqPSIsCS8qIDB4MTMgKi8KLSAgMjAsICAiTEQxKzQqPSIsCS8qIDB4MTQgKi8KLSAgMjEsICAiTEQxKzQqPSIsCS8qIDB4MTUgKi8KLSAgMjIsICAiTEQxKzQqPSIsCS8qIDB4MTYgKi8KLSAgMjMsICAiTEQxKzQqPSIsCS8qIDB4MTcgKi8KLSAgMCwgICAiTEQ4PGIrMSs0Kj0iLAkvKiAweDE4ICovCi0gIDEsICAgIkxEODxiKzErNCo9IiwJLyogMHgxOSAqLwotICAyLCAgICJMRDg8YisxKzQqPSIsCS8qIDB4MWEgKi8KLSAgMywgICAiTEQ4PGIrMSs0Kj0iLAkvKiAweDFiICovCi0gIDAsICAgIkxEMTY8YysxKzQqPSIsCS8qIDB4MWMgKi8KLSAgMSwgICAiTEQxNjxjKzErNCo9IiwJLyogMHgxZCAqLwotICAyLCAgICJMRDE2PGMrMSs0Kj0iLAkvKiAweDFlICovCi0gIDAsICAgIkxkMSs9IiwgICAgICAgICAvKiAweDFmICovCi0gIC8qIFJfWkVST0VTICovCi0gIDAsICAgICJMYjErNCo9IiwJLyogMHgyMCAqLwotICAxLCAgICAiTGQxKz0iLAkvKiAweDIxICovCi0gIC8qIFJfVU5JTklUICovCi0gIDAsICAgICJMYjErNCo9IiwJLyogMHgyMiAqLwotICAxLCAgICAiTGQxKz0iLAkvKiAweDIzICovCi0gIC8qIFJfUkVMT0NBVElPTiAqLwotICAwLCAgICAiTDQ9IiwgICAgICAgICAgLyogMHgyNCAqLwotICAvKiBSX0RBVEFfT05FX1NZTUJPTCAqLwotICAwLCAgICAiTDQ9U2I9IiwJLyogMHgyNSAqLwotICAxLCAgICAiTDQ9U2Q9IiwJLyogMHgyNiAqLwotICAvKiBSX0RBVEFfUExFQkVMICovCi0gIDAsICAgICJMND1TYj0iLAkvKiAweDI3ICovCi0gIDEsICAgICJMND1TZD0iLAkvKiAweDI4ICovCi0gIC8qIFJfU1BBQ0VfUkVGICovCi0gIDAsICAgICJMND0iLCAgICAgICAgICAvKiAweDI5ICovCi0gIC8qIFJfUkVQRUFURURfSU5JVCAqLwotICAwLCAgICAiTDQ9TWIxKzQqPSIsCS8qIDB4MmEgKi8KLSAgMSwgICAgIkxiNCo9TWIxK0wqPSIsCS8qIDB4MmIgKi8KLSAgMiwgICAgIkxiNCo9TWQxKzQqPSIsCS8qIDB4MmMgKi8KLSAgMywgICAgIkxkMSs9TWUxKz0iLAkvKiAweDJkICovCi0gIDAsICAgCSIiLAkgICAgICAgIC8qIDB4MmUgKi8KLSAgMCwgICAJIiIsCSAgICAgICAgLyogMHgyZiAqLwotICAvKiBSX1BDUkVMX0NBTEwgKi8KLSAgMCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzAgKi8KLSAgMSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzEgKi8KLSAgMiwgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzIgKi8KLSAgMywgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzMgKi8KLSAgNCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzQgKi8KLSAgNSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzUgKi8KLSAgNiwgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzYgKi8KLSAgNywgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzcgKi8KLSAgOCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzggKi8KLSAgOSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4MzkgKi8KLSAgMCwgICAgIkw0PVJEODxiKz1TYj0iLC8qIDB4M2EgKi8KLSAgMSwgICAgIkw0PVJEODxiKz1TYj0iLC8qIDB4M2IgKi8KLSAgMCwgICAgIkw0PVJEODxiKz1TZD0iLC8qIDB4M2MgKi8KLSAgMSwgICAgIkw0PVJEODxiKz1TZD0iLC8qIDB4M2QgKi8KLSAgLyogUl9TSE9SVF9QQ1JFTF9NT0RFICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4M2UgKi8KLSAgLyogUl9MT05HX1BDUkVMX01PREUgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHgzZiAqLwotICAvKiBSX0FCU19DQUxMICovCi0gIDAsICAgICJMND1SRD1TYj0iLAkvKiAweDQwICovCi0gIDEsICAgICJMND1SRD1TYj0iLAkvKiAweDQxICovCi0gIDIsICAgICJMND1SRD1TYj0iLAkvKiAweDQyICovCi0gIDMsICAgICJMND1SRD1TYj0iLAkvKiAweDQzICovCi0gIDQsICAgICJMND1SRD1TYj0iLAkvKiAweDQ0ICovCi0gIDUsICAgICJMND1SRD1TYj0iLAkvKiAweDQ1ICovCi0gIDYsICAgICJMND1SRD1TYj0iLAkvKiAweDQ2ICovCi0gIDcsICAgICJMND1SRD1TYj0iLAkvKiAweDQ3ICovCi0gIDgsICAgICJMND1SRD1TYj0iLAkvKiAweDQ4ICovCi0gIDksICAgICJMND1SRD1TYj0iLAkvKiAweDQ5ICovCi0gIDAsICAgICJMND1SRDg8Yis9U2I9IiwvKiAweDRhICovCi0gIDEsICAgICJMND1SRDg8Yis9U2I9IiwvKiAweDRiICovCi0gIDAsICAgICJMND1SRDg8Yis9U2Q9IiwvKiAweDRjICovCi0gIDEsICAgICJMND1SRDg8Yis9U2Q9IiwvKiAweDRkICovCi0gIC8qIFJfUkVTRVJWRUQgKi8KLSAgMCwgICAgICIiLAkgICAgICAgIC8qIDB4NGUgKi8KLSAgMCwgICAgICIiLAkgICAgICAgIC8qIDB4NGYgKi8KLSAgLyogUl9EUF9SRUxBVElWRSAqLwotICAwLCAgICAiTDQ9U0Q9IiwJLyogMHg1MCAqLwotICAxLCAgICAiTDQ9U0Q9IiwJLyogMHg1MSAqLwotICAyLCAgICAiTDQ9U0Q9IiwJLyogMHg1MiAqLwotICAzLCAgICAiTDQ9U0Q9IiwJLyogMHg1MyAqLwotICA0LCAgICAiTDQ9U0Q9IiwJLyogMHg1NCAqLwotICA1LCAgICAiTDQ9U0Q9IiwJLyogMHg1NSAqLwotICA2LCAgICAiTDQ9U0Q9IiwJLyogMHg1NiAqLwotICA3LCAgICAiTDQ9U0Q9IiwJLyogMHg1NyAqLwotICA4LCAgICAiTDQ9U0Q9IiwJLyogMHg1OCAqLwotICA5LCAgICAiTDQ9U0Q9IiwJLyogMHg1OSAqLwotICAxMCwgICAiTDQ9U0Q9IiwJLyogMHg1YSAqLwotICAxMSwgICAiTDQ9U0Q9IiwJLyogMHg1YiAqLwotICAxMiwgICAiTDQ9U0Q9IiwJLyogMHg1YyAqLwotICAxMywgICAiTDQ9U0Q9IiwJLyogMHg1ZCAqLwotICAxNCwgICAiTDQ9U0Q9IiwJLyogMHg1ZSAqLwotICAxNSwgICAiTDQ9U0Q9IiwJLyogMHg1ZiAqLwotICAxNiwgICAiTDQ9U0Q9IiwJLyogMHg2MCAqLwotICAxNywgICAiTDQ9U0Q9IiwJLyogMHg2MSAqLwotICAxOCwgICAiTDQ9U0Q9IiwJLyogMHg2MiAqLwotICAxOSwgICAiTDQ9U0Q9IiwJLyogMHg2MyAqLwotICAyMCwgICAiTDQ9U0Q9IiwJLyogMHg2NCAqLwotICAyMSwgICAiTDQ9U0Q9IiwJLyogMHg2NSAqLwotICAyMiwgICAiTDQ9U0Q9IiwJLyogMHg2NiAqLwotICAyMywgICAiTDQ9U0Q9IiwJLyogMHg2NyAqLwotICAyNCwgICAiTDQ9U0Q9IiwJLyogMHg2OCAqLwotICAyNSwgICAiTDQ9U0Q9IiwJLyogMHg2OSAqLwotICAyNiwgICAiTDQ9U0Q9IiwJLyogMHg2YSAqLwotICAyNywgICAiTDQ9U0Q9IiwJLyogMHg2YiAqLwotICAyOCwgICAiTDQ9U0Q9IiwJLyogMHg2YyAqLwotICAyOSwgICAiTDQ9U0Q9IiwJLyogMHg2ZCAqLwotICAzMCwgICAiTDQ9U0Q9IiwJLyogMHg2ZSAqLwotICAzMSwgICAiTDQ9U0Q9IiwJLyogMHg2ZiAqLwotICAzMiwgICAiTDQ9U2I9IiwJLyogMHg3MCAqLwotICAzMywgICAiTDQ9U2Q9IiwJLyogMHg3MSAqLwotICAvKiBSX1JFU0VSVkVEICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4NzIgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3MyAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDc0ICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4NzUgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3NiAqLwotICAwLCAgICAiIiwgICAgICAJLyogMHg3NyAqLwotICAvKiBSX0RMVF9SRUwgKi8KLSAgMCwgICAgIkw0PVNiPSIsCS8qIDB4NzggKi8KLSAgMSwgICAgIkw0PVNkPSIsCS8qIDB4NzkgKi8KLSAgLyogUl9SRVNFUlZFRCAqLwotICAwLCAgICAiIiwgICAgICAgIAkvKiAweDdhICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4N2IgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3YyAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDdkICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4N2UgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3ZiAqLwotICAvKiBSX0NPREVfT05FX1NZTUJPTCAqLwotICAwLCAgICAiTDQ9U0Q9IiwJLyogMHg4MCAqLwotICAxLCAgICAiTDQ9U0Q9IiwJLyogMHg4MSAqLwotICAyLCAgICAiTDQ9U0Q9IiwJLyogMHg4MiAqLwotICAzLCAgICAiTDQ9U0Q9IiwJLyogMHg4MyAqLwotICA0LCAgICAiTDQ9U0Q9IiwJLyogMHg4NCAqLwotICA1LCAgICAiTDQ9U0Q9IiwJLyogMHg4NSAqLwotICA2LCAgICAiTDQ9U0Q9IiwJLyogMHg4NiAqLwotICA3LCAgICAiTDQ9U0Q9IiwJLyogMHg4NyAqLwotICA4LCAgICAiTDQ9U0Q9IiwJLyogMHg4OCAqLwotICA5LCAgICAiTDQ9U0Q9IiwJLyogMHg4OSAqLwotICAxMCwgICAiTDQ9U0Q9IiwJLyogMHg4cSAqLwotICAxMSwgICAiTDQ9U0Q9IiwJLyogMHg4YiAqLwotICAxMiwgICAiTDQ9U0Q9IiwJLyogMHg4YyAqLwotICAxMywgICAiTDQ9U0Q9IiwJLyogMHg4ZCAqLwotICAxNCwgICAiTDQ9U0Q9IiwJLyogMHg4ZSAqLwotICAxNSwgICAiTDQ9U0Q9IiwJLyogMHg4ZiAqLwotICAxNiwgICAiTDQ9U0Q9IiwJLyogMHg5MCAqLwotICAxNywgICAiTDQ9U0Q9IiwJLyogMHg5MSAqLwotICAxOCwgICAiTDQ9U0Q9IiwJLyogMHg5MiAqLwotICAxOSwgICAiTDQ9U0Q9IiwJLyogMHg5MyAqLwotICAyMCwgICAiTDQ9U0Q9IiwJLyogMHg5NCAqLwotICAyMSwgICAiTDQ9U0Q9IiwJLyogMHg5NSAqLwotICAyMiwgICAiTDQ9U0Q9IiwJLyogMHg5NiAqLwotICAyMywgICAiTDQ9U0Q9IiwJLyogMHg5NyAqLwotICAyNCwgICAiTDQ9U0Q9IiwJLyogMHg5OCAqLwotICAyNSwgICAiTDQ9U0Q9IiwJLyogMHg5OSAqLwotICAyNiwgICAiTDQ9U0Q9IiwJLyogMHg5YSAqLwotICAyNywgICAiTDQ9U0Q9IiwJLyogMHg5YiAqLwotICAyOCwgICAiTDQ9U0Q9IiwJLyogMHg5YyAqLwotICAyOSwgICAiTDQ9U0Q9IiwJLyogMHg5ZCAqLwotICAzMCwgICAiTDQ9U0Q9IiwJLyogMHg5ZSAqLwotICAzMSwgICAiTDQ9U0Q9IiwJLyogMHg5ZiAqLwotICAzMiwgICAiTDQ9U2I9IiwJLyogMHhhMCAqLwotICAzMywgICAiTDQ9U2Q9IiwJLyogMHhhMSAqLwotICAvKiBSX1JFU0VSVkVEICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTIgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhMyAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGE0ICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTUgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhNiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGE3ICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTggKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhOSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGFhICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YWIgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhYyAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGFkICovCi0gIC8qIFJfTUlMTElfUkVMICovCi0gIDAsICAgICJMND1TYj0iLAkvKiAweGFlICovCi0gIDEsICAgICJMND1TZD0iLAkvKiAweGFmICovCi0gIC8qIFJfQ09ERV9QTEFCRUwgKi8KLSAgMCwgICAgIkw0PVNiPSIsCS8qIDB4YjAgKi8KLSAgMSwgICAgIkw0PVNkPSIsCS8qIDB4YjEgKi8KLSAgLyogUl9CUkVBS1BPSU5UICovCi0gIDAsICAgICJMND0iLAkgICAgICAgIC8qIDB4YjIgKi8KLSAgLyogUl9FTlRSWSAqLwotICAwLCAgICAiVGU9VWU9IiwgICAgICAgLyogMHhiMyAqLwotICAxLCAgICAiVWY9IiwJICAgICAgICAvKiAweGI0ICovCi0gIC8qIFJfQUxUX0VOVFJZICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YjUgKi8KLSAgLyogUl9FWElUICovCi0gIDAsICAgICIiLAkJLyogMHhiNiAqLwotICAvKiBSX0JFR0lOX1RSWSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGI3ICovCi0gIC8qIFJfRU5EX1RSWSAqLwotICAwLCAgICAiUjA9IiwJICAgICAgICAvKiAweGI4ICovCi0gIDEsICAgICJSYjQqPSIsCS8qIDB4YjkgKi8KLSAgMiwgICAgIlJkNCo9IiwJLyogMHhiYSAqLwotICAvKiBSX0JFR0lOX0JSVEFCICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YmIgKi8KLSAgLyogUl9FTkRfQlJUQUIgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhiYyAqLwotICAvKiBSX1NUQVRFTUVOVCAqLwotICAwLCAgICAiTmI9IiwJICAgICAgICAvKiAweGJkICovCi0gIDEsICAgICJOYz0iLAkgICAgICAgIC8qIDB4YmUgKi8KLSAgMiwgICAgIk5kPSIsCSAgICAgICAgLyogMHhiZiAqLwotICAvKiBSX0RBVEFfRVhQUiAqLwotICAwLCAgICAiTDQ9IiwJICAgICAgICAvKiAweGMwICovCi0gIC8qIFJfQ09ERV9FWFBSICovCi0gIDAsICAgICJMND0iLAkgICAgICAgIC8qIDB4YzEgKi8KLSAgLyogUl9GU0VMICovCi0gIDAsICAgICIiLAkJLyogMHhjMiAqLwotICAvKiBSX0xTRUwgKi8KLSAgMCwgICAgIiIsCQkvKiAweGMzICovCi0gIC8qIFJfUlNFTCAqLwotICAwLCAgICAiIiwJCS8qIDB4YzQgKi8KLSAgLyogUl9OX01PREUgKi8KLSAgMCwgICAgIiIsCQkvKiAweGM1ICovCi0gIC8qIFJfU19NT0RFICovCi0gIDAsICAgICIiLAkJLyogMHhjNiAqLwotICAvKiBSX0RfTU9ERSAqLwotICAwLCAgICAiIiwJCS8qIDB4YzcgKi8KLSAgLyogUl9SX01PREUgKi8KLSAgMCwgICAgIiIsCQkvKiAweGM4ICovCi0gIC8qIFJfREFUQV9PVkVSUklERSAqLwotICAwLCAgICAiVjA9IiwJICAgICAgICAvKiAweGM5ICovCi0gIDEsICAgICJWYj0iLAkgICAgICAgIC8qIDB4Y2EgKi8KLSAgMiwgICAgIlZjPSIsCSAgICAgICAgLyogMHhjYiAqLwotICAzLCAgICAiVmQ9IiwJICAgICAgICAvKiAweGNjICovCi0gIDQsICAgICJWZT0iLAkgICAgICAgIC8qIDB4Y2QgKi8KLSAgLyogUl9UUkFOU0xBVEVEICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4Y2UgKi8KLSAgLyogUl9SRVNFUlZFRCAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGNmICovCi0gIC8qIFJfQ09NUDEgKi8KLSAgMCwgICAgIk9iPSIsCSAgICAgICAgLyogMHhkMCAqLwotICAvKiBSX0NPTVAyICovCi0gIDAsICAgICJPYj1TZD0iLAkvKiAweGQxICovCi0gIC8qIFJfQ09NUDMgKi8KLSAgMCwgICAgIk9iPVZlPSIsCS8qIDB4ZDIgKi8KLSAgLyogUl9QUkVWX0ZJWFVQICovCi0gIDAsICAgICJQIiwgICAJICAgICAgICAvKiAweGQzICovCi0gIDEsICAgICJQIiwJICAgICAgICAvKiAweGQ0ICovCi0gIDIsICAgICJQIiwJICAgICAgICAvKiAweGQ1ICovCi0gIDMsICAgICJQIiwJICAgICAgICAvKiAweGQ2ICovCi0gIC8qIFJfU0VDX1NUTVQgKi8KLSAgMCwJIiIsCQkvKiAweGQ3ICovCi0gIC8qIFJfTjBTRUwgKi8KLSAgMCwJIiIsCQkvKiAweGQ4ICovCi0gIC8qIFJfTjFTRUwgKi8KLSAgMCwJIiIsCQkvKiAweGQ5ICovCi0gIC8qIFJfTElORVRBQiAqLwotICAwLAkiIiwJCS8qIDB4ZGEgKi8KLSAgLyogUl9MSU5FVEFCX0VTQyAqLwotICAwLAkiIiwJCS8qIDB4ZGIgKi8KLSAgLyogUl9MVFBfT1ZFUlJJREUgKi8KLSAgMCwJIiIsCQkvKiAweGRjICovCi0gIC8qIFJfQ09NTUVOVCAqLwotICAwLAkiIiwJCS8qIDB4ZGQgKi8KLSAgLyogUl9SRVNFUlZFRCAqLwotICAwLAkiIiwJCS8qIDB4ZGUgKi8KLSAgMCwJIiIsCQkvKiAweGRmICovCi0gIDAsCSIiLAkJLyogMHhlMCAqLwotICAwLAkiIiwJCS8qIDB4ZTEgKi8KLSAgMCwJIiIsCQkvKiAweGUyICovCi0gIDAsCSIiLAkJLyogMHhlMyAqLwotICAwLAkiIiwJCS8qIDB4ZTQgKi8KLSAgMCwJIiIsCQkvKiAweGU1ICovCi0gIDAsCSIiLAkJLyogMHhlNiAqLwotICAwLAkiIiwJCS8qIDB4ZTcgKi8KLSAgMCwJIiIsCQkvKiAweGU4ICovCi0gIDAsCSIiLAkJLyogMHhlOSAqLwotICAwLAkiIiwJCS8qIDB4ZWEgKi8KLSAgMCwJIiIsCQkvKiAweGViICovCi0gIDAsCSIiLAkJLyogMHhlYyAqLwotICAwLAkiIiwJCS8qIDB4ZWQgKi8KLSAgMCwJIiIsCQkvKiAweGVlICovCi0gIDAsCSIiLAkJLyogMHhlZiAqLwotICAwLAkiIiwJCS8qIDB4ZjAgKi8KLSAgMCwJIiIsCQkvKiAweGYxICovCi0gIDAsCSIiLAkJLyogMHhmMiAqLwotICAwLAkiIiwJCS8qIDB4ZjMgKi8KLSAgMCwJIiIsCQkvKiAweGY0ICovCi0gIDAsCSIiLAkJLyogMHhmNSAqLwotICAwLAkiIiwJCS8qIDB4ZjYgKi8KLSAgMCwJIiIsCQkvKiAweGY3ICovCi0gIDAsCSIiLAkJLyogMHhmOCAqLwotICAwLAkiIiwJCS8qIDB4ZjkgKi8KLSAgMCwJIiIsCQkvKiAweGZhICovCi0gIDAsCSIiLAkJLyogMHhmYiAqLwotICAwLAkiIiwJCS8qIDB4ZmMgKi8KLSAgMCwJIiIsCQkvKiAweGZkICovCi0gIDAsCSIiLAkJLyogMHhmZSAqLwotICAwLAkiIiwJCS8qIDB4ZmYgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgY29tcDFfb3Bjb2Rlc1tdID0KLXsKLSAgMHgwMCwKLSAgMHg0MCwKLSAgMHg0MSwKLSAgMHg0MiwKLSAgMHg0MywKLSAgMHg0NCwKLSAgMHg0NSwKLSAgMHg0NiwKLSAgMHg0NywKLSAgMHg0OCwKLSAgMHg0OSwKLSAgMHg0YSwKLSAgMHg0YiwKLSAgMHg2MCwKLSAgMHg4MCwKLSAgMHhhMCwKLSAgMHhjMCwKLSAgLTEKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgY29tcDJfb3Bjb2Rlc1tdID0KLXsKLSAgMHgwMCwKLSAgMHg4MCwKLSAgMHg4MiwKLSAgMHhjMCwKLSAgLTEKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgY29tcDNfb3Bjb2Rlc1tdID0KLXsKLSAgMHgwMCwKLSAgMHgwMiwKLSAgLTEKLX07Ci0KLS8qIFRoZXNlIGFwcGFyZW50bHkgYXJlIG5vdCBpbiBvbGRlciB2ZXJzaW9ucyBvZiBocHV4IHJlbG9jLmggKGhwdXg3KS4gICovCi0jaWZuZGVmIFJfRExUX1JFTAotI2RlZmluZSBSX0RMVF9SRUwgMHg3OAotI2VuZGlmCi0KLSNpZm5kZWYgUl9BVVhfVU5XSU5ECi0jZGVmaW5lIFJfQVVYX1VOV0lORCAweGNmCi0jZW5kaWYKLQotI2lmbmRlZiBSX1NFQ19TVE1UCi0jZGVmaW5lIFJfU0VDX1NUTVQgMHhkNwotI2VuZGlmCi0KLS8qIEFuZCB0aGVzZSBmaXJzdCBhcHBlYXJlZCBpbiBocHV4MTAuICAqLwotI2lmbmRlZiBSX1NIT1JUX1BDUkVMX01PREUKLSNkZWZpbmUgUl9TSE9SVF9QQ1JFTF9NT0RFIDB4M2UKLSNlbmRpZgotCi0jaWZuZGVmIFJfTE9OR19QQ1JFTF9NT0RFCi0jZGVmaW5lIFJfTE9OR19QQ1JFTF9NT0RFIDB4M2YKLSNlbmRpZgotCi0jaWZuZGVmIFJfTjBTRUwKLSNkZWZpbmUgUl9OMFNFTCAweGQ4Ci0jZW5kaWYKLQotI2lmbmRlZiBSX04xU0VMCi0jZGVmaW5lIFJfTjFTRUwgMHhkOQotI2VuZGlmCi0KLSNpZm5kZWYgUl9MSU5FVEFCCi0jZGVmaW5lIFJfTElORVRBQiAweGRhCi0jZW5kaWYKLQotI2lmbmRlZiBSX0xJTkVUQUJfRVNDCi0jZGVmaW5lIFJfTElORVRBQl9FU0MgMHhkYgotI2VuZGlmCi0KLSNpZm5kZWYgUl9MVFBfT1ZFUlJJREUKLSNkZWZpbmUgUl9MVFBfT1ZFUlJJREUgMHhkYwotI2VuZGlmCi0KLSNpZm5kZWYgUl9DT01NRU5UCi0jZGVmaW5lIFJfQ09NTUVOVCAweGRkCi0jZW5kaWYKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgc29tX2hwcGFfaG93dG9fdGFibGVbXSA9Ci17Ci0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9aRVJPRVMsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1pFUk9FUyJ9LAotICB7Ul9aRVJPRVMsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1pFUk9FUyJ9LAotICB7Ul9VTklOSVQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1VOSU5JVCJ9LAotICB7Ul9VTklOSVQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1VOSU5JVCJ9LAotICB7Ul9SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRUxPQ0FUSU9OIn0sCi0gIHtSX0RBVEFfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PTkVfU1lNQk9MIn0sCi0gIHtSX0RBVEFfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PTkVfU1lNQk9MIn0sCi0gIHtSX0RBVEFfUExBQkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX1BMQUJFTCJ9LAotICB7Ul9EQVRBX1BMQUJFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9QTEFCRUwifSwKLSAge1JfU1BBQ0VfUkVGLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TUEFDRV9SRUYifSwKLSAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKLSAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKLSAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKLSAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfU0hPUlRfUENSRUxfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU0hPUlRfUENSRUxfTU9ERSJ9LAotICB7Ul9MT05HX1BDUkVMX01PREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0xPTkdfUENSRUxfTU9ERSJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX0RMVF9SRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RMVF9SRUwifSwKLSAge1JfRExUX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRExUX1JFTCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX01JTExJX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTUlMTElfUkVMIn0sCi0gIHtSX01JTExJX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTUlMTElfUkVMIn0sCi0gIHtSX0NPREVfUExBQkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT0RFX1BMQUJFTCJ9LAotICB7Ul9DT0RFX1BMQUJFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9QTEFCRUwifSwKLSAge1JfQlJFQUtQT0lOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQlJFQUtQT0lOVCJ9LAotICB7Ul9FTlRSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5UUlkifSwKLSAge1JfRU5UUlksIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VOVFJZIn0sCi0gIHtSX0FMVF9FTlRSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUxUX0VOVFJZIn0sCi0gIHtSX0VYSVQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VYSVQifSwKLSAge1JfQkVHSU5fVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9CRUdJTl9UUlkifSwKLSAge1JfRU5EX1RSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5EX1RSWSJ9LAotICB7Ul9FTkRfVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9FTkRfVFJZIn0sCi0gIHtSX0VORF9UUlksIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VORF9UUlkifSwKLSAge1JfQkVHSU5fQlJUQUIsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0JFR0lOX0JSVEFCIn0sCi0gIHtSX0VORF9CUlRBQiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5EX0JSVEFCIn0sCi0gIHtSX1NUQVRFTUVOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU1RBVEVNRU5UIn0sCi0gIHtSX1NUQVRFTUVOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU1RBVEVNRU5UIn0sCi0gIHtSX1NUQVRFTUVOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU1RBVEVNRU5UIn0sCi0gIHtSX0RBVEFfRVhQUiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9FWFBSIn0sCi0gIHtSX0NPREVfRVhQUiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9FWFBSIn0sCi0gIHtSX0ZTRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0ZTRUwifSwKLSAge1JfTFNFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTFNFTCJ9LAotICB7Ul9SU0VMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SU0VMIn0sCi0gIHtSX05fTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTl9NT0RFIn0sCi0gIHtSX1NfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU19NT0RFIn0sCi0gIHtSX0RfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRF9NT0RFIn0sCi0gIHtSX1JfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUl9NT0RFIn0sCi0gIHtSX0RBVEFfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RBVEFfT1ZFUlJJREUifSwKLSAge1JfREFUQV9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PVkVSUklERSJ9LAotICB7Ul9EQVRBX09WRVJSSURFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX09WRVJSSURFIn0sCi0gIHtSX0RBVEFfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RBVEFfT1ZFUlJJREUifSwKLSAge1JfREFUQV9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PVkVSUklERSJ9LAotICB7Ul9UUkFOU0xBVEVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9UUkFOU0xBVEVEIn0sCi0gIHtSX0FVWF9VTldJTkQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FVWF9VTldJTkQifSwKLSAge1JfQ09NUDEsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPTVAxIn0sCi0gIHtSX0NPTVAyLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT01QMiJ9LAotICB7Ul9DT01QMywgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09NUDMifSwKLSAge1JfUFJFVl9GSVhVUCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUFJFVl9GSVhVUCJ9LAotICB7Ul9QUkVWX0ZJWFVQLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QUkVWX0ZJWFVQIn0sCi0gIHtSX1BSRVZfRklYVVAsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BSRVZfRklYVVAifSwKLSAge1JfUFJFVl9GSVhVUCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUFJFVl9GSVhVUCJ9LAotICB7Ul9TRUNfU1RNVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU0VDX1NUTVQifSwKLSAge1JfTjBTRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX04wU0VMIn0sCi0gIHtSX04xU0VMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OMVNFTCJ9LAotICB7Ul9MSU5FVEFCLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9MSU5FVEFCIn0sCi0gIHtSX0xJTkVUQUJfRVNDLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9MSU5FVEFCX0VTQyJ9LAotICB7Ul9MVFBfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0xUUF9PVkVSUklERSJ9LAotICB7Ul9DT01NRU5ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT01NRU5UIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9fTsKLSAgCi0vKiBJbml0aWFsaXplIHRoZSBTT00gcmVsb2NhdGlvbiBxdWV1ZS4gIEJ5IGRlZmluaXRpb24gdGhlIHF1ZXVlIGhvbGRzCi0gICB0aGUgbGFzdCBmb3VyIG11bHRpYnl0ZSBmaXh1cHMuICAqLwotICAKLXN0YXRpYyB2b2lkCi1zb21faW5pdGlhbGl6ZV9yZWxvY19xdWV1ZSAocXVldWUpCi0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIHF1ZXVlWzBdLnJlbG9jID0gTlVMTDsKLSAgcXVldWVbMF0uc2l6ZSA9IDA7Ci0gIHF1ZXVlWzFdLnJlbG9jID0gTlVMTDsKLSAgcXVldWVbMV0uc2l6ZSA9IDA7Ci0gIHF1ZXVlWzJdLnJlbG9jID0gTlVMTDsKLSAgcXVldWVbMl0uc2l6ZSA9IDA7Ci0gIHF1ZXVlWzNdLnJlbG9jID0gTlVMTDsKLSAgcXVldWVbM10uc2l6ZSA9IDA7Ci19Ci0KLS8qIEluc2VydCBhIG5ldyByZWxvY2F0aW9uIGludG8gdGhlIHJlbG9jYXRpb24gcXVldWUuICAqLwotCi1zdGF0aWMgdm9pZAotc29tX3JlbG9jX3F1ZXVlX2luc2VydCAocCwgc2l6ZSwgcXVldWUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOwotewotICBxdWV1ZVszXS5yZWxvYyA9IHF1ZXVlWzJdLnJlbG9jOwotICBxdWV1ZVszXS5zaXplID0gcXVldWVbMl0uc2l6ZTsKLSAgcXVldWVbMl0ucmVsb2MgPSBxdWV1ZVsxXS5yZWxvYzsKLSAgcXVldWVbMl0uc2l6ZSA9IHF1ZXVlWzFdLnNpemU7Ci0gIHF1ZXVlWzFdLnJlbG9jID0gcXVldWVbMF0ucmVsb2M7Ci0gIHF1ZXVlWzFdLnNpemUgPSBxdWV1ZVswXS5zaXplOwotICBxdWV1ZVswXS5yZWxvYyA9IHA7Ci0gIHF1ZXVlWzBdLnNpemUgPSBzaXplOwotfQotCi0vKiBXaGVuIGFuIGVudHJ5IGluIHRoZSByZWxvY2F0aW9uIHF1ZXVlIGlzIHJldXNlZCwgdGhlIGVudHJ5IG1vdmVzCi0gICB0byB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLiAgKi8KLQotc3RhdGljIHZvaWQKLXNvbV9yZWxvY19xdWV1ZV9maXggKHF1ZXVlLCBpbmRleCkKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLSAgICAgdW5zaWduZWQgaW50IGluZGV4OwotewotICBpZiAoaW5kZXggPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGluZGV4ID09IDEpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqdG1wMSA9IHF1ZXVlWzBdLnJlbG9jOwotICAgICAgdW5zaWduZWQgaW50IHRtcDIgPSBxdWV1ZVswXS5zaXplOwotICAgICAgcXVldWVbMF0ucmVsb2MgPSBxdWV1ZVsxXS5yZWxvYzsKLSAgICAgIHF1ZXVlWzBdLnNpemUgPSBxdWV1ZVsxXS5zaXplOwotICAgICAgcXVldWVbMV0ucmVsb2MgPSB0bXAxOwotICAgICAgcXVldWVbMV0uc2l6ZSA9IHRtcDI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbmRleCA9PSAyKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKnRtcDEgPSBxdWV1ZVswXS5yZWxvYzsKLSAgICAgIHVuc2lnbmVkIGludCB0bXAyID0gcXVldWVbMF0uc2l6ZTsKLSAgICAgIHF1ZXVlWzBdLnJlbG9jID0gcXVldWVbMl0ucmVsb2M7Ci0gICAgICBxdWV1ZVswXS5zaXplID0gcXVldWVbMl0uc2l6ZTsKLSAgICAgIHF1ZXVlWzJdLnJlbG9jID0gcXVldWVbMV0ucmVsb2M7Ci0gICAgICBxdWV1ZVsyXS5zaXplID0gcXVldWVbMV0uc2l6ZTsKLSAgICAgIHF1ZXVlWzFdLnJlbG9jID0gdG1wMTsKLSAgICAgIHF1ZXVlWzFdLnNpemUgPSB0bXAyOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaW5kZXggPT0gMykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICp0bXAxID0gcXVldWVbMF0ucmVsb2M7Ci0gICAgICB1bnNpZ25lZCBpbnQgdG1wMiA9IHF1ZXVlWzBdLnNpemU7Ci0gICAgICBxdWV1ZVswXS5yZWxvYyA9IHF1ZXVlWzNdLnJlbG9jOwotICAgICAgcXVldWVbMF0uc2l6ZSA9IHF1ZXVlWzNdLnNpemU7Ci0gICAgICBxdWV1ZVszXS5yZWxvYyA9IHF1ZXVlWzJdLnJlbG9jOwotICAgICAgcXVldWVbM10uc2l6ZSA9IHF1ZXVlWzJdLnNpemU7Ci0gICAgICBxdWV1ZVsyXS5yZWxvYyA9IHF1ZXVlWzFdLnJlbG9jOwotICAgICAgcXVldWVbMl0uc2l6ZSA9IHF1ZXVlWzFdLnNpemU7Ci0gICAgICBxdWV1ZVsxXS5yZWxvYyA9IHRtcDE7Ci0gICAgICBxdWV1ZVsxXS5zaXplID0gdG1wMjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGFib3J0KCk7Ci19Ci0KLS8qIFNlYXJjaCBmb3IgYSBwYXJ0aWN1bGFyIHJlbG9jYXRpb24gaW4gdGhlIHJlbG9jYXRpb24gcXVldWUuICAqLwotCi1zdGF0aWMgaW50Ci1zb21fcmVsb2NfcXVldWVfZmluZCAocCwgc2l6ZSwgcXVldWUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOwotewotICBpZiAocXVldWVbMF0ucmVsb2MgJiYgIW1lbWNtcCAocCwgcXVldWVbMF0ucmVsb2MsIHNpemUpCi0gICAgICAmJiBzaXplID09IHF1ZXVlWzBdLnNpemUpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChxdWV1ZVsxXS5yZWxvYyAmJiAhbWVtY21wIChwLCBxdWV1ZVsxXS5yZWxvYywgc2l6ZSkKLSAgICAgICYmIHNpemUgPT0gcXVldWVbMV0uc2l6ZSkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHF1ZXVlWzJdLnJlbG9jICYmICFtZW1jbXAgKHAsIHF1ZXVlWzJdLnJlbG9jLCBzaXplKQotICAgICAgJiYgc2l6ZSA9PSBxdWV1ZVsyXS5zaXplKQotICAgIHJldHVybiAyOwotICBpZiAocXVldWVbM10ucmVsb2MgJiYgIW1lbWNtcCAocCwgcXVldWVbM10ucmVsb2MsIHNpemUpCi0gICAgICAmJiBzaXplID09IHF1ZXVlWzNdLnNpemUpCi0gICAgcmV0dXJuIDM7Ci0gIHJldHVybiAtMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCBzaXplLCBxdWV1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgKnN1YnNwYWNlX3JlbG9jX3NpemVwOwotICAgICB1bnNpZ25lZCBjaGFyICpwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLXsKLSAgaW50IHF1ZXVlX2luZGV4ID0gc29tX3JlbG9jX3F1ZXVlX2ZpbmQgKHAsIHNpemUsIHF1ZXVlKTsKLQotICBpZiAocXVldWVfaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgLyogRm91bmQgdGhpcyBpbiBhIHByZXZpb3VzIGZpeHVwLiAgVW5kbyB0aGUgZml4dXAgd2UKLQkganVzdCBidWlsdCBhbmQgdXNlIFJfUFJFVl9GSVhVUCBpbnN0ZWFkLiAgV2Ugc2F2ZWQgCi0JIGEgdG90YWwgb2Ygc2l6ZSAtIDEgYnl0ZXMgaW4gdGhlIGZpeHVwIHN0cmVhbS4gICovCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIFJfUFJFVl9GSVhVUCArIHF1ZXVlX2luZGV4LCBwKTsKLSAgICAgIHAgKz0gMTsKLSAgICAgICpzdWJzcGFjZV9yZWxvY19zaXplcCArPSAxOwotICAgICAgc29tX3JlbG9jX3F1ZXVlX2ZpeCAocXVldWUsIHF1ZXVlX2luZGV4KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzb21fcmVsb2NfcXVldWVfaW5zZXJ0IChwLCBzaXplLCBxdWV1ZSk7Ci0gICAgICAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXAgKz0gc2l6ZTsKLSAgICAgIHAgKz0gc2l6ZTsKLSAgICB9Ci0gIHJldHVybiBwOwotfQotCi0vKiBFbWl0IHRoZSBwcm9wZXIgUl9OT19SRUxPQ0FUSU9OIGZpeHVwcyB0byBtYXAgdGhlIG5leHQgU0tJUAotICAgYnl0ZXMgd2l0aG91dCBhbnkgcmVsb2NhdGlvbi4gIFVwZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc3Vic3BhY2UKLSAgIHJlbG9jYXRpb24gc3RyZWFtIHZpYSBTVUJTUEFDRV9SRUxPQ19TSVpFX1A7IGFsc28gcmV0dXJuIHRoZSAKLSAgIGN1cnJlbnQgcG9pbnRlciBpbnRvIHRoZSByZWxvY2F0aW9uIHN0cmVhbS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXNvbV9yZWxvY19za2lwIChhYmZkLCBza2lwLCBwLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcXVldWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHNraXA7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXA7Ci0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIC8qIFVzZSBhIDQgYnl0ZSBSX05PX1JFTE9DQVRJT04gZW50cnkgd2l0aCBhIG1heGltYWwgdmFsdWUKLSAgICAgdGhlbiBSX1BSRVZfRklYVVBzIHRvIGdldCB0aGUgZGlmZmVyZW5jZSBkb3duIHRvIGEKLSAgICAgcmVhc29uYWJsZSBzaXplLiAgKi8KLSAgaWYgKHNraXAgPj0gMHgxMDAwMDAwKQotICAgIHsKLSAgICAgIHNraXAgLT0gMHgxMDAwMDAwOwotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAzMSwgcCk7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIDB4ZmYsIHAgKyAxKTsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIDB4ZmZmZiwgcCArIDIpOwotICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNCwgcXVldWUpOwotICAgICAgd2hpbGUgKHNraXAgPj0gMHgxMDAwMDAwKQotCXsKLQkgIHNraXAgLT0gMHgxMDAwMDAwOwotCSAgYmZkX3B1dF84IChhYmZkLCBSX1BSRVZfRklYVVAsIHApOwotCSAgcCsrOwotCSAgKnN1YnNwYWNlX3JlbG9jX3NpemVwICs9IDE7Ci0JICAvKiBObyBuZWVkIHRvIGFkanVzdCBxdWV1ZSBoZXJlIHNpbmNlIHdlIGFyZSByZXBlYXRpbmcgdGhlCi0JICAgICBtb3N0IHJlY2VudCBmaXh1cC4gICovCi0JfQotICAgIH0KLSAgCi0gIC8qIFRoZSBkaWZmZXJlbmNlIG11c3QgYmUgbGVzcyB0aGFuIDB4MTAwMDAwMC4gIFVzZSBvbmUgCi0gICAgIG1vcmUgUl9OT19SRUxPQ0FUSU9OIGVudHJ5IHRvIGdldCB0byB0aGUgcmlnaHQgZGlmZmVyZW5jZS4gICovCi0gIGlmICgoc2tpcCAmIDMpID09IDAgJiYgc2tpcCA8PSAweGMwMDAwICYmIHNraXAgPiAwKQotICAgIHsKLSAgICAgIC8qIERpZmZlcmVuY2UgY2FuIGJlIGhhbmRsZWQgaW4gYSBzaW1wbGUgc2luZ2xlLWJ5dGUKLQkgUl9OT19SRUxPQ0FUSU9OIGVudHJ5LiAgKi8KLSAgICAgIGlmIChza2lwIDw9IDB4NjApCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAoc2tpcCA+PiAyKSAtIDEsIHApOwotCSAgKnN1YnNwYWNlX3JlbG9jX3NpemVwICs9IDE7Ci0JICBwKys7Ci0JfQotICAgICAgLyogSGFuZGxlIGl0IHdpdGggYSB0d28gYnl0ZSBSX05PX1JFTE9DQVRJT04gZW50cnkuICAqLwotICAgICAgZWxzZSBpZiAoc2tpcCA8PSAweDEwMDApCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAyNCArICgoKHNraXAgPj4gMikgLSAxKSA+PiA4KSwgcCk7Ci0JICBiZmRfcHV0XzggKGFiZmQsIChza2lwID4+IDIpIC0gMSwgcCArIDEpOwotCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgMiwgcXVldWUpOwotCX0KLSAgICAgIC8qIEhhbmRsZSBpdCB3aXRoIGEgdGhyZWUgYnl0ZSBSX05PX1JFTE9DQVRJT04gZW50cnkuICAqLwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfOCAoYWJmZCwgUl9OT19SRUxPQ0FUSU9OICsgMjggKyAoKChza2lwID4+IDIpIC0gMSkgPj4gMTYpLCBwKTsKLQkgIGJmZF9wdXRfMTYgKGFiZmQsIChza2lwID4+IDIpIC0gMSwgcCArIDEpOwotCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgMywgcXVldWUpOwotCX0KLSAgICB9Ci0gIC8qIFVnaC4gIFB1bnQgYW5kIHVzZSBhIDQgYnl0ZSBlbnRyeS4gICovCi0gIGVsc2UgaWYgKHNraXAgPiAwKQotICAgIHsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgUl9OT19SRUxPQ0FUSU9OICsgMzEsIHApOwotICAgICAgYmZkX3B1dF84IChhYmZkLCAoc2tpcCAtIDEpID4+IDE2LCBwICsgMSk7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBza2lwIC0gMSwgcCArIDIpOwotICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNCwgcXVldWUpOwotICAgIH0KLSAgcmV0dXJuIHA7Ci19Ci0KLS8qIEVtaXQgdGhlIHByb3BlciBSX0RBVEFfT1ZFUlJJREUgZml4dXBzIHRvIGhhbmRsZSBhIG5vbnplcm8gYWRkZW5kCi0gICBmcm9tIGEgQkZEIHJlbG9jYXRpb24uICBVcGRhdGUgdGhlIHNpemUgb2YgdGhlIHN1YnNwYWNlIHJlbG9jYXRpb24KLSAgIHN0cmVhbSB2aWEgU1VCU1BBQ0VfUkVMT0NfU0laRV9QOyBhbHNvIHJldHVybiB0aGUgY3VycmVudCBwb2ludGVyCi0gICBpbnRvIHRoZSByZWxvY2F0aW9uIHN0cmVhbS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXNvbV9yZWxvY19hZGRlbmQgKGFiZmQsIGFkZGVuZCwgcCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHF1ZXVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBhZGRlbmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXA7Ci0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIGlmICgodW5zaWduZWQpKGFkZGVuZCkgKyAweDgwIDwgMHgxMDApCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyAxLCBwKTsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYWRkZW5kLCBwICsgMSk7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAyLCBxdWV1ZSk7IAotICAgIH0KLSAgZWxzZSBpZiAoKHVuc2lnbmVkKSAoYWRkZW5kKSArIDB4ODAwMCA8IDB4MTAwMDApCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyAyLCBwKTsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGFkZGVuZCwgcCArIDEpOwotICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgMywgcXVldWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKHVuc2lnbmVkKSAoYWRkZW5kKSArIDB4ODAwMDAwIDwgMHgxMDAwMDAwKQotICAgIHsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgUl9EQVRBX09WRVJSSURFICsgMywgcCk7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIGFkZGVuZCA+PiAxNiwgcCArIDEpOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgYWRkZW5kLCBwICsgMik7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCA0LCBxdWV1ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyA0LCBwKTsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGFkZGVuZCwgcCArIDEpOwotICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNSwgcXVldWUpOwotICAgIH0KLSAgcmV0dXJuIHA7Ci19Ci0KLS8qIEhhbmRsZSBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1zb21fcmVsb2NfY2FsbCAoYWJmZCwgcCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIGJmZF9yZWxvYywgc3ltX251bSwgcXVldWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgaW50ICpzdWJzcGFjZV9yZWxvY19zaXplcDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBpbnQgc3ltX251bTsKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLXsKLSAgaW50IGFyZ19iaXRzID0gSFBQQV9SX0FSR19SRUxPQyAoYmZkX3JlbG9jLT5hZGRlbmQpOwotICBpbnQgcnRuX2JpdHMgPSBhcmdfYml0cyAmIDB4MzsKLSAgaW50IHR5cGUsIGRvbmUgPSAwOwotICAKLSAgLyogWW91J2xsIG5ldmVyIGJlbGlldmUgYWxsIHRoaXMgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSByZWxvY2F0aW9ucwotICAgICBmb3IgZnVuY3Rpb24gY2FsbHMuICBIYXZpbmcgdG8gY29tcHV0ZSBhbmQgcGFjayB0aGUgYXJndW1lbnQKLSAgICAgcmVsb2NhdGlvbiBiaXRzIGlzIHRoZSByZWFsIG5pZ2h0bWFyZS4KLSAgICAgCi0gICAgIElmIHlvdSdyZSBpbnRlcmVzdGVkIGluIGhvdyB0aGlzIHdvcmtzLCBqdXN0IGZvcmdldCBpdC4gIFlvdSByZWFsbHkKLSAgICAgZG8gbm90IHdhbnQgdG8ga25vdyBhYm91dCB0aGlzIGJyYWluZGFtYWdlLiAgKi8KLQotICAvKiBGaXJzdCBzZWUgaWYgdGhpcyBjYW4gYmUgZG9uZSB3aXRoIGEgInNpbXBsZSIgcmVsb2NhdGlvbi4gIFNpbXBsZQotICAgICByZWxvY2F0aW9ucyBoYXZlIGEgc3ltYm9sIG51bWJlciA8IDB4MTAwIGFuZCBoYXZlIHNpbXBsZSBlbmNvZGluZ3MKLSAgICAgb2YgYXJndW1lbnQgcmVsb2NhdGlvbnMuICAqLwotCi0gIGlmIChzeW1fbnVtIDwgMHgxMDApCi0gICAgewotICAgICAgc3dpdGNoIChhcmdfYml0cykKLQl7Ci0JY2FzZSAwOgotCWNhc2UgMToKLQkgIHR5cGUgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSAxIDw8IDg6Ci0JY2FzZSAxIDw8IDggfCAxOgotCSAgdHlwZSA9IDE7Ci0JICBicmVhazsKLQljYXNlIDEgPDwgOCB8IDEgPDwgNjoKLQljYXNlIDEgPDwgOCB8IDEgPDwgNiB8IDE6Ci0JICB0eXBlID0gMjsKLQkgIGJyZWFrOwotCWNhc2UgMSA8PCA4IHwgMSA8PCA2IHwgMSA8PCA0OgotCWNhc2UgMSA8PCA4IHwgMSA8PCA2IHwgMSA8PCA0IHwgMToKLQkgIHR5cGUgPSAzOwotCSAgYnJlYWs7Ci0JY2FzZSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQgfCAxIDw8IDI6Ci0JY2FzZSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQgfCAxIDw8IDIgfCAxOgotCSAgdHlwZSA9IDQ7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgLyogTm90IG9uZSBvZiB0aGUgZWFzeSBlbmNvZGluZ3MuICBUaGlzIHdpbGwgaGF2ZSB0byBiZQotCSAgICAgaGFuZGxlZCBieSB0aGUgbW9yZSBjb21wbGV4IGNvZGUgYmVsb3cuICAqLwotCSAgdHlwZSA9IC0xOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKHR5cGUgIT0gLTEpCi0JewotCSAgLyogQWNjb3VudCBmb3IgdGhlIHJldHVybiB2YWx1ZSB0b28uICAqLwotCSAgaWYgKHJ0bl9iaXRzKQotCSAgICB0eXBlICs9IDU7Ci0KLQkgIC8qIEVtaXQgYSAyIGJ5dGUgcmVsb2NhdGlvbi4gIFRoZW4gc2VlIGlmIGl0IGNhbiBiZSBoYW5kbGVkCi0JICAgICB3aXRoIGEgcmVsb2NhdGlvbiB3aGljaCBpcyBhbHJlYWR5IGluIHRoZSByZWxvY2F0aW9uIHF1ZXVlLiAgKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIHR5cGUsIHApOwotCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtLCBwICsgMSk7Ci0JICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAyLCBxdWV1ZSk7Ci0JICBkb25lID0gMTsKLQl9Ci0gICAgfQotICAKLSAgLyogSWYgdGhpcyBjb3VsZCBub3QgYmUgaGFuZGxlZCB3aXRoIGEgc2ltcGxlIHJlbG9jYXRpb24sIHRoZW4gZG8gYSBoYXJkCi0gICAgIG9uZS4gIEhhcmQgcmVsb2NhdGlvbnMgb2NjdXIgaWYgdGhlIHN5bWJvbCBudW1iZXIgd2FzIHRvbyBoaWdoIG9yIGlmCi0gICAgIHRoZSBlbmNvZGluZyBvZiBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgaXMgdG9vIGNvbXBsZXguICAqLwotICBpZiAoISBkb25lKQotICAgIHsKLSAgICAgIC8qIERvbid0IGFzayBhYm91dCB0aGVzZSBtYWdpYyBzZXF1ZW5jZXMuICBJIHRvb2sgdGhlbSBzdHJhaWdodAotCSBmcm9tIGdhcy0xLjM2IHdoaWNoIHRvb2sgdGhlbSBmcm9tIHRoZSBhLm91dCBtYW4gcGFnZS4gICovCi0gICAgICB0eXBlID0gcnRuX2JpdHM7Ci0gICAgICBpZiAoKGFyZ19iaXRzID4+IDYgJiAweGYpID09IDB4ZSkKLQl0eXBlICs9IDkgKiA0MDsKLSAgICAgIGVsc2UKLQl0eXBlICs9ICgzICogKGFyZ19iaXRzID4+IDggJiAzKSArIChhcmdfYml0cyA+PiA2ICYgMykpICogNDA7Ci0gICAgICBpZiAoKGFyZ19iaXRzID4+IDIgJiAweGYpID09IDB4ZSkKLQl0eXBlICs9IDkgKiA0OwotICAgICAgZWxzZQotCXR5cGUgKz0gKDMgKiAoYXJnX2JpdHMgPj4gNCAmIDMpICsgKGFyZ19iaXRzID4+IDIgJiAzKSkgKiA0OwotICAgICAgCi0gICAgICAvKiBPdXRwdXQgdGhlIGZpcnN0IHR3byBieXRlcyBvZiB0aGUgcmVsb2NhdGlvbi4gIFRoZXNlIGRlc2NyaWJlCi0JIHRoZSBsZW5ndGggb2YgdGhlIHJlbG9jYXRpb24gYW5kIGVuY29kaW5nIHN0eWxlLiAgKi8KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDEwCi0JCSArIDIgKiAoc3ltX251bSA+PSAweDEwMCkgKyAodHlwZSA+PSAweDEwMCksCi0JCSBwKTsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdHlwZSwgcCArIDEpOwotICAgICAgCi0gICAgICAvKiBOb3cgb3V0cHV0IHRoZSBzeW1ib2wgaW5kZXggYW5kIHNlZSBpZiB0aGlzIGJpemFycmUgcmVsb2NhdGlvbgotCSBqdXN0IGhhcHBlbmVkIHRvIGJlIGluIHRoZSByZWxvY2F0aW9uIHF1ZXVlLiAgKi8KLSAgICAgIGlmIChzeW1fbnVtIDwgMHgxMDApCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtLCBwICsgMik7Ci0JICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAzLCBxdWV1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfOCAoYWJmZCwgc3ltX251bSA+PiAxNiwgcCArIDIpOwotCSAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDMpOwotCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNSwgcXVldWUpOwotCX0KLSAgICB9Ci0gIHJldHVybiBwOwotfQotCi0KLS8qIFJldHVybiB0aGUgbG9nYXJpdGhtIG9mIFgsIGJhc2UgMiwgY29uc2lkZXJpbmcgWCB1bnNpZ25lZC4gCi0gICBBYm9ydCAtMSBpZiBYIGlzIG5vdCBhIHBvd2VyIG9yIHR3byBvciBpcyB6ZXJvLiAgKi8KLQotc3RhdGljIGludAotbG9nMiAoeCkKLSAgICAgdW5zaWduZWQgaW50IHg7Ci17Ci0gIGludCBsb2cgPSAwOwotCi0gIC8qIFRlc3QgZm9yIDAgb3IgYSBwb3dlciBvZiAyLiAgKi8KLSAgaWYgKHggPT0gMCB8fCB4ICE9ICh4ICYgLXgpKQotICAgIHJldHVybiAtMTsKLQotICB3aGlsZSAoKHggPj49IDEpICE9IDApCi0gICAgbG9nKys7Ci0gIHJldHVybiBsb2c7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWhwcGFfc29tX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQlpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgaWYgKG91dHB1dF9iZmQpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBHaXZlbiBhIGdlbmVyaWMgSFBQQSByZWxvY2F0aW9uIHR5cGUsIHRoZSBpbnN0cnVjdGlvbiBmb3JtYXQsCi0gICBhbmQgYSBmaWVsZCBzZWxlY3RvciwgcmV0dXJuIG9uZSBvciBtb3JlIGFwcHJvcHJpYXRlIFNPTSByZWxvY2F0aW9ucy4gICovCi0KLWludCAqKgotaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUgKGFiZmQsIGJhc2VfdHlwZSwgZm9ybWF0LCBmaWVsZCwgc3ltX2RpZmYsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgYmFzZV90eXBlOwotICAgICBpbnQgZm9ybWF0OwotICAgICBlbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQgZmllbGQ7Ci0gICAgIGludCBzeW1fZGlmZjsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICBpbnQgKmZpbmFsX3R5cGUsICoqZmluYWxfdHlwZXM7Ci0KLSAgZmluYWxfdHlwZXMgPSAoaW50ICoqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50ICopICogNik7Ci0gIGZpbmFsX3R5cGUgPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLSAgaWYgKCFmaW5hbF90eXBlcyB8fCAhZmluYWxfdHlwZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBUaGUgZmllbGQgc2VsZWN0b3IgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCByZWxvY2F0aW9ucyB0byBiZSAKLSAgICAgZ2VuZXJhdGVkLiAgSXQncyBpbXBvc3NpYmxlIHRvIGtub3cgYXQgdGhpcyBtb21lbnQgaWYgYWRkaXRpb25hbAotICAgICByZWxvY2F0aW9ucyB3aWxsIGJlIG5lZWRlZCwgc28gd2UgbWFrZSB0aGVtLiAgVGhlIGNvZGUgdG8gYWN0dWFsbHkKLSAgICAgd3JpdGUgdGhlIHJlbG9jYXRpb24vZml4dXAgc3RyZWFtIGlzIHJlc3BvbnNpYmxlIGZvciByZW1vdmluZwotICAgICBhbnkgcmVkdW5kYW50IHJlbG9jYXRpb25zLiAgKi8KLSAgc3dpdGNoIChmaWVsZCkKLSAgICB7Ci0gICAgICBjYXNlIGVfZnNlbDoKLSAgICAgIGNhc2UgZV9wc2VsOgotICAgICAgY2FzZSBlX2xwc2VsOgotICAgICAgY2FzZSBlX3Jwc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1sxXSA9IE5VTEw7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfdHNlbDoKLSAgICAgIGNhc2UgZV9sdHNlbDoKLSAgICAgIGNhc2UgZV9ydHNlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQlpZiAoZmllbGQgPT0gZV90c2VsKQotCSAgKmZpbmFsX3R5cGVzWzBdID0gUl9GU0VMOwotCWVsc2UgaWYgKGZpZWxkID09IGVfbHRzZWwpCi0JICAqZmluYWxfdHlwZXNbMF0gPSBSX0xTRUw7Ci0JZWxzZQotCSAgKmZpbmFsX3R5cGVzWzBdID0gUl9SU0VMOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV9sc3NlbDoKLSAgICAgIGNhc2UgZV9yc3NlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQkqZmluYWxfdHlwZXNbMF0gPSBSX1NfTU9ERTsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfbHNlbDoKLSAgICAgIGNhc2UgZV9yc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JaWYgKCFmaW5hbF90eXBlc1swXSkKLQkgIHJldHVybiBOVUxMOwotCSpmaW5hbF90eXBlc1swXSA9IFJfTl9NT0RFOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV9sZHNlbDoKLSAgICAgIGNhc2UgZV9yZHNlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQkqZmluYWxfdHlwZXNbMF0gPSBSX0RfTU9ERTsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfbHJzZWw6Ci0gICAgICBjYXNlIGVfcnJzZWw6Ci0JZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzBdKQotCSAgcmV0dXJuIE5VTEw7Ci0JKmZpbmFsX3R5cGVzWzBdID0gUl9SX01PREU7Ci0JZmluYWxfdHlwZXNbMV0gPSBmaW5hbF90eXBlOwotCWZpbmFsX3R5cGVzWzJdID0gTlVMTDsKLQkqZmluYWxfdHlwZSA9IGJhc2VfdHlwZTsKLQlicmVhazsKLQotICAgICAgY2FzZSBlX25zZWw6Ci0JZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzBdKQotCSAgcmV0dXJuIE5VTEw7Ci0JKmZpbmFsX3R5cGVzWzBdID0gUl9OMVNFTDsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfbmxzZWw6Ci0gICAgICBjYXNlIGVfbmxyc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JaWYgKCFmaW5hbF90eXBlc1swXSkKLQkgIHJldHVybiBOVUxMOwotCSpmaW5hbF90eXBlc1swXSA9IFJfTjBTRUw7Ci0JZmluYWxfdHlwZXNbMV0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzFdKQotCSAgcmV0dXJuIE5VTEw7Ci0JaWYgKGZpZWxkID09IGVfbmxzZWwpCi0JICAqZmluYWxfdHlwZXNbMV0gPSBSX05fTU9ERTsKLQllbHNlCi0JICAqZmluYWxfdHlwZXNbMV0gPSBSX1JfTU9ERTsKLQlmaW5hbF90eXBlc1syXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbM10gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotICAgIH0KLSAgCi0gIHN3aXRjaCAoYmFzZV90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSFBQQToKLSAgICAgIC8qIFRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIG5lZWRzICp2ZXJ5KiBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KLSAgICAgIGlmIChzeW1fZGlmZikKLQl7Ci0JICBmaW5hbF90eXBlc1swXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1sxXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1syXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1szXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBpZiAoIWZpbmFsX3R5cGVzWzBdIHx8ICFmaW5hbF90eXBlc1sxXSB8fCAhZmluYWxfdHlwZXNbMl0pCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgIGlmIChmaWVsZCA9PSBlX2ZzZWwpCi0JICAgICpmaW5hbF90eXBlc1swXSA9IFJfRlNFTDsKLQkgIGVsc2UgaWYgKGZpZWxkID09IGVfcnNlbCkKLQkgICAgKmZpbmFsX3R5cGVzWzBdID0gUl9SU0VMOwotCSAgZWxzZSBpZiAoZmllbGQgPT0gZV9sc2VsKQotCSAgICAqZmluYWxfdHlwZXNbMF0gPSBSX0xTRUw7Ci0JICAqZmluYWxfdHlwZXNbMV0gPSBSX0NPTVAyOwotCSAgKmZpbmFsX3R5cGVzWzJdID0gUl9DT01QMjsKLQkgICpmaW5hbF90eXBlc1szXSA9IFJfQ09NUDE7Ci0JICBmaW5hbF90eXBlc1s0XSA9IGZpbmFsX3R5cGU7Ci0JICBpZiAoZm9ybWF0ID09IDMyKQotCSAgICAqZmluYWxfdHlwZXNbNF0gPSBSX0RBVEFfRVhQUjsKLQkgIGVsc2UKLQkgICAgKmZpbmFsX3R5cGVzWzRdID0gUl9DT0RFX0VYUFI7Ci0JICBmaW5hbF90eXBlc1s1XSA9IE5VTEw7Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKiBQTEFCRUxzIGdldCB0aGVpciBvd24gcmVsb2NhdGlvbiB0eXBlLiAgKi8KLSAgICAgIGVsc2UgaWYgKGZpZWxkID09IGVfcHNlbAotCSAgfHwgZmllbGQgPT0gZV9scHNlbAotCSAgfHwgZmllbGQgPT0gZV9ycHNlbCkKLQl7Ci0JICAvKiBBIFBMQUJFTCByZWxvY2F0aW9uIHRoYXQgaGFzIGEgc2l6ZSBvZiAzMiBiaXRzIG11c3QKLQkgICAgIGJlIGEgUl9EQVRBX1BMQUJFTC4gIEFsbCBvdGhlcnMgYXJlIFJfQ09ERV9QTEFCRUxzLiAgKi8KLQkgIGlmIChmb3JtYXQgPT0gMzIpCi0JICAgICpmaW5hbF90eXBlID0gUl9EQVRBX1BMQUJFTDsKLQkgIGVsc2UKLQkgICAgKmZpbmFsX3R5cGUgPSBSX0NPREVfUExBQkVMOwotCX0KLSAgICAgIC8qIFBJQyBzdHVmZi4gICovCi0gICAgICBlbHNlIGlmIChmaWVsZCA9PSBlX3RzZWwKLQkgIHx8IGZpZWxkID09IGVfbHRzZWwKLQkgIHx8IGZpZWxkID09IGVfcnRzZWwpCi0JKmZpbmFsX3R5cGUgPSBSX0RMVF9SRUw7Ci0gICAgICAvKiBBIHJlbG9jYXRpb24gaW4gdGhlIGRhdGEgc3BhY2UgaXMgYWx3YXlzIGEgZnVsbCAzMmJpdHMuICAqLwotICAgICAgZWxzZSBpZiAoZm9ybWF0ID09IDMyKQotCXsKLQkgICpmaW5hbF90eXBlID0gUl9EQVRBX09ORV9TWU1CT0w7Ci0KLQkgIC8qIElmIHRoZXJlJ3Mgbm8gU09NIHN5bWJvbCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJGRAotCSAgICAgc3ltYm9sLCB0aGVuIHNldCB0aGUgc3ltYm9sIHR5cGUgdG8gU1RfREFUQS4KLQotCSAgICAgT25seSBkbyB0aGlzIGlmIHRoZSB0eXBlIGlzIGdvaW5nIHRvIGRlZmF1bHQgbGF0ZXIgd2hlbgotCSAgICAgd2Ugd3JpdGUgdGhlIG9iamVjdCBmaWxlLgotCi0JICAgICBUaGlzIGlzIGRvbmUgc28gdGhhdCB0aGUgbGlua2VyIG5ldmVyIGVuY291bnRlcnMgYW4KLQkgICAgIFJfREFUQV9PTkVfU1lNQk9MIHJlbG9jIGludm9sdmluZyBhbiBTVF9DT0RFIHN5bWJvbC4KLQotCSAgICAgVGhpcyBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIGdlbmVyYXRlIGV4Y2VwdGlvbiBoYW5kbGluZwotCSAgICAgdGFibGVzLgotCi0JICAgICBOb3RlIHRoYXQgb25lIGRheSB3ZSBtYXkgbmVlZCB0byBhbHNvIGVtaXQgQkVHSU5fQlJUQUIgYW5kCi0JICAgICBFTkRfQlJUQUIgdG8gcHJldmVudCB0aGUgbGlua2VyIGZyb20gb3B0aW1pemluZyBhd2F5IGluc25zCi0JICAgICBpbiBleGNlcHRpb24gaGFuZGxpbmcgcmVnaW9ucy4gICovCi0JICBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9VTktOT1dOCi0JICAgICAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLQkgICAgICAmJiAoc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikgPT0gMAotCSAgICAgICYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCSAgICBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfREFUQTsKLQl9Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSBSX0hQUEFfR09UT0ZGOgotICAgICAgLyogTW9yZSBQTEFCRUwgc3BlY2lhbCBjYXNlcy4gICovCi0gICAgICBpZiAoZmllbGQgPT0gZV9wc2VsCi0JICB8fCBmaWVsZCA9PSBlX2xwc2VsCi0JICB8fCBmaWVsZCA9PSBlX3Jwc2VsKQotCSpmaW5hbF90eXBlID0gUl9EQVRBX1BMQUJFTDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0hQUEFfQ09NUExFWDoKLSAgICAgIC8qIFRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIG5lZWRzICp2ZXJ5KiBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KLSAgICAgIGlmIChzeW1fZGlmZikKLQl7Ci0JICBmaW5hbF90eXBlc1swXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1sxXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1syXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1szXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBpZiAoIWZpbmFsX3R5cGVzWzBdIHx8ICFmaW5hbF90eXBlc1sxXSB8fCAhZmluYWxfdHlwZXNbMl0pCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgIGlmIChmaWVsZCA9PSBlX2ZzZWwpCi0JICAgICpmaW5hbF90eXBlc1swXSA9IFJfRlNFTDsKLQkgIGVsc2UgaWYgKGZpZWxkID09IGVfcnNlbCkKLQkgICAgKmZpbmFsX3R5cGVzWzBdID0gUl9SU0VMOwotCSAgZWxzZSBpZiAoZmllbGQgPT0gZV9sc2VsKQotCSAgICAqZmluYWxfdHlwZXNbMF0gPSBSX0xTRUw7Ci0JICAqZmluYWxfdHlwZXNbMV0gPSBSX0NPTVAyOwotCSAgKmZpbmFsX3R5cGVzWzJdID0gUl9DT01QMjsKLQkgICpmaW5hbF90eXBlc1szXSA9IFJfQ09NUDE7Ci0JICBmaW5hbF90eXBlc1s0XSA9IGZpbmFsX3R5cGU7Ci0JICBpZiAoZm9ybWF0ID09IDMyKQotCSAgICAqZmluYWxfdHlwZXNbNF0gPSBSX0RBVEFfRVhQUjsKLQkgIGVsc2UKLQkgICAgKmZpbmFsX3R5cGVzWzRdID0gUl9DT0RFX0VYUFI7Ci0JICBmaW5hbF90eXBlc1s1XSA9IE5VTEw7Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0KLSAgICBjYXNlIFJfSFBQQV9OT05FOgotICAgIGNhc2UgUl9IUFBBX0FCU19DQUxMOgotICAgIGNhc2UgUl9IUFBBX1BDUkVMX0NBTEw6Ci0gICAgICAvKiBSaWdodCBub3cgd2UgY2FuIGRlZmF1bHQgYWxsIHRoZXNlLiAgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIGZpbmFsX3R5cGVzOwotfQotCi0vKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlY3QgZW50cnkgaW4gdGhlIFBBIFNPTSByZWxvY2F0aW9uCi0gICBob3d0byB0YWJsZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotc29tX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgaWYgKChpbnQpIGNvZGUgPCAoaW50KSBSX05PX1JFTE9DQVRJT04gKyAyNTUpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoKGludCkgc29tX2hwcGFfaG93dG9fdGFibGVbKGludCkgY29kZV0udHlwZSA9PSAoaW50KSBjb2RlKTsKLSAgICAgIHJldHVybiAmc29tX2hwcGFfaG93dG9fdGFibGVbKGludCkgY29kZV07Ci0gICAgfQotCi0gIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSAwOwotfQotCi0vKiBQZXJmb3JtIHNvbWUgaW5pdGlhbGl6YXRpb24gZm9yIGFuIG9iamVjdC4gIFNhdmUgcmVzdWx0cyBvZiB0aGlzCi0gICBpbml0aWFsaXphdGlvbiBpbiB0aGUgQkZELiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotc29tX29iamVjdF9zZXR1cCAoYWJmZCwgZmlsZV9oZHJwLCBhdXhfaGRycCwgY3VycmVudF9vZmZzZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGhlYWRlciAqZmlsZV9oZHJwOwotICAgICBzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyICphdXhfaGRycDsKLSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGludCBmb3VuZDsKLQotICAvKiBzb21fbWtvYmplY3Qgd2lsbCBzZXQgYmZkX2Vycm9yIGlmIHNvbV9ta29iamVjdCBmYWlscy4gICovCi0gIGlmIChzb21fbWtvYmplY3QgKGFiZmQpICE9IHRydWUpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogU2V0IEJGRCBmbGFncyBiYXNlZCBvbiB3aGF0IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgU09NLiAgKi8KLSAgYWJmZC0+ZmxhZ3MgPSBCRkRfTk9fRkxBR1M7Ci0gIGlmIChmaWxlX2hkcnAtPnN5bWJvbF90b3RhbCkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTOwotCi0gIHN3aXRjaCAoZmlsZV9oZHJwLT5hX21hZ2ljKQotICAgIHsKLSAgICBjYXNlIERFTUFORF9NQUdJQzoKLSAgICAgIGFiZmQtPmZsYWdzIHw9IChEX1BBR0VEIHwgV1BfVEVYVCB8IEVYRUNfUCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIQVJFX01BR0lDOgotICAgICAgYWJmZC0+ZmxhZ3MgfD0gKFdQX1RFWFQgfCBFWEVDX1ApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFWEVDX01BR0lDOgotICAgICAgYWJmZC0+ZmxhZ3MgfD0gKEVYRUNfUCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJFTE9DX01BR0lDOgotICAgICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1JFTE9DOwotICAgICAgYnJlYWs7Ci0jaWZkZWYgU0hMX01BR0lDCi0gICAgY2FzZSBTSExfTUFHSUM6Ci0jZW5kaWYKLSNpZmRlZiBETF9NQUdJQwotICAgIGNhc2UgRExfTUFHSUM6Ci0jZW5kaWYKLSAgICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgdG8gaG9sZCB0aGUgc2F2ZWQgZXhlYyBoZWFkZXIgaW5mb3JtYXRpb24uICAqLwotICBvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCkgPSAoc3RydWN0IHNvbV9leGVjX2RhdGEgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzb21fZXhlY19kYXRhICkpOwotICBpZiAob2JqX3NvbV9leGVjX2RhdGEgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogVGhlIGJyYWluZGFtYWdlZCBPU0YxIGxpbmtlciBzd2l0Y2hlZCBleGVjX2ZsYWdzIGFuZCBleGVjX2VudHJ5IQotCi0gICAgIFdlIHVzZWQgdG8gaWRlbnRpZnkgT1NGMSBiaW5hcmllcyBiYXNlZCBvbiBORVdfVkVSU0lPTl9JRCwgYnV0Ci0gICAgIGFwcGFyZW50bHkgdGhlIGxhdGVzdCBIUFVYIGxpbmtlciBpcyB1c2luZyBORVdfVkVSU0lPTl9JRCBub3cuCi0KLSAgICAgSXQncyBhYm91dCB0aW1lLCBPU0YgaGFzIHVzZWQgdGhlIG5ldyBpZCBzaW5jZSBhdCBsZWFzdCAxOTkyOwotICAgICBIUFVYIGRpZG4ndCBzdGFydCB0aWxsIG5lYXJseSAxOTk1IS4KLSAgICAKLSAgICAgVGhlIG5ldyBhcHByb2FjaCBleGFtaW5lcyB0aGUgZW50cnkgZmllbGQuICBJZiBpdCdzIHplcm8gb3Igbm90IDQKLSAgICAgYnl0ZSBhbGlnbmVkIHRoZW4gaXQncyBub3QgYSBwcm9wZXIgY29kZSBhZGRyZXNzIGFuZCB3ZSBndWVzcyBpdCdzCi0gICAgIHJlYWxseSB0aGUgZXhlY3V0YWJsZSBmbGFncy4gICovCi0gIGZvdW5kID0gMDsKLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb247IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLQljb250aW51ZTsKLSAgICAgIGlmIChhdXhfaGRycC0+ZXhlY19lbnRyeSA+PSBzZWN0aW9uLT52bWEKLQkgICYmIGF1eF9oZHJwLT5leGVjX2VudHJ5IDwgc2VjdGlvbi0+dm1hICsgc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotCWZvdW5kID0gMTsKLSAgICB9Ci0gIGlmIChhdXhfaGRycC0+ZXhlY19lbnRyeSA9PSAwCi0gICAgICB8fCAoYXV4X2hkcnAtPmV4ZWNfZW50cnkgJiAweDMpICE9IDAKLSAgICAgIHx8ICEgZm91bmQpCi0gICAgewotICAgICAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IGF1eF9oZHJwLT5leGVjX2ZsYWdzOwotICAgICAgb2JqX3NvbV9leGVjX2RhdGEgKGFiZmQpLT5leGVjX2ZsYWdzID0gYXV4X2hkcnAtPmV4ZWNfZW50cnk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IGF1eF9oZHJwLT5leGVjX2VudHJ5ICsgY3VycmVudF9vZmZzZXQ7Ci0gICAgICBvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCktPmV4ZWNfZmxhZ3MgPSBhdXhfaGRycC0+ZXhlY19mbGFnczsKLSAgICB9Ci0KLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfaHBwYSwgcGExMCk7Ci0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gZmlsZV9oZHJwLT5zeW1ib2xfdG90YWw7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgc2F2ZWQgc3ltYm9sIHRhYmxlIGFuZCBzdHJpbmcgdGFibGUgdG8gTlVMTC4gIAotICAgICBTYXZlIGltcG9ydGFudCBvZmZzZXRzIGFuZCBzaXplcyBmcm9tIHRoZSBTT00gaGVhZGVyIGludG8KLSAgICAgdGhlIEJGRC4gICovCi0gIG9ial9zb21fc3RyaW5ndGFiIChhYmZkKSA9IChjaGFyICAqKSBOVUxMOwotICBvYmpfc29tX3N5bXRhYiAoYWJmZCkgPSAoc29tX3N5bWJvbF90eXBlICopIE5VTEw7Ci0gIG9ial9zb21fc29ydGVkX3N5bXMgKGFiZmQpID0gTlVMTDsKLSAgb2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCkgPSBmaWxlX2hkcnAtPnN5bWJvbF9zdHJpbmdzX3NpemU7Ci0gIG9ial9zb21fc3ltX2ZpbGVwb3MgKGFiZmQpID0gZmlsZV9oZHJwLT5zeW1ib2xfbG9jYXRpb24gKyBjdXJyZW50X29mZnNldDsKLSAgb2JqX3NvbV9zdHJfZmlsZXBvcyAoYWJmZCkgPSAoZmlsZV9oZHJwLT5zeW1ib2xfc3RyaW5nc19sb2NhdGlvbgotCQkJCSsgY3VycmVudF9vZmZzZXQpOwotICBvYmpfc29tX3JlbG9jX2ZpbGVwb3MgKGFiZmQpID0gKGZpbGVfaGRycC0+Zml4dXBfcmVxdWVzdF9sb2NhdGlvbgotCQkJCSAgKyBjdXJyZW50X29mZnNldCk7Ci0gIG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+c3lzdGVtX2lkID0gZmlsZV9oZHJwLT5zeXN0ZW1faWQ7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIENvbnZlcnQgYWxsIG9mIHRoZSBzcGFjZSBhbmQgc3Vic3BhY2UgaW5mbyBpbnRvIEJGRCBzZWN0aW9ucy4gIEVhY2ggc3BhY2UKLSAgIGNvbnRhaW5zIGEgbnVtYmVyIG9mIHN1YnNwYWNlcywgd2hpY2ggaW4gdHVybiBkZXNjcmliZSB0aGUgbWFwcGluZyBiZXR3ZWVuCi0gICByZWdpb25zIG9mIHRoZSBleGVjIGZpbGUsIGFuZCB0aGUgYWRkcmVzcyBzcGFjZSB0aGF0IHRoZSBwcm9ncmFtIHJ1bnMgaW4uCi0gICBCRkQgc2VjdGlvbnMgd2hpY2ggY29ycmVzcG9uZCB0byBzcGFjZXMgd2lsbCBvdmVybGFwIHRoZSBzZWN0aW9ucyBmb3IgdGhlCi0gICBhc3NvY2lhdGVkIHN1YnNwYWNlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zZXR1cF9zZWN0aW9ucyAoYWJmZCwgZmlsZV9oZHIsIGN1cnJlbnRfb2Zmc2V0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBoZWFkZXIgKmZpbGVfaGRyOwotICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OwotewotICBjaGFyICpzcGFjZV9zdHJpbmdzOwotICB1bnNpZ25lZCBpbnQgc3BhY2VfaW5kZXgsIGk7Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9zdWJzcGFjZXMgPSAwOwotICBhc2VjdGlvbiAqKnN1YnNwYWNlX3NlY3Rpb25zLCAqc2VjdGlvbjsKLQotICAvKiBGaXJzdCwgcmVhZCBpbiBzcGFjZSBuYW1lcyAqLwotCi0gIHNwYWNlX3N0cmluZ3MgPSBiZmRfbWFsbG9jIChmaWxlX2hkci0+c3BhY2Vfc3RyaW5nc19zaXplKTsKLSAgaWYgKCFzcGFjZV9zdHJpbmdzICYmIGZpbGVfaGRyLT5zcGFjZV9zdHJpbmdzX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0ICsgZmlsZV9oZHItPnNwYWNlX3N0cmluZ3NfbG9jYXRpb24sIAotICAJCVNFRUtfU0VUKSA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmIChiZmRfcmVhZCAoc3BhY2Vfc3RyaW5ncywgMSwgZmlsZV9oZHItPnNwYWNlX3N0cmluZ3Nfc2l6ZSwgYWJmZCkKLSAgICAgICE9IGZpbGVfaGRyLT5zcGFjZV9zdHJpbmdzX3NpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogTG9vcCBvdmVyIGFsbCBvZiB0aGUgc3BhY2UgZGljdGlvbmFyaWVzLCBidWlsZGluZyB1cCBzZWN0aW9ucyAqLwotICBmb3IgKHNwYWNlX2luZGV4ID0gMDsgc3BhY2VfaW5kZXggPCBmaWxlX2hkci0+c3BhY2VfdG90YWw7IHNwYWNlX2luZGV4KyspCi0gICAgewotICAgICAgc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkIHNwYWNlOwotICAgICAgc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkIHN1YnNwYWNlLCBzYXZlX3N1YnNwYWNlOwotICAgICAgaW50IHN1YnNwYWNlX2luZGV4OwotICAgICAgYXNlY3Rpb24gKnNwYWNlX2FzZWN0OwotICAgICAgY2hhciAqbmV3bmFtZTsKLQotICAgICAgLyogUmVhZCB0aGUgc3BhY2UgZGljdGlvbmFyeSBlbGVtZW50ICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAoY3VycmVudF9vZmZzZXQgKyBmaWxlX2hkci0+c3BhY2VfbG9jYXRpb24KLQkJICAgICArIHNwYWNlX2luZGV4ICogc2l6ZW9mIHNwYWNlKSwKLQkJICAgIFNFRUtfU0VUKSA8IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoYmZkX3JlYWQgKCZzcGFjZSwgMSwgc2l6ZW9mIHNwYWNlLCBhYmZkKSAhPSBzaXplb2Ygc3BhY2UpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFNldHVwIHRoZSBzcGFjZSBuYW1lIHN0cmluZyAqLwotICAgICAgc3BhY2UubmFtZS5uX25hbWUgPSBzcGFjZS5uYW1lLm5fc3RyeCArIHNwYWNlX3N0cmluZ3M7Ci0KLSAgICAgIC8qIE1ha2UgYSBzZWN0aW9uIG91dCBvZiBpdCAqLwotICAgICAgbmV3bmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChzcGFjZS5uYW1lLm5fbmFtZSkgKyAxKTsKLSAgICAgIGlmICghbmV3bmFtZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHN0cmNweSAobmV3bmFtZSwgc3BhY2UubmFtZS5uX25hbWUpOwotCQkJICAgCi0gICAgICBzcGFjZV9hc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuZXduYW1lKTsKLSAgICAgIGlmICghc3BhY2VfYXNlY3QpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgICBpZiAoc3BhY2UuaXNfbG9hZGFibGUgPT0gMCkKLQlzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKLQotICAgICAgLyogU2V0IHVwIGFsbCB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIHNwYWNlLiAgKi8KLSAgICAgIGlmIChiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgKHNwYWNlX2FzZWN0LCBzcGFjZS5pc19kZWZpbmVkLAotCQkJCQkgIHNwYWNlLmlzX3ByaXZhdGUsIHNwYWNlLnNvcnRfa2V5LAotCQkJCQkgIHNwYWNlLnNwYWNlX251bWJlcikgPT0gZmFsc2UpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIElmIHRoZSBzcGFjZSBoYXMgbm8gc3Vic3BhY2VzLCB0aGVuIHdlJ3JlIGRvbmUuICAqLwotICAgICAgaWYgKHNwYWNlLnN1YnNwYWNlX3F1YW50aXR5ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIE5vdywgcmVhZCBpbiB0aGUgZmlyc3Qgc3Vic3BhY2UgZm9yIHRoaXMgc3BhY2UgKi8KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChjdXJyZW50X29mZnNldCArIGZpbGVfaGRyLT5zdWJzcGFjZV9sb2NhdGlvbgotCQkgICAgICsgc3BhY2Uuc3Vic3BhY2VfaW5kZXggKiBzaXplb2Ygc3Vic3BhY2UpLAotCQkgICAgU0VFS19TRVQpIDwgMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmIChiZmRfcmVhZCAoJnN1YnNwYWNlLCAxLCBzaXplb2Ygc3Vic3BhY2UsIGFiZmQpICE9IHNpemVvZiBzdWJzcGFjZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIC8qIFNlZWsgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHN1YnNwYWNlcyBmb3IgbG9vcCBiZWxvdyAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgKGN1cnJlbnRfb2Zmc2V0ICsgZmlsZV9oZHItPnN1YnNwYWNlX2xvY2F0aW9uCi0JCSAgICAgKyBzcGFjZS5zdWJzcGFjZV9pbmRleCAqIHNpemVvZiBzdWJzcGFjZSksCi0JCSAgICBTRUVLX1NFVCkgPCAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBTZXR1cCB0aGUgc3RhcnQgYWRkcmVzcyBhbmQgZmlsZSBsb2MgZnJvbSB0aGUgZmlyc3Qgc3Vic3BhY2UgcmVjb3JkICovCi0gICAgICBzcGFjZV9hc2VjdC0+dm1hID0gc3Vic3BhY2Uuc3Vic3BhY2Vfc3RhcnQ7Ci0gICAgICBzcGFjZV9hc2VjdC0+ZmlsZXBvcyA9IHN1YnNwYWNlLmZpbGVfbG9jX2luaXRfdmFsdWUgKyBjdXJyZW50X29mZnNldDsKLSAgICAgIHNwYWNlX2FzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSBsb2cyIChzdWJzcGFjZS5hbGlnbm1lbnQpOwotICAgICAgaWYgKHNwYWNlX2FzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPT0gLTEpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIEluaXRpYWxpemUgc2F2ZV9zdWJzcGFjZSBzbyB3ZSBjYW4gcmVsaWFibHkgZGV0ZXJtaW5lIGlmIHRoaXMKLQkgbG9vcCBwbGFjZWQgYW55IHVzZWZ1bCB2YWx1ZXMgaW50byBpdC4gICovCi0gICAgICBtZW1zZXQgKCZzYXZlX3N1YnNwYWNlLCAwLCBzaXplb2YgKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCkpOwotCi0gICAgICAvKiBMb29wIG92ZXIgdGhlIHJlc3Qgb2YgdGhlIHN1YnNwYWNlcywgYnVpbGRpbmcgdXAgbW9yZSBzZWN0aW9ucyAqLwotICAgICAgZm9yIChzdWJzcGFjZV9pbmRleCA9IDA7IHN1YnNwYWNlX2luZGV4IDwgc3BhY2Uuc3Vic3BhY2VfcXVhbnRpdHk7Ci0JICAgc3Vic3BhY2VfaW5kZXgrKykKLQl7Ci0JICBhc2VjdGlvbiAqc3Vic3BhY2VfYXNlY3Q7Ci0KLQkgIC8qIFJlYWQgaW4gdGhlIG5leHQgc3Vic3BhY2UgKi8KLQkgIGlmIChiZmRfcmVhZCAoJnN1YnNwYWNlLCAxLCBzaXplb2Ygc3Vic3BhY2UsIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mIHN1YnNwYWNlKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogU2V0dXAgdGhlIHN1YnNwYWNlIG5hbWUgc3RyaW5nICovCi0JICBzdWJzcGFjZS5uYW1lLm5fbmFtZSA9IHN1YnNwYWNlLm5hbWUubl9zdHJ4ICsgc3BhY2Vfc3RyaW5nczsKLQotCSAgbmV3bmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChzdWJzcGFjZS5uYW1lLm5fbmFtZSkgKyAxKTsKLQkgIGlmICghbmV3bmFtZSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBzdHJjcHkgKG5ld25hbWUsIHN1YnNwYWNlLm5hbWUubl9uYW1lKTsKLQotCSAgLyogTWFrZSBhIHNlY3Rpb24gb3V0IG9mIHRoaXMgc3Vic3BhY2UgKi8KLQkgIHN1YnNwYWNlX2FzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5ld25hbWUpOwotCSAgaWYgKCFzdWJzcGFjZV9hc2VjdCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFN0b3JlIHByaXZhdGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlY3Rpb24uICAqLwotCSAgaWYgKGJmZF9zb21fc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyAoc3Vic3BhY2VfYXNlY3QsIHNwYWNlX2FzZWN0LAotCQkJCQkJIHN1YnNwYWNlLmFjY2Vzc19jb250cm9sX2JpdHMsCi0JCQkJCQkgc3Vic3BhY2Uuc29ydF9rZXksCi0JCQkJCQkgc3Vic3BhY2UucXVhZHJhbnQpID09IGZhbHNlKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogS2VlcCBhbiBlYXN5IG1hcHBpbmcgYmV0d2VlbiBzdWJzcGFjZXMgYW5kIHNlY3Rpb25zLiAKLQkgICAgIE5vdGUgd2UgZG8gbm90IG5lY2Vzc2FyaWx5IHJlYWQgdGhlIHN1YnNwYWNlcyBpbiB0aGUKLQkgICAgIHNhbWUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlIG9iamVjdCBmaWxlLgotCi0JICAgICBTbyB0byBtYWtlIHRoZSB0YXJnZXQgaW5kZXggY29tZSBvdXQgY29ycmVjdGx5LCB3ZQotCSAgICAgc3RvcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdWJzcGFjZSBoZWFkZXIgaW4gdGFyZ2V0Ci0JICAgICBpbmRleCwgdGhlbiBzb3J0IHVzaW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3Vic3BhY2UKLQkgICAgIGhlYWRlciBhcyB0aGUga2V5LiAgVGhlbiB3ZSBjYW4gYXNzaWduIGNvcnJlY3QKLQkgICAgIHN1YnNwYWNlIGluZGljZXMuICAqLwotCSAgdG90YWxfc3Vic3BhY2VzKys7Ci0JICBzdWJzcGFjZV9hc2VjdC0+dGFyZ2V0X2luZGV4ID0gYmZkX3RlbGwgKGFiZmQpIC0gc2l6ZW9mIChzdWJzcGFjZSk7Ci0KLQkgIC8qIFNldCBTRUNfUkVBRE9OTFkgYW5kIFNFQ19DT0RFL1NFQ19EQVRBIGFzIHNwZWNpZmllZAotCSAgICAgYnkgdGhlIGFjY2Vzc19jb250cm9sX2JpdHMgaW4gdGhlIHN1YnNwYWNlIGhlYWRlci4gICovCi0JICBzd2l0Y2ggKHN1YnNwYWNlLmFjY2Vzc19jb250cm9sX2JpdHMgPj4gNCkKLQkgICAgewotCSAgICAvKiBSZWFkb25seSBkYXRhLiAgKi8gIAotCSAgICBjYXNlIDB4MDoKLQkgICAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfUkVBRE9OTFk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogTm9ybWFsIGRhdGEuICAqLyAgCi0JICAgIGNhc2UgMHgxOgotCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfREFUQTsKLQkgICAgICBicmVhazsKLQotCSAgICAvKiBSZWFkb25seSBjb2RlIGFuZCB0aGUgZ2F0ZXdheXMuCi0JICAgICAgIEdhdGV3YXlzIGhhdmUgb3RoZXIgYXR0cmlidXRlcyB3aGljaCBkbyBub3QgbWFwCi0JICAgICAgIGludG8gYW55dGhpbmcgQkZEIGtub3dzIGFib3V0LiAgKi8KLQkgICAgY2FzZSAweDI6Ci0JICAgIGNhc2UgMHg0OgotCSAgICBjYXNlIDB4NToKLQkgICAgY2FzZSAweDY6Ci0JICAgIGNhc2UgMHg3OgotCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19SRUFET05MWTsKLQkgICAgICBicmVhazsKLQotCSAgICAvKiBkeW5hbWljICh3cml0YWJsZSkgY29kZS4gICovCi0JICAgIGNhc2UgMHgzOgotCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfQ09ERTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgCi0JICBpZiAoc3Vic3BhY2UuZHVwX2NvbW1vbiB8fCBzdWJzcGFjZS5pc19jb21tb24pIAotCSAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLQkgIGVsc2UgaWYgKHN1YnNwYWNlLnN1YnNwYWNlX2xlbmd0aCA+IDApCi0JICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotCi0JICBpZiAoc3Vic3BhY2UuaXNfbG9hZGFibGUpCi0JICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLQkgIGVsc2UKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19ERUJVR0dJTkc7Ci0KLQkgIGlmIChzdWJzcGFjZS5jb2RlX29ubHkpCi0JICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfQ09ERTsKLQotCSAgLyogQm90aCBmaWxlX2xvY19pbml0X3ZhbHVlIGFuZCBpbml0aWFsaXphdGlvbl9sZW5ndGggd2lsbAotCSAgICAgYmUgemVybyBmb3IgYSBCU1MgbGlrZSBzdWJzcGFjZS4gICovCi0JICBpZiAoc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSA9PSAwCi0JICAgICAgJiYgc3Vic3BhY2UuaW5pdGlhbGl6YXRpb25fbGVuZ3RoID09IDApCi0JICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyAmPSB+KFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTKTsKLQotCSAgLyogVGhpcyBzdWJzcGFjZSBoYXMgcmVsb2NhdGlvbnMuCi0JICAgICBUaGUgZml4dXBfcmVxdWVzdF9xdWFudGl0eSBpcyBhIGJ5dGUgY291bnQgZm9yIHRoZSBudW1iZXIgb2YKLQkgICAgIGVudHJpZXMgaW4gdGhlIHJlbG9jYXRpb24gc3RyZWFtOyBpdCBpcyBub3QgdGhlIGFjdHVhbCBudW1iZXIKLQkgICAgIG9mIHJlbG9jYXRpb25zIGluIHRoZSBzdWJzcGFjZS4gICovCi0JICBpZiAoc3Vic3BhY2UuZml4dXBfcmVxdWVzdF9xdWFudGl0eSAhPSAwKQotCSAgICB7Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19SRUxPQzsKLQkgICAgICBzdWJzcGFjZV9hc2VjdC0+cmVsX2ZpbGVwb3MgPSBzdWJzcGFjZS5maXh1cF9yZXF1ZXN0X2luZGV4OwotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNwYWNlX2FzZWN0KS0+cmVsb2Nfc2l6ZQotCQk9IHN1YnNwYWNlLmZpeHVwX3JlcXVlc3RfcXVhbnRpdHk7Ci0JICAgICAgLyogV2UgY2FuIG5vdCBkZXRlcm1pbmUgdGhpcyB5ZXQuICBXaGVuIHdlIHJlYWQgaW4gdGhlIAotCQkgcmVsb2NhdGlvbiB0YWJsZSB0aGUgY29ycmVjdCB2YWx1ZSB3aWxsIGJlIGZpbGxlZCBpbi4gICovCi0JICAgICAgc3Vic3BhY2VfYXNlY3QtPnJlbG9jX2NvdW50ID0gLTE7Ci0JICAgIH0KLQotCSAgLyogVXBkYXRlIHNhdmVfc3Vic3BhY2UgaWYgYXBwcm9wcmlhdGUuICAqLwotCSAgaWYgKHN1YnNwYWNlLmZpbGVfbG9jX2luaXRfdmFsdWUgPiBzYXZlX3N1YnNwYWNlLmZpbGVfbG9jX2luaXRfdmFsdWUpCi0JICAgIHNhdmVfc3Vic3BhY2UgPSBzdWJzcGFjZTsKLQotCSAgc3Vic3BhY2VfYXNlY3QtPnZtYSA9IHN1YnNwYWNlLnN1YnNwYWNlX3N0YXJ0OwotCSAgc3Vic3BhY2VfYXNlY3QtPl9jb29rZWRfc2l6ZSA9IHN1YnNwYWNlLnN1YnNwYWNlX2xlbmd0aDsKLQkgIHN1YnNwYWNlX2FzZWN0LT5fcmF3X3NpemUgPSBzdWJzcGFjZS5zdWJzcGFjZV9sZW5ndGg7Ci0JICBzdWJzcGFjZV9hc2VjdC0+ZmlsZXBvcyA9IChzdWJzcGFjZS5maWxlX2xvY19pbml0X3ZhbHVlCi0JCQkJICAgICArIGN1cnJlbnRfb2Zmc2V0KTsKLQkgIHN1YnNwYWNlX2FzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSBsb2cyIChzdWJzcGFjZS5hbGlnbm1lbnQpOwotCSAgaWYgKHN1YnNwYWNlX2FzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPT0gLTEpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIGZvciBhIC5vIHdoaWNoIGRlZmluZXMgc3ltYm9scyBpbiBvdGhlcndpc2UKLSAgICAgICAgIGVtcHR5IHN1YnNwYWNlcy4gICovCi0gICAgICBpZiAoIXNhdmVfc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSkKLQl7Ci0JICBzcGFjZV9hc2VjdC0+X2Nvb2tlZF9zaXplID0gMDsKLQkgIHNwYWNlX2FzZWN0LT5fcmF3X3NpemUgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBTZXR1cCB0aGUgc2l6ZXMgZm9yIHRoZSBzcGFjZSBzZWN0aW9uIGJhc2VkIHVwb24gdGhlIGluZm8gaW4gdGhlCi0JICAgICBsYXN0IHN1YnNwYWNlIG9mIHRoZSBzcGFjZS4gICovCi0JICBzcGFjZV9hc2VjdC0+X2Nvb2tlZF9zaXplID0gKHNhdmVfc3Vic3BhY2Uuc3Vic3BhY2Vfc3RhcnQKLQkJCQkgICAgICAgLSBzcGFjZV9hc2VjdC0+dm1hCi0JCQkJICAgICAgICsgc2F2ZV9zdWJzcGFjZS5zdWJzcGFjZV9sZW5ndGgpOwotCSAgc3BhY2VfYXNlY3QtPl9yYXdfc2l6ZSA9IChzYXZlX3N1YnNwYWNlLmZpbGVfbG9jX2luaXRfdmFsdWUKLQkJCQkgICAgLSBzcGFjZV9hc2VjdC0+ZmlsZXBvcwotCQkJCSAgICArIHNhdmVfc3Vic3BhY2UuaW5pdGlhbGl6YXRpb25fbGVuZ3RoKTsKLQl9Ci0gICAgfQotICAvKiBOb3cgdGhhdCB3ZSd2ZSByZWFkIGluIGFsbCB0aGUgc3Vic3BhY2UgcmVjb3Jkcywgd2UgbmVlZCB0byBhc3NpZ24KLSAgICAgYSB0YXJnZXQgaW5kZXggdG8gZWFjaCBzdWJzcGFjZS4gICovCi0gIHN1YnNwYWNlX3NlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jICh0b3RhbF9zdWJzcGFjZXMKLQkJCQkJCSogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gIGlmIChzdWJzcGFjZV9zZWN0aW9ucyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaWYgKCFzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pKQotCWNvbnRpbnVlOwotCi0gICAgICBzdWJzcGFjZV9zZWN0aW9uc1tpXSA9IHNlY3Rpb247Ci0gICAgICBpKys7Ci0gICAgfQotICBxc29ydCAoc3Vic3BhY2Vfc2VjdGlvbnMsIHRvdGFsX3N1YnNwYWNlcywKLQkgc2l6ZW9mIChhc2VjdGlvbiAqKSwgY29tcGFyZV9zdWJzcGFjZXMpOwotICAKLSAgLyogc3Vic3BhY2Vfc2VjdGlvbnMgaXMgbm93IHNvcnRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHN1YnNwYWNlcwotICAgICBhcHBlYXIgaW4gdGhlIG9iamVjdCBmaWxlLiAgQXNzaWduIGFuIGluZGV4IHRvIGVhY2ggb25lIG5vdy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9zdWJzcGFjZXM7IGkrKykKLSAgICBzdWJzcGFjZV9zZWN0aW9uc1tpXS0+dGFyZ2V0X2luZGV4ID0gaTsKLQotICBpZiAoc3BhY2Vfc3RyaW5ncyAhPSBOVUxMKQotICAgIGZyZWUgKHNwYWNlX3N0cmluZ3MpOwotCi0gIGlmIChzdWJzcGFjZV9zZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHN1YnNwYWNlX3NlY3Rpb25zKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHNwYWNlX3N0cmluZ3MgIT0gTlVMTCkKLSAgICBmcmVlIChzcGFjZV9zdHJpbmdzKTsKLQotICBpZiAoc3Vic3BhY2Vfc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzdWJzcGFjZV9zZWN0aW9ucyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVhZCBpbiBhIFNPTSBvYmplY3QgYW5kIG1ha2UgaXQgaW50byBhIEJGRC4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXNvbV9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaGVhZGVyIGZpbGVfaGRyOwotICBzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyIGF1eF9oZHI7Ci0gIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQgPSAwOwotICBzdHJ1Y3QgbHN0X2hlYWRlciBsc3RfaGVhZGVyOwotICBzdHJ1Y3Qgc29tX2VudHJ5IHNvbV9lbnRyeTsKLSNkZWZpbmUgRU5UUllfU0laRSBzaXplb2Yoc3RydWN0IHNvbV9lbnRyeSkKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgZmlsZV9oZHIsIDEsIEZJTEVfSERSX1NJWkUsIGFiZmQpICE9IEZJTEVfSERSX1NJWkUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmICghX1BBX1JJU0NfSUQgKGZpbGVfaGRyLnN5c3RlbV9pZCkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgc3dpdGNoIChmaWxlX2hkci5hX21hZ2ljKQotICAgIHsKLSAgICBjYXNlIFJFTE9DX01BR0lDOgotICAgIGNhc2UgRVhFQ19NQUdJQzoKLSAgICBjYXNlIFNIQVJFX01BR0lDOgotICAgIGNhc2UgREVNQU5EX01BR0lDOgotI2lmZGVmIERMX01BR0lDCi0gICAgY2FzZSBETF9NQUdJQzoKLSNlbmRpZgotI2lmZGVmIFNITF9NQUdJQwotICAgIGNhc2UgU0hMX01BR0lDOgotI2VuZGlmCi0jaWZkZWYgU0hBUkVEX01BR0lDX0NOWAotICAgIGNhc2UgU0hBUkVEX01BR0lDX0NOWDoKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBFWEVDTElCTUFHSUMKLSAgICBjYXNlIEVYRUNMSUJNQUdJQzoKLSAgICAgIC8qIFJlYWQgdGhlIGxzdCBoZWFkZXIgYW5kIGRldGVybWluZSB3aGVyZSB0aGUgU09NIGRpcmVjdG9yeSBiZWdpbnMgKi8KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBsc3RfaGVhZGVyLCAxLCBTTFNUSERSLCBhYmZkKSAhPSBTTFNUSERSKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAvKiBQb3NpdGlvbiB0byBhbmQgcmVhZCB0aGUgZmlyc3QgZGlyZWN0b3J5IGVudHJ5ICovCi0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgbHN0X2hlYWRlci5kaXJfbG9jLCBTRUVLX1NFVCkgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICYgc29tX2VudHJ5LCAxLCBFTlRSWV9TSVpFLCBhYmZkKSAhPSBFTlRSWV9TSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAvKiBOb3cgcG9zaXRpb24gdG8gdGhlIGZpcnN0IFNPTSAqLwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNvbV9lbnRyeS5sb2NhdGlvbiwgU0VFS19TRVQpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgY3VycmVudF9vZmZzZXQgPSBzb21fZW50cnkubG9jYXRpb247Ci0KLSAgICAgIC8qIEFuZCBmaW5hbGx5LCByZS1yZWFkIHRoZSBzb20gaGVhZGVyICovCi0KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBmaWxlX2hkciwgMSwgRklMRV9IRFJfU0laRSwgYWJmZCkgIT0gRklMRV9IRFJfU0laRSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoZmlsZV9oZHIudmVyc2lvbl9pZCAhPSBWRVJTSU9OX0lECi0gICAgICAmJiBmaWxlX2hkci52ZXJzaW9uX2lkICE9IE5FV19WRVJTSU9OX0lEKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBhdXhfaGVhZGVyX3NpemUgZmllbGQgaW4gdGhlIGZpbGUgaGVhZGVyIGlzIHplcm8sIHRoZW4gdGhpcwotICAgICBvYmplY3QgaXMgYW4gaW5jb21wbGV0ZSBleGVjdXRhYmxlIChhIC5vIGZpbGUpLiAgRG8gbm90IHRyeSB0byByZWFkCi0gICAgIGEgbm9uLWV4aXN0YW50IGF1eGlsaWFyeSBoZWFkZXIuICAqLwotICBtZW1zZXQgKCZhdXhfaGRyLCAwLCBzaXplb2YgKHN0cnVjdCBzb21fZXhlY19hdXhoZHIpKTsKLSAgaWYgKGZpbGVfaGRyLmF1eF9oZWFkZXJfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBhdXhfaGRyLCAxLCBBVVhfSERSX1NJWkUsIGFiZmQpICE9IEFVWF9IRFJfU0laRSkKLQl7Ci0JICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLQotICBpZiAoIXNldHVwX3NlY3Rpb25zIChhYmZkLCAmZmlsZV9oZHIsIGN1cnJlbnRfb2Zmc2V0KSkKLSAgICB7Ci0gICAgICAvKiBzZXR1cF9zZWN0aW9ucyBkb2VzIG5vdCBidWJibGUgdXAgYSBiZmQgZXJyb3IgY29kZS4gICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSB2YWxpZCBTT00gb2JqZWN0LiAgRG8gc29tZSBpbml0aWFsaXphdGlvbi4gICovCi0gIHJldHVybiBzb21fb2JqZWN0X3NldHVwIChhYmZkLCAmZmlsZV9oZHIsICZhdXhfaGRyLCBjdXJyZW50X29mZnNldCk7Ci19Ci0KLS8qIENyZWF0ZSBhIFNPTSBvYmplY3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBob2xkIGJhY2tlbmQgaW5mb3JtYXRpb24uICAqLwotICBhYmZkLT50ZGF0YS5zb21fZGF0YSA9IChzdHJ1Y3Qgc29tX2RhdGFfc3RydWN0ICopCi0gICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX2RhdGFfc3RydWN0KSk7Ci0gIGlmIChhYmZkLT50ZGF0YS5zb21fZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEluaXRpYWxpemUgc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgZmlsZSBoZWFkZXIuICBUaGlzIHJvdXRpbmUgbWFrZXMKLSAgIG5vdCBhdHRlbXB0IGF0IGRvaW5nIHRoZSByaWdodCB0aGluZyBmb3IgYSBmdWxsIGV4ZWN1dGFibGU7IGl0Ci0gICBpcyBvbmx5IG1lYW50IHRvIGhhbmRsZSByZWxvY2F0YWJsZSBvYmplY3RzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9wcmVwX2hlYWRlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGhlYWRlciAqZmlsZV9oZHI7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gIC8qIE1ha2UgYW5kIGF0dGFjaCBhIGZpbGUgaGVhZGVyIHRvIHRoZSBCRkQuICAqLwotICBmaWxlX2hkciA9IChzdHJ1Y3QgaGVhZGVyICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGhlYWRlcikpOwotICBpZiAoZmlsZV9oZHIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpID0gZmlsZV9oZHI7Ci0KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIHsKLQotICAgICAgLyogTWFrZSBhbmQgYXR0YWNoIGFuIGV4ZWMgaGVhZGVyIHRvIHRoZSBCRkQuICAqLwotICAgICAgb2JqX3NvbV9leGVjX2hkciAoYWJmZCkgPSAoc3RydWN0IHNvbV9leGVjX2F1eGhkciAqKQotCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2F1eGhkcikpOwotICAgICAgaWYgKG9ial9zb21fZXhlY19oZHIgKGFiZmQpID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKQotCWZpbGVfaGRyLT5hX21hZ2ljID0gREVNQU5EX01BR0lDOwotICAgICAgZWxzZSBpZiAoYWJmZC0+ZmxhZ3MgJiBXUF9URVhUKQotCWZpbGVfaGRyLT5hX21hZ2ljID0gU0hBUkVfTUFHSUM7Ci0jaWZkZWYgU0hMX01BR0lDCi0gICAgICBlbHNlIGlmIChhYmZkLT5mbGFncyAmIERZTkFNSUMpCi0JZmlsZV9oZHItPmFfbWFnaWMgPSBTSExfTUFHSUM7Ci0jZW5kaWYKLSAgICAgIGVsc2UKLQlmaWxlX2hkci0+YV9tYWdpYyA9IEVYRUNfTUFHSUM7Ci0gICAgfQotICBlbHNlCi0gICAgZmlsZV9oZHItPmFfbWFnaWMgPSBSRUxPQ19NQUdJQzsKLQotICAvKiBPbmx5IG5ldyBmb3JtYXQgU09NIGlzIHN1cHBvcnRlZC4gICovCi0gIGZpbGVfaGRyLT52ZXJzaW9uX2lkID0gTkVXX1ZFUlNJT05fSUQ7Ci0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBvcHRpb25hbCwgYW5kIGVtYmVkZGluZyB0aW1lc3RhbXBzIGlzIG5vdCBhbHdheXMKLSAgICAgYSB3aXNlIHRoaW5nIHRvIGRvLCBpdCBtYWtlcyBjb21wYXJpbmcgb2JqZWN0cyBkdXJpbmcgYSBtdWx0aS1zdGFnZQotICAgICBib290c3RyYXAgZGlmZmljdWx0LiAgKi8KLSAgZmlsZV9oZHItPmZpbGVfdGltZS5zZWNzID0gMDsKLSAgZmlsZV9oZHItPmZpbGVfdGltZS5uYW5vc2VjcyA9IDA7IAotCi0gIGZpbGVfaGRyLT5lbnRyeV9zcGFjZSA9IDA7Ci0gIGZpbGVfaGRyLT5lbnRyeV9zdWJzcGFjZSA9IDA7Ci0gIGZpbGVfaGRyLT5lbnRyeV9vZmZzZXQgPSAwOwotICBmaWxlX2hkci0+cHJlc3VtZWRfZHAgPSAwOwotCi0gIC8qIE5vdyBpdGVyYXRlIG92ZXIgdGhlIHNlY3Rpb25zIHRyYW5zbGF0aW5nIGluZm9ybWF0aW9uIGZyb20KLSAgICAgQkZEIHNlY3Rpb25zIHRvIFNPTSBzcGFjZXMvc3Vic3BhY2VzLiAgKi8KLQotICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbiAhPSBOVUxMOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLSAgICB7Ci0gICAgICAvKiBJZ25vcmUgYW55dGhpbmcgd2hpY2ggaGFzIG5vdCBiZWVuIG1hcmtlZCBhcyBhIHNwYWNlIG9yCi0JIHN1YnNwYWNlLiAgKi8KLSAgICAgIGlmICghc29tX2lzX3NwYWNlIChzZWN0aW9uKSAmJiAhc29tX2lzX3N1YnNwYWNlIChzZWN0aW9uKSkKLQljb250aW51ZTsKLSAgICAgIAotICAgICAgaWYgKHNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0JewotCSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBzcGFjZSBkaWN0aW9uYXJ5LiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0Ci0JICAgID0gKHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCAqKQotCSAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSk7Ci0JICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogU2V0IHNwYWNlIGF0dHJpYnV0ZXMuICBOb3RlIG1vc3QgYXR0cmlidXRlcyBvZiBTT00gc3BhY2VzCi0JICAgICBhcmUgc2V0IGJhc2VkIG9uIHRoZSBzdWJzcGFjZXMgaXQgY29udGFpbnMuICAqLwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPmxvYWRlcl9maXhfaW5kZXggPSAtMTsKLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5pbml0X3BvaW50ZXJfaW5kZXggPSAtMTsKLQotCSAgLyogU2V0IG1vcmUgYXR0cmlidXRlcyB0aGF0IHdlcmUgc3R1ZmZlZCBhd2F5IGluIHByaXZhdGUgZGF0YS4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c29ydF9rZXkgPSAKLQkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+c29ydF9rZXk7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+aXNfZGVmaW5lZCA9IAotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5pc19kZWZpbmVkOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPmlzX3ByaXZhdGUgPSAKLQkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+aXNfcHJpdmF0ZTsKLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zcGFjZV9udW1iZXIgPQotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5zcGFjZV9udW1iZXI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgc3Vic3BhY2UgZGljdGlvbmFyeS4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdAotCSAgICA9IChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgKikKLQkgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCkpOwotCSAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0ID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogU2V0IHN1YnNwYWNlIGF0dHJpYnV0ZXMuICBCYXNpYyBzdHVmZiBpcyBkb25lIGhlcmUsIGFkZGl0aW9uYWwKLQkgICAgIGF0dHJpYnV0ZXMgYXJlIGZpbGxlZCBpbiBsYXRlciBhcyBtb3JlIGluZm9ybWF0aW9uIGJlY29tZXMKLQkgICAgIGF2YWlsYWJsZS4gICovCi0JICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSVNfQ09NTU9OKQotCSAgICB7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmR1cF9jb21tb24gPSAxOwotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5pc19jb21tb24gPSAxOwotCSAgICB9Ci0KLQkgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykKLQkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmlzX2xvYWRhYmxlID0gMTsKLQotCSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpCi0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5jb2RlX29ubHkgPSAxOwotCi0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+c3Vic3BhY2Vfc3RhcnQgPSAKLQkgICAgc2VjdGlvbi0+dm1hOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPnN1YnNwYWNlX2xlbmd0aCA9Ci0JICAgIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmluaXRpYWxpemF0aW9uX2xlbmd0aCA9Ci0JICAgIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmFsaWdubWVudCA9IAotCSAgICAxIDw8IHNlY3Rpb24tPmFsaWdubWVudF9wb3dlcjsKLQotCSAgLyogU2V0IG1vcmUgYXR0cmlidXRlcyB0aGF0IHdlcmUgc3R1ZmZlZCBhd2F5IGluIHByaXZhdGUgZGF0YS4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+c29ydF9rZXkgPQotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5zb3J0X2tleTsKLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5hY2Nlc3NfY29udHJvbF9iaXRzID0KLQkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+YWNjZXNzX2NvbnRyb2xfYml0czsKLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5xdWFkcmFudCA9Ci0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnF1YWRyYW50OwotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VjdGlvbiBpcyBhIFNPTSBzcGFjZSwgZmFsc2Ugb3RoZXJ3aXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9pc19zcGFjZSAoc2VjdGlvbikKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIC8qIElmIG5vIGNvcHkgZGF0YSBpcyBhdmFpbGFibGUsIHRoZW4gaXQncyBuZWl0aGVyIGEgc3BhY2Ugbm9yIGEKLSAgICAgc3Vic3BhY2UuICAqLwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiB0aGUgY29udGFpbmluZyBzcGFjZSBpc24ndCB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gc2VjdGlvbiwKLSAgICAgdGhlbiB0aGlzIGlzbid0IGEgc3BhY2UuICAqLwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyICE9IHNlY3Rpb24KLSAgICAgICYmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXItPm91dHB1dF9zZWN0aW9uCi0JICAhPSBzZWN0aW9uKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogT0suICBNdXN0IGJlIGEgc3BhY2UuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNlY3Rpb24gaXMgYSBTT00gc3Vic3BhY2UsIGZhbHNlIG90aGVyd2lzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICAvKiBJZiBubyBjb3B5IGRhdGEgaXMgYXZhaWxhYmxlLCB0aGVuIGl0J3MgbmVpdGhlciBhIHNwYWNlIG5vciBhCi0gICAgIHN1YnNwYWNlLiAgKi8KLSAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgdGhlIGNvbnRhaW5pbmcgc3BhY2UgaXMgdGhlIHNhbWUgYXMgdGhlIGdpdmVuIHNlY3Rpb24sCi0gICAgIHRoZW4gdGhpcyBpc24ndCBhIHN1YnNwYWNlLiAgKi8KLSAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lciA9PSBzZWN0aW9uCi0gICAgICB8fCAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyLT5vdXRwdXRfc2VjdGlvbgotCSAgPT0gc2VjdGlvbikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE9LLiAgTXVzdCBiZSBhIHN1YnNwYWNlLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzcGFjZSBjb250YWluaW5zIHRoZSBnaXZlbiBzdWJzcGFjZS4gIEl0Ci0gICBpcyBzYWZlIHRvIGFzc3VtZSBzcGFjZSByZWFsbHkgaXMgYSBzcGFjZSwgYW5kIHN1YnNwYWNlIHJlYWxseQotICAgaXMgYSBzdWJzcGFjZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21faXNfY29udGFpbmVyIChzcGFjZSwgc3Vic3BhY2UpCi0gICAgIGFzZWN0aW9uICpzcGFjZSwgKnN1YnNwYWNlOwotewotICByZXR1cm4gKHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNwYWNlKS0+Y29weV9kYXRhLT5jb250YWluZXIgPT0gc3BhY2UKLQkgIHx8IChzb21fc2VjdGlvbl9kYXRhIChzdWJzcGFjZSktPmNvcHlfZGF0YS0+Y29udGFpbmVyLT5vdXRwdXRfc2VjdGlvbgotCSAgICAgID09IHNwYWNlKSk7Ci19Ci0KLS8qIENvdW50IGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBzcGFjZXMgYXR0YWNoZWQgdG8gdGhlIGdpdmVuIEJGRC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1zb21fY291bnRfc3BhY2VzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBjb3VudCA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgICAgY291bnQgKz0gc29tX2lzX3NwYWNlIChzZWN0aW9uKTsKLQotICByZXR1cm4gY291bnQ7Ci19Ci0KLS8qIENvdW50IHRoZSBudW1iZXIgb2Ygc3Vic3BhY2VzIGF0dGFjaGVkIHRvIHRoZSBnaXZlbiBCRkQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotc29tX2NvdW50X3N1YnNwYWNlcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgY291bnQgPSAwOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbiAhPSBOVUxMOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLSAgICBjb3VudCArPSBzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pOwotCi0gIHJldHVybiBjb3VudDsKLX0KLQotLyogUmV0dXJuIC0xLCAwLCAxIGluZGljYXRpbmcgdGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIHN5bTEgYW5kIHN5bTIuCi0KLSAgIFdlIGRlc2lyZSBzeW1ib2xzIHRvIGJlIG9yZGVyZWQgc3RhcnRpbmcgd2l0aCB0aGUgc3ltYm9sIHdpdGggdGhlCi0gICBoaWdoZXN0IHJlbG9jYXRpb24gY291bnQgZG93biB0byB0aGUgc3ltYm9sIHdpdGggdGhlIGxvd2VzdCByZWxvY2F0aW9uCi0gICBjb3VudC4gIERvaW5nIHNvIGNvbXBhY3RzIHRoZSByZWxvY2F0aW9uIHN0cmVhbS4gICovCi0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfc3ltcyAoYXJnMSwgYXJnMikKLSAgICAgY29uc3QgUFRSIGFyZzE7Ci0gICAgIGNvbnN0IFBUUiBhcmcyOwotCi17Ci0gIGFzeW1ib2wgKipzeW0xID0gKGFzeW1ib2wgKiopIGFyZzE7Ci0gIGFzeW1ib2wgKipzeW0yID0gKGFzeW1ib2wgKiopIGFyZzI7Ci0gIHVuc2lnbmVkIGludCBjb3VudDEsIGNvdW50MjsKLSAgCi0gIC8qIEdldCByZWxvY2F0aW9uIGNvdW50IGZvciBlYWNoIHN5bWJvbC4gIE5vdGUgdGhhdCB0aGUgY291bnQKLSAgICAgaXMgc3RvcmVkIGluIHRoZSB1ZGF0YSBwb2ludGVyIGZvciBzZWN0aW9uIHN5bWJvbHMhICAqLwotICBpZiAoKCpzeW0xKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0gICAgY291bnQxID0gKCpzeW0xKS0+dWRhdGEuaTsKLSAgZWxzZQotICAgIGNvdW50MSA9IHNvbV9zeW1ib2xfZGF0YSAoKnN5bTEpLT5yZWxvY19jb3VudDsKLQotICBpZiAoKCpzeW0yKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0gICAgY291bnQyID0gKCpzeW0yKS0+dWRhdGEuaTsKLSAgZWxzZQotICAgIGNvdW50MiA9IHNvbV9zeW1ib2xfZGF0YSAoKnN5bTIpLT5yZWxvY19jb3VudDsKLQotICAvKiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHZhbHVlLiAgKi8KLSAgaWYgKGNvdW50MSA8IGNvdW50MikKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoY291bnQxID4gY291bnQyKQotICAgIHJldHVybiAtMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiAtMSwgMCwgMSBpbmRpY2F0aW5nIHRoZSByZWxhdGl2ZSBvcmRlcmluZyBvZiBzdWJzcGFjZTEKLSAgIGFuZCBzdWJzcGFjZS4gICovCi0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfc3Vic3BhY2VzIChhcmcxLCBhcmcyKQotICAgICBjb25zdCBQVFIgYXJnMTsKLSAgICAgY29uc3QgUFRSIGFyZzI7Ci0KLXsKLSAgYXNlY3Rpb24gKipzdWJzcGFjZTEgPSAoYXNlY3Rpb24gKiopIGFyZzE7Ci0gIGFzZWN0aW9uICoqc3Vic3BhY2UyID0gKGFzZWN0aW9uICoqKSBhcmcyOwotICB1bnNpZ25lZCBpbnQgY291bnQxLCBjb3VudDI7Ci0gIAotICBpZiAoKCpzdWJzcGFjZTEpLT50YXJnZXRfaW5kZXggPCAoKnN1YnNwYWNlMiktPnRhcmdldF9pbmRleCkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKCgqc3Vic3BhY2UyKS0+dGFyZ2V0X2luZGV4IDwgKCpzdWJzcGFjZTEpLT50YXJnZXRfaW5kZXgpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogUGVyZm9ybSB2YXJpb3VzIHdvcmsgaW4gcHJlcGFyYXRpb24gZm9yIGVtaXR0aW5nIHRoZSBmaXh1cCBzdHJlYW0uICAqLwotCi1zdGF0aWMgdm9pZAotc29tX3ByZXBfZm9yX2ZpeHVwcyAoYWJmZCwgc3ltcywgbnVtX3N5bXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbnVtX3N5bXM7Ci17Ci0gIGludCBpOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgYXN5bWJvbCAqKnNvcnRlZF9zeW1zOwotCi0gIC8qIE1vc3QgU09NIHJlbG9jYXRpb25zIGludm9sdmluZyBhIHN5bWJvbCBoYXZlIGEgbGVuZ3RoIHdoaWNoIGlzCi0gICAgIGRlcGVuZGVudCBvbiB0aGUgaW5kZXggb2YgdGhlIHN5bWJvbC4gIFNvIHN5bWJvbHMgd2hpY2ggYXJlCi0gICAgIHVzZWQgb2Z0ZW4gaW4gcmVsb2NhdGlvbnMgc2hvdWxkIGhhdmUgYSBzbWFsbCBpbmRleC4gICovCi0KLSAgLyogRmlyc3QgaW5pdGlhbGl6ZSB0aGUgY291bnRlcnMgZm9yIGVhY2ggc3ltYm9sLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IG51bV9zeW1zOyBpKyspCi0gICAgewotICAgICAgLyogSGFuZGxlIGEgc2VjdGlvbiBzeW1ib2w7IHRoZXNlIGhhdmUgbm8gcG9pbnRlcnMgYmFjayB0byB0aGUKLQkgU09NIHN5bWJvbCBpbmZvLiAgU28gd2UganVzdCB1c2UgdGhlIHVkYXRhIGZpZWxkIHRvIGhvbGQgdGhlCi0JIHJlbG9jYXRpb24gY291bnQuICAqLwotICAgICAgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltc1tpXSkgPT0gTlVMTAotCSAgfHwgc3ltc1tpXS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0JewotCSAgc3ltc1tpXS0+ZmxhZ3MgfD0gQlNGX1NFQ1RJT05fU1lNOwotCSAgc3ltc1tpXS0+dWRhdGEuaSA9IDA7Ci0JfQotICAgICAgZWxzZQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltc1tpXSktPnJlbG9jX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgLyogTm93IHRoYXQgdGhlIGNvdW50ZXJzIGFyZSBpbml0aWFsaXplZCwgbWFrZSBhIHdlaWdodGVkIGNvdW50Ci0gICAgIG9mIGhvdyBvZnRlbiBhIGdpdmVuIHN5bWJvbCBpcyB1c2VkIGluIGEgcmVsb2NhdGlvbi4gICovCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICAvKiBEb2VzIHRoaXMgc2VjdGlvbiBoYXZlIGFueSByZWxvY2F0aW9ucz8gICovCi0gICAgICBpZiAoc2VjdGlvbi0+cmVsb2NfY291bnQgPD0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2FsayB0aHJvdWdoIGVhY2ggcmVsb2NhdGlvbiBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgICAgIGZvciAoaSA9IDE7IGkgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgaSsrKQotCXsKLQkgIGFyZWxlbnQgKnJlbG9jID0gc2VjdGlvbi0+b3JlbG9jYXRpb25baV07Ci0JICBpbnQgc2NhbGU7Ci0KLQkgIC8qIEEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc3ltYm9sIGluIHRoZSAqQUJTKiBzZWN0aW9uIHJlYWxseQotCSAgICAgZG9lcyBub3QgaGF2ZSBhIHN5bWJvbC4gIExpa2V3aXNlIGlmIHRoZSBzeW1ib2wgaXNuJ3QgYXNzb2NpYXRlZAotCSAgICAgd2l0aCBhbnkgc2VjdGlvbi4gICovCi0JICBpZiAocmVsb2MtPnN5bV9wdHJfcHRyID09IE5VTEwKLQkgICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKCgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+c2VjdGlvbikpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBTY2FsaW5nIHRvIGVuY291cmFnZSBzeW1ib2xzIGludm9sdmVkIGluIFJfRFBfUkVMQVRJVkUgCi0JICAgICBhbmQgUl9DT0RFX09ORV9TWU1CT0wgcmVsb2NhdGlvbnMgdG8gY29tZSBmaXJzdC4gIFRoZXNlCi0JICAgICB0d28gcmVsb2NhdGlvbnMgaGF2ZSBzaW5nbGUgYnl0ZSB2ZXJzaW9ucyBpZiB0aGUgc3ltYm9sCi0JICAgICBpbmRleCBpcyB2ZXJ5IHNtYWxsLiAgKi8KLQkgIGlmIChyZWxvYy0+aG93dG8tPnR5cGUgPT0gUl9EUF9SRUxBVElWRQotCSAgICAgIHx8IHJlbG9jLT5ob3d0by0+dHlwZSA9PSBSX0NPREVfT05FX1NZTUJPTCkKLQkgICAgc2NhbGUgPSAyOwotCSAgZWxzZQotCSAgICBzY2FsZSA9IDE7Ci0KLQkgIC8qIEhhbmRsZSBzZWN0aW9uIHN5bWJvbHMgYnkgc3RvcmluZyB0aGUgY291bnQgaW4gdGhlIHVkYXRhCi0JICAgICBmaWVsZC4gIEl0IHdpbGwgbm90IGJlIHVzZWQgYW5kIHRoZSBjb3VudCBpcyB2ZXJ5IGltcG9ydGFudAotCSAgICAgZm9yIHRoZXNlIHN5bWJvbHMuICAqLwotCSAgaWYgKCgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0JICAgIHsKLQkgICAgICAoKnJlbG9jLT5zeW1fcHRyX3B0ciktPnVkYXRhLmkgPQotCQkoKnJlbG9jLT5zeW1fcHRyX3B0ciktPnVkYXRhLmkgKyBzY2FsZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBBIG5vcm1hbCBzeW1ib2wuICBJbmNyZW1lbnQgdGhlIGNvdW50LiAgKi8KLQkgIHNvbV9zeW1ib2xfZGF0YSAoKnJlbG9jLT5zeW1fcHRyX3B0ciktPnJlbG9jX2NvdW50ICs9IHNjYWxlOwotCX0KLSAgICB9Ci0KLSAgLyogU29ydCBhIGNvcHkgb2YgdGhlIHN5bWJvbCB0YWJsZSwgcmF0aGVyIHRoYW4gdGhlIGNhbm9uaWNhbAotICAgICBvdXRwdXQgc3ltYm9sIHRhYmxlLiAgKi8KLSAgc29ydGVkX3N5bXMgPSAoYXN5bWJvbCAqKikgYmZkX3phbGxvYyAoYWJmZCwgbnVtX3N5bXMgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICBtZW1jcHkgKHNvcnRlZF9zeW1zLCBzeW1zLCBudW1fc3ltcyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIHFzb3J0IChzb3J0ZWRfc3ltcywgbnVtX3N5bXMsIHNpemVvZiAoYXN5bWJvbCAqKSwgY29tcGFyZV9zeW1zKTsKLSAgb2JqX3NvbV9zb3J0ZWRfc3ltcyAoYWJmZCkgPSBzb3J0ZWRfc3ltczsKLQotICAvKiBDb21wdXRlIHRoZSBzeW1ib2wgaW5kZXhlcywgdGhleSB3aWxsIGJlIG5lZWRlZCBieSB0aGUgcmVsb2NhdGlvbgotICAgICBjb2RlLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IG51bV9zeW1zOyBpKyspCi0gICAgewotICAgICAgLyogQSBzZWN0aW9uIHN5bWJvbC4gIEFnYWluLCB0aGVyZSBpcyBubyBwb2ludGVyIHRvIGJhY2tlbmQgc3ltYm9sCi0JIGluZm9ybWF0aW9uLCBzbyB3ZSByZXVzZSB0aGUgdWRhdGEgZmllbGQgYWdhaW4uICAqLwotICAgICAgaWYgKHNvcnRlZF9zeW1zW2ldLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQlzb3J0ZWRfc3ltc1tpXS0+dWRhdGEuaSA9IGk7Ci0gICAgICBlbHNlCi0gICAgICAgIHNvbV9zeW1ib2xfZGF0YSAoc29ydGVkX3N5bXNbaV0pLT5pbmRleCA9IGk7Ci0gICAgfQotfQotCi1zdGF0aWMgYm9vbGVhbgotc29tX3dyaXRlX2ZpeHVwcyAoYWJmZCwgY3VycmVudF9vZmZzZXQsIHRvdGFsX3JlbG9jX3NpemVwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQ7Ci0gICAgIHVuc2lnbmVkIGludCAqdG90YWxfcmVsb2Nfc2l6ZXA7Ci17Ci0gIHVuc2lnbmVkIGludCBpLCBqOwotICAvKiBDaHVuayBvZiBtZW1vcnkgdGhhdCB3ZSBjYW4gdXNlIGFzIGJ1ZmZlciBzcGFjZSwgdGhlbiB0aHJvdwotICAgICBhd2F5LiAgKi8KLSAgdW5zaWduZWQgY2hhciB0bXBfc3BhY2VbU09NX1RNUF9CVUZTSVpFXTsKLSAgdW5zaWduZWQgY2hhciAqcDsKLSAgdW5zaWduZWQgaW50IHRvdGFsX3JlbG9jX3NpemUgPSAwOwotICB1bnNpZ25lZCBpbnQgc3Vic3BhY2VfcmVsb2Nfc2l6ZSA9IDA7Ci0gIHVuc2lnbmVkIGludCBudW1fc3BhY2VzID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNwYWNlX3RvdGFsOwotICBhc2VjdGlvbiAqc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotCi0gIG1lbXNldCAodG1wX3NwYWNlLCAwLCBTT01fVE1QX0JVRlNJWkUpOwotICBwID0gdG1wX3NwYWNlOwotCi0gIC8qIEFsbCB0aGUgZml4dXBzIGZvciBhIHBhcnRpY3VsYXIgc3Vic3BhY2UgYXJlIGVtaXR0ZWQgaW4gYSBzaW5nbGUKLSAgICAgc3RyZWFtLiAgQWxsIHRoZSBzdWJzcGFjZXMgZm9yIGEgcGFydGljdWxhciBzcGFjZSBhcmUgZW1pdHRlZAotICAgICBhcyBhIHNpbmdsZSBzdHJlYW0uCi0KLSAgICAgU28sIHRvIGdldCBhbGwgdGhlIGxvY2F0aW9ucyBjb3JyZWN0IG9uZSBtdXN0IGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlCi0gICAgIHNwYWNlcywgZm9yIGVhY2ggc3BhY2UgaXRlcmF0ZSB0aHJvdWdoIGl0cyBzdWJzcGFjZXMgYW5kIG91dHB1dCBhCi0gICAgIGZpeHVwcyBzdHJlYW0uICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NwYWNlczsgaSsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzdWJzZWN0aW9uOwotCi0gICAgICAvKiBGaW5kIGEgc3BhY2UuICAqLwotICAgICAgd2hpbGUgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pKQotCXNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OwotCi0gICAgICAvKiBOb3cgaXRlcmF0ZSB0aHJvdWdoIGVhY2ggb2YgaXRzIHN1YnNwYWNlcy4gICovCi0gICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBzdWJzZWN0aW9uICE9IE5VTEw7Ci0JICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0JewotCSAgaW50IHJlbG9jX29mZnNldCwgY3VycmVudF9yb3VuZGluZ19tb2RlOwotCi0JICAvKiBGaW5kIGEgc3Vic3BhY2Ugb2YgdGhpcyBzcGFjZS4gICovCi0JICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc3Vic2VjdGlvbikKLQkgICAgICB8fCAhc29tX2lzX2NvbnRhaW5lciAoc2VjdGlvbiwgc3Vic2VjdGlvbikpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGlzIHN1YnNwYWNlIGRvZXMgbm90IGhhdmUgcmVhbCBkYXRhLCB0aGVuIHdlIGFyZQotCSAgICAgZmluaXNlZCB3aXRoIGl0LiAgKi8KLQkgIGlmICgoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKQotCSAgICB7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpeHVwX3JlcXVlc3RfaW5kZXgKLQkJPSAtMTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBUaGlzIHN1YnNwYWNlIGhhcyBzb21lIHJlbG9jYXRpb25zLiAgUHV0IHRoZSByZWxvY2F0aW9uIHN0cmVhbQotCSAgICAgaW5kZXggaW50byB0aGUgc3Vic3BhY2UgcmVjb3JkLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5maXh1cF9yZXF1ZXN0X2luZGV4Ci0JICAgID0gdG90YWxfcmVsb2Nfc2l6ZTsKLQotCSAgLyogVG8gbWFrZSBsaWZlIGVhc2llciBzdGFydCBvdmVyIHdpdGggYSBjbGVhbiBzbGF0ZSBmb3IgCi0JICAgICBlYWNoIHN1YnNwYWNlLiAgU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHJlbG9jYXRpb24gc3RyZWFtCi0JICAgICBmb3IgdGhpcyBzdWJzcGFjZSBpbiBwcmVwYXJhdGlvbiBmb3Igd3JpdGluZyBvdXQgaXRzIGZpeHVwCi0JICAgICBzdHJlYW0uICAqLwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBjdXJyZW50X29mZnNldCArIHRvdGFsX3JlbG9jX3NpemUsIFNFRUtfU0VUKSA8IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogQnVmZmVyIHNwYWNlIGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLiAgSnVzdCBwZXJmb3JtIHNvbWUKLQkgICAgIGluaXRpYWxpemF0aW9uIGhlcmUuICAqLwotCSAgcCA9IHRtcF9zcGFjZTsKLQkgIHN1YnNwYWNlX3JlbG9jX3NpemUgPSAwOwotCSAgcmVsb2Nfb2Zmc2V0ID0gMDsKLQkgIHNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlIChyZWxvY19xdWV1ZSk7Ci0JICBjdXJyZW50X3JvdW5kaW5nX21vZGUgPSBSX05fTU9ERTsKLQotCSAgLyogVHJhbnNsYXRlIGVhY2ggQkZEIHJlbG9jYXRpb24gaW50byBvbmUgb3IgbW9yZSBTT00gCi0JICAgICByZWxvY2F0aW9ucy4gICovCi0JICBmb3IgKGogPSAwOyBqIDwgc3Vic2VjdGlvbi0+cmVsb2NfY291bnQ7IGorKykKLQkgICAgewotCSAgICAgIGFyZWxlbnQgKmJmZF9yZWxvYyA9IHN1YnNlY3Rpb24tPm9yZWxvY2F0aW9uW2pdOwotCSAgICAgIHVuc2lnbmVkIGludCBza2lwOwotCSAgICAgIGludCBzeW1fbnVtOwotCi0JICAgICAgLyogR2V0IHRoZSBzeW1ib2wgbnVtYmVyLiAgUmVtZW1iZXIgaXQncyBzdG9yZWQgaW4gYSAKLQkJIHNwZWNpYWwgcGxhY2UgZm9yIHNlY3Rpb24gc3ltYm9scy4gICovCi0JICAgICAgaWYgKCgqYmZkX3JlbG9jLT5zeW1fcHRyX3B0ciktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotCQlzeW1fbnVtID0gKCpiZmRfcmVsb2MtPnN5bV9wdHJfcHRyKS0+dWRhdGEuaTsKLQkgICAgICBlbHNlCi0JCXN5bV9udW0gPSBzb21fc3ltYm9sX2RhdGEgKCpiZmRfcmVsb2MtPnN5bV9wdHJfcHRyKS0+aW5kZXg7Ci0JICAgICAgCi0JICAgICAgLyogSWYgdGhlcmUgaXMgbm90IGVub3VnaCByb29tIGZvciB0aGUgbmV4dCBjb3VwbGUgcmVsb2NhdGlvbnMsCi0JCSB0aGVuIGR1bXAgdGhlIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5vdy4gIEFsc28gcmVpbml0aWFsaXplCi0JCSB0aGUgcmVsb2NhdGlvbiBxdWV1ZS4gCi0KLQkJIE5vIHNpbmdsZSBCRkQgcmVsb2NhdGlvbiBjb3VsZCBldmVyIHRyYW5zbGF0ZSBpbnRvIG1vcmUKLQkJIHRoYW4gMTAwIGJ5dGVzIG9mIFNPTSByZWxvY2F0aW9ucyAoMjBieXRlcyBpcyBwcm9iYWJseSB0aGUKLQkJIHVwcGVyIGxpbWl0LCBidXQgbGVhdmUgbG90cyBvZiBzcGFjZSBmb3IgZ3Jvd3RoKS4gICovCi0JICAgICAgaWYgKHAgLSB0bXBfc3BhY2UgKyAxMDAgPiBTT01fVE1QX0JVRlNJWkUpCi0JCXsKLQkJICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0bXBfc3BhY2UsIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpCi0JCSAgICAgICE9IHAgLSB0bXBfc3BhY2UpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBwID0gdG1wX3NwYWNlOwotCQkgIHNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlIChyZWxvY19xdWV1ZSk7Ci0JCX0KLQotCSAgICAgIC8qIEVtaXQgUl9OT19SRUxPQ0FUSU9OIGZpeHVwcyB0byBtYXAgYW55IGJ5dGVzIHdoaWNoIHdlcmUKLQkJIHNraXBwZWQuICAqLwotCSAgICAgIHNraXAgPSBiZmRfcmVsb2MtPmFkZHJlc3MgLSByZWxvY19vZmZzZXQ7Ci0JICAgICAgcCA9IHNvbV9yZWxvY19za2lwIChhYmZkLCBza2lwLCBwLAotCQkJCSAgJnN1YnNwYWNlX3JlbG9jX3NpemUsIHJlbG9jX3F1ZXVlKTsKLQotCSAgICAgIC8qIFVwZGF0ZSByZWxvY19vZmZzZXQgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbi4KLQotCQkgTWFueSByZWxvY2F0aW9ucyBkbyBub3QgY29uc3VtZSBpbnB1dCBieXRlcy4gIFRoZXkKLQkJIGFyZSBtYXJrZXJzLCBvciBzZXQgc3RhdGUgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gc29tZQotCQkgbGF0ZXIgcmVsb2NhdGlvbi4gICovCi0JICAgICAgc3dpdGNoIChiZmRfcmVsb2MtPmhvd3RvLT50eXBlKQotCQl7Ci0JCWNhc2UgUl9FTlRSWToKLQkJY2FzZSBSX0FMVF9FTlRSWToKLQkJY2FzZSBSX0VYSVQ6Ci0JCWNhc2UgUl9OX01PREU6Ci0JCWNhc2UgUl9TX01PREU6Ci0JCWNhc2UgUl9EX01PREU6Ci0JCWNhc2UgUl9SX01PREU6Ci0JCWNhc2UgUl9GU0VMOgotCQljYXNlIFJfTFNFTDoKLQkJY2FzZSBSX1JTRUw6Ci0JCWNhc2UgUl9DT01QMToKLQkJY2FzZSBSX0NPTVAyOgotCQljYXNlIFJfQkVHSU5fQlJUQUI6Ci0JCWNhc2UgUl9FTkRfQlJUQUI6Ci0JCWNhc2UgUl9CRUdJTl9UUlk6Ci0JCWNhc2UgUl9FTkRfVFJZOgotCQljYXNlIFJfTjBTRUw6Ci0JCWNhc2UgUl9OMVNFTDoKLQkJICByZWxvY19vZmZzZXQgPSBiZmRfcmVsb2MtPmFkZHJlc3M7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICByZWxvY19vZmZzZXQgPSBiZmRfcmVsb2MtPmFkZHJlc3MgKyA0OwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICAvKiBOb3cgdGhlIGFjdHVhbCByZWxvY2F0aW9uIHdlIGNhcmUgYWJvdXQuICAqLwotCSAgICAgIHN3aXRjaCAoYmZkX3JlbG9jLT5ob3d0by0+dHlwZSkKLQkJewotCQljYXNlIFJfUENSRUxfQ0FMTDoKLQkJY2FzZSBSX0FCU19DQUxMOgotCQkgIHAgPSBzb21fcmVsb2NfY2FsbCAoYWJmZCwgcCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJICAgICAgYmZkX3JlbG9jLCBzeW1fbnVtLCByZWxvY19xdWV1ZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0NPREVfT05FX1NZTUJPTDoKLQkJY2FzZSBSX0RQX1JFTEFUSVZFOgotCQkgIC8qIEFjY291bnQgZm9yIGFueSBhZGRlbmQuICAqLwotCQkgIGlmIChiZmRfcmVsb2MtPmFkZGVuZCkKLQkJICAgIHAgPSBzb21fcmVsb2NfYWRkZW5kIChhYmZkLCBiZmRfcmVsb2MtPmFkZGVuZCwgcCwgCi0JCQkJCSAgJnN1YnNwYWNlX3JlbG9jX3NpemUsIHJlbG9jX3F1ZXVlKTsKLQotCQkgIGlmIChzeW1fbnVtIDwgMHgyMCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgc3ltX251bSwgcCk7Ci0JCSAgICAgIHN1YnNwYWNlX3JlbG9jX3NpemUgKz0gMTsKLQkJICAgICAgcCArPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN5bV9udW0gPCAweDEwMCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMzIsIHApOwotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0sIHAgKyAxKTsKLQkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcCwKLQkJCQkJICAyLCByZWxvY19xdWV1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3ltX251bSA8IDB4MTAwMDAwMDApCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDMzLCBwKTsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtID4+IDE2LCBwICsgMSk7Ci0JCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHN5bV9udW0sIHAgKyAyKTsgCi0JCSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJCSAgcCwgNCwgcmVsb2NfcXVldWUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9EQVRBX09ORV9TWU1CT0w6Ci0JCWNhc2UgUl9EQVRBX1BMQUJFTDoKLQkJY2FzZSBSX0NPREVfUExBQkVMOgotCQljYXNlIFJfRExUX1JFTDoKLQkJICAvKiBBY2NvdW50IGZvciBhbnkgYWRkZW5kIHVzaW5nIFJfREFUQV9PVkVSUklERS4gICovCi0JCSAgaWYgKGJmZF9yZWxvYy0+aG93dG8tPnR5cGUgIT0gUl9EQVRBX09ORV9TWU1CT0wKLQkJICAgICAgJiYgYmZkX3JlbG9jLT5hZGRlbmQpCi0JCSAgICBwID0gc29tX3JlbG9jX2FkZGVuZCAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQsIHAsIAotCQkJCQkgICZzdWJzcGFjZV9yZWxvY19zaXplLCByZWxvY19xdWV1ZSk7Ci0KLQkJICBpZiAoc3ltX251bSA8IDB4MTAwKQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOwotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0sIHAgKyAxKTsKLQkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcCwKLQkJCQkJICAyLCByZWxvY19xdWV1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3ltX251bSA8IDB4MTAwMDAwMDApCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDEsIHApOwotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0gPj4gMTYsIHAgKyAxKTsKLQkJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDIpOyAKLQkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkJICBwLCA0LCByZWxvY19xdWV1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0VOVFJZOgotCQkgIHsKLQkJICAgIGludCB0bXA7Ci0JCSAgICBhcmVsZW50ICp0bXBfcmVsb2MgPSBOVUxMOwotCQkgICAgYmZkX3B1dF84IChhYmZkLCBSX0VOVFJZLCBwKTsKLQotCQkgICAgLyogUl9FTlRSWSByZWxvY2F0aW9ucyBoYXZlIDY0IGJpdHMgb2YgYXNzb2NpYXRlZAotCQkgICAgICAgZGF0YS4gIFVuZm9ydHVuYXRlbHkgdGhlIGFkZGVuZCBmaWVsZCBvZiBhIGJmZAotCQkgICAgICAgcmVsb2NhdGlvbiBpcyBvbmx5IDMyIGJpdHMuICBTbywgd2Ugc3BsaXQgdXAKLQkJICAgICAgIHRoZSA2NGJpdCB1bndpbmQgaW5mb3JtYXRpb24gYW5kIHN0b3JlIHBhcnQgaW4KLQkJICAgICAgIHRoZSBSX0VOVFJZIHJlbG9jYXRpb24sIGFuZCB0aGUgcmVzdCBpbiB0aGUgUl9FWElUCi0JCSAgICAgICByZWxvY2F0aW9uLiAgKi8KLQkJICAgIGJmZF9wdXRfMzIgKGFiZmQsIGJmZF9yZWxvYy0+YWRkZW5kLCBwICsgMSk7Ci0JCQotCQkgICAgLyogRmluZCB0aGUgbmV4dCBSX0VYSVQgcmVsb2NhdGlvbi4gICovCi0JCSAgICBmb3IgKHRtcCA9IGo7IHRtcCA8IHN1YnNlY3Rpb24tPnJlbG9jX2NvdW50OyB0bXArKykKLQkJICAgICAgewotCQkgICAgICAgIHRtcF9yZWxvYyA9IHN1YnNlY3Rpb24tPm9yZWxvY2F0aW9uW3RtcF07Ci0JCQlpZiAodG1wX3JlbG9jLT5ob3d0by0+dHlwZSA9PSBSX0VYSVQpCi0JCQkgIGJyZWFrOwotCQkgICAgICB9Ci0KLQkJICAgIGlmICh0bXAgPT0gc3Vic2VjdGlvbi0+cmVsb2NfY291bnQpCi0JCSAgICAgIGFib3J0ICgpOwotCi0JCSAgICBiZmRfcHV0XzMyIChhYmZkLCB0bXBfcmVsb2MtPmFkZGVuZCwgcCArIDUpOwotCQkgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkJcCwgOSwgcmVsb2NfcXVldWUpOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQkgIAotCQljYXNlIFJfTl9NT0RFOgotCQljYXNlIFJfU19NT0RFOgotCQljYXNlIFJfRF9NT0RFOgotCQljYXNlIFJfUl9NT0RFOgotCQkgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiByZXF1ZXN0cyB0aGUgY3VycmVudCByb3VuZGluZwotCQkgICAgIG1vZGUsIHRoZW4gaXQgaXMgcmVkdW5kYW50LiAgKi8KLQkJICBpZiAoYmZkX3JlbG9jLT5ob3d0by0+dHlwZSAhPSBjdXJyZW50X3JvdW5kaW5nX21vZGUpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgICAgIHN1YnNwYWNlX3JlbG9jX3NpemUgKz0gMTsKLQkJICAgICAgcCArPSAxOwotCQkgICAgICBjdXJyZW50X3JvdW5kaW5nX21vZGUgPSBiZmRfcmVsb2MtPmhvd3RvLT50eXBlOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9FWElUOgotCQljYXNlIFJfQUxUX0VOVFJZOgotCQljYXNlIFJfRlNFTDoKLQkJY2FzZSBSX0xTRUw6Ci0JCWNhc2UgUl9SU0VMOgotCQljYXNlIFJfQkVHSU5fQlJUQUI6Ci0JCWNhc2UgUl9FTkRfQlJUQUI6Ci0JCWNhc2UgUl9CRUdJTl9UUlk6Ci0JCWNhc2UgUl9OMFNFTDoKLQkJY2FzZSBSX04xU0VMOgotCQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSArPSAxOwotCQkgIHAgKz0gMTsKLQkJICBicmVhazsKLQotCQljYXNlIFJfRU5EX1RSWToKLQkJICAvKiBUaGUgZW5kIG9mIGEgZXhjZXB0aW9uIGhhbmRsaW5nIHJlZ2lvbi4gIFRoZSByZWxvYydzCi0JCSAgICAgYWRkZW5kIGNvbnRhaW5zIHRoZSBvZmZzZXQgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGluZwotCQkgICAgIGNvZGUuICAqLwotCQkgIGlmIChiZmRfcmVsb2MtPmFkZGVuZCA9PSAwKQotCQkgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlLCBwKTsKLQkJICBlbHNlIGlmIChiZmRfcmVsb2MtPmFkZGVuZCA8IDEwMjQpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDEsIHApOwotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+YWRkZW5kIC8gNCwgcCArIDEpOwotCQkgICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLAotCQkJCQkgIHAsIDIsIHJlbG9jX3F1ZXVlKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDIsIHApOwotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIChiZmRfcmVsb2MtPmFkZGVuZCAvIDQpID4+IDE2LCBwICsgMSk7Ci0JCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGJmZF9yZWxvYy0+YWRkZW5kIC8gNCwgcCArIDIpOwotCQkgICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLAotCQkJCQkgIHAsIDQsIHJlbG9jX3F1ZXVlKTsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJICAgICAgCi0JCWNhc2UgUl9DT01QMToKLQkJICAvKiBUaGUgb25seSB0aW1lIHdlIGdlbmVyYXRlIFJfQ09NUDEsIFJfQ09NUDIgYW5kIAotCQkgICAgIFJfQ09ERV9FWFBSIHJlbG9jcyBpcyBmb3IgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvCi0JCSAgICAgc3ltYm9scy4gIEhlbmNlIHdlIGNhbiBjaGVhdCBoZXJlLiAgKi8KLQkJICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg0NCwgcCArIDEpOwotCQkgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJICAgICAgcCwgMiwgcmVsb2NfcXVldWUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9DT01QMjoKLQkJICAvKiBUaGUgb25seSB0aW1lIHdlIGdlbmVyYXRlIFJfQ09NUDEsIFJfQ09NUDIgYW5kIAotCQkgICAgIFJfQ09ERV9FWFBSIHJlbG9jcyBpcyBmb3IgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvCi0JCSAgICAgc3ltYm9scy4gIEhlbmNlIHdlIGNhbiBjaGVhdCBoZXJlLiAgKi8KLQkJICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg4MCwgcCArIDEpOwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgc3ltX251bSA+PiAxNiwgcCArIDIpOwotCQkgIGJmZF9wdXRfMTYgKGFiZmQsIHN5bV9udW0sIHAgKyAzKTsKLQkJICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLAotCQkJCSAgICAgIHAsIDUsIHJlbG9jX3F1ZXVlKTsKLQkJICBicmVhazsKLQotCQljYXNlIFJfQ09ERV9FWFBSOgotCQljYXNlIFJfREFUQV9FWFBSOgotCQkgIC8qIFRoZSBvbmx5IHRpbWUgd2UgZ2VuZXJhdGUgUl9DT01QMSwgUl9DT01QMiBhbmQgCi0JCSAgICAgUl9DT0RFX0VYUFIgcmVsb2NzIGlzIGZvciB0aGUgZGlmZmVyZW5jZSBvZiB0d28KLQkJICAgICBzeW1ib2xzLiAgSGVuY2Ugd2UgY2FuIGNoZWF0IGhlcmUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSArPSAxOwotCQkgIHAgKz0gMTsKLQkJICBicmVhazsKLQotCQkvKiBQdXQgYSAiUl9SRVNFUlZFRCIgcmVsb2NhdGlvbiBpbiB0aGUgc3RyZWFtIGlmCi0JCSAgIHdlIGhpdCBzb21ldGhpbmcgd2UgZG8gbm90IHVuZGVyc3RhbmQuICBUaGUgbGlua2VyCi0JCSAgIHdpbGwgY29tcGxhaW4gbG91ZGx5IGlmIHRoaXMgZXZlciBoYXBwZW5zLiAgKi8KLQkJZGVmYXVsdDoKLQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZmYsIHApOwotCQkgIHN1YnNwYWNlX3JlbG9jX3NpemUgKz0gMTsKLQkJICBwICs9IDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBMYXN0IEJGRCByZWxvY2F0aW9uIGZvciBhIHN1YnNwYWNlIGhhcyBiZWVuIHByb2Nlc3NlZC4KLQkgICAgIE1hcCB0aGUgcmVzdCBvZiB0aGUgc3Vic3BhY2Ugd2l0aCBSX05PX1JFTE9DQVRJT04gZml4dXBzLiAgKi8KLQkgIHAgPSBzb21fcmVsb2Nfc2tpcCAoYWJmZCwgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Vic2VjdGlvbikgCi0JCQkgICAgICAgICAgICAgIC0gcmVsb2Nfb2Zmc2V0LAotCQkJICAgICAgcCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsIHJlbG9jX3F1ZXVlKTsKLQotCSAgLyogU2NyaWJibGUgb3V0IHRoZSByZWxvY2F0aW9ucy4gICovCi0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0bXBfc3BhY2UsIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpCi0JICAgICAgIT0gcCAtIHRtcF9zcGFjZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgcCA9IHRtcF9zcGFjZTsKLQotCSAgdG90YWxfcmVsb2Nfc2l6ZSArPSBzdWJzcGFjZV9yZWxvY19zaXplOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpeHVwX3JlcXVlc3RfcXVhbnRpdHkKLQkgICAgPSBzdWJzcGFjZV9yZWxvY19zaXplOwotCX0KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OwotICAgIH0KLSAgKnRvdGFsX3JlbG9jX3NpemVwID0gdG90YWxfcmVsb2Nfc2l6ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgc3BhY2Uvc3Vic3BhY2Ugc3RyaW5nIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV93cml0ZV9zcGFjZV9zdHJpbmdzIChhYmZkLCBjdXJyZW50X29mZnNldCwgc3RyaW5nX3NpemVwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQ7Ci0gICAgIHVuc2lnbmVkIGludCAqc3RyaW5nX3NpemVwOwotewotICAvKiBDaHVuayBvZiBtZW1vcnkgdGhhdCB3ZSBjYW4gdXNlIGFzIGJ1ZmZlciBzcGFjZSwgdGhlbiB0aHJvdwotICAgICBhd2F5LiAgKi8KLSAgdW5zaWduZWQgY2hhciB0bXBfc3BhY2VbU09NX1RNUF9CVUZTSVpFXTsKLSAgdW5zaWduZWQgY2hhciAqcDsKLSAgdW5zaWduZWQgaW50IHN0cmluZ3Nfc2l6ZSA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gIG1lbXNldCAodG1wX3NwYWNlLCAwLCBTT01fVE1QX0JVRlNJWkUpOwotICBwID0gdG1wX3NwYWNlOwotCi0gIC8qIFNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzcGFjZSBzdHJpbmdzIGluIHByZXBhcmF0aW9uIGZvciB3cml0aW5nCi0gICAgIHRoZW0gb3V0LiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBjdXJyZW50X29mZnNldCwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogV2FsayB0aHJvdWdoIGFsbCB0aGUgc3BhY2VzIGFuZCBzdWJzcGFjZXMgKG9yZGVyIGlzIG5vdCBpbXBvcnRhbnQpCi0gICAgIGJ1aWxkaW5nIHVwIGFuZCB3cml0aW5nIHN0cmluZyB0YWJsZSBlbnRyaWVzIGZvciB0aGVpciBuYW1lcy4gICovCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBsZW5ndGg7Ci0KLSAgICAgIC8qIE9ubHkgd29yayB3aXRoIHNwYWNlL3N1YnNwYWNlczsgYXZvaWQgYW55IG90aGVyIHNlY3Rpb25zCi0JIHdoaWNoIG1pZ2h0IGhhdmUgYmVlbiBtYWRlICgudGV4dCBmb3IgZXhhbXBsZSkuICAqLwotICAgICAgaWYgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pICYmICFzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgc3BhY2Uvc3Vic3BhY2UgbmFtZS4gICovCi0gICAgICBsZW5ndGggPSBzdHJsZW4gKHNlY3Rpb24tPm5hbWUpOwotCi0gICAgICAvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gZm9yIHRoZSBuZXh0IGVudHJ5LCB0aGVuIGR1bXAgdGhlCi0JIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5vdy4gIEVhY2ggZW50cnkgd2lsbCB0YWtlIDQgYnl0ZXMgdG8KLQkgaG9sZCB0aGUgc3RyaW5nIGxlbmd0aCArIHRoZSBzdHJpbmcgaXRzZWxmICsgbnVsbCB0ZXJtaW5hdG9yLiAgKi8KLSAgICAgIGlmIChwIC0gdG1wX3NwYWNlICsgNSArIGxlbmd0aCA+IFNPTV9UTVBfQlVGU0laRSkKLQl7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdG1wX3NwYWNlWzBdLCBwIC0gdG1wX3NwYWNlLCAxLCBhYmZkKQotCSAgICAgICE9IHAgLSB0bXBfc3BhY2UpIAotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBSZXNldCB0byBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBzcGFjZS4gICovCi0JICBwID0gdG1wX3NwYWNlOwotCX0KLQotICAgICAgLyogRmlyc3QgZWxlbWVudCBpbiBhIHN0cmluZyB0YWJsZSBlbnRyeSBpcyB0aGUgbGVuZ3RoIG9mIHRoZQotCSBzdHJpbmcuICBBbGlnbm1lbnQgaXNzdWVzIGFyZSBhbHJlYWR5IGhhbmRsZWQuICAqLwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgbGVuZ3RoLCBwKTsKLSAgICAgIHAgKz0gNDsKLSAgICAgIHN0cmluZ3Nfc2l6ZSArPSA0OwotCi0gICAgICAvKiBSZWNvcmQgdGhlIGluZGV4IGluIHRoZSBzcGFjZS9zdWJzcGFjZSByZWNvcmRzLiAgKi8KLSAgICAgIGlmIChzb21faXNfc3BhY2UgKHNlY3Rpb24pKQotCXNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5uYW1lLm5fc3RyeCA9IHN0cmluZ3Nfc2l6ZTsKLSAgICAgIGVsc2UKLQlzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+bmFtZS5uX3N0cnggPSBzdHJpbmdzX3NpemU7Ci0KLSAgICAgIC8qIE5leHQgY29tZXMgdGhlIHN0cmluZyBpdHNlbGYgKyBhIG51bGwgdGVybWluYXRvci4gICovCi0gICAgICBzdHJjcHkgKHAsIHNlY3Rpb24tPm5hbWUpOwotICAgICAgcCArPSBsZW5ndGggKyAxOwotICAgICAgc3RyaW5nc19zaXplICs9IGxlbmd0aCArIDE7Ci0KLSAgICAgIC8qIEFsd2F5cyBhbGlnbiB1cCB0byB0aGUgbmV4dCB3b3JkIGJvdW5kYXJ5LiAgKi8KLSAgICAgIHdoaWxlIChzdHJpbmdzX3NpemUgJSA0KQotCXsKLQkgIGJmZF9wdXRfOCAoYWJmZCwgMCwgcCk7Ci0JICBwKys7Ci0JICBzdHJpbmdzX3NpemUrKzsKLQl9Ci0gICAgfQotCi0gIC8qIERvbmUgd2l0aCB0aGUgc3BhY2Uvc3Vic3BhY2Ugc3RyaW5ncy4gIFdyaXRlIG91dCBhbnkgaW5mb3JtYXRpb24KLSAgICAgY29udGFpbmVkIGluIGEgcGFydGlhbCBibG9jay4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZ0bXBfc3BhY2VbMF0sIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpICE9IHAgLSB0bXBfc3BhY2UpCi0gICAgcmV0dXJuIGZhbHNlOwotICAqc3RyaW5nX3NpemVwID0gc3RyaW5nc19zaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV93cml0ZV9zeW1ib2xfc3RyaW5ncyAoYWJmZCwgY3VycmVudF9vZmZzZXQsIHN5bXMsIG51bV9zeW1zLCBzdHJpbmdfc2l6ZXAsCi0JCQkgIGNvbXBpbGF0aW9uX3VuaXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldDsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci0gICAgIHVuc2lnbmVkIGludCBudW1fc3ltczsKLSAgICAgdW5zaWduZWQgaW50ICpzdHJpbmdfc2l6ZXA7Ci0gICAgIENPTVBVTklUICpjb21waWxhdGlvbl91bml0OwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgCi0gIC8qIENodW5rIG9mIG1lbW9yeSB0aGF0IHdlIGNhbiB1c2UgYXMgYnVmZmVyIHNwYWNlLCB0aGVuIHRocm93Ci0gICAgIGF3YXkuICAqLwotICB1bnNpZ25lZCBjaGFyIHRtcF9zcGFjZVtTT01fVE1QX0JVRlNJWkVdOwotICB1bnNpZ25lZCBjaGFyICpwOwotICB1bnNpZ25lZCBpbnQgc3RyaW5nc19zaXplID0gMDsKLSAgdW5zaWduZWQgY2hhciAqY29tcFs0XTsKLQotICAvKiBUaGlzIGdldHMgYSBiaXQgZ3J1ZXNvbWUgYmVjYXVzZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdC4gIFRoZQotICAgICBzdHJpbmdzIHdpdGhpbiB0aGUgY29tcGlsYXRpb24gdW5pdCBhcmUgcGFydCBvZiB0aGUgc3ltYm9sCi0gICAgIHN0cmluZ3MsIGJ1dCBkb24ndCBoYXZlIHN5bWJvbF9kaWN0aW9uYXJ5IGVudHJpZXMuICBTbywgbWFudWFsbHkKLSAgICAgd3JpdGUgdGhlbSBhbmQgdXBkYXRlIHRoZSBjb21wbGlhdGlvbiB1bml0IGhlYWRlci4gIE9uIGlucHV0LCB0aGUKLSAgICAgY29tcGlsYXRpb24gdW5pdCBoZWFkZXIgY29udGFpbnMgbG9jYWwgY29waWVzIG9mIHRoZSBzdHJpbmdzLgotICAgICBNb3ZlIHRoZW0gYXNpZGUuICAqLwotICBpZiAoY29tcGlsYXRpb25fdW5pdCkKLSAgICB7Ci0gICAgICBjb21wWzBdID0gY29tcGlsYXRpb25fdW5pdC0+bmFtZS5uX25hbWU7Ci0gICAgICBjb21wWzFdID0gY29tcGlsYXRpb25fdW5pdC0+bGFuZ3VhZ2VfbmFtZS5uX25hbWU7Ci0gICAgICBjb21wWzJdID0gY29tcGlsYXRpb25fdW5pdC0+cHJvZHVjdF9pZC5uX25hbWU7Ci0gICAgICBjb21wWzNdID0gY29tcGlsYXRpb25fdW5pdC0+dmVyc2lvbl9pZC5uX25hbWU7Ci0gICAgfQotCi0gIG1lbXNldCAodG1wX3NwYWNlLCAwLCBTT01fVE1QX0JVRlNJWkUpOwotICBwID0gdG1wX3NwYWNlOwotCi0gIC8qIFNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzcGFjZSBzdHJpbmdzIGluIHByZXBhcmF0aW9uIGZvciB3cml0aW5nCi0gICAgIHRoZW0gb3V0LiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBjdXJyZW50X29mZnNldCwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvbXBpbGF0aW9uX3VuaXQpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQl7Ci0JICBpbnQgbGVuZ3RoID0gc3RybGVuIChjb21wW2ldKTsKLQotCSAgLyogSWYgdGhlcmUgaXMgbm90IGVub3VnaCByb29tIGZvciB0aGUgbmV4dCBlbnRyeSwgdGhlbiBkdW1wCi0JICAgICB0aGUgY3VycmVudCBidWZmZXIgY29udGVudHMgbm93LiAgKi8KLQkgIGlmIChwIC0gdG1wX3NwYWNlICsgNSArIGxlbmd0aCA+IFNPTV9UTVBfQlVGU0laRSkKLQkgICAgewotCSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICZ0bXBfc3BhY2VbMF0sIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpCi0JCSAgIT0gcCAtIHRtcF9zcGFjZSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIC8qIFJlc2V0IHRvIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIHNwYWNlLiAgKi8KLQkgICAgICBwID0gdG1wX3NwYWNlOwotCSAgICB9Ci0KLQkgIC8qIEZpcnN0IGVsZW1lbnQgaW4gYSBzdHJpbmcgdGFibGUgZW50cnkgaXMgdGhlIGxlbmd0aCBvZgotCSAgICAgdGhlIHN0cmluZy4gIFRoaXMgbXVzdCBhbHdheXMgYmUgNCBieXRlIGFsaWduZWQuICBUaGlzIGlzCi0JICAgICBhbHNvIGFuIGFwcHJvcHJpYXRlIHRpbWUgdG8gZmlsbCBpbiB0aGUgc3RyaW5nIGluZGV4Ci0JICAgICBmaWVsZCBpbiB0aGUgc3ltYm9sIHRhYmxlIGVudHJ5LiAgKi8KLQkgIGJmZF9wdXRfMzIgKGFiZmQsIGxlbmd0aCwgcCk7Ci0JICBzdHJpbmdzX3NpemUgKz0gNDsKLQkgIHAgKz0gNDsKLQotCSAgLyogTmV4dCBjb21lcyB0aGUgc3RyaW5nIGl0c2VsZiArIGEgbnVsbCB0ZXJtaW5hdG9yLiAgKi8KLQkgIHN0cmNweSAocCwgY29tcFtpXSk7Ci0KLQkgIHN3aXRjaCAoaSkKLQkgICAgewotCSAgICBjYXNlIDA6CQotCSAgICAgIG9ial9zb21fY29tcGlsYXRpb25fdW5pdCAoYWJmZCktPm5hbWUubl9zdHJ4ID0gc3RyaW5nc19zaXplOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE6Ci0JICAgICAgb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKS0+bGFuZ3VhZ2VfbmFtZS5uX3N0cnggPSAKLQkJc3RyaW5nc19zaXplOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDI6Ci0JICAgICAgb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKS0+cHJvZHVjdF9pZC5uX3N0cnggPSAKLQkJc3RyaW5nc19zaXplOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDM6Ci0JICAgICAgb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKS0+dmVyc2lvbl9pZC5uX3N0cnggPSAKLQkJc3RyaW5nc19zaXplOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIHAgKz0gbGVuZ3RoICsgMTsKLQkgIHN0cmluZ3Nfc2l6ZSArPSBsZW5ndGggKyAxOwotCi0JICAvKiBBbHdheXMgYWxpZ24gdXAgdG8gdGhlIG5leHQgd29yZCBib3VuZGFyeS4gICovCi0JICB3aGlsZSAoc3RyaW5nc19zaXplICUgNCkKLQkgICAgewotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgMCwgcCk7Ci0JICAgICAgc3RyaW5nc19zaXplKys7Ci0JICAgICAgcCsrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bXM7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgbGVuZ3RoID0gc3RybGVuIChzeW1zW2ldLT5uYW1lKTsKLQotICAgICAgLyogSWYgdGhlcmUgaXMgbm90IGVub3VnaCByb29tIGZvciB0aGUgbmV4dCBlbnRyeSwgdGhlbiBkdW1wIHRoZQotCSBjdXJyZW50IGJ1ZmZlciBjb250ZW50cyBub3cuICAqLwotICAgICBpZiAocCAtIHRtcF9zcGFjZSArIDUgKyBsZW5ndGggPiBTT01fVE1QX0JVRlNJWkUpCi0JewotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRtcF9zcGFjZVswXSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkKLQkgICAgICAhPSBwIC0gdG1wX3NwYWNlKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBSZXNldCB0byBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBzcGFjZS4gICovCi0JICBwID0gdG1wX3NwYWNlOwotCX0KLQotICAgICAgLyogRmlyc3QgZWxlbWVudCBpbiBhIHN0cmluZyB0YWJsZSBlbnRyeSBpcyB0aGUgbGVuZ3RoIG9mIHRoZQotCSBzdHJpbmcuICBUaGlzIG11c3QgYWx3YXlzIGJlIDQgYnl0ZSBhbGlnbmVkLiAgVGhpcyBpcyBhbHNvCi0JIGFuIGFwcHJvcHJpYXRlIHRpbWUgdG8gZmlsbCBpbiB0aGUgc3RyaW5nIGluZGV4IGZpZWxkIGluIHRoZQotCSBzeW1ib2wgdGFibGUgZW50cnkuICAqLwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgbGVuZ3RoLCBwKTsKLSAgICAgIHN0cmluZ3Nfc2l6ZSArPSA0OwotICAgICAgcCArPSA0OwotCi0gICAgICAvKiBOZXh0IGNvbWVzIHRoZSBzdHJpbmcgaXRzZWxmICsgYSBudWxsIHRlcm1pbmF0b3IuICAqLwotICAgICAgc3RyY3B5IChwLCBzeW1zW2ldLT5uYW1lKTsKLQotICAgICAgc29tX3N5bWJvbF9kYXRhKHN5bXNbaV0pLT5zdHJpbmd0YWJfb2Zmc2V0ID0gc3RyaW5nc19zaXplOwotICAgICAgcCArPSBsZW5ndGggKyAxOwotICAgICAgc3RyaW5nc19zaXplICs9IGxlbmd0aCArIDE7Ci0KLSAgICAgIC8qIEFsd2F5cyBhbGlnbiB1cCB0byB0aGUgbmV4dCB3b3JkIGJvdW5kYXJ5LiAgKi8KLSAgICAgIHdoaWxlIChzdHJpbmdzX3NpemUgJSA0KQotICAgICAgICB7Ci0JICBiZmRfcHV0XzggKGFiZmQsIDAsIHApOwotCSAgc3RyaW5nc19zaXplKys7Ci0JICBwKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgLyogU2NyaWJibGUgb3V0IGFueSBwYXJ0aWFsIGJsb2NrLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRtcF9zcGFjZVswXSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkgIT0gcCAtIHRtcF9zcGFjZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKnN0cmluZ19zaXplcCA9IHN0cmluZ3Nfc2l6ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvbXB1dGUgdmFyaWFibGUgaW5mb3JtYXRpb24gdG8gYmUgcGxhY2VkIGluIHRoZSBTT00gaGVhZGVycywgCi0gICBzcGFjZS9zdWJzcGFjZSBkaWN0aW9uYXJpZXMsIHJlbG9jYXRpb24gc3RyZWFtcywgZXRjLiAgQmVnaW4KLSAgIHdyaXRpbmcgcGFydHMgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi1zb21fYmVnaW5fd3JpdGluZyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0ID0gMDsKLSAgaW50IHN0cmluZ3Nfc2l6ZSA9IDA7Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9yZWxvY19zaXplID0gMDsKLSAgdW5zaWduZWQgbG9uZyBudW1fc3BhY2VzLCBudW1fc3Vic3BhY2VzLCBpOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgdW5zaWduZWQgaW50IHRvdGFsX3N1YnNwYWNlcyA9IDA7Ci0gIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKmV4ZWNfaGVhZGVyID0gTlVMTDsKLQotICAvKiBUaGUgZmlsZSBoZWFkZXIgd2lsbCBhbHdheXMgYmUgZmlyc3QgaW4gYW4gb2JqZWN0IGZpbGUsIAotICAgICBldmVyeXRoaW5nIGVsc2UgY2FuIGJlIGluIHJhbmRvbSBsb2NhdGlvbnMuICBUbyBrZWVwIHRoaW5ncwotICAgICAic2ltcGxlIiBCRkQgd2lsbCBsYXkgb3V0IHRoZSBvYmplY3QgZmlsZSBpbiB0aGUgbWFubmVyIHN1Z2dlc3RlZAotICAgICBieSB0aGUgUFJPIEFCSSBmb3IgUEEtUklTQyBTeXN0ZW1zLiAgKi8KLQotICAvKiBCZWZvcmUgYW55IG91dHB1dCBjYW4gcmVhbGx5IGJlZ2luIG9mZnNldHMgZm9yIGFsbCB0aGUgbWFqb3IKLSAgICAgcG9ydGlvbnMgb2YgdGhlIG9iamVjdCBmaWxlIG11c3QgYmUgY29tcHV0ZWQuICBTbywgc3RhcnRpbmcKLSAgICAgd2l0aCB0aGUgaW5pdGlhbCBmaWxlIGhlYWRlciBjb21wdXRlIChhbmQgc29tZXRpbWVzIHdyaXRlKQotICAgICBlYWNoIHBvcnRpb24gb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLQotICAvKiBNYWtlIHJvb20gZm9yIHRoZSBmaWxlIGhlYWRlciwgaXQncyBjb250ZW50cyBhcmUgbm90IGNvbXBsZXRlCi0gICAgIHlldCwgc28gaXQgY2FuIG5vdCBiZSB3cml0dGVuIGF0IHRoaXMgdGltZS4gICovCi0gIGN1cnJlbnRfb2Zmc2V0ICs9IHNpemVvZiAoc3RydWN0IGhlYWRlcik7ICAKLQotICAvKiBBbnkgYXV4aWxpYXJ5IGhlYWRlcnMgd2lsbCBmb2xsb3cgdGhlIGZpbGUgaGVhZGVyLiAgUmlnaHQgbm93Ci0gICAgIHdlIHN1cHBvcnQgb25seSB0aGUgY29weXJpZ2h0IGFuZCB2ZXJzaW9uIGhlYWRlcnMuICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9zaXplID0gMDsKLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIHsKLSAgICAgIC8qIFBhcnRzIG9mIHRoZSBleGVjIGhlYWRlciB3aWxsIGJlIGZpbGxlZCBpbiBsYXRlciwgc28KLQkgZGVsYXkgd3JpdGluZyB0aGUgaGVhZGVyIGl0c2VsZi4gIEZpbGwgaW4gdGhlIGRlZmF1bHRzLAotCSBhbmQgd3JpdGUgaXQgbGF0ZXIuICAqLwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gc2l6ZW9mIChzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyKTsKLSAgICAgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUKLQkrPSBzaXplb2YgKHN0cnVjdCBzb21fZXhlY19hdXhoZHIpOwotICAgICAgZXhlY19oZWFkZXIgPSBvYmpfc29tX2V4ZWNfaGRyIChhYmZkKTsKLSAgICAgIGV4ZWNfaGVhZGVyLT5zb21fYXV4aGRyLnR5cGUgPSBFWEVDX0FVWF9JRDsKLSAgICAgIGV4ZWNfaGVhZGVyLT5zb21fYXV4aGRyLmxlbmd0aCA9IDQwOwotICAgIH0KLSAgaWYgKG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGxlbjsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBjdXJyZW50X29mZnNldCwgU0VFS19TRVQpIDwgMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFdyaXRlIHRoZSBhdXhfaWQgc3RydWN0dXJlIGFuZCB0aGUgc3RyaW5nIGxlbmd0aC4gICovCi0gICAgICBsZW4gPSBzaXplb2YgKHN0cnVjdCBhdXhfaWQpICsgc2l6ZW9mICh1bnNpZ25lZCBpbnQpOwotICAgICAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmF1eF9oZWFkZXJfc2l6ZSArPSBsZW47Ci0gICAgICBjdXJyZW50X29mZnNldCArPSBsZW47Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBXcml0ZSB0aGUgdmVyc2lvbiBzdHJpbmcuICAqLwotICAgICAgbGVuID0gb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPmhlYWRlcl9pZC5sZW5ndGggLSBzaXplb2YgKGludCk7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9zaXplICs9IGxlbjsKLSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IGxlbjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLT51c2VyX3N0cmluZywKLQkJICAgICBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGxlbjsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBjdXJyZW50X29mZnNldCwgU0VFS19TRVQpIDwgMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFdyaXRlIHRoZSBhdXhfaWQgc3RydWN0dXJlIGFuZCB0aGUgc3RyaW5nIGxlbmd0aC4gICovCi0gICAgICBsZW4gPSBzaXplb2YgKHN0cnVjdCBhdXhfaWQpICsgc2l6ZW9mICh1bnNpZ25lZCBpbnQpOwotICAgICAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmF1eF9oZWFkZXJfc2l6ZSArPSBsZW47Ci0gICAgICBjdXJyZW50X29mZnNldCArPSBsZW47Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFdyaXRlIHRoZSBjb3B5cmlnaHQgc3RyaW5nLiAgKi8KLSAgICAgIGxlbiA9IG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPmhlYWRlcl9pZC5sZW5ndGggLSBzaXplb2YgKGludCk7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9zaXplICs9IGxlbjsKLSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IGxlbjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPmNvcHlyaWdodCwKLQkJICAgICBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIE5leHQgY29tZXMgdGhlIGluaXRpYWxpemF0aW9uIHBvaW50ZXJzOyB3ZSBoYXZlIG5vIGluaXRpYWxpemF0aW9uCi0gICAgIHBvaW50ZXJzLCBzbyBjdXJyZW50IG9mZnNldCBkb2VzIG5vdCBjaGFuZ2UuICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+aW5pdF9hcnJheV9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+aW5pdF9hcnJheV90b3RhbCA9IDA7Ci0KLSAgLyogTmV4dCBhcmUgdGhlIHNwYWNlIHJlY29yZHMuICBUaGVzZSBhcmUgZml4ZWQgbGVuZ3RoIHJlY29yZHMuCi0KLSAgICAgQ291bnQgdGhlIG51bWJlciBvZiBzcGFjZXMgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIHJvb20gaXMgbmVlZGVkCi0gICAgIGluIHRoZSBvYmplY3QgZmlsZSBmb3IgdGhlIHNwYWNlIHJlY29yZHMuCi0KLSAgICAgVGhlIG5hbWVzIG9mIHRoZSBzcGFjZXMgYXJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlIHN0cmluZyB0YWJsZSwKLSAgICAgYW5kIHRoZSBpbmRleCBmb3IgZWFjaCBzcGFjZSBpbnRvIHRoZSBzdHJpbmcgdGFibGUgaXMgY29tcHV0ZWQKLSAgICAgYmVsb3cuICBUaGVyZWZvcmUsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSB0aGUgc3BhY2UgaGVhZGVycwotICAgICBhdCB0aGlzIHRpbWUuICAqLwotICBudW1fc3BhY2VzID0gc29tX2NvdW50X3NwYWNlcyAoYWJmZCk7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zcGFjZV9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2VfdG90YWwgPSBudW1fc3BhY2VzOwotICBjdXJyZW50X29mZnNldCArPSBudW1fc3BhY2VzICogc2l6ZW9mIChzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpOwotCi0gIC8qIE5leHQgYXJlIHRoZSBzdWJzcGFjZSByZWNvcmRzLiAgVGhlc2UgYXJlIGZpeGVkIGxlbmd0aCByZWNvcmRzLgotCi0gICAgIENvdW50IHRoZSBudW1iZXIgb2Ygc3Vic3BhZXMgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIHJvb20gaXMgbmVlZGVkCi0gICAgIGluIHRoZSBvYmplY3QgZmlsZSBmb3IgdGhlIHN1YnNwYWNlIHJlY29yZHMuCi0KLSAgICAgQSB2YXJpZXR5IGlmIGZpZWxkcyBpbiB0aGUgc3Vic3BhY2UgcmVjb3JkIGFyZSBzdGlsbCB1bmtub3duIGF0Ci0gICAgIHRoaXMgdGltZSAoaW5kZXggaW50byBzdHJpbmcgdGFibGUsIGZpeHVwIHN0cmVhbSBsb2NhdGlvbi9zaXplLCBldGMpLiAgKi8KLSAgbnVtX3N1YnNwYWNlcyA9IHNvbV9jb3VudF9zdWJzcGFjZXMgKGFiZmQpOwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3Vic3BhY2VfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN1YnNwYWNlX3RvdGFsID0gbnVtX3N1YnNwYWNlczsKLSAgY3VycmVudF9vZmZzZXQgKz0gbnVtX3N1YnNwYWNlcyAqIHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKTsKLQotICAvKiBOZXh0IGlzIHRoZSBzdHJpbmcgdGFibGUgZm9yIHRoZSBzcGFjZS9zdWJzcGFjZSBuYW1lcy4gIFdlIHdpbGwKLSAgICAgYnVpbGQgYW5kIHdyaXRlIHRoZSBzdHJpbmcgdGFibGUgb24gdGhlIGZseS4gIEF0IHRoZSBzYW1lIHRpbWUKLSAgICAgd2Ugd2lsbCBmaWxsIGluIHRoZSBzcGFjZS9zdWJzcGFjZSBuYW1lIGluZGV4IGZpZWxkcy4gICovCi0KLSAgLyogVGhlIHN0cmluZyB0YWJsZSBuZWVkcyB0byBiZSBhbGlnbmVkIG9uIGEgd29yZCBib3VuZGFyeS4gICovCi0gIGlmIChjdXJyZW50X29mZnNldCAlIDQpCi0gICAgY3VycmVudF9vZmZzZXQgKz0gKDQgLSAoY3VycmVudF9vZmZzZXQgJSA0KSk7Ci0KLSAgLyogTWFyayB0aGUgb2Zmc2V0IG9mIHRoZSBzcGFjZS9zdWJzcGFjZSBzdHJpbmcgdGFibGUgaW4gdGhlIAotICAgICBmaWxlIGhlYWRlci4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zcGFjZV9zdHJpbmdzX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0KLSAgLyogU2NyaWJibGUgb3V0IHRoZSBzcGFjZSBzdHJpbmdzLiAgKi8KLSAgaWYgKHNvbV93cml0ZV9zcGFjZV9zdHJpbmdzIChhYmZkLCBjdXJyZW50X29mZnNldCwgJnN0cmluZ3Nfc2l6ZSkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFJlY29yZCB0b3RhbCBzdHJpbmcgdGFibGUgc2l6ZSBpbiB0aGUgaGVhZGVyIGFuZCB1cGRhdGUgdGhlCi0gICAgIGN1cnJlbnQgb2Zmc2V0LiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNwYWNlX3N0cmluZ3Nfc2l6ZSA9IHN0cmluZ3Nfc2l6ZTsKLSAgY3VycmVudF9vZmZzZXQgKz0gc3RyaW5nc19zaXplOwotCi0gIC8qIE5leHQgaXMgdGhlIGNvbXBpbGF0aW9uIHVuaXQuICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5jb21waWxlcl9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Y29tcGlsZXJfdG90YWwgPSAwOwotICBpZiAob2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKSkgCi0gICAgewotICAgICAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmNvbXBpbGVyX3RvdGFsID0gMTsKLSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IENPTVBVTklUU1o7IAotICAgIH0KLQotICAvKiBOb3cgY29tcHV0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIHRoZSBsb2FkYWJsZSBzdWJzcGFjZXMsIHRha2luZwotICAgICBjYXJlIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIHN0YXlzIHByb3Blcmx5IGFsaWduZWQuICAqLwotCi0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9zcGFjZXM7IGkrKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3Vic2VjdGlvbjsKLSAgICAgIGludCBmaXJzdF9zdWJzcGFjZTsKLSAgICAgIHVuc2lnbmVkIGludCBzdWJzcGFjZV9vZmZzZXQgPSAwOwotCi0gICAgICAvKiBGaW5kIGEgc3BhY2UuICAqLwotICAgICAgd2hpbGUgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pKQotCXNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OwotCi0gICAgICBmaXJzdF9zdWJzcGFjZSA9IDE7Ci0gICAgICAvKiBOb3cgbG9vayBmb3IgYWxsIGl0cyBzdWJzcGFjZXMuICAqLwotICAgICAgZm9yIChzdWJzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0JICAgc3Vic2VjdGlvbiAhPSBOVUxMOwotCSAgIHN1YnNlY3Rpb24gPSBzdWJzZWN0aW9uLT5uZXh0KQotCXsKLQotCSAgaWYgKCFzb21faXNfc3Vic3BhY2UgKHN1YnNlY3Rpb24pCi0JICAgICAgfHwgIXNvbV9pc19jb250YWluZXIgKHNlY3Rpb24sIHN1YnNlY3Rpb24pCi0JICAgICAgfHwgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc3Vic3BhY2UgaW4gdGhlIHNwYWNlLCBhbmQgd2UgYXJlCi0JICAgICBidWlsZGluZyBhbiBleGVjdXRhYmxlLCB0aGVuIHRha2UgY2FyZSB0byBtYWtlIHN1cmUgYWxsCi0JICAgICB0aGUgYWxpZ25tZW50cyBhcmUgY29ycmVjdCBhbmQgdXBkYXRlIHRoZSBleGVjIGhlYWRlci4gICovCi0JICBpZiAoZmlyc3Rfc3Vic3BhY2UKLQkgICAgICAmJiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpKQotCSAgICB7Ci0JICAgICAgLyogRGVtYW5kIHBhZ2VkIGV4ZWN1dGFibGVzIGhhdmUgZWFjaCBzcGFjZSBhbGlnbmVkIHRvIGEKLQkJIHBhZ2UgYm91bmRhcnkuICBTaGFyYWJsZSBleGVjdXRhYmxlcyAod3JpdGUtcHJvdGVjdGVkCi0JCSB0ZXh0KSBoYXZlIGp1c3QgdGhlIHByaXZhdGUgKGFrYSBkYXRhICYgYnNzKSBzcGFjZSBhbGlnbmVkCi0JCSB0byBhIHBhZ2UgYm91bmRhcnkuICBVZ2guICBOb3QgdHJ1ZSBmb3IgSFBVWC4KLQotCQkgVGhlIEhQVVgga2VybmVsIHJlcXVpcmVzIHRoZSB0ZXh0IHRvIGFsd2F5cyBiZSBwYWdlIGFsaWduZWQKLQkJIHdpdGhpbiB0aGUgZmlsZSByZWdhcmRsZXNzIG9mIHRoZSBleGVjdXRhYmxlJ3MgdHlwZS4gICovCi0JICAgICAgaWYgKGFiZmQtPmZsYWdzICYgKERfUEFHRUQgfCBEWU5BTUlDKQotCQkgIHx8IChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKQotCQkgIHx8ICgoYWJmZC0+ZmxhZ3MgJiBXUF9URVhUKQotCQkgICAgICAmJiAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREFUQSkpKQotCQljdXJyZW50X29mZnNldCA9IFNPTV9BTElHTiAoY3VycmVudF9vZmZzZXQsIFBBX1BBR0VTSVpFKTsKLQotCSAgICAgIC8qIFVwZGF0ZSB0aGUgZXhlYyBoZWFkZXIuICAqLwotCSAgICAgIGlmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFICYmIGV4ZWNfaGVhZGVyLT5leGVjX3RmaWxlID09IDApCi0JCXsKLQkJICBleGVjX2hlYWRlci0+ZXhlY190bWVtID0gc2VjdGlvbi0+dm1hOwotCQkgIGV4ZWNfaGVhZGVyLT5leGVjX3RmaWxlID0gY3VycmVudF9vZmZzZXQ7Ci0JCX0KLQkgICAgICBpZiAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREFUQSAmJiBleGVjX2hlYWRlci0+ZXhlY19kZmlsZSA9PSAwKQotCQl7Ci0JCSAgZXhlY19oZWFkZXItPmV4ZWNfZG1lbSA9IHNlY3Rpb24tPnZtYTsKLQkJICBleGVjX2hlYWRlci0+ZXhlY19kZmlsZSA9IGN1cnJlbnRfb2Zmc2V0OwotCQl9Ci0KLQkgICAgICAvKiBLZWVwIHRyYWNrIG9mIGV4YWN0bHkgd2hlcmUgd2UgYXJlIHdpdGhpbiBhIHBhcnRpY3VsYXIKLQkJIHNwYWNlLiAgVGhpcyBpcyBuZWNlc3NhcnkgYXMgdGhlIGJyYWluZGFtYWdlZCBIUFVYCi0JCSBsb2FkZXIgd2lsbCBjcmVhdGUgaG9sZXMgYmV0d2VlbiBzdWJzcGFjZXMgKmFuZCogCi0JCSBzdWJzcGFjZSBhbGlnbm1lbnRzIGFyZSAqTk9UKiBwcmVzZXJ2ZWQuICBXaGF0IGEgY3JvY2suICAqLwotCSAgICAgIHN1YnNwYWNlX29mZnNldCA9IHN1YnNlY3Rpb24tPnZtYTsKLQotCSAgICAgIC8qIE9ubHkgZG8gdGhpcyBmb3IgdGhlIGZpcnN0IHN1YnNwYWNlIHdpdGhpbiBlYWNoIHNwYWNlLiAgKi8KLQkgICAgICBmaXJzdF9zdWJzcGFjZSA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotCSAgICB7Ci0JICAgICAgLyogVGhlIGJyYWluZGFtYWdlZCBIUFVYIGxvYWRlciBtYXkgaGF2ZSBjcmVhdGVkIGEgaG9sZQotCQkgYmV0d2VlbiB0d28gc3Vic3BhY2VzLiAgSXQgaXMgKm5vdCogc3VmZmljaWVudCB0byB1c2UKLQkJIHRoZSBhbGlnbm1lbnQgc3BlY2lmaWNhdGlvbnMgd2l0aGluIHRoZSBzdWJzcGFjZXMgdG8KLQkJIGFjY291bnQgZm9yIHRoZXNlIGhvbGVzIC0tIEkndmUgcnVuIGludG8gYXQgbGVhc3Qgb25lCi0JCSBjYXNlIHdoZXJlIHRoZSBsb2FkZXIgbGVmdCBvbmUgY29kZSBzdWJzcGFjZSB1bmFsaWduZWQKLQkJIGluIGEgZmluYWwgZXhlY3V0YWJsZS4KLQotCQkgVG8gY29tYmF0IHRoaXMgd2Uga2VlcCBhIGN1cnJlbnQgb2Zmc2V0IHdpdGhpbiBlYWNoIHNwYWNlLAotCQkgYW5kIHVzZSB0aGUgc3Vic3BhY2Ugdm1hIGZpZWxkcyB0byBkZXRlY3QgYW5kIHByZXNlcnZlCi0JCSBob2xlcy4gIFdoYXQgYSBjcm9jayEKLQotCQkgcHMuICBUaGlzIGlzIG5vdCBuZWNlc3NhcnkgZm9yIHVubG9hZGFibGUgc3BhY2Uvc3Vic3BhY2VzLiAgKi8KLQkgICAgICBjdXJyZW50X29mZnNldCArPSBzdWJzZWN0aW9uLT52bWEgLSBzdWJzcGFjZV9vZmZzZXQ7Ci0JICAgICAgaWYgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpCi0JCWV4ZWNfaGVhZGVyLT5leGVjX3RzaXplICs9IHN1YnNlY3Rpb24tPnZtYSAtIHN1YnNwYWNlX29mZnNldDsKLQkgICAgICBlbHNlCi0JCWV4ZWNfaGVhZGVyLT5leGVjX2RzaXplICs9IHN1YnNlY3Rpb24tPnZtYSAtIHN1YnNwYWNlX29mZnNldDsKLQkgICAgICBzdWJzcGFjZV9vZmZzZXQgKz0gc3Vic2VjdGlvbi0+dm1hIC0gc3Vic3BhY2Vfb2Zmc2V0OwotCSAgICB9Ci0KLQotCSAgc3Vic2VjdGlvbi0+dGFyZ2V0X2luZGV4ID0gdG90YWxfc3Vic3BhY2VzKys7Ci0JICAvKiBUaGlzIGlzIHJlYWwgZGF0YSB0byBiZSBsb2FkZWQgZnJvbSB0aGUgZmlsZS4gICovCi0JICBpZiAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkKLQkgICAgewotCSAgICAgIC8qIFVwZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgY29kZSAmIGRhdGEuICAqLwotCSAgICAgIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKQotCQkgICYmIHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpCi0JCWV4ZWNfaGVhZGVyLT5leGVjX3RzaXplICs9IHN1YnNlY3Rpb24tPl9jb29rZWRfc2l6ZTsKLQkgICAgICBlbHNlIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKQotCQkgICAgICAgJiYgc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREFUQSkKLQkJZXhlY19oZWFkZXItPmV4ZWNfZHNpemUgKz0gc3Vic2VjdGlvbi0+X2Nvb2tlZF9zaXplOwotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5maWxlX2xvY19pbml0X3ZhbHVlCi0JCT0gY3VycmVudF9vZmZzZXQ7Ci0JICAgICAgc3Vic2VjdGlvbi0+ZmlsZXBvcyA9IGN1cnJlbnRfb2Zmc2V0OwotCSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN1YnNlY3Rpb24pOyAKLQkgICAgICBzdWJzcGFjZV9vZmZzZXQgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Vic2VjdGlvbik7Ci0JICAgIH0KLQkgIC8qIExvb2tzIGxpa2UgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFVwZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgYnNzIHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkKLQkJZXhlY19oZWFkZXItPmV4ZWNfYnNpemUgKz0gc3Vic2VjdGlvbi0+X2Nvb2tlZF9zaXplOwotCi0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpbGVfbG9jX2luaXRfdmFsdWUKLQkJPSAwOwotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT4KLQkJaW5pdGlhbGl6YXRpb25fbGVuZ3RoID0gMDsKLQkgICAgfQotCX0KLSAgICAgIC8qIEdvdG8gdGhlIG5leHQgc2VjdGlvbi4gICovCi0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsgCi0gICAgfQotCi0gIC8qIEZpbmFsbHkgY29tcHV0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIHVubG9hZGFibGUgc3Vic3BhY2VzLgotICAgICBJZiBidWlsZGluZyBhbiBleGVjdXRhYmxlLCBzdGFydCB0aGUgdW5sb2FkYWJsZSBzdHVmZiBvbiBpdHMKLSAgICAgb3duIHBhZ2UuICAqLwotCi0gIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkKLSAgICBjdXJyZW50X29mZnNldCA9IFNPTV9BTElHTiAoY3VycmVudF9vZmZzZXQsIFBBX1BBR0VTSVpFKTsKLQotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+dW5sb2FkYWJsZV9zcF9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OwotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkKLQljdXJyZW50X29mZnNldCA9IFNPTV9BTElHTiAoY3VycmVudF9vZmZzZXQsIFBBX1BBR0VTSVpFKTsKLQotICAgICAgLyogTm93IGxvb2sgZm9yIGFsbCBpdHMgc3Vic3BhY2VzLiAgKi8KLSAgICAgIGZvciAoc3Vic2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotCSAgIHN1YnNlY3Rpb24gIT0gTlVMTDsKLQkgICBzdWJzZWN0aW9uID0gc3Vic2VjdGlvbi0+bmV4dCkKLQl7Ci0JICAKLQkgIGlmICghc29tX2lzX3N1YnNwYWNlIChzdWJzZWN0aW9uKQotCSAgICAgIHx8ICFzb21faXNfY29udGFpbmVyIChzZWN0aW9uLCBzdWJzZWN0aW9uKQotCSAgICAgIHx8IChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIHN1YnNlY3Rpb24tPnRhcmdldF9pbmRleCA9IHRvdGFsX3N1YnNwYWNlcysrOwotCSAgLyogVGhpcyBpcyByZWFsIGRhdGEgdG8gYmUgbG9hZGVkIGZyb20gdGhlIGZpbGUuICAqLwotCSAgaWYgKChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwKQotCSAgICB7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpbGVfbG9jX2luaXRfdmFsdWUKLQkJPSBjdXJyZW50X29mZnNldDsKLQkgICAgICBzdWJzZWN0aW9uLT5maWxlcG9zID0gY3VycmVudF9vZmZzZXQ7Ci0JICAgICAgY3VycmVudF9vZmZzZXQgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Vic2VjdGlvbik7IAotCSAgICB9Ci0JICAvKiBMb29rcyBsaWtlIHVuaW5pdGlhbGl6ZWQgZGF0YS4gICovCi0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZmlsZV9sb2NfaW5pdF92YWx1ZQotCQk9IDA7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPgotCQlpbml0aWFsaXphdGlvbl9sZW5ndGggPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKTsKLQkgICAgfQotCX0KLSAgICAgIC8qIEdvdG8gdGhlIG5leHQgc2VjdGlvbi4gICovCi0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsgCi0gICAgfQotCi0gIC8qIElmIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUsIHRoZW4gbWFrZSBzdXJlIHRvIHNlZWsgdG8gYW5kIHdyaXRlCi0gICAgIG9uZSBieXRlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgdG8gbWFrZSBzdXJlIGFueSBuZWNlc3NhcnkKLSAgICAgemVyb3MgYXJlIGZpbGxlZCBpbi4gIFVnaC4gICovCi0gIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkKLSAgICBjdXJyZW50X29mZnNldCA9IFNPTV9BTElHTiAoY3VycmVudF9vZmZzZXQsIFBBX1BBR0VTSVpFKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBjdXJyZW50X29mZnNldCAtIDEsIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAiIiwgMSwgMSwgYWJmZCkgIT0gMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnVubG9hZGFibGVfc3Bfc2l6ZQotICAgID0gY3VycmVudF9vZmZzZXQgLSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+dW5sb2FkYWJsZV9zcF9sb2NhdGlvbjsKLQotICAvKiBMb2FkZXIgZml4dXBzIGFyZSBub3Qgc3VwcG9ydGVkIGluIGFueSB3YXkgc2hhcGUgb3IgZm9ybS4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5sb2FkZXJfZml4dXBfbG9jYXRpb24gPSAwOwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+bG9hZGVyX2ZpeHVwX3RvdGFsID0gMDsKLQotICAvKiBEb25lLiAgU3RvcmUgdGhlIHRvdGFsIHNpemUgb2YgdGhlIFNPTSBzbyBmYXIuICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c29tX2xlbmd0aCA9IGN1cnJlbnRfb2Zmc2V0OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5hbGx5LCBzY3JpYmJsZSBvdXQgdGhlIHZhcmlvdXMgaGVhZGVycyB0byB0aGUgZGlzay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fZmluaXNoX3dyaXRpbmcgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IG51bV9zcGFjZXMgPSBzb21fY291bnRfc3BhY2VzIChhYmZkKTsKLSAgYXN5bWJvbCAqKnN5bXMgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOwotICBpbnQgaSwgbnVtX3N5bXMsIHN0cmluZ3Nfc2l6ZTsKLSAgaW50IHN1YnNwYWNlX2luZGV4ID0gMDsKLSAgZmlsZV9wdHIgbG9jYXRpb247Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgdG90YWxfcmVsb2Nfc2l6ZTsKLQotICAvKiBOZXh0IGlzIHRoZSBzeW1ib2wgdGFibGUuICBUaGVzZSBhcmUgZml4ZWQgbGVuZ3RoIHJlY29yZHMuCi0KLSAgICAgQ291bnQgdGhlIG51bWJlciBvZiBzeW1ib2xzIHRvIGRldGVybWluZSBob3cgbXVjaCByb29tIGlzIG5lZWRlZAotICAgICBpbiB0aGUgb2JqZWN0IGZpbGUgZm9yIHRoZSBzeW1ib2wgdGFibGUuCi0KLSAgICAgVGhlIG5hbWVzIG9mIHRoZSBzeW1ib2xzIGFyZSBzdG9yZWQgaW4gYSBzZXBhcmF0ZSBzdHJpbmcgdGFibGUsCi0gICAgIGFuZCB0aGUgaW5kZXggZm9yIGVhY2ggc3ltYm9sIG5hbWUgaW50byB0aGUgc3RyaW5nIHRhYmxlIGlzIGNvbXB1dGVkCi0gICAgIGJlbG93LiAgVGhlcmVmb3JlLCBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgdGhlIHN5bWJvbCB0YWJsZQotICAgICBhdCB0aGlzIHRpbWUuIAotCi0gICAgIFRoZXNlIHVzZWQgdG8gYmUgb3V0cHV0IGJlZm9yZSB0aGUgc3Vic3BhY2UgY29udGVudHMsIGJ1dCB0aGV5Ci0gICAgIHdlcmUgbW92ZWQgaGVyZSB0byB3b3JrIGFyb3VuZCBhIHN0dXBpZCBidWcgaW4gdGhlIGhwdXggbGlua2VyCi0gICAgIChmaXhlZCBpbiBocHV4MTApLiAgKi8KLSAgY3VycmVudF9vZmZzZXQgPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c29tX2xlbmd0aDsKLQotICAvKiBNYWtlIHN1cmUgd2UncmUgb24gYSB3b3JkIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKGN1cnJlbnRfb2Zmc2V0ICUgNCkKLSAgICBjdXJyZW50X29mZnNldCArPSAoNCAtIChjdXJyZW50X29mZnNldCAlIDQpKTsgCi0KLSAgbnVtX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN5bWJvbF9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3ltYm9sX3RvdGFsID0gbnVtX3N5bXM7Ci0gIGN1cnJlbnRfb2Zmc2V0ICs9IG51bV9zeW1zICogc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkKTsKLQotICAvKiBOZXh0IGFyZSB0aGUgc3ltYm9sIHN0cmluZ3MuCi0gICAgIEFsaWduIHRoZW0gdG8gYSB3b3JkIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKGN1cnJlbnRfb2Zmc2V0ICUgNCkKLSAgICBjdXJyZW50X29mZnNldCArPSAoNCAtIChjdXJyZW50X29mZnNldCAlIDQpKTsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN5bWJvbF9zdHJpbmdzX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0KLSAgLyogU2NyaWJibGUgb3V0IHRoZSBzeW1ib2wgc3RyaW5ncy4gICovCi0gIGlmIChzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBzeW1zLAotCQkJCW51bV9zeW1zLCAmc3RyaW5nc19zaXplLAotCQkJCW9ial9zb21fY29tcGlsYXRpb25fdW5pdCAoYWJmZCkpCi0gICAgICA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVjb3JkIHRvdGFsIHN0cmluZyB0YWJsZSBzaXplIGluIGhlYWRlciBhbmQgdXBkYXRlIHRoZQotICAgICBjdXJyZW50IG9mZnNldC4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zeW1ib2xfc3RyaW5nc19zaXplID0gc3RyaW5nc19zaXplOwotICBjdXJyZW50X29mZnNldCArPSBzdHJpbmdzX3NpemU7Ci0KLSAgLyogRG8gcHJlcCB3b3JrIGJlZm9yZSBoYW5kbGluZyBmaXh1cHMuICAqLwotICBzb21fcHJlcF9mb3JfZml4dXBzIChhYmZkLAotCQkgICAgICAgYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSwKLQkJICAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKLQotICAvKiBBdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIHRoZSBmaXh1cCBzdHJlYW0gd2hpY2ggc3RhcnRzIG9uIGEKLSAgICAgd29yZCBib3VuZGFyeS4gICovCi0gIGlmIChjdXJyZW50X29mZnNldCAlIDQpCi0gICAgY3VycmVudF9vZmZzZXQgKz0gKDQgLSAoY3VycmVudF9vZmZzZXQgJSA0KSk7IAotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Zml4dXBfcmVxdWVzdF9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OwotCi0gIC8qIFdyaXRlIHRoZSBmaXh1cHMgYW5kIHVwZGF0ZSBmaWVsZHMgaW4gc3Vic3BhY2UgaGVhZGVycyB3aGljaAotICAgICByZWxhdGUgdG8gdGhlIGZpeHVwIHN0cmVhbS4gICovCi0gIGlmIChzb21fd3JpdGVfZml4dXBzIChhYmZkLCBjdXJyZW50X29mZnNldCwgJnRvdGFsX3JlbG9jX3NpemUpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZWNvcmQgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGZpeHVwIHN0cmVhbSBpbiB0aGUgZmlsZSBoZWFkZXIuICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Zml4dXBfcmVxdWVzdF90b3RhbCA9IHRvdGFsX3JlbG9jX3NpemU7Ci0KLSAgLyogRG9uZS4gIFN0b3JlIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBTT00uICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c29tX2xlbmd0aCA9IGN1cnJlbnRfb2Zmc2V0ICsgdG90YWxfcmVsb2Nfc2l6ZTsKLSAKLSAgLyogTm93IHRoYXQgdGhlIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbiBpcyBjb21wbGV0ZSwgYnVpbGQgYW5kCi0gICAgIHdyaXRlIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUgKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTdWJzcGFjZXMgYXJlIHdyaXR0ZW4gZmlyc3Qgc28gdGhhdCB3ZSBjYW4gc2V0IHVwIGluZm9ybWF0aW9uCi0gICAgIGFib3V0IHRoZW0gaW4gdGhlaXIgY29udGFpbmluZyBzcGFjZXMgYXMgdGhlIHN1YnNwYWNlIGlzIHdyaXR0ZW4uICAqLwotCi0gIC8qIFNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdWJzcGFjZSBkaWN0aW9uYXJ5IHJlY29yZHMuICAqLwotICBsb2NhdGlvbiA9IG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zdWJzcGFjZV9sb2NhdGlvbjsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBsb2NhdGlvbiwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotICAvKiBOb3cgZm9yIGVhY2ggbG9hZGFibGUgc3BhY2Ugd3JpdGUgb3V0IHJlY29yZHMgZm9yIGl0cyBzdWJzcGFjZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NwYWNlczsgaSsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzdWJzZWN0aW9uOwotCi0gICAgICAvKiBGaW5kIGEgc3BhY2UuICAqLwotICAgICAgd2hpbGUgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pKQotCXNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OwotCi0gICAgICAvKiBOb3cgbG9vayBmb3IgYWxsIGl0cyBzdWJzcGFjZXMuICAqLwotICAgICAgZm9yIChzdWJzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0JICAgc3Vic2VjdGlvbiAhPSBOVUxMOwotCSAgIHN1YnNlY3Rpb24gPSBzdWJzZWN0aW9uLT5uZXh0KQotCXsKLQkgIAotCSAgLyogU2tpcCBhbnkgc2VjdGlvbiB3aGljaCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgc3BhY2UKLQkgICAgIG9yIHN1YnNwYWNlLiAgT3IgZG9lcyBub3QgaGF2ZSBTRUNfQUxMT0Mgc2V0IChhbmQgdGhlcmVmb3JlCi0JICAgICBoYXMgbm8gcmVhbCBiaXRzIG9uIHRoZSBkaXNrKS4gICovCi0JICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc3Vic2VjdGlvbikKLQkgICAgICB8fCAhc29tX2lzX2NvbnRhaW5lciAoc2VjdGlvbiwgc3Vic2VjdGlvbikKLQkgICAgICB8fCAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzdWJzcGFjZSBmb3IgdGhpcyBzcGFjZSwgdGhlbiBzYXZlCi0JICAgICB0aGUgaW5kZXggb2YgdGhlIHN1YnNwYWNlIGluIGl0cyBjb250YWluaW5nIHNwYWNlLiAgQWxzbwotCSAgICAgc2V0ICJpc19sb2FkYWJsZSIgaW4gdGhlIGNvbnRhaW5pbmcgc3BhY2UuICAqLwotCi0JICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnN1YnNwYWNlX3F1YW50aXR5ID09IDApCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+aXNfbG9hZGFibGUgPSAxOwotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zdWJzcGFjZV9pbmRleAotCQk9IHN1YnNwYWNlX2luZGV4OwotCSAgICB9Ci0KLQkgIC8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHN1YnNwYWNlcyBzZWVuIGFuZCB0aGUgbnVtYmVyIG9mCi0JICAgICBzdWJzcGFjZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgY3VycmVudCBzcGFjZS4gICovCi0JICBzdWJzcGFjZV9pbmRleCsrOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnN1YnNwYWNlX3F1YW50aXR5Kys7Ci0KLQkgIC8qIE1hcmsgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHNwYWNlIHdpdGhpbiB0aGUgc3Vic3BhY2UncwotCSAgICAgZGljdGlvbmFyeSByZWNvcmQuICAqLwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPnNwYWNlX2luZGV4ID0gaTsKLQkgIAotCSAgLyogRHVtcCB0aGUgY3VycmVudCBzdWJzcGFjZSBoZWFkZXIuICAqLwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QsCi0JCQkgc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpLCAxLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIC8qIEdvdG8gdGhlIG5leHQgc2VjdGlvbi4gICovCi0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsgCi0gICAgfQotCi0gIC8qIE5vdyByZXBlYXQgdGhlIHByb2Nlc3MgZm9yIHVubG9hZGFibGUgc3Vic3BhY2VzLiAgKi8KLSAgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotICAvKiBOb3cgZm9yIGVhY2ggc3BhY2Ugd3JpdGUgb3V0IHJlY29yZHMgZm9yIGl0cyBzdWJzcGFjZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NwYWNlczsgaSsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzdWJzZWN0aW9uOwotCi0gICAgICAvKiBGaW5kIGEgc3BhY2UuICAqLwotICAgICAgd2hpbGUgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pKQotCXNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OwotCi0gICAgICAvKiBOb3cgbG9vayBmb3IgYWxsIGl0cyBzdWJzcGFjZXMuICAqLwotICAgICAgZm9yIChzdWJzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0JICAgc3Vic2VjdGlvbiAhPSBOVUxMOwotCSAgIHN1YnNlY3Rpb24gPSBzdWJzZWN0aW9uLT5uZXh0KQotCXsKLQkgIAotCSAgLyogU2tpcCBhbnkgc2VjdGlvbiB3aGljaCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgc3BhY2Ugb3IKLQkgICAgIHN1YnNwYWNlLCBvciB3aGljaCBTRUNfQUxMT0Mgc2V0IChhbmQgdGhlcmVmb3JlIGhhbmRsZWQKLQkgICAgIGluIHRoZSBsb2FkYWJsZSBzcGFjZXMvc3Vic3BhY2VzIGNvZGUgYWJvdmUpLiAgKi8KLQotCSAgaWYgKCFzb21faXNfc3Vic3BhY2UgKHN1YnNlY3Rpb24pCi0JICAgICAgfHwgIXNvbV9pc19jb250YWluZXIgKHNlY3Rpb24sIHN1YnNlY3Rpb24pCi0JICAgICAgfHwgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc3Vic3BhY2UgZm9yIHRoaXMgc3BhY2UsIHRoZW4gc2F2ZQotCSAgICAgdGhlIGluZGV4IG9mIHRoZSBzdWJzcGFjZSBpbiBpdHMgY29udGFpbmluZyBzcGFjZS4gIENsZWFyCi0JICAgICAiaXNfbG9hZGFibGUiLiAgKi8KLQotCSAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zdWJzcGFjZV9xdWFudGl0eSA9PSAwKQotCSAgICB7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPmlzX2xvYWRhYmxlID0gMDsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfaW5kZXgKLQkJPSBzdWJzcGFjZV9pbmRleDsKLQkgICAgfQotCi0JICAvKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBzdWJzcGFjZXMgc2VlbiBhbmQgdGhlIG51bWJlciBvZgotCSAgICAgc3Vic3BhY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGN1cnJlbnQgc3BhY2UuICAqLwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnN1YnNwYWNlX3F1YW50aXR5Kys7Ci0JICBzdWJzcGFjZV9pbmRleCsrOyAKLQotCSAgLyogTWFyayB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgc3BhY2Ugd2l0aGluIHRoZSBzdWJzcGFjZSdzCi0JICAgICBkaWN0aW9uYXJ5IHJlY29yZC4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+c3BhY2VfaW5kZXggPSBpOwotCSAgCi0JICAvKiBEdW1wIHRoaXMgc3Vic3BhY2UgaGVhZGVyLiAgKi8KLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LAotCQkJIHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSwgMSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2YgKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICAvKiBHb3RvIHRoZSBuZXh0IHNlY3Rpb24uICAqLwotICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7IAotICAgIH0KLQotICAvKiBBbGwgdGhlIHN1YnNwYWNlIGRpY3Rpb25kYXJ5IHJlY29yZHMgYXJlIHdyaXR0ZW4sIGFuZCBhbGwgdGhlCi0gICAgIGZpZWxkcyBhcmUgc2V0IHVwIGluIHRoZSBzcGFjZSBkaWN0aW9uYXJ5IHJlY29yZHMuCi0KLSAgICAgU2VlayB0byB0aGUgcmlnaHQgbG9jYXRpb24gYW5kIHN0YXJ0IHdyaXRpbmcgdGhlIHNwYWNlCi0gICAgIGRpY3Rpb25hcnkgcmVjb3Jkcy4gICovCi0gIGxvY2F0aW9uID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNwYWNlX2xvY2F0aW9uOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxvY2F0aW9uLCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotCi0gICAgICAvKiBGaW5kIGEgc3BhY2UuICAqLwotICAgICAgd2hpbGUgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pKQotCXNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OwotCi0gICAgICAvKiBEdW1wIGl0cyBoZWFkZXIgICovCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdCwKLQkJICAgICBzaXplb2YgKHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCksIDEsIGFiZmQpCi0JICAhPSBzaXplb2YgKHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBHb3RvIHRoZSBuZXh0IHNlY3Rpb24uICAqLwotICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0gICAgfQotCi0gIC8qIFdyaXRlIHRoZSBjb21waWxhdGlvbiB1bml0IHJlY29yZCBpZiB0aGVyZSBpcyBvbmUuICAqLwotICBpZiAob2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKSkKLSAgICB7Ci0gICAgICBsb2NhdGlvbiA9IG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5jb21waWxlcl9sb2NhdGlvbjsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgbG9jYXRpb24sIFNFRUtfU0VUKSA8IDApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKSwKLQkJICAgICBDT01QVU5JVFNaLCAxLCBhYmZkKSAhPSBDT01QVU5JVFNaKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFNldHRpbmcgb2YgdGhlIHN5c3RlbV9pZCBoYXMgdG8gaGFwcGVuIHZlcnkgbGF0ZSBub3cgdGhhdCBjb3B5aW5nIG9mCi0gICAgIEJGRCBwcml2YXRlIGRhdGEgaGFwcGVucyAqYWZ0ZXIqIHNlY3Rpb24gY29udGVudHMgYXJlIHNldC4gICovCi0gIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkKLSAgICBvYmpfc29tX2ZpbGVfaGRyKGFiZmQpLT5zeXN0ZW1faWQgPSBvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCktPnN5c3RlbV9pZDsKLSAgZWxzZSBpZiAoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBwYTIwKQotICAgIG9ial9zb21fZmlsZV9oZHIoYWJmZCktPnN5c3RlbV9pZCA9IENQVV9QQV9SSVNDMl8wOwotICBlbHNlIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IHBhMTEpCi0gICAgb2JqX3NvbV9maWxlX2hkcihhYmZkKS0+c3lzdGVtX2lkID0gQ1BVX1BBX1JJU0MxXzE7Ci0gIGVsc2UKLSAgICBvYmpfc29tX2ZpbGVfaGRyKGFiZmQpLT5zeXN0ZW1faWQgPSBDUFVfUEFfUklTQzFfMDsKLQotICAvKiBDb21wdXRlIHRoZSBjaGVja3N1bSBmb3IgdGhlIGZpbGUgaGVhZGVyIGp1c3QgYmVmb3JlIHdyaXRpbmcKLSAgICAgdGhlIGhlYWRlciB0byBkaXNrLiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmNoZWNrc3VtID0gc29tX2NvbXB1dGVfY2hlY2tzdW0gKGFiZmQpOwotCi0gIC8qIE9ubHkgdGhpbmcgbGVmdCB0byBkbyBpcyB3cml0ZSBvdXQgdGhlIGZpbGUgaGVhZGVyLiAgSXQgaXMgYWx3YXlzCi0gICAgIGF0IGxvY2F0aW9uIHplcm8uICBTZWVrIHRoZXJlIGFuZCB3cml0ZSBpdC4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgb2JqX3NvbV9maWxlX2hkciAoYWJmZCksCi0JCSBzaXplb2YgKHN0cnVjdCBoZWFkZXIpLCAxLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgaGVhZGVyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdyaXRlIHRoZSBleGVjIGhlYWRlci4gICovCi0gIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkKLSAgICB7Ci0gICAgICBsb25nIHRtcCwgc29tX2xlbmd0aDsKLSAgICAgIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKmV4ZWNfaGVhZGVyOwotCi0gICAgICBleGVjX2hlYWRlciA9IG9ial9zb21fZXhlY19oZHIgKGFiZmQpOwotICAgICAgZXhlY19oZWFkZXItPmV4ZWNfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICAgICAgZXhlY19oZWFkZXItPmV4ZWNfZmxhZ3MgPSBvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCktPmV4ZWNfZmxhZ3M7Ci0KLSAgICAgIC8qIE9oIGpveXMuICBSYW0gc29tZSBvZiB0aGUgQlNTIGRhdGEgaW50byB0aGUgREFUQSBzZWN0aW9uCi0JIHRvIGJlIGNvbXBhdGFibGUgd2l0aCBob3cgdGhlIGhwIGxpbmtlciBtYWtlcyBvYmplY3RzCi0JIChzYXZlcyBtZW1vcnkgc3BhY2UpLiAgKi8KLSAgICAgIHRtcCA9IGV4ZWNfaGVhZGVyLT5leGVjX2RzaXplOwotICAgICAgdG1wID0gU09NX0FMSUdOICh0bXAsIFBBX1BBR0VTSVpFKTsKLSAgICAgIGV4ZWNfaGVhZGVyLT5leGVjX2JzaXplIC09ICh0bXAgLSBleGVjX2hlYWRlci0+ZXhlY19kc2l6ZSk7Ci0gICAgICBpZiAoZXhlY19oZWFkZXItPmV4ZWNfYnNpemUgPCAwKQotCWV4ZWNfaGVhZGVyLT5leGVjX2JzaXplID0gMDsKLSAgICAgIGV4ZWNfaGVhZGVyLT5leGVjX2RzaXplID0gdG1wOwotCi0gICAgICAvKiBOb3cgcGVyZm9ybSBzb21lIHNhbml0eSBjaGVja3MuICBUaGUgaWRlYSBpcyB0byBjYXRjaCBib2dvbnMgbm93IGFuZAotCSBpbmZvcm0gdGhlIHVzZXIsIGluc3RlYWQgb2Ygc2lsZW50bHkgZ2VuZXJhdGluZyBhIGJvZ3VzIGZpbGUuICAqLwotICAgICAgc29tX2xlbmd0aCA9IG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zb21fbGVuZ3RoOwotICAgICAgaWYgKGV4ZWNfaGVhZGVyLT5leGVjX3RmaWxlICsgZXhlY19oZWFkZXItPmV4ZWNfdHNpemUgPiBzb21fbGVuZ3RoCi0JICB8fCBleGVjX2hlYWRlci0+ZXhlY19kZmlsZSArIGV4ZWNfaGVhZGVyLT5leGVjX2RzaXplID4gc29tX2xlbmd0aCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmF1eF9oZWFkZXJfbG9jYXRpb24sCi0JCSAgICBTRUVLX1NFVCkgPCAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgZXhlY19oZWFkZXIsIEFVWF9IRFJfU0laRSwgMSwgYWJmZCkKLQkgICE9IEFVWF9IRFJfU0laRSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBjaGVja3N1bSBmb3IgYSBTT00gZmlsZSBoZWFkZXIuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotc29tX2NvbXB1dGVfY2hlY2tzdW0gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgbG9uZyBjaGVja3N1bSwgY291bnQsIGk7Ci0gIHVuc2lnbmVkIGxvbmcgKmJ1ZmZlciA9ICh1bnNpZ25lZCBsb25nICopIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpOwotCi0gIGNoZWNrc3VtID0gMDsKLSAgY291bnQgPSBzaXplb2YgKHN0cnVjdCBoZWFkZXIpIC8gc2l6ZW9mICh1bnNpZ25lZCBsb25nKTsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgY2hlY2tzdW0gXj0gKihidWZmZXIgKyBpKTsKLQotICByZXR1cm4gY2hlY2tzdW07Ci19Ci0KLXN0YXRpYyB2b2lkCi1zb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvIChhYmZkLCBzeW0sIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8gKmluZm87Ci17Ci0gIC8qIEluaXRpYWxpemUuICAqLwotICBtZW1zZXQgKGluZm8sIDAsIHNpemVvZiAoc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvKSk7Ci0KLSAgLyogVGhlIEhQIFNPTSBsaW5rZXIgcmVxdWlyZXMgZGV0YWlsZWQgdHlwZSBpbmZvcm1hdGlvbiBhYm91dAotICAgICBhbGwgc3ltYm9scyAoaW5jbHVkaW5nIHVuZGVmaW5lZCBzeW1ib2xzISkuICBVbmZvcnR1bmF0ZWx5LAotICAgICB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gYW4gaW1wb3J0L2V4cG9ydCBzdGF0ZW1lbnQgZG9lcyBub3QKLSAgICAgYWx3YXlzIG1hdGNoIHdoYXQgdGhlIGxpbmtlciB3YW50cy4gIFNldmVyZSBicmFpbmRhbWFnZS4gICovCi0JIAotICAvKiBTZWN0aW9uIHN5bWJvbHMgd2lsbCBub3QgaGF2ZSBhIFNPTSBzeW1ib2wgdHlwZSBhc3NpZ25lZCB0bwotICAgICB0aGVtIHlldC4gIEFzc2lnbiBhbGwgc2VjdGlvbiBzeW1ib2xzIHR5cGUgU1RfREFUQS4gICovCi0gIGlmIChzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotICAgIGluZm8tPnN5bWJvbF90eXBlID0gU1RfREFUQTsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIENvbW1vbiBzeW1ib2xzIG11c3QgaGF2ZSBzY29wZSBTU19VTlNBVCBhbmQgdHlwZQotCSBTVF9TVE9SQUdFIG9yIHRoZSBsaW5rZXIgd2lsbCBjaG9rZS4gICovCi0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCXsKLQkgIGluZm8tPnN5bWJvbF9zY29wZSA9IFNTX1VOU0FUOwotCSAgaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9TVE9SQUdFOwotCX0KLQotICAgICAgLyogSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIHN5bWJvbCB3aXRob3V0IGFuIGFzc29jaWF0ZWQKLQkgdHlwZS4gIFRoaXMgaGFwcGVucyBpZiB0aGUgdXNlciBpbXBvcnRlZCB0aGUgc3ltYm9sCi0JIHdpdGhvdXQgYSB0eXBlIGFuZCB0aGUgc3ltYm9sIHdhcyBuZXZlciBkZWZpbmVkCi0JIGxvY2FsbHkuICBJZiBCU0ZfRlVOQ1RJT04gaXMgc2V0IGZvciB0aGlzIHN5bWJvbCwgdGhlbgotCSBhc3NpZ24gaXQgdHlwZSBTVF9DT0RFICh0aGUgSFAgbGlua2VyIHJlcXVpcmVzIHVuZGVmaW5lZAotCSBleHRlcm5hbCBmdW5jdGlvbnMgdG8gaGF2ZSB0eXBlIFNUX0NPREUgcmF0aGVyIHRoYW4gU1RfRU5UUlkpLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1VOS05PV04KLQkJfHwgc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9DT0RFKQotCSAgICAgICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKLQkgICAgICAgJiYgc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0NPREU7Ci0KLSAgICAgIC8qIEhhbmRsZSBmdW5jdGlvbiBzeW1ib2xzIHdoaWNoIHdlcmUgZGVmaW5lZCBpbiB0aGlzIGZpbGUuCi0JIFRoZXkgc2hvdWxkIGhhdmUgdHlwZSBTVF9FTlRSWS4gIEFsc28gcmV0cmlldmUgdGhlIGFyZ3VtZW50Ci0JIHJlbG9jYXRpb24gYml0cyBmcm9tIHRoZSBTT00gYmFja2VuZCBpbmZvcm1hdGlvbi4gICovCi0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0VOVFJZCi0JICAgICAgIHx8IChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0NPREUKLQkJICAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pKQotCSAgICAgICB8fCAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9VTktOT1dOCi0JCSAgICYmIChzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSkpCi0JewotCSAgaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9FTlRSWTsKLQkgIGluZm8tPmFyZ19yZWxvYyA9IHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYzsKLQkgIGluZm8tPnByaXZfbGV2ZWw9IHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+dGNfZGF0YS5hcC5ocHBhX3ByaXZfbGV2ZWw7Ci0JfQotCi0gICAgICAvKiBGb3IgdW5rbm93biBzeW1ib2xzIHNldCB0aGUgc3ltYm9sJ3MgdHlwZSBiYXNlZCBvbiB0aGUgc3ltYm9sJ3MKLQkgc2VjdGlvbiAoU1RfREFUQSBmb3IgREFUQSBzZWN0aW9ucywgU1RfQ09ERSBmb3IgQ09ERSBzZWN0aW9ucykuICAqLwotICAgICAgZWxzZSBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9VTktOT1dOKQotCXsKLQkgIGlmIChzeW0tPnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpCi0JICAgIGluZm8tPnN5bWJvbF90eXBlID0gU1RfQ09ERTsKLQkgIGVsc2UKLQkgICAgaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9EQVRBOwotCX0KLSAgCi0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1VOS05PV04pCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9EQVRBOwotCi0gICAgICAvKiBGcm9tIG5vdyBvbiBpdCdzIGEgdmVyeSBzaW1wbGUgbWFwcGluZy4gICovCi0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0FCU09MVVRFKQotCWluZm8tPnN5bWJvbF90eXBlID0gU1RfQUJTT0xVVEU7Ci0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0NPREUpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9DT0RFOwotICAgICAgZWxzZSBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9EQVRBKQotCWluZm8tPnN5bWJvbF90eXBlID0gU1RfREFUQTsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfTUlMTElDT0RFKQotCWluZm8tPnN5bWJvbF90eXBlID0gU1RfTUlMTElDT0RFOwotICAgICAgZWxzZSBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9QTEFCRUwpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9QTEFCRUw7Ci0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1BSSV9QUk9HKQotCWluZm8tPnN5bWJvbF90eXBlID0gU1RfUFJJX1BST0c7Ci0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1NFQ19QUk9HKQotCWluZm8tPnN5bWJvbF90eXBlID0gU1RfU0VDX1BST0c7Ci0gICAgfQotCQotICAvKiBOb3cgaGFuZGxlIHRoZSBzeW1ib2wncyBzY29wZS4gIEV4cG9ydGVkIGRhdGEgd2hpY2ggaXMgbm90Ci0gICAgIGluIHRoZSBjb21tb24gc2VjdGlvbiBoYXMgc2NvcGUgU1NfVU5JVkVSU0FMLiAgTm90ZSBzY29wZQotICAgICBvZiBjb21tb24gc3ltYm9scyB3YXMgaGFuZGxlZCBlYXJsaWVyISAgKi8KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLSAgICBpbmZvLT5zeW1ib2xfc2NvcGUgPSBTU19VTlNBVDsKLSAgZWxzZSBpZiAoc3ltLT5mbGFncyAmIEJTRl9FWFBPUlQgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0gICAgaW5mby0+c3ltYm9sX3Njb3BlID0gU1NfVU5JVkVSU0FMOwotICAvKiBBbnl0aGluZyBlbHNlIHdoaWNoIGlzIG5vdCBpbiB0aGUgY29tbW9uIHNlY3Rpb24gaGFzIHNjb3BlCi0gICAgIFNTX0xPQ0FMLiAgKi8KLSAgZWxzZSBpZiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0gICAgaW5mby0+c3ltYm9sX3Njb3BlID0gU1NfTE9DQUw7Ci0KLSAgLyogTm93IHNldCB0aGUgc3ltYm9sX2luZm8gZmllbGQuICBJdCBoYXMgbm8gcmVhbCBtZWFuaW5nCi0gICAgIGZvciB1bmRlZmluZWQgb3IgY29tbW9uIHN5bWJvbHMsIGJ1dCB0aGUgSFAgbGlua2VyIHdpbGwKLSAgICAgY2hva2UgaWYgaXQncyBub3Qgc2V0IHRvIHNvbWUgInJlYXNvbmFibGUiIHZhbHVlLiAgV2UKLSAgICAgdXNlIHplcm8gYXMgYSByZWFzb25hYmxlIHZhbHVlLiAgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKQotICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0gICAgaW5mby0+c3ltYm9sX2luZm8gPSAwOwotICAvKiBGb3IgYWxsIG90aGVyIHN5bWJvbHMsIHRoZSBzeW1ib2xfaW5mbyBmaWVsZCBjb250YWlucyB0aGUgCi0gICAgIHN1YnNwYWNlIGluZGV4IG9mIHRoZSBzcGFjZSB0aGlzIHN5bWJvbCBpcyBjb250YWluZWQgaW4uICAqLwotICBlbHNlCi0gICAgaW5mby0+c3ltYm9sX2luZm8gPSBzeW0tPnNlY3Rpb24tPnRhcmdldF9pbmRleDsKLQotICAvKiBTZXQgdGhlIHN5bWJvbCdzIHZhbHVlLiAgKi8KLSAgaW5mby0+c3ltYm9sX3ZhbHVlID0gc3ltLT52YWx1ZSArIHN5bS0+c2VjdGlvbi0+dm1hOwotfQotCi0vKiBCdWlsZCBhbmQgd3JpdGUsIGluIG9uZSBiaWcgY2h1bmssIHRoZSBlbnRpcmUgc3ltYm9sIHRhYmxlIGZvcgotICAgdGhpcyBCRkQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgaW50IG51bV9zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIGZpbGVfcHRyIHN5bXRhYl9sb2NhdGlvbiA9IG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zeW1ib2xfbG9jYXRpb247Ci0gIGFzeW1ib2wgKipiZmRfc3ltcyA9IG9ial9zb21fc29ydGVkX3N5bXMgKGFiZmQpOwotICBzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkICpzb21fc3ltdGFiID0gTlVMTDsKLSAgaW50IGksIHN5bXRhYl9zaXplOwotCi0gIC8qIENvbXB1dGUgdG90YWwgc3ltYm9sIHRhYmxlIHNpemUgYW5kIGFsbG9jYXRlIGEgY2h1bmsgb2YgbWVtb3J5Ci0gICAgIHRvIGhvbGQgdGhlIHN5bWJvbCB0YWJsZSBhcyB3ZSBidWlsZCBpdC4gICovCi0gIHN5bXRhYl9zaXplID0gbnVtX3N5bXMgKiBzaXplb2YgKHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQpOwotICBzb21fc3ltdGFiID0gKHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQgKikgYmZkX21hbGxvYyAoc3ltdGFiX3NpemUpOwotICBpZiAoc29tX3N5bXRhYiA9PSBOVUxMICYmIHN5bXRhYl9zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIG1lbXNldCAoc29tX3N5bXRhYiwgMCwgc3ltdGFiX3NpemUpOwotCi0gIC8qIFdhbGsgb3ZlciBlYWNoIHN5bWJvbC4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltczsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbyBpbmZvOwotCi0gICAgICAvKiBUaGlzIGlzIHJlYWxseSBhbiBpbmRleCBpbnRvIHRoZSBzeW1ib2wgc3RyaW5ncyB0YWJsZS4gIAotCSBCeSB0aGUgdGltZSB3ZSBnZXQgaGVyZSwgdGhlIGluZGV4IGhhcyBhbHJlYWR5IGJlZW4gCi0JIGNvbXB1dGVkIGFuZCBzdG9yZWQgaW50byB0aGUgbmFtZSBmaWVsZCBpbiB0aGUgQkZEIHN5bWJvbC4gICovCi0gICAgICBzb21fc3ltdGFiW2ldLm5hbWUubl9zdHJ4ID0gc29tX3N5bWJvbF9kYXRhKGJmZF9zeW1zW2ldKS0+c3RyaW5ndGFiX29mZnNldDsKLQotICAgICAgLyogRGVyaXZlIFNPTSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCRkQgc3ltYm9sLiAgKi8KLSAgICAgIHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8gKGFiZmQsIGJmZF9zeW1zW2ldLCAmaW5mbyk7Ci0KLSAgICAgIC8qIE5vdyB1c2UgaXQuICAqLwotICAgICAgc29tX3N5bXRhYltpXS5zeW1ib2xfdHlwZSA9IGluZm8uc3ltYm9sX3R5cGU7Ci0gICAgICBzb21fc3ltdGFiW2ldLnN5bWJvbF9zY29wZSA9IGluZm8uc3ltYm9sX3Njb3BlOwotICAgICAgc29tX3N5bXRhYltpXS5hcmdfcmVsb2MgPSBpbmZvLmFyZ19yZWxvYzsKLSAgICAgIHNvbV9zeW10YWJbaV0uc3ltYm9sX2luZm8gPSBpbmZvLnN5bWJvbF9pbmZvOwotICAgICAgc29tX3N5bXRhYltpXS54bGVhc3QgPSAzOwotICAgICAgc29tX3N5bXRhYltpXS5zeW1ib2xfdmFsdWUgPSBpbmZvLnN5bWJvbF92YWx1ZSB8IGluZm8ucHJpdl9sZXZlbDsKLSAgICB9Ci0KLSAgLyogRXZlcnl0aGluZyBpcyByZWFkeSwgc2VlayB0byB0aGUgcmlnaHQgbG9jYXRpb24gYW5kCi0gICAgIHNjcmliYmxlIG91dCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW10YWJfbG9jYXRpb24sIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzb21fc3ltdGFiLCBzeW10YWJfc2l6ZSwgMSwgYWJmZCkgIT0gc3ltdGFiX3NpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKHNvbV9zeW10YWIgIT0gTlVMTCkKLSAgICBmcmVlIChzb21fc3ltdGFiKTsKLSAgcmV0dXJuIHRydWU7Ci0gZXJyb3JfcmV0dXJuOgotICBpZiAoc29tX3N5bXRhYiAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9zeW10YWIpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFdyaXRlIGFuIG9iamVjdCBpbiBTT00gZm9ybWF0LiAgKi8gIAotCi1zdGF0aWMgYm9vbGVhbgotc29tX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICAvKiBTZXQgdXAgZml4ZWQgcGFydHMgb2YgdGhlIGZpbGUsIHNwYWNlLCBhbmQgc3Vic3BhY2UgaGVhZGVycy4KLQkgTm90aWZ5IHRoZSB3b3JsZCB0aGF0IG91dHB1dCBoYXMgYmVndW4uICAqLwotICAgICAgc29tX3ByZXBfaGVhZGVycyAoYWJmZCk7Ci0gICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICAgIC8qIFN0YXJ0IHdyaXRpbmcgdGhlIG9iamVjdCBmaWxlLiAgVGhpcyBpbmNsdWRlIGFsbCB0aGUgc3RyaW5nCi0JIHRhYmxlcywgZml4dXAgc3RyZWFtcywgYW5kIG90aGVyIHBvcnRpb25zIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0gICAgICBzb21fYmVnaW5fd3JpdGluZyAoYWJmZCk7Ci0gICAgfQotCi0gIHJldHVybiAoc29tX2ZpbmlzaF93cml0aW5nIChhYmZkKSk7Ci19Ci0KLQwKLS8qIFJlYWQgYW5kIHNhdmUgdGhlIHN0cmluZyB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIEJGRC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fc2x1cnBfc3RyaW5nX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKnN0cmluZ3RhYjsKLQotICAvKiBVc2UgdGhlIHNhdmVkIHZlcnNpb24gaWYgaXRzIGF2YWlsYWJsZS4gICovCi0gIGlmIChvYmpfc29tX3N0cmluZ3RhYiAoYWJmZCkgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJIGRvbid0IHRoaW5rIHRoaXMgY2FuIGN1cnJlbnRseSBoYXBwZW4sIGFuZCBJJ20gbm90IHN1cmUgaXQgc2hvdWxkCi0gICAgIHJlYWxseSBiZSBhbiBlcnJvciwgYnV0IGl0J3MgYmV0dGVyIHRoYW4gZ2V0dGluZyB1bnByZWRpY3RhYmxlIHJlc3VsdHMKLSAgICAgZnJvbSB0aGUgaG9zdCdzIG1hbGxvYyB3aGVuIHBhc3NlZCBhIHNpemUgb2YgemVyby4gICovCi0gIGlmIChvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19zeW1ib2xzKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgYW5kIHJlYWQgaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCi0gIHN0cmluZ3RhYiA9IGJmZF9tYWxsb2MgKG9ial9zb21fc3RyaW5ndGFiX3NpemUgKGFiZmQpKTsKLSAgaWYgKHN0cmluZ3RhYiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbWVtc2V0IChzdHJpbmd0YWIsIDAsIG9ial9zb21fc3RyaW5ndGFiX3NpemUgKGFiZmQpKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zb21fc3RyX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIGlmIChiZmRfcmVhZCAoc3RyaW5ndGFiLCBvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSwgMSwgYWJmZCkKLSAgICAgICE9IG9ial9zb21fc3RyaW5ndGFiX3NpemUgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTYXZlIG91ciByZXN1bHRzIGFuZCByZXR1cm4gc3VjY2Vzcy4gKi8KLSAgb2JqX3NvbV9zdHJpbmd0YWIgKGFiZmQpID0gc3RyaW5ndGFiOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgZGF0YSAoaW4gYnl0ZXMpIHJlcXVpcmVkIHRvIGhvbGQgdGhlIHN5bWJvbAotICAgdGFibGUgZm9yIHRoaXMgb2JqZWN0LiAgKi8KLQotc3RhdGljIGxvbmcKLXNvbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmICghc29tX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKyAxKSAqIChzaXplb2YgKGFzeW1ib2wgKikpOwotfQotCi0vKiBDb252ZXJ0IGZyb20gYSBTT00gc3Vic3BhY2UgaW5kZXggdG8gYSBCRkQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1iZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wgKGFiZmQsIHN5bWJvbCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkICpzeW1ib2w7Ci17Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gIC8qIFRoZSBtZWFuaW5nIG9mIHRoZSBzeW1ib2xfaW5mbyBmaWVsZCBjaGFuZ2VzIGZvciBmdW5jdGlvbnMKLSAgICAgd2l0aGluIGV4ZWN1dGFibGVzLiAgU28gb25seSB1c2UgdGhlIHF1aWNrIHN5bWJvbF9pbmZvIG1hcHBpbmcgZm9yCi0gICAgIGluY29tcGxldGUgb2JqZWN0cyBhbmQgbm9uLWZ1bmN0aW9uIHN5bWJvbHMgaW4gZXhlY3V0YWJsZXMuICAqLwotICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwCi0gICAgICB8fCAoc3ltYm9sLT5zeW1ib2xfdHlwZSAhPSBTVF9FTlRSWQotCSAgJiYgc3ltYm9sLT5zeW1ib2xfdHlwZSAhPSBTVF9QUklfUFJPRwotCSAgJiYgc3ltYm9sLT5zeW1ib2xfdHlwZSAhPSBTVF9TRUNfUFJPRwotCSAgJiYgc3ltYm9sLT5zeW1ib2xfdHlwZSAhPSBTVF9NSUxMSUNPREUpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpbmRleCA9IHN5bWJvbC0+c3ltYm9sX2luZm87Ci0gICAgICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbiAhPSBOVUxMOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLQlpZiAoc2VjdGlvbi0+dGFyZ2V0X2luZGV4ID09IGluZGV4ICYmIHNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikpCi0JICByZXR1cm4gc2VjdGlvbjsKLQotICAgICAgLyogQ291bGQgYmUgYSBzeW1ib2wgZnJvbSBhbiBleHRlcm5hbCBsaWJyYXJ5IChzdWNoIGFzIGFuIE9NT1MKLQkgc2hhcmVkIGxpYnJhcnkpLiAgRG9uJ3QgYWJvcnQuICAqLwotICAgICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgdmFsdWUgPSBzeW1ib2wtPnN5bWJvbF92YWx1ZTsKLQotICAgICAgLyogRm9yIGV4ZWN1dGFibGVzIHdlIHdpbGwgaGF2ZSB0byB1c2UgdGhlIHN5bWJvbCdzIGFkZHJlc3MgYW5kCi0JIGZpbmQgb3V0IHdoYXQgc2VjdGlvbiB3b3VsZCBjb250YWluIHRoYXQgYWRkcmVzcy4gICBZdWsuICAqLwotICAgICAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb247IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCXsKLQkgIGlmICh2YWx1ZSA+PSBzZWN0aW9uLT52bWEKLQkgICAgICAmJiB2YWx1ZSA8PSBzZWN0aW9uLT52bWEgKyBzZWN0aW9uLT5fY29va2VkX3NpemUKLQkgICAgICAmJiBzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pKQotCSAgICByZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLSAgICAgIC8qIENvdWxkIGJlIGEgc3ltYm9sIGZyb20gYW4gZXh0ZXJuYWwgbGlicmFyeSAoc3VjaCBhcyBhbiBPTU9TCi0JIHNoYXJlZCBsaWJyYXJ5KS4gIERvbid0IGFib3J0LiAgKi8KLSAgICAgIHJldHVybiBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCi0gICAgfQotfQotCi0vKiBSZWFkIGFuZCBzYXZlIHRoZSBzeW1ib2wgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBCRkQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1zb21fc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBzeW1ib2xfY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgaW50IHN5bXNpemUgPSBzaXplb2YgKHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQpOwotICBjaGFyICpzdHJpbmd0YWI7Ci0gIHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQgKmJ1ZiA9IE5VTEwsICpidWZwLCAqZW5kYnVmcDsKLSAgc29tX3N5bWJvbF90eXBlICpzeW0sICpzeW1iYXNlOwotCi0gIC8qIFJldHVybiBzYXZlZCB2YWx1ZSBpZiBpdCBleGlzdHMuICAqLwotICBpZiAob2JqX3NvbV9zeW10YWIgKGFiZmQpICE9IE5VTEwpCi0gICAgZ290byBzdWNjZXNzZnVsX3JldHVybjsKLQotICAvKiBTcGVjaWFsIGNhc2UuICBUaGlzIGlzICpub3QqIGFuIGVycm9yLiAgKi8KLSAgaWYgKHN5bWJvbF9jb3VudCA9PSAwKQotICAgIGdvdG8gc3VjY2Vzc2Z1bF9yZXR1cm47Ci0KLSAgaWYgKCFzb21fc2x1cnBfc3RyaW5nX3RhYmxlIChhYmZkKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzdHJpbmd0YWIgPSBvYmpfc29tX3N0cmluZ3RhYiAoYWJmZCk7Ci0KLSAgc3ltYmFzZSA9ICgoc29tX3N5bWJvbF90eXBlICopCi0JICAgICBiZmRfbWFsbG9jIChzeW1ib2xfY291bnQgKiBzaXplb2YgKHNvbV9zeW1ib2xfdHlwZSkpKTsKLSAgaWYgKHN5bWJhc2UgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbWVtc2V0IChzeW1iYXNlLCAwLCBzeW1ib2xfY291bnQgKiBzaXplb2YgKHNvbV9zeW1ib2xfdHlwZSkpOwotCi0gIC8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIFNPTSByZXByZXNlbnRhdGlvbi4gICovCi0gIGJ1ZiA9IGJmZF9tYWxsb2MgKHN5bWJvbF9jb3VudCAqIHN5bXNpemUpOwotICBpZiAoYnVmID09IE5VTEwgJiYgc3ltYm9sX2NvdW50ICogc3ltc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zb21fc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoYmZkX3JlYWQgKGJ1Ziwgc3ltYm9sX2NvdW50ICogc3ltc2l6ZSwgMSwgYWJmZCkgCi0gICAgICAhPSBzeW1ib2xfY291bnQgKiBzeW1zaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHN5bWJvbHMgYW5kIGludGVybmFsaXplIHRoZW0uICAqLwotICBlbmRidWZwID0gYnVmICsgc3ltYm9sX2NvdW50OwotICBmb3IgKGJ1ZnAgPSBidWYsIHN5bSA9IHN5bWJhc2U7IGJ1ZnAgPCBlbmRidWZwOyArK2J1ZnApCi0gICAgewotCi0gICAgICAvKiBJIGRvbid0IHRoaW5rIHdlIGNhcmUgYWJvdXQgdGhlc2UuICAqLwotICAgICAgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX1NZTV9FWFQKLQkgIHx8IGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX0FSR19FWFQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNldCBzb21lIHByaXZhdGUgZGF0YSB3ZSBjYXJlIGFib3V0LiAgKi8KLSAgICAgIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9OVUxMKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9VTktOT1dOOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfQUJTT0xVVEUpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX0FCU09MVVRFOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfREFUQSkKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfREFUQTsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX0NPREUpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX0NPREU7Ci0gICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9QUklfUFJPRykKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfUFJJX1BST0c7Ci0gICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9TRUNfUFJPRykKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfU0VDX1BST0c7Ci0gICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9FTlRSWSkKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfRU5UUlk7Ci0gICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9NSUxMSUNPREUpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX01JTExJQ09ERTsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX1BMQUJFTCkKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfUExBQkVMOwotICAgICAgZWxzZQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9VTktOT1dOOwotICAgICAgc29tX3N5bWJvbF9kYXRhIChzeW0pLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jID0gYnVmcC0+YXJnX3JlbG9jOwotCi0gICAgICAvKiBTb21lIHJlYXNvbmFibGUgZGVmYXVsdHMuICAqLwotICAgICAgc3ltLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gICAgICBzeW0tPnN5bWJvbC5uYW1lID0gYnVmcC0+bmFtZS5uX3N0cnggKyBzdHJpbmd0YWI7Ci0gICAgICBzeW0tPnN5bWJvbC52YWx1ZSA9IGJ1ZnAtPnN5bWJvbF92YWx1ZTsKLSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSAwOwotICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgPSAwOwotCi0gICAgICBzd2l0Y2ggKGJ1ZnAtPnN5bWJvbF90eXBlKQotCXsKLQljYXNlIFNUX0VOVFJZOgotCWNhc2UgU1RfTUlMTElDT0RFOgotCSAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgc29tX3N5bWJvbF9kYXRhIChzeW0pLT50Y19kYXRhLmFwLmhwcGFfcHJpdl9sZXZlbCA9Ci0JICAgIHN5bS0+c3ltYm9sLnZhbHVlICYgMHgzOwotCSAgc3ltLT5zeW1ib2wudmFsdWUgJj0gfjB4MzsKLQkgIGJyZWFrOwotCi0JY2FzZSBTVF9TVFVCOgotCWNhc2UgU1RfQ09ERToKLQljYXNlIFNUX1BSSV9QUk9HOgotCWNhc2UgU1RfU0VDX1BST0c6Ci0JICBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnRjX2RhdGEuYXAuaHBwYV9wcml2X2xldmVsID0KLQkgICAgc3ltLT5zeW1ib2wudmFsdWUgJiAweDM7Ci0JICBzeW0tPnN5bWJvbC52YWx1ZSAmPSB+MHgzOwotCSAgLyogSWYgdGhlIHN5bWJvbCdzIHNjb3BlIGlzIFNUX1VOU0FULCB0aGVuIHRoZXNlIGFyZQotCSAgICAgdW5kZWZpbmVkIGZ1bmN0aW9uIHN5bWJvbHMuICAqLwotCSAgaWYgKGJ1ZnAtPnN5bWJvbF9zY29wZSA9PSBTU19VTlNBVCkKLQkgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgICAgCi0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBIYW5kbGUgc2NvcGluZyBhbmQgc2VjdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gICAgICBzd2l0Y2ggKGJ1ZnAtPnN5bWJvbF9zY29wZSkKLQl7Ci0JLyogc3ltYm9sX2luZm8gZmllbGQgaXMgdW5kZWZpbmVkIGZvciBTU19FWFRFUk5BTCBhbmQgU1NfVU5TQVQgc3ltYm9scywKLQkgICBzbyB0aGUgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzeW1ib2wgY2FuJ3QgYmUga25vd24uICAqLwotCWNhc2UgU1NfRVhURVJOQUw6Ci0JICBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgIT0gU1RfU1RPUkFHRSkKLQkgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gKEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBTU19VTlNBVDoKLQkgIGlmIChidWZwLT5zeW1ib2xfdHlwZSAhPSBTVF9TVE9SQUdFKQotCSAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UKLQkgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQotCWNhc2UgU1NfVU5JVkVSU0FMOgotCSAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gKEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMKTsKLQkgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wgKGFiZmQsIGJ1ZnApOwotCSAgc3ltLT5zeW1ib2wudmFsdWUgLT0gc3ltLT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0KLSNpZiAwCi0JLyogU1NfR0xPQkFMIGFuZCBTU19MT0NBTCBhcmUgdHdvIG5hbWVzIGZvciB0aGUgc2FtZSB0aGluZy4KLQkgICBTb3VuZCBkdW1iPyAgSXQgaXMuICAqLwotCWNhc2UgU1NfR0xPQkFMOgotI2VuZGlmCi0JY2FzZSBTU19MT0NBTDoKLQkgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9MT0NBTDsKLQkgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wgKGFiZmQsIGJ1ZnApOwotCSAgc3ltLT5zeW1ib2wudmFsdWUgLT0gc3ltLT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBNYXJrIHNlY3Rpb24gc3ltYm9scyBhbmQgc3ltYm9scyB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4KLQkgTm90ZSAkU1RBUlQkIGlzIGEgbWFnaWMgY29kZSBzeW1ib2wsIE5PVCBhIHNlY3Rpb24gc3ltYm9sLiAgKi8KLSAgICAgIGlmIChzeW0tPnN5bWJvbC5uYW1lWzBdID09ICckJwotCSAgJiYgc3ltLT5zeW1ib2wubmFtZVtzdHJsZW4gKHN5bS0+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+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4gcmVhZCwgdGhlbiBzbmFnIGEgcG9pbnRlcgotCSB0byBpdC4gIEl0J3MgYSBsaXR0bGUgc2xpbWV5IHRvIGdyYWIgdGhlIHN5bWJvbHMgdmlhIG9ial9zb21fc3ltdGFiLAotCSBidXQgZG9pbmcgc28gYXZvaWRzIGFsbG9jYXRpbmcgbG90cyBvZiBleHRyYSBtZW1vcnkuICAqLwotICAgICAgaWYgKHNvbV9zbHVycF9zeW1ib2xfdGFibGUgKGN1cnJfYmZkKSA9PSBmYWxzZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc3ltID0gb2JqX3NvbV9zeW10YWIgKGN1cnJfYmZkKTsKLSAgICAgIGN1cnJfY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChjdXJyX2JmZCk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyX2NvdW50OyBpKyssIHN5bSsrKQotCXsKLQkgIHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbyBpbmZvOwotCi0JICAvKiBEZXJpdmUgU09NIGluZm9ybWF0aW9uIGZyb20gdGhlIEJGRCBzeW1ib2wuICAqLwotCSAgc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyAoY3Vycl9iZmQsICZzeW0tPnN5bWJvbCwgJmluZm8pOwotCi0JICAvKiBTaG91bGQgd2UgaW5jbHVkZSB0aGlzIHN5bWJvbD8gICovCi0JICBpZiAoaW5mby5zeW1ib2xfdHlwZSA9PSBTVF9OVUxMCi0JICAgICAgfHwgaW5mby5zeW1ib2xfdHlwZSA9PSBTVF9TWU1fRVhUCi0JICAgICAgfHwgaW5mby5zeW1ib2xfdHlwZSA9PSBTVF9BUkdfRVhUKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogT25seSBnbG9iYWwgc3ltYm9scyBhbmQgdW5zYXRpc2ZpZWQgY29tbW9ucy4gICovCi0JICBpZiAoaW5mby5zeW1ib2xfc2NvcGUgIT0gU1NfVU5JVkVSU0FMCi0JICAgICAgJiYgaW5mby5zeW1ib2xfdHlwZSAhPSBTVF9TVE9SQUdFKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogRG8gbm8gaW5jbHVkZSB1bmRlZmluZWQgc3ltYm9scy4gICovCi0JICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnN5bWJvbC5zZWN0aW9uKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHN5bWJvbCBmcm9tIHRoaXMgU09NLCB0aGVuIHVwZGF0ZQotCSAgICAgdGhlIFNPTSBkaWN0aW9uYXJ5IHRvby4gICovCi0JICBpZiAoc29tX2RpY3Rbc29tX2luZGV4XS5sb2NhdGlvbiA9PSAwKQotCSAgICB7Ci0JICAgICAgc29tX2RpY3Rbc29tX2luZGV4XS5sb2NhdGlvbiA9IGN1cnJfc29tX29mZnNldDsKLQkgICAgICBzb21fZGljdFtzb21faW5kZXhdLmxlbmd0aCA9IGFyZWx0X3NpemUgKGN1cnJfYmZkKTsKLQkgICAgfQotCi0JICAvKiBGaWxsIGluIHRoZSBsc3Qgc3ltYm9sIHJlY29yZC4gICovCi0JICBjdXJyX2xzdF9zeW0tPmhpZGRlbiA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPnNlY29uZGFyeV9kZWYgPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT5zeW1ib2xfdHlwZSA9IGluZm8uc3ltYm9sX3R5cGU7Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF9zY29wZSA9IGluZm8uc3ltYm9sX3Njb3BlOwotCSAgY3Vycl9sc3Rfc3ltLT5jaGVja19sZXZlbCA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPm11c3RfcXVhbGlmeSA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPmluaXRpYWxseV9mcm96ZW4gPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT5tZW1vcnlfcmVzaWRlbnQgPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT5pc19jb21tb24gPSBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c3ltYm9sLnNlY3Rpb24pOwotCSAgY3Vycl9sc3Rfc3ltLT5kdXBfY29tbW9uID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+eGxlYXN0ID0gMzsKLQkgIGN1cnJfbHN0X3N5bS0+YXJnX3JlbG9jID0gaW5mby5hcmdfcmVsb2M7Ci0JICBjdXJyX2xzdF9zeW0tPm5hbWUubl9zdHJ4ID0gcCAtIHN0cmluZ3MgKyA0OwotCSAgY3Vycl9sc3Rfc3ltLT5xdWFsaWZpZXJfbmFtZS5uX3N0cnggPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT5zeW1ib2xfaW5mbyA9IGluZm8uc3ltYm9sX2luZm87Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF92YWx1ZSA9IGluZm8uc3ltYm9sX3ZhbHVlIHwgaW5mby5wcml2X2xldmVsOwotCSAgY3Vycl9sc3Rfc3ltLT5zeW1ib2xfZGVzY3JpcHRvciA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPnJlc2VydmVkID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+c29tX2luZGV4ID0gc29tX2luZGV4OwotCSAgY3Vycl9sc3Rfc3ltLT5zeW1ib2xfa2V5ID0gc29tX2JmZF9hcl9zeW1ib2xfaGFzaCAoJnN5bS0+c3ltYm9sKTsKLQkgIGN1cnJfbHN0X3N5bS0+bmV4dF9lbnRyeSA9IDA7Ci0KLQkgIC8qIEluc2VydCBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQkgIGlmIChoYXNoX3RhYmxlW2N1cnJfbHN0X3N5bS0+c3ltYm9sX2tleSAlIGxzdC5oYXNoX3NpemVdKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkICp0bXA7Ci0KLQkgICAgICAvKiBUaGVyZSBpcyBhbHJlYWR5IHNvbWV0aGluZyBhdCB0aGUgaGVhZCBvZiB0aGlzIGhhc2ggY2hhaW4sCi0JCSBzbyB0YWNrIHRoaXMgc3ltYm9sIG9udG8gdGhlIGVuZCBvZiB0aGUgY2hhaW4uICAqLwotCSAgICAgIHRtcCA9IGxhc3RfaGFzaF9lbnRyeVtjdXJyX2xzdF9zeW0tPnN5bWJvbF9rZXkgJSBsc3QuaGFzaF9zaXplXTsKLQkgICAgICB0bXAtPm5leHRfZW50cnkKLQkJPSAoY3Vycl9sc3Rfc3ltIC0gbHN0X3N5bXMpICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpCi0JCSAgKyBsc3QuaGFzaF9zaXplICogNCAKLQkJICArIGxzdC5tb2R1bGVfY291bnQgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpCi0JCSAgKyBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRmlyc3QgZW50cnkgaW4gdGhpcyBoYXNoIGNoYWluLiAgKi8KLQkgICAgICBoYXNoX3RhYmxlW2N1cnJfbHN0X3N5bS0+c3ltYm9sX2tleSAlIGxzdC5oYXNoX3NpemVdCi0JCT0gKGN1cnJfbHN0X3N5bSAtIGxzdF9zeW1zKSAqIHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkKQotCQkgICsgbHN0Lmhhc2hfc2l6ZSAqIDQgCi0JCSAgKyBsc3QubW9kdWxlX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KQotCQkgICsgc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcik7Ci0JICAgIH0KLQotCSAgLyogS2VlcCB0cmFjayBvZiB0aGUgbGFzdCBzeW1ib2wgd2UgYWRkZWQgdG8gdGhpcyBjaGFpbiBzbyB3ZSBjYW4KLQkgICAgIGVhc2lseSB1cGRhdGUgaXRzIG5leHRfZW50cnkgcG9pbnRlci4gICovCi0JICBsYXN0X2hhc2hfZW50cnlbY3Vycl9sc3Rfc3ltLT5zeW1ib2xfa2V5ICUgbHN0Lmhhc2hfc2l6ZV0KLQkgICAgPSBjdXJyX2xzdF9zeW07Ci0KLQotCSAgLyogVXBkYXRlIHRoZSBzdHJpbmcgdGFibGUuICAqLwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgc3RybGVuIChzeW0tPnN5bWJvbC5uYW1lKSwgcCk7Ci0JICBwICs9IDQ7Ci0JICBzdHJjcHkgKHAsIHN5bS0+c3ltYm9sLm5hbWUpOwotCSAgcCArPSBzdHJsZW4gKHN5bS0+c3ltYm9sLm5hbWUpICsgMTsKLQkgIHdoaWxlICgoaW50KXAgJSA0KQotCSAgICB7Ci0JICAgICAgYmZkX3B1dF84IChhYmZkLCAwLCBwKTsKLQkgICAgICBwKys7Ci0JICAgIH0KLQotCSAgLyogSGVhZCB0byB0aGUgbmV4dCBzeW1ib2wuICAqLwotCSAgY3Vycl9sc3Rfc3ltKys7Ci0JfQotCi0gICAgICAvKiBLZWVwIHRyYWNrIG9mIHdoZXJlIGVhY2ggU09NIHdpbGwgZmluYWxseSByZXNpZGU7IHRoZW4gbG9vawotCSBhdCB0aGUgbmV4dCBCRkQuICAqLwotICAgICAgY3Vycl9zb21fb2Zmc2V0ICs9IGFyZWx0X3NpemUgKGN1cnJfYmZkKSArIHNpemVvZiAoc3RydWN0IGFyX2hkcik7Ci0gCi0gICAgICAvKiBBIHBhcnRpY3VsYXIgb2JqZWN0IGluIHRoZSBhcmNoaXZlIG1heSBoYXZlIGFuIG9kZCBsZW5ndGg7IHRoZQotCSBsaW5rZXIgcmVxdWlyZXMgb2JqZWN0cyBiZWdpbiBvbiBhbiBldmVuIGJvdW5kYXJ5LiAgU28gcm91bmQKLQkgdXAgdGhlIGN1cnJlbnQgb2Zmc2V0IGFzIG5lY2Vzc2FyeS4gICovCi0gICAgICBjdXJyX3NvbV9vZmZzZXQgPSAoY3Vycl9zb21fb2Zmc2V0ICsgMHgxKSAmIH4weDE7Ci0gICAgICBjdXJyX2JmZCA9IGN1cnJfYmZkLT5uZXh0OwotICAgICAgc29tX2luZGV4Kys7Ci0gICAgfQotCi0gIC8qIE5vdyBzY3JpYmJsZSBvdXQgdGhlIGhhc2ggdGFibGUuICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBoYXNoX3RhYmxlLCBsc3QuaGFzaF9zaXplLCA0LCBhYmZkKQotICAgICAgIT0gbHN0Lmhhc2hfc2l6ZSAqIDQpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhlbiB0aGUgU09NIGRpY3Rpb25hcnkuICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzb21fZGljdCwgbHN0Lm1vZHVsZV9jb3VudCwKLQkJIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSksIGFiZmQpCi0gICAgICAhPSBsc3QubW9kdWxlX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBUaGUgbGlicmFyeSBzeW1ib2xzLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgbHN0X3N5bXMsIG5zeW1zLCBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCksIGFiZmQpCi0gICAgICAhPSBuc3ltcyAqIHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBBbmQgZmluYWxseSB0aGUgc3RyaW5ncy4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHN0cmluZ3MsIHN0cmluZ19zaXplLCAxLCBhYmZkKSAhPSBzdHJpbmdfc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoaGFzaF90YWJsZSAhPSBOVUxMKQotICAgIGZyZWUgKGhhc2hfdGFibGUpOwotICBpZiAoc29tX2RpY3QgIT0gTlVMTCkKLSAgICBmcmVlIChzb21fZGljdCk7Ci0gIGlmIChsYXN0X2hhc2hfZW50cnkgIT0gTlVMTCkKLSAgICBmcmVlIChsYXN0X2hhc2hfZW50cnkpOwotICBpZiAobHN0X3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChsc3Rfc3ltcyk7Ci0gIGlmIChzdHJpbmdzICE9IE5VTEwpCi0gICAgZnJlZSAoc3RyaW5ncyk7Ci0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoaGFzaF90YWJsZSAhPSBOVUxMKQotICAgIGZyZWUgKGhhc2hfdGFibGUpOwotICBpZiAoc29tX2RpY3QgIT0gTlVMTCkKLSAgICBmcmVlIChzb21fZGljdCk7Ci0gIGlmIChsYXN0X2hhc2hfZW50cnkgIT0gTlVMTCkKLSAgICBmcmVlIChsYXN0X2hhc2hfZW50cnkpOwotICBpZiAobHN0X3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChsc3Rfc3ltcyk7Ci0gIGlmIChzdHJpbmdzICE9IE5VTEwpCi0gICAgZnJlZSAoc3RyaW5ncyk7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIExTVCBmb3IgdGhlIGFyY2hpdmUuCi0KLSAgIFlvdSdsbCBuZXZlciBiZWxpZXZlIHRoaXMgaXMgcmVhbGx5IGhvdyBhcm1hcHMgYXJlIGhhbmRsZWQgaW4gU09NLi4uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1zb21fd3JpdGVfYXJtYXAgKGFiZmQsIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50LCBzdHJpZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGg7Ci0gICAgIHN0cnVjdCBvcmwgKm1hcDsKLSAgICAgdW5zaWduZWQgaW50IG9ybF9jb3VudDsKLSAgICAgaW50IHN0cmlkeDsKLXsKLSAgYmZkICpjdXJyX2JmZDsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgdW5zaWduZWQgaW50IGksIGxzdF9zaXplLCBuc3ltcywgc3RyaW5nc2l6ZTsKLSAgc3RydWN0IGFyX2hkciBoZHI7Ci0gIHN0cnVjdCBsc3RfaGVhZGVyIGxzdDsKLSAgaW50ICpwOwotIAotICAvKiBXZSdsbCB1c2UgdGhpcyBmb3IgdGhlIGFyY2hpdmUncyBkYXRlIGFuZCBtb2RlIGxhdGVyLiAgKi8KLSAgaWYgKHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmc3RhdGJ1ZikgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgLyogRnVkZ2UgZmFjdG9yLiAgKi8KLSAgYmZkX2FyZGF0YSAoYWJmZCktPmFybWFwX3RpbWVzdGFtcCA9IHN0YXRidWYuc3RfbXRpbWUgKyA2MDsKLQotICAvKiBBY2NvdW50IGZvciB0aGUgbHN0IGhlYWRlciBmaXJzdC4gICovCi0gIGxzdF9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcik7Ci0KLSAgLyogU3RhcnQgYnVpbGRpbmcgdGhlIExTVCBoZWFkZXIuICAqLwotICAvKiBGSVhNRTogIERvIHdlIG5lZWQgdG8gZXhhbWluZSBlYWNoIGVsZW1lbnQgdG8gZGV0ZXJtaW5lIHRoZQotICAgICBsYXJnZXN0IGlkIG51bWJlcj8gICovCi0gIGxzdC5zeXN0ZW1faWQgPSBDUFVfUEFfUklTQzFfMDsKLSAgbHN0LmFfbWFnaWMgPSBMSUJNQUdJQzsKLSAgbHN0LnZlcnNpb25faWQgPSBWRVJTSU9OX0lEOwotICBsc3QuZmlsZV90aW1lLnNlY3MgPSAwOwotICBsc3QuZmlsZV90aW1lLm5hbm9zZWNzID0gMDsKLQotICBsc3QuaGFzaF9sb2MgPSBsc3Rfc2l6ZTsKLSAgbHN0Lmhhc2hfc2l6ZSA9IFNPTV9MU1RfSEFTSF9TSVpFOwotCi0gIC8qIEhhc2ggdGFibGUgaXMgYSBTT01fTFNUX0hBU0hfU0laRSAzMmJpdCBvZmZzZXRzLiAgKi8KLSAgbHN0X3NpemUgKz0gNCAqIFNPTV9MU1RfSEFTSF9TSVpFOwotCi0gIC8qIFdlIG5lZWQgdG8gY291bnQgdGhlIG51bWJlciBvZiBTT01zIGluIHRoaXMgYXJjaGl2ZS4gICovCi0gIGN1cnJfYmZkID0gYWJmZC0+YXJjaGl2ZV9oZWFkOwotICBsc3QubW9kdWxlX2NvdW50ID0gMDsKLSAgd2hpbGUgKGN1cnJfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgLyogT25seSB0cnVlIFNPTSBvYmplY3RzIGNvdW50LiAgKi8KLSAgICAgIGlmIChjdXJyX2JmZC0+Zm9ybWF0ID09IGJmZF9vYmplY3QKLQkgICYmIGN1cnJfYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIpCi0JbHN0Lm1vZHVsZV9jb3VudCsrOwotICAgICAgY3Vycl9iZmQgPSBjdXJyX2JmZC0+bmV4dDsKLSAgICB9Ci0gIGxzdC5tb2R1bGVfbGltaXQgPSBsc3QubW9kdWxlX2NvdW50OwotICBsc3QuZGlyX2xvYyA9IGxzdF9zaXplOwotICBsc3Rfc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpICogbHN0Lm1vZHVsZV9jb3VudDsKLQotICAvKiBXZSBkb24ndCBzdXBwb3J0IGltcG9ydC9leHBvcnQgdGFibGVzLCBhdXhpbGlhcnkgaGVhZGVycywKLSAgICAgb3IgZnJlZSBsaXN0cyB5ZXQuICBNYWtlIHRoZSBsaW5rZXIgd29yayBhIGxpdHRsZSBoYXJkZXIKLSAgICAgdG8gbWFrZSBvdXIgbGlmZSBlYXNpZXIuICAqLwotCi0gIGxzdC5leHBvcnRfbG9jID0gMDsKLSAgbHN0LmV4cG9ydF9jb3VudCA9IDA7Ci0gIGxzdC5pbXBvcnRfbG9jID0gMDsKLSAgbHN0LmF1eF9sb2MgPSAwOwotICBsc3QuYXV4X3NpemUgPSAwOwotCi0gIC8qIENvdW50IGhvdyBtYW55IHN5bWJvbHMgd2Ugd2lsbCBoYXZlIG9uIHRoZSBoYXNoIGNoYWlucyBhbmQgdGhlCi0gICAgIHNpemUgb2YgdGhlIGFzc29jaWF0ZWQgc3RyaW5nIHRhYmxlLiAgKi8KLSAgaWYgKHNvbV9iZmRfcHJlcF9mb3JfYXJfd3JpdGUgKGFiZmQsICZuc3ltcywgJnN0cmluZ3NpemUpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBsc3Rfc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCkgKiBuc3ltczsKLQotICAvKiBGb3IgdGhlIHN0cmluZyB0YWJsZS4gIE9uZSBkYXkgd2UgbWlnaHQgYWN0dWFsbHkgdXNlIHRoaXMgaW5mbwotICAgICB0byBhdm9pZCBzbWFsbCBzZWVrcy9yZWFkcyB3aGVuIHJlYWRpbmcgYXJjaGl2ZXMuICAqLwotICBsc3Quc3RyaW5nX2xvYyA9IGxzdF9zaXplOwotICBsc3Quc3RyaW5nX3NpemUgPSBzdHJpbmdzaXplOwotICBsc3Rfc2l6ZSArPSBzdHJpbmdzaXplOwotCi0gIC8qIFNPTSBBQkkgc2F5cyB0aGlzIG11c3QgYmUgemVyby4gICovCi0gIGxzdC5mcmVlX2xpc3QgPSAwOwotICBsc3QuZmlsZV9lbmQgPSBsc3Rfc2l6ZTsKLQotICAvKiBDb21wdXRlIHRoZSBjaGVja3N1bS4gIE11c3QgaGFwcGVuIGFmdGVyIHRoZSBlbnRpcmUgbHN0IGhlYWRlcgotICAgICBoYXMgZmlsbGVkIGluLiAgKi8KLSAgcCA9IChpbnQgKikmbHN0OwotICBsc3QuY2hlY2tzdW0gPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcikvc2l6ZW9mIChpbnQpIC0gMTsgaSsrKQotICAgIGxzdC5jaGVja3N1bSBePSAqcCsrOwotCi0gIHNwcmludGYgKGhkci5hcl9uYW1lLCAiLyAgICAgICAgICAgICAgICIpOwotICBzcHJpbnRmIChoZHIuYXJfZGF0ZSwgIiVsZCIsIGJmZF9hcmRhdGEgKGFiZmQpLT5hcm1hcF90aW1lc3RhbXApOwotICBzcHJpbnRmIChoZHIuYXJfdWlkLCAiJWxkIiwgKGxvbmcpIGdldHVpZCAoKSk7Ci0gIHNwcmludGYgKGhkci5hcl9naWQsICIlbGQiLCAobG9uZykgZ2V0Z2lkICgpKTsKLSAgc3ByaW50ZiAoaGRyLmFyX21vZGUsICIlLThvIiwgKHVuc2lnbmVkIGludCkgc3RhdGJ1Zi5zdF9tb2RlKTsKLSAgc3ByaW50ZiAoaGRyLmFyX3NpemUsICIlLTEwZCIsIChpbnQpIGxzdF9zaXplKTsKLSAgaGRyLmFyX2ZtYWdbMF0gPSAnYCc7Ci0gIGhkci5hcl9mbWFnWzFdID0gJ1wwMTInOwotCi0gIC8qIFR1cm4gYW55IG51bGxzIGludG8gc3BhY2VzLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGFyX2hkcik7IGkrKykKLSAgICBpZiAoKChjaGFyICopICgmaGRyKSlbaV0gPT0gJ1wwJykKLSAgICAgICgoKGNoYXIgKikgKCZoZHIpKVtpXSkgPSAnICc7Ci0KLSAgLyogU2NyaWJibGUgb3V0IHRoZSBhciBoZWFkZXIuICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmaGRyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHNjcmliYmxlIG91dCB0aGUgbHN0IGhlYWRlci4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZsc3QsIDEsIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEJ1aWxkIGFuZCB3cml0ZSB0aGUgYXJtYXAuICAqLwotICBpZiAoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYgKGFiZmQsIG5zeW1zLCBzdHJpbmdzaXplLCBsc3QsIGVsZW5ndGgpCi0gICAgICA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICAvKiBEb25lLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZyZWUgYWxsIGluZm9ybWF0aW9uIHdlIGhhdmUgY2FjaGVkIGZvciB0aGlzIEJGRC4gIFdlIGNhbiBhbHdheXMKLSAgIHJlYWQgaXQgYWdhaW4gbGF0ZXIgaWYgd2UgbmVlZCBpdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2ZyZWVfY2FjaGVkX2luZm8gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQotICAgIHJldHVybiB0cnVlOwotCi0jZGVmaW5lIEZSRUUoeCkgaWYgKHggIT0gTlVMTCkgeyBmcmVlICh4KTsgeCA9IE5VTEw7IH0KLSAgLyogRnJlZSB0aGUgbmF0aXZlIHN0cmluZyBhbmQgc3ltYm9sIHRhYmxlcy4gICovCi0gIEZSRUUgKG9ial9zb21fc3ltdGFiIChhYmZkKSk7Ci0gIEZSRUUgKG9ial9zb21fc3RyaW5ndGFiIChhYmZkKSk7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICAvKiBGcmVlIHRoZSBuYXRpdmUgcmVsb2NhdGlvbnMuICAqLwotICAgICAgby0+cmVsb2NfY291bnQgPSAtMTsKLSAgICAgIEZSRUUgKHNvbV9zZWN0aW9uX2RhdGEgKG8pLT5yZWxvY19zdHJlYW0pOwotICAgICAgLyogRnJlZSB0aGUgZ2VuZXJpYyByZWxvY2F0aW9ucy4gICovCi0gICAgICBGUkVFIChvLT5yZWxvY2F0aW9uKTsKLSAgICB9Ci0jdW5kZWYgRlJFRQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBFbmQgb2YgbWlzY2VsbGFuZW91cyBzdXBwb3J0IGZ1bmN0aW9ucy4gKi8KLQotLyogTGlua2VyIHN1cHBvcnQgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJldHVybiAoc29tX2lzX3N1YnNwYWNlIChzZWMpICYmIHNlYy0+X3Jhd19zaXplID4gMjQwMDAwKTsKLX0KLQotI2RlZmluZQlzb21fY2xvc2VfYW5kX2NsZWFudXAJCXNvbV9iZmRfZnJlZV9jYWNoZWRfaW5mbwotCi0jZGVmaW5lIHNvbV9yZWFkX2FyX2hkcgkJCV9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2RlZmluZSBzb21fb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCWJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBzb21fZ2V0X2VsdF9hdF9pbmRleAkJX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgc29tX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAliZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIHNvbV90cnVuY2F0ZV9hcm5hbWUJCWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIHNvbV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCV9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBzb21fY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX2FyY2hpdmVfY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBzb21fdXBkYXRlX2FybWFwX3RpbWVzdGFtcAliZmRfdHJ1ZQotI2RlZmluZSBzb21fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgIF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotCi0jZGVmaW5lIHNvbV9nZXRfbGluZW5vICAgICAgICAgICAgICAgICAgX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBzb21fYmZkX21ha2VfZGVidWdfc3ltYm9sCV9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBzb21fcmVhZF9taW5pc3ltYm9scwkJX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgc29tX21pbmlzeW1ib2xfdG9fc3ltYm9sCV9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotI2RlZmluZSBzb21fZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0jZGVmaW5lIHNvbV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgc29tX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgc29tX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIHNvbV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBzb21fYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLQotI2RlZmluZSBzb21fYmZkX2djX3NlY3Rpb25zCQliZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotCi0KLWNvbnN0IGJmZF90YXJnZXQgc29tX3ZlYyA9Ci17Ci0gICJzb20iLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9zb21fZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQgfCBEWU5BTUlDKSwKLSAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUwotICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCQkvKiBzZWN0aW9uIGZsYWdzICovCi0KLS8qIGxlYWRpbmdfc3ltYm9sX2NoYXI6IGlzIHRoZSBmaXJzdCBjaGFyIG9mIGEgdXNlciBzeW1ib2wKLSAgIHByZWRpY3RhYmxlLCBhbmQgaWYgc28gd2hhdCBpcyBpdCAqLwotICAwLAotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE0LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLSAge19iZmRfZHVtbXlfdGFyZ2V0LAotICAgc29tX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLAotICAgX2JmZF9kdW1teV90YXJnZXQKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICBzb21fbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICBzb21fd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0jdW5kZWYgc29tCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoc29tKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoc29tKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChzb20pLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChzb20pLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChzb20pLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChzb20pLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgMAotfTsKLQotI2VuZGlmIC8qIEhPU1RfSFBQQUhQVVggfHwgSE9TVF9IUFBBQlNEIHx8IEhPU1RfSFBQQU9TRiAqLwpkaWZmIC0tZ2l0IGEvYmZkL3NvbS5oIGIvYmZkL3NvbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjM3ODA0Li4wMDAwMDAwCi0tLSBhL2JmZC9zb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKiBIUCBQQS1SSVNDIFNPTSBvYmplY3QgZmlsZSBmb3JtYXQ6ICBkZWZpbml0aW9ucyBpbnRlcm5hbCB0byBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX1NPTV9ICi0jZGVmaW5lIF9TT01fSAotCi0jaW5jbHVkZSAibGliaHBwYS5oIgotCi0jaW5jbHVkZSA8YS5vdXQuaD4KLSNpbmNsdWRlIDxsc3QuaD4KLSNpbmNsdWRlIDxhci5oPgotCi0vKiBUaGUgU09NIEJGRCBiYWNrZW5kIGRvZXNuJ3QgY3VycmVudGx5IHVzZSBhbnl0aGluZyBmcm9tIHRoZXNlCi0gICB0d28gaW5jbHVkZSBmaWxlcywgYnV0IGl0J3MgbGlrZWx5IHRvIG5lZWQgdGhlbSBpbiB0aGUgZnV0dXJlLiAgKi8KLSNpZmRlZiBSX0RMVF9SRUwKLSNpbmNsdWRlIDxzaGwuaD4KLSNpbmNsdWRlIDxkbC5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEhPU1RfSFBQQUJTRCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBT1NGKQotLyogQlNEIHVzZXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzY2hlbWUgZm9yIG9iamVjdCBmaWxlIGlkZW50aWZpY2F0aW9uLgotICAgc28gZm9yIG5vdywgZGVmaW5lIF9QQV9SSVNDX0lEIHRvIGFjY2VwdCBhbnkgcmFuZG9tIHZhbHVlIGZvciBhIG1vZGVsCi0gICBudW1iZXIuICAqLwotI3VuZGVmIF9QQV9SSVNDX0lECi0jZGVmaW5lIF9QQV9SSVNDX0lEKF9fbV9udW0pIDEKLSNlbmRpZiAvKiBIT1NUX0hQUEFCU0QgKi8KLQotI2RlZmluZSBGSUxFX0hEUl9TSVpFIHNpemVvZihzdHJ1Y3QgaGVhZGVyKQotI2RlZmluZSBBVVhfSERSX1NJWkUgc2l6ZW9mKHN0cnVjdCBzb21fZXhlY19hdXhoZHIpCi0KLXR5cGVkZWYgc3RydWN0IHNvbV9zeW1ib2wKLSAgewotICAgIGFzeW1ib2wgc3ltYm9sOwotICAgIHVuc2lnbmVkIGludCBzb21fdHlwZTsKLQotICAgIC8qIFN0cnVjdHVyZWQgbGlrZSB0aGUgRUxGIHRjX2RhdGEgdW5pb24uICBBbGxvd3MgbW9yZSBjb2RlIHNoYXJpbmcKLSAgICAgICBpbiBHQVMgdGhpcyB3YXkuICAqLwotICAgIHVuaW9uCi0gICAgICB7Ci0Jc3RydWN0Ci0JewotCSAgdW5zaWduZWQgaW50IGhwcGFfYXJnX3JlbG9jOwotCSAgdW5zaWduZWQgaW50IGhwcGFfcHJpdl9sZXZlbDsKLQl9IGFwOwotCVBUUiBhbnk7Ci0gICAgICB9Ci0gICAgdGNfZGF0YTsKLQotICAgIC8qIEluZGV4IG9mIHRoaXMgc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUuICBPbmx5IHVzZWQgd2hlbgotICAgICAgIGJ1aWxkaW5nIHJlbG9jYXRpb24gc3RyZWFtcyBmb3IgaW5jb21wbGV0ZSBvYmplY3RzLiAgKi8KLSAgICBpbnQgaW5kZXg7Ci0KLSAgICAvKiBIb3cgbWFueSB0aW1lcyB0aGlzIHN5bWJvbCBpcyB1c2VkIGluIGEgcmVsb2NhdGlvbi4gIEJ5IHNvcnRpbmcKLSAgICAgICB0aGUgc3ltYm9scyBmcm9tIG1vc3QgdXNlZCB0byBsZWFzdCB1c2VkIHdlIGNhbiBzaWduaWZpY2FudGx5Ci0gICAgICAgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSByZWxvY2F0aW9uIHN0cmVhbSBmb3IgaW5jb21wbGV0ZSBvYmplY3RzLiAgKi8KLSAgICBpbnQgcmVsb2NfY291bnQ7Ci0KLSAgICAvKiBEdXJpbmcgb2JqZWN0IGZpbGUgd3JpdGluZywgdGhlIG9mZnNldCBvZiB0aGUgbmFtZSBvZiB0aGlzIHN5bWJvbAotICAgICAgIGluIHRoZSBTT00gc3RyaW5nIHRhYmxlLiAqLwotICAgIGludCBzdHJpbmd0YWJfb2Zmc2V0OwotICB9Ci1zb21fc3ltYm9sX3R5cGU7Ci0KLS8qIEEgc3RydWN0dXJlIGNvbnRhaW5pbmcgYWxsIHRoZSBtYWdpYyBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gYSBCRkQncwotICAgcHJpdmF0ZSBkYXRhIHdoaWNoIG5lZWRzIHRvIGJlIGNvcGllZCBkdXJpbmcgYW4gb2JqY29weS9zdHJpcCBydW4uICAqLwotc3RydWN0IHNvbV9leGVjX2RhdGEKLSAgewotICAgIC8qIFNvcnQtb2YgYSBtYWdpYyBudW1iZXIuICBCU0QgdXNlcyBpdCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCi0gICAgICAgbmF0aXZlIGV4ZWN1dGFibGVzIGFuZCBocHV4IGV4ZWN1dGFibGVzLiAgKi8KLSAgICBzaG9ydCBzeXN0ZW1faWQ7Ci0KLSAgICAvKiBNYWdpYyBleGVjIGZsYWdzLiAgVGhlc2UgY29udHJvbCB0aGluZ3MgbGlrZSB3aGV0aGVyIG9yIG5vdAotICAgICAgIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jaW5nIGlzIGFsbG93ZWQgYW5kIHRoZSBsaWtlLiAgKi8KLSAgICBsb25nIGV4ZWNfZmxhZ3M7Ci0KLSAgICAvKiBBZGQgbW9yZSBzdHVmZiBoZXJlIGFzIG5lZWRlZC4gIEdvb2QgZXhhbXBsZXMgb2YgaW5mb3JtYXRpb24KLSAgICAgICB3ZSBtaWdodCB3YW50IHRvIHBhc3Mgd291bGQgYmUgcHJlc3VtZWRfZHAsIGVudHJ5XyogYW5kIG1heWJlCi0gICAgICAgb3RoZXJzIGZyb20gdGhlIGZpbGUgaGVhZGVyLiAgKi8KLSAgfTsKLQotc3RydWN0IHNvbWRhdGEKLSAgewotICAgIC8qIEFsbCB0aGUgbWFnaWMgaW5mb3JtYXRpb24gYWJvdXQgYW4gZXhlY3V0YWJsZSB3aGljaCBsaXZlcwotICAgICAgIGluIHRoZSBwcml2YXRlIEJGRCBzdHJ1Y3R1cmUgYW5kIG5lZWRzIHRvIGJlIGNvcGllZCBmcm9tCi0gICAgICAgdGhlIGlucHV0IGJmZCB0byB0aGUgb3V0cHV0IGJmZCBkdXJpbmcgYSBvYmpjb3B5L3N0cmlwLiAgKi8KLSAgICBzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSAqZXhlY19kYXRhOwotCi0gICAgLyogVGhlc2UgdGhyZWUgZmllbGRzIGFyZSBvbmx5IHVzZWQgd2hlbiB3cml0aW5nIGZpbGVzIGFuZCBhcmUKLSAgICAgICBnZW5lcmF0ZWQgZnJvbSBzY3JhdGNoLiAgVGhleSBuZWVkIG5vdCBiZSBjb3BpZWQgZm9yIG9iamNvcHkKLSAgICAgICBvciBzdHJpcCB0byB3b3JrLiAgKi8KLSAgICBzdHJ1Y3QgaGVhZGVyICpmaWxlX2hkcjsKLSAgICBzdHJ1Y3QgY29weXJpZ2h0X2F1eF9oZHIgKmNvcHlyaWdodF9hdXhfaGRyOwotICAgIHN0cnVjdCB1c2VyX3N0cmluZ19hdXhfaGRyICp2ZXJzaW9uX2F1eF9oZHI7Ci0gICAgc3RydWN0IHNvbV9leGVjX2F1eGhkciAqZXhlY19oZHI7Ci0gICAgQ09NUFVOSVQgKmNvbXBfdW5pdDsKLQotICAgIC8qIFBvaW50ZXJzIHRvIGEgc2F2ZWQgY29weSBvZiB0aGUgc3ltYm9sIGFuZCBzdHJpbmcgdGFibGVzLiAgVGhlc2UKLSAgICAgICBuZWVkIG5vdCBiZSBjb3BpZWQgZm9yIG9iamNvcHkgb3Igc3RyaXAgdG8gd29yay4gICovCi0gICAgc29tX3N5bWJvbF90eXBlICpzeW10YWI7Ci0gICAgY2hhciAqc3RyaW5ndGFiOwotICAgIGFzeW1ib2wgKipzb3J0ZWRfc3ltczsKLQotICAgIC8qIFdlIHJlbWVtYmVyIHRoZXNlIG9mZnNldHMgc28gdGhhdCBhZnRlciBjaGVja19maWxlX2Zvcm1hdCwgd2UgaGF2ZQotICAgICAgIG5vIGRlcGVuZGVuY2llcyBvbiB0aGUgcGFydGljdWxhciBmb3JtYXQgb2YgdGhlIGV4ZWNfaGRyLgotICAgICAgIFRoZXNlIG9mZnNldHMgbmVlZCBub3QgYmUgY29waWVkIGZvciBvYmpjb3B5IG9yIHN0cmlwIHRvIHdvcmsuICAqLwotCi0gICAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0gICAgZmlsZV9wdHIgc3RyX2ZpbGVwb3M7Ci0gICAgZmlsZV9wdHIgcmVsb2NfZmlsZXBvczsKLSAgICB1bnNpZ25lZCBzdHJpbmd0YWJfc2l6ZTsKLSAgfTsKLQotc3RydWN0IHNvbV9kYXRhX3N0cnVjdAotICB7Ci0gICAgc3RydWN0IHNvbWRhdGEgYTsKLSAgfTsKLQotLyogU3Vic3RydWN0dXJlIG9mIHNvbV9zZWN0aW9uX2RhdGFfc3RydWN0IHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbgotICAgd2hpY2ggY2FuJ3QgYmUgcmVwcmVzZW50ZWQgYnkgdGhlIGdlbmVyaWMgQkZEIHNlY3Rpb24gc3RydWN0dXJlLAotICAgYnV0IHdoaWNoIG11c3QgYmUgY29waWVkIGR1cmluZyBvYmpjb3B5IG9yIHN0cmlwLiAgKi8KLXN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdAotICB7Ci0gICAgLyogVmFyaW91cyBmaWVsZHMgaW4gc3BhY2UgYW5kIHN1YnNwYWNlIGhlYWRlcnMgdGhhdCB3ZSBuZWVkCi0gICAgICAgdG8gcGFzcyBhcm91bmQuICAqLwotICAgIHVuc2lnbmVkIGludCBzb3J0X2tleSA6IDg7Ci0gICAgdW5zaWduZWQgaW50IGFjY2Vzc19jb250cm9sX2JpdHMgOiA3OwotICAgIHVuc2lnbmVkIGludCBpc19kZWZpbmVkIDogMTsKLSAgICB1bnNpZ25lZCBpbnQgaXNfcHJpdmF0ZSA6IDE7Ci0gICAgdW5zaWduZWQgaW50IHF1YWRyYW50IDogMjsKLQotICAgIC8qIEZvciBzdWJzcGFjZXMsIHRoaXMgcG9pbnRzIHRvIHRoZSBzZWN0aW9uIHdoaWNoIHJlcHJlc2VudHMgdGhlCi0gICAgICAgc3BhY2UgaW4gd2hpY2ggdGhlIHN1YnNwYWNlIGlzIGNvbnRhaW5lZC4gIEZvciBzcGFjZXMgaXQgcG9pbnRzCi0gICAgICAgYmFjayB0byB0aGUgc2VjdGlvbiBmb3IgdGhpcyBzcGFjZS4gICovCi0gICAgYXNlY3Rpb24gKmNvbnRhaW5lcjsKLQotICAgIC8qIFRoZSB1c2VyLXNwZWNpZmllZCBzcGFjZSBudW1iZXIuICBJdCBpcyB3cm9uZyB0byB1c2UgdGhpcyBhcwotICAgICAgIGFuIGluZGV4IHNpbmNlIGR1cGxpY2F0ZXMgYW5kIGhvbGVzIGFyZSBhbGxvd2VkLiAgKi8KLSAgICBpbnQgc3BhY2VfbnVtYmVyOwotCi0gICAgLyogQWRkIG1vcmUgc3R1ZmYgaGVyZSBhcyBuZWVkZWQuICBHb29kIGV4YW1wbGVzIG9mIGluZm9ybWF0aW9uCi0gICAgICAgd2UgbWlnaHQgd2FudCB0byBwYXNzIHdvdWxkIGJlIGluaXRpYWxpemF0aW9uIHBvaW50ZXJzLCAKLSAgICAgICBhbmQgdGhlIG1hbnkgc3Vic3BhY2UgZmxhZ3Mgd2UgZG8gbm90IHJlcHJlc2VudCB5ZXQuICAqLwotICB9OwotCi0vKiBVc2VkIHRvIGtlZXAgZXh0cmEgU09NIHNwZWNpZmljIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIHNlY3Rpb24uCi0KLSAgIHJlbG9jX3NpemUgaG9sZHMgdGhlIHNpemUgb2YgdGhlIHJlbG9jYXRpb24gc3RyZWFtLCBub3RlIHRoaXMKLSAgIGlzIHZlcnkgZGlmZmVyZW50IGZyb20gdGhlIG51bWJlciBvZiByZWxvY2F0aW9ucyBhcyBTT00gcmVsb2NhdGlvbnMKLSAgIGFyZSB2YXJpYWJsZSBsZW5ndGguIAotCi0gICByZWxvY19zdHJlYW0gaXMgdGhlIGFjdHVhbCBzdHJlYW0gb2YgcmVsb2NhdGlvbiBlbnRyaWVzLiAgKi8KLQotc3RydWN0IHNvbV9zZWN0aW9uX2RhdGFfc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKmNvcHlfZGF0YTsKLSAgICB1bnNpZ25lZCBpbnQgcmVsb2Nfc2l6ZTsKLSAgICBjaGFyICpyZWxvY19zdHJlYW07Ci0gICAgc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkICpzcGFjZV9kaWN0OwotICAgIHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCAqc3Vic3BhY2VfZGljdDsKLSAgfTsKLQotI2RlZmluZSBzb21kYXRhKGJmZCkJCQkoKGJmZCktPnRkYXRhLnNvbV9kYXRhLT5hKQotI2RlZmluZSBvYmpfc29tX2V4ZWNfZGF0YShiZmQpCQkoc29tZGF0YShiZmQpLmV4ZWNfZGF0YSkKLSNkZWZpbmUgb2JqX3NvbV9maWxlX2hkcihiZmQpCQkoc29tZGF0YShiZmQpLmZpbGVfaGRyKQotI2RlZmluZSBvYmpfc29tX2V4ZWNfaGRyKGJmZCkJCShzb21kYXRhKGJmZCkuZXhlY19oZHIpCi0jZGVmaW5lIG9ial9zb21fY29weXJpZ2h0X2hkcihiZmQpCShzb21kYXRhKGJmZCkuY29weXJpZ2h0X2F1eF9oZHIpCi0jZGVmaW5lIG9ial9zb21fdmVyc2lvbl9oZHIoYmZkKQkoc29tZGF0YShiZmQpLnZlcnNpb25fYXV4X2hkcikKLSNkZWZpbmUgb2JqX3NvbV9jb21waWxhdGlvbl91bml0KGJmZCkJKHNvbWRhdGEoYmZkKS5jb21wX3VuaXQpCi0jZGVmaW5lIG9ial9zb21fc3ltdGFiKGJmZCkJCShzb21kYXRhKGJmZCkuc3ltdGFiKQotI2RlZmluZSBvYmpfc29tX3N0cmluZ3RhYihiZmQpCQkoc29tZGF0YShiZmQpLnN0cmluZ3RhYikKLSNkZWZpbmUgb2JqX3NvbV9zeW1fZmlsZXBvcyhiZmQpCShzb21kYXRhKGJmZCkuc3ltX2ZpbGVwb3MpCi0jZGVmaW5lIG9ial9zb21fc3RyX2ZpbGVwb3MoYmZkKQkoc29tZGF0YShiZmQpLnN0cl9maWxlcG9zKQotI2RlZmluZSBvYmpfc29tX3N0cmluZ3RhYl9zaXplKGJmZCkJKHNvbWRhdGEoYmZkKS5zdHJpbmd0YWJfc2l6ZSkKLSNkZWZpbmUgb2JqX3NvbV9yZWxvY19maWxlcG9zKGJmZCkJKHNvbWRhdGEoYmZkKS5yZWxvY19maWxlcG9zKQotI2RlZmluZSBvYmpfc29tX3NvcnRlZF9zeW1zKGJmZCkJKHNvbWRhdGEoYmZkKS5zb3J0ZWRfc3ltcykKLSNkZWZpbmUgc29tX3NlY3Rpb25fZGF0YShzZWMpIFwKLSAgKChzdHJ1Y3Qgc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKilzZWMtPnVzZWRfYnlfYmZkKQotI2RlZmluZSBzb21fc3ltYm9sX2RhdGEoc3ltYm9sKQkJKChzb21fc3ltYm9sX3R5cGUgKikgc3ltYm9sKQotCi0KLS8qIERlZmluZXMgZ3JvdXBzIG9mIGJhc2ljIHJlbG9jYXRpb25zLiAgRklYTUU6ICBUaGVzZSBzaG91bGQKLSAgIGJlIHRoZSBvbmx5IGJhc2ljIHJlbG9jYXRpb25zIGNyZWF0ZWQgYnkgR0FTLiAgVGhlIHJlc3QKLSAgIHNob3VsZCBiZSBpbnRlcm5hbCB0byB0aGUgQkZEIGJhY2tlbmQuCi0KLSAgIFRoZSBpZGVhIGlzIGJvdGggU09NIGFuZCBFTEYgZGVmaW5lIHRoZXNlIGJhc2ljIHJlbG9jYXRpb24KLSAgIHR5cGVzIHNvIHRoZXkgbWFwIGludG8gYSBTT00gb3IgRUxGIHNwZWNpZmljIHJlbG9hdGlvbiBhcwotICAgYXBwcm9wcmlhdGUuICBUaGlzIGFsbG93cyBHQVMgdG8gc2hhcmUgbXVjaCBtb3JlIGNvZGUgCi0gICBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0IGZvcm1hdHMuICAqLwotCi0jZGVmaW5lIFJfSFBQQV9OT05FCQkJUl9OT19SRUxPQ0FUSU9OCi0jZGVmaW5lCVJfSFBQQQkJCQlSX0NPREVfT05FX1NZTUJPTAotI2RlZmluZQlSX0hQUEFfUENSRUxfQ0FMTAkJUl9QQ1JFTF9DQUxMCi0jZGVmaW5lIFJfSFBQQV9BQlNfQ0FMTAkJCVJfQUJTX0NBTEwKLSNkZWZpbmUJUl9IUFBBX0dPVE9GRgkJCVJfRFBfUkVMQVRJVkUKLSNkZWZpbmUgUl9IUFBBX0VOVFJZCQkJUl9FTlRSWQotI2RlZmluZSBSX0hQUEFfRVhJVAkJCVJfRVhJVAotI2RlZmluZSBSX0hQUEFfQ09NUExFWAkJCVJfQ09NUDEKLSNkZWZpbmUgUl9IUFBBX0JFR0lOX0JSVEFCCQlSX0JFR0lOX0JSVEFCCi0jZGVmaW5lIFJfSFBQQV9FTkRfQlJUQUIJCVJfRU5EX0JSVEFCCi0jZGVmaW5lIFJfSFBQQV9CRUdJTl9UUlkJCVJfQkVHSU5fVFJZCi0jZGVmaW5lIFJfSFBQQV9FTkRfVFJZCQkJUl9FTkRfVFJZCi0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucywgbW9zdGx5IGZvciB1c2UgYnkgR0FTLiAgKi8KLWJvb2xlYW4gYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzIFBBUkFNUyAoKGFzZWN0aW9uICosIGludCwgaW50LAotCQkJCQkJdW5zaWduZWQgaW50LCBpbnQpKTsKLWJvb2xlYW4gYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIFBBUkFNUyAoKGFzZWN0aW9uICosIGFzZWN0aW9uICosCi0JCQkJCQkgICBpbnQsIHVuc2lnbmVkIGludCwgaW50KSk7Ci12b2lkIGJmZF9zb21fc2V0X3N5bWJvbF90eXBlIFBBUkFNUyAoKGFzeW1ib2wgKiwgdW5zaWduZWQgaW50KSk7Ci1ib29sZWFuIGJmZF9zb21fYXR0YWNoX2F1eF9oZHIgUEFSQU1TICgoYmZkICosIGludCwgY2hhciAqKSk7Ci1pbnQgKiogaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUKLSAgUEFSQU1TICgoYmZkICosIGludCwgaW50LCBlbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQsCi0JICAgaW50LCBhc3ltYm9sICopKTsKLWJvb2xlYW4gYmZkX3NvbV9hdHRhY2hfY29tcGlsYXRpb25fdW5pdAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0KLSNlbmRpZiAvKiBfU09NX0ggKi8KZGlmZiAtLWdpdCBhL2JmZC9zcGFyY2xpbnV4LmMgYi9iZmQvc3BhcmNsaW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmQ0ZTdlLi4wMDAwMDAwCi0tLSBhL2JmZC9zcGFyY2xpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBsaW51eCBmbGF2b3JlZCBzcGFyYyBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLVVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAgICAgICAgNDA5NgotI2RlZmluZSBaTUFHSUNfRElTS19CTE9DS19TSVpFIDEwMjQKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSICAgICAgICAweDAKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0KLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fU1BBUkMgfHwgKG10eXBlKSA9PSBNX1VOS05PV04pCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9zcGFyYwotI2RlZmluZSBNWShPUCkgQ0FUKHNwYXJjbGludXhfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zcGFyYy1saW51eCIKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgTVkodmVjKTsKLQotLyogV2UgYWx3YXlzIGdlbmVyYXRlIFFNQUdJQyBmaWxlcyBpbiBwcmVmZXJlbmNlIHRvIFpNQUdJQyBmaWxlcy4gIEl0Ci0gICB3b3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlIHRoaXMgYSBsaW5rZXIgb3B0aW9uLCBpZiB0aGF0IGV2ZXIKLSAgIGJlY29tZXMgaW1wb3J0YW50LiAgKi8KLQotc3RhdGljIHZvaWQgTVlfZmluYWxfbGlua19jYWxsYmFjawotICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBzcGFyY2xpbnV4X2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjbGludXhfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPSBxX21hZ2ljX2Zvcm1hdDsKLSAgcmV0dXJuIE5BTUUoYW91dCxmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgTVlfZmluYWxfbGlua19jYWxsYmFjayk7Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2ZpbmFsX2xpbmsgc3BhcmNsaW51eF9iZmRfZmluYWxfbGluawotCi0vKiBTZXQgdGhlIG1hY2hpbmUgdHlwZSBjb3JyZWN0bHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBzcGFyY2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjbGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1NQQVJDKTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgc3BhcmNsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMKLS8qIENvZGUgdG8gbGluayBhZ2FpbnN0IExpbnV4IGEub3V0IHNoYXJlZCBsaWJyYXJpZXMuICAqLwotCi0vKiBTZWUgaWYgYSBzeW1ib2wgbmFtZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0KLSNpZm5kZWYgR09UX1JFRl9QUkVGSVgKLSNkZWZpbmUgICAgICAgIEdPVF9SRUZfUFJFRklYICAiX19HT1RfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfR09UX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBHT1RfUkVGX1BSRUZJWCwgc2l6ZW9mIEdPVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogU2VlIGlmIGEgc3ltYm9sIG5hbWUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAqLwotCi0jaWZuZGVmIFBMVF9SRUZfUFJFRklYCi0jZGVmaW5lICAgICAgICBQTFRfUkVGX1BSRUZJWCAgIl9fUExUXyIKLSNlbmRpZgotCi0jZGVmaW5lIElTX1BMVF9TWU0obmFtZSkgXAotICAoc3RybmNtcCAobmFtZSwgUExUX1JFRl9QUkVGSVgsIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpID09IDApCi0KLS8qIFRoaXMgc3RyaW5nIGlzIHVzZWQgdG8gZ2VuZXJhdGUgc3BlY2lhbGl6ZWQgZXJyb3IgbWVzc2FnZXMuICAqLwotCi0jaWZuZGVmIE5FRURTX1NIUkxJQgotI2RlZmluZSBORUVEU19TSFJMSUIgIl9fTkVFRFNfU0hSTElCXyIKLSNlbmRpZgotCi0vKiBUaGlzIHNwZWNpYWwgc3ltYm9sIGlzIGEgc2V0IHZlY3RvciB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZgotICAgcG9pbnRlcnMgdG8gZml4dXAgdGFibGVzLiAgSXQgd2lsbCBiZSBwcmVzZW50IGluIGFueSBkeW5hbWljbHkKLSAgIGxpbmtlZCBmaWxlLiAgVGhlIGxpbmtlciBnZW5lcmF0ZWQgZml4dXAgdGFibGUgc2hvdWxkIGFsc28gYmUgYWRkZWQKLSAgIHRvIHRoZSBsaXN0LCBhbmQgaXQgc2hvdWxkIGFsd2F5cyBhcHBlYXIgaW4gdGhlIHNlY29uZCBzbG90ICh0aGUKLSAgIGZpcnN0IG9uZSBpcyBhIGR1bW15IHdpdGggYSBtYWdpYyBudW1iZXIgdGhhdCBpcyBkZWZpbmVkIGluCi0gICBjcnQwLm8pLiAgKi8KLQotI2lmbmRlZiBTSEFSQUJMRV9DT05GTElDVFMKLSNkZWZpbmUgU0hBUkFCTEVfQ09ORkxJQ1RTICJfX1NIQVJBQkxFX0NPTkZMSUNUU19fIgotI2VuZGlmCi0KLS8qIFdlIGtlZXAgYSBsaXN0IG9mIGZpeHVwcy4gIFRoZSB0ZXJtaW5vbG9neSBpcyBhIGJpdCBzdHJhbmdlLCBidXQKLSAgIGVhY2ggZml4dXAgY29udGFpbnMgdHdvIDMyIGJpdCBudW1iZXJzLiAgQSByZWd1bGFyIGZpeHVwIGNvbnRhaW5zCi0gICBhbiBhZGRyZXNzIGFuZCBhIHBvaW50ZXIsIGFuZCBhdCBydW50aW1lIHdlIHNob3VsZCBzdG9yZSB0aGUKLSAgIGFkZHJlc3MgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIHBvaW50ZXIuICBBIGJ1aWx0aW4gZml4dXAKLSAgIGNvbnRhaW5zIHR3byBwb2ludGVycywgYW5kIHdlIHNob3VsZCByZWFkIHRoZSBhZGRyZXNzIHVzaW5nIG9uZQotICAgcG9pbnRlciBhbmQgc3RvcmUgaXQgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIG90aGVyCi0gICBwb2ludGVyLiAgQnVpbHRpbiBmaXh1cHMgY29tZSBpbnRvIHBsYXkgd2hlbiB3ZSBoYXZlIGR1cGxpY2F0ZQotICAgX19HT1RfXyBzeW1ib2xzIGZvciB0aGUgc2FtZSB2YXJpYWJsZS4gIFRoZSBidWlsdGluIGZpeHVwIHdpbGwgY29weQotICAgdGhlIEdPVCBwb2ludGVyIGZyb20gb25lIG92ZXIgaW50byB0aGUgb3RoZXIuICAqLwotCi1zdHJ1Y3QgZml4dXAKLXsKLSAgc3RydWN0IGZpeHVwICpuZXh0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBiZmRfdm1hIHZhbHVlOwotCi0gIC8qIE5vbnplcm8gaWYgdGhpcyBpcyBhIGp1bXAgaW5zdHJ1Y3Rpb24gdGhhdCBuZWVkcyB0byBiZSBmaXhlZCwKLSAgICAgemVybyBpZiB0aGlzIGlzIGp1c3QgYSBwb2ludGVyICovCi0gIGNoYXIganVtcDsKLQotICBjaGFyIGJ1aWx0aW47Ci19OwotCi0vKiBXZSBkb24ndCBuZWVkIGEgc3BlY2lhbCBoYXNoIHRhYmxlIGVudHJ5IHN0cnVjdHVyZSwgYnV0IHdlIGRvIG5lZWQKLSAgIHRvIGtlZXAgc29tZSBpbmZvcm1hdGlvbiBiZXR3ZWVuIGxpbmtlciBwYXNzZXMsIHNvIHdlIHVzZSBhIHNwZWNpYWwKLSAgIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSByb290OwotfTsKLQotc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBGaXJzdCBkeW5hbWljIG9iamVjdCBmb3VuZCBpbiBsaW5rLiAgKi8KLSAgYmZkICpkeW5vYmo7Ci0KLSAgLyogTnVtYmVyIG9mIGZpeHVwcy4gICovCi0gIHNpemVfdCBmaXh1cF9jb3VudDsKLQotICAvKiBOdW1iZXIgb2YgYnVpbHRpbiBmaXh1cHMuICAqLwotICBzaXplX3QgbG9jYWxfYnVpbHRpbnM7Ci0KLSAgLyogTGlzdCBvZiBmaXh1cHMuICAqLwotICBzdHJ1Y3QgZml4dXAgKmZpeHVwX2xpc3Q7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpsaW51eF9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgc3RydWN0IGZpeHVwICpuZXdfZml4dXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLAotICAgICAgICAgIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gbGludXhfYWRkX29uZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0gICAgICAgICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLAotICAgICAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF90YWxseV9zeW1ib2xzCi0gIFBBUkFNUyAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9maW5pc2hfZHluYW1pY19saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGFuIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotbGludXhfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopCi0gICAgICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLSAgICAgICAgTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHM7IHRoZXJlIGFyZW4ndCBhbnkuICAqLwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1saW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikKLSAgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gIGlmICghIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKCZyZXQtPnJvb3QsIGFiZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGludXhfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGZyZWUgKHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotCi0gIHJldC0+ZHlub2JqID0gTlVMTDsKLSAgcmV0LT5maXh1cF9jb3VudCA9IDA7Ci0gIHJldC0+bG9jYWxfYnVpbHRpbnMgPSAwOwotICByZXQtPmZpeHVwX2xpc3QgPSBOVUxMOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKLSAgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIFwKLSAgIGFvdXRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pICAgICAgICAgICAgICAgICAgICBcCi0gIChhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICgmKHRhYmxlKS0+cm9vdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwgXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgTGludXggbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIGxpbnV4X2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBTdG9yZSB0aGUgaW5mb3JtYXRpb24gZm9yIGEgbmV3IGZpeHVwLiAgKi8KLQotc3RhdGljIHN0cnVjdCBmaXh1cCAqCi1uZXdfZml4dXAgKGluZm8sIGgsIHZhbHVlLCBidWlsdGluKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgaW50IGJ1aWx0aW47Ci17Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLQotICBmID0gKHN0cnVjdCBmaXh1cCAqKSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCBmaXh1cCkpOwotICBpZiAoZiA9PSBOVUxMKQotICAgIHJldHVybiBmOwotICBmLT5uZXh0ID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7Ci0gIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0ID0gZjsKLSAgZi0+aCA9IGg7Ci0gIGYtPnZhbHVlID0gdmFsdWU7Ci0gIGYtPmJ1aWx0aW4gPSBidWlsdGluOwotICBmLT5qdW1wID0gMDsKLSAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQ7Ci0gIHJldHVybiBmOwotfQotCi0vKiBXZSBjb21lIGhlcmUgb25jZSB3ZSByZWFsaXplIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGxpbmsgdG8gYSBzaGFyZWQKLSAgIGxpYnJhcnkuICBXZSBuZWVkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgc2VjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZQotICAgZml4dXAgdGFibGUsIGFuZCB3ZSB1bHRpbWF0ZWx5IG5lZWQgdG8gYWRkIGEgcG9pbnRlciB0byB0aGlzIGludG8KLSAgIHRoZSBzZXQgdmVjdG9yIGZvciBTSEFSQUJMRV9DT05GTElDVFMuICBBdCB0aGlzIHBvaW50IHdlIGRvIG5vdAotICAga25vdyB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiwgYnV0IHRoYXQncyBPSyAtIHdlIGp1c3QgbmVlZCB0bwotICAgY3JlYXRlIGl0IGZvciBub3cuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotCi0gIC8qIE5vdGUgdGhhdCB3ZSBzZXQgdGhlIFNFQ19JTl9NRU1PUlkgZmxhZy4gICovCi0gIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWTsKLQotICAvKiBXZSBjaG9vc2UgdG8gdXNlIHRoZSBuYW1lICIubGludXgtZHluYW1pYyIgZm9yIHRoZSBmaXh1cCB0YWJsZS4KLSAgICAgV2h5IG5vdD8gKi8KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIubGludXgtZHluYW1pYyIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgcy0+X3Jhd19zaXplID0gMDsKLSAgcy0+Y29udGVudHMgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGdW5jdGlvbiB0byBhZGQgYSBzaW5nbGUgc3ltYm9sIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4gIFRoaXMgaXMKLSAgIGEgd3JhcHBlciBhcm91bmQgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgd2hpY2ggaGFuZGxlcyB0aGUKLSAgIHR3ZWFraW5nIG5lZWRlZCBmb3IgZHluYW1pYyBsaW5raW5nIHN1cHBvcnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLCB2YWx1ZSwgc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgY29weSwgY29sbGVjdCwgaGFzaHApCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNvcHk7Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocDsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgYm9vbGVhbiBpbnNlcnQ7Ci0KLSAgLyogTG9vayB1cCBhbmQgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGlzIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZS4KLSAgICAgSWYgd2UgZG8sIGFuZCB0aGUgZGVmaW5pbmcgZW50cnkgaXMgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCB3ZQotICAgICBuZWVkIHRvIGNyZWF0ZSB0aGUgZHluYW1pYyBzZWN0aW9ucy4KLQotICAgICBGSVhNRTogV2hhdCBpZiBhYmZkLT54dmVjICE9IGluZm8tPmhhc2gtPmNyZWF0b3I/ICBXZSBtYXkgd2FudCB0bwotICAgICBiZSBhYmxlIHRvIGxpbmsgTGludXggYS5vdXQgYW5kIEVMRiBvYmplY3RzIHRvZ2V0aGVyLCBidXQgc2VyaW91cwotICAgICBjb25mdXNpb24gaXMgcG9zc2libGUuICAqLwotCi0gIGluc2VydCA9IGZhbHNlOwotCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKG5hbWUsIFNIQVJBQkxFX0NPTkZMSUNUUykgPT0gMAotICAgICAgJiYgKGZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwCi0gICAgICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0gICAgewotICAgICAgaWYgKCEgbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykpCi0gICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGFiZmQ7Ci0gICAgICBpbnNlcnQgPSB0cnVlOwotICAgIH0KLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWN0aW9uKQotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotICAgIHsKLSAgICAgIGggPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggIT0gTlVMTAotICAgICAgICAgJiYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgICAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0gICAgICAgewotICAgICAgICAgc3RydWN0IGZpeHVwICpmOwotCi0gICAgICAgICBpZiAoaGFzaHAgIT0gTlVMTCkKLSAgICAgICAgICAgKmhhc2hwID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0KLSAgICAgICAgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgsIHZhbHVlLCAhIElTX1BMVF9TWU0gKG5hbWUpKTsKLSAgICAgICAgIGlmIChmID09IE5VTEwpCi0gICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgIGYtPmp1bXAgPSBJU19QTFRfU1lNIChuYW1lKTsKLQotICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgfQotICAgIH0KLQotICAvKiBEbyB0aGUgdXN1YWwgcHJvY2VkdXJlIGZvciBhZGRpbmcgYSBzeW1ib2wuICAqLwotICBpZiAoISBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBzdHJpbmcsIGNvcHksIGNvbGxlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSW5zZXJ0IGEgcG9pbnRlciB0byBvdXIgdGFibGUgaW4gdGhlIHNldCB2ZWN0b3IuICBUaGUgZHluYW1pYwotICAgICBsaW5rZXIgcmVxdWlyZXMgdGhpcyBpbmZvcm1hdGlvbiAqLwotICBpZiAoaW5zZXJ0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICAvKiBIZXJlIHdlIGRvIG91ciBzcGVjaWFsIHRoaW5nIHRvIGFkZCB0aGUgcG9pbnRlciB0byB0aGUKLSAgICAgICAgZHluYW1pYyBzZWN0aW9uIGluIHRoZSBTSEFSQUJMRV9DT05GTElDVFMgc2V0IHZlY3Rvci4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5saW51eC1keW5hbWljIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLSAgICAgICAgICAgIChpbmZvLCBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLCBTSEFSQUJMRV9DT05GTElDVFMsCi0gICAgICAgICAgICAgQlNGX0dMT0JBTCB8IEJTRl9DT05TVFJVQ1RPUiwgcywgMCwgTlVMTCwgZmFsc2UsIGZhbHNlLCBOVUxMKSkpCi0gICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2Ugd2lsbCBjcmF3bCB0aGUgaGFzaCB0YWJsZSBhbmQgY29tZSBoZXJlIGZvciBldmVyeSBnbG9iYWwgc3ltYm9sLgotICAgV2Ugd2lsbCBleGFtaW5lIGVhY2ggZW50cnkgYW5kIHNlZSBpZiB0aGVyZSBhcmUgaW5kaWNhdGlvbnMgdGhhdCB3ZQotICAgbmVlZCB0byBhZGQgYSBmaXh1cC4gIFRoZXJlIGFyZSB0d28gcG9zc2libGUgY2FzZXMgLSBvbmUgaXMgd2hlcmUKLSAgIHlvdSBoYXZlIGR1cGxpY2F0ZSBkZWZpbml0aW9ucyBvZiBQTFQgb3IgR09UIHN5bWJvbHMgLSB0aGVzZSB3aWxsCi0gICBoYXZlIGFscmVhZHkgYmVlbiBjYXVnaHQgYW5kIGFkZGVkIGFzICJidWlsdGluIiBmaXh1cHMuICBJZiB3ZSBmaW5kCi0gICB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIG5vbiBQTFQvR09UIHN5bWJvbCBpcyBhbHNvIHByZXNlbnQsIHdlCi0gICBjb252ZXJ0IGl0IHRvIGEgcmVndWxhciBmaXh1cCBpbnN0ZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB2aWEgbGludXhfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxpbnV4X3RhbGx5X3N5bWJvbHMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSBkYXRhOwotICBzdHJ1Y3QgZml4dXAgKmYsICpmMTsKLSAgaW50IGlzX3BsdDsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDEsICpoMjsKLSAgYm9vbGVhbiBleGlzdHM7Ci0KLSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICAmJiBzdHJuY21wIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIE5FRURTX1NIUkxJQiwKLSAgICAgICAgICAgICAgICAgc2l6ZW9mIE5FRURTX1NIUkxJQiAtIDEpID09IDApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICBjaGFyICphbGxvYyA9IE5VTEw7Ci0KLSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcgKyBzaXplb2YgTkVFRFNfU0hSTElCIC0gMTsKLSAgICAgIHAgPSBzdHJyY2hyIChuYW1lLCAnXycpOwotICAgICAgaWYgKHAgIT0gTlVMTCkKLSAgICAgICBhbGxvYyA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKLQotICAgICAgaWYgKHAgPT0gTlVMTCB8fCBhbGxvYyA9PSBOVUxMKQotICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiT3V0cHV0IGZpbGUgcmVxdWlyZXMgc2hhcmVkIGxpYnJhcnkgYCVzJ1xuIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgICBzdHJjcHkgKGFsbG9jLCBuYW1lKTsKLSAgICAgICAgIHAgPSBzdHJyY2hyIChhbGxvYywgJ18nKTsKLSAgICAgICAgICpwKysgPSAnXDAnOwotICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgICAgIChfKCJPdXRwdXQgZmlsZSByZXF1aXJlcyBzaGFyZWQgbGlicmFyeSBgJXMuc28uJXMnXG4iKSwKLSAgICAgICAgICAgIGFsbG9jLCBwKTsKLSAgICAgICAgIGZyZWUgKGFsbG9jKTsKLSAgICAgICB9Ci0KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgYSBQTFQvR09ULCB3ZSBkbyBub3QgZXZlbiBuZWVkIHRvIGxvb2sgYXQKLSAgICAgaXQuICAqLwotICBpc19wbHQgPSBJU19QTFRfU1lNIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotCi0gIGlmIChpc19wbHQgfHwgSVNfR09UX1NZTSAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKSkKLSAgICB7Ci0gICAgICAvKiBMb29rIHVwIHRoaXMgc3ltYm9sIHR3aWNlLiAgT25jZSBqdXN0IGFzIGEgcmVndWxhciBsb29rdXAsCi0gICAgICAgIGFuZCB0aGVuIGFnYWluIGZvbGxvd2luZyBhbGwgb2YgdGhlIGluZGlyZWN0IGxpbmtzIHVudGlsIHdlCi0gICAgICAgIHJlYWNoIGEgcmVhbCBzeW1ib2wuICAqLwotICAgICAgaDEgPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIC8qIGgyIGRvZXMgbm90IGZvbGxvdyBpbmRpcmVjdCBzeW1ib2xzLiAqLwotICAgICAgaDIgPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgICAgIC8qIFRoZSByZWFsIHN5bWJvbCBtdXN0IGV4aXN0IGJ1dCBpZiBpdCBpcyBhbHNvIGFuIEFCUyBzeW1ib2wsCi0gICAgICAgIHRoZXJlIGlzIG5vIG5lZWQgdG8gaGF2ZSBhIGZpeHVwLiAgVGhpcyBpcyBiZWNhdXNlIHRoZXkgYm90aAotICAgICAgICBjYW1lIGZyb20gdGhlIHNhbWUgbGlicmFyeS4gIElmIG9uIHRoZSBvdGhlciBoYW5kLCB3ZSBoYWQgdG8KLSAgICAgICAgdXNlIGFuIGluZGlyZWN0IHN5bWJvbCB0byBnZXQgdG8gdGhlIHJlYWwgc3ltYm9sLCB3ZSBhZGQgdGhlCi0gICAgICAgIGZpeHVwIGFueXdheSwgc2luY2UgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoZXNlIHN5bWJvbHMgY29tZQotICAgICAgICBmcm9tIGRpZmZlcmVudCBzaGFyZWQgbGlicmFyaWVzICovCi0gICAgICBpZiAoaDEgIT0gTlVMTAotICAgICAgICAgJiYgKCgoaDEtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgICAgICAgICAgfHwgaDEtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICAgICAgICAgJiYgISBiZmRfaXNfYWJzX3NlY3Rpb24gKGgxLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0gICAgICAgICAgICAgfHwgaDItPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpKQotICAgICAgIHsKLSAgICAgICAgIC8qIFNlZSBpZiB0aGVyZSBpcyBhICJidWlsdGluIiBmaXh1cCBhbHJlYWR5IHByZXNlbnQKLSAgICAgICAgICAgIGludm9sdmluZyB0aGlzIHN5bWJvbC4gIElmIHNvLCBjb252ZXJ0IGl0IHRvIGEgcmVndWxhcgotICAgICAgICAgICAgZml4dXAuICBJbiB0aGUgZW5kLCB0aGlzIHJlbGF4ZXMgc29tZSBvZiB0aGUgcmVxdWlyZW1lbnRzCi0gICAgICAgICAgICBhYm91dCB0aGUgb3JkZXIgb2YgcGVyZm9ybWluZyBmaXh1cHMuICAqLwotICAgICAgICAgZXhpc3RzID0gZmFsc2U7Ci0gICAgICAgICBmb3IgKGYxID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7Ci0gICAgICAgICAgICAgIGYxICE9IE5VTEw7Ci0gICAgICAgICAgICAgIGYxID0gZjEtPm5leHQpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBpZiAoKGYxLT5oICE9IGggJiYgZjEtPmggIT0gaDEpCi0gICAgICAgICAgICAgICAgIHx8ICghIGYxLT5idWlsdGluICYmICEgZjEtPmp1bXApKQotICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgaWYgKGYxLT5oID09IGgxKQotICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgIGlmICghIGV4aXN0cwotICAgICAgICAgICAgICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgZiA9IG5ld19maXh1cCAoaW5mbywgaDEsIGYxLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUsIDApOwotICAgICAgICAgICAgICAgICBmLT5qdW1wID0gaXNfcGx0OwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIGYxLT5oID0gaDE7Ci0gICAgICAgICAgICAgZjEtPmp1bXAgPSBpc19wbHQ7Ci0gICAgICAgICAgICAgZjEtPmJ1aWx0aW4gPSAwOwotICAgICAgICAgICAgIGV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgIH0KLSAgICAgICAgIGlmICghIGV4aXN0cwotICAgICAgICAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgZiA9IG5ld19maXh1cCAoaW5mbywgaDEsIGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwgMCk7Ci0gICAgICAgICAgICAgaWYgKGYgPT0gTlVMTCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgLyogRklYTUU6IE5vIHdheSB0byByZXR1cm4gZXJyb3IuICAqLwotICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBmLT5qdW1wID0gaXNfcGx0OwotICAgICAgICAgICB9Ci0gICAgICAgfQotCi0gICAgICAvKiBRdWljayBhbmQgZGlydHkgd2F5IG9mIHN0cmlwcGluZyB0aGVzZSBzeW1ib2xzIGZyb20gdGhlCi0gICAgICAgIHN5bXRhYi4gKi8KLSAgICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLSAgICAgICBoLT5yb290LndyaXR0ZW4gPSB0cnVlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSAubGludXgtZHluYW1pYyBzZWN0aW9uIGlzLgotICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBMaW51eCBsaW5rZXIgZW11bGF0aW9uIGJlZm9yZV9hbGxvY2F0aW9uCi0gICByb3V0aW5lLiAgV2UgaGF2ZSBmaW5pc2hlZCByZWFkaW5nIGFsbCBvZiB0aGUgaW5wdXQgZmlsZXMsIGFuZCBub3cKLSAgIHdlIGp1c3Qgc2NhbiB0aGUgaGFzaCB0YWJsZXMgdG8gZmluZCBvdXQgaG93IG1hbnkgYWRkaXRpb25hbCBmaXh1cHMKLSAgIGFyZSByZXF1aXJlZC4gICovCi0KLWJvb2xlYW4KLWJmZF9zcGFyY2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGZpeHVwICpmOwotICBhc2VjdGlvbiAqczsKLQotICBpZiAob3V0cHV0X2JmZC0+eHZlYyAhPSAmTVkodmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGaXJzdCBmaW5kIHRoZSBmaXh1cHMuLi4gKi8KLSAgbGludXhfbGlua19oYXNoX3RyYXZlcnNlIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbnV4X3RhbGx5X3N5bWJvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoUFRSKSBpbmZvKTsKLQotICAvKiBJZiB0aGVyZSBhcmUgYnVpbHRpbiBmaXh1cHMsIGxlYXZlIHJvb20gZm9yIGEgbWFya2VyLiAgVGhpcyBpcwotICAgICB1c2VkIGJ5IHRoZSBkeW5hbWljIGxpbmtlciBzbyB0aGF0IGl0IGtub3dzIHRoYXQgYWxsIHRoYXQgZm9sbG93Ci0gICAgIGFyZSBidWlsdGluIGZpeHVwcyBpbnN0ZWFkIG9mIHJlZ3VsYXIgZml4dXBzLiAgKi8KLSAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgewotICAgICAgaWYgKGYtPmJ1aWx0aW4pCi0gICAgICAgewotICAgICAgICAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQ7Ci0gICAgICAgICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5sb2NhbF9idWlsdGluczsKLSAgICAgICAgIGJyZWFrOwotICAgICAgIH0KLSAgICB9Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ID4gMCkKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGZpeHVwIHRhYmxlLiAgV2Ugd2lsbCBmaWxsIGl0IGluIGxhdGVyLiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5saW51eC1keW5hbWljIik7Ci0gIGlmIChzICE9IE5VTEwpCi0gICAgewotICAgICAgcy0+X3Jhd19zaXplID0gOCArIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCAqIDg7Ci0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLSAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBtZW1zZXQgKHMtPmNvbnRlbnRzLCAwLCAoc2l6ZV90KSBzLT5fcmF3X3NpemUpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgY29tZSBoZXJlIG9uY2Ugd2UgYXJlIHJlYWR5IHRvIGFjdHVhbGx5IHdyaXRlIHRoZSBmaXh1cCB0YWJsZSB0bwotICAgdGhlIG91dHB1dCBmaWxlLiAgU2NhbiB0aGUgZml4dXAgdGFibGVzIGFuZCBzbyBmb3J0aCBhbmQgZ2VuZXJhdGUKLSAgIHRoZSBzdHVmZiB3ZSBuZWVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzLCAqb3MsICppczsKLSAgYmZkX2J5dGUgKmZpeHVwX3RhYmxlOwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgZml4dXAgKmY7Ci0gIHVuc2lnbmVkIGludCBuZXdfYWRkcjsKLSAgaW50IHNlY3Rpb25fb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgZml4dXBzX3dyaXR0ZW47Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgb3MgPSBzLT5vdXRwdXRfc2VjdGlvbjsKLSAgZml4dXBzX3dyaXR0ZW4gPSAwOwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICBwcmludGYgKCJGaXh1cCB0YWJsZSBmaWxlIG9mZnNldDogJXggIFZNQTogJXhcbiIsCi0gICAgICAgICBvcy0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCi0gICAgICAgICBvcy0+dm1hICsgcy0+b3V0cHV0X29mZnNldCk7Ci0jZW5kaWYKLQotICBmaXh1cF90YWJsZSA9IHMtPmNvbnRlbnRzOwotICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQsIGZpeHVwX3RhYmxlKTsKLSAgZml4dXBfdGFibGUgKz0gNDsKLQotICAvKiBGaWxsIGluIGZpeHVwIHRhYmxlLiAgKi8KLSAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgewotICAgICAgaWYgKGYtPmJ1aWx0aW4pCi0gICAgICAgY29udGludWU7Ci0KLSAgICAgIGlmIChmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICAgICYmIGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICB7Ci0gICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgKF8oIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iKSwKLSAgICAgICAgICAgIGYtPmgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0gICAgICAgICBjb250aW51ZTsKLSAgICAgICB9Ci0KLSAgICAgIGlzID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBuZXdfYWRkciA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgcHJpbnRmICgiRml4dXAoJWQpICVzOiAleCAleFxuIixmLT5qdW1wLCBmLT5oLT5yb290LnJvb3Quc3RyaW5nLAotICAgICAgICAgICAgIG5ld19hZGRyLCBmLT52YWx1ZSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKGYtPmp1bXApCi0gICAgICAgewotICAgICAgICAgLyogUmVsYXRpdmUgYWRkcmVzcyAqLwotICAgICAgICAgbmV3X2FkZHIgPSBuZXdfYWRkciAtIChmLT52YWx1ZSArIDUpOwotCSBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotICAgICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlICsgMSwgZml4dXBfdGFibGUpOwotICAgICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLSAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSwgZml4dXBfdGFibGUpOwotICAgICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICB9Ci0gICAgICArK2ZpeHVwc193cml0dGVuOwotICAgIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zICE9IDApCi0gICAgewotICAgICAgLyogU3BlY2lhbCBtYXJrZXIgc28gd2Uga25vdyB0byBzd2l0Y2ggdG8gdGhlIG90aGVyIHR5cGUgb2YgZml4dXAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLSAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICAgIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotICAgICAgIHsKLSAgICAgICAgIGlmICghIGYtPmJ1aWx0aW4pCi0gICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICBpZiAoZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICAgICAgJiYgZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgICAgICAgICAoXygiU3ltYm9sICVzIG5vdCBkZWZpbmVkIGZvciBmaXh1cHNcbiIpLAotICAgICAgICAgICAgICAgIGYtPmgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0gICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIH0KLQotICAgICAgICAgaXMgPSBmLT5oLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgICAgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLSAgICAgICAgIG5ld19hZGRyID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gICAgICAgICBwcmludGYgKCJGaXh1cChCKSAlczogJXggJXhcbiIsIGYtPmgtPnJvb3Qucm9vdC5zdHJpbmcsCi0gICAgICAgICAgICAgICAgIG5ld19hZGRyLCBmLT52YWx1ZSk7Ci0jZW5kaWYKLQotICAgICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLSAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSwgZml4dXBfdGFibGUpOwotICAgICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgICAgfQotICB9Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCAhPSBmaXh1cHNfd3JpdHRlbikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIldhcm5pbmc6IGZpeHVwIGNvdW50IG1pc21hdGNoXG4iKSk7Ci0gICAgICB3aGlsZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ID4gZml4dXBzX3dyaXR0ZW4pCi0gICAgICAgewotICAgICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLSAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICAgICArK2ZpeHVwc193cml0dGVuOwotICAgICAgIH0KLSAgICB9Ci0KLSAgaCA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19CVUlMVElOX0ZJWFVQU19fIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgaWYgKGggIT0gTlVMTAotICAgICAgJiYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICB7Ci0gICAgICBpcyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgbmV3X2FkZHIgPSBoLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgICAgIHByaW50ZiAoIkJ1aWx0aW4gZml4dXAgdGFibGUgYXQgJXhcbiIsIG5ld19hZGRyKTsKLSNlbmRpZgotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotICAgIH0KLSAgZWxzZQotICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLQotICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsIG9zLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHMtPmNvbnRlbnRzLCAxLCBzLT5fcmF3X3NpemUsIG91dHB1dF9iZmQpCi0gICAgICAhPSBzLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIGxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgbGludXhfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgTVlfZmluaXNoX2R5bmFtaWNfbGluayBsaW51eF9maW5pc2hfZHluYW1pY19saW5rCi0KLSNkZWZpbmUgTVlfem1hZ2ljX2NvbnRpZ3VvdXMgMQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9zcGFyY2x5bnguYyBiL2JmZC9zcGFyY2x5bnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmY2FlNS4uMDAwMDAwMAotLS0gYS9iZmQvc3BhcmNseW54LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIFNwYXJjIGJpbmFyaWVzIHVuZGVyIEx5bnhPUy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSA0MDk2Ci0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9zcGFyYwotCi0jZW5kaWYKLQotI2RlZmluZSBNWShPUCkgQ0FUKHNwYXJjbHlueF9hb3V0XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtc3BhcmMtbHlueCIKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAiYW91dC9zdW40LmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgkJLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotCi0vKiBUaGlzIGlzIG5lZWRlZCB0byByZWplY3QgYSBOZXdzT1MgZmlsZSwgZS5nLiBpbgotICAgZ2RiL3Rlc3RzdWl0ZS9nZGIudDEwL2Nyb3NzbG9hZC5leHAuIDxraW5nZG9uQGN5Z251cy5jb20+Ci0gICBJIG5lZWRlZCB0byBhZGQgTV9VTktOT1dOIHRvIHJlY29nbml6ZSBhIDY4MDAwIG9iamVjdCwgc28gdGhpcyB3aWxsCi0gICBwcm9iYWJseSBubyBsb25nZXIgcmVqZWN0IGEgTmV3c09TIG9iamVjdC4gIDxpYW5AY3lnbnVzLmNvbT4uICovCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNX1VOS05PV04gXAotCQkJICAgIHx8IChtdHlwZSkgPT0gTV82ODAxMCBcCi0JCQkgICAgfHwgKG10eXBlKSA9PSBNXzY4MDIwIFwKLQkJCSAgICB8fCAobXR5cGUpID09IE1fU1BBUkMpCi0KLS8qCi1UaGUgZmlsZSBAY29kZXthb3V0ZjEuaH0gY29udGFpbnMgdGhlIGNvZGUgZm9yIEJGRCdzCi1hLm91dCBiYWNrIGVuZC4gQ29udHJvbCBvdmVyIHRoZSBnZW5lcmF0ZWQgYmFjayBlbmQgaXMgZ2l2ZW4gYnkgdGhlc2UKLXR3byBwcmVwcm9jZXNzb3IgbmFtZXM6Ci1AdGFibGUgQGNvZGUKLUBpdGVtIEFSQ0hfU0laRQotVGhpcyB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIDMyIG9yIDY0LCBkZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSBvZiBhbgotaW50IGluIHRoZSB0YXJnZXQgZm9ybWF0LiBJdCBjaGFuZ2VzIHRoZSBzaXplcyBvZiB0aGUgc3RydWN0cyB3aGljaAotcGVyZm9ybSB0aGUgbWVtb3J5L2Rpc2sgbWFwcGluZyBvZiBzdHJ1Y3R1cmVzLgotCi1UaGUgNjQgYml0IGJhY2tlbmQgbWF5IG9ubHkgYmUgdXNlZCBpZiB0aGUgaG9zdCBjb21waWxlciBzdXBwb3J0cyA2NAotaW50cyAoZWcgbG9uZyBsb25nIHdpdGggZ2NjKSwgYnkgZGVmaW5pbmcgdGhlIG5hbWUgQGNvZGV7QkZEX0hPU1RfNjRfQklUfSBpbiBAY29kZXtiZmQuaH0uCi1XaXRoIHRoaXMgbmFtZSBkZWZpbmVkLCBAZW1waHthbGx9IGJmZCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgd2l0aCA2NGJpdAotYXJpdGhtZXRpYywgbm90IGp1c3QgdGhvc2UgdG8gYSA2NGJpdCB0YXJnZXQuCi0KLUBpdGVtIFRBUkdFVE5BTUUKLVRoZSBuYW1lIHB1dCBpbnRvIHRoZSB0YXJnZXQgdmVjdG9yLgotQGl0ZW0KLUBlbmQgdGFibGUKLQotKi8KLQotLypTVVBQUkVTUzU1OCovCi0vKlNVUFBSRVNTNTI5Ki8KLQotdm9pZAotTkFNRShseW54LHNldF9hcmNoX21hY2gpIChhYmZkLCBtYWNodHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgbWFjaHR5cGU7Ci17Ci0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIGxvbmcgbWFjaGluZTsKLSAgc3dpdGNoIChtYWNodHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlIE1fVU5LTk9XTjoKLSAgICAgIC8qIFNvbWUgU3VuM3MgbWFrZSBtYWdpYyBudW1iZXJzIHdpdGhvdXQgY3B1IHR5cGVzIGluIHRoZW0sIHNvCi0JIHdlJ2xsIGRlZmF1bHQgdG8gdGhlIDY4MDAwLiAqLwotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfbTY4MDAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fNjgwMTA6Ci0gICAgY2FzZSBNX0hQMjAwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfbTY4MDEwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fNjgwMjA6Ci0gICAgY2FzZSBNX0hQMzAwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfbTY4MDIwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU1BBUkM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfc3BhcmM7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNXzM4NjoKLSAgICBjYXNlIE1fMzg2X0RZTklYOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2kzODY7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNXzI5SzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9hMjlrOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9IUFVYOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9vYnNjdXJlOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLX0KLQotI2RlZmluZSBTRVRfQVJDSF9NQUNIKEFCRkQsIEVYRUMpIFwKLSAgTkFNRShseW54LHNldF9hcmNoX21hY2gpKEFCRkQsIE5fTUFDSFRZUEUgKEVYRUMpKTsgXAotICBjaG9vc2VfcmVsb2Nfc2l6ZShBQkZEKTsKLQotLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgcmVsb2NhdGlvbiBlbnRyeSwgYmFzZWQgb24gdGhlIGFyY2hpdGVjdHVyZSAqLwotc3RhdGljIHZvaWQKLWNob29zZV9yZWxvY19zaXplIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICBjYXNlIGJmZF9hcmNoX2EyOWs6Ci0gICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19FWFRfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUgaW4gTHlueE9TIGZvcm1hdC4KLSAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCi0gIGZpbGUgaGVhZGVyLCBzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1OQU1FKGFvdXQsc3BhcmNseW54X3dyaXRlX29iamVjdF9jb250ZW50cykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIC8qIE1hZ2ljIG51bWJlciwgbWFlc3RybywgcGxlYXNlISAgKi8KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0JewotCWNhc2UgYmZkX21hY2hfbTY4MDEwOgotCSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV82ODAxMCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCWNhc2UgYmZkX21hY2hfbTY4MDIwOgotCSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV82ODAyMCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9TUEFSQyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzM4Nik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX2EyOWs6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzI5Syk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9VTktOT1dOKTsKLSAgICB9Ci0KLSAgY2hvb3NlX3JlbG9jX3NpemUgKGFiZmQpOwotCi0gIE5fU0VUX0ZMQUdTICgqZXhlY3AsIGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZXhlY19oZHJfZmxhZ3MpOwotCi0gIFdSSVRFX0hFQURFUlMgKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV9zZXRfc2l6ZXMgc3BhcmNseW54X3NldF9zaXplcwotc3RhdGljIGJvb2xlYW4KLXNwYXJjbHlueF9zZXRfc2l6ZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gMHgyMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IDB4MjAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gMHgyMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IDB4MjAwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhIHNwYXJjbHlueF9hb3V0X2JhY2tlbmQgPQotewotICAwLCAxLCAwLCAxLCAwLCBzcGFyY2x5bnhfc2V0X3NpemVzLCAwLAotICAwLAkJCQkvKiBhZGRfZHluYW1pY19zeW1ib2xzICovCi0gIDAsCQkJCS8qIGFkZF9vbmVfc3ltYm9sICovCi0gIDAsCQkJCS8qIGxpbmtfZHluYW1pY19vYmplY3QgKi8KLSAgMCwJCQkJLyogd3JpdGVfZHluYW1pY19zeW1ib2wgKi8KLSAgMCwJCQkJLyogY2hlY2tfZHluYW1pY19yZWxvYyAqLwotICAwCQkJCS8qIGZpbmlzaF9keW5hbWljX2xpbmsgKi8KLX07Ci0MCi0KLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQJCWJmZF92b2lkCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZAkJYmZkX3ZvaWQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZQlcCi0JCQkodm9pZCAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpKSBiZmRfdm9pZAotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cwlOQU1FKGFvdXQsc3BhcmNseW54X3dyaXRlX29iamVjdF9jb250ZW50cykKLSNkZWZpbmUgTVlfYmFja2VuZF9kYXRhCQkJJnNwYXJjbHlueF9hb3V0X2JhY2tlbmQKLQotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0KLSNpZmRlZiBMWU5YX0NPUkUKLQotY2hhciAqbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kICgpOwotaW50IGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsICgpOwotYm9vbGVhbiBseW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoKTsKLWNvbnN0IGJmZF90YXJnZXQgKmx5bnhfY29yZV9maWxlX3AgKCk7Ci0KLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBseW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfcCBseW54X2NvcmVfZmlsZV9wCi0KLSNlbmRpZiAvKiBMWU5YX0NPUkUgKi8KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvc3BhcmNuZXRic2QuYyBiL2JmZC9zcGFyY25ldGJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc3YmI4Li4wMDAwMDAwCi0tLSBhL2JmZC9zcGFyY25ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0Qvc3BhcmMgYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JECTQKLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0vKiBTUEFSQyBjaGlwcyB1c2UgZWl0aGVyIDRLIG9yIDhLIHBhZ2VzLCBidXQgb2JqZWN0IGZpbGVzIGFsd2F5cwotICAgYXNzdW1lIDhLIHBhZ2UgYWxpZ25tZW50IHNvIHRoZXkgd2lsbCB3b3JrIG9uIGVpdGhlciBvbmUuICovCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMHgyMDAwCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNICWJmZF9hcmNoX3NwYXJjCi0jZGVmaW5lIERFRkFVTFRfTUlEIAlNX1NQQVJDX05FVEJTRAotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoc3BhcmNuZXRic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtc3BhcmMtbmV0YnNkIgotCi0jaW5jbHVkZSAibmV0YnNkLmgiCmRpZmYgLS1naXQgYS9iZmQvc3JlYy5jIGIvYmZkL3NyZWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBkMmY5Ni4uMDAwMDAwMAotLS0gYS9iZmQvc3JlYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM3NyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIHMtcmVjb3JkIG9iamVjdHMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQgPHNhY0BjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU1VCU0VDVElPTgotCVMtUmVjb3JkIGhhbmRsaW5nCi0KLURFU0NSSVBUSU9OCi0JCi0JT3JkaW5hcnkgUy1SZWNvcmRzIGNhbm5vdCBob2xkIGFueXRoaW5nIGJ1dCBhZGRyZXNzZXMgYW5kCi0JZGF0YSwgc28gdGhhdCdzIGFsbCB0aGF0IHdlIGltcGxlbWVudC4KLQotCVRoZSBvbmx5IGludGVyZXN0aW5nIHRoaW5nIGlzIHRoYXQgUy1SZWNvcmRzIG1heSBjb21lIG91dCBvZgotCW9yZGVyIGFuZCB0aGVyZSBpcyBubyBoZWFkZXIsIHNvIGFuIGluaXRpYWwgc2NhbiBpcyByZXF1aXJlZAotCXRvIGRpc2NvdmVyIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGFkZHJlc3NlcyB1c2VkIHRvIGNyZWF0ZQotCXRoZSB2bWEgYW5kIHNpemUgb2YgdGhlIG9ubHkgc2VjdGlvbiB3ZSBjcmVhdGUuICBXZQotCWFyYml0cmFyaWx5IGNhbGwgdGhpcyBzZWN0aW9uICIudGV4dCIuCi0KLQlXaGVuIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyBpcyBjYWxsZWQgdGhlIGZpbGUgaXMgcmVhZAotCWFnYWluLCBhbmQgdGhpcyB0aW1lIHRoZSBkYXRhIGlzIHBsYWNlZCBpbnRvIGEgYmZkX2FsbG9jJ2QKLQlhcmVhLgotCi0JQW55IG51bWJlciBvZiBzZWN0aW9ucyBtYXkgYmUgY3JlYXRlZCBmb3Igb3V0cHV0LCB3ZSBzYXZlIHRoZW0KLQl1cCBhbmQgb3V0cHV0IHRoZW0gd2hlbiBpdCdzIHRpbWUgdG8gY2xvc2UgdGhlIGJmZC4KLQotCUFuIHMgcmVjb3JkIGxvb2tzIGxpa2U6Ci0JCi1FWEFNUExFCi0JUzx0eXBlPjxsZW5ndGg+PGFkZHJlc3M+PGRhdGE+PGNoZWNrc3VtPgotCQotREVTQ1JJUFRJT04KLQlXaGVyZQotCW8gbGVuZ3RoCi0JaXMgdGhlIG51bWJlciBvZiBieXRlcyBmb2xsb3dpbmcgdXB0byB0aGUgY2hlY2tzdW0uIE5vdGUgdGhhdAotCXRoaXMgaXMgbm90IHRoZSBudW1iZXIgb2YgY2hhcnMgZm9sbG93aW5nLCBzaW5jZSBpdCB0YWtlcyB0d28KLQljaGFycyB0byByZXByZXNlbnQgYSBieXRlLgotCW8gdHlwZQotCWlzIG9uZSBvZjoKLQkwKSBoZWFkZXIgcmVjb3JkCi0JMSkgdHdvIGJ5dGUgYWRkcmVzcyBkYXRhIHJlY29yZAotCTIpIHRocmVlIGJ5dGUgYWRkcmVzcyBkYXRhIHJlY29yZAotCTMpIGZvdXIgYnl0ZSBhZGRyZXNzIGRhdGEgcmVjb3JkCi0JNykgZm91ciBieXRlIGFkZHJlc3MgdGVybWluYXRpb24gcmVjb3JkCi0JOCkgdGhyZWUgYnl0ZSBhZGRyZXNzIHRlcm1pbmF0aW9uIHJlY29yZAotCTkpIHR3byBieXRlIGFkZHJlc3MgdGVybWluYXRpb24gcmVjb3JkCi0JCi0JbyBhZGRyZXNzCi0JaXMgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGRhdGEgZm9sbG93aW5nLCBvciBpbiB0aGUgY2FzZSBvZgotCWEgdGVybWluYXRpb24gcmVjb3JkLCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgaW1hZ2UKLQlvIGRhdGEKLQlpcyB0aGUgZGF0YS4KLQlvIGNoZWNrc3VtCi0JaXMgdGhlIHN1bSBvZiBhbGwgdGhlIHJhdyBieXRlIGRhdGEgaW4gdGhlIHJlY29yZCwgZnJvbSB0aGUgbGVuZ3RoCi0JdXB3YXJkcywgbW9kdWxvIDI1NiBhbmQgc3VidHJhY3RlZCBmcm9tIDI1NS4KLQotCi1TVUJTRUNUSU9OCi0JU3ltYm9sIFMtUmVjb3JkIGhhbmRsaW5nCi0KLURFU0NSSVBUSU9OCi0JU29tZSBJQ0UgZXF1aXBtZW50IHVuZGVyc3RhbmRzIGFuIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZAotCVMtUmVjb3JkIGZvcm1hdDsgc3ltYm9scyBhbmQgdGhlaXIgYWRkcmVzc2VzIGNhbiBiZSBzZW50Ci0JYmVmb3JlIHRoZSBkYXRhLgotCi0JVGhlIGZvcm1hdCBvZiB0aGlzIGlzOgotCSgkJCA8bW9kdWxlbmFtZT4KLQkJKDxzcGFjZT4gPHN5bWJvbD4gPGFkZHJlc3M+KSopCi0JJCQKLQotCXNvIGEgc2hvcnQgc3ltYm9sIHRhYmxlIGNvdWxkIGxvb2sgbGlrZToKLQotRVhBTVBMRQotCSQkIGZsYXNoLngKLQkkJCBmbGFzaC5jCi0JICBfcG9ydDYgJDAKLQkgIF9kZWxheSAkNAotCSAgX3N0YXJ0ICQxNAotCSAgX2V0ZXh0ICQ4MDM2Ci0JICBfZWRhdGEgJDgwMzYKLSAJICBfZW5kICQ4MDM2Ci0JJCQKLQotREVTQ1JJUFRJT04KLQlXZSBhbGxvdyBzeW1ib2xzIHRvIGJlIGFueXdoZXJlIGluIHRoZSBkYXRhIHN0cmVhbSAtIHRoZSBtb2R1bGUgbmFtZXMKLQlhcmUgYWx3YXlzIGlnbm9yZWQuCi0JCQotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLXN0YXRpYyB2b2lkIHNyZWNfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKTsKLXN0YXRpYyB2b2lkIHNyZWNfcHJpbnRfc3ltYm9sCi0gUEFSQU1TICgoYmZkICosIFBUUiwgYXN5bWJvbCAqLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLXN0YXRpYyB2b2lkIHNyZWNfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IHNyZWNfZ2V0X2J5dGUgUEFSQU1TICgoYmZkICosIGJvb2xlYW4gKikpOwotc3RhdGljIHZvaWQgc3JlY19iYWRfYnl0ZSBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfc2NhbiBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnNyZWNfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpzeW1ib2xzcmVjX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX3JlYWRfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBzcmVjX3dyaXRlX3JlY29yZCBQQVJBTVMgKChiZmQgKiwgaW50LCBiZmRfdm1hLAotCQkJCQkgIGNvbnN0IGJmZF9ieXRlICosCi0JCQkJCSAgY29uc3QgYmZkX2J5dGUgKikpOwotc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV9oZWFkZXIgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfd3JpdGVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3JlY19uZXdfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfc2V0X2FyY2hfbWFjaAotICBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBpbnRlcm5hbF9zcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3ltYm9sc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgc3JlY19zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotc3RhdGljIGFzeW1ib2wgKnNyZWNfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHNyZWNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgc3JlY19nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci0KLS8qIE1hY3JvcyBmb3IgY29udmVydGluZyBiZXR3ZWVuIGhleCBhbmQgYmluYXJ5LiAqLwotCi1zdGF0aWMgQ09OU1QgY2hhciBkaWdzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Ci0KLSNkZWZpbmUgTklCQkxFKHgpIGhleF92YWx1ZSh4KQotI2RlZmluZSBIRVgoYnVmZmVyKSAoKE5JQkJMRSgoYnVmZmVyKVswXSk8PDQpICsgTklCQkxFKChidWZmZXIpWzFdKSkKLSNkZWZpbmUgVE9IRVgoZCwgeCwgY2gpIFwKLQlkWzFdID0gZGlnc1soeCkgJiAweGZdOyBcCi0JZFswXSA9IGRpZ3NbKCh4KT4+NCkmMHhmXTsgXAotCWNoICs9ICgoeCkgJiAweGZmKTsKLSNkZWZpbmUJSVNIRVgoeCkgIGhleF9wKHgpCi0KLS8qIEluaXRpYWxpemUgYnkgZmlsbGluZyBpbiB0aGUgaGV4IGNvbnZlcnNpb24gYXJyYXkuICovCi0KLXN0YXRpYyB2b2lkCi1zcmVjX2luaXQgKCkKLXsKLSAgc3RhdGljIGJvb2xlYW4gaW5pdGVkID0gZmFsc2U7Ci0KLSAgaWYgKGluaXRlZCA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpbml0ZWQgPSB0cnVlOwotICAgICAgaGV4X2luaXQgKCk7Ci0gICAgfQotfQotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgb24gYSBsaW5lIGlzIEZGICovCi0jZGVmaW5lIE1BWENIVU5LIDB4ZmYKLS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgZml0IG9udG8gYSBsaW5lIG9uIG91dHB1dCAqLwotI2RlZmluZSBDSFVOSyAyMQotCi0vKiBXaGVuIHdyaXRpbmcgYW4gUy1yZWNvcmQgZmlsZSwgdGhlIFMtcmVjb3JkcyBjYW4gbm90IGJlIG91dHB1dCBhcwotICAgdGhleSBhcmUgc2Vlbi4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCB0aGVtIGluIG1lbW9yeS4gICovCi0KLXN0cnVjdCBzcmVjX2RhdGFfbGlzdF9zdHJ1Y3QKLXsKLSAgc3RydWN0IHNyZWNfZGF0YV9saXN0X3N0cnVjdCAqbmV4dDsKLSAgYmZkX2J5dGUgKmRhdGE7Ci0gIGJmZF92bWEgd2hlcmU7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IHNyZWNfZGF0YV9saXN0X3N0cnVjdCBzcmVjX2RhdGFfbGlzdF90eXBlOwotCi0vKiBXaGVuIHNjYW5uaW5nIHRoZSBTLXJlY29yZCBmaWxlLCBhIGxpbmtlZCBsaXN0IG9mIHNyZWNfc3ltYm9sCi0gICBzdHJ1Y3R1cmVzIGlzIGJ1aWx0IHRvIHJlcHJlc2VudCB0aGUgc3ltYm9sIHRhYmxlIChpZiB0aGVyZSBpcwotICAgb25lKS4gICovCi0KLXN0cnVjdCBzcmVjX3N5bWJvbAotewotICBzdHJ1Y3Qgc3JlY19zeW1ib2wgKm5leHQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGJmZF92bWEgdmFsOwotfTsKLQotLyogVGhlIFMtcmVjb3JkIHRkYXRhIGluZm9ybWF0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgc3JlY19kYXRhX3N0cnVjdAotICB7Ci0gICAgc3JlY19kYXRhX2xpc3RfdHlwZSAqaGVhZDsKLSAgICBzcmVjX2RhdGFfbGlzdF90eXBlICp0YWlsOwotICAgIHVuc2lnbmVkIGludCB0eXBlOwotICAgIHN0cnVjdCBzcmVjX3N5bWJvbCAqc3ltYm9sczsKLSAgICBzdHJ1Y3Qgc3JlY19zeW1ib2wgKnN5bXRhaWw7Ci0gICAgYXN5bWJvbCAqY3N5bWJvbHM7Ci0gIH0KLXRkYXRhX3R5cGU7Ci0KLXN0YXRpYyBib29sZWFuIHNyZWNfd3JpdGVfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgdGRhdGFfdHlwZSAqLAotCQkJCQkgICBzcmVjX2RhdGFfbGlzdF90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfd3JpdGVfdGVybWluYXRvciBQQVJBTVMgKChiZmQgKiwgdGRhdGFfdHlwZSAqKSk7Ci0KLS8qIFNldCB1cCB0aGUgUy1yZWNvcmQgdGRhdGEgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3JlY19ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzcmVjX2luaXQgKCk7Ci0KLSAgaWYgKGFiZmQtPnRkYXRhLnNyZWNfZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHRkYXRhX3R5cGUgKnRkYXRhID0gKHRkYXRhX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHRkYXRhX3R5cGUpKTsKLSAgICAgIGlmICh0ZGF0YSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGFiZmQtPnRkYXRhLnNyZWNfZGF0YSA9IHRkYXRhOwotICAgICAgdGRhdGEtPnR5cGUgPSAxOwotICAgICAgdGRhdGEtPmhlYWQgPSBOVUxMOwotICAgICAgdGRhdGEtPnRhaWwgPSBOVUxMOwotICAgICAgdGRhdGEtPnN5bWJvbHMgPSBOVUxMOwotICAgICAgdGRhdGEtPnN5bXRhaWwgPSBOVUxMOwotICAgICAgdGRhdGEtPmNzeW1ib2xzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBieXRlIGZyb20gYW4gUyByZWNvcmQgZmlsZS4gIFNldCAqRVJST1JQVFIgaWYgYW4gZXJyb3IKLSAgIG9jY3VycmVkLiAgUmV0dXJuIEVPRiBvbiBlcnJvciBvciBlbmQgb2YgZmlsZS4gICovCi0KLXN0YXRpYyBpbnQKLXNyZWNfZ2V0X2J5dGUgKGFiZmQsIGVycm9ycHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gKmVycm9ycHRyOwotewotICBiZmRfYnl0ZSBjOwotCi0gIGlmIChiZmRfcmVhZCAoJmMsIDEsIDEsIGFiZmQpICE9IDEpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKQotCSplcnJvcnB0ciA9IHRydWU7Ci0gICAgICByZXR1cm4gRU9GOwotICAgIH0KLQotICByZXR1cm4gKGludCkgKGMgJiAweGZmKTsKLX0KLQotLyogUmVwb3J0IGEgcHJvYmxlbSBpbiBhbiBTIHJlY29yZCBmaWxlLiAgRklYTUU6IFRoaXMgcHJvYmFibHkgc2hvdWxkCi0gICBub3QgY2FsbCBmcHJpbnRmLCBidXQgd2UgcmVhbGx5IGRvIG5lZWQgc29tZSBtZWNoYW5pc20gZm9yIHByaW50aW5nCi0gICBlcnJvciBtZXNzYWdlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lbm87Ci0gICAgIGludCBjOwotICAgICBib29sZWFuIGVycm9yOwotewotICBpZiAoYyA9PSBFT0YpCi0gICAgewotICAgICAgaWYgKCEgZXJyb3IpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZlsxMF07Ci0KLSAgICAgIGlmICghIGlzcHJpbnQgKGMpKQotCXNwcmludGYgKGJ1ZiwgIlxcJTAzbyIsICh1bnNpZ25lZCBpbnQpIGMpOwotICAgICAgZWxzZQotCXsKLQkgIGJ1ZlswXSA9IGM7Ci0JICBidWZbMV0gPSAnXDAnOwotCX0KLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczolZDogVW5leHBlY3RlZCBjaGFyYWN0ZXIgYCVzJyBpbiBTLXJlY29yZCBmaWxlXG4iKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubywgYnVmKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgIH0KLX0KLQotLyogQWRkIGEgbmV3IHN5bWJvbCBmb3VuZCBpbiBhbiBTLXJlY29yZCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfbmV3X3N5bWJvbCAoYWJmZCwgbmFtZSwgdmFsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3Qgc3JlY19zeW1ib2wgKm47Ci0KLSAgbiA9IChzdHJ1Y3Qgc3JlY19zeW1ib2wgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzcmVjX3N5bWJvbCkpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuLT5uYW1lID0gbmFtZTsKLSAgbi0+dmFsID0gdmFsOwotCi0gIGlmIChhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPnN5bWJvbHMgPT0gTlVMTCkKLSAgICBhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPnN5bWJvbHMgPSBuOwotICBlbHNlCi0gICAgYWJmZC0+dGRhdGEuc3JlY19kYXRhLT5zeW10YWlsLT5uZXh0ID0gbjsKLSAgYWJmZC0+dGRhdGEuc3JlY19kYXRhLT5zeW10YWlsID0gbjsKLSAgbi0+bmV4dCA9IE5VTEw7Ci0KLSAgKythYmZkLT5zeW1jb3VudDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCB0aGUgUyByZWNvcmQgZmlsZSBhbmQgdHVybiBpdCBpbnRvIHNlY3Rpb25zLiAgV2UgY3JlYXRlIGEgbmV3Ci0gICBzZWN0aW9uIGZvciBlYWNoIGNvbnRpZ3VvdXMgc2V0IG9mIGJ5dGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfc2NhbiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgYzsKLSAgdW5zaWduZWQgaW50IGxpbmVubyA9IDE7Ci0gIGJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLSAgYmZkX2J5dGUgKmJ1ZiA9IE5VTEw7Ci0gIHNpemVfdCBidWZzaXplID0gMDsKLSAgYXNlY3Rpb24gKnNlYyA9IE5VTEw7Ci0gIGNoYXIgKnN5bWJ1ZiA9IE5VTEw7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRikKLSAgICB7Ci0gICAgICAvKiBXZSBvbmx5IGJ1aWxkIHNlY3Rpb25zIGZyb20gY29udGlndW91cyBTLXJlY29yZHMsIHNvIGlmIHRoaXMKLSAgICAgICAgIGlzIG5vdCBhbiBTLXJlY29yZCwgdGhlbiBzdG9wIGJ1aWxkaW5nIGEgc2VjdGlvbi4gICovCi0gICAgICBpZiAoYyAhPSAnUycgJiYgYyAhPSAnXHInICYmIGMgIT0gJ1xuJykKLQlzZWMgPSBOVUxMOwotCi0gICAgICBzd2l0Y2ggKGMpCi0JewotCWRlZmF1bHQ6Ci0JICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JY2FzZSAnXG4nOgotCSAgKytsaW5lbm87Ci0JICBicmVhazsKLQotCWNhc2UgJ1xyJzoKLQkgIGJyZWFrOwotCi0JY2FzZSAnJCc6Ci0JICAvKiBTdGFydGluZyBhIG1vZHVsZSBuYW1lLCB3aGljaCB3ZSBpZ25vcmUuICAqLwotCSAgd2hpbGUgKChjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gJ1xuJwotCQkgJiYgYyAhPSBFT0YpCi0JICAgIDsKLQkgIGlmIChjID09IEVPRikKLQkgICAgewotCSAgICAgIHNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0KLQkgICsrbGluZW5vOwotCi0JICBicmVhazsKLQotCWNhc2UgJyAnOgotCSAgZG8KLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCBhbGM7Ci0JICAgICAgY2hhciAqcCwgKnN5bW5hbWU7Ci0JICAgICAgYmZkX3ZtYSBzeW12YWw7Ci0KLQkgICAgICAvKiBTdGFydGluZyBhIHN5bWJvbCBkZWZpbml0aW9uLiAgKi8KLQkgICAgICB3aGlsZSAoKGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSBFT0YKLQkJICAgICAmJiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKSkKLQkJOwotCi0JICAgICAgaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicpCi0JCWJyZWFrOwotCi0JICAgICAgaWYgKGMgPT0gRU9GKQotCQl7Ci0JCSAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIGFsYyA9IDEwOwotCSAgICAgIHN5bWJ1ZiA9IChjaGFyICopIGJmZF9tYWxsb2MgKGFsYyArIDEpOwotCSAgICAgIGlmIChzeW1idWYgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICBwID0gc3ltYnVmOwotCi0JICAgICAgKnArKyA9IGM7Ci0JICAgICAgd2hpbGUgKChjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GCi0JCSAgICAgJiYgISBpc3NwYWNlIChjKSkKLQkJewotCQkgIGlmICgodW5zaWduZWQgaW50KSAocCAtIHN5bWJ1ZikgPj0gYWxjKQotCQkgICAgewotCQkgICAgICBjaGFyICpuOwotCi0JCSAgICAgIGFsYyAqPSAyOwotCQkgICAgICBuID0gKGNoYXIgKikgYmZkX3JlYWxsb2MgKHN5bWJ1ZiwgYWxjICsgMSk7Ci0JCSAgICAgIGlmIChuID09IE5VTEwpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQkJICAgICAgcCA9IG4gKyAocCAtIHN5bWJ1Zik7Ci0JCSAgICAgIHN5bWJ1ZiA9IG47Ci0JCSAgICB9Ci0KLQkJICAqcCsrID0gYzsKLQkJfQotCi0JICAgICAgaWYgKGMgPT0gRU9GKQotCQl7Ci0JCSAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgICpwKysgPSAnXDAnOwotCSAgICAgIHN5bW5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHAgLSBzeW1idWYpOwotCSAgICAgIGlmIChzeW1uYW1lID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIHN0cmNweSAoc3ltbmFtZSwgc3ltYnVmKTsKLQkgICAgICBmcmVlIChzeW1idWYpOwotCSAgICAgIHN5bWJ1ZiA9IE5VTEw7Ci0KLQkgICAgICB3aGlsZSAoKGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSBFT0YKLQkJICAgICAmJiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKSkKLQkJOwotCSAgICAgIGlmIChjID09IEVPRikKLQkJewotCQkgIHNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICAvKiBTa2lwIGEgZG9sbGFyIHNpZ24gYmVmb3JlIHRoZSBoZXggdmFsdWUuICAqLwotCSAgICAgIGlmIChjID09ICckJykKLQkJewotCQkgIGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpOwotCQkgIGlmIChjID09IEVPRikKLQkJICAgIHsKLQkJICAgICAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBzeW12YWwgPSAwOwotCSAgICAgIHdoaWxlIChJU0hFWCAoYykpCi0JCXsKLQkJICBzeW12YWwgPDw9IDQ7Ci0JCSAgc3ltdmFsICs9IE5JQkJMRSAoYyk7Ci0JCSAgYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcik7Ci0JCX0KLQotCSAgICAgIGlmICghIHNyZWNfbmV3X3N5bWJvbCAoYWJmZCwgc3ltbmFtZSwgc3ltdmFsKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIHdoaWxlIChjID09ICcgJyB8fCBjID09ICdcdCcpOwotCi0JICBpZiAoYyA9PSAnXG4nKQotCSAgICArK2xpbmVubzsKLQkgIGVsc2UgaWYgKGMgIT0gJ1xyJykKLQkgICAgewotCSAgICAgIHNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotICAgIAotCWNhc2UgJ1MnOgotCSAgewotCSAgICBmaWxlX3B0ciBwb3M7Ci0JICAgIGNoYXIgaGRyWzNdOwotCSAgICB1bnNpZ25lZCBpbnQgYnl0ZXM7Ci0JICAgIGJmZF92bWEgYWRkcmVzczsKLQkgICAgYmZkX2J5dGUgKmRhdGE7Ci0KLQkgICAgLyogU3RhcnRpbmcgYW4gUy1yZWNvcmQuICAqLwotCi0JICAgIHBvcyA9IGJmZF90ZWxsIChhYmZkKSAtIDE7Ci0KLQkgICAgaWYgKGJmZF9yZWFkIChoZHIsIDEsIDMsIGFiZmQpICE9IDMpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgaWYgKCEgSVNIRVggKGhkclsxXSkgfHwgISBJU0hFWCAoaGRyWzJdKSkKLQkgICAgICB7Ci0JCWlmICghIElTSEVYIChoZHJbMV0pKQotCQkgIGMgPSBoZHJbMV07Ci0JCWVsc2UKLQkJICBjID0gaGRyWzJdOwotCQlzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgfQotCi0JICAgIGJ5dGVzID0gSEVYIChoZHIgKyAxKTsKLQkgICAgaWYgKGJ5dGVzICogMiA+IGJ1ZnNpemUpCi0JICAgICAgewotCQlpZiAoYnVmICE9IE5VTEwpCi0JCSAgZnJlZSAoYnVmKTsKLQkJYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGJ5dGVzICogMik7Ci0JCWlmIChidWYgPT0gTlVMTCkKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJYnVmc2l6ZSA9IGJ5dGVzICogMjsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGJmZF9yZWFkIChidWYsIDEsIGJ5dGVzICogMiwgYWJmZCkgIT0gYnl0ZXMgKiAyKQotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgIC8qIElnbm9yZSB0aGUgY2hlY2tzdW0gYnl0ZS4gICovCi0JICAgIC0tYnl0ZXM7Ci0KLQkgICAgYWRkcmVzcyA9IDA7Ci0JICAgIGRhdGEgPSBidWY7Ci0JICAgIHN3aXRjaCAoaGRyWzBdKQotCSAgICAgIHsKLQkgICAgICBjYXNlICcwJzoKLQkgICAgICBjYXNlICc1JzoKLQkJLyogUHJvbG9ndWUtLWlnbm9yZSB0aGUgZmlsZSBuYW1lLCBidXQgc3RvcCBidWlsZGluZyBhCi0gICAgICAgICAgICAgICAgICAgc2VjdGlvbiBhdCB0aGlzIHBvaW50LiAgKi8KLQkJc2VjID0gTlVMTDsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlICczJzoKLQkJYWRkcmVzcyA9IEhFWCAoZGF0YSk7Ci0JCWRhdGEgKz0gMjsKLQkJLS1ieXRlczsKLQkJLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgICBjYXNlICcyJzoKLQkJYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQktLWJ5dGVzOwotCQkvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICAgIGNhc2UgJzEnOgotCQlhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0JCWFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JCWRhdGEgKz0gMjsKLQkJYnl0ZXMgLT0gMjsKLQotCQlpZiAoc2VjICE9IE5VTEwKLQkJICAgICYmIHNlYy0+dm1hICsgc2VjLT5fcmF3X3NpemUgPT0gYWRkcmVzcykKLQkJICB7Ci0JCSAgICAvKiBUaGlzIGRhdGEgZ29lcyBhdCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uIHdlIGFyZQotICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHkgYnVpbGRpbmcuICAqLwotCQkgICAgc2VjLT5fcmF3X3NpemUgKz0gYnl0ZXM7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgY2hhciBzZWNidWZbMjBdOwotCQkgICAgY2hhciAqc2VjbmFtZTsKLQotCQkgICAgc3ByaW50ZiAoc2VjYnVmLCAiLnNlYyVkIiwgYmZkX2NvdW50X3NlY3Rpb25zIChhYmZkKSArIDEpOwotCQkgICAgc2VjbmFtZSA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChzZWNidWYpICsgMSk7Ci0JCSAgICBzdHJjcHkgKHNlY25hbWUsIHNlY2J1Zik7Ci0JCSAgICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBzZWNuYW1lKTsKLQkJICAgIGlmIChzZWMgPT0gTlVMTCkKLQkJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICBzZWMtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotCQkgICAgc2VjLT52bWEgPSBhZGRyZXNzOwotCQkgICAgc2VjLT5sbWEgPSBhZGRyZXNzOwotCQkgICAgc2VjLT5fcmF3X3NpemUgPSBieXRlczsKLQkJICAgIHNlYy0+ZmlsZXBvcyA9IHBvczsKLQkJICB9Ci0KLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlICc3JzoKLQkJYWRkcmVzcyA9IEhFWCAoZGF0YSk7Ci0JCWRhdGEgKz0gMjsKLQkJLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgICBjYXNlICc4JzoKLQkJYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQkvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICAgIGNhc2UgJzknOgotCQlhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0JCWFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JCWRhdGEgKz0gMjsKLQotCQkvKiBUaGlzIGlzIGEgdGVybWluYXRpb24gcmVjb3JkLiAgKi8KLQkJYWJmZC0+c3RhcnRfYWRkcmVzcyA9IGFkZHJlc3M7Ci0KLQkJaWYgKGJ1ZiAhPSBOVUxMKQotCQkgIGZyZWUgKGJ1Zik7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoZXJyb3IpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzeW1idWYgIT0gTlVMTCkKLSAgICBmcmVlIChzeW1idWYpOwotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBDaGVjayB3aGV0aGVyIGFuIGV4aXN0aW5nIGZpbGUgaXMgYW4gUy1yZWNvcmQgZmlsZS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXNyZWNfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX2J5dGUgYls0XTsKLQotICBzcmVjX2luaXQgKCk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoYiwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoYlswXSAhPSAnUycgfHwgIUlTSEVYIChiWzFdKSB8fCAhSVNIRVggKGJbMl0pIHx8ICFJU0hFWCAoYlszXSkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKCEgc3JlY19ta29iamVjdCAoYWJmZCkKLSAgICAgIHx8ICEgc3JlY19zY2FuIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoYWJmZC0+c3ltY291bnQgPiAwKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi0vKiBDaGVjayB3aGV0aGVyIGFuIGV4aXN0aW5nIGZpbGUgaXMgYW4gUy1yZWNvcmQgZmlsZSB3aXRoIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1zeW1ib2xzcmVjX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgYlsyXTsKLQotICBzcmVjX2luaXQgKCk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoYiwgMSwgMiwgYWJmZCkgIT0gMikKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoYlswXSAhPSAnJCcgfHwgYlsxXSAhPSAnJCcpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKCEgc3JlY19ta29iamVjdCAoYWJmZCkKLSAgICAgIHx8ICEgc3JlY19zY2FuIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoYWJmZC0+c3ltY291bnQgPiAwKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi0vKiBSZWFkIGluIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24gaW4gYW4gUy1yZWNvcmQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX3JlYWRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgY29udGVudHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLXsKLSAgaW50IGM7Ci0gIGJmZF9zaXplX3R5cGUgc29mYXIgPSAwOwotICBib29sZWFuIGVycm9yID0gZmFsc2U7Ci0gIGJmZF9ieXRlICpidWYgPSBOVUxMOwotICBzaXplX3QgYnVmc2l6ZSA9IDA7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICB3aGlsZSAoKGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSBFT0YpCi0gICAgewotICAgICAgYmZkX2J5dGUgaGRyWzNdOwotICAgICAgdW5zaWduZWQgaW50IGJ5dGVzOwotICAgICAgYmZkX3ZtYSBhZGRyZXNzOwotICAgICAgYmZkX2J5dGUgKmRhdGE7Ci0KLSAgICAgIGlmIChjID09ICdccicgfHwgYyA9PSAnXG4nKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBUaGlzIGlzIGNhbGxlZCBhZnRlciBzcmVjX3NjYW4gaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQsIHNvIHdlCi0gICAgICAgICBvdWdodCB0byBrbm93IHRoZSBleGFjdCBmb3JtYXQuICAqLwotICAgICAgQkZEX0FTU0VSVCAoYyA9PSAnUycpOwotCi0gICAgICBpZiAoYmZkX3JlYWQgKGhkciwgMSwgMywgYWJmZCkgIT0gMykKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgQkZEX0FTU0VSVCAoSVNIRVggKGhkclsxXSkgJiYgSVNIRVggKGhkclsyXSkpOwotCi0gICAgICBieXRlcyA9IEhFWCAoaGRyICsgMSk7Ci0KLSAgICAgIGlmIChieXRlcyAqIDIgPiBidWZzaXplKQotCXsKLQkgIGlmIChidWYgIT0gTlVMTCkKLQkgICAgZnJlZSAoYnVmKTsKLQkgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChieXRlcyAqIDIpOwotCSAgaWYgKGJ1ZiA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGJ1ZnNpemUgPSBieXRlcyAqIDI7Ci0JfQotCi0gICAgICBpZiAoYmZkX3JlYWQgKGJ1ZiwgMSwgYnl0ZXMgKiAyLCBhYmZkKSAhPSBieXRlcyAqIDIpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGFkZHJlc3MgPSAwOwotICAgICAgZGF0YSA9IGJ1ZjsKLSAgICAgIHN3aXRjaCAoaGRyWzBdKQotCXsKLQlkZWZhdWx0OgotCSAgQkZEX0FTU0VSVCAoc29mYXIgPT0gc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkgIGlmIChidWYgIT0gTlVMTCkKLQkgICAgZnJlZSAoYnVmKTsKLQkgIHJldHVybiB0cnVlOwotCi0JY2FzZSAnMyc6Ci0JICBhZGRyZXNzID0gSEVYIChkYXRhKTsKLQkgIGRhdGEgKz0gMjsKLQkgIC0tYnl0ZXM7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgJzInOgotCSAgYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkgIGRhdGEgKz0gMjsKLQkgIC0tYnl0ZXM7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgJzEnOgotCSAgYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkgIGRhdGEgKz0gMjsKLQkgIGFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JICBkYXRhICs9IDI7Ci0JICBieXRlcyAtPSAyOwotCi0JICBpZiAoYWRkcmVzcyAhPSBzZWN0aW9uLT52bWEgKyBzb2ZhcikKLQkgICAgewotCSAgICAgIC8qIFdlJ3ZlIGNvbWUgdG8gdGhlIGVuZCBvZiB0aGlzIHNlY3Rpb24uICAqLwotCSAgICAgIEJGRF9BU1NFUlQgKHNvZmFyID09IHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGJ1ZiAhPSBOVUxMKQotCQlmcmVlIChidWYpOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0KLQkgIC8qIERvbid0IGNvbnNpZGVyIGNoZWNrc3VtLiAgKi8KLQkgIC0tYnl0ZXM7Ci0KLQkgIHdoaWxlIChieXRlcy0tICE9IDApCi0JICAgIHsKLQkgICAgICBjb250ZW50c1tzb2Zhcl0gPSBIRVggKGRhdGEpOwotCSAgICAgIGRhdGEgKz0gMjsKLQkgICAgICArK3NvZmFyOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGVycm9yKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIEJGRF9BU1NFUlQgKHNvZmFyID09IHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEdldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGluIGFuIFMtcmVjb3JkIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoc2VjdGlvbi0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZWN0aW9uLT51c2VkX2J5X2JmZCA9IGJmZF9hbGxvYyAoYWJmZCwgc2VjdGlvbi0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzZWN0aW9uLT51c2VkX2J5X2JmZCA9PSBOVUxMCi0JICAmJiBzZWN0aW9uLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIHNyZWNfcmVhZF9zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBzZWN0aW9uLT51c2VkX2J5X2JmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBtZW1jcHkgKGxvY2F0aW9uLCAoYmZkX2J5dGUgKikgc2VjdGlvbi0+dXNlZF9ieV9iZmQgKyBvZmZzZXQsCi0JICAoc2l6ZV90KSBjb3VudCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgYXJjaGl0ZWN0dXJlLiAgV2UgYWNjZXB0IGFuIHVua25vd24gYXJjaGl0ZWN0dXJlIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3JlY19zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2g7Ci17Ci0gIGlmIChhcmNoID09IGJmZF9hcmNoX3Vua25vd24pCi0gICAgewotICAgICAgYWJmZC0+YXJjaF9pbmZvID0gJmJmZF9kZWZhdWx0X2FyY2hfc3RydWN0OwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaCk7Ci19Ci0KLS8qIHdlIGhhdmUgdG8gc2F2ZSB1cCBhbGwgdGhlIFNyZWNvcmRzIGZvciBhIHNwbHVyZ2UgYmVmb3JlIG91dHB1dCAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgYnl0ZXNfdG9fZG8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBieXRlc190b19kbzsKLXsKLSAgdGRhdGFfdHlwZSAqdGRhdGEgPSBhYmZkLT50ZGF0YS5zcmVjX2RhdGE7Ci0gIHJlZ2lzdGVyIHNyZWNfZGF0YV9saXN0X3R5cGUgKmVudHJ5OwotCi0gIGVudHJ5ID0gKChzcmVjX2RhdGFfbGlzdF90eXBlICopCi0JICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHNyZWNfZGF0YV9saXN0X3R5cGUpKSk7Ci0gIGlmIChlbnRyeSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYnl0ZXNfdG9fZG8KLSAgICAgICYmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykKLSAgICAgICYmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19MT0FEKSkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGFiZmQsIGJ5dGVzX3RvX2RvKTsKLSAgICAgIGlmIChkYXRhID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbWVtY3B5ICgoUFRSKSBkYXRhLCBsb2NhdGlvbiwgKHNpemVfdCkgYnl0ZXNfdG9fZG8pOwotCi0gICAgICBpZiAoKHNlY3Rpb24tPmxtYSArIG9mZnNldCArIGJ5dGVzX3RvX2RvIC0gMSkgPD0gMHhmZmZmKQotCXsKLQotCX0KLSAgICAgIGVsc2UgaWYgKChzZWN0aW9uLT5sbWEgKyBvZmZzZXQgKyBieXRlc190b19kbyAtIDEpIDw9IDB4ZmZmZmZmCi0JICAgICAgICYmIHRkYXRhLT50eXBlIDw9IDIpCi0JewotCSAgdGRhdGEtPnR5cGUgPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB0ZGF0YS0+dHlwZSA9IDM7Ci0JfQotCi0gICAgICBlbnRyeS0+ZGF0YSA9IGRhdGE7Ci0gICAgICBlbnRyeS0+d2hlcmUgPSBzZWN0aW9uLT5sbWEgKyBvZmZzZXQ7Ci0gICAgICBlbnRyeS0+c2l6ZSA9IGJ5dGVzX3RvX2RvOwotCi0gICAgICAvKiBTb3J0IHRoZSByZWNvcmRzIGJ5IGFkZHJlc3MuICBPcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mCi0gICAgICAgICBhZGRpbmcgYSByZWNvcmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gICovCi0gICAgICBpZiAodGRhdGEtPnRhaWwgIT0gTlVMTAotCSAgJiYgZW50cnktPndoZXJlID49IHRkYXRhLT50YWlsLT53aGVyZSkKLQl7Ci0JICB0ZGF0YS0+dGFpbC0+bmV4dCA9IGVudHJ5OwotCSAgZW50cnktPm5leHQgPSBOVUxMOwotCSAgdGRhdGEtPnRhaWwgPSBlbnRyeTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcmVnaXN0ZXIgc3JlY19kYXRhX2xpc3RfdHlwZSAqKmxvb2s7Ci0KLQkgIGZvciAobG9vayA9ICZ0ZGF0YS0+aGVhZDsKLQkgICAgICAgKmxvb2sgIT0gTlVMTCAmJiAoKmxvb2spLT53aGVyZSA8IGVudHJ5LT53aGVyZTsKLQkgICAgICAgbG9vayA9ICYoKmxvb2spLT5uZXh0KQotCSAgICA7Ci0JICBlbnRyeS0+bmV4dCA9ICpsb29rOwotCSAgKmxvb2sgPSBlbnRyeTsKLQkgIGlmIChlbnRyeS0+bmV4dCA9PSBOVUxMKQotCSAgICB0ZGF0YS0+dGFpbCA9IGVudHJ5OwotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBhIHJlY29yZCBvZiB0eXBlLCBvZiB0aGUgc3VwcGxpZWQgbnVtYmVyIG9mIGJ5dGVzLiBUaGUKLSAgIHN1cHBsaWVkIGJ5dGVzIGFuZCBsZW5ndGggZG9uJ3QgaGF2ZSBhIGNoZWNrc3VtLiBUaGF0J3Mgd29ya2VkIG91dAotICAgaGVyZQotKi8KLXN0YXRpYyBib29sZWFuCi1zcmVjX3dyaXRlX3JlY29yZCAoYWJmZCwgdHlwZSwgYWRkcmVzcywgZGF0YSwgZW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB0eXBlOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci0gICAgIGNvbnN0IGJmZF9ieXRlICpkYXRhOwotICAgICBjb25zdCBiZmRfYnl0ZSAqZW5kOwotewotICBjaGFyIGJ1ZmZlcltNQVhDSFVOS107Ci0gIHVuc2lnbmVkIGludCBjaGVja19zdW0gPSAwOwotICBDT05TVCBiZmRfYnl0ZSAqc3JjID0gZGF0YTsKLSAgY2hhciAqZHN0ID0gYnVmZmVyOwotICBjaGFyICpsZW5ndGg7Ci0gIGJmZF9zaXplX3R5cGUgd3JsZW47Ci0KLSAgKmRzdCsrID0gJ1MnOwotICAqZHN0KysgPSAnMCcgKyB0eXBlOwotCi0gIGxlbmd0aCA9IGRzdDsKLSAgZHN0ICs9IDI7CQkJLyogbGVhdmUgcm9vbSBmb3IgZHN0Ki8KLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgMzoKLSAgICBjYXNlIDc6Ci0gICAgICBUT0hFWCAoZHN0LCAoYWRkcmVzcyA+PiAyNCksIGNoZWNrX3N1bSk7Ci0gICAgICBkc3QgKz0gMjsKLSAgICBjYXNlIDg6Ci0gICAgY2FzZSAyOgotICAgICAgVE9IRVggKGRzdCwgKGFkZHJlc3MgPj4gMTYpLCBjaGVja19zdW0pOwotICAgICAgZHN0ICs9IDI7Ci0gICAgY2FzZSA5OgotICAgIGNhc2UgMToKLSAgICBjYXNlIDA6Ci0gICAgICBUT0hFWCAoZHN0LCAoYWRkcmVzcyA+PiA4KSwgY2hlY2tfc3VtKTsKLSAgICAgIGRzdCArPSAyOwotICAgICAgVE9IRVggKGRzdCwgKGFkZHJlc3MpLCBjaGVja19zdW0pOwotICAgICAgZHN0ICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIH0KLSAgZm9yIChzcmMgPSBkYXRhOyBzcmMgPCBlbmQ7IHNyYysrKQotICAgIHsKLSAgICAgIFRPSEVYIChkc3QsICpzcmMsIGNoZWNrX3N1bSk7Ci0gICAgICBkc3QgKz0gMjsKLSAgICB9Ci0KLSAgLyogRmlsbCBpbiB0aGUgbGVuZ3RoICovCi0gIFRPSEVYIChsZW5ndGgsIChkc3QgLSBsZW5ndGgpIC8gMiwgY2hlY2tfc3VtKTsKLSAgY2hlY2tfc3VtICY9IDB4ZmY7Ci0gIGNoZWNrX3N1bSA9IDI1NSAtIGNoZWNrX3N1bTsKLSAgVE9IRVggKGRzdCwgY2hlY2tfc3VtLCBjaGVja19zdW0pOwotICBkc3QgKz0gMjsKLQotICAqZHN0KysgPSAnXHInOwotICAqZHN0KysgPSAnXG4nOwotICB3cmxlbiA9IGRzdCAtIGJ1ZmZlcjsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmZmVyLCAxLCB3cmxlbiwgYWJmZCkgIT0gd3JsZW4pCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX3dyaXRlX2hlYWRlciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfYnl0ZSBidWZmZXJbTUFYQ0hVTktdOwotICBiZmRfYnl0ZSAqZHN0ID0gYnVmZmVyOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICAvKiBJJ2xsIHB1dCBhbiBhcmJpdGFyeSA0MCBjaGFyIGxpbWl0IG9uIGhlYWRlciBzaXplICovCi0gIGZvciAoaSA9IDA7IGkgPCA0MCAmJiBhYmZkLT5maWxlbmFtZVtpXTsgaSsrKQotICAgIHsKLSAgICAgICpkc3QrKyA9IGFiZmQtPmZpbGVuYW1lW2ldOwotICAgIH0KLSAgcmV0dXJuIHNyZWNfd3JpdGVfcmVjb3JkIChhYmZkLCAwLCAwLCBidWZmZXIsIGRzdCk7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zcmVjX3dyaXRlX3NlY3Rpb24gKGFiZmQsIHRkYXRhLCBsaXN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHRkYXRhX3R5cGUgKnRkYXRhOwotICAgICBzcmVjX2RhdGFfbGlzdF90eXBlICpsaXN0OwotewotICB1bnNpZ25lZCBpbnQgYnl0ZXNfd3JpdHRlbiA9IDA7Ci0gIGJmZF9ieXRlICpsb2NhdGlvbiA9IGxpc3QtPmRhdGE7Ci0KLSAgd2hpbGUgKGJ5dGVzX3dyaXR0ZW4gPCBsaXN0LT5zaXplKQotICAgIHsKLSAgICAgIGJmZF92bWEgYWRkcmVzczsKLQotICAgICAgdW5zaWduZWQgaW50IGJ5dGVzX3RoaXNfY2h1bmsgPSBsaXN0LT5zaXplIC0gYnl0ZXNfd3JpdHRlbjsKLQotICAgICAgaWYgKGJ5dGVzX3RoaXNfY2h1bmsgPiBDSFVOSykKLQl7Ci0JICBieXRlc190aGlzX2NodW5rID0gQ0hVTks7Ci0JfQotCi0gICAgICBhZGRyZXNzID0gbGlzdC0+d2hlcmUgKyBieXRlc193cml0dGVuOwotCi0gICAgICBpZiAoISBzcmVjX3dyaXRlX3JlY29yZCAoYWJmZCwKLQkJCSAgICAgICB0ZGF0YS0+dHlwZSwKLQkJCSAgICAgICBhZGRyZXNzLAotCQkJICAgICAgIGxvY2F0aW9uLAotCQkJICAgICAgIGxvY2F0aW9uICsgYnl0ZXNfdGhpc19jaHVuaykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBieXRlc193cml0dGVuICs9IGJ5dGVzX3RoaXNfY2h1bms7Ci0gICAgICBsb2NhdGlvbiArPSBieXRlc190aGlzX2NodW5rOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfdGVybWluYXRvciAoYWJmZCwgdGRhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdGRhdGFfdHlwZSAqdGRhdGE7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlclsyXTsKLQotICByZXR1cm4gc3JlY193cml0ZV9yZWNvcmQgKGFiZmQsIDEwIC0gdGRhdGEtPnR5cGUsCi0JCQkgICAgYWJmZC0+c3RhcnRfYWRkcmVzcywgYnVmZmVyLCBidWZmZXIpOwotfQotCi0KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIGJ1ZmZlcltNQVhDSFVOS107Ci0gIC8qIER1bXAgb3V0IHRoZSBzeW1ib2xzIG9mIGEgYmZkICovCi0gIGludCBpOwotICBpbnQgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQotICBpZiAoY291bnQpCi0gICAgewotICAgICAgc2l6ZV90IGxlbjsKLSAgICAgIGFzeW1ib2wgKip0YWJsZSA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gICAgICBzcHJpbnRmIChidWZmZXIsICIkJCAlc1xyXG4iLCBhYmZkLT5maWxlbmFtZSk7Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoYnVmZmVyKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZmZlciwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQl7Ci0JICBhc3ltYm9sICpzID0gdGFibGVbaV07Ci0JICBpZiAoISBiZmRfaXNfbG9jYWxfbGFiZWwgKGFiZmQsIHMpCi0JICAgICAgJiYgKHMtPmZsYWdzICYgQlNGX0RFQlVHR0lORykgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEp1c3QgZHVtcCBvdXQgbm9uIGRlYnVnIHN5bWJvbHMgKi8KLQkgICAgICBiZmRfc2l6ZV90eXBlIGw7Ci0JICAgICAgY2hhciBidWYyWzQwXSwgKnA7Ci0KLQkgICAgICBzcHJpbnRmX3ZtYSAoYnVmMiwKLQkJCSAgIHMtPnZhbHVlICsgcy0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmxtYQotCQkJICAgKyBzLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICBwID0gYnVmMjsKLQkgICAgICB3aGlsZSAocFswXSA9PSAnMCcgJiYgcFsxXSAhPSAwKQotCQlwKys7Ci0JICAgICAgc3ByaW50ZiAoYnVmZmVyLCAiICAlcyAkJXNcclxuIiwgcy0+bmFtZSwgcCk7Ci0JICAgICAgbCA9IHN0cmxlbiAoYnVmZmVyKTsKLQkgICAgICBpZiAoYmZkX3dyaXRlIChidWZmZXIsIGwsIDEsIGFiZmQpICE9IGwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIHNwcmludGYgKGJ1ZmZlciwgIiQkIFxyXG4iKTsKLSAgICAgIGxlbiA9IHN0cmxlbiAoYnVmZmVyKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZmZlciwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBzeW1ib2xzOwotewotICB0ZGF0YV90eXBlICp0ZGF0YSA9IGFiZmQtPnRkYXRhLnNyZWNfZGF0YTsKLSAgc3JlY19kYXRhX2xpc3RfdHlwZSAqbGlzdDsKLQotICBpZiAoc3ltYm9scykKLSAgICB7Ci0gICAgICBpZiAoISBzcmVjX3dyaXRlX3N5bWJvbHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgc3JlY193cml0ZV9oZWFkZXIgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd2FuZGVyIHRob3VnaCBhbGwgdGhlIHNlY3Rpb25zIHByb3ZpZGVkIGFuZCBvdXRwdXQgdGhlbSAqLwotICBsaXN0ID0gdGRhdGEtPmhlYWQ7Ci0KLSAgd2hpbGUgKGxpc3QgIT0gKHNyZWNfZGF0YV9saXN0X3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBzcmVjX3dyaXRlX3NlY3Rpb24gKGFiZmQsIHRkYXRhLCBsaXN0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgICB9Ci0gIHJldHVybiBzcmVjX3dyaXRlX3Rlcm1pbmF0b3IgKGFiZmQsIHRkYXRhKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBpbnRlcm5hbF9zcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCwgMCk7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zeW1ib2xzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQsIDEpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLXNyZWNfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjOwotewotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotc3JlY19tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgbmVlZGVkIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1zcmVjX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSArIDEpICogc2l6ZW9mIChhc3ltYm9sICopOwotfQotCi0vKiBSZXR1cm4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1zcmVjX2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICB1bnNpZ25lZCBpbnQgc3ltY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgYXN5bWJvbCAqY3N5bWJvbHM7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGNzeW1ib2xzID0gYWJmZC0+dGRhdGEuc3JlY19kYXRhLT5jc3ltYm9sczsKLSAgaWYgKGNzeW1ib2xzID09IE5VTEwpCi0gICAgewotICAgICAgYXN5bWJvbCAqYzsKLSAgICAgIHN0cnVjdCBzcmVjX3N5bWJvbCAqczsKLQotICAgICAgY3N5bWJvbHMgPSAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIHN5bWNvdW50ICogc2l6ZW9mIChhc3ltYm9sKSk7Ci0gICAgICBpZiAoY3N5bWJvbHMgPT0gTlVMTCAmJiBzeW1jb3VudCAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+Y3N5bWJvbHMgPSBjc3ltYm9sczsKLQotICAgICAgZm9yIChzID0gYWJmZC0+dGRhdGEuc3JlY19kYXRhLT5zeW1ib2xzLCBjID0gY3N5bWJvbHM7Ci0JICAgcyAhPSBOVUxMOwotCSAgIHMgPSBzLT5uZXh0LCArK2MpCi0JewotCSAgYy0+dGhlX2JmZCA9IGFiZmQ7Ci0JICBjLT5uYW1lID0gcy0+bmFtZTsKLQkgIGMtPnZhbHVlID0gcy0+dmFsOwotCSAgYy0+ZmxhZ3MgPSBCU0ZfR0xPQkFMOwotCSAgYy0+c2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBjLT51ZGF0YS5wID0gTlVMTDsKLQl9Ci0gICAgfQotCQotICBmb3IgKGkgPSAwOyBpIDwgc3ltY291bnQ7IGkrKykKLSAgICAqYWxvY2F0aW9uKysgPSBjc3ltYm9scysrOwotICAqYWxvY2F0aW9uID0gTlVMTDsKLQotICByZXR1cm4gc3ltY291bnQ7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLXNyZWNfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLXNyZWNfcHJpbnRfc3ltYm9sIChpZ25vcmVfYWJmZCwgYWZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOwotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICUtNXMgJXMiLAotCSAgICAgICBzeW1ib2wtPnNlY3Rpb24tPm5hbWUsCi0JICAgICAgIHN5bWJvbC0+bmFtZSk7Ci0KLSAgICB9Ci19Ci0KLSNkZWZpbmUJc3JlY19jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgc3JlY19iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgc3JlY19uZXdfc2VjdGlvbl9ob29rIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rCi0KLSNkZWZpbmUgc3JlY19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIHNyZWNfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIHNyZWNfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgc3JlY19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHNyZWNfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBzcmVjX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIHNyZWNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfMGwpCi0jZGVmaW5lIHNyZWNfY2Fub25pY2FsaXplX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBiZmRfMGwpCi0jZGVmaW5lIHNyZWNfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgc3JlY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgc3JlY19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIHNyZWNfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBzcmVjX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBzcmVjX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIHNyZWNfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgc3JlY19iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBzcmVjX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi1jb25zdCBiZmRfdGFyZ2V0IHNyZWNfdmVjID0KLXsKLSAgInNyZWMiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9zcmVjX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAgewotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIHNyZWNfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgc3JlY19ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgc3JlY193cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgMAotfTsKLQotCi0KLWNvbnN0IGJmZF90YXJnZXQgc3ltYm9sc3JlY192ZWMgPQotewotICAic3ltYm9sc3JlYyIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3NyZWNfZmxhdm91ciwKLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7Ci0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgc3ltYm9sc3JlY19vYmplY3RfcCwJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHNyZWNfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgYmZkX2ZhbHNlLAotICAgIHN5bWJvbHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvc3RhYi1zeW1zLmMgYi9iZmQvc3RhYi1zeW1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZmU2YzguLjAwMDAwMDAKLS0tIGEvYmZkL3N0YWItc3ltcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogVGFibGUgb2Ygc3RhYiBuYW1lcyBmb3IgdGhlIEJGRCBsaWJyYXJ5LgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotI2RlZmluZSBBUkNIX1NJWkUgMzIJCS8qIFZhbHVlIGRvZXNuJ3QgbWF0dGVyLiAqLwotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi0vKiBJZ25vcmUgZHVwbGljYXRlIHN0YWIgY29kZXM7IGp1c3QgcmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBmaXJzdAotICAgb25lLiAgKi8KLSNkZWZpbmUgX19kZWZpbmVfc3RhYihOQU1FLCBDT0RFLCBTVFJJTkcpIF9fZGVmaW5lX25hbWUoQ09ERSwgU1RSSU5HKQotI2RlZmluZSBfX2RlZmluZV9zdGFiX2R1cGxpY2F0ZShOQU1FLCBDT0RFLCBTVFJJTkcpCi0KLS8qIFRoZXNlIGFyZSBub3QgcmVhbGx5IHN0YWIgc3ltYm9scywgYnV0IGl0IGlzCi0gICBjb252ZW5pZW50IHRvIGhhdmUgdGhlbSBoZXJlIGZvciB0aGUgc2FrZSBvZiBubS4KLSAgIEZvciBjb21wbGV0ZW5lc3MsIHdlIGNvdWxkIGFsc28gYWRkIE5fVEVYVCBldGMsIGJ1dCB0aG9zZQotICAgYXJlIG5ldmVyIG5lZWRlZCwgc2luY2Ugbm0gdHJlYXRzIHRob3NlIHNwZWNpYWxseS4gKi8KLSNkZWZpbmUgRVhUUkFfU1lNQk9MUyBcCi0gIF9fZGVmaW5lX25hbWUgKE5fU0VUQSwgIlNFVEEiKS8qIEFic29sdXRlIHNldCBlbGVtZW50IHN5bWJvbCAqLyBcCi0gIF9fZGVmaW5lX25hbWUgKE5fU0VUVCwgIlNFVFQiKS8qIFRleHQgc2V0IGVsZW1lbnQgc3ltYm9sICovIFwKLSAgX19kZWZpbmVfbmFtZSAoTl9TRVRELCAiU0VURCIpLyogRGF0YSBzZXQgZWxlbWVudCBzeW1ib2wgKi8gXAotICBfX2RlZmluZV9uYW1lIChOX1NFVEIsICJTRVRCIikvKiBCc3Mgc2V0IGVsZW1lbnQgc3ltYm9sICovIFwKLSAgX19kZWZpbmVfbmFtZSAoTl9TRVRWLCAiU0VUViIpLyogUG9pbnRlciB0byBzZXQgdmVjdG9yIGluIGRhdGEgYXJlYS4gKi8gXAotICBfX2RlZmluZV9uYW1lIChOX0lORFIsICJJTkRSIikgXAotICBfX2RlZmluZV9uYW1lIChOX1dBUk5JTkcsICJXQVJOSU5HIikKLQotY29uc3QgY2hhciAqCi1iZmRfZ2V0X3N0YWJfbmFtZSAoY29kZSkKLSAgICAgaW50IGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0jZGVmaW5lIF9fZGVmaW5lX25hbWUodmFsLCBzdHIpIGNhc2UgdmFsOiByZXR1cm4gc3RyOwotI2luY2x1ZGUgImFvdXQvc3RhYi5kZWYiCi0gICAgICBFWFRSQV9TWU1CT0xTCi0gICAgfQotCi0gIHJldHVybiAoY29uc3QgY2hhciAqKSAwOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3N0YWJzLmMgYi9iZmQvc3RhYnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjMDAwZC4uMDAwMDAwMAotLS0gYS9iZmQvc3RhYnMuYworKysgL2Rldi9udWxsCkBAIC0xLDY1MSArMCwwIEBACi0vKiBTdGFicyBpbiBzZWN0aW9ucyBsaW5raW5nIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIHN1cHBvcnQgZm9yIGxpbmtpbmcgc3RhYnMgaW4gc2VjdGlvbnMsIGFzIHVzZWQKLSAgIG9uIENPRkYgYW5kIEVMRi4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0vKiBTdGFicyBlbnRyaWVzIHVzZSBhIDEyIGJ5dGUgZm9ybWF0OgotICAgICA0IGJ5dGUgc3RyaW5nIHRhYmxlIGluZGV4Ci0gICAgIDEgYnl0ZSBzdGFiIHR5cGUKLSAgICAgMSBieXRlIHN0YWIgb3RoZXIgZmllbGQKLSAgICAgMiBieXRlIHN0YWIgZGVzYyBmaWVsZAotICAgICA0IGJ5dGUgc3RhYiB2YWx1ZQotICAgRklYTUU6IFRoaXMgd2lsbCBoYXZlIHRvIGNoYW5nZSBmb3IgYSA2NCBiaXQgb2JqZWN0IGZvcm1hdC4KLQotICAgVGhlIHN0YWJzIHN5bWJvbHMgYXJlIGRpdmlkZWQgaW50byBjb21waWxhdGlvbiB1bml0cy4gIEZvciB0aGUKLSAgIGZpcnN0IGVudHJ5IGluIGVhY2ggdW5pdCwgdGhlIHR5cGUgb2YgMCwgdGhlIHZhbHVlIGlzIHRoZSBsZW5ndGggb2YKLSAgIHRoZSBzdHJpbmcgdGFibGUgZm9yIHRoaXMgdW5pdCwgYW5kIHRoZSBkZXNjIGZpZWxkIGlzIHRoZSBudW1iZXIgb2YKLSAgIHN0YWJzIHN5bWJvbHMgZm9yIHRoaXMgdW5pdC4gICovCi0KLSNkZWZpbmUgU1RSRFhPRkYgKDApCi0jZGVmaW5lIFRZUEVPRkYgKDQpCi0jZGVmaW5lIE9USEVST0ZGICg1KQotI2RlZmluZSBERVNDT0ZGICg2KQotI2RlZmluZSBWQUxPRkYgKDgpCi0jZGVmaW5lIFNUQUJTSVpFICgxMikKLQotLyogQSBoYXNoIHRhYmxlIHVzZWQgZm9yIGhlYWRlciBmaWxlcyB3aXRoIE5fQklOQ0wgZW50cmllcy4gICovCi0KLXN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBBIGxpbmtlZCBsaXN0IG9mIHRvdGFscyB0aGF0IHdlIGhhdmUgZm91bmQgZm9yIGEgcGFydGljdWxhciBoZWFkZXIKLSAgIGZpbGUuICAqLwotCi1zdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RvdGFscwotewotICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RvdGFscyAqbmV4dDsKLSAgYmZkX3ZtYSB0b3RhbDsKLX07Ci0KLS8qIEFuIGVudHJ5IGluIHRoZSBoZWFkZXIgZmlsZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogTGlzdCBvZiB0b3RhbHMgd2UgaGF2ZSBmb3VuZCBmb3IgdGhpcyBmaWxlLiAgKi8KLSAgc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190b3RhbHMgKnRvdGFsczsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIHN0YWJfbGlua19pbmNsdWRlc19sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBhIGxpc3Qgb2YgTl9CSU5DTCBzeW1ib2xzLCBzb21lIG9mCi0gICB3aGljaCBtaWdodCBiZSBjb252ZXJ0ZWQgaW50byBOX0VYQ0wgc3ltYm9scy4gICovCi0KLXN0cnVjdCBzdGFiX2V4Y2xfbGlzdAotewotICAvKiBUaGUgbmV4dCBzeW1ib2wgdG8gY29udmVydC4gICovCi0gIHN0cnVjdCBzdGFiX2V4Y2xfbGlzdCAqbmV4dDsKLSAgLyogVGhlIG9mZnNldCB0byB0aGlzIHN5bWJvbCBpbiB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGJmZF9zaXplX3R5cGUgb2Zmc2V0OwotICAvKiBUaGUgdmFsdWUgdG8gdXNlIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgYmZkX3ZtYSB2YWw7Ci0gIC8qIFRoZSB0eXBlIG9mIHRoaXMgc3ltYm9sIChOX0JJTkNMIG9yIE5fRVhDTCkuICAqLwotICBpbnQgdHlwZTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHN0b3JlZCB3aXRoIGVhY2ggLnN0YWIgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbwotewotICAvKiBUaGlzIGlzIGEgbGlua2VkIGxpc3Qgb2YgTl9CSU5DTCBzeW1ib2xzIHdoaWNoIHNob3VsZCBiZQotICAgICBjb252ZXJ0ZWQgaW50byBOX0VYQ0wgc3ltYm9scy4gICovCi0gIHN0cnVjdCBzdGFiX2V4Y2xfbGlzdCAqZXhjbHM7Ci0KLSAgLyogVGhpcyBpcyB1c2VkIHRvIG1hcCBpbnB1dCBzdGFiIG9mZnNldHMgd2l0aGluIHRoZWlyIHNlY3Rpb25zCi0gICAgIHRvIG91dHB1dCBzdGFiIG9mZnNldHMsIHRvIHRha2UgaW50byBhY2NvdW50IHN0YWJzIHRoYXQgaGF2ZQotICAgICBiZWVuIGRlbGV0ZWQuICBJZiBpdCBpcyBOVUxMLCB0aGUgb3V0cHV0IG9mZnNldHMgYXJlIHRoZSBzYW1lCi0gICAgIGFzIHRoZSBpbnB1dCBvZmZzZXRzLCBiZWNhdXNlIG5vIHN0YWJzIGhhdmUgYmVlbiBkZWxldGVkIGZyb20KLSAgICAgdGhpcyBzZWN0aW9uLiAgT3RoZXJ3aXNlIHRoZSBpJ3RoIGVudHJ5IGlzIHRoZSBudW1iZXIgb2YKLSAgICAgYnl0ZXMgb2Ygc3RhYnMgdGhhdCBoYXZlIGJlZW4gZGVsZXRlZCBwcmlvciB0byB0aGUgaSd0aAotICAgICBzdGFiLiAqLwotICBiZmRfc2l6ZV90eXBlICpjdW11bGF0aXZlX3NraXBzOwotCi0gIC8qIFRoaXMgaXMgYW4gYXJyYXkgb2Ygc3RyaW5nIGluZGljZXMuICBGb3IgZWFjaCBzdGFiIHN5bWJvbCwgd2UKLSAgICAgc3RvcmUgdGhlIHN0cmluZyBpbmRleCBoZXJlLiAgSWYgYSBzdGFiIHN5bWJvbCBzaG91bGQgbm90IGJlCi0gICAgIGluY2x1ZGVkIGluIHRoZSBmaW5hbCBvdXRwdXQsIHRoZSBzdHJpbmcgaW5kZXggaXMgLTEuICAqLwotICBiZmRfc2l6ZV90eXBlIHN0cmlkeHNbMV07Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygc3RhYnMgaW4gc2VjdGlvbnMKLSAgIGluZm9ybWF0aW9uIHdoaWxlIGxpbmtpbmcuICAqLwotCi1zdHJ1Y3Qgc3RhYl9pbmZvCi17Ci0gIC8qIEEgaGFzaCB0YWJsZSB1c2VkIHRvIGhvbGQgc3RhYnMgc3RyaW5ncy4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cmluZ3M7Ci0gIC8qIFRoZSBoZWFkZXIgZmlsZSBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190YWJsZSBpbmNsdWRlczsKLSAgLyogVGhlIGZpcnN0IC5zdGFic3RyIHNlY3Rpb24uICAqLwotICBhc2VjdGlvbiAqc3RhYnN0cjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnN0YWJfbGlua19pbmNsdWRlc19uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci0MCi0vKiBUaGUgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IGVudHJ5IGluIHRoZSBoZWFkZXIgZmlsZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1zdGFiX2xpbmtfaW5jbHVkZXNfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT50b3RhbHMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0MCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBpbnB1dCBmaWxlIGZyb20gdGhlIGFkZF9zeW1ib2xzCi0gICBwYXNzIG9mIHRoZSBsaW5rZXIuICAqLwotCi1ib29sZWFuCi1fYmZkX2xpbmtfc2VjdGlvbl9zdGFicyAoYWJmZCwgcHNpbmZvLCBzdGFic2VjLCBzdGFic3Ryc2VjLCBwc2VjaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgKnBzaW5mbzsKLSAgICAgYXNlY3Rpb24gKnN0YWJzZWM7Ci0gICAgIGFzZWN0aW9uICpzdGFic3Ryc2VjOwotICAgICBQVFIgKnBzZWNpbmZvOwotewotICBib29sZWFuIGZpcnN0OwotICBzdHJ1Y3Qgc3RhYl9pbmZvICpzaW5mbzsKLSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICpzZWNpbmZvOwotICBiZmRfYnl0ZSAqc3RhYmJ1ZiA9IE5VTEw7Ci0gIGJmZF9ieXRlICpzdGFic3RyYnVmID0gTlVMTDsKLSAgYmZkX2J5dGUgKnN5bSwgKnN5bWVuZDsKLSAgYmZkX3NpemVfdHlwZSBzdHJvZmYsIG5leHRfc3Ryb2ZmLCBza2lwOwotICBiZmRfc2l6ZV90eXBlICpwc3RyaWR4OwotCi0gIGlmIChzdGFic2VjLT5fcmF3X3NpemUgPT0gMAotICAgICAgfHwgc3RhYnN0cnNlYy0+X3Jhd19zaXplID09IDApCi0gICAgewotICAgICAgLyogVGhpcyBmaWxlIGRvZXMgbm90IGNvbnRhaW4gc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoc3RhYnNlYy0+X3Jhd19zaXplICUgU1RBQlNJWkUgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgZm9ybWF0IG9mIHRoZXNlIHN0YWIgc3ltYm9scy4KLSAgICAgICAgIERvbid0IHRyeSB0byBvcHRpbWl6ZSB0aGVtLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoKHN0YWJzdHJzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFdlIHNob3VsZG4ndCBzZWUgcmVsb2NhdGlvbnMgaW4gdGhlIHN0cmluZ3MsIGFuZCB3ZSBhcmVuJ3QKLSAgICAgICAgIHByZXBhcmVkIHRvIGhhbmRsZSB0aGVtLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoKHN0YWJzZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHN0YWJzZWMtPm91dHB1dF9zZWN0aW9uKSkKLSAgICAgIHx8IChzdGFic3Ryc2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0JICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHN0YWJzdHJzZWMtPm91dHB1dF9zZWN0aW9uKSkpCi0gICAgewotICAgICAgLyogQXQgbGVhc3Qgb25lIG9mIHRoZSBzZWN0aW9ucyBpcyBiZWluZyBkaXNjYXJkZWQgZnJvbSB0aGUKLSAgICAgICAgIGxpbmssIHNvIHdlIHNob3VsZCBqdXN0IGlnbm9yZSB0aGVtLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBmaXJzdCA9IGZhbHNlOwotCi0gIGlmICgqcHNpbmZvID09IE5VTEwpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgc3RhYnMgaW5mb3JtYXRpb24gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mLiAgKi8KLSAgICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICpwc2luZm8gPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHN0YWJfaW5mbykpOwotICAgICAgaWYgKCpwc2luZm8gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHNpbmZvID0gKHN0cnVjdCBzdGFiX2luZm8gKikgKnBzaW5mbzsKLSAgICAgIHNpbmZvLT5zdHJpbmdzID0gX2JmZF9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgICAgIGlmIChzaW5mby0+c3RyaW5ncyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdF9uICgmc2luZm8tPmluY2x1ZGVzLnJvb3QsCi0JCQkJICAgc3RhYl9saW5rX2luY2x1ZGVzX25ld2Z1bmMsCi0JCQkJICAgMjUxKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHNpbmZvLT5zdGFic3RyID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIuc3RhYnN0ciIpOwotICAgICAgc2luZm8tPnN0YWJzdHItPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkgfCBTRUNfREVCVUdHSU5HOwotICAgIH0KLQotICBzaW5mbyA9IChzdHJ1Y3Qgc3RhYl9pbmZvICopICpwc2luZm87Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgaW5mb3JtYXRpb24gd2UgYXJlIGdvaW5nIHRvIHN0b3JlIGZvciB0aGlzIC5zdGFiCi0gICAgIHNlY3Rpb24uICAqLwotCi0gIGNvdW50ID0gc3RhYnNlYy0+X3Jhd19zaXplIC8gU1RBQlNJWkU7Ci0KLSAgKnBzZWNpbmZvID0gYmZkX2FsbG9jIChhYmZkLAotCQkJIChzaXplb2YgKHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbykKLQkJCSAgKyAoY291bnQgLSAxKSAqIHNpemVvZiAoYmZkX3NpemVfdHlwZSkpKTsKLSAgaWYgKCpwc2VjaW5mbyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHNlY2luZm8gPSAoc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICopICpwc2VjaW5mbzsKLSAgc2VjaW5mby0+ZXhjbHMgPSBOVUxMOwotICBzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzID0gTlVMTDsKLSAgbWVtc2V0IChzZWNpbmZvLT5zdHJpZHhzLCAwLCBjb3VudCAqIHNpemVvZiAoYmZkX3NpemVfdHlwZSkpOwotCi0gIC8qIFJlYWQgdGhlIHN0YWJzIGluZm9ybWF0aW9uIGZyb20gYWJmZC4gICovCi0KLSAgc3RhYmJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzdGFic2VjLT5fcmF3X3NpemUpOwotICBzdGFic3RyYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHN0YWJzdHJzZWMtPl9yYXdfc2l6ZSk7Ci0gIGlmIChzdGFiYnVmID09IE5VTEwgfHwgc3RhYnN0cmJ1ZiA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc3RhYnNlYywgc3RhYmJ1ZiwgMCwKLQkJCQkgIHN0YWJzZWMtPl9yYXdfc2l6ZSkKLSAgICAgIHx8ICEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzdGFic3Ryc2VjLCBzdGFic3RyYnVmLCAwLAotCQkJCSAgICAgc3RhYnN0cnNlYy0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHN0YWJzIHN5bWJvbHMsIHdvcmsgb3V0IHRoZSBuZXcgc3RyaW5nIGluZGljZXMsCi0gICAgIGFuZCBpZGVudGlmeSBOX0JJTkNMIHN5bWJvbHMgd2hpY2ggY2FuIGJlIGVsaW1pbmF0ZWQuICAqLwotCi0gIHN0cm9mZiA9IDA7Ci0gIG5leHRfc3Ryb2ZmID0gMDsKLSAgc2tpcCA9IDA7Ci0KLSAgc3ltZW5kID0gc3RhYmJ1ZiArIHN0YWJzZWMtPl9yYXdfc2l6ZTsKLSAgZm9yIChzeW0gPSBzdGFiYnVmLCBwc3RyaWR4ID0gc2VjaW5mby0+c3RyaWR4czsKLSAgICAgICBzeW0gPCBzeW1lbmQ7Ci0gICAgICAgc3ltICs9IFNUQUJTSVpFLCArK3BzdHJpZHgpCi0gICAgewotICAgICAgaW50IHR5cGU7Ci0gICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0KLSAgICAgIGlmICgqcHN0cmlkeCAhPSAwKQotCXsKLQkgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCBieSBhbiBOX0JJTkNMIHBhc3MuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICB0eXBlID0gc3ltW1RZUEVPRkZdOwotCi0gICAgICBpZiAodHlwZSA9PSAwKQotCXsKLQkgIC8qIFNwZWNpYWwgdHlwZSAwIHN0YWJzIGluZGljYXRlIHRoZSBvZmZzZXQgdG8gdGhlIG5leHQKLSAgICAgICAgICAgICBzdHJpbmcgdGFibGUuICBXZSBvbmx5IGNvcHkgdGhlIHZlcnkgZmlyc3Qgb25lLiAgKi8KLQkgIHN0cm9mZiA9IG5leHRfc3Ryb2ZmOwotCSAgbmV4dF9zdHJvZmYgKz0gYmZkX2dldF8zMiAoYWJmZCwgc3ltICsgOCk7Ci0JICBpZiAoISBmaXJzdCkKLQkgICAgewotCSAgICAgICpwc3RyaWR4ID0gKGJmZF9zaXplX3R5cGUpIC0xOwotCSAgICAgICsrc2tpcDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgZmlyc3QgPSBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIFN0b3JlIHRoZSBzdHJpbmcgaW4gdGhlIGhhc2ggdGFibGUsIGFuZCByZWNvcmQgdGhlIGluZGV4LiAgKi8KLSAgICAgIHN0cmluZyA9ICgoY2hhciAqKSBzdGFic3RyYnVmCi0JCSsgc3Ryb2ZmCi0JCSsgYmZkX2dldF8zMiAoYWJmZCwgc3ltICsgU1RSRFhPRkYpKTsKLSAgICAgICpwc3RyaWR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChzaW5mby0+c3RyaW5ncywgc3RyaW5nLCB0cnVlLCB0cnVlKTsKLQotICAgICAgLyogQW4gTl9CSU5DTCBzeW1ib2wgaW5kaWNhdGVzIHRoZSBzdGFydCBvZiB0aGUgc3RhYnMgZW50cmllcwotCSBmb3IgYSBoZWFkZXIgZmlsZS4gIFdlIG5lZWQgdG8gc2NhbiBhaGVhZCB0byB0aGUgbmV4dCBOX0VJTkNMCi0JIHN5bWJvbCwgaWdub3JpbmcgbmVzdGluZywgYWRkaW5nIHVwIGFsbCB0aGUgY2hhcmFjdGVycyBpbiB0aGUKLQkgc3ltYm9sIG5hbWVzLCBub3QgaW5jbHVkaW5nIHRoZSBmaWxlIG51bWJlcnMgaW4gdHlwZXMgKHRoZQotCSBmaXJzdCBudW1iZXIgYWZ0ZXIgYW4gb3BlbiBwYXJlbnRoZXNpcykuICAqLwotICAgICAgaWYgKHR5cGUgPT0gTl9CSU5DTCkKLQl7Ci0JICBiZmRfdm1hIHZhbDsKLQkgIGludCBuZXN0OwotCSAgYmZkX2J5dGUgKmluY2xfc3ltOwotCSAgc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqaW5jbF9lbnRyeTsKLQkgIHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfdG90YWxzICp0OwotCSAgc3RydWN0IHN0YWJfZXhjbF9saXN0ICpuZTsKLQotCSAgdmFsID0gMDsKLQkgIG5lc3QgPSAwOwotCSAgZm9yIChpbmNsX3N5bSA9IHN5bSArIFNUQUJTSVpFOwotCSAgICAgICBpbmNsX3N5bSA8IHN5bWVuZDsKLQkgICAgICAgaW5jbF9zeW0gKz0gU1RBQlNJWkUpCi0JICAgIHsKLQkgICAgICBpbnQgaW5jbF90eXBlOwotCi0JICAgICAgaW5jbF90eXBlID0gaW5jbF9zeW1bVFlQRU9GRl07Ci0JICAgICAgaWYgKGluY2xfdHlwZSA9PSAwKQotCQlicmVhazsKLQkgICAgICBlbHNlIGlmIChpbmNsX3R5cGUgPT0gTl9FSU5DTCkKLQkJewotCQkgIGlmIChuZXN0ID09IDApCi0JCSAgICBicmVhazsKLQkJICAtLW5lc3Q7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChpbmNsX3R5cGUgPT0gTl9CSU5DTCkKLQkJKytuZXN0OwotCSAgICAgIGVsc2UgaWYgKG5lc3QgPT0gMCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKnN0cjsKLQotCQkgIHN0ciA9ICgoY2hhciAqKSBzdGFic3RyYnVmCi0JCQkgKyBzdHJvZmYKLQkJCSArIGJmZF9nZXRfMzIgKGFiZmQsIGluY2xfc3ltICsgU1RSRFhPRkYpKTsKLQkJICBmb3IgKDsgKnN0ciAhPSAnXDAnOyBzdHIrKykKLQkJICAgIHsKLQkJICAgICAgdmFsICs9ICpzdHI7Ci0JCSAgICAgIGlmICgqc3RyID09ICcoJykKLQkJCXsKLQkJCSAgLyogU2tpcCB0aGUgZmlsZSBudW1iZXIuICAqLwotCQkJICArK3N0cjsKLQkJCSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqc3RyKSkKLQkJCSAgICArK3N0cjsKLQkJCSAgLS1zdHI7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgYSBoZWFkZXIgZmlsZSB3aXRoIHRoZSBzYW1lCi0JICAgICB2YWx1ZSwgdGhlbiByZXBsYWNlZCB0aGlzIG9uZSB3aXRoIGFuIE5fRVhDTCBzeW1ib2wuICAqLwotCSAgaW5jbF9lbnRyeSA9IHN0YWJfbGlua19pbmNsdWRlc19sb29rdXAgKCZzaW5mby0+aW5jbHVkZXMsIHN0cmluZywKLQkJCQkJCSAgdHJ1ZSwgdHJ1ZSk7Ci0JICBpZiAoaW5jbF9lbnRyeSA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgZm9yICh0ID0gaW5jbF9lbnRyeS0+dG90YWxzOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQotCSAgICBpZiAodC0+dG90YWwgPT0gdmFsKQotCSAgICAgIGJyZWFrOwotCi0JICAvKiBSZWNvcmQgdGhpcyBzeW1ib2wsIHNvIHRoYXQgd2UgY2FuIHNldCB0aGUgdmFsdWUKLSAgICAgICAgICAgICBjb3JyZWN0bHkuICAqLwotCSAgbmUgPSAoc3RydWN0IHN0YWJfZXhjbF9saXN0ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICpuZSk7Ci0JICBpZiAobmUgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBuZS0+b2Zmc2V0ID0gc3ltIC0gc3RhYmJ1ZjsKLQkgIG5lLT52YWwgPSB2YWw7Ci0JICBuZS0+dHlwZSA9IE5fQklOQ0w7Ci0JICBuZS0+bmV4dCA9IHNlY2luZm8tPmV4Y2xzOwotCSAgc2VjaW5mby0+ZXhjbHMgPSBuZTsKLQotCSAgaWYgKHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBzZWVuIHRoaXMgaGVhZGVyIGZpbGUKLQkJIHdpdGggdGhpcyBzZXQgb2Ygc3RhYnMgc3RyaW5ncy4gICovCi0JICAgICAgdCA9ICgoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190b3RhbHMgKikKLQkJICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZzaW5mby0+aW5jbHVkZXMucm9vdCwgc2l6ZW9mICp0KSk7Ci0JICAgICAgaWYgKHQgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgdC0+dG90YWwgPSB2YWw7Ci0JICAgICAgdC0+bmV4dCA9IGluY2xfZW50cnktPnRvdGFsczsKLQkgICAgICBpbmNsX2VudHJ5LT50b3RhbHMgPSB0OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfc2l6ZV90eXBlICppbmNsX3BzdHJpZHg7Ci0KLQkgICAgICAvKiBXZSBoYXZlIHNlZW4gdGhpcyBoZWFkZXIgZmlsZSBiZWZvcmUuICBUZWxsIHRoZSBmaW5hbAotCQkgcGFzcyB0byBjaGFuZ2UgdGhlIHR5cGUgdG8gTl9FWENMLiAgKi8KLQkgICAgICBuZS0+dHlwZSA9IE5fRVhDTDsKLQotCSAgICAgIC8qIE1hcmsgdGhlIHNraXBwZWQgc3ltYm9scy4gICovCi0KLQkgICAgICBuZXN0ID0gMDsKLQkgICAgICBmb3IgKGluY2xfc3ltID0gc3ltICsgU1RBQlNJWkUsIGluY2xfcHN0cmlkeCA9IHBzdHJpZHggKyAxOwotCQkgICBpbmNsX3N5bSA8IHN5bWVuZDsKLQkJICAgaW5jbF9zeW0gKz0gU1RBQlNJWkUsICsraW5jbF9wc3RyaWR4KQotCQl7Ci0JCSAgaW50IGluY2xfdHlwZTsKLQotCQkgIGluY2xfdHlwZSA9IGluY2xfc3ltW1RZUEVPRkZdOwotCi0JCSAgaWYgKGluY2xfdHlwZSA9PSBOX0VJTkNMKQotCQkgICAgewotCQkgICAgICBpZiAobmVzdCA9PSAwKQotCQkJewotCQkJICAqaW5jbF9wc3RyaWR4ID0gKGJmZF9zaXplX3R5cGUpIC0xOwotCQkJICArK3NraXA7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgICAtLW5lc3Q7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoaW5jbF90eXBlID09IE5fQklOQ0wpCi0JCSAgICArK25lc3Q7Ci0JCSAgZWxzZSBpZiAobmVzdCA9PSAwKQotCQkgICAgewotCQkgICAgICAqaW5jbF9wc3RyaWR4ID0gKGJmZF9zaXplX3R5cGUpIC0xOwotCQkgICAgICArK3NraXA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgZnJlZSAoc3RhYmJ1Zik7Ci0gIHN0YWJidWYgPSBOVUxMOwotICBmcmVlIChzdGFic3RyYnVmKTsKLSAgc3RhYnN0cmJ1ZiA9IE5VTEw7Ci0KLSAgLyogV2UgbmVlZCB0byBzZXQgdGhlIHNlY3Rpb24gc2l6ZXMgc3VjaCB0aGF0IHRoZSBsaW5rZXIgd2lsbAotICAgICBjb21wdXRlIHRoZSBvdXRwdXQgc2VjdGlvbiBzaXplcyBjb3JyZWN0bHkuICBXZSBzZXQgdGhlIC5zdGFiCi0gICAgIHNpemUgdG8gbm90IGluY2x1ZGUgdGhlIGVudHJpZXMgd2UgZG9uJ3Qgd2FudC4gIFdlIHNldAotICAgICBTRUNfRVhDTFVERSBmb3IgdGhlIC5zdGFic3RyIHNlY3Rpb24sIHNvIHRoYXQgaXQgd2lsbCBiZSBkcm9wcGVkCi0gICAgIGZyb20gdGhlIGxpbmsuICBXZSByZWNvcmQgdGhlIHNpemUgb2YgdGhlIHN0cnRhYiBpbiB0aGUgZmlyc3QKLSAgICAgLnN0YWJzdHIgc2VjdGlvbiB3ZSBzYXcsIGFuZCBtYWtlIHN1cmUgd2UgZG9uJ3Qgc2V0IFNFQ19FWENMVURFCi0gICAgIGZvciB0aGF0IHNlY3Rpb24uICAqLwotICBzdGFic2VjLT5fY29va2VkX3NpemUgPSAoY291bnQgLSBza2lwKSAqIFNUQUJTSVpFOwotICBpZiAoc3RhYnNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgc3RhYnNlYy0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0gIHN0YWJzdHJzZWMtPmZsYWdzIHw9IFNFQ19FWENMVURFOwotICBzaW5mby0+c3RhYnN0ci0+X2Nvb2tlZF9zaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoc2luZm8tPnN0cmluZ3MpOwotCi0gIC8qIENhbGN1bGF0ZSB0aGUgYGN1bXVsYXRpdmVfc2tpcHMnIGFycmF5IG5vdyB0aGF0IHN0YWJzIGhhdmUgYmVlbgotICAgICBkZWxldGVkIGZvciB0aGlzIHNlY3Rpb24uICovCi0KLSAgaWYgKHNraXAgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGksIG9mZnNldDsKLSAgICAgIGJmZF9zaXplX3R5cGUgKnBza2lwczsKLQotICAgICAgc2VjaW5mby0+Y3VtdWxhdGl2ZV9za2lwcyA9Ci0JKGJmZF9zaXplX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBjb3VudCAqIHNpemVvZiAoYmZkX3NpemVfdHlwZSkpOwotICAgICAgaWYgKHNlY2luZm8tPmN1bXVsYXRpdmVfc2tpcHMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgcHNraXBzID0gc2VjaW5mby0+Y3VtdWxhdGl2ZV9za2lwczsKLSAgICAgIHBzdHJpZHggPSBzZWNpbmZvLT5zdHJpZHhzOwotICAgICAgb2Zmc2V0ID0gMDsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHBza2lwcysrLCBwc3RyaWR4KyspCi0JewotCSAgKnBza2lwcyA9IG9mZnNldDsKLQkgIGlmICgqcHN0cmlkeCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JICAgIG9mZnNldCArPSBTVEFCU0laRTsKLQl9Ci0KLSAgICAgIEJGRF9BU1NFUlQgKG9mZnNldCAhPSAwKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzdGFiYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoc3RhYmJ1Zik7Ci0gIGlmIChzdGFic3RyYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoc3RhYnN0cmJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBzdGFiIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCB3aXRoIHRoZSByZWxvY2F0ZWQKLSAgIGNvbnRlbnRzLiAgKi8KLQotYm9vbGVhbgotX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzIChvdXRwdXRfYmZkLCBwc2luZm8sIHN0YWJzZWMsIHBzZWNpbmZvLCBjb250ZW50cykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBQVFIgKnBzaW5mbzsKLSAgICAgYXNlY3Rpb24gKnN0YWJzZWM7Ci0gICAgIFBUUiAqcHNlY2luZm87Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLXsKLSAgc3RydWN0IHN0YWJfaW5mbyAqc2luZm87Ci0gIHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbyAqc2VjaW5mbzsKLSAgc3RydWN0IHN0YWJfZXhjbF9saXN0ICplOwotICBiZmRfYnl0ZSAqc3ltLCAqdG9zeW0sICpzeW1lbmQ7Ci0gIGJmZF9zaXplX3R5cGUgKnBzdHJpZHg7Ci0KLSAgc2luZm8gPSAoc3RydWN0IHN0YWJfaW5mbyAqKSAqcHNpbmZvOwotICBzZWNpbmZvID0gKHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbyAqKSAqcHNlY2luZm87Ci0KLSAgaWYgKHNlY2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBzdGFic2VjLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkgICAgIGNvbnRlbnRzLCBzdGFic2VjLT5vdXRwdXRfb2Zmc2V0LAotCQkJCSAgICAgc3RhYnNlYy0+X3Jhd19zaXplKTsKLQotICAvKiBIYW5kbGUgZWFjaCBOX0JJTkNMIGVudHJ5LiAgKi8KLSAgZm9yIChlID0gc2VjaW5mby0+ZXhjbHM7IGUgIT0gTlVMTDsgZSA9IGUtPm5leHQpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmV4Y2xfc3ltOwotCi0gICAgICBCRkRfQVNTRVJUIChlLT5vZmZzZXQgPCBzdGFic2VjLT5fcmF3X3NpemUpOwotICAgICAgZXhjbF9zeW0gPSBjb250ZW50cyArIGUtPm9mZnNldDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGUtPnZhbCwgZXhjbF9zeW0gKyBWQUxPRkYpOwotICAgICAgZXhjbF9zeW1bVFlQRU9GRl0gPSBlLT50eXBlOwotICAgIH0KLQotICAvKiBDb3B5IG92ZXIgYWxsIHRoZSBzdGFicyBzeW1ib2xzLCBvbWl0dGluZyB0aGUgb25lcyB3ZSBkb24ndCB3YW50LAotICAgICBhbmQgY29ycmVjdGluZyB0aGUgc3RyaW5nIGluZGljZXMgZm9yIHRob3NlIHdlIGRvIHdhbnQuICAqLwotICB0b3N5bSA9IGNvbnRlbnRzOwotICBzeW1lbmQgPSBjb250ZW50cyArIHN0YWJzZWMtPl9yYXdfc2l6ZTsKLSAgZm9yIChzeW0gPSBjb250ZW50cywgcHN0cmlkeCA9IHNlY2luZm8tPnN0cmlkeHM7Ci0gICAgICAgc3ltIDwgc3ltZW5kOwotICAgICAgIHN5bSArPSBTVEFCU0laRSwgKytwc3RyaWR4KQotICAgIHsKLSAgICAgIGlmICgqcHN0cmlkeCAhPSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JewotCSAgaWYgKHRvc3ltICE9IHN5bSkKLQkgICAgbWVtY3B5ICh0b3N5bSwgc3ltLCBTVEFCU0laRSk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAqcHN0cmlkeCwgdG9zeW0gKyBTVFJEWE9GRik7Ci0KLQkgIGlmIChzeW1bVFlQRU9GRl0gPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgdGhlIGhlYWRlciBzeW1ib2wgZm9yIHRoZSBzdGFicyBzZWN0aW9uLiAgV2UKLSAgICAgICAgICAgICAgICAgZG9uJ3QgcmVhbGx5IG5lZWQgb25lLCBzaW5jZSB3ZSBoYXZlIG1lcmdlZCBhbGwgdGhlCi0gICAgICAgICAgICAgICAgIGlucHV0IHN0YWJzIHNlY3Rpb25zIGludG8gb25lLCBidXQgd2UgZ2VuZXJhdGUgb25lCi0gICAgICAgICAgICAgICAgIGZvciB0aGUgYmVuZWZpdCBvZiByZWFkZXJzIHdoaWNoIGV4cGVjdCB0byBzZWUgb25lLiAgKi8KLQkgICAgICBCRkRfQVNTRVJUIChzeW0gPT0gY29udGVudHMpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIF9iZmRfc3RyaW5ndGFiX3NpemUgKHNpbmZvLT5zdHJpbmdzKSwKLQkJCSAgdG9zeW0gKyBWQUxPRkYpOwotCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsCi0JCQkgIHN0YWJzZWMtPm91dHB1dF9zZWN0aW9uLT5fcmF3X3NpemUgLyBTVEFCU0laRSAtIDEsCi0JCQkgIHRvc3ltICsgREVTQ09GRik7Ci0JICAgIH0KLQotCSAgdG9zeW0gKz0gU1RBQlNJWkU7Ci0JfQotICAgIH0KLQotICBCRkRfQVNTRVJUICgoYmZkX3NpemVfdHlwZSkgKHRvc3ltIC0gY29udGVudHMpID09IHN0YWJzZWMtPl9jb29rZWRfc2l6ZSk7Ci0KLSAgcmV0dXJuIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgc3RhYnNlYy0+b3V0cHV0X3NlY3Rpb24sCi0JCQkJICAgY29udGVudHMsIHN0YWJzZWMtPm91dHB1dF9vZmZzZXQsCi0JCQkJICAgc3RhYnNlYy0+X2Nvb2tlZF9zaXplKTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSAuc3RhYnN0ciBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF93cml0ZV9zdGFiX3N0cmluZ3MgKG91dHB1dF9iZmQsIHBzaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBQVFIgKnBzaW5mbzsKLXsKLSAgc3RydWN0IHN0YWJfaW5mbyAqc2luZm87Ci0KLSAgc2luZm8gPSAoc3RydWN0IHN0YWJfaW5mbyAqKSAqcHNpbmZvOwotCi0gIGlmIChzaW5mbyA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNpbmZvLT5zdGFic3RyLT5vdXRwdXRfc2VjdGlvbikpCi0gICAgewotICAgICAgLyogVGhlIHNlY3Rpb24gd2FzIGRpc2NhcmRlZCBmcm9tIHRoZSBsaW5rLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBCRkRfQVNTRVJUICgoc2luZm8tPnN0YWJzdHItPm91dHB1dF9vZmZzZXQKLQkgICAgICAgKyBfYmZkX3N0cmluZ3RhYl9zaXplIChzaW5mby0+c3RyaW5ncykpCi0JICAgICAgPD0gc2luZm8tPnN0YWJzdHItPm91dHB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJKHNpbmZvLT5zdGFic3RyLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcwotCQkgKyBzaW5mby0+c3RhYnN0ci0+b3V0cHV0X29mZnNldCksCi0JCVNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBfYmZkX3N0cmluZ3RhYl9lbWl0IChvdXRwdXRfYmZkLCBzaW5mby0+c3RyaW5ncykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFdlIG5vIGxvbmdlciBuZWVkIHRoZSBzdGFicyBpbmZvcm1hdGlvbi4gICovCi0gIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKHNpbmZvLT5zdHJpbmdzKTsKLSAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJnNpbmZvLT5pbmNsdWRlcy5yb290KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IGFuIGFkZHJlc3MgaW4gdGhlIC5zdGFiIHNlY3Rpb24uICBHaXZlbiBPRkZTRVQgd2l0aGluCi0gICBTVEFCU0VDLCB0aGlzIHJldHVybnMgdGhlIG5ldyBvZmZzZXQgaW4gdGhlIGFkanVzdGVkIHN0YWIgc2VjdGlvbiwKLSAgIG9yIC0xIGlmIHRoZSBhZGRyZXNzIHJlZmVycyB0byBhIHN0YWIgd2hpY2ggaGFzIGJlZW4gcmVtb3ZlZC4gICovCi0KLWJmZF92bWEKLV9iZmRfc3RhYl9zZWN0aW9uX29mZnNldCAob3V0cHV0X2JmZCwgcHNpbmZvLCBzdGFic2VjLCBwc2VjaW5mbywgb2Zmc2V0KQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIFBUUiAqcHNpbmZvOwotICAgICBhc2VjdGlvbiAqc3RhYnNlYzsKLSAgICAgUFRSICpwc2VjaW5mbzsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci17Ci0gIHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbyAqc2VjaW5mbzsKLQotICBzZWNpbmZvID0gKHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbyAqKSAqcHNlY2luZm87Ci0KLSAgaWYgKHNlY2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm4gb2Zmc2V0OwotCi0gIGlmIChvZmZzZXQgPj0gc3RhYnNlYy0+X3Jhd19zaXplKQotICAgIHJldHVybiBvZmZzZXQgLSAoc3RhYnNlYy0+X2Nvb2tlZF9zaXplIC0gc3RhYnNlYy0+X3Jhd19zaXplKTsKLQotICBpZiAoc2VjaW5mby0+Y3VtdWxhdGl2ZV9za2lwcykKLSAgICB7Ci0gICAgICBiZmRfdm1hIGk7Ci0KLSAgICAgIGkgPSBvZmZzZXQgLyBTVEFCU0laRTsKLQotICAgICAgaWYgKHNlY2luZm8tPnN0cmlkeHMgW2ldID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQlyZXR1cm4gKGJmZF92bWEpIC0xOwotCi0gICAgICByZXR1cm4gb2Zmc2V0IC0gc2VjaW5mby0+Y3VtdWxhdGl2ZV9za2lwcyBbaV07Ci0gICAgfQotCi0gIHJldHVybiBvZmZzZXQ7Ci19CmRpZmYgLS1naXQgYS9iZmQvc3RhbXAtaC5pbiBiL2JmZC9zdGFtcC1oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg4ZjcwLi4wMDAwMDAwCi0tLSBhL2JmZC9zdGFtcC1oLmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGltZXN0YW1wCmRpZmYgLS1naXQgYS9iZmQvc3Vub3MuYyBiL2JmZC9zdW5vcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzRmODc4Li4wMDAwMDAwCi0tLSBhL2JmZC9zdW5vcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk0OCArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3IgU3VuT1MgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zdW5vcy1iaWciCi0jZGVmaW5lIE1ZKE9QKSBDQVQoc3Vub3NfYmlnXyxPUCkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLS8qIFN0YXRpYyByb3V0aW5lcyBkZWZpbmVkIGluIHRoaXMgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuIHN1bm9zX3JlYWRfZHluYW1pY19pbmZvIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzdW5vc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX3NsdXJwX2R5bmFtaWNfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyBsb25nIHN1bm9zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqc3Vub3NfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKiwKLQkgICBiZmRfc2l6ZV90eXBlICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX2FkZF9vbmVfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICosIGZsYWd3b3JkLCBhc2VjdGlvbiAqLAotCSAgIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3Nfc2Nhbl9yZWxvY3MKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX3NjYW5fc3RkX3JlbG9jcwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICosIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX3NjYW5fZXh0X3JlbG9jcwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICosIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX2xpbmtfZHluYW1pY19vYmplY3QKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSLCBiZmRfYnl0ZSAqLCBib29sZWFuICosCi0JICAgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19maW5pc2hfZHluYW1pY19saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIHN1bm9zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0jZGVmaW5lIE1ZX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIHN1bm9zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgTVlfYWRkX2R5bmFtaWNfc3ltYm9scyBzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzCi0jZGVmaW5lIE1ZX2FkZF9vbmVfc3ltYm9sIHN1bm9zX2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIE1ZX2xpbmtfZHluYW1pY19vYmplY3Qgc3Vub3NfbGlua19keW5hbWljX29iamVjdAotI2RlZmluZSBNWV93cml0ZV9keW5hbWljX3N5bWJvbCBzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbAotI2RlZmluZSBNWV9jaGVja19keW5hbWljX3JlbG9jIHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgTVlfZmluaXNoX2R5bmFtaWNfbGluayBzdW5vc19maW5pc2hfZHluYW1pY19saW5rCi0KLS8qID8/PyBXaGVyZSBzaG91bGQgdGhpcyBnbz8gICovCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSBcCi0gICgoKG10eXBlKSA9PSBNX1NQQVJDICYmIGJmZF9sb29rdXBfYXJjaCAoYmZkX2FyY2hfc3BhcmMsIDApICE9IE5VTEwpIFwKLSAgIHx8ICgobXR5cGUpID09IE1fU1BBUkNMRVQgXAotICAgICAgICYmIGJmZF9sb29rdXBfYXJjaCAoYmZkX2FyY2hfc3BhcmMsIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0KSAhPSBOVUxMKSBcCi0gICB8fCAoKG10eXBlKSA9PSBNX1NQQVJDTElURV9MRSBcCi0gICAgICAgJiYgYmZkX2xvb2t1cF9hcmNoIChiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQpICE9IE5VTEwpIFwKLSAgIHx8ICgoKG10eXBlKSA9PSBNX1VOS05PV04gfHwgKG10eXBlKSA9PSBNXzY4MDEwIHx8IChtdHlwZSkgPT0gTV82ODAyMCkgXAotICAgICAgICYmIGJmZF9sb29rdXBfYXJjaCAoYmZkX2FyY2hfbTY4aywgMCkgIT0gTlVMTCkpCi0KLS8qIEluY2x1ZGUgdGhlIHVzdWFsIGEub3V0IHN1cHBvcnQuICAqLwotI2luY2x1ZGUgImFvdXRmMS5oIgotCi0vKiBUaGUgU3VuT1MgNC4xLjQgL3Vzci9pbmNsdWRlL2xvY2FsZS5oIGRlZmluZXMgdmFsaWQgYXMgYSBtYWNyby4gICovCi0jdW5kZWYgdmFsaWQKLQotLyogU3VuT1Mgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gIFdlIHN0b3JlIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZQotICAgaW4gb2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKS4gICovCi0KLXN0cnVjdCBzdW5vc19keW5hbWljX2luZm8KLXsKLSAgLyogV2hldGhlciB3ZSBmb3VuZCBhbnkgZHluYW1pYyBpbmZvcm1hdGlvbi4gICovCi0gIGJvb2xlYW4gdmFsaWQ7Ci0gIC8qIER5bmFtaWMgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3VuNF9keW5hbWljX2xpbmsgZHluaW5mbzsKLSAgLyogTnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZHluc3ltX2NvdW50OwotICAvKiBSZWFkIGluIG5saXN0cyBmb3IgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpkeW5zeW07Ci0gIC8qIGFzeW1ib2wgc3RydWN0dXJlcyBmb3IgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgYW91dF9zeW1ib2xfdHlwZSAqY2Fub25pY2FsX2R5bnN5bTsKLSAgLyogUmVhZCBpbiBkeW5hbWljIHN0cmluZyB0YWJsZS4gICovCi0gIGNoYXIgKmR5bnN0cjsKLSAgLyogTnVtYmVyIG9mIGR5bmFtaWMgcmVsb2NzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBkeW5yZWxfY291bnQ7Ci0gIC8qIFJlYWQgaW4gZHluYW1pYyByZWxvY3MuICBUaGlzIG1heSBiZSByZWxvY19zdGRfZXh0ZXJuYWwgb3IKLSAgICAgcmVsb2NfZXh0X2V4dGVybmFsLiAgKi8KLSAgUFRSIGR5bnJlbDsKLSAgLyogYXJlbGVudCBzdHJ1Y3R1cmVzIGZvciBkeW5hbWljIHJlbG9jcy4gICovCi0gIGFyZWxlbnQgKmNhbm9uaWNhbF9keW5yZWw7Ci19OwotCi0vKiBUaGUgaGFzaCB0YWJsZSBvZiBkeW5hbWljIHN5bWJvbHMgaXMgY29tcG9zZWQgb2YgdHdvIHdvcmQgZW50cmllcy4KLSAgIFNlZSBpbmNsdWRlL2FvdXQvc3VuNC5oIGZvciBkZXRhaWxzLiAgKi8KLQotI2RlZmluZSBIQVNIX0VOVFJZX1NJWkUgKDIgKiBCWVRFU19JTl9XT1JEKQotCi0vKiBSZWFkIGluIHRoZSBiYXNpYyBkeW5hbWljIGluZm9ybWF0aW9uLiAgVGhpcyBsb2NhdGVzIHRoZSBfX0RZTkFNSUMKLSAgIHN0cnVjdHVyZSBhbmQgdXNlcyBpdCB0byBmaW5kIHRoZSBkeW5hbWljX2xpbmsgc3RydWN0dXJlLiAgSXQKLSAgIGNyZWF0ZXMgYW5kIHNhdmVzIGEgc3Vub3NfZHluYW1pY19pbmZvIHN0cnVjdHVyZS4gIElmIGl0IGNhbid0IGZpbmQKLSAgIF9fRFlOQU1JQywgaXQgc2V0cyB0aGUgdmFsaWQgZmllbGQgb2YgdGhlIHN1bm9zX2R5bmFtaWNfaW5mbwotICAgc3RydWN0dXJlIHRvIGZhbHNlIHRvIGF2b2lkIGRvaW5nIHRoaXMgd29yayBhZ2Fpbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19yZWFkX2R5bmFtaWNfaW5mbyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICppbmZvOwotICBhc2VjdGlvbiAqZHluc2VjOwotICBiZmRfdm1hIGR5bm9mZjsKLSAgc3RydWN0IGV4dGVybmFsX3N1bjRfZHluYW1pYyBkeW5pbmZvOwotICB1bnNpZ25lZCBsb25nIGR5bnZlcjsKLSAgc3RydWN0IGV4dGVybmFsX3N1bjRfZHluYW1pY19saW5rIGxpbmtpbmZvOwotCi0gIGlmIChvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpICE9IChQVFIpIE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaW5mbyA9ICgoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKQotCSAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvKSkpOwotICBpZiAoIWluZm8pCi0gICAgcmV0dXJuIGZhbHNlOwotICBpbmZvLT52YWxpZCA9IGZhbHNlOwotICBpbmZvLT5keW5zeW0gPSBOVUxMOwotICBpbmZvLT5keW5zdHIgPSBOVUxMOwotICBpbmZvLT5jYW5vbmljYWxfZHluc3ltID0gTlVMTDsKLSAgaW5mby0+ZHlucmVsID0gTlVMTDsKLSAgaW5mby0+Y2Fub25pY2FsX2R5bnJlbCA9IE5VTEw7Ci0gIG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCkgPSAoUFRSKSBpbmZvOwotCi0gIC8qIFRoaXMgY29kZSB1c2VkIHRvIGxvb2sgZm9yIHRoZSBfX0RZTkFNSUMgc3ltYm9sIHRvIGxvY2F0ZSB0aGUgZHluYW1pYwotICAgICBsaW5raW5nIGluZm9ybWF0aW9uLgotICAgICBIb3dldmVyIHRoaXMgaW5oaWJpdHMgcmVjb3ZlcmluZyB0aGUgZHluYW1pYyBzeW1ib2xzIGZyb20gYQotICAgICBzdHJpcHBlZCBvYmplY3QgZmlsZSwgc28gYmxpbmRseSBhc3N1bWUgdGhhdCB0aGUgZHluYW1pYyBsaW5raW5nCi0gICAgIGluZm9ybWF0aW9uIGlzIGxvY2F0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlY3Rpb24uCi0gICAgIFdlIGNvdWxkIHZlcmlmeSB0aGlzIGFzc3VtcHRpb24gbGF0ZXIgYnkgbG9va2luZyB0aHJvdWdoIHRoZSBkeW5hbWljCi0gICAgIHN5bWJvbHMgZm9yIHRoZSBfX0RZTkFNSUMgc3ltYm9sLiAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpLCAoUFRSKSAmZHluaW5mbywKLQkJCQkgIChmaWxlX3B0cikgMCwgc2l6ZW9mIGR5bmluZm8pKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bnZlciA9IEdFVF9XT1JEIChhYmZkLCBkeW5pbmZvLmxkX3ZlcnNpb24pOwotICBpZiAoZHludmVyICE9IDIgJiYgZHludmVyICE9IDMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2ZmID0gR0VUX1dPUkQgKGFiZmQsIGR5bmluZm8ubGQpOwotCi0gIC8qIGR5bm9mZiBpcyBhIHZpcnR1YWwgYWRkcmVzcy4gIEl0IGlzIHByb2JhYmx5IGFsd2F5cyBpbiB0aGUgLmRhdGEKLSAgICAgc2VjdGlvbiwgYnV0IHRoaXMgY29kZSBzaG91bGQgd29yayBldmVuIGlmIGl0IG1vdmVzLiAgKi8KLSAgaWYgKGR5bm9mZiA8IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSkpCi0gICAgZHluc2VjID0gb2JqX3RleHRzZWMgKGFiZmQpOwotICBlbHNlCi0gICAgZHluc2VjID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotICBkeW5vZmYgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgZHluc2VjKTsKLSAgaWYgKGR5bm9mZiA+IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGR5bnNlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhpcyBleGVjdXRhYmxlIGFwcGVhcnMgdG8gYmUgZHluYW1pY2FsbHkgbGlua2VkIGluIGEgd2F5IHRoYXQgd2UKLSAgICAgY2FuIHVuZGVyc3RhbmQuICAqLwotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGR5bnNlYywgKFBUUikgJmxpbmtpbmZvLCBkeW5vZmYsCi0JCQkJICAoYmZkX3NpemVfdHlwZSkgc2l6ZW9mIGxpbmtpbmZvKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBTd2FwIGluIHRoZSBkeW5hbWljIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICBpbmZvLT5keW5pbmZvLmxkX2xvYWRlZCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9sb2FkZWQpOwotICBpbmZvLT5keW5pbmZvLmxkX25lZWQgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfbmVlZCk7Ci0gIGluZm8tPmR5bmluZm8ubGRfcnVsZXMgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfcnVsZXMpOwotICBpbmZvLT5keW5pbmZvLmxkX2dvdCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9nb3QpOwotICBpbmZvLT5keW5pbmZvLmxkX3BsdCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9wbHQpOwotICBpbmZvLT5keW5pbmZvLmxkX3JlbCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9yZWwpOwotICBpbmZvLT5keW5pbmZvLmxkX2hhc2ggPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfaGFzaCk7Ci0gIGluZm8tPmR5bmluZm8ubGRfc3RhYiA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9zdGFiKTsKLSAgaW5mby0+ZHluaW5mby5sZF9zdGFiX2hhc2ggPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfc3RhYl9oYXNoKTsKLSAgaW5mby0+ZHluaW5mby5sZF9idWNrZXRzID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX2J1Y2tldHMpOwotICBpbmZvLT5keW5pbmZvLmxkX3N5bWJvbHMgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfc3ltYm9scyk7Ci0gIGluZm8tPmR5bmluZm8ubGRfc3ltYl9zaXplID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX3N5bWJfc2l6ZSk7Ci0gIGluZm8tPmR5bmluZm8ubGRfdGV4dCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF90ZXh0KTsKLSAgaW5mby0+ZHluaW5mby5sZF9wbHRfc3ogPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfcGx0X3N6KTsKLQotICAvKiBSZXBvcnRlZGx5IHRoZSBhZGRyZXNzZXMgbmVlZCB0byBiZSBvZmZzZXQgYnkgdGhlIHNpemUgb2YgdGhlCi0gICAgIGV4ZWMgaGVhZGVyIGluIGFuIE5NQUdJQyBmaWxlLiAgKi8KLSAgaWYgKGFkYXRhIChhYmZkKS5tYWdpYyA9PSBuX21hZ2ljKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZXhlY19ieXRlc19zaXplID0gYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKLQotICAgICAgaW5mby0+ZHluaW5mby5sZF9uZWVkICs9IGV4ZWNfYnl0ZXNfc2l6ZTsKLSAgICAgIGluZm8tPmR5bmluZm8ubGRfcnVsZXMgKz0gZXhlY19ieXRlc19zaXplOwotICAgICAgaW5mby0+ZHluaW5mby5sZF9yZWwgKz0gZXhlY19ieXRlc19zaXplOwotICAgICAgaW5mby0+ZHluaW5mby5sZF9oYXNoICs9IGV4ZWNfYnl0ZXNfc2l6ZTsKLSAgICAgIGluZm8tPmR5bmluZm8ubGRfc3RhYiArPSBleGVjX2J5dGVzX3NpemU7Ci0gICAgICBpbmZvLT5keW5pbmZvLmxkX3N5bWJvbHMgKz0gZXhlY19ieXRlc19zaXplOwotICAgIH0KLQotICAvKiBUaGUgb25seSB3YXkgdG8gZ2V0IHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgaW5mb3JtYXRpb24gYXBwZWFycyB0bwotICAgICBiZSB0byBkZXRlcm1pbmUgdGhlIGRpc3RhbmNlIGJldHdlZW4gaXQgYW5kIHRoZSBzdHJpbmcgdGFibGUuICAqLwotICBpbmZvLT5keW5zeW1fY291bnQgPSAoKGluZm8tPmR5bmluZm8ubGRfc3ltYm9scyAtIGluZm8tPmR5bmluZm8ubGRfc3RhYikKLQkJCS8gRVhURVJOQUxfTkxJU1RfU0laRSk7Ci0gIEJGRF9BU1NFUlQgKGluZm8tPmR5bnN5bV9jb3VudCAqIEVYVEVSTkFMX05MSVNUX1NJWkUKLQkgICAgICA9PSAodW5zaWduZWQgbG9uZykgKGluZm8tPmR5bmluZm8ubGRfc3ltYm9scwotCQkJCSAgLSBpbmZvLT5keW5pbmZvLmxkX3N0YWIpKTsKLQotICAvKiBTaW1pbGFybHksIHRoZSByZWxvY3MgZW5kIGF0IHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgaW5mby0+ZHlucmVsX2NvdW50ID0gKChpbmZvLT5keW5pbmZvLmxkX2hhc2ggLSBpbmZvLT5keW5pbmZvLmxkX3JlbCkKLQkJCS8gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLSAgQkZEX0FTU0VSVCAoaW5mby0+ZHlucmVsX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpCi0JICAgICAgPT0gKHVuc2lnbmVkIGxvbmcpIChpbmZvLT5keW5pbmZvLmxkX2hhc2gKLQkJCQkgIC0gaW5mby0+ZHluaW5mby5sZF9yZWwpKTsKLQotICBpbmZvLT52YWxpZCA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCBmb3IgdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0KLXN0YXRpYyBsb25nCi1zdW5vc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqaW5mbzsKLQotICBpZiAoISBzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGluZm8gPSAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKSBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpOwotICBpZiAoISBpbmZvLT52YWxpZCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiAoaW5mby0+ZHluc3ltX2NvdW50ICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKik7Ci19Ci0KLS8qIFJlYWQgdGhlIGV4dGVybmFsIGR5bmFtaWMgc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19zbHVycF9keW5hbWljX3N5bXRhYiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICppbmZvOwotCi0gIC8qIEdldCB0aGUgZ2VuZXJhbCBkeW5hbWljIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyAoYWJmZCkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8gPSAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKSBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpOwotICBpZiAoISBpbmZvLT52YWxpZCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgZHluYW1pYyBubGlzdCBzdHJ1Y3R1cmVzLiAgKi8KLSAgaWYgKGluZm8tPmR5bnN5bSA9PSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIE5VTEwpCi0gICAgewotICAgICAgaW5mby0+ZHluc3ltID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikKLQkJICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAoaW5mby0+ZHluc3ltX2NvdW50Ci0JCQkJICAqIEVYVEVSTkFMX05MSVNUX1NJWkUpKSk7Ci0gICAgICBpZiAoaW5mby0+ZHluc3ltID09IE5VTEwgJiYgaW5mby0+ZHluc3ltX2NvdW50ICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBpbmZvLT5keW5pbmZvLmxkX3N0YWIsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3JlYWQgKChQVFIpIGluZm8tPmR5bnN5bSwgaW5mby0+ZHluc3ltX2NvdW50LAotCQkJRVhURVJOQUxfTkxJU1RfU0laRSwgYWJmZCkKLQkgICAgICAhPSBpbmZvLT5keW5zeW1fY291bnQgKiBFWFRFUk5BTF9OTElTVF9TSVpFKSkKLQl7Ci0JICBpZiAoaW5mby0+ZHluc3ltICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgaW5mby0+ZHluc3ltKTsKLQkgICAgICBpbmZvLT5keW5zeW0gPSBOVUxMOwotCSAgICB9Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBHZXQgdGhlIGR5bmFtaWMgc3RyaW5ncy4gICovCi0gIGlmIChpbmZvLT5keW5zdHIgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpbmZvLT5keW5zdHIgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIGluZm8tPmR5bmluZm8ubGRfc3ltYl9zaXplKTsKLSAgICAgIGlmIChpbmZvLT5keW5zdHIgPT0gTlVMTCAmJiBpbmZvLT5keW5pbmZvLmxkX3N5bWJfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaW5mby0+ZHluaW5mby5sZF9zeW1ib2xzLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkICgoUFRSKSBpbmZvLT5keW5zdHIsIDEsIGluZm8tPmR5bmluZm8ubGRfc3ltYl9zaXplLAotCQkJYWJmZCkKLQkgICAgICAhPSBpbmZvLT5keW5pbmZvLmxkX3N5bWJfc2l6ZSkpCi0JewotCSAgaWYgKGluZm8tPmR5bnN0ciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGluZm8tPmR5bnN0cik7Ci0JICAgICAgaW5mby0+ZHluc3RyID0gTlVMTDsKLQkgICAgfQotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0KLXN0YXRpYyBsb25nCi1zdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIHN0b3JhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN0b3JhZ2U7Ci17Ci0gIHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKmluZm87Ci0gIHVuc2lnbmVkIGxvbmcgaTsKLQotICBpZiAoISBzdW5vc19zbHVycF9keW5hbWljX3N5bXRhYiAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGluZm8gPSAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKSBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpOwotCi0jaWZkZWYgQ0hFQ0tfRFlOQU1JQ19IQVNICi0gIC8qIENoZWNrIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIGR5bmFtaWMgaGFzaCB0YWJsZSBieSBtYWtpbmcgc3VyZQotICAgICB0aGF0IGVhY2ggc3ltYm9sIGNhbiBiZSBsb2NhdGVkIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgewotICAgIGJmZF9zaXplX3R5cGUgdGFibGVfc2l6ZTsKLSAgICBiZmRfYnl0ZSAqdGFibGU7Ci0gICAgYmZkX3NpemVfdHlwZSBpOwotCi0gICAgaWYgKGluZm8tPmR5bmluZm8ubGRfYnVja2V0cyA+IGluZm8tPmR5bnN5bV9jb3VudCkKLSAgICAgIGFib3J0ICgpOwotICAgIHRhYmxlX3NpemUgPSBpbmZvLT5keW5pbmZvLmxkX3N0YWIgLSBpbmZvLT5keW5pbmZvLmxkX2hhc2g7Ci0gICAgdGFibGUgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAodGFibGVfc2l6ZSk7Ci0gICAgaWYgKHRhYmxlID09IE5VTEwgJiYgdGFibGVfc2l6ZSAhPSAwKQotICAgICAgYWJvcnQgKCk7Ci0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCBpbmZvLT5keW5pbmZvLmxkX2hhc2gsIFNFRUtfU0VUKSAhPSAwCi0JfHwgYmZkX3JlYWQgKChQVFIpIHRhYmxlLCAxLCB0YWJsZV9zaXplLCBhYmZkKSAhPSB0YWJsZV9zaXplKQotICAgICAgYWJvcnQgKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGluZm8tPmR5bnN5bV9jb3VudDsgaSsrKQotICAgICAgewotCXVuc2lnbmVkIGNoYXIgKm5hbWU7Ci0JdW5zaWduZWQgbG9uZyBoYXNoOwotCi0JbmFtZSA9ICgodW5zaWduZWQgY2hhciAqKSBpbmZvLT5keW5zdHIKLQkJKyBHRVRfV09SRCAoYWJmZCwgaW5mby0+ZHluc3ltW2ldLmVfc3RyeCkpOwotCWhhc2ggPSAwOwotCXdoaWxlICgqbmFtZSAhPSAnXDAnKQotCSAgaGFzaCA9IChoYXNoIDw8IDEpICsgKm5hbWUrKzsKLQloYXNoICY9IDB4N2ZmZmZmZmY7Ci0JaGFzaCAlPSBpbmZvLT5keW5pbmZvLmxkX2J1Y2tldHM7Ci0Jd2hpbGUgKEdFVF9XT1JEIChhYmZkLCB0YWJsZSArIGhhc2ggKiBIQVNIX0VOVFJZX1NJWkUpICE9IGkpCi0JICB7Ci0JICAgIGhhc2ggPSBHRVRfV09SRCAoYWJmZCwKLQkJCSAgICAgdGFibGUgKyBoYXNoICogSEFTSF9FTlRSWV9TSVpFICsgQllURVNfSU5fV09SRCk7Ci0JICAgIGlmIChoYXNoID09IDAgfHwgaGFzaCA+PSB0YWJsZV9zaXplIC8gSEFTSF9FTlRSWV9TSVpFKQotCSAgICAgIGFib3J0ICgpOwotCSAgfQotICAgICAgfQotICAgIGZyZWUgKHRhYmxlKTsKLSAgfQotI2VuZGlmIC8qIENIRUNLX0RZTkFNSUNfSEFTSCAqLwotCi0gIC8qIEdldCB0aGUgYXN5bWJvbCBzdHJ1Y3R1cmVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGR5bmFtaWMgbmxpc3QKLSAgICAgc3RydWN0dXJlcy4gICovCi0gIGlmIChpbmZvLT5jYW5vbmljYWxfZHluc3ltID09IChhb3V0X3N5bWJvbF90eXBlICopIE5VTEwpCi0gICAgewotICAgICAgaW5mby0+Y2Fub25pY2FsX2R5bnN5bSA9ICgoYW91dF9zeW1ib2xfdHlwZSAqKQotCQkJCWJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAgKGluZm8tPmR5bnN5bV9jb3VudAotCQkJCQkgICAgKiBzaXplb2YgKGFvdXRfc3ltYm9sX3R5cGUpKSkpOwotICAgICAgaWYgKGluZm8tPmNhbm9uaWNhbF9keW5zeW0gPT0gTlVMTCAmJiBpbmZvLT5keW5zeW1fY291bnQgIT0gMCkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIGlmICghIGFvdXRfMzJfdHJhbnNsYXRlX3N5bWJvbF90YWJsZSAoYWJmZCwgaW5mby0+Y2Fub25pY2FsX2R5bnN5bSwKLQkJCQkJICAgIGluZm8tPmR5bnN5bSwgaW5mby0+ZHluc3ltX2NvdW50LAotCQkJCQkgICAgaW5mby0+ZHluc3RyLAotCQkJCQkgICAgaW5mby0+ZHluaW5mby5sZF9zeW1iX3NpemUsCi0JCQkJCSAgICB0cnVlKSkKLQl7Ci0JICBpZiAoaW5mby0+Y2Fub25pY2FsX2R5bnN5bSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGluZm8tPmNhbm9uaWNhbF9keW5zeW0pOwotCSAgICAgIGluZm8tPmNhbm9uaWNhbF9keW5zeW0gPSBOVUxMOwotCSAgICB9Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLQotICAvKiBSZXR1cm4gcG9pbnRlcnMgdG8gdGhlIGR5bmFtaWMgYXN5bWJvbCBzdHJ1Y3R1cmVzLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGluZm8tPmR5bnN5bV9jb3VudDsgaSsrKQotICAgICpzdG9yYWdlKysgPSAoYXN5bWJvbCAqKSAoaW5mby0+Y2Fub25pY2FsX2R5bnN5bSArIGkpOwotICAqc3RvcmFnZSA9IE5VTEw7Ci0KLSAgcmV0dXJuIGluZm8tPmR5bnN5bV9jb3VudDsKLX0KLQotLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIGZvciB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotCi1zdGF0aWMgbG9uZwotc3Vub3NfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqaW5mbzsKLQotICBpZiAoISBzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGluZm8gPSAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKSBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpOwotICBpZiAoISBpbmZvLT52YWxpZCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiAoaW5mby0+ZHlucmVsX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIGR5bmFtaWMgcmVsb2NzLiAgKi8KLQotc3RhdGljIGxvbmcKLXN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCBzdG9yYWdlLCBzeW1zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKipzdG9yYWdlOwotICAgICBhc3ltYm9sICoqc3ltczsKLXsKLSAgc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqaW5mbzsKLSAgdW5zaWduZWQgbG9uZyBpOwotCi0gIC8qIEdldCB0aGUgZ2VuZXJhbCBkeW5hbWljIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCkgPT0gKFBUUikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyAoYWJmZCkpCi0JcmV0dXJuIC0xOwotICAgIH0KLQotICBpbmZvID0gKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKikgb2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKTsKLSAgaWYgKCEgaW5mby0+dmFsaWQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBHZXQgdGhlIGR5bmFtaWMgcmVsb2MgaW5mb3JtYXRpb24uICAqLwotICBpZiAoaW5mby0+ZHlucmVsID09IE5VTEwpCi0gICAgewotICAgICAgaW5mby0+ZHlucmVsID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgICAgIChpbmZvLT5keW5yZWxfY291bnQKLQkJCQkgICAgICAgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpKTsKLSAgICAgIGlmIChpbmZvLT5keW5yZWwgPT0gTlVMTCAmJiBpbmZvLT5keW5yZWxfY291bnQgIT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGluZm8tPmR5bmluZm8ubGRfcmVsLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkICgoUFRSKSBpbmZvLT5keW5yZWwsIGluZm8tPmR5bnJlbF9jb3VudCwKLQkJCW9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSwgYWJmZCkKLQkgICAgICAhPSBpbmZvLT5keW5yZWxfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpKQotCXsKLQkgIGlmIChpbmZvLT5keW5yZWwgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBpbmZvLT5keW5yZWwpOwotCSAgICAgIGluZm8tPmR5bnJlbCA9IE5VTEw7Ci0JICAgIH0KLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgYXJlbGVudCBzdHJ1Y3R1cmVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGR5bmFtaWMgcmVsb2MKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICBpZiAoaW5mby0+Y2Fub25pY2FsX2R5bnJlbCA9PSAoYXJlbGVudCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnRvOwotCi0gICAgICBpbmZvLT5jYW5vbmljYWxfZHlucmVsID0gKChhcmVsZW50ICopCi0JCQkJYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAoaW5mby0+ZHlucmVsX2NvdW50Ci0JCQkJCSAgICAqIHNpemVvZiAoYXJlbGVudCkpKSk7Ci0gICAgICBpZiAoaW5mby0+Y2Fub25pY2FsX2R5bnJlbCA9PSBOVUxMICYmIGluZm8tPmR5bnJlbF9jb3VudCAhPSAwKQotCXJldHVybiAtMTsKLSAgICAgIAotICAgICAgdG8gPSBpbmZvLT5jYW5vbmljYWxfZHlucmVsOwotCi0gICAgICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID09IFJFTE9DX0VYVF9TSVpFKQotCXsKLQkgIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnA7Ci0JICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpwZW5kOwotCi0JICBwID0gKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgaW5mby0+ZHlucmVsOwotCSAgcGVuZCA9IHAgKyBpbmZvLT5keW5yZWxfY291bnQ7Ci0JICBmb3IgKDsgcCA8IHBlbmQ7IHArKywgdG8rKykKLQkgICAgTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSAoYWJmZCwgcCwgdG8sIHN5bXMsCi0JCQkJCSAgaW5mby0+ZHluc3ltX2NvdW50KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcDsKLQkgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnBlbmQ7Ci0KLQkgIHAgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSBpbmZvLT5keW5yZWw7Ci0JICBwZW5kID0gcCArIGluZm8tPmR5bnJlbF9jb3VudDsKLQkgIGZvciAoOyBwIDwgcGVuZDsgcCsrLCB0bysrKQotCSAgICBOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBwLCB0bywgc3ltcywKLQkJCQkJICBpbmZvLT5keW5zeW1fY291bnQpOwotCX0KLSAgICB9Ci0KLSAgLyogUmV0dXJuIHBvaW50ZXJzIHRvIHRoZSBkeW5hbWljIGFyZWxlbnQgc3RydWN0dXJlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5keW5yZWxfY291bnQ7IGkrKykKLSAgICAqc3RvcmFnZSsrID0gaW5mby0+Y2Fub25pY2FsX2R5bnJlbCArIGk7Ci0gICpzdG9yYWdlID0gTlVMTDsKLQotICByZXR1cm4gaW5mby0+ZHlucmVsX2NvdW50OwotfQotDAotLyogQ29kZSB0byBoYW5kbGUgbGlua2luZyBvZiBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLiAgKi8KLQotLyogQSBTUEFSQyBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeSBpcyAxMiBieXRlcy4gIFRoZSBmaXJzdCBlbnRyeQotICAgaW4gdGhlIHRhYmxlIGlzIGEganVtcCB3aGljaCBpcyBmaWxsZWQgaW4gYnkgdGhlIHJ1bnRpbWUgbGlua2VyLgotICAgVGhlIHJlbWFpbmluZyBlbnRyaWVzIGFyZSBicmFuY2hlcyBiYWNrIHRvIHRoZSBmaXJzdCBlbnRyeSwKLSAgIGZvbGxvd2VkIGJ5IGFuIGluZGV4IGludG8gdGhlIHJlbG9jYXRpb24gdGFibGUgZW5jb2RlZCB0byBsb29rIGxpa2UKLSAgIGEgc2V0aGkgb2YgJWcwLiAgKi8KLQotI2RlZmluZSBTUEFSQ19QTFRfRU5UUllfU0laRSAoMTIpCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBzcGFyY19wbHRfZmlyc3RfZW50cnlbU1BBUkNfUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgLyogc2V0aGkgJWhpKDApLCVnMTsgYWRkcmVzcyBmaWxsZWQgaW4gYnkgcnVudGltZSBsaW5rZXIuICAqLwotICAweDMsIDAsIDAsIDAsCi0gIC8qIGptcCAlZzE7IG9mZnNldCBmaWxsZWQgaW4gYnkgcnVudGltZSBsaW5rZXIuICAqLwotICAweDgxLCAweGMwLCAweDYwLCAwLAotICAvKiBub3AgKi8KLSAgMHgxLCAwLCAwLCAwCi19OwotCi0vKiBzYXZlICVzcCwgLTk2LCAlc3AgKi8KLSNkZWZpbmUgU1BBUkNfUExUX0VOVFJZX1dPUkQwIDB4OWRlM2JmYTAKLS8qIGNhbGw7IGFkZHJlc3MgZmlsbGVkIGluIGxhdGVyLiAgKi8KLSNkZWZpbmUgU1BBUkNfUExUX0VOVFJZX1dPUkQxIDB4NDAwMDAwMDAKLS8qIHNldGhpOyByZWxvYyBpbmRleCBmaWxsZWQgaW4gbGF0ZXIuICAqLwotI2RlZmluZSBTUEFSQ19QTFRfRU5UUllfV09SRDIgMHgwMTAwMDAwMAotCi0vKiBUaGlzIHNlcXVlbmNlIGlzIHVzZWQgd2hlbiBmb3IgdGhlIGp1bXAgdGFibGUgZW50cnkgdG8gYSBkZWZpbmVkCi0gICBzeW1ib2wgaW4gYSBjb21wbGV0ZSBleGVjdXRhYmxlLiAgSXQgaXMgdXNlZCB3aGVuIGxpbmtpbmcgUElDCi0gICBjb21waWxlZCBjb2RlIHdoaWNoIGlzIG5vdCBiZWluZyBwdXQgaW50byBhIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLS8qIHNldGhpIDxhZGRyZXNzIHRvIGJlIGZpbGxlZCBpbiBsYXRlcj4sICVnMSAqLwotI2RlZmluZSBTUEFSQ19QTFRfUElDX1dPUkQwIDB4MDMwMDAwMDAKLS8qIGptcCAlZzEgKyA8YWRkcmVzcyB0byBiZSBmaWxsZWQgaW4gbGF0ZXI+ICovCi0jZGVmaW5lIFNQQVJDX1BMVF9QSUNfV09SRDEgMHg4MWMwNjAwMAotLyogbm9wICovCi0jZGVmaW5lIFNQQVJDX1BMVF9QSUNfV09SRDIgMHgwMTAwMDAwMAotCi0vKiBBbiBtNjhrIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5IGlzIDggYnl0ZXMuICBUaGUgZmlyc3QgZW50cnkKLSAgIGluIHRoZSB0YWJsZSBpcyBhIGp1bXAgd2hpY2ggaXMgZmlsbGVkIGluIHRoZSBieSB0aGUgcnVudGltZQotICAgbGlua2VyLiAgVGhlIHJlbWFpbmluZyBlbnRyaWVzIGFyZSBicmFuY2hlcyBiYWNrIHRvIHRoZSBmaXJzdAotICAgZW50cnksIGZvbGxvd2VkIGJ5IGEgdHdvIGJ5dGUgaW5kZXggaW50byB0aGUgcmVsb2NhdGlvbiB0YWJsZS4gICovCi0KLSNkZWZpbmUgTTY4S19QTFRfRU5UUllfU0laRSAoOCkKLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIG02OGtfcGx0X2ZpcnN0X2VudHJ5W002OEtfUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgLyogam1wcyBAIyAqLwotICAweDRlLCAweGY5LAotICAvKiBGaWxsZWQgaW4gYnkgcnVudGltZSBsaW5rZXIgd2l0aCBhIG1hZ2ljIGFkZHJlc3MuICAqLwotICAwLCAwLCAwLCAwLAotICAvKiBOb3QgdXNlZD8gICovCi0gIDAsIDAKLX07Ci0KLS8qIGJzcmwgKi8KLSNkZWZpbmUgTTY4S19QTFRfRU5UUllfV09SRDAgKDB4NjFmZikKLS8qIFJlbWFpbmluZyB3b3JkcyBmaWxsZWQgaW4gbGF0ZXIuICAqLwotCi0vKiBBbiBlbnRyeSBpbiB0aGUgU3VuT1MgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIElmIHRoaXMgaXMgYSBkeW5hbWljIHN5bWJvbCwgdGhpcyBpcyBpdHMgaW5kZXggaW50byB0aGUgZHluYW1pYwotICAgICBzeW1ib2wgdGFibGUuICBUaGlzIGlzIGluaXRpYWxpemVkIHRvIC0xLiAgQXMgdGhlIGxpbmtlciBsb29rcyBhdAotICAgICB0aGUgaW5wdXQgZmlsZXMsIGl0IGNoYW5nZXMgdGhpcyB0byAtMiBpZiBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZQotICAgICBkeW5hbWljIHN5bWJvbCB0YWJsZS4gIEFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIHNlZW4sCi0gICAgIHRoZSBsaW5rZXIgd2lsbCBrbm93IHdoZXRoZXIgdG8gYnVpbGQgYSBkeW5hbWljIHN5bWJvbCB0YWJsZTsgaWYKLSAgICAgaXQgZG9lcyBidWlsZCBvbmUsIHRoaXMgYmVjb21lcyB0aGUgaW5kZXggaW50byB0aGUgdGFibGUuICAqLwotICBsb25nIGR5bmluZHg7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGR5bmFtaWMgc3ltYm9sLCB0aGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgbmFtZSBpbiB0aGUKLSAgICAgZHluYW1pYyBzeW1ib2wgc3RyaW5nIHRhYmxlLiAgKi8KLSAgbG9uZyBkeW5zdHJfaW5kZXg7Ci0KLSAgLyogVGhlIG9mZnNldCBpbnRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHVzZWQgZm9yIHRoaXMgc3ltYm9sLiAgSWYKLSAgICAgdGhlIHN5bWJvbCBkb2VzIG5vdCByZXF1aXJlIGEgR09UIGVudHJ5LCB0aGlzIGlzIDAuICAqLwotICBiZmRfdm1hIGdvdF9vZmZzZXQ7Ci0KLSAgLyogVGhlIG9mZnNldCBpbnRvIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSB1c2VkIGZvciB0aGlzIHN5bWJvbC4KLSAgICAgSWYgdGhlIHN5bWJvbCBkb2VzIG5vdCByZXF1aXJlIGEgUExUIGVudHJ5LCB0aGlzIGlzIDAuICAqLwotICBiZmRfdm1hIHBsdF9vZmZzZXQ7Ci0KLSAgLyogU29tZSBsaW5rZXIgZmxhZ3MuICAqLwotICB1bnNpZ25lZCBjaGFyIGZsYWdzOwotICAvKiBTeW1ib2wgaXMgcmVmZXJlbmNlZCBieSBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSNkZWZpbmUgU1VOT1NfUkVGX1JFR1VMQVIgMDEKLSAgLyogU3ltYm9sIGlzIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gICovCi0jZGVmaW5lIFNVTk9TX0RFRl9SRUdVTEFSIDAyCi0gIC8qIFN5bWJvbCBpcyByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QuICAqLwotI2RlZmluZSBTVU5PU19SRUZfRFlOQU1JQyAwNAotICAvKiBTeW1ib2wgaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSNkZWZpbmUgU1VOT1NfREVGX0RZTkFNSUMgMDEwCi0gIC8qIFN5bWJvbCBpcyBhIGNvbnN0cnVjdG9yIHN5bWJvbCBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSNkZWZpbmUgU1VOT1NfQ09OU1RSVUNUT1IgMDIwCi19OwotCi0vKiBUaGUgU3VuT1MgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIFRoZSBvYmplY3Qgd2hpY2ggaG9sZHMgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotICBiZmQgKmR5bm9iajsKLQotICAvKiBXaGV0aGVyIHdlIGhhdmUgY3JlYXRlZCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0gIGJvb2xlYW4gZHluYW1pY19zZWN0aW9uc19jcmVhdGVkOwotCi0gIC8qIFdoZXRoZXIgd2UgbmVlZCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0gIGJvb2xlYW4gZHluYW1pY19zZWN0aW9uc19uZWVkZWQ7Ci0KLSAgLyogV2hldGhlciB3ZSBuZWVkIHRoZSAuZ290IHRhYmxlLiAgKi8KLSAgYm9vbGVhbiBnb3RfbmVlZGVkOwotCi0gIC8qIFRoZSBudW1iZXIgb2YgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgc2l6ZV90IGR5bnN5bWNvdW50OwotCi0gIC8qIFRoZSBudW1iZXIgb2YgYnVja2V0cyBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIHNpemVfdCBidWNrZXRjb3VudDsKLQotICAvKiBUaGUgbGlzdCBvZiBkeW5hbWljIG9iamVjdHMgbmVlZGVkIGJ5IGR5bmFtaWMgb2JqZWN0cyBpbmNsdWRlZCBpbgotICAgICB0aGUgbGluay4gICovCi0gIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmVlZGVkOwotCi0gIC8qIFRoZSBvZmZzZXQgb2YgX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpbnRvIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICBiZmRfdm1hIGdvdF9iYXNlOwotfTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gU3VuT1MgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1zdW5vc19saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPmR5bmluZHggPSAtMTsKLSAgICAgIHJldC0+ZHluc3RyX2luZGV4ID0gLTE7Ci0gICAgICByZXQtPmdvdF9vZmZzZXQgPSAwOwotICAgICAgcmV0LT5wbHRfb2Zmc2V0ID0gMDsKLSAgICAgIHJldC0+ZmxhZ3MgPSAwOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIFN1bk9TIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1zdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gIGlmICghIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJCSBzdW5vc19saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotCi0gIHJldC0+ZHlub2JqID0gTlVMTDsKLSAgcmV0LT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgPSBmYWxzZTsKLSAgcmV0LT5keW5hbWljX3NlY3Rpb25zX25lZWRlZCA9IGZhbHNlOwotICByZXQtPmdvdF9uZWVkZWQgPSBmYWxzZTsKLSAgcmV0LT5keW5zeW1jb3VudCA9IDA7Ci0gIHJldC0+YnVja2V0Y291bnQgPSAwOwotICByZXQtPm5lZWRlZCA9IE5VTEw7Ci0gIHJldC0+Z290X2Jhc2UgPSAwOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gU3VuT1MgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBzdW5vc19saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKSBcCi0gICBhb3V0X2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSxcCi0JCQkgIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBTdW5PUyBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIHN1bm9zX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgU3VuT1MgbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIHN1bm9zX2hhc2hfdGFibGUocCkgKChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi1zdGF0aWMgYm9vbGVhbiBzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLS8qIENyZWF0ZSB0aGUgZHluYW1pYyBzZWN0aW9ucyBuZWVkZWQgaWYgd2UgYXJlIGxpbmtpbmcgYWdhaW5zdCBhCi0gICBkeW5hbWljIG9iamVjdCwgb3IgaWYgd2UgYXJlIGxpbmtpbmcgUElDIGNvbXBpbGVkIGNvZGUuICBBQkZEIGlzIGEKLSAgIGJmZCB3ZSBjYW4gYXR0YWNoIHRoZSBkeW5hbWljIHNlY3Rpb25zIHRvLiAgVGhlIGxpbmtlciBzY3JpcHQgd2lsbAotICAgbG9vayBmb3IgdGhlc2Ugc3BlY2lhbCBzZWN0aW9ucyBuYW1lcyBhbmQgcHV0IHRoZW0gaW4gdGhlIHJpZ2h0Ci0gICBwbGFjZSBpbiB0aGUgb3V0cHV0IGZpbGUuICBTZWUgaW5jbHVkZS9hb3V0L3N1bjQuaCBmb3IgbW9yZSBkZXRhaWxzCi0gICBvZiB0aGUgZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvLCBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gbmVlZGVkOwotewotICBhc2VjdGlvbiAqczsKLQotICBpZiAoISBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0gICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLQotICAgICAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCSAgICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLSAgICAgIC8qIFRoZSAuZHluYW1pYyBzZWN0aW9uIGhvbGRzIHRoZSBiYXNpYyBkeW5hbWljIGluZm9ybWF0aW9uOiB0aGUKLQkgc3VuNF9keW5hbWljIHN0cnVjdHVyZSwgdGhlIGR5bmFtaWMgZGVidWdnZXIgaW5mb3JtYXRpb24sIGFuZAotCSB0aGUgc3VuNF9keW5hbWljX2xpbmsgc3RydWN0dXJlLiAgKi8KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bmFtaWMiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgLmdvdCBzZWN0aW9uIGhvbGRzIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgVGhlIGFkZHJlc3MKLQkgaXMgcHV0IGluIHRoZSBsZF9nb3QgZmllbGQuICAqLwotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ290Iik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIC5wbHQgc2VjdGlvbiBob2xkcyB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBUaGUKLQkgYWRkcmVzcyBpcyBwdXQgaW4gdGhlIGxkX3BsdCBmaWVsZC4gICovCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5wbHQiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19DT0RFKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSAuZHlucmVsIHNlY3Rpb24gaG9sZHMgdGhlIGR5bmFtaWMgcmVsb2NzLiAgVGhlIGFkZHJlc3MgaXMKLQkgcHV0IGluIHRoZSBsZF9yZWwgZmllbGQuICAqLwotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHlucmVsIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIC5oYXNoIHNlY3Rpb24gaG9sZHMgdGhlIGR5bmFtaWMgaGFzaCB0YWJsZS4gIFRoZSBhZGRyZXNzCi0JIGlzIHB1dCBpbiB0aGUgbGRfaGFzaCBmaWVsZC4gICovCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5oYXNoIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIC5keW5zeW0gc2VjdGlvbiBob2xkcyB0aGUgZHluYW1pYyBzeW1ib2xzLiAgVGhlIGFkZHJlc3MKLQkgaXMgcHV0IGluIHRoZSBsZF9zdGFiIGZpZWxkLiAgKi8KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bnN5bSIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSAuZHluc3RyIHNlY3Rpb24gaG9sZHMgdGhlIGR5bmFtaWMgc3ltYm9sIHN0cmluZyB0YWJsZS4KLQkgVGhlIGFkZHJlc3MgaXMgcHV0IGluIHRoZSBsZF9zeW1ib2xzIGZpZWxkLiAgKi8KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bnN0ciIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgPSB0cnVlOwotICAgIH0KLQotICBpZiAoKG5lZWRlZCAmJiAhIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX25lZWRlZCkKLSAgICAgIHx8IGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBiZmQgKmR5bm9iajsKLQotICAgICAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCi0Jcy0+X3Jhd19zaXplID0gQllURVNfSU5fV09SRDsKLQotICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkID0gdHJ1ZTsKLSAgICAgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbmVlZGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBkeW5hbWljIHN5bWJvbHMgZHVyaW5nIGEgbGluay4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBhLm91dAotICAgYmFja2VuZCBsaW5rZXIgZm9yIGVhY2ggb2JqZWN0IGl0IGVuY291bnRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyAoYWJmZCwgaW5mbywgc3ltc3AsIHN5bV9jb3VudHAsIHN0cmluZ3NwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKipzeW1zcDsKLSAgICAgYmZkX3NpemVfdHlwZSAqc3ltX2NvdW50cDsKLSAgICAgY2hhciAqKnN0cmluZ3NwOwotewotICBhc2VjdGlvbiAqczsKLSAgYmZkICpkeW5vYmo7Ci0gIHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKmRpbmZvOwotICB1bnNpZ25lZCBsb25nIG5lZWQ7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYWxsIHRoZSByZXF1aXJlZCBzZWN0aW9ucy4gICovCi0gIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCi0gICAgewotICAgICAgaWYgKCEgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8sCi0JCQkJCSAgICgoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotCQkJCQkgICAgICYmICEgaW5mby0+cmVsb2NhdGVhYmxlKQotCQkJCQkgICAgPyB0cnVlCi0JCQkJCSAgICA6IGZhbHNlKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGVyZSBpcyBub3RoaW5nIGVsc2UgdG8gZG8gZm9yIGEgbm9ybWFsIG9iamVjdC4gICovCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgLyogV2UgZG8gbm90IHdhbnQgdG8gaW5jbHVkZSB0aGUgc2VjdGlvbnMgaW4gYSBkeW5hbWljIG9iamVjdCBpbiB0aGUKLSAgICAgb3V0cHV0IGZpbGUuICBXZSBoYWNrIGJ5IHNpbXBseSBjbG9iYmVyaW5nIHRoZSBsaXN0IG9mIHNlY3Rpb25zCi0gICAgIGluIHRoZSBCRkQuICBUaGlzIGNvdWxkIGJlIGhhbmRsZWQgbW9yZSBjbGVhbmx5IGJ5LCBzYXksIGEgbmV3Ci0gICAgIHNlY3Rpb24gZmxhZzsgdGhlIGV4aXN0aW5nIFNFQ19ORVZFUl9MT0FEIGZsYWcgaXMgbm90IHRoZSBvbmUgd2UKLSAgICAgd2FudCwgYmVjYXVzZSB0aGF0IG9uZSBzdGlsbCBpbXBsaWVzIHRoYXQgdGhlIHNlY3Rpb24gdGFrZXMgdXAKLSAgICAgc3BhY2UgaW4gdGhlIG91dHB1dCBmaWxlLiAgSWYgdGhpcyBpcyB0aGUgZmlyc3Qgb2JqZWN0IHdlIGhhdmUKLSAgICAgc2Vlbiwgd2UgbXVzdCBwcmVzZXJ2ZSB0aGUgZHluYW1pYyBzZWN0aW9ucyB3ZSBqdXN0IGNyZWF0ZWQuICAqLwotICBpZiAoYWJmZCAhPSBkeW5vYmopCi0gICAgYWJmZC0+c2VjdGlvbnMgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOwotCSAgIChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMDsKLQkgICBzID0gcy0+bmV4dCkKLQk7Ci0gICAgICBhYmZkLT5zZWN0aW9ucyA9IHM7Ci0gICAgfQotCi0gIC8qIFRoZSBuYXRpdmUgbGlua2VyIHNlZW1zIHRvIGp1c3QgaWdub3JlIGR5bmFtaWMgb2JqZWN0cyB3aGVuIC1yIGlzCi0gICAgIHVzZWQuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRoZXJlJ3Mgbm8gaG9wZSBvZiB1c2luZyBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoIGRvZXMgbm90IGV4YWN0bHkKLSAgICAgbWF0Y2ggdGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciAhPSBhYmZkLT54dmVjKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgLm5lZWQgYW5kIGEgLnJ1bGVzIHNlY3Rpb25zLiAgVGhlc2UgYXJlIG9ubHkKLSAgICAgbmVlZGVkIGlmIHRoZXJlIHJlYWxseSBpcyBhIGR5bmFtaWMgb2JqZWN0IGluIHRoZSBsaW5rLCBzbyB0aGV5Ci0gICAgIGFyZSBub3QgYWRkZWQgYnkgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuICAqLwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5uZWVkIikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGUgLm5lZWQgc2VjdGlvbiBob2xkcyB0aGUgbGlzdCBvZiBuYW1lcyBvZiBzaGFyZWQgb2JqZXRzCi0JIHdoaWNoIG11c3QgYmUgaW5jbHVkZWQgYXQgcnVudGltZS4gIFRoZSBhZGRyZXNzIG9mIHRoaXMKLQkgc2VjdGlvbiBpcyBwdXQgaW4gdGhlIGxkX25lZWQgZmllbGQuICAqLwotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5uZWVkIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzLAotCQkJCSAgICAgIChTRUNfQUxMT0MKLQkJCQkgICAgICAgfCBTRUNfTE9BRAotCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJICAgICAgIHwgU0VDX1JFQURPTkxZKSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJ1bGVzIikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGUgLnJ1bGVzIHNlY3Rpb24gaG9sZHMgdGhlIHBhdGggdG8gc2VhcmNoIGZvciBzaGFyZWQKLQkgb2JqZWN0cy4gIFRoZSBhZGRyZXNzIG9mIHRoaXMgc2VjdGlvbiBpcyBwdXQgaW4gdGhlIGxkX3J1bGVzCi0JIGZpZWxkLiAgKi8KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucnVsZXMiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHMsCi0JCQkJICAgICAgKFNFQ19BTExPQwotCQkJCSAgICAgICB8IFNFQ19MT0FECi0JCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkpKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogUGljayB1cCB0aGUgZHluYW1pYyBzeW1ib2xzIGFuZCByZXR1cm4gdGhlbSB0byB0aGUgY2FsbGVyLiAgKi8KLSAgaWYgKCEgc3Vub3Nfc2x1cnBfZHluYW1pY19zeW10YWIgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBkaW5mbyA9IChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICopIG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCk7Ci0gICpzeW1zcCA9IGRpbmZvLT5keW5zeW07Ci0gICpzeW1fY291bnRwID0gZGluZm8tPmR5bnN5bV9jb3VudDsKLSAgKnN0cmluZ3NwID0gZGluZm8tPmR5bnN0cjsKLQotICAvKiBSZWNvcmQgaW5mb3JtYXRpb24gYWJvdXQgYW55IG90aGVyIG9iamVjdHMgbmVlZGVkIGJ5IHRoaXMgb25lLiAgKi8KLSAgbmVlZCA9IGRpbmZvLT5keW5pbmZvLmxkX25lZWQ7Ci0gIHdoaWxlIChuZWVkICE9IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgYnVmWzE2XTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbmFtZSwgZmxhZ3M7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBtYWpvcl92bm8sIG1pbm9yX3ZubzsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmVlZGVkLCAqKnBwOwotICAgICAgY2hhciAqbmFtZWJ1ZiwgKnA7Ci0gICAgICBzaXplX3QgYWxjOwotICAgICAgYmZkX2J5dGUgYjsKLSAgICAgIGNoYXIgKm5hbWVjb3B5OwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG5lZWQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfcmVhZCAoYnVmLCAxLCAxNiwgYWJmZCkgIT0gMTYpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGb3IgdGhlIGZvcm1hdCBvZiBhbiBsZF9uZWVkIGVudHJ5LCBzZWUgYW91dC9zdW40LmguICBXZQotICAgICAgICAgc2hvdWxkIHByb2JhYmx5IGRlZmluZSBzdHJ1Y3RzIGZvciB0aGlzIG1hbmlwdWxhdGlvbi4gICovCi0KLSAgICAgIG5hbWUgPSBiZmRfZ2V0XzMyIChhYmZkLCBidWYpOwotICAgICAgZmxhZ3MgPSBiZmRfZ2V0XzMyIChhYmZkLCBidWYgKyA0KTsKLSAgICAgIG1ham9yX3ZubyA9ICh1bnNpZ25lZCBzaG9ydCliZmRfZ2V0XzE2IChhYmZkLCBidWYgKyA4KTsKLSAgICAgIG1pbm9yX3ZubyA9ICh1bnNpZ25lZCBzaG9ydCliZmRfZ2V0XzE2IChhYmZkLCBidWYgKyAxMCk7Ci0gICAgICBuZWVkID0gYmZkX2dldF8zMiAoYWJmZCwgYnVmICsgMTIpOwotCi0gICAgICBuZWVkZWQgPSAoKHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0KSkpOwotICAgICAgaWYgKG5lZWRlZCA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5lZWRlZC0+YnkgPSBhYmZkOwotCi0gICAgICAvKiBXZSByZXR1cm4gdGhlIG5hbWUgYXMgWy1sXW5hbWVbLm1hal1bLm1pbl0uICAqLwotICAgICAgYWxjID0gMzA7Ci0gICAgICBuYW1lYnVmID0gKGNoYXIgKikgYmZkX21hbGxvYyAoYWxjICsgMSk7Ci0gICAgICBpZiAobmFtZWJ1ZiA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHAgPSBuYW1lYnVmOwotCi0gICAgICBpZiAoKGZsYWdzICYgMHg4MDAwMDAwMCkgIT0gMCkKLQl7Ci0JICAqcCsrID0gJy0nOwotCSAgKnArKyA9ICdsJzsKLQl9Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG5hbWUsIFNFRUtfU0VUKSAhPSAwKQotCXsKLQkgIGZyZWUgKG5hbWVidWYpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgZG8KLQl7Ci0JICBpZiAoYmZkX3JlYWQgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCSAgICB7Ci0JICAgICAgZnJlZSAobmFtZWJ1Zik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmICgoc2l6ZV90KSAocCAtIG5hbWVidWYpID49IGFsYykKLQkgICAgewotCSAgICAgIGNoYXIgKm47Ci0KLQkgICAgICBhbGMgKj0gMjsKLQkgICAgICBuID0gKGNoYXIgKikgYmZkX3JlYWxsb2MgKG5hbWVidWYsIGFsYyArIDEpOwotCSAgICAgIGlmIChuID09IE5VTEwpCi0JCXsKLQkJICBmcmVlIChuYW1lYnVmKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBwID0gbiArIChwIC0gbmFtZWJ1Zik7Ci0JICAgICAgbmFtZWJ1ZiA9IG47Ci0JICAgIH0KLQotCSAgKnArKyA9IGI7Ci0JfQotICAgICAgd2hpbGUgKGIgIT0gJ1wwJyk7Ci0KLSAgICAgIGlmIChtYWpvcl92bm8gPT0gMCkKLQkqcCA9ICdcMCc7Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciBtYWpidWZbMzBdOwotCSAgY2hhciBtaW5idWZbMzBdOwotCi0JICBzcHJpbnRmIChtYWpidWYsICIuJWQiLCBtYWpvcl92bm8pOwotCSAgaWYgKG1pbm9yX3ZubyA9PSAwKQotCSAgICBtaW5idWZbMF0gPSAnXDAnOwotCSAgZWxzZQotCSAgICBzcHJpbnRmIChtaW5idWYsICIuJWQiLCBtaW5vcl92bm8pOwotCi0JICBpZiAoKHAgLSBuYW1lYnVmKSArIHN0cmxlbiAobWFqYnVmKSArIHN0cmxlbiAobWluYnVmKSA+PSBhbGMpCi0JICAgIHsKLQkgICAgICBjaGFyICpuOwotCi0JICAgICAgYWxjID0gKHAgLSBuYW1lYnVmKSArIHN0cmxlbiAobWFqYnVmKSArIHN0cmxlbiAobWluYnVmKTsKLQkgICAgICBuID0gKGNoYXIgKikgYmZkX3JlYWxsb2MgKG5hbWVidWYsIGFsYyArIDEpOwotCSAgICAgIGlmIChuID09IE5VTEwpCi0JCXsKLQkJICBmcmVlIChuYW1lYnVmKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBwID0gbiArIChwIC0gbmFtZWJ1Zik7Ci0JICAgICAgbmFtZWJ1ZiA9IG47Ci0JICAgIH0KLQotCSAgc3RyY3B5IChwLCBtYWpidWYpOwotCSAgc3RyY2F0IChwLCBtaW5idWYpOwotCX0KLQotICAgICAgbmFtZWNvcHkgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAobmFtZWJ1ZikgKyAxKTsKLSAgICAgIGlmIChuYW1lY29weSA9PSBOVUxMKQotCXsKLQkgIGZyZWUgKG5hbWVidWYpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHN0cmNweSAobmFtZWNvcHksIG5hbWVidWYpOwotICAgICAgZnJlZSAobmFtZWJ1Zik7Ci0gICAgICBuZWVkZWQtPm5hbWUgPSBuYW1lY29weTsKLQotICAgICAgbmVlZGVkLT5uZXh0ID0gTlVMTDsKLQotICAgICAgZm9yIChwcCA9ICZzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+bmVlZGVkOwotCSAgICpwcCAhPSBOVUxMOwotCSAgIHBwID0gJigqcHApLT5uZXh0KQotCTsKLSAgICAgICpwcCA9IG5lZWRlZDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhpcyBpcwotICAgYSB3cmFwcGVyIGFyb3VuZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aGljaCBoYW5kbGVzIHRoZQotICAgdHdlYWtpbmcgbmVlZGVkIGZvciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsCi0JCSAgICAgIGNvcHksIGNvbGxlY3QsIGhhc2hwKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHA7Ci17Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGludCBuZXdfZmxhZzsKLQotICBpZiAoKGZsYWdzICYgKEJTRl9JTkRJUkVDVCB8IEJTRl9XQVJOSU5HIHwgQlNGX0NPTlNUUlVDVE9SKSkgIT0gMAotICAgICAgfHwgISBiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQotICAgIGggPSBzdW5vc19saW5rX2hhc2hfbG9va3VwIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgdHJ1ZSwgY29weSwKLQkJCQlmYWxzZSk7Ci0gIGVsc2UKLSAgICBoID0gKChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopCi0JIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sIG5hbWUsIHRydWUsIGNvcHksIGZhbHNlKSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChoYXNocCAhPSBOVUxMKQotICAgICpoYXNocCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0gIC8qIFRyZWF0IGEgY29tbW9uIHN5bWJvbCBpbiBhIGR5bmFtaWMgb2JqZWN0IGFzIGRlZmluZWQgaW4gdGhlIC5ic3MKLSAgICAgc2VjdGlvbiBvZiB0aGUgZHluYW1pYyBvYmplY3QuICBXZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIHNwYWNlCi0gICAgIGZvciBpdCBpbiBvdXIgcHJvY2VzcyBpbWFnZS4gICovCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0gICAgICAmJiBiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKQotICAgIHNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLQotICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pCi0gICAgICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX25ldwotICAgICAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICB7Ci0gICAgICAvKiBXZSBhcmUgZGVmaW5pbmcgdGhlIHN5bWJvbCwgYW5kIGl0IGlzIGFscmVhZHkgZGVmaW5lZC4gIFRoaXMKLQkgaXMgYSBwb3RlbnRpYWwgbXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvci4gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLQl7Ci0JICAvKiBUaGUgZGVmaW5pdGlvbiB3ZSBhcmUgYWRkaW5nIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdC4KLQkgICAgIFdlIGRvIG5vdCB3YW50IHRoaXMgbmV3IGRlZmluaXRpb24gdG8gb3ZlcnJpZGUgdGhlCi0JICAgICBleGlzdGluZyBkZWZpbml0aW9uLCBzbyB3ZSBwcmV0ZW5kIGl0IGlzIGp1c3QgYQotCSAgICAgcmVmZXJlbmNlLiAgKi8KLQkgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCX0KLSAgICAgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICAmJiBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIgIT0gTlVMTAotCSAgICAgICAmJiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JewotCSAgLyogVGhlIGV4aXN0aW5nIGRlZmluaXRpb24gaXMgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LiAgV2UKLQkgICAgIHdhbnQgdG8gb3ZlcnJpZGUgaXQgd2l0aCB0aGUgZGVmaW5pdGlvbiB3ZSBqdXN0IGZvdW5kLgotCSAgICAgQ2xvYmJlciB0aGUgZXhpc3RpbmcgZGVmaW5pdGlvbi4gICovCi0JICBoLT5yb290LnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZCA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQl9Ci0gICAgICBlbHNlIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCSAgICAgICAmJiAoaC0+cm9vdC5yb290LnUuYy5wLT5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCXsKLQkgIC8qIFRoZSBleGlzdGluZyBkZWZpbml0aW9uIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdC4gIFdlCi0JICAgICB3YW50IHRvIG92ZXJyaWRlIGl0IHdpdGggdGhlIGRlZmluaXRpb24gd2UganVzdCBmb3VuZC4KLQkgICAgIENsb2JiZXIgdGhlIGV4aXN0aW5nIGRlZmluaXRpb24uICBXZSBjYW4ndCBzZXQgaXQgdG8gbmV3LAotCSAgICAgYmVjYXVzZSBpdCBpcyBvbiB0aGUgdW5kZWZpbmVkIGxpc3QuICAqLwotCSAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkgIGgtPnJvb3Qucm9vdC51LnVuZGVmLmFiZmQgPSBoLT5yb290LnJvb3QudS5jLnAtPnNlY3Rpb24tPm93bmVyOwotCX0KLSAgICB9Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcgotICAgICAgJiYgKGgtPmZsYWdzICYgU1VOT1NfQ09OU1RSVUNUT1IpICE9IDApCi0gICAgewotICAgICAgLyogVGhlIGV4aXN0aW5nIHN5bWJvbCBpcyBhIGNvbnN0cnVjdG9yIHN5bWJvbCwgYW5kIHRoaXMgc3ltYm9sCi0gICAgICAgICBpcyBmcm9tIGEgZHluYW1pYyBvYmplY3QuICBBIGNvbnN0cnVjdG9yIHN5bWJvbCBpcyBhY3R1YWxseSBhCi0gICAgICAgICBkZWZpbml0aW9uLCBhbHRob3VnaCB0aGUgdHlwZSB3aWxsIGJlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICAgICBhdCB0aGlzIHBvaW50LiAgV2Ugd2FudCB0byBpZ25vcmUgdGhlIGRlZmluaXRpb24gZnJvbSB0aGUKLSAgICAgICAgIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSAgICAgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgIH0KLSAgZWxzZSBpZiAoKGZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwCi0JICAgJiYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMAotCSAgICYmIGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICYmIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciAhPSBOVUxMCi0JICAgJiYgKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoZSBleGlzdGluZyBzeW1ib2wgaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgdGhpcwotICAgICAgICAgaXMgYSBjb25zdHJ1Y3RvciBzeW1ib2wuICBBcyBhYm92ZSwgd2Ugd2FudCB0byBmb3JjZSB0aGUgdXNlCi0gICAgICAgICBvZiB0aGUgY29uc3RydWN0b3Igc3ltYm9sIGZyb20gdGhlIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSAgICAgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9uZXc7Ci0gICAgfQotCi0gIC8qIERvIHRoZSB1c3VhbCBwcm9jZWR1cmUgZm9yIGFkZGluZyBhIHN5bWJvbC4gICovCi0gIGlmICghIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwKLQkJCQkJICB2YWx1ZSwgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LAotCQkJCQkgIGhhc2hwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICAvKiBTZXQgYSBmbGFnIGluIHRoZSBoYXNoIHRhYmxlIGVudHJ5IGluZGljYXRpbmcgdGhlIHR5cGUgb2YKLQkgcmVmZXJlbmNlIG9yIGRlZmluaXRpb24gd2UganVzdCBmb3VuZC4gIEtlZXAgYSBjb3VudCBvZiB0aGUKLQkgbnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scyB3ZSBmaW5kLiAgQSBkeW5hbWljIHN5bWJvbCBpcyBvbmUKLQkgd2hpY2ggaXMgcmVmZXJlbmNlZCBvciBkZWZpbmVkIGJ5IGJvdGggYSByZWd1bGFyIG9iamVjdCBhbmQgYQotCSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotCXsKLQkgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQotCSAgICBuZXdfZmxhZyA9IFNVTk9TX1JFRl9SRUdVTEFSOwotCSAgZWxzZQotCSAgICBuZXdfZmxhZyA9IFNVTk9TX0RFRl9SRUdVTEFSOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSkKLQkgICAgbmV3X2ZsYWcgPSBTVU5PU19SRUZfRFlOQU1JQzsKLQkgIGVsc2UKLQkgICAgbmV3X2ZsYWcgPSBTVU5PU19ERUZfRFlOQU1JQzsKLQl9Ci0gICAgICBoLT5mbGFncyB8PSBuZXdfZmxhZzsKLQotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEKLQkgICYmIChoLT5mbGFncyAmIChTVU5PU19ERUZfUkVHVUxBUiB8IFNVTk9TX1JFRl9SRUdVTEFSKSkgIT0gMCkKLQl7Ci0JICArK3N1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLQkgIGgtPmR5bmluZHggPSAtMjsKLQl9Ci0KLSAgICAgIGlmICgoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDAKLQkgICYmIChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0JaC0+ZmxhZ3MgfD0gU1VOT1NfQ09OU1RSVUNUT1I7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGxpc3Qgb2Ygb2JqZWN0cyBuZWVkZWQgYnkgQkZELiAgKi8KLQotLypBUkdTVVNFRCovCi1zdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKgotYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdCAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgIT0gJk1ZKHZlYykpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+bmVlZGVkOwotfQotCi0vKiBSZWNvcmQgYW4gYXNzaWdubWVudCBtYWRlIHRvIGEgc3ltYm9sIGJ5IGEgbGlua2VyIHNjcmlwdC4gIFdlIG5lZWQKLSAgIHRoaXMgaW4gY2FzZSBzb21lIGR5bmFtaWMgb2JqZWN0IHJlZmVycyB0byB0aGlzIHN5bWJvbC4gICovCi0KLWJvb2xlYW4KLWJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50IChvdXRwdXRfYmZkLCBpbmZvLCBuYW1lKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGlmIChvdXRwdXRfYmZkLT54dmVjICE9ICZNWSh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHdlIGhhdmUgZXhhbWluZWQgYWxsIHRoZSBpbnB1dCBvYmplY3RzLiAgSWYKLSAgICAgdGhlIHN5bWJvbCBkb2VzIG5vdCBleGlzdCwgaXQgbWVyZWx5IG1lYW5zIHRoYXQgbm8gb2JqZWN0IHJlZmVycwotICAgICB0byBpdCwgYW5kIHdlIGNhbiBqdXN0IGlnbm9yZSBpdCBhdCB0aGlzIHBvaW50LiAgKi8KLSAgaCA9IHN1bm9zX2xpbmtfaGFzaF9sb29rdXAgKHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLAotCQkJICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSW4gYSBzaGFyZWQgbGlicmFyeSwgdGhlIF9fRFlOQU1JQyBzeW1ib2wgZG9lcyBub3QgYXBwZWFyIGluIHRoZQotICAgICBkeW5hbWljIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmICghIGluZm8tPnNoYXJlZCB8fCBzdHJjbXAgKG5hbWUsICJfX0RZTkFNSUMiKSAhPSAwKQotICAgIHsKLSAgICAgIGgtPmZsYWdzIHw9IFNVTk9TX0RFRl9SRUdVTEFSOwotCi0gICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICArK3N1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLQkgIGgtPmR5bmluZHggPSAtMjsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdXAgdGhlIHNpemVzIGFuZCBjb250ZW50cyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucyBjcmVhdGVkIGluCi0gICBzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzLiAgVGhpcyBpcyBjYWxsZWQgYnkgdGhlIFN1bk9TIGxpbmtlcgotICAgZW11bGF0aW9uIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUuICBXZSBtdXN0IHNldCB0aGUgc2l6ZXMgb2YgdGhlCi0gICBzZWN0aW9ucyBiZWZvcmUgdGhlIGxpbmtlciBzZXRzIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHZhcmlvdXMKLSAgIHNlY3Rpb25zLiAgVGhpcyB1bmZvcnR1bmF0ZWx5IHJlcXVpcmVzIHJlYWRpbmcgYWxsIHRoZSByZWxvY3Mgc28KLSAgIHRoYXQgd2UgY2FuIHdvcmsgb3V0IHdoaWNoIG9uZXMgbmVlZCB0byBiZWNvbWUgZHluYW1pYyByZWxvY3MuICBJZgotICAgaW5mby0+a2VlcF9tZW1vcnkgaXMgdHJ1ZSwgd2Uga2VlcCB0aGUgcmVsb2NzIGluIG1lbW9yeTsgb3RoZXJ3aXNlLAotICAgd2UgZGlzY2FyZCB0aGVtLCBhbmQgd2lsbCByZWFkIHRoZW0gYWdhaW4gbGF0ZXIuICAqLwotCi1ib29sZWFuCi1iZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvLCBzZHlucHRyLCBzbmVlZHB0ciwKLQkJCQkgc3J1bGVzcHRyKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqKnNkeW5wdHI7Ci0gICAgIGFzZWN0aW9uICoqc25lZWRwdHI7Ci0gICAgIGFzZWN0aW9uICoqc3J1bGVzcHRyOwotewotICBiZmQgKmR5bm9iajsKLSAgc2l6ZV90IGR5bnN5bWNvdW50OwotICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpoOwotICBhc2VjdGlvbiAqczsKLSAgc2l6ZV90IGJ1Y2tldGNvdW50OwotICBzaXplX3QgaGFzaGFsbG9jOwotICBzaXplX3QgaTsKLSAgYmZkICpzdWI7Ci0KLSAgKnNkeW5wdHIgPSBOVUxMOwotICAqc25lZWRwdHIgPSBOVUxMOwotICAqc3J1bGVzcHRyID0gTlVMTDsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChvdXRwdXRfYmZkLT54dmVjICE9ICZNWSh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIGlucHV0IEJGRCdzIGFuZCByZWFkIHRoZWlyIHJlbG9jcy4gIEl0IHdvdWxkCi0gICAgIGJlIGJldHRlciBpZiB3ZSBkaWRuJ3QgaGF2ZSB0byBkbyB0aGlzLCBidXQgdGhlcmUgaXMgbm8gb3RoZXIgd2F5Ci0gICAgIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgcmVsb2NzIHdlIG5lZWQsIGFuZCwgbW9yZQotICAgICBpbXBvcnRhbnRseSwgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IHRvIGtub3cgd2hpY2ggc3ltYm9scyBzaG91bGQKLSAgICAgZ2V0IGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGlmICgoc3ViLT5mbGFncyAmIERZTkFNSUMpID09IDAKLQkgICYmIHN1Yi0+eHZlYyA9PSBvdXRwdXRfYmZkLT54dmVjKQotCXsKLQkgIGlmICghIHN1bm9zX3NjYW5fcmVsb2NzIChpbmZvLCBzdWIsIG9ial90ZXh0c2VjIChzdWIpLAotCQkJCSAgIGV4ZWNfaGRyIChzdWIpLT5hX3Ryc2l6ZSkKLQkgICAgICB8fCAhIHN1bm9zX3NjYW5fcmVsb2NzIChpbmZvLCBzdWIsIG9ial9kYXRhc2VjIChzdWIpLAotCQkJCSAgICAgIGV4ZWNfaGRyIChzdWIpLT5hX2Ryc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGR5bnN5bWNvdW50ID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCi0gIC8qIElmIHRoZXJlIHdlcmUgbm8gZHluYW1pYyBvYmplY3RzIGluIHRoZSBsaW5rLCBhbmQgd2UgZG9uJ3QgbmVlZAotICAgICB0byBidWlsZCBhIGdsb2JhbCBvZmZzZXQgdGFibGUsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gaGVyZS4gICovCi0gIGlmICghIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX25lZWRlZAotICAgICAgJiYgISBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X25lZWRlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiBfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHdhcyBtZW50aW9uZWQsIGRlZmluZSBpdC4gICovCi0gIGggPSBzdW5vc19saW5rX2hhc2hfbG9va3VwIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICAgICJfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gIGlmIChoICE9IE5VTEwgJiYgKGgtPmZsYWdzICYgU1VOT1NfUkVGX1JFR1VMQVIpICE9IDApCi0gICAgewotICAgICAgaC0+ZmxhZ3MgfD0gU1VOT1NfREVGX1JFR1VMQVI7Ci0gICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICArK3N1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLQkgIGgtPmR5bmluZHggPSAtMjsKLQl9Ci0gICAgICBoLT5yb290LnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLSAgICAgIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQotICAgICAgLyogSWYgdGhlIC5nb3Qgc2VjdGlvbiBpcyBtb3JlIHRoYW4gMHgxMDAwIGJ5dGVzLCB3ZSBzZXQKLSAgICAgICAgIF9fR0xPQkFMX09GRlNFVF9UQUJMRV8gdG8gYmUgMHgxMDAwIGJ5dGVzIGludG8gdGhlIHNlY3Rpb24sCi0gICAgICAgICBzbyB0aGF0IDEzIGJpdCByZWxvY2F0aW9ucyBoYXZlIGEgZ3JlYXRlciBjaGFuY2Ugb2Ygd29ya2luZy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBpZiAocy0+X3Jhd19zaXplID49IDB4MTAwMCkKLQloLT5yb290LnJvb3QudS5kZWYudmFsdWUgPSAweDEwMDA7Ci0gICAgICBlbHNlCi0JaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlID0gMDsKLQotICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9iYXNlID0gaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlOwotICAgIH0KLQotICAvKiBJZiB0aGVyZSBhcmUgYW55IHNoYXJlZCBvYmplY3RzIGluIHRoZSBsaW5rLCB0aGVuIHdlIG5lZWQgdG8gc2V0Ci0gICAgIHVwIHRoZSBkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24uICAqLwotICBpZiAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkKQotICAgIHsKLSAgICAgICpzZHlucHRyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgICAgIC8qIFRoZSAuZHluYW1pYyBzZWN0aW9uIGlzIGFsd2F5cyB0aGUgc2FtZSBzaXplLiAgKi8KLSAgICAgIHMgPSAqc2R5bnB0cjsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgPSAoc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljKQotCQkgICAgICArIEVYVEVSTkFMX1NVTjRfRFlOQU1JQ19ERUJVR0dFUl9TSVpFCi0JCSAgICAgICsgc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljX2xpbmspKTsKLQotICAgICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSAuZHluc3ltIGFuZCAuaGFzaCBzZWN0aW9ucy4gIFdlIGNvdW50ZWQKLQkgdGhlIG51bWJlciBvZiBkeW5hbWljIHN5bWJvbHMgYXMgd2UgcmVhZCB0aGUgaW5wdXQgZmlsZXMuICBXZQotCSB3aWxsIGJ1aWxkIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSAoLmR5bnN5bSkgYW5kIHRoZSBoYXNoCi0JIHRhYmxlICguaGFzaCkgd2hlbiB3ZSBidWlsZCB0aGUgZmluYWwgc3ltYm9sIHRhYmxlLCBiZWNhdXNlCi0JIHVudGlsIHRoZW4gd2UgZG8gbm90IGtub3cgdGhlIGNvcnJlY3QgdmFsdWUgdG8gZ2l2ZSB0aGUKLQkgc3ltYm9scy4gIFdlIGJ1aWxkIHRoZSBkeW5hbWljIHN5bWJvbCBzdHJpbmcgdGFibGUgKC5keW5zdHIpCi0JIGluIGEgdHJhdmVyc2FsIG9mIHRoZSBzeW1ib2wgdGFibGUgdXNpbmcKLQkgc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbC4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgPSBkeW5zeW1jb3VudCAqIHNpemVvZiAoc3RydWN0IGV4dGVybmFsX25saXN0KTsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgLyogVGhlIG51bWJlciBvZiBidWNrZXRzIGlzIGp1c3QgdGhlIG51bWJlciBvZiBzeW1ib2xzIGRpdmlkZWQKLQkgYnkgZm91ci4gIFRvIGNvbXB1dGUgdGhlIGZpbmFsIHNpemUgb2YgdGhlIGhhc2ggdGFibGUsIHdlCi0JIG11c3QgYWN0dWFsbHkgY29tcHV0ZSB0aGUgaGFzaCB0YWJsZS4gIE5vcm1hbGx5IHdlIG5lZWQKLQkgZXhhY3RseSBhcyBtYW55IGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUgYXMgdGhlcmUgYXJlCi0JIGR5bmFtaWMgc3ltYm9scywgYnV0IGlmIHNvbWUgb2YgdGhlIGJ1Y2tldHMgYXJlIG5vdCB1c2VkIHdlCi0JIHdpbGwgbmVlZCBhZGRpdGlvbmFsIGVudHJpZXMuICBJbiB0aGUgd29yc3QgY2FzZSwgZXZlcnkKLQkgc3ltYm9sIHdpbGwgaGFzaCB0byB0aGUgc2FtZSBidWNrZXQsIGFuZCB3ZSB3aWxsIG5lZWQKLQkgQlVDS0VUQ09VTlQgLSAxIGV4dHJhIGVudHJpZXMuICAqLwotICAgICAgaWYgKGR5bnN5bWNvdW50ID49IDQpCi0JYnVja2V0Y291bnQgPSBkeW5zeW1jb3VudCAvIDQ7Ci0gICAgICBlbHNlIGlmIChkeW5zeW1jb3VudCA+IDApCi0JYnVja2V0Y291bnQgPSBkeW5zeW1jb3VudDsKLSAgICAgIGVsc2UKLQlidWNrZXRjb3VudCA9IDE7Ci0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5oYXNoIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgaGFzaGFsbG9jID0gKGR5bnN5bWNvdW50ICsgYnVja2V0Y291bnQgLSAxKSAqIEhBU0hfRU5UUllfU0laRTsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBoYXNoYWxsb2MpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgZHluc3ltY291bnQgPiAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG1lbXNldCAocy0+Y29udGVudHMsIDAsIGhhc2hhbGxvYyk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYnVja2V0Y291bnQ7IGkrKykKLQlQVVRfV09SRCAob3V0cHV0X2JmZCwgKGJmZF92bWEpIC0xLCBzLT5jb250ZW50cyArIGkgKiBIQVNIX0VOVFJZX1NJWkUpOwotICAgICAgcy0+X3Jhd19zaXplID0gYnVja2V0Y291bnQgKiBIQVNIX0VOVFJZX1NJWkU7Ci0KLSAgICAgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5idWNrZXRjb3VudCA9IGJ1Y2tldGNvdW50OwotCi0gICAgICAvKiBTY2FuIGFsbCB0aGUgc3ltYm9scywgcGxhY2UgdGhlbSBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsCi0JIGFuZCBidWlsZCB0aGUgZHluYW1pYyBoYXNoIHRhYmxlLiAgV2UgcmV1c2UgZHluc3ltY291bnQgYXMgYQotCSBjb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgd2UgaGF2ZSBhZGRlZCBzbyBmYXIuICAqLwotICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ID0gMDsKLSAgICAgIHN1bm9zX2xpbmtfaGFzaF90cmF2ZXJzZSAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCwKLQkJCQkoUFRSKSBpbmZvKTsKLSAgICAgIEJGRF9BU1NFUlQgKHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCA9PSBkeW5zeW1jb3VudCk7Ci0KLSAgICAgIC8qIFRoZSBTdW5PUyBuYXRpdmUgbGlua2VyIHNlZW1zIHRvIGFsaWduIHRoZSB0b3RhbCBzaXplIG9mIHRoZQotCSBzeW1ib2wgc3RyaW5ncyB0byBhIG11bHRpcGxlIG9mIDguICBJIGRvbid0IGtub3cgaWYgdGhpcyBpcwotCSBpbXBvcnRhbnQsIGJ1dCBpdCBjYW4ndCBodXJ0IG11Y2guICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3RyIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgaWYgKChzLT5fcmF3X3NpemUgJiA3KSAhPSAwKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgYWRkOwotCSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotCi0JICBhZGQgPSA4IC0gKHMtPl9yYXdfc2l6ZSAmIDcpOwotCSAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3JlYWxsb2MgKHMtPmNvbnRlbnRzLAotCQkJCQkgICAgICAgKHNpemVfdCkgKHMtPl9yYXdfc2l6ZSArIGFkZCkpOwotCSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIG1lbXNldCAoY29udGVudHMgKyBzLT5fcmF3X3NpemUsIDAsIChzaXplX3QpIGFkZCk7Ci0JICBzLT5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgcy0+X3Jhd19zaXplICs9IGFkZDsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgd29ya2VkIG91dCB0aGUgc2l6ZXMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlCi0gICAgIHRhYmxlIGFuZCB0aGUgZHluYW1pYyByZWxvY3MsIGFsbG9jYXRlIHN0b3JhZ2UgZm9yIHRoZW0uICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgaWYgKHMtPl9yYXdfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgdGFibGUuICAqLwotICAgICAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGR5bm9iaikpCi0JewotCWNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0JICBtZW1jcHkgKHMtPmNvbnRlbnRzLCBzcGFyY19wbHRfZmlyc3RfZW50cnksIFNQQVJDX1BMVF9FTlRSWV9TSVpFKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfYXJjaF9tNjhrOgotCSAgbWVtY3B5IChzLT5jb250ZW50cywgbTY4a19wbHRfZmlyc3RfZW50cnksIE02OEtfUExUX0VOVFJZX1NJWkUpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKLSAgaWYgKHMtPl9yYXdfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IG9mIHRoZQotICAgICByZWxvY3Mgd2UgaGF2ZSBvdXRwdXQgc28gZmFyLiAgKi8KLSAgcy0+cmVsb2NfY291bnQgPSAwOwotCi0gIC8qIE1ha2Ugc3BhY2UgZm9yIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKnNuZWVkcHRyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5uZWVkIik7Ci0gICpzcnVsZXNwdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJ1bGVzIik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNjYW4gdGhlIHJlbG9jcyBmb3IgYW4gaW5wdXQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19zY2FuX3JlbG9jcyAoaW5mbywgYWJmZCwgc2VjLCByZWxfc2l6ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKLXsKLSAgUFRSIHJlbG9jczsKLSAgUFRSIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotICBpZiAocmVsX3NpemUgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSkKLSAgICByZWxvY3MgPSBmcmVlX3JlbG9jcyA9IGJmZF9tYWxsb2MgKChzaXplX3QpIHJlbF9zaXplKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBhb3V0X3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKm47Ci0KLSAgICAgIG4gPSAoKHN0cnVjdCBhb3V0X3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKikKLQkgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCkpKTsKLSAgICAgIGlmIChuID09IE5VTEwpCi0JcmVsb2NzID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzZXRfYW91dF9zZWN0aW9uX2RhdGEgKHNlYywgbik7Ci0JICByZWxvY3MgPSBiZmRfbWFsbG9jICgoc2l6ZV90KSByZWxfc2l6ZSk7Ci0JICBhb3V0X3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gcmVsb2NzOwotCX0KLSAgICB9Ci0gIGlmIChyZWxvY3MgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWMtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKHJlbG9jcywgMSwgcmVsX3NpemUsIGFiZmQpICE9IHJlbF9zaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPT0gUkVMT0NfU1REX1NJWkUpCi0gICAgewotICAgICAgaWYgKCEgc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzIChpbmZvLCBhYmZkLCBzZWMsCi0JCQkJICAgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2NzLAotCQkJCSAgIHJlbF9zaXplKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBzdW5vc19zY2FuX2V4dF9yZWxvY3MgKGluZm8sIGFiZmQsIHNlYywKLQkJCQkgICAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSByZWxvY3MsCi0JCQkJICAgcmVsX3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTY2FuIHRoZSByZWxvY3MgZm9yIGFuIGlucHV0IHNlY3Rpb24gdXNpbmcgc3RhbmRhcmQgcmVsb2NzLiAgV2UKLSAgIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRvIGRvIGZvciBlYWNoIHJlbG9jIGFnYWluc3QgYSBkeW5hbWljCi0gICBzeW1ib2wuICBJZiB0aGUgc3ltYm9sIGlzIGluIHRoZSAudGV4dCBzZWN0aW9uLCBhbiBlbnRyeSBpcyBtYWRlIGluCi0gICB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBOb3RlIHRoYXQgdGhpcyB3aWxsIGRvIHRoZSB3cm9uZwotICAgdGhpbmcgaWYgdGhlIHN5bWJvbCBpcyBhY3R1YWxseSBkYXRhOyBJIGRvbid0IHRoaW5rIHRoZSBTdW4gMwotICAgbmF0aXZlIGxpbmtlciBoYW5kbGVzIHRoaXMgY2FzZSBjb3JyZWN0bHkgZWl0aGVyLiAgSWYgdGhlIHN5bWJvbCBpcwotICAgbm90IGluIHRoZSAudGV4dCBzZWN0aW9uLCB3ZSBtdXN0IHByZXNlcnZlIHRoZSByZWxvYyBhcyBhIGR5bmFtaWMKLSAgIHJlbG9jLiAgRklYTUU6IFdlIHNob3VsZCBhbHNvIGhhbmRsZSB0aGUgUElDIHJlbG9jcyBoZXJlIGJ5Ci0gICBidWlsZGluZyBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJpZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzIChpbmZvLCBhYmZkLCBzZWMsIHJlbG9jcywgcmVsX3NpemUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbG9jczsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzcGx0ID0gTlVMTDsKLSAgYXNlY3Rpb24gKnNyZWwgPSBOVUxMOwotICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgY29uc3Qgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsLCAqcmVsZW5kOwotCi0gIC8qIFdlIG9ubHkga25vdyBob3cgdG8gaGFuZGxlIG02OGsgcGx0IGVudHJpZXMuICAqLwotICBpZiAoYmZkX2dldF9hcmNoIChhYmZkKSAhPSBiZmRfYXJjaF9tNjhrKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGR5bm9iaiA9IE5VTEw7Ci0KLSAgc3ltX2hhc2hlcyA9IChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICoqKSBvYmpfYW91dF9zeW1faGFzaGVzIChhYmZkKTsKLQotICByZWxlbmQgPSByZWxvY3MgKyByZWxfc2l6ZSAvIFJFTE9DX1NURF9TSVpFOwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl9pbmRleDsKLSAgICAgIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIC8qIFdlIG9ubHkgd2FudCByZWxvY3MgYWdhaW5zdCBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotCXsKLQkgIGlmICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHKSA9PSAwKQotCSAgICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUpID09IDApCi0JICAgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSBzeW1ib2wgaW5kZXguICAqLwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0Jcl9pbmRleCA9ICgocmVsLT5yX2luZGV4WzBdIDw8IDE2KQotCQkgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgfCByZWwtPnJfaW5kZXhbMl0pOwotICAgICAgZWxzZQotCXJfaW5kZXggPSAoKHJlbC0+cl9pbmRleFsyXSA8PCAxNikKLQkJICAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCSAgIHwgcmVsLT5yX2luZGV4WzBdKTsKLQotICAgICAgLyogR2V0IHRoZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgICAgIGggPSBzeW1faGFzaGVzW3JfaW5kZXhdOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICAvKiBUaGlzIHNob3VsZCBub3Qgbm9ybWFsbHkgaGFwcGVuLCBidXQgaXQgd2lsbCBpbiBhbnkgY2FzZQotCSAgICAgYmUgY2F1Z2h0IGluIHRoZSByZWxvY2F0aW9uIHBoYXNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQXQgdGhpcyBwb2ludCBjb21tb24gc3ltYm9scyBoYXZlIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQsIHNvCi0JIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlbS4gIFdlIG5lZWQgdG8gY29uc2lkZXIgdGhhdAotCSB3ZSBtYXkgaGF2ZSBhbHJlYWR5IHNlZW4gdGhpcyBzeW1ib2wgYW5kIG1hcmtlZCBpdCB1bmRlZmluZWQ7Ci0JIGlmIHRoZSBzeW1ib2wgaXMgcmVhbGx5IHVuZGVmaW5lZCwgdGhlbiBTVU5PU19ERUZfRFlOQU1JQwotCSB3aWxsIGJlIHplcm8uICAqLwotICAgICAgaWYgKGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSA9PSAwCi0JICB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZ290OwotCi0JICBpZiAoISBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbywgZmFsc2UpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCSAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0JICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKLQkgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOwotCi0JICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICBpZiAoc2dvdC0+X3Jhd19zaXplID09IDApCi0JICAgIHNnb3QtPl9yYXdfc2l6ZSA9IEJZVEVTX0lOX1dPUkQ7Ci0JICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X25lZWRlZCA9IHRydWU7Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUICgoaC0+ZmxhZ3MgJiBTVU5PU19SRUZfUkVHVUxBUikgIT0gMCk7Ci0gICAgICBCRkRfQVNTRVJUIChoLT5wbHRfb2Zmc2V0ICE9IDAKLQkJICB8fCAoKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgICA/IChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzCi0JCQkgJiBEWU5BTUlDKSAhPSAwCi0JCSAgICAgIDogKGgtPnJvb3Qucm9vdC51LnVuZGVmLmFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkpOwotCi0gICAgICAvKiBUaGlzIHJlbG9jIGlzIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBvbmx5IGJ5IGEgZHluYW1pYwotCSBvYmplY3QuICAqLwotCi0gICAgICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JewotCSAgLyogUHJlc3VtYWJseSB0aGlzIHN5bWJvbCB3YXMgbWFya2VkIGFzIGJlaW5nIHVuZGVmaW5lZCBieQotCSAgICAgYW4gZWFybGllciByZWxvYy4gICovCi0JICBzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfU1REX1NJWkU7Ci0JfQotICAgICAgZWxzZSBpZiAoKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotCXsKLQkgIGJmZCAqc3ViOwotCi0JICAvKiBUaGlzIHJlbG9jIGlzIG5vdCBpbiB0aGUgLnRleHQgc2VjdGlvbi4gIEl0IG11c3QgYmUKLQkgICAgIGNvcGllZCBpbnRvIHRoZSBkeW5hbWljIHJlbG9jcy4gIFdlIG1hcmsgdGhlIHN5bWJvbCBhcwotCSAgICAgYmVpbmcgdW5kZWZpbmVkLiAgKi8KLQkgIHNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19TVERfU0laRTsKLQkgIHN1YiA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQkgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICBoLT5yb290LnJvb3QudS51bmRlZi5hYmZkID0gc3ViOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIHN5bWJvbCBpcyBpbiB0aGUgLnRleHQgc2VjdGlvbi4gIFdlIG11c3QgZ2l2ZSBpdCBhbgotCSAgICAgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBpZiB3ZSBoYXZlIG5vdAotCSAgICAgYWxyZWFkeSBkb25lIHNvLiAgV2UgY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBzeW1ib2wKLQkgICAgIHRvIHRoZSAucGx0IHNlY3Rpb247IHRoaXMgd2lsbCBjYXVzZSByZWxvY3MgYWdhaW5zdCBpdCB0bwotCSAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotCSAgaWYgKGgtPnBsdF9vZmZzZXQgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPT0gMCkKLQkJc3BsdC0+X3Jhd19zaXplID0gTTY4S19QTFRfRU5UUllfU0laRTsKLQkgICAgICBoLT5wbHRfb2Zmc2V0ID0gc3BsdC0+X3Jhd19zaXplOwotCi0JICAgICAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQotCQl7Ci0JCSAgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPSBzcGx0OwotCQkgIGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSA9IHNwbHQtPl9yYXdfc2l6ZTsKLQkJfQotCi0JICAgICAgc3BsdC0+X3Jhd19zaXplICs9IE02OEtfUExUX0VOVFJZX1NJWkU7Ci0KLQkgICAgICAvKiBXZSBtYXkgYWxzbyBuZWVkIGEgZHluYW1pYyByZWxvYyBlbnRyeS4gICovCi0JICAgICAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQotCQlzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfU1REX1NJWkU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTY2FuIHRoZSByZWxvY3MgZm9yIGFuIGlucHV0IHNlY3Rpb24gdXNpbmcgZXh0ZW5kZWQgcmVsb2NzLiAgV2UKLSAgIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRvIGRvIGZvciBlYWNoIHJlbG9jIGFnYWluc3QgYSBkeW5hbWljCi0gICBzeW1ib2wuICBJZiB0aGUgcmVsb2MgaXMgYSBXRElTUDMwLCBhbmQgdGhlIHN5bWJvbCBpcyBpbiB0aGUgLnRleHQKLSAgIHNlY3Rpb24sIGFuIGVudHJ5IGlzIG1hZGUgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLgotICAgT3RoZXJ3aXNlLCB3ZSBtdXN0IHByZXNlcnZlIHRoZSByZWxvYyBhcyBhIGR5bmFtaWMgcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3Nfc2Nhbl9leHRfcmVsb2NzIChpbmZvLCBhYmZkLCBzZWMsIHJlbG9jcywgcmVsX3NpemUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJlbG9jczsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBjb25zdCBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpyZWwsICpyZWxlbmQ7Ci0gIGFzZWN0aW9uICpzcGx0ID0gTlVMTDsKLSAgYXNlY3Rpb24gKnNnb3QgPSBOVUxMOwotICBhc2VjdGlvbiAqc3JlbCA9IE5VTEw7Ci0KLSAgLyogV2Ugb25seSBrbm93IGhvdyB0byBoYW5kbGUgU1BBUkMgcGx0IGVudHJpZXMuICAqLwotICBpZiAoYmZkX2dldF9hcmNoIChhYmZkKSAhPSBiZmRfYXJjaF9zcGFyYykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBkeW5vYmogPSBOVUxMOwotCi0gIHN5bV9oYXNoZXMgPSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKikgb2JqX2FvdXRfc3ltX2hhc2hlcyAoYWJmZCk7Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgcmVsX3NpemUgLyBSRUxPQ19FWFRfU0laRTsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHJfaW5kZXg7Ci0gICAgICBpbnQgcl9leHRlcm47Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7Ci0KLSAgICAgIC8qIFN3YXAgaW4gdGhlIHJlbG9jIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotCXsKLQkgIHJfaW5kZXggPSAoKHJlbC0+cl9pbmRleFswXSA8PCAxNikKLQkJICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgICB8IHJlbC0+cl9pbmRleFsyXSk7Ci0JICByX2V4dGVybiA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcpKTsKLQkgIHJfdHlwZSA9ICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0JJRykKLQkJICAgID4+IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcl9pbmRleCA9ICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICAgIHwgcmVsLT5yX2luZGV4WzBdKTsKLQkgIHJfZXh0ZXJuID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRSkpOwotCSAgcl90eXBlID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFKQotCQkgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUpOwotCX0KLQotICAgICAgaWYgKHJfZXh0ZXJuKQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3JfaW5kZXhdOwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc2hvdWxkIG5vdCBub3JtYWxseSBoYXBwZW4sIGJ1dCBpdCB3aWxsIGluIGFueQotCQkgY2FzZSBiZSBjYXVnaHQgaW4gdGhlIHJlbG9jYXRpb24gcGhhc2UuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgYmFzZSByZWxhdGl2ZSByZWxvYywgd2UgbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluCi0gICAgICAgICB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChyX3R5cGUgPT0gUkVMT0NfQkFTRTEwCi0JICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCi0JICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQotCXsKLQkgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvLCBmYWxzZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZ290ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGluaXRpYWwgZW50cnkgaW4gdGhlIC5nb3QgdGFibGUuICAqLwotCSAgICAgIGlmIChzZ290LT5fcmF3X3NpemUgPT0gMCkKLQkJc2dvdC0+X3Jhd19zaXplID0gQllURVNfSU5fV09SRDsKLQkgICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X25lZWRlZCA9IHRydWU7Ci0JICAgIH0KLQotCSAgaWYgKHJfZXh0ZXJuKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdF9vZmZzZXQgIT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICBoLT5nb3Rfb2Zmc2V0ID0gc2dvdC0+X3Jhd19zaXplOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAocl9pbmRleCA+PSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSkKLQkJewotCQkgIC8qIFRoaXMgaXMgYWJub3JtYWwsIGJ1dCBzaG91bGQgYmUgY2F1Z2h0IGluIHRoZQotCQkgICAgIHJlbG9jYXRpb24gcGhhc2UuICAqLwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBpZiAoYWRhdGEgKGFiZmQpLmxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCi0JCXsKLQkJICBhZGF0YSAoYWJmZCkubG9jYWxfZ290X29mZnNldHMgPQotCQkgICAgKGJmZF92bWEgKikgYmZkX3phbGxvYyAoYWJmZCwKLQkJCQkJICAgIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKQotCQkJCQkgICAgICogc2l6ZW9mIChiZmRfdm1hKSkpOwotCQkgIGlmIChhZGF0YSAoYWJmZCkubG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgaWYgKGFkYXRhIChhYmZkKS5sb2NhbF9nb3Rfb2Zmc2V0c1tyX2luZGV4XSAhPSAwKQotCQljb250aW51ZTsKLQotCSAgICAgIGFkYXRhIChhYmZkKS5sb2NhbF9nb3Rfb2Zmc2V0c1tyX2luZGV4XSA9IHNnb3QtPl9yYXdfc2l6ZTsKLQkgICAgfQotCi0JICBzZ290LT5fcmF3X3NpemUgKz0gQllURVNfSU5fV09SRDsKLQotCSAgLyogSWYgd2UgYXJlIG1ha2luZyBhIHNoYXJlZCBsaWJyYXJ5LCBvciBpZiB0aGUgc3ltYm9sIGlzCi0JICAgICBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIHdlIHdpbGwgbmVlZCBhIGR5bmFtaWMgcmVsb2MKLQkgICAgIGVudHJ5LiAgKi8KLQkgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICB8fCAoaCAhPSBOVUxMCi0JCSAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpICE9IDAKLQkJICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkpCi0JICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19FWFRfU0laRTsKLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBPdGhlcndpc2UsIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gcmVsb2NzIGFnYWluc3Qgc3ltYm9scwotICAgICAgICAgZGVmaW5lZCBpbiBkeW5hbWljIG9iamVjdHMgYnV0IG5vdCBpbiByZWd1bGFyIG9iamVjdHMuICBXZQotICAgICAgICAgb25seSBuZWVkIHRvIGNvbnNpZGVyIHJlbG9jcyBhZ2FpbnN0IGV4dGVybmFsIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCEgcl9leHRlcm4pCi0JewotCSAgLyogQnV0LCBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbmVlZCB0bwotICAgICAgICAgICAgIGdlbmVyYXRlIGFuIGFic29sdXRlIHJlbG9jLiAgKi8KLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JCXsKLQkJICBpZiAoISBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbywgdHJ1ZSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQkJICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkJICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkJICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKLQkJICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7Ci0JCX0KLQotCSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19FWFRfU0laRTsKLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEF0IHRoaXMgcG9pbnQgY29tbW9uIHN5bWJvbHMgaGF2ZSBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLCBzbwotCSB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZW0uICBXZSBuZWVkIHRvIGNvbnNpZGVyIHRoYXQKLQkgd2UgbWF5IGhhdmUgYWxyZWFkeSBzZWVuIHRoaXMgc3ltYm9sIGFuZCBtYXJrZWQgaXQgdW5kZWZpbmVkOwotCSBpZiB0aGUgc3ltYm9sIGlzIHJlYWxseSB1bmRlZmluZWQsIHRoZW4gU1VOT1NfREVGX0RZTkFNSUMKLQkgd2lsbCBiZSB6ZXJvLiAgKi8KLSAgICAgIGlmIChoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCSAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChyX3R5cGUgIT0gUkVMT0NfSk1QX1RCTAotCSAgJiYgISBpbmZvLT5zaGFyZWQKLQkgICYmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgPT0gMAotCSAgICAgIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSAhPSAwKSkKLQljb250aW51ZTsKLQotICAgICAgaWYgKHJfdHlwZSA9PSBSRUxPQ19KTVBfVEJMCi0JICAmJiAhIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpID09IDAKLQkgICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIFRoaXMgc3ltYm9sIGlzIGFwcGFyZW50bHkgdW5kZWZpbmVkLiAgRG9uJ3QgZG8gYW55dGhpbmcKLSAgICAgICAgICAgICBoZXJlOyBqdXN0IGxldCB0aGUgcmVsb2NhdGlvbiByb3V0aW5lIHJlcG9ydCBhbiB1bmRlZmluZWQKLSAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsICJfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCXsKLQkgIGlmICghIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvLCBmYWxzZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0JICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHlucmVsIik7Ci0JICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7Ci0KLQkgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGluaXRpYWwgZW50cnkgaW4gdGhlIC5nb3QgdGFibGUuICAqLwotCSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICBzZ290LT5fcmF3X3NpemUgPSBCWVRFU19JTl9XT1JEOwotCSAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9uZWVkZWQgPSB0cnVlOwotCX0KLQotICAgICAgQkZEX0FTU0VSVCAocl90eXBlID09IFJFTE9DX0pNUF9UQkwKLQkJICB8fCBpbmZvLT5zaGFyZWQKLQkJICB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19SRUZfUkVHVUxBUikgIT0gMCk7Ci0gICAgICBCRkRfQVNTRVJUIChyX3R5cGUgPT0gUkVMT0NfSk1QX1RCTAotCQkgIHx8IGluZm8tPnNoYXJlZAotCQkgIHx8IGgtPnBsdF9vZmZzZXQgIT0gMAotCQkgIHx8ICgoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCSAgICAgID8gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MKLQkJCSAmIERZTkFNSUMpICE9IDAKLQkJICAgICAgOiAoaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKSk7Ci0KLSAgICAgIC8qIFRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIG9ubHkgYnkgYSBkeW5hbWljCi0JIG9iamVjdCwgb3IgaXQgaXMgYSBqdW1wIHRhYmxlIHJlbG9jIGZyb20gUElDIGNvbXBpbGVkIGNvZGUuICAqLwotCi0gICAgICBpZiAocl90eXBlICE9IFJFTE9DX0pNUF9UQkwKLQkgICYmIGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCXsKLQkgIC8qIFByZXN1bWFibHkgdGhpcyBzeW1ib2wgd2FzIG1hcmtlZCBhcyBiZWluZyB1bmRlZmluZWQgYnkKLQkgICAgIGFuIGVhcmxpZXIgcmVsb2MuICAqLwotCSAgc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX0VYVF9TSVpFOwotCX0KLSAgICAgIGVsc2UgaWYgKHJfdHlwZSAhPSBSRUxPQ19KTVBfVEJMCi0JICAgICAgICYmIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLQl7Ci0JICBiZmQgKnN1YjsKLQotCSAgLyogVGhpcyByZWxvYyBpcyBub3QgaW4gdGhlIC50ZXh0IHNlY3Rpb24uICBJdCBtdXN0IGJlCi0JICAgICBjb3BpZWQgaW50byB0aGUgZHluYW1pYyByZWxvY3MuICBXZSBtYXJrIHRoZSBzeW1ib2wgYXMKLQkgICAgIGJlaW5nIHVuZGVmaW5lZC4gICovCi0JICBzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfRVhUX1NJWkU7Ci0JICBpZiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JICAgIHsKLQkgICAgICBzdWIgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0JICAgICAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkgICAgICBoLT5yb290LnJvb3QudS51bmRlZi5hYmZkID0gc3ViOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgc3ltYm9sIGlzIGluIHRoZSAudGV4dCBzZWN0aW9uLiAgV2UgbXVzdCBnaXZlIGl0IGFuCi0JICAgICBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGlmIHdlIGhhdmUgbm90Ci0JICAgICBhbHJlYWR5IGRvbmUgc28uICBXZSBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YgdGhlIHN5bWJvbAotCSAgICAgdG8gdGhlIC5wbHQgc2VjdGlvbjsgdGhpcyB3aWxsIGNhdXNlIHJlbG9jcyBhZ2FpbnN0IGl0IHRvCi0JICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0JICBpZiAoaC0+cGx0X29mZnNldCA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA9PSAwKQotCQlzcGx0LT5fcmF3X3NpemUgPSBTUEFSQ19QTFRfRU5UUllfU0laRTsKLQkgICAgICBoLT5wbHRfb2Zmc2V0ID0gc3BsdC0+X3Jhd19zaXplOwotCi0JICAgICAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQotCQl7Ci0JCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCQkgICAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JCSAgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPSBzcGx0OwotCQkgIGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSA9IHNwbHQtPl9yYXdfc2l6ZTsKLQkJfQotCi0JICAgICAgc3BsdC0+X3Jhd19zaXplICs9IFNQQVJDX1BMVF9FTlRSWV9TSVpFOwotCi0JICAgICAgLyogV2Ugd2lsbCBhbHNvIG5lZWQgYSBkeW5hbWljIHJlbG9jIGVudHJ5LCB1bmxlc3MgdGhpcwotICAgICAgICAgICAgICAgICBpcyBhIEpNUF9UQkwgcmVsb2MgcHJvZHVjZWQgYnkgbGlua2luZyBQSUMgY29tcGlsZWQKLSAgICAgICAgICAgICAgICAgY29kZSwgYW5kIHdlIGFyZSBub3QgbWFraW5nIGEgc2hhcmVkIGxpYnJhcnkuICAqLwotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JCXNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19FWFRfU0laRTsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbmVlZCB0byBjb3B5IG92ZXIKLSAgICAgICAgICAgICBhbnkgcmVsb2Mgb3RoZXIgdGhhbiBhIGp1bXAgdGFibGUgcmVsb2MuICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZCAmJiByX3R5cGUgIT0gUkVMT0NfSk1QX1RCTCkKLQkgICAgc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX0VYVF9TSVpFOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEJ1aWxkIHRoZSBoYXNoIHRhYmxlIG9mIGR5bmFtaWMgc3ltYm9scywgYW5kIHRvIG1hcmsgYXMgd3JpdHRlbiBhbGwKLSAgIHN5bWJvbHMgZnJvbSBkeW5hbWljIG9iamVjdHMgd2hpY2ggd2UgZG8gbm90IHBsYW4gdG8gd3JpdGUgb3V0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSBkYXRhOwotCi0gIC8qIFNldCB0aGUgd3JpdHRlbiBmbGFnIGZvciBzeW1ib2xzIHdlIGRvIG5vdCB3YW50IHRvIHdyaXRlIG91dCBhcwotICAgICBwYXJ0IG9mIHRoZSByZWd1bGFyIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgYWxsIHN5bWJvbHMgd2hpY2ggYXJlCi0gICAgIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QgZmlsZS4gIEZvciBzb21lIHJlYXNvbiBzeW1ib2xzCi0gICAgIHdoaWNoIGFyZSByZWZlcmVuY2VkIGJ5IGEgcmVndWxhciBvYmplY3QgYW5kIGRlZmluZWQgYnkgYSBkeW5hbWljCi0gICAgIG9iamVjdCBkbyBub3Qgc2VlbSB0byBzaG93IHVwIGluIHRoZSByZWd1bGFyIHN5bWJvbCB0YWJsZS4gIEl0IGlzCi0gICAgIHBvc3NpYmxlIGZvciBhIHN5bWJvbCB0byBoYXZlIG9ubHkgU1VOT1NfUkVGX1JFR1VMQVIgc2V0IGhlcmUsIGl0Ci0gICAgIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wgd2hpY2ggd2FzIHR1cm5lZCBpbnRvIGEgY29tbW9uIHN5bWJvbAotICAgICBiZWNhdXNlIGl0IHdhcyBmb3VuZCBpbiBhbiBhcmNoaXZlIG9iamVjdCB3aGljaCB3YXMgbm90IGluY2x1ZGVkCi0gICAgIGluIHRoZSBsaW5rLiAgKi8KLSAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgIT0gMAotICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsICJfX0RZTkFNSUMiKSAhPSAwKQotICAgIGgtPnJvb3Qud3JpdHRlbiA9IHRydWU7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgICAgcmVndWxhciBvYmplY3QsIHNlZSB3aGV0aGVyIHdlIGdhdmUgaXQgYSByZWFzb25hYmxlIHZhbHVlIHdoaWxlCi0gICAgIHNjYW5uaW5nIHRoZSByZWxvY3MuICAqLwotCi0gIGlmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMAotICAgICAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpICE9IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFNVTk9TX1JFRl9SRUdVTEFSKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICgoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLQkgICYmIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCXsKLQkgIGJmZCAqc3ViOwotCi0JICAvKiBUaGlzIHN5bWJvbCBpcyBjdXJyZW50bHkgZGVmaW5lZCBpbiBhIGR5bmFtaWMgc2VjdGlvbgotCSAgICAgd2hpY2ggaXMgbm90IGJlaW5nIHB1dCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMKLQkgICAgIGltcGxpZXMgdGhhdCB0aGVyZSBpcyBubyByZWxvYyBhZ2FpbnN0IHRoZSBzeW1ib2wuICBJJ20KLQkgICAgIG5vdCBzdXJlIHdoeSB0aGlzIGNhc2Ugd291bGQgZXZlciBvY2N1ci4gIEluIGFueSBjYXNlLCB3ZQotCSAgICAgY2hhbmdlIHRoZSBzeW1ib2wgdG8gYmUgdW5kZWZpbmVkLiAgKi8KLQkgIHN1YiA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQkgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICBoLT5yb290LnJvb3QudS51bmRlZi5hYmZkID0gc3ViOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBvciByZWZlcmVuY2VkIGJ5IGEgcmVndWxhciBmaWxlLCBhZGQgaXQKLSAgICAgdG8gdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0gIGlmICgoaC0+ZmxhZ3MgJiAoU1VOT1NfREVGX1JFR1VMQVIgfCBTVU5PU19SRUZfUkVHVUxBUikpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBzaXplX3QgbGVuOwotICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICAgdW5zaWduZWQgY2hhciAqbmFtZTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaGFzaDsKLSAgICAgIGJmZCAqZHlub2JqOwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ID09IC0yKTsKLQotICAgICAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAgICAgaC0+ZHluaW5keCA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLSAgICAgICsrc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCi0gICAgICBsZW4gPSBzdHJsZW4gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0KLSAgICAgIC8qIFdlIGRvbid0IGJvdGhlciB0byBjb25zdHJ1Y3QgYSBCRkQgaGFzaCB0YWJsZSBmb3IgdGhlIHN0cmluZ3MKLQkgd2hpY2ggYXJlIHRoZSBuYW1lcyBvZiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgVXNpbmcgYSBoYXNoCi0JIHRhYmxlIGZvciB0aGUgcmVndWxhciBzeW1ib2xzIGlzIGJlbmVmaWNpYWwsIGJlY2F1c2UgdGhlCi0JIHJlZ3VsYXIgc3ltYm9scyBpbmNsdWRlcyB0aGUgZGVidWdnaW5nIHN5bWJvbHMsIHdoaWNoIGhhdmUKLQkgbG9uZyBuYW1lcyBhbmQgYXJlIG9mdGVuIGR1cGxpY2F0ZWQgaW4gc2V2ZXJhbCBvYmplY3QgZmlsZXMuCi0JIFRoZXJlIGFyZSBubyBkZWJ1Z2dpbmcgc3ltYm9scyBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN0ciIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9yZWFsbG9jIChzLT5jb250ZW50cywKLQkJCQkJICAgcy0+X3Jhd19zaXplICsgbGVuICsgMSk7Ci0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzLT5jb250ZW50cyA9IGNvbnRlbnRzOwotCi0gICAgICBoLT5keW5zdHJfaW5kZXggPSBzLT5fcmF3X3NpemU7Ci0gICAgICBzdHJjcHkgKChjaGFyICopIGNvbnRlbnRzICsgcy0+X3Jhd19zaXplLCBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotICAgICAgcy0+X3Jhd19zaXplICs9IGxlbiArIDE7Ci0KLSAgICAgIC8qIEFkZCBpdCB0byB0aGUgZHluYW1pYyBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIG5hbWUgPSAodW5zaWduZWQgY2hhciAqKSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBoYXNoID0gMDsKLSAgICAgIHdoaWxlICgqbmFtZSAhPSAnXDAnKQotCWhhc2ggPSAoaGFzaCA8PCAxKSArICpuYW1lKys7Ci0gICAgICBoYXNoICY9IDB4N2ZmZmZmZmY7Ci0gICAgICBoYXNoICU9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5idWNrZXRjb3VudDsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaGFzaCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgaWYgKEdFVF9TV09SRCAoZHlub2JqLCBzLT5jb250ZW50cyArIGhhc2ggKiBIQVNIX0VOVFJZX1NJWkUpID09IC0xKQotCVBVVF9XT1JEIChkeW5vYmosIGgtPmR5bmluZHgsIHMtPmNvbnRlbnRzICsgaGFzaCAqIEhBU0hfRU5UUllfU0laRSk7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSBuZXh0OwotCi0JICBuZXh0ID0gR0VUX1dPUkQgKGR5bm9iaiwKLQkJCSAgIChzLT5jb250ZW50cwotCQkJICAgICsgaGFzaCAqIEhBU0hfRU5UUllfU0laRQotCQkJICAgICsgQllURVNfSU5fV09SRCkpOwotCSAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+X3Jhd19zaXplIC8gSEFTSF9FTlRSWV9TSVpFLAotCQkgICAgcy0+Y29udGVudHMgKyBoYXNoICogSEFTSF9FTlRSWV9TSVpFICsgQllURVNfSU5fV09SRCk7Ci0JICBQVVRfV09SRCAoZHlub2JqLCBoLT5keW5pbmR4LCBzLT5jb250ZW50cyArIHMtPl9yYXdfc2l6ZSk7Ci0JICBQVVRfV09SRCAoZHlub2JqLCBuZXh0LCBzLT5jb250ZW50cyArIHMtPl9yYXdfc2l6ZSArIEJZVEVTX0lOX1dPUkQpOwotCSAgcy0+X3Jhd19zaXplICs9IEhBU0hfRU5UUllfU0laRTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMaW5rIGEgZHluYW1pYyBvYmplY3QuICBXZSBhY3R1YWxseSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIGRvIGF0Ci0gICB0aGlzIHBvaW50LiAgVGhpcyBlbnRyeSBwb2ludCBleGlzdHMgdG8gcHJldmVudCB0aGUgcmVndWxhciBsaW5rZXIKLSAgIGNvZGUgZnJvbSBkb2luZyBhbnl0aGluZyB3aXRoIHRoZSBvYmplY3QuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1zdW5vc19saW5rX2R5bmFtaWNfb2JqZWN0IChpbmZvLCBhYmZkKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgZHluYW1pYyBzeW1ib2wuICBUaGlzIGlzIGNhbGxlZCBieSB0aGUgZmluYWwgdHJhdmVyc2FsCi0gICBvdmVyIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGhhcmcpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaGFyZzsKLXsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaCA9IChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopIGhhcmc7Ci0gIGludCB0eXBlOwotICBiZmRfdm1hIHZhbDsKLSAgYXNlY3Rpb24gKnM7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqb3V0c3ltOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgZmlsbCBpbiB0aGUKLSAgICAgdGFibGUgZW50cnkuICAqLwotICBpZiAoaC0+cGx0X29mZnNldCAhPSAwKQotICAgIHsKLSAgICAgIGJmZCAqZHlub2JqOwotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBiZmRfYnl0ZSAqcDsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgYmZkX3ZtYSByX2FkZHJlc3M7Ci0KLSAgICAgIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIHAgPSBzcGx0LT5jb250ZW50cyArIGgtPnBsdF9vZmZzZXQ7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotCi0gICAgICByX2FkZHJlc3MgPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgKyBoLT5wbHRfb2Zmc2V0KTsKLQotICAgICAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKG91dHB1dF9iZmQpKQotCXsKLQljYXNlIGJmZF9hcmNoX3NwYXJjOgotCSAgaWYgKGluZm8tPnNoYXJlZCB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKLQkgICAgewotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNQQVJDX1BMVF9FTlRSWV9XT1JEMCwgcCk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJCSAgKFNQQVJDX1BMVF9FTlRSWV9XT1JEMQotCQkJICAgKyAoKCgtIChoLT5wbHRfb2Zmc2V0ICsgNCkgPj4gMikKLQkJCSAgICAgICAmIDB4M2ZmZmZmZmYpKSksCi0JCQkgIHAgKyA0KTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTUEFSQ19QTFRfRU5UUllfV09SRDIgKyBzLT5yZWxvY19jb3VudCwKLQkJCSAgcCArIDgpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIHZhbDsKLQotCSAgICAgIHZhbCA9IChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICAgICArIGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJCSAgU1BBUkNfUExUX1BJQ19XT1JEMCArICgodmFsID4+IDEwKSAmIDB4M2ZmZmZmKSwKLQkJCSAgcCk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJCSAgU1BBUkNfUExUX1BJQ19XT1JEMSArICh2YWwgJiAweDNmZiksCi0JCQkgIHAgKyA0KTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTUEFSQ19QTFRfUElDX1dPUkQyLCBwICsgOCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfYXJjaF9tNjhrOgotCSAgaWYgKCEgaW5mby0+c2hhcmVkICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSAhPSAwKQotCSAgICBhYm9ydCAoKTsKLQkgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIE02OEtfUExUX0VOVFJZX1dPUkQwLCBwKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsICgtIChoLT5wbHRfb2Zmc2V0ICsgMikpLCBwICsgMik7Ci0JICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCBzLT5yZWxvY19jb3VudCwgcCArIDYpOwotCSAgcl9hZGRyZXNzICs9IDI7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBhZGQgYSBqdW1wIHRhYmxlIHJlbG9jLCB1bmxlc3MgdGhpcyBpcyB0aGUKLSAgICAgICAgIHJlc3VsdCBvZiBhIEpNUF9UQkwgcmVsb2MgZnJvbSBQSUMgY29tcGlsZWQgY29kZS4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggPj0gMCk7Ci0JICBCRkRfQVNTRVJUIChzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopCi0JCSAgICAgIDwgcy0+X3Jhd19zaXplKTsKLQkgIHAgPSBzLT5jb250ZW50cyArIHMtPnJlbG9jX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKG91dHB1dF9iZmQpOwotCSAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChvdXRwdXRfYmZkKSA9PSBSRUxPQ19TVERfU0laRSkKLQkgICAgewotCSAgICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnNyZWw7Ci0KLQkgICAgICBzcmVsID0gKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcDsKLQkgICAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwgcl9hZGRyZXNzLCBzcmVsLT5yX2FkZHJlc3MpOwotCSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKG91dHB1dF9iZmQpKQotCQl7Ci0JCSAgc3JlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiAxNik7Ci0JCSAgc3JlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiA4KTsKLQkJICBzcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4KTsKLQkJICBzcmVsLT5yX3R5cGVbMF0gPSAoUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRwotCQkJCSAgICAgfCBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3JlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiAxNik7Ci0JCSAgc3JlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiA4KTsKLQkJICBzcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKWgtPmR5bmluZHg7Ci0JCSAgc3JlbC0+cl90eXBlWzBdID0gKFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUKLQkJCQkgICAgIHwgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICplcmVsOwotCi0JICAgICAgZXJlbCA9IChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHA7Ci0JICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHJfYWRkcmVzcywgZXJlbC0+cl9hZGRyZXNzKTsKLQkgICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkJewotCQkgIGVyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gMTYpOwotCQkgIGVyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gOCk7Ci0JCSAgZXJlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSloLT5keW5pbmR4OwotCQkgIGVyZWwtPnJfdHlwZVswXSA9Ci0JCSAgICAoUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRwotCQkgICAgIHwgKFJFTE9DX0pNUF9TTE9UIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBlcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDE2KTsKLQkJICBlcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDgpOwotCQkgIGVyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpaC0+ZHluaW5keDsKLQkJICBlcmVsLT5yX3R5cGVbMF0gPQotCQkgICAgKFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUKLQkJICAgICB8IChSRUxPQ19KTVBfU0xPVCA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSkpOwotCQl9Ci0JICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBlcmVsLT5yX2FkZGVuZCk7Ci0JICAgIH0KLQotCSAgKytzLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgbm90IGEgZHluYW1pYyBzeW1ib2wsIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcKLSAgICAgZWxzZS4gIFdlIG9ubHkgY2hlY2sgdGhpcyBhZnRlciBoYW5kbGluZyB0aGUgUExUIGVudHJ5LCBiZWNhdXNlCi0gICAgIHdlIGNhbiBoYXZlIGEgUExUIGVudHJ5IGZvciBhIG5vbmR5bmFtaWMgc3ltYm9sIHdoZW4gbGlua2luZyBQSUMKLSAgICAgY29tcGlsZWQgY29kZSBmcm9tIGEgcmVndWxhciBvYmplY3QuICAqLwotICBpZiAoaC0+ZHluaW5keCA8IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3dpdGNoIChoLT5yb290LnJvb3QudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICAvKiBBdm9pZCB2YXJpYWJsZSBub3QgaW5pdGlhbGl6ZWQgd2FybmluZ3MuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICAgIHR5cGUgPSBOX1VOREYgfCBOX0VYVDsKLSAgICAgIHZhbCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgIHsKLQlhc2VjdGlvbiAqc2VjOwotCWFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQotCXNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCW91dHB1dF9zZWN0aW9uID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQlCRkRfQVNTRVJUIChiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotCQkgICAgfHwgb3V0cHV0X3NlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpOwotCWlmIChoLT5wbHRfb2Zmc2V0ICE9IDAKLQkgICAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JICB7Ci0JICAgIHR5cGUgPSBOX1VOREYgfCBOX0VYVDsKLQkgICAgdmFsID0gMDsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfdGV4dHNlYyAob3V0cHV0X2JmZCkpCi0JICAgICAgdHlwZSA9IChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgPyBOX1RFWFQKLQkJICAgICAgOiBOX1dFQUtUKTsKLQkgICAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2RhdGFzZWMgKG91dHB1dF9iZmQpKQotCSAgICAgIHR5cGUgPSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgID8gTl9EQVRBCi0JCSAgICAgIDogTl9XRUFLRCk7Ci0JICAgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9ic3NzZWMgKG91dHB1dF9iZmQpKQotCSAgICAgIHR5cGUgPSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgID8gTl9CU1MKLQkJICAgICAgOiBOX1dFQUtCKTsKLQkgICAgZWxzZQotCSAgICAgIHR5cGUgPSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgID8gTl9BQlMKLQkJICAgICAgOiBOX1dFQUtBKTsKLQkgICAgdHlwZSB8PSBOX0VYVDsKLQkgICAgdmFsID0gKGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZQotCQkgICArIG91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIHR5cGUgPSBOX1VOREYgfCBOX0VYVDsKLSAgICAgIHZhbCA9IGgtPnJvb3Qucm9vdC51LmMuc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICB0eXBlID0gTl9XRUFLVTsKLSAgICAgIHZhbCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3dhcm5pbmc6Ci0gICAgICAvKiBGSVhNRTogSWdub3JlIHRoZXNlIGZvciBub3cuICBUaGUgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaAotCSB0aGV5IHNob3VsZCBiZSB3cml0dGVuIG91dCBhcmUgbm90IGNsZWFyIHRvIG1lLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosICIuZHluc3ltIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gIG91dHN5bSA9ICgoc3RydWN0IGV4dGVybmFsX25saXN0ICopCi0JICAgIChzLT5jb250ZW50cyArIGgtPmR5bmluZHggKiBFWFRFUk5BTF9OTElTVF9TSVpFKSk7Ci0KLSAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIHR5cGUsIG91dHN5bS0+ZV90eXBlKTsKLSAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIDAsIG91dHN5bS0+ZV9vdGhlcik7Ci0KLSAgLyogRklYTUU6IFRoZSBuYXRpdmUgbGlua2VyIGRvZXNuJ3QgdXNlIDAgZm9yIGRlc2MuICBJdCBzZWVtcyB0byB1c2UKLSAgICAgb25lIGxlc3MgdGhhbiB0aGUgZGVzYyB2YWx1ZSBpbiB0aGUgc2hhcmVkIGxpYnJhcnksIGFsdGhvdWdoIHRoYXQKLSAgICAgc2VlbXMgdW5saWtlbHkuICAqLwotICBiZmRfaF9wdXRfMTYgKG91dHB1dF9iZmQsIDAsIG91dHN5bS0+ZV9kZXNjKTsKLQotICBQVVRfV09SRCAob3V0cHV0X2JmZCwgaC0+ZHluc3RyX2luZGV4LCBvdXRzeW0tPmVfc3RyeCk7Ci0gIFBVVF9XT1JEIChvdXRwdXRfYmZkLCB2YWwsIG91dHN5bS0+ZV92YWx1ZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGZvciBlYWNoIHJlbG9jIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgSWYgdGhpcwotICAgaXMgYSByZWxvYyB3aGljaCBhcmUgYXJlIGdvaW5nIHRvIGNvcHkgYXMgYSBkeW5hbWljIHJlbG9jLCB0aGVuCi0gICBjb3B5IGl0IG92ZXIsIGFuZCB0ZWxsIHRoZSBjYWxsZXIgdG8gbm90IGJvdGhlciBwcm9jZXNzaW5nIHRoaXMKLSAgIHJlbG9jLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYyAoaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBoYXJnLCByZWxvYywKLQkJCSAgIGNvbnRlbnRzLCBza2lwLCByZWxvY2F0aW9ucCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoYXJnOwotICAgICBQVFIgcmVsb2M7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYm9vbGVhbiAqc2tpcDsKLSAgICAgYmZkX3ZtYSAqcmVsb2NhdGlvbnA7Ci17Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmggPSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKSBoYXJnOwotICBiZmQgKmR5bm9iajsKLSAgYm9vbGVhbiBiYXNlcmVsOwotICBib29sZWFuIGptcHRibDsKLSAgYm9vbGVhbiBwY3JlbDsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJmZF9ieXRlICpwOwotICBsb25nIGluZHg7Ci0KLSAgKnNraXAgPSBmYWxzZTsKLQotICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoICE9IE5VTEwKLSAgICAgICYmIGgtPnBsdF9vZmZzZXQgIT0gMAotICAgICAgJiYgKGluZm8tPnNoYXJlZAotCSAgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotCi0gICAgICAvKiBSZWRpcmVjdCB0aGUgcmVsb2NhdGlvbiB0byB0aGUgUExUIGVudHJ5LiAgKi8KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgKnJlbG9jYXRpb25wID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgaC0+cGx0X29mZnNldCk7Ci0gICAgfQotCi0gIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoaW5wdXRfYmZkKSA9PSBSRUxPQ19TVERfU0laRSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpzcmVsOwotCi0gICAgICBzcmVsID0gKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2M7Ci0gICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCXsKLQkgIGJhc2VyZWwgPSAoMCAhPSAoc3JlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcpKTsKLQkgIGptcHRibCA9ICgwICE9IChzcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcpKTsKLQkgIHBjcmVsID0gKDAgIT0gKHNyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiYXNlcmVsID0gKDAgIT0gKHNyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFKSk7Ci0JICBqbXB0YmwgPSAoMCAhPSAoc3JlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFKSk7Ci0JICBwY3JlbCA9ICgwICE9IChzcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqZXJlbDsKLSAgICAgIGludCByX3R5cGU7Ci0KLSAgICAgIGVyZWwgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSByZWxvYzsKLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0Jcl90eXBlID0gKChlcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0JJRykKLQkJICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRyk7Ci0gICAgICBlbHNlCi0Jcl90eXBlID0gKChlcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0xJVFRMRSkKLQkJICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSk7Ci0gICAgICBiYXNlcmVsID0gKHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKLQkJIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTMKLQkJIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMjIpOwotICAgICAgam1wdGJsID0gcl90eXBlID09IFJFTE9DX0pNUF9UQkw7Ci0gICAgICBwY3JlbCA9IChyX3R5cGUgPT0gUkVMT0NfRElTUDgKLQkgICAgICAgfHwgcl90eXBlID09IFJFTE9DX0RJU1AxNgotCSAgICAgICB8fCByX3R5cGUgPT0gUkVMT0NfRElTUDMyCi0JICAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19XRElTUDMwCi0JICAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19XRElTUDIyKTsKLSAgICAgIC8qIFdlIGRvbid0IGNvbnNpZGVyIHRoZSBQQzEwIGFuZCBQQzIyIHR5cGVzIHRvIGJlIFBDIHJlbGF0aXZlLAotICAgICAgICAgYmVjYXVzZSB0aGV5IGFyZSBwY3JlbF9vZmZzZXQuICAqLwotICAgIH0KLQotICBpZiAoYmFzZXJlbCkKLSAgICB7Ci0gICAgICBiZmRfdm1hICpnb3Rfb2Zmc2V0cDsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotCi0gICAgICBpZiAoaCAhPSBOVUxMKQotCWdvdF9vZmZzZXRwID0gJmgtPmdvdF9vZmZzZXQ7Ci0gICAgICBlbHNlIGlmIChhZGF0YSAoaW5wdXRfYmZkKS5sb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCWdvdF9vZmZzZXRwID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpzcmVsOwotCSAgaW50IHJfaW5kZXg7Ci0KLQkgIHNyZWwgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSByZWxvYzsKLQkgIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoaW5wdXRfYmZkKSA9PSBSRUxPQ19TVERfU0laRSkKLQkgICAgewotCSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JCXJfaW5kZXggPSAoKHNyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCi0JCQkgICB8IChzcmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCQkgICB8IHNyZWwtPnJfaW5kZXhbMl0pOwotCSAgICAgIGVsc2UKLQkJcl9pbmRleCA9ICgoc3JlbC0+cl9pbmRleFsyXSA8PCAxNikKLQkJCSAgIHwgKHNyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJCSAgIHwgc3JlbC0+cl9pbmRleFswXSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKmVyZWw7Ci0KLQkgICAgICBlcmVsID0gKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgcmVsb2M7Ci0JICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQkJcl9pbmRleCA9ICgoZXJlbC0+cl9pbmRleFswXSA8PCAxNikKLQkJCSAgIHwgKGVyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJCSAgIHwgZXJlbC0+cl9pbmRleFsyXSk7Ci0JICAgICAgZWxzZQotCQlyX2luZGV4ID0gKChlcmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkJICAgfCAoZXJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkJICAgfCBlcmVsLT5yX2luZGV4WzBdKTsKLQkgICAgfQotCi0JICBnb3Rfb2Zmc2V0cCA9IGFkYXRhIChpbnB1dF9iZmQpLmxvY2FsX2dvdF9vZmZzZXRzICsgcl9pbmRleDsKLQl9Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGdvdF9vZmZzZXRwICE9IE5VTEwgJiYgKmdvdF9vZmZzZXRwICE9IDApOwotCi0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQotICAgICAgLyogV2Ugc2V0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gaW5kaWNhdGUgd2hldGhlciB3ZSBoYXZlCi0JIGFscmVhZHkgaW5pdGlhbGl6ZWQgdGhlIEdPVCBlbnRyeS4gICovCi0gICAgICBpZiAoKCpnb3Rfb2Zmc2V0cCAmIDEpID09IDApCi0JewotCSAgaWYgKGggPT0gTlVMTAotCSAgICAgIHx8ICghIGluZm8tPnNoYXJlZAotCQkgICYmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgPT0gMAotCQkgICAgICB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgIT0gMCkpKQotCSAgICBQVVRfV09SRCAoZHlub2JqLCAqcmVsb2NhdGlvbnAsIHNnb3QtPmNvbnRlbnRzICsgKmdvdF9vZmZzZXRwKTsKLQkgIGVsc2UKLQkgICAgUFVUX1dPUkQgKGR5bm9iaiwgMCwgc2dvdC0+Y29udGVudHMgKyAqZ290X29mZnNldHApOwotCi0JICBpZiAoaW5mby0+c2hhcmVkCi0JICAgICAgfHwgKGggIT0gTlVMTAotCQkgICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApKQotCSAgICB7Ci0JICAgICAgLyogV2UgbmVlZCB0byBjcmVhdGUgYSBHTE9CX0RBVCBvciAzMiByZWxvYyB0byB0ZWxsIHRoZQotICAgICAgICAgICAgICAgICBkeW5hbWljIGxpbmtlciB0byBmaWxsIGluIHRoaXMgZW50cnkgaW4gdGhlIHRhYmxlLiAgKi8KLQotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgQkZEX0FTU0VSVCAocy0+cmVsb2NfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZHlub2JqKQotCQkJICA8IHMtPl9yYXdfc2l6ZSk7Ci0KLQkgICAgICBwID0gKHMtPmNvbnRlbnRzCi0JCSAgICsgcy0+cmVsb2NfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZHlub2JqKSk7Ci0KLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQlpbmR4ID0gaC0+ZHluaW5keDsKLQkgICAgICBlbHNlCi0JCWluZHggPSAwOwotCi0JICAgICAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopID09IFJFTE9DX1NURF9TSVpFKQotCQl7Ci0JCSAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqc3JlbDsKLQotCQkgIHNyZWwgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSBwOwotCQkgIFBVVF9XT1JEIChkeW5vYmosCi0JCQkgICAgKCpnb3Rfb2Zmc2V0cAotCQkJICAgICArIHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0KSwKLQkJCSAgICBzcmVsLT5yX2FkZHJlc3MpOwotCQkgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGR5bm9iaikpCi0JCSAgICB7Ci0JCSAgICAgIHNyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOwotCQkgICAgICBzcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShpbmR4ID4+IDgpOwotCQkgICAgICBzcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKWluZHg7Ci0JCSAgICAgIGlmIChoID09IE5VTEwpCi0JCQlzcmVsLT5yX3R5cGVbMF0gPSAyIDw8IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUc7Ci0JCSAgICAgIGVsc2UKLQkJCXNyZWwtPnJfdHlwZVswXSA9Ci0JCQkgIChSRUxPQ19TVERfQklUU19FWFRFUk5fQklHCi0JCQkgICB8IFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHCi0JCQkgICB8IFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRwotCQkJICAgfCAoMiA8PCBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBzcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShpbmR4ID4+IDE2KTsKLQkJICAgICAgc3JlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaW5keCA+PiA4KTsKLQkJICAgICAgc3JlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSlpbmR4OwotCQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQkJc3JlbC0+cl90eXBlWzBdID0gMiA8PCBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFOwotCQkgICAgICBlbHNlCi0JCQlzcmVsLT5yX3R5cGVbMF0gPQotCQkJICAoUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRQotCQkJICAgfCBSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRQotCQkJICAgfCBSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUKLQkJCSAgIHwgKDIgPDwgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSkpOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqZXJlbDsKLQotCQkgIGVyZWwgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSBwOwotCQkgIFBVVF9XT1JEIChkeW5vYmosCi0JCQkgICAgKCpnb3Rfb2Zmc2V0cAotCQkJICAgICArIHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0KSwKLQkJCSAgICBlcmVsLT5yX2FkZHJlc3MpOwotCQkgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGR5bm9iaikpCi0JCSAgICB7Ci0JCSAgICAgIGVyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOwotCQkgICAgICBlcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShpbmR4ID4+IDgpOwotCQkgICAgICBlcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKWluZHg7Ci0JCSAgICAgIGlmIChoID09IE5VTEwpCi0JCQllcmVsLT5yX3R5cGVbMF0gPQotCQkJICBSRUxPQ18zMiA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRzsKLQkJICAgICAgZWxzZQotCQkJZXJlbC0+cl90eXBlWzBdID0KLQkJCSAgKFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcKLQkJCSAgIHwgKFJFTE9DX0dMT0JfREFUIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBlcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShpbmR4ID4+IDE2KTsKLQkJICAgICAgZXJlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaW5keCA+PiA4KTsKLQkJICAgICAgZXJlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSlpbmR4OwotCQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQkJZXJlbC0+cl90eXBlWzBdID0KLQkJCSAgUkVMT0NfMzIgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEU7Ci0JCSAgICAgIGVsc2UKLQkJCWVyZWwtPnJfdHlwZVswXSA9Ci0JCQkgIChSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFCi0JCQkgICB8IChSRUxPQ19HTE9CX0RBVAotCQkJICAgICAgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUpKTsKLQkJICAgIH0KLQkJICBQVVRfV09SRCAoZHlub2JqLCAwLCBlcmVsLT5yX2FkZGVuZCk7Ci0JCX0KLQotCSAgICAgICsrcy0+cmVsb2NfY291bnQ7Ci0JICAgIH0KLQotCSAgKmdvdF9vZmZzZXRwIHw9IDE7Ci0JfQotCi0gICAgICAqcmVsb2NhdGlvbnAgPSAoc2dvdC0+dm1hCi0JCSAgICAgICsgKCpnb3Rfb2Zmc2V0cCAmfiAxKQotCQkgICAgICAtIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfYmFzZSk7Ci0KLSAgICAgIC8qIFRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0byBkbyBmb3IgYSBiYXNlIHJlbGF0aXZlIHJlbG9jLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoISBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19uZWVkZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICghIGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBpZiAoaCA9PSBOVUxMCi0JICB8fCBoLT5keW5pbmR4ID09IC0xCi0JICB8fCBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpICE9IDAKLQkgIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSA9PSAwCi0JICB8fCAoaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotCXJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5keW5pbmR4ID09IC0xCi0JICAgICAgfHwgam1wdGJsCi0JICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKSkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSXQgbG9va3MgbGlrZSB0aGlzIGlzIGEgcmVsb2Mgd2UgYXJlIHN1cHBvc2VkIHRvIGNvcHkuICAqLwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopIDwgcy0+X3Jhd19zaXplKTsKLQotICBwID0gcy0+Y29udGVudHMgKyBzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopOwotCi0gIC8qIENvcHkgdGhlIHJlbG9jIG92ZXIuICAqLwotICBtZW1jcHkgKHAsIHJlbG9jLCBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZHlub2JqKSk7Ci0KLSAgaWYgKGggIT0gTlVMTCkKLSAgICBpbmR4ID0gaC0+ZHluaW5keDsKLSAgZWxzZQotICAgIGluZHggPSAwOwotCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBhbmQgc3ltYm9sIGluZGV4LiAgKi8KLSAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopID09IFJFTE9DX1NURF9TSVpFKQotICAgIHsKLSAgICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnNyZWw7Ci0KLSAgICAgIHNyZWwgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSBwOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwKLQkJKEdFVF9XT1JEIChkeW5vYmosIHNyZWwtPnJfYWRkcmVzcykKLQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KSwKLQkJc3JlbC0+cl9hZGRyZXNzKTsKLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGR5bm9iaikpCi0JewotCSAgc3JlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSkoaW5keCA+PiAxNik7Ci0JICBzcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShpbmR4ID4+IDgpOwotCSAgc3JlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSlpbmR4OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShpbmR4ID4+IDE2KTsKLQkgIHNyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGluZHggPj4gOCk7Ci0JICBzcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKWluZHg7Ci0JfQotICAgICAgLyogRklYTUU6IFdlIG1heSBoYXZlIHRvIGNoYW5nZSB0aGUgYWRkZW5kIGZvciBhIFBDIHJlbGF0aXZlCi0gICAgICAgICByZWxvYy4gICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqZXJlbDsKLQotICAgICAgZXJlbCA9IChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHA7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLAotCQkoR0VUX1dPUkQgKGR5bm9iaiwgZXJlbC0+cl9hZGRyZXNzKQotCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpLAotCQllcmVsLT5yX2FkZHJlc3MpOwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoZHlub2JqKSkKLQl7Ci0JICBlcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKShpbmR4ID4+IDE2KTsKLQkgIGVyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGluZHggPj4gOCk7Ci0JICBlcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKWluZHg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGVyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOwotCSAgZXJlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaW5keCA+PiA4KTsKLQkgIGVyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpaW5keDsKLQl9Ci0gICAgICBpZiAocGNyZWwgJiYgaCAhPSBOVUxMKQotCXsKLQkgIC8qIEFkanVzdCB0aGUgYWRkZW5kIGZvciB0aGUgY2hhbmdlIGluIGFkZHJlc3MuICAqLwotCSAgUFVUX1dPUkQgKGR5bm9iaiwKLQkJICAgIChHRVRfV09SRCAoZHlub2JqLCBlcmVsLT5yX2FkZGVuZCkKLQkJICAgICAtIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCS0gaW5wdXRfc2VjdGlvbi0+dm1hKSksCi0JCSAgICBlcmVsLT5yX2FkZGVuZCk7Ci0JfQotICAgIH0KLQotICArK3MtPnJlbG9jX2NvdW50OwotCi0gIGlmIChoICE9IE5VTEwpCi0gICAgKnNraXAgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19maW5pc2hfZHluYW1pY19saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKm87Ci0gIGFzZWN0aW9uICpzOwotICBhc2VjdGlvbiAqc2R5bjsKLQotICBpZiAoISBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19uZWVkZWQKLSAgICAgICYmICEgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9uZWVkZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0gIEJGRF9BU1NFUlQgKHNkeW4gIT0gTlVMTCk7Ci0KLSAgLyogRmluaXNoIHVwIHRoZSAubmVlZCBzZWN0aW9uLiAgVGhlIGxpbmtlciBlbXVsYXRpb24gY29kZSBmaWxsZWQgaXQKLSAgICAgaW4sIGJ1dCB3aXRoIG9mZnNldHMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gaW5zdGVhZCBvZgotICAgICByZWFsIGFkZHJlc3Nlcy4gIE5vdyB0aGF0IHdlIGtub3cgdGhlIHNlY3Rpb24gbG9jYXRpb24sIHdlIGNhbgotICAgICBmaWxsIGluIHRoZSBmaW5hbCB2YWx1ZXMuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5uZWVkIik7Ci0gIGlmIChzICE9IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0gICAgewotICAgICAgZmlsZV9wdHIgZmlsZXBvczsKLSAgICAgIGJmZF9ieXRlICpwOwotCi0gICAgICBmaWxlcG9zID0gcy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcCA9IHMtPmNvbnRlbnRzOwotICAgICAgd2hpbGUgKDEpCi0JewotCSAgYmZkX3ZtYSB2YWw7Ci0KLQkgIFBVVF9XT1JEIChkeW5vYmosIEdFVF9XT1JEIChkeW5vYmosIHApICsgZmlsZXBvcywgcCk7Ci0JICB2YWwgPSBHRVRfV09SRCAoZHlub2JqLCBwICsgMTIpOwotCSAgaWYgKHZhbCA9PSAwKQotCSAgICBicmVhazsKLQkgIFBVVF9XT1JEIChkeW5vYmosIHZhbCArIGZpbGVwb3MsIHAgKyAxMik7Ci0JICBwICs9IDE2OwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIGZpcnN0IGVudHJ5IGluIHRoZSAuZ290IHNlY3Rpb24gaXMgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gICAgIGR5bmFtaWMgaW5mb3JtYXRpb24sIHVubGVzcyB0aGlzIGlzIGEgc2hhcmVkIGxpYnJhcnkuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgaWYgKGluZm8tPnNoYXJlZCB8fCBzZHluLT5fcmF3X3NpemUgPT0gMCkKLSAgICBQVVRfV09SRCAoZHlub2JqLCAwLCBzLT5jb250ZW50cyk7Ci0gIGVsc2UKLSAgICBQVVRfV09SRCAoZHlub2JqLCBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkgICAgICBzLT5jb250ZW50cyk7Ci0KLSAgZm9yIChvID0gZHlub2JqLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMAotCSAgJiYgby0+Y29udGVudHMgIT0gTlVMTCkKLQl7Ci0JICBCRkRfQVNTRVJUIChvLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0JCSAgICAgICYmIG8tPm91dHB1dF9zZWN0aW9uLT5vd25lciA9PSBhYmZkKTsKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgby0+b3V0cHV0X3NlY3Rpb24sCi0JCQkJCSAgby0+Y29udGVudHMsIG8tPm91dHB1dF9vZmZzZXQsCi0JCQkJCSAgby0+X3Jhd19zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNkeW4tPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgc3RydWN0IGV4dGVybmFsX3N1bjRfZHluYW1pYyBlc2Q7Ci0gICAgICBzdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljX2xpbmsgZXNkbDsKLQotICAgICAgLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgKGJmZF92bWEpIDMsIGVzZC5sZF92ZXJzaW9uKTsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosCi0JCXNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0ICsgc2l6ZW9mIGVzZCwKLQkJZXNkLmxkZCk7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLAotCQkoc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgKyBzZHluLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIHNpemVvZiBlc2QKLQkJICsgRVhURVJOQUxfU1VONF9EWU5BTUlDX0RFQlVHR0VSX1NJWkUpLAotCQllc2QubGQpOwotCi0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNkeW4tPm91dHB1dF9zZWN0aW9uLCAmZXNkLAotCQkJCSAgICAgIHNkeW4tPm91dHB1dF9vZmZzZXQsIHNpemVvZiBlc2QpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgKGJmZF92bWEpIDAsIGVzZGwubGRfbG9hZGVkKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIubmVlZCIpOwotICAgICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5fcmF3X3NpemUgPT0gMCkKLQlQVVRfV09SRCAoZHlub2JqLCAoYmZkX3ZtYSkgMCwgZXNkbC5sZF9uZWVkKTsKLSAgICAgIGVsc2UKLQlQVVRfV09SRCAoZHlub2JqLCBzLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCi0JCSAgZXNkbC5sZF9uZWVkKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucnVsZXMiKTsKLSAgICAgIGlmIChzID09IE5VTEwgfHwgcy0+X3Jhd19zaXplID09IDApCi0JUFVUX1dPUkQgKGR5bm9iaiwgKGJmZF92bWEpIDAsIGVzZGwubGRfcnVsZXMpOwotICAgICAgZWxzZQotCVBVVF9XT1JEIChkeW5vYmosIHMtPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLQkJICBlc2RsLmxkX3J1bGVzKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHMtPm91dHB1dF9vZmZzZXQsCi0JCWVzZGwubGRfZ290KTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHMtPm91dHB1dF9vZmZzZXQsCi0JCWVzZGwubGRfcGx0KTsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIHMtPl9yYXdfc2l6ZSwgZXNkbC5sZF9wbHRfc3opOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBCRkRfQVNTRVJUIChzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopCi0JCSAgPT0gcy0+X3Jhd19zaXplKTsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIHMtPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLQkJZXNkbC5sZF9yZWwpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5oYXNoIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAotCQllc2RsLmxkX2hhc2gpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLCBzLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCi0JCWVzZGwubGRfc3RhYik7Ci0KLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIChiZmRfdm1hKSAwLCBlc2RsLmxkX3N0YWJfaGFzaCk7Ci0KLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIChiZmRfdm1hKSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+YnVja2V0Y291bnQsCi0JCWVzZGwubGRfYnVja2V0cyk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN0ciIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIHMtPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLQkJZXNkbC5sZF9zeW1ib2xzKTsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIHMtPl9yYXdfc2l6ZSwgZXNkbC5sZF9zeW1iX3NpemUpOwotCi0gICAgICAvKiBUaGUgc2l6ZSBvZiB0aGUgdGV4dCBhcmVhIGlzIHRoZSBzaXplIG9mIHRoZSAudGV4dCBzZWN0aW9uCi0JIHJvdW5kZWQgdXAgdG8gYSBwYWdlIGJvdW5kYXJ5LiAgRklYTUU6IFNob3VsZCB0aGUgcGFnZSBzaXplIGJlCi0JIGNvbmRpdGlvbmFsIG9uIHNvbWV0aGluZz8gICovCi0gICAgICBQVVRfV09SRCAoZHlub2JqLAotCQlCRkRfQUxJR04gKG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplLCAweDIwMDApLAotCQllc2RsLmxkX3RleHQpOwotICAKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2R5bi0+b3V0cHV0X3NlY3Rpb24sICZlc2RsLAotCQkJCSAgICAgIChzZHluLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgICAgICsgc2l6ZW9mIGVzZAotCQkJCSAgICAgICArIEVYVEVSTkFMX1NVTjRfRFlOQU1JQ19ERUJVR0dFUl9TSVpFKSwKLQkJCQkgICAgICBzaXplb2YgZXNkbCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9zeW1zLmMgYi9iZmQvc3ltcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjlkMWYyLi4wMDAwMDAwCi0tLSBhL2JmZC9zeW1zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUzICswLDAgQEAKLS8qIEdlbmVyaWMgc3ltYm9sLXRhYmxlIHN1cHBvcnQgZm9yIHRoZSBCRkQgbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCVN5bWJvbHMKLQotCUJGRCB0cmllcyB0byBtYWludGFpbiBhcyBtdWNoIHN5bWJvbCBpbmZvcm1hdGlvbiBhcyBpdCBjYW4gd2hlbgotCWl0IG1vdmVzIGluZm9ybWF0aW9uIGZyb20gZmlsZSB0byBmaWxlLiBCRkQgcGFzc2VzIGluZm9ybWF0aW9uCi0JdG8gYXBwbGljYXRpb25zIHRob3VnaCB0aGUgPDxhc3ltYm9sPj4gc3RydWN0dXJlLiBXaGVuIHRoZQotCWFwcGxpY2F0aW9uIHJlcXVlc3RzIHRoZSBzeW1ib2wgdGFibGUsIEJGRCByZWFkcyB0aGUgdGFibGUgaW4KLQl0aGUgbmF0aXZlIGZvcm0gYW5kIHRyYW5zbGF0ZXMgcGFydHMgb2YgaXQgaW50byB0aGUgaW50ZXJuYWwKLQlmb3JtYXQuIFRvIG1haW50YWluIG1vcmUgdGhhbiB0aGUgaW5mb3JtYXRpb24gcGFzc2VkIHRvCi0JYXBwbGljYXRpb25zLCBzb21lIHRhcmdldHMga2VlcCBzb21lIGluZm9ybWF0aW9uIGBgYmVoaW5kIHRoZQotCXNjZW5lcycnIGluIGEgc3RydWN0dXJlIG9ubHkgdGhlIHBhcnRpY3VsYXIgYmFjayBlbmQga25vd3MKLQlhYm91dC4gRm9yIGV4YW1wbGUsIHRoZSBjb2ZmIGJhY2sgZW5kIGtlZXBzIHRoZSBvcmlnaW5hbAotCXN5bWJvbCB0YWJsZSBzdHJ1Y3R1cmUgYXMgd2VsbCBhcyB0aGUgY2Fub25pY2FsIHN0cnVjdHVyZSB3aGVuCi0JYSBCRkQgaXMgcmVhZCBpbi4gT24gb3V0cHV0LCB0aGUgY29mZiBiYWNrIGVuZCBjYW4gcmVjb25zdHJ1Y3QKLQl0aGUgb3V0cHV0IHN5bWJvbCB0YWJsZSBzbyB0aGF0IG5vIGluZm9ybWF0aW9uIGlzIGxvc3QsIGV2ZW4KLQlpbmZvcm1hdGlvbiB1bmlxdWUgdG8gY29mZiB3aGljaCBCRkQgZG9lc24ndCBrbm93IG9yCi0JdW5kZXJzdGFuZC4gSWYgYSBjb2ZmIHN5bWJvbCB0YWJsZSB3ZXJlIHJlYWQsIGJ1dCB3ZXJlIHdyaXR0ZW4KLQl0aHJvdWdoIGFuIGEub3V0IGJhY2sgZW5kLCBhbGwgdGhlIGNvZmYgc3BlY2lmaWMgaW5mb3JtYXRpb24KLQl3b3VsZCBiZSBsb3N0LiBUaGUgc3ltYm9sIHRhYmxlIG9mIGEgQkZECi0JaXMgbm90IG5lY2Vzc2FyaWx5IHJlYWQgaW4gdW50aWwgYSBjYW5vbmljYWxpemUgcmVxdWVzdCBpcwotCW1hZGUuIFRoZW4gdGhlIEJGRCBiYWNrIGVuZCBmaWxscyBpbiBhIHRhYmxlIHByb3ZpZGVkIGJ5IHRoZQotCWFwcGxpY2F0aW9uIHdpdGggcG9pbnRlcnMgdG8gdGhlIGNhbm9uaWNhbCBpbmZvcm1hdGlvbi4gIFRvCi0Jb3V0cHV0IHN5bWJvbHMsIHRoZSBhcHBsaWNhdGlvbiBwcm92aWRlcyBCRkQgd2l0aCBhIHRhYmxlIG9mCi0JcG9pbnRlcnMgdG8gcG9pbnRlcnMgdG8gPDxhc3ltYm9sPj5zLiBUaGlzIGFsbG93cyBhcHBsaWNhdGlvbnMKLQlsaWtlIHRoZSBsaW5rZXIgdG8gb3V0cHV0IGEgc3ltYm9sIGFzIGl0IHdhcyByZWFkLCBzaW5jZSB0aGUgYGBiZWhpbmQKLQl0aGUgc2NlbmVzJycgaW5mb3JtYXRpb24gd2lsbCBiZSBzdGlsbCBhdmFpbGFibGUuCi1AbWVudQotQCogUmVhZGluZyBTeW1ib2xzOjoKLUAqIFdyaXRpbmcgU3ltYm9sczo6Ci1AKiBNaW5pIFN5bWJvbHM6OgotQCogdHlwZWRlZiBhc3ltYm9sOjoKLUAqIHN5bWJvbCBoYW5kbGluZyBmdW5jdGlvbnM6OgotQGVuZCBtZW51Ci0KLUlOT0RFCi1SZWFkaW5nIFN5bWJvbHMsIFdyaXRpbmcgU3ltYm9scywgU3ltYm9scywgU3ltYm9scwotU1VCU0VDVElPTgotCVJlYWRpbmcgc3ltYm9scwotCi0JVGhlcmUgYXJlIHR3byBzdGFnZXMgdG8gcmVhZGluZyBhIHN5bWJvbCB0YWJsZSBmcm9tIGEgQkZEOgotCWFsbG9jYXRpbmcgc3RvcmFnZSwgYW5kIHRoZSBhY3R1YWwgcmVhZGluZyBwcm9jZXNzLiBUaGlzIGlzIGFuCi0JZXhjZXJwdCBmcm9tIGFuIGFwcGxpY2F0aW9uIHdoaWNoIHJlYWRzIHRoZSBzeW1ib2wgdGFibGU6Ci0KLXwJICBsb25nIHN0b3JhZ2VfbmVlZGVkOwotfAkgIGFzeW1ib2wgKipzeW1ib2xfdGFibGU7Ci18CSAgbG9uZyBudW1iZXJfb2Zfc3ltYm9sczsKLXwJICBsb25nIGk7Ci18Ci18CSAgc3RvcmFnZV9uZWVkZWQgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci18Ci18ICAgICAgICAgaWYgKHN0b3JhZ2VfbmVlZGVkIDwgMCkKLXwgICAgICAgICAgIEZBSUwKLXwKLXwJICBpZiAoc3RvcmFnZV9uZWVkZWQgPT0gMCkgewotfAkgICAgIHJldHVybiA7Ci18CSAgfQotfAkgIHN5bWJvbF90YWJsZSA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzdG9yYWdlX25lZWRlZCk7Ci18CSAgICAuLi4KLXwJICBudW1iZXJfb2Zfc3ltYm9scyA9Ci18CSAgICAgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIHN5bWJvbF90YWJsZSk7Ci18Ci18ICAgICAgICAgaWYgKG51bWJlcl9vZl9zeW1ib2xzIDwgMCkKLXwgICAgICAgICAgIEZBSUwKLXwKLXwJICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyX29mX3N5bWJvbHM7IGkrKykgewotfAkgICAgIHByb2Nlc3Nfc3ltYm9sIChzeW1ib2xfdGFibGVbaV0pOwotfAkgIH0KLQotCUFsbCBzdG9yYWdlIGZvciB0aGUgc3ltYm9scyB0aGVtc2VsdmVzIGlzIGluIGFuIG9iamFsbG9jCi0JY29ubmVjdGVkIHRvIHRoZSBCRkQ7IGl0IGlzIGZyZWVkIHdoZW4gdGhlIEJGRCBpcyBjbG9zZWQuCi0KLQotSU5PREUKLVdyaXRpbmcgU3ltYm9scywgTWluaSBTeW1ib2xzLCBSZWFkaW5nIFN5bWJvbHMsIFN5bWJvbHMKLVNVQlNFQ1RJT04KLQlXcml0aW5nIHN5bWJvbHMKLQotCVdyaXRpbmcgb2YgYSBzeW1ib2wgdGFibGUgaXMgYXV0b21hdGljIHdoZW4gYSBCRkQgb3BlbiBmb3IKLQl3cml0aW5nIGlzIGNsb3NlZC4gVGhlIGFwcGxpY2F0aW9uIGF0dGFjaGVzIGEgdmVjdG9yIG9mCi0JcG9pbnRlcnMgdG8gcG9pbnRlcnMgdG8gc3ltYm9scyB0byB0aGUgQkZEIGJlaW5nIHdyaXR0ZW4sIGFuZAotCWZpbGxzIGluIHRoZSBzeW1ib2wgY291bnQuIFRoZSBjbG9zZSBhbmQgY2xlYW51cCBjb2RlIHJlYWRzCi0JdGhyb3VnaCB0aGUgdGFibGUgcHJvdmlkZWQgYW5kIHBlcmZvcm1zIGFsbCB0aGUgbmVjZXNzYXJ5Ci0Jb3BlcmF0aW9ucy4gVGhlIEJGRCBvdXRwdXQgY29kZSBtdXN0IGFsd2F5cyBiZSBwcm92aWRlZCB3aXRoIGFuCi0JYGBvd25lZCcnIHN5bWJvbDogb25lIHdoaWNoIGhhcyBjb21lIGZyb20gYW5vdGhlciBCRkQsIG9yIG9uZQotCXdoaWNoIGhhcyBiZWVuIGNyZWF0ZWQgdXNpbmcgPDxiZmRfbWFrZV9lbXB0eV9zeW1ib2w+Pi4gIEhlcmUgaXMgYW4KLQlleGFtcGxlIHNob3dpbmcgdGhlIGNyZWF0aW9uIG9mIGEgc3ltYm9sIHRhYmxlIHdpdGggb25seSBvbmUgZWxlbWVudDoKLQotfAkjaW5jbHVkZSAiYmZkLmgiCi18CW1haW4oKQotfAl7Ci18CSAgYmZkICphYmZkOwotfAkgIGFzeW1ib2wgKnB0cnNbMl07Ci18CSAgYXN5bWJvbCAqbmV3OwotfAotfAkgIGFiZmQgPSBiZmRfb3BlbncoImZvbyIsImEub3V0LXN1bm9zLWJpZyIpOwotfAkgIGJmZF9zZXRfZm9ybWF0KGFiZmQsIGJmZF9vYmplY3QpOwotfAkgIG5ldyA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbChhYmZkKTsKLXwJICBuZXctPm5hbWUgPSAiZHVtbXlfc3ltYm9sIjsKLXwJICBuZXctPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkoYWJmZCwgIi50ZXh0Iik7Ci18CSAgbmV3LT5mbGFncyA9IEJTRl9HTE9CQUw7Ci18CSAgbmV3LT52YWx1ZSA9IDB4MTIzNDU7Ci18Ci18CSAgcHRyc1swXSA9IG5ldzsKLXwJICBwdHJzWzFdID0gKGFzeW1ib2wgKikwOwotfAotfAkgIGJmZF9zZXRfc3ltdGFiKGFiZmQsIHB0cnMsIDEpOwotfAkgIGJmZF9jbG9zZShhYmZkKTsKLXwJfQotfAotfAkuL21ha2VzeW0KLXwJbm0gZm9vCi18CTAwMDEyMzQ1IEEgZHVtbXlfc3ltYm9sCi0KLQlNYW55IGZvcm1hdHMgY2Fubm90IHJlcHJlc2VudCBhcmJpdGFyeSBzeW1ib2wgaW5mb3JtYXRpb247IGZvcgotIAlpbnN0YW5jZSwgdGhlIDw8YS5vdXQ+PiBvYmplY3QgZm9ybWF0IGRvZXMgbm90IGFsbG93IGFuCi0JYXJiaXRhcnkgbnVtYmVyIG9mIHNlY3Rpb25zLiBBIHN5bWJvbCBwb2ludGluZyB0byBhIHNlY3Rpb24KLQl3aGljaCBpcyBub3Qgb25lICBvZiA8PC50ZXh0Pj4sIDw8LmRhdGE+PiBvciA8PC5ic3M+PiBjYW5ub3QKLQliZSBkZXNjcmliZWQuCi0KLUlOT0RFCi1NaW5pIFN5bWJvbHMsIHR5cGVkZWYgYXN5bWJvbCwgV3JpdGluZyBTeW1ib2xzLCBTeW1ib2xzCi1TVUJTRUNUSU9OCi0JTWluaSBTeW1ib2xzCi0KLQlNaW5pIHN5bWJvbHMgcHJvdmlkZSByZWFkLW9ubHkgYWNjZXNzIHRvIHRoZSBzeW1ib2wgdGFibGUuCi0JVGhleSB1c2UgbGVzcyBtZW1vcnkgc3BhY2UsIGJ1dCByZXF1aXJlIG1vcmUgdGltZSB0byBhY2Nlc3MuCi0JVGhleSBjYW4gYmUgdXNlZnVsIGZvciB0b29scyBsaWtlIG5tIG9yIG9iamR1bXAsIHdoaWNoIG1heQotCWhhdmUgdG8gaGFuZGxlIHN5bWJvbCB0YWJsZXMgb2YgZXh0cmVtZWx5IGxhcmdlIGV4ZWN1dGFibGVzLgotCi0JVGhlIDw8YmZkX3JlYWRfbWluaXN5bWJvbHM+PiBmdW5jdGlvbiB3aWxsIHJlYWQgdGhlIHN5bWJvbHMKLQlpbnRvIG1lbW9yeSBpbiBhbiBpbnRlcm5hbCBmb3JtLiAgSXQgd2lsbCByZXR1cm4gYSA8PHZvaWQgKj4+Ci0JcG9pbnRlciB0byBhIGJsb2NrIG9mIG1lbW9yeSwgYSBzeW1ib2wgY291bnQsIGFuZCB0aGUgc2l6ZSBvZgotCWVhY2ggc3ltYm9sLiAgVGhlIHBvaW50ZXIgaXMgYWxsb2NhdGVkIHVzaW5nIDw8bWFsbG9jPj4sIGFuZAotCXNob3VsZCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQotCVRoZSBmdW5jdGlvbiA8PGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbD4+IHdpbGwgdGFrZSBhIHBvaW50ZXIKLQl0byBhIG1pbmlzeW1ib2wsIGFuZCBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkKLQk8PGJmZF9tYWtlX2VtcHR5X3N5bWJvbD4+LCBhbmQgcmV0dXJuIGEgPDxhc3ltYm9sPj4gc3RydWN0dXJlLgotCVRoZSByZXR1cm4gdmFsdWUgbWF5IG9yIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIHZhbHVlIGZyb20KLQk8PGJmZF9tYWtlX2VtcHR5X3N5bWJvbD4+IHdoaWNoIHdhcyBwYXNzZWQgaW4uCi0KLSovCi0KLQotCi0vKgotRE9DREQKLUlOT0RFCi10eXBlZGVmIGFzeW1ib2wsIHN5bWJvbCBoYW5kbGluZyBmdW5jdGlvbnMsIE1pbmkgU3ltYm9scywgU3ltYm9scwotCi0qLwotLyoKLVNVQlNFQ1RJT04KLQl0eXBlZGVmIGFzeW1ib2wKLQotCUFuIDw8YXN5bWJvbD4+IGhhcyB0aGUgZm9ybToKLQotKi8KLQotLyoKLUNPREVfRlJBR01FTlQKLQotLgotLnR5cGVkZWYgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeQotLnsKLS4JeyogQSBwb2ludGVyIHRvIHRoZSBCRkQgd2hpY2ggb3ducyB0aGUgc3ltYm9sLiBUaGlzIGluZm9ybWF0aW9uCi0uCSAgIGlzIG5lY2Vzc2FyeSBzbyB0aGF0IGEgYmFjayBlbmQgY2FuIHdvcmsgb3V0IHdoYXQgYWRkaXRpb25hbAotLiAgIAkgICBpbmZvcm1hdGlvbiAoaW52aXNpYmxlIHRvIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIpIGlzIGNhcnJpZWQKLS4JICAgd2l0aCB0aGUgc3ltYm9sLgotLgotLgkgICBUaGlzIGZpZWxkIGlzICphbG1vc3QqIHJlZHVuZGFudCwgc2luY2UgeW91IGNhbiB1c2Ugc2VjdGlvbi0+b3duZXIKLS4JICAgaW5zdGVhZCwgZXhjZXB0IHRoYXQgc29tZSBzeW1ib2xzIHBvaW50IHRvIHRoZSBnbG9iYWwgc2VjdGlvbnMKLS4JICAgYmZkX3thYnMsY29tLHVuZH1fc2VjdGlvbi4gIFRoaXMgY291bGQgYmUgZml4ZWQgYnkgbWFraW5nCi0uCSAgIHRoZXNlIGdsb2JhbHMgYmUgcGVyLWJmZCAob3IgcGVyLXRhcmdldC1mbGF2b3IpLiAgRklYTUUuICp9Ci0uCi0uICBzdHJ1Y3QgX2JmZCAqdGhlX2JmZDsgeyogVXNlIGJmZF9hc3ltYm9sX2JmZChzeW0pIHRvIGFjY2VzcyB0aGlzIGZpZWxkLiAqfQotLgotLgl7KiBUaGUgdGV4dCBvZiB0aGUgc3ltYm9sLiBUaGUgbmFtZSBpcyBsZWZ0IGFsb25lLCBhbmQgbm90IGNvcGllZDsgdGhlCi0uCSAgIGFwcGxpY2F0aW9uIG1heSBub3QgYWx0ZXIgaXQuICp9Ci0uICBDT05TVCBjaGFyICpuYW1lOwotLgotLgl7KiBUaGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFRoaXMgcmVhbGx5IHNob3VsZCBiZSBhIHVuaW9uIG9mIGEKLS4gICAgICAgICAgbnVtZXJpYyB2YWx1ZSB3aXRoIGEgcG9pbnRlciwgc2luY2Ugc29tZSBmbGFncyBpbmRpY2F0ZSB0aGF0Ci0uICAgICAgICAgIGEgcG9pbnRlciB0byBhbm90aGVyIHN5bWJvbCBpcyBzdG9yZWQgaGVyZS4gICp9Ci0uICBzeW12YWx1ZSB2YWx1ZTsKLS4KLS4JeyogQXR0cmlidXRlcyBvZiBhIHN5bWJvbDogKn0KLS4KLS4jZGVmaW5lIEJTRl9OT19GTEFHUyAgICAweDAwCi0uCi0uCXsqIFRoZSBzeW1ib2wgaGFzIGxvY2FsIHNjb3BlOyA8PHN0YXRpYz4+IGluIDw8Qz4+LiBUaGUgdmFsdWUKLS4gCSAgIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gKn0KLS4jZGVmaW5lIEJTRl9MT0NBTAkweDAxCi0uCi0uCXsqIFRoZSBzeW1ib2wgaGFzIGdsb2JhbCBzY29wZTsgaW5pdGlhbGl6ZWQgZGF0YSBpbiA8PEM+Pi4gVGhlCi0uCSAgIHZhbHVlIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gKn0KLS4jZGVmaW5lIEJTRl9HTE9CQUwJMHgwMgotLgotLgl7KiBUaGUgc3ltYm9sIGhhcyBnbG9iYWwgc2NvcGUgYW5kIGlzIGV4cG9ydGVkLiBUaGUgdmFsdWUgaXMKLS4JICAgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqfQotLiNkZWZpbmUgQlNGX0VYUE9SVAlCU0ZfR0xPQkFMIHsqIG5vIHJlYWwgZGlmZmVyZW5jZSAqfQotLgotLgl7KiBBIG5vcm1hbCBDIHN5bWJvbCB3b3VsZCBiZSBvbmUgb2Y6Ci0uCSAgIDw8QlNGX0xPQ0FMPj4sIDw8QlNGX0ZPUlRfQ09NTT4+LCAgPDxCU0ZfVU5ERUZJTkVEPj4gb3IKLS4JICAgPDxCU0ZfR0xPQkFMPj4gKn0KLS4KLS4JeyogVGhlIHN5bWJvbCBpcyBhIGRlYnVnZ2luZyByZWNvcmQuIFRoZSB2YWx1ZSBoYXMgYW4gYXJiaXRhcnkKLS4JICAgbWVhbmluZy4gKn0KLS4jZGVmaW5lIEJTRl9ERUJVR0dJTkcJMHgwOAotLgotLgl7KiBUaGUgc3ltYm9sIGRlbm90ZXMgYSBmdW5jdGlvbiBlbnRyeSBwb2ludC4gIFVzZWQgaW4gRUxGLAotLgkgICBwZXJoYXBzIG90aGVycyBzb21lZGF5LiAgKn0KLS4jZGVmaW5lIEJTRl9GVU5DVElPTiAgICAweDEwCi0uCi0uCXsqIFVzZWQgYnkgdGhlIGxpbmtlci4gKn0KLS4jZGVmaW5lIEJTRl9LRUVQICAgICAgICAweDIwCi0uI2RlZmluZSBCU0ZfS0VFUF9HICAgICAgMHg0MAotLgotLgl7KiBBIHdlYWsgZ2xvYmFsIHN5bWJvbCwgb3ZlcnJpZGFibGUgd2l0aG91dCB3YXJuaW5ncyBieQotLgkgICBhIHJlZ3VsYXIgZ2xvYmFsIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lLiAgKn0KLS4jZGVmaW5lIEJTRl9XRUFLICAgICAgICAweDgwCi0uCi0uICAgICAgIHsqIFRoaXMgc3ltYm9sIHdhcyBjcmVhdGVkIHRvIHBvaW50IHRvIGEgc2VjdGlvbiwgZS5nLiBFTEYncwotLgkgICBTVFRfU0VDVElPTiBzeW1ib2xzLiAgKn0KLS4jZGVmaW5lIEJTRl9TRUNUSU9OX1NZTSAweDEwMAotLgotLgl7KiBUaGUgc3ltYm9sIHVzZWQgdG8gYmUgYSBjb21tb24gc3ltYm9sLCBidXQgbm93IGl0IGlzCi0uCSAgIGFsbG9jYXRlZC4gKn0KLS4jZGVmaW5lIEJTRl9PTERfQ09NTU9OICAweDIwMAotLgotLgl7KiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgY29tbW9uIGRhdGEuICp9Ci0uI2RlZmluZSBCRkRfRk9SVF9DT01NX0RFRkFVTFRfVkFMVUUgMAotLgotLgl7KiBJbiBzb21lIGZpbGVzIHRoZSB0eXBlIG9mIGEgc3ltYm9sIHNvbWV0aW1lcyBhbHRlcnMgaXRzCi0uCSAgIGxvY2F0aW9uIGluIGFuIG91dHB1dCBmaWxlIC0gaWUgaW4gY29mZiBhIDw8SVNGQ04+PiBzeW1ib2wKLS4JICAgd2hpY2ggaXMgYWxzbyA8PENfRVhUPj4gc3ltYm9sIGFwcGVhcnMgd2hlcmUgaXQgd2FzCi0uCSAgIGRlY2xhcmVkIGFuZCBub3QgYXQgdGhlIGVuZCBvZiBhIHNlY3Rpb24uICBUaGlzIGJpdCBpcyBzZXQKLS4gIAkgICBieSB0aGUgdGFyZ2V0IEJGRCBwYXJ0IHRvIGNvbnZleSB0aGlzIGluZm9ybWF0aW9uLiAqfQotLgotLiNkZWZpbmUgQlNGX05PVF9BVF9FTkQgICAgMHg0MDAKLS4KLS4JeyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyB0aGUgbGFiZWwgb2YgY29uc3RydWN0b3Igc2VjdGlvbi4gKn0KLS4jZGVmaW5lIEJTRl9DT05TVFJVQ1RPUiAgIDB4ODAwCi0uCi0uCXsqIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgYSB3YXJuaW5nIHN5bWJvbC4gIFRoZSBuYW1lIGlzIGEKLS4JICAgd2FybmluZy4gIFRoZSBuYW1lIG9mIHRoZSBuZXh0IHN5bWJvbCBpcyB0aGUgb25lIHRvIHdhcm4gYWJvdXQ7Ci0uCSAgIGlmIGEgcmVmZXJlbmNlIGlzIG1hZGUgdG8gYSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBuZXh0Ci0uCSAgIHN5bWJvbCwgYSB3YXJuaW5nIGlzIGlzc3VlZCBieSB0aGUgbGlua2VyLiAqfQotLiNkZWZpbmUgQlNGX1dBUk5JTkcgICAgICAgMHgxMDAwCi0uCi0uCXsqIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgaW5kaXJlY3QuICBUaGlzIHN5bWJvbCBpcyBhbiBpbmRpcmVjdAotLgkgICBwb2ludGVyIHRvIHRoZSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBuZXh0IHN5bWJvbC4gKn0KLS4jZGVmaW5lIEJTRl9JTkRJUkVDVCAgICAgIDB4MjAwMAotLgotLgl7KiBCU0ZfRklMRSBtYXJrcyBzeW1ib2xzIHRoYXQgY29udGFpbiBhIGZpbGUgbmFtZS4gIFRoaXMgaXMgdXNlZAotLgkgICBmb3IgRUxGIFNUVF9GSUxFIHN5bWJvbHMuICAqfQotLiNkZWZpbmUgQlNGX0ZJTEUgICAgICAgICAgMHg0MDAwCi0uCi0uCXsqIFN5bWJvbCBpcyBmcm9tIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICp9Ci0uI2RlZmluZSBCU0ZfRFlOQU1JQwkgICAweDgwMDAKLS4KLS4gICAgICAgeyogVGhlIHN5bWJvbCBkZW5vdGVzIGEgZGF0YSBvYmplY3QuICBVc2VkIGluIEVMRiwgYW5kIHBlcmhhcHMKLS4gICAgICAgICAgb3RoZXJzIHNvbWVkYXkuICAqfQotLiNkZWZpbmUgQlNGX09CSkVDVAkgICAweDEwMDAwCi0uCi0uICBmbGFnd29yZCBmbGFnczsKLS4KLS4JeyogQSBwb2ludGVyIHRvIHRoZSBzZWN0aW9uIHRvIHdoaWNoIHRoaXMgc3ltYm9sIGlzCi0uCSAgIHJlbGF0aXZlLiAgVGhpcyB3aWxsIGFsd2F5cyBiZSBub24gTlVMTCwgdGhlcmUgYXJlIHNwZWNpYWwKLS4gICAgICAgICAgc2VjdGlvbnMgZm9yIHVuZGVmaW5lZCBhbmQgYWJzb2x1dGUgc3ltYm9scy4gICp9Ci0uICBzdHJ1Y3Qgc2VjICpzZWN0aW9uOwotLgotLgl7KiBCYWNrIGVuZCBzcGVjaWFsIGRhdGEuICAqfQotLiAgdW5pb24KLS4gICAgewotLiAgICAgIFBUUiBwOwotLiAgICAgIGJmZF92bWEgaTsKLS4gICAgfSB1ZGF0YTsKLS4KLS59IGFzeW1ib2w7Ci0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLQotc3RhdGljIGNoYXIgY29mZl9zZWN0aW9uX3R5cGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qCi1ET0NERAotSU5PREUKLXN5bWJvbCBoYW5kbGluZyBmdW5jdGlvbnMsICAsIHR5cGVkZWYgYXN5bWJvbCwgU3ltYm9scwotU1VCU0VDVElPTgotCVN5bWJvbCBoYW5kbGluZyBmdW5jdGlvbnMKLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgYSB2ZWN0b3Igb2YgcG9pbnRlcnMKLQl0byA8PGFzeW1ib2xzPj4gZm9yIGFsbCB0aGUgc3ltYm9scyBpbiB0aGUgQkZEIEB2YXJ7YWJmZH0sCi0JaW5jbHVkaW5nIGEgdGVybWluYWwgTlVMTCBwb2ludGVyLiBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scyBpbgotCXRoZSBCRkQsIHRoZW4gcmV0dXJuIDAuICBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybiAtMS4KLQotLiNkZWZpbmUgYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQoYWJmZCkgXAotLiAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgKGFiZmQpKQotCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfaXNfbG9jYWxfbGFiZWwKLQotU1lOT1BTSVMKLSAgICAgICAgYm9vbGVhbiBiZmRfaXNfbG9jYWxfbGFiZWwoYmZkICphYmZkLCBhc3ltYm9sICpzeW0pOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzeW1ib2wgQHZhcntzeW19IGluIHRoZSBCRkQgQHZhcnthYmZkfSBpcwotCWEgY29tcGlsZXIgZ2VuZXJhdGVkIGxvY2FsIGxhYmVsLCBlbHNlIHJldHVybiBmYWxzZS4KLSovCi0KLWJvb2xlYW4KLWJmZF9pc19sb2NhbF9sYWJlbCAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgaWYgKChzeW0tPmZsYWdzICYgKEJTRl9HTE9CQUwgfCBCU0ZfV0VBSykpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoc3ltLT5uYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIHN5bS0+bmFtZSk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0KLVNZTk9QU0lTCi0gICAgICAgIGJvb2xlYW4gYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUoYmZkICphYmZkLCBjb25zdCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdHJ1ZSBpZiBhIHN5bWJvbCB3aXRoIHRoZSBuYW1lIEB2YXJ7bmFtZX0gaW4gdGhlIEJGRAotCUB2YXJ7YWJmZH0gaXMgYSBjb21waWxlciBnZW5lcmF0ZWQgbG9jYWwgbGFiZWwsIGVsc2UgcmV0dXJuCi0JZmFsc2UuICBUaGlzIGp1c3QgY2hlY2tzIHdoZXRoZXIgdGhlIG5hbWUgaGFzIHRoZSBmb3JtIG9mIGEKLQlsb2NhbCBsYWJlbC4KLQotLiNkZWZpbmUgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUoYWJmZCwgbmFtZSkgXAotLiAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSwgKGFiZmQsIG5hbWUpKQotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIKLQotREVTQ1JJUFRJT04KLQlSZWFkIHRoZSBzeW1ib2xzIGZyb20gdGhlIEJGRCBAdmFye2FiZmR9LCBhbmQgZmlsbHMgaW4KLQl0aGUgdmVjdG9yIEB2YXJ7bG9jYXRpb259IHdpdGggcG9pbnRlcnMgdG8gdGhlIHN5bWJvbHMgYW5kCi0JYSB0cmFpbGluZyBOVUxMLgotCVJldHVybiB0aGUgYWN0dWFsIG51bWJlciBvZiBzeW1ib2wgcG9pbnRlcnMsIG5vdAotCWluY2x1ZGluZyB0aGUgTlVMTC4KLQotCi0uI2RlZmluZSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYihhYmZkLCBsb2NhdGlvbikgXAotLiAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX3N5bXRhYixcCi0uICAgICAgICAgICAgICAgICAgKGFiZmQsIGxvY2F0aW9uKSkKLQotKi8KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X3N5bXRhYgotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9zeW10YWIgKGJmZCAqYWJmZCwgYXN5bWJvbCAqKmxvY2F0aW9uLCB1bnNpZ25lZCBpbnQgY291bnQpOwotCi1ERVNDUklQVElPTgotCUFycmFuZ2UgdGhhdCB3aGVuIHRoZSBvdXRwdXQgQkZEIEB2YXJ7YWJmZH0gaXMgY2xvc2VkLAotCXRoZSB0YWJsZSBAdmFye2xvY2F0aW9ufSBvZiBAdmFye2NvdW50fSBwb2ludGVycyB0byBzeW1ib2xzCi0Jd2lsbCBiZSB3cml0dGVuLgotKi8KLQotYm9vbGVhbgotYmZkX3NldF9zeW10YWIgKGFiZmQsIGxvY2F0aW9uLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqbG9jYXRpb247Ci0gICAgIHVuc2lnbmVkIGludCBzeW1jb3VudDsKLXsKLSAgaWYgKChhYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdCkgfHwgKGJmZF9yZWFkX3AgKGFiZmQpKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpID0gbG9jYXRpb247Ci0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gc3ltY291bnQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfcHJpbnRfc3ltYm9sX3ZhbmRmCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKFBUUiBmaWxlLCBhc3ltYm9sICpzeW1ib2wpOwotCi1ERVNDUklQVElPTgotCVByaW50IHRoZSB2YWx1ZSBhbmQgZmxhZ3Mgb2YgdGhlIEB2YXJ7c3ltYm9sfSBzdXBwbGllZCB0byB0aGUKLQlzdHJlYW0gQHZhcntmaWxlfS4KLSovCi12b2lkCi1iZmRfcHJpbnRfc3ltYm9sX3ZhbmRmIChhcmcsIHN5bWJvbCkKLSAgICAgUFRSIGFyZzsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgYXJnOwotICBmbGFnd29yZCB0eXBlID0gc3ltYm9sLT5mbGFnczsKLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmX3ZtYSAoZmlsZSwgc3ltYm9sLT52YWx1ZSArIHN5bWJvbC0+c2VjdGlvbi0+dm1hKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmX3ZtYSAoZmlsZSwgc3ltYm9sLT52YWx1ZSk7Ci0gICAgfQotCi0gIC8qIFRoaXMgcHJlc3VtZXMgdGhhdCBhIHN5bWJvbCBjYW4gbm90IGJlIGJvdGggQlNGX0RFQlVHR0lORyBhbmQKLSAgICAgQlNGX0RZTkFNSUMsIG5vciBtb3JlIHRoYW4gb25lIG9mIEJTRl9GVU5DVElPTiwgQlNGX0ZJTEUsIGFuZAotICAgICBCU0ZfT0JKRUNULiAgKi8KLSAgZnByaW50ZiAoZmlsZSwgIiAlYyVjJWMlYyVjJWMlYyIsCi0JICAgKCh0eXBlICYgQlNGX0xPQ0FMKQotCSAgICA/ICh0eXBlICYgQlNGX0dMT0JBTCkgPyAnIScgOiAnbCcKLQkgICAgOiAodHlwZSAmIEJTRl9HTE9CQUwpID8gJ2cnIDogJyAnKSwKLQkgICAodHlwZSAmIEJTRl9XRUFLKSA/ICd3JyA6ICcgJywKLQkgICAodHlwZSAmIEJTRl9DT05TVFJVQ1RPUikgPyAnQycgOiAnICcsCi0JICAgKHR5cGUgJiBCU0ZfV0FSTklORykgPyAnVycgOiAnICcsCi0JICAgKHR5cGUgJiBCU0ZfSU5ESVJFQ1QpID8gJ0knIDogJyAnLAotCSAgICh0eXBlICYgQlNGX0RFQlVHR0lORykgPyAnZCcgOiAodHlwZSAmIEJTRl9EWU5BTUlDKSA/ICdEJyA6ICcgJywKLQkgICAoKHR5cGUgJiBCU0ZfRlVOQ1RJT04pCi0JICAgID8gJ0YnCi0JICAgIDogKCh0eXBlICYgQlNGX0ZJTEUpCi0JICAgICAgID8gJ2YnCi0JICAgICAgIDogKCh0eXBlICYgQlNGX09CSkVDVCkgPyAnTycgOiAnICcpKSkpOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9tYWtlX2VtcHR5X3N5bWJvbAotCi1ERVNDUklQVElPTgotCUNyZWF0ZSBhIG5ldyA8PGFzeW1ib2w+PiBzdHJ1Y3R1cmUgZm9yIHRoZSBCRkQgQHZhcnthYmZkfQotCWFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LgotCi0JVGhpcyByb3V0aW5lIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGVhY2ggYmFjayBlbmQgaGFzIHByaXZhdGUKLQlpbmZvcm1hdGlvbiBzdXJyb3VuZGluZyB0aGUgPDxhc3ltYm9sPj4uIEJ1aWxkaW5nIHlvdXIgb3duCi0JPDxhc3ltYm9sPj4gYW5kIHBvaW50aW5nIHRvIGl0IHdpbGwgbm90IGNyZWF0ZSB0aGUgcHJpdmF0ZQotCWluZm9ybWF0aW9uLCBhbmQgd2lsbCBjYXVzZSBwcm9ibGVtcyBsYXRlciBvbi4KLQotLiNkZWZpbmUgYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpIFwKLS4gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX21ha2VfZW1wdHlfc3ltYm9sLCAoYWJmZCkpCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLQotREVTQ1JJUFRJT04KLQlDcmVhdGUgYSBuZXcgPDxhc3ltYm9sPj4gc3RydWN0dXJlIGZvciB0aGUgQkZEIEB2YXJ7YWJmZH0sCi0JdG8gYmUgdXNlZCBhcyBhIGRlYnVnZ2luZyBzeW1ib2wuICBGdXJ0aGVyIGRldGFpbHMgb2YgaXRzIHVzZSBoYXZlCi0JeWV0IHRvIGJlIHdvcmtlZCBvdXQuCi0KLS4jZGVmaW5lIGJmZF9tYWtlX2RlYnVnX3N5bWJvbChhYmZkLHB0cixzaXplKSBcCi0uICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCwgKGFiZmQsIHB0ciwgc2l6ZSkpCi0qLwotCi1zdHJ1Y3Qgc2VjdGlvbl90b190eXBlCi17Ci0gIENPTlNUIGNoYXIgKnNlY3Rpb247Ci0gIGNoYXIgdHlwZTsKLX07Ci0KLS8qIE1hcCBzZWN0aW9uIG5hbWVzIHRvIFBPU0lYL0JTRCBzaW5nbGUtY2hhcmFjdGVyIHN5bWJvbCB0eXBlcy4KLSAgIFRoaXMgdGFibGUgaXMgcHJvYmFibHkgaW5jb21wbGV0ZS4gIEl0IGlzIHNvcnRlZCBmb3IgY29udmVuaWVuY2Ugb2YKLSAgIGFkZGluZyBlbnRyaWVzLiAgU2luY2UgaXQgaXMgc28gc2hvcnQsIGEgbGluZWFyIHNlYXJjaCBpcyB1c2VkLiAgKi8KLXN0YXRpYyBDT05TVCBzdHJ1Y3Qgc2VjdGlvbl90b190eXBlIHN0dFtdID0KLXsKLSAgeyIqREVCVUcqIiwgJ04nfSwKLSAgeyIuYnNzIiwgJ2InfSwKLSAgeyJ6ZXJvdmFycyIsICdiJ30sCQkvKiBNUkkgLmJzcyAqLwotICB7Ii5kYXRhIiwgJ2QnfSwKLSAgeyJ2YXJzIiwgJ2QnfSwJCS8qIE1SSSAuZGF0YSAqLwotICB7Ii5yZGF0YSIsICdyJ30sCQkvKiBSZWFkIG9ubHkgZGF0YS4gICovCi0gIHsiLnJvZGF0YSIsICdyJ30sCQkvKiBSZWFkIG9ubHkgZGF0YS4gICovCi0gIHsiLnNic3MiLCAncyd9LAkJLyogU21hbGwgQlNTICh1bmluaXRpYWxpemVkIGRhdGEpLiAgKi8KLSAgeyIuc2NvbW1vbiIsICdjJ30sCQkvKiBTbWFsbCBjb21tb24uICAqLwotICB7Ii5zZGF0YSIsICdnJ30sCQkvKiBTbWFsbCBpbml0aWFsaXplZCBkYXRhLiAgKi8KLSAgeyIudGV4dCIsICd0J30sCi0gIHsiY29kZSIsICd0J30sCQkvKiBNUkkgLnRleHQgKi8KLSAgezAsIDB9Ci19OwotCi0vKiBSZXR1cm4gdGhlIHNpbmdsZS1jaGFyYWN0ZXIgc3ltYm9sIHR5cGUgY29ycmVzcG9uZGluZyB0bwotICAgc2VjdGlvbiBTLCBvciAnPycgZm9yIGFuIHVua25vd24gQ09GRiBzZWN0aW9uLiAgCi0KLSAgIENoZWNrIGZvciBhbnkgbGVhZGluZyBzdHJpbmcgd2hpY2ggbWF0Y2hlcywgc28gLnRleHQ1IHJldHVybnMKLSAgICd0JyBhcyB3ZWxsIGFzIC50ZXh0ICovCi0KLXN0YXRpYyBjaGFyCi1jb2ZmX3NlY3Rpb25fdHlwZSAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgQ09OU1Qgc3RydWN0IHNlY3Rpb25fdG9fdHlwZSAqdDsKLQotICBmb3IgKHQgPSAmc3R0WzBdOyB0LT5zZWN0aW9uOyB0KyspIAotICAgIGlmICghc3RybmNtcCAocywgdC0+c2VjdGlvbiwgc3RybGVuICh0LT5zZWN0aW9uKSkpCi0gICAgICByZXR1cm4gdC0+dHlwZTsKLQotICByZXR1cm4gJz8nOwotfQotCi0jaWZuZGVmIGlzbG93ZXIKLSNkZWZpbmUgaXNsb3dlcihjKSAoKGMpID49ICdhJyAmJiAoYykgPD0gJ3onKQotI2VuZGlmCi0jaWZuZGVmIHRvdXBwZXIKLSNkZWZpbmUgdG91cHBlcihjKSAoaXNsb3dlcihjKSA/ICgoYykgJiB+MHgyMCkgOiAoYykpCi0jZW5kaWYKLQotLyoKLUZVTkNUSU9OCi0JYmZkX2RlY29kZV9zeW1jbGFzcwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIGNoYXJhY3RlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzeW1ib2wKLQljbGFzcyBvZiBAdmFye3N5bWJvbH0sIG9yICc/JyBmb3IgYW4gdW5rbm93biBjbGFzcy4KLQotU1lOT1BTSVMKLQlpbnQgYmZkX2RlY29kZV9zeW1jbGFzcyhhc3ltYm9sICpzeW1ib2wpOwotKi8KLWludAotYmZkX2RlY29kZV9zeW1jbGFzcyAoc3ltYm9sKQotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIGNoYXIgYzsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJldHVybiAnQyc7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmV0dXJuICdVJzsKLSAgaWYgKGJmZF9pc19pbmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gJ0knOwotICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKQotICAgIHJldHVybiAnVyc7Ci0gIGlmICghKHN5bWJvbC0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9MT0NBTCkpKQotICAgIHJldHVybiAnPyc7Ci0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICBjID0gJ2EnOwotICBlbHNlIGlmIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgYyA9IGNvZmZfc2VjdGlvbl90eXBlIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUpOwotICBlbHNlCi0gICAgcmV0dXJuICc/JzsKLSAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKQotICAgIGMgPSB0b3VwcGVyIChjKTsKLSAgcmV0dXJuIGM7Ci0KLSAgLyogV2UgZG9uJ3QgaGF2ZSB0byBoYW5kbGUgdGhlc2UgY2FzZXMganVzdCB5ZXQsIGJ1dCB3ZSB3aWxsIHNvb246Ci0gICAgIE5fU0VUVjogJ3YnOwotICAgICBOX1NFVEE6ICdsJzsKLSAgICAgTl9TRVRUOiAneCc7Ci0gICAgIE5fU0VURDogJ3onOwotICAgICBOX1NFVEI6ICdzJzsKLSAgICAgTl9JTkRSOiAnaSc7Ci0gICAgICovCi19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zeW1ib2xfaW5mbwotCi1ERVNDUklQVElPTgotCUZpbGwgaW4gdGhlIGJhc2ljIGluZm8gYWJvdXQgc3ltYm9sIHRoYXQgbm0gbmVlZHMuCi0JQWRkaXRpb25hbCBpbmZvIG1heSBiZSBhZGRlZCBieSB0aGUgYmFjay1lbmRzIGFmdGVyCi0JY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3N5bWJvbF9pbmZvKGFzeW1ib2wgKnN5bWJvbCwgc3ltYm9sX2luZm8gKnJldCk7Ci0qLwotCi12b2lkCi1iZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KQotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIHJldC0+dHlwZSA9IGJmZF9kZWNvZGVfc3ltY2xhc3MgKHN5bWJvbCk7Ci0gIGlmIChyZXQtPnR5cGUgIT0gJ1UnKQotICAgIHJldC0+dmFsdWUgPSBzeW1ib2wtPnZhbHVlICsgc3ltYm9sLT5zZWN0aW9uLT52bWE7Ci0gIGVsc2UKLSAgICByZXQtPnZhbHVlID0gMDsKLSAgcmV0LT5uYW1lID0gc3ltYm9sLT5uYW1lOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKGJmZCAqaWJmZCwgYXN5bWJvbCAqaXN5bSwgYmZkICpvYmZkLCBhc3ltYm9sICpvc3ltKTsKLQotREVTQ1JJUFRJT04KLQlDb3B5IHByaXZhdGUgc3ltYm9sIGluZm9ybWF0aW9uIGZyb20gQHZhcntpc3ltfSBpbiB0aGUgQkZECi0JQHZhcntpYmZkfSB0byB0aGUgc3ltYm9sIEB2YXJ7b3N5bX0gaW4gdGhlIEJGRCBAdmFye29iZmR9LgotCVJldHVybiA8PHRydWU+PiBvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb24gZXJyb3IuICBQb3NzaWJsZSBlcnJvcgotCXJldHVybnMgYXJlOgotCi0JbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCi0JTm90IGVub3VnaCBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEgZm9yIEB2YXJ7b3NlY30uCi0KLS4jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEoaWJmZCwgaXN5bWJvbCwgb2JmZCwgb3N5bWJvbCkgXAotLiAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhLCBcCi0uCQkoaWJmZCwgaXN5bWJvbCwgb2JmZCwgb3N5bWJvbCkpCi0KLSovCi0KLS8qIFRoZSBnZW5lcmljIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgbWluaSBzeW1ib2xzLgotICAgVGhpcyBpcyB1c2VkIHdoZW4gdGhlIGJhY2tlbmQgZG9lcyBub3QgcHJvdmlkZSBhIG1vcmUgZWZmaWNpZW50Ci0gICB2ZXJzaW9uLiAgSXQganVzdCB1c2VzIEJGRCBhc3ltYm9sIHN0cnVjdHVyZXMgYXMgbWluaSBzeW1ib2xzLiAgKi8KLQotbG9uZwotX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zcCwgc2l6ZXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBQVFIgKm1pbmlzeW1zcDsKLSAgICAgdW5zaWduZWQgaW50ICpzaXplcDsKLXsKLSAgbG9uZyBzdG9yYWdlOwotICBhc3ltYm9sICoqc3ltcyA9IE5VTEw7Ci0gIGxvbmcgc3ltY291bnQ7Ci0KLSAgaWYgKGR5bmFtaWMpCi0gICAgc3RvcmFnZSA9IGJmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotICBlbHNlCi0gICAgc3RvcmFnZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLSAgaWYgKHN0b3JhZ2UgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHN5bXMgPSAoYXN5bWJvbCAqKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc3RvcmFnZSk7Ci0gIGlmIChzeW1zID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGR5bmFtaWMpCi0gICAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIChhYmZkLCBzeW1zKTsKLSAgZWxzZQotICAgIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIHN5bXMpOwotICBpZiAoc3ltY291bnQgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICptaW5pc3ltc3AgPSAoUFRSKSBzeW1zOwotICAqc2l6ZXAgPSBzaXplb2YgKGFzeW1ib2wgKik7Ci0gIHJldHVybiBzeW1jb3VudDsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChzeW1zKTsKLSAgcmV0dXJuIC0xOwotfQotCi0vKiBUaGUgZ2VuZXJpYyB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiB3aGljaCBjb252ZXJ0cyBhIG1pbmlzeW1ib2wgdG8KLSAgIGFuIGFzeW1ib2wuICBXZSBkb24ndCB3b3JyeSBhYm91dCB0aGUgc3ltIGFyZ3VtZW50IHdlIGFyZSBwYXNzZWQ7Ci0gICB3ZSBqdXN0IHJldHVybiB0aGUgYXN5bWJvbCB0aGUgbWluaXN5bWJvbCBwb2ludHMgdG8uICAqLwotCi0vKkFSR1NVU0VEKi8KLWFzeW1ib2wgKgotX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBjb25zdCBQVFIgbWluaXN5bTsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICByZXR1cm4gKihhc3ltYm9sICoqKSBtaW5pc3ltOwotfQotCi0vKiBMb29rIHRocm91Z2ggc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGluIC5zdGFiIGFuZCAuc3RhYnN0cgotICAgc2VjdGlvbnMgdG8gZmluZCB0aGUgc291cmNlIGZpbGUgYW5kIGxpbmUgY2xvc2VzdCB0byBhIGRlc2lyZWQKLSAgIGxvY2F0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IENPRkYgYW5kIEVMRiB0YXJnZXRzLiAgSXQgc2V0cyAqcGZvdW5kCi0gICB0byB0cnVlIGlmIGl0IGZpbmRzIHNvbWUgaW5mb3JtYXRpb24uICBUaGUgKnBpbmZvIGZpZWxkIGlzIHVzZWQgdG8KLSAgIHBhc3MgY2FjaGVkIGluZm9ybWF0aW9uIGluIGFuZCBvdXQgb2YgdGhpcyByb3V0aW5lOyB0aGlzIGZpcnN0IHRpbWUKLSAgIHRoZSByb3V0aW5lIGlzIGNhbGxlZCBmb3IgYSBCRkQsICpwaW5mbyBzaG91bGQgYmUgTlVMTC4gIFRoZSB2YWx1ZQotICAgcGxhY2VkIGluICpwaW5mbyBzaG91bGQgYmUgc2F2ZWQgd2l0aCB0aGUgQkZELCBhbmQgcGFzc2VkIGJhY2sgZWFjaAotICAgdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gICovCi0KLS8qIFdlIHVzZSBhIGNhY2hlIGJ5IGRlZmF1bHQuICAqLwotCi0jZGVmaW5lIEVOQUJMRV9DQUNISU5HCi0KLS8qIFdlIGtlZXAgYW4gYXJyYXkgb2YgaW5kZXhlbnRyeSBzdHJ1Y3R1cmVzIHRvIHJlY29yZCB3aGVyZSBpbiB0aGUKLSAgIHN0YWJzIHNlY3Rpb24gd2Ugc2hvdWxkIGxvb2sgdG8gZmluZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgYQotICAgcGFydGljdWxhciBhZGRyZXNzLiAgKi8KLQotc3RydWN0IGluZGV4ZW50cnkKLXsKLSAgYmZkX3ZtYSB2YWw7Ci0gIGJmZF9ieXRlICpzdGFiOwotICBiZmRfYnl0ZSAqc3RyOwotICBjaGFyICpkaXJlY3RvcnlfbmFtZTsKLSAgY2hhciAqZmlsZV9uYW1lOwotICBjaGFyICpmdW5jdGlvbl9uYW1lOwotfTsKLQotLyogQ29tcGFyZSB0d28gaW5kZXhlbnRyeSBzdHJ1Y3R1cmVzLiAgVGhpcyBpcyBjYWxsZWQgdmlhIHFzb3J0LiAgKi8KLQotc3RhdGljIGludAotY21waW5kZXhlbnRyeSAoYSwgYikKLSAgICAgY29uc3QgUFRSICphOwotICAgICBjb25zdCBQVFIgKmI7Ci17Ci0gIGNvbnN0IHN0cnVjdCBpbmRleGVudHJ5ICpjb250ZXN0YW50QSA9IChjb25zdCBzdHJ1Y3QgaW5kZXhlbnRyeSAqKSBhOwotICBjb25zdCBzdHJ1Y3QgaW5kZXhlbnRyeSAqY29udGVzdGFudEIgPSAoY29uc3Qgc3RydWN0IGluZGV4ZW50cnkgKikgYjsKLQotICBpZiAoY29udGVzdGFudEEtPnZhbCA8IGNvbnRlc3RhbnRCLT52YWwpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmIChjb250ZXN0YW50QS0+dmFsID4gY29udGVzdGFudEItPnZhbCkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBBIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUgaXMgc3RvcmVkIGluICpwaW5mby4gICovCi0KLXN0cnVjdCBzdGFiX2ZpbmRfaW5mbwotewotICAvKiBUaGUgLnN0YWIgc2VjdGlvbi4gICovCi0gIGFzZWN0aW9uICpzdGFic2VjOwotICAvKiBUaGUgLnN0YWJzdHIgc2VjdGlvbi4gICovCi0gIGFzZWN0aW9uICpzdHJzZWM7Ci0gIC8qIFRoZSBjb250ZW50cyBvZiB0aGUgLnN0YWIgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpzdGFiczsKLSAgLyogVGhlIGNvbnRlbnRzIG9mIHRoZSAuc3RhYnN0ciBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKnN0cnM7Ci0KLSAgLyogQSB0YWJsZSB0aGF0IGluZGV4ZXMgc3RhYnMgYnkgbWVtb3J5IGFkZHJlc3MuICAqLwotICBzdHJ1Y3QgaW5kZXhlbnRyeSAqaW5kZXh0YWJsZTsKLSAgLyogVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIGluZGV4dGFibGUuICAqLwotICBpbnQgaW5kZXh0YWJsZXNpemU7Ci0KLSNpZmRlZiBFTkFCTEVfQ0FDSElORwotICAvKiBDYWNoZWQgdmFsdWVzIHRvIHJlc3RhcnQgcXVpY2tseS4gICovCi0gIHN0cnVjdCBpbmRleGVudHJ5ICpjYWNoZWRfaW5kZXhlbnRyeTsKLSAgYmZkX3ZtYSBjYWNoZWRfb2Zmc2V0OwotICBiZmRfYnl0ZSAqY2FjaGVkX3N0YWI7Ci0gIGNoYXIgKmNhY2hlZF9maWxlX25hbWU7Ci0jZW5kaWYKLQotICAvKiBTYXZlZCBwdHIgdG8gbWFsbG9jJ2VkIGZpbGVuYW1lLiAgKi8KLSAgY2hhciAqZmlsZW5hbWU7Ci19OwotCi1ib29sZWFuCi1fYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc3ltYm9scywgc2VjdGlvbiwgb2Zmc2V0LCBwZm91bmQsCi0JCQkJICAgICBwZmlsZW5hbWUsIHBmbm5hbWUsIHBsaW5lLCBwaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBib29sZWFuICpwZm91bmQ7Ci0gICAgIGNvbnN0IGNoYXIgKipwZmlsZW5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKipwZm5uYW1lOwotICAgICB1bnNpZ25lZCBpbnQgKnBsaW5lOwotICAgICBQVFIgKnBpbmZvOwotewotICBzdHJ1Y3Qgc3RhYl9maW5kX2luZm8gKmluZm87Ci0gIGJmZF9zaXplX3R5cGUgc3RhYnNpemUsIHN0cnNpemU7Ci0gIGJmZF9ieXRlICpzdGFiLCAqc3RyLCAqbGFzdF9zdGFiOwotICBiZmRfc2l6ZV90eXBlIHN0cm9mZjsKLSAgc3RydWN0IGluZGV4ZW50cnkgKmluZGV4ZW50cnk7Ci0gIGNoYXIgKmRpcmVjdG9yeV9uYW1lLCAqZmlsZV9uYW1lOwotICBpbnQgc2F3X2Z1bjsKLQotICAqcGZvdW5kID0gZmFsc2U7Ci0gICpwZmlsZW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKLSAgKnBmbm5hbWUgPSBOVUxMOwotICAqcGxpbmUgPSAwOwotCi0gIC8qIFN0YWJzIGVudHJpZXMgdXNlIGEgMTIgYnl0ZSBmb3JtYXQ6Ci0gICAgICAgNCBieXRlIHN0cmluZyB0YWJsZSBpbmRleAotICAgICAgIDEgYnl0ZSBzdGFiIHR5cGUKLSAgICAgICAxIGJ5dGUgc3RhYiBvdGhlciBmaWVsZAotICAgICAgIDIgYnl0ZSBzdGFiIGRlc2MgZmllbGQKLSAgICAgICA0IGJ5dGUgc3RhYiB2YWx1ZQotICAgICBGSVhNRTogVGhpcyB3aWxsIGhhdmUgdG8gY2hhbmdlIGZvciBhIDY0IGJpdCBvYmplY3QgZm9ybWF0LgotCi0gICAgIFRoZSBzdGFicyBzeW1ib2xzIGFyZSBkaXZpZGVkIGludG8gY29tcGlsYXRpb24gdW5pdHMuICBGb3IgdGhlCi0gICAgIGZpcnN0IGVudHJ5IGluIGVhY2ggdW5pdCwgdGhlIHR5cGUgb2YgMCwgdGhlIHZhbHVlIGlzIHRoZSBsZW5ndGgKLSAgICAgb2YgdGhlIHN0cmluZyB0YWJsZSBmb3IgdGhpcyB1bml0LCBhbmQgdGhlIGRlc2MgZmllbGQgaXMgdGhlCi0gICAgIG51bWJlciBvZiBzdGFicyBzeW1ib2xzIGZvciB0aGlzIHVuaXQuICAqLwotCi0jZGVmaW5lIFNUUkRYT0ZGICgwKQotI2RlZmluZSBUWVBFT0ZGICg0KQotI2RlZmluZSBPVEhFUk9GRiAoNSkKLSNkZWZpbmUgREVTQ09GRiAoNikKLSNkZWZpbmUgVkFMT0ZGICg4KQotI2RlZmluZSBTVEFCU0laRSAoMTIpCi0KLSAgaW5mbyA9IChzdHJ1Y3Qgc3RhYl9maW5kX2luZm8gKikgKnBpbmZvOwotICBpZiAoaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChpbmZvLT5zdGFic2VjID09IE5VTEwgfHwgaW5mby0+c3Ryc2VjID09IE5VTEwpCi0JewotCSAgLyogTm8gc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgc3RhYnNpemUgPSBpbmZvLT5zdGFic2VjLT5fcmF3X3NpemU7Ci0gICAgICBzdHJzaXplID0gaW5mby0+c3Ryc2VjLT5fcmF3X3NpemU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbG9uZyByZWxvY19zaXplLCByZWxvY19jb3VudDsKLSAgICAgIGFyZWxlbnQgKipyZWxvY192ZWN0b3I7Ci0gICAgICBpbnQgaTsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyICpmaWxlX25hbWU7Ci0gICAgICBjaGFyICpkaXJlY3RvcnlfbmFtZTsKLSAgICAgIGNoYXIgKmZ1bmN0aW9uX25hbWU7Ci0KLSAgICAgIGluZm8gPSAoc3RydWN0IHN0YWJfZmluZF9pbmZvICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAqaW5mbyk7Ci0gICAgICBpZiAoaW5mbyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRklYTUU6IFdoZW4gdXNpbmcgdGhlIGxpbmtlciAtLXNwbGl0LWJ5LWZpbGUgb3IKLQkgLS1zcGxpdC1ieS1yZWxvYyBvcHRpb25zLCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIC5zdGFiIGFuZAotCSAuc3RhYnN0ciBzZWN0aW9ucyB0byBiZSBzcGxpdC4gIFdlIHNob3VsZCBoYW5kbGUgdGhhdC4gICovCi0KLSAgICAgIGluZm8tPnN0YWJzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zdGFiIik7Ci0gICAgICBpbmZvLT5zdHJzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zdGFic3RyIik7Ci0KLSAgICAgIGlmIChpbmZvLT5zdGFic2VjID09IE5VTEwgfHwgaW5mby0+c3Ryc2VjID09IE5VTEwpCi0JewotCSAgLyogTm8gc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgU2V0ICpwaW5mbyBzbyB0aGF0IHdlCi0gICAgICAgICAgICAgY2FuIHJldHVybiBxdWlja2x5IGluIHRoZSBpbmZvICE9IE5VTEwgY2FzZSBhYm92ZS4gICovCi0JICAqcGluZm8gPSAoUFRSKSBpbmZvOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBzdGFic2l6ZSA9IGluZm8tPnN0YWJzZWMtPl9yYXdfc2l6ZTsKLSAgICAgIHN0cnNpemUgPSBpbmZvLT5zdHJzZWMtPl9yYXdfc2l6ZTsKLQotICAgICAgaW5mby0+c3RhYnMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBzdGFic2l6ZSk7Ci0gICAgICBpbmZvLT5zdHJzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgc3Ryc2l6ZSk7Ci0gICAgICBpZiAoaW5mby0+c3RhYnMgPT0gTlVMTCB8fCBpbmZvLT5zdHJzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGluZm8tPnN0YWJzZWMsIGluZm8tPnN0YWJzLCAwLAotCQkJCSAgICAgIHN0YWJzaXplKQotCSAgfHwgISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGluZm8tPnN0cnNlYywgaW5mby0+c3RycywgMCwKLQkJCQkJIHN0cnNpemUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZSwgd2UgaGF2ZSB0byByZWxvY2F0ZQotCSB0aGUgZW50cmllcyBpbiAuc3RhYi4gIFRoaXMgc2hvdWxkIGFsd2F5cyBiZSBzaW1wbGUgMzIgYml0Ci0JIHJlbG9jYXRpb25zIGFnYWluc3Qgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgb2JqZWN0IGZpbGUsIHNvCi0JIHRoaXMgc2hvdWxkIGJlIG5vIGJpZyBkZWFsLiAgKi8KLSAgICAgIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBpbmZvLT5zdGFic2VjKTsKLSAgICAgIGlmIChyZWxvY19zaXplIDwgMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gICAgICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgaW5mby0+c3RhYnNlYywgcmVsb2NfdmVjdG9yLAotCQkJCQkgICAgc3ltYm9scyk7Ci0gICAgICBpZiAocmVsb2NfY291bnQgPCAwKQotCXsKLQkgIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLQkgICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAocmVsb2NfY291bnQgPiAwKQotCXsKLQkgIGFyZWxlbnQgKipwcjsKLQotCSAgZm9yIChwciA9IHJlbG9jX3ZlY3RvcjsgKnByICE9IE5VTEw7IHByKyspCi0JICAgIHsKLQkgICAgICBhcmVsZW50ICpyOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgICAgIGFzeW1ib2wgKnN5bTsKLQotCSAgICAgIHIgPSAqcHI7Ci0JICAgICAgaWYgKHItPmhvd3RvLT5yaWdodHNoaWZ0ICE9IDAKLQkJICB8fCByLT5ob3d0by0+c2l6ZSAhPSAyCi0JCSAgfHwgci0+aG93dG8tPmJpdHNpemUgIT0gMzIKLQkJICB8fCByLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkJICB8fCByLT5ob3d0by0+Yml0cG9zICE9IDAKLQkJICB8fCByLT5ob3d0by0+ZHN0X21hc2sgIT0gMHhmZmZmZmZmZikKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIlVuc3VwcG9ydGVkIC5zdGFiIHJlbG9jYXRpb24iKSk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkJICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0JCSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgaW5mby0+c3RhYnMgKyByLT5hZGRyZXNzKTsKLQkgICAgICB2YWwgJj0gci0+aG93dG8tPnNyY19tYXNrOwotCSAgICAgIHN5bSA9ICpyLT5zeW1fcHRyX3B0cjsKLQkgICAgICB2YWwgKz0gc3ltLT52YWx1ZSArIHN5bS0+c2VjdGlvbi0+dm1hICsgci0+YWRkZW5kOwotCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgaW5mby0+c3RhYnMgKyByLT5hZGRyZXNzKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotCWZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0KLSAgICAgIC8qIEZpcnN0IHRpbWUgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLCBidWlsZCBhIHRhYmxlIG1hdGNoaW5nCi0JIGZ1bmN0aW9uIFZNIGFkZHJlc3NlcyB0byBzdGFicywgdGhlbiBzb3J0IGJhc2VkIG9uIHN0YXJ0aW5nCi0JIFZNIGFkZHJlc3MuICBEbyB0aGlzIGluIHR3byBwYXNzZXM6IG9uY2UgdG8gY291bnQgaG93IG1hbnkKLQkgdGFibGUgZW50cmllcyB3ZSdsbCBuZWVkLCBhbmQgYSBzZWNvbmQgdG8gYWN0dWFsbHkgYnVpbGQgdGhlCi0JIHRhYmxlLiAgKi8KLQotICAgICAgaW5mby0+aW5kZXh0YWJsZXNpemUgPSAwOwotICAgICAgc2F3X2Z1biA9IDE7Ci0gICAgICBmb3IgKHN0YWIgPSBpbmZvLT5zdGFiczsgc3RhYiA8IGluZm8tPnN0YWJzICsgc3RhYnNpemU7IHN0YWIgKz0gU1RBQlNJWkUpCi0JewotCSAgaWYgKHN0YWJbVFlQRU9GRl0gPT0gTl9TTykKLQkgICAgewotCSAgICAgIC8qIE5fU08gd2l0aCBudWxsIG5hbWUgaW5kaWNhdGVzIEVPRiAqLwotCSAgICAgIGlmIChiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpID09IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgLyogaWYgd2UgZGlkIG5vdCBzZWUgYSBmdW5jdGlvbiBkZWYsIGxlYXZlIHNwYWNlIGZvciBvbmUuICovCi0JICAgICAgaWYgKHNhd19mdW4gPT0gMCkKLQkJKytpbmZvLT5pbmRleHRhYmxlc2l6ZTsKLQotCSAgICAgIHNhd19mdW4gPSAwOwotCi0JICAgICAgLyogdHdvIE5fU08ncyBpbiBhIHJvdyBpcyBhIGZpbGVuYW1lIGFuZCBkaXJlY3RvcnkuIFNraXAgKi8KLQkgICAgICBpZiAoc3RhYiArIFNUQUJTSVpFIDwgaW5mby0+c3RhYnMgKyBzdGFic2l6ZQotCQkgICYmICooc3RhYiArIFNUQUJTSVpFICsgVFlQRU9GRikgPT0gTl9TTykKLQkJewotCQkgIHN0YWIgKz0gU1RBQlNJWkU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoc3RhYltUWVBFT0ZGXSA9PSBOX0ZVTikKLQkgICAgewotCSAgICAgIHNhd19mdW4gPSAxOwotCSAgICAgICsraW5mby0+aW5kZXh0YWJsZXNpemU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChzYXdfZnVuID09IDApCi0JKytpbmZvLT5pbmRleHRhYmxlc2l6ZTsKLSAgICAgIAotICAgICAgaWYgKGluZm8tPmluZGV4dGFibGVzaXplID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgICArK2luZm8tPmluZGV4dGFibGVzaXplOwotCi0gICAgICBpbmZvLT5pbmRleHRhYmxlID0gKChzdHJ1Y3QgaW5kZXhlbnRyeSAqKQotCQkJICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICAgICAoc2l6ZW9mIChzdHJ1Y3QgaW5kZXhlbnRyeSkKLQkJCQkgICAgICAqIGluZm8tPmluZGV4dGFibGVzaXplKSkpOwotICAgICAgaWYgKGluZm8tPmluZGV4dGFibGUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgICBkaXJlY3RvcnlfbmFtZSA9IE5VTEw7Ci0gICAgICBzYXdfZnVuID0gMTsKLQotICAgICAgZm9yIChpID0gMCwgc3Ryb2ZmID0gMCwgc3RhYiA9IGluZm8tPnN0YWJzLCBzdHIgPSBpbmZvLT5zdHJzOwotCSAgIGkgPCBpbmZvLT5pbmRleHRhYmxlc2l6ZSAmJiBzdGFiIDwgaW5mby0+c3RhYnMgKyBzdGFic2l6ZTsKLQkgICBzdGFiICs9IFNUQUJTSVpFKQotCXsKLQkgIHN3aXRjaCAoc3RhYltUWVBFT0ZGXSkKLQkgICAgewotCSAgICBjYXNlIDA6Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgZmlyc3QgZW50cnkgaW4gYSBjb21waWxhdGlvbiB1bml0LiAgKi8KLQkgICAgICBpZiAoKGJmZF9zaXplX3R5cGUpICgoaW5mby0+c3RycyArIHN0cnNpemUpIC0gc3RyKSA8IHN0cm9mZikKLQkJYnJlYWs7Ci0JICAgICAgc3RyICs9IHN0cm9mZjsKLQkgICAgICBzdHJvZmYgPSBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgVkFMT0ZGKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE5fU086Ci0JICAgICAgLyogVGhlIG1haW4gZmlsZSBuYW1lLiAgKi8KLQotCSAgICAgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSBjcmVhdGVzIGEgbmV3IGluZGV4dGFibGUgZW50cnkgd2l0aAotCSAgICAgICAgIGEgTlVMTCBmdW5jdGlvbiBuYW1lIGlmIHRoZXJlIHdlcmUgbm8gTl9GVU5zIGluIGEgZmlsZS4KLQkgICAgICAgICBOb3RlIHRoYXQgYSBOX1NPIHdpdGhvdXQgYSBmaWxlIG5hbWUgaXMgYW4gRU9GIGFuZAotCSAgICAgICAgIHRoZXJlIGNvdWxkIGJlIDIgTl9TTyBmb2xsb3dpbmcgaXQgd2l0aCB0aGUgbmV3IGZpbGVuYW1lIAotCSAgICAgICAgIGFuZCBkaXJlY3RvcnkuICovCi0JICAgICAgaWYgKHNhd19mdW4gPT0gMCkKLQkJewotCQkgIGluZm8tPmluZGV4dGFibGVbaV0udmFsID0gYmZkX2dldF8zMiAoYWJmZCwgbGFzdF9zdGFiICsgVkFMT0ZGKTsKLQkJICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0YWIgPSBsYXN0X3N0YWI7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5zdHIgPSBzdHI7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5kaXJlY3RvcnlfbmFtZSA9IGRpcmVjdG9yeV9uYW1lOwotCQkgIGluZm8tPmluZGV4dGFibGVbaV0uZmlsZV9uYW1lID0gZmlsZV9uYW1lOwotCQkgIGluZm8tPmluZGV4dGFibGVbaV0uZnVuY3Rpb25fbmFtZSA9IE5VTEw7Ci0JCSAgKytpOwotCQl9Ci0JICAgICAgc2F3X2Z1biA9IDA7Ci0JICAgICAgCi0JICAgICAgZmlsZV9uYW1lID0gKGNoYXIgKikgc3RyICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFNUUkRYT0ZGKTsKLQkgICAgICBpZiAoKmZpbGVfbmFtZSA9PSAnXDAnKQotCQl7Ci0JCSAgZGlyZWN0b3J5X25hbWUgPSBOVUxMOwotCQkgIGZpbGVfbmFtZSA9IE5VTEw7Ci0JCSAgc2F3X2Z1biA9IDE7Ci0JCX0KLQkgICAgICBlbHNlIHsKLQkJbGFzdF9zdGFiID0gc3RhYjsKLQkJaWYgKHN0YWIgKyBTVEFCU0laRSA+PSBpbmZvLT5zdGFicyArIHN0YWJzaXplCi0JCSAgICB8fCAqKHN0YWIgKyBTVEFCU0laRSArIFRZUEVPRkYpICE9IE5fU08pCi0JCSAgewotCQkgICAgZGlyZWN0b3J5X25hbWUgPSBOVUxMOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIC8qIFR3byBjb25zZWN1dGl2ZSBOX1NPcyBhcmUgYSBkaXJlY3RvcnkgYW5kIGEgZmlsZQotCQkgICAgICAgbmFtZS4gICovCi0JCSAgICBzdGFiICs9IFNUQUJTSVpFOwotCQkgICAgZGlyZWN0b3J5X25hbWUgPSBmaWxlX25hbWU7Ci0JCSAgICBmaWxlX25hbWUgPSAoKGNoYXIgKikgc3RyCi0JCQkJICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFNUUkRYT0ZGKSk7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE5fU09MOgotCSAgICAgIC8qIFRoZSBuYW1lIG9mIGFuIGluY2x1ZGUgZmlsZS4gICovCi0JICAgICAgZmlsZV9uYW1lID0gKGNoYXIgKikgc3RyICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFNUUkRYT0ZGKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE5fRlVOOgotCSAgICAgIC8qIEEgZnVuY3Rpb24gbmFtZS4gICovCi0JICAgICAgc2F3X2Z1biA9IDE7Ci0JICAgICAgbmFtZSA9IChjaGFyICopIHN0ciArIGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBTVFJEWE9GRik7Ci0KLQkgICAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJbmFtZSA9IE5VTEw7Ci0KLQkgICAgICBmdW5jdGlvbl9uYW1lID0gbmFtZTsKLQotCSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgaW5mby0+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+Ci0jZGVmaW5lIF8oU3RyaW5nKSBkZ2V0dGV4dCAoUEFDS0FHRSwgU3RyaW5nKQotI2lmZGVmIGdldHRleHRfbm9vcAotI2RlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQotI2Vsc2UKLSNkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotI2VuZGlmCi0jZWxzZQotLyogU3R1YnMgdGhhdCBkbyBzb21ldGhpbmcgY2xvc2UgZW5vdWdoLiAgKi8KLSNkZWZpbmUgdGV4dGRvbWFpbihTdHJpbmcpIChTdHJpbmcpCi0jZGVmaW5lIGdldHRleHQoU3RyaW5nKSAoU3RyaW5nKQotI2RlZmluZSBkZ2V0dGV4dChEb21haW4sTWVzc2FnZSkgKE1lc3NhZ2UpCi0jZGVmaW5lIGRjZ2V0dGV4dChEb21haW4sTWVzc2FnZSxUeXBlKSAoTWVzc2FnZSkKLSNkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWluLERpcmVjdG9yeSkgKERvbWFpbikKLSNkZWZpbmUgXyhTdHJpbmcpIChTdHJpbmcpCi0jZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSNlbmRpZgotCi0jZW5kaWYgLyogISBkZWZpbmVkIChCRkRfU1lTREVQX0gpICovCmRpZmYgLS1naXQgYS9iZmQvdGFyZ2V0cy5jIGIvYmZkL3RhcmdldHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI2ZTUxZC4uMDAwMDAwMAotLS0gYS9iZmQvdGFyZ2V0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3OSArMCwwIEBACi0vKiBHZW5lcmljIHRhcmdldC1maWxlLXR5cGUgc3VwcG9ydCBmb3IgdGhlIEJGRCBsaWJyYXJ5LgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImZubWF0Y2guaCIKLQotLyoKLVNFQ1RJT04gCi0JVGFyZ2V0cwotCi1ERVNDUklQVElPTgotCUVhY2ggcG9ydCBvZiBCRkQgdG8gYSBkaWZmZXJlbnQgbWFjaGluZSByZXF1cmllcyB0aGUgY3JlYXRpb24KLQlvZiBhIHRhcmdldCBiYWNrIGVuZC4gQWxsIHRoZSBiYWNrIGVuZCBwcm92aWRlcyB0byB0aGUgcm9vdAotCXBhcnQgb2YgQkZEIGlzIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gZnVuY3Rpb25zCi0Jd2hpY2ggcGVyZm9ybSBjZXJ0YWluIGxvdyBsZXZlbCBvcGVyYXRpb25zIG9uIGZpbGVzLiBCRkQKLQl0cmFuc2xhdGVzIHRoZSBhcHBsaWNhdGlvbnMncyByZXF1ZXN0cyB0aHJvdWdoIGEgcG9pbnRlciBpbnRvCi0JY2FsbHMgdG8gdGhlIGJhY2sgZW5kIHJvdXRpbmVzLiAKLQotCVdoZW4gYSBmaWxlIGlzIG9wZW5lZCB3aXRoIDw8YmZkX29wZW5yPj4sIGl0cyBmb3JtYXQgYW5kCi0JdGFyZ2V0IGFyZSB1bmtub3duLiBCRkQgdXNlcyB2YXJpb3VzIG1lY2hhbmlzbXMgdG8gZGV0ZXJtaW5lCi0JaG93IHRvIGludGVycHJldCB0aGUgZmlsZS4gVGhlIG9wZXJhdGlvbnMgcGVyZm9ybWVkIGFyZToKLQotCW8gQ3JlYXRlIGEgQkZEIGJ5IGNhbGxpbmcgdGhlIGludGVybmFsIHJvdXRpbmUKLQk8PF9iZmRfbmV3X2JmZD4+LCB0aGVuIGNhbGwgPDxiZmRfZmluZF90YXJnZXQ+PiB3aXRoIHRoZQotCXRhcmdldCBzdHJpbmcgc3VwcGxpZWQgdG8gPDxiZmRfb3BlbnI+PiBhbmQgdGhlIG5ldyBCRkQgcG9pbnRlci4gCi0KLQlvIElmIGEgbnVsbCB0YXJnZXQgc3RyaW5nIHdhcyBwcm92aWRlZCB0byA8PGJmZF9maW5kX3RhcmdldD4+LAotCWxvb2sgdXAgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIDw8R05VVEFSR0VUPj4gYW5kIHVzZQotCXRoYXQgYXMgdGhlIHRhcmdldCBzdHJpbmcuIAotCi0JbyBJZiB0aGUgdGFyZ2V0IHN0cmluZyBpcyBzdGlsbCA8PE5VTEw+Piwgb3IgdGhlIHRhcmdldCBzdHJpbmcgaXMKLQk8PGRlZmF1bHQ+PiwgdGhlbiB1c2UgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHRhcmdldCB2ZWN0b3IKLQlhcyB0aGUgdGFyZ2V0IHR5cGUsIGFuZCBzZXQgPDx0YXJnZXRfZGVmYXVsdGVkPj4gaW4gdGhlIEJGRCB0bwotCWNhdXNlIDw8YmZkX2NoZWNrX2Zvcm1hdD4+IHRvIGxvb3AgdGhyb3VnaCBhbGwgdGhlIHRhcmdldHMuCi0JQHhyZWZ7YmZkX3RhcmdldH0uICBAeHJlZntGb3JtYXRzfS4KLQotCW8gT3RoZXJ3aXNlLCBpbnNwZWN0IHRoZSBlbGVtZW50cyBpbiB0aGUgdGFyZ2V0IHZlY3RvcgotCW9uZSBieSBvbmUsIHVudGlsIGEgbWF0Y2ggb24gdGFyZ2V0IG5hbWUgaXMgZm91bmQuIFdoZW4gZm91bmQsCi0JdXNlIGl0LiAKLQotCW8gT3RoZXJ3aXNlIHJldHVybiB0aGUgZXJyb3IgPDxiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQ+PiB0bwotCTw8YmZkX29wZW5yPj4uCi0KLQlvIDw8YmZkX29wZW5yPj4gYXR0ZW1wdHMgdG8gb3BlbiB0aGUgZmlsZSB1c2luZwotCTw8YmZkX29wZW5fZmlsZT4+LCBhbmQgcmV0dXJucyB0aGUgQkZELgotCi0JT25jZSB0aGUgQkZEIGhhcyBiZWVuIG9wZW5lZCBhbmQgdGhlIHRhcmdldCBzZWxlY3RlZCwgdGhlIGZpbGUKLQlmb3JtYXQgbWF5IGJlIGRldGVybWluZWQuIFRoaXMgaXMgZG9uZSBieSBjYWxsaW5nCi0JPDxiZmRfY2hlY2tfZm9ybWF0Pj4gb24gdGhlIEJGRCB3aXRoIGEgc3VnZ2VzdGVkIGZvcm1hdC4gCi0JSWYgPDx0YXJnZXRfZGVmYXVsdGVkPj4gaGFzIGJlZW4gc2V0LCBlYWNoIHBvc3NpYmxlIHRhcmdldAotCXR5cGUgaXMgdHJpZWQgdG8gc2VlIGlmIGl0IHJlY29nbml6ZXMgdGhlIHNwZWNpZmllZCBmb3JtYXQuCi0JPDxiZmRfY2hlY2tfZm9ybWF0Pj4gcmV0dXJucyA8PHRydWU+PiB3aGVuIHRoZSBjYWxsZXIgZ3Vlc3NlcyByaWdodC4KLUBtZW51Ci1AKiBiZmRfdGFyZ2V0OjoKLUBlbmQgbWVudQotKi8KLQotCi0vKgotCi1JTk9ERQotCWJmZF90YXJnZXQsICAsIFRhcmdldHMsIFRhcmdldHMKLURPQ0RECi1TVUJTRUNUSU9OCi0JYmZkX3RhcmdldAotCi1ERVNDUklQVElPTgotCVRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdGhhdCBCRkQga25vd3MgYWJvdXQgYQotCXRhcmdldC4gSXQgaW5jbHVkZXMgdGhpbmdzIGxpa2UgaXRzIGJ5dGUgb3JkZXIsIG5hbWUsIGFuZCB3aGljaAotCXJvdXRpbmVzIHRvIGNhbGwgdG8gZG8gdmFyaW91cyBvcGVyYXRpb25zLiAgIAotCi0JRXZlcnkgQkZEIHBvaW50cyB0byBhIHRhcmdldCBzdHJ1Y3R1cmUgd2l0aCBpdHMgPDx4dmVjPj4KLQltZW1iZXIuIAotCi0JVGhlIG1hY3JvcyBiZWxvdyBhcmUgdXNlZCB0byBkaXNwYXRjaCB0byBmdW5jdGlvbnMgdGhyb3VnaCB0aGUKLQk8PGJmZF90YXJnZXQ+PiB2ZWN0b3IuIFRoZXkgYXJlIHVzZWQgaW4gYSBudW1iZXIgb2YgbWFjcm9zIGZ1cnRoZXIKLQlkb3duIGluIEBmaWxle2JmZC5ofSwgYW5kIGFyZSBhbHNvIHVzZWQgd2hlbiBjYWxsaW5nIHZhcmlvdXMKLQlyb3V0aW5lcyBieSBoYW5kIGluc2lkZSB0aGUgQkZEIGltcGxlbWVudGF0aW9uLiAgVGhlIEB2YXJ7YXJnbGlzdH0KLQlhcmd1bWVudCBtdXN0IGJlIHBhcmVudGhlc2l6ZWQ7IGl0IGNvbnRhaW5zIGFsbCB0aGUgYXJndW1lbnRzCi0JdG8gdGhlIGNhbGxlZCBmdW5jdGlvbi4gCi0KLQlUaGV5IG1ha2UgdGhlIGRvY3VtZW50YXRpb24gKG1vcmUpIHVucGxlYXNhbnQgdG8gcmVhZCwgc28gaWYKLQlzb21lb25lIHdhbnRzIHRvIGZpeCB0aGlzIGFuZCBub3QgYnJlYWsgdGhlIGFib3ZlLCBwbGVhc2UgZG8uCi0KLS4jZGVmaW5lIEJGRF9TRU5EKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotLiAgICAgICAgICAgICAgICgoKigoYmZkKS0+eHZlYy0+bWVzc2FnZSkpIGFyZ2xpc3QpCi0uCi0uI2lmZGVmIERFQlVHX0JGRF9TRU5ECi0uI3VuZGVmIEJGRF9TRU5ECi0uI2RlZmluZSBCRkRfU0VORChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLS4gICgoKGJmZCkgJiYgKGJmZCktPnh2ZWMgJiYgKGJmZCktPnh2ZWMtPm1lc3NhZ2UpID8gXAotLiAgICAoKCooKGJmZCktPnh2ZWMtPm1lc3NhZ2UpKSBhcmdsaXN0KSA6IFwKLS4gICAgKGJmZF9hc3NlcnQgKF9fRklMRV9fLF9fTElORV9fKSwgTlVMTCkpCi0uI2VuZGlmCi0KLQlGb3Igb3BlcmF0aW9ucyB3aGljaCBpbmRleCBvbiB0aGUgQkZEIGZvcm1hdDoKLQotLiNkZWZpbmUgQkZEX1NFTkRfRk1UKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotLiAgICAgICAgICAgICgoKGJmZCktPnh2ZWMtPm1lc3NhZ2VbKGludCkoKGJmZCktPmZvcm1hdCldKSBhcmdsaXN0KQotLgotLiNpZmRlZiBERUJVR19CRkRfU0VORAotLiN1bmRlZiBCRkRfU0VORF9GTVQKLS4jZGVmaW5lIEJGRF9TRU5EX0ZNVChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLS4gICgoKGJmZCkgJiYgKGJmZCktPnh2ZWMgJiYgKGJmZCktPnh2ZWMtPm1lc3NhZ2UpID8gXAotLiAgICgoKGJmZCktPnh2ZWMtPm1lc3NhZ2VbKGludCkoKGJmZCktPmZvcm1hdCldKSBhcmdsaXN0KSA6IFwKLS4gICAoYmZkX2Fzc2VydCAoX19GSUxFX18sX19MSU5FX18pLCBOVUxMKSkKLS4jZW5kaWYKLQotCVRoaXMgaXMgdGhlIHN0cnVjdHVyZSB3aGljaCBkZWZpbmVzIHRoZSB0eXBlIG9mIEJGRCB0aGlzIGlzLiAgVGhlCi0JPDx4dmVjPj4gbWVtYmVyIG9mIHRoZSBzdHJ1Y3QgPDxiZmQ+PiBpdHNlbGYgcG9pbnRzIGhlcmUuICBFYWNoCi0JbW9kdWxlIHRoYXQgaW1wbGVtZW50cyBhY2Nlc3MgdG8gYSBkaWZmZXJlbnQgdGFyZ2V0IHVuZGVyIEJGRCwKLQlkZWZpbmVzIG9uZSBvZiB0aGVzZS4KLQotCi0JRklYTUUsIHRoZXNlIG5hbWVzIHNob3VsZCBiZSByYXRpb25hbGlzZWQgd2l0aCB0aGUgbmFtZXMgb2YKLQl0aGUgZW50cnkgcG9pbnRzIHdoaWNoIGNhbGwgdGhlbS4gVG9vIGJhZCB3ZSBjYW4ndCBoYXZlIG9uZQotCW1hY3JvIHRvIGRlZmluZSB0aGVtIGJvdGghIAotCi0uZW51bSBiZmRfZmxhdm91ciB7Ci0uICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9vYXN5c19mbGF2b3VyLAotLiAgYmZkX3RhcmdldF90ZWtoZXhfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9paGV4X2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9vczlrX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X3ZlcnNhZG9zX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X21zZG9zX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X292YXhfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfZXZheF9mbGF2b3VyCi0ufTsKLS4KLS5lbnVtIGJmZF9lbmRpYW4geyBCRkRfRU5ESUFOX0JJRywgQkZEX0VORElBTl9MSVRUTEUsIEJGRF9FTkRJQU5fVU5LTk9XTiB9OwotLgotLnsqIEZvcndhcmQgZGVjbGFyYXRpb24uICAqfQotLnR5cGVkZWYgc3RydWN0IGJmZF9saW5rX2luZm8gX2JmZF9saW5rX2luZm87Ci0uCi0udHlwZWRlZiBzdHJ1Y3QgYmZkX3RhcmdldAotLnsKLQotSWRlbnRpZmllcyB0aGUga2luZCBvZiB0YXJnZXQsIGUuZy4sIFN1bk9TNCwgVWx0cml4LCBldGMuCi0KLS4gIGNoYXIgKm5hbWU7Ci0KLVRoZSAiZmxhdm91ciIgb2YgYSBiYWNrIGVuZCBpcyBhIGdlbmVyYWwgaW5kaWNhdGlvbiBhYm91dCB0aGUgY29udGVudHMKLW9mIGEgZmlsZS4KLQotLiAgZW51bSBiZmRfZmxhdm91ciBmbGF2b3VyOwotCi1UaGUgb3JkZXIgb2YgYnl0ZXMgd2l0aGluIHRoZSBkYXRhIGFyZWEgb2YgYSBmaWxlLgotCi0uICBlbnVtIGJmZF9lbmRpYW4gYnl0ZW9yZGVyOwotCi1UaGUgb3JkZXIgb2YgYnl0ZXMgd2l0aGluIHRoZSBoZWFkZXIgcGFydHMgb2YgYSBmaWxlLgotCi0uICBlbnVtIGJmZF9lbmRpYW4gaGVhZGVyX2J5dGVvcmRlcjsKLQotQSBtYXNrIG9mIGFsbCB0aGUgZmxhZ3Mgd2hpY2ggYW4gZXhlY3V0YWJsZSBtYXkgaGF2ZSBzZXQgLQotZnJvbSB0aGUgc2V0IDw8QkZEX05PX0ZMQUdTPj4sIDw8SEFTX1JFTE9DPj4sIC4uLjw8RF9QQUdFRD4+LgotCi0uICBmbGFnd29yZCBvYmplY3RfZmxhZ3M7ICAgICAgIAotCi1BIG1hc2sgb2YgYWxsIHRoZSBmbGFncyB3aGljaCBhIHNlY3Rpb24gbWF5IGhhdmUgc2V0IC0gZnJvbQotdGhlIHNldCA8PFNFQ19OT19GTEFHUz4+LCA8PFNFQ19BTExPQz4+LCAuLi48PFNFVF9ORVZFUl9MT0FEPj4uCi0KLS4gIGZsYWd3b3JkIHNlY3Rpb25fZmxhZ3M7Ci0KLVRoZSBjaGFyYWN0ZXIgbm9ybWFsbHkgZm91bmQgYXQgdGhlIGZyb250IG9mIGEgc3ltYm9sIAotKGlmIGFueSksIHBlcmhhcHMgYF8nLgotCi0uICBjaGFyIHN5bWJvbF9sZWFkaW5nX2NoYXI7Ci0KLVRoZSBwYWQgY2hhcmFjdGVyIGZvciBmaWxlIG5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlci4KLQotLiAgY2hhciBhcl9wYWRfY2hhcjsgICAgICAgICAgICAKLQotVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIuCi0KLS4gIHVuc2lnbmVkIHNob3J0IGFyX21heF9uYW1lbGVuOwotCi1FbnRyaWVzIGZvciBieXRlIHN3YXBwaW5nIGZvciBkYXRhLiBUaGVzZSBhcmUgZGlmZmVyZW50IGZyb20gdGhlIG90aGVyCi1lbnRyeSBwb2ludHMsIHNpbmNlIHRoZXkgZG9uJ3QgdGFrZSBhIEJGRCBhc3RoZSBmaXJzdCBhcmd1bWVudC4KLUNlcnRhaW4gb3RoZXIgaGFuZGxlcnMgY291bGQgZG8gdGhlIHNhbWUuCi0KLS4gIGJmZF92bWEgICAgICAoKmJmZF9nZXR4NjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIGJmZF9zaWduZWRfdm1hICgqYmZkX2dldHhfc2lnbmVkXzY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICB2b2lkICAgICAgICAgKCpiZmRfcHV0eDY0KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfdm1hICAgICAgKCpiZmRfZ2V0eDMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9nZXR4X3NpZ25lZF8zMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgdm9pZCAgICAgICAgICgqYmZkX3B1dHgzMikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotLiAgYmZkX3ZtYSAgICAgICgqYmZkX2dldHgxNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgYmZkX3NpZ25lZF92bWEgKCpiZmRfZ2V0eF9zaWduZWRfMTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIHZvaWQgICAgICAgICAoKmJmZF9wdXR4MTYpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLQotQnl0ZSBzd2FwcGluZyBmb3IgdGhlIGhlYWRlcnMKLQotLiAgYmZkX3ZtYSAgICAgICgqYmZkX2hfZ2V0eDY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9oX2dldHhfc2lnbmVkXzY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICB2b2lkICAgICAgICAgKCpiZmRfaF9wdXR4NjQpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLS4gIGJmZF92bWEgICAgICAoKmJmZF9oX2dldHgzMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgYmZkX3NpZ25lZF92bWEgKCpiZmRfaF9nZXR4X3NpZ25lZF8zMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgdm9pZCAgICAgICAgICgqYmZkX2hfcHV0eDMyKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfdm1hICAgICAgKCpiZmRfaF9nZXR4MTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIGJmZF9zaWduZWRfdm1hICgqYmZkX2hfZ2V0eF9zaWduZWRfMTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIHZvaWQgICAgICAgICAoKmJmZF9oX3B1dHgxNikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotCi1Gb3JtYXQgZGVwZW5kZW50IHJvdXRpbmVzOiB0aGVzZSBhcmUgdmVjdG9ycyBvZiBlbnRyeSBwb2ludHMKLXdpdGhpbiB0aGUgdGFyZ2V0IHZlY3RvciBzdHJ1Y3R1cmUsIG9uZSBmb3IgZWFjaCBmb3JtYXQgdG8gY2hlY2suCi0KLUNoZWNrIHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHJlYWQuICBSZXR1cm4gYSA8PGJmZF90YXJnZXQgKj4+IG9yIHplcm8uIAotCi0uICBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqKCpfYmZkX2NoZWNrX2Zvcm1hdFtiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOwotCi1TZXQgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgd3JpdHRlbi4gIAotCi0uICBib29sZWFuICAgICAgICAgICAgICgqX2JmZF9zZXRfZm9ybWF0W2JmZF90eXBlX2VuZF0pIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLVdyaXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBpbnRvIGEgZmlsZSBiZWluZyB3cml0dGVuLCBhdCA8PGJmZF9jbG9zZT4+LiAKLQotLiAgYm9vbGVhbiAgICAgICAgICAgICAoKl9iZmRfd3JpdGVfY29udGVudHNbYmZkX3R5cGVfZW5kXSkgUEFSQU1TICgoYmZkICopKTsKLQotVGhlIGdlbmVyYWwgdGFyZ2V0IHZlY3Rvci4KLQotLgotLiAgeyogR2VuZXJpYyBlbnRyeSBwb2ludHMuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyhOQU1FKVwKLS5DQVQoTkFNRSxfY2xvc2VfYW5kX2NsZWFudXApLFwKLS5DQVQoTkFNRSxfYmZkX2ZyZWVfY2FjaGVkX2luZm8pLFwKLS5DQVQoTkFNRSxfbmV3X3NlY3Rpb25faG9vayksXAotLkNBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50cyksXAotLkNBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpCi0uCi0uICB7KiBDYWxsZWQgd2hlbiB0aGUgQkZEIGlzIGJlaW5nIGNsb3NlZCB0byBkbyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAuICAqfQotLiAgYm9vbGVhbiAgICAgICAoKl9jbG9zZV9hbmRfY2xlYW51cCkgUEFSQU1TICgoYmZkICopKTsKLS4gIHsqIEFzayB0aGUgQkZEIHRvIGZyZWUgYWxsIGNhY2hlZCBpbmZvcm1hdGlvbi4gICp9Ci0uICBib29sZWFuICgqX2JmZF9mcmVlX2NhY2hlZF9pbmZvKSBQQVJBTVMgKChiZmQgKikpOwotLiAgeyogQ2FsbGVkIHdoZW4gYSBuZXcgc2VjdGlvbiBpcyBjcmVhdGVkLiAgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfbmV3X3NlY3Rpb25faG9vaykgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLS4gIHsqIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gICp9Ci0uICBib29sZWFuICAgICAgICgqX2JmZF9nZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwgCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotLiAgYm9vbGVhbiAgICAgICAoKl9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KQotLiAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIGJmZF93aW5kb3cgKiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0uCi0uICB7KiBFbnRyeSBwb2ludHMgdG8gY29weSBwcml2YXRlIGRhdGEuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09QWShOQU1FKVwKLS5DQVQoTkFNRSxfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSksXAotLkNBVChOQU1FLF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSksXAotLkNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSksXAotLkNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKSxcCi0uQ0FUKE5BTUUsX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyksXAotLkNBVChOQU1FLF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSlcCi0uICB7KiBDYWxsZWQgdG8gY29weSBCRkQgZ2VuZXJhbCBwcml2YXRlIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLS4gICAgIHRvIGFub3RoZXIuICAqfQotLiAgYm9vbGVhbgkgKCpfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0uICB7KiBDYWxsZWQgdG8gbWVyZ2UgQkZEIGdlbmVyYWwgcHJpdmF0ZSBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0uICAgICB0byBhIGNvbW1vbiBvdXRwdXQgZmlsZSB3aGVuIGxpbmtpbmcuICAqfQotLiAgYm9vbGVhbgkgKCpfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotLiAgeyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc2VjdGlvbiBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0uICAgICB0byBhbm90aGVyLiAgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKiwgc2VjX3B0cikpOwotLiAgeyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc3ltYm9sIGRhdGEgZnJvbSBvbmUgc3ltYm9sIAotLiAgICAgdG8gYW5vdGhlci4gICp9Ci0uICBib29sZWFuICAgICAgICgqX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0uCQkJCQkJCSAgIGJmZCAqLCBhc3ltYm9sICopKTsKLS4gIHsqIENhbGxlZCB0byBzZXQgcHJpdmF0ZSBiYWNrZW5kIGZsYWdzICp9Ci0uICBib29sZWFuCSAoKl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotLgotLiAgeyogQ2FsbGVkIHRvIHByaW50IHByaXZhdGUgQkZEIGRhdGEgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLS4KLS4gIHsqIENvcmUgZmlsZSBlbnRyeSBwb2ludHMuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09SRShOQU1FKVwKLS5DQVQoTkFNRSxfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCksXAotLkNBVChOQU1FLF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpLFwKLS5DQVQoTkFNRSxfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKQotLiAgY2hhciAqICAgKCpfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCkgUEFSQU1TICgoYmZkICopKTsKLS4gIGludCAgICAgICgqX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkgUEFSQU1TICgoYmZkICopKTsKLS4gIGJvb2xlYW4gICgqX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0uCi0uICB7KiBBcmNoaXZlIGVudHJ5IHBvaW50cy4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFKE5BTUUpXAotLkNBVChOQU1FLF9zbHVycF9hcm1hcCksXAotLkNBVChOQU1FLF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKSxcCi0uQ0FUKE5BTUUsX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKSxcCi0uQ0FUKE5BTUUsX3RydW5jYXRlX2FybmFtZSksXAotLkNBVChOQU1FLF93cml0ZV9hcm1hcCksXAotLkNBVChOQU1FLF9yZWFkX2FyX2hkciksXAotLkNBVChOQU1FLF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpLFwKLS5DQVQoTkFNRSxfZ2V0X2VsdF9hdF9pbmRleCksXAotLkNBVChOQU1FLF9nZW5lcmljX3N0YXRfYXJjaF9lbHQpLFwKLS5DQVQoTkFNRSxfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCkKLS4gIGJvb2xlYW4gICgqX2JmZF9zbHVycF9hcm1hcCkgUEFSQU1TICgoYmZkICopKTsKLS4gIGJvb2xlYW4gICgqX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKSBQQVJBTVMgKChiZmQgKikpOwotLiAgYm9vbGVhbiAgKCpfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKQotLiAgICAgICAgICAgICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7Ci0uICB2b2lkICAgICAoKl9iZmRfdHJ1bmNhdGVfYXJuYW1lKSBQQVJBTVMgKChiZmQgKiwgQ09OU1QgY2hhciAqLCBjaGFyICopKTsKLS4gIGJvb2xlYW4gICgqd3JpdGVfYXJtYXApIFBBUkFNUyAoKGJmZCAqYXJjaCwgCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGVsZW5ndGgsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9ybCAqbWFwLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQsIAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZHgpKTsKLS4gIFBUUiAoKl9iZmRfcmVhZF9hcl9oZHJfZm4pIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICBiZmQgKiAgICAoKm9wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSkgUEFSQU1TICgoYmZkICphcmNoLCBiZmQgKnByZXYpKTsKLS4jZGVmaW5lIGJmZF9nZXRfZWx0X2F0X2luZGV4KGIsaSkgQkZEX1NFTkQoYiwgX2JmZF9nZXRfZWx0X2F0X2luZGV4LCAoYixpKSkKLS4gIGJmZCAqICAgICgqX2JmZF9nZXRfZWx0X2F0X2luZGV4KSBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKTsKLS4gIGludCAgICAgICgqX2JmZF9zdGF0X2FyY2hfZWx0KSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOwotLiAgYm9vbGVhbiAgKCpfYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApIFBBUkFNUyAoKGJmZCAqKSk7Ci0uCi0uICB7KiBFbnRyeSBwb2ludHMgdXNlZCBmb3Igc3ltYm9scy4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTKE5BTUUpXAotLkNBVChOQU1FLF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSxcCi0uQ0FUKE5BTUUsX2dldF9zeW10YWIpLFwKLS5DQVQoTkFNRSxfbWFrZV9lbXB0eV9zeW1ib2wpLFwKLS5DQVQoTkFNRSxfcHJpbnRfc3ltYm9sKSxcCi0uQ0FUKE5BTUUsX2dldF9zeW1ib2xfaW5mbyksXAotLkNBVChOQU1FLF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSksXAotLkNBVChOQU1FLF9nZXRfbGluZW5vKSxcCi0uQ0FUKE5BTUUsX2ZpbmRfbmVhcmVzdF9saW5lKSxcCi0uQ0FUKE5BTUUsX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCksXAotLkNBVChOQU1FLF9yZWFkX21pbmlzeW1ib2xzKSxcCi0uQ0FUKE5BTUUsX21pbmlzeW1ib2xfdG9fc3ltYm9sKQotLiAgbG9uZyAgKCpfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX3N5bXRhYikgUEFSQU1TICgoYmZkICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotLiAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAgKgotLiAgICAgICAgICAgICAgICAoKl9iZmRfbWFrZV9lbXB0eV9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICB2b2lkICAgICAgICAgICgqX2JmZF9wcmludF9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLS4jZGVmaW5lIGJmZF9wcmludF9zeW1ib2woYixwLHMsZSkgQkZEX1NFTkQoYiwgX2JmZF9wcmludF9zeW1ib2wsIChiLHAscyxlKSkKLS4gIHZvaWQgICAgICAgICAgKCpfYmZkX2dldF9zeW1ib2xfaW5mbykgUEFSQU1TICgoYmZkICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xfaW5mbyAqKSk7Ci0uI2RlZmluZSBiZmRfZ2V0X3N5bWJvbF9pbmZvKGIscCxlKSBCRkRfU0VORChiLCBfYmZkX2dldF9zeW1ib2xfaW5mbywgKGIscCxlKSkKLS4gIGJvb2xlYW4JICgqX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0uCi0uICBhbGVudCAqICAgICgqX2dldF9saW5lbm8pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICopKTsKLS4gIGJvb2xlYW4gICAgKCpfYmZkX2ZpbmRfbmVhcmVzdF9saW5lKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0uICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VjICpzZWN0aW9uLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9scywKLS4gICAgICAgICAgICAgICAgICAgIGJmZF92bWEgb2Zmc2V0LCBDT05TVCBjaGFyICoqZmlsZSwgQ09OU1QgY2hhciAqKmZ1bmMsCi0uICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmxpbmUpKTsKLS4geyogQmFjay1kb29yIHRvIGFsbG93IGZvcm1hdC1hd2FyZSBhcHBsaWNhdGlvbnMgdG8gY3JlYXRlIGRlYnVnIHN5bWJvbHMKLS4gICAgd2hpbGUgdXNpbmcgQkZEIGZvciBldmVyeXRoaW5nIGVsc2UuICBDdXJyZW50bHkgdXNlZCBieSB0aGUgYXNzZW1ibGVyCi0uICAgIHdoZW4gY3JlYXRpbmcgQ09GRiBmaWxlcy4gICp9Ci0uICBhc3ltYm9sICogICgqX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCkgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqYWJmZCwKLS4gICAgICAgdm9pZCAqcHRyLAotLiAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpKTsKLS4jZGVmaW5lIGJmZF9yZWFkX21pbmlzeW1ib2xzKGIsIGQsIG0sIHMpIFwKLS4gIEJGRF9TRU5EIChiLCBfcmVhZF9taW5pc3ltYm9scywgKGIsIGQsIG0sIHMpKQotLiAgbG9uZyAgKCpfcmVhZF9taW5pc3ltYm9scykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICopKTsKLS4jZGVmaW5lIGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbChiLCBkLCBtLCBmKSBcCi0uICBCRkRfU0VORCAoYiwgX21pbmlzeW1ib2xfdG9fc3ltYm9sLCAoYiwgZCwgbSwgZikpCi0uICBhc3ltYm9sICooKl9taW5pc3ltYm9sX3RvX3N5bWJvbCkgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3ltYm9sICopKTsKLS4KLS4gIHsqIFJvdXRpbmVzIGZvciByZWxvY3MuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfUkVMT0NTKE5BTUUpXAotLkNBVChOQU1FLF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpLFwKLS5DQVQoTkFNRSxfY2Fub25pY2FsaXplX3JlbG9jKSxcCi0uQ0FUKE5BTUUsX2JmZF9yZWxvY190eXBlX2xvb2t1cCkKLS4gIGxvbmcgICgqX2dldF9yZWxvY191cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLS4gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfcmVsb2MpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBhcmVsZW50ICoqLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotLiAgeyogU2VlIGRvY3VtZW50YXRpb24gb24gcmVsb2MgdHlwZXMuICAqfQotLiAgcmVsb2NfaG93dG9fdHlwZSAqCi0uICAgICAgICgqcmVsb2NfdHlwZV9sb29rdXApIFBBUkFNUyAoKGJmZCAqYWJmZCwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLS4KLS4gIHsqIFJvdXRpbmVzIHVzZWQgd2hlbiB3cml0aW5nIGFuIG9iamVjdCBmaWxlLiAgKn0KLS4jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX1dSSVRFKE5BTUUpXAotLkNBVChOQU1FLF9zZXRfYXJjaF9tYWNoKSxcCi0uQ0FUKE5BTUUsX3NldF9zZWN0aW9uX2NvbnRlbnRzKQotLiAgYm9vbGVhbiAgICAoKl9iZmRfc2V0X2FyY2hfbWFjaCkgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKLS4gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcpKTsKLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLS4KLS4gIHsqIFJvdXRpbmVzIHVzZWQgYnkgdGhlIGxpbmtlci4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9MSU5LKE5BTUUpXAotLkNBVChOQU1FLF9zaXplb2ZfaGVhZGVycyksXAotLkNBVChOQU1FLF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSxcCi0uQ0FUKE5BTUUsX2JmZF9yZWxheF9zZWN0aW9uKSxcCi0uQ0FUKE5BTUUsX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKSxcCi0uQ0FUKE5BTUUsX2JmZF9saW5rX2FkZF9zeW1ib2xzKSxcCi0uQ0FUKE5BTUUsX2JmZF9maW5hbF9saW5rKSxcCi0uQ0FUKE5BTUUsX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pLFwKLS5DQVQoTkFNRSxfYmZkX2djX3NlY3Rpb25zKQotLiAgaW50ICAgICAgICAoKl9iZmRfc2l6ZW9mX2hlYWRlcnMpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci0uICBiZmRfYnl0ZSAqICgqX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqLAotLiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0uICAgICAgICAgICAgICAgICAgICBiZmRfYnl0ZSAqZGF0YSwgYm9vbGVhbiByZWxvY2F0ZWFibGUsCi0uICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0uCi0uICBib29sZWFuICAgICgqX2JmZF9yZWxheF9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqLAotLiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqYWdhaW4pKTsKLS4KLS4gIHsqIENyZWF0ZSBhIGhhc2ggdGFibGUgZm9yIHRoZSBsaW5rZXIuICBEaWZmZXJlbnQgYmFja2VuZHMgc3RvcmUKLS4gICAgIGRpZmZlcmVudCBpbmZvcm1hdGlvbiBpbiB0aGlzIHRhYmxlLiAgKn0KLS4gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICooKl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkgUEFSQU1TICgoYmZkICopKTsKLS4KLS4gIHsqIEFkZCBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QgZmlsZSBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKn0KLS4gIGJvb2xlYW4gKCpfYmZkX2xpbmtfYWRkX3N5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0uCi0uICB7KiBEbyBhIGxpbmsgYmFzZWQgb24gdGhlIGxpbmtfb3JkZXIgc3RydWN0dXJlcyBhdHRhY2hlZCB0byBlYWNoCi0uICAgICBzZWN0aW9uIG9mIHRoZSBCRkQuICAqfQotLiAgYm9vbGVhbiAoKl9iZmRfZmluYWxfbGluaykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLS4KLS4gIHsqIFNob3VsZCB0aGlzIHNlY3Rpb24gYmUgc3BsaXQgdXAgaW50byBzbWFsbGVyIHBpZWNlcyBkdXJpbmcgbGlua2luZy4gICp9Ci0uICBib29sZWFuICgqX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKTsKLS4KLS4gIHsqIFJlbW92ZSBzZWN0aW9ucyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBmcm9tIHRoZSBvdXRwdXQuICAqfQotLiAgYm9vbGVhbiAoKl9iZmRfZ2Nfc2VjdGlvbnMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0uCi0uICB7KiBSb3V0aW5lcyB0byBoYW5kbGUgZHluYW1pYyBzeW1ib2xzIGFuZCByZWxvY3MuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyhOQU1FKVwKLS5DQVQoTkFNRSxfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSxcCi0uQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiksXAotLkNBVChOQU1FLF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCksXAotLkNBVChOQU1FLF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYykKLS4gIHsqIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbHMuICp9Ci0uICBsb25nICAoKl9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotLiAgeyogUmVhZCBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKn0KLS4gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpCi0uICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0uICB7KiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyByZWxvY3MuICAqfQotLiAgbG9uZyAgKCpfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotLiAgeyogUmVhZCBpbiB0aGUgZHluYW1pYyByZWxvY3MuICAqfQotLiAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKQotLiAgICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotLgotCi1EYXRhIGZvciB1c2UgYnkgYmFjay1lbmQgcm91dGluZXMsIHdoaWNoIGlzbid0IGdlbmVyaWMgZW5vdWdoIHRvIGJlbG9uZwotaW4gdGhpcyBzdHJ1Y3R1cmUuCi0KLS4gUFRSIGJhY2tlbmRfZGF0YTsKLS59IGJmZF90YXJnZXQ7Ci0KLSovCi0KLS8qIEFsbCBrbm93biB4dmVjcyAoZXZlbiB0aG9zZSB0aGF0IGRvbid0IGNvbXBpbGUgb24gYWxsIHN5c3RlbXMpLgotICAgQWxwaGFiZXRpemVkIGZvciBlYXN5IHJlZmVyZW5jZS4KLSAgIFRoZXkgYXJlIGxpc3RlZCBhIHNlY29uZCB0aW1lIGJlbG93LCBzaW5jZQotICAgd2UgY2FuJ3QgaW50ZXJtaXggZXh0ZXJuJ3MgYW5kIGluaXRpYWxpemVycy4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhMjlrY29mZl9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYV9vdXRfYWRvYmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dF9hcm1fYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFvdXRfYXJtX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhb3V0X21pcHNfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFvdXRfbWlwc19saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dDBfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFwb2xsb2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtY29mZl9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtY29mZl9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtcGVfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybXBlX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1wZWlfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybXBlaV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybV9lcG9jX3BlX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1fZXBvY19wZWlfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybV9lcG9jX3BlaV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYl9vdXRfdmVjX2JpZ19ob3N0OwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYl9vdXRfdmVjX2xpdHRsZV9ob3N0OwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2FscGhhX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9iaWdhcmNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2JpZ2FybV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZWFyY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2JpZ21pcHNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2JpZ21pcHNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2QxMHZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2QzMHZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2hwcGFfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2kzODZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2k4NjBfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tMzJyX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tNjhrX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tODhrX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tbjEwMjAwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tbjEwMzAwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9wb3dlcnBjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX3NoX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9zaGxfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX3NwYXJjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl92ODUwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9mcjMwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tY29yZV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9zcGFyY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBkZW1vXzY0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBlY29mZl9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZWNvZmZfYmlnbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGg4MzAwY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBoODUwMGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaG9zdF9hb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhwMzAwYnNkX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhwMzAwaHB1eF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzb21fdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmFvdXRfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2ZHluaXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmZyZWVic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4Nm9zOWtfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNfcGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNsZV9wZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfcG93ZXJwY19wZWlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNsZV9wZWlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NnBlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZwZWlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZ28zMmNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZ28zMnN0dWJiZWRjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZsaW51eF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bHlueF9hb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZseW54X2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4Nm1hY2gzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZtc2Rvc192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bmV0YnNkX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGk4NjBjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGljb2ZmX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpY29mZl9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaWVlZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrYXV4X2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2NvZmZ1bl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrbGludXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2x5bnhfYW91dF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrbHlueF9jb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGtuZXRic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a3N5c3Zjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGs0a25ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtODhrYmNzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG04OGttYWNoM192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtY29yZV9wZV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbWNvcmVfcGVfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG1jb3JlX3BlaV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbWNvcmVfcGVpX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBuZXdzb3MzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG5sbTMyX2kzODZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfc3BhcmNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfYWxwaGFfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfcG93ZXJwY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBwYzUzMm5ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBvYXN5c192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBwYzUzMm1hY2hhb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHBwY2Jvb3RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgcmlzY2l4X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHBtYWNfeGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgcnM2MDAwY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGNvZmZfc21hbGxfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl9zbWFsbF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2xlX2FvdXRfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNsaW51eF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2x5bnhfYW91dF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2x5bnhfY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY25ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3Vub3NfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRla2hleF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB0aWMzMF9hb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRpYzMwX2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdGljODBjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHZheG5ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB2ZXJzYWRvc192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB2bXNfYWxwaGFfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdm1zX3ZheF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB3ZTMya2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdzY1X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHo4a2NvZmZfdmVjOwotCi0vKiBzcmVjIGlzIGFsd2F5cyBpbmNsdWRlZC4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcmVjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHN5bWJvbHNyZWNfdmVjOwotCi0vKiBiaW5hcnkgaXMgYWx3YXlzIGluY2x1ZGVkLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJpbmFyeV92ZWM7Ci0KLS8qIGloZXggaXMgYWx3YXlzIGluY2x1ZGVkLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGloZXhfdmVjOwotCi0vKiBBbGwgb2YgdGhlIHh2ZWNzIGZvciBjb3JlIGZpbGVzLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFpeDM4Nl9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGNpc2NvX2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaHB1eF9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhwcGFic2RfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpcml4X2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmV0YnNkX2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgb3NmX2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2NvNV9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRyYWRfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBwdHJhY2VfY29yZV92ZWM7Ci0KLWNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCBiZmRfdGFyZ2V0X3ZlY3RvcltdID0gewotCi0jaWZkZWYgU0VMRUNUX1ZFQ1MKLQotCVNFTEVDVF9WRUNTLAotCi0jZWxzZSAvKiBub3QgU0VMRUNUX1ZFQ1MgKi8KLQotI2lmZGVmIERFRkFVTFRfVkVDVE9SCi0JJkRFRkFVTFRfVkVDVE9SLAotI2VuZGlmCi0JLyogVGhpcyBsaXN0IGlzIGFscGhhYmV0aXplZCB0byBtYWtlIGl0IGVhc3kgdG8gY29tcGFyZQotCSAgIHdpdGggb3RoZXIgdmVjdG9yIGxpc3RzIC0tIHRoZSBkZWNscyBhYm92ZSBhbmQKLQkgICB0aGUgY2FzZSBzdGF0ZW1lbnQgaW4gY29uZmlndXJlLmluLgotCSAgIFZlY3RvcnMgdGhhdCBkb24ndCBjb21waWxlIG9uIGFsbCBzeXN0ZW1zLCBvciBhcmVuJ3QgZmluaXNoZWQsCi0JICAgc2hvdWxkIGhhdmUgYW4gZW50cnkgaGVyZSB3aXRoICNpZiAwIGFyb3VuZCBpdCwgdG8gc2hvdyB0aGF0Ci0JICAgaXQgd2Fzbid0IG9taXR0ZWQgYnkgbWlzdGFrZS4gICovCi0JJmEyOWtjb2ZmX2JpZ192ZWMsCi0JJmFfb3V0X2Fkb2JlX3ZlYywKLSNpZiAwCQkJCS8qIE5vIG9uZSBzZWVtcyB0byB1c2UgdGhpcy4gICovCi0JJmFvdXRfbWlwc19iaWdfdmVjLAotI2VuZGlmCi0JJmFvdXRfbWlwc19saXR0bGVfdmVjLAotCSZiX291dF92ZWNfYmlnX2hvc3QsCi0JJmJfb3V0X3ZlY19saXR0bGVfaG9zdCwKLQotCS8qIFRoaXMsIGFuZCBvdGhlciB2ZWN0b3JzLCBtYXkgbm90IGJlIHVzZWQgaW4gYW55ICoubXQgY29uZmlndXJhdGlvbi4KLQkgICBCdXQgdGhhdCBkb2VzIG5vdCBtZWFuIHRoZXkgYXJlIHVubmVjZXNzYXJ5LiAgSWYgY29uZmlndXJlZCB3aXRoCi0JICAgLS1lbmFibGUtdGFyZ2V0cz1hbGwsIG9iamR1bXAgb3IgZ2RiIHNob3VsZCBiZSBhYmxlIHRvIGV4YW1pbmUKLQkgICB0aGUgZmlsZSBldmVuIGlmIHdlIGRvbid0IHJlY29nbml6ZSB0aGUgbWFjaGluZSB0eXBlLiAgKi8KLQkmYmZkX2VsZjMyX2JpZ19nZW5lcmljX3ZlYywKLSNpZmRlZiBCRkQ2NAotCSZiZmRfZWxmNjRfYWxwaGFfdmVjLAotI2VuZGlmCi0JJmJmZF9lbGYzMl9iaWdhcmNfdmVjLAotICAgICAgICAmYmZkX2VsZjMyX2JpZ2FybV92ZWMsCi0gICAgICAgICZiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjLAotCSZiZmRfZWxmMzJfYmlnbWlwc192ZWMsCi0jaWZkZWYgQkZENjQKLQkmYmZkX2VsZjY0X2JpZ21pcHNfdmVjLAotI2VuZGlmCi0JJmJmZF9lbGYzMl9kMTB2X3ZlYywKLQkmYmZkX2VsZjMyX2QzMHZfdmVjLAotCSZiZmRfZWxmMzJfaHBwYV92ZWMsCi0JJmJmZF9lbGYzMl9pMzg2X3ZlYywKLQkmYmZkX2VsZjMyX2k4NjBfdmVjLAotCSZiZmRfZWxmMzJfbGl0dGxlX2dlbmVyaWNfdmVjLAotCSZiZmRfZWxmMzJfbGl0dGxlYXJjX3ZlYywKLSAgICAgICAgJmJmZF9lbGYzMl9saXR0bGVhcm1fdmVjLAotICAgICAgICAmYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYywKLQkmYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjLAotI2lmZGVmIEJGRDY0Ci0JJmJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYywKLSNlbmRpZgotCSZiZmRfZWxmMzJfbTMycl92ZWMsCi0JJmJmZF9lbGYzMl9tbjEwMjAwX3ZlYywKLQkmYmZkX2VsZjMyX21uMTAzMDBfdmVjLAotCSZiZmRfZWxmMzJfbTY4a192ZWMsCi0JJmJmZF9lbGYzMl9tODhrX3ZlYywKLQkmYmZkX2VsZjMyX3NwYXJjX3ZlYywKLQkmYmZkX2VsZjMyX3Bvd2VycGNfdmVjLAotCSZiZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYywKLQkmYmZkX2VsZjMyX3Y4NTBfdmVjLAotCSZiZmRfZWxmMzJfZnIzMF92ZWMsCi0JJmJmZF9lbGYzMl9tY29yZV9iaWdfdmVjLAotCSZiZmRfZWxmMzJfbWNvcmVfbGl0dGxlX3ZlYywKLSNpZmRlZiBCRkQ2NAkJCS8qIE5vIG9uZSBzZWVtcyB0byB1c2UgdGhpcy4gICovCi0JJmJmZF9lbGY2NF9iaWdfZ2VuZXJpY192ZWMsCi0JJmJmZF9lbGY2NF9saXR0bGVfZ2VuZXJpY192ZWMsCi0jZW5kaWYKLSNpZiAwCi0JJmJmZF9lbGY2NF9zcGFyY192ZWMsCi0jZW5kaWYKLQkvKiBXZSBkb24ndCBpbmNsdWRlIGNpc2NvX2NvcmVfdmVjLiAgQWx0aG91Z2ggaXQgaGFzIGEgbWFnaWMgbnVtYmVyLAotCSAgIHRoZSBtYWdpYyBudW1iZXIgaXNuJ3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSwgYW5kIHRodXMKLQkgICBtaWdodCBzcHVyaW91c2x5IG1hdGNoIG90aGVyIGtpbmRzIG9mIGZpbGVzLiAgKi8KLSNpZmRlZiBCRkQ2NAotCSZkZW1vXzY0X3ZlYywJLyogT25seSBjb21waWxlZCBpZiBob3N0IGhhcyBsb25nLWxvbmcgc3VwcG9ydCAqLwotI2VuZGlmCi0JJmVjb2ZmX2JpZ192ZWMsCi0JJmVjb2ZmX2xpdHRsZV92ZWMsCi0JJmVjb2ZmX2JpZ2xpdHRsZV92ZWMsCi0jaWZkZWYgQkZENjQKLQkmZWNvZmZhbHBoYV9saXR0bGVfdmVjLAotI2VuZGlmCi0JJmg4MzAwY29mZl92ZWMsCi0JJmg4NTAwY29mZl92ZWMsCi0jaWYgMAotCS8qIFNpbmNlIGEub3V0IGZpbGVzIGxhY2sgZGVjZW50IG1hZ2ljIG51bWJlcnMsIG5vIHdheSB0byByZWNvZ25pemUKLQkgICB3aGljaCBraW5kIG9mIGEub3V0IGZpbGUgaXQgaXMuICAqLwotCSZob3N0X2FvdXRfdmVjLAotI2VuZGlmCi0jaWYgMAkJCQkvKiBDbGFzaGVzIHdpdGggc3Vub3NfYmlnX3ZlYyBtYWdpYyBuby4gICovCi0JJmhwMzAwYnNkX3ZlYywKLSNlbmRpZgotCSZocDMwMGhwdXhfdmVjLAotI2lmIGRlZmluZWQgKEhPU1RfSFBQQUhQVVgpIHx8IGRlZmluZWQgKEhPU1RfSFBQQUJTRCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBT1NGKQotICAgICAgICAmc29tX3ZlYywKLSNlbmRpZgotCSZpMzg2YW91dF92ZWMsCi0JJmkzODZic2RfdmVjLAotCSZpMzg2Y29mZl92ZWMsCi0JJmkzODZmcmVlYnNkX3ZlYywKLQkmaTg2MGNvZmZfdmVjLAotCSZiZmRfcG93ZXJwY19wZV92ZWMsCi0JJmJmZF9wb3dlcnBjbGVfcGVfdmVjLAotCSZiZmRfcG93ZXJwY19wZWlfdmVjLAotCSZiZmRfcG93ZXJwY2xlX3BlaV92ZWMsCi0JJmdvMzJjb2ZmX3ZlYywKLQkmZ28zMnN0dWJiZWRjb2ZmX3ZlYywKLSNpZiAwCi0JLyogU2luY2UgYS5vdXQgZmlsZXMgbGFjayBkZWNlbnQgbWFnaWMgbnVtYmVycywgbm8gd2F5IHRvIHJlY29nbml6ZQotCSAgIHdoaWNoIGtpbmQgb2YgYS5vdXQgZmlsZSBpdCBpcy4gICovCi0JJmkzODZsaW51eF92ZWMsCi0jZW5kaWYKLQkmaTM4Nmx5bnhfYW91dF92ZWMsCi0JJmkzODZseW54X2NvZmZfdmVjLAotI2lmIDAKLQkvKiBObyBkaXN0aW5ndWlzaGluZyBmZWF0dXJlcyBmb3IgTWFjaCAzIGV4ZWN1dGFibGVzLiAgKi8KLQkmaTM4Nm1hY2gzX3ZlYywKLSNlbmRpZgotCSZpMzg2bXNkb3NfdmVjLAotCSZpMzg2bmV0YnNkX3ZlYywKLQkmaTM4Nm9zOWtfdmVjLAotCSZpMzg2cGVfdmVjLAotCSZpMzg2cGVpX3ZlYywKLQkmYXJtY29mZl9saXR0bGVfdmVjLAotCSZhcm1jb2ZmX2JpZ192ZWMsCi0JJmFybXBlX2xpdHRsZV92ZWMsCi0JJmFybXBlX2JpZ192ZWMsCi0JJmFybXBlaV9saXR0bGVfdmVjLAotCSZhcm1wZWlfYmlnX3ZlYywKLQkmYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYywKLQkmYXJtX2Vwb2NfcGVfYmlnX3ZlYywKLQkmYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMsCi0JJmFybV9lcG9jX3BlaV9iaWdfdmVjLAotCSZpY29mZl9iaWdfdmVjLAotCSZpY29mZl9saXR0bGVfdmVjLAotCSZpZWVlX3ZlYywKLQkmbTY4a2NvZmZfdmVjLAotCSZtNjhrY29mZnVuX3ZlYywKLSNpZiAwCi0JLyogU2luY2UgYS5vdXQgZmlsZXMgbGFjayBkZWNlbnQgbWFnaWMgbnVtYmVycywgbm8gd2F5IHRvIHJlY29nbml6ZQotCSAgIHdoaWNoIGtpbmQgb2YgYS5vdXQgZmlsZSBpdCBpcy4gICovCi0JJm02OGtsaW51eF92ZWMsCi0jZW5kaWYKLQkmbTY4a2x5bnhfYW91dF92ZWMsCi0JJm02OGtseW54X2NvZmZfdmVjLAotCSZtNjhrbmV0YnNkX3ZlYywKLQkmbTY4a3N5c3Zjb2ZmX3ZlYywKLQkmbTg4a2Jjc192ZWMsCi0JJm04OGttYWNoM192ZWMsCi0JJm1jb3JlX3BlX2JpZ192ZWMsCi0JJm1jb3JlX3BlX2xpdHRsZV92ZWMsCi0JJm1jb3JlX3BlaV9iaWdfdmVjLAotCSZtY29yZV9wZWlfbGl0dGxlX3ZlYywKLQkmbmV3c29zM192ZWMsCi0JJm5sbTMyX2kzODZfdmVjLAotCSZubG0zMl9zcGFyY192ZWMsCi0jaWZkZWYgQkZENjQKLQkmbmxtMzJfYWxwaGFfdmVjLAotI2VuZGlmCi0JJnBjNTMybmV0YnNkX3ZlYywKLSNpZiAwCi0JLyogV2UgaGF2ZSBubyBvYXN5cyB0b29scyBhbnltb3JlLCBzbyB3ZSBjYW4ndCB0ZXN0IGFueSBvZiB0aGlzCi0JICAgYW55bW9yZS4gSWYgeW91IHdhbnQgdG8gdGVzdCB0aGUgc3R1ZmYgeW91cnNlbGYsIGdvIGFoZWFkLi4uCi0JICAgc3RldmVAY3lnbnVzLmNvbQotCSAgIFdvcnNlLCBzaW5jZSB0aGVyZSBpcyBubyBtYWdpYyBudW1iZXIgZm9yIGFyY2hpdmVzLCB0aGVyZQotCSAgIGNhbiBiZSBhbm5veWluZyB0YXJnZXQgbWlzLW1hdGNoZXMuICAqLwotCSZvYXN5c192ZWMsCi0jZW5kaWYKLQkmcGM1MzJtYWNoYW91dF92ZWMsCi0jaWYgMAotCS8qIFdlIGhhdmUgbm8gd2F5IG9mIGRpc3Rpbmd1aXNoaW5nIHRoZXNlIGZyb20gb3RoZXIgYS5vdXQgdmFyaWFudHMgKi8KLQkmYW91dF9hcm1fYmlnX3ZlYywKLQkmYW91dF9hcm1fbGl0dGxlX3ZlYywKLQkmcmlzY2l4X3ZlYywKLSNlbmRpZgotI2lmIDAKLQkvKiBUaGlzIGhhcyB0aGUgc2FtZSBtYWdpYyBudW1iZXIgYXMgUlMvNjAwMC4gKi8KLQkmcG1hY194Y29mZl92ZWMsCi0jZW5kaWYKLQkmcnM2MDAwY29mZl92ZWMsCi0JJnBwY2Jvb3RfdmVjLAotCSZzaGNvZmZfdmVjLAotCSZzaGxjb2ZmX3ZlYywKLQkmc2hjb2ZmX3NtYWxsX3ZlYywKLQkmc2hsY29mZl9zbWFsbF92ZWMsCi0JJnNwYXJjbGVfYW91dF92ZWMsCi0JJnNwYXJjbGludXhfdmVjLAotCSZzcGFyY2x5bnhfYW91dF92ZWMsCi0JJnNwYXJjbHlueF9jb2ZmX3ZlYywKLQkmc3BhcmNuZXRic2RfdmVjLAotCSZzdW5vc19iaWdfdmVjLAotCSZhb3V0MF9iaWdfdmVjLAotCSZ0aWMzMF9hb3V0X3ZlYywKLQkmdGljMzBfY29mZl92ZWMsCi0JJnRpYzgwY29mZl92ZWMsCi0JJnZheG5ldGJzZF92ZWMsCi0JJnZlcnNhZG9zX3ZlYywKLSNpZmRlZiBCRkQ2NAotCSZ2bXNfYWxwaGFfdmVjLAotI2VuZGlmCi0JJnZtc192YXhfdmVjLAotCSZ3ZTMya2NvZmZfdmVjLAotCSZ6OGtjb2ZmX3ZlYywKLQotI2VuZGlmIC8qIG5vdCBTRUxFQ1RfVkVDUyAqLwotCi0vKiBBbHdheXMgc3VwcG9ydCBTLXJlY29yZHMsIGZvciBjb252ZW5pZW5jZS4gICovCi0JJnNyZWNfdmVjLAotCSZzeW1ib2xzcmVjX3ZlYywKLS8qIEFuZCB0ZWtoZXggKi8KLQkmdGVraGV4X3ZlYywKLS8qIExpa2V3aXNlIGZvciBiaW5hcnkgb3V0cHV0LiAgKi8KLQkmYmluYXJ5X3ZlYywKLS8qIExpa2V3aXNlIGZvciBpaGV4LiAgKi8KLQkmaWhleF92ZWMsCi0KLS8qIEFkZCBhbnkgcmVxdWlyZWQgdHJhZGl0aW9uYWwtY29yZS1maWxlLWhhbmRsZXIuICAqLwotCi0jaWZkZWYgQUlYMzg2X0NPUkUKLQkmYWl4Mzg2X2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYgSFBVWF9DT1JFCi0JJmhwdXhfY29yZV92ZWMsCi0jZW5kaWYKLSNpZmRlZiBIUFBBQlNEX0NPUkUKLQkmaHBwYWJzZF9jb3JlX3ZlYywKLSNlbmRpZgotI2lmZGVmIElSSVhfQ09SRQotCSZpcml4X2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYgTkVUQlNEX0NPUkUKLQkmbmV0YnNkX2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYgT1NGX0NPUkUKLQkmb3NmX2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYgU0NPNV9DT1JFCi0JJnNjbzVfY29yZV92ZWMsCi0jZW5kaWYKLSNpZmRlZglUUkFEX0NPUkUKLQkmdHJhZF9jb3JlX3ZlYywKLSNlbmRpZgotCi0jaWZkZWYJUFRSQUNFX0NPUkUKLQkmcHRyYWNlX2NvcmVfdmVjLAotI2VuZGlmCi0KLQlOVUxMIC8qIGVuZCBvZiBsaXN0IG1hcmtlciAqLwotfTsKLQotLyogYmZkX2RlZmF1bHRfdmVjdG9yWzBdIGNvbnRhaW5zIGVpdGhlciB0aGUgYWRkcmVzcyBvZiB0aGUgZGVmYXVsdCB2ZWN0b3IsCi0gICBpZiB0aGVyZSBpcyBvbmUsIG9yIHplcm8gaWYgdGhlcmUgaXNuJ3QuICAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICpiZmRfZGVmYXVsdF92ZWN0b3JbXSA9IHsKLSNpZmRlZiBERUZBVUxUX1ZFQ1RPUgotCSZERUZBVUxUX1ZFQ1RPUiwKLSNlbmRpZgotCU5VTEwKLX07Ci0KLS8qIFdoZW4gdGhlcmUgaXMgYW4gYW1iaWd1b3VzIG1hdGNoLCBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgcHV0cyB0aGUKLSAgIG5hbWVzIG9mIHRoZSBtYXRjaGluZyB0YXJnZXRzIGluIGFuIGFycmF5LiAgVGhpcyB2YXJpYWJsZSBpcyB0aGUgbWF4aW11bQotICAgbnVtYmVyIG9mIGVudHJpZXMgdGhhdCB0aGUgYXJyYXkgY291bGQgcG9zc2libHkgbmVlZC4gICovCi1jb25zdCBzaXplX3QgX2JmZF90YXJnZXRfdmVjdG9yX2VudHJpZXMgPSBzaXplb2YoYmZkX3RhcmdldF92ZWN0b3IpL3NpemVvZigqYmZkX3RhcmdldF92ZWN0b3IpOwotDAotLyogVGhpcyBhcnJheSBtYXBzIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMgb250byBCRkQgdmVjdG9ycy4gICovCi0KLXN0cnVjdCB0YXJnbWF0Y2gKLXsKLSAgLyogVGhlIGNvbmZpZ3VyYXRpb24gdHJpcGxldC4gICovCi0gIGNvbnN0IGNoYXIgKnRyaXBsZXQ7Ci0gIC8qIFRoZSBCRkQgdmVjdG9yLiAgSWYgdGhpcyBpcyBOVUxMLCB0aGVuIHRoZSB2ZWN0b3IgaXMgZm91bmQgYnkKLSAgICAgc2VhcmNoaW5nIGZvcndhcmQgZm9yIHRoZSBuZXh0IHN0cnVjdHVyZSB3aXRoIGEgbm9uIE5VTEwgdmVjdG9yCi0gICAgIGZpZWxkLiAgKi8KLSAgY29uc3QgYmZkX3RhcmdldCAqdmVjdG9yOwotfTsKLQotLyogdGFyZ21hdGNoLmggaXMgYnVpbHQgYnkgTWFrZWZpbGUgb3V0IG9mIGNvbmZpZy5iZmQuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB0YXJnbWF0Y2ggYmZkX3RhcmdldF9tYXRjaFtdID0gewotI2luY2x1ZGUgInRhcmdtYXRjaC5oIgotICB7IE5VTEwsIE5VTEwgfQotfTsKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmZpbmRfdGFyZ2V0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBGaW5kIGEgdGFyZ2V0IHZlY3RvciwgZ2l2ZW4gYSBuYW1lIG9yIGNvbmZpZ3VyYXRpb24gdHJpcGxldC4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWZpbmRfdGFyZ2V0IChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgKnRhcmdldDsKLSAgY29uc3Qgc3RydWN0IHRhcmdtYXRjaCAqbWF0Y2g7Ci0KLSAgZm9yICh0YXJnZXQgPSAmYmZkX3RhcmdldF92ZWN0b3JbMF07ICp0YXJnZXQgIT0gTlVMTDsgdGFyZ2V0KyspCi0gICAgaWYgKHN0cmNtcCAobmFtZSwgKCp0YXJnZXQpLT5uYW1lKSA9PSAwKQotICAgICAgcmV0dXJuICp0YXJnZXQ7Ci0KLSAgLyogSWYgd2UgY291bGRuJ3QgbWF0Y2ggb24gdGhlIGV4YWN0IG5hbWUsIHRyeSBtYXRjaGluZyBvbiB0aGUKLSAgICAgY29uZmlndXJhdGlvbiB0cmlwbGV0LiAgRklYTUU6IFdlIHNob3VsZCBydW4gdGhlIHRyaXBsZXQgdGhyb3VnaAotICAgICBjb25maWcuc3ViIGZpcnN0LCBidXQgdGhhdCBpcyBoYXJkLiAgKi8KLSAgZm9yIChtYXRjaCA9ICZiZmRfdGFyZ2V0X21hdGNoWzBdOyBtYXRjaC0+dHJpcGxldCAhPSBOVUxMOyBtYXRjaCsrKQotICAgIHsKLSAgICAgIGlmIChmbm1hdGNoIChtYXRjaC0+dHJpcGxldCwgbmFtZSwgMCkgPT0gMCkKLQl7Ci0JICB3aGlsZSAobWF0Y2gtPnZlY3RvciA9PSBOVUxMKQotCSAgICArK21hdGNoOwotCSAgcmV0dXJuIG1hdGNoLT52ZWN0b3I7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2RlZmF1bHRfdGFyZ2V0Ci0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X2RlZmF1bHRfdGFyZ2V0IChjb25zdCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIGRlZmF1bHQgdGFyZ2V0IHZlY3RvciB0byB1c2Ugd2hlbiByZWNvZ25pemluZyBhIEJGRC4KLQlUaGlzIHRha2VzIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQsIHdoaWNoIG1heSBiZSBhIEJGRCB0YXJnZXQKLQluYW1lIG9yIGEgY29uZmlndXJhdGlvbiB0cmlwbGV0LgotKi8KLQotYm9vbGVhbgotYmZkX3NldF9kZWZhdWx0X3RhcmdldCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0OwotCi0gIGlmIChiZmRfZGVmYXVsdF92ZWN0b3JbMF0gIT0gTlVMTAotICAgICAgJiYgc3RyY21wIChuYW1lLCBiZmRfZGVmYXVsdF92ZWN0b3JbMF0tPm5hbWUpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgdGFyZ2V0ID0gZmluZF90YXJnZXQgKG5hbWUpOwotICBpZiAodGFyZ2V0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9kZWZhdWx0X3ZlY3RvclswXSA9IHRhcmdldDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9maW5kX3RhcmdldAotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF90YXJnZXQgKmJmZF9maW5kX3RhcmdldChDT05TVCBjaGFyICp0YXJnZXRfbmFtZSwgYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB0cmFuc2ZlciB2ZWN0b3IgZm9yIHRoZSBvYmplY3QgdGFyZ2V0Ci0JbmFtZWQgQHZhcnt0YXJnZXRfbmFtZX0uICBJZiBAdmFye3RhcmdldF9uYW1lfSBpcyA8PE5VTEw+PiwgY2hvb3NlIHRoZQotCW9uZSBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgPDxHTlVUQVJHRVQ+PjsgaWYgdGhhdCBpcyBudWxsIG9yIG5vdAotCWRlZmluZWQsIHRoZW4gY2hvb3NlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgdGFyZ2V0IGxpc3QuCi0JUGFzc2luZyBpbiB0aGUgc3RyaW5nICJkZWZhdWx0IiBvciBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudAotCXZhcmlhYmxlIHRvICJkZWZhdWx0IiB3aWxsIGNhdXNlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgdGFyZ2V0Ci0JbGlzdCB0byBiZSByZXR1cm5lZCwgYW5kICJ0YXJnZXRfZGVmYXVsdGVkIiB3aWxsIGJlIHNldCBpbiB0aGUKLQlCRkQuICBUaGlzIGNhdXNlcyA8PGJmZF9jaGVja19mb3JtYXQ+PiB0byBsb29wIG92ZXIgYWxsIHRoZQotCXRhcmdldHMgdG8gZmluZCB0aGUgb25lIHRoYXQgbWF0Y2hlcyB0aGUgZmlsZSBiZWluZyByZWFkLiAgIAotKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1iZmRfZmluZF90YXJnZXQgKHRhcmdldF9uYW1lLCBhYmZkKQotICAgICBjb25zdCBjaGFyICp0YXJnZXRfbmFtZTsKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBjaGFyICp0YXJnbmFtZTsKLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0OwotCi0gIGlmICh0YXJnZXRfbmFtZSAhPSBOVUxMKQotICAgIHRhcmduYW1lID0gdGFyZ2V0X25hbWU7Ci0gIGVsc2UKLSAgICB0YXJnbmFtZSA9IGdldGVudiAoIkdOVVRBUkdFVCIpOwotCi0gIC8qIFRoaXMgaXMgc2FmZTsgdGhlIHZlY3RvciBjYW5ub3QgYmUgbnVsbCAqLwotICBpZiAodGFyZ25hbWUgPT0gTlVMTCB8fCBzdHJjbXAgKHRhcmduYW1lLCAiZGVmYXVsdCIpID09IDApCi0gICAgewotICAgICAgYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCA9IHRydWU7Ci0gICAgICBpZiAoYmZkX2RlZmF1bHRfdmVjdG9yWzBdICE9IE5VTEwpCi0JYWJmZC0+eHZlYyA9IGJmZF9kZWZhdWx0X3ZlY3RvclswXTsKLSAgICAgIGVsc2UKLQlhYmZkLT54dmVjID0gYmZkX3RhcmdldF92ZWN0b3JbMF07Ci0gICAgICByZXR1cm4gYWJmZC0+eHZlYzsKLSAgICB9Ci0KLSAgYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCA9IGZhbHNlOwotCi0gIHRhcmdldCA9IGZpbmRfdGFyZ2V0ICh0YXJnbmFtZSk7Ci0gIGlmICh0YXJnZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBhYmZkLT54dmVjID0gdGFyZ2V0OwotICByZXR1cm4gdGFyZ2V0OwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfdGFyZ2V0X2xpc3QKLQotU1lOT1BTSVMKLQljb25zdCBjaGFyICoqYmZkX3RhcmdldF9saXN0KHZvaWQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIGZyZXNobHkgbWFsbG9jZWQgTlVMTC10ZXJtaW5hdGVkCi0JdmVjdG9yIG9mIHRoZSBuYW1lcyBvZiBhbGwgdGhlIHZhbGlkIEJGRCB0YXJnZXRzLiBEbyBub3QKLQltb2RpZnkgdGhlIG5hbWVzLgotCi0qLwotCi1jb25zdCBjaGFyICoqCi1iZmRfdGFyZ2V0X2xpc3QgKCkKLXsKLSAgaW50IHZlY19sZW5ndGg9IDA7Ci0jaWYgZGVmaW5lZCAoSE9TVF9IUFBBSFBVWCkgJiYgISBkZWZpbmVkIChfX1NURENfXykKLSAgLyogVGhlIG5hdGl2ZSBjb21waWxlciBvbiB0aGUgSFA5MDAwLzcwMCBoYXMgYSBidWcgd2hpY2ggY2F1c2VzIGl0Ci0gICAgIHRvIGxvb3AgZW5kbGVzc2x5IHdoZW4gY29tcGlsaW5nIHRoaXMgZmlsZS4gIFRoaXMgYXZvaWRzIGl0LiAgKi8KLSAgdm9sYXRpbGUKLSNlbmRpZgotICAgIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCAqdGFyZ2V0OwotICBDT05TVCAgY2hhciAqKm5hbWVfbGlzdCwgKipuYW1lX3B0cjsKLQotICBmb3IgKHRhcmdldCA9ICZiZmRfdGFyZ2V0X3ZlY3RvclswXTsgKnRhcmdldCAhPSBOVUxMOyB0YXJnZXQrKykKLSAgICB2ZWNfbGVuZ3RoKys7Ci0KLSAgbmFtZV9wdHIgPSBuYW1lX2xpc3QgPSAoQ09OU1QgY2hhciAqKikKLSAgICBiZmRfem1hbGxvYyAoKHZlY19sZW5ndGggKyAxKSAqIHNpemVvZiAoY2hhciAqKikpOwotCi0gIGlmIChuYW1lX2xpc3QgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBmb3IgKHRhcmdldCA9ICZiZmRfdGFyZ2V0X3ZlY3RvclswXTsgKnRhcmdldCAhPSBOVUxMOyB0YXJnZXQrKykKLSAgICAqKG5hbWVfcHRyKyspID0gKCp0YXJnZXQpLT5uYW1lOwotCi0gIHJldHVybiBuYW1lX2xpc3Q7Ci19CmRpZmYgLS1naXQgYS9iZmQvdGFyZ21hdGNoLnNlZCBiL2JmZC90YXJnbWF0Y2guc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjQwZTcyLi4wMDAwMDAwCi0tLSBhL2JmZC90YXJnbWF0Y2guc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotMSwvU1RBUlQgT0YgdGFyZ21hdGNoLmgvCWQKLS9FTkQgT0YgdGFyZ21hdGNoLmgvLCQJCWQKLXMvXiNpZi9LRUVQICNpZi8KLXMvXiNlbmRpZi9LRUVQICNlbmRpZi8KLXMvXlsgCV0qIy4qJC8vCi1zL15LRUVQICMvIy8KLXMvWyAJXSpcXCQvLwotdCBsYWIxCi0JOmxhYjEKLXMvW3wgCV1bfCAJXSpcKFtefCgpIAldW158KCkgCV0qXClbIAldKnwveyAiXDEiLCBOVUxMIH0sL2cKLXMvW3wgCV1bfCAJXSpcKFtefCgpIAldW158KCkgCV0qXClbIAldKikveyAiXDEiLC9nCi10IGxhYjIKLXMvXlsgCV0qdGFyZ19kZWZ2ZWM9XChbXiAJXSpcKS8jaWYgIWRlZmluZWQgKFNFTEVDVF9WRUNTKSB8fCBkZWZpbmVkIChIQVZFX1wxKS8KLXQgbGFiMwotcy8uKj0uKi8vCi1zLzs7Ly8KLWIKLQk6bGFiMgotSAotZAotCTpsYWIzCi1HCi1zL1xuLyVFT0wlL2cKLXMvXChkZWZpbmVkIChIQVZFX1wpXChbXildKlwpXCguKlwpL1wxXDJcM1wKLVwmXDIgfSxcCi0jZW5kaWYvCi1zLyVFT0wlL1wKLS9nCi1wCi1zLy4qLy9nCi1zL1xuLy9nCi1oCmRpZmYgLS1naXQgYS9iZmQvdGVraGV4LmMgYi9iZmQvdGVraGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OGZlMmQuLjAwMDAwMDAKLS0tIGEvYmZkL3Rla2hleC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2NSArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3IgRXh0ZW5kZWQgVGVrdHJvbml4IEhleCBGb3JtYXQgIG9iamVjdHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TVUJTRUNUSU9OCi0JVGVrdHJvbml4IEhleCBGb3JtYXQgaGFuZGxpbmcKLQotREVTQ1JJUFRJT04KLQkKLQlUZWsgSGV4IHJlY29yZHMgY2FuIGhvbGQgc3ltYm9scyBhbmQgZGF0YSwgYnV0IG5vdAotCXJlbG9jYXRpb25zLiBUaGVpciBtYWluIGFwcGxpY2F0aW9uIGlzIGNvbW11bmljYXRpb24gd2l0aAotCWRldmljZXMgbGlrZSBQUk9NIHByb2dyYW1tZXJzIGFuZCBJQ0UgZXF1aXBtZW50LgotCQotCUl0IHNlZW1zIHRoYXQgdGhlIHNlY3Rpb25zIGFyZSBkZXNjaWJlZCBhcyBiZWluZyByZWFsbHkgYmlnLAotICAgICAgICB0aGUgZXhhbXBsZSBJIGhhdmUgc2F5cyB0aGF0IHRoZSB0ZXh0IHNlY3Rpb24gaXMgMC4uZmZmZmZmZmYuCi0JQkZEIHdvdWxkIGJhcmYgd2l0aCB0aGlzLCBtYW55IGFwcHMgd291bGQgdHJ5IHRvIGFsbG9jIDRHQiB0bwotCXJlYWQgaW4gdGhlIGZpbGUuCi0KLQlUZXggSGV4IG1heSBjb250YWluIG1hbnkgc2VjdGlvbnMsIGJ1dCB0aGUgZGF0YSB3aGljaCBjb21lcyBpbgotCWhhcyBubyB0YWcgc2F5aW5nIHdoaWNoIHNlY3Rpb24gaXQgYmVsb25ncyB0bywgc28gd2UgY3JlYXRlCi0Jb25lIHNlY3Rpb24gZm9yIGVhY2ggYmxvY2sgb2YgZGF0YSwgY2FsbGVkICJibGtubm5uIiB3aGljaCB3ZQotCXN0aWNrIGFsbCB0aGUgZGF0YSBpbnRvLgotCi0JVGVrSGV4IG1heSBjb21lIG91dCBvZiAJb3JkZXIgYW5kIHRoZXJlIGlzIG5vIGhlYWRlciwgc28gYW4KLQlpbml0aWFsIHNjYW4gaXMgcmVxdWlyZWQgIHRvIGRpc2NvdmVyIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtCi0JYWRkcmVzc2VzIHVzZWQgdG8gY3JlYXRlIHRoZSB2bWEgYW5kIHNpemUgb2YgdGhlIHNlY3Rpb25zIHdlCi0JY3JlYXRlLgotCVdlIHJlYWQgaW4gdGhlIGRhdGEgaW50byBwYWdlcyBvZiBDSFVOS19NQVNLKzEgc2l6ZSBhbmQgcmVhZAotCXRoZW0gb3V0IGZyb20gdGhhdCB3aGVuZXZlciB3ZSBuZWVkIHRvLgotCi0JQW55IG51bWJlciBvZiBzZWN0aW9ucyBtYXkgYmUgY3JlYXRlZCBmb3Igb3V0cHV0LCB3ZSBzYXZlIHRoZW0KLQl1cCBhbmQgb3V0cHV0IHRoZW0gd2hlbiBpdCdzIHRpbWUgdG8gY2xvc2UgdGhlIGJmZC4KLQotCi0JQSBUZWtIZXggcmVjb3JkIGxvb2tzIGxpa2U6Ci1FWEFNUExFCi0JJTxibG9jayBsZW5ndGg+PHR5cGU+PGNoZWNrc3VtPjxzdHVmZj48Y3I+Ci0JCi1ERVNDUklQVElPTgotCVdoZXJlCi0JbyBsZW5ndGgKLQlpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByZWNvcmQgbm90IGluY2x1ZGluZyB0aGUgJSBzaWduLgotCW8gdHlwZQotCWlzIG9uZSBvZjoKLQkzKSBzeW1ib2wgcmVjb3JkCi0JNikgZGF0YSByZWNvcmQKLQk4KSB0ZXJtaW5hdGlvbiByZWNvcmQKLQkKLQotVGhlIGRhdGEgY2FuIGNvbWUgb3V0IG9mIG9yZGVyLCBhbmQgbWF5IGJlIGRpc2NvbnRpZ291cy4gVGhpcyBpcyBhCi1zZXJpYWwgcHJvdG9jb2wsIHNvIGJpZyBmaWxlcyBhcmUgdW5saWtlbHksIHNvIHdlIGtlZXAgYSBsaXN0IG9mIDhrIGNodW5rcwotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgYmZkX3ZtYSBsb3c7Ci0gICAgYmZkX3ZtYSBoaWdoOwotICB9IGFkZHJfcmFuZ2VfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgdGVraGV4X3N5bWJvbF9zdHJ1Y3QKLSAgewotCi0gICAgYXN5bWJvbCBzeW1ib2w7Ci0gICAgc3RydWN0IHRla2hleF9zeW1ib2xfc3RydWN0ICpwcmV2OwotCi0gIH0gdGVraGV4X3N5bWJvbF90eXBlOwotCi1zdGF0aWMgY29uc3QgY2hhciBkaWdzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Ci0KLXN0YXRpYyBjaGFyIHN1bV9ibG9ja1syNTZdOwotCi0jZGVmaW5lIE5PVF9IRVggMjAKLSNkZWZpbmUgTklCQkxFKHgpIGhleF92YWx1ZSh4KQotI2RlZmluZSBIRVgoYnVmZmVyKSAoKE5JQkJMRSgoYnVmZmVyKVswXSk8PDQpICsgTklCQkxFKChidWZmZXIpWzFdKSkKLSNkZWZpbmUgVE9IRVgoZCx4KSBcCi0oZClbMV0gPSBkaWdzWyh4KSAmIDB4Zl07IFwKLShkKVswXSA9IGRpZ3NbKCh4KT4+NCkmMHhmXTsKLSNkZWZpbmUJSVNIRVgoeCkgIGhleF9wKHgpCi0KLXN0YXRpYyB2b2lkIHRla2hleF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBiZmRfdm1hIGdldHZhbHVlIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHRla2hleF9wcmludF9zeW1ib2wKLSBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotc3RhdGljIHZvaWQgdGVraGV4X2dldF9zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSk7Ci1zdGF0aWMgYXN5bWJvbCAqdGVraGV4X21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IHRla2hleF9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gdGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgb3V0IFBBUkFNUyAoKGJmZCAqLCBpbnQsIGNoYXIgKiwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZXN5bSBQQVJBTVMgKChjaGFyICoqLCBDT05TVCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHdyaXRldmFsdWUgUEFSQU1TICgoY2hhciAqKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gdGVraGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gUEFSQU1TICgoYmZkKiwgc2VjX3B0ciwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gdGVraGV4X3NldF9hcmNoX21hY2gKLSBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiB0ZWtoZXhfZ2V0X3NlY3Rpb25fY29udGVudHMKLSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIHZvaWQgbW92ZV9zZWN0aW9uX2NvbnRlbnRzCi0gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUsIGJvb2xlYW4pKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICp0ZWtoZXhfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHRla2hleF9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgdGVraGV4X2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHRla2hleF9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgdm9pZCBwYXNzX292ZXIgUEFSQU1TICgoYmZkICosIHZvaWQgKCopKGJmZCosIGludCwgY2hhciAqKSkpOwotc3RhdGljIHZvaWQgZmlyc3RfcGhhc2UgUEFSQU1TICgoYmZkICosIGludCwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBpbnNlcnRfYnl0ZSBQQVJBTVMgKChiZmQgKiwgaW50LCBiZmRfdm1hKSk7Ci1zdGF0aWMgc3RydWN0IGRhdGFfc3RydWN0ICpmaW5kX2NodW5rIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGdldHN5bSBQQVJBTVMgKChjaGFyICosIGNoYXIgKiopKTsKLQotLyoKLUhlcmUncyBhbiBleGFtcGxlCi0lM0E2QzY0ODAwMDRFNTZGRkZDNEU3MTcwNjNCMEFFRkZGQzZEMDY1MkFFRkZGQzYwRjI0RTVFNEU3NQotJTFCMzcwOVRfU0VHTUVOVDExMDhGRkZGRkZGRgotJTJCM0FCOVRfU0VHTUVOVDdEZ2NjX2NvbXBpbGVkJDEwODdoZWxsbyRjMTAKLSUzNzM4MjlUX1NFR01FTlQ4MGludCR0MSRyMSQkMjE0NzQxMDgwY2hhciR0MiRyMiQwJDEyNzEwCi0lMzczNzY5VF9TRUdNRU5UODBsb25nJGludCR0MyRyMSQkMTA4MHVuc2lnbmVkJGludCR0NCQxMAotJTM3M0NBOVRfU0VHTUVOVDgwbG9uZyR1bnNpZ25lZCRpbjEwODBzaG9ydCRpbnQkdDYkcjEkMTAKLSUzNzMwNDlUX1NFR01FTlQ4MGxvbmckbG9uZyRpbnQkdDcxMDgwc2hvcnQkdW5zaWduZWQkaTEwCi0lMzczQTI5VF9TRUdNRU5UODBsb25nJGxvbmckdW5zaWduMTA4MHNpZ25lZCRjaGFyJHQxMCQxMAotJTM3M0Q2OVRfU0VHTUVOVDgwdW5zaWduZWQkY2hhciR0MTEwODBmbG9hdCR0MTIkcjEkNCQwMTAKLSUzNzNEMTlUX1NFR01FTlQ4MGRvdWJsZSR0MTMkcjEkOCQxMDgwbG9uZyRkb3VibGUkdDE0JDEwCi0lMjczNEQ5VF9TRUdNRU5UOEJ2b2lkJHQxNSQxNTEwMzVfbWFpbjEwCi0lMkYzQ0E5VF9TRUdNRU5UODEkMTA4MSQxNjgxJDFFODEkMjE0ODdtYWluJEYxMTAKLSUyODMyRjlUX1NFR01FTlQ4M2kkMThGRkZGRkZGQzgxJDE0ODEkMjE0Ci0lMDcgOCAxMCAxMAotCi1leHBsYW5hdGlvbjoKLSUzQTZDNjQ4MDAwNEU1NkZGRkM0RTcxNzA2M0IwQUVGRkZDNkQwNjUyQUVGRkZDNjBGMjRFNUU0RTc1Ci0gXiBeXiBeICAgICBeLWRhdGEKLSB8IHx8ICstLS0tLS0gNCBjaGFyIGludGVnZXIgMHg4MDAwCi0gfCB8Ky0tLS0tLS0tIGNoZWNrc3VtCi0gfCArLS0tLS0tLS0tIHR5cGUgNiAoZGF0YSByZWNvcmQpCi0gKy0tLS0tLS0tLS0tIGxlbmd0aCAzYSBjaGFycwotIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDNhICg1OCBjaGFycykgLS0tLS0tLS0tLS0tLS0tLS0tLT4KLQotJTFCMzcwOVRfU0VHTUVOVDExMDhGRkZGRkZGRgotICAgICAgXiAgICAgICAgIF5eIF4tIDggY2hhcmFjdGVyIGludGVnZXIgMHhmZmZmZmZmZgotICAgICAgfCAgICAgICAgIHwrLSAgIDEgY2hhcmFjdGVyIGludGVnZXIgMAotICAgICAgfCAgICAgICAgICstLSAgIHR5cGUgMSBzeW1ib2wgKHNlY3Rpb24gZGVmaW5pdGlvbikKLSAgICAgICstLS0tLS0tLS0tLS0gICA5IGNoYXIgc3ltYm9sIFRfU0VHTUVOVAotCi0lMkIzQUI5VF9TRUdNRU5UN0RnY2NfY29tcGlsZWQkMTA4N2hlbGxvJGMxMAotJTM3MzgyOVRfU0VHTUVOVDgwaW50JHQxJHIxJCQyMTQ3NDEwODBjaGFyJHQyJHIyJDAkMTI3MTAKLSUzNzM3NjlUX1NFR01FTlQ4MGxvbmckaW50JHQzJHIxJCQxMDgwdW5zaWduZWQkaW50JHQ0JDEwCi0lMzczQ0E5VF9TRUdNRU5UODBsb25nJHVuc2lnbmVkJGluMTA4MHNob3J0JGludCR0NiRyMSQxMAotJTM3MzA0OVRfU0VHTUVOVDgwbG9uZyRsb25nJGludCR0NzEwODBzaG9ydCR1bnNpZ25lZCRpMTAKLSUzNzNBMjlUX1NFR01FTlQ4MGxvbmckbG9uZyR1bnNpZ24xMDgwc2lnbmVkJGNoYXIkdDEwJDEwCi0lMzczRDY5VF9TRUdNRU5UODB1bnNpZ25lZCRjaGFyJHQxMTA4MGZsb2F0JHQxMiRyMSQ0JDAxMAotJTM3M0QxOVRfU0VHTUVOVDgwZG91YmxlJHQxMyRyMSQ4JDEwODBsb25nJGRvdWJsZSR0MTQkMTAKLSUyNzM0RDlUX1NFR01FTlQ4QnZvaWQkdDE1JDE1MTAzNV9tYWluMTAKLSUyRjNDQTlUX1NFR01FTlQ4MSQxMDgxJDE2ODEkMUU4MSQyMTQ4N21haW4kRjExMAotJTI4MzJGOVRfU0VHTUVOVDgzaSQxOEZGRkZGRkZDODEkMTQ4MSQyMTQKLSUwNzgxMDEwCi0KLVR1cm5zIGludG8KLXNhY0B0aGVwdWIkIC4vb2JqZHVtcCAtZHggLW0gbTY4ayBmCi0KLWY6ICAgICBmaWxlIGZvcm1hdCB0ZWtoZXgKLS0tLS0teC0tLSA5LzU1NzI4IC0xMzQyMTk0MTYgU2VwIDI5IDE1OjEzIDE5OTUgZgotYXJjaGl0ZWN0dXJlOiBVTktOT1dOISwgZmxhZ3MgMHgwMDAwMDAxMDoKLUhBU19TWU1TCi1zdGFydCBhZGRyZXNzIDB4MDAwMDAwMDAKLVNFQ1RJT04gMCBbRDAwMDAwMDAwXQk6IHNpemUgMDAwMjAwMDAgdm1hIDAwMDAwMDAwIGFsaWduIDIqKjAKLSBBTExPQywgTE9BRAotU0VDVElPTiAxIFtEMDAwMDgwMDBdCTogc2l6ZSAwMDAwMjAwMSB2bWEgMDAwMDgwMDAgYWxpZ24gMioqMAotCi1TRUNUSU9OIDIgW1RfU0VHTUVOVF0JOiBzaXplIGZmZmZmZmZmIHZtYSAwMDAwMDAwMCBhbGlnbiAyKiowCi0KLVNZTUJPTCBUQUJMRToKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBnY2NfY29tcGlsZWQkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgaGVsbG8kYwotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGludCR0MSRyMSQkMjE0NzQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBjaGFyJHQyJHIyJDAkMTI3Ci0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgbG9uZyRpbnQkdDMkcjEkJAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIHVuc2lnbmVkJGludCR0NCQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBsb25nJHVuc2lnbmVkJGluCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgc2hvcnQkaW50JHQ2JHIxJAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGxvbmckbG9uZyRpbnQkdDcKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBzaG9ydCR1bnNpZ25lZCRpCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgbG9uZyRsb25nJHVuc2lnbgotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIHNpZ25lZCRjaGFyJHQxMCQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCB1bnNpZ25lZCRjaGFyJHQxCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgZmxvYXQkdDEyJHIxJDQkMAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGRvdWJsZSR0MTMkcjEkOCQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBsb25nJGRvdWJsZSR0MTQkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgdm9pZCR0MTUkMTUKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBfbWFpbgotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UICQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCAkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgJAotMDAwMDAwMTAgIGcgICAgICAgVF9TRUdNRU5UICQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBtYWluJEYxCi1mY2ZmZmZmZiAgZyAgICAgICBUX1NFR01FTlQgaSQxCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgJAotMDAwMDAwMTAgIGcgICAgICAgVF9TRUdNRU5UICQKLQotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFtEMDAwMDAwMDBdOiAobm9uZSkKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbRDAwMDA4MDAwXTogKG5vbmUpCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgW1RfU0VHTUVOVF06IChub25lKQotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIEQwMDAwMDAwMDoKLS4uLgotMDAwMDgwMDAgKCQrKTdmZjAgbGlua3cgZnAsIy00Ci0wMDAwODAwNCAoJCspN2ZmNCBub3AKLTAwMDA4MDA2ICgkKyk3ZmY2IG1vdmVsICM5OSxkMAotMDAwMDgwMDggKCQrKTdmZjggY21wbCBmcEAoLTQpLGQwCi0wMDAwODAwYyAoJCspN2ZmYyBibHRzIDAwMDA4MDE0ICgkKyk4MDA0Ci0wMDAwODAwZSAoJCspN2ZmZSBhZGRxbCAjMSxmcEAoLTQpCi0wMDAwODAxMiAoJCspODAwMiBicmFzIDAwMDA4MDA2ICgkKyk3ZmY2Ci0wMDAwODAxNCAoJCspODAwNCB1bmxrIGZwCi0wMDAwODAxNiAoJCspODAwNiBydHMKLS4uLgotCi0qLwotCi1zdGF0aWMgdm9pZAotdGVraGV4X2luaXQgKCkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHN0YXRpYyBib29sZWFuIGluaXRlZCA9IGZhbHNlOwotICBpbnQgdmFsOwotCi0gIGlmIChpbml0ZWQgPT0gZmFsc2UpCi0gICAgewotICAgICAgaW5pdGVkID0gdHJ1ZTsKLSAgICAgIGhleF9pbml0ICgpOwotICAgICAgdmFsID0gMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQotCXsKLQkgIHN1bV9ibG9ja1tpICsgJzAnXSA9IHZhbCsrOwotCX0KLSAgICAgIGZvciAoaSA9ICdBJzsgaSA8PSAnWic7IGkrKykKLQl7Ci0JICBzdW1fYmxvY2tbaV0gPSB2YWwrKzsKLQl9Ci0gICAgICBzdW1fYmxvY2tbJyQnXSA9IHZhbCsrOwotICAgICAgc3VtX2Jsb2NrWyclJ10gPSB2YWwrKzsKLSAgICAgIHN1bV9ibG9ja1snLiddID0gdmFsKys7Ci0gICAgICBzdW1fYmxvY2tbJ18nXSA9IHZhbCsrOwotICAgICAgZm9yIChpID0gJ2EnOyBpIDw9ICd6JzsgaSsrKQotCXsKLQkgIHN1bV9ibG9ja1tpXSA9IHZhbCsrOwotCX0KLSAgICB9Ci19Ci0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBvbiBhIGxpbmUgaXMgRkYgKi8KLSNkZWZpbmUgTUFYQ0hVTksgMHhmZgotLyogVGhlIG51bWJlciBvZiBieXRlcyB3ZSBmaXQgb250byBhIGxpbmUgb24gb3V0cHV0ICovCi0jZGVmaW5lIENIVU5LIDIxCi0KLS8qIFdlIGNhbm5vdCBvdXRwdXQgb3VyIHRla2hleG9yZHMgYXMgd2Ugc2VlIHRoZW0sIHdlIGhhdmUgdG8gZ2x1ZSB0aGVtCi0gICB0b2dldGhlciwgdGhpcyBpcyBkb25lIGluIHRoaXMgc3RydWN0dXJlIDogKi8KLQotc3RydWN0IHRla2hleF9kYXRhX2xpc3Rfc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gIGJmZF92bWEgd2hlcmU7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgc3RydWN0IHRla2hleF9kYXRhX2xpc3Rfc3RydWN0ICpuZXh0OwotCi19OwotdHlwZWRlZiBzdHJ1Y3QgdGVraGV4X2RhdGFfbGlzdF9zdHJ1Y3QgdGVraGV4X2RhdGFfbGlzdF90eXBlOwotCi0jZGVmaW5lIENIVU5LX01BU0sgMHgxZmZmCi0KLXN0cnVjdCBkYXRhX3N0cnVjdAotICB7Ci0gICAgY2hhciBjaHVua19kYXRhW0NIVU5LX01BU0sgKyAxXTsKLSAgICBjaGFyIGNodW5rX2luaXRbQ0hVTktfTUFTSyArIDFdOwotICAgIGJmZF92bWEgdm1hOwotICAgIHN0cnVjdCBkYXRhX3N0cnVjdCAqbmV4dDsKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QgdGVraGV4X2RhdGFfc3RydWN0Ci17Ci0gIHRla2hleF9kYXRhX2xpc3RfdHlwZSAqaGVhZDsKLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0gIHN0cnVjdCB0ZWtoZXhfc3ltYm9sX3N0cnVjdCAqc3ltYm9sczsKLSAgc3RydWN0IGRhdGFfc3RydWN0ICpkYXRhOwotfSB0ZGF0YV90eXBlOwotCi0jZGVmaW5lIGVuZGEoeCkgKHgtPnZtYSArIHgtPnNpemUpCi0KLXN0YXRpYyBiZmRfdm1hCi1nZXR2YWx1ZSAoc3JjcCkKLSAgICAgY2hhciAqKnNyY3A7Ci17Ci0gIGNoYXIgKnNyYyA9ICpzcmNwOwotICBiZmRfdm1hIHZhbHVlID0gMDsKLSAgdW5zaWduZWQgaW50IGxlbiA9IGhleF92YWx1ZSgqc3JjKyspOwotCi0gIGlmIChsZW4gPT0gMCkKLSAgICBsZW4gPSAxNjsKLSAgd2hpbGUgKGxlbi0tKQotICAgIHsKLSAgICAgIHZhbHVlID0gdmFsdWUgPDwgNCB8IGhleF92YWx1ZSgqc3JjKyspOwotICAgIH0KLSAgKnNyY3AgPSBzcmM7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotZ2V0c3ltIChkc3RwLCBzcmNwKQotICAgICBjaGFyICpkc3RwOwotICAgICBjaGFyICoqc3JjcDsKLXsKLSAgY2hhciAqc3JjID0gKnNyY3A7Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgbGVuID0gaGV4X3ZhbHVlKCpzcmMrKyk7Ci0KLSAgaWYgKGxlbiA9PSAwKQotICAgIGxlbiA9IDE2OwotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgZHN0cFtpXSA9IHNyY1tpXTsKLSAgZHN0cFtpXSA9IDA7Ci0gICpzcmNwID0gc3JjICsgaTsKLSAgcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHN0cnVjdCBkYXRhX3N0cnVjdCAqCi1maW5kX2NodW5rIChhYmZkLCB2bWEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3ZtYSB2bWE7Ci17Ci0gIHN0cnVjdCBkYXRhX3N0cnVjdCAqZCA9IGFiZmQtPnRkYXRhLnRla2hleF9kYXRhLT5kYXRhOwotCi0gIHZtYSAmPSB+Q0hVTktfTUFTSzsKLSAgd2hpbGUgKGQgJiYgKGQtPnZtYSkgIT0gdm1hKQotICAgIHsKLSAgICAgIGQgPSBkLT5uZXh0OwotICAgIH0KLSAgaWYgKCFkKQotICAgIHsKLSAgICAgIGNoYXIgKnNuYW1lID0gYmZkX2FsbG9jIChhYmZkLCAxMik7Ci0KLSAgICAgIC8qIE5vIGNodW5rIGZvciB0aGlzIGFkZHJlc3MsIHNvIG1ha2Ugb25lIHVwICovCi0gICAgICBkID0gKHN0cnVjdCBkYXRhX3N0cnVjdCAqKQotCWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZGF0YV9zdHJ1Y3QpKTsKLQotICAgICAgaWYgKCFzbmFtZSB8fCAhZCkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgbWVtc2V0IChkLT5jaHVua19pbml0LCAwLCBDSFVOS19NQVNLICsgMSk7Ci0gICAgICBtZW1zZXQgKGQtPmNodW5rX2RhdGEsIDAsIENIVU5LX01BU0sgKyAxKTsKLSAgICAgIGQtPm5leHQgPSBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+ZGF0YTsKLSAgICAgIGQtPnZtYSA9IHZtYTsKLSAgICAgIGFiZmQtPnRkYXRhLnRla2hleF9kYXRhLT5kYXRhID0gZDsKLSAgICB9Ci0gIHJldHVybiBkOwotfQotCi1zdGF0aWMgdm9pZAotaW5zZXJ0X2J5dGUgKGFiZmQsIHZhbHVlLCBhZGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICAvKiBGaW5kIHRoZSBjaHVuayB0aGF0IHRoaXMgYnl0ZSBuZWVkcyBhbmQgcHV0IGl0IGluICovCi0gIHN0cnVjdCBkYXRhX3N0cnVjdCAqZCA9IGZpbmRfY2h1bmsgKGFiZmQsIGFkZHIpOwotCi0gIGQtPmNodW5rX2RhdGFbYWRkciAmIENIVU5LX01BU0tdID0gdmFsdWU7Ci0gIGQtPmNodW5rX2luaXRbYWRkciAmIENIVU5LX01BU0tdID0gMTsKLX0KLQotLyogVGhlIGZpcnN0IHBhc3MgaXMgdG8gZmluZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBzZWN0aW9ucywgYW5kIHNlZQotICBob3cgYmlnIHRoZSBkYXRhIGlzICovCi1zdGF0aWMgdm9pZAotZmlyc3RfcGhhc2UgKGFiZmQsIHR5cGUsIHNyYykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqc3JjOwotewotICBhc2VjdGlvbiAqc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gIGludCBsZW47Ci0gIGNoYXIgc3ltWzE3XTsJCQkvKiBBIHN5bWJvbCBjYW4gb25seSBiZSAxNmNoYXJzIGxvbmcgKi8KLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJzYnOgotICAgICAgLyogRGF0YSByZWNvcmQgLSByZWFkIGl0IGFuZCBzdG9yZSBpdCAqLwotICAgICAgewotCWJmZF92bWEgYWRkciA9IGdldHZhbHVlICgmc3JjKTsKLQotCXdoaWxlICgqc3JjKQotCSAgewotCSAgICBpbnNlcnRfYnl0ZSAoYWJmZCwgSEVYIChzcmMpLCBhZGRyKTsKLQkgICAgc3JjICs9IDI7Ci0JICAgIGFkZHIrKzsKLQkgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuOwotICAgIGNhc2UgJzMnOgotICAgICAgLyogU3ltYm9sIHJlY29yZCwgcmVhZCB0aGUgc2VnbWVudCAqLwotICAgICAgbGVuID0gZ2V0c3ltIChzeW0sICZzcmMpOwotICAgICAgc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzeW0pOwotICAgICAgaWYgKHNlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgY2hhciAqbiA9IGJmZF9hbGxvYyAoYWJmZCwgbGVuICsgMSk7Ci0KLQkgIGlmICghbikKLQkgICAgYWJvcnQoKTsJCS8qIEZJWE1FICovCi0JICBtZW1jcHkgKG4sIHN5bSwgbGVuICsgMSk7Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbik7Ci0JfQotICAgICAgd2hpbGUgKCpzcmMpCi0JewotCSAgc3dpdGNoICgqc3JjKQotCSAgICB7Ci0JICAgIGNhc2UgJzEnOgkJLyogc2VjdGlvbiByYW5nZSAqLwotCSAgICAgIHNyYysrOwotCSAgICAgIHNlY3Rpb24tPnZtYSA9IGdldHZhbHVlICgmc3JjKTsKLQkgICAgICBzZWN0aW9uLT5fcmF3X3NpemUgPSBnZXR2YWx1ZSAoJnNyYykgLSBzZWN0aW9uLT52bWE7Ci0JICAgICAgc2VjdGlvbi0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJzAnOgotCSAgICBjYXNlICcyJzoKLQkgICAgY2FzZSAnMyc6Ci0JICAgIGNhc2UgJzQnOgotCSAgICBjYXNlICc2JzoKLQkgICAgY2FzZSAnNyc6Ci0JICAgIGNhc2UgJzgnOgotCSAgICAgIC8qIFN5bWJvbHMsIGFkZCB0byBzZWN0aW9uICovCi0JICAgICAgewotCQl0ZWtoZXhfc3ltYm9sX3R5cGUgKm5ldyA9Ci0JCSh0ZWtoZXhfc3ltYm9sX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAgICAgc2l6ZW9mICh0ZWtoZXhfc3ltYm9sX3R5cGUpKTsKLQkJY2hhciB0eXBlID0gKCpzcmMpOwotCi0JCWlmICghbmV3KQotCQkgIGFib3J0KCk7CS8qIEZJWE1FICovCi0JCW5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCQlzcmMrKzsKLQkJYWJmZC0+c3ltY291bnQrKzsKLQkJYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0JCW5ldy0+cHJldiA9IGFiZmQtPnRkYXRhLnRla2hleF9kYXRhLT5zeW1ib2xzOwotCQlhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+c3ltYm9scyA9IG5ldzsKLQkJbGVuID0gZ2V0c3ltIChzeW0sICZzcmMpOwotCQluZXctPnN5bWJvbC5uYW1lID0gYmZkX2FsbG9jIChhYmZkLCBsZW4gKyAxKTsKLQkJaWYgKCFuZXctPnN5bWJvbC5uYW1lKQotCQkgIGFib3J0KCk7CS8qIEZJWE1FICovCi0JCW1lbWNweSAoKGNoYXIgKikgKG5ldy0+c3ltYm9sLm5hbWUpLCBzeW0sIGxlbiArIDEpOwotCQluZXctPnN5bWJvbC5zZWN0aW9uID0gc2VjdGlvbjsKLQkJaWYgKHR5cGUgPD0gJzQnKQotCQkgIG5ldy0+c3ltYm9sLmZsYWdzID0gKEJTRl9HTE9CQUwgfCBCU0ZfRVhQT1JUKTsKLQkJZWxzZQotCQkgIG5ldy0+c3ltYm9sLmZsYWdzID0gQlNGX0xPQ0FMOwotCQluZXctPnN5bWJvbC52YWx1ZSA9IGdldHZhbHVlICgmc3JjKSAtIHNlY3Rpb24tPnZtYTsKLQkgICAgICB9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBQYXNzIG92ZXIgYW4gdGVraGV4LCBjYWxsaW5nIG9uZSBvZiB0aGUgYWJvdmUgZnVuY3Rpb25zIG9uIGVhY2gKLSAgIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYXNzX292ZXIgKGFiZmQsIGZ1bmMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdm9pZCAoKmZ1bmMpIFBBUkFNUyAoKGJmZCAqLCBpbnQsIGNoYXIgKikpOwotewotICB1bnNpZ25lZCBpbnQgY2hhcnNfb25fbGluZTsKLSAgYm9vbGVhbiBlb2YgPSBmYWxzZTsKLQotICAvKiBUbyB0aGUgZnJvbnQgb2YgdGhlIGZpbGUgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIGFib3J0ICgpOwotICB3aGlsZSAoZW9mID09IGZhbHNlKQotICAgIHsKLSAgICAgIGNoYXIgYnVmZmVyW01BWENIVU5LXTsKLSAgICAgIGNoYXIgKnNyYyA9IGJ1ZmZlcjsKLSAgICAgIGNoYXIgdHlwZTsKLQotICAgICAgLyogRmluZCBmaXJzdCAnJScgKi8KLSAgICAgIGVvZiA9IChib29sZWFuKSAoYmZkX3JlYWQgKHNyYywgMSwgMSwgYWJmZCkgIT0gMSk7Ci0gICAgICB3aGlsZSAoKnNyYyAhPSAnJScgJiYgIWVvZikKLQl7Ci0JICBlb2YgPSAoYm9vbGVhbikgKGJmZF9yZWFkIChzcmMsIDEsIDEsIGFiZmQpICE9IDEpOwotCX0KLSAgICAgIGlmIChlb2YpCi0JYnJlYWs7Ci0gICAgICBzcmMrKzsKLQotICAgICAgLyogRmV0Y2ggdGhlIHR5cGUgYW5kIHRoZSBsZW5ndGggYW5kIHRoZSBjaGVja3N1bSAqLwotICAgICAgaWYgKGJmZF9yZWFkIChzcmMsIDEsIDUsIGFiZmQpICE9IDUpCi0JYWJvcnQgKCk7IC8qIEZJWE1FICovCi0KLSAgICAgIHR5cGUgPSBzcmNbMl07Ci0KLSAgICAgIGlmICghSVNIRVggKHNyY1swXSkgfHwgIUlTSEVYIChzcmNbMV0pKQotCWJyZWFrOwotCi0gICAgICBjaGFyc19vbl9saW5lID0gSEVYIChzcmMpIC0gNTsJLyogQWxyZWFkeSByZWFkIGZpdmUgY2hhciAqLwotCi0gICAgICBpZiAoYmZkX3JlYWQgKHNyYywgMSwgY2hhcnNfb25fbGluZSwgYWJmZCkgIT0gY2hhcnNfb25fbGluZSkKLQlhYm9ydCAoKTsgLyogRklYTUUgKi8KLSAgICAgIHNyY1tjaGFyc19vbl9saW5lXSA9IDA7CS8qIHB1dCBhIG51bGwgYXQgdGhlIGVuZCAqLwotCi0gICAgICBmdW5jIChhYmZkLCB0eXBlLCBzcmMpOwotICAgIH0KLQotfQotCi1zdGF0aWMgbG9uZwotdGVraGV4X2dldF9zeW10YWIgKGFiZmQsIHRhYmxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKip0YWJsZTsKLXsKLSAgdGVraGV4X3N5bWJvbF90eXBlICpwID0gYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPnN5bWJvbHM7Ci0gIHVuc2lnbmVkIGludCBjID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0KLSAgdGFibGVbY10gPSAwOwotICB3aGlsZSAocCkKLSAgICB7Ci0gICAgICB0YWJsZVstLWNdID0gJihwLT5zeW1ib2wpOwotICAgICAgcCA9IHAtPnByZXY7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotc3RhdGljIGxvbmcKLXRla2hleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiAoYWJmZC0+c3ltY291bnQgKyAxKSAqIChzaXplb2YgKHN0cnVjdCB0ZWtoZXhfYXN5bWJvbF9zdHJ1Y3QgKikpOwotCi19Ci0KLXN0YXRpYyBib29sZWFuCi10ZWtoZXhfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdGRhdGFfdHlwZSAqdGRhdGEgPSAodGRhdGFfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAodGRhdGFfdHlwZSkpOwotCi0gIGlmICghdGRhdGEpCi0gICAgcmV0dXJuIGZhbHNlOwotICBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YSA9IHRkYXRhOwotICB0ZGF0YS0+dHlwZSA9IDE7Ci0gIHRkYXRhLT5oZWFkID0gKHRla2hleF9kYXRhX2xpc3RfdHlwZSAqKSBOVUxMOwotICB0ZGF0YS0+c3ltYm9scyA9IChzdHJ1Y3QgdGVraGV4X3N5bWJvbF9zdHJ1Y3QgKikgTlVMTDsKLSAgdGRhdGEtPmRhdGEgPSAoc3RydWN0IGRhdGFfc3RydWN0ICopIE5VTEw7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotICBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSBsb29rcyBsaWtlIGl0J3MgaW4gVGVrSGV4IGZvcm1hdC4gSnVzdCBsb29rCi0gIGZvciBhIHBlcmNlbnQgc2lnbiBhbmQgc29tZSBoZXggZGlnaXRzICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXRla2hleF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIGJbNF07Ci0KLSAgdGVraGV4X2luaXQgKCk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoYiwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoYlswXSAhPSAnJScgfHwgIUlTSEVYIChiWzFdKSB8fCAhSVNIRVggKGJbMl0pIHx8ICFJU0hFWCAoYlszXSkpCi0gICAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci0KLSAgdGVraGV4X21rb2JqZWN0IChhYmZkKTsKLQotICBwYXNzX292ZXIgKGFiZmQsIGZpcnN0X3BoYXNlKTsKLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tb3ZlX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9ucCwgb2Zmc2V0LCBjb3VudCwgZ2V0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb25wOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgIGJvb2xlYW4gZ2V0OwotewotICBiZmRfdm1hIGFkZHI7Ci0gIGNoYXIgKmxvY2F0aW9uID0gKGNoYXIgKikgbG9jYXRpb25wOwotICBiZmRfdm1hIHByZXZfbnVtYmVyID0gMTsJLyogTm90aGluZyBjYW4gaGF2ZSB0aGlzIGFzIGEgaGlnaCBiaXQqLwotICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKmQgPSAoc3RydWN0IGRhdGFfc3RydWN0ICopIE5VTEw7Ci0KLSAgZm9yIChhZGRyID0gc2VjdGlvbi0+dm1hOyBjb3VudCAhPSAwOyBjb3VudC0tLCBhZGRyKyspCi0gICAgewotCi0gICAgICBiZmRfdm1hIGNodW5rX251bWJlciA9IGFkZHIgJiB+Q0hVTktfTUFTSzsJLyogR2V0IGhpZ2ggYml0cyBvZiBhZGRyZXNzICovCi0gICAgICBiZmRfdm1hIGxvd19iaXRzID0gYWRkciAmIENIVU5LX01BU0s7Ci0KLSAgICAgIGlmIChjaHVua19udW1iZXIgIT0gcHJldl9udW1iZXIpCi0JewotCSAgLyogRGlmZmVyZW50IGNodW5rLCBzbyBtb3ZlIHBvaW50ZXIgKi8KLQkgIGQgPSBmaW5kX2NodW5rIChhYmZkLCBjaHVua19udW1iZXIpOwotCX0KLQotICAgICAgaWYgKGdldCkKLQl7Ci0JICBpZiAoZC0+Y2h1bmtfaW5pdFtsb3dfYml0c10pCi0JICAgIHsKLQkgICAgICAqbG9jYXRpb24gPSBkLT5jaHVua19kYXRhW2xvd19iaXRzXTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKmxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkLT5jaHVua19kYXRhW2xvd19iaXRzXSA9ICpsb2NhdGlvbjsKLQkgIGQtPmNodW5rX2luaXRbbG93X2JpdHNdID0gKCpsb2NhdGlvbiAhPSAwKTsKLQl9Ci0KLSAgICAgIGxvY2F0aW9uKys7Ci0KLSAgICB9Ci0KLX0KLQotc3RhdGljIGJvb2xlYW4KLXRla2hleF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb25wLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb25wOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChzZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpCi0gICAgewotICAgICAgbW92ZV9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbnAsIG9mZnNldCwgY291bnQsIHRydWUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdGVraGV4X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotfQotCi0vKiB3ZSBoYXZlIHRvIHNhdmUgdXAgYWxsIHRoZSBUZWtoZXhvcmRzIGZvciBhIHNwbHVyZ2UgYmVmb3JlIG91dHB1dCwKLSAgICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdGVraGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbnAsIG9mZnNldCwgYnl0ZXNfdG9fZG8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb25wOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgYnl0ZXNfdG9fZG87Ci17Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpCi0gICAgewotICAgICAgLyogVGhlIGZpcnN0IHRpbWUgYXJvdW5kLCBhbGxvY2F0ZSBlbm91Z2ggc2VjdGlvbnMgdG8gaG9sZCBhbGwgdGhlIGNodW5rcyAqLwotICAgICAgYXNlY3Rpb24gKnMgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgIGJmZF92bWEgdm1hOwotCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCi0JewotCSAgaWYgKHMtPmZsYWdzICYgU0VDX0xPQUQpCi0JICAgIHsKLQkgICAgICBmb3IgKHZtYSA9IHMtPnZtYSAmIH5DSFVOS19NQVNLOwotCQkgICB2bWEgPCBzLT52bWEgKyBzLT5fcmF3X3NpemU7Ci0JCSAgIHZtYSArPSBDSFVOS19NQVNLKQotCQlmaW5kX2NodW5rIChhYmZkLCB2bWEpOwotCSAgICB9Ci0JfQotCi0gICAgfQotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpKQotICAgIHsKLSAgICAgIG1vdmVfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb25wLCBvZmZzZXQsIGJ5dGVzX3RvX2RvLCBmYWxzZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0KLX0KLQotc3RhdGljIHZvaWQKLXdyaXRldmFsdWUgKGRzdCwgdmFsdWUpCi0gICAgIGNoYXIgKipkc3Q7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGNoYXIgKnAgPSAqZHN0OwotICBpbnQgbGVuOwotICBpbnQgc2hpZnQ7Ci0KLSAgZm9yIChsZW4gPSA4LCBzaGlmdCA9IDI4OyBzaGlmdDsgc2hpZnQgLT0gNCwgbGVuLS0pCi0gICAgewotICAgICAgaWYgKCh2YWx1ZSA+PiBzaGlmdCkgJiAweGYpCi0JewotCSAgKnArKyA9IGxlbiArICcwJzsKLQkgIHdoaWxlIChsZW4pCi0JICAgIHsKLQkgICAgICAqcCsrID0gZGlnc1sodmFsdWUgPj4gc2hpZnQpICYgMHhmXTsKLQkgICAgICBzaGlmdCAtPSA0OwotCSAgICAgIGxlbi0tOwotCSAgICB9Ci0JICAqZHN0ID0gcDsKLQkgIHJldHVybjsKLQotCX0KLSAgICB9Ci0gICpwKysgPSAnMSc7Ci0gICpwKysgPSAnMCc7Ci0gICpkc3QgPSBwOwotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVzeW0gKGRzdCwgc3ltKQotICAgICBjaGFyICoqZHN0OwotICAgICBDT05TVCBjaGFyICpzeW07Ci17Ci0gIGNoYXIgKnAgPSAqZHN0OwotICBpbnQgbGVuID0gKHN5bSA/IHN0cmxlbiAoc3ltKSA6IDApOwotCi0gIGlmIChsZW4gPj0gMTYpCi0gICAgewotICAgICAgKnArKyA9ICcwJzsKLSAgICAgIGxlbiA9IDE2OwotICAgIH0KLQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGxlbiA9PSAwKQotCXsKLQkgICpwKysgPSAnMSc7Ci0JICBzeW0gPSAiJCI7Ci0JICBsZW4gPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqcCsrID0gZGlnc1tsZW5dOwotCX0KLSAgICB9Ci0KLSAgd2hpbGUgKGxlbi0tKQotICAgIHsKLSAgICAgICpwKysgPSAqc3ltKys7Ci0gICAgfQotICAqZHN0ID0gcDsKLX0KLQotc3RhdGljIHZvaWQKLW91dCAoYWJmZCwgdHlwZSwgc3RhcnQsIGVuZCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqc3RhcnQ7Ci0gICAgIGNoYXIgKmVuZDsKLXsKLSAgaW50IHN1bSA9IDA7Ci0gIGNoYXIgKnM7Ci0gIGNoYXIgZnJvbnRbNl07Ci0gIGJmZF9zaXplX3R5cGUgd3JsZW47Ci0KLSAgZnJvbnRbMF0gPSAnJSc7Ci0gIFRPSEVYIChmcm9udCArIDEsIGVuZCAtIHN0YXJ0ICsgNSk7Ci0gIGZyb250WzNdID0gdHlwZTsKLQotICBmb3IgKHMgPSBzdGFydDsgcyA8IGVuZDsgcysrKQotICAgIHsKLSAgICAgIHN1bSArPSBzdW1fYmxvY2tbKHVuc2lnbmVkIGNoYXIpICpzXTsKLSAgICB9Ci0KLSAgc3VtICs9IHN1bV9ibG9ja1sodW5zaWduZWQgY2hhcikgZnJvbnRbMV1dOwkvKiAgbGVuZ3RoICovCi0gIHN1bSArPSBzdW1fYmxvY2tbKHVuc2lnbmVkIGNoYXIpIGZyb250WzJdXTsKLSAgc3VtICs9IHN1bV9ibG9ja1sodW5zaWduZWQgY2hhcikgZnJvbnRbM11dOwkvKiB0eXBlICovCi0gIFRPSEVYIChmcm9udCArIDQsIHN1bSk7Ci0gIGlmIChiZmRfd3JpdGUgKGZyb250LCAxLCA2LCBhYmZkKSAhPSA2KQotICAgIGFib3J0ICgpOwotICBlbmRbMF0gPSAnXG4nOwotICB3cmxlbiA9IGVuZCAtIHN0YXJ0ICsgMTsKLSAgaWYgKGJmZF93cml0ZSAoc3RhcnQsIDEsIHdybGVuLCBhYmZkKSAhPSB3cmxlbikKLSAgICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXRla2hleF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGJ5dGVzX3dyaXR0ZW47Ci0gIGNoYXIgYnVmZmVyWzEwMF07Ci0gIGFzeW1ib2wgKipwOwotICBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGRhdGFfc3RydWN0ICpkOwotCi0gIHRla2hleF9pbml0ICgpOwotCi0gIGJ5dGVzX3dyaXR0ZW4gPSAwOwotCi0gIC8qIEFuZCB0aGUgcmF3IGRhdGEgKi8KLSAgZm9yIChkID0gYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPmRhdGE7Ci0gICAgICAgZCAhPSAoc3RydWN0IGRhdGFfc3RydWN0ICopIE5VTEw7Ci0gICAgICAgZCA9IGQtPm5leHQpCi0gICAgewotICAgICAgaW50IGxvdzsKLQotICAgICAgQ09OU1QgaW50IHNwYW4gPSAzMjsKLSAgICAgIGludCBhZGRyOwotCi0gICAgICAvKiBXcml0ZSBpdCBpbiBibG9ja3Mgb2YgMzIgYnl0ZXMgKi8KLQotICAgICAgZm9yIChhZGRyID0gMDsgYWRkciA8IENIVU5LX01BU0sgKyAxOyBhZGRyICs9IHNwYW4pCi0JewotCSAgaW50IG5lZWQgPSAwOwotCi0JICAvKiBDaGVjayB0byBzZWUgaWYgbmVjZXNzYXJ5ICovCi0JICBmb3IgKGxvdyA9IDA7ICFuZWVkICYmIGxvdyA8IHNwYW47IGxvdysrKQotCSAgICB7Ci0JICAgICAgaWYgKGQtPmNodW5rX2luaXRbYWRkciArIGxvd10pCi0JCW5lZWQgPSAxOwotCSAgICB9Ci0JICBpZiAobmVlZCkKLQkgICAgewotCSAgICAgIGNoYXIgKmRzdCA9IGJ1ZmZlcjsKLQotCSAgICAgIHdyaXRldmFsdWUgKCZkc3QsIGFkZHIgKyBkLT52bWEpOwotCSAgICAgIGZvciAobG93ID0gMDsgbG93IDwgc3BhbjsgbG93KyspCi0JCXsKLQkJICBUT0hFWCAoZHN0LCBkLT5jaHVua19kYXRhW2FkZHIgKyBsb3ddKTsKLQkJICBkc3QgKz0gMjsKLQkJfQotCSAgICAgIG91dCAoYWJmZCwgJzYnLCBidWZmZXIsIGRzdCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKiB3cml0ZSBhbGwgdGhlIHNlY3Rpb24gaGVhZGVycyBmb3IgdGhlIHNlY3Rpb25zICovCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjaGFyICpkc3QgPSBidWZmZXI7Ci0KLSAgICAgIHdyaXRlc3ltICgmZHN0LCBzLT5uYW1lKTsKLSAgICAgICpkc3QrKyA9ICcxJzsKLSAgICAgIHdyaXRldmFsdWUgKCZkc3QsIHMtPnZtYSk7Ci0gICAgICB3cml0ZXZhbHVlICgmZHN0LCBzLT52bWEgKyBzLT5fcmF3X3NpemUpOwotICAgICAgb3V0IChhYmZkLCAnMycsIGJ1ZmZlciwgZHN0KTsKLSAgICB9Ci0KLSAgLyogQW5kIHRoZSBzeW1ib2xzICovCi0gIGlmIChhYmZkLT5vdXRzeW1ib2xzKQotICAgIHsKLSAgICAgIGZvciAocCA9IGFiZmQtPm91dHN5bWJvbHM7ICpwOyBwKyspCi0JewotCSAgaW50IHNlY3Rpb25fY29kZSA9IGJmZF9kZWNvZGVfc3ltY2xhc3MgKCpwKTsKLQotCSAgaWYgKHNlY3Rpb25fY29kZSAhPSAnPycpCi0JICAgIHsJCQkvKiBkbyBub3QgaW5jbHVkZSBkZWJ1ZyBzeW1ib2xzICovCi0JICAgICAgYXN5bWJvbCAqcyA9ICpwOwotCSAgICAgIGNoYXIgKmRzdCA9IGJ1ZmZlcjsKLQotCSAgICAgIHdyaXRlc3ltICgmZHN0LCBzLT5zZWN0aW9uLT5uYW1lKTsKLQotCSAgICAgIHN3aXRjaCAoc2VjdGlvbl9jb2RlKQotCQl7Ci0JCWNhc2UgJ0EnOgotCQkgICpkc3QrKyA9ICcyJzsKLQkJICBicmVhazsKLQkJY2FzZSAnYSc6Ci0JCSAgKmRzdCsrID0gJzYnOwotCQkgIGJyZWFrOwotCQljYXNlICdEJzoKLQkJY2FzZSAnQic6Ci0JCWNhc2UgJ08nOgotCQkgICpkc3QrKyA9ICc0JzsKLQkJICBicmVhazsKLQkJY2FzZSAnZCc6Ci0JCWNhc2UgJ2InOgotCQljYXNlICdvJzoKLQkJICAqZHN0KysgPSAnOCc7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1QnOgotCQkgICpkc3QrKyA9ICczJzsKLQkJICBicmVhazsKLQkJY2FzZSAndCc6Ci0JCSAgKmRzdCsrID0gJzcnOwotCQkgIGJyZWFrOwotCQljYXNlICdDJzoKLQkJY2FzZSAnVSc6Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICB3cml0ZXN5bSAoJmRzdCwgcy0+bmFtZSk7Ci0JICAgICAgd3JpdGV2YWx1ZSAoJmRzdCwgcy0+dmFsdWUgKyBzLT5zZWN0aW9uLT52bWEpOwotCSAgICAgIG91dCAoYWJmZCwgJzMnLCBidWZmZXIsIGRzdCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFuZCB0aGUgdGVybWluYXRvciAqLwotICBpZiAoYmZkX3dyaXRlICgiJTA3ODEwMTBcbiIsIDEsIDksIGFiZmQpICE9IDkpCi0gICAgYWJvcnQgKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci10ZWtoZXhfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjOwotCi17Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYXN5bWJvbCAqCi10ZWtoZXhfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdGVraGV4X3N5bWJvbF90eXBlICpuZXcgPQotICAodGVraGV4X3N5bWJvbF90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHRla2hleF9zeW1ib2xfc3RydWN0KSk7Ci0KLSAgaWYgKCFuZXcpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICBuZXctPnByZXYgPSAoc3RydWN0IHRla2hleF9zeW1ib2xfc3RydWN0ICopIE5VTEw7Ci0gIHJldHVybiAmKG5ldy0+c3ltYm9sKTsKLX0KLQotc3RhdGljIHZvaWQKLXRla2hleF9nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotc3RhdGljIHZvaWQKLXRla2hleF9wcmludF9zeW1ib2wgKGlnbm9yZV9hYmZkLCBmaWxlcCwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIFBUUiBmaWxlcDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgZmlsZXA7Ci0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgICAgewotCUNPTlNUIGNoYXIgKnNlY3Rpb25fbmFtZSA9IHN5bWJvbC0+c2VjdGlvbi0+bmFtZTsKLQotCWJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7Ci0KLQlmcHJpbnRmIChmaWxlLCAiICUtNXMgJXMiLAotCQkgc2VjdGlvbl9uYW1lLAotCQkgc3ltYm9sLT5uYW1lKTsKLSAgICAgIH0KLSAgICB9Ci19Ci0KLSNkZWZpbmUJdGVraGV4X2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSB0ZWtoZXhfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIHRla2hleF9uZXdfc2VjdGlvbl9ob29rIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rCi0KLSNkZWZpbmUgdGVraGV4X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgdGVraGV4X2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSB0ZWtoZXhfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgdGVraGV4X2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgdGVraGV4X3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgdGVraGV4X21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIHRla2hleF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIHRla2hleF9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIHRla2hleF9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgdGVraGV4X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIHRla2hleF9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSB0ZWtoZXhfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgdGVraGV4X2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi0jZGVmaW5lIHRla2hleF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLWNvbnN0IGJmZF90YXJnZXQgdGVraGV4X3ZlYyA9Ci17Ci0gICJ0ZWtoZXgiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF90ZWtoZXhfZmxhdm91ciwKLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoRVhFQ19QIHwJCQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19TWU1TIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19SRUxPQyB8IEhBU19MT0NBTFMgfAotICAgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAgewotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIHRla2hleF9vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICB0ZWtoZXhfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgYmZkX2ZhbHNlLAotICAgIHRla2hleF93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDICh0ZWtoZXgpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAodGVraGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHRla2hleCksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHRla2hleCksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL3RyYWQtY29yZS5jIGIvYmZkL3RyYWQtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWQ5MjBiLi4wMDAwMDAwCi0tLSBhL2JmZC90cmFkLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKiBCRkQgYmFjayBlbmQgZm9yIHRyYWRpdGlvbmFsIFVuaXggY29yZSBmaWxlcyAoVS1hcmVhIGFuZCByYXcgc2VjdGlvbnMpCi0gICBDb3B5cmlnaHQgMTk4OCwgODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBKb2huIEdpbG1vcmUgb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9kaXIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2luY2x1ZGUgPHN5cy91c2VyLmg+CQkvKiBBZnRlciBhLm91dC5oICAqLwotCi0jaWZkZWYgVFJBRF9IRUFERVIKLSNpbmNsdWRlIFRSQURfSEVBREVSCi0jZW5kaWYKLQotICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqZGF0YV9zZWN0aW9uOwotICAgICAgYXNlY3Rpb24gKnN0YWNrX3NlY3Rpb247Ci0gICAgICBhc2VjdGlvbiAqcmVnX3NlY3Rpb247Ci0gICAgICBzdHJ1Y3QgdXNlciB1OwotICAgIH07Ci0KLSNkZWZpbmUgY29yZV91cGFnZShiZmQpICgmKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dSkpCi0jZGVmaW5lIGNvcmVfZGF0YXNlYyhiZmQpICgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPmRhdGFfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9zdGFja3NlYyhiZmQpICgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnN0YWNrX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfcmVnc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+cmVnX3NlY3Rpb24pCi0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKnRyYWRfdW5peF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWNoYXIgKgkJdHJhZF91bml4X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1pbnQJCXRyYWRfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuCQl0cmFkX3VuaXhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0JCQkgUEFSQU1TICgoYmZkICpjb3JlX2JmZCwgYmZkICpleGVjX2JmZCkpOwotc3RhdGljIHZvaWQJc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEhhbmRsZSA0LjItc3R5bGUgKGFuZCBwZXJoYXBzIGFsc28gc3lzVi1zdHlsZSkgY29yZSBkdW1wIGZpbGUuICAqLwotCi0vKiBBUkdTVVNFRCAqLwotY29uc3QgYmZkX3RhcmdldCAqCi10cmFkX3VuaXhfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLQotewotICBpbnQgdmFsOwotICBzdHJ1Y3QgdXNlciB1OwotICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqcmF3cHRyOwotCi0jaWZkZWYgVFJBRF9DT1JFX1VTRVJfT0ZGU0VUCi0gIC8qIElmIGRlZmluZWQsIHRoaXMgbWFjcm8gaXMgdGhlIGZpbGUgcG9zaXRpb24gb2YgdGhlIHVzZXIgc3RydWN0LiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBUUkFEX0NPUkVfVVNFUl9PRkZTRVQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiAwOwotI2VuZGlmCi0gICAgCi0gIHZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSZ1LCAxLCBzaXplb2YgdSwgYWJmZCk7Ci0gIGlmICh2YWwgIT0gc2l6ZW9mIHUpCi0gICAgewotICAgICAgLyogVG9vIHNtYWxsIHRvIGJlIGEgY29yZSBmaWxlICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBTYW5pdHkgY2hlY2sgcGVyaGFwcz8/PyAqLwotICBpZiAodS51X2RzaXplID4gMHgxMDAwMDAwKQkvKiBSZW1lbWJlciwgaXQncyBpbiBwYWdlcy4uLiAqLwotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAodS51X3NzaXplID4gMHgxMDAwMDAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIENoZWNrIHRoYXQgdGhlIHNpemUgY2xhaW1lZCBpcyBubyBncmVhdGVyIHRoYW4gdGhlIGZpbGUgc2l6ZS4gICovCi0gIHsKLSAgICBGSUxFICpzdHJlYW0gPSBiZmRfY2FjaGVfbG9va3VwIChhYmZkKTsKLSAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKLSAgICAgIHJldHVybiAwOwotICAgIGlmIChmc3RhdCAoZmlsZW5vIChzdHJlYW0pLCAmc3RhdGJ1ZikgPCAwKQotICAgICAgewotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgaWYgKE5CUEcgKiAoVVBBR0VTICsgdS51X2RzaXplCi0jaWZkZWYgVFJBRF9DT1JFX0RTSVpFX0lOQ0xVREVTX1RTSVpFCi0JCS0gdS51X3RzaXplCi0jZW5kaWYKLQkJKyB1LnVfc3NpemUpID4gc3RhdGJ1Zi5zdF9zaXplKQotICAgICAgewotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0jaWZuZGVmIFRSQURfQ09SRV9BTExPV19BTllfRVhUUkFfU0laRQotICAgIGlmIChOQlBHICogKFVQQUdFUyArIHUudV9kc2l6ZSArIHUudV9zc2l6ZSkKLSNpZmRlZiBUUkFEX0NPUkVfRVhUUkFfU0laRV9BTExPV0VECi0JLyogU29tZSBzeXN0ZW1zIHdyaXRlIHRoZSBmaWxlIHRvbyBiaWcuICAqLwotCSsgVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRAotI2VuZGlmCi0JPCBzdGF0YnVmLnN0X3NpemUpCi0gICAgICB7Ci0JLyogVGhlIGZpbGUgaXMgdG9vIGJpZy4gIE1heWJlIGl0J3Mgbm90IGEgY29yZSBmaWxlCi0JICAgb3Igd2Ugb3RoZXJ3aXNlIGhhdmUgYmFkIHZhbHVlcyBmb3IgdV9kc2l6ZSBhbmQgdV9zc2l6ZSkuICAqLwotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiAwOwotICAgICAgfQotI2VuZGlmCi0gIH0KLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUgKHN1cmUsIHN1cmUpLiAgKi8KLQotICAvKiBBbGxvY2F0ZSBib3RoIHRoZSB1cGFnZSBhbmQgdGhlIHN0cnVjdCBjb3JlX2RhdGEgYXQgb25jZSwgc28KLSAgICAgYSBzaW5nbGUgZnJlZSgpIHdpbGwgZnJlZSB0aGVtIGJvdGguICAqLwotICByYXdwdHIgPSAoc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgKikKLQkJYmZkX3ptYWxsb2MgKHNpemVvZiAoc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QpKTsKLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAKLSAgYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEgPSByYXdwdHI7Ci0KLSAgcmF3cHRyLT51ID0gdTsgLypDb3B5IHRoZSB1YXJlYSBpbnRvIHRoZSB0ZGF0YSBwYXJ0IG9mIHRoZSBiZmQgKi8KLQotICAvKiBDcmVhdGUgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyByYXVuY2h5LCBidXQgYmZkX2Nsb3NlIHdhbnRzIHRvIGZyZWUKLSAgICAgdGhlbSBzZXBhcmF0ZWx5LiAgKi8KLQotICBjb3JlX3N0YWNrc2VjKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfc3RhY2tzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9kYXRhc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBjb3JlX3JlZ3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9yZWdzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPm5hbWUgPSAiLnN0YWNrIjsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+bmFtZSA9ICIuZGF0YSI7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+bmFtZSA9ICIucmVnIjsKLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLQotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSAgTkJQRyAqIHUudV9kc2l6ZQotI2lmZGVmIFRSQURfQ09SRV9EU0laRV9JTkNMVURFU19UU0laRQotICAgIC0gTkJQRyAqIHUudV90c2l6ZQotI2VuZGlmCi0gICAgICA7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBOQlBHICogdS51X3NzaXplOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IE5CUEcgKiBVUEFHRVM7IC8qIExhcmdlciB0aGFuIHNpemVvZiBzdHJ1Y3QgdSAqLwotCi0gIC8qIFdoYXQgYSBoYWNrLi4uIHdlJ2QgbGlrZSB0byBzdGVhbCBpdCBmcm9tIHRoZSBleGVjIGZpbGUsCi0gICAgIHNpbmNlIHRoZSB1cGFnZSBkb2VzIG5vdCBzZWVtIHRvIHByb3ZpZGUgaXQuICBGSVhNRS4gICovCi0jaWZkZWYgSE9TVF9EQVRBX1NUQVJUX0FERFIKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+dm1hID0gSE9TVF9EQVRBX1NUQVJUX0FERFI7Ci0jZWxzZQotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBIT1NUX1RFWFRfU1RBUlRfQUREUiArIChOQlBHICogdS51X3RzaXplKTsKLSNlbmRpZgotCi0jaWZkZWYgSE9TVF9TVEFDS19TVEFSVF9BRERSCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT52bWEgPSBIT1NUX1NUQUNLX1NUQVJUX0FERFI7Ci0jZWxzZQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+dm1hID0gSE9TVF9TVEFDS19FTkRfQUREUiAtIChOQlBHICogdS51X3NzaXplKTsKLSNlbmRpZgotCi0gIC8qIFRoaXMgaXMgdHJpY2t5LiAgQXMgdGhlICJyZWdpc3RlciBzZWN0aW9uIiwgd2UgZ2l2ZSB0aGVtIHRoZSBlbnRpcmUKLSAgICAgdXBhZ2UgYW5kIHN0YWNrLiAgdS51X2FyMCBwb2ludHMgdG8gd2hlcmUgInJlZ2lzdGVyIDAiIGlzIHN0b3JlZC4KLSAgICAgVGhlcmUgYXJlIHR3byB0cmlja3Mgd2l0aCB0aGlzLCB0aG91Z2guICBPbmUgaXMgdGhhdCB0aGUgcmVzdCBvZiB0aGUKLSAgICAgcmVnaXN0ZXJzIG1pZ2h0IGJlIGF0IHBvc2l0aXZlIG9yIG5lZ2F0aXZlIChvciBib3RoKSBkaXNwbGFjZW1lbnRzCi0gICAgIGZyb20gKnVfYXIwLiAgVGhlIG90aGVyIGlzIHRoYXQgdV9hcjAgaXMgc29tZXRpbWVzIGFuIGFic29sdXRlIGFkZHJlc3MKLSAgICAgaW4ga2VybmVsIG1lbW9yeSwgYW5kIG9uIG90aGVyIHN5c3RlbXMgaXQgaXMgYW4gb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZwotICAgICBvZiB0aGUgYHN0cnVjdCB1c2VyJy4KLSAgICAgCi0gICAgIEFzIGEgcHJhY3RpY2FsIG1hdHRlciwgd2UgZG9uJ3Qga25vdyB3aGVyZSB0aGUgcmVnaXN0ZXJzIGFjdHVhbGx5IGFyZSwKLSAgICAgc28gd2UgaGF2ZSB0byBwYXNzIHRoZSB3aG9sZSBhcmVhIHRvIEdEQi4gIFdlIGVuY29kZSB0aGUgdmFsdWUgb2YgdV9hcjAKLSAgICAgYnkgc2V0dGluZyB0aGUgLnJlZ3Mgc2VjdGlvbiB1cCBzbyB0aGF0IGl0cyB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzCi0gICAgIDAgaXMgYXQgdGhlIHBsYWNlIHBvaW50ZWQgdG8gYnkgdV9hcjAgKGJ5IHNldHRpbmcgdGhlIHZtYSBvZiB0aGUgc3RhcnQKLSAgICAgb2YgdGhlIHNlY3Rpb24gdG8gLXVfYXIwKS4gIEdEQiB1c2VzIHRoaXMgaW5mbyB0byBsb2NhdGUgdGhlIHJlZ3MsCi0gICAgIHVzaW5nIG1pbm9yIHRyaWNrZXJ5IHRvIGdldCBhcm91bmQgdGhlIG9mZnNldC1vci1hYnNvbHV0ZS1hZGRyIHByb2JsZW0uICovCi0gIGNvcmVfcmVnc2VjIChhYmZkKS0+dm1hID0gMCAtIChiZmRfdm1hKSB1LnVfYXIwOwotCi0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOQlBHICogVVBBR0VTOwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+ZmlsZXBvcyA9IChOQlBHICogVVBBR0VTKSArIE5CUEcgKiB1LnVfZHNpemUKLSNpZmRlZiBUUkFEX0NPUkVfRFNJWkVfSU5DTFVERVNfVFNJWkUKLSAgICAtIE5CUEcgKiB1LnVfdHNpemUKLSNlbmRpZgotICAgICAgOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZpbGVwb3MgPSAwOyAvKiBSZWdpc3RlciBzZWdtZW50IGlzIHRoZSB1cGFnZSAqLwotCi0gIC8qIEFsaWduIHRvIHdvcmQgYXQgbGVhc3QgKi8KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotICBhYmZkLT5zZWN0aW9ucyA9IGNvcmVfc3RhY2tzZWMgKGFiZmQpOwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfZGF0YXNlYyAoYWJmZCk7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPm5leHQgPSBjb3JlX3JlZ3NlYyAoYWJmZCk7Ci0gIGFiZmQtPnNlY3Rpb25fY291bnQgPSAzOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1jaGFyICoKLXRyYWRfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWZuZGVmIE5PX0NPUkVfQ09NTUFORAotICBjaGFyICpjb20gPSBhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X2NvbW07Ci0gIGlmICgqY29tKQotICAgIHJldHVybiBjb207Ci0gIGVsc2UKLSNlbmRpZgotICAgIHJldHVybiAwOwotfQotCi0vKiBBUkdTVVNFRCAqLwotaW50Ci10cmFkX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLXsKLSNpZmRlZiBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMCi0gIHJldHVybiBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGlnbm9yZV9hYmZkKTsKLSNlbHNlCi0gIHJldHVybiAtMTsJCS8qIEZJWE1FLCB3aGVyZSBpcyBpdD8gKi8KLSNlbmRpZgotfQotCi0vKiBBUkdTVVNFRCAqLwotYm9vbGVhbgotdHJhZF91bml4X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsJCS8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KLX0KLQwKLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IHRyYWRfY29yZV92ZWMgPQotICB7Ci0gICAgInRyYWQtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIHRyYWRfdW5peF9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKHRyYWRfdW5peCksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL3ZheG5ldGJzZC5jIGIvYmZkL3ZheG5ldGJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTM3ZDA5Li4wMDAwMDAwCi0tLSBhL2JmZC92YXhuZXRic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTmV0QlNEL1ZBWCBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJNAotI3VuZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTEwMjQKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLQotI2RlZmluZQlERUZBVUxUX0FSQ0gJYmZkX2FyY2hfdmF4Ci0jZGVmaW5lCURFRkFVTFRfTUlEIAlNX1ZBWF9ORVRCU0QKLQotI2RlZmluZSBNWShPUCkgQ0FUKHZheG5ldGJzZF8sT1ApCi0vKiBUaGlzIG5lZWRzIHRvIHN0YXJ0IHdpdGggYS5vdXQgc28gR0RCIGtub3dzIGl0IGlzIGFuIGEub3V0IHZhcmlhbnQuICAqLwotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC12YXgtbmV0YnNkIgotCi0jaW5jbHVkZSAibmV0YnNkLmgiCmRpZmYgLS1naXQgYS9iZmQvdmVyc2Fkb3MuYyBiL2JmZC92ZXJzYWRvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGNkMTA4Li4wMDAwMDAwCi0tLSBhL2JmZC92ZXJzYWRvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTIzICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgVkVSU0Fkb3MtRSBvYmplY3RzLgotICAgQ29weXJpZ2h0IDE5OTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCA8c2FjQGN5Z251cy5jb20+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+dGFyZ2V0X2luZGV4KS5jb250ZW50cyArIG9mZnNldCwKLQkgIChzaXplX3QpIGNvdW50KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSB2ZXJzYWRvc19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLXN0YXRpYyBib29sZWFuCi12ZXJzYWRvc19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgYnl0ZXNfdG9fZG8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBieXRlc190b19kbzsKLXsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qQVJHU1VTRUQgKi8KLXN0YXRpYyBpbnQKLXZlcnNhZG9zX3NpemVvZl9oZWFkZXJzIChhYmZkLCBleGVjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZXhlYzsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLXZlcnNhZG9zX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQgdG8gcmVhZCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXZlcnNhZG9zX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSArIDEpICogc2l6ZW9mIChhc3ltYm9sICopOwotfQotCi0vKiBSZXR1cm4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi12ZXJzYWRvc19nZXRfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKLXsKLSAgdW5zaWduZWQgaW50IHN5bWNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBpOwotICBhc3ltYm9sICpzOwotCi0gIHZlcnNhZG9zX3Bhc3NfMiAoYWJmZCk7Ci0KLSAgZm9yIChpID0gMCwgcyA9IFZEQVRBIChhYmZkKS0+c3ltYm9sczsKLSAgICAgICBpIDwgc3ltY291bnQ7Ci0gICAgICAgcysrLCBpKyspCi0gICAgewotICAgICAgKmFsb2NhdGlvbisrID0gczsKLSAgICB9Ci0KLSAgKmFsb2NhdGlvbiA9IE5VTEw7Ci0KLSAgcmV0dXJuIHN5bWNvdW50OwotfQotCi0vKkFSR1NVU0VEICovCi12b2lkCi12ZXJzYWRvc19nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotLypBUkdTVVNFRCAqLwotdm9pZAotdmVyc2Fkb3NfcHJpbnRfc3ltYm9sIChpZ25vcmVfYWJmZCwgYWZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOwotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICUtNXMgJXMiLAotCSAgICAgICBzeW1ib2wtPnNlY3Rpb24tPm5hbWUsCi0JICAgICAgIHN5bWJvbC0+bmFtZSk7Ci0KLSAgICB9Ci19Ci0KLWxvbmcKLXZlcnNhZG9zX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgcmV0dXJuIChhc2VjdC0+cmVsb2NfY291bnQgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKLX0KLQotCi1sb25nCi12ZXJzYWRvc19jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGFyZWxlbnQgKnNyYzsKLQotICB2ZXJzYWRvc19wYXNzXzIgKGFiZmQpOwotICBzcmMgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICBpZiAoIUVEQVRBIChhYmZkLCBzZWN0aW9uLT50YXJnZXRfaW5kZXgpLmRvbmVyZWwpCi0gICAgewotICAgICAgRURBVEEgKGFiZmQsIHNlY3Rpb24tPnRhcmdldF9pbmRleCkuZG9uZXJlbCA9IDE7Ci0gICAgICAvKiB0cmFuc2xhdGUgZnJvbSBpbmRleGVzIHRvIHN5bXB0ciBwdHJzICovCi0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKLQl7Ci0JICBpbnQgZXNkaWQgPSAoaW50KSBzcmNbY291bnRdLnN5bV9wdHJfcHRyOwotCi0JICBpZiAoZXNkaWQgPT0gMCkKLQkgICAgewotCSAgICAgIHNyY1tjb3VudF0uc3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGVzZGlkIDwgRVNfQkFTRSkJLyogU2VjdGlvbiByZWxhdGl2ZSB0aGluZyAqLwotCSAgICB7Ci0JICAgICAgc3RydWN0IGVzZGlkICplID0gJkVEQVRBIChhYmZkLCBlc2RpZCAtIDEpOwotCSAgICAgIGlmICghc2VjdGlvbikKLQkJewotCQkgLyoqIHJlbG9jYXRpb24gcmVsYXRpdmUgdG8gc2VjdGlvbiB3aGljaCB3YXMKLQkJICAgbmV2ZXIgZGVjbGFyZWQgISAqLwotCQl9Ci0JICAgICAgc3JjW2NvdW50XS5zeW1fcHRyX3B0ciA9IGUtPnNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzcmNbY291bnRdLnN5bV9wdHJfcHRyID0gc3ltYm9scyArIGVzZGlkIC0gRVNfQkFTRTsKLQkgICAgfQotCi0JfQotICAgIH0KLQotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKLSAgICB7Ci0gICAgICAqcmVscHRyKysgPSBzcmMrKzsKLSAgICB9Ci0gICpyZWxwdHIgPSAwOwotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLSNkZWZpbmUJdmVyc2Fkb3NfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIHZlcnNhZG9zX2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSB2ZXJzYWRvc19uZXdfc2VjdGlvbl9ob29rIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rCi0KLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSB2ZXJzYWRvc19nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgdmVyc2Fkb3NfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSB2ZXJzYWRvc19yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIHZlcnNhZG9zX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIHZlcnNhZG9zX2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIHZlcnNhZG9zX3NldF9hcmNoX21hY2ggYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaAotCi0jZGVmaW5lIHZlcnNhZG9zX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSB2ZXJzYWRvc19iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgdmVyc2Fkb3NfdmVjID0KLXsKLSAgInZlcnNhZG9zIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfdmVyc2Fkb3NfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHsKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICB2ZXJzYWRvc19vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICB2ZXJzYWRvc19ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX2ZhbHNlLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAodmVyc2Fkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAodmVyc2Fkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHZlcnNhZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHZlcnNhZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAodmVyc2Fkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC92bXMtZ3NkLmMgYi9iZmQvdm1zLWdzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTUyNDYyLi4wMDAwMDAwCi0tLSBhL2JmZC92bXMtZ3NkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MjAgKzAsMCBAQAotLyogdm1zLWdzZC5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVkFYIChvcGVuVk1TL1ZBWCkgYW5kCi0gICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBJbmMuCi0KLSAgIGdvIGFuZCByZWFkIHRoZSBvcGVuVk1TIGxpbmtlciBtYW51YWwgKGVzcC4gYXBwZW5kaXggQikKLSAgIGlmIHlvdSBkb24ndCBrbm93IHdoYXQncyBnb2luZyBvbiBoZXJlIDotKQotCi0gICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJ2bXMuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHR5cGljYWwgc2VjdGlvbnMgZm9yIHZheCBvYmplY3QgZmlsZXMgICovCi0KLSNkZWZpbmUgVkFYX0NPREVfTkFNRQkJIiRDT0RFIgotI2RlZmluZSBWQVhfREFUQV9OQU1FCQkiJERBVEEiCi0jZGVmaW5lIFZBWF9BRERSRVNTX0RBVEFfTkFNRQkiJEFERFJFU1NfREFUQSIKLQotLyogdHlwaWNhbCBzZWN0aW9ucyBmb3IgZXZheCBvYmplY3QgZmlsZXMgICovCi0KLSNkZWZpbmUgRVZBWF9BQlNfTkFNRQkJIiRBQlMkIgotI2RlZmluZSBFVkFYX0NPREVfTkFNRQkJIiRDT0RFJCIKLSNkZWZpbmUgRVZBWF9MSU5LX05BTUUJCSIkTElOSyQiCi0jZGVmaW5lIEVWQVhfREFUQV9OQU1FCQkiJERBVEEkIgotI2RlZmluZSBFVkFYX0JTU19OQU1FCQkiJEJTUyQiCi0jZGVmaW5lIEVWQVhfUkVBRE9OTFlBRERSX05BTUUJIiRSRUFET05MWV9BRERSJCIKLSNkZWZpbmUgRVZBWF9SRUFET05MWV9OQU1FCSIkUkVBRE9OTFkkIgotI2RlZmluZSBFVkFYX0xJVEVSQUxfTkFNRQkiJExJVEVSQUwkIgotI2RlZmluZSBFVkFYX0NPTU1PTl9OQU1FCSIkQ09NTU9OJCIKLSNkZWZpbmUgRVZBWF9MT0NBTF9OQU1FCQkiJExPQ0FMJCIKLQotc3RydWN0IHNlY19mbGFnc19zdHJ1Y3QgewotICBjaGFyICpuYW1lOwkJCS8qIG5hbWUgb2Ygc2VjdGlvbiAqLwotICBpbnQgdmZsYWdzX2Fsd2F5czsKLSAgZmxhZ3dvcmQgZmxhZ3NfYWx3YXlzOwkvKiBmbGFncyB3ZSBzZXQgYWx3YXlzICovCi0gIGludCB2ZmxhZ3NfaGFzc2l6ZTsKLSAgZmxhZ3dvcmQgZmxhZ3NfaGFzc2l6ZTsJLyogZmxhZ3Mgd2Ugc2V0IGlmIHRoZSBzZWN0aW9uIGhhcyBhIHNpemUgPiAwICovCi19OwotCi0vKiBUaGVzZSBmbGFncyBhcmUgZGVjY3J0bC92YXhjcnRsIChvcGVuVk1TIDYuMiBWQVgpIGNvbXBhdGlibGUgICovCi0KLXN0YXRpYyBzdHJ1Y3Qgc2VjX2ZsYWdzX3N0cnVjdCB2YXhfc2VjdGlvbl9mbGFnc1tdID0gewotICB7IFZBWF9DT0RFX05BTUUsCi0JKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fU0hSfEdQU19TX01fRVhFfEdQU19TX01fUkQpLAotCShTRUNfQ09ERSksCi0JKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fU0hSfEdQU19TX01fRVhFfEdQU19TX01fUkQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19DT0RFfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IFZBWF9EQVRBX05BTUUsCi0JKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fUkR8R1BTX1NfTV9XUlQpLAotCShTRUNfREFUQSksCi0JKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fUkR8R1BTX1NfTV9XUlQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IFZBWF9BRERSRVNTX0RBVEFfTkFNRSwKLQkoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9SRCksCi0JKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCi0JKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fUkQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19SRUFET05MWXxTRUNfTE9BRCkgfSwKLSAgeyBOVUxMLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX09WUnxHUFNfU19NX1JFTHxHUFNfU19NX0dCTHxHUFNfU19NX1JEfEdQU19TX01fV1JUKSwKLQkoU0VDX0RBVEEpLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX09WUnxHUFNfU19NX1JFTHxHUFNfU19NX0dCTHxHUFNfU19NX1JEfEdQU19TX01fV1JUKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfQotfTsKLQotCi0vKiBUaGVzZSBmbGFncyBhcmUgZGVjY3J0bC92YXhjcnRsIChvcGVuVk1TIDYuMiBBbHBoYSkgY29tcGF0aWJsZSAgKi8KLQotc3RhdGljIHN0cnVjdCBzZWNfZmxhZ3Nfc3RydWN0IGV2YXhfc2VjdGlvbl9mbGFnc1tdID0gewotICB7IEVWQVhfQUJTX05BTUUsCi0JKEVHUFNfU19WX1NIUiksCi0JKFNFQ19EQVRBKSwKLQkoRUdQU19TX1ZfU0hSKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX0NPREVfTkFNRSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9TSFJ8RUdQU19TX1ZfRVhFKSwKLQkoU0VDX0NPREUpLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1NIUnxFR1BTX1NfVl9FWEUpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19DT0RFfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfTElURVJBTF9OQU1FLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1NIUnxFR1BTX1NfVl9SRHxFR1BTX1NfVl9OT01PRCksCi0JKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfU0hSfEVHUFNfU19WX1JEKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfUkVBRE9OTFl8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9MSU5LX05BTUUsCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRCksCi0JKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX1JFQURPTkxZfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfREFUQV9OQU1FLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUfEVHUFNfU19WX05PTU9EKSwKLQkoU0VDX0RBVEEpLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX0JTU19OQU1FLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUfEVHUFNfU19WX05PTU9EKSwKLQkoU0VDX05PX0ZMQUdTKSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVHxFR1BTX1NfVl9OT01PRCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9SRUFET05MWUFERFJfTkFNRSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRCksCi0JKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19SRUFET05MWXxTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX1JFQURPTkxZX05BTUUsCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfU0hSfEVHUFNfU19WX1JEfEVHUFNfU19WX05PTU9EKSwKLQkoU0VDX0RBVEF8U0VDX1JFQURPTkxZKSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9TSFJ8RUdQU19TX1ZfUkQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19SRUFET05MWXxTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX0xPQ0FMX05BTUUsCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAotCShTRUNfREFUQSksCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IE5VTEwsCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAotCShTRUNfREFUQSksCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9Ci19OwotCi0vKiBSZXRyaWV2ZSBiZmQgc2VjdGlvbiBmbGFncyBieSBuYW1lIGFuZCBzaXplICAqLwotCi1zdGF0aWMgZmxhZ3dvcmQKLXZtc19zZWNmbGFnX2J5X25hbWUgKGFiZmQsIHNlY3Rpb25fZmxhZ3MsIG5hbWUsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHNlY19mbGFnc19zdHJ1Y3QgKnNlY3Rpb25fZmxhZ3M7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgaSA9IDA7Ci0KLSAgd2hpbGUgKHNlY3Rpb25fZmxhZ3NbaV0ubmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICgoUFJJVihpc192YXgpPwotCSAgICBzdHJjYXNlY21wIChuYW1lLCBzZWN0aW9uX2ZsYWdzW2ldLm5hbWUpOgotCSAgICBzdHJjbXAgKG5hbWUsIHNlY3Rpb25fZmxhZ3NbaV0ubmFtZSkpID09IDApCi0JewotCSAgaWYgKHNpemUgPiAwKQotCSAgICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS5mbGFnc19oYXNzaXplOwotCSAgZWxzZQotCSAgICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS5mbGFnc19hbHdheXM7Ci0JfQotICAgICAgaSsrOwotICAgIH0KLSAgaWYgKHNpemUgPiAwKQotICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLmZsYWdzX2hhc3NpemU7Ci0gIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLmZsYWdzX2Fsd2F5czsKLX0KLQotCi0vKiBSZXRyaWV2ZSB2bXMgc2VjdGlvbiBmbGFncyBieSBuYW1lIGFuZCBzaXplICAqLwotCi1zdGF0aWMgZmxhZ3dvcmQKLXZtc19lc2VjZmxhZ19ieV9uYW1lIChzZWN0aW9uX2ZsYWdzLCBuYW1lLCBzaXplKQotICAgICBzdHJ1Y3Qgc2VjX2ZsYWdzX3N0cnVjdCAqc2VjdGlvbl9mbGFnczsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBpID0gMDsKLQotICB3aGlsZSAoc2VjdGlvbl9mbGFnc1tpXS5uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgc2VjdGlvbl9mbGFnc1tpXS5uYW1lKSA9PSAwKQotCXsKLQkgIGlmIChzaXplID4gMCkKLQkgICAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0udmZsYWdzX2hhc3NpemU7Ci0JICBlbHNlCi0JICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLnZmbGFnc19hbHdheXM7Ci0JfQotICAgICAgaSsrOwotICAgIH0KLSAgaWYgKHNpemUgPiAwKQotICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLnZmbGFnc19oYXNzaXplOwotICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS52ZmxhZ3NfYWx3YXlzOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiBWTVNfREVCVUcKLS8qIGRlYnVnICovCi0KLXN0cnVjdCBmbGFnZGVzY3N0cnVjdCB7IGNoYXIgKm5hbWU7IGZsYWd3b3JkIHZhbHVlOyB9OwotCi0vKiBDb252ZXJ0IGZsYWcgdG8gcHJpbnRhYmxlIHN0cmluZyAgKi8KLQotc3RhdGljIGNoYXIgKgotZmxhZzJzdHIoZmxhZ2Rlc2MsIGZsYWdzKQotICAgICBzdHJ1Y3QgZmxhZ2Rlc2NzdHJ1Y3QgKmZsYWdkZXNjOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLQotICBzdGF0aWMgY2hhciByZXNbNjRdOwotICBpbnQgbmV4dCA9IDA7Ci0KLSAgcmVzWzBdID0gMDsKLSAgd2hpbGUgKGZsYWdkZXNjLT5uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKChmbGFncyAmIGZsYWdkZXNjLT52YWx1ZSkgIT0gMCkKLQl7Ci0JICBpZiAobmV4dCkKLQkgICAgc3RyY2F0KHJlcywgIiwiKTsKLQkgIGVsc2UKLQkgICAgbmV4dCA9IDE7Ci0JICBzdHJjYXQgKHJlcywgZmxhZ2Rlc2MtPm5hbWUpOwotCX0KLSAgICAgIGZsYWdkZXNjKys7Ci0gICAgfQotICByZXR1cm4gcmVzOwotfQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogaW5wdXQgcm91dGluZXMgKi8KLQotLyogUHJvY2VzcyBHU0QvRUdTRCByZWNvcmQKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX2dzZCAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgc3RhdGljIHN0cnVjdCBmbGFnZGVzY3N0cnVjdCBncHNmbGFnZGVzY1tdID0KLSAgewotICAgIHsgIlBJQyIsIDB4MDAwMSB9LAotICAgIHsgIkxJQiIsIDB4MDAwMiB9LAotICAgIHsgIk9WUiIsIDB4MDAwNCB9LAotICAgIHsgIlJFTCIsIDB4MDAwOCB9LAotICAgIHsgIkdCTCIsIDB4MDAxMCB9LAotICAgIHsgIlNIUiIsIDB4MDAyMCB9LAotICAgIHsgIkVYRSIsIDB4MDA0MCB9LAotICAgIHsgIlJEIiwgIDB4MDA4MCB9LAotICAgIHsgIldSVCIsIDB4MDEwMCB9LAotICAgIHsgIlZFQyIsIDB4MDIwMCB9LAotICAgIHsgIk5PTU9EIiwgMHgwNDAwIH0sCi0gICAgeyAiQ09NIiwgMHgwODAwIH0sCi0gICAgeyBOVUxMLCAwIH0KLSAgfTsKLQotICBzdGF0aWMgc3RydWN0IGZsYWdkZXNjc3RydWN0IGdzeWZsYWdkZXNjW10gPQotICB7Ci0gICAgeyAiV0VBSyIsIDB4MDAwMSB9LAotICAgIHsgIkRFRiIsICAweDAwMDIgfSwKLSAgICB7ICJVTkkiLCAgMHgwMDA0IH0sCi0gICAgeyAiUkVMIiwgIDB4MDAwOCB9LAotICAgIHsgIkNPTU0iLCAweDAwMTAgfSwKLSAgICB7ICJWRUNFUCIsIDB4MDAyMCB9LAotICAgIHsgIk5PUk0iLCAweDAwNDAgfSwKLSAgICB7IE5VTEwsIDAgfQotICB9OwotI2VuZGlmCi0KLSAgaW50IGdzZF90eXBlLCBnc2Rfc2l6ZTsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7Ci0gIGZsYWd3b3JkIG5ld19mbGFncywgb2xkX2ZsYWdzOwotICBjaGFyICpuYW1lOwotICBhc3ltYm9sICpzeW1ib2w7Ci0gIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotICB1bnNpZ25lZCBsb25nIGJhc2VfYWRkcjsKLSAgdW5zaWduZWQgbG9uZyBhbGlnbl9hZGRyOwotICBzdGF0aWMgaW50IHBzZWN0X2lkeCA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgyLCAiR1NEL0VHU0QgKCVkLyV4KVxuIiwgb2JqdHlwZSwgb2JqdHlwZSk7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKG9ianR5cGUpCi0gICAgewotICAgICAgY2FzZSBFT0JKX1NfQ19FR1NEOgotIAlQUklWKHZtc19yZWMpICs9IDg7CS8qIHNraXAgdHlwZSwgc2l6ZSwgbF90ZW1wICovCi0JUFJJVihyZWNfc2l6ZSkgLT0gODsKLQlicmVhazsKLSAgICAgIGNhc2UgT0JKX1NfQ19HU0Q6Ci0JUFJJVih2bXNfcmVjKSArPSAxOwotCVBSSVYocmVjX3NpemUpIC09IDE7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogY2FsY3VsYXRlIGJhc2UgYWRkcmVzcyBmb3IgZWFjaCBzZWN0aW9uICAqLwotICBiYXNlX2FkZHIgPSAwTDsKLQotICBhYmZkLT5zeW1jb3VudCA9IDA7Ci0KLSAgd2hpbGUgKFBSSVYocmVjX3NpemUpID4gMCkKLSAgICB7Ci0gICAgICB2bXNfcmVjID0gUFJJVih2bXNfcmVjKTsKLQotICAgICAgaWYgKG9ianR5cGUgPT0gT0JKX1NfQ19HU0QpCi0JewotCSAgZ3NkX3R5cGUgPSAqdm1zX3JlYzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgX2JmZF92bXNfZ2V0X2hlYWRlcl92YWx1ZXMgKGFiZmQsIHZtc19yZWMsICZnc2RfdHlwZSwgJmdzZF9zaXplKTsKLQkgIGdzZF90eXBlICs9IEVWQVhfT0ZGU0VUOwotCX0KLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDMsICJnc2RfdHlwZSAlZFxuIiwgZ3NkX3R5cGUpOwotI2VuZGlmCi0KLSAgICAgIHN3aXRjaCAoZ3NkX3R5cGUpCi0JewotCSAgY2FzZSBHU0RfU19DX1BTQzoKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogcHJvZ3JhbSBzZWN0aW9uIGRlZmluaXRpb24KLQkgICAgICAgKi8KLQotCSAgICAgIGFzZWN0aW9uICpvbGRfc2VjdGlvbiA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg0LCAiR1NEX1NfQ19QU0NcbiIpOwotI2VuZGlmCi0JICAgICAgLyogSWYgdGhpcyBzZWN0aW9uIGlzbid0IGEgYmZkIHNlY3Rpb24uICAqLwotCi0JICAgICAgaWYgKFBSSVYoaXNfdmF4KSAmJiAocHNlY3RfaWR4IDwgKGFiZmQtPnNlY3Rpb25fY291bnQtMSkpKQotCQl7Ci0JCSAgLyogY2hlY2sgZm9yIHRlbXBvcmFyeSBzZWN0aW9uIGZyb20gVElSIHJlY29yZC4gICovCi0KLQkJICBpZiAocHNlY3RfaWR4IDwgUFJJVihzZWN0aW9uX2NvdW50KSkKLQkJICAgIG9sZF9zZWN0aW9uID0gUFJJVihzZWN0aW9ucylbcHNlY3RfaWR4XTsKLQkJICBlbHNlCi0JCSAgICBvbGRfc2VjdGlvbiA9IDA7Ci0JCX0KLQotCSAgICAgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjICsgOCk7Ci0JICAgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotCSAgICAgIGlmICghc2VjdGlvbikKLQkJewotCQkgIGZwcmludGYgKHN0ZGVyciwgImJmZF9tYWtlX3NlY3Rpb24gKCVzKSBmYWlsZWRcbiIsIG5hbWUpOwotCQkgIHJldHVybiAtMTsKLQkJfQotCSAgICAgIG9sZF9mbGFncyA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyAyKTsKLQkgICAgICBzZWN0aW9uLT5fcmF3X3NpemUgPSBiZmRfZ2V0bDMyKHZtc19yZWMgKyA0KTsJLyogYWxsb2NhdGlvbiAqLwotCSAgICAgIG5ld19mbGFncyA9IHZtc19zZWNmbGFnX2J5X25hbWUgKGFiZmQsIHZheF9zZWN0aW9uX2ZsYWdzLCBuYW1lLCBzZWN0aW9uLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChvbGRfZmxhZ3MgJiBFR1BTX1NfVl9SRUwpCi0JCW5ld19mbGFncyB8PSBTRUNfUkVMT0M7Ci0JICAgICAgaWYgKG9sZF9mbGFncyAmIEdQU19TX01fT1ZSKQotCQluZXdfZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLQkgICAgICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbiwgbmV3X2ZsYWdzKSkKLQkJewotCQkgIGZwcmludGYgKHN0ZGVyciwgImJmZF9zZXRfc2VjdGlvbl9mbGFncyAoJXMsICV4KSBmYWlsZWRcbiIsIG5hbWUsIG5ld19mbGFncyk7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0JICAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gdm1zX3JlY1sxXTsKLQkgICAgICBhbGlnbl9hZGRyID0gKDEgPDwgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKTsKLQkgICAgICBpZiAoKGJhc2VfYWRkciAlIGFsaWduX2FkZHIpICE9IDApCi0JCWJhc2VfYWRkciArPSAoYWxpZ25fYWRkciAtIChiYXNlX2FkZHIgJSBhbGlnbl9hZGRyKSk7Ci0JICAgICAgc2VjdGlvbi0+dm1hID0gKGJmZF92bWEpYmFzZV9hZGRyOwotCSAgICAgIGJhc2VfYWRkciArPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0KLQkgICAgICAvKiBnbG9iYWwgc2VjdGlvbiBpcyBjb21tb24gc3ltYm9sICAqLwotCi0JICAgICAgaWYgKG9sZF9mbGFncyAmIEdQU19TX01fR0JMKQotCQl7Ci0JCSAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpOwotCQkgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQkgICAgICByZXR1cm4gLTE7Ci0JCSAgICB9Ci0JCSAgc3ltYm9sID0gZW50cnktPnN5bWJvbDsKLQotCQkgIHN5bWJvbC0+dmFsdWUgPSAwOwotCQkgIHN5bWJvbC0+c2VjdGlvbiA9IHNlY3Rpb247Ci0JCSAgc3ltYm9sLT5mbGFncyA9IChCU0ZfR0xPQkFMfEJTRl9TRUNUSU9OX1NZTXxCU0ZfT0xEX0NPTU1PTik7Ci0JCX0KLQotCSAgICAgIC8qIGNvcHkgc2F2ZWQgY29udGVudHMgaWYgb2xkX3NlY3Rpb24gc2V0ICAqLwotCi0JICAgICAgaWYgKG9sZF9zZWN0aW9uICE9IDApCi0JCXsKLQkJICBzZWN0aW9uLT5jb250ZW50cyA9IG9sZF9zZWN0aW9uLT5jb250ZW50czsKLQkJICBpZiAoc2VjdGlvbi0+X3Jhd19zaXplIDwgb2xkX3NlY3Rpb24tPl9yYXdfc2l6ZSkKLQkJICAgIHsKLQkJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiU2l6ZSBtaXNtYXRjaCBzZWN0aW9uICVzPSVkLCAlcz0lZFxuIiwgb2xkX3NlY3Rpb24tPm5hbWUsIG9sZF9zZWN0aW9uLT5fcmF3X3NpemUsIHNlY3Rpb24tPm5hbWUsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCSAgICAgIHJldHVybiAtMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzZWN0aW9uLT5fcmF3X3NpemUgPiBvbGRfc2VjdGlvbi0+X3Jhd19zaXplKQotCQkgICAgewotCQkgICAgICBzZWN0aW9uLT5jb250ZW50cyA9ICgodW5zaWduZWQgY2hhciAqKQotCQkJCSAgICBiZmRfcmVhbGxvYyAob2xkX3NlY3Rpb24tPmNvbnRlbnRzLCBzZWN0aW9uLT5fcmF3X3NpemUpKTsKLQkJICAgICAgaWYgKHNlY3Rpb24tPmNvbnRlbnRzID09IE5VTEwpCi0JCQl7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQkJICByZXR1cm4gLTE7Ci0JCSAgICAgICAgfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc2VjdGlvbi0+Y29udGVudHMgPSAoKHVuc2lnbmVkIGNoYXIgKikKLQkJCQkJYmZkX21hbGxvYyAoc2VjdGlvbi0+X3Jhd19zaXplKSk7Ci0JCSAgaWYgKHNlY3Rpb24tPmNvbnRlbnRzID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQkgICAgICByZXR1cm4gLTE7Ci0JCSAgICB9Ci0JCSAgbWVtc2V0IChzZWN0aW9uLT5jb250ZW50cywgMCwgKHNpemVfdClzZWN0aW9uLT5fcmF3X3NpemUpOwotCQl9Ci0JICAgICAgc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOwotI2lmIFZNU19ERUJVRwotCSAgICAgIHZtc19kZWJ1ZyAoNCwgImdzZCBwc2MgJWQgKCVzLCBmbGFncyAlMDR4PSVzKSAiLAotCQkJIHNlY3Rpb24tPmluZGV4LCBuYW1lLCBvbGRfZmxhZ3MsIGZsYWcyc3RyIChncHNmbGFnZGVzYywgb2xkX2ZsYWdzKSk7Ci0JICAgICAgdm1zX2RlYnVnICg0LCAiJWQgYnl0ZXMgYXQgMHglMDhseCAobWVtICVwKVxuIiwKLQkJCSBzZWN0aW9uLT5fcmF3X3NpemUsIHNlY3Rpb24tPnZtYSwgc2VjdGlvbi0+Y29udGVudHMpOwotI2VuZGlmCi0KLQkgICAgICBnc2Rfc2l6ZSA9IHZtc19yZWNbOF0gKyA5OwotCi0JICAgICAgcHNlY3RfaWR4Kys7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JICBjYXNlIEdTRF9TX0NfRVBNOgotCSAgY2FzZSBHU0RfU19DX0VQTVc6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIGVwbVxuIik7Ci0jZW5kaWYKLQkgIC8qRkFMTFRIUlUqLwotCSAgY2FzZSBHU0RfU19DX1NZTToKLQkgIGNhc2UgR1NEX1NfQ19TWU1XOgotCSAgICB7Ci0JICAgICAgaW50IG5hbWVfb2Zmc2V0LCB2YWx1ZV9vZmZzZXQ7Ci0KLQkgICAgICAvKgotCSAgICAgICAqIHN5bWJvbCBzcGVjaWZpY2F0aW9uIChkZWZpbml0aW9uIG9yIHJlZmVyZW5jZSkKLQkgICAgICAgKi8KLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDQsICJHU0RfU19DX1NZTShXKVxuIik7Ci0jZW5kaWYKLQkgICAgICBvbGRfZmxhZ3MgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgMik7Ci0JICAgICAgbmV3X2ZsYWdzID0gQlNGX05PX0ZMQUdTOwotCi0JICAgICAgaWYgKG9sZF9mbGFncyAmIEdTWV9TX01fV0VBSykKLQkJbmV3X2ZsYWdzIHw9IEJTRl9XRUFLOwotCi0JICAgICAgc3dpdGNoIChnc2RfdHlwZSkKLQkJewotCQkgIGNhc2UgR1NEX1NfQ19FUE06Ci0JCSAgICBuYW1lX29mZnNldCA9IDExOwotCQkgICAgdmFsdWVfb2Zmc2V0ID0gNTsKLQkJICAgIG5ld19mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIEdTRF9TX0NfRVBNVzoKLQkJICAgIG5hbWVfb2Zmc2V0ID0gMTI7Ci0JCSAgICB2YWx1ZV9vZmZzZXQgPSA2OwotCQkgICAgbmV3X2ZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgR1NEX1NfQ19TWU06Ci0JCSAgICBpZiAob2xkX2ZsYWdzICYgR1NZX1NfTV9ERUYpCS8qIHN5bWJvbCBkZWZpbml0aW9uICovCi0JCSAgICAgIG5hbWVfb2Zmc2V0ID0gOTsKLQkJICAgIGVsc2UKLQkJICAgICAgbmFtZV9vZmZzZXQgPSA0OwotCQkgICAgdmFsdWVfb2Zmc2V0ID0gNTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgR1NEX1NfQ19TWU1XOgotCQkgICAgaWYgKG9sZF9mbGFncyAmIEdTWV9TX01fREVGKQkvKiBzeW1ib2wgZGVmaW5pdGlvbiAqLwotCQkgICAgICBuYW1lX29mZnNldCA9IDEwOwotCQkgICAgZWxzZQotCQkgICAgICBuYW1lX29mZnNldCA9IDU7Ci0JCSAgICB2YWx1ZV9vZmZzZXQgPSA2OwotCQkgICAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIHNhdmUgc3ltYm9sIGluIHZtc19zeW1ib2xfdGFibGUgKi8KLQotCSAgICAgIGVudHJ5ID0gX2JmZF92bXNfZW50ZXJfc3ltYm9sIChhYmZkLAotCQkJX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIG5hbWVfb2Zmc2V0KSk7Ci0JICAgICAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkJewotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQkgIHJldHVybiAtMTsKLQkJfQotCSAgICAgIHN5bWJvbCA9IGVudHJ5LT5zeW1ib2w7Ci0KLQkgICAgICBpZiAob2xkX2ZsYWdzICYgR1NZX1NfTV9ERUYpCS8qIHN5bWJvbCBkZWZpbml0aW9uICovCi0JCXsKLQkJICBpbnQgcHNlY3Q7Ci0KLQkJICBzeW1ib2wtPnZhbHVlID0gYmZkX2dldGwzMiAodm1zX3JlYyt2YWx1ZV9vZmZzZXQpOwotCQkgIGlmICgoZ3NkX3R5cGUgPT0gR1NEX1NfQ19TWU1XKQotCQkgICAgICB8fCAoZ3NkX3R5cGUgPT0gR1NEX1NfQ19FUE1XKSkKLQkJICAgIHBzZWN0ID0gYmZkX2dldGwxNiAodm1zX3JlYyArIHZhbHVlX29mZnNldCAtIDIpOwotCQkgIGVsc2UKLQkJICAgIHBzZWN0ID0gdm1zX3JlY1t2YWx1ZV9vZmZzZXQtMV07Ci0KLQkJICBzeW1ib2wtPnNlY3Rpb24gPSAoYXNlY3Rpb24gKilwc2VjdDsKLSNpZiBWTVNfREVCVUcKLQkJICB2bXNfZGVidWcoNCwgImdzZCBzeW0gZGVmICMlZCAoJXMsICVkIFslcF0sICUwNHg9JXMpXG4iLCBhYmZkLT5zeW1jb3VudCwKLQkJCQlzeW1ib2wtPm5hbWUsIChpbnQpc3ltYm9sLT5zZWN0aW9uLCBzeW1ib2wtPnNlY3Rpb24sIG9sZF9mbGFncywgZmxhZzJzdHIoZ3N5ZmxhZ2Rlc2MsIG9sZF9mbGFncykpOwotI2VuZGlmCi0JCX0KLQkgICAgICBlbHNlCS8qIHN5bWJvbCByZWZlcmVuY2UgKi8KLQkJewotCQkgIHN5bWJvbC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIEJGRF9VTkRfU0VDVElPTl9OQU1FKTsKLSNpZiBWTVNfREVCVUcKLQkJICB2bXNfZGVidWcgKDQsICJnc2Qgc3ltIHJlZiAjJWQgKCVzLCAlcyBbJXBdLCAlMDR4PSVzKVxuIiwgYWJmZC0+c3ltY291bnQsCi0JCQkJc3ltYm9sLT5uYW1lLCBzeW1ib2wtPnNlY3Rpb24tPm5hbWUsIHN5bWJvbC0+c2VjdGlvbiwgb2xkX2ZsYWdzLCBmbGFnMnN0ciAoZ3N5ZmxhZ2Rlc2MsIG9sZF9mbGFncykpOwotI2VuZGlmCi0JCX0KLQotCSAgICAgIGdzZF9zaXplID0gdm1zX3JlY1tuYW1lX29mZnNldF0gKyBuYW1lX29mZnNldCArIDE7Ci0JICAgICAgc3ltYm9sLT5mbGFncyA9IG5ld19mbGFnczsKLQkgICAgfQotCi0JICBicmVhazsKLQotCSAgY2FzZSBHU0RfU19DX1BSTzoKLQkgIGNhc2UgR1NEX1NfQ19QUk9XOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBwcm9cbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19JREM6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIGlkY1xuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX0VOVjoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgZW52XG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfTFNZOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBsc3lcbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19MRVBNOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBsZXBtXG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfTFBSTzoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgbHByb1xuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX1NQU0M6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIHNwc2NcbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19TWU1WOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBzeW12XG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfRVBNVjoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgZXBtdlxuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX1BST1Y6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIHByb3ZcbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQotCWNhc2UgRUdTRF9TX0NfUFNDICsgRVZBWF9PRkZTRVQ6Ci0JICB7Ci0JICAgIC8qIHByb2dyYW0gc2VjdGlvbiBkZWZpbml0aW9uICAqLwotCi0JICAgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjKzEyKTsKLQkgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotCSAgICBpZiAoIXNlY3Rpb24pCi0JICAgICAgcmV0dXJuIC0xOwotCSAgICBvbGRfZmxhZ3MgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgNik7Ci0JICAgIHNlY3Rpb24tPl9yYXdfc2l6ZSA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA4KTsJLyogYWxsb2NhdGlvbiAqLwotCSAgICBuZXdfZmxhZ3MgPSB2bXNfc2VjZmxhZ19ieV9uYW1lIChhYmZkLCBldmF4X3NlY3Rpb25fZmxhZ3MsIG5hbWUsIChpbnQpIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JICAgIGlmIChvbGRfZmxhZ3MgJiBFR1BTX1NfVl9SRUwpCi0JICAgICAgbmV3X2ZsYWdzIHw9IFNFQ19SRUxPQzsKLQkgICAgaWYgKCFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3Rpb24sIG5ld19mbGFncykpCi0JICAgICAgcmV0dXJuIC0xOwotCSAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSB2bXNfcmVjWzRdOwotCSAgICBhbGlnbl9hZGRyID0gKDEgPDwgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKTsKLQkgICAgaWYgKChiYXNlX2FkZHIgJSBhbGlnbl9hZGRyKSAhPSAwKQotCSAgICAgIGJhc2VfYWRkciArPSAoYWxpZ25fYWRkciAtIChiYXNlX2FkZHIgJSBhbGlnbl9hZGRyKSk7Ci0JICAgIHNlY3Rpb24tPnZtYSA9IChiZmRfdm1hKWJhc2VfYWRkcjsKLQkgICAgYmFzZV9hZGRyICs9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLQkgICAgc2VjdGlvbi0+Y29udGVudHMgPSAoKHVuc2lnbmVkIGNoYXIgKikKLQkJCQkgYmZkX21hbGxvYyAoc2VjdGlvbi0+X3Jhd19zaXplKSk7Ci0JICAgIGlmIChzZWN0aW9uLT5jb250ZW50cyA9PSBOVUxMKQotCSAgICAgIHJldHVybiAtMTsKLQkgICAgbWVtc2V0IChzZWN0aW9uLT5jb250ZW50cywgMCwgKHNpemVfdCkgc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkgICAgc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOwotI2lmIFZNU19ERUJVRwotCSAgICB2bXNfZGVidWcoNCwgImVnc2QgcHNjICVkICglcywgZmxhZ3MgJTA0eD0lcykgIiwKLQkJICAgICAgIHNlY3Rpb24tPmluZGV4LCBuYW1lLCBvbGRfZmxhZ3MsIGZsYWcyc3RyKGdwc2ZsYWdkZXNjLCBvbGRfZmxhZ3MpKTsKLQkgICAgdm1zX2RlYnVnKDQsICIlZCBieXRlcyBhdCAweCUwOGx4IChtZW0gJXApXG4iLAotCQkgICAgICAgc2VjdGlvbi0+X3Jhd19zaXplLCBzZWN0aW9uLT52bWEsIHNlY3Rpb24tPmNvbnRlbnRzKTsKLSNlbmRpZgotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEVHU0RfU19DX1NZTSArIEVWQVhfT0ZGU0VUOgotCSAgewotCSAgICAvKiBzeW1ib2wgc3BlY2lmaWNhdGlvbiAoZGVmaW5pdGlvbiBvciByZWZlcmVuY2UpICAqLwotCi0JICAgIHN5bWJvbCA9IF9iZmRfdm1zX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLQkgICAgaWYgKHN5bWJvbCA9PSAwKQotCSAgICAgIHJldHVybiAtMTsKLQotCSAgICBvbGRfZmxhZ3MgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgNik7Ci0JICAgIG5ld19mbGFncyA9IEJTRl9OT19GTEFHUzsKLQotCSAgICBpZiAob2xkX2ZsYWdzICYgRUdTWV9TX1ZfV0VBSykKLQkgICAgICBuZXdfZmxhZ3MgfD0gQlNGX1dFQUs7Ci0KLQkgICAgaWYgKHZtc19yZWNbNl0gJiBFR1NZX1NfVl9ERUYpCS8qIHN5bWJvbCBkZWZpbml0aW9uICovCi0JICAgICAgewotCQlzeW1ib2wtPm5hbWUgPQotCQkgIF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMrMzIpOwotCQlpZiAob2xkX2ZsYWdzICYgRUdTWV9TX1ZfTk9STSkKLQkJICB7ICAgICAgICAgLyogcHJvYyBkZWYgKi8KLQkJICAgIG5ld19mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JCSAgfQotCQlzeW1ib2wtPnZhbHVlID0gYmZkX2dldGw2NCAodm1zX3JlYys4KTsKLQkJc3ltYm9sLT5zZWN0aW9uID0gKGFzZWN0aW9uICopKCh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0bDMyICh2bXNfcmVjKzI4KSk7Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZWdzZCBzeW0gZGVmICMlZCAoJXMsICVkLCAlMDR4PSVzKVxuIiwgYWJmZC0+c3ltY291bnQsCi0JCQkgICBzeW1ib2wtPm5hbWUsIChpbnQpc3ltYm9sLT5zZWN0aW9uLCBvbGRfZmxhZ3MsIGZsYWcyc3RyKGdzeWZsYWdkZXNjLCBvbGRfZmxhZ3MpKTsKLSNlbmRpZgotCSAgICAgIH0KLQkgICAgZWxzZQkvKiBzeW1ib2wgcmVmZXJlbmNlICovCi0JICAgICAgewotCSAgICAgICAgc3ltYm9sLT5uYW1lID0KLQkJICBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjKzgpOwotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImVnc2Qgc3ltIHJlZiAjJWQgKCVzLCAlMDR4PSVzKVxuIiwgYWJmZC0+c3ltY291bnQsCi0JCQkgICBzeW1ib2wtPm5hbWUsIG9sZF9mbGFncywgZmxhZzJzdHIoZ3N5ZmxhZ2Rlc2MsIG9sZF9mbGFncykpOwotI2VuZGlmCi0JICAgICAgICBzeW1ib2wtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBCRkRfVU5EX1NFQ1RJT05fTkFNRSk7Ci0JICAgICAgfQotCi0JICAgIHN5bWJvbC0+ZmxhZ3MgPSBuZXdfZmxhZ3M7Ci0KLQkgICAgLyogc2F2ZSBzeW1ib2wgaW4gdm1zX3N5bWJvbF90YWJsZSAgKi8KLQotCSAgICBlbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopIGJmZF9oYXNoX2xvb2t1cCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgc3ltYm9sLT5uYW1lLCB0cnVlLCBmYWxzZSk7Ci0JICAgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICAgICAgewotCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkJcmV0dXJuIC0xOwotCSAgICAgIH0KLQkgICAgaWYgKGVudHJ5LT5zeW1ib2wgIT0gKGFzeW1ib2wgKilOVUxMKQotCSAgICAgIHsJCQkJCS8qIEZJWE1FID8sIERFQyBDIGdlbmVyYXRlcyB0aGlzICovCi0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiRUdTRF9TX0NfU1lNOiBkdXBsaWNhdGUgXCIlc1wiXG4iLCBzeW1ib2wtPm5hbWUpOwotI2VuZGlmCi0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQllbnRyeS0+c3ltYm9sID0gc3ltYm9sOwotCQlQUklWKGdzZF9zeW1fY291bnQpKys7Ci0JCWFiZmQtPnN5bWNvdW50Kys7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEVHU0RfU19DX0lEQyArIEVWQVhfT0ZGU0VUOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJ1bmtub3duIGdzZC9lZ3NkIHN1YnR5cGUgJWQiKSwgZ3NkX3R5cGUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gLTE7Ci0KLQl9IC8qIHN3aXRjaCAqLwotCi0gICAgICBQUklWKHJlY19zaXplKSAtPSBnc2Rfc2l6ZTsKLSAgICAgIFBSSVYodm1zX3JlYykgKz0gZ3NkX3NpemU7Ci0KLSAgICB9IC8qIHdoaWxlIChyZWNzaXplID4gMCkgKi8KLQotICBpZiAoYWJmZC0+c3ltY291bnQgPiAwKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCi0gIHJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIG91dHB1dCByb3V0aW5lcyAqLwotCi0vKiBXcml0ZSBzZWN0aW9uIGFuZCBzeW1ib2wgZGlyZWN0b3J5IG9mIGJmZCBhYmZkICAqLwotCi1pbnQKLV9iZmRfdm1zX3dyaXRlX2dzZCAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGFzeW1ib2wgKnN5bWJvbDsKLSAgaW50IHN5bW51bTsKLSAgaW50IGxhc3RfaW5kZXggPSAtMTsKLSAgY2hhciBkdW1teV9uYW1lWzEwXTsKLSAgY2hhciAqc25hbWU7Ci0gIGZsYWd3b3JkIG5ld19mbGFncywgb2xkX2ZsYWdzOwotICBjaGFyICpucHRyLCAqdXB0cjsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfZ3NkICglcCwgJWQpXG4iLCBhYmZkLCBvYmp0eXBlKTsKLSNlbmRpZgotCi0gIC8qIG91dHB1dCBzZWN0aW9ucyAgKi8KLQotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMywgIiVkIHNlY3Rpb25zIGZvdW5kXG4iLCBhYmZkLT5zZWN0aW9uX2NvdW50KTsKLSNlbmRpZgotCi0gIC8qIGVnc2QgaXMgcXVhZHdvcmQgYWxpZ25lZCAgKi8KLQotICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCA4KTsKLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VHU0QsIC0xKTsKLSAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwotICBfYmZkX3Ztc19vdXRwdXRfcHVzaCAoYWJmZCk7CQkvKiBwcmVwYXJlIG91dHB1dCBmb3Igc3VicmVjb3JkcyAqLwotCi0gIHdoaWxlIChzZWN0aW9uICE9IDApCi0gICAgewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDMsICJTZWN0aW9uICMlZCAlcywgJWQgYnl0ZXNcbiIsIHNlY3Rpb24tPmluZGV4LCBzZWN0aW9uLT5uYW1lLCAoaW50KXNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0jZW5kaWYKLQotCS8qIDEzIGJ5dGVzIGVnc2QsIG1heCAzMSBjaGFycyBuYW1lIC0+IHNob3VsZCBiZSA0NCBieXRlcyAqLwotICAgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgNjQpIDwgMCkKLQl7Ci0JICBfYmZkX3Ztc19vdXRwdXRfcG9wIChhYmZkKTsKLQkgIF9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpOwotCSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FR1NELCAtMSk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfcHVzaCAoYWJmZCk7CQkvKiBwcmVwYXJlIG91dHB1dCBmb3Igc3VicmVjb3JkcyAqLwotCX0KLQotCS8qIENyZWF0ZSBkdW1teSBzZWN0aW9ucyB0byBrZWVwIGNvbnNlY3V0aXZlIGluZGljZXMgKi8KLQotICAgICAgd2hpbGUgKHNlY3Rpb24tPmluZGV4IC0gbGFzdF9pbmRleCA+IDEpCi0JewotI2lmIFZNU19ERUJVRwotCSAgdm1zX2RlYnVnICgzLCAiaW5kZXggJWQsIGxhc3QgJWRcbiIsIHNlY3Rpb24tPmluZGV4LCBsYXN0X2luZGV4KTsKLSNlbmRpZgotCSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFR1NEX1NfQ19QU0MsIC0xKTsKLQkgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgMCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIDApOwotCSAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwotCSAgc3ByaW50ZiAoZHVtbXlfbmFtZSwgIi5EVU1NWSUwMmQiLCBsYXN0X2luZGV4KTsKLQkgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBkdW1teV9uYW1lKTsKLQkgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JICBsYXN0X2luZGV4Kys7Ci0JfQotCi0gICAgICAvKiBEb24ndCBrbm93IGlmIHRoaXMgaXMgbmVjY2VzYXJ5IGZvciB0aGUgbGlua2VyIGJ1dCBmb3Igbm93IGl0IGtlZXBzCi0JIHZtc19zbHVycF9nc2QgaGFwcHkgICovCi0KLSAgICAgIHNuYW1lID0gKGNoYXIgKilzZWN0aW9uLT5uYW1lOwotICAgICAgaWYgKCpzbmFtZSA9PSAnLicpCi0JewotCSAgc25hbWUrKzsKLQkgIGlmICgoKnNuYW1lID09ICd0JykgJiYgKHN0cmNtcCAoc25hbWUsICJ0ZXh0IikgPT0gMCkpCi0JICAgIHNuYW1lID0gUFJJVihpc192YXgpP1ZBWF9DT0RFX05BTUU6RVZBWF9DT0RFX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdkJykgJiYgKHN0cmNtcCAoc25hbWUsICJkYXRhIikgPT0gMCkpCi0JICAgIHNuYW1lID0gUFJJVihpc192YXgpP1ZBWF9EQVRBX05BTUU6RVZBWF9EQVRBX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdiJykgJiYgKHN0cmNtcCAoc25hbWUsICJic3MiKSA9PSAwKSkKLQkgICAgc25hbWUgPSBFVkFYX0JTU19OQU1FOwotCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAnbCcpICYmIChzdHJjbXAgKHNuYW1lLCAibGluayIpID09IDApKQotCSAgICBzbmFtZSA9IEVWQVhfTElOS19OQU1FOwotCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAncicpICYmIChzdHJjbXAgKHNuYW1lLCAicmRhdGEiKSA9PSAwKSkKLQkgICAgc25hbWUgPSBFVkFYX1JFQURPTkxZX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdsJykgJiYgKHN0cmNtcCAoc25hbWUsICJsaXRlcmFsIikgPT0gMCkpCi0JICAgIHNuYW1lID0gRVZBWF9MSVRFUkFMX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdjJykgJiYgKHN0cmNtcCAoc25hbWUsICJjb21tIikgPT0gMCkpCi0JICAgIHNuYW1lID0gRVZBWF9DT01NT05fTkFNRTsKLQkgIGVsc2UgaWYgKCgqc25hbWUgPT0gJ2wnKSAmJiAoc3RyY21wIChzbmFtZSwgImxjb21tIikgPT0gMCkpCi0JICAgIHNuYW1lID0gRVZBWF9MT0NBTF9OQU1FOwotCX0KLSAgICAgIGVsc2UKLQlzbmFtZSA9IF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc25hbWUsIEVPQkpfU19DX1NFQ1NJWik7Ci0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRUdTRF9TX0NfUFNDLCAtMSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciAmIDB4ZmYpOwotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpCi0JewotCSAgbmV3X2ZsYWdzID0gKEVHUFNfU19WX09WUnxFR1BTX1NfVl9SRUx8RUdQU19TX1ZfR0JMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVHxFR1BTX1NfVl9OT01PRHxFR1BTX1NfVl9DT00pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBuZXdfZmxhZ3MgPSB2bXNfZXNlY2ZsYWdfYnlfbmFtZSAoZXZheF9zZWN0aW9uX2ZsYWdzLCBzbmFtZSwgc2VjdGlvbi0+X3Jhd19zaXplKTsKLQl9Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIG5ld19mbGFncyk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgc2VjdGlvbi0+X3Jhd19zaXplKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBzbmFtZSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gICAgICBsYXN0X2luZGV4ID0gc2VjdGlvbi0+aW5kZXg7Ci0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLSAgICB9Ci0KLSAgLyogb3V0cHV0IHN5bWJvbHMgICovCi0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgzLCAiJWQgc3ltYm9scyBmb3VuZFxuIiwgYWJmZC0+c3ltY291bnQpOwotI2VuZGlmCi0KLSAgYmZkX3NldF9zdGFydF9hZGRyZXNzIChhYmZkLCAoYmZkX3ZtYSktMSk7Ci0KLSAgZm9yIChzeW1udW0gPSAwOyBzeW1udW0gPCBhYmZkLT5zeW1jb3VudDsgc3ltbnVtKyspCi0gICAgewotCi0gICAgICBzeW1ib2wgPSBhYmZkLT5vdXRzeW1ib2xzW3N5bW51bV07Ci0gICAgICBpZiAoKihzeW1ib2wtPm5hbWUpID09ICdfJykKLQl7Ci0JICBpZiAoc3RyY21wIChzeW1ib2wtPm5hbWUsICJfX21haW4iKSA9PSAwKQotCSAgICBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQsIChiZmRfdm1hKXN5bWJvbC0+dmFsdWUpOwotCX0KLSAgICAgIG9sZF9mbGFncyA9IHN5bWJvbC0+ZmxhZ3M7Ci0KLSAgICAgIGlmIChvbGRfZmxhZ3MgJiBCU0ZfRklMRSkKLQljb250aW51ZTsKLQotICAgICAgaWYgKCgob2xkX2ZsYWdzICYgKEJTRl9HTE9CQUx8QlNGX1dFQUspKSA9PSAwKQkvKiBub3QgeGRlZiAqLwotCSAgJiYgKCFiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpKQkvKiBhbmQgbm90IHhyZWYgKi8KLQljb250aW51ZTsJCQkJCS8qIGRvbnQgb3V0cHV0ICovCi0KLSAgICAgIC8qIDEzIGJ5dGVzIGVnc2QsIG1heCA2NCBjaGFycyBuYW1lIC0+IHNob3VsZCBiZSA3NyBieXRlcyAgKi8KLQotICAgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgODApIDwgMCkKLQl7Ci0JICBfYmZkX3Ztc19vdXRwdXRfcG9wIChhYmZkKTsKLQkgIF9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpOwotCSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FR1NELCAtMSk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfcHVzaCAoYWJmZCk7CQkvKiBwcmVwYXJlIG91dHB1dCBmb3Igc3VicmVjb3JkcyAqLwotCX0KLQotICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFR1NEX1NfQ19TWU0sIC0xKTsKLQotICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCAwKTsJCQkvKiBkYXRhIHR5cGUsIGFsaWdubWVudCAqLwotCi0gICAgICBuZXdfZmxhZ3MgPSAwOwotCi0gICAgICBpZiAob2xkX2ZsYWdzICYgQlNGX1dFQUspCi0JbmV3X2ZsYWdzIHw9IEVHU1lfU19WX1dFQUs7Ci0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQkJLyogLmNvbW0gICovCi0JbmV3X2ZsYWdzIHw9IChFR1NZX1NfVl9XRUFLfEVHU1lfU19WX0NPTU0pOwotCi0gICAgICBpZiAob2xkX2ZsYWdzICYgQlNGX0ZVTkNUSU9OKQotCXsKLQkgIG5ld19mbGFncyB8PSBFR1NZX1NfVl9OT1JNOwotCSAgbmV3X2ZsYWdzIHw9IEVHU1lfU19WX1JFTDsKLQl9Ci0gICAgICBpZiAob2xkX2ZsYWdzICYgKEJTRl9HTE9CQUx8QlNGX1dFQUspKQotCXsKLQkgIG5ld19mbGFncyB8PSBFR1NZX1NfVl9ERUY7Ci0JICBpZiAoIWJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgbmV3X2ZsYWdzIHw9IEVHU1lfU19WX1JFTDsKLQl9Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIG5ld19mbGFncyk7Ci0KLSAgICAgIGlmIChvbGRfZmxhZ3MgJiAoQlNGX0dMT0JBTHxCU0ZfV0VBSykpCQkvKiBzeW1ib2wgZGVmaW5pdGlvbiAqLwotCXsKLQkgIGlmIChvbGRfZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pCi0JICAgIHsKLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgc3ltYm9sLT52YWx1ZSk7Ci0JICAgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsCi0JCQkJICAgICAoKGFzeW1ib2wgKikoc3ltYm9sLT51ZGF0YS5wKSktPnZhbHVlKTsKLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKLQkJCQkgICAgICgoKGFzeW1ib2wgKikoc3ltYm9sLT51ZGF0YS5wKSkKLQkJCQkgICAgICAtPnNlY3Rpb24tPmluZGV4KSk7Ci0JICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIHN5bWJvbC0+c2VjdGlvbi0+aW5kZXgpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgc3ltYm9sLT52YWx1ZSk7CS8qIExfVkFMVUUgKi8KLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgMCk7CQkJLyogTF9DT0RFX0FERFJFU1MgKi8KLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CQkJLyogTF9DQV9QU0lORFggKi8KLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgc3ltYm9sLT5zZWN0aW9uLT5pbmRleCk7LyogTF9QU0lORFggKi8KLQkgICAgfQotCX0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIHN5bWJvbC0+bmFtZSwgRU9CSl9TX0NfU1lNU0laKSk7Ci0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgICB9Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgOCk7Ci0gIF9iZmRfdm1zX291dHB1dF9wb3AgKGFiZmQpOwotICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsgCi0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iZmQvdm1zLWhkci5jIGIvYmZkL3Ztcy1oZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkMjBhYS4uMDAwMDAwMAotLS0gYS9iZmQvdm1zLWhkci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYxICswLDAgQEAKLS8qIHZtcy1oZHIuYyAtLSBCRkQgYmFjay1lbmQgZm9yIFZNUy9WQVggKG9wZW5WTVMvVkFYKSBhbmQKLSAgIEVWQVggKG9wZW5WTVMvQWxwaGEpIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIEhEUiByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCi0gICBFTUggcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwotICAgYW5kCi0gICBFT00gcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwotICAgRUVPTSByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCi0KLSAgIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJ2bXMuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qIFJlYWQgJiBwcm9jZXNzIGVtaCByZWNvcmQKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX2hkciAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSAgdW5zaWduZWQgY2hhciAqcHRyOwotICB1bnNpZ25lZCBjaGFyICp2bXNfcmVjOwotICBpbnQgc3VidHlwZTsKLQotICB2bXNfcmVjID0gUFJJVih2bXNfcmVjKTsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcoMiwgIkhEUi9FTUhcbiIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChvYmp0eXBlKQotICAgIHsKLSAgICAgIGNhc2UgT0JKX1NfQ19IRFI6Ci0Jc3VidHlwZSA9IHZtc19yZWNbMV07Ci0JYnJlYWs7Ci0gICAgICBjYXNlIEVPQkpfU19DX0VNSDoKLQlzdWJ0eXBlID0gYmZkX2dldGwxNiAodm1zX3JlYyArIDQpICsgRVZBWF9PRkZTRVQ7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXN1YnR5cGUgPSAtMTsKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnKDMsICJzdWJ0eXBlICVkXG4iLCBzdWJ0eXBlKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoc3VidHlwZSkKLSAgICB7Ci0KLSAgICAgIGNhc2UgTUhEX1NfQ19NSEQ6Ci0JLyoKLQkgKiBtb2R1bGUgaGVhZGVyCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2Jfc3RybHZsID0gdm1zX3JlY1syXTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfbF9yZWNzaXogPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgMyk7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX3RfbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMgKyA1KTsKLQlwdHIgPSB2bXNfcmVjICsgNSArIHZtc19yZWNbNV0gKyAxOwotCVBSSVYoaGRyX2RhdGEpLmhkcl90X3ZlcnNpb24gPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCXB0ciArPSAqcHRyICsgMTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfdF9kYXRlID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHB0ciwgMTcpOwotCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX0xOTToKLQkvKgotCSAqCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2NfbG5tID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC0yKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX1NSQzoKLQkvKgotCSAqCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2Nfc3JjID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC0yKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX1RUTDoKLQkvKgotCSAqCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2NfdHRsID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC0yKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX0NQUjoKLQkvKgotCSAqCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX01UQzoKLQkvKgotCSAqCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX0dUWDoKLQkvKgotCSAqCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX01IRCArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICogbW9kdWxlIGhlYWRlcgotCSAqLwotCVBSSVYoaGRyX2RhdGEpLmhkcl9iX3N0cmx2bCA9IHZtc19yZWNbNl07Ci0JUFJJVihoZHJfZGF0YSkuaGRyX2xfYXJjaDEgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgOCk7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX2xfYXJjaDIgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTIpOwotCVBSSVYoaGRyX2RhdGEpLmhkcl9sX3JlY3NpeiA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxNik7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX3RfbmFtZSA9Ci0JICBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjICsgMjApOwotCXB0ciA9IHZtc19yZWMgKyAyMCArIHZtc19yZWNbMjBdICsgMTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfdF92ZXJzaW9uID0KLQkgIF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JcHRyICs9ICpwdHIgKyAxOwotCVBSSVYoaGRyX2RhdGEpLmhkcl90X2RhdGUgPQotCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHB0ciwgMTcpOwotCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX0xOTSArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICoKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfY19sbm0gPQotCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC02KSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX1NSQyArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICoKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfY19zcmMgPQotCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC02KSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX1RUTCArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICoKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfY190dGwgPQotCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC02KSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX0NQUiArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICoKLQkgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEVNSF9TX0NfTVRDICsgRVZBWF9PRkZTRVQ6Ci0JLyoKLQkgKgotCSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRU1IX1NfQ19HVFggKyBFVkFYX09GRlNFVDoKLQkvKgotCSAqCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAtMTsKLQotICAgIH0gLyogc3dpdGNoICovCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBPdXRwdXQgcm91dGluZXMuICAqLwotCi0KLS8qIE1hbnVmYWN1cmUgYSBWTVMgbGlrZSB0aW1lIG9uIGEgdW5peCBiYXNlZCBzeXN0ZW0uCi0gICBzdG9sZW4gZnJvbSBvYmotdm1zLmMgICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLWdldF92bXNfdGltZV9zdHJpbmcgKCkKLXsKLSAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdGJ1ZlsxOF07Ci0jaWZuZGVmIFZNUwotI2luY2x1ZGUgPHRpbWUuaD4KLQotICBjaGFyICpwbnQ7Ci0gIHRpbWVfdCB0aW1lYjsKLSAgdGltZSAoJnRpbWViKTsKLSAgcG50ID0gY3RpbWUgKCZ0aW1lYik7Ci0gIHBudFszXSA9IDA7Ci0gIHBudFs3XSA9IDA7Ci0gIHBudFsxMF0gPSAwOwotICBwbnRbMTZdID0gMDsKLSAgcG50WzI0XSA9IDA7Ci0gIHNwcmludGYgKHRidWYsICIlMnMtJTNzLSVzICVzIiwgcG50ICsgOCwgcG50ICsgNCwgcG50ICsgMjAsIHBudCArIDExKTsKLSNlbHNlCi0jaW5jbHVkZSA8c3RhcmxldC5oPgotICBzdHJ1Y3QKLSAgewotICAgIGludCBTaXplOwotICAgIHVuc2lnbmVkIGNoYXIgKlB0cjsKLSAgfSBEZXNjcmlwdG9yOwotICBEZXNjcmlwdG9yLlNpemUgPSAxNzsKLSAgRGVzY3JpcHRvci5QdHIgPSB0YnVmOwotICBTWVMkQVNDVElNICgwLCAmRGVzY3JpcHRvciwgMCwgMCk7Ci0jZW5kaWYgLyogbm90IFZNUyAqLwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgInZtc3RpbWVzdHJpbmc6JyVzJ1xuIiwgdGJ1Zik7Ci0jZW5kaWYKLQotICByZXR1cm4gdGJ1ZjsKLX0KLQotCi0vKiB3cml0ZSBvYmplY3QgaGVhZGVyIGZvciBiZmQgYWJmZCAgKi8KLQotaW50Ci1fYmZkX3Ztc193cml0ZV9oZHIgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0gIGFzeW1ib2wgKnN5bWJvbDsKLSAgaW50IHN5bW51bTsKLSAgaW50IGhhZF9jYXNlID0gMDsKLSAgaW50IGhhZF9maWxlID0gMDsKLQotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMiwgInZtc193cml0ZV9oZHIgKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLQotICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCAyKTsKLQotICAvKiBNSEQgKi8KLQotICBpZiAob2JqdHlwZSA9PSBPQkpfU19DX0hEUikKLSAgICB7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfTUhEKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgRU9CSl9TX0NfU1RSTFZMKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCBNQVhfT1VUUkVDX1NJWkUpOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBzdHJpcCBwYXRoIGFuZCBzdWZmaXggaW5mb3JtYXRpb24gKi8KLQotICAgICAgY2hhciAqZm5hbWUsICpmb3V0LCAqZnB0cjsKLQotICAgICAgZnB0ciA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAgICAgZm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoZnB0cikgKyAxKTsKLSAgICAgIHN0cmNweSAoZm5hbWUsIGZwdHIpOwotICAgICAgZm91dCA9IHN0cnJjaHIgKGZuYW1lLCAnXScpOwotICAgICAgaWYgKGZvdXQgPT0gMCkKLQlmb3V0ID0gc3RyY2hyIChmbmFtZSwgJzonKTsKLSAgICAgIGlmIChmb3V0ICE9IDApCi0JZm91dCsrOwotICAgICAgZWxzZQotCWZvdXQgPSBmbmFtZTsKLQotICAgICAgLyogc3RyaXAgLm9iaiBzdWZmaXggICovCi0KLSAgICAgIGZwdHIgPSBzdHJyY2hyIChmbmFtZSwgJy4nKTsKLSAgICAgIGlmICgoZnB0ciAhPSAwKQotCSAgJiYgKHN0cmNhc2VjbXAgKGZwdHIsICIuT0JKIikgPT0gMCkpCi0JKmZwdHIgPSAwOwotCi0gICAgICBmcHRyID0gZm91dDsKLSAgICAgIHdoaWxlICgqZnB0ciAhPSAwKQotCXsKLQkgIGlmIChpc2xvd2VyICgqZnB0cikpCi0JICAgICpmcHRyID0gdG91cHBlciAoKmZwdHIpOwotCSAgZnB0cisrOwotCSAgaWYgKCgqZnB0ciA9PSAnOycpCi0JICAgICB8fCAoKGZwdHIgLSBmb3V0KSA+IDMxKSkKLQkgICAgKmZwdHIgPSAwOwotCX0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBmb3V0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgIk5PTkFNRSIpOwotCi0gIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBCRkRfVkVSU0lPTik7Ci0gIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCBnZXRfdm1zX3RpbWVfc3RyaW5nICgpLCAxNyk7Ci0gIF9iZmRfdm1zX291dHB1dF9maWxsIChhYmZkLCAwLCAxNyk7Ci0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgLyogTE1OICovCi0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfTE5NKTsKLSAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIkdBUyBwcm9HSVMiLCAxMCk7Ci0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgLyogU1JDICovCi0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfU1JDKTsKLQotICBmb3IgKHN5bW51bSA9IDA7IHN5bW51bSA8IGFiZmQtPnN5bWNvdW50OyBzeW1udW0rKykKLSAgICB7Ci0gICAgICBzeW1ib2wgPSBhYmZkLT5vdXRzeW1ib2xzW3N5bW51bV07Ci0KLSAgICAgIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0ZJTEUpCi0JewotCSAgY2hhciAqczsKLQotCSAgaWYgKHN0cm5jbXAgKChjaGFyICopc3ltYm9sLT5uYW1lLCAiPENBU0U6IiwgNikgPT0gMCkKLQkgICAgewotCSAgICAgIFBSSVYoZmxhZ19oYXNoX2xvbmdfbmFtZXMpID0gc3ltYm9sLT5uYW1lWzZdIC0gJzAnOwotCSAgICAgIFBSSVYoZmxhZ19zaG93X2FmdGVyX3RydW5jKSA9IHN5bWJvbC0+bmFtZVs3XSAtICcwJzsKLQotCSAgICAgIGlmIChoYWRfZmlsZSkKLQkJYnJlYWs7Ci0JICAgICAgaGFkX2Nhc2UgPSAxOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKXN5bWJvbC0+bmFtZSwgc3RybGVuIChzeW1ib2wtPm5hbWUpKTsKLQkgIGlmIChoYWRfY2FzZSkKLQkgICAgYnJlYWs7Ci0JICBoYWRfZmlsZSA9IDE7Ci0JfQotICAgIH0KLQotICBpZiAoc3ltbnVtID09IGFiZmQtPnN5bWNvdW50KQotICAgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSJub25hbWUiLCA2KTsKLQotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gIC8qIFRUTCAqLwotCi0gIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX1RUTCk7Ci0gIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSJUVEwiLCAzKTsKLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICAvKiBDUFIgKi8KLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19DUFIpOwotICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwKLQkJCSAodW5zaWduZWQgY2hhciAqKSJHTlUgQkZEIHBvcnRlZCBieSBLbGF1cyBL5G1wZiAxOTk0LTE5OTYiLAotCQkJIDM5KTsKLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFByb2Nlc3MgRU9NL0VFT00gcmVjb3JkCi0gICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF9lb20gKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnKDIsICJFT00vRUVPTVxuIik7Ci0jZW5kaWYKLQotICB2bXNfcmVjID0gUFJJVih2bXNfcmVjKTsKLQotICBpZiAoKG9ianR5cGUgPT0gT0JKX1NfQ19FT00pIAotICAgICB8fCAob2JqdHlwZSA9PSBPQkpfU19DX0VPTVcpKQotICAgIHsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBQUklWKGVvbV9kYXRhKS5lb21fbF90b3RhbF9scHMgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgNCk7Ci0gICAgICBQUklWKGVvbV9kYXRhKS5lb21fYl9jb21jb2QgPSAqKHZtc19yZWMgKyA4KTsKLSAgICAgIGlmIChQUklWKGVvbV9kYXRhKS5lb21fYl9jb21jb2QgPiAxKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiT2JqZWN0IG1vZHVsZSBOT1QgZXJyb3ItZnJlZSAhXG4iKSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBQUklWKGVvbV9kYXRhKS5lb21faGFzX3RyYW5zZmVyID0gZmFsc2U7Ci0gICAgICBpZiAoUFJJVihyZWNfc2l6ZSkgPiAxMCkKLQl7Ci0JICAgUFJJVihlb21fZGF0YSkuZW9tX2hhc190cmFuc2ZlciA9IHRydWU7Ci0JICAgUFJJVihlb21fZGF0YSkuZW9tX2JfdGZyZmxnID0gKih2bXNfcmVjICsgOSk7Ci0JICAgUFJJVihlb21fZGF0YSkuZW9tX2xfcHNpbmR4ID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDEyKTsKLQkgICBQUklWKGVvbV9kYXRhKS5lb21fbF90ZnJhZHIgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTYpOwotCi0JICAgYWJmZC0+c3RhcnRfYWRkcmVzcyA9IFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RmcmFkcjsKLQl9Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBXcml0ZSBlb20gcmVjb3JkIGZvciBiZmQgYWJmZCAgKi8KLQotaW50Ci1fYmZkX3Ztc193cml0ZV9lb20gKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMiwgInZtc193cml0ZV9lb20gKCVwLCAlZClcbiIsIGFiZmQsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBvYmp0eXBlLCAtMSk7Ci0gIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAodW5zaWduZWQgbG9uZykoUFJJVih2bXNfbGlua2FnZV9pbmRleCkgPj4gMSkpOwotICBfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgMCk7CS8qIGNvbXBsZXRpb24gY29kZSAqLwotICBfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgMCk7CS8qIGZpbGwgYnl0ZSAqLwotCi0gIGlmIChiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpICE9IChiZmRfdm1hKS0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gICAgICBzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubGluayIpOwotICAgICAgaWYgKHNlY3Rpb24gPT0gMCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIDApOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsICh1bnNpZ25lZCBsb25nKShzZWN0aW9uLT5pbmRleCkpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsCi0JCQkgICAgICh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKLSAgICB9Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2VuZCAoYWJmZCk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3Ztcy1taXNjLmMgYi9iZmQvdm1zLW1pc2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVmZGFlNC4uMDAwMDAwMAotLS0gYS9iZmQvdm1zLW1pc2MuYworKysgL2Rldi9udWxsCkBAIC0xLDExNDUgKzAsMCBAQAotLyogdm1zLW1pc2MuYyAtLSBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyBmb3IgVkFYIChvcGVuVk1TL1ZBWCkgYW5kCi0gICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2lmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgInZtcy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiBWTVNfREVCVUcKLS8qIGRlYnVnIGZ1bmN0aW9ucyAqLwotCi0vKiBkZWJ1ZyBmdW5jdGlvbiBmb3IgYWxsIHZtcyBleHRlbnNpb25zCi0gICBldmFsdWF0ZXMgZW52aXJvbm1lbnQgdmFyaWFibGUgVk1TX0RFQlVHIGZvciBhCi0gICBudW1lcmljYWwgdmFsdWUgb24gdGhlIGZpcnN0IGNhbGwKLSAgIGFsbCBlcnJvciBsZXZlbHMgYmVsb3cgdGhpcyB2YWx1ZSBhcmUgcHJpbnRlZAotICAKLSAgIGxldmVsczoKLSAgIDEJdG9wbGV2ZWwgYmZkIGNhbGxzIChmdW5jdGlvbnMgZnJvbSB0aGUgYmZkIHZlY3RvcikKLSAgIDIJZnVuY3Rpb25zIGNhbGxlZCBieSBiZmQgY2FsbHMKLSAgIC4uLgotICAgOQlhbG1vc3QgZXZlcnl0aGluZwotCi0gICBsZXZlbCBpcyBhbHNvIGlkZW50YXRpb24gbGV2ZWwuIEluZGVudGF0aW9uIGlzIHBlcmZvcm1lZAotICAgaWYgbGV2ZWwgPiAwCi0JKi8KLQotI2lmIF9fU1REQ19fCi12b2lkCi1fYmZkX3Ztc19kZWJ1ZyAoaW50IGxldmVsLCBjaGFyICpmb3JtYXQsIC4uLikKLXsKLSAgc3RhdGljIGludCBtaW5fbGV2ZWwgPSAtMTsKLSAgc3RhdGljIEZJTEUgKm91dHB1dCA9IE5VTEw7Ci0gIGNoYXIgKmVwdHI7Ci0gIHZhX2xpc3QgYXJnczsKLSAgaW50IGFic2x2bCA9IChsZXZlbCA+IDApP2xldmVsOi1sZXZlbDsKLQotICBpZiAobWluX2xldmVsID09IC0xKQotICAgIHsKLSAgICAgIGlmICgoZXB0ciA9IGdldGVudigiVk1TX0RFQlVHIikpICE9IE5VTEwpCi0JewotCSAgbWluX2xldmVsID0gYXRvaShlcHRyKTsKLQkgIG91dHB1dCA9IHN0ZGVycjsKLQl9Ci0gICAgICBlbHNlCi0JbWluX2xldmVsID0gMDsKLSAgICB9Ci0gIGlmIChvdXRwdXQgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIGlmIChhYnNsdmwgPiBtaW5fbGV2ZWwpCi0gICAgcmV0dXJuOwotCi0gIHdoaWxlKC0tbGV2ZWw+MCkKLSAgICBmcHJpbnRmKG91dHB1dCwgIiAiKTsKLSAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKLSAgdmZwcmludGYob3V0cHV0LCBmb3JtYXQsIGFyZ3MpOwotICBmZmx1c2gob3V0cHV0KTsKLSAgdmFfZW5kKGFyZ3MpOwotCi0gIHJldHVybjsKLX0KLQotI2Vsc2UgLyogbm90IF9fU1REQ19fICovCi0KLXZvaWQKLV9iZmRfdm1zX2RlYnVnIChsZXZlbCwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KQotICAgICBpbnQgbGV2ZWw7Ci0gICAgIGNoYXIgKmZvcm1hdDsKLSAgICAgbG9uZyBhMTsgbG9uZyBhMjsgbG9uZyBhMzsKLSAgICAgbG9uZyBhNDsgbG9uZyBhNTsgbG9uZyBhNjsKLXsKLSAgc3RhdGljIGludCBtaW5fbGV2ZWwgPSAtMTsKLSAgc3RhdGljIEZJTEUgKm91dHB1dCA9IE5VTEw7Ci0gIGNoYXIgKmVwdHI7Ci0KLSAgaWYgKG1pbl9sZXZlbCA9PSAtMSkKLSAgICB7Ci0gICAgICBpZiAoKGVwdHIgPSBnZXRlbnYoIlZNU19ERUJVRyIpKSAhPSBOVUxMKQotCXsKLQkgIG1pbl9sZXZlbCA9IGF0b2koZXB0cik7Ci0JICBvdXRwdXQgPSBzdGRlcnI7Ci0JfQotICAgICAgZWxzZQotCW1pbl9sZXZlbCA9IDA7Ci0gICAgfQotICBpZiAob3V0cHV0ID09IE5VTEwpCi0gICAgcmV0dXJuOwotICBpZiAobGV2ZWwgPiBtaW5fbGV2ZWwpCi0gICAgcmV0dXJuOwotCi0gIHdoaWxlKC0tbGV2ZWw+MCkKLSAgICBmcHJpbnRmKG91dHB1dCwgIiAiKTsKLSAgZnByaW50ZihvdXRwdXQsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7Ci0gIGZmbHVzaChvdXRwdXQpOwotCi0gIHJldHVybjsKLX0KLSNlbmRpZiAvKiBfX1NURENfXyAqLwotCi0KLS8qIGEgZGVidWcgZnVuY3Rpb24KLSAgIGhleCBkdW1wICdzaXplJyBieXRlcyBzdGFydGluZyBhdCAncHRyJyAgKi8KLQotdm9pZAotX2JmZF9oZXhkdW1wIChsZXZlbCwgcHRyLCBzaXplLCBvZmZzZXQpCi0gICAgIGludCBsZXZlbDsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IG9mZnNldDsKLXsKLSAgdW5zaWduZWQgY2hhciAqbHB0ciA9IHB0cjsKLSAgaW50IGNvdW50ID0gMDsKLSAgbG9uZyBzdGFydCA9IG9mZnNldDsKLQotICB3aGlsZSAoc2l6ZS0tID4gMCkKLSAgICB7Ci0gICAgICBpZiAoKGNvdW50JTE2KSA9PSAwKQotCXZtc19kZWJ1ZyAobGV2ZWwsICIlMDhseDoiLCBzdGFydCk7Ci0gICAgICB2bXNfZGVidWcgKC1sZXZlbCwgIiAlMDJ4IiwgKnB0cisrKTsKLSAgICAgIGNvdW50Kys7Ci0gICAgICBzdGFydCsrOwotICAgICAgaWYgKHNpemUgPT0gMCkKLQl7Ci0JICB3aGlsZSAoKGNvdW50JTE2KSAhPSAwKQotCSAgICB7Ci0JICAgICAgdm1zX2RlYnVnICgtbGV2ZWwsICIgICAiKTsKLQkgICAgICBjb3VudCsrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKChjb3VudCUxNikgPT0gMCkKLQl7Ci0JICB2bXNfZGVidWcgKC1sZXZlbCwgIiAiKTsKLQkgIHdoaWxlIChscHRyIDwgcHRyKQotCSAgICB7Ci0JICAgICAgdm1zX2RlYnVnICgtbGV2ZWwsICIlYyIsICgqbHB0ciA8IDMyKT8nLic6KmxwdHIpOwotCSAgICAgIGxwdHIrKzsKLQkgICAgfQotCSAgdm1zX2RlYnVnICgtbGV2ZWwsICJcbiIpOwotCX0KLSAgICB9Ci0gIGlmICgoY291bnQlMTYpICE9IDApCi0gICAgdm1zX2RlYnVnICgtbGV2ZWwsICJcbiIpOwotCi0gIHJldHVybjsKLX0KLSNlbmRpZgotCi0MCi0vKiBoYXNoIGZ1bmN0aW9ucwotCi0gICBUaGVzZSBhcmUgbmVlZGVkIHdoZW4gcmVhZGluZyBhbiBvYmplY3QgZmlsZS4gICovCi0KLS8qIGFsbG9jYXRlIG5ldyB2bXNfaGFzaF9lbnRyeQotICAga2VlcCB0aGUgc3ltYm9sIG5hbWUgYW5kIGEgcG9pbnRlciB0byB0aGUgYmZkIHN5bWJvbCBpbiB0aGUgdGFibGUgICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1fYmZkX3Ztc19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHZtc19zeW1ib2xfZW50cnkgKnJldDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDUsICJfYmZkX3Ztc19oYXNoX25ld2Z1bmMoJXAsICVwLCAlcylcbiIsIGVudHJ5LCB0YWJsZSwgc3RyaW5nKTsKLSNlbmRpZgotCi0gIGlmIChlbnRyeSA9PSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopTlVMTCkKLSAgICB7Ci0gICAgICByZXQgPSAodm1zX3N5bWJvbF9lbnRyeSAqKQotCSAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mICh2bXNfc3ltYm9sX2VudHJ5KSk7Ci0gICAgICBpZiAocmV0ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopIE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKU5VTEw7Ci0JfQotICAgIH0KLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgYmFzZSBjbGFzcy4gICovCi0KLSAgcmV0ID0gKHZtc19zeW1ib2xfZW50cnkgKikgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKXJldCwgdGFibGUsIHN0cmluZyk7Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX2hhc2hfbmV3ZnVuYyByZXQgJXBcbiIsIHJldCk7Ci0jZW5kaWYKLQotICByZXQtPnN5bWJvbCA9IChhc3ltYm9sICopTlVMTDsKLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKXJldDsKLX0KLQotDAotLyogb2JqZWN0IGZpbGUgaW5wdXQgZnVuY3Rpb25zICovCi0KLS8qIFJldHVybiB0eXBlIGFuZCBsZW5ndGggZnJvbSByZWNvcmQgaGVhZGVyIChidWYpIG9uIEFscGhhLiAgKi8KLQotdm9pZAotX2JmZF92bXNfZ2V0X2hlYWRlcl92YWx1ZXMgKGFiZmQsIGJ1ZiwgdHlwZSwgbGVuZ3RoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKLSAgICAgaW50ICp0eXBlOwotICAgICBpbnQgKmxlbmd0aDsKLXsKLSAgaWYgKHR5cGUgIT0gMCkKLSAgICAqdHlwZSA9IGJmZF9nZXRsMTYgKGJ1Zik7Ci0gIGJ1ZiArPSAyOwotICBpZiAobGVuZ3RoICE9IDApCi0gICAgKmxlbmd0aCA9IGJmZF9nZXRsMTYgKGJ1Zik7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxMCwgIl9iZmRfdm1zX2dldF9oZWFkZXJfdmFsdWVzIHR5cGUgJXgsIGxlbmd0aCAleFxuIiwgKHR5cGU/KnR5cGU6MCksIChsZW5ndGg/Kmxlbmd0aDowKSk7Ci0jZW5kaWYKLQotCi0gIHJldHVybjsKLX0KLQotCi0vKiBHZXQgbmV4dCByZWNvcmQgZnJvbSBvYmplY3QgZmlsZSB0byB2bXNfYnVmCi0gICBzZXQgUFJJVihidWZfc2l6ZSkgYW5kIHJldHVybiBpdAotICAKLSAgIHRoaXMgaXMgYSBsaXR0bGUgdHJpY2t5IHNpbmNlIGl0IHNob3VsZCBiZSBwb3J0YWJsZS4KLSAgCi0gICB0aGUgb3BlblZNUyBvYmplY3QgZmlsZSBoYXMgJ3ZhcmlhYmxlIGxlbmd0aCcgd2hpY2ggbWVhbnMgdGhhdAotICAgcmVhZCgpIHJldHVybnMgZGF0YSBpbiBjaHVua3Mgb2YgKGhvcGVmdWxseSkgY29ycmVjdCBhbmQgZXhwZWN0ZWQKLSAgIHNpemUuIFRoZSBsaW5rZXIgKGFuZCBvdGhlciB0b29scyBvbiB2bXMpIGRlcGVuZCBvbiB0aGF0LiBVbml4IGRvZXNuJ3QKLSAgIGtub3cgYWJvdXQgJ2Zvcm1hdHRlZCcgZmlsZXMsIHNvIHJlYWRpbmcgYW5kIHdyaXRpbmcgc3VjaCBhbiBvYmplY3QKLSAgIGZpbGUgaW4gYSB1bml4IGVudmlyb25tZW50IGlzIG5vdCB0cml2aWFsLgotICAKLSAgIFdpdGggdGhlIHRvb2wgJ2ZpbGUnIChhdmFpbGFibGUgb24gYWxsIHZtcyBmdHAgc2l0ZXMpLCBvbmUKLSAgIGNhbiB2aWV3IGFuZCBjaGFuZ2UgdGhlIGF0dHJpYnV0ZXMgb2YgYSBmaWxlLiBDaGFuZ2luZyBmcm9tCi0gICAndmFyaWFibGUgbGVuZ3RoJyB0byAnZml4ZWQgbGVuZ3RoLCA1MTIgYnl0ZXMnIHJldmVhbHMgdGhlCi0gICByZWNvcmQgbGVuZ3RoIGF0IHRoZSBmaXJzdCAyIGJ5dGVzIG9mIGV2ZXJ5IHJlY29yZC4gVGhlIHNhbWUKLSAgIGhhcHBlbnMgZHVyaW5nIHRoZSB0cmFuc2ZlciBvZiBvYmplY3QgZmlsZXMgZnJvbSB2bXMgdG8gdW5peCwKLSAgIGF0IGxlYXN0IHdpdGggdWN4LCBkZWMncyBpbXBsZW1lbnRhdGlvbiBvZiB0Y3AvaXAuCi0gIAotICAgVGhlIHZtcyBmb3JtYXQgcmVwZWF0cyB0aGUgbGVuZ3RoIGF0IGJ5dGVzIDIgJiAzIG9mIGV2ZXJ5IHJlY29yZC4KLSAgCi0gICBPbiB0aGUgZmlyc3QgY2FsbCAoZmlsZV9mb3JtYXQgPT0gRkZfVU5LTk9XTikgd2UgY2hlY2sgaWYKLSAgIHRoZSBmaXJzdCBhbmQgdGhlIHRoaXJkIGJ5dGUgcGFpciAoISkgb2YgdGhlIHJlY29yZCBtYXRjaC4KLSAgIElmIHRoZXkgZG8gaXQncyBhbiBvYmplY3QgZmlsZSBpbiBhbiB1bml4IGVudmlyb25tZW50IG9yIHdpdGgKLSAgIHdyb25nIGF0dHJpYnV0ZXMgKEZGX0ZPUkVJR04pLCBlbHNlIHdlIHNob3VsZCBiZSBpbiBhIHZtcwotICAgZW52aXJvbm1lbnQgd2hlcmUgcmVhZCgpIHJldHVybnMgdGhlIHJlY29yZCBzaXplIChGRl9OQVRJVkUpLgotICAKLSAgIHJlYWRpbmcgaXMgYWx3YXlzIGRvbmUgaW4gMiBzdGVwcy4KLSAgIGZpcnN0IGp1c3QgdGhlIHJlY29yZCBoZWFkZXIgaXMgcmVhZCBhbmQgdGhlIGxlbmd0aCBleHRyYWN0ZWQKLSAgIGJ5IGdldF9oZWFkZXJfdmFsdWVzCi0gICB0aGVuIHRoZSByZWFkIGJ1ZmZlciBpcyBhZGp1c3RlZCBhbmQgdGhlIHJlbWFpbmluZyBieXRlcyBhcmUKLSAgIHJlYWQgaW4uCi0gIAotICAgYWxsIGZpbGUgaS9vIGlzIGFsd2F5cyBkb25lIG9uIGV2ZW4gZmlsZSBwb3NpdGlvbnMgICovCi0KLWludAotX2JmZF92bXNfZ2V0X3JlY29yZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgdGVzdF9sZW4sIHRlc3Rfc3RhcnQsIHJlbWFpbmluZzsKLSAgdW5zaWduZWQgY2hhciAqdm1zX2J1ZjsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDgsICJfYmZkX3Ztc19nZXRfcmVjb3JkXG4iKTsKLSNlbmRpZgotCi0gIC8qIG1pbmltdW0gaXMgNiBieXRlcyBvbiBBbHBoYQotICAgICAoMiBieXRlcyBsZW5ndGgsIDIgYnl0ZXMgcmVjb3JkIGlkLCAyIGJ5dGVzIGxlbmd0aCByZXBlYXRlZCkKLQotICAgICBvbiBWQVggdGhlcmUncyBubyBsZW5ndGggaW5mb3JtYXRpb24gaW4gdGhlIHJlY29yZAotICAgICBzbyBzdGFydCB3aXRoIE9CSl9TX0NfTUFYUkVDU0laICAqLwotCi0gIGlmIChQUklWKGJ1Zl9zaXplKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChQUklWKGlzX3ZheCkpCi0JewotCSAgUFJJVih2bXNfYnVmKSA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyAoT0JKX1NfQ19NQVhSRUNTSVopOwotCSAgUFJJVihidWZfc2l6ZSkgPSBPQkpfU19DX01BWFJFQ1NJWjsKLQkgIFBSSVYoZmlsZV9mb3JtYXQpID0gRkZfVkFYOwotCX0KLSAgICAgIGVsc2UKLQlQUklWKHZtc19idWYpID0gKHVuc2lnbmVkIGNoYXIgKikgbWFsbG9jICg2KTsKLSAgICB9Ci0KLSAgdm1zX2J1ZiA9IFBSSVYodm1zX2J1Zik7Ci0KLSAgaWYgKHZtc19idWYgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgc3dpdGNoIChQUklWKGZpbGVfZm9ybWF0KSkKLSAgICB7Ci0gICAgICBjYXNlIEZGX1VOS05PV046Ci0gICAgICBjYXNlIEZGX0ZPUkVJR046Ci0JdGVzdF9sZW4gPSA2OwkJCS8qIHByb2JlIDYgYnl0ZXMgKi8KLQl0ZXN0X3N0YXJ0ID0gMjsJCQkvKiB3aGVyZSB0aGUgcmVjb3JkIHN0YXJ0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRkZfTkFUSVZFOgotCXRlc3RfbGVuID0gNDsKLQl0ZXN0X3N0YXJ0ID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEZGX1ZBWDoKLQl0ZXN0X2xlbiA9IDA7Ci0JdGVzdF9zdGFydCA9IDA7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8qIHNraXAgb2RkIGFsaWdubWVudCBieXRlICAqLwotCi0gIGlmIChiZmRfdGVsbCAoYWJmZCkgJiAxKQotICAgIHsKLSAgICAgIGlmIChiZmRfcmVhZCAoUFJJVih2bXNfYnVmKSwgMSwgMSwgYWJmZCkgIT0gMSkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLQotICAvKiByZWFkIHRoZSByZWNvcmQgaGVhZGVyIG9uIEFscGhhLiAgKi8KLQotICBpZiAoKHRlc3RfbGVuICE9IDApCi0gICAgICAmJiAoYmZkX3JlYWQgKFBSSVYodm1zX2J1ZiksIDEsIHRlc3RfbGVuLCBhYmZkKSAhPSB0ZXN0X2xlbikpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBjaGVjayBmaWxlIGZvcm1hdCBvbiBmaXJzdCBjYWxsICAqLwotCi0gIGlmIChQUklWKGZpbGVfZm9ybWF0KSA9PSBGRl9VTktOT1dOKQotICAgIHsJCQkJCQkvKiByZWNvcmQgbGVuZ3RoIHJlcGVhdHMgPyAqLwotICAgICAgaWYgKCAodm1zX2J1ZlswXSA9PSB2bXNfYnVmWzRdKQotICAgICAgICAmJiAodm1zX2J1ZlsxXSA9PSB2bXNfYnVmWzVdKSkKLQl7Ci0JICBQUklWKGZpbGVfZm9ybWF0KSA9IEZGX0ZPUkVJR047CS8qIFk6IGZvcmVpZ24gZW52aXJvbm1lbnQgKi8KLQkgIHRlc3Rfc3RhcnQgPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBQUklWKGZpbGVfZm9ybWF0KSA9IEZGX05BVElWRTsJLyogTjogbmF0aXZlIGVudmlyb25tZW50ICovCi0JICB0ZXN0X3N0YXJ0ID0gMDsKLQl9Ci0gICAgfQotCi0gIGlmIChQUklWKGlzX3ZheCkpCi0gICAgewotICAgICAgUFJJVihyZWNfbGVuZ3RoKSA9IGJmZF9yZWFkICh2bXNfYnVmLCAxLCBQUklWKGJ1Zl9zaXplKSwgYWJmZCk7Ci0gICAgICBpZiAoUFJJVihyZWNfbGVuZ3RoKSA8PSAwKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBQUklWKHZtc19yZWMpID0gdm1zX2J1ZjsKLSAgICB9Ci0gIGVsc2UJCS8qIEFscGhhICAqLwotICAgIHsKLSAgICAgIC8qIGV4dHJhY3Qgdm1zIHJlY29yZCBsZW5ndGggICovCi0KLSAgICAgIF9iZmRfdm1zX2dldF9oZWFkZXJfdmFsdWVzIChhYmZkLCB2bXNfYnVmK3Rlc3Rfc3RhcnQsIE5VTEwsCi0JCQkJICAmUFJJVihyZWNfbGVuZ3RoKSk7Ci0KLSAgICAgIGlmIChQUklWKHJlY19sZW5ndGgpIDw9IDApCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogdGhhdCdzIHdoYXQgdGhlIGxpbmtlciBtYW51YWwgc2F5cyAgKi8KLQotICAgICAgaWYgKFBSSVYocmVjX2xlbmd0aCkgPiBFT0JKX1NfQ19NQVhSRUNTSVopCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogYWRqdXN0IHRoZSBidWZmZXIgICovCi0KLSAgICAgIGlmIChQUklWKHJlY19sZW5ndGgpID4gUFJJVihidWZfc2l6ZSkpCi0JewotCSAgUFJJVih2bXNfYnVmKSA9ICh1bnNpZ25lZCBjaGFyICopIHJlYWxsb2MgKHZtc19idWYsIFBSSVYocmVjX2xlbmd0aCkpOwotCSAgdm1zX2J1ZiA9IFBSSVYodm1zX2J1Zik7Ci0JICBpZiAodm1zX2J1ZiA9PSAwKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JICBQUklWKGJ1Zl9zaXplKSA9IFBSSVYocmVjX2xlbmd0aCk7Ci0JfQotCi0gICAgICAvKiByZWFkIHRoZSByZW1haW5pbmcgcmVjb3JkICAqLwotCi0gICAgICByZW1haW5pbmcgPSBQUklWKHJlY19sZW5ndGgpIC0gdGVzdF9sZW4gKyB0ZXN0X3N0YXJ0OwotCi0jaWYgVk1TX0RFQlVHCi0gICAgICB2bXNfZGVidWcgKDEwLCAiYmZkX3JlYWQgcmVtYWluaW5nICVkXG4iLCByZW1haW5pbmcpOwotI2VuZGlmCi0gICAgICBpZiAoYmZkX3JlYWQgKHZtc19idWYgKyB0ZXN0X2xlbiwgMSwgcmVtYWluaW5nLCBhYmZkKSAhPSByZW1haW5pbmcpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIFBSSVYodm1zX3JlYykgPSB2bXNfYnVmICsgdGVzdF9zdGFydDsKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxMSwgImJmZF9yZWFkIHJlY19sZW5ndGggJWRcbiIsIFBSSVYocmVjX2xlbmd0aCkpOwotI2VuZGlmCi0KLSAgcmV0dXJuIFBSSVYocmVjX2xlbmd0aCk7Ci19Ci0KLQotLyogZ2V0IG5leHQgdm1zIHJlY29yZCBmcm9tIGZpbGUKLSAgIHVwZGF0ZSB2bXNfcmVjIGFuZCByZWNfbGVuZ3RoIHRvIG5ldyAocmVtYWluaW5nKSB2YWx1ZXMgICovCi0KLWludAotX2JmZF92bXNfbmV4dF9yZWNvcmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg4LCAiX2JmZF92bXNfbmV4dF9yZWNvcmQgKGxlbiAlZCwgc2l6ZSAlZClcbiIsCi0JICAgICAgUFJJVihyZWNfbGVuZ3RoKSwgUFJJVihyZWNfc2l6ZSkpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYocmVjX2xlbmd0aCkgPiAwKQotICAgIHsKLSAgICAgIFBSSVYodm1zX3JlYykgKz0gUFJJVihyZWNfc2l6ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKF9iZmRfdm1zX2dldF9yZWNvcmQgKGFiZmQpIDw9IDApCi0JcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoUFJJVihpc192YXgpKQotICAgIHsKLSAgICAgIFBSSVYocmVjX3R5cGUpID0gKihQUklWKHZtc19yZWMpKTsKLSAgICAgIFBSSVYocmVjX3NpemUpID0gUFJJVihyZWNfbGVuZ3RoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcyAoYWJmZCwgUFJJVih2bXNfcmVjKSwgJlBSSVYocmVjX3R5cGUpLAotCQkJCSAgJlBSSVYocmVjX3NpemUpKTsKLSAgICB9Ci0gIFBSSVYocmVjX2xlbmd0aCkgLT0gUFJJVihyZWNfc2l6ZSk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg4LCAiX2JmZF92bXNfbmV4dF9yZWNvcmQ6IHJlYyAlcCwgc2l6ZSAlZCwgbGVuZ3RoICVkLCB0eXBlICVkXG4iLAotCSAgICAgIFBSSVYodm1zX3JlYyksIFBSSVYocmVjX3NpemUpLCBQUklWKHJlY19sZW5ndGgpLAotCSAgICAgIFBSSVYocmVjX3R5cGUpKTsKLSNlbmRpZgotCi0gIHJldHVybiBQUklWKHJlY190eXBlKTsKLX0KLQotCi0MCi0vKiBDb3B5IHNpemVkIHN0cmluZyAoc3RyaW5nIHdpdGggZml4ZWQgbGVuZ3RoKSB0byBuZXcgYWxsb2NhdGVkIGFyZWEKLSAgIHNpemUgaXMgc3RyaW5nIGxlbmd0aCAoc2l6ZSBvZiByZWNvcmQpICAqLwotCi1jaGFyICoKLV9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChzdHIsIHNpemUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKnN0cjsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGNoYXIgKm5ld3N0ciA9IGJmZF9tYWxsb2MgKHNpemUgKyAxKTsKLQotICBpZiAobmV3c3RyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIHN0cm5jcHkgKG5ld3N0ciwgKGNoYXIgKilzdHIsIHNpemUpOwotICBuZXdzdHJbc2l6ZV0gPSAwOwotCi0gIHJldHVybiBuZXdzdHI7Ci19Ci0KLS8qIENvcHkgY291bnRlZCBzdHJpbmcgKHN0cmluZyB3aXRoIGxlbmd0aCBhdCBmaXJzdCBieXRlKSB0byBuZXcgYWxsb2NhdGVkIGFyZWEKLSAgIHB0ciBwb2ludHMgdG8gbGVuZ3RoIGJ5dGUgb24gZW50cnkgICovCi0KLWNoYXIgKgotX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKQotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0gIGludCBsZW4gPSAqcHRyKys7Ci0KLSAgcmV0dXJuIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChwdHIsIGxlbik7Ci19Ci0KLQwKLS8qIHN0YWNrIHJvdXRpbmVzIGZvciB2bXMgRVRJUiBjb21tYW5kcyAqLwotCi0vKiBQdXNoIHZhbHVlIGFuZCBzZWN0aW9uIGluZGV4ICAqLwotCi12b2lkCi1fYmZkX3Ztc19wdXNoIChhYmZkLCB2YWwsIHBzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVxdWFkIHZhbDsKLSAgICAgaW50IHBzZWN0OwotewotICBzdGF0aWMgaW50IGxhc3RfcHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg0LCAiPHB1c2ggJTAxNmx4KCVkKSBhdCAlZD5cbiIsIHZhbCwgcHNlY3QsIFBSSVYoc3RhY2twdHIpKTsKLSNlbmRpZgotCi0gIGlmIChwc2VjdCA+PSAwKQotICAgIGxhc3RfcHNlY3QgPSBwc2VjdDsKLQotICBQUklWKHN0YWNrW1BSSVYoc3RhY2twdHIpXSkudmFsdWUgPSB2YWw7Ci0gIFBSSVYoc3RhY2tbUFJJVihzdGFja3B0cildKS5wc2VjdCA9IGxhc3RfcHNlY3Q7Ci0gIFBSSVYoc3RhY2twdHIpKys7Ci0gIGlmIChQUklWKHN0YWNrcHRyKSA+PSBTVEFDS1NJWkUpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrIG92ZXJmbG93ICglZCkgaW4gX2JmZF92bXNfcHVzaCIpLCBQUklWKHN0YWNrcHRyKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIHJldHVybjsKLX0KLQotCi0vKiBQb3AgdmFsdWUgYW5kIHNlY3Rpb24gaW5kZXggICovCi0KLXVxdWFkCi1fYmZkX3Ztc19wb3AgKGFiZmQsIHBzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCAqcHNlY3Q7Ci17Ci0gIHVxdWFkIHZhbHVlOwotCi0gIGlmIChQUklWKHN0YWNrcHRyKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjayB1bmRlcmZsb3cgaW4gX2JmZF92bXNfcG9wIikpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICBQUklWKHN0YWNrcHRyKS0tOwotICB2YWx1ZSA9IFBSSVYoc3RhY2tbUFJJVihzdGFja3B0cildKS52YWx1ZTsKLSAgaWYgKChwc2VjdCAhPSBOVUxMKSAmJiAoUFJJVihzdGFja1tQUklWKHN0YWNrcHRyKV0pLnBzZWN0ID49IDApKQotICAgICpwc2VjdCA9IFBSSVYoc3RhY2tbUFJJVihzdGFja3B0cildKS5wc2VjdDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDQsICI8cG9wICUwMTZseCglZCk+XG4iLCB2YWx1ZSwgUFJJVihzdGFja1tQUklWKHN0YWNrcHRyKV0pLnBzZWN0KTsKLSNlbmRpZgotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotDAotLyogb2JqZWN0IGZpbGUgb3V0cHV0IGZ1bmN0aW9ucyAqLwotCi0vKiBHQVMgdGVuZHMgdG8gd3JpdGUgc2VjdGlvbnMgaW4gbGl0dGxlIGNodW5rcyAoYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKQotICAgd2hpY2ggd2UgY2FuJ3QgdXNlIGRpcmVjdGx5LiBTbyB3ZSBzYXZlIHRoZSBsaXR0bGUgY2h1bmtzIGluIGxpbmtlZAotICAgbGlzdHMgKG9uZSBwZXIgc2VjdGlvbikgYW5kIHdyaXRlIHRoZW0gbGF0ZXIuICAqLwotCi0vKiBBZGQgYSBuZXcgdm1zX3NlY3Rpb24gc3RydWN0dXJlIHRvIHZtc19zZWN0aW9uX3RhYmxlCi0gICAtIGZvcndhcmQgY2hhaW5pbmcgLSAgKi8KLQotc3RhdGljIHZtc19zZWN0aW9uICoKLWFkZF9uZXdfY29udGVudHMgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotewotICB2bXNfc2VjdGlvbiAqc3B0ciwgKm5ld3B0cjsKLQotICBzcHRyID0gUFJJVih2bXNfc2VjdGlvbl90YWJsZSlbc2VjdGlvbi0+aW5kZXhdOwotICBpZiAoc3B0ciAhPSBOVUxMKQotICAgIHJldHVybiBzcHRyOwotCi0gIG5ld3B0ciA9ICh2bXNfc2VjdGlvbiAqKSBiZmRfbWFsbG9jIChzaXplb2YgKHZtc19zZWN0aW9uKSk7Ci0gIGlmIChuZXdwdHIgPT0gKHZtc19zZWN0aW9uICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ld3B0ci0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIChpbnQpc2VjdGlvbi0+X3Jhd19zaXplKTsKLSAgaWYgKG5ld3B0ci0+Y29udGVudHMgPT0gKHVuc2lnbmVkIGNoYXIgKilOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBuZXdwdHItPm9mZnNldCA9IDA7Ci0gIG5ld3B0ci0+c2l6ZSA9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgbmV3cHRyLT5uZXh0ID0gMDsKLSAgUFJJVih2bXNfc2VjdGlvbl90YWJsZSlbc2VjdGlvbi0+aW5kZXhdID0gbmV3cHRyOwotICByZXR1cm4gbmV3cHRyOwotfQotCi0KLS8qIFNhdmUgc2VjdGlvbiBkYXRhICYgb2Zmc2V0IHRvIGFuIHZtc19zZWN0aW9uIHN0cnVjdHVyZQotICAgdm1zX3NlY3Rpb25fdGFibGVbXSBob2xkcyB0aGUgdm1zX3NlY3Rpb24gY2hhaW4gICovCi0KLWJvb2xlYW4KLV9iZmRfc2F2ZV92bXNfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgZGF0YSwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBkYXRhOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIHZtc19zZWN0aW9uICpzcHRyOwotCi0gIGlmIChzZWN0aW9uLT5pbmRleCA+PSBWTVNfU0VDVElPTl9DT1VOVCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmIChjb3VudCA9PSAoYmZkX3NpemVfdHlwZSkwKQotICAgIHJldHVybiB0cnVlOwotICBzcHRyID0gYWRkX25ld19jb250ZW50cyAoYWJmZCwgc2VjdGlvbik7Ci0gIGlmIChzcHRyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1jcHkgKHNwdHItPmNvbnRlbnRzICsgb2Zmc2V0LCBkYXRhLCAoc2l6ZV90KSBjb3VudCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogR2V0IHZtc19zZWN0aW9uIHBvaW50ZXIgdG8gc2F2ZWQgY29udGVudHMgZm9yIHNlY3Rpb24gIyBpbmRleCAgKi8KLQotdm1zX3NlY3Rpb24gKgotX2JmZF9nZXRfdm1zX3NlY3Rpb24gKGFiZmQsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBpbmRleDsKLXsKLSAgaWYgKGluZGV4ID49ICBWTVNfU0VDVElPTl9DT1VOVCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmV0dXJuIFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW2luZGV4XTsKLX0KLQotDAotLyogT2JqZWN0IG91dHB1dCByb3V0aW5lcyAgKi8KLQotLyogQmVnaW4gbmV3IHJlY29yZCBvciByZWNvcmQgaGVhZGVyCi0gICB3cml0ZSAyIGJ5dGVzIHJlY3R5cGUKLSAgIHdyaXRlIDIgYnl0ZXMgcmVjb3JkIGxlbmd0aCAoZmlsbGVkIGluIGF0IGZsdXNoKQotICAgd3JpdGUgMiBieXRlcyBoZWFkZXIgdHlwZSAob21taXR0ZWQgaWYgcmVjaGVhZCA9PSAtMSkgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgcmVjdHlwZSwgcmVjaGVhZCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgcmVjdHlwZTsKLSAgICAgaW50IHJlY2hlYWQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9iZWdpbih0eXBlICVkLCBoZWFkICVkKVxuIiwgcmVjdHlwZSwKLQkgICAgICByZWNoZWFkKTsKLSNlbmRpZgotCi0gIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCxyZWN0eXBlKTsKLQotICAvKiBzYXZlIGN1cnJlbnQgb3V0cHV0IHBvc2l0aW9uIHRvIGZpbGwgaW4gbGVuZ2h0IGxhdGVyICAqLwotCi0gIGlmIChQUklWKHB1c2hfbGV2ZWwpID4gMCkKLSAgICBQUklWKGxlbmd0aF9wb3MpID0gUFJJVihvdXRwdXRfc2l6ZSk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2JlZ2luOiBsZW5ndGhfcG9zID0gJWRcbiIsCi0JICAgICAgUFJJVihsZW5ndGhfcG9zKSk7Ci0jZW5kaWYKLQotICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsMCk7CQkvKiBwbGFjZWhvbGRlciBmb3IgbGVuZ3RoICovCi0KLSAgaWYgKHJlY2hlYWQgIT0gLTEpCi0gICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLHJlY2hlYWQpOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBTZXQgcmVjb3JkL3N1YnJlY29yZCBhbGlnbm1lbnQgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQgKGFiZmQsIGFsaWdudG8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGFsaWdudG87Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQoJWQpXG4iLCBhbGlnbnRvKTsKLSNlbmRpZgotCi0gIFBSSVYob3V0cHV0X2FsaWdubWVudCkgPSBhbGlnbnRvOwotICByZXR1cm47Ci19Ci0KLQotLyogUHJlcGFyZSBmb3Igc3VicmVjb3JkIGZpZWxkcyAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X3B1c2ggKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAidm1zX291dHB1dF9wdXNoKHB1c2hlZF9zaXplID0gJWQpXG4iLCBQUklWKG91dHB1dF9zaXplKSk7Ci0jZW5kaWYKLQotICBQUklWKHB1c2hfbGV2ZWwpKys7Ci0gIFBSSVYocHVzaGVkX3NpemUpID0gUFJJVihvdXRwdXRfc2l6ZSk7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBFbmQgb2Ygc3VicmVjb3JkIGZpZWxkcyAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X3BvcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJ2bXNfb3V0cHV0X3BvcChwdXNoZWRfc2l6ZSA9ICVkKVxuIiwgUFJJVihwdXNoZWRfc2l6ZSkpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLSAgUFJJVihsZW5ndGhfcG9zKSA9IDI7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAidm1zX291dHB1dF9wb3A6IGxlbmd0aF9wb3MgPSAlZFxuIiwgUFJJVihsZW5ndGhfcG9zKSk7Ci0jZW5kaWYKLQotICBQUklWKHB1c2hlZF9zaXplKSA9IDA7Ci0gIFBSSVYocHVzaF9sZXZlbCktLTsKLSAgcmV0dXJuOwotfQotCi0KLS8qIEZsdXNoIHVud3JpdHRlbiBvdXRwdXQsIGVuZHMgY3VycmVudCByZWNvcmQgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgcmVhbF9zaXplID0gUFJJVihvdXRwdXRfc2l6ZSk7Ci0gIGludCBhbGlnbmNvdW50OwotICBpbnQgbGVuZ3RoOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9mbHVzaChyZWFsX3NpemUgPSAlZCwgcHVzaGVkX3NpemUgJWQgYXQgbGVucG9zICVkKVxuIiwKLQkgICAgICByZWFsX3NpemUsIFBSSVYocHVzaGVkX3NpemUpLCBQUklWKGxlbmd0aF9wb3MpKTsKLSNlbmRpZgotCi0gIGlmIChQUklWKHB1c2hfbGV2ZWwpID4gMCkKLSAgICBsZW5ndGggPSByZWFsX3NpemUgLSBQUklWKHB1c2hlZF9zaXplKTsKLSAgZWxzZQotICAgIGxlbmd0aCA9IHJlYWxfc2l6ZTsKLQotICBpZiAobGVuZ3RoID09IDApCi0gICAgcmV0dXJuOwotICBhbGlnbmNvdW50ID0gKFBSSVYob3V0cHV0X2FsaWdubWVudCkKLQkJLSAobGVuZ3RoICUgUFJJVihvdXRwdXRfYWxpZ25tZW50KSkpICUgUFJJVihvdXRwdXRfYWxpZ25tZW50KTsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJhbGlnbjogYWRkaW5nICVkIGJ5dGVzXG4iLCBhbGlnbmNvdW50KTsKLSNlbmRpZgotCi0gIHdoaWxlKGFsaWduY291bnQtLSA+IDApCi0gICAgewotICAgICAgUFJJVihvdXRwdXRfYnVmKVtyZWFsX3NpemUrK10gPSAwOwotI2lmIDAKLSAgICAgIC8qIHRoaXMgaXMgd2h5IEkgKmxvdmUqIHZtczogaW5jb25zaXN0ZW5jeSA6LX0KLQkgYWxpZ25tZW50IGlzIGFkZGVkIHRvIHRoZSBzdWJyZWNvcmQgbGVuZ3RoCi0JIGJ1dCBub3QgdG8gdGhlIHJlY29yZCBsZW5ndGggICovCi0gICAgICBpZiAoUFJJVihwdXNoX2xldmVsKSA+IDApCi0jZW5kaWYKLQlsZW5ndGgrKzsKLSAgICB9Ci0KLSAgLyogcHV0IGxlbmd0aCB0byBidWZmZXIgICovCi0gIFBSSVYob3V0cHV0X3NpemUpID0gUFJJVihsZW5ndGhfcG9zKTsKLSAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCAodW5zaWduZWQgaW50KWxlbmd0aCk7Ci0KLSAgaWYgKFBSSVYocHVzaF9sZXZlbCkgPT0gMCkKLSAgICB7Ci0jaWZuZGVmIFZNUwotCS8qIHdyaXRlIGxlbmd0aCBmaXJzdCwgc2VlIEZGX0ZPUkVJR04gaW4gdGhlIGlucHV0IHJvdXRpbmVzICovCi0gICAgICBmd3JpdGUgKFBSSVYob3V0cHV0X2J1ZikrMiwgMiwgMSwgKEZJTEUgKilhYmZkLT5pb3N0cmVhbSk7Ci0jZW5kaWYKLSAgICAgIGZ3cml0ZSAoUFJJVihvdXRwdXRfYnVmKSwgcmVhbF9zaXplLCAxLCAoRklMRSAqKWFiZmQtPmlvc3RyZWFtKTsKLQotICAgICAgUFJJVihvdXRwdXRfc2l6ZSkgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFBSSVYob3V0cHV0X3NpemUpID0gcmVhbF9zaXplOwotICAgICAgUFJJVihwdXNoZWRfc2l6ZSkgPSBQUklWKG91dHB1dF9zaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIEVuZCByZWNvcmQgb3V0cHV0ICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9lbmRcbiIpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICByZXR1cm47Ci19Ci0KLQotLyogY2hlY2sgcmVtYWluaW5nIGJ1ZmZlciBzaXplCi0KLSAgIHJldHVybiB3aGF0J3MgbGVmdC4gICovCi0KLWludAotX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCBzaXplKQotICAgIGJmZCAqYWJmZDsKLSAgICBpbnQgc2l6ZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2NoZWNrKCVkKVxuIiwgc2l6ZSk7Ci0jZW5kaWYKLQotICByZXR1cm4gKE1BWF9PVVRSRUNfU0laRSAtIChQUklWKG91dHB1dF9zaXplKSArIHNpemUgKyBNSU5fT1VUUkVDX0xVRlQpKTsKLX0KLQotCi0vKiBPdXRwdXQgYnl0ZSAoOCBiaXQpIHZhbHVlICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfYnl0ZSglMDJ4KVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgYmZkX3B1dF84IChhYmZkLCB2YWx1ZSAmIDB4ZmYsIFBSSVYob3V0cHV0X2J1ZikgKyBQUklWKG91dHB1dF9zaXplKSk7Ci0gIFBSSVYob3V0cHV0X3NpemUpICs9IDE7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBPdXRwdXQgc2hvcnQgKDE2IGJpdCkgdmFsdWUgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKCUwNHgpXG4iLCB2YWx1ZSk7Ci0jZW5kaWYKLQotICBiZmRfcHV0XzE2IChhYmZkLCB2YWx1ZSAmIDB4ZmZmZiwgUFJJVihvdXRwdXRfYnVmKSArIFBSSVYob3V0cHV0X3NpemUpKTsKLSAgUFJJVihvdXRwdXRfc2l6ZSkgKz0gMjsKLSAgcmV0dXJuOwotfQotCi0KLS8qIE91dHB1dCBsb25nICgzMiBiaXQpIHZhbHVlICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2xvbmcgKCUwOGx4KVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsdWUsIFBSSVYob3V0cHV0X2J1ZikgKyBQUklWKG91dHB1dF9zaXplKSk7Ci0gIFBSSVYob3V0cHV0X3NpemUpICs9IDQ7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBPdXRwdXQgcXVhZCAoNjQgYml0KSB2YWx1ZSAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVxdWFkIHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfcXVhZCglMDE2bHgpXG4iLCB2YWx1ZSk7Ci0jZW5kaWYKLQotICBiZmRfcHV0XzY0KGFiZmQsIHZhbHVlLCBQUklWKG91dHB1dF9idWYpICsgUFJJVihvdXRwdXRfc2l6ZSkpOwotICBQUklWKG91dHB1dF9zaXplKSArPSA4OwotICByZXR1cm47Ci19Ci0KLQotLyogT3V0cHV0IGMtc3RyaW5nIGFzIGNvdW50ZWQgc3RyaW5nICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqdmFsdWU7Ci17Ci1pbnQgbGVuOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9jb3VudGVkKCVzKVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgbGVuID0gc3RybGVuICh2YWx1ZSk7Ci0gIGlmIChsZW4gPT0gMCkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIl9iZmRfdm1zX291dHB1dF9jb3VudGVkIGNhbGxlZCB3aXRoIHplcm8gYnl0ZXMiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAobGVuID4gMjU1KQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgY2FsbGVkIHdpdGggdG9vIG1hbnkgYnl0ZXMiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgbGVuICYgMHhmZik7Ci0gIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKXZhbHVlLCBsZW4pOwotfQotCi0KLS8qIE91dHB1dCBjaGFyYWN0ZXIgYXJlYSAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsIGRhdGEsIGxlbmd0aCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICBpbnQgbGVuZ3RoOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfZHVtcCglZClcbiIsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICBpZiAobGVuZ3RoID09IDApCi0gICAgcmV0dXJuOwotCi0gIG1lbWNweSAoUFJJVihvdXRwdXRfYnVmKSArIFBSSVYob3V0cHV0X3NpemUpLCBkYXRhLCBsZW5ndGgpOwotICBQUklWKG91dHB1dF9zaXplKSArPSBsZW5ndGg7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIE91dHB1dCBjb3VudCBieXRlcyBvZiB2YWx1ZSAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2ZpbGwgKGFiZmQsIHZhbHVlLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGludCBjb3VudDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2ZpbGwodmFsICUwMnggdGltZXMgJWQpXG4iLCB2YWx1ZSwgY291bnQpOwotI2VuZGlmCi0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuOwotICBtZW1zZXQgKFBSSVYob3V0cHV0X2J1ZikgKyBQUklWKG91dHB1dF9zaXplKSwgdmFsdWUsIGNvdW50KTsKLSAgUFJJVihvdXRwdXRfc2l6ZSkgKz0gY291bnQ7Ci0KLSAgcmV0dXJuOwotfQotCi0vKiB0aGlzIGhhc2ggcm91dGluZSBib3Jyb3dlZCBmcm9tIEdOVS1FTUFDUywgYW5kIHN0cmVuZ3RoZW5lZCBzbGlnaHRseSAgRVJZKi8KLQotc3RhdGljIGludAotaGFzaF9zdHJpbmcgKHB0cikKLSAgICAgY29uc3QgY2hhciAqcHRyOwotewotICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikgcHRyOwotICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQgPSBwICsgc3RybGVuIChwdHIpOwotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGludCBoYXNoID0gMDsKLQotICB3aGlsZSAocCAhPSBlbmQpCi0gICAgewotICAgICAgYyA9ICpwKys7Ci0gICAgICBoYXNoID0gKChoYXNoIDw8IDMpICsgKGhhc2ggPDwgMTUpICsgKGhhc2ggPj4gMjgpICsgYyk7Ci0gICAgfQotICByZXR1cm4gaGFzaDsKLX0KLQotLyogR2VuZXJhdGUgYSBsZW5ndGgtaGFzaGVkIFZNUyBzeW1ib2wgbmFtZSAobGltaXRlZCB0byBtYXhsZW4gY2hhcnMpLiAgKi8KLQotY2hhciAqCi1fYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIGluLCBtYXhsZW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqaW47Ci0gICAgIGludCBtYXhsZW47Ci17Ci0gIGxvbmcgaW50IGluaXQ7Ci0gIGxvbmcgaW50IHJlc3VsdDsKLSAgaW50IGluX2xlbjsKLSAgY2hhciAqcG50ID0gMDsKLSAgY2hhciAqbmV3X25hbWU7Ci0gIGNvbnN0IGNoYXIgKm9sZF9uYW1lOwotICBpbnQgaTsKLSAgc3RhdGljIGNoYXIgb3V0YnVmW0VPQkpfU19DX1NZTVNJWisxXTsKLSAgY2hhciAqb3V0ID0gb3V0YnVmOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1Zyg0LCAiX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIFwiJXNcIlxuIiwgaW4pOwotI2VuZGlmCi0KLSAgaWYgKG1heGxlbiA+IEVPQkpfU19DX1NZTVNJWikKLSAgICBtYXhsZW4gPSBFT0JKX1NfQ19TWU1TSVo7Ci0KLSAgbmV3X25hbWUgPSBvdXQ7CQkvKiBzYXZlIHRoaXMgZm9yIGxhdGVyLiAgKi8KLQotICAvKiBXZSBtYXkgbmVlZCB0byB0cnVuY2F0ZSB0aGUgc3ltYm9sLCBzYXZlIHRoZSBoYXNoIGZvciBsYXRlci4gICovCi0KLSAgaW5fbGVuID0gc3RybGVuIChpbik7Ci0KLSAgcmVzdWx0ID0gKGluX2xlbiA+IG1heGxlbikgPyBoYXNoX3N0cmluZyAoaW4pIDogMDsKLQotICBvbGRfbmFtZSA9IGluOwotCi0gIC8qIERvIHRoZSBsZW5ndGggY2hlY2tpbmcuICAqLwotCi0gIGlmIChpbl9sZW4gPD0gbWF4bGVuKQotICAgIHsKLSAgICAgIGkgPSBpbl9sZW47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKFBSSVYoZmxhZ19oYXNoX2xvbmdfbmFtZXMpKQotCWkgPSBtYXhsZW4tOTsKLSAgICAgIGVsc2UKLQlpID0gbWF4bGVuOwotICAgIH0KLQotICBzdHJuY3B5IChvdXQsIGluLCBpKTsKLSAgaW4gKz0gaTsKLSAgb3V0ICs9IGk7Ci0KLSAgaWYgKChpbl9sZW4gPiBtYXhsZW4pCi0gICAgICAmJiBQUklWKGZsYWdfaGFzaF9sb25nX25hbWVzKSkKLSAgICBzcHJpbnRmIChvdXQsICJfJTA4eCIsIHJlc3VsdCk7Ci0gIGVsc2UKLSAgICAqb3V0ID0gMDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcoNCwgIi0tPiBbJWRdXCIlc1wiXG4iLCBzdHJsZW4gKG91dGJ1ZiksIG91dGJ1Zik7Ci0jZW5kaWYKLQotICBpZiAoaW5fbGVuID4gbWF4bGVuCi0JJiYgUFJJVihmbGFnX2hhc2hfbG9uZ19uYW1lcykKLQkmJiBQUklWKGZsYWdfc2hvd19hZnRlcl90cnVuYykpCi0gICAgcHJpbnRmIChfKCJTeW1ib2wgJXMgcmVwbGFjZWQgYnkgJXNcbiIpLCBvbGRfbmFtZSwgbmV3X25hbWUpOwotCi0gIHJldHVybiBvdXRidWY7Ci19Ci0KLQotLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgc3ltYm9sLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotbmV3X3N5bWJvbCAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotewotICBhc3ltYm9sICpzeW1ib2w7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDcsICAibmV3X3N5bWJvbCAlc1xuIiwgbmFtZSk7Ci0jZW5kaWYKLQotICBzeW1ib2wgPSBfYmZkX3Ztc19tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIGlmIChzeW1ib2wgPT0gMCkKLSAgICByZXR1cm4gc3ltYm9sOwotICBzeW1ib2wtPm5hbWUgPSBuYW1lOwotICBzeW1ib2wtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBCRkRfVU5EX1NFQ1RJT05fTkFNRSk7Ci0KLSAgcmV0dXJuIHN5bWJvbDsKLX0KLQotCi0vKiBBbGxvY2F0ZSBhbmQgZW50ZXIgYSBuZXcgcHJpdmF0ZSBzeW1ib2wuICAqLwotCi12bXNfc3ltYm9sX2VudHJ5ICoKLV9iZmRfdm1zX2VudGVyX3N5bWJvbCAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotewotICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgICJfYmZkX3Ztc19lbnRlcl9zeW1ib2wgJXNcbiIsIG5hbWUpOwotI2VuZGlmCi0KLSAgZW50cnkgPSAodm1zX3N5bWJvbF9lbnRyeSAqKQotCSAgYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotICBpZiAoZW50cnkgPT0gMCkKLSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICBfYmZkX3Ztc19kZWJ1ZyAoOCwgICJjcmVhdGluZyBoYXNoIGVudHJ5IGZvciAlc1xuIiwgbmFtZSk7Ci0jZW5kaWYKLSAgICAgIGVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKiliZmRfaGFzaF9sb29rdXAgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIG5hbWUsIHRydWUsIGZhbHNlKTsKLSAgICAgIGlmIChlbnRyeSAhPSAwKQotCXsKLQkgIGFzeW1ib2wgKnN5bWJvbDsKLQkgIHN5bWJvbCA9IG5ld19zeW1ib2wgKGFiZmQsIG5hbWUpOwotCSAgaWYgKHN5bWJvbCAhPSAwKQotCSAgICB7Ci0JICAgICAgZW50cnktPnN5bWJvbCA9IHN5bWJvbDsKLQkgICAgICBQUklWKGdzZF9zeW1fY291bnQpKys7Ci0JICAgICAgYWJmZC0+c3ltY291bnQrKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICBlbnRyeSA9IDA7Ci0JfQotICAgICAgZWxzZQotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiZmFpbGVkIHRvIGVudGVyICVzIiksIG5hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZiBWTVNfREVCVUcKLSAgICAgIF9iZmRfdm1zX2RlYnVnICg4LCAgImZvdW5kIGhhc2ggZW50cnkgZm9yICVzXG4iLCBuYW1lKTsKLSNlbmRpZgotICAgIH0KLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNywgIi0+IGVudHJ5ICVwLCBlbnRyeS0+c3ltYm9sICVwXG4iLCBlbnRyeSwgZW50cnktPnN5bWJvbCk7Ci0jZW5kaWYKLSAgcmV0dXJuIGVudHJ5OwotfQpkaWZmIC0tZ2l0IGEvYmZkL3Ztcy10aXIuYyBiL2JmZC92bXMtdGlyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MmY1MmIuLjAwMDAwMDAKLS0tIGEvYmZkL3Ztcy10aXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI0ODkgKzAsMCBAQAotLyogdm1zLXRpci5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVkFYIChvcGVuVk1TL1ZBWCkgYW5kCi0gICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUSVIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwotICAgRVRJUiByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCi0KLSAgIGdvIGFuZCByZWFkIHRoZSBvcGVuVk1TIGxpbmtlciBtYW51YWwgKGVzcC4gYXBwZW5kaXggQikKLSAgIGlmIHlvdSBkb24ndCBrbm93IHdoYXQncyBnb2luZyBvbiBoZXJlIDotKQotCi0gICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhlIGZvbGxvd2luZyB0eXBlIGFiYnJldmlhdGlvbnMgYXJlIHVzZWQ6Ci0KLQljcwljb3VudGVkIHN0cmluZyAoYXNjaWkgc3RyaW5nIHdpdGggbGVuZ3RoIGJ5dGUpCi0JYnkJYnl0ZSAoMSBieXRlKQotCXNoCXNob3J0ICgyIGJ5dGUsIDE2IGJpdCkKLQlsdwlsb25nd29yZCAoNCBieXRlLCAzMiBiaXQpCi0JcXcJcXVhZHdvcmQgKDggYnl0ZSwgNjQgYml0KQotCWRhCWRhdGEgc3RyZWFtICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgInZtcy5oIgotCi1zdGF0aWMgdm9pZCBpbWFnZV9zZXRfcHRyIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IHBzZWN0LCB1cXVhZCBvZmZzZXQpKTsKLXN0YXRpYyB2b2lkIGltYWdlX2luY19wdHIgUEFSQU1TICgoYmZkICphYmZkLCB1cXVhZCBvZmZzZXQpKTsKLXN0YXRpYyB2b2lkIGltYWdlX2R1bXAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIsIGludCBzaXplLCBpbnQgb2Zmc2V0KSk7Ci1zdGF0aWMgdm9pZCBpbWFnZV93cml0ZV9iIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IHZhbHVlKSk7Ci1zdGF0aWMgdm9pZCBpbWFnZV93cml0ZV93IFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IHZhbHVlKSk7Ci1zdGF0aWMgdm9pZCBpbWFnZV93cml0ZV9sIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSkpOwotc3RhdGljIHZvaWQgaW1hZ2Vfd3JpdGVfcSBQQVJBTVMgKChiZmQgKmFiZmQsIHVxdWFkIHZhbHVlKSk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50Ci1jaGVja19zZWN0aW9uIChhYmZkLCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgb2Zmc2V0OwotCi0gIG9mZnNldCA9IFBSSVYoaW1hZ2VfcHRyKSAtIFBSSVYoaW1hZ2Vfc2VjdGlvbiktPmNvbnRlbnRzOwotICBpZiAoKG9mZnNldCArIHNpemUpID4gUFJJVihpbWFnZV9zZWN0aW9uKS0+X3Jhd19zaXplKQotICAgIHsKLSAgICAgIFBSSVYoaW1hZ2Vfc2VjdGlvbiktPmNvbnRlbnRzID0gYmZkX3JlYWxsb2MgKFBSSVYoaW1hZ2Vfc2VjdGlvbiktPmNvbnRlbnRzLCBvZmZzZXQgKyBzaXplKTsKLSAgICAgIGlmIChQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50cyA9PSAwKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiTm8gTWVtICEiKSk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgUFJJVihpbWFnZV9zZWN0aW9uKS0+X3Jhd19zaXplID0gb2Zmc2V0ICsgc2l6ZTsKLSAgICAgIFBSSVYoaW1hZ2VfcHRyKSA9IFBSSVYoaW1hZ2Vfc2VjdGlvbiktPmNvbnRlbnRzICsgb2Zmc2V0OwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogcm91dGluZXMgdG8gZmlsbCBzZWN0aW9ucyBjb250ZW50cyBkdXJpbmcgdGlyL2V0aXIgcmVhZCAqLwotCi0vKiBJbml0aWFsaXplIGltYWdlIGJ1ZmZlciBwb2ludGVyIHRvIGJlIGZpbGxlZCAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX3NldF9wdHIgKGFiZmQsIHBzZWN0LCBvZmZzZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHBzZWN0OwotICAgICB1cXVhZCBvZmZzZXQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg0LCAiaW1hZ2Vfc2V0X3B0ciAoJWQ9JXMsICVkKVxuIiwKLQkJcHNlY3QsIFBSSVYoc2VjdGlvbnMpW3BzZWN0XS0+bmFtZSwgb2Zmc2V0KTsKLSNlbmRpZgotCi0gIFBSSVYoaW1hZ2VfcHRyKSA9IFBSSVYoc2VjdGlvbnMpW3BzZWN0XS0+Y29udGVudHMgKyBvZmZzZXQ7Ci0gIFBSSVYoaW1hZ2Vfc2VjdGlvbikgPSBQUklWKHNlY3Rpb25zKVtwc2VjdF07Ci0gIHJldHVybjsKLX0KLQotCi0vKiBJbmNyZW1lbnQgaW1hZ2UgYnVmZmVyIHBvaW50ZXIgYnkgb2Zmc2V0ICAqLwotCi1zdGF0aWMgdm9pZAotaW1hZ2VfaW5jX3B0ciAoYWJmZCwgb2Zmc2V0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVxdWFkIG9mZnNldDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDQsICJpbWFnZV9pbmNfcHRyICglZClcbiIsIG9mZnNldCk7Ci0jZW5kaWYKLQotICBQUklWKGltYWdlX3B0cikgKz0gb2Zmc2V0OwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBEdW1wIG11bHRpcGxlIGJ5dGVzIHRvIHNlY3Rpb24gaW1hZ2UgICovCi0KLXN0YXRpYyB2b2lkCi1pbWFnZV9kdW1wIChhYmZkLCBwdHIsIHNpemUsIG9mZnNldCkKLSAgICBiZmQgKmFiZmQ7Ci0gICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgIGludCBzaXplOwotICAgIGludCBvZmZzZXQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg4LCAiaW1hZ2VfZHVtcCBmcm9tICglcCwgJWQpIHRvICglcClcbiIsIHB0ciwgc2l6ZSwgUFJJVihpbWFnZV9wdHIpKTsKLSAgX2JmZF9oZXhkdW1wICg5LCBwdHIsIHNpemUsIG9mZnNldCk7Ci0jZW5kaWYKLQotICBpZiAoUFJJVihpc192YXgpICYmIGNoZWNrX3NlY3Rpb24gKGFiZmQsIHNpemUpKQotICAgIHJldHVybjsKLQotICB3aGlsZSAoc2l6ZS0tID4gMCkKLSAgICAqUFJJVihpbWFnZV9wdHIpKysgPSAqcHRyKys7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBXcml0ZSBieXRlIHRvIHNlY3Rpb24gaW1hZ2UgICovCi0KLXN0YXRpYyB2b2lkCi1pbWFnZV93cml0ZV9iIChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg2LCAiaW1hZ2Vfd3JpdGVfYiglMDJ4KVxuIiwgKGludCl2YWx1ZSk7Ci0jZW5kaWYKLQotICBpZiAoUFJJVihpc192YXgpICYmIGNoZWNrX3NlY3Rpb24gKGFiZmQsIDEpKQotICAgIHJldHVybjsKLQotICAqUFJJVihpbWFnZV9wdHIpKysgPSAodmFsdWUgJiAweGZmKTsKLSAgcmV0dXJuOwotfQotCi0KLS8qIFdyaXRlIDItYnl0ZSB3b3JkIHRvIGltYWdlICAqLwotCi1zdGF0aWMgdm9pZAotaW1hZ2Vfd3JpdGVfdyAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgImltYWdlX3dyaXRlX3coJTA0eClcbiIsIChpbnQpdmFsdWUpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCAyKSkKLSAgICByZXR1cm47Ci0KLSAgYmZkX3B1dGwxNiAodmFsdWUsIFBSSVYoaW1hZ2VfcHRyKSk7Ci0gIFBSSVYoaW1hZ2VfcHRyKSArPSAyOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBXcml0ZSA0LWJ5dGUgbG9uZyB0byBpbWFnZSAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX3dyaXRlX2wgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg2LCAiaW1hZ2Vfd3JpdGVfbCAoJTA4bHgpXG4iLCB2YWx1ZSk7Ci0jZW5kaWYKLQotICBpZiAoUFJJVihpc192YXgpICYmIGNoZWNrX3NlY3Rpb24gKGFiZmQsIDQpKQotICAgIHJldHVybjsKLQotICBiZmRfcHV0bDMyICh2YWx1ZSwgUFJJVihpbWFnZV9wdHIpKTsKLSAgUFJJVihpbWFnZV9wdHIpICs9IDQ7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIFdyaXRlIDgtYnl0ZSBxdWFkIHRvIGltYWdlICAqLwotCi1zdGF0aWMgdm9pZAotaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdXF1YWQgdmFsdWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg2LCAiaW1hZ2Vfd3JpdGVfcSAoJTAxNmx4KVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCA4KSkKLSAgICByZXR1cm47Ci0KLSAgYmZkX3B1dGw2NCAodmFsdWUsIFBSSVYoaW1hZ2VfcHRyKSk7Ci0gIFBSSVYoaW1hZ2VfcHRyKSArPSA4OwotCi0gIHJldHVybjsKLX0KLQwKLQotI2RlZmluZSBISUdIQklUKG9wKSAoKG9wICYgMHg4MDAwMDAwMEwpID09IDB4ODAwMDAwMDBMKQotCi0vKiBldGlyX3N0YQotICAKLSAgIHZtcyBzdGFjayBjb21tYW5kcwotICAKLSAgIGhhbmRsZSBzdGFfeHh4IGNvbW1hbmRzIGluIGV0aXIgc2VjdGlvbgotICAgcHRyIHBvaW50cyB0byBkYXRhIGFyZWEgaW4gcmVjb3JkCi0gIAotICAgc2VlIHRhYmxlIEItOCBvZiB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZXRpcl9zdGEgKGFiZmQsIGNtZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBjbWQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLXsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfc3RhICVkLyV4XG4iLCBjbWQsIGNtZCk7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotICAgICAgLyogc3RhY2sgKi8KLQotICAgICAgLyogc3RhY2sgZ2xvYmFsCi0JICAgYXJnOiBjcwlzeW1ib2wgbmFtZQotCi0JICAgc3RhY2sgMzIgYml0IHZhbHVlIG9mIHN5bWJvbCAoaGlnaCBiaXRzIHNldCB0byAwKSAgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfR0JMOgotCXsKLQkgIGNoYXIgKm5hbWU7Ci0JICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotCSAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JICBlbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopCi0JCSAgYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgICAgewotI2lmIFZNU19ERUJVRwotCSAgICAgIF9iZmRfdm1zX2RlYnVnICgzLCAiRVRJUl9TX0NfU1RBX0dCTDogbm8gc3ltYm9sIFwiJXNcIlxuIiwgbmFtZSk7Ci0jZW5kaWYKLQkgICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpMCwgLTEpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKGVudHJ5LT5zeW1ib2wtPnZhbHVlKSwgLTEpOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLQkvKiBzdGFjayBsb25nd29yZAotCSAgIGFyZzogbHcJdmFsdWUKLQotCSAgIHN0YWNrIDMyIGJpdCB2YWx1ZSwgc2lnbiBleHRlbmQgdG8gNjQgYml0ICAqLwotCi0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9MVzoKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpYmZkX2dldGwzMiAocHRyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLQkvKiBzdGFjayBnbG9iYWwKLQkgICBhcmc6IHF3CXZhbHVlCi0KLQkgICBzdGFjayA2NCBiaXQgdmFsdWUgb2Ygc3ltYm9sCSAqLwotCi0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9RVzoKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpYmZkX2dldGw2NChwdHIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotCS8qIHN0YWNrIHBzZWN0IGJhc2UgcGx1cyBxdWFkd29yZCBvZmZzZXQKLQkgICBhcmc6IGx3CXNlY3Rpb24gaW5kZXgKLQkgIAlxdwlzaWduZWQgcXVhZHdvcmQgb2Zmc2V0IChsb3cgMzIgYml0cykKLQotCSAgIHN0YWNrIHF3IGFyZ3VtZW50IGFuZCBzZWN0aW9uIGluZGV4Ci0JICAgKHNlZSBFVElSX1NfQ19TVE9fT0ZGLCBFVElSX1NfQ19DVExfU0VUUkIpICAqLwotCi0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9QUToKLSAgCXsKLQkgIHVxdWFkIGR1bW15OwotCSAgaW50IHBzZWN0OwotCi0JICBwc2VjdCA9IGJmZF9nZXRsMzIgKHB0cik7Ci0JICBpZiAocHNlY3QgPj0gUFJJVihzZWN0aW9uX2NvdW50KSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiQmFkIHNlY3Rpb24gaW5kZXggaW4gRVRJUl9TX0NfU1RBX1BRIikpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZHVtbXkgPSBiZmRfZ2V0bDY0IChwdHIrNCk7Ci0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCBkdW1teSwgcHNlY3QpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLQotCS8qIGFsbCBub3Qgc3VwcG9ydGVkICAqLwotCi0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9MSToKLSAgICAgIGNhc2UgRVRJUl9TX0NfU1RBX01PRDoKLSAgICAgIGNhc2UgRVRJUl9TX0NfU1RBX0NLQVJHOgotCi0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJVbnN1cHBvcnRlZCBTVEEgY21kICVkIiksIGNtZCk7Ci0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBTVEEgY21kICVkIiksIGNtZCk7Ci0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfc3RhIHRydWVcbiIpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qCi0gICBldGlyX3N0bwotICAKLSAgIHZtcyBzdG9yZSBjb21tYW5kcwotICAKLSAgIGhhbmRsZSBzdG9feHh4IGNvbW1hbmRzIGluIGV0aXIgc2VjdGlvbgotICAgcHRyIHBvaW50cyB0byBkYXRhIGFyZWEgaW4gcmVjb3JkCi0gIAotICAgc2VlIHRhYmxlIEItOSBvZiB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZXRpcl9zdG8gKGFiZmQsIGNtZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBjbWQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLXsKLSAgdXF1YWQgZHVtbXk7Ci0gIGludCBwc2VjdDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfc3RvICVkLyV4XG4iLCBjbWQsIGNtZCk7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotCi0gICAgICAvKiBzdG9yZSBieXRlOiBwb3Agc3RhY2ssIHdyaXRlIGJ5dGUKLQkgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fQjoKLSAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotI2lmIDAKLSAgICAgIGlmIChpc19zaGFyZSkJCS8qIEZJWE1FICovCi0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiRVRJUl9TX0NfU1RPX0I6IGJ5dGUgZml4dXBzIG5vdCBzdXBwb3J0ZWQiKTsKLSNlbmRpZgotICAgICAgaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsJLyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogc3RvcmUgd29yZDogcG9wIHN0YWNrLCB3cml0ZSB3b3JkCi0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX1c6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLSNpZiAwCi0gICAgICBpZiAoaXNfc2hhcmUpCQkvKiBGSVhNRSAqLwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIkVUSVJfU19DX1NUT19COiB3b3JkIGZpeHVwcyBub3Qgc3VwcG9ydGVkIik7Ci0jZW5kaWYKLSAgICAgIGltYWdlX3dyaXRlX3cgKGFiZmQsIGR1bW15ICYgMHhmZmZmKTsJLyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogc3RvcmUgbG9uZ3dvcmQ6IHBvcCBzdGFjaywgd3JpdGUgbG9uZ3dvcmQKLQkgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fTFc6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLSAgICAgIGR1bW15ICs9IChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWE7Ci0gICAgICBpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIHF1YWR3b3JkOiBwb3Agc3RhY2ssIHdyaXRlIHF1YWR3b3JkCi0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX1FXOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0gICAgICBkdW1teSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotICAgICAgaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgZHVtbXkpOwkJLyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogc3RvcmUgaW1tZWRpYXRlIHJlcGVhdGVkOiBwb3Agc3RhY2sgZm9yIHJlcGVhdCBjb3VudAotCSBhcmc6IGx3CWJ5dGUgY291bnQKLQkgZGEJZGF0YSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0lNTVI6Ci0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCi0Jc2l6ZSA9IGJmZF9nZXRsMzIgKHB0cik7Ci0JZHVtbXkgPSAodW5zaWduZWQgbG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCXdoaWxlIChkdW1teS0tID4gMEwpCi0JICBpbWFnZV9kdW1wIChhYmZkLCBwdHIrNCwgc2l6ZSwgMCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogc3RvcmUgZ2xvYmFsOiB3cml0ZSBzeW1ib2wgdmFsdWUKLQkgYXJnOiBjcwlnbG9iYWwgc3ltYm9sIG5hbWUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19HQkw6Ci0gICAgICB7Ci0Jdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0JY2hhciAqbmFtZTsKLQotCW5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCWVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKiliZmRfaGFzaF9sb29rdXAgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0JaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgIHsKLQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fR0JMOiBubyBzeW1ib2wgXCIlc1wiIiksCi0JCQkJICAgbmFtZSk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQllbHNlCi0JICBpbWFnZV93cml0ZV9xIChhYmZkLCAodXF1YWQpKGVudHJ5LT5zeW1ib2wtPnZhbHVlKSk7CS8qIEZJWE1FLCByZWxvYyAqLwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGNvZGUgYWRkcmVzczogd3JpdGUgYWRkcmVzcyBvZiBlbnRyeSBwb2ludAotCSBhcmc6IGNzCWdsb2JhbCBzeW1ib2wgbmFtZSAocHJvY2VkdXJlKSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0NBOgotICAgICAgewotCXZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCWNoYXIgKm5hbWU7Ci0KLQluYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQllbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopIGJmZF9oYXNoX2xvb2t1cCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgbmFtZSwgZmFsc2UsIGZhbHNlKTsKLQlpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCSAgewotCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUT19DQTogbm8gc3ltYm9sIFwiJXNcIiIpLAotCQkJCSAgIG5hbWUpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JZWxzZQotCSAgaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgKHVxdWFkKShlbnRyeS0+c3ltYm9sLT52YWx1ZSkpOwkvKiBGSVhNRSwgcmVsb2MgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBub3Qgc3VwcG9ydGVkICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fUkI6Ci0gICAgY2FzZSBFVElSX1NfQ19TVE9fQUI6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUT19SQi9BQjogTm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogc3RvcmUgb2Zmc2V0IHRvIHBzZWN0OiBwb3Agc3RhY2ssIGFkZCBsb3cgMzIgYml0cyB0byBiYXNlIG9mIHBzZWN0Ci0gICAgICAgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fT0ZGOgotICAgICAgewotCXVxdWFkIHE7Ci0JaW50IHBzZWN0OwotCi0JcSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlxICs9IChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWE7Ci0JaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgcSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogc3RvcmUgaW1tZWRpYXRlCi0JIGFyZzogbHcJY291bnQgb2YgYnl0ZXMKLQkgZGEJZGF0YSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0lNTToKLSAgICAgIHsKLQlpbnQgc2l6ZTsKLQotCXNpemUgPSBiZmRfZ2V0bDMyIChwdHIpOwotCWltYWdlX2R1bXAgKGFiZmQsIHB0cis0LCBzaXplLCAwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiB0aGlzIGNvZGUgaXMgJ3Jlc2VydmVkIHRvIGRpZ2l0YWwnIGFjY29yZGluZyB0byB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsLAotCSBob3dldmVyIGl0IGlzIGdlbmVyYXRlZCBieSB0aGUgREVDIEMgY29tcGlsZXIgYW5kIGRlZmluZWQgaW4gdGhlIGluY2x1ZGUgZmlsZS4KLQkgRklYTUUsIHNpbmNlIHRoZSBmb2xsb3dpbmcgaXMganVzdCBhIGd1ZXNzCi0JIHN0b3JlIGdsb2JhbCBsb25nd29yZDogc3RvcmUgMzJiaXQgdmFsdWUgb2Ygc3ltYm9sCi0JIGFyZzogY3MJc3ltYm9sIG5hbWUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19HQkxfTFc6Ci0gICAgICB7Ci0Jdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0JY2hhciAqbmFtZTsKLQotCW5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCWVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKiliZmRfaGFzaF9sb29rdXAgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0JaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgIHsKLSNpZiBWTVNfREVCVUcKLQkgICAgX2JmZF92bXNfZGVidWcgKDMsICJFVElSX1NfQ19TVE9fR0JMX0xXOiBubyBzeW1ib2wgXCIlc1wiXG4iLCBuYW1lKTsKLSNlbmRpZgotCSAgICBpbWFnZV93cml0ZV9sIChhYmZkLCAodW5zaWduZWQgbG9uZykwKTsJLyogRklYTUUsIHJlbG9jICovCi0JICB9Ci0JZWxzZQotCSAgaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKGVudHJ5LT5zeW1ib2wtPnZhbHVlKSk7CS8qIEZJWE1FLCByZWxvYyAqLwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19MUF9QU0I6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUT19MUF9QU0I6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIC8qICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19ISU5UX0dCTDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RPX0hJTlRfR0JMOiBub3QgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIC8qICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19ISU5UX1BTOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fSElOVF9QUzogbm90IGltcGxlbWVudGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBTVE8gY21kICVkIiksIGNtZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIHN0YWNrIG9wZXJhdG9yIGNvbW1hbmRzCi0gICBhbGwgMzIgYml0IHNpZ25lZCBhcml0aG1ldGljCi0gICBhbGwgd29yZCBqdXN0IGxpa2UgYSBzdGFjayBjYWxjdWxhdG9yCi0gICBhcmd1bWVudHMgYXJlIHBvcHBlZCBmcm9tIHN0YWNrLCByZXN1bHRzIGFyZSBwdXNoZWQgb24gc3RhY2sKLSAgCi0gICBzZWUgdGFibGUgQi0xMCBvZiB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZXRpcl9vcHIgKGFiZmQsIGNtZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBjbWQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLXsKLSAgbG9uZyBvcDEsIG9wMjsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfb3ByICVkLyV4XG4iLCBjbWQsIGNtZCk7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotICAgICAgLyogb3BlcmF0aW9uICovCi0KLSAgICAgIC8qIG5vLW9wICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfTk9QOgotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGFkZCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0FERDoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgKyBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogc3VidHJhY3QgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9TVUI6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AyIC0gb3AxKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIG11bHRpcGx5ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfTVVMOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMSAqIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBkaXZpZGUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9ESVY6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIGlmIChvcDIgPT0gMCkKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpMEwsIC0xKTsKLSAgICAgIGVsc2UKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMiAvIG9wMSksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBsb2dpY2FsIGFuZCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0FORDoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgJiBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogbG9naWNhbCBpbmNsdXNpdmUgb3IJICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9JT1I6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AxIHwgb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGxvZ2ljYWwgZXhjbHVzaXZlIG9yICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfRU9SOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMSBeIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBuZWdhdGUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9ORUc6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKSgtb3AxKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGNvbXBsZW1lbnQgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9DT006Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgXiAtMUwpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogaW5zZXJ0IGZpZWxkICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfSU5TVjoKLSAgICAgICh2b2lkKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX09QUl9JTlNWOiBOb3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBhcml0aG1ldGljIHNoaWZ0ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfQVNIOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBpZiAob3AyIDwgMCkJCS8qIHNoaWZ0IHJpZ2h0ICovCi0Jb3AxID4+PSAtb3AyOwotICAgICAgZWxzZQkJCS8qIHNoaWZ0IGxlZnQgKi8KLQlvcDEgPDw9IG9wMjsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZClvcDEsIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiB1bnNpZ25lZCBzaGlmdCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX1VTSDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfT1BSX1VTSDogTm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiByb3RhdGUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9ST1Q6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX09QUl9ST1Q6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogc2VsZWN0ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfU0VMOgotICAgICAgaWYgKChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCkgJiAweDAxTCkKLQkodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgZWxzZQotCXsKLQkgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JICAodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKW9wMSwgLTEpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiByZWRlZmluZSBzeW1ib2wgdG8gY3VycmVudCBsb2NhdGlvbiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX1JFREVGOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19PUFJfUkVERUY6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogZGVmaW5lIGEgbGl0ZXJhbCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0RGTElUOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19PUFJfREZMSVQ6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlJlc2VydmVkIE9QUiBjbWQgJWQiKSwgY21kKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBjb250cm9sIGNvbW1hbmRzCi0gIAotICAgc2VlIHRhYmxlIEItMTEgb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWV0aXJfY3RsIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0gIHVxdWFkCSBkdW1teTsKLSAgaW50IHBzZWN0OwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAiZXRpcl9jdGwgJWQvJXhcbiIsIGNtZCwgY21kKTsKLSAgX2JmZF9oZXhkdW1wICg4LCBwdHIsIDE2LCAoaW50KXB0cik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGNtZCkKLSAgICB7Ci0gICAgICAvKiBzZXQgcmVsb2NhdGlvbiBiYXNlOiBwb3Agc3RhY2ssIHNldCBpbWFnZSBsb2NhdGlvbiBjb3VudGVyCi0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfQ1RMX1NFVFJCOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0gICAgICBpbWFnZV9zZXRfcHRyIChhYmZkLCBwc2VjdCwgZHVtbXkpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGF1Z21lbnQgcmVsb2NhdGlvbiBiYXNlOiBpbmNyZW1lbnQgaW1hZ2UgbG9jYXRpb24gY291bnRlciBieSBvZmZzZXQKLQkgYXJnOiBsdwlvZmZzZXQgdmFsdWUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX0NUTF9BVUdSQjoKLSAgICAgIGR1bW15ID0gYmZkX2dldGwzMiAocHRyKTsKLSAgICAgIGltYWdlX2luY19wdHIgKGFiZmQsIGR1bW15KTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBkZWZpbmUgbG9jYXRpb246IHBvcCBpbmRleCwgc2F2ZSBsb2NhdGlvbiBjb3VudGVyIHVuZGVyIGluZGV4Ci0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfQ1RMX0RGTE9DOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgLyogRklYTUUgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzZXQgbG9jYXRpb246IHBvcCBpbmRleCwgcmVzdG9yZSBsb2NhdGlvbiBjb3VudGVyIGZyb20gaW5kZXgKLQkgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19DVExfU1RMT0M6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogc3RhY2sgZGVmaW5lZCBsb2NhdGlvbjogcG9wIGluZGV4LCBwdXNoIGxvY2F0aW9uIGNvdW50ZXIgZnJvbSBpbmRleAotCSBhcmc6IC0gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX0NUTF9TVEtETDoKLSAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotICAgICAgLyogRklYTUUgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgQ1RMIGNtZCAlZCIpLCBjbWQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBzdG9yZSBjb25kaXRpb25hbCBjb21tYW5kcwotICAKLSAgIHNlZSB0YWJsZSBCLTEyIGFuZCBCLTEzIG9mIHRoZSBvcGVuVk1TIGxpbmtlciBtYW51YWwgICovCi0KLXN0YXRpYyBib29sZWFuCi1ldGlyX3N0YyAoYWJmZCwgY21kLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGNtZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotewotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAiZXRpcl9zdGMgJWQvJXhcbiIsIGNtZCwgY21kKTsKLSAgX2JmZF9oZXhkdW1wICg4LCBwdHIsIDE2LCAoaW50KXB0cik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGNtZCkKLSAgICB7Ci0gICAgICAvKiAyMDAgU3RvcmUtY29uZGl0aW9uYWwgTGlua2FnZSBQYWlyCi0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19MUDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RDX0xQOiBub3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIDIwMSBTdG9yZS1jb25kaXRpb25hbCBMaW5rYWdlIFBhaXIgd2l0aCBQcm9jZWR1cmUgU2lnbmF0dXJlCi0JIGFyZzoJbHcJbGlua2FnZSBpbmRleAotCSBjcwlwcm9jZWR1cmUgbmFtZQotCSBieQlzaWduYXR1cmUgbGVuZ3RoCi0JIGRhCXNpZ25hdHVyZSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0xQX1BTQjoKLSAgICAgIGltYWdlX2luY19wdHIgKGFiZmQsIDE2KTsJLyogc2tpcCBlbnRyeSxwcm9jdmFsICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogMjAyIFN0b3JlLWNvbmRpdGlvbmFsIEFkZHJlc3MgYXQgZ2xvYmFsIGFkZHJlc3MKLQkgYXJnOglsdwlsaW5rYWdlIGluZGV4Ci0JIGNzCWdsb2JhbCBuYW1lICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfR0JMOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVENfR0JMOiBub3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIDIwMyBTdG9yZS1jb25kaXRpb25hbCBDb2RlIEFkZHJlc3MgYXQgZ2xvYmFsIGFkZHJlc3MKLQkgYXJnOglsdwlsaW5rYWdlIGluZGV4Ci0JIGNzCXByb2NlZHVyZSBuYW1lICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfR0NBOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVENfR0NBOiBub3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIDIwNCBTdG9yZS1jb25kaXRpb25hbCBBZGRyZXNzIGF0IHBzZWN0ICsgb2Zmc2V0Ci0JIGFyZzoJbHcJbGlua2FnZSBpbmRleAotCSBsdwlwc2VjdCBpbmRleAotCSBxdwlvZmZzZXQgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19QUzoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RDX1BTOiBub3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIDIwNSBTdG9yZS1jb25kaXRpb25hbCBOT1AgYXQgYWRkcmVzcyBvZiBnbG9iYWwKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX05PUF9HQkw6Ci0KLSAgICAgIC8qIDIwNiBTdG9yZS1jb25kaXRpb25hbCBOT1AgYXQgcGVjdCArIG9mZnNldAotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfTk9QX1BTOgotCi0gICAgICAvKiAyMDcgU3RvcmUtY29uZGl0aW9uYWwgQlNSIGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19CU1JfR0JMOgotCi0gICAgICAvKiAyMDggU3RvcmUtY29uZGl0aW9uYWwgQlNSIGF0IHBlY3QgKyBvZmZzZXQKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0JTUl9QUzoKLQotICAgICAgLyogMjA5IFN0b3JlLWNvbmRpdGlvbmFsIExEQSBhdCBnbG9iYWwgYWRkcmVzcwotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfTERBX0dCTDoKLQotICAgICAgLyogMjEwIFN0b3JlLWNvbmRpdGlvbmFsIExEQSBhdCBwc2VjdCArIG9mZnNldAotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfTERBX1BTOgotCi0gICAgICAvKiAyMTEgU3RvcmUtY29uZGl0aW9uYWwgQlNSIG9yIEhpbnQgYXQgZ2xvYmFsIGFkZHJlc3MKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0JPSF9HQkw6Ci0KLSAgICAgIC8qIDIxMiBTdG9yZS1jb25kaXRpb25hbCBCU1Igb3IgSGludCBhdCBwZWN0ICsgb2Zmc2V0Ci0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19CT0hfUFM6Ci0KLSAgICAgIC8qIDIxMyBTdG9yZS1jb25kaXRpb25hbCBOT1AsQlNSIG9yIEhJTlQgYXQgZ2xvYmFsIGFkZHJlc3MKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX05CSF9HQkw6Ci0KLSAgICAgIC8qIDIxNCBTdG9yZS1jb25kaXRpb25hbCBOT1AsQlNSIG9yIEhJTlQgYXQgcHNlY3QgKyBvZmZzZXQKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX05CSF9QUzoKLS8qIEZJWE1FICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCJFVElSX1NfQ19TVENfeHg6ICglZCkgbm90IHN1cHBvcnRlZCIsIGNtZCk7ICovCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0jaWYgVk1TX0RFQlVHCi0gICAgICBfYmZkX3Ztc19kZWJ1ZyAoMywgICJSZXNlcnZlZCBTVEMgY21kICVkIiwgY21kKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgYXNlY3Rpb24gKgotbmV3X3NlY3Rpb24gKGFiZmQsIGlkeCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgaWR4OwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgY2hhciBzbmFtZVsxNl07Ci0gIGNoYXIgKm5hbWU7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICAibmV3X3NlY3Rpb24gJWRcbiIsIGlkeCk7Ci0jZW5kaWYKLSAgc3ByaW50ZiAoc25hbWUsIFNFQ1RJT05fTkFNRV9URU1QTEFURSwgaWR4KTsKLQotICBuYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChzbmFtZSkgKyAxKTsKLSAgaWYgKG5hbWUgPT0gMCkKLSAgICByZXR1cm4gMDsKLSAgc3RyY3B5IChuYW1lLCBzbmFtZSk7Ci0KLSAgc2VjdGlvbiA9IGJmZF9tYWxsb2MgKHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKHNlY3Rpb24gPT0gMCkKLSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICBfYmZkX3Ztc19kZWJ1ZyAoNiwgICJiZmRfbWFrZV9zZWN0aW9uICglcykgZmFpbGVkIiwgbmFtZSk7Ci0jZW5kaWYKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBzZWN0aW9uLT5fcmF3X3NpemUgPSAwOwotICBzZWN0aW9uLT52bWEgPSAwOwotICBzZWN0aW9uLT5jb250ZW50cyA9IDA7Ci0gIHNlY3Rpb24tPl9jb29rZWRfc2l6ZSA9IDA7Ci0gIHNlY3Rpb24tPm5hbWUgPSBuYW1lOwotICBzZWN0aW9uLT5pbmRleCA9IGlkeDsKLQotICByZXR1cm4gc2VjdGlvbjsKLX0KLQotCi1zdGF0aWMgaW50Ci1hbGxvY19zZWN0aW9uIChhYmZkLCBpZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGlkeDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDQsICAiYWxsb2Nfc2VjdGlvbiAlZFxuIiwgaWR4KTsKLSNlbmRpZgotCi0gIFBSSVYoc2VjdGlvbnMpID0gKChhc2VjdGlvbiAqKikKLQkJICAgIGJmZF9yZWFsbG9jIChQUklWKHNlY3Rpb25zKSwgKGlkeCsxKSAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLSAgaWYgKFBSSVYoc2VjdGlvbnMpID09IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIHdoaWxlIChQUklWKHNlY3Rpb25fY291bnQpIDw9IGlkeCkKLSAgICB7Ci0gICAgICBQUklWKHNlY3Rpb25zKVtQUklWKHNlY3Rpb25fY291bnQpXSA9IG5ld19zZWN0aW9uIChhYmZkLCBQUklWKHNlY3Rpb25fY291bnQpKTsKLSAgICAgIGlmIChQUklWKHNlY3Rpb25zKVtQUklWKHNlY3Rpb25fY291bnQpXSA9PSAwKQotCXJldHVybiAtMTsKLSAgICAgIFBSSVYoc2VjdGlvbl9jb3VudCkrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIHRpcl9zdGEKLSAqCi0gKiB2YXggc3RhY2sgY29tbWFuZHMKLSAqCi0gKiBoYW5kbGUgc3RhX3h4eCBjb21tYW5kcyBpbiB0aXIgc2VjdGlvbgotICogcHRyIHBvaW50cyB0byBkYXRhIGFyZWEgaW4gcmVjb3JkCi0gKgotICogc2VlIHRhYmxlIDctMyBvZiB0aGUgVkFYL1ZNUyBsaW5rZXIgbWFudWFsCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdGlyX3N0YSAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCi17Ci0gIGludCBjbWQgPSAqcHRyKys7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJ0aXJfc3RhICVkXG4iLCBjbWQpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotICAvKiBzdGFjayAqLwotICAgICAgY2FzZSBUSVJfU19DX1NUQV9HQkw6Ci0JLyoKLQkgKiBzdGFjayBnbG9iYWwKLQkgKiBhcmc6IGNzCXN5bWJvbCBuYW1lCi0JICoKLQkgKiBzdGFjayAzMiBiaXQgdmFsdWUgb2Ygc3ltYm9sIChoaWdoIGJpdHMgc2V0IHRvIDApCi0JICovCi0JewotCSAgY2hhciAqbmFtZTsKLQkgIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCi0JICBuYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQotICAgICAgICAgIGVudHJ5ID0gX2JmZF92bXNfZW50ZXJfc3ltYm9sIChhYmZkLCBuYW1lKTsKLQkgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICAgIHJldHVybiAwOwotCi0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykoZW50cnktPnN5bWJvbC0+dmFsdWUpLCAtMSk7Ci0JICBwdHIgKz0gKnB0ciArIDE7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfU0I6Ci0JLyoKLQkgKiBzdGFjayBzaWduZWQgYnl0ZQotCSAqIGFyZzogYnkJdmFsdWUKLQkgKgotCSAqIHN0YWNrIGJ5dGUgdmFsdWUsIHNpZ24gZXh0ZW5kIHRvIDMyIGJpdAotCSAqLwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIChsb25nKSpwdHIrKywgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfU1c6Ci0JLyoKLQkgKiBzdGFjayBzaWduZWQgc2hvcnQgd29yZAotCSAqIGFyZzogc2gJdmFsdWUKLQkgKgotCSAqIHN0YWNrIDE2IGJpdCB2YWx1ZSwgc2lnbiBleHRlbmQgdG8gMzIgYml0Ci0JICovCi0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKGxvbmcpYmZkX2dldGwxNihwdHIpLCAtMSk7Ci0JcHRyICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9MVzoKLQkvKgotCSAqIHN0YWNrIHNpZ25lZCBsb25nd29yZAotCSAqIGFyZzogbHcJdmFsdWUKLQkgKgotCSAqIHN0YWNrIDMyIGJpdCB2YWx1ZQotCSAqLwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIChsb25nKWJmZF9nZXRsMzIgKHB0ciksIC0xKTsKLQlwdHIgKz0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1BCOgotICAgICAgY2FzZSBUSVJfU19DX1NUQV9XUEI6Ci0JLyoKLQkgKiBzdGFjayBwc2VjdCBiYXNlIHBsdXMgYnl0ZSBvZmZzZXQgKHdvcmQgaW5kZXgpCi0JICogYXJnOiBieQlzZWN0aW9uIGluZGV4Ci0JICoJKHNoCXNlY3Rpb24gaW5kZXgpCi0JICoJYnkJc2lnbmVkIGJ5dGUgb2Zmc2V0Ci0JICoKLQkgKi8KLSAgCXsKLQkgIHVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0JICBpbnQgcHNlY3Q7Ci0KLQkgIGlmIChjbWQgPT0gVElSX1NfQ19TVEFfUEIpCi0JICAgIHBzZWN0ID0gKnB0cisrOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHNlY3QgPSBiZmRfZ2V0bDE2KHB0cik7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgIH0KLQotCSAgaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICAgIHsKLQkgICAgICBhbGxvY19zZWN0aW9uIChhYmZkLCBwc2VjdCk7Ci0JICAgIH0KLQotCSAgZHVtbXkgPSAobG9uZykqcHRyKys7Ci0JICBkdW1teSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgZHVtbXksIHBzZWN0KTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfUFc6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1dQVzoKLQkvKgotCSAqIHN0YWNrIHBzZWN0IGJhc2UgcGx1cyB3b3JkIG9mZnNldCAod29yZCBpbmRleCkKLQkgKiBhcmc6IGJ5CXNlY3Rpb24gaW5kZXgKLQkgKgkoc2gJc2VjdGlvbiBpbmRleCkKLQkgKglzaAlzaWduZWQgc2hvcnQgb2Zmc2V0Ci0JICoKLQkgKi8KLSAgCXsKLQkgIHVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0JICBpbnQgcHNlY3Q7Ci0KLQkgIGlmIChjbWQgPT0gVElSX1NfQ19TVEFfUFcpCi0JICAgIHBzZWN0ID0gKnB0cisrOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHNlY3QgPSBiZmRfZ2V0bDE2KHB0cik7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgIH0KLQotCSAgaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICAgIHsKLQkgICAgICBhbGxvY19zZWN0aW9uIChhYmZkLCBwc2VjdCk7Ci0JICAgIH0KLQotCSAgZHVtbXkgPSBiZmRfZ2V0bDE2KHB0cik7IHB0cis9MjsKLQkgIGR1bW15ICs9IChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWE7Ci0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCBkdW1teSwgcHNlY3QpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9QTDoKLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfV1BMOgotCS8qCi0JICogc3RhY2sgcHNlY3QgYmFzZSBwbHVzIGxvbmcgb2Zmc2V0ICh3b3JkIGluZGV4KQotCSAqIGFyZzogYnkJc2VjdGlvbiBpbmRleAotCSAqCShzaAlzZWN0aW9uIGluZGV4KQotCSAqCWx3CXNpZ25lZCBsb25nd29yZCBvZmZzZXQKLQkgKgotCSAqLwotICAJewotCSAgdW5zaWduZWQgbG9uZyBkdW1teTsKLQkgIGludCBwc2VjdDsKLQotCSAgaWYgKGNtZCA9PSBUSVJfU19DX1NUQV9QTCkKLQkgICAgcHNlY3QgPSAqcHRyKys7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwc2VjdCA9IGJmZF9nZXRsMTYocHRyKTsKLQkgICAgICBwdHIgKz0gMjsKLQkgICAgfQotCi0JICBpZiAocHNlY3QgPj0gUFJJVihzZWN0aW9uX2NvdW50KSkKLQkgICAgewotCSAgICAgIGFsbG9jX3NlY3Rpb24gKGFiZmQsIHBzZWN0KTsKLQkgICAgfQotCi0JICBkdW1teSA9IGJmZF9nZXRsMzIgKHB0cik7IHB0ciArPSA0OwotCSAgZHVtbXkgKz0gKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYTsKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsIGR1bW15LCBwc2VjdCk7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1VCOgotCS8qCi0JICogc3RhY2sgdW5zaWduZWQgYnl0ZQotCSAqIGFyZzogYnkJdmFsdWUKLQkgKgotCSAqIHN0YWNrIGJ5dGUgdmFsdWUKLQkgKi8KLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykqcHRyKyssIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1VXOgotCS8qCi0JICogc3RhY2sgdW5zaWduZWQgc2hvcnQgd29yZAotCSAqIGFyZzogc2gJdmFsdWUKLQkgKgotCSAqIHN0YWNrIDE2IGJpdCB2YWx1ZQotCSAqLwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKWJmZF9nZXRsMTYocHRyKSwgLTEpOwotCXB0ciArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfQkZJOgotCS8qCi0JICogc3RhY2sgYnl0ZSBmcm9tIGltYWdlCi0JICogYXJnOiAtCi0JICoKLQkgKi8KLQkvKkZBTExUSFJVKi8KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfV0ZJOgotCS8qCi0JICogc3RhY2sgYnl0ZSBmcm9tIGltYWdlCi0JICogYXJnOiAtCi0JICoKLQkgKi8KLQkvKkZBTExUSFJVKi8KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfTEZJOgotCS8qCi0JICogc3RhY2sgYnl0ZSBmcm9tIGltYWdlCi0JICogYXJnOiAtCi0JICoKLQkgKi8KLSAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjay1mcm9tLWltYWdlIG5vdCBpbXBsZW1lbnRlZCIpKTsKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9FUE06Ci0JLyoKLQkgKiBzdGFjayBlbnRyeSBwb2ludCBtYXNrCi0JICogYXJnOiBjcwlzeW1ib2wgbmFtZQotCSAqCi0JICogc3RhY2sgKHVuc2lnbmVkKSBlbnRyeSBwb2ludCBtYXNrIG9mIHN5bWJvbAotCSAqIGVyciBpZiBzeW1ib2wgaXMgbm8gZW50cnkgcG9pbnQKLQkgKi8KLQl7Ci0JICBjaGFyICpuYW1lOwotCSAgdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0KLQkgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCSAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpOwotCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrLWVudHJ5LW1hc2sgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgMEwsIC0xKTsKLQkgIHB0ciArPSAqcHRyICsgMTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9DS0FSRzoKLQkvKgotCSAqIGNvbXBhcmUgcHJvY2VkdXJlIGFyZ3VtZW50Ci0JICogYXJnOiBjcwlzeW1ib2wgbmFtZQotCSAqCWJ5CWFyZ3VtZW50IGluZGV4Ci0JICoJZGEJYXJndW1lbnQgZGVzY3JpcHRvcgotCSAqCi0JICogY29tcGFyZSBhcmd1bWVudCBkZXNjcmlwdG9yIHdpdGggc3ltYm9sIGFyZ3VtZW50IChBUkckVl9QQVNTTUVDSCkKLQkgKiBhbmQgc3RhY2sgVFJVRSAoYXJncyBtYXRjaCkgb3IgRkFMU0UgKGFyZ3MgZG9udCBtYXRjaCkgdmFsdWUKLQkgKi8KLSAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJQQVNTTUVDSCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiKSk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgMUwsIC0xKTsKLQlicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9MU1k6Ci0JLyoKLQkgKiBzdGFjayBsb2NhbCBzeW1ib2wgdmFsdWUKLQkgKiBhcmc6CXNoCWVudmlyb25tZW50IGluZGV4Ci0JICoJY3MJc3ltYm9sIG5hbWUKLQkgKi8KLQl7Ci0JICBpbnQgZW52aWR4OwotCSAgY2hhciAqbmFtZTsKLQkgIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCi0JICBlbnZpZHggPSBiZmRfZ2V0bDE2KHB0cik7IHB0ciArPSAyOwotCSAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JICBlbnRyeSA9IF9iZmRfdm1zX2VudGVyX3N5bWJvbCAoYWJmZCwgbmFtZSk7Ci0JICBpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCSAgICByZXR1cm4gMDsKLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrLWxvY2FsLXN5bWJvbCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiKSk7Ci0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCAwTCwgLTEpOwotCSAgcHRyICs9ICpwdHIgKyAxOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX0xJVDoKLQkvKgotCSAqIHN0YWNrIGxpdGVyYWwKLSAJICogYXJnOglieQlsaXRlcmFsIGluZGV4Ci0JICoKLQkgKiBzdGFjayBsaXRlcmFsCi0JICovCi0JcHRyKys7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgMEwsIC0xKTsKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrLWxpdGVyYWwgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotCWJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX0xFUE06Ci0JLyoKLQkgKiBzdGFjayBsb2NhbCBzeW1ib2wgZW50cnkgcG9pbnQgbWFzawotCSAqIGFyZzoJc2gJZW52aXJvbm1lbnQgaW5kZXgKLQkgKgljcwlzeW1ib2wgbmFtZQotCSAqCi0JICogc3RhY2sgKHVuc2lnbmVkKSBlbnRyeSBwb2ludCBtYXNrIG9mIHN5bWJvbAotCSAqIGVyciBpZiBzeW1ib2wgaXMgbm8gZW50cnkgcG9pbnQKLQkgKi8KLQl7Ci0JICBpbnQgZW52aWR4OwotCSAgY2hhciAqbmFtZTsKLQkgIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCi0JICBlbnZpZHggPSBiZmRfZ2V0bDE2KHB0cik7IHB0ciArPSAyOwotCSAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JICBlbnRyeSA9IF9iZmRfdm1zX2VudGVyX3N5bWJvbCAoYWJmZCwgbmFtZSk7Ci0JICBpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCSAgICByZXR1cm4gMDsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiU3RhY2stbG9jYWwtc3ltYm9sLWVudHJ5LXBvaW50LW1hc2sgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgMEwsIC0xKTsKLQkgIHB0ciArPSAqcHRyICsgMTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlJlc2VydmVkIFNUQSBjbWQgJWQiKSwgcHRyWy0xXSk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBwdHI7Ci19Ci0KLQotLyoKLSAqIHRpcl9zdG8KLSAqCi0gKiB2YXggc3RvcmUgY29tbWFuZHMKLSAqCi0gKiBoYW5kbGUgc3RvX3h4eCBjb21tYW5kcyBpbiB0aXIgc2VjdGlvbgotICogcHRyIHBvaW50cyB0byBkYXRhIGFyZWEgaW4gcmVjb3JkCi0gKgotICogc2VlIHRhYmxlIDctNCBvZiB0aGUgVkFYL1ZNUyBsaW5rZXIgbWFudWFsCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdGlyX3N0byAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCi17Ci0gIHVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0gIGludCBzaXplOwotICBpbnQgcHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJ0aXJfc3RvICVkXG4iLCAqcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoKnB0cisrKQotICAgIHsKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fU0I6Ci0JLyoKLQkgKiBzdG9yZSBzaWduZWQgYnl0ZTogcG9wIHN0YWNrLCB3cml0ZSBieXRlCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsJLyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUT19TVzoKLQkvKgotCSAqIHN0b3JlIHNpZ25lZCB3b3JkOiBwb3Agc3RhY2ssIHdyaXRlIHdvcmQKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpbWFnZV93cml0ZV93IChhYmZkLCBkdW1teSAmIDB4ZmZmZik7CS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fTFc6Ci0JLyoKLQkgKiBzdG9yZSBsb25nd29yZDogcG9wIHN0YWNrLCB3cml0ZSBsb25nd29yZAotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotCWltYWdlX3dyaXRlX2wgKGFiZmQsIGR1bW15ICYgMHhmZmZmZmZmZik7LyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUT19CRDoKLQkvKgotCSAqIHN0b3JlIGJ5dGUgZGlzcGxhY2VkOiBwb3Agc3RhY2ssIHN1YiBsYysxLCB3cml0ZSBieXRlCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JZHVtbXkgLT0gKChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWEgKyAxKTsKLQlpbWFnZV93cml0ZV9iIChhYmZkLCBkdW1teSAmIDB4ZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fV0Q6Ci0JLyoKLQkgKiBzdG9yZSB3b3JkIGRpc3BsYWNlZDogcG9wIHN0YWNrLCBzdWIgbGMrMiwgd3JpdGUgd29yZAotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotCWR1bW15IC09ICgoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hICsgMik7Ci0JaW1hZ2Vfd3JpdGVfdyAoYWJmZCwgZHVtbXkgJiAweGZmZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX0xEOgotCS8qCi0JICogc3RvcmUgbG9uZyBkaXNwbGFjZWQ6IHBvcCBzdGFjaywgc3ViIGxjKzQsIHdyaXRlIGxvbmcKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlkdW1teSAtPSAoKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYSArIDQpOwotCWltYWdlX3dyaXRlX2wgKGFiZmQsIGR1bW15ICYgMHhmZmZmZmZmZik7LyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fTEk6Ci0JLyoKLQkgKiBzdG9yZSBzaG9ydCBsaXRlcmFsOiBwb3Agc3RhY2ssIHdyaXRlIGJ5dGUKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpbWFnZV93cml0ZV9iIChhYmZkLCBkdW1teSAmIDB4ZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1BJRFI6Ci0JLyoKLQkgKiBzdG9yZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBkYXRhIHJlZmVyZW5jZTogcG9wIHN0YWNrLCB3cml0ZSBsb25nd29yZAotCSAqIGFyZzogLQotCSAqIEZJWE1FOiBpbmNvbXBsZXRlICEKLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1BJQ1I6Ci0JLyoKLQkgKiBzdG9yZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHJlZmVyZW5jZTogcG9wIHN0YWNrLCB3cml0ZSBsb25nd29yZAotCSAqIGFyZzogLQotCSAqIEZJWE1FOiBpbmNvbXBsZXRlICEKLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpbWFnZV93cml0ZV9iIChhYmZkLCAweDlmKTsKLQlpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JJVkI6Ci0JLyoKLQkgKiBzdG9yZSByZXBlYXRlZCBpbW1lZGlhdGUgdmFyaWFibGUgYnl0ZXMKLQkgKiAxLWJ5dGUgY291bnQgbiBmaWVsZCBmb2xsb3dlZCBieSBuIGJ5dGVzIG9mIGRhdGEKLQkgKiBwb3Agc3RhY2ssIHdyaXRlIG4gYnl0ZXMgPHN0YWNrPiB0aW1lcwotCSAqLwotCXNpemUgPSAqcHRyKys7Ci0JZHVtbXkgPSAodW5zaWduZWQgbG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCXdoaWxlIChkdW1teS0tID4gMEwpCi0JICBpbWFnZV9kdW1wIChhYmZkLCBwdHIsIHNpemUsIDApOwotCXB0ciArPSBzaXplOwotCWJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19COgotCS8qCi0JICogc3RvcmUgYnl0ZSBmcm9tIHRvcCBsb25nd29yZAotCSAqLwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlpbWFnZV93cml0ZV9iIChhYmZkLCBkdW1teSAmIDB4ZmYpOwotCWJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19XOgotCS8qCi0JICogc3RvcmUgd29yZCBmcm9tIHRvcCBsb25nd29yZAotCSAqLwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlpbWFnZV93cml0ZV93IChhYmZkLCBkdW1teSAmIDB4ZmZmZik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JCOgotCS8qCi0JICogc3RvcmUgcmVwZWF0ZWQgYnl0ZSBmcm9tIHRvcCBsb25nd29yZAotCSAqLwotCXNpemUgPSAodW5zaWduZWQgbG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQl3aGlsZSAoc2l6ZS0tID4gMCkKLQkgIGltYWdlX3dyaXRlX2IgKGFiZmQsIGR1bW15ICYgMHhmZik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JXOgotCS8qCi0JICogc3RvcmUgcmVwZWF0ZWQgd29yZCBmcm9tIHRvcCBsb25nd29yZAotCSAqLwotCXNpemUgPSAodW5zaWduZWQgbG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQl3aGlsZSAoc2l6ZS0tID4gMCkKLQkgIGltYWdlX3dyaXRlX3cgKGFiZmQsIGR1bW15ICYgMHhmZmZmKTsKLQlicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUT19SU0I6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JTVzoKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fUkw6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1ZQUzoKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fVVNCOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19VU1c6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JVQjoKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fUlVXOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19QSVJSOgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVW5pbXBsZW1lbnRlZCBTVE8gY21kICVkIiksIHB0clstMV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBTVE8gY21kICVkIiksIHB0clstMV0pOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0KLS8qCi0gKiBzdGFjayBvcGVyYXRvciBjb21tYW5kcwotICogYWxsIDMyIGJpdCBzaWduZWQgYXJpdGhtZXRpYwotICogYWxsIHdvcmQganVzdCBsaWtlIGEgc3RhY2sgY2FsY3VsYXRvcgotICogYXJndW1lbnRzIGFyZSBwb3BwZWQgZnJvbSBzdGFjaywgcmVzdWx0cyBhcmUgcHVzaGVkIG9uIHN0YWNrCi0gKgotICogc2VlIHRhYmxlIDctNSBvZiB0aGUgVkFYL1ZNUyBsaW5rZXIgbWFudWFsCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdGlyX29wciAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCi17Ci0gIGxvbmcgb3AxLCBvcDI7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJ0aXJfb3ByICVkXG4iLCAqcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoKnB0cisrKQotICAgIHsKLSAgLyogb3BlcmF0aW9uICovCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX05PUDoKLQkvKgotCSAqIG5vLW9wCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9BREQ6Ci0JLyoKLQkgKiBhZGQKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSArIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX1NVQjoKLQkvKgotCSAqIHN1YnRyYWN0Ci0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDIgLSBvcDEpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9NVUw6Ci0JLyoKLQkgKiBtdWx0aXBseQotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AxICogb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfRElWOgotCS8qCi0JICogZGl2aWRlCi0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCWlmIChvcDIgPT0gMCkKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKTBMLCAtMSk7Ci0JZWxzZQotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMiAvIG9wMSksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0FORDoKLQkvKgotCSAqIGxvZ2ljYWwgYW5kCi0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDEgJiBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9JT1I6Ci0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQkvKgotCSAqIGxvZ2ljYWwgaW5jbHVzaXZlIG9yCi0JICovCi0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AxIHwgb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfRU9SOgotCS8qCi0JICogbG9naWNhbCBleGNsdXNpdmUgb3IKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSBeIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX05FRzoKLQkvKgotCSAqIG5lZ2F0ZQotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKC1vcDEpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9DT006Ci0JLyoKLQkgKiBjb21wbGVtZW50Ci0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AxIF4gLTFMKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfSU5TVjoKLQkvKgotCSAqIGluc2VydCBmaWVsZAotCSAqLwotCSh2b2lkKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpICAoIlRJUl9TX0NfT1BSX0lOU1YgaW5jb21wbGV0ZSIpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfQVNIOgotCS8qCi0JICogYXJpdGhtZXRpYyBzaGlmdAotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlpZiAoSElHSEJJVChvcDEpKQkJLyogc2hpZnQgcmlnaHQgKi8KLQkgIG9wMiA+Pj0gb3AxOwotCWVsc2UJCQkvKiBzaGlmdCBsZWZ0ICovCi0JICBvcDIgPDw9IG9wMTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZylvcDIsIC0xKTsKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRJUl9TX0NfT1BSX0FTSCBpbmNvbXBsZXRlIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfVVNIOgotCS8qCi0JICogdW5zaWduZWQgc2hpZnQKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaWYgKEhJR0hCSVQob3AxKSkJCS8qIHNoaWZ0IHJpZ2h0ICovCi0JICBvcDIgPj49IG9wMTsKLQllbHNlCQkJLyogc2hpZnQgbGVmdCAqLwotCSAgb3AyIDw8PSBvcDE7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpb3AyLCAtMSk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9VU0ggaW5jb21wbGV0ZSIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX1JPVDoKLQkvKgotCSAqIHJvdGF0ZQotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlpZiAoSElHSEJJVCgwKSkJCS8qIHNoaWZ0IHJpZ2h0ICovCi0JICBvcDIgPj49IG9wMTsKLQllbHNlCQkJLyogc2hpZnQgbGVmdCAqLwotCSAgb3AyIDw8PSBvcDE7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpb3AyLCAtMSk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9ST1QgaW5jb21wbGV0ZSIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX1NFTDoKLQkvKgotCSAqIHNlbGVjdAotCSAqLwotCWlmICgobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpICYgMHgwMUwpCi0JICAodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCWVsc2UKLQkgIHsKLQkgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQkgICAgKHZvaWQpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQkgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpb3AxLCAtMSk7Ci0JICB9Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9SRURFRjoKLQkvKgotCSAqIHJlZGVmaW5lIHN5bWJvbCB0byBjdXJyZW50IGxvY2F0aW9uCi0JICovCi0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9SRURFRiBub3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfREZMSVQ6Ci0JLyoKLQkgKiBkZWZpbmUgYSBsaXRlcmFsCi0JICovCi0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9ERkxJVCBub3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBPUFIgY21kICVkIiksIHB0clstMV0pOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBwdHI7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdGlyX2N0bCAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCi0vKgotICogY29udHJvbCBjb21tYW5kcwotICoKLSAqIHNlZSB0YWJsZSA3LTYgb2YgdGhlIFZBWC9WTVMgbGlua2VyIG1hbnVhbAotICovCi17Ci0gIHVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0gIGludCBwc2VjdDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgInRpcl9jdGwgJWRcbiIsICpwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoICgqcHRyKyspCi0gICAgewotICAgICAgY2FzZSBUSVJfU19DX0NUTF9TRVRSQjoKLQkvKgotCSAqIHNldCByZWxvY2F0aW9uIGJhc2U6IHBvcCBzdGFjaywgc2V0IGltYWdlIGxvY2F0aW9uIGNvdW50ZXIKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpZiAocHNlY3QgPj0gUFJJVihzZWN0aW9uX2NvdW50KSkKLQkgIHsKLQkgICAgYWxsb2Nfc2VjdGlvbiAoYWJmZCwgcHNlY3QpOwotCSAgfQotCWltYWdlX3NldF9wdHIgKGFiZmQsIHBzZWN0LCBkdW1teSk7Ci0gICAgICBicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19DVExfQVVHUkI6Ci0JLyoKLQkgKiBhdWdtZW50IHJlbG9jYXRpb24gYmFzZTogaW5jcmVtZW50IGltYWdlIGxvY2F0aW9uIGNvdW50ZXIgYnkgb2Zmc2V0Ci0JICogYXJnOiBsdwlvZmZzZXQgdmFsdWUKLQkgKi8KLQlkdW1teSA9IGJmZF9nZXRsMzIgKHB0cik7Ci0JaW1hZ2VfaW5jX3B0ciAoYWJmZCwgZHVtbXkpOwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfQ1RMX0RGTE9DOgotCS8qCi0JICogZGVmaW5lIGxvY2F0aW9uOiBwb3AgaW5kZXgsIHNhdmUgbG9jYXRpb24gY291bnRlciB1bmRlciBpbmRleAotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRJUl9TX0NfQ1RMX0RGTE9DIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX0NUTF9TVExPQzoKLQkvKgotCSAqIHNldCBsb2NhdGlvbjogcG9wIGluZGV4LCByZXN0b3JlIGxvY2F0aW9uIGNvdW50ZXIgZnJvbSBpbmRleAotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19DVExfU1RMT0Mgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUSVJfU19DX0NUTF9TVEtETDoKLQkvKgotCSAqIHN0YWNrIGRlZmluZWQgbG9jYXRpb246IHBvcCBpbmRleCwgcHVzaCBsb2NhdGlvbiBjb3VudGVyIGZyb20gaW5kZXgKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRJUl9TX0NfQ1RMX1NUS0RMIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgQ1RMIGNtZCAlZCIpLCBwdHJbLTFdKTsKLQlicmVhazsKLSAgfQotICByZXR1cm4gcHRyOwotfQotCi0KLS8qCi0gKiBoYW5kbGUgY29tbWFuZCBmcm9tIFRJUiBzZWN0aW9uCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdGlyX2NtZCAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCi17Ci0gIHN0cnVjdCB7Ci0gICAgaW50IG1pbmNvZDsKLSAgICBpbnQgbWF4Y29kOwotICAgIHVuc2lnbmVkIGNoYXIgKiAoKmV4cGxhaW4pKGJmZCAqLCB1bnNpZ25lZCBjaGFyICopOwotICB9IHRpcl90YWJsZVtdID0gewotICAgIHsgMCwJCSBUSVJfU19DX01BWFNUQUNPRCwgdGlyX3N0YSB9Ci0gICAseyBUSVJfU19DX01JTlNUT0NPRCwgVElSX1NfQ19NQVhTVE9DT0QsIHRpcl9zdG8gfQotICAgLHsgVElSX1NfQ19NSU5PUFJDT0QsIFRJUl9TX0NfTUFYT1BSQ09ELCB0aXJfb3ByIH0KLSAgICx7IFRJUl9TX0NfTUlOQ1RMQ09ELCBUSVJfU19DX01BWENUTENPRCwgdGlyX2N0bCB9Ci0gICAseyAtMSwgLTEsIE5VTEwgfQotICB9OwotICBpbnQgaSA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDQsICJ0aXJfY21kICVkLyV4XG4iLCAqcHRyLCAqcHRyKTsKLSAgX2JmZF9oZXhkdW1wICg4LCBwdHIsIDE2LCAoaW50KXB0cik7Ci0jZW5kaWYKLQotICBpZiAoKnB0ciAmIDB4ODApCQkJCS8qIHN0b3JlIGltbWVkaWF0ZSAqLwotICAgIHsKLSAgICAgIGkgPSAxMjggLSAoKnB0cisrICYgMHg3Zik7Ci0gICAgICBpbWFnZV9kdW1wIChhYmZkLCBwdHIsIGksIDApOwotICAgICAgcHRyICs9IGk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgd2hpbGUgKHRpcl90YWJsZVtpXS5taW5jb2QgPj0gMCkKLQl7Ci0JICBpZiAoICh0aXJfdGFibGVbaV0ubWluY29kIDw9ICpwdHIpIAotCSAgICAmJiAoKnB0ciA8PSB0aXJfdGFibGVbaV0ubWF4Y29kKSkKLQkgICAgewotCSAgICAgIHB0ciA9IHRpcl90YWJsZVtpXS5leHBsYWluIChhYmZkLCBwdHIpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpKys7Ci0JfQotICAgICAgaWYgKHRpcl90YWJsZVtpXS5taW5jb2QgPCAwKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiT2JqIGNvZGUgJWQgbm90IGZvdW5kIiksICpwdHIpOwotCSAgcHRyID0gMDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBwdHI7Ci19Ci0KLQotLyogaGFuZGxlIGNvbW1hbmQgZnJvbSBFVElSIHNlY3Rpb24gICovCi0KLXN0YXRpYyBpbnQKLWV0aXJfY21kIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0gIHN0YXRpYyBzdHJ1Y3QgewotICAgIGludCBtaW5jb2Q7Ci0gICAgaW50IG1heGNvZDsKLSAgICBib29sZWFuICgqZXhwbGFpbikgUEFSQU1TKChiZmQgKiwgaW50LCB1bnNpZ25lZCBjaGFyICopKTsKLSAgfSBldGlyX3RhYmxlW10gPSB7Ci0gICAgeyBFVElSX1NfQ19NSU5TVEFDT0QsIEVUSVJfU19DX01BWFNUQUNPRCwgZXRpcl9zdGEgfSwKLSAgICB7IEVUSVJfU19DX01JTlNUT0NPRCwgRVRJUl9TX0NfTUFYU1RPQ09ELCBldGlyX3N0byB9LAotICAgIHsgRVRJUl9TX0NfTUlOT1BSQ09ELCBFVElSX1NfQ19NQVhPUFJDT0QsIGV0aXJfb3ByIH0sCi0gICAgeyBFVElSX1NfQ19NSU5DVExDT0QsIEVUSVJfU19DX01BWENUTENPRCwgZXRpcl9jdGwgfSwKLSAgICB7IEVUSVJfU19DX01JTlNUQ0NPRCwgRVRJUl9TX0NfTUFYU1RDQ09ELCBldGlyX3N0YyB9LAotICAgIHsgLTEsIC0xLCBOVUxMIH0KLSAgfTsKLQotICBpbnQgaSA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDQsICJldGlyX2NtZCAlZC8leFxuIiwgY21kLCBjbWQpOwotICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKLSNlbmRpZgotCi0gIHdoaWxlIChldGlyX3RhYmxlW2ldLm1pbmNvZCA+PSAwKQotICAgIHsKLSAgICAgIGlmICggKGV0aXJfdGFibGVbaV0ubWluY29kIDw9IGNtZCkgCi0JJiYgKGNtZCA8PSBldGlyX3RhYmxlW2ldLm1heGNvZCkpCi0JewotCSAgaWYgKCFldGlyX3RhYmxlW2ldLmV4cGxhaW4gKGFiZmQsIGNtZCwgcHRyKSkKLQkgICAgcmV0dXJuIC0xOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaSsrOwotICAgIH0KLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNCwgImV0aXJfY21kOiA9IDBcbiIpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi0KLS8qIFRleHQgSW5mb3JtYXRpb24gYW5kIFJlbG9jYXRpb24gUmVjb3JkcyAoT0JKJENfVElSKQotICAgaGFuZGxlIHRpciByZWNvcmQgICovCi0KLXN0YXRpYyBpbnQKLWFuYWx5emVfdGlyIChhYmZkLCBwdHIsIGxlbmd0aCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKm1heHB0cjsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMywgImFuYWx5emVfdGlyOiAlZCBieXRlc1xuIiwgbGVuZ3RoKTsKLSNlbmRpZgotCi0gIG1heHB0ciA9IHB0ciArIGxlbmd0aDsKLQotICB3aGlsZSAocHRyIDwgbWF4cHRyKQotICAgIHsKLSAgICAgIHB0ciA9IHRpcl9jbWQgKGFiZmQsIHB0cik7Ci0gICAgICBpZiAocHRyID09IDApCi0JcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUZXh0IEluZm9ybWF0aW9uIGFuZCBSZWxvY2F0aW9uIFJlY29yZHMgKEVPQkokQ19FVElSKQotICAgaGFuZGxlIGV0aXIgcmVjb3JkICAqLwotCi1zdGF0aWMgaW50Ci1hbmFseXplX2V0aXIgKGFiZmQsIHB0ciwgbGVuZ3RoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICAgdW5zaWduZWQgaW50IGxlbmd0aDsKLXsKLSAgaW50IGNtZDsKLSAgdW5zaWduZWQgY2hhciAqbWF4cHRyOwotICBpbnQgcmVzdWx0ID0gMDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMywgImFuYWx5emVfZXRpcjogJWQgYnl0ZXNcbiIsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICBtYXhwdHIgPSBwdHIgKyBsZW5ndGg7Ci0KLSAgd2hpbGUgKHB0ciA8IG1heHB0cikKLSAgICB7Ci0gICAgICBjbWQgPSBiZmRfZ2V0bDE2IChwdHIpOwotICAgICAgbGVuZ3RoID0gYmZkX2dldGwxNiAocHRyICsgMik7Ci0gICAgICByZXN1bHQgPSBldGlyX2NtZCAoYWJmZCwgY21kLCBwdHIrNCk7Ci0gICAgICBpZiAocmVzdWx0ICE9IDApCi0JYnJlYWs7Ci0gICAgICBwdHIgKz0gbGVuZ3RoOwotICAgIH0KLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMywgImFuYWx5emVfZXRpcjogPSAlZFxuIiwgcmVzdWx0KTsKLSNlbmRpZgotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogcHJvY2VzcyBFVElSIHJlY29yZAotICAKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX3RpciAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSAgaW50IHJlc3VsdDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgIlRJUi9FVElSXG4iKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAob2JqdHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIEVPQkpfU19DX0VUSVI6Ci0JUFJJVih2bXNfcmVjKSArPSA0OwkvKiBza2lwIHR5cGUsIHNpemUgKi8KLQlQUklWKHJlY19zaXplKSAtPSA0OwotCXJlc3VsdCA9IGFuYWx5emVfZXRpciAoYWJmZCwgUFJJVih2bXNfcmVjKSwgUFJJVihyZWNfc2l6ZSkpOwotCWJyZWFrOwotICAgICAgY2FzZSBPQkpfU19DX1RJUjoKLQlQUklWKHZtc19yZWMpICs9IDE7CS8qIHNraXAgdHlwZSAqLwotCVBSSVYocmVjX3NpemUpIC09IDE7Ci0JcmVzdWx0ID0gYW5hbHl6ZV90aXIgKGFiZmQsIFBSSVYodm1zX3JlYyksIFBSSVYocmVjX3NpemUpKTsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JcmVzdWx0ID0gLTE7Ci0JYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogcHJvY2VzcyBFREJHIHJlY29yZAotICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKLSAgCi0gICBub3QgaW1wbGVtZW50ZWQgeWV0ICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX2RiZyAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJEQkcvRURCR1xuIik7Ci0jZW5kaWYKLQotICBhYmZkLT5mbGFncyB8PSAoSEFTX0RFQlVHIHwgSEFTX0xJTkVOTyk7Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIHByb2Nlc3MgRVRCVCByZWNvcmQKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCi0gIAotICAgbm90IGltcGxlbWVudGVkIHlldCAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF90YnQgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICgyLCAiVEJUL0VUQlRcbiIpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogcHJvY2VzcyBMTksgcmVjb3JkCi0gICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgotICAKLSAgIG5vdCBpbXBsZW1lbnRlZCB5ZXQgICovCi0KLWludAotX2JmZF92bXNfc2x1cnBfbG5rIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgIkxOS1xuIik7Ci0jZW5kaWYKLQotICByZXR1cm4gMDsKLX0KLQwKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgkJCQkJCQkJCSovCi0vKglXUklURSBFVElSIFNFQ1RJT04JCQkJCQkqLwotLyoJCQkJCQkJCQkqLwotLyoJdGhpcyBpcyBzdGlsbCB1bmRlciBjb25zdHJ1Y3Rpb24gYW5kIHRoZXJlZm9yZSBub3QgZG9jdW1lbnRlZAkqLwotLyoJCQkJCQkJCQkqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgc3RhcnRfZXRpcl9yZWNvcmQgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgaW5kZXgsIHVxdWFkIG9mZnNldCwgYm9vbGVhbiBqdXN0b2Zmc2V0KSk7Ci1zdGF0aWMgdm9pZCBzdG9faW1tIFBBUkFNUyAoKGJmZCAqYWJmZCwgdm1zX3NlY3Rpb24gKnNwdHIsIGJmZF92bWEgdmFkZHIsIGludCBpbmRleCkpOwotc3RhdGljIHZvaWQgZW5kX2V0aXJfcmVjb3JkIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHZtc19zZWN0aW9uICpzcHRyOwotICAgICBiZmRfdm1hIHZhZGRyOwotICAgICBpbnQgaW5kZXg7Ci17Ci0gIGludCBzaXplOwotICBpbnQgc3NpemU7Ci0gIHVuc2lnbmVkIGNoYXIgKmNwdHI7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDgsICJzdG9faW1tICVkIGJ5dGVzXG4iLCBzcHRyLT5zaXplKTsKLSAgX2JmZF9oZXhkdW1wICg5LCBzcHRyLT5jb250ZW50cywgKGludClzcHRyLT5zaXplLCAoaW50KXZhZGRyKTsKLSNlbmRpZgotCi0gIHNzaXplID0gc3B0ci0+c2l6ZTsKLSAgY3B0ciA9IHNwdHItPmNvbnRlbnRzOwotCi0gIHdoaWxlIChzc2l6ZSA+IDApCi0gICAgewotCi0gICAgICBzaXplID0gc3NpemU7CQkJCS8qIHRyeSBhbGwgdGhlIHJlc3QgKi8KLQotICAgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgc2l6ZSkgPCAwKQotCXsJCQkJCS8qIGRvZXNuJ3QgZml0LCBzcGxpdCAhICovCi0JICBlbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCSAgc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsIGluZGV4LCB2YWRkciwgZmFsc2UpOwotCSAgc2l6ZSA9IF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgMCk7CS8qIGdldCBtYXggc2l6ZSAqLwotCSAgaWYgKHNpemUgPiBzc2l6ZSkJCQkvKiBtb3JlIHRoYW4gd2hhdCdzIGxlZnQgPyAqLwotCSAgICBzaXplID0gc3NpemU7Ci0JfQotCi0gICAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVUSVJfU19DX1NUT19JTU0sIC0xKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAodW5zaWduZWQgbG9uZykoc2l6ZSkpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsIGNwdHIsIHNpemUpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotI2lmIFZNU19ERUJVRwotICAgICAgX2JmZF92bXNfZGVidWcgKDEwLCAiZHVtcGVkICVkIGJ5dGVzXG4iLCBzaXplKTsKLSAgICAgIF9iZmRfaGV4ZHVtcCAoMTAsIGNwdHIsIChpbnQpc2l6ZSwgKGludCl2YWRkcik7Ci0jZW5kaWYKLQotICAgICAgdmFkZHIgKz0gc2l6ZTsKLSAgICAgIHNzaXplIC09IHNpemU7Ci0gICAgICBjcHRyICs9IHNpemU7Ci0gICAgfQotCi0gIHJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogc3RhcnQgRVRJUiByZWNvcmQgZm9yIHNlY3Rpb24gI2luZGV4IGF0IHZpcnR1YWwgYWRkciBvZmZzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsIGluZGV4LCBvZmZzZXQsIGp1c3RvZmZzZXQpCi0gICAgYmZkICphYmZkOwotICAgIGludCBpbmRleDsKLSAgICB1cXVhZCBvZmZzZXQ7Ci0gICAgYm9vbGVhbiBqdXN0b2Zmc2V0OwotewotICBpZiAoIWp1c3RvZmZzZXQpCi0gICAgewotICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FVElSLCAtMSk7CS8qIG9uZSBFVElSIHBlciBzZWN0aW9uICovCi0gICAgICBfYmZkX3Ztc19vdXRwdXRfcHVzaCAoYWJmZCk7Ci0gICAgfQotCi0gIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRVRJUl9TX0NfU1RBX1BRLCAtMSk7CS8qIHB1c2ggc3RhcnQgb2Zmc2V0ICovCi0gIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAodW5zaWduZWQgbG9uZylpbmRleCk7Ci0gIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLCAodXF1YWQpb2Zmc2V0KTsKLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVUSVJfU19DX0NUTF9TRVRSQiwgLTEpOwkvKiBzdGFydCA9IHBvcCAoKSAqLwotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBlbmQgZXRpciByZWNvcmQgICovCi1zdGF0aWMgdm9pZAotZW5kX2V0aXJfcmVjb3JkIChhYmZkKQotICAgIGJmZCAqYWJmZDsKLXsKLSAgX2JmZF92bXNfb3V0cHV0X3BvcCAoYWJmZCk7Ci0gIF9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpOyAKLX0KLQotLyogd3JpdGUgc2VjdGlvbiBjb250ZW50cyBmb3IgYmZkIGFiZmQgICovCi0KLWludAotX2JmZF92bXNfd3JpdGVfdGlyIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgdm1zX3NlY3Rpb24gKnNwdHI7Ci0gIGludCBuZXh0b2Zmc2V0OwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX3RpciAoJXAsICVkKVxuIiwgYWJmZCwgb2JqdHlwZSk7Ci0jZW5kaWYKLQotICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCA0KTsKLQotICBuZXh0b2Zmc2V0ID0gMDsKLSAgUFJJVih2bXNfbGlua2FnZV9pbmRleCkgPSAxOwotCi0gIC8qIGR1bXAgYWxsIG90aGVyIHNlY3Rpb25zICAqLwotCi0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQotICB3aGlsZSAoc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLQotI2lmIFZNU19ERUJVRwotICAgICAgX2JmZF92bXNfZGVidWcgKDQsICJ3cml0aW5nICVkLiBzZWN0aW9uICclcycgKCVkIGJ5dGVzKVxuIiwgc2VjdGlvbi0+aW5kZXgsIHNlY3Rpb24tPm5hbWUsIChpbnQpKHNlY3Rpb24tPl9yYXdfc2l6ZSkpOw0KLSNlbmRpZgotCi0gICAgICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpCi0JewotCSAgaW50IGk7Ci0KLQkgIGlmICgoaSA9IHNlY3Rpb24tPnJlbG9jX2NvdW50KSA8PSAwKQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTRUNfUkVMT0Mgd2l0aCBubyByZWxvY3MgaW4gc2VjdGlvbiAlcyIpLAotCQkJCSAgICAgc2VjdGlvbi0+bmFtZSk7Ci0JICAgIH0KLSNpZiBWTVNfREVCVUcKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFyZWxlbnQgKipycHRyOwotCSAgICAgIF9iZmRfdm1zX2RlYnVnICg0LCAiJWQgcmVsb2NhdGlvbnM6XG4iLCBpKTsKLQkgICAgICBycHRyID0gc2VjdGlvbi0+b3JlbG9jYXRpb247Ci0JICAgICAgd2hpbGUgKGktLSA+IDApCi0JCXsKLQkJICBfYmZkX3Ztc19kZWJ1ZyAoNCwgInN5bSAlcyBpbiBzZWMgJXMsIHZhbHVlICUwOGx4LCBhZGRyICUwOGx4LCBvZmYgJTA4bHgsIGxlbiAlZDogJXNcbiIsCi0JCQkgICAgICAoKigqcnB0ciktPnN5bV9wdHJfcHRyKS0+bmFtZSwKLQkJCSAgICAgICgqKCpycHRyKS0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uLT5uYW1lLAotCQkJICAgICAgKGxvbmcpKCooKnJwdHIpLT5zeW1fcHRyX3B0ciktPnZhbHVlLAotCQkJICAgICAgKCpycHRyKS0+YWRkcmVzcywgKCpycHRyKS0+YWRkZW5kLAotCQkJICAgICAgYmZkX2dldF9yZWxvY19zaXplKCgqcnB0ciktPmhvd3RvKSwKLQkJCSAgICAgICgqcnB0ciktPmhvd3RvLT5uYW1lKTsKLQkJICBycHRyKys7Ci0JCX0KLQkgICAgfQotI2VuZGlmCi0JfQotCi0gICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykKLQkmJiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKSkKLQl7Ci0JICBiZmRfdm1hIHZhZGRyOwkJLyogdmlydHVhbCBhZGRyIGluIHNlY3Rpb24gKi8KLQotCSAgc3B0ciA9IF9iZmRfZ2V0X3Ztc19zZWN0aW9uIChhYmZkLCBzZWN0aW9uLT5pbmRleCk7Ci0JICBpZiAoc3B0ciA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2NvbnRlbnRzKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQotCSAgdmFkZHIgPSAoYmZkX3ZtYSkoc3B0ci0+b2Zmc2V0KTsKLQotCSAgc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsIHNlY3Rpb24tPmluZGV4LCAodXF1YWQpIHNwdHItPm9mZnNldCwKLQkJCSAgICAgZmFsc2UpOwotCi0JICB3aGlsZSAoc3B0ciAhPSBOVUxMKQkJCQkvKiBvbmUgU1RBX1BRLCBDVExfU0VUUkIgcGVyIHZtc19zZWN0aW9uICovCi0JICAgIHsKLQotCSAgICAgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykJCQkvKiBjaGVjayBmb3IgcmVsb2NzICovCi0JCXsKLQkJICBhcmVsZW50ICoqcnB0ciA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOwotCQkgIGludCBpID0gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0JCSAgZm9yICg7OykKLQkJICAgIHsKLQkJICAgICAgYmZkX3NpemVfdHlwZSBhZGRyID0gKCpycHRyKS0+YWRkcmVzczsKLQkJICAgICAgaW50IGxlbiA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoKCpycHRyKS0+aG93dG8pOwotCQkgICAgICBpZiAoc3B0ci0+b2Zmc2V0IDwgYWRkcikJCS8qIHNwdHIgc3RhcnRzIGJlZm9yZSByZWxvYyAqLwotCQkJewotCQkJICBpbnQgYmVmb3JlID0gYWRkciAtIHNwdHItPm9mZnNldDsKLQkJCSAgaWYgKHNwdHItPnNpemUgPD0gYmVmb3JlKQkJLyogY29tcGxldGUgYmVmb3JlICovCi0JCQkgICAgewotCQkJICAgICAgc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsKLQkJCSAgICAgIHZhZGRyICs9IHNwdHItPnNpemU7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQkgIGVsc2UJCQkJLyogcGFydGx5IGJlZm9yZSAqLwotCQkJICAgIHsKLQkJCSAgICAgIGludCBhZnRlciA9IHNwdHItPnNpemUgLSBiZWZvcmU7Ci0JCQkgICAgICBzcHRyLT5zaXplID0gYmVmb3JlOwotCQkJICAgICAgc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsKLQkJCSAgICAgIHZhZGRyICs9IHNwdHItPnNpemU7Ci0JCQkgICAgICBzcHRyLT5jb250ZW50cyArPSBiZWZvcmU7Ci0JCQkgICAgICBzcHRyLT5vZmZzZXQgKz0gYmVmb3JlOwotCQkJICAgICAgc3B0ci0+c2l6ZSA9IGFmdGVyOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc3B0ci0+b2Zmc2V0ID09IGFkZHIpCS8qIHNwdHIgc3RhcnRzIGF0IHJlbG9jICovCi0JCQl7Ci0JCQkgIGFzeW1ib2wgKnN5bSA9ICooKnJwdHIpLT5zeW1fcHRyX3B0cjsKLQkJCSAgYXNlY3Rpb24gKnNlYyA9IHN5bS0+c2VjdGlvbjsKLQotCQkJICBzd2l0Y2ggKCgqcnB0ciktPmhvd3RvLT50eXBlKQotCQkJICAgIHsKLQkJCSAgICBjYXNlIEFMUEhBX1JfSUdOT1JFOgotCQkJICAgICAgYnJlYWs7Ci0KLQkJCSAgICBjYXNlIEFMUEhBX1JfUkVGTE9ORzoKLQkJCSAgICAgIHsKLQkJCQlpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCQkJCSAgewotCQkJCSAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLAotCQkJCQkJCQlzdHJsZW4oKGNoYXIgKilzeW0tPm5hbWUpKQotCQkJCQk8IDApCi0JCQkJICAgICAgewotCQkJCQllbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCQlzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKLQkJCQkJCQkgICBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCQkgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgICAgIH0KLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVE9fR0JMX0xXLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLAotCQkJCQkJCSAgICAgIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgIH0KLQkJCQllbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JCQkJICB7Ci0JCQkJICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDE2KSA8IDApCi0JCQkJICAgICAgewotCQkJCQllbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCQlzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKLQkJCQkJCQkgICBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCQkgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgICAgIH0KLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVEFfTFcsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsCi0JCQkJCQkJICAgKHVxdWFkKXN5bS0+dmFsdWUpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUT19MVywKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgfQotCQkJCWVsc2UKLQkJCQkgIHsKLQkJCQkgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgMzIpIDwgMCkKLQkJCQkgICAgICB7Ci0JCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICAgICAgfQotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUQV9QUSwKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKLQkJCQkJCQkgICAodW5zaWduZWQgbG9uZykoc2VjLT5pbmRleCkpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwKLQkJCQkJCQkgICAoKHVxdWFkKSgqcnB0ciktPmFkZGVuZAotCQkJCQkJCSAgICArICh1cXVhZClzeW0tPnZhbHVlKSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RPX0xXLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICB9Ci0JCQkgICAgICB9Ci0JCQkgICAgICBicmVhazsKLQotCQkJICAgIGNhc2UgQUxQSEFfUl9SRUZRVUFEOgotCQkJICAgICAgewotCQkJCWlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JCQkJICB7Ci0JCQkJICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsCi0JCQkJCQkJCXN0cmxlbigoY2hhciAqKXN5bS0+bmFtZSkpCi0JCQkJCTwgMCkKLQkJCQkgICAgICB7Ci0JCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICAgICAgfQotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUT19HQkwsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsCi0JCQkJCQkJICAgICAgX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzeW0tPm5hbWUsIEVPQkpfU19DX1NZTVNJWikpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgfQotCQkJCWVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQkJCQkgIHsKLQkJCQkgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgMTYpIDwgMCkKLQkJCQkgICAgICB7Ci0JCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICAgICAgfQotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUQV9RVywKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwKLQkJCQkJCQkgICAodXF1YWQpc3ltLT52YWx1ZSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RPX1FXLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICB9Ci0JCQkJZWxzZQotCQkJCSAgewotCQkJCSAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCAzMikgPCAwKQotCQkJCSAgICAgIHsKLQkJCQkJZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkJc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCi0JCQkJCQkJICAgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkJICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgICAgICB9Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RBX1BRLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLAotCQkJCQkJCSAgICh1bnNpZ25lZCBsb25nKShzZWMtPmluZGV4KSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLAotCQkJCQkJCSAgICgodXF1YWQpKCpycHRyKS0+YWRkZW5kCi0JCQkJCQkJICAgICsgKHVxdWFkKXN5bS0+dmFsdWUpKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVE9fT0ZGLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICB9Ci0JCQkgICAgICB9Ci0JCQkgICAgICBicmVhazsKLQotCQkJICAgIGNhc2UgQUxQSEFfUl9ISU5UOgotCQkJICAgICAgewotCQkJCWludCBoaW50X3NpemU7Ci0KLQkJCQloaW50X3NpemUgPSBzcHRyLT5zaXplOwotCQkJCXNwdHItPnNpemUgPSBsZW47Ci0JCQkJc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsKLQkJCQlzcHRyLT5zaXplID0gaGludF9zaXplOwotI2lmIDAKLQkJCQl2bXNfb3V0cHV0X2JlZ2luKGFiZmQsIEVUSVJfU19DX1NUT19ISU5UX0dCTCwgLTEpOwotCQkJCXZtc19vdXRwdXRfbG9uZyhhYmZkLCAodW5zaWduZWQgbG9uZykoc2VjLT5pbmRleCkpOwotCQkJCXZtc19vdXRwdXRfcXVhZChhYmZkLCAodXF1YWQpYWRkcik7Ci0KLQkJCQl2bXNfb3V0cHV0X2NvdW50ZWQoYWJmZCwgX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzeW0tPm5hbWUsIEVPQkpfU19DX1NZTVNJWikpOwotCQkJCXZtc19vdXRwdXRfZmx1c2goYWJmZCk7Ci0jZW5kaWYKLQkJCSAgICAgIH0KLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgQUxQSEFfUl9MSU5LQUdFOgotCQkJICAgICAgewotCQkJCWlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDY0KSA8IDApCi0JCQkJICB7Ci0JCQkJICAgIGVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJICAgIHN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLCBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCSAgICAgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgfQotCQkJCV9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQlFVElSX1NfQ19TVENfTFBfUFNCLAotCQkJCQkJCS0xKTsKLQkJCQlfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKLQkJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylQUklWKHZtc19saW5rYWdlX2luZGV4KSk7Ci0JCQkJUFJJVih2bXNfbGlua2FnZV9pbmRleCkgKz0gMjsKLQkJCQlfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwKLQkJCQkJCQkgIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKLQkJCQlfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgMCk7Ci0JCQkJX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCSAgICAgIH0KLQkJCSAgICAgIGJyZWFrOwotCi0JCQkgICAgY2FzZSBBTFBIQV9SX0NPREVBRERSOgotCQkJICAgICAgewotCQkJCWlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsCi0JCQkJCQkJICAgIHN0cmxlbigoY2hhciAqKXN5bS0+bmFtZSkpCi0JCQkJICAgIDwgMCkKLQkJCQkgIHsKLQkJCQkgICAgZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkgICAgc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCi0JCQkJCQkgICAgICAgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkgICAgICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgIH0KLQkJCQlfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJRVRJUl9TX0NfU1RPX0NBLAotCQkJCQkJCS0xKTsKLQkJCQlfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwKLQkJCQkJCQkgIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKLQkJCQlfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJICAgICAgfQotCQkJICAgICAgYnJlYWs7Ci0KLQkJCSAgICBkZWZhdWx0OgotCQkJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJVbmhhbmRsZWQgcmVsb2NhdGlvbiAlcyIpLAotCQkJCQkJICAgICAoKnJwdHIpLT5ob3d0by0+bmFtZSk7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0KLQkJCSAgdmFkZHIgKz0gbGVuOwotCi0JCQkgIGlmIChsZW4gPT0gc3B0ci0+c2l6ZSkKLQkJCSAgICB7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBzcHRyLT5jb250ZW50cyArPSBsZW47Ci0JCQkgICAgICBzcHRyLT5vZmZzZXQgKz0gbGVuOwotCQkJICAgICAgc3B0ci0+c2l6ZSAtPSBsZW47Ci0JCQkgICAgICBpLS07Ci0JCQkgICAgICBycHRyKys7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBlbHNlCQkJCQkvKiBzcHRyIHN0YXJ0cyBhZnRlciByZWxvYyAqLwotCQkJewotCQkJICBpLS07CQkJCS8qIGNoZWNrIG5leHQgcmVsb2MgKi8KLQkJCSAgcnB0cisrOwotCQkJfQotCi0JCSAgICAgIGlmIChpPT0wKQkJCQkvKiBhbGwgcmVsb2MgY2hlY2tlZCAqLwotCQkJewotCQkJICBpZiAoc3B0ci0+c2l6ZSA+IDApCi0JCQkgICAgewotCQkJICAgICAgc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsJLyogZHVtcCByZXN0ICovCi0JCQkgICAgICB2YWRkciArPSBzcHRyLT5zaXplOwotCQkJICAgIH0KLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9IC8qIGZvciAoOzspICovCi0JCX0gLyogaWYgU0VDX1JFTE9DICovCi0JICAgICAgZWxzZQkJCQkJCS8qIG5vIHJlbG9jcywganVzdCBkdW1wICovCi0JCXsKLQkJICBzdG9faW1tIChhYmZkLCBzcHRyLCB2YWRkciwgc2VjdGlvbi0+aW5kZXgpOwotCQkgIHZhZGRyICs9IHNwdHItPnNpemU7Ci0JCX0KLQotCSAgICAgIHNwdHIgPSBzcHRyLT5uZXh0OwotCi0JICAgIH0gLyogd2hpbGUgKHNwdHIgIT0gMCkgKi8KLQotCSAgZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQotCX0gLyogaGFzX2NvbnRlbnRzICovCi0KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OwotICAgIH0KLQotICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50KGFiZmQsIDIpOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiB3cml0ZSB0cmFjZWJhY2sgZGF0YSBmb3IgYmZkIGFiZmQgICovCi0KLWludAotX2JmZF92bXNfd3JpdGVfdGJ0IChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgInZtc193cml0ZV90YnQgKCVwLCAlZClcbiIsIGFiZmQsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogd3JpdGUgZGVidWcgaW5mbyBmb3IgYmZkIGFiZmQgICovCi0KLWludAotX2JmZF92bXNfd3JpdGVfZGJnIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgInZtc193cml0ZV9kYmcgKCVwLCBvYmp0eXBlKVxuIiwgYWJmZCwgb2JqdHlwZSk7Ci0jZW5kaWYKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JmZC92bXMuYyBiL2JmZC92bXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVmYzEzYS4uMDAwMDAwMAotLS0gYS9iZmQvdm1zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQ3ICswLDAgQEAKLS8qIHZtcy5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVkFYIChvcGVuVk1TL1ZBWCkgYW5kCi0gICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJ2bXMuaCIKLQotc3RhdGljIGJvb2xlYW4gdm1zX2luaXRpYWxpemUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgcHJpdl9zZWN0aW9uX2NvdW50Owotc3RhdGljIGJvb2xlYW4gZmlsbF9zZWN0aW9uX3B0ciBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfZml4dXBfc2VjdGlvbnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGNvcHlfc3ltYm9scyBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJlbG9jX25pbAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqdm1zX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICp2bXNfYXJjaGl2ZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19jbG9zZV9hbmRfY2xlYW51cCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfZnJlZV9jYWNoZWRfaW5mbyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19uZXdfc2VjdGlvbl9ob29rIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24pKTsKLXN0YXRpYyBib29sZWFuIHZtc19nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBQVFIgeDEsIGZpbGVfcHRyIHgyLAotCSAgIGJmZF9zaXplX3R5cGUgeDMpKTsKLXN0YXRpYyBib29sZWFuIHZtc19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgYmZkX3dpbmRvdyAqdywgZmlsZV9wdHIgb2Zmc2V0LAotCSAgIGJmZF9zaXplX3R5cGUgY291bnQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqc3JjLCBiZmQgKmRlc3QpKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotICBQQVJBTVMgKChiZmQgKnNyY2JmZCwgYXNlY3Rpb24gKnNyY3NlYywgYmZkICpkc3RiZmQsIGFzZWN0aW9uICpkc3RzZWMpKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqaWJmZCwgYXN5bWJvbCAqaXN5bSwgYmZkICpvYmZkLCBhc3ltYm9sICpvc3ltKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICphYmZkLCB2b2lkICpmaWxlKSk7Ci1zdGF0aWMgY2hhciAqdm1zX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgaW50IHZtc19jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkICpiYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfc2x1cnBfYXJtYXAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotICBQQVJBTVMgKChiZmQgKmFiZmQsIGNoYXIgKip0YWJsb2MsIGJmZF9zaXplX3R5cGUgKnRhYmxlbiwKLQkgICBjb25zdCBjaGFyICoqbmFtZSkpOwotc3RhdGljIHZvaWQgdm1zX3RydW5jYXRlX2FybmFtZQotICBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKnBhdGhuYW1lLCBjaGFyICphcmhkcikpOwotc3RhdGljIGJvb2xlYW4gdm1zX3dyaXRlX2FybWFwCi0gIFBBUkFNUyAoKGJmZCAqYXJjaCwgdW5zaWduZWQgaW50IGVsZW5ndGgsIHN0cnVjdCBvcmwgKm1hcCwKLQkgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50LCBpbnQgc3RyaWR4KSk7Ci1zdGF0aWMgUFRSIHZtc19yZWFkX2FyX2hkciBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBiZmQgKnZtc19nZXRfZWx0X2F0X2luZGV4IFBBUkFNUyAoKGJmZCAqYWJmZCwgc3ltaW5kZXggaW5kZXgpKTsKLXN0YXRpYyBiZmQgKnZtc19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgUEFSQU1TICgoYmZkICphcmNoLCBiZmQgKnByZXYpKTsKLXN0YXRpYyBib29sZWFuIHZtc191cGRhdGVfYXJtYXBfdGltZXN0YW1wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGludCB2bXNfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IHN0YXQgKnN0YXQpKTsKLXN0YXRpYyBsb25nIHZtc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGxvbmcgdm1zX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICoqc3ltYm9scykpOwotc3RhdGljIHZvaWQgdm1zX3ByaW50X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKmFiZmQsIFBUUiBmaWxlLCBhc3ltYm9sICpzeW1ib2wsIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3cpKTsKLXN0YXRpYyB2b2lkIHZtc19nZXRfc3ltYm9sX2luZm8KLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICpzeW1ib2wsIHN5bWJvbF9pbmZvICpyZXQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGFsZW50ICp2bXNfZ2V0X2xpbmVubyBQQVJBTVMgKChiZmQgKmFiZmQsIGFzeW1ib2wgKnN5bWJvbCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIGFzeW1ib2wgKipzeW1ib2xzLCBiZmRfdm1hIG9mZnNldCwKLQkgICBjb25zdCBjaGFyICoqZmlsZSwgY29uc3QgY2hhciAqKmZ1bmMsIHVuc2lnbmVkIGludCAqbGluZSkpOwotc3RhdGljIGFzeW1ib2wgKnZtc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICphYmZkLCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkpOwotc3RhdGljIGxvbmcgdm1zX3JlYWRfbWluaXN5bWJvbHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBib29sZWFuIGR5bmFtaWMsIFBUUiAqbWluaXN5bXNwLCB1bnNpZ25lZCBpbnQgKnNpemVwKSk7Ci1zdGF0aWMgYXN5bWJvbCAqdm1zX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYm9vbGVhbiBkeW5hbWljLCBjb25zdCBQVFIgbWluaXN5bSwgYXN5bWJvbCAqc3ltKSk7Ci1zdGF0aWMgbG9uZyB2bXNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3QpKTsKLXN0YXRpYyBsb25nIHZtc19jYW5vbmljYWxpemVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc3Jjc2VjLCBhcmVsZW50ICoqbG9jYXRpb24sCi0JICAgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICp2bXNfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyBib29sZWFuIHZtc19zZXRfYXJjaF9tYWNoCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsIHVuc2lnbmVkIGxvbmcgbWFjaCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIFBUUiBsb2NhdGlvbiwgZmlsZV9wdHIgb2Zmc2V0LAotCSAgIGJmZF9zaXplX3R5cGUgY291bnQpKTsKLXN0YXRpYyBpbnQgdm1zX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqYWJmZCwgYm9vbGVhbiByZWxvYykpOwotc3RhdGljIGJmZF9ieXRlICp2bXNfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8sCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyLCBiZmRfYnl0ZSAqZGF0YSwKLQkgICBib29sZWFuIHJlbG9jYXRlYWJsZSwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfcmVsYXhfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotCSAgIGJvb2xlYW4gKmFnYWluKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2djX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbykpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICp2bXNfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uKSk7Ci1zdGF0aWMgbG9uZyB2bXNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGxvbmcgdm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgbG9uZyB2bXNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgbG9uZyB2bXNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSAgUEFSQU1TICgoYmZkICphYmZkLCBhcmVsZW50ICoqYXJlbCwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKmliZmQsIGJmZCAqb2JmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBQQVJBTVMgKChiZmQgKmFiZmQsIGZsYWd3b3JkIGZsYWdzKSk7Ci0KLSNkZWZpbmUgdm1zX21ha2VfZW1wdHlfc3ltYm9sIF9iZmRfdm1zX21ha2VfZW1wdHlfc3ltYm9sCi0MCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLWNvbnN0IGJmZF90YXJnZXQgdm1zX2FscGhhX3ZlYyA9Ci17Ci0KLSAgInZtcy1hbHBoYSIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91ciwKLSAgZmFsc2UsCQkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBmYWxzZSwJCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgSEFTX1NZTVMKLSAgIHwgV1BfVEVYVCB8IERfUEFHRUQpLAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0gICB8IFNFQ19SRUFET05MWSB8IFNFQ19DT0RFIHwgU0VDX0RBVEEKLSAgIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkpLAkJLyogc2VjdCBmbGFncyAqLwotICAwLAkJCQkvKiBzeW1ib2xfbGVhZGluZ19jaGFyICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCB2bXNfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICB2bXNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIHZtc19ta29iamVjdCwJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgdm1zX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAodm1zKSwKLQotICAoUFRSKSAwCi19OwotCi1jb25zdCBiZmRfdGFyZ2V0IHZtc192YXhfdmVjID0KLXsKLQotICAidm1zLXZheCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X292YXhfZmxhdm91ciwKLSAgZmFsc2UsCQkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBmYWxzZSwJCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgSEFTX1NZTVMgCS8qIG9iamVjdCBmbGFncyAqLwotICAgfCBXUF9URVhUIHwgRF9QQUdFRAotICAgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX0xPQ0FMUyksCi0KLSAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0gICB8IFNFQ19SRUFET05MWSB8IFNFQ19DT0RFIHwgU0VDX0RBVEEKLSAgIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkpLAkJLyogc2VjdCBmbGFncyAqLwotICAwLAkJCQkvKiBzeW1ib2xfbGVhZGluZ19jaGFyICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgdm1zX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgdm1zX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCB2bXNfbWtvYmplY3QsCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIHZtc193cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKHZtcyksCi0KLSAgKFBUUikgMAotfTsKLQwKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLyogSW5pdGlhbGl6ZSBwcml2YXRlIGRhdGEgICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfaW5pdGlhbGl6ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgaTsKLQotICBpZiAoYWJmZC0+dGRhdGEuYW55ICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgYmZkX3NldF9zdGFydF9hZGRyZXNzIChhYmZkLCAoYmZkX3ZtYSktMSk7Ci0KLSAgYWJmZC0+dGRhdGEuYW55ID0gKChzdHJ1Y3Qgdm1zX3ByaXZhdGVfZGF0YV9zdHJ1Y3QqKQotCQkgICAgIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IHZtc19wcml2YXRlX2RhdGFfc3RydWN0KSkpOwotICBpZiAoYWJmZC0+dGRhdGEuYW55ID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0jaWZkZWYgX19BTFBIQQotICBQUklWKGlzX3ZheCkgPSAwOwotI2Vsc2UKLSAgUFJJVihpc192YXgpID0gMTsKLSNlbmRpZgotICBQUklWKHZtc19idWYpID0gMDsKLSAgUFJJVihidWZfc2l6ZSkgPSAwOwotICBQUklWKHJlY19sZW5ndGgpID0gMDsKLSAgUFJJVihmaWxlX2Zvcm1hdCkgPSBGRl9VTktOT1dOOwotICBQUklWKGZpeHVwX2RvbmUpID0gZmFsc2U7Ci0gIFBSSVYoc2VjdGlvbnMpID0gTlVMTDsKLQotICBQUklWKHN0YWNrKSA9ICgoc3RydWN0IHN0YWNrX3N0cnVjdCAqKQotCQkgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3RhY2tfc3RydWN0KSAqIFNUQUNLU0laRSkpOwotICBpZiAoUFJJVihzdGFjaykgPT0gMCkKLSAgICB7Ci0gICAgIHZtc19pbml0X25vX21lbTE6Ci0gICAgICBmcmVlIChhYmZkLT50ZGF0YS5hbnkpOwotICAgICAgYWJmZC0+dGRhdGEuYW55ID0gMDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIFBSSVYoc3RhY2twdHIpID0gMDsKLQotICBQUklWKHZtc19zeW1ib2xfdGFibGUpID0gKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikKLQkJCSAgICAgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChQUklWKHZtc19zeW1ib2xfdGFibGUpID09IDApCi0gICAgewotICAgICB2bXNfaW5pdF9ub19tZW0yOgotICAgICAgZnJlZSAoUFJJVihzdGFjaykpOwotICAgICAgUFJJVihzdGFjaykgPSAwOwotICAgICAgZ290byB2bXNfaW5pdF9ub19tZW0xOwotICAgIH0KLQotICBpZiAoIWJmZF9oYXNoX3RhYmxlX2luaXQgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIF9iZmRfdm1zX2hhc2hfbmV3ZnVuYykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIFBSSVYobG9jYXRpb25fc3RhY2spID0gKChzdHJ1Y3QgbG9jYXRpb25fc3RydWN0ICopCi0JCQkgIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGxvY2F0aW9uX3N0cnVjdCkKLQkJCQkgICAgICAqIExPQ0FUSU9OX1NBVkVfU0laRSkpOwotICBpZiAoUFJJVihsb2NhdGlvbl9zdGFjaykgPT0gMCkKLSAgICB7Ci0gICAgIHZtc19pbml0X25vX21lbTM6Ci0gICAgICBmcmVlIChQUklWKHZtc19zeW1ib2xfdGFibGUpKTsKLSAgICAgIFBSSVYodm1zX3N5bWJvbF90YWJsZSkgPSAwOwotICAgICAgZ290byB2bXNfaW5pdF9ub19tZW0yOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgVk1TX1NFQ1RJT05fQ09VTlQ7IGkrKykKLSAgICBQUklWKHZtc19zZWN0aW9uX3RhYmxlKVtpXSA9IE5VTEw7Ci0KLSAgUFJJVihvdXRwdXRfYnVmKSA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyAoTUFYX09VVFJFQ19TSVpFKTsKLSAgaWYgKFBSSVYob3V0cHV0X2J1ZikgPT0gMCkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKGxvY2F0aW9uX3N0YWNrKSk7Ci0gICAgICBQUklWKGxvY2F0aW9uX3N0YWNrKSA9IDA7Ci0gICAgICBnb3RvIHZtc19pbml0X25vX21lbTM7Ci0gICAgfQotICBQUklWKHB1c2hfbGV2ZWwpID0gMDsKLSAgUFJJVihwdXNoZWRfc2l6ZSkgPSAwOwotICBQUklWKGxlbmd0aF9wb3MpID0gMjsKLSAgUFJJVihvdXRwdXRfc2l6ZSkgPSAwOwotICBQUklWKG91dHB1dF9hbGlnbm1lbnQpID0gMTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBGaWxsIHN5bWJvbC0+c2VjdGlvbiB3aXRoIHNlY3Rpb24gcHRyCi0gICBzeW1ib2wtPnNlY3Rpb24gaXMgZmlsbGVkIHdpdGggdGhlIHNlY3Rpb24gaW5kZXggZm9yIGRlZmluZWQgc3ltYm9scwotICAgZHVyaW5nIHJlYWRpbmcgdGhlIEdTRC9FR1NEIHNlY3Rpb24uIEJ1dCB3ZSBuZWVkIHRoZSBwb2ludGVyIHRvIHRoZQotICAgYmZkIHNlY3Rpb24gbGF0ZXIuCi0KLSAgIEl0IGhhcyB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgcmVmZXJlbmNlZCAodW5kZWZpbmVkIHNlY3Rpb24pIHN5bWJvbHMKLQotICAgY2FsbGVkIGZyb20gYmZkX2hhc2hfdHJhdmVyc2UgaW4gdm1zX2ZpeHVwX3NlY3Rpb25zICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZmlsbF9zZWN0aW9uX3B0ciAoZW50cnksIHNlY3Rpb25zKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBQVFIgc2VjdGlvbnM7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGFzeW1ib2wgKnN5bTsKLQotICBzeW0gPSAgKCh2bXNfc3ltYm9sX2VudHJ5ICopZW50cnkpLT5zeW1ib2w7Ci0gIHNlYyA9IHN5bS0+c2VjdGlvbjsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJmaWxsX3NlY3Rpb25fcHRyOiBzeW0gJXAsIHNlYyAlcFxuIiwgc3ltLCBzZWMpOwotI2VuZGlmCi0KLSAgLyogZmlsbCBmb3J3YXJkIHJlZmVyZW5jZXMgKHRoZXNlIGNvbnRhaW4gc2VjdGlvbiBudW1iZXIsIG5vdCBzZWN0aW9uIHB0cikuICAqLwotCi0gIGlmICgoaW50KXNlYyA8IHByaXZfc2VjdGlvbl9jb3VudCkKLSAgICB7Ci0gICAgICBzZWMgPSAoKHZtc19zeW1ib2xfZW50cnkgKillbnRyeSktPnN5bWJvbC0+c2VjdGlvbiA9Ci0JKChhc2VjdGlvbiAqKilzZWN0aW9ucylbKGludClzZWNdOwotICAgIH0KLQotICBpZiAoc3RyY21wIChzeW0tPm5hbWUsIHNlYy0+bmFtZSkgPT0gMCkKLSAgICBzeW0tPmZsYWdzIHw9IEJTRl9TRUNUSU9OX1NZTTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBGaXh1cCBzZWN0aW9ucwotICAgc2V0IHVwIGFsbCBwb2ludGVycyBhbmQgYXJyYXlzLCBjb3VudGVycyBhbmQgc2l6ZXMgYXJlIGZpeGVkIG5vdwotCi0gICB3ZSBidWlsZCBhIHByaXZhdGUgc2VjdGlvbnMgdmVjdG9yIGZvciBlYXN5IGFjY2VzcyBzaW5jZSBzZWN0aW9ucwotICAgYXJlIGFsd2F5cyByZWZlcmVuY2VkIGJ5IGFuIGluZGV4IG51bWJlci4KLQotICAgYWxsb2MgUFJJVihzZWN0aW9ucykgYWNjb3JkaW5nIHRvIGFiZmQtPnNlY3Rpb25fY291bnQKLQljb3B5IGFiZmQtPnNlY3Rpb25zIHRvIFBSSVYoc2VjdGlvbnMpICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2ZpeHVwX3NlY3Rpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotCi0gIGlmIChQUklWKGZpeHVwX2RvbmUpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qCi0gICAqIHRyYXZlcnNlIHN5bWJvbCB0YWJsZSBhbmQgZmlsbCBpbiBhbGwgc2VjdGlvbiBwb2ludGVycwotICAgKi8KLQotICAvKiBjYW4ndCBwcm92aWRlIHNlY3Rpb24gY291bnQgYXMgYXJndW1lbnQgdG8gZmlsbF9zZWN0aW9uX3B0cigpLiAgKi8KLSAgcHJpdl9zZWN0aW9uX2NvdW50ID0gUFJJVihzZWN0aW9uX2NvdW50KTsKLSAgYmZkX2hhc2hfdHJhdmVyc2UgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIGZpbGxfc2VjdGlvbl9wdHIsCi0JCSAgICAoUFRSKShQUklWKHNlY3Rpb25zKSkpOwotCi0gIFBSSVYoZml4dXBfZG9uZSkgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qIENoZWNrIHRoZSBmb3JtYXQgZm9yIGEgZmlsZSBiZWluZyByZWFkLgotICAgUmV0dXJuIGEgKGJmZF90YXJnZXQgKikgaWYgaXQncyBhbiBvYmplY3QgZmlsZSBvciB6ZXJvIGlmIG5vdC4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqCi12bXNfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGVyciA9IDA7Ci0gIGludCBwcmV2X3R5cGU7Ci0gIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICp0YXJnZXRfdmVjdG9yID0gMDsKLSAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmNoID0gMDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfb2JqZWN0X3AoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotCi0gIGlmICghdm1zX2luaXRpYWxpemUgKGFiZmQpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgInZtc19pbml0aWFsaXplICgpIGZhaWxlZCAhIVxuIik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwTCwgU0VFS19TRVQpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcHJldl90eXBlID0gLTE7Ci0KLSAgZG8KLSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICB2bXNfZGVidWcgKDcsICJyZWFkaW5nIGF0ICUwOGx4XG4iLCBiZmRfdGVsbChhYmZkKSk7Ci0jZW5kaWYKLSAgICAgIGlmIChfYmZkX3Ztc19uZXh0X3JlY29yZCAoYWJmZCkgPCAwKQotCXsKLSNpZiBWTVNfREVCVUcKLQkgIHZtc19kZWJ1ZyAoMiwgIm5leHRfcmVjb3JkIGZhaWxlZFxuIik7ICAgICAgCi0jZW5kaWYKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBpZiAoKHByZXZfdHlwZSA9PSBFT0JKX1NfQ19FR1NEKQotCSAgICYmIChQUklWKHJlY190eXBlKSAhPSBFT0JKX1NfQ19FR1NEKSkKLQl7Ci0JICBpZiAodm1zX2ZpeHVwX3NlY3Rpb25zIChhYmZkKSA9PSBmYWxzZSkKLQkgICAgewotI2lmIFZNU19ERUJVRwotCSAgICAgIHZtc19kZWJ1ZyAoMiwgInZtc19maXh1cF9zZWN0aW9ucyBmYWlsZWRcbiIpOwotI2VuZGlmCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHByZXZfdHlwZSA9IFBSSVYocmVjX3R5cGUpOwotCi0gICAgICBpZiAodGFyZ2V0X3ZlY3RvciA9PSAwKQotCXsKLQkgIGlmIChwcmV2X3R5cGUgPD0gT0JKX1NfQ19NQVhSRUNUWVApCi0JICAgIHRhcmdldF92ZWN0b3IgPSAmdm1zX3ZheF92ZWM7Ci0JICBlbHNlCi0JICAgIHRhcmdldF92ZWN0b3IgPSAmdm1zX2FscGhhX3ZlYzsKLQl9Ci0KLSAgICAgIHN3aXRjaCAocHJldl90eXBlKQotCXsKLQkgIGNhc2UgT0JKX1NfQ19IRFI6Ci0JICBjYXNlIEVPQkpfU19DX0VNSDoKLQkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfaGRyIChhYmZkLCBwcmV2X3R5cGUpOwotCSAgICBicmVhazsKLQkgIGNhc2UgT0JKX1NfQ19FT006Ci0JICBjYXNlIE9CSl9TX0NfRU9NVzoKLQkgIGNhc2UgRU9CSl9TX0NfRUVPTToKLQkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfZW9tIChhYmZkLCBwcmV2X3R5cGUpOwotCSAgICBicmVhazsKLQkgIGNhc2UgT0JKX1NfQ19HU0Q6Ci0JICBjYXNlIEVPQkpfU19DX0VHU0Q6Ci0JICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX2dzZCAoYWJmZCwgcHJldl90eXBlKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE9CSl9TX0NfVElSOgotCSAgY2FzZSBFT0JKX1NfQ19FVElSOgotCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF90aXIgKGFiZmQsIHByZXZfdHlwZSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBPQkpfU19DX0RCRzoKLQkgIGNhc2UgRU9CSl9TX0NfRURCRzoKLQkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfZGJnIChhYmZkLCBwcmV2X3R5cGUpOwotCSAgICBicmVhazsKLQkgIGNhc2UgT0JKX1NfQ19UQlQ6Ci0JICBjYXNlIEVPQkpfU19DX0VUQlQ6Ci0JICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX3RidCAoYWJmZCwgcHJldl90eXBlKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE9CSl9TX0NfTE5LOgotCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF9sbmsgKGFiZmQsIHByZXZfdHlwZSk7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgZXJyID0gLTE7Ci0JfQotICAgICAgaWYgKGVyciAhPSAwKQotCXsKLSNpZiBWTVNfREVCVUcKLQkgIHZtc19kZWJ1ZyAoMiwgInNsdXJwIHR5cGUgJWQgZmFpbGVkIHdpdGggJWRcbiIsIHByZXZfdHlwZSwgZXJyKTsKLSNlbmRpZgotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotICB3aGlsZSAoKHByZXZfdHlwZSAhPSBFT0JKX1NfQ19FRU9NKSAmJiAocHJldl90eXBlICE9IE9CSl9TX0NfRU9NKSAmJiAocHJldl90eXBlICE9IE9CSl9TX0NfRU9NVykpOwotCi0gIGlmICh0YXJnZXRfdmVjdG9yID09ICZ2bXNfdmF4X3ZlYykKLSAgICB7Ci0gICAgICBpZiAodm1zX2ZpeHVwX3NlY3Rpb25zIChhYmZkKSA9PSBmYWxzZSkKLQl7Ci0jaWYgVk1TX0RFQlVHCi0JICB2bXNfZGVidWcgKDIsICJ2bXNfZml4dXBfc2VjdGlvbnMgZmFpbGVkXG4iKTsKLSNlbmRpZgotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIHNldCBhcmNoX2luZm8gdG8gdmF4ICAqLwotIAotICAgICAgYXJjaCA9IGJmZF9zY2FuX2FyY2ggKCJ2YXgiKTsKLSAgICAgIFBSSVYgKGlzX3ZheCkgPSAxOwotI2lmIFZNU19ERUJVRwotICAgICAgdm1zX2RlYnVnICgyLCAiYXJjaCBpcyB2YXhcbiIpOwotI2VuZGlmCi0gICAgfQotICBlbHNlIGlmICh0YXJnZXRfdmVjdG9yID09ICZ2bXNfYWxwaGFfdmVjKQotICAgIHsKLSAgICAgIC8qIHNldCBhcmNoX2luZm8gdG8gYWxwaGEgICovCi0gCi0gICAgICBhcmNoID0gYmZkX3NjYW5fYXJjaCAoImFscGhhIik7Ci0gICAgICBQUklWIChpc192YXgpID0gMDsKLSNpZiBWTVNfREVCVUcKLSAgICAgIHZtc19kZWJ1ZyAoMiwgImFyY2ggaXMgYWxwaGFcbiIpOwotI2VuZGlmCi0gICAgfQotCi0gIGlmIChhcmNoID09IDApCi0gICAgewotI2lmIFZNU19ERUJVRwotICAgICAgdm1zX2RlYnVnICgyLCAiYXJjaCBub3QgZm91bmRcbiIpOwotI2VuZGlmCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgYWJmZC0+YXJjaF9pbmZvID0gYXJjaDsKLQotICByZXR1cm4gdGFyZ2V0X3ZlY3RvcjsKLX0KLQotCi0vKiBDaGVjayB0aGUgZm9ybWF0IGZvciBhIGZpbGUgYmVpbmcgcmVhZC4KLSAgIFJldHVybiBhIChiZmRfdGFyZ2V0ICopIGlmIGl0J3MgYW4gYXJjaGl2ZSBmaWxlIG9yIHplcm8uICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKgotdm1zX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYXJjaGl2ZV9wKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBTZXQgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgd3JpdHRlbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX21rb2JqZWN0KCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLQotICBpZiAoIXZtc19pbml0aWFsaXplIChhYmZkKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJ2bXNfaW5pdGlhbGl6ZSAoKSBmYWlsZWQgISFcbiIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHsKLSNpZmRlZiBfX1ZBWAotICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaCA9IGJmZF9zY2FuX2FyY2ggKCJ2YXgiKTsKLSNlbHNlCi0gICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmNoID0gYmZkX3NjYW5fYXJjaCAoImFscGhhIik7Ci0jZW5kaWYKLSAgICBpZiAoYXJjaCA9PSAwKQotICAgICAgewotCWJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgYWJmZC0+YXJjaF9pbmZvID0gYXJjaDsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFdyaXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBpbnRvIGEgZmlsZSBiZWluZyB3cml0dGVuLCBhdCBiZmRfY2xvc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLQotICBpZiAoYWJmZC0+c2VjdGlvbl9jb3VudCA+IDApCQkJLyogd2UgaGF2ZSBzZWN0aW9ucyAqLwotICAgIHsKLSAgICAgIGlmIChQUklWKGlzX3ZheCkpCi0JewotCSAgaWYgKF9iZmRfdm1zX3dyaXRlX2hkciAoYWJmZCwgT0JKX1NfQ19IRFIpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9nc2QgKGFiZmQsIE9CSl9TX0NfR1NEKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfdGlyIChhYmZkLCBPQkpfU19DX1RJUikgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKF9iZmRfdm1zX3dyaXRlX3RidCAoYWJmZCwgT0JKX1NfQ19UQlQpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9kYmcgKGFiZmQsIE9CSl9TX0NfREJHKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoYWJmZC0+c2VjdGlvbl9jb3VudCA+IDI1NSkKLQkgICAgewotCSAgICAgIGlmIChfYmZkX3Ztc193cml0ZV9lb20gKGFiZmQsIE9CSl9TX0NfRU9NVykgIT0gMCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoX2JmZF92bXNfd3JpdGVfZW9tIChhYmZkLCBPQkpfU19DX0VPTSkgIT0gMCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9oZHIgKGFiZmQsIEVPQkpfU19DX0VNSCkgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKF9iZmRfdm1zX3dyaXRlX2dzZCAoYWJmZCwgRU9CSl9TX0NfRUdTRCkgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKF9iZmRfdm1zX3dyaXRlX3RpciAoYWJmZCwgRU9CSl9TX0NfRVRJUikgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKF9iZmRfdm1zX3dyaXRlX3RidCAoYWJmZCwgRU9CSl9TX0NfRVRCVCkgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKF9iZmRfdm1zX3dyaXRlX2RiZyAoYWJmZCwgRU9CSl9TX0NfRURCRykgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKF9iZmRfdm1zX3dyaXRlX2VvbSAoYWJmZCwgRU9CSl9TX0NfRUVPTSkgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKi0tIDQuMSwgZ2VuZXJpYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIENhbGxlZCB3aGVuIHRoZSBCRkQgaXMgYmVpbmcgY2xvc2VkIHRvIGRvIGFueSBuZWNlc3NhcnkgY2xlYW51cC4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfY2xvc2VfYW5kX2NsZWFudXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgdm1zX3NlY3Rpb24gKmVzLCAqZXMxOwotICB2bXNfcmVsb2MgKmVyLCAqZXIxOwotICBpbnQgaTsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY2xvc2VfYW5kX2NsZWFudXAoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICBpZiAoYWJmZCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChQUklWKHZtc19idWYpICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoUFJJVih2bXNfYnVmKSk7Ci0gICAgICBQUklWKHZtc19idWYpID0gTlVMTDsKLSAgICB9Ci0gIFBSSVYoYnVmX3NpemUpID0gMDsKLQotICBpZiAoUFJJVihvdXRwdXRfYnVmKSAhPSAwKQotICAgIHsKLSAgICAgIGZyZWUgKFBSSVYob3V0cHV0X2J1ZikpOwotICAgICAgUFJJVihvdXRwdXRfYnVmKSA9IDA7Ci0gICAgfQotCi0gIHNlYyA9IGFiZmQtPnNlY3Rpb25zOwotICB3aGlsZSAoc2VjICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHNlYy0+Y29udGVudHMpCi0JZnJlZSAoc2VjLT5jb250ZW50cyk7Ci0gICAgICBzZWMgPSBzZWMtPm5leHQ7Ci0gICAgfQotCi0gIGlmIChQUklWKHNlY3Rpb25zKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKFBSSVYoc2VjdGlvbnMpKTsKLSAgICAgIFBSSVYoc2VjdGlvbnMpID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKFBSSVYodm1zX3N5bWJvbF90YWJsZSkpCi0gICAgewotICAgICAgYmZkX2hhc2hfdGFibGVfZnJlZSAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSk7Ci0gICAgICBQUklWKHZtc19zeW1ib2xfdGFibGUpID0gMDsKLSAgICB9Ci0KLSAgaWYgKFBSSVYoc3RhY2spKQotICAgIHsKLSAgICAgIGZyZWUgKFBSSVYoc3RhY2spKTsKLSAgICAgIFBSSVYoc3RhY2spID0gMDsKLSAgICB9Ci0KLSAgaWYgKFBSSVYobG9jYXRpb25fc3RhY2spKQotICAgIHsKLSAgICAgIGZyZWUgKFBSSVYobG9jYXRpb25fc3RhY2spKTsKLSAgICAgIFBSSVYobG9jYXRpb25fc3RhY2spID0gMDsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IFZNU19TRUNUSU9OX0NPVU5UOyBpKyspCi0gICAgewotICAgICAgZXMgPSBQUklWKHZtc19zZWN0aW9uX3RhYmxlKVtpXTsKLSAgICAgIHdoaWxlIChlcyAhPSBOVUxMKQotCXsKLQkgIGVzMSA9IGVzLT5uZXh0OwotCSAgZnJlZSAoZXMpOwotCSAgZXMgPSBlczE7Ci0JfQotICAgICAgUFJJVih2bXNfc2VjdGlvbl90YWJsZSlbaV0gPSBOVUxMOwotICAgfQotCi0gIGZyZWUgKGFiZmQtPnRkYXRhLmFueSk7Ci0gIGFiZmQtPnRkYXRhLmFueSA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQXNrIHRoZSBCRkQgdG8gZnJlZSBhbGwgY2FjaGVkIGluZm9ybWF0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2ZyZWVfY2FjaGVkX2luZm8gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9mcmVlX2NhY2hlZF9pbmZvKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQ2FsbGVkIHdoZW4gYSBuZXcgc2VjdGlvbiBpcyBjcmVhdGVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfbmV3X3NlY3Rpb25faG9vayAoJXAsIFslZF0lcyksIGNvdW50ICVkXG4iLCBhYmZkLCBzZWN0aW9uLT5pbmRleCwgc2VjdGlvbi0+bmFtZSwgYWJmZC0+c2VjdGlvbl9jb3VudCk7Ci0jZW5kaWYKLSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudChhYmZkLCBzZWN0aW9uLCA0KTsKLQotICBpZiAoYWJmZC0+c2VjdGlvbl9jb3VudCA+IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0gICAgewotICAgICAgUFJJVihzZWN0aW9ucykgPSAoKGFzZWN0aW9uICoqKQotCQkJICAgIGJmZF9yZWFsbG9jIChQUklWKHNlY3Rpb25zKSwgYWJmZC0+c2VjdGlvbl9jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLSAgICAgIGlmIChQUklWKHNlY3Rpb25zKSA9PSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIFBSSVYoc2VjdGlvbl9jb3VudCkgPSBhYmZkLT5zZWN0aW9uX2NvdW50OwotICAgIH0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAic2VjdGlvbl9jb3VudDogJWRcbiIsIFBSSVYoc2VjdGlvbl9jb3VudCkpOwotI2VuZGlmCi0gIFBSSVYoc2VjdGlvbnMpW3NlY3Rpb24tPmluZGV4XSA9IHNlY3Rpb247Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNywgIiVkOiAlc1xuIiwgc2VjdGlvbi0+aW5kZXgsIHNlY3Rpb24tPm5hbWUpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogUmVhZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLgotICAgYnVmIHBvaW50cyB0byBhIGJ1ZmZlciBvZiBidWZfc2l6ZSBieXRlcyB0byBiZSBmaWxsZWQgd2l0aAotICAgc2VjdGlvbiBkYXRhIChzdGFydGluZyBhdCBvZmZzZXQgaW50byBzZWN0aW9uKSAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgYnVmLCBvZmZzZXQsIGJ1Zl9zaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgYnVmOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgYnVmX3NpemU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfc2VjdGlvbl9jb250ZW50cyglcCwgJXMsICVwLCBvZmYgJWxkLCBzaXplICVkKVxuIiwKLQkJIGFiZmQsIHNlY3Rpb24tPm5hbWUsIGJ1Ziwgb2Zmc2V0LCAoaW50KWJ1Zl9zaXplKTsKLSNlbmRpZgotCi0gIC8qIHNob3VsZG4ndCBiZSBjYWxsZWQsIHNpbmNlIGFsbCBzZWN0aW9ucyBhcmUgSU5fTUVNT1JZICAqLwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVhZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLgotICAgYnVmIHBvaW50cyB0byBhIGJ1ZmZlciBvZiBidWZfc2l6ZSBieXRlcyB0byBiZSBmaWxsZWQgd2l0aAotICAgc2VjdGlvbiBkYXRhIChzdGFydGluZyBhdCBvZmZzZXQgaW50byBzZWN0aW9uKSAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgKGFiZmQsIHNlY3Rpb24sIHcsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF93aW5kb3cgKnc7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyglcCwgJXMsICVwLCBvZmYgJWxkLCBjb3VudCAlZClcbiIsCi0JCSBhYmZkLCBzZWN0aW9uLT5uYW1lLCB3LCBvZmZzZXQsIChpbnQpY291bnQpOwotI2VuZGlmCi0KLSAgLyogc2hvdWxkbid0IGJlIGNhbGxlZCwgc2luY2UgYWxsIHNlY3Rpb25zIGFyZSBJTl9NRU1PUlkgICovCi0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKi0tIFBhcnQgNC4yLCBjb3B5IHByaXZhdGUgZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIENhbGxlZCB0byBjb3B5IEJGRCBnZW5lcmFsIHByaXZhdGUgZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQotICAgdG8gYW5vdGhlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoc3JjLCBkZXN0KQotICAgICBiZmQgKnNyYzsKLSAgICAgYmZkICpkZXN0OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSglcCwgJXApXG4iLCBzcmMsIGRlc3QpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIE1lcmdlIHByaXZhdGUgQkZEIGluZm9ybWF0aW9uIGZyb20gdGhlIEJGRCBAdmFye2liZmR9IHRvIHRoZQotICAgdGhlIG91dHB1dCBmaWxlIEJGRCBAdmFye29iZmR9IHdoZW4gbGlua2luZy4gIFJldHVybiA8PHRydWU+PgotICAgb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLiAgUG9zc2libGUgZXJyb3IgcmV0dXJucyBhcmU6Ci0KLSAgIG8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotICAgICBOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvYmZkfS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsInZtc19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSglcCwgJXApXG4iLCBpYmZkLCBvYmZkKTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBTZXQgcHJpdmF0ZSBCRkQgZmxhZyBpbmZvcm1hdGlvbiBpbiB0aGUgQkZEIEB2YXJ7YWJmZH0uCi0gICBSZXR1cm4gPDx0cnVlPj4gb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLiAgUG9zc2libGUgZXJyb3IKLSAgIHJldHVybnMgYXJlOgotCi0gICBvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KLSAgICAgTm90IGVub3VnaCBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEgZm9yIEB2YXJ7b2JmZH0uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwidm1zX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyglcCwgJWx4KVxuIiwgYWJmZCwgKGxvbmcpZmxhZ3MpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIENhbGxlZCB0byBjb3B5IEJGRCBwcml2YXRlIHNlY3Rpb24gZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQotICAgdG8gYW5vdGhlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKHNyY2JmZCwgc3Jjc2VjLCBkc3RiZmQsIGRzdHNlYykKLSAgICAgYmZkICpzcmNiZmQ7Ci0gICAgIGFzZWN0aW9uICpzcmNzZWM7Ci0gICAgIGJmZCAqZHN0YmZkOwotICAgICBhc2VjdGlvbiAqZHN0c2VjOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEoJXAsICVzLCAlcCwgJXMpXG4iLAotCQkgc3JjYmZkLCBzcmNzZWMtPm5hbWUsIGRzdGJmZCwgZHN0c2VjLT5uYW1lKTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc3ltYm9sIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLSAgIHRvIGFub3RoZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbiAKLXZtc19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIChpYmZkLCBpc3ltLCBvYmZkLCBvc3ltKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzeW1ib2wgKmlzeW07Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXN5bWJvbCAqb3N5bTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEoJXAsICVzLCAlcCwgJXMpXG4iLAotCQkgaWJmZCwgaXN5bS0+bmFtZSwgb2JmZCwgb3N5bS0+bmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qLS0gUGFydCA0LjMsIGNvcmUgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogUmV0dXJuIGEgcmVhZC1vbmx5IHN0cmluZyBleHBsYWluaW5nIHdoaWNoIHByb2dyYW0gd2FzIHJ1bm5pbmcKLSAgIHdoZW4gaXQgZmFpbGVkIGFuZCBwcm9kdWNlZCB0aGUgY29yZSBmaWxlIGFiZmQuICAqLwotCi1zdGF0aWMgY2hhciAqCi12bXNfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi0KLS8qIFJldHVybnMgdGhlIHNpZ25hbCBudW1iZXIgd2hpY2ggY2F1c2VkIHRoZSBjb3JlIGR1bXAgd2hpY2gKLSAgIGdlbmVyYXRlZCB0aGUgZmlsZSB0aGUgQkZEIGFiZmQgaXMgYXR0YWNoZWQgdG8uICAqLwotCi1zdGF0aWMgaW50Ci12bXNfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29yZSBmaWxlIGF0dGFjaGVkIHRvIGNvcmVfYmZkIHdhcyBnZW5lcmF0ZWQKLSAgIGJ5IGEgcnVuIG9mIHRoZSBleGVjdXRhYmxlIGZpbGUgYXR0YWNoZWQgdG8gZXhlY19iZmQsIGZhbHNlIG90aGVyd2lzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChhYmZkLCBiYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZCAqYmJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCglcCwgJXApXG4iLCBhYmZkLCBiYmZkKTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qLS0gUGFydCA0LjQsIGFyY2hpdmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogPz8/CWRvIHNvbWV0aGluZyB3aXRoIGFuIGFyY2hpdmUgbWFwLgotICAgUmV0dXJuIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfc2x1cnBfYXJtYXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3NsdXJwX2FybWFwKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qID8/PwlkbyBzb21ldGhpbmcgd2l0aCBhbiBleHRlbmRlZCBuYW1lIHRhYmxlLgotICAgUmV0dXJuIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiA/Pz8JZG8gc29tZXRoaW5nIHdpdGggYW4gZXh0ZW5kZWQgbmFtZSB0YWJsZS4KLSAgIFJldHVybiBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0YWJsb2MsIHRhYmxlbiwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICoqdGFibG9jOwotICAgICBiZmRfc2l6ZV90eXBlICp0YWJsZW47Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogVHJ1bmNhdGUgdGhlIG5hbWUgb2YgYW4gYXJjaGl2ZSB0byBtYXRjaCBzeXN0ZW0tZGVwZW5kZW50IHJlc3RyaWN0aW9ucyAgKi8KLQotc3RhdGljIHZvaWQKLXZtc190cnVuY2F0ZV9hcm5hbWUgKGFiZmQsIHBhdGhuYW1lLCBhcmhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpwYXRobmFtZTsKLSAgICAgY2hhciAqYXJoZHI7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc190cnVuY2F0ZV9hcm5hbWUoJXAsICVzLCAlcylcbiIsIGFiZmQsIHBhdGhuYW1lLCBhcmhkcik7Ci0jZW5kaWYKLSAgcmV0dXJuOwotfQotCi0KLS8qID8/Pwl3cml0ZSBhcmNoaXZlIG1hcCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc193cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphcmNoOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfd3JpdGVfYXJtYXAoJXAsICVkLCAlcCwgJWQgJWQpXG4iLAotCWFyY2gsIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50LCBzdHJpZHgpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGFyY2hpdmUgaGVhZGVyID8/PyAgKi8KLQotc3RhdGljIFBUUgotdm1zX3JlYWRfYXJfaGRyIChhYmZkKQotICAgIGJmZCAqIGFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19yZWFkX2FyX2hkciglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiAoUFRSKTA7Ci19Ci0KLQotLyogUHJvdmlkZWQgYSBCRkQsIEB2YXJ7YXJjaGl2ZX0sIGNvbnRhaW5pbmcgYW4gYXJjaGl2ZSBhbmQgTlVMTCwgb3BlbgotICAgYW4gaW5wdXQgQkZEIG9uIHRoZSBmaXJzdCBjb250YWluZWQgZWxlbWVudCBhbmQgcmV0dXJucyB0aGF0LgotICAgU3Vic2VxdWVudCBjYWxscyBzaG91bGQgcGFzcyB0aGUgYXJjaGl2ZSBhbmQgdGhlIHByZXZpb3VzIHJldHVybiB2YWx1ZQotICAgdG8gcmV0dXJuIGEgY3JlYXRlZCBCRkQgdG8gdGhlIG5leHQgY29udGFpbmVkIGVsZW1lbnQuCi0gICBOVUxMIGlzIHJldHVybmVkIHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUuICAqLwotCi1zdGF0aWMgYmZkICoKLXZtc19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyY2gsIHByZXYpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgYmZkICpwcmV2OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlKCVwLCAlcClcbiIsIGFyY2gsIHByZXYpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiBSZXR1cm4gdGhlIEJGRCB3aGljaCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBzeW1ib2wgaW4gQUJGRCBpbmRleGVkIGJ5Ci0gICBJTkRFWC4gIElOREVYIHNob3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQgYnkgYmZkX2dldF9uZXh0X21hcGVudC4gICovCi0KLXN0YXRpYyBiZmQgKgotdm1zX2dldF9lbHRfYXRfaW5kZXggKGFiZmQsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN5bWluZGV4IGluZGV4OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X2VsdF9hdF9pbmRleCglcCwgJXApXG4iLCBhYmZkLCBpbmRleCk7Ci0jZW5kaWYKLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4KGFiZmQsIGluZGV4KTsKLX0KLQotCi0vKiA/Pz8KLSAgIC0+IGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQgICovCi0KLXN0YXRpYyBpbnQKLXZtc19nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIHN0YXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHN0YXQgKnN0YXQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZW5lcmljX3N0YXRfYXJjaF9lbHQoJXAsICVwKVxuIiwgYWJmZCwgc3RhdCk7Ci0jZW5kaWYKLSAgcmV0dXJuIGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQoYWJmZCwgc3RhdCk7Ci19Ci0KLQotLyogVGhpcyBpcyBhIG5ldyBmdW5jdGlvbiBpbiBiZmQgMi41ICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyotLSBQYXJ0IDQuNSwgc3ltYm9scyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIGEgdmVjdG9yIG9mIHBvaW50ZXJzCi0gICB0byBhc3ltYm9scyBmb3IgYWxsIHRoZSBzeW1ib2xzIGluIHRoZSBCRkQgYWJmZCwgaW5jbHVkaW5nIGEKLSAgIHRlcm1pbmFsIE5VTEwgcG9pbnRlci4gSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMgaW4gdGhlIEJGRCwKLSAgIHRoZW4gcmV0dXJuIDAuICBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybiAtMS4gICovCi0KLXN0YXRpYyBsb25nCi12bXNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCglcCksICVkIHN5bWJvbHNcbiIsIGFiZmQsIFBSSVYoZ3NkX3N5bV9jb3VudCkpOwotI2VuZGlmCi0gIHJldHVybiAoUFJJVihnc2Rfc3ltX2NvdW50KSsxKSAqIHNpemVvZihhc3ltYm9sICopOwotfQotCi0KLS8qIENvcHkgc3ltYm9scyBmcm9tIGhhc2ggdGFibGUgdG8gc3ltYm9sIHZlY3RvcgotCi0gICBjYWxsZWQgZnJvbSBiZmRfaGFzaF90cmF2ZXJzZSBpbiB2bXNfZ2V0X3N5bXRhYgotICAgaW5pdCBjb3VudGVyIHRvIDAgaWYgZW50cnkgPT0gMCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvcHlfc3ltYm9scyAoZW50cnksIGFyZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgUFRSIGFyZzsKLXsKLSAgYmZkICphYmZkID0gKGJmZCAqKSBhcmc7Ci0KLSAgaWYgKGVudHJ5ID09IE5VTEwpCS8qIGluaXQgY291bnRlciAqLwotICAgIFBSSVYoc3ltbnVtKSA9IDA7Ci0gIGVsc2UJCQkvKiBmaWxsIHZlY3RvciwgaW5jIGNvdW50ZXIgKi8KLSAgICBQUklWKHN5bWNhY2hlKVtQUklWKHN5bW51bSkrK10gPSAoKHZtc19zeW1ib2xfZW50cnkgKillbnRyeSktPnN5bWJvbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBSZWFkIHRoZSBzeW1ib2xzIGZyb20gdGhlIEJGRCBhYmZkLCBhbmQgZmlsbHMgaW4gdGhlIHZlY3RvcgotICAgbG9jYXRpb24gd2l0aCBwb2ludGVycyB0byB0aGUgc3ltYm9scyBhbmQgYSB0cmFpbGluZyBOVUxMLgotCi0gICByZXR1cm4gIyBvZiBzeW1ib2xzIHJlYWQgICovCi0KLXN0YXRpYyBsb25nCi12bXNfZ2V0X3N5bXRhYiAoYWJmZCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9zeW10YWIoJXAsIDxyZXQ+KVxuIiwgYWJmZCk7Ci0jZW5kaWYKLQotCS8qIGluaXQgY291bnRlciAqLwotICAodm9pZCljb3B5X3N5bWJvbHMoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKTAsIGFiZmQpOwotCi0JLyogdHJhdmVyc2UgdGFibGUgYW5kIGZpbGwgc3ltYm9scyB2ZWN0b3IgKi8KLQotICBQUklWKHN5bWNhY2hlKSA9IHN5bWJvbHM7Ci0gIGJmZF9oYXNoX3RyYXZlcnNlKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIGNvcHlfc3ltYm9scywgKFBUUilhYmZkKTsKLQotICBzeW1ib2xzW1BSSVYoZ3NkX3N5bV9jb3VudCldID0gTlVMTDsKLQotICByZXR1cm4gUFJJVihnc2Rfc3ltX2NvdW50KTsKLX0KLQotCi0vKiBDcmVhdGUgYSBuZXcgYXN5bWJvbCBzdHJ1Y3R1cmUgZm9yIHRoZSBCRkQgYWJmZCBhbmQgcmV0dXJuIGEgcG9pbnRlcgotICAgdG8gaXQuCi0gICBUaGlzIHJvdXRpbmUgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgZWFjaCBiYWNrIGVuZCBoYXMgcHJpdmF0ZSBpbmZvcm1hdGlvbgotICAgc3Vycm91bmRpbmcgdGhlIGFzeW1ib2wuIEJ1aWxkaW5nIHlvdXIgb3duIGFzeW1ib2wgYW5kIHBvaW50aW5nIHRvIGl0Ci0gICB3aWxsIG5vdCBjcmVhdGUgdGhlIHByaXZhdGUgaW5mb3JtYXRpb24sIGFuZCB3aWxsIGNhdXNlIHByb2JsZW1zIGxhdGVyIG9uLiAgKi8KLQotYXN5bWJvbCAqCi1fYmZkX3Ztc19tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpzeW1ib2wgPSAoYXN5bWJvbCAqKWJmZF96YWxsb2MoYWJmZCwgc2l6ZW9mKGFzeW1ib2wpKTsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJfYmZkX3Ztc19tYWtlX2VtcHR5X3N5bWJvbCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgaWYgKHN5bWJvbCA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBzeW1ib2wtPnRoZV9iZmQgPSBhYmZkOwotCi0gIHJldHVybiBzeW1ib2w7Ci19Ci0KLQotLyogUHJpbnQgc3ltYm9sIHRvIGZpbGUgYWNjb3JkaW5nIHRvIGhvdy4gaG93IGlzIG9uZSBvZgotICAgYmZkX3ByaW50X3N5bWJvbF9uYW1lCWp1c3QgcHJpbnQgdGhlIG5hbWUKLSAgIGJmZF9wcmludF9zeW1ib2xfbW9yZQlwcmludCBtb3JlICg/Pz8pCi0gICBiZmRfcHJpbnRfc3ltYm9sX2FsbAlwcmludCBhbGwgd2Uga25vdywgd2hpY2ggaXMgbm90IG11Y2ggcmlnaHQgbm93IDotKSAgKi8KLQotc3RhdGljIHZvaWQKLXZtc19wcmludF9zeW1ib2wgKGFiZmQsIGZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19wcmludF9zeW1ib2woJXAsICVwLCAlcCwgJWQpXG4iLCBhYmZkLCBmaWxlLCBzeW1ib2wsIGhvdyk7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotCWZwcmludGYoKEZJTEUgKilmaWxlLCIgJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotCXsKLQkgIENPTlNUIGNoYXIgKnNlY3Rpb25fbmFtZSA9IHN5bWJvbC0+c2VjdGlvbi0+bmFtZTsKLQotCSAgYmZkX3ByaW50X3N5bWJvbF92YW5kZigoUFRSKWZpbGUsc3ltYm9sKTsKLQotCSAgZnByaW50ZigoRklMRSAqKWZpbGUsIiAlLThzICVzIiwgc2VjdGlvbl9uYW1lLCBzeW1ib2wtPm5hbWUpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybjsKLX0KLQotCi0vKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgc3ltYm9sIGluIHJldC4KLQotICAgZmlsbCB0eXBlLCB2YWx1ZSBhbmQgbmFtZQotICAgdHlwZToKLQlBCWFic29sdXRlCi0JQglic3Mgc2VnbWVudCBzeW1ib2wKLQlDCWNvbW1vbiBzeW1ib2wKLQlECWRhdGEgc2VnbWVudCBzeW1ib2wKLQlmCWZpbGVuYW1lCi0JdAlhIHN0YXRpYyBmdW5jdGlvbiBzeW1ib2wKLQlUCXRleHQgc2VnbWVudCBzeW1ib2wKLQlVCXVuZGVmaW5lZAotCS0JZGVidWcgICovCi0KLXN0YXRpYyB2b2lkCi12bXNfZ2V0X3N5bWJvbF9pbmZvIChhYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9zeW1ib2xfaW5mbyglcCwgJXAsICVwKVxuIiwgYWJmZCwgc3ltYm9sLCByZXQpOwotI2VuZGlmCi0KLSAgc2VjID0gc3ltYm9sLT5zZWN0aW9uOwotCi0gIGlmIChyZXQgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKLSAgICByZXQtPnR5cGUgPSAnQyc7Ci0gIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLSAgICByZXQtPnR5cGUgPSAnQSc7Ci0gIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSkKLSAgICByZXQtPnR5cGUgPSAnVSc7Ci0gIGVsc2UgaWYgKGJmZF9pc19pbmRfc2VjdGlvbiAoc2VjKSkKLSAgICByZXQtPnR5cGUgPSAnSSc7Ci0gIGVsc2UgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19DT0RFKQotICAgIHJldC0+dHlwZSA9ICdUJzsKLSAgZWxzZSBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0RBVEEpCi0gICAgcmV0LT50eXBlID0gJ0QnOwotICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQUxMT0MpCi0gICAgcmV0LT50eXBlID0gJ0InOwotICBlbHNlCi0gICAgcmV0LT50eXBlID0gJy0nOwotCi0gIGlmIChyZXQtPnR5cGUgIT0gJ1UnKQotICAgIHJldC0+dmFsdWUgPSBzeW1ib2wtPnZhbHVlICsgc3ltYm9sLT5zZWN0aW9uLT52bWE7Ci0gIGVsc2UKLSAgICByZXQtPnZhbHVlID0gMDsKLSAgcmV0LT5uYW1lID0gc3ltYm9sLT5uYW1lOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3ltYm9sIHN5bSBpbiB0aGUgQkZEIGFiZmQgaXMKLSAgIGEgY29tcGlsZXIgZ2VuZXJhdGVkIGxvY2FsIGxhYmVsLCBlbHNlIHJldHVybiBmYWxzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKCVwLCAlcylcbiIsIGFiZmQsIG5hbWUpOwotI2VuZGlmCi0gIHJldHVybiBuYW1lWzBdID09ICckJzsKLX0KLQotCi0vKiBHZXQgc291cmNlIGxpbmUgbnVtYmVyIGZvciBzeW1ib2wgICovCi0KLXN0YXRpYyBhbGVudCAqCi12bXNfZ2V0X2xpbmVubyAoYWJmZCwgc3ltYm9sKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9saW5lbm8oJXAsICVwKVxuIiwgYWJmZCwgc3ltYm9sKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBQcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiwgY2FsY3VsYXRlIGFuZAotICAgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIGxpbmUgbmVhcmVzdCB0byB0aGUgd2FudGVkCi0gICBsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZSwgZnVuYywgbGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqZmlsZTsKLSAgICAgQ09OU1QgY2hhciAqKmZ1bmM7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2ZpbmRfbmVhcmVzdF9saW5lKCVwLCAlcywgJXAsICVsZCwgPHJldD4sIDxyZXQ+LCA8cmV0PilcbiIsCi0JICAgICAgYWJmZCwgc2VjdGlvbi0+bmFtZSwgc3ltYm9scywgKGxvbmcgaW50KW9mZnNldCk7Ci0jZW5kaWYKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qIEJhY2stZG9vciB0byBhbGxvdyBmb3JtYXQtYXdhcmUgYXBwbGljYXRpb25zIHRvIGNyZWF0ZSBkZWJ1ZyBzeW1ib2xzCi0gICB3aGlsZSB1c2luZyBCRkQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4gIEN1cnJlbnRseSB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIKLSAgIHdoZW4gY3JlYXRpbmcgQ09GRiBmaWxlcy4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLXZtc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgKGFiZmQsIHB0ciwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB2b2lkICpwdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCglcCwgJXAsICVsZClcbiIsIGFiZmQsIHB0ciwgc2l6ZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogUmVhZCBtaW5pc3ltYm9scy4gIEZvciBtaW5pc3ltYm9scywgd2UgdXNlIHRoZSB1bm1vZGlmaWVkIGEub3V0Ci0gICBzeW1ib2xzLiAgVGhlIG1pbmlzeW1ib2xfdG9fc3ltYm9sIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlc2UgaW50bwotICAgQkZEIGFzeW1ib2wgc3RydWN0dXJlcy4gICovCi0KLXN0YXRpYyBsb25nCi12bXNfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIFBUUiAqbWluaXN5bXNwOwotICAgICB1bnNpZ25lZCBpbnQgKnNpemVwOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfcmVhZF9taW5pc3ltYm9scyglcCwgJWQsICVwLCAlZClcbiIsIGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zcCwgKnNpemVwKTsKLSNlbmRpZgotICByZXR1cm4gX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zcCwgc2l6ZXApOwotfQotCi0vKiBDb252ZXJ0IGEgbWluaXN5bWJvbCB0byBhIEJGRCBhc3ltYm9sLiAgQSBtaW5pc3ltYm9sIGlzIGp1c3QgYW4KLSAgIHVubW9kaWZpZWQgYS5vdXQgc3ltYm9sLiAgVGhlIFNZTSBhcmd1bWVudCBpcyBhIHN0cnVjdHVyZSByZXR1cm5lZAotICAgYnkgYmZkX21ha2VfZW1wdHlfc3ltYm9sLCB3aGljaCB3ZSBmaWxsIGluIGhlcmUuICAqLwotCi1zdGF0aWMgYXN5bWJvbCAqCi12bXNfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW0sIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIGNvbnN0IFBUUiBtaW5pc3ltOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19taW5pc3ltYm9sX3RvX3N5bWJvbCglcCwgJWQsICVwLCAlcClcbiIsIGFiZmQsIGR5bmFtaWMsIG1pbmlzeW0sIHN5bSk7Ci0jZW5kaWYKLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgbWluaXN5bSwgc3ltKTsKLX0KLQotLyotLSBQYXJ0IDQuNiwgcmVsb2NhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbgotICAgYXNzb2NpYXRlZCB3aXRoIHNlY3Rpb24gc2VjdCBhdHRhY2hlZCB0byBiZmQgYWJmZC4KLSAgIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIC0xLiAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfcmVsb2NfdXBwZXJfYm91bmQoJXAsICVzKVxuIiwgYWJmZCwgc2VjdGlvbi0+bmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIC0xTDsKLX0KLQotCi0vKiBDYWxsIHRoZSBiYWNrIGVuZCBhc3NvY2lhdGVkIHdpdGggdGhlIG9wZW4gQkZEIGFiZmQgYW5kIHRyYW5zbGF0ZSB0aGUKLSAgIGV4dGVybmFsIGZvcm0gb2YgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gc2VjIGludG8gdGhlCi0gICBpbnRlcm5hbCBjYW5vbmljYWwgZm9ybS4gIFBsYWNlIHRoZSB0YWJsZSBpbnRvIG1lbW9yeSBhdCBsb2MsIHdoaWNoIGhhcwotICAgYmVlbiBwcmVhbGxvY2F0ZWQsIHVzdWFsbHkgYnkgYSBjYWxsIHRvIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQuCi0gICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVsb2NzLCBvciAtMSBvbiBlcnJvci4gICovCi0KLXN0YXRpYyBsb25nCi12bXNfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKmxvY2F0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2Nhbm9uaWNhbGl6ZV9yZWxvYyglcCwgJXMsIDxyZXQ+LCA8cmV0PilcbiIsIGFiZmQsIHNlY3Rpb24tPm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogdGhpcyBpcyBqdXN0IGNvcGllZCBmcm9tIGVjb2ZmLWFscGhhLCBuZWVkcyB0byBiZSBmaXhlZCBwcm9iYWJseSAqLwotCi0vKiBIb3cgdG8gcHJvY2VzcyB0aGUgdmFyaW91cyByZWxvYyB0eXBlcy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXJlbG9jX25pbCAoYWJmZCwgcmVsb2MsIHN5bSwgZGF0YSwgc2VjLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJyZWxvY19uaWwoYWJmZCAlcCwgb3V0cHV0X2JmZCAlcClcbiIsIGFiZmQsIG91dHB1dF9iZmQpOwotICB2bXNfZGVidWcgKDIsICJJbiBzZWN0aW9uICVzLCBzeW1ib2wgJXNcbiIsCi0Jc2VjLT5uYW1lLCBzeW0tPm5hbWUpOwotICB2bXNfZGVidWcgKDIsICJyZWxvYyBzeW0gJXMsIGFkZHIgJTA4bHgsIGFkZGVuZCAlMDhseCwgcmVsb2MgaXMgYSAlc1xuIiwKLQkJcmVsb2MtPnN5bV9wdHJfcHRyWzBdLT5uYW1lLAotCQkodW5zaWduZWQgbG9uZylyZWxvYy0+YWRkcmVzcywKLQkJKHVuc2lnbmVkIGxvbmcpcmVsb2MtPmFkZGVuZCwgcmVsb2MtPmhvd3RvLT5uYW1lKTsKLSAgdm1zX2RlYnVnICgyLCAiZGF0YSBhdCAlcFxuIiwgZGF0YSk7Ci0vKiAgX2JmZF9oZXhkdW1wICgyLCBkYXRhLCBiZmRfZ2V0X3JlbG9jX3NpemUocmVsb2MtPmhvd3RvKSwwKTsgKi8KLSNlbmRpZgotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEluIGNhc2Ugd2UncmUgb24gYSAzMi1iaXQgbWFjaGluZSwgY29uc3RydWN0IGEgNjQtYml0ICItMSIgdmFsdWUKLSAgIGZyb20gc21hbGxlciB2YWx1ZXMuICBTdGFydCB3aXRoIHplcm8sIHdpZGVuLCAqdGhlbiogZGVjcmVtZW50LiAgKi8KLSNkZWZpbmUgTUlOVVNfT05FCSgoKGJmZF92bWEpMCkgLSAxKQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBhbHBoYV9ob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8gKEFMUEhBX1JfSUdOT1JFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJR05PUkUiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfUkVGUVVBRCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGUVVBRCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjEgYml0IGJyYW5jaC4gIFRoZSBuYXRpdmUgYXNzZW1ibGVyIGdlbmVyYXRlcyB0aGVzZSBmb3IKLSAgICAgYnJhbmNoZXMgd2l0aGluIHRoZSB0ZXh0IHNlZ21lbnQsIGFuZCBhbHNvIGZpbGxzIGluIHRoZSBQQwotICAgICByZWxhdGl2ZSBvZmZzZXQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfQlJBRERSLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJCUkFERFIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBoaW50IGZvciBhIGp1bXAgdG8gYSByZWdpc3Rlci4gICovCi0gIEhPV1RPIChBTFBIQV9SX0hJTlQsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSElOVCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9TUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUwxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9TUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUwzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDY0LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMNjQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBQdXNoIGEgdmFsdWUgb24gdGhlIHJlbG9jIGV2YWx1YXRpb24gc3RhY2suICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9QVVNILAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFVTSCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU3RvcmUgdGhlIHZhbHVlIGZyb20gdGhlIHN0YWNrIGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAgU3RvcmUgaXQgaW4KLSAgICAgYSBiaXRmaWVsZCBvZiBzaXplIHJfc2l6ZSBzdGFydGluZyBhdCBiaXQgcG9zaXRpb24gcl9vZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9TVE9SRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9TVE9SRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN1YnRyYWN0IHRoZSByZWxvYyBhZGRyZXNzIGZyb20gdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlCi0gICAgIHJlbG9jYXRpb24gc3RhY2suICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9QU1VCLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFNVQiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU2hpZnQgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHJlbG9jYXRpb24gc3RhY2sgcmlnaHQgYnkgdGhlCi0gICAgIGdpdmVuIHZhbHVlLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFJTSElGVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BSU0hJRlQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhhY2suIExpbmthZ2UgaXMgZG9uZSBieSBsaW5rZXIuICAqLwotICBIT1dUTyAoQUxQSEFfUl9MSU5LQUdFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA4LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJMSU5LQUdFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wuICAqLwotICBIT1dUTyAoQUxQSEFfUl9SRUZMT05HLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZMT05HIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDY0IGJpdCByZWZlcmVuY2UgdG8gYSBwcm9jZWR1cmUsIHdyaXR0ZW4gYXMgMzIgYml0IHZhbHVlLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfQ09ERUFERFIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkNPREVBRERSIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gYSBob3d0byBzdHJ1Y3R1cmUgd2hpY2gsIHdoZW4gaW52b2tlZCwgd2lsbCBwZXJmb3JtCi0gICB0aGUgcmVsb2NhdGlvbiBjb2RlIG9uIGRhdGEgZnJvbSB0aGUgYXJjaGl0ZWN0dXJlIG5vdGVkLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKgotdm1zX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgaW50IGFscGhhX3R5cGU7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9yZWxvY190eXBlX2xvb2t1cCglcCwgJWQpXHQiLCBhYmZkLCBjb2RlKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18xNjoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwxNjsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18zMjoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1JFRkxPTkc7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfNjQ6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9SRUZRVUFEOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9SRUZRVUFEOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DXzIzX1BDUkVMX1MyOglhbHBoYV90eXBlID0gQUxQSEFfUl9CUkFERFI7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfSElOVDoJYWxwaGFfdHlwZSA9IEFMUEhBX1JfSElOVDsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwxNjsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwzMjsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ182NF9QQ1JFTDoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUw2NDsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFOglhbHBoYV90eXBlID0gQUxQSEFfUl9MSU5LQUdFOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSOglhbHBoYV90eXBlID0gQUxQSEFfUl9DT0RFQUREUjsJYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoInJlbG9jICglZCkgaXMgKlVOS05PV04qIiwgY29kZSk7Ci0JcmV0dXJuIChjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICopIE5VTEw7Ci0gICAgfQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDIsICJyZWxvYyBpcyAlc1xuIiwgYWxwaGFfaG93dG9fdGFibGVbYWxwaGFfdHlwZV0ubmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuICZhbHBoYV9ob3d0b190YWJsZVthbHBoYV90eXBlXTsKLX0KLQotCi0vKi0tIFBhcnQgNC43LCB3cml0aW5nIGFuIG9iamVjdCBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFNldCB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgaW4gQkZEIGFiZmQgdG8gYXJjaCBhbmQgbWFjaC4KLSAgIEZpbmQgdGhlIGNvcnJlY3QgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIGFyY2hfaW5mbwotICAgcG9pbnRlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaCkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfc2V0X2FyY2hfbWFjaCglcCwgJWQsICVsZClcbiIsIGFiZmQsIGFyY2gsIG1hY2gpOwotI2VuZGlmCi0gIGFiZmQtPmFyY2hfaW5mbyA9IGJmZF9zY2FuX2FyY2goImFscGhhIik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogU2V0cyB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gc2VjdGlvbiBpbiBCRkQgYWJmZCB0byB0aGUgZGF0YSBzdGFydGluZwotICAgaW4gbWVtb3J5IGF0IGRhdGEuIFRoZSBkYXRhIGlzIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzZWN0aW9uIHN0YXJ0aW5nIGF0Ci0gICBvZmZzZXQgb2Zmc2V0IGZvciBjb3VudCBieXRlcy4KLQotICAgTm9ybWFsbHkgdHJ1ZSBpcyByZXR1cm5lZCwgZWxzZSBmYWxzZS4gUG9zc2libGUgZXJyb3IgcmV0dXJucyBhcmU6Ci0gICBvIGJmZF9lcnJvcl9ub19jb250ZW50cyAtIFRoZSBvdXRwdXQgc2VjdGlvbiBkb2VzIG5vdCBoYXZlIHRoZQotCVNFQ19IQVNfQ09OVEVOVFMgYXR0cmlidXRlLCBzbyBub3RoaW5nIGNhbiBiZSB3cml0dGVuIHRvIGl0LgotICAgbyBhbmQgc29tZSBtb3JlIHRvbyAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfc2V0X3NlY3Rpb25fY29udGVudHMoJXAsIHNlYyAlcywgbG9jICVwLCBvZmYgJWxkLCBjb3VudCAlZClcbiIsCi0JCQkJCWFiZmQsIHNlY3Rpb24tPm5hbWUsIGxvY2F0aW9uLCAobG9uZyBpbnQpb2Zmc2V0LCAoaW50KWNvdW50KTsKLSAgdm1zX2RlYnVnICgyLCAic2VjcmF3ICVkLCBzZWNjb29rZWQgJWRcbiIsIChpbnQpc2VjdGlvbi0+X3Jhd19zaXplLCAoaW50KXNlY3Rpb24tPl9jb29rZWRfc2l6ZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIF9iZmRfc2F2ZV92bXNfc2VjdGlvbihhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCk7Ci19Ci0KLQotLyotLSBQYXJ0IDQuOCwgbGlua2VyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHZXQgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gaGVhZGVycy4gICovCi0KLXN0YXRpYyBpbnQKLXZtc19zaXplb2ZfaGVhZGVycyAoYWJmZCwgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiByZWxvYzsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3NpemVvZl9oZWFkZXJzKCVwLCAlcylcbiIsIGFiZmQsIChyZWxvYyk/IlRydWUiOiJGYWxzZSIpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi0KLS8qIFByb3ZpZGVzIGRlZmF1bHQgaGFuZGxpbmcgb2YgcmVsb2NhdGlvbiBlZmZvcnQgZm9yIGJhY2sgZW5kcwotICAgd2hpY2ggY2FuJ3QgYmUgYm90aGVyZWQgdG8gZG8gaXQgZWZmaWNpZW50bHkuICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotdm1zX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKCVwLCAlcCwgJXAsICVwLCAlcywgJXApXG4iLAotCQkJYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCBkYXRhLCAocmVsb2NhdGVhYmxlKT8iVHJ1ZSI6IkZhbHNlIiwgc3ltYm9scyk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogPz8/ICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9yZWxheF9zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9yZWxheF9zZWN0aW9uKCVwLCAlcywgJXAsIDxyZXQ+KVxuIiwKLQkJCQkJYWJmZCwgc2VjdGlvbi0+bmFtZSwgbGlua19pbmZvKTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXZtc19iZmRfZ2Nfc2VjdGlvbnMgKGFiZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2djX3NlY3Rpb25zKCVwLCAlcClcbiIsIGFiZmQsIGxpbmtfaW5mbyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQ3JlYXRlIGEgaGFzaCB0YWJsZSBmb3IgdGhlIGxpbmtlci4gIERpZmZlcmVudCBiYWNrZW5kcyBzdG9yZQotICAgZGlmZmVyZW50IGluZm9ybWF0aW9uIGluIHRoaXMgdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotdm1zX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi0KLS8qIEFkZCBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QgZmlsZSBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19iZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgbGlua19pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfbGlua19hZGRfc3ltYm9scyglcCwgJXApXG4iLCBhYmZkLCBsaW5rX2luZm8pOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiBEbyBhIGxpbmsgYmFzZWQgb24gdGhlIGxpbmtfb3JkZXIgc3RydWN0dXJlcyBhdHRhY2hlZCB0byBlYWNoCi0gICBzZWN0aW9uIG9mIHRoZSBCRkQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9maW5hbF9saW5rIChhYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9maW5hbF9saW5rKCVwLCAlcClcbiIsIGFiZmQsIGxpbmtfaW5mbyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNob3VsZCB0aGlzIHNlY3Rpb24gYmUgc3BsaXQgdXAgaW50byBzbWFsbGVyIHBpZWNlcyBkdXJpbmcgbGlua2luZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24oJXAsICVzKVxuIiwgYWJmZCwgc2VjdGlvbi0+bmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKi0tIFBhcnQgNC45LCBkeW5hbWljIHN5bWJvbHMgYW5kIHJlbG9jYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIGZpbGUpCi0gICAgYmZkICphYmZkOwotICAgIHZvaWQgKmZpbGU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi0KLS8qIFJlYWQgaW4gdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0KLXN0YXRpYyBsb25nCi12bXNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIChhYmZkLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKCVwLCA8cmV0PilcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiAwTDsKLX0KLQotCi0vKiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiAwTDsKLX0KLQotCi0vKiBSZWFkIGluIHRoZSBkeW5hbWljIHJlbG9jcy4gICovCi0KLXN0YXRpYyBsb25nCi12bXNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgKGFiZmQsIGFyZWwsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqKmFyZWw7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMEw7Ci19CmRpZmYgLS1naXQgYS9iZmQvdm1zLmggYi9iZmQvdm1zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YmRkMDIuLjAwMDAwMDAKLS0tIGEvYmZkL3Ztcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjc1ICswLDAgQEAKLSN1bmRlZiB2bXMKLS8qIHZtcy5oIC0tIEhlYWRlciBmaWxlIGZvciBWTVMgKEFscGhhIGFuZCBWYXgpIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgVk1TX0gKLSNkZWZpbmUgVk1TX0gKLQotCi0vKiBDb25zdGFudHMgc3RhcnRpbmcgd2l0aCAnRXh4eF8nIGFyZSBmb3Igb3BlblZNUy9BbHBoYSAoRVZBWCBvYmplY3QgbGFuZ3VhZ2UpICAqLwotCi0vKiBWTVMgVGV4dCwgaW5mb3JtYXRpb24gYW5kIHJlbG9jYXRpb24gcmVjb3JkIChUSVIvRVRJUikgZGVmaW5pdGlvbnMuICAqLwotCi0jZGVmaW5lIFRJUl9TX0NfU1RBX0dCTAkJMAotI2RlZmluZSBUSVJfU19DX1NUQV9TQgkJMQotI2RlZmluZSBUSVJfU19DX1NUQV9TVwkJMgotI2RlZmluZSBUSVJfU19DX1NUQV9MVwkJMwotI2RlZmluZSBUSVJfU19DX1NUQV9QQgkJNAotI2RlZmluZSBUSVJfU19DX1NUQV9QVwkJNQotI2RlZmluZSBUSVJfU19DX1NUQV9QTAkJNgotI2RlZmluZSBUSVJfU19DX1NUQV9VQiAgCTcKLSNkZWZpbmUgVElSX1NfQ19TVEFfVVcgIAk4Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX0JGSSAJOQotI2RlZmluZSBUSVJfU19DX1NUQV9XRkkgCTEwCi0jZGVmaW5lIFRJUl9TX0NfU1RBX0xGSSAJMTEKLSNkZWZpbmUgVElSX1NfQ19TVEFfRVBNIAkxMgotI2RlZmluZSBUSVJfU19DX1NUQV9DS0FSRyAgICAgICAxMwotI2RlZmluZSBUSVJfU19DX1NUQV9XUEIgCTE0Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX1dQVyAJMTUKLSNkZWZpbmUgVElSX1NfQ19TVEFfV1BMIAkxNgotI2RlZmluZSBUSVJfU19DX1NUQV9MU1kgCTE3Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX0xJVCAJMTgKLSNkZWZpbmUgVElSX1NfQ19TVEFfTEVQTSAgICAgICAgMTkKLSNkZWZpbmUgVElSX1NfQ19NQVhTVEFDT0QgICAgICAgMTkKLSNkZWZpbmUgVElSX1NfQ19NSU5TVE9DT0QgICAgICAgMjAKLSNkZWZpbmUgVElSX1NfQ19TVE9fU0IgIAkyMAotI2RlZmluZSBUSVJfU19DX1NUT19TVyAgCTIxCi0jZGVmaW5lIFRJUl9TX0NfU1RPX0wgICAJMjIKLSNkZWZpbmUgVElSX1NfQ19TVE9fTFcgIAkyMgotI2RlZmluZSBUSVJfU19DX1NUT19CRCAgCTIzCi0jZGVmaW5lIFRJUl9TX0NfU1RPX1dEICAJMjQKLSNkZWZpbmUgVElSX1NfQ19TVE9fTEQgIAkyNQotI2RlZmluZSBUSVJfU19DX1NUT19MSSAgCTI2Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1BJRFIgICAgICAgIDI3Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1BJQ1IgICAgICAgIDI4Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JTQiAJMjkKLSNkZWZpbmUgVElSX1NfQ19TVE9fUlNXIAkzMAotI2RlZmluZSBUSVJfU19DX1NUT19STCAgCTMxCi0jZGVmaW5lIFRJUl9TX0NfU1RPX1ZQUyAJMzIKLSNkZWZpbmUgVElSX1NfQ19TVE9fVVNCIAkzMwotI2RlZmluZSBUSVJfU19DX1NUT19VU1cgCTM0Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JVQiAJMzUKLSNkZWZpbmUgVElSX1NfQ19TVE9fUlVXIAkzNgotI2RlZmluZSBUSVJfU19DX1NUT19CICAgCTM3Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1cgICAJMzgKLSNkZWZpbmUgVElSX1NfQ19TVE9fUkIgIAkzOQotI2RlZmluZSBUSVJfU19DX1NUT19SVyAgCTQwCi0jZGVmaW5lIFRJUl9TX0NfU1RPX1JJVkIgICAgICAgIDQxCi0jZGVmaW5lIFRJUl9TX0NfU1RPX1BJUlIgICAgICAgIDQyCi0jZGVmaW5lIFRJUl9TX0NfTUFYU1RPQ09EICAgICAgIDQyCi0jZGVmaW5lIFRJUl9TX0NfTUlOT1BSQ09EICAgICAgIDUwCi0jZGVmaW5lIFRJUl9TX0NfT1BSX05PUCAJNTAKLSNkZWZpbmUgVElSX1NfQ19PUFJfQUREIAk1MQotI2RlZmluZSBUSVJfU19DX09QUl9TVUIgCTUyCi0jZGVmaW5lIFRJUl9TX0NfT1BSX01VTCAJNTMKLSNkZWZpbmUgVElSX1NfQ19PUFJfRElWIAk1NAotI2RlZmluZSBUSVJfU19DX09QUl9BTkQgCTU1Ci0jZGVmaW5lIFRJUl9TX0NfT1BSX0lPUiAJNTYKLSNkZWZpbmUgVElSX1NfQ19PUFJfRU9SIAk1NwotI2RlZmluZSBUSVJfU19DX09QUl9ORUcgCTU4Ci0jZGVmaW5lIFRJUl9TX0NfT1BSX0NPTSAJNTkKLSNkZWZpbmUgVElSX1NfQ19PUFJfSU5TViAgICAgICAgNjAKLSNkZWZpbmUgVElSX1NfQ19PUFJfQVNIIAk2MQotI2RlZmluZSBUSVJfU19DX09QUl9VU0ggCTYyCi0jZGVmaW5lIFRJUl9TX0NfT1BSX1JPVCAJNjMKLSNkZWZpbmUgVElSX1NfQ19PUFJfU0VMIAk2NAotI2RlZmluZSBUSVJfU19DX09QUl9SRURFRiAgICAgICA2NQotI2RlZmluZSBUSVJfU19DX09QUl9ERkxJVCAgICAgICA2NgotI2RlZmluZSBUSVJfU19DX01BWE9QUkNPRCAgICAgICA2NgotI2RlZmluZSBUSVJfU19DX01JTkNUTENPRCAgICAgICA4MAotI2RlZmluZSBUSVJfU19DX0NUTF9TRVRSQiAgICAgICA4MAotI2RlZmluZSBUSVJfU19DX0NUTF9BVUdSQiAgICAgICA4MQotI2RlZmluZSBUSVJfU19DX0NUTF9ERkxPQyAgICAgICA4MgotI2RlZmluZSBUSVJfU19DX0NUTF9TVExPQyAgICAgICA4MwotI2RlZmluZSBUSVJfU19DX0NUTF9TVEtETCAgICAgICA4NAotI2RlZmluZSBUSVJfU19DX01BWENUTENPRCAgICAgICA4NAotCi0jZGVmaW5lIEVUSVJfU19DX01JTlNUQUNPRCAwCQkvKiBNaW5pbXVtIHN0b3JlIGNvZGUJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUQV9HQkwgMAkJLyogU3RhY2sgZ2xvYmFsIHN5bWJvbCB2YWx1ZQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfTFcgMQkJLyogU3RhY2sgbG9uZ3dvcmQJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUQV9RVyAyCQkvKiBTdGFjayBxdWFkd29yZAkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RBX1BRIDMJCS8qIFN0YWNrIHBzZWN0IGJhc2UgcGx1cyBxdWFkd29yZCBvZmZzZXQgICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQV9MSSA0CQkvKiBTdGFjayBsaXRlcmFsCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfTU9EIDUJCS8qIFN0YWNrIG1vZHVsZQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUQV9DS0FSRyA2CQkvKiBDaGVjayBBcmd1bWVudHMJCSovCi0jZGVmaW5lIEVUSVJfU19DX01BWFNUQUNPRCA2CQkvKiBNYXhpbXVtIHN0YWNrIGNvZGUJCSovCi0jZGVmaW5lIEVUSVJfU19DX01JTlNUT0NPRCA1MAkJLyogTWluaW11bSBzdG9yZSBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fQiA1MAkJLyogU3RvcmUgYnl0ZQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19XIDUxCQkvKiBTdG9yZSB3b3JkCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0xXIDUyCQkvKiBTdG9yZSBsb25nd29yZAkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX1FXIDUzCQkvKiBTdG9yZSBxdWFkd29yZAkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0lNTVIgNTQJCS8qIFN0b3JlIGltbWVkaWF0ZSBSZXBlYXRlZAkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fR0JMIDU1CQkvKiBTdG9yZSBnbG9iYWwJCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fQ0EgNTYJCS8qIFN0b3JlIGNvZGUgYWRkcmVzcwkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX1JCIDU3CQkvKiBTdG9yZSByZWxhdGl2ZSBicmFuY2gJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0FCIDU4CQkvKiBTdG9yZSBhYnNvbHV0ZSBicmFuY2gJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX09GRiA1OQkJLyogU3RvcmUgb2Zmc2V0IHdpdGhpbiBwc2VjdAkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fSU1NIDYxCQkvKiBTdG9yZSBpbW1lZGlhdGUJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19HQkxfTFcgNjIJCS8qIFN0b3JlIGdsb2JhbCBMb25nd29yZAkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fTFBfUFNCIDYzCQkvKiBTVE9fTFBfUFNCIG5vdCB2YWxpZCBpbiBsZXZlbCAyIHVzZSBTVENfTFBfUFNCCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0hJTlRfR0JMIDY0CS8qIFN0b3JlIDE0IGJpdCBISU5UIGF0IGdsb2JhbCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19ISU5UX1BTIDY1CQkvKiBTdG9yZSAxNCBiaXQgSElOVCBhdCBwc2VjdCArIG9mZnNldCAqLwotI2RlZmluZSBFVElSX1NfQ19NQVhTVE9DT0QgNjUJCS8qIE1heGltdW0gc3RvcmUgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUlOT1BSQ09EIDEwMAkJLyogTWluaW11bSBvcGVyYXRlIGNvZGUJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9OT1AgMTAwCQkvKiBOby1vcAkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9BREQgMTAxCQkvKiBBZGQJCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX1NVQiAxMDIJCS8qIFN1YnRyYWN0CQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX01VTCAxMDMJCS8qIE11bHRpcGx5CQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX0RJViAxMDQJCS8qIERpdmlkZQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9BTkQgMTA1CQkvKiBMb2dpY2FsIEFORAkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9JT1IgMTA2CQkvKiBMb2dpY2FsIGluY2x1c2l2ZSBPUgkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX0VPUiAxMDcJCS8qIExvZ2ljYWwgZXhjbHVzaXZlIE9SCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfTkVHIDEwOAkJLyogTmVnYXRlCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX0NPTSAxMDkJCS8qIENvbXBsZW1lbnQJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfSU5TViAxMTAJCS8qIEluc2VydCBiaXQgZmllbGQJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9BU0ggMTExCQkvKiBBcml0aG1ldGljIHNoaWZ0CQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfVVNIIDExMgkJLyogVW5zaWduZWQgc2hpZnQJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9ST1QgMTEzCQkvKiBSb3RhdGUJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfU0VMIDExNAkJLyogU2VsZWN0IG9uZSBvZiB0aHJlZSBsb25nd29yZHMgb24gdG9wIG9mIHN0YWNrICAqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfUkVERUYgMTE1CQkvKiBSZWRlZmluZSB0aGlzIHN5bWJvbCBhZnRlciBwYXNzIDIgICovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9ERkxJVCAxMTYJCS8qIERlZmluZSBhIGxpdGVyYWwJCSovCi0jZGVmaW5lIEVUSVJfU19DX01BWE9QUkNPRCAxMTYJCS8qIE1heGltdW0gb3BlcmF0ZSBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19NSU5DVExDT0QgMTUwCQkvKiBNaW5pbXVtIGNvbnRyb2wgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfQ1RMX1NFVFJCIDE1MAkJLyogU2V0IHJlbG9jYXRpb24gYmFzZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfQ1RMX0FVR1JCIDE1MQkJLyogQXVnbWVudCByZWxvY2F0aW9uIGJhc2UJKi8KLSNkZWZpbmUgRVRJUl9TX0NfQ1RMX0RGTE9DIDE1MgkJLyogRGVmaW5lIGRlYnVnIGxvY2F0aW9uCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9TVExPQyAxNTMJCS8qIFNldCBkZWJ1ZyBsb2NhdGlvbgkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfQ1RMX1NUS0RMIDE1NAkJLyogU3RhY2sgZGVidWcgbG9jYXRpb24JCSovCi0jZGVmaW5lIEVUSVJfU19DX01BWENUTENPRCAxNTQJCS8qIE1heGltdW0gY29udHJvbCBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19NSU5TVENDT0QgMjAwCQkvKiBNaW5pbXVtIHN0b3JlLWNvbmRpdGlvbmFsIGNvZGUgICAgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0xQIDIwMAkJLyogU3RvcmUtY29uZGl0aW9uYWwgTGlua2FnZSBQYWlyICAgICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19MUF9QU0IgMjAxCQkvKiBTdG9yZS1jb25kaXRpb25hbCBMaW5rYWdlIFBhaXIgd2l0aCBQcm9jZWR1cmUgU2lnbmF0dXJlICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19HQkwgMjAyCQkvKiBTdG9yZS1jb25kaXRpb25hbCBBZGRyZXNzIGF0IGdsb2JhbCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19HQ0EgMjAzCQkvKiBTdG9yZS1jb25kaXRpb25hbCBDb2RlIEFkZHJlc3MgYXQgZ2xvYmFsIGFkZHJlc3MgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX1BTIDIwNAkJLyogU3RvcmUtY29uZGl0aW9uYWwgQWRkcmVzcyBhdCBwc2VjdCArIG9mZnNldCAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTk9QX0dCTCAyMDUJLyogU3RvcmUtY29uZGl0aW9uYWwgTk9QIGF0IGFkZHJlc3Mgb2YgZ2xvYmFsICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19OT1BfUFMgMjA2CQkvKiBTdG9yZS1jb25kaXRpb25hbCBOT1AgYXQgcGVjdCArIG9mZnNldCAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfQlNSX0dCTCAyMDcJLyogU3RvcmUtY29uZGl0aW9uYWwgQlNSIGF0IGdsb2JhbCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19CU1JfUFMgMjA4CQkvKiBTdG9yZS1jb25kaXRpb25hbCBCU1IgYXQgcGVjdCArIG9mZnNldCAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTERBX0dCTCAyMDkJLyogU3RvcmUtY29uZGl0aW9uYWwgTERBIGF0IGdsb2JhbCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19MREFfUFMgMjEwCQkvKiBTdG9yZS1jb25kaXRpb25hbCBMREEgYXQgcHNlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0JPSF9HQkwgMjExCS8qIFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBvciBIaW50IGF0IGdsb2JhbCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19CT0hfUFMgMjEyCQkvKiBTdG9yZS1jb25kaXRpb25hbCBCU1Igb3IgSGludCBhdCBwZWN0ICsgb2Zmc2V0ICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19OQkhfR0JMIDIxMwkvKiBTdG9yZS1jb25kaXRpb25hbCBOT1AsQlNSIG9yIEhJTlQgYXQgZ2xvYmFsIGFkZHJlc3MgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX05CSF9QUyAyMTQJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIE5PUCxCU1Igb3IgSElOVCBhdCBwc2VjdCArIG9mZnNldCAqLwotI2RlZmluZSBFVElSX1NfQ19NQVhTVENDT0QgMjE0CQkvKiBNYXhpbXVtIHN0b3JlLWNvbmRpdGlvbmFsIGNvZGUgICAgKi8KLQotLyogVk1TIEdsb2JhbCBzeW1ib2wgZGVmaW5pdGlvbiByZWNvcmQgKEdTRC9FR1NEKS4gICovCi0KLSNkZWZpbmUgR1NEX1NfS19FTlRSSUVTIDEKLSNkZWZpbmUgR1NEX1NfQ19FTlRSSUVTIDEKLSNkZWZpbmUgR1NEX1NfQ19QU0MgICAgIDAKLSNkZWZpbmUgR1NEX1NfQ19TWU0gICAgIDEKLSNkZWZpbmUgR1NEX1NfQ19FUE0gICAgIDIKLSNkZWZpbmUgR1NEX1NfQ19QUk8gICAgIDMKLSNkZWZpbmUgR1NEX1NfQ19TWU1XICAgIDQKLSNkZWZpbmUgR1NEX1NfQ19FUE1XICAgIDUKLSNkZWZpbmUgR1NEX1NfQ19QUk9XICAgIDYKLSNkZWZpbmUgR1NEX1NfQ19JREMgICAgIDcKLSNkZWZpbmUgR1NEX1NfQ19FTlYgICAgIDgKLSNkZWZpbmUgR1NEX1NfQ19MU1kgICAgIDkKLSNkZWZpbmUgR1NEX1NfQ19MRVBNICAgIDEwCi0jZGVmaW5lIEdTRF9TX0NfTFBSTyAgICAxMQotI2RlZmluZSBHU0RfU19DX1NQU0MgICAgMTIKLSNkZWZpbmUgR1NEX1NfQ19TWU1WICAgIDEzCi0jZGVmaW5lIEdTRF9TX0NfRVBNViAgICAxNAotI2RlZmluZSBHU0RfU19DX1BST1YgICAgMTUKLSNkZWZpbmUgR1NEX1NfQ19NQVhSRUNUWVAgICAgICAgMTUKLQotI2RlZmluZSBFR1NEX1NfS19FTlRSSUVTIDIJLyogT2Zmc2V0IHRvIGZpcnN0IGVudHJ5IGluIHJlY29yZAkqLwotI2RlZmluZSBFR1NEX1NfQ19FTlRSSUVTIDIJLyogT2Zmc2V0IHRvIGZpcnN0IGVudHJ5IGluIHJlY29yZAkqLwotI2RlZmluZSBFR1NEX1NfQ19QU0MgMAkJLyogUHNlY3QgZGVmaW5pdGlvbgkJCSovCi0jZGVmaW5lIEVHU0RfU19DX1NZTSAxCQkvKiBTeW1ib2wgc3BlY2lmaWNhdGlvbgkJCSovCi0jZGVmaW5lIEVHU0RfU19DX0lEQyAyCQkvKiBSYW5kb20gZW50aXR5IGNoZWNrCQkJKi8KLSNkZWZpbmUgRUdTRF9TX0NfU1BTQyA1CQkvKiBTaGFyZWFibGUgaW1hZ2UgcHNlY3QgZGVmaW5pdGlvbgkqLwotI2RlZmluZSBFR1NEX1NfQ19TWU1WIDYJCS8qIFZlY3RvcmVkIChkdWFsLXZhbHVlZCkgdmVyc2lvbnMgb2YgU1lNLCAqLwotI2RlZmluZSBFR1NEX1NfQ19TWU1NIDcJCS8qIE1hc2tlZCB2ZXJzaW9ucyBvZiBTWU0sCQkqLwotI2RlZmluZSBFR1NEX1NfQ19TWU1HIDgJCS8qIEVHU1QgLSBnc3QgdmVyc2lvbiBvZiBTWU0JCSovCi0jZGVmaW5lIEVHU0RfU19DX01BWFJFQ1RZUCA4CS8qIE1heGltdW0gZW50cnkgdHlwZSBkZWZpbmVkCQkqLwotCi0jZGVmaW5lIEdQU19TX01fUElDICAgICAxCi0jZGVmaW5lIEdQU19TX01fTElCICAgICAyCi0jZGVmaW5lIEdQU19TX01fT1ZSICAgICA0Ci0jZGVmaW5lIEdQU19TX01fUkVMICAgICA4Ci0jZGVmaW5lIEdQU19TX01fR0JMICAgICAxNgotI2RlZmluZSBHUFNfU19NX1NIUiAgICAgMzIKLSNkZWZpbmUgR1BTX1NfTV9FWEUgICAgIDY0Ci0jZGVmaW5lIEdQU19TX01fUkQgICAgICAxMjgKLSNkZWZpbmUgR1BTX1NfTV9XUlQgICAgIDI1NgotI2RlZmluZSBHUFNfU19NX1ZFQyAgICAgNTEyCi0jZGVmaW5lIEdQU19TX0tfTkFNRSAgICA5Ci0jZGVmaW5lIEdQU19TX0NfTkFNRSAgICA5Ci0KLSNkZWZpbmUgRUdQU19TX1ZfUElDCTB4MDAwMQotI2RlZmluZSBFR1BTX1NfVl9MSUIJMHgwMDAyCi0jZGVmaW5lIEVHUFNfU19WX09WUgkweDAwMDQKLSNkZWZpbmUgRUdQU19TX1ZfUkVMCTB4MDAwOAotI2RlZmluZSBFR1BTX1NfVl9HQkwJMHgwMDEwCi0jZGVmaW5lIEVHUFNfU19WX1NIUgkweDAwMjAKLSNkZWZpbmUgRUdQU19TX1ZfRVhFCTB4MDA0MAotI2RlZmluZSBFR1BTX1NfVl9SRAkweDAwODAKLSNkZWZpbmUgRUdQU19TX1ZfV1JUCTB4MDEwMAotI2RlZmluZSBFR1BTX1NfVl9WRUMJMHgwMjAwCi0jZGVmaW5lIEVHUFNfU19WX05PTU9ECTB4MDQwMAotI2RlZmluZSBFR1BTX1NfVl9DT00JMHgwODAwCi0KLSNkZWZpbmUgR1NZX1NfTV9XRUFLICAgIDEKLSNkZWZpbmUgR1NZX1NfTV9ERUYgICAgIDIKLSNkZWZpbmUgR1NZX1NfTV9VTkkgICAgIDQKLSNkZWZpbmUgR1NZX1NfTV9SRUwgICAgIDgKLQotI2RlZmluZSBFR1NZX1NfVl9XRUFLCTB4MDAwMQotI2RlZmluZSBFR1NZX1NfVl9ERUYJMHgwMDAyCi0jZGVmaW5lIEVHU1lfU19WX1VOSQkweDAwMDQKLSNkZWZpbmUgRUdTWV9TX1ZfUkVMCTB4MDAwOAotI2RlZmluZSBFR1NZX1NfVl9DT01NCTB4MDAxMAotI2RlZmluZSBFR1NZX1NfVl9WRUNFUAkweDAwMjAKLSNkZWZpbmUgRUdTWV9TX1ZfTk9STQkweDAwNDAKLQotI2RlZmluZSBMU1lfU19NX0RFRiAgICAgMgotI2RlZmluZSBMU1lfU19NX1JFTCAgICAgOAotCi0jZGVmaW5lIEVOVl9TX01fREVGICAgICAxCi0jZGVmaW5lIEVOVl9TX01fTkVTVEVEICAyCi0KLS8qCi0gKglEZWJ1Z2dlciBzeW1ib2wgZGVmaW5pdGlvbnM6ICBUaGVzZSBhcmUgZG9uZSBieSBoYW5kLCBhcyBubwotICoJCQkJCW1hY2hpbmUtcmVhZGFibGUgdmVyc2lvbiBzZWVtcwotICoJCQkJCXRvIGJlIGF2YWlsYWJsZS4KLSAqLwotI2RlZmluZSBEU1RfU19DX0MJCSAgNwkvKiBMYW5ndWFnZSA9PSAiQyIJKi8KLSNkZWZpbmUgRFNUX1NfQ19DWFgJCSAxNQkvKiBMYW5ndWFnZSA9PSAiQysrIgkqLwotI2RlZmluZSBEU1RfU19DX1ZFUlNJT04JCTE1MwotI2RlZmluZQlEU1RfU19DX1NPVVJDRQkJMTU1CS8qIFNvdXJjZSBmaWxlCQkqLwotI2RlZmluZSBEU1RfU19DX1BST0xPRwkJMTYyCi0jZGVmaW5lCURTVF9TX0NfQkxLQkVHCQkxNzYJLyogQmVnaW5uaW5nIG9mIGJsb2NrCSovCi0jZGVmaW5lCURTVF9TX0NfQkxLRU5ECQkxNzcJLyogRW5kIG9mIGJsb2NrCSovCi0jZGVmaW5lIERTVF9TX0NfRU5UUlkJCTE4MQotI2RlZmluZSBEU1RfU19DX1BTRUNUCQkxODQKLSNkZWZpbmUJRFNUX1NfQ19MSU5FX05VTQkxODUJLyogTGluZSBOdW1iZXIJCSovCi0jZGVmaW5lIERTVF9TX0NfTEJMT1JMSVQJMTg2Ci0jZGVmaW5lIERTVF9TX0NfTEFCRUwJCTE4NwotI2RlZmluZQlEU1RfU19DX01PREJFRwkJMTg4CS8qIEJlZ2lubmluZyBvZiBtb2R1bGUJKi8KLSNkZWZpbmUJRFNUX1NfQ19NT0RFTkQJCTE4OQkvKiBFbmQgb2YgbW9kdWxlCSovCi0jZGVmaW5lCURTVF9TX0NfUlROQkVHCQkxOTAJLyogQmVnaW5uaW5nIG9mIHJvdXRpbmUJKi8KLSNkZWZpbmUJRFNUX1NfQ19SVE5FTkQJCTE5MQkvKiBFbmQgb2Ygcm91dGluZQkqLwotI2RlZmluZQlEU1RfU19DX0RFTFRBX1BDX1cJMQkvKiBJbmNyIFBDCSovCi0jZGVmaW5lCURTVF9TX0NfSU5DUl9MSU5VTQkyCS8qIEluY3IgTGluZSAjCSovCi0jZGVmaW5lCURTVF9TX0NfSU5DUl9MSU5VTV9XCTMJLyogSW5jciBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfTElOVU1fSU5DUgk0Ci0jZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0lOQ1JfVyA1Ci0jZGVmaW5lIERTVF9TX0NfUkVTRVRfTElOVU1fSU5DUiA2Ci0jZGVmaW5lIERTVF9TX0NfQkVHX1NUTVRfTU9ERQk3Ci0jZGVmaW5lIERTVF9TX0NfRU5EX1NUTVRfTU9ERQk4Ci0jZGVmaW5lCURTVF9TX0NfU0VUX0xJTkVfTlVNCTkJLyogU2V0IExpbmUgIwkqLwotI2RlZmluZSBEU1RfU19DX1NFVF9QQwkJMTAKLSNkZWZpbmUgRFNUX1NfQ19TRVRfUENfVwkxMQotI2RlZmluZSBEU1RfU19DX1NFVF9QQ19MCTEyCi0jZGVmaW5lIERTVF9TX0NfU0VUX1NUTVROVU0JMTMKLSNkZWZpbmUgRFNUX1NfQ19URVJNCQkxNAkvKiBFbmQgb2YgbGluZXMJKi8KLSNkZWZpbmUgRFNUX1NfQ19URVJNX1cJCTE1CS8qIEVuZCBvZiBsaW5lcwkqLwotI2RlZmluZQlEU1RfU19DX1NFVF9BQlNfUEMJMTYJLyogU2V0IFBDCSovCi0jZGVmaW5lCURTVF9TX0NfREVMVEFfUENfTAkxNwkvKiBJbmNyIFBDCSovCi0jZGVmaW5lIERTVF9TX0NfSU5DUl9MSU5VTV9MCTE4CS8qIEluY3IgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0IJMTkJLyogU2V0IExpbmUgIwkqLwotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9MCTIwCS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUJRFNUX1NfQ19URVJNX0wJCTIxCS8qIEVuZCBvZiBsaW5lcwkqLwotLyogdGhlc2UgYXJlIHVzZWQgd2l0aCBEU1RfU19DX1NPVVJDRSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19ERUNMRklMRQkgMQkvKiBEZWNsYXJlIHNvdXJjZSBmaWxlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX1NFVEZJTEUJIDIJLyogU2V0IHNvdXJjZSBmaWxlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX1NFVFJFQ19MCSAzCS8qIFNldCByZWNvcmQsIGxvbmd3b3JkIHZhbHVlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX1NFVFJFQ19XCSA0CS8qIFNldCByZWNvcmQsIHdvcmQgdmFsdWUgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVGTElORVNfVwkxMAkvKiAjIG9mIGxpbmUsIHdvcmQgY291bnRlciAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19ERUZMSU5FU19CCTExCS8qICMgb2YgbGluZSwgYnl0ZSBjb3VudGVyICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX0ZPUk1GRUVECTE2CS8qIF5MIGNvdW50cyBhcyBhIHJlY29yZCAqLwotLyogdGhlIGZvbGxvd2luZyBhcmUgdGhlIGNvZGVzIGZvciB0aGUgdmFyaW91cyBkYXRhIHR5cGVzLiAgQW55dGhpbmcgbm90IG9uCi0gKiB0aGUgbGlzdCBpcyBpbmNsdWRlZCB1bmRlciAnYWR2YW5jZWRfdHlwZScKLSAqLwotI2RlZmluZSBEQkdfU19DX1VDSEFSCQkweDAyCi0jZGVmaW5lIERCR19TX0NfVVNJTlQJCTB4MDMKLSNkZWZpbmUgREJHX1NfQ19VTElOVAkJMHgwNAotI2RlZmluZSBEQkdfU19DX1VRVUFECQkweDA1Ci0jZGVmaW5lIERCR19TX0NfU0NIQVIJCTB4MDYKLSNkZWZpbmUgREJHX1NfQ19TU0lOVAkJMHgwNwotI2RlZmluZSBEQkdfU19DX1NMSU5UCQkweDA4Ci0jZGVmaW5lIERCR19TX0NfU1FVQUQJCTB4MDkKLSNkZWZpbmUgREJHX1NfQ19SRUFMNAkJMHgwYQotI2RlZmluZSBEQkdfU19DX1JFQUw4CQkweDBiCQkvKiBEX2Zsb2F0IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX0NPTVBMWDQJCTB4MGMJCS8qIDJ4Rl9mbG9hdCBjb21wbGV4IGZsb2F0ICovCi0jZGVmaW5lIERCR19TX0NfQ09NUExYOAkJMHgwZAkJLyogMnhEX2Zsb2F0IGNvbXBsZXggZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfUkVBTDhfRwkJMHgxYgkJLyogR19mbG9hdCBkb3VibGUgKi8KLSNkZWZpbmUgREJHX1NfQ19DT01QTFg4X0cJMHgxZAkJLyogMnhHX2Zsb2F0IGNvbXBsZXggZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfRlVOQ1RJT05fQUREUgkweDE3Ci0jZGVmaW5lIERCR19TX0NfQURWQU5DRURfVFlQRQkweGEzCi0vKiAgU29tZSBvZiB0aGVzZSBhcmUganVzdCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4gIFtwcl0KLSAqLwotI2RlZmluZSBEQkdfU19DX1VCSVRBCQkweDAxCS8qIHVuc2lnbmVkLCBhbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX1VCSVRVCQkweDIyCS8qIHVuc2lnbmVkLCB1bmFsaWduZWQgYml0IGZpZWxkICovCi0jZGVmaW5lIERCR19TX0NfU0JJVEEJCTB4MjkJLyogc2lnbmVkLCBhbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX1NCSVRVCQkweDJhCS8qIHNpZ25lZCwgdW5hbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX0NTVFJJTkcJCTB4MmUJLyogYXNjaXogKCdcMCcgdGVybWluYXRlZCkgc3RyaW5nICovCi0jZGVmaW5lIERCR19TX0NfV0NIQVIJCTB4MzgJLyogd2NoYXJfdCAqLwotLyogIFRoZXNlIGFyZSBkZXNjcmlwdG9yIGNsYXNzIGNvZGVzLgotICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX1MJCTB4MDEJLyogc3RhdGljIChmaXhlZCBsZW5ndGgpICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX0QJCTB4MDIJLyogZHluYW1pYyBzdHJpbmcgKG5vdCB2aWEgbWFsbG9jISkgKi8KLSNkZWZpbmUgRFNDX0tfQ0xBU1NfQQkJMHgwNAkvKiBhcnJheSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19VQlMJCTB4MGQJLyogdW5hbGlnbmVkIGJpdCBzdHJpbmcgKi8KLS8qICBUaGVzZSBhcmUgdGhlIGNvZGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRlZmluaXRpb25zIG9mIHN0cnVjdAotICogIHVuaW9uIGFuZCBlbnVtIHJlY29yZHMKLSAqLwotI2RlZmluZSBEQkdfU19DX0VOVU1fSVRFTQkJMHhhNAotI2RlZmluZSBEQkdfU19DX0VOVU1fU1RBUlQJCTB4YTUKLSNkZWZpbmUgREJHX1NfQ19FTlVNX0VORAkJMHhhNgotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9JVEVNCQlEU1RfS19WRkxBR1NfQklUT0ZGUwkvKiAweGZmICovCi0jZGVmaW5lIERCR19TX0NfU1RSVUNUX1NUQVJUCQkweGFiCi0jZGVmaW5lIERCR19TX0NfU1RSVUNUX0VORAkJMHhhYwotI2RlZmluZSBEU1RfS19UWVBTUEVDCQkJMHhhZgkJLyogdHlwZSBzcGVjaWZpY2F0aW9uICovCi0vKiBUaGVzZSBjb2RlcyBhcmUgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgc3ltYm9sIGRlZmluaXRpb24gcmVjb3JkcwotICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19OT1ZBTAkJMHg4MAkvKiBzdHJ1Y3QgZGVmaW5pdGlvbiBvbmx5ICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19EU0MJCTB4ZmEJLyogZGVzY3JpcHRvciB1c2VkICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19UVlMJCTB4ZmIJLyogdHJhaWxpbmcgdmFsdWUgc3BlY2lmaWVkICovCi0jZGVmaW5lIERTVF9LX1ZTX0ZPTExPV1MJCTB4ZmQJLyogdmFsdWUgc3BlYyBmb2xsb3dzICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19CSVRPRkZTCQkweGZmCS8qIHZhbHVlIGNvbnRhaW5zIGJpdCBvZmZzZXQgKi8KLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9MSVRFUkFMCTAKLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9BRERSCTEKLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9ERVNDCTIKLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9SRUcJMwotI2RlZmluZSBEU1RfS19SRUdfVkFYX0FQCTB4MGMJLyogUjEyICovCi0jZGVmaW5lIERTVF9LX1JFR19WQVhfRlAJMHgwZAkvKiBSMTMgKi8KLSNkZWZpbmUgRFNUX0tfUkVHX1ZBWF9TUAkweDBlCS8qIFIxNCAqLwotI2RlZmluZSBEU1RfVl9WQUxLSU5ECQkwCS8qIG9mZnNldCBvZiB2YWxraW5kIGZpZWxkICovCi0jZGVmaW5lIERTVF9WX0lORElSRUNUCQkyCS8qIG9mZnNldCB0byBpbmRpcmVjdCBiaXQgKi8KLSNkZWZpbmUgRFNUX1ZfRElTUAkJMwkvKiBvZmZzZXQgdG8gZGlzcGxhY2VtZW50IGJpdCAqLwotI2RlZmluZSBEU1RfVl9SRUdOVU0JCTQJLyogb2Zmc2V0IHRvIHJlZ2lzdGVyIG51bWJlciAqLwotI2RlZmluZSBEU1RfTV9JTkRJUkVDVAkJKDE8PERTVF9WX0lORElSRUNUKQotI2RlZmluZSBEU1RfTV9ESVNQCQkoMTw8RFNUX1ZfRElTUCkKLSNkZWZpbmUgREJHX0NfRlVOQ1RJT05fUEFSQU0JLyogMHhjOSAqLwlcCi0JKERTVF9LX1ZBTEtJTkRfQUREUnxEU1RfTV9ESVNQfChEU1RfS19SRUdfVkFYX0FQPDxEU1RfVl9SRUdOVU0pKQotI2RlZmluZSBEQkdfQ19MT0NBTF9TWU0JCS8qIDB4ZDkgKi8JXAotCShEU1RfS19WQUxLSU5EX0FERFJ8RFNUX01fRElTUHwoRFNUX0tfUkVHX1ZBWF9GUDw8RFNUX1ZfUkVHTlVNKSkKLS8qIEtpbmRzIG9mIHZhbHVlIHNwZWNpZmljYXRpb25zCi0gKi8KLSNkZWZpbmUgRFNUX0tfVlNfQUxMT0NfU1BMSVQJMwkvKiBzcGxpdCBsaWZldGltZSAqLwotLyogS2luZHMgb2YgdHlwZSBzcGVjaWZpY2F0aW9ucwotICovCi0jZGVmaW5lIERTVF9LX1RTX0FUT00JCTB4MDEJLyogYXRvbWljIHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotI2RlZmluZSBEU1RfS19UU19EU0MJCTB4MDIJLyogZGVzY3JpcHRvciB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfSU5ECQkweDAzCS8qIGluZGlyZWN0IHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotI2RlZmluZSBEU1RfS19UU19UUFRSCQkweDA0CS8qIHR5cGVkIHBvaW50ZXIgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX1BUUgkJMHgwNQkvKiBwb2ludGVyIHR5cGUgc3BlYyAqLwotI2RlZmluZSBEU1RfS19UU19BUlJBWQkJMHgwNwkvKiBhcnJheSB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfTk9WX0xFTkcJMHgwZQkvKiBub3ZlbCBsZW5ndGggdHlwZSBzcGVjICovCi0vKiAgVGhlc2UgYXJlIHRoZSBjb2RlcyB0aGF0IGFyZSB1c2VkIGluIHRoZSBzdWZmaXggcmVjb3JkcyB0byBkZXRlcm1pbmUgdGhlCi0gKiAgYWN0dWFsIGRhdGEgdHlwZQotICovCi0jZGVmaW5lIERCR19TX0NfQkFTSUMJCQlEU1RfS19UU19BVE9NCi0jZGVmaW5lIERCR19TX0NfQkFTSUNfQVJSQVkJCURTVF9LX1RTX0RTQwotI2RlZmluZSBEQkdfU19DX1NUUlVDVAkJCURTVF9LX1RTX0lORAotI2RlZmluZSBEQkdfU19DX1BPSU5URVIJCQlEU1RfS19UU19UUFRSCi0jZGVmaW5lIERCR19TX0NfVk9JRAkJCURTVF9LX1RTX1BUUgotI2RlZmluZSBEQkdfU19DX0NPTVBMRVhfQVJSQVkJCURTVF9LX1RTX0FSUkFZCi0KLS8qIFZNUyBNb2R1bGUgaGVhZGVyIHJlY29yZCAoRU1IKSBkZWZpbml0aW9ucy4gICovCi0KLSNkZWZpbmUgTUhEX1NfQ19NSEQgMAotI2RlZmluZSBNSERfU19DX0xOTSAxCi0jZGVmaW5lIE1IRF9TX0NfU1JDIDIKLSNkZWZpbmUgTUhEX1NfQ19UVEwgMwotI2RlZmluZSBNSERfU19DX0NQUiA0Ci0jZGVmaW5lIE1IRF9TX0NfTVRDIDUKLSNkZWZpbmUgTUhEX1NfQ19HVFggNgotI2RlZmluZSBNSERfU19DX01BWEhEUlRZUCA2Ci0KLSNkZWZpbmUgRU1IX1NfQ19NSEQgMAkJLyogTWFpbiBoZWFkZXIgcmVjb3JkCQkqLwotI2RlZmluZSBFTUhfU19DX0xOTSAxCQkvKiBMYW5ndWFnZSBuYW1lIGFuZCB2ZXJzaW9uCSovCi0jZGVmaW5lIEVNSF9TX0NfU1JDIDIJCS8qIFNvdXJjZSBmaWxlIHNwZWNpZmljYXRpb24JKi8KLSNkZWZpbmUgRU1IX1NfQ19UVEwgMwkJLyogVGl0bGUgdGV4dCBvZiBtb2R1bGUJCSovCi0jZGVmaW5lIEVNSF9TX0NfQ1BSIDQJCS8qIENvcHlyaWdodCBub3RpY2UJCSovCi0jZGVmaW5lIEVNSF9TX0NfTVRDIDUJCS8qIE1haW50ZW5hbmNlIHN0YXR1cwkJKi8KLSNkZWZpbmUgRU1IX1NfQ19HVFggNgkJLyogR2VuZXJhbCB0ZXh0CQkJKi8KLSNkZWZpbmUgRU1IX1NfQ19NQVhIRFJUWVAgNgkvKiBNYXhpbXVtIGFsbG93YWJsZSB0eXBlCSovCi0KLS8qIHZtcy5jLiAgKi8KLQotZXh0ZXJuIGFzeW1ib2wgKl9iZmRfdm1zX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi0vKiB2bXMtZ3NkLmMuICAqLwotCi1leHRlcm4gaW50IF9iZmRfdm1zX3NsdXJwX2dzZCBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3dyaXRlX2dzZCBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci0KLS8qIHZtcy1taGQuYy4gICovCi0KLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfaGRyIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfd3JpdGVfaGRyIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfZW9tIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfd3JpdGVfZW9tIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLQotLyogdm1zLXRpci5jLiAgKi8KLQotZXh0ZXJuIGludCBfYmZkX3Ztc19zbHVycF90aXIgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc19zbHVycF9kYmcgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc19zbHVycF90YnQgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc19zbHVycF9sbmsgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotCi1leHRlcm4gaW50IF9iZmRfdm1zX3dyaXRlX3RpciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3dyaXRlX3RidCBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3dyaXRlX2RiZyBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci0KLS8qIFRoZSByX3R5cGUgZmllbGQgaW4gYSByZWxvYyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICAqLwotI2RlZmluZSBBTFBIQV9SX0lHTk9SRQkJMAotI2RlZmluZSBBTFBIQV9SX1JFRlFVQUQJCTEKLSNkZWZpbmUgQUxQSEFfUl9CUkFERFIJCTIKLSNkZWZpbmUgQUxQSEFfUl9ISU5UCQkzCi0jZGVmaW5lIEFMUEhBX1JfU1JFTDE2CQk0Ci0jZGVmaW5lIEFMUEhBX1JfU1JFTDMyCQk1Ci0jZGVmaW5lIEFMUEhBX1JfU1JFTDY0CQk2Ci0jZGVmaW5lIEFMUEhBX1JfT1BfUFVTSAkJNwotI2RlZmluZSBBTFBIQV9SX09QX1NUT1JFCTgKLSNkZWZpbmUgQUxQSEFfUl9PUF9QU1VCCQk5Ci0jZGVmaW5lIEFMUEhBX1JfT1BfUFJTSElGVAkxMAotI2RlZmluZSBBTFBIQV9SX0xJTktBR0UJCTExCi0jZGVmaW5lIEFMUEhBX1JfUkVGTE9ORwkJMTIKLSNkZWZpbmUgQUxQSEFfUl9DT0RFQUREUgkxMwotCi0vKiBPYmplY3QgbGFuZ3VhZ2UgZGVmaW5pdGlvbnMuICAqLwotCi0jZGVmaW5lIE9CSl9TX0NfSERSIDAJCS8qVkFYIG1vZHVsZSBoZWFkZXIgcmVjb3JkCQkqLwotI2RlZmluZSBPQkpfU19DX0dTRCAxCQkvKlZBWCBnbG9iYWwgc3ltYm9sIGRlZmluaXRpb24gcmVjb3JkCSovCi0jZGVmaW5lIE9CSl9TX0NfVElSIDIJCS8qVkFYIHRleHQgaW5mb3JtYXRpb24gcmVjb3JkCQkqLwotI2RlZmluZSBPQkpfU19DX0VPTSAzCQkvKlZBWCBlbmQgb2YgbW9kdWxlIHJlY29yZAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19EQkcgNAkJLypWQVggRGVidWdnZXIgaW5mb3JtYXRpb24gcmVjb3JkCSovCi0jZGVmaW5lIE9CSl9TX0NfVEJUIDUJCS8qVkFYIFRyYWNlYmFjayBpbmZvcm1hdGlvbiByZWNvcmQJKi8KLSNkZWZpbmUgT0JKX1NfQ19MTksgNgkJLypWQVggbGlua2VyIG9wdGlvbnMgcmVjb3JkCQkqLwotI2RlZmluZSBPQkpfU19DX0VPTVcgNwkJLypWQVggZW5kIG9mIG1vZHVsZSB3b3JkLXBzZWN0IHJlY29yZAkqLwotI2RlZmluZSBPQkpfU19DX01BWFJFQ1RZUCA3CS8qVkFYIExhc3QgYXNzaWduZWQgcmVjb3JkIHR5cGUJCSovCi0jZGVmaW5lIEVPQkpfU19DX0VNSCA4CQkvKkVWQVggbW9kdWxlIGhlYWRlciByZWNvcmQJCSovCi0jZGVmaW5lIEVPQkpfU19DX0VFT00gOQkJLypFVkFYIGVuZCBvZiBtb2R1bGUgcmVjb3JkCQkqLwotI2RlZmluZSBFT0JKX1NfQ19FR1NEIDEwCS8qRVZBWCBnbG9iYWwgc3ltYm9sIGRlZmluaXRpb24gcmVjb3JkICAqLwotI2RlZmluZSBFT0JKX1NfQ19FVElSIDExCS8qRVZBWCB0ZXh0IGluZm9ybWF0aW9uIHJlY29yZAkJKi8KLSNkZWZpbmUgRU9CSl9TX0NfRURCRyAxMgkvKkVWQVggRGVidWdnZXIgaW5mb3JtYXRpb24gcmVjb3JkCSovCi0jZGVmaW5lIEVPQkpfU19DX0VUQlQgMTMJLypFVkFYIFRyYWNlYmFjayBpbmZvcm1hdGlvbiByZWNvcmQJKi8KLSNkZWZpbmUgRU9CSl9TX0NfTUFYUkVDVFlQIDEzCS8qRVZBWCBMYXN0IGFzc2lnbmVkIHJlY29yZCB0eXBlCSovCi0jZGVmaW5lIE9CSl9TX0tfU1VCVFlQIDEKLSNkZWZpbmUgT0JKX1NfQ19TVUJUWVAgMQotI2RlZmluZSBFT0JKX1NfS19TVUJUWVAgNAotI2RlZmluZSBFT0JKX1NfQ19TVUJUWVAgNAotI2RlZmluZSBPQkpfU19DX01BWFJFQ1NJWiAyMDQ4CS8qTWF4aW11bSBsZWdhbCByZWNvcmQgc2l6ZSAgICAgICAgICovCi0jZGVmaW5lIEVPQkpfU19DX01BWFJFQ1NJWiA4MTkyIC8qTWF4aW11bSBsZWdhbCByZWNvcmQgc2l6ZSAgICAgICAgICovCi0jZGVmaW5lIE9CSl9TX0NfU1RSTFZMIDAJLypTdHJ1Y3R1cmUgbGV2ZWwgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRU9CSl9TX0NfU1RSTFZMIDIJLypTdHJ1Y3R1cmUgbGV2ZWwgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0JKX1NfQ19TWU1TSVogMzEJLypNYXhpbXVtIHN5bWJvbCBsZW5ndGgJCSovCi0jZGVmaW5lIEVPQkpfU19DX1NZTVNJWiA2NAkvKk1heGltdW0gc3ltYm9sIGxlbmd0aAkJKi8KLSNkZWZpbmUgRU9CSl9TX0NfU0VDU0laIDMxCS8qTWF4aW11bSBzZWN0aW9uIG5hbWUgbGVuZ3RoCQkqLwotI2RlZmluZSBPQkpfU19DX1NUT1JFUExJTSAtMQkvKk1heGltdW0gcmVwZWF0IGNvdW50IG9uIHN0b3JlIGNvbW1hbmRzICAqLwotI2RlZmluZSBFT0JKX1NfQ19TVE9SRVBMSU0gLTEJLypNYXhpbXVtIHJlcGVhdCBjb3VudCBvbiBzdG9yZSBjb21tYW5kcyAgKi8KLSNkZWZpbmUgT0JKX1NfQ19QU0NBTElMSU0gOQkvKk1heGltdW0gcC1zZWN0IGFsaWdubWVudCAgICAgICAgICAqLwotI2RlZmluZSBFT0JKX1NfQ19QU0NBTElMSU0gMTYJLypNYXhpbXVtIHAtc2VjdCBhbGlnbm1lbnQgICAgICAgICAgKi8KLQotI2RlZmluZSBFVkFYX09GRlNFVAkyNTYJLyp0eXBlIG9mZnNldCBmb3IgRVZBWCBjb2RlcyBpbiBzd2l0Y2ggICovCi0vKiBNaXNjZWxsYW5lb3VzIGRlZmluaXRpb25zLiAgKi8KLQotI2lmIF9fR05VQ19fCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1cXVhZDsKLSNlbHNlCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgdXF1YWQ7Ci0jZW5kaWYKLQotI2RlZmluZSBNQVhfT1VUUkVDX1NJWkUgNDA5NgotI2RlZmluZSBNSU5fT1VUUkVDX0xVRlQgNjQKLQotdHlwZWRlZiBzdHJ1Y3QgX3Ztc19zZWN0aW9uIHsKLSAgdW5zaWduZWQgY2hhciAqY29udGVudHM7Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIHN0cnVjdCBfdm1zX3NlY3Rpb24gKm5leHQ7Ci19IHZtc19zZWN0aW9uOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3NhdmVfdm1zX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIGRhdGEsIGZpbGVfcHRyIG9mZnNldCwKLQkgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci1leHRlcm4gdm1zX3NlY3Rpb24gKl9iZmRfZ2V0X3Ztc19zZWN0aW9uIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IGluZGV4KSk7Ci0KLXR5cGVkZWYgc3RydWN0IF92bXNfcmVsb2MgewotICBzdHJ1Y3QgX3Ztc19yZWxvYyAqbmV4dDsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotfSB2bXNfcmVsb2M7Ci0KLS8qIHZtcyBtb2R1bGUgaGVhZGVyICAqLwotCi1zdHJ1Y3QgaGRyX3N0cnVjIHsKLSAgaW50IGhkcl9iX3N0cmx2bDsKLSAgbG9uZyBoZHJfbF9hcmNoMTsKLSAgbG9uZyBoZHJfbF9hcmNoMjsKLSAgbG9uZyBoZHJfbF9yZWNzaXo7Ci0gIGNoYXIgKmhkcl90X25hbWU7Ci0gIGNoYXIgKmhkcl90X3ZlcnNpb247Ci0gIGNoYXIgKmhkcl90X2RhdGU7Ci0gIGNoYXIgKmhkcl9jX2xubTsKLSAgY2hhciAqaGRyX2Nfc3JjOwotICBjaGFyICpoZHJfY190dGw7Ci19OwotCi0KLS8qIHZtcyBlbmQgb2YgbW9kdWxlICAqLwotCi1zdHJ1Y3QgZW9tX3N0cnVjIHsKLSAgbG9uZyBlb21fbF90b3RhbF9scHM7Ci0gIHVuc2lnbmVkIGNoYXIgZW9tX2JfY29tY29kOwotICBib29sZWFuIGVvbV9oYXNfdHJhbnNmZXI7Ci0gIHVuc2lnbmVkIGNoYXIgZW9tX2JfdGZyZmxnOwotICBsb25nIGVvbV9sX3BzaW5keDsKLSAgbG9uZyBlb21fbF90ZnJhZHI7Ci19OwotCi1lbnVtIGZpbGVfZm9ybWF0X2VudW0geyBGRl9VTktOT1dOLCBGRl9GT1JFSUdOLCBGRl9OQVRJVkUsIEZGX1ZBWCB9OwotCi10eXBlZGVmIHN0cnVjdCB2bXNfc3ltYm9sX3N0cnVjdCB7Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSBiZmRfaGFzaDsKLSAgYXN5bWJvbCAqc3ltYm9sOwotfSB2bXNfc3ltYm9sX2VudHJ5OwotCi0vKiBzdGFjayB2YWx1ZSBmb3IgcHVzaC9wb3AgY29tbWFuZHMgICovCi0KLXN0cnVjdCBzdGFja19zdHJ1Y3QgewotICB1cXVhZCB2YWx1ZTsKLSAgaW50IHBzZWN0OwotfTsKLSNkZWZpbmUgU1RBQ0tTSVpFIDgxOTIKLQotLyogbG9jYXRpb24gc3RhY2sgZGVmaW5pdGlvbnMgZm9yIENUTF9ERkxPQywgQ1RMX1NUTE9DLCBhbmQgQ1RMX1NUS0RMICAqLwotCi1zdHJ1Y3QgbG9jYXRpb25fc3RydWN0IHsKLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgaW50IHBzZWN0OwotfTsKLSNkZWZpbmUgTE9DQVRJT05fU0FWRV9TSVpFIDMyCi0KLSNkZWZpbmUgVk1TX1NFQ1RJT05fQ09VTlQgMTAyNAotCi1zdHJ1Y3Qgdm1zX3ByaXZhdGVfZGF0YV9zdHJ1Y3QgewotICBpbnQgaXNfdmF4OwotICBib29sZWFuIGZpeHVwX2RvbmU7CQkJLyogRmxhZyB0byBpbmRpY2F0ZSBpZiBhbGwKLQkJCQkJICAgc2VjdGlvbiBwb2ludGVycyBhbmQgUFJJVihzZWN0aW9ucykKLQkJCQkJICAgYXJlIHNldCB1cCBjb3JyZWN0bHkgICovCi0gIHVuc2lnbmVkIGNoYXIgKnZtc19idWY7CQkvKiBidWZmZXIgdG8gcmVjb3JkICAqLwotICBpbnQgYnVmX3NpemU7CQkJCS8qIG1heCBzaXplIG9mIGJ1ZmZlciAgKi8KLSAgdW5zaWduZWQgY2hhciAqdm1zX3JlYzsJCS8qIGFjdHVhbCByZWNvcmQgcHRyICAqLwotICBpbnQgcmVjX2xlbmd0aDsJCQkvKiByZW1haW5pbmcgcmVjb3JkIGxlbmd0aCAgKi8KLSAgaW50IHJlY19zaXplOwkJCQkvKiBhY3R1YWwgcmVjb3JkIHNpemUgICovCi0gIGludCByZWNfdHlwZTsJCQkJLyogYWN0dWFsIHJlY29yZCB0eXBlICAqLwotICBlbnVtIGZpbGVfZm9ybWF0X2VudW0gZmlsZV9mb3JtYXQ7Ci0KLSAgc3RydWN0IGhkcl9zdHJ1YyBoZHJfZGF0YTsJCS8qIGRhdGEgZnJvbSBIRFIvRU1IIHJlY29yZCAgKi8KLSAgc3RydWN0IGVvbV9zdHJ1YyBlb21fZGF0YTsJCS8qIGRhdGEgZnJvbSBFT00vRUVPTSByZWNvcmQgICovCi0gIGludCBzZWN0aW9uX2NvdW50OwkJCS8qICMgb2Ygc2VjdGlvbnMgaW4gZm9sbG93aW5nIGFycmF5ICAqLwotICBhc2VjdGlvbiAqKnNlY3Rpb25zOwkJCS8qIGFycmF5IG9mIEdTRC9FR1NEIHNlY3Rpb25zICAqLwotICBpbnQgZ3NkX3N5bV9jb3VudDsJCQkvKiAjIG9mIEdTRC9FR1NEIHN5bWJvbHMgICovCi0gIGFzeW1ib2wgKipzeW1ib2xzOwkJCS8qIHZlY3RvciBvZiBHU0QvRUdTRCBzeW1ib2xzICAqLwotICBzdHJ1Y3QgcHJvY192YWx1ZSAqcHJvY2VkdXJlOwotCi0gIHN0cnVjdCBzdGFja19zdHJ1Y3QgKnN0YWNrOwotICBpbnQgc3RhY2twdHI7Ci0KLSAgdm1zX3NlY3Rpb24gKnZtc19zZWN0aW9uX3RhYmxlW1ZNU19TRUNUSU9OX0NPVU5UXTsKLQotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnZtc19zeW1ib2xfdGFibGU7Ci0gIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKipzeW1jYWNoZTsKLSAgaW50IHN5bW51bTsKLQotICBzdHJ1Y3QgbG9jYXRpb25fc3RydWN0ICpsb2NhdGlvbl9zdGFjazsKLQotICBhc2VjdGlvbiAqaW1hZ2Vfc2VjdGlvbjsJCS8qIHNlY3Rpb24gZm9yIGltYWdlX3B0ciAgKi8KLSAgdW5zaWduZWQgY2hhciAqaW1hZ2VfcHRyOwkJLyogYSBwb2ludGVyIHRvIHNlY3Rpb24tPmNvbnRlbnRzICovCi0KLSAgdW5zaWduZWQgY2hhciBwZHNjWzhdOwkJLyogcHJvY2VkdXJlIGRlc2NyaXB0b3IgKi8KLQotICAvKiBPdXRwdXQgcm91dGluZSBzdG9yYWdlICAqLwotCi0gIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9idWY7CQkvKiBvdXRwdXQgZGF0YSAgKi8KLSAgaW50IHB1c2hfbGV2ZWw7Ci0gIGludCBwdXNoZWRfc2l6ZTsKLSAgaW50IGxlbmd0aF9wb3M7Ci0gIGludCBvdXRwdXRfc2l6ZTsKLSAgaW50IG91dHB1dF9hbGlnbm1lbnQ7Ci0KLSAgLyogbGlua2FnZSBpbmRleCBjb3VudGVyCi0gICB1c2VkIGJ5IGNvbmRpdGlvbmFsIHN0b3JlIGNvbW1hbmRzIChFVElSX1NfQ19TVENfKSAgKi8KLQotICBpbnQgdm1zX2xpbmthZ2VfaW5kZXg7Ci0KLSAgLyogc2VlIHRjLWFscGhhLmMgb2YgZ2FzIGZvciBhIGRlc2NyaXB0aW9uLiAgKi8KLSAgaW50IGZsYWdfaGFzaF9sb25nX25hbWVzOwkvKiAtKywgaGFzaCBpbnN0ZWFkIG9mIHRydW5jYXRlICovCi0gIGludCBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmM7CS8qIC1ILCBzaG93IGhhc2hpbmcvdHJ1bmNhdGlvbiAqLwotfTsKLQotI2RlZmluZSBQUklWKG5hbWUpCSgoc3RydWN0IHZtc19wcml2YXRlX2RhdGFfc3RydWN0ICopYWJmZC0+dGRhdGEuYW55KS0+bmFtZQotCi0jZGVmaW5lIFNFQ1RJT05fTkFNRV9URU1QTEFURSAiX19TRUNfXyVkIgotCi0jaWYgVk1TX0RFQlVHCi1leHRlcm4gdm9pZCBfYmZkX3Ztc19kZWJ1ZyBQQVJBTVMoKGludCBsZXZlbCwgY2hhciAqZm9ybWF0LCAuLi4pKTsKLWV4dGVybiB2b2lkIF9iZmRfaGV4ZHVtcAotICBQQVJBTVMgKChpbnQgbGV2ZWwsIHVuc2lnbmVkIGNoYXIgKnB0ciwgaW50IHNpemUsIGludCBvZmZzZXQpKTsKLQotI2RlZmluZSB2bXNfZGVidWcgX2JmZF92bXNfZGVidWcKLSNlbmRpZgotCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX3Ztc19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZSwKLQkgICBjb25zdCBjaGFyICpzdHJpbmcpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX2dldF9oZWFkZXJfdmFsdWVzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgKnR5cGUsIGludCAqbGVuZ3RoKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX2dldF9yZWNvcmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX25leHRfcmVjb3JkIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1leHRlcm4gY2hhciAqX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgUEFSQU1TICgodW5zaWduZWQgY2hhciAqc3RyLCBpbnQgc2l6ZSkpOwotZXh0ZXJuIGNoYXIgKl9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgUEFSQU1TICgodW5zaWduZWQgY2hhciAqcHRyKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19wdXNoIFBBUkFNUyAoKGJmZCAqYWJmZCwgdXF1YWQgdmFsLCBpbnQgcHNlY3QpKTsKLWV4dGVybiB1cXVhZCBfYmZkX3Ztc19wb3AgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgKnBzZWN0KSk7Ci0KLWV4dGVybiBib29sZWFuIF9iZmRfc2F2ZV92bXNfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBQVFIgZGF0YSwgZmlsZV9wdHIgb2Zmc2V0LAotCSAgIGJmZF9zaXplX3R5cGUgY291bnQpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9iZWdpbgotICBQQVJBTVMgKChiZmQgKmFiZmQsIGludCByZWN0eXBlLCBpbnQgcmVjaGVhZCkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBhbGlnbnRvKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfcHVzaCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9wb3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfZW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc19vdXRwdXRfY2hlY2sgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgc2l6ZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2J5dGUgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgdmFsdWUpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9zaG9ydCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCB2YWx1ZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2xvbmcgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBsb25nIHZhbHVlKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfcXVhZCBQQVJBTVMgKChiZmQgKmFiZmQsIHVxdWFkIHZhbHVlKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCBQQVJBTVMgKChiZmQgKmFiZmQsIGNoYXIgKnZhbHVlKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfZHVtcCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCi0JCQkJCSAgIGludCBsZW5ndGgpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9maWxsIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IHZhbHVlLCBpbnQgbGVuZ3RoKSk7Ci1leHRlcm4gY2hhciAqX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIFBBUkFNUyAoKGJmZCAqYWJmZCwgY29uc3QgY2hhciAqaW4sIGludCBtYXhsZW4pKTsKLQotZXh0ZXJuIHZtc19zeW1ib2xfZW50cnkgKl9iZmRfdm1zX2VudGVyX3N5bWJvbCBQQVJBTVMgKChiZmQgKmFiZmQsIGNoYXIgKm5hbWUpKTsKLQotI2VuZGlmIC8qIFZNU19IICovCmRpZmYgLS1naXQgYS9iZmQveGNvZmZsaW5rLmMgYi9iZmQveGNvZmZsaW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ODJkMjMuLjAwMDAwMDAKLS0tIGEvYmZkL3hjb2ZmbGluay5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYzNSArMCwwIEBACi0vKiBQT1dFUi9Qb3dlclBDIFhDT0ZGIGxpbmtlciBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPiwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0vKiBUaGlzIGZpbGUgaG9sZHMgdGhlIFhDT0ZGIGxpbmtlciBjb2RlLiAgKi8KLQotI2RlZmluZSBTVFJJTkdfU0laRV9TSVpFICg0KQotCi0vKiBJbiBvcmRlciB0byBzdXBwb3J0IGxpbmtpbmcgZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMgaW50byBhbgotICAgWENPRkYgZm9ybWF0LCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBwYXJ0aWN1bGFyCi0gICBiZmRfdGFyZ2V0IGlzIGFuIFhDT0ZGIHZlY3Rvci4gIEZJWE1FOiBXZSBuZWVkIHRvIHJldGhpbmsgdGhpcwotICAgd2hvbGUgYXBwcm9hY2guICAqLwotI2RlZmluZSBYQ09GRl9YVkVDUCh4dikgXAotICAoc3RyY21wICgoeHYpLT5uYW1lLCAiYWl4Y29mZi1yczYwMDAiKSA9PSAwIFwKLSAgIHx8IHN0cmNtcCAoKHh2KS0+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+cGF0aCA9IGltcHBhdGg7Ci0JICBuLT5maWxlID0gaW1wZmlsZTsKLQkgIG4tPm1lbWJlciA9IGltcG1lbWJlcjsKLQkgICpwcCA9IG47Ci0JfQotCi0gICAgICBoLT5sZGluZHggPSBjOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRXhwb3J0IGEgc3ltYm9sLiAgKi8KLQotYm9vbGVhbgotYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGhhcmcsIHN5c2NhbGwpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoYXJnOwotICAgICBib29sZWFuIHN5c2NhbGw7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmggPSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBoYXJnOwotCi0gIGlmICghIFhDT0ZGX1hWRUNQIChvdXRwdXRfYmZkLT54dmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBoLT5mbGFncyB8PSBYQ09GRl9FWFBPUlQ7Ci0KLSAgLyogRklYTUU6IEknbSBub3QgYXQgYWxsIHN1cmUgd2hhdCBzeXNjYWxsIGlzIHN1cHBvc2VkIHRvIG1lYW4sIHNvCi0gICAgIEknbSBqdXN0IGdvaW5nIHRvIGlnbm9yZSBpdCB1bnRpbCBzb21lYm9keSBleHBsYWlucyBpdC4gICovCi0KLSAgLyogU2VlIGlmIHRoaXMgaXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLiAgSXQgbWF5IGJlIG9uZSBldmVuIHRob3VnaAotICAgICBpdCBpcyBub3Qgc28gbWFya2VkLiAgKi8KLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpID09IDAKLSAgICAgICYmIGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gIT0gJy4nKQotICAgIHsKLSAgICAgIGNoYXIgKmZubmFtZTsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhmbjsKLQotICAgICAgZm5uYW1lID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChoLT5yb290LnJvb3Quc3RyaW5nKSArIDIpOwotICAgICAgaWYgKGZubmFtZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZubmFtZVswXSA9ICcuJzsKLSAgICAgIHN0cmNweSAoZm5uYW1lICsgMSwgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0gICAgICBoZm4gPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgICAgZm5uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgZnJlZSAoZm5uYW1lKTsKLSAgICAgIGlmIChoZm4gIT0gTlVMTAotCSAgJiYgaGZuLT5zbWNsYXMgPT0gWE1DX1BSCi0JICAmJiAoaGZuLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaGZuLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl7Ci0JICBoLT5mbGFncyB8PSBYQ09GRl9ERVNDUklQVE9SOwotCSAgaC0+ZGVzY3JpcHRvciA9IGhmbjsKLQkgIGhmbi0+ZGVzY3JpcHRvciA9IGg7Ci0JfQotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgZ2FyYmFnZSBjb2xsZWN0IHRoaXMgc3ltYm9sLiAgKi8KLSAgaWYgKCEgeGNvZmZfbWFya19zeW1ib2wgKGluZm8sIGgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24gZGVzY3JpcHRvciwgbWFrZSBzdXJlIHdlIGRvbid0IGdhcmJhZ2UKLSAgICAgY29sbGVjdCB0aGUgYXNzb2NpYXRlZCBmdW5jdGlvbiBjb2RlLiAgV2Ugbm9ybWFsbHkgZG9uJ3QgaGF2ZSB0bwotICAgICB3b3JyeSBhYm91dCB0aGlzLCBiZWNhdXNlIHRoZSBkZXNjcmlwdG9yIHdpbGwgYmUgYXR0YWNoZWQgdG8gYQotICAgICBzZWN0aW9uIHdpdGggcmVsb2NzLCBidXQgaWYgd2UgYXJlIGNyZWF0aW5nIHRoZSBkZXNjcmlwdG9yCi0gICAgIG91cnNlbHZlcyB0aG9zZSByZWxvY3Mgd2lsbCBub3QgYmUgdmlzaWJsZSB0byB0aGUgbWFyayBjb2RlLiAgKi8KLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpICE9IDApCi0gICAgewotICAgICAgaWYgKCEgeGNvZmZfbWFya19zeW1ib2wgKGluZm8sIGgtPmRlc2NyaXB0b3IpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvdW50IGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbC4gIFRoaXMgaXMgY2FsbGVkIGZvciByZWxvY3MKLSAgIGdlbmVyYXRlZCBieSB0aGUgbGlua2VyIHNjcmlwdCwgdHlwaWNhbGx5IGZvciBnbG9iYWwgY29uc3RydWN0b3JzCi0gICBhbmQgZGVzdHJ1Y3RvcnMuICAqLwotCi1ib29sZWFuCi1iZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYyAob3V0cHV0X2JmZCwgaW5mbywgbmFtZSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBpZiAoISBYQ09GRl9YVkVDUCAob3V0cHV0X2JmZC0+eHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotICAgICAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sIG5hbWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkgICAgIGZhbHNlKSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogbm8gc3VjaCBzeW1ib2wiKSwgbmFtZSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX1JFRl9SRUdVTEFSIHwgWENPRkZfTERSRUw7Ci0gICsreGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkcmVsX2NvdW50OwotICAKLSAgLyogTWFyayB0aGUgc3ltYm9sIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0gIGlmICghIHhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIHN5bWJvbCB0byB3aGljaCB0aGUgbGlua2VyIHNjcmlwdAotICAgYXNzaWducyBhIHZhbHVlLiAgKi8KLQotYm9vbGVhbgotYmZkX3hjb2ZmX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQgKG91dHB1dF9iZmQsIGluZm8sIG5hbWUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGggPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgdHJ1ZSwgdHJ1ZSwKLQkJCSAgICAgIGZhbHNlKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfREVGX1JFR1VMQVI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0aHJvdWdoCi0gICB4Y29mZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdHJ1Y3QgeGNvZmZfbG9hZGVyX2luZm8KLXsKLSAgLyogU2V0IGlmIGEgcHJvYmxlbSBvY2N1cnJlZC4gICovCi0gIGJvb2xlYW4gZmFpbGVkOwotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBMaW5rIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gICovCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAvKiBXaGV0aGVyIGFsbCBkZWZpbmVkIHN5bWJvbHMgc2hvdWxkIGJlIGV4cG9ydGVkLiAgKi8KLSAgYm9vbGVhbiBleHBvcnRfZGVmaW5lZHM7Ci0gIC8qIE51bWJlciBvZiBsZHN5bSBzdHJ1Y3R1cmVzLiAgKi8KLSAgc2l6ZV90IGxkc3ltX2NvdW50OwotICAvKiBTaXplIG9mIHN0cmluZyB0YWJsZS4gICovCi0gIHNpemVfdCBzdHJpbmdfc2l6ZTsKLSAgLyogU3RyaW5nIHRhYmxlLiAgKi8KLSAgYmZkX2J5dGUgKnN0cmluZ3M7Ci0gIC8qIEFsbG9jYXRlZCBzaXplIG9mIHN0cmluZyB0YWJsZS4gICovCi0gIHNpemVfdCBzdHJpbmdfYWxjOwotfTsKLQotLyogQnVpbGQgdGhlIC5sb2FkZXIgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBYQ09GRiBsaW5rZXIKLSAgIGVtdWxhdGlvbiBiZWZvcmVfYWxsb2NhdGlvbiByb3V0aW5lLiAgV2UgbXVzdCBzZXQgdGhlIHNpemUgb2YgdGhlCi0gICAubG9hZGVyIHNlY3Rpb24gYmVmb3JlIHRoZSBsaW5rZXIgbGF5cyBvdXQgdGhlIG91dHB1dCBmaWxlLgotICAgTElCUEFUSCBpcyB0aGUgbGlicmFyeSBwYXRoIHRvIHNlYXJjaCBmb3Igc2hhcmVkIG9iamVjdHM7IHRoaXMgaXMKLSAgIG5vcm1hbGx5IGJ1aWx0IGZyb20gdGhlIC1MIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGxpbmtlci4gIEVOVFJZCi0gICBpcyB0aGUgbmFtZSBvZiB0aGUgZW50cnkgcG9pbnQgc3ltYm9sICh0aGUgLWUgbGlua2VyIG9wdGlvbikuCi0gICBGSUxFX0FMSUdOIGlzIHRoZSBhbGlnbm1lbnQgdG8gdXNlIGZvciBzZWN0aW9ucyB3aXRoaW4gdGhlIGZpbGUKLSAgICh0aGUgLUggbGlua2VyIG9wdGlvbikuICBNQVhTVEFDSyBpcyB0aGUgbWF4aW11bSBzdGFjayBzaXplICh0aGUKLSAgIC1ibWF4c3RhY2sgbGlua2VyIG9wdGlvbikuICBNQVhEQVRBIGlzIHRoZSBtYXhpbXVtIGRhdGEgc2l6ZSAodGhlCi0gICAtYm1heGRhdGEgbGlua2VyIG9wdGlvbikuICBHQyBpcyB3aGV0aGVyIHRvIGRvIGdhcmJhZ2UgY29sbGVjdGlvbgotICAgKHRoZSAtYmdjIGxpbmtlciBvcHRpb24pLiAgTU9EVFlQRSBpcyB0aGUgbW9kdWxlIHR5cGUgKHRoZQotICAgLWJtb2R0eXBlIGxpbmtlciBvcHRpb24pLiAgVEVYVFJPIGlzIHdoZXRoZXIgdGhlIHRleHQgc2VjdGlvbiBtdXN0Ci0gICBiZSByZWFkIG9ubHkgKHRoZSAtYnRleHRybyBsaW5rZXIgb3B0aW9uKS4gIEVYUE9SVF9ERUZJTkVEUyBpcwotICAgd2hldGhlciBhbGwgZGVmaW5lZCBzeW1ib2xzIHNob3VsZCBiZSBleHBvcnRlZCAodGhlIC11bml4IGxpbmtlcgotICAgb3B0aW9uKS4gIFNQRUNJQUxfU0VDVElPTlMgaXMgc2V0IGJ5IHRoaXMgcm91dGluZSB0byBjc2VjdHMgd2l0aAotICAgbWFnaWMgbmFtZXMgbGlrZSBfZW5kLiAgKi8KLQotYm9vbGVhbgotYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbywgbGlicGF0aCwgZW50cnksCi0JCQkJIGZpbGVfYWxpZ24sIG1heHN0YWNrLCBtYXhkYXRhLCBnYywKLQkJCQkgbW9kdHlwZSwgdGV4dHJvLCBleHBvcnRfZGVmaW5lZHMsCi0JCQkJIHNwZWNpYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKmxpYnBhdGg7Ci0gICAgIGNvbnN0IGNoYXIgKmVudHJ5OwotICAgICB1bnNpZ25lZCBsb25nIGZpbGVfYWxpZ247Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWF4c3RhY2s7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWF4ZGF0YTsKLSAgICAgYm9vbGVhbiBnYzsKLSAgICAgaW50IG1vZHR5cGU7Ci0gICAgIGJvb2xlYW4gdGV4dHJvOwotICAgICBib29sZWFuIGV4cG9ydF9kZWZpbmVkczsKLSAgICAgYXNlY3Rpb24gKipzcGVjaWFsX3NlY3Rpb25zOwotewotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoZW50cnk7Ci0gIGFzZWN0aW9uICpsc2VjOwotICBzdHJ1Y3QgeGNvZmZfbG9hZGVyX2luZm8gbGRpbmZvOwotICBpbnQgaTsKLSAgc2l6ZV90IGltcHNpemUsIGltcGNvdW50OwotICBzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKmZsOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgKmxkaGRyOwotICBiZmRfc2l6ZV90eXBlIHN0b2ZmOwotICByZWdpc3RlciBjaGFyICpvdXQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZCAqc3ViOwotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpkZWJ1Z19zdHJ0YWI7Ci0gIGJmZF9ieXRlICpkZWJ1Z19jb250ZW50cyA9IE5VTEw7Ci0KLSAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0Jc3BlY2lhbF9zZWN0aW9uc1tpXSA9IE5VTEw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbGRpbmZvLmZhaWxlZCA9IGZhbHNlOwotICBsZGluZm8ub3V0cHV0X2JmZCA9IG91dHB1dF9iZmQ7Ci0gIGxkaW5mby5pbmZvID0gaW5mbzsKLSAgbGRpbmZvLmV4cG9ydF9kZWZpbmVkcyA9IGV4cG9ydF9kZWZpbmVkczsKLSAgbGRpbmZvLmxkc3ltX2NvdW50ID0gMDsKLSAgbGRpbmZvLnN0cmluZ19zaXplID0gMDsKLSAgbGRpbmZvLnN0cmluZ3MgPSBOVUxMOwotICBsZGluZm8uc3RyaW5nX2FsYyA9IDA7Ci0KLSAgeGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPm1heHN0YWNrID0gbWF4c3RhY2s7Ci0gIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5tYXhkYXRhID0gbWF4ZGF0YTsKLSAgeGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPm1vZHR5cGUgPSBtb2R0eXBlOwotCi0gIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5maWxlX2FsaWduID0gZmlsZV9hbGlnbjsKLSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnRleHRybyA9IHRleHRybzsKLQotICBoZW50cnkgPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwgZW50cnksCi0JCQkJICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgaWYgKGhlbnRyeSAhPSBOVUxMKQotICAgIGhlbnRyeS0+ZmxhZ3MgfD0gWENPRkZfRU5UUlk7Ci0KLSAgLyogR2FyYmFnZSBjb2xsZWN0IHVudXNlZCBzZWN0aW9ucy4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8ICEgZ2MKLSAgICAgIHx8IGhlbnRyeSA9PSBOVUxMCi0gICAgICB8fCAoaGVudHJ5LT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoZW50cnktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgIHsKLSAgICAgIGdjID0gZmFsc2U7Ci0gICAgICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+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+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAvKiBEb24ndCB0cnkgdG8gcHJvY2VzcyB0aGUgcmVsb2MuICBJdCBjYW4ndCBoZWxwLCBhbmQKLSAgICAgICAgICAgICAgICAgaXQgbWF5IGdlbmVyYXRlIGFub3RoZXIgZXJyb3IuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJIHRvb2sgdGhlIHJlbG9jYXRpb24gdHlwZSBkZWZpbml0aW9ucyBmcm9tIHR3byBkb2N1bWVudHM6Ci0JIHRoZSBQb3dlclBDIEFJWCBWZXJzaW9uIDQgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSwgRmlyc3QKLQkgRWRpdGlvbiAoQXByaWwgMTk5MiksIGFuZCB0aGUgUG93ZXJPcGVuIEFCSSwgQmlnLUVuZGlhbgotCSAzMi1CaXQgSGFyZHdhcmUgSW1wbGVtZW50YXRpb24gKEp1bmUgMzAsIDE5OTQpLiAgRGlmZmVyZW5jZXMKLQkgYmV0d2VlbiB0aGUgZG9jdW1lbnRzIGFyZSBub3RlZCBiZWxvdy4gICovCi0KLSAgICAgIHN3aXRjaCAocmVsLT5yX3R5cGUpCi0JewotCWNhc2UgUl9SVEI6Ci0JY2FzZSBSX1JSVEJJOgotCWNhc2UgUl9SUlRCQToKLQkgIC8qIFRoZXNlIHJlbG9jcyBhcmUgZGVmaW5lZCBieSB0aGUgUG93ZXJQQyBBQkkgdG8gYmUKLSAgICAgICAgICAgICByZWxhdGl2ZSBicmFuY2hlcyB3aGljaCB1c2UgaGFsZiBvZiB0aGUgZGlmZmVyZW5jZQotICAgICAgICAgICAgIGJldHdlZW4gdGhlIHN5bWJvbCBhbmQgdGhlIHByb2dyYW0gY291bnRlci4gIEkgY2FuJ3QKLSAgICAgICAgICAgICBxdWl0ZSBmaWd1cmUgb3V0IHdoZW4gdGhpcyBpcyB1c2VmdWwuICBUaGVzZSByZWxvY3MgYXJlCi0gICAgICAgICAgICAgbm90IGRlZmluZWQgYnkgdGhlIFBvd2VyT3BlbiBBQkkuICAqLwotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUgMHglMDJ4IiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCAodW5zaWduZWQgaW50KSByZWwtPnJfdHlwZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIFJfUE9TOgotCSAgLyogU2ltcGxlIHBvc2l0aXZlIHJlbG9jYXRpb24uICAqLwotCSAgYnJlYWs7Ci0JY2FzZSBSX05FRzoKLQkgIC8qIFNpbXBsZSBuZWdhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLQkgIHZhbCA9IC0gdmFsOwotCSAgYnJlYWs7Ci0JY2FzZSBSX1JFTDoKLQkgIC8qIFNpbXBsZSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLQkgIGhvd3RvLnBjX3JlbGF0aXZlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgUl9UT0M6Ci0JICAvKiBUT0MgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFRoZSB2YWx1ZSBpbiB0aGUgaW5zdHJ1Y3Rpb24gaW4KLSAgICAgICAgICAgICB0aGUgaW5wdXQgZmlsZSBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlIGlucHV0IGZpbGUgVE9DIHRvCi0gICAgICAgICAgICAgdGhlIGRlc2lyZWQgbG9jYXRpb24uICBXZSB3YW50IHRoZSBvZmZzZXQgZnJvbSB0aGUgZmluYWwKLSAgICAgICAgICAgICBUT0MgdG8gdGhlIGRlc2lyZWQgbG9jYXRpb24uICBXZSBoYXZlOgotCSAgICAgICAgIGlzeW0gPSBpVE9DICsgaW4KLQkJIGlpbnNuID0gaW4gKyBvCi0JCSBvc3ltID0gb1RPQyArIG9uCi0JCSBvaW5zbiA9IG9uICsgbwotCSAgICAgc28gd2UgbXVzdCBjaGFuZ2UgaW5zbiBieSBvbiAtIGluLgotCSAgICAgKi8KLQljYXNlIFJfR0w6Ci0JICAvKiBHbG9iYWwgbGlua2FnZSByZWxvY2F0aW9uLiAgVGhlIHZhbHVlIG9mIHRoaXMgcmVsb2NhdGlvbgotICAgICAgICAgICAgIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBlbnRyeSBpbiB0aGUgVE9DIHNlY3Rpb24uICAqLwotCWNhc2UgUl9UQ0w6Ci0JICAvKiBMb2NhbCBvYmplY3QgVE9DIGFkZHJlc3MuICBJIGNhbid0IGZpZ3VyZSBvdXQgdGhlCi0gICAgICAgICAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIGNhc2UgUl9HTC4gICovCi0JY2FzZSBSX1RSTDoKLQkgIC8qIFRPQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgQSBUT0MgcmVsYXRpdmUgbG9hZCBpbnN0cnVjdGlvbgotICAgICAgICAgICAgIHdoaWNoIG1heSBiZSBjaGFuZ2VkIHRvIGEgbG9hZCBhZGRyZXNzIGluc3RydWN0aW9uLgotICAgICAgICAgICAgIEZJWE1FOiBXZSBkb24ndCBjdXJyZW50bHkgaW1wbGVtZW50IHRoaXMgb3B0aW1pemF0aW9uLiAgKi8KLQljYXNlIFJfVFJMQToKLQkgIC8qIFRPQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIFRPQyByZWxhdGl2ZSBsb2FkCi0gICAgICAgICAgICAgYWRkcmVzcyBpbnN0cnVjdGlvbiB3aGljaCBtYXkgYmUgY2hhbmdlZCB0byBhIGxvYWQKLSAgICAgICAgICAgICBpbnN0cnVjdGlvbi4gIEZJWE1FOiBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyB0aGUgY29ycmVjdAotICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uLiAgKi8KLQkgIGlmIChoICE9IE5VTEwgJiYgaC0+c21jbGFzICE9IFhNQ19URCkKLQkgICAgewotCSAgICAgIGlmIChoLT50b2Nfc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6IFRPQyByZWxvYyBhdCAweCV4IHRvIHN5bWJvbCBgJXMnIHdpdGggbm8gVE9DIGVudHJ5IiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgcmVsLT5yX3ZhZGRyLAotCQkgICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgQkZEX0FTU0VSVCAoKGgtPmZsYWdzICYgWENPRkZfU0VUX1RPQykgPT0gMCk7Ci0JICAgICAgdmFsID0gKGgtPnRvY19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBoLT50b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQotCSAgdmFsID0gKCh2YWwgLSB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+dG9jKQotCQkgLSAoc3ltLT5uX3ZhbHVlIC0geGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+dG9jKSk7Ci0JICBhZGRlbmQgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSBSX0JBOgotCSAgLyogQWJzb2x1dGUgYnJhbmNoLiAgV2UgZG9uJ3Qgd2FudCB0byBtZXNzIHdpdGggdGhlIGxvd2VyCi0gICAgICAgICAgICAgdHdvIGJpdHMgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLQljYXNlIFJfQ0FJOgotCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhbiBhYnNvbHV0ZSBjYWxsIHdoaWNoCi0gICAgICAgICAgICAgbWF5IGJlIG1vZGlmaWVkIHRvIGJlY29tZSBhIHJlbGF0aXZlIGNhbGwuICBUaGUgUG93ZXJPcGVuCi0gICAgICAgICAgICAgQUJJIGRvZXMgbm90IGRlZmluZSB0aGlzIHJlbG9jYXRpb24gdHlwZS4gICovCi0JY2FzZSBSX1JCQToKLQkgIC8qIEFic29sdXRlIGJyYW5jaCB3aGljaCBtYXkgYmUgbW9kaWZpZWQgdG8gYmVjb21lIGEKLSAgICAgICAgICAgICByZWxhdGl2ZSBicmFuY2guICAqLwotCWNhc2UgUl9SQkFDOgotCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhbiBhYnNvbHV0ZSBicmFuY2ggdG8gYQotICAgICAgICAgICAgIGZpeGVkIGFkZHJlc3Mgd2hpY2ggbWF5IGJlIG1vZGlmaWVkIHRvIGFuIGFic29sdXRlIGJyYW5jaAotICAgICAgICAgICAgIHRvIGEgc3ltYm9sLiAgVGhlIFBvd2VyT3BlbiBBQkkgZG9lcyBub3QgZGVmaW5lIHRoaXMKLSAgICAgICAgICAgICByZWxvY2F0aW9uIHR5cGUuICAqLwotCWNhc2UgUl9SQlJDOgotCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhbiBhYnNvbHV0ZSBicmFuY2ggdG8gYQotICAgICAgICAgICAgIGZpeGVkIGFkZHJlc3Mgd2hpY2ggbWF5IGJlIG1vZGlmaWVkIHRvIGEgcmVsYXRpdmUgYnJhbmNoLgotICAgICAgICAgICAgIFRoZSBQb3dlck9wZW4gQUJJIGRvZXMgbm90IGRlZmluZSB0aGlzIHJlbG9jYXRpb24gdHlwZS4gICovCi0JICBob3d0by5zcmNfbWFzayAmPSB+MzsKLQkgIGhvd3RvLmRzdF9tYXNrID0gaG93dG8uc3JjX21hc2s7Ci0JICBicmVhazsKLQljYXNlIFJfQlI6Ci0JICAvKiBSZWxhdGl2ZSBicmFuY2guICBXZSBkb24ndCB3YW50IHRvIG1lc3Mgd2l0aCB0aGUgbG93ZXIKLSAgICAgICAgICAgICB0d28gYml0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCWNhc2UgUl9DUkVMOgotCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhIHJlbGF0aXZlIGNhbGwgd2hpY2ggbWF5Ci0gICAgICAgICAgICAgYmUgbW9kaWZpZWQgdG8gYmVjb21lIGFuIGFic29sdXRlIGNhbGwuICBUaGUgUG93ZXJPcGVuCi0gICAgICAgICAgICAgQUJJIGRvZXMgbm90IGRlZmluZSB0aGlzIHJlbG9jYXRpb24gdHlwZS4gICovCi0JY2FzZSBSX1JCUjoKLQkgIC8qIEEgcmVsYXRpdmUgYnJhbmNoIHdoaWNoIG1heSBiZSBtb2RpZmllZCB0byBiZWNvbWUgYW4KLSAgICAgICAgICAgICBhYnNvbHV0ZSBicmFuY2guICBGSVhNRTogV2UgZG9uJ3QgaW1wbGVtZW50IHRoaXMsCi0gICAgICAgICAgICAgYWx0aG91Z2ggd2Ugc2hvdWxkIGZvciBzeW1ib2xzIG9mIHN0b3JhZ2UgbWFwcGluZyBjbGFzcwotICAgICAgICAgICAgIFhNQ19YTy4gICovCi0JICBob3d0by5wY19yZWxhdGl2ZSA9IHRydWU7Ci0JICBob3d0by5zcmNfbWFzayAmPSB+MzsKLQkgIGhvd3RvLmRzdF9tYXNrID0gaG93dG8uc3JjX21hc2s7Ci0JICBicmVhazsKLQljYXNlIFJfUkw6Ci0JICAvKiBUaGUgUG93ZXJQQyBBSVggQUJJIGRlc2NyaWJlcyB0aGlzIGFzIGEgbG9hZCB3aGljaCBtYXkgYmUKLSAgICAgICAgICAgICBjaGFuZ2VkIHRvIGEgbG9hZCBhZGRyZXNzLiAgVGhlIFBvd2VyT3BlbiBBQkkgc2F5cyB0aGlzCi0gICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgY2FzZSBSX1BPUy4gICovCi0JICBicmVhazsKLQljYXNlIFJfUkxBOgotCSAgLyogVGhlIFBvd2VyUEMgQUlYIEFCSSBkZXNjcmliZXMgdGhpcyBhcyBhIGxvYWQgYWRkcmVzcwotICAgICAgICAgICAgIHdoaWNoIG1heSBiZSBjaGFuZ2VkIHRvIGEgbG9hZC4gIFRoZSBQb3dlck9wZW4gQUJJIHNheXMKLSAgICAgICAgICAgICB0aGlzIGlzIHRoZSBzYW1lIGFzIFJfUE9TLiAgKi8KLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogSWYgd2Ugc2VlIGFuIFJfQlIgb3IgUl9SQlIgcmVsb2Mgd2hpY2ggaXMganVtcGluZyB0byBnbG9iYWwKLSAgICAgICAgIGxpbmthZ2UgY29kZSwgYW5kIGl0IGlzIGZvbGxvd2VkIGJ5IGFuIGFwcHJvcHJpYXRlIGNyb3Igbm9wCi0gICAgICAgICBpbnN0cnVjdGlvbiwgd2UgcmVwbGFjZSB0aGUgY3JvciB3aXRoIGx3eiByMiwyMChyMSkuICBUaGlzCi0gICAgICAgICByZXN0b3JlcyB0aGUgVE9DIGFmdGVyIHRoZSBnbGluayBjb2RlLiAgQ29udHJhcml3aXNlLCBpZiB0aGUKLSAgICAgICAgIGNhbGwgaXMgZm9sbG93ZWQgYnkgYSBsd3ogcjIsMjAocjEpLCBidXQgdGhlIGNhbGwgaXMgbm90Ci0gICAgICAgICBnb2luZyB0byBnbG9iYWwgbGlua2FnZSBjb2RlLCB3ZSBjYW4gcmVwbGFjZSB0aGUgbG9hZCB3aXRoIGEKLSAgICAgICAgIGNyb3IuICAqLwotICAgICAgaWYgKChyZWwtPnJfdHlwZSA9PSBSX0JSIHx8IHJlbC0+cl90eXBlID09IFJfUkJSKQotCSAgJiYgaCAhPSBOVUxMCi0JICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hICsgOAotCSAgICAgIDw9IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkpCi0JewotCSAgYmZkX2J5dGUgKnBuZXh0OwotCSAgdW5zaWduZWQgbG9uZyBuZXh0OwotCi0JICBwbmV4dCA9IGNvbnRlbnRzICsgKHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkgKyA0OwotCSAgbmV4dCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgcG5leHQpOwotCi0JICAvKiBUaGUgX3B0cmdsIGZ1bmN0aW9uIGlzIG1hZ2ljLiAgSXQgaXMgdXNlZCBieSB0aGUgQUlYCi0gICAgICAgICAgICAgY29tcGlsZXIgdG8gY2FsbCBhIGZ1bmN0aW9uIHRocm91Z2ggYSBwb2ludGVyLiAgKi8KLQkgIGlmIChoLT5zbWNsYXMgPT0gWE1DX0dMCi0JICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiLl9wdHJnbCIpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAobmV4dCA9PSAweDRkZWY3YjgyCQkvKiBjcm9yIDE1LDE1LDE1ICovCi0JCSAgfHwgbmV4dCA9PSAweDRmZmZmYjgyKQkvKiBjcm9yIDMxLDMxLDMxICovCi0JCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgMHg4MDQxMDAxNCwgcG5leHQpOyAvKiBsd3ogcjEsMjAocjEpICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChuZXh0ID09IDB4ODA0MTAwMTQpCQkvKiBsd3ogcjEsMjAocjEpICovCi0JCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgMHg0ZmZmZmI4MiwgcG5leHQpOyAvKiBjcm9yIDMxLDMxLDMxICovCi0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEEgUEMgcmVsYXRpdmUgcmVsb2MgaW5jbHVkZXMgdGhlIHNlY3Rpb24gYWRkcmVzcy4gICovCi0gICAgICBpZiAoaG93dG8ucGNfcmVsYXRpdmUpCi0JYWRkZW5kICs9IGlucHV0X3NlY3Rpb24tPnZtYTsKLQotICAgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKCZob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywKLQkJCQkJcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAotCQkJCQl2YWwsIGFkZGVuZCk7Ci0KLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCSAgICBjaGFyIGhvd3RvX25hbWVbMTBdOwotCi0JICAgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBzeW0sIGJ1Zik7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgc3ByaW50ZiAoaG93dG9fbmFtZSwgIjB4JTAyeCIsIHJlbC0+cl90eXBlKTsKLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG9fbmFtZSwgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvQ2hhbmdlTG9nIGIvYmludXRpbHMvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjExMjFjLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDY1MDAgKzAsMCBAQAotMTk5OS0wNS0xNyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHdpbmRyZXMuYzogYWRkIHZlcmJvc2Ugb3B0aW9uCi0JKG1haW4pOiBwcm9jZXNzIHZlcmJvc2Ugb3B0aW9uCi0JKiByZXNyYy5jIChsb29rX2Zvcl9kZWZhdWx0KTogbmV3LiAgTG9vayBmb3IgdGhlIGRlZmF1bHQKLQlwcmVwcm9jZXNzb3IgaW4gYSBnaXZlbiBsb2NhdGlvbi4KLQkocmVhZF9yY19maWxlKTogZm9yIGZvby9iYXItd2luZHJlcywgbG9vayBmb3IgZm9vL2Jhci1nY2MsCi0JZm9vL2djYyAoaW4gY2FzZSBvZiBmb28vd2luZHJlcyksIGFuZCB0aGVuIGdjYyAodGhlIG9sZCBkZWZhdWx0KS4KLQotMTk5OS0wNS0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChkZWR1Y2VfbmFtZSk6IE5ldyBmdW5jdGlvbjogRGVkdWNlIG5hbWUgb2YgcHJvZ3JhbSB0bwotCXJ1bi4KLQkobWNvcmVfZWxmX291dF9maWxlKTogTmV3IHZhcmlhYmxlOiBOYW1lIG9mIG1jb3JlLWVsZiBvdXRwdXQgZmlsZS4KLQkobWNvcmVfZWxmX2xpbmtlcik6IE5ldyB2YXJpYWJsZTogTmFtZSBvZiBsaW5rZXIgdG8gdXNlLgotCShtY29yZV9lbGZfbGlua2VyX2ZsYWdzKTogTmV3IHZhcmlhYmxlOiBMaW5rZXIgZmxhZ3MgdG8gcGFzcy4KLQkoc2Nhbl9vYmpfZmlsZSk6IENhY2hlIGZpbGVuYW1lcyBpZiBuZWNlc3NhcnkuCi0JKHVzYWdlKTogRG9jdW1lbnQgbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zLgotCShtYWluKTogU3VwcG9ydCBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnM6IC1NIChnZW5lcmF0ZSBhbgotCW1jb3JlLWVsZiBvdXRwdXQgZmlsZSkgLUwgKG5hbWUgb2YgbGlua2VyIHRvIHVzZSkgLUYgKGZsYWdzIHRvCi0JcGFzcyB0byBsaW5rZXIpLiAKLQkobWNvcmVfZWxmX2NhY2hlX2ZpbGVuYW1lKTogU3RvcmUgYSBmaWxlbmFtZSBpbiBhIGNhY2hlLgotCShtY29yZV9lbGZfZ2VuX291dF9maWxlKTogTmV3IGZ1bmN0aW9uOiBHZW5lcmF0ZSBhbiBvdXRwdXQgZmlsZQotCXBlciB0aGUgbWNvcmUtZWxmIHNwZWMuCi0KLTE5OTktMDUtMTUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQlVJTERfTUlTQyk6IEJ1aWxkIGRsbHRvb2wgZm9yIG1jb3JlCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBkbGx0b29sLmM6IFVwZGF0ZSBleGFtcGxlIGluIGNvbW1lbnQuCi0JKERMTFRPT0xfTUNPUkUpOiBEZWZpbmUuCi0JKERMTFRPT0xfTUNPUkVfRUxGKTogRGVmaW5lLgotCShEUkVDVFZFX1NFQ1RJT05fTkFNRSk6IERlZmluZS4KLQkobWNvcmVfYmVfanRhYiwgbWNvcmVfbGVfanRhYik6IEJpbmFyeSBmb3IgcGVyZm9ybWluZyBhbiBtY29yZQotCWp1bXAgdG8gYWRkcmVzcy4KLQkobXRhYmxlKTogQWRkIGVudHJpZXMgZm9yIG1jb3JlIHZhcmlhbnRzLgotCShydmFhZnRlciwgcnZhYmVmb3JlLCBhc21fcHJlZml4KTogQWRkIG1jb3JlIHN1cHBwb3J0LgotCShzY2FuX2RyZWN0dmVfc3ltYm9scyk6IFVzZSBEUkVDVFZFX1NFQ1RJT05fTkFNRS4KLQkobWFrZV9oZWFkLCBtYWtlX3RhaWwpOiBDb3BlIGlmIGZpbGUgY2Fubm90IGJlIGNyZWF0ZWQuCi0JKHVzYWdlKTogSW1wcm92ZSBsYXlvdXQuCi0JCi0xOTk5LTA1LTEzICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogcmNsZXgubDogYWRkIGNvZGUgdG8gc3VwcHJlc3MgY2VydGFpbiBvdXRwdXQgZnJvbSBjcHAsIHJlcGxhY2UKLQlhbGwgcmV0dXJucyB3aXRoIE1BWUJFX1JFVFVSTgotCShNQVlCRV9SRVRVUk4pOiBuZXcsIGltcGxlbWVudCB0aGUgc3VwcHJlc3Npb24gYnkgcmV0dXJuaW5nCi0JSUdOT1JFRF9UT0tFTiBhcyBuZWVkZWQuCi0JKGNwcF9saW5lKTogcmVtZW1iZXIgd2hpY2ggZmlsZSB3ZSdyZSBpbiwgbWFyayBkYXRhIGZyb20gaW5jbHVkZWQKLQkqLmggZmlsZXMgZm9yIHN1cHByZXNzaW9uLgotCSogcmNwYXJzZS55IChpbnB1dCk6IGFsbG93IElHTk9SRURfVE9LRU4gb3V0c2lkZSBvZiBrbm93biBjb25zdHJ1Y3RzCi0KLTE5OTktMDUtMTAgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiB3aW5kcmVzLmMgKHF1b3QpOiBRdW90ZSBzaGVsbCBtZXRhY2hhcmFjdGVycyBpbiBhIHN0cmluZwotCShtYWluKTogcXVvdGUgcGFyYW1ldGVycyB0byBjcHAgdGhhdCBtaWdodCBoYXZlIG1ldGFjaGFyYWN0ZXJzIGluCi0JdGhlbS4gIEFsbG93IC1EIGFzIGFuIGFsaWFzIGZvciAtLWRlZmluZSB0byBhbGxvdyBmb3Igc2hhcmluZyBtYWtlCi0JbWFjcm9zIHdpdGggZ2NjLgotCi0JKiBvYmpkdW1wLmMgKGR1bXBfcmVsb2Nfc2V0KTogZG9uJ3QgY29yZSBpZiBob3d0by0+bmFtZSBpcyBOVUxMCi0KLQkqIE1ha2VmaWxlLmFtOiBHaXZlIHJlc2NvZmYuYyBhIGNwdS1zcGVjaWZpYyAtRCBzbyBpdCBjYW4gc2V0Ci0JdGhlIGNvcnJlY3QgQkZELgotCSogTWFrZWZpbGUuaW46IGRpdHRvCi0JKiByZXNjb2ZmLmMgKHdyaXRlX2NvZmZfZmlsZSk6IFNldCB0aGUgY29ycmVjdCBCRkQKLQotMTk5OS0wNS0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHJlbmFtZS5jIChzbWFydF9yZW5hbWUpOiBGaXggdGVzdCBvZiB3aGV0aGVyIGZpbGUgZXhpc3RzLgotCi0xOTk5LTA1LTA2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBTZXQgZGlzcGxheV9lbmRpYW4gYmFzZWQgb24gdGFyZ2V0Ci0JZW5kaWFuaXNtLgotCi0xOTk5LTA1LTA1ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChpbnRlcndvcmspOiBSZW1vdmUuCi0JKGFybV9pbnRlcndvcmtfanRhYik6IFVzZSBieCBpbnNuLgotCSh0aHVtYl9qdGFiKTogTGlrZXdpc2UuCi0JKE1BUk1fSU5URVJXT1JLKTogTmV3IG1hY2hpbmUgdHlwZS4KLQkocnZhYWZ0ZXIpOiBIYW5kbGUgaXQuCi0JKHJ2YWJlZm9yZSkgTGlrZXdpc2UuCi0JKGFzbV9wcmVmaXgpOiBMaWtld2lzZS4KLQkoZ2VuX2V4cF90eXBlKTogQ2hlY2sgbWFjaGluZSB0eXBlIGluc3RlYWQgb2YKLQlpbnRlcndvcmsgZmxhZy4KLQkobWFrZV9vbmVfbGliX2ZpbGUpOiBMaWtld2lzZS4KLQkobWFrZV9oZWFkKTogTGlrZXdpc2UuCi0JKG1ha2VfdGFpbCk6IExpa2V3aXNlLgotCSh1c2FnZSk6IFVwZGF0ZSBtYWNoaW5lIHR5cGVzLgotCShtYWluKTogUmVtb3ZlIC1pbnRlcndvcmsgc3VwcG9ydC4KLQotMTk5OS0wNS0wNSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0gCi0gICAgICAgICogcmVhZGVsZi5jIChnZXRfbWFjaGluZV9mbGFncyk6ICBDaGVjayBmb3IgRUZfQ1BVMzIuCi0gICAgICAgIChnZXRfZGF0YV9lbmNvZGluZyk6IEZpeCB0eXBvLgotIAotMTk5OS0wNC0yNiAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFVwZGF0ZWQgZm9yIG5ldyB2ZXJzaW9uIG9mIGxpYnRvb2wuCi0KLTE5OTktMDQtMTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX3JhbmdlX3R5cGUpOiBDb3JyZWN0IHBhcmVudGhlc2l6YXRpb24gaW4KLQlCRkQ2NCBjYXNlLgotCi0JKiByZWFkZWxmLmMgKGdldF9zZWN0aW9uX3R5cGVfbmFtZSk6IFVzZSBjb3JyZWN0IHR5cGVzIGluIHByaW50ZgotCWZvcm1hdHMuCi0JKHByb2Nlc3NfcmVsb2NzKTogTGlrZXdpc2UuCi0JKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogTGlrZXdpc2UuCi0JKHByb2Nlc3Nfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UuCi0JKHByb2Nlc3NfbWlwc19zcGVjaWZpYyk6IExpa2V3aXNlLgotCi1UdWUgQXByIDEzIDIxOjIyOjAwIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG1ha2Vfb25lX2xpYl9maWxlKTogTWFyayB0aHVtYiBmdW5jdGlvbnMgYXMKLQlDX1RIVU1CRVhURlVOQy4KLQotMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYnVjb21tLmggKGVudmlyb24pOiBEZWNsYXJlIGl0LCBpZiBuZWVkZWQuCi0JKGFsbG9jYSkgW0NfQUxMT0NBXTogRG9uJ3QgdXNlIGdjYydzIGJ1aWx0aW4gb3IgPGFsbG9jYS5oPi4KLQkqIGNvbmZpZ3VyZS5pbiAoZW52aXJvbik6IERldGVjdCBkZWNsYXJhdGlvbi4KLQkqIG5tLmMgKG1haW4pOiBEb24ndCBkZWNsYXJlIGVudmlyb24uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotCSogZGxsdG9vbC5jIChnZW5fZXhwX2ZpbGUpOiBQYWQgb3V0IHRoZSAucmVsb2Mgc2VjdGlvbiB0byBhCi0JMzItYnl0ZSBib3VuZGFyeSB3aXRoIGR1bW15IHJlbG9jYXRpb25zLCB0byBtYWtlIHRoZSBCZU9TIGxvYWRlcgotCWhhcHB5LiAgUGF0Y2ggZnJvbSBCb2IgTWFuc29uIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPi4KLQotMTk5OS0wNC0wOCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy50ZXhpIChjKytmaWx0KTogVXBkYXRlZCBmb3IgLWovLS1qYXZhLCBhbmQgaHAvZWRnCi0JZm9ybWF0cy4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBBZGQgYWJpbGl0eSB0byBkZWNvZGUgbmV3IGNvbnN0YW50cyBmb3VuZCBpbiBBcHJpbCAyNQotCTE5OTggRHJhZnQgb2YgU3lzdGVtIFYgQUJJIHNwZWMuCi0KLTE5OTktMDQtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBidWNvbW0uaCAoTENfTUVTU0FHRVMpOiBOZXZlciBkZWZpbmUuCi0JKiBhZGRyMmxpbmUuYyAobWFpbik6IERvbid0IHBhc3MgTENfTUVTU0FHRVMgdG8gc2V0bG9jYWxlIGlmIHRoZQotCXN5c3RlbSBkb2VzIG5vdCBkZWZpbmUgaXQuCi0JKiBhci5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBjb2ZmZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBkbGx0b29sLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG5sbWNvbnYuYyAobWFpbik6IExpa2V3aXNlLgotCSogbm0uYyAobWFpbik6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHNpemUuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3Jjb252LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHN0cmluZ3MuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3lzZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiB3aW5kcmVzLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHJlYWRlbGYuYyAobWFpbik6IENhbGwgbG9jYWxlIHNldHRpbmcgZnVuY3Rpb25zLgotCi0xOTk5LTA0LTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKGRlY29kZV9sb2NhdGlvbl9leHByZXNzaW9uKTogRml4IERXX09QX2NvbnN0OHtzfHV9Ci0JZGVjb2Rlcy4gCi0KLTE5OTktMDQtMDQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiByZW5hbWUuYzogTmV3IGZpbGUsIGNvcGllZCBvdXQgb2Ygb2JqY29weS5jIHdpdGggYSBmZXcgY2hhbmdlcy4KLQkqIGJ1Y29tbS5oIChzZXRfdGltZXMsIHNtYXJ0X3JlbmFtZSk6IERlY2xhcmUuCi0JKiBhci5jOiBEb24ndCBpbmNsdWRlIDx1dGltZS5oPi4KLQkoZXh0cmFjdF9maWxlKTogQ2FsbCBzZXRfdGltZXMgcmF0aGVyIHRoYW4gdXRpbWUuCi0JKHdyaXRlX2FyY2hpdmUpOiBDYWxsIHNtYXJ0X3JlbmFtZSByYXRoZXIgdGhhbiB1bmxpbmsgYW5kIHJlbmFtZS4KLQkqIG9iamNvcHkuYzogRG9uJ3QgaW5jbHVkZSA8dXRpbWUuaD4uCi0JKHNpbXBsZV9jb3B5LCBzbWFydF9yZW5hbWUsIHNldF90aW1lcyk6IE1vdmUgdG8gcmVuYW1lLmMuCi0JKHN0cmlwX21haW4pOiBVcGRhdGUgc21hcnRfcmVuYW1lIGNhbGwgZm9yIG5ldyBwYXJhbWV0ZXIuCi0JKGNvcHlfbWFpbik6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDRklMRVMpOiBBZGQgcmVuYW1lLmMuCi0JKG9iamNvcHlfU09VUkNFUywgc3RyaXBfbmV3X1NPVVJDRVMpOiBBZGQgcmVuYW1lLmMuCi0JKGFyX1NPVVJDRVMsIHJhbmxpYl9TT1VSQ0VTKTogQWRkIHJlbmFtZS5jLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoRVhUUkFfUFJPR1JBTVMpOiBSZW1vdmUgYmFja3NsYXNoIHdoaWNoIHRyb3VibGVzIGN1cnJlbnQgdmVyc2lvbgotCW9mIGF1dG9tYWtlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGRsbHdyYXAuYyAobWFpbik6IEV4cGVjdCBjb3JyZWN0IHR5cGUgaW4gZm9ybWF0IHN0cmluZy4KLQkqIHJlc3Jlcy5jOiBJbmNsdWRlICJiZmQuaCIsICJidWNvbW0uaCIsICJsaWJpYmVydHkuaCIsIGFuZAotCTx0aW1lLmg+LiAgRG9uJ3QgaW5jbHVkZSA8c3RkaW8uaD4gYW5kIDxlcnJuby5oPi4KLQkod3JpdGVfcmVzX2ZpbGUpOiBSZW1vdmUgdW51c2VkIGxvY2FscyBlIGFuZCBpLgotCShyZWFkX3Jlc291cmNlX2VudHJ5KTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgcnR5cGUgYW5kIG4uCi0JKHJlYWRfdW5pc3RyaW5nKTogUmVtb3ZlIHVudXNlZCBsb2NhbCBuLgotCi0xOTk5LTA0LTAzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogYXJwYXJzZS55OiBEZWNsYXJlIHl5bGV4LgotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IEluaXRpYWxpemUgYnl0ZXMuICBBZGQgY29tbWVudAotCWZvciBpbmNvcnJlY3QgdXNlIG9mIGJ5dGVzLgotCSogcmVhZGVsZi5jOiBDaGFuZ2UgbWFueSBmb3JtYXRzIHRvIGF2b2lkIHdhcm5pbmdzLgotCi0xOTk5LTA0LTAxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHJlc2V0X3N0YXRlX21hY2hpbmUpOiBOZXcgZnVuY3Rpb24uICBSZXNldHMgdGhlCi0JcmVnaXN0ZXJzIG9mIHRoZSBzb3VyY2UgbGluZSBudW1iZXIgc3RhdGUgbWFjaGluZS4KLQkocHJvY2Vzc19leHRlbmRlZF9saW5lX29wKTogVXNlIHN0YXRlIG1hY2hpbmUuCi0JKGRpc3BsYXlfZGVidWdfbGluZXMpOiBVc2Ugc3RhdGUgbWFjaGluZS4gIEhhbmRsZSBtdWx0aXBsZSBsaW5lCi0JbnVtYmVyIGJsb2NrcyB3aXRoaW4gdGhlIHNhbWUgc2VjdGlvbi4KLQotMTk5OS0wMy0yOSAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfZXh0ZW5kZWRfbGluZV9vcCk6IGVuZF9zZXF1ZW5jZSBhbHNvIHJlc2V0cwotCXRoZSBsaW5lIG51bWJlci4KLQkoZGlzcGxheV9kZWJ1Z19saW5lcyk6IGFkdmFuY2VfbGluZSB0YWtlcyBhIHNpZ25lZCBvcGVyYW5kLgotCShyZWFkX2FuZF9kaXNwbGF5X2F0dHIpOiBQcmludCByZWZzIGFzIDwleD4sIGFkZHJlc3NlcyBhcyAlI3gsCi0Jb3RoZXJzIGFzICVkLiAgSGFuZGxlIG90aGVyIGxvY2F0aW9uIGV4cHJlc3Npb24gYXR0cmlidXRlcy4KLQkoZGlzcGxheV9kZWJ1Z19pbmZvKTogSGFuZGxlIG5lc3RpbmcuICBBbHdheXMgcHJpbnQgdGhlCW9mZnNldC4KLQotMTk5OS0wMy0yMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIG9iamNvcHkuYyAoZmlsdGVyX3N5bWJvbHMpOiBXaGVuIGNoZWNraW5nIHdoZXRoZXIgdG8ga2VlcCBhCi0Jc3ltYm9sLCBjaGVjayB0aGUgQkZEIHNlY3Rpb24gc3ltYm9sIGZvciBhIHN5bWJvbCB3aXRoCi0JQlNGX1NFQ1RJT05fU1lNIHNldC4KLQotMTk5OS0wMy0xMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19keW5hbWljX3NlZ21lbnQpOiBQcmludCBuZXcgU29sYXJpcyBkeW5hbWljCi0Jc2VjdGlvbiBlbnRyaWVzLiAgQ29ycmVjdCBwcmludGluZyBvZiBEVF9QT1NGTEFHXzEgYW5kIERUX0ZMQUdTXzEuCi0KLTE5OTktMDMtMTAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocmVxdWVzdF9kdW1wKTogTmV3IGZ1bmN0aW9uLgotCVJlbW92ZWQgYXJiaXRhcnkgbGltaXQgb24gdGhlIG51bWJlciBvZiBzZWN0aW9ucyB0aGF0IGNhbiBiZQotCWR1bXBlZC4KLQotV2VkIE1hciAxMCAxNToxMDoxNCAxOTk5ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtYWtlX29uZV9saWJfZmlsZSk6IFVzZSAlMDVkIHRvIG91dHB1dCB0aGUgc3R1YiBuYW1lIHNvCi0Jb3JkZXIgaW4gdGhlIGltcG9ydCBsaWJyYXJ5IGlzIHByZXNlcnZlZC4KLQotMTk5OS0wMi0xOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBGaXggY29tcGlsZSB0aW1lIHdhcmluZ3MuCi0KLTE5OTktMDItMTcgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0gICAgICAgICogcmVzYmluLmMgKHJlc190b19iaW5fdmVyc2lvbmluZm8pOiBJbnN0ZWFkIG9mIGVudGVyaW5nIGEgdmFsdWUKLQlsZW5ndGggb2YgemVybyBpbiBhIHZlcnNpb24gaW5mbyBzdHJpbmcsIGVudGVyIHRoZSBhcHByb3ByaWF0ZQotCWxlbmd0aC4KLQotVHVlIEZlYiAxNiAxNjowMDozMyAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVxdWlyZSBhdXRvY29uZiAyLjEzLiAgQ2hhbmdlIEFNX1BST0dfSU5TVEFMTCB0bwotCUFDX1BST0dfSU5TVEFMTC4gIEFkZCBjb21tZW50cyBmb3IgQUNfREVGSU5FIGNhbGxzLgotCSogYWNjb25maWcuaDogUmVtb3ZlLgotCSogYWNsb2NhbC5tNDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogY29uZmlnLmluOiBSZWJ1aWxkLgotCi0xOTk5LTAyLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHJlYWRfYW5kX2Rpc3BsYXlfYXR0cik6IEFkZCBkaXNwbGF5IG9mIGJhc2ljIHR5cGUKLQllbmNvZGluZ3MuCi0JKGRpc3BsYXlfZGVidWdfYXJhbmdlcyk6IE5ldyBmdW5jdGlvbjogRGlzcGxheSB0aGUgY29udGVudHMgb2YgYQotCS5kZWJ1Z19hcmFuZ2VzIHNlY3Rpb24uCi0JKGRpc3BsYXlfZGVidWdfaW5mbyk6IER1bXAgdGFncyBmb3VuZCBhZnRlciBjb21wdW5pdCBlbnRyeS4KLQotCSogYmludXRpbHMudGV4aTogRml4ZWQgYnVnIGluIHJlYWRlbGYgZG9jdW1lbnRhdGlvbi4KLQotTW9uIEZlYiAgMSAxMjozODowMSAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6ICBIYW5kbGUgRU1fQVJNIGFzIFJFTC4KLQotMTk5OS0wMS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX3N5bWJvbF90YWJsZSk6IERvIG5vdCBwcm9kdWNlIGEgaGlzdG9ncmFtIG9mCi0JYnVja2V0IGNoYWlucyBpZiBub25lIHdlcmUgZm91bmQuCi0KLTE5OTktMDEtMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHZlcnNpb24uYzogQWRkIDE5OTkgY29weXJpZ2h0LgotCi0JKiBiaW51dGlscy50ZXhpIChyZWFkZWxmKTogRG9jdW1lbnQgbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zCi0JLS1kZWJ1Zy1kdW1wIGFuZCAtLWhpc3RvZ3JhbS4KLQotCSogcmVhZGVsZi5jOiBBZGQgYWJpbGl0eSB0byBkaXNwbGF5IGNvbnRlbnRzIG9mIHNvbWUgb3IgYWxsIG9mIHRoZQotCUR3YXJmMiBkZWJ1ZyBzZWN0aW9ucy4gIHtXb3JrIG9ubHkgcGFydGlhbGx5IGNvbXBsZXRlZH0uCi0JKGRpc3BsYXlfZGVidWdfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkoZGlzcGxheV9kZWJ1Z19pbmZvKTogTmV3IGZ1bmN0aW9uLgotCShkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQpOiBOZXcgZnVuY3Rpb24uCi0JKGRpc3BsYXlfZGVidWdfbGluZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGlzcGxheV9kZWJ1Z19hYmJyZXYpOiBOZXcgZnVuY3Rpb24uCi0JKHByb2Nlc3NfYWJicmV2X3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKHJlYWRfbGViMTI4KTogTmV3IGZ1bmN0aW9uLgotCShwcm9jZXNzX2V4dGVuZGVkX2xpbmVfb3ApOiBOZXcgZnVuY3Rpb24uCi0JKGdldF9UQUdfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoZ2V0X0FUX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGdldF9GT1JNX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGZyZWVfYWJicmV2cyk6IE5ldyBmdW5jdGlvbi4KLQkoYWRkX2FiYnJldik6IE5ldyBmdW5jdGlvbi4KLQkoYWRkX2FiYnJldl9hdHRyKTogTmV3IGZ1bmN0aW9uLgotCShyZWFkX2FuZF9kaXNwbGF5X2F0dHIpOiBOZXcgZnVuY3Rpb24uCi0JKGRpc3BsYXlfYmxvY2spOiBOZXcgZnVuY3Rpb24uCi0KLVRodSBKYW4gMTQgMjM6MzY6MTEgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb2ZmZHVtcC5jICh4Y2FsbG9jKTogUmVtb3ZlLCBpbiBsaWJpYmVydHkgbm93LgotCSogc3Jjb252LmMgKHhjYWxsb2MpOiBMaWtld2lzZS4KLQkqIHN5c2R1bXAuYyAoeGNhbGxvYyk6IExpa2V3aXNlLgotCi0xOTk5LTAxLTE0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3Nfc2VjdGlvbl9oZWFkZXJzKTogT21pdCB0cmFpbGluZyBzcGFjZSBhdCBlbmQKLQlvZiBzZWN0aW9uIGhlYWRlciBjb250ZW50cyBsaW5lLgotCi1XZWQgRGVjIDE2IDE3OjIwOjA1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQ6IFJlZ2VuZXJhdGUuCi0KLU1vbiBEZWMgMTQgMTI6NTU6MzYgMTk5OCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBkbGx3cmFwLmM6IEluY2x1ZGUgYmZkLmggYW5kIGJ1Y29tbS5oLiAgTW92ZSBnZXRvcHQuaCBpbmNsdWRlCi0JYWZ0ZXIgbGliaWJlcnR5LmggaW5jbHVkZS4KLQotVHVlIERlYyAgOCAxNjoyOTo0MyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuMTogRml4IHR5cG8gKC1kIHRvIC1EKS4gIEZyb20gTm9rdWJpIEhpcm90YWthCi0JPGhub2t1YmlAeXl5Lm9yLmpwPi4KLQotU3VuIERlYyAgNiAxMzoyODowOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoU0ZJTEUpOiBBZGQgc2l6ZSBmaWVsZC4KLQkob2JqZHVtcF9zcHJpbnRmKTogTWVyZ2UgYm90aCB2ZXJzaW9ucyBpbnRvIG9uZS4gIEluY3JlYXNlIGJ1ZmZlcgotCXNpemUgYXMgbmVlZGVkIHRvIGF2b2lkIG92ZXJmbG93LgotCShkaXNhc3NlbWJsZV9ieXRlcyk6IENoYW5nZSBidWYgZnJvbSAxMDAwIGJ5dGVzIHRvIDUwLiAgQ2hhbmdlCi0JaW5pdGlhbGl6YXRpb24gYW5kIHVzZSBvZiBzZmlsZSB0byBtYXRjaCBjaGFuZ2VzIHRvCi0Jb2JqZHVtcF9zcHJpbnRmLgotCi0JKiBzdHJpcC4xOiBGaXggdHlwbyAoLVYgdG8gLXYpLiAgRnJvbSBJc3NlaSBIaXJheWFtYQotCTxpc3NAbWFpbC53YnMub3IuanA+LgotCi0xOTk4LTEyLTAzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCk6IEltcHJvdmUgb3V0cHV0IGZvcm1hdCBmb3IKLQl2YXJpb3VzIERUXyogdmFsdWVzLgotCi0xOTk4LTEyLTAyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX21pcHNfc3BlY2lmaWMpOiBQcmludCAuY29uZmxpY3Qgc2VjdGlvbgotCWNvbnRlbnQuCi0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19taXBzX3NwZWNpZmljKTogUHJpbnQgbF9mbGFncyBpbiBsaWJsaXN0IGluCi0JdGV4dHVhbCBmb3JtLgotCi0xOTk4LTExLTMwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhci5jIChleHRyYWN0X2ZpbGUpOiBBZGQgc29tZSBwYXJhbm9pYSBjaGVja3MgZm9yIG5lZ2F0aXZlbHkKLQlzaXplZCBmaWxlcy4KLQotVHVlIE5vdiAyNCAwOTozOToyNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChESVJfU0VQQVJBVE9SKTogRGVmaW5lIGFzICdcXCcgaWYgV0lOMzIgaXMgZGVmaW5lZC4KLQotVHVlIE5vdiAxNyAxMDoyNToyNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotTW9uIE5vdiAxNiAxOToxNzoyMyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL2JpbnV0aWxzLnBvdDogUmVnZW5lcmF0ZS4KLQotTW9uIE5vdiAxNiAxMDoxODo1MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVnZXJuYXRlZCBkZXBlbmRlbmNpZXMuCi0JKiBhY2xvY2FsLm00OiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLVNhdCBOb3YgMTQgMTQ6NTA6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkZWJ1Zy5jIChkZWJ1Z19uYW1lX3R5cGUpOiBDb3JyZWN0IHJldHVybiB0eXBlIGZyb20gZmFsc2UgdG8KLQlERUJVR19UWVBFX05VTEwuCi0KLVNhdCBOb3YgMTQgMTQ6NDg6MjEgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBTa2lwIG92ZXIgcmVsb2NzIGJlbG93IHN0YXJ0Ci0JYWRkcmVzcy4KLQotVHVlIE5vdiAxMCAxNTozMTo1MiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogQWRkIGRlcGVuZGVuY3kgb2YgcmVhZGVsZi5jIG9uIGVsZi9mcjMwLmgKLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCi1XZWQgTm92ICA0IDE2OjI1OjU1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogQWRkIHN1cHBvcnQgZm9yIHRoZSBGUjMwLgotCi1Nb24gTm92ICAyIDE0OjU5OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IGRldGVjdCBjeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqCi0gICAgICAgICogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLUZyaSBPY3QgMzAgMTU6MTQ6NDkgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGRsbHdyYXAuYzogY2hhbmdlIGFsbCByZWZlcmVuY2VzIHRvIGN5Z3dpbjMyXyB0byBjeWd3aW5fLAotCWNoYW5nZSBDeWd3aW4gdGFyZ2V0IGRlZiB0byBDWUdXSU4uCi0KLVdlZCBPY3QgMjggMTA6MzE6MTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogUmVwbGFjZSAndW5zaWduZWQgbG9uZycgd2l0aAotCSdiZmRfdm1hJy4KLQotVHVlIE9jdCAyNyAxNDozOTowMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogQXBwbGllZCB0aGlzIHBhdGNoIGZyb20gUGhpbGlwCi0JQmx1bmRlbGwgPHBiQG5leHVzLmNvLnVrPjogIE1ha2UgYWRkcmVzcyB2YXJpYWJsZXMgdW5zaWduZWQgdG8KLQlhdm9pZCBwcm9ibGVtcyB3aGVuIGRpc2Fzc2VtYmxpbmcgY29kZSBhdCBoaWdoLWJpdC1zZXQgYWRkcmVzc2VzLgotCi1Nb24gT2N0IDI2IDE0OjA3OjU5IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0gICAgICAgICogZGxsd3JhcC5jIChzdHJoYXNoKTogTmV3IGZ1bmN0aW9uLgotICAgICAgICAobWFpbik6IFVzZSBpdCB0byBzdXBwbHkgaW1hZ2UgYmFzZSBpZiBub3Qgc3VwcGxpZWQgYnkgdXNlci4KLSAgICAgICAgKHByb2dyYW1fdmVyc2lvbik6IFVwIHRvIDAuMi40LgotCi1Nb24gT2N0IDI2IDE0OjA3OjU5IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0gICAgICAgICogZGxsdG9vbC5jIChhZGRfc3RkY2FsbF9hbGlhcyk6IE5ldyBnbG9iYWwuCi0gICAgICAgIChsb25nX29wdGlvbnMpOiBBZGQgLS1hZGQtc3RkY2FsbC1hbGlhcyBvcHRpb24uCi0gICAgICAgIChtYWluKTogSGFuZGxlIGl0LgotICAgICAgICAoc2Nhbl9kcmVjdHZlX3N5bWJvbHMpOiBBZGQgYWxpYXMgaWYgLS1hZGQtc3RkY2FsbC1hbGlhcyBpcwotICAgICAgICBzcGVjaWZpZWQuCi0gICAgICAgIChzY2FuX2ZpbHRlcmVkX3N5bWJvbHMpOiBMaWtld2lzZS4KLSAgICAgICAgKGdlbl9kZWZfZmlsZSk6IE91dHB1dCBhbGlhcyBmb3Igc3RkY2FsbCBzeW1zIGlmIGFwcHJvcHJpYXRlLgotCi0gICAgICAgICogYmludXRpbHMudGV4aSAoZGxsdG9vbCk6IERvY3VtZW50IC0tYWRkLXN0ZGNhbGwtYWxpYXMgb3B0aW9uLgotCi0gICAgICAgICogZGxsd3JhcC5jIChsb25nX29wdGlvbnMpOiBBZGQgLS1hZGQtc3RkY2FsbC1hbGlhcyBvcHRpb24uCi0gICAgICAgIChtYWluKTogSGFuZGxlIGl0LgotCi0gICAgICAgICogZGVmcGFyc2UueSAob3B0X25hbWUpOiBBbGxvdyAiLiIgaW4gbmFtZS4KLSAgICAgICAgKiBkbGx0b29sLmMgKGRlZl9uYW1lKTogU2V0IGRsbF9uYW1lIGZyb20gTkFNRSBlbnRyeSBpbiBkZWYgZmlsZS4KLSAgICAgICAgKGRlZl9saWJyYXJ5KTogU2V0IGRsbF9uYW1lIGZyb20gTElCUkFSWSBlbnRyeSBpbiBkZWYgZmlsZS4KLQotTW9uIE9jdCAyNiAxNDowNzo1OSAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotICAgICAgICAqIGRsbHdyYXAuYyAobG9uZ19vcHRpb25zKTogLS1pbXBsaWIgc3lub255bSBmb3IgLS1vdXRwdXQtbGliLgotICAgICAgICAobWFpbik6IFBhc3MgLS1leHBvcnQtYWxsIHRvIGRsbHRvb2wgb25seSBpZiBzcGVjaWZpZWQuCi0gICAgICAgIChwcm9ncmFtX3ZlcnNpb24pOiBVcCB0byAwLjIuMy4KLQotTW9uIE9jdCAyNiAxNDowNzo1OSAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotICAgICAgICAqIGRsbHdyYXAuYyAobXliYXNlbmFtZSk6IE5ldyBmdW5jdGlvbi4KLSAgICAgICAgKG1haW4pOiBSdW4gZGxsdG9vbCB0byBjcmVhdGUgZXhwb3J0IGRlZmluaXRpb24gZmlsZSBhbmQgaW1wb3J0Ci0gICAgICAgIGxpYnJhcnkgZmlsZSBpZiBuZWNlc3NhcnkuCi0gICAgICAgIENoYW5nZSBleHBfZmlsZV9uYW1lIHNvIHRoYXQgaXQncyBiYXNlZCBvbiB0aGUgZGxsIG5hbWUuCi0KLVN1biBPY3QgMjUgMTA6Mzc6NDUgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLSAgICAgICAgKiBkbGx0b29sLmMgKHNjYW5fYWxsX3N5bWJvbHMpOiBGaXggcGF0Y2ggZXJyb3IuCi0KLUZyaSBPY3QgMTYgMjI6NTY6MjAgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBubS5jIChkaXNwbGF5X3JlbF9maWxlKTogZml4ICJubyBzeW1ib2xzIiBtZXNzYWdlcy4KLQkqIG9iamR1bXAuYyAoc2x1cnBfc3ltdGFiKTogZGl0dG8uCi0JKiBwby9QT1RGSUxFUy5pbiwgcG8vYmludXRpbHMucG90OiByZWJ1aWx0Ci0KLU1vbiBPY3QgMTIgMTQ6Mjg6MDMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogUmVuYW1lIGZpZWxkIGZyb20gVmFsdWUgdG8gSW5mbyB0bwotCW1hdGNoIG5hbWUgb2YgZmllbGQgaW4gRUxGIHN0cnVjdHVyZXMuCi0KLVRodSBPY3QgIDggMTU6MzM6MDggMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBjYWxsIEFDX0VYRUVYVCBpbnN0ZWFkIG9mIEFNX0VYRUVYVCBhbmQKLQlBTV9DWUdXSU4zMi4KLQkqIGFjbG9jYWwubTQ6IHJlbW92ZSBsb2NhbCBBTV9FWEVFWFQvQU1fQ1lHV0lOMzIgbWFjcm9zLgotCSogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLVRodSBPY3QgIDggMTU6MzM6MDggMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCUZyb20gTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+OgotICAgICAgICAqIGRsbHRvb2wuYyAoc2Nhbl9hbGxfc3ltYm9scyk6IERvbid0IHJlLWV4cG9ydCBzeW1ib2xzIGV4cG9ydGVkCi0gICAgICAgIGJ5IG90aGVyIERMTHMuCi0KLVRodSBPY3QgIDggMTU6MzM6MDggMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEJVSUxEX0RMTFdSQVApOiBBZGQuCi0JKEJVSUxEX0RMTFdSQVAsIERMTFdSQVBfUFJPRyk6IEFkZC4KLQkoYmluX1BST0dSQU1TKTogQWRkIGRsbHdyYXAuCi0JKiBNYWtlZmlsZS5pbjogcmVnZW5lcmF0ZSB3aXRoIGF1dG9tYWtlCi0KLQlGcm9tIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PjoKLSAgICAgICAgKiBkbGx3cmFwLmM6IE5ldyBmaWxlIGZyb20gZGxsaGVscGVycyB2MC4yLjEuCi0JKHByaW50X3ZlcnNpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAtLXZlcnNpb24uCi0JKG1haW4pOiBIYW5kbGUuCi0gICAgICAgICogZHluLXN0cmluZy5oLCBkeW4tc3RyaW5nLmM6IE5ldyBmaWxlcyBmcm9tIGVnY3MtMS4xL2djYy4KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKEJVSUxEX0RMTFdSQVApOiBBZGQuCi0gICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1UdWUgT2N0ICA2IDE4OjIwOjEwIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtICh3aW5kcmVzX1NPVVJDRVMpOiBBZGQgcmVzcmVzLmMuCi0JKHdpbmRyZXNfT0JKRUNUUyk6IEFkZCByZXNyZXMuby4KLQkqIE1ha2VmaWxlLmluOiByZWdlbmVyYXRlIHdpdGggYXV0b21ha2UKLQotICAgICAgICBGcm9tIEFuZGVycyBOb3JsYW5kZXIgPGFub3JsYW5kQGhlbTIucGFzc2FnZW4uc2U+LgotICAgICAgICAqIHJlc3Jlcy5jOiBOZXcgZmlsZS4gIEltcGxlbWVudGF0aW9uIG9mIHJlYWRfcmVzX2ZpbGUgYW5kCi0gICAgICAgIHdyaXRlX3Jlc19maWxlIGZ1bmN0aW9ucyBmb3Igd2luZHJlcy4KLSAgICAgICAgKiByY3BhcnNlLnk6IEhhbmRsZSBDT05UUk9MJ3Mgd2l0aCBuYW1lZCBjbGFzc2VzLgotICAgICAgICAqIHJlc2Jpbi5jOiBCdWcgaW4gcmVzX3RvX2Jpbl9kaWFsb2cgYW5kIGJpbl90b19yZXNfZGlhbG9nCi0gICAgICAgIHdoZW4gZGlhbG9nIGlzIGV4dGVuZGVkOiBUaGUgdmVyc2lvbiBhbmQgc2lnbmF0dXJlIGZpZWxkcyBzaG91bGQKLSAgICAgICAgYmUgcmV2ZXJzZWQgKGRlc3BpdGUgd2hhdCB0aGUgZG9jcyBzYXkpLiBJZCBpcyAzMiBiaXRzIGxvbmcgaW4KLSAgICAgICAgZXh0ZW5kZWQgZGlhbG9ncy4KLSAgICAgICAgKiByZXNyYy5jICh3cml0ZV9yY19kaWFsb2cpOiBwcm9wZXJseSBwcmludCBjb250cm9scyB3aXRoIG5hbWVkCi0gICAgICAgIGNsYXNzZXMuCi0gICAgICAgICogd2luZHJlcy5jIChyZWFkX3Jlc19maWxlLCB3cml0ZV9yZXNfZmlsZSk6IFJlbW92ZSBzdHVicy4KLSAgICAgICAgKiByZXNyZXMuYyAod3JpdGVfcmVzKTogUmVuYW1lIFJUX0FDQ0VMRVJBVE9SUyB0byBSVF9BQ0NFTEVSQVRPUi4KLQotU3VuIE9jdCAgNCAyMDozNDo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIE5va3ViaSBIaXJvdGFrYSA8aG5va3ViaUB5eXkub3IuanA+OgotCSogb2JqY29weS4xOiBGaXggdHlwbyBpbiAtLXJlbW92ZS1sZWFkaW5nLWNoYXIgZG9jcy4KLQkqIG9iamR1bXAuMTogRml4IGZvcm1hdHRpbmcgaW4gLS1zdGFicyBkb2NzLgotCi1TYXQgU2VwIDE5IDIzOjMzOjU2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmNwYXJzZS55IChtZW1mbGFnc19tb3ZlKTogQ29ycmVjdCByZWN1cnNpb24uCi0KLTE5OTgtMDktMTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3Nfc3ltYm9sX3RhYmxlKTogUHJpbnQgaW4gaGlzdG9ncmFtIGhvdyBtYW55Ci0Jc3ltYm9scyBhcmUgY292ZXJlZCBieSB0aGUgY3VycmVudCBjaGFpbiBsZW5ndGguCi0KLVN1biBTZXAgIDYgMTY6MTU6NDcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX3NlY3Rpb25fY29udGVudHMpOiBEbyBub3QgdHJ5IHRvIGR1bXAgZW1wdHkKLQlzZWN0aW9ucy4KLQotU2F0IFNlcCAgNSAxOToxNzoxMCAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogZGxsdG9vbC5jIChzY2FuX2FsbF9zeW1ib2xzKTogRG9uJ3QgcmUtZXhwb3J0IHN5bWJvbHMgZXhwb3J0ZWQKLQlieSBvdGhlciBETExzLgotCi0xOTk4LTA5LTAyIDE0OjUwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCk6IFByaW50IERUXyogdmFsdWUgb25seSBpZgotCWRvX2R5bmFtaWMuCi0JKGRvX2hpc3RvZ3JhbSk6IE5ldyB2YXJpYWJsZS4KLQkob3B0aW9ucyk6IE5ldyBsb25nIG9wdGlvbiBoaXN0b2dyYW0uICBTZXQgZG9faGlzdG9ncmFtIGlmIHRoaXMKLQlvcHRpb24gaXMgdXNlZC4KLQkodXNhZ2UpOiBEb2N1bWVudCAtLWhpc3RvZ3JhbS4KLQkocGFyc2VfYXJncyk6IEhhbmRsZSAwIHJldHVybiB2YWx1ZSBmcm9tIGdldG9wdF9sb25nLiAgRW5hYmxlCi0JZG9faGlzdG9ncmFtIGZvciAtYS4KLQkocHJvY2Vzc19zeW1ib2xfdGFibGUpOiBSZWFkIGhhc2ggdGFibGUgYWxzbyBpZiBvbmx5IGRvX2hpc3RvZ3JhbS4KLQlBZGQgY29kZSB0byBwcmludCBoYXNoIHRhYmxlIGhpc3RvZ3JhbS4KLQotMTk5OC0wOC0yNSAxNjo0NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19keW5hbWljX3NlZ21lbnQpOiBSZWFkIHN5bWluZm8gc2VjdGlvbiBpZgotCWF2YWlsYWJsZS4KLQkocHJvY2Vzc19zeW1pbmZvKTogTmV3IGZ1bmN0aW9uLiAgUHJpbnQgc3ltaW5mbyBpbmZvcm1hdGlvbi4KLQkocHJvY2Vzc19maWxlKTogQ2FsbCBwcm9jZXNzX3N5bWluZm8gYW5kIGZyZWUgc3ltaW5mbyBkYXRhIGF0IHRoZSBlbmQuCi0KLVdlZCBBdWcgMTkgMTY6MTk6NTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKHVzYWdlKTogQWRkIGZpbGUgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShtYWluKTogRG9uJ3QgdHJlYXQgJz8nIGFzIGEgc3BlY2lhbCBjYXNlIGluIGdldG9wdCByZXR1cm4uCi0KLQkqIGJpbnV0aWxzLnRleGkgKGRsbHRvb2wpOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4gIEFkZCBzb21lIHVzZXMgb2YKLQlAdmFyLgotCi1XZWQgQXVnIDE5IDE2OjE5OjA3IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBkbGx0b29sLmMgKGdlbl9kZWZfZmlsZSk6IFBsdWcgbWVtb3J5IGxlYWsuICBEb24ndCBwcmludAotCWRlbWFuZ2xlZCBuYW1lIGlmIGl0IGlzIE5VTEwuCi0KLQlTdXBwb3J0IGZvciBleHBvcnRpbmcgYWxsIHN5bWJvbHMgdG8gYW4gb3V0cHV0IGV4cG9ydCBkZWYgZmlsZToKLQkqIGRsbHRvb2wuYyAoe2V4cG9ydF9hbGxfc3ltYm9scywgbm9fZGVmYXVsdF9leGNsdWRlcywKLQlub19kZWZhdWx0X2V4Y2x1ZGVzLCBleGNsdWRlc30pOiBOZXcgZmlsZSBzdGF0aWMgdmFyaWFibGVzLgotCShzdHJ1Y3Qgc3RyaW5nX2xpc3QpOiBUeXBlIHRvIGhvbGQgbGlzdCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUuCi0JKHNjYW5fZHJlY3R2ZV9zeW1ib2xzKTogUmVuYW1lZCBmcm9tIHNjYW5fb3Blbl9vYmpfZmlsZS4KLQkoc2Nhbl9maWx0ZXJlZF9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWRkX2V4Y2x1ZGVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWF0Y2hfZXhjbHVkZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNldF9kZWZhdWx0X2V4Y2x1ZGVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZmlsdGVyX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzY2FuX2FsbF9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc2Nhbl9vcGVuX29ial9maWxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkodXNhZ2UpOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQkobG9uZ19vcHRpb25zKTogQWRkIG5ldyBvcHRpb25zLgotCShtYWluKTogSGFuZGxlIG5ldyBvcHRpb25zLgotCi0xOTk4LTA3LTMxIDIxOjI0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX3Byb2dyYW1faGVhZGVycyk6IFByaW50IHBfb2Zmc2V0IHZhbHVlIHdpdGgKLQlzaXggaGV4IGRpZ2l0cy4KLQkoZHluYW1pY19zZWdtZW50X21pcHNfdmFsKTogQWRkIHN1cHBvcnQgZm9yIERUX01JUFNfRkxBR1MsCi0JRFRfTUlQU19JVkVSU0lPTiwgYW5kIERUX01JUFNfVElNRV9TVEFNUC4KLQkocHJvY2Vzc19taXBzX3NwZWNpZmljKTogQWxzbyBwcmludCBzZWNvbmRzIG9mIHRpbWUgc3RhbXAuCi0KLUZyaSBKdWwgMzEgMTA6MDQ6MjMgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiByZWFkZWxmLmMgKGR1bXBfcmVsb2NhdGlvbnMpOiAgRU1fQVJNIHVzZXMgcmVsYSByZWxvY3MuCi0KLTE5OTgtMDctMzAgMTY6MjUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKGdldF9keW5hbWljX3R5cGUpOiBEb24ndCB1c2VkIGdldHRleHQgb24gdGhlIG5hbWVzLgotCUFkZCBuZXcgRFRfKiB2YWx1ZXMgZnJvbSBTb2xhcmlzLiAgRG9uJ3QgcHJpbnQgbnVlbXJpYyB2YWx1ZSBpbgotCWNhc2Ugb2YgYW4gdW5rbm93biBlbnRyeS4KLQkocHJvY2Vzc19keW5hbWljX3NlZ21lbnQpOiBIYW5kbGUgbmV3IERUXyogZW50cmllcy4gIFByaW50IG51bWVyaWMKLQl2YWx1ZXMgaW4gZGVjaW1hbCwgbm90IGhleC4KLQotRnJpIEp1bCAyNCAxNjoyODo1NyAxOTk4ICBKZWZmIEhvbGNvbWIgIDxqZWZmaEBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKGdldF9keW5hbWljX3R5cGUpOiBSZW1vdmUgZW1wdHkgZGVmYXVsdCBmcm9tIHN3aXRjaAotCXN0YXRlbWVudC4KLQotRnJpIEp1bCAyNCAxNjoyODoxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBEb24ndCByZW1vdmUgdGhlIGZpbGUgYmVmb3JlCi0JY2hlY2tpbmcgd2hldGhlciAkKGJpbmRpcikgPT0gJCh0b29sZGlyKS9iaW4uICBGcm9tIE1hY2llagotCVcuIFJvenlja2kgPG1hY3JvQGRzMi5wZy5nZGEucGw+LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBKdWwgMjQgMDk6Mzg6NTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jOiBSZW1vdmVkIHNwdXJpb3VzIGluY2x1c2lvbiBvZiBlbGYvaW50ZXJuYWwuaCBhbmQKLQllbGYtYmZkLmguCi0KLTE5OTgtMDctMjIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IENvbnNpc3RhbnRseSB1c2UgZWxmXyBwcmVmaXggZm9yICpfcmVsb2NfdHlwZQotCWZ1bmN0aW9ucy4KLQotV2VkIEp1bCAyMiAxNjoyOToxMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKGR1bXBfcmVsb2NhdGlvbnMpOiBBZGQgZHVtcHMgb2YgSFBQQSBhbmQgQVJDCi0JcmVsb2NhdGlvbnMuCi0KLQkocHJvY2Vzc19yZWxvY3MpOiBEbyBub3QgYWJvcnQgaWYgbm8gc3RyaW5nIHRhYmxlIGNhbiBiZSBmb3VuZC4KLQotMTk5OC0wNy0yMiAxNDo1OCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogUmVtb3ZlIGRlZmluaXRpb24gb2YgZnVuY3Rpb25zIHRvIHJldHVybiByZWxvY2F0aW9uCi0Jc3ltYm9sIHN0cmluZ3MuICBUaGV5IG5vdyBnZXQgaW1wbGljaXRseSBkZWZpbmVkIHdoZW4gaW5jbHVkZSB0aGUKLQlzeXN0ZW0gc3BlY2lmaWMgRUxGIGhlYWRlci4KLQotMTk5OC0wNy0yMiAxMzo1MSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogQmVmb3JlIGluY2x1ZGUgc3lzdGVtIHNwZWNpZmljIEVMRiBoZWFkZXIgZGVmaW5lCi0JU1RBUlRfUkVMT0NfTlVNQkVSUywgUkVMT0NfTlVNQkVSLCBhbmQgRU5EX1JFTE9DX05VTUJFUlMuICBGb3Igbm93Ci0JdXNlZCBmb3IgcHBjLCBtaXBzLCBhbmQgbW4xMDMwMC4KLQotV2VkIEp1bCAyMiAxMDoyNjozMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKGR1bXBfcmVsb2NhdGlvbnMpOiBEaXNwbGF5IG51bWJlciBvZiB1bnJlY29nbmlzZWQKLQlyZWxvY2F0aW9ucy4KLQotMTk5OC0wNy0yMSAxMzoxMyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogVXNlIHN5bWJvbGljIG5hbWVzIG9mIHJlbG9jYXRpb24gZW50cmllcyBmb3IgdGhlIHZhcmlvdXMKLQlhcmNoaXRlY3R1cmVzLiAgQ29ycmVjdCBtb3JlIGxheW91dCBkZXRhaWxzLgotCVByaW50IG5hbWVzIG9mIE1JUFMgc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4gIFByaW50IEFscGhhLCBBUk0sIGFuZAotCU1JUFMgcmVsb2NhdGlvbiB0eXBlIG5hbWVzLgotCi0xOTk4LTA3LTIwICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6IEFkZCBjb2RlIGZvciBzdHJpcCBhbGwgc3ltYm9scyBjYXNlLgotICAgICAgICAoY29weV9vYmplY3RzKTogU3RyaXAgYWxsIGNhc2UgaXMgbm93IHByb2Nlc3NlZCBhbHNvIHRocm91Z2gKLQlmaWx0ZXJfc3ltYm9scy4gIE5vIG1hcmtpbmcgc3ltYm9scyB1c2VkIGluIHJlbG9jYXRpb25zIHdoZW4gc3RyaXAKLQlhbGwgc3ltYm9scyBjYXNlLgotCShjb3B5X3NlY3Rpb24pOiBXaGVuIHN0cmlwIGFsbCBzeW1ib2xzIGNhc2UsIHJlbW92ZSByZWxvY2F0aW9ucwotCXdoaWNoIGFyZSBub3QgaW4ga2VlcCBzdHJpcCBzcGVjaWZpYyBsaXN0LgotCShzdHJpcF9tYWluKTogUmVtb3ZlIGd1YXJkIGBzdHJpcF9zcGVjaWZpY19saXN0ID09IE5VTEwnIGZvcgotCXNldHRpbmcgdXAgc3RyaXAgYWxsIHN5bWJvbHMgYnkgZGVmYXVsdC4KLQotTW9uIEp1bCAyMCAxMjo1MToxNiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYWRkcjJsaW5lLmMgKGZpbmRfYWRkcmVzc19pbl9zZWN0aW9uKTogT25seSBjb25zaWRlciBhIHNlY3Rpb24KLQlpZiB0aGUgcGMgdmFsdWUgaXMgY29tcGxldGVseSBjb250YWluZWQgd2l0aGluIGl0LgotCSh0cmFuc2xhdGVfYWRkcmVzc2VzKTogRG9uJ3QgY3Jhc2ggaWYgZnVuY3Rpb25uYW1lIG9yIGZpbGVuYW1lIGFyZQotCW51bGwuCi0KLTE5OTgtMDctMjAgMDc6NDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3Nfc3ltYm9sX3RhYmxlKTogRml4IGxpdHRsZSBhbGlnbm1lbnQgcHJvYmxlbQotCWluIHByaW50ZWQgdGFibGUgaGVhZGVyLgotCi0xOTk4LTA3LTIwIDA3OjE0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBDb3JyZWN0IHJlYWRpbmcgb2YgLmR5bmFtaWMgc2VjdGlvbi4KLQkoZHluYW1pY19zZWN0aW9uKTogTm93IGEgZ2xvYmFsIHZhcmlhYmxlLgotCShwcm9jZXNzX21pcHNfZnBlX2V4Y2VwdGlvbiwgcHJvY2Vzc19taXBzX3NwZWNpZmljLAotCXByb2Nlc3NfYXJjaF9zcGVjaWZpYyk6IE5ldyBmdW5jdGlvbnMuCi0JKGdldF9maWxlX2hlYWRlcik6IENhbGwgcHJvY2Vzc19hcmNoX3NwZWNpZmljLgotCi0xOTk4LTA3LTE5IDE1OjE1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBGaXggc2V2ZXJhbCB2ZXJzaW9uaW5nIHJlbGF0ZWQgYnVncy4gIFByb2R1Y2UgbmljZXIKLQlvdXRwdXQuCi0JQWRkIHN1cHBvcnQgZm9yIHByb2Nlc3NvciBzcGVjaWZpYyBpbmZvcm1hdGlvbiBvbiBNSVBTLgotCi1GcmkgSnVsIDEwIDE1OjU3OjU4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogU3dpdGNoIHByb3RvdHlwZXMgZnJvbSB1bnNpZ25lZCBzaG9ydCB0byB1bnNpZ25lZAotCWludC4KLQotRnJpIEp1bCAxMCAxNjoxNzo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIENocmlzdGlhbiBIb2xsYW5kIDxDSG9sbGFuZEBkZS5sdWNlbnQuY29tPjoKLQkqIGllZWUuYyAocGFyc2VfaWVlZSk6IEluaXRpYWxpemUgaW5mby5nbG9iYWxfdmFycyBhbmQKLQlpbmZvLmdsb2JhbF90eXBlcy4KLQkocGFyc2VfaWVlZV9hdG4pOiBJZ25vcmUgcmVnaXN0ZXIgbGlmZXRpbWUgaW5mb3JtYXRpb24gcmVwb3J0ZWRseQotCWVtaXR0ZWQgYnkgTVJJIGNvbXBpbGVyLgotCi1UaHUgSnVsICA5IDEzOjA4OjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKE1BSU5UQUlORVJDTEVBTkZJTEVTKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBKdWwgIDcgMjE6NDg6NTQgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiByZWFkZWxmLmMgKGJ5dGVfZ2V0KTogVXNlIFBBUkFNUyBpbiBwcm90b3R5cGUuCi0JKGVycm9yKTogTWFrZSBpdCB3b3JrIHdpdGggbm9uLUFOU0kgY29tcGlsZXJzLgotCSh3YXJuKTogTGlrZXdpc2UuCi0JKGdldF92ZXJfZmxhZ3MpOiBEb24ndCB1c2UgYW4gQU5TSSBwcm90b3R5cGUgaW4gdGhlIGRlZmluaXRpb24uCi0KLVR1ZSBKdWwgIDcgMTM6MjY6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9ieXRlcyk6IFNldCBzaXplIGNvcnJlY3RseSBpZiB0aGUgc2l6ZSBvZiB0aGUKLQlzZWN0aW9uIGlzIG5vdCBhbiBldmVuIG11bHRpcGxlIG9mIHRoZSBpbnRlcmxlYXZlLiAgQmFzZWQgb24gcGF0Y2gKLQlmcm9tIEJyaW9uIFN0b25lIDxCcmlvbi5TdG9uZUBhdHR3cy5jb20+LgotCi1UaHUgSnVsICAyIDE0OjAxOjM0IDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcm1pLmRlPgotCi0JKiBjb25maWd1cmUuY29tOiBBZGQgdmF4L3ZtcyBzdXBwb3J0LgotCSogbWFrZWZpbGUudm1zLWluOiBSZW5hbWVkIGZyb20gbWFrZWZpbGUudm1zLiAgQWRkIHN1YnN0aXR1dGlvbnMKLQlub3cgZG9uZSBieSBjb25maWd1cmUuY29tLgotCi1XZWQgSnVsICAxIDIwOjQzOjUyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9yYW5nZV90eXBlKTogSGFuZGxlIDQgYW5kIDggYnl0ZSBzaWduZWQKLSAJaW50ZWdlcnMgd2l0aCByZWFsIHVwcGVyIGJvdW5kcy4gIEhhbmRsZSBhIGxvd2VyIGJvdW5kIG9uZSBsYXJnZXIKLSAJdGhhbiB0aGUgdXBwZXIgYm91bmQgYXMgYSBzaWduZWQgaW50ZWdlci4gIEhhbmRsZSA4IGJ5dGUgc2lnbmVkCi0JaW50ZWdlcnMuCi0JKHN0YWJfZGVtYW5nbGVfdGVtcGxhdGUpOiBPcHRpb25hbGx5IHJldHVybiB0aGUgZGVtYW5nbGVkIG5hbWUgb2YKLQl0aGUgdGVtcGxhdGUuCi0JKHN0YWJfZGVtYW5nbGVfcXVhbGlmaWVkKTogVHJlYXQgYSB0ZW1wbGF0ZSBuYW1lIGFzIGEgdGFnZ2VkCi0JdHlwZS4KLQkoc3RhYl9kZW1hbmdsZV9mdW5kX3R5cGUpOiBMaWtld2lzZS4KLQotV2VkIEp1bCAgMSAxNjoyOTo1MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmM6IE1pbm9yIGZvcm1hdHRpbmcgaW1wcm92ZW1lbnRzLgotCSogcmVhZGVsZi5jOiBNaW5vciBvdXRwdXQgZm9ybWF0dGluZyBpbXByb3ZlbWVudC4KLQotV2VkIEp1bCAgMSAxNDoyMzo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJjbGV4Lmw6IEFkZCBjYXN0cyBhbmQgY2hhbmdlIHR5cGVzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogcmNwYXJzZS55OiBMaWtld2lzZS4KLQkqIHJlc2Jpbi5jOiBMaWtld2lzZS4KLQkqIHJlc2NvZmYuYzogTGlrZXdpc2UuCi0JKiByZXNyYy5jOiBMaWtld2lzZS4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoSEZJTEVTKTogUmVtb3ZlIHJlYWRlbGYuaC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEFuZHJldyBLb3ppbgotCTxBbmRyZXcuS296aW5AcDE0LmY5NjAubjUwMjAuejIuZmlkb25ldC5vcmc+OgotCSogd2luZHVuaS5oOiBOZXcgZmlsZSwgZnJvbSB3aW5kcmVzLmguCi0JKiB3aW5kdW5pLmM6IE5ldyBmaWxlLCBmcm9tIHdpbmRyZXMuYy4KLQkqIHdpbmRyZXMuYzogTW92ZSBVbmljb2RlIGZ1bmN0aW9ucyBpbnRvIHdpbmR1bmkuYy4KLQkqIHdpbmRyZXMuaDogTW92ZSBVbmljb2RlIGRlY2xhcmF0aW9ucyBpbnRvIHdpbmR1bmkuaC4gIEluY2x1ZGUKLQl3aW5kdW5pLmguCi0gCShSVF9BQ0NFTEVSQVRPUik6IFJlbmFtZSBmcm9tIFJUX0FDQ0VMRVJBVE9SUyB0byBtYXRjaCBXaW5kb3dzCi0JbWFjcm8uICBDaGFuZ2UgYWxsIHVzZXMuCi0JKFJUX1BMVUdQTEFZLCBSVF9WWEQpOiBDb3JyZWN0IHZhbHVlcy4KLQkqIE1ha2VmaWxlLmFtIChIRklMRVMpOiBBZGQgd2luZHJlcy5oLgotCShDRklMRVMpOiBBZGQgd2luZHVuaS5jLgotCSh3aW5kcmVzX1NPVVJDRVMpOiBBZGQgd2luZHVuaS5jLgotCi1Nb24gSnVuIDI5IDE3OjAxOjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogVXNlIEJGRCBJbnRlcm5hbCBhbmQgRXh0ZXJuYWwgRWxmIHN0cnVjdHVyZXMuCi0JKiByZWFkZWxmLmg6IFJlbW92ZWQgLSBubyBsb25nZXIgbmVlZGVkLgotCSogTWFrZWZpbGUuaW46IFJlbW92ZSByZWFkZWxmLmMncyBkZXBlbmRlbmN5IHVwb24gcmVhZGVsZi5oLgotCi0xOTk4LTA2LTI2ICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChzdHJpcF9tYWluKToga2VlcF9zcGVjaWZpY19saXN0ID09IE5VTEwgYXMgYWRkaXRpb25hbAotCWNvbmRpdGlvbiB0byBzZXQgdXAgc3RyaXAgYWxsIHN5bWJvbHMgYnkgZGVmYXVsdC4KLQkoY29weV9hcmNoaXZlKTogZG9uJ3QgY2hhbmdlIGFyY2hpdmUgd2hlbiBlcnJvciBpbiBvYmplY3QgZmlsZXMgb2YKLQl0aGUgYXJjaGl2ZS4KLQotV2VkIEp1biAyNCAxNzo1Mzo0NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHBhcnNlX251bWJlcik6IFNpZ24gZXh0ZW5kIG5lZ2F0aXZlIHZhbHVlcyBjb3JyZWN0bHkgaWYKLQliZmRfdm1hIGlzIGxhcmdlciB0aGFuIHVuc2lnbmVkIGxvbmcuCi0KLVR1ZSBKdW4gMjMgMTQ6NTU6MDUgMTk5OCAgTWlrZSBTdHVtcCAgPG1yc0B3cnMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogRG9uJ3QgbGV0IEVYRUVYVCBpbnRlcmZlcmUKLQl3aXRoIHRoZSBwcm9ncmFtIHRyYW5zZm9ybSBuYW1lLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBKdW4gMjMgMTE6MDg6NTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBSZXdyaXRlIHRvIHVzZSBmb3Blbi9mcmVhZCByYXRlaHIgdGhhbiBtbWFwLgotCi0JQWRkIC0tc2VjdGlvbi1oZWFkZXJzIGNvbW1hbmQgbGluZSBzd2l0Y2gsIHdoaWNoIGlzIGFuIGFsaWFzIGZvcgotCS0tc2VjdGlvbnMuCi0KLQlJbmNvcnBvcmF0ZSBpbXByb3ZlbW50cyBtYWRlIGJ5IEFuZHJlYXMgU2Nod2FiCi0JPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4gaW5jbHVkaW5nIG91dHB1dAotCWZvcm1hdHRpbmcgYW5kIHZlcnNpb24gaW5mbyBkaXNwbGF5LgotCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCAtLXNlY3Rpb24taGVhZGVycyBzd2l0Y2ggdG8gcmVhZGVsZi4KLQotTW9uIEp1biAyMiAxODoyODoxOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogSW5jbHVkZSBiZmQuaCBhbmQgYnVjb21tLmggYmVmb3JlIHN5c3RlbSBoZWFkZXIKLQlmaWxlcy4KLQkocGFyc2VfYXJncyk6IENoYW5nZSB0eXBlIG9mIGMgZnJvbSBjaGFyIHRvIGludC4KLQotU3VuIEp1biAxNCAxNDoyNjoyOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHVzYWdlKTogV3JpdGUgdG8gc3Rkb3V0LCBub3Qgc3RkZXJyLgotCi1GcmkgSnVuIDEyIDEzOjMzOjUxIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoYWxsLXllcyk6IERlcGVuZCBvbiAucG90IGZpbGUgaWYgbWFpbnRhaW5lciBtb2RlCi0JZW5hYmxlZC4KLQkoJChQQUNLQUdFKS5wb3QpOiBVbmNvbmRpdGlvbmFsbHkgZGVwZW5kIG9uIFBPVEZJTEVTLgotCi1GcmkgSnVuIDEyIDE2OjA2OjE1IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKGdldF9wcGNfcmVsX3R5cGUpOiBOZXcgUG93ZXJQQyBzdXBwb3J0LgotCShkdW1wX3JlbG9jYXRpb25zKTogUG93ZXJQQyB1c2VzIFJFTEEgcmVsb2NhdGlvbnMuCi0JKGdldF9tYWNoaW5lX25hbWUpOiBTcGVsbCBQb3dlclBDIGNvcnJlY3RseS4KLQkoZ2V0X2ZpbGVfdHlwZSk6IENoYW5nZSB1bnNpZ25lZCBzaG9ydCBwYXJhbWV0ZXIgdG8gdW5zaWduZWQuCi0JKGdldF9tYWNoaW5lX25hbWUpOiBEaXR0by4KLQkoZ2V0X21hY2hpbmVfZGF0YSk6IFJldHVybiB3aGV0aGVyIGJpZyBlbmRpYW4gb3IgbGl0dGxlIGVuZGlhbi4KLQkoZ2V0X21hY2hpbmVfZmxhZ3MpOiBJbnRlcnByZXQgUG93ZXJQQywgTTMyUiwgYW5kIE1JUFMgZmxhZ3MuCi0JKHByb2Nlc3NfZWxmX2hlYWRlcik6IFByaW50IGVuZGlhbi1lc3MuICBDb252ZXJ0IGFsbCBudW1lcmljCi0JZm9ybWF0cyB0byBsb25nIG9yIHVuc2lnbmVkIGxvbmcuICBQcmludCBvdXQgbWFjaGluZSBzcGVjaWZpYyBmbGFnCi0JYml0cy4KLQkocHJvY2Vzc19zZWN0aW9uX2hlYWRlcnMpOiBJbmNyZWFzZSBuYW1lIGJ5IDMgY29sdW1ucyBhbmQgZGVjcmVhc2UKLQl0eXBlIGJ5IHRoZSBzYW1lIHNvIHRoYXQgLmdjY19leGNlcHRfdGFibGUgZml0cyBpbiB0aGUgc3BhY2UuCi0KLQkqIHJlYWRlbGYuaDogSW5jbHVkZSBlbGYvcHBjLmgsIGVsZi9taXBzLmgsIGFuZCBlbGYvbTMyci5oIHRvIGdldAotCW1hY2hpbmUgc3BlY2lmaWMgZmxhZyBiaXRzLgotCi1UaHUgSnVuIDExIDE3OjU0OjI2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogUmVtb3ZlIGV4dHJhbmVvdXMgI2luY2x1ZGVzLiAgRml4IHdhcm5pbmdzIHByb2R1Y2VkCi0JYnkgLVdhbGwgd2hlbiBjb21waWxpbmcgdW5kZXIgTGludXguCi0KLQkqIE1ha2VmaWxlLmFtIChyZWFkZWxmX0xEQUREKTogQWRkICQoTElCSUJFUlRZKS4KLQotVGh1IEp1biAxMSAxODozMDoyMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX2hhbmRsZSk6IEFkZCBzZWxmX2Nyb3NzcmVmIGZpZWxkLgotCShwYXJzZV9zdGFiX3N0cmluZyk6IElmIGEgdGFnIGlzIGEgY3Jvc3MgcmVmZXJlbmNlIHRvIGl0c2VsZiwKLQlkb24ndCBkZWZpbmUgaXQgaW4gdGhlIHRhZ3MgbGlzdC4KLQkocGFyc2Vfc3RhYl90eXBlKTogU2V0IGluZm8tPnNlbGZfY3Jvc3NyZWYuCi0KLQkqIGRlYnVnLmMgKHN0cnVjdCBkZWJ1Z190eXBlX3JlYWxfbGlzdCk6IERlZmluZS4KLQkoZGVidWdfZ2V0X3JlYWxfdHlwZSk6IEFkZCBsaXN0IHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQlDaGVjayBmb3IgY2lyY3VsYXJpdHkgdG8gYXZvaWQgY3Jhc2hpbmcgd2hlbiBpdCBvY2N1cnMuCi0KLVRodSBKdW4gMTEgMTQ6NDg6MzIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBOZXcgZmlsZTogRGlzcGxheSBjb250ZW50cyBvZiBFTEYgZm9ybWF0IGZpbGUuCi0JKiByZWFkZWxmLmg6IE5ldyBmaWxlOiBIZWFkZXIgZmlsZSBmb3IgcmVhZGVsZi5jCi0JKiBNYWtlZmlsZS5hbTogQWRkIHJ1bGVzIHRvIGJ1aWxkIHJlYWRlbGYuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IHJlYWRlbGYuCi0JKiBORVdTOiBNZW50aW9uIGluY2x1c2lvbiBvZiByZWFkZWxmIGludG8gYmludXRpbHMuCi0JKiBwby9QT1RGSUxFUy5pbjsgUmVidWlsdC4KLQotRnJpIEp1biAgNSAxODo0Mzo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoc2V0dXBfc2VjdGlvbik6IEFkanVzdCB0aGUgc2VjdGlvbiBzaXplIGlmIGNvcHlfYnl0ZQotCWlzID49IDAuCi0JKGNvcHlfc2VjdGlvbik6IERvIG5vdCBjYWxsIGJmZF9zZXRfc2VjdGlvbl9zaXplLgotCi1UaHUgSnVuICA0IDA5OjEyOjI3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY29weV91c2FnZSk6IEFkZCBtaXNzaW5nIFxuXCBmcm9tIGhlbHAgZGVzY3JpcHRpb24uCi0KLVdlZCBKdW4gIDMgMTk6MzE6MzMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoWUFDQyk6IENvcnJlY3QgYmlzb24gLUwgb3B0aW9uLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLXAvLS1wcml2YXRlLWhlYWRlcnMuCi0KLVdlZCBKdW4gIDMgMTI6MDk6NDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jOiBBZGQgbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zOiAtLWNoYW5nZS1zZWN0aW9uLWxtYQotCWFuZCAtLWNoYW5nZS1zZWN0aW9uLXZtYS4gIFJlbmFtZSBvbGQgY29tbWFuZCBsaW5lIG9wdGlvbgotCS0tYWRqdXN0LXNlY3Rpb24tdm1hIHRvIC0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzcy4gIFJlbmFtZQotCS0tYWRqdXN0LXZtYSB0byAtLWNoYW5nZS1hZGRyZXNzZXMgYW5kIC0tYWRqdXN0LXN0YXJ0IHRvCi0JLS1jaGFuZ2Utc3RhcnQuICBQcm92aWRlIGFsaWFzZXMgdG8gc3VwcG9ydCB0aGUgb2xkIHZlcnNpb25zIG9mCi0JdGhlc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0KLQlDaGFuZ2UgdGhlIG5hbWVzIG9mIG1hY3JvcyBhbmQgZW51bSBlbGVtZW50cyB0byB1cHBlciBjYXNlIHRvCi0JbWF0Y2ggdGhlIEdOVSBjb2Rpbmcgc3RhbmRhcmQuCi0KLQlSZXBsYWNlIGNhbGxzIHRvIGZwcmludGYgKHN0ZGVyciwuLi4pIHdpdGggY2FsbHMgdG8gZmF0YWwgKCkgb3IKLQlub25fZmF0YWwgKCkgYXMgYXBwcm9wcmlhdGUuCi0KLQkqIG9iamNvcHkuMTogRG9jdW1lbnQgY29tbWFuZCBsaW5lIG9wdGlvbiBjaGFuZ2VzLgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgY29tbWFuZCBsaW5lIG9wdGlvbiBjaGFuZ2VzLgotCi0JKiBidWNvbW0uaDogTmV3IGV4cG9ydGVkIGZ1bnRpb24gZnJvbSBidWNvbW0uYzogbm9uX2ZhdGFsKCkuCi0JKiBidWNvbW0uYyAobm9uX2ZhdGFsKTogTmV3IGV4cG9ydGVkIGZ1bmN0aW9uLiAgSnVzdCBsaWtlIGZhdGFsKCkKLQlleGNlcHQgdGhhdCBpdCByZXR1cm5zIHJhdGhlciB0aGFuIGNhbGxpbmcgeGV4aXQoKS4KLQotCShiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBDYWxsIGZhdGFsKCkgcmF0aGVyIHRoYW4gYmZkX2ZhdGFsKCkuCi0KLQkoY2hlY2tfbWF0Y2hpbmdfZm9ybWF0cyk6IEZpeCBDIGZvcm1hdGluZy4KLQotCShwYXJzZV92bWEpOiBDYWxsIGZhdGFsKCkuCi0KLU1vbiBKdW4gIDEgMTg6MjY6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBZdWxpIEJhcmNvaGVuIDx5dWxpLmJhcmNvaGVuQHRlbHJhZC5jby5pbD46Ci0JKiBkZWJ1Zy5jIChkZWJ1Z190eXBlX3NhbWVwKTogQXZvaWQgZW5kbGVzcyBsb29wcyBjb21wYXJpbmcKLQlmdW5jdGlvbiBhbmQgbWV0aG9kIHBhcmFtZXRlciB0eXBlcy4KLQotRnJpIE1heSAyMiAxNDowMjo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZHVtcF9pYXQpOiBDb21tZW50IG91dDsgbm90IHVzZWQuCi0JKGRpc3BsYXkpOiBSZW5hbWUgZnJvbSB0ZWxsLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCi1UaHUgTWF5IDE0IDE0OjAwOjU2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYzogQWRkIHN1cHBvcnQgZm9yIFRodW1iIERMTHMuICBBZGQgc3VwcG9ydCBmb3IKLQlpbnRlcndvcmtpbmcgYmV0d2VlbiBBUk0gYW5kIFRodW1iIHByb2dyYW1zIGFuZCBETExzLiAgVGlkeSB0aGUKLQljb2RlLgotCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCBkbGx0b29sLgotCi0JKiBjb25maWd1cmU6IEJ1aWxkIGRsbHRvb2wgZm9yIHRodW1iLXBlIHRhcmdldHMuCi0KLQkqIHZlcnNpb24uYyAocHJpbnRfdmVyc2lvbik6IEluY2x1ZGUgMTk5OCBpbiBjb3B5cmlnaHQgc3RyaW5ncy4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYik6IFN1cHBvcnQgV2luMzIgc3R5bGUgZGlyZWN0b3J5IHNlcGFyYXRvcnMuCi0KLVN1biBNYXkgMTAgMjI6MzQ6NDQgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBwby9NYWtlLWluIChpbnN0YWxsLWluZm8pOiBOZXcgdGFyZ2V0LgotCi1GcmkgTWF5ICA4IDEwOjMzOjEzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFyLmMgKHVzYWdlKTogRXh0ZW5kIGluZm9ybWF0aW9uIHByb3ZpZGVkIGFib3V0IGNvbW1hbmQgbGluZQotCW9wdGlvbnMuCi0KLVdlZCBNYXkgIDYgMTU6Mjg6NTEgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogUnVuIGRlYyBjIHdpdGggL25vZGVidWcuICBQYXNzIENDIHZhbHVlIHdoZW4KLQljYWxsaW5nIG1ha2UuCi0KLVR1ZSBNYXkgIDUgMTU6MTk6MDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBCdWlsZCBkbGx0b29sIGZvciB0aHVtYi1wZSB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGRsbHRvb2wgZm9yIHRodW1iLXBlIHRhcmdldC4KLQotU3VuIE1heSAgMyAyMjowNDo0OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9QUk9HUkFNUyk6IENoYW5nZSAkKFNSQ09OVl9QUk9HKSB0byBzeXNjb25mCi0Jc3lzZHVtcCBjb2ZmZHVtcCB0byBhdm9pZCBleHRyYSAkKEVYRUVYVCkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIEFwciAyOSAyMjoyMjo1NSAxOTk4ICBHZW9mZnJleSBOb2VyIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU3RvcCBhcHBlbmRpbmcgRVhFRVhUIHRvIHRoZSBlbmQgb2YKLQlTUkNPTlZfUFJPRyAod3JvbmcgYmVjYXVzZSB0aGF0IHZhcmlhYmxlIG1heSBjb250YWluIG11bHRpcGxlCi0JcHJvZ3JhbXMpCi0JKiBNYWtlZmlsZS5hbTogaW5zdGVhZCwgYWRkIEVYRUVYVHMgdG8gZWFjaCBTUkNPTlZfUFJPRwotCXByb2dyYW0KLQkqIE1ha2VmaWxlLmluOiByZWdlbmVyYXRlCi0JKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotVHVlIEFwciAyOCAxOToxNDozNCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFkZHIybGluZS5jIChtYWluKTogQ29uZGl0aW9uYWxseSBjYWxsIHNldGxvY2FsZS4KLQkqIHdpbmRyZXMuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3lzZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzdHJpbmdzLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHNyY29udi5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzaXplLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBubS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBubG1jb252LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGRsbHRvb2wuYyAobWFpbik6IExpa2V3aXNlLgotCSogY29mZmR1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogYXIuYyAobWFpbik6IExpa2V3aXNlLgotCSogYnVjb21tLmg6IEluY2x1ZGUgPGxvY2FsZS5oPiBpZiBIQVZFX0xPQ0FMRV9ILgotCShMQ19NRVNTQUdFUyk6IE5vdyBjYW4gYmUgZGVmaW5lZCBldmVuIHdoZW4gRU5BQkxFX05MUy4KLQotVHVlIEFwciAyOCAxMDozMzowNyAxOTk4ICBCaWxsIE1veWVyICA8dHRrQGN5Z251cy5jb20+Ci0KLQlBZGQgc3VwcG9ydCBmb3IgSU1QT1JUUzoKLQkqIGRlZnBhcnNlLnkgKGltcGxpbmUpOiBBZGQgSU1QT1JUUyBzeW50YXhlcy4KLQkqIGRsbHRvb2wuYyAoaWZ1bmN0eXBlLCBpaGVhZHR5cGUpOiBOZXcgdHlwZWRlZnMuCi0JKGltcG9ydF9saXN0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYXBwZW5kX2ltcG9ydCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGRlZl9pbXBvcnQpOiBBZGQgYW4gZW50cnkgdG8gaW1wb3J0X2xpc3QuCi0JKGdlbmVyYXRlX2lkYXRhX29maWxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZ2VuX2V4cF9maWxlKTogQ2FsbCBnZW5lcmF0ZV9pZGF0YV9vZmlsZS4KLQkqIGRsbHRvb2wuaCAoZGVmX2ltcG9ydCk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotTW9uIEFwciAyNyAxNjozOToyMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIHZlcnNpb24gbnVtYmVyIHRvIDIuOS40Ci0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBBcHIgMjIgMTY6MDA6MzUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChNS0lOU1RBTExESVJTKTogRG9uJ3QgbG9vayBpbiAkKHRvcF9zcmNkaXIpLgotCi1XZWQgQXByIDIyIDAwOjMzOjU2IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAc2NyaWJibGVzLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChJTkNMVURFUyk6IFNlYXJjaCBpbnRsIGRpcnMgZm9yIGhlYWRlcnM7IGRlZmluZQotCUxPQ0FMRURJUi4KLQkqIGFkZHIybGluZS5jIChtYWluKTogQ2FsbCBzZXRsb2NhbGUsIGJpbmR0ZXh0ZG9tYWluLCB0ZXh0ZG9tYWluLgotCSogYXIuYyAobWFpbik6IExpa2V3aXNlLgotCSogY29mZmR1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogZGxsdG9vbC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBubG1jb252LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG5tLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG9iamNvcHkuYyAobWFpbik6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzaXplLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHNyY29udi5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzdHJpbmdzLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHN5c2R1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogd2luZHJlcy5jIChtYWluKTogTGlrZXdpc2UuCi0KLVR1ZSBBcHIgMjEgMjI6MTM6MDggMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBzY3JpYmJsZXMuY3lnbnVzLmNvbT4KLQotCSogTWFueSBmaWxlczogQWRkZWQgZ2V0dGV4dCBpbnZvY2F0aW9ucyBhcm91bmQgdXNlci12aXNpYmxlCi0Jc3RyaW5ncy4KLQkqIGJ1Y29tbS5oOiBBZGRlZCBnZXR0ZXh0LXJlbGF0ZWQgaW5jbHVkZXMgYW5kIGRlZmluZXMuCi0JKiBhY2NvbmZpZy5oIChFTkFCTEVfTkxTLCBIQVZFX0NBVEdFVFMsIEhBVkVfR0VUVEVYVCwgSEFWRV9TVFBDUFksCi0JSEFWRV9MQ19NRVNTQUdFUyk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBDWV9HTlVfR0VUVEVYVC4gIENyZWF0ZSBwby9NYWtlZmlsZS5pbiBhbmQKLQlwby9NYWtlZmlsZS4gIFVzZSBBTV9QUk9HX0xFWC4KLQkqIE1ha2VmaWxlLmFtIChTVUJESVJTKTogTmV3IG1hY3JvLgotCShQT1RGSUxFUyk6IExpa2V3aXNlLgotCShwby9QT1RGSUxFUy5pbik6IE5ldyB0YXJnZXQuCi0JKExEQUREKTogQWRkZWQgSU5UTExJQlMuCi0JKG9iamR1bXBfTERBREQpOiBMaWtld2lzZS4KLQkoY19fZmlsdF9MREFERCk6IExpa2V3aXNlLgotCShhcl9MREFERCk6IExpa2V3aXNlLgotCShyYW5saWJfTERBREQpOiBMaWtld2lzZS4KLQkoZGxsdG9vbF9MREFERCk6IExpa2V3aXNlLgotCSh3aW5kcmVzX0xEQUREKTogTGlrZXdpc2UuCi0JKiBwby9NYWtlLWluLCBwby9QT1RGSUxFUy5pbiwgcG8vYmludXRpbHMucG90OiBOZXcgZmlsZXMuCi0KLVR1ZSBBcHIgMjEgMTY6MDc6MTggMTk5OCAgU3RhbmlzbGF2IEJyYWJlYyAgPHV0eEBrMzMyLmZlbGQuY3Z1dC5jej4KLQotCSogb2JqY29weS5jIChwcmVzZXJ2ZV9kYXRlcyk6IE5ldyBmaWxlIHN0YXRpYyB2YXJpYWJsZS4KLQkoc21hcnRfcmVuYW1lKTogSWYgcHJlc2VydmVfZGF0ZXMsIGNhbGwgc2V0X3RpbWVzIHdoZW4gY29weWluZy4KLQkoc3RyaXBfbWFpbik6IFJlbW92ZSBwcmVzZXJ2ZV9kYXRlcyBsb2NhbCB2YXJpYWJsZS4KLQkoY29weV9tYWluKTogTGlrZXdpc2UuCi0KLVR1ZSBBcHIgIDcgMTU6NDE6MTUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoRElTVFNUVUZGKTogQWRkIGRlZnBhcnNlLmgsIGRlZnBhcnNlLmMsIHJjbGV4LmMsCi0JcmNwYXJzZS5oLCBhbmQgcmNwYXJzZS5jCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEFwciAgNiAxNjoyNDozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChQUk9HUyk6IE1vdmUgJChBRERSMkxJTkVfUFJPRykgdG8gZW5kLCBzbyB0aGF0Ci0JTWFrZWZpbGUuaW4gZG9lc24ndCBoYXZlIGFuIGVtcHR5IGNvbnRpbnVhdGlvbiBsaW5lLgotCShiaW5fUFJPR1JBTVMpOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgQXByICAzIDE0OjQ4OjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKERJU1RDTEVBTkZJTEVTKTogQWRkIHNpdGUuZXhwIGFuZCBzaXRlLmJhay4KLQkoTU9TVExZQ0xFQU5GSUxFUyk6IEFkZCBiaW51dGlscy5sb2csIGJpbnV0aWxzLnN1bSwgYW5kIGFiY2RlZmdoKi4KLQkobW9zdGx5Y2xlYW4tbG9jYWwpOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVdlZCBBcHIgIDEgMTU6NTQ6MTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBaYWNrIFdlaW5iZXJnIDx6YWNrQHJhYmkucGh5cy5jb2x1bWJpYS5lZHU+IGFuZCBILkouIEx1Ci0JPGhqbEBnbnUub3JnPjoKLQkqIGFyLmMgKHVzYWdlKTogTWVudGlvbiBTIG1vZGlmaWVyLgotCShtYWluKTogQWRkIFMgbW9kaWZpZXIuCi0JKiBhci4xLCBiaW51dGlscy50ZXhpOiBEb2N1bWVudCBTIG1vZGlmaWVyLgotCi1XZWQgQXByICAxIDEzOjExOjIzIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBiaW51dGlscy50ZXhpOiBVc2UgQGl0ZW14IGZvciBhIHNlY29uZGFyeSBpdGVtIGluIGEgdGFibGUuCi0KLVR1ZSBNYXIgMzEgMTg6NDQ6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkZXAtaW4uc2VkOiBBZGQgcnVsZSB0byByZW1vdmUgQE9CSkRJUkAuCi0JKiBNYWtlZmlsZS5hbSAoZGVwLnNlZCk6IFN1YnN0aXR1dGUgZm9yIEBPQkpESVJALgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBNYXIgMzAgMTI6NDc6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCB2ZXJzaW9uIHRvIDIuOS4xLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjkuCi0KLQkqIE1ha2VmaWxlLmFtIChESVNUQ0xFQU5GSUxFUyk6IFJlbW92ZSBkZWZwYXJzZS5oLCBhcnBhcnNlLmgsCi0JcmNwYXJzZS5oLCBhbmQgbmxtaGVhZGVyLmguCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotU2F0IE1hciAyOCAxNzozOToyNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChNT1NUTFlDTEVBTkZJTEVTKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQlGaXggc29tZSBnY2MgLVdhbGwgd2FybmluZ3M6Ci0JKiBubG1jb252LmMgKG1haW4pOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKGFscGhhX21hbmdsZV9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX3N0YWJzKTogTGlrZXdpc2UuCi0JKiBzaXplLmMgKHByaW50X3N5c3ZfZm9ybWF0KTogTGlrZXdpc2UuCi0JKiBzcmNjb252LmMgKHdyX29iKTogTGlrZXdpc2UuCi0JKiB3cnN0YWJzLmMgKHN0YWJfbW9kaWZ5X3R5cGUpOiBMaWtld2lzZS4KLQkoc3RhYl92YXJpYWJsZSk6IExpa2V3aXNlLgotCSogbmxtY29udi5jIChtYWluKTogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKiBubS5jIChzb3J0X3N5bWJvbHNfYnlfc2l6ZSk6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IExpa2V3aXNlLgotCSogd3JzdGFicy5jIChzdGFiX2VuZF9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0JKiBjb2ZmZ3Jvay5jIChkb19zZWN0aW9uc19wMik6IENoYW5nZSBqIHRvIHVuc2lnbmVkIGludC4KLQkoZG9fbGluZXMpOiBDaGFuZ2UgbCB0byB1bnNpZ25lZCBpbnQuCi0JKiBubG1oZWFkZXIueSAoeXlsZXgpOiBDaGFuZ2UgaSB0byB1bnNpZ25lZCBpbnQuCi0JKiBubS5jIChwcmludF9zeW1ib2wpOiBDaGFuZ2UgaiB0byBsb25nLgotCSogc2l6ZS5jIChscHJpbnRfbnVtYmVyKTogQ29tbWVudCBvdXQuCi0JKiBzcmNvbnYuYyAod3Jfb2IpOiBDaGFuZ2UgaSB0byBiZmRfc2l6ZV90eXBlLgotCSogc3lzZHVtcC5jICh1bml0X2luZm9fbGlzdCk6IENvbW1lbnQgb3V0LgotCShvYmplY3RfYm9keV9saXN0LCBwcm9ncmFtX3N0cnVjdHVyZSwgZGVidWdfbGlzdCk6IExpa2V3aXNlLgotCSogc3lzaW5mby55ICh5eWVycm9yKTogUmV0dXJuIHZhbHVlLgotCi1UaHUgTWFyIDI2IDE3OjA2OjUxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGRlZnBhcnNlLnkgKGV4cGxpc3QpOiBBbGxvdyBlcHNpbG9uLgotCVN1Z2dlc3Rpb24gZnJvbSBKb25hdGhhbi1IYXJyaXNAcHNpb24uY29tLgotCi1UaHUgTWFyIDI2IDE2OjU5OjA5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZncm9rLmMgKGRvX3NlY3Rpb25zX3AxKTogVXNlIHRoZSBzZWN0aW9uJ3MgbG1hIGluc3RlYWQgb2Ygdm1hCi0JZm9yIHRoZSBiZW5lZml0IG9mIHByb20gbG9hZGVycy4KLQotV2VkIE1hciAyNSAxMzowNTozOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIEguSi4gTHUgIDxoamxAZ251Lm9yZz46Ci0JKiBNYWtlZmlsZS5hbSAoRElTVFNUVUZGKTogTmV3IHZhcmlhYmxlLgotCShkaXN0c3R1ZmYpOiBOZXcgdGFyZ2V0LgotCShESVNUQ0xFQU5GSUxFUyk6IE5ldyB2YXJpYWJsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgTWFyIDI0IDE5OjMzOjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmNsZXgubDogQWNjZXB0IHsgYW5kIH0gYXMgc3lub255bXMgZm9yIEJFR0lOIGFuZCBFTkQuCi0KLUZyaSBNYXIgMjAgMTk6MTg6MDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBsaWJ0b29sIDEuMi4KLQotVHVlIEZlYiAyNCAxMzowNzo1MCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBEZWxldGUgIisrcGxhY2UiIGFmdGVyIGNhbGwgdG8KLQlmaW5kX3N5bWJvbF9mb3JfYWRkcmVzcy4gIFNldCBkaXNhc21faW5mby5zeW1ib2xzIHRvIGFycmF5IG9mCi0Jc3ltYm9scyBhdCB0aGUgY3VycmVudCBhZGRyZXNzLgotCi1XZWQgRmViIDE4IDIzOjM5OjQ2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBJbnN0YWxsIHByb3Blcmx5IHdoZW4gbG4KLQlmYWlscyBvciB0b29sZGlyID09IHByZWZpeC4KLQotVHVlIEZlYiAxNyAxODo0MDo1NSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNvbXBhcmVfc2VjdGlvbl9sbWEpOiBSZW5hbWUgZnJvbSBfdm1hLgotICAgICAgICAoY29weV9vYmplY3QpOiBHYXAgZmlsbCBiYXNlZCBvbiBMTUEgbm90IFZNQS4KLQkqIGJpbnV0aWxzLnRleGk6IFVwZGF0ZSBhbmQgY2xhcmlmeS4KLQkqIG9iamNvcHkuMTogTGlrZXdpc2UuCi0KLVR1ZSBGZWIgMTcgMjA6MzQ6MTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGdlbl9leHBfZmlsZSk6IEdlbmVyYXRlIF9pbXBfXyVzIGFzIHdlbGwgYXMgX19pbXBfJXMsCi0JZm9yIE1pY3Jvc29mdCBjb21wYXRpYmlsaXR5LgotCShtYWtlX29uZV9saWJfZmlsZSk6IExpa2V3aXNlLgotCi0JKiBkbGx0b29sLmMgKG1ha2Vfb25lX2xpYl9maWxlKTogRG9uJ3QgYWRkIDEgdG8gaGludC4KLQotRnJpIEZlYiAxMyAxNjozNzo0NCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBVVRPTUFLRV9PUFRJT05TKTogRGVmaW5lLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGF1dG9tYWtlIDEuMmUuCi0KLVRodSBGZWIgMTIgMTQ6MTM6NDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkZWZsZXgubDogQWNjZXB0ICc/JyBpbiBzeW1ib2wgbmFtZXMsIGZvciBWQysrIG1hbmdsZWQgbmFtZXMuCi0JRnJvbSBNaWtleSA8amVmZmRiQG5ldHpvbmUuY29tPi4KLQotCSogYWRkcjJsaW5lLmMgKHVzYWdlKTogVXBkYXRlIGJ1Zy1nbnUtdXRpbHMgYWRkcmVzcy4KLQkqIGFyLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0JKiBubG1jb252LmMgKHNob3dfdXNhZ2UpOiBMaWtld2lzZS4KLQkqIG5tLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0JKiBvYmpjb3B5LmMgKGNvcHlfdXNhZ2UpOiBMaWtld2lzZS4KLQkoc3RyaXBfdXNhZ2UpOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAodXNhZ2UpOiBMaWtld2lzZS4KLQkqIHNpemUuYyAodXNhZ2UpOiBMaWtld2lzZS4KLQkqIHN0cmluZ3MuYyAodXNhZ2UpOiBMaWtld2lzZS4KLQkqIHdpbmRyZXMuYyAodXNhZ2UpOiBMaWtld2lzZS4KLQkqIGJpbnV0aWxzLnRleGkgKEJ1ZyBSZXBvcnRpbmcpOiBMaWtld2lzZS4KLQotU2F0IEZlYiAgNyAxNTozNjoyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1UaHUgRmViICA1IDEyOjIxOjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1GcmkgSmFuIDMwIDE5OjE2OjI4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChDQ19GT1JfVEFSR0VULG5sbWNvbXYubyk6IENoYW5nZSBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi0JdG8gdHJhbnNmb3JtLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLVRodSBKYW4gMjkgMTY6MjQ6MDQgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGRsbHRvb2wuYzogRGVmaW5lIGV4aXQgc3RhdHVzIG1hY3JvcyBmb3IgX1dJTjMyIGJ1dCBub3QKLQlfX0NZR1dJTjMyX18uCi0JKGdlbl9saWJfZmlsZSk6IENoZWNrIGZvciBleGl0IHN0YXR1cyBvZiB1bmxpbmsuCi0JKiByZXNyYy5jOiBEZWZpbmUgcG9wZW4gYW5kIHBjbG9zZSBpZiBfV0lOMzIgYnV0IG5vdAotCV9fQ1lHV0lOMzJfXy4KLQotV2VkIEphbiAyOCAxNzo0NTo0NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIHZmb3JrIGNoZWNrLgotCSogbmxtY29udi5jOiBOZXZlciBpbmNsdWRlIHZmb3JrLmguCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLVdlZCBKYW4gMjggMTc6NDM6MDIgMTk5OCAgSi5KLiB2YW4gZGVyIEhlaWpkZW4gPEouSi52YW5kZXJIZWlqZGVuQHN0dWRlbnQudXR3ZW50ZS5ubD4KLQotCSogb2JqY29weS5jIChjb3B5X2FyY2hpdmUpOiBPbmx5IHBhc3Mgb25lIGFyZ3VtZW50IHRvIG1rZGlyIGlmCi0JX1dJTjMyIGJ1dCBub3QgX19DWUdXSU4zMl9fLgotCShzbWFydF9yZW5hbWUpOiBBZGQgY29kZSBmb3IgX1dJTjMyIChub3QgX19DWUdXSU4zMl9fKSwgdG8gY29wZQotCXdpdGggZGlmZmVyZW50IHJlbmFtZSBiZWhhdmlvdXIgYW5kIGxhY2sgb2YgY2hvd24uCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIG1pbmd3MzIgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGJ1aWxkCi0JZGxsdG9vbC4KLQkqIGRsbHRvb2wuYzogTmV2ZXIgaW5jbHVkZSB2Zm9yay5oLgotCShydW4pOiBVc2UgcGV4ZWN1dGUgcmF0aGVyIHRoYW4gdmZvcmsuCi0JKGdlbl9saWJfZmlsZSk6IENoZWNrIGZvciBlcnJvcnMgZnJvbSBiZmRfc2V0X2FyY2hpdmVfaGVhZCBhbmQKLQliZmRfY2xvc2UuICBDbG9zZSBhbGwgdGhlIEJGRHMgaW4gdGhlIGFyY2hpdmUgYmVmb3JlIGRlbGV0aW5nIHRoZQotCXRlbXBvcmFyeSBmaWxlcy4KLQotVGh1IEphbiAyMiAxNjoyMjo1NSAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IEFkZCBmbGFnIElOU05fSEFTX1JFTE9DIHRvIHRlbGwKLQlkaXNhc3NlbWJseSBmdW5jdGlvbiB0aGVyZSBpcyBhIHJlbG9jIG9uIHRoaXMgbGluZS4KLQotV2VkIEphbiAxNCAxNToyOTo0MyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzcmNvbnYuYyAoc2gsIGg4MzAwKTogRGVsZXRlIHZhcmlhYmxlcy4KLQkoYWRkcnNpemUsIHRvb2xuYW1lLCBybmFtZXMpOiBOZXcgdmFyaWFibGVzLgotCSh3cml0ZUlOVCk6IFVzZSBhZGRyc2l6ZS4KLQkod3JfdW4pOiBVc2UgdG9vbG5hbWUuCi0JKHdyX2hkKTogU2V0IHVwIGFkZHJzaXplIGV0IGFsIHByb3Blcmx5IGZvciBoODMwMFtoc10uCi0JKHdhbGtfdHJlZV9zeW1ib2wpOiBaZXJvIGRzeS4gIFVzZSBybmFtZXMuCi0JKHdyX3VuLCB3cl9oZCwgd3Jfb2IsIHdyX2R1KTogVXNlIHByb3BlciBiZmQgYWNjZXNzIG1hY3Jvcy4KLQkqIHN5c2R1bXAuYyAoc2gsIGg4MzAwKTogRGVsZXRlIHZhcmlhYmxlcy4KLQkoYWRkcnNpemUpOiBOZXcgdmFyaWFibGUuCi0JKGdldElOVCk6IFVzZSBpdC4KLQkoZ2V0b25lKTogSW5pdGlhbGl6ZSBpdC4KLQkoZ2V0QklUUyk6IFJhbmdlIGNoZWNrIG9uIE1BWC4KLQotTW9uIERlYyAyOSAxNjo1ODowNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIE1hdHRoZXcgQmVsbGFudG9uaSA8bWF0dGhld0BjaHJ5c2FsaXMuY29tPjoKLQkqIGFyLmMgKGdldF9wb3NfYmZkKTogQWRkIGRlZmF1bHRfcG9zbmFtZSBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkocmVwbGFjZV9tZW1iZXJzKTogRGVmYXVsdCB0byByZXBsYWNpbmcgaW4gdGhlIHNhbWUgcG9zaXRpb24uCi0KLU1vbiBEZWMgMjIgMTE6Mjc6MjIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByY2xleC5sOiBEb24ndCBwZXJtaXQgYSBjb21tYSBpbiBhIFNUUklORy4KLQkqIHJjcGFyc2UueSAoYWNjX2VudHJ5KTogV2FybiBpZiBhbiBpbmFwcHJvcHJpYXRlIG1vZGlmaWVyIGlzIHVzZWQKLQl3aXRoIGEgbm9uIFZJUlRLRVkuCi0JKGFjY19ldmVudCk6IEZvciBhIGNvbnRyb2wgY2hhcmFjdGVyLCBzZXQgVklSVEtFWSwgYW5kIGZvcmNlIHRoZQotCWNoYXJhY3RlciB0byB1cHBlcmNhc2UuCi0JKGFjY19vcHRpb25zKTogRG9uJ3QgcmVxdWlyZSBhIGNvbW1hIHNlcGFyYXRvci4KLQotVHVlIERlYyAgOSAxMzoyNTo0MiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogc2l6ZS5jIChzaXplX251bWJlcik6IE5ldyBmdW5jdGlvbiB0byBwcm92aWRlIHNpemUgb2YgZmllbGQuCi0JKHtsLHJ9cHJpbnRfbnVtYmVyKTogRm9yIG9jdGFsIGFuZCBoZXggZmllbGRzLCBwcmludCBmaWVsZCB1c2luZwotCScwJyBhbmQgJzB4JyBzdWZmaXhlcy4gIERvIG5vdCBpbmNsdWRlIGZvbGxvd2luZyB0YWIuCi0JKHN5c3ZfaW50ZXJuYWxfc2l6ZXIpOiBTaXplIHNlY3Rpb24gbmFtZSwgc2VjdGlvbiBzaXplLCBhbmQgdm1hCi0JYWRkcmVzcyBmaWVsZHMuCi0JKHN5c3ZfaW50ZXJuYWxfcHJpbnRlcik6IFVzZSBjYWxjdWxhdGVkIHNpemVzIGZvciB0aGUgY29sdW1ucy4KLQkocHJpbnRfc3lzdl9mb3JtYXQpOiBTaXplIGNvbHVtbnMgYmVmb3JlIHByaW50aW5nLgotCShwcmludF9iZXJrZWxleV9mb3JtYXQpOiBQcmludCB0YWJzIGJldHdlZW4gbnVtYmVycyBub3cgdGhhdAotCXtsLHJ9cHJpbnRfbnVtYmVyIGRvZXNuJ3QuICBQcmludCBmaWVsZHMgcmlnaHQganVzdGlmaWVkLgotCi1Nb24gRGVjICA4IDExOjIyOjA0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltKTogUmVtb3ZlIGNhbGwgdG8KLQlkaXNhc21fc3ltYWRkcigpIGFzIHRoaXMgZnVuY3Rpb24gbm8gbG9uZ2VyIGV4aXN0cy4KLQotVHVlIERlYyAgMiAxMDoyMzo1MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSk6IENhbGwgZGlzYXNtX3N5bWFkZHIoKQotCXRvIGFsbG93IGJhY2tlbmQgdG8ga25vdyB3aGljaCBzeW1ib2wgaGFzIGp1c3QgYmVlbiBkaXNwbGF5ZWQuCi0KLVR1ZSBEZWMgIDIgMTM6MDY6NDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3aW5kcmVzLmggKEVTQ0FQRV8qKTogRGVmaW5lIHN0YW5kYXJkIGVzY2FwZSBzZXF1ZW5jZXMuCi0JKiByY2xleC5sIChoYW5kbGVfcXVvdGVzKTogSGFuZGxlIHN0YW5kYXJkIGVzY2FwZSBzZXF1ZW5jZXMuICBXYXJuCi0JYWJvdXQgYW4gdW5yZWNvZ25pemVkIGVzY2FwZSBjaGFyYWN0ZXIuCi0JKiB3aW5kcmVzLmMgKHVuaWNvZGVfcHJpbnQpOiBQcmludCBzdGFuZGFyZCBlc2NhcGUgc2VxdWVuY2VzLgotCSogcmNwYXJzZS55IChhY2NfZXZlbnQpOiBJbml0aWFsaXplICQkLm5leHQuCi0JKiByZXNiaW4uYyAoYmluX3RvX3Jlc19tZW51aXRlbXMpOiBEb24ndCBzZXQgTUVOVUlURU1fUE9QVVAgb3IKLQlNRU5VSVRFTV9FTkRNRU5VIGluIHRoZSBtZW51IGl0ZW0gZmxhZ3MuCi0JKGJpbl90b19yZXNfYWNjZWxlcmF0b3JzKTogQWxsb2NhdGUgYSBzdHJ1Y3R1cmUgKHRoZSBvbGQgY29kZQotCW5ldmVyIHdvcmtlZCkuCi0JKHJlc190b19iaW5fYWNjZWxlcmF0b3IpOiBDb3JyZWN0IHRoZSB0ZXN0IGZvciBzZXR0aW5nIEFDQ19MQVNULgotCShyZXNfdG9fYmluX2RpYWxvZyk6IFNhdmUgdGhlIGV4dGVuZGVkIHN0eWxlIHJhdGhlciB0aGFuIHNhdmluZwotCXRoZSBzdHlsZSB0d2ljZS4gIFJlbW92ZSB1c2VsZXNzIHNoYWRvd2luZyBsZW5ndGggdmFyaWFibGUuICBTZXQKLQl0aGUgbGVuZ3RoIG9mIGNvbnRyb2wgZGF0YSBjb3JyZWN0bHkuCi0JKiByZXNyYy5jICh3cml0ZV9yY19kaWFsb2cpOiBEb24ndCBwcmludCB0aGUgY2xhc3Mgb3IgbWVudSBpZiB0aGUKLQlzdHJpbmcgbGVuZ3RoIGlzIHplcm8uCi0KLU1vbiBOb3YgMjQgMTg6NTI6NDMgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfYXJndHlwZXMpOiBEb24ndCB0cnkgdG8gcGFyc2UgdGhlIG5hbWUgb2YgYQotCWRlc3RydWN0b3IgYXMgbWFuZ2xlZCBhcmd1bWVudCB0eXBlcy4KLQotTW9uIE5vdiAxMCAxNzo1MTo0MSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogYWRkcjJsaW5lLmMgKHRyYW5zbGF0ZV9hZGRyZXNzZXMpOiBVc2UgYmZkX3NjYW5fdm1hIHJhdGhlcgotCXRoYW4gc3RydG9sIHRvIHNjYW4gYWRkcmVzc2VzLgotCi1TdW4gTm92ICA5IDExOjAxOjMxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuYW0gKGJpbl9QUk9HUkFNUyk6IERvbid0IHVzZSBsaW5lIGNvbnRpbnVhdGlvbnMgaGVyZS4KLQotVHVlIE5vdiAgNCAxMTo1NjoxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY29weV9zZWN0aW9uKTogRG9uJ3QgY3Jhc2ggaWYgdGhlcmUgaXMgbm8gcGFydGljdWxhcgotCWluZm9ybWF0aW9uIGZvciBhIHNlY3Rpb24uCi0KLU1vbiBOb3YgIDMgMTI6MzY6MTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKHBhcnNlX2ZsYWdzKTogTWFrZSBmbGFnIGNoZWNrIGNhc2UgaW5zZW5zaXRpdmUuCi0JQ2hlY2sgZm9yIGBjb250ZW50cycgZmxhZy4gIEdpdmUgYW4gZXJyb3IgZm9yIHVucmVjb2duaXplZCBmbGFncy4KLQkoY29weV9zZWN0aW9uKTogSWYgdGhlIGNvbnRlbnRzIGZsYWcgd2FzIHNldCBmb3IgYSBzZWN0aW9uIHRoYXQKLQloYWQgbm8gY29udGVudHMsIHplcm8gb3V0IHRoZSBuZXcgY29udGVudHMuCi0JKiBiaW51dGlscy50ZXhpIChvYmpjb3B5KTogRG9jdW1lbnQgY29udGVudHMgc2VjdGlvbiBmbGFnLgotCi1TdW4gTm92ICAyIDE0OjQ5OjU2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jOiBNb3ZlIG5ldyBzdHJ1Y3QgYW5kIHZhcmlhYmxlIGRlZmluaXRpb25zIHRvIHRvcCBvZgotCWZpbGUuICBSZW1vdmUgb2Jzb2xldGUgYWRkX3N0cmlwX3N5bWJvbCBhbmQgaXNfc3RyaXBfc3ltYm9sCi0JZGVjbGFyYXRpb25zLiAgQWRkIHByb3RvdHlwZSBkZWNsYXJhdGlvbnMgZm9yIGFkZF9zcGVjaWZpY19zeW1ib2wKLQlhbmQgaXNfc3BlY2lmaWVkX3N5bWJvbC4KLQotTW9uIE9jdCAyMCAxNTozMTo0MyAxOTk3ICBLbGF1cyBLImFtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlndXJlLmNvbSAoSEFWRV9TQlJLKTogVW5kZWZpbmUuCi0KLVR1ZSBPY3QgMTQgMTY6MTQ6MzUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3N5bWJvbF9hdF9hZGRyZXNzKTogTmV3IGZ1bmN0aW9uLiAgUmV0dXJucwotCXRydWUgaWYgYSBzeW1ib2wgY2FuIGJlIGZvdW5kIGF0IHRoZSBhZGRyZXNzIHBhc3NlZCBpbi4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IFNldCB0aGUgc3ltYm9sX2F0X2FkZHJlc3NfZnVuYyBmaWVsZCB0byBwb2ludAotCXRvIG9iamR1bXBfc3ltYm9sX2F0X2FkZHJlc3MuCi0KLUZyaSBPY3QgMTAgMTQ6MTM6MDkgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jLCBvYmpjb3B5LjEsIGJpbnV0aWxzLnRleGk6ICJsb2NhbGl6ZSIgaXMgYSBiZXR0ZXIgbmFtZQotCXRoYW4gInByaXZhdGl6ZSIuICBVcGRhdGUgYWxsIHJlZmVyZW5jZXMuCi0KLVRodSBPY3QgIDkgMTU6NTc6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy50ZXhpIChzdHJpcCk6IFJlbW92ZSBkdXBsaWNhdGUgLS10YXJnZXQuICBGcm9tIE1hcnR5Ci0JTGVpc25lciA8bGVpc25lckBzZHNwLm1jLnhlcm94LmNvbT4uCi0KLQkqIG5tLmMgKGxpbmVub19jYWNoZV9iZmQpOiBOZXcgZmlsZSBzdGF0aWMgdmFyaWFibGUuCi0JKGxpbmVub19jYWNoZV9yZWxfYmZkKTogTmV3IGZpbGUgc3RhdGljIHZhcmlhYmxlLgotCShkaXNwbGF5X2FyY2hpdmUpOiBDbGVhciBsaW5lbm9fY2FjaGVfYmZkIGFuZCBsaW5lbm9fY2FjaGVfcmVsX2JmZAotCXdoZW4gY2xvc2luZyBhIEJGRC4KLQkoZGlzcGxheV9maWxlKTogTGlrZXdpc2UuCi0JKHByaW50X3N5bWJvbCk6IFVzZSBsaW5lbm9fY2FjaGVfYmZkIGFuZCBsaW5lbm9fY2FjaGVfcmVsX2JmZAotCWluc3RlYWQgb2YgY2FjaGVfYmZkIGFuZCBjYWNoZV9yZWxfYmZkLiAgTWFrZSBzZWNjb3VudCBzdGF0aWMsIGFuZAotCW9ubHkgc2V0IGl0IHdoZW4gc2V0dGluZyByZWxvY3MuCi0KLVdlZCBPY3QgIDggMjE6MTk6MTEgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChrZWVwX3NwZWNpZmljX2xpc3QsIHByaXZhdGl6ZV9zcGVjaWZpY19saXN0LAotCXdlYWtlbl9zcGVjaWZpY19saXN0KTogTmV3IHZhcmlhYmxlcy4KLQkoa2VlcF9zeW1ib2xzKTogUmVtb3ZlZC4KLQkoYWRkX3NwZWNpZmljX3N5bWJvbCk6IE5ldyBmdW5jdGlvbiBmcm9tIHRoZSBjYXJjYXMgb2YKLQlhZGRfc3RyaXBfc3ltYm9sLiAgVGFrZXMgYSBsaXN0IGFzIGFuIGFyZ3VtZW50LgotCShpc19zcGVjaWZpZWRfc3ltYm9sKTogTGlrZXdpc2UgZnJvbSBpc19zdHJpcF9zeW1ib2wuCi0JKGZpbHRlcl9zeW1ib2xzKTogSG9ub3IgdGhlIG5ldyBwcml2YXRpemUgYW5kIHdlYWtlbiBsaXN0cy4KLQlPcHRpbWl6ZSBiZmRfYXN5bWJvbF9uYW1lIGhhbmRsaW5nLgotCShjb3B5X29iamVjdCwgY29weV9vcHRpb25zLCBjb3B5X3VzYWdlKTogQWRkIHByaXZhdGl6ZS1zeW1ib2wgJgotCXdlYWtlbi1zeW1ib2wgb3B0aW9ucy4KLQotCSogb2JqY29weS4xLCBiaW51dGlscy50ZXhpOiBVcGRhdGUgZG9jcy4KLQotU3VuIE9jdCAgNSAwOTowNTo0NCAxOTk3ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBNYWtlICItLXByZWZpeC1hZGRyZXNzZXMiCi0gCWRpc2Fzc2VtYmx5IGFkanVzdCB0byBtaXhlZC1sZW5ndGggaW5zdHJ1Y3Rpb25zLgotCShvYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0pOiBBZGQgIjB4IiBwcmVmaXggZm9yIGhleGFkZWNpbWFsCi0gCXN5bWJvbC1vZmZzZXRzIGluIGRpc2Fzc2VtYmx5LgotCi1GcmkgT2N0ICAzIDEyOjA0OjI1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChzZXRfdGltZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCByZXBsYWNpbmcKLQltYWtlX3NhbWVfZGF0ZXMuCi0JKHN0cmlwX21haW4pOiBJZiBwcmVzZXJ2ZV9kYXRlcywgc3RhdCB0aGUgaW5wdXQgZmlsZSBiZWZvcmUKLQljb3B5aW5nIGl0LCBhbmQgY2FsbCBzZXRfdGltZXMgYWZ0ZXJ3YXJkLgotCShjb3B5X21haW4pOiBMaWtld2lzZS4KLQotCSogd3JzdGFicy5jICh3cml0ZV9zdGFic19pbl9zZWN0aW9uc19kZWJ1Z2dpbmdfaW5mbyk6IENhc3QgcCB0bwotCWNoYXIgKiB3aGVuIGNhbGxpbmcgc3RyY3B5IGFuZCBzdHJsZW4uCi0KLVdlZCBTZXAgMjQgMTE6MzQ6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy50ZXhpCShhciBjbWRsaW5lKTogRG9jdW1lbnQgdGhhdCBxIG5vdyB3b3JrcyBsaWtlIHIuCi0JRnJvbSBNYXJ0eSBMZWlzbmVyIDxsZWlzbmVyQHNkc3AubWMueGVyb3guY29tPi4KLQotCSogYmludXRpbHMudGV4aSAoc2l6ZSk6IFRoZSBvYmplY3QgZmlsZSBhcmd1bWVudCBpcyBvcHRpb25hbC4KLQlGcm9tIE1hcnR5IExlaXNuZXIgPGxlaXNuZXJAc2RzcC5tYy54ZXJveC5jb20+LgotCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBBdWcgMjYgMTc6NDg6MzQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoRVhFRVhUX0ZPUl9CVUlMRCk6IE5ldyB2YXJpYWJsZS4gIFVzZSBpdCBpbiBhbGwKLQlyZWZlcmVuY2VzIHRvIHRoZSBzeXNpbmZvIHByb2dyYW0uCi0JKiBjb25maWd1cmUuaW46IFJlYnVpbGQgd2l0aCBuZXcgYmZkL2FjaW5jbHVkZS5tNC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgQXVnICA4IDE1OjMyOjQ5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd2luZHJlcy5jOiBJbmNsdWRlIDx0aW1lLmg+LgotCShkZWZpbmVfcmVzb3VyY2UpOiBTZXQgYSB0aW1lc3RhbXAgZm9yIHRoZSByZXNvdXJjZS4KLQotV2VkIEF1ZyAgNiAxMzozNzo1OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIFRBUkdFVCBpbiBoZWFkZXIgZmlsZS4KLQkqIGFjY29uZmlnLmggKFRBUkdFVCk6IEFkZCAjdW5kZWYuCi0JKiBNYWtlZmlsZS5hbSAodmVyc2lvbi5vLCBidWNvbW0ubyk6IFJlbW92ZSBzcGVjaWFsIHRhcmdldHMuCi0JKiBidWNvbW0uYyAodGFyZ2V0KTogUmVtb3ZlLgotCSogbm0uYyAocHJvZ3JhbV9uYW1lKTogRG9uJ3QgZGVjbGFyZS4KLQkodGFyZ2V0KTogTWFrZSBzdGF0aWMuCi0JKiBzaXplLmMgKHRhcmdldCk6IE1ha2Ugc3RhdGljLgotCSogY29uZmlndXJlLCBjb25maWcuaW4sIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgQXVnICA1IDAwOjAxOjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGNoZWNrLURFSkFHTlUpOiBFeHBvcnQgci4KLQkoLmRlcDEpOiBVc2UgJChJTkNMVURFUykgcmF0aGVyIHRoYW4gJChBTExfQ0ZMQUdTKS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBubG1oZWFkZXIueTogVXNlIFZFUlNJT05LIHJhdGhlciB0aGFuIFZFUlNJT04uCi0KLQkqIE1ha2VmaWxlLmFtIChTVFJJUF9QUk9HKTogQ2hhbmdlIGZyb20gc3RyaXAubmV3IHRvIHN0cmlwLW5ldy4KLQkoTk1fUFJPRyk6IENoYW5nZSBmcm9tIG5tLm5ldyB0byBubS1uZXcuCi0JKFRPT0xfUFJPR1MsIGluc3RhbGwtZXhlYy1sb2NhbCk6IEFkanVzdCBhY2NvcmRpbmdseS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gQXVnICA0IDExOjQ3OjMxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgQUNfQVJHX1BST0dSQU07IGl0J3MgaW52b2tlZCBieQotCUFNX0lOSVRfQVVUT01BS0UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBDcmVhdGUgJCh0b29sZGlyKS9iaW4gYmVmb3JlCi0JdHJ5aW5nIHRvIGluc3RhbGwgYW55dGhpbmcgaW50byBpdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5hbSAoVE9PTF9QUk9HUyk6IFVzZSBhbiBleHBsaWNpdCAkKEVYRUVYVCkuCi0JKGluc3RhbGwtZXhlYy1sb2NhbCk6IFdoZW4gaGFuZGxpbmcgJChub2luc3RfUFJPR1JBTVMpLCBvbmx5IHVzZQotCSQoRVhFRVhUKSBvbiB0aGUgaW5zdGFsbGVkIGZpbGUuICBXaGVuIGhhbmRsaW5nICQoVE9PTF9QUk9HUyksCi0JaGFuZGxlICQoRVhFRVhUKSBjb3JyZWN0bHkuCi0JKiBjb25maWd1cmUuaW46IEFkZCBhbiBleHBsaWNpdCAkKEVYRUVYVCkgd2hlbiBzdWJzdGl0dXRpbmcgZm9yCi0JdGhlIG5hbWUgb2YgYSBwcm9ncmFtIHRvIGJ1aWxkLgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZCB3aXRoIG5ldyBhdXRvbWFrZQotCXBhdGNoZXMuCi0KLQkqIGRlZmxleC5sLCBkZWZwYXJzZS55OiBVc2UgVkVSU0lPTksgcmF0aGVyIHRoYW4gVkVSU0lPTi4KLQkqIHJjbGV4LmwsIHJjcGFyc2UueTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5hbSAod2luZHJlc19TT1VSQ0VTKTogQWRkICQoQlVMSUJTKS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgQXVnICAxIDEzOjA4OjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNpbmNsdWRlLm00OiBJbmNsdWRlIGJmZC9hY2luY2x1ZGUubTQsIG5vdCBiZmQvYWNtYWNyb3MubTQuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotVGh1IEp1bCAzMSAxMTo1MTozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBOZXcgZmlsZSwgYmFzZWQgb24gb2xkIE1ha2VmaWxlLmluLgotCSogYWNpbmNsdWRlLm00OiBOZXcgZmlsZSwgZnJvbSBvbGQgYWNsb2NhbC5tNC4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBTV9JTklUX0FVVE9NQUtFIGFuZCBBTV9QUk9HX0xJQlRPT0wuICBSZW1vdmUKLQlzaGFyZWQgbGlicmFyeSBoYW5kbGluZzsgbm93IGhhbmRsZWQgYnkgbGlidG9vbC4gIFJlcGxhY2UKLQlBQ19DT05GSUdfSEVBREVSIHdpdGggQU1fQ09ORklHX0hFQURFUi4gIENhbGwgQUNfUFJPR19ZQUNDLAotCUFDX1BST0dfTEVYLCBBQ19ERUNMX1lZVEVTVCwgQU1fTUFJTlRBSU5FUl9NT0RFLCBBTV9DWUdXSU4zMiwgYW5kCi0JQU1fRVhFRVhULiAgUmVwbGFjZSBBQ19QUk9HX0lOU1RBTEwgd2l0aCBBTV9QUk9HX0lOU1RBTEwuICBSZW1vdmUKLQlzdGFtcC1oIGhhbmRsaW5nIGluIEFDX09VVFBVVC4KLQkqIGFjY29uZmlnLmg6IE1lbnRpb24gUEFDS0FHRSBhbmQgVkVSU0lPTi4KLQkqIHN0YW1wLWguaW46IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IE5vdyBidWlsdCB3aXRoIGF1dG9tYWtlLgotCSogYWNsb2NhbC5tNDogTm93IGJ1aWx0IHdpdGggYWNsb2NhbC4KLQkqIGNvbmZpZy5pbiwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JRnJvbSBUb24gdmFuIE92ZXJiZWVrIDx0dm92ZXJiZUB3ay5lc3RlYy5lc2Eubmw+OgotCSogcmNwYXJzZS55IChkaWFsb2cpOiBEZWZhdWx0IG1lbnUgYW5kIGNsYXNzIHRvIGJlIG5hbWVkLgotCShzdHlsZXMpOiBJZiBGT05UIGlzIHNlZW4sIHNldCBEU19TRVRGT05UIGluIGRpYWxvZyBzdHlsZS4KLQkqIHJlc2Jpbi5jIChyZXNfdG9fYmluX2RpYWxvZyk6IENvcnJlY3QgY29tcHV0YXRpb24gb2YgZm9udAotCWluZm9ybWF0aW9uIGxlbmd0aC4KLQotV2VkIEp1bCAzMCAxMToyMTowNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFRvbiB2YW4gT3ZlcmJlZWsgPHR2b3ZlcmJlQHdrLmVzdGVjLmVzYS5ubD46Ci0JKiByZXNiaW4uYyAocmVzX3RvX2Jpbl9tZW51KTogQ29ycmVjdCBjb21wdXRhdGlvbiBvZiBtZW51Ci0JdnMuIG1lbnVleCBsZW5ndGguCi0JKiByZXNyYy5jIChkZWZpbmVfc3RyaW5ndGFibGUpOiBBZGQgMSB0byByZXNvdXJjZSBJRC4KLQotVHVlIEp1bCAyOSAxMTowNjowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlc2Jpbi5jIChiaW5fdG9fcmVzX3N0cmluZyk6IENvcnJlY3QgYWRqdXN0bWVudCBvZiBkYXRhIGFuZAotCWxlbmd0aC4gIEZyb20gVG9uIHZhbiBPdmVyYmVlayA8dHZvdmVyYmVAd2suZXN0ZWMuZXNhLm5sPi4KLQotVHVlIEp1bCAyMiAxODowMToyMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG5sbWNvbnYuYyAobGlua19pbnB1dHMpOiBDYWxsIGxpYmliZXJ0eSBwZXhlY3V0ZSBmdW5jdGlvbi4KLQkocGV4ZWN1dGUpIFttdWx0aXBsZSB2ZXJzaW9uc106IFJlbW92ZS4KLQotVHVlIEp1bCAyMiAxNjoxOTozNCAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIGJ1Y29tbS5jIChtYWtlX3RlbXBuYW1lKTogSWYgd2UgbWlnaHQgYmUgdXNpbmcgYSBET1MgZmlsZXN5c3RlbSwKLQljaGVjayBmb3IgYSBiYWNrc2xhc2ggYXMgd2VsbCBhcyBhIHNsYXNoLgotCi1UaHUgSnVuIDI2IDEzOjUzOjE3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd2luZHJlcy5jIChtYWluKTogUXVpdCBpZiB3ZSBkaWRuJ3QgZ2V0IGFueSByZXNvdXJjZXMuCi0JKHVzYWdlKTogRml4IC0teXlkZWJ1ZyB1c2FnZSBtZXNzYWdlLgotCSogcmVzY29mZi5jICh3cml0ZV9jb2ZmX2ZpbGUpOiBEb24ndCBmcmVlIHRoZSByZWxvY2F0aW9uIGFycmF5Ci0JdW50aWwgYWZ0ZXIgd2UndmUgY2xvc2VkIHRoZSBCRkQuCi0JKHJlYWRfY29mZl9yc3JjKTogUXVpdCByYXRoZXIgdGhhbiB0cnkgdG8gcmVhZCBzdGFuZGFyZCBpbnB1dC4KLQkod3JpdGVfY29mZl9maWxlKTogUXVpdCByYXRoZXIgdGhhbiB0cnkgdG8gd3JpdGUgdG8gc3RhbmRhcmQKLQlvdXRwdXQuCi0JKiByY3BhcnNlLnk6IEFkZCBhIGNvdXBsZSBvZiBtaXNzaW5nIHNlbWljb2xvbnMgKGFjY2VwdGVkIGJ5IGJpc29uCi0JYnV0IG5vdCBieWFjYykuCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCB3aW5kcmVzLgotCi1XZWQgSnVuIDI1IDIwOjU3OjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVzYmluLmM6IE5ldyBmaWxlLgotCSogcmNsZXgubCwgcmNwYXJzZS55LCByZXNjb2ZmLmMsIHJlc3JjLmMsIHdpbmRyZXMuYywgd2luZHJlcy5oOgotCU51bWVyb3VzIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShDRklMRVMpOiBBZGQgcmVzYmluLmMuCi0JKFdJTkRSRVNfT0JKUyk6IEFkZCByZXNiaW4uby4KLQotU3VuIEp1biAyMiAxNzoyOTo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGaXJzdCBzdGFiIGF0IFdpbmRvd3MgcmVzb3VyY2UgY29tcGlsZXI6Ci0JKiB3aW5kcmVzLmg6IE5ldyBmaWxlLgotCSogd2luZHJlcy5jOiBOZXcgZmlsZS4KLQkqIHJlc3JjLmM6IE5ldyBmaWxlLgotCSogcmNwYXJzZS55OiBOZXcgZmlsZS4KLQkqIHJjbGV4Lmw6IE5ldyBmaWxlLgotCSogcmVzY29mZi5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIGFuZCBzdWJzdGl0dXRlIEJVSUxEX1dJTkRSRVMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShXSU5EUkVTX1BST0cpOiBOZXcgdmFyaWFibGUuCi0JKFBST0dTKTogQWRkIEBCVUlMRF9XSU5EUkVTQC4KLQkoSEZJTEVTKTogQWRkIGRsbHRvb2wuaCBhbmQgd2luZHJlcy5oLgotCShDRklMRVMpOiBBZGQgd2luZHJlcy5jIGFuZCByZXNyYy5jLgotCShHRU5FUkFURURfQ0ZJTEVTKTogQWRkIHJjcGFyc2UuYyBhbmQgcmNsZXguYy4KLQkoV0lORFJFU19PQkpTKTogTmV3IHZhcmlhYmxlLgotCSQoV0lORFJFU19QUk9HKTogTmV3IHRhcmdldC4KLQkocmNwYXJzZS5jLCByY3BhcnNlLmgsIHJjbGV4LmMpOiBOZXcgdGFyZ2V0cy4KLQotVGh1IEp1biAxMiAxMjoyNzo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZXhwb3J0X3R5cGUpOiBBZGQgZGF0YSBmaWVsZC4KLQkoZGVmX2V4cG9ydHMpOiBBZGQgZGF0YSBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGR1bXBfZGVmX2luZm8pOiBQcmludCBkYXRhIGZpZWxkLgotCShnZW5fZGVmX2ZpbGUpOiBMaWtld2lzZS4KLQkobWFrZV9vbmVfbGliX2ZpbGUpOiBIYW5kbGUgZGF0YSBmaWVsZCBieSBub3QgZW1pdHRpbmcgc2ltcGxlCi0JbGFiZWwgYW5kIG5vdCBlbWl0dGluZyBhbnl0aGluZyBpbiBTRUNfVEVYVC4KLQkoZHRhYik6IFByaW50IGRhdGEgZmllbGQuCi0JKHByb2Nlc3NfZHVwbGljYXRlcyk6IE1lcmdlIGRhdGEgZmllbGQuCi0JKiBkbGx0b29sLmggKGRlZl9leHBvcnRzKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogZGVmcGFyc2UueSAoZXhwbGluZSk6IEFjY2VwdCBvcHRfREFUQS4gIFBhc3MgaXQgdG8gZGVmX2V4cG9ydHMuCi0JKG9wdF9EQVRBKTogTmV3IG5vbi10ZXJtaW5hbC4KLQotV2VkIEp1biAxMSAxNzoxNTo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuaDogTmV3IGZpbGUuCi0JKiBkZWZsZXgubDogSW5jbHVkZSBkbGx0b29sLmggYW5kIGxpYmliZXJ0eS5oLiAgRG9uJ3QgZGVjbGFyZQotCXN0cmR1cC4gIFVzZSB4c3RyZHVwIHJhdGhlciB0aGFuIHN0cmR1cC4KLQkqIGRlZnBhcnNlLnk6IEluY2x1ZGUgYmZkLmgsIGJ1Y29tbS5oLCBhbmQgZGxsdG9vbC5oLgotCSogZGxsdG9vbC5jOiBJbmNsdWRlIGRsbHRvb2wuaCBhbmQgdGltZS5oLiAgTWFrZSBhIGxvdCBvZgotCXZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIHN0YXRpYy4gIE1ha2UgYSBsb3Qgb2YgY2hhciAqIHZhcmlhYmxlcwotCWFuZCBwYXJhbWV0ZXJzIGNvbnN0LiAgQWRkIGRlY2xhcmF0aW9ucyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4gIERvCi0Jc29tZSByZWluZGVudGluZy4gIEhpZGUgbW9yZSBQb3dlclBDIHN0dWZmIGluc2lkZSBETExUT09MX1BQQy4KLQotV2VkIEp1biAxMSAxMjowNTo1MiAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBhci5jIChiZmRfc3BlY2lhbF91bmRvY3VtZW50ZWRfZ2x1ZSk6IEFkZCBjb25zdC4KLQotTW9uIE1heSAxMiAyMjowOTozNSAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogUGFzcyBDQ19GT1JfVEFSR0VUIGFuZCBDRkxBR1NfRk9SX1RBUkdFVAotCXRvIHJ1bnRlc3QuCi0KLU1vbiBNYXkgMTIgMTM6MTQ6MjIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGNsZWFyIE9QQ09ERVMgd2hlbiAtLWVuYWJsZS1jb21tb25iZmRsaWIgaXMKLQl1c2VkIG9uIEhQL1VYLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgQXByIDI1IDE0OjIyOjA4IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbik6IENoYW5nZSAqLmluZm8qCi0JdG8gYmludXRpbHMuaW5mbyogdG8gc2F2ZSBzeXNyb2ZmLmluZm8uCi0KLVR1ZSBBcHIgMTUgMTM6NDI6MjIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCi0JKElOU1RBTExfWEZPUk0sIElOU1RBTExfWEZPUk0xKTogUmVtb3ZlLgotCShpbnN0YWxsKTogRGVwZW5kIHVwb24gaW5zdGFsbGRpcnMuICBVc2UgJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQotCWRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZyAkKElOU1RBTExfWEZPUk0pIGFuZAotCSQoSU5TVEFMTF9YRk9STTEpLgotCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCi0JKGluc3RhbGwtaW5mbyk6IFJ1biBta2luc3RhbGxkaXJzLgotCi1Nb24gQXByIDE0IDExOjUyOjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBDaGFuZ2UgaW5zdGFsbC5zaCB0byBpbnN0YWxsLXNoLgotCi0JRnJvbSBUaG9tYXMgR3JhaWNoZW4gPGdyYWljaGVuQHJ6cGQuZGU+OgotCSogTWFrZWZpbGUuaW46IEFsd2F5cyB1c2UgJChTSEVMTCkgd2hlbiBydW5uaW5nIG1vdmUtaWYtY2hhbmdlLgotCSogY29uZmlndXJlLmluOiBVc2UgJHtDT05GSUdfU0hFTEx9IHdoZW4gcnVubmluZyAkYWNfY29uZmlnX3N1Yi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEFwciAgNCAxMzoyODowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0ZVTkNfQUxMT0NBLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBidWNvbW0uaDogQWRkIGFsbG9jYSBoYW5kbGluZywgY29waWVkIGZyb20gZ2FzL2FzLmguCi0JKiBkbGx0b29sLmM6IEFkZCAjcHJhZ21hIGFsbG9jYSBmb3IgQUlYIHRvIHN0YXJ0IG9mIGZpbGUuCi0JKiBubG1jb252LmM6IExpa2V3aXNlLgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIHNpdGUuZXhwIGFuZCBzaXRlLmJhay4gIFJlbW92ZQotCWV2ZXJ5dGhpbmcgdGhhdCBjbGVhbiByZW1vdmVzLgotCi1UaHUgQXByICAzIDEzOjE4OjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBTZXQgdG8gMi44LjEuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOC4KLQotVHVlIEFwciAgMSAxNjoyMTo0NCAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlndXJlLmNvbTogTmV3IGZpbGUuCi0JKiBjb25maWcuaC12bXM6IFJlbW92ZSBmaWxlLgotCSogbWFrZWZpbGUudm1zOiBVcGRhdGUgZm9yIG5ldyBjb25maWd1cmUgc2NoZW1lLgotCi1Nb24gTWFyIDMxIDE1OjMwOjQzIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIG9iamNvcHkuYyAobWFrZV9zYW1lX2RhdGVzKTogVXNlIHN0YXRidWYsIG5vdCBidWYsIGlmIG5vdAotCUhBVkVfR09PRF9VVElNRV9ILgotCi1GcmkgTWFyIDI4IDE3OjU3OjUzIDE5OTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogTWFrZWZpbGUuaW4gKCQoT0JKRFVNUF9QUk9HKSk6IERvbid0IGxpbmsgYWdhaW5zdCBCRkRMSUIgdHdpY2UuCi0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19BUkdfRU5BQkxFIGZvciBjb21tb25iZmRsaWIuICBJZiBpdCBpcyBzZXQsCi0Jc2V0IE9QQ09ERVMgdG8gZW1wdHkuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBNYXIgMjcgMTY6MDM6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBNYXJ0eSBMZWlzbmVyIDxsZWlzbmVyQHNkc3AubWMueGVyb3guY29tPjoKLQkqIG9iamNvcHkuYzogSW5jbHVkZSA8dXRpbWUuaD4gb3IgPHN5cy90aW1lLmg+LgotCShzdHJpcF9vcHRpb25zKTogQWRkICJwcmVzZXJ2ZS1kYXRlcyIuCi0JKGNvcHlfb3B0aW9ucyk6IExpa2V3aXNlLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtcCBhbmQgLS1wcmVzZXJ2ZS1kYXRlcy4KLQkoc3RyaXBfdXNhZ2UpOiBMaWtld2lzZS4KLQkobWFrZV9zYW1lX2RhdGVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3RyaXBfbWFpbik6IEhhbmRsZSAtcC4KLQkoY29weV9tYWluKTogTGlrZXdpc2UuCi0JKiBiaW51dGlscy50ZXhpLCBzdHJpcC4xLCBvYmpjb3B5LjE6IERvY3VtZW50IG5ldyBvcHRpb24uCi0KLQlhZGRyMmxpbmUuYyBjb250cmlidXRlZCBieSBVbHJpY2ggTGF1dGhlcgotCTxVbHJpY2guTGF1dGhlckB6ZmUuc2llbWVucy5kZT46Ci0JKiBhZGRyMmxpbmUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShBRERSMkxJTkVfUFJPRyk6IE5ldyB2YXJpYWJsZS4KLQkoTUFOUEFHRVMpOiBBZGQgYWRkcjJsaW5lLgotCShQUk9HUyk6IEFkZCAkKEFERFIyTElORV9QUk9HKS4KLQkoQ0ZJTEVTKTogQWRkIGFkZHIybGluZS5jLgotCSgkKEFERFIyTElORV9QUk9HKSk6IE5ldyB0YXJnZXQuCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCBhZGRyMmxpbmUuCi0JKiBhZGRyMmxpbmUuMTogTmV3IGZpbGUuCi0KLQkqIHZlcnNpb24uYyAocHJpbnRfdmVyc2lvbik6IFVwZGF0ZSBjb3B5cmlnaHQgZGF0ZS4KLQotTW9uIE1hciAyNCAxMDo1Mjo0NSAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogRG9uJ3QgZXhpdCBpZiBhIGZpbGUgY2Fubm90IGJlCi0JZGlzYXNzZW1ibGVkLCBpbnN0ZWFkIGp1c3QgcmV0dXJuLgotCi1UaHUgTWFyIDIwIDIxOjE2OjUxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2l6ZS5jICh1c2FnZSk6IE1ha2UgZGVmaW5pdGlvbiBtYXRjaCBpdHMgcHJvdG90eXBlLgotCShkaXNwbGF5X2JmZCwgbHByaW50X251bWJlciwgcnByaW50X251bWJlcik6IExpa2V3aXNlLgotCShwcmludF9iZXJrZWxleV9mb3JtYXQsIHN5c3ZfaW50ZXJuYWxfcHJpbnRlcik6IExpa2V3aXNlLgotCShwcmludF9zeXN2X2Zvcm1hdCk6IExpa2V3aXNlLgotCSogbm0uYyAoc2V0X3ByaW50X3JhZGl4LCBzZXRfb3V0cHV0X2Zvcm1hdCk6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChmaWx0ZXJfYnl0ZXMpOiBMaWtld2lzZS4KLQotVHVlIE1hciAxOCAxNjozOTo1NSAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogTWFueSBmaWxlczogQWRkIGZ1bmN0aW9uIHByb3RvdHlwZXMuCi0JKiBhci5jIChtcmlfZW11bCwgZ2V0X3Bvc19iZmQpOiBNYWtlIHN0YXRpYy4KLQkqIGFybGV4Lmw6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4gIERvbid0IGRlY2xhcmUgc3RyZHVwLiAgVXNlCi0JeHN0cmR1cCByYXRoZXIgdGhhbiBzdHJkdXAuCi0JKiBhcnBhcnNlLnkgKHl5ZXJyb3IpOiBNYWtlIGFyZ3VtZW50IGNvbnN0LiAgQ29ycmVjdCB0eXBvLgotCSogYXJzdXAuYyAoc3RyZHVwKTogRG9uJ3QgZGVjbGFyZS4KLQkoYXJfc2F2ZSk6IFVzZSB4c3RyZHVwIHJhdGhlciB0aGFuIHN0cmR1cC4KLQkqIGZpbGVtb2RlLmM6IEluY2x1ZGUgImJ1Y29tbS5oIi4KLQkqIG5tLmMgKHVzYWdlKTogTWFrZSBzdGF0aWMuCi0JKHByaW50X3N5bW5hbWUpOiBNYWtlIGZvcm1hdCBhbmQgbmFtZSBjb25zdC4KLQkqIG9iamNvcHkuYyAoY2F0KTogUmVtb3ZlLgotCShjb3B5X2FyY2hpdmUpOiBNYWtlIG91dHB1dF90YXJnZXQgY29uc3QuICBVc2UgY29uY2F0LCBub3QgY2F0LgotCShjb3B5X2ZpbGUsIHNpbXBsZV9jb3B5LCBzbWFydF9yZW5hbWUpOiBNYWtlIGFyZ3VtZW50cyBjb25zdC4KLQkqIG9iamR1bXAuYyAocmVhZF9zZWN0aW9uX3N0YWJzKTogTGlrZXdpc2UuCi0JKHByaW50X3NlY3Rpb25fc3RhYnMpOiBMaWtld2lzZS4KLQkoZGlzcGxheV90YXJnZXRfdGFibGVzKTogRG9uJ3QgZGVjbGFyZSBnZXRlbnYuCi0JKiBzdHJpbmdzLmMgKHN0cmluZ3Nfb2JqZWN0X2ZpbGUpOiBDaGFuZ2UgZmlsZSB0byBjb25zdC4KLQkocHJpbnRfc3RyaW5ncyk6IENoYW5nZSBmaWxlbmFtZSB0byBjb25zdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotVHVlIE1hciAxOCAxMTozNzoyNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEJGRF9ORUVEX0RFQ0xBUkFUSU9OKGdldGVudikuCi0JKiBhY2NvbmZpZy5oOiBBZGQgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYuCi0JKiBidWNvbW0uaCAoZ2V0ZW52KTogRGVjbGFyZSBpZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogbmxtY29udi5jIChnZXRlbnYpOiBEb24ndCBkZWNsYXJlLgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLVNhdCBNYXIgMTUgMTU6MzU6NTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEphbWllIExva2llciA8amFtaWVAcmViZWxsaW9uLmNvLnVrPjoKLQkqIG9iamR1bXAuYzogSW5jbHVkZSAiZGVtYW5nbGUuaCIuCi0JKGRvX2RlbWFuZ2xlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkodXNhZ2UpOiBNZW50aW9uIC1DLy0tZGVtYW5nbGUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAiZGVtYW5nbGUiLgotCShvYmpkdW1wX3ByaW50X3N5bW5hbWUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShvYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0pOiBVc2Ugb2JqZHVtcF9wcmludF9zeW1uYW1lLgotCShkaXNhc3NlbWJsZV9ieXRlcyk6IExpa2V3aXNlLgotCShkdW1wX3JlbG9jX3NldCk6IExpa2V3aXNlLgotCShkdW1wX3N5bWJvbHMpOiBEZW1hbmdsZSBzeW1ib2wgbmFtZS4KLQkobWFpbik6IEhhbmRsZSAtQy4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLUMvLS1kZW1hbmdsZS4KLQotCSogb2JqZHVtcC5jICh1c2FnZSk6IE1lbnRpb24gLS1uby1zaG93LXJhdy1pbnNuLgotCShsb25nX29wdGlvbnMpOiBBZGQgIm5vLXNob3ctcmF3LWluc24iLgotCShkaXNhc3NlbWJsZV9ieXRlcyk6IEhhbmRsZSAtLW5vLXNob3ctcmF3LWluc24uCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC0tbm8tc2hvdy1yYXctaW5zbi4KLQotV2VkIE1hciAxMiAxMTo0MjowMCAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogcmRkYmcuYyAoZnJlZV9zYXZlZF9zdGFicyk6IFNldCB0aGUgc3RyaW5ncyB0byBOVUxMIGFmdGVyIGJlaW5nCi0JZnJlZWQuCi0KLUZyaSBGZWIgMjggMTc6MTg6NDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBidWNvbW0uYyAoc2V0X2RlZmF1bHRfYmZkX3RhcmdldCk6IE5ldyBmdW5jdGlvbi4KLQkqIGJ1Y29tbS5oIChzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0KTogRGVjbGFyZS4KLQkqIGFyLmMgKG1haW4pOiBDYWxsIHNldF9kZWZhdWx0X2JmZF90YXJnZXQuCi0JKiBubG1jb252LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG5tLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG9iamNvcHkuYyAobWFpbik6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzaXplLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHN0cmluZ3MuYyAobWFpbik6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW4gKGJ1Y29tbS5vKTogTmV3IHRhcmdldCwgdG8gZGVmaW5lIFRBUkdFVC4KLQotVHVlIEZlYiAyNSAyMToyODozOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoYWRqdXN0X3NlY3Rpb25fdm1hKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkodXNhZ2UpOiBNZW50aW9uIC0tYWRqdXN0LXNlY3Rpb24tdm1hLgotCShPUFRJT05fQURKVVNUX1ZNQSk6IERlZmluZS4KLQkobG9uZ19vcHRpb25zKTogQWRkICJhZGRqdXN0LXZtYSIuCi0JKGRpc3BsYXlfYmZkKTogSWYgYWRqdXN0X3NlY3Rpb25fdm1hIGlzIG5vdCAwLCBhZGQgaXQgdG8gYWxsIHRoZQotCXNlY3Rpb24gYWRkcmVzc2VzLgotCShtYWluKTogSGFuZGxlIE9QVElPTl9BREpVU1RfVk1BLgotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtLWFkanVzdC12bWEuCi0KLUZyaSBGZWIgMTQgMTg6NDY6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBubS5jIChwcmludF9zeW1ib2wpOiBDYWNoZSB0aGUgQkZEIGFzIHdlbGwgYXMgdGhlIHN5bWJvbHMgYW5kCi0gCXJlbG9jcywgYW5kIGRvbid0IHRyeSB0byB1c2UgdGhlIHN5bWJvbHMgb3IgcmVsb2NzIHdpdGggYQotIAlkaWZmZXJlbnQgQkZELgotCi1UaHUgRmViIDEzIDIxOjM0OjQzIDE5OTcgIEtsYXVzIEthZW1wZiAgKGtrYWVtcGZAcHJvZ2lzLmRlKQotCi0JKiBjb25maWcuaC12bXM6IHNicmsoKSBpcyBwcm92aWRlZCBvbiBvcGVuVk1TL0FscGhhLgotCSogbWFrZWZpbGUudm1zOiBhbGxvdyBjb21waWxpbmcgd2l0aCBjdXJyZW50IGdjYyBzbmFwc2hvdC4KLQotVGh1IEZlYiAxMyAyMDoxNDo0MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyc3VwLmMsIGNvZmZncm9rLmMsIGRsbHRvb2wuYywgbmxtY29udi5jOiBVc2UgeG1hbGxvYyByYXRoZXIKLQl0aGFuIG1hbGxvYy4KLQotV2VkIEZlYiAxMiAxNjoxMjowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IENvcnJlY3QgVk1BIGFyZ3VtZW50IHRvCi0JZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MuICBJbXByb3ZlIGhhbmRsaW5nIG9mIGNvZGUgd2l0aCBubyBzeW1ib2wKLQlmb2xsb3dlZCBieSBjb2RlIHdpdGggYSBzeW1ib2wuCi0KLVdlZCBGZWIgMTIgMTI6MTY6NDcgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBNYWtlIG91dHB1dCBvZiByYXcgaW5zdHJ1Y3Rpb25zCi0Jd29yayBiZXR0ZXIgZm9yIG5vbi1zdGFuZGFyZCB2YWx1ZXMgb2YgYnl0ZXNfcGVyX2NodW5rIGFuZAotCWJ5dGVzX3Blcl9saW5lLgotCi1UaHUgRmViICA2IDE0OjE0OjU5IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogQWRkZWQgY29kZSB0byBhbGxvdyBzb21lIGNvbnRyb2wKLSAJb3ZlciB0aGUgd2F5IHJhdyBpbnN0cnVjdGlvbnMgYXJlIGRpc3BsYXllZC4KLQotVGh1IEZlYiAgNiAxMjozNjowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHN0cnVjdCBiaW5jbF9maWxlKTogQWRkIG5leHRfc3RhY2sgZmllbGQuCi0JKHB1c2hfYmluY2wpOiBQdXQgdGhlIG5ldyBmaWxlIG9uIGJvdGggYmluY2xfbGlzdCBhbmQKLQliaW5jbF9zdGFjay4gIENsZWFyIHRoZSBmaWxlX3R5cGVzIGZpZWxkLgotCShwb3BfYmluY2wpOiBVc2UgdGhlIG5leHRfc3RhY2sgZmllbGQgd2hlbiBwb3BwaW5nIHRoZSBzdGFjay4KLQlEb24ndCBwdXQgdGhlIGZpbGUgb24gYmluY2xfbGlzdC4KLQkoZmluZF9leGNsKTogSW5jbHVkZSB0aGUgZmlsZSBuYW1lIHdoZW4gd2FybmluZyBhYm91dCBhbiB1bmZvdW5kCi0JTl9FWENMLgotCi0JKiBkZWJ1Zy5jIChkZWJ1Z190eXBlX3NhbWVwKTogRG9uJ3QgY3Jhc2ggaWYgd2UgYXJlIHBhc3NlZCBOVUxMLgotCi1UaHUgRmViICA2IDExOjU0OjI0IDE5OTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogb2JqY29weS4xOiBBZGQgbWlzc2luZyBzcGFjZSBhZnRlciAuQi4KLQotRnJpIEphbiAzMSAxMDozMzowNyAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogSW5pdGlhbGl6ZSBgYXV4LnJlcXVpcmVfc2VjJy4KLQotV2VkIEphbiAyOSAxMzoyMToyMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF92YWx1ZSk6IEFkZCBza2lwX3plcm9lcyBwYXJhbWV0ZXIuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShvYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0pOiBMaWtld2lzZS4gIENhbGwgb2JqZHVtcF9wcmludF92YWx1ZQotCXRvIHByaW50IGFkZHJlc3MuCi0JKG9iamR1bXBfcHJpbnRfYWRkcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IEp1c3QgY2FsbCBvYmpkdW1wX3ByaW50X2FkZHIuCi0JKGRpc2Fzc2VtYmxlX2J5dGVzKTogUHJpbnQgcmVhbCBhZGRyZXNzLCBub3QgZnVuY3Rpb24gb2Zmc2V0LgotCVNraXAgYSBjZXJ0YWluIG51bWJlciBvZiBsZWFkaW5nIHplcm9lcy4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV96ZXJvZXMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCSh1c2FnZSk6IE1lbnRpb24gLS1kaXNhc3NlbWJsZS16ZXJvZXMuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAiZGlzYXNzZW1ibGUtemVyb2VzIi4KLQkoZGlzYXNzZW1ibGVfYnl0ZXMpOiBDaGVjayBkaXNhc3NlbWJsZV96ZXJvZXMuCi0KLVR1ZSBKYW4gMjggMTY6NDc6MjYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogRG9uJ3Qgc2tpcCB6ZXJvZXMgaWYgdGhlCi0JZGlzYXNzZW1ibGVyIGhhcyB0b2xkIHVzIHRoYXQgd2UgYXJlIGluIGEgYnJhbmNoIGRlbGF5IHNsb3QuCi0KLU1vbiBKYW4gMjAgMTQ6MjQ6MDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzaXplLmMgKGJlcmtlbGV5X3N1bSk6IFJld3JpdGUuICBTa2lwIHNlY3Rpb25zIHdoaWNoIGFyZSBub3QKLQlTRUNfQUxMT0MuICBDb3VudCBTRUNfUkVBRE9OTFkgc2VjdGlvbnMgYXMgdGV4dC4KLQotVHVlIEphbiAxNCAxNToxNDoxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbik6IFJlbW92ZSAqLmluZm8qLCBub3QKLQlqdXN0ICouaW5mby4gIEZyb20gSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4uCi0KLVR1ZSBEZWMgMzEgMTU6NDI6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0NGTEFHUyk6IEFkZCAtRF9HTlVfU09VUkNFLgotCi1GcmkgRGVjIDI3IDExOjE5OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBXb3JrIGFyb3VuZCBidWcgaW4gQUNfRlVOQ19WRk9SSyBpbiBhdXRvY29uZiAyLjEyLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgRGVjIDE5IDEzOjExOjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gQW5kcmV3IEogS2xvc3NuZXIgPGFuZHJld0Bwb2dvLnd2LnRlay5jb20+OgotCSogb2JqY29weS5jIChPUFRJT05fV0VBS0VOKTogRGVmaW5lLgotCShjb3B5X29wdGlvbnMpOiBBZGQgIndlYWtlbiIuCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0td2Vha2VuLgotCSh3ZWFrZW4pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShmaWx0ZXJfc3ltYm9scyk6IEhhbmRsZSB3ZWFrZW4uCi0JKGNvcHlfb2JqZWN0KTogQ2FsbCBmaWx0ZXJfc3ltYm9scyBpZiB3ZWFrZW4uCi0JKGNvcHlfbWFpbik6IEhhbmRsZSBPUFRJT05fV0VBS0VOLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBEb2N1bWVudCAtLXdlYWtlbi4KLQotV2VkIERlYyAxOCAyMjo0OToxMyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogVXNlIE5ld0ZvbGRlclJlY3Vyc2l2ZSBmb3IgaW5zdGFsbGF0aW9uLgotCi1TYXQgRGVjICA3IDEwOjE3OjI1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBBZGQgImVsc2UgdHJ1ZSIgY2xhdXNlIHRvIGNhdGVyIHRvCi0JYnJva2VuICJtYWtlIiBvbiBzb21lIHN5c3RlbXMuCi0KLUZyaSBEZWMgIDYgMTc6MjE6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKHBhcnNlX2llZWVfYmIpOiBBbHdheXMgaW5pdGlhbGl6ZSBuYW1jb3B5IHRvIGF2b2lkIGdjYwotCXdhcm5pbmcgYWJvdXQgdW5pbml0aWFsaXplZCB2YXJpYWJsZS4KLQkoaWVlZV9yZWFkX2N4eF9jbGFzcyk6IExpa2V3aXNlLCBmb3IgcGYuCi0JKGllZWVfZW51bV90eXBlKTogTGlrZXdpc2UsIGZvciBpLgotCi1UdWUgTm92IDI2IDE3OjAxOjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JzdGFicy5jIChzdGFiX2FycmF5X3R5cGUpOiBBZGQgY2FzdHMgd2hlbiBwcmludGluZwotCWJmZF9zaWduZWRfdm1hIHZhbHVlcy4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMi4KLQotTW9uIE5vdiAyNSAxNjo1MzoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IERvbid0IGNyYXNoIGlmIHRoZXJlIGlzIG5vCi0Jc3ltYm9sLgotCi1GcmkgTm92IDIyIDE3OjI5OjE0IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBhci5jIChvcGVuX2luYXJjaCk6IERvbid0IGNhbGwgYmZkX29wZW5yIHdpdGggYSBudWxsIG5hbWUuCi0KLUZyaSBOb3YgIDEgMTI6MDg6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy50ZXhpOiBBZGQgc2VjdGlvbiBvbiByZXBvcnRpbmcgYnVncy4KLQotVGh1IE9jdCAzMSAxODoyMDo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX2hhbmRsZSk6IEFkZCBiaW5jbF9saXN0IGZpZWxkLgotCShwYXJzZV9zdGFiKTogUGFzcyB2YWx1ZSB0byBwdXNoX2JpbmNsLiAgQ2FsbCBmaW5kX2V4Y2wgZm9yCi0JTl9FWENMLgotCShzdHJ1Y3QgYmluY2xfZmlsZSk6IEFkZCBoYXNoLCBmaWxlIGFuZCBmaWxlX3R5cGVzIGZpZWxkcy4KLQkocHVzaF9iaW5jbCk6IEFkZCBoYXNoIHBhcmFtZXRlci4gIFNhdmUgaXQgaW4gdGhlIG5ldyBoYXNoIGZpZWxkLgotCVNhdmUgdGhlIGZpbGUgbnVtYmVyIGluIHRoZSBuZXcgZmlsZSBmaWVsZC4KLQkocG9wX2JpbmNsKTogUHV0IHRoZSBiaW5jbF9maWxlIG9uIGJpbmNsX2xpc3QsIHJhdGhlciB0aGFuIGZyZWVpbmcKLQlpdC4gIFNhdmUgdGhlIGZpbGUgdHlwZXMgaW4gdGhlIG5ldyBmaWxlX3R5cGVzIGZpZWxkLgotCShmaW5kX2V4Y2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBpZWVlLmMgKGllZWVfbGluZW5vKTogRG9uJ3QgY29tcGFyZSBsaW5lIG51bWJlciBhZGRyZXNzZXMgdG8KLQlpbmZvLT5oaWdoYWRkciAodW5kbyBwYXJ0IG9mIE9jdG9iZXIgMjggcGF0Y2gpLgotCi1UdWUgT2N0IDI5IDE2OjQwOjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X3ZhbHVlKTogRG9uJ3QgcHJpbnQgdGhlIGVtcHR5IHN0cmluZwotCWZvciB6ZXJvLgotCi1Nb24gT2N0IDI4IDE2OjU4OjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoc3RydWN0IHN0YWJfaGFuZGxlKTogQWRkIGZ1bmN0aW9uX2VuZCBmaWVsZC4KLQkoc3RhcnRfc3RhYik6IEluaXRpYWxpemUgZnVuY3Rpb25fZW5kLgotCShmaW5pc2hfc3RhYik6IFBhc3MgaW5mby0+ZnVuY3Rpb25fZW5kIHRvIGRlYnVnX2VuZF9mdW5jdGlvbi4KLQkocGFyc2Vfc3RhYik6IElmIGluZm8tPmZ1bmN0aW9uX2VuZCBpcyBzZXQsIHVzZSBpdCBhcyB0aGUgYWRkcmVzcwotCXdoaWNoIGVuZHMgYSBmdW5jdGlvbi4KLQotCSogaWVlZS5jIChpZWVlX2FycmF5X3R5cGUpOiBSZW1lbWJlciB0aGUgY29ycmVjdCBzaXplLgotCi0JKiBpZWVlLmMgKGllZWVfZmluaXNoX2NvbXBpbGF0aW9uX3VuaXQpOiBQZXJtaXQgY29hbGVzY2luZyByYW5nZXMKLQl0aGF0IGFyZSB1cCB0byAweDEwMDAgYnl0ZXMgYXBhcnQsIG5vdCBqdXN0IDY0LgotCShpZWVlX2FkZF9iYjExX2Jsb2Nrcyk6IERvbid0IGJvdGhlciB0byBlbWl0IGEgQkIxMSB0aGF0IGlzIGxlc3MKLQl0aGFuIDB4MTAwIGJ5dGVzLgotCShpZWVlX2xpbmVubyk6IE9ubHkgZW1pdCBsaW5lIG51bWJlcnMgdGhhdCBhcmUgbGVzcyB0aGFuCi0JaW5mby0+aGlnaGFkZHIuCi0KLUZyaSBPY3QgMjUgMTI6MTI6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX2RlZmluZWRfZW51bSk6IEFkZCBkZWZpbmVkIGZpZWxkLgotCShpZWVlX2VudW1fdHlwZSk6IElmIHRoZSBlbnVtIHRhZyBoYXMgYmVlbiBzZWVuIGJlZm9yZSBidXQgbm90Ci0JZGVmaW5lZCwgcmV1c2UgdGhlIHNhbWUgdHlwZSBpbmRleCwgYW5kIGRlZmluZSBpdC4KLQkoaWVlZV90YWdfdHlwZSk6IElmIHRoaXMgZW51bSBoYXMgbm90IGJlZW4gZGVmaW5lZCwgYWRkIGFuCi0JdW5kZWZpbmVkIGVudHJ5IHRvIHRoZSBsaXN0IG9mIGVudW1zLgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogTGV0IHRoZSBkaXNhc3NlbWJsZXIgb3ZlcnJpZGUgdGhlCi0JbnVtYmVyIG9mIGJ5dGVzIHByaW50ZWQgb24gYSBsaW5lLgotCi1UaHUgT2N0IDI0IDE2OjQyOjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChwcmVmaXhfYWRkcmVzc2VzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobG9uZ19vcHRpb25zKTogQWRkICJwcmVmaXgtYWRkcmVzc2VzIi4KLQkoY29tcGFyZV9zeW1ib2xzKTogU29ydCBCU0ZfRlVOQ1RJT04gc3ltYm9scyBiZWZvcmUgb3RoZXIKLQlzeW1ib2xzLgotCShmaW5kX3N5bWJvbF9mb3JfYWRkcmVzcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQlvYmpkdW1wX3ByaW50X2FkZHJlc3MuCi0JKG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQlvYmpkdW1wX3ByaW50X2FkZHJlc3MuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IENhbGwgbmV3IGZ1bmN0aW9ucy4KLQkoZGlzYXNzZW1ibGVfYnl0ZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JZGlzYXNzZW1ibGVfZGF0YS4gIENoYW5nZSBkaXNhc3NlbWJseSBmb3JtYXQsIHVubGVzcwotCXByZWZpeF9hZGRyZXNzZXMgaXMgc2V0LgotCShkaXNhc3NlbWJsZV9kYXRhKTogQ2FsbCBkaXNhc3NlbWJsZV9ieXRlcy4gIFVubGVzcwotCXByZWZpeF9hZGRyZXNzZXMgaXMgc2V0LCBkaXNhc3NlbWJsZSBpbiBjaHVua3MgaGVhZGVkIGJ5IGEKLQlzeW1ib2wuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC0tcHJlZml4LWFkZHJlc3Nlcy4KLQotCSogcmRkYmcuYyAocmVhZF9zZWN0aW9uX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogUHJlc2VydmUgdGhlCi0JYmFja3NsYXNoIHdoZW4gY29uY2F0ZW5hdGluZyBtdWx0aXBsZSBzdGFicyBzdHJpbmdzLgotCi1UaHUgT2N0IDEwIDExOjM2OjMxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoc2Nhbl9vcGVuX29ial9maWxlKTogRml4IGxvb3AgZXhpdCB0ZXN0LgotCUFkZCBtaXNzaW5nIHBhcmFtZXRlciB0byBkZWZfZXhwb3J0cy4KLQotVHVlIE9jdCAgOCAxMjowNjoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChMRVhfT1BUSU9OUyk6IFNldCB0byBlbXB0eSBzdHJpbmcuICAtSSAtQ2VtIGlzIHRoZQotCWRlZmF1bHQgZm9yIGZsZXgsIGFuZCBpcyBub3QgcmVjb2duaXplZCBieSBsZXguCi0KLVRodSBPY3QgIDMgMTc6NDE6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy50ZXhpIChUYXJnZXQgU2VsZWN0aW9uKTogRG9jdW1lbnQgdGhhdCB5b3UgY2FuIG5vdwotCXNwZWNpZnkgdGFyZ2V0cyB1c2luZyBjb25maWd1cmF0aW9uIHRyaXBsZXRzLgotCi0JKiBhci5jICh1c2FnZSk6IERlY2xhcmUuICBNYWtlIHN1cmUgYWxsIGNhbGxlcnMgcGFzcyBhbiBhcmd1bWVudC4KLQotVGh1IE9jdCAgMyAxNTozOTo0MiAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiBSZW1vdmUgY29uZmlnLmxvZy4KLQotV2VkIE9jdCAgMiAxNTo0OToxNiAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBCdW1wIHZlcnNpb24gZGF0ZS4KLQotVHVlIE9jdCAgMSAxNTowMDo1OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHZlcnNpb24uYyAocHJpbnRfdmVyc2lvbik6IE5ldyBmdW5jdGlvbi4KLQkqIGJ1Y29tbS5oIChwcmludF92ZXJzaW9uKTogRGVjbGFyZS4KLQkqIGFyLmMgKHByb2dyYW1fdmVyc2lvbik6IERvbid0IGRlY2xhcmUuCi0JKGRvX3Nob3dfdmVyc2lvbik6IFJlbW92ZS4KLQkodXNhZ2UpOiBBZGQgaGVscCBwYXJhbWV0ZXIuICBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKG1haW4pOiBTZXQgaXNfcmFubGliIGF0IHN0YXJ0LiAgQ2hlY2sgZm9yIC0taGVscCBhbmQgLS12ZXJzaW9uLgotCUNhbGwgcHJpbnRfdmVyc2lvbiwgbm90IGRvX3Nob3dfdmVyc2lvbi4KLQkqIG5sbWNvbnYuYyAocHJvZ3JhbV92ZXJzaW9uKTogRG9uJ3QgZGVjbGFyZS4KLQkobWFpbik6IENhbGwgcHJpbnRfdmVyc2lvbi4KLQkoc2hvd191c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkqIG5tLmMgKHByb2dyYW1fdmVyc2lvbiwgcHJpbnRfdmVyc2lvbik6IERvbid0IGRlY2xhcmUuCi0JKHVzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCShtYWluKTogQ2FsbCBwcmludF92ZXJzaW9uLgotCSogb2JqY29weS5jIChwcm9ncmFtX3ZlcnNpb24pOiBEb24ndCBkZWNsYXJlLgotCShjb3B5X3VzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCShzdHJpcF91c2FnZSk6IExpa2V3aXNlLgotCShzdHJpcF9tYWluKTogQ2FsbCBwcmludF92ZXJzaW9uLgotCShjb3B5X21haW4pOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAocHJvZ3JhbV92ZXJzaW9uKTogRG9uJ3QgZGVjbGFyZS4KLQkodXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKG1haW4pOiBDYWxsIHByaW50X3ZlcnNpb24uCi0JKiBzaXplLmMgKHByb2dyYW1fdmVyc2lvbik6IERvbid0IGRlY2xhcmUuCi0JKHVzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCShtYWluKTogQ2FsbCBwcmludF92ZXJzaW9uLgotCSogc3RyaW5ncy5jIChwcm9ncmFtX3ZlcnNpb24pOiBEb24ndCBkZWNsYXJlLgotCShtYWluKTogQ2FsbCBwcmludF92ZXJzaW9uLgotCSh1c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGUgZGVwZW5kZW5jaWVzLgotCi1UaHUgU2VwIDE5IDE0OjUzOjE1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jOiBSZXZlcnQgTW9uZGF5J3MgcmVmbG9jYWxwIHBhdGNoLCBhbmQgYXBwbHkgdGhpcyBwYXRjaAotCWluc3RlYWQ6Ci0gCSh3cml0ZV9pZWVlX2RlYnVnZ2luZ19pbmZvKTogV3JpdGUgYSBkdW1teSB0eXBlIGF0IHRoZSBlbmQgb2YgdGhlCi0JZ2xvYmFsIHR5cGUgYmxvY2suCi0KLU1vbiBTZXAgMTYgMTU6MzA6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX3dyaXRlX3R5cGUpOiBBZGQgcmVmbG9jYWxwIGZpZWxkLgotCShpZWVlX3BvaW50ZXJfdHlwZSk6IFNldCByZWZsb2NhbHAgYWZ0ZXIgcHVzaGluZyB0eXBlLgotCShpZWVlX2Z1bmN0aW9uX3R5cGUpOiBJZiByZWZsb2NhbHAgaXMgc2V0LCBtYWtlIHRoaXMgdHlwZSBsb2NhbC4KLQkoaWVlZV9yYW5nZV90eXBlLCBpZWVlX2FycmF5X3R5cGUsIGllZWVfc2V0X3R5cGUpOiBMaWtld2lzZS4KLQkoaWVlZV9jb25zdF90eXBlLCBpZWVlX3ZvbGF0aWxlX3R5cGUpOiBMaWtld2lzZS4KLQkoaWVlZV9zdHJ1Y3RfZmllbGQsIGllZWVfY2xhc3NfYmFzZWNsYXNzKTogTGlrZXdpc2UuCi0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfaW5mbyk6IEFkZCBnbG9iYWxfdHlwZXMgZmllbGQuCi0JKHBhcnNlX2llZWVfYmIpOiBXaGVuIHN0YXJ0aW5nIGEgQkIxLCBpbml0aWFsaXplIHRoZSB0eXBlcyBmaWVsZAotCXRvIHRoZSBnbG9iYWxfdHlwZXMgZmllbGQuCi0JKHBhcnNlX2llZWVfYmUpOiBXaGVuIGVuZGluZyBhIEJCMiwgY29weSB0aGUgdHlwZXMgZmllbGQgdG8gdGhlCi0JZ2xvYmFsX3R5cGVzIGZpZWxkLgotCi1GcmkgU2VwIDEzIDE3OjMyOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjaGFuZ2VfbGVhZGluZ19jaGFyKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoT1BUSU9OX0NIQU5HRV9MRUFESU5HX0NIQVIpOiBEZWZpbmUuCi0JKGNvcHlfb3B0aW9ucyk6IEFkZCAiY2hhbmdlLWxlYWRpbmctY2hhciIuCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0tY2hhbmdlLWxlYWRpbmctY2hhci4KLQkoZmlsdGVyX3N5bWJvbHMpOiBBZGQgb2JmZCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JSW1wbGVtZW50IGNoYW5nZV9sZWFkaW5nX2NoYXIuCi0JKGNvcHlfb2JqZWN0KTogQ2FsbCBmaWx0ZXJfc3ltYm9scyBpZiBjaGFuZ2VfbGVhZGluZ19jaGFyLgotCShjb3B5X21haW4pOiBIYW5kbGUgT1BUSU9OX0NIQU5HRV9MRUFESU5HX0NIQVIuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0tY2hhbmdlLWxlYWRpbmctY2hhci4KLQotVHVlIFNlcCAgMyAxNDowNToyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV9lbnVtX3R5cGUpOiBEb24ndCBjaGVjayBpbmRleCBpbnRvIGEgTlVMTCBuYW1lcwotCWFycmF5LgotCSogbm0uYyAoc29ydF9zeW1ib2xzX2J5X3NpemUpOiBBbHdheXMgaW5pdGlhbGl6ZSBuZXh0LgotCSogcmRjb2ZmLmMgKHBhcnNlX2NvZmZfdHlwZSk6IFdhcm4gYWJvdXQgYW4gaW5jb21wcmVoZW5zaWJsZQotCXR5cGUgcmF0aGVyIHRoYW4gY3Jhc2hpbmcuCi0JKiByZGRiZy5jIChyZWFkX3N5bWJvbF9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IEluaXRpYWxpemUgZi4KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfbWVtYmVycyk6IFNldCBjb250ZXh0IGluIGFsbCBjYXNlcy4KLQotVGh1IEF1ZyAyOSAxNjo1Njo1MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi0qKTogUmVjb2duaXplIGk2ODYgZm9yIHBlbnRpdW0gcHJvLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1UaHUgQXVnIDI5IDExOjI5OjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChMX3RtcG5hbSk6IE5ldmVyIGRlZmluZS4KLQkoZGlzcGxheV90YXJnZXRfbGlzdCk6IFVzZSBjaG9vc2VfdGVtcF9iYXNlIGluc3RlYWQgb2YgdG1wbmFtLgotCShkaXNwbGF5X2luZm9fdGFibGUpOiBMaWtld2lzZS4KLQotVHVlIEF1ZyAyNyAxODoxNTowMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWIpOiBBbiBOX0ZVTiBzeW1ib2wgd2l0aCBhbiBlbXB0eSBzdHJpbmcKLQlpbmRpY2F0ZXMgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uLgotCi1UaHUgQXVnIDIyIDE3OjA4OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JzdGFicy5jIChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkpOiBBZGQgbmV4dCBmaWVsZC4KLQkoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlKTogQ2hhbmdlIHN0cmluZ3MgdG8gYSBwb2ludGVyIHRvCi0Jc3RyaW5nX2hhc2hfZW50cnkuICBBZGQgbGFzdF9zdHJpbmdzIGZpZWxkLiAgUmVtb3ZlIHN0cmluZ3NfYWxsb2MKLQlmaWVsZC4KLQkoc3RyaW5nX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbmV4dCBmaWVsZC4KLQkoc3RhYl93cml0ZV9zeW1ib2wpOiBDb3B5IHN0cmluZyBpbnRvIGhhc2ggdGFibGUgcmF0aGVyIHRoYW4gaW50bwotCWJ1ZmZlci4gIEtlZXAgYSBsaXN0IG9mIGhhc2ggdGFibGUgZW50cmllcy4KLQkod3JpdGVfc3RhYnNfaW5fc2VjdGlvbnNfZGVidWdnaW5nX2luZm8pOiBJbml0aWFsaXplIGxhc3Rfc3RyaW5nLgotCUNvcHkgc3RyaW5ncyBmcm9tIGxpc3Qgb2YgaGFzaCB0YWJsZSBlbnRyaWVzIGluIG1lbW9yeS4KLQkoc3RhYl9tb2RpZnlfdHlwZSk6IElmIHRoZSBlbnRyeSBvbiB0aGUgc3RhY2sgaXMgYSBkZWZpbml0aW9uLAotCW1ha2UgYSBuZXcgZGVmaW5pdGlvbiByYXRoZXIgdGhhbiBmYWlsaW5nIGFuIGFzc2VydC4KLQkoc3RhYl9hcnJheV90eXBlKTogVGhlIHNpemUgaXMgb25seSB6ZXJvIGlmIGhpZ2ggaXMgc3RyaWN0bHkgbGVzcwotCXRoYW4gbG93LgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX2luZm8pOiBBZGQgc2F3X2ZpbGVuYW1lIGZpZWxkLgotCShwYXJzZV9pZWVlKTogSW5pdGlhbGl6ZSBzYXdfZmlsZW5hbWUuCi0JKHBhcnNlX2llZWVfYmIpOiBTZXQgc2F3X2ZpbGVuYW1lIGZvciBhIEJCMSBvciBCQjIuICBJbiBhIEJCMSwKLQlkaXNjYXJkIHRoZSBjdXJyZW50IHZhcmlhYmxlcyBhbmQgdHlwZXMuICBJbiBhIEJCMTAsIGlmIG5vCi0JZmlsZW5hbWUgaGFzIGJlZW4gc2VlbiwgY2FsbCBkZWJ1Z19zZXRfZmlsZW5hbWUuCi0JKHBhcnNlX2llZWVfdHkpOiBJbiBjYXNlICdnJywgdGhlIHR5cGUgaXMgb3B0aW9uYWwuCi0KLQkqIHByZGJnLmMgKHByX2ZpeF92aXNpYmlsaXR5KTogRG9uJ3QgYWJvcnQgb24KLQlERUJVR19WSVNJQklMSVRZX0lHTk9SRS4KLQotCSogZGVidWcuYyAoZGVidWdfbmFtZV90eXBlKTogQ29ycmVjdCBlcnJvciBtZXNzYWdlLgotCi0JKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgSExERU5WLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKEhMREVOVik6IE5ldyB2YXJpYWJsZS4gIFVzZSBpdCB3aGVuZXZlciBsaW5raW5nIGEKLQlwcm9ncmFtLgotCi1UaHUgQXVnIDE1IDE5OjMwOjQxIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBBZGQgc3ltYm9saWMgZG91YmxlcXVvdGVzIGFyb3VuZCB0aGUgdmVyc2lvbgotCW51bWJlci4KLQotVGh1IEF1ZyAgOCAxMjoyNzo1MiAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBBZGQgYmV0dGVyIHN1cHBvcnQgZm9yIERFQyBDIGNvbXBpbGF0aW9uLgotCUFkZCBuZXcgbWFjcm9zIGFzIGluIE1ha2VmaWxlLmluLgotCi1XZWQgQXVnICA3IDE0OjI3OjMzIDE5OTYgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBCRkRfTkVFRF9ERUNMQVJBVElPTiBvbiBzdHJzdHIgYW5kIHNicmsuCi0JKiBhY2NvbmZpZy5oIChORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUik6IE5ldyBtYWNyby4KLQkoTkVFRF9ERUNMQVJBVElPTl9TQlJLKTogTmV3IG1hY3JvLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBidWNvbW0uaCAoc3Ryc3RyKTogRGVjbGFyZSBpZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUi4KLQkoc2Jyayk6IERlY2xhcmUgaWYgSEFWRV9TQlJLIGFuZCBORUVEX0RFQ0xBUkFUSU9OX1NCUksuCi0KLQkqIHByZGJnLmMgKHByX2VuZF9zdHJ1Y3RfdHlwZSk6IEF2b2lkIHVzaW5nIGEgc3RyaW5nIGNvbnN0YW50IGluCi0JYXNzZXJ0LCBmb3IgdGhlIGJlbmVmaXQgb2YgYnJva2VuIGFzc2VydCBtYWNyb3MuCi0KLUZyaSBKdWwgMjYgMTQ6MDY6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBTZXQgZGlzYXNtX2luZm8uZmxhdm91ciBmcm9tCi0JYWJmZC4KLQotVHVlIEp1bCAyMyAxMzo1OTo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoc2VjZGF0YSk6IEluIG5vbiBETExUT09MX1BQQyBjYXNlLCBjaGFuZ2UgYWxpZ25tZW50Ci0Jb2YgLnRleHQgc2VjdGlvbiB0byAyLgotCi1Nb24gSnVsIDIyIDA4OjQ2OjE1IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25fc3RhYnMpOiAgRml4IHRlc3QgZm9yIHN0YWJzIHNlY3Rpb25zCi0JZW5kaW5nIHdpdGggbnVtYmVycy4gIFRoaXMgZml4ZXMgYSBwcm9ibGVtIHdpdGggLnN0YWIgYmVpbmcKLQljb25mdXNlZCB3aXRoIC5zdGFiLmluZGV4LgotCi1XZWQgSnVsIDEwIDEzOjMyOjI4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoc3RhYl9kZW1hbmdsZV9mdW5kX3R5cGUpOiBSZXR1cm4gYSB2b2lkICogZm9yIGEKLQl0ZW1wbGF0ZSwgcmF0aGVyIHRoYW4gc2ltcGx5IGFib3J0aW5nLgotCi1Nb24gSnVsICA4IDE1OjI4OjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXIuYyAob3Blbl9pbmFyY2gpOiBBZGQgZmlsZSBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuICBJZgotCXRoaXMgaXMgYSBuZXdseSBjcmVhdGVkIGFyY2hpdmUsIHNldCB0aGUgdGFyZ2V0IGJhc2VkIG9uIHRoZQotCWZpbGUuCi0JKiBhcnN1cC5oIChvcGVuX2luYXJjaCk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotVGh1IEp1bCAgNCAxMjowMDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogU2V0IHRvIGN5Z251cy0yLjcuMS4KLQotCSogUmVsZWFzZWQgYmludXRpbHMgMi43LgotCi0JKiByZGNvZmYuYyAocGFyc2VfY29mZik6IEdldCBhZGRyZXNzIHRvIHBhc3MgdG8gZGVidWdfZW5kX2Z1bmN0aW9uCi0JZnJvbSBmdW5jdGlvbiBzaXplLCBub3QgdmFsdWUgb2YgLmVmIHN5bWJvbC4gIEZyb20gTmluZwotCU1vc2Jlcmdlci1UYW5nIDxuaW5nQEFaU3Rhck5ldC5jb20+LgotCi1TYXQgSnVuIDI5IDIxOjE4OjA5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChzdHJpcF9tYWluKTogQWRkIC1vIG9wdGlvbiwgYW5kIGhhbmRsZSBpdC4KLQkoc3RyaXBfdXNhZ2UpOiBNZW50aW9uIC1vLgotCSogYmludXRpbHMudGV4aSwgc3RyaXAuMTogTWVudGlvbiAtby4KLQotTW9uIEp1biAyNCAxNzoxOTowMiAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgaW5jbHVkZWRpciwKLQlJTlNUQUxMX1BST0dSQU0sIElOU1RBTExfREFUQSk6IFVzZSBhdXRvY29uZiBzZXQgdmFsdWVzLgotCShkb2NkaXIpOiBSZW1vdmVkLgotCSogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBBdXRvY29uZiAyLjUgb3IgaGlnaGVyLgotCi1Nb24gSnVuIDI0IDExOjU5OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChlbmRpYW4pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCSh1c2FnZSk6IE1lbnRpb24gLUVCLy1FTC8tLWVuZGlhbi4KLQkobG9uZ19vcHRpb25zKTogQWRkICJlbmRpYW4iLgotCShkaXNhc3NlbWJsZV9kYXRhKTogSWYgZW5kaWFubmVzcyB3YXMgc3BlY2lmaWVkLCByZXBsYWNlCi0JYWJmZC0+eHZlYyB3aXRoIGEgY29weSBvZiBpdHNlbGYgd2l0aCB0aGUgZ2l2ZW4gZW5kaWFubmVzcy4KLQkobWFpbik6IEhhbmRsZSAtRUIvLUVMLy0tZW5kaWFuLgotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBNZW50aW9uIC1FQi8tRUwvLS1lbmRpYW4uCi0KLQkqIG9iamR1bXAuYzogTWFrZSBtb3N0IHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIHN0YXRpYy4KLQotCSogY29uZmlndXJlLmluOiBPbiBhbHBoYSotKi1vc2YqLCBsaW5rIGFnYWluc3QgbGliYmZkLmEgaWYgbm90Ci0JdXNpbmcgc2hhcmVkIGxpYnJhcmllcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTAuCi0KLVN1biBKdW4gMjMgMTQ6NDc6MzYgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoc2VjZGF0YSk6IENoYW5nZWQgLnJkYXRhIHRvIC5yZWxkYXRhIHNvIC5yZWxvYyB3aWxsIHdvcmsuCi0JKG1ha2Vfb25lX2xpYl9maWxlKTogUmVtb3ZlZCBjcnVmdC4gKCNpZiAxKQotCi1XZWQgSnVuIDE5IDE0OjQ2OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChzdGFicyk6IENoYW5nZSBmcm9tIHN0cnVjdCBpbnRlcm5hbF9ubGlzdCAqIHRvCi0JYmZkX2J5dGUgKi4KLQkocHJpbnRfc2VjdGlvbl9zdGFicyk6IEZldGNoIHN0YWJzIGluZm9ybWF0aW9uIGRpcmVjdGx5LCByYXRoZXIKLQl0aGFuIGFzc3VtaW5nIHRoYXQgc3RydWN0IGludGVybmFsX25saXN0IGlzIHRoZSByaWdodCBzaXplLgotCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCBjaGFuZ2UgdG8gYmluYXJ5IGZvcm1hdDogZmlsZSBwb3NpdGlvbgotCWJhc2VkIG9uIGxvYWQgYWRkcmVzcywgbm90IHNlY3Rpb24gVk1BLgotCi0JKiBidWNvbW0uaDogRGVmaW5lIFNFRUtfU0VULCBTRUVLX0NVUiwgYW5kIFNFRUtfRU5EIGlmIHRoZXkgYXJlCi0Jbm90IGFscmVhZHkgZGVmaW5lZC4KLQotVHVlIEp1biAxOCAxODoyNTowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBBZGQgZGVmbGV4LmMuCi0KLVR1ZSBKdW4gMTggMTU6MDM6NDQgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZy5oLXZtcywgbWFrZWZpbGUudm1zOiBOZXcgZmlsZXMuCi0KLU1vbiBKdW4gMTcgMDk6NDc6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG1ha2Vfb25lX2xpYl9maWxlKTogVXNlIEJGRF9SRUxPQ19SVkEgcmF0aGVyIHRoYW4KLQlCRkRfUkVMT0NfMzIgaW4gSURBVEE3LgotCi1XZWQgSnVuIDEyIDExOjUyOjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbm0uYyAoc3RydWN0IGdldF9yZWxvY3NfaW5mbyk6IERlZmluZS4KLQkobGluZV9udW1iZXJzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobG9uZ19vcHRpb25zKTogQWRkICJsaW5lLW51bWJlcnMiLgotCSh1c2FnZSk6IE1lbnRpb24gLWwgYW5kIC0tbGluZS1udW1iZXJzLgotCShtYWluKTogSGFuZGxlIC1sLgotCShwcmludF9zeW1ib2wpOiBQcmludCBsaW5lIG51bWJlcnMgaWYgcmVxdWVzdGVkLgotCShnZXRfcmVsb2NzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGJpbnV0aWxzLnRleGksIG5tLjE6IERvY3VtZW50IC1sLy0tbGluZS1udW1iZXJzLgotCi1UdWUgSnVuIDExIDIwOjEyOjE1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkdW1wX3JlbG9jX3NldCk6IEFkZCBzZWMgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBJZiB3aXRoX2xpbmVfbnVtYmVycyBpcyBzZXQsIGRpc3BsYXkgbGluZSBudW1iZXJzIG9mCi0JcmVsb2NhdGlvbiBlbnRyaWVzLgotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtbCB3aXRoIC1yLgotCi1Nb24gSnVuIDEwIDIzOjQyOjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXIuYyAob3Blbl9pbmFyY2gpOiBSZXBvcnQgQkZEIGVycm9yIG1lc3NhZ2UgaWYgYW4gYXJjaGl2ZSBjYW4KLQlub3QgYmUgcmVjb2duaXplZC4gIExpc3QgbWF0Y2hpbmcgZm9ybWF0cyBpZiB0aGUgZmlsZSBpcwotCWFtYmlndW91c2x5IHJlY29nbml6ZWQuCi0JKHJhbmxpYl90b3VjaCk6IExpa2V3aXNlLgotCi1UaHUgSnVuICA2IDEzOjU2OjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogUkVBRE1FOiBBZGQgbm90ZXMgb24gaG93IHRvIGJ1aWxkIGlmIHlvdSBkb24ndCBoYXZlIGFyLgotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIG9sZCBpbmNvcnJlY3Qgc2V0dGluZyBvZiBDQy4KLQotVHVlIEp1biAgNCAxMDo1Mjo0OSAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNzazMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEb24ndCBjaGVjayB0byBzZWUgaWYgdG9vbGRpciBleGlzdHMuCi0JTWFrZSAkKHRvb2xkaXIpIGFuZCAkKHRvb2xkaXIpL2Jpbi4KLQotTW9uIEp1biAgMyAxNzo0MDoyMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHN0cmluZ3MuYyAobWFpbik6IE1ha2UgbWFpbiBhbiBpbnQgZnVuY3Rpb24sIG5vdCB2b2lkLgotCi1GcmkgTWF5IDMxIDEzOjU5OjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbm0uYyAoZmlsdGVyX3N5bWJvbHMpOiBDaGVjayBmb3IgQlNGX1dFQUsgYXMgd2VsbCBhcwotCUJTRl9HTE9CQUwuCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLVdlZCBNYXkgIDggMTY6NTc6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogTWFrZSBjbGVhciB0aGF0IGl0IGlzIG9ubHkgYSB3YXJuaW5nCi0Jd2hlbiB0aGUgb3V0cHV0IGZpbGUgY2FuIG5vdCByZXByZXNlbnQgdGhlIGFyY2hpdGVjdHVyZS4KLQotRnJpIE1heSAgMyAxMTozMDoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IERvbid0IHJlZmVyIHRvIGJ5dGVzIHBhc3QgdGhlIGVuZAotCW9mIGRhdGEuCi0KLVdlZCBBcHIgMjQgMTQ6MTA6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZGRiZy5jIChyZWFkX3N5bWJvbF9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IE1vdmUgY2FsbCB0bwotCWZyZWVfc2F2ZWRfc3RhYnMgb3V0c2lkZSB0aGUgbG9vcCBvdmVyIHRoZSBzeW1ib2xzLgotCi1UdWUgQXByIDIzIDEyOjU2OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChjb21wYXJlX3N5bWJvbHMpOiBTb3J0IHN5bWJvbHMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aAotIAlgLicgYWZ0ZXIgb3RoZXIgc3ltYm9scy4gIElmIG5vIG90aGVyIGRlY2lzaW9uIGNhbiBiZSBtYWRlLCBzb3J0Ci0Jc3ltYm9scyBieSBuYW1lLgotCi1UaHUgQXByIDE4IDE2OjAyOjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGVwLWluLnNlZDogU3Vic3RpdHV0ZSAkKEJGRERJUikgZm9yIEBCRkRESVJALgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShkZXAuc2VkKTogU3Vic3RpdHV0ZSAkKEJGRERJUikgZm9yIEBCRkRESVJALgotCi1UdWUgQXByIDE2IDEzOjUwOjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmRjb2ZmLmM6IE5ldyBmaWxlLgotCSogcmRkYmcuYyAocmVhZF9kZWJ1Z2dpbmdfaW5mbyk6IFJlYWQgQ09GRiBzeW1ib2xzIGlmIENPRkYgZmxhdm91cgotCWFuZCBubyBzdGFicyB3ZXJlIGZvdW5kLgotCSogYnVkYmcuaCAocGFyc2VfY29mZik6IERlY2xhcmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IEFkZCByZGNvZmYuYy4KLQkoREVCVUdfT0JKUyk6IEFkZCByZGNvZmYuby4KLQotTW9uIEFwciAxNSAxNTo1NTowMSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBubG1jb252LmMgKGNob29zZV90ZW1wX2Jhc2V7LF90cnl9KTogRGVsZXRlLCBpbiBsaWJpYmVydHkgbm93LgotCShsaW5rX2lucHV0cyk6IFVwZGF0ZSBjYWxsIHRvIGNob29zZV90ZW1wX2Jhc2UuCi0KLU1vbiBBcHIgIDggMTQ6NDA6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFBlcm1pdCAtLWVuYWJsZS1zaGFyZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YKLQlkaXJlY3Rvcmllcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE1hciAyOSAxNjoxMTozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX2hlYWRlcik6IFByaW50IHRoZSBTRUNfTElOS19PTkNFIGZsYWcKLQlhbmQgdGhlIFNFQ19MSU5LX0RVUExJQ0FURVMgZmllbGQuCi0KLUZyaSBNYXIgMjkgMTE6MzU6NTUgMTk5NiAgSi5ULiBDb25rbGluICAoanRjQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi4xOiBDaGFuZ2VkIHRvIGJlIHJlY29nbml6ZWQgYnkgY2F0bWFuIC13IG9uIFNvbGFyaXMuCi0KLVRodSBNYXIgMjggMTQ6MTc6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cnN0YWJzLmMgKHN0YWJfZW51bV90eXBlKTogU2V0IGJ1ZiBiZWZvcmUgdXNpbmcgaXQuCi0KLUZyaSBNYXIgMjIgMTU6NDk6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9oYW5kbGUpOiBBZGQgZmllbGQgYWJmZC4KLQkoc3RhcnRfc3RhYik6IEFkZCBhYmZkIHBhcmFtZXRlci4KLQkocGFyc2Vfc3RhYl9zdHJpbmcpOiBTa2lwIHRoZSBzeW1ib2wgbGVhZGluZyBjaGFyIHdoZW4gc2VhcmNoaW5nCi0JZm9yIHRoZSB2YWx1ZSBvZiBhIGdsb2JhbCBzeW1ib2wuCi0JKiBidWRiZy5oIChzdGFydF9zdGFiKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogcmRkYmcuYyAocmVhZF9zZWN0aW9uX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogUGFzcyBhYmZkIHRvCi0Jc3RhcnRfc3RhYi4KLQkocmVhZF9zeW1ib2xfc3RhYnNfZGVidWdnaW5nX2luZm8pOiBMaWtld2lzZS4KLQotVGh1IE1hciAyMSAxMjo0MDo0OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyc3RhYnMuYyAoc3RhYl9mdW5jdGlvbl90eXBlKTogT3V0cHV0IGFuIGVtcHR5IHR5cGVkZWYgZm9yIGFuCi0JdW51c2VkIGFyZ3VtZW50LCByYXRoZXIgdGhhbiBtYWtpbmcgdXAgYSBtZWFuaW5nbGVzcyBuYW1lLgotCShzdGFiX3ZhcmlhYmxlKTogVXNlIE5fUlNZTSBmb3IgYSBERUJVR19SRUdJU1RFUiB2YXJpYWJsZS4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV9pbmZvKTogQWRkIGdsb2JhbF92YXJzIGZpZWxkLgotCShwYXJzZV9pZWVlX2JlKTogV2hlbiBlbmRpbmcgdGhlIGdsb2JhbCB0eXBlZGVmIGJsb2NrLCBjb3B5IHRoZQotCXZhcmlhYmxlcyBpbnRvIGluZm8tPmdsb2JhbF92YXJzLgotCShwYXJzZV9pZWVlX2F0bik6IERvbid0IHJlcXVpcmUgYW4gTk4gcmVjb3JkIGZvciBhIHBtaXNjIEFUTi4KLQkoaWVlZV9yZWFkX3JlZmVyZW5jZSk6IFNlYXJjaCB0aGUgZ2xvYmFsIHZhcmlhYmxlcyBhZnRlciB0aGUgbG9jYWwKLQl2YXJpYWJsZXMuCi0KLVdlZCBNYXIgMjAgMTg6MDg6MTkgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IE1ha2Ugc3VyZSBzeW1fbmFtZSBpcyBhbHdheXMgc2V0LgotCShkdW1wX3NlY3Rpb25faGVhZGVyKTogQWx3YXlzIHB1dCBhIHNwYWNlIGFmdGVyIHRoZSBzZWN0aW9uIG5hbWUuCi0JKGR1bXBfYmZkX2hlYWRlcik6IFRlcm1pbmF0ZSBvdXRwdXQgd2l0aCBuZXdsaW5lLgotCi1XZWQgTWFyIDIwIDE2OjM1OjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JzdGFicy5jOiBOZXcgZmlsZS4KLQkqIGJ1ZGJnLmggKHdyaXRlX3N0YWJzX2luX3NlY3Rpb25zX2RlYnVnZ2luZ19pbmZvKTogRGVjbGFyZS4KLQkqIG9iamNvcHkuYyAod3JpdGVfZGVidWdnaW5nX2luZm8pOiBGb3IgQ09GRiBvciBFTEYsIG91dHB1dCBzdGFicwotCWluIHNlY3Rpb25zLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDRklMRVMpOiBBZGQgd3JzdGFicy5jLgotCShXUklURV9ERUJVR19PQkpTKTogTmV3IHZhcmlhYmxlLgotCSgkKE9CSkNPUFlfUFJPRykpOiBVc2UgJChXUklURV9ERUJVR19PQkpTKSwgbm90ICQoREVCVUdfT0JKUykuCi0JKCQoU1RSSVBfUFJPRykpOiBMaWtld2lzZS4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9tZW1iZXJzKTogTWFrZSB0eXBlIHN0dWIgZGV0ZWN0aW9uIG1vcmUgbGlrZQotCWdkYi4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV9oYW5kbGUpOiBBZGQgZmllbGRzIGNvbXBsZXhfZmxvYXRfaW5kZXggYW5kCi0JY29tcGxleF9kb3VibGVfaW5kZXguCi0JKGllZWVfY29tcGxleF90eXBlKTogQ2FjaGUgdHlwZSBpbmRleCBpbiBjb21wbGV4X2Zsb2F0X2luZGV4IGFuZAotCWNvbXBsZXhfZG91YmxlX2luZGV4LCBkZXBlbmRpbmcgdXBvbiBzaXplLiAgU2V0IHNpemUgb24gdHlwZSBzdGFjawotCXRvIHNpemUgKiAyLgotCi0JKiBpZWVlLmMgKGllZWVfZW1wdHlfdHlwZSk6IFVzZSBidWlsdGluX3Vua25vd24sIG5vdCAwLgotCShpZWVlX3ZvaWRfdHlwZSk6IFVzZSBidWlsdGluX3ZvaWQsIG5vdCAxLgotCi0JKiBpZWVlLmMgKHBhcnNlX2llZWVfdHkpOiBIYW5kbGUgJ1YnIHR5cGUgY29kZS4KLQkocGFyc2VfaWVlZV9hdG4pOiBEb24ndCByZXF1aXJlIHR3byBudW1iZXJzIGZvciB0eXBlIDEwLgotCi0JKiBpZWVlLmMgKHBhcnNlX2llZWVfYmUpOiBBZGQgb25lIHRvIG9mZnNldCBhdCBlbmQgb2YgZnVuY3Rpb24gb3IKLQlibG9jay4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV9ibG9jayk6IEFkZCBmaWVsZCBza2lwLgotCShwYXJzZV9pZWVlX2JiKTogRG9uJ3QgY2FsbCBkZWJ1Z19yZWNvcmRfZnVuY3Rpb24gZm9yIF9fWFJZQ1BQCi0JZnVuY3Rpb24sIGFuZCBzZXQgc2tpcCBmaWVsZC4KLQkocGFyc2VfaWVlZV9iZSk6IERvbid0IGNhbGwgZGVidWdfZW5kX2Z1bmN0aW9uIGlmIHNraXAgaXMgc2V0LgotCi0JKiBkZWJ1Zy5jIChzdHJ1Y3QgZGVidWdfaGFuZGxlKTogQWRkIGZpZWxkcyBjdXJyZW50X3dyaXRlX2xpbmVubwotCWFuZCBjdXJyZW50X3dyaXRlX2xpbmVub19pbmRleC4KLQkoZGVidWdfd3JpdGUpOiBJbml0aWFsaXplIGN1cnJlbnRfd3JpdGVfbGluZW5vIGFuZAotCWN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4IGZvciBlYWNoIHVuaXQuICBDYWxsCi0JZGVidWdfd3JpdGVfbGluZW5vcyByYXRoZXIgdGhhbiB3cml0aW5nIG91dCB0aGUgbGluZSBudW1iZXJzCi0JZGlyZWN0bHkuCi0JKGRlYnVnX3dyaXRlX2Z1bmN0aW9uKTogQ2FsbCBkZWJ1Z193cml0ZV9saW5lbm9zLgotCShkZWJ1Z193cml0ZV9ibG9jayk6IExpa2V3aXNlLgotCShkZWJ1Z193cml0ZV9saW5lbm9zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogZGVidWcuYyAoZGVidWdfd3JpdGVfdHlwZSk6IEZvciBERUJVR19LSU5EX0ZVTkNUSU9OLCBwdXNoIHJldHVybgotCXR5cGUgYmVmb3JlIGFyZ3VtZW50cy4KLQotTW9uIE1hciAxOCAxODowNTozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0ZVTkNfVkZPUksuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIGRsbHRvb2wuYywgbmxtY29udi5jOiBJbmNsdWRlIDx2Zm9yay5oPiBpZiBIQVZFX1ZGT1JLX0ggaXMKLQlkZWZpbmVkLgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX3JhbmdlX3R5cGUpOiBBIGNvbXBsZXggdHlwZSBpcyBkZWZpbmVkIGFzIGEKLQlzdWJyYW5nZSBvZiBpdHNlbGYgd2l0aCB0aGUgaGlnaCBib3VuZCB6ZXJvLgotCSogaWVlZS5jIChpZWVlX2NvbXBsZXhfdHlwZSk6IERvbid0IGNyYXNoIG9uIHNpemVzIG9mIDEyIG9yIDE2LgotCi1UdWUgTWFyIDEyIDEyOjA5OjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX3VuZGVmaW5lZF90YWcpOiBTd2l0Y2ggdG8gZ2xvYmFsX3R5cGVzIGV2ZW4KLQlpZiBpdCBpcyBub3QgZW1wdHkuCi0JKGllZWVfdGFnX3R5cGUpOiBGb3IgYW4gZW51bSwgbG9vayB0aHJvdWdoIGluZm8tPmVudW1zLgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjguCi0KLQkqIGRlYnVnLmMgKGRlYnVnX3R5cGVfc2FtZXApOiBEb24ndCBsb29wIGVuZGxlc3NseSBpbgotCURFQlVHX0tJTkRfRU5VTSBjYXNlLiAgRnJvbSBFcmljIEJhdXIgPGVjYkBuZXhlbi5jb20+LgotCi1Nb24gTWFyIDExIDEyOjM1OjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmRkYmcuYyAocmVhZF9zZWN0aW9uX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogQ2FsbCBzYXZlX3N0YWIgZm9yCi0JZWFjaCBzdGFiIGVudHJ5LCBjYWxsIHN0YWJfY29udGV4dCBvbiBhbiBlcnJvciwgYW5kIGNhbGwKLQlmcmVlX3NhdmVkX3N0YWJzIGJlZm9yZSBydHVybmluZy4KLQkocmVhZF9zeW1ib2xfc3RhYnNfZGVidWdnaW5nX2luZm8pOiBMaWtld2lzZS4KLQkoU0FWRV9TVEFCU19DT1VOVCk6IERlZmluZS4KLQkoc3RydWN0IHNhdmVkX3N0YWIpOiBEZWZpbmUuCi0JKHNhdmVkX3N0YWJzLCBzYXZlZF9zdGFic19pbmRleCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShzYXZlX3N0YWIsIHN0YWJfY29udGV4dCwgZnJlZV9zYXZlZF9zdGFicyk6IE5ldyBzdGF0aWMgZnVuY3Rpb3MuCi0KLQkqIG9iamR1bXAuYyAoc3RhYl9uYW1lKTogUmVtb3ZlLgotCShzdHJ1Y3Qgc3RhYl9wcmludCk6IFJlbW92ZS4KLQkoc3RhYl9wcmludCk6IFJlbW92ZS4KLQkoZHVtcF9zdGFicyk6IERvbid0IGluaXRpYWxpemUgc3RhYl9uYW1lLgotCShwcmludF9zZWN0aW9uX3N0YWJzKTogQ2FsbCBiZmRfZ2V0X3N0YWJfbmFtZSByYXRoZXIgdGhhbiB1c2luZwotCXRoZSBzdGFiX25hbWUgYXJyYXkuCi0KLVR1ZSBGZWIgMjcgMTk6NTI6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwcmRiZy5jIChwcl9pbnRfY29uc3RhbnQpOiBJbml0aWFsaXplIGluZm8gY29ycmVjdGx5LgotCShwcl9mbG9hdF9jb25zdGFudCk6IExpa2V3aXNlLgotCi1Nb24gRmViIDI2IDE4OjExOjM3IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBVcGRhdGUgdG8gaGFuZGxlIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuCi0KLVNhdCBGZWIgMjQgMTE6MjE6NDkgMTk5NiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PjoKLQotCSogTWFrZWZpbGUuaW4gKCQoT0JKRFVNUF9QUk9HKSk6IFNlYXJjaCAkKEJGRExJQikgYmVmb3JlCi0JJChPUENPREVTKS4KLQotVGh1IEZlYiAxNSAxMjo0NDo0NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdGFtcGVyIHdpdGggTERGTEFHUy4gIENhbGwgQUNfUFJPR19DQyBiZWZvcmUKLQljb25maWd1cmUuaG9zdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlIFJQQVRIX0VOVlZBUi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChSUEFUSF9FTlZWQVIpOiBOZXcgdmFyaWFibGUuCi0JKGNoZWNrKTogVXNlICQoUlBBVEhfRU5WVkFSKSByYXRoZXIgdGhhbiBMRF9MSUJSQVJZX1BBVEguCi0KLQkqIG9iamNvcHkuYyAoc21hcnRfcmVuYW1lKTogUmF0aGVyIHRoYW4gZG9pbmcgY2htb2QgdGhlbiBjaG93biwgZG8KLQljaG1vZCB3aXRob3V0IHNldHVpZCwgdGhlbiBjaG93biwgdGhlbiBjaG1vZCB3aXRoIHNldHVpZC4KLQotV2VkIEZlYiAxNCAxNjo0Njo0MiAxOTk2ICBNYXJ0aW4gQW5hbnRoYXJhbWFuICA8bWFydGluQG1haWwuaW1lY2gudW5pLWR1aXNidXJnLmRlPgotCi0JKiBhcnN1cC5jIChtYXBfb3Zlcl9saXN0KTogUmVpbmRlbnQuICBEb24ndCBhc3N1bWUgdGhhdCB0aGUKLQlmdW5jdGlvbiBkb2VzIG5vdCBkZWxldGUgdGhlIEJGRC4KLQkoYXJfYWRkbGliX2RvZXIpOiBEb24ndCBzZXQgcHJldi0+bmV4dCBpZiBwcmV2IGlzIE5VTEwuCi0KLVdlZCBGZWIgMTQgMTU6MTI6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfcmVnbm9fdG9fZ2VucmVnKTogQ29udmVydCByZWdpc3RlciBudW1iZXJzIGZvciBtNjhrCi0JYW5kIGk5NjAuCi0JKGllZWVfZ2VucmVnX3RvX3JlZ25vKTogTGlrZXdpc2UuCi0KLU1vbiBGZWIgMTIgMTQ6MTk6NTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHdyaXRlIGNvZGUgdG8gcHV0IHR5cGVzIGluIHRoZQotCWdsb2JhbCB0eXBlIGJsb2NrIHdoZW4gcG9zc2libGUsIHRvIG91dHB1dCByYW5nZXMgZm9yIGFsbCBtZW1vcnkKLQlvY2N1cGllZCBieSB0aGUgbW9kdWxlLCBhbmQgdG8gaW1wcm92ZSBlZmZpY2llbmN5LgotCi0JKiBkZWJ1Zy5jIChzdHJ1Y3QgZGVidWdfaGFuZGxlKTogUmVtb3ZlIGNsYXNzX21hcmsgZmllbGQuICBBZGQKLQlpZF9saXN0IGFuZCBjb21wYXJlX2xpc3QgZmllbGRzLgotCShzdHJ1Y3QgZGVidWdfY2xhc3NfaWQpOiBEZWZpbmUuCi0JKHN0cnVjdCBkZWJ1Z190eXBlX2NvbXBhcmVfbGlzdCk6IERlZmluZS4KLQkoZGVidWdfd3JpdGUpOiBJbml0aWFsaXplIGluZm8tPmlkX2xpc3QKLQkoZGVidWdfd3JpdGVfbmFtZSk6IFJlbW92ZSByZWZlcmVuY2UgdG8gaW5mby0+Y2xhc3NfbWFyay4KLQkoZGVidWdfd3JpdGVfdHlwZSk6IEdldCBpZCBmb3IgYWxsIHN0cnVjdHMgYW5kIGNsYXNzZXMuICBTaW1wbGlmeQotCXRlc3QgZm9yIHdoZXRoZXIgc3RydWN0IGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbi4KLQkoZGVidWdfd3JpdGVfY2xhc3NfdHlwZSk6IEdldCBpZCBmb3IgYWxsIGNsYXNzZXMuICBTaW1wbGlmeSB0ZXN0Ci0JZm9yIHdoZXRoZXIgY2xhc3MgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuLgotCShkZWJ1Z193cml0ZV9ibG9jayk6IERvbid0IHdyaXRlIG91dCBibG9ja3Mgb3RoZXIgdGhhbiB0aGUgdG9wCi0JbGV2ZWwgYmxvY2sgaWYgdGhleSBoYXZlIG5vIGxvY2FsIHZhcmlhYmxlcy4KLQkoZGVidWdfc2V0X2NsYXNzX2lkKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZGVidWdfdHlwZV9zYW1lcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGRlYnVnX2NsYXNzX3R5cGVfc2FtZXApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogcHJkYmcuYyAocHJfc3RhcnRfc3RydWN0X3R5cGUpOiBBbHdheXMgcHJpbnQgaWQuCi0JKHByX3N0YXJ0X2NsYXNzX3R5cGUpOiBMaWtld2lzZS4KLQkocHJfdGFnX3R5cGUpOiBMaWtld2lzZS4KLQotCSogc3RhYnMuYyAoc3RydWN0IHN0YWJfaGFuZGxlKTogQWRkIHN5bXMgYW5kIHN5bWNvdW50IGZpZWxkcy4KLQkoc3RhcnRfc3RhYik6IEFkZCBzeW1zIGFuZCBzeW1jb3VudCBwYXJhbWV0ZXJzLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKHBhcnNlX3N0YWJfc3RyaW5nKTogTG9vayB1cCBnbG9iYWwgdmFyaWFibGVzIGluIHRoZSBzeW1ib2wgdGFibGUKLQl0byBnZXQgdGhlIHJpZ2h0IHZhbHVlLgotCSogYnVkYmcuaCAoc3RhcnRfc3RhYik6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIHJkZGJnLmMgKHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IEFkZCBzeW1zIGFuZAotCXN5bWNvdW50IHBhcmFtZXRlcnMuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfYXJyYXlfdHlwZSk6IElmIHRoZSBpbmRleCB0eXBlIGlzIDAsIHVzZQotCWludC4KLQotV2VkIEZlYiAgNyAxNDoxNzo0NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV9zdGFydF9jb21waWxhdGlvbl91bml0KTogQ2xlYXIgbW9kaWZpZWQgYW5kCi0JbW9kaWZpZWRfYWxsb2MgZmllbGRzIG9mIGluZm8uCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIC0tZW5hYmxlLXNoYXJlZC4gIFN1YnN0aXR1dGUgbmV3Ci0JdmFyaWFibGVzIEJGRExJQiBhbmQgT1BDT0RFUy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChCRkRMSUIpOiBTZXQgdG8gQEJGRExJQkAuCi0JKE9QQ09ERVMpOiBTZXQgdG8gQE9QQ09ERVNALgotCi1Nb24gRmViICA1IDE2OjE4OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVN1cHBvcnQgZm9yIGJ1aWxkaW5nIGJmZCBhbmQgb3Bjb2RlcyBhcyBzaGFyZWQgbGlicmFyaWVzLCBiYXNlZCBvbgotCXBhdGNoZXMgZnJvbSBBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0JKiBjb25maWd1cmUuaW4gKEhMREZMQUdTKTogTmV3IHN1YnN0aXR1dGlvbi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChITERGTEFHUyk6IE5ldyB2YXJpYWJsZS4gIE1ha2UgYWxsIGxpbmtzIHVzZQotCSQoSExERkxBR1MpIGJlZm9yZSAkKENGTEFHUykgYW5kICQoTERGTEFHUykuCi0JKEJGRExJQl9ERVApOiBOZXcgdmFyaWFibGUuICBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiAkKEJGRCkgYXMKLQlhIGRlcGVuZGVuY3kgd2l0aCAkKEJGRExJQl9ERVApLiAgUmVtb3ZlICQoQkZEKSBhcyBhIGRlcGVuZGVuY3kgaWYKLQl0aGVyZSBpcyBhbHNvIGEgZGVwZW5kZW5jeSBvbiAkKEFERExfREVQUykuCi0JKEJGRExJQik6IFJlbmFtZSBmcm9tIEJGRDsgY2hhbmdlIGFsbCB1c2VzOyBzZXQgdG8gLUwuLi9iZmQgLWxiZmQuCi0JKE9QQ09ERVNfREVQKTogTmV3IHZhcmlhYmxlLiAgUmVwbGFjZSBhbGwgb2NjdXJyZW5kcyBvZiAkKE9QQ09ERVMpCi0JYXMgYSBkZXBlbmRlbmN5IHdpdGggJChPUENPREVTX0RFUCkuCi0JKE9QQ09ERVMpOiBTZXQgdG8gLUwuLi9vcGNvZGVzIC1sb3Bjb2Rlcy4KLQkoQURETF9ERVBTKTogTmV3IHZhcmlhYmxlLiAgUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YKLQkkKEFERExfTElCUykgYXMgYSBkZXBlbmRlbmN5IHdpdGggJChBRERMX0RFUFMpLgotCShjaGVjayk6IFNldCBMRF9MSUJSQVJZX1BBVEggaW4gdGhlIGVudmlyb25tZW50LgotCShjb25maWcuc3RhdHVzKTogRGVwZW5kIHVwb24gQkZEIGNvbmZpZ3VyZS5ob3N0IGFuZCBjb25maWcuYmZkLgotCi1GcmkgRmViICAyIDE3OjAyOjU5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmM6ICNpbmNsdWRlIHN0ZGFyZy5oIG9yIHZhcmFyZ3MuaC4KLQkob2JqZHVtcF9wcmludF92YWx1ZSk6IENoYW5nZSBGSUxFKiBhcmcgdG8gc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8qLgotCUFsbCBjYWxsZXJzIHVwZGF0ZWQuICBVc2UgZnByaW50Zl9mdW5jLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBDb25zaXN0ZW50bHkgdXNlIGZwcmludGZfZnVuYy4KLQkob2JqZHVtcF9zcHJpbnRmKTogTmV3IGZ1bmN0aW9uLgotCShkaXNhc3NlbWJsZV9kYXRhKTogUHJpbnQgaW5zbiBpbnRvIGEgYnVmZmVyLCBwcmludCByYXcgaW5zbiBvdXJzZWx2ZXMsCi0JdGhlbiBwcmludCBpbnNuIG1uZW1vbmljLgotCi1GcmkgRmViICAyIDE2OjQ4OjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1UaHUgRmViICAxIDA5OjM4OjE4IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszLTZdODYtKi13aW4zMik6IEJlY29tZXMgaVszLTZdODYtKi1jeWd3aW4zMi4KLQkocG93ZXJwYyotKi1jeWd3aW4zMik6IE5ldy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLVdlZCBKYW4gMzEgMTM6MjI6MDMgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgJChERU1BTkdMRVJfUFJPRykuMS4KLQotTW9uIEphbiAyOSAxNzozNjoyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gSCBKIEx1IDxoamxAem9vbS5jb20+OgotCSogb2JqY29weS5jIChyZW1vdmVfbGVhZGluZ19jaGFyKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoT1BUSU9OX1JFTU9WRV9MRUFESU5HX0NIQVIpOiBEZWZpbmUuCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0tcmVtb3ZlLWxlYWRpbmctY2hhci4KLQkoZmlsdGVyX3N5bWJvbHMpOiBJZiByZW1vdmVfbGVhZGluZ19jaGFyLCBhbmQgdGhlIGZpcnN0IGNoYXJhY3RlcgotCW9mIGEgZ2xvYmFsIHN5bWJvbCBtYXRjaGVzIHRoZSBzeW1ib2wgbGVhZGluZyBjaGFyIG9mIHRoZSBCRkQsCi0JcmVtb3ZlIHRoZSBmaXJzdCBjaGFyYWN0ZXIuCi0JKGNvcHlfb2JqZWN0KTogRmlsdGVyIHRoZSBzeW1ib2xzIGlmIHJlbW92ZV9sZWFkaW5nX2NoYXIgaXMgc2V0LgotCShjb3B5X21haW4pOiBIYW5kbGUgLS1yZW1vdmUtbGVhZGluZy1jaGFyLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBEb2N1bWVudCAtLXJlbW92ZS1sZWFkaW5nLWNoYXIuCi0KLVNhdCBKYW4gMjcgMTU6NDA6MTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGZwcmludGYpOiBBZGQgcHJvdG90eXBlIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcgb24KLQlTdW5PUy4KLQotRnJpIEphbiAyNiAxMTo1Mzo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLnRleGkgKG5tKTogSW1wcm92ZSBkb2N1bWVudGF0aW9uIG9uIHN5bWJvbCB0eXBlcy4KLQkob2JqZHVtcCk6IFJlZmVyZW5jZSB0aGUgc3RhYnMgbWFudWFsIGZyb20gdGhlIGRpc2N1c3Npb24gb2YgdGhlCi0JLS1zdGFicyBvcHRpb24uCi0KLVRodSBKYW4gMjUgMTE6MjE6NDYgMTk5NiAgUmF5bW9uZCBKb3UgIDxyam91QG1leGljYW4uY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBBZGQgYSAic3RhbXBzIiB0YXJnZXQuCi0KLVRodSBKYW4gMjUgMTM6NTE6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGR1bXBfaGVhZGVycywgZHVtcF9zZWN0aW9uX2hlYWRlcik6IENoYW5nZSBvYmpkdW1wIC1oCi0Jb3V0cHV0IHRvIGJlIHNpbXBsZXIgYW5kIHRvIGluY2x1ZGUgc2VjdGlvbiBmaWxlIG9mZnNldHMuCi0KLVdlZCBKYW4gMjQgMTI6MDY6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX21lbWJlcnMpOiBEb24ndCBhZGp1c3Qgdm9mZnNldC4KLQotCSogaWVlZS5jIChpZWVlX3JlYWRfY3h4X2NsYXNzKTogRG9uJ3QgbXVsdGlwbHkgdm9mZnNldCBieSA0LgotCShzdHJ1Y3QgaWVlZV93cml0ZV90eXBlKTogQWRkIG5hbWUgZmllbGQuCi0JKHN0cnVjdCBpZWVlX3R5cGVfY2xhc3MpOiBSZW1vdmUgbmFtZSBmaWVsZC4gIENoYW5nZSBhbGwgdXNlcyB0bwotCXVzZSBuZXcgbmFtZSBmaWVsZCBpbiB0eXBlIGluc3RlYWQuCi0JKHN0cnVjdCBpZWVlX25hbWVfdHlwZSk6IExpa2V3aXNlLgotCShpZWVlX3N0YXJ0X3N0cnVjdF90eXBlKTogSW5pdGlhbGl6ZSBuYW1lIGZpZWxkIG9mIHR5cGUuCi0JKGllZWVfc3RhcnRfY2xhc3NfdHlwZSk6IERvbid0IGluaXRpYWxpemUgY2xhc3NkZWYgZW50cnkgb2YgdGFnLgotCShpZWVlX2NsYXNzX21ldGhvZF92YXIpOiBEb24ndCBhZGp1c3Qgdm9mZnNldC4KLQkoaWVlZV9lbmRfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgotCShpZWVlX3RhZ190eXBlKTogSW5pdGlhbGl6ZSBuZXcgbmFtZSBmaWVsZCBvZiB0eXBlLgotCShpZWVlX3R5cGRlZik6IFNldCBuYW1lIGFmdGVyIGNvcHlpbmcgaW4gdHlwZSBpbmZvcm1hdGlvbi4KLQotCSogZGVidWcuYyAoVk9GRlNFVF9TVEFUSUNfTUVUSE9EKTogRGVmaW5lIGFzIC0xLCBub3QgMS4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlKTogRGVmaW5lLgotCShzdHJ1Y3QgaWVlZV9oYW5kbGUpOiBBZGQgbW9kaWZpZWQgYW5kIG1vZGlmaWVkX2FsbG9jIGZpZWxkcy4KLQkoaWVlZV9nZXRfbW9kaWZpZWRfaW5mbyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGllZWVfcG9pbnRlcl90eXBlKTogQ2FjaGUgdHlwZSBpbmRleC4KLQkoaWVlZV9jb25zdF90eXBlKTogTGlrZXdpc2UuCi0JKGllZWVfdm9sYXRpbGVfdHlwZSk6IExpa2V3aXNlLgotCi0JKiBpZWVlLmMgKGllZWVfZGVmaW5lX25hbWVkX3R5cGUpOiBXaGVuIGNyZWF0aW5nIGEgdGFnIGZvciBhbgotCWFub255bW91cyBzdHJ1Y3QsIGNvcHkgdGhlIG5hbWUgaW50byBtZW1vcnkuCi0JKGllZWVfdGFnX3R5cGUpOiBMaWtld2lzZS4KLQkqIGRlYnVnLmMgKGRlYnVnX3dyaXRlX3R5cGUpOiBPbmx5IGNoZWNrIGFuZCBzZXQgaWQgZmllbGQgZm9yIGFuCi0JdW5uYW1lZCBvYmplY3QuCi0JKGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUpOiBMaWtld2lzZS4KLQotCSogaWVlZS5jOiBWYXJpb3VzIGNoYW5nZXMgdG8gd3JpdGUgb3V0IHR5cGVzIGZvciBmdW5jdGlvbnMgYW5kCi0JcmVmZXJlbmNlcywgYW5kIHRvIG5vdCB3cml0ZSBvdXQgdW5uZWNlc3NhcnkgZnVuY3Rpb24gdHlwZXMuCi0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfdmFyKTogUmVtb3ZlIHZhcmlhYmxlIGZpZWxkLiAgQWRkIGtpbmQKLQlmaWVsZCwgYW5kIGRlZmluZSBzb21lIGVudW0gY29uc3RhbnRzIGZvciBpdC4KLQkocGFyc2VfaWVlZV90eSk6IFNldCBraW5kIGZpZWxkIG9mIHZhcmlhYmxlIGZvciAneCcgYW5kICdYJyB0eXBlcy4KLQkocGFyc2VfaWVlZV9hdG4pOiBNYWtlIGFuIGluZGlyZWN0IHNsb3QgZm9yIGFuIGV4dGVybmFsIHZhcmlhYmxlLAotCWFsdGhvdWdoIHdlIG90aGVyd2lzZSBkb24ndCByZWNvcmQgaXQuICBTZXQga2luZCBmaWVsZCByYXRoZXIgdGhhbgotCXZhcmlhYmxlIGZpZWxkIG9mIHB2YXIuCi0JKGllZWVfcmVhZF9jeHhfY2xhc3MpOiBUcnkgdG8gZ2V0IHRoZSB0eXBlIG9mIGEgc3RhdGljIG1lbWJlci4KLQkoaWVlZV9yZWFkX3JlZmVyZW5jZSk6IENoZWNrIGtpbmQgZmllbGQgcmF0aGVyIHRoYW4gdmFyaWFibGUKLQlmaWVsZC4KLQotVHVlIEphbiAyMyAxNTo1NDoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYzogVmFyaW91cyBjaGFuZ2VzIHRvIGhhbmRsZSByZWFkaW5nIEMrKyByZWZlcmVuY2UgdHlwZQotCWluZm9ybWF0aW9uLgotCi0JKiBkZWJ1Zy5oIChlbnVtIGRlYnVnX3Zhcl9raW5kKTogQWRkIERFQlVHX1ZBUl9JTExFR0FMLgotCShlbnVtIGRlYnVnX3Bhcm1fa2luZCk6IEFkZCBERUJVR19QQVJNX0lMTEVHQUwuCi0JKiBkZWJ1Zy5jIChkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzKTogSGFuZGxlIERFQlVHX0tJTkRfRlVOQ1RJT04uCi0KLQkqIGllZWUuYzogVmFyaW91cyBjaGFuZ2VzIHRvIHdyaXRlIG91dCBkZWZpbml0aW9ucyBvZiBDKysgY2xhc3Nlcy4KLQotCSogZGVidWcuYyAoZGVidWdfYXBwZW5kX2ZpbGVuYW1lKTogUmVtb3ZlLgotCSogZGVidWcuaCAoZGVidWdfYXBwZW5kX2ZpbGVuYW1lKTogRG9uJ3QgZGVjbGFyZS4KLQotCSogc3RhYnMuYyAoc3RydWN0IHN0YWJfaGFuZGxlKTogUmVtb3ZlIGxhc3RfdHlwZSBmaWVsZC4gIEFkZAotCXNvX3N0cmluZyBhbmQgc29fdmFsdWUgZmllbGRzLgotCShmaW5pc2hfc3RhYik6IENhbGwgc3RhYl9lbWl0X3BlbmRpbmdfdmFycyBiZWZvcmUgY2FsbGluZwotCWRlYnVnX2VuZF9mdW5jdGlvbi4gIERvbid0IHdhcm4gYWJvdXQgcGVuZGluZyB2YXJpYWJsZXMuCi0JKHBhcnNlX3N0YWIpOiBBY2N1bXVsYXRlIE5fU08gc3RyaW5ncyB1bnRpbCBhIG5vbiBOX1NPIHN5bWJvbCBpcwotCXNlZW4sIHJhdGhlciB0aGFuIGNhbGxpbmcgZGVidWdfYXBwZW5kX2ZpbGVuYW1lLiAgQ2FsbAotCXN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgYmVmb3JlIGNhbGxpbmcgZGVidWdfZW5kX2Z1bmN0aW9uLiAgRG9uJ3QKLQlzZXQgaW5mby0+bGFzdF90eXBlLgotCi1UdWUgSmFuIDIzIDA5OjUzOjU0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBIYW5kbGUgdW5rbm93biBlbmRpYW5uZXNzLgotCVBhc3MgZnByaW50ZiB0byBJTklUX0RJU0FTU0VNQkxFX0lORk8uCi0KLU1vbiBKYW4gMjIgMTY6NDY6NDMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQlBZGQgbmV3IG9wdGlvbiAtLXNob3ctcmF3LWluc24uCi0JKiBvYmpkdW1wLmMgKHNob3dfcmF3X2luc24pOiBOZXcgZ2xvYmFsLgotCSh1c2FnZSk6IFVwZGF0ZS4KLQkobG9uZ19vcHRpb25zKTogVXBkYXRlLgotCShkaXNhc3NlbWJsZV9kYXRhKTogU2V0IGRpc2FzbV9pbmZvLmZsYWdzIGlmIC0tc2hvdy1yYXctaW5zbi4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogU2V0IG5ldyBhcmNoLG1hY2gsZW5kaWFuIGZpZWxkcyBpbgotCWRpc2FzbV9pbmZvLgotCi1Nb24gSmFuIDIyIDE5OjI5OjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jOiBFeHRlbnNpdmUgY2hhbmdlcyB0byBwYXNzIGEgc2luZ2xlIGluZm8gYXJndW1lbnQgYXJvdW5kCi0JaW4gdGhlIHJlYWRpbmcgcm91dGluZXMsIHJhdGhlciB0aGFuIHNldmVyYWwgYXJndW1lbnRzLiAgQWRkIGNvZGUKLQl0byByZWFkIEMrKyBkZWJ1Z2dpbmcgcmVjb3Jkcy4KLQotCSogZGVidWcuaCAoZGVidWdfZ2V0X3R5cGVfc2l6ZSk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9maWVsZF9uYW1lKTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X2ZpZWxkX2JpdHBvcyk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9maWVsZF9iaXRzaXplKTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X2ZpZWxkX3Zpc2liaWxpdHkpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfZmllbGRfcGh5c25hbWUpOiBEZWNsYXJlLgotCSogZGVidWcuYyAoZGVidWdfZ2V0X3JlYWxfdHlwZSk6IEhhbmRsZSBERUJVR19LSU5EX1RBR0dFRC4KLQkoZGVidWdfZ2V0X3R5cGVfc2l6ZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X2ZpZWxkX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX2dldF9maWVsZF9iaXRwb3MpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX2dldF9maWVsZF9iaXRzaXplKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfZmllbGRfdmlzaWJpbGl0eSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X2ZpZWxkX3BoeXNuYW1lKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z193cml0ZV90eXBlKTogTWFrZSBzdXJlIHdlIHBhc3MgdGhlIHJlYWwga2luZCwgbm90IElORElSRUNULAotCXRvIHRhZ190eXBlLiAgUGFzcyB0aGUgbmFtZSByZWN1cnNpdmVseSBmb3IgSU5ESVJFQ1QuCi0KLUZyaSBKYW4gMTkgMTI6MzE6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkZWJ1Zy5oIChzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zKTogUmVtb3ZlIGVsbGlwc2lzX3R5cGUuICBBZGQgaW50Ci0JYW5kIGJvb2xlYW4gcGFyYW1ldGVycyB0byBmdW5jdGlvbl90eXBlLiAgQWRkIGJvb2xlYW4gcGFyYW1ldGVyIHRvCi0JbWV0aG9kX3R5cGUuCi0JKGRlYnVnX21ha2VfZWxsaXBzaXNfdHlwZSk6IERvbid0IGRlY2xhcmUuCi0JKGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSk6IEFkZCBkZWJ1Z190eXBlICogYW5kIGJvb2xlYW4KLQlwYXJhbWV0ZXJzLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShkZWJ1Z19tYWtlX21ldGhvZF90eXBlKTogQWRkIGJvb2xlYW4gcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKGRlYnVnX2dldF9wYXJhbWV0ZXJfdHlwZXMpOiBBZGQgYm9vbGVhbiAqIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShkZWJ1Z19nZXRfdGFyZ2V0X3R5cGUpOiBEZWNsYXJlLgotCSogZGVidWcuYyAoc3RydWN0IGRlYnVnX2Z1bmN0aW9uX3R5cGUpOiBBZGQgZmllbGRzIGFyZ190eXBlcyBhbmQKLQl2YXJhcmdzLgotCShzdHJ1Y3QgZGVidWdfbWV0aG9kX3R5cGUpOiBBZGQgZmllbGQgdmFyYXJncy4KLQkoZGVidWdfZWxsaXBzaXNfdHlwZSwgRUxMSVBTSVNfUCk6IFJlbW92ZS4KLQkoZGVidWdfbWFrZV9lbGxpcHNpc190eXBlKTogUmVtb3ZlLgotCShkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUpOiBBZGQgYXJnX3R5cGVzIGFuZCB2YXJhcmdzIHBhcmFtZXRlcnMuCi0JKGRlYnVnX21ha2VfbWV0aG9kX3R5cGUpOiBBZGQgdmFyYXJncyBwYXJhbWV0ZXIuCi0JKGRlYnVnX2dldF9wYXJhbWV0ZXJfdHlwZXMpOiBBZGQgcHZhcmFyZ3MgcGFyYW1ldGVyLgotCShkZWJ1Z19nZXRfdGFyZ2V0X3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX3dyaXRlX3R5cGUpOiBJbiBjYXNlIERFQlVHX0tJTkRfRlVOQ1RJT04sIHB1c2ggYXJndW1lbnQKLQl0eXBlcyBhbmQgcGFzcyBjb3VudCB0byBmdW5jdGlvbl90eXBlLiAgSW4gREVCVUdfS0lORF9NRVRIT0QsIHVzZQotCWEgc2lnbmVkIGludCBmb3IgdGhlIGNvdW50LCBkb24ndCBjYWxsIGVsbGlwc2lzX3R5cGUsIGFuZCBwYXNzCi0JdmFyYXJncyB0byBtZXRob2RfdHlwZS4KLQkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8pOiBBZGQgdmFyYXJncyBmaWVsZC4KLQkoc3RhYl9kZW1hbmdsZV9hcmd0eXBlcyk6IEFkZCBwdmFyYXJncyBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkoc3RhYl9kZW1hbmdsZV9hcmdzKTogTGlrZXdpc2UuCi0JKHN0YWJfZGVtYW5nbGVfdHlwZSk6IEluIGNhc2UgJ0YnLCBwaWNrIHVwIGFyZ3VtZW50IHR5cGVzLgotCSogcHJkYmcuYyAocHJfZWxsaXBzaXNfdHlwZSk6IFJlbW92ZS4KLQkocHJfZnVuY3Rpb25fdHlwZSk6IEFkZCBhcmdjb3VudCBhbmQgdmFyYXJncyBwYXJhbWV0ZXJzLgotCShwcl9tZXRob2RfdHlwZSk6IEFkZCB2YXJhcmdzIHBhcmFtZXRlci4KLQkqIGllZWUuYyAoaWVlZV9lbGxpcHNpc190eXBlKTogUmVtb3ZlLgotCShpZWVlX2Z1bmN0aW9uX3R5cGUpOiBBZGQgYXJnY291bnQgYW5kIHZhcmFyZ3MgcGFyYW1ldGVycy4KLQkoaWVlZV9tZXRob2RfdHlwZSk6IEFkZCB2YXJhcmdzIHBhcmFtZXRlci4gIFJlbW92ZSBtb3N0IG9mCi0JZnVuY3Rpb24gYm9keSwgYW5kIGp1c3QgY2FsbCBpZWVlX2Z1bmN0aW9uX3R5cGUuCi0KLQkqIHN0YWJzLmM6IEluY2x1ZGUgImRlbWFuZ2xlLmgiLiAgQWRkZWQgc2V2ZXJhbCBuZXcgc3RhdGljCi0JZnVuY3Rpb25zIG5vdCBsaXN0ZWQgYmVsb3cgdG8gZGVtYW5nbGUgYXJndW1lbnQgdHlwZXM7IHRoZXkgYXJlCi0JYWxsIGNhbGxlZCB2aWEgc3RhYl9kZW1hbmdsZV9hcmd0eXBlcy4KLQkoZmluaXNoX3N0YWIpOiBJZiB0aGUga2luZCBvZiBhbiB1bmRlZmluZWQgdGFnIGlzCi0JREVCVUdfS0lORF9JTExFR0FMLCB1c2UgREVCVUdfS0lORF9TVFJVQ1QgaW5zdGVhZC4gIFdhcm4gaWYgdGhlcmUKLQlhcmUgYW55IHBlbmRpbmcgdmFyaWFibGUuCi0JKHBhcnNlX3N0YWIpOiBEb24ndCBjbG9zZSB0aGUgZnVuY3Rpb24gd2hlbiB0aGUgYmxvY2sgZGVwdGggZ29lcwotCXRvIHplcm8uICBQYXNzIHZhbHVlIHRvIGRlYnVnX2VuZF9mdW5jdGlvbi4KLQkocGFyc2Vfc3RhYl9zdHJpbmcpOiBJbiBjYXNlICdUJywgcGFzcyB0aGUgbmFtZSB0bwotCXBhcnNlX3N0YWJfdHlwZS4KLQkocGFyc2Vfc3RhYl90eXBlKTogSW4gY2FzZSAneCcsIHVzZSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUuICBJbgotCWNhc2UgJyMnLCBoYW5kbGUgZnVuY3Rpb25zIHdpdGggdmFyaWFibGUgbnVtYmVycyBvZiBhcmd1bWVudHMuCi0JKHBhcnNlX3N0YWJfc3RydWN0X3R5cGUpOiBBZGQgdGFnbmFtZSBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkocGFyc2Vfc3RhYl9tZW1iZXJzKTogQWRkIHRhZ25hbWUgYW5kIHR5cGVudW1zIHBhcmFtZXRlcnMuICBDaGFuZ2UKLQlhbGwgY2FsbGVycy4gIElmIHRoZSB0eXBlIG9mIGEgbWV0aG9kIGlzIGEgc3R1YiwgY2FsbAotCXBhcnNlX3N0YWJfYXJndHlwZXMgdG8gZGVtYW5nbGUgdGhlIGFyZ3VtZW50IHR5cGVzIGFuZCBnZXQgdGhlCi0JcGh5c2ljYWwgbmFtZSBvZiB0aGUgZnVuY3Rpb24uCi0JKHBhcnNlX3N0YWJfYXJndHlwZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdGFiX3JlY29yZF92YXJpYWJsZSk6IEZvciBhIERFQlVHX0dMT0JBTCBvciBERUJVR19TVEFUSUMKLQl2YXJpYWJsZSwgY2FsbCBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgaW1tZWRpYXRlbHkuCi0JKHN0YWJfZmluZF90YWdnZWRfdHlwZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGRlYnVnLmggKGVudW0gZGVidWdfdHlwZV9raW5kKTogQWRkIERFQlVHX0tJTkRfSUxMRUdBTC4KLQkoc3RydWN0IGRlYnVnX3dyaXRlX2Zucyk6IEFkZCBmaWVsZCBlbGxpcHNpc190eXBlLiAgQWRkIGlkCi0JcGFyYW1ldGVyIHRvIHN0YXJ0X3N0cnVjdF90eXBlLCBzdGFydF9jbGFzc190eXBlLCBhbmQgdGFnX3R5cGUuCi0JKGRlYnVnX21ha2VfZWxsaXBzaXNfdHlwZSk6IERlY2xhcmUuCi0JKGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF90eXBlX2tpbmQpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfcmV0dXJuX3R5cGUpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzKTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X2ZpZWxkcyk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9maWVsZF90eXBlKTogRGVjbGFyZS4KLQkqIGRlYnVnLmMgKHN0cnVjdCBkZWJ1Z19oYW5kbGUpOiBBZGQgZmllbGRzIGNsYXNzX2lkIGFuZCBiYXNlX2lkLgotCShzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZSk6IEFkZCBmaWVsZCBpZC4KLQkoc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50KTogUmVuYW1lIGFyZ3R5cGVzIHRvIHBoeXNuYW1lLgotCUNoYW5nZSBhbGwgdXNlcy4KLQkoZGVidWdfZWxsaXBzaXNfdHlwZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKEVMTElQU0lTX1ApOiBOZXcgbWFjcm8uCi0JKGRlYnVnX21ha2VfZWxsaXBzaXNfdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfbWFrZV9tZXRob2RfdmFyaWFudCk6IFJlbmFtZSBhcmd0eXBlcyB0byBwaHlzbmFtZS4KLQkoZGVidWdfbWFrZV9zdGF0aWNfbWV0aG9kX3ZhcmlhbnQpOiBMaWtld2lzZS4KLQkoZGVidWdfbmFtZV90eXBlKTogQWx3YXlzIHB1dCB0eXBlcyBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KLQkoZGVidWdfZmluZF9uYW1lZF90eXBlKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19maW5kX3RhZ2dlZF90eXBlKTogVHJlYXQgREVCVUdfS0lORF9JTExFR0FMIHNwZWNpYWxseSwKLQlyYXRoZXIgdGhhbiBERUJVR19LSU5EX1ZPSUQuCi0JKGRlYnVnX2dldF9yZWFsX3R5cGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfdHlwZV9raW5kKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfcmV0dXJuX3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX2dldF9wYXJhbWV0ZXJfdHlwZXMpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX2dldF9maWVsZHMpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX2dldF9maWVsZF90eXBlKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z193cml0ZSk6IEluaXRpYWxpemUgYmFzZV9pZC4KLQkoZGVidWdfd3JpdGVfdHlwZSk6IFBhc3MgbmV3IGlkIGFyZ3VtZW50IHRvIHRhZ190eXBlLiAgSGFuZGxlCi0JREVCVUdfS0lORF9JTExFR0FMLiAgVXNlIGlkIGZvcglERUJVR19LSU5EX1NUUlVDVCBhbmQKLQlERUJVR19LSU5EX1VOSU9OLiAgSGFuZGxlIGVsbGlwc2lzIGZvciBtZXRob2QgYXJndW1lbnRzLgotCShkZWJ1Z193cml0ZV9jbGFzc190eXBlKTogRG9uJ3QgZGVyZWZlcmVuY2Uga2NsYXNzIGlmIGl0IGlzIE5VTEwuCi0JVXNlIGlkLgotCSogcHJkYmcuYyAocHJfZm5zKTogQWRkIHByX2VsbGlwc2lzX3R5cGUuCi0JKHByX2VsbGlwc2lzX3R5cGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwcl9wb2ludGVyX3R5cGUpOiBJZiB0aGlzIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheSwgcGFyZW50aGVzaXplCi0JaXQgY29ycmVjdGx5LgotCShwcl9zdGFydF9zdHJ1Y3RfdHlwZSk6IEFkZCBpZCBwYXJhbWV0ZXIuCi0JKHByX3N0YXJ0X2NsYXNzX3R5cGUpOiBMaWtld2lzZS4KLQkocHJfdGFnX3R5cGUpOiBMaWtld2lzZS4KLQkocHJfZml4X3Zpc2liaWxpdHkpOiBBZGQgdGhlIHZpc2liaWxpdHkgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2ssCi0Jbm90IHRoZSBzZWNvbmQgZWxlbWVudCBvbiB0aGUgc3RhY2suCi0JKHByX3N0cnVjdF9maWVsZCk6IFBvcCB0aGUgc3RhY2sgYmVmb3JlIGNhbGxpbmcgcHJfZml4X3Zpc2liaWxpdHkuCi0JKHByX2NsYXNzX3N0YXRpY19tZW1iZXIpOiBMaWtld2lzZS4KLQkocHJfY2xhc3Nfc3RhcnRfbWV0aG9kKTogRG9uJ3QgcHVzaCBhIHR5cGUsIGp1c3Qgc2V0IHRoZSBtZXRob2QKLQluYW1lIGluIHRoZSB0eXBlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotCShwcl9jbGFzc19lbmRfbWV0aG9kKTogRG9uJ3QgcG9wIHRoZSBzdGFjay4KLQkocHJfY2xhc3NfbWV0aG9kX3ZhcmlhbnQpOiBSZW5hbWUgYXJndHlwZXMgcGFyYW1ldGVyIHRvIHBoeXNuYW1lLgotCUFwcGVuZCBjb25zdCBhbmQgdm9sYXRpbGUgcmF0aGVyIHRoYW4gcHJlcGVuZGluZyB0aGVtLiAgQWRkIGEKLQlzcGFjZSBhZnRlciB0aGUgcGh5c25hbWUuCi0JKHByX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCk6IExpa2V3aXNlLgotCSogaWVlZS5jIChpZWVlX2Zucyk6IEFkZCBpZWVlX2VsbGlwc2lzX3R5cGUuCi0JKGllZWVfZGVmaW5lX25hbWVkX3R5cGUpOiBVc2UgREVCVUdfS0lORF9JTExFR0FMIHJhdGhlciB0aGFuCi0JREVCVUdfS0lORF9WT0lELgotCSh3cml0ZV9pZWVlX2RlYnVnZ2luZ19pbmZvKTogTGlrZXdpc2UuCi0JKGllZWVfdHlwZGVmKTogTGlrZXdpc2UuCi0JKGllZWVfZWxsaXBzaXNfdHlwZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGllZWVfc3RhcnRfc3RydWN0X3R5cGUpOiBBZGQgaWQgcGFyYW1ldGVyLgotCShpZWVlX3N0YXJ0X2NsYXNzX3R5cGUpOiBMaWtld2lzZS4KLQkoaWVlZV90YWdfdHlwZSk6IExpa2V3aXNlLgotCShpZWVlX2NsYXNzX21ldGhvZF92YXJpYW50KTogUmVuYW1lIG5hbWUgdG8gcGh5c25hbWUuCi0JKGllZWVfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50KTogTGlrZXdpc2UuCi0KLQkqIE1ha2VmaWxlLmluIChERUJVR19PQkpTKTogUmVtb3ZlIHByZGJnLm8uCi0JKCQoT0JKRFVNUF9QUk9HKSk6IERlcGVuZCB1cG9uLCBhbmQgbGluayBhZ2FpbnN0LCBwcmRiZy5vLgotCi1UaHUgSmFuIDE4IDE3OjM1OjA2IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG1ha2VfdGFpbCk6IENoYW5nZWQgdGhlIG9yZGVyIG9mIHRoZSBzZWN0aW9ucyB0byBhdm9pZAotCWFuIGFsaWdubWVudCBwcm9ibGVtLgotCi1XZWQgSmFuIDE3IDE0OjIzOjAwIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc3Jjb252LmMgKHdyX2R1KTogU2V0IGR1LnN0YWNrZnJtdCB0byAwLgotCSh3cl91biwgd3Jfc2MpOiBFbWl0IGFsbCBzZWN0aW9ucywgZXZlbiB0aG9zZSB3aXRoIDAgc2l6ZS4KLQotVHVlIEphbiAxNiAxNjoxNTo0OSAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNyY29udi5jICh3cl9oZCk6IFNwYWNlIHNpemUgd2l0aGluIHNlZ21lbnQgd2FzIGJlaW5nCi0Jc3RvcmVkIGluIHNlZ21lbnQgaWRlbnRpZmllciBmaWVsZC4KLQotVHVlIEphbiAxNiAxMjowNzoyNSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW4gKEJVSUxEX05MTUNPTlYsIEJVSUxEX1NSQ09OViwgU1lTSU5GT19QUk9HLAotCUJVSUxEX0RMTFRPT0wpOiBQdXQgZGVmaW5pdGlvbnMgZm9yIHRoZXNlIGludG8gbWFrZWZpbGUgd2hlbgotCWNvbmZpZ3VyaW5nLCBpbnN0ZWFkIG9mIGFsd2F5cyBjbGVhcmluZyBpbiBtcHctbWFrZS5zZWQuCi0JKiBtcHctbWFrZS5zZWQ6IEVkaXQgb3V0IGFueSBob3N0X2FsaWFzIG9yIHRhcmdldF9hbGlhcyBzZXR0aW5ncywKLQlmaXggcGF0aG5hbWUgdG8gQkZEIGludGVybmFsIGluY2x1ZGUgZmlsZXMsIHJlbW92ZSBkZXBlbmRlbmN5Ci0JY2FsY3VsYXRpb24gcnVsZXMuCi0KLVRodSBKYW4gMTEgMTc6MzE6MzggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBBZGQgbmV3IHNlY3Rpb24gZmxhZ3MKLQlTRUNfe0VYQ0xVREUsU09SVF9FTlRSSUVTfS4KLQotVGh1IEphbiAxMSAxMTo0NTozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoZmlsdGVyX3N5bWJvbHMpOiBOVUxMIHRlcm1pbmF0ZSB0aGUgb3V0cHV0IHN5bWJvbHMuCi0JKGNvcHlfb2JqZWN0KTogQWxsb2NhdGUgc3BhY2UgZm9yIGEgcG9zc2libGUgZXh0cmEgTlVMTCBwb2ludGVyLgotCi0JKiBkZWJ1Zy5jIChkZWJ1Z19tYWtlX3VuZGVmaW5lZF90YWdnZWRfdHlwZSk6IE1ha2Ugc3VyZSB3ZSBhcmUKLQlnaXZlbiBhIGtpbmQgb2YgdHlwZSB3ZSBjYW4gaGFuZGxlLgotCShkZWJ1Z193cml0ZV90eXBlKTogSGFuZGxlIHVuZGVmaW5lZCBlbnVtcyBhbmQgc3RydWN0cy4KLQkoZGVidWdfd3JpdGVfY2xhc3NfdHlwZSk6IEhhbmRsZSB1bmRlZmluZWQgY2xhc3Nlcy4KLQkqIHByZGJnLmMgKHByX2VudW1fdHlwZSk6IEhhbmRsZSBhbiB1bmRlZmluZWQgZW51bS4KLQkqIGllZWUuYyAoaWVlZV9lbnVtX3R5cGUpOiBMaWtld2lzZS4KLQotV2VkIEphbiAxMCAxNTozMzoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGVkIGRlcGVuZGVuY2llcy4KLQkoQUxMT0NBLCBNQUxMT0MpOiBSZW1vdmUgdmFyaWFibGVzLgotCShBRERMX0xJQlMpOiBSZW1vdmUgJChNQUxMT0MpIGZyb20gZGVmaW5pdGlvbi4KLQkqIGFsbG9jYS5jLCBnbWFsbG9jLmM6IFJlbW92ZS4KLQotTW9uIEphbiAgOCAxODowMjoyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYzogQWRkIGdsb2JhbCBmdW5jdGlvbiB3cml0ZV9pZWVlX2RlYnVnZ2luZ19pbmZvIGFuZCBhCi0JYnVuY2ggb2Ygc3RhdGljIGZ1bmN0aW9ucyBhbmQgc3RydWN0cyB1c2VkIHRvIHdyaXRlIG91dCBJRUVFCi0JZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCSogYnVkYmcuaCAod3JpdGVfaWVlZV9kZWJ1Z2dpbmdfaW5mbyk6IERlY2xhcmUuCi0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfdHlwZSk6IEFkZCBwc2xvdCBmaWVsZC4KLQkoZW51bSBidWlsdGluX3R5cGVzKTogRGVmaW5lLgotCShpZWVlX2J1aWx0aW5fdHlwZSk6IEZvciBhIHBvaW50ZXIsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5hbWVkCi0JdHlwZS4gIFVzZSBlbnVtIHZhbHVlcyByYXRoZXIgdGhhbiBudW1iZXJzLgotCShpZWVlX2FsbG9jX3R5cGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShpZWVlX3JlYWRfdHlwZV9pbmRleCk6IFVzZSBpZWVlX2FsbG9jX3R5cGUuCi0JKHBhcnNlX2llZWVfYmIpOiBMaWtld2lzZS4KLQkocGFyc2VfaWVlZV90eSk6IExpa2V3aXNlLiAgVXNlIGllZWVfYnVpbHRpbl90eXBlIGZvciBhcnJheSByYW5nZSwKLQlyYXRoZXIgdGhhbiBtYWtpbmcgYSBuZXcgaW50ZWdlciB0eXBlLiAgU3RvcmUgdGhlIG5ldyB0eXBlIGluIHRoZQotCXNsb3QsIGlmIHRoZXJlIGlzIG9uZS4KLQkocGFyc2VfaWVlZV9hdG4pOiBUcmVhdCBBVE4xMCBhcyBkZWZpbmluZyBhIHJlZ2lzdGVyIHZhcmlhYmxlLgotCShpZWVlX3JlZ25vX3RvX2dlbnJlZyk6IFJlbmFtZSBmcm9tIGllZWVfcmVnbm9fdG9fZ2VuLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKGllZWVfZ2VucmVnX3RvX3JlZ25vKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl90eXBlKTogQWRkIG5ldyB0eXBlbmFtZSBwYXJhbWV0ZXIuICBDaGFuZ2UKLQlhbGwgY2FsbGVycy4KLQkocGFyc2Vfc3RhYl9yYW5nZV90eXBlKTogQWRkIG5ldyB0eXBlbmFtZSBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQotCSogZGVidWcuaCAoc3RydWN0IGRlYnVnX3dyaXRlX2Zucyk6IEFkZCB0YWcgcGFyYW1ldGVyIHRvCi0JZW51bV90eXBlLCBzdGFydF9zdHJ1Y3RfdHlwZSwgYW5kIHN0YXJ0X2NsYXNzX3R5cGUuCi0JKiBkZWJ1Zy5jIChkZWJ1Z193cml0ZV90eXBlKTogUGFzcyBhbnkgdGFnIG5hbWUgdG8KLQlzdGFydF9zdHJ1Y3RfdHlwZSwgZGVidWdfd3JpdGVfY2xhc3NfdHlwZSwgYW5kIGVudW1fdHlwZS4gIElmCi0JREVCVUdfS0lORF9UQUdHRUQsIHBhc3MgdGhlIG5hbWUgaW4gdGhlIHJlY3Vyc2l2ZSBjYWxsLgotCShkZWJ1Z193cml0ZV9jbGFzc190eXBlKTogQWNjZXB0IGEgbmV3IHRhZyBwYXJhbWV0ZXIsIGFuZCBwYXNzIGl0Ci0JdG8gc3RhcnRfY2xhc3NfdHlwZS4KLQkqIHByZGJnLmMgKHBvcF90eXBlKTogRG9uJ3QgcmVtb3ZlICcrJyBjaGFyYWN0ZXIuCi0JKHByX2VudW1fdHlwZSk6IEFjY2VwdCBhbmQgdXNlIHRhZyBwYXJhbWV0ZXIuCi0JKHByX3N0YXJ0X3N0cnVjdF90eXBlKTogTGlrZXdpc2UuCi0JKHByX3N0YXJ0X2NsYXNzX3R5cGUpOiBMaWtld2lzZS4KLQkocHJfY2xhc3NfYmFzZWNsYXNzKTogQWRqdXN0IGFsZ29yaXRobSB1c2VkIHRvIGZpbmQgd2hlcmUgdG8gcHV0Ci0JdGhlIGJhc2VjbGFzcyBuYW1lLgotCShwcl90YWcpOiBEb24ndCBib3RoZXIgdG8gaW5zZXJ0IHRoZSB0YWcgbmFtZS4KLQotCSogb2JqY29weS5jOiBJbmNsdWRlIGJ1ZGJnLmguCi0JKGNvbnZlcnRfZGVidWdnaW5nKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoT1BUSU9OX0RFQlVHR0lORyk6IERlZmluZS4KLQkoY29weV9vcHRpb25zKTogQWRkICJkZWJ1Z2dpbmciLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLWRlYnVnZ2luZy4KLQkoaXNfc3RyaXBfc2VjdGlvbik6IFNraXAgZGVidWdnaW5nIHNlY3Rpb25zIGlmIGNvbnZlcnRfZGVidWdnaW5nLgotCShzZXR1cF9zZWN0aW9uLCBjb3B5X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZmlsdGVyX3N5bWJvbHMpOiBTa2lwIGRlYnVnZ2luZyBzeW1ib2xzIGlmIGNvbnZlcnRfZGVidWdnaW5nLgotCShjb3B5X29iamVjdCk6IElmIGNvbnZlcnRfZGVidWdnaW5nLCByZWFkIGFuZCB3cml0ZSBkZWJ1Z2dpbmcKLQlpbmZvcm1hdGlvbi4KLQkod3JpdGVfZGVidWdnaW5nX2luZm8pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb3B5X21haW4pOiBIYW5kbGUgLS1kZWJ1Z2dpbmcuCi0JKiBNYWtlZmlsZS5pbiAoREVCVUdfT0JKUyk6IE5ldyB2YXJpYWJsZS4KLQkoJChPQkpDT1BZX1BST0cpKTogRGVwZW5kIHVwb24gYW5kIGxpbmsgYWdhaW5zdCAkKERFQlVHX09CSlMpLgotCSgkKFNUUklQX1BST0cpKTogTGlrZXdpc2UuCi0JKE9CSkRVTVBfT0JKUyk6IFJlbW92ZSB2YXJpYWJsZS4KLQkoJChPQkpEVU1QX1BST0cpKTogVXNlIG9iamR1bXAubyAkKERFQlVHX09CSlMpIHJhdGhlciB0aGFuCi0JJChPQkpEVU1QX09CSlMpLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBEb2N1bWVudCAtLWRlYnVnZ2luZy4KLQotVGh1IEphbiAgNCAxNjozMToyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYzogTmV3IGZpbGUgd2l0aCBjb2RlIHRvIHJlYWQgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0JKiBidWRiZy5oIChwYXJzZV9pZWVlKTogRGVjbGFyZS4KLQkqIHJkZGJnLmMgKHJlYWRfZGVidWdnaW5nX2luZm8pOiBIYW5kbGUgSUVFRSBmbGF2b3VyIGZpbGVzLgotCShyZWFkX2llZWVfZGVidWdnaW5nX2luZm8pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDRklMRVMpOiBBZGQgaWVlZS5jLgotCShPQkpEVU1QX09CSlMpOiBBZGQgaWVlZS5vLgotCi0JKiBidWNvbW0uaCAoeHJlYWxsb2MpOiBDaGFuZ2UgdHlwZSBvZiBmaXJzdCBwYXJhbWV0ZXIgZnJvbSBjaGFyICoKLQl0byBQVFIuCi0KLVR1ZSBKYW4gIDIgMTc6NDQ6MDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHRhcmdldHMgdG8gYXV0b21hdGljYWxseSByZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQlSZW1vdmUgdGFyZ2V0cyB3aGljaCBqdXN0IGxpc3RlZCBkZXBlbmRlbmNpZXMgb2YgLm8gZmlsZXMuCi0JKERFUCk6IE5ldyB2YXJpYWJsZS4KLQkoSEZJTEVTLCBHRU5FUkFURURfSEZJTEVTKTogTmV3IHZhcmlhYmxlcy4KLQkoQ0ZJTEVTLCBHRU5FUkFURURfQ0ZJTEVTKTogTmV3IHZhcmlhYmxlcy4KLQkodW5kZXJzY29yZS5jKTogRG9uJ3QgZG8gYW55dGhpbmcsIGp1c3QgZGVwZW5kIHVwb24gc3RhbXAtdW5kZXIuCi0JKHN0YW1wLXVuZGVyKTogTmV3IHRhcmdldDsgZG8gd2hhdCB1bmRlcnNjb3JlLmMgdXNlZCB0byBkby4KLQkobmxtY29udi5vKTogRGVwZW5kIHVwb24gc3ltLmggYW5kIGVjb2ZmLmguCi0JKC5kZXAsIC5kZXAxLCBkZXAuc2VkLCBkZXAsIGRlcC1pbik6IE5ldyB0YXJnZXRzLgotCShzdGFnZTEsIHN0YWdlMiwgc3RhZ2UzLCBhZ2FpbnN0LCBjb21wYXJpc29uKTogUmVtb3ZlLgotCShkZS1zdGFnZTEsIGRlLXN0YWdlMiwgZGUtc3RhZ2UzKTogUmVtb3ZlLgotCShjbGVhbiwgZGlzdGNsZWFuKTogUmVtb3ZlIHN0YW1wLXVuZGVyIGFuZCBkZXAuc2VkLgotCSogZGVwLWluLnNlZDogTmV3IGZpbGUuCi0KLQlJbXBsZW1lbnQgZ2VuZXJpYyBkZWJ1Z2dpbmcgc3VwcG9ydC4gIEltcGxlbWVudCBhIHN0YWJzIHJlYWRlciBhbmQKLQlhIGdlbmVyaWMgcHJpbnRlci4KLQkqIGJ1ZGJnLmgsIGRlYnVnLmMsIGRlYnVnLmgsIHByZGJnLmMsIHJkZGJnLmMsIHN0YWJzLmM6IE5ldyBmaWxlcy4KLQkqIG9iamR1bXAuYzogSW5jbHVkZSAiZGVidWcuaCIgYW5kICJidWRiZy5oIi4KLQkoZHVtcF9kZWJ1Z2dpbmcpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCSh1c2FnZSk6IE1lbnRpb24gLS1kZWJ1Z2dpbmcuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAiZGVidWdnaW5nIi4KLQkoZGlzcGxheV9iZmQpOiBIYW5kbGUgLS1kZWJ1Z2dpbmcuCi0JKiBNYWtlZmlsZS5pbiAoT0JKRFVNUF9PQkpTKTogTmV3IHZhcmlhYmxlLgotCSgkKE9CSkRVTVBfUFJPRykpOiBVc2UgJChPQkpEVU1QX09CSlMpLgotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtLWRlYnVnZ2luZy4KLQotU2F0IERlYyAzMCAwOTo1OTo1MSAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG5tLmMgKCBsb25nX29wdGlvbnMpOiBBZGQgIi0tZGVmaW5lZC1vbmx5IiBvcHRpb24uCi0JKHVzYWdlKTogVXBkYXRlIGZvciBuZXcgIi0tZGVmaW5lZC1vbmx5IiBvcHRpb24uCi0JKGZpbHRlcl9zeW1ib2xzKTogSGFuZGxlICItLWRlZmluZWQtb25seSIuCi0KLUZyaSBEZWMgMjkgMTY6MDQ6NTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcnBhcnNlLnk6IEluY2x1ZGUgImJ1Y29tbS5oIiwgbm90IDxzeXNkZXAuaD4uCi0JKiBubG1oZWFkZXIueTogRG9uJ3QgaW5jbHVkZSAic3lzZGVwLmgiLgotCi1UdWUgRGVjIDI2IDE4OjIzOjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbm0uYyAocHJpbnRfc3ltZGVmX2VudHJ5KTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JYmZkX2dldF9lbHRfYXRfaW5kZXguCi0KLVNhdCBEZWMgMjMgMTE6MDM6MTYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jZ3luc3UuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKERMTFRPT0xfREVGUyk6IEJ1aWxkIGRsbHRvb2wgZm9yIFBvd2VyUEMgaWYgdGFyZ2V0Ci0JaXMgcG93ZXJwYyotKi13aW4qIGluIGFkZGl0aW9uIHRvIHBvd2VycGMqLSotKnBlKi4KLQotRnJpIERlYyAxNSAxNjozMDo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZW5kaWFuX3N0cmluZyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGRpc3BsYXlfdGFyZ2V0X2xpc3QpOiBVc2UgaXQuCi0JKiBubG1jb252LmMgKG1haW4pOiBVc2UgbmV3IGJmZF9iaWdfZW5kaWFuIG1hY3JvLgotCi1GcmkgRGVjIDE1IDA3OjUxOjM0IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZmlsbF9vcmRpbmFscyk6IFN0YXJ0IGZyb20gMSBpZiBubyBvdGhlciBpbnN0cnVjdGlvbnMKLSAJZ2l2ZW4uCi0KLVR1ZSBEZWMgMTIgMTI6MDU6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiBSZW1vdmUgJChERU1BTkdMRVJfUFJPRykuMS4gIEZyb20gUm9uYWxkCi0JRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+LgotCi1Nb24gRGVjIDExIDE0OjMzOjA1IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbWFjLWJpbnV0aWxzLnI6IEZpeCBjb3B5cmlnaHQgYW5kIHZlcnNpb24gc3RyaW5ncy4KLQotCSogTWFrZWZpbGUuaW4gKHZlcnNpb24pOiBSZW1vdmUsIG5vIGxvbmdlciB1c2VkLgotCi1GcmkgRGVjICAxIDE0OjQxOjU2IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkIChpbnN0YWxsLCBpbnN0YWxsLW9ubHkpOiBFZGl0IGluIE1hYy1zcGVjaWZpYwotCWluc3RhbGwgcHJvY2VkdXJlLgotCi1UaHUgTm92IDMwIDIwOjI2OjAyIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKHBwY19qdGFiKTogVGhlIGJpbmFyeSBnbHVlIGZvciBQb3dlclBDIGRsbCBsaW5rYWdlLAotCWluY2x1ZGluZyB0aGUgcmV0dXJuIGluc3RydWN0aW9uLgotCXNpbmZvOiBhZGRlZCBhIHByZWZlcnJlZCBhbGlnbm1lbnQgZmllbGQuCi0JKHNlY2RhdGEpOiBzZWN0aW9uIGRhdGEgZm9yIHRoZSBQb3dlclBDIHZlcnNpb24uCi0JKG1ha2Vfb25lX2xpYl9maWxlKTogTW9yZSBzeW1ib2xzLCBNb3JlIHNlY3Rpb25zIChwZGF0YSwgcmRhdGEpCi0JKG1ha2VfdGFpbCk6IFVzZSBpZGF0YSQ2IGluc3RlYWQgb2YgaWRhdGEkNyBmb3IgcHBjLiBBbHNvIGFkZGVkIGEKLQlOVUxMIGlkYXRhJDMgZGVzY3JpcHRvciAodGVtcG9yYXJ5KS4KLQotVHVlIE5vdiAyOCAxNzoyMzo0NCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGZpbGxfb3JkaW5hbHMpOiBEb24ndCByZWZlcmVuY2UgZF9leHBvcnRfdmVjIGlmCi0JdGhlcmUgYXJlIG5vIGV4cG9ydGVkIGZ1bmN0aW9ucy4KLQotTW9uIE5vdiAyNyAxMzowNTo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mIDIuNy4KLQotV2VkIE5vdiAyMiAxMzoxNzoxNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZmlsbF9vcmRpbmFscyk6IFN0YXJ0IGFzc2lnbmluZyBvcmRpbmFscyBhdCAxLgotCi0JKiBNYWtlZmlsZS5pbiAoRVhQRUNUKTogVXNlICQkciwgbm90ICQke3Jvb3RtZX0uCi0JKGNoZWNrKTogU2V0IHIsIG5vdCByb290bWUuCi0KLVR1ZSBOb3YgMjEgMTg6MDQ6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBCRkRfTkVFRF9ERUNMQVJBVElPTi4KLQkqIGFjY29uZmlnLmg6IFB1dCBORUVEX0RFQ0xBUkFUSU9OX0ZQUklOVEYgaW4gQFRPUEAgc2VjdGlvbi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi42LgotCi1GcmkgTm92IDE3IDEwOjM0OjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBVc2UgQGhvc3RAIGFuZCBAdGFyZ2V0QCwgbm90Ci0JJChob3N0X2Nhbm9uaWNhbCkgYW5kICQodGFyZ2V0X2Nhbm9uaWNhbCkuCi0KLVRodSBOb3YgMTYgMDM6Mzk6MjAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlWZXJzaW9uIDIuNiByZWxlYXNlZC4KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlIHRvIDIuNi4KLQotV2VkIE5vdiAxNSAxMjoxNDoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogRGVmaW5lLgotCShjaGVjayk6IFBhc3MgQ0MgYW5kIENGTEFHUyB0byBydW50ZXN0LgotCi0JKiBubS5jIChkaXNwbGF5X3JlbF9maWxlKTogRG9uJ3QgcmVxdWlyZSBhIERZTkFNSUMgb2JqZWN0IHdoZW4KLQlkdW1waW5nIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLQotCSogb2JqZHVtcC5jIChjb21wYXJlX3N5bWJvbHMpOiBTb3J0IGdsb2JhbCBzeW1ib2xzIGJlZm9yZSBsb2NhbAotCXN5bWJvbHMgYmVmb3JlIGRlYnVnZ2luZyBzeW1ib2xzLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBEb24ndCBmdXR6IGFyb3VuZCBsb29raW5nIGZvciBhIGdsb2JhbAotCXN5bWJvbCB3aXRoIHRoZSBzYW1lIHZhbHVlLgotCi1UdWUgTm92IDE0IDE3OjE5OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jOiBVc2UgRk9QRU5fKiBtYWNyb3MgcmF0aGVyIHRoYW4gInIiIG9yICJ3Ii4KLQotCSogZGxsdG9vbC5jIChmaWxsX29yZGluYWxzKTogQ29ycmVjdCBtZW1zZXQgY2FsbC4KLQotU3VuIE5vdiAxMiAxMjo1NjowNSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZCAoREVNQU5HTEVSX1BST0cpOiBFZGl0IG91dCBhdHRlbXB0cyB0byBkbyBhbnl0aGluZwotIAl3aXRoIHRoZSBtYW4gcGFnZS4KLQotRnJpIE5vdiAxMCAxMTo0MToyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoc2V0dXBfc2VjdGlvbik6IENvcHkgdGhlIHNlY3Rpb24gbG1hIGluZGVwZW5kZW50bHkgb2YKLQl0aGUgdm1hLgotCi1XZWQgTm92ICA4IDExOjMzOjAwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJzdXAuYyAoYXJfb3Blbik6IENhc3QgbWFsbG9jIHJldHVybiB2YWx1ZS4KLQotVHVlIE5vdiAgNyAwOTowMToyNiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluLCBjb25maWd1cmUgKERMTFRPT0xfREVGUyk6IEFkZGVkIHBwYyB0YXJnZXQuCi0JKiBkbGx0b29sLmMgKE1QUEMpOiBBZGRlZCBiYXNpYyBQUEMgZGVmaW5pdGlvbnMuCi0KLVR1ZSBOb3YgIDcgMTQ6MDI6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHRyZWF0IHJzNjAwMC0qLWx5bngqIHNwZWNpYWxseS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy9yc2x5bng6IFJlbW92ZS4KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgQHRhcmdldF9tYWtlZmlsZV9mcmFnbWVudEAuCi0KLU1vbiBOb3YgIDYgMTU6MDA6NTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBidWNvbW0uaDogSW5jbHVkZSA8c3lzL3R5cGVzLmg+LgotCSogYXIuYzogRG9uJ3QgaW5jbHVkZSA8c3lzL3R5cGVzLmg+IG9yIDxzdGRpby5oPi4KLQkqIGJ1Y29tbS5jLCBkbGx0b29sLmMsIG5sbWNvbnYuYywgb2JqY29weS5jLCBvYmpkdW1wLmM6IExpa2V3aXNlLgotCi1GcmkgTm92ICAzIDEyOjM4OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jOiBJbmNsdWRlIDxzeXMvdHlwZXMuaD4uCi0KLQlQZXJtaXQgdXNlciB0byBvdmVycmlkZSBERU1BTkdMRVJfUFJPRyBmcm9tIGNvbW1hbmQgbGluZS4gIEZyb20KLQlNYW5mcmVkIEhvbGxzdGVpbiA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+LgotCSogTWFrZWZpbGUuaW4gKCQoREVNQU5HTEVSX1BST0cpKTogRGVwZW5kIHVwb24KLQkkKERFTUFOR0xFUl9QUk9HKS4xLgotCShpbnN0YWxsKTogRG9uJ3QgZGVwZW5kIHVwb24gJChERU1BTkdMRVJfUFJPRykuMS4gIE9ubHkgaW5zdGFsbAotCSQoREVNQU5HTEVSX1BST0cpLjEgaWYgJChERU1BTkdMRVJfUFJPRykgaXMgbm90IGVtcHR5LgotCi1XZWQgTm92ICAxIDE1OjA0OjU3IDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoc3lzbGV4Lm8pOiBhZGQgLUkkKHNyY2RpcikgaWYgY29tcGlsaW5nIGluIGEKLQlzZXBhcmF0ZSBkaXJlY3RvcnkuCi0KLU1vbiBPY3QgMzAgMTQ6MjQ6MTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfdmFsdWUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBVc2UgaXQuICBJZiB3ZSBuZWVkIHRoZSByaWdodCBzZWN0aW9uIGZvcgotCXRoZSBzeW1ib2wsIGFuZCB3ZSBjYW4ndCBmaW5kIGl0LCBwcmludCBhbiBvZmZzZXQgZnJvbSB0aGUgc2VjdGlvbgotCXJhdGhlciB0aGFuIHVzaW5nIGEgc3ltYm9sIGZyb20gc29tZSBvdGhlciBzZWN0aW9uLgotCi1UaHUgT2N0IDI2IDEwOjIzOjE0IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAobm9faWRhdGE0LCBub19pZGF0YTUpOiBOZXcuCi0JKGFybV9qdGFiKTogVXNlIGNvcnJlY3QgZW5jb2Rpbmcgb2YganVtcCBpbnN0cnVjdGlvbi4KLQkodXNhZ2UsIG1haW4sIG1ha2VfaGVhZCwgbWFrZV90YWlsKTogQWN0IG9uIG5vX2lkYXRhNCwgbm9faWRhdGE1LgotCi1XZWQgT2N0IDI1IDEyOjEwOjA3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBFZGl0IHBhdGhzIHRvIGdlbmVyYXRlZCB5LnRhYi5bY2hdIGZpbGVzLgotCi1GcmkgT2N0IDIwIDE4OjQwOjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aTogQ2hhbmdlIC0td2l0aC10YXJnZXRzIHRvIC0tZW5hYmxlLXRhcmdldHMuCi0KLVRodSBPY3QgMTkgMTc6NDc6NDEgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlIGV4dHJhbmVvdXMgdGFiIG9uIG90aGVyd2lzZSBlbXB0eSBsaW5lLAotCXdoaWNoIGNvbmZ1c2VzIG1hbnkgbm9uLUdOVSB2ZXJzaW9ucyBvZiAibWFrZSIuCi0KLVdlZCBPY3QgMTggMTY6MzE6NTggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChpMzg2X2p0YWIsIGFybV9qdGFiKTogTmV3Ci0JKGdlbl9saWJfZmlsZSk6IFJld3JpdHRlbiB0byB1c2UgYmZkLgotCi1GcmkgT2N0IDEzIDE2OjEwOjA3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEb24ndCBnaXZlIGVycm9yIG1lc3NhZ2UgaWYgZGxsdG9vbAotCXdhc24ndCBidWlsdC4KLQotRnJpIE9jdCAxMyAxMTowNDozNyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkZWZsZXgubDogQWxsb3cgcXVvdGluZyBvZiBJRHMuCi0JKiBkZWZwYXJzZS55ICgldW5pb24pOiBzdHJpbmcgZGVsZXRlZC4KLQkoY29tbWFuZCk6IERFU0NSSVBUSU9OIHRha2VzIElELgotCSogZGxsdG9vbC5jIChnZW5fZGVmX2ZpbGUpOiBRdW90ZSBvdXRnb2luZyBuYW1lIGlmCi0JbmVjZXNzYXJ5LiAgUHJlc2VydmUgTk9OQU1FLgotCShnZW5fbGliX2ZpbGUpOiBSdW4gcmFubGliLgotCSh3b3Jrb3V0X3ByZWZpeCk6IERlbGV0ZWQuCi0JKG1haW4sIHVzYWdlLCBsb25nX29wdGlvbnMpOiBBZGQgLS1hcywgLS1yYW5saWIsIC0tYXIgb3B0aW9ucy4KLQotV2VkIE9jdCAxMSAxMzozNjoxMyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG10YWJsZSk6IEhPV19BTElHTl9MT05HLCBuZXcuCi0JKGRfb3JkKTogRGVsZXRlZC4KLQkoZF9sb3dfb3JkLCBkX2hpZ2hfb3JkLCBkX25hbWVkX2Z1bmNzKTogTmV3LgotCShnZW5fZXhwX2ZpbGUpOiBDcmVhdGUgbm9uYW1lIGVudHJpZXMgY29ycmVjdGx5LgotCShnZW5fbGliX2ZpbGUpOiBEdW1wIGV4cG9ydHMgYWxwaGFiZXRpY2FsbHkuCi0JKHByb2Nlc3NfZHVwbGljYXRlcyk6ICBDb3VudCBub25hbWVkIGZ1bmN0aW9ucy4KLQkoZmlsbF9vcmRpbmFscyk6IEtlZXAgdHJhY2sgb2YgaGlnaGVzdCBvcmQgdG9vLgotCShtYW5nbGVfZGVmcyk6IENyZWF0ZSBhbHBoYWJldGljYWxseSBvcmRlcmVkIGxpc3Qgb2YgbmFtZXMuCi0KLVR1ZSBPY3QgMTAgMDk6Mzk6MDkgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFRPT0xfUFJPR1MpOiBJbmNsdWRlIERMTFRPT0xfUFJPRy4KLQotTW9uIE9jdCAgOSAxMzowNjozMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGFkZF91bmRlcnNjb3JlKTogTmV3LgotCSh4bGF0ZSk6IFVzZSBuZXcgbmFtZS4KLQkobWFpbiwgdXNhZ2UpOiBVcGRhdGUuCi0KLUZyaSBPY3QgIDYgMTQ6MDg6NTEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHN5c2luZm8ueTogRWxpbWluYXRlIHVudXNlZCB0ZXJtaW5hbHMgIlsiIGFuZCAiXSIgYW5kIHVudXNlZAotCW5vbnRlcm1pbmFsICJuYW1lIi4gIE9uZSBzL3IgY29uZmxpY3QgcmVtYWlucy4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG5tLmMgKHByaW50X3N5bW5hbWUpOiBEb24ndCB0cnkgdG8gZGVtYW5nbGUgYW4gZW1wdHkKLQluYW1lLgotCSogb2JqZHVtcC5jIChzbHVycF9zeW10YWIpOiBSZXNldCBzeW1jb3VudCBpZiB0aGVyZSBhcmUKLQlubyBzeW1ib2xzLgotCShzbHVycF9keW5hbWljX3N5bXRhYik6IExpa2V3aXNlLCBmb3IgZHluc3ltY291bnQuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBGaXggbWVtb3J5IGxlYWs6IGZyZWUgc29ydGVkX3N5bXMgd2hlbiBkb25lLgotCShkaXNwbGF5X2JmZCk6IExpa2V3aXNlLCBmb3Igc3ltcyBhbmQgZHluc3ltcy4KLQkoZHVtcF9yZWxvY3MpOiBEb24ndCBwcmludCBoZWFkZXIgYmVmb3JlIHBvc3NpYmx5IGdlbmVyYXRpbmcgYW4KLQllcnJvciBtZXNzYWdlLgotCShkdW1wX2R5bmFtaWNfcmVsb2NzKTogTGlrZXdpc2UuCi0KLQkqIGFyLjEsIG5tLjEsIG9iamR1bXAuMSwgc2l6ZS4xLCBzdHJpbmdzLjEsIHN0cmlwLjE6IEZpeCB0eXBvcyBhbmQKLQlmb3JtYXR0aW5nIGJ1Z3MuCi0KLUZyaSBPY3QgIDYgMTI6MDA6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhci5jIChkb19xdWlja19hcHBlbmQpOiBDb21tZW50IG91dC4KLQkocmVwbGFjZV9tZW1iZXJzKTogQWRkIHF1aWNrIGFyZ3VtZW50LgotCShtYWluKTogRG9uJ3QgY2FsbCBkb19xdWlja19hcHBlbmQuCi0JKG9wZW5faW5hcmNoKTogRG9uJ3QgY2FsbCBxdWlja19hcHBlbmQgdG8gY3JlYXRlIGFuIGVtcHR5IGFyY2hpdmUuCi0JSW5zdGVhZCBjYWxsIGJmZF9vcGVudy9iZmRfc2V0X2Zvcm1hdC9iZmRfY2xvc2UuCi0KLVRodSBPY3QgIDUgMjA6NTM6MDggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGJ1Y29tbS5jOiBBbHdheXMgaW5jbHVkZSB0aW1lLmguCi0KLVRodSBPY3QgIDUgMTc6MjU6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGNvbXBhcmVfc3ltYm9scyk6IFNvcnQgZ251X2NvbXBpbGVkIGFuZCBnY2MyX2NvbXBpbGVkCi0Jc3ltYm9scyBhZnRlciBvdGhlciBzeW1ib2xzIHdpdGggdGhlIHNhbWUgdmFsdWUuICBMaWtld2lzZSBmb3IKLQlzeW1ib2xzIHdoaWNoIGxvb2sgbGlrZSBmaWxlIG5hbWVzLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBBbHdheXMgY2hvc2UgdGhlIGZpcnN0IHJlYXNvbmFibGUgc3ltYm9sCi0Jd2l0aCBhIGdpdmVuIHZhbHVlLgotCi1UdWUgT2N0ICAzIDIyOjM4OjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJzdXAuYyAoYXJfc2F2ZSk6IFVzZSByZW5hbWUsIG5vdCB1bmxpbmsvbGluay91bmxpbmsuCi0KLU1vbiBPY3QgIDIgMTI6MTA6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdHJpbmdzLmMgKG1haW4pOiBFeGl0IHdpdGggemVybyBzdGF0dXMgaWYgbm8gZmlsZXMgYXJlIGdpdmVuCi0JYW5kIHN0YW5kYXJkIGlucHV0IGlzIHJlYWQuCi0KLVRodSBTZXAgMjggMjA6MDM6MDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBDYWxjdWxhdGUgdW5kZXJzY29yZSBhbmQgcHV0IGludG8gbWFrZWZpbGUKLQlmcmFnbWVudCwgZ2VuZXJhdGUgY29uZmlnLmguCi0JKiBtcHctbWFrZS5zZWQ6IE5ldyBmaWxlLCBzZWQgY29tbWFuZHMgdG8gZWRpdCBVbml4IG1ha2VmaWxlCi0JaW50byBNUFcgc3ludGF4LgotCSogbXB3LW1ha2UuaW46IFJlbW92ZS4KLQkqIG1hYy1iaW51dGlscy5yOiBOZXcgZmlsZSwgTWFjIHJlc291cmNlcy4KLQotVGh1IFNlcCAyOCAxNTo0OTowMCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmM6IChnZW5fZXhwX2ZpbGUpOiBBbHdheXMgZW1pdCBhIC5yZWxvYyBzZWN0aW9uIGlmCi0JcmVsb2NhdGFibGUuCi0JKGltcF9uYW1lX2xhYik6IE5ldy4KLQkoZ2VuX2RlZl9maWxlKTogTmV3LgotCShnZW5fbGliX2ZpbGUpOiBVc2UgaW1wX25hbWVfbGFiLgotCShtYWluKTogSW5pdGlhbGl6ZSBpbXBfbmFtZV9sYWIuCi0KLU1vbiBTZXAgMjUgMTI6MDU6MzQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfSEVBREVSX1NZU19XQUlULgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnLmluOiBSZWJ1aWxkLgotCSogZGxsdG9vbC5jOiBJbmNsdWRlICJsaWJpYmVydHkuaCIgYW5kICJidWNvbW0uaCIuICBEb24ndCBpbmNsdWRlCi0JPHN0ZGlvLmg+LCA8c3RkbGliLmg+LCBvciA8c3RyaW5nLmg+LiAgRG9uJ3QgaW5jbHVkZSA8d2FpdC5oPi4KLQlJbmNsdWRlIDxzeXMvdHlwZXMuaD4uICBVc2UgSEFWRV9TWVNfV0FJVF9IIHRvIGNvbnRyb2wgd2hldGhlciB0bwotCWluY2x1ZGUgPHN5cy93YWl0Lmg+IG9yIGRlZmluZSB0aGUgd2FpdCBtYWNyb3MgYnkgaGFuZC4gIERvbid0Ci0JZGVjbGFyZSB4bWFsbG9jLgotCShnZW5fbGliX2ZpbGUpOiBEb24ndCBhc3N1bWUgdGhhdCBzcHJpbnRmIHJldHVybnMgdGhlIG51bWJlciBvZgotCWNoYXJhY3RlcnM7IHVzZSBzdHJsZW4gaW5zdGVhZC4KLQotRnJpIFNlcCAyMiAxNzoxNjo0MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IERvbid0IHVzZSB0aGUgb2xkIEJGRCBiYXNlZAotCWRpc2Fzc2VtYmxlciBpbnRlcmZhY2UuICBNYWtlIGluZm8gYSBjb25zdCBwb2ludGVyLgotCi1XZWQgU2VwIDEzIDE4OjMzOjQ0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChzdGFydF9hZGRyZXNzKTogTmV3IHZhcmlhYmxlLgotCShzdG9wX2FkZHJlc3MpOiBOZXcgdmFyaWFibGUuCi0JKHVzYWdlKTogTWVudGlvbiAtLXN0YXJ0LWFkZHJlc3MgYW5kIC0tc3RvcC1hZGRyZXNzLgotCShPUFRJT05fU1RBUlRfQUREUkVTUywgT1BUSU9OX1NUT1BfQUREUkVTUyk6IERlZmluZS4KLQkobG9uZ19vcHRpb25zKTogQWRkICJzdGFydC1hZGRyZXNzIiBhbmQgInN0b3AtYWRkcmVzcyIuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBIYW5kbGUgc3RhcnRfYWRkcmVzcyBhbmQgc3RvcF9hZGRyZXNzLgotCShkdW1wX2RhdGEsIGR1bXBfcmVsb2Nfc2V0KTogTGlrZXdpc2UuCi0JKG1haW4pOiBEb24ndCBzZXQgc2VlbmZsYWcgZm9yIC1sLiAgSGFuZGxlIE9QVElPTl9TVEFSVF9BRERSRVNTCi0JYW5kIE9QVElPTl9TVE9QX0FERFJFU1MuCi0JKiBvYmpjb3B5LmMgKHBhcnNlX3ZtYSk6IE1vdmUgdG8gYnVjb21tLmMuCi0JKiBidWNvbW0uYyAocGFyc2Vfdm1hKTogTmV3IGZ1bmN0aW9uLCBtb3ZlZCBpbiBmcm9tIG9iamNvcHkuYy4KLQkqIGJ1Y29tbS5oIChwYXJzZV92bWEpOiBEZWNsYXJlLgotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCBuZXcgb2JqZHVtcCBvcHRpb25zLgotCi1UdWUgU2VwIDEyIDEyOjM3OjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LgotCi0JKiBhci5jIChyZXBsYWNlX21lbWJlcnMpOiBEb24ndCBjYWxsIHdyaXRlX2FyY2hpdmUgaWYgbm90aGluZwotCWNoYW5nZWQuCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEFkZCBjYXN0cyB0byBhdm9pZCBnY2Mgd2FybmluZ3MuCi0KLVRodSBTZXAgIDcgMTI6MTI6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuaW46IFJlbmFtZSBmcm9tIGNvbmZpZy5oLmluLgotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NPTkZJR19IRUFERVIgd2l0aCBjb25maWcuaDpjb25maWcuaW4uCi0JQ2hlY2sgZm9yIGNvbmZpZy5oOmNvbmZpZy5pbiB3aGVuIGNyZWF0aW5nIHN0YW1wLWguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoc3RhbXAtaCk6IERlcGVuZCB1cG9uIGNvbmZpZy5pbiByYXRoZXIgdGhhbgotCWNvbmZpZy5oLmluLiAgU2V0IENPTkZJR19IRUFERVJTIHRvIGNvbmZpZy5oOmNvbmZpZy5pbiB3aGVuCi0JY2FsbGluZyBjb25maWcuc3RhdHVzLgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5oLCBzdGFtcC1oLCBhbmQKLSAgICAgICAgY29uZmlnLmxvZy4KLQotCSogbm0uYyAodmFsdWVfZm9ybWF0KTogSW5pdGlhbGl6ZSBiYXNlZCBvbiBCRkQ2NCBhbmQKLQlCRkRfSE9TVF82NEJJVF9MT05HLgotCShwcmludF9yYWRpeCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNldF9wcmludF9yYWRpeCk6IFNldCBwcmludF9yYWRpeC4gIEFkanVzdCBjaGFuZ2VzIHRvCi0JdmFsdWVfZm9ybWF0LgotCShwcmludF92YWx1ZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIHRvIHByaW50IDY0IGJpdCBvY3RhbCBhbmQKLQlkZWNpbWFsIHZhbHVlcyBjb3JyZWN0bHkuCi0JKHByaW50X3N5bWJvbF9pbmZvX2JzZCk6IENoZWNrIEJGRDY0LCBub3QgQkZEX0hPU1RfNjRfQklULiAgVXNlCi0JcHJpbnRfdmFsdWUuCi0JKHByaW50X3N5bWJvbF9pbmZvX3N5c3YpOiBVc2UgcHJpbnRfdmFsdWUuCi0JKHByaW50X3N5bWJvbF9pbmZvX3Bvc2l4KTogTGlrZXdpc2UuCi0KLVdlZCBTZXAgIDYgMTU6MDI6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoKi5vKTogUmVtb3ZlIGluY29ycmVjdCBkZXBlbmRlbmNpZXMgb24KLQkkKEJGRERJUikvaG9zdHMvc3RkLWhvc3QuaC4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfREFUQSk6IEFkZCAtbSA2NDQuCi0JKElOU1RBTExfWEZPUk0xKTogTGlrZXdpc2UuCi0JKENDX0ZPUl9CVUlMRCk6IFNldCB0byBAQ0NfRk9SX0JVSUxEQCByYXRoZXIgdGhhbiAkKENDKS4KLQkobW9zdGx5Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmxvZy4KLQkoZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5jYWNoZS4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEJGRF9DQ19GT1JfQlVJTEQgYW5kIEJGRF9CSU5BUllfRk9QRU4uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBTZXAgIDUgMjA6MjI6NDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJld3JpdGUgdG8gdXNlIGF1dG9jb25mLgotCSogYWNsb2NhbC5tNDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmU6IE5ldyBmaWxlLCBidWlsdCBieSBhdXRvY29uZi4KLQkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgotCSogY29uZmlnLmguaW46IE5ldyBmaWxlLCBidWlsdCBieSBhdXRvaGVhZGVyLgotCSogTWFrZWZpbGUuaW46IFZhcmlvdXMgY2hhbmdlcyBmb3IgbmV3IGNvbmZpZ3VyZSBzY3JpcHQuICBBbHNvOgotCShQUk9HUyk6IFJlbW92ZSAkKFNZU0lORk9fUFJPRykuCi0JKEFMTF9DRkxBR1MpOiBSZW1vdmUgJChUREVGSU5FUykuCi0JKHZlcnNpb24ubyk6IFVzZSAkKEFMTF9DRkxBR1MpLgotCShjcGx1cy1kZW0ubywgZGxsdG9vbC5vLCBubG1jb252Lm8pOiBMaWtld2lzZS4KLQkoc3lzZHVtcC5vKTogRGVwZW5kIHVwb24gYnVjb21tLmggYW5kIGNvbmZpZy5oLgotCShzcmNvbnYubywgYXJzdXAubywgc3RyaW5ncy5vKTogRGVwZW5kIHVwb24gY29uZmlnLmguCi0JKGZpbGVtb2RlLm8pOiBEb24ndCBkZXBlbmQgdXBvbiAuLi9iZmQvc3lzZGVwLmguCi0JKGJ1Y29tbS5vKTogRGVwZW5kIHVwb24gY29uZmlnLmgsIG5vdCAuLi9iZmQvc3lzZGVwLmguCi0JKHNpemUubywgb2JqZHVtcC5vLCBubS5vLCBhci5vLCBvYmpjb3B5Lm8pOiBMaWtld2lzZS4KLQkobmxtaGVhZGVyLm8sIG5sbWNvbnYubyk6IExpa2V3aXNlLgotCShkaXN0Y2xlYW4pOiBEb24ndCByZW1vdmUgc3lzZGVwLmguCi0JKiBidWNvbW0uaDogSW5jbHVkZSAiYW5zaWRlY2wuaCIsIDxzdGRpby5oPiwgYW5kICJjb25maWcuaCIuCi0gIAlJbmNsdWRlICJmb3Blbi1zYW1lLmgiIG9yICJmb3Blbi1iaW4uaCIsIGJhc2VkIG9uCi0gCVVTRV9CSU5BUllfRk9QRU4uICBJbmNsdWRlIDxlcnJuby5oPiwgYW5kIGRlY2xhcmUgZXJybm8gaWYgaXQgaXMKLSAJbm90IGEgbWFjcm8uICBJbmNsdWRlIDx1bmlzdGQuaD4sIDxzdHJpbmcuaD4sIDxzdHJpbmdzLmg+LAotIAk8c3RkbGliLmg+LCBhbmQgPGZjbnRsLmg+IGlmIHRoZXkgYXJlIHByZXNlbnQuICBEZWNsYXJlIHN0cmNociwKLSAJc3RycmNociwgYW5kIHN0cnN0ciBpZiBubyBzdHJpbmcgaGVhZGVyIGZpbGUgZXhpc3RzLiAgSW5jbHVkZQotCTxzeXMvZmlsZS5oPiBpZiBpdCBleGlzdHMgYW5kIDxmY250bC5oPiBkb2VzIG5vdC4gIERlZmluZQotCU9fUkRPTkxZIGFuZCBPX1JEV1IgaWYgbmVjZXNzYXJ5LgotCSogYXIuYzogIERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4gIERvIGluY2x1ZGUgPHN5cy90eXBlcy5oPiBhbmQKLQk8c3lzL3N0YXQuaD4uICBVc2UgSEFWRV9HT09EX1VUSU1FX0ggcmF0aGVyIHRoYW4gUE9TSVhfVVRJTUUuICBVc2UKLQlIQVZFX1VUSU1FUyByYXRoZXIgdGhhbiAhVVNFX1VUSU1FLiAgRG9uJ3QgaW5jbHVkZSA8ZXJybm8uaD4sIGFuZAotCWRvbid0IGRlY2xhcmUgZXJybm8uCi0JKiBhcnN1cC5jOiBEb24ndCBpbmNsdWRlIDxzeXNkZXAuaD4uCi0JKiBidWNvbW0uYzogRG9uJ3QgaW5jbHVkZSAic3lzZGVwLmgiLiAgSW5jbHVkZSA8c3RkaW8uaD4sCi0JPHN5cy90eXBlcy5oPiwgYW5kIDxzeXMvc3RhdC5oPi4gIEluY2x1ZGUgPHRpbWUuaD4gaWYgaXQgZGVmaW5lcwotCXRpbWVfdC4gIERlZmluZSB0aW1lX3QgaWYgbmVjZXNzYXJ5LgotCSogY29mZmR1bXAuYzogRG9uJ3QgaW5jbHVkZSAic3lzZGVwLmgiLgotCSogY29mZmdyb2suYywgZmlsZW1vZGUuYywgbmxtY29udi5jLCBzaXplLmM6IExpa2V3aXNlLgotCSogc3Jjb252LmMsIHN0cmluZ3MuYzogTGlrZXdpc2UuCi0JKiBubS5jOiBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBEb24ndCB0cnkgdG8gZGVmaW5lIEhBVkVfU0JSSy4KLQkqIG9iamNvcHkuYzogRG9uJ3QgaW5jbHVkZSAic3lzZGVwLmgiLiAgSW5jbHVkZSA8c3lzL3R5cGVzLmg+IGFuZAotCTxzeXMvc3RhdC5oPi4KLQkoc2ltcGxlX2NvcHkpOiBVc2UgY3JlYXQgcmF0aGVyIHRoYW4gYXNzdW1pbmcgdGhhdCBPX0NSRUFUIGlzCi0JZGVmaW5lZC4KLQkqIG9iamR1bXAuYzogRG9uJ3QgaW5jbHVkZSAic3lzZGVwLmgiLiAgVXNlCi0JTkVFRF9ERUNMQVJBVElPTl9QUklOVEYgcmF0aGVyIHRoYW4gIUZQUklOVEZfQUxSRUFEWV9ERUNMQVJFRC4KLQkqIHN5c2R1bXAuYzogSW5jbHVkZSAiYmZkLmgiIGFuZCAiYnVjb21tLmgiLiAgRG9uJ3QgaW5jbHVkZQotCSJzeXNkZXAuaCIgb3IgPHN0ZGxpYi5oPi4KLQkoZHVtcF9zeW1ib2xfaW5mbyk6IFJlbmFtZSBmcm9tIHN5bWJvbF9pbmZvLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCi1Nb24gU2VwICA0IDE0OjMwOjAwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChob3N0X21ha2VmaWxlX2ZyYWcpOiBEb24ndCBzZXQuICBTdWJzdGl0dXRlIGZvcgotCUBDQ0AsIEBDRkxBR1NALCBASERFRklORVNAIGFuZCBATERGTEFHU0AgaW4gTWFrZWZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQVJfRkxBR1MpOiBTZXQgdG8gcmMgcmF0aGVyIHRoYW4gcXYuCi0JKENDKTogRGVmaW5lIGFzIEBDQ0AuCi0JKENGTEFHUyk6IFNldCB0byBAQ0ZMQUdTQC4KLQkoTERGTEFHUyk6IERlZmluZSBhcyBATERGTEFHU0AuCi0JKEFMTF9DRkxBR1MpOiBVc2UgQEhERUZJTkVTQCByYXRoZXIgdGhhbiAkKEhERUZJTkVTKS4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBib3RoZXIgdG8gY2FsbCBjb25maWcuYmZkIGZvciBlYWNoIHRhcmdldC4KLQlKdXN0IGNhbGwgaXQgZm9yIHRoZSBkZWZhdWx0IHRhcmdldCwgYW5kIHVzZSB0aGUgc2hlbGwgdmFyaWFibGUgdG8KLQlkZWNpZGUgd2hldGhlciB1bmRlcnNjb3JlcyBhcmUgdXNlZC4KLQotVGh1IEF1ZyAzMSAxOToyMTo0OCAxOTk1ICBKYXNvbiBNb2xlbmRhICAgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IG1hdGNoIGlbMy02XTg2LSotd2luMzIsIG5vdCBqdXN0IGkzODYtKi13aW4zMi4KLQotVGh1IEF1ZyAzMSAxNjozMDoyMiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGFkZF9pbmRpcmVjdCk6IE5ldy4KLQkoYXNtX3ByZWZpeCk6IE5ldwotCShnZW5fZXhwX2ZpbGUpOiBUaW1lc3RhbXAgc2hvdWxkIGJlIDAuIEluc2VydCBwcmVmaXggd2hlbgotCW5lZWRlZC4gTmV3IGNvZGUgZm9yIGluZGlyZWN0aW9uLgotCShnZW5fbGliX2ZpbGUpOiBUaW1lc3RhbXAgc2hvdWxkIGJlIDAuIEluc2VydCBwcmVmaXgKLQl3aGVuIG5lZWRlZC4KLQkodXNhZ2UpOiBEb2N1bWVudCAtLWFkZC1pbmRpcmVjdC4KLQkobWFpbik6IENvcGUgd2l0aCBuZXcgb3B0aW9uLgotCi0JKiBvYmpkdW1wLmMgKGR1bXBfcHJpdmF0ZV9oZWFkZXJzKTogTmV3LgotCSh1c2FnZSk6IERvY3VtZW50IG5ldyBvcHRpb24uCi0JKGxvbmdfb3B0aW9uKTogQWRkIHByaXZhdGUtaGVhZGVycy4KLQkoZHVtcF9iZmRfcHJpdmF0ZV9oZWFkZXIpOiBOZXcuCi0JKG1haW4pOiBDb3BlIHdpdGggbmV3IG9wdGlvbi4KLQotVGh1IEF1ZyAzMSAwNDowOToxNiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKHJ1bik6IEFkZCBtaXNzaW5nIDNyZCBhcmcgdG8gd2FpdHBpZC4KLQotV2VkIEF1ZyAzMCAxMTowMjoxMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVE9PTF9QUk9HUyk6IEluY2x1ZGUgZGxsdG9vbCBpZiBuZWVkZWQuCi0KLVR1ZSBBdWcgMjkgMTM6MjU6MjEgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChydmEpOiBEZWxldGVkLgotCShydmFhZnRlciwgcnZhX2JlZm9yZSk6IFVzZSBuZXcgYXNzZW1ibGVyIHBzZXVkby4KLQkoZmx1c2hfcGFnZSwgZ2VuX2V4cF9maWxlLCBnZW5fbGliX2ZpbGUpOiBVc2UgbmV3IHdheSBvZiBSVkFpbmcuCi0JKGdlbl9leHBfZmlsZSk6IERvbid0IGdlbmVyYXRlIC5lZGF0YSBpZiBubyBuZWVkLgotCShnZW5fbGliX2ZpbGUpOiBEb24ndCBtYWtlIHRpbWVzdGFtcC4KLQlQdXQgX2luYW1lIGluIGlkYXRhJDcuCi0JKHdvcmtvdXRfcHJlZml4KTogRml4IG1lbW9yeSBpbml0aWFsaXphdGlvbiBidWcuCi0JKHVzYWdlKTogVGlkeSB1cCwgZGVsZXRlIG1hbnkgc2luZ2xlIGNoYXIgb3B0aW9ucy4KLQkobWFpbik6IHJ2YSBvcHRpb24gaXMgZ29uZS4KLQotTW9uIEF1ZyAyMSAxODo0MToyOCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG9wdGlvbnMpOiBpbWFnZS1iYXNlIGlzIGEgc3lub255bSBmb3IgcnZhLgotCShnZW5fbGliX2ZpbGUpOiBQdXQgZGxsIG5hbWUgaW50byBpYmFzZSQ3LgotCi1TdW4gQXVnIDIwIDA5OjU5OjAwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQlNb2RpZmllZCB0byBnZW5lcmF0ZSBhcmNoaXZlcyBhbmQgb2JqZWN0cyByYXRoZXIgdGhhbiAucyBmaWxlcy4KLQkqIGRsbHRvb2wuYyAocnVuKSBOZXcgZnVuY3Rpb24uCi0gCShnZW5fZXhwX2ZpbGUsIGdlbl9saWJfZmlsZSk6IFVzZSBydW4uCi0JKHdvcmtvdXRfcHJlZml4KTogTmV3LgotCSh1c2FnZSk6IERvY3VtZW50IG5ldyBvcHRpb25zLgotCShtYWluKTogUGFyc2UgbmV3IG9wdGlvbnMuCi0KLVdlZCBBdWcgMTYgMTY6MjY6NTIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChnZW5fZXhwX2ZpbGUpOiBGaXggUlZBIGhhbmRsaW5nLgotCShydmFfcywgcnZhX24pOiBEZWxldGUuCi0KLUZyaSBBdWcgMTEgMTg6Mjc6MTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBubS5jIChtYWluKTogSWdub3JlIC1lLgotCi1UaHUgQXVnIDEwIDE3OjM1OjAwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLnRleGkpOiBOZXcgdGFyZ2V0LiAgV3JpdGUgb3V0IGEgc2V0dGluZyBmb3IKLQl0ZXhpbmZvIHZhcmlhYmxlIFZFUlNJT04uCi0JKGJpbnV0aWxzLmR2aSwgYmludXRpbHMuaW5mbyk6IERlcGVuZCBvbiBpdC4KLQkqIGJpbnV0aWxzLnRleGk6IEluY2x1ZGUgaXQsIGFuZCByZWZlcmVuY2UgQHZhbHVle1ZFUlNJT059IGluc3RlYWQKLQlvZiBleHBsaWNpdGx5IHNwZWNpZnlpbmcgMi4yKCEpLgotCi1UaHUgQXVnIDEwIDE2OjA3OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmdyb2suYyAoZG9fdHlwZSk6IEhhbmRsZSBhcnJheSBkaW1lbnNpb25zIHRoZSBzYW1lIHdheSBnZGIKLQlkb2VzLgotCi1UdWUgQXVnICA4IDE3OjEwOjQyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAobXRhYmxlKTogTmV3IGZpZWxkcy4KLQkoQVNNX1JWQV9CRUZPUkUsIEFTTV9SVkFfQUZURVIpOiBOZXcuCi0JKGZsdXNoX3BhZ2UpOiBVc2UgbmV3IG1hY3Jvcy4KLQotU2F0IEF1ZyAgNSAwMDoxNjozNyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogb2JqY29weS5jIChtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyk6IEhhbmRsZSBzZWN0aW9ucwotCXdpdGggbm8gcmVsb2NhdGlvbnMuCi0JKiBjb2ZmZ3Jvay5jIChkb19zZWN0aW9uc19wMSk6IExpa2V3aXNlLgotCi1Nb24gSnVsIDMxIDEyOjUxOjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RyaW5ncy5jIChwcmludF9zdHJpbmdzKTogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZwotCXN0cmluZ3MgcHJvZ3JhbXMsIHByaW50IHN0cmluZ3Mgd2hpY2ggYXJlIG5vdCB0ZXJtaW5hdGVkIHdpdGggYQotCW51bGwgYnl0ZSBvciBhIG5ld2xpbmUuCi0JKiBiaW51dGlscy50ZXhpLCBzdHJpbmdzLjE6IFVwZGF0ZSBkb2N1bWVudGF0aW9uIGFjY29yZGluZ2x5LgotCi0JKiBhci5jIChyZXBsYWNlX21lbWJlcnMpOiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGFyCi0JcHJvZ3JhbXMsIHBlcm1pdCB1c2VycyB0byBhZGQgdGhlIHNhbWUgZmlsZSBtdWx0aXBsZSB0aW1lcy4KLQotVHVlIEp1bCAyNSAxMToyMTo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0cmluZ3MuYyAoREFUQV9GTEFHUyk6IFJlbW92ZSBTRUNfREFUQS4KLQkobWFpbik6IElmIG5vIGZpbGUgbmFtZXMgYXJlIGdpdmVuLCBzY2FuIHN0YW5kYXJkIGlucHV0LgotCSogYmludXRpbHMudGV4aSwgc3RyaW5ncy4xOiBzdHJpbmdzIG5vdyBzY2FucyBub24tZGF0YSBzZWN0aW9ucyBieQotCWRlZmF1bHQuCi0KLU1vbiBKdWwgMjQgMTM6NTI6MjggMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzcmNvbnYuYyAod3JfaGQpOiBTZXQgYWZsIGZpZWxkIHRvIDQgZm9yIGJmZF9hcmNoX3NoLgotCSh3cml0ZUlOVCk6IFdoZW4gc2l6ZSA9PSAtMiwgdXNlIDIgYnl0ZXMgZm9yIHRoZSBoODMwMCBhbmQgNCBieXRlcwotCWZvciB0aGUJc2guCi0KLQkqIHN5c2R1bXAuYyAoZmlsbHVwKTogUmV0dXJuIHNpemUgLSAxLCB0aGUgbGFzdCBieXRlIGlzIGEgY2hlY2tzdW0KLQlhbmQgc2hvdWxkbid0IGJlIGNvdW50ZWQuCi0JKiBzeXNyb2ZmLmluZm8gKGhkKTogQ2hhbmdlZCBzZWdtZW50IGlkZW50aWZpZXIgZnJvbSBhIGJ5dGUgdG8gYSAxCi0JYml0IGZpZWxkLiAgVGhlIHN5c3JvZmYgMi4wLTAxIHNwZWNpZmljYXRpb24gc2VlbXMgdG8gYmUgaW4gZXJyb3IKLQloZXJlLiAgUmVkdWNlIHdpZHRoIG9mIGZvbGxvd2luZyAic3BhcmUiIGZpZWxkIGZyb20gNCB0byAzIGJpdHMuCi0JKHJsKTogQ2hhbmdlZCBvcmRlciBhbmQgd2lkdGggb2YgZmlyc3QgNCBiaXRmaWVsZHMgdG8gY29ycmVzcG9uZAotCXRvIHN5c3JvZmYgc3BlY2lmaWNhdGlvbi4KLQkoZGxuX2hlYWQsIGRsbl9pbnNpZGUsIGRsbl90YWlsKTogUmVtb3ZlZC4KLQotVHVlIEp1bCAxOCAyMzowMDowMyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbm0uYyAoc29ydF9zeW1ib2xzX2J5X3NpemUpOiAgRW5jbG9zZSBleHByZXNzaW9uIGJlaW5nIGNhc3RlZAotCWluIHBhcmVucyBzbyByZXN1bHQgaXMgY2FzdGVkLCBub3QganVzdCBmaXJzdCBvcGVyYW5kLiAgQ2FuJ3QKLQlkbyBwb2ludGVyIGFyaXRobWV0aWMgb24gdm9pZCogcG9pbnRlcnMuCi0KLUZyaSBKdWwgMTQgMTM6NDI6NDIgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzeXNkdW1wLmMgKGRoKTogQ2hhbmdlZCBmb3JtYXQgb2Ygb3V0cHV0IHRvIGJlIDE2IGhleCBkaWdpdHMKLQlmb2xsb3dlZCBieSAxNiBhc2NpaSBjaGFyYWN0ZXJzLCBzaW1pbGFyIHRvIEVtYWNzJyBoZXhsLW1vZGUsCi0JdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZC4KLQkoeGNhbGxvYyk6IGZpeCB0eXBvLgotCi1UaHUgSnVsIDEzIDE1OjI3OjQ0IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc3Jjb252LmMgKHdyX3RyKTogV3JpdGUgb3V0IGhhbmRjcmFmdGVkIHRyIGJsb2NrLgotCSh3YWxrX3RyZWVfc3ltYm9sKTogVXNlIGV2YWxsZW4gYW5kIGV2YWx1ZSBpbnN0ZWFkIG9mCi0JdmFsbGVuICYgdmFsdWUgYmVjYXVzZSBvZiBjb3JyZXNwb25kaW5nIGNoYW5nZXMgaW4KLQlzeXNyb2ZmLmluZm8uCi0KLQkqIHN5c2R1bXAuYyAoc3lzcm9mZl9zd2FwX3RyX2luLCBzeXNyb2ZmX3ByaW50X3RyX291dCk6IE5ldwotCWZ1bmN0aW9ucy4KLQotCSogc3lzcm9mZi5pbmZvICh0cik6IHRoZSB0ciBibG9jayBpcyBhIHNwZWNpYWwgY2FzZSAtLS0gYSBibG9jawotCXdpdGhvdXQgY29udGVudHMgLS0tIHdoaWNoIGNhbid0IGJlIGhhbmRsZWQgYnkgZ2VuZXJhdGVkIGNvZGUuCi0JKGRlbiwgZHBwKTogb25seSBmaXJzdCBieXRlIGlzIHByZXNlbnQgZm9yIERFTmVuZCwgRFBQZW5kLgotCShkc3kpOiBkZXNjcmliZSBhIGNvbmRpdGlvbmFsIHBvcnRpb24gb2YgYmxvY2ssIHJlbmFtZSBzb21lIGZpZWxkcy4KLQkoZHBzKTogZGVzY3JpYmUgYSBjb25kaXRpb25hbCBwb3J0aW9uIG9mIGJsb2NrLgotCShkZmwpOiByZW1vdmVkLgotCi0JKiBzeXNpbmZvLnkgKHl5ZXJyb3IpOiB3cml0ZSBlcnJvciBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLgotCi1UaHUgSnVsIDEzIDEwOjQzOjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IEFkZCBhcnBhcnNlLmggYW5kIHN5c2luZm8uaC4KLQkobW9zdGx5Y2xlYW4pOiBSZW1vdmUgeS5vdXRwdXQuCi0JKGNsZWFuKTogUmVtb3ZlIHN5c3JvZmYsIHN5c3JvZmYuYywgc3lzcm9mZi5oLCBhbmQgc3lzaW5mby4KLQotCSogbmxtY29udi5jIChwb3dlcnBjX21hbmdsZV9yZWxvY3MpOiBDYXN0IG1lbXNldCBhcmcgdG8gc2l6ZV90LgotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6IExpa2V3aXNlLgotCi0JKiBubS5jIChIQVZFX1NCUkspOiBEZWZpbmUgZXhlY3B0IG9uIGFtaWdhZG9zIGFuZCBXSU5ET1dTX05ULgotCShzdHJ1Y3Qgc2l6ZV9zeW0pOiBEZWZpbmUuCi0JKHNob3dfc3RhdHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsb25nX29wdGlvbnMpOiBBZGQgdW5kb2N1bWVudGVkIG9wdGlvbiAic3RhdHMiLgotCShtYWluKTogUHJpbnQgbWVtb3J5IHN0YXRzIGlmIHJlcXVlc3RlZC4KLQkoc29ydF9iZmQsIHNvcnRfZHluYW1pYywgc29ydF94LCBzb3J0X3kpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkobnVtZXJpY19mb3J3YXJkKTogVXNlIG1pbmlzeW1ib2xzIHJhdGhlciB0aGFuIGFzeW1ib2xzLgotCShub25fbnVtZXJpY19mb3J3YXJkKTogTGlrZXdpc2UuCi0JKHNpemVfZm9yd2FyZDEpOiBSZW5hbWUgZnJvbSBzaXplX2ZvcndhcmQuICBVc2UgbWluaXN5bWJvbHMuCi0JKHNpemVfZm9yd2FyZDIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzb3J0X3N5bWJvbHNfYnlfc2l6ZSk6IFRha2UgbmV3IGFyZ3VtZW50cyBkeW5hbWljLCBzaXplLCBhbmQKLQlzeW1zaXplcC4gIFVzZSBtaW5pc3ltYm9scy4gIERvbid0IHN0b3JlIHRoZSBzaXplIGJhY2sgaW4gdGhlCi0Jc3ltYm9sOyBzdG9yZSBpbiBhIG5ld2x5IGFsbG9jYXRlIHN0cnVjdCBzaXplX3N5bSBhcnJheS4KLQkoZGlzcGxheV9yZWxfZmlsZSk6IFJlYWQgbWluaXN5bWJvbHMgcmF0aGVyIHRoYW4gYXN5bWJvbHMuICBTZXQKLQlzb3J0XyogdmFyaWFibGVzLiAgQ2FsbCBwcmludF9zaXplX3N5bWJvbHMgaWYgc29ydGluZyBieSBzaXplLgotCShmaWx0ZXJfc3ltYm9scyk6IFRha2UgbmV3IGFyZ3VtZW50cyBkeW5hbWljIGFuZCBzaXplLiAgVXNlCi0JbWluaXN5bWJvbHMuCi0JKHByaW50X3N5bWJvbHMpOiBMaWtld2lzZS4gIENhbGwgcHJpbnRfc3ltYm9sIGZvciBhY3R1YWwgcHJpbnRpbmcuCi0JKHByaW50X3NpemVfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHByaW50X3N5bWJvbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLVdlZCBKdWwgMTIgMTA6NDM6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9zdGFicyk6IE9ubHkgcHJpbnQgZWFjaCBzdGFicyBzZWN0aW9uCi0Jb25jZS4KLQkoY29tcGFyZV9yZWxvY3MpOiBNYWtlIGl0IGNsZWFyIHRvIGdjYyB0aGF0IHRoaXMgYWx3YXlzIHJldHVybnMgYQotCXZhbHVlLgotCi1XZWQgSnVsIDEyIDEwOjQwOjIzIDE5OTUgIEguSi4gTHUgIDxoamxAbnluZXhzdC5jb20+Ci0KLQkqIG9iamNvcHkuYyAoc2ltcGxlX2NvcHkpOiBQcmVzZXJ2ZSBlcnJubyBvbiBmYWlsdXJlLgotCShzbWFydF9yZW5hbWUpOiBQcmludCBlcnJvciBtZXNhZ2UgaWYgc2ltcGxlX2NvcHkgZmFpbHMuCi0KLVR1ZSBKdWwgMTEgMTM6MTA6NTIgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzeXNkdW1wLmM6IHJlLWluZGVudGVkIGZpbGUuCi0JKG1vZHVsZSk6IHJlYWQgYmxvY2tzIHNlcXVlbnRpYWxseSBpbnN0ZWFkIG9mIHRyeWluZyB0byBwYXJzZQotCXRoZW0sIGFzIHRoYXQgd291bGQgcmVxdWlyZSBjaGFuZ2luZyB0aGUgcGFyc2VyIHJlY29nbml6ZSB0aGUKLQlkaWZmZXJlbmNlIGJldHdlZW4gYSBEUFNzdGFydCBhbmQgRFBTZW5kIGJsb2NrLgotCShnZXRvbmUpOiBBZGQgYnJlYWsncyBiZXR3ZWVuIHN3aXRjaCBibG9ja3MgYXMgYXBwcm9wcmlhdGUuCi0JKG9iamVjdF9ib2R5X2xpc3QpOiBwYXJzZSBibG9ja3MgYWNjb3JkaW5nIHRvIHN5c3JvZmYgc3BlYy4KLQotTW9uIEp1bCAxMCAxMjozNzoyNSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcG9zZWlkb24uY3lnbnVzLmNvbT4KLQotCSogc3lzcm9mZi5pbmZvOiByZS1pbmRlbnRlZCBmaWxlLCBwcmlvciBmb3JtYXR0aW5nIHdhcyBjb25mdXNpbmcKLQliZWNhdXNlIGl0IHdhcyBpbmRlbnRhdGlvbiBkaWQgbm90IHJlZmxlY3QgbmVzdGluZyBvZiBjb25kaXRpb25hbAotCXJlY29yZHMuICBDaGFuZ2UgInNwYWNlIHNpemUgd2l0aGluIHNlZ21lbnQiIHJlY29yZCBpbiBoZCByZWNvcmQKLQlmcm9tIGJpdCB0byBieXRlLgotCi0JKiBzeXNpbmZvLnkgKGNvbmRfaXRfZmllbGQpOiBVc2UgeGNhbGxvYyBpbnN0ZWFkIG9mIGNhbGxvYy4KLQotCSogc3Jjb252LmMgKHdyX2NzKTogUmVmb3JtYXR0ZWQgY3MgaGVhZGVyIGFycmF5LCB0YWcgZWFjaCBieXRlCi0Jd2l0aCBhIGNvbW1lbnQgZGVzY3JpYmluZyB0aGUgZmllbGQuCi0JKHdyX3VuaXRfaW5mbyk6IFVzZSBTRUVLX1NFVCBtYWNybyBpbnN0ZWFkIG9mIGNvbnN0YW50IDAuCi0JKG1haW4pOiBVc2UgRk9QRU5fV0IgbWFjcm8gaW5zdGVhZCBvZiBsaXRlcmFsICJ3YiIuCi0JKiBzeXNyb2ZmLmluZm86IFJlbW92ZSBmZGwgKGRmbCkgZmllbGQgZnJvbSBjcyBibG9jay4gIENvbXBhcmUKLQlwdHItPnR5cGUgd2l0aCBFRF9UWVBFX0NPTlNUIGluc3RlYWQgb2YgY29uc3RhbnQgMiBpbiBlZCBibG9jay4KLQotVHVlIEp1bCAgNCAxNDo0ODo0MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKHNpemVfZm9yd2FyZCk6IENoZWNrIHlmIGFnYWluc3QgeW4sIG5vdCB4bi4KLQotCSogb2JqY29weS5jIChjb3B5X2FyY2hpdmUpOiBSZWNvcmQgYWxsIG91dHB1dCBCRkQncywgYW5kIGNsb3NlCi0JdGhlbSBiZWZvcmUgdW5saW5raW5nIHRoZW0gYW5kIHJlbW92aW5nIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5LAotCXRvIGF2b2lkIE5GUyBwcm9ibGVtcy4KLQotCSogYXIuYyAocmVwbGFjZV9tZW1iZXJzKTogSW4gdmVyYm9zZSBtZXNzYWdlcywgdXNlICdyJyB3aGVuCi0gICAgICAgIHJlcGxhY2luZyBhIG1lbWJlciwgYW5kICdhJyB3aGVuIGFkZGluZyBvbmUuCi0KLQkqIGFyLmMgKGFyX3RydW5jYXRlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobm9ybWFsaXplKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGNvbnN0IGNoYXIgKi4gIEFkZCBhYmZkCi0JYXJndW1lbnQuICBDaGFuZ2UgYWxsIGNhbGxlcnMuICBJZiBhcl90cnVuY2F0ZSwgY2hvcCB0aGUgZmlsZW5hbWUKLQl0byBhYmZkLT5hcl9tYXhfbmFtZWxlbi4KLQkobWFpbik6IEZvciB0aGUgJ2YnIG1vZGlmaWVyLCBzZXQgYXJfdHJ1bmNhdGUgdG8gdHJ1ZS4gIERvbid0Ci0JY2hhbmdlIHF1aWNrX2FwcGVuZCB0byByZXBsYWNlIGlmIGFyX3RydW5jYXRlIGlzIHRydWUuCi0JKGRvX3F1aWNrX2FwcGVuZCk6IElmIGFyX3RydW5jYXRlLCBzZXQgQkZEX1RSQURJVElPTkFMX0ZPUk1BVC4KLQkod3JpdGVfYXJjaGl2ZSk6IExpa2V3aXNlLgotCSogYmludXRpbHMudGV4aSwgYXIuMTogRG9jdW1lbnQgJ2YnIG1vZGlmaWVyLgotCi0JKiBvYmpjb3B5LmMgKGVudW0gc3RyaXBfYWN0aW9uKTogRGVmaW5lIHN0cmlwX3VubmVlZGVkLgotCShPUFRJT05fU1RSSVBfVU5ORUVERUQpOiBEZWZpbmUuCi0JKHN0cmlwX29wdGlvbnMpOiBBZGQgInN0cmlwLXVubmVlZGVkIi4KLQkoY29weV9vcHRpb25zKTogTGlrZXdpc2UuCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0tc3RyaXAtdW5uZWVkZWQuCi0JKHN0cmlwX3VzYWdlKTogTGlrZXdpc2UuCi0JKGlzX3N0cmlwX3NlY3Rpb24pOiBTdHJpcCBkZWJ1Z2dpbmcgc2VjdGlvbnMgaWYgc3RyaXBfdW5uZWVkZWQuCi0JKGZpbHRlcl9zeW1ib2xzKTogSWYgc3RyaXBfdW5uZWVkZWQsIG9ubHkga2VlcCBCU0ZfS0VFUCBzeW1ib2xzLgotCShjb3B5X29iamVjdCk6IElmIHN0cmlwX2FsbCwgZGlzY2FyZCBzeW1ib2xzIHdpdGhvdXQgY2hlY2tpbmcKLQlkaXNjYXJkX2xvY2Fscy4KLQkoY29weV9vYmplY3QpOiBDYWxsIGZpbHRlcl9zeW1ib2xzIGlmIHN0cmlwX3VubmVlZGVkLgotCShzZXR1cF9zZWN0aW9uKTogU3RyaXAgZGVidWdnaW5nIHNlY3Rpb25zIGlmIHN0cmlwX3VubmVlZGVkLgotCShjb3B5X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoc3RyaXBfbWFpbik6IEhhbmRsZSBPUFRJT05fU1RSSVBfVU5ORUVERUQuCi0JKGNvcHlfbWFpbik6IExpa2V3aXNlLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xLCBzdHJpcC4xOiBEb2N1bWVudCAtLXN0cmlwLXVubmVlZGVkLgotCi1Nb24gSnVsICAzIDE0OjE2OjQ3IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLXdpbjMyKTogTmV3IGNvbmZpZ3VyYXRpb24uCi0JKiBkbGx0b29sLmMgKGtpbGxhdCwgeGxhdGUsIHVzYWdlLCBsb25nX29wdGlvbnMsIG1haW4pOgotCVVuZGVyc3RhbmQgYW5kIGNvcGUgd2l0aCAtayBvcHRpb24uCi0KLVNhdCBKdWwgIDEgMTI6MjU6MTUgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGFyLmM6IChleHRyYWN0X2ZpbGUpOiAgQ2hhbmdlICIjaWYgUE9TSVhfVVRJTUUiIHRvCi0JIiNpZmRlZiBQT1NJWF9VVElNRSIgdG8gbWF0Y2ggb3RoZXIgdGVzdHMgb2YgUE9TSVhfVVRJTUUKLQlhbmQgYXZvaWQgbG9zc2FnZSB3aGVuIFBPU0lYX1VUSU1FIGlzIG5vdCBkZWZpbmVkIGF0IGFsbC4KLQotV2VkIEp1biAyOCAxNzo1MToyNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBhci5jOiAocHJpbnRfY29udGVudHMuYywgZXh0cmFjdF9maWxlLCBkb19xdWlja19hcHBlbmQpOgotCU1hbGxvYyBidWZmZXJzIHJhdGhlciB0aGFuIGFsbG9jYXRlIG9uIHN0YWNrIChzbyBpdCB3b3JrcwotCW9uIE5UKS4KLQkqIGRlZmxleC5sOiBOYW1lcyBjYW4gaGF2ZSBhbiBAIGluIHRoZW0uCi0JKiBkbGx0b29sLmM6IExvYWRzIG9mIHN0dWZmLiBDYW4gbm93IGdlbmVyYXRlIC5pbXAgZmlsZXMgd2hpY2gKLQl3b3JrIHdpdGggTlQgLmRsbHMuCi0KLVRodSBKdW4gMjIgMTk6MTA6NTAgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5pbiAoZGVtYW5nbGUuYy5vKTogUmVtb3ZlLgotCShhcnBhcnNlLmgpOiBEZXBlbmQgb24gYXJwYXJzZS5jIGluc3RlYWQgb2YgYXJwYXJzZS55LgotCi1XZWQgSnVuIDIxIDE3OjMyOjQ1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBEb24ndCBpbmNsdWRlIGluZm8gaGVyZS4KLQkoZGlzdHN0dWZmKTogSW5jbHVkZSBpdCBoZXJlLgotCShyZWFsY2xlYW4pOiBSZW1vdmUgKi5pbmZvLgotCi0JKiBvYmpkdW1wLmMgKGNvbXBhcmVfcmVsb2NzKTogSWYgcmVsb2NhdGlvbiBlbnRyaWVzIGhhdmUgdGhlIHNhbWUKLQlhZGRyZXNzLCBrZWVwIHRoZW0gaW4gZmlsZSBvcmRlci4KLQotTW9uIEp1biAxOSAwOTowNjo0OSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmM6IENoYW5nZSBuYW1lcyBvZiBnZW5lcmF0ZWQgZmlsZXMuIC4qLnMtPiAtKi5zCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX3N0YWJzKTogIENoZWNrIGZvciBuYW1lcwotCXdoaWNoIGFyZSBzdXBlcnNldHMgb2Ygc2VsZWN0ZWQgbmFtZXMuCi0KLVdlZCBKdW4gMTQgMTk6NDM6NTIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtdGFibGUsIEFSTSBqdW1wKTogTXVzdCByZWRpcmVjdCB2aWEgcGMgb2Zmc2V0YWJsZSBwdHIuCi0KLVdlZCBKdW4gMTQgMTM6Mjc6MjIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGVmbGV4LmwsIGRlZnBhcnNlLnksIGRsbHRvb2wuYzogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogU3VwcG9ydCBmb3IgdGhlbS4KLQotTW9uIEp1biAxMiAxMToyNzo1NCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzeXNkdW1wLmM6IEluY2x1ZGUgc3lzZGVwLmgKLQkobWFpbik6IE9wZW4gaW5wdXQgd2l0aCBGT1BFTl9SQi4KLQotRnJpIEp1biAgOSAxNzoyNjoxMSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAod2lkZV9vdXRwdXQpOiBOZXcgZmxhZyB2YXJpYWJsZS4KLQkodXNhZ2UpOiBQcmludCBuZXcgLXcsIC0td2lkZSBvcHRpb25zLgotCShsb25nX29wdGlvbnMpOiBBZGQgLS13aWRlIHN1cHBvcnQuCi0JKGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBJZiAtLXdpZGUsIGRvbid0IHByaW50IGEgbmV3bGluZSBiZXR3ZWVuCi0JdGhlIHNlY3Rpb24ncyBmaXJzdCBsaW5lIGFuZCB0aGUgZmxhZ3MuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IFVzZSB1bnNpZ25lZCBjb21wYXJpc29ucyBmb3IgdGhlIGJpbmFyeQotCXNlYXJjaCwgbm90IHNpZ25lZC4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IElmIC0td2lkZSwgZG9uJ3QgcHV0IGEgXG4gYmV0d2VlbiB0aGUKLQlkaXNhc3NlbWJseSBvdXRwdXQgYW5kIHJlbG9jYXRpb24gaW5mb3JtYXRpb24uCi0JKG1haW4pOiBTdXBwb3J0IC13IG9wdGlvbiBiZWluZyB0aGUgc2FtZSBhcyAtLXdpZGUuCi0KLVRodSBKdW4gIDEgMTc6MDk6MjcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCVNhdCBNYXkgIDYgMDg6NTI6MjQgMTk5NSAgSC5KLiBMdSAoaGpsQG55bmV4c3QuY29tKQotCi0JKiBvYmpjb3B5LmMgKHNtYXJ0X3JlbmFtZSk6IG1ha2UgaXQgc21hcnRlciwgY2xlYW4gdXAKLQkgIGlmIHJlbmFtZSAoKSBmYWlscy4KLQotVHVlIE1heSAzMCAxNDoyNDoxNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogRGVsZXRlIGxpbmVzIHdpdGggbG90cyBvZiAjIyMjIGJlY2F1c2UgZm91ciBvciBtb3JlCi0JaW5kaWNhdGUgYSBwb2ludCBmb3IgbWFrZWZpbGUgZnJhZ21lbnQgc3Vic3RpdHV0aW9uLgotCi1UdWUgTWF5ICA5IDE3OjE3OjA1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBubG1jb252IG9uIFBvd2VyUEMgZWFiaSBhbnkgbW9yZSwgaXQKLQlpcyBub3QgbmVlZGVkLgotCi1UaHUgQXByIDI3IDIwOjIxOjI0IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChFWFBFQ1QpOiBEZWZpbmUuCi0JKFJVTlRFU1QpOiBVc2Ugb25lIGluIHNvdXJjZSB0cmVlIGlmIHByZXNlbnQuCi0JKGNoZWNrKTogU2V0IGByb290bWUnIGZvciAkKEVYUEVDVCkuCi0KLVdlZCBBcHIgMjYgMTg6MjY6MjEgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc3Jjb252LmMgKG1haW4pOiBBZGQgc3VwcG9ydCBmb3IgLW4gb3B0aW9uIHdoaWNoIGRpc2FibGVzCi0JcHJlc2NhbiBvZiBjb21tb24gc3ltYm9scy4KLQkod3Jfb2IpOiBJZiByZWFkaW5nIHBhc3QgdGhlIGVuZCBvZiBhIHNlY3Rpb24sIGZpbGwgd2l0aCB6ZXJvcy4KLQotVHVlIEFwciAyNSAxOToxNDozNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBEaXNwbGF5IGxvYWQgYWRkcmVzcyBhZnRlcgotCXZpcnR1YWwgbWVtb3J5IChydW4tdGltZSkgYWRkcmVzcy4KLQotV2VkIEFwciAxOSAwOTo0NDowNiAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNwbHVzLWRlbS5vKTogUGFzcyAtRFZFUlNJT049JyIkKFZFUlNJT04pIicgdG8gdGhlCi0gICAgICAgIGNvbXBpbGUuCi0JKERFTUFOR0xFUl9QUk9HKTogTm8gbG9uZ2VyIHVzZXMgdmVyc2lvbi5vLgotCi1Nb24gQXByIDEwIDEzOjI5OjQ5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCU1lcmdlIGluIHN1cHBvcnQgZm9yIE1hYyBNUFcgYXMgYSBob3N0LgotCShPbGQgY2hhbmdlIGRlc2NyaXB0aW9ucyByZXRhaW5lZCBmb3IgaW5mb3JtYXRpb25hbCB2YWx1ZS4pCi0KLQkqIG1wdy1jb25maWcuaW4gKFRERUZJTkVTKTogRGVmaW5lIGFzIGVtcHR5IGluIG1ha2VmaWxlIGZyYWcuCi0KLQkqIG1wdy1jb25maWcuaW46IENyZWF0ZSBtay50bXAsIGRlZmluZSBBUkNIREVGUyBpbiBpdC4KLQotCSogbXB3LWNvbmZpZy5pbjogTmV3IGZpbGUsIE1QVyBjb25maWd1cmUgZnJhZ21lbnQgZm9yIGJpbnV0aWxzLgotCSogbXB3LW1ha2UuaW4gKGluc3RhbGwtb25seSk6IE5ldyB0YXJnZXQuCi0JKGluc3RhbGwpOiBBbHNvIGRlcGVuZCBvbiBpbnN0YWxsLW9ubHkuCi0KLQkqIG1wdy1tYWtlLmluIChjcGx1c2ZpbHQpOiBSZW5hbWVkIGZyb20gYysrZmlsdC4KLQkoSU5DTFVERVMpOiBBZGQgbW9yZSBwYXRocy4KLQotCSogbXB3LW1ha2UuaW46IE5ldyBmaWxlLCBNUFcgbWFrZWZpbGUgZnJhZ21lbnQgZm9yIGJpbnV0aWxzLgotCShOb3JtYWxseSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIE1ha2VmaWxlLmluLikKLQotTW9uIE1hciAyNyAxMTo1Mjo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyLmMgKHdyaXRlX2FyY2hpdmUpOiBDYWxsIG1ha2VfdGVtcG5hbWUgdG8gZ2V0IG91dHB1dCBmaWxlCi0JbmFtZSwgcmF0aGVyIHRoYW4gdXNpbmcgYSBmaXhlZCBuYW1lIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlLgotCi0JKiBvYmpjb3B5LmMgKG1ha2VfdGVtcG5hbWUpOiBDb3B5IGZyb20gaGVyZS4uLgotCSogYnVjb21tLmMgKG1ha2VfdGVtcG5hbWUpOiAuLi50byBoZXJlLCBhbmQgbWFrZSBnbG9iYWwuCi0JKiBidWNvbW0uaCAobWFrZV90ZW1wbmFtZSk6IERlY2xhcmUuCi0KLUZyaSBNYXIgMjQgMTE6NDc6NDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdHJpbmdzLmM6IEluY2x1ZGUgImJmZC5oIiBiZWZvcmUgb3RoZXIgaGVhZGVycy4gIEluY2x1ZGUKLQkic3lzZGVwLmgiLgotCSogYnVjb21tLmMgKHByaW50X2FyZWx0X2Rlc2NyKTogQ2FzdCBzdF91aWQgYW5kIHN0X2dpZCB0byBsb25nLAotCWFuZCBwcmludCB0aGVtIHdpdGggJWxkLgotCi1GcmkgTWFyIDEwIDEzOjA5OjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChzdHJpcF9vcHRpb25zKTogQWRkIC0ta2VlcC1zeW1ib2wuCi0JKGNvcHlfb3B0aW9ucyk6IExpa2V3aXNlLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLWtlZXAtc3ltYm9sIGFuZCAtSy4KLQkoc3RyaXBfdXNhZ2UpOiBMaWtld2lzZS4KLQkoa2VlcF9zeW1ib2xzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoaXNfc3RyaXBfc3ltYm9sKTogQWRqdXN0IHRoZSByZXR1cm4gdmFsdWUgYWNjb3JkaW5nIHRvCi0Ja2VlcF9zeW1ib2xzLgotCShzdHJpcF9tYWluKTogSGFuZGxlIC1LLiAgRm9yIC1OLCBjaGVjayB0aGF0IC1LIHdhcyBub3QgZ2l2ZW4uCi0JKGNvcHlfbWFpbik6IExpa2V3aXNlLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xLCBzdHJpcC4xOiBEb2N1bWVudCAtSy4KLQotTW9uIE1hciAgNiAxMzozMzo0NyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY29weV9hcmNoaXZlKTogQ2hlY2sgcmVzdWx0IG9mIG1rZGlyLgotCShjb3B5X21haW4pOiBDYXN0IGFuIHhtYWxsb2MgcmVzdWx0LgotCi0JKiBvYmpkdW1wLmMgKHVzYWdlKTogQnJlYWsgbG9uZyBmb3JtYXQgc3RyaW5nIGludG8gc2hvcnRlciBvbmVzLgotCi1Nb24gTWFyICA2IDEzOjQ2OjEyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYnVjb21tLmMgKGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMpOiBOZXcgZnVuY3Rpb24uCi0JKiBidWNvbW0uaCAobGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyk6IERlY2xhcmUuCi0JKiBhci5jICh1c2FnZSk6IENhbGwgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cy4KLQkqIG5tLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0JKiBvYmpjb3B5LmMgKGNvcHlfdXNhZ2UsIHN0cmlwX3VzYWdlKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0JKiBzaXplLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0JKiBzdHJpbmdzLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0KLVR1ZSBGZWIgMjggMTU6MTM6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBidWNvbW0uYyAocHJpbnRfYXJlbHRfZGVzY3IpOiBDYXN0IHN0X3NpemUgdG8gbG9uZyBiZWZvcmUKLQlwYXNzaW5nIGl0IHRvIGZwcmludGYuCi0KLUZyaSBGZWIgMTcgMTM6MzY6NDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKHN0cnVjdCBzZWN0aW9uX2xpc3QpOiBBZGQgZmllbGRzIHJlbW92ZSwgc2V0X2ZsYWdzLAotCWFuZCBmbGFncy4gIENoYW5nZSBhZGp1c3QgZnJvbSBib29sZWFuIHRvIGVudW0uCi0JKHJlbW92ZV9zZWN0aW9ucyk6IFJlbW92ZSBzdGF0aWMgdmFyaWFibGUuCi0JKHNlY3Rpb25zX3JlbW92ZWQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShjb3B5X29wdGlvbnMpOiBBZGQgLS1zZXQtc2VjdGlvbi1mbGFncy4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1zZXQtc2VjdGlvbi1mbGFncy4KLQkocGFyc2VfZmxhZ3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShmaW5kX3NlY3Rpb25fbGlzdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGlzX3N0cmlwX3N5bWJvbCk6IENoYW5nZSByZXR1cm4gdHlwZSBmcm9tIGludCB0byBib29sZWFuLgotCShpc19zdHJpcF9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZmlsdGVyX3N5bWJvbHMpOiBDYWxsIGlzX3N0cmlwX3NlY3Rpb24uCi0JKGNvcHlfb2JqZWN0KTogV2hlbiBhZGRpbmcgc2VjdGlvbnMsIGNoZWNrIGZvciBzcGVjaWZpZWQgZmxhZ3Mgb3IKLQlWTUEuICBDYWxsIGZpbHRlcl9zeW1ib2xzIGlmIGFueSBzZWN0aW9ucyBhcmUgYmVpbmcgcmVtb3ZlZC4KLQkoc2V0dXBfc2VjdGlvbik6IFVzZSBmaW5kX3NlY3Rpb25fbGlzdCBmdW5jdGlvbiByYXRoZXIgdGhhbgotCWxvb2tpbmcgdGhyb3VnaCByZW1vdmVfc2VjdGlvbnMgYW5kIGFkanVzdF9zZWN0aW9ucy4gIEhhbmRsZQotCS0tc2V0LXNlY3Rpb24tZmxhZ3MuCi0JKGNvcHlfc2VjdGlvbik6IFVzZSBmaW5kX3NlY3Rpb25fbGlzdCByYXRoZXIgdGhhbiBsb29raW5nIHRocm91Z2gKLQlyZW1vdmVfc2VjdGlvbnMuCi0JKHN0cmlwX21haW4pOiBVc2UgZmluZF9zZWN0aW9uX2xpc3QgaW5zdGVhZCBvZiBhZGRpbmcgaXRlbXMgdG8KLQlzZWN0aW9uc19yZW1vdmVkLgotCShjb3B5X21haW4pOiBVc2UgZmluZF9zZWN0aW9uX2xpc3QgaW5zdGVhZCBvZiBhZGRpbmcgaXRlbXMgdG8KLQlzZWN0aW9uc19yZW1vdmVkIGFuZCBhZGp1c3Rfc2VjdGlvbnMuICBIYW5kbGUgLS1zZXQtc2VjdGlvbi1mbGFncy4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1zZXQtc2VjdGlvbi1mbGFncy4KLQotVHVlIEZlYiAxNCAxODowMzowMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAod2l0aF9zb3VyY2VfY29kZSk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHVzYWdlKTogTWVudGlvbiAtUy8tLXNvdXJjZS4KLQkobG9uZ19vcHRpb25zKTogQWRkIC0tc291cmNlLgotCShwcmV2X2Z1bmN0aW9ubmFtZSwgcHJldl9saW5lKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKHN0cnVjdCBwcmludF9maWxlX2xpc3QpOiBEZWZpbmUuCi0JKHByaW50X2ZpbGVzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc2tpcF90b19saW5lLCBzaG93X2xpbmUpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IENhbGwgc2hvd19saW5lIHRvIGhhbmRsZSAtbCBhbmQgLVMuCi0JKG1haW4pOiBIYW5kbGUgLVMuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC1TLy0tc291cmNlLgotCi1UaHUgRmViICA5IDE2OjExOjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb3B5X3VzYWdlKTogUmVuYW1lIHBhcmFtZXRlciB0byBhdm9pZCBzaGFkb3dpbmcuCi0JKHN0cmlwX3VzYWdlKTogTGlrZXdpc2UuCi0KLQkqIG9iamNvcHkuYyAoc3RydWN0IHNlY3Rpb25fYWRkKTogRGVmaW5lLgotCShhZGRfc2VjdGlvbnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShjb3B5X29wdGlvbnMpOiBBY2NlcHQgLS1hZGQtc2VjdGlvbi4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1hZGQtc2VjdGlvbi4KLQkoY29weV9vYmplY3QpOiBBZGQgc2VjdGlvbnMgZnJvbSB0aGUgYWRkX3NlY3Rpb25zIGxpc3QuCi0JKGNvcHlfbWFpbik6IEhhbmRsZSAtLWFkZC1zZWN0aW9uLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBEb2N1bWVudCAtLWFkZC1zZWN0aW9uLgotCi1XZWQgRmViICAxIDE1OjA0OjU3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFBhc3Mgc2VjdGlvbiBvZmZzZXQsIG5vdCBhYnNvbHV0ZQotCWFkZHJlc3MsIHRvIGJmZF9maW5kX25lYXJlc3RfbGluZS4KLQotCSogbmxtY29udi5jIChwb3dlcnBjX21hbmdsZV9yZWxvY3MpOiBEb24ndCB1c2UgY29uc3Qgd2l0aAotCXJlbG9jX2hvd3RvX3R5cGUuCi0KLVRodSBKYW4gMjYgMTg6NTA6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGNvbXBhcmVfc3ltYm9scyk6IFVzZSBiZmRfYXN5bWJvbF92YWx1ZSAoVkFSKSByYXRoZXIKLQl0aGFuIFZBUi0+dmFsdWUuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IExpa2V3aXNlLgotCShkaXNhc3NlbWJsZV9kYXRhKTogRG9uJ3QgY2hhbmdlIHRoZSBzeW1ib2wgdmFsdWVzLiAgSXQgY2FuCi0JY29uZnVzZSBiZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCi1UaHUgSmFuIDI2IDEyOjAzOjU2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgcG93ZXJwYy0qLWViYWkuCi0KLVdlZCBKYW4gMTggMTA6MDI6MTIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+Ci0KLQkqIGNvZmZkdW1wLmM6IEluY2x1ZGUgc3lzZGVwLmguCi0JKGR1bXBfY29mZl90eXBlKTogSGFuZGxlIGNvZmZfc2VjZGVmX3R5cGUuCi0JKiBjb2ZmZ3Jvay5jIDogSW5jbHVkZSBzeXNkZXAuaC4KLQkqIHNyY29udi5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oCi0JKGFic29sdXRlX3AsIGR0eV9zdGFydCwgZHR5X2VuZCwgZHVtcF90cmVlX3N0cnVjdHVyZSk6IFJlbW92ZS4KLQotV2VkIEphbiAxOCAxMjoyNDoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZkdW1wLmMgKGR1bXBfY29mZl9zY29wZSk6IENhc3QgcG9pbnRlciB0byB1bnNpZ25lZCBsb25nIGZvcgotCXByaW50Zi4KLQkqIGNvZmZncm9rLmM6IEluY2x1ZGUgYnVjb21tLmguICBEb24ndCBkZWNsYXJlIHhtYWxsb2MuCi0JKHB1c2hfc2NvcGUpOiBEZWNsYXJlIHR5cGUgb2YgcGFyYW1ldGVyIGxpbmsuCi0JKiBzaXplLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKiBzcmNvbnYuYzogSW5jbHVkZSBidWNvbW0uaC4KLQkoZmluZF9iYXNlKTogRGVjbGFyZSBhdCB0b3Agb2YgZmlsZS4KLQkod3JfaGQpOiBBZGQgZGVmYXVsdCBjYXNlIHRvIGFyY2hpdGVjdHVyZSBzd2l0Y2guCi0JKHdyX2Rwc19zdGFydCk6IERlY2xhcmUgdHlwZSBvZiBwYXJhbWV0ZXIgbmVzdC4KLQkod3JfZHUpOiBDb21tZW50IG91dCB2YXJpYWJsZXMgdXNlZCBvbmx5IGluIGNvbW1lbnRlZCBvdXQgYmxvY2tzLgotCSh3cl9kdXMpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGkuCi0JKHdyX3NjKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgbXlpbmZvLCBsb3csIGFuZCBoaWdoLgotCSogc3RyaW5ncy5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCSogc3lzZHVtcC5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQotVHVlIERlYyAyMCAxOToxMzo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGFyLmMgKG1haW4pOiBJZ25vcmUgJ2YnIG1vZGlmaWVyIHVzZWQgb24gSFAvVVggOS4KLQotVGh1IERlYyAxNSAxNzozNDoxMiAxOTk0ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGFyLmMsIG5tLmMsIG9iamNvcHkuYywgb2JqZHVtcC5jOiBJbmNsdWRlIHByb2dyZXNzLmguCi0JKiBhci5jLCBubS5jLCBvYmpjb3B5LmMsIG9iamR1bXAuYyAobWFpbik6IEFkZCBTVEFSVF9QUk9HUkVTUwotCWFuZCBFTkRfUFJPR1JFU1MuCi0JKiBhci5jIChtYXBfb3Zlcl9tZW1iZXJzLCBvcGVuX2luYXJjaCk6IENhbGwgUFJPR1JFU1MuCi0JKiBubS5jIChtYWluLCBkaXNwbGF5X2FyY2hpdmUsIGZpbHRlcl9zeW1ib2xzLCBwcmludF9zeW1ib2xzKToKLQlDYWxsIFBST0dSRVNTLgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfdXNhZ2UpOiBCcmVhayB1cCBsb25nIHVzYWdlIHN0cmluZy4KLQotV2VkIERlYyAxNCAxNTo1MTo1NiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogRG9uJ3QgYm90aGVyIHNldHRpbmcgc3RhdHVzIGFmdGVyCi0Jbm9uZmF0YWwoKSAiY2FsbCIsIGJlY2F1c2UgaXQgd29uJ3QgcmV0dXJuLgotCi1GcmkgRGVjICA5IDAwOjIyOjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChwb3dlcnBjX21hbmdsZV9yZWxvY3MpOiBEb24ndCBzd2l0Y2ggYSByZWxvYyB0byB1c2UKLQl0aGUgc2VjdGlvbiBzeW1ib2wgaWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuCi0KLVRodSBEZWMgIDggMTQ6NDU6NTAgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChhZGRfc3RyaXBfc3ltYm9sKTogQ2FzdCByZXR1cm4gdmFsdWUgb2YgeG1hbGxvYy4KLQotV2VkIE5vdiAzMCAxMTowNTo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHJ0bC5jeWdudXMuY29tPgotCi0JKiBhci5jIChyZXBsYWNlX21lbWJlcnMpOiBQYXNzIGN1cnJlbnQtPmZpbGVuYW1lIHRvIG5vcm1hbGl6ZSB3aGVuCi0JY2hlY2tpbmcgZm9yIGR1cGxpY2F0ZXMsIGJlY2F1c2UgdGhlIGZpbGVuYW1lIG9mIGEgbmV3bHkgYWRkZWQKLQlmaWxlIHdpbGwgbm90IGhhdmUgYmVlbiBub3JtYWxpemVkIHlldC4KLQotVGh1IE5vdiAxNyAxNTowMDoxMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGFyLmMgKG1haW4pOiBEb24ndCBjYWxsIGRvX3F1aWNrX2FwcGVuZCBpZiBhbnkgb2YgdGhlIGFyY2hpdmUKLQluYW1lcyBhcmUgbG9uZ2VyIHRoYW4gMTQgY2hhcmFjdGVycy4KLQotCSogb2JqY29weS5jIChtYWluKTogRml4IGlzX3N0cmlwIHRlc3QuICBGcm9tCi0JcGlya2VyQGVpdW5peC50dXdpZW4uYWMuYXQgKE1hcnRpbiBQaXJrZXIpLgotCi1UaHUgTm92IDE3IDE1OjM3OjE5IDE5OTQgIE1hcmsgVy4gRWljaGluICA8ZWljaGluQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoYWRkX3N0cmlwX3N5bWJvbCk6IE5ldyBmdW5jdGlvbiwgYWRkcyBhIG5hbWUgdG8gYW4KLQlleHBsaWNpdCBsaXN0IG9mIHN5bWJvbHMgdG8gc3RyaXAuCi0JKGlzX3N0cmlwX3N5bWJvbCk6IE5ldyBmdW5jdGlvbiwgcmVwb3J0cyB3aGV0aGVyIHRoZSBuYW1lIGFyZ3VtZW50Ci0JaXMgaW4gdGhlIGV4cGxpY2l0IGxpc3QuCi0JKGZpbHRlcl9zeW1ib2xzKTogQ2hlY2sgYWdhaW5zdCBpc19zdHJpcF9zeW1ib2wgYWJvdmUgYWxsLgotCShzdHJpcF9tYWluKTogUmVjb2duaXplIC1OIG9wdGlvbi4gSWYgdXNlZCwgZG9uJ3QgZGVmYXVsdCB0bwotCXN0cmlwX2FsbC4KLQkoY29weV9tYWluKTogUmVjb2duaXplIC1OIG9wdGlvbi4KLQkoc3RyaXBfdXNhZ2UpOiBEb2N1bWVudCAtTiBhbmQgLS1zdHJpcC1zeW1ib2wgb3B0aW9ucy4KLQkoY29weV91c2FnZSk6IERpdHRvLgotCSogb2JqY29weS4xLCBzdHJpcC4xLCBiaW51dGlscy50ZXhpOiBEb2N1bWVudCAtTiBhbmQKLQktLXN0cmlwLXN5bWJvbCBvcHRpb25zLgotCi1UdWUgTm92ICA4IDEzOjEyOjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNwbGF5X3RhcmdldF9saXN0LCBkaXNwbGF5X2luZm9fdGFibGUpOiBQYXNzIGFuCi0JYXJyYXkgdG8gdG1wYXJnLCByYXRoZXIgdGhhbiBOVUxMLCBzaW5jZSBzb21lIHN5c3RlbXMgY2FuJ3QgaGFuZGxlCi0JTlVMTC4KLQotCSogb2JqY29weS5jIChjb3B5X2FyY2hpdmUpOiBLZWVwIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgdGhlCi0gICAgICAgIHRlbXBvcmFyeSBmaWxlcyB3ZSBjcmVhdGVkLiAgQ2xvc2UgZWFjaCBpbnB1dCBCRkQgYWZ0ZXIgd2Ugb3BlbgotICAgICAgICBpdHMgc3VjY2Vzc29yLgotCi1Nb24gTm92ICA3IDE1OjQ4OjM5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogQnVtcCB0byAyLjUuMy4KLQotVGh1IE5vdiAgMyAxOTowNDozNCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogSW5zdGFsbCBpbmZvIGZpbGVzIGZyb20gd2hhdGV2ZXIKLQlkaXJlY3RvcnkgdGhleSB3ZXJlIGZvdW5kIGluLgotCi0JUGF0Y2ggZnJvbSBESiBEZWxvcmllOgotCSogY29uZmlndXJlLmJhdDogZG8gYysrZmlsdCAtPiBjeHhmaWx0IHJpZ2h0Ci0KLQkqIHN5c2luZm8ueTogSW5jbHVkZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGVhcmx5LCBzbyBhbnkgcG90ZW50aWFsCi0JZGVjbGFyYXRpb24gb2YgYWJvcnQoKSBvY2N1cnMgYmVmb3JlIGl0cyB1c2UuCi0KLQkqIHN0cmluZ3MuYyAoc3RyaW5nc19maWxlKTogVHJ5IG9wZW5pbmcgdGhlIGZpbGUgaW4gYmluYXJ5IG1vZGUKLQlmaXJzdC4KLQotV2VkIE5vdiAgMiAxNTo0NDoxMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGFyLmMgKG1haW4pOiBUcmVhdCBhciBxcyBsaWtlIGFyIHJzLgotCi1UdWUgT2N0IDI1IDE2OjE5OjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChnYXBfZmlsbCk6IEV4cGxpY2l0bHkgaW5pdGlhbGl6ZSwgZm9yIGNsYXJpdHkuCi0JKHBhZF90b19zZXQsIHBhZF90byk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShjb3B5X29wdGlvbnMpOiBBY2NlcHQgLS1wYWQtdG8uCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0tcGFkLXRvLgotCShjb3B5X29iamVjdCk6IFN1cHBvcnQgLS1wYWQtdG8uCi0JKGNvbXBhcmVfc2VjdGlvbl92bWEpOiBTb3J0IG5vbiBsb2FkYWJsZSBzZWN0aW9ucyB0byB0aGUgZnJvbnQuCi0JU29ydCBzZWN0aW9ucyB3aXRoIHRoZSBzYW1lIFZNQSBieSBzaXplLgotCShjb3B5X21haW4pOiBIYW5kbGUgLS1wYWQtdG8uCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0tcGFkLXRvLgotCi1UaHUgT2N0IDIwIDEzOjUxOjMxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChnYXBfZmlsbF9zZXQsIGdhcF9maWxsKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKGNvcHlfb3B0aW9ucyk6IEFjY2VwdCAtLWdhcC1maWxsLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLWdhcC1maWxsLgotCShjb3B5X29iamVjdCk6IFN1cHBvcnQgLS1nYXAtZmlsbC4KLQkoZ2V0X3NlY3Rpb25zLCBjb21wYXJlX3NlY3Rpb25fdm1hKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKGNvcHlfbWFpbik6IEhhbmRsZSAtLWdhcC1maWxsLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBEb2N1bWVudCAtLWdhcC1maWxsLgotCi1XZWQgT2N0IDE5IDE0OjA5OjE2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogQWRkIGEgZHVtbXkgZWxzZSBjbGF1c2UgdG8gdGhlIGlmCi0Jc3RhdGVtZW50LgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogUmVtb3ZlIHNwZWNpYWwgbWVudGlvbiBvZiAtLXNldC1zdGFydAotCWFuZCBgYmluYXJ5JyBvdXRwdXQgZm9ybWF0LgotCi1UdWUgT2N0IDE4IDExOjEyOjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6IElmIHRoZSBvdXRwdXQgZmlsZSBmb3JtYXQgaXMgYGJpbmFyeScsCi0JYW5kIHRoZSBzdGFydCBhZGRyZXNzIHdhcyBub3Qgc2V0IHVzaW5nIC0tc2V0LXN0YXJ0LCBkZWZhdWx0IHRoZQotCXN0YXJ0IGFkZHJlc3MgdG8gemVyby4gIFRoaXMgaGFjayBpcyBiZWNhdXNlIHRoZSBgYmluYXJ5JyBvdXRwdXQKLQlmaWxlIGZvcm1hdCB1c2VzIHRoZSBzdGFydCBhZGRyZXNzIHRvIHNldCB0aGUgdmlydHVhbCBhZGRyZXNzIG9mCi0JdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGZpbGUuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IEFkZCBzb21lIG5vdGVzIG9uIGdlbmVyYXRpbmcgUy1yZWNvcmRzCi0JYW5kIGJpbmFyeSBmaWxlcy4KLQotCSogbm0uYyAocHJpbnRfc3ltZGVmX2VudHJ5KTogQ2FsbCBwcmludF9zeW1uYW1lIHRvIHByaW50IHRoZQotCXN5bWJvbCBuYW1lLCBzbyB0aGF0IC0tZGVtYW5nbGUgd29ya3MuCi0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IFJlbW92ZSB0bXBkaXIuCi0KLQkqIG9iamNvcHkuYyAoc3RydWN0IHNlY3Rpb25fbGlzdCk6IEFkZCBmaWVsZHMgdXNlZCwgYWRqdXN0LCB2YWwuCi0JKGFkanVzdF9zdGFydCwgc2V0X3N0YXJ0X3NldCwgc2V0X3N0YXJ0KTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKGFkanVzdF9zZWN0aW9uX3ZtYSwgYWRqdXN0X3NlY3Rpb25zKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKGNvcHlfb3B0aW9ucyk6IEFkZCAtLWFkanVzdC1zdGFydCwgLS1hZGp1c3Qtdm1hLAotCS0tYWRqdXN0LXNlY3Rpb24tdm1hLCAtLWFkanVzdC13YXJuaW5ncywgLS1uby1hZGp1c3Qtd2FybmluZ3MsCi0JLS1zZXQtc3RhcnQuCi0JKHBhcnNlX3ZtYSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIG5ldyBvcHRpb25zLgotCShjb3B5X29iamVjdCk6IEhhbmRsZSAtLXNldC1zdGFydCBhbmQgLS1hZGp1c3Qtc3RhcnQuCi0JKHNldHVwX3NlY3Rpb24pOiBDb3JyZWN0IHR5cGUgb2YgbGFzdCBhcmd1bWVudCB0byBQVFIuICBTZXQgdXNlZAotCWZpZWxkIGlmIHNlY3Rpb24gaXMgcmVtb3ZlZC4gIEhhbmRsZSAtLWFkanVzdC12bWEgYW5kCi0JLS1hZGp1c3Qtc2VjdGlvbi12bWEuCi0JKGNvcHlfc2VjdGlvbik6IENvcnJlY3QgdHlwZSBvZiBsYXN0IGFyZ3VtZW50IHRvIFBUUi4KLQkobWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMpOiBMaWtld2lzZS4KLQkoc3RyaXBfbWFpbik6IENsZWFyIHVzZWQgZmllbGQgd2hlbiBoYW5kbGluZyAtUi4KLQkoY29weV9tYWluKTogSGFuZGxlIG5ldyBvcHRpb25zLgotCSogYmludXRpbHMudGV4aSAob2JqY29weSk6IERvY3VtZW50IG5ldyBvcHRpb25zLgotCSogb2JqY29weS4xOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQotRnJpIE9jdCAxNCAxNDozODoxMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoY29uZmlnZGlycyk6IFJlbW92ZSBkZWZpbml0aW9uLS10ZXN0c3VpdGUgaXMgbm8KLQlsb25nZXIgY29uZmlndXJlZC4KLQkqIE1ha2VmaWxlLmluICh0ZXN0c3VpdGUpOiBSZW1vdmUgdGFyZ2V0LgotCShzaXRlLmV4cCk6IE5ldyB0YXJnZXQuCi0JKGNoZWNrKTogUmV3cml0ZS4KLQkoY2xlYW4sIGRpc3RjbGVhbik6IERvbid0IHJlY3VyIGludG8gdGVzdHN1aXRlIGRpcmVjdG9yeS4KLQotVGh1IE9jdCAxMyAxOToyNDowOSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZWQgdG8gMi41LgotCSogVmVyc2lvbiAyLjUgcmVsZWFzZWQuCi0KLVR1ZSBPY3QgMTEgMTU6MjY6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoc3lzZHVtcC5vKTogRGVwZW5kcyB1cG9uIHN5c3JvZmYuYy4KLQotTW9uIE9jdCAxMCAxMzo1MDozMCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcnRsLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobGlua19pbnB1dHMpOiBQYXNzIC1VciBmbGFnIHRvIGxkIHNvIHRoYXQgdGhlCi0JICBjdG9yL2R0b3IgdGFibGVzIG5lZWRlZCBieSBDKysgcHJvZ3JhbXMgYXJlIGJ1aWx0LgotCi1TdW4gT2N0ICA5IDE4OjA0OjAwIDE5OTQgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHNyY29udi5vKTogQWRkIGRlcGVuZGVuY2Ugb24gc3lzcm9mZi5jLgotCi1UdWUgT2N0ICA0IDEyOjE5OjUxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgJHtjb25maWdfc2hlbGx9IHdoZW4gcnVubmluZyBjb25maWcuYmZkLgotCi0JKiBNYWtlZmlsZS5pbiAoc3lzcm9mZi5oKTogU3BsaXQgdGFyZ2V0IGF3YXkgZnJvbSBzeXNyb2ZmLmMuCi0JKHNyY29udi5vLCBzeXNkdW1wLm8pOiBOZXcgdGFyZ2V0cy4KLQkoc3Jjb252LCBzeXNkdW1wKTogRG9uJ3QgZGVwZW5kIHVwb24gc3lzcm9mZi5jLgotCi1XZWQgU2VwIDI4IDEzOjA0OjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFycGFyc2UuYyk6IERvbid0IGlnbm9yZSBlcnJvcnMgZnJvbSBtdi4KLQkoc3lzaW5mby5jKTogTGlrZXdpc2UuICBBbHNvLCBkZXBlbmQgdXBvbiBhcnBhcnNlLmMsIHRvIHByZXZlbnQgYQotCXBhcmFsbGVsIG1ha2UgZnJvbSB0cnlpbmcgdG8gYnVpbGQgYm90aCBhcnBhcnNlLmMgYW5kIHN5c2luZm8uYwotCXNpbXVsdGFuZW91c2x5LgotCShubG1oZWFkZXIuYyk6IFNpbWlsYXIgY2hhbmdlLgotCShhcnBhcnNlLmgpOiBTZXBhcmF0ZSB0YXJnZXQgZnJvbSBhcnBhcnNlLmMsIHNvIHRoYXQgYSBwYXJhbGxlbAotCW1ha2UgZG9lcyBub3QgdHJ5IHRvIGJ1aWxkIGJvdGggYXQgb25jZS4gIERlcGVuZCB1cG9uIGFycGFyc2UuYy4KLQkoc3lzaW5mby5oKTogU2ltaWxhciBjaGFuZ2UuCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFBhc3MgdGhlIHJlbG9jIGJ1ZmZlciB0byBmcmVlLCBub3QKLQl0aGUgcG9pbnRlciB1c2VkIHRvIGxvb3Agb3ZlciB0aGUgcmVsb2NzLgotCi1TYXQgU2VwIDI0IDE2OjE2OjU3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogQ2FzdCByZXN1bHQgb2YgeG1hbGxvYy4KLQotV2VkIFNlcCAyMSAxOTozMDozNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoc29ydGVkX3N5bXMsIHNvcnRlZF9zeW1jb3VudCk6IE5ldyBnbG9iYWwgdmFyaWFibGVzLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBVc2Ugc29ydGVkX3N5bXMgYW5kIHNvcnRlZF9zeW1jb3VudAotCWluc3RlYWQgb2Ygc3ltcyBhbmQgc3ltY291bnQuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBEb24ndCBib3RoZXIgdG8gZ2V0IHRoZSByZWxvY3MgYmVmb3JlIGxvb3BpbmcKLQlvdmVyIHRoZSBzZWN0aW9ucy4gIEJlZm9yZSBmaWx0ZXJpbmcgYW5kIHNvcnRpbmcgdGhlIHN5bWJvbCB0YWJsZSwKLQljb3B5IGl0IGludG8gc29ydGVkX3N5bXMuCi0KLUZyaSBTZXAgMTYgMTE6Mjc6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvKTogQWRkIGZpZWxkIHJlcXVpcmVfc2VjLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBJZiBhdXgtPnJlcXVpcmVfc2VjLCByZXF1aXJlIHRoYXQgdGhlCi0Jc3ltYm9sIGJlIGluIGF1eC0+c2VjIGV2ZW4gaWYgSEFTX1JFTE9DIGlzIG5vdCBzZXQuICBJZiB3ZSBjYW4ndAotCWZpbmQgYSBzbWFsbGVyIHN5bWJvbCBpbiB0aGUgcmlnaHQgc2VjdGlvbiwgbG9vayBmb3IgYSBsYXJnZXIgb25lLgotCShkaXNhc3NlbWJsZV9kYXRhKTogU2V0IGF1eC5yZXF1aXJlX3NlYyBhcm91bmQgdGhlCi0Jb2JqZHVtcF9wcmludF9hZGRyZXNzIGNhbGwgZm9yIHRoZSBpbnN0cnVjdGlvbiBhZGRyZXNzLgotCi1UaHUgU2VwIDE1IDIxOjQzOjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXIuYzogQ2FsbCB4ZXhpdCByYXRoZXIgdGhhbiBleGl0LgotCShvdXRwdXRfZmlsZW5hbWUsIG91dHB1dF9maWxlLCBvdXRwdXRfYmZkKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKHJlbW92ZV9vdXRwdXQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtYWluKTogQ2FsbCB4YXRleGl0IChyZW1vdmVfb3V0cHV0KS4gIENhbGwgeGV4aXQgcmF0aGVyIHRoYW4KLQlyZXR1cm5pbmcuCi0JKGV4dHJhY3RfZmlsZSk6IFNldCBvdXRwdXRfZmlsZW5hbWUgYW5kIG91dHB1dF9maWxlIHdoaWxlIG91dHB1dAotCWZpbGUgaXMgb3Blbi4KLQkod3JpdGVfYXJjaGl2ZSk6IExpa2V3aXNlLCBidXQgdXNlIG91dHB1dF9iZmQsIG5vdCBvdXRwdXRfZmlsZS4KLQkqIGFyc3VwLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguICBDYWxsIHhleGl0IHJhdGhlciB0aGFuIGV4aXQuCi0JKiBidWNvbW0uYzogTGlrZXdpc2UuCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYWxsKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkodXNhZ2UpOiBEb2N1bWVudCAtLWRpc2Fzc2VtYmxlLWFsbC4KLQkobG9uZ19vcHRpb25zKTogQWRkIGRpc2Fzc2VtYmxlLWFsbCBhcyBhIHN5bm9ueW0gZm9yIC1ELgotCShjb21wYXJlX3N5bWJvbHMpOiBNYWtlIHBvaW50ZXJzIGNvbnN0LgotCShjb21wYXJlX3JlbG9jcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBSZW5hbWUgZGlzYXNzZW1ibGUgdG8gZGlzYXNzZW1ibGVfZm4gdG8gYXZvaWQKLQlzaGFkb3dpbmcuICBJZiBkdW1wX3JlbG9jX2luZm8sIHByaW50IHJlbG9jcyBhbG9uZyB3aXRoCi0JZGlzYXNzZW1ibHkuICBTa2lwIHNlY3Rpb25zIHdoaWNoIGFyZSBub3QgU0VDX0NPREUgdW5sZXNzCi0JZGlzYXNzZW1ibGVfYWxsIG9yIG9ubHkgaXMgc2V0LgotCShkaXNwbGF5X2JmZCk6IERvbid0IGNhbGwgZHVtcF9yZWxvY3MgaWYgZGlzYXNzZW1ibGUgaXMgc2V0LgotCShtYWluKTogQWNjZXB0IGFuZCBoYW5kbGUgLUQuCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCAtRC8tLWRpc2Fzc2VtYmxlLWFsbC4KLQkqIG9iamR1bXAuMTogTGlrZXdpc2UuCi0KLVdlZCBTZXAgMTQgMTI6MTk6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBJbml0aWFsaXplIHByZXZsaW5lIHRvIDAuICBNYWtlCi0JcHJldl9mdW5jdGlvbiBub24gY29uc3QuICBDb3B5IGZ1bmN0aW9ubmFtZSBpbnRvIGFuIG1hbGxvYyBidWZmZXIKLQl3aGVuIHNldHRpbmcgcHJldl9mdW5jdGlvbiwgaW5zdGVhZCBvZiBhc3N1bWluZyB0aGF0IHRoZSBzdHJpbmcKLQl3aWxsIGxhc3QgZm9yZXZlci4KLQotCSogbm0uYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoc29ydF9ieV9zaXplKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobG9uZ19vcHRpb25zKTogQWRkIC0tc2l6ZS1zb3J0LgotCSh1c2FnZSk6IE1lbnRpb24gLS1zaXplLXNvcnQuCi0JKG51bWVyaWNfZm9yd2FyZCk6IE1ha2Ugc3RhdGljLiAgQ2hhbmdlIGZyb20gdm9pZCAqIHRvIFBUUi4KLQkobnVtZXJpY19yZXZlcnNlKTogTGlrZXdpc2UuCi0JKG5vbl9udW1lcmljX2ZvcndhcmQsIG5vbl9udW1lcmljX3JldmVyc2UpOiBMaWtld2lzZS4KLQkoc29ydGVycyk6IENoYW5nZSBkZWNsYXJhdGlvbiBmcm9tIHZvaWQgKiB0byBQVFIuCi0JKHNpemVfZm9yd2FyZCwgc29ydF9zeW1ib2xfYnlfc2l6ZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShkaXNwbGF5X3JlbF9maWxlKTogSGFuZGxlIHNvcnRfYnlfc2l6ZS4KLQkoZmlsdGVyX3N5bWJvbHMpOiBJZiBzb3J0X2J5X3NpemUsIGRpc2NhcmQgYWJzb2x1dGUgYW5kIHVuZGVmaW5lZAotCXN5bWJvbHMuCi0JKiBiaW51dGlscy50ZXhpIChubSk6IERvY3VtZW50IC0tc2l6ZS1zb3J0LgotCSogbm0uMTogRG9jdW1lbnQgLS1zaXplLXNvcnQuCi0KLVR1ZSBTZXAgMTMgMjE6MDY6MDYgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIG9iamNvcHkuYyAoY29weV9tYWluKTogSW5pdGlhbGl6ZSBpbnB1dF9maWxlbmFtZSBhbmQKLQlvdXRwdXRfZmlsZW5hbWUgdG8gTlVMTC4KLQotVHVlIFNlcCAxMyAxNDoxNzoyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh2ZXJzaW9uLm8pOiBEZXBlbmQgdXBvbiBNYWtlZmlsZSwgc28gdGhhdCB2ZXJzaW9uLm8KLQlnZXRzIHJlYnVpbHQgd2hlbiBtYWtlIHZhcmlhYmxlIFZFUlNJT04gaXMgY2hhbmdlZC4KLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25faGVhZGVyKTogUHJpbnQgdGhlIFNFQ19ORVZFUl9MT0FEIGZsYWcuCi0KLVdlZCBBdWcgMjQgMTI6NDA6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBpWzM0XTg2IHRvIGlbMzQ1XTg2LgotCi1UdWUgQXVnIDIzIDExOjAwOjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYXIuYyAocmFubGliX3RvdWNoKTogRG9uJ3QgdXBkYXRlIHRoZSBhcmNoaXZlIG1hcCBpZiB0aGVyZSBpc24ndAotCW9uZS4KLQotTW9uIEF1ZyAyMiAxNjowMjoxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFyLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKGluYXJjaCk6IFJlbW92ZSB2YXJpYWJsZS4KLQkobWFwX292ZXJfbWVtYmVycyk6IE1ha2Ugc3RhdGljLiAgQWRkIGFyY2ggYXJndW1lbnQsIGFuZCB1c2UgaXQKLQlpbnN0ZWFkIG9mIGluYXJjaC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkobWFpbik6IFRyZWF0IC0tdmVyc2lvbiBhcyAtdi4gIEFjY2VwdCAtdCBhcmd1bWVudC4gIEFjY2VwdCBhbnkKLQludW1iZXIgb2YgYXJjaGl2ZSBhcmd1bWVudHMuICBDYXRjaCBhbmQgdXNlIG9wZW5faW5hcmNoIHJldHVybgotCXZhbHVlLCByYXRoZXIgdGhhbiB1c2luZyBpbmFyY2guCi0JKG9wZW5faW5hcmNoKTogUmV0dXJuIG5ld2x5IG9wZW5lZCBCRkQsIHJhdGhlciB0aGFuIHVzaW5nIGluYXJjaC4KLQkoZG9fcXVpY2tfYXBwZW5kKTogTWFrZSBhcmNoaXZlX2ZpbGVuYW1lIGNvbnN0LgotCSh3cml0ZV9hcmNoaXZlKTogQWRkIGlhcmNoIGFyZ3VtZW50LCBhbmQgdXNlIGl0IGluc3RlYWQgb2YgaW5hcmNoLgotCUNoYW5nZSBhbGwgY2FsbGVycy4KLQkoZGVsZXRlX21lbWJlcnMsIG1vdmVfbWVtYmVycywgcmVwbGFjZV9tZW1iZXJzKTogTGlrZXdpc2UuCi0JKHJhbmxpYl9vbmx5KTogRG9uJ3QgZXhpdCBvbiBzdWNjZXNzLiAgQ2F0Y2ggYW5kIHVzZSBvcGVuX2luYXJjaAotCXJldHVybiB2YWx1ZS4KLQkocmFubGliX3RvdWNoKTogTmV3IGZ1bmN0aW9uLgotCSogYXJzdXAuaCAobWFwX292ZXJfbWVtYmVycyk6IERvbid0IGRlY2xhcmUuCi0JKGFyX2VuZCwgYXJfZXh0cmFjdCk6IERlY2xhcmUuCi0JKG9wZW5faW5hcmNoKTogQ2hhbmdlIHJldHVybiB2YWx1ZSBpbiBkZWNsYXJhdGlvbiB0byBiZmQgKi4KLQkqIGFyc3VwLmMgKG1hcF9vdmVyX2xpc3QpOiBNYWtlIHN0YXRpYy4gQWx3YXlzIHBhc3MgdHdvIGFyZ3VtZW50cwotCXRvIGZ1bmN0aW9uLiAgQWRkIGFyY2ggYXJndW1lbnQsIGFuZCB1c2UgaXQgaW5zdGVhZCBvZiBpbmFyY2guCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShhcl9kaXJlY3RvcnlfZG9lcik6IE1ha2Ugc3RhdGljLiAgQWRkIGlnbm9yZWQgc2Vjb25kIGFyZ3VtZW50LgotCUNoYW5nZSBhbGwgY2FsbGVycy4KLQkoYXJfZGlyZWN0b3J5KTogVXNlIG9wZW5faW5hcmNoIHJldHVybiB2YWx1ZSByYXRoZXIgdGhhbiBpbmFyY2guCi0JKGFyX2FkZGxpYl9kb2VyKTogTWFrZSBzdGF0aWMuCi0JKGFyX2FkZGxpYik6IFVzZSBvcGVuX2luYXJjaCByZXR1cm4gdmFsdWUgcmF0aGVyIHRoYW4gaW5hcmNoLgotCShhcl9leHRyYWN0KTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBhYmZkLgotCi1UaHUgQXVnIDExIDE0OjU1OjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCUFkZCBzdXBwb3J0IGZvciByZW1vdmluZyBuYW1lZCBzZWN0aW9ucyB0byBvYmpjb3B5IGFuZCBzdHJpcC4KLQkqIG9iamNvcHkuYyAoc3RydWN0IHNlY3Rpb25fbGlzdCk6IERlZmluZS4KLQkocmVtb3ZlX3NlY3Rpb25zKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc3RyaXBfb3B0aW9ucywgY29weV9vcHRpb25zKTogQWRkIHJlbW92ZS1zZWN0aW9uLgotCShjb3B5X3VzYWdlLCBzdHJpcF91c2FnZSk6IE1lbnRpb24gLVIgYW5kIC0tcmVtb3ZlLXNlY3Rpb24uCi0JKHNldHVwX3NlY3Rpb24pOiBJZiBzZWN0aW9uIGlzIGluIHJlbW92ZV9zZWN0aW9ucyBsaXN0LCBpZ25vcmUgaXQuCi0JKGNvcHlfc2VjdGlvbik6IExpa2V3aXNlLgotCShzdHJpcF9tYWluLCBjb3B5X21haW4pOiBIYW5kbGUgLVIuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjEsIHN0cmlwLjE6IERvY3VtZW50IG5ldyBvcHRpb25zLgotCi1XZWQgQXVnIDEwIDEwOjE5OjU1IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChwb3dlcnBjX21hbmdsZV9yZWxvY3MpOiBSZW5hbWUgc3ltdmFsdWUgdG8gc3ltX3ZhbHVlLAotCXNvIGFzIG5vdCB0byBjb25mbGljdCB3aXRoIHRoZSBzeW12YWx1ZSB0eXBlZGVmIGluIGJmZC5oLgotCi1Nb24gQXVnICAxIDEzOjE5OjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbmxtaGVhZGVyLnk6IFBlciBjdXJyZW50IE5ldFdhcmUgZG9jcywgYWNjZXB0IGEgcmV2aXNpb24gbnVtYmVyCi0Jb2YgMCBhbmQgdHJlYXQgYSByZXZpc2lvbiBudW1iZXIgZ3JlYXRlciB0aGFuIDI2IGFzIDAuCi0KLU1vbiBKdWwgMjUgMTI6NTg6MzYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IENvcnJlY3QgaGFuZGxpbmcgb2YgZW5kIG9mCi0Jc3ltYm9scyB3aGVuIGxvb2tpbmcgZm9yIG5leHQgc3ltYm9sIHdpdGggYSBkaWZmZXJlbnQgdmFsdWUuCi0KLUZyaSBKdWwgMjIgMTY6NDg6MzQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbm0uYyAobnVtZXJpY19mb3J3YXJkKTogVHJlYXQgdW5kZWZpbmVkIHN5bWJvbHMgYXMgImxlc3MgdGhhbiIKLQlkZWZpbmVkIHN5bWJvbHMgd2l0aCB6ZXJvIHZhbHVlcy4gIElmIG51bWVyaWMgdmFsdWVzIGFyZSBlcXVhbCwgb3IKLQlib3RoIHN5bWJvbHMgYXJlIHVuZGVmaW5lZCwgc29ydCBhbHBoYWJldGljYWxseS4gIERvbid0IGFzc3VtZQotCXRoYXQgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIGJmZF92bWEgdmFsdWVzIHdpbGwgdHJ1bmNhdGUgdG8gImludCIKLQlhbmQgc3RpbGwgaGF2ZSB0aGUgc2FtZSBzaWduLgotCShudW1lcmljX3JldmVyc2UpOiBDYWxsIG51bWVyaWNfZm9yd2FyZCBhbmQgbmVnYXRlIHRoZSByZXN1bHQuCi0JKHByaW50X3N5bWJvbF9pbmZvX2JzZCk6IEZvciB1bmRlZmluZWQgc3ltYm9scywgcHJpbnQgbGVhZGluZwotCXNwYWNlcyBlcXVpdmFsZW50IHRvIHRoZSB3aWR0aCBvZiBhIHByaW50ZWQgYmZkX3ZtYSwgcmF0aGVyIHRoYW4KLQlhc3N1bWluZyB0aGF0IDggd2lsbCBsb29rIHJpZ2h0LgotCi1GcmkgSnVsIDIyIDEwOjM2OjUwIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvZmZncm9rLmMgKGRvaXQpOiAgWmVybyBhbGwgZmllbGRzIG9mIG5ldyBzdHJ1Y3R1cmUuCi0JKiBzcmNvbnYuYyAoc3lzcm9mZl9zd2FwXypfb3V0KTogUmVtb3ZlIHJlZHVuZGFudCB0cmFpbGluZyBhcmcuCi0JKiBzeXNpbmZvLnk6IEdlbmVyYXRlIHN5c3JvZmZfc3dhcF8qX291dCB3aXRob3V0IHJlcXVpcmluZyBleHRyYQotCWFyZy4KLQotRnJpIEp1bCAyMiAxMDowOTo1MyAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIG5sbWhlYWRlci55OiBNYWtlICJzdGFjayIgYW5kICJzdGFja3NpemUiIHN5bm9ueW1zIGluIHRoZSBsZXhlcgotCSAgcmF0aGVyIHRoYW4gdGhlIHBhcnNlci4KLQotVGh1IEp1bCAyMSAxMDoyNTowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1hbHBoYW9zZiwgY29uZmlnL21oLWFwb2xsbzY4diwgY29uZmlnL21oLWRlbHRhODg6Ci0JUmVtb3ZlOyBvYnNvbGV0ZS4KLQotU2F0IEp1bCAxNiAyMjozNDozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoc2x1cnBfZHluYW1pY19zeW10YWIpOiBUcnkgdG8gZ2V0IHRoZSBkeW5hbWljIHN5bWJvbHMKLQlldmVuIGlmIHRoZSBiZmQgaXMgbm90IG1hcmtlZCBEWU5BTUlDLiAgRUxGIGV4ZWN1dGFibGVzIGFyZSBub3QKLQltYXJrZWQgRFlOQU1JQywgYnV0IGRvIGhhdmUgZHluYW1pYyBzeW1ib2xzLgotCi1GcmkgSnVsIDE1IDAxOjQxOjM1IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvZmZncm9rLmMgKGRvX3doZXJlKTogTWFrZSBkYXRhIHdpdGggbm8gdHlwZSAnaW50Jy4KLQkoZG9fZGVmaW5lKTogIEtlZXAgaW5mbyBvbiBzb3VyY2UgZmlsZSBvZiBhIHN5bWJvbC4KLQkqIGNvZmZncm9rLmggKGNvZmZfc3ltYm9sKTogTmV3IGZpZWxkLgotCSogc3Jjb252LmMgKFBST0dSQU1fVkVSU0lPTik6IE5vdyAxLjMKLQkod3JfcmwpOiBVc2UgZXh0ZXJuYWwgcmVmIG51bWJlciBmb3Igc3ltYm9sLgotCSh3cl9kdXMpOiBPbmx5IGtlZXAgb25lIHNvdXJjZSBmaWxlIHBlciBkZWJ1ZyB1bml0LgotCSh3cl9kbG4pOiBBbHdheXMgZW1pdCBsaW5lIG51bWJlcnMgZm9yIGZpcnN0IHNvdXJjZSBmaWxlLAotCSh3cl9nbG9iYWxzKTogIEVtaXQgZ2xvYmFscyBpbiB0aGUgZHUgb2YgdGhlaXIgb3duaW5nIHNvdXJjZSBmaWxlLgotCi1Nb24gSnVsIDExIDE1OjU5OjAzIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogbmxtaGVhZGVyLnk6IE51bGwgdGVybWluYXRlIHZhcl9oZHItPnRocmVhZE5hbWUuCi0KLUZyaSBKdWwgIDggMTc6MzM6MjIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHN5c2xleC5vLCBzeXNpbmZvLm8pOiBQZXJtaXQgQyBzb3VyY2UgZmlsZXMgdG8gYmUKLQlpbiAkKHNyY2RpciksIGFzIHRoZXkgd2lsbCBiZSBmb3IgRlNGIHJlbGVhc2VzLgotCi1XZWQgSnVsICA2IDAxOjEzOjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChzZXR1cF9zZWN0aW9ucyk6IFByZXNlcnZlIGV4aXN0aW5nIHNlY3Rpb24gZmxhZ3Mgd2hlbgotCWNvcHlpbmcgaW4gZmxhZ3MgZnJvbSBhIG5ldyBzZWN0aW9uLgotCi1UdWUgSnVsICA1IDE1OjU2OjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShjb3B5X2ZpbGUpOiBJZiBvdXRwdXRfdGFyZ2V0IGlzIE5VTEwsIHNldCBpdCB0byB0aGUgdGFyZ2V0IG9mIHRoZQotCWlucHV0IGZpbGUuCi0KLVdlZCBKdW4gMjkgMTc6MTc6MTQgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKGxpbmtfaW5wdXRzKTogRml4ZWQgbWVtb3J5IGFsbG9jYXRpb24gYnVnLgotCi1UaHUgSnVuIDIzIDEyOjUyOjQ2IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgLS13aXRoLXRhcmdldHMgdG8gLS1lbmFibGUtdGFyZ2V0cy4KLQotVHVlIEp1biAyMSAxMjo1MzoyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzeXNpbmZvKTogRG9lcyBub3QgZGVwZW5kIHVwb24gJChBRERMX0xJQlMpLgotCi0JKiBubG1jb252LmMgKHBvd2VycGNfYnVpbGRfc3R1YnMpOiBEb24ndCBnZW5lcmF0ZSB0aGUgUG93ZXJQQwotCU5ldFdhcmUgY3VzdG9tIGhlYWRlcjsgbm8gbG9uZ2VyIG5lZWRlZC4KLQkocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogQ29udmVydCByZWxvY3MgYWdhaW5zdCB0aGUgdW5pbml0aWFsaXplZAotCWRhdGEgc2VjdGlvbiBpbnRvIHJlbG9jcyBhZ2FpbnN0IHRoZSBkYXRhIHNlY3Rpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IG5sbWNvbnZfZGVmcyB0byAtRE5MTUNPTlZfY3B1dHlwZSBmb3IgYWxsIHRoZQotCW5ldHdhcmUgdGFyZ2V0cy4gIFdyaXRlIGl0IGludG8gTWFrZWZpbGUgYXMgTkxNQ09OVl9ERUZTLgotCSogTWFrZWZpbGUuaW4gKG5sbWNvbnYubyk6IFBhc3MgJChOTE1DT05WX0RFRlMpIHRvICQoQ0MpLgotCSogbmxtY29udi5jOiBPbmx5IGNvbXBpbGUgY29kZSBmb3Igc3BlY2lmaWMgQ1BVIHR5cGVzIGlmCi0JTkxNQ09OVl9jcHV0eXBlIGlzIGRlZmluZWQuCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IENoYW5nZSB1c2VzIG9mIGJmZF9hYnNfc2VjdGlvbiwgZXRjLiwgdG8gdXNlCi0JYmZkX2Fic19zZWN0aW9uX3B0ciBvciBiZmRfaXNfYWJzX3NlY3Rpb24sIGV0Yy4KLQkoaTM4Nl9tYW5nbGVfcmVsb2NzLCBhbHBoYV9tYW5nbGVfcmVsb2NzKTogTGlrZXdpc2UuCi0JKHBvd2VycGNfYnVpbGRfc3R1YnMpOiBMaWtld2lzZS4KLQkqIG5tLmMgKGZpbHRlcl9zeW1ib2xzLCBwcmludF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKHJlbW92ZV91c2VsZXNzX3N5bWJvbHMsIGR1bXBfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBzaXplLmMgKHN5c3ZfaW50ZXJuYWxfcHJpbnRlcik6IExpa2V3aXNlLgotCi1Nb24gSnVuIDIwIDE2OjQzOjAzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNQU5QQUdFUyk6IFJlbW92ZSAkKERFTUFOR0xFUl9QUk9HKS4KLQkoaW5zdGFsbCk6IEluc3RhbGwgaXQgZXhwbGljaXRseSwgZnJvbSBidWlsZCBkaXIsIG5vdCBzcmNkaXIuCi0KLU1vbiBKdW4gMjAgMTY6Mjk6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmM6IERvbid0IGluY2x1ZGUgZWxmL2ludGVybmFsLmguCi0JKGJmZF9lbGZfZmluZF9zZWN0aW9uKTogRG9uJ3QgZGVjbGFyZS4KLQkocmVhZF9zZWN0aW9uX3N0YWJzKTogTm8gc3BlY2lhbCBoYW5kbGluZyBmb3IgRUxGLiAgQWx3YXlzIHJlYWQKLQl1c2luZyBCRkQgc2VjdGlvbnMuCi0KLVRodSBKdW4gMTYgMTc6MjU6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFNldCBVTkRFUlNDT1JFIGluIE1ha2VmaWxlIGJhc2VkIG9uIHJlc3VsdCBvZgotCWludm9raW5nIGNvbmZpZy5iZmQgd2l0aCBhIHNlY29uZCBhcmd1bWVudCBvZiBgYF8nJy4KLQkqIE1ha2VmaWxlLmluICh1bmRlcnNjb3JlLmMpOiBEZXBlbmQgdXBvbiBNYWtlZmlsZS4gIERvbid0IHRyeSB0bwotCXJ1biAkKENDKSBhbmQgJChOTSksIGp1c3QgdXNlICQoVU5ERVJTQ09SRSkuICBDcmVhdGUgdmlhIHRlbXBvcmFyeQotCWZpbGUuCi0JKGRlbWFuZ2xlLm8pOiBSZW1vdmUgdGFyZ2V0LgotCSgkKE5NX1BST0cpKTogRG9uJ3QgZGVwZW5kIHVwb24gZGVtYW5nbGUubywgYW5kCWRvbid0IGxpbmsgYWdhaW5zdAotCWRlbWFuZ2xlLm8uICBJdCdzIGluIGxpYmliZXJ0eSBhbnlob3cuCi0JKGNwbHVzLWRlbS5vKTogRG9uJ3QgZGVwZW5kIHVwb24gZGVtYW5nbGUuby4KLQkqIGJpbnV0aWxzLnRleGk6IE1lbnRpb24gLW4gYW5kIC0tbm8tc3RyaXAtdW5kZXJzY29yZXMgYXJndW1lbnRzCi0JdG8gYysrZmlsdC4KLQotV2VkIEp1biAxNSAxMjoxMDozMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5tLmMgKGxvbmdfb3B0aW9ucyk6IEFkZCAtLW5vLWRlbWFuZ2xlIHRvIHR1cm4gb2ZmIC0tZGVtYW5nbGUsCi0JYW5kIC0tbm8tY3BsdXMgZm9yIExpbnV4IGNvbXBhdGliaWxpdHkuCi0JKHVzYWdlKTogTWVudGlvbiAtLW5vLWRlbWFuZ2xlLgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgLS1uby1kZW1hbmdsZS4KLQotRnJpIEp1biAxMCAxNTo0MToyNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5tLmM6IEhPU1RfNjRfQklUIHdhcyByZW5hbWVkIHRvIEJGRF9IT1NUXzY0X0JJVC4KLQotCSogb2JqY29weS5jIChjb3B5X2FyY2hpdmUpOiBNYWtlIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIHRoZQotCXNhbWUgZGlyZWN0b3J5IGFzIHRoZSBvdXRwdXQgQkZELCBzaW5jZSB3ZSBtYXkgbm90IGhhdmUgd3JpdGUKLQlwZXJtaXNzaW9uIG9uIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIFNldCB0aGUgcGVybWlzc2lvbnMgb2YgdGhlCi0JbmV3IGRpcmVjdG9yeSB0byAwNzAwLCBub3QgMDc3Ny4KLQotTW9uIEp1biAgNiAyMTozNjo0MyAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogaWYgdGhpcyBpcyBhbiByczYwMDAgKGFuZCB3ZSdyZSBub3QgYnVpbGRpbmcgZm9yCi0JYW55IG90aGVyIGJmZCB0YXJnZXRzKSB0aGVuIGJ1aWxkIG9ubHkgbm0gKGNvbGxlY3QgbmVlZHMgaXQgb24KLQlyczYwMDAtbHlueCkuCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmUgVE9PTF9QUk9HUyB3aGljaCB0aGUgbGlzdCBvZiBwcm9ncmFtZXMgdG8KLQlpbnN0YWxsIGluICR0b29sZGlyIC0tIHJlcGxhY2VzIGEgaGFyZC1jb2RlZCBsaXN0LgotCi1GcmkgSnVuICAzIDEwOjU5OjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNwbGF5X3RhcmdldF9saXN0KTogUmVtb3ZlIHVudXNlZCBsb2NhbCBvay4KLQotVGh1IE1heSAyNiAxODowNTo1MiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtYWxwaGFvc2YgKENGTEFHUyk6IERvbid0IHNwZWNpZnkgYm90aCAtZyBhbmQgLU87Ci0JdGhleSdyZSBub3QgY29tcGF0aWJsZSB1bmRlciBuYXRpdmUgY2MuICBVc2UgLU8xIGluc3RlYWQuCi0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlZCB0byBjeWdudXMtMi40LjEuCi0KLQlDaGFuZ2VzIGZyb20gYmludXRpbHMtMi40IG5ldCByZWxlYXNlOgotCi0JKiBNYWtlZmlsZS5pbiAoTUFOUEFHRVMpOiBVc2UgJChERU1BTkdMRVJfUFJPRykuCi0JKCQoREVNQU5HTEVSX1BST0cpLjEpOiBCdWlsZCBmcm9tIGN4eGZpbHQubWFuLCB1c2luZyBzZWQuCi0JKiBjeHhmaWx0Lm1hbjogUmVuYW1lZCBmcm9tIGMrK2ZpbHQuMSwgcmVwbGFjZWQgImMrK2ZpbHQiIHdpdGgKLQltYWdpYyB0b2tlbiB0byBiZSByZXBsYWNlZCBieSBzZWQuCi0KLQlXZWQgTWF5IDExIDIyOjMyOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotCSogY29uZmlndXJlLmJhdDogdXBkYXRlIGZvciBsYXRlc3QgbWFrZWZpbGUuaW4KLQotRnJpIE1heSAxMyAyMzoyNToxMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJ1Y29tbS5jOiBDaGVjayBBTlNJX1BST1RPVFlQRVMgcmF0aGVyIHRoYW4gX19TVERDX18uCi0KLVR1ZSBNYXkgMTAgMTg6MjI6MDYgMTk5NCAgSmFzb24gTW9sZW5kYSAgICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoY29weV9zZWN0aW9uKTogU2V0IHNlY3Rpb24gc2l6ZSBjb3JyZWN0bHkgaWYgdXNpbmcKLQlpbnRlcmxlYXZlLgotCi1TYXQgTWF5ICA3IDE2OjQ5OjM2IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgcnVsZSBmb3Igc3lzaW5mby5oCi0KLUZyaSBNYXkgIDYgMTI6MTg6MzMgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFNSQ09OVl9QUk9HKTogRGVmaW5lLgotCShQUk9HUyk6IFVzZSAkKFNSQ09OVl9QUk9HKSB0b28uCi0KLVRodSBNYXkgIDUgMTk6NDE6NDMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IEFkZCBzeXNpbmZvLmMsIHN5c2xleC5jLCBpbiBjYXNlCi0Jc29tZW9uZSBjb25maWd1cmVzIHdpdGggYHRhcmdldHM9YWxsJy4KLQkoZGlzdGNsZWFuKTogUmVtb3ZlIHkuKi4KLQkoc3lzbGV4Lm8pOiBEZXBlbmQgb24gc3lzaW5mby5oLgotCShzeXNpbmZvLmMpOiBSZW5hbWUgeS50YWIuaCB0byBzeXNpbmZvLmguCi0JKGluc3RhbGwtaW5mbyk6IERvbid0IHRyeSB0byBpbnN0YWxsIGludG8gJChpbmZvZGlyKS8kKHNyY2RpcikuCi0JKiBzeXNsZXgubDogSW5jbHVkZSBzeXNpbmZvLmgsIG5vdCB5LnRhYi5oLgotCi1UaHUgTWF5ICA1IDExOjUwOjU1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBzeXNsZXgubCAoeXl3cmFwKTogRGVmaW5lIGFzIGZ1bmN0aW9uIGlmIG5vdCBkZWZpbmVkIGFzIGEgbWFjcm8uCi0KLQkqIE1ha2VmaWxlLmluIChvYmpkdW1wLm8pOiBEZWxldGVkIHNwZWNpYWwgcnVsZS4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYm90aGVyIGJ1aWxkaW5nIEFSQ0hERUZTIHZhcmlhYmxlIGZvcgotCU1ha2VmaWxlLgotCSogb2JqZHVtcC5jIChBUkNIXyopOiBEZWxldGVkIGhhbmRsaW5nLgotCShkaXNhc3NlbWJsZV9kYXRhKTogQ2FsbCBgZGlzYXNzZW1ibGVyJyBmcm9tIG9wY29kZXMgbGlicmFyeS4KLQotVGh1IE1heSAgNSAxMzoyODo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogQ29ycmVjdCBoYW5kbGluZyBvZiAkKHRvb2xkaXIpIGFuZAotCSQoYmluZGlyKSBiZWluZyBvbiBkaWZmZXJlbnQgZGV2aWNlcy4KLQotRnJpIEFwciAyOSAwOTo1MDozOCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBzeXNkdW1wLmMgKGg4MzAwLCBzaCk6IEFkZCBkZWNsYXJhdGlvbnMuCi0KLVdlZCBBcHIgMjcgMTE6MjU6MTggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHN5c2xleCwgc3lzaW5mbyk6IFVzZSBDQ19GT1JfQlVJTEQuCi0JKiBjb2ZmZHVtcC5jLCBjb2ZmZ3JvYy5jLCBjb2ZmZ3JvZy5oLCBzcmNvbnYuYywgc3lzZHVtcC5jLAotCXN5c3JvZmYuaW5mbzogTWFqb3IgY2hhbmdlcy4KLQotVHVlIEFwciAyNiAxODoxODoyNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAocHJpbnRfc2VjdGlvbl9zdGFicyk6IEluZGljYXRlIHRoZSBzdGFiIGhlYWRlciBzeW1ib2wKLQltb3JlIGNsZWFybHksIHByaW50IG51bWJlcnMgb2YgdW5yZWNvZ25pemVkIHN0YWIgbl90eXBlIHZhbHVlcy4KLQotVHVlIEFwciAyNiAxNjoyMjo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAoY29weV9zZWN0aW9ucyk6IENvcHkgYXJlbGVudCBwb2ludGVycywgbm90IGFyZWxlbnRzLgotCi1Nb24gQXByIDI1IDE2OjE0OjMyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSAkKFBST0dTKSBhbmQgdW5kZXJzY29yZS5jLgotCi1GcmkgQXByIDIyIDExOjE0OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChzZXR1cF9zZWN0aW9ucyk6IFJlbW92ZSBzcGVjaWFsIGhhbmRsaW5nIG9mIC5yZWdpbmZvCi0Jc2VjdGlvbi4KLQkoY29weV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCShhbHBoYV9tYW5nbGVfcmVsb2NzKTogVXNlIGJmZF9lY29mZl9nZXRfZ3BfdmFsdWUgcmF0aGVyIHRoYW4gdGhlCi0Jc3BlY2lhbCBFQ09GRiAucmVnaW5mbyBzZWN0aW9uLgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogQ2FsbCBiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIGFmdGVyCi0JY29weWluZyBldmVyeXRoaW5nIGVsc2UsIHRvIGxldCBpdCBmaWRkbGUgd2l0aCB0aGUgZmlsZSBpbiBpdHMKLQlmaW5hbCBzdGF0ZS4KLQotCSogb2JqZHVtcC5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShkaXNwbGF5X3RhcmdldF9saXN0KTogSWYgYSBmb3JtYXQgZmFpbHMsIGp1c3QgZ28gb24gdG8gdGhlIG5leHQKLQlvbmUuICBDaGVjayByZXR1cm4gdmFsdWUgb2YgYmZkX3NldF9mb3JtYXQuCi0JKGRpc3BsYXlfaW5mb190YWJsZSk6IExpa2V3aXNlLiAgRG9uJ3QgaW5jcmVtZW50IGxvb3AgdmFyaWFibGUgaW4KLQlmb3IgbG9vcCB0ZXN0LCBzaW5jZSB0aGF0IHNraXBzIHRoZSBmaXJzdCBlbGVtZW50LgotCShkaXNwbGF5X3RhcmdldF90YWJsZXMpOiBSZXdyaXRlIGxvb3AgZm9yIGNsYXJpdHkuICBFbnN1cmUgdGhhdCBpdAotCWFsd2F5cyBwcmludHMgYXQgbGVhc3Qgb25lIGVsZW1lbnQuCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IFVzZSBDeUduVXNFeCByYXRoZXIgdGhhbiBDeUduVXNTZUNzIGZvcgotCXNlY3Rpb25zIGhlYWRlci4gIFJlbmFtZSBmcm9tIGN5Z251c19zZWN0aW9ucyB0byBjeWdudXNfZXh0LgotCi1UaHUgQXByIDIxIDEyOjEyOjI2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChfRFVNTVlfTkFNRV8pOiBEb24ndCBkZWZpbmUuCi0JKGRpc3BsYXlfdGFyZ2V0X2xpc3QpOiBVc2UgdG1wbmFtIHRvIGdldCBhIGZpbGUgbmFtZSByYXRoZXIgdGhhbgotCXVzaW5nIF9EVU1NWV9OQU1FXy4gIFVubGluayBpdCB3aGVuIGRvbmUuCi0JKGRpc3BsYXlfaW5mb190YWJsZSk6IExpa2V3aXNlLgotCi0JKiBubG1jb252LmMgKHNlY3NlYyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1haW4pOiBDcmVhdGUgLm5sbXNlY3Rpb25zIHNlY3Rpb24gaW4gb3V0cHV0IEJGRC4gIFN0b3JlCi0JaW5mb3JtYXRpb24gYWJvdXQgaXQgaW4gc2VjdGlvbnMgaGVhZGVyLgotCShzZXR1cF9zZWN0aW9ucyk6IEFsbG9jYXRlIHNwYWNlIGluIHNlY3Rpb25zIGhlYWRlci4KLQkoY29weV9zZWN0aW9ucyk6IENvcHkgemVybyBzaXplZCBzZWN0aW9ucy4gIFB1dCBpbmZvcm1hdGlvbiBhYm91dAotCWVhY2ggc2VjdGlvbiBpbiB0aGUgc2VjdGlvbnMgaGVhZGVyLgotCi1XZWQgQXByIDIwIDE0OjM0OjUxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChwb3dlcnBjX2J1aWxkX3N0dWJzKTogVGFrZSBuZXcgb3V0YmZkIGFyZ3VtZW50LgotCUNoYW5nZSBjYWxsZXIuICBDcmVhdGUgY3VzdG9tIGhlYWRlciBmb3IgbmV3IFBvd2VyUEMgTmV0V2FyZQotCWZvcm1hdC4KLQotCSogTWFrZWZpbGUuaW4gKG5sbWhlYWRlci5vLCBubG1jb252Lm8pOiBVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogbmxtY29udi5jOiBJbmNsdWRlIGJmZC5oIGFuZCBsaWJpYmVydHkuaCB3aXRoICIiLCBub3QgPD4uCi0JKiBubG1oZWFkZXIueTogSW5jbHVkZSBiZmQuaCB3aXRoICIiLCBub3QgPD4uCi0KLVdlZCBBcHIgMTMgMTA6NTI6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmM6IERvIGFuIGlmZGVmIG9uIF9fR08zMl9fLCBub3QgdW5peC4KLQotV2VkIEFwciAgNiAyMTo1NDo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGRlZCAtRCAoLS1keW5hbWljKSBvcHRpb24gdG8gbm0gYW5kIC1UICgtLWR5bmFtaWMtc3ltcykgYW5kIC1SCi0JKC0tZHluYW1pYy1yZWxvYykgYXJndW1lbnRzIHRvIG9iamR1bXAuCi0JKiBubS5jIChkeW5hbWljKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobG9uZ19vcHRpb25zKTogQWRkZWQgImR5bmFtaWMiLgotCSh1c2FnZSk6IE1lbnRpb24gLUQgYW5kIC0tZHluYW1pYy4KLQkobWFpbik6IEFkZCBEIHRvIGdldG9wdCBzdHJpbmcuICBIYW5kbGUgLUQgYnkgc2V0dGluZyBkeW5hbWljLgotCShkaXNwbGF5X3JlbF9maWxlKTogSWYgZHluYW1pYyBpcyBub24temVybywgcmVhZCBkeW5hbWljIHN5bWJvbHMKLQlyYXRoZXIgdGhhbiBub3JtYWwgc3ltYm9scy4KLQkqIG5tLjE6IFVwZGF0ZWQgZm9yIC1EICgtLWR5bmFtaWMpIG9wdGlvbi4KLQkqIG9iamR1bXAuYyAoZHVtcF9keW5hbWljX3N5bXRhYik6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKGR1bXBfZHluYW1pY19yZWxvY19pbmZvKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkoZHluc3ltcywgZHluc3ltY291bnQpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlcy4KLQkodXNhZ2UpOiBNZW50aW9uIC1SLCAtVCwgLS1keW5hbWljLXN5bXMgYW5kIC0tZHluYW1pYy1yZWxvYy4KLQkobG9uZ19vcHRpb25zKTogQWRkZWQgImR5bmFtaWMtcmVsb2MiIGFuZCAiZHluYW1pYy1zeW1zIi4KLQkoc2x1cnBfc3ltdGFiKTogSWYgbm8gc3ltYm9scywgcmV0dXJuIHJhdGhlciB0aGFuIGV4aXQuCi0JKHNsdXJwX2R5bmFtaWNfc3ltdGFiKTogTmV3IGZ1bmN0aW9uLgotCShkaXNwbGF5X2JmZCk6IEhhbmRsZSBkdW1wX2R5bmFtaWNfc3ltdGFiIGFuZAotCWR1bXBfZHluYW1pY19yZWxvY19pbmZvLgotCShkdW1wX3N5bWJvbHMpOiBUYWtlIG5ldyBkeW5hbWljIGFyZ3VtZW50LCBpbmRpY2F0aW5nIHdoZXRoZXIgdG8KLQlkaXNwbGF5IGR5bmFtaWMgc3ltYm9scy4KLQkoZHVtcF9yZWxvY3MpOiBNb3ZlIG1vc3QgcHJpbnRpbmcgaW50byBkdW1wX3JlbG9jX3NldC4KLQkoZHVtcF9keW5hbWljX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkoZHVtcF9yZWxvY19zZXQpOiBOZXcgZnVuY3Rpb24sIGV4dHJhY3RlZCBmcm9tIGR1bXBfcmVsb2NzLgotCShtYWluKTogQWRkIFIgYW5kIFQgdG8gZ2V0b3B0IHN0cmluZy4gIEhhbmRsZSAtVCBieSBzZXR0aW5nCi0JZHVtcF9keW5hbWljX3N5bXRhYiBhbmQgLVIgYnkgc2V0dGluZyBkdW1wX2R5bmFtaWNfcmVsb2NfaW5mby4KLQkqIG9iamR1bXAuMTogVXBkYXRlZCBmb3IgLVIgKC0tZHluYW1pYy1yZWxvYykgYW5kIC1UCi0JKC0tZHluYW1pYy1zeW1zKSBvcHRpb25zLgotCSogYmludXRpbHMudGV4aTogVXBkYXRlZCBmb3IgbmV3IG5tIGFuZCBvYmpkdW1wIG9wdGlvbnMuCi0KLVdlZCBNYXIgMzAgMTU6NTI6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JVXBkYXRlIGZvciByZWNlbnQgQkZEIGNoYW5nZXMgdG8gc3ltYm9sIGFuZCByZWxvYyByZWFkaW5nLiAgUmVuYW1lCi0JYWxsIHVzZXMgb2YgZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCB0byBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZC4KLQlBbHNvOgotCSogY29mZmdyb2suYyAoc3ltY291bnQpOiBDaGFuZ2UgdG8gbG9uZy4KLQkoZG9fc2VjdGlvbnNfcDEpOiBDaGVjayBmb3IgZXJyb3IgcmV0dXJuIGZyb20KLQliZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLiAgQ2hhbmdlIHJlbGNvdW50IHRvIGxvbmcsIGFuZCBjaGVjayBmb3IKLQllcnJvciBmcm9tIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKGNvZmZfZ3Jvayk6IENoYW5nZSBzdG9yYWdlIHRvIGxvbmcuICBDaGVjayBmb3IgZXJyb3IgZnJvbQotCWJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZCBiZmRfY2Fub25pY2FsaXplX3N5bXRhYi4KLQkqIG5sbWNvbnYuYyAobWFpbik6IENoYW5nZSBzeW1jb3VudCwgbmV3c3ltYWxsb2MsIG5ld3N5bWNvdW50LCBhbmQKLQlpIHRvIGxvbmcuICBDaGVjayBmb3IgZXJyb3IgZnJvbSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQKLQliZmRfY2Fub25pY2FsaXplX3N5bXRhYi4KLQkoY29weV9zZWN0aW9ucyk6IENoYW5nZSByZWxvY19zaXplIGFuZCByZWxvY19jb3VudCB0byBsb25nLiAgQ2hlY2sKLQlmb3IgZXJyb3IgZnJvbSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKG1hbmdsZV9yZWxvY3MsIGkzODZfbWFuZ2xlX3JlbG9jcywgYWxwaGFfbWFuZ2xlX3JlbG9jcyk6IENoYW5nZQotCXJlbG9jX2NvdW50X3B0ciBhcmd1bWVudCB0byBsb25nICouICBNYWtlIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyB0bwotCXZhcmlhYmxlcyBsb2FkZWQgZnJvbSAqcmVsb2NfY291bnRfcHRyLgotCSogbm0uYyAoZGlzcGxheV9yZWxfZmlsZSk6IENoYW5nZSBzdG9yYWdlIGFuZCBzeW1jb3VudCB0byBsb25nLgotCUNoZWNrIGZvciBlcnJvcnMgZnJvbSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQKLQliZmRfY2Fub25pY2FsaXplX3N5bXRhYi4KLQkqIG9iamNvcHkuYyAoZmlsdGVyX3N5bWJvbHMpOiBDaGFuZ2Ugc3ltY291bnQsIHNyY19jb3VudCBhbmQKLQlkc3RfY291bnQgdG8gbG9uZy4KLQkoY29weV9vYmplY3QpOiBDaGFuZ2Ugc3ltY291bnQgdG8gbG9uZy4gIFBhc3MgYW5vdGhlciBhcmd1bWVudCB0bwotCWZwcmludGYuICBDaGVjayBmb3IgZXJyb3JzIGZyb20gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0JKGNvcHlfc2VjdGlvbik6IENoYW5nZSByZWxjb3VudCB0byBsb25nLiAgQ2hlY2sgZm9yIGVycm9ycyBmcm9tCi0JYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCBhbmQgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQkobWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMpOiBDaGFuZ2UgcmVsY291bnQgYW5kIGkgdG8gbG9uZy4KLQlDaGVjayBmb3IgZXJyb3JzIGZvcm0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCBhbmQKLQliZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCSogb2JqZHVtcC5jIChzdG9yYWdlKTogUmVtb3ZlIGdsb2JhbCB2YXJpYWJsZS4KLQkoc3ltY291bnQpOiBDaGFuZ2VkIHRvIGxvbmcuCi0JKHNsdXJwX3N5bXRhYik6IE5ldyBsb2NhbCB2YXJpYWJsZSBzdG9yYWdlLiAgQ2hlY2sgZm9yIGVycm9ycyBmcm9tCi0JYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgYW5kIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCShyZW1vdmVfdXNlbGVzc19zeW1ib2xzKTogQ2hhbmdlIHJldHVybiB2YWx1ZSBhbmQgY291bnQgdG8gbG9uZy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogQ2hhbmdlIG1pbiwgbWF4LCB0aGlzcGxhY2UgYW5kIGkgdG8gbG9uZy4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IENoYW5nZSBpIHRvIGxvbmcuCi0JKGR1bXBfc3ltYm9scyk6IENoYW5nZSBjb3VudCB0byBsb25nLgotCShkdW1wX3JlbG9jcyk6IENoYW5nZSByZWxjb3VudCB0byBsb25nLiAgQ2hlY2sgZm9yIGVycm9ycyBmcm9tCi0JYmZkX3JldF9yZWxvY191cHBlcl9ib3VuZCBhbmQgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQkoZGlzcGxheV9pbmZvX3RhYmxlKTogQWRkIGNhc3RzIHdoZW4gcGFzc2luZyBMT05HRVNUX0FSQ0ggZm9yCi0JcHJpbnRmICUqIGFyZ3VtZW50LgotCi1UdWUgTWFyIDI5IDE0OjU5OjA0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbm0uYyAoZGlzcGxheV9hcmNoaXZlKTogQ2xvc2UgZWFjaCBhcmNoaXZlIGVsZW1lbnQgYWZ0ZXIgaXQgaGFzCi0JYmVlbiBkaXNwbGF5ZWQuCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfZmlsZSk6IExpa2V3aXNlLgotCi1Nb24gTWFyIDI4IDEzOjA0OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZSB0byByZWZlciB0byBiZmQvY29uZmlnLmJmZAotCXJhdGhlciB0aGFuIGJmZC9jb25maWd1cmUuaW4uCi0KLVN1biBNYXIgMjcgMTY6MjM6MzkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1vcmUgZml4ZXMgZm9yIG9iamVjdCBmb3JtYXRzIHdoaWNoIGFsbG93IG11bHRpcGxlIHNlY3Rpb25zCi0Jd2l0aCB0aGUgc2FtZSBuYW1lOgotCSogb2JqY29weS5jIChzZXR1cF9zZWN0aW9uKTogTWFrZSBhIG5ldyBvdXRwdXQgc2VjdGlvbiBldmVuIGlmCi0Jb25lIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JKGNvcHlfc2VjdGlvbik6IFVzZSBpc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gcmF0aGVyIHRoYW4gdHJ5aW5nCi0JdG8gbG9vayB0aGUgb3V0cHV0IHNlY3Rpb24gdXAgYnkgaXRzIChwb3NzaWJseSBub24tdW5pcXVlKSBuYW1lLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogTG9vayBmb3IgYmludXRpbHMuaW5mbyBpbiB0aGUKLQljdXJyZW50IGRpcmVjdG9yeSwgdGhlbiBpbiAkKHNyY2RpcikuICBEb24ndCB1c2UgJDwuCi0KLU1vbiBNYXIgMjEgMTI6NTU6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IE1ha2Ugc3RhdGljLiAgRGVjbGFyZSB3aXRoCi0JcHJvdG90eXBlLiAgQ2hhbmdlIHZhcmRpZmYgZnJvbSBpbnQgdG8gYmZkX3NpZ25lZF92bWEuICBDb3JyZWN0Ci0JYmluYXJ5IHNlYXJjaCB0ZXJtaW5hdGlvbiBjb25kaXRpb24uICBXaGVuIGxvb2tpbmcgZm9yIHNhbWUKLQlzZWN0aW9uIHN5bWJvbCBpbiByZWxvY2F0YWJsZSBmaWxlLCBoYW5kbGUgZmluYWwgc3ltYm9sIGNvcnJlY3RseS4KLQotU3VuIE1hciAyMCAxMToyNjozNiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUuaW46IEF2b2lkIGJ1ZyBpbiBocHV4IHNlZC4KLQotCSogb2JqY29weS5jOiBDaGFuZ2VzIHRvIGtlZXAgaXQgZnJvbSBzdHJpcHBpbmcgc3ltYm9scyB1c2VkCi0JaW4gb3V0cHV0IHJlbG9jYXRpb25zLgotCShtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyk6IE5ldyBmdW5jdGlvbi4gIE1hcmsgc3ltYm9scwotCXVzZWQgaW4gb3V0cHV0IHJlbG9jYXRpb25zIHdpdGggQlNGX0tFRVAuCi0JKGZpbHRlcl9zeW1ib2xzKTogRG8gbm90IHN0cmlwIHN5bWJvbHMgbWFya2VkIHdpdGggQlNGX0tFRVAuCi0JKGNvcHlfb2JqZWN0KTogUmVvcmRlciBhY3Rpb25zLiAgRmlyc3Qgc2V0dXAgc2VjdGlvbnMsIHRoZW4KLQlidWlsZCB0aGUgb3V0cHV0IHN5bWJvbCB0YWJsZSwgdGhlbiBjb3B5IHRoZSBzZWN0aW9uIGNvbnRlbnRzLgotCi1GcmkgTWFyIDE4IDEwOjUzOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXIuYyAod3JpdGVfYXJjaGl2ZSk6IEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbnVsbCBieXRlLiAgRnJvbQotCVJvYmVydCBMaXBlIDxyb2JlcnRsQGFybmV0LmNvbT4uCi0KLVRodSBNYXIgMTcgMTY6MjA6MjggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQnVpbHQgbm0ubmV3IGFuZCBzdHJpcC5uZXcgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aAotCWNvbGxlY3Qgd2hlbiAuIGlzIGluIFBBVEguCi0JKFNUUklQX1BST0cpOiBDaGFuZ2UgZnJvbSBzdHJpcCB0byBzdHJpcC5uZXcuCi0JKE5NX1BST0cpOiBDaGFuZ2UgZnJvbSBubSB0byBubS5uZXcuCi0JKGluc3RhbGwpOiBSZW1vdmUgdGhlIC5uZXcgd2hlbiBpbnN0YWxsaW5nLgotCi1XZWQgTWFyIDE2IDE2OjI3OjA1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChwb3dlcnBjX2J1aWxkX3N0dWJzKTogU2V0IEJTRl9EWU5BTUlDIGZsYWcgZm9yIGVhY2gKLQlzeW1ib2wgZm9yIHdoaWNoIHdlIGJ1aWxkIGEgc3R1Yi4KLQkocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogT25seSByZXNldCBUT0MgcG9pbnRlciBmb3IgYSBjYWxsIHRvIGEKLQlzeW1ib2wgd2l0aCBCU0ZfRFlOQU1JQyBmbGFnIHNldC4KLQotVHVlIE1hciAxNSAyMzowNDoxMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6IFVzZSBiZmRfaXNfbG9jYWxfbGFiZWwgdG8gZGV0ZXJtaW5lCi0JaWYgYSBzeW1ib2wgcmVwcmVzZW50cyBhIGNvbXBpbGVyLWdlbmVyYXRlZCBsb2NhbCBsYWJlbC4KLQkoY29weV9vYmplY3QpOiBHaXZlIHRoZSBCRkQgYmFja2VuZHMgYSBjaGFuY2UgdG8gY29weSBhbnkgcHJpdmF0ZQotCWJmZCBkYXRhIGZyb20gdGhlIGlucHV0IEJGRCB0byB0aGUgb3V0cHV0IEJGRC4KLQkoc2V0dXBfc2VjdGlvbik6IEdpdmUgdGhlIEJGRCBiYWNrZW5kcyBhIGNoYW5jZSB0byBjb3B5IGFueSBwcml2YXRlCi0Jc2VjdGlvbiBkYXRhIGZyb20gdGhlIGlucHV0IHNlY3Rpb24gdG8gdGhlIG91dHB1dCBzZWN0aW9uLgotCi1Nb24gTWFyIDE0IDExOjE1OjU4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBvYmpjb3B5LmMgKG1hbmdsZV9zZWN0aW9uKTogRGVsZXRlIHVudXNlZCBmdW5jdGlvbi4KLQkoc2V0dXBfc2VjdGlvbik6IFNldCBvc2VjdGlvbiBoZXJlIGluc3RlYWQgb2YgY2FsbGluZwotCW1hbmdsZSBzZWN0aW9uIHRvIGRvIGl0LgotCi1Nb24gTWFyIDE0IDEyOjExOjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXIuYyAod3JpdGVfYXJjaGl2ZSk6IENsb3NlIGluYXJjaCBiZWZvcmUgdW5saW5raW5nIGl0LgotCi1GcmkgTWFyIDExIDIyOjIwOjQ4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChtYWluKTogRm9yIFBvd2VyUEMsIGNhbGwgcG93ZXJwY19idWlsZF9zdHVicyBhbmQKLQlwb3dlcnBjX3Jlc29sdmVfc3R1YnMuICBVc2UgX19HT1QwLCBub3QgX190b2Nfc3RhcnQuICBIYW5kbGUgaXQgaWYKLQl0aGUgc3RhcnQgYW5kIGVuZCBzeW1ib2xzIGFyZSBub3QgaW4gdGhlIHRleHQgc2VjdGlvbi4KLQkoc3RydWN0IHBvd2VycGNfc3R1Yik6IE5ldyBzdHJ1Y3QgZGVmaW5pdGlvbi4KLQkocG93ZXJwY19zdHVicywgcG93ZXJwY19zdHViX2luc25zKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKHBvd2VycGNfaW5pdGlhbF9nb3Rfc2l6ZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHBvd2VycGNfYnVpbGRfc3R1YnMpOiBOZXcgZnVuY3Rpb24uCi0JKHBvd2VycGNfcmVzb2x2ZV9zdHVicyk6IE5ldyBmdW5jdGlvbi4KLQkocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogQ2xlYXIgZXh0cmFuZW91cyBkYXRhIGluIC5nb3Qgc2VjdGlvbi4KLQlSZWFycmFuZ2UgcmVsb2MgaGFuZGxpbmcgdG8gaGFuZGxlIEVMRiByZWxvY3MgdGhhdCBhcmUgbm90Ci0JcGFydGlhbF9pbnBsYWNlLiAgUmVzb2x2ZSBQQyByZWxhdGl2ZSByZWxvY3MuCi0KLVdlZCBNYXIgIDkgMTM6NDg6MTEgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogYXIuYyAobW92ZV9tZW1iZXJzKTogRml4IGl0IHNvIHRoYXQgdGhlIGFiaSBwb3NpdGlvbmFsIG1vZGlmaWVycwotCWRvbid0IGRlbGV0ZSBhbGwgYXJjaGl2ZSBtZW1iZXJzIGZvbGxvd2luZyB0aGUgaW5zZXJ0IHBvaW50LgotCi1UdWUgTWFyICA4IDEzOjE0OjQzIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvZmZncm9rLltjaF06IE5ldyBmaWxlcywgdW5kZXJzdGFuZCBjb2ZmIG9iamVjdHMuCi0JKiBjb2ZmZHVtcC5jOiBVc2VzIGNvZmZncm9rIHRvIGR1bXAgb3V0IHRoZSBkZWJ1ZyBpbmZvIG9mIGEgY29mZgotCWZpbGUuCi0JKiBzeXNyb2ZmLmluZm86IERlc2NyaXB0aW9uIG9mIGEgU1lTUk9GRiBvYmplY3QgZmlsZS4KLQkqIHN5c2luZm8ueSwgc3lzbGV4Lmw6IFBhcnNlIGluZm8gZmlsZSwgZ2VuZXJhdGUgYSByZWFkZXIsIHdyaXRlciwKLQloZWFkZXIgZmlsZXMgYW5kIGEgcHJpbnRlci4KLQkqIHNyY29udi5jOiBVc2VzIGNvZmZncm9rLmMgYW5kIHN5c3JvZmYuaW5mbyB0byBjb252ZXJ0IGEgY29mZgotCWZpbGUgdG8gYSBTWVNST0ZGIGZpbGUuCi0KLVNhdCBGZWIgMjYgMTM6MzU6MjYgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBhci5jIChkb19xdWlja19hcHBlbmQpOiBQYWQgd2l0aCBhIGdlbnVpbmUgY2hhcmFjdGVyIDEwLAotCXJhdGhlciB0aGFuIHdoYXRldmVyICdcbicgbWlnaHQgaGFwcGVuIHRvIGJlLgotCi1UdWUgRmViIDIyIDE4OjI1OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChtYWluKTogSWdub3JlIGRlYnVnZ2luZyBzeW1ib2xzIHdoZW4gbG9va2luZyBmb3IKLQlzcGVjaWFsIHN5bWJvbHMgYnkgbmFtZS4KLQotU3VuIEZlYiAyMCAxODo0Nzo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCi0JU3VwcG9ydCBmb3IgUG93ZXJQQyBOZXRXYXJlLgotCSogbmxtY29udi5jIChtYWluKTogRm9yIFBvd2VyUEMgTmV0V2FyZSwgYXV0b21hdGljYWxseSBkZWZpbmUgdGhlCi0Jc3BlY2lhbCBzeW1ib2xzIF9fdG9jX3N0YXJ0LgotCShzZWxlY3Rfb3V0cHV0X2Zvcm1hdCk6IEhhbmRsZSBiZmRfYXJjaF9wb3dlcnBjLgotCShtYW5nbGVfcmVsb2NzKTogTGlrZXdpc2UuCi0JKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQotVGh1IEZlYiAxNyAwOToyODoyMyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFyLmMsIGJ1Y29tbS5jLCBubG1jb252LmMsIG5tLmMsIG9iamNvcHkuYywgb2JqZHVtcC5jLAotCXNpemUuYzogVXNlIGJmZF9nZXRfZXJyb3IgYW5kIGJmZF9zZXRfZXJyb3IgYW5kIG5ldyBlcnJvciBuYW1lcy4KLQotRnJpIEZlYiAxMSAxNTo1NDo1MSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoc3RyaXBfbWFpbiwgY29weV9tYWluKTogQWRkIG1pc3NpbmcgJ2JyZWFrJyBpbiBzd2l0Y2guCi0KLU1vbiBGZWIgIDcgMTk6NDU6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBIYW5kbGUgYmZkX2FyY2hfcG93ZXJwYy4KLQotU3VuIEZlYiAgNiAyMjowODoyMCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHN0cmluZ3MuYyBvYmpkdW1wLmMgbmxtY29udi5jIG9iamNvcHkuYyBubS5jIGFyLmMgc2l6ZS5jIChtYWluKToKLQlDYWxsIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZS4KLQotRnJpIEZlYiAgNCAxMDo0NjowMSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoZmlsdGVyX2J5dGVzKTogTWFrZSBNRU1IVU5LIGEgY2hhciAqLCBub3QgUFRSLCBzbyB3ZQotCWNhbiBkbyBhcml0aG1ldGljIG9uIGl0LgotCi1UaHUgRmViICAzIDE0OjA2OjQxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25fc3RhYnMsIHJlYWRfc2VjdGlvbl9zdGFicywKLQlwcmludF9zZWN0aW9uX3N0YWJzKTogRnVuY3Rpb25zIGJyb2tlbiBvdXQgb2YgZHVtcF9zdGFic18xLgotCUZyZWUgdGhlIHN0YWJzIGFuZCBzdHJpbmdzIHdoZW4gZG9uZSB3aXRoIHRoZW0uCi0KLVdlZCBGZWIgIDIgMTM6NDI6MjMgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKG1haW4pOiBVc2UgYmZkX2dldF9mbGF2b3VyIGluc3RlYWQgb2Ygc3RydWN0IG1lbWJlci4KLQkqIGFyLmMgKHByaW50X2NvbnRlbnRzLCBleHRyYWN0X2ZpbGUpLCBzaXplLmMKLQkocHJpbnRfYmVya2VsZXlfZm9ybWF0LCBwcmludF9zeXN2X2Zvcm1hdCk6IFVzZSBiZmRfZ2V0X2ZpbGVuYW1lIGFuZAotCWJmZF9teV9hcmNoaXZlIGluc3RlYWQgb2YgZGVyZWZlcmVuY2luZyB0aGUgc3RydWN0cyBkaXJlY3RseS4KLQotCSogYXIuYzogVXNlIGJmZF9mYXRhbCBhbmQgYmZkX25vbmZhdGFsIGluc3RlYWQgb2YgYmZkX3BlcnJvciBhbmQgZXhpdC4KLQlJbmRlbnQuICBSZW1vdmUgREVGVU5zLgotCi0JKiBubG1jb252LmMgKG1haW4pLCBvYmpjb3B5LmMgKGNvcHlfZmlsZSk6IFByaW50IG1hdGNoaW5nIGZvcm1hdHMKLQlpZiBhbWJpZ3VvdXMgbWF0Y2guCi0JKiBubS5jIChkaXNwbGF5X2ZpbGUsIGRpc3BsYXlfYXJjaGl2ZSksIHNpemUuYyAoZGlzcGxheV9iZmQpOgotCUVsaW1pbmF0ZSBnb3Rvcy4KLQlQcmludCBtYXRjaGluZyBmb3JtYXRzIGlmIHRoZXJlIGlzIGFuIGFtYmlndW91cyBtYXRjaC4gIFVzZQotCWJmZF9ub25mYXRhbCBpbnN0ZWFkIG9mIGhhcmRjb2RlZCBlcnJvciBtZXNzYWdlIGlmIG5vdGhpbmcgbWF0Y2hlcy4KLQotCSogYXJzdXAuYywgYXIuYywgb2JqZHVtcC5jOiBVc2UgYmZkX2dldF9maWxlbmFtZSBpbnN0ZWFkIG9mCi0JYWJmZC0+ZmlsZW5hbWUuCi0KLQkqIG5tLmMgKGRpc3BsYXlfYXJjaGl2ZSk6IE5ldyBmdW5jdGlvbiwgZnJvbSBjb2RlIGluIGRpc3BsYXlfZmlsZS4KLQkoZGlzcGxheV9yZWxfZmlsZSk6IFJlbmFtZWQgZnJvbSBkb19vbmVfcmVsX2ZpbGUuCi0KLQkqIHNpemUuYzogSW5kZW50LgotCShkaXNwbGF5X2FyY2hpdmUpOiBOZXcgZnVuY3Rpb24gZnJvbSBjb2RlIGluIGRpc3BsYXlfZmlsZS4KLQkoZGlzcGxheV9maWxlKTogQ2hlY2sgYmZkX2Nsb3NlIGVycm9yIHJldHVybi4KLQotCSogc3RyaW5ncy5jIChzdHJpbmdzX29iamVjdF9maWxlKTogQ2hlY2sgYmZkX2NoZWNrX2Zvcm1hdAotCWVycm9yIHJldHVybi4KLQotCSogc3RyaW5ncy5jLCBvYmpkdW1wLmMsIHNpemUuYzogVXNlIGJmZF9ub25mYXRhbCBpbnN0ZWFkIG9mIGJmZF9wZXJyb3IuCi0KLQkqIGJ1Y29tbS5jOiBEZWxldGUgcmVmZXJlbmNlcyB0byBleGl0X2hhbmRsZXIuICBJdCB3YXNuJ3Qgc2V0Ci0JYW55d2hlcmUsIGFuZCBub3cgdGhhdCB3ZSdyZSB1c2luZyB0aGUgbGliaWJlcnR5IHhtYWxsb2MsIGl0Ci0Jd291bGRuJ3QgYWx3YXlzIGdldCBjYWxsZWQgYmVmb3JlIGV4aXRpbmcuCi0JKGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyk6IEZ1bmN0aW9uIG1vdmVkIGZyb20gb2JqZHVtcC5jLgotCSogYnVjb21tLmg6IERlY2xhcmUgaXQuCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IE1vdmUgc29tZSB2YXJpYWJsZSBkZWNscyBjbG9zZXIgdG8KLQl0aGVpciB1c2UuICBBZGQgc29tZSBjb21tZW50cy4gIFJlcGxhY2UgYSBuZXN0ZWQgYmxvY2sgd2l0aCBhCi0JcmV0dXJuLgotCi1Nb24gSmFuIDMxIDE4OjUwOjQxIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNwbGF5X3RhcmdldF9saXN0LCBkaXNwbGF5X2luZm9fdGFibGUpOiBDaGVjayB0aGF0Ci0JdGhlIGJmZCBvZiB0aGUgZHVtbXkgb3V0cHV0IGZpbGUgaXMgbm90IG51bGwuCi0KLVdlZCBKYW4gMjYgMTM6MTM6MTggMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9ieXRlcyk6IE5ldyBmdW5jdGlvbi4KLQkoY29weV9zZWN0aW9uKTogQ2FsbCBpdC4KLQkoY29weV9vcHRpb25zLCBjb3B5X3VzYWdlLCBjb3B5X21haW4pOiBBZGQgLS1ieXRlIG9wdGlvbiB0bwotCWFjdGl2YXRlIGl0LiAgQXBwcm9wcmlhdGUgdGhlIC1iIG9wdGlvbiAod2hpY2ggd2FzIGFuIHVuZG9jdW1lbnRlZAotCXN5bm9ueW0gZm9yIC1GKSBmb3IgaXQsIGFsc28uICBBZGQgLS1pbnRlcmxlYXZlLCAtaSBvcHRpb24gZm9yCi0JYWRkaXRpb25hbCBjb250cm9sLgotCShzZXR1cF9zZWN0aW9uLCBjb3B5X3NlY3Rpb24sIG1hbmdsZV9zZWN0aW9uKTogUmVuYW1lZCB3aXRoIG5vIGBzJwotCW9uIHRoZSBlbmQuCi0JKiBvYmpjb3B5LjEsIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IHRoZSBuZXcgb3B0aW9ucy4KLQotCSogb2JqZHVtcC5jIChkaXNwbGF5X3RhcmdldF90YWJsZXMsIGRpc3BsYXlfdGFyZ2V0X2xpc3QpOgotCU5ldyBmdW5jdGlvbnMgYnJva2VuIG91dCBvZiBkaXNwbGF5X2luZm8uCi0JRWxpbWluYXRlIHNvbWUgbWFnaWMgY29uc3RhbnRzLiAgVXNlIG1vcmUgbWVhbmluZ2Z1bCB2YXJpYWJsZSBuYW1lcy4KLQkoZHVtcF9iZmRfaGVhZGVyKTogTmV3IGZ1bmN0aW9uIGJyb2tlbiBvdXQgb2YgZGlzcGxheV9iZmQuCi0JKGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBOZXcgZnVuY3Rpb24gYnJva2VuIG91dCBvZiBkdW1wX2hlYWRlcnMuCi0JKHJlbW92ZV91c2VsZXNzX3N5bWJvbHMpOiBEb24ndCBzaGFkb3cgZ2xvYmFsIHZhcmlhYmxlIG5hbWUgd2l0aAotCXBhcmFtZXRlci4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogRml4IGJhY2t3YXJkIHRlc3QuCi0KLVR1ZSBKYW4gMjUgMTk6NDA6NTQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBidWNvbW0uYyAocHJpbnRfYXJlbHRfZGVzY3IpOiBDaGFuZ2UgZGVjbCBvZiBgd2hlbicgdG8gdGltZV90LgotCSogb2JqZHVtcC5oOiBSZW1vdmVkLgotCi1Nb24gSmFuIDI0IDEzOjI5OjAyIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNwbGF5X2ZpbGUpOiBSZW1vdmUgY2FsbCB0byBsaXN0X21hdGNoaW5nX2Zvcm1hdHMuCi0JSXQgd291bGQgbmV2ZXIgYmUgY2FsbGVkLgotCShsaXN0X21hdGNoaW5nX2Zvcm1hdHMpOiBUYWtlIGFuIGFyZyBnaXZpbmcgdGhlIGxpc3Qgb2YgbWF0Y2hpbmcKLQlmb3JtYXRzLgotCShkaXNwbGF5X2JmZCk6IFBhc3MgdGhlIGFyZywgYW5kIGdldCBpdCBmaWxsZWQgaW4gYnkgY2FsbGluZwotCWJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyBpbnN0ZWFkIG9mIGJmZF9jaGVja19mb3JtYXQuCi0JKGRpc3BsYXlfaW5mbywgZGlzcGxheV9pbmZvX3RhYmxlKTogdGFyZ2V0X3ZlY3RvciB3YXMgcmVuYW1lZCB0bwotCWJmZF90YXJnZXRfdmVjdG9yLgotCi0JKiBiaW51dGlscy50ZXhpIChvYmpkdW1wKTogTm90ZSBzb21lIGxpbWl0YXRpb25zIG9mIC1oIHNlY3Rpb24KLQlhZGRyZXNzIHByaW50aW5nLgotCi1TYXQgSmFuIDIyIDE2OjIwOjQ2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1BTExPQyk6IFNldCB0byBlbXB0aW5lc3MgYnkgZGVmYXVsdC4KLQkoQUxMX0NGTEFHUyk6IEFkZCBhbmQgdXNlLgotCShhcnBhcnNlLmgpOiBNYWtlIGl0IGRlcGVuZCBvbiBhcnBhcnNlLnkuCi0JKiBhci5jIChsaWJiZmQuaCk6IERvbid0IHJlcXVpcmUgdG8gYmUgaW4gLi4vYmZkLgotCSogb2JqZHVtcC5jIChjb21wKTogUmVuYW1lIHRvIGNvbXBhcmVfc3ltYm9scy4KLQotRnJpIEphbiAyMSAyMDoyMjozMCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAobGlzdF9tYXRjaGluZ19mb3JtYXRzKTogSWYgdGhlIGZpbGUgZm9ybWF0IGlzIGFtYmlndW91cywKLQlwcmludCB0aGUgbWF0Y2hpbmcgbmFtZXMgc28gdGhlIHVzZXIgY2FuIGNob29zZSBvbmUuCi0JKGRpc3BsYXlfYmZkKTogQ2FsbCBpdC4KLQkoZGlzcGxheV9maWxlKTogQ2FsbCBpdC4KLQotRnJpIEphbiAyMSAxOToxNzoyNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFN1cHBvcnQgYmZkX2FyY2hfcnM2MDAwLgotCi1Nb24gSmFuIDE3IDEzOjU3OjI1IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChzdGFiX25hbWUpOiBBbGxvY2F0ZSBkeW5hbWljYWxseS4KLQkoc3RhYl9wcmludCk6IFVzZSBwb2ludGVycyB0byBzdHJpbmdzIGluc3RlYWQgb2YgY2hhciBhcnJheXMuCi0JKGR1bXBfc3RhYnMpOiBDaGFuZ2UgYWxsb2MgYW5kIGluaXQgb2YgYXJyYXlzIGFwcHJvcHJpYXRlbHkuCi0JKGR1bXBfc3RhYnNfMSk6IEFsd2F5cyBkZWNpZGUgd2hldGhlciB0byBwcmludCBzdGFiX25hbWUgb3IKLQl0aGUgc3RhYidzIHR5cGUgbnVtYmVyLCBpZiB1bm5hbWVkLgotCi1GcmkgSmFuIDE0IDE0OjQyOjQ4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChzdHJpcF9tYWluLCBjb3B5X21haW4pOiBEb24ndCBjbG9iYmVyIHRoZSBpbnB1dCBmaWxlCi0JaWYgY29weV9maWxlIGZhaWxzLgotCi0JKiBubG1jb252LmMgKG1haW4pOiBXYXJuIGFib3V0IGFuIGF0dGVtcHQgdG8gdXNlIGEgc2hhcmVkIGxpYnJhcnkKLQl3aXRoIHVuaW5pdGlhbGl6ZWQgZGF0YS4KLQotCSogbmxtY29udi5jIChzZXR1cF9zZWN0aW9ucyk6IE1ha2Ugc3VyZSB0aGF0IHdlIGFsaWduIHRoZQotCW91dHB1dF9vZmZzZXQgb2YgZWFjaCBpbnB1dCBzZWN0aW9uIGFwcHJvcHJpYXRlbHkuCi0KLVRodSBKYW4gMTMgMTc6MzI6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGR1bXBfcmVsb2NzKTogRG9uJ3QgY3Jhc2ggaWYgc2VjdGlvbiBuYW1lIGlzIE5VTEwuCi0KLVR1ZSBKYW4gMTEgMTk6NDY6MzMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBmaWxlbW9kZS5jIChmaWxlbW9kZXN0cmluZyk6IENvbW1lbnRlZCBvdXQ7IG5vdCB1c2VkLgotCShtb2RlX3N0cmluZyk6IFVzZSBQT1NJWCBkZWZpbml0aW9ucy4KLQkoZnR5cGVsZXQpOiBMaWtld2lzZS4KLQkocnd4KTogUmVtb3ZlZDsgbm8gbG9uZ2VyIHVzZWQuCi0JKiBidWNvbW0uYzogSW5jbHVkZSBidWNvbW0uaC4KLQkoYmZkX25vbmZhdGFsLCBiZmRfZmF0YWwpOiBBcmd1bWVudCBpcyBjb25zdC4KLQkoZmF0YWwpOiBNYWtlIF9fU1REQ19fIHZlcnNpb24uCi0JKiBidWNvbW0uaCAobW9kZV9zdHJpbmcpOiBEZWNsYXJlLgotCSogTWFrZWZpbGUuaW4gKGJ1Y29tbS5vKTogRGVwZW5kIHVwb24gYnVjb21tLmgKLQotU3VuIEphbiAgOSAxMjowMzoyMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGJ1Y29tbS5jICh4bWFsbG9jLCB4cmVhbGxvYyk6IERlbGV0ZWQuCi0JKiBidWNvbW0uaCAoeG1hbGxvYywgeHJlYWxsb2MpOiBGaXggcHJvdG90eXBlcywgdG8gY29ycmVzcG9uZCB0bwotCWxpYmliZXJ0eSB2ZXJzaW9uIG9mIGZ1bmN0aW9ucy4KLQotVGh1IEphbiAgNiAwNjoxODoxNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLnRleGk6IEFkZCBhIGNoYXB0ZXIgc3VtbWFyaXppbmcgdGhlIHdheXMgdG8gc2VsZWN0Ci0JYXNwZWN0cyBvZiB0aGUgdGFyZ2V0IGZvciBlYWNoIHByb2dyYW0uCi0KLQkqIG9iamR1bXAuYyAobG9uZ19vcHRpb25zLCB1c2FnZSk6IEFkZCBsb25nIGVxdWl2YWxlbnRzIGZvciBhbGwKLQlyZW1haW5pbmcgc2hvcnQgb3B0aW9ucyB0aGF0IGxhY2tlZCB0aGVtLgotCSogYmludXRpbHMudGV4aSBvYmpkdW1wLjE6IERvY3VtZW50IHRoZW0uCi0KLQkqIHNpemUuYyAodXNhZ2UpOiBUd2VhayB1c2FnZSBtZXNzYWdlLgotCSogc2l6ZS4xOiBBZGQgbWlzc2luZyBgPScgaW4gZXhhbXBsZXMuCi0KLQkqIGJpbnV0aWxzLnRleGkgc3RyaXAuMSBvYmpjb3B5LjEgbmxtY29udi4xIG9iamNvcHkuYyBubG1jb252LmM6Ci0JVXNlICItLXRhcmdldD1iZmRuYW1lIiBhcyB0aGUgb3B0aW9uIHRvIHNlbGVjdCB0aGUgQkZEIHRhcmdldCwKLQlsaWtlIG5tIGFuZCBzaXplIGFscmVhZHkgZG8uCi0JUmVzZXJ2ZSAiLS1mb3JtYXQ9Zm9ybWF0IiBmb3IgdGV4dHVhbCBvdXRwdXQgc2VsZWN0aW9uIG9wdGlvbnMsIGJ1dAotCWZvciBub3cga2VlcCBvbGQgb3B0aW9uIG5hbWVzIGFzIG9ic29sZXRlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotCi0JKiBzdHJpbmdzLmMgKG1haW4sIHN0cmluZ3Nfb2JqZWN0X2ZpbGUsIHVzYWdlKTogQWRkIC0tdGFyZ2V0IG9wdGlvbi4KLQkqIGJpbnV0aWxzLnRleGkgc3RyaW5ncy4xOiBEb2N1bWVudCBpdC4KLQotU2F0IEphbiAgMSAxMzo1ODoyNCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKG1haW4pOiBBZGQgXG4gaW4gZXJyb3IgbWVzc2FnZS4KLQotVGh1IERlYyAyMyAxMjoyMzoxMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlnY2MgLVdhbGwgbGludDoKLQkqIGFyLmMgKG1haW4pOiBQdXQgcGFyZW5zIGFyb3VuZCBhc3NpZ25tZW50IHVzZWQgYXMgdHJ1dGggdmFsdWUuCi0JKiBvYmpjb3B5LmMgKHN0cmlwX21haW4pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4gIFJldHVybiAwLgotCShjb3B5X21haW4pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4gIFJldHVybiAwLgotCSogb2JqZHVtcC5jIChkaXNwbGF5X2JmZCk6IERlY2xhcmUgcmV0dXJuIHZhbHVlIGFzIHZvaWQuCi0JKHN0YWJfcHJpbnQpOiBVc2UgIiIgaW5zdGVhZCBvZiAwIHRvIGluaXRpYWxpemUgYXJyYXkuCi0JKGR1bXBfc3RhYnNfMSk6IFByaW50IHZtYSB1c2luZyBwcmludGZfdm1hLgotCShkaXNwbGF5X2luZm8pOiBQdXQgcGFyZW5zIGFyb3VuZCBhc3NpZ25tZW50IHVzZWQgYXMgdHJ1dGggdmFsdWUuCi0JKiBzdHJpbmdzLmMgKHByaW50X3N0cmluZ3MpOiBDYXN0IHByaW50ZiBhcmd1bWVudHMuCi0KLQkqIG9iamNvcHkuYyAoY29weV9tYWluKTogVXNlIGNvcHlfb3B0aW9ucywgbm90IHN0cmlwX29wdGlvbnMuCi0KLQkqIG5sbWhlYWRlci55IChjb21tYW5kKTogV2FybiBhYm91dCBpbGxlZ2FsIGRhdGUgdmFsdWVzLgotCi1XZWQgRGVjIDE1IDExOjE4OjAzIDE5OTMgIERhdmlkIEouIE1hY0tlbnppZSAgKGRqbUBmcm9zdHkuZW5nLnVtZC5lZHUpCi0KLQkqIGJ1Y29tbS5jIGJ1Y29tbS5oOiBSdW4gdGhyb3VnaCBpbmRlbnQuICBEZS1hbnNpZGVjbC1pZnkuCi0JKGJmZF9ub25mYXRhbCk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2ZhdGFsKTogQ2FsbCBpdC4KLQotCSogb2JqY29weS5jIChzbWFydF9yZW5hbWUpOiBEbyBhIGNvcHkgaWYgdGhlIGRlc3QgZmlsZSBoYXMKLQltdWx0aXBsZSBoYXJkIGxpbmtzLiAgUmVtb3ZlIHNvdXJjZSBmaWxlIG9uIHN1Y2Nlc3NmdWwgY29weS4KLQlUcnkgdG8gcHJlc2VydmUgbW9kZSBhbmQgb3duZXIgb24gc3VjY2Vzc2Z1bCByZW5hbWUuCi0KLQkqIG9iamNvcHkuYzogUnVuIHRocm91Z2ggaW5kZW50LiAgQ2xlYW4gdXAgYSBiaXQuCi0JTWFrZSBnbG9iYWwgdmFyaWFibGVzIHN0YXRpYy4KLQlNYWtlIHtpbnB1dCxvdXRwdXR9X3t0YXJnZXQsZmlsZW5hbWV9LCBzaG93X3ZlcnNpb24gbG9jYWwKLQl0byB2YXJpb3VzIGZ1bmN0aW9ucy4KLQlOZXcgZ2xvYmFsIHZhcmlhYmxlIGBzdGF0dXMnIGZvciBleGl0IHN0YXR1cy4KLQkoc3RyaXBfbWFpbiwgY29weV9tYWluKTogTmV3IGZ1bmN0aW9ucyB3aXRoIGNvZGUgZnJvbSBtYWluLgotCShub25mYXRhbCk6IE5ldyBtYWNyby4gIFVzZSBpdCBnbG9iYWxseSBpbnN0ZWFkIG9mIGJmZF9wZXJyb3IgYW5kCi0JYmZkX2ZhdGFsLgotCi0JKGNvcHlfb2JqZWN0KTogQ2FsbCBtYW5nbGVfc2VjdGlvbnMgd2l0aCBiZmRfbWFwX292ZXJfc2VjdGlvbnMuCi0JKG1hbmdsZV9zZWN0aW9ucyk6IEFkanVzdCBmb3IgbmV3IGNhbGxpbmcgY29udmVudGlvbi4KLQotRnJpIERlYyAxMCAxMToyODoxMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG5sbWhlYWRlci55IChjb21tYW5kKTogQWNjZXB0IE1BUCBhbmQgRlVMTE1BUCB3aXRob3V0IGFyZ3VtZW50cy4KLQkqIG5sbWNvbnYuYyAobWFpbik6IENoYW5nZSBlcnJvciBtZXNzYWdlIGZvciBNQVAgYW5kIEZVTExNQVAuCi0KLVRodSBEZWMgIDkgMTc6NDc6MTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKG1haW4pOiBXYXJuIGFib3V0IGltcG9ydGVkIHN5bWJvbHMgdGhhdCBhcmUgbm90IGluCi0JdGhlIElNUE9SVCBsaXN0IGV2ZW4gaWYgdGhlIElNUE9SVCBrZXl3b3JkIGlzIG5vdCB1c2VkLgotCi0JKiBubG1jb252LmMgKGRlYnVnLCB1bmxpbmtfb25fZXhpdCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShsb25nX29wdGlvbnMpOiBBZGQgImRlYnVnIiBhbmQgImxpbmtlciIuCi0JKG1haW4pOiBIYW5kbGUgLWQgYW5kIC1sIGFyZ3VtZW50cy4gIE1ha2UgY29tbWFuZCBsaW5lIGlucHV0IGFuZAotCW91dHB1dCBmaWxlcyBvcHRpb25hbC4gIFBhcnNlIHRoZSBjb21tYW5kIGZpbGUgYmVmb3JlIG9wZW5pbmcgdGhlCi0JQkZEJ3MsIHdoaWNoIHJlcXVpcmVzIHN0b3JpbmcgbW9yZSBpbmZvcm1hdGlvbiBpbiBsb2NhbCB2YXJpYWJsZXMuCi0JSWYgSU5QVVQgbmFtZXMgbXVsdGlwbGUgZmlsZXMsIGxpbmsgdGhlbSB0b2dldGhlci4gIFVzZSBPVVRQVVQgZm9yCi0JdGhlIG91dHB1dCBmaWxlIG5hbWUgaWYgbm90IG5hbWVkIG9uIGNvbW1hbmQgbGluZS4KLQkoc2hvd191c2FnZSk6IENoYW5nZWQgZm9yIG5ldyBvcHRpb25zLgotCShsaW5rX2lucHV0cyk6IE5ldyBmdW5jdGlvbiB0byBhdXRvbWF0aWNhbGx5IGludm9rZSBsaW5rZXIgdG8KLQloYW5kbGUgbXVsdGlwbGUgSU5QVVQgZmlsZXMuCi0JKGNob29zZV90ZW1wX2Jhc2VfdHJ5LCBjaG9vc2VfdGVtcF9iYXNlLCBwZXhlY3V0ZSk6IE5ldyBmdW5jdGlvbnMsCi0JbW9zdGx5IGNvcGllZCBmcm9tIGdjYy9nY2MuYy4KLQkqIG5sbWNvbnYuaCAoaW5wdXRfZmlsZXMsIG91dHB1dF9maWxlKTogRGVjbGFyZS4KLQkqIG5sbWhlYWRlci55IChpbnB1dF9maWxlcywgb3V0cHV0X2ZpbGUpOiBEZWZpbmUuCi0JKGNvbW1hbmQpOiBTdXBwb3J0IElOUFVUIHdpdGggYSBzdHJpbmdfbGlzdCBhcmd1bWVudC4gIFN1cHBvcnQKLQlPVVRQVVQuCi0JKHN0cmluZ19saXN0KTogUmVuYW1lZCBmcm9tIG1vZHVsZV9saXN0LgotCSogTWFrZWZpbGUuaW4gKG5sbWNvbnYubyk6IERlZmluZSBMRF9OQU1FIGJhc2VkIG9uCi0JcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZS4KLQotV2VkIERlYyAgOCAxMDowOTowNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG5sbWhlYWRlci55IChubG1oZWFkZXJfaWRlbnRpZnkpOiBOZXcgZnVuY3Rpb24uICBVc2UgaXQgdG8gcHJpbnQKLQl0aGUgcHJvZ3JhbSBuYW1lIGp1c3Qgb25jZSwgaW5zdGVhZCBvZiB3aXRoIGV2ZXJ5IGVycm9yIG1lc3NhZ2UuCi0KLU1vbiBEZWMgIDYgMTY6MTE6MzIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKGxvbmdfb3B0aW9ucyk6IENoYW5nZWQgLS1oZWFkZXItaW5mbyB0byAtLWhlYWRlci1maWxlCi0JdG8gbWF0Y2ggZG9jdW1lbnRhdGlvbiBhbmQgdXNhZ2UgbWVzc2FnZS4KLQotU3VuIERlYyAgNSAwMTozMTowMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogb2JqZHVtcC5jIChkdW1wX3JlbG9jcyk6IEF2b2lkIGRlcmVmZXJlbmNpbmcgYSBOVUxMIHN5bV9wdHJfcHRyCi0JaW4gYSByZWxvY2F0aW9uLgotCi1UaHUgRGVjICAyIDE2OjAwOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChtYWluKTogQ2hhbmdlIHZhcmlvdXMgdHlwZXMgZnJvbSBiZmRfc2l6ZV90eXBlIHRvCi0Jc2l6ZV90LCBzaW5jZSB0aGV5IGhhdmUgdG8gYmUgYXJndW1lbnRzIHRvIGZyZWFkIGFuZCBmd3JpdGUuCi0JQ2hhbmdlIHNldCBmcm9tIGNoYXIgKiB0byB1bnNpZ25lZCBjaGFyICouCi0JKHNlbGVjdF9vdXRwdXRfZm9ybWF0KTogTWFrZSBtYWNoIGFyZ3VtZW50IHVuc2lnbmVkLiAgSGFuZGxlCi0JYmZkX2FyY2hfYWxwaGEuCi0JKHNldHVwX3NlY3Rpb25zKTogRG9uJ3QgY29weSB0aGUgLnJlZ2luZm8gc2VjdGlvbiBvZiBhbiBFQ09GRgotCWZpbGUuICBDYWxsIGJmZF9zZXRfcmVsb2MgdG8gaW5pdGlhbGl6ZSB0aGUgcmVsb2NhdGlvbiBmaWVsZHMuCi0JKGNvcHlfc2VjdGlvbnMpOiBEb24ndCBjb3B5IHRoZSAucmVnaW5mbyBzZWN0aW9uIG9mIGFuIEVDT0ZGIGZpbGUuCi0JQ29tYmluZSBhbGwgcmVsb2NzIGZvciBhIHNlY3Rpb24uCi0JKG1hbmdsZV9yZWxvY3MpOiBDaGFuZ2UgdHlwZSBvZiByZWxvY3MgdG8gcGVybWl0IHNwZWNpZmljCi0JZnVuY3Rpb25zIHRvIGNoYW5nZSBpdC4gIENhbGwgYWxwaGFfbWFuZ2xlX3JlbG9jcyBmb3IgYWxwaGEsCi0JZGVmYXVsdF9tYW5nbGVfcmVsb2NzIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzLgotCShkZWZhdWx0X21hbmdsZV9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uICBBZGp1c3QgdGhlIGFkZHJlc3Mgb2YgYWxsCi0JcmVsb2NzIGJ5IHRoZSBvdXRwdXRfb2Zmc2V0LgotCShpMzg2X21hbmdsZV9yZWxvY3MpOiBDaGFuZ2UgdHlwZSBvZiByZWxvY3MgYXJndW1lbnQuICBDYXN0IGxlbmd0aAotCWFyZ3VtZW50IHRvIG1lbW1vdmUgdG8gc2l6ZV90LgotCShhbHBoYV9tYW5nbGVfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCi1XZWQgTm92IDE3IDE3OjM4OjU4IDE5OTMgIFNlYW4gRXJpYyBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKHNlbGVjdF9vdXRwdXRfZm9ybWF0KTogVXNlIG5sbTMyLXNwYXJjIGZvcgotCWJmZF9hcmNoX3NwYXJjLgotCi1XZWQgTm92IDE3IDE0OjQxOjM1IDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QHRoZXB1Yi5jeWdudXMuY29tKQotCi0gICAgICAgICogbmxtY29udi4xOiAgIGFkZGVkIG1hbiBwYWdlCi0JKiBvYmpjb3B5LjE6ICAgZml4ZWQgZm9ybWF0IGVycm9ycwotCi1XZWQgTm92IDE3IDEyOjAzOjQxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFVzZSBDRkxBR1MgYXMgd2VsbCBhcyBMREZMQUdTIHdoZW4gbGlua2luZy4KLQotV2VkIE5vdiAxNyAwNDo1MDo1NSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHN0cmluZ3MuMTogRml4IHR5cG8uCi0KLU1vbiBOb3YgMTUgMTI6MDM6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogQnVpbGQgImluZm8iLgotCShWRVJTSU9OKTogVXBkYXRlZCB0byBjeWdudXMtMi4zLjE7IDIuMyBoYXMgZ29uZSBvdXQuCi0KLVN1biBOb3YgMTQgMDA6Mjc6MjQgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9zdGFicyk6IEhhbmRsZSBzdGFicy1pbi1zb20gYXMgaW1wbGVtZW50ZWQKLQlieSB0aGUgbmV3IEJGRCBTT00gYXNzZW1ibGVyLgotCi1TYXQgTm92IDEzIDA3OjE0OjA1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogYXIuMSBjKytmaWx0LjEgbm0uMSBvYmpjb3B5LjEgb2JqZHVtcC4xIHJhbmxpYi4xIHNpemUuMQotCXN0cmluZ3MuMSBzdHJpcC4xOiBSZXBsYWNlIFwoZW0gaW4gTkFNRSBzZWN0aW9uIHdpdGggXC0gc28KLQltYWtld2hhdGlzIGNhbiBncm9rIGl0LgotCi1UdWUgTm92ICA5IDE1OjIyOjEyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChpMzg2X21hbmdsZV9yZWxvY3MpOiBBZGp1c3QgcmVsb2MgYWRkcmVzcyBieQotCXNlY3Rpb24gb3V0cHV0X29mZnNldC4KLQotRnJpIE5vdiAgNSAxMjoxMTo1MiAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aTogIGFkZGVkIG5sbWNvbnYgY2hhcHRlcgotCi1XZWQgTm92ICAzIDE2OjEwOjUwIDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgUlVOVEVTVEZMQUdTIHRvIFJVTlRFU1RfRkxBR1MKLQotV2VkIE5vdiAgMyAxNTowOToyMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERvbid0IGdldCByaWQgb2YgZHZpIG9yIGluZm8gZmlsZXMuCi0KLVR1ZSBOb3YgIDIgMTM6Mjk6NTkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKFNfSVNMTkspOiBEZWZpbmUgYXMgMCBpZiB0aGVyZSdzIG5vIFNfSUZMTksuCi0KLUZyaSBPY3QgMjkgMTY6MDI6MzQgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXhpOiBNb3ZlIG9iamNvcHkgZG9jcyBpbnRvIGFscGhhYmV0aWNhbCBvcmRlci4KLQotCSogb2JqZHVtcC5jOiBVc2UgeG1hbGxvYyBpbnN0ZWFkIG9mIG1hbGxvYy4KLQotRnJpIE9jdCAyOSAxMToxMToxNCAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoaW5mbyk6IFJlbmFtZSB0byBmb3JtYXRzX2luZm8uCi0JKGR1bXBfc3RhYnNfMSk6IEJldHRlciBjb21tZW50cyBhbmQgZm9ybWF0dGluZy4KLQotVGh1IE9jdCAyOCAxOTo0MzoxNiAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKG1haW4pOiBBbHdheXMgY3JlYXRlIHRoZSBhcmNoaXZlIHdoZW4gcXVpY2sgYXBwZW5kaW5nLAotCWV2ZW4gaWYgbm8gaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIGdpdmVuLgotCi1XZWQgT2N0IDI3IDEyOjAzOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChtYWluKTogU2V0IHNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0IGFuZAotCXNoYXJlZERlYnVnUmVjb3JkQ291bnQgZmllbGRzIGluIGV4dGVuZGVkIGhlYWRlci4KLQotCSogbmxtY29udi5jIChtYWluKTogRm9yY2UgbW9kdWxlTmFtZSBmaWVsZCB0byB1cHBlciBjYXNlLgotCi1Nb24gT2N0IDI1IDE2OjQ1OjQyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChtYWluKTogR2l2ZSBhIHVzYWdlIG1lc3NhZ2UgaWYgdGhlcmUgYXJlIHRvbyBtYW55Ci0JYXJndW1lbnRzLgotCi1Nb24gT2N0IDI1IDEwOjM3OjA4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogUmV3cml0ZSB0byB0YWtlIGFkdmFudGFnZSBvZiBWUEFUSCwKLQlzbyBGU0YgZGlzdHJpYnV0aW9ucyAod2l0aCBpbmZvIGZpbGVzIGluICQoc3JjZGlyKSkgaW5zdGFsbAotCXByb3Blcmx5LgotCShESVNUU1RVRkYpOiBCdWlsZCBubG1oZWFkZXIuYyB0b28uCi0KLUZyaSBPY3QgMjIgMTE6NDM6MjMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKHByb2dyYW1fbmFtZSk6IERvbid0IGRlZmluZSBoZXJlLgotCSogb2JqZHVtcC5jOiBJbmNsdWRlICJidWNvbW0uaCIuCi0JKHhtYWxsb2MpOiBEb24ndCBkZWNsYXJlIGhlcmUuCi0JKHByb2dyYW1fbmFtZSk6IERvbid0IGRlZmluZSBoZXJlLgotCShwcm9ncmFtX3ZlcnNpb24pOiBGaXhlZCB0eXBlIGluIGRlY2xhcmF0aW9uLgotCSogc2l6ZS5jOiBJbmNsdWRlICJidWNvbW0uaCIuCi0JKHByb2dyYW1fbmFtZSk6IERvbid0IGRlY2xhcmUgaGVyZS4KLQotRnJpIE9jdCAyMiAxNDoxMDo0MSAxOTkzICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGZwcmludGYpOiBoaWRlIGRlY2xhcmF0aW9uIGluIEZQUklOVEZfQUxSRUFEWV9ERUNMQVJFRAotCi1GcmkgT2N0ICAxIDEyOjQzOjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChpMzg2X21hbmdsZV9yZWxvY3MpOiBSZXNvbHZlIGFuZCByZW1vdmUgUEMgcmVsYXRpdmUKLQlyZWxvY3MgYWdhaW5zdCBkZWZpbmVkIHN5bWJvbHMgaW4gdGhlIHNhbWUgc2VjdGlvbi4KLQotVGh1IFNlcCAzMCAxNjo0NjoyNiAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYmludXRpbHMuZHZpKTogdXNlIFRFWElESVIgdG8gZmluZCB0ZXhpbmZvLnRleAotCi1TYXQgU2VwIDI1IDE4OjA5OjI5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChzaW1wbGVfY29weSwgc21hcnRfcmVuYW1lKTogTmV3IGZ1bmN0aW9ucy4KLQkobWFpbik6IFVzZSB0aGVtLgotCi1GcmkgU2VwIDI0IDE1OjM4OjI5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuLCBkaXN0Y2xlYW4pOiBSZWN1cnNlIGludG8gdGVzdHN1aXRlLgotCi1UaHUgU2VwIDIzIDAxOjA1OjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChzZXR1cF9zZWN0aW9ucywgY29weV9zZWN0aW9ucyk6IElmIHN0cmlwcGluZywgZG9uJ3QKLQljb3B5IFNFQ19ERUJVR0dJTkcgc2VjdGlvbnMuCi0JKiBvYmpkdW1wLmMgKGR1bXBfaGVhZGVycyk6IFByaW50IFNFQ19ERUJVR0dJTkcgZmxhZy4KLQotCSogb2JqZHVtcC5jICh1c2FnZSk6IE1lbnRpb24gLS1zdGFicy4KLQotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6IENvcHkgYWxsIGFwcGxpY2FibGUgZmlsZSBmbGFncy4KLQkoY29weV9maWxlKTogRG9uJ3QgY29weSBFWEVDX1Agc3BlY2lhbGx5IGhlcmUuCi0KLU1vbiBTZXAgMjAgMTk6Mjg6NTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKG1haW4pOiBBZGp1c3QgZGF0YSBzZWN0aW9uIHNpemUgdG8gY29ycmVzcG9uZCB0byBic3MKLQlhbGlnbm1lbnQgYWRqdXN0bWVudC4gIENsZWFyIEJTRl9TRUNUSU9OX1NZTSBpZiBzeW1ib2wgaXMgbW92ZWQgdG8KLQlhIGRpZmZlcmVudCBzZWN0aW9uLiAgVXNlIHRpbWVfdCBmb3IgdGltZSB2YXJpYWJsZS4KLQkoc2V0dXBfc2VjdGlvbnMpOiBPbmx5IHB1dCBzZWN0aW9ucyB3aXRoIGNvbnRlbnRzIGluIG91dHB1dCBOTE0uCi0JKGkzODZfbWFuZ2xlX3JlbG9jcyk6IE5vIHN5bWJvbHMgYXJlIGNvbW1vbiBhdCB0aGlzIHBvaW50LiAgQWRkCi0JY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0KLUZyaSBTZXAgMTAgMTE6MDA6NDAgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmM6IE1hZGUgdGhlIC0tc3RhYnMgb3B0aW9uIHdvcmsgZm9yIHN0YWJzLWluLWNvZmYuCi0JKEVMRl9TVEFCX0RJU1BMQVkpOiBSZW1vdmVkLgotCShkdW1wX2VsZl9zdGFicyk6IFJlbmFtZWQgdG8gZHVtcF9zdGFicywgY2hhbmdlZCB0byBydW4gZm9yCi0JYW55IG9iamVjdCBmaWxlIGZvcm1hdC4KLQkoZHVtcF9lbGZfc3RhYnNfMSk6IFJlbmFtZWQgdG8gZHVtcF9zdGFic18xLCBhZGRlZCBjYWxscyB0bwotCWdlbmVyaWMgQkZEIHJvdXRpbmVzIGZvciBub24tRUxGIGNhc2UsIGNoYW5nZWQgZm9ybWF0IG9mIG1lc3NhZ2UKLQlmb3Igbm8tc2VjdGlvbi1mb3VuZCBjYXNlLgotCShkaXNwbGF5X2JmZCk6IEFsd2F5cyBjYWxsIGR1bXBfc3RhYnMgaWYgcmVxdWVzdGVkLgotCShkdW1wX2RhdGEpOiBDYWxsIGJmZF9zZWN0aW9uX3NpemUgdG8gZ2V0IHNlY3Rpb24gc2l6ZS4KLQotRnJpIFNlcCAxMCAwODoxMjoyMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgcHV0IHN0cmluZ3MgaW4gdG9vbGRpci9iaW4uCi0KLU1vbiBTZXAgIDYgMTU6Mzk6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKHRvdGFsX2Jzc19zaXplKTogUmVtb3ZlZC4KLQkobWFpbik6IFNldCB0aGUgYnNzIHZtYSB0byBhbHdheXMgZm9sbG93IHRoZSBkYXRhIHNlY3Rpb24uICBNb3ZlCi0Jc3ltYm9scyBpbnRvIG5ldyBzZWN0aW9ucywgYW5kIGFkanVzdCB2YWx1ZXMgYnkgb3V0cHV0X29mZnNldC4KLQkoc2V0dXBfc2VjdGlvbnMpOiBEb24ndCBjb3B5IGFsbCBzZWN0aW9ucywgYnV0IGluc3RlYWQgcG9pbnQgYWxsCi0JdGV4dCBzZWN0aW9ucyB0byAudGV4dCwgYWxsIGRhdGEgc2VjdGlvbnMgdG8gLmRhdGEsIGFuZCBhbGwgYnNzCi0Jc2VjdGlvbnMgdG8gLmJzcy4KLQkoY29weV9zZWN0aW9ucyk6IEFkanVzdCBhY2NvcmRpbmdseS4KLQotVGh1IFNlcCAgMiAxMjozNDowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlPbmx5IGJ1aWxkIG5sbWNvbnYgaWYgY29uZmlndXJlZCBmb3IgYSBOZXRXYXJlIHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbjogSWYgd2UgaGF2ZSBzb21lICotKi1uZXR3YXJlKiB0YXJnZXQsIG9yIGFyZSB1c2luZwotCWFsbCB0YXJnZXRzLCBzZXQgQlVJTERfTkxNQ09OViB0byAkKE5MTUNPTlZfUFJPRykgaW4gTWFrZWZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoUFJPR1MpOiBVc2UgJChCVUlMRF9OTE1DT05WKSByYXRoZXIgdGhhbgotCSQoTkxNQ09OVl9QUk9HKS4KLQotVHVlIEF1ZyAzMSAxNDoxMzozNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoQVJDSF9hbGwpOiBEZWZpbmUgQVJDSF9ocHBhIHRvby4KLQkoZHVtcF9oZWFkZXJzKTogRG9uJ3QgdGVzdCBmb3IgU0VDX0JBTElHTiBpZiBpdCdzIG5vdCBkZWZpbmVkIGJ5Ci0JYmZkLmguCi0KLVR1ZSBBdWcgMzEgMTM6Mjk6MTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKG1haW4pOiBGb3JjZSBjcmVhdGlvbiBvZiAuYnNzIHNlY3Rpb24uICBTZXQgdXAgdGhlCi0Jc2VjdGlvbnMgYmVmb3JlIGxvb2tpbmcgYXQgdGhlIHN5bWJvbHMuICBNb3ZlIGFsbCBjb21tb24gc3ltYm9scwotCWludG8gLmJzcyBzZWN0aW9uLiAgQXV0b21hdGljYWxseSBkZWZpbmUgX2VkYXRhIGFuZCBfZW5kLiAgT25seQotCWV4cG9ydCBzeW1ib2xzIGluIHRoZSBleHBvcnQgbGlzdCwgd2l0aCBtdWx0aXBsZSBwcmVmaXhlcyBpZgotCW5lY2Vzc2FyeS4gIFdhcm4gaWYgbm8gdmVyc2lvbi4gIEFsd2F5cyBjcmVhdGUgZXh0ZW5kZWQgaGVhZGVyLgotCVNldCBkYXRlIGF1dG9tYXRpY2FsbHkgaWYgbm90IGFscmVhZHkgc2V0LgotCShzZXR1cF9zZWN0aW9ucyk6IENvdW50IHNpemUgb2YgYnNzIHNlY3Rpb25zLgotCShtYW5nbGVfcmVsb2NzLCBpMzg2X21hbmdsZV9yZWxvY3MpOiBBY2NlcHQgc2VjdGlvbiBhcmd1bWVudCwgYW5kCi0JdGFrZSByZWxvY19jb3VudCBhcyBhIGNoYW5nZWFibGUgcG9pbnRlcjsgY2hhbmdlZCBjYWxsZXJzLgotCShpMzg2X21hbmdsZV9yZWxvY3MpOiBSZW1vdmUgUEMgcmVsYXRpdmUgcmVsb2NzIHdpdGhpbiBhIHNlY3Rpb24sCi0JYXMgdGhleSByZXF1aXJlIG5vIGFkanVzdG1lbnQuCi0JKiBubG1oZWFkZXIueTogRml4ZWQgbWVtb3J5IGFsbG9jYXRpb24gdGhyb3VnaG91dDogdG9rZW4gU1RSSU5HIGlzCi0Jbm93IGFsbG9jYXRlZCBvbiB0aGUgaGVhcCwgYW5kIGZyZWVkIGlmIG5vdCBuZWVkZWQuICBOdWxsCi0JdGVybWluYXRlZCBjb3B5cmlnaHQgbWVzc2FnZS4gIEFjY2VwdCB2ZXJzaW9uIHdpdGggb25seSB0d28KLQlzdHJpbmdzLgotCShzeW1ib2xfbGlzdF9vcHQpOiBOZXcgbm9udGVybWluYWwsIGVpdGhlciBzeW1ib2xfbGlzdCBvciBlbXB0eS4KLQkoc3ltYm9sX2xpc3QpOiBVc2UgbGVmdCByZWN1cnNpb24gdG8gYXZvaWQgb3ZlcmZsb3dpbmcgcGFyc2VyCi0Jc3RhY2suCi0JKHl5bGV4KTogUmVhcnJhbmdlZCBiZWdpbm5pbmcgb2YgbGluZSBjaGVjay4gIEFjY2VwdCBxdW90ZWQKLQlzdHJpbmdzIHVzaW5nIHNpbmdsZSBxdW90ZXMuICBFbmQgZ2VuZXJpYyBhcmd1bWVudCBhdCBjb21tZW50Ci0JY2hhcmFjdGVyIG9yIHBhcmVudGhlc2VzLgotCShzdHJpbmdfbGlzdF9hcHBlbmQpOiBGaXhlZC4KLQkoc3RyaW5nX2xpc3RfYXBwZW5kMSk6IE5ldyBmdW5jdGlvbi4KLQotCSogYnVjb21tLmg6IFRoZSBmaXJzdCBhcmd1bWVudCB0byB4cmVhbGxvYyBpcyBQVFIsIG5vdCBjaGFyICouCi0JKiBidWNvbW0uYyAoeHJlYWxsb2MpOiBVc2UgUFRSIHJhdGhlciB0aGFuIGNoYXIgKi4KLQkqIE1ha2VmaWxlLmluIChvYmpkdW1wLm8pOiBEZXBlbmQgdXBvbiBjb25maWcuc3RhdHVzIHRvIG5vdGljZQotCS0td2l0aC10YXJnZXRzIGNoYW5nZXMuCi0JKG5sbWNvbnYubyk6IERlcGVuZCB1cG9uIGJ1Y29tbS5oLgotCi1UdWUgQXVnIDE3IDA5OjQ2OjAxIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEb24ndCBwYXNzIGNwdSB0byBjb25maWcuYmZkLgotCi1UaHUgQXVnIDEyIDE2OjQzOjA0IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKCQoTk1fUFJPRykpOiBEZXBlbmQgb24gZGVtYW5nbGUuby4KLQkoZGVtYW5nbGUubyk6IE5ldyB0YXJnZXQuCi0JKGNwbHVzLWRlbS5vKTogRGVwZW5kIG9uIGl0LCB0byBmb3JjZSBjb21waWxhdGlvbiBvcmRlciB3aGVuIGRvaW5nCi0JcGFyYWxsZWwgY29tcGlsZXMuCi0KLQkqIG5tLmMgKHByaW50X3N5bWJvbF9pbmZvX3tic2Qsc3lzdixwb3NpeH0pOiBUYWtlIGEgYmZkIGFyZy4KLQkoc3RydWN0IG91dHB1dF9mbnMgcHJpbnRfc3ltYm9sX2luZm8pOiBEaXR0by4KLQkobG9uZ19vcHRpb25zLCB1c2FnZSwgbWFpbik6IEFkZCAtQyAtLWRlbWFuZ2xlIG9wdGlvbi4KLQkocHJpbnRfc3ltbmFtZSk6IE5ldyBmdW5jdGlvbiwgZGVtYW5nbGluZyBpZiByZXF1ZXN0ZWQuCi0JKHByaW50X3N5bWJvbHMsIHByaW50X3N5bWJvbF9pbmZvX3tic2Qsc3lzdixwb3NpeH0pOiBVc2UgaXQuCi0KLVdlZCBBdWcgMTEgMjI6NTc6MjMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUHV0IENGTEFHUyBsYXN0IGluIGNvbXBpbGF0aW9uIHJ1bGVzIGFuZCBvbWl0IGZyb20KLQlsaW5raW5nIHJ1bGVzLiAgVXNlIEFSQ0hERUZTIHRvIGNvbXBpbGUgb2JqZHVtcC5jLgotCVVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0JKiBjb25maWd1cmUuaW46IENvbnN0cnVjdCBBUkNIREVGUyBiYXNlZCBvbiB0aGUgQkZEIHRhcmdldCBtYWtlZmlsZQotCWZyYWdtZW50cy4KLQkqIG9iamR1bXAuYzogQ29uZGl0aW9uYWxpemUgY2FsbHMgdG8gdGhlIHByaW50X2luc25fQVJDSCBmdW5jdGlvbnMKLQlhY2NvcmRpbmcgdG8gQVJDSERFRlMuCi0KLVRodSBBdWcgMTIgMDg6MDY6MTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhci5jOiBSZW1vdmVkIG9ic29sZXRlIGFuZCBub24tZnVuY3Rpb25hbCBHTlU5NjAgY29kZS4KLQotV2VkIEF1ZyAxMSAxMzowODoyNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNpemUuYyAoYmVya2VsZXlfc3VtKTogTmV3IGZ1bmN0aW9uLgotCShic3NzaXplLCBkYXRhc2l6ZSwgdGV4dHNpemUpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlcy4KLQkoYnNzX3NlY3Rpb25fbmFtZSwgZGF0YV9zZWN0aW9uX25hbWUsIHRleHRfc2VjdGlvbl9uYW1lKTogUmVtb3ZlZC4KLQkocHJpbnRfYmVya2VsZXlfZm9ybWF0KTogTWFwIGJlcmtlbGV5X3N1bSBvdmVyIGFsbCB0aGUgc2VjdGlvbnMsCi0JcmF0aGVyIHRoYW4gb25seSByZXBvcnRpbmcgc2l6ZXMgb2Ygc3BlY2lmaWNhbGx5IG5hbWVkIHNlY3Rpb25zLgotCSogTWFrZWZpbGUuaW4gKCQoT0JKRFVNUF9QUk9HKSk6IFJlbW92ZWQgZGVwZW5kZW5jeSBvbiBzaXplLm8uCi0KLVR1ZSBBdWcgMTAgMTA6NDY6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBubG1jb252LmMsIG5sbWNvbnYuaCwgbmxtaGVhZGVyLnk6IE5ldyBmaWxlcyBmb3IgcHJvZ3JhbSB0bwotCWNvbnZlcnQgb2JqZWN0IGZpbGVzIGludG8gTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGVzLgotCSogTWFrZWZpbGUuaW4gKE5MTUNPTlZfUFJPRyk6IE5ldyBtYWNybywgZGVmaW5lIHRvIGJlIG5sbWNvbnYuCi0JKFBST0dTKTogQWRkIE5MTUNPTlZfUFJPRy4KLQkobmxtaGVhZGVyLmMsIG5sbWhlYWRlci5vLCBubG1jb252Lm8sICQoTkxNQ09OVl9QUk9HKSk6IE5ldwotCXRhcmdldHMuCi0KLVRodSBBdWcgIDUgMTU6NDg6MzIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZGVmaW5lIE1BS0VPVkVSUklERVMgdG8gYW4gZW1wdHkgc3RyaW5nCi0KLVdlZCBBdWcgIDQgMTc6MDg6MDggMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGNvcHlfZmlsZSk6IE1ha2UgZmFpbHVyZXMgdG8gcHJvY2VzcyBhIGZpbGUgbm9uZmF0YWwuCi0KLU1vbiBBdWcgIDIgMTE6Mjg6MjMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBubS5jOiBBZGQgLUIgb3B0aW9uLCBsaWtlIC0tZm9ybWF0PWJzZC4KLQotVHVlIEp1bCAyNyAxNjoyOTo1NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoY29weV9maWxlKTogSWYgdGhlIGZpbGUgaXMgbmVpdGhlciBhbiBvYmplY3Qgbm9yIGFuCi0JYXJjaGl2ZSwgZ2l2ZSBhbiBlcnJvciByYXRoZXIgdGhhbiByZXR1cm5pbmcgc3VjY2Vzcy4KLQotTW9uIEp1bCAxOSAxNjoxMzo0MCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyZXNzKTogUHJlZmVyIG5vbi1sb2NhbCBzeW1ib2xzIG92ZXIKLQlsb2NhbCBvbmVzLCBhbmQgZXNwZWNpYWxseSBkaXNjcmltaW5hdGUgYWdhaW5zdCBkZWJ1Z2dpbmcgc3ltYm9scy4KLQlBbHNvLCBmb3IgcmVsb2NhdGVhYmxlIGZpbGVzLCB0cnkgdG8gZmluZCBhIHN5bWJvbCBpbiB0aGUgY3VycmVudAotCXNlY3Rpb24sIGluc3RlYWQgb2YgcGlja2luZyBvbmUgZnJvbSBzb21lIHJhbmRvbSBzZWN0aW9uIHdpdGggYQotCWNvbnZlbmllbnQgdmFsdWUgKHJlYWQsIHNlY3Rpb24gb2Zmc2V0KS4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IENhc3QgYXJndW1lbnQgdG8gbWFsbG9jIHRvIHNpemVfdCBmaXJzdC4KLQkoZHVtcF9kYXRhKTogTGlrZXdpc2UuCi0JKGR1bXBfcmVsb2NzKTogSWYgYSBzaW5nbGUgc2VjdGlvbiBuYW1lIGlzIHNwZWNpZmllZCwgc2hvdyByZWxvY3MKLQlvbmx5IGZvciB0aGF0IHNlY3Rpb24uICBPdGhlcndpc2UsIHNpbGVudGx5IG9taXQgc2VjdGlvbnMgd2l0aG91dAotCXJlbG9jcy4gIEZvcm1hdCB0YWJsZSBuaWNlbHkgZXZlbiBpZiB2YWx1ZXMgYXJlIHByaW50ZWQgdXNpbmcgMTYKLQlkaWdpdHMgaW5zdGVhZCBvZiA4LgotCi1GcmkgSnVsIDE2IDE1OjE5OjU5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbm0uYzogQ2hhbmdlcyBmb3IgZmluYWwgdmVyc2lvbiBvZiBQT1NJWC4yLgotCShwcmludF9zeW1ib2xfZmlsZW5hbWVfe2JzZCxzeXN2LHBvc2l4fSk6IE5ldyBmdW5jdGlvbnMuCi0JKGZvcm1hdHMpOiBBZGQgYW4gZWxlbWVudCBmb3IgYSBwb2ludGVyIHRvIHRoZW0uCi0JKHByaW50X3N5bWJvbHMpOiBDYWxsIGl0LgotCShwcmludF9vYmplY3RfZmlsZW5hbWVfcG9zaXgsIHByaW50X2FyY2hpdmVfbWVtYmVyX3Bvc2l4KTogUHJvZHVjZQotCW91dHB1dCBhY2NvcmRpbmcgdG8gbmV3IFBPU0lYLjIgc3BlYy4KLQotCSogc3RyaW5ncy5jIChwcmludF9zdHJpbmdzKTogSGFuZGxlIFNUUkVBTSBiZWluZyBOVUxMLgotCShzdHJpbmdzX2Ffc2VjdGlvbik6IFBhc3MgYSBOVUxMLgotCShtYWluKTogRG9uJ3Qgb3BlbiAvZGV2L251bGwuCi0KLVRodSBKdWwgMTUgMTI6NDQ6MDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBIYW5kbGUgdGhlIG04OGsuCi0JKGRpc3BsYXlfYmZkKTogVXNlIGJmZF9lcnJtc2csIHJhdGhlciB0aGFuIGp1c3QgY2xhaW1pbmcgdGhhdCB0aGUKLQliZmQgaXMgbm90IGFuIG9iamVjdCBmaWxlLgotCi1Nb24gSnVsIDEyIDE3OjU1OjM0IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVEFHUyk6IG1ha2Ugd29yayBhZ2FpbiBieSBuYW1pbmcgZGlyZWN0b3JpZXMKLQkgIGV4cGxpY2l0bHkgcmF0aGVyIHRoYW4gZGVwZW5kaW5nIG9uIHVuZGVmaW5lZCBtYWNyb3MuCi0JICAoSU5TVEFMTF9YRk9STSk6IGNvcnJlY3QgYmFkIGluc3RhbGwgdGFyZ2V0LgotCi1GcmkgSnVsICAyIDE2OjU4OjM0IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3RyaW5ncy5jOiBEb2MgZml4ZXMuCi0KLVN1biBKdW4gMjcgMTM6MzU6MjQgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogTm90ZSBkZXBlbmRlbmNpZXMgb24gYnVjb21tLmguCi0JKGNwbHVzLWRlbS5vKTogTGluayBjKytmaWx0IHdpdGggdmVyc2lvbi5vLgotCi0JKiBzdHJpbmdzLmM6IEluY2x1ZGUgYnVjb21tLmggYW5kIGFkZCBwcm90b3R5cGVzIHRvIG90aGVyIGRlY2xzLgotCVJlbW92ZSAtaCBvcHRpb24uCi0KLQkqIGJ1Y29tbS5oOiBEZWNsYXJlIHhyZWFsbG9jLgotCi0JKiBubS5jLCBvYmpjb3B5LmMsIG9iamR1bXAuYywgc2l6ZS5jLCBzdHJpbmdzLmMgKG1haW4sIHVzYWdlKTogQWRkCi0JLS1oZWxwIG9wdGlvbi4gIFB1dCAiR05VIiBpbiB0aGUgdmVyc2lvbiBtZXNzYWdlLgotCSh1c2FnZSk6IFRha2Ugc3RyZWFtIGFuZCBleGl0IHN0YXR1cyBhcyBhcmdzLgotCShtYWluKTogUGFzcyBuZXcgYXJncyB0byB1c2FnZS4KLQotRnJpIEp1biAyNSAyMzoxMjoxMiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHN0cmluZ3MuYywgc3RyaW5ncy4xOiBOZXcgZmlsZXMuCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCBzdHJpbmdzLgotCSogTWFrZWZpbGUuaW46IEFkZCBydWxlcyBmb3IgaXQuCi0KLUZyaSBKdW4gMjUgMjA6NDQ6NDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYzogVXNlIHNpemUtaW5kZXBlbmRlbnQgYmZkIGVsZiBzZWN0aW9uIG5hbWVzLgotCi1TdW4gSnVuIDIwIDIzOjA5OjA2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IEhhbmRsZSB3aWRlIG9mZnNldHMgYnkKLQljYWxsaW5nIHNwcmludGZfdm1hLgotCi1GcmkgSnVuIDE4IDE0OjI5OjEyIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHN5bXMyKTogIFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlLgotCSogb2JqZHVtcC5jIChyZW1vdmVfdXNlbGVzc19zeW1ib2xzKTogIE5ldyBmdW5jdGlvbi4KLQkqIG9iamR1bXAuYyAoY29tcCk6ICBTaW1wbGlmeS4KLQkqIG9iamR1bXAuYyAoZGlzLWFzc2VtYmxlX2RhdGEpOiAgTWFrZSBzaW1wbGVyIGFuZCBtb3JlCi0JZWZmaWNpZW50IGhvdyB3ZSBmaWx0ZXIgb3V0IHVzZWxlc3Mgc3ltYm9sczogIEp1c3QgZmlsdGVyCi0JQkVGT1JFIHRoZSBzb3J0ICh1c2luZyByZW1vdmVfdXNlbGVzc19zeW1ib2xzKS4KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyZXNzKTogIFNpbXBsaWZ5LgotCUNoYW5nZSBvdXRwdXQgc3ludGF4IHRvIG1hdGNoIGdkYi4KLQotVGh1IEp1biAxNyAxNjo1Mzo1NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY2Fub25pY2FsaXplIGluc3RhbGwuc2g7IGZvciB1c2Ugd2l0aGluCi0JdGhpcyBkaXJlY3RvcnkgKGFuZCBzdWJkaXJzKQotCi1Nb24gSnVuIDE0IDEyOjEzOjIyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwsIGluc3RhbGwtaW5mbyk6IHJlbW92ZSBwYXJlbnRkaXIgc3VwcG9ydCwKLQl1c2UgSU5TVEFMTF9YRk9STTsgZGVmaW5lIElOU1RBTExfWEZPUk0KLQotVGh1IEp1biAxMCAxNzoyOToyMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6ICBGaXggYmFkIHNpemUgcGFzc2VkIHRvIHhtYWxsb2MoKS4KLQotTW9uIEp1biAgNyAxMjo0MToxMiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFUyk6ICBBZGQgLUkuLi9iZmQgZm9yIHN5c2RlcC5oIGFuZCBiZmQuaC4KLQkqIGNvbmZpZ3VyZS5pbjogIE5vIGxvbmdlciBuZWVkIHRvIGNvbmZpZ3VyZSB0byBnZXQgc3lzZGVwLmguCi0JKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogIEZpeCBzeW1ib2wgdGFibGUgaGFuZGxpbmcuCi0KLUZyaSBKdW4gIDQgMTc6MjA6MDMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoZmlsdGVyX3N5bWJvbHMpOiAgQ2Fubm90IGZpbHRlciB0aGUgc3ltYm9scwotCWluIHBsYWNlLCBiZWNhdXNlIHRoYXQgY29uZnVzZXMgdGhlIHJlbG9jcywgc28gdGFrZSBzZXBhcmF0ZQotCXBhcmFtZXRlciBmb3Igb3V0cHV0IGFycmF5LgotCSogb2JqY29weS5jIChzeW1wcCk6ICBNYWtlIHR3byB2YXJpYWJsZXM6IGlzeW1wcCBhbmQgb3N5bXBwLgotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6ICBBbGxvY2F0ZSBzZXBhcmF0ZSBhcnJheSAob3N5bXBwKQotCWZvciBmaWx0ZXJlZCBzeW1ib2xzLgotCi1GcmkgSnVuICA0IDEwOjUxOjQ0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNoYW5nZSByZWN1cnNpb24gdGVzdCB0byBwcmVzZW5jZSBvZiBhIGNvbmZpZ3VyZWQKLQl0ZXN0c3VpdGUgZGlyZWN0b3J5Ci0KLVRodSBKdW4gIDMgMTQ6MDU6NTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodW5kZXJzY29yZS5jKTogSGFjayB0aGUgYmFja3F1b3RlZCBjb21tYW5kIHNvIGl0Ci0JZG9lc24ndCBjYXVzZSBTb2xhcmlzIG1ha2UgdG8gYm9tYi4KLQotVGh1IEp1biAgMyAxMDo0MDoxOSAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIGFkZGVkIGMrK2ZpbHQgYW5kIG9iamNvcHkgdG8gTUFOUEFHRVMgdmFyaWFibGUKLQotVGh1IEp1biAgMyAwMDozMjo1MiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW5hbWUgTE9BRExJQkVTIHRvIEVYVFJBTElCUwotCi1XZWQgSnVuICAyIDE4OjMwOjI0IDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCi0KLQkqIGMrK2ZpbHQuMSwgb2JqY29weS4xOiAgbmV3IG1hbiBwYWdlcwotCi1GcmkgTWF5IDI4IDE1OjAxOjI0IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiAgQWxzbyBpbnN0YWxsIGFyIGFuZCByYW5saWIgaW4KLQkkKHRvb2xkaXIpL2JpbjsgIG5lZWRlZCBmb3IgYnVpbGRpbmcgbGliZ2NjLmEuCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6ICBGaXggdGhlIGNoZWNrCi0JImNvaW5jaWRlbnRhbCIgbGFiZWwgbWF0Y2hlcyBieSBkaXMtYWxsb3dpbmcgdW5kZWZpbmVkCi0Jb3IgY29tIHN5bWJvbHMuCi0KLVRodSBNYXkgMjcgMTY6NTg6MzEgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGJpdXRpbHMudGV4aTogIHJldmlzZWQgYysrZmlsdCBjaGFwdGVyCi0KLVdlZCBNYXkgMjYgMTc6MjQ6MTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6IFBhc3MgZG93biBDQyBhbmQgQ0ZMQUdTLgotCi1UdWUgTWF5IDI1IDAwOjI2OjQ3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHNsdXJwX3N5bXRhYik6IFByaW50IHdhcm5pbmcgZm9yIGJhZCBzeW1ib2wgdGFibGUuCi0JKGJmZF9lbGYzMl9maW5kX3NlY3Rpb24sIEVsZjMyX0ludGVybmFsX1NoZHIpOiBVcGRhdGVkCi0JZGVjbGFyYXRpb25zIGFuZCB1c2VzLgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogRG9uJ3QgYnVpbGQgYmludXRpbHMubW0uCi0KLUZyaSBNYXkgMjEgMTA6NTE6MTkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBubS5jOiBBZGQgLWYvLS1mb3JtYXQsIC1QLy0tcG9ydGFiaWxpdHksIC10Ly0tcmFkaXggb3B0aW9ucy4KLQlNYWtlIGdsb2JhbCB2YXJpYWJsZXMgc3RhdGljLgotCShtYWluKTogTWFrZSAtdiBsaWtlIC1uLCBub3QgLVYsIGFuZCBtYWtlIC1BIGxpa2UgLW8sIGZvciBQT1NJWC4yLgotCShzZXRfcHJpbnRfcmFkaXgsIHNldF9vdXRwdXRfZm9ybWF0LAotCXByaW50X3tvYmplY3RfZmlsZW5hbWUsYXJjaGl2ZV9maWxlbmFtZSxhcmNoaXZlX21lbWJlcixzeW1ib2xfaW5mb30KLQl7YnNkLHN5c3YscG9zaXh9KTogTmV3IGZ1bmN0aW9ucy4KLQkoZGlzcGxheV9maWxlLCBwcmludF9zeW1ib2xzKTogQ2FsbCB0aGVtLgotCi0JKiBhci5jOiBJbXByb3ZlIGVycm9yIG1lc3NhZ2VzLgotCi0JKiBubS5jIChtYWluKTogSGFuZGxlIGxvbmcgb3B0aW9ucyB0aGF0IGp1c3Qgc2V0IGEgZmxhZy4KLQotCSogbm0uYyAobWFpbiksIGFyLmMgKGRvX3Nob3dfdmVyc2lvbiksIG9iamNvcHkuYyAobWFpbiksIHNpemUuYwotCShtYWluKTogRXhpdCBhZnRlciBwcmludGluZyB0aGUgdmVyc2lvbiBudW1iZXIsIHBlciB0aGUgR05VIGNvZGluZwotCXN0YW5kYXJkcy4KLQotTW9uIE1heSAxNyAxMzoyMDoyNSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogUkVBRE1FLCBNYWtlZmlsZS5pbjogIE1pbm9yIHVwZGF0ZXMgZm9yIDIuMi4KLQotRnJpIE1heSAxNCAxMToxMjoyNiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHVuZGVyc2NvcmUuYyk6ICBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlCi0JKHVzaW5nIG5tKSBhIGZpbGUgd2l0aCB0aGUgdmFyaWFibGUgcHJlcGVuZHNfdW5kZXJzY29yZS4KLQkqIE1ha2VmaWxlLmluIChjKytmaWx0KTogIExpbmsgdW5kZXJzY29yZS5vIHdpdGggY3BsdXMtZGVtLm8KLQlzbyB0aGF0IGluaXRpYWwgdW5kZXJzY29yZXMgZ2V0IHJlbW92ZWQgaWZmIGFwcHJvcHJpYXRlLgotCSogYmludXRpbHMudGV4aTogIFByZWxpbWluYXJ5IGRvY3VtZW50YXRpb24gZm9yIGMrK2ZpbHQuCi0JKiBNYWtlZmlsZS5pbiwgYmludXRpbHMudGV4aTogIFNldCB0byB2ZXJzaW9uIDIuMi4KLQotCSogTkVXUzogIE1lbnRpb24gY29weS0+b2JqY29weSByZW5hbWluZyBhbmQgbmV3IGMrK2ZpbHQgcHJvZ3JhbS4KLQotV2VkIE1heSAxMiAxMjowNTozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjcGx1cy1kZW0ubywgJChERU1BTkdMRVJfUFJPRykpOiBCdWlsZCB0aGUKLQlkZW1hbmdsZXIgdmlhIGNwbHVzLWRlbS5vLCByYXRoZXIgdGhhbiBkaXJlY3RseSBmcm9tIHRoZSAuYyBmaWxlLgotCi0JKiBvYmpjb3B5LmM6IFJlbmFtZWQgZnJvbSBjb3B5LmMsIHVwZGF0ZWQgY29tbWVudHMgYWNjb3JkaW5nbHkuCi0JKiBNYWtlZmlsZS5pbiwgYmludXRpbHMudGV4aTogUmVuYW1lZCBjb3B5IHRvIG9iamNvcHkuCi0JKiBpcy1zdHJpcC5jLCBtYXliZS1zdHJpcC5jLCBub3Qtc3RyaXAuYzogVXBkYXRlZCBjb21tZW50cyBmb3IKLQlyZW5hbWUgb2YgY29weSB0byBvYmpjb3B5LgotCi1Nb24gTWF5IDEwIDE3OjIwOjE4IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXhpIChzdHJpcCwgLXYgb3B0aW9uKTogIEZpeCB0eXBvLgotCi1GcmkgTWF5ICA3IDEzOjU3OjUwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFJVTlRFU1QpOiBEZWZpbmUuCi0JKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gUlVOVEVTVC4KLQotVHVlIE1heSAgNCAxMDowNjo1MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChERU1BTkdMRVJfUFJPRyk6IE5hbWUgaXQgYysrZmlsdC4KLQkoUFJPRyk6IEFsc28gYnVpbGQgYW5kIGluc3RhbGwgQ09QWV9QUk9HLgotCi1Nb24gTWF5ICAzIDE5OjExOjQ4IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIENoYW5nZSBkZWZpbml0aW9uIG9mICQodG9vbGRpcikgdG8gbWF0Y2ggRlNGLgotCi1XZWQgQXByIDI4IDIzOjQxOjMyIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogc2l6ZS5jICh1c2FnZSk6IEFkZCBtaXNzaW5nIG9wdGlvbnMuCi0JKG1haW4pOiBDbGVhbiB1cCBvcHRpb24gcGFyc2VyLgotCi0JKiBvYmpkdW1wLmMgKHVzYWdlKTogQWRkIG1pc3Npbmcgb3B0aW9ucy4KLQkoZGlzcGxheV9maWxlKTogUHJpbnQgcHJvZ3JhbSBuYW1lIGJlZm9yZSBjYWxsaW5nCi0JYmRmX3BlcnJvci4KLQotCSogbm0uYyAodXNhZ2UpOiBBZGQgbWlzc2luZyBvcHRpb25zLgotCShtYWluKTogQ2xlYW4gdXAgb3B0aW9uIHBhcnNlci4KLQkoZGlzcGxheV9maWxlKTogUHJpbnQgcHJvZ3JhbSBuYW1lIGJlZm9yZSBjYWxsaW5nCi0JYmRmX3BlcnJvci4KLQotCSogY29weS5jIChjb3B5X3VzYWdlLCBzdHJpcF91c2FnZSk6IEFkZCBtaXNzaW5nIG9wdGlvbnMuCi0KLQkqIGFyLmMgKHVzYWdlKTogTmV3IGZ1bmN0aW9uLgotCShtYWluKTogQ2FsbCBpdC4KLQkob3Blbl9pbmFyY2gsIGRvX3F1aWNrX2FwcGVuZCk6IFByaW50IHByb2dyYW0gbmFtZSBiZWZvcmUgY2FsbGluZwotCWJkZl9wZXJyb3IuCi0KLVRodSBBcHIgMjIgMTU6MDE6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBubS5jIChtYWluKTogQWNjZXB0IGFuZCBpZ25vcmUgLUEgYW5kIC1CIGZvciBNSVBTIGNvbXBhdGliaWxpdHkuCi0KLU1vbiBBcHIgMTkgMTQ6MDY6NTkgMTk5MyAgUm9iIFNhdm95ZSAgKHJvYkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkZWQgRkxBR1NfVE9fUEFTUyBzbyB0ZXN0cyBnZXQgcnVuIG9uIGZyZXNobHkKLQlidWlsdCBiaW5hcmllcyBpZiB0aGV5IGV4aXN0LiAob3RoZXJ3aXNlIHRoZSBwYXRoKQotCi1XZWQgQXByICA3IDIyOjIyOjUwIDE5OTMgIFJvYiBTYXZveWUgIChyb2JAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IENoYW5nZWQgY2hlY2sgdGFyZ2V0IHRvIHVzZSBEZWphR251LgotCi1UaHUgQXByICAxIDEyOjM3OjEzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIGFtMjlrLXBpbnNuLmMsIGk5NjAtcGluc24uYy4KLQlvYmpkdW1wLmM6IGEyOWsgYW5kIGk5NjAgYXJlIGBkaXNhc3NlbWJsZScgbm90IGBwcmludCcuCi0KLQkqIG9iamR1bXAuYzogUmVuYW1lIHByaW50X2FkZHJlc3MgdG8gb2JqZHVtcF9wcmludF9hZGRyZXNzCi0JYW5kIGNoYW5nZSBwYXJhbWV0ZXJzLgotCShkaXNhc3NlbWJsZV9kYXRhKTogVXNlIG9iamR1bXBfcHJpbnRfYWRkcmVzcy4KLQotV2VkIE1hciAzMSAxMDoyNToyOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogcHJpbnRfaW5zbl9zcGFyYyBpcyBub3cgYQotCWBkaXNhc3NlbWJsZScgbm90IGEgYHByaW50Jy4KLQlNYWtlZmlsZS5pbjogUmVtb3ZlIHNwYXJjLXBpbnNuLmMgKG5vdyBpbiBsaWJvcGNvZGVzLmEpLgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBVc2UgbmV3IHJlYWRfbWVtb3J5X2Z1bmMgc3R1ZmYuCi0KLVRodSBNYXIgMjUgMTA6Mzg6MTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGZwcmludGYpOiBEZWNsYXJhdGlvbiBvZiB2YXJpYWRpYyBmdW5jdGlvbiBoYWQgYmV0dGVyCi0JYmUgYSBwcm90b3R5cGUgZm9yIEFOU0kgQyBzeXN0ZW1zLgotCi1Nb24gTWFyIDIyIDIzOjE5OjQ2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbmFtZSB0ZXN0LWluc3RhbGwgdG8gaW5zdGFsbC1jaGVjawotCi1GcmkgTWFyIDE5IDE0OjQwOjA4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBBZGQgSDg1MDAuCi0KLUZyaSBNYXIgMTkgMTA6NTY6NTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAodXNhZ2UpOiBNZW50aW9uIGxvbmcgb3B0aW9ucy4KLQotVGh1IE1hciAxOCAxNDoyMjoxNyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIG5tLmM6ICBNb2RpZnkgYmVoYXZpb3Igb2YgLW8gZmxhZyBmb3IgYXJjaGl2ZXMgdG8gbWF0Y2gKLQlCU0Q0LjQgYW5kIFN1bm9zIDQ6ICBQcmVmaXggYXJjaGl2ZSBuYW1lIGJlZm9yZSBlYWNoIGxpbmUuCi0KLQkqIG02OGstcGluc24uYzogIFJlbW92ZWQuICBTdWJzdW1lZCBieSAuLi9vcGNvZGVzL202OGstZGlzLmMuCi0JKiBpMzg2LXBpbnNuLmM6ICBSZW1vdmVkLiAgU3Vic3VtZWQgYnkgLi4vb3Bjb2Rlcy9pMzg2LWRpcy5jLgotCSogTWFrZWZpbGUuaW46ICBBZGp1c3QgYWNjb3JkaW5nbHkuCi0JKiBvYmpkdW1wLmM6ICBTdXBwb3J0IG5ldy1zdHlsZSBkaXNhc3NlbWJsZXJzIChvbmVzIHRoYXQgdXNlCi0JdGhlIGludGVyZmFjZSBvZiAuLi9pbmNsdWRlL2Rpcy1hc20uaCkuCi0KLVRodSBGZWIgMjUgMTU6NTc6MDAgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFdoZW4gbWFraW5nIHRhciBmaWxlLCByZW1vdmUgdGV4aW5mby8qLAotCWV4Y2VwdCBmb3IgdGV4aW5mby90ZXhpbmZvLnRleC4KLQkqIGFyZHVwLmM6ICBBZGQgZXh0ZXJuIGRlY2xhcmF0aW9uIG9mIHN0cmR1cC4KLQkqIE1ha2VmaWxlLmluICh0ZXN0c3VpdGUpOiAgQWRkICdlbHNlIHRydWUnIHNpbmNlIG90aGVyd2lzZQotCVVsdHJpeCAvYmluL3NoIGNvbXBsYWlucy4KLQotV2VkIEZlYiAyNCAxOTo0NDoxOCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgU2V0IFZFUlNJT04gdG8gMi4xLgotCSogUkVBRE1FLCBORVdTOiBVcGRhdGVzLgotCSogbm0uYzogIEFkZCAtdiBhcyBhIHN5bm9ueW0gZm9yIC1WLgotCi1UdWUgRmViIDIzIDE5OjAwOjUwIDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgdGVzdHN1aXRlIHRvIGNvbmZpZ2RpcnMuCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgc3VwcG9ydCBmb3IgYnVpbGRpbmcgdGVzdHN1aXRlLgotCi1Nb24gRmViIDIyIDIyOjUyOjEwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogIFByaW50IGZ1bmN0aW9uIG5hbWVzIHdoZW4KLQlnaXZlbiBieSBiZmRfZmluZF9uZWFyZXN0X2xpbmUuICBJZiBub3QgLSBzdGlsbCBwcmludAotCWxpbmUgbnVtYmVycy4KLQotTW9uIEZlYiAyMiAwNzo1NDowMyAxOTkzICBNaWtlIFdlcm5lciAgKG10d0Bwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBiaW51dGlscy90ZXN0c3VpdGU6IG1hZGUgbW9kaWZpY2F0aW9ucyB0byB0ZXN0Y2FzZXMsIGV0Yy4sIHRvIGFsbG93Ci0gICAgICAgIHRoZW0gdG8gd29yayBwcm9wZXJseSAgZ2l2ZW4gdGhlIHJlb3JnYW5pemF0aW9uIG9mIGRlamEtZ251IGFuZCB0aGUKLQlyZWxvY2F0aW9uIG9mIHRoZSB0ZXN0Y2FzZXMgZnJvbSBkZWphLWdudSB0byBhICJ0b29sIiBzdWJkaXJlY3RvcnkuCi0KLU1vbiBGZWIgMjIgMTA6Mjc6MjQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGR1bXBfZGF0YSk6IEZyZWUgdXAgc2VjdGlvbiBjb250ZW50cyBlYWNoIHRpbWUKLQl0aHJvdWdoIHRoZSBsb29wLiAgUmVwb3J0ZWQgYnkgbWlueWFyZEBibnIuY2EuCi0KLVN1biBGZWIgMjEgMTA6NTU6NTUgMTk5MyAgTWlrZSBXZXJuZXIgIChtdHdAcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMvdGVzdHN1aXRlOiBJbml0aWFsIGNyZWF0aW9uIG9mIGJpbnV0aWxzL3Rlc3RzdWl0ZS4KLQlNaWdyYXRlZCBkZWphZ251IHRlc3RjYXNlcyBhbmQgc3VwcG9ydCBmaWxlcyBmb3IgdGVzdGluZyBubSB0bwotCWJpbnV0aWxzL3Rlc3RzdWl0ZSBmcm9tIGRlamEtZ251LiAgVGhlc2UgZmlsZXMgd2VyZSBtb3ZlZCAiYXMgaXMiCi0Jd2l0aCBubyBtb2RpZmljYXRpb25zLglUaGlzIG1pZ3JhdGlvbiBpcyBwYXJ0IG9mIGEgbWFqb3Igb3ZlcmhhdWwKLQlvZiBkZWphZ251LiAgVGhlIG1vZGlmaWNhdGlvbnMgdG8gdGhlc2UgdGVzdGNhc2VzLCBldGMuLCB3aGljaAotCXdpbGwgYWxsb3cgdGhlbSB0byB3b3JrIHdpdGggdGhlIG5ldyB2ZXJzaW9uIG9mIGRlamFnbnUgd2lsbCBiZQotCW1hZGUgaW4gYSBmdXR1cmUgdXBkYXRlLgotCi1GcmkgRmViIDEyIDEwOjA1OjIwIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTElCSUJFUlRZX1NSQ19ESVIsIExJQklCRVJUWV9CSU5fRElSKTogTmV3IG1hY3Jvcy4KLQkqIE1ha2VmaWxlLmluIChMSUJJQkVSVFkpOiAgVXNlIExJQklCRVJUWV9CSU5fRElSLgotCSogTWFrZWZpbGUuaW4gKERFTUFOR0xFUl9QUk9HKTogIE5ldyBwcm9ncmFtIHRvIGJ1aWxkLiAgQWRkIG1hY3JvCi0JYW5kIHJ1bGUuCi0JKiBNYWtlZmlsZS5pbiAoUFJPR1MpOiAgQWRkIERFTUFOR0xFUl9QUk9HLgotCi1UdWUgSmFuIDI2IDExOjU2OjMzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29weS5jLCBubS5jLCBvYmpkdW1wLmMsIHNpemUuYzogVXNlIG5ldyBiZmRfaXNfY29tX3NlY3Rpb24KLQltYWNybyByYXRoZXIgdGhhbiBjaGVja2luZyBmb3IgZXF1YWxpdHkgdG8gYmZkX2NvbV9zZWN0aW9uLgotCi1GcmkgSmFuICA4IDE1OjUwOjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogRml4IGNvZGUgdG8gZmluZCBmaXJzdCB1c2VsZXNzCi0Jc3ltYm9sLgotCi1UaHUgSmFuICA3IDEzOjEzOjMxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogVXNlIG1pcHNfcHJpbnRfaW5zbiBmb3IgTUlQUy4KLQlEb24ndCBjb3JlIGR1bXAgaWYgYmZkX2ZpbmRfbmVhcmVzdF9saW5lIHJldHVybnMgZmFsc2UuCi0KLVdlZCBKYW4gIDYgMTc6MTQ6MDEgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IGtub3cgaG93IHRvIGRpc2Fzc2VtYmxlIHo4MDAwcwotCXRvby4KLQotV2VkIEphbiAgNiAxNToxNjoyNyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYXJzdXAuaCAoaW50ZXJhY3RpdmUpLCBidWNvbW0uaCAocHJvZ3JhbV9uYW1lKTogIFByZWZpeAotCXdpdGggJ2V4dGVybicsIHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gc29tZSBjb21waWxlcnMuCi0KLVdlZCBKYW4gIDYgMTU6MTQ6MTEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhcnBhcnNlLnk6IGZpeCB1bm5lY2Vzc2FyeSBzaGlmdC9yZWR1Y2UKLQotVHVlIERlYyAyMiAxNTo0Njo1NiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgTWFrZSBjaGVjayBkZXBlbmQgb24gYWxsLgotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBzeXNkZXAuaC4KLQkqIHNpemUuYzogIFVzZSAldSBmb3JtYXQgd2hlcmUgYXBwcm9wcmlhdGUuCi0JKiBvYmpkdW1wLmM6ICBTdGFuZGFyZGl6ZTogIExfU0VUIC0+IFNFRUtfU0VULgotCSogb2JqZHVtcC5jOiAgVXNlIG5ldyBtYWNybyBiZmRfYXN5bWJvbF9iZmQuCi0JKiBjb25maWd1cmUuaW46ICBBbGxvdyBzdGQtaG9zdCBhcyB0aGUgZGVmYXVsdCAke215c19ob3N0fS4KLQotVGh1IERlYyAxNyAxOTozODoxOSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBkdmkgdGFyZ2V0LCBkZWZpbmUgYW5kIHVzZSBURVhJMkRWSQotCi1UdWUgRGVjIDE1IDE4OjA1OjA3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdCk6ICBGaXggcGVybWlzc2lvbnMgYmVmb3JlIHJlbGVhc2UuCi0JKiBzaXplLmM6ICBVc2UgYmZkX3NpemVfdHlwZSAoYW5kIGxvbmcpIHdoZXJlIGFwcHJvcHJpYXRlLgotCSogYXIuYzogIE1ha2Ugd3JpdGluZyBhIG1hcCB0aGUgZGVmYXVsdCwgdG8gYmUgY29tcGF0aWJsZQotCXdpdGggU1lTViBhbmQgUG9zaXguMi4gIFJlbW92ZSBzb21lIGJvZ3VzIGtsdWRnZXMgdGhhdAotCWhhbmRsZWQgX18uU1lNREVGIGRpcmVjdGx5LgotCSogTkVXUzogIE5ldyBmaWxlLgotCi1Nb24gTm92ICA5IDEzOjM2OjUzIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGZsZXggbm8gbG9uZ2VyIG5lZWRzIHRoZSAtUyBmbGFnCi0KLVNhdCBOb3YgIDcgMTU6MDY6MTMgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0gICAgICAgICogYXIuYyAoZXh0cmFjdF9maWxlKTogdXRpbWUgbmVlZHMgYSBwb2ludGVyIHRvIGEgdXRpbWJ1ZgotCi0JKiBNYWtlZmlsZS5pbjogaGFuZGxlIC1JIGluY2x1ZGVzIGJldHRlciwgYWRkaW5nICQoQkFTRURJUikvYmZkIHRvCi0JdGhlIGxpc3QgKHNpbmNlIHNvbWUgb2YgdGhlIGJmZC9ob3N0cy8qLmggZmlsZXMgaW5jbHVkZSBvdGhlcgotCWZpbGVzIGZyb20gdGhhdCBkaXJlY3RvcnkpCi0KLUZyaSBOb3YgIDYgMDA6MTI6NTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGk5NjAtcGluc24uYyAoTUVNX01BWCwgTUVNX1NJWik6ICBTZXQgdXBwZXIgYm91bmQgcHJvcGVybHkuCi0KLVRodSBOb3YgIDUgMDM6Mzc6MTUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQlDbGVhbiB1cCBzb21lIG9sZCBCRkQgYW5zaWZpY2F0aW9uIG1hY3Jvcy4KLQotCSogYXJzdXAuaCwgYnVjb21tLmgsIG9iamR1bXAuaDogIFJlbW92ZSBFWEZVTiBmcm9tIGJpbnV0aWxzLgotCUl0IHN0aWxsIHJlbWFpbnMgYXMgYSBsb2NhbCBtYWNybyBpbiBnbWFsbG9jLmMsIHdoaWNoIGlzIGRlcml2ZWQKLQlmcm9tIHNvbWUgb3RoZXIgY29weSBvZiBHTlUgTWFsbG9jIHNvbWV3aGVyZSAoRklYTUUpLgotCi0JKiBhci5jLCBvYmpkdW1wLmMsIHNpemUuYzogIFJlcGxhY2UgRVhGVU4gd2l0aCBQUk9UTy4gIE1ha2Ugc3RhdGljCi0JZm5zIHJlYWxseSBzdGF0aWMuCi0JKiBhcnN1cC5oOiAgRGVjbGFyZSBleHRyYWN0X2ZpbGVzLgotCi1Nb24gTm92ICAyIDEyOjQyOjExIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYXIuYyAoZXh0cmFjdF9maWxlKTogaW5zdGVhZCBvZiBjaGVja2luZyBVU0c6IGlmIFBPU0lYX1VUSU1FLAotCXVzZSB1dGltZSBhbmQgdXRpbWJ1ZiBzdHJ1Y3R1cmUsIG90aGVyd2lzZSBpZiBVU0VfVVRJTUUgdXNlIHV0aW1lCi0JYW5kIGFycmF5IG9mIHR3byBsb25ncywgb3RoZXJ3aXNlIHVzZSB1dGltZXMuCi0KLVRodSBPY3QgMTUgMTM6NTc6MzUgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLnRleDogIERvY3VtZW50IHllc3RlcmRheSdzIGNoYW5nZXMgdG8gc3RyaXAgYW5kIGNvcHkuCi0KLVdlZCBPY3QgMTQgMTM6MjI6MTQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvcHkuYzogIFJlLWRvIGNvbW1hbmQtbGluZSBwYXJzaW5nIHRvIHVzZSBnZXRvcHRfbG9uZygpLgotCUFkZCBsb25nIG9wdGlvbiBuYW1lcy4gIFJlLXRoaW5rIG9wdGlvbiBsZXR0ZXJzIHRvIGJlIG1vcmUKLQljb25zaXN0ZW50LgotCSogY29weS5jOiAgTmV3IGZ1bmN0aW9uIGZpbHRlcl9zeW1ib2xzKCkgZm9yIHN0cmlwcGluZyBvbmx5Ci0JZGVidWctc3ltYm9scyBhbmQvb3IgbG9jYWwgc3ltYm9scy4gIFVzZSB0aGVzZSB0byBzdXBwb3J0Ci0JdGhlIHByZXZpb3VzbHktbWlzc2luZyBvcHRpb25zIG9mIHRoZSBvbGQgRlNGIHN0cmlwLgotCi1UdWUgT2N0IDEzIDAxOjI0OjIwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhvc3QpOiAgVXNlICR7c3JjZGlyfS8uLi9iZmQvY29uZmlndXJlLmhvc3QgcmF0aGVyCi0JdGhhbiByZXBlYXRpbmcgYSBjb3B5IG9mIGl0IGhlcmUuCi0KLVdlZCBPY3QgIDcgMTI6NTM6NTIgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvcHkuYyAobWFpbik6IEV2ZW4gaWYgaXNfc3RyaXAsIGFjY2VwdCAtZCBhcmd1bWVudCBpbmRpY2F0aW5nCi0JYWx0ZXJuYXRlIG91dHB1dCBmb3JtYXQuICBOZWVkZWQgYnkgZ2RiIGZvciBOaW5keS4KLQotCSogbTY4ay1waW5zbi5jIChwcmludF9pbnNuX2FyZyk6IEhhbmRsZSBuZXcgImAiIG9wZXJhbmQgdHlwZS4KLQotVHVlIE9jdCAgNiAxNjozMzo1NiAxOTkyICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXhpOiAgYWRkZWQgZG9jdW1lbnRhdGlvbiBmb3IgImNvcHkiCi0KLVR1ZSBPY3QgIDYgMTQ6MjI6NTYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IFBlcnNTb255KQotCi0JKiBNYWtlZmlsZS5pbiAoKmNsZWFuIHJ1bGVzKTogU29tZSBjbGVhbmluZyB1cC4KLQkqIE1ha2VmaWxlLmluIChkaXN0KTogTWFrZSBkaXN0c3R1ZmYgaW4gZ3Byb2YgZm9yIGEgZGlzdC4KLQotCSogYXIuYyAoZG9fc2hvd192ZXJzaW9uKTogIE5ldyBmdW5jdGlvbi4KLQkqIGFyLmMgKG1haW4pOiAgRml4IHNvICJhciAtViIgd29ya3MuCi0KLVRodSBPY3QgIDEgMjI6NDQ6NDUgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IG5vdyB1c2VzIHRoZSBjcHUtdmVuZG9yLW9zIHRyaXBsZSBpbnN0ZWFkIG9mCi0JbmVzdGVkIGNhc2VzLgotCi1GcmkgU2VwIDI1IDIyOjQxOjA4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBpOTYwLXBpbnNuLmM6ICBDaGFuZ2UgYnplcm8gdG8gbWVtc2V0LgotCSogc3BhcmMtcGluc24uYzogIENoYW5nZSBpbmRleCB0byBzdHJjaHIuCi0KLU1vbiBTZXAgMjEgMTQ6Mzk6NTYgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtNjhrLXBpbnNuIChwcmludF9pbnNuX2FyZywgZmV0Y2hfYXJnKTogYWRkZWQgc3VwcG9ydCBmb3IKLQlvcGVyYW5kcyB0byBtZW1vcnkgbWFuYWdlbWVudCBpbnN0cnVjdGlvbnMsIGZyb20gV1JTLgotCi1UdWUgU2VwIDE1IDE1OjI2OjM4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBpZiAkKHRvb2xkaXIpIGV4aXN0cywgaW5zdGFsbCBubSBhbmQKLQlzdHJpcCBpbiAkKHRvb2xkaXIpL2Jpbi4KLQotVGh1IFNlcCAgMyAxMTo1Nzo0MCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgTGV0J3MgY2FsbCBpdCB2ZXJzaW9uIDIuMC4KLQotV2VkIFNlcCAgMiAwMDoyNToxMyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQnVtcCB0byB2ZXJzaW9uIDAuOTguCi0JKiBUT0RPLCBSRUFETUU6ICBNaW5vciB1cGRhdGVzLgotCi0JKiBNYWtlZmlsZS5pbjogIEFkZGVkIG1vc3RseWNsZWFuLCBkaXN0Y2xlYW4gcnVsZXMsCi0JYW5kIGNsZWFuZWQgdXAgY2xlYW4sIHJlYWxjbGVhbi4KLQotU3VuIEF1ZyAzMCAyMToxODo1OSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtYXAgcHJvZ3JhbSBuYW1lcyB0aHJvdWdoIHByb2dyYW1fdHJhbnNmb3JtX25hbWUKLQl3aGVuIGluc3RhbGxpbmcuCi0KLVN1biBBdWcgMzAgMTg6MDk6MDMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEJ1bXAgdG8gdmVyc2lvbnMgMS45Ny45MC4KLQkqIGNwbHVzLWRlbS5jOiAgUmVtb3ZlZC4gIFdhcyBub3doZXJlIHVzZWQgLSBhbmQgaWYgc29tZQotCXByb2dyYW1zIGFyZSBjaGFuZ2VkIHRvIHRvIGRlbWFuZ2xpbmcgc2hvdWxkIG5vdyB1c2UgdGhlCi0JdmVyc2lvbnMgaW4gbGliaWJlcnR5LgotCi1UaHUgQXVnIDI3IDEyOjU4OjA5IDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIHdlMzJrCi0KLU1vbiBBdWcgMjQgMTQ6NTM6NDIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKG1hcF9vdmVyX21lbWJlcnMpOiBpZiB0aGUgZWxlbWVudCBvZiB0aGUgYXJjaGl2ZSBoYXMgYQotCW51bGwgbmFtZSwgZmlsbCBpdCBpbi4KLQotCSogbm0uYyAoZG9fb25lX3JlbF9maWxlKTogb25seSB3YXJuIGlmIGEgYmZkJ3MgZmxhZ3Mgc2F5IHRoZXJlCi0Jd2lsbCBiZSBzeW1ib2xzIGFuZCB0aGVyZSBhcmVuJ3QgYW55LgotCi1XZWQgQXVnIDE5IDExOjIwOjI1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbTY4ay1waW5zbi5jOiBoYW5kbGUgbmV3IG9wZXJhbmQgdHlwZSAncicsIGludHJvZHVjZWQgZm9yIGNhczIuCi0KLVR1ZSBBdWcgMTggMjA6NDU6NDggMTk5MiAgUm9iIFNhdm95ZSAgKHJvYkBjeWdudXMuY29tKQotCi0JKiBubS5jIG9iamR1bXAuYzogQWRkZWQgc3VwcG9ydCBmb3IgYSArdmVyc2lvbiAoLVYpCi0JdG8gcHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyLgotCi0JKiBhci5jLCBjb3B5LmM6IEFkZGVkIHN1cHBvcnQgZm9yIGEgLVYgb3B0aW9uIHRvIHByaW50Ci0JdGhlIHZlcnNpb24gbnVtYmVyLgotCi1UdWUgQXVnIDE4IDEzOjI4OjQ0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWFwb2xsbzY4djogcmVtb3ZlZCAtZyBmcm9tIENDIGRlZmluaXRpb24uCi0KLQkqIE1ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KLQotTW9uIEF1ZyAxNyAxODozMzo0MSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIG02OGstcGluc24uYzogIE1pbm9yIGZpeCBpbiBzdHlsZSBvZiBvdXRwdXQgKGRvbid0IHVzZQotCXJhbmdlIHRvIGluZGljYXRlIGZsb2F0aW5nIHBvaW50IGNvbnRyb2wgcmVnaXN0ZXJzKS4KLQotVHVlIEF1ZyAxMSAyMzo0MjoyMSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYXIuYyAobWFpbik6ICBEb24ndCAqYWx3YXlzKiBzZXQgdGhlIHZlcmJvc2UgZmxhZyEKLQotV2VkIEF1ZyAgNSAxMToyNToyNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvcHkuYzogIFdoZW4gaXNfc3RyaXAgKGJlY2F1c2UgaXQgaXMgaW52b2tlZCBhcyB0aGUgc3RyaXAKLQlwcm9ncmFtKSwgZm9sbG93IHRyYWRpdGlvbmFsIGFyZ3YgcHJvY2Vzc2luZzoKLQknc3RyaXAgZmlsZTEgZmlsZTInIG5vdyBzdHJpcHMgZmlsZTEgYW5kIGZpbGUyLCByYXRoZXIKLQl0aGFuIHN0cmlwcGluZyBmaWxlMSAoYXMgaW5wdXQpLCBsZWF2aW5nIG91dHB1dCBpbiBmaWxlMi4KLQotTW9uIEp1bCAyNyAxNjoyODowOCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV9pbmZvLCBkaXNwbGF5X2luZm9fdGFibGUpOiAgQ2FsbAotCWJmZF9zZXRfZm9ybWF0KCkgb24gZHVtbXkgYmZkIGJlZm9yZSB1c2luZyBpdCAodHdpY2UpLgotCSogYXIuYzogIE1ha2Ugc3VyZSBhcmNoaXZlIGlzIGNyZWF0ZWQgb24gY29tbWFuZCAncicKLQlldmVuIHdoZW4gbm8gZWxlbWVudHMgYXJlIGluc2VydGVkLiAgKENsZWFuIHVwIGFuZAotCXNpbXBsaWZ5IHNvbWUgbm9uLXdvcmtpbmcgcmVsYXRlZCBjb2RlLikKLQotTW9uIEp1bCAyMCAwMjo0ODozOCAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogaHBwYSBzdXBwb3J0IGRvZXNuJ3QgYXNzdW1lIGhwIE9TIChmcm9tIHNlZikuCi0KLVNhdCBKdWwgMTggMTQ6MzU6MjIgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBocHBhIGhvc3RzIChic2QgJiBocHV4KSwgZXJyb3IgbWVzc2FnZXMKLQl0byBzdGRlcnIsIG5vdCBzdGRvdXQKLQotRnJpIEp1bCAxNyAxODozOTo0NCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGFyLjEsIGJpbnV0aWxzLnRleGksIGk5NjAtcGluc24uYywgbm0uMSwgb2JqZHVtcC4xLCByYW5saWIuMSwKLQkgIHNpemUuMSwgc3BhcmMtcGluc24uYywgc3RyaXAuMTogcmVtb3ZlZCByY3NpZCdzLgotCi1UaHUgSnVsIDE2IDE2OjU1OjI0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuZG9zOiByZW1vdmVkIHJjc2lkLgotCi1UaHUgSnVsIDE2IDA4OjIzOjA3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfYmZkKTogcHJpbnQgc3RhdGUgb2YgQkZEX0lTX1JFTEFYQUJMRSB0b28KLQotVHVlIEp1biAzMCAyMDoyNjoxNSAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgcHJvZ3JhbV9zdWZmaXggKHBhcmFsbGVsIHRvIHByb2dyYW1fcHJlZml4KQotCi1UaHUgSnVuIDI1IDA0OjUyOjQ1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBubS5jIChzb3J0ZXJzKTogIExpbnQuICBSZW1vdmUgZXhjZXNzIHdoaXRlc3BhY2UuCi0KLVdlZCBKdW4gMjQgMTM6NDg6MDcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIG5tLmMgKHZhbHVlb2YgbWFjcm8pOiAgQWRkIG1pc3NpbmcgcGFyZW50aGVzZXMuCi0JKFRoZWlyIGxhY2sgc2NyZXdlZCB1cCBudW1lcmljX2ZvcndhcmQoKS4pCi0KLVN1biBKdW4gMTQgMTA6MzM6MjcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9lbGZfc3RhYnMpOiAgQWxzbyBkdW1wIC5zdGFiLmluZGV4IGFuZAotCS5zdGFiLmV4Y2wgc2VjdGlvbnMuCi0JKGR1bXBfZWxmX3N0YWJzXzEpOiAgU3BsaXQgb3V0IG1haW4gYm9keSBvZiBvbGQgZHVtcF9lbGZfc3RhYnMuCi0JKiBvYmpkdW1wLjEsIGJpbnV0aWxzLnRleGk6ICBEb2N1bWVudCBuZXcgc2VjdGlvbnMgZHVtcGVkLgotCi1GcmkgSnVuIDEyIDIyOjIzOjM1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzaXplLmMsIG9iamR1bXAuYywgYnVjb21tLmM6ICBMaW50LgotCi1UaHUgSnVuIDExIDAxOjE5OjA2IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGR1bXBfZWxmX3N0YWJzKTogTmV3IGZlYXR1cmU6IC0tc3RhYnMgcHJpbnRzIG91dCBhCi0JLnN0YWIgc2VjdGlvbiBmcm9tIGFuIEVMRiBmaWxlLiAgSW5zdGFsbGVkIHVuZGVyICNpZmRlZgotCUVMRl9TVEFCX0RJU1BMQVkgc28gaXQgY2FuIGJlIGVhc2lseSBkaXNhYmxlZCwgc2luY2UgaXQgcmVxdWlyZXMKLQliZmQtaW50ZXJuYWxzIGhlYWRlciBmaWxlcyBhbmQgc3VjaC4KLQkqIG9iamR1bXAuMSwgYmludXRpbHMudGV4aTogIFVwZGF0ZSBmb3IgLS1zdGFicy4gIEFsc28gZml4Ci0Jb2JqZHVtcCdzIGRvYyB0byB1c2UgLS0gcmF0aGVyIHRoYW4gKyBmb3IgbG9uZyBvcHRpb25zLgotCShGSVhNRTogIE5vdCB5ZXQgZml4ZWQgZXZlcnl3aGVyZSBpbiBiaW51dGlscy50ZXhpbmZvLikKLQotV2VkIEp1biAxMCAwNzo1MzoyNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jKGRpc3BsYXlfaW5mbyksIHBhdGNoZXMgZnJvbQotCW1vaHJpbmdAaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZSB0byBwcmludCB0aGUgdGFibGUgbXVjaCBtb3JlCi0JbmljZWx5LgotCi1UaHUgTWF5IDI4IDEzOjM2OjE2IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jOiAgQWRkIGFub3RoZXIgZW51bS0+aW50IGNhc3QsIGZvciB0aGUgc2FrZSBvZgotCW9sZCBjb21waWxlcnMgKHN1Y2ggYXMgUENDKS4KLQotV2VkIE1heSAyNyAxMzowMTo0NCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGFybGV4Lmw6ICBEb24ndCBpbmNsdWRlIDxzeXNkZXAuaD4gKHVubmVlZGVkIGNvbmZsaWN0cykuCi0JQWRkIGRlY2xhcmF0aW9uIG9mIHN0cmR1cCgpLgotCi1GcmkgTWF5IDIyIDEzOjQwOjM3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFVzZSBzcmNkaXIgaW5zdGVhZCBvZiBWUEFUSCBpbiBsZGdyYW0vbGRsZXgKLQlydWxlcywgc2luY2UgdGhlc2UgYXJlIHVzZWQgd2hlbiBidWlsZGluZyBhIGRpc3RyaWJ1dGlvbi4KLQkqIE1ha2VmaWxlLmluIChhcmxleC5jKTogIERvbid0IHJlLWRpcmVjdCBvdXRwdXQsIHNpbmNlIHRoYXQKLQlsZWF2ZXMgYSBib2d1cyBvdXRwdXQgZmlsZXMgaWYgaXQgZmFpbHMuCi0KLQkqIGFybGV4Lmw6ICBNYWtlIHdvcmsgd2l0aCBsZXgsIGZvciB3aGF0IGl0J3Mgd29ydGguCi0JKiBNYWtlZmlsZS5pbjogIEJldHRlciBsZXggc3VwcG9ydC4KLQkqIE1ha2VmaWxlLmluIChkaXN0KTogIEdlbmVyYXRlIGZsZXggYW5kIGJpc29uIG91dHB1dHMKLQlmb3IgZGlzdHJpYnV0aW9uLgotCi1UaHUgTWF5IDE0IDE3OjE3OjU5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGdldCBCSVNPTiBkZWZpbml0aW9uIHJpZ2h0LgotCi1GcmkgTWF5ICA4IDA3OjQ3OjA4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBzYW5pdHkuc2g6IGRlZmF1bHQgVE1QRElSIHRvICIuIi4KLQotVGh1IE1heSAgNyAxMjozNDo1MCAxOTkyICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXhpOiBhZGQgZG9jIGZvciBhciBjb21tYW5kIGxhbmd1YWdlLgotCi1XZWQgTWF5ICA2IDE4OjA1OjM2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhcnBhcnNlLnk6IG1ha2UgRU5EIGNhbGwgYXJfZW5kCi0JKiBhcnN1cC5jIChhcl9lbmQpOiBhZGRlZCwgZGVsZXRlcyB0ZW1wIGZpbGUgaWYgYXJjaGl2ZSBzZXNzaW9uCi0JYWJvcnRlZC4KLQotCi1XZWQgTWF5ICA2IDExOjA4OjUzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHVzZSBiaXNvbiAmIGZsZXggZnJvbSAuLi8gaWYgdGhleSBleGlzdC4gIEFsc28sCi0JICBGTEVYLT5MRVguCi0KLQkqIHNhbml0eS5zaDogcmVtb3ZlIHRlbXBvcmFyeSBkaXJlY3Rvcnkgd2hlbiBmaW5pc2hlZC4KLQotVHVlIE1heSAgNSAxMjowMDo1OCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQnVtcCB0byB2ZXJzaW9uIDEuOTcuCi0JKiBhci5jOiAgRGVjbGFyZSBlcnJubyBmb3IgbWFjaGluZXMgdGhhdCBuZWVkIGl0LgotCi1Nb24gTWF5ICA0IDIzOjI5OjUxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfaW5mbyk6ICBIYW5kbGUgZXJyb3IgY2FzZXMgd2l0aG91dCBjb3JlZHVtcC4KLQlDbG9zZSB0aGUgZHVtbXkgdGVtcG9yYXJ5IGZpbGUgd2Ugb3BlbiBpbiB0aGUgbG9vcC4KLQkqIE1ha2VmaWxlLmluIChhcnN1cC5vKTogIEFkZCBrbHVkZ2UgdG8gYnVpbGQgd2l0aCBTdW4gTWFrZS4KLQotRnJpIE1heSAgMSAxNjoyMDoyMyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHRlc3QtaW5zdGFsbCB0YXJnZXQuCi0KLQkqIHNhbml0eS5zaDogbmV3IGZpbGUuCi0KLQkqIE1ha2VmaWxlLmluOiB1c2Ugc2FuaXR5IHRlc3Qgb24gbWFrZSBjaGVjay4KLQotVHVlIEFwciAyMSAxMzozODozNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJld29yayBDRkxBR1Mgc28gdGhhdCB0aGV5IGNhbiBiZSBwYXNzZWQgb24gdGhlCi0JICBjb21tYW5kIGxpbmUgdG8gbWFrZS4gIFJlbW92ZSBNSU5VU19HLiAgRGVmYXVsdCBDRkxBR1MgdG8gLWcuCi0KLVdlZCBBcHIgMTUgMTQ6MzM6MDcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFyc3VwLmMsIGFyc3VwLmgsIGFycGFyc2UueSwgYXJsZXgubDogc3VwcG9ydCBmb3IgYXJjaGl2ZQotCXNjcmlwdGluZyBsYW5ndWFnZS4KLQotRnJpIE1hciAgNiAyMTo1NDo1MyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGNoZWNrIHRhcmdldC4KLQotVGh1IE1hciAgNSAyMTozNTo0OSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGNsZWFuLWluZm8gdGFyZ2V0LgotCi1UdWUgTWFyICAzIDE1OjM2OjM3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSAkKENPUFlfUFJPRykgZnJvbSBQUk9HUy4gIEl0IHNob3VsZG4ndCBiZQotCSAgaW5zdGFsbGVkLiBhZGRlZCB0b29sZGlyIGFuZCBwcm9ncmFtX3ByZWZpeC4KLQotV2VkIEZlYiAyNiAxODowNDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0cmFjZXMgb2YgbmFtZXN1YmRpciwKLQkgIC1zdWJkaXJzLCAkKHN1YmRpciksICQodW5zdWJkaXIpLCBzb21lIHJjcyB0cmlnZ2Vycy4gIEZvcmNlZAotCSAgY29weXJpZ2h0cyB0byAnOTIsIGNoYW5nZWQgc29tZSBmcm9tIEN5Z251cyB0byBGU0YuCi0KLVN1biBGZWIgMTYgMTI6NTM6MDIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQnVtcCB2ZXJzaW9uIHRvIDEuOTYsIGFuZCByZW1vdmUgLWJldGEKLQlzdWZmaXggZnJvbSBkaXN0cmlidXRpb24gbmFtZS4KLQkqIG02OGstcGluc24uYzogIE5ldyBtYWNybyBDT0VSQ0VfU0lHTkVEX0NIQVIgdG8gZXh0cmFjdAotCXRoZSBzaWduZWQgdmFsdWUgb2YgYSBjaGFyYWN0ZXIgKGV2ZW4gaWYgY2hhcnMgYXJlIHVuc2lnbmVkKS4KLQkqIHNwYXJjLXBpbnNuLmM6ICBBZGQgbmV3IG9wZXJhbmQgdHlwZXMuCi0KLVRodSBGZWIgIDYgMTI6MTQ6MTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IGRvbid0IHByaW50IGEgc2VjdGlvbidzIGNvbnRlbnRzCi0JaWYgaXQncyBub3QgbG9hZGFibGUgKGVnIGJzcykKLQotVHVlIEphbiAyOCAxMToxMTowNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogbTY4ay1waW5zbi5jIChwcmludF9pbnNuX2FyZyk6IGZpeGVkIHNvIHRoYXQgLXZlIGJyYW5jaAotCWRpc3BsYWNlbWVudHMgZG9uJ3QgZ2V0IHByaW50ZWQgYXMgbGFyZ2UgK3ZlIG9uZXMuCi0KLUZyaSBKYW4gMjQgMTQ6NDc6NTMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvcHkuYywgbm0uYywgb2JqZHVtcC5jLCBzaXplLmMgOiBjaGFuZ2VkIHRvIHVzZSB0aGUKLQluZXcgcmVsb2Mgc2NoZW1lLgotCi0KLU1vbiBEZWMgMzAgMTg6MzQ6NDEgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGJ1Y29tbS5jIChwcmludF9hcmVsdF9kZXNjcik6ICBUd2VlayB0aGUgb3V0cHV0IGZvcm1hdAotCXNvIHRoYXQgJ2FyIHR2JyBvdXRwdXQgZm9sbG93cyBQb3NpeCAxMDAzLjIvRDExLgotCU91dHB1dCBpcyBub3cgYWxzbyBpZGVudGljYWwgdG8gU3VuJ3MgKGV4Y2VwdCBfXy5TWU1ERUYpLgotCi1Nb24gRGVjIDMwIDA2OjA5OjUzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIE1ha2UgYG1ha2UnIG91dHB1dCBtb3JlIHJlYWRhYmxlLgotCi1XZWQgRGVjIDE4IDE1OjA0OjQ1IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEJ1bXAgdG8gdmVyc2lvbiAxLjk0LgotCi1XZWQgRGVjIDExIDE2OjQ4OjA5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyLmM6IGFkZGVkICJiIiB0byBmb3BlbnMgZm9yIGRvcwotCSogY29uZmlnZGouYmF0LCBtYWtlZmlsZS5kb3MgbmV3IGZpbGVzIGZyb20gREoKLQotVHVlIERlYyAxMCAwNDowNzoyNiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbmZvZGlyIGJlbG9uZ3MgaW4gZGF0YWRpci4KLQotU2F0IERlYyAgNyAxNzowOTozNyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogYnVjb21tLmg6IGNyZWF0ZWQgdG8gaG9sZCBwcm90b3R5cGVzIG9mIGJ1Y29tbS5jCi0JKiBvYmpkdW1wLmg6IGNyZWF0ZWQgdG8gaG9sZCBwcm90b3R5ZXMgb2Ygb2JqZHVtcC5jCi0JKiBhbTI5ay1waW5zbi5jOiBpbmNsdWRlIG9iamR1bXAuaAotCSogYXIuYzogaW5jbHVkZSBidWNvbW0uaCwgZ2V0IGFyLmggZnJvbSB0aGUgcmlnaHQgcGxhY2UgYW5kCi0JaW5jbHVkZSBsaWJiZmQuaAotCSogYnVjb21tLmM6IGRlZnVuaXplIGJmZF9mYXRhbAotCSogY29weS5jOiBpbmNsdWRlIGJ1Y29tbS5oLCBsaW50LgotCSogaTk2MC1waW5zbi5oOiBpbmNsdWRlIGJ1Y29tbS5oCi0JKiBtNjhrLXBpbnNuLmg6IGxpbnQKLQkqIG5tLmM6IGluY2x1ZGUgYnVjb21tLmgsIGxpbnQKLQkqIG9iamR1bXAuYzogbGludAotCSogc3BhcmMtcGluc24uYzogaW5jbHVkZSBvYmpkdW1wLmgKLQotCi0KLUZyaSBEZWMgIDYgMjM6MDI6MTQgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgc3RhbmRhcmRzLnRleHQgc3VwcG9ydC4gIGluc3RhbGwgdXNpbmcKLQkgIElOU1RBTExfUFJPR1JBTSBhbmQgSU5TVEFMTF9EQVRBLgotCi0JKiBjb25maWd1cmUuaW46IGNvbmZpZ3VyZSBub3cgZG9lcyBhbGwgb2YgaXQncyB3b3JrIGZyb20gb2JqZGlyIHNvCi0JICBtYWtlIGZpbGUgZXhpc3RlbmNlIHRlc3RzIGFnYWluc3QgJHtzcmNkaXJ9LgotCi1UaHUgRGVjICA1IDIyOjQ2OjIyIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cwotCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgotCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KLQotV2VkIERlYyAgNCAyMjo0MjowMyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBCdW1wIHRvIHZlcnNpb24gMS45My4KLQkqIE1ha2VmaWxlLmluOiAgQWRkIG1ha2Utc3RyaXAubzptYXliZS1zdHJpcC5jIGRlcGVuZGVuY3kKLQlmb3IgbWFrZSB2ZXJzaW9ucyB0aGF0IHByb3ZpZGUgaGFsZi1iYWtlZCBWUEFUSC1zdXBwb3J0IChlLmcuIFN1bidzKS4KLQkqIHNpemUuYzogIEltcHJvdmVtZW50cyBzdWdnZXN0ZWQgYnkKLQkiZGF2aWQgZCBbem9vXSB6dWhuIiA8em9vQGFwczEuc3BhLnVtbi5lZHU+OgotCS0gRG9uJ3QgZW1pdCAoQmVya2VsZXkpIGhlYWRlcnMgaWYgbm8gZmlsZXMgd2VyZSBmb3VuZC4KLQktIFJldHVybiBhIG5vbi16ZXJvIHJldHVybiBjb2RlIG9uIGZhaWx1cmUuCi0KLVNhdCBOb3YgMzAgMjE6MzQ6MTkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQlDaGFuZ2VzIGR1ZSB0byBpbmNsdWRlIGZpbGUgcmVuYW1pbmc6Ci0JKiBhbTI5ay1waW5zbi5jOiBhMjlrLW9wY29kZS5oCS0+IG9wY29kZS9hMjlrLmgKLQkqIHNwYXJjLXBpbnNuLmM6IHNwYXJjLW9wY29kZS5oCS0+IG9wY29kZS9zcGFyYy5oCi0JKiBtNjhrLXBpbnNuLmM6CSBtNjhrLW9wY29kZS5oCS0+IG9wY29kZS9tNjhrLmgKLQkqIG5tLmM6CQkgc3RhYi5nbnUuaAktPiBhb3V0L3N0YWJfZ251LmgKLQotVHVlIE5vdiAxOSAxOToyMDo0MyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogUkVBRE1FOiAgTWVudGlvbiBNSU5JTUlaRSBmbGFnIGZvciBiZmQncyBtYWtlLgotCi1Nb24gTm92IDE4IDEyOjA1OjM3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6ICBWYXJpb3VzIGltcHJvdmVtZW50cy4KLQotU3VuIE5vdiAxNyAyMzo0MDo1OSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBCdW1wIHRvIHZlcnNpb24gMS45Mi4KLQkqIHZlcnNpb24uYywgTWFrZWZpbGUuaW46ICBHZXQgdmVyc2lvbiBzdHJpbmcgZnJvbSBNYWtlZmlsZS4KLQkqIGNvcHkuYywgaXMtc3RyaXAuYywgbm90LXN0cmlwLmMsIG1heWJlLXN0cmlwLmMsIE1ha2VmaWxlLmluOgotCU1ha2UgdGhlIHNhbWUgY2hhbmdlIHRoYXQgd2UgZWFybGllciBkaWQgZm9yIGFyL3JhbmxpYjoKLQlHZW5lcmF0ZSB0d28gZGlmZmVyZW50IGJpbmFyaWVzIGZvciBzdHJpcCBhbmQgY29weSBhbmQgdXNlCi0JYSBnbG9iYWwgdmFyaWFibGUgd2l0aCBkaWZmZXJlbnQgdmFsdWVzIHRvIGRpc3Rpbmd1aXNoCi0Jb3N0cmlwIGZyb20gY29weS4gICgtMSBtZWFucyB0byB1c2UgYXJndlswXSB0byBkZWNpZGUsCi0Jc28geW91IGNhbiBnZXQgdGhlIG9sZCBiZWhhdmlvciwgYnV0IGl0IGlzIG5vIGxvbmdlciB0aGUgZGVmYXVsdCkuCi0JKiBjb3B5LmMgKGNvcHlfZmlsZSk6ICBTZXQgRVhFQ19QIG9mIG91dHB1dCBiZmQgaWYgaW5wdXQgaXMgc28uCi0JKiBjb3B5LmMgKG1haW4pOiAgSWYgaXNfc3RyaXA9PS0xLCBjb21wYXJlIGxhc3QgNSBjaGFycwotCW9mIGFyZ3ZbMF0sIG5vdCB0aGUgd2hvbGUgcGF0aC4KLQkqIGNvcHkuYyAobWFpbik6IFJldHVybiAwLCBub3QgMS4KLQkqIGNvcHkuYyAoc2V0dXBfc2VjdGlvbnMpOiAgRml4IGR1ZSB0byBjaGFuZ2UgaW4gYmZkX21ha2Vfc2VjdGlvbgotCW5vdyBmYWlsaW5nIGlmIGFza2VkIGZvciBhIGR1cGxpY2F0ZSBzZWN0aW9uLgotCSogc3RyaXAuYywgb3N0cmlwLmM6ICBSZW1vdmVkIG9ic29sZXRlIGZpbGVzLgotCSogYXIuYywgbm90LXJhbmxpYi5jLCBtYXliZS1yYW5saWIuYzoKLQlDaGFuZ2UgZW5jb2Rpbmcgb2YgaXNfcmFubGliIHZhcmlhYmxlIHRvIGJlIGNvbnNpc3RlbnQKLQl3aXRoIGlzX3N0cmlwIGZvciBzdHJpcC5jb3B5IChpLmUgLTEgdG8gbWVhbnMgdXNlIGFyZ3ZbMF0pLgotCi1UaHUgTm92IDE0IDIwOjExOjAyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiB2ZXJzaW9uLmMgKHByb2dyYW1fdmVyc2lvbik6IFVwZGF0ZSB0byB2ZXJzaW9uIDEuOTIuCi0KLVR1ZSBOb3YgMTIgMTY6MTc6NTMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyLmMgKGdldF9wb3NfYmZkKTogIFByZXZpb3VzIGZpeCB3YXMgbWlzc2luZyBhICJicmVhayIuCi0KLVRodSBOb3YgIDcgMDg6NTU6NTYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogYW0yOWstcGluc24uYzogRml4ZWQgYnVnIGluIG10YWNjLCBkbWFjIGFuZCBmbWFjIGluc3RydWN0aW9uCi0JZW5jb2RpbmdzLiAoVGhha3MgdG8gRGF2aWQgV29vZCkKLQotU3VuIE5vdiAgMyAxNDo1MDoyMyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKCQoRElTVF9OQU1FKS50YXIuWiksIFRPRE86ICBWYXJpb3VzIGZpeGVzLgotCSogYXIuYyAoZ2V0X3Bvc19iZmQpOiBGaXggdG8gaGFuZGxpbmcgb2YgYmVmb3JlL2FmdGVyCi0JcG9zaXRpb25pbmcgb3B0aW9ucy4KLQkqIGJ1Y29tbS5jIChmYXRhbCk6ICBNSVNTSU5HX1ZGUFJJTlRGIGlzIG5vIGxvbmdlciBhbiBpc3N1ZSwKLQlzaW5jZSBsaWJpYmVydHkgY29udGFpbnMgdmZwcmludGYgZXRjIGlmIG90aGVyd2lzZSBtaXNzaW5nLgotCSogbTY4ay1waW5zbi5jIChwcmludF9pbnNuX2FyZyk6ICBTdXBwb3J0IEJCL0JXL0JMCi0JdHlwZSBvcGVyYW5kcywgYXMgdXNlZCBieSBicmFuY2ggaW5zdHJ1Y3Rpb25zLgotCSogbm0uYzogIERlbGVnYXRlIHByaW50aW5nIG9mIHN5bWJvbHMgdG8gQkZELAotCWJ5IHVzaW5nIGJmZF9wcmludF9zeW1ib2wgdG8gZG8gdGhlIGZvcm1hdHRpbmcuCi0KLU1vbiBPY3QgMjggMTE6MjA6NDcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBhci5jICh3cml0ZV9hcmNoaXZlLmMpOiBhZGRlZCB1bmxpbmsgYmVmb3JlIHJlbmFtZSBzaW5jZSBzb21lCi0Jc3lzdGVtcyBjYW4ndCByZW5hbWUgb250byBhbiBleGlzdGFudCBmaWxlLgotCi1Nb24gT2N0IDIxIDA5OjQ3OjIzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIG5tLmM6IG5vdyBkb2Vzbid0IGNyYXNoIGlmIGEgc3ltYm9sIHdpdGggbm8gc2VjdGlvbiBhbmQgbm8KLQlTRUNfQUJTIGFwcGVhcnMuCi0KLVRodSBPY3QgMTcgMTU6MjU6NTAgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCB2ZXJzaW9uLmM6ICBCdW1wIHRvIHZlcnNpb24gMS45MS4KLQotV2VkIE9jdCAxNiAxMTo0NTozNiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGFyLmMsIGJ1Y29tbS5jLCBjb3B5LmMsIGNwbHVzLWRlbS5jLCBmaWxlbW9kZS5jLAotCWk5NjAtcGluc24uYywgbTY4ay1waW5zbi5jLCBubS5jLCBvYmpkdW1wLmMsIHNpemUuYywgc3BhcmMtcGluc24uYywKLQkqIHN0cmlwLmM6IEFkZCBvciB1cGRhdGUgQ29weXJpZ2h0IG5vdGljZS4KLQkqIFRPRE86ICBBZGQgbm90ZSBvbiAnbm0gLWEnLgotCSogdmVyc2lvbi5jOiBVcGRhdGUgdmVyc2lvbiBudW1iZXIgdG8gMS45MC4KLQkqIE1ha2VmaWxlLmluOiBGaXggbWFraW5nIG9mIGRvY3VtZW50YXRpb24gZm9yIGRpc3QuCi0KLVR1ZSBPY3QgMTUgMDA6MTc6MTcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIFJFQURNRTogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogTmV3IGtsdWRneSBydWxlcyBmb3IgbWFraW5nIGEgdGFyZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBGaXggYmluZGlyIHBhdGguCi0KLU1vbiBPY3QgMTQgMTc6MzQ6MjkgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCB0YXJnZXRzIGJpbnV0aWxzLm1tLCBiaW51dGlscy5tZQotCi1GcmkgT2N0IDExIDIyOjQ0OjIxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEF2b2lkIFN1biBNYWtlIFZQQVRIIGJ1Z3MgYnkgYWRkaW5nIGRlcGVuZGVuY2llcy4KLQotRnJpIE9jdCAxMSAxMjo1MTozMyAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIHRhcmdldCAiYmludXRpbHMubXMiCi0KLQkqIGJpbnV0aWxzLnRleGluZm86IG1pbm9yIHJlc3RydWN0dXJpbmcgZm9yIHRleGkycm9mZiBjb21mb3J0LgotCi1GcmkgT2N0IDExIDA0OjEyOjI4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JUmVzdHJ1Y3R1cmUgY29uZmlndXJhdGlvbiBzY2hlbWUgZm9yIGJmZCwgYmludXRpbHMsIGxkLgotCi0JKiBpbmNsdWRlL3N5cy9oLSouaDogIE1vdmUgdG8gYmZkL2hvc3RzL2gtKi5oLgotCSogY29uZmlndXJlLmluOiAgUmV2aXNlIHRvIHN5bWxpbmsgc3lzZGVwLmggdG8gLi4vYmZkL2hvc3RzL2gteHh4LmguCi0JQ2hhbmdlIHNvbWUgY29uZmlnIG5hbWVzIHRvIG1hdGNoIG90aGVyIGRpcnMuCi0JKiAqLmM6ICBJbmNsdWRlIGJmZC5oIGJlZm9yZSBzeXNkZXAuaCwgc28gYW5zaWRlY2wgYW5kIFBST1RPKCkKLQlnZXQgZGVmaW5lZCBmaXJzdC4KLQkqIE1ha2VmaWxlLmluOiAgVXNlIC1JLiB0byBnZXQgc3lzZGVwLmguCi0KLVdlZCBPY3QgIDkgMjI6NDI6NTYgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIG5tLmMgKHByaW50X3N5bWJvbHMpOiAgSGFuZGxlIE5VTEwgbmFtZSBmaWVsZCBvZiBzeW1ib2wuCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlZCBzcHVyaW91cyBjb21tZW50LgotCi1UdWUgT2N0ICA4IDE2OjU1OjAzIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLnRleGluZm86IG1pbm9yIHR5cG9zLCBwaHJhc2luZywgZm9ybWF0dGluZyBmaXhlcy4KLQotVHVlIE9jdCAgOCAxNToxMzoyMCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBHZXQgaG9zdCBmaWxlIGZyb20gLi4vYmZkL2NvbmZpZywgbm90IGNvbmZpZy4KLQkqIGNvbmZpZy8qOiBSZW1vdmUgY29uZmlnIGRpcmVjdG9yeSBhbmQgaXRzIGZpbGVzLgotCi1UdWUgT2N0ICA4IDEzOjU4OjU5IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBuZXcgdGFyZ2V0cyBiaW51dGlscy5kdmksIGJpbnV0aWxzLmluZm8KLQotCSogYmludXRpbHMudGV4aW5mbzogcmVtb3ZlIG1vc3QgcmVtYWluaW5nIEZJWE1FJ3MsIGRlbGV0ZQotCXJlZmVyZW5jZXMgdG8gX18uU1lNREVGIGJ5IG5hbWUKLQotCi1UdWUgT2N0ICA4IDEwOjIzOjQ0IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChwcmludF9hZGRyZXNzKSBQcmludCBhZGRyZXNzZXMgbmljZWx5LgotCi1Nb24gT2N0ICA3IDExOjMxOjA1IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhci5jLCBNYWtlZmlsZS5pbiwgbmV3IGZpbGVzIHtpcyxub3QsbWF5YmV9LXJhbmxpYi5jOgotCU1ha2UgdHdvIGRpZmZlcmVudCBiaW5hcmllcyBmb3IgYXIgYW5kIHJhbmxpYiwgaW5zdGVhZCBvZgotCWRpc3Rpbmd1aXNoaW5nIHRoZW0gYXQgcnVuIHRpbWUgdXNpbmcgYXJndlswXS4KLQkoT2xkIGJlaGF2aW9yIGlzIHN0aWxsIGF2YWlsYWJsZSBpZiB5b3UgIm1ha2UgYXJfd2l0aF9yYW5saWIiLAotCWJ1dCBpdCBpcyBub3QgdGhlIGRlZmF1bHQuKQotCSogcmFubGliLnNoIChuZXcpOiAgQW4gYWx0ZXJuYXRpdmUgb25lLWxpbmUKLQlzaGVsbCBpbXBsZW1lbnRhdGlvbiBvZiByYW5saWIuCi0KLUZyaSBPY3QgIDQgMjE6NDk6NDQgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYzogIENvcGUgd2l0aCByZW5hbWVzIG9mIGEgZmV3IEJGRCB0eXBlcyAmIGVudW1zLgotCi1GcmkgT2N0ICA0IDE5OjA4OjA5IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLnRleGluZm86IGFkZCBuZXcgZmlsZSAocnVkaW1lbnRhcnkgZG9jbikKLQotTW9uIFNlcCAzMCAxMjozMDozOSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2htYWtlLW5ld3M6IEFkZCBuZXcgZmlsZSAoZm9yIFNvbnkgTkVXU09TMykuCi0JKiBidWNvbW0uYyAoZmF0YWwpOiAgQ29uZGl0aW9uYWxseSBjb21waWxlIGZhdGFsKCkgZGVwZW5kaW5nIG9uCi0JTUlTU0lOR19WRlBSSU5URiwgYW5kIGRvbid0IGNvbmZ1c2UgdGhlIGlzc3VlIHdpdGggTk9fVkFSQVJHUy4KLQkqIG9iamR1bXAuYyAoZHVtcF9oZWFkZXJzKTogIFRyaXZpYWwgb3V0cHV0IGZvcm1hdCBjaGFuZ2UuCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfaW5mbyk6IExvb3Agb3ZlciBpbnRlZ2Vycywgbm90IGVudW1zLAotCXRvIGFwcGVhc2Ugb2xkIGNvbXBpbGVycy4KLQotTW9uIE1heSAyMCAxNjoxNDowNyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0gICAgICAgICpvYmpkdW1wLmMgKm5tLmMgKmNvcHkuYyA6aGFuZ2VkIHNvbWUgdHlwZXMgdG8gd29yayB3aXRoIDY0IGJpdCBvYmplY3QgZmlsZXMKLQotVGh1IE1heSAxNiAxNjowNjo1NSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotICAgICBmcm9tIGJvdGhlcgotCSogb2JqZHVtcC5jIChwcmludF9hZGRyZXNzKTogTWFrZSBkaXNhc2VtYmxlZCBvdXRwdXQgbW9yZQotCWNvbnNpc3RlbnQgd2l0aCBnZGIgYW5kIGFzOiBBZGQgMHggd2hlbiBwcmludGluZyBoZXguCi0JRG9uJ3QgcHJpbnQgZXh0cmEgbGVhZGluZyB6ZXJvcy4KLQlBdHRlbXB0IHRvIG5vdCBwcmludCAiZmlsZW5hbWUubyIuCi0JKiBvYmpkdW1wLmM6IEFkZCBzb21lIGVudW0tdG8taW50IGNhc3RzIHRvIGFjY29tb2RhdGUgb2xkIGNvbXBpbGVycy4KLQotCi1GcmkgTWF5ICAzIDIyOjIxOjQ0IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogY29weS5jOiAgQ2hhbmdlID0mIGNvbnN0cnVjdHMgdG8gPSAmLCBzaW5jZSB0aGV5IGNvbmZ1c2Ugb2xkZXIKLQlDIGNvbXBpbGVycy4KLQotDAotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogY2hhbmdlLWxvZwotbGVmdC1tYXJnaW46IDgKLWZpbGwtY29sdW1uOiA3NAotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvTWFrZWZpbGUuYW0gYi9iaW51dGlscy9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0YWQ5Mi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDQ5OCArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCi0KLSMjIEZJWE1FOiBXb3JrIGFyb3VuZCBhcHBhcmVudCBidWcgaW4gYXV0b21ha2UuCi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyBkZWphZ251Ci0KLVNVQkRJUlMgPSBwbwotCi10b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpCi0KLSMjIFRoZXNlIGFyZW4ndCBzZXQgYnkgYXV0b21ha2UsIGJlY2F1c2UgdGhleSBhcHBlYXIgaW4KLSMjIGJmZC9hY2luY2x1ZGUubTQsIHdoaWNoIGlzIGluY2x1ZGVkIGJ5IGJpbnV0aWxzL2FjaW5jbHVkZS5tNCwgYW5kCi0jIyB0aHVzIGlzIG5vdCBzZWVuIGJ5IGF1dG9tYWtlLgotQ0NfRk9SX0JVSUxEID0gQENDX0ZPUl9CVUlMREAKLUVYRUVYVF9GT1JfQlVJTEQgPSBARVhFRVhUX0ZPUl9CVUlMREAKLQotWUFDQyA9IGBpZiBbIC1mIC4uL2Jpc29uL2Jpc29uIF0gOyB0aGVuIGVjaG8gLi4vYmlzb24vYmlzb24gLXkgLUwkKHNyY2RpcikvLi4vYmlzb24vIDsgZWxzZSBlY2hvIGJpc29uIC15IDsgZmlgCi1ZRkxBR1MgPSAtZAotTEVYID0gYGlmIFsgLWYgLi4vZmxleC9mbGV4IF0gOyB0aGVuIGVjaG8gLi4vZmxleC9mbGV4IDsgZWxzZSBlY2hvIGZsZXggOyBmaWAKLQotIyB0aGVzZSB0d28gYXJlIGFsbW9zdCB0aGUgc2FtZSBwcm9ncmFtCi1BUl9QUk9HPWFyCi1SQU5MSUJfUFJPRz1yYW5saWIKLQotIyBvYmpjb3B5IGFuZCBzdHJpcCBzaG91bGQgYmUgdGhlIHNhbWUgcHJvZ3JhbQotT0JKQ09QWV9QUk9HPW9iamNvcHkKLVNUUklQX1BST0c9c3RyaXAtbmV3Ci0KLVNUUklOR1NfUFJPRz1zdHJpbmdzCi0KLVJFQURFTEZfUFJPRz1yZWFkZWxmCi0KLSMgVGhlc2Ugc2hvdWxkIGFsbCBiZSB0aGUgc2FtZSBwcm9ncmFtIHRvby4KLVNJWkVfUFJPRz1zaXplCi1OTV9QUk9HPW5tLW5ldwotT0JKRFVNUF9QUk9HPW9iamR1bXAKLQotIyBUaGlzIGlzIHRoZSBkZW1hbmdsZXIsIGFzIGEgc3RhbmRhbG9uZSBwcm9ncmFtLgotIyBOb3RlOiBUaGlzIG9uZSBpcyB1c2VkIGFzIHRoZSBpbnN0YWxsZWQgbmFtZSB0b28sIHVubGlrZSB0aGUgYWJvdmUuCi1ERU1BTkdMRVJfUFJPRz1jKytmaWx0Ci0KLUFERFIyTElORV9QUk9HPWFkZHIybGluZQotCi1OTE1DT05WX1BST0c9bmxtY29udgotRExMVE9PTF9QUk9HPWRsbHRvb2wKLVdJTkRSRVNfUFJPRz13aW5kcmVzCi1ETExXUkFQX1BST0c9ZGxsd3JhcAotCi1TUkNPTlZfUFJPRz1zcmNvbnYkKEVYRUVYVCkgc3lzZHVtcCQoRVhFRVhUKSBjb2ZmZHVtcCQoRVhFRVhUKSAKLQotbWFuX01BTlMgPSBhci4xIG5tLjEgb2JqZHVtcC4xIHJhbmxpYi4xIHNpemUuMSBzdHJpbmdzLjEgc3RyaXAuMSBvYmpjb3B5LjEgXAotCWFkZHIybGluZS4xIG5sbWNvbnYuMSAkKERFTUFOR0xFUl9QUk9HKS4xCi0KLVBST0dTID0gJChTSVpFX1BST0cpICQoT0JKRFVNUF9QUk9HKSAkKE5NX1BST0cpICQoQVJfUFJPRykgJChTVFJJTkdTX1BST0cpICQoU1RSSVBfUFJPRykgJChSQU5MSUJfUFJPRykgJChERU1BTkdMRVJfUFJPRykgJChPQkpDT1BZX1BST0cpIEBCVUlMRF9OTE1DT05WQCBAQlVJTERfU1JDT05WQCBAQlVJTERfRExMVE9PTEAgQEJVSUxEX1dJTkRSRVNAICQoQUREUjJMSU5FX1BST0cpICQoUkVBREVMRl9QUk9HKSBAQlVJTERfRExMV1JBUEAgQEJVSUxEX01JU0NACi0KLWJpbl9QUk9HUkFNUyA9ICQoU0laRV9QUk9HKSAkKE9CSkRVTVBfUFJPRykgJChBUl9QUk9HKSAkKFNUUklOR1NfUFJPRykgJChSQU5MSUJfUFJPRykgJChERU1BTkdMRVJfUFJPRykgJChPQkpDT1BZX1BST0cpIEBCVUlMRF9OTE1DT05WQCBAQlVJTERfU1JDT05WQCBAQlVJTERfRExMVE9PTEAgQEJVSUxEX1dJTkRSRVNAICQoQUREUjJMSU5FX1BST0cpICQoUkVBREVMRl9QUk9HKSBAQlVJTERfRExMV1JBUEAgQEJVSUxEX01JU0NACi0KLSMjIFdlIG5lZWQgYSBzcGVjaWFsIHJ1bGUgdG8gaW5zdGFsbCB0aGUgcHJvZ3JhbXMgd2hpY2ggYXJlIGJ1aWx0IHdpdGggLW5ldwotbm9pbnN0X1BST0dSQU1TID0gJChOTV9QUk9HKSAkKFNUUklQX1BST0cpCi0KLUVYVFJBX1BST0dSQU1TID0gJChOTE1DT05WX1BST0cpIHNyY29udiBzeXNkdW1wIGNvZmZkdW1wICQoRExMVE9PTF9QUk9HKSAkKFdJTkRSRVNfUFJPRykgJChETExXUkFQX1BST0cpCi0KLSMgU3R1ZmYgdGhhdCBnb2VzIGluIHRvb2xkaXIvIGlmIGFwcHJvcHJpYXRlCi1UT09MX1BST0dTID0gbm0tbmV3IHN0cmlwLW5ldyBhciByYW5saWIgZGxsdG9vbAotCi1CQVNFRElSID0gJChzcmNkaXIpLy4uCi1CRkRESVIgPSAkKEJBU0VESVIpL2JmZAotSU5DRElSCT0gJChCQVNFRElSKS9pbmNsdWRlCi0KLURFUCA9IG1rZGVwCi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKEJGRERJUikgLUkkKElOQ0RJUikgQEhERUZJTkVTQCAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLUhGSUxFUyA9IGFyc3VwLmggYnVjb21tLmggYnVkYmcuaCBjb2ZmZ3Jvay5oIGRlYnVnLmggbmxtY29udi5oIGRsbHRvb2wuaCBcCi0Jd2luZHJlcy5oIHdpbmR1bmkuaCBkeW4tc3RyaW5nLmgKLQotR0VORVJBVEVEX0hGSUxFUyA9IGFycGFyc2UuaCBzeXNyb2ZmLmggc3lzaW5mby5oIGRlZnBhcnNlLmgKLQotQ0ZJTEVTID0gYWRkcjJsaW5lLmMgYXIuYyBhcnN1cC5jIGJ1Y29tbS5jIGNvZmZkdW1wLmMgY29mZmdyb2suYyBkZWJ1Zy5jIFwKLQlkbGx0b29sLmMgZmlsZW1vZGUuYyBpZWVlLmMgaXMtcmFubGliLmMgaXMtc3RyaXAuYyBtYXliZS1yYW5saWIuYyBcCi0JbWF5YmUtc3RyaXAuYyBubG1jb252LmMgbm0uYyBub3QtcmFubGliLmMgbm90LXN0cmlwLmMgXAotCW9iamNvcHkuYyBvYmpkdW1wLmMgcHJkYmcuYyByZGNvZmYuYyByZGRiZy5jIHNpemUuYyBzcmNvbnYuYyBcCi0Jc3RhYnMuYyBzdHJpbmdzLmMgc3lzZHVtcC5jIHZlcnNpb24uYyB3cnN0YWJzLmMgXAotCXdpbmRyZXMuYyByZXNyYy5jIHJlc2NvZmYuYyByZXNiaW4uYyB3aW5kdW5pLmMgcmVhZGVsZi5jIFwKLQlyZXNyZXMuYyBkeW4tc3RyaW5nLmMgZGxsd3JhcC5jIHJlbmFtZS5jCi0KLUdFTkVSQVRFRF9DRklMRVMgPSBcCi0JdW5kZXJzY29yZS5jIGFycGFyc2UuYyBhcmxleC5jIHN5c3JvZmYuYyBzeXNpbmZvLmMgc3lzbGV4LmMgXAotCWRlZnBhcnNlLmMgZGVmbGV4LmMgbmxtaGVhZGVyLmMgcmNwYXJzZS5jIHJjbGV4LmMKLQotREVCVUdfU1JDUyA9IHJkZGJnLmMgZGVidWcuYyBzdGFicy5jIGllZWUuYyByZGNvZmYuYwotV1JJVEVfREVCVUdfU1JDUyA9ICQoREVCVUdfU1JDUykgd3JzdGFicy5jCi0KLSMgQ29kZSBzaGFyZWQgYnkgYWxsIHRoZSBiaW51dGlscy4KLUJVTElCUyA9IGJ1Y29tbS5jIHZlcnNpb24uYyBmaWxlbW9kZS5jCi0KLUJGRExJQiA9IC4uL2JmZC9saWJiZmQubGEKLQotT1BDT0RFUyA9IC4uL29wY29kZXMvbGlib3Bjb2Rlcy5sYQotCi1MSUJJQkVSVFkgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLQotUE9URklMRVMgPSAkKENGSUxFUykgJChERUJVR19TUkNTKSAkKEhGSUxFUykKLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLUVYUEVDVCA9IGBpZiBbIC1mICQkci8uLi9leHBlY3QvZXhwZWN0IF0gOyB0aGVuIFwKLSAgICAgICAgICBlY2hvICQkci8uLi9leHBlY3QvZXhwZWN0IDsgXAotICAgICAgICAgIGVsc2UgZWNobyBleHBlY3QgOyBmaWAKLVJVTlRFU1QgPSBgaWYgWyAtZiAke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IF0gOyB0aGVuIFwKLSAgICAgICAgICAgZWNobyAke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IDsgXAotICAgICAgICAgICBlbHNlIGVjaG8gcnVudGVzdCA7ICBmaWAKLQotQ0NfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci8uLi9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvLi4vbmV3bGliL01ha2VmaWxlIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy8gLWlkaXJhZnRlciAkJHIvLi4vbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQke3NyY3Jvb3R9Ly4uL25ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvOyBcCi0gICAgZmk7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiQGhvc3RAIiA9ICJAdGFyZ2V0QCIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKENDKTsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyBnY2MgfCBzZWQgJyQodHJhbnNmb3JtKSc7IFwKLSAgICBmaTsgXAotICBmaWAKLQotY2hlY2stREVKQUdOVTogc2l0ZS5leHAKLQlzcmNkaXI9YGNkICQoc3JjZGlyKSAmJiBwd2RgOyBleHBvcnQgc3JjZGlyOyBcCi0Jcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlFWFBFQ1Q9JChFWFBFQ1QpOyBleHBvcnQgRVhQRUNUOyBcCi0JaWYgWyAtZiAkKHRvcF9idWlsZGRpcikvLi4vZXhwZWN0L2V4cGVjdCBdOyB0aGVuIFwKLQkgIFRDTF9MSUJSQVJZPWBjZCAkKHRvcF9zcmNkaXIpLy4uL3RjbC9saWJyYXJ5ICYmIHB3ZGA7IFwKLQkgIGV4cG9ydCBUQ0xfTElCUkFSWTsgXAotCWZpOyBcCi0JcnVudGVzdD0kKFJVTlRFU1QpOyBcCi0JaWYgJChTSEVMTCkgLWMgIiQkcnVudGVzdCAtLXZlcnNpb24iID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgJCRydW50ZXN0IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHtzcmNkaXJ9L3Rlc3RzdWl0ZSBcCi0JCUNDX0ZPUl9UQVJHRVQ9IiQoQ0NfRk9SX1RBUkdFVCkiIFwKLQkJQ0ZMQUdTX0ZPUl9UQVJHRVQ9IiQoQ0ZMQUdTKSIgJChSVU5URVNURkxBR1MpOyBcCi0JZWxzZSBlY2hvICJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBcYHJ1bnRlc3QnIiAxPiYyOyA6O1wKLQlmaQotCi1pbnN0YWxsY2hlY2s6Ci0JL2Jpbi9zaCAkKHNyY2Rpcikvc2FuaXR5LnNoICQoYmluZGlyKQotCi1pbmZvX1RFWElORk9TID0gYmludXRpbHMudGV4aQotCi1MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotc2l6ZV9TT1VSQ0VTID0gc2l6ZS5jICQoQlVMSUJTKQotCi1vYmpjb3B5X1NPVVJDRVMgPSBvYmpjb3B5LmMgbm90LXN0cmlwLmMgcmVuYW1lLmMgJChXUklURV9ERUJVR19TUkNTKSAkKEJVTElCUykKLQotc3RyaW5nc19TT1VSQ0VTID0gc3RyaW5ncy5jICQoQlVMSUJTKQotCi1yZWFkZWxmX1NPVVJDRVMgPSByZWFkZWxmLmMgdmVyc2lvbi5jCi1yZWFkZWxmX0xEQUREICAgPSAkKElOVExMSUJTKSAkKExJQklCRVJUWSkKLQotc3RyaXBfbmV3X1NPVVJDRVMgPSBvYmpjb3B5LmMgaXMtc3RyaXAuYyByZW5hbWUuYyAkKFdSSVRFX0RFQlVHX1NSQ1MpICQoQlVMSUJTKQotCi1ubV9uZXdfU09VUkNFUyA9IG5tLmMgJChCVUxJQlMpCi0KLW9iamR1bXBfU09VUkNFUyA9IG9iamR1bXAuYyBwcmRiZy5jICQoREVCVUdfU1JDUykgJChCVUxJQlMpCi1vYmpkdW1wX0xEQUREID0gJChPUENPREVTKSAkKEJGRExJQikgJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLXVuZGVyc2NvcmUuYzogc3RhbXAtdW5kZXIgOyBAdHJ1ZQotCi1zdGFtcC11bmRlcjogTWFrZWZpbGUKLQllY2hvICcvKldBUk5JTkc6IFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCEqLycgPnVuZGVyc2NvcmUudAotCWVjaG8gImludCBwcmVwZW5kc191bmRlcnNjb3JlID0gQFVOREVSU0NPUkVAOyIgPj51bmRlcnNjb3JlLnQKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdW5kZXJzY29yZS50IHVuZGVyc2NvcmUuYwotCXRvdWNoIHN0YW1wLXVuZGVyCi0KLWNwbHVzLWRlbS5vOiAkKEJBU0VESVIpL2xpYmliZXJ0eS9jcGx1cy1kZW0uYyAkKElOQ0RJUikvZ2V0b3B0LmgKLQkkKENPTVBJTEUpIC1jIC1ETUFJTiAtRFZFUlNJT049JyIkKFZFUlNJT04pIicgJChCQVNFRElSKS9saWJpYmVydHkvY3BsdXMtZGVtLmMKLQotY19fZmlsdF9TT1VSQ0VTID0KLWNfX2ZpbHRfTERBREQgPSBjcGx1cy1kZW0ubyB1bmRlcnNjb3JlLm8gJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLWFyX1NPVVJDRVMgPSBhcnBhcnNlLnkgYXJsZXgubCBhci5jIG5vdC1yYW5saWIuYyBhcnN1cC5jIHJlbmFtZS5jICQoQlVMSUJTKQotYXJfTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpIEBMRVhMSUJAICQoSU5UTExJQlMpCi0KLXJhbmxpYl9TT1VSQ0VTID0gYXIuYyBpcy1yYW5saWIuYyBhcnBhcnNlLnkgYXJsZXgubCBhcnN1cC5jIHJlbmFtZS5jICQoQlVMSUJTKQotcmFubGliX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQotCi1hZGRyMmxpbmVfU09VUkNFUyA9IGFkZHIybGluZS5jICQoQlVMSUJTKQotCi0jIFRoZSBmb2xsb3dpbmcgaXMgY29tbWVudGVkIG91dCBmb3IgdGhlIGNvbnZlcnRpb24gdG8gYXV0b21ha2UuCi0jIFRoaXMgcnVsZSBjcmVhdGVzIGEgc2luZ2xlIGJpbmFyeSB0aGF0IHN3aXRjaGVzIGJldHdlZW4gYXIgYW5kIHJhbmxpYgotIyBieSBsb29raW5nIGF0IGFyZ3ZbMF0uICBVc2UgdGhpcyBrbHVkZ2UgdG8gc2F2ZSBzb21lIGRpc2sgc3BhY2UuCi0jIEhvd2V2ZXIsIHlvdSBoYXZlIHRvIGluc3RhbGwgdGhpbmdzIGJ5IGhhbmQuCi0jIChUaGF0IGlzIGFmdGVyICdtYWtlIGluc3RhbGwnLCByZXBsYWNlIHRoZSBpbnN0YWxsZWQgcmFubGliIGJ5IGEgbGluayB0byBhci4pCi0jIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gaW5zdGFsbCByYW5saWIuc2ggYXMgcmFubGliLgotIyBhcl93aXRoX3JhbmxpYjogJChBRERMX0RFUFMpIGFyLm8gbWF5YmUtcmFubGliLm8KLSMJJChITERFTlYpICQoQ0MpICQoSExERkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICQoQVJfUFJPRykgYXIubyBtYXliZS1yYW5saWIubyAkKEFERExfTElCUykgJChFWFRSQUxJQlMpCi0jCS1ybSAtZiAkKFJBTkxJQl9QUk9HKQotIwktbG4gJChBUl9QUk9HKSAkKFJBTkxJQl9QUk9HKQotIwotIyBvYmpjb3B5IGFuZCBzdHJpcCBpbiBvbmUgYmluYXJ5IHRoYXQgdXNlcyBhcmd2WzBdIHRvIGRlY2lkZSBpdHMgYWN0aW9uLgotIwotI29iamNvcHlfd2l0aF9zdHJpcDogJChBRERMX0RFUFMpIG9iamNvcHkubyBtYXliZS1zdHJpcC5vCi0jCSQoSExERU5WKSAkKENDKSAkKEhMREZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkKE9CSkNPUFlfUFJPRykgb2JqY29weS5vIG1heWJlLXN0cmlwLm8gJChBRERMX0xJQlMpICQoRVhUUkFMSUJTKQotIwktcm0gLWYgJChTVFJJUF9QUk9HKQotIwktbG4gJChPQkpDT1BZX1BST0cpICQoU1RSSVBfUFJPRykKLQotc3lzcm9mZi5jOiBzeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSBzeXNyb2ZmLmluZm8gCi0JLi9zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSAtYyA8JChzcmNkaXIpL3N5c3JvZmYuaW5mbyA+c3lzcm9mZi5jCi0JLi9zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSAtaSA8JChzcmNkaXIpL3N5c3JvZmYuaW5mbyA+PnN5c3JvZmYuYwotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWcgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPj5zeXNyb2ZmLmMKLQotc3lzcm9mZi5oOiBzeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSBzeXNyb2ZmLmluZm8KLQkuL3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIC1kIDwkKHNyY2Rpcikvc3lzcm9mZi5pbmZvID5zeXNyb2ZmLmgKLQotc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCk6IHN5c2luZm8ubyBzeXNsZXgubwotCSQoQ0NfRk9SX0JVSUxEKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQCBzeXNpbmZvLm8gc3lzbGV4Lm8gCi0KLXN5c2xleC5vOiBzeXNsZXguYyBzeXNpbmZvLmgKLQlpZiBbIC1yIHN5c2xleC5jIF07IHRoZW4gXAotCSAgJChDQ19GT1JfQlVJTEQpIC1jIC1JLiAkKENGTEFHUykgIHN5c2xleC5jICA7IFwKLQllbHNlIFwKLQkgICQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4gLUkkKHNyY2RpcikgJChDRkxBR1MpICQoc3JjZGlyKS9zeXNsZXguYyA7XAotCWZpCi0KLXN5c2luZm8ubzogc3lzaW5mby5jCi0JaWYgWyAtciBzeXNpbmZvLmMgXTsgdGhlbiBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuICQoQ0ZMQUdTKSAgc3lzaW5mby5jICA7IFwKLQllbHNlIFwKLQkgICQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4gJChDRkxBR1MpICQoc3JjZGlyKS9zeXNpbmZvLmMgOyBcCi0JZmkKLQotc3Jjb252X1NPVVJDRVMgPSBzcmNvbnYuYyBjb2ZmZ3Jvay5jICQoQlVMSUJTKQotCi1kbGx0b29sX1NPVVJDRVMgPSBkbGx0b29sLmMgZGVmcGFyc2UueSBkZWZsZXgubCAkKEJVTElCUykKLWRsbHRvb2xfTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpIEBMRVhMSUJAICQoSU5UTExJQlMpCi0KLWRsbHRvb2wubzpkbGx0b29sLmMKLQkkKENPTVBJTEUpIC1jICQoRExMVE9PTF9ERUZTKSAkKHNyY2RpcikvZGxsdG9vbC5jCi0KLXJlc2NvZmYubzpyZXNjb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoRExMVE9PTF9ERUZTKSAkKHNyY2RpcikvcmVzY29mZi5jCi0KLWNvZmZkdW1wX1NPVVJDRVMgPSBjb2ZmZHVtcC5jIGNvZmZncm9rLmMgJChCVUxJQlMpCi0KLXN5c2R1bXBfU09VUkNFUyA9IHN5c2R1bXAuYyAkKEJVTElCUykKLQotIyBjb2ZmL3N5bS5oIGFuZCBjb2ZmL2Vjb2ZmLmggd29uJ3QgYmUgZm91bmQgYnkgdGhlIGF1dG9tYXRpYyBkZXBlbmRlbmN5Ci0jIHNjcmlwdHMsIHNpbmNlIHRoZXkgYXJlIG9ubHkgaW5jbHVkZWQgY29uZGl0aW9uYWxseS4KLW5sbWNvbnYubzogbmxtY29udi5jICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLQlsZG5hbWU9YGVjaG8gbGQgfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JJChDT01QSUxFKSAtYyAtRExEX05BTUU9IlwiJCR7bGRuYW1lfVwiIiBATkxNQ09OVl9ERUZTQCAkKHNyY2RpcikvbmxtY29udi5jCi0KLW5sbWNvbnZfU09VUkNFUyA9IG5sbWNvbnYuYyBubG1oZWFkZXIueSAkKEJVTElCUykKLQotd2luZHJlc19TT1VSQ0VTID0gd2luZHJlcy5jIHJlc3JjLmMgcmVzY29mZi5jIHJlc2Jpbi5jIHJjcGFyc2UueSByY2xleC5sIFwKLQl3aW5kdW5pLmMgcmVzcmVzLmMgJChCVUxJQlMpCi13aW5kcmVzX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQotCi1kbGx3cmFwX1NPVVJDRVMgPSBkbGx3cmFwLmMgZHluLXN0cmluZy5jIAotZGxsd3JhcF9MREFERCA9ICQoTElCSUJFUlRZKQotCi0KLURJU1RTVFVGRiA9IGFycGFyc2UuYyBhcnBhcnNlLmggYXJsZXguYyBubG1oZWFkZXIuYyBzeXNpbmZvLmMgc3lzaW5mby5oIFwKLQlzeXNsZXguYyBkZWZsZXguYyBkZWZwYXJzZS5oIGRlZnBhcnNlLmMgcmNsZXguYyByY3BhcnNlLmggcmNwYXJzZS5jCi0KLWRpc3RzdHVmZjogJChESVNUU1RVRkYpIGluZm8KLQotRElTVENMRUFORklMRVMgPSBzdGFtcC11bmRlciBzeXNpbmZvIHVuZGVyc2NvcmUuYyBzeXNyb2ZmLmMgc3lzcm9mZi5oIFwKLQlzaXRlLmV4cCBzaXRlLmJhawotCi0jIFRhcmdldHMgdG8gcmVidWlsZCBkZXBlbmRlbmNpZXMgaW4gdGhpcyBNYWtlZmlsZS4KLSMgSGF2ZSB0byBnZXQgcmlkIG9mIC5kZXAxIGhlcmUgc28gdGhhdCAiJD8iIGxhdGVyIGluY2x1ZGVzIGFsbCBvZiAkKENGSUxFUykuCi0uZGVwOiBkZXAuc2VkICQoQ0ZJTEVTKSAkKEhGSUxFUykgJChHRU5FUkFURURfQ0ZJTEVTKSAkKEdFTkVSQVRFRF9IRklMRVMpIGNvbmZpZy5oCi0Jcm0gLWYgLmRlcDEKLQkkKE1BS0UpIERFUD0kKERFUCkgLmRlcDEKLQlzZWQgLWYgZGVwLnNlZCA8LmRlcDEgPi5kZXAKLQotIyBUaGlzIHJ1bGUgcmVhbGx5IHdhbnRzIGEgbWtkZXAgdGhhdCBydW5zICJnY2MgLU1NIi4KLS5kZXAxOiAkKENGSUxFUykgJChHRU5FUkFURURfQ0ZJTEVTKQotCXJtIC1mIC5kZXAyCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiAuZGVwMgotCSQoREVQKSAtZiAuZGVwMiAkKElOQ0xVREVTKSAkPwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSAuZGVwMiAuZGVwMQotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlvYmpkaXI9YHB3ZGA7IFwKLQlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkCVwKLQkJLWUgJ3MhQElOQ0RJUkAhJChJTkNESVIpIScJXAotCQktZSAncyFAQkZERElSQCEkKEJGRERJUikhJwlcCi0JCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCVwKLQkJLWUgInMhQE9CSkRJUkAhJCR7b2JqZGlyfSEiCi0KLWRlcDogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgTWFrZWZpbGUgPiB0bXAtTWFrZWZpbGUKLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmluCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5pbiAkKHNyY2RpcikvTWFrZWZpbGUuaW4KLQotZGVwLWFtOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi0uUEhPTlk6IGRlcCBkZXAtaW4gZGVwLWFtCi0KLSMjIwotIyBET0NVTUVOVEFUSU9OIFRBUkdFVFMKLWNvbmZpZy50ZXhpOiBNYWtlZmlsZQotCXJtIC1mIGNvbmZpZy50ZXhpCi0JZWNobyAnQHNldCBWRVJTSU9OICQoVkVSU0lPTiknID4gY29uZmlnLnRleGkKLQotYmludXRpbHMuZHZpOiAkKHNyY2RpcikvYmludXRpbHMudGV4aSBjb25maWcudGV4aQotCi1iaW51dGlscy5pbmZvOiAkKHNyY2RpcikvYmludXRpbHMudGV4aSBjb25maWcudGV4aQotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IGNvbmZpZy50ZXhpCi0KLSQoREVNQU5HTEVSX1BST0cpLjE6IGN4eGZpbHQubWFuIE1ha2VmaWxlCi0Jc2VkIC1lICdzL0BQUk9HUkFNQC8kKERFTUFOR0xFUl9QUk9HKS8nIDwgJChzcmNkaXIpL2N4eGZpbHQubWFuIFwKLQkJPiAkKERFTUFOR0xFUl9QUk9HKS4xCi0KLU1PU1RMWUNMRUFORklMRVMgPSBzeXNpbmZvICQoREVNQU5HTEVSX1BST0cpLjEgYmludXRpbHMubG9nIGJpbnV0aWxzLnN1bSBcCi0JYWJjZGVmZ2gqCi1tb3N0bHljbGVhbi1sb2NhbDoKLQktcm0gLXJmIHRtcGRpcgotCi1DTEVBTkZJTEVTID0gZGVwLnNlZCAuZGVwIC5kZXAxCi0KLS5QSE9OWTogaW5zdGFsbC1leGVjLWxvY2FsCi0KLWluc3RhbGwtZXhlYy1sb2NhbDogJChiaW5fUFJPR1JBTVMpICQobm9pbnN0X1BST0dSQU1TKQotCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgZWNobyAiICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCSQobWtpbnN0YWxsZGlycykgJCh0b29sZGlyKS9iaW4KLQlmb3IgaSBpbiAkKFRPT0xfUFJPR1MpOyBkbyBcCi0JICBpZiBbIC1mICQkaSQoRVhFRVhUKSBdOyB0aGVuIFwKLQkgICAgaj1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvLW5ldy8vJ2A7IFwKLQkgICAgaz1gZWNobyAkJGogfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JICAgIGlmIFsgIiQoYmluZGlyKS8kJGskKEVYRUVYVCkiICE9ICIkKHRvb2xkaXIpL2Jpbi8kJGokKEVYRUVYVCkiIF07IHRoZW4gXAotCSAgICAgIHJtIC1mICQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKTsgXAotCSAgICAgIGxuICQoYmluZGlyKS8kJGskKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAotCQl8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGkkKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpOyBcCi0JICAgIGZpOyBcCi0JICBlbHNlIHRydWU7IFwKLQkgIGZpOyBcCi0JZG9uZQotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotCi1hZGRyMmxpbmUubzogYWRkcjJsaW5lLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvZGVtYW5nbGUuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWFyLm86IGFyLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9wcm9ncmVzcy5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvYW91dC9hci5oICQoQkZERElSKS9saWJiZmQuaCBhcnN1cC5oCi1hcnN1cC5vOiBhcnN1cC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGFyc3VwLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWJ1Y29tbS5vOiBidWNvbW0uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotY29mZmR1bXAubzogY29mZmR1bXAuYyBjb2ZmZ3Jvay5oIGJ1Y29tbS5oIGNvbmZpZy5oIFwKLSAgJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotY29mZmdyb2subzogY29mZmdyb2suYyBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmZ3Jvay5oCi1kZWJ1Zy5vOiBkZWJ1Zy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaAotZGxsdG9vbC5vOiBkbGx0b29sLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL2RlbWFuZ2xlLmggZGxsdG9vbC5oCi1maWxlbW9kZS5vOiBmaWxlbW9kZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWllZWUubzogaWVlZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvaWVlZS5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBkZWJ1Zy5oIGJ1ZGJnLmgKLWlzLXJhbmxpYi5vOiBpcy1yYW5saWIuYwotaXMtc3RyaXAubzogaXMtc3RyaXAuYwotbWF5YmUtcmFubGliLm86IG1heWJlLXJhbmxpYi5jCi1tYXliZS1zdHJpcC5vOiBtYXliZS1zdHJpcC5jCi1ubG1jb252Lm86IG5sbWNvbnYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoQkZERElSKS9saWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1jb252LmgKLW5tLm86IG5tLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9wcm9ncmVzcy5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvZ2V0b3B0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1ub3QtcmFubGliLm86IG5vdC1yYW5saWIuYwotbm90LXN0cmlwLm86IG5vdC1zdHJpcC5jCi1vYmpjb3B5Lm86IG9iamNvcHkuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvcHJvZ3Jlc3MuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBidWRiZy5oCi1vYmpkdW1wLm86IG9iamR1bXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL3Byb2dyZXNzLmggYnVjb21tLmggY29uZmlnLmggXAotICAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9kaXMtYXNtLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggZGVidWcuaCBidWRiZy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1wcmRiZy5vOiBwcmRiZy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaCBidWRiZy5oCi1yZGNvZmYubzogcmRjb2ZmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9kZW1hbmdsZS5oIGRlYnVnLmggXAotICBidWRiZy5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotcmRkYmcubzogcmRkYmcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmggYnVkYmcuaAotc2l6ZS5vOiBzaXplLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9nZXRvcHQuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zcmNvbnYubzogc3Jjb252LmMgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gIHN5c3JvZmYuaCBjb2ZmZ3Jvay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3lzcm9mZi5jCi1zdGFicy5vOiBzdGFicy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggZGVidWcuaCBidWRiZy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotc3RyaW5ncy5vOiBzdHJpbmdzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXN5c2R1bXAubzogc3lzZHVtcC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggc3lzcm9mZi5oIFwKLSAgc3lzcm9mZi5jCi12ZXJzaW9uLm86IHZlcnNpb24uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi13cnN0YWJzLm86IHdyc3RhYnMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmggYnVkYmcuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXdpbmRyZXMubzogd2luZHJlcy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9vYnN0YWNrLmggd2luZHJlcy5oIFwKLSAgd2luZHVuaS5oCi1yZXNyYy5vOiByZXNyYy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaAotcmVzY29mZi5vOiByZXNjb2ZmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLXJlc2Jpbi5vOiByZXNiaW4uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmgKLXdpbmR1bmkubzogd2luZHVuaS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggd2luZHVuaS5oCi1yZWFkZWxmLm86IHJlYWRlbGYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2R3YXJmMi5oICQoSU5DRElSKS9lbGYvaTM4Ni5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvZWxmL3Y4NTAuaCAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvbWlwcy5oIFwKLSAgJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9tNjhrLmggXAotICAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9tMzJyLmggJChJTkNESVIpL2VsZi9kMTB2LmggXAotICAkKElOQ0RJUikvZWxmL2QzMHYuaCAkKElOQ0RJUikvZWxmL3NoLmggJChJTkNESVIpL2VsZi9tbjEwMjAwLmggXAotICAkKElOQ0RJUikvZWxmL21uMTAzMDAuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9mcjMwLmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaAotcmVzcmVzLm86IHJlc3Jlcy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaAotZHluLXN0cmluZy5vOiBkeW4tc3RyaW5nLmMgY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBkeW4tc3RyaW5nLmgKLWRsbHdyYXAubzogZGxsd3JhcC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oIGR5bi1zdHJpbmcuaAotcmVuYW1lLm86IHJlbmFtZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLXVuZGVyc2NvcmUubzogdW5kZXJzY29yZS5jCi1hcnBhcnNlLm86IGFycGFyc2UuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGFyc3VwLmgKLWFybGV4Lm86IGFybGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oIGFycGFyc2UuaAotc3lzcm9mZi5vOiBzeXNyb2ZmLmMKLXN5c2luZm8ubzogc3lzaW5mby5jCi1zeXNsZXgubzogc3lzbGV4LmMgc3lzaW5mby5oCi1kZWZwYXJzZS5vOiBkZWZwYXJzZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggZGxsdG9vbC5oCi1kZWZsZXgubzogZGVmbGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgZGVmcGFyc2UuaCBkbGx0b29sLmgKLW5sbWhlYWRlci5vOiBubG1oZWFkZXIuYyAuLi9iZmQvYmZkLmggYnVjb21tLmggY29uZmlnLmggXAotICAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgbmxtY29udi5oCi1yY3BhcnNlLm86IHJjcGFyc2UuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmgKLXJjbGV4Lm86IHJjbGV4LmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oIHJjcGFyc2UuaAotCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL01ha2VmaWxlLmluIGIvYmludXRpbHMvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0Nzk2MTYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMzYxICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1ERVNURElSID0KLQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLQotdG9wX2J1aWxkZGlyID0gLgotCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfdHJpcGxldCA9IEBob3N0QAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKLUFSID0gQEFSQAotQVMgPSBAQVNACi1CVUlMRF9ETExUT09MID0gQEJVSUxEX0RMTFRPT0xACi1CVUlMRF9ETExXUkFQID0gQEJVSUxEX0RMTFdSQVBACi1CVUlMRF9NSVNDID0gQEJVSUxEX01JU0NACi1CVUlMRF9OTE1DT05WID0gQEJVSUxEX05MTUNPTlZACi1CVUlMRF9TUkNPTlYgPSBAQlVJTERfU1JDT05WQAotQlVJTERfV0lORFJFUyA9IEBCVUlMRF9XSU5EUkVTQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1EQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLURMTFRPT0xfREVGUyA9IEBETExUT09MX0RFRlNACi1FWEVFWFQgPSBARVhFRVhUQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MRCA9IEBMREAKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotTkxNQ09OVl9ERUZTID0gQE5MTUNPTlZfREVGU0AKLU5NID0gQE5NQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVU5ERVJTQ09SRSA9IEBVTkRFUlNDT1JFQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotbCA9IEBsQAotCi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyBkZWphZ251Ci0KLVNVQkRJUlMgPSBwbwotCi10b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpCi0KLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1FWEVFWFRfRk9SX0JVSUxEID0gQEVYRUVYVF9GT1JfQlVJTERACi0KLVlBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdIDsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MJChzcmNkaXIpLy4uL2Jpc29uLyA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAotWUZMQUdTID0gLWQKLUxFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdIDsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleCA7IGVsc2UgZWNobyBmbGV4IDsgZmlgCi0KLSMgdGhlc2UgdHdvIGFyZSBhbG1vc3QgdGhlIHNhbWUgcHJvZ3JhbQotQVJfUFJPRyA9IGFyCi1SQU5MSUJfUFJPRyA9IHJhbmxpYgotCi0jIG9iamNvcHkgYW5kIHN0cmlwIHNob3VsZCBiZSB0aGUgc2FtZSBwcm9ncmFtCi1PQkpDT1BZX1BST0cgPSBvYmpjb3B5Ci1TVFJJUF9QUk9HID0gc3RyaXAtbmV3Ci0KLVNUUklOR1NfUFJPRyA9IHN0cmluZ3MKLQotUkVBREVMRl9QUk9HID0gcmVhZGVsZgotCi0jIFRoZXNlIHNob3VsZCBhbGwgYmUgdGhlIHNhbWUgcHJvZ3JhbSB0b28uCi1TSVpFX1BST0cgPSBzaXplCi1OTV9QUk9HID0gbm0tbmV3Ci1PQkpEVU1QX1BST0cgPSBvYmpkdW1wCi0KLSMgVGhpcyBpcyB0aGUgZGVtYW5nbGVyLCBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLSMgTm90ZTogVGhpcyBvbmUgaXMgdXNlZCBhcyB0aGUgaW5zdGFsbGVkIG5hbWUgdG9vLCB1bmxpa2UgdGhlIGFib3ZlLgotREVNQU5HTEVSX1BST0cgPSBjKytmaWx0Ci0KLUFERFIyTElORV9QUk9HID0gYWRkcjJsaW5lCi0KLU5MTUNPTlZfUFJPRyA9IG5sbWNvbnYKLURMTFRPT0xfUFJPRyA9IGRsbHRvb2wKLVdJTkRSRVNfUFJPRyA9IHdpbmRyZXMKLURMTFdSQVBfUFJPRyA9IGRsbHdyYXAKLQotU1JDT05WX1BST0cgPSBzcmNvbnYkKEVYRUVYVCkgc3lzZHVtcCQoRVhFRVhUKSBjb2ZmZHVtcCQoRVhFRVhUKSAKLQotbWFuX01BTlMgPSBhci4xIG5tLjEgb2JqZHVtcC4xIHJhbmxpYi4xIHNpemUuMSBzdHJpbmdzLjEgc3RyaXAuMSBvYmpjb3B5LjEgXAotCWFkZHIybGluZS4xIG5sbWNvbnYuMSAkKERFTUFOR0xFUl9QUk9HKS4xCi0KLQotUFJPR1MgPSAkKFNJWkVfUFJPRykgJChPQkpEVU1QX1BST0cpICQoTk1fUFJPRykgJChBUl9QUk9HKSAkKFNUUklOR1NfUFJPRykgJChTVFJJUF9QUk9HKSAkKFJBTkxJQl9QUk9HKSAkKERFTUFOR0xFUl9QUk9HKSAkKE9CSkNPUFlfUFJPRykgQEJVSUxEX05MTUNPTlZAIEBCVUlMRF9TUkNPTlZAIEBCVUlMRF9ETExUT09MQCBAQlVJTERfV0lORFJFU0AgJChBRERSMkxJTkVfUFJPRykgJChSRUFERUxGX1BST0cpIEBCVUlMRF9ETExXUkFQQCBAQlVJTERfTUlTQ0AKLQotYmluX1BST0dSQU1TID0gJChTSVpFX1BST0cpICQoT0JKRFVNUF9QUk9HKSAkKEFSX1BST0cpICQoU1RSSU5HU19QUk9HKSAkKFJBTkxJQl9QUk9HKSAkKERFTUFOR0xFUl9QUk9HKSAkKE9CSkNPUFlfUFJPRykgQEJVSUxEX05MTUNPTlZAIEBCVUlMRF9TUkNPTlZAIEBCVUlMRF9ETExUT09MQCBAQlVJTERfV0lORFJFU0AgJChBRERSMkxJTkVfUFJPRykgJChSRUFERUxGX1BST0cpIEBCVUlMRF9ETExXUkFQQCBAQlVJTERfTUlTQ0AKLQotbm9pbnN0X1BST0dSQU1TID0gJChOTV9QUk9HKSAkKFNUUklQX1BST0cpCi0KLUVYVFJBX1BST0dSQU1TID0gJChOTE1DT05WX1BST0cpIHNyY29udiBzeXNkdW1wIGNvZmZkdW1wICQoRExMVE9PTF9QUk9HKSAkKFdJTkRSRVNfUFJPRykgJChETExXUkFQX1BST0cpCi0KLSMgU3R1ZmYgdGhhdCBnb2VzIGluIHRvb2xkaXIvIGlmIGFwcHJvcHJpYXRlCi1UT09MX1BST0dTID0gbm0tbmV3IHN0cmlwLW5ldyBhciByYW5saWIgZGxsdG9vbAotCi1CQVNFRElSID0gJChzcmNkaXIpLy4uCi1CRkRESVIgPSAkKEJBU0VESVIpL2JmZAotSU5DRElSID0gJChCQVNFRElSKS9pbmNsdWRlCi0KLURFUCA9IG1rZGVwCi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKEJGRERJUikgLUkkKElOQ0RJUikgQEhERUZJTkVTQCAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLUhGSUxFUyA9IGFyc3VwLmggYnVjb21tLmggYnVkYmcuaCBjb2ZmZ3Jvay5oIGRlYnVnLmggbmxtY29udi5oIGRsbHRvb2wuaCBcCi0Jd2luZHJlcy5oIHdpbmR1bmkuaCBkeW4tc3RyaW5nLmgKLQotCi1HRU5FUkFURURfSEZJTEVTID0gYXJwYXJzZS5oIHN5c3JvZmYuaCBzeXNpbmZvLmggZGVmcGFyc2UuaAotCi1DRklMRVMgPSBhZGRyMmxpbmUuYyBhci5jIGFyc3VwLmMgYnVjb21tLmMgY29mZmR1bXAuYyBjb2ZmZ3Jvay5jIGRlYnVnLmMgXAotCWRsbHRvb2wuYyBmaWxlbW9kZS5jIGllZWUuYyBpcy1yYW5saWIuYyBpcy1zdHJpcC5jIG1heWJlLXJhbmxpYi5jIFwKLQltYXliZS1zdHJpcC5jIG5sbWNvbnYuYyBubS5jIG5vdC1yYW5saWIuYyBub3Qtc3RyaXAuYyBcCi0Jb2JqY29weS5jIG9iamR1bXAuYyBwcmRiZy5jIHJkY29mZi5jIHJkZGJnLmMgc2l6ZS5jIHNyY29udi5jIFwKLQlzdGFicy5jIHN0cmluZ3MuYyBzeXNkdW1wLmMgdmVyc2lvbi5jIHdyc3RhYnMuYyBcCi0Jd2luZHJlcy5jIHJlc3JjLmMgcmVzY29mZi5jIHJlc2Jpbi5jIHdpbmR1bmkuYyByZWFkZWxmLmMgXAotCXJlc3Jlcy5jIGR5bi1zdHJpbmcuYyBkbGx3cmFwLmMgcmVuYW1lLmMKLQotCi1HRU5FUkFURURfQ0ZJTEVTID0gXAotCXVuZGVyc2NvcmUuYyBhcnBhcnNlLmMgYXJsZXguYyBzeXNyb2ZmLmMgc3lzaW5mby5jIHN5c2xleC5jIFwKLQlkZWZwYXJzZS5jIGRlZmxleC5jIG5sbWhlYWRlci5jIHJjcGFyc2UuYyByY2xleC5jCi0KLQotREVCVUdfU1JDUyA9IHJkZGJnLmMgZGVidWcuYyBzdGFicy5jIGllZWUuYyByZGNvZmYuYwotV1JJVEVfREVCVUdfU1JDUyA9ICQoREVCVUdfU1JDUykgd3JzdGFicy5jCi0KLSMgQ29kZSBzaGFyZWQgYnkgYWxsIHRoZSBiaW51dGlscy4KLUJVTElCUyA9IGJ1Y29tbS5jIHZlcnNpb24uYyBmaWxlbW9kZS5jCi0KLUJGRExJQiA9IC4uL2JmZC9saWJiZmQubGEKLQotT1BDT0RFUyA9IC4uL29wY29kZXMvbGlib3Bjb2Rlcy5sYQotCi1MSUJJQkVSVFkgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLQotUE9URklMRVMgPSAkKENGSUxFUykgJChERUJVR19TUkNTKSAkKEhGSUxFUykKLQotRVhQRUNUID0gYGlmIFsgLWYgJCRyLy4uL2V4cGVjdC9leHBlY3QgXSA7IHRoZW4gXAotICAgICAgICAgIGVjaG8gJCRyLy4uL2V4cGVjdC9leHBlY3QgOyBcCi0gICAgICAgICAgZWxzZSBlY2hvIGV4cGVjdCA7IGZpYAotCi1SVU5URVNUID0gYGlmIFsgLWYgJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCBdIDsgdGhlbiBcCi0gICAgICAgICAgIGVjaG8gJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCA7IFwKLSAgICAgICAgICAgZWxzZSBlY2hvIHJ1bnRlc3QgOyAgZmlgCi0KLQotQ0NfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci8uLi9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvLi4vbmV3bGliL01ha2VmaWxlIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy8gLWlkaXJhZnRlciAkJHIvLi4vbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQke3NyY3Jvb3R9Ly4uL25ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvOyBcCi0gICAgZmk7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiQGhvc3RAIiA9ICJAdGFyZ2V0QCIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKENDKTsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyBnY2MgfCBzZWQgJyQodHJhbnNmb3JtKSc7IFwKLSAgICBmaTsgXAotICBmaWAKLQotCi1pbmZvX1RFWElORk9TID0gYmludXRpbHMudGV4aQotCi1MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotc2l6ZV9TT1VSQ0VTID0gc2l6ZS5jICQoQlVMSUJTKQotCi1vYmpjb3B5X1NPVVJDRVMgPSBvYmpjb3B5LmMgbm90LXN0cmlwLmMgcmVuYW1lLmMgJChXUklURV9ERUJVR19TUkNTKSAkKEJVTElCUykKLQotc3RyaW5nc19TT1VSQ0VTID0gc3RyaW5ncy5jICQoQlVMSUJTKQotCi1yZWFkZWxmX1NPVVJDRVMgPSByZWFkZWxmLmMgdmVyc2lvbi5jCi1yZWFkZWxmX0xEQUREID0gJChJTlRMTElCUykgJChMSUJJQkVSVFkpCi0KLXN0cmlwX25ld19TT1VSQ0VTID0gb2JqY29weS5jIGlzLXN0cmlwLmMgcmVuYW1lLmMgJChXUklURV9ERUJVR19TUkNTKSAkKEJVTElCUykKLQotbm1fbmV3X1NPVVJDRVMgPSBubS5jICQoQlVMSUJTKQotCi1vYmpkdW1wX1NPVVJDRVMgPSBvYmpkdW1wLmMgcHJkYmcuYyAkKERFQlVHX1NSQ1MpICQoQlVMSUJTKQotb2JqZHVtcF9MREFERCA9ICQoT1BDT0RFUykgJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi1jX19maWx0X1NPVVJDRVMgPSAKLWNfX2ZpbHRfTERBREQgPSBjcGx1cy1kZW0ubyB1bmRlcnNjb3JlLm8gJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLWFyX1NPVVJDRVMgPSBhcnBhcnNlLnkgYXJsZXgubCBhci5jIG5vdC1yYW5saWIuYyBhcnN1cC5jIHJlbmFtZS5jICQoQlVMSUJTKQotYXJfTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpIEBMRVhMSUJAICQoSU5UTExJQlMpCi0KLXJhbmxpYl9TT1VSQ0VTID0gYXIuYyBpcy1yYW5saWIuYyBhcnBhcnNlLnkgYXJsZXgubCBhcnN1cC5jIHJlbmFtZS5jICQoQlVMSUJTKQotcmFubGliX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQotCi1hZGRyMmxpbmVfU09VUkNFUyA9IGFkZHIybGluZS5jICQoQlVMSUJTKQotCi1zcmNvbnZfU09VUkNFUyA9IHNyY29udi5jIGNvZmZncm9rLmMgJChCVUxJQlMpCi0KLWRsbHRvb2xfU09VUkNFUyA9IGRsbHRvb2wuYyBkZWZwYXJzZS55IGRlZmxleC5sICQoQlVMSUJTKQotZGxsdG9vbF9MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKLQotY29mZmR1bXBfU09VUkNFUyA9IGNvZmZkdW1wLmMgY29mZmdyb2suYyAkKEJVTElCUykKLQotc3lzZHVtcF9TT1VSQ0VTID0gc3lzZHVtcC5jICQoQlVMSUJTKQotCi1ubG1jb252X1NPVVJDRVMgPSBubG1jb252LmMgbmxtaGVhZGVyLnkgJChCVUxJQlMpCi0KLXdpbmRyZXNfU09VUkNFUyA9IHdpbmRyZXMuYyByZXNyYy5jIHJlc2NvZmYuYyByZXNiaW4uYyByY3BhcnNlLnkgcmNsZXgubCBcCi0Jd2luZHVuaS5jIHJlc3Jlcy5jICQoQlVMSUJTKQotCi13aW5kcmVzX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQotCi1kbGx3cmFwX1NPVVJDRVMgPSBkbGx3cmFwLmMgZHluLXN0cmluZy5jIAotZGxsd3JhcF9MREFERCA9ICQoTElCSUJFUlRZKQotCi1ESVNUU1RVRkYgPSBhcnBhcnNlLmMgYXJwYXJzZS5oIGFybGV4LmMgbmxtaGVhZGVyLmMgc3lzaW5mby5jIHN5c2luZm8uaCBcCi0Jc3lzbGV4LmMgZGVmbGV4LmMgZGVmcGFyc2UuaCBkZWZwYXJzZS5jIHJjbGV4LmMgcmNwYXJzZS5oIHJjcGFyc2UuYwotCi0KLURJU1RDTEVBTkZJTEVTID0gc3RhbXAtdW5kZXIgc3lzaW5mbyB1bmRlcnNjb3JlLmMgc3lzcm9mZi5jIHN5c3JvZmYuaCBcCi0Jc2l0ZS5leHAgc2l0ZS5iYWsKLQotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IGNvbmZpZy50ZXhpCi0KLU1PU1RMWUNMRUFORklMRVMgPSBzeXNpbmZvICQoREVNQU5HTEVSX1BST0cpLjEgYmludXRpbHMubG9nIGJpbnV0aWxzLnN1bSBcCi0JYWJjZGVmZ2gqCi0KLQotQ0xFQU5GSUxFUyA9IGRlcC5zZWQgLmRlcCAuZGVwMQotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSAKLWJpbl9QUk9HUkFNUyA9ICBzaXplJChFWEVFWFQpIG9iamR1bXAkKEVYRUVYVCkgYXIkKEVYRUVYVCkgXAotc3RyaW5ncyQoRVhFRVhUKSByYW5saWIkKEVYRUVYVCkgYysrZmlsdCQoRVhFRVhUKSBvYmpjb3B5JChFWEVFWFQpIFwKLUBCVUlMRF9OTE1DT05WQCBAQlVJTERfU1JDT05WQCBAQlVJTERfRExMVE9PTEAgQEJVSUxEX1dJTkRSRVNAIFwKLWFkZHIybGluZSQoRVhFRVhUKSByZWFkZWxmJChFWEVFWFQpIEBCVUlMRF9ETExXUkFQQCBAQlVJTERfTUlTQ0AKLW5vaW5zdF9QUk9HUkFNUyA9ICBubS1uZXckKEVYRUVYVCkgc3RyaXAtbmV3JChFWEVFWFQpCi1QUk9HUkFNUyA9ICAkKGJpbl9QUk9HUkFNUykgJChub2luc3RfUFJPR1JBTVMpCi0KLQotREVGUyA9IEBERUZTQCAtSS4gLUkkKHNyY2RpcikgLUkuCi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQlMgPSBATElCU0AKLW5sbWNvbnZfT0JKRUNUUyA9ICBubG1jb252Lm8gbmxtaGVhZGVyLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLW5sbWNvbnZfTERBREQgPSAkKExEQUREKQotbmxtY29udl9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLW5sbWNvbnZfTERGTEFHUyA9IAotc3Jjb252X09CSkVDVFMgPSAgc3Jjb252Lm8gY29mZmdyb2subyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotc3Jjb252X0xEQUREID0gJChMREFERCkKLXNyY29udl9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLXNyY29udl9MREZMQUdTID0gCi1zeXNkdW1wX09CSkVDVFMgPSAgc3lzZHVtcC5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1zeXNkdW1wX0xEQUREID0gJChMREFERCkKLXN5c2R1bXBfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1zeXNkdW1wX0xERkxBR1MgPSAKLWNvZmZkdW1wX09CSkVDVFMgPSAgY29mZmR1bXAubyBjb2ZmZ3Jvay5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1jb2ZmZHVtcF9MREFERCA9ICQoTERBREQpCi1jb2ZmZHVtcF9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLWNvZmZkdW1wX0xERkxBR1MgPSAKLWRsbHRvb2xfT0JKRUNUUyA9ICBkbGx0b29sLm8gZGVmcGFyc2UubyBkZWZsZXgubyBidWNvbW0ubyB2ZXJzaW9uLm8gXAotZmlsZW1vZGUubwotZGxsdG9vbF9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLWRsbHRvb2xfTERGTEFHUyA9IAotd2luZHJlc19PQkpFQ1RTID0gIHdpbmRyZXMubyByZXNyYy5vIHJlc2NvZmYubyByZXNiaW4ubyByY3BhcnNlLm8gXAotcmNsZXgubyB3aW5kdW5pLm8gcmVzcmVzLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLXdpbmRyZXNfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi13aW5kcmVzX0xERkxBR1MgPSAKLWRsbHdyYXBfT0JKRUNUUyA9ICBkbGx3cmFwLm8gZHluLXN0cmluZy5vCi1kbGx3cmFwX0RFUEVOREVOQ0lFUyA9ICAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLWRsbHdyYXBfTERGTEFHUyA9IAotc2l6ZV9PQkpFQ1RTID0gIHNpemUubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotc2l6ZV9MREFERCA9ICQoTERBREQpCi1zaXplX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotc2l6ZV9MREZMQUdTID0gCi1vYmpkdW1wX09CSkVDVFMgPSAgb2JqZHVtcC5vIHByZGJnLm8gcmRkYmcubyBkZWJ1Zy5vIHN0YWJzLm8gaWVlZS5vIFwKLXJkY29mZi5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1vYmpkdW1wX0RFUEVOREVOQ0lFUyA9ICAuLi9vcGNvZGVzL2xpYm9wY29kZXMubGEgLi4vYmZkL2xpYmJmZC5sYSBcCi0uLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLW9iamR1bXBfTERGTEFHUyA9IAotYXJfT0JKRUNUUyA9ICBhcnBhcnNlLm8gYXJsZXgubyBhci5vIG5vdC1yYW5saWIubyBhcnN1cC5vIHJlbmFtZS5vIFwKLWJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1hcl9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLWFyX0xERkxBR1MgPSAKLXN0cmluZ3NfT0JKRUNUUyA9ICBzdHJpbmdzLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLXN0cmluZ3NfTERBREQgPSAkKExEQUREKQotc3RyaW5nc19ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLXN0cmluZ3NfTERGTEFHUyA9IAotcmFubGliX09CSkVDVFMgPSAgYXIubyBpcy1yYW5saWIubyBhcnBhcnNlLm8gYXJsZXgubyBhcnN1cC5vIHJlbmFtZS5vIFwKLWJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1yYW5saWJfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1yYW5saWJfTERGTEFHUyA9IAotY19fZmlsdF9PQkpFQ1RTID0gCi1jX19maWx0X0RFUEVOREVOQ0lFUyA9ICBjcGx1cy1kZW0ubyB1bmRlcnNjb3JlLm8gXAotLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1jX19maWx0X0xERkxBR1MgPSAKLW9iamNvcHlfT0JKRUNUUyA9ICBvYmpjb3B5Lm8gbm90LXN0cmlwLm8gcmVuYW1lLm8gcmRkYmcubyBkZWJ1Zy5vIFwKLXN0YWJzLm8gaWVlZS5vIHJkY29mZi5vIHdyc3RhYnMubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotb2JqY29weV9MREFERCA9ICQoTERBREQpCi1vYmpjb3B5X0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotb2JqY29weV9MREZMQUdTID0gCi1hZGRyMmxpbmVfT0JKRUNUUyA9ICBhZGRyMmxpbmUubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotYWRkcjJsaW5lX0xEQUREID0gJChMREFERCkKLWFkZHIybGluZV9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLWFkZHIybGluZV9MREZMQUdTID0gCi1yZWFkZWxmX09CSkVDVFMgPSAgcmVhZGVsZi5vIHZlcnNpb24ubwotcmVhZGVsZl9ERVBFTkRFTkNJRVMgPSAgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1yZWFkZWxmX0xERkxBR1MgPSAKLW5tX25ld19PQkpFQ1RTID0gIG5tLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLW5tX25ld19MREFERCA9ICQoTERBREQpCi1ubV9uZXdfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1ubV9uZXdfTERGTEFHUyA9IAotc3RyaXBfbmV3X09CSkVDVFMgPSAgb2JqY29weS5vIGlzLXN0cmlwLm8gcmVuYW1lLm8gcmRkYmcubyBkZWJ1Zy5vIFwKLXN0YWJzLm8gaWVlZS5vIHJkY29mZi5vIHdyc3RhYnMubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotc3RyaXBfbmV3X0xEQUREID0gJChMREFERCkKLXN0cmlwX25ld19ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLXN0cmlwX25ld19MREZMQUdTID0gCi1MRVhfT1VUUFVUX1JPT1QgPSBATEVYX09VVFBVVF9ST09UQAotTEVYTElCID0gQExFWExJQkAKLVlMV1JBUCA9ICQodG9wX3NyY2RpcikvLi4veWx3cmFwCi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAKLVRFWEkyRFZJID0gYGlmIHRlc3QgLWYgJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IHRoZW4gZWNobyAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgZWxzZSBlY2hvIHRleGkyZHZpOyBmaWAKLVRFWElORk9fVEVYID0gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4Ci1JTkZPX0RFUFMgPSBiaW51dGlscy5pbmZvCi1EVklTID0gYmludXRpbHMuZHZpCi1URVhJTkZPUyA9IGJpbnV0aWxzLnRleGkKLW1hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQotTUFOUyA9ICQobWFuX01BTlMpCi0KLU5ST0ZGID0gbnJvZmYKLURJU1RfQ09NTU9OID0gIFJFQURNRSAuL3N0YW1wLWguaW4gQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluIFwKLU5FV1MgYWNpbmNsdWRlLm00IGFjbG9jYWwubTQgYXJsZXguYyBhcnBhcnNlLmMgY29uZmlnLmluIGNvbmZpZ3VyZSBcCi1jb25maWd1cmUuaW4gZGVmbGV4LmMgZGVmcGFyc2UuYyBubG1oZWFkZXIuYyByY2xleC5jIHJjcGFyc2UuYwotCi0KLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoU09VUkNFUykgJChIRUFERVJTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi0KLVRBUiA9IHRhcgotR1pJUF9FTlYgPSAtLWJlc3QKLVNPVVJDRVMgPSAkKG5sbWNvbnZfU09VUkNFUykgJChzcmNvbnZfU09VUkNFUykgJChzeXNkdW1wX1NPVVJDRVMpICQoY29mZmR1bXBfU09VUkNFUykgJChkbGx0b29sX1NPVVJDRVMpICQod2luZHJlc19TT1VSQ0VTKSAkKGRsbHdyYXBfU09VUkNFUykgJChzaXplX1NPVVJDRVMpICQob2JqZHVtcF9TT1VSQ0VTKSAkKGFyX1NPVVJDRVMpICQoc3RyaW5nc19TT1VSQ0VTKSAkKHJhbmxpYl9TT1VSQ0VTKSAkKGNfX2ZpbHRfU09VUkNFUykgJChvYmpjb3B5X1NPVVJDRVMpICQoYWRkcjJsaW5lX1NPVVJDRVMpICQocmVhZGVsZl9TT1VSQ0VTKSAkKG5tX25ld19TT1VSQ0VTKSAkKHN0cmlwX25ld19TT1VSQ0VTKQotT0JKRUNUUyA9ICQobmxtY29udl9PQkpFQ1RTKSAkKHNyY29udl9PQkpFQ1RTKSAkKHN5c2R1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9PQkpFQ1RTKSAkKGRsbHRvb2xfT0JKRUNUUykgJCh3aW5kcmVzX09CSkVDVFMpICQoZGxsd3JhcF9PQkpFQ1RTKSAkKHNpemVfT0JKRUNUUykgJChvYmpkdW1wX09CSkVDVFMpICQoYXJfT0JKRUNUUykgJChzdHJpbmdzX09CSkVDVFMpICQocmFubGliX09CSkVDVFMpICQoY19fZmlsdF9PQkpFQ1RTKSAkKG9iamNvcHlfT0JKRUNUUykgJChhZGRyMmxpbmVfT0JKRUNUUykgJChyZWFkZWxmX09CSkVDVFMpICQobm1fbmV3X09CSkVDVFMpICQoc3RyaXBfbmV3X09CSkVDVFMpCi0KLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5TIC5jIC5kdmkgLmluZm8gLmwgLmxvIC5vIC5wcyAucyAudGV4aSAudGV4aW5mbyAudHhpIC55Ci0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluICBhY2luY2x1ZGUubTQKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQotCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0KLWNvbmZpZy5oOiBzdGFtcC1oCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mIHN0YW1wLWg7IFwKLQkJJChNQUtFKSBzdGFtcC1oOyBcCi0JZWxzZSA6OyBmaQotc3RhbXAtaDogJChzcmNkaXIpL2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiBcCi0JICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAotJChzcmNkaXIpL2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQllbHNlIDo7IGZpCi0kKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKLQotbW9zdGx5Y2xlYW4taGRyOgotCi1jbGVhbi1oZHI6Ci0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oCi0KLW1haW50YWluZXItY2xlYW4taGRyOgotCi1tb3N0bHljbGVhbi1iaW5QUk9HUkFNUzoKLQotY2xlYW4tYmluUFJPR1JBTVM6Ci0JLXRlc3QgLXogIiQoYmluX1BST0dSQU1TKSIgfHwgcm0gLWYgJChiaW5fUFJPR1JBTVMpCi0KLWRpc3RjbGVhbi1iaW5QUk9HUkFNUzoKLQotbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUzoKLQotaW5zdGFsbC1iaW5QUk9HUkFNUzogJChiaW5fUFJPR1JBTVMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChiaW5kaXIpCi0JQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKERFU1RESVIpJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgJ3MvJChFWEVFWFQpJCQvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChERVNURElSKSQoYmluZGlyKS9gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi11bmluc3RhbGwtYmluUFJPR1JBTVM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJtIC1mICQoREVTVERJUikkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCS10ZXN0IC16ICIkKG5vaW5zdF9QUk9HUkFNUykiIHx8IHJtIC1mICQobm9pbnN0X1BST0dSQU1TKQotCi1kaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLW1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0ucy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLlMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoubyBjb3JlICouY29yZQotCi1jbGVhbi1jb21waWxlOgotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGU6Ci0KLS5jLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0ucy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLlMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbi1saWJ0b29sOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYnRvb2w6Ci0KLW5sbWNvbnYkKEVYRUVYVCk6ICQobmxtY29udl9PQkpFQ1RTKSAkKG5sbWNvbnZfREVQRU5ERU5DSUVTKQotCUBybSAtZiBubG1jb252JChFWEVFWFQpCi0JJChMSU5LKSAkKG5sbWNvbnZfTERGTEFHUykgJChubG1jb252X09CSkVDVFMpICQobmxtY29udl9MREFERCkgJChMSUJTKQotCi1zcmNvbnYkKEVYRUVYVCk6ICQoc3Jjb252X09CSkVDVFMpICQoc3Jjb252X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgc3Jjb252JChFWEVFWFQpCi0JJChMSU5LKSAkKHNyY29udl9MREZMQUdTKSAkKHNyY29udl9PQkpFQ1RTKSAkKHNyY29udl9MREFERCkgJChMSUJTKQotCi1zeXNkdW1wJChFWEVFWFQpOiAkKHN5c2R1bXBfT0JKRUNUUykgJChzeXNkdW1wX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgc3lzZHVtcCQoRVhFRVhUKQotCSQoTElOSykgJChzeXNkdW1wX0xERkxBR1MpICQoc3lzZHVtcF9PQkpFQ1RTKSAkKHN5c2R1bXBfTERBREQpICQoTElCUykKLQotY29mZmR1bXAkKEVYRUVYVCk6ICQoY29mZmR1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGNvZmZkdW1wJChFWEVFWFQpCi0JJChMSU5LKSAkKGNvZmZkdW1wX0xERkxBR1MpICQoY29mZmR1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9MREFERCkgJChMSUJTKQotCi1kbGx0b29sJChFWEVFWFQpOiAkKGRsbHRvb2xfT0JKRUNUUykgJChkbGx0b29sX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgZGxsdG9vbCQoRVhFRVhUKQotCSQoTElOSykgJChkbGx0b29sX0xERkxBR1MpICQoZGxsdG9vbF9PQkpFQ1RTKSAkKGRsbHRvb2xfTERBREQpICQoTElCUykKLQotd2luZHJlcyQoRVhFRVhUKTogJCh3aW5kcmVzX09CSkVDVFMpICQod2luZHJlc19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIHdpbmRyZXMkKEVYRUVYVCkKLQkkKExJTkspICQod2luZHJlc19MREZMQUdTKSAkKHdpbmRyZXNfT0JKRUNUUykgJCh3aW5kcmVzX0xEQUREKSAkKExJQlMpCi0KLWRsbHdyYXAkKEVYRUVYVCk6ICQoZGxsd3JhcF9PQkpFQ1RTKSAkKGRsbHdyYXBfREVQRU5ERU5DSUVTKQotCUBybSAtZiBkbGx3cmFwJChFWEVFWFQpCi0JJChMSU5LKSAkKGRsbHdyYXBfTERGTEFHUykgJChkbGx3cmFwX09CSkVDVFMpICQoZGxsd3JhcF9MREFERCkgJChMSUJTKQotCi1zaXplJChFWEVFWFQpOiAkKHNpemVfT0JKRUNUUykgJChzaXplX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgc2l6ZSQoRVhFRVhUKQotCSQoTElOSykgJChzaXplX0xERkxBR1MpICQoc2l6ZV9PQkpFQ1RTKSAkKHNpemVfTERBREQpICQoTElCUykKLQotb2JqZHVtcCQoRVhFRVhUKTogJChvYmpkdW1wX09CSkVDVFMpICQob2JqZHVtcF9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIG9iamR1bXAkKEVYRUVYVCkKLQkkKExJTkspICQob2JqZHVtcF9MREZMQUdTKSAkKG9iamR1bXBfT0JKRUNUUykgJChvYmpkdW1wX0xEQUREKSAkKExJQlMpCi0KLWFyJChFWEVFWFQpOiAkKGFyX09CSkVDVFMpICQoYXJfREVQRU5ERU5DSUVTKQotCUBybSAtZiBhciQoRVhFRVhUKQotCSQoTElOSykgJChhcl9MREZMQUdTKSAkKGFyX09CSkVDVFMpICQoYXJfTERBREQpICQoTElCUykKLQotc3RyaW5ncyQoRVhFRVhUKTogJChzdHJpbmdzX09CSkVDVFMpICQoc3RyaW5nc19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIHN0cmluZ3MkKEVYRUVYVCkKLQkkKExJTkspICQoc3RyaW5nc19MREZMQUdTKSAkKHN0cmluZ3NfT0JKRUNUUykgJChzdHJpbmdzX0xEQUREKSAkKExJQlMpCi0KLXJhbmxpYiQoRVhFRVhUKTogJChyYW5saWJfT0JKRUNUUykgJChyYW5saWJfREVQRU5ERU5DSUVTKQotCUBybSAtZiByYW5saWIkKEVYRUVYVCkKLQkkKExJTkspICQocmFubGliX0xERkxBR1MpICQocmFubGliX09CSkVDVFMpICQocmFubGliX0xEQUREKSAkKExJQlMpCi0KLWMrK2ZpbHQkKEVYRUVYVCk6ICQoY19fZmlsdF9PQkpFQ1RTKSAkKGNfX2ZpbHRfREVQRU5ERU5DSUVTKQotCUBybSAtZiBjKytmaWx0JChFWEVFWFQpCi0JJChMSU5LKSAkKGNfX2ZpbHRfTERGTEFHUykgJChjX19maWx0X09CSkVDVFMpICQoY19fZmlsdF9MREFERCkgJChMSUJTKQotCi1vYmpjb3B5JChFWEVFWFQpOiAkKG9iamNvcHlfT0JKRUNUUykgJChvYmpjb3B5X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgb2JqY29weSQoRVhFRVhUKQotCSQoTElOSykgJChvYmpjb3B5X0xERkxBR1MpICQob2JqY29weV9PQkpFQ1RTKSAkKG9iamNvcHlfTERBREQpICQoTElCUykKLQotYWRkcjJsaW5lJChFWEVFWFQpOiAkKGFkZHIybGluZV9PQkpFQ1RTKSAkKGFkZHIybGluZV9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGFkZHIybGluZSQoRVhFRVhUKQotCSQoTElOSykgJChhZGRyMmxpbmVfTERGTEFHUykgJChhZGRyMmxpbmVfT0JKRUNUUykgJChhZGRyMmxpbmVfTERBREQpICQoTElCUykKLQotcmVhZGVsZiQoRVhFRVhUKTogJChyZWFkZWxmX09CSkVDVFMpICQocmVhZGVsZl9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIHJlYWRlbGYkKEVYRUVYVCkKLQkkKExJTkspICQocmVhZGVsZl9MREZMQUdTKSAkKHJlYWRlbGZfT0JKRUNUUykgJChyZWFkZWxmX0xEQUREKSAkKExJQlMpCi0KLW5tLW5ldyQoRVhFRVhUKTogJChubV9uZXdfT0JKRUNUUykgJChubV9uZXdfREVQRU5ERU5DSUVTKQotCUBybSAtZiBubS1uZXckKEVYRUVYVCkKLQkkKExJTkspICQobm1fbmV3X0xERkxBR1MpICQobm1fbmV3X09CSkVDVFMpICQobm1fbmV3X0xEQUREKSAkKExJQlMpCi0KLXN0cmlwLW5ldyQoRVhFRVhUKTogJChzdHJpcF9uZXdfT0JKRUNUUykgJChzdHJpcF9uZXdfREVQRU5ERU5DSUVTKQotCUBybSAtZiBzdHJpcC1uZXckKEVYRUVYVCkKLQkkKExJTkspICQoc3RyaXBfbmV3X0xERkxBR1MpICQoc3RyaXBfbmV3X09CSkVDVFMpICQoc3RyaXBfbmV3X0xEQUREKSAkKExJQlMpCi0ubC5jOgotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChMRVgpIiAkPCAkKExFWF9PVVRQVVRfUk9PVCkuYyAkQCAtLSAkKEFNX0xGTEFHUykgJChMRkxBR1MpCi0ueS5jOgotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJDwgeS50YWIuYyAkKi5jIHkudGFiLmggJCouaCAtLSAkKEFNX1lGTEFHUykgJChZRkxBR1MpCi1hcnBhcnNlLmg6IGFycGFyc2UuYwotZGVmcGFyc2UuaDogZGVmcGFyc2UuYwotbmxtaGVhZGVyLmg6IG5sbWhlYWRlci5jCi1yY3BhcnNlLmg6IHJjcGFyc2UuYwotCi0KLWJpbnV0aWxzLmluZm86IGJpbnV0aWxzLnRleGkKLWJpbnV0aWxzLmR2aTogYmludXRpbHMudGV4aQotCi0KLURWSVBTID0gZHZpcHMKLQotLnRleGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udGV4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udHhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLS5kdmkucHM6Ci0JJChEVklQUykgJDwgLW8gJEAKLQotaW5zdGFsbC1pbmZvLWFtOiAkKElORk9fREVQUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGluZm9kaXIpCi0JQGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBpZmlsZSBpbiBgY2QgJCRkICYmIGVjaG8gJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XWA7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAkJGQvJCRpZmlsZTsgdGhlbiBcCi0JICAgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlIjsgXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlOyBcCi0JICAgIGVsc2UgOiA7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCUAkKFBPU1RfSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBsaXN0PSckKElORk9fREVQUyknOyBcCi0JICBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSI7XAotCSAgICBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUgfHwgOjtcCi0JICBkb25lOyBcCi0JZWxzZSA6IDsgZmkKLQotdW5pbnN0YWxsLWluZm86Ci0JJChQUkVfVU5JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGlpPXllczsgXAotCWVsc2UgaWk9OyBmaTsgXAotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgLXogIiRpaSIgXAotCSAgICB8fCBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAtLXJlbW92ZSAkJGZpbGU7IFwKLQlkb25lCi0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAoY2QgJChERVNURElSKSQoaW5mb2RpcikgJiYgcm0gLWYgJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XSk7IFwKLQlkb25lCi0KLWRpc3QtaW5mbzogJChJTkZPX0RFUFMpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBiYXNlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGJhc2U7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGZpbGUgaW4gYGNkICQkZCAmJiBldmFsIGVjaG8gJCRiYXNlKmA7IGRvIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tYW1pbmZvOgotCS1ybSAtZiBiaW51dGlscy5hdXggYmludXRpbHMuY3AgYmludXRpbHMuY3BzIGJpbnV0aWxzLmR2aSBiaW51dGlscy5mbiBcCi0JICBiaW51dGlscy5mbnMgYmludXRpbHMua3kgYmludXRpbHMua3lzIGJpbnV0aWxzLnBzIFwKLQkgIGJpbnV0aWxzLmxvZyBiaW51dGlscy5wZyBiaW51dGlscy50b2MgYmludXRpbHMudHAgXAotCSAgYmludXRpbHMudHBzIGJpbnV0aWxzLnZyIGJpbnV0aWxzLnZycyBiaW51dGlscy5vcCBiaW51dGlscy50ciBcCi0JICBiaW51dGlscy5jdiBiaW51dGlscy5jbgotCi1jbGVhbi1hbWluZm86Ci0KLWRpc3RjbGVhbi1hbWluZm86Ci0KLW1haW50YWluZXItY2xlYW4tYW1pbmZvOgotCWZvciBpIGluICQoSU5GT19ERVBTKTsgZG8gXAotCSAgcm0gLWYgJCRpOyBcCi0JICBpZiB0ZXN0ICJgZWNobyAkJGktWzAtOV0qYCIgIT0gIiQkaS1bMC05XSoiOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRpLVswLTldKjsgXAotCSAgZmk7IFwKLQlkb25lCi1jbGVhbi1pbmZvOiBtb3N0bHljbGVhbi1hbWluZm8KLQotaW5zdGFsbC1tYW4xOgotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobWFuMWRpcikKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvJCRpOyB0aGVuIGZpbGU9JChzcmNkaXIpLyQkaTsgXAotCSAgZWxzZSBmaWxlPSQkaTsgZmk7IFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotCi11bmluc3RhbGwtbWFuMToKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAotCWRvbmUKLWluc3RhbGwtbWFuOiAkKE1BTlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1tYW4xCi11bmluc3RhbGwtbWFuOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsLW1hbjEKLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLQotQFNFVF9NQUtFQAotCi1hbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsZGlycy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLWNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQlyZXY9Jyc7IGxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9ICIuIiAmJiBkb3Rfc2Vlbj15ZXM7IFwKLQlkb25lOyBcCi0JdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iICYmIHJldj0iLiAkJHJldiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCi10YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCi0JZG9uZQotCi10YWdzOiBUQUdTCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQloZXJlPWBwd2RgICYmIGNkICQoc3JjZGlyKSBcCi0JICAmJiBta2lkIC1mJCRoZXJlL0lEICQkdW5pcXVlICQoTElTUCkKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0gICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1mICQkc3ViZGlyL1RBR1MgJiYgdGFncz0iJCR0YWdzIC1pICQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotICAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCXRlc3QgLXogIiQoRVRBR1NfQVJHUyljb25maWcuaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKLQkgIHx8IChjZCAkKHNyY2RpcikgJiYgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgY29uZmlnLmluICQkdW5pcXVlICQoTElTUCkgLW8gJCRoZXJlL1RBR1MpCi0KLW1vc3RseWNsZWFuLXRhZ3M6Ci0KLWNsZWFuLXRhZ3M6Ci0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElECi0KLW1haW50YWluZXItY2xlYW4tdGFnczoKLQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIHp4ZiAkKGRpc3RkaXIpLnRhci5negotCW1rZGlyICQoZGlzdGRpcikvPWJ1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS89aW5zdAotCWRjX2luc3RhbGxfYmFzZT1gY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgOyBcCi0JY2QgJChkaXN0ZGlyKS89YnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSQkZGNfaW5zdGFsbF9iYXNlIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JQGJhbm5lcj0iJChkaXN0ZGlyKS50YXIuZ3ogaXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbiI7IFwKLQlkYXNoZXM9YGVjaG8gIiQkYmFubmVyIiB8IHNlZCBzLy4vPS9nYDsgXAotCWVjaG8gIiQkZGFzaGVzIjsgXAotCWVjaG8gIiQkYmFubmVyIjsgXAotCWVjaG8gIiQkZGFzaGVzIgotZGlzdDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3QtYWxsOiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdGRpcjogJChESVNURklMRVMpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKQotCS1jaG1vZCA3NzcgJChkaXN0ZGlyKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgICBjaG1vZCA3NzcgJChkaXN0ZGlyKS8kJHN1YmRpcjsgXAotCSAgICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9Li4vJChkaXN0ZGlyKSBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBkaXN0ZGlyPSIkKGRpc3RkaXIpIiBkaXN0LWluZm8KLQotUlVOVEVTVEZMQUdTID0KLQotREVKQVRPT0wgPSAkKFBBQ0tBR0UpCi0KLVJVTlRFU1RERUZBVUxURkxBR1MgPSAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCRzcmNkaXIKLXNpdGUuZXhwOiBNYWtlZmlsZQotCUBlY2hvICdNYWtpbmcgYSBuZXcgc2l0ZS5leHAgZmlsZS4uLicKLQlAdGVzdCAhIC1mIHNpdGUuYmFrIHx8IHJtIC1mIHNpdGUuYmFrCi0JQGVjaG8gJyMjIHRoZXNlIHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgbWFrZSAjIycgPiAkQC10Ci0JQGVjaG8gJyMgRG8gbm90IGVkaXQgaGVyZS4gIElmIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZXNlIHZhbHVlcycgPj4gJEAtdAotCUBlY2hvICcjIGVkaXQgdGhlIGxhc3Qgc2VjdGlvbicgPj4gJEAtdAotCUBlY2hvICdzZXQgdG9vbCAkKERFSkFUT09MKScgPj4gJEAtdAotCUBlY2hvICdzZXQgc3JjZGlyICQoc3JjZGlyKScgPj4gJEAtdAotCUBlY2hvICdzZXQgb2JqZGlyJyBgcHdkYCA+PiAkQC10Ci0JQGVjaG8gJ3NldCBob3N0X2FsaWFzICQoaG9zdF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IGhvc3RfdHJpcGxldCAkKGhvc3RfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnc2V0IHRhcmdldF9hbGlhcyAkKHRhcmdldF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IHRhcmdldF90cmlwbGV0ICQodGFyZ2V0X3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBidWlsZF9hbGlhcyAkKGJ1aWxkX2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgYnVpbGRfdHJpcGxldCAkKGJ1aWxkX3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJyMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlIGdlbmVyYXRlZCBieSBjb25maWd1cmUuIERvIE5vdCBFZGl0ICMjJyA+PiAkQC10Ci0JQHRlc3QgISAtZiBzaXRlLmV4cCB8fCBzZWQgJzEsL14jIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZS4qIyMvIGQnIHNpdGUuZXhwID4+ICRALXQKLQlAdGVzdCAhIC1mIHNpdGUuZXhwIHx8IG12IHNpdGUuZXhwIHNpdGUuYmFrCi0JQG12ICRALXQgc2l0ZS5leHAKLWluZm8tYW06ICQoSU5GT19ERVBTKQotaW5mbzogaW5mby1yZWN1cnNpdmUKLWR2aS1hbTogJChEVklTKQotZHZpOiBkdmktcmVjdXJzaXZlCi1jaGVjay1hbToKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjay1ERUpBR05VCi1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLWFsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1leGVjLWxvY2FsCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLQotaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1hbgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluUFJPR1JBTVMgdW5pbnN0YWxsLW1hbgotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoTUFOUykgY29uZmlnLmgKLWFsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci0JJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQoYmluZGlyKSAkKERFU1RESVIpJChtYW5kaXIpL21hbjEKLQotCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKE1PU1RMWUNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1PU1RMWUNMRUFORklMRVMpCi0KLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQktdGVzdCAteiAiJChESVNUQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoRElTVENMRUFORklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiYXJsZXhsZGVmbGV4bHJjbGV4bGFycGFyc2VoYXJwYXJzZWNkZWZwYXJzZWhkZWZwYXJzZWNubG1oZWFkZXJobmxtaGVhZGVyY3JjcGFyc2VocmNwYXJzZWMkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgYXJsZXhsIGRlZmxleGwgcmNsZXhsIGFycGFyc2VoIGFycGFyc2VjIGRlZnBhcnNlaCBkZWZwYXJzZWMgbmxtaGVhZGVyaCBubG1oZWFkZXJjIHJjcGFyc2VoIHJjcGFyc2VjICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1iaW5QUk9HUkFNUyBcCi0JCW1vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TIG1vc3RseWNsZWFuLWNvbXBpbGUgXAotCQltb3N0bHljbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtaW5mbyBtb3N0bHljbGVhbi10YWdzIFwKLQkJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1sb2NhbAotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLQkJY2xlYW4tY29tcGlsZSBjbGVhbi1saWJ0b29sIGNsZWFuLWFtaW5mbyBjbGVhbi10YWdzIFwKLQkJY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLWJpblBST0dSQU1TIFwKLQkJZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TIGRpc3RjbGVhbi1jb21waWxlIFwKLQkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tdGFncyBcCi0JCWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4tYmluUFJPR1JBTVMgXAotCQltYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBcCi0JCW1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tdGFncyBcCi0JCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tYW0KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi0uUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCi1tb3N0bHljbGVhbi1iaW5QUk9HUkFNUyBkaXN0Y2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tYmluUFJPR1JBTVMgXAotbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUyB1bmluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1iaW5QUk9HUkFNUyBcCi1tb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBkaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotY2xlYW4tbm9pbnN0UFJPR1JBTVMgbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUyBcCi1tb3N0bHljbGVhbi1jb21waWxlIGRpc3RjbGVhbi1jb21waWxlIGNsZWFuLWNvbXBpbGUgXAotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYnRvb2wgXAotY2xlYW4tbGlidG9vbCBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1pbmZvIFwKLW1vc3RseWNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tYW1pbmZvIGNsZWFuLWFtaW5mbyBcCi1tYWludGFpbmVyLWNsZWFuLWFtaW5mbyBpbnN0YWxsLW1hbjEgdW5pbnN0YWxsLW1hbjEgaW5zdGFsbC1tYW4gXAotdW5pbnN0YWxsLW1hbiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAotaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBjaGVjay1ERUpBR05VIFwKLWluZm8tYW0gaW5mbyBkdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgXAotaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1sb2NhbCBcCi1pbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBcCi1pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gXAotaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIFwKLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1jaGVjay1ERUpBR05VOiBzaXRlLmV4cAotCXNyY2Rpcj1gY2QgJChzcmNkaXIpICYmIHB3ZGA7IGV4cG9ydCBzcmNkaXI7IFwKLQlyPWBwd2RgOyBleHBvcnQgcjsgXAotCUVYUEVDVD0kKEVYUEVDVCk7IGV4cG9ydCBFWFBFQ1Q7IFwKLQlpZiBbIC1mICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IF07IHRoZW4gXAotCSAgVENMX0xJQlJBUlk9YGNkICQodG9wX3NyY2RpcikvLi4vdGNsL2xpYnJhcnkgJiYgcHdkYDsgXAotCSAgZXhwb3J0IFRDTF9MSUJSQVJZOyBcCi0JZmk7IFwKLQlydW50ZXN0PSQoUlVOVEVTVCk7IFwKLQlpZiAkKFNIRUxMKSAtYyAiJCRydW50ZXN0IC0tdmVyc2lvbiIgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICAkJHJ1bnRlc3QgLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQke3NyY2Rpcn0vdGVzdHN1aXRlIFwKLQkJQ0NfRk9SX1RBUkdFVD0iJChDQ19GT1JfVEFSR0VUKSIgXAotCQlDRkxBR1NfRk9SX1RBUkdFVD0iJChDRkxBR1MpIiAkKFJVTlRFU1RGTEFHUyk7IFwKLQllbHNlIGVjaG8gIldBUk5JTkc6IGNvdWxkIG5vdCBmaW5kIFxgcnVudGVzdCciIDE+JjI7IDo7XAotCWZpCi0KLWluc3RhbGxjaGVjazoKLQkvYmluL3NoICQoc3JjZGlyKS9zYW5pdHkuc2ggJChiaW5kaXIpCi0KLXVuZGVyc2NvcmUuYzogc3RhbXAtdW5kZXIgOyBAdHJ1ZQotCi1zdGFtcC11bmRlcjogTWFrZWZpbGUKLQllY2hvICcvKldBUk5JTkc6IFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCEqLycgPnVuZGVyc2NvcmUudAotCWVjaG8gImludCBwcmVwZW5kc191bmRlcnNjb3JlID0gQFVOREVSU0NPUkVAOyIgPj51bmRlcnNjb3JlLnQKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdW5kZXJzY29yZS50IHVuZGVyc2NvcmUuYwotCXRvdWNoIHN0YW1wLXVuZGVyCi0KLWNwbHVzLWRlbS5vOiAkKEJBU0VESVIpL2xpYmliZXJ0eS9jcGx1cy1kZW0uYyAkKElOQ0RJUikvZ2V0b3B0LmgKLQkkKENPTVBJTEUpIC1jIC1ETUFJTiAtRFZFUlNJT049JyIkKFZFUlNJT04pIicgJChCQVNFRElSKS9saWJpYmVydHkvY3BsdXMtZGVtLmMKLQotIyBUaGUgZm9sbG93aW5nIGlzIGNvbW1lbnRlZCBvdXQgZm9yIHRoZSBjb252ZXJ0aW9uIHRvIGF1dG9tYWtlLgotIyBUaGlzIHJ1bGUgY3JlYXRlcyBhIHNpbmdsZSBiaW5hcnkgdGhhdCBzd2l0Y2hlcyBiZXR3ZWVuIGFyIGFuZCByYW5saWIKLSMgYnkgbG9va2luZyBhdCBhcmd2WzBdLiAgVXNlIHRoaXMga2x1ZGdlIHRvIHNhdmUgc29tZSBkaXNrIHNwYWNlLgotIyBIb3dldmVyLCB5b3UgaGF2ZSB0byBpbnN0YWxsIHRoaW5ncyBieSBoYW5kLgotIyAoVGhhdCBpcyBhZnRlciAnbWFrZSBpbnN0YWxsJywgcmVwbGFjZSB0aGUgaW5zdGFsbGVkIHJhbmxpYiBieSBhIGxpbmsgdG8gYXIuKQotIyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGluc3RhbGwgcmFubGliLnNoIGFzIHJhbmxpYi4KLSMgYXJfd2l0aF9yYW5saWI6ICQoQURETF9ERVBTKSBhci5vIG1heWJlLXJhbmxpYi5vCi0jCSQoSExERU5WKSAkKENDKSAkKEhMREZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkKEFSX1BST0cpIGFyLm8gbWF5YmUtcmFubGliLm8gJChBRERMX0xJQlMpICQoRVhUUkFMSUJTKQotIwktcm0gLWYgJChSQU5MSUJfUFJPRykKLSMJLWxuICQoQVJfUFJPRykgJChSQU5MSUJfUFJPRykKLSMKLSMgb2JqY29weSBhbmQgc3RyaXAgaW4gb25lIGJpbmFyeSB0aGF0IHVzZXMgYXJndlswXSB0byBkZWNpZGUgaXRzIGFjdGlvbi4KLSMKLSNvYmpjb3B5X3dpdGhfc3RyaXA6ICQoQURETF9ERVBTKSBvYmpjb3B5Lm8gbWF5YmUtc3RyaXAubwotIwkkKEhMREVOVikgJChDQykgJChITERGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJChPQkpDT1BZX1BST0cpIG9iamNvcHkubyBtYXliZS1zdHJpcC5vICQoQURETF9MSUJTKSAkKEVYVFJBTElCUykKLSMJLXJtIC1mICQoU1RSSVBfUFJPRykKLSMJLWxuICQoT0JKQ09QWV9QUk9HKSAkKFNUUklQX1BST0cpCi0KLXN5c3JvZmYuYzogc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgc3lzcm9mZi5pbmZvIAotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWMgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPnN5c3JvZmYuYwotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWkgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPj5zeXNyb2ZmLmMKLQkuL3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIC1nIDwkKHNyY2Rpcikvc3lzcm9mZi5pbmZvID4+c3lzcm9mZi5jCi0KLXN5c3JvZmYuaDogc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgc3lzcm9mZi5pbmZvCi0JLi9zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSAtZCA8JChzcmNkaXIpL3N5c3JvZmYuaW5mbyA+c3lzcm9mZi5oCi0KLXN5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpOiBzeXNpbmZvLm8gc3lzbGV4Lm8KLQkkKENDX0ZPUl9CVUlMRCkgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAgc3lzaW5mby5vIHN5c2xleC5vIAotCi1zeXNsZXgubzogc3lzbGV4LmMgc3lzaW5mby5oCi0JaWYgWyAtciBzeXNsZXguYyBdOyB0aGVuIFwKLQkgICQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4gJChDRkxBR1MpICBzeXNsZXguYyAgOyBcCi0JZWxzZSBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuIC1JJChzcmNkaXIpICQoQ0ZMQUdTKSAkKHNyY2Rpcikvc3lzbGV4LmMgO1wKLQlmaQotCi1zeXNpbmZvLm86IHN5c2luZm8uYwotCWlmIFsgLXIgc3lzaW5mby5jIF07IHRoZW4gXAotCSAgJChDQ19GT1JfQlVJTEQpIC1jIC1JLiAkKENGTEFHUykgIHN5c2luZm8uYyAgOyBcCi0JZWxzZSBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuICQoQ0ZMQUdTKSAkKHNyY2Rpcikvc3lzaW5mby5jIDsgXAotCWZpCi0KLWRsbHRvb2wubzpkbGx0b29sLmMKLQkkKENPTVBJTEUpIC1jICQoRExMVE9PTF9ERUZTKSAkKHNyY2RpcikvZGxsdG9vbC5jCi0KLXJlc2NvZmYubzpyZXNjb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoRExMVE9PTF9ERUZTKSAkKHNyY2RpcikvcmVzY29mZi5jCi0KLSMgY29mZi9zeW0uaCBhbmQgY29mZi9lY29mZi5oIHdvbid0IGJlIGZvdW5kIGJ5IHRoZSBhdXRvbWF0aWMgZGVwZW5kZW5jeQotIyBzY3JpcHRzLCBzaW5jZSB0aGV5IGFyZSBvbmx5IGluY2x1ZGVkIGNvbmRpdGlvbmFsbHkuCi1ubG1jb252Lm86IG5sbWNvbnYuYyAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi0JbGRuYW1lPWBlY2hvIGxkIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAotCSQoQ09NUElMRSkgLWMgLURMRF9OQU1FPSJcIiQke2xkbmFtZX1cIiIgQE5MTUNPTlZfREVGU0AgJChzcmNkaXIpL25sbWNvbnYuYwotCi0KLWRpc3RzdHVmZjogJChESVNUU1RVRkYpIGluZm8KLQotIyBUYXJnZXRzIHRvIHJlYnVpbGQgZGVwZW5kZW5jaWVzIGluIHRoaXMgTWFrZWZpbGUuCi0jIEhhdmUgdG8gZ2V0IHJpZCBvZiAuZGVwMSBoZXJlIHNvIHRoYXQgIiQ/IiBsYXRlciBpbmNsdWRlcyBhbGwgb2YgJChDRklMRVMpLgotLmRlcDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykgJChHRU5FUkFURURfSEZJTEVTKSBjb25maWcuaAotCXJtIC1mIC5kZXAxCi0JJChNQUtFKSBERVA9JChERVApIC5kZXAxCi0Jc2VkIC1mIGRlcC5zZWQgPC5kZXAxID4uZGVwCi0KLSMgVGhpcyBydWxlIHJlYWxseSB3YW50cyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCi0uZGVwMTogJChDRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykKLQlybSAtZiAuZGVwMgotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDIKLQkkKERFUCkgLWYgLmRlcDIgJChJTkNMVURFUykgJD8KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgLmRlcDIgLmRlcDEKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jb2JqZGlyPWBwd2RgOyBcCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCi0JCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKLQkJLWUgJ3MhQEJGRERJUkAhJChCRkRESVIpIScJXAotCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJwlcCi0JCS1lICJzIUBPQkpESVJAISQke29iamRpcn0hIgotCi1kZXA6IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmFtCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KLQotLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQotCi0jIyMKLSMgRE9DVU1FTlRBVElPTiBUQVJHRVRTCi1jb25maWcudGV4aTogTWFrZWZpbGUKLQlybSAtZiBjb25maWcudGV4aQotCWVjaG8gJ0BzZXQgVkVSU0lPTiAkKFZFUlNJT04pJyA+IGNvbmZpZy50ZXhpCi0KLWJpbnV0aWxzLmR2aTogJChzcmNkaXIpL2JpbnV0aWxzLnRleGkgY29uZmlnLnRleGkKLQotYmludXRpbHMuaW5mbzogJChzcmNkaXIpL2JpbnV0aWxzLnRleGkgY29uZmlnLnRleGkKLQotJChERU1BTkdMRVJfUFJPRykuMTogY3h4ZmlsdC5tYW4gTWFrZWZpbGUKLQlzZWQgLWUgJ3MvQFBST0dSQU1ALyQoREVNQU5HTEVSX1BST0cpLycgPCAkKHNyY2RpcikvY3h4ZmlsdC5tYW4gXAotCQk+ICQoREVNQU5HTEVSX1BST0cpLjEKLW1vc3RseWNsZWFuLWxvY2FsOgotCS1ybSAtcmYgdG1wZGlyCi0KLS5QSE9OWTogaW5zdGFsbC1leGVjLWxvY2FsCi0KLWluc3RhbGwtZXhlYy1sb2NhbDogJChiaW5fUFJPR1JBTVMpICQobm9pbnN0X1BST0dSQU1TKQotCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgZWNobyAiICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCSQobWtpbnN0YWxsZGlycykgJCh0b29sZGlyKS9iaW4KLQlmb3IgaSBpbiAkKFRPT0xfUFJPR1MpOyBkbyBcCi0JICBpZiBbIC1mICQkaSQoRVhFRVhUKSBdOyB0aGVuIFwKLQkgICAgaj1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvLW5ldy8vJ2A7IFwKLQkgICAgaz1gZWNobyAkJGogfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JICAgIGlmIFsgIiQoYmluZGlyKS8kJGskKEVYRUVYVCkiICE9ICIkKHRvb2xkaXIpL2Jpbi8kJGokKEVYRUVYVCkiIF07IHRoZW4gXAotCSAgICAgIHJtIC1mICQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKTsgXAotCSAgICAgIGxuICQoYmluZGlyKS8kJGskKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAotCQl8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGkkKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpOyBcCi0JICAgIGZpOyBcCi0JICBlbHNlIHRydWU7IFwKLQkgIGZpOyBcCi0JZG9uZQotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotCi1hZGRyMmxpbmUubzogYWRkcjJsaW5lLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvZGVtYW5nbGUuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWFyLm86IGFyLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9wcm9ncmVzcy5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvYW91dC9hci5oICQoQkZERElSKS9saWJiZmQuaCBhcnN1cC5oCi1hcnN1cC5vOiBhcnN1cC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGFyc3VwLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWJ1Y29tbS5vOiBidWNvbW0uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotY29mZmR1bXAubzogY29mZmR1bXAuYyBjb2ZmZ3Jvay5oIGJ1Y29tbS5oIGNvbmZpZy5oIFwKLSAgJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotY29mZmdyb2subzogY29mZmdyb2suYyBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmZ3Jvay5oCi1kZWJ1Zy5vOiBkZWJ1Zy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaAotZGxsdG9vbC5vOiBkbGx0b29sLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL2RlbWFuZ2xlLmggZGxsdG9vbC5oCi1maWxlbW9kZS5vOiBmaWxlbW9kZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWllZWUubzogaWVlZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvaWVlZS5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBkZWJ1Zy5oIGJ1ZGJnLmgKLWlzLXJhbmxpYi5vOiBpcy1yYW5saWIuYwotaXMtc3RyaXAubzogaXMtc3RyaXAuYwotbWF5YmUtcmFubGliLm86IG1heWJlLXJhbmxpYi5jCi1tYXliZS1zdHJpcC5vOiBtYXliZS1zdHJpcC5jCi1ubG1jb252Lm86IG5sbWNvbnYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoQkZERElSKS9saWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1jb252LmgKLW5tLm86IG5tLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9wcm9ncmVzcy5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvZ2V0b3B0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1ub3QtcmFubGliLm86IG5vdC1yYW5saWIuYwotbm90LXN0cmlwLm86IG5vdC1zdHJpcC5jCi1vYmpjb3B5Lm86IG9iamNvcHkuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvcHJvZ3Jlc3MuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBidWRiZy5oCi1vYmpkdW1wLm86IG9iamR1bXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL3Byb2dyZXNzLmggYnVjb21tLmggY29uZmlnLmggXAotICAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9kaXMtYXNtLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggZGVidWcuaCBidWRiZy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1wcmRiZy5vOiBwcmRiZy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaCBidWRiZy5oCi1yZGNvZmYubzogcmRjb2ZmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9kZW1hbmdsZS5oIGRlYnVnLmggXAotICBidWRiZy5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotcmRkYmcubzogcmRkYmcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmggYnVkYmcuaAotc2l6ZS5vOiBzaXplLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9nZXRvcHQuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zcmNvbnYubzogc3Jjb252LmMgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gIHN5c3JvZmYuaCBjb2ZmZ3Jvay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3lzcm9mZi5jCi1zdGFicy5vOiBzdGFicy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggZGVidWcuaCBidWRiZy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotc3RyaW5ncy5vOiBzdHJpbmdzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXN5c2R1bXAubzogc3lzZHVtcC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggc3lzcm9mZi5oIFwKLSAgc3lzcm9mZi5jCi12ZXJzaW9uLm86IHZlcnNpb24uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi13cnN0YWJzLm86IHdyc3RhYnMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmggYnVkYmcuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXdpbmRyZXMubzogd2luZHJlcy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9vYnN0YWNrLmggd2luZHJlcy5oIFwKLSAgd2luZHVuaS5oCi1yZXNyYy5vOiByZXNyYy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaAotcmVzY29mZi5vOiByZXNjb2ZmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLXJlc2Jpbi5vOiByZXNiaW4uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmgKLXdpbmR1bmkubzogd2luZHVuaS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggd2luZHVuaS5oCi1yZWFkZWxmLm86IHJlYWRlbGYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2R3YXJmMi5oICQoSU5DRElSKS9lbGYvaTM4Ni5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvZWxmL3Y4NTAuaCAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvbWlwcy5oIFwKLSAgJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9tNjhrLmggXAotICAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9tMzJyLmggJChJTkNESVIpL2VsZi9kMTB2LmggXAotICAkKElOQ0RJUikvZWxmL2QzMHYuaCAkKElOQ0RJUikvZWxmL3NoLmggJChJTkNESVIpL2VsZi9tbjEwMjAwLmggXAotICAkKElOQ0RJUikvZWxmL21uMTAzMDAuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9mcjMwLmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaAotcmVzcmVzLm86IHJlc3Jlcy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaAotZHluLXN0cmluZy5vOiBkeW4tc3RyaW5nLmMgY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBkeW4tc3RyaW5nLmgKLWRsbHdyYXAubzogZGxsd3JhcC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oIGR5bi1zdHJpbmcuaAotcmVuYW1lLm86IHJlbmFtZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLXVuZGVyc2NvcmUubzogdW5kZXJzY29yZS5jCi1hcnBhcnNlLm86IGFycGFyc2UuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGFyc3VwLmgKLWFybGV4Lm86IGFybGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oIGFycGFyc2UuaAotc3lzcm9mZi5vOiBzeXNyb2ZmLmMKLXN5c2luZm8ubzogc3lzaW5mby5jCi1zeXNsZXgubzogc3lzbGV4LmMgc3lzaW5mby5oCi1kZWZwYXJzZS5vOiBkZWZwYXJzZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggZGxsdG9vbC5oCi1kZWZsZXgubzogZGVmbGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgZGVmcGFyc2UuaCBkbGx0b29sLmgKLW5sbWhlYWRlci5vOiBubG1oZWFkZXIuYyAuLi9iZmQvYmZkLmggYnVjb21tLmggY29uZmlnLmggXAotICAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgbmxtY29udi5oCi1yY3BhcnNlLm86IHJjcGFyc2UuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmgKLXJjbGV4Lm86IHJjbGV4LmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oIHJjcGFyc2UuaAotCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvTkVXUyBiL2JpbnV0aWxzL05FV1MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZGNlYmQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvTkVXUworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0tKi0gdGV4dCAtKi0KLQotQ2hhbmdlcyBpbiBiaW51dGlscyAyLjEwOgotCi0qIG9iamR1bXAgc3VwcG9ydCBmb3IgLW1pMzg2OmludGVsIHdoaWNoIGNhdXNlcyBkaXNhc3NlbWJseSB0byBiZSBkaXNwbGF5ZWQgd2l0aAotICBpbnRlbCBzeW50YXguCi0KLSogTmV3IHByb2dyYW06IHJlYWRlbGYuICBUaGlzIGRpc3BsYXlzIHRoZSBjb250ZW50cyBvZiBFTEYgZm9ybWF0IGZpbGVzLAotICByZWdhcmRsZXNzIG9mIHRhcmdldCBtYWNoaW5lLgotCi0qIG9iamNvcHkgbm93IHRha2VzIC0tY2hhbmdlLXNlY3Rpb24tbG1hLCAtLWNoYW5nZS1zZWN0aW9uLXZtYSwgYW5kCi0gIC0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzcyBvcHRpb25zLiAgVGhlIG9sZCAtLWFkanVzdC1zZWN0aW9uLXZtYSBvcHRpb24gaXMKLSAgZXF1aXZhbGVudCB0byAtLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3MuICBUaGUgb3RoZXIgLS1hZGp1c3QtKiBvcHRpb25zIGFyZSBub3cKLSAgcmVuYW1lZCB0byAtLWNoYW5nZS0qLCBhbHRob3VnaCAtLWFkanVzdC0qIGNvbnRpbnVlcyB0byB3b3JrLgotCi0qIGRsbHRvb2wgbm93IHN1cHBvcnRzIHRoZSBJTVBPUlRTIGNvbW1hbmQuCi0KLSogZGxsdG9vbCBub3cgdGFrZXMgLS1leHBvcnQtYWxsLXN5bWJvbHMsIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzLAotICAtLWV4Y2x1ZGUtc3ltYm9scywgYW5kIC0tbm8tZGVmYXVsdC1leGNsdWRlcyBvcHRpb25zLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuOToKLQotKiBBZGRlZCB3aW5kcmVzIHByb2dyYW0sIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgcmVzb3VyY2VzIGluIFdJTjMyCi0gIGZpbGVzIGFzIHVzZWQgb24gV2luZG93cyA5NSBhbmQgV2luZG93cyBOVC4KLQotKiBUaGUgb2JqY29weSAtLWdhcC1maWxsIGFuZCAtLXBhZC10byBvcHRpb25zIG9wZXJhdGUgb24gdGhlIExNQSByYXRoZXIgdGhhbgotICB0aGUgVk1BIG9mIHRoZSBzZWN0aW9ucy4KLQotKiBBZGRlZCBTIG1vZGlmaWVyIHRvIGFyIHRvIG5vdCBidWlsZCBhIHN5bWJvbCB0YWJsZS4KLQotQ2hhbmdlcyBpbiBiaW51dGlscyAyLjg6Ci0KLSogVGhlIG9iamR1bXAgZGlzYXNzZW1ibHkgZm9ybWF0IGhhcyBiZWVuIGNoYW5nZWQsIGFuZCBob3BlZnVsbHkgaW1wcm92ZWQuICBVc2UKLSAgdGhlIG5ldyAtLXByZWZpeC1hZGRyZXNzZXMgb3B0aW9uIHRvIGdldCB0aGUgb2xkIGZvcm1hdC4gIFRoZXJlIGFyZSBhbHNvIG5ldwotICAtLWRpc2Fzc2VtYmxlLXplcm9lcyBhbmQgLS1uby1zaG93LXJhdy1pbnNuIG9wdGlvbnMgd2hpY2ggYWZmZWN0IGRpc2Fzc2VtYmxlcgotICBvdXRwdXQuCi0KLSogRm9ybWF0cyBtYXkgbm93IGJlIHNwZWNpZmllZCBhcyBjb25maWd1cmF0aW9uIHRyaXBsZXRzLiAgRm9yIGV4YW1wbGUsCi0gIG9iamR1bXAgLWIgaTM4Ni1wYy1saW51eC4gIFRoZSB0cmlwbGV0cyBhcmUgbm90IHBhc3NlZCB0aHJvdWdoIGNvbmZpZy5zdWIsCi0gIHNvIHRoZXkgbXVzdCBiZSBpbiBjYW5vbmljYWwgZm9ybS4KLQotKiBBZGRlZCBuZXcgYWRkcjJsaW5lIHByb2dyYW0uICBUaGlzIHVzZXMgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBjb252ZXJ0Ci0gIGFuIGFkZHJlc3MgaW50byBhIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgd2l0aGluIGEgcHJvZ3JhbS4KLQotKiBBZGRlZCAtLWNoYW5nZS1sZWFkaW5nLWNoYXIgYXJndW1lbnQgdG8gb2JqY29weS4KLQotKiBBZGRlZCAtLXdlYWtlbiBhcmd1bWVudCB0byBvYmpjb3B5LgotCi0qIG9iamR1bXAgLS1keW5hbWljLXJlbG9jIG5vdyB3b3JrcyBvbiBFTEYgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZCBsaWJyYXJpZXMuCi0KLSogQWRkZWQgLS1hZGp1c3Qtdm1hIG9wdGlvbiB0byBvYmpkdW1wLgotCi0qIEFkZGVkIC1DLy0tZGVtYW5nbGUgb3B0aW9uIHRvIG9iamR1bXAuCi0KLSogQWRkZWQgLXAvLS1wcmVzZXJ2ZS1kYXRlcyBvcHRpb24gdG8gc3RyaXAgYW5kIG9iamNvcHkuCi0KLUNoYW5nZXMgaW4gYmludXRpbHMgMi43OgotCi0qIEFkZGVkIC0tZW5hYmxlLXNoYXJlZCBhbmQgLS1lbmFibGUtY29tbW9uYmZkbGliIG9wdGlvbnMgdG8gY29uZmlndXJlLgotCi0qIEFkZGVkIC0tZGVidWdnaW5nIGFyZ3VtZW50IHRvIG9iamR1bXAgYW5kIG9iamNvcHkuCi0KLSogQWRkZWQgLS1kZWZpbmVkLW9ubHkgYXJndW1lbnQgdG8gbm0uCi0KLSogQWRkZWQgLS1yZW1vdmUtbGVhZGluZy1jaGFyIGFyZ3VtZW50IHRvIG9iamNvcHkuCi0KLSogVGhlIG9iamR1bXAgLS1saW5lLW51bWJlcnMgb3B0aW9uIGlzIG5vdyBtZWFuaW5nZnVsIHdpdGggLS1yZWxvYy4KLQotKiBBZGRlZCAtLWxpbmUtbnVtYmVycyBvcHRpb24gdG8gbm0uCi0KLSogQWRkZWQgLS1lbmRpYW4vLUVCLy1FTCBvcHRpb24gdG8gb2JqZHVtcC4KLQotKiBBZGRlZCBzdXBwb3J0IGZvciBBbHBoYSBPcGVuVk1TL0FYUC4KLQotQ2hhbmdlcyBpbiBiaW51dGlscyAyLjY6Ci0KLSogQWRkZWQgLU4vLS1zdHJpcC1zeW1ib2wgYW5kIC1LLy0ta2VlcC1zeW1ib2wgYXJndW1lbnRzIHRvIHN0cmlwIGFuZCBvYmpjb3B5LgotCi0qIEFkZGVkIHNldmVyYWwgYXJndW1lbnRzIHRvIG9iamNvcHkgdG8gcHJvdmlkZSBzb21lIGNvbnRyb2wgb3ZlciBob3cgdGhlIG5ldwotICBmaWxlIGlzIGxhaWQgb3V0IGluIG1lbW9yeS4gIEFsc28gYWRkZWQgYmluYXJ5IG91dHB1dCBmb3JtYXQgdG8gQkZEIHRvIHBlcm1pdAotICBnZW5lcmF0aW5nIHBsYWluIGJpbmFyeSBmaWxlcy4KLQotKiBBZGRlZCAtLXN0YXJ0LWFkZHJlc3MgYW5kIC0tc3RvcC1hZGRyZXNzIG9wdGlvbnMgdG8gb2JqZHVtcC4KLQotKiBhciBhbmQgcmFubGliIG5vdyB3b3JrIG9uIEFJWC4gIFRoZSB0b29scyBhcmUgbm93IGJ1aWx0IGJ5IGRlZmF1bHQgb24gQUlYLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuNToKLQotKiBDaGFuZ2VkIG9iamR1bXAgLWRyIHRvIGR1bXAgdGhlIHJlbG9jcyBpbnRlcnNwZXJzZWQgd2l0aCB0aGUgYXNzZW1ibHkKLSAgbGlzdGluZywgZm9yIGEgbW9yZSB1c2VmdWwgbGlzdGluZyBvZiByZWxvY2F0ZWFibGUgZmlsZXMuCi0KLSogQ2hhbmdlZCBvYmpkdW1wIC1kLy0tZGlzYXNzZW1ibGUgdG8gb25seSBkaXNhc3NlbWJsZSBTRUNfQ09ERSBzZWN0aW9ucy4KLSAgQWRkZWQgLUQvLS1kaXNhc3NlbWJsZS1hbGwgb3B0aW9uIHRvIGRpc2Fzc2VtYmxlIGFsbCBzZWN0aW9ucy4KLQotKiBBZGRlZCAtLXNpemUtc29ydCBvcHRpb24gdG8gbm0uCi0KLSogc3RyaXAgYW5kIG9iamNvcHkgc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGhhbmRsZSBkeW5hbWljYWxseSBsaW5rZWQgRUxGCi0gIGV4ZWN1dGFibGVzLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuNDoKLQotKiBTdXBwb3J0IGZvciBIUC1QQSAoYnkgSmVmZiBMYXcpLCBpMzg2IE1hY2ggKGJ5IERhdmlkIE1hY2tlbnppZSksIFJTLzYwMDAgYW5kCi0gIFBvd2VyUEMgKGV4Y2VwdCBhciBhbmQgcmFubGliOyBieSBJYW4gVGF5bG9yKS4KLQotKiBTdXBwb3J0IGZvciBJcml4IDUuCi0KLSogUHJvZ3JhbXMgYHN0cmlwJyBhbmQgYG9iamNvcHknIHdpbGwgbm90IGF0dGVtcHQgdG8gd3JpdGUgZHluYW1pY2FsbHkgbGlua2VkCi0gIEVMRiBvdXRwdXQgZmlsZXMsIHNpbmNlIEJGRCBjdXJyZW50bHkgY2FuJ3QgY3JlYXRlIHRoZW0gcHJvcGVybHkuCi0KLUNoYW5nZXMgaW4gYmludXRpbHMgMi4zOgotCi0qIEEgbmV3IC0tc3RhYnMgYXJndW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gb2JqZHVtcCB0byBkdW1wIHN0YWJzIHNlY3Rpb25zIGluCi0gIEVMRiBhbmQgQ09GRiBmaWxlcy4KLQotKiBBIG5ldyBwcm9ncmFtLCBubG1jb252LCBoYXMgYmVlbiBhZGRlZC4gIEl0IGNhbiBjb252ZXJ0IG9iamVjdCBmaWxlcyBpbnRvCi0gIE5vdmVsbCBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZXMuCi0KLSogVGhlIHN0cmluZ3MgcHJvZ3JhbSBoYXMgYmVlbiBhZGRlZC4KLQotQ2hhbmdlcyBpbiBiaW51dGlscyAyLjI6Ci0KLSogVGhlICdjb3B5JyBwcm9ncmFtIGhhcyBiZWVuIHJlbmFtZWQgdG8gJ29iamNvcHknLCBmb3IgY29uc2lzdGVuY3kgd2l0aAotICAnb2JqZHVtcCcsIGFuZCBiZWNhdXNlICdjb3B5JyBtaWdodCBtb3JlIHBsYXVzaWJseSBiZSB1c2VkIGFzIGEgc3lub255bSBmb3IKLSAgJ2NwJy4KLQotKiBUaGUgbmV3IHN0YW5kLWFsb25lIHByb2dyYW0gYysrZmlsdCBpcyBhIGZpbHRlciB0aGF0IGNvbnZlcnRzIGVuY29kZWQKLSAgKG1hbmdsZWQpIEMrKyBhc3NlbWJseS1sZXZlbCBpZGVudGlmaWVycyB0byB1c2VyLWxldmVsIG5hbWVzLiAgKE5vdGU6IFRoaXMKLSAgbWF5IGdldCBtb3ZlZCB0byB0aGUgZ2NjIGRpc3RyaWJ1dGlvbi4pCi0KLSogbm0gLW8gb24gYW4gYXJjaGl2ZSBub3cgcHJlZml4ZXMgZWFjaCBsaW5lIHdpdGggdGhlIGFyY2hpdmUgbmFtZSwgbWF0Y2hpbmcKLSAgdGhlIG91dHB1dCBmcm9tIEJTRCBubS4KLQotKiBhciAoYW5kIGxkKSBjYW4gbm93IHJlYWQgKGJ1dCBub3Qgd3JpdGUpIEJTRDQuNC1zdHlsZSBhcmNoaXZlcy4KLQotKiBOZXcgc3VwcG9ydCBmb3IgSDg1MDAsIFo4MDAwLCBhbmQgdGhlIEhpdGFjaCBTSC4KLQotKiBEaXMtYXNzZW1ibGVyIGludGVyZmFjZSBjaGFuZ2VkIHRvIGFsbG93IHNoYXJpbmcgd2l0aCBnZGIuCi0KLSogVGhlcmUgaXMgbmV3IEVsZiBjb2RlLCBidXQgaXQgaXMgbm90IHlldCByZWFkeSBmb3IgZ2VuZXJhbCB1c2UuCi0KLSogVGhlcmUgaXMgdGhlIGJlZ2lubmluZ3Mgb2YgYSB0ZXN0IHN1aXRlLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuMToKLQotKiBUaGVyZSBpcyBub3cgc3VwcG9ydCBmb3Igd3JpdGluZyBFQ09GRiBmaWxlcywgc28gbGQgYW5kIHRoZSBvdGhlciB1dGlsaXRpZXMKLSAgc2hvdWxkIHdvcmsgb24gUmlzYy9VbHRyaXggYW5kIElyaXguICBQbGVhc2UgbGV0IHVzIGtub3cgaG93IHdlbGwgdGhpcyB3b3Jrcy4KLQotKiBhciBub3cgYXV0b21hdGljYWxseSBjcmVhdGVzIGEgc3ltYm9sIHRhYmxlIChhIF9fLlNZTURFRiBtZW1iZXIsIGluIHRoZSBCU0QKLSAgdmVyc2lvbiksIGlmIHRoZXJlIGFyZSBhbnkgb2JqZWN0IGZpbGVzIGluIHRoZSBhcmNoaXZlLiAgU28gcnVubmluZyByYW5saWIgaXMKLSAgbm93IHJlZHVuZGFudCAodW5sZXNzIHRoZSBub24tc3RhbmRhcmQgcSBjb21tYW5kIGlzIHVzZWQpLiAgVGhpcyBpcyByZXF1aXJlZAotICBmb3IgUG9zaXguMiBjb25mb3JtYW5jZS4KLQotKiBUaGUgYXJjaGl2ZS1yZWFkaW5nIGNvZGUgbm93IHJlYWRzIGJvdGggQlNELXN0eWxlIGFuZCBTWVNWLXN0eWxlIGFyY2hpdmVzCi0gIGluZGVwZW5kZW50bHkgb2YgdGhlIHNlbGVjdGVkIHRhcmdldCBmb3JtYXQuICBUaGlzIGlzIHRvIGVuY291cmFnZSBwZW9wbGUgdG8KLSAgc3dpdGNoIHRvIFNZU1YtZm9ybWF0LCB3aGljaCBoYXMgYSBudW1iZXIgb2YgYWR2YW50YWdlcy4KLQotKiBUaGUgc3RyaXAgYW5kIGNvcHkgcHJvZ3JhbXMgbm93IGhhdmUgb3B0aW9ucyB0byByZW1vdmUgZGVidWctc3ltYm9scyBvbmx5Ci0gIGFuZC9vciBsb2NhbCBzeW1ib2xzIG9ubHkuICBUaGV5IG5vdyBhbHNvIHN1cHBvcnQgbG9uZyBvcHRpb25zLgotCi0MCi1Mb2NhbCB2YXJpYWJsZXM6Ci1maWxsLWNvbHVtbjogNzkKLUVuZDoKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL1JFQURNRSBiL2JpbnV0aWxzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyZDI3Ny4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotVGhlc2UgYXJlIHRoZSBHTlUgYmludXRpbHMuICBUaGVzZSBhcmUgdXRpbGl0aWVzIG9mIHVzZSB3aGVuIGRlYWxpbmcKLXdpdGggb2JqZWN0IGZpbGVzLgotCi1UaGUgbGlua2VyIChsZCkgaXMgaW4gYSBzZXBhcmF0ZSBkaXJlY3RvcnksIHdoaWNoIHNob3VsZCBiZSAuLi9sZC4KLUxpbmtlci1zcGVjaWZpYyBub3RlcyBhcmUgaW4gLi4vbGQvUkVBRE1FLgotCi1BcyBvZiB2ZXJzaW9uIDIuNSwgdGhlIGFzc2VtYmxlciAoYXMpIGlzIGFsc28gaW5jbHVkZWQgaW4gdGhpcyBwYWNrYWdlLCBpbgotLi4vZ2FzLiAgQXNzZW1ibGVyLXNwZWNpZmljIG5vdGVzIGNhbiBiZSBmb3VuZCBpbiAuLi9nYXMvUkVBRE1FLgotCi1SZWNlbnQgY2hhbmdlcyBhcmUgaW4gLi9ORVdTLCAuLi9sZC9ORVdTLCBhbmQgLi4vZ2FzL05FV1MuCi0KLVVucGFja2luZyBhbmQgSW5zdGFsbGF0aW9uIC0tIHF1aWNrIG92ZXJ2aWV3Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1XaGVuIHlvdSB1bnBhY2sgdGhlIGJpbnV0aWxzLTIuOS50YXIuZ3ogZmlsZSwgeW91J2xsIGdldCBhIGRpcmVjdG9yeQotY2FsbGVkIHNvbWV0aGluZyBsaWtlIGBiaW51dGlscy0yLjknLCB3aGljaCBjb250YWlucyB2YXJpb3VzIGZpbGVzIGFuZAotZGlyZWN0b3JpZXMuICBNb3N0IG9mIHRoZSBmaWxlcyBpbiB0aGUgdG9wIGRpcmVjdG9yeSBhcmUgZm9yCi1pbmZvcm1hdGlvbiBhbmQgZm9yIGNvbmZpZ3VyYXRpb24uICBUaGUgYWN0dWFsIHNvdXJjZSBjb2RlIGlzIGluCi1zdWJkaXJlY3Rvcmllcy4KLQotVG8gYnVpbGQgYmludXRpbHMsIHlvdSBjYW4ganVzdCBkbzoKLQotCWNkIGJpbnV0aWxzLTIuOQotCS4vY29uZmlndXJlIFtvcHRpb25zXQotCW1ha2UKLQltYWtlIGluc3RhbGwgIyBjb3BpZXMgdGhlIHByb2dyYW1zIGZpbGVzIGludG8gL3Vzci9sb2NhbC9iaW4KLQkJICAgICAjIGJ5IGRlZmF1bHQuCi0KLVRoaXMgd2lsbCBjb25maWd1cmUgYW5kIGJ1aWxkIGFsbCB0aGUgbGlicmFyaWVzIGFzIHdlbGwgYXMgdGhlCi1hc3NlbWJsZXIsIHRoZSBiaW51dGlscywgYW5kIHRoZSBsaW5rZXIuCi0KLUlmIHlvdSBoYXZlIEdOVSBtYWtlLCB3ZSByZWNvbW1lbmQgYnVpbGRpbmcgaW4gYSBkaWZmZXJlbnQgZGlyZWN0b3J5OgotCi0JbWtkaXIgb2JqZGlyCi0JY2Qgb2JqZGlyCi0JLi4vYmludXRpbHMtMi45L2NvbmZpZ3VyZSBbb3B0aW9uc10KLQltYWtlCi0JbWFrZSBpbnN0YWxsCi0KLVRoaXMgcmVsaWVzIG9uIHRoZSBWUEFUSCBmZWF0dXJlIG9mIEdOVSBtYWtlLgotCi1CeSBkZWZhdWx0LCB0aGUgYmludXRpbHMgd2lsbCBiZSBjb25maWd1cmVkIHRvIHN1cHBvcnQgdGhlIHN5c3RlbSBvbgotd2hpY2ggdGhleSBhcmUgYnVpbHQuICBXaGVuIGRvaW5nIGNyb3NzIGRldmVsb3BtZW50LCB1c2UgdGhlIC0tdGFyZ2V0Ci1jb25maWd1cmUgb3B0aW9uIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgdGFyZ2V0LgotCi1UaGUgLS1lbmFibGUtdGFyZ2V0cyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvciBtb3JlIGJpbmFyeSBmaWxlIGZvcm1hdHMKLWJlc2lkZXMgdGhlIGRlZmF1bHQuICBMaXN0IHRoZW0gYXMgdGhlIGFyZ3VtZW50IHRvIC0tZW5hYmxlLXRhcmdldHMsCi1zZXBhcmF0ZWQgYnkgY29tbWFzLiAgRm9yIGV4YW1wbGU6Ci0KLQkuL2NvbmZpZ3VyZSAtLWVuYWJsZS10YXJnZXRzPXN1bjMscnM2MDAwLWFpeCxkZWNzdGF0aW9uCi0KLVRoZSBuYW1lICdhbGwnIGNvbXBpbGVzIGluIHN1cHBvcnQgZm9yIGFsbCB2YWxpZCBCRkQgdGFyZ2V0cyAodGhpcyB3YXMKLXRoZSBkZWZhdWx0IGluIHJlbGVhc2VzIGJlZm9yZSAyLjMpOgotCi0JLi9jb25maWd1cmUgLS1lbmFibGUtdGFyZ2V0cz1hbGwKLQotWW91IGNhbiBhbHNvIHNwZWNpZnkgdGhlIC0tZW5hYmxlLXNoYXJlZCBvcHRpb24gd2hlbiB5b3UgcnVuCi1jb25maWd1cmUuICBUaGlzIHdpbGwgYnVpbGQgdGhlIEJGRCBhbmQgb3Bjb2RlcyBsaWJyYXJpZXMgYXMgc2hhcmVkCi1saWJyYXJpZXMuICBZb3UgY2FuIHVzZSBhcmd1bWVudHMgd2l0aCB0aGUgLS1lbmFibGUtc2hhcmVkIG9wdGlvbiB0bwotaW5kaWNhdGUgdGhhdCBvbmx5IGNlcnRhaW4gbGlicmFyaWVzIHNob3VsZCBiZSBidWlsdCBzaGFyZWQ7IGZvcgotZXhhbXBsZSwgLS1lbmFibGUtc2hhcmVkPWJmZC4gIFRoZSBvbmx5IHBvdGVudGlhbCBzaGFyZWQgbGlicmFyaWVzIGluCi1hIGJpbnV0aWxzIHJlbGVhc2UgYXJlIGJmZCBhbmQgb3Bjb2Rlcy4KLQotVGhlIGJpbnV0aWxzIHdpbGwgYmUgbGlua2VkIGFnYWluc3QgdGhlIHNoYXJlZCBsaWJyYXJpZXMuICBUaGUgYnVpbGQKLXN0ZXAgd2lsbCBhdHRlbXB0IHRvIHBsYWNlIHRoZSBjb3JyZWN0IGxpYnJhcnkgaW4gdGhlIHJ1bnRpbWUgc2VhcmNoCi1wYXRoIGZvciB0aGUgYmluYXJpZXMuICBIb3dldmVyLCBpbiBzb21lIGNhc2VzLCBhZnRlciB5b3UgaW5zdGFsbCB0aGUKLWJpbmFyaWVzLCB5b3UgbWF5IGhhdmUgdG8gc2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlLCBub3JtYWxseQotTERfTElCUkFSWV9QQVRILCBzbyB0aGF0IHRoZSBzeXN0ZW0gY2FuIGZpbmQgdGhlIGluc3RhbGxlZCBsaWJiZmQKLXNoYXJlZCBsaWJyYXJ5LgotCi1UbyBidWlsZCB1bmRlciBvcGVuVk1TL0FYUCwgc2VlIHRoZSBmaWxlIG1ha2VmaWxlLnZtcyBpbiB0aGUgdG9wIGxldmVsCi1kaXJlY3RvcnkuCi0KLUlmIHlvdSBkb24ndCBoYXZlIGFyCi09PT09PT09PT09PT09PT09PT09PQotCi1JZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBhbHJlYWR5IGhhdmUgYW4gYXIgcHJvZ3JhbSwgdGhlIG5vcm1hbAotYmludXRpbHMgYnVpbGQgcHJvY2VzcyB3aWxsIG5vdCB3b3JrLiAgSW4gdGhpcyBjYXNlLCBydW4gY29uZmlndXJlIGFzCi11c3VhbC4gIEJlZm9yZSBydW5uaW5nIG1ha2UsIHJ1biB0aGlzIHNjcmlwdDoKLQotIyEvYmluL3NoCi1NQUtFX1BST0c9IiR7TUFLRS1tYWtlfSIKLU1BS0U9IiR7TUFLRV9QUk9HfSBBUj10cnVlIExJTks9dHJ1ZSIKLWV4cG9ydCBNQUtFCi0ke01BS0V9ICQqIGFsbC1saWJpYmVydHkKLSR7TUFLRX0gJCogYWxsLWludGwKLSR7TUFLRX0gJCogYWxsLWJmZAotY2QgYmludXRpbHMKLU1BS0U9IiR7TUFLRV9QUk9HfSIKLWV4cG9ydCBNQUtFCi0ke01BS0V9ICQqIGFyX0RFUEVOREVOQ0lFUz0gYXJfTERBREQ9Jy4uL2JmZC8qLm8gYGNhdCAuLi9saWJpYmVydHkvcmVxdWlyZWQtbGlzdCAuLi9saWJpYmVydHkvbmVlZGVkLWxpc3QgfCBzZWQgLWUgInMsXChbXiBdW14gXSpcKSwuLi9saWJpYmVydHkvXDEsZyJgIGBpZiB0ZXN0IC1mIC4uL2ludGwvZ2V0dGV4dC5vOyB0aGVuIGVjaG8gJy4uL2ludGwvKi5vJzsgZmlgJyBhcgotCi1UaGlzIHNjcmlwdCB3aWxsIGJ1aWxkIGFuIGFyIHByb2dyYW0gaW4gYmludXRpbHMvYXIuICBNb3ZlIGJpbnV0aWxzL2FyCi1pbnRvIGEgZGlyZWN0b3J5IG9uIHlvdXIgUEFUSC4gIEFmdGVyIGRvaW5nIHRoaXMsIHlvdSBjYW4gcnVuIG1ha2UgYXMKLXVzdWFsIHRvIGJ1aWxkIHRoZSBjb21wbGV0ZSBiaW51dGlscyBkaXN0cmlidXRpb24uICBZb3UgZG8gbm90IG5lZWQKLXRoZSByYW5saWIgcHJvZ3JhbSBpbiBvcmRlciB0byBidWlsZCB0aGUgZGlzdHJpYnV0aW9uLgotCi1Qb3J0aW5nCi09PT09PT09Ci0KLUJpbnV0aWxzLTIuOSBzdXBwb3J0cyBtYW55IGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLCBidXQgdGhlcmUKLWFyZSBtYW55IG1vcmUgbm90IHN1cHBvcnRlZCwgaW5jbHVkaW5nIHNvbWUgdGhhdCB3ZXJlIHN1cHBvcnRlZAotYnkgZWFybGllciB2ZXJzaW9ucy4gIFdlIGFyZSBob3BpbmcgZm9yIHZvbHVudGVlcnMgdG8KLWltcHJvdmUgdGhpcyBzaXR1YXRpb24uCi0KLVRoZSBtYWpvciBlZmZvcnQgaW4gcG9ydGluZyBiaW51dGlscyB0byBhIG5ldyBob3N0IGFuZC9vciB0YXJnZXQKLWFyY2hpdGVjdHVyZSBpbnZvbHZlcyB0aGUgQkZEIGxpYnJhcnkuICBUaGVyZSBpcyBzb21lIGRvY3VtZW50YXRpb24KLWluIC4uL2JmZC9kb2MuICBUaGUgZmlsZSAuLi9nZGIvZG9jL2dkYmludC50ZXhpbmZvIChkaXN0cmlidXRlZAotd2l0aCBnZGItNC54KSBtYXkgYWxzbyBiZSBvZiBoZWxwLgotCi1SZXBvcnRpbmcgYnVncwotPT09PT09PT09PT09PT0KLQotU2VuZCBidWcgcmVwb3J0cyBhbmQgcGF0Y2hlcyB0byBidWctZ251LXV0aWxzQGdudS5vcmcuICBBbHdheXMgbWVudGlvbgotdGhlIHZlcnNpb24gbnVtYmVyIHlvdSBhcmUgcnVubmluZzsgdGhpcyBpcyBwcmludGVkIGJ5IHJ1bm5pbmcgYW55IG9mCi10aGUgYmludXRpbHMgd2l0aCB0aGUgLS12ZXJzaW9uIG9wdGlvbi4gIFdlIGFwcHJlY2lhdGUgcmVwb3J0cyBhYm91dAotYnVncywgYnV0IHdlIGRvIG5vdCBwcm9taXNlIHRvIGZpeCB0aGVtLgotCi1WTVMKLT09PQotCi1UaGlzIHNlY3Rpb24gd2FzIHdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIDxra2FlbXBmQHJtaS5kZT4uICBJdAotZGVzY3JpYmVzIGhvdyB0byBidWlsZCBhbmQgaW5zdGFsbCB0aGUgYmludXRpbHMgb24gb3BlblZNUyAoQWxwaGEgYW5kCi1WYXgpLiAgKFRoZSBCRkQgbGlicmFyeSBvbmx5IHN1cHBvcnRzIHJlYWRpbmcgVmF4IG9iamVjdCBmaWxlcy4pCi0KLUNvbXBpbGluZyB0aGUgcmVsZWFzZToKLQotVG8gY29tcGlsZSB0aGUgZ251IGJpbmFyeSB1dGlsaXRpZXMgYW5kIHRoZSBnbnUgYXNzZW1ibGVyLCB5b3UnbGwKLW5lZWQgREVDIEMgb3IgR05VIEMgZm9yIG9wZW5WTVMvQWxwaGEuIFlvdSdsbCBuZWVkICpib3RoKiBjb21waWxlcnMKLW9uIG9wZW5WTVMvVmF4LgotCi1Db21waWxpbmcgd2l0aCBlaXRoZXIgREVDIEMgb3IgR05VIEMgd29ya3Mgb24gb3BlblZNUy9BbHBoYSBvbmx5LiBTb21lCi1vZiB0aGUgb3Bjb2RlcyBhbmQgYmludXRpbHMgZmlsZXMgdHJhcCBhIGJ1ZyBpbiB0aGUgREVDIEMgb3B0aW1pemVyLAotc28gdGhlc2UgZmlsZXMgbXVzdCBiZSBjb21waWxlZCB3aXRoIC9ub29wdC4KLQotQ29tcGlsaW5nIG9uIG9wZW5WTVMvVmF4IGlzIGEgYml0IGNvbXBsaWNhdGVkLCBhcyB0aGUgYmZkIGxpYnJhcnkgdHJhcHMKLWEgYnVnIGluIEdOVSBDIGFuZCB0aGUgZ251IGFzc2VtYmxlciBhIGJ1ZyBpbiAobXkgdmVyc2lvbiBvZikgREVDIEMuCi0KLUkgbmV2ZXIgdHJpZWQgY29tcGlsaW5nIHdpdGggVkFYIEMuCi0KLQotWW91IGZ1cnRoZXIgbmVlZCBHTlUgTWFrZSBWZXJzaW9uIDMuNzYgb3IgbGF0ZXIuIFRoaXMgaXMgYXZhaWxhYmxlCi1hdCBmdHAucHJvZ2lzLmRlIG9yIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiBUaGUgbWFrZWZpbGVzIGFzc3VtZSB0aGF0Ci1nbWFrZSBzdGFydHMgZ251IG1ha2UgYXMgYSBmb3JlaWduIGNvbW1hbmQuCi0KLUlmIHlvdSdyZSBjb21waWxpbmcgd2l0aCBERUMgQyBvciBWQVggQywgeW91IG11c3QgcnVuCi0KLSAgJCBAc2V0dXAKLQotYmVmb3JlIHN0YXJ0aW5nIGdudS1tYWtlLiBUaGlzIGlzbid0IG5lZWRlZCB3aXRoIEdOVSBDLgotCi1PbiB0aGUgQWxwaGEgeW91IGNhbiBjaG9vc2UgdGhlIGNvbXBpbGVyIGJ5IGVkaXRpbmcgdGhlIHRvcGxldmVsCi1tYWtlZmlsZS52bXMuIEVpdGhlciBzZWxlY3QgQ0M9Y2MgKGZvciBERUMgQykgb3IgQ0M9Z2NjIChmb3IgR05VIEMpCi0KLQotSW5zdGFsbGluZyB0aGUgcmVsZWFzZQotCi1Qcm92aWRlZCB0aGF0IHlvdXIgZGlyZWN0b3J5IHNldHVwIGNvbmZvcm1zIHRvIHRoZSBHTlUgb24gb3BlblZNUwotc3RhbmRhcmQsIHlvdSBhbHJlYWR5IGhhdmUgYSBjb25jZWFsZWQgZGV2aWNlZCBuYW1lZCAnR05VX1JPT1QnLgotSW4gdGhpcyBjYXNlLCBhIHNpbXBsZQotCi0gJCBnbWFrZSBpbnN0YWxsCi0KLXN1ZmZpY2VzIHRvIGNvcHkgYWxsIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMgdG8gdGhlIHByb3BlciBkaXJlY3Rvcmllcy4KLQotRGVmaW5lIHRoZSBwcm9ncmFtcyBhcyBmb3JlaWduIGNvbW1hbmRzIGJ5IGFkZGluZyB0aGVzZSBsaW5lcyB0byB5b3VyCi1sb2dpbi5jb206Ci0KLSAgJCBnYXMgOj09ICRHTlVfUk9PVDpbYmluXWFzLmV4ZQotICAkIHNpemUgOj09ICRHTlVfUk9PVDpbYmluXXNpemUuZXhlCi0gICQgbm0gOj09ICRHTlVfUk9PVDpbYmluXW5tLmV4ZQotICAkIG9iamR1bXAgOj09ICRHTlVfUk9PVDpbYmluXW9iamR1bXAuZXhlCi0gICQgc3RyaW5ncyA6PT0gJEdOVV9ST09UOltiaW5dc3RyaW5ncy5leGUKLQotSWYgeW91IGhhdmUgYSBkaWZmZXJlbnQgZGlyZWN0b3J5IHNldHVwLCBjb3B5IHRoZSBiaW5hcnkgdXRpbGl0aWVzCi0oWy5iaW51dGlsc11zaXplLmV4ZSwgWy5iaW51dGlsc11ubS5leGUsIFsuYmludXRpbHNdb2JqZHVtcC5leGUsCi1hbmQgWy5iaW51dGlsc11zdHJpbmdzLmV4ZSkgYW5kIHRoZSBnbnUgYXNzZW1ibGVyIGFuZCBwcmVwcm9jZXNzb3IKLShbLmdhc11hcy5leGUgYW5kIFsuZ2FzXWdhc3AuZXhlXSkgdG8gYSBkaXJlY3Rvcnkgb2YgeW91ciBjaG9pY2UKLWFuZCBkZWZpbmUgYWxsIHByb2dyYW1zIGFzIGZvcmVpZ24gY29tbWFuZHMuCi0KLQotSWYgeW91J3JlIHNhdGllc2ZpZWQgd2l0aCB0aGUgY29tcGlsYXRpb24sIHlvdSBtYXkgd2FudCB0byByZW1vdmUKLXVubmVlZGVkIG9iamVjdHMgYW5kIGxpYnJhcmllczoKLQotICAkIGdtYWtlIGNsZWFuCi0KLQotSWYgeW91IGhhdmUgYW55IHByb2JsZW1zIG9yIHF1ZXN0aW9ucyBhYm91dCB0aGUgYmludXRpbHMgb24gVk1TLCBmZWVsCi1mcmVlIHRvIG1haWwgbWUgYXQga2thZW1wZkBybWkuZGUuCmRpZmYgLS1naXQgYS9iaW51dGlscy9hY2luY2x1ZGUubTQgYi9iaW51dGlscy9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjA5YjkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYWNpbmNsdWRlLm00CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc2luY2x1ZGUoLi4vYmZkL2FjaW5jbHVkZS5tNCkKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FjbG9jYWwubTQgYi9iaW51dGlscy9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGExNTY1Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIwICswLDAgQEAKLWRubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS40Ci0KLWRubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLWRubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi1kbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi1kbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1kbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLWRubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi1kbmwgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1zaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2ggLS0KLSMgc29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLgotIyBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KLQotIyBzZXJpYWwgMQotCi1kbmwgVXNhZ2U6Ci1kbmwgQU1fSU5JVF9BVVRPTUFLRShwYWNrYWdlLHZlcnNpb24sIFtuby1kZWZpbmVdKQotCi1BQ19ERUZVTihBTV9JTklUX0FVVE9NQUtFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pCi1QQUNLQUdFPVskMV0KLUFDX1NVQlNUKFBBQ0tBR0UpCi1WRVJTSU9OPVskMl0KLUFDX1NVQlNUKFZFUlNJT04pCi1kbmwgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCi1maQotaWZlbHNlKFskM10sLAotQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSkpCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKQotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKQotZG5sIEZJWE1FIFRoaXMgaXMgdHJ1bHkgZ3Jvc3MuCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvLCAkbWlzc2luZ19kaXIpCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSldKQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLgotIwotCi1BQ19ERUZVTihBTV9TQU5JVFlfQ0hFQ0ssCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICJbJF0qIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiWyRdKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICJbJF0qIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCi0gICBmaQotCi0gICB0ZXN0ICJbJF0yIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCi1maQotcm0gLWYgY29uZnRlc3QqCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi1kbmwgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0sIERJUkVDVE9SWSkKLWRubCBUaGUgcHJvZ3JhbSBtdXN0IHByb3Blcmx5IGltcGxlbWVudCAtLXZlcnNpb24uCi1BQ19ERUZVTihBTV9NSVNTSU5HX1BST0csCi1bQUNfTVNHX0NIRUNLSU5HKGZvciB3b3JraW5nICQyKQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKCQyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgJDE9JDIKLSAgIEFDX01TR19SRVNVTFQoZm91bmQpCi1lbHNlCi0gICAkMT0iJDMvbWlzc2luZyAkMiIKLSAgIEFDX01TR19SRVNVTFQobWlzc2luZykKLWZpCi1BQ19TVUJTVCgkMSldKQotCi0KLSMgc2VyaWFsIDM1IEFDX1BST0dfTElCVE9PTAotQUNfREVGVU4oQUNfUFJPR19MSUJUT09MLAotW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLUFDX0NBQ0hFX1NBVkUKLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCBBQ19NU0dfRVJST1IoW2xpYnRvb2wgY29uZmlndXJlIGZhaWxlZF0pCi0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLUFDX0NBQ0hFX0xPQUQKLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLUFDX1NVQlNUKExJQlRPT0wpZG5sCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLV0pCi0KLUFDX0RFRlVOKEFDX0xJQlRPT0xfU0VUVVAsCi1bQUNfUFJFUkVRKDIuMTMpZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU0hBUkVEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TVEFUSUNdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAotZG5sCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKLSAgICBbQUNfVFJZX0xJTksoW10sW10sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pXSkKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gIEFDX1NZU19MSUJUT09MX0NZR1dJTgotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi1BQ19BUkdfRU5BQkxFKGxpYnRvb2wtbG9jaywKLVsgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZ10sCi1uZWVkX2xvY2tzPSRlbmFibGV2YWwsCi1uZWVkX2xvY2tzPXllcykKLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi1dKQotCi0jIEFDX0xJQlRPT0xfRExPUEVOIC0gY2hlY2sgZm9yIGRsb3BlbiBzdXBwb3J0Ci1BQ19ERUZVTihBQ19MSUJUT09MX0RMT1BFTiwgW2x0X2Rsb3Blbj15ZXNdKQotCi0jIEFDX0VOQUJMRV9TSEFSRUQgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU0hBUkVEWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TSEFSRUQsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc2hhcmVkLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc2hhcmVkPUFDX0VOQUJMRV9TSEFSRURfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TSEFSRUQgLSBzZXQgdGhlIGRlZmF1bHQgc2hhcmVkIGZsYWcgdG8gLS1kaXNhYmxlLXNoYXJlZAotQUNfREVGVU4oQUNfRElTQUJMRV9TSEFSRUQsCi1bQUNfRU5BQkxFX1NIQVJFRChubyldKQotCi0jIEFDX0VOQUJMRV9TVEFUSUMgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU1RBVElDWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TVEFUSUMsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc3RhdGljLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc3RhdGljPUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TVEFUSUMgLSBzZXQgdGhlIGRlZmF1bHQgc3RhdGljIGZsYWcgdG8gLS1kaXNhYmxlLXN0YXRpYwotQUNfREVGVU4oQUNfRElTQUJMRV9TVEFUSUMsCi1bQUNfRU5BQkxFX1NUQVRJQyhubyldKQotCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9GQVNUX0lOU1RBTExbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCwKLVtkZWZpbmUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShmYXN0LWluc3RhbGwsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PT4+QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX2Zhc3RfaW5zdGFsbD1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBzZXQgdGhlIGRlZmF1bHQgdG8gLS1kaXNhYmxlLWZhc3QtaW5zdGFsbAotQUNfREVGVU4oQUNfRElTQUJMRV9GQVNUX0lOU1RBTEwsCi1bQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTChubyldKQotCi0KLSMgQUNfUFJPR19MRCAtIGZpbmQgdGhlIHBhdGggdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgotQUNfREVGVU4oQUNfUFJPR19MRCwKLVtBQ19BUkdfV0lUSChnbnUtbGQsCi1bICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dXSwKLXRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcywgd2l0aF9nbnVfbGQ9bm8pCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5IEdDQ10pCi0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi1jaGFuZ2VxdW90ZSgsKWRubAotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotY2hhbmdlcXVvdGUoWyxdKWRubAotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCi1lbHNlCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQotZmkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX0xELAotW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maV0pCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoJExEKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLXRlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCi1BQ19TVUJTVChMRCkKLUFDX1BST0dfTERfR05VCi1dKQotCi1BQ19ERUZVTihBQ19QUk9HX0xEX0dOVSwKLVtBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBhY19jdl9wcm9nX2dudV9sZCwKLVsjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpXSkKLV0pCi0KLSMgQUNfUFJPR19OTSAtIGZpbmQgdGhlIHBhdGggdG8gYSBCU0QtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgotQUNfREVGVU4oQUNfUFJPR19OTSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBCU0QtY29tcGF0aWJsZSBubV0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9OTSwKLVtpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpXSkKLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLUFDX01TR19SRVNVTFQoWyROTV0pCi1BQ19TVUJTVChOTSkKLV0pCi0KLSMgQUNfU1lTX05NX1BBUlNFIC0gQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkCi0jIGJ5IEMgc3ltYm9sIG5hbWUgZnJvbSBubS4KLUFDX0RFRlVOKEFDX1NZU19OTV9QQVJTRSwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1BQ19NU0dfQ0hFQ0tJTkcoW2NvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dF0pCi1BQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSwKLVsjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLWNoYW5nZXF1b3RlKCwpZG5sCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1hY19zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLWFjX3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLWFjX3N5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgYWNfc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KikKLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikKLSAgYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIDs7Ci1pcml4KikKLSAgYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBhY19zeW1jb2RlPSdbQkRUXScKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi1maQotY2hhbmdlcXVvdGUoWyxdKWRubAotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbIAldXCgkYWNfc3ltY29kZVwpWyAJXVsgCV0qXCgkYWNfc3ltcHJmeFwpJGFjX3N5bXBhdCQvJGFjX3N5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIGFjX3BpcGVfd29ya3M9bm8KLSAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotCi0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLQotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRhY19ubGlzdCIgfCB1bmlxID4gIiRhY19ubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRhY19ubGlzdCJUICIkYWNfbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRhY19ubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jJwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWNoYW5nZXF1b3RlKCwpZG5sCi1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLWNoYW5nZXF1b3RlKFssXSlkbmwKLXsKLUVPRgotCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYwotCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKLQkgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0JICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgYWNfcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0JICAgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0gICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotICAgIGZpCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi1dKQotCi1hY19yZXN1bHQ9eWVzCi1pZiB0ZXN0IC16ICIkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgIGFjX3Jlc3VsdD1ubwotZmkKLUFDX01TR19SRVNVTFQoJGFjX3Jlc3VsdCkKLV0pCi0KLSMgQUNfU1lTX0xJQlRPT0xfQ1lHV0lOIC0gZmluZCB0b29scyBuZWVkZWQgb24gY3lnd2luCi1BQ19ERUZVTihBQ19TWVNfTElCVE9PTF9DWUdXSU4sCi1bQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKLUFDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKLV0pCi0KLSMgQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFIC0gZG9lcyB0aGUgY29tcGlsZXIgcHJlZml4IGdsb2JhbCBzeW1ib2xzCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYW4gdW5kZXJzY29yZT8KLUFDX0RFRlVOKEFDX1NZU19TWU1CT0xfVU5ERVJTQ09SRSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19OTV9QQVJTRV0pZG5sCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUsCi1bYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi12b2lkIG5tX3Rlc3RfZnVuYygpe30KLWludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0gICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgotICAgIGlmIGVncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgaWYgZWdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0gIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLWZpCi1ybSAtcmYgY29uZnRlc3QqCi1dKQotQUNfTVNHX1JFU1VMVCgkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlKQotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotQUNfU1VCU1QoVVNFX1NZTUJPTF9VTkRFUlNDT1JFKWRubAotXSkKLQotIyBBQ19DSEVDS19MSUJNIC0gY2hlY2sgZm9yIG1hdGggbGlicmFyeQotQUNfREVGVU4oQUNfQ0hFQ0tfTElCTSwgWwotQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCkKLUFDX0NIRUNLX0xJQihtLCBjb3MpCi1dKQotCi0jIEFDX0xJQkxURExfQ09OVkVOSUVOQ0VbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBhZGRzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLUFDX0RFRlVOKEFDX0xJQkxURExfQ09OVkVOSUVOQ0UsIFsKLSAgY2FzZSAiJGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlIiBpbgotICBubykgQUNfTVNHX0VSUk9SKFt0aGlzIHBhY2thZ2UgbmVlZHMgYSBjb252ZW5pZW5jZSBsaWJsdGRsXSkgOzsKLSAgIiIpIGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlPXllcwotICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIiA7OwotICBlc2FjCi0gIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsYy5sYQotXSkKLQotIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgaW5zdGFsbGFibGUgbGlicmFyeSwgYW5kIGFkZHMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi0jIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KLUFDX0RFRlVOKEFDX0xJQkxURExfSU5TVEFMTEFCTEUsIFsKLSAgQUNfQ0hFQ0tfTElCKGx0ZGwsIG1haW4sIExJQkxUREw9Ii1sbHRkbCIsIFsKLSAgICBjYXNlICIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgaW4KLSAgICBubykgQUNfTVNHX1dBUk4oW2xpYmx0ZGwgbm90IGluc3RhbGxlZCwgYnV0IGluc3RhbGxhdGlvbiBkaXNhYmxlZF0pIDs7Ci0gICAgIiIpIGVuYWJsZV9sdGRsX2luc3RhbGw9eWVzCi0gICAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsIiA7OwotICAgIGVzYWMKLSAgXSkKLSAgaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiAhPSB4Im5vIjsgdGhlbgotICAgIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsLmxhCi0gIGZpCi1dKQotCi1kbmwgb2xkIG5hbWVzCi1BQ19ERUZVTihBTV9QUk9HX0xJQlRPT0wsIFtpbmRpcihbQUNfUFJPR19MSUJUT09MXSldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19FTkFCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRU5BQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19ESVNBQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NUQVRJQywgW2luZGlyKFtBQ19ESVNBQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX0xELCBbaW5kaXIoW0FDX1BST0dfTERdKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX05NLCBbaW5kaXIoW0FDX1BST0dfTk1dKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfTk1fUEFSU0UsIFtpbmRpcihbQUNfU1lTX05NX1BBUlNFXSldKWRubAotQUNfREVGVU4oQU1fU1lTX1NZTUJPTF9VTkRFUlNDT1JFLCBbaW5kaXIoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19MSUJUT09MX0NZR1dJTiwgW2luZGlyKFtBQ19TWVNfTElCVE9PTF9DWUdXSU5dKV0pZG5sCi0KLSMgTGlrZSBBQ19DT05GSUdfSEVBREVSLCBidXQgYXV0b21hdGljYWxseSBjcmVhdGUgc3RhbXAgZmlsZS4KLQotQUNfREVGVU4oQU1fQ09ORklHX0hFQURFUiwKLVtBQ19QUkVSRVEoWzIuMTJdKQotQUNfQ09ORklHX0hFQURFUihbJDFdKQotZG5sIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCi1kbmwgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCi1kbmwgdGhhdCBpcyBnZW5lcmF0ZWQuICBXZSBtdXN0IHN0cmlwIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgZmlyc3QgIjoiLAotZG5sIGFuZCBldmVyeXRoaW5nIHBhc3QgdGhlIGxhc3QgIi8iLgotQUNfT1VUUFVUX0NPTU1BTkRTKGNoYW5nZXF1b3RlKDw8LD4+KWRubAotaWZlbHNlKHBhdHN1YnN0KDw8JDE+PiwgPDxbXiBdPj4sIDw8Pj4pLCA8PD4+LAotPDx0ZXN0IC16ICI8PCQ+PkNPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHBhdHN1YnN0KDw8JDE+PiwgPDxeXChbXjpdKi9cKT8uKj4+LCA8PFwxPj4pc3RhbXAtaDw8Pj5kbmw+PiwKLTw8YW1faW5keD0xCi1mb3IgYW1fZmlsZSBpbiA8PCQxPj47IGRvCi0gIGNhc2UgIiA8PCQ+PkNPTkZJR19IRUFERVJTICIgaW4KLSAgKiIgPDwkPj5hbV9maWxlICIqPDwpPj4KLSAgICBlY2hvIHRpbWVzdGFtcCA+IGBlY2hvIDw8JD4+YW1fZmlsZSB8IHNlZCAtZSAncyU6LiolJScgLWUgJ3MlW14vXSokJSUnYHN0YW1wLWgkYW1faW5keAotICAgIDs7Ci0gIGVzYWMKLSAgYW1faW5keD1gZXhwciAiPDwkPj5hbV9pbmR4IiArIDFgCi1kb25lPDw+PmRubD4+KQotY2hhbmdlcXVvdGUoWyxdKSldKQotCi0KLWRubCBBTV9QUk9HX0xFWAotZG5sIExvb2sgZm9yIGZsZXgsIGxleCBvciBtaXNzaW5nLCB0aGVuIHJ1biBBQ19QUk9HX0xFWCBhbmQgQUNfREVDTF9ZWVRFWFQKLUFDX0RFRlVOKEFNX1BST0dfTEVYLAotW21pc3NpbmdfZGlyPWlmZWxzZShbJDFdLCxgY2QgJGFjX2F1eF9kaXIgJiYgcHdkYCwkMSkKLUFDX0NIRUNLX1BST0dTKExFWCwgZmxleCBsZXgsICIkbWlzc2luZ19kaXIvbWlzc2luZyBmbGV4IikKLUFDX1BST0dfTEVYCi1BQ19ERUNMX1lZVEVYVF0pCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLUFDX0RFRlVOKENZX1dJVEhfTkxTLAotICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCi0gICAgQUNfQVJHX0VOQUJMRShubHMsCi0gICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCi0gICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKLSAgICBBQ19TVUJTVChVU0VfTkxTKQotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKLSAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMsIDEsIFtEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAotICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCi0gICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0Ci0gICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKLSAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCi0JZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCi0JbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCi0JICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKLQkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAotCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCi0JCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhULCAxLAotCQkJW0RlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0Ll0pCi0JICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKLQkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0JCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLQkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKLQkJICBbQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmVdLAotCQkgIFtDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYl0pCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQldKQotCi0JZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCi0gICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCi0KLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KLQkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KLQkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgotICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCi0gICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLSAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KLSAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQotCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCi0JaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgQUNfTVNHX1JFU1VMVCgKLQkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCi0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCi0gICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncwotICAgIGRubCBpbiBjb25maWd1cmUuaW4uCi0gICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KLSAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKLSAgICBBQ19TVUJTVChDQVRBTE9HUykKLSAgICBBQ19TVUJTVChDQVRPQkpFWFQpCi0gICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCi0gICAgQUNfU1VCU1QoR01PRklMRVMpCi0gICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKLSAgICBBQ19TVUJTVChJTlRMREVQUykKLSAgICBBQ19TVUJTVChJTlRMTElCUykKLSAgICBBQ19TVUJTVChJTlRMT0JKUykKLSAgICBBQ19TVUJTVChQT0ZJTEVTKQotICAgIEFDX1NVQlNUKFBPU1VCKQotICBdKQotCi1BQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKLSAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCi0KLSAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKLSAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb25dKQotICAgZmkKLQotICAgQU1fTENfTUVTU0FHRVMKLSAgIENZX1dJVEhfTkxTCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCi0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQotICAgICBmaQotCi0gICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgotICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQotICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCi0gICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCi0KLSAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKLSAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgotICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKLSAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKLQotCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKLSAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgotCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgotICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCi0gICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0Ci0gICBkbmwgcGFja2FnZXMuCi0gICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgQUNfU1VCU1QoR1RfTk8pCi0gICBBQ19TVUJTVChHVF9ZRVMpCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCi0KLSAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgotICAgbD0KLSAgIEFDX1NVQlNUKGwpCi0KLSAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCi0gICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKLSAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgotICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIF0pCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLWRubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKLWRubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKLUFDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCi1bIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCi1bY2FzZSAiWyRdJDEiIGluCi0gIC8qKQotICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiBbJDNdOyB0aGVuCi0JYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKLWRubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgotaWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKLV0pZG5sCi0gIDs7Ci1lc2FjXSlkbmwKLSQxPSIkYWNfY3ZfcGF0aF8kMSIKLWlmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFskXSQxKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFDX1NVQlNUKCQxKWRubAotXSkKLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKLSAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0KLUFDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAotW0FDX1NVQlNUKCQxX1RSVUUpCi1BQ19TVUJTVCgkMV9GQUxTRSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpXSkKLQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYWRkcjJsaW5lLjEgYi9iaW51dGlscy9hZGRyMmxpbmUuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjZTEwMy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hZGRyMmxpbmUuMQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIGFkZHIybGluZSAxICIyNyBNYXJjaCAxOTk3IiAiQ3lnbnVzIFNvbHV0aW9ucyIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1hZGRyMmxpbmUgXC0gY29udmVydCBhZGRyZXNzZXMgaW50byBmaWxlIG5hbWVzIGFuZCBsaW5lIG51bWJlcnMKLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIGFkZHIybGluZQotLlJCICJbXHwiICJcLWJcICJcYwotLkkgYmZkbmFtZVxjCi0uUkIgIiB8ICIgIlwtXC10YXJnZXQ9IlxjCi0uSSBiZmRuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1DIHwgXC1cLWRlbWFuZ2xlICJcfF0iCi0uUkIgIltcfCIgIlwtZVwgIlxjCi0uSSBmaWxlbmFtZVxjCi0uUkIgIiB8ICIgIlwtXC1leGU9IlxjCi0uSSBmaWxlbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiIFwtZiB8IFwtXC1mdW5jdGlvbnMgIlx8XSIKLS5SQiAiW1x8IiBcLXMgfCBcLVwtYmFzZW5hbWVzICJcfF0iCi0uUkIgIltcfCIgXC1IIHwgXC1cLWhlbHAgIlx8XSIKLS5SQiAiW1x8IiBcLVYgfCBcLVwtdmVyc2lvbiAiXHxdIgotLlJCICJbXHwiIGFkZHIgYWRkciAuLi4gICJcfF0iCi0uYWQgYgotLmh5IDEKLS5TSCBERVNDUklQVElPTgotXGMKLS5CIGFkZHIybGluZQotdHJhbnNsYXRlcyBwcm9ncmFtIGFkZHJlc3NlcyBpbnRvIGZpbGUgbmFtZXMgYW5kIGxpbmUgbnVtYmVycy4gIEdpdmVuCi1hbiBhZGRyZXNzIGFuZCBhbiBleGVjdXRhYmxlLCBpdCB1c2VzIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlCi1leGVjdXRhYmxlIHRvIGZpZ3VyZSBvdXQgd2hpY2ggZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBhcmUKLWFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGFkZHJlc3MuCi0KLVRoZSBleGVjdXRhYmxlIHRvIHVzZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUKLS5CIFwtZQotb3B0aW9uLiAgVGhlIGRlZmF1bHQgaXMKLS5CIGEub3V0XGMKLVwmLgotCi0uQiBhZGRyMmxpbmUKLWhhcyB0d28gbW9kZXMgb2Ygb3BlcmF0aW9uLgotCi1JbiB0aGUgZmlyc3QsIGhleGFkZWNpbWFsIGFkZHJlc3NlcyBhcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsCi1hbmQKLS5CIGFkZHIybGluZQotZGlzcGxheXMgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgZm9yIGVhY2ggYWRkcmVzcy4KLQotSW4gdGhlIHNlY29uZCwKLS5CIGFkZHIybGluZQotcmVhZHMgaGV4YWRlY2ltYWwgYWRkcmVzc2VzIGZyb20gc3RhbmRhcmQgaW5wdXQsIGFuZCBwcmludHMgdGhlIGZpbGUKLW5hbWUgYW5kIGxpbmUgbnVtYmVyIGZvciBlYWNoIGFkZHJlc3Mgb24gc3RhbmRhcmQgb3V0cHV0LiAgSW4gdGhpcwotbW9kZSwKLS5CIGFkZHIybGluZQotbWF5IGJlIHVzZWQgaW4gYSBwaXBlIHRvIGNvbnZlcnQgZHluYW1pY2FsbHkgY2hvc2VuIGFkZHJlc3Nlcy4KLQotVGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGlzIEZJTEVOQU1FOkxJTkVOTy4gIFRoZSBmaWxlIG5hbWUgYW5kIGxpbmUKLW51bWJlciBmb3IgZWFjaCBhZGRyZXNzIGlzIHByaW50ZWQgb24gYSBzZXBhcmF0ZSBsaW5lLiAgSWYgdGhlCi0uQiBcLWYKLW9wdGlvbiBpcyB1c2VkLCB0aGVuIGVhY2ggRklMRU5BTUU6TElORU5PIGxpbmUgaXMgcHJlY2VkZWQgYnkgYQotRlVOQ1RJT05OQU1FIGxpbmUgd2hpY2ggaXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgdGhlCi1hZGRyZXNzLgotCi1JZiB0aGUgZmlsZSBuYW1lIG9yIGZ1bmN0aW9uIG5hbWUgY2FuIG5vdCBiZSBkZXRlcm1pbmVkLAotLkIgYWRkcjJsaW5lCi13aWxsIHByaW50IHR3byBxdWVzdGlvbiBtYXJrcyBpbiB0aGVpciBwbGFjZS4gIElmIHRoZSBsaW5lIG51bWJlciBjYW4KLW5vdCBiZSBkZXRlcm1pbmVkLAotLkIgYWRkcjJsaW5lCi13aWxsIHByaW50IDAuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CSSAiXC1iICIgImJmZG5hbWUiXGMKLS5UUAotLkJJICJcLVwtdGFyZ2V0PSIgImJmZG5hbWUiCi1TcGVjaWZ5IHRoZSBvYmplY3QtY29kZSBmb3JtYXQgZm9yIHRoZSBvYmplY3QgZmlsZXMgdG8gYmUKLVxjCi0uSSBiZmRuYW1lXGMKLVwmLgotCi0uVFAKLS5CIFwtQwotLlRQCi0uQiBcLVwtZGVtYW5nbGUKLURlY29kZSAoXGZJZGVtYW5nbGVcZlApIGxvdy1sZXZlbCBzeW1ib2wgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzLgotQmVzaWRlcyByZW1vdmluZyBhbnkgaW5pdGlhbCB1bmRlcnNjb3JlIHByZXBlbmRlZCBieSB0aGUgc3lzdGVtLCB0aGlzCi1tYWtlcyBDKysgZnVuY3Rpb24gbmFtZXMgcmVhZGFibGUuCi0KLS5UUAotLkJJICJcLWUgIiAiZmlsZW5hbWUiXGMKLS5UUAotLkJJICJcLVwtZXhlPSIgImZpbGVuYW1lIgotU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSBmb3Igd2hpY2ggYWRkcmVzc2VzIHNob3VsZCBiZQotdHJhbnNsYXRlZC4gIFRoZSBkZWZhdWx0IGZpbGUgaXMKLS5CIGEub3V0XGMKLVwmLgotCi0uVFAKLS5CIFwtZgotLlRQCi0uQiBcLVwtZnVuY3Rpb25zCi1EaXNwbGF5IGZ1bmN0aW9uIG5hbWVzIGFzIHdlbGwgYXMgZmlsZSBhbmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uCi0KLS5UUAotLkIgXC1zCi0uVFAKLS5CIFwtXC1iYXNlbmFtZXMKLURpc3BsYXkgb25seSB0aGUgYmFzZSBvZiBlYWNoIGZpbGUgbmFtZS4KLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIgotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLVwmLCBSb2xhbmQgSC4gUGVzY2ggKE9jdG9iZXIgMTk5MSkuCmRpZmYgLS1naXQgYS9iaW51dGlscy9hZGRyMmxpbmUuYyBiL2JpbnV0aWxzL2FkZHIybGluZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2VlODY3Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2FkZHIybGluZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qIGFkZHIybGluZS5jIC0tIGNvbnZlcnQgYWRkcmVzc2VzIHRvIGxpbmUgbnVtYmVyIGFuZCBmdW5jdGlvbiBuYW1lCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBMYXV0aGVyIDxVbHJpY2guTGF1dGhlckB6ZmUuc2llbWVucy5kZT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBEZXJpdmVkIGZyb20gb2JqZHVtcC5jIGFuZCBubS5jIGJ5IFVscmljaC5MYXV0aGVyQHpmZS5zaWVtZW5zLmRlCi0KLSAgIFVzYWdlOiAKLSAgIGFkZHIybGluZSBbb3B0aW9uc10gYWRkciBhZGRyIC4uLgotICAgb3IKLSAgIGFkZHIybGluZSBbb3B0aW9uc10gCi0KLSAgIGJvdGggZm9ybXMgd3JpdGUgcmVzdWx0cyB0byBzdGRvdXQsIHRoZSBzZWNvbmQgZm9ybSByZWFkcyBhZGRyZXNzZXMKLSAgIHRvIGJlIGNvbnZlcnRlZCBmcm9tIHN0ZGluLiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi1leHRlcm4gY2hhciAqcHJvZ3JhbV92ZXJzaW9uOwotCi1zdGF0aWMgYm9vbGVhbiB3aXRoX2Z1bmN0aW9uczsJLyogLWYsIHNob3cgZnVuY3Rpb24gbmFtZXMuICAqLwotc3RhdGljIGJvb2xlYW4gZG9fZGVtYW5nbGU7CS8qIC1DLCBkZW1hbmdsZSBuYW1lcy4gICovCi1zdGF0aWMgYm9vbGVhbiBiYXNlX25hbWVzOwkvKiAtcywgc3RyaXAgZGlyZWN0b3J5IG5hbWVzLiAgKi8KLQotc3RhdGljIGludCBuYWRkcjsJCS8qIE51bWJlciBvZiBhZGRyZXNzZXMgdG8gcHJvY2Vzcy4gICovCi1zdGF0aWMgY2hhciAqKmFkZHI7CQkvKiBIZXggYWRkcmVzc2VzIHRvIHByb2Nlc3MuICAqLwotCi1zdGF0aWMgYXN5bWJvbCAqKnN5bXM7CQkvKiBTeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsiYmFzZW5hbWVzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdzJ30sCi0gIHsiZGVtYW5nbGUiLCBub19hcmd1bWVudCwgTlVMTCwgJ0MnfSwKLSAgeyJleGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2UnfSwKLSAgeyJmdW5jdGlvbnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2YnfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2InfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdIJ30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVid9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotCi1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgc2x1cnBfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBmaW5kX2FkZHJlc3NfaW5fc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCB0cmFuc2xhdGVfYWRkcmVzc2VzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBwcm9jZXNzX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQwKLS8qIFByaW50IGEgdXNhZ2UgbWVzc2FnZSB0byBTVFJFQU0gYW5kIGV4aXQgd2l0aCBTVEFUVVMuICAqLwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotVXNhZ2U6ICVzIFstQ2ZzSFZdIFstYiBiZmRuYW1lXSBbLS10YXJnZXQ9YmZkbmFtZV1cblwKLSAgICAgICBbLWUgZXhlY3V0YWJsZV0gWy0tZXhlPWV4ZWN1dGFibGVdIFstLWRlbWFuZ2xlXVxuXAotICAgICAgIFstLWJhc2VuYW1lc10gWy0tZnVuY3Rpb25zXSBbYWRkciBhZGRyIC4uLl1cbiIpLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0MCi0vKiBSZWFkIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotc2x1cnBfc3ltdGFiIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGxvbmcgc3RvcmFnZTsKLSAgbG9uZyBzeW1jb3VudDsKLQotICBpZiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBIQVNfU1lNUykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgc3RvcmFnZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLSAgaWYgKHN0b3JhZ2UgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIHN5bXMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZSk7Ci0KLSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltcyk7Ci0gIGlmIChzeW1jb3VudCA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci19Ci0MCi0vKiBUaGVzZSBnbG9iYWwgdmFyaWFibGVzIGFyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gYmV0d2VlbgotICAgdHJhbnNsYXRlX2FkZHJlc3NlcyBhbmQgZmluZF9hZGRyZXNzX2luX3NlY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3ZtYSBwYzsKLXN0YXRpYyBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXN0YXRpYyBjb25zdCBjaGFyICpmdW5jdGlvbm5hbWU7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGxpbmU7Ci1zdGF0aWMgYm9vbGVhbiBmb3VuZDsKLQotLyogTG9vayBmb3IgYW4gYWRkcmVzcyBpbiBhIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCB2aWEKLSAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1maW5kX2FkZHJlc3NfaW5fc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIGJmZF92bWEgdm1hOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLSAgaWYgKGZvdW5kKQotICAgIHJldHVybjsKLQotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbikgJiBTRUNfQUxMT0MpID09IDApCi0gICAgcmV0dXJuOwotCi0gIHZtYSA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAocGMgPCB2bWEpCi0gICAgcmV0dXJuOwotCi0gIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3Rpb24pOwotICBpZiAocGMgPj0gdm1hICsgc2l6ZSkKLSAgICByZXR1cm47Ci0KLSAgZm91bmQgPSBiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bXMsIHBjIC0gdm1hLAotCQkJCSAmZmlsZW5hbWUsICZmdW5jdGlvbm5hbWUsICZsaW5lKTsKLX0KLQotLyogUmVhZCBoZXhhZGVjaW1hbCBhZGRyZXNzZXMgZnJvbSBzdGRpbiwgdHJhbnNsYXRlIGludG8KLSAgIGZpbGVfbmFtZTpsaW5lX251bWJlciBhbmQgb3B0aW9uYWxseSBmdW5jdGlvbiBuYW1lLiAgKi8KLQotc3RhdGljIHZvaWQKLXRyYW5zbGF0ZV9hZGRyZXNzZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHJlYWRfc3RkaW4gPSAobmFkZHIgPT0gMCk7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBpZiAocmVhZF9zdGRpbikKLQl7Ci0JICBjaGFyIGFkZHJfaGV4WzEwMF07Ci0KLQkgIGlmIChmZ2V0cyAoYWRkcl9oZXgsIHNpemVvZiBhZGRyX2hleCwgc3RkaW4pID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgcGMgPSBiZmRfc2Nhbl92bWEgKGFkZHJfaGV4LCBOVUxMLCAxNik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChuYWRkciA8PSAwKQotCSAgICBicmVhazsKLQkgIC0tbmFkZHI7Ci0JICBwYyA9IGJmZF9zY2FuX3ZtYSAoKmFkZHIrKywgTlVMTCwgMTYpOwotCX0KLQotICAgICAgZm91bmQgPSBmYWxzZTsKLSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgZmluZF9hZGRyZXNzX2luX3NlY3Rpb24sIChQVFIpIE5VTEwpOwotCi0gICAgICBpZiAoISBmb3VuZCkKLQl7Ci0JICBpZiAod2l0aF9mdW5jdGlvbnMpCi0JICAgIHByaW50ZiAoIj8/XG4iKTsKLQkgIHByaW50ZiAoIj8/OjBcbiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAod2l0aF9mdW5jdGlvbnMpCi0JICAgIHsKLQkgICAgICBpZiAoZnVuY3Rpb25uYW1lID09IE5VTEwgfHwgKmZ1bmN0aW9ubmFtZSA9PSAnXDAnKQotCQlwcmludGYgKCI/P1xuIik7Ci0JICAgICAgZWxzZSBpZiAoISBkb19kZW1hbmdsZSkKLQkJcHJpbnRmICgiJXNcbiIsIGZ1bmN0aW9ubmFtZSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY2hhciAqcmVzOwotCi0JCSAgcmVzID0gY3BsdXNfZGVtYW5nbGUgKGZ1bmN0aW9ubmFtZSwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOwotCQkgIGlmIChyZXMgPT0gTlVMTCkKLQkJICAgIHByaW50ZiAoIiVzXG4iLCBmdW5jdGlvbm5hbWUpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiJXNcbiIsIHJlcyk7Ci0JCSAgICAgIGZyZWUgKHJlcyk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoYmFzZV9uYW1lcyAmJiBmaWxlbmFtZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqaDsKLQotCSAgICAgIGggPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQlmaWxlbmFtZSA9IGggKyAxOwotCSAgICB9Ci0KLQkgIHByaW50ZiAoIiVzOiV1XG4iLCBmaWxlbmFtZSA/IGZpbGVuYW1lIDogIj8/IiwgbGluZSk7Ci0JfQotCi0gICAgICAvKiBmZmx1c2goKSBpcyBlc3NlbnRpYWwgZm9yIHVzaW5nIHRoaXMgY29tbWFuZCBhcyBhIHNlcnZlcgotICAgICAgICAgY2hpbGQgcHJvY2VzcyB0aGF0IHJlYWRzIGFkZHJlc3NlcyBmcm9tIGEgcGlwZSBhbmQgcmVzcG9uZHMKLSAgICAgICAgIHdpdGggbGluZSBudW1iZXIgaW5mb3JtYXRpb24sIHByb2Nlc3Npbmcgb25lIGFkZHJlc3MgYXQgYQotICAgICAgICAgdGltZS4gICovCi0gICAgICBmZmx1c2ggKHN0ZG91dCk7Ci0gICAgfQotfQotCi0vKiBQcm9jZXNzIGEgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2ZpbGUgKGZpbGVuYW1lLCB0YXJnZXQpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICp0YXJnZXQ7Ci17Ci0gIGJmZCAqYWJmZDsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGFiZmQgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoZmlsZW5hbWUpOwotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfYXJjaGl2ZSkpCi0gICAgZmF0YWwgKF8oIiVzOiBjYW4gbm90IGdldCBhZGRyZXNzZXMgZnJvbSBhcmNoaXZlIiksIGZpbGVuYW1lKTsKLQotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCXsKLQkgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotCSAgZnJlZSAobWF0Y2hpbmcpOwotCX0KLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgc2x1cnBfc3ltdGFiIChhYmZkKTsKLQotICB0cmFuc2xhdGVfYWRkcmVzc2VzIChhYmZkKTsKLQotICBpZiAoc3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHN5bXMpOwotICAgICAgc3ltcyA9IE5VTEw7Ci0gICAgfQotCi0gIGJmZF9jbG9zZSAoYWJmZCk7Ci19Ci0MCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKnRhcmdldDsKLSAgaW50IGM7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSAqYXJndjsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIGZpbGVuYW1lID0gTlVMTDsKLSAgdGFyZ2V0ID0gTlVMTDsKLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJiOkNlOnNmSFYiLCBsb25nX29wdGlvbnMsIChpbnQgKikgMCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgMDoKLQkgIGJyZWFrOwkJLyogd2UndmUgYmVlbiBnaXZlbiBhIGxvbmcgb3B0aW9uICovCi0JY2FzZSAnYic6Ci0JICB0YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdDJzoKLQkgIGRvX2RlbWFuZ2xlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgZmlsZW5hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGJhc2VfbmFtZXMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICB3aXRoX2Z1bmN0aW9ucyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdWJzoKLQkgIHByaW50X3ZlcnNpb24gKCJhZGRyMmxpbmUiKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotICAgIGZpbGVuYW1lID0gImEub3V0IjsKLQotICBhZGRyID0gYXJndiArIG9wdGluZDsKLSAgbmFkZHIgPSBhcmdjIC0gb3B0aW5kOwotCi0gIHByb2Nlc3NfZmlsZSAoZmlsZW5hbWUsIHRhcmdldCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9hci4xIGIvYmludXRpbHMvYXIuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlOGNmZi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hci4xCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBhciAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1hciBcLSBjcmVhdGUsIG1vZGlmeSwgYW5kIGV4dHJhY3QgZnJvbSBhcmNoaXZlcy4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uQlIgYXIgIiBbXHwiICItIiAiXHxdIlxjCi0uSSB7ZG1wcXJ0eH1bYWJjaWxvc1N1dlZdIFxjCi1bXHxcYwotLkkgbWVtYmVybmFtZVxjCi1cJlx8XSBcYwotLkkgYXJjaGl2ZVxjCi1cJiBcYwotLkkgZmlsZXNcYwotXCYuXHwuXHwuCi0KLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1UaGUgR05VIFxjCi0uQiBhclxjCi1cJiBwcm9ncmFtIGNyZWF0ZXMsIG1vZGlmaWVzLCBhbmQgZXh0cmFjdHMgZnJvbQotYXJjaGl2ZXMuICBBbiBcYwotLkkgYXJjaGl2ZVxjCi1cJiBpcyBhIHNpbmdsZSBmaWxlIGhvbGRpbmcgYSBjb2xsZWN0aW9uIG9mCi1vdGhlciBmaWxlcyBpbiBhIHN0cnVjdHVyZSB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJldHJpZXZlCi10aGUgb3JpZ2luYWwgaW5kaXZpZHVhbCBmaWxlcyAoY2FsbGVkIFxjCi0uSSBtZW1iZXJzXGMKLVwmIG9mIHRoZSBhcmNoaXZlKS4KLQotVGhlIG9yaWdpbmFsIGZpbGVzJyBjb250ZW50cywgbW9kZSAocGVybWlzc2lvbnMpLCB0aW1lc3RhbXAsIG93bmVyLCBhbmQKLWdyb3VwIGFyZSBwcmVzZXJ2ZWQgaW4gdGhlIGFyY2hpdmUsIGFuZCBtYXkgYmUgcmVjb25zdGl0dXRlZCBvbgotZXh0cmFjdGlvbi4gIAotCi1HTlUgXGMKLS5CIGFyXGMKLVwmIGNhbiBtYWludGFpbiBhcmNoaXZlcyB3aG9zZSBtZW1iZXJzIGhhdmUgbmFtZXMgb2YgYW55Ci1sZW5ndGg7IGhvd2V2ZXIsIGRlcGVuZGluZyBvbiBob3cgXGMKLS5CIGFyXGMKLVwmIGlzIGNvbmZpZ3VyZWQgb24geW91cgotc3lzdGVtLCBhIGxpbWl0IG9uIG1lbWJlci1uYW1lIGxlbmd0aCBtYXkgYmUgaW1wb3NlZCAoZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggYXJjaGl2ZSBmb3JtYXRzIG1haW50YWluZWQgd2l0aCBvdGhlciB0b29scykuICBJZiBpdCBleGlzdHMsIHRoZQotbGltaXQgaXMgb2Z0ZW4gMTUgY2hhcmFjdGVycyAodHlwaWNhbCBvZiBmb3JtYXRzIHJlbGF0ZWQgdG8gYS5vdXQpIG9yIDE2Ci1jaGFyYWN0ZXJzICh0eXBpY2FsIG9mIGZvcm1hdHMgcmVsYXRlZCB0byBjb2ZmKS4KLQotXGMKLS5CIGFyXGMKLVwmIGlzIGNvbnNpZGVyZWQgYSBiaW5hcnkgdXRpbGl0eSBiZWNhdXNlIGFyY2hpdmVzIG9mIHRoaXMgc29ydAotYXJlIG1vc3Qgb2Z0ZW4gdXNlZCBhcyBcYwotLkkgbGlicmFyaWVzXGMKLVwmIGhvbGRpbmcgY29tbW9ubHkgbmVlZGVkCi1zdWJyb3V0aW5lcy4KLQotXGMKLS5CIGFyXGMKLVwmIHdpbGwgY3JlYXRlIGFuIGluZGV4IHRvIHRoZSBzeW1ib2xzIGRlZmluZWQgaW4gcmVsb2NhdGFibGUKLW9iamVjdCBtb2R1bGVzIGluIHRoZSBhcmNoaXZlIHdoZW4geW91IHNwZWNpZnkgdGhlIG1vZGlmaWVyIGBcfFxjCi0uQiBzXGMKLVx8Jy4KLU9uY2UgY3JlYXRlZCwgdGhpcyBpbmRleCBpcyB1cGRhdGVkIGluIHRoZSBhcmNoaXZlIHdoZW5ldmVyIFxjCi0uQiBhclxjCi1cJgotbWFrZXMgYSBjaGFuZ2UgdG8gaXRzIGNvbnRlbnRzIChzYXZlIGZvciB0aGUgYFx8XGMKLS5CIHFcYwotXHwnIHVwZGF0ZSBvcGVyYXRpb24pLgotQW4gYXJjaGl2ZSB3aXRoIHN1Y2ggYW4gaW5kZXggc3BlZWRzIHVwIGxpbmtpbmcgdG8gdGhlIGxpYnJhcnksIGFuZAotYWxsb3dzIHJvdXRpbmVzIGluIHRoZSBsaWJyYXJ5IHRvIGNhbGwgZWFjaCBvdGhlciB3aXRob3V0IHJlZ2FyZCB0bwotdGhlaXIgcGxhY2VtZW50IGluIHRoZSBhcmNoaXZlLgotCi1Zb3UgbWF5IHVzZSBgXHxcYwotLkIgbm0gXC1zXGMKLVx8JyBvciBgXHxcYwotLkIgbm0gXC1cLXByaW50XC1hcm1hcFxjCi1cfCcgdG8gbGlzdCB0aGlzIGluZGV4Ci10YWJsZS4gIElmIGFuIGFyY2hpdmUgbGFja3MgdGhlIHRhYmxlLCBhbm90aGVyIGZvcm0gb2YgXGMKLS5CIGFyXGMKLVwmIGNhbGxlZAotXGMKLS5CIHJhbmxpYlxjCi1cJiBjYW4gYmUgdXNlZCB0byBhZGQganVzdCB0aGUgdGFibGUuCi0KLVxjCi0uQiBhclxjCi1cJiBpbnNpc3RzIG9uIGF0IGxlYXN0IHR3byBhcmd1bWVudHMgdG8gZXhlY3V0ZTogb25lCi1rZXlsZXR0ZXIgc3BlY2lmeWluZyB0aGUgXGMKLS5JIG9wZXJhdGlvblxjCi1cJiAob3B0aW9uYWxseSBhY2NvbXBhbmllZCBieSBvdGhlcgota2V5bGV0dGVycyBzcGVjaWZ5aW5nIFxjCi0uSSBtb2RpZmllcnNcYwotXCYpLCBhbmQgdGhlIGFyY2hpdmUgbmFtZSB0byBhY3Qgb24uCi0KLU1vc3Qgb3BlcmF0aW9ucyBjYW4gYWxzbyBhY2NlcHQgZnVydGhlciBcYwotLkkgZmlsZXNcYwotXCYgYXJndW1lbnRzLAotc3BlY2lmeWluZyBwYXJ0aWN1bGFyIGZpbGVzIHRvIG9wZXJhdGUgb24uCi0KLS5TSCBPUFRJT05TCi1HTlUgXGMKLS5CIGFyXGMKLVwmIGFsbG93cyB5b3UgdG8gbWl4IHRoZSBvcGVyYXRpb24gY29kZSBcYwotLkkgcFxjCi1cJiBhbmQgbW9kaWZpZXIKLWZsYWdzIFxjCi0uSSBtb2RcYwotXCYgaW4gYW55IG9yZGVyLCB3aXRoaW4gdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudC4KLQotSWYgeW91IHdpc2gsIHlvdSBtYXkgYmVnaW4gdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudCB3aXRoIGEKLWRhc2guCi0KLVRoZSBcYwotLkkgcFxjCi1cJiBrZXlsZXR0ZXIgc3BlY2lmaWVzIHdoYXQgb3BlcmF0aW9uIHRvIGV4ZWN1dGU7IGl0IG1heSBiZQotYW55IG9mIHRoZSBmb2xsb3dpbmcsIGJ1dCB5b3UgbXVzdCBzcGVjaWZ5IG9ubHkgb25lIG9mIHRoZW06Ci0KLS5UUAotLkIgZAotXGMKLS5JIERlbGV0ZVxjCi1cJiBtb2R1bGVzIGZyb20gdGhlIGFyY2hpdmUuICBTcGVjaWZ5IHRoZSBuYW1lcyBvZiBtb2R1bGVzIHRvCi1iZSBkZWxldGVkIGFzIFxjCi0uSSBmaWxlc1xjCi1cJjsgdGhlIGFyY2hpdmUgaXMgdW50b3VjaGVkIGlmIHlvdQotc3BlY2lmeSBubyBmaWxlcyB0byBkZWxldGUuCi0KLUlmIHlvdSBzcGVjaWZ5IHRoZSBgXHxcYwotLkIgdlxjCi1cfCcgbW9kaWZpZXIsIFxjCi0uQiBhclxjCi1cJiB3aWxsIGxpc3QgZWFjaCBtb2R1bGUKLWFzIGl0IGlzIGRlbGV0ZWQuCi0KLS5UUAotLkIgbQotVXNlIHRoaXMgb3BlcmF0aW9uIHRvIFxjCi0uSSBtb3ZlXGMKLVwmIG1lbWJlcnMgaW4gYW4gYXJjaGl2ZS4KLQotVGhlIG9yZGVyaW5nIG9mIG1lbWJlcnMgaW4gYW4gYXJjaGl2ZSBjYW4gbWFrZSBhIGRpZmZlcmVuY2UgaW4gaG93Ci1wcm9ncmFtcyBhcmUgbGlua2VkIHVzaW5nIHRoZSBsaWJyYXJ5LCBpZiBhIHN5bWJvbCBpcyBkZWZpbmVkIGluIG1vcmUKLXRoYW4gb25lIG1lbWJlci4gIAotCi1JZiBubyBtb2RpZmllcnMgYXJlIHVzZWQgd2l0aCBcYwotLkIgbVxjCi1cJiwgYW55IG1lbWJlcnMgeW91IG5hbWUgaW4gdGhlCi1cYwotLkkgZmlsZXNcYwotXCYgYXJndW1lbnRzIGFyZSBtb3ZlZCB0byB0aGUgXGMKLS5JIGVuZFxjCi1cJiBvZiB0aGUgYXJjaGl2ZTsKLXlvdSBjYW4gdXNlIHRoZSBgXHxcYwotLkIgYVxjCi1cfCcsIGBcfFxjCi0uQiBiXGMKLVx8Jywgb3IgYFx8XGMKLS5CIGlcYwotXHwnIG1vZGlmaWVycyB0byBtb3ZlIHRoZW0gdG8gYQotc3BlY2lmaWVkIHBsYWNlIGluc3RlYWQuCi0KLS5UUAotLkIgcAotXGMKLS5JIFByaW50XGMKLVwmIHRoZSBzcGVjaWZpZWQgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZSwgdG8gdGhlIHN0YW5kYXJkCi1vdXRwdXQgZmlsZS4gIElmIHRoZSBgXHxcYwotLkIgdlxjCi1cfCcgbW9kaWZpZXIgaXMgc3BlY2lmaWVkLCBzaG93IHRoZSBtZW1iZXIKLW5hbWUgYmVmb3JlIGNvcHlpbmcgaXRzIGNvbnRlbnRzIHRvIHN0YW5kYXJkIG91dHB1dC4KLQotSWYgeW91IHNwZWNpZnkgbm8gXGMKLS5JIGZpbGVzXGMKLVwmLCBhbGwgdGhlIGZpbGVzIGluIHRoZSBhcmNoaXZlIGFyZSBwcmludGVkLgotCi0uVFAKLS5CIHEKLVxjCi0uSSBRdWljayBhcHBlbmRcYwotXCY7IGFkZCBcYwotLkkgZmlsZXNcYwotXCYgdG8gdGhlIGVuZCBvZiBcYwotLkkgYXJjaGl2ZVxjCi1cJiwKLXdpdGhvdXQgY2hlY2tpbmcgZm9yIHJlcGxhY2VtZW50LiAgCi0KLVRoZSBtb2RpZmllcnMgYFx8XGMKLS5CIGFcYwotXHwnLCBgXHxcYwotLkIgYlxjCi1cfCcsIGFuZCBgXHxcYwotLkIgaVxjCi1cfCcgZG8gXGMKLS5JIG5vdFxjCi1cJiBhZmZlY3QgdGhpcwotb3BlcmF0aW9uOyBuZXcgbWVtYmVycyBhcmUgYWx3YXlzIHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLgotCi1UaGUgbW9kaWZpZXIgYFx8XGMKLS5CIHZcYwotXHwnIG1ha2VzIFxjCi0uQiBhclxjCi1cJiBsaXN0IGVhY2ggZmlsZSBhcyBpdCBpcyBhcHBlbmRlZC4KLQotU2luY2UgdGhlIHBvaW50IG9mIHRoaXMgb3BlcmF0aW9uIGlzIHNwZWVkLCB0aGUgYXJjaGl2ZSdzIHN5bWJvbCB0YWJsZQotaW5kZXggaXMgbm90IHVwZGF0ZWQsIGV2ZW4gaWYgaXQgYWxyZWFkeSBleGlzdGVkOyB5b3UgY2FuIHVzZSBgXHxcYwotLkIgYXIgc1xjCi1cfCcgb3IKLVxjCi0uQiByYW5saWJcYwotXCYgZXhwbGljaXRseSB0byB1cGRhdGUgdGhlIHN5bWJvbCB0YWJsZSBpbmRleC4KLQotSG93ZXZlciwgdG9vIG1hbnkgZGlmZmVyZW50IHN5c3RlbXMgYXNzdW1lIHF1aWNrIGFwcGVuZCByZWJ1aWxkcyB0aGUKLWluZGV4LCBzbyBHTlUKLS5CIGFyCi1pbXBsZW1lbnRzIGBcfFxjCi0uQiBxXGMKLVx8JyBhcyBhIHN5bm9ueW0gZm9yIGBcfFxjCi0uQiByXGMKLVx8Jy4KLQotLlRQCi0uQiByCi1JbnNlcnQgXGMKLS5JIGZpbGVzXGMKLVwmIGludG8gXGMKLS5JIGFyY2hpdmVcYwotXCYgKHdpdGggXGMKLS5JIHJlcGxhY2VtZW50XGMKLVwmKS4gVGhpcwotb3BlcmF0aW9uIGRpZmZlcnMgZnJvbSBgXHxcYwotLkIgcVxjCi1cfCcgaW4gdGhhdCBhbnkgcHJldmlvdXNseSBleGlzdGluZyBtZW1iZXJzCi1hcmUgZGVsZXRlZCBpZiB0aGVpciBuYW1lcyBtYXRjaCB0aG9zZSBiZWluZyBhZGRlZC4KLQotSWYgb25lIG9mIHRoZSBmaWxlcyBuYW1lZCBpbiBcYwotLkkgZmlsZXNcYwotXCYgZG9lc24ndCBleGlzdCwgXGMKLS5CIGFyXGMKLVwmCi1kaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlLCBhbmQgbGVhdmVzIHVuZGlzdHVyYmVkIGFueSBleGlzdGluZyBtZW1iZXJzCi1vZiB0aGUgYXJjaGl2ZSBtYXRjaGluZyB0aGF0IG5hbWUuCi0KLUJ5IGRlZmF1bHQsIG5ldyBtZW1iZXJzIGFyZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlOyBidXQgeW91IG1heQotdXNlIG9uZSBvZiB0aGUgbW9kaWZpZXJzIGBcfFxjCi0uQiBhXGMKLVx8JywgYFx8XGMKLS5CIGJcYwotXHwnLCBvciBgXHxcYwotLkIgaVxjCi1cfCcgdG8gcmVxdWVzdAotcGxhY2VtZW50IHJlbGF0aXZlIHRvIHNvbWUgZXhpc3RpbmcgbWVtYmVyLgotCi1UaGUgbW9kaWZpZXIgYFx8XGMKLS5CIHZcYwotXHwnIHVzZWQgd2l0aCB0aGlzIG9wZXJhdGlvbiBlbGljaXRzIGEgbGluZSBvZgotb3V0cHV0IGZvciBlYWNoIGZpbGUgaW5zZXJ0ZWQsIGFsb25nIHdpdGggb25lIG9mIHRoZSBsZXR0ZXJzIGBcfFxjCi0uQiBhXGMKLVx8JyBvcgotYFx8XGMKLS5CIHJcYwotXHwnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGZpbGUgd2FzIGFwcGVuZGVkIChubyBvbGQgbWVtYmVyCi1kZWxldGVkKSBvciByZXBsYWNlZC4KLQotLlRQCi0uQiB0Ci1EaXNwbGF5IGEgXGMKLS5JIHRhYmxlXGMKLVwmIGxpc3RpbmcgdGhlIGNvbnRlbnRzIG9mIFxjCi0uSSBhcmNoaXZlXGMKLVwmLCBvciB0aG9zZQotb2YgdGhlIGZpbGVzIGxpc3RlZCBpbiBcYwotLkkgZmlsZXNcYwotXCYgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUKLWFyY2hpdmUuICBOb3JtYWxseSBvbmx5IHRoZSBtZW1iZXIgbmFtZSBpcyBzaG93bjsgaWYgeW91IGFsc28gd2FudCB0bwotc2VlIHRoZSBtb2RlcyAocGVybWlzc2lvbnMpLCB0aW1lc3RhbXAsIG93bmVyLCBncm91cCwgYW5kIHNpemUsIHlvdSBjYW4KLXJlcXVlc3QgdGhhdCBieSBhbHNvIHNwZWNpZnlpbmcgdGhlIGBcfFxjCi0uQiB2XGMKLVx8JyBtb2RpZmllci4KLQotSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueSBcYwotLkkgZmlsZXNcYwotXCYsIGFsbCBmaWxlcyBpbiB0aGUgYXJjaGl2ZQotYXJlIGxpc3RlZC4KLQotSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSAoc2F5LCBgXHxcYwotLkIgZmllXGMKLVx8JykgaW4KLWFuIGFyY2hpdmUgKHNheSBgXHxcYwotLkIgYi5hXGMKLVx8JyksIGBcfFxjCi0uQiBhciB0IGIuYSBmaWVcYwotXHwnIHdpbGwgbGlzdCBvbmx5IHRoZQotZmlyc3QgaW5zdGFuY2U7IHRvIHNlZSB0aGVtIGFsbCwgeW91IG11c3QgYXNrIGZvciBhIGNvbXBsZXRlCi1saXN0aW5nXChlbVwmaW4gb3VyIGV4YW1wbGUsIGBcfFxjCi0uQiBhciB0IGIuYVxjCi1cfCcuCi0KLS5UUAotLkIgeAotXGMKLS5JIEV4dHJhY3RcYwotXCYgbWVtYmVycyAobmFtZWQgXGMKLS5JIGZpbGVzXGMKLVwmKSBmcm9tIHRoZSBhcmNoaXZlLiAgWW91IGNhbgotdXNlIHRoZSBgXHxcYwotLkIgdlxjCi1cfCcgbW9kaWZpZXIgd2l0aCB0aGlzIG9wZXJhdGlvbiwgdG8gcmVxdWVzdCB0aGF0Ci1cYwotLkIgYXJcYwotXCYgbGlzdCBlYWNoIG5hbWUgYXMgaXQgZXh0cmFjdHMgaXQuCi0KLUlmIHlvdSBkbyBub3Qgc3BlY2lmeSBhbnkgXGMKLS5JIGZpbGVzXGMKLVwmLCBhbGwgZmlsZXMgaW4gdGhlIGFyY2hpdmUKLWFyZSBleHRyYWN0ZWQuCi0KLS5QUAotCi1BIG51bWJlciBvZiBtb2RpZmllcnMgKFxjCi0uSSBtb2RcYwotXCYpIG1heSBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIFxjCi0uSSBwXGMKLVwmCi1rZXlsZXR0ZXIsIHRvIHNwZWNpZnkgdmFyaWF0aW9ucyBvbiBhbiBvcGVyYXRpb24ncyBiZWhhdmlvcjoKLQotLlRQCi0uQiBhCi1BZGQgbmV3IGZpbGVzIFxjCi0uSSBhZnRlclxjCi1cJiBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCi1hcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgXGMKLS5CIGFcYwotXCYsIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKLW1lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIFxjCi0uSSBtZW1iZXJuYW1lXGMKLVwmIGFyZ3VtZW50LCBiZWZvcmUgdGhlCi1cYwotLkkgYXJjaGl2ZVxjCi1cJiBzcGVjaWZpY2F0aW9uLgotCi0uVFAKLS5CIGIKLUFkZCBuZXcgZmlsZXMgXGMKLS5JIGJlZm9yZVxjCi1cJiBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCi1hcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgXGMKLS5CIGJcYwotXCYsIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKLW1lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIFxjCi0uSSBtZW1iZXJuYW1lXGMKLVwmIGFyZ3VtZW50LCBiZWZvcmUgdGhlCi1cYwotLkkgYXJjaGl2ZVxjCi1cJiBzcGVjaWZpY2F0aW9uLiAgKHNhbWUgYXMgYFx8XGMKLS5CIGlcYwotXHwnKS4KLQotLlRQCi0uQiBjCi1cYwotLkkgQ3JlYXRlXGMKLVwmIHRoZSBhcmNoaXZlLiAgVGhlIHNwZWNpZmllZCBcYwotLkkgYXJjaGl2ZVxjCi1cJiBpcyBhbHdheXMKLWNyZWF0ZWQgaWYgaXQgZGlkbid0IGV4aXN0LCB3aGVuIHlvdSByZXF1ZXN0IGFuIHVwZGF0ZS4gIEJ1dCBhIHdhcm5pbmcgaXMKLWlzc3VlZCB1bmxlc3MgeW91IHNwZWNpZnkgaW4gYWR2YW5jZSB0aGF0IHlvdSBleHBlY3QgdG8gY3JlYXRlIGl0LCBieQotdXNpbmcgdGhpcyBtb2RpZmllci4KLQotLlRQCi0uQiBmCi1UcnVuY2F0ZSBuYW1lcyBpbiB0aGUgYXJjaGl2ZS4gIAotLkIgYXIKLXdpbGwgbm9ybWFsbHkgcGVybWl0IGZpbGUgbmFtZXMgb2YgYW55IGxlbmd0aC4gIFRoaXMgd2lsbCBjYXVzZSBpdCB0bwotY3JlYXRlIGFyY2hpdmVzIHdoaWNoIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBuYXRpdmUgCi0uQiBhcgotcHJvZ3JhbSBvbiBzb21lIHN5c3RlbXMuICBJZiB0aGlzIGlzIGEgY29uY2VybiwgdGhlIAotLkIgZgotbW9kaWZpZXIgbWF5IGJlIHVzZWQgdG8gdHJ1bmNhdGUgZmlsZSBuYW1lcyB3aGVuIHB1dHRpbmcgdGhlbSBpbiB0aGUKLWFyY2hpdmUuCi0KLS5UUAotLkIgaQotSW5zZXJ0IG5ldyBmaWxlcyBcYwotLkkgYmVmb3JlXGMKLVwmIGFuIGV4aXN0aW5nIG1lbWJlciBvZiB0aGUKLWFyY2hpdmUuICBJZiB5b3UgdXNlIHRoZSBtb2RpZmllciBcYwotLkIgaVxjCi1cJiwgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgYXJjaGl2ZQotbWVtYmVyIG11c3QgYmUgcHJlc2VudCBhcyB0aGUgXGMKLS5JIG1lbWJlcm5hbWVcYwotXCYgYXJndW1lbnQsIGJlZm9yZSB0aGUKLVxjCi0uSSBhcmNoaXZlXGMKLVwmIHNwZWNpZmljYXRpb24uICAoc2FtZSBhcyBgXHxcYwotLkIgYlxjCi1cfCcpLgotCi0uVFAKLS5CIGwKLVRoaXMgbW9kaWZpZXIgaXMgYWNjZXB0ZWQgYnV0IG5vdCB1c2VkLgotCi0uVFAKLS5CIG8KLVByZXNlcnZlIHRoZSBcYwotLkkgb3JpZ2luYWxcYwotXCYgZGF0ZXMgb2YgbWVtYmVycyB3aGVuIGV4dHJhY3RpbmcgdGhlbS4gIElmCi15b3UgZG8gbm90IHNwZWNpZnkgdGhpcyBtb2RpZmllciwgZmlsZXMgZXh0cmFjdGVkIGZyb20gdGhlIGFyY2hpdmUKLXdpbGwgYmUgc3RhbXBlZCB3aXRoIHRoZSB0aW1lIG9mIGV4dHJhY3Rpb24uCi0KLS5UUAotLkIgcwotV3JpdGUgYW4gb2JqZWN0LWZpbGUgaW5kZXggaW50byB0aGUgYXJjaGl2ZSwgb3IgdXBkYXRlIGFuIGV4aXN0aW5nIG9uZSwKLWV2ZW4gaWYgbm8gb3RoZXIgY2hhbmdlIGlzIG1hZGUgdG8gdGhlIGFyY2hpdmUuICBZb3UgbWF5IHVzZSB0aGlzIG1vZGlmaWVyCi1mbGFnIGVpdGhlciB3aXRoIGFueSBvcGVyYXRpb24sIG9yIGFsb25lLiAgUnVubmluZyBgXHxcYwotLkIgYXIgc1xjCi1cfCcgb24gYW4KLWFyY2hpdmUgaXMgZXF1aXZhbGVudCB0byBydW5uaW5nIGBcfFxjCi0uQiByYW5saWJcYwotXHwnIG9uIGl0LgotCi0uVFAKLS5CIFMKLURvIG5vdCBnZW5lcmF0ZSBhbiBhcmNoaXZlIHN5bWJvbCB0YWJsZS4gIFRoaXMgY2FuIHNwZWVkIHVwIGJ1aWxkaW5nIGEKLWxhcmdlIGxpYnJhcnkgaW4gc2V2ZXJhbCBzdGVwcy4gIFRoZSByZXN1bHRpbmcgYXJjaGl2ZSBjYW4gbm90IGJlIHVzZWQKLXdpdGggdGhlIGxpbmtlci4gIEluIG9yZGVyIHRvIGJ1aWxkIGEgc3ltYm9sIHRhYmxlLCB5b3UgbXVzdCBvbWl0IHRoZQotYFx8XGMKLS5CIFNcYwotXHwnIG1vZGlmaWVyIG9uIHRoZSBsYXN0IGV4ZWN1dGlvbiBvZiBgXHxcYwotLkIgYXJcYwotXHwnLCBvciB5b3UgbXVzdCBydW4gYFx8XGMKLS5CIHJhbmxpYlxjCi1cfCcgb24gdGhlIGFyY2hpdmUuCi0KLS5UUAotLkIgdQotTm9ybWFsbHksIFxjCi0uQiBhciByXGMKLVwmLlx8Llx8LiBpbnNlcnRzIGFsbCBmaWxlcwotbGlzdGVkIGludG8gdGhlIGFyY2hpdmUuICBJZiB5b3Ugd291bGQgbGlrZSB0byBpbnNlcnQgXGMKLS5JIG9ubHlcYwotXCYgdGhvc2UKLW9mIHRoZSBmaWxlcyB5b3UgbGlzdCB0aGF0IGFyZSBuZXdlciB0aGFuIGV4aXN0aW5nIG1lbWJlcnMgb2YgdGhlIHNhbWUKLW5hbWVzLCB1c2UgdGhpcyBtb2RpZmllci4gIFRoZSBgXHxcYwotLkIgdVxjCi1cfCcgbW9kaWZpZXIgaXMgYWxsb3dlZCBvbmx5IGZvciB0aGUKLW9wZXJhdGlvbiBgXHxcYwotLkIgclxjCi1cfCcgKHJlcGxhY2UpLiAgSW4gcGFydGljdWxhciwgdGhlIGNvbWJpbmF0aW9uIGBcfFxjCi0uQiBxdVxjCi1cfCcgaXMKLW5vdCBhbGxvd2VkLCBzaW5jZSBjaGVja2luZyB0aGUgdGltZXN0YW1wcyB3b3VsZCBsb3NlIGFueSBzcGVlZAotYWR2YW50YWdlIGZyb20gdGhlIG9wZXJhdGlvbiBgXHxcYwotLkIgcVxjCi1cfCcuCi0KLS5UUAotLkIgdgotVGhpcyBtb2RpZmllciByZXF1ZXN0cyB0aGUgXGMKLS5JIHZlcmJvc2VcYwotXCYgdmVyc2lvbiBvZiBhbiBvcGVyYXRpb24uICBNYW55Ci1vcGVyYXRpb25zIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgc3VjaCBhcyBmaWxlbmFtZXMgcHJvY2Vzc2VkLAotd2hlbiB0aGUgbW9kaWZpZXIgYFx8XGMKLS5CIHZcYwotXHwnIGlzIGFwcGVuZGVkLgotCi0uVFAKLS5CIFYKLVRoaXMgbW9kaWZpZXIgc2hvd3MgdGhlIHZlcnNpb24gbnVtYmVyIG9mCi0uQlIgYXIgLgotCi0uUFAKLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIgotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLSwgUm9sYW5kIEguIFBlc2NoIChPY3RvYmVyIDE5OTEpLgotLkJSIG5tICggMSApXGMKLVwmLAotLkJSIHJhbmxpYiAoIDEgKVxjCi1cJi4KLQotLlNIIENPUFlJTkcKLUNvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYXIuYyBiL2JpbnV0aWxzL2FyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTFlZjcuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMzggKzAsMCBAQAotLyogYXIuYyAtIEFyY2hpdmUgbW9kaWZ5IGFuZCBleHRyYWN0LgotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotLyoKLSAgIEJ1Z3M6IHNob3VsZCB1c2UgZ2V0b3B0IHRoZSB3YXkgdGFyIGRvZXMgKGNvbXBsZXRlIHcvb3B0aW9uYWwgLSkgYW5kCi0gICBzaG91bGQgaGF2ZSBsb25nIG9wdGlvbnMgdG9vLiBHTlUgYXIgdXNlZCB0byBjaGVjayBmaWxlIGFnYWluc3QgZmlsZXN5c3RlbQotICAgaW4gcXVpY2tfdXBkYXRlIGFuZCByZXBsYWNlIG9wZXJhdGlvbnMgKHdvdWxkIGNoZWNrIG10aW1lKS4gRG9lc24ndCB3YXJuCi0gICB3aGVuIG5hbWUgdHJ1bmNhdGVkLiBObyB3YXkgdG8gc3BlY2lmeSBwb3NfZW5kLiBFcnJvciBtZXNzYWdlcyBzaG91bGQgYmUKLSAgIG1vcmUgY29uc2lzdGFudC4KLSovCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAicHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYXJzdXAuaCIKLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWZkZWYgX19HTzMyX19fCi0jZGVmaW5lIEVYVF9OQU1FX0xFTiAzCQkvKiBidWZmbGVuIG9mIGFkZGl0aW9uIHRvIG5hbWUgaWYgaXQncyBNUy1ET1MgKi8KLSNlbHNlCi0jZGVmaW5lIEVYVF9OQU1FX0xFTiA2CQkvKiBkaXR0byBmb3IgKk5JWCAqLwotI2VuZGlmCi0KLSNkZWZpbmUgQlVGU0laRSA4MTkyCi0KLS8qIEtsdWRnZSBkZWNsYXJhdGlvbiBmcm9tIEJGRCEgIFRoaXMgaXMgdWdseSEgIEZJWE1FISAgWFhYICovCi0KLXN0cnVjdCBhcl9oZHIgKgotICBiZmRfc3BlY2lhbF91bmRvY3VtZW50ZWRfZ2x1ZSBQQVJBTVMgKChiZmQgKiBhYmZkLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotCi0vKiBTdGF0aWMgZGVjbGFyYXRpb25zICovCi0KLXN0YXRpYyB2b2lkCi1tcmlfZW11bCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW5vcm1hbGl6ZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZW1vdmVfb3V0cHV0IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHZvaWQKLW1hcF9vdmVyX21lbWJlcnMgUEFSQU1TICgoYmZkICosIHZvaWQgKCopKGJmZCAqKSwgY2hhciAqKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9jb250ZW50cyBQQVJBTVMgKChiZmQgKiBtZW1iZXIpKTsKLQotc3RhdGljIHZvaWQKLWRlbGV0ZV9tZW1iZXJzIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqZmlsZXNfdG9fZGVsZXRlKSk7Ci0KLSNpZiAwCi1zdGF0aWMgdm9pZAotZG9fcXVpY2tfYXBwZW5kIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyY2hpdmVfZmlsZW5hbWUsCi0JCQkgY2hhciAqKmZpbGVzX3RvX2FwcGVuZCkpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1tb3ZlX21lbWJlcnMgUEFSQU1TICgoYmZkICosIGNoYXIgKipmaWxlc190b19tb3ZlKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZXBsYWNlX21lbWJlcnMgUEFSQU1TICgoYmZkICosIGNoYXIgKipmaWxlc190b19yZXBsYWNlLCBib29sZWFuIHF1aWNrKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9kZXNjciBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9hcmNoaXZlIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yYW5saWJfb25seSBQQVJBTVMgKChjb25zdCBjaGFyICphcmNobmFtZSkpOwotCi1zdGF0aWMgdm9pZAotcmFubGliX3RvdWNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyY2huYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSBQQVJBTVMgKChpbnQpKTsKLQwKLS8qKiBHbG9iYWxzIGFuZCBmbGFncyAqLwotCi1pbnQgbXJpX21vZGU7Ci0KLS8qIFRoaXMgZmxhZyBkaXN0aW5ndWlzaGVzIGJldHdlZW4gYXIgYW5kIHJhbmxpYjoKLSAgIDEgbWVhbnMgdGhpcyBpcyAncmFubGliJzsgMCBtZWFucyB0aGlzIGlzICdhcicuCi0gICAtMSBtZWFucyBpZiB3ZSBzaG91bGQgdXNlIGFyZ3ZbMF0gdG8gZGVjaWRlLiAgKi8KLWV4dGVybiBpbnQgaXNfcmFubGliOwotCi0vKiBOb256ZXJvIG1lYW5zIGRvbid0IHdhcm4gYWJvdXQgY3JlYXRpbmcgdGhlIGFyY2hpdmUgZmlsZSBpZiBuZWNlc3NhcnkuICAqLwotaW50IHNpbGVudF9jcmVhdGUgPSAwOwotCi0vKiBOb256ZXJvIG1lYW5zIGRlc2NyaWJlIGVhY2ggYWN0aW9uIHBlcmZvcm1lZC4gICovCi1pbnQgdmVyYm9zZSA9IDA7Ci0KLS8qIE5vbnplcm8gbWVhbnMgcHJlc2VydmUgZGF0ZXMgb2YgbWVtYmVycyB3aGVuIGV4dHJhY3RpbmcgdGhlbS4gICovCi1pbnQgcHJlc2VydmVfZGF0ZXMgPSAwOwotCi0vKiBOb256ZXJvIG1lYW5zIGRvbid0IHJlcGxhY2UgZXhpc3RpbmcgbWVtYmVycyB3aG9zZSBkYXRlcyBhcmUgbW9yZSByZWNlbnQKLSAgIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgZmlsZXMuICAqLwotaW50IG5ld2VyX29ubHkgPSAwOwotCi0vKiBDb250cm9scyB0aGUgd3JpdGluZyBvZiBhbiBhcmNoaXZlIHN5bWJvbCB0YWJsZSAoaW4gQlNEOiBhIF9fLlNZTURFRgotICAgbWVtYmVyKS4gIC0xIG1lYW5zIHdlJ3ZlIGJlZW4gZXhwbGljaXRseSBhc2tlZCB0byBub3Qgd3JpdGUgYSBzeW1ib2wgdGFibGU7Ci0gICArMSBtZWFucyB3ZSd2ZSBiZWVuIGV4cGxpY3RseSBhc2tlZCB0byB3cml0ZSBpdDsKLSAgIDAgaXMgdGhlIGRlZmF1bHQuCi0gICBUcmFkaXRpb25hbGx5LCB0aGUgZGVmYXVsdCBpbiBCU0QgaGFzIGJlZW4gdG8gbm90IHdyaXRlIHRoZSB0YWJsZS4KLSAgIEhvd2V2ZXIsIGZvciBQT1NJWC4yIGNvbXBsaWFuY2UgdGhlIGRlZmF1bHQgaXMgbm93IHRvIHdyaXRlIGEgc3ltYm9sIHRhYmxlCi0gICBpZiBhbnkgb2YgdGhlIG1lbWJlcnMgYXJlIG9iamVjdCBmaWxlcy4gICovCi1pbnQgd3JpdGVfYXJtYXAgPSAwOwotCi0vKiBOb256ZXJvIG1lYW5zIGl0J3MgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgbWVtYmVyOyBwb3NpdGlvbiBuZXcgb3IgbW92ZWQKLSAgIGZpbGVzIHdpdGggcmVzcGVjdCB0byB0aGlzIG9uZS4gICovCi1jaGFyICpwb3NuYW1lID0gTlVMTDsKLQotLyogU2V6IGhvdyB0byB1c2UgYHBvc25hbWUnOiBwb3NfYmVmb3JlIG1lYW5zIHBvc2l0aW9uIGJlZm9yZSB0aGF0IG1lbWJlci4KLSAgIHBvc19hZnRlciBtZWFucyBwb3NpdGlvbiBhZnRlciB0aGF0IG1lbWJlci4gcG9zX2VuZCBtZWFucyBhbHdheXMgYXQgZW5kLgotICAgcG9zX2RlZmF1bHQgbWVhbnMgZGVmYXVsdCBhcHByb3ByaWF0ZWx5LiBGb3IgdGhlIGxhdHRlciB0d28sIGBwb3NuYW1lJwotICAgc2hvdWxkIGFsc28gYmUgemVyby4gICovCi1lbnVtIHBvcwotICB7Ci0gICAgcG9zX2RlZmF1bHQsIHBvc19iZWZvcmUsIHBvc19hZnRlciwgcG9zX2VuZAotICB9IHBvc3R5cGUgPSBwb3NfZGVmYXVsdDsKLQotc3RhdGljIGJmZCAqKgotZ2V0X3Bvc19iZmQgUEFSQU1TICgoYmZkICoqLCBlbnVtIHBvcywgY29uc3QgY2hhciAqKSk7Ci0KLS8qIFdoZXRoZXIgdG8gdHJ1bmNhdGUgbmFtZXMgb2YgZmlsZXMgc3RvcmVkIGluIHRoZSBhcmNoaXZlLiAgKi8KLXN0YXRpYyBib29sZWFuIGFyX3RydW5jYXRlID0gZmFsc2U7Ci0KLWludCBpbnRlcmFjdGl2ZSA9IDA7Ci0KLXN0YXRpYyB2b2lkCi1tcmlfZW11bCAoKQotewotICBpbnRlcmFjdGl2ZSA9IGlzYXR0eSAoZmlsZW5vIChzdGRpbikpOwotICB5eXBhcnNlICgpOwotfQotCi0vKiBJZiBDT1VOVCBpcyAwLCB0aGVuIEZVTkNUSU9OIGlzIGNhbGxlZCBvbmNlIG9uIGVhY2ggZW50cnkuICBJZiBub256ZXJvLAotICAgQ09VTlQgaXMgdGhlIGxlbmd0aCBvZiB0aGUgRklMRVMgY2hhaW47IEZVTkNUSU9OIGlzIGNhbGxlZCBvbiBlYWNoIGVudHJ5Ci0gICB3aG9zZSBuYW1lIG1hdGNoZXMgb25lIGluIEZJTEVTLiAgKi8KLQotc3RhdGljIHZvaWQKLW1hcF9vdmVyX21lbWJlcnMgKGFyY2gsIGZ1bmN0aW9uLCBmaWxlcywgY291bnQpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgdm9pZCAoKmZ1bmN0aW9uKSBQQVJBTVMgKChiZmQgKikpOwotICAgICBjaGFyICoqZmlsZXM7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgYmZkICpoZWFkOwotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIHsKLSAgICAgIGZvciAoaGVhZCA9IGFyY2gtPm5leHQ7IGhlYWQ7IGhlYWQgPSBoZWFkLT5uZXh0KQotCXsKLQkgIFBST0dSRVNTICgxKTsKLQkgIGZ1bmN0aW9uIChoZWFkKTsKLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAvKiBUaGlzIG1heSBhcHBlYXIgdG8gYmUgYSBiYXJvcXVlIHdheSBvZiBhY2NvbXBsaXNoaW5nIHdoYXQgd2Ugd2FudC4KLSAgICAgSG93ZXZlciB3ZSBoYXZlIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZmlsZW5hbWVzIGluIG9yZGVyIHRvIG5vdGljZSB3aGVyZQotICAgICBhIGZpbGVuYW1lIGlzIHJlcXVlc3RlZCBidXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFyY2hpdmUuICBEaXR0bwotICAgICBtYXBwaW5nIG92ZXIgZWFjaCBmaWxlIGVhY2ggdGltZSAtLSB3ZSB3YW50IHRvIGhhY2sgbXVsdGlwbGUKLSAgICAgcmVmZXJlbmNlcy4gICovCi0KLSAgZm9yICg7IGNvdW50ID4gMDsgZmlsZXMrKywgY291bnQtLSkKLSAgICB7Ci0gICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0KLSAgICAgIGZvciAoaGVhZCA9IGFyY2gtPm5leHQ7IGhlYWQ7IGhlYWQgPSBoZWFkLT5uZXh0KQotCXsKLQkgIFBST0dSRVNTICgxKTsKLQkgIGlmIChoZWFkLT5maWxlbmFtZSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogU29tZSBhcmNoaXZlIGZvcm1hdHMgZG9uJ3QgZ2V0IHRoZSBmaWxlbmFtZXMgZmlsbGVkIGluCi0JCSB1bnRpbCB0aGUgZWxlbWVudHMgYXJlIG9wZW5lZC4gICovCi0JICAgICAgc3RydWN0IHN0YXQgYnVmOwotCSAgICAgIGJmZF9zdGF0X2FyY2hfZWx0IChoZWFkLCAmYnVmKTsKLQkgICAgfQotCSAgaWYgKChoZWFkLT5maWxlbmFtZSAhPSBOVUxMKSAmJgotCSAgICAgICghc3RyY21wICgqZmlsZXMsIGhlYWQtPmZpbGVuYW1lKSkpCi0JICAgIHsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgICAgZnVuY3Rpb24gKGhlYWQpOwotCSAgICB9Ci0JfQotICAgICAgaWYgKCFmb3VuZCkKLQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCWZwcmludGYgKHN0ZGVyciwgXygibm8gZW50cnkgJXMgaW4gYXJjaGl2ZVxuIiksICpmaWxlcyk7Ci0gICAgfQotfQotDAotYm9vbGVhbiBvcGVyYXRpb25fYWx0ZXJzX2FyY2ggPSBmYWxzZTsKLQotc3RhdGljIHZvaWQKLXVzYWdlIChoZWxwKQotICAgICBpbnQgaGVscDsKLXsKLSAgRklMRSAqczsKLQotICBzID0gaGVscCA/IHN0ZG91dCA6IHN0ZGVycjsKLSAgCi0gIGlmICghIGlzX3JhbmxpYikKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAocywgXygiVXNhZ2U6ICVzIFstXXtkbXBxcnN0eH1bYWJjaWxvc1N1dlZdIFttZW1iZXItbmFtZV0gYXJjaGl2ZS1maWxlIGZpbGUuLi5cbiIpLCBwcm9ncmFtX25hbWUpOwotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHMsIF8oIiAgICAgICAlcyAtTSBbPG1yaS1zY3JpcHRdXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiBjb21tYW5kczpcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgZCAgICAgICAgICAgIC0gZGVsZXRlIGZpbGUocykgZnJvbSB0aGUgYXJjaGl2ZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBtW2FiXSAgICAgICAgLSBtb3ZlIGZpbGUocykgaW4gdGhlIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgcCAgICAgICAgICAgIC0gcHJpbnQgZmlsZShzKSBmb3VuZCBpbiB0aGUgYXJjaGl2ZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBxW2ZdICAgICAgICAgLSBxdWljayBhcHBlbmQgZmlsZShzKSB0byB0aGUgYXJjaGl2ZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICByW2FiXVtmXVt1XSAgLSByZXBsYWNlIGV4aXN0aW5nIG9yIGluc2VydCBuZXcgZmlsZShzKSBpbnRvIHRoZSBhcmNoaXZlXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIHQgICAgICAgICAgICAtIGRpc3BsYXkgY29udGVudHMgb2YgYXJjaGl2ZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICB4W29dICAgICAgICAgLSBleHRyYWN0IGZpbGUocykgZnJvbSB0aGUgYXJjaGl2ZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiIGNvbW1hbmQgc3BlY2lmaWMgbW9kaWZpZXJzOlxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbYV0gICAgICAgICAgLSBwdXQgZmlsZShzKSBhZnRlciBbbWVtYmVyLW5hbWVdXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtiXSAgICAgICAgICAtIHB1dCBmaWxlKHMpIGJlZm9yZSBbbWVtYmVyLW5hbWVdIChzYW1lIGFzIFtpXSlcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW2ZdICAgICAgICAgIC0gdHJ1bmNhdGUgaW5zZXJ0ZWQgZmlsZSBuYW1lc1xuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbb10gICAgICAgICAgLSBwcmVzZXJ2ZSBvcmlnaW5hbCBkYXRlc1xuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbdV0gICAgICAgICAgLSBvbmx5IHJlcGxhY2UgZmlsZXMgdGhhdCBhcmUgbmV3ZXIgdGhhbiBjdXJyZW50IGFyY2hpdmUgY29udGVudHNcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiBnZW5lcmljIG1vZGlmaWVyczpcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW2NdICAgICAgICAgIC0gZG8gbm90IHdhcm4gaWYgdGhlIGxpYnJhcnkgaGFkIHRvIGJlIGNyZWF0ZWRcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW3NdICAgICAgICAgIC0gY3JlYXRlIGFuIGFyY2hpdmUgaW5kZXggKGNmLiByYW5saWIpXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtTXSAgICAgICAgICAtIGRvIG5vdCBidWlsZCBhIHN5bWJvbCB0YWJsZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbdl0gICAgICAgICAgLSBiZSB2ZXJib3NlXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtWXSAgICAgICAgICAtIGRpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyXG4iKSk7Ci0gICAgfQotICBlbHNlCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmcHJpbnRmIChzLCBfKCJVc2FnZTogJXMgWy12Vl0gYXJjaGl2ZVxuIiksIHByb2dyYW1fbmFtZSk7Ci0KLSAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdGRlcnIpOwotCi0gIGlmIChoZWxwKQotICAgIGZwcmludGYgKHMsIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotCi0gIHhleGl0IChoZWxwID8gMCA6IDEpOwotfQotCi0vKiBOb3JtYWxpemUgYSBmaWxlIG5hbWUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgaW50byBhIGZpbGUKLSAgIG5hbWUgd2hpY2ggd2Ugd2lsbCB1c2UgaW4gYW4gYXJjaGl2ZS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW5vcm1hbGl6ZSAoZmlsZSwgYWJmZCkKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLQotICBmaWxlbmFtZSA9IHN0cnJjaHIgKGZpbGUsICcvJyk7Ci0gIGlmIChmaWxlbmFtZSAhPSAoY2hhciAqKSBOVUxMKQotICAgIGZpbGVuYW1lKys7Ci0gIGVsc2UKLSAgICBmaWxlbmFtZSA9IGZpbGU7Ci0KLSAgaWYgKGFyX3RydW5jYXRlCi0gICAgICAmJiBhYmZkICE9IE5VTEwKLSAgICAgICYmIHN0cmxlbiAoZmlsZW5hbWUpID4gYWJmZC0+eHZlYy0+YXJfbWF4X25hbWVsZW4pCi0gICAgewotICAgICAgY2hhciAqczsKLQotICAgICAgLyogU3BhY2UgbGVhay4gICovCi0gICAgICBzID0gKGNoYXIgKikgeG1hbGxvYyAoYWJmZC0+eHZlYy0+YXJfbWF4X25hbWVsZW4gKyAxKTsKLSAgICAgIG1lbWNweSAocywgZmlsZW5hbWUsIGFiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuKTsKLSAgICAgIHNbYWJmZC0+eHZlYy0+YXJfbWF4X25hbWVsZW5dID0gJ1wwJzsKLSAgICAgIGZpbGVuYW1lID0gczsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpbGVuYW1lOwotfQotCi0vKiBSZW1vdmUgYW55IG91dHB1dCBmaWxlLiAgVGhpcyBpcyBvbmx5IGNhbGxlZCB2aWEgeGF0ZXhpdC4gICovCi0KLXN0YXRpYyBjaGFyICpvdXRwdXRfZmlsZW5hbWUgPSBOVUxMOwotc3RhdGljIEZJTEUgKm91dHB1dF9maWxlID0gTlVMTDsKLXN0YXRpYyBiZmQgKm91dHB1dF9iZmQgPSBOVUxMOwotCi1zdGF0aWMgdm9pZAotcmVtb3ZlX291dHB1dCAoKQotewotICBpZiAob3V0cHV0X2ZpbGVuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCAmJiBvdXRwdXRfYmZkLT5pb3N0cmVhbSAhPSBOVUxMKQotCWZjbG9zZSAoKEZJTEUgKikgKG91dHB1dF9iZmQtPmlvc3RyZWFtKSk7Ci0gICAgICBpZiAob3V0cHV0X2ZpbGUgIT0gTlVMTCkKLQlmY2xvc2UgKG91dHB1dF9maWxlKTsKLSAgICAgIHVubGluayAob3V0cHV0X2ZpbGVuYW1lKTsKLSAgICB9Ci19Ci0KLS8qIFRoZSBvcHRpb24gcGFyc2luZyBzaG91bGQgYmUgaW4gaXRzIG93biBmdW5jdGlvbi4KLSAgIEl0IHdpbGwgYmUgd2hlbiBJIGhhdmUgZ2V0b3B0IHdvcmtpbmcuICAqLwotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgY2hhciAqYXJnX3B0cjsKLSAgY2hhciBjOwotICBlbnVtCi0gICAgewotICAgICAgbm9uZSA9IDAsIGRlbGV0ZSwgcmVwbGFjZSwgcHJpbnRfdGFibGUsCi0gICAgICBwcmludF9maWxlcywgZXh0cmFjdCwgbW92ZSwgcXVpY2tfYXBwZW5kCi0gICAgfSBvcGVyYXRpb24gPSBub25lOwotICBpbnQgYXJnX2luZGV4OwotICBjaGFyICoqZmlsZXM7Ci0gIGNoYXIgKmluYXJjaF9maWxlbmFtZTsKLSAgaW50IHNob3dfdmVyc2lvbjsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBpZiAoaXNfcmFubGliIDwgMCkKLSAgICB7Ci0gICAgICBjaGFyICp0ZW1wOwotCi0gICAgICB0ZW1wID0gc3RycmNociAocHJvZ3JhbV9uYW1lLCAnLycpOwotICAgICAgaWYgKHRlbXAgPT0gTlVMTCkKLQl0ZW1wID0gcHJvZ3JhbV9uYW1lOwotICAgICAgZWxzZQotCSsrdGVtcDsKLSAgICAgIGlmIChzdHJsZW4gKHRlbXApID49IDYKLQkgICYmIHN0cmNtcCAodGVtcCArIHN0cmxlbiAodGVtcCkgLSA2LCAicmFubGliIikgPT0gMCkKLQlpc19yYW5saWIgPSAxOwotICAgICAgZWxzZQotCWlzX3JhbmxpYiA9IDA7Ci0gICAgfQotCi0gIGlmIChhcmdjID4gMSAmJiBhcmd2WzFdWzBdID09ICctJykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChhcmd2WzFdLCAiLS1oZWxwIikgPT0gMCkKLQl1c2FnZSAoMSk7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3ZbMV0sICItLXZlcnNpb24iKSA9PSAwKQotCXsKLQkgIGlmIChpc19yYW5saWIpCi0JICAgIHByaW50X3ZlcnNpb24gKCJyYW5saWIiKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRfdmVyc2lvbiAoImFyIik7Ci0JfQotICAgIH0KLQotICBTVEFSVF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lLCAwKTsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICBzaG93X3ZlcnNpb24gPSAwOwotCi0gIHhhdGV4aXQgKHJlbW92ZV9vdXRwdXQpOwotCi0gIGlmIChpc19yYW5saWIpCi0gICAgewotICAgICAgYm9vbGVhbiB0b3VjaCA9IGZhbHNlOwotCi0gICAgICBpZiAoYXJnYyA8IDIgfHwgc3RyY21wIChhcmd2WzFdLCAiLS1oZWxwIikgPT0gMCkKLQl1c2FnZSAoMCk7Ci0gICAgICBpZiAoc3RyY21wIChhcmd2WzFdLCAiLVYiKSA9PSAwCi0JICB8fCBzdHJjbXAgKGFyZ3ZbMV0sICItdiIpID09IDAKLQkgIHx8IHN0cm5jbXAgKGFyZ3ZbMV0sICItLXYiLCAzKSA9PSAwKQotCXByaW50X3ZlcnNpb24gKCJyYW5saWIiKTsKLSAgICAgIGFyZ19pbmRleCA9IDE7Ci0gICAgICBpZiAoc3RyY21wIChhcmd2WzFdLCAiLXQiKSA9PSAwKQotCXsKLQkgICsrYXJnX2luZGV4OwotCSAgdG91Y2ggPSB0cnVlOwotCX0KLSAgICAgIHdoaWxlIChhcmdfaW5kZXggPCBhcmdjKQotCXsKLQkgIGlmICghIHRvdWNoKQotCSAgICByYW5saWJfb25seSAoYXJndlthcmdfaW5kZXhdKTsKLQkgIGVsc2UKLQkgICAgcmFubGliX3RvdWNoIChhcmd2W2FyZ19pbmRleF0pOwotCSAgKythcmdfaW5kZXg7Ci0JfQotICAgICAgeGV4aXQgKDApOwotICAgIH0KLQotICBpZiAoYXJnYyA9PSAyICYmIHN0cmNtcCAoYXJndlsxXSwgIi1NIikgPT0gMCkKLSAgICB7Ci0gICAgICBtcmlfZW11bCAoKTsKLSAgICAgIHhleGl0ICgwKTsKLSAgICB9Ci0KLSAgaWYgKGFyZ2MgPCAyKQotICAgIHVzYWdlICgwKTsKLQotICBhcmdfcHRyID0gYXJndlsxXTsKLQotICBpZiAoKmFyZ19wdHIgPT0gJy0nKQotICAgICsrYXJnX3B0cjsJCQkvKiBjb21wYXRpYmlsaXR5ICovCi0KLSAgd2hpbGUgKChjID0gKmFyZ19wdHIrKykgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJ2QnOgotCWNhc2UgJ20nOgotCWNhc2UgJ3AnOgotCWNhc2UgJ3EnOgotCWNhc2UgJ3InOgotCWNhc2UgJ3QnOgotCWNhc2UgJ3gnOgotCSAgaWYgKG9wZXJhdGlvbiAhPSBub25lKQotCSAgICBmYXRhbCAoXygidHdvIGRpZmZlcmVudCBvcGVyYXRpb24gb3B0aW9ucyBzcGVjaWZpZWQiKSk7Ci0JICBzd2l0Y2ggKGMpCi0JICAgIHsKLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgb3BlcmF0aW9uID0gZGVsZXRlOwotCSAgICAgIG9wZXJhdGlvbl9hbHRlcnNfYXJjaCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ20nOgotCSAgICAgIG9wZXJhdGlvbiA9IG1vdmU7Ci0JICAgICAgb3BlcmF0aW9uX2FsdGVyc19hcmNoID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAncCc6Ci0JICAgICAgb3BlcmF0aW9uID0gcHJpbnRfZmlsZXM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3EnOgotCSAgICAgIG9wZXJhdGlvbiA9IHF1aWNrX2FwcGVuZDsKLQkgICAgICBvcGVyYXRpb25fYWx0ZXJzX2FyY2ggPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdyJzoKLQkgICAgICBvcGVyYXRpb24gPSByZXBsYWNlOwotCSAgICAgIG9wZXJhdGlvbl9hbHRlcnNfYXJjaCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3QnOgotCSAgICAgIG9wZXJhdGlvbiA9IHByaW50X3RhYmxlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICd4JzoKLQkgICAgICBvcGVyYXRpb24gPSBleHRyYWN0OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JY2FzZSAnbCc6Ci0JICBicmVhazsKLQljYXNlICdjJzoKLQkgIHNpbGVudF9jcmVhdGUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnbyc6Ci0JICBwcmVzZXJ2ZV9kYXRlcyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdWJzoKLQkgIHNob3dfdmVyc2lvbiA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIHdyaXRlX2FybWFwID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotCSAgd3JpdGVfYXJtYXAgPSAtMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3UnOgotCSAgbmV3ZXJfb25seSA9IDE7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIHZlcmJvc2UgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JICBwb3N0eXBlID0gcG9zX2FmdGVyOwotCSAgYnJlYWs7Ci0JY2FzZSAnYic6Ci0JICBwb3N0eXBlID0gcG9zX2JlZm9yZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2knOgotCSAgcG9zdHlwZSA9IHBvc19iZWZvcmU7Ci0JICBicmVhazsKLQljYXNlICdNJzoKLQkgIG1yaV9tb2RlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2YnOgotCSAgYXJfdHJ1bmNhdGUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBpbGxlZ2FsIG9wdGlvbiAtLSAlY1xuIiksIHByb2dyYW1fbmFtZSwgYyk7Ci0JICB1c2FnZSAoMCk7Ci0JfQotICAgIH0KLQotICBpZiAoc2hvd192ZXJzaW9uKQotICAgIHByaW50X3ZlcnNpb24gKCJhciIpOwotCi0gIGlmIChhcmdjIDwgMykKLSAgICB1c2FnZSAoMCk7Ci0KLSAgaWYgKG1yaV9tb2RlKQotICAgIHsKLSAgICAgIG1yaV9lbXVsICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZCAqYXJjaDsKLQotICAgICAgLyogV2UgY2FuJ3Qgd3JpdGUgYW4gYXJtYXAgd2hlbiB1c2luZyBhciBxLCBzbyBqdXN0IGRvIGFyIHIKLSAgICAgICAgIGluc3RlYWQuICAqLwotICAgICAgaWYgKG9wZXJhdGlvbiA9PSBxdWlja19hcHBlbmQgJiYgd3JpdGVfYXJtYXApCi0Jb3BlcmF0aW9uID0gcmVwbGFjZTsKLQotICAgICAgaWYgKChvcGVyYXRpb24gPT0gbm9uZSB8fCBvcGVyYXRpb24gPT0gcHJpbnRfdGFibGUpCi0JICAmJiB3cml0ZV9hcm1hcCA9PSAxKQotCXsKLQkgIHJhbmxpYl9vbmx5IChhcmd2WzJdKTsKLQkgIHhleGl0ICgwKTsKLQl9Ci0KLSAgICAgIGlmIChvcGVyYXRpb24gPT0gbm9uZSkKLQlmYXRhbCAoXygibm8gb3BlcmF0aW9uIHNwZWNpZmllZCIpKTsKLQotICAgICAgaWYgKG5ld2VyX29ubHkgJiYgb3BlcmF0aW9uICE9IHJlcGxhY2UpCi0JZmF0YWwgKF8oImB1JyBpcyBvbmx5IG1lYW5pbmdmdWwgd2l0aCB0aGUgYHInIG9wdGlvbi4iKSk7Ci0KLSAgICAgIGFyZ19pbmRleCA9IDI7Ci0KLSAgICAgIGlmIChwb3N0eXBlICE9IHBvc19kZWZhdWx0KQotCXBvc25hbWUgPSBhcmd2W2FyZ19pbmRleCsrXTsKLQotICAgICAgaW5hcmNoX2ZpbGVuYW1lID0gYXJndlthcmdfaW5kZXgrK107Ci0KLSAgICAgIGZpbGVzID0gYXJnX2luZGV4IDwgYXJnYyA/IGFyZ3YgKyBhcmdfaW5kZXggOiBOVUxMOwotCi0jaWYgMAotICAgICAgLyogV2UgZG9uJ3QgdXNlIGRvX3F1aWNrX2FwcGVuZCBhbnkgbW9yZS4gIFRvbyBtYW55IHN5c3RlbXMKLSAgICAgICAgIGV4cGVjdCBhciB0byBhbHdheXMgcmVidWlsZCB0aGUgc3ltYm9sIHRhYmxlIGV2ZW4gd2hlbiBxIGlzCi0gICAgICAgICB1c2VkLiAgKi8KLQotICAgICAgLyogV2UgY2FuJ3QgZG8gYSBxdWljayBhcHBlbmQgaWYgd2UgbmVlZCB0byBjb25zdHJ1Y3QgYW4KLQkgZXh0ZW5kZWQgbmFtZSB0YWJsZSwgYmVjYXVzZSBkb19xdWlja19hcHBlbmQgd29uJ3QgYmUgYWJsZSB0bwotCSByZWJ1aWxkIHRoZSBuYW1lIHRhYmxlLiAgVW5mb3J0dW5hdGVseSwgYXQgdGhpcyBwb2ludCB3ZQotCSBkb24ndCBhY3R1YWxseSBrbm93IHRoZSBtYXhpbXVtIG5hbWUgbGVuZ3RoIHBlcm1pdHRlZCBieSB0aGlzCi0JIG9iamVjdCBmaWxlIGZvcm1hdC4gIFNvLCB3ZSBndWVzcy4gIEZJWE1FLiAgKi8KLSAgICAgIGlmIChvcGVyYXRpb24gPT0gcXVpY2tfYXBwZW5kICYmICEgYXJfdHJ1bmNhdGUpCi0JewotCSAgY2hhciAqKmNoazsKLQotCSAgZm9yIChjaGsgPSBmaWxlczsgY2hrICE9IE5VTEwgJiYgKmNoayAhPSAnXDAnOyBjaGsrKykKLQkgICAgewotCSAgICAgIGlmIChzdHJsZW4gKG5vcm1hbGl6ZSAoKmNoaywgKGJmZCAqKSBOVUxMKSkgPiAxNCkKLQkJewotCQkgIG9wZXJhdGlvbiA9IHJlcGxhY2U7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKG9wZXJhdGlvbiA9PSBxdWlja19hcHBlbmQpCi0JewotCSAgLyogTm90ZSB0aGF0IHF1aWNrIGFwcGVuZGluZyB0byBhIG5vbi1leGlzdGVudCBhcmNoaXZlIGNyZWF0ZXMgaXQsCi0JICAgICBldmVuIGlmIHRoZXJlIGFyZSBubyBmaWxlcyB0byBhcHBlbmQuICovCi0JICBkb19xdWlja19hcHBlbmQgKGluYXJjaF9maWxlbmFtZSwgZmlsZXMpOwotCSAgeGV4aXQgKDApOwotCX0KLSNlbmRpZgotCi0gICAgICBhcmNoID0gb3Blbl9pbmFyY2ggKGluYXJjaF9maWxlbmFtZSwKLQkJCSAgZmlsZXMgPT0gTlVMTCA/IChjaGFyICopIE5VTEwgOiBmaWxlc1swXSk7Ci0KLSAgICAgIHN3aXRjaCAob3BlcmF0aW9uKQotCXsKLQljYXNlIHByaW50X3RhYmxlOgotCSAgbWFwX292ZXJfbWVtYmVycyAoYXJjaCwgcHJpbnRfZGVzY3IsIGZpbGVzLCBhcmdjIC0gMyk7Ci0JICBicmVhazsKLQotCWNhc2UgcHJpbnRfZmlsZXM6Ci0JICBtYXBfb3Zlcl9tZW1iZXJzIChhcmNoLCBwcmludF9jb250ZW50cywgZmlsZXMsIGFyZ2MgLSAzKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBleHRyYWN0OgotCSAgbWFwX292ZXJfbWVtYmVycyAoYXJjaCwgZXh0cmFjdF9maWxlLCBmaWxlcywgYXJnYyAtIDMpOwotCSAgYnJlYWs7Ci0KLQljYXNlIGRlbGV0ZToKLQkgIGlmIChmaWxlcyAhPSBOVUxMKQotCSAgICBkZWxldGVfbWVtYmVycyAoYXJjaCwgZmlsZXMpOwotCSAgYnJlYWs7Ci0KLQljYXNlIG1vdmU6Ci0JICBpZiAoZmlsZXMgIT0gTlVMTCkKLQkgICAgbW92ZV9tZW1iZXJzIChhcmNoLCBmaWxlcyk7Ci0JICBicmVhazsKLQotCWNhc2UgcmVwbGFjZToKLQljYXNlIHF1aWNrX2FwcGVuZDoKLQkgIGlmIChmaWxlcyAhPSBOVUxMIHx8IHdyaXRlX2FybWFwID4gMCkKLQkgICAgcmVwbGFjZV9tZW1iZXJzIChhcmNoLCBmaWxlcywgb3BlcmF0aW9uID09IHF1aWNrX2FwcGVuZCk7Ci0JICBicmVhazsKLQotCSAgLyogU2hvdWxkbid0IGhhcHBlbiEgKi8KLQlkZWZhdWx0OgotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGludGVybmFsIGVycm9yIC0tIHRoaXMgb3B0aW9uIG5vdCBpbXBsZW1lbnRlZFxuIiksCi0JCSAgIHByb2dyYW1fbmFtZSk7Ci0JICB4ZXhpdCAoMSk7Ci0JfQotICAgIH0KLQotICBFTkRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSk7Ci0KLSAgeGV4aXQgKDApOwotICByZXR1cm4gMDsKLX0KLQotYmZkICoKLW9wZW5faW5hcmNoIChhcmNoaXZlX2ZpbGVuYW1lLCBmaWxlKQotICAgICBjb25zdCBjaGFyICphcmNoaXZlX2ZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICpmaWxlOwotewotICBjb25zdCBjaGFyICp0YXJnZXQ7Ci0gIGJmZCAqKmxhc3Rfb25lOwotICBiZmQgKm5leHRfb25lOwotICBzdHJ1Y3Qgc3RhdCBzYnVmOwotICBiZmQgKmFyY2g7Ci0gIGNoYXIgKiptYXRjaGluZzsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fZXJyb3IpOwotCi0gIHRhcmdldCA9IE5VTEw7Ci0KLSAgaWYgKHN0YXQgKGFyY2hpdmVfZmlsZW5hbWUsICZzYnVmKSAhPSAwKQotICAgIHsKLSNpZm5kZWYgX19HTzMyX18KLQotLyogS0xVREdFIEFMRVJUISBUZW1wb3JhcnkgZml4IHVudGlsIEkgZmlnZ2VyIHdoeQotICogc3RhdCgpIGlzIHdyb25nIC4uLiB0aGluayBpdCdzIGJ1cmllZCBpbiBHTzMyJ3MgSURUCi0gKiAtIEpheAotICovCi0gICAgICBpZiAoZXJybm8gIT0gRU5PRU5UKQotCWJmZF9mYXRhbCAoYXJjaGl2ZV9maWxlbmFtZSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKCFvcGVyYXRpb25fYWx0ZXJzX2FyY2gpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0JICBwZXJyb3IgKGFyY2hpdmVfZmlsZW5hbWUpOwotCSAgbWF5YmVxdWl0ICgpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotCi0gICAgICAvKiBUcnkgdG8gZmlndXJlIG91dCB0aGUgdGFyZ2V0IHRvIHVzZSBmb3IgdGhlIGFyY2hpdmUgZnJvbSB0aGUKLSAgICAgICAgIGZpcnN0IG9iamVjdCBvbiB0aGUgbGlzdC4gICovCi0gICAgICBpZiAoZmlsZSAhPSBOVUxMKQotCXsKLQkgIGJmZCAqb2JqOwotCi0JICBvYmogPSBiZmRfb3BlbnIgKGZpbGUsIE5VTEwpOwotCSAgaWYgKG9iaiAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXQgKG9iaiwgYmZkX29iamVjdCkpCi0JCXRhcmdldCA9IGJmZF9nZXRfdGFyZ2V0IChvYmopOwotCSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKG9iaik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIENyZWF0ZSBhbiBlbXB0eSBhcmNoaXZlLiAgKi8KLSAgICAgIGFyY2ggPSBiZmRfb3BlbncgKGFyY2hpdmVfZmlsZW5hbWUsIHRhcmdldCk7Ci0gICAgICBpZiAoYXJjaCA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfZm9ybWF0IChhcmNoLCBiZmRfYXJjaGl2ZSkKLQkgIHx8ICEgYmZkX2Nsb3NlIChhcmNoKSkKLQliZmRfZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOwotICAgIH0KLQotICBhcmNoID0gYmZkX29wZW5yIChhcmNoaXZlX2ZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoYXJjaCA9PSBOVUxMKQotICAgIHsKLSAgICBibG9zZXI6Ci0gICAgICBiZmRfZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOwotICAgIH0KLQotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFyY2gsIGJmZF9hcmNoaXZlLCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoYXJjaGl2ZV9maWxlbmFtZSk7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCXsKLQkgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotCSAgZnJlZSAobWF0Y2hpbmcpOwotCX0KLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgbGFzdF9vbmUgPSAmKGFyY2gtPm5leHQpOwotICAvKiBSZWFkIGFsbCB0aGUgY29udGVudHMgcmlnaHQgYXdheSwgcmVnYXJkbGVzcy4gICovCi0gIGZvciAobmV4dF9vbmUgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoLCBOVUxMKTsKLSAgICAgICBuZXh0X29uZTsKLSAgICAgICBuZXh0X29uZSA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyY2gsIG5leHRfb25lKSkKLSAgICB7Ci0gICAgICBQUk9HUkVTUyAoMSk7Ci0gICAgICAqbGFzdF9vbmUgPSBuZXh0X29uZTsKLSAgICAgIGxhc3Rfb25lID0gJm5leHRfb25lLT5uZXh0OwotICAgIH0KLSAgKmxhc3Rfb25lID0gKGJmZCAqKSBOVUxMOwotICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcykKLSAgICBnb3RvIGJsb3NlcjsKLSAgcmV0dXJuIGFyY2g7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgbmNvcGllZCA9IDA7Ci0gIGNoYXIgKmNidWYgPSB4bWFsbG9jIChCVUZTSVpFKTsKLSAgc3RydWN0IHN0YXQgYnVmOwotICBsb25nIHNpemU7Ci0gIGlmIChiZmRfc3RhdF9hcmNoX2VsdCAoYWJmZCwgJmJ1ZikgIT0gMCkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGZhdGFsIChfKCJpbnRlcm5hbCBzdGF0IGVycm9yIG9uICVzIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIHByaW50ZiAoXygiXG48bWVtYmVyICVzPlxuXG4iKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGJmZF9zZWVrIChhYmZkLCAwLCBTRUVLX1NFVCk7Ci0KLSAgc2l6ZSA9IGJ1Zi5zdF9zaXplOwotICB3aGlsZSAobmNvcGllZCA8IHNpemUpCi0gICAgewotCi0gICAgICBpbnQgbnJlYWQ7Ci0gICAgICBpbnQgdG9jb3B5ID0gc2l6ZSAtIG5jb3BpZWQ7Ci0gICAgICBpZiAodG9jb3B5ID4gQlVGU0laRSkKLQl0b2NvcHkgPSBCVUZTSVpFOwotCi0gICAgICBucmVhZCA9IGJmZF9yZWFkIChjYnVmLCAxLCB0b2NvcHksIGFiZmQpOwkvKiBvb3BzIC0tIGJyb2tlCi0JCQkJCQkJICAgYWJzdHJhY3Rpb24hICAqLwotICAgICAgaWYgKG5yZWFkICE9IHRvY29weSkKLQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCWZhdGFsIChfKCIlcyBpcyBub3QgYSB2YWxpZCBhcmNoaXZlIiksCi0JICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChhYmZkKSkpOwotICAgICAgZndyaXRlIChjYnVmLCAxLCBucmVhZCwgc3Rkb3V0KTsKLSAgICAgIG5jb3BpZWQgKz0gdG9jb3B5OwotICAgIH0KLSAgZnJlZSAoY2J1Zik7Ci19Ci0KLS8qIEV4dHJhY3QgYSBtZW1iZXIgb2YgdGhlIGFyY2hpdmUgaW50byBpdHMgb3duIGZpbGUuCi0KLSAgIFdlIGRlZmVyIG9wZW5pbmcgdGhlIG5ldyBmaWxlIHVudGlsIGFmdGVyIHdlIGhhdmUgcmVhZCBhIEJVRlNJWiBjaHVuayBvZiB0aGUKLSAgIG9sZCBvbmUsIHNpbmNlIHdlIGtub3cgd2UgaGF2ZSBqdXN0IHJlYWQgdGhlIGFyY2hpdmUgaGVhZGVyIGZvciB0aGUgb2xkCi0gICBvbmUuICBTaW5jZSBtb3N0IG1lbWJlcnMgYXJlIHNob3J0ZXIgdGhhbiBCVUZTSVosIHRoaXMgbWVhbnMgd2Ugd2lsbCByZWFkCi0gICB0aGUgb2xkIGhlYWRlciwgcmVhZCB0aGUgb2xkIGRhdGEsIHdyaXRlIGEgbmV3IGlub2RlIGZvciB0aGUgbmV3IGZpbGUsIGFuZAotICAgd3JpdGUgdGhlIG5ldyBkYXRhLCBhbmQgYmUgZG9uZS4gVGhpcyAnb3B0aW1pemF0aW9uJyBpcyB3aGF0IGNvbWVzIGZyb20KLSAgIHNpdHRpbmcgbmV4dCB0byBhIGJhcmUgZGlzayBhbmQgaGVhcmluZyBpdCBldmVyeSB0aW1lIGl0IHNlZWtzLiAgLS0gR251Ci0gICBHaWxtb3JlICAqLwotCi12b2lkCi1leHRyYWN0X2ZpbGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgRklMRSAqb3N0cmVhbTsKLSAgY2hhciAqY2J1ZiA9IHhtYWxsb2MgKEJVRlNJWkUpOwotICBpbnQgbnJlYWQsIHRvY29weTsKLSAgbG9uZyBuY29waWVkID0gMDsKLSAgbG9uZyBzaXplOwotICBzdHJ1Y3Qgc3RhdCBidWY7Ci0gIAotICBpZiAoYmZkX3N0YXRfYXJjaF9lbHQgKGFiZmQsICZidWYpICE9IDApCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiaW50ZXJuYWwgc3RhdCBlcnJvciBvbiAlcyIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gIHNpemUgPSBidWYuc3Rfc2l6ZTsKLQotICBpZiAoc2l6ZSA8IDApCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygic3RhdCByZXR1cm5zIG5lZ2F0aXZlIHNpemUgZm9yICVzIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgCi0gIGlmICh2ZXJib3NlKQotICAgIHByaW50ZiAoInggLSAlc1xuIiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGJmZF9zZWVrIChhYmZkLCAwLCBTRUVLX1NFVCk7Ci0KLSAgb3N0cmVhbSA9IE5VTEw7Ci0gIGlmIChzaXplID09IDApCi0gICAgewotICAgICAgLyogU2VlbXMgbGlrZSBhbiBhYnN0cmFjdGlvbiB2aW9sYXRpb24sIGVoPyAgV2VsbCBpdCdzIE9LISAqLwotICAgICAgb3V0cHV0X2ZpbGVuYW1lID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7Ci0KLSAgICAgIG9zdHJlYW0gPSBmb3BlbiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIEZPUEVOX1dCKTsKLSAgICAgIGlmIChvc3RyZWFtID09IE5VTEwpCi0JewotCSAgcGVycm9yIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICB4ZXhpdCAoMSk7Ci0JfQotCi0gICAgICBvdXRwdXRfZmlsZSA9IG9zdHJlYW07Ci0gICAgfQotICBlbHNlCi0gICAgd2hpbGUgKG5jb3BpZWQgPCBzaXplKQotICAgICAgewotCXRvY29weSA9IHNpemUgLSBuY29waWVkOwotCWlmICh0b2NvcHkgPiBCVUZTSVpFKQotCSAgdG9jb3B5ID0gQlVGU0laRTsKLQotCW5yZWFkID0gYmZkX3JlYWQgKGNidWYsIDEsIHRvY29weSwgYWJmZCk7Ci0JaWYgKG5yZWFkICE9IHRvY29weSkKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBmYXRhbCAoXygiJXMgaXMgbm90IGEgdmFsaWQgYXJjaGl2ZSIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGFiZmQpKSk7Ci0KLQkvKiBTZWUgY29tbWVudCBhYm92ZTsgdGhpcyBzYXZlcyBkaXNrIGFybSBtb3Rpb24gKi8KLQlpZiAob3N0cmVhbSA9PSBOVUxMKQotCSAgewotCSAgICAvKiBTZWVtcyBsaWtlIGFuIGFic3RyYWN0aW9uIHZpb2xhdGlvbiwgZWg/ICBXZWxsIGl0J3MgT0shICovCi0JICAgIG91dHB1dF9maWxlbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotCi0JICAgIG9zdHJlYW0gPSBmb3BlbiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIEZPUEVOX1dCKTsKLQkgICAgaWYgKG9zdHJlYW0gPT0gTlVMTCkKLQkgICAgICB7Ci0JCXBlcnJvciAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCQl4ZXhpdCAoMSk7Ci0JICAgICAgfQotCi0JICAgIG91dHB1dF9maWxlID0gb3N0cmVhbTsKLQkgIH0KLQlmd3JpdGUgKGNidWYsIDEsIG5yZWFkLCBvc3RyZWFtKTsKLQluY29waWVkICs9IHRvY29weTsKLSAgICAgIH0KLQotICBpZiAob3N0cmVhbSAhPSBOVUxMKQotICAgIGZjbG9zZSAob3N0cmVhbSk7Ci0KLSAgb3V0cHV0X2ZpbGUgPSBOVUxMOwotICBvdXRwdXRfZmlsZW5hbWUgPSBOVUxMOwotCi0gIGNobW9kIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYnVmLnN0X21vZGUpOwotCi0gIGlmIChwcmVzZXJ2ZV9kYXRlcykKLSAgICBzZXRfdGltZXMgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAmYnVmKTsKLQotICBmcmVlIChjYnVmKTsKLX0KLQotI2lmIDAKLQotLyogV2UgZG9uJ3QgdXNlIHRoaXMgYW55bW9yZS4gIFRvbyBtYW55IHN5c3RlbXMgZXhwZWN0IGFyIHRvIHJlYnVpbGQKLSAgIHRoZSBzeW1ib2wgdGFibGUgZXZlbiB3aGVuIHEgaXMgdXNlZC4gICovCi0KLS8qIEp1c3QgZG8gaXQgcXVpY2tseTsgZG9uJ3Qgd29ycnkgYWJvdXQgZHVwcywgYXJtYXAsIG9yIGFueXRoaW5nIGxpa2UgdGhhdCAqLwotCi1zdGF0aWMgdm9pZAotZG9fcXVpY2tfYXBwZW5kIChhcmNoaXZlX2ZpbGVuYW1lLCBmaWxlc190b19hcHBlbmQpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2hpdmVfZmlsZW5hbWU7Ci0gICAgIGNoYXIgKipmaWxlc190b19hcHBlbmQ7Ci17Ci0gIEZJTEUgKm9maWxlLCAqaWZpbGU7Ci0gIGNoYXIgKmJ1ZiA9IHhtYWxsb2MgKEJVRlNJWkUpOwotICBsb25nIHRvY29weSwgdGhpc3RpbWU7Ci0gIGJmZCAqdGVtcDsKLSAgc3RydWN0IHN0YXQgc2J1ZjsKLSAgYm9vbGVhbiBuZXdmaWxlID0gZmFsc2U7Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19lcnJvcik7Ci0KLSAgaWYgKHN0YXQgKGFyY2hpdmVfZmlsZW5hbWUsICZzYnVmKSAhPSAwKQotICAgIHsKLQotI2lmbmRlZiBfX0dPMzJfXwotCi0vKiBLTFVER0UgQUxFUlQhIFRlbXBvcmFyeSBmaXggdW50aWwgSSBmaWdnZXIgd2h5Ci0gKiBzdGF0KCkgaXMgd3JvbmcgLi4uIHRoaW5rIGl0J3MgYnVyaWVkIGluIEdPMzIncyBJRFQKLSAqIC0gSmF4Ci0gKi8KLQotICAgICAgaWYgKGVycm5vICE9IEVOT0VOVCkKLQliZmRfZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOwotI2VuZGlmCi0KLSAgICAgIG5ld2ZpbGUgPSB0cnVlOwotICAgIH0KLQotICBvZmlsZSA9IGZvcGVuIChhcmNoaXZlX2ZpbGVuYW1lLCBGT1BFTl9BVUIpOwotICBpZiAob2ZpbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwZXJyb3IgKHByb2dyYW1fbmFtZSk7Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotCi0gIHRlbXAgPSBiZmRfb3BlbnIgKGFyY2hpdmVfZmlsZW5hbWUsIE5VTEwpOwotICBpZiAodGVtcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9mYXRhbCAoYXJjaGl2ZV9maWxlbmFtZSk7Ci0gICAgfQotICBpZiAobmV3ZmlsZSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAodGVtcCwgYmZkX2FyY2hpdmUpICE9IHRydWUpCi0JLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQlmYXRhbCAoXygiJXMgaXMgbm90IGFuIGFyY2hpdmUiKSwgYXJjaGl2ZV9maWxlbmFtZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZndyaXRlIChBUk1BRywgMSwgU0FSTUFHLCBvZmlsZSk7Ci0gICAgICBpZiAoIXNpbGVudF9jcmVhdGUpCi0JLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBjcmVhdGluZyAlc1xuIiksCi0JCSBwcm9ncmFtX25hbWUsIGFyY2hpdmVfZmlsZW5hbWUpOwotICAgIH0KLQotICBpZiAoYXJfdHJ1bmNhdGUpCi0gICAgdGVtcC0+ZmxhZ3MgfD0gQkZEX1RSQURJVElPTkFMX0ZPUk1BVDsKLQotICAvKiBhc3N1bWUgaXQncyBhbiBhY2hpdmUsIGdvIHN0cmFpZ2h0IHRvIHRoZSBlbmQsIHNhbnMgJDIwMCAqLwotICBmc2VlayAob2ZpbGUsIDAsIDIpOwotCi0gIGZvciAoOyBmaWxlc190b19hcHBlbmQgJiYgKmZpbGVzX3RvX2FwcGVuZDsgKytmaWxlc190b19hcHBlbmQpCi0gICAgewotICAgICAgc3RydWN0IGFyX2hkciAqaGRyID0gYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUgKHRlbXAsICpmaWxlc190b19hcHBlbmQpOwotICAgICAgaWYgKGhkciA9PSBOVUxMKQotCXsKLQkgIGJmZF9mYXRhbCAoKmZpbGVzX3RvX2FwcGVuZCk7Ci0JfQotCi0gICAgICBCRkRfU0VORCAodGVtcCwgX2JmZF90cnVuY2F0ZV9hcm5hbWUsICh0ZW1wLCAqZmlsZXNfdG9fYXBwZW5kLCAoY2hhciAqKSBoZHIpKTsKLQotICAgICAgaWZpbGUgPSBmb3BlbiAoKmZpbGVzX3RvX2FwcGVuZCwgRk9QRU5fUkIpOwotICAgICAgaWYgKGlmaWxlID09IE5VTEwpCi0JewotCSAgYmZkX25vbmZhdGFsICgqZmlsZXNfdG9fYXBwZW5kKTsKLQl9Ci0KLSAgICAgIGlmIChzdGF0ICgqZmlsZXNfdG9fYXBwZW5kLCAmc2J1ZikgIT0gMCkKLQl7Ci0JICBiZmRfbm9uZmF0YWwgKCpmaWxlc190b19hcHBlbmQpOwotCX0KLQotICAgICAgdG9jb3B5ID0gc2J1Zi5zdF9zaXplOwotCi0gICAgICAvKiBYWFggc2hvdWxkIGRvIGVycm9yLWNoZWNraW5nISAqLwotICAgICAgZndyaXRlIChoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIG9maWxlKTsKLQotICAgICAgd2hpbGUgKHRvY29weSA+IDApCi0JewotCSAgdGhpc3RpbWUgPSB0b2NvcHk7Ci0JICBpZiAodGhpc3RpbWUgPiBCVUZTSVpFKQotCSAgICB0aGlzdGltZSA9IEJVRlNJWkU7Ci0JICBmcmVhZCAoYnVmLCAxLCB0aGlzdGltZSwgaWZpbGUpOwotCSAgZndyaXRlIChidWYsIDEsIHRoaXN0aW1lLCBvZmlsZSk7Ci0JICB0b2NvcHkgLT0gdGhpc3RpbWU7Ci0JfQotICAgICAgZmNsb3NlIChpZmlsZSk7Ci0gICAgICBpZiAoKHNidWYuc3Rfc2l6ZSAlIDIpID09IDEpCi0JcHV0YyAoJ1wwMTInLCBvZmlsZSk7Ci0gICAgfQotICBmY2xvc2UgKG9maWxlKTsKLSAgYmZkX2Nsb3NlICh0ZW1wKTsKLSAgZnJlZSAoYnVmKTsKLX0KLQotI2VuZGlmIC8qIDAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX2FyY2hpdmUgKGlhcmNoKQotICAgICBiZmQgKmlhcmNoOwotewotICBiZmQgKm9iZmQ7Ci0gIGNoYXIgKm9sZF9uYW1lLCAqbmV3X25hbWU7Ci0gIGJmZCAqY29udGVudHNfaGVhZCA9IGlhcmNoLT5uZXh0OwotCi0gIG9sZF9uYW1lID0geG1hbGxvYyAoc3RybGVuIChiZmRfZ2V0X2ZpbGVuYW1lIChpYXJjaCkpICsgMSk7Ci0gIHN0cmNweSAob2xkX25hbWUsIGJmZF9nZXRfZmlsZW5hbWUgKGlhcmNoKSk7Ci0gIG5ld19uYW1lID0gbWFrZV90ZW1wbmFtZSAob2xkX25hbWUpOwotCi0gIG91dHB1dF9maWxlbmFtZSA9IG5ld19uYW1lOwotCi0gIG9iZmQgPSBiZmRfb3BlbncgKG5ld19uYW1lLCBiZmRfZ2V0X3RhcmdldCAoaWFyY2gpKTsKLQotICBpZiAob2JmZCA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAob2xkX25hbWUpOwotCi0gIG91dHB1dF9iZmQgPSBvYmZkOwotCi0gIGJmZF9zZXRfZm9ybWF0IChvYmZkLCBiZmRfYXJjaGl2ZSk7Ci0KLSAgLyogUmVxdWVzdCB3cml0aW5nIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSB1bmxlc3Mgd2UndmUKLSAgICAgYmVlbiBleHBsaWNpdGx5IHJlcXVlc3RlZCBub3QgdG8uICAqLwotICBvYmZkLT5oYXNfYXJtYXAgPSB3cml0ZV9hcm1hcCA+PSAwOwotCi0gIGlmIChhcl90cnVuY2F0ZSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIHNob3VsZCByZWFsbHkgdXNlIGJmZF9zZXRfZmlsZV9mbGFncywgYnV0IHRoYXQgcmVqZWN0cwotICAgICAgICAgYXJjaGl2ZXMuICAqLwotICAgICAgb2JmZC0+ZmxhZ3MgfD0gQkZEX1RSQURJVElPTkFMX0ZPUk1BVDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZXRfYXJjaGl2ZV9oZWFkIChvYmZkLCBjb250ZW50c19oZWFkKSAhPSB0cnVlKQotICAgIGJmZF9mYXRhbCAob2xkX25hbWUpOwotCi0gIGlmICghYmZkX2Nsb3NlIChvYmZkKSkKLSAgICBiZmRfZmF0YWwgKG9sZF9uYW1lKTsKLQotICBvdXRwdXRfYmZkID0gTlVMTDsKLSAgb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLQotICAvKiBXZSBkb24ndCBjYXJlIGlmIHRoaXMgZmFpbHM7IHdlIG1pZ2h0IGJlIGNyZWF0aW5nIHRoZSBhcmNoaXZlLiAgKi8KLSAgYmZkX2Nsb3NlIChpYXJjaCk7Ci0KLSAgaWYgKHNtYXJ0X3JlbmFtZSAobmV3X25hbWUsIG9sZF9uYW1lLCAwKSAhPSAwKQotICAgIHhleGl0ICgxKTsKLX0KLQotLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgZW50cnkgd2hpY2ggc2hvdWxkIGJlIHJwbGFjZCdkCi0gICBpbnRvIHdoZW4gYWx0ZXJpbmcuICBERUZBVUxUX1BPUyBzaG91bGQgYmUgaG93IHRvIGludGVycHJldCBwb3NfZGVmYXVsdCwKLSAgIGFuZCBzaG91bGQgYmUgYSBwb3MgdmFsdWUuICAqLwotCi1zdGF0aWMgYmZkICoqCi1nZXRfcG9zX2JmZCAoY29udGVudHMsIGRlZmF1bHRfcG9zLCBkZWZhdWx0X3Bvc25hbWUpCi0gICAgIGJmZCAqKmNvbnRlbnRzOwotICAgICBlbnVtIHBvcyBkZWZhdWx0X3BvczsKLSAgICAgY29uc3QgY2hhciAqZGVmYXVsdF9wb3NuYW1lOwotewotICBiZmQgKiphZnRlcl9iZmQgPSBjb250ZW50czsKLSAgZW51bSBwb3MgcmVhbHBvczsKLSAgY29uc3QgY2hhciAqcmVhbHBvc25hbWU7Ci0KLSAgaWYgKHBvc3R5cGUgPT0gcG9zX2RlZmF1bHQpCi0gICAgewotICAgICAgcmVhbHBvcyA9IGRlZmF1bHRfcG9zOwotICAgICAgcmVhbHBvc25hbWUgPSBkZWZhdWx0X3Bvc25hbWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVhbHBvcyA9IHBvc3R5cGU7Ci0gICAgICByZWFscG9zbmFtZSA9IHBvc25hbWU7Ci0gICAgfQotCi0gIGlmIChyZWFscG9zID09IHBvc19lbmQpCi0gICAgewotICAgICAgd2hpbGUgKCphZnRlcl9iZmQpCi0JYWZ0ZXJfYmZkID0gJigoKmFmdGVyX2JmZCktPm5leHQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoOyAqYWZ0ZXJfYmZkOyBhZnRlcl9iZmQgPSAmKCphZnRlcl9iZmQpLT5uZXh0KQotCWlmIChzdHJjbXAgKCgqYWZ0ZXJfYmZkKS0+ZmlsZW5hbWUsIHJlYWxwb3NuYW1lKSA9PSAwKQotCSAgewotCSAgICBpZiAocmVhbHBvcyA9PSBwb3NfYWZ0ZXIpCi0JICAgICAgYWZ0ZXJfYmZkID0gJigqYWZ0ZXJfYmZkKS0+bmV4dDsKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgfQotICByZXR1cm4gYWZ0ZXJfYmZkOwotfQotCi1zdGF0aWMgdm9pZAotZGVsZXRlX21lbWJlcnMgKGFyY2gsIGZpbGVzX3RvX2RlbGV0ZSkKLSAgICAgYmZkICphcmNoOwotICAgICBjaGFyICoqZmlsZXNfdG9fZGVsZXRlOwotewotICBiZmQgKipjdXJyZW50X3B0cl9wdHI7Ci0gIGJvb2xlYW4gZm91bmQ7Ci0gIGJvb2xlYW4gc29tZXRoaW5nX2NoYW5nZWQgPSBmYWxzZTsKLSAgZm9yICg7ICpmaWxlc190b19kZWxldGUgIT0gTlVMTDsgKytmaWxlc190b19kZWxldGUpCi0gICAgewotICAgICAgLyogSW4gYS5vdXQgc3lzdGVtcywgdGhlIGFybWFwIGlzIG9wdGlvbmFsLiAgSXQncyBhbHNvIGNhbGxlZAotCSBfXy5TWU1ERUYuICBTbyBpZiB0aGUgdXNlciBhc2tlZCB0byBkZWxldGUgaXQsIHdlIHNob3VsZCByZW1lbWJlcgotCSB0aGF0IGZhY3QuIFRoaXMgaXNuJ3QgcXVpdGUgcmlnaHQgZm9yIENPRkYgc3lzdGVtcyAod2hlcmUKLQkgX18uU1lNREVGIG1pZ2h0IGJlIHJlZ3VsYXIgbWVtYmVyKSwgYnV0IGl0J3MgdmVyeSB1bmxpa2VseQotCSB0byBiZSBhIHByb2JsZW0uICBGSVhNRSAqLwotCi0gICAgICBpZiAoIXN0cmNtcCAoKmZpbGVzX3RvX2RlbGV0ZSwgIl9fLlNZTURFRiIpKQotCXsKLQkgIGFyY2gtPmhhc19hcm1hcCA9IGZhbHNlOwotCSAgd3JpdGVfYXJtYXAgPSAtMTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgZm91bmQgPSBmYWxzZTsKLSAgICAgIGN1cnJlbnRfcHRyX3B0ciA9ICYoYXJjaC0+bmV4dCk7Ci0gICAgICB3aGlsZSAoKmN1cnJlbnRfcHRyX3B0cikKLQl7Ci0JICBpZiAoc3RyY21wICgqZmlsZXNfdG9fZGVsZXRlLCAoKmN1cnJlbnRfcHRyX3B0ciktPmZpbGVuYW1lKSA9PSAwKQotCSAgICB7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICAgIHNvbWV0aGluZ19jaGFuZ2VkID0gdHJ1ZTsKLQkgICAgICBpZiAodmVyYm9zZSkKLQkJcHJpbnRmICgiZCAtICVzXG4iLAotCQkJKmZpbGVzX3RvX2RlbGV0ZSk7Ci0JICAgICAgKmN1cnJlbnRfcHRyX3B0ciA9ICgoKmN1cnJlbnRfcHRyX3B0ciktPm5leHQpOwotCSAgICAgIGdvdG8gbmV4dF9maWxlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjdXJyZW50X3B0cl9wdHIgPSAmKCgqY3VycmVudF9wdHJfcHRyKS0+bmV4dCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICh2ZXJib3NlICYmIGZvdW5kID09IGZhbHNlKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBwcmludGYgKF8oIk5vIG1lbWJlciBuYW1lZCBgJXMnXG4iKSwgKmZpbGVzX3RvX2RlbGV0ZSk7Ci0JfQotICAgIG5leHRfZmlsZToKLSAgICAgIDsKLSAgICB9Ci0KLSAgaWYgKHNvbWV0aGluZ19jaGFuZ2VkID09IHRydWUpCi0gICAgewotICAgICAgd3JpdGVfYXJjaGl2ZSAoYXJjaCk7Ci0gICAgfQotfQotCi0KLS8qIFJlcG9zaXRpb24gZXhpc3RpbmcgbWVtYmVycyB3aXRoaW4gYW4gYXJjaGl2ZSAqLwotCi1zdGF0aWMgdm9pZAotbW92ZV9tZW1iZXJzIChhcmNoLCBmaWxlc190b19tb3ZlKQotICAgICBiZmQgKmFyY2g7Ci0gICAgIGNoYXIgKipmaWxlc190b19tb3ZlOwotewotICBiZmQgKiphZnRlcl9iZmQ7CQkvKiBOZXcgZW50cmllcyBnbyBhZnRlciB0aGlzIG9uZSAqLwotICBiZmQgKipjdXJyZW50X3B0cl9wdHI7CS8qIGNkciBwb2ludGVyIGludG8gY29udGVudHMgKi8KLQotICBmb3IgKDsgKmZpbGVzX3RvX21vdmU7ICsrZmlsZXNfdG9fbW92ZSkKLSAgICB7Ci0gICAgICBjdXJyZW50X3B0cl9wdHIgPSAmKGFyY2gtPm5leHQpOwotICAgICAgd2hpbGUgKCpjdXJyZW50X3B0cl9wdHIpCi0JewotCSAgYmZkICpjdXJyZW50X3B0ciA9ICpjdXJyZW50X3B0cl9wdHI7Ci0JICBpZiAoc3RyY21wIChub3JtYWxpemUgKCpmaWxlc190b19tb3ZlLCBhcmNoKSwKLQkJICAgICAgY3VycmVudF9wdHItPmZpbGVuYW1lKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogTW92ZSB0aGlzIGZpbGUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCAtIGZpcnN0IGN1dCBmcm9tCi0JCSB3aGVyZSBpdCBpcy4gICovCi0JICAgICAgYmZkICpsaW5rOwotCSAgICAgICpjdXJyZW50X3B0cl9wdHIgPSBjdXJyZW50X3B0ci0+bmV4dDsKLQotCSAgICAgIC8qIE5vdyBnbHVlIHRvIGVuZCAqLwotCSAgICAgIGFmdGVyX2JmZCA9IGdldF9wb3NfYmZkICgmYXJjaC0+bmV4dCwgcG9zX2VuZCwgTlVMTCk7Ci0JICAgICAgbGluayA9ICphZnRlcl9iZmQ7Ci0JICAgICAgKmFmdGVyX2JmZCA9IGN1cnJlbnRfcHRyOwotCSAgICAgIGN1cnJlbnRfcHRyLT5uZXh0ID0gbGluazsKLQotCSAgICAgIGlmICh2ZXJib3NlKQotCQlwcmludGYgKCJtIC0gJXNcbiIsICpmaWxlc190b19tb3ZlKTsKLQotCSAgICAgIGdvdG8gbmV4dF9maWxlOwotCSAgICB9Ci0KLQkgIGN1cnJlbnRfcHRyX3B0ciA9ICYoKCpjdXJyZW50X3B0cl9wdHIpLT5uZXh0KTsKLQl9Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gZW50cnkgJXMgaW4gYXJjaGl2ZSAlcyFcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUsICpmaWxlc190b19tb3ZlLCBhcmNoLT5maWxlbmFtZSk7Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgbmV4dF9maWxlOjsKLSAgICB9Ci0KLSAgd3JpdGVfYXJjaGl2ZSAoYXJjaCk7Ci19Ci0KLS8qIE91Z2h0IHRvIGRlZmF1bHQgdG8gcmVwbGFjaW5nIGluIHBsYWNlLCBidXQgdGhpcyBpcyBleGlzdGluZyBwcmFjdGljZSEgICovCi0KLXN0YXRpYyB2b2lkCi1yZXBsYWNlX21lbWJlcnMgKGFyY2gsIGZpbGVzX3RvX21vdmUsIHF1aWNrKQotICAgICBiZmQgKmFyY2g7Ci0gICAgIGNoYXIgKipmaWxlc190b19tb3ZlOwotICAgICBib29sZWFuIHF1aWNrOwotewotICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgYmZkICoqYWZ0ZXJfYmZkOwkJLyogTmV3IGVudHJpZXMgZ28gYWZ0ZXIgdGhpcyBvbmUgKi8KLSAgYmZkICpjdXJyZW50OwotICBiZmQgKipjdXJyZW50X3B0cjsKLSAgYmZkICp0ZW1wOwotCi0gIHdoaWxlIChmaWxlc190b19tb3ZlICYmICpmaWxlc190b19tb3ZlKQotICAgIHsKLSAgICAgIGlmICghIHF1aWNrKQotCXsKLQkgIGN1cnJlbnRfcHRyID0gJmFyY2gtPm5leHQ7Ci0JICB3aGlsZSAoKmN1cnJlbnRfcHRyKQotCSAgICB7Ci0JICAgICAgY3VycmVudCA9ICpjdXJyZW50X3B0cjsKLQotCSAgICAgIC8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgYXIgcHJvZ3JhbXMsIHdlCi0JCSBwZXJtaXQgdGhlIHNhbWUgZmlsZSB0byBiZSBhZGRlZCBtdWx0aXBsZSB0aW1lcy4gICovCi0JICAgICAgaWYgKHN0cmNtcCAobm9ybWFsaXplICgqZmlsZXNfdG9fbW92ZSwgYXJjaCksCi0JCQkgIG5vcm1hbGl6ZSAoY3VycmVudC0+ZmlsZW5hbWUsIGFyY2gpKSA9PSAwCi0JCSAgJiYgY3VycmVudC0+YXJlbHRfZGF0YSAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKG5ld2VyX29ubHkpCi0JCSAgICB7Ci0JCSAgICAgIHN0cnVjdCBzdGF0IGZzYnVmLCBhc2J1ZjsKLQotCQkgICAgICBpZiAoc3RhdCAoKmZpbGVzX3RvX21vdmUsICZmc2J1ZikgIT0gMCkKLQkJCXsKLQkJCSAgaWYgKGVycm5vICE9IEVOT0VOVCkKLQkJCSAgICBiZmRfZmF0YWwgKCpmaWxlc190b19tb3ZlKTsKLQkJCSAgZ290byBuZXh0X2ZpbGU7Ci0JCQl9Ci0JCSAgICAgIGlmIChiZmRfc3RhdF9hcmNoX2VsdCAoY3VycmVudCwgJmFzYnVmKSAhPSAwKQotCQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCWZhdGFsIChfKCJpbnRlcm5hbCBzdGF0IGVycm9yIG9uICVzIiksIGN1cnJlbnQtPmZpbGVuYW1lKTsKLQotCQkgICAgICBpZiAoZnNidWYuc3RfbXRpbWUgPD0gYXNidWYuc3RfbXRpbWUpCi0JCQlnb3RvIG5leHRfZmlsZTsKLQkJICAgIH0KLQotCQkgIGFmdGVyX2JmZCA9IGdldF9wb3NfYmZkICgmYXJjaC0+bmV4dCwgcG9zX2FmdGVyLAotCQkJCQkgICBjdXJyZW50LT5maWxlbmFtZSk7Ci0JCSAgdGVtcCA9ICphZnRlcl9iZmQ7Ci0KLQkJICAqYWZ0ZXJfYmZkID0gYmZkX29wZW5yICgqZmlsZXNfdG9fbW92ZSwgTlVMTCk7Ci0JCSAgaWYgKCphZnRlcl9iZmQgPT0gKGJmZCAqKSBOVUxMKQotCQkgICAgewotCQkgICAgICBiZmRfZmF0YWwgKCpmaWxlc190b19tb3ZlKTsKLQkJICAgIH0KLQkJICAoKmFmdGVyX2JmZCktPm5leHQgPSB0ZW1wOwotCi0JCSAgLyogc25pcCBvdXQgdGhpcyBlbnRyeSBmcm9tIHRoZSBjaGFpbiAqLwotCQkgICpjdXJyZW50X3B0ciA9ICgqY3VycmVudF9wdHIpLT5uZXh0OwotCi0JCSAgaWYgKHZlcmJvc2UpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoInIgLSAlc1xuIiwgKmZpbGVzX3RvX21vdmUpOwotCQkgICAgfQotCi0JCSAgY2hhbmdlZCA9IHRydWU7Ci0KLQkJICBnb3RvIG5leHRfZmlsZTsKLQkJfQotCSAgICAgIGN1cnJlbnRfcHRyID0gJihjdXJyZW50LT5uZXh0KTsKLQkgICAgfQotCX0KLQotICAgICAgLyogQWRkIHRvIHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUuICAqLwotCi0gICAgICBhZnRlcl9iZmQgPSBnZXRfcG9zX2JmZCAoJmFyY2gtPm5leHQsIHBvc19lbmQsIE5VTEwpOwotICAgICAgdGVtcCA9ICphZnRlcl9iZmQ7Ci0gICAgICAqYWZ0ZXJfYmZkID0gYmZkX29wZW5yICgqZmlsZXNfdG9fbW92ZSwgTlVMTCk7Ci0gICAgICBpZiAoKmFmdGVyX2JmZCA9PSAoYmZkICopIE5VTEwpCi0JewotCSAgYmZkX2ZhdGFsICgqZmlsZXNfdG9fbW92ZSk7Ci0JfQotICAgICAgaWYgKHZlcmJvc2UpCi0JewotCSAgcHJpbnRmICgiYSAtICVzXG4iLCAqZmlsZXNfdG9fbW92ZSk7Ci0JfQotCi0gICAgICAoKmFmdGVyX2JmZCktPm5leHQgPSB0ZW1wOwotCi0gICAgICBjaGFuZ2VkID0gdHJ1ZTsKLQotICAgIG5leHRfZmlsZTo7Ci0KLSAgICAgIGZpbGVzX3RvX21vdmUrKzsKLSAgICB9Ci0KLSAgaWYgKGNoYW5nZWQpCi0gICAgd3JpdGVfYXJjaGl2ZSAoYXJjaCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yYW5saWJfb25seSAoYXJjaG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2huYW1lOwotewotICBiZmQgKmFyY2g7Ci0KLSAgd3JpdGVfYXJtYXAgPSAxOwotICBhcmNoID0gb3Blbl9pbmFyY2ggKGFyY2huYW1lLCAoY2hhciAqKSBOVUxMKTsKLSAgaWYgKGFyY2ggPT0gTlVMTCkKLSAgICB4ZXhpdCAoMSk7Ci0gIHdyaXRlX2FyY2hpdmUgKGFyY2gpOwotfQotCi0vKiBVcGRhdGUgdGhlIHRpbWVzdGFtcCBvZiB0aGUgc3ltYm9sIG1hcCBvZiBhbiBhcmNoaXZlLiAgKi8KLQotc3RhdGljIHZvaWQKLXJhbmxpYl90b3VjaCAoYXJjaG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2huYW1lOwotewotI2lmZGVmIF9fR08zMl9fCi0gIC8qIEkgZG9uJ3QgdGhpbmsgdXBkYXRpbmcgd29ya3Mgb24gZ28zMi4gICovCi0gIHJhbmxpYl9vbmx5IChhcmNobmFtZSk7Ci0jZWxzZQotICBpbnQgZjsKLSAgYmZkICphcmNoOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0KLSAgZiA9IG9wZW4gKGFyY2huYW1lLCBPX1JEV1IsIDApOwotICBpZiAoZiA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIGJmZF9mYXRhbCAoYXJjaG5hbWUpOwotICAgIH0KLQotICBhcmNoID0gYmZkX2Zkb3BlbnIgKGFyY2huYW1lLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmKTsKLSAgaWYgKGFyY2ggPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGFyY2huYW1lKTsKLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhcmNoLCBiZmRfYXJjaGl2ZSwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGFyY2huYW1lKTsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICBmcmVlIChtYXRjaGluZyk7Ci0JfQotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoISBiZmRfaGFzX21hcCAoYXJjaCkpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiJXM6IG5vIGFyY2hpdmUgbWFwIHRvIHVwZGF0ZSIpLCBhcmNobmFtZSk7Ci0KLSAgYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgKGFyY2gpOwotCi0gIGlmICghIGJmZF9jbG9zZSAoYXJjaCkpCi0gICAgYmZkX2ZhdGFsIChhcmNobmFtZSk7Ci0jZW5kaWYKLX0KLQotLyogVGhpbmdzIHdoaWNoIGFyZSBpbnRlcmVzdGluZyB0byBtYXAgb3ZlciBhbGwgb3Igc29tZSBvZiB0aGUgZmlsZXM6ICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9kZXNjciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBwcmludF9hcmVsdF9kZXNjciAoc3Rkb3V0LCBhYmZkLCB2ZXJib3NlKTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FybGV4LmwgYi9iaW51dGlscy9hcmxleC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGUxM2QxLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2FybGV4LmwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0lewotLyogYXJsZXgubCAtIFN0cmFuZ2Ugc2NyaXB0IGxhbmd1YWdlIGxleGVyICovCi0KLS8qICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gICAJCSAgc2FjQGN5Z251cy5jb20KLQotKi8KLSNkZWZpbmUgRE9OVERFQ0xBUkVfTUFMTE9DCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJhcnBhcnNlLmgiCi0KLWludCBsaW5lbnVtYmVyOwotJX0KLSUlCi0KLSJBRERMSUIiICAgCXsgcmV0dXJuIEFERExJQjsgfQotIkFERE1PRCIgICAJeyByZXR1cm4gQURETU9EOyB9Ci0iQ0xFQVIiICAgCXsgcmV0dXJuIENMRUFSOyB9Ci0iQ1JFQVRFIiAgIAl7IHJldHVybiBDUkVBVEU7IH0KLSJERUxFVEUiICAgCXsgcmV0dXJuIERFTEVURTsgfQotIkRJUkVDVE9SWSIgICAJeyByZXR1cm4gRElSRUNUT1JZOyB9Ci0iRU5EIiAgIAl7IHJldHVybiBFTkQ7IH0KLSJFWFRSQUNUIiAgIAl7IHJldHVybiBFWFRSQUNUOyB9Ci0iRlVMTERJUiIgICAJeyByZXR1cm4gRlVMTERJUjsgfQotIkhFTFAiICAgCXsgcmV0dXJuIEhFTFA7IH0KLSJMSVNUIgkJeyByZXR1cm4gTElTVDsgfQotIk9QRU4iICAgCXsgcmV0dXJuIE9QRU47IH0KLSJSRVBMQUNFIiAgIAl7IHJldHVybiBSRVBMQUNFOyB9Ci0iVkVSQk9TRSIgICAJeyByZXR1cm4gVkVSQk9TRTsgfQotIlNBVkUiICAgCXsgcmV0dXJuIFNBVkU7IH0KLSJhZGRsaWIiICAgCXsgcmV0dXJuIEFERExJQjsgfQotImFkZG1vZCIgICAJeyByZXR1cm4gQURETU9EOyB9Ci0iY2xlYXIiICAgCXsgcmV0dXJuIENMRUFSOyB9Ci0iY3JlYXRlIiAgIAl7IHJldHVybiBDUkVBVEU7IH0KLSJkZWxldGUiICAgCXsgcmV0dXJuIERFTEVURTsgfQotImRpcmVjdG9yeSIgICAJeyByZXR1cm4gRElSRUNUT1JZOyB9Ci0iZW5kIiAgIAl7IHJldHVybiBFTkQ7IH0KLSJleHRyYWN0IiAgIAl7IHJldHVybiBFWFRSQUNUOyB9Ci0iZnVsbGRpciIgICAJeyByZXR1cm4gRlVMTERJUjsgfQotImhlbHAiICAgCXsgcmV0dXJuIEhFTFA7IH0KLSJsaXN0IgkJeyByZXR1cm4gTElTVDsgfQotIm9wZW4iICAgCXsgcmV0dXJuIE9QRU47IH0KLSJyZXBsYWNlIiAgIAl7IHJldHVybiBSRVBMQUNFOyB9Ci0idmVyYm9zZSIgICAJeyByZXR1cm4gVkVSQk9TRTsgfQotInNhdmUiICAgCXsgcmV0dXJuIFNBVkU7IH0KLSIrXG4iICAgICAgICAgICB7IGxpbmVudW1iZXIgKys7IH0KLSIoIiAgICAgICAgICAgICB7IHJldHVybiAnKCc7IH0KLSIpIiAgICAgICAgICAgICB7IHJldHVybiAnKSc7IH0KLSIsIiAgICAgICAgICAgICB7IHJldHVybiAnLCc7IH0KLVtBLVphLXowLTkvJDouXC1cX10rICB7IAkKLQkJeXlsdmFsLm5hbWUgPSAgeHN0cmR1cCAoeXl0ZXh0KTsKLQkJcmV0dXJuIEZJTEVOQU1FOwotCQl9Ci0iKiIuKiAJCXsgfQotIjsiLiogCQl7IH0KLSIgIgkJeyB9Ci0iXG4iCSAJIHsgbGluZW51bWJlciArKzsgcmV0dXJuIE5FV0xJTkU7IH0JCi0KLSUlCi0jaWZuZGVmIHl5d3JhcAotLyogTmVlZGVkIGZvciBsZXgsIHRob3VnaCBub3QgZmxleC4gKi8KLWludCB5eXdyYXAoKSB7IHJldHVybiAxOyB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FycGFyc2UueSBiL2JpbnV0aWxzL2FycGFyc2UueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjNzYwMC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hcnBhcnNlLnkKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotJXsKLS8qIGFycGFyc2UueSAtIFN0YW5nZSBzY3JpcHQgbGFuZ3VhZ2UgcGFyc2VyICovCi0KLS8qICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTUsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gICAJCSAgc2FjQGN5Z251cy5jb20KLQotKi8KLSNkZWZpbmUgRE9OVERFQ0xBUkVfTUFMTE9DCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAiYXJzdXAuaCIKLWV4dGVybiBpbnQgdmVyYm9zZTsKLWV4dGVybiBpbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotJX0KLQotJXVuaW9uIHsKLSAgY2hhciAqbmFtZTsKLXN0cnVjdCBsaXN0ICpsaXN0IDsKLQotfTsKLQotJXRva2VuIE5FV0xJTkUKLSV0b2tlbiBWRVJCT1NFCi0ldG9rZW4gPG5hbWU+IEZJTEVOQU1FCi0ldG9rZW4gQURETElCCi0ldG9rZW4gTElTVAotJXRva2VuIEFERE1PRAotJXRva2VuIENMRUFSCi0ldG9rZW4gQ1JFQVRFCi0ldG9rZW4gREVMRVRFCi0ldG9rZW4gRElSRUNUT1JZCi0ldG9rZW4gRU5ECi0ldG9rZW4gRVhUUkFDVAotJXRva2VuIEZVTExESVIKLSV0b2tlbiBIRUxQCi0ldG9rZW4gUVVJVAotJXRva2VuIFJFUExBQ0UKLSV0b2tlbiBTQVZFCi0ldG9rZW4gT1BFTgotCi0ldHlwZSA8bGlzdD4gbW9kdWxlbGlzdCAKLSV0eXBlIDxsaXN0PiBtb2R1bGVuYW1lCi0ldHlwZSA8bmFtZT4gb3B0aW9uYWxfZmlsZW5hbWUKLSUlCi0KLXN0YXJ0OgotCXsgcHJvbXB0KCk7IH0gc2Vzc2lvbgotCTsKLQotc2Vzc2lvbjoKLQkgICAgc2Vzc2lvbiBjb21tYW5kX2xpbmUKLQl8Ci0JOwotCi1jb21tYW5kX2xpbmU6Ci0JCWNvbW1hbmQgTkVXTElORSB7IHByb21wdCgpOyB9Ci0KLWNvbW1hbmQ6Ci0JCW9wZW5fY29tbWFuZAkKLQl8CWNyZWF0ZV9jb21tYW5kCQotCXwgCXZlcmJvc2VfY29tbWFuZAotCXwJZGlyZWN0b3J5X2NvbW1hbmQKLQl8CWFkZGxpYl9jb21tYW5kCi0JfAljbGVhcl9jb21tYW5kCi0JfAlhZGRtb2RfY29tbWFuZAotCXwgCXNhdmVfY29tbWFuZAotICAgICAgICB8ICAgICAgIGV4dHJhY3RfY29tbWFuZAotCXwJcmVwbGFjZV9jb21tYW5kCi0JfAlkZWxldGVfY29tbWFuZAotCXwJbGlzdF9jb21tYW5kCi0JfCAJRU5ECSB7IGFyX2VuZCgpOyByZXR1cm4gMDsgfQotCXwgCWVycm9yCi0JfCAgICAgICBGSUxFTkFNRSB7IHl5ZXJyb3IoImZvbyIpOyB9Ci0JfAotCTsKLQotCi1leHRyYWN0X2NvbW1hbmQ6Ci0gICAgICAgICAgICAgICAgRVhUUkFDVCBtb2R1bGVuYW1lCi0JCXsgYXJfZXh0cmFjdCgkMik7IH0KLQk7Ci0KLXJlcGxhY2VfY29tbWFuZDoJCi0JCVJFUExBQ0UgbW9kdWxlbmFtZQotCQl7IGFyX3JlcGxhY2UoJDIpOyB9Ci0JOwotCQotY2xlYXJfY29tbWFuZDoKLQkJQ0xFQVIKLQkJeyBhcl9jbGVhcigpOyB9Ci0JOwotCi1kZWxldGVfY29tbWFuZDoKLQkJREVMRVRFIG1vZHVsZW5hbWUKLQkJeyBhcl9kZWxldGUoJDIpOyB9Ci0JOwotYWRkbW9kX2NvbW1hbmQ6Ci0JQURETU9EIG1vZHVsZW5hbWUKLQkJeyBhcl9hZGRtb2QoJDIpOyB9Ci0JOwotCi1saXN0X2NvbW1hbmQ6CQotCQlMSVNUCi0JCXsgYXJfbGlzdCgpOyB9Ci0JOwotCi1zYXZlX2NvbW1hbmQ6CQotCQlTQVZFCi0JCXsgYXJfc2F2ZSgpOyB9Ci0JOwotCi0KLQotb3Blbl9jb21tYW5kOgotCQlPUEVOIEZJTEVOQU1FIAotCQl7IGFyX29wZW4oJDIsMCk7IH0KLQk7Ci0KLWNyZWF0ZV9jb21tYW5kOgotCQlDUkVBVEUgRklMRU5BTUUgCi0JCXsgYXJfb3BlbigkMiwxKTsgfQotCTsKLQotCi1hZGRsaWJfY29tbWFuZDoKLQkJQURETElCIEZJTEVOQU1FIG1vZHVsZWxpc3QKLQkJeyBhcl9hZGRsaWIoJDIsJDMpOyB9Ci0JOwotZGlyZWN0b3J5X2NvbW1hbmQ6Ci0JCURJUkVDVE9SWSBGSUxFTkFNRSBtb2R1bGVsaXN0IG9wdGlvbmFsX2ZpbGVuYW1lCi0JCXsgYXJfZGlyZWN0b3J5KCQyLCAkMywgJDQpOyB9Ci0JOwotCi0KLQotb3B0aW9uYWxfZmlsZW5hbWU6Ci0JCUZJTEVOQU1FCi0JCXsgJCQgPSAkMTsgfQotCXwJeyAkJCA9IDA7IH0KLQk7Ci0KLW1vZHVsZWxpc3Q6Ci0JJygnIG1vZHVsZW5hbWUgJyknIAotCQl7ICQkID0gJDI7IH0KLQl8Ci0JCXsgJCQgPSAwOyB9Ci0JOwotCi1tb2R1bGVuYW1lOgotCQltb2R1bGVuYW1lIG9wdGNvbW1hIEZJTEVOQU1FCi0JCXsgCXN0cnVjdCBsaXN0ICpuICA9IChzdHJ1Y3QgbGlzdCAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXN0KSk7Ci0JCQluLT5uZXh0ID0gJDE7IAotCQkJbi0+bmFtZSA9ICQzOwotCQkJJCQgPSBuOwotCQkgfQotCXwJeyAkJCA9IDA7IH0KLQk7Ci0JCi0KLW9wdGNvbW1hOgotCQknLCcKLQl8Ci0JOwotCQotCQkKLXZlcmJvc2VfY29tbWFuZDoKLQlWRVJCT1NFIAotCQl7IHZlcmJvc2UgPSAhdmVyYm9zZTsgfQotCTsKLQotCi0lJQotCi1zdGF0aWMgaW50Ci15eWVycm9yICh4KQotICAgICBjb25zdCBjaGFyICp4OwotewotICBleHRlcm4gaW50IGxpbmVudW1iZXI7Ci0KLSAgcHJpbnRmIChfKCJTeW50YXggZXJyb3IgaW4gYXJjaGl2ZSBzY3JpcHQsIGxpbmUgJWRcbiIpLCBsaW5lbnVtYmVyICsgMSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYXJzdXAuYyBiL2JpbnV0aWxzL2Fyc3VwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZmQ2OTUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYXJzdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NiArMCwwIEBACi0vKiBhcnN1cC5jIC0gQXJjaGl2ZSBzdXBwb3J0IGZvciBNUkkgY29tcGF0aWJpbGl0eQotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gICAJCSAgc2FjQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGxvb2tzIGFmdGVyIHJlcXVlc3RzIGZyb20gYXJwYXJzZS55LCB0byBwcm92aWRlIHRoZSBNUkkKLXN0eWxlIGxpYnJhcmlhbiBjb21tYW5kIHN5bnRheCArIDEgd29yZCBMSVNUCi0KLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJhcnN1cC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi1zdGF0aWMgdm9pZCBtYXBfb3Zlcl9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCB2b2lkICgqZnVuY3Rpb24pIChiZmQgKiwgYmZkICopLCBzdHJ1Y3QgbGlzdCAqKSk7Ci1zdGF0aWMgdm9pZCBhcl9kaXJlY3RvcnlfZG9lciBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIGFyX2FkZGxpYl9kb2VyIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi1leHRlcm4gaW50IHZlcmJvc2U7Ci0KLXN0YXRpYyB2b2lkCi1tYXBfb3Zlcl9saXN0IChhcmNoLCBmdW5jdGlvbiwgbGlzdCkKLSAgICAgYmZkICphcmNoOwotICAgICB2b2lkICgqZnVuY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotICAgICBzdHJ1Y3QgbGlzdCAqbGlzdDsKLXsKLSAgYmZkICpoZWFkOwotCi0gIGlmIChsaXN0ID09IE5VTEwpCi0gICAgewotICAgICAgYmZkICpuZXh0OwotCi0gICAgICBoZWFkID0gYXJjaC0+bmV4dDsKLSAgICAgIHdoaWxlIChoZWFkICE9IE5VTEwpCi0JewotCSAgbmV4dCA9IGhlYWQtPm5leHQ7Ci0JICBmdW5jdGlvbiAoaGVhZCwgKGJmZCAqKSBOVUxMKTsKLQkgIGhlYWQgPSBuZXh0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbGlzdCAqcHRyOwotCi0gICAgICAvKiBUaGlzIG1heSBhcHBlYXIgdG8gYmUgYSBiYXJvcXVlIHdheSBvZiBhY2NvbXBsaXNoaW5nIHdoYXQgd2UKLQkgd2FudC4gIGhvd2V2ZXIgd2UgaGF2ZSB0byBpdGVyYXRlIG92ZXIgdGhlIGZpbGVuYW1lcyBpbiBvcmRlcgotCSB0byBub3RpY2Ugd2hlcmUgYSBmaWxlbmFtZSBpcyByZXF1ZXN0ZWQgYnV0IGRvZXMgbm90IGV4aXN0IGluCi0JIHRoZSBhcmNoaXZlLiAgRGl0dG8gbWFwcGluZyBvdmVyIGVhY2ggZmlsZSBlYWNoIHRpbWUgLS0gd2UKLQkgd2FudCB0byBoYWNrIG11bHRpcGxlIHJlZmVyZW5jZXMuICAqLwotICAgICAgZm9yIChwdHIgPSBsaXN0OyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkKLQl7Ci0JICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JICBiZmQgKnByZXYgPSBhcmNoOwotCi0JICBmb3IgKGhlYWQgPSBhcmNoLT5uZXh0OyBoZWFkOyBoZWFkID0gaGVhZC0+bmV4dCkgCi0JICAgIHsKLQkgICAgICBpZiAoaGVhZC0+ZmlsZW5hbWUgIT0gTlVMTAotCQkgICYmIHN0cmNtcCAocHRyLT5uYW1lLCBoZWFkLT5maWxlbmFtZSkgPT0gMCkKLQkJewotCQkgIGZvdW5kID0gdHJ1ZTsKLQkJICBmdW5jdGlvbiAoaGVhZCwgcHJldik7Ci0JCX0KLQkgICAgICBwcmV2ID0gaGVhZDsKLQkgICAgfQotCSAgaWYgKCEgZm91bmQpCi0JICAgIGZwcmludGYgKHN0ZGVyciwgXygiTm8gZW50cnkgJXMgaW4gYXJjaGl2ZS5cbiIpLCBwdHItPm5hbWUpOwotCX0KLSAgICB9Ci19Ci0KLQotRklMRSAqb3V0ZmlsZTsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotYXJfZGlyZWN0b3J5X2RvZXIgKGFiZmQsIGlnbm9yZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmQgKmlnbm9yZTsKLXsKLSAgICBwcmludF9hcmVsdF9kZXNjcihvdXRmaWxlLCBhYmZkLCB2ZXJib3NlKTsKLX0KLQotdm9pZAotYXJfZGlyZWN0b3J5IChhcl9uYW1lLCBsaXN0LCBvdXRwdXQpCi0gICAgIGNoYXIgKmFyX25hbWU7Ci0gICAgIHN0cnVjdCBsaXN0ICpsaXN0OwotICAgICBjaGFyICpvdXRwdXQ7Ci17Ci0gIGJmZCAqYXJjaDsKLQotICBhcmNoID0gb3Blbl9pbmFyY2ggKGFyX25hbWUsIChjaGFyICopIE5VTEwpOwotICBpZiAob3V0cHV0KQotICAgIHsKLSAgICAgIG91dGZpbGUgPSBmb3BlbihvdXRwdXQsInciKTsKLSAgICAgIGlmIChvdXRmaWxlID09IDApCi0JewotCSAgb3V0ZmlsZSA9IHN0ZG91dDsKLQkgIGZwcmludGYgKHN0ZGVycixfKCJDYW4ndCBvcGVuIGZpbGUgJXNcbiIpLCBvdXRwdXQpOwotCSAgb3V0cHV0ID0gMDsKLQl9Ci0gICAgfQotICBlbHNlIAotICAgIG91dGZpbGUgPSBzdGRvdXQ7Ci0KLSAgbWFwX292ZXJfbGlzdCAoYXJjaCwgYXJfZGlyZWN0b3J5X2RvZXIsIGxpc3QpOwotCi0gIGJmZF9jbG9zZSAoYXJjaCk7Ci0KLSAgaWYgKG91dHB1dCkKLSAgIGZjbG9zZSAob3V0ZmlsZSk7Ci19Ci0KLXZvaWQKLURFRlVOX1ZPSUQocHJvbXB0KQotewotICBleHRlcm4gaW50IGludGVyYWN0aXZlOwotICBpZiAoaW50ZXJhY3RpdmUpIAotICB7Ci0gICAgcHJpbnRmKCJBUiA+Iik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7IAotICB9Ci19Ci0KLXZvaWQKLW1heWJlcXVpdCAoKQotewotICBpZiAoISBpbnRlcmFjdGl2ZSkgCi0gICAgeGV4aXQgKDkpOwotfQotCi0KLWJmZCAqb2JmZDsKLWNoYXIgKnJlYWxfbmFtZSA7IAotdm9pZAotREVGVU4oYXJfb3BlbiwobmFtZSwgdCksCi0gICAgICBjaGFyICpuYW1lIEFORAotICAgICAgaW50IHQpCi0KLXsKLSAgY2hhciAqdG5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMTApOwotICByZWFsX25hbWUgPSBuYW1lOwotICBzcHJpbnRmKHRuYW1lLCAiJXMtdG1wIiwgbmFtZSk7Ci0gIG9iZmQgPSBiZmRfb3BlbncodG5hbWUsIE5VTEwpOwotCi0gIGlmICghb2JmZCkgewotICAgIGZwcmludGYoc3RkZXJyLF8oIiVzOiBDYW4ndCBvcGVuIG91dHB1dCBhcmNoaXZlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLAotCSAgICB0bmFtZSk7Ci0KLSAgICBtYXliZXF1aXQoKTsKLSAgfQotICBlbHNlIHsKLSAgICBpZiAoIXQpIHsKLSAgICAgIGJmZCAqKnB0cjsKLSAgICAgIGJmZCAqZWxlbWVudDsKLSAgICAgIGJmZCAqaWJmZDsKLSAgICAgIGliZmQgPSBiZmRfb3BlbnIobmFtZSwgTlVMTCk7Ci0gICAgICBpZiAoIWliZmQpIHsKLQlmcHJpbnRmKHN0ZGVycixfKCIlczogQ2FuJ3Qgb3BlbiBpbnB1dCBhcmNoaXZlICVzXG4iKSwKLQkJcHJvZ3JhbV9uYW1lLCBuYW1lKTsKLQltYXliZXF1aXQoKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAoYmZkX2NoZWNrX2Zvcm1hdChpYmZkLCBiZmRfYXJjaGl2ZSkgIT0gdHJ1ZSkgewotCWZwcmludGYoc3RkZXJyLF8oIiVzOiBmaWxlICVzIGlzIG5vdCBhbiBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lLAotCQluYW1lKTsKLQltYXliZXF1aXQoKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0gICAgICBwdHIgPSAmKG9iZmQtPmFyY2hpdmVfaGVhZCk7Ci0gICAgICBlbGVtZW50ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZShpYmZkLCBOVUxMKTsKLQotICAgICAgd2hpbGUgKGVsZW1lbnQpIHsKLQkqcHRyID0gZWxlbWVudDsKLQlwdHIgPSAmZWxlbWVudC0+bmV4dDsKLQllbGVtZW50ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZShpYmZkLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBiZmRfc2V0X2Zvcm1hdChvYmZkLCBiZmRfYXJjaGl2ZSk7Ci0KLSAgICBvYmZkLT5oYXNfYXJtYXAgPSAxOwotICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWFyX2FkZGxpYl9kb2VyIChhYmZkLCBwcmV2KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZCAqcHJldjsKLXsKLSAgLyogQWRkIHRoaXMgbW9kdWxlIHRvIHRoZSBvdXRwdXQgYmZkICovCi0gIGlmIChwcmV2ICE9IE5VTEwpCi0gICAgcHJldi0+bmV4dCA9IGFiZmQtPm5leHQ7Ci0gIGFiZmQtPm5leHQgPSBvYmZkLT5hcmNoaXZlX2hlYWQ7Ci0gIG9iZmQtPmFyY2hpdmVfaGVhZCA9IGFiZmQ7Ci19Ci0KLXZvaWQKLWFyX2FkZGxpYiAobmFtZSwgbGlzdCkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IGxpc3QgKmxpc3Q7Ci17Ci0gIGlmIChvYmZkID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gb3V0cHV0IGFyY2hpdmUgc3BlY2lmaWVkIHlldFxuIiksIHByb2dyYW1fbmFtZSk7Ci0gICAgICBtYXliZXF1aXQgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkICphcmNoOwotCi0gICAgICBhcmNoID0gb3Blbl9pbmFyY2ggKG5hbWUsIChjaGFyICopIE5VTEwpOwotICAgICAgaWYgKGFyY2ggIT0gTlVMTCkKLQltYXBfb3Zlcl9saXN0IChhcmNoLCBhcl9hZGRsaWJfZG9lciwgbGlzdCk7Ci0KLSAgICAgIC8qIERvbid0IGNsb3NlIHRoZSBiZmQsIHNpbmNlIGl0IHdpbGwgbWFrZSB0aGUgZWxlbWVudHMgZGlzYXNwcGVhciAqLwotICAgIH0KLX0KLQotdm9pZAotREVGVU4oYXJfYWRkbW9kLCAobGlzdCksCi0gICAgICBzdHJ1Y3QgbGlzdCAqbGlzdCkKLXsKLSAgaWYgKCFvYmZkKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBubyBvcGVuIG91dHB1dCBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICBtYXliZXF1aXQoKTsKLSAgfQotICBlbHNlIAotICB7Ci0gICAgd2hpbGUgKGxpc3QpIHsKLSAgICAgIGJmZCAqYWJmZCA9IGJmZF9vcGVucihsaXN0LT5uYW1lLCBOVUxMKTsKLSAgICAgIGlmICghYWJmZCkgIHsKLQlmcHJpbnRmKHN0ZGVycixfKCIlczogY2FuJ3Qgb3BlbiBmaWxlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLAotCQlsaXN0LT5uYW1lKTsKLQltYXliZXF1aXQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotCWFiZmQtPm5leHQgPSBvYmZkLT5hcmNoaXZlX2hlYWQ7Ci0Jb2JmZC0+YXJjaGl2ZV9oZWFkID0gYWJmZDsKLSAgICAgIH0KLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgIH0KLSAgfQotfQotCi0KLQotdm9pZAotREVGVU5fVk9JRChhcl9jbGVhcikKLXsKLWlmIChvYmZkKSAKLSBvYmZkLT5hcmNoaXZlX2hlYWQgPSAwOwotfQotCi12b2lkCi1ERUZVTihhcl9kZWxldGUsIChsaXN0KSwKLSAgICAgIHN0cnVjdCBsaXN0ICpsaXN0KQotewotICBpZiAoIW9iZmQpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IG5vIG9wZW4gb3V0cHV0IGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgIG1heWJlcXVpdCgpOwotICB9Ci0gIGVsc2UgCi0gIHsKLSAgICB3aGlsZSAobGlzdCkgewotICAgICAgLyogRmluZCB0aGlzIG5hbWUgaW4gdGhlIGFyY2hpdmUgKi8KLSAgICAgIGJmZCAqbWVtYmVyID0gb2JmZC0+YXJjaGl2ZV9oZWFkOwotICAgICAgYmZkICoqcHJldiA9ICYob2JmZC0+YXJjaGl2ZV9oZWFkKTsKLSAgICAgIGludCBmb3VuZCA9IDA7Ci0gICAgICB3aGlsZSAobWVtYmVyKSB7Ci0JaWYgKHN0cmNtcChtZW1iZXItPmZpbGVuYW1lLCBsaXN0LT5uYW1lKSA9PSAwKSB7Ci0JICAqcHJldiA9IG1lbWJlci0+bmV4dDsKLQkgIGZvdW5kID0gMTsKLQl9Ci0JZWxzZSB7Ci0JICBwcmV2ID0gJihtZW1iZXItPm5leHQpOwotCX0KLQkgIG1lbWJlciA9IG1lbWJlci0+bmV4dDsKLSAgICAgIH0KLSAgICAgIGlmICghZm91bmQpICB7Ci0JZnByaW50ZihzdGRlcnIsXygiJXM6IGNhbid0IGZpbmQgbW9kdWxlIGZpbGUgJXNcbiIpLCBwcm9ncmFtX25hbWUsCi0JCWxpc3QtPm5hbWUpOwotCW1heWJlcXVpdCgpOwotICAgICAgfQotICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgfQotICB9Ci19Ci0KLQotdm9pZAotREVGVU5fVk9JRChhcl9zYXZlKQotewotCi0gIGlmICghb2JmZCkgewotICAgIGZwcmludGYoc3RkZXJyLCBfKCIlczogbm8gb3BlbiBvdXRwdXQgYXJjaGl2ZVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gICAgbWF5YmVxdWl0KCk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgY2hhciAqb2ZpbGVuYW1lID0geHN0cmR1cCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotICAgIGJmZF9jbG9zZShvYmZkKTsKLSAgICAKLSAgICByZW5hbWUgKG9maWxlbmFtZSwgcmVhbF9uYW1lKTsKLSAgICBvYmZkID0gMDsKLSAgICBmcmVlKG9maWxlbmFtZSk7Ci0gIH0KLX0KLQotCi0KLXZvaWQKLURFRlVOKGFyX3JlcGxhY2UsIChsaXN0KSwKLSAgICAgIHN0cnVjdCBsaXN0ICpsaXN0KQotewotICBpZiAoIW9iZmQpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IG5vIG9wZW4gb3V0cHV0IGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgIG1heWJlcXVpdCgpOwotICB9Ci0gIGVsc2UgCi0gIHsKLSAgICB3aGlsZSAobGlzdCkgewotICAgICAgLyogRmluZCB0aGlzIG5hbWUgaW4gdGhlIGFyY2hpdmUgKi8KLSAgICAgIGJmZCAqbWVtYmVyID0gb2JmZC0+YXJjaGl2ZV9oZWFkOwotICAgICAgYmZkICoqcHJldiA9ICYob2JmZC0+YXJjaGl2ZV9oZWFkKTsKLSAgICAgIGludCBmb3VuZCA9IDA7Ci0gICAgICB3aGlsZSAobWVtYmVyKSAKLSAgICAgIHsKLQlpZiAoc3RyY21wKG1lbWJlci0+ZmlsZW5hbWUsIGxpc3QtPm5hbWUpID09IDApIAotCXsKLQkgIC8qIEZvdW5kIHRoZSBvbmUgdG8gcmVwbGFjZSAqLwotCSAgYmZkICphYmZkID0gYmZkX29wZW5yKGxpc3QtPm5hbWUsIDApOwotCSAgaWYgKCFhYmZkKSAKLQkgIHsKLQkgICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBjYW4ndCBvcGVuIGZpbGUgJXNcbiIpLCBwcm9ncmFtX25hbWUsIGxpc3QtPm5hbWUpOwotCSAgICBtYXliZXF1aXQoKTsKLQkgIH0KLQkgIGVsc2UgewotCSAgICAqcHJldiA9IGFiZmQ7Ci0JICAgIGFiZmQtPm5leHQgPSBtZW1iZXItPm5leHQ7Ci0JICAgIGZvdW5kID0gMTsKLQkgIH0KLQl9Ci0JZWxzZSB7Ci0JICBwcmV2ID0gJihtZW1iZXItPm5leHQpOwotCX0KLQltZW1iZXIgPSBtZW1iZXItPm5leHQ7Ci0gICAgICB9Ci0gICAgICBpZiAoIWZvdW5kKSAgewotCWJmZCAqYWJmZCA9IGJmZF9vcGVucihsaXN0LT5uYW1lLCAwKTsKLQlmcHJpbnRmKHN0ZGVycixfKCIlczogY2FuJ3QgZmluZCBtb2R1bGUgZmlsZSAlc1xuIiksIHByb2dyYW1fbmFtZSwKLQkJbGlzdC0+bmFtZSk7Ci0JaWYgKCFhYmZkKSAKLQl7Ci0JICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IGNhbid0IG9wZW4gZmlsZSAlc1xuIiksIHByb2dyYW1fbmFtZSwgbGlzdC0+bmFtZSk7Ci0JICBtYXliZXF1aXQoKTsKLQl9Ci0JZWxzZSAKLQl7Ci0JICAqcHJldiA9IGFiZmQ7Ci0JfQotICAgICAgfQotCi0gICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgfQotICB9Ci19Ci0KLS8qIEFuZCBJIGFkZGVkIHRoaXMgb25lICovCi12b2lkCi1ERUZVTl9WT0lEKGFyX2xpc3QpCi17Ci0gIGlmICghb2JmZCkgCi0gIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IG5vIG9wZW4gb3V0cHV0IGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgIG1heWJlcXVpdCgpOwotICB9Ci0gIGVsc2UgewotICAgIGJmZCAqYWJmZDsKLSAgICBvdXRmaWxlID0gc3Rkb3V0OwotICAgIHZlcmJvc2UgPTEgOwotICAgIHByaW50ZihfKCJDdXJyZW50IG9wZW4gYXJjaGl2ZSBpcyAlc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLSAgICBmb3IgKGFiZmQgPSBvYmZkLT5hcmNoaXZlX2hlYWQ7Ci0JIGFiZmQgIT0gKGJmZCAqKU5VTEw7Ci0JIGFiZmQgPSBhYmZkLT5uZXh0KSAKLSAgICB7Ci0gICAgICBhcl9kaXJlY3RvcnlfZG9lciAoYWJmZCwgKGJmZCAqKSBOVUxMKTsKLSAgICB9Ci0gIH0KLX0KLQotCi12b2lkIAotREVGVU5fVk9JRChhcl9lbmQpCi17Ci0gIGlmIChvYmZkKQotICB7Ci0gICAgZmNsb3NlKChGSUxFICopKG9iZmQtPmlvc3RyZWFtKSk7Ci0gICAgdW5saW5rKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLSAgfQotfQotdm9pZAotREVGVU4oYXJfZXh0cmFjdCwobGlzdCksCi0gICAgICBzdHJ1Y3QgbGlzdCAqbGlzdCkKLXsKLSAgaWYgKCFvYmZkKSAKLSAgewotCi0gICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBubyBvcGVuICBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICBtYXliZXF1aXQoKTsKLSAgfQotICBlbHNlIAotICB7Ci0gICAgd2hpbGUgKGxpc3QpIHsKLSAgICAgIC8qIEZpbmQgdGhpcyBuYW1lIGluIHRoZSBhcmNoaXZlICovCi0gICAgICBiZmQgKm1lbWJlciA9IG9iZmQtPmFyY2hpdmVfaGVhZDsKLSAgICAgIGludCBmb3VuZCA9IDA7Ci0gICAgICB3aGlsZSAobWVtYmVyICYmICFmb3VuZCkgCi0gICAgICB7Ci0JaWYgKHN0cmNtcChtZW1iZXItPmZpbGVuYW1lLCBsaXN0LT5uYW1lKSA9PSAwKSAKLQl7Ci0JICBleHRyYWN0X2ZpbGUobWVtYmVyKTsKLQkgIGZvdW5kID0gMTsKLQkgIH0KLQotCW1lbWJlciA9IG1lbWJlci0+bmV4dDsKLSAgICAgIH0KLSAgICAgIGlmICghZm91bmQpICB7Ci0JYmZkX29wZW5yKGxpc3QtPm5hbWUsIDApOwotCWZwcmludGYoc3RkZXJyLF8oIiVzOiBjYW4ndCBmaW5kIG1vZHVsZSBmaWxlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLAotCQlsaXN0LT5uYW1lKTsKLQotICAgICAgfQotICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9hcnN1cC5oIGIvYmludXRpbHMvYXJzdXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU0YTM0Yi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hcnN1cC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyogYXJzdXAuaCAtIGFyY2hpdmUgc3VwcG9ydCBoZWFkZXIgZmlsZQotICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotc3RydWN0IGxpc3QgewotCWNoYXIgKm5hbWU7CQotCXN0cnVjdCBsaXN0ICpuZXh0OwotfTsKLQotdm9pZAotbWF5YmVxdWl0IFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZAotcHJvbXB0IFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZAotYXJfY2xlYXIgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi1hcl9yZXBsYWNlIFBBUkFNUyAoKHN0cnVjdCBsaXN0ICopKTsKLQotdm9pZAotYXJfZGVsZXRlIFBBUkFNUyAoKHN0cnVjdCBsaXN0ICopKTsKLQotdm9pZAotYXJfc2F2ZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQKLWFyX2xpc3QgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi1hcl9vcGVuIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0KLXZvaWQKLWFyX2RpcmVjdG9yeSBQQVJBTVMgKChjaGFyICosIHN0cnVjdCBsaXN0ICosIGNoYXIgKikpOwotCi12b2lkCi1hcl9hZGRtb2QgUEFSQU1TICgoc3RydWN0IGxpc3QgKikpOwotCi12b2lkCi1hcl9hZGRsaWIgUEFSQU1TICgoY2hhciAqLCBzdHJ1Y3QgbGlzdCAqKSk7Ci0KLXZvaWQgCi1hcl9lbmQgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi1hcl9leHRyYWN0IFBBUkFNUyAoKHN0cnVjdCBsaXN0ICopKTsKLQotYmZkICoKLW9wZW5faW5hcmNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyY2hpdmVfZmlsZW5hbWUsIGNvbnN0IGNoYXIgKikpOwotCi1pbnQKLXl5cGFyc2UgUEFSQU1TICgodm9pZCkpOwotCi0vKiBGdW5jdGlvbnMgZnJvbSBhci5jICovCi0KLXZvaWQKLWV4dHJhY3RfZmlsZSBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci0KLWV4dGVybiBpbnQgaW50ZXJhY3RpdmU7CmRpZmYgLS1naXQgYS9iaW51dGlscy9iaW51dGlscy50ZXhpIGIvYmludXRpbHMvYmludXRpbHMudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQzMWE5NS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9iaW51dGlscy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjkwOSArMCwwIEBACi1caW5wdXQgdGV4aW5mbyAgICAgICBAYyAgICAgICAgICAgICAgICAgICAgLSotIFRleGluZm8gLSotCi1Ac2V0ZmlsZW5hbWUgYmludXRpbHMuaW5mbwotQGluY2x1ZGUgY29uZmlnLnRleGkKLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogQmludXRpbHM6IChiaW51dGlscykuICAgICAgICAgVGhlIEdOVSBiaW5hcnkgdXRpbGl0aWVzICJhciIsICJvYmpjb3B5IiwKLQkJCQkib2JqZHVtcCIsICJubSIsICJubG1jb252IiwgInNpemUiLCAicmVhZGVsZiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ3MiLCAic3RyaXAiLCAicmFubGliIiBhbmQgImRsbHRvb2wiLgotRU5ELUlORk8tRElSLUVOVFJZCi1AZW5kIGZvcm1hdAotQGVuZCBpZmluZm8KLQotQGlmaW5mbwotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBhIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0Ci10aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgaWZpbmZvCi0KLUBzeW5pbmRleCBreSBjcAotQGMKLUBjIFRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEdOVSBiaW5hcnkgdXRpbGl0aWVzICJhciIsICJsZCIsICJvYmpjb3B5IiwKLUBjICAib2JqZHVtcCIsICJubSIsICJzaXplIiwgInN0cmluZ3MiLCAic3RyaXAiLCAicmVhZGVsZiIgYW5kICJyYW5saWIiLgotQGMKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyAKLUBjIFRoaXMgdGV4dCBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCi1AYyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotQGMKLQotQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQHNldHRpdGxlIEBzY3tnbnV9IEJpbmFyeSBVdGlsaXRpZXMKLUB0aXRsZXBhZ2UKLUBmaW5hbG91dAotQHRpdGxlIFRoZSBAc2N7Z251fSBCaW5hcnkgVXRpbGl0aWVzCi1Ac3VidGl0bGUgVmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0KLUBzcCAxCi1Ac3VidGl0bGUgTWF5IDE5OTMKLUBhdXRob3IgUm9sYW5kIEguIFBlc2NoCi1AYXV0aG9yIEplZmZyZXkgTS4gT3NpZXIKLUBhdXRob3IgQ3lnbnVzIFN1cHBvcnQKLUBwYWdlCi0KLUB0ZXgKLXtccGFyc2tpcD0wcHQgXGhmaWxsIEN5Z251cyBTdXBwb3J0XHBhciBcaGZpbGwKLVxUZVh7fWluZm8gXHRleGluZm92ZXJzaW9uXHBhciB9Ci1AZW5kIHRleAotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKLXRoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCB0aXRsZXBhZ2UKLQotQG5vZGUgVG9wCi1AdG9wIEludHJvZHVjdGlvbgotCi1AY2luZGV4IHZlcnNpb24KLVRoaXMgYnJpZWYgbWFudWFsIGNvbnRhaW5zIHByZWxpbWluYXJ5IGRvY3VtZW50YXRpb24gZm9yIHRoZSBAc2N7Z251fSBiaW5hcnkKLXV0aWxpdGllcyAoY29sbGVjdGl2ZWx5IHZlcnNpb24gQHZhbHVle1ZFUlNJT059KTogCi0KLUBpZnRleAotQHRhYmxlIEBjb2RlCi1AaXRlbSBhcgotQ3JlYXRlLCBtb2RpZnksIGFuZCBleHRyYWN0IGZyb20gYXJjaGl2ZXMKLQotQGl0ZW0gbm0KLUxpc3Qgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcwotCi1AaXRlbSBvYmpjb3B5Ci1Db3B5IGFuZCB0cmFuc2xhdGUgb2JqZWN0IGZpbGVzCi0KLUBpdGVtIG9iamR1bXAKLURpc3BsYXkgaW5mb3JtYXRpb24gZnJvbSBvYmplY3QgZmlsZXMKLQotQGl0ZW0gcmFubGliCi1HZW5lcmF0ZSBpbmRleCB0byBhcmNoaXZlIGNvbnRlbnRzCi0KLUBpdGVtIHJlYWRlbGYKLURpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIEVMRiBmb3JtYXQgZmlsZXMuCi0KLUBpdGVtIHNpemUKLUxpc3QgZmlsZSBzZWN0aW9uIHNpemVzIGFuZCB0b3RhbCBzaXplCi0KLUBpdGVtIHN0cmluZ3MKLUxpc3QgcHJpbnRhYmxlIHN0cmluZ3MgZnJvbSBmaWxlcwotCi1AaXRlbSBzdHJpcAotRGlzY2FyZCBzeW1ib2xzCi0KLUBpdGVtIGMrK2ZpbHQKLURlbWFuZ2xlIGVuY29kZWQgQysrIHN5bWJvbHMKLQotQGl0ZW0gYWRkcjJsaW5lCi1Db252ZXJ0IGFkZHJlc3NlcyBpbnRvIGZpbGUgbmFtZXMgYW5kIGxpbmUgbnVtYmVycwotCi1AaXRlbSBubG1jb252Ci1Db252ZXJ0IG9iamVjdCBjb2RlIGludG8gYSBOZXR3YXJlIExvYWRhYmxlIE1vZHVsZQotCi1AaXRlbSB3aW5kcmVzCi1NYW5pcHVsYXRlIFdpbmRvd3MgcmVzb3VyY2VzCi0KLUBpdGVtIGRsbHRvb2wKLUNyZWF0ZSB0aGUgZmlsZXMgbmVlZGVkIHRvIGJ1aWxkIGFuZCB1c2UgRHluYW1pYyBMaW5rIExpYnJhcmllcwotQGVuZCB0YWJsZQotQGVuZCBpZnRleAotCi1AbWVudQotKiBhcjo6ICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUsIG1vZGlmeSwgYW5kIGV4dHJhY3QgZnJvbSBhcmNoaXZlcwotKiBubTo6ICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMKLSogb2JqY29weTo6CQkJQ29weSBhbmQgdHJhbnNsYXRlIG9iamVjdCBmaWxlcwotKiBvYmpkdW1wOjogICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IGluZm9ybWF0aW9uIGZyb20gb2JqZWN0IGZpbGVzCi0qIHJhbmxpYjo6ICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGluZGV4IHRvIGFyY2hpdmUgY29udGVudHMKLSogcmVhZGVsZjo6CQkJRGlzcGxheSB0aGUgY29udGVudHMgb2YgRUxGIGZvcm1hdCBmaWxlcy4KLSogc2l6ZTo6ICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBzZWN0aW9uIHNpemVzIGFuZCB0b3RhbCBzaXplCi0qIHN0cmluZ3M6OiAgICAgICAgICAgICAgICAgICAgIExpc3QgcHJpbnRhYmxlIHN0cmluZ3MgZnJvbSBmaWxlcwotKiBzdHJpcDo6ICAgICAgICAgICAgICAgICAgICAgICBEaXNjYXJkIHN5bWJvbHMKLSogYysrZmlsdDo6CQkJRmlsdGVyIHRvIGRlbWFuZ2xlIGVuY29kZWQgQysrIHN5bWJvbHMKLSogYWRkcjJsaW5lOjoJCQlDb252ZXJ0IGFkZHJlc3NlcyB0byBmaWxlIGFuZCBsaW5lCi0qIG5sbWNvbnY6OiAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRzIG9iamVjdCBjb2RlIGludG8gYW4gTkxNCi0qIHdpbmRyZXM6OgkJCU1hbmlwdWxhdGUgV2luZG93cyByZXNvdXJjZXMKLSogZGxsdG9vbDo6CQkJQ3JlYXRlIGZpbGVzIG5lZWRlZCB0byBidWlsZCBhbmQgdXNlIERMTHMKLSogU2VsZWN0aW5nIFRoZSBUYXJnZXQgU3lzdGVtOjogSG93IHRoZXNlIHV0aWxpdGllcyBkZXRlcm1pbmUgdGhlIHRhcmdldC4KLSogUmVwb3J0aW5nIEJ1Z3M6OiAgICAgICAgICAgICAgUmVwb3J0aW5nIEJ1Z3MKLSogSW5kZXg6OiAgICAgICAgICAgICAgICAgICAgICAgSW5kZXgKLUBlbmQgbWVudQotCi1Abm9kZSBhcgotQGNoYXB0ZXIgYXIKLQotQGtpbmRleCBhcgotQGNpbmRleCBhcmNoaXZlcwotQGNpbmRleCBjb2xsZWN0aW9ucyBvZiBmaWxlcwotQHNtYWxsZXhhbXBsZQotYXIgWy1dQHZhcntwfVtAdmFye21vZH0gW0B2YXJ7cmVscG9zfV1dIEB2YXJ7YXJjaGl2ZX0gW0B2YXJ7bWVtYmVyfUBkb3Rze31dCi1hciAtTSBbIDxtcmktc2NyaXB0IF0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAc2N7Z251fSBAY29kZXthcn0gcHJvZ3JhbSBjcmVhdGVzLCBtb2RpZmllcywgYW5kIGV4dHJhY3RzIGZyb20KLWFyY2hpdmVzLiAgQW4gQGRmbnthcmNoaXZlfSBpcyBhIHNpbmdsZSBmaWxlIGhvbGRpbmcgYSBjb2xsZWN0aW9uIG9mCi1vdGhlciBmaWxlcyBpbiBhIHN0cnVjdHVyZSB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJldHJpZXZlCi10aGUgb3JpZ2luYWwgaW5kaXZpZHVhbCBmaWxlcyAoY2FsbGVkIEBkZm57bWVtYmVyc30gb2YgdGhlIGFyY2hpdmUpLgotCi1UaGUgb3JpZ2luYWwgZmlsZXMnIGNvbnRlbnRzLCBtb2RlIChwZXJtaXNzaW9ucyksIHRpbWVzdGFtcCwgb3duZXIsIGFuZAotZ3JvdXAgYXJlIHByZXNlcnZlZCBpbiB0aGUgYXJjaGl2ZSwgYW5kIGNhbiBiZSByZXN0b3JlZCBvbgotZXh0cmFjdGlvbi4gIAotCi1AY2luZGV4IG5hbWUgbGVuZ3RoCi1Ac2N7Z251fSBAY29kZXthcn0gY2FuIG1haW50YWluIGFyY2hpdmVzIHdob3NlIG1lbWJlcnMgaGF2ZSBuYW1lcyBvZiBhbnkKLWxlbmd0aDsgaG93ZXZlciwgZGVwZW5kaW5nIG9uIGhvdyBAY29kZXthcn0gaXMgY29uZmlndXJlZCBvbiB5b3VyCi1zeXN0ZW0sIGEgbGltaXQgb24gbWVtYmVyLW5hbWUgbGVuZ3RoIG1heSBiZSBpbXBvc2VkIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIGFyY2hpdmUgZm9ybWF0cyBtYWludGFpbmVkIHdpdGggb3RoZXIgdG9vbHMuICBJZiBpdCBleGlzdHMsIHRoZQotbGltaXQgaXMgb2Z0ZW4gMTUgY2hhcmFjdGVycyAodHlwaWNhbCBvZiBmb3JtYXRzIHJlbGF0ZWQgdG8gYS5vdXQpIG9yIDE2Ci1jaGFyYWN0ZXJzICh0eXBpY2FsIG9mIGZvcm1hdHMgcmVsYXRlZCB0byBjb2ZmKS4KLQotQGNpbmRleCBsaWJyYXJpZXMKLUBjb2Rle2FyfSBpcyBjb25zaWRlcmVkIGEgYmluYXJ5IHV0aWxpdHkgYmVjYXVzZSBhcmNoaXZlcyBvZiB0aGlzIHNvcnQKLWFyZSBtb3N0IG9mdGVuIHVzZWQgYXMgQGRmbntsaWJyYXJpZXN9IGhvbGRpbmcgY29tbW9ubHkgbmVlZGVkCi1zdWJyb3V0aW5lcy4KLQotQGNpbmRleCBzeW1ib2wgaW5kZXgKLUBjb2Rle2FyfSBjcmVhdGVzIGFuIGluZGV4IHRvIHRoZSBzeW1ib2xzIGRlZmluZWQgaW4gcmVsb2NhdGFibGUKLW9iamVjdCBtb2R1bGVzIGluIHRoZSBhcmNoaXZlIHdoZW4geW91IHNwZWNpZnkgdGhlIG1vZGlmaWVyIEBzYW1we3N9LgotT25jZSBjcmVhdGVkLCB0aGlzIGluZGV4IGlzIHVwZGF0ZWQgaW4gdGhlIGFyY2hpdmUgd2hlbmV2ZXIgQGNvZGV7YXJ9Ci1tYWtlcyBhIGNoYW5nZSB0byBpdHMgY29udGVudHMgKHNhdmUgZm9yIHRoZSBAc2FtcHtxfSB1cGRhdGUgb3BlcmF0aW9uKS4KLUFuIGFyY2hpdmUgd2l0aCBzdWNoIGFuIGluZGV4IHNwZWVkcyB1cCBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5LCBhbmQKLWFsbG93cyByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSB0byBjYWxsIGVhY2ggb3RoZXIgd2l0aG91dCByZWdhcmQgdG8KLXRoZWlyIHBsYWNlbWVudCBpbiB0aGUgYXJjaGl2ZS4KLQotWW91IG1heSB1c2UgQHNhbXB7bm0gLXN9IG9yIEBzYW1we25tIC0tcHJpbnQtYXJtYXB9IHRvIGxpc3QgdGhpcyBpbmRleAotdGFibGUuICBJZiBhbiBhcmNoaXZlIGxhY2tzIHRoZSB0YWJsZSwgYW5vdGhlciBmb3JtIG9mIEBjb2Rle2FyfSBjYWxsZWQKLUBjb2Rle3JhbmxpYn0gY2FuIGJlIHVzZWQgdG8gYWRkIGp1c3QgdGhlIHRhYmxlLgotCi1AY2luZGV4IGNvbXBhdGliaWxpdHksIEBjb2Rle2FyfQotQGNpbmRleCBAY29kZXthcn0gY29tcGF0aWJpbGl0eQotQHNje2dudX0gQGNvZGV7YXJ9IGlzIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0d28gZGlmZmVyZW50Ci1mYWNpbGl0aWVzLiAgWW91IGNhbiBjb250cm9sIGl0cyBhY3Rpdml0eSB1c2luZyBjb21tYW5kLWxpbmUgb3B0aW9ucywKLWxpa2UgdGhlIGRpZmZlcmVudCB2YXJpZXRpZXMgb2YgQGNvZGV7YXJ9IG9uIFVuaXggc3lzdGVtczsgb3IsIGlmIHlvdQotc3BlY2lmeSB0aGUgc2luZ2xlIGNvbW1hbmQtbGluZSBvcHRpb24gQHNhbXB7LU19LCB5b3UgY2FuIGNvbnRyb2wgaXQKLXdpdGggYSBzY3JpcHQgc3VwcGxpZWQgdmlhIHN0YW5kYXJkIGlucHV0LCBsaWtlIHRoZSBNUkkgYGBsaWJyYXJpYW4nJwotcHJvZ3JhbS4KLQotQG1lbnUKLSogYXIgY21kbGluZTo6ICAgICAgICAgICAgICAgICAgQ29udHJvbGxpbmcgQGNvZGV7YXJ9IG9uIHRoZSBjb21tYW5kIGxpbmUKLSogYXIgc2NyaXB0czo6ICAgICAgICAgICAgICAgICAgQ29udHJvbGxpbmcgQGNvZGV7YXJ9IHdpdGggYSBzY3JpcHQKLUBlbmQgbWVudQotCi1AcGFnZQotQG5vZGUgYXIgY21kbGluZQotQHNlY3Rpb24gQ29udHJvbGxpbmcgQGNvZGV7YXJ9IG9uIHRoZSBjb21tYW5kIGxpbmUKLQotQHNtYWxsZXhhbXBsZQotYXIgWy1dQHZhcntwfVtAdmFye21vZH0gW0B2YXJ7cmVscG9zfV1dIEB2YXJ7YXJjaGl2ZX0gW0B2YXJ7bWVtYmVyfUBkb3Rze31dCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY2luZGV4IFVuaXggY29tcGF0aWJpbGl0eSwgQGNvZGV7YXJ9Ci1XaGVuIHlvdSB1c2UgQGNvZGV7YXJ9IGluIHRoZSBVbml4IHN0eWxlLCBAY29kZXthcn0gaW5zaXN0cyBvbiBhdCBsZWFzdCB0d28KLWFyZ3VtZW50cyB0byBleGVjdXRlOiBvbmUga2V5bGV0dGVyIHNwZWNpZnlpbmcgdGhlIEBlbXBoe29wZXJhdGlvbn0KLShvcHRpb25hbGx5IGFjY29tcGFuaWVkIGJ5IG90aGVyIGtleWxldHRlcnMgc3BlY2lmeWluZwotQGVtcGh7bW9kaWZpZXJzfSksIGFuZCB0aGUgYXJjaGl2ZSBuYW1lIHRvIGFjdCBvbi4KLQotTW9zdCBvcGVyYXRpb25zIGNhbiBhbHNvIGFjY2VwdCBmdXJ0aGVyIEB2YXJ7bWVtYmVyfSBhcmd1bWVudHMsCi1zcGVjaWZ5aW5nIHBhcnRpY3VsYXIgZmlsZXMgdG8gb3BlcmF0ZSBvbi4KLQotQHNje2dudX0gQGNvZGV7YXJ9IGFsbG93cyB5b3UgdG8gbWl4IHRoZSBvcGVyYXRpb24gY29kZSBAdmFye3B9IGFuZCBtb2RpZmllcgotZmxhZ3MgQHZhcnttb2R9IGluIGFueSBvcmRlciwgd2l0aGluIHRoZSBmaXJzdCBjb21tYW5kLWxpbmUgYXJndW1lbnQuCi0KLUlmIHlvdSB3aXNoLCB5b3UgbWF5IGJlZ2luIHRoZSBmaXJzdCBjb21tYW5kLWxpbmUgYXJndW1lbnQgd2l0aCBhCi1kYXNoLgotCi1AY2luZGV4IG9wZXJhdGlvbnMgb24gYXJjaGl2ZQotVGhlIEB2YXJ7cH0ga2V5bGV0dGVyIHNwZWNpZmllcyB3aGF0IG9wZXJhdGlvbiB0byBleGVjdXRlOyBpdCBtYXkgYmUKLWFueSBvZiB0aGUgZm9sbG93aW5nLCBidXQgeW91IG11c3Qgc3BlY2lmeSBvbmx5IG9uZSBvZiB0aGVtOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGQKLUBjaW5kZXggZGVsZXRpbmcgZnJvbSBhcmNoaXZlCi1AZW1waHtEZWxldGV9IG1vZHVsZXMgZnJvbSB0aGUgYXJjaGl2ZS4gIFNwZWNpZnkgdGhlIG5hbWVzIG9mIG1vZHVsZXMgdG8KLWJlIGRlbGV0ZWQgYXMgQHZhcnttZW1iZXJ9QGRvdHN7fTsgdGhlIGFyY2hpdmUgaXMgdW50b3VjaGVkIGlmIHlvdQotc3BlY2lmeSBubyBmaWxlcyB0byBkZWxldGUuCi0KLUlmIHlvdSBzcGVjaWZ5IHRoZSBAc2FtcHt2fSBtb2RpZmllciwgQGNvZGV7YXJ9IGxpc3RzIGVhY2ggbW9kdWxlCi1hcyBpdCBpcyBkZWxldGVkLgotCi1AaXRlbSBtCi1AY2luZGV4IG1vdmluZyBpbiBhcmNoaXZlCi1Vc2UgdGhpcyBvcGVyYXRpb24gdG8gQGVtcGh7bW92ZX0gbWVtYmVycyBpbiBhbiBhcmNoaXZlLgotCi1UaGUgb3JkZXJpbmcgb2YgbWVtYmVycyBpbiBhbiBhcmNoaXZlIGNhbiBtYWtlIGEgZGlmZmVyZW5jZSBpbiBob3cKLXByb2dyYW1zIGFyZSBsaW5rZWQgdXNpbmcgdGhlIGxpYnJhcnksIGlmIGEgc3ltYm9sIGlzIGRlZmluZWQgaW4gbW9yZQotdGhhbiBvbmUgbWVtYmVyLiAgCi0KLUlmIG5vIG1vZGlmaWVycyBhcmUgdXNlZCB3aXRoIEBjb2Rle219LCBhbnkgbWVtYmVycyB5b3UgbmFtZSBpbiB0aGUKLUB2YXJ7bWVtYmVyfSBhcmd1bWVudHMgYXJlIG1vdmVkIHRvIHRoZSBAZW1waHtlbmR9IG9mIHRoZSBhcmNoaXZlOwoteW91IGNhbiB1c2UgdGhlIEBzYW1we2F9LCBAc2FtcHtifSwgb3IgQHNhbXB7aX0gbW9kaWZpZXJzIHRvIG1vdmUgdGhlbSB0byBhCi1zcGVjaWZpZWQgcGxhY2UgaW5zdGVhZC4KLQotQGl0ZW0gcAotQGNpbmRleCBwcmludGluZyBmcm9tIGFyY2hpdmUKLUBlbXBoe1ByaW50fSB0aGUgc3BlY2lmaWVkIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUsIHRvIHRoZSBzdGFuZGFyZAotb3V0cHV0IGZpbGUuICBJZiB0aGUgQHNhbXB7dn0gbW9kaWZpZXIgaXMgc3BlY2lmaWVkLCBzaG93IHRoZSBtZW1iZXIKLW5hbWUgYmVmb3JlIGNvcHlpbmcgaXRzIGNvbnRlbnRzIHRvIHN0YW5kYXJkIG91dHB1dC4KLQotSWYgeW91IHNwZWNpZnkgbm8gQHZhcnttZW1iZXJ9IGFyZ3VtZW50cywgYWxsIHRoZSBmaWxlcyBpbiB0aGUgYXJjaGl2ZSBhcmUKLXByaW50ZWQuCi0KLUBpdGVtIHEKLUBjaW5kZXggcXVpY2sgYXBwZW5kIHRvIGFyY2hpdmUKLUBlbXBoe1F1aWNrIGFwcGVuZH07IEhpc3RvcmljYWxseSwgYWRkIHRoZSBmaWxlcyBAdmFye21lbWJlcn1AZG90c3t9IHRvIHRoZSBlbmQgb2YKLUB2YXJ7YXJjaGl2ZX0sIHdpdGhvdXQgY2hlY2tpbmcgZm9yIHJlcGxhY2VtZW50LgotCi1UaGUgbW9kaWZpZXJzIEBzYW1we2F9LCBAc2FtcHtifSwgYW5kIEBzYW1we2l9IGRvIEBlbXBoe25vdH0gYWZmZWN0IHRoaXMKLW9wZXJhdGlvbjsgbmV3IG1lbWJlcnMgYXJlIGFsd2F5cyBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZS4KLQotVGhlIG1vZGlmaWVyIEBzYW1we3Z9IG1ha2VzIEBjb2Rle2FyfSBsaXN0IGVhY2ggZmlsZSBhcyBpdCBpcyBhcHBlbmRlZC4KLQotU2luY2UgdGhlIHBvaW50IG9mIHRoaXMgb3BlcmF0aW9uIGlzIHNwZWVkLCB0aGUgYXJjaGl2ZSdzIHN5bWJvbCB0YWJsZQotaW5kZXggaXMgbm90IHVwZGF0ZWQsIGV2ZW4gaWYgaXQgYWxyZWFkeSBleGlzdGVkOyB5b3UgY2FuIHVzZSBAc2FtcHthciBzfSBvcgotQGNvZGV7cmFubGlifSBleHBsaWNpdGx5IHRvIHVwZGF0ZSB0aGUgc3ltYm9sIHRhYmxlIGluZGV4LgotCi1Ib3dldmVyLCB0b28gbWFueSBkaWZmZXJlbnQgc3lzdGVtcyBhc3N1bWUgcXVpY2sgYXBwZW5kIHJlYnVpbGRzIHRoZQotaW5kZXgsIHNvIEdOVSBhciBpbXBsZW1lbnRzIEBjb2Rle3F9IGFzIGEgc3lub255bSBmb3IgQGNvZGV7cn0uCi0KLUBpdGVtIHIKLUBjaW5kZXggcmVwbGFjZW1lbnQgaW4gYXJjaGl2ZQotSW5zZXJ0IHRoZSBmaWxlcyBAdmFye21lbWJlcn1AZG90c3t9IGludG8gQHZhcnthcmNoaXZlfSAod2l0aAotQGVtcGh7cmVwbGFjZW1lbnR9KS4gVGhpcyBvcGVyYXRpb24gZGlmZmVycyBmcm9tIEBzYW1we3F9IGluIHRoYXQgYW55Ci1wcmV2aW91c2x5IGV4aXN0aW5nIG1lbWJlcnMgYXJlIGRlbGV0ZWQgaWYgdGhlaXIgbmFtZXMgbWF0Y2ggdGhvc2UgYmVpbmcKLWFkZGVkLgotCi1JZiBvbmUgb2YgdGhlIGZpbGVzIG5hbWVkIGluIEB2YXJ7bWVtYmVyfUBkb3Rze30gZG9lcyBub3QgZXhpc3QsIEBjb2Rle2FyfQotZGlzcGxheXMgYW4gZXJyb3IgbWVzc2FnZSwgYW5kIGxlYXZlcyB1bmRpc3R1cmJlZCBhbnkgZXhpc3RpbmcgbWVtYmVycwotb2YgdGhlIGFyY2hpdmUgbWF0Y2hpbmcgdGhhdCBuYW1lLgotCi1CeSBkZWZhdWx0LCBuZXcgbWVtYmVycyBhcmUgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZTsgYnV0IHlvdSBtYXkKLXVzZSBvbmUgb2YgdGhlIG1vZGlmaWVycyBAc2FtcHthfSwgQHNhbXB7Yn0sIG9yIEBzYW1we2l9IHRvIHJlcXVlc3QKLXBsYWNlbWVudCByZWxhdGl2ZSB0byBzb21lIGV4aXN0aW5nIG1lbWJlci4KLQotVGhlIG1vZGlmaWVyIEBzYW1we3Z9IHVzZWQgd2l0aCB0aGlzIG9wZXJhdGlvbiBlbGljaXRzIGEgbGluZSBvZgotb3V0cHV0IGZvciBlYWNoIGZpbGUgaW5zZXJ0ZWQsIGFsb25nIHdpdGggb25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we2F9IG9yCi1Ac2FtcHtyfSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBmaWxlIHdhcyBhcHBlbmRlZCAobm8gb2xkIG1lbWJlcgotZGVsZXRlZCkgb3IgcmVwbGFjZWQuCi0KLUBpdGVtIHQKLUBjaW5kZXggY29udGVudHMgb2YgYXJjaGl2ZQotRGlzcGxheSBhIEBlbXBoe3RhYmxlfSBsaXN0aW5nIHRoZSBjb250ZW50cyBvZiBAdmFye2FyY2hpdmV9LCBvciB0aG9zZQotb2YgdGhlIGZpbGVzIGxpc3RlZCBpbiBAdmFye21lbWJlcn1AZG90c3t9IHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlCi1hcmNoaXZlLiAgTm9ybWFsbHkgb25seSB0aGUgbWVtYmVyIG5hbWUgaXMgc2hvd247IGlmIHlvdSBhbHNvIHdhbnQgdG8KLXNlZSB0aGUgbW9kZXMgKHBlcm1pc3Npb25zKSwgdGltZXN0YW1wLCBvd25lciwgZ3JvdXAsIGFuZCBzaXplLCB5b3UgY2FuCi1yZXF1ZXN0IHRoYXQgYnkgYWxzbyBzcGVjaWZ5aW5nIHRoZSBAc2FtcHt2fSBtb2RpZmllci4KLQotSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgQHZhcnttZW1iZXJ9LCBhbGwgZmlsZXMgaW4gdGhlIGFyY2hpdmUKLWFyZSBsaXN0ZWQuCi0KLUBjaW5kZXggcmVwZWF0ZWQgbmFtZXMgaW4gYXJjaGl2ZQotQGNpbmRleCBuYW1lIGR1cGxpY2F0aW9uIGluIGFyY2hpdmUKLUlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgKHNheSwgQHNhbXB7ZmllfSkgaW4KLWFuIGFyY2hpdmUgKHNheSBAc2FtcHtiLmF9KSwgQHNhbXB7YXIgdCBiLmEgZmllfSBsaXN0cyBvbmx5IHRoZQotZmlyc3QgaW5zdGFuY2U7IHRvIHNlZSB0aGVtIGFsbCwgeW91IG11c3QgYXNrIGZvciBhIGNvbXBsZXRlCi1saXN0aW5nLS0taW4gb3VyIGV4YW1wbGUsIEBzYW1we2FyIHQgYi5hfS4KLUBjIFdSUyBvbmx5OyBwZXIgR3VtYnksIHRoaXMgaXMgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LCBhbmQgaW4gYSBtb3JlCi1AYyByZWNlbnQgY2FzZSBpbiBmYWN0IHdvcmtzIHRoZSBvdGhlciB3YXkuCi0KLUBpdGVtIHgKLUBjaW5kZXggZXh0cmFjdCBmcm9tIGFyY2hpdmUKLUBlbXBoe0V4dHJhY3R9IG1lbWJlcnMgKG5hbWVkIEB2YXJ7bWVtYmVyfSkgZnJvbSB0aGUgYXJjaGl2ZS4gIFlvdSBjYW4KLXVzZSB0aGUgQHNhbXB7dn0gbW9kaWZpZXIgd2l0aCB0aGlzIG9wZXJhdGlvbiwgdG8gcmVxdWVzdCB0aGF0Ci1AY29kZXthcn0gbGlzdCBlYWNoIG5hbWUgYXMgaXQgZXh0cmFjdHMgaXQuCi0KLUlmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIEB2YXJ7bWVtYmVyfSwgYWxsIGZpbGVzIGluIHRoZSBhcmNoaXZlCi1hcmUgZXh0cmFjdGVkLgotCi1AZW5kIHRhYmxlCi0KLUEgbnVtYmVyIG9mIG1vZGlmaWVycyAoQHZhcnttb2R9KSBtYXkgaW1tZWRpYXRlbHkgZm9sbG93IHRoZSBAdmFye3B9Ci1rZXlsZXR0ZXIsIHRvIHNwZWNpZnkgdmFyaWF0aW9ucyBvbiBhbiBvcGVyYXRpb24ncyBiZWhhdmlvcjoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBhCi1AY2luZGV4IHJlbGF0aXZlIHBsYWNlbWVudCBpbiBhcmNoaXZlCi1BZGQgbmV3IGZpbGVzIEBlbXBoe2FmdGVyfSBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCi1hcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgQHNhbXB7YX0sIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKLW1lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIEB2YXJ7cmVscG9zfSBhcmd1bWVudCwgYmVmb3JlIHRoZQotQHZhcnthcmNoaXZlfSBzcGVjaWZpY2F0aW9uLgotCi1AaXRlbSBiCi1BZGQgbmV3IGZpbGVzIEBlbXBoe2JlZm9yZX0gYW4gZXhpc3RpbmcgbWVtYmVyIG9mIHRoZQotYXJjaGl2ZS4gIElmIHlvdSB1c2UgdGhlIG1vZGlmaWVyIEBzYW1we2J9LCB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBhcmNoaXZlCi1tZW1iZXIgbXVzdCBiZSBwcmVzZW50IGFzIHRoZSBAdmFye3JlbHBvc30gYXJndW1lbnQsIGJlZm9yZSB0aGUKLUB2YXJ7YXJjaGl2ZX0gc3BlY2lmaWNhdGlvbi4gIChzYW1lIGFzIEBzYW1we2l9KS4KLQotQGl0ZW0gYwotQGNpbmRleCBjcmVhdGluZyBhcmNoaXZlcwotQGVtcGh7Q3JlYXRlfSB0aGUgYXJjaGl2ZS4gIFRoZSBzcGVjaWZpZWQgQHZhcnthcmNoaXZlfSBpcyBhbHdheXMKLWNyZWF0ZWQgaWYgaXQgZGlkIG5vdCBleGlzdCwgd2hlbiB5b3UgcmVxdWVzdCBhbiB1cGRhdGUuICBCdXQgYSB3YXJuaW5nIGlzCi1pc3N1ZWQgdW5sZXNzIHlvdSBzcGVjaWZ5IGluIGFkdmFuY2UgdGhhdCB5b3UgZXhwZWN0IHRvIGNyZWF0ZSBpdCwgYnkKLXVzaW5nIHRoaXMgbW9kaWZpZXIuCi0KLUBpdGVtIGYKLVRydW5jYXRlIG5hbWVzIGluIHRoZSBhcmNoaXZlLiAgQHNje2dudX0gQGNvZGV7YXJ9IHdpbGwgbm9ybWFsbHkgcGVybWl0IGZpbGUKLW5hbWVzIG9mIGFueSBsZW5ndGguICBUaGlzIHdpbGwgY2F1c2UgaXQgdG8gY3JlYXRlIGFyY2hpdmVzIHdoaWNoIGFyZQotbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgbmF0aXZlIEBjb2Rle2FyfSBwcm9ncmFtIG9uIHNvbWUgc3lzdGVtcy4gIElmCi10aGlzIGlzIGEgY29uY2VybiwgdGhlIEBzYW1we2Z9IG1vZGlmaWVyIG1heSBiZSB1c2VkIHRvIHRydW5jYXRlIGZpbGUKLW5hbWVzIHdoZW4gcHV0dGluZyB0aGVtIGluIHRoZSBhcmNoaXZlLgotCi1AaXRlbSBpCi1JbnNlcnQgbmV3IGZpbGVzIEBlbXBoe2JlZm9yZX0gYW4gZXhpc3RpbmcgbWVtYmVyIG9mIHRoZQotYXJjaGl2ZS4gIElmIHlvdSB1c2UgdGhlIG1vZGlmaWVyIEBzYW1we2l9LCB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBhcmNoaXZlCi1tZW1iZXIgbXVzdCBiZSBwcmVzZW50IGFzIHRoZSBAdmFye3JlbHBvc30gYXJndW1lbnQsIGJlZm9yZSB0aGUKLUB2YXJ7YXJjaGl2ZX0gc3BlY2lmaWNhdGlvbi4gIChzYW1lIGFzIEBzYW1we2J9KS4KLQotQGl0ZW0gbAotVGhpcyBtb2RpZmllciBpcyBhY2NlcHRlZCBidXQgbm90IHVzZWQuCi1AYyB3aGFmZm9yIGFyIGwgbW9kaWZpZXI/Pz8gcHJlc3VtYWJseSBjb21wYXQ7IHdpdGgKLUBjIHdoYXQ/Pz8tLS1kb2NAQGN5Z251cy5jb20sIDI1amFuOTEgCi0KLUBpdGVtIG8KLUBjaW5kZXggZGF0ZXMgaW4gYXJjaGl2ZQotUHJlc2VydmUgdGhlIEBlbXBoe29yaWdpbmFsfSBkYXRlcyBvZiBtZW1iZXJzIHdoZW4gZXh0cmFjdGluZyB0aGVtLiAgSWYKLXlvdSBkbyBub3Qgc3BlY2lmeSB0aGlzIG1vZGlmaWVyLCBmaWxlcyBleHRyYWN0ZWQgZnJvbSB0aGUgYXJjaGl2ZQotYXJlIHN0YW1wZWQgd2l0aCB0aGUgdGltZSBvZiBleHRyYWN0aW9uLgotCi1AaXRlbSBzCi1AY2luZGV4IHdyaXRpbmcgYXJjaGl2ZSBpbmRleAotV3JpdGUgYW4gb2JqZWN0LWZpbGUgaW5kZXggaW50byB0aGUgYXJjaGl2ZSwgb3IgdXBkYXRlIGFuIGV4aXN0aW5nIG9uZSwKLWV2ZW4gaWYgbm8gb3RoZXIgY2hhbmdlIGlzIG1hZGUgdG8gdGhlIGFyY2hpdmUuICBZb3UgbWF5IHVzZSB0aGlzIG1vZGlmaWVyCi1mbGFnIGVpdGhlciB3aXRoIGFueSBvcGVyYXRpb24sIG9yIGFsb25lLiAgUnVubmluZyBAc2FtcHthciBzfSBvbiBhbgotYXJjaGl2ZSBpcyBlcXVpdmFsZW50IHRvIHJ1bm5pbmcgQHNhbXB7cmFubGlifSBvbiBpdC4KLQotQGl0ZW0gUwotQGNpbmRleCBub3Qgd3JpdGluZyBhcmNoaXZlIGluZGV4Ci1EbyBub3QgZ2VuZXJhdGUgYW4gYXJjaGl2ZSBzeW1ib2wgdGFibGUuICBUaGlzIGNhbiBzcGVlZCB1cCBidWlsZGluZyBhCi1sYXJnZSBsaWJyYXJ5IGluIHNldmVyYWwgc3RlcHMuICBUaGUgcmVzdWx0aW5nIGFyY2hpdmUgY2FuIG5vdCBiZSB1c2VkCi13aXRoIHRoZSBsaW5rZXIuICBJbiBvcmRlciB0byBidWlsZCBhIHN5bWJvbCB0YWJsZSwgeW91IG11c3Qgb21pdCB0aGUKLUBzYW1we1N9IG1vZGlmaWVyIG9uIHRoZSBsYXN0IGV4ZWN1dGlvbiBvZiBAc2FtcHthcn0sIG9yIHlvdSBtdXN0IHJ1bgotQHNhbXB7cmFubGlifSBvbiB0aGUgYXJjaGl2ZS4KLQotQGl0ZW0gdQotQGNpbmRleCB1cGRhdGluZyBhbiBhcmNoaXZlCi1Ob3JtYWxseSwgQHNhbXB7YXIgcn1AZG90c3t9IGluc2VydHMgYWxsIGZpbGVzCi1saXN0ZWQgaW50byB0aGUgYXJjaGl2ZS4gIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluc2VydCBAZW1waHtvbmx5fSB0aG9zZQotb2YgdGhlIGZpbGVzIHlvdSBsaXN0IHRoYXQgYXJlIG5ld2VyIHRoYW4gZXhpc3RpbmcgbWVtYmVycyBvZiB0aGUgc2FtZQotbmFtZXMsIHVzZSB0aGlzIG1vZGlmaWVyLiAgVGhlIEBzYW1we3V9IG1vZGlmaWVyIGlzIGFsbG93ZWQgb25seSBmb3IgdGhlCi1vcGVyYXRpb24gQHNhbXB7cn0gKHJlcGxhY2UpLiAgSW4gcGFydGljdWxhciwgdGhlIGNvbWJpbmF0aW9uIEBzYW1we3F1fSBpcwotbm90IGFsbG93ZWQsIHNpbmNlIGNoZWNraW5nIHRoZSB0aW1lc3RhbXBzIHdvdWxkIGxvc2UgYW55IHNwZWVkCi1hZHZhbnRhZ2UgZnJvbSB0aGUgb3BlcmF0aW9uIEBzYW1we3F9LgotCi1AaXRlbSB2Ci1UaGlzIG1vZGlmaWVyIHJlcXVlc3RzIHRoZSBAZW1waHt2ZXJib3NlfSB2ZXJzaW9uIG9mIGFuIG9wZXJhdGlvbi4gIE1hbnkKLW9wZXJhdGlvbnMgZGlzcGxheSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBzdWNoIGFzIGZpbGVuYW1lcyBwcm9jZXNzZWQsCi13aGVuIHRoZSBtb2RpZmllciBAc2FtcHt2fSBpcyBhcHBlbmRlZC4KLQotQGl0ZW0gVgotVGhpcyBtb2RpZmllciBzaG93cyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7YXJ9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBhciBzY3JpcHRzCi1Ac2VjdGlvbiBDb250cm9sbGluZyBAY29kZXthcn0gd2l0aCBhIHNjcmlwdAotCi1Ac21hbGxleGFtcGxlCi1hciAtTSBbIDxAdmFye3NjcmlwdH0gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBNUkkgY29tcGF0aWJpbGl0eSwgQGNvZGV7YXJ9Ci1AY2luZGV4IHNjcmlwdHMsIEBjb2Rle2FyfQotSWYgeW91IHVzZSB0aGUgc2luZ2xlIGNvbW1hbmQtbGluZSBvcHRpb24gQHNhbXB7LU19IHdpdGggQGNvZGV7YXJ9LCB5b3UKLWNhbiBjb250cm9sIGl0cyBvcGVyYXRpb24gd2l0aCBhIHJ1ZGltZW50YXJ5IGNvbW1hbmQgbGFuZ3VhZ2UuICBUaGlzCi1mb3JtIG9mIEBjb2Rle2FyfSBvcGVyYXRlcyBpbnRlcmFjdGl2ZWx5IGlmIHN0YW5kYXJkIGlucHV0IGlzIGNvbWluZwotZGlyZWN0bHkgZnJvbSBhIHRlcm1pbmFsLiAgRHVyaW5nIGludGVyYWN0aXZlIHVzZSwgQGNvZGV7YXJ9IHByb21wdHMgZm9yCi1pbnB1dCAodGhlIHByb21wdCBpcyBAc2FtcHtBUiA+fSksIGFuZCBjb250aW51ZXMgZXhlY3V0aW5nIGV2ZW4gYWZ0ZXIKLWVycm9ycy4gIElmIHlvdSByZWRpcmVjdCBzdGFuZGFyZCBpbnB1dCB0byBhIHNjcmlwdCBmaWxlLCBubyBwcm9tcHRzIGFyZQotaXNzdWVkLCBhbmQgQGNvZGV7YXJ9IGFiYW5kb25zIGV4ZWN1dGlvbiAod2l0aCBhIG5vbnplcm8gZXhpdCBjb2RlKQotb24gYW55IGVycm9yLgotCi1UaGUgQGNvZGV7YXJ9IGNvbW1hbmQgbGFuZ3VhZ2UgaXMgQGVtcGh7bm90fSBkZXNpZ25lZCB0byBiZSBlcXVpdmFsZW50Ci10byB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnM7IGluIGZhY3QsIGl0IHByb3ZpZGVzIHNvbWV3aGF0IGxlc3MgY29udHJvbAotb3ZlciBhcmNoaXZlcy4gIFRoZSBvbmx5IHB1cnBvc2Ugb2YgdGhlIGNvbW1hbmQgbGFuZ3VhZ2UgaXMgdG8gZWFzZSB0aGUKLXRyYW5zaXRpb24gdG8gQHNje2dudX0gQGNvZGV7YXJ9IGZvciBkZXZlbG9wZXJzIHdobyBhbHJlYWR5IGhhdmUgc2NyaXB0cwotd3JpdHRlbiBmb3IgdGhlIE1SSSBgYGxpYnJhcmlhbicnIHByb2dyYW0uCi0KLVRoZSBzeW50YXggZm9yIHRoZSBAY29kZXthcn0gY29tbWFuZCBsYW5ndWFnZSBpcyBzdHJhaWdodGZvcndhcmQ6Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotY29tbWFuZHMgYXJlIHJlY29nbml6ZWQgaW4gdXBwZXIgb3IgbG93ZXIgY2FzZTsgZm9yIGV4YW1wbGUsIEBjb2Rle0xJU1R9Ci1pcyB0aGUgc2FtZSBhcyBAY29kZXtsaXN0fS4gIEluIHRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb25zLCBjb21tYW5kcyBhcmUKLXNob3duIGluIHVwcGVyIGNhc2UgZm9yIGNsYXJpdHkuCi0KLUBpdGVtCi1hIHNpbmdsZSBjb21tYW5kIG1heSBhcHBlYXIgb24gZWFjaCBsaW5lOyBpdCBpcyB0aGUgZmlyc3Qgd29yZCBvbiB0aGUKLWxpbmUuCi0KLUBpdGVtCi1lbXB0eSBsaW5lcyBhcmUgYWxsb3dlZCwgYW5kIGhhdmUgbm8gZWZmZWN0LgotCi1AaXRlbQotY29tbWVudHMgYXJlIGFsbG93ZWQ7IHRleHQgYWZ0ZXIgZWl0aGVyIG9mIHRoZSBjaGFyYWN0ZXJzIEBzYW1weyp9Ci1vciBAc2FtcHs7fSBpcyBpZ25vcmVkLgotCi1AaXRlbQotV2hlbmV2ZXIgeW91IHVzZSBhIGxpc3Qgb2YgbmFtZXMgYXMgcGFydCBvZiB0aGUgYXJndW1lbnQgdG8gYW4gQGNvZGV7YXJ9Ci1jb21tYW5kLCB5b3UgY2FuIHNlcGFyYXRlIHRoZSBpbmRpdmlkdWFsIG5hbWVzIHdpdGggZWl0aGVyIGNvbW1hcyBvcgotYmxhbmtzLiAgQ29tbWFzIGFyZSBzaG93biBpbiB0aGUgZXhwbGFuYXRpb25zIGJlbG93LCBmb3IgY2xhcml0eS4KLQotQGl0ZW0KLUBzYW1weyt9IGlzIHVzZWQgYXMgYSBsaW5lIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXI7IGlmIEBzYW1weyt9IGFwcGVhcnMKLWF0IHRoZSBlbmQgb2YgYSBsaW5lLCB0aGUgdGV4dCBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXMgY29uc2lkZXJlZCBwYXJ0Ci1vZiB0aGUgY3VycmVudCBjb21tYW5kLgotQGVuZCBpdGVtaXplCi0KLUhlcmUgYXJlIHRoZSBjb21tYW5kcyB5b3UgY2FuIHVzZSBpbiBAY29kZXthcn0gc2NyaXB0cywgb3Igd2hlbiB1c2luZwotQGNvZGV7YXJ9IGludGVyYWN0aXZlbHkuICBUaHJlZSBvZiB0aGVtIGhhdmUgc3BlY2lhbCBzaWduaWZpY2FuY2U6Ci0KLUBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0gc3BlY2lmeSBhIEBkZm57Y3VycmVudCBhcmNoaXZlfSwgd2hpY2ggaXMKLWEgdGVtcG9yYXJ5IGZpbGUgcmVxdWlyZWQgZm9yIG1vc3Qgb2YgdGhlIG90aGVyIGNvbW1hbmRzLgotCi1AY29kZXtTQVZFfSBjb21taXRzIHRoZSBjaGFuZ2VzIHNvIGZhciBzcGVjaWZpZWQgYnkgdGhlIHNjcmlwdC4gIFByaW9yCi10byBAY29kZXtTQVZFfSwgY29tbWFuZHMgYWZmZWN0IG9ubHkgdGhlIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBjdXJyZW50Ci1hcmNoaXZlLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIEFERExJQiBAdmFye2FyY2hpdmV9IAotQGl0ZW14IEFERExJQiBAdmFye2FyY2hpdmV9IChAdmFye21vZHVsZX0sIEB2YXJ7bW9kdWxlfSwgQGRvdHN7fSBAdmFye21vZHVsZX0pCi1BZGQgYWxsIHRoZSBjb250ZW50cyBvZiBAdmFye2FyY2hpdmV9IChvciwgaWYgc3BlY2lmaWVkLCBlYWNoIG5hbWVkCi1AdmFye21vZHVsZX0gZnJvbSBAdmFye2FyY2hpdmV9KSB0byB0aGUgY3VycmVudCBhcmNoaXZlLgotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGl0ZW0gQURETU9EIEB2YXJ7bWVtYmVyfSwgQHZhcnttZW1iZXJ9LCBAZG90c3t9IEB2YXJ7bWVtYmVyfQotQGMgRklYTUUhIHcvUmVwbGFjZW1lbnQ/PyAgSWYgc28sIGxpa2UgImFyIHIgQHZhcnthcmNoaXZlfSBAdmFye25hbWVzfSIKLUBjICAgICAgICBlbHNlIGxpa2UgImFyIHEuLi4iCi1BZGQgZWFjaCBuYW1lZCBAdmFye21lbWJlcn0gYXMgYSBtb2R1bGUgaW4gdGhlIGN1cnJlbnQgYXJjaGl2ZS4KLQotUmVxdWlyZXMgcHJpb3IgdXNlIG9mIEBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0uCi0KLUBpdGVtIENMRUFSCi1EaXNjYXJkIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhcmNoaXZlLCBjYW5jZWxpbmcgdGhlIGVmZmVjdCBvZgotYW55IG9wZXJhdGlvbnMgc2luY2UgdGhlIGxhc3QgQGNvZGV7U0FWRX0uICBNYXkgYmUgZXhlY3V0ZWQgKHdpdGggbm8KLWVmZmVjdCkgZXZlbiBpZiAgbm8gY3VycmVudCBhcmNoaXZlIGlzIHNwZWNpZmllZC4KLQotQGl0ZW0gQ1JFQVRFIEB2YXJ7YXJjaGl2ZX0KLUNyZWF0ZXMgYW4gYXJjaGl2ZSwgYW5kIG1ha2VzIGl0IHRoZSBjdXJyZW50IGFyY2hpdmUgKHJlcXVpcmVkIGZvciBtYW55Ci1vdGhlciBjb21tYW5kcykuICBUaGUgbmV3IGFyY2hpdmUgaXMgY3JlYXRlZCB3aXRoIGEgdGVtcG9yYXJ5IG5hbWU7IGl0Ci1pcyBub3QgYWN0dWFsbHkgc2F2ZWQgYXMgQHZhcnthcmNoaXZlfSB1bnRpbCB5b3UgdXNlIEBjb2Rle1NBVkV9LgotWW91IGNhbiBvdmVyd3JpdGUgZXhpc3RpbmcgYXJjaGl2ZXM7IHNpbWlsYXJseSwgdGhlIGNvbnRlbnRzIG9mIGFueQotZXhpc3RpbmcgZmlsZSBuYW1lZCBAdmFye2FyY2hpdmV9IHdpbGwgbm90IGJlIGRlc3Ryb3llZCB1bnRpbCBAY29kZXtTQVZFfS4KLQotQGl0ZW0gREVMRVRFIEB2YXJ7bW9kdWxlfSwgQHZhcnttb2R1bGV9LCBAZG90c3t9IEB2YXJ7bW9kdWxlfQotRGVsZXRlIGVhY2ggbGlzdGVkIEB2YXJ7bW9kdWxlfSBmcm9tIHRoZSBjdXJyZW50IGFyY2hpdmU7IGVxdWl2YWxlbnQgdG8KLUBzYW1we2FyIC1kIEB2YXJ7YXJjaGl2ZX0gQHZhcnttb2R1bGV9IEBkb3Rze30gQHZhcnttb2R1bGV9fS4KLQotUmVxdWlyZXMgcHJpb3IgdXNlIG9mIEBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0uCi0KLUBpdGVtIERJUkVDVE9SWSBAdmFye2FyY2hpdmV9IChAdmFye21vZHVsZX0sIEBkb3Rze30gQHZhcnttb2R1bGV9KQotQGl0ZW14IERJUkVDVE9SWSBAdmFye2FyY2hpdmV9IChAdmFye21vZHVsZX0sIEBkb3Rze30gQHZhcnttb2R1bGV9KSBAdmFye291dHB1dGZpbGV9Ci1MaXN0IGVhY2ggbmFtZWQgQHZhcnttb2R1bGV9IHByZXNlbnQgaW4gQHZhcnthcmNoaXZlfS4gIFRoZSBzZXBhcmF0ZQotY29tbWFuZCBAY29kZXtWRVJCT1NFfSBzcGVjaWZpZXMgdGhlIGZvcm0gb2YgdGhlIG91dHB1dDogd2hlbiB2ZXJib3NlCi1vdXRwdXQgaXMgb2ZmLCBvdXRwdXQgaXMgbGlrZSB0aGF0IG9mIEBzYW1we2FyIC10IEB2YXJ7YXJjaGl2ZX0KLUB2YXJ7bW9kdWxlfUBkb3Rze319LiAgV2hlbiB2ZXJib3NlIG91dHB1dCBpcyBvbiwgdGhlIGxpc3RpbmcgaXMgbGlrZQotQHNhbXB7YXIgLXR2IEB2YXJ7YXJjaGl2ZX0gQHZhcnttb2R1bGV9QGRvdHN7fX0uCi0KLU91dHB1dCBub3JtYWxseSBnb2VzIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgc3RyZWFtOyBob3dldmVyLCBpZiB5b3UKLXNwZWNpZnkgQHZhcntvdXRwdXRmaWxlfSBhcyBhIGZpbmFsIGFyZ3VtZW50LCBAY29kZXthcn0gZGlyZWN0cyB0aGUKLW91dHB1dCB0byB0aGF0IGZpbGUuCi0KLUBpdGVtIEVORAotRXhpdCBmcm9tIEBjb2Rle2FyfSwgd2l0aCBhIEBjb2RlezB9IGV4aXQgY29kZSB0byBpbmRpY2F0ZSBzdWNjZXNzZnVsCi1jb21wbGV0aW9uLiAgVGhpcyBjb21tYW5kIGRvZXMgbm90IHNhdmUgdGhlIG91dHB1dCBmaWxlOyBpZiB5b3UgaGF2ZQotY2hhbmdlZCB0aGUgY3VycmVudCBhcmNoaXZlIHNpbmNlIHRoZSBsYXN0IEBjb2Rle1NBVkV9IGNvbW1hbmQsIHRob3NlCi1jaGFuZ2VzIGFyZSBsb3N0LgotCi1AaXRlbSBFWFRSQUNUIEB2YXJ7bW9kdWxlfSwgQHZhcnttb2R1bGV9LCBAZG90c3t9IEB2YXJ7bW9kdWxlfQotRXh0cmFjdCBlYWNoIG5hbWVkIEB2YXJ7bW9kdWxlfSBmcm9tIHRoZSBjdXJyZW50IGFyY2hpdmUsIHdyaXRpbmcgdGhlbQotaW50byB0aGUgY3VycmVudCBkaXJlY3RvcnkgYXMgc2VwYXJhdGUgZmlsZXMuICBFcXVpdmFsZW50IHRvIEBzYW1we2FyIC14Ci1AdmFye2FyY2hpdmV9IEB2YXJ7bW9kdWxlfUBkb3Rze319LgotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGlnbm9yZQotQGMgRklYTUUgVG9rZW5zIGJ1dCBubyBjb21tYW5kcz8/PwotQGl0ZW0gRlVMTERJUgotCi1AaXRlbSBIRUxQCi1AZW5kIGlnbm9yZQotCi1AaXRlbSBMSVNUCi1EaXNwbGF5IGZ1bGwgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYXJjaGl2ZSwgaW4gYGB2ZXJib3NlJycgc3R5bGUKLXJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXRlIG9mIEBjb2Rle1ZFUkJPU0V9LiAgVGhlIGVmZmVjdCBpcyBsaWtlIEBzYW1we2FyCi10diBAdmFye2FyY2hpdmV9fSkuICAoVGhpcyBzaW5nbGUgY29tbWFuZCBpcyBhIEBzY3tnbnV9IEBjb2Rle2xkfQotZW5oYW5jZW1lbnQsIHJhdGhlciB0aGFuIHByZXNlbnQgZm9yIE1SSSBjb21wYXRpYmlsaXR5LikKLQotUmVxdWlyZXMgcHJpb3IgdXNlIG9mIEBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0uCi0KLUBpdGVtIE9QRU4gQHZhcnthcmNoaXZlfQotT3BlbnMgYW4gZXhpc3RpbmcgYXJjaGl2ZSBmb3IgdXNlIGFzIHRoZSBjdXJyZW50IGFyY2hpdmUgKHJlcXVpcmVkIGZvcgotbWFueSBvdGhlciBjb21tYW5kcykuICBBbnkgY2hhbmdlcyBhcyB0aGUgcmVzdWx0IG9mIHN1YnNlcXVlbnQgY29tbWFuZHMKLXdpbGwgbm90IGFjdHVhbGx5IGFmZmVjdCBAdmFye2FyY2hpdmV9IHVudGlsIHlvdSBuZXh0IHVzZSBAY29kZXtTQVZFfS4KLQotQGl0ZW0gUkVQTEFDRSBAdmFye21vZHVsZX0sIEB2YXJ7bW9kdWxlfSwgQGRvdHN7fSBAdmFye21vZHVsZX0KLUluIHRoZSBjdXJyZW50IGFyY2hpdmUsIHJlcGxhY2UgZWFjaCBleGlzdGluZyBAdmFye21vZHVsZX0gKG5hbWVkIGluCi10aGUgQGNvZGV7UkVQTEFDRX0gYXJndW1lbnRzKSBmcm9tIGZpbGVzIGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgotVG8gZXhlY3V0ZSB0aGlzIGNvbW1hbmQgd2l0aG91dCBlcnJvcnMsIGJvdGggdGhlIGZpbGUsIGFuZCB0aGUgbW9kdWxlIGluCi10aGUgY3VycmVudCBhcmNoaXZlLCBtdXN0IGV4aXN0LiAKLQotUmVxdWlyZXMgcHJpb3IgdXNlIG9mIEBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0uCi0KLUBpdGVtIFZFUkJPU0UKLVRvZ2dsZSBhbiBpbnRlcm5hbCBmbGFnIGdvdmVybmluZyB0aGUgb3V0cHV0IGZyb20gQGNvZGV7RElSRUNUT1JZfS4KLVdoZW4gdGhlIGZsYWcgaXMgb24sIEBjb2Rle0RJUkVDVE9SWX0gb3V0cHV0IG1hdGNoZXMgb3V0cHV0IGZyb20KLUBzYW1we2FyIC10diB9QGRvdHN7fS4KLQotQGl0ZW0gU0FWRQotQ29tbWl0IHlvdXIgY2hhbmdlcyB0byB0aGUgY3VycmVudCBhcmNoaXZlLCBhbmQgYWN0dWFsbHkgc2F2ZSBpdCBhcyBhCi1maWxlIHdpdGggdGhlIG5hbWUgc3BlY2lmaWVkIGluIHRoZSBsYXN0IEBjb2Rle0NSRUFURX0gb3IgQGNvZGV7T1BFTn0KLWNvbW1hbmQuIAotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGVuZCB0YWJsZQotCi1AaWZ0ZXgKLUBub2RlIGxkCi1AY2hhcHRlciBsZAotQGNpbmRleCBsaW5rZXIKLUBraW5kZXggbGQKLVRoZSBAc2N7Z251fSBsaW5rZXIgQGNvZGV7bGR9IGlzIG5vdyBkZXNjcmliZWQgaW4gYSBzZXBhcmF0ZSBtYW51YWwuCi1AeHJlZntUb3AsLCBPdmVydmlldywsIFVzaW5nIExEOiB0aGUgQHNje2dudX0gbGlua2VyfS4KLUBlbmQgaWZ0ZXgKLQotQG5vZGUgbm0KLUBjaGFwdGVyIG5tCi1AY2luZGV4IHN5bWJvbHMKLUBraW5kZXggbm0KLQotQHNtYWxsZXhhbXBsZQotbm0gWyAtYSB8IC0tZGVidWctc3ltcyBdICBbIC1nIHwgLS1leHRlcm4tb25seSBdCi0gICBbIC1CIF0gIFsgLUMgfCAtLWRlbWFuZ2xlIF0gWyAtRCB8IC0tZHluYW1pYyBdCi0gICBbIC1zIHwgLS1wcmludC1hcm1hcCBdICBbIC1BIHwgLW8gfCAtLXByaW50LWZpbGUtbmFtZSBdCi0gICBbIC1uIHwgLXYgfCAtLW51bWVyaWMtc29ydCBdICBbIC1wIHwgLS1uby1zb3J0IF0KLSAgIFsgLXIgfCAtLXJldmVyc2Utc29ydCBdICBbIC0tc2l6ZS1zb3J0IF0gWyAtdSB8IC0tdW5kZWZpbmVkLW9ubHkgXQotICAgWyAtdCBAdmFye3JhZGl4fSB8IC0tcmFkaXg9QHZhcntyYWRpeH0gXSBbIC1QIHwgLS1wb3J0YWJpbGl0eSBdCi0gICBbIC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXSBbIC1mIEB2YXJ7Zm9ybWF0fSB8IC0tZm9ybWF0PUB2YXJ7Zm9ybWF0fSBdCi0gICBbIC0tZGVmaW5lZC1vbmx5IF0gWy1sIHwgLS1saW5lLW51bWJlcnMgXQotICAgWyAtLW5vLWRlbWFuZ2xlIF0gWyAtViB8IC0tdmVyc2lvbiBdICBbIC0taGVscCBdICBbIEB2YXJ7b2JqZmlsZX1AZG90c3t9IF0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBzY3tnbnV9IEBjb2Rle25tfSBsaXN0cyB0aGUgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcyBAdmFye29iamZpbGV9QGRvdHN7fS4KLUlmIG5vIG9iamVjdCBmaWxlcyBhcmUgbGlzdGVkIGFzIGFyZ3VtZW50cywgQGNvZGV7bm19IGFzc3VtZXMKLUBmaWxle2Eub3V0fS4KLQotRm9yIGVhY2ggc3ltYm9sLCBAY29kZXtubX0gc2hvd3M6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1UaGUgc3ltYm9sIHZhbHVlLCBpbiB0aGUgcmFkaXggc2VsZWN0ZWQgYnkgb3B0aW9ucyAoc2VlIGJlbG93KSwgb3IKLWhleGFkZWNpbWFsIGJ5IGRlZmF1bHQuCi0KLUBpdGVtCi1UaGUgc3ltYm9sIHR5cGUuICBBdCBsZWFzdCB0aGUgZm9sbG93aW5nIHR5cGVzIGFyZSB1c2VkOyBvdGhlcnMgYXJlLCBhcwotd2VsbCwgZGVwZW5kaW5nIG9uIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuICBJZiBsb3dlcmNhc2UsIHRoZSBzeW1ib2wgaXMKLWxvY2FsOyBpZiB1cHBlcmNhc2UsIHRoZSBzeW1ib2wgaXMgZ2xvYmFsIChleHRlcm5hbCkuCi0KLUBjIFNvbWUgbW9yZSBkZXRhaWwgb24gZXhhY3RseSB3aGF0IHRoZXNlIHN5bWJvbCB0eXBlcyBhcmUgdXNlZCBmb3IKLUBjIHdvdWxkIGJlIG5pY2UuCi1AdGFibGUgQGNvZGUKLUBpdGVtIEEKLVRoZSBzeW1ib2wncyB2YWx1ZSBpcyBhYnNvbHV0ZSwgYW5kIHdpbGwgbm90IGJlIGNoYW5nZWQgYnkgZnVydGhlcgotbGlua2luZy4KLQotQGl0ZW0gQgotVGhlIHN5bWJvbCBpcyBpbiB0aGUgdW5pbml0aWFsaXplZCBkYXRhIHNlY3Rpb24gKGtub3duIGFzIEJTUykuCi0KLUBpdGVtIEMKLVRoZSBzeW1ib2wgaXMgY29tbW9uLiAgQ29tbW9uIHN5bWJvbHMgYXJlIHVuaW5pdGlhbGl6ZWQgZGF0YS4gIFdoZW4KLWxpbmtpbmcsIG11bHRpcGxlIGNvbW1vbiBzeW1ib2xzIG1heSBhcHBlYXIgd2l0aCB0aGUgc2FtZSBuYW1lLiAgSWYgdGhlCi1zeW1ib2wgaXMgZGVmaW5lZCBhbnl3aGVyZSwgdGhlIGNvbW1vbiBzeW1ib2xzIGFyZSB0cmVhdGVkIGFzIHVuZGVmaW5lZAotcmVmZXJlbmNlcy4gIEZvciBtb3JlIGRldGFpbHMgb24gY29tbW9uIHN5bWJvbHMsIHNlZSB0aGUgZGlzY3Vzc2lvbiBvZgotLS13YXJuLWNvbW1vbiBpbiBAcmVme09wdGlvbnMsLExpbmtlciBvcHRpb25zLGxkLmluZm8sVGhlIEdOVSBsaW5rZXJ9LgotCi1AaXRlbSBECi1UaGUgc3ltYm9sIGlzIGluIHRoZSBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb24uCi0KLUBpdGVtIEcKLVRoZSBzeW1ib2wgaXMgaW4gYW4gaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uIGZvciBzbWFsbCBvYmplY3RzLiAgU29tZQotb2JqZWN0IGZpbGUgZm9ybWF0cyBwZXJtaXQgbW9yZSBlZmZpY2llbnQgYWNjZXNzIHRvIHNtYWxsIGRhdGEgb2JqZWN0cywKLXN1Y2ggYXMgYSBnbG9iYWwgaW50IHZhcmlhYmxlIGFzIG9wcG9zZWQgdG8gYSBsYXJnZSBnbG9iYWwgYXJyYXkuCi0KLUBpdGVtIEkKLVRoZSBzeW1ib2wgaXMgYW4gaW5kaXJlY3QgcmVmZXJlbmNlIHRvIGFub3RoZXIgc3ltYm9sLiAgVGhpcyBpcyBhIEdOVQotZXh0ZW5zaW9uIHRvIHRoZSBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQgd2hpY2ggaXMgcmFyZWx5IHVzZWQuCi0KLUBpdGVtIE4KLVRoZSBzeW1ib2wgaXMgYSBkZWJ1Z2dpbmcgc3ltYm9sLgotCi1AaXRlbSBSCi1UaGUgc3ltYm9sIGlzIGluIGEgcmVhZCBvbmx5IGRhdGEgc2VjdGlvbi4KLQotQGl0ZW0gUwotVGhlIHN5bWJvbCBpcyBpbiBhbiB1bmluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiBmb3Igc21hbGwgb2JqZWN0cy4KLQotQGl0ZW0gVAotVGhlIHN5bWJvbCBpcyBpbiB0aGUgdGV4dCAoY29kZSkgc2VjdGlvbi4KLQotQGl0ZW0gVQotVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuCi0KLUBpdGVtIFcKLVRoZSBzeW1ib2wgaXMgd2Vhay4gIFdoZW4gYSB3ZWFrIGRlZmluZWQgc3ltYm9sIGlzIGxpbmtlZCB3aXRoIGEgbm9ybWFsCi1kZWZpbmVkIHN5bWJvbCwgdGhlIG5vcm1hbCBkZWZpbmVkIHN5bWJvbCBpcyB1c2VkIHdpdGggbm8gZXJyb3IuICBXaGVuIGEKLXdlYWsgdW5kZWZpbmVkIHN5bWJvbCBpcyBsaW5rZWQgYW5kIHRoZSBzeW1ib2wgaXMgbm90IGRlZmluZWQsIHRoZSB2YWx1ZQotb2YgdGhlIHdlYWsgc3ltYm9sIGJlY29tZXMgemVybyB3aXRoIG5vIGVycm9yLgotCi1AaXRlbSAtCi1UaGUgc3ltYm9sIGlzIGEgc3RhYnMgc3ltYm9sIGluIGFuIGEub3V0IG9iamVjdCBmaWxlLiAgSW4gdGhpcyBjYXNlLCB0aGUKLW5leHQgdmFsdWVzIHByaW50ZWQgYXJlIHRoZSBzdGFicyBvdGhlciBmaWVsZCwgdGhlIHN0YWJzIGRlc2MgZmllbGQsIGFuZAotdGhlIHN0YWIgdHlwZS4gIFN0YWJzIHN5bWJvbHMgYXJlIHVzZWQgdG8gaG9sZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb247Ci1mb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIEByZWZ7VG9wLFN0YWJzLFN0YWJzIE92ZXJ2aWV3LHN0YWJzLmluZm8sIFRoZQotYGBzdGFicycnIGRlYnVnIGZvcm1hdH0uCi0KLUBpdGVtID8KLVRoZSBzeW1ib2wgdHlwZSBpcyB1bmtub3duLCBvciBvYmplY3QgZmlsZSBmb3JtYXQgc3BlY2lmaWMuCi1AZW5kIHRhYmxlCi0KLUBpdGVtCi1UaGUgc3ltYm9sIG5hbWUuCi1AZW5kIGl0ZW1pemUKLQotVGhlIGxvbmcgYW5kIHNob3J0IGZvcm1zIG9mIG9wdGlvbnMsIHNob3duIGhlcmUgYXMgYWx0ZXJuYXRpdmVzLCBhcmUKLWVxdWl2YWxlbnQuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLUEKLUBpdGVteCAtbwotQGl0ZW14IC0tcHJpbnQtZmlsZS1uYW1lIAotQGNpbmRleCBpbnB1dCBmaWxlIG5hbWUKLUBjaW5kZXggZmlsZSBuYW1lCi1AY2luZGV4IHNvdXJjZSBmaWxlIG5hbWUKLVByZWNlZGUgZWFjaCBzeW1ib2wgYnkgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUgKG9yIGFyY2hpdmUgZWxlbWVudCkKLWluIHdoaWNoIGl0IHdhcyBmb3VuZCwgcmF0aGVyIHRoYW4gaWRlbnRpZnlpbmcgdGhlIGlucHV0IGZpbGUgb25jZSBvbmx5LAotYmVmb3JlIGFsbCBvZiBpdHMgc3ltYm9scy4KLQotQGl0ZW0gLWEKLUBpdGVteCAtLWRlYnVnLXN5bXMgCi1AY2luZGV4IGRlYnVnZ2luZyBzeW1ib2xzCi1EaXNwbGF5IGFsbCBzeW1ib2xzLCBldmVuIGRlYnVnZ2VyLW9ubHkgc3ltYm9sczsgbm9ybWFsbHkgdGhlc2UgYXJlIG5vdAotbGlzdGVkLgotCi1AaXRlbSAtQgotQGNpbmRleCBAY29kZXtubX0gZm9ybWF0Ci1AY2luZGV4IEBjb2Rle25tfSBjb21wYXRpYmlsaXR5Ci1UaGUgc2FtZSBhcyBAc2FtcHstLWZvcm1hdD1ic2R9IChmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBNSVBTIEBjb2Rle25tfSkuCi0KLUBpdGVtIC1DCi1AaXRlbXggLS1kZW1hbmdsZQotQGNpbmRleCBkZW1hbmdsaW5nIGluIG5tCi1EZWNvZGUgKEBkZm57ZGVtYW5nbGV9KSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzIGludG8gdXNlci1sZXZlbCBuYW1lcy4KLUJlc2lkZXMgcmVtb3ZpbmcgYW55IGluaXRpYWwgdW5kZXJzY29yZSBwcmVwZW5kZWQgYnkgdGhlIHN5c3RlbSwgdGhpcwotbWFrZXMgQysrIGZ1bmN0aW9uIG5hbWVzIHJlYWRhYmxlLiAgQHhyZWZ7YysrZmlsdH0sIGZvciBtb3JlIGluZm9ybWF0aW9uCi1vbiBkZW1hbmdsaW5nLgotCi1AaXRlbSAtLW5vLWRlbWFuZ2xlCi1EbyBub3QgZGVtYW5nbGUgbG93LWxldmVsIHN5bWJvbCBuYW1lcy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQuCi0KLUBpdGVtIC1ECi1AaXRlbXggLS1keW5hbWljCi1AY2luZGV4IGR5bmFtaWMgc3ltYm9scwotRGlzcGxheSB0aGUgZHluYW1pYyBzeW1ib2xzIHJhdGhlciB0aGFuIHRoZSBub3JtYWwgc3ltYm9scy4gIFRoaXMgaXMKLW9ubHkgbWVhbmluZ2Z1bCBmb3IgZHluYW1pYyBvYmplY3RzLCBzdWNoIGFzIGNlcnRhaW4gdHlwZXMgb2Ygc2hhcmVkCi1saWJyYXJpZXMuCi0KLUBpdGVtIC1mIEB2YXJ7Zm9ybWF0fQotQGl0ZW14IC0tZm9ybWF0PUB2YXJ7Zm9ybWF0fQotQGNpbmRleCBAY29kZXtubX0gZm9ybWF0Ci1AY2luZGV4IEBjb2Rle25tfSBjb21wYXRpYmlsaXR5Ci1Vc2UgdGhlIG91dHB1dCBmb3JtYXQgQHZhcntmb3JtYXR9LCB3aGljaCBjYW4gYmUgQGNvZGV7YnNkfSwKLUBjb2Rle3N5c3Z9LCBvciBAY29kZXtwb3NpeH0uICBUaGUgZGVmYXVsdCBpcyBAY29kZXtic2R9LgotT25seSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIEB2YXJ7Zm9ybWF0fSBpcyBzaWduaWZpY2FudDsgaXQgY2FuIGJlCi1laXRoZXIgdXBwZXIgb3IgbG93ZXIgY2FzZS4KLQotQGl0ZW0gLWcKLUBpdGVteCAtLWV4dGVybi1vbmx5IAotQGNpbmRleCBleHRlcm5hbCBzeW1ib2xzCi1EaXNwbGF5IG9ubHkgZXh0ZXJuYWwgc3ltYm9scy4KLQotQGl0ZW0gLWwKLUBpdGVteCAtLWxpbmUtbnVtYmVycwotQGNpbmRleCBzeW1ib2wgbGluZSBudW1iZXJzCi1Gb3IgZWFjaCBzeW1ib2wsIHVzZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gdHJ5IHRvIGZpbmQgYSBmaWxlbmFtZSBhbmQKLWxpbmUgbnVtYmVyLiAgRm9yIGEgZGVmaW5lZCBzeW1ib2wsIGxvb2sgZm9yIHRoZSBsaW5lIG51bWJlciBvZiB0aGUKLWFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4gIEZvciBhbiB1bmRlZmluZWQgc3ltYm9sLCBsb29rIGZvciB0aGUgbGluZQotbnVtYmVyIG9mIGEgcmVsb2NhdGlvbiBlbnRyeSB3aGljaCByZWZlcnMgdG8gdGhlIHN5bWJvbC4gIElmIGxpbmUgbnVtYmVyCi1pbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQsIHByaW50IGl0IGFmdGVyIHRoZSBvdGhlciBzeW1ib2wgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1uCi1AaXRlbXggLXYKLUBpdGVteCAtLW51bWVyaWMtc29ydCAKLVNvcnQgc3ltYm9scyBudW1lcmljYWxseSBieSB0aGVpciBhZGRyZXNzZXMsIHJhdGhlciB0aGFuIGFscGhhYmV0aWNhbGx5Ci1ieSB0aGVpciBuYW1lcy4gCi0KLUBpdGVtIC1wCi1AaXRlbXggLS1uby1zb3J0IAotQGNpbmRleCBzb3J0aW5nIHN5bWJvbHMKLURvIG5vdCBib3RoZXIgdG8gc29ydCB0aGUgc3ltYm9scyBpbiBhbnkgb3JkZXI7IHByaW50IHRoZW0gaW4gdGhlIG9yZGVyCi1lbmNvdW50ZXJlZC4KLQotQGl0ZW0gLVAKLUBpdGVteCAtLXBvcnRhYmlsaXR5Ci1Vc2UgdGhlIFBPU0lYLjIgc3RhbmRhcmQgb3V0cHV0IGZvcm1hdCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGZvcm1hdC4KLUVxdWl2YWxlbnQgdG8gQHNhbXB7LWYgcG9zaXh9LgotCi1AaXRlbSAtcwotQGl0ZW14IC0tcHJpbnQtYXJtYXAKLUBjaW5kZXggc3ltYm9sIGluZGV4LCBsaXN0aW5nCi1XaGVuIGxpc3Rpbmcgc3ltYm9scyBmcm9tIGFyY2hpdmUgbWVtYmVycywgaW5jbHVkZSB0aGUgaW5kZXg6IGEgbWFwcGluZwotKHN0b3JlZCBpbiB0aGUgYXJjaGl2ZSBieSBAY29kZXthcn0gb3IgQGNvZGV7cmFubGlifSkgb2Ygd2hpY2ggbW9kdWxlcwotY29udGFpbiBkZWZpbml0aW9ucyBmb3Igd2hpY2ggbmFtZXMuCi0KLUBpdGVtIC1yCi1AaXRlbXggLS1yZXZlcnNlLXNvcnQgCi1SZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgc29ydCAod2hldGhlciBudW1lcmljIG9yIGFscGhhYmV0aWMpOyBsZXQgdGhlCi1sYXN0IGNvbWUgZmlyc3QuCi0KLUBpdGVtIC0tc2l6ZS1zb3J0Ci1Tb3J0IHN5bWJvbHMgYnkgc2l6ZS4gIFRoZSBzaXplIGlzIGNvbXB1dGVkIGFzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLXRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFuZCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB3aXRoIHRoZSBuZXh0IGhpZ2hlcgotdmFsdWUuICBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGlzIHByaW50ZWQsIHJhdGhlciB0aGFuIHRoZSB2YWx1ZS4KLQotQGl0ZW0gLXQgQHZhcntyYWRpeH0KLUBpdGVteCAtLXJhZGl4PUB2YXJ7cmFkaXh9Ci1Vc2UgQHZhcntyYWRpeH0gYXMgdGhlIHJhZGl4IGZvciBwcmludGluZyB0aGUgc3ltYm9sIHZhbHVlcy4gIEl0IG11c3QgYmUKLUBzYW1we2R9IGZvciBkZWNpbWFsLCBAc2FtcHtvfSBmb3Igb2N0YWwsIG9yIEBzYW1we3h9IGZvciBoZXhhZGVjaW1hbC4KLQotQGl0ZW0gLS10YXJnZXQ9QHZhcntiZmRuYW1lfQotQGNpbmRleCBvYmplY3QgY29kZSBmb3JtYXQKLVNwZWNpZnkgYW4gb2JqZWN0IGNvZGUgZm9ybWF0IG90aGVyIHRoYW4geW91ciBzeXN0ZW0ncyBkZWZhdWx0IGZvcm1hdC4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLXUKLUBpdGVteCAtLXVuZGVmaW5lZC1vbmx5IAotQGNpbmRleCBleHRlcm5hbCBzeW1ib2xzCi1AY2luZGV4IHVuZGVmaW5lZCBzeW1ib2xzCi1EaXNwbGF5IG9ubHkgdW5kZWZpbmVkIHN5bWJvbHMgKHRob3NlIGV4dGVybmFsIHRvIGVhY2ggb2JqZWN0IGZpbGUpLgotCi1AaXRlbSAtLWRlZmluZWQtb25seQotQGNpbmRleCBleHRlcm5hbCBzeW1ib2xzCi1AY2luZGV4IHVuZGVmaW5lZCBzeW1ib2xzCi1EaXNwbGF5IG9ubHkgZGVmaW5lZCBzeW1ib2xzIGZvciBlYWNoIG9iamVjdCBmaWxlLgotCi1AaXRlbSAtVgotQGl0ZW14IC0tdmVyc2lvbgotU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7bm19IGFuZCBleGl0LgotCi1AaXRlbSAtLWhlbHAKLVNob3cgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIEBjb2Rle25tfSBhbmQgZXhpdC4KLUBlbmQgdGFibGUKLQotQG5vZGUgb2JqY29weQotQGNoYXB0ZXIgb2JqY29weQotCi1Ac21hbGxleGFtcGxlCi1vYmpjb3B5IFsgLUYgQHZhcntiZmRuYW1lfSB8IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQotICAgICAgICBbIC1JIEB2YXJ7YmZkbmFtZX0gfCAtLWlucHV0LXRhcmdldD1AdmFye2JmZG5hbWV9IF0KLSAgICAgICAgWyAtTyBAdmFye2JmZG5hbWV9IHwgLS1vdXRwdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQotICAgICAgICBbIC1TIHwgLS1zdHJpcC1hbGwgXSAgWyAtZyB8IC0tc3RyaXAtZGVidWcgXQotICAgICAgICBbIC1LIEB2YXJ7c3ltYm9sbmFtZX0gfCAtLWtlZXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0gXQotICAgICAgICBbIC1OIEB2YXJ7c3ltYm9sbmFtZX0gfCAtLXN0cmlwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9IF0KLSAgICAgICAgWyAtTCBAdmFye3N5bWJvbG5hbWV9IHwgLS1sb2NhbGl6ZS1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfSBdCi0gICAgICAgIFsgLVcgQHZhcntzeW1ib2xuYW1lfSB8IC0td2Vha2VuLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9IF0KLSAgICAgICAgWyAteCB8IC0tZGlzY2FyZC1hbGwgXSAgWyAtWCB8IC0tZGlzY2FyZC1sb2NhbHMgXQotICAgICAgICBbIC1iIEB2YXJ7Ynl0ZX0gfCAtLWJ5dGU9QHZhcntieXRlfSBdCi0gICAgICAgIFsgLWkgQHZhcntpbnRlcmxlYXZlfSB8IC0taW50ZXJsZWF2ZT1AdmFye2ludGVybGVhdmV9IF0KLSAgICAgICAgWyAtUiBAdmFye3NlY3Rpb25uYW1lfSB8IC0tcmVtb3ZlLXNlY3Rpb249QHZhcntzZWN0aW9ubmFtZX0gXQotICAgICAgICBbIC1wIHwgLS1wcmVzZXJ2ZS1kYXRlcyBdIFsgLS1kZWJ1Z2dpbmcgXQotICAgICAgICBbIC0tZ2FwLWZpbGw9QHZhcnt2YWx9IF0gWyAtLXBhZC10bz1AdmFye2FkZHJlc3N9IF0KLSAgICAgICAgWyAtLXNldC1zdGFydD1AdmFye3ZhbH0gXSBbIC0tYWRqdXN0LXN0YXJ0PUB2YXJ7aW5jcn0gXQotICAgICAgICBbIC0tY2hhbmdlLWFkZHJlc3Nlcz1AdmFye2luY3J9IF0KLSAgICAgICAgWyAtLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3M9QHZhcntzZWN0aW9ufUB7PSwrLC1AfUB2YXJ7dmFsfSBdCi0gICAgICAgIFsgLS1jaGFuZ2Utc2VjdGlvbi1sbWE9QHZhcntzZWN0aW9ufUB7PSwrLC1AfUB2YXJ7dmFsfSBdCi0gICAgICAgIFsgLS1jaGFuZ2Utc2VjdGlvbi12bWE9QHZhcntzZWN0aW9ufUB7PSwrLC1AfUB2YXJ7dmFsfSBdCi0gICAgICAgIFsgLS1jaGFuZ2Utd2FybmluZ3MgXSBbIC0tbm8tY2hhbmdlLXdhcm5pbmdzIF0KLSAgICAgICAgWyAtLXNldC1zZWN0aW9uLWZsYWdzPUB2YXJ7c2VjdGlvbn09QHZhcntmbGFnc30gXQotICAgICAgICBbIC0tYWRkLXNlY3Rpb249QHZhcntzZWN0aW9ubmFtZX09QHZhcntmaWxlbmFtZX0gXQotICAgICAgICBbIC0tY2hhbmdlLWxlYWRpbmctY2hhciBdIFsgLS1yZW1vdmUtbGVhZGluZy1jaGFyIF0KLSAgICAgICAgWyAtLXdlYWtlbiBdCi0gICAgICAgIFsgLXYgfCAtLXZlcmJvc2UgXSBbIC1WIHwgLS12ZXJzaW9uIF0gIFsgLS1oZWxwIF0KLSAgICAgICAgQHZhcntpbmZpbGV9IFtAdmFye291dGZpbGV9XQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEBzY3tnbnV9IEBjb2Rle29iamNvcHl9IHV0aWxpdHkgY29waWVzIHRoZSBjb250ZW50cyBvZiBhbiBvYmplY3QKLWZpbGUgdG8gYW5vdGhlci4gIEBjb2Rle29iamNvcHl9IHVzZXMgdGhlIEBzY3tnbnV9IEBzY3tiZmR9IExpYnJhcnkgdG8KLXJlYWQgYW5kIHdyaXRlIHRoZSBvYmplY3QgZmlsZXMuICBJdCBjYW4gd3JpdGUgdGhlIGRlc3RpbmF0aW9uIG9iamVjdAotZmlsZSBpbiBhIGZvcm1hdCBkaWZmZXJlbnQgZnJvbSB0aGF0IG9mIHRoZSBzb3VyY2Ugb2JqZWN0IGZpbGUuICBUaGUKLWV4YWN0IGJlaGF2aW9yIG9mIEBjb2Rle29iamNvcHl9IGlzIGNvbnRyb2xsZWQgYnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCi0KLUBjb2Rle29iamNvcHl9IGNyZWF0ZXMgdGVtcG9yYXJ5IGZpbGVzIHRvIGRvIGl0cyB0cmFuc2xhdGlvbnMgYW5kCi1kZWxldGVzIHRoZW0gYWZ0ZXJ3YXJkLiAgQGNvZGV7b2JqY29weX0gdXNlcyBAc2N7YmZkfSB0byBkbyBhbGwgaXRzCi10cmFuc2xhdGlvbiB3b3JrOyBpdCBoYXMgYWNjZXNzIHRvIGFsbCB0aGUgZm9ybWF0cyBkZXNjcmliZWQgaW4gQHNje2JmZH0KLWFuZCB0aHVzIGlzIGFibGUgdG8gcmVjb2duaXplIG1vc3QgZm9ybWF0cyB3aXRob3V0IGJlaW5nIHRvbGQKLWV4cGxpY2l0bHkuICBAeHJlZntCRkQsLEJGRCxsZC5pbmZvLFVzaW5nIExEfS4KLQotQGNvZGV7b2JqY29weX0gY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgUy1yZWNvcmRzIGJ5IHVzaW5nIGFuIG91dHB1dAotdGFyZ2V0IG9mIEBzYW1we3NyZWN9IChlLmcuLCB1c2UgQHNhbXB7LU8gc3JlY30pLgotCi1AY29kZXtvYmpjb3B5fSBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIHJhdyBiaW5hcnkgZmlsZSBieSB1c2luZyBhbgotb3V0cHV0IHRhcmdldCBvZiBAc2FtcHtiaW5hcnl9IChlLmcuLCB1c2UgQHNhbXB7LU8gYmluYXJ5fSkuICBXaGVuCi1AY29kZXtvYmpjb3B5fSBnZW5lcmF0ZXMgYSByYXcgYmluYXJ5IGZpbGUsIGl0IHdpbGwgZXNzZW50aWFsbHkgcHJvZHVjZQotYSBtZW1vcnkgZHVtcCBvZiB0aGUgY29udGVudHMgb2YgdGhlIGlucHV0IG9iamVjdCBmaWxlLiAgQWxsIHN5bWJvbHMgYW5kCi1yZWxvY2F0aW9uIGluZm9ybWF0aW9uIHdpbGwgYmUgZGlzY2FyZGVkLiAgVGhlIG1lbW9yeSBkdW1wIHdpbGwgc3RhcnQgYXQKLXRoZSBsb2FkIGFkZHJlc3Mgb2YgdGhlIGxvd2VzdCBzZWN0aW9uIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KLQotV2hlbiBnZW5lcmF0aW5nIGFuIFMtcmVjb3JkIG9yIGEgcmF3IGJpbmFyeSBmaWxlLCBpdCBtYXkgYmUgaGVscGZ1bCB0bwotdXNlIEBzYW1wey1TfSB0byByZW1vdmUgc2VjdGlvbnMgY29udGFpbmluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBJbgotc29tZSBjYXNlcyBAc2FtcHstUn0gd2lsbCBiZSB1c2VmdWwgdG8gcmVtb3ZlIHNlY3Rpb25zIHdoaWNoIGNvbnRhaW4KLWluZm9ybWF0aW9uIHdoaWNoIGlzIG5vdCBuZWVkZWQgYnkgdGhlIGJpbmFyeSBmaWxlLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIEB2YXJ7aW5maWxlfQotQGl0ZW14IEB2YXJ7b3V0ZmlsZX0KLVRoZSBzb3VyY2UgYW5kIG91dHB1dCBmaWxlcywgcmVzcGVjdGl2ZWx5LgotSWYgeW91IGRvIG5vdCBzcGVjaWZ5IEB2YXJ7b3V0ZmlsZX0sIEBjb2Rle29iamNvcHl9IGNyZWF0ZXMgYQotdGVtcG9yYXJ5IGZpbGUgYW5kIGRlc3RydWN0aXZlbHkgcmVuYW1lcyB0aGUgcmVzdWx0IHdpdGgKLXRoZSBuYW1lIG9mIEB2YXJ7aW5maWxlfS4KLQotQGl0ZW0gLUkgQHZhcntiZmRuYW1lfQkKLUBpdGVteCAtLWlucHV0LXRhcmdldD1AdmFye2JmZG5hbWV9Ci1Db25zaWRlciB0aGUgc291cmNlIGZpbGUncyBvYmplY3QgZm9ybWF0IHRvIGJlIEB2YXJ7YmZkbmFtZX0sIHJhdGhlciB0aGFuCi1hdHRlbXB0aW5nIHRvIGRlZHVjZSBpdC4gIEB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLU8gQHZhcntiZmRuYW1lfQotQGl0ZW14IC0tb3V0cHV0LXRhcmdldD1AdmFye2JmZG5hbWV9Ci1Xcml0ZSB0aGUgb3V0cHV0IGZpbGUgdXNpbmcgdGhlIG9iamVjdCBmb3JtYXQgQHZhcntiZmRuYW1lfS4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLUYgQHZhcntiZmRuYW1lfQotQGl0ZW14IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLVVzZSBAdmFye2JmZG5hbWV9IGFzIHRoZSBvYmplY3QgZm9ybWF0IGZvciBib3RoIHRoZSBpbnB1dCBhbmQgdGhlIG91dHB1dAotZmlsZTsgaS5lLiwgc2ltcGx5IHRyYW5zZmVyIGRhdGEgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24gd2l0aCBubwotdHJhbnNsYXRpb24uICBAeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1SIEB2YXJ7c2VjdGlvbm5hbWV9Ci1AaXRlbXggLS1yZW1vdmUtc2VjdGlvbj1AdmFye3NlY3Rpb25uYW1lfQotUmVtb3ZlIGFueSBzZWN0aW9uIG5hbWVkIEB2YXJ7c2VjdGlvbm5hbWV9IGZyb20gdGhlIG91dHB1dCBmaWxlLiAgVGhpcwotb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4gIE5vdGUgdGhhdCB1c2luZyB0aGlzIG9wdGlvbgotaW5hcHByb3ByaWF0ZWx5IG1heSBtYWtlIHRoZSBvdXRwdXQgZmlsZSB1bnVzYWJsZS4KLQotQGl0ZW0gLVMKLUBpdGVteCAtLXN0cmlwLWFsbAotRG8gbm90IGNvcHkgcmVsb2NhdGlvbiBhbmQgc3ltYm9sIGluZm9ybWF0aW9uIGZyb20gdGhlIHNvdXJjZSBmaWxlLgotCi1AaXRlbSAtZwotQGl0ZW14IC0tc3RyaXAtZGVidWcKLURvIG5vdCBjb3B5IGRlYnVnZ2luZyBzeW1ib2xzIGZyb20gdGhlIHNvdXJjZSBmaWxlLgotCi1AaXRlbSAtLXN0cmlwLXVubmVlZGVkCi1TdHJpcCBhbGwgc3ltYm9scyB0aGF0IGFyZSBub3QgbmVlZGVkIGZvciByZWxvY2F0aW9uIHByb2Nlc3NpbmcuCi0KLUBpdGVtIC1LIEB2YXJ7c3ltYm9sbmFtZX0KLUBpdGVteCAtLWtlZXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0KLUNvcHkgb25seSBzeW1ib2wgQHZhcntzeW1ib2xuYW1lfSBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gIFRoaXMgb3B0aW9uIG1heQotYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0KLUBpdGVtIC1OIEB2YXJ7c3ltYm9sbmFtZX0KLUBpdGVteCAtLXN0cmlwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9Ci1EbyBub3QgY29weSBzeW1ib2wgQHZhcntzeW1ib2xuYW1lfSBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gIFRoaXMgb3B0aW9uCi1tYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0KLUBpdGVtIC1MIEB2YXJ7c3ltYm9sbmFtZX0KLUBpdGVteCAtLWxvY2FsaXplLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9Ci1NYWtlIHN5bWJvbCBAdmFye3N5bWJvbG5hbWV9IGxvY2FsIHRvIHRoZSBmaWxlLCBzbyB0aGF0IGl0IGlzIG5vdAotdmlzaWJsZSBleHRlcm5hbGx5LiAgVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotCi1AaXRlbSAtVyBAdmFye3N5bWJvbG5hbWV9Ci1AaXRlbXggLS13ZWFrZW4tc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0KLU1ha2Ugc3ltYm9sIEB2YXJ7c3ltYm9sbmFtZX0gd2Vhay4gVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotCi1AaXRlbSAteAotQGl0ZW14IC0tZGlzY2FyZC1hbGwKLURvIG5vdCBjb3B5IG5vbi1nbG9iYWwgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLUBjIEZJWE1FIGFueSByZWFzb24gdG8gcHJlZmVyICJub24tZ2xvYmFsIiB0byAibG9jYWwiIGhlcmU/Ci0KLUBpdGVtIC1YCi1AaXRlbXggLS1kaXNjYXJkLWxvY2FscwotRG8gbm90IGNvcHkgY29tcGlsZXItZ2VuZXJhdGVkIGxvY2FsIHN5bWJvbHMuCi0oVGhlc2UgdXN1YWxseSBzdGFydCB3aXRoIEBzYW1we0x9IG9yIEBzYW1wey59LikKLQotQGl0ZW0gLWIgQHZhcntieXRlfQotQGl0ZW14IC0tYnl0ZT1AdmFye2J5dGV9Ci1LZWVwIG9ubHkgZXZlcnkgQHZhcntieXRlfXRoIGJ5dGUgb2YgdGhlIGlucHV0IGZpbGUgKGhlYWRlciBkYXRhIGlzIG5vdAotYWZmZWN0ZWQpLiAgQHZhcntieXRlfSBjYW4gYmUgaW4gdGhlIHJhbmdlIGZyb20gMCB0byBAdmFye2ludGVybGVhdmV9LTEsCi13aGVyZSBAdmFye2ludGVybGVhdmV9IGlzIGdpdmVuIGJ5IHRoZSBAc2FtcHstaX0gb3IgQHNhbXB7LS1pbnRlcmxlYXZlfQotb3B0aW9uLCBvciB0aGUgZGVmYXVsdCBvZiA0LiAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIGZvciBjcmVhdGluZyBmaWxlcwotdG8gcHJvZ3JhbSBAc2N7cm9tfS4gIEl0IGlzIHR5cGljYWxseSB1c2VkIHdpdGggYW4gQGNvZGV7c3JlY30gb3V0cHV0Ci10YXJnZXQuCi0KLUBpdGVtIC1pIEB2YXJ7aW50ZXJsZWF2ZX0KLUBpdGVteCAtLWludGVybGVhdmU9QHZhcntpbnRlcmxlYXZlfQotT25seSBjb3B5IG9uZSBvdXQgb2YgZXZlcnkgQHZhcntpbnRlcmxlYXZlfSBieXRlcy4gIFNlbGVjdCB3aGljaCBieXRlIHRvCi1jb3B5IHdpdGggdGhlIEB2YXJ7LWJ9IG9yIEBzYW1wey0tYnl0ZX0gb3B0aW9uLiAgVGhlIGRlZmF1bHQgaXMgNC4KLUBjb2Rle29iamNvcHl9IGlnbm9yZXMgdGhpcyBvcHRpb24gaWYgeW91IGRvIG5vdCBzcGVjaWZ5IGVpdGhlciBAc2FtcHstYn0gb3IKLUBzYW1wey0tYnl0ZX0uCi0KLUBpdGVtIC1wCi1AaXRlbXggLS1wcmVzZXJ2ZS1kYXRlcwotU2V0IHRoZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiBkYXRlcyBvZiB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgdGhlIHNhbWUKLWFzIHRob3NlIG9mIHRoZSBpbnB1dCBmaWxlLgotCi1AaXRlbSAtLWRlYnVnZ2luZwotQ29udmVydCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGlmIHBvc3NpYmxlLiAgVGhpcyBpcyBub3QgdGhlIGRlZmF1bHQKLWJlY2F1c2Ugb25seSBjZXJ0YWluIGRlYnVnZ2luZyBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQsIGFuZCB0aGUKLWNvbnZlcnNpb24gcHJvY2VzcyBjYW4gYmUgdGltZSBjb25zdW1pbmcuCi0KLUBpdGVtIC0tZ2FwLWZpbGwgQHZhcnt2YWx9Ci1GaWxsIGdhcHMgYmV0d2VlbiBzZWN0aW9ucyB3aXRoIEB2YXJ7dmFsfS4gIFRoaXMgb3BlcmF0aW9uIGFwcGxpZXMgdG8KLXRoZSBAZW1waHtsb2FkIGFkZHJlc3N9IChMTUEpIG9mIHRoZSBzZWN0aW9ucy4gIEl0IGlzIGRvbmUgYnkgaW5jcmVhc2luZwotdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gd2l0aCB0aGUgbG93ZXIgYWRkcmVzcywgYW5kIGZpbGxpbmcgaW4gdGhlIGV4dHJhCi1zcGFjZSBjcmVhdGVkIHdpdGggQHZhcnt2YWx9LgotCi1AaXRlbSAtLXBhZC10byBAdmFye2FkZHJlc3N9Ci1QYWQgdGhlIG91dHB1dCBmaWxlIHVwIHRvIHRoZSBsb2FkIGFkZHJlc3MgQHZhcnthZGRyZXNzfS4gIFRoaXMgaXMKLWRvbmUgYnkgaW5jcmVhc2luZyB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBzZWN0aW9uLiAgVGhlIGV4dHJhIHNwYWNlIGlzCi1maWxsZWQgaW4gd2l0aCB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IEBzYW1wey0tZ2FwLWZpbGx9IChkZWZhdWx0IHplcm8pLgotCi1AaXRlbSAtLXNldC1zdGFydCBAdmFye3ZhbH0KLVNldCB0aGUgYWRkcmVzcyBvZiB0aGUgbmV3IGZpbGUgdG8gQHZhcnt2YWx9LiAgTm90IGFsbCBvYmplY3QgZmlsZQotZm9ybWF0cyBzdXBwb3J0IHNldHRpbmcgdGhlIHN0YXJ0IGFkZHJlc3MuCi0KLUBpdGVtIC0tY2hhbmdlLXN0YXJ0IEB2YXJ7aW5jcn0KLUBpdGVteCAtLWFkanVzdC1zdGFydCBAdmFye2luY3J9Ci1AY2luZGV4IGNoYW5naW5nIHN0YXJ0IGFkZHJlc3MKLUNoYW5nZSB0aGUgc3RhcnQgYWRkcmVzcyBieSBhZGRpbmcgQHZhcntpbmNyfS4gIE5vdCBhbGwgb2JqZWN0IGZpbGUKLWZvcm1hdHMgc3VwcG9ydCBzZXR0aW5nIHRoZSBzdGFydCBhZGRyZXNzLgotCi1AaXRlbSAtLWNoYW5nZS1hZGRyZXNzZXMgQHZhcntpbmNyfQotQGl0ZW14IC0tYWRqdXN0LXZtYSBAdmFye2luY3J9Ci1AY2luZGV4IGNoYW5naW5nIG9iamVjdCBhZGRyZXNzZXMKLUNoYW5nZSB0aGUgVk1BIGFuZCBMTUEgYWRkcmVzc2VzIG9mIGFsbCBzZWN0aW9ucywgYXMgd2VsbCBhcyB0aGUgc3RhcnQKLWFkZHJlc3MsIGJ5IGFkZGluZyBAdmFye2luY3J9LiAgU29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIGRvIG5vdCBwZXJtaXQKLXNlY3Rpb24gYWRkcmVzc2VzIHRvIGJlIGNoYW5nZWQgYXJiaXRyYXJpbHkuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdAotcmVsb2NhdGUgdGhlIHNlY3Rpb25zOyBpZiB0aGUgcHJvZ3JhbSBleHBlY3RzIHNlY3Rpb25zIHRvIGJlIGxvYWRlZCBhdCBhCi1jZXJ0YWluIGFkZHJlc3MsIGFuZCB0aGlzIG9wdGlvbiBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgc2VjdGlvbnMgc3VjaAotdGhhdCB0aGV5IGFyZSBsb2FkZWQgYXQgYSBkaWZmZXJlbnQgYWRkcmVzcywgdGhlIHByb2dyYW0gbWF5IGZhaWwuIAotCi1AaXRlbSAtLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3MgQHZhcntzZWN0aW9ufUB7PSwrLC1AfUB2YXJ7dmFsfQotQGl0ZW14IC0tYWRqdXN0LXNlY3Rpb24tdm1hIEB2YXJ7c2VjdGlvbn1Aez0sKywtQH1AdmFye3ZhbH0KLUBjaW5kZXggY2hhbmdpbmcgc2VjdGlvbiBhZGRyZXNzCi1TZXQgb3IgY2hhbmdlIGJvdGggdGhlIFZNQSBhZGRyZXNzIGFuZCB0aGUgTE1BIGFkZHJlc3Mgb2YgdGhlIG5hbWVkCi1AdmFye3NlY3Rpb259LiAgSWYgQHNhbXB7PX0gaXMgdXNlZCwgdGhlIHNlY3Rpb24gYWRkcmVzcyBpcyBzZXQgdG8KLUB2YXJ7dmFsfS4gIE90aGVyd2lzZSwgQHZhcnt2YWx9IGlzIGFkZGVkIHRvIG9yIHN1YnRyYWN0ZWQgZnJvbSB0aGUKLXNlY3Rpb24gYWRkcmVzcy4gIFNlZSB0aGUgY29tbWVudHMgdW5kZXIgQHNhbXB7LS1jaGFuZ2UtYWRkcmVzc2VzfSwKLWFib3ZlLiBJZiBAdmFye3NlY3Rpb259IGRvZXMgbm90IGV4aXN0IGluIHRoZSBpbnB1dCBmaWxlLCBhIHdhcm5pbmcgd2lsbAotYmUgaXNzdWVkLCB1bmxlc3MgQHNhbXB7LS1uby1jaGFuZ2Utd2FybmluZ3N9IGlzIHVzZWQuCi0KLUBpdGVtIC0tY2hhbmdlLXNlY3Rpb24tbG1hIEB2YXJ7c2VjdGlvbn1Aez0sKywtQH1AdmFye3ZhbH0KLUBjaW5kZXggY2hhbmdpbmcgc2VjdGlvbiBMTUEKLVNldCBvciBjaGFuZ2UgdGhlIExNQSBhZGRyZXNzIG9mIHRoZSBuYW1lZCBAdmFye3NlY3Rpb259LiAgVGhlIExNQQotYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgc2VjdGlvbiB3aWxsIGJlIGxvYWRlZCBpbnRvIG1lbW9yeSBhdAotcHJvZ3JhbSBsb2FkIHRpbWUuICBOb3JtYWxseSB0aGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBWTUEgYWRkcmVzcywgd2hpY2gKLWlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIGF0IHByb2dyYW0gcnVuIHRpbWUsIGJ1dCBvbiBzb21lIHN5c3RlbXMsCi1lc3BlY2lhbGx5IHRob3NlIHdoZXJlIGEgcHJvZ3JhbSBpcyBoZWxkIGluIFJPTSwgdGhlIHR3byBjYW4gYmUKLWRpZmZlcmVudC4gIElmIEBzYW1wez19IGlzIHVzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MgaXMgc2V0IHRvCi1AdmFye3ZhbH0uICBPdGhlcndpc2UsIEB2YXJ7dmFsfSBpcyBhZGRlZCB0byBvciBzdWJ0cmFjdGVkIGZyb20gdGhlCi1zZWN0aW9uIGFkZHJlc3MuICBTZWUgdGhlIGNvbW1lbnRzIHVuZGVyIEBzYW1wey0tY2hhbmdlLWFkZHJlc3Nlc30sCi1hYm92ZS4gIElmIEB2YXJ7c2VjdGlvbn0gZG9lcyBub3QgZXhpc3QgaW4gdGhlIGlucHV0IGZpbGUsIGEgd2FybmluZwotd2lsbCBiZSBpc3N1ZWQsIHVubGVzcyBAc2FtcHstLW5vLWNoYW5nZS13YXJuaW5nc30gaXMgdXNlZC4gIAotCi1AaXRlbSAtLWNoYW5nZS1zZWN0aW9uLXZtYSBAdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9Ci1AY2luZGV4IGNoYW5naW5nIHNlY3Rpb24gVk1BCi1TZXQgb3IgY2hhbmdlIHRoZSBWTUEgYWRkcmVzcyBvZiB0aGUgbmFtZWQgQHZhcntzZWN0aW9ufS4gIFRoZSBWTUEKLWFkZHJlc3MgaXMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHNlY3Rpb24gd2lsbCBiZSBsb2NhdGVkIG9uY2UgdGhlCi1wcm9ncmFtIGhhcyBzdGFydGVkIGV4ZWN1dGluZy4gIE5vcm1hbGx5IHRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIExNQQotYWRkcmVzcywgd2hpY2ggaXMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHNlY3Rpb24gd2lsbCBiZSBsb2FkZWQgaW50bwotbWVtb3J5LCBidXQgb24gc29tZSBzeXN0ZW1zLCBlc3BlY2lhbGx5IHRob3NlIHdoZXJlIGEgcHJvZ3JhbSBpcyBoZWxkIGluCi1ST00sIHRoZSB0d28gY2FuIGJlIGRpZmZlcmVudC4gIElmIEBzYW1wez19IGlzIHVzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MKLWlzIHNldCB0byBAdmFye3ZhbH0uICBPdGhlcndpc2UsIEB2YXJ7dmFsfSBpcyBhZGRlZCB0byBvciBzdWJ0cmFjdGVkCi1mcm9tIHRoZSBzZWN0aW9uIGFkZHJlc3MuICBTZWUgdGhlIGNvbW1lbnRzIHVuZGVyCi1Ac2FtcHstLWNoYW5nZS1hZGRyZXNzZXN9LCBhYm92ZS4gIElmIEB2YXJ7c2VjdGlvbn0gZG9lcyBub3QgZXhpc3QgaW4KLXRoZSBpbnB1dCBmaWxlLCBhIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQsIHVubGVzcwotQHNhbXB7LS1uby1jaGFuZ2Utd2FybmluZ3N9IGlzIHVzZWQuICAgCi0KLUBpdGVtIC0tY2hhbmdlLXdhcm5pbmdzCi1AaXRlbXggLS1hZGp1c3Qtd2FybmluZ3MKLUlmIEBzYW1wey0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzc30gb3IgQHNhbXB7LS1jaGFuZ2Utc2VjdGlvbi1sbWF9IG9yCi1Ac2FtcHstLWNoYW5nZS1zZWN0aW9uLXZtYX0gaXMgdXNlZCwgYW5kIHRoZSBuYW1lZCBzZWN0aW9uIGRvZXMgbm90Ci1leGlzdCwgaXNzdWUgYSB3YXJuaW5nLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4gCi0KLUBpdGVtIC0tbm8tY2hhbmdlLXdhcm5pbmdzCi1AaXRlbXggLS1uby1hZGp1c3Qtd2FybmluZ3MKLURvIG5vdCBpc3N1ZSBhIHdhcm5pbmcgaWYgQHNhbXB7LS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzfSBvcgotQHNhbXB7LS1hZGp1c3Qtc2VjdGlvbi1sbWF9IG9yIEBzYW1wey0tYWRqdXN0LXNlY3Rpb24tdm1hfSBpcyB1c2VkLCBldmVuCi1pZiB0aGUgbmFtZWQgc2VjdGlvbiBkb2VzIG5vdCBleGlzdC4gCi0KLUBpdGVtIC0tc2V0LXNlY3Rpb24tZmxhZ3MgQHZhcntzZWN0aW9ufT1AdmFye2ZsYWdzfQotU2V0IHRoZSBmbGFncyBmb3IgdGhlIG5hbWVkIHNlY3Rpb24uICBUaGUgQHZhcntmbGFnc30gYXJndW1lbnQgaXMgYQotY29tbWEgc2VwYXJhdGVkIHN0cmluZyBvZiBmbGFnIG5hbWVzLiAgVGhlIHJlY29nbml6ZWQgbmFtZXMgYXJlCi1Ac2FtcHthbGxvY30sIEBzYW1we2NvbnRlbnRzfSwgQHNhbXB7bG9hZH0sIEBzYW1we3JlYWRvbmx5fSwKLUBzYW1we2NvZGV9LCBAc2FtcHtkYXRhfSwgYW5kIEBzYW1we3JvbX0uICBZb3UgY2FuIHNldCB0aGUKLUBzYW1we2NvbnRlbnRzfSBmbGFnIGZvciBhIHNlY3Rpb24gd2hpY2ggZG9lcyBub3QgaGF2ZSBjb250ZW50cywgYnV0IGl0Ci1pcyBub3QgbWVhbmluZ2Z1bCB0byBjbGVhciB0aGUgQHNhbXB7Y29udGVudHN9IGZsYWcgb2YgYSBzZWN0aW9uIHdoaWNoCi1kb2VzIGhhdmUgY29udGVudHMtLWp1c3QgcmVtb3ZlIHRoZSBzZWN0aW9uIGluc3RlYWQuICBOb3QgYWxsIGZsYWdzIGFyZQotbWVhbmluZ2Z1bCBmb3IgYWxsIG9iamVjdCBmaWxlIGZvcm1hdHMuCi0KLUBpdGVtIC0tYWRkLXNlY3Rpb24gQHZhcntzZWN0aW9ubmFtZX09QHZhcntmaWxlbmFtZX0KLUFkZCBhIG5ldyBzZWN0aW9uIG5hbWVkIEB2YXJ7c2VjdGlvbm5hbWV9IHdoaWxlIGNvcHlpbmcgdGhlIGZpbGUuICBUaGUKLWNvbnRlbnRzIG9mIHRoZSBuZXcgc2VjdGlvbiBhcmUgdGFrZW4gZnJvbSB0aGUgZmlsZSBAdmFye2ZpbGVuYW1lfS4gIFRoZQotc2l6ZSBvZiB0aGUgc2VjdGlvbiB3aWxsIGJlIHRoZSBzaXplIG9mIHRoZSBmaWxlLiAgVGhpcyBvcHRpb24gb25seQotd29ya3Mgb24gZmlsZSBmb3JtYXRzIHdoaWNoIGNhbiBzdXBwb3J0IHNlY3Rpb25zIHdpdGggYXJiaXRyYXJ5IG5hbWVzLgotCi1AaXRlbSAtLWNoYW5nZS1sZWFkaW5nLWNoYXIKLVNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyB1c2Ugc3BlY2lhbCBjaGFyYWN0ZXJzIGF0IHRoZSBzdGFydCBvZgotc3ltYm9scy4gIFRoZSBtb3N0IGNvbW1vbiBzdWNoIGNoYXJhY3RlciBpcyB1bmRlcnNjb3JlLCB3aGljaCBjb21waWxlcnMKLW9mdGVuIGFkZCBiZWZvcmUgZXZlcnkgc3ltYm9sLiAgVGhpcyBvcHRpb24gdGVsbHMgQGNvZGV7b2JqY29weX0gdG8KLWNoYW5nZSB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgb2YgZXZlcnkgc3ltYm9sIHdoZW4gaXQgY29udmVydHMgYmV0d2Vlbgotb2JqZWN0IGZpbGUgZm9ybWF0cy4gIElmIHRoZSBvYmplY3QgZmlsZSBmb3JtYXRzIHVzZSB0aGUgc2FtZSBsZWFkaW5nCi1jaGFyYWN0ZXIsIHRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QuICBPdGhlcndpc2UsIGl0IHdpbGwgYWRkIGEKLWNoYXJhY3Rlciwgb3IgcmVtb3ZlIGEgY2hhcmFjdGVyLCBvciBjaGFuZ2UgYSBjaGFyYWN0ZXIsIGFzCi1hcHByb3ByaWF0ZS4KLQotQGl0ZW0gLS1yZW1vdmUtbGVhZGluZy1jaGFyCi1JZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGEgZ2xvYmFsIHN5bWJvbCBpcyBhIHNwZWNpYWwgc3ltYm9sIGxlYWRpbmcKLWNoYXJhY3RlciB1c2VkIGJ5IHRoZSBvYmplY3QgZmlsZSBmb3JtYXQsIHJlbW92ZSB0aGUgY2hhcmFjdGVyLiAgVGhlCi1tb3N0IGNvbW1vbiBzeW1ib2wgbGVhZGluZyBjaGFyYWN0ZXIgaXMgdW5kZXJzY29yZS4gIFRoaXMgb3B0aW9uIHdpbGwKLXJlbW92ZSBhIGxlYWRpbmcgdW5kZXJzY29yZSBmcm9tIGFsbCBnbG9iYWwgc3ltYm9scy4gIFRoaXMgY2FuIGJlIHVzZWZ1bAotaWYgeW91IHdhbnQgdG8gbGluayB0b2dldGhlciBvYmplY3RzIG9mIGRpZmZlcmVudCBmaWxlIGZvcm1hdHMgd2l0aAotZGlmZmVyZW50IGNvbnZlbnRpb25zIGZvciBzeW1ib2wgbmFtZXMuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tCi1AY29kZXstLWNoYW5nZS1sZWFkaW5nLWNoYXJ9IGJlY2F1c2UgaXQgYWx3YXlzIGNoYW5nZXMgdGhlIHN5bWJvbCBuYW1lCi13aGVuIGFwcHJvcHJpYXRlLCByZWdhcmRsZXNzIG9mIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQgb2YgdGhlIG91dHB1dAotZmlsZS4KLQotQGl0ZW0gLS13ZWFrZW4KLUNoYW5nZSBhbGwgZ2xvYmFsIHN5bWJvbHMgaW4gdGhlIGZpbGUgdG8gYmUgd2Vhay4gIFRoaXMgY2FuIGJlIHVzZWZ1bAotd2hlbiBidWlsZGluZyBhbiBvYmplY3Qgd2hpY2ggd2lsbCBiZSBsaW5rZWQgYWdhaW5zdCBvdGhlciBvYmplY3RzIHVzaW5nCi10aGUgQGNvZGV7LVJ9IG9wdGlvbiB0byB0aGUgbGlua2VyLiAgVGhpcyBvcHRpb24gaXMgb25seSBlZmZlY3RpdmUgd2hlbgotdXNpbmcgYW4gb2JqZWN0IGZpbGUgZm9ybWF0IHdoaWNoIHN1cHBvcnRzIHdlYWsgc3ltYm9scy4KLQotQGl0ZW0gLVYKLUBpdGVteCAtLXZlcnNpb24KLVNob3cgdGhlIHZlcnNpb24gbnVtYmVyIG9mIEBjb2Rle29iamNvcHl9LgotCi1AaXRlbSAtdgotQGl0ZW14IC0tdmVyYm9zZQotVmVyYm9zZSBvdXRwdXQ6IGxpc3QgYWxsIG9iamVjdCBmaWxlcyBtb2RpZmllZC4gIEluIHRoZSBjYXNlIG9mCi1hcmNoaXZlcywgQHNhbXB7b2JqY29weSAtVn0gbGlzdHMgYWxsIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUuCi0KLUBpdGVtIC0taGVscAotU2hvdyBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gQGNvZGV7b2JqY29weX0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIG9iamR1bXAKLUBjaGFwdGVyIG9iamR1bXAKLQotQGNpbmRleCBvYmplY3QgZmlsZSBpbmZvcm1hdGlvbgotQGtpbmRleCBvYmpkdW1wCi0KLUBzbWFsbGV4YW1wbGUKLW9iamR1bXAgWyAtYSB8IC0tYXJjaGl2ZS1oZWFkZXJzIF0gCi0gICAgICAgIFsgLWIgQHZhcntiZmRuYW1lfSB8IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXSBbIC0tZGVidWdnaW5nIF0KLSAgICAgICAgWyAtQyB8IC0tZGVtYW5nbGUgXSBbIC1kIHwgLS1kaXNhc3NlbWJsZSBdCi0gICAgICAgIFsgLUQgfCAtLWRpc2Fzc2VtYmxlLWFsbCBdIFsgLS1kaXNhc3NlbWJsZS16ZXJvZXMgXQotICAgICAgICBbIC1FQiB8IC1FTCB8IC0tZW5kaWFuPUB7YmlnIHwgbGl0dGxlIEB9IF0KLSAgICAgICAgWyAtZiB8IC0tZmlsZS1oZWFkZXJzIF0KLSAgICAgICAgWyAtaCB8IC0tc2VjdGlvbi1oZWFkZXJzIHwgLS1oZWFkZXJzIF0gIFsgLWkgfCAtLWluZm8gXQotICAgICAgICBbIC1qIEB2YXJ7c2VjdGlvbn0gfCAtLXNlY3Rpb249QHZhcntzZWN0aW9ufSBdCi0gICAgICAgIFsgLWwgfCAtLWxpbmUtbnVtYmVycyBdIFsgLVMgfCAtLXNvdXJjZSBdCi0gICAgICAgIFsgLW0gQHZhcnttYWNoaW5lfSB8IC0tYXJjaGl0ZWN0dXJlPUB2YXJ7bWFjaGluZX0gXQotICAgICAgICBbIC1wIHwgLS1wcml2YXRlLWhlYWRlcnMgXQotICAgICAgICBbIC1yIHwgLS1yZWxvYyBdIFsgLVIgfCAtLWR5bmFtaWMtcmVsb2MgXQotICAgICAgICBbIC1zIHwgLS1mdWxsLWNvbnRlbnRzIF0gIFsgLS1zdGFicyBdCi0gICAgICAgIFsgLXQgfCAtLXN5bXMgXSBbIC1UIHwgLS1keW5hbWljLXN5bXMgXSBbIC14IHwgLS1hbGwtaGVhZGVycyBdCi0gICAgICAgIFsgLXcgfCAtLXdpZGUgXSBbIC0tc3RhcnQtYWRkcmVzcz1AdmFye2FkZHJlc3N9IF0KLSAgICAgICAgWyAtLXN0b3AtYWRkcmVzcz1AdmFye2FkZHJlc3N9IF0KLSAgICAgICAgWyAtLXByZWZpeC1hZGRyZXNzZXNdIFsgLS1bbm8tXXNob3ctcmF3LWluc24gXQotICAgICAgICBbIC0tYWRqdXN0LXZtYT1AdmFye29mZnNldH0gXQotICAgICAgICBbIC0tdmVyc2lvbiBdICBbIC0taGVscCBdCi0gICAgICAgIEB2YXJ7b2JqZmlsZX1AZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXtvYmpkdW1wfSBkaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3IgbW9yZSBvYmplY3QgZmlsZXMuCi1UaGUgb3B0aW9ucyBjb250cm9sIHdoYXQgcGFydGljdWxhciBpbmZvcm1hdGlvbiB0byBkaXNwbGF5LiAgVGhpcwotaW5mb3JtYXRpb24gaXMgbW9zdGx5IHVzZWZ1bCB0byBwcm9ncmFtbWVycyB3aG8gYXJlIHdvcmtpbmcgb24gdGhlCi1jb21waWxhdGlvbiB0b29scywgYXMgb3Bwb3NlZCB0byBwcm9ncmFtbWVycyB3aG8ganVzdCB3YW50IHRoZWlyCi1wcm9ncmFtIHRvIGNvbXBpbGUgYW5kIHdvcmsuCi0KLUB2YXJ7b2JqZmlsZX1AZG90c3t9IGFyZSB0aGUgb2JqZWN0IGZpbGVzIHRvIGJlIGV4YW1pbmVkLiAgV2hlbiB5b3UKLXNwZWNpZnkgYXJjaGl2ZXMsIEBjb2Rle29iamR1bXB9IHNob3dzIGluZm9ybWF0aW9uIG9uIGVhY2ggb2YgdGhlIG1lbWJlcgotb2JqZWN0IGZpbGVzLgotCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4gIEF0IGxlYXN0IG9uZSBvcHRpb24gYmVzaWRlcyBAc2FtcHstbH0gbXVzdCBiZSBnaXZlbi4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtYQotQGl0ZW14IC0tYXJjaGl2ZS1oZWFkZXIKLUBjaW5kZXggYXJjaGl2ZSBoZWFkZXJzCi1JZiBhbnkgb2YgdGhlIEB2YXJ7b2JqZmlsZX0gZmlsZXMgYXJlIGFyY2hpdmVzLCBkaXNwbGF5IHRoZSBhcmNoaXZlCi1oZWFkZXIgaW5mb3JtYXRpb24gKGluIGEgZm9ybWF0IHNpbWlsYXIgdG8gQHNhbXB7bHMgLWx9KS4gIEJlc2lkZXMgdGhlCi1pbmZvcm1hdGlvbiB5b3UgY291bGQgbGlzdCB3aXRoIEBzYW1we2FyIHR2fSwgQHNhbXB7b2JqZHVtcCAtYX0gc2hvd3MKLXRoZSBvYmplY3QgZmlsZSBmb3JtYXQgb2YgZWFjaCBhcmNoaXZlIG1lbWJlci4KLQotQGl0ZW0gLS1hZGp1c3Qtdm1hPUB2YXJ7b2Zmc2V0fQotQGNpbmRleCBzZWN0aW9uIGFkZHJlc3NlcyBpbiBvYmpkdW1wCi1AY2luZGV4IFZNQSBpbiBvYmpkdW1wCi1XaGVuIGR1bXBpbmcgaW5mb3JtYXRpb24sIGZpcnN0IGFkZCBAdmFye29mZnNldH0gdG8gYWxsIHRoZSBzZWN0aW9uCi1hZGRyZXNzZXMuICBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgc2VjdGlvbiBhZGRyZXNzZXMgZG8gbm90IGNvcnJlc3BvbmQgdG8KLXRoZSBzeW1ib2wgdGFibGUsIHdoaWNoIGNhbiBoYXBwZW4gd2hlbiBwdXR0aW5nIHNlY3Rpb25zIGF0IHBhcnRpY3VsYXIKLWFkZHJlc3NlcyB3aGVuIHVzaW5nIGEgZm9ybWF0IHdoaWNoIGNhbiBub3QgcmVwcmVzZW50IHNlY3Rpb24gYWRkcmVzc2VzLAotc3VjaCBhcyBhLm91dC4KLQotQGl0ZW0gLWIgQHZhcntiZmRuYW1lfQotQGl0ZW14IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLUBjaW5kZXggb2JqZWN0IGNvZGUgZm9ybWF0Ci1TcGVjaWZ5IHRoYXQgdGhlIG9iamVjdC1jb2RlIGZvcm1hdCBmb3IgdGhlIG9iamVjdCBmaWxlcyBpcwotQHZhcntiZmRuYW1lfS4gIFRoaXMgb3B0aW9uIG1heSBub3QgYmUgbmVjZXNzYXJ5OyBAdmFye29iamR1bXB9IGNhbgotYXV0b21hdGljYWxseSByZWNvZ25pemUgbWFueSBmb3JtYXRzLgotCi1Gb3IgZXhhbXBsZSwKLUBleGFtcGxlCi1vYmpkdW1wIC1iIG9hc3lzIC1tIHZheCAtaCBmdS5vCi1AZW5kIGV4YW1wbGUKLUBub2luZGVudAotZGlzcGxheXMgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZWN0aW9uIGhlYWRlcnMgKEBzYW1wey1ofSkgb2YKLUBmaWxle2Z1Lm99LCB3aGljaCBpcyBleHBsaWNpdGx5IGlkZW50aWZpZWQgKEBzYW1wey1tfSkgYXMgYSBWQVggb2JqZWN0Ci1maWxlIGluIHRoZSBmb3JtYXQgcHJvZHVjZWQgYnkgT2FzeXMgY29tcGlsZXJzLiAgWW91IGNhbiBsaXN0IHRoZQotZm9ybWF0cyBhdmFpbGFibGUgd2l0aCB0aGUgQHNhbXB7LWl9IG9wdGlvbi4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLUMKLUBpdGVteCAtLWRlbWFuZ2xlCi1AY2luZGV4IGRlbWFuZ2xpbmcgaW4gb2JqZHVtcAotRGVjb2RlIChAZGZue2RlbWFuZ2xlfSkgbG93LWxldmVsIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMuCi1CZXNpZGVzIHJlbW92aW5nIGFueSBpbml0aWFsIHVuZGVyc2NvcmUgcHJlcGVuZGVkIGJ5IHRoZSBzeXN0ZW0sIHRoaXMKLW1ha2VzIEMrKyBmdW5jdGlvbiBuYW1lcyByZWFkYWJsZS4gIEB4cmVme2MrK2ZpbHR9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotb24gZGVtYW5nbGluZy4KLQotQGl0ZW0gLS1kZWJ1Z2dpbmcKLURpc3BsYXkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBhdHRlbXB0cyB0byBwYXJzZSBkZWJ1Z2dpbmcKLWluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgZmlsZSBhbmQgcHJpbnQgaXQgb3V0IHVzaW5nIGEgQyBsaWtlIHN5bnRheC4KLU9ubHkgY2VydGFpbiB0eXBlcyBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaGF2ZSBiZWVuIGltcGxlbWVudGVkLgotCi1AaXRlbSAtZAotQGl0ZW14IC0tZGlzYXNzZW1ibGUKLUBjaW5kZXggZGlzYXNzZW1ibGluZyBvYmplY3QgY29kZQotQGNpbmRleCBtYWNoaW5lIGluc3RydWN0aW9ucwotRGlzcGxheSB0aGUgYXNzZW1ibGVyIG1uZW1vbmljcyBmb3IgdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGZyb20KLUB2YXJ7b2JqZmlsZX0uICBUaGlzIG9wdGlvbiBvbmx5IGRpc2Fzc2VtYmxlcyB0aG9zZSBzZWN0aW9ucyB3aGljaCBhcmUKLWV4cGVjdGVkIHRvIGNvbnRhaW4gaW5zdHJ1Y3Rpb25zLgotCi1AaXRlbSAtRAotQGl0ZW14IC0tZGlzYXNzZW1ibGUtYWxsCi1MaWtlIEBzYW1wey1kfSwgYnV0IGRpc2Fzc2VtYmxlIHRoZSBjb250ZW50cyBvZiBhbGwgc2VjdGlvbnMsIG5vdCBqdXN0Ci10aG9zZSBleHBlY3RlZCB0byBjb250YWluIGluc3RydWN0aW9ucy4KLQotQGl0ZW0gLS1wcmVmaXgtYWRkcmVzc2VzCi1XaGVuIGRpc2Fzc2VtYmxpbmcsIHByaW50IHRoZSBjb21wbGV0ZSBhZGRyZXNzIG9uIGVhY2ggbGluZS4gIFRoaXMgaXMKLXRoZSBvbGRlciBkaXNhc3NlbWJseSBmb3JtYXQuCi0KLUBpdGVtIC0tZGlzYXNzZW1ibGUtemVyb2VzCi1Ob3JtYWxseSB0aGUgZGlzYXNzZW1ibHkgb3V0cHV0IHdpbGwgc2tpcCBibG9ja3Mgb2YgemVyb2VzLiAgVGhpcwotb3B0aW9uIGRpcmVjdHMgdGhlIGRpc2Fzc2VtYmxlciB0byBkaXNhc3NlbWJsZSB0aG9zZSBibG9ja3MsIGp1c3QgbGlrZQotYW55IG90aGVyIGRhdGEuCi0KLUBpdGVtIC1FQgotQGl0ZW14IC1FTAotQGl0ZW14IC0tZW5kaWFuPUB7YmlnfGxpdHRsZUB9Ci1AY2luZGV4IGVuZGlhbm5lc3MKLUBjaW5kZXggZGlzYXNzZW1ibHkgZW5kaWFubmVzcwotU3BlY2lmeSB0aGUgZW5kaWFubmVzcyBvZiB0aGUgb2JqZWN0IGZpbGVzLiAgVGhpcyBvbmx5IGFmZmVjdHMKLWRpc2Fzc2VtYmx5LiAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gZGlzYXNzZW1ibGluZyBhIGZpbGUgZm9ybWF0IHdoaWNoCi1kb2VzIG5vdCBkZXNjcmliZSBlbmRpYW5uZXNzIGluZm9ybWF0aW9uLCBzdWNoIGFzIFMtcmVjb3Jkcy4KLQotQGl0ZW0gLWYKLUBpdGVteCAtLWZpbGUtaGVhZGVyCi1AY2luZGV4IG9iamVjdCBmaWxlIGhlYWRlcgotRGlzcGxheSBzdW1tYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIG92ZXJhbGwgaGVhZGVyIG9mCi1lYWNoIG9mIHRoZSBAdmFye29iamZpbGV9IGZpbGVzLgotCi1AaXRlbSAtaAotQGl0ZW14IC0tc2VjdGlvbi1oZWFkZXIKLUBpdGVteCAtLWhlYWRlcgotQGNpbmRleCBzZWN0aW9uIGhlYWRlcnMKLURpc3BsYXkgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZWN0aW9uIGhlYWRlcnMgb2YgdGhlCi1vYmplY3QgZmlsZS4KLQotRmlsZSBzZWdtZW50cyBtYXkgYmUgcmVsb2NhdGVkIHRvIG5vbnN0YW5kYXJkIGFkZHJlc3NlcywgZm9yIGV4YW1wbGUgYnkKLXVzaW5nIHRoZSBAc2FtcHstVHRleHR9LCBAc2FtcHstVGRhdGF9LCBvciBAc2FtcHstVGJzc30gb3B0aW9ucyB0bwotQGNvZGV7bGR9LiAgSG93ZXZlciwgc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzLCBzdWNoIGFzIGEub3V0LCBkbyBub3QKLXN0b3JlIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBmaWxlIHNlZ21lbnRzLiAgSW4gdGhvc2Ugc2l0dWF0aW9ucywKLWFsdGhvdWdoIEBjb2Rle2xkfSByZWxvY2F0ZXMgdGhlIHNlY3Rpb25zIGNvcnJlY3RseSwgdXNpbmcgQHNhbXB7b2JqZHVtcAotLWh9IHRvIGxpc3QgdGhlIGZpbGUgc2VjdGlvbiBoZWFkZXJzIGNhbm5vdCBzaG93IHRoZSBjb3JyZWN0IGFkZHJlc3Nlcy4KLUluc3RlYWQsIGl0IHNob3dzIHRoZSB1c3VhbCBhZGRyZXNzZXMsIHdoaWNoIGFyZSBpbXBsaWNpdCBmb3IgdGhlCi10YXJnZXQuCi0KLUBpdGVtIC0taGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIEBjb2Rle29iamR1bXB9IGFuZCBleGl0LgotCi1AaXRlbSAtaQotQGl0ZW14IC0taW5mbwotQGNpbmRleCBhcmNoaXRlY3R1cmVzIGF2YWlsYWJsZQotQGNpbmRleCBvYmplY3QgZm9ybWF0cyBhdmFpbGFibGUKLURpc3BsYXkgYSBsaXN0IHNob3dpbmcgYWxsIGFyY2hpdGVjdHVyZXMgYW5kIG9iamVjdCBmb3JtYXRzIGF2YWlsYWJsZQotZm9yIHNwZWNpZmljYXRpb24gd2l0aCBAc2FtcHstYn0gb3IgQHNhbXB7LW19LgotCi1AaXRlbSAtaiBAdmFye25hbWV9Ci1AaXRlbXggLS1zZWN0aW9uPUB2YXJ7bmFtZX0KLUBjaW5kZXggc2VjdGlvbiBpbmZvcm1hdGlvbgotRGlzcGxheSBpbmZvcm1hdGlvbiBvbmx5IGZvciBzZWN0aW9uIEB2YXJ7bmFtZX0uCi0KLUBpdGVtIC1sCi1AaXRlbXggLS1saW5lLW51bWJlcnMKLUBjaW5kZXggc291cmNlIGZpbGVuYW1lcyBmb3Igb2JqZWN0IGZpbGVzCi1MYWJlbCB0aGUgZGlzcGxheSAodXNpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uKSB3aXRoIHRoZSBmaWxlbmFtZSBhbmQKLXNvdXJjZSBsaW5lIG51bWJlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0IGNvZGUgb3IgcmVsb2NzIHNob3duLgotT25seSB1c2VmdWwgd2l0aCBAc2FtcHstZH0sIEBzYW1wey1EfSwgb3IgQHNhbXB7LXJ9LgotCi1AaXRlbSAtbSBAdmFye21hY2hpbmV9Ci1AaXRlbXggLS1hcmNoaXRlY3R1cmU9QHZhcnttYWNoaW5lfQotQGNpbmRleCBhcmNoaXRlY3R1cmUKLUBjaW5kZXggZGlzYXNzZW1ibHkgYXJjaGl0ZWN0dXJlCi1TcGVjaWZ5IHRoZSBhcmNoaXRlY3R1cmUgdG8gdXNlIHdoZW4gZGlzYXNzZW1ibGluZyBvYmplY3QgZmlsZXMuICBUaGlzCi1jYW4gYmUgdXNlZnVsIHdoZW4gZGlzYXNzZW1ibGluZyBvYmplY3QgZmlsZXMgd2hpY2ggZG8gbm90IGRlc2NyaWJlCi1hcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgUy1yZWNvcmRzLiAgWW91IGNhbiBsaXN0IHRoZSBhdmFpbGFibGUKLWFyY2hpdGVjdHVyZXMgd2l0aCB0aGUgQHNhbXB7LWl9IG9wdGlvbi4KLQotQGl0ZW0gLXAKLUBpdGVteCAtLXByaXZhdGUtaGVhZGVycwotUHJpbnQgaW5mb3JtYXRpb24gdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhlIGV4YWN0Ci1pbmZvcm1hdGlvbiBwcmludGVkIGRlcGVuZHMgdXBvbiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgRm9yIHNvbWUKLW9iamVjdCBmaWxlIGZvcm1hdHMsIG5vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMgcHJpbnRlZC4KLQotQGl0ZW0gLXIKLUBpdGVteCAtLXJlbG9jCi1AY2luZGV4IHJlbG9jYXRpb24gZW50cmllcywgaW4gb2JqZWN0IGZpbGUKLVByaW50IHRoZSByZWxvY2F0aW9uIGVudHJpZXMgb2YgdGhlIGZpbGUuICBJZiB1c2VkIHdpdGggQHNhbXB7LWR9IG9yCi1Ac2FtcHstRH0sIHRoZSByZWxvY2F0aW9ucyBhcmUgcHJpbnRlZCBpbnRlcnNwZXJzZWQgd2l0aCB0aGUKLWRpc2Fzc2VtYmx5LgotCi1AaXRlbSAtUgotQGl0ZW14IC0tZHluYW1pYy1yZWxvYwotQGNpbmRleCBkeW5hbWljIHJlbG9jYXRpb24gZW50cmllcywgaW4gb2JqZWN0IGZpbGUKLVByaW50IHRoZSBkeW5hbWljIHJlbG9jYXRpb24gZW50cmllcyBvZiB0aGUgZmlsZS4gIFRoaXMgaXMgb25seQotbWVhbmluZ2Z1bCBmb3IgZHluYW1pYyBvYmplY3RzLCBzdWNoIGFzIGNlcnRhaW4gdHlwZXMgb2Ygc2hhcmVkCi1saWJyYXJpZXMuCi0KLUBpdGVtIC1zCi1AaXRlbXggLS1mdWxsLWNvbnRlbnRzCi1AY2luZGV4IHNlY3Rpb25zLCBmdWxsIGNvbnRlbnRzCi1AY2luZGV4IG9iamVjdCBmaWxlIHNlY3Rpb25zCi1EaXNwbGF5IHRoZSBmdWxsIGNvbnRlbnRzIG9mIGFueSBzZWN0aW9ucyByZXF1ZXN0ZWQuCi0KLUBpdGVtIC1TCi1AaXRlbXggLS1zb3VyY2UKLUBjaW5kZXggc291cmNlIGRpc2Fzc2VtYmx5Ci1AY2luZGV4IGRpc2Fzc2VtYmx5LCB3aXRoIHNvdXJjZQotRGlzcGxheSBzb3VyY2UgY29kZSBpbnRlcm1peGVkIHdpdGggZGlzYXNzZW1ibHksIGlmIHBvc3NpYmxlLiAgSW1wbGllcwotQHNhbXB7LWR9LgotCi1AaXRlbSAtLXNob3ctcmF3LWluc24KLVdoZW4gZGlzYXNzZW1ibGluZyBpbnN0cnVjdGlvbnMsIHByaW50IHRoZSBpbnN0cnVjdGlvbiBpbiBoZXggYXMgd2VsbCBhcwotaW4gc3ltYm9saWMgZm9ybS4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgZXhjZXB0IHdoZW4KLUBjb2Rley0tcHJlZml4LWFkZHJlc3Nlc30gaXMgdXNlZC4KLQotQGl0ZW0gLS1uby1zaG93LXJhdy1pbnNuCi1XaGVuIGRpc2Fzc2VtYmxpbmcgaW5zdHJ1Y3Rpb25zLCBkbyBub3QgcHJpbnQgdGhlIGluc3RydWN0aW9uIGJ5dGVzLgotVGhpcyBpcyB0aGUgZGVmYXVsdCB3aGVuIEBjb2Rley0tcHJlZml4LWFkZHJlc3Nlc30gaXMgdXNlZC4KLQotQGl0ZW0gLS1zdGFicwotQGNpbmRleCBzdGFiCi1AY2luZGV4IC5zdGFiCi1AY2luZGV4IGRlYnVnIHN5bWJvbHMKLUBjaW5kZXggRUxGIG9iamVjdCBmaWxlIGZvcm1hdAotRGlzcGxheSB0aGUgZnVsbCBjb250ZW50cyBvZiBhbnkgc2VjdGlvbnMgcmVxdWVzdGVkLiAgRGlzcGxheSB0aGUKLWNvbnRlbnRzIG9mIHRoZSAuc3RhYiBhbmQgLnN0YWIuaW5kZXggYW5kIC5zdGFiLmV4Y2wgc2VjdGlvbnMgZnJvbSBhbgotRUxGIGZpbGUuICBUaGlzIGlzIG9ubHkgdXNlZnVsIG9uIHN5c3RlbXMgKHN1Y2ggYXMgU29sYXJpcyAyLjApIGluIHdoaWNoCi1AY29kZXsuc3RhYn0gZGVidWdnaW5nIHN5bWJvbC10YWJsZSBlbnRyaWVzIGFyZSBjYXJyaWVkIGluIGFuIEVMRgotc2VjdGlvbi4gIEluIG1vc3Qgb3RoZXIgZmlsZSBmb3JtYXRzLCBkZWJ1Z2dpbmcgc3ltYm9sLXRhYmxlIGVudHJpZXMgYXJlCi1pbnRlcmxlYXZlZCB3aXRoIGxpbmthZ2Ugc3ltYm9scywgYW5kIGFyZSB2aXNpYmxlIGluIHRoZSBAc2FtcHstLXN5bXN9Ci1vdXRwdXQuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdGFicyBzeW1ib2xzLCBzZWUgQHJlZntUb3AsU3RhYnMsU3RhYnMKLU92ZXJ2aWV3LHN0YWJzLmluZm8sIFRoZSBgYHN0YWJzJycgZGVidWcgZm9ybWF0fS4KLQotQGl0ZW0gLS1zdGFydC1hZGRyZXNzPUB2YXJ7YWRkcmVzc30KLUBjaW5kZXggc3RhcnQtYWRkcmVzcwotU3RhcnQgZGlzcGxheWluZyBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gIFRoaXMgYWZmZWN0cyB0aGUgb3V0cHV0Ci1vZiB0aGUgQGNvZGV7LWR9LCBAY29kZXstcn0gYW5kIEBjb2Rley1zfSBvcHRpb25zLgotCi1AaXRlbSAtLXN0b3AtYWRkcmVzcz1AdmFye2FkZHJlc3N9Ci1AY2luZGV4IHN0b3AtYWRkcmVzcwotU3RvcCBkaXNwbGF5aW5nIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLiAgVGhpcyBhZmZlY3RzIHRoZSBvdXRwdXQKLW9mIHRoZSBAY29kZXstZH0sIEBjb2Rley1yfSBhbmQgQGNvZGV7LXN9IG9wdGlvbnMuCi0KLUBpdGVtIC10Ci1AaXRlbXggLS1zeW1zCi1AY2luZGV4IHN5bWJvbCB0YWJsZSBlbnRyaWVzLCBwcmludGluZwotUHJpbnQgdGhlIHN5bWJvbCB0YWJsZSBlbnRyaWVzIG9mIHRoZSBmaWxlLgotVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgQHNhbXB7bm19IHByb2dyYW0uCi0KLUBpdGVtIC1UCi1AaXRlbXggLS1keW5hbWljLXN5bXMKLUBjaW5kZXggZHluYW1pYyBzeW1ib2wgdGFibGUgZW50cmllcywgcHJpbnRpbmcKLVByaW50IHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyaWVzIG9mIHRoZSBmaWxlLiAgVGhpcyBpcyBvbmx5Ci1tZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbiB0eXBlcyBvZiBzaGFyZWQKLWxpYnJhcmllcy4gIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIEBzYW1we25tfQotcHJvZ3JhbSB3aGVuIGdpdmVuIHRoZSBAc2FtcHstRH0gKEBzYW1wey0tZHluYW1pY30pIG9wdGlvbi4KLQotQGl0ZW0gLS12ZXJzaW9uCi1QcmludCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7b2JqZHVtcH0gYW5kIGV4aXQuCi0KLUBpdGVtIC14Ci1AaXRlbXggLS1hbGwtaGVhZGVyCi1AY2luZGV4IGFsbCBoZWFkZXIgaW5mb3JtYXRpb24sIG9iamVjdCBmaWxlCi1AY2luZGV4IGhlYWRlciBpbmZvcm1hdGlvbiwgYWxsCi1EaXNwbGF5IGFsbCBhdmFpbGFibGUgaGVhZGVyIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIHN5bWJvbCB0YWJsZSBhbmQKLXJlbG9jYXRpb24gZW50cmllcy4gIFVzaW5nIEBzYW1wey14fSBpcyBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcgYWxsIG9mCi1Ac2FtcHstYSAtZiAtaCAtciAtdH0uCi0KLUBpdGVtIC13Ci1AaXRlbXggLS13aWRlCi1AY2luZGV4IHdpZGUgb3V0cHV0LCBwcmludGluZwotRm9ybWF0IHNvbWUgbGluZXMgZm9yIG91dHB1dCBkZXZpY2VzIHRoYXQgaGF2ZSBtb3JlIHRoYW4gODAgY29sdW1ucy4KLUBlbmQgdGFibGUKLQotQG5vZGUgcmFubGliCi1AY2hhcHRlciByYW5saWIKLQotQGtpbmRleCByYW5saWIKLUBjaW5kZXggYXJjaGl2ZSBjb250ZW50cwotQGNpbmRleCBzeW1ib2wgaW5kZXgKLQotQHNtYWxsZXhhbXBsZQotcmFubGliIFstdlZdIEB2YXJ7YXJjaGl2ZX0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle3JhbmxpYn0gZ2VuZXJhdGVzIGFuIGluZGV4IHRvIHRoZSBjb250ZW50cyBvZiBhbiBhcmNoaXZlIGFuZAotc3RvcmVzIGl0IGluIHRoZSBhcmNoaXZlLiAgVGhlIGluZGV4IGxpc3RzIGVhY2ggc3ltYm9sIGRlZmluZWQgYnkgYQotbWVtYmVyIG9mIGFuIGFyY2hpdmUgdGhhdCBpcyBhIHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlLiAgCi0KLVlvdSBtYXkgdXNlIEBzYW1we25tIC1zfSBvciBAc2FtcHtubSAtLXByaW50LWFybWFwfSB0byBsaXN0IHRoaXMgaW5kZXguCi0KLUFuIGFyY2hpdmUgd2l0aCBzdWNoIGFuIGluZGV4IHNwZWVkcyB1cCBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5IGFuZAotYWxsb3dzIHJvdXRpbmVzIGluIHRoZSBsaWJyYXJ5IHRvIGNhbGwgZWFjaCBvdGhlciB3aXRob3V0IHJlZ2FyZCB0bwotdGhlaXIgcGxhY2VtZW50IGluIHRoZSBhcmNoaXZlLgotCi1UaGUgQHNje2dudX0gQGNvZGV7cmFubGlifSBwcm9ncmFtIGlzIGFub3RoZXIgZm9ybSBvZiBAc2N7Z251fSBAY29kZXthcn07IHJ1bm5pbmcKLUBjb2Rle3JhbmxpYn0gaXMgY29tcGxldGVseSBlcXVpdmFsZW50IHRvIGV4ZWN1dGluZyBAc2FtcHthciAtc30uCi1AeHJlZnthcn0uCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLXYKLUBpdGVteCAtVgotU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7cmFubGlifS4KLUBlbmQgdGFibGUKLQotQG5vZGUgc2l6ZQotQGNoYXB0ZXIgc2l6ZQotCi1Aa2luZGV4IHNpemUKLUBjaW5kZXggc2VjdGlvbiBzaXplcwotCi1Ac21hbGxleGFtcGxlCi1zaXplIFsgLUEgfCAtQiB8IC0tZm9ybWF0PUB2YXJ7Y29tcGF0aWJpbGl0eX0gXQotICAgICBbIC0taGVscCBdICBbIC1kIHwgLW8gfCAteCB8IC0tcmFkaXg9QHZhcntudW1iZXJ9IF0KLSAgICAgWyAtLXRhcmdldD1AdmFye2JmZG5hbWV9IF0gIFsgLVYgfCAtLXZlcnNpb24gXSAgCi0gICAgIFsgQHZhcntvYmpmaWxlfUBkb3Rze30gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEBzY3tnbnV9IEBjb2Rle3NpemV9IHV0aWxpdHkgbGlzdHMgdGhlIHNlY3Rpb24gc2l6ZXMtLS1hbmQgdGhlIHRvdGFsCi1zaXplLS0tZm9yIGVhY2ggb2YgdGhlIG9iamVjdCBvciBhcmNoaXZlIGZpbGVzIEB2YXJ7b2JqZmlsZX0gaW4gaXRzCi1hcmd1bWVudCBsaXN0LiAgQnkgZGVmYXVsdCwgb25lIGxpbmUgb2Ygb3V0cHV0IGlzIGdlbmVyYXRlZCBmb3IgZWFjaAotb2JqZWN0IGZpbGUgb3IgZWFjaCBtb2R1bGUgaW4gYW4gYXJjaGl2ZS4KLQotQHZhcntvYmpmaWxlfUBkb3Rze30gYXJlIHRoZSBvYmplY3QgZmlsZXMgdG8gYmUgZXhhbWluZWQuCi1JZiBub25lIGFyZSBzcGVjaWZpZWQsIHRoZSBmaWxlIEBjb2Rle2Eub3V0fSB3aWxsIGJlIHVzZWQuCi0KLVRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLUEKLUBpdGVteCAtQgotQGl0ZW14IC0tZm9ybWF0PUB2YXJ7Y29tcGF0aWJpbGl0eX0KLUBjaW5kZXggQGNvZGV7c2l6ZX0gZGlzcGxheSBmb3JtYXQKLVVzaW5nIG9uZSBvZiB0aGVzZSBvcHRpb25zLCB5b3UgY2FuIGNob29zZSB3aGV0aGVyIHRoZSBvdXRwdXQgZnJvbSBAc2N7Z251fQotQGNvZGV7c2l6ZX0gcmVzZW1ibGVzIG91dHB1dCBmcm9tIFN5c3RlbSBWIEBjb2Rle3NpemV9ICh1c2luZyBAc2FtcHstQX0sCi1vciBAc2FtcHstLWZvcm1hdD1zeXN2fSksIG9yIEJlcmtlbGV5IEBjb2Rle3NpemV9ICh1c2luZyBAc2FtcHstQn0sIG9yCi1Ac2FtcHstLWZvcm1hdD1iZXJrZWxleX0pLiAgVGhlIGRlZmF1bHQgaXMgdGhlIG9uZS1saW5lIGZvcm1hdCBzaW1pbGFyIHRvCi1CZXJrZWxleSdzLiAgCi1AYyBCb251cyBmb3IgZG9jLXNvdXJjZSByZWFkZXJzOiB5b3UgY2FuIGFsc28gc2F5IC0tZm9ybWF0PXN0cmFuZ2UgKG9yCi1AYyBhbnl0aGluZyBlbHNlIHRoYXQgc3RhcnRzIHdpdGggJ3MnKSBmb3Igc3lzdiwgYW5kIC0tZm9ybWF0PWJvcmluZyAob3IKLUBjIGFueXRoaW5nIGVsc2UgdGhhdCBzdGFydHMgd2l0aCAnYicpIGZvciBCZXJrZWxleS4KLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIHRoZSBCZXJrZWxleSAoZGVmYXVsdCkgZm9ybWF0IG9mIG91dHB1dCBmcm9tCi1AY29kZXtzaXplfTogCi1Ac21hbGxleGFtcGxlCi1zaXplIC0tZm9ybWF0PUJlcmtlbGV5IHJhbmxpYiBzaXplCi10ZXh0ICAgIGRhdGEgICAgYnNzICAgICBkZWMgICAgIGhleCAgICAgZmlsZW5hbWUKLTI5NDg4MCAgODE5MjAgICAxMTU5MiAgIDM4ODM5MiAgNWVkMjggICByYW5saWIKLTI5NDg4MCAgODE5MjAgICAxMTg4OCAgIDM4ODY4OCAgNWVlNTAgICBzaXplCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoaXMgaXMgdGhlIHNhbWUgZGF0YSwgYnV0IGRpc3BsYXllZCBjbG9zZXIgdG8gU3lzdGVtIFYgY29udmVudGlvbnM6Ci0KLUBzbWFsbGV4YW1wbGUKLXNpemUgLS1mb3JtYXQ9U3lzViByYW5saWIgc2l6ZQotcmFubGliICA6Ci1zZWN0aW9uICAgICAgICAgc2l6ZSAgICAgICAgIGFkZHIKLS50ZXh0ICAgICAgICAgMjk0ODgwICAgICAgICAgODE5MiAgICAgICAKLS5kYXRhICAgICAgICAgIDgxOTIwICAgICAgIDMwMzEwNCAgICAgICAKLS5ic3MgICAgICAgICAgIDExNTkyICAgICAgIDM4NTAyNCAgICAgICAKLVRvdGFsICAgICAgICAgMzg4MzkyICAgIAotCi0KLXNpemUgIDoKLXNlY3Rpb24gICAgICAgICBzaXplICAgICAgICAgYWRkcgotLnRleHQgICAgICAgICAyOTQ4ODAgICAgICAgICA4MTkyICAgICAgIAotLmRhdGEgICAgICAgICAgODE5MjAgICAgICAgMzAzMTA0ICAgICAgIAotLmJzcyAgICAgICAgICAgMTE4ODggICAgICAgMzg1MDI0ICAgICAgIAotVG90YWwgICAgICAgICAzODg2ODggICAgCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbSAtLWhlbHAKLVNob3cgYSBzdW1tYXJ5IG9mIGFjY2VwdGFibGUgYXJndW1lbnRzIGFuZCBvcHRpb25zLgotCi1AaXRlbSAtZAotQGl0ZW14IC1vCi1AaXRlbXggLXgKLUBpdGVteCAtLXJhZGl4PUB2YXJ7bnVtYmVyfQotQGNpbmRleCBAY29kZXtzaXplfSBudW1iZXIgZm9ybWF0Ci1AY2luZGV4IHJhZGl4IGZvciBzZWN0aW9uIHNpemVzCi1Vc2luZyBvbmUgb2YgdGhlc2Ugb3B0aW9ucywgeW91IGNhbiBjb250cm9sIHdoZXRoZXIgdGhlIHNpemUgb2YgZWFjaAotc2VjdGlvbiBpcyBnaXZlbiBpbiBkZWNpbWFsIChAc2FtcHstZH0sIG9yIEBzYW1wey0tcmFkaXg9MTB9KTsgb2N0YWwKLShAc2FtcHstb30sIG9yIEBzYW1wey0tcmFkaXg9OH0pOyBvciBoZXhhZGVjaW1hbCAoQHNhbXB7LXh9LCBvcgotQHNhbXB7LS1yYWRpeD0xNn0pLiAgSW4gQHNhbXB7LS1yYWRpeD1AdmFye251bWJlcn19LCBvbmx5IHRoZSB0aHJlZQotdmFsdWVzICg4LCAxMCwgMTYpIGFyZSBzdXBwb3J0ZWQuICBUaGUgdG90YWwgc2l6ZSBpcyBhbHdheXMgZ2l2ZW4gaW4gdHdvCi1yYWRpY2VzOyBkZWNpbWFsIGFuZCBoZXhhZGVjaW1hbCBmb3IgQHNhbXB7LWR9IG9yIEBzYW1wey14fSBvdXRwdXQsIG9yCi1vY3RhbCBhbmQgaGV4YWRlY2ltYWwgaWYgeW91J3JlIHVzaW5nIEBzYW1wey1vfS4KLQotQGl0ZW0gLS10YXJnZXQ9QHZhcntiZmRuYW1lfQotQGNpbmRleCBvYmplY3QgY29kZSBmb3JtYXQKLVNwZWNpZnkgdGhhdCB0aGUgb2JqZWN0LWNvZGUgZm9ybWF0IGZvciBAdmFye29iamZpbGV9IGlzCi1AdmFye2JmZG5hbWV9LiAgVGhpcyBvcHRpb24gbWF5IG5vdCBiZSBuZWNlc3Nhcnk7IEBjb2Rle3NpemV9IGNhbgotYXV0b21hdGljYWxseSByZWNvZ25pemUgbWFueSBmb3JtYXRzLgotQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtVgotQGl0ZW14IC0tdmVyc2lvbgotRGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7c2l6ZX0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIHN0cmluZ3MKLUBjaGFwdGVyIHN0cmluZ3MKLUBraW5kZXggc3RyaW5ncwotQGNpbmRleCBsaXN0aW5ncyBzdHJpbmdzCi1AY2luZGV4IHByaW50aW5nIHN0cmluZ3MKLUBjaW5kZXggc3RyaW5ncywgcHJpbnRpbmcKLQotQHNtYWxsZXhhbXBsZQotc3RyaW5ncyBbLWFmb3ZdIFstQHZhcnttaW4tbGVufV0gWy1uIEB2YXJ7bWluLWxlbn1dIFstdCBAdmFye3JhZGl4fV0gWy1dCi0gICAgICAgIFstLWFsbF0gWy0tcHJpbnQtZmlsZS1uYW1lXSBbLS1ieXRlcz1AdmFye21pbi1sZW59XQotICAgICAgICBbLS1yYWRpeD1AdmFye3JhZGl4fV0gWy0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX1dCi0gICAgICAgIFstLWhlbHBdIFstLXZlcnNpb25dIEB2YXJ7ZmlsZX1AZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1Gb3IgZWFjaCBAdmFye2ZpbGV9IGdpdmVuLCBAc2N7Z251fSBAY29kZXtzdHJpbmdzfSBwcmludHMgdGhlIHByaW50YWJsZQotY2hhcmFjdGVyIHNlcXVlbmNlcyB0aGF0IGFyZSBhdCBsZWFzdCA0IGNoYXJhY3RlcnMgbG9uZyAob3IgdGhlIG51bWJlcgotZ2l2ZW4gd2l0aCB0aGUgb3B0aW9ucyBiZWxvdykgYW5kIGFyZSBmb2xsb3dlZCBieSBhbiB1bnByaW50YWJsZQotY2hhcmFjdGVyLiAgQnkgZGVmYXVsdCwgaXQgb25seSBwcmludHMgdGhlIHN0cmluZ3MgZnJvbSB0aGUgaW5pdGlhbGl6ZWQKLWFuZCBsb2FkZWQgc2VjdGlvbnMgb2Ygb2JqZWN0IGZpbGVzOyBmb3Igb3RoZXIgdHlwZXMgb2YgZmlsZXMsIGl0IHByaW50cwotdGhlIHN0cmluZ3MgZnJvbSB0aGUgd2hvbGUgZmlsZS4KLQotQGNvZGV7c3RyaW5nc30gaXMgbWFpbmx5IHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgdGhlIGNvbnRlbnRzIG9mIG5vbi10ZXh0Ci1maWxlcy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtYQotQGl0ZW14IC0tYWxsCi1AaXRlbXggLQotRG8gbm90IHNjYW4gb25seSB0aGUgaW5pdGlhbGl6ZWQgYW5kIGxvYWRlZCBzZWN0aW9ucyBvZiBvYmplY3QgZmlsZXM7Ci1zY2FuIHRoZSB3aG9sZSBmaWxlcy4KLQotQGl0ZW0gLWYKLUBpdGVteCAtLXByaW50LWZpbGUtbmFtZQotUHJpbnQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLgotCi1AaXRlbSAtLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgcHJvZ3JhbSB1c2FnZSBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgotCi1AaXRlbSAtQHZhcnttaW4tbGVufQotQGl0ZW14IC1uIEB2YXJ7bWluLWxlbn0KLUBpdGVteCAtLWJ5dGVzPUB2YXJ7bWluLWxlbn0KLVByaW50IHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGF0IGxlYXN0IEB2YXJ7bWluLWxlbn0gY2hhcmFjdGVycwotbG9uZywgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCA0LgotCi1AaXRlbSAtbwotTGlrZSBAc2FtcHstdCBvfS4gIFNvbWUgb3RoZXIgdmVyc2lvbnMgb2YgQGNvZGV7c3RyaW5nc30gaGF2ZSBAc2FtcHstb30KLWFjdCBsaWtlIEBzYW1wey10IGR9IGluc3RlYWQuICBTaW5jZSB3ZSBjYW4gbm90IGJlIGNvbXBhdGlibGUgd2l0aCBib3RoCi13YXlzLCB3ZSBzaW1wbHkgY2hvc2Ugb25lLgotCi1AaXRlbSAtdCBAdmFye3JhZGl4fQotQGl0ZW14IC0tcmFkaXg9QHZhcntyYWRpeH0KLVByaW50IHRoZSBvZmZzZXQgd2l0aGluIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZy4gIFRoZSBzaW5nbGUKLWNoYXJhY3RlciBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHJhZGl4IG9mIHRoZSBvZmZzZXQtLS1Ac2FtcHtvfSBmb3IKLW9jdGFsLCBAc2FtcHt4fSBmb3IgaGV4YWRlY2ltYWwsIG9yIEBzYW1we2R9IGZvciBkZWNpbWFsLgotCi1AaXRlbSAtLXRhcmdldD1AdmFye2JmZG5hbWV9Ci1AY2luZGV4IG9iamVjdCBjb2RlIGZvcm1hdAotU3BlY2lmeSBhbiBvYmplY3QgY29kZSBmb3JtYXQgb3RoZXIgdGhhbiB5b3VyIHN5c3RlbSdzIGRlZmF1bHQgZm9ybWF0LgotQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtdgotQGl0ZW14IC0tdmVyc2lvbgotUHJpbnQgdGhlIHByb2dyYW0gdmVyc2lvbiBudW1iZXIgb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KLUBlbmQgdGFibGUKLQotQG5vZGUgc3RyaXAKLUBjaGFwdGVyIHN0cmlwCi0KLUBraW5kZXggc3RyaXAKLUBjaW5kZXggcmVtb3Zpbmcgc3ltYm9scwotQGNpbmRleCBkaXNjYXJkaW5nIHN5bWJvbHMKLUBjaW5kZXggc3ltYm9scywgZGlzY2FyZGluZwotCi1Ac21hbGxleGFtcGxlCi1zdHJpcCBbIC1GIEB2YXJ7YmZkbmFtZX0gfCAtLXRhcmdldD1AdmFye2JmZG5hbWV9IF0KLSAgICAgIFsgLUkgQHZhcntiZmRuYW1lfSB8IC0taW5wdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQotICAgICAgWyAtTyBAdmFye2JmZG5hbWV9IHwgLS1vdXRwdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQotICAgICAgWyAtcyB8IC0tc3RyaXAtYWxsIF0gWyAtUyB8IC1nIHwgLS1zdHJpcC1kZWJ1ZyBdCi0gICAgICBbIC1LIEB2YXJ7c3ltYm9sbmFtZX0gfCAtLWtlZXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0gXQotICAgICAgWyAtTiBAdmFye3N5bWJvbG5hbWV9IHwgLS1zdHJpcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfSBdCi0gICAgICBbIC14IHwgLS1kaXNjYXJkLWFsbCBdIFsgLVggfCAtLWRpc2NhcmQtbG9jYWxzIF0KLSAgICAgIFsgLVIgQHZhcntzZWN0aW9ubmFtZX0gfCAtLXJlbW92ZS1zZWN0aW9uPUB2YXJ7c2VjdGlvbm5hbWV9IF0KLSAgICAgIFsgLW8gQHZhcntmaWxlfSBdIFsgLXAgfCAtLXByZXNlcnZlLWRhdGVzIF0KLSAgICAgIFsgLXYgfCAtLXZlcmJvc2UgXSAgWyAtViB8IC0tdmVyc2lvbiBdICBbIC0taGVscCBdCi0gICAgICBAdmFye29iamZpbGV9QGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQHNje2dudX0gQGNvZGV7c3RyaXB9IGRpc2NhcmRzIGFsbCBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzCi1AdmFye29iamZpbGV9LiAgVGhlIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIG1heSBpbmNsdWRlIGFyY2hpdmVzLgotQXQgbGVhc3Qgb25lIG9iamVjdCBmaWxlIG11c3QgYmUgZ2l2ZW4uCi0KLUBjb2Rle3N0cmlwfSBtb2RpZmllcyB0aGUgZmlsZXMgbmFtZWQgaW4gaXRzIGFyZ3VtZW50LAotcmF0aGVyIHRoYW4gd3JpdGluZyBtb2RpZmllZCBjb3BpZXMgdW5kZXIgZGlmZmVyZW50IG5hbWVzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1GIEB2YXJ7YmZkbmFtZX0KLUBpdGVteCAtLXRhcmdldD1AdmFye2JmZG5hbWV9Ci1UcmVhdCB0aGUgb3JpZ2luYWwgQHZhcntvYmpmaWxlfSBhcyBhIGZpbGUgd2l0aCB0aGUgb2JqZWN0Ci1jb2RlIGZvcm1hdCBAdmFye2JmZG5hbWV9LCBhbmQgcmV3cml0ZSBpdCBpbiB0aGUgc2FtZSBmb3JtYXQuCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC0taGVscAotU2hvdyBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gQGNvZGV7c3RyaXB9IGFuZCBleGl0LgotCi1AaXRlbSAtSSBAdmFye2JmZG5hbWV9CQotQGl0ZW14IC0taW5wdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLVRyZWF0IHRoZSBvcmlnaW5hbCBAdmFye29iamZpbGV9IGFzIGEgZmlsZSB3aXRoIHRoZSBvYmplY3QKLWNvZGUgZm9ybWF0IEB2YXJ7YmZkbmFtZX0uCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1PIEB2YXJ7YmZkbmFtZX0KLUBpdGVteCAtLW91dHB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfQotUmVwbGFjZSBAdmFye29iamZpbGV9IHdpdGggYSBmaWxlIGluIHRoZSBvdXRwdXQgZm9ybWF0IEB2YXJ7YmZkbmFtZX0uCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1SIEB2YXJ7c2VjdGlvbm5hbWV9Ci1AaXRlbXggLS1yZW1vdmUtc2VjdGlvbj1AdmFye3NlY3Rpb25uYW1lfQotUmVtb3ZlIGFueSBzZWN0aW9uIG5hbWVkIEB2YXJ7c2VjdGlvbm5hbWV9IGZyb20gdGhlIG91dHB1dCBmaWxlLiAgVGhpcwotb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4gIE5vdGUgdGhhdCB1c2luZyB0aGlzIG9wdGlvbgotaW5hcHByb3ByaWF0ZWx5IG1heSBtYWtlIHRoZSBvdXRwdXQgZmlsZSB1bnVzYWJsZS4KLQotQGl0ZW0gLXMKLUBpdGVteCAtLXN0cmlwLWFsbAotUmVtb3ZlIGFsbCBzeW1ib2xzLgotCi1AaXRlbSAtZwotQGl0ZW14IC1TCi1AaXRlbXggLS1zdHJpcC1kZWJ1ZwotUmVtb3ZlIGRlYnVnZ2luZyBzeW1ib2xzIG9ubHkuCi0KLUBpdGVtIC0tc3RyaXAtdW5uZWVkZWQKLVJlbW92ZSBhbGwgc3ltYm9scyB0aGF0IGFyZSBub3QgbmVlZGVkIGZvciByZWxvY2F0aW9uIHByb2Nlc3NpbmcuCi0KLUBpdGVtIC1LIEB2YXJ7c3ltYm9sbmFtZX0KLUBpdGVteCAtLWtlZXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0KLUtlZXAgb25seSBzeW1ib2wgQHZhcntzeW1ib2xuYW1lfSBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gIFRoaXMgb3B0aW9uIG1heQotYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0KLUBpdGVtIC1OIEB2YXJ7c3ltYm9sbmFtZX0KLUBpdGVteCAtLXN0cmlwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9Ci1SZW1vdmUgc3ltYm9sIEB2YXJ7c3ltYm9sbmFtZX0gZnJvbSB0aGUgc291cmNlIGZpbGUuIFRoaXMgb3B0aW9uIG1heSBiZQotZ2l2ZW4gbW9yZSB0aGFuIG9uY2UsIGFuZCBtYXkgYmUgY29tYmluZWQgd2l0aCBzdHJpcCBvcHRpb25zIG90aGVyIHRoYW4KLUBjb2Rley1LfS4KLQotQGl0ZW0gLW8gQHZhcntmaWxlfQotUHV0IHRoZSBzdHJpcHBlZCBvdXRwdXQgaW4gQHZhcntmaWxlfSwgcmF0aGVyIHRoYW4gcmVwbGFjaW5nIHRoZQotZXhpc3RpbmcgZmlsZS4gIFdoZW4gdGhpcyBhcmd1bWVudCBpcyB1c2VkLCBvbmx5IG9uZSBAdmFye29iamZpbGV9Ci1hcmd1bWVudCBtYXkgYmUgc3BlY2lmaWVkLgotCi1AaXRlbSAtcAotQGl0ZW14IC0tcHJlc2VydmUtZGF0ZXMKLVByZXNlcnZlIHRoZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiBkYXRlcyBvZiB0aGUgZmlsZS4KLQotQGl0ZW0gLXgKLUBpdGVteCAtLWRpc2NhcmQtYWxsCi1SZW1vdmUgbm9uLWdsb2JhbCBzeW1ib2xzLgotCi1AaXRlbSAtWAotQGl0ZW14IC0tZGlzY2FyZC1sb2NhbHMKLVJlbW92ZSBjb21waWxlci1nZW5lcmF0ZWQgbG9jYWwgc3ltYm9scy4KLShUaGVzZSB1c3VhbGx5IHN0YXJ0IHdpdGggQHNhbXB7TH0gb3IgQHNhbXB7Ln0uKQotCi1AaXRlbSAtVgotQGl0ZW14IC0tdmVyc2lvbgotU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIEBjb2Rle3N0cmlwfS4KLQotQGl0ZW0gLXYKLUBpdGVteCAtLXZlcmJvc2UKLVZlcmJvc2Ugb3V0cHV0OiBsaXN0IGFsbCBvYmplY3QgZmlsZXMgbW9kaWZpZWQuICBJbiB0aGUgY2FzZSBvZgotYXJjaGl2ZXMsIEBzYW1we3N0cmlwIC12fSBsaXN0cyBhbGwgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZS4KLUBlbmQgdGFibGUKLQotQG5vZGUgYysrZmlsdAotQGNoYXB0ZXIgYysrZmlsdAotCi1Aa2luZGV4IGMrK2ZpbHQKLUBjaW5kZXggZGVtYW5nbGluZyBDKysgc3ltYm9scwotCi1Ac21hbGxleGFtcGxlCi1jKytmaWx0IFsgLV8gfCAtLXN0cmlwLXVuZGVyc2NvcmVzIF0KLSAgICAgICAgWyAtaiB8IC0tamF2YSBdCi0JWyAtbiB8IC0tbm8tc3RyaXAtdW5kZXJzY29yZXMgXQotICAgICAgICBbIC1zIEB2YXJ7Zm9ybWF0fSB8IC0tZm9ybWF0PUB2YXJ7Zm9ybWF0fSBdCi0gICAgICAgIFsgLS1oZWxwIF0gIFsgLS12ZXJzaW9uIF0gIFsgQHZhcntzeW1ib2x9QGRvdHN7fSBdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgQysrIGFuZCBKYXZhIGxhbmd1YWdlcyBwcm92aWRlcyBmdW5jdGlvbiBvdmVybG9hZGluZywgd2hpY2ggbWVhbnMKLXRoYXQgeW91IGNhbiB3cml0ZSBtYW55IGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgKHByb3ZpZGluZyBlYWNoCi10YWtlcyBwYXJhbWV0ZXJzIG9mIGRpZmZlcmVudCB0eXBlcykuICBBbGwgQysrIGFuZCBKYXZhIGZ1bmN0aW9uIG5hbWVzCi1hcmUgZW5jb2RlZCBpbnRvIGEgbG93LWxldmVsIGFzc2VtYmx5IGxhYmVsICh0aGlzIHByb2Nlc3MgaXMga25vd24gYXMKLUBkZm57bWFuZ2xpbmd9KS4gVGhlIEBjb2Rle2MrK2ZpbHR9IHByb2dyYW0gZG9lcyB0aGUgaW52ZXJzZSBtYXBwaW5nOiBpdAotZGVjb2RlcyAoQGRmbntkZW1hbmdsZXN9KSBsb3ctbGV2ZWwgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzIHNvIHRoYXQKLXRoZSBsaW5rZXIgY2FuIGtlZXAgdGhlc2Ugb3ZlcmxvYWRlZCBmdW5jdGlvbnMgZnJvbSBjbGFzaGluZy4KLQotRXZlcnkgYWxwaGFudW1lcmljIHdvcmQgKGNvbnNpc3Rpbmcgb2YgbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlcywKLWRvbGxhcnMsIG9yIHBlcmlvZHMpIHNlZW4gaW4gdGhlIGlucHV0IGlzIGEgcG90ZW50aWFsIGxhYmVsLiAgSWYgdGhlCi1sYWJlbCBkZWNvZGVzIGludG8gYSBDKysgbmFtZSwgdGhlIEMrKyBuYW1lIHJlcGxhY2VzIHRoZSBsb3ctbGV2ZWwKLW5hbWUgaW4gdGhlIG91dHB1dC4KLQotWW91IGNhbiB1c2UgQGNvZGV7YysrZmlsdH0gdG8gZGVjaXBoZXIgaW5kaXZpZHVhbCBzeW1ib2xzOgotCi1AZXhhbXBsZQotYysrZmlsdCBAdmFye3N5bWJvbH0KLUBlbmQgZXhhbXBsZQotCi1JZiBubyBAdmFye3N5bWJvbH0gYXJndW1lbnRzIGFyZSBnaXZlbiwgQGNvZGV7YysrZmlsdH0gcmVhZHMgc3ltYm9sCi1uYW1lcyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCBhbmQgd3JpdGVzIHRoZSBkZW1hbmdsZWQgbmFtZXMgdG8gdGhlCi1zdGFuZGFyZCBvdXRwdXQuICBBbGwgcmVzdWx0cyBhcmUgcHJpbnRlZCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1fCi1AaXRlbXggLS1zdHJpcC11bmRlcnNjb3JlcwotT24gc29tZSBzeXN0ZW1zLCBib3RoIHRoZSBDIGFuZCBDKysgY29tcGlsZXJzIHB1dCBhbiB1bmRlcnNjb3JlIGluIGZyb250Ci1vZiBldmVyeSBuYW1lLiAgRm9yIGV4YW1wbGUsIHRoZSBDIG5hbWUgQGNvZGV7Zm9vfSBnZXRzIHRoZSBsb3ctbGV2ZWwKLW5hbWUgQGNvZGV7X2Zvb30uICBUaGlzIG9wdGlvbiByZW1vdmVzIHRoZSBpbml0aWFsIHVuZGVyc2NvcmUuICBXaGV0aGVyCi1AY29kZXtjKytmaWx0fSByZW1vdmVzIHRoZSB1bmRlcnNjb3JlIGJ5IGRlZmF1bHQgaXMgdGFyZ2V0IGRlcGVuZGVudC4KLQotQGl0ZW0gLWoKLUBpdGVteCAtLWphdmEKLVByaW50cyBkZW1hbmdsZWQgbmFtZXMgdXNpbmcgSmF2YSBzeW50YXguICBUaGUgZGVmYXVsdCBpcyB0byB1c2UgQysrCi1zeW50YXguCi0KLUBpdGVtIC1uCi1AaXRlbXggLS1uby1zdHJpcC11bmRlcnNjb3JlcwotRG8gbm90IHJlbW92ZSB0aGUgaW5pdGlhbCB1bmRlcnNjb3JlLgotCi1AaXRlbSAtcyBAdmFye2Zvcm1hdH0KLUBpdGVteCAtLWZvcm1hdD1AdmFye2Zvcm1hdH0KLUBzY3tnbnV9IEBjb2Rle25tfSBjYW4gZGVjb2RlIHRocmVlIGRpZmZlcmVudCBtZXRob2RzIG9mIG1hbmdsaW5nLCB1c2VkIGJ5Ci1kaWZmZXJlbnQgQysrIGNvbXBpbGVycy4gIFRoZSBhcmd1bWVudCB0byB0aGlzIG9wdGlvbiBzZWxlY3RzIHdoaWNoCi1tZXRob2QgaXQgdXNlczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBnbnUKLXRoZSBvbmUgdXNlZCBieSB0aGUgQHNje2dudX0gY29tcGlsZXIgKHRoZSBkZWZhdWx0IG1ldGhvZCkKLUBpdGVtIGx1Y2lkCi10aGUgb25lIHVzZWQgYnkgdGhlIEx1Y2lkIGNvbXBpbGVyCi1AaXRlbSBhcm0KLXRoZSBvbmUgc3BlY2lmaWVkIGJ5IHRoZSBDKysgQW5ub3RhdGVkIFJlZmVyZW5jZSBNYW51YWwKLUBpdGVtIGhwCi10aGUgb25lIHVzZWQgYnkgdGhlIEhQIGNvbXBpbGVyCi1AaXRlbSBlZGcKLXRoZSBvbmUgdXNlZCBieSB0aGUgRURHIGNvbXBpbGVyCi1AZW5kIHRhYmxlCi0KLUBpdGVtIC0taGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIEBjb2Rle2MrK2ZpbHR9IGFuZCBleGl0LgotCi1AaXRlbSAtLXZlcnNpb24KLVByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtjKytmaWx0fSBhbmQgZXhpdC4KLUBlbmQgdGFibGUKLQotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzp9IEBjb2Rle2MrK2ZpbHR9IGlzIGEgbmV3IHV0aWxpdHksIGFuZCB0aGUgZGV0YWlscyBvZiBpdHMKLXVzZXIgaW50ZXJmYWNlIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuICBJbiBwYXJ0aWN1bGFyLAotYSBjb21tYW5kLWxpbmUgb3B0aW9uIG1heSBiZSByZXF1aXJlZCBpbiB0aGUgdGhlIGZ1dHVyZSB0byBkZWNvZGUgYSBuYW1lCi1wYXNzZWQgYXMgYW4gYXJndW1lbnQgb24gdGhlIGNvbW1hbmQgbGluZTsgaW4gb3RoZXIgd29yZHMsIAotCi1AZXhhbXBsZQotYysrZmlsdCBAdmFye3N5bWJvbH0KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLW1heSBpbiBhIGZ1dHVyZSByZWxlYXNlIGJlY29tZQotCi1AZXhhbXBsZQotYysrZmlsdCBAdmFye29wdGlvbn0gQHZhcntzeW1ib2x9Ci1AZW5kIGV4YW1wbGUKLUBlbmQgcXVvdGF0aW9uCi0KLUBub2RlIGFkZHIybGluZQotQGNoYXB0ZXIgYWRkcjJsaW5lCi0KLUBraW5kZXggYWRkcjJsaW5lCi1AY2luZGV4IGFkZHJlc3MgdG8gZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlcgotCi1Ac21hbGxleGFtcGxlCi1hZGRyMmxpbmUgWyAtYiBAdmFye2JmZG5hbWV9IHwgLS10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICAgICAgWyAtQyB8IC0tZGVtYW5nbGUgXQotICAgICAgICAgIFsgLWUgQHZhcntmaWxlbmFtZX0gfCAtLWV4ZT1AdmFye2ZpbGVuYW1lfSBdCi0gICAgICAgICAgWyAtZiB8IC0tZnVuY3Rpb25zIF0gWyAtcyB8IC0tYmFzZW5hbWUgXQotICAgICAgICAgIFsgLUggfCAtLWhlbHAgXSBbIC1WIHwgLS12ZXJzaW9uIF0KLSAgICAgICAgICBbIGFkZHIgYWRkciAuLi4gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNvZGV7YWRkcjJsaW5lfSB0cmFuc2xhdGVzIHByb2dyYW0gYWRkcmVzc2VzIGludG8gZmlsZSBuYW1lcyBhbmQgbGluZQotbnVtYmVycy4gIEdpdmVuIGFuIGFkZHJlc3MgYW5kIGFuIGV4ZWN1dGFibGUsIGl0IHVzZXMgdGhlIGRlYnVnZ2luZwotaW5mb3JtYXRpb24gaW4gdGhlIGV4ZWN1dGFibGUgdG8gZmlndXJlIG91dCB3aGljaCBmaWxlIG5hbWUgYW5kIGxpbmUKLW51bWJlciBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYWRkcmVzcy4KLQotVGhlIGV4ZWN1dGFibGUgdG8gdXNlIGlzIHNwZWNpZmllZCB3aXRoIHRoZSBAY29kZXstZX0gb3B0aW9uLiAgVGhlCi1kZWZhdWx0IGlzIEBmaWxle2Eub3V0fS4KLQotQGNvZGV7YWRkcjJsaW5lfSBoYXMgdHdvIG1vZGVzIG9mIG9wZXJhdGlvbi4KLQotSW4gdGhlIGZpcnN0LCBoZXhhZGVjaW1hbCBhZGRyZXNzZXMgYXJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLAotYW5kIEBjb2Rle2FkZHIybGluZX0gZGlzcGxheXMgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgZm9yIGVhY2gKLWFkZHJlc3MuCi0KLUluIHRoZSBzZWNvbmQsIEBjb2Rle2FkZHIybGluZX0gcmVhZHMgaGV4YWRlY2ltYWwgYWRkcmVzc2VzIGZyb20KLXN0YW5kYXJkIGlucHV0LCBhbmQgcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGZvciBlYWNoCi1hZGRyZXNzIG9uIHN0YW5kYXJkIG91dHB1dC4gIEluIHRoaXMgbW9kZSwgQGNvZGV7YWRkcjJsaW5lfSBtYXkgYmUgdXNlZAotaW4gYSBwaXBlIHRvIGNvbnZlcnQgZHluYW1pY2FsbHkgY2hvc2VuIGFkZHJlc3Nlcy4KLQotVGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGlzIEBzYW1we0ZJTEVOQU1FOkxJTkVOT30uICBUaGUgZmlsZSBuYW1lIGFuZAotbGluZSBudW1iZXIgZm9yIGVhY2ggYWRkcmVzcyBpcyBwcmludGVkIG9uIGEgc2VwYXJhdGUgbGluZS4gIElmIHRoZQotQGNvZGV7LWZ9IG9wdGlvbiBpcyB1c2VkLCB0aGVuIGVhY2ggQHNhbXB7RklMRU5BTUU6TElORU5PfSBsaW5lIGlzCi1wcmVjZWRlZCBieSBhIEBzYW1we0ZVTkNUSU9OTkFNRX0gbGluZSB3aGljaCBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KLWNvbnRhaW5pbmcgdGhlIGFkZHJlc3MuCi0KLUlmIHRoZSBmaWxlIG5hbWUgb3IgZnVuY3Rpb24gbmFtZSBjYW4gbm90IGJlIGRldGVybWluZWQsCi1AY29kZXthZGRyMmxpbmV9IHdpbGwgcHJpbnQgdHdvIHF1ZXN0aW9uIG1hcmtzIGluIHRoZWlyIHBsYWNlLiAgSWYgdGhlCi1saW5lIG51bWJlciBjYW4gbm90IGJlIGRldGVybWluZWQsIEBjb2Rle2FkZHIybGluZX0gd2lsbCBwcmludCAwLgotCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtYiBAdmFye2JmZG5hbWV9Ci1AaXRlbXggLS10YXJnZXQ9QHZhcntiZmRuYW1lfQotQGNpbmRleCBvYmplY3QgY29kZSBmb3JtYXQKLVNwZWNpZnkgdGhhdCB0aGUgb2JqZWN0LWNvZGUgZm9ybWF0IGZvciB0aGUgb2JqZWN0IGZpbGVzIGlzCi1AdmFye2JmZG5hbWV9LgotCi1AaXRlbSAtQwotQGl0ZW14IC0tZGVtYW5nbGUKLUBjaW5kZXggZGVtYW5nbGluZyBpbiBvYmpkdW1wCi1EZWNvZGUgKEBkZm57ZGVtYW5nbGV9KSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzIGludG8gdXNlci1sZXZlbCBuYW1lcy4KLUJlc2lkZXMgcmVtb3ZpbmcgYW55IGluaXRpYWwgdW5kZXJzY29yZSBwcmVwZW5kZWQgYnkgdGhlIHN5c3RlbSwgdGhpcwotbWFrZXMgQysrIGZ1bmN0aW9uIG5hbWVzIHJlYWRhYmxlLiAgQHhyZWZ7YysrZmlsdH0sIGZvciBtb3JlIGluZm9ybWF0aW9uCi1vbiBkZW1hbmdsaW5nLgotCi1AaXRlbSAtZSBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0tZXhlPUB2YXJ7ZmlsZW5hbWV9Ci1TcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIGZvciB3aGljaCBhZGRyZXNzZXMgc2hvdWxkIGJlCi10cmFuc2xhdGVkLiAgVGhlIGRlZmF1bHQgZmlsZSBpcyBAZmlsZXthLm91dH0uCi0KLUBpdGVtIC1mCi1AaXRlbXggLS1mdW5jdGlvbnMKLURpc3BsYXkgZnVuY3Rpb24gbmFtZXMgYXMgd2VsbCBhcyBmaWxlIGFuZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLXMKLUBpdGVteCAtLWJhc2VuYW1lcwotRGlzcGxheSBvbmx5IHRoZSBiYXNlIG9mIGVhY2ggZmlsZSBuYW1lLgotQGVuZCB0YWJsZQotCi1Abm9kZSBubG1jb252Ci1AY2hhcHRlciBubG1jb252Ci0KLUBjb2Rle25sbWNvbnZ9IGNvbnZlcnRzIGEgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUgaW50byBhIE5ldFdhcmUKLUxvYWRhYmxlIE1vZHVsZS4KLQotQGlnbm9yZQotQGNvZGV7bmxtY29udn0gY3VycmVudGx5IHdvcmtzIHdpdGggQHNhbXB7aTM4Nn0gb2JqZWN0Ci1maWxlcyBpbiBAY29kZXtjb2ZmfSwgQHNje2VsZn0sIG9yIEBjb2Rle2Eub3V0fSBmb3JtYXQsIGFuZCBAc2N7U1BBUkN9Ci1vYmplY3QgZmlsZXMgaW4gQHNje2VsZn0sIG9yIEBjb2Rle2Eub3V0fSBmb3JtYXRAZm9vdG5vdGV7Ci1AY29kZXtubG1jb252fSBzaG91bGQgd29yayB3aXRoIGFueSBAc2FtcHtpMzg2fSBvciBAc2N7c3BhcmN9IG9iamVjdAotZm9ybWF0IGluIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuICBJdCBoYXMgb25seSBiZWVuIHRlc3RlZAotd2l0aCB0aGUgYWJvdmUgZm9ybWF0cy59LgotQGVuZCBpZ25vcmUKLQotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzp9IEBjb2Rle25sbWNvbnZ9IGlzIG5vdCBhbHdheXMgYnVpbHQgYXMgcGFydCBvZiB0aGUgYmluYXJ5Ci11dGlsaXRpZXMsIHNpbmNlIGl0IGlzIG9ubHkgdXNlZnVsIGZvciBOTE0gdGFyZ2V0cy4KLUBlbmQgcXVvdGF0aW9uCi0KLUBzbWFsbGV4YW1wbGUKLW5sbWNvbnYgWyAtSSBAdmFye2JmZG5hbWV9IHwgLS1pbnB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICAgIFsgLU8gQHZhcntiZmRuYW1lfSB8IC0tb3V0cHV0LXRhcmdldD1AdmFye2JmZG5hbWV9IF0KLSAgICAgICAgWyAtVCBAdmFye2hlYWRlcmZpbGV9IHwgLS1oZWFkZXItZmlsZT1AdmFye2hlYWRlcmZpbGV9IF0KLSAgICAgICAgWyAtZCB8IC0tZGVidWddICBbIC1sIEB2YXJ7bGlua2VyfSB8IC0tbGlua2VyPUB2YXJ7bGlua2VyfSBdCi0gICAgICAgIFsgLWggfCAtLWhlbHAgXSAgWyAtViB8IC0tdmVyc2lvbiBdCi0gICAgICAgIEB2YXJ7aW5maWxlfSBAdmFye291dGZpbGV9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXtubG1jb252fSBjb252ZXJ0cyB0aGUgcmVsb2NhdGFibGUgQHNhbXB7aTM4Nn0gb2JqZWN0IGZpbGUKLUB2YXJ7aW5maWxlfSBpbnRvIHRoZSBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSBAdmFye291dGZpbGV9LCBvcHRpb25hbGx5Ci1yZWFkaW5nIEB2YXJ7aGVhZGVyZmlsZX0gZm9yIE5MTSBoZWFkZXIgaW5mb3JtYXRpb24uICBGb3IgaW5zdHJ1Y3Rpb25zCi1vbiB3cml0aW5nIHRoZSBOTE0gY29tbWFuZCBmaWxlIGxhbmd1YWdlIHVzZWQgaW4gaGVhZGVyIGZpbGVzLCBzZWUgdGhlCi1Ac2FtcHtsaW5rZXJzfSBzZWN0aW9uLCBAc2FtcHtOTE1MSU5LfSBpbiBwYXJ0aWN1bGFyLCBvZiB0aGUgQGNpdGV7TkxNCi1EZXZlbG9wbWVudCBhbmQgVG9vbHMgT3ZlcnZpZXd9LCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBOTE0gU29mdHdhcmUKLURldmVsb3BlcidzIEtpdCAoYGBOTE0gU0RLJycpLCBhdmFpbGFibGUgZnJvbSBOb3ZlbGwsIEluYy4KLUBjb2Rle25sbWNvbnZ9IHVzZXMgdGhlIEBzY3tnbnV9IEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeSB0byByZWFkCi1AdmFye2luZmlsZX07IHNlZSBAcmVme0JGRCwsQkZELGxkLmluZm8sVXNpbmcgTER9LCBmb3IKLW1vcmUgaW5mb3JtYXRpb24uCi0KLUBjb2Rle25sbWNvbnZ9IGNhbiBwZXJmb3JtIGEgbGluayBzdGVwLiAgSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4gbGlzdAotbW9yZSB0aGFuIG9uZSBvYmplY3QgZmlsZSBmb3IgaW5wdXQgaWYgeW91IGxpc3QgdGhlbSBpbiB0aGUgZGVmaW5pdGlvbnMKLWZpbGUgKHJhdGhlciB0aGFuIHNpbXBseSBzcGVjaWZ5aW5nIG9uZSBpbnB1dCBmaWxlIG9uIHRoZSBjb21tYW5kIGxpbmUpLgotSW4gdGhpcyBjYXNlLCBAY29kZXtubG1jb252fSBjYWxscyB0aGUgbGlua2VyIGZvciB5b3UuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLUkgQHZhcntiZmRuYW1lfQotQGl0ZW14IC0taW5wdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLU9iamVjdCBmb3JtYXQgb2YgdGhlIGlucHV0IGZpbGUuICBAY29kZXtubG1jb252fSBjYW4gdXN1YWxseSBkZXRlcm1pbmUKLXRoZSBmb3JtYXQgb2YgYSBnaXZlbiBmaWxlIChzbyBubyBkZWZhdWx0IGlzIG5lY2Vzc2FyeSkuCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1PIEB2YXJ7YmZkbmFtZX0KLUBpdGVteCAtLW91dHB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfQotT2JqZWN0IGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUuICBAY29kZXtubG1jb252fSBpbmZlcnMgdGhlIG91dHB1dAotZm9ybWF0IGJhc2VkIG9uIHRoZSBpbnB1dCBmb3JtYXQsIGUuZy4gZm9yIGEgQHNhbXB7aTM4Nn0gaW5wdXQgZmlsZSB0aGUKLW91dHB1dCBmb3JtYXQgaXMgQHNhbXB7bmxtMzItaTM4Nn0uCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1UIEB2YXJ7aGVhZGVyZmlsZX0KLUBpdGVteCAtLWhlYWRlci1maWxlPUB2YXJ7aGVhZGVyZmlsZX0KLVJlYWRzIEB2YXJ7aGVhZGVyZmlsZX0gZm9yIE5MTSBoZWFkZXIgaW5mb3JtYXRpb24uICBGb3IgaW5zdHJ1Y3Rpb25zIG9uCi13cml0aW5nIHRoZSBOTE0gY29tbWFuZCBmaWxlIGxhbmd1YWdlIHVzZWQgaW4gaGVhZGVyIGZpbGVzLCBzZWVAIHNlZSB0aGUKLUBzYW1we2xpbmtlcnN9IHNlY3Rpb24sIG9mIHRoZSBAY2l0ZXtOTE0gRGV2ZWxvcG1lbnQgYW5kIFRvb2xzCi1PdmVydmlld30sIHdoaWNoIGlzIHBhcnQgb2YgdGhlIE5MTSBTb2Z0d2FyZSBEZXZlbG9wZXIncyBLaXQsIGF2YWlsYWJsZQotZnJvbSBOb3ZlbGwsIEluYy4KLQotQGl0ZW0gLWQKLUBpdGVteCAtLWRlYnVnCi1EaXNwbGF5cyAob24gc3RhbmRhcmQgZXJyb3IpIHRoZSBsaW5rZXIgY29tbWFuZCBsaW5lIHVzZWQgYnkgQGNvZGV7bmxtY29udn0uCi0KLUBpdGVtIC1sIEB2YXJ7bGlua2VyfQotQGl0ZW14IC0tbGlua2VyPUB2YXJ7bGlua2VyfQotVXNlIEB2YXJ7bGlua2VyfSBmb3IgYW55IGxpbmtpbmcuICBAdmFye2xpbmtlcn0gY2FuIGJlIGFuIGFic29sdXRlIG9yIGEKLXJlbGF0aXZlIHBhdGhuYW1lLgotCi1AaXRlbSAtaAotQGl0ZW14IC0taGVscAotUHJpbnRzIGEgdXNhZ2Ugc3VtbWFyeS4KLQotQGl0ZW0gLVYKLUBpdGVteCAtLXZlcnNpb24KLVByaW50cyB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIEBjb2Rle25sbWNvbnZ9LgotQGVuZCB0YWJsZQotCi1Abm9kZSB3aW5kcmVzCi1AY2hhcHRlciB3aW5kcmVzCi0KLUBjb2Rle3dpbmRyZXN9IG1heSBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgV2luZG93cyByZXNvdXJjZXMuCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBAY29kZXt3aW5kcmVzfSBpcyBub3QgYWx3YXlzIGJ1aWx0IGFzIHBhcnQgb2YgdGhlIGJpbmFyeQotdXRpbGl0aWVzLCBzaW5jZSBpdCBpcyBvbmx5IHVzZWZ1bCBmb3IgV2luZG93cyB0YXJnZXRzLgotQGVuZCBxdW90YXRpb24KLQotQHNtYWxsZXhhbXBsZQotd2luZHJlcyBbb3B0aW9uc10gW2lucHV0LWZpbGVdIFtvdXRwdXQtZmlsZV0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle3dpbmRyZXN9IHJlYWRzIHJlc291cmNlcyBmcm9tIGFuIGlucHV0IGZpbGUgYW5kIGNvcGllcyB0aGVtIGludG8KLWFuIG91dHB1dCBmaWxlLiAgRWl0aGVyIGZpbGUgbWF5IGJlIGluIG9uZSBvZiB0aHJlZSBmb3JtYXRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHJjCi1BIHRleHQgZm9ybWF0IHJlYWQgYnkgdGhlIFJlc291cmNlIENvbXBpbGVyLgotCi1AaXRlbSByZXMKLUEgYmluYXJ5IGZvcm1hdCBnZW5lcmF0ZWQgYnkgdGhlIFJlc291cmNlIENvbXBpbGVyLgotCi1AaXRlbSBjb2ZmCi1BIENPRkYgb2JqZWN0IG9yIGV4ZWN1dGFibGUuCi1AZW5kIHRhYmxlCi0KLVRoZSBleGFjdCBkZXNjcmlwdGlvbiBvZiB0aGVzZSBkaWZmZXJlbnQgZm9ybWF0cyBpcyBhdmFpbGFibGUgaW4KLWRvY3VtZW50YXRpb24gZnJvbSBNaWNyb3NvZnQuCi0KLVdoZW4gQGNvZGV7d2luZHJlc30gY29udmVydHMgZnJvbSB0aGUgQGNvZGV7cmN9IGZvcm1hdCB0byB0aGUgQGNvZGV7cmVzfQotZm9ybWF0LCBpdCBpcyBhY3RpbmcgbGlrZSB0aGUgV2luZG93cyBSZXNvdXJjZSBDb21waWxlci4gIFdoZW4KLUBjb2Rle3dpbmRyZXN9IGNvbnZlcnRzIGZyb20gdGhlIEBjb2Rle3Jlc30gZm9ybWF0IHRvIHRoZSBAY29kZXtjb2ZmfQotZm9ybWF0LCBpdCBpcyBhY3RpbmcgbGlrZSB0aGUgV2luZG93cyBAY29kZXtDVlRSRVN9IHByb2dyYW0uCi0KLVdoZW4gQGNvZGV7d2luZHJlc30gZ2VuZXJhdGVzIGFuIEBjb2Rle3JjfSBmaWxlLCB0aGUgb3V0cHV0IGlzIHNpbWlsYXIKLWJ1dCBub3QgaWRlbnRpY2FsIHRvIHRoZSBmb3JtYXQgZXhwZWN0ZWQgZm9yIHRoZSBpbnB1dC4gIFdoZW4gYW4gaW5wdXQKLUBjb2Rle3JjfSBmaWxlIHJlZmVycyB0byBhbiBleHRlcm5hbCBmaWxlbmFtZSwgYW4gb3V0cHV0IEBjb2Rle3JjfSBmaWxlCi13aWxsIGluc3RlYWQgaW5jbHVkZSB0aGUgZmlsZSBjb250ZW50cy4KLQotSWYgdGhlIGlucHV0IG9yIG91dHB1dCBmb3JtYXQgaXMgbm90IHNwZWNpZmllZCwgQGNvZGV7d2luZHJlc30gd2lsbAotZ3Vlc3MgYmFzZWQgb24gdGhlIGZpbGUgbmFtZSwgb3IsIGZvciB0aGUgaW5wdXQgZmlsZSwgdGhlIGZpbGUgY29udGVudHMuCi1BIGZpbGUgd2l0aCBhbiBleHRlbnNpb24gb2YgQGZpbGV7LnJjfSB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4gQGNvZGV7cmN9Ci1maWxlLCBhIGZpbGUgd2l0aCBhbiBleHRlbnNpb24gb2YgQGZpbGV7LnJlc30gd2lsbCBiZSB0cmVhdGVkIGFzIGEKLUBjb2Rle3Jlc30gZmlsZSwgYW5kIGEgZmlsZSB3aXRoIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsub30gb3IKLUBmaWxley5leGV9IHdpbGwgYmUgdHJlYXRlZCBhcyBhIEBjb2Rle2NvZmZ9IGZpbGUuCi0KLUlmIG5vIG91dHB1dCBmaWxlIGlzIHNwZWNpZmllZCwgQGNvZGV7d2luZHJlc30gd2lsbCBwcmludCB0aGUgcmVzb3VyY2VzCi1pbiBAY29kZXtyY30gZm9ybWF0IHRvIHN0YW5kYXJkIG91dHB1dC4KLQotVGhlIG5vcm1hbCB1c2UgaXMgZm9yIHlvdSB0byB3cml0ZSBhbiBAY29kZXtyY30gZmlsZSwgdXNlIEBjb2Rle3dpbmRyZXN9Ci10byBjb252ZXJ0IGl0IHRvIGEgQ09GRiBvYmplY3QgZmlsZSwgYW5kIHRoZW4gbGluayB0aGUgQ09GRiBmaWxlIGludG8KLXlvdXIgYXBwbGljYXRpb24uICBUaGlzIHdpbGwgbWFrZSB0aGUgcmVzb3VyY2VzIGRlc2NyaWJlZCBpbiB0aGUKLUBjb2Rle3JjfSBmaWxlIGF2YWlsYWJsZSB0byBXaW5kb3dzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1pIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1pbnB1dCBAdmFye2ZpbGVuYW1lfQotVGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUuICBJZiB0aGlzIG9wdGlvbiBpcyBub3QgdXNlZCwgdGhlbgotQGNvZGV7d2luZHJlc30gd2lsbCB1c2UgdGhlIGZpcnN0IG5vbi1vcHRpb24gYXJndW1lbnQgYXMgdGhlIGlucHV0IGZpbGUKLW5hbWUuICBJZiB0aGVyZSBhcmUgbm8gbm9uLW9wdGlvbiBhcmd1bWVudHMsIHRoZW4gQGNvZGV7d2luZHJlc30gd2lsbAotcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0LiAgQGNvZGV7d2luZHJlc30gY2FuIG5vdCByZWFkIGEgQ09GRiBmaWxlIGZyb20KLXN0YW5kYXJkIGlucHV0LgotCi1AaXRlbSAtbyBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0tb3V0cHV0IEB2YXJ7ZmlsZW5hbWV9Ci1UaGUgbmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUuICBJZiB0aGlzIG9wdGlvbiBpcyBub3QgdXNlZCwgdGhlbgotQGNvZGV7d2luZHJlc30gd2lsbCB1c2UgdGhlIGZpcnN0IG5vbi1vcHRpb24gYXJndW1lbnQsIGFmdGVyIGFueSB1c2VkCi1mb3IgdGhlIGlucHV0IGZpbGUgbmFtZSwgYXMgdGhlIG91dHB1dCBmaWxlIG5hbWUuICBJZiB0aGVyZSBpcyBubwotbm9uLW9wdGlvbiBhcmd1bWVudCwgdGhlbiBAY29kZXt3aW5kcmVzfSB3aWxsIHdyaXRlIHRvIHN0YW5kYXJkIG91dHB1dC4KLUBjb2Rle3dpbmRyZXN9IGNhbiBub3Qgd3JpdGUgYSBDT0ZGIGZpbGUgdG8gc3RhbmRhcmQgb3V0cHV0LgotCi1AaXRlbSAtSSBAdmFye2Zvcm1hdH0KLUBpdGVteCAtLWlucHV0LWZvcm1hdCBAdmFye2Zvcm1hdH0KLVRoZSBpbnB1dCBmb3JtYXQgdG8gcmVhZC4gIEB2YXJ7Zm9ybWF0fSBtYXkgYmUgQHNhbXB7cmVzfSwgQHNhbXB7cmN9LCBvcgotQHNhbXB7Y29mZn0uICBJZiBubyBpbnB1dCBmb3JtYXQgaXMgc3BlY2lmaWVkLCBAY29kZXt3aW5kcmVzfSB3aWxsCi1ndWVzcywgYXMgZGVzY3JpYmVkIGFib3ZlLgotCi1AaXRlbSAtTyBAdmFye2Zvcm1hdH0KLUBpdGVteCAtLW91dHB1dC1mb3JtYXQgQHZhcntmb3JtYXR9Ci1UaGUgb3V0cHV0IGZvcm1hdCB0byBnZW5lcmF0ZS4gIEB2YXJ7Zm9ybWF0fSBtYXkgYmUgQHNhbXB7cmVzfSwKLUBzYW1we3JjfSwgb3IgQHNhbXB7Y29mZn0uICBJZiBubyBvdXRwdXQgZm9ybWF0IGlzIHNwZWNpZmllZCwKLUBjb2Rle3dpbmRyZXN9IHdpbGwgZ3Vlc3MsIGFzIGRlc2NyaWJlZCBhYm92ZS4KLQotQGl0ZW0gLUYgQHZhcnt0YXJnZXR9Ci1AaXRlbXggLS10YXJnZXQgQHZhcnt0YXJnZXR9Ci1TcGVjaWZ5IHRoZSBCRkQgZm9ybWF0IHRvIHVzZSBmb3IgYSBDT0ZGIGZpbGUgYXMgaW5wdXQgb3Igb3V0cHV0LiAgVGhpcwotaXMgYSBCRkQgdGFyZ2V0IG5hbWU7IHlvdSBjYW4gdXNlIHRoZSBAY29kZXstLWhlbHB9IG9wdGlvbiB0byBzZWUgYSBsaXN0Ci1vZiBzdXBwb3J0ZWQgdGFyZ2V0cy4gIE5vcm1hbGx5IEBjb2Rle3dpbmRyZXN9IHdpbGwgdXNlIHRoZSBkZWZhdWx0Ci1mb3JtYXQsIHdoaWNoIGlzIHRoZSBmaXJzdCBvbmUgbGlzdGVkIGJ5IHRoZSBAY29kZXstLWhlbHB9IG9wdGlvbi4KLUByZWZ7VGFyZ2V0IFNlbGVjdGlvbn0uCi0KLUBpdGVtIC0tcHJlcHJvY2Vzc29yIEB2YXJ7cHJvZ3JhbX0KLVdoZW4gQGNvZGV7d2luZHJlc30gcmVhZHMgYW4gQGNvZGV7cmN9IGZpbGUsIGl0IHJ1bnMgaXQgdGhyb3VnaCB0aGUgQwotcHJlcHJvY2Vzc29yIGZpcnN0LiAgVGhpcyBvcHRpb24gbWF5IGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcHJlcHJvY2Vzc29yCi10byB1c2UsIGluY2x1ZGluZyBhbnkgbGVhZGluZyBhcmd1bWVudHMuICBUaGUgZGVmYXVsdCBwcmVwcm9jZXNzb3IKLWFyZ3VtZW50IGlzIEBjb2Rle2djYyAtRSAteGMtaGVhZGVyIC1EUkNfSU5WT0tFRH0uCi0KLUBpdGVtIC0taW5jbHVkZS1kaXIgQHZhcntkaXJlY3Rvcnl9Ci1TcGVjaWZ5IGFuIGluY2x1ZGUgZGlyZWN0b3J5IHRvIHVzZSB3aGVuIHJlYWRpbmcgYW4gQGNvZGV7cmN9IGZpbGUuCi1AY29kZXt3aW5kcmVzfSB3aWxsIHBhc3MgdGhpcyB0byB0aGUgcHJlcHJvY2Vzc29yIGFzIGFuIEBjb2Rley1JfQotb3B0aW9uLiAgQGNvZGV7d2luZHJlc30gd2lsbCBhbHNvIHNlYXJjaCB0aGlzIGRpcmVjdG9yeSB3aGVuIGxvb2tpbmcgZm9yCi1maWxlcyBuYW1lZCBpbiB0aGUgQGNvZGV7cmN9IGZpbGUuCi0KLUBpdGVtIC1EIEB2YXJ7dGFyZ2V0fQotQGl0ZW0gLS1kZWZpbmUgQHZhcntzeW1bPXZhbF19Ci1TcGVjaWZ5IGEgQGNvZGV7LUR9IG9wdGlvbiB0byBwYXNzIHRvIHRoZSBwcmVwcm9jZXNzb3Igd2hlbiByZWFkaW5nIGFuCi1AY29kZXtyY30gZmlsZS4KLQotQGl0ZW0gLXYKLUVuYWJsZSB2ZXJib3NlIG1vZGUuICBUaGlzIHRlbGxzIHlvdSB3aGF0IHRoZSBwcmVwcm9jZXNzb3IgaXMgaWYgeW91Ci1kaWRuJ3Qgc3BlY2lmeSBvbmUuCi0KLUBpdGVtIC0tbGFuZ3VhZ2UgQHZhcnt2YWx9Ci1TcGVjaWZ5IHRoZSBkZWZhdWx0IGxhbmd1YWdlIHRvIHVzZSB3aGVuIHJlYWRpbmcgYW4gQGNvZGV7cmN9IGZpbGUuCi1AdmFye3ZhbH0gc2hvdWxkIGJlIGEgaGV4YWRlY2ltYWwgbGFuZ3VhZ2UgY29kZS4gIFRoZSBsb3cgZWlnaHQgYml0cyBhcmUKLXRoZSBsYW5ndWFnZSwgYW5kIHRoZSBoaWdoIGVpZ2h0IGJpdHMgYXJlIHRoZSBzdWJsYW5ndWFnZS4KLQotQGl0ZW0gLS1oZWxwCi1QcmludHMgYSB1c2FnZSBzdW1tYXJ5LgotCi1AaXRlbSAtLXZlcnNpb24KLVByaW50cyB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIEBjb2Rle3dpbmRyZXN9LgotCi1AaXRlbSAtLXl5ZGVidWcKLUlmIEBjb2Rle3dpbmRyZXN9IGlzIGNvbXBpbGVkIHdpdGggQGNvZGV7WVlERUJVR30gZGVmaW5lZCBhcyBAY29kZXsxfSwKLXRoaXMgd2lsbCB0dXJuIG9uIHBhcnNlciBkZWJ1Z2dpbmcuCi1AZW5kIHRhYmxlCi0KLQotQG5vZGUgZGxsdG9vbAotQGNoYXB0ZXIgQ3JlYXRlIGZpbGVzIG5lZWRlZCB0byBidWlsZCBhbmQgdXNlIERMTHMKLUBjaW5kZXggRExMCi1Aa2luZGV4IGRsbHRvb2wKLQotQGNvZGV7ZGxsdG9vbH0gbWF5IGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBmaWxlcyBuZWVkZWQgdG8gYnVpbGQgYW5kIHVzZQotZHluYW1pYyBsaW5rIGxpYnJhcmllcyAoRExMcykuCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBAY29kZXtkbGx0b29sfSBpcyBub3QgYWx3YXlzIGJ1aWx0IGFzIHBhcnQgb2YgdGhlIGJpbmFyeQotdXRpbGl0aWVzLCBzaW5jZSBpdCBpcyBvbmx5IHVzZWZ1bCBmb3IgdGhvc2UgdGFyZ2V0cyB3aGljaCBzdXBwb3J0IERMTHMuCi1AZW5kIHF1b3RhdGlvbgotCi1Ac21hbGxleGFtcGxlCi1kbGx0b29sIFstZHwtLWlucHV0LWRlZiBAdmFye2RlZi1maWxlLW5hbWV9XQotICAgICAgICBbLWJ8LS1iYXNlLWZpbGUgQHZhcntiYXNlLWZpbGUtbmFtZX1dCi0gICAgICAgIFstZXwtLW91dHB1dC1leHAgQHZhcntleHBvcnRzLWZpbGUtbmFtZX1dCi0gICAgICAgIFstenwtLW91dHB1dC1kZWYgQHZhcntkZWYtZmlsZS1uYW1lfV0KLSAgICAgICAgWy1sfC0tb3V0cHV0LWxpYiBAdmFye2xpYnJhcnktZmlsZS1uYW1lfV0gICAgICAgIAotICAgICAgICBbLS1leHBvcnQtYWxsLXN5bWJvbHNdIFstLW5vLWV4cG9ydC1hbGwtc3ltYm9sc10KLSAgICAgICAgWy0tZXhjbHVkZS1zeW1ib2xzIEB2YXJ7bGlzdH1dCi0gICAgICAgIFstLW5vLWRlZmF1bHQtZXhjbHVkZXNdCi0gICAgICAgIFstU3wtLWFzIEB2YXJ7cGF0aC10by1hc3NlbWJsZXJ9XSBbLWZ8LS1hcy1mbGFncyBAdmFye29wdGlvbnN9XQotICAgICAgICBbLUR8LS1kbGxuYW1lIEB2YXJ7bmFtZX1dIFstbXwtLW1hY2hpbmUgQHZhcnttYWNoaW5lfV0KLSAgICAgICAgWy1hfC0tYWRkLWluZGlyZWN0XSBbLVV8LS1hZGQtdW5kZXJzY29yZV0gWy1rfC0ta2lsbC1hdF0KLSAgICAgICAgWy1BfC0tYWRkLXN0ZGNhbGwtYWxpYXNdCi0gICAgICAgIFsteHwtLW5vLWlkYXRhNF0gWy1jfC0tbm8taWRhdGE1XSBbLWl8LS1pbnRlcndvcmtdCi0gICAgICAgIFstbnwtLW5vZGVsZXRlXSBbLXZ8LS12ZXJib3NlXSBbLWh8LS1oZWxwXSBbLVZ8LS12ZXJzaW9uXQotICAgICAgICBbb2JqZWN0LWZpbGUgQGRvdHN7fV0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle2RsbHRvb2x9IHJlYWRzIGl0cyBpbnB1dHMsIHdoaWNoIGNhbiBjb21lIGZyb20gdGhlIEBzYW1wey1kfSBhbmQKLUBzYW1wey1ifSBvcHRpb25zIGFzIHdlbGwgYXMgb2JqZWN0IGZpbGVzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZAotbGluZS4gIEl0IHRoZW4gcHJvY2Vzc2VzIHRoZXNlIGlucHV0cyBhbmQgaWYgdGhlIEBzYW1wey1lfSBvcHRpb24gaGFzCi1iZWVuIHNwZWNpZmllZCBpdCBjcmVhdGVzIGEgZXhwb3J0cyBmaWxlLiAgSWYgdGhlIEBzYW1wey1sfSBvcHRpb24KLWhhcyBiZWVuIHNwZWNpZmllZCBpdCBjcmVhdGVzIGEgbGlicmFyeSBmaWxlIGFuZCBpZiB0aGUgQHNhbXB7LXp9IG9wdGlvbgotaGFzIGJlZW4gc3BlY2lmaWVkIGl0IGNyZWF0ZXMgYSBkZWYgZmlsZS4gIEFueSBvciBhbGwgb2YgdGhlIC1lLCAtbAotYW5kIC16IG9wdGlvbnMgY2FuIGJlIHByZXNlbnQgaW4gb25lIGludm9jYXRpb24gb2YgZGxsdG9vbC4KLQotV2hlbiBjcmVhdGluZyBhIERMTCwgYWxvbmcgd2l0aCB0aGUgc291cmNlIGZvciB0aGUgRExMLCBpdCBpcyBuZWNlc3NhcnkKLXRvIGhhdmUgdGhyZWUgb3RoZXIgZmlsZXMuICBAY29kZXtkbGx0b29sfSBjYW4gaGVscCB3aXRoIHRoZSBjcmVhdGlvbiBvZgotdGhlc2UgZmlsZXMuCi0KLVRoZSBmaXJzdCBmaWxlIGlzIGEgQHNhbXB7LmRlZn0gZmlsZSB3aGljaCBzcGVjaWZpZXMgd2hpY2ggZnVuY3Rpb25zIGFyZQotZXhwb3J0ZWQgZnJvbSB0aGUgRExMLCB3aGljaCBmdW5jdGlvbnMgdGhlIERMTCBpbXBvcnRzLCBhbmQgc28gb24uICBUaGlzCi1pcyBhIHRleHQgZmlsZSBhbmQgY2FuIGJlIGNyZWF0ZWQgYnkgaGFuZCwgb3IgQGNvZGV7ZGxsdG9vbH0gY2FuIGJlIHVzZWQKLXRvIGNyZWF0ZSBpdCB1c2luZyB0aGUgQHNhbXB7LXp9IG9wdGlvbi4gIEluIHRoaXMgY2FzZSBAY29kZXtkbGx0b29sfQotd2lsbCBzY2FuIHRoZSBvYmplY3QgZmlsZXMgc3BlY2lmaWVkIG9uIGl0cyBjb21tYW5kIGxpbmUgbG9va2luZyBmb3IKLXRob3NlIGZ1bmN0aW9ucyB3aGljaCBoYXZlIGJlZW4gc3BlY2lhbGx5IG1hcmtlZCBhcyBiZWluZyBleHBvcnRlZCBhbmQKLXB1dCBlbnRyaWVzIGZvciB0aGVtIGluIHRoZSAuZGVmIGZpbGUgaXQgY3JlYXRlcy4KLQotSW4gb3JkZXIgdG8gbWFyayBhIGZ1bmN0aW9uIGFzIGJlaW5nIGV4cG9ydGVkIGZyb20gYSBETEwsIGl0IG5lZWRzIHRvCi1oYXZlIGFuIEBzYW1wey1leHBvcnQ6PG5hbWVfb2ZfZnVuY3Rpb24+fSBlbnRyeSBpbiB0aGUgQHNhbXB7LmRyZWN0dmV9Ci1zZWN0aW9uIG9mIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgY2FuIGJlIGRvbmUgaW4gQyBieSB1c2luZyB0aGUKLWFzbSgpIG9wZXJhdG9yOgotCi1Ac21hbGxleGFtcGxlCi0gIGFzbSAoIi5zZWN0aW9uIC5kcmVjdHZlIik7ICAKLSAgYXNtICgiLmFzY2lpIFwiLWV4cG9ydDpteV9mdW5jXCIiKTsKLQotICBpbnQgbXlfZnVuYyAodm9pZCkgQHsgQGRvdHN7fSBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIHNlY29uZCBmaWxlIG5lZWRlZCBmb3IgRExMIGNyZWF0aW9uIGlzIGFuIGV4cG9ydHMgZmlsZS4gIFRoaXMgZmlsZQotaXMgbGlua2VkIHdpdGggdGhlIG9iamVjdCBmaWxlcyB0aGF0IG1ha2UgdXAgdGhlIGJvZHkgb2YgdGhlIERMTCBhbmQgaXQKLWhhbmRsZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBETEwgYW5kIHRoZSBvdXRzaWRlIHdvcmxkLiAgVGhpcyBpcyBhCi1iaW5hcnkgZmlsZSBhbmQgaXQgY2FuIGJlIGNyZWF0ZWQgYnkgZ2l2aW5nIHRoZSBAc2FtcHstZX0gb3B0aW9uIHRvCi1AY29kZXtkbGx0b29sfSB3aGVuIGl0IGlzIGNyZWF0aW5nIG9yIHJlYWRpbmcgaW4gYSAuZGVmIGZpbGUuIAotCi1UaGUgdGhpcmQgZmlsZSBuZWVkZWQgZm9yIERMTCBjcmVhdGlvbiBpcyB0aGUgbGlicmFyeSBmaWxlIHRoYXQgcHJvZ3JhbXMKLXdpbGwgbGluayB3aXRoIGluIG9yZGVyIHRvIGFjY2VzcyB0aGUgZnVuY3Rpb25zIGluIHRoZSBETEwuICBUaGlzIGZpbGUKLWNhbiBiZSBjcmVhdGVkIGJ5IGdpdmluZyB0aGUgQHNhbXB7LWx9IG9wdGlvbiB0byBkbGx0b29sIHdoZW4gaXQKLWlzIGNyZWF0aW5nIG9yIHJlYWRpbmcgaW4gYSAuZGVmIGZpbGUuCi0KLUBjb2Rle2RsbHRvb2x9IGJ1aWxkcyB0aGUgbGlicmFyeSBmaWxlIGJ5IGhhbmQsIGJ1dCBpdCBidWlsZHMgdGhlCi1leHBvcnRzIGZpbGUgYnkgY3JlYXRpbmcgdGVtcG9yYXJ5IGZpbGVzIGNvbnRhaW5pbmcgYXNzZW1ibGVyIHN0YXRlbWVudHMKLWFuZCB0aGVuIGFzc2VtYmxpbmcgdGhlc2UuICBUaGUgQHNhbXB7LVN9IGNvbW1hbmQgbGluZSBvcHRpb24gY2FuIGJlCi11c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIGFzc2VtYmxlciB0aGF0IGRsbHRvb2wgd2lsbCB1c2UsCi1hbmQgdGhlIEBzYW1wey1mfSBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcGFzcyBzcGVjaWZpYyBmbGFncyB0byB0aGF0Ci1hc3NlbWJsZXIuICBUaGUgQHNhbXB7LW59IGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgZGxsdG9vbCBmcm9tIGRlbGV0aW5nCi10aGVzZSB0ZW1wb3JhcnkgYXNzZW1ibGVyIGZpbGVzIHdoZW4gaXQgaXMgZG9uZSwgYW5kIGlmIEBzYW1wey1ufSBpcwotc3BlY2lmaWVkIHR3aWNlIHRoZW4gdGhpcyB3aWxsIHByZXZlbnQgZGxsdG9vbCBmcm9tIGRlbGV0aW5nIHRoZQotdGVtcG9yYXJ5IG9iamVjdCBmaWxlcyBpdCB1c2VkIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgY3JlYXRpbmcgYSBETEwgZnJvbSBhIHNvdXJjZSBmaWxlIEBzYW1we2RsbC5jfSBhbmQKLWFsc28gY3JlYXRpbmcgYSBwcm9ncmFtIChmcm9tIGFuIG9iamVjdCBmaWxlIGNhbGxlZCBAc2FtcHtwcm9ncmFtLm99KQotdGhhdCB1c2VzIHRoYXQgRExMOgotCi1Ac21hbGxleGFtcGxlCi0gIGdjYyAtYyBkbGwuYwotICBkbGx0b29sIC1lIGV4cG9ydHMubyAtbCBkbGwubGliIGRsbC5vCi0gIGdjYyBkbGwubyBleHBvcnRzLm8gLW8gZGxsLmRsbAotICBnY2MgcHJvZ3JhbS5vIGRsbC5saWIgLW8gcHJvZ3JhbQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKLQotQHRhYmxlIEBjb2RlCi0KLUBpdGVtIC1kIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1pbnB1dC1kZWYgQHZhcntmaWxlbmFtZX0KLUBjaW5kZXggaW5wdXQgLmRlZiBmaWxlCi1TcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSAuZGVmIGZpbGUgdG8gYmUgcmVhZCBpbiBhbmQgcHJvY2Vzc2VkLgotCi1AaXRlbSAtYiBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0tYmFzZS1maWxlIEB2YXJ7ZmlsZW5hbWV9Ci1AY2luZGV4IGJhc2UgZmlsZXMKLVNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGJhc2UgZmlsZSB0byBiZSByZWFkIGluIGFuZCBwcm9jZXNzZWQuICBUaGUKLWNvbnRlbnRzIG9mIHRoaXMgZmlsZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSByZWxvY2F0aW9uIHNlY3Rpb24gaW4gdGhlCi1leHBvcnRzIGZpbGUgZ2VuZXJhdGVkIGJ5IGRsbHRvb2wuCi0KLUBpdGVtIC1lIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1vdXRwdXQtZXhwIEB2YXJ7ZmlsZW5hbWV9Ci1TcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGV4cG9ydCBmaWxlIHRvIGJlIGNyZWF0ZWQgYnkgZGxsdG9vbC4KLQotQGl0ZW0gLXogQHZhcntmaWxlbmFtZX0KLUBpdGVteCAtLW91dHB1dC1kZWYgQHZhcntmaWxlbmFtZX0KLVNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgLmRlZiBmaWxlIHRvIGJlIGNyZWF0ZWQgYnkgZGxsdG9vbC4KLQotQGl0ZW0gLWwgQHZhcntmaWxlbmFtZX0KLUBpdGVteCAtLW91dHB1dC1saWIgQHZhcntmaWxlbmFtZX0KLVNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBmaWxlIHRvIGJlIGNyZWF0ZWQgYnkgZGxsdG9vbC4KLQotQGl0ZW0gLS1leHBvcnQtYWxsLXN5bWJvbHMKLVRyZWF0IGFsbCBnbG9iYWwgYW5kIHdlYWsgZGVmaW5lZCBzeW1ib2xzIGZvdW5kIGluIHRoZSBpbnB1dCBvYmplY3QKLWZpbGVzIGFzIHN5bWJvbHMgdG8gYmUgZXhwb3J0ZWQuICBUaGVyZSBpcyBhIHNtYWxsIGxpc3Qgb2Ygc3ltYm9scyB3aGljaAotYXJlIG5vdCBleHBvcnRlZCBieSBkZWZhdWx0OyBzZWUgdGhlIEBjb2Rley0tbm8tZGVmYXVsdC1leGNsdWRlc30KLW9wdGlvbi4gIFlvdSBtYXkgYWRkIHRvIHRoZSBsaXN0IG9mIHN5bWJvbHMgdG8gbm90IGV4cG9ydCBieSB1c2luZyB0aGUKLUBjb2Rley0tZXhjbHVkZS1zeW1ib2xzfSBvcHRpb24uCi0KLUBpdGVtIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzCi1Pbmx5IGV4cG9ydCBzeW1ib2xzIGV4cGxpY2l0bHkgbGlzdGVkIGluIGFuIGlucHV0IC5kZWYgZmlsZSBvciBpbgotQHNhbXB7LmRyZWN0dmV9IHNlY3Rpb25zIGluIHRoZSBpbnB1dCBvYmplY3QgZmlsZXMuICBUaGlzIGlzIHRoZSBkZWZhdWx0Ci1iZWhhdmlvdXIuICBUaGUgQHNhbXB7LmRyZWN0dmV9IHNlY3Rpb25zIGFyZSBjcmVhdGVkIGJ5IEBzYW1we2RsbGV4cG9ydH0KLWF0dHJpYnV0ZXMgaW4gdGhlIHNvdXJjZSBjb2RlLgotCi1AaXRlbSAtLWV4Y2x1ZGUtc3ltYm9scyBAdmFye2xpc3R9Ci1EbyBub3QgZXhwb3J0IHRoZSBzeW1ib2xzIGluIEB2YXJ7bGlzdH0uICBUaGlzIGlzIGEgbGlzdCBvZiBzeW1ib2wgbmFtZXMKLXNlcGFyYXRlZCBieSBjb21tYSBvciBjb2xvbiBjaGFyYWN0ZXJzLiAgVGhlIHN5bWJvbCBuYW1lcyBzaG91bGQgbm90Ci1jb250YWluIGEgbGVhZGluZyB1bmRlcnNjb3JlLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbgotQGNvZGV7LS1leHBvcnQtYWxsLXN5bWJvbHN9IGlzIHVzZWQuCi0KLUBpdGVtIC0tbm8tZGVmYXVsdC1leGNsdWRlcwotV2hlbiBAY29kZXstLWV4cG9ydC1hbGwtc3ltYm9sc30gaXMgdXNlZCwgaXQgd2lsbCBieSBkZWZhdWx0IGF2b2lkCi1leHBvcnRpbmcgY2VydGFpbiBzcGVjaWFsIHN5bWJvbHMuICBUaGUgY3VycmVudCBsaXN0IG9mIHN5bWJvbHMgdG8gYXZvaWQKLWV4cG9ydGluZyBpcyBAc2FtcHtEbGxNYWluQEAxMn0sIEBzYW1we0RsbEVudHJ5UG9pbnRAQDB9LAotQHNhbXB7aW1wdXJlX3B0cn0uICBZb3UgbWF5IHVzZSB0aGUgQGNvZGV7LS1uby1kZWZhdWx0LWV4Y2x1ZGVzfSBvcHRpb24KLXRvIGdvIGFoZWFkIGFuZCBleHBvcnQgdGhlc2Ugc3BlY2lhbCBzeW1ib2xzLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwKLXdoZW4gQGNvZGV7LS1leHBvcnQtYWxsLXN5bWJvbHN9IGlzIHVzZWQuCi0KLUBpdGVtIC1TIEB2YXJ7cGF0aH0KLUBpdGVteCAtLWFzIEB2YXJ7cGF0aH0KLVNwZWNpZmllcyB0aGUgcGF0aCwgaW5jbHVkaW5nIHRoZSBmaWxlbmFtZSwgb2YgdGhlIGFzc2VtYmxlciB0byBiZSB1c2VkCi10byBjcmVhdGUgdGhlIGV4cG9ydHMgZmlsZS4KLQotQGl0ZW0gLWYgQHZhcntzd2l0Y2hlc30KLUBpdGVteCAtLWFzLWZsYWdzIEB2YXJ7c3dpdGNoZXN9Ci1TcGVjaWZpZXMgYW55IHNwZWNpZmljIGNvbW1hbmQgbGluZSBzd2l0Y2hlcyB0byBiZSBwYXNzZWQgdG8gdGhlCi1hc3NlbWJsZXIgd2hlbiBidWlsZGluZyB0aGUgZXhwb3J0cyBmaWxlLiAgVGhpcyBvcHRpb24gd2lsbCB3b3JrIGV2ZW4gaWYKLXRoZSBAc2FtcHstU30gb3B0aW9uIGlzIG5vdCB1c2VkLiAgVGhpcyBvcHRpb24gb25seSB0YWtlcyBvbmUgYXJndW1lbnQsCi1hbmQgaWYgaXQgb2NjdXJzIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZW4gbGF0ZXIKLW9jY3VycmVuY2VzIHdpbGwgb3ZlcnJpZGUgZWFybGllciBvY2N1cnJlbmNlcy4gIFNvIGlmIGl0IGlzIG5lY2Vzc2FyeSB0bwotcGFzcyBtdWx0aXBsZSBzd2l0Y2hlcyB0byB0aGUgYXNzZW1ibGVyIHRoZXkgc2hvdWxkIGJlIGVuY2xvc2VkIGluCi1kb3VibGUgcXVvdGVzLgotCi1AaXRlbSAtRCBAdmFye25hbWV9Ci1AaXRlbXggLS1kbGwtbmFtZSBAdmFye25hbWV9Ci1TcGVjaWZpZXMgdGhlIG5hbWUgdG8gYmUgc3RvcmVkIGluIHRoZSAuZGVmIGZpbGUgYXMgdGhlIG5hbWUgb2YgdGhlIERMTAotd2hlbiB0aGUgQHNhbXB7LWV9IG9wdGlvbiBpcyB1c2VkLiAgSWYgdGhpcyBvcHRpb24gaXMgbm90IHByZXNlbnQsIHRoZW4KLXRoZSBmaWxlbmFtZSBnaXZlbiB0byB0aGUgQHNhbXB7LWV9IG9wdGlvbiB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YKLXRoZSBETEwuCi0KLUBpdGVtIC1tIEB2YXJ7bWFjaGluZX0KLUBpdGVteCAtbWFjaGluZSBAdmFye21hY2hpbmV9Ci1TcGVjaWZpZXMgdGhlIHR5cGUgb2YgbWFjaGluZSBmb3Igd2hpY2ggdGhlIGxpYnJhcnkgZmlsZSBzaG91bGQgYmUKLWJ1aWx0LiAgQGNvZGV7ZGxsdG9vbH0gaGFzIGEgYnVpbHQgaW4gZGVmYXVsdCB0eXBlLCBkZXBlbmRpbmcgdXBvbiBob3cKLWl0IHdhcyBjcmVhdGVkLCBidXQgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhhdC4gIFRoaXMgaXMKLW5vcm1hbGx5IG9ubHkgdXNlZnVsIHdoZW4gY3JlYXRpbmcgRExMcyBmb3IgYW4gQVJNIHByb2Nlc3Nvciwgd2hlbiB0aGUKLWNvbnRlbnRzIG9mIHRoZSBETEwgYXJlIGFjdHVhbGx5IGVuY29kZSB1c2luZyBUSFVNQiBpbnN0cnVjdGlvbnMuCi0KLUBpdGVtIC1hCi1AaXRlbXggLS1hZGQtaW5kaXJlY3QKLVNwZWNpZmllcyB0aGF0IHdoZW4gQGNvZGV7ZGxsdG9vbH0gaXMgY3JlYXRpbmcgdGhlIGV4cG9ydHMgZmlsZSBpdAotc2hvdWxkIGFkZCBhIHNlY3Rpb24gd2hpY2ggYWxsb3dzIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgdG8gYmUKLXJlZmVyZW5jZWQgd2l0aG91dCB1c2luZyB0aGUgaW1wb3J0IGxpYnJhcnkuICBXaGF0ZXZlciB0aGUgaGVsbCB0aGF0Ci1tZWFucyEgCi0KLUBpdGVtIC1VCi1AaXRlbXggLS1hZGQtdW5kZXJzY29yZQotU3BlY2lmaWVzIHRoYXQgd2hlbiBAY29kZXtkbGx0b29sfSBpcyBjcmVhdGluZyB0aGUgZXhwb3J0cyBmaWxlIGl0Ci1zaG91bGQgcHJlcGVuZCBhbiB1bmRlcnNjb3JlIHRvIHRoZSBuYW1lcyBvZiB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zLiAKLQotQGl0ZW0gLWsKLUBpdGVteCAtLWtpbGwtYXQKLVNwZWNpZmllcyB0aGF0IHdoZW4gQGNvZGV7ZGxsdG9vbH0gaXMgY3JlYXRpbmcgdGhlIGV4cG9ydHMgZmlsZSBpdAotc2hvdWxkIG5vdCBhcHBlbmQgdGhlIHN0cmluZyBAc2FtcHtAQCA8bnVtYmVyPn0uICBUaGVzZSBudW1iZXJzIGFyZQotY2FsbGVkIG9yZGluYWwgbnVtYmVycyBhbmQgdGhleSByZXByZXNlbnQgYW5vdGhlciB3YXkgb2YgYWNjZXNzaW5nIHRoZQotZnVuY3Rpb24gaW4gYSBETEwsIG90aGVyIHRoYW4gYnkgbmFtZS4KLQotQGl0ZW0gLUEKLUBpdGVteCAtLWFkZC1zdGRjYWxsLWFsaWFzCi1TcGVjaWZpZXMgdGhhdCB3aGVuIEBjb2Rle2RsbHRvb2x9IGlzIGNyZWF0aW5nIHRoZSBleHBvcnRzIGZpbGUgaXQKLXNob3VsZCBhZGQgYWxpYXNlcyBmb3Igc3RkY2FsbCBzeW1ib2xzIHdpdGhvdXQgQHNhbXB7QEAgPG51bWJlcj59Ci1pbiBhZGRpdGlvbiB0byB0aGUgc3ltYm9scyB3aXRoIEBzYW1we0BAIDxudW1iZXI+fS4KLQotQGl0ZW0gLXgKLUBpdGVteCAtLW5vLWlkYXRhNAotU3BlY2lmaWVzIHRoYXQgd2hlbiBAY29kZXtkbGx0b29sfSBpcyBjcmVhdGluZyB0aGUgZXhwb3J0cyBhbmQgbGlicmFyeQotZmlsZXMgaXQgc2hvdWxkIG9taXQgdGhlIC5pZGF0YTQgc2VjdGlvbi4gIFRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KLQotQGl0ZW0gLWMKLUBpdGVteCAtLW5vLWlkYXRhNQotU3BlY2lmaWVzIHRoYXQgd2hlbiBAY29kZXtkbGx0b29sfSBpcyBjcmVhdGluZyB0aGUgZXhwb3J0cyBhbmQgbGlicmFyeQotZmlsZXMgaXQgc2hvdWxkIG9taXQgdGhlIC5pZGF0YTUgc2VjdGlvbi4gIFRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KLQotQGl0ZW0gLWkKLUBpdGVteCAtLWludGVyd29yawotU3BlY2lmaWVzIHRoYXQgQGNvZGV7ZGxsdG9vbH0gc2hvdWxkIG1hcmsgdGhlIG9iamVjdHMgaW4gdGhlIGxpYnJhcnkKLWZpbGUgYW5kIGV4cG9ydHMgZmlsZSB0aGF0IGl0IHByb2R1Y2VzIGFzIHN1cHBvcnRpbmcgaW50ZXJ3b3JraW5nCi1iZXR3ZWVuIEFSTSBhbmQgVEhVTUIgY29kZS4KLQotQGl0ZW0gLW4KLUBpdGVteCAtLW5vZGVsZXRlCi1NYWtlcyBAY29kZXtkbGx0b29sfSBwcmVzZXJ2ZSB0aGUgdGVtcG9yYXJ5IGFzc2VtYmxlciBmaWxlcyBpdCB1c2VkIHRvCi1jcmVhdGUgdGhlIGV4cG9ydHMgZmlsZS4gIElmIHRoaXMgb3B0aW9uIGlzIHJlcGVhdGVkIHRoZW4gZGxsdG9vbCB3aWxsCi1hbHNvIHByZXNlcnZlIHRoZSB0ZW1wb3Jhcnkgb2JqZWN0IGZpbGVzIGl0IHVzZXMgdG8gY3JlYXRlIHRoZSBsaWJyYXJ5Ci1maWxlLiAKLQotQGl0ZW0gLXYKLUBpdGVteCAtLXZlcmJvc2UKLU1ha2UgZGxsdG9vbCBkZXNjcmliZSB3aGF0IGl0IGlzIGRvaW5nLgotCi1AaXRlbSAtaAotQGl0ZW14IC0taGVscAotRGlzcGxheXMgYSBsaXN0IG9mIGNvbW1hbmQgbGluZSBvcHRpb25zIGFuZCB0aGVuIGV4aXRzLgotCi1AaXRlbSAtVgotQGl0ZW14IC0tdmVyc2lvbgotRGlzcGxheXMgZGxsdG9vbCdzIHZlcnNpb24gbnVtYmVyIGFuZCB0aGVuIGV4aXRzLgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIHJlYWRlbGYKLUBjaGFwdGVyIHJlYWRlbGYKLQotQGNpbmRleCBFTEYgZmlsZSBpbmZvcm1hdGlvbgotQGtpbmRleCByZWFkZWxmCi0KLUBzbWFsbGV4YW1wbGUKLXJlYWRlbGYgWyAtYSB8IC0tYWxsIF0gCi0gICAgICAgIFsgLWggfCAtLWZpbGUtaGVhZGVyXQotICAgICAgICBbIC1sIHwgLS1wcm9ncmFtLWhlYWRlcnMgfCAtLXNlZ21lbnRzXQotICAgICAgICBbIC1TIHwgLS1zZWN0aW9uLWhlYWRlcnMgfCAtLXNlY3Rpb25zXQotICAgICAgICBbIC1lIHwgLS1oZWFkZXJzXQotICAgICAgICBbIC1zIHwgLS1zeW1zIHwgLS1zeW1ib2xzXQotICAgICAgICBbIC1yIHwgLS1yZWxvY3NdCi0gICAgICAgIFsgLWQgfCAtLWR5bmFtaWNdCi0gICAgICAgIFsgLVYgfCAtLXZlcnNpb24taW5mb10KLSAgICAgICAgWyAtRCB8IC0tdXNlLWR5bmFtaWNdCi0gICAgICAgIFsgLXggPG51bWJlcj4gfCAtLWhleC1kdW1wPTxudW1iZXI+XQotICAgICAgICBbIC13W2xpYXByXSB8IC0tZGVidWctZHVtcFs9aW5mbyw9bGluZSw9YWJicmV2LD1wdWJuYW1lcyw9cmFuZ2VzXV0KLSAgICAgICAgWyAgICAgIC0taGlzdG9ncmFtXQotICAgICAgICBbIC12IHwgLS12ZXJzaW9uXQotICAgICAgICBbIC1IIHwgLS1oZWxwXQotICAgICAgICBAdmFye2VsZmZpbGV9QGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNvZGV7cmVhZGVsZn0gZGlzcGxheXMgaW5mb3JtYXRpb24gYWJvdXQgb25lIG9yIG1vcmUgRUxGIGZvcm1hdCBvYmplY3QKLWZpbGVzLiAgVGhlIG9wdGlvbnMgY29udHJvbCB3aGF0IHBhcnRpY3VsYXIgaW5mb3JtYXRpb24gdG8gZGlzcGxheS4KLQotQHZhcntlbGZmaWxlfUBkb3Rze30gYXJlIHRoZSBvYmplY3QgZmlsZXMgdG8gYmUgZXhhbWluZWQuICBBdCB0aGUKLW1vbWVudCwgQGNvZGV7cmVhZGVsZn0gZG9lcyBub3Qgc3VwcG9ydCBleGFtaW5pbmcgYXJjaGl2ZXMsIG5vciBkb2VzIGl0Ci1zdXBwb3J0IGV4YW1pbmcgNjQgYml0IEVMRiBmaWxlcy4KLQotVGhlIGxvbmcgYW5kIHNob3J0IGZvcm1zIG9mIG9wdGlvbnMsIHNob3duIGhlcmUgYXMgYWx0ZXJuYXRpdmVzLCBhcmUKLWVxdWl2YWxlbnQuICBBdCBsZWFzdCBvbmUgb3B0aW9uIGJlc2lkZXMgQHNhbXB7LXZ9IG9yIEBzYW1wey1IfSBtdXN0IGJlCi1naXZlbi4gCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLWEKLUBpdGVteCAtLWFsbAotRXF1aXZhbGVudCB0byBzcGVjaWZpeWluZyBAc2FtcHstLWZpbGUtaGVhZGVyfSwKLUBzYW1wey0tcHJvZ3JhbS1oZWFkZXJzfSwgQHNhbXB7LS1zZWN0aW9uc30sIEBzYW1wey0tc3ltYm9sc30sCi1Ac2FtcHstLXJlbG9jc30sIEBzYW1wey0tZHluYW1pY30gYW5kIEBzYW1wey0tdmVyc2lvbi1pbmZvfS4KLQotQGl0ZW0gLWgKLUBpdGVteCAtLWZpbGUtaGVhZGVyCi1AY2luZGV4IEVMRiBmaWxlIGhlYWRlciBpbmZvcm1hdGlvbgotRGlzcGxheXMgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgRUxGIGhlYWRlciBhdCB0aGUgc3RhcnQgb2YgdGhlCi1maWxlLgotCi1AaXRlbSAtbAotQGl0ZW14IC0tcHJvZ3JhbS1oZWFkZXJzCi1AaXRlbXggLS1zZWdtZW50cwotQGNpbmRleCBFTEYgcHJvZ3JhbSBoZWFkZXIgaW5mb3JtYXRpb24KLUBjaW5kZXggRUxGIHNlZ21lbnQgaW5mb3JtYXRpb24KLURpc3BsYXlzIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIGZpbGUncyBzZWdtZW50IGhlYWRlcnMsIGlmIGl0Ci1oYXMgYW55LgotCi1AaXRlbSAtUwotQGl0ZW14IC0tc2VjdGlvbnMKLUBpdGVteCAtLXNlY3Rpb24taGVhZGVycwotQGNpbmRleCBFTEYgc2VjdGlvbiBpbmZvcm1hdGlvbgotRGlzcGxheXMgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSdzIHNlY3Rpb24gaGVhZGVycywgaWYgaXQKLWhhcyBhbnkuCi0KLUBpdGVtIC1zCi1AaXRlbXggLS1zeW1ib2xzCi1AaXRlbXggLS1zeW1zCi1AY2luZGV4IEVMRiBzeW1ib2wgdGFibGUgaW5mb3JtYXRpb24KLURpc3BsYXlzIHRoZSBlbnRyaWVzIGluIHN5bWJvbCB0YWJsZSBzZWN0aW9uIG9mIHRoZSBmaWxlLCBpZiBpdCBoYXMgb25lLgotCi1AaXRlbSAtZQotQGl0ZW14IC0taGVhZGVycwotRGlzcGxheSBhbGwgdGhlIGhlYWRlcnMgaW4gdGhlIGZpbGUuICBFcXVpdmFsZW50IHRvIEBzYW1wey1oIC1sIC1TfS4KLQotQGl0ZW0gLXIKLUBpdGVteCAtLXJlbG9jcwotQGNpbmRleCBFTEYgcmVsb2MgaW5mb3JtYXRpb24KLURpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSdzIHJlbG9jYXRpb24gc2VjdGlvbiwgaWYgaXQgaGEgb25lLgotCi1AaXRlbSAtZAotQGl0ZW14IC0tZHluYW1pYwotQGNpbmRleCBFTEYgZHluYW1pYyBzZWN0aW9uIGluZm9ybWF0aW9uCi1EaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUncyBkeW5hbWljIHNlY3Rpb24sIGlmIGl0IGhhcyBvbmUuCi0KLUBpdGVtIC1WCi1AaXRlbXggLS12ZXJzaW9uLWluZm8KLUBjaW5kZXggRUxGIHZlcnNpb24gc2VjdGlvbnMgaW5mb3JtYXRpb25zCi1EaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIHZlcnNpb24gc2VjdGlvbnMgaW4gdGhlIGZpbGUsIGl0IHRoZXkKLWV4aXN0LgotCi1AaXRlbSAtRAotQGl0ZW14IC0tdXNlLWR5bmFtaWMKLVdoZW4gZGlzcGxheWluZyBzeW1ib2xzLCB0aGlzIG9wdGlvbiBtYWtlcyBAY29kZXtyZWFkZWxmfSB1c2UgdGhlCi1zeW1ibG9sIHRhYmxlIGluIHRoZSBmaWxlJ3MgZHluYW1pYyBzZWN0aW9uLCByYXRoZXIgdGhhbiB0aGUgb25lIGluIHRoZQotc3ltYm9scyBzZWN0aW9uLgotCi1AaXRlbSAteCA8bnVtYmVyPgotQGl0ZW14IC0taGV4LWR1bXA9PG51bWJlcj4KLURpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgaW5kaWNhdGVkIHNlY3Rpb24gYXMgYSBoZXhhZGVjaW1hbCBkdW1wLgotCi1AaXRlbSAtd1tsaWFwcl0KLUBpdGVteCAtLWRlYnVnLWR1bXBbPWxpbmUsPWluZm8sPWFiYnJldiw9cHVibmFtZXMsPXJhbmdlc10KLURpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgZGVidWcgc2VjdGlvbnMgaW4gdGhlIGZpbGUsIGlmIGFueSBhcmUKLXByZXNlbnQuICBJZiBvbmUgb2YgdGhlIG9wdGlvbmFsIGxldHRlcnMgb3Igd29yZHMgZm9sbG93cyB0aGUgc3dpdGNoCi10aGVuIG9ubHkgZGF0YSBmb3VuZCBpbiB0aG9zZSBzcGVjaWZpYyBzZWN0aW9ucyB3aWxsIGJlIGR1bXBlZC4KLQotQGl0ZW0gLS1oaXN0b2dyYW0KLURpc3BsYXkgYSBoaXN0b2dyYW0gb2YgYnVja2V0IGxpc3QgbGVuZ3RocyB3aGVuIGRpc3BsYXlpbmcgdGhlIGNvbnRlbnRzCi1vZiB0aGUgc3ltYm9sIHRhYmxlcy4KLQotQGl0ZW0gLXYKLUBpdGVteCAtLXZlcnNpb24KLURpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHJlYWRlbGYuCi0KLUBpdGVtIC1ICi1AaXRlbXggLS1oZWxwCi1EaXNwbGF5IHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyB1bmRlcnN0b29kIGJ5IEBjb2Rle3JlYWRlbGZ9LgotCi1AZW5kIHRhYmxlCi0KLQotQG5vZGUgU2VsZWN0aW5nIFRoZSBUYXJnZXQgU3lzdGVtCi1AY2hhcHRlciBTZWxlY3RpbmcgdGhlIHRhcmdldCBzeXN0ZW0KLQotWW91IGNhbiBzcGVjaWZ5IHRocmVlIGFzcGVjdHMgb2YgdGhlIHRhcmdldCBzeXN0ZW0gdG8gdGhlIEBzY3tnbnV9Ci1iaW5hcnkgZmlsZSB1dGlsaXRpZXMsIGVhY2ggaW4gc2V2ZXJhbCB3YXlzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotdGhlIHRhcmdldAotCi1AaXRlbQotdGhlIGFyY2hpdGVjdHVyZQotCi1AaXRlbQotdGhlIGxpbmtlciBlbXVsYXRpb24gKHdoaWNoIGFwcGxpZXMgdG8gdGhlIGxpbmtlciBvbmx5KQotQGVuZCBpdGVtaXplCi0KLUluIHRoZSBmb2xsb3dpbmcgc3VtbWFyaWVzLCB0aGUgbGlzdHMgb2Ygd2F5cyB0byBzcGVjaWZ5IHZhbHVlcyBhcmUgaW4KLW9yZGVyIG9mIGRlY3JlYXNpbmcgcHJlY2VkZW5jZS4gIFRoZSB3YXlzIGxpc3RlZCBmaXJzdCBvdmVycmlkZSB0aG9zZQotbGlzdGVkIGxhdGVyLgotCi1UaGUgY29tbWFuZHMgdG8gbGlzdCB2YWxpZCB2YWx1ZXMgb25seSBsaXN0IHRoZSB2YWx1ZXMgZm9yIHdoaWNoIHRoZQotcHJvZ3JhbXMgeW91IGFyZSBydW5uaW5nIHdlcmUgY29uZmlndXJlZC4gIElmIHRoZXkgd2VyZSBjb25maWd1cmVkIHdpdGgKLUBzYW1wey0tZW5hYmxlLXRhcmdldHM9YWxsfSwgdGhlIGNvbW1hbmRzIGxpc3QgbW9zdCBvZiB0aGUgYXZhaWxhYmxlCi12YWx1ZXMsIGJ1dCBhIGZldyBhcmUgbGVmdCBvdXQ7IG5vdCBhbGwgdGFyZ2V0cyBjYW4gYmUgY29uZmlndXJlZCBpbiBhdAotb25jZSBiZWNhdXNlIHNvbWUgb2YgdGhlbSBjYW4gb25seSBiZSBjb25maWd1cmVkIEBkZm57bmF0aXZlfSAob24gaG9zdHMKLXdpdGggdGhlIHNhbWUgdHlwZSBhcyB0aGUgdGFyZ2V0IHN5c3RlbSkuCi0KLUBtZW51Ci0qIFRhcmdldCBTZWxlY3Rpb246OiAgICAgICAgICAgIAotKiBBcmNoaXRlY3R1cmUgU2VsZWN0aW9uOjogICAgICAKLSogTGlua2VyIEVtdWxhdGlvbiBTZWxlY3Rpb246OiAgCi1AZW5kIG1lbnUKLQotQG5vZGUgVGFyZ2V0IFNlbGVjdGlvbgotQHNlY3Rpb24gVGFyZ2V0IFNlbGVjdGlvbgotCi1BIEBkZm57dGFyZ2V0fSBpcyBhbiBvYmplY3QgZmlsZSBmb3JtYXQuICBBIGdpdmVuIHRhcmdldCBtYXkgYmUKLXN1cHBvcnRlZCBmb3IgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcyAoQHB4cmVme0FyY2hpdGVjdHVyZSBTZWxlY3Rpb259KS4KLUEgdGFyZ2V0IHNlbGVjdGlvbiBtYXkgYWxzbyBoYXZlIHZhcmlhdGlvbnMgZm9yIGRpZmZlcmVudCBvcGVyYXRpbmcKLXN5c3RlbXMgb3IgYXJjaGl0ZWN0dXJlcy4KLQotVGhlIGNvbW1hbmQgdG8gbGlzdCB2YWxpZCB0YXJnZXQgdmFsdWVzIGlzIEBzYW1we29iamR1bXAgLWl9Ci0odGhlIGZpcnN0IGNvbHVtbiBvZiBvdXRwdXQgY29udGFpbnMgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uKS4KLQotU29tZSBzYW1wbGUgdmFsdWVzIGFyZTogQHNhbXB7YS5vdXQtaHAzMDBic2R9LCBAc2FtcHtlY29mZi1saXR0bGVtaXBzfSwKLUBzYW1we2Eub3V0LXN1bm9zLWJpZ30uCi0KLVlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgdGFyZ2V0IHVzaW5nIGEgY29uZmlndXJhdGlvbiB0cmlwbGV0LiAgVGhpcyBpcwotdGhlIHNhbWUgc29ydCBvZiBuYW1lIHRoYXQgaXMgcGFzc2VkIHRvIGNvbmZpZ3VyZSB0byBzcGVjaWZ5IGEgdGFyZ2V0LgotV2hlbiB5b3UgdXNlIGEgY29uZmlndXJhdGlvbiB0cmlwbGV0IGFzIGFuIGFyZ3VtZW50LCBpdCBtdXN0IGJlIGZ1bGx5Ci1jYW5vbmljYWxpemVkLiAgWW91IGNhbiBzZWUgdGhlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIGEgdHJpcGxldCBieQotcnVubmluZyB0aGUgc2hlbGwgc2NyaXB0IEBmaWxle2NvbmZpZy5zdWJ9IHdoaWNoIGlzIGluY2x1ZGVkIHdpdGggdGhlCi1zb3VyY2VzLgotCi1Tb21lIHNhbXBsZSBjb25maWd1cmF0aW9uIHRyaXBsZXRzIGFyZTogQHNhbXB7bTY4ay1ocC1ic2R9LAotQHNhbXB7bWlwcy1kZWMtdWx0cml4fSwgQHNhbXB7c3BhcmMtc3VuLXN1bm9zfS4KLQotQHN1YmhlYWRpbmcgQGNvZGV7b2JqZHVtcH0gVGFyZ2V0Ci0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWNvbW1hbmQgbGluZSBvcHRpb246IEBzYW1wey1ifSBvciBAc2FtcHstLXRhcmdldH0KLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgQGNvZGV7b2JqY29weX0gYW5kIEBjb2Rle3N0cmlwfSBJbnB1dCBUYXJnZXQKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotY29tbWFuZCBsaW5lIG9wdGlvbnM6IEBzYW1wey1JfSBvciBAc2FtcHstLWlucHV0LXRhcmdldH0sIG9yIEBzYW1wey1GfSBvciBAc2FtcHstLXRhcmdldH0KLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgQGNvZGV7b2JqY29weX0gYW5kIEBjb2Rle3N0cmlwfSBPdXRwdXQgVGFyZ2V0Ci0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWNvbW1hbmQgbGluZSBvcHRpb25zOiBAc2FtcHstT30gb3IgQHNhbXB7LS1vdXRwdXQtdGFyZ2V0fSwgb3IgQHNhbXB7LUZ9IG9yIEBzYW1wey0tdGFyZ2V0fQotCi1AaXRlbQotdGhlIGlucHV0IHRhcmdldCAoc2VlIGBgQGNvZGV7b2JqY29weX0gYW5kIEBjb2Rle3N0cmlwfSBJbnB1dCBUYXJnZXQnJyBhYm92ZSkKLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgQGNvZGV7bm19LCBAY29kZXtzaXplfSwgYW5kIEBjb2Rle3N0cmluZ3N9IFRhcmdldAotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstLXRhcmdldH0KLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgTGlua2VyIElucHV0IFRhcmdldAotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstYn0gb3IgQHNhbXB7LS1mb3JtYXR9Ci0oQHB4cmVme09wdGlvbnMsLE9wdGlvbnMsbGQuaW5mbyxVc2luZyBMRH0pCi0KLUBpdGVtCi1zY3JpcHQgY29tbWFuZCBAY29kZXtUQVJHRVR9Ci0oQHB4cmVme09wdGlvbiBDb21tYW5kcywsT3B0aW9uIENvbW1hbmRzLGxkLmluZm8sVXNpbmcgTER9KQotCi1AaXRlbQotZW52aXJvbm1lbnQgdmFyaWFibGUgQGNvZGV7R05VVEFSR0VUfQotKEBweHJlZntFbnZpcm9ubWVudCwsRW52aXJvbm1lbnQsbGQuaW5mbyxVc2luZyBMRH0pCi0KLUBpdGVtCi10aGUgZGVmYXVsdCB0YXJnZXQgb2YgdGhlIHNlbGVjdGVkIGxpbmtlciBlbXVsYXRpb24KLShAcHhyZWZ7TGlua2VyIEVtdWxhdGlvbiBTZWxlY3Rpb259KQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgTGlua2VyIE91dHB1dCBUYXJnZXQKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotY29tbWFuZCBsaW5lIG9wdGlvbjogQHNhbXB7LW9mb3JtYXR9Ci0oQHB4cmVme09wdGlvbnMsLE9wdGlvbnMsbGQuaW5mbyxVc2luZyBMRH0pCi0KLUBpdGVtCi1zY3JpcHQgY29tbWFuZCBAY29kZXtPVVRQVVRfRk9STUFUfQotKEBweHJlZntPcHRpb24gQ29tbWFuZHMsLE9wdGlvbiBDb21tYW5kcyxsZC5pbmZvLFVzaW5nIExEfSkKLQotQGl0ZW0KLXRoZSBsaW5rZXIgaW5wdXQgdGFyZ2V0IChzZWUgYGBMaW5rZXIgSW5wdXQgVGFyZ2V0JycgYWJvdmUpCi1AZW5kIGVudW1lcmF0ZQotCi1Abm9kZSBBcmNoaXRlY3R1cmUgU2VsZWN0aW9uCi1Ac2VjdGlvbiBBcmNoaXRlY3R1cmUgc2VsZWN0aW9uCi0KLUFuIEBkZm57YXJjaGl0ZWN0dXJlfSBpcyBhIHR5cGUgb2YgQHNje2NwdX0gb24gd2hpY2ggYW4gb2JqZWN0IGZpbGUgaXMKLXRvIHJ1bi4gIEl0cyBuYW1lIG1heSBjb250YWluIGEgY29sb24sIHNlcGFyYXRpbmcgdGhlIG5hbWUgb2YgdGhlCi1wcm9jZXNzb3IgZmFtaWx5IGZyb20gdGhlIG5hbWUgb2YgdGhlIHBhcnRpY3VsYXIgQHNje2NwdX0uCi0KLVRoZSBjb21tYW5kIHRvIGxpc3QgdmFsaWQgYXJjaGl0ZWN0dXJlIHZhbHVlcyBpcyBAc2FtcHtvYmpkdW1wIC1pfSAodGhlCi1zZWNvbmQgY29sdW1uIGNvbnRhaW5zIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbikuCi0KLVNhbXBsZSB2YWx1ZXM6IEBzYW1we202OGs6NjgwMjB9LCBAc2FtcHttaXBzOjMwMDB9LCBAc2FtcHtzcGFyY30uCi0KLUBzdWJoZWFkaW5nIEBjb2Rle29iamR1bXB9IEFyY2hpdGVjdHVyZQotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstbX0gb3IgQHNhbXB7LS1hcmNoaXRlY3R1cmV9Ci0KLUBpdGVtCi1kZWR1Y2VkIGZyb20gdGhlIGlucHV0IGZpbGUKLUBlbmQgZW51bWVyYXRlCi0KLUBzdWJoZWFkaW5nIEBjb2Rle29iamNvcHl9LCBAY29kZXtubX0sIEBjb2Rle3NpemV9LCBAY29kZXtzdHJpbmdzfSBBcmNoaXRlY3R1cmUKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotZGVkdWNlZCBmcm9tIHRoZSBpbnB1dCBmaWxlCi1AZW5kIGVudW1lcmF0ZQotCi1Ac3ViaGVhZGluZyBMaW5rZXIgSW5wdXQgQXJjaGl0ZWN0dXJlCi0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgTGlua2VyIE91dHB1dCBBcmNoaXRlY3R1cmUKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotc2NyaXB0IGNvbW1hbmQgQGNvZGV7T1VUUFVUX0FSQ0h9Ci0oQHB4cmVme09wdGlvbiBDb21tYW5kcywsT3B0aW9uIENvbW1hbmRzLGxkLmluZm8sVXNpbmcgTER9KQotCi1AaXRlbQotdGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIGZyb20gdGhlIGxpbmtlciBvdXRwdXQgdGFyZ2V0Ci0oQHB4cmVme1RhcmdldCBTZWxlY3Rpb259KQotQGVuZCBlbnVtZXJhdGUKLQotQG5vZGUgTGlua2VyIEVtdWxhdGlvbiBTZWxlY3Rpb24KLUBzZWN0aW9uIExpbmtlciBlbXVsYXRpb24gc2VsZWN0aW9uCi0KLUEgbGlua2VyIEBkZm57ZW11bGF0aW9ufSBpcyBhIGBgcGVyc29uYWxpdHknJyBvZiB0aGUgbGlua2VyLCB3aGljaCBnaXZlcwotdGhlIGxpbmtlciBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIG90aGVyIGFzcGVjdHMgb2YgdGhlIHRhcmdldCBzeXN0ZW0uCi1JbiBwYXJ0aWN1bGFyLCBpdCBjb25zaXN0cyBvZgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotdGhlIGxpbmtlciBzY3JpcHQKLQotQGl0ZW0KLXRoZSB0YXJnZXQKLQotQGl0ZW0KLXNldmVyYWwgYGBob29rJycgZnVuY3Rpb25zIHRoYXQgYXJlIHJ1biBhdCBjZXJ0YWluIHN0YWdlcyBvZiB0aGUgbGlua2luZwotcHJvY2VzcyB0byBkbyBzcGVjaWFsIHRoaW5ncyB0aGF0IHNvbWUgdGFyZ2V0cyByZXF1aXJlCi1AZW5kIGl0ZW1pemUKLQotVGhlIGNvbW1hbmQgdG8gbGlzdCB2YWxpZCBsaW5rZXIgZW11bGF0aW9uIHZhbHVlcyBpcyBAc2FtcHtsZCAtVn0uCi0KLVNhbXBsZSB2YWx1ZXM6IEBzYW1we2hwMzAwYnNkfSwgQHNhbXB7bWlwc2xpdH0sIEBzYW1we3N1bjR9LgotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstbX0KLShAcHhyZWZ7T3B0aW9ucywsT3B0aW9ucyxsZC5pbmZvLFVzaW5nIExEfSkKLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0xERU1VTEFUSU9OfQotCi1AaXRlbQotY29tcGlsZWQtaW4gQGNvZGV7REVGQVVMVF9FTVVMQVRJT059IGZyb20gQGZpbGV7TWFrZWZpbGV9LAotd2hpY2ggY29tZXMgZnJvbSBAY29kZXtFTVVMfSBpbiBAZmlsZXtjb25maWcvQHZhcnt0YXJnZXR9Lm10fQotQGVuZCBlbnVtZXJhdGUKLQotQG5vZGUgUmVwb3J0aW5nIEJ1Z3MKLUBjaGFwdGVyIFJlcG9ydGluZyBCdWdzCi1AY2luZGV4IGJ1Z3MKLUBjaW5kZXggcmVwb3J0aW5nIGJ1Z3MKLQotWW91ciBidWcgcmVwb3J0cyBwbGF5IGFuIGVzc2VudGlhbCByb2xlIGluIG1ha2luZyB0aGUgYmluYXJ5IHV0aWxpdGllcwotcmVsaWFibGUuCi0KLVJlcG9ydGluZyBhIGJ1ZyBtYXkgaGVscCB5b3UgYnkgYnJpbmdpbmcgYSBzb2x1dGlvbiB0byB5b3VyIHByb2JsZW0sIG9yCi1pdCBtYXkgbm90LiAgQnV0IGluIGFueSBjYXNlIHRoZSBwcmluY2lwYWwgZnVuY3Rpb24gb2YgYSBidWcgcmVwb3J0IGlzCi10byBoZWxwIHRoZSBlbnRpcmUgY29tbXVuaXR5IGJ5IG1ha2luZyB0aGUgbmV4dCB2ZXJzaW9uIG9mIHRoZSBiaW5hcnkKLXV0aWxpdGllcyB3b3JrIGJldHRlci4gIEJ1ZyByZXBvcnRzIGFyZSB5b3VyIGNvbnRyaWJ1dGlvbiB0byB0aGVpcgotbWFpbnRlbmFuY2UuCi0KLUluIG9yZGVyIGZvciBhIGJ1ZyByZXBvcnQgdG8gc2VydmUgaXRzIHB1cnBvc2UsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCi1pbmZvcm1hdGlvbiB0aGF0IGVuYWJsZXMgdXMgdG8gZml4IHRoZSBidWcuCi0KLUBtZW51Ci0qIEJ1ZyBDcml0ZXJpYTo6ICAgICAgICAgICAgICAgIEhhdmUgeW91IGZvdW5kIGEgYnVnPwotKiBCdWcgUmVwb3J0aW5nOjogICAgICAgICAgICAgICBIb3cgdG8gcmVwb3J0IGJ1Z3MKLUBlbmQgbWVudQotCi1Abm9kZSBCdWcgQ3JpdGVyaWEKLUBzZWN0aW9uIEhhdmUgeW91IGZvdW5kIGEgYnVnPwotQGNpbmRleCBidWcgY3JpdGVyaWEKLQotSWYgeW91IGFyZSBub3Qgc3VyZSB3aGV0aGVyIHlvdSBoYXZlIGZvdW5kIGEgYnVnLCBoZXJlIGFyZSBzb21lIGd1aWRlbGluZXM6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBjaW5kZXggZmF0YWwgc2lnbmFsCi1AY2luZGV4IGNyYXNoCi1AaXRlbQotSWYgYSBiaW5hcnkgdXRpbGl0eSBnZXRzIGEgZmF0YWwgc2lnbmFsLCBmb3IgYW55IGlucHV0IHdoYXRldmVyLCB0aGF0IGlzCi1hIGJ1Zy4gIFJlbGlhYmxlIHV0aWxpdGllcyBuZXZlciBjcmFzaC4KLQotQGNpbmRleCBlcnJvciBvbiB2YWxpZCBpbnB1dAotQGl0ZW0KLUlmIGEgYmluYXJ5IHV0aWxpdHkgcHJvZHVjZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdmFsaWQgaW5wdXQsIHRoYXQgaXMgYQotYnVnLgotCi1AaXRlbQotSWYgeW91IGFyZSBhbiBleHBlcmllbmNlZCB1c2VyIG9mIGJpbmFyeSB1dGlsaXRpZXMsIHlvdXIgc3VnZ2VzdGlvbnMgZm9yCi1pbXByb3ZlbWVudCBhcmUgd2VsY29tZSBpbiBhbnkgY2FzZS4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBCdWcgUmVwb3J0aW5nCi1Ac2VjdGlvbiBIb3cgdG8gcmVwb3J0IGJ1Z3MKLUBjaW5kZXggYnVnIHJlcG9ydHMKLUBjaW5kZXggYnVncywgcmVwb3J0aW5nCi0KLUEgbnVtYmVyIG9mIGNvbXBhbmllcyBhbmQgaW5kaXZpZHVhbHMgb2ZmZXIgc3VwcG9ydCBmb3IgQHNje2dudX0KLXByb2R1Y3RzLiAgSWYgeW91IG9idGFpbmVkIHRoZSBiaW5hcnkgdXRpbGl0aWVzIGZyb20gYSBzdXBwb3J0Ci1vcmdhbml6YXRpb24sIHdlIHJlY29tbWVuZCB5b3UgY29udGFjdCB0aGF0IG9yZ2FuaXphdGlvbiBmaXJzdC4KLQotWW91IGNhbiBmaW5kIGNvbnRhY3QgaW5mb3JtYXRpb24gZm9yIG1hbnkgc3VwcG9ydCBjb21wYW5pZXMgYW5kCi1pbmRpdmlkdWFscyBpbiB0aGUgZmlsZSBAZmlsZXtldGMvU0VSVklDRX0gaW4gdGhlIEBzY3tnbnV9IEVtYWNzCi1kaXN0cmlidXRpb24uCi0KLUluIGFueSBldmVudCwgd2UgYWxzbyByZWNvbW1lbmQgdGhhdCB5b3Ugc2VuZCBidWcgcmVwb3J0cyBmb3IgdGhlIGJpbmFyeQotdXRpbGl0aWVzIHRvIEBzYW1we2J1Zy1nbnUtdXRpbHNAQGdudS5vcmd9LgotCi1UaGUgZnVuZGFtZW50YWwgcHJpbmNpcGxlIG9mIHJlcG9ydGluZyBidWdzIHVzZWZ1bGx5IGlzIHRoaXM6Ci1Ac3Ryb25ne3JlcG9ydCBhbGwgdGhlIGZhY3RzfS4gIElmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB0byBzdGF0ZSBhCi1mYWN0IG9yIGxlYXZlIGl0IG91dCwgc3RhdGUgaXQhCi0KLU9mdGVuIHBlb3BsZSBvbWl0IGZhY3RzIGJlY2F1c2UgdGhleSB0aGluayB0aGV5IGtub3cgd2hhdCBjYXVzZXMgdGhlCi1wcm9ibGVtIGFuZCBhc3N1bWUgdGhhdCBzb21lIGRldGFpbHMgZG8gbm90IG1hdHRlci4gIFRodXMsIHlvdSBtaWdodAotYXNzdW1lIHRoYXQgdGhlIG5hbWUgb2YgYSBmaWxlIHlvdSB1c2UgaW4gYW4gZXhhbXBsZSBkb2VzIG5vdCBtYXR0ZXIuCi1XZWxsLCBwcm9iYWJseSBpdCBkb2VzIG5vdCwgYnV0IG9uZSBjYW5ub3QgYmUgc3VyZS4gIFBlcmhhcHMgdGhlIGJ1ZyBpcwotYSBzdHJheSBtZW1vcnkgcmVmZXJlbmNlIHdoaWNoIGhhcHBlbnMgdG8gZmV0Y2ggZnJvbSB0aGUgbG9jYXRpb24gd2hlcmUKLXRoYXQgcGF0aG5hbWUgaXMgc3RvcmVkIGluIG1lbW9yeTsgcGVyaGFwcywgaWYgdGhlIHBhdGhuYW1lIHdlcmUKLWRpZmZlcmVudCwgdGhlIGNvbnRlbnRzIG9mIHRoYXQgbG9jYXRpb24gd291bGQgZm9vbCB0aGUgdXRpbGl0eSBpbnRvCi1kb2luZyB0aGUgcmlnaHQgdGhpbmcgZGVzcGl0ZSB0aGUgYnVnLiAgUGxheSBpdCBzYWZlIGFuZCBnaXZlIGEKLXNwZWNpZmljLCBjb21wbGV0ZSBleGFtcGxlLiAgVGhhdCBpcyB0aGUgZWFzaWVzdCB0aGluZyBmb3IgeW91IHRvIGRvLAotYW5kIHRoZSBtb3N0IGhlbHBmdWwuCi0KLUtlZXAgaW4gbWluZCB0aGF0IHRoZSBwdXJwb3NlIG9mIGEgYnVnIHJlcG9ydCBpcyB0byBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcgaWYKLWl0IGlzIG5ldyB0byB1cy4gIFRoZXJlZm9yZSwgYWx3YXlzIHdyaXRlIHlvdXIgYnVnIHJlcG9ydHMgb24gdGhlIGFzc3VtcHRpb24KLXRoYXQgdGhlIGJ1ZyBoYXMgbm90IGJlZW4gcmVwb3J0ZWQgcHJldmlvdXNseS4KLQotU29tZXRpbWVzIHBlb3BsZSBnaXZlIGEgZmV3IHNrZXRjaHkgZmFjdHMgYW5kIGFzaywgYGBEb2VzIHRoaXMgcmluZyBhCi1iZWxsPycnICBUaG9zZSBidWcgcmVwb3J0cyBhcmUgdXNlbGVzcywgYW5kIHdlIHVyZ2UgZXZlcnlvbmUgdG8KLUBlbXBoe3JlZnVzZSB0byByZXNwb25kIHRvIHRoZW19IGV4Y2VwdCB0byBjaGlkZSB0aGUgc2VuZGVyIHRvIHJlcG9ydAotYnVncyBwcm9wZXJseS4KLQotVG8gZW5hYmxlIHVzIHRvIGZpeCB0aGUgYnVnLCB5b3Ugc2hvdWxkIGluY2x1ZGUgYWxsIHRoZXNlIHRoaW5nczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSB2ZXJzaW9uIG9mIHRoZSB1dGlsaXR5LiAgRWFjaCB1dGlsaXR5IGFubm91bmNlcyBpdCBpZiB5b3Ugc3RhcnQgaXQKLXdpdGggdGhlIEBzYW1wey0tdmVyc2lvbn0gYXJndW1lbnQuCi0KLVdpdGhvdXQgdGhpcywgd2Ugd2lsbCBub3Qga25vdyB3aGV0aGVyIHRoZXJlIGlzIGFueSBwb2ludCBpbiBsb29raW5nIGZvcgotdGhlIGJ1ZyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBiaW5hcnkgdXRpbGl0aWVzLgotCi1AaXRlbQotQW55IHBhdGNoZXMgeW91IG1heSBoYXZlIGFwcGxpZWQgdG8gdGhlIHNvdXJjZSwgaW5jbHVkaW5nIGFueSBwYXRjaGVzCi1tYWRlIHRvIHRoZSBAY29kZXtCRkR9IGxpYnJhcnkuCi0KLUBpdGVtCi1UaGUgdHlwZSBvZiBtYWNoaW5lIHlvdSBhcmUgdXNpbmcsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYW1lIGFuZAotdmVyc2lvbiBudW1iZXIuCi0KLUBpdGVtCi1XaGF0IGNvbXBpbGVyIChhbmQgaXRzIHZlcnNpb24pIHdhcyB1c2VkIHRvIGNvbXBpbGUgdGhlIHV0aWxpdGllcy0tLWUuZy4KLWBgQGNvZGV7Z2NjLTIuN30nJy4KLQotQGl0ZW0KLVRoZSBjb21tYW5kIGFyZ3VtZW50cyB5b3UgZ2F2ZSB0aGUgdXRpbGl0eSB0byBvYnNlcnZlIHRoZSBidWcuICBUbwotZ3VhcmFudGVlIHlvdSB3aWxsIG5vdCBvbWl0IHNvbWV0aGluZyBpbXBvcnRhbnQsIGxpc3QgdGhlbSBhbGwuICBBIGNvcHkKLW9mIHRoZSBNYWtlZmlsZSAob3IgdGhlIG91dHB1dCBmcm9tIG1ha2UpIGlzIHN1ZmZpY2llbnQuCi0KLUlmIHdlIHdlcmUgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBhcmd1bWVudHMsIHdlIHdvdWxkIHByb2JhYmx5IGd1ZXNzIHdyb25nCi1hbmQgdGhlbiB3ZSBtaWdodCBub3QgZW5jb3VudGVyIHRoZSBidWcuCi0KLUBpdGVtCi1BIGNvbXBsZXRlIGlucHV0IGZpbGUsIG9yIHNldCBvZiBpbnB1dCBmaWxlcywgdGhhdCB3aWxsIHJlcHJvZHVjZSB0aGUKLWJ1Zy4gIElmIHRoZSB1dGlsaXR5IGlzIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUgb3IgZmlsZXMsIHRoZW4gaXQgaXMKLWdlbmVyYWxseSBtb3N0IGhlbHBmdWwgdG8gc2VuZCB0aGUgYWN0dWFsIG9iamVjdCBmaWxlcywgdXVlbmNvZGVkIGlmCi1uZWNlc3NhcnkgdG8gZ2V0IHRoZW0gdGhyb3VnaCB0aGUgbWFpbCBzeXN0ZW0uICBNYWtpbmcgdGhlbSBhdmFpbGFibGUKLWZvciBhbm9ueW1vdXMgRlRQIGlzIG5vdCBhcyBnb29kLCBidXQgbWF5IGJlIHRoZSBvbmx5IHJlYXNvbmFibGUgY2hvaWNlCi1mb3IgbGFyZ2Ugb2JqZWN0IGZpbGVzLgotCi1JZiB0aGUgc291cmNlIGZpbGVzIHdlcmUgcHJvZHVjZWQgZXhjbHVzaXZlbHkgdXNpbmcgQHNje2dudX0gcHJvZ3JhbXMKLShlLmcuLCBAY29kZXtnY2N9LCBAY29kZXtnYXN9LCBhbmQvb3IgdGhlIEBzY3tnbnV9IEBjb2Rle2xkfSksIHRoZW4gaXQKLW1heSBiZSBPSyB0byBzZW5kIHRoZSBzb3VyY2UgZmlsZXMgcmF0aGVyIHRoYW4gdGhlIG9iamVjdCBmaWxlcy4gIEluCi10aGlzIGNhc2UsIGJlIHN1cmUgdG8gc2F5IGV4YWN0bHkgd2hhdCB2ZXJzaW9uIG9mIEBjb2Rle2djY30sIG9yCi13aGF0ZXZlciwgd2FzIHVzZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0IGZpbGVzLiAgQWxzbyBzYXkgaG93Ci1AY29kZXtnY2N9LCBvciB3aGF0ZXZlciwgd2FzIGNvbmZpZ3VyZWQuCi0KLUBpdGVtCi1BIGRlc2NyaXB0aW9uIG9mIHdoYXQgYmVoYXZpb3IgeW91IG9ic2VydmUgdGhhdCB5b3UgYmVsaWV2ZSBpcwotaW5jb3JyZWN0LiAgRm9yIGV4YW1wbGUsIGBgSXQgZ2V0cyBhIGZhdGFsIHNpZ25hbC4nJwotCi1PZiBjb3Vyc2UsIGlmIHRoZSBidWcgaXMgdGhhdCB0aGUgdXRpbGl0eSBnZXRzIGEgZmF0YWwgc2lnbmFsLCB0aGVuIHdlCi13aWxsIGNlcnRhaW5seSBub3RpY2UgaXQuICBCdXQgaWYgdGhlIGJ1ZyBpcyBpbmNvcnJlY3Qgb3V0cHV0LCB3ZSBtaWdodAotbm90IG5vdGljZSB1bmxlc3MgaXQgaXMgZ2xhcmluZ2x5IHdyb25nLiAgWW91IG1pZ2h0IGFzIHdlbGwgbm90IGdpdmUgdXMKLWEgY2hhbmNlIHRvIG1ha2UgYSBtaXN0YWtlLgotCi1FdmVuIGlmIHRoZSBwcm9ibGVtIHlvdSBleHBlcmllbmNlIGlzIGEgZmF0YWwgc2lnbmFsLCB5b3Ugc2hvdWxkIHN0aWxsCi1zYXkgc28gZXhwbGljaXRseS4gIFN1cHBvc2Ugc29tZXRoaW5nIHN0cmFuZ2UgaXMgZ29pbmcgb24sIHN1Y2ggYXMsIHlvdXIKLWNvcHkgb2YgdGhlIHV0aWxpdHkgaXMgb3V0IG9mIHN5bmNoLCBvciB5b3UgaGF2ZSBlbmNvdW50ZXJlZCBhIGJ1ZyBpbgotdGhlIEMgbGlicmFyeSBvbiB5b3VyIHN5c3RlbS4gIChUaGlzIGhhcyBoYXBwZW5lZCEpICBZb3VyIGNvcHkgbWlnaHQKLWNyYXNoIGFuZCBvdXJzIHdvdWxkIG5vdC4gIElmIHlvdSB0b2xkIHVzIHRvIGV4cGVjdCBhIGNyYXNoLCB0aGVuIHdoZW4KLW91cnMgZmFpbHMgdG8gY3Jhc2gsIHdlIHdvdWxkIGtub3cgdGhhdCB0aGUgYnVnIHdhcyBub3QgaGFwcGVuaW5nIGZvcgotdXMuICBJZiB5b3UgaGFkIG5vdCB0b2xkIHVzIHRvIGV4cGVjdCBhIGNyYXNoLCB0aGVuIHdlIHdvdWxkIG5vdCBiZSBhYmxlCi10byBkcmF3IGFueSBjb25jbHVzaW9uIGZyb20gb3VyIG9ic2VydmF0aW9ucy4KLQotQGl0ZW0KLUlmIHlvdSB3aXNoIHRvIHN1Z2dlc3QgY2hhbmdlcyB0byB0aGUgc291cmNlLCBzZW5kIHVzIGNvbnRleHQgZGlmZnMsIGFzCi1nZW5lcmF0ZWQgYnkgQGNvZGV7ZGlmZn0gd2l0aCB0aGUgQHNhbXB7LXV9LCBAc2FtcHstY30sIG9yIEBzYW1wey1wfQotb3B0aW9uLiAgQWx3YXlzIHNlbmQgZGlmZnMgZnJvbSB0aGUgb2xkIGZpbGUgdG8gdGhlIG5ldyBmaWxlLiAgSWYgeW91Ci1ldmVuIGRpc2N1c3Mgc29tZXRoaW5nIGluIHRoZSBAY29kZXtsZH0gc291cmNlLCByZWZlciB0byBpdCBieSBjb250ZXh0LAotbm90IGJ5IGxpbmUgbnVtYmVyLgotCi1UaGUgbGluZSBudW1iZXJzIGluIG91ciBkZXZlbG9wbWVudCBzb3VyY2VzIHdpbGwgbm90IG1hdGNoIHRob3NlIGluIHlvdXIKLXNvdXJjZXMuICBZb3VyIGxpbmUgbnVtYmVycyB3b3VsZCBjb252ZXkgbm8gdXNlZnVsIGluZm9ybWF0aW9uIHRvIHVzLgotQGVuZCBpdGVtaXplCi0KLUhlcmUgYXJlIHNvbWUgdGhpbmdzIHRoYXQgYXJlIG5vdCBuZWNlc3Nhcnk6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1BIGRlc2NyaXB0aW9uIG9mIHRoZSBlbnZlbG9wZSBvZiB0aGUgYnVnLgotCi1PZnRlbiBwZW9wbGUgd2hvIGVuY291bnRlciBhIGJ1ZyBzcGVuZCBhIGxvdCBvZiB0aW1lIGludmVzdGlnYXRpbmcKLXdoaWNoIGNoYW5nZXMgdG8gdGhlIGlucHV0IGZpbGUgd2lsbCBtYWtlIHRoZSBidWcgZ28gYXdheSBhbmQgd2hpY2gKLWNoYW5nZXMgd2lsbCBub3QgYWZmZWN0IGl0LgotCi1UaGlzIGlzIG9mdGVuIHRpbWUgY29uc3VtaW5nIGFuZCBub3QgdmVyeSB1c2VmdWwsIGJlY2F1c2UgdGhlIHdheSB3ZQotd2lsbCBmaW5kIHRoZSBidWcgaXMgYnkgcnVubmluZyBhIHNpbmdsZSBleGFtcGxlIHVuZGVyIHRoZSBkZWJ1Z2dlcgotd2l0aCBicmVha3BvaW50cywgbm90IGJ5IHB1cmUgZGVkdWN0aW9uIGZyb20gYSBzZXJpZXMgb2YgZXhhbXBsZXMuCi1XZSByZWNvbW1lbmQgdGhhdCB5b3Ugc2F2ZSB5b3VyIHRpbWUgZm9yIHNvbWV0aGluZyBlbHNlLgotCi1PZiBjb3Vyc2UsIGlmIHlvdSBjYW4gZmluZCBhIHNpbXBsZXIgZXhhbXBsZSB0byByZXBvcnQgQGVtcGh7aW5zdGVhZH0KLW9mIHRoZSBvcmlnaW5hbCBvbmUsIHRoYXQgaXMgYSBjb252ZW5pZW5jZSBmb3IgdXMuICBFcnJvcnMgaW4gdGhlCi1vdXRwdXQgd2lsbCBiZSBlYXNpZXIgdG8gc3BvdCwgcnVubmluZyB1bmRlciB0aGUgZGVidWdnZXIgd2lsbCB0YWtlCi1sZXNzIHRpbWUsIGFuZCBzbyBvbi4KLQotSG93ZXZlciwgc2ltcGxpZmljYXRpb24gaXMgbm90IHZpdGFsOyBpZiB5b3UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcywKLXJlcG9ydCB0aGUgYnVnIGFueXdheSBhbmQgc2VuZCB1cyB0aGUgZW50aXJlIHRlc3QgY2FzZSB5b3UgdXNlZC4KLQotQGl0ZW0KLUEgcGF0Y2ggZm9yIHRoZSBidWcuCi0KLUEgcGF0Y2ggZm9yIHRoZSBidWcgZG9lcyBoZWxwIHVzIGlmIGl0IGlzIGEgZ29vZCBvbmUuICBCdXQgZG8gbm90IG9taXQKLXRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIHRlc3QgY2FzZSwgb24gdGhlIGFzc3VtcHRpb24gdGhhdAotYSBwYXRjaCBpcyBhbGwgd2UgbmVlZC4gIFdlIG1pZ2h0IHNlZSBwcm9ibGVtcyB3aXRoIHlvdXIgcGF0Y2ggYW5kIGRlY2lkZQotdG8gZml4IHRoZSBwcm9ibGVtIGFub3RoZXIgd2F5LCBvciB3ZSBtaWdodCBub3QgdW5kZXJzdGFuZCBpdCBhdCBhbGwuCi0KLVNvbWV0aW1lcyB3aXRoIHByb2dyYW1zIGFzIGNvbXBsaWNhdGVkIGFzIHRoZSBiaW5hcnkgdXRpbGl0aWVzIGl0IGlzCi12ZXJ5IGhhcmQgdG8gY29uc3RydWN0IGFuIGV4YW1wbGUgdGhhdCB3aWxsIG1ha2UgdGhlIHByb2dyYW0gZm9sbG93IGEKLWNlcnRhaW4gcGF0aCB0aHJvdWdoIHRoZSBjb2RlLiAgSWYgeW91IGRvIG5vdCBzZW5kIHVzIHRoZSBleGFtcGxlLCB3ZQotd2lsbCBub3QgYmUgYWJsZSB0byBjb25zdHJ1Y3Qgb25lLCBzbyB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIHZlcmlmeSB0aGF0Ci10aGUgYnVnIGlzIGZpeGVkLgotCi1BbmQgaWYgd2UgY2Fubm90IHVuZGVyc3RhbmQgd2hhdCBidWcgeW91IGFyZSB0cnlpbmcgdG8gZml4LCBvciB3aHkgeW91cgotcGF0Y2ggc2hvdWxkIGJlIGFuIGltcHJvdmVtZW50LCB3ZSB3aWxsIG5vdCBpbnN0YWxsIGl0LiAgQSB0ZXN0IGNhc2Ugd2lsbAotaGVscCB1cyB0byB1bmRlcnN0YW5kLgotCi1AaXRlbQotQSBndWVzcyBhYm91dCB3aGF0IHRoZSBidWcgaXMgb3Igd2hhdCBpdCBkZXBlbmRzIG9uLgotCi1TdWNoIGd1ZXNzZXMgYXJlIHVzdWFsbHkgd3JvbmcuICBFdmVuIHdlIGNhbm5vdCBndWVzcyByaWdodCBhYm91dCBzdWNoCi10aGluZ3Mgd2l0aG91dCBmaXJzdCB1c2luZyB0aGUgZGVidWdnZXIgdG8gZmluZCB0aGUgZmFjdHMuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgSW5kZXgKLUB1bm51bWJlcmVkIEluZGV4Ci0KLUBwcmludGluZGV4IGNwCi0KLUBjb250ZW50cwotQGJ5ZQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYnVjb21tLmMgYi9iaW51dGlscy9idWNvbW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViMDA1NC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9idWNvbW0uYworKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKiBidWNvbW0uYyAtLSBCaW4gVXRpbHMgQ09NbW9uIGNvZGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotLyogV2UgbWlnaHQgcHV0IHRoaXMgaW4gYSBsaWJyYXJ5IHNvbWVkYXkgc28gaXQgY291bGQgYmUgZHluYW1pY2FsbHkKLSAgIGxvYWRlZCwgYnV0IGZvciBub3cgaXQncyBub3QgbmVjZXNzYXJ5LiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDx0aW1lLmg+CQkvKiBjdGltZSwgbWF5YmUgdGltZV90ICovCi0KLSNpZm5kZWYgSEFWRV9USU1FX1RfSU5fVElNRV9ICi0jaWZuZGVmIEhBVkVfVElNRV9UX0lOX1RZUEVTX0gKLXR5cGVkZWYgbG9uZyB0aW1lX3Q7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotDAotLyogRXJyb3IgcmVwb3J0aW5nICovCi0KLWNoYXIgKnByb2dyYW1fbmFtZTsKLQotdm9pZAotYmZkX25vbmZhdGFsIChzdHJpbmcpCi0gICAgIENPTlNUIGNoYXIgKnN0cmluZzsKLXsKLSAgQ09OU1QgY2hhciAqZXJybXNnID0gYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSk7Ci0KLSAgaWYgKHN0cmluZykKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIHN0cmluZywgZXJybXNnKTsKLSAgZWxzZQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBlcnJtc2cpOwotfQotCi12b2lkCi1iZmRfZmF0YWwgKHN0cmluZykKLSAgICAgQ09OU1QgY2hhciAqc3RyaW5nOwotewotICBiZmRfbm9uZmF0YWwgKHN0cmluZyk7Ci0gIHhleGl0ICgxKTsKLX0KLQotc3RhdGljIHZvaWQKLXJlcG9ydCAoZm9ybWF0LCBhcmdzKQotICAgICBjb25zdCBjaGFyICogZm9ybWF0OwotICAgICB2YV9saXN0IGFyZ3M7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOwotICBwdXRjICgnXG4nLCBzdGRlcnIpOwotfQotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi12b2lkCi1mYXRhbCAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgcmVwb3J0IChmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICB4ZXhpdCAoMSk7Ci19Ci0KLXZvaWQKLW5vbl9mYXRhbCAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgcmVwb3J0IChmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotfQotI2Vsc2UKLXZvaWQgCi1mYXRhbCAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotewotICBjaGFyICpGb3JtYXQ7Ci0gIHZhX2xpc3QgYXJnczsKLQotICB2YV9zdGFydCAoYXJncyk7Ci0gIEZvcm1hdCA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKLSAgcmVwb3J0IChGb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICB4ZXhpdCAoMSk7Ci19Ci0KLXZvaWQgCi1ub25fZmF0YWwgKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLXsKLSAgY2hhciAqRm9ybWF0OwotICB2YV9saXN0IGFyZ3M7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBGb3JtYXQgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7Ci0gIHJlcG9ydCAoRm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLX0KLSNlbmRpZgotCi0vKiBTZXQgdGhlIGRlZmF1bHQgQkZEIHRhcmdldCBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCB0YXJnZXQuICBEb2luZwotICAgdGhpcyBwZXJtaXRzIHRoZSBiaW51dGlscyB0byBiZSBjb25maWd1cmVkIGZvciBhIHBhcnRpY3VsYXIgdGFyZ2V0LAotICAgYW5kIGxpbmtlZCBhZ2FpbnN0IGEgc2hhcmVkIEJGRCBsaWJyYXJ5IHdoaWNoIHdhcyBjb25maWd1cmVkIGZvciBhCi0gICBkaWZmZXJlbnQgdGFyZ2V0LiAgKi8KLQotdm9pZAotc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKQotewotICAvKiBUaGUgbWFjcm8gVEFSR0VUIGlzIGRlZmluZWQgYnkgTWFrZWZpbGUuICAqLwotICBjb25zdCBjaGFyICp0YXJnZXQgPSBUQVJHRVQ7Ci0KLSAgaWYgKCEgYmZkX3NldF9kZWZhdWx0X3RhcmdldCAodGFyZ2V0KSkKLSAgICBmYXRhbCAoXygiY2FuJ3Qgc2V0IEJGRCBkZWZhdWx0IHRhcmdldCB0byBgJXMnOiAlcyIpLAotCSAgIHRhcmdldCwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotfQotCi0vKiBBZnRlciBhIGZhbHNlIHJldHVybiBmcm9tIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyB3aXRoCi0gICBiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQsIHByaW50Ci0gICB0aGUgcG9zc2libGUgbWF0Y2hpbmcgdGFyZ2V0cy4gICovCi0KLXZvaWQKLWxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAocCkKLSAgICAgY2hhciAqKnA7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IE1hdGNoaW5nIGZvcm1hdHM6IiksIHByb2dyYW1fbmFtZSk7Ci0gIHdoaWxlICgqcCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgJXMiLCAqcCsrKTsKLSAgZnB1dGMgKCdcbicsIHN0ZGVycik7Ci19Ci0KLS8qIExpc3QgdGhlIHN1cHBvcnRlZCB0YXJnZXRzLiAgKi8KLQotdm9pZAotbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAobmFtZSwgZikKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgRklMRSAqZjsKLXsKLSAgZXh0ZXJuIGJmZF90YXJnZXQgKmJmZF90YXJnZXRfdmVjdG9yW107Ci0gIGludCB0OwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgZnByaW50ZiAoZiwgXygiU3VwcG9ydGVkIHRhcmdldHM6IikpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZiwgXygiJXM6IHN1cHBvcnRlZCB0YXJnZXRzOiIpLCBuYW1lKTsKLSAgZm9yICh0ID0gMDsgYmZkX3RhcmdldF92ZWN0b3JbdF0gIT0gTlVMTDsgdCsrKQotICAgIGZwcmludGYgKGYsICIgJXMiLCBiZmRfdGFyZ2V0X3ZlY3Rvclt0XS0+bmFtZSk7Ci0gIGZwcmludGYgKGYsICJcbiIpOwotfQotDAotLyogRGlzcGxheSB0aGUgYXJjaGl2ZSBoZWFkZXIgZm9yIGFuIGVsZW1lbnQgYXMgaWYgaXQgd2VyZSBhbiBscyAtbCBsaXN0aW5nOgotCi0gICBNb2RlICAgICAgIFVzZXJcdEdyb3VwXHRTaXplXHREYXRlICAgICAgICAgICAgICAgTmFtZSAqLwotCi12b2lkCi1wcmludF9hcmVsdF9kZXNjciAoZmlsZSwgYWJmZCwgdmVyYm9zZSkKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHZlcmJvc2U7Ci17Ci0gIHN0cnVjdCBzdGF0IGJ1ZjsKLQotICBpZiAodmVyYm9zZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3N0YXRfYXJjaF9lbHQgKGFiZmQsICZidWYpID09IDApCi0JewotCSAgY2hhciBtb2RlYnVmWzExXTsKLQkgIGNoYXIgdGltZWJ1Zls0MF07Ci0JICB0aW1lX3Qgd2hlbiA9IGJ1Zi5zdF9tdGltZTsKLQkgIENPTlNUIGNoYXIgKmN0aW1lX3Jlc3VsdCA9IChDT05TVCBjaGFyICopIGN0aW1lICgmd2hlbik7Ci0KLQkgIC8qIFBPU0lYIGZvcm1hdDogIHNraXAgd2Vla2RheSBhbmQgc2Vjb25kcyBmcm9tIGN0aW1lIG91dHB1dC4gICovCi0JICBzcHJpbnRmICh0aW1lYnVmLCAiJS4xMnMgJS40cyIsIGN0aW1lX3Jlc3VsdCArIDQsIGN0aW1lX3Jlc3VsdCArIDIwKTsKLQotCSAgbW9kZV9zdHJpbmcgKGJ1Zi5zdF9tb2RlLCBtb2RlYnVmKTsKLQkgIG1vZGVidWZbMTBdID0gJ1wwJzsKLQkgIC8qIFBPU0lYIDEwMDMuMi9EMTEgc2F5cyB0byBza2lwIGZpcnN0IGNoYXJhY3RlciAoZW50cnkgdHlwZSkuICAqLwotCSAgZnByaW50ZiAoZmlsZSwgIiVzICVsZC8lbGQgJTZsZCAlcyAiLCBtb2RlYnVmICsgMSwKLQkJICAgKGxvbmcpIGJ1Zi5zdF91aWQsIChsb25nKSBidWYuc3RfZ2lkLAotCQkgICAobG9uZykgYnVmLnN0X3NpemUsIHRpbWVidWYpOwotCX0KLSAgICB9Ci0KLSAgZnByaW50ZiAoZmlsZSwgIiVzXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci19Ci0KLS8qIFJldHVybiB0aGUgbmFtZSBvZiBhIHRlbXBvcmFyeSBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBGSUxFTkFNRS4gICovCi0KLWNoYXIgKgotbWFrZV90ZW1wbmFtZSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBzdGF0aWMgY2hhciB0ZW1wbGF0ZVtdID0gInN0WFhYWFhYIjsKLSAgY2hhciAqdG1wbmFtZTsKLSAgY2hhciAqc2xhc2ggPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLQotI2lmIGRlZmluZWQgKF9fREpHUFBfXykgfHwgZGVmaW5lZCAoX19HTzMyX18pIHx8IGRlZmluZWQgKF9XSU4zMikKLSAgaWYgKHNsYXNoID09IE5VTEwpCi0gICAgc2xhc2ggPSBzdHJyY2hyIChmaWxlbmFtZSwgJ1xcJyk7Ci0jZW5kaWYKLQotICBpZiAoc2xhc2ggIT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyIGM7Ci0KLSAgICAgIGMgPSAqc2xhc2g7Ci0gICAgICAqc2xhc2ggPSAwOwotICAgICAgdG1wbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAoZmlsZW5hbWUpICsgc2l6ZW9mICh0ZW1wbGF0ZSkgKyAxKTsKLSAgICAgIHN0cmNweSAodG1wbmFtZSwgZmlsZW5hbWUpOwotICAgICAgc3RyY2F0ICh0bXBuYW1lLCAiLyIpOwotICAgICAgc3RyY2F0ICh0bXBuYW1lLCB0ZW1wbGF0ZSk7Ci0gICAgICBta3RlbXAgKHRtcG5hbWUpOwotICAgICAgKnNsYXNoID0gYzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0bXBuYW1lID0geG1hbGxvYyAoc2l6ZW9mICh0ZW1wbGF0ZSkpOwotICAgICAgc3RyY3B5ICh0bXBuYW1lLCB0ZW1wbGF0ZSk7Ci0gICAgICBta3RlbXAgKHRtcG5hbWUpOwotICAgIH0KLSAgcmV0dXJuIHRtcG5hbWU7Ci19Ci0KLS8qIFBhcnNlIGEgc3RyaW5nIGludG8gYSBWTUEsIHdpdGggYSBmYXRhbCBlcnJvciBpZiBpdCBjYW4ndCBiZQotICAgcGFyc2VkLiAgKi8KLQotYmZkX3ZtYQotcGFyc2Vfdm1hIChzLCBhcmcpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgIGNvbnN0IGNoYXIgKmFyZzsKLXsKLSAgYmZkX3ZtYSByZXQ7Ci0gIGNvbnN0IGNoYXIgKmVuZDsKLQotICByZXQgPSBiZmRfc2Nhbl92bWEgKHMsICZlbmQsIDApOwotICAKLSAgaWYgKCplbmQgIT0gJ1wwJykKLSAgICBmYXRhbCAoXygiJXM6IGJhZCBudW1iZXI6ICVzIiksIGFyZywgcyk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2J1Y29tbS5oIGIvYmludXRpbHMvYnVjb21tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZTZhNzkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYnVjb21tLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyogYnVjb21tLmggLS0gYmludXRpbHMgY29tbW9uIGluY2x1ZGUgZmlsZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLSNpZm5kZWYgX0JVQ09NTV9ICi0jZGVmaW5lIF9CVUNPTU1fSAotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZmRlZiBVU0VfQklOQVJZX0ZPUEVOCi0jaW5jbHVkZSAiZm9wZW4tYmluLmgiCi0jZWxzZQotI2luY2x1ZGUgImZvcGVuLXNhbWUuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZm5kZWYgZXJybm8KLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbHNlCi1leHRlcm4gY2hhciAqc3RyY2hyICgpOwotZXh0ZXJuIGNoYXIgKnN0cnJjaHIgKCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0ZDTlRMX0gKLSNpbmNsdWRlIDxmY250bC5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NZU19GSUxFX0gKLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi1leHRlcm4gY2hhciAqc3Ryc3RyICgpOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NCUksKLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLWV4dGVybiBjaGFyICpzYnJrICgpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fR0VURU5WCi1leHRlcm4gY2hhciAqZ2V0ZW52ICgpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04KLWV4dGVybiBjaGFyICoqZW52aXJvbjsKLSNlbmRpZgotCi0jaWZuZGVmIE9fUkRPTkxZCi0jZGVmaW5lIE9fUkRPTkxZIDAKLSNlbmRpZgotCi0jaWZuZGVmIE9fUkRXUgotI2RlZmluZSBPX1JEV1IgMgotI2VuZGlmCi0KLSNpZm5kZWYgU0VFS19TRVQKLSNkZWZpbmUgU0VFS19TRVQgMAotI2VuZGlmCi0jaWZuZGVmIFNFRUtfQ1VSCi0jZGVmaW5lIFNFRUtfQ1VSIDEKLSNlbmRpZgotI2lmbmRlZiBTRUVLX0VORAotI2RlZmluZSBTRUVLX0VORCAyCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKENfQUxMT0NBKQotIyB1bmRlZiBhbGxvY2EKLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZiBkZWZpbmVkKEhBVkVfQUxMT0NBX0gpICYmICFkZWZpbmVkKENfQUxMT0NBKQotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsc2UKLSMgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi0jICAgaWYgIWRlZmluZWQgKF9fU1REQ19fKSAmJiAhZGVmaW5lZCAoX19ocHV4KQotY2hhciAqYWxsb2NhICgpOwotIyAgIGVsc2UKLXZvaWQgKmFsbG9jYSAoKTsKLSMgICBlbmRpZiAvKiBfX1NURENfXywgX19ocHV4ICovCi0jICBlbmRpZiAvKiBhbGxvY2EgKi8KLSMgZW5kaWYgLyogSEFWRV9BTExPQ0FfSCAqLwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0xPQ0FMRV9ICi0jIGluY2x1ZGUgPGxvY2FsZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBFTkFCTEVfTkxTCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSMgZGVmaW5lIF8oU3RyaW5nKSBnZXR0ZXh0IChTdHJpbmcpCi0jIGlmZGVmIGdldHRleHRfbm9vcAotIyAgZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCi0jIGVsc2UKLSMgIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jIGVuZGlmCi0jZWxzZQotLyogU3R1YnMgdGhhdCBkbyBzb21ldGhpbmcgY2xvc2UgZW5vdWdoLiAgKi8KLSMgZGVmaW5lIHRleHRkb21haW4oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZ2V0dGV4dChTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBkZ2V0dGV4dChEb21haW4sTWVzc2FnZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBkY2dldHRleHQoRG9tYWluLE1lc3NhZ2UsVHlwZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW4sRGlyZWN0b3J5KSAoRG9tYWluKQotIyBkZWZpbmUgXyhTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jZW5kaWYKLQotLyogYnVjb21tLmMgKi8KLXZvaWQgYmZkX25vbmZhdGFsIFBBUkFNUyAoKENPTlNUIGNoYXIgKikpOwotCi12b2lkIGJmZF9mYXRhbCBQQVJBTVMgKChDT05TVCBjaGFyICopKTsKLQotdm9pZCBmYXRhbCBQQVJBTVMgKChDT05TVCBjaGFyICosIC4uLikpOwotCi12b2lkIG5vbl9mYXRhbCBQQVJBTVMgKChDT05TVCBjaGFyICosIC4uLikpOwotCi12b2lkIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgUEFSQU1TICgodm9pZCkpOwotCi12b2lkIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyBQQVJBTVMgKChjaGFyICoqcCkpOwotCi12b2lkIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgUEFSQU1TICgoY29uc3QgY2hhciAqLCBGSUxFICopKTsKLQotdm9pZCBwcmludF9hcmVsdF9kZXNjciBQQVJBTVMgKChGSUxFICpmaWxlLCBiZmQgKmFiZmQsIGJvb2xlYW4gdmVyYm9zZSkpOwotCi1jaGFyICptYWtlX3RlbXBuYW1lIFBBUkFNUyAoKGNoYXIgKikpOwotCi1iZmRfdm1hIHBhcnNlX3ZtYSBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotCi1leHRlcm4gY2hhciAqcHJvZ3JhbV9uYW1lOwotCi0vKiBmaWxlbW9kZS5jICovCi12b2lkIG1vZGVfc3RyaW5nIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgbW9kZSwgY2hhciAqYnVmKSk7Ci0KLS8qIHZlcnNpb24uYyAqLwotZXh0ZXJuIHZvaWQgcHJpbnRfdmVyc2lvbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotLyogcmVuYW1lLmMgKi8KLWV4dGVybiB2b2lkIHNldF90aW1lcyBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCBzdGF0ICopKTsKLQotZXh0ZXJuIGludCBzbWFydF9yZW5hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi0vKiBsaWJpYmVydHkgKi8KLVBUUiB4bWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotCi1QVFIgeHJlYWxsb2MgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLQotI2VuZGlmIC8qIF9CVUNPTU1fSCAqLwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYnVkYmcuaCBiL2JpbnV0aWxzL2J1ZGJnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZWU4ODkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYnVkYmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qIGJ1ZGJnLmMgLS0gSW50ZXJmYWNlcyB0byB0aGUgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gcm91dGluZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBCVURCR19ICi0jZGVmaW5lIEJVREJHX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qIFJvdXRpbmUgdXNlZCB0byByZWFkIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotZXh0ZXJuIFBUUiByZWFkX2RlYnVnZ2luZ19pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBsb25nKSk7Ci0KLS8qIFJvdXRpbmUgdXNlZCB0byBwcmludCBnZW5lcmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLWV4dGVybiBib29sZWFuIHByaW50X2RlYnVnZ2luZ19pbmZvIFBBUkFNUyAoKEZJTEUgKiwgUFRSKSk7Ci0KLS8qIFJvdXRpbmVzIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgc3RhYnMgaW5mb3JtYXRpb24uICAqLwotCi1leHRlcm4gUFRSIHN0YXJ0X3N0YWIgUEFSQU1TICgoUFRSLCBiZmQgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKiwgbG9uZykpOwotCi1leHRlcm4gYm9vbGVhbiBmaW5pc2hfc3RhYiBQQVJBTVMgKChQVFIsIFBUUikpOwotCi1leHRlcm4gYm9vbGVhbiBwYXJzZV9zdGFiIFBBUkFNUyAoKFBUUiwgUFRSLCBpbnQsIGludCwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKSk7Ci0KLWV4dGVybiBib29sZWFuIHdyaXRlX3N0YWJzX2luX3NlY3Rpb25zX2RlYnVnZ2luZ19pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGJmZF9ieXRlICoqLCBiZmRfc2l6ZV90eXBlICosIGJmZF9ieXRlICoqLAotCSAgIGJmZF9zaXplX3R5cGUgKikpOwotCi0vKiBSb3V0aW5lcyB1c2VkIHRvIHJlYWQgYW5kIHdyaXRlIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gcGFyc2VfaWVlZQotICBQQVJBTVMgKChQVFIsIGJmZCAqLCBjb25zdCBiZmRfYnl0ZSAqLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLWV4dGVybiBib29sZWFuIHdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8gUEFSQU1TICgoYmZkICosIFBUUikpOwotCi0vKiBSb3V0aW5lIHVzZWQgdG8gcmVhZCBDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLWV4dGVybiBib29sZWFuIHBhcnNlX2NvZmYgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGxvbmcsIFBUUikpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvZmZkdW1wLmMgYi9iaW51dGlscy9jb2ZmZHVtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzg0ZDUwLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2NvZmZkdW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDEgKzAsMCBAQAotLyogQ29mZiBmaWxlIGR1bXBlci4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLQotICAgVGhpcyBtb2R1bGUgcmVhZHMgYSB0eXBlIHRyZWUgZ2VuZXJhdGVkIGJ5IGNvZmZncm9rIGFuZCBwcmludHMKLSAgIGl0IG91dCBzbyB3ZSBjYW4gdGVzdCB0aGUgZ3Jva2tlci4KLSovCi0KLSNpbmNsdWRlIDxiZmQuaD4KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLSNpbmNsdWRlIDxsaWJpYmVydHkuaD4KLQotI2luY2x1ZGUgImNvZmZncm9rLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLSNkZWZpbmUgUFJPR1JBTV9WRVJTSU9OICIxLjAiCi0KLXN0YXRpYyBpbnQgYXRubDsKLXN0YXRpYyB2b2lkIGR1bXBfY29mZl9zY29wZSAoKTsKLQotc3RhdGljIHZvaWQKLXRhYiAoeCkKLWludCB4OwotewotICBzdGF0aWMgaW50IGluZGVudDsKLSAgaW50IGk7Ci0KLSAgaWYgKGF0bmwpCi0gICAgewotICAgICAgaWYgKHggPCAwKQotCXsKLQkgIHByaW50ZiAoIikiKTsKLQkgIGluZGVudCArPSB4OwotCi0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoIlxuIik7Ci0JICBhdG5sID0gMDsKLQl9Ci0gICAgfQotCi0gIGlmICh4ID09IC0xKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLQlwcmludGYgKCIgICAiKTsKLQotICAgICAgaW5kZW50ICs9IHg7Ci0gICAgICBwcmludGYgKCIpIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluZGVudCArPSB4OwotCi0gIGZvciAoaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLSAgICBwcmludGYgKCIgICAiKTsKLQotICBpZiAoeCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIoIik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBubCAoKQotewotICBhdG5sID0gMTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfY29mZl9saW5lcyAocCkKLSAgICAgc3RydWN0IGNvZmZfbGluZSAqcDsKLXsKLSAgaW50IGk7Ci0gIGludCBvbmxpbmUgPSAwOwotICB0YWIoMSk7Ci0gIHByaW50ZihfKCIjbGluZXMgJWQgIikscC0+bmxpbmVzKTsKLSAgZm9yIChpID0gMDsgaSA8IHAtPm5saW5lczsgaSsrKSAKLSAgICB7Ci0gICAgICBwcmludGYoIiglZCAweCV4KSIsIHAtPmxpbmVzW2ldLCBwLT5hZGRyZXNzZXNbaV0pOwotICAgICAgb25saW5lKys7Ci0gICAgICBpZiAob25saW5lID4gNikKLQl7Ci0JICBubCgpOwotCSAgdGFiKDApOwotCSAgb25saW5lID0gMDsKLQl9Ci0gICAgfQotICBubCgpOwotICB0YWIoLTEpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9jb2ZmX3R5cGUgKHApCi0gICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnA7Ci17Ci0gIHRhYiAoMSk7Ci0gIHByaW50ZiAoInNpemUgJWQgIiwgcC0+c2l6ZSk7Ci0gIHN3aXRjaCAocC0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBjb2ZmX3NlY2RlZl90eXBlOgotICAgICAgcHJpbnRmICgic2VjdGlvbiBkZWZpbml0aW9uIGF0ICV4IHNpemUgJXhcbiIsIAotCSAgICAgIHAtPnUuYXNlY2RlZi5hZGRyZXNzLAotCSAgICAgIHAtPnUuYXNlY2RlZi5zaXplKTsKLSAgICAgIG5sKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfcG9pbnRlcl90eXBlOgotICAgICAgcHJpbnRmICgicG9pbnRlciB0byIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfdHlwZSAocC0+dS5wb2ludGVyLnBvaW50c190byk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfYXJyYXlfdHlwZToKLSAgICAgIHByaW50ZiAoImFycmF5IFslZF0gb2YiLCBwLT51LmFycmF5LmRpbSk7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl90eXBlIChwLT51LmFycmF5LmFycmF5X29mKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9mdW5jdGlvbl90eXBlOgotICAgICAgcHJpbnRmICgiZnVuY3Rpb24gcmV0dXJuaW5nIik7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl90eXBlIChwLT51LmZ1bmN0aW9uLmZ1bmN0aW9uX3JldHVybnMpOwotICAgICAgZHVtcF9jb2ZmX2xpbmVzIChwLT51LmZ1bmN0aW9uLmxpbmVzKTsKLSAgICAgIHByaW50ZiAoImFyZ3VtZW50cyIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfc2NvcGUgKHAtPnUuZnVuY3Rpb24ucGFyYW1ldGVycyk7Ci0gICAgICB0YWIgKDApOwotICAgICAgcHJpbnRmICgiY29kZSIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfc2NvcGUgKHAtPnUuZnVuY3Rpb24uY29kZSk7Ci0gICAgICB0YWIoMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfc3RydWN0ZGVmX3R5cGU6Ci0gICAgICBwcmludGYgKCJzdHJ1Y3R1cmUgZGVmaW5pdGlvbiIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfc2NvcGUgKHAtPnUuYXN0cnVjdGRlZi5lbGVtZW50cyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfc3RydWN0cmVmX3R5cGU6Ci0gICAgICBpZiAoIXAtPnUuYWVudW1yZWYucmVmKQotCXByaW50ZiAoInN0cnVjdHVyZSByZWYgdG8gVU5LTk9XTiBzdHJ1Y3QiKTsKLSAgICAgIGVsc2UKLQlwcmludGYgKCJzdHJ1Y3R1cmUgcmVmIHRvICVzIiwgcC0+dS5hZW51bXJlZi5yZWYtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX2VudW1yZWZfdHlwZToKLSAgICAgIHByaW50ZiAoImVudW0gcmVmIHRvICVzIiwgcC0+dS5hc3RydWN0cmVmLnJlZi0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfZW51bWRlZl90eXBlOgotICAgICAgcHJpbnRmICgiZW51bSBkZWZpbml0aW9uIik7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl9zY29wZSAocC0+dS5hZW51bWRlZi5lbGVtZW50cyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfYmFzaWNfdHlwZToKLSAgICAgIHN3aXRjaCAocC0+dS5iYXNpYykKLQl7Ci0JY2FzZSBUX05VTEw6Ci0JICBwcmludGYgKCJOVUxMIik7Ci0JICBicmVhazsKLQljYXNlIFRfVk9JRDoKLQkgIHByaW50ZiAoIlZPSUQiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9DSEFSOgotCSAgcHJpbnRmICgiQ0hBUiIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX1NIT1JUOgotCSAgcHJpbnRmICgiU0hPUlQiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9JTlQ6Ci0JICBwcmludGYgKCJJTlQgIik7Ci0JICBicmVhazsKLQljYXNlIFRfTE9ORzoKLQkgIHByaW50ZiAoIkxPTkciKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9GTE9BVDoKLQkgIHByaW50ZiAoIkZMT0FUIik7Ci0JICBicmVhazsKLQljYXNlIFRfRE9VQkxFOgotCSAgcHJpbnRmICgiRE9VQkxFIik7Ci0JICBicmVhazsKLQljYXNlIFRfU1RSVUNUOgotCSAgcHJpbnRmICgiU1RSVUNUIik7Ci0JICBicmVhazsKLQljYXNlIFRfVU5JT046Ci0JICBwcmludGYgKCJVTklPTiIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX0VOVU06Ci0JICBwcmludGYgKCJFTlVNIik7Ci0JICBicmVhazsKLQljYXNlIFRfTU9FOgotCSAgcHJpbnRmICgiTU9FICIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX1VDSEFSOgotCSAgcHJpbnRmICgiVUNIQVIiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9VU0hPUlQ6Ci0JICBwcmludGYgKCJVU0hPUlQiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9VSU5UOgotCSAgcHJpbnRmICgiVUlOVCIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX1VMT05HOgotCSAgcHJpbnRmICgiVUxPTkciKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9MTkdEQkw6Ci0JICBwcmludGYgKCJMTkdEQkwiKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotICBubCAoKTsKLSAgdGFiICgtMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NvZmZfd2hlcmUgKHApCi0gICAgIHN0cnVjdCBjb2ZmX3doZXJlICpwOwotewotICB0YWIgKDEpOwotICBzd2l0Y2ggKHAtPndoZXJlKQotICAgIHsKLSAgICBjYXNlIGNvZmZfd2hlcmVfc3RhY2s6Ci0gICAgICBwcmludGYgKCJTdGFjayBvZmZzZXQgJXgiLCBwLT5vZmZzZXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX21lbW9yeToKLSAgICAgIHByaW50ZiAoIk1lbW9yeSBzZWN0aW9uICVzKyV4IiwgcC0+c2VjdGlvbi0+bmFtZSwgcC0+b2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9yZWdpc3RlcjoKLSAgICAgIHByaW50ZiAoIlJlZ2lzdGVyICVkIiwgcC0+b2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0OgotICAgICAgcHJpbnRmICgiU3RydWN0IE1lbWJlciBvZmZzZXQgJXgiLCBwLT5vZmZzZXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX21lbWJlcl9vZl9lbnVtOgotICAgICAgcHJpbnRmICgiRW51bSBNZW1iZXIgb2Zmc2V0ICV4IiwgcC0+b2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV91bmtub3duOgotICAgICAgcHJpbnRmICgiVW5kZWZpbmVkIHN5bWJvbCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3N0cnRhZzoKLSAgICAgIHByaW50ZiAoIlNUUlRBRyIpOwotICAgIGNhc2UgY29mZl93aGVyZV9lbnRhZzoKLSAgICAgIHByaW50ZiAoIkVOVEFHIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfdHlwZWRlZjoKLSAgICAgIHByaW50ZiAoIlRZUEVERUYiKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIG5sICgpOwotICB0YWIgKC0xKTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfY29mZl92aXNpYmxlIChwKQotICAgICBzdHJ1Y3QgY29mZl92aXNpYmxlICpwOwotewotICB0YWIgKDEpOwotICBzd2l0Y2ggKHAtPnR5cGUpCi0gICAgewotICAgIGNhc2UgY29mZl92aXNfZXh0X2RlZjoKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX2V4dF9kZWYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfZXh0X3JlZjoKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX2V4dF9yZWYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfaW50X2RlZjoKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX2ludF9kZWYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfY29tbW9uOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfY29tbW9uIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2F1dG86Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19hdXRvIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2F1dG9wYXJhbToKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX2F1dG9wYXJhbSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19yZWdwYXJhbToKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX3JlZ3BhcmFtIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX3JlZ2lzdGVyOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfcmVnaXN0ZXIiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfdGFnOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfdGFnIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX21lbWJlcl9vZl9zdHJ1Y3Q6Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19tZW1iZXJfb2Zfc3RydWN0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX21lbWJlcl9vZl9lbnVtOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfbWVtYmVyX29mX2VudW0iKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIG5sICgpOwotICB0YWIgKC0xKTsKLX0KLQotCi12b2lkCi1kdW1wX2NvZmZfc3ltYm9sIChwKQotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnA7Ci17Ci0gIHRhYiAoMSk7Ci0gIHByaW50ZiAoIkxpc3Qgb2Ygc3ltYm9scyIpOwotICBubCAoKTsKLSAgd2hpbGUgKHApCi0gICAgewotICAgICAgdGFiICgxKTsKLSAgICAgIHRhYiAoMSk7Ci0gICAgICBwcmludGYgKCJTeW1ib2wgICVzLCB0YWcgJWQsIG51bWJlciAlZCIsIHAtPm5hbWUsIHAtPnRhZywgcC0+bnVtYmVyKTsKLSAgICAgIG5sICgpOwotICAgICAgdGFiICgtMSk7Ci0gICAgICB0YWIgKDEpOwotICAgICAgcHJpbnRmICgiVHlwZSIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfdHlwZSAocC0+dHlwZSk7Ci0gICAgICB0YWIgKC0xKTsKLSAgICAgIHRhYiAoMSk7Ci0gICAgICBwcmludGYgKCJXaGVyZSIpOwotICAgICAgZHVtcF9jb2ZmX3doZXJlIChwLT53aGVyZSk7Ci0gICAgICB0YWIgKC0xKTsKLSAgICAgIHRhYiAoMSk7Ci0gICAgICBwcmludGYgKCJWaXNpYmxlIik7Ci0gICAgICBkdW1wX2NvZmZfdmlzaWJsZSAocC0+dmlzaWJsZSk7Ci0gICAgICB0YWIgKC0xKTsKLSAgICAgIHAgPSBwLT5uZXh0OwotICAgICAgdGFiICgtMSk7Ci0gICAgfQotICB0YWIgKC0xKTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfY29mZl9zY29wZSAocCkKLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKnA7Ci17Ci1pZiAocCkgewotICB0YWIgKDEpOwotICBwcmludGYgKCJMaXN0IG9mIGJsb2NrcyAlbHggIiwodW5zaWduZWQgbG9uZykgcCk7Ci0KLSAgaWYgKHAtPnNlYykgewotICAgIHByaW50ZiggIiAgJXMgJXguLiV4IiwgIHAtPnNlYy0+bmFtZSxwLT5vZmZzZXQsIHAtPm9mZnNldCArIHAtPnNpemUgLTEpOwotICB9Ci0gIG5sICgpOwotICB0YWIgKDApOwotICBwcmludGYgKCIqKioqKioqKioqKioqKioqKiIpOwotICBubCAoKTsKLSAgd2hpbGUgKHApCi0gICAgewotICAgICAgdGFiICgwKTsKLSAgICAgIHByaW50ZiAoInZhcnMgJWQiLCBwLT5udmFycyk7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl9zeW1ib2wgKHAtPnZhcnNfaGVhZCk7Ci0gICAgICBwcmludGYgKCJibG9ja3MiKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3Njb3BlIChwLT5saXN0X2hlYWQpOwotICAgICAgbmwgKCk7Ci0gICAgICBwID0gcC0+bmV4dDsKLSAgICB9Ci0KLSAgdGFiICgwKTsKLSAgcHJpbnRmICgiKioqKioqKioqKioqKioqKioiKTsKLSAgbmwgKCk7Ci0gIHRhYiAoLTEpOwotfQotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9jb2ZmX3NmaWxlIChwKQotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqcDsKLXsKLSAgdGFiICgxKTsKLSAgcHJpbnRmICgiTGlzdCBvZiBzb3VyY2UgZmlsZXMiKTsKLSAgbmwgKCk7Ci0gIHdoaWxlIChwKQotICAgIHsKLSAgICAgIHRhYiAoMCk7Ci0gICAgICBwcmludGYgKCJTb3VyY2UgZmlsZSAlcyIsIHAtPm5hbWUpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfc2NvcGUgKHAtPnNjb3BlKTsKLSAgICAgIHAgPSBwLT5uZXh0OwotICAgIH0KLSAgdGFiICgtMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NvZmZfc2VjdGlvbihwdHIpCi1zdHJ1Y3QgY29mZl9zZWN0aW9uICpwdHI7Ci17Ci0gIGludCBpOwotICB0YWIoMSk7Ci0gIHByaW50Zigic2VjdGlvbiAlcyAlZCAlZCBhZGRyZXNzICV4IHNpemUgJXggbnVtYmVyICVkIG5yZWxvY3MgJWQiLCAKLQkgcHRyLT5uYW1lLCBwdHItPmNvZGUsIHB0ci0+ZGF0YSwgcHRyLT5hZGRyZXNzLHB0ci0+c2l6ZSwgcHRyLT5udW1iZXIsIHB0ci0+bnJlbG9jcyk7Ci0gIG5sKCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHB0ci0+bnJlbG9jczsgaSsrKSAKLSAgICB7Ci0gICAgICB0YWIoMCk7ICAgIAotICAgICAgcHJpbnRmKCIoJXggJXMgJXgpIiwKLQkgICAgIHB0ci0+cmVsb2NzW2ldLm9mZnNldCwKLQkgICAgIHB0ci0+cmVsb2NzW2ldLnN5bWJvbC0+bmFtZSwKLQkgICAgIHB0ci0+cmVsb2NzW2ldLmFkZGVuZCk7Ci0gICAgICBubCgpOwotICAgIH0KLSAgdGFiKC0xKTsKLQotfQotCi12b2lkCi1jb2ZmX2R1bXAgKHB0cikKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnB0cjsKLXsKLSAgaW50IGk7Ci0gIHByaW50ZiAoIkNvZmYgZHVtcCIpOwotICBubCAoKTsKLSAgcHJpbnRmICgiI3NvdWNlcyAlZCIsIHB0ci0+bnNvdXJjZXMpOwotICBubCAoKTsKLSAgZHVtcF9jb2ZmX3NmaWxlIChwdHItPnNvdXJjZV9oZWFkKTsKLSAgZm9yIChpID0gMDsgaSA8IHB0ci0+bnNlY3Rpb25zOyBpKyspCi0gICAgZHVtcF9jb2ZmX3NlY3Rpb24ocHRyLT5zZWN0aW9ucyArIGkpOwotfQotCi0KLQotY2hhciAqIHByb2dyYW1fbmFtZTsKLQotc3RhdGljIHZvaWQKLXNob3dfdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoZmlsZSwgIlVzYWdlOiAlcyBbLWhWXSBpbi1maWxlXG4iLCAgIHByb2dyYW1fbmFtZSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zaG93X2hlbHAgKCkKLXsKLSAgcHJpbnRmIChfKCIlczogUHJpbnQgYSBodW1hbiByZWFkYWJsZSBpbnRlcnByZXRhdGlvbiBvZiBhIFNZU1JPRkYgb2JqZWN0IGZpbGVcbiIpLAotCSAgcHJvZ3JhbV9uYW1lKTsKLSAgc2hvd191c2FnZSAoc3Rkb3V0LCAwKTsKLX0KLQotCi1pbnQKLW1haW4gKGFjLCBhdikKLSAgICAgaW50IGFjOwotICAgICBjaGFyICphdltdOwotewotICBiZmQgKmFiZmQ7Ci0gIHN0cnVjdCBjb2ZmX29maWxlICp0cmVlOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0gIGNoYXIgKmlucHV0X2ZpbGUgPSBOVUxMOwotICBpbnQgb3B0OwotICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci0gICAgewotICAgICAgeyAiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCcgfSwKLSAgICAgIHsgInZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ1YnIH0sCi0gICAgICB7IE5VTEwsIG5vX2FyZ3VtZW50LCAwLCAwIH0KLSAgICB9OwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICB3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nIChhYywgYXYsICJoViIsIGxvbmdfb3B0aW9ucywKLQkJCSAgICAgKGludCAqKSBOVUxMKSkKLQkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAob3B0KQotCXsKLQljYXNlICdoJzoKLQkgIHNob3dfaGVscCAoKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JY2FzZSAnVic6Ci0JICBwcmludGYgKF8oIkdOVSAlcyB2ZXJzaW9uICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBQUk9HUkFNX1ZFUlNJT04pOwotCSAgZXhpdCAoMCk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCWNhc2UgMDoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBzaG93X3VzYWdlIChzdGRlcnIsIDEpOwotCSAgLypOT1RSRUFDSEVEKi8KLQl9Ci0gICAgfQotCi0gIGlmIChvcHRpbmQgPCBhYykKLSAgICB7Ci0gICAgICBpbnB1dF9maWxlID0gYXZbb3B0aW5kXTsKLSAgICB9Ci0KLSAgaWYgKCFpbnB1dF9maWxlKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVycixfKCIlczogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWRcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUpOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIGFiZmQgPSBiZmRfb3BlbnIgKGlucHV0X2ZpbGUsIDApOwotCi0gIGlmICghYWJmZCkKLSAgICBiZmRfZmF0YWwgKGlucHV0X2ZpbGUpOwotCi0gIGlmICghIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGlucHV0X2ZpbGUpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgdHJlZSA9IGNvZmZfZ3JvayAoYWJmZCk7Ci0KLSAgY29mZl9kdW1wKHRyZWUpOwotICBwcmludGYoIlxuIik7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY29mZmdyb2suYyBiL2JpbnV0aWxzL2NvZmZncm9rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNGU2YzkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvY29mZmdyb2suYworKysgL2Rldi9udWxsCkBAIC0xLDczNyArMCwwIEBACi0vKiBjb2ZmZ3Jvay5jCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIChzYWNAY3lnbnVzLmNvbSkKLQotICAgVGhpcyBtb2R1bGUgcmVhZHMgYSBjb2ZmIGZpbGUgYW5kIGJ1aWxkcyBhIHJlYWxseSBzaW1wbGUgdHlwZSB0cmVlCi0gICB3aGljaCBjYW4gYmUgcmVhZCBieSBvdGhlciBwcm9ncmFtcy4gIFRoZSBmaXJzdCBhcHBsaWNhdGlvbiBpcyBhCi0gICBjb2ZmLT5zeXNyb2ZmIGNvbnZlcnRlci4gIEl0IGNhbiBiZSB0ZXN0ZWQgd2l0aCBjb2ZmZHVtcC5jLgotCi0qLwotCi0jaW5jbHVkZSA8YmZkLmg+Ci0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiLi4vYmZkL2xpYmNvZmYuaCIKLSNpbmNsdWRlICJjb2ZmZ3Jvay5oIgotaW50IGxvZmlsZSA9IDE7Ci1zdGF0aWMgc3RydWN0IGNvZmZfc2NvcGUgKnRvcF9zY29wZTsKLXN0YXRpYyBzdHJ1Y3QgY29mZl9zY29wZSAqZmlsZV9zY29wZTsKLXN0YXRpYyBzdHJ1Y3QgY29mZl9vZmlsZSAqb2ZpbGU7Ci0KLXN0cnVjdCBjb2ZmX3N5bWJvbCAqbGFzdF9mdW5jdGlvbl9zeW1ib2w7Ci1zdHJ1Y3QgY29mZl90eXBlICpsYXN0X2Z1bmN0aW9uX3R5cGU7Ci1zdHJ1Y3QgY29mZl90eXBlICpsYXN0X3N0cnVjdDsKLXN0cnVjdCBjb2ZmX3R5cGUgKmxhc3RfZW51bTsKLXN0cnVjdCBjb2ZmX3NmaWxlICpjdXJfc2ZpbGU7Ci0KLXN0YXRpYyBzdHJ1Y3QgY29mZl9zeW1ib2wgKip0aW5kZXg7Ci0KLQotc3RhdGljIGFzeW1ib2wgKipzeW1zOwotc3RhdGljIGxvbmcgc3ltY291bnQ7Ci0KLSNkZWZpbmUgTih4KSAoKHgpLT5fbi5fbl9ucHRyWzFdKQotCi1zdGF0aWMgc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcmF3c3ltczsKLXN0YXRpYyBpbnQgcmF3Y291bnQ7Ci1zdGF0aWMgYmZkICphYmZkOwotZXh0ZXJuIGNoYXIgKnhjYWxsb2MgKCk7Ci0jZGVmaW5lIFBUUl9TSVpFIAk0Ci0jZGVmaW5lIFNIT1JUX1NJWkUgCTIKLSNkZWZpbmUgSU5UX1NJWkUgCTQKLSNkZWZpbmUgTE9OR19TSVpFIAk0Ci0jZGVmaW5lIEZMT0FUX1NJWkUgCTQKLSNkZWZpbmUgRE9VQkxFX1NJWkUgCTgKLQotI2RlZmluZSBJTkRFWE9GKHApICAoKHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKikocCktKHJhd3N5bXMpKQotCi1zdGF0aWMgc3RydWN0IGNvZmZfc2NvcGUgKgotZW1wdHlfc2NvcGUgKCkKLXsKLSAgc3RydWN0IGNvZmZfc2NvcGUgKmw7Ci0gIGwgPSAoc3RydWN0IGNvZmZfc2NvcGUgKikgKHhjYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfc2NvcGUpLCAxKSk7Ci0gIHJldHVybiBsOwotfQotCi1zdGF0aWMgc3RydWN0IGNvZmZfc3ltYm9sICoKLWVtcHR5X3N5bWJvbCAoKQotewotICByZXR1cm4gKHN0cnVjdCBjb2ZmX3N5bWJvbCAqKSAoeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9zeW1ib2wpLCAxKSk7Ci19Ci0KLS8qaW50IGw7Ki8KLXN0YXRpYyB2b2lkCi1wdXNoX3Njb3BlIChsaW5rKQotICAgICBpbnQgbGluazsKLXsKLSAgc3RydWN0IGNvZmZfc2NvcGUgKm4gPSBlbXB0eV9zY29wZSAoKTsKLSAgaWYgKGxpbmspCi0gICAgewotICAgICAgaWYgKHRvcF9zY29wZSkKLQl7Ci0JICBpZiAodG9wX3Njb3BlLT5saXN0X3RhaWwpCi0JICAgIHsKLQkgICAgICB0b3Bfc2NvcGUtPmxpc3RfdGFpbC0+bmV4dCA9IG47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHRvcF9zY29wZS0+bGlzdF9oZWFkID0gbjsKLQkgICAgfQotCSAgdG9wX3Njb3BlLT5saXN0X3RhaWwgPSBuOwotCX0KLSAgICB9Ci0gIG4tPnBhcmVudCA9IHRvcF9zY29wZTsKLQotICB0b3Bfc2NvcGUgPSBuOwotfQotCi1zdGF0aWMgdm9pZAotcG9wX3Njb3BlICgpCi17Ci0gIHRvcF9zY29wZSA9IHRvcF9zY29wZS0+cGFyZW50OwotfQotCi1zdGF0aWMgdm9pZAotZG9fc2VjdGlvbnNfcDEgKGhlYWQpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpoZWFkOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgaW50IGlkeDsKLSAgc3RydWN0IGNvZmZfc2VjdGlvbiAqYWxsID0gKHN0cnVjdCBjb2ZmX3NlY3Rpb24gKikgKHhjYWxsb2MgKGFiZmQtPnNlY3Rpb25fY291bnQgKyAxLAotCQkJCQkgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbikpKTsKLSAgaGVhZC0+bnNlY3Rpb25zID0gYWJmZC0+c2VjdGlvbl9jb3VudCArIDE7Ci0gIGhlYWQtPnNlY3Rpb25zID0gYWxsOwotCi0gIGZvciAoaWR4ID0gMCwgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCwgaWR4KyspCi0gICAgewotICAgICAgbG9uZyByZWxzaXplOwotICAgICAgaW50IGkgPSBzZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgICBhcmVsZW50ICoqcmVscHA7Ci0gICAgICBsb25nIHJlbGNvdW50OwotCi0gICAgICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjdGlvbik7Ci0gICAgICBpZiAocmVsc2l6ZSA8IDApCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBpZiAocmVsc2l6ZSA9PSAwKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIHJlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotICAgICAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwcCwgc3ltcyk7Ci0gICAgICBpZiAocmVsY291bnQgPCAwKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBoZWFkLT5zZWN0aW9uc1tpXS5uYW1lID0gKGNoYXIgKikgKHNlY3Rpb24tPm5hbWUpOwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0uY29kZSA9IHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREU7Ci0gICAgICBoZWFkLT5zZWN0aW9uc1tpXS5kYXRhID0gc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREFUQTsKLSAgICAgIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIuYnNzIikgPT0gMCkKLQloZWFkLT5zZWN0aW9uc1tpXS5kYXRhID0gMTsKLSAgICAgIGhlYWQtPnNlY3Rpb25zW2ldLmFkZHJlc3MgPSBzZWN0aW9uLT5sbWE7Ci0gICAgICBoZWFkLT5zZWN0aW9uc1tpXS5zaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0ubnVtYmVyID0gaWR4OwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0ubnJlbG9jcyA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0ucmVsb2NzID0KLQkoc3RydWN0IGNvZmZfcmVsb2MgKikgKHhjYWxsb2MgKHNlY3Rpb24tPnJlbG9jX2NvdW50LAotCQkJCQlzaXplb2YgKHN0cnVjdCBjb2ZmX3JlbG9jKSkpOwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0uYmZkX3NlY3Rpb24gPSBzZWN0aW9uOwotICAgIH0KLSAgaGVhZC0+c2VjdGlvbnNbMF0ubmFtZSA9ICJBQlNPTFVURSI7Ci0gIGhlYWQtPnNlY3Rpb25zWzBdLmNvZGUgPSAwOwotICBoZWFkLT5zZWN0aW9uc1swXS5kYXRhID0gMDsKLSAgaGVhZC0+c2VjdGlvbnNbMF0uYWRkcmVzcyA9IDA7Ci0gIGhlYWQtPnNlY3Rpb25zWzBdLnNpemUgPSAwOwotICBoZWFkLT5zZWN0aW9uc1swXS5udW1iZXIgPSAwOwotfQotCi1zdGF0aWMgdm9pZAotZG9fc2VjdGlvbnNfcDIgKGhlYWQpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpoZWFkOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb247IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBqOwotCi0gICAgICBmb3IgKGogPSAwOyBqIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGorKykKLQl7Ci0JICBpbnQgaWR4OwotCSAgaW50IGkgPSBzZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICBzdHJ1Y3QgY29mZl9yZWxvYyAqciA9IGhlYWQtPnNlY3Rpb25zW2ldLnJlbG9jcyArIGo7Ci0JICBhcmVsZW50ICpzciA9IHNlY3Rpb24tPnJlbG9jYXRpb24gKyBqOwotCSAgci0+b2Zmc2V0ID0gc3ItPmFkZHJlc3M7Ci0JICByLT5hZGRlbmQgPSBzci0+YWRkZW5kOwotCSAgaWR4ID0gKChjb2ZmX3N5bWJvbF90eXBlICopIChzci0+c3ltX3B0cl9wdHJbMF0pKS0+bmF0aXZlIC0gcmF3c3ltczsKLQkgIHItPnN5bWJvbCA9IHRpbmRleFtpZHhdOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY29mZl93aGVyZSAqCi1kb193aGVyZSAoaSkKLSAgICAgaW50IGk7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSA9ICZyYXdzeW1zW2ldLnUuc3ltZW50OwotICBzdHJ1Y3QgY29mZl93aGVyZSAqd2hlcmUgPQotICAgIChzdHJ1Y3QgY29mZl93aGVyZSAqKSAoeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl93aGVyZSkpKTsKLSAgd2hlcmUtPm9mZnNldCA9IHN5bS0+bl92YWx1ZTsKLQotICBpZiAoc3ltLT5uX3NjbnVtID09IC0xKQotICAgIHN5bS0+bl9zY251bSA9IDA7Ci0KLSAgc3dpdGNoIChzeW0tPm5fc2NsYXNzKQotICAgIHsKLSAgICBjYXNlIENfRklFTEQ6Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX21lbWJlcl9vZl9zdHJ1Y3Q7Ci0gICAgICB3aGVyZS0+b2Zmc2V0ID0gc3ltLT5uX3ZhbHVlIC8gODsKLSAgICAgIHdoZXJlLT5iaXRvZmZzZXQgPSBzeW0tPm5fdmFsdWUgJSA4OwotICAgICAgd2hlcmUtPmJpdHNpemUgPSByYXdzeW1zW2kgKyAxXS51LmF1eGVudC54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19NT0U6Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX21lbWJlcl9vZl9lbnVtOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX01PUzoKLSAgICBjYXNlIENfTU9VOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX0FVVE86Ci0gICAgY2FzZSBDX0FSRzoKLSAgICAgIHdoZXJlLT53aGVyZSA9IGNvZmZfd2hlcmVfc3RhY2s7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfRVhUOgotICAgIGNhc2UgQ19TVEFUOgotICAgIGNhc2UgQ19FWFRERUY6Ci0gICAgY2FzZSBDX0xBQkVMOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9tZW1vcnk7Ci0gICAgICB3aGVyZS0+c2VjdGlvbiA9ICZvZmlsZS0+c2VjdGlvbnNbc3ltLT5uX3NjbnVtXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19SRUc6Ci0gICAgY2FzZSBDX1JFR1BBUk06Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX3JlZ2lzdGVyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX0VOVEFHOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9lbnRhZzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19TVFJUQUc6Ci0gICAgY2FzZSBDX1VOVEFHOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9zdHJ0YWc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfVFBERUY6Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX3R5cGVkZWY7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiB3aGVyZTsKLX0KLQotc3RhdGljCi1zdHJ1Y3QgY29mZl9saW5lICoKLWRvX2xpbmVzIChpLCBuYW1lKQotICAgICBpbnQgaTsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGNvZmZfbGluZSAqcmVzID0gKHN0cnVjdCBjb2ZmX2xpbmUgKikgeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5lKSwgMSk7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgbDsKLQotICAvKiBGaW5kIG91dCBpZiB0aGlzIGZ1bmN0aW9uIGhhcyBhbnkgbGluZSBudW1iZXJzIGluIHRoZSB0YWJsZSAqLwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgZm9yIChsID0gMDsgbCA8IHMtPmxpbmVub19jb3VudDsgbCsrKQotCXsKLQkgIGlmIChzLT5saW5lbm9bbF0ubGluZV9udW1iZXIgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChyYXdzeW1zICsgaSA9PSAoKGNvZmZfc3ltYm9sX3R5cGUgKikgKCYocy0+bGluZW5vW2xdLnUuc3ltWzBdKSkpLT5uYXRpdmUpCi0JCXsKLQkJICAvKiBUaGVzZSBsaW5lcyBhcmUgZm9yIHRoaXMgZnVuY3Rpb24gLSBzbyBjb3VudCB0aGVtIGFuZCBzdGljayB0aGVtIG9uICovCi0JCSAgaW50IGMgPSAwOwotCQkgIC8qIEZpbmQgdGhlIGxpbmVudW1iZXIgb2YgdGhlIHRvcCBvZiB0aGUgZnVuY3Rpb24sIHNpbmNlIGNvZmYgbGluZW51bWJlcnMKLQkJICAgICBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4gKi8KLQkJICBpbnQgc3RhcnRfbGluZSA9IHJhd3N5bXNbaSArIDNdLnUuYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vOwotCi0JCSAgbCsrOwotCQkgIGZvciAoYyA9IDA7IHMtPmxpbmVub1tsICsgYyArIDFdLmxpbmVfbnVtYmVyOyBjKyspCi0JCSAgICA7Ci0KLQkJICAvKiBBZGQgdHdvIGV4dHJhIHJlY29yZHMsIG9uZSBmb3IgdGhlIHByb2xvZ3VlIGFuZCBvbmUgZm9yIHRoZSBlcGlsb2d1ZSAqLwotCQkgIGMgKz0gMTsKLQkJICByZXMtPm5saW5lcyA9IGM7Ci0JCSAgcmVzLT5saW5lcyA9IChpbnQgKikgKHhjYWxsb2MgKHNpemVvZiAoaW50KSwgYykpOwotCQkgIHJlcy0+YWRkcmVzc2VzID0gKGludCAqKSAoeGNhbGxvYyAoc2l6ZW9mIChpbnQpLCBjKSk7Ci0JCSAgcmVzLT5saW5lc1swXSA9IHN0YXJ0X2xpbmU7Ci0JCSAgcmVzLT5hZGRyZXNzZXNbMF0gPSByYXdzeW1zW2ldLnUuc3ltZW50Lm5fdmFsdWUgLSBzLT52bWE7Ci0JCSAgZm9yIChjID0gMDsgcy0+bGluZW5vW2wgKyBjICsgMV0ubGluZV9udW1iZXI7IGMrKykKLQkJICAgIHsKLQkJICAgICAgcmVzLT5saW5lc1tjICsgMV0gPSBzLT5saW5lbm9bbCArIGNdLmxpbmVfbnVtYmVyICsgc3RhcnRfbGluZSAtIDE7Ci0JCSAgICAgIHJlcy0+YWRkcmVzc2VzW2MgKyAxXSA9IHMtPmxpbmVub1tsICsgY10udS5vZmZzZXQ7Ci0JCSAgICB9Ci0JCSAgcmV0dXJuIHJlczsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljCi1zdHJ1Y3QgY29mZl90eXBlICoKLWRvX3R5cGUgKGkpCi0gICAgIGludCBpOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gPSAmcmF3c3ltc1tpXS51LnN5bWVudDsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXggPSAmcmF3c3ltc1tpICsgMV0udS5hdXhlbnQ7Ci0gIHN0cnVjdCBjb2ZmX3R5cGUgKnJlcyA9Ci0gICAgKHN0cnVjdCBjb2ZmX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl90eXBlKSk7Ci0gIGludCB0eXBlID0gc3ltLT5uX3R5cGU7Ci0gIGludCB3aGljaF9kdCA9IDA7Ci0gIGludCBkaW1pbmQgPSAwOwotCi0gIHJlcy0+dHlwZSA9IGNvZmZfYmFzaWNfdHlwZTsKLSAgcmVzLT51LmJhc2ljID0gdHlwZSAmIDB4ZjsKLQotICBzd2l0Y2ggKHR5cGUgJiAweGYpCi0gICAgewotICAgIGNhc2UgVF9OVUxMOgotICAgIGNhc2UgVF9WT0lEOgotICAgICAgaWYgKHN5bS0+bl9udW1hdXggJiYgc3ltLT5uX3NjbGFzcyA9PSBDX1NUQVQpCi0JewotCSAgLyogVGhpcyBpcyBwcm9iYWJseSBhIHNlY3Rpb24gZGVmaW5pdGlvbiAqLwotCSAgcmVzLT50eXBlID0gY29mZl9zZWNkZWZfdHlwZTsKLQkgIHJlcy0+c2l6ZSA9IGF1eC0+eF9zY24ueF9zY25sZW47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICh0eXBlID09IDApCi0JICAgIHsKLQkgICAgICAvKiBEb24ndCBrbm93IHdoYXQgdGhpcyBpcywgbGV0J3MgbWFrZSBpdCBhIHNpbXBsZSBpbnQgKi8KLQkgICAgICByZXMtPnNpemUgPSBJTlRfU0laRTsKLQkgICAgICByZXMtPnUuYmFzaWMgPSBUX1VJTlQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEVsc2UgaXQgY291bGQgYmUgYSBmdW5jdGlvbiBvciBwb2ludGVyIHRvIHZvaWQgKi8KLQkgICAgICByZXMtPnNpemUgPSAwOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUX1VDSEFSOgotICAgIGNhc2UgVF9DSEFSOgotICAgICAgcmVzLT5zaXplID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9VU0hPUlQ6Ci0gICAgY2FzZSBUX1NIT1JUOgotICAgICAgcmVzLT5zaXplID0gU0hPUlRfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9VSU5UOgotICAgIGNhc2UgVF9JTlQ6Ci0gICAgICByZXMtPnNpemUgPSBJTlRfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9VTE9ORzoKLSAgICBjYXNlIFRfTE9ORzoKLSAgICAgIHJlcy0+c2l6ZSA9IExPTkdfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9GTE9BVDoKLSAgICAgIHJlcy0+c2l6ZSA9IEZMT0FUX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfRE9VQkxFOgotICAgICAgcmVzLT5zaXplID0gRE9VQkxFX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfU1RSVUNUOgotICAgIGNhc2UgVF9VTklPTjoKLSAgICAgIGlmIChzeW0tPm5fbnVtYXV4KQotCXsKLQkgIGlmIChhdXgtPnhfc3ltLnhfdGFnbmR4LnApCi0JICAgIHsKLQkgICAgICAvKiBSZWZlcmluZyB0byBhIHN0cnVjdCBkZWZpbmVkIGVsc2V3aGVyZSAqLwotCSAgICAgIHJlcy0+dHlwZSA9IGNvZmZfc3RydWN0cmVmX3R5cGU7Ci0JICAgICAgcmVzLT51LmFzdHJ1Y3RyZWYucmVmID0gdGluZGV4W0lOREVYT0YgKGF1eC0+eF9zeW0ueF90YWduZHgucCldOwotCSAgICAgIHJlcy0+c2l6ZSA9IHJlcy0+dS5hc3RydWN0cmVmLnJlZiA/Ci0JCXJlcy0+dS5hc3RydWN0cmVmLnJlZi0+dHlwZS0+c2l6ZSA6IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEEgZGVmaW5pdGlvbiBvZiBhIHN0cnVjdCAqLwotCSAgICAgIGxhc3Rfc3RydWN0ID0gcmVzOwotCSAgICAgIHJlcy0+dHlwZSA9IGNvZmZfc3RydWN0ZGVmX3R5cGU7Ci0JICAgICAgcmVzLT51LmFzdHJ1Y3RkZWYuZWxlbWVudHMgPSBlbXB0eV9zY29wZSAoKTsKLQkgICAgICByZXMtPnUuYXN0cnVjdGRlZi5pZHggPSAwOwotCSAgICAgIHJlcy0+dS5hc3RydWN0ZGVmLmlzc3RydWN0ID0gKHR5cGUgJiAweGYpID09IFRfU1RSVUNUOwotCSAgICAgIHJlcy0+c2l6ZSA9IGF1eC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTm8gYXV4ZW50cyAtIGl0J3MgYW5vbnlubW91cyAqLwotCSAgcmVzLT50eXBlID0gY29mZl9zdHJ1Y3RyZWZfdHlwZTsKLQkgIHJlcy0+dS5hc3RydWN0cmVmLnJlZiA9IDA7Ci0JICByZXMtPnNpemUgPSAwOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9FTlVNOgotICAgICAgaWYgKGF1eC0+eF9zeW0ueF90YWduZHgucCkKLQl7Ci0JICAvKiBSZWZlcmluZyB0byBhIGVudW0gZGVmaW5lZCBlbHNld2hlcmUgKi8KLQkgIHJlcy0+dHlwZSA9IGNvZmZfZW51bXJlZl90eXBlOwotCSAgcmVzLT51LmFlbnVtcmVmLnJlZiA9IHRpbmRleFtJTkRFWE9GIChhdXgtPnhfc3ltLnhfdGFnbmR4LnApXTsKLQkgIHJlcy0+c2l6ZSA9IHJlcy0+dS5hZW51bXJlZi5yZWYtPnR5cGUtPnNpemU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEEgZGVmaW5pdGlvbiBvZiBhbiBlbnVtICovCi0JICBsYXN0X2VudW0gPSByZXM7Ci0JICByZXMtPnR5cGUgPSBjb2ZmX2VudW1kZWZfdHlwZTsKLQkgIHJlcy0+dS5hZW51bWRlZi5lbGVtZW50cyA9IGVtcHR5X3Njb3BlICgpOwotCSAgcmVzLT5zaXplID0gYXV4LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfTU9FOgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGZvciAod2hpY2hfZHQgPSA1OyB3aGljaF9kdCA+PSAwOyB3aGljaF9kdC0tKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKHR5cGUgPj4gKCh3aGljaF9kdCAqIDIpICsgNCkpICYgMHgzKQotCXsKLQljYXNlIDA6Ci0JICBicmVhazsKLQljYXNlIERUX0FSWToKLQkgIHsKLQkgICAgc3RydWN0IGNvZmZfdHlwZSAqcHRyID0gKChzdHJ1Y3QgY29mZl90eXBlICopCi0JCQkJICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3R5cGUpKSk7Ci0JICAgIGludCBlbHMgPSAoZGltaW5kIDwgRElNTlVNCi0JCSAgICAgICA/IGF1eC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lbltkaW1pbmRdCi0JCSAgICAgICA6IDApOwotCSAgICArK2RpbWluZDsKLQkgICAgcHRyLT50eXBlID0gY29mZl9hcnJheV90eXBlOwotCSAgICBwdHItPnNpemUgPSBlbHMgKiByZXMtPnNpemU7Ci0JICAgIHB0ci0+dS5hcnJheS5kaW0gPSBlbHM7Ci0JICAgIHB0ci0+dS5hcnJheS5hcnJheV9vZiA9IHJlczsKLQkgICAgcmVzID0gcHRyOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIERUX1BUUjoKLQkgIHsKLQkgICAgc3RydWN0IGNvZmZfdHlwZSAqcHRyID0KLQkgICAgICAoc3RydWN0IGNvZmZfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3R5cGUpKTsKLQkgICAgcHRyLT5zaXplID0gUFRSX1NJWkU7Ci0JICAgIHB0ci0+dHlwZSA9IGNvZmZfcG9pbnRlcl90eXBlOwotCSAgICBwdHItPnUucG9pbnRlci5wb2ludHNfdG8gPSByZXM7Ci0JICAgIHJlcyA9IHB0cjsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSBEVF9GQ046Ci0JICB7Ci0JICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnB0cgotCSAgICAgID0gKHN0cnVjdCBjb2ZmX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl90eXBlKSk7Ci0JICAgIHB0ci0+c2l6ZSA9IDA7Ci0JICAgIHB0ci0+dHlwZSA9IGNvZmZfZnVuY3Rpb25fdHlwZTsKLQkgICAgcHRyLT51LmZ1bmN0aW9uLmZ1bmN0aW9uX3JldHVybnMgPSByZXM7Ci0JICAgIHB0ci0+dS5mdW5jdGlvbi5wYXJhbWV0ZXJzID0gZW1wdHlfc2NvcGUgKCk7Ci0JICAgIHB0ci0+dS5mdW5jdGlvbi5saW5lcyA9IGRvX2xpbmVzIChpLCBzeW0tPl9uLl9uX25wdHJbMV0pOwotCSAgICBwdHItPnUuZnVuY3Rpb24uY29kZSA9IDA7Ci0JICAgIGxhc3RfZnVuY3Rpb25fdHlwZSA9IHB0cjsKLQkgICAgcmVzID0gcHRyOwotCSAgICBicmVhazsKLQkgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgc3RydWN0IGNvZmZfdmlzaWJsZSAqCi1kb192aXNpYmxlIChpKQotICAgICBpbnQgaTsKLXsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltID0gJnJhd3N5bXNbaV0udS5zeW1lbnQ7Ci0gIHN0cnVjdCBjb2ZmX3Zpc2libGUgKnZpc2libGUgPQotICAgIChzdHJ1Y3QgY29mZl92aXNpYmxlICopICh4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3Zpc2libGUpKSk7Ci0gIGVudW0gY29mZl92aXNfdHlwZSB0OwotICBzd2l0Y2ggKHN5bS0+bl9zY2xhc3MpCi0gICAgewotICAgIGNhc2UgQ19NT1M6Ci0gICAgY2FzZSBDX01PVToKLSAgICBjYXNlIENfRklFTEQ6Ci0gICAgICB0ID0gY29mZl92aXNfbWVtYmVyX29mX3N0cnVjdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19NT0U6Ci0gICAgICB0ID0gY29mZl92aXNfbWVtYmVyX29mX2VudW07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19SRUdQQVJNOgotICAgICAgdCA9IGNvZmZfdmlzX3JlZ3BhcmFtOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfUkVHOgotICAgICAgdCA9IGNvZmZfdmlzX3JlZ2lzdGVyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX1NUUlRBRzoKLSAgICBjYXNlIENfVU5UQUc6Ci0gICAgY2FzZSBDX0VOVEFHOgotICAgIGNhc2UgQ19UUERFRjoKLSAgICAgIHQgPSBjb2ZmX3Zpc190YWc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfQVVUT0FSRzoKLSAgICBjYXNlIENfQVJHOgotICAgICAgdCA9IGNvZmZfdmlzX2F1dG9wYXJhbTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19BVVRPOgotCi0KLSAgICAgIHQgPSBjb2ZmX3Zpc19hdXRvOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX0xBQkVMOgotICAgIGNhc2UgQ19TVEFUOgotICAgICAgdCA9IGNvZmZfdmlzX2ludF9kZWY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfRVhUOgotICAgICAgaWYgKHN5bS0+bl9zY251bSA9PSBOX1VOREVGKQotCXsKLQkgIGlmIChzeW0tPm5fdmFsdWUpCi0JICAgIHQgPSBjb2ZmX3Zpc19jb21tb247Ci0JICBlbHNlCi0JICAgIHQgPSBjb2ZmX3Zpc19leHRfcmVmOwotCX0KLSAgICAgIGVsc2UKLQl0ID0gY29mZl92aXNfZXh0X2RlZjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgfQotICB2aXNpYmxlLT50eXBlID0gdDsKLSAgcmV0dXJuIHZpc2libGU7Ci19Ci0KLXN0YXRpYyBpbnQKLWRvX2RlZmluZSAoaSwgYikKLSAgICAgaW50IGk7Ci0gICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpiOwotewotICBzdGF0aWMgaW50IHN5bWJvbF9pbmRleDsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltID0gJnJhd3N5bXNbaV0udS5zeW1lbnQ7Ci0KLSAgLyogRGVmaW5lIGEgc3ltYm9sIGFuZCBhdHRhY2ggdG8gYmxvY2sgYiAqLwotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnMgPSBlbXB0eV9zeW1ib2wgKCk7Ci0KLSAgcy0+bnVtYmVyID0gKytzeW1ib2xfaW5kZXg7Ci0gIHMtPm5hbWUgPSBzeW0tPl9uLl9uX25wdHJbMV07Ci0gIHMtPnNmaWxlID0gY3VyX3NmaWxlOwotICAvKiBHbHVlIG9udG8gdGhlIG9maWxlIGxpc3QgKi8KLSAgaWYgKGxvZmlsZSA+PSAwKQotICAgIHsKLSAgICAgIGlmIChvZmlsZS0+c3ltYm9sX2xpc3RfdGFpbCkKLQlvZmlsZS0+c3ltYm9sX2xpc3RfdGFpbC0+bmV4dF9pbl9vZmlsZV9saXN0ID0gczsKLSAgICAgIGVsc2UKLQlvZmlsZS0+c3ltYm9sX2xpc3RfaGVhZCA9IHM7Ci0gICAgICBvZmlsZS0+c3ltYm9sX2xpc3RfdGFpbCA9IHM7Ci0gICAgICAvKiBBbmQgdGhlIGJsb2NrIGxpc3QgKi8KLSAgICB9Ci0gIGlmIChiLT52YXJzX3RhaWwpCi0gICAgYi0+dmFyc190YWlsLT5uZXh0ID0gczsKLSAgZWxzZQotICAgIGItPnZhcnNfaGVhZCA9IHM7Ci0KLSAgYi0+dmFyc190YWlsID0gczsKLSAgYi0+bnZhcnMrKzsKLSAgcy0+dHlwZSA9IGRvX3R5cGUgKGkpOwotICBzLT53aGVyZSA9IGRvX3doZXJlIChpKTsKLSAgcy0+dmlzaWJsZSA9IGRvX3Zpc2libGUgKGkpOwotCi0gIHRpbmRleFtpXSA9IHM7Ci0KLSAgLyogV2UgcmVtZW1iZXIgdGhlIGxvd2VzdCBhZGRyZXNzIGluIGVhY2ggc2VjdGlvbiBmb3IgZWFjaCBzb3VyY2UgZmlsZSAqLwotCi0gIGlmIChzLT53aGVyZS0+d2hlcmUgPT0gY29mZl93aGVyZV9tZW1vcnkKLSAgICAgICYmIHMtPnR5cGUtPnR5cGUgPT0gY29mZl9zZWNkZWZfdHlwZSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29mZl9pc2VjdGlvbiAqaXMgPSBjdXJfc2ZpbGUtPnNlY3Rpb24gKyBzLT53aGVyZS0+c2VjdGlvbi0+bnVtYmVyOwotCi0gICAgICBpZiAoIWlzLT5pbml0KQotCXsKLQkgIGlzLT5sb3cgPSBzLT53aGVyZS0+b2Zmc2V0OwotCSAgaXMtPmhpZ2ggPSBzLT53aGVyZS0+b2Zmc2V0ICsgcy0+dHlwZS0+c2l6ZTsKLQkgIGlzLT5pbml0ID0gMTsKLQkgIGlzLT5wYXJlbnQgPSBzLT53aGVyZS0+c2VjdGlvbjsKLQl9Ci0KLSAgICB9Ci0KLSAgaWYgKHMtPnR5cGUtPnR5cGUgPT0gY29mZl9mdW5jdGlvbl90eXBlKQotICAgIGxhc3RfZnVuY3Rpb25fc3ltYm9sID0gczsKLQotICByZXR1cm4gaSArIHN5bS0+bl9udW1hdXggKyAxOwotfQotCi0KLXN0YXRpYwotc3RydWN0IGNvZmZfb2ZpbGUgKgotZG9pdCAoKQotewotICBpbnQgaTsKLSAgaW50IGluZmlsZSA9IDA7Ci0gIHN0cnVjdCBjb2ZmX29maWxlICpoZWFkID0KLSAgKHN0cnVjdCBjb2ZmX29maWxlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfb2ZpbGUpKTsKLSAgb2ZpbGUgPSBoZWFkOwotICBoZWFkLT5zb3VyY2VfaGVhZCA9IDA7Ci0gIGhlYWQtPnNvdXJjZV90YWlsID0gMDsKLSAgaGVhZC0+bnNvdXJjZXMgPSAwOwotICBoZWFkLT5zeW1ib2xfbGlzdF90YWlsID0gMDsKLSAgaGVhZC0+c3ltYm9sX2xpc3RfaGVhZCA9IDA7Ci0gIGRvX3NlY3Rpb25zX3AxIChoZWFkKTsKLSAgcHVzaF9zY29wZSAoMSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHJhd2NvdW50OykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gPSAmcmF3c3ltc1tpXS51LnN5bWVudDsKLSAgICAgIHN3aXRjaCAoc3ltLT5uX3NjbGFzcykKLQl7Ci0JY2FzZSBDX0ZJTEU6Ci0JICB7Ci0JICAgIC8qIG5ldyBzb3VyY2UgZmlsZSBhbm5vdW5jZWQgKi8KLQkgICAgc3RydWN0IGNvZmZfc2ZpbGUgKm4gPQotCSAgICAgIChzdHJ1Y3QgY29mZl9zZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3NmaWxlKSk7Ci0JICAgIG4tPnNlY3Rpb24gPSAoc3RydWN0IGNvZmZfaXNlY3Rpb24gKikgeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9pc2VjdGlvbiksIGFiZmQtPnNlY3Rpb25fY291bnQgKyAxKTsKLQkgICAgY3VyX3NmaWxlID0gbjsKLQkgICAgbi0+bmFtZSA9IHN5bS0+X24uX25fbnB0clsxXTsKLQkgICAgbi0+bmV4dCA9IDA7Ci0KLQkgICAgaWYgKGluZmlsZSkKLQkgICAgICB7Ci0JCXBvcF9zY29wZSAoKTsKLQkgICAgICB9Ci0JICAgIGluZmlsZSA9IDE7Ci0JICAgIHB1c2hfc2NvcGUgKDEpOwotCSAgICBmaWxlX3Njb3BlID0gbi0+c2NvcGUgPSB0b3Bfc2NvcGU7Ci0KLQkgICAgaWYgKGhlYWQtPnNvdXJjZV90YWlsKQotCSAgICAgIGhlYWQtPnNvdXJjZV90YWlsLT5uZXh0ID0gbjsKLQkgICAgZWxzZQotCSAgICAgIGhlYWQtPnNvdXJjZV9oZWFkID0gbjsKLQkgICAgaGVhZC0+c291cmNlX3RhaWwgPSBuOwotCSAgICBoZWFkLT5uc291cmNlcysrOwotCSAgICBpICs9IHN5bS0+bl9udW1hdXggKyAxOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDX0ZDTjoKLQkgIHsKLQkgICAgY2hhciAqbmFtZSA9IHN5bS0+X24uX25fbnB0clsxXTsKLQkgICAgaWYgKG5hbWVbMV0gPT0gJ2InKQotCSAgICAgIHsKLQkJLyogRnVuY3Rpb24gc3RhcnQgKi8KLQkJcHVzaF9zY29wZSAoMCk7Ci0JCWxhc3RfZnVuY3Rpb25fdHlwZS0+dS5mdW5jdGlvbi5jb2RlID0gdG9wX3Njb3BlOwotCQl0b3Bfc2NvcGUtPnNlYyA9IG9maWxlLT5zZWN0aW9ucyArIHN5bS0+bl9zY251bTsKLQkJdG9wX3Njb3BlLT5vZmZzZXQgPSBzeW0tPm5fdmFsdWU7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQl0b3Bfc2NvcGUtPnNpemUgPSBzeW0tPm5fdmFsdWUgLSB0b3Bfc2NvcGUtPm9mZnNldCArIDE7Ci0JCXBvcF9zY29wZSAoKTsKLQotCSAgICAgIH0KLQkgICAgaSArPSBzeW0tPm5fbnVtYXV4ICsgMTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBDX0JMT0NLOgotCSAgewotCSAgICBjaGFyICpuYW1lID0gc3ltLT5fbi5fbl9ucHRyWzFdOwotCSAgICBpZiAobmFtZVsxXSA9PSAnYicpCi0JICAgICAgewotCQkvKiBCbG9jayBzdGFydCAqLwotCQlwdXNoX3Njb3BlICgxKTsKLQkJdG9wX3Njb3BlLT5zZWMgPSBvZmlsZS0+c2VjdGlvbnMgKyBzeW0tPm5fc2NudW07Ci0JCXRvcF9zY29wZS0+b2Zmc2V0ID0gc3ltLT5uX3ZhbHVlOwotCi0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQl0b3Bfc2NvcGUtPnNpemUgPSBzeW0tPm5fdmFsdWUgLSB0b3Bfc2NvcGUtPm9mZnNldCArIDE7Ci0JCXBvcF9zY29wZSAoKTsKLQkgICAgICB9Ci0JICAgIGkgKz0gc3ltLT5uX251bWF1eCArIDE7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIENfUkVHUEFSTToKLQljYXNlIENfQVJHOgotCSAgaSA9IGRvX2RlZmluZSAoaSwgbGFzdF9mdW5jdGlvbl9zeW1ib2wtPnR5cGUtPnUuZnVuY3Rpb24ucGFyYW1ldGVycyk7Ci0JICBicmVhazsKLQljYXNlIENfTU9TOgotCWNhc2UgQ19NT1U6Ci0JY2FzZSBDX0ZJRUxEOgotCSAgaSA9IGRvX2RlZmluZSAoaSwgbGFzdF9zdHJ1Y3QtPnUuYXN0cnVjdGRlZi5lbGVtZW50cyk7Ci0JICBicmVhazsKLQljYXNlIENfTU9FOgotCSAgaSA9IGRvX2RlZmluZSAoaSwgbGFzdF9lbnVtLT51LmFlbnVtZGVmLmVsZW1lbnRzKTsKLQkgIGJyZWFrOwotCWNhc2UgQ19TVFJUQUc6Ci0JY2FzZSBDX0VOVEFHOgotCWNhc2UgQ19VTlRBRzoKLQkgIC8qIFZhcmlvdXMgZGVmaW5pdGlvbiAqLwotCSAgaSA9IGRvX2RlZmluZSAoaSwgdG9wX3Njb3BlKTsKLQkgIGJyZWFrOwotCWNhc2UgQ19FWFQ6Ci0JY2FzZSBDX0xBQkVMOgotCSAgaSA9IGRvX2RlZmluZSAoaSwgZmlsZV9zY29wZSk7Ci0JICBicmVhazsKLQljYXNlIENfU1RBVDoKLQljYXNlIENfVFBERUY6Ci0JY2FzZSBDX0FVVE86Ci0JY2FzZSBDX1JFRzoKLQkgIGkgPSBkb19kZWZpbmUgKGksIHRvcF9zY29wZSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBDX0VPUzoKLQkgIGkgKz0gc3ltLT5uX251bWF1eCArIDE7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBkb19zZWN0aW9uc19wMiAoaGVhZCk7Ci0gIHJldHVybiBoZWFkOwotfQotCi1zdHJ1Y3QgY29mZl9vZmlsZSAqCi1jb2ZmX2dyb2sgKGluYWJmZCkKLSAgICAgYmZkICppbmFiZmQ7Ci17Ci0gIGxvbmcgc3RvcmFnZTsKLSAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci0gIGFiZmQgPSBpbmFiZmQ7Ci0gIHN0b3JhZ2UgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0KLSAgaWYgKHN0b3JhZ2UgPCAwKQotICAgIGJmZF9mYXRhbCAoYWJmZC0+ZmlsZW5hbWUpOwotCi0gIHN5bXMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZSk7Ci0gIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIHN5bXMpOwotICBpZiAoc3ltY291bnQgPCAwKQotICAgIGJmZF9mYXRhbCAoYWJmZC0+ZmlsZW5hbWUpOwotICByYXdzeW1zID0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKTsKLSAgcmF3Y291bnQgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7OwotICB0aW5kZXggPSAoc3RydWN0IGNvZmZfc3ltYm9sICoqKSAoeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9zeW1ib2wgKiksIHJhd2NvdW50KSk7Ci0KLSAgcCA9IGRvaXQgKCk7Ci0gIHJldHVybiBwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY29mZmdyb2suaCBiL2JpbnV0aWxzL2NvZmZncm9rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWRlNDIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvY29mZmdyb2suaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0jZGVmaW5lIFRfTlVMTAkJMAotI2RlZmluZSBUX1ZPSUQJCTEJLyogZnVuY3Rpb24gYXJndW1lbnQgKG9ubHkgdXNlZCBieSBjb21waWxlcikgKi8KLSNkZWZpbmUgVF9DSEFSCQkyCS8qIGNoYXJhY3RlcgkJKi8KLSNkZWZpbmUgVF9TSE9SVAkJMwkvKiBzaG9ydCBpbnRlZ2VyCSovCi0jZGVmaW5lIFRfSU5UCQk0CS8qIGludGVnZXIJCSovCi0jZGVmaW5lIFRfTE9ORwkJNQkvKiBsb25nIGludGVnZXIJCSovCi0jZGVmaW5lIFRfRkxPQVQJCTYJLyogZmxvYXRpbmcgcG9pbnQJKi8KLSNkZWZpbmUgVF9ET1VCTEUJNwkvKiBkb3VibGUgd29yZAkJKi8KLSNkZWZpbmUgVF9TVFJVQ1QJOAkvKiBzdHJ1Y3R1cmUgCQkqLwotI2RlZmluZSBUX1VOSU9OCQk5CS8qIHVuaW9uIAkJKi8KLSNkZWZpbmUgVF9FTlVNCQkxMAkvKiBlbnVtZXJhdGlvbiAJCSovCi0jZGVmaW5lIFRfTU9FCQkxMQkvKiBtZW1iZXIgb2YgZW51bWVyYXRpb24qLwotI2RlZmluZSBUX1VDSEFSCQkxMgkvKiB1bnNpZ25lZCBjaGFyYWN0ZXIJKi8KLSNkZWZpbmUgVF9VU0hPUlQJMTMJLyogdW5zaWduZWQgc2hvcnQJKi8KLSNkZWZpbmUgVF9VSU5UCQkxNAkvKiB1bnNpZ25lZCBpbnRlZ2VyCSovCi0jZGVmaW5lIFRfVUxPTkcJCTE1CS8qIHVuc2lnbmVkIGxvbmcJKi8KLSNkZWZpbmUgVF9MTkdEQkwJMTYJLyogbG9uZyBkb3VibGUJCSovCi0KLQotIHN0cnVjdCBjb2ZmX3JlbG9jCi0gewotICAgaW50IG9mZnNldDsKLSAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sOwotICAgaW50IGFkZGVuZDsKLSB9OwotCi0gc3RydWN0IGNvZmZfc2VjdGlvbiAKLSB7Ci0gICBjaGFyICpuYW1lOwotICAgaW50IGNvZGU7Ci0gICBpbnQgZGF0YTsKLSAgIGludCBhZGRyZXNzOwotICAgaW50IG51bWJlcjsgIC8qIDAuLm4sIC50ZXh0ID0gMCAqLwotICAgaW50IG5yZWxvY3M7Ci0gICBpbnQgc2l6ZTsKLSAgIHN0cnVjdCBjb2ZmX3JlbG9jICpyZWxvY3M7Ci0gICBzdHJ1Y3Qgc2VjICpiZmRfc2VjdGlvbjsKLSB9OwotCi1zdHJ1Y3QgY29mZl9vZmlsZQotewotICBpbnQgbnNvdXJjZXM7Ci0gIHN0cnVjdCBjb2ZmX3NmaWxlICpzb3VyY2VfaGVhZDsKLSAgc3RydWN0IGNvZmZfc2ZpbGUgKnNvdXJjZV90YWlsOwotICBpbnQgbnNlY3Rpb25zOwotICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uczsKLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2xfbGlzdF9oZWFkOwotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbF9saXN0X3RhaWw7Ci19OwotCi1zdHJ1Y3QgY29mZl9pc2VjdGlvbiB7Ci0gIGludCBsb3c7Ci0gIGludCBoaWdoOwotICBpbnQgaW5pdDsKLSAgc3RydWN0IGNvZmZfc2VjdGlvbiAqcGFyZW50OwotfTsKLQotc3RydWN0IGNvZmZfc2ZpbGUKLXsKLSAgY2hhciAqbmFtZTsKLSAgc3RydWN0IGNvZmZfc2NvcGUgKnNjb3BlOwotICBzdHJ1Y3QgY29mZl9zZmlsZSAqbmV4dDsKLQotICAvKiBWZWN0b3Igd2hpY2ggbWFwcyB3aGVyZSBpbiBlYWNoIG91dHB1dCBzZWN0aW9uCi0gICAgIHRoZSBpbnB1dCBmaWxlIGhhcyBpdCdzIGRhdGEgKi8KLSAgc3RydWN0IGNvZmZfaXNlY3Rpb24gKnNlY3Rpb247IAotCi19OwotCi0KLSBzdHJ1Y3QgY29mZl90eXBlCi17Ci0gIGludCBzaXplOwotICBlbnVtCi0gICAgewotICAgICAgY29mZl9wb2ludGVyX3R5cGUsIGNvZmZfZnVuY3Rpb25fdHlwZSwgY29mZl9hcnJheV90eXBlLCBjb2ZmX3N0cnVjdGRlZl90eXBlLCBjb2ZmX2Jhc2ljX3R5cGUsCi0gICAgICBjb2ZmX3N0cnVjdHJlZl90eXBlLCBjb2ZmX2VudW1yZWZfdHlwZSwgY29mZl9lbnVtZGVmX3R5cGUsIGNvZmZfc2VjZGVmX3R5cGUKLSAgICAgIH0gdHlwZTsKLSAgdW5pb24KLSAgICB7Ci0gICAgICBzdHJ1Y3QgCi0JewotCWludCBhZGRyZXNzOwotCWludCBzaXplOwotICAgICAgfSBhc2VjZGVmOwotCi0gICAgICBzdHJ1Y3QKLQl7Ci0JICBpbnQgaXNzdHJ1Y3Q7Ci0JICBzdHJ1Y3QgY29mZl9zY29wZSAqZWxlbWVudHM7Ci0JICBpbnQgaWR4OwotCX0KLSAgICAgIGFzdHJ1Y3RkZWY7Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnJlZjsKLQl9IGFzdHJ1Y3RyZWY7Ci0KLSAgICAgIHN0cnVjdAotCXsKLQkgIHN0cnVjdCBjb2ZmX3Njb3BlICplbGVtZW50czsKLQkgIGludCBpZHg7Ci0JfSBhZW51bWRlZjsKLSAgICAgIHN0cnVjdAotCXsKLQkgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqcmVmOwotCX0gYWVudW1yZWY7Ci0KLSAgICAgIHN0cnVjdAotCXsKLQkgIHN0cnVjdCBjb2ZmX3R5cGUgKnBvaW50c190bzsKLQl9IHBvaW50ZXI7Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICBpbnQgZGltOwotCSAgc3RydWN0IGNvZmZfdHlwZSAqYXJyYXlfb2Y7Ci0JfSBhcnJheTsKLQotICAgICAgc3RydWN0Ci0JewotCSAgc3RydWN0IGNvZmZfdHlwZSAqZnVuY3Rpb25fcmV0dXJuczsKLQkgIHN0cnVjdCBjb2ZmX3Njb3BlICpwYXJhbWV0ZXJzOwotCSAgc3RydWN0IGNvZmZfc2NvcGUgKmNvZGU7Ci0JICBzdHJ1Y3QgY29mZl9saW5lICpsaW5lczsKLQl9IGZ1bmN0aW9uOwotICAgICAgaW50IGJhc2ljOwkJLyogT25lIG9mIFRfVk9JRC4uIFRfVUlOVCAqLwotICAgIH0gIHU7Ci19OwotCi0KLSBzdHJ1Y3QgY29mZl9saW5lIAotIHsKLSAgIGludCBubGluZXM7Ci0gICBpbnQgKmxpbmVzOwotICAgaW50ICphZGRyZXNzZXM7Ci0gfTsKLQotCi0gc3RydWN0IGNvZmZfc2NvcGUKLSAgIHsKLSAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjOyAvKiBXaGF0IHNlY3Rpb24gKi8KLSAgICAgaW50IG9mZnNldDsgLyogd2hlcmUgKi8KLSAgICAgaW50IHNpemU7IC8qIEhvdyBiaWcgKi8KLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKnBhcmVudDsJLyogb25lIHVwICovCi0KLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKm5leHQ7CS8qbmV4dCBhbG9uZyAqLwotCi0gICAgIGludCBudmFyczsKLQotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnZhcnNfaGVhZDsJLyogc3ltYm9scyAqLwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnZhcnNfdGFpbDsKLQotICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqbGlzdF9oZWFkOwkvKiBjaGlsZHJlbiAqLwotICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqbGlzdF90YWlsOwotCi0gICB9OwotCi0KLSBzdHJ1Y3QgY29mZl92aXNpYmxlCi0gICB7Ci0gICAgIGVudW0gY29mZl92aXNfdHlwZQotICAgICAgIHsKLQkgY29mZl92aXNfZXh0X2RlZiwKLQkgY29mZl92aXNfZXh0X3JlZiwKLQkgY29mZl92aXNfaW50X2RlZiwKLQkgY29mZl92aXNfY29tbW9uLAotCSBjb2ZmX3Zpc19hdXRvLAotCSBjb2ZmX3Zpc19yZWdpc3RlciwKLQkgY29mZl92aXNfdGFnLAotCSBjb2ZmX3Zpc19tZW1iZXJfb2Zfc3RydWN0LAotCSBjb2ZmX3Zpc19tZW1iZXJfb2ZfZW51bSwKLQkgY29mZl92aXNfYXV0b3BhcmFtLAkKLQkgY29mZl92aXNfcmVncGFyYW0sCi0gICAgICAgfSB0eXBlOwotICAgfTsKLQotIHN0cnVjdCBjb2ZmX3doZXJlCi0gICB7Ci0gICAgIGVudW0KLSAgICAgICB7Ci0JIGNvZmZfd2hlcmVfc3RhY2ssIGNvZmZfd2hlcmVfbWVtb3J5LCBjb2ZmX3doZXJlX3JlZ2lzdGVyLCBjb2ZmX3doZXJlX3Vua25vd24sCi0JIGNvZmZfd2hlcmVfc3RydGFnLCBjb2ZmX3doZXJlX21lbWJlcl9vZl9zdHJ1Y3QsCi0JIGNvZmZfd2hlcmVfbWVtYmVyX29mX2VudW0sIGNvZmZfd2hlcmVfZW50YWcsIGNvZmZfd2hlcmVfdHlwZWRlZgotCi0gICAgICAgfSB3aGVyZTsKLSAgICAgaW50IG9mZnNldDsKLSAgICAgaW50IGJpdG9mZnNldDsKLSAgICAgaW50IGJpdHNpemU7Ci0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb247Ci0gICB9OwotCi0gc3RydWN0IGNvZmZfc3ltYm9sCi0gICB7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCB0YWc7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnR5cGU7Ci0gICAgIHN0cnVjdCBjb2ZmX3doZXJlICp3aGVyZTsKLSAgICAgc3RydWN0IGNvZmZfdmlzaWJsZSAqdmlzaWJsZTsKLSAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpuZXh0OwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKm5leHRfaW5fb2ZpbGVfbGlzdDsgLyogRm9yIHRoZSBvZmlsZSBsaXN0ICovCi0gICAgIGludCBudW1iZXI7Ci0gICAgIGludCBlcl9udW1iZXI7Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgfTsKLQotc3RydWN0IGNvZmZfb2ZpbGUgKmNvZmZfZ3JvaygpOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY29uZmlnLmluIGIvYmludXRpbHMvY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODI3MmRkLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxzeXMvd2FpdC5oPiB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfV0FJVF9ICi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgbGV4IGRlY2xhcmVzIHl5dGV4dCBhcyBhIGNoYXIgKiBieSBkZWZhdWx0LCBub3QgYSBjaGFyW10uICAqLwotI3VuZGVmIFlZVEVYVF9QT0lOVEVSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NVU5NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2JyayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TQlJLCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHV0aW1lcyBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9VVElNRVMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRkNOVExfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0ZJTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQUxVRVNfSAotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBJcyB0aGUgdHlwZSB0aW1lX3QgZGVmaW5lZCBpbiA8dGltZS5oPj8gKi8KLSN1bmRlZiBIQVZFX1RJTUVfVF9JTl9USU1FX0gKLQotLyogSXMgdGhlIHR5cGUgdGltZV90IGRlZmluZWQgaW4gPHN5cy90eXBlcy5oPj8gKi8KLSN1bmRlZiBIQVZFX1RJTUVfVF9JTl9UWVBFU19ICi0KLS8qIERvZXMgPHV0aW1lLmg+IGRlZmluZSBzdHJ1Y3QgdXRpbWJ1Zj8gKi8KLSN1bmRlZiBIQVZFX0dPT0RfVVRJTUVfSAotCi0vKiBEZWZpbmUgaWYgZnByaW50ZiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZQUklOVEYKLQotLyogRGVmaW5lIGlmIHN0cnN0ciBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotCi0vKiBEZWZpbmUgaWYgc2JyayBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLQotLyogRGVmaW5lIGlmIGdldGVudiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVgotCi0vKiBEZWZpbmUgaWYgZW52aXJvbiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04KLQotLyogVXNlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz8gKi8KLSN1bmRlZiBVU0VfQklOQVJZX0ZPUEVOCi0KLS8qIENvbmZpZ3VyZWQgdGFyZ2V0IG5hbWUuICovCi0jdW5kZWYgVEFSR0VUCi0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvbmZpZ3VyZSBiL2JpbnV0aWxzL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTc1YWFlZi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw1NTc2ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmciCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnMiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnkiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPWFyLmMKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGVsc2UKLSAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGZpCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTk0OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLQotaG9zdF9hbGlhcz0kaG9zdAotY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkKLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkgOzsKLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYxNTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjMzOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY2ODogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MjE6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1Ci0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAxPiYyOyBleGl0IDE7IH0KLSAgIGZpCi0KLSAgIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgMT4mMjsgZXhpdCAxOyB9Ci1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Nzc4OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLQotUEFDS0FHRT1iaW51dGlscwotCi1WRVJTSU9OPTIuOS40Ci0KLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3QiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgotRU9GCi0KLQotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODI0OiBjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhY2xvY2FsIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQUNMT0NBTD1hY2xvY2FsCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFDTE9DQUw9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGFjbG9jYWwiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgzNzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0NPTkY9YXV0b2NvbmYKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NTA6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvbWFrZSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9NQUtFPWF1dG9tYWtlCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9NQUtFPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvbWFrZSIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NjM6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9oZWFkZXIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPSEVBREVSPWF1dG9oZWFkZXIKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0hFQURFUj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2hlYWRlciIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODc2OiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBNQUtFSU5GTz1tYWtlaW5mbwotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3NoYXJlZD15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3N0YXRpYz15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTYyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5OTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDczOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTA1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxMTE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEyMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTQ3OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE1MjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE2MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTgwOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCBvciAtLXdpdGhvdXQtZ251LWxkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfZ251X2xkIgotICB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKLWVsc2UKLSAgd2l0aF9nbnVfbGQ9bm8KLWZpCi0KLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIyMzogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjQ3OiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLWVsc2UKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNTA6IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9MRCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maQotZmkKLQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExEIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLXRlc3QgLXogIiRMRCIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjg2OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nbnVfbGQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ251X2xkIiAxPiY2Ci0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzAyOiBjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTk0nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpCi1maQotCi1OTT0iJGFjX2N2X3BhdGhfTk0iCi1lY2hvICIkYWNfdCIiJE5NIiAxPiY2Ci0KLQotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLWVjaG8gJGFjX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM0MDogY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIHtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspfQotCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1hY19zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLWFjX3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLWFjX3N5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgYWNfc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KikKLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikKLSAgYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIDs7Ci1pcml4KikKLSAgYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBhY19zeW1jb2RlPSdbQkRUXScKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi1maQotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLiogCVwoJGFjX3N5bWNvZGVcKSAJIAkqXCgkYWNfc3ltcHJmeFwpJGFjX3N5bXBhdCQvJGFjX3N5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIGFjX3BpcGVfd29ya3M9bm8KLSAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQwMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIAotICAgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQwNzogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLQotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRhY19ubGlzdCIgfCB1bmlxID4gIiRhY19ubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRhY19ubGlzdCJUICIkYWNfbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRhY19ubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jJwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQotewotRU9GCi0Jc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jCi0JY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdG0uJGFjX29iamV4dAotCSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRlc3RtLiRhY19vYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDU5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgYWNfcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLQkgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0JICBmaQotCSAgTElCUz0iJGFjX3NhdmVfTElCUyIKLQkgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotCWVsc2UKLQkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJGFjX25saXN0IiA+JjUKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRhY19waXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGlmIHRlc3QgeCIkYWNfc3ltcHJmeCIgPSB4Il8iOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi0gICAgZmkKLSAgICBicmVhawotICBlbHNlCi0gICAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLQotZmkKLQotCi1hY19yZXN1bHQ9eWVzCi1pZiB0ZXN0IC16ICIkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgIGFjX3Jlc3VsdD1ubwotZmkKLWVjaG8gIiRhY190IiIkYWNfcmVzdWx0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTA1OiBjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi12b2lkIG5tX3Rlc3RfZnVuYygpe30KLWludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTE0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICBhY19ubGlzdD1jb25mdGVzdC5ubQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MTc6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0gICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgotICAgIGlmIGVncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgaWYgZWdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC5jID4mNQotZmkKLXJtIC1yZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUiIDE+JjYKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRT0ke2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ub30KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU0MzogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MTl9TJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3RkYXRhCi1pZiBsbiAtcyBYIGNvbmZ0ZXN0ZGF0YSAyPi9kZXYvbnVsbAotdGhlbgotICBybSAtZiBjb25mdGVzdGRhdGEKLSAgYWNfY3ZfcHJvZ19MTl9TPSJsbiAtcyIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19MTl9TPWxuCi1maQotZmkKLUxOX1M9IiRhY19jdl9wcm9nX0xOX1MiCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19MTl9TIiA9ICJsbiAtcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnI2xpbmUgMTU4NSAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU4NjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjA3OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9jY19uZWVkc19iZWxmJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTYxMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYxOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9jY19uZWVkc19iZWxmIiAxPiY2Ci0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NDI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjc0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSJkbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIiAmJiBhY19jdl9wcm9nX0RMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iJHthY190b29sX3ByZWZpeH1hcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc0MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSJhcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiICYmIGFjX2N2X3Byb2dfQVM9ImZhbHNlIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIEFTPSJmYWxzZSIKLWZpCi1maQotCi0KLSAgOzsKLQotZXNhYwotCi0jIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayBvciAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbGlidG9vbF9sb2NrIgotICBuZWVkX2xvY2tzPSRlbmFibGV2YWwKLWVsc2UKLSAgbmVlZF9sb2Nrcz15ZXMKLWZpCi0KLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi0KLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAotfHwgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWQiIDE+JjI7IGV4aXQgMTsgfQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRhcmdldHMgb3IgLS1kaXNhYmxlLXRhcmdldHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfdGFyZ2V0cytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfdGFyZ2V0cyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJyIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjCi1maQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiBvciAtLWRpc2FibGUtY29tbW9uYmZkbGliIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2NvbW1vbmJmZGxpYitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfY29tbW9uYmZkbGliIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgY29tbW9uYmZkbGliPXRydWUgOzsKLSAgbm8pICBjb21tb25iZmRsaWI9ZmFsc2UgOzsKLSAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIEJGRCBjb21tb25iZmRsaWIgb3B0aW9uIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLWZpCi0KLQotCi0KLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWlmIHRlc3QgLXogIiRob3N0IiA7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFVucmVjb2duaXplZCBob3N0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTA2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTM2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk4NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAxOTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMjAzMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwMzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA2MTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNjY6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNzU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA5NDogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotCi1mb3IgYWNfcHJvZyBpbiAnYmlzb24gLXknIGJ5YWNjCi1kbwotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEzMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1lBQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ZQUNDPSIkWUFDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfWUFDQz0iJGFjX3Byb2ciCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLVlBQ0M9IiRhY19jdl9wcm9nX1lBQ0MiCi1pZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRZQUNDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotdGVzdCAtbiAiJFlBQ0MiICYmIGJyZWFrCi1kb25lCi10ZXN0IC1uICIkWUFDQyIgfHwgWUFDQz0ieWFjYyIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNjI6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE3NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE4MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE5NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIwMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIxMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIxNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZm9yIGFjX3Byb2cgaW4gZmxleCBsZXgKLWRvCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjQ3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTEVYJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19MRVg9IiRMRVgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0xFWD0iJGFjX3Byb2ciCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUxFWD0iJGFjX2N2X3Byb2dfTEVYIgotaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRVgiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi10ZXN0IC1uICIkTEVYIiAmJiBicmVhawotZG9uZQotdGVzdCAtbiAiJExFWCIgfHwgTEVYPSIiJG1pc3NpbmdfZGlyL21pc3NpbmcgZmxleCIiCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZmxleCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZmxleDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjgwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTEVYJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19MRVg9IiRMRVgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0xFWD0iZmxleCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfTEVYIiAmJiBhY19jdl9wcm9nX0xFWD0ibGV4IgotZmkKLWZpCi1MRVg9IiRhY19jdl9wcm9nX0xFWCIKLWlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEVYIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJExFWExJQiIKLXRoZW4KLSAgY2FzZSAiJExFWCIgaW4KLSAgZmxleCopIGFjX2xpYj1mbCA7OwotICAqKSBhY19saWI9bCA7OwotICBlc2FjCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzE0OiBjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIgPiY1Ci1hY19saWJfdmFyPWBlY2hvICRhY19saWInXyd5eXdyYXAgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sJGFjX2xpYiAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgeXl3cmFwKCk7Ci0KLWludCBtYWluKCkgewoteXl3cmFwKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzMzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMRVhMSUI9Ii1sJGFjX2xpYiIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBsZXggb3V0cHV0IGZpbGUgcm9vdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM1NjogY2hlY2tpbmcgbGV4IG91dHB1dCBmaWxlIHJvb3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbGV4X3Jvb3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZSBtaW5pbWFsIGxleCBwcm9ncmFtIGlzIGp1c3QgYSBzaW5nbGUgbGluZTogJSUuICBCdXQgc29tZSBicm9rZW4gbGV4ZXMKLSMgKFNvbGFyaXMsIEkgdGhpbmsgaXQgd2FzKSB3YW50IHR3byAlJSBsaW5lcywgc28gYWNjb21tb2RhdGUgdGhlbS4KLWVjaG8gJyUlCi0lJScgfCAkTEVYCi1pZiB0ZXN0IC1mIGxleC55eS5jOyB0aGVuCi0gIGFjX2N2X3Byb2dfbGV4X3Jvb3Q9bGV4Lnl5Ci1lbGlmIHRlc3QgLWYgbGV4eXkuYzsgdGhlbgotICBhY19jdl9wcm9nX2xleF9yb290PWxleHl5Ci1lbHNlCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2Fubm90IGZpbmQgb3V0cHV0IGZyb20gJExFWDsgZ2l2aW5nIHVwIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfbGV4X3Jvb3QiIDE+JjYKLUxFWF9PVVRQVVRfUk9PVD0kYWNfY3ZfcHJvZ19sZXhfcm9vdAotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHl5dGV4dCBpcyBhIHBvaW50ZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNzc6IGNoZWNraW5nIHdoZXRoZXIgeXl0ZXh0IGlzIGEgcG9pbnRlciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFBPU0lYIHNheXMgbGV4IGNhbiBkZWNsYXJlIHl5dGV4dCBlaXRoZXIgYXMgYSBwb2ludGVyIG9yIGFuIGFycmF5OyB0aGUKLSMgZGVmYXVsdCBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuIEZpZ3VyZSBvdXQgd2hpY2ggaXQgaXMsIHNpbmNlCi0jIG5vdCBhbGwgaW1wbGVtZW50YXRpb25zIHByb3ZpZGUgdGhlICVwb2ludGVyIGFuZCAlYXJyYXkgZGVjbGFyYXRpb25zLgotYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXI9bm8KLWVjaG8gJ2V4dGVybiBjaGFyICp5eXRleHQ7JyA+PiRMRVhfT1VUUFVUX1JPT1QuYwotYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9IiRMSUJTICRMRVhMSUIiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzg5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWBjYXQgJExFWF9PVVRQVVRfUk9PVC5jYAotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotcm0gLWYgIiR7TEVYX09VVFBVVF9ST09UfS5jIgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlciA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgWVlURVhUX1BPSU5URVIgMQotRU9GCi0KLWZpCi0KLQotQUxMX0xJTkdVQVM9Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQyMDogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ0MTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ0NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ1NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDcxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0ODkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUxMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTIxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NDU6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU1MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTk5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2MjA6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjYyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2MzQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjYwOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjY1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2OTM6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjY5OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcyODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3MzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc0MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3NjE6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjc2NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzk0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjgyNjogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4MzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODU2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODYxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4ODQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjkxMTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5MTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjkzODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTYzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk2OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk3MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDAyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDA3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwNTU6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwNjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjMxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIzNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI0MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyNzE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyNzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI5OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzMyODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzMzMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzU2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RQQ1BZIDEKLUVPRgotCi0gICBmaQotCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzOTA6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM5NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiBMQ19NRVNTQUdFUwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotRU9GCi0KLSAgICBmaQotICBmaQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDIzOiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCi0gIFVTRV9OTFM9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTkxTPXllcwotZmkKLQotICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgotICAgIAotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEVOQUJMRV9OTFMgMQotRU9GCi0KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NDM6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKLWVsc2UKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubwotZmkKLQotICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2Ci0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ2MjogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQ2NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDcyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ4OTogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDk0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTAxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1MTc6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1saW50bCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTI1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZHRleHRkb21haW4oKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kdGV4dGRvbWFpbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzUzNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzU1MjogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTU3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU2NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dFVFRFWFQgMQotRU9GCi0KLQkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1OTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2MjY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2MzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzY1NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY4MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3MTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzc0OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc1NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmUKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCSAgICAgICAgCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3ODk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODIzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg1OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgICAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk0OTogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKLSAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk3NzogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzk4MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTg3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbXNnZm9ybWF0PWxpbnV4Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotbXNnZm9ybWF0PXhvcGVuCi1maQotCi0KLQkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIAotICAgCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIAotCi0gICAgICBsPQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwNTA6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiA+JjUKLSAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi1maQotCi0gIGVjaG8gIiRhY190IiIkVVNFX01BSU5UQUlORVJfTU9ERSIgMT4mNgotICAKLQotaWYgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllczsgdGhlbgotICBNQUlOVEFJTkVSX01PREVfVFJVRT0KLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPScjJwotZWxzZQotICBNQUlOVEFJTkVSX01PREVfVFJVRT0nIycKLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPQotZmkKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDczOiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MDc4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLSNpZm5kZWYgX19DWUdXSU5fXwotI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotI2VuZGlmCi1yZXR1cm4gX19DWUdXSU5fXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDg5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTA2OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQxMTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTE4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKLU1JTkdXMzI9Ci10ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxMzc6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxNDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLSMgaG9zdC1zcGVjaWZpYyBzdHVmZjoKLQotSERFRklORVM9Ci0KLS4gJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaG9zdAotCi0KLUFSPSR7QVItYXJ9Ci0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDE4MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDIxOTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi0jIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0IC16ICIkQ0NfRk9SX0JVSUxEIjsgdGhlbgotICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICAgIENDX0ZPUl9CVUlMRD0nJChDQyknCi0gIGVsc2UKLSAgICBDQ19GT1JfQlVJTEQ9Z2NjCi0gIGZpCi1maQotCi0jIEFsc28gc2V0IEVYRUVYVF9GT1JfQlVJTEQuCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICBFWEVFWFRfRk9SX0JVSUxEPSckKEVYRUVYVCknCi1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBidWlsZCBzeXN0ZW0gZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyODY6IGNoZWNraW5nIGZvciBidWlsZCBzeXN0ZW0gZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9idWlsZF9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBhY19jX3Rlc3QuYyA8PCAnRU9GJwotaW50IG1haW4oKSB7Ci0vKiBOb3RoaW5nIG5lZWRlZCBoZXJlICovCi19Ci1FT0YKLSAgICAke0NDX0ZPUl9CVUlMRH0gLW8gYWNfY190ZXN0IGFtX2NfdGVzdC5jIDE+JjUgMj4mNQotICAgIGJmZF9jdl9idWlsZF9leGVleHQ9YGVjaG8gYWNfY190ZXN0LiogfCBncmVwIC12IGFjX2NfdGVzdC5jIHwgc2VkIC1lIHMvYWNfY190ZXN0Ly9gCi0gICAgcm0gLWYgYWNfY190ZXN0KgotICAgIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiA9IHggJiYgYmZkX2N2X2J1aWxkX2V4ZWV4dD1ubwotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfYnVpbGRfZXhlZXh0IiAxPiY2Ci0gIEVYRUVYVF9GT1JfQlVJTEQ9IiIKLSAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFRfRk9SX0JVSUxEPSR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0KLWZpCi0KLQotZm9yIGFjX2hkciBpbiBzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggdW5pc3RkLmggZmNudGwuaCBzeXMvZmlsZS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDMxMTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQzMTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQzMjE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDM0ODogY2hlY2tpbmcgZm9yIHN5cy93YWl0LmggdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zeXNfd2FpdF9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDM1MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpZm5kZWYgV0VYSVRTVEFUVVMKLSNkZWZpbmUgV0VYSVRTVEFUVVMoc3RhdF92YWwpICgodW5zaWduZWQpKHN0YXRfdmFsKSA+PiA4KQotI2VuZGlmCi0jaWZuZGVmIFdJRkVYSVRFRAotI2RlZmluZSBXSUZFWElURUQoc3RhdF92YWwpICgoKHN0YXRfdmFsKSAmIDI1NSkgPT0gMCkKLSNlbmRpZgotaW50IG1haW4oKSB7Ci1pbnQgczsKLXdhaXQgKCZzKTsKLXMgPSBXSUZFWElURUQgKHMpID8gV0VYSVRTVEFUVVMgKHMpIDogMTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzY5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N5c193YWl0X2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfV0FJVF9IIDEKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzkyOiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDM5NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDQyNTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDMwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0NTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDkwOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQ5NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1MjA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ1MjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDU0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTc1OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDU4MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2Z1bmMgaW4gc2JyayB1dGltZXMKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2MjY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ2MzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDY1NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgdGltZV90IGluIHRpbWUuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDY4MDogY2hlY2tpbmcgZm9yIHRpbWVfdCBpbiB0aW1lLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2J1X2N2X2RlY2xfdGltZV90X3RpbWVfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ2ODUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHRpbWUuaD4KLWludCBtYWluKCkgewotdGltZV90IGk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDY5MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJ1X2N2X2RlY2xfdGltZV90X3RpbWVfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJ1X2N2X2RlY2xfdGltZV90X3RpbWVfaCIgMT4mNgotaWYgdGVzdCAkYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1RJTUVfVF9JTl9USU1FX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0aW1lX3QgaW4gc3lzL3R5cGVzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ3MTM6IGNoZWNraW5nIGZvciB0aW1lX3QgaW4gc3lzL3R5cGVzLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2J1X2N2X2RlY2xfdGltZV90X3R5cGVzX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NzE4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLWludCBtYWluKCkgewotdGltZV90IGk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDcyNTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaCIgMT4mNgotaWYgdGVzdCAkYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9USU1FX1RfSU5fVFlQRVNfSCAxCi1FT0YKLQotZmkKLQotIyBVbmRlciBOZXh0IDMuMiA8dXRpbWUuaD4gYXBwYXJlbnRseSBkb2VzIG5vdCBkZWZpbmUgc3RydWN0IHV0aW1idWYKLSMgYnkgZGVmYXVsdC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB1dGltZS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzQ4OiBjaGVja2luZyBmb3IgdXRpbWUuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYnVfY3ZfaGVhZGVyX3V0aW1lX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NzUzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1RJTUVfSAotI2luY2x1ZGUgPHRpbWUuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHV0aW1lLmg+Ci1pbnQgbWFpbigpIHsKLXN0cnVjdCB1dGltYnVmIHM7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDc2NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJ1X2N2X2hlYWRlcl91dGltZV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBidV9jdl9oZWFkZXJfdXRpbWVfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRidV9jdl9oZWFkZXJfdXRpbWVfaCIgMT4mNgotaWYgdGVzdCAkYnVfY3ZfaGVhZGVyX3V0aW1lX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR09PRF9VVElNRV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGZwcmludGYgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDc4NTogY2hlY2tpbmcgd2hldGhlciBmcHJpbnRmIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9mcHJpbnRmJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDc5MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBmcHJpbnRmCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDgxMTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9mcHJpbnRmPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9mcHJpbnRmPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZnByaW50ZiIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2ZwcmludGYgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRlBSSU5URiAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdHJzdHIgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDgzMjogY2hlY2tpbmcgd2hldGhlciBzdHJzdHIgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4MzcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc3Ryc3RyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDg1ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHI9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0ciIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0ciA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc2JyayBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0ODc5OiBjaGVja2luZyB3aGV0aGVyIHNicmsgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX3NicmsnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0ODg0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHNicmsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTA1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3Nicms9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3Nicms9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfc2JyayA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9TQlJLIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0OTI2OiBjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDkzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBnZXRlbnYKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTUyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52PXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52IiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52ID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOViAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBlbnZpcm9uIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5NzM6IGNoZWNraW5nIHdoZXRoZXIgZW52aXJvbiBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ5NzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgZW52aXJvbgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5OTk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbj15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24iIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04gMQotRU9GCi0KLWZpCi0KLQotCi1jYXNlICIke2hvc3R9IiBpbgotKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MpCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBVU0VfQklOQVJZX0ZPUEVOIDEKLUVPRgotIDs7Ci1lc2FjCi0KLSMgdGFyZ2V0LXNwZWNpZmljIHN0dWZmOgotCi0jIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyI7IHRoZW4KLSAgICBmb3IgdGFyZyBpbiBgZWNobyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYAotICAgIGRvCi0JcmVzdWx0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZyAyPi9kZXYvbnVsbGAKLQlpZiB0ZXN0IC1uICIkcmVzdWx0IjsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotQlVJTERfTkxNQ09OVj0KLU5MTUNPTlZfREVGUz0KLUJVSUxEX1NSQ09OVj0KLUJVSUxEX0RMTFRPT0w9Ci1ETExUT09MX0RFRlM9Ci1CVUlMRF9XSU5EUkVTPQotQlVJTERfRExMV1JBUD0KLUJVSUxEX01JU0M9Ci0KLWZvciB0YXJnIGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMKLWRvCi0gICAgaWYgdGVzdCAieCR0YXJnIiA9ICJ4YWxsIjsgdGhlbgotICAgICAgICBhbGxfdGFyZ2V0cz10cnVlCi0JQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCUJVSUxEX1NSQ09OVj0nJChTUkNPTlZfUFJPRyknCi0JTkxNQ09OVl9ERUZTPSItRE5MTUNPTlZfSTM4NiAtRE5MTUNPTlZfQUxQSEEgLUROTE1DT05WX1BPV0VSUEMgLUROTE1DT05WX1NQQVJDIgotICAgIGVsc2UKLQljYXNlICR0YXJnIGluCi0JaVszNDU2XTg2Ki0qLW5ldHdhcmUqKSAKLQkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfSTM4NiIKLQkgIDs7Ci0JYWxwaGEqLSotbmV0d2FyZSopCi0JICBCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JICBOTE1DT05WX0RFRlM9IiROTE1DT05WX0RFRlMgLUROTE1DT05WX0FMUEhBIgotCSAgOzsKLQlwb3dlcnBjKi0qLW5ldHdhcmUqKQotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9QT1dFUlBDIgotCSAgOzsKLQlzcGFyYyotKi1uZXR3YXJlKikKLQkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfU1BBUkMiCi0JICA7OwotCWVzYWMKLQljYXNlICR0YXJnIGluCi0JKi0qLWhtcyopIEJVSUxEX1NSQ09OVj0nJChTUkNPTlZfUFJPRyknIDs7Ci0JZXNhYwotCWNhc2UgJHRhcmcgaW4KLQlhcm0tKnBlKikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9BUk0iCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JIDs7Ci0JdGh1bWItKnBlKikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9BUk0iCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JIDs7Ci0JaVszLTZdODYtKnBlKiB8IGlbMy02XTg2LSotY3lnd2luKiB8IGlbMy02XTg2LSotbWluZ3czMiopCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfSTM4NiIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgIEJVSUxEX0RMTFdSQVA9JyQoRExMV1JBUF9QUk9HKSQoRVhFRVhUKScKLQkgOzsKLQlwb3dlcnBjKi0qLSpwZSogfCBwb3dlcnBjKi0qLWN5Z3dpbiopCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfUFBDIgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSA7OwotCW1jb3JlLSpwZSkKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9NQ09SRSIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgOzsKLQltY29yZS0qZWxmKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX01DT1JFX0VMRiIKLQkgOzsKLQllc2FjCi0gICAgZmkKLWRvbmUKLQotCi0KLQotCi0KLQotCi0KLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVEFSR0VUICIke3RhcmdldH0iCi1FT0YKLQotCi10YXJnPSR0YXJnZXQKLS4gJHNyY2Rpci8uLi9iZmQvY29uZmlnLmJmZAotaWYgdGVzdCAieCR0YXJnX3VuZGVyc2NvcmUiID0gInh5ZXMiOyB0aGVuCi0gICAgVU5ERVJTQ09SRT0xCi1lbHNlCi0gICAgVU5ERVJTQ09SRT0wCi1maQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKLXMlQFZFUlNJT05AJSRWRVJTSU9OJWcKLXMlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKLXMlQEFVVE9DT05GQCUkQVVUT0NPTkYlZwotcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCi1zJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCi1zJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQENDQCUkQ0MlZwotcyVATERAJSRMRCVnCi1zJUBOTUAlJE5NJWcKLXMlQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAlJFVTRV9TWU1CT0xfVU5ERVJTQ09SRSVnCi1zJUBMTl9TQCUkTE5fUyVnCi1zJUBETExUT09MQCUkRExMVE9PTCVnCi1zJUBBU0AlJEFTJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQFlBQ0NAJSRZQUNDJWcKLXMlQExFWEAlJExFWCVnCi1zJUBMRVhMSUJAJSRMRVhMSUIlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQExFWF9PVVRQVVRfUk9PVEAlJExFWF9PVVRQVVRfUk9PVCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBNQUlOVEFJTkVSX01PREVfVFJVRUAlJE1BSU5UQUlORVJfTU9ERV9UUlVFJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9GQUxTRUAlJE1BSU5UQUlORVJfTU9ERV9GQUxTRSVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi1zJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKLXMlQEFSQCUkQVIlZwotcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKLXMlQEVYRUVYVF9GT1JfQlVJTERAJSRFWEVFWFRfRk9SX0JVSUxEJWcKLXMlQE5MTUNPTlZfREVGU0AlJE5MTUNPTlZfREVGUyVnCi1zJUBCVUlMRF9OTE1DT05WQCUkQlVJTERfTkxNQ09OViVnCi1zJUBCVUlMRF9TUkNPTlZAJSRCVUlMRF9TUkNPTlYlZwotcyVAQlVJTERfRExMVE9PTEAlJEJVSUxEX0RMTFRPT0wlZwotcyVARExMVE9PTF9ERUZTQCUkRExMVE9PTF9ERUZTJWcKLXMlQEJVSUxEX1dJTkRSRVNAJSRCVUlMRF9XSU5EUkVTJWcKLXMlQEJVSUxEX0RMTFdSQVBAJSRCVUlMRF9ETExXUkFQJWcKLXMlQEJVSUxEX01JU0NAJSRCVUlMRF9NSVNDJWcKLXMlQFVOREVSU0NPUkVAJSRVTkRFUlNDT1JFJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotCi1jYXNlICJ4JENPTkZJR19GSUxFUyIgaW4KLSopIHNlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZSA7OwotZXNhYwotCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY29uZmlndXJlLmJhdCBiL2JpbnV0aWxzL2NvbmZpZ3VyZS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3ZDcwZjEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvY29uZmlndXJlLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLUBlY2hvIG9mZg0KLWlmICIlMSIgPT0gImg4LzMwMCIgZ290byBoODMwMA0KLQ0KLWVjaG8gQ29uZmlndXJpbmcgYmludXRpbHMgZm9yIGdvMzINCi11cGRhdGUgLi4vYmZkL2hvc3RzL2dvMzIuaCBzeXNkZXAuaA0KLWdvdG8gY29tbW9uDQotDQotOmg4MzAwDQotZWNobyBDb25maWd1cmluZyBiaW51dGlscyBmb3IgSDgvMzAwDQotdXBkYXRlIC4uXGJmZFxob3N0c1xoLWdvMzIuaCBzeXNkZXAuaA0KLQ0KLTpjb21tb24NCi0NCi1lY2hvICMgTWFrZWZpbGUgZ2VuZXJhdGVkIGJ5ICJjb25maWd1cmUuYmF0Ij4gTWFrZWZpbGUNCi0NCi1pZiBleGlzdCBjb25maWcuc2VkIGRlbCBjb25maWcuc2VkDQotDQotc2VkIC1uICIvXlZFUlNJT049LyBwIiBNYWtlZmlsZS5pbiB8IHNlZCAtZSAicy9eL3NeLyIgLWUgInMvPS9eXCIvIiAtZSAicy8kL1wiXi8iID4gY29uZmlnLnNlZA0KLXNlZCAtZiBjb25maWcuc2VkIHZlcnNpb24uYyA+IHZlcnNpb24yLmMNCi0NCi1pZiBleGlzdCBjb25maWcuc2VkIGRlbCBjb25maWcuc2VkDQotDQotZWNobyAicy92ZXJzaW9uXC4vdmVyc2lvbjJcLi9nCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy8tRFZFUlNJT049W14gXSogLy8JCQkJIj4+IGNvbmZpZy5zZWQNCi0NCi1lY2hvICJzL14JXCQoc3JjZGlyKVwvbW92ZS1pZi1jaGFuZ2UvCXVwZGF0ZS8JIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIvXiMjIyQvIGlcCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIkNDID0gZ2NjCQkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzLzpcKFteIAldXCkvOiBcMS9nCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9eCVwgKlwuXC8vCWdvMzIgLwkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9gZWNobyBcJChzcmNkaXIpXC8vL2cJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzLyB8IHNlZCAncyxcXlxcXC5cLywsJ2AvL2cJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvXgljZCBcJChzcmNkaXIpWyAJXSo7Ly8JCQkiPj4gY29uZmlnLnNlZA0KLQ0KLWVjaG8gIi9eYXJwYXJzZVwuYy8gaVwJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiYXJwYXJzZS5vOiBhcnBhcnNlLmNcCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKElOQ0xVREVTKSAkKEhERUZJTkVTKSAkKFRERUZJTkVTKSBhcnBhcnNlLmMgIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIvXCQoQklTT04pLyBjXAkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIJYmlzb24gJChCSVNPTkZMQUdTKSAtbyAkQCBhcnBhcnNlLnkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiL3lcLnRhYlwuLyBkCQkJCQkiPj4gY29uZmlnLnNlZA0KLQ0KLWVjaG8gIi9eYXJsZXguYy8gewkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIgaVwJCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gImFybGV4Lm86IGFybGV4LmMJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiIGlcCQkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIJJChDQykgLWMgJChDRkxBR1MpICQoSU5DTFVERVMpICQoSERFRklORVMpICQoVERFRklORVMpIGFybGV4LmMgIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJ9CQkJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiL1wkKExFWCkvIGNcCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIglmbGV4ICQoTEVYX09QVElPTlMpIGFybGV4LmwJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvbGV4XC55eVwuL2xleHl5Li9nCQkJCSI+PiBjb25maWcuc2VkDQotDQotZWNobyAicy8nIi9cXCIvZwkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzLyInL1xcIi9nCQkJCQkiPj4gY29uZmlnLnNlZA0KLQ0KLWVjaG8gInMvYysrZmlsdC9jeHhmaWx0L2cJCQkJIj4+IGNvbmZpZy5zZWQNCi0NCi1zZWQgLWUgInMvXlwiLy8iIC1lICJzL1wiJC8vIiAtZSAicy9bIAldKiQvLyIgY29uZmlnLnNlZCA+IGNvbmZpZzIuc2VkDQotc2VkIC1mIGNvbmZpZzIuc2VkIE1ha2VmaWxlLmluID4+IE1ha2VmaWxlDQotZGVsIGNvbmZpZy5zZWQNCi1kZWwgY29uZmlnMi5zZWQNCi0NCi1lY2hvIGludCBwcmVwZW5kc191bmRlcnNjb3JlID0gMTsgPiB1bmRlcnNjb3JlLmMNCi0NCmRpZmYgLS1naXQgYS9iaW51dGlscy9jb25maWd1cmUuY29tIGIvYmludXRpbHMvY29uZmlndXJlLmNvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk0NjNkNS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jb25maWd1cmUuY29tCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotJCEKLSQhIFRoaXMgZmlsZSBjb25maWd1cmVzIGJpbnV0aWxzIGZvciB1c2Ugd2l0aCBvcGVuVk1TL0FscGhhCi0kISBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZSBkbyBub3QgaGF2ZSAvYmluL3NoCi0kISB0byBleGVjdXRlIGl0LgotJCEKLSQhIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLSQhCi0kYXJjaF9pbmR4ID0gMSArICgoZiRnZXRzeWkoIkNQVSIpLmdlLjEyOCkuYW5kLjEpICAgICAgISB2YXg9PTEsIGFscGhhPT0yCi0kYXJjaCA9IGYkZWxlbWVudChhcmNoX2luZHgsInwiLCJ8VkFYfEFscGhhfCIpCi0kIQotJCEKLSQhIEdlbmVyYXRlIGNvbmZpZy5oCi0kIQotJCBjcmVhdGUgW11jb25maWcuaAotLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLwotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0vKiBJcyB0aGUgdHlwZSB0aW1lX3QgZGVmaW5lZCBpbiA8dGltZS5oPj8gICovCi0jZGVmaW5lIEhBVkVfVElNRV9UX0lOX1RJTUVfSCAxCi0vKiBJcyB0aGUgdHlwZSB0aW1lX3QgZGVmaW5lZCBpbiA8c3lzL3R5cGVzLmg+PyAgKi8KLSNkZWZpbmUgSEFWRV9USU1FX1RfSU5fVFlQRVNfSCAxCi0vKiBEb2VzIDx1dGltZS5oPiBkZWZpbmUgc3RydWN0IHV0aW1idWY/ICAqLwotI2RlZmluZSBIQVZFX0dPT0RfVVRJTUVfSCAxCi0vKiBXaGV0aGVyIGZwcmludGYgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRpby5oPiBpcyBpbmNsdWRlZC4gICovCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRlBSSU5URiAxCi0vKiBXaGV0aGVyIHNicmsgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDx1bmlzdGQuaD4gaXMgaW5jbHVkZWQuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU0JSSwotLyogRG8gd2UgbmVlZCB0byB1c2UgdGhlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz8gICovCi0vKiAjdW5kZWYgVVNFX0JJTkFSWV9GT1BFTiAqLwotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzYnJrIGZ1bmN0aW9uLiAgKi8KLS8qICN1bmRlZiBIQVZFX1NCUksgMSAqLwotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB1dGltZXMgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX1VUSU1FUyAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfRkNOVExfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TWVNfRklMRV9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfVU5JU1REX0ggMQotJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZWQgYGNvbmZpZy5oJyIKLSQhCi0kIQotJCEgRWRpdCBWRVJTSU9OIGluIG1ha2VmaWxlLnZtcy1pbgotJCEKLSQgZWRpdC90cHUvbm9qb3VybmFsL25vc2VjdGlvbi9ub2Rpc3BsYXkvY29tbWFuZD1zeXMkaW5wdXQgLQotICAgICAgICBbXW1ha2VmaWxlLnZtcy1pbiAvb3V0cHV0PVtdbWFrZWZpbGUudm1zCi0kREVDSwotIQotISBHZXQgVkVSU0lPTiBmcm9tIGNvbmZpZ3VyZS5pbgotIQotICAgbWZpbGUgOj0gQ1JFQVRFX0JVRkZFUigibWZpbGUiLCAiQ09ORklHVVJFLklOIik7Ci0gICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YobWZpbGUpLCBFTkRfT0YobWZpbGUpKTsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQU1fSU5JVF9BVVRPTUFLRShiaW51dGlscywgJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICB2ZXJzIDo9IENVUlJFTlRfTElORS0iKSI7Ci0gICBFTFNFOwotICAgICB2ZXJzIDo9ICJ1bmtub3duIjsKLSAgIEVORElGOwotCi0gICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7Ci0gICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEVORF9PRihmaWxlKSk7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BWRVJTSU9OQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICBDT1BZX1RFWFQodmVycyk7Ci0gICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOwotICAgUVVJVAotJCAgRU9ECi0kIHdyaXRlIHN5cyRvdXRwdXQgIkNyZWF0ZWQgYG1ha2VmaWxlLnZtcyciCmRpZmYgLS1naXQgYS9iaW51dGlscy9jb25maWd1cmUuaW4gYi9iaW51dGlscy9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OGE2YzYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sCi1BQ19QUkVSRVEoMi4xMykKLUFDX0lOSVQoYXIuYykKLQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotCi1BTV9JTklUX0FVVE9NQUtFKGJpbnV0aWxzLCAyLjkuNCkKLQotQU1fUFJPR19MSUJUT09MCi0KLUFDX0FSR19FTkFCTEUodGFyZ2V0cywKLVsgIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9uc10sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgQUNfRVJST1IoZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCcpCi0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjXSlkbmwKLUFDX0FSR19FTkFCTEUoY29tbW9uYmZkbGliLAotWyAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5XSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgY29tbW9uYmZkbGliPXRydWUgOzsKLSAgbm8pICBjb21tb25iZmRsaWI9ZmFsc2UgOzsKLSAgKikgICBBQ19NU0dfRVJST1IoW2JhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIEJGRCBjb21tb25iZmRsaWIgb3B0aW9uXSkgOzsKLWVzYWNdKWRubAotCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLikKLWZpCi1pZiB0ZXN0IC16ICIkaG9zdCIgOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFVucmVjb2duaXplZCBob3N0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4pCi1maQotCi1BQ19QUk9HX0NDCi0KLUFDX1BST0dfWUFDQwotQU1fUFJPR19MRVgKLQotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi1BTV9NQUlOVEFJTkVSX01PREUKLUFDX0VYRUVYVAotCi0jIGhvc3Qtc3BlY2lmaWMgc3R1ZmY6Ci0KLUhERUZJTkVTPQotCi0uICR7c3JjZGlyfS8uLi9iZmQvY29uZmlndXJlLmhvc3QKLQotQUNfU1VCU1QoSERFRklORVMpCi1BUj0ke0FSLWFyfQotQUNfU1VCU1QoQVIpCi1BQ19QUk9HX1JBTkxJQgotQUNfUFJPR19JTlNUQUxMCi0KLUJGRF9DQ19GT1JfQlVJTEQKLQotQUNfQ0hFQ0tfSEVBREVSUyhzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggdW5pc3RkLmggZmNudGwuaCBzeXMvZmlsZS5oKQotQUNfSEVBREVSX1NZU19XQUlUCi1BQ19GVU5DX0FMTE9DQQotQUNfQ0hFQ0tfRlVOQ1Moc2JyayB1dGltZXMpCi0KLUFDX01TR19DSEVDS0lORyhmb3IgdGltZV90IGluIHRpbWUuaCkKLUFDX0NBQ0hFX1ZBTChidV9jdl9kZWNsX3RpbWVfdF90aW1lX2gsCi1bQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx0aW1lLmg+XSwgW3RpbWVfdCBpO10sCi1idV9jdl9kZWNsX3RpbWVfdF90aW1lX2g9eWVzLCBidV9jdl9kZWNsX3RpbWVfdF90aW1lX2g9bm8pXSkKLUFDX01TR19SRVNVTFQoJGJ1X2N2X2RlY2xfdGltZV90X3RpbWVfaCkKLWlmIHRlc3QgJGJ1X2N2X2RlY2xfdGltZV90X3RpbWVfaCA9IHllczsgdGhlbgotICBBQ19ERUZJTkUoW0hBVkVfVElNRV9UX0lOX1RJTUVfSF0sIDEsCi0JICAgIFtJcyB0aGUgdHlwZSB0aW1lX3QgZGVmaW5lZCBpbiA8dGltZS5oPj9dKQotZmkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aW1lX3QgaW4gc3lzL3R5cGVzLmgpCi1BQ19DQUNIRV9WQUwoYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaCwKLVtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPl0sIFt0aW1lX3QgaTtdLAotYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaD15ZXMsIGJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2g9bm8pXSkKLUFDX01TR19SRVNVTFQoJGJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2gpCi1pZiB0ZXN0ICRidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oID0geWVzOyB0aGVuCi0gIEFDX0RFRklORShbSEFWRV9USU1FX1RfSU5fVFlQRVNfSF0sIDEsCi0JICAgIFtJcyB0aGUgdHlwZSB0aW1lX3QgZGVmaW5lZCBpbiA8c3lzL3R5cGVzLmg+P10pCi1maQotCi0jIFVuZGVyIE5leHQgMy4yIDx1dGltZS5oPiBhcHBhcmVudGx5IGRvZXMgbm90IGRlZmluZSBzdHJ1Y3QgdXRpbWJ1ZgotIyBieSBkZWZhdWx0LgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgdXRpbWUuaF0pCi1BQ19DQUNIRV9WQUwoYnVfY3ZfaGVhZGVyX3V0aW1lX2gsCi1bQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1RJTUVfSAotI2luY2x1ZGUgPHRpbWUuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHV0aW1lLmg+XSwKLVtzdHJ1Y3QgdXRpbWJ1ZiBzO10sCi1idV9jdl9oZWFkZXJfdXRpbWVfaD15ZXMsIGJ1X2N2X2hlYWRlcl91dGltZV9oPW5vKV0pCi1BQ19NU0dfUkVTVUxUKCRidV9jdl9oZWFkZXJfdXRpbWVfaCkKLWlmIHRlc3QgJGJ1X2N2X2hlYWRlcl91dGltZV9oID0geWVzOyB0aGVuCi0gIEFDX0RFRklORShIQVZFX0dPT0RfVVRJTUVfSCwgMSwgW0RvZXMgPHV0aW1lLmg+IGRlZmluZSBzdHJ1Y3QgdXRpbWJ1Zj9dKQotZmkKLQotQkZEX05FRURfREVDTEFSQVRJT04oZnByaW50ZikKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKHN0cnN0cikKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKHNicmspCi1CRkRfTkVFRF9ERUNMQVJBVElPTihnZXRlbnYpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihlbnZpcm9uKQotCi1CRkRfQklOQVJZX0ZPUEVOCi0KLSMgdGFyZ2V0LXNwZWNpZmljIHN0dWZmOgotCi0jIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyI7IHRoZW4KLSAgICBmb3IgdGFyZyBpbiBgZWNobyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYAotICAgIGRvCi0JcmVzdWx0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZyAyPi9kZXYvbnVsbGAKLQlpZiB0ZXN0IC1uICIkcmVzdWx0IjsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotQlVJTERfTkxNQ09OVj0KLU5MTUNPTlZfREVGUz0KLUJVSUxEX1NSQ09OVj0KLUJVSUxEX0RMTFRPT0w9Ci1ETExUT09MX0RFRlM9Ci1CVUlMRF9XSU5EUkVTPQotQlVJTERfRExMV1JBUD0KLUJVSUxEX01JU0M9Ci0KLWZvciB0YXJnIGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMKLWRvCi0gICAgaWYgdGVzdCAieCR0YXJnIiA9ICJ4YWxsIjsgdGhlbgotICAgICAgICBhbGxfdGFyZ2V0cz10cnVlCi0JQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCUJVSUxEX1NSQ09OVj0nJChTUkNPTlZfUFJPRyknCi0JTkxNQ09OVl9ERUZTPSItRE5MTUNPTlZfSTM4NiAtRE5MTUNPTlZfQUxQSEEgLUROTE1DT05WX1BPV0VSUEMgLUROTE1DT05WX1NQQVJDIgotICAgIGVsc2UKLQljYXNlICR0YXJnIGluCi1jaGFuZ2VxdW90ZSgsKWRubAotCWlbMzQ1Nl04NiotKi1uZXR3YXJlKikgCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JICBCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JICBOTE1DT05WX0RFRlM9IiROTE1DT05WX0RFRlMgLUROTE1DT05WX0kzODYiCi0JICA7OwotCWFscGhhKi0qLW5ldHdhcmUqKQotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9BTFBIQSIKLQkgIDs7Ci0JcG93ZXJwYyotKi1uZXR3YXJlKikKLQkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfUE9XRVJQQyIKLQkgIDs7Ci0Jc3BhcmMqLSotbmV0d2FyZSopCi0JICBCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JICBOTE1DT05WX0RFRlM9IiROTE1DT05WX0RFRlMgLUROTE1DT05WX1NQQVJDIgotCSAgOzsKLQllc2FjCi0JY2FzZSAkdGFyZyBpbgotCSotKi1obXMqKSBCVUlMRF9TUkNPTlY9JyQoU1JDT05WX1BST0cpJyA7OwotCWVzYWMKLQljYXNlICR0YXJnIGluCi0JYXJtLSpwZSopCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfQVJNIgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSA7OwotCXRodW1iLSpwZSopCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfQVJNIgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSA7OwotY2hhbmdlcXVvdGUoLClkbmwKLQlpWzMtNl04Ni0qcGUqIHwgaVszLTZdODYtKi1jeWd3aW4qIHwgaVszLTZdODYtKi1taW5ndzMyKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9JMzg2IgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSAgQlVJTERfRExMV1JBUD0nJChETExXUkFQX1BST0cpJChFWEVFWFQpJwotCSA7OwotCXBvd2VycGMqLSotKnBlKiB8IHBvd2VycGMqLSotY3lnd2luKikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9QUEMiCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JIDs7Ci0JbWNvcmUtKnBlKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX01DT1JFIgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSA7OwotCW1jb3JlLSplbGYpCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfTUNPUkVfRUxGIgotCSA7OwotCWVzYWMKLSAgICBmaQotZG9uZQotCi1BQ19TVUJTVChOTE1DT05WX0RFRlMpCi1BQ19TVUJTVChCVUlMRF9OTE1DT05WKQotQUNfU1VCU1QoQlVJTERfU1JDT05WKQotQUNfU1VCU1QoQlVJTERfRExMVE9PTCkKLUFDX1NVQlNUKERMTFRPT0xfREVGUykKLUFDX1NVQlNUKEJVSUxEX1dJTkRSRVMpCi1BQ19TVUJTVChCVUlMRF9ETExXUkFQKQotQUNfU1VCU1QoQlVJTERfTUlTQykKLQotQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVCwgIiR7dGFyZ2V0fSIsIFtDb25maWd1cmVkIHRhcmdldCBuYW1lLl0pCi0KLXRhcmc9JHRhcmdldAotLiAkc3JjZGlyLy4uL2JmZC9jb25maWcuYmZkCi1pZiB0ZXN0ICJ4JHRhcmdfdW5kZXJzY29yZSIgPSAieHllcyI7IHRoZW4KLSAgICBVTkRFUlNDT1JFPTEKLWVsc2UKLSAgICBVTkRFUlNDT1JFPTAKLWZpCi1BQ19TVUJTVChVTkRFUlNDT1JFKQotCi1BQ19PVVRQVVQoTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiwKLVsKLWNhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgotKikgc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlIDs7Ci1lc2FjCi1dKQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY3h4ZmlsdC5tYW4gYi9iaW51dGlscy9jeHhmaWx0Lm1hbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkNWQ0NS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jeHhmaWx0Lm1hbgorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggQFBST0dSQU1AIDEgIkp1bmUgMTk5MyIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLUBQUk9HUkFNQCBcLSBkZW1hbmdsZSBDKysgc3ltYm9scwotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgQFBST0dSQU1ACi0uUkIgIltcfCIgXC1fIHwgXC1cLXN0cmlwLXVuZGVyc2NvcmVzICJcfF0iCi0uUkIgIltcfCIgIlwtcyB7Z251LGx1Y2lkLGFybX0gIiB8ICIgXC1cLWZvcm1hdD17Z251LGx1Y2lkLGFybX0iICJcfF0iCi0uUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIKLS5SQiAiW1x8IiBcLVwtdmVyc2lvbiAiXHxdIgotLlJCICJbXHwiIHN5bWJvbCAiLi4uXHxdIgotLlNIIERFU0NSSVBUSU9OCi1UaGUgQysrIGxhbmd1YWdlIHByb3ZpZGVzIGZ1bmN0aW9uIG92ZXJsb2FkaW5nLCB3aGljaCBtZWFucyB0aGF0IHlvdSBjYW4KLXdyaXRlIG1hbnkgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSAocHJvdmlkaW5nIGVhY2ggdGFrZXMgcGFyYW1ldGVycwotb2YgZGlmZmVyZW50IHR5cGVzKS4gIEFsbCBDKysgZnVuY3Rpb24gbmFtZXMgYXJlIGVuY29kZWQgaW50byBhCi1sb3ctbGV2ZWwgYXNzZW1ibHkgbGFiZWwgKHRoaXMgcHJvY2VzcyBpcyBrbm93biBhcwotLkkgbWFuZ2xpbmdcYwotKS4gIFRoZSAKLS5CIEBQUk9HUkFNQAotcHJvZ3JhbSBkb2VzIHRoZSBpbnZlcnNlIG1hcHBpbmc6IGl0IGRlY29kZXMgKFxmSWRlbWFuZ2xlc1xmUikKLWxvdy1sZXZlbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMgc28gdGhhdCB0aGUgbGlua2VyIGNhbiBrZWVwCi10aGVzZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyBmcm9tIGNsYXNoaW5nLgotLlBQCi1FdmVyeSBhbHBoYW51bWVyaWMgd29yZCAoY29uc2lzdGluZyBvZiBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmVzLAotZG9sbGFycywgb3IgcGVyaW9kcykgc2VlbiBpbiB0aGUgaW5wdXQgaXMgYSBwb3RlbnRpYWwgbGFiZWwuICBJZiB0aGUKLWxhYmVsIGRlY29kZXMgaW50byBhIEMrKyBuYW1lLCB0aGUgQysrIG5hbWUgcmVwbGFjZXMgdGhlIGxvdy1sZXZlbAotbmFtZSBpbiB0aGUgb3V0cHV0LgotLlBQCi1Zb3UgY2FuIHVzZQotLkIgQFBST0dSQU1ACi10byBkZWNpcGhlciBpbmRpdmlkdWFsIHN5bWJvbHMgYnkgc3BlY2lmeWluZyB0aGVzZSBzeW1ib2xzIG9uIHRoZQotY29tbWFuZCBsaW5lLgotLlBQCi1JZiBubwotLkIgc3ltYm9sCi1hcmd1bWVudHMgYXJlIGdpdmVuLAotLkIgQFBST0dSQU1ACi1yZWFkcyBzeW1ib2wgbmFtZXMgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlcyB0aGUgZGVtYW5nbGVkCi1uYW1lcyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiAgQWxsIHJlc3VsdHMgYXJlIHByaW50ZWQgb24gdGhlIHN0YW5kYXJkCi1vdXRwdXQuCi0uU0ggT1BUSU9OUwotLlRQCi0uQiBcLV8KLS5UUAotLkIgXC1cLXN0cmlwXC11bmRlcnNjb3JlcwotT24gc29tZSBzeXN0ZW1zLCBib3RoIHRoZSBDIGFuZCBDKysgY29tcGlsZXJzIHB1dCBhbgotdW5kZXJzY29yZSBpbiBmcm9udCBvZiBldmVyeSBuYW1lLiAgRm9yIGV4YW1wbGUsIHRoZSBDIG5hbWUgCi0uQiBmb28KLWdldHMgdGhlIGxvdy1sZXZlbCBuYW1lIAotLkJSIF9mb28gLgotVGhpcyBvcHRpb24gcmVtb3ZlcyB0aGUgbGVhZGluZyB1bmRlcnNjb3JlLgotCi0uVFAKLS5CICJcLXMge2dudSxsdWNpZCxhcm19IgotLlRQCi0uQiBcLVwtZm9ybWF0PXtnbnUsbHVjaWQsYXJtfQotR05VCi0uQiBubQotY2FuIGRlY29kZSB0aHJlZSBkaWZmZXJlbnQgbWV0aG9kcyBvZiBtYW5nbGluZywgdXNlZCBieSBkaWZmZXJlbnQgQysrCi1jb21waWxlcnMuICBUaGlzIG9wdGlvbiBzZWxlY3RzIHdoaWNoIG1ldGhvZCBpdCB1c2VzOiB0aGUgb25lIHVzZWQgYnkKLXRoZSBHTlUgY29tcGlsZXIsIHRoZSBvbmUgdXNlZCBieSB0aGUgTHVjaWQgY29tcGlsZXIsIG9yIHRoZSBvbmUKLXNwZWNpZmllZCBieSB0aGUgQysrIEFubm90YXRlZCBSZWZlcmVuY2UgTWFudWFsLiAgVGhlIGRlZmF1bHQgaXMgdGhlCi1HTlUgc3R5bGUuCi0KLS5UUAotLkIgXC1cLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0bwotLkIgQFBST0dSQU1ACi1hbmQgZXhpdC4KLQotLlRQCi0uQiBcLVwtdmVyc2lvbgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mCi0uQiBAUFJPR1JBTUAKLWFuZCBleGl0LgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciIAotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLVwmLCBSb2xhbmQgSC4gUGVzY2ggKEp1bmUgMTk5MykuCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2RlYnVnLmMgYi9iaW51dGlscy9kZWJ1Zy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzNkNjI3Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2RlYnVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTY4ICswLDAgQEAKLS8qIGRlYnVnLmMgLS0gSGFuZGxlIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgZ2VuZXJpYyBkZWJ1Z2dpbmcgZm9ybWF0LiAgV2UgbWF5IGV2ZW50dWFsbHkKLSAgIGhhdmUgcmVhZGVycyB3aGljaCBjb252ZXJ0IGRpZmZlcmVudCBmb3JtYXRzIGludG8gdGhpcyBnZW5lcmljCi0gICBmb3JtYXQsIGFuZCB3cml0ZXJzIHdoaWNoIHdyaXRlIGl0IG91dC4gIFRoZSBpbml0aWFsIGltcGV0dXMgZm9yCi0gICB0aGlzIHdhcyB3cml0aW5nIGEgY29udmVydG9yIGZyb20gc3RhYnMgdG8gSFAgSUVFRS02OTUgZGVidWdnaW5nCi0gICBmb3JtYXQuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0KLS8qIEdsb2JhbCBpbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBkZWJ1Z2dpbmcuICBBIHBvaW50ZXIgdG8gdGhpcwotICAgc3RydWN0dXJlIGlzIHRoZSBkZWJ1Z2dpbmcgaGFuZGxlIHBhc3NlZCB0byBhbGwgdGhlIHJvdXRpbmVzLiAgKi8KLQotc3RydWN0IGRlYnVnX2hhbmRsZQotewotICAvKiBBIGxpbmtlZCBsaXN0IG9mIGNvbXBpbGF0aW9uIHVuaXRzLiAgKi8KLSAgc3RydWN0IGRlYnVnX3VuaXQgKnVuaXRzOwotICAvKiBUaGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgc3RydWN0IGRlYnVnX3VuaXQgKmN1cnJlbnRfdW5pdDsKLSAgLyogVGhlIGN1cnJlbnQgc291cmNlIGZpbGUuICAqLwotICBzdHJ1Y3QgZGVidWdfZmlsZSAqY3VycmVudF9maWxlOwotICAvKiBUaGUgY3VycmVudCBmdW5jdGlvbi4gICovCi0gIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbiAqY3VycmVudF9mdW5jdGlvbjsKLSAgLyogVGhlIGN1cnJlbnQgYmxvY2suICAqLwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmN1cnJlbnRfYmxvY2s7Ci0gIC8qIFRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCB1bml0LiAgKi8KLSAgc3RydWN0IGRlYnVnX2xpbmVubyAqY3VycmVudF9saW5lbm87Ci0gIC8qIE1hcmsuICBUaGlzIGlzIHVzZWQgYnkgZGVidWdfd3JpdGUuICAqLwotICB1bnNpZ25lZCBpbnQgbWFyazsKLSAgLyogQSBzdHJ1Y3QvY2xhc3MgSUQgdXNlZCBieSBkZWJ1Z193cml0ZS4gICovCi0gIHVuc2lnbmVkIGludCBjbGFzc19pZDsKLSAgLyogVGhlIGJhc2UgZm9yIGNsYXNzX2lkIGZvciB0aGlzIGNhbGwgdG8gZGVidWdfd3JpdGUuICAqLwotICB1bnNpZ25lZCBpbnQgYmFzZV9pZDsKLSAgLyogVGhlIGN1cnJlbnQgbGluZSBudW1iZXIgaW4gZGVidWdfd3JpdGUuICAqLwotICBzdHJ1Y3QgZGVidWdfbGluZW5vICpjdXJyZW50X3dyaXRlX2xpbmVubzsKLSAgdW5zaWduZWQgaW50IGN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4OwotICAvKiBBIGxpc3Qgb2YgY2xhc3NlcyB3aGljaCBoYXZlIGFzc2lnbmVkIElEJ3MgZHVyaW5nIGRlYnVnX3dyaXRlLgotICAgICBUaGlzIGlzIGxpbmtlZCB0aHJvdWdoIHRoZSBuZXh0X2lkIGZpZWxkIG9mIGRlYnVnX2NsYXNzX3R5cGUuICAqLwotICBzdHJ1Y3QgZGVidWdfY2xhc3NfaWQgKmlkX2xpc3Q7Ci0gIC8qIEEgbGlzdCB1c2VkIHRvIGF2b2lkIHJlY3Vyc2lvbiBkdXJpbmcgZGVidWdfdHlwZV9zYW1lcC4gICovCi0gIHN0cnVjdCBkZWJ1Z190eXBlX2NvbXBhcmVfbGlzdCAqY29tcGFyZV9saXN0OwotfTsKLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYSBzaW5nbGUgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0cnVjdCBkZWJ1Z191bml0Ci17Ci0gIC8qIFRoZSBuZXh0IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgZGVidWdfdW5pdCAqbmV4dDsKLSAgLyogQSBsaXN0IG9mIGZpbGVzIGluY2x1ZGVkIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdC4gIFRoZSBmaXJzdAotICAgICBmaWxlIGlzIGFsd2F5cyB0aGUgbWFpbiBvbmUsIGFuZCB0aGF0IGlzIHdoZXJlIHRoZSBtYWluIGZpbGUgbmFtZQotICAgICBpcyBzdG9yZWQuICAqLwotICBzdHJ1Y3QgZGVidWdfZmlsZSAqZmlsZXM7Ci0gIC8qIExpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuICBUaGlzIGlzIG5vdAotICAgICBzdG9yZWQgYnkgZnVuY3Rpb24sIGJlY2F1c2UgYXNzZW1ibGVyIGNvZGUgbWF5IGhhdmUgbGluZSBudW1iZXIKLSAgICAgaW5mb3JtYXRpb24gd2l0aG91dCBmdW5jdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBkZWJ1Z19saW5lbm8gKmxpbmVub3M7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIHNpbmdsZSBzb3VyY2UgZmlsZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19maWxlCi17Ci0gIC8qIFRoZSBuZXh0IHNvdXJjZSBmaWxlIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIHN0cnVjdCBkZWJ1Z19maWxlICpuZXh0OwotICAvKiBUaGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuICAqLwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgLyogR2xvYmFsIGZ1bmN0aW9ucywgdmFyaWFibGVzLCB0eXBlcywgZXRjLiAgKi8KLSAgc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqZ2xvYmFsczsKLX07Ci0KLS8qIEEgdHlwZS4gICovCi0KLXN0cnVjdCBkZWJ1Z190eXBlCi17Ci0gIC8qIEtpbmQgb2YgdHlwZS4gICovCi0gIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci0gIC8qIFNpemUgb2YgdHlwZSAoMCBpZiBub3Qga25vd24pLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIC8qIFR5cGUgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoaXMgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgcG9pbnRlcjsKLSAgLyogVGFnZ2VkIHVuaW9uIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZS4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogREVCVUdfS0lORF9JTkRJUkVDVC4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfaW5kaXJlY3RfdHlwZSAqa2luZGlyZWN0OwotICAgICAgLyogREVCVUdfS0lORF9JTlQuICAqLwotICAgICAgLyogV2hldGhlciB0aGUgaW50ZWdlciBpcyB1bnNpZ25lZC4gICovCi0gICAgICBib29sZWFuIGtpbnQ7Ci0gICAgICAvKiBERUJVR19LSU5EX1NUUlVDVCwgREVCVUdfS0lORF9VTklPTiwgREVCVUdfS0lORF9DTEFTUywKLSAgICAgICAgIERFQlVHX0tJTkRfVU5JT05fQ0xBU1MuICAqLwotICAgICAgc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUgKmtjbGFzczsKLSAgICAgIC8qIERFQlVHX0tJTkRfRU5VTS4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfZW51bV90eXBlICprZW51bTsKLSAgICAgIC8qIERFQlVHX0tJTkRfUE9JTlRFUi4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqa3BvaW50ZXI7Ci0gICAgICAvKiBERUJVR19LSU5EX0ZVTkNUSU9OLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbl90eXBlICprZnVuY3Rpb247Ci0gICAgICAvKiBERUJVR19LSU5EX1JFRkVSRU5DRS4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqa3JlZmVyZW5jZTsKLSAgICAgIC8qIERFQlVHX0tJTkRfUkFOR0UuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3JhbmdlX3R5cGUgKmtyYW5nZTsKLSAgICAgIC8qIERFQlVHX0tJTkRfQVJSQVkuICAqLwotICAgICAgc3RydWN0IGRlYnVnX2FycmF5X3R5cGUgKmthcnJheTsKLSAgICAgIC8qIERFQlVHX0tJTkRfU0VULiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19zZXRfdHlwZSAqa3NldDsKLSAgICAgIC8qIERFQlVHX0tJTkRfT0ZGU0VULiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19vZmZzZXRfdHlwZSAqa29mZnNldDsKLSAgICAgIC8qIERFQlVHX0tJTkRfTUVUSE9ELiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19tZXRob2RfdHlwZSAqa21ldGhvZDsKLSAgICAgIC8qIERFQlVHX0tJTkRfQ09OU1QuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGUgKmtjb25zdDsKLSAgICAgIC8qIERFQlVHX0tJTkRfVk9MQVRJTEUuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGUgKmt2b2xhdGlsZTsKLSAgICAgIC8qIERFQlVHX0tJTkRfTkFNRUQsIERFQlVHX0tJTkRfVEFHR0VELiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19uYW1lZF90eXBlICprbmFtZWQ7Ci0gICAgfSB1OwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYW4gaW5kaXJlY3QgdHlwZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19pbmRpcmVjdF90eXBlCi17Ci0gIC8qIFNsb3Qgd2hlcmUgdGhlIGZpbmFsIHR5cGUgd2lsbCBhcHBlYXIuICAqLwotICBkZWJ1Z190eXBlICpzbG90OwotICAvKiBUYWcuICAqLwotICBjb25zdCBjaGFyICp0YWc7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIHN0cnVjdCwgdW5pb24sIG9yIGNsYXNzLiAgKi8KLQotc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUKLXsKLSAgLyogTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGZpZWxkcy4gICovCi0gIGRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0gIC8qIEEgbWFyayBmaWVsZCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RydWN0IGhhcyBhbHJlYWR5IGJlZW4KLSAgICAgcHJpbnRlZC4gICovCi0gIHVuc2lnbmVkIGludCBtYXJrOwotICAvKiBUaGlzIGlzIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdW5uYW1lZCBzdHJ1Y3RzIHdoZW4gcHJpbnRpbmcuICAqLwotICB1bnNpZ25lZCBpbnQgaWQ7Ci0gIC8qIFRoZSByZW1haW5pbmcgZmllbGRzIGFyZSBvbmx5IHVzZWQgZm9yIERFQlVHX0tJTkRfQ0xBU1MgYW5kCi0gICAgIERFQlVHX0tJTkRfVU5JT05fQ0xBU1MuICAqLwotICAvKiBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYmFzZSBjbGFzc2VzLiAgKi8KLSAgZGVidWdfYmFzZWNsYXNzICpiYXNlY2xhc3NlczsKLSAgLyogTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIG1ldGhvZHMuICAqLwotICBkZWJ1Z19tZXRob2QgKm1ldGhvZHM7Ci0gIC8qIFRoZSB0eXBlIG9mIHRoZSBjbGFzcyBwcm92aWRpbmcgdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgZm9yCi0gICAgIHRoaXMgY2xhc3MuICBUaGlzIG1heSBwb2ludCB0byB0aGUgdHlwZSBpdHNlbGYuICAqLwotICBkZWJ1Z190eXBlIHZwdHJiYXNlOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYW4gZW51bS4gICovCi0KLXN0cnVjdCBkZWJ1Z19lbnVtX3R5cGUKLXsKLSAgLyogTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIG5hbWVzLiAgKi8KLSAgY29uc3QgY2hhciAqKm5hbWVzOwotICAvKiBBcnJheSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy4gICovCi0gIGJmZF9zaWduZWRfdm1hICp2YWx1ZXM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIGZ1bmN0aW9uLiAgRklYTUU6IFdlIHNob3VsZCBiZSBhYmxlIHRvCi0gICByZWNvcmQgdGhlIHBhcmFtZXRlciB0eXBlcy4gICovCi0KLXN0cnVjdCBkZWJ1Z19mdW5jdGlvbl90eXBlCi17Ci0gIC8qIFJldHVybiB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLSAgLyogTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzLiAgKi8KLSAgZGVidWdfdHlwZSAqYXJnX3R5cGVzOwotICAvKiBXaGV0aGVyIHRoZSBmdW5jdGlvbiB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuICAqLwotICBib29sZWFuIHZhcmFyZ3M7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIHJhbmdlLiAgKi8KLQotc3RydWN0IGRlYnVnX3JhbmdlX3R5cGUKLXsKLSAgLyogUmFuZ2UgYmFzZSB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSB0eXBlOwotICAvKiBMb3dlciBib3VuZC4gICovCi0gIGJmZF9zaWduZWRfdm1hIGxvd2VyOwotICAvKiBVcHBlciBib3VuZC4gICovCi0gIGJmZF9zaWduZWRfdm1hIHVwcGVyOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYW4gYXJyYXkuICAqLwotCi1zdHJ1Y3QgZGVidWdfYXJyYXlfdHlwZQotewotICAvKiBFbGVtZW50IHR5cGUuICAqLwotICBkZWJ1Z190eXBlIGVsZW1lbnRfdHlwZTsKLSAgLyogUmFuZ2UgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgcmFuZ2VfdHlwZTsKLSAgLyogTG93ZXIgYm91bmQuICAqLwotICBiZmRfc2lnbmVkX3ZtYSBsb3dlcjsKLSAgLyogVXBwZXIgYm91bmQuICAqLwotICBiZmRfc2lnbmVkX3ZtYSB1cHBlcjsKLSAgLyogV2hldGhlciB0aGlzIGFycmF5IGlzIHJlYWxseSBhIHN0cmluZy4gICovCi0gIGJvb2xlYW4gc3RyaW5ncDsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGEgc2V0LiAgKi8KLQotc3RydWN0IGRlYnVnX3NldF90eXBlCi17Ci0gIC8qIEJhc2UgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogV2hldGhlciB0aGlzIHNldCBpcyByZWFsbHkgYSBiaXRzdHJpbmcuICAqLwotICBib29sZWFuIGJpdHN0cmluZ3A7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhbiBvZmZzZXQgdHlwZSAoYSBiYXNlZCBwb2ludGVyKS4gICovCi0KLXN0cnVjdCBkZWJ1Z19vZmZzZXRfdHlwZQotewotICAvKiBUaGUgdHlwZSB0aGUgcG9pbnRlciBpcyBhbiBvZmZzZXQgZnJvbS4gICovCi0gIGRlYnVnX3R5cGUgYmFzZV90eXBlOwotICAvKiBUaGUgdHlwZSB0aGUgcG9pbnRlciBwb2ludHMgdG8uICAqLwotICBkZWJ1Z190eXBlIHRhcmdldF90eXBlOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSBtZXRob2QgdHlwZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19tZXRob2RfdHlwZQotewotICAvKiBUaGUgcmV0dXJuIHR5cGUuICAqLwotICBkZWJ1Z190eXBlIHJldHVybl90eXBlOwotICAvKiBUaGUgb2JqZWN0IHR5cGUgd2hpY2ggdGhpcyBtZXRob2QgaXMgZm9yLiAgKi8KLSAgZGVidWdfdHlwZSBkb21haW5fdHlwZTsKLSAgLyogQSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYXJndW1lbnQgdHlwZXMuICAqLwotICBkZWJ1Z190eXBlICphcmdfdHlwZXM7Ci0gIC8qIFdoZXRoZXIgdGhlIG1ldGhvZCB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuICAqLwotICBib29sZWFuIHZhcmFyZ3M7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIG5hbWVkIHR5cGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfbmFtZWRfdHlwZQotewotICAvKiBOYW1lLiAgKi8KLSAgc3RydWN0IGRlYnVnX25hbWUgKm5hbWU7Ci0gIC8qIFJlYWwgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLX07Ci0KLS8qIEEgZmllbGQgaW4gYSBzdHJ1Y3Qgb3IgdW5pb24uICAqLwotCi1zdHJ1Y3QgZGVidWdfZmllbGQKLXsKLSAgLyogTmFtZSBvZiB0aGUgZmllbGQuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUeXBlIG9mIHRoZSBmaWVsZC4gICovCi0gIHN0cnVjdCBkZWJ1Z190eXBlICp0eXBlOwotICAvKiBWaXNpYmlsaXR5IG9mIHRoZSBmaWVsZC4gICovCi0gIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAvKiBXaGV0aGVyIHRoaXMgaXMgYSBzdGF0aWMgbWVtYmVyLiAgKi8KLSAgYm9vbGVhbiBzdGF0aWNfbWVtYmVyOwotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIElmIHN0YXRpY19tZW1iZXIgaXMgZmFsc2UuICAqLwotICAgICAgc3RydWN0Ci0JewotCSAgLyogQml0IHBvc2l0aW9uIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3RydWN0LiAgKi8KLQkgIHVuc2lnbmVkIGludCBiaXRwb3M7Ci0JICAvKiBTaXplIG9mIHRoZSBmaWVsZCBpbiBiaXRzLiAgKi8KLQkgIHVuc2lnbmVkIGludCBiaXRzaXplOwotCX0gZjsKLSAgICAgIC8qIElmIHN0YXRpY19tZW1iZXIgaXMgdHJ1ZS4gICovCi0gICAgICBzdHJ1Y3QKLQl7Ci0JICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLQl9IHM7Ci0gICAgfSB1OwotfTsKLQotLyogQSBiYXNlIGNsYXNzIGZvciBhbiBvYmplY3QuICAqLwotCi1zdHJ1Y3QgZGVidWdfYmFzZWNsYXNzCi17Ci0gIC8qIFR5cGUgb2YgdGhlIGJhc2UgY2xhc3MuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLSAgLyogQml0IHBvc2l0aW9uIG9mIHRoZSBiYXNlIGNsYXNzIGluIHRoZSBvYmplY3QuICAqLwotICB1bnNpZ25lZCBpbnQgYml0cG9zOwotICAvKiBXaGV0aGVyIHRoZSBiYXNlIGNsYXNzIGlzIHZpcnR1YWwuICAqLwotICBib29sZWFuIHZpcnR1YWw7Ci0gIC8qIFZpc2liaWxpdHkgb2YgdGhlIGJhc2UgY2xhc3MuICAqLwotICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLX07Ci0KLS8qIEEgbWV0aG9kIG9mIGFuIG9iamVjdC4gICovCi0KLXN0cnVjdCBkZWJ1Z19tZXRob2QKLXsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZC4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIEEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYW50cy4gICovCi0gIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqKnZhcmlhbnRzOwotfTsKLQotLyogVGhlIHZhcmlhbnRzIG9mIGEgbWV0aG9kIGZ1bmN0aW9uIG9mIGFuIG9iamVjdC4gIFRoZXNlIGluZGljYXRlCi0gICB3aGljaCBtZXRob2QgdG8gcnVuLiAgKi8KLQotc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50Ci17Ci0gIC8qIFRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSBmdW5jdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAvKiBUaGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24uICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLSAgLyogVGhlIHZpc2liaWxpdHkgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gIC8qIFdoZXRoZXIgdGhlIGZ1bmN0aW9uIGlzIGNvbnN0LiAgKi8KLSAgYm9vbGVhbiBjb25zdHA7Ci0gIC8qIFdoZXRoZXIgdGhlIGZ1bmN0aW9uIGlzIHZvbGF0aWxlLiAgKi8KLSAgYm9vbGVhbiB2b2xhdGlsZXA7Ci0gIC8qIFRoZSBvZmZzZXQgdG8gdGhlIGZ1bmN0aW9uIGluIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLiAgKi8KLSAgYmZkX3ZtYSB2b2Zmc2V0OwotICAvKiBJZiB2b2Zmc2V0IGlzIFZPRkZTRVRfU1RBVElDX01FVEhPRCwgdGhpcyBpcyBhIHN0YXRpYyBtZXRob2QuICAqLwotI2RlZmluZSBWT0ZGU0VUX1NUQVRJQ19NRVRIT0QgKChiZmRfdm1hKSAtMSkKLSAgLyogQ29udGV4dCBvZiBhIHZpcnR1YWwgbWV0aG9kIGZ1bmN0aW9uLiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGUgKmNvbnRleHQ7Ci19OwotCi0vKiBBIHZhcmlhYmxlLiAgVGhpcyBpcyB0aGUgaW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYSB2YXJpYWJsZSBvYmplY3QuCi0gICBUaGlzIGhhcyBubyBuYW1lOyBhIG5hbWUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdmFyaWFibGUgaW4gYQotICAgZGVidWdfbmFtZSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgZGVidWdfdmFyaWFibGUKLXsKLSAgLyogS2luZCBvZiB2YXJpYWJsZS4gICovCi0gIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKLSAgLyogVHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogVmFsdWUuICBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHZhbHVlIGRlcGVuZHMgdXBvbiBraW5kLiAgKi8KLSAgYmZkX3ZtYSB2YWw7Ci19OwotCi0vKiBBIGZ1bmN0aW9uLiAgVGhpcyBoYXMgbm8gbmFtZTsgYSBuYW1lIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGZ1bmN0aW9uCi0gICBpbiBhIGRlYnVnX25hbWUgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGRlYnVnX2Z1bmN0aW9uCi17Ci0gIC8qIFJldHVybiB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLSAgLyogUGFyYW1ldGVyIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGRlYnVnX3BhcmFtZXRlciAqcGFyYW1ldGVyczsKLSAgLyogQmxvY2sgaW5mb3JtYXRpb24uICBUaGUgZmlyc3Qgc3RydWN0dXJlIG9uIHRoZSBsaXN0IGlzIHRoZSBtYWluCi0gICAgIGJsb2NrIG9mIHRoZSBmdW5jdGlvbiwgYW5kIGRlc2NyaWJlcyBmdW5jdGlvbiBsb2NhbCB2YXJpYWJsZXMuICAqLwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmJsb2NrczsKLX07Ci0KLS8qIEEgZnVuY3Rpb24gcGFyYW1ldGVyLiAgKi8KLQotc3RydWN0IGRlYnVnX3BhcmFtZXRlcgotewotICAvKiBOZXh0IHBhcmFtZXRlci4gICovCi0gIHN0cnVjdCBkZWJ1Z19wYXJhbWV0ZXIgKm5leHQ7Ci0gIC8qIE5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUeXBlLiAgKi8KLSAgZGVidWdfdHlwZSB0eXBlOwotICAvKiBLaW5kLiAgKi8KLSAgZW51bSBkZWJ1Z19wYXJtX2tpbmQga2luZDsKLSAgLyogVmFsdWUgKG1lYW5pbmcgZGVwZW5kcyB1cG9uIGtpbmQpLiAgKi8KLSAgYmZkX3ZtYSB2YWw7Ci19OwotCi0vKiBBIHR5cGVkIGNvbnN0YW50LiAgKi8KLQotc3RydWN0IGRlYnVnX3R5cGVkX2NvbnN0YW50Ci17Ci0gIC8qIFR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIC8qIFZhbHVlLiAgRklYTUU6IFdlIG1heSBldmVudHVhbGx5IG5lZWQgdG8gc3VwcG9ydCBub24taW50ZWdyYWwKLSAgICAgdmFsdWVzLiAgKi8KLSAgYmZkX3ZtYSB2YWw7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBhYm91dCBhIGJsb2NrIHdpdGhpbiBhIGZ1bmN0aW9uLiAgKi8KLQotc3RydWN0IGRlYnVnX2Jsb2NrCi17Ci0gIC8qIE5leHQgYmxvY2sgd2l0aCB0aGUgc2FtZSBwYXJlbnQuICAqLwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKm5leHQ7Ci0gIC8qIFBhcmVudCBibG9jay4gICovCi0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqcGFyZW50OwotICAvKiBMaXN0IG9mIGNoaWxkIGJsb2Nrcy4gICovCi0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqY2hpbGRyZW47Ci0gIC8qIFN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGJsb2NrLiAgKi8KLSAgYmZkX3ZtYSBzdGFydDsKLSAgLyogRW5kIGFkZHJlc3Mgb2YgdGhlIGJsb2NrLiAgKi8KLSAgYmZkX3ZtYSBlbmQ7Ci0gIC8qIExvY2FsIHZhcmlhYmxlcy4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKmxvY2FsczsKLX07Ci0KLS8qIExpbmUgbnVtYmVyIGluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGEgY29tcGlsYXRpb24gdW5pdC4gIEZJWE1FOgotICAgVGhpcyBzdHJ1Y3R1cmUgaXMgZWFzeSB0byBjcmVhdGUsIGJ1dCBjYW4gYmUgdmVyeSBzcGFjZQotICAgaW5lZmZpY2llbnQuICAqLwotCi1zdHJ1Y3QgZGVidWdfbGluZW5vCi17Ci0gIC8qIE1vcmUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoaXMgYmxvY2suICAqLwotICBzdHJ1Y3QgZGVidWdfbGluZW5vICpuZXh0OwotICAvKiBTb3VyY2UgZmlsZS4gICovCi0gIHN0cnVjdCBkZWJ1Z19maWxlICpmaWxlOwotICAvKiBMaW5lIG51bWJlcnMsIHRlcm1pbmF0ZWQgYnkgYSAtMSBvciB0aGUgZW5kIG9mIHRoZSBhcnJheS4gICovCi0jZGVmaW5lIERFQlVHX0xJTkVOT19DT1VOVCAxMAotICB1bnNpZ25lZCBsb25nIGxpbmVub3NbREVCVUdfTElORU5PX0NPVU5UXTsKLSAgLyogQWRkcmVzc2VzIGZvciB0aGUgbGluZSBudW1iZXJzLiAgKi8KLSAgYmZkX3ZtYSBhZGRyc1tERUJVR19MSU5FTk9fQ09VTlRdOwotfTsKLQotLyogQSBuYW1lc3BhY2UuICBUaGlzIGlzIGEgbWFwcGluZyBmcm9tIG5hbWVzIHRvIG9iamVjdHMuICBGSVhNRTogVGhpcwotICAgc2hvdWxkIGJlIGltcGxlbWVudGVkIGFzIGEgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UKLXsKLSAgLyogTGlzdCBvZiBpdGVtcyBpbiB0aGlzIG5hbWVzcGFjZS4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lICpsaXN0OwotICAvKiBQb2ludGVyIHRvIHdoZXJlIHRoZSBuZXh0IGl0ZW0gaW4gdGhpcyBuYW1lc3BhY2Ugc2hvdWxkIGdvLiAgKi8KLSAgc3RydWN0IGRlYnVnX25hbWUgKip0YWlsOwotfTsKLQotLyogS2luZHMgb2Ygb2JqZWN0cyB0aGF0IGFwcGVhciBpbiBhIG5hbWVzcGFjZS4gICovCi0KLWVudW0gZGVidWdfb2JqZWN0X2tpbmQKLXsKLSAgLyogQSB0eXBlLiAgKi8KLSAgREVCVUdfT0JKRUNUX1RZUEUsCi0gIC8qIEEgdGFnZ2VkIHR5cGUgKHJlYWxseSBhIGRpZmZlcmVudCBzb3J0IG9mIG5hbWVzcGFjZSkuICAqLwotICBERUJVR19PQkpFQ1RfVEFHLAotICAvKiBBIHZhcmlhYmxlLiAgKi8KLSAgREVCVUdfT0JKRUNUX1ZBUklBQkxFLAotICAvKiBBIGZ1bmN0aW9uLiAgKi8KLSAgREVCVUdfT0JKRUNUX0ZVTkNUSU9OLAotICAvKiBBbiBpbnRlZ2VyIGNvbnN0YW50LiAgKi8KLSAgREVCVUdfT0JKRUNUX0lOVF9DT05TVEFOVCwKLSAgLyogQSBmbG9hdGluZyBwb2ludCBjb25zdGFudC4gICovCi0gIERFQlVHX09CSkVDVF9GTE9BVF9DT05TVEFOVCwKLSAgLyogQSB0eXBlZCBjb25zdGFudC4gICovCi0gIERFQlVHX09CSkVDVF9UWVBFRF9DT05TVEFOVAotfTsKLQotLyogTGlua2FnZSBvZiBhbiBvYmplY3QgdGhhdCBhcHBlYXJzIGluIGEgbmFtZXNwYWNlLiAgKi8KLQotZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZQotewotICAvKiBMb2NhbCB2YXJpYWJsZS4gICovCi0gIERFQlVHX0xJTktBR0VfQVVUT01BVElDLAotICAvKiBTdGF0aWMtLWVpdGhlciBmaWxlIHN0YXRpYyBvciBmdW5jdGlvbiBzdGF0aWMsIGRlcGVuZGluZyB1cG9uIHRoZQotICAgICBuYW1lc3BhY2UgaXMuICAqLwotICBERUJVR19MSU5LQUdFX1NUQVRJQywKLSAgLyogR2xvYmFsLiAgKi8KLSAgREVCVUdfTElOS0FHRV9HTE9CQUwsCi0gIC8qIE5vIGxpbmthZ2UuICAqLwotICBERUJVR19MSU5LQUdFX05PTkUKLX07Ci0KLS8qIEEgbmFtZSBpbiBhIG5hbWVzcGFjZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19uYW1lCi17Ci0gIC8qIE5leHQgbmFtZSBpbiB0aGlzIG5hbWVzcGFjZS4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuZXh0OwotICAvKiBOYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogTWFyay4gIFRoaXMgaXMgdXNlZCBieSBkZWJ1Z193cml0ZS4gICovCi0gIHVuc2lnbmVkIGludCBtYXJrOwotICAvKiBLaW5kIG9mIG9iamVjdC4gICovCi0gIGVudW0gZGVidWdfb2JqZWN0X2tpbmQga2luZDsKLSAgLyogTGlua2FnZSBvZiBvYmplY3QuICAqLwotICBlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlIGxpbmthZ2U7Ci0gIC8qIFRhZ2dlZCB1bmlvbiB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdC4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogREVCVUdfT0JKRUNUX1RZUEUuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci0gICAgICAvKiBERUJVR19PQkpFQ1RfVEFHLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0YWc7Ci0gICAgICAvKiBERUJVR19PQkpFQ1RfVkFSSUFCTEUuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3ZhcmlhYmxlICp2YXJpYWJsZTsKLSAgICAgIC8qIERFQlVHX09CSkVDVF9GVU5DVElPTi4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfZnVuY3Rpb24gKmZ1bmN0aW9uOwotICAgICAgLyogREVCVUdfT0JKRUNUX0lOVF9DT05TVEFOVC4gICovCi0gICAgICBiZmRfdm1hIGludF9jb25zdGFudDsKLSAgICAgIC8qIERFQlVHX09CSkVDVF9GTE9BVF9DT05TVEFOVC4gICovCi0gICAgICBkb3VibGUgZmxvYXRfY29uc3RhbnQ7Ci0gICAgICAvKiBERUJVR19PQkpFQ1RfVFlQRURfQ09OU1RBTlQuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGVkX2NvbnN0YW50ICp0eXBlZF9jb25zdGFudDsKLSAgICB9IHU7Ci19OwotCi0vKiBEdXJpbmcgZGVidWdfd3JpdGUsIGEgbGlua2VkIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyB1c2VkIHRvCi0gICBrZWVwIHRyYWNrIG9mIElEIG51bWJlcnMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQgdG8gY2xhc3Nlcy4gICovCi0KLXN0cnVjdCBkZWJ1Z19jbGFzc19pZAotewotICAvKiBOZXh0IElEIG51bWJlci4gICovCi0gIHN0cnVjdCBkZWJ1Z19jbGFzc19pZCAqbmV4dDsKLSAgLyogVGhlIHR5cGUgd2l0aCB0aGUgSUQuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLSAgLyogVGhlIHRhZzsgTlVMTCBpZiBubyB0YWcuICAqLwotICBjb25zdCBjaGFyICp0YWc7Ci19OwotCi0vKiBEdXJpbmcgZGVidWdfdHlwZV9zYW1lcCwgYSBsaW5rZWQgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzIGtlcHQKLSAgIG9uIHRoZSBzdGFjayB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24uICAqLwotCi1zdHJ1Y3QgZGVidWdfdHlwZV9jb21wYXJlX2xpc3QKLXsKLSAgLyogTmV4dCB0eXBlIG9uIGxpc3QuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZV9jb21wYXJlX2xpc3QgKm5leHQ7Ci0gIC8qIFRoZSB0eXBlcyB3ZSBhcmUgY29tcGFyaW5nLiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQxOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDI7Ci19OwotCi0vKiBEdXJpbmcgZGVidWdfZ2V0X3JlYWxfdHlwZSwgYSBsaW5rZWQgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzCi0gICBrZXB0IG9uIHRoZSBzdGFjayB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24uICAqLwotCi1zdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3QKLXsKLSAgLyogTmV4dCB0eXBlIG9uIGxpc3QuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3QgKm5leHQ7Ci0gIC8qIFRoZSB0eXBlIHdlIGFyZSBjaGVja2luZy4gICovCi0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotfTsKLQotLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQgZGVidWdfZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGRlYnVnX25hbWUgKmRlYnVnX2FkZF90b19uYW1lc3BhY2UKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICoqLCBjb25zdCBjaGFyICosCi0JICAgZW51bSBkZWJ1Z19vYmplY3Rfa2luZCwgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSkpOwotc3RhdGljIHN0cnVjdCBkZWJ1Z19uYW1lICpkZWJ1Z19hZGRfdG9fY3VycmVudF9uYW1lc3BhY2UKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfb2JqZWN0X2tpbmQsCi0JICAgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSkpOwotc3RhdGljIHN0cnVjdCBkZWJ1Z190eXBlICpkZWJ1Z19tYWtlX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBlbnVtIGRlYnVnX3R5cGVfa2luZCwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGRlYnVnX3R5cGUgKmRlYnVnX2dldF9yZWFsX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBzdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3QgKikpOwotc3RhdGljIGJvb2xlYW4gZGVidWdfd3JpdGVfbmFtZQotICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKiwgUFRSLAotCSAgIHN0cnVjdCBkZWJ1Z19uYW1lICopKTsKLXN0YXRpYyBib29sZWFuIGRlYnVnX3dyaXRlX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUiwKLQkgICBzdHJ1Y3QgZGVidWdfdHlwZSAqLCBzdHJ1Y3QgZGVidWdfbmFtZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z193cml0ZV9jbGFzc190eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqLCBQVFIsCi0JICAgc3RydWN0IGRlYnVnX3R5cGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z193cml0ZV9mdW5jdGlvbgotICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKiwgUFRSLAotCSAgIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSwgc3RydWN0IGRlYnVnX2Z1bmN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGRlYnVnX3dyaXRlX2Jsb2NrCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqLCBQVFIsCi0JICAgc3RydWN0IGRlYnVnX2Jsb2NrICopKTsKLXN0YXRpYyBib29sZWFuIGRlYnVnX3dyaXRlX2xpbmVub3MKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUiwKLQkgICBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z19zZXRfY2xhc3NfaWQKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIHN0cnVjdCBkZWJ1Z190eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGRlYnVnX3R5cGVfc2FtZXAKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBzdHJ1Y3QgZGVidWdfdHlwZSAqLCBzdHJ1Y3QgZGVidWdfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z19jbGFzc190eXBlX3NhbWVwCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgc3RydWN0IGRlYnVnX3R5cGUgKiwgc3RydWN0IGRlYnVnX3R5cGUgKikpOwotDAotLyogSXNzdWUgYW4gZXJyb3IgbWVzc2FnZS4gICovCi0KLXN0YXRpYyB2b2lkCi1kZWJ1Z19lcnJvciAobWVzc2FnZSkKLSAgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXNcbiIsIG1lc3NhZ2UpOwotfQotCi0vKiBBZGQgYW4gb2JqZWN0IHRvIGEgbmFtZXNwYWNlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBkZWJ1Z19uYW1lICoKLWRlYnVnX2FkZF90b19uYW1lc3BhY2UgKGluZm8sIG5zcCwgbmFtZSwga2luZCwgbGlua2FnZSkKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqKm5zcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z19vYmplY3Rfa2luZCBraW5kOwotICAgICBlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlIGxpbmthZ2U7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotICBzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICpuczsKLQotICBuID0gKHN0cnVjdCBkZWJ1Z19uYW1lICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gIG1lbXNldCAobiwgMCwgc2l6ZW9mICpuKTsKLQotICBuLT5uYW1lID0gbmFtZTsKLSAgbi0+a2luZCA9IGtpbmQ7Ci0gIG4tPmxpbmthZ2UgPSBsaW5rYWdlOwotCi0gIG5zID0gKm5zcDsKLSAgaWYgKG5zID09IE5VTEwpCi0gICAgewotICAgICAgbnMgPSAoc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqKSB4bWFsbG9jIChzaXplb2YgKm5zKTsKLSAgICAgIG1lbXNldCAobnMsIDAsIHNpemVvZiAqbnMpOwotCi0gICAgICBucy0+dGFpbCA9ICZucy0+bGlzdDsKLQotICAgICAgKm5zcCA9IG5zOwotICAgIH0KLQotICAqbnMtPnRhaWwgPSBuOwotICBucy0+dGFpbCA9ICZuLT5uZXh0OwotCi0gIHJldHVybiBuOwotfQotCi0vKiBBZGQgYW4gb2JqZWN0IHRvIHRoZSBjdXJyZW50IG5hbWVzcGFjZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZGVidWdfbmFtZSAqCi1kZWJ1Z19hZGRfdG9fY3VycmVudF9uYW1lc3BhY2UgKGluZm8sIG5hbWUsIGtpbmQsIGxpbmthZ2UpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGVudW0gZGVidWdfb2JqZWN0X2tpbmQga2luZDsKLSAgICAgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSBsaW5rYWdlOwotewotICBzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICoqbnNwOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTAotICAgICAgfHwgaW5mby0+Y3VycmVudF9maWxlID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX2FkZF90b19jdXJyZW50X25hbWVzcGFjZTogbm8gY3VycmVudCBmaWxlIikpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChpbmZvLT5jdXJyZW50X2Jsb2NrICE9IE5VTEwpCi0gICAgbnNwID0gJmluZm8tPmN1cnJlbnRfYmxvY2stPmxvY2FsczsKLSAgZWxzZQotICAgIG5zcCA9ICZpbmZvLT5jdXJyZW50X2ZpbGUtPmdsb2JhbHM7Ci0KLSAgcmV0dXJuIGRlYnVnX2FkZF90b19uYW1lc3BhY2UgKGluZm8sIG5zcCwgbmFtZSwga2luZCwgbGlua2FnZSk7Ci19Ci0MCi0vKiBSZXR1cm4gYSBoYW5kbGUgZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLVBUUgotZGVidWdfaW5pdCAoKQotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICpyZXQ7Ci0KLSAgcmV0ID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgeG1hbGxvYyAoc2l6ZW9mICpyZXQpOwotICBtZW1zZXQgKHJldCwgMCwgc2l6ZW9mICpyZXQpOwotICByZXR1cm4gKFBUUikgcmV0OwotfQotCi0vKiBTZXQgdGhlIHNvdXJjZSBmaWxlbmFtZS4gIFRoaXMgaW1wbGljaXRseSBzdGFydHMgYSBuZXcgY29tcGlsYXRpb24KLSAgIHVuaXQuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19zZXRfZmlsZW5hbWUgKGhhbmRsZSwgbmFtZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX2ZpbGUgKm5maWxlOwotICBzdHJ1Y3QgZGVidWdfdW5pdCAqbnVuaXQ7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICBuYW1lID0gIiI7Ci0KLSAgbmZpbGUgPSAoc3RydWN0IGRlYnVnX2ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mICpuZmlsZSk7Ci0gIG1lbXNldCAobmZpbGUsIDAsIHNpemVvZiAqbmZpbGUpOwotCi0gIG5maWxlLT5maWxlbmFtZSA9IG5hbWU7Ci0KLSAgbnVuaXQgPSAoc3RydWN0IGRlYnVnX3VuaXQgKikgeG1hbGxvYyAoc2l6ZW9mICpudW5pdCk7Ci0gIG1lbXNldCAobnVuaXQsIDAsIHNpemVvZiAqbnVuaXQpOwotCi0gIG51bml0LT5maWxlcyA9IG5maWxlOwotICBpbmZvLT5jdXJyZW50X2ZpbGUgPSBuZmlsZTsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ICE9IE5VTEwpCi0gICAgaW5mby0+Y3VycmVudF91bml0LT5uZXh0ID0gbnVuaXQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc3NlcnQgKGluZm8tPnVuaXRzID09IE5VTEwpOwotICAgICAgaW5mby0+dW5pdHMgPSBudW5pdDsKLSAgICB9Ci0KLSAgaW5mby0+Y3VycmVudF91bml0ID0gbnVuaXQ7Ci0KLSAgaW5mby0+Y3VycmVudF9mdW5jdGlvbiA9IE5VTEw7Ci0gIGluZm8tPmN1cnJlbnRfYmxvY2sgPSBOVUxMOwotICBpbmZvLT5jdXJyZW50X2xpbmVubyA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENoYW5nZSBzb3VyY2UgZmlsZXMgdG8gdGhlIGdpdmVuIGZpbGUgbmFtZS4gIFRoaXMgaXMgdXNlZCBmb3IKLSAgIGluY2x1ZGUgZmlsZXMgaW4gYSBzaW5nbGUgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3N0YXJ0X3NvdXJjZSAoaGFuZGxlLCBuYW1lKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfZmlsZSAqZiwgKipwZjsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIG5hbWUgPSAiIjsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3N0YXJ0X3NvdXJjZTogbm8gZGVidWdfc2V0X2ZpbGVuYW1lIGNhbGwiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGZvciAoZiA9IGluZm8tPmN1cnJlbnRfdW5pdC0+ZmlsZXM7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgewotICAgICAgaWYgKGYtPmZpbGVuYW1lWzBdID09IG5hbWVbMF0KLQkgICYmIGYtPmZpbGVuYW1lWzFdID09IG5hbWVbMV0KLQkgICYmIHN0cmNtcCAoZi0+ZmlsZW5hbWUsIG5hbWUpID09IDApCi0JewotCSAgaW5mby0+Y3VycmVudF9maWxlID0gZjsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgZiA9IChzdHJ1Y3QgZGVidWdfZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKmYpOwotICBtZW1zZXQgKGYsIDAsIHNpemVvZiAqZik7Ci0KLSAgZi0+ZmlsZW5hbWUgPSBuYW1lOwotCi0gIGZvciAocGYgPSAmaW5mby0+Y3VycmVudF9maWxlLT5uZXh0OwotICAgICAgICpwZiAhPSBOVUxMOwotICAgICAgIHBmID0gJigqcGYpLT5uZXh0KQotICAgIDsKLSAgKnBmID0gZjsKLQotICBpbmZvLT5jdXJyZW50X2ZpbGUgPSBmOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWNvcmQgYSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgVGhpcyBpbXBsaWNpdGx5IHN0YXJ0cyBhIGZ1bmN0aW9uCi0gICBibG9jay4gIFRoZSBkZWJ1Z190eXBlIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4gdmFsdWUuCi0gICBUaGUgYm9vbGVhbiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZnVuY3Rpb24gaXMgZ2xvYmFsbHkgdmlzaWJsZS4KLSAgIFRoZSBiZmRfdm1hIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICBDdXJyZW50bHkKLSAgIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIHNwZWNpZmllZCBieSBjYWxscyB0bwotICAgZGVidWdfcmVjb3JkX3BhcmFtZXRlci4gIEZJWE1FOiBUaGVyZSBpcyBubyB3YXkgdG8gc3BlY2lmeSBuZXN0ZWQKLSAgIGZ1bmN0aW9ucy4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF9mdW5jdGlvbiAoaGFuZGxlLCBuYW1lLCByZXR1cm5fdHlwZSwgZ2xvYmFsLCBhZGRyKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHJldHVybl90eXBlOwotICAgICBib29sZWFuIGdsb2JhbDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfZnVuY3Rpb24gKmY7Ci0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqYjsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICBuYW1lID0gIiI7Ci0gIGlmIChyZXR1cm5fdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3JlY29yZF9mdW5jdGlvbjogbm8gZGVidWdfc2V0X2ZpbGVuYW1lIGNhbGwiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGYgPSAoc3RydWN0IGRlYnVnX2Z1bmN0aW9uICopIHhtYWxsb2MgKHNpemVvZiAqZik7Ci0gIG1lbXNldCAoZiwgMCwgc2l6ZW9mICpmKTsKLQotICBmLT5yZXR1cm5fdHlwZSA9IHJldHVybl90eXBlOwotCi0gIGIgPSAoc3RydWN0IGRlYnVnX2Jsb2NrICopIHhtYWxsb2MgKHNpemVvZiAqYik7Ci0gIG1lbXNldCAoYiwgMCwgc2l6ZW9mICpiKTsKLQotICBiLT5zdGFydCA9IGFkZHI7Ci0gIGItPmVuZCA9IChiZmRfdm1hKSAtMTsKLQotICBmLT5ibG9ja3MgPSBiOwotCi0gIGluZm8tPmN1cnJlbnRfZnVuY3Rpb24gPSBmOwotICBpbmZvLT5jdXJyZW50X2Jsb2NrID0gYjsKLQotICAvKiBGSVhNRTogSWYgd2UgY291bGQgaGFuZGxlIG5lc3RlZCBmdW5jdGlvbnMsIHRoaXMgd291bGQgYmUgdGhlCi0gICAgIHBsYWNlOiB3ZSB3b3VsZCB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBuYW1lc3BhY2UuICAqLwotICBuID0gZGVidWdfYWRkX3RvX25hbWVzcGFjZSAoaW5mbywKLQkJCSAgICAgICZpbmZvLT5jdXJyZW50X2ZpbGUtPmdsb2JhbHMsCi0JCQkgICAgICBuYW1lLAotCQkJICAgICAgREVCVUdfT0JKRUNUX0ZVTkNUSU9OLAotCQkJICAgICAgKGdsb2JhbAotCQkJICAgICAgID8gREVCVUdfTElOS0FHRV9HTE9CQUwKLQkJCSAgICAgICA6IERFQlVHX0xJTktBR0VfU1RBVElDKSk7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG4tPnUuZnVuY3Rpb24gPSBmOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWNvcmQgYSBwYXJhbWV0ZXIgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KLQotYm9vbGVhbgotZGVidWdfcmVjb3JkX3BhcmFtZXRlciAoaGFuZGxlLCBuYW1lLCB0eXBlLCBraW5kLCB2YWwpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgZW51bSBkZWJ1Z19wYXJtX2tpbmQga2luZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19wYXJhbWV0ZXIgKnAsICoqcHA7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCB8fCB0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTAotICAgICAgfHwgaW5mby0+Y3VycmVudF9mdW5jdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyOiBubyBjdXJyZW50IGZ1bmN0aW9uIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBwID0gKHN0cnVjdCBkZWJ1Z19wYXJhbWV0ZXIgKikgeG1hbGxvYyAoc2l6ZW9mICpwKTsKLSAgbWVtc2V0IChwLCAwLCBzaXplb2YgKnApOwotCi0gIHAtPm5hbWUgPSBuYW1lOwotICBwLT50eXBlID0gdHlwZTsKLSAgcC0+a2luZCA9IGtpbmQ7Ci0gIHAtPnZhbCA9IHZhbDsKLQotICBmb3IgKHBwID0gJmluZm8tPmN1cnJlbnRfZnVuY3Rpb24tPnBhcmFtZXRlcnM7Ci0gICAgICAgKnBwICE9IE5VTEw7Ci0gICAgICAgcHAgPSAmKCpwcCktPm5leHQpCi0gICAgOwotICAqcHAgPSBwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBFbmQgYSBmdW5jdGlvbi4gIEZJWE1FOiBUaGlzIHNob3VsZCBoYW5kbGUgZnVuY3Rpb24gbmVzdGluZy4gICovCi0KLWJvb2xlYW4KLWRlYnVnX2VuZF9mdW5jdGlvbiAoaGFuZGxlLCBhZGRyKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMCi0gICAgICB8fCBpbmZvLT5jdXJyZW50X2Jsb2NrID09IE5VTEwKLSAgICAgIHx8IGluZm8tPmN1cnJlbnRfZnVuY3Rpb24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfZW5kX2Z1bmN0aW9uOiBubyBjdXJyZW50IGZ1bmN0aW9uIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoaW5mby0+Y3VycmVudF9ibG9jay0+cGFyZW50ICE9IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX2VuZF9mdW5jdGlvbjogc29tZSBibG9ja3Mgd2VyZSBub3QgY2xvc2VkIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvLT5jdXJyZW50X2Jsb2NrLT5lbmQgPSBhZGRyOwotCi0gIGluZm8tPmN1cnJlbnRfZnVuY3Rpb24gPSBOVUxMOwotICBpbmZvLT5jdXJyZW50X2Jsb2NrID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgYSBibG9jayBpbiBhIGZ1bmN0aW9uLiAgQWxsIGxvY2FsIGluZm9ybWF0aW9uIHdpbGwgYmUKLSAgIHJlY29yZGVkIGluIHRoaXMgYmxvY2ssIHVudGlsIHRoZSBtYXRjaGluZyBjYWxsIHRvIGRlYnVnX2VuZF9ibG9jay4KLSAgIGRlYnVnX3N0YXJ0X2Jsb2NrIGFuZCBkZWJ1Z19lbmRfYmxvY2sgbWF5IGJlIG5lc3RlZC4gIFRoZSBiZmRfdm1hCi0gICBhcmd1bWVudCBpcyB0aGUgYWRkcmVzcyBhdCB3aGljaCB0aGlzIGJsb2NrIHN0YXJ0cy4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3N0YXJ0X2Jsb2NrIChoYW5kbGUsIGFkZHIpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpiLCAqKnBiOwotCi0gIC8qIFdlIG11c3QgYWx3YXlzIGhhdmUgYSBjdXJyZW50IGJsb2NrOiBkZWJ1Z19yZWNvcmRfZnVuY3Rpb24gc2V0cwotICAgICBvbmUgdXAuICAqLwotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwKLSAgICAgIHx8IGluZm8tPmN1cnJlbnRfYmxvY2sgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfc3RhcnRfYmxvY2s6IG5vIGN1cnJlbnQgYmxvY2siKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGIgPSAoc3RydWN0IGRlYnVnX2Jsb2NrICopIHhtYWxsb2MgKHNpemVvZiAqYik7Ci0gIG1lbXNldCAoYiwgMCwgc2l6ZW9mICpiKTsKLQotICBiLT5wYXJlbnQgPSBpbmZvLT5jdXJyZW50X2Jsb2NrOwotICBiLT5zdGFydCA9IGFkZHI7Ci0gIGItPmVuZCA9IChiZmRfdm1hKSAtMTsKLQotICAvKiBUaGlzIG5ldyBibG9jayBpcyBhIGNoaWxkIG9mIHRoZSBjdXJyZW50IGJsb2NrLiAgKi8KLSAgZm9yIChwYiA9ICZpbmZvLT5jdXJyZW50X2Jsb2NrLT5jaGlsZHJlbjsKLSAgICAgICAqcGIgIT0gTlVMTDsKLSAgICAgICBwYiA9ICYoKnBiKS0+bmV4dCkKLSAgICA7Ci0gICpwYiA9IGI7Ci0KLSAgaW5mby0+Y3VycmVudF9ibG9jayA9IGI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCBhIGJsb2NrIGluIGEgZnVuY3Rpb24uICBUaGlzIG1hdGNoZXMgdGhlIGNhbGwgdG8KLSAgIGRlYnVnX3N0YXJ0X2Jsb2NrLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoaXMgYmxvY2sKLSAgIGVuZHMuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19lbmRfYmxvY2sgKGhhbmRsZSwgYWRkcikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKnBhcmVudDsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwKLSAgICAgIHx8IGluZm8tPmN1cnJlbnRfYmxvY2sgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfZW5kX2Jsb2NrOiBubyBjdXJyZW50IGJsb2NrIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBwYXJlbnQgPSBpbmZvLT5jdXJyZW50X2Jsb2NrLT5wYXJlbnQ7Ci0gIGlmIChwYXJlbnQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfZW5kX2Jsb2NrOiBhdHRlbXB0IHRvIGNsb3NlIHRvcCBsZXZlbCBibG9jayIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaW5mby0+Y3VycmVudF9ibG9jay0+ZW5kID0gYWRkcjsKLQotICBpbmZvLT5jdXJyZW50X2Jsb2NrID0gcGFyZW50OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBc3NvY2lhdGUgYSBsaW5lIG51bWJlciBpbiB0aGUgY3VycmVudCBzb3VyY2UgZmlsZSBhbmQgZnVuY3Rpb24KLSAgIHdpdGggYSBnaXZlbiBhZGRyZXNzLiAgKi8KLQotYm9vbGVhbgotZGVidWdfcmVjb3JkX2xpbmUgKGhhbmRsZSwgbGluZW5vLCBhZGRyKQotICAgICBQVFIgaGFuZGxlOwotICAgICB1bnNpZ25lZCBsb25nIGxpbmVubzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfbGluZW5vICpsOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3JlY29yZF9saW5lOiBubyBjdXJyZW50IHVuaXQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGwgPSBpbmZvLT5jdXJyZW50X2xpbmVubzsKLSAgaWYgKGwgIT0gTlVMTCAmJiBsLT5maWxlID09IGluZm8tPmN1cnJlbnRfZmlsZSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgREVCVUdfTElORU5PX0NPVU5UOyBpKyspCi0JewotCSAgaWYgKGwtPmxpbmVub3NbaV0gPT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotCSAgICB7Ci0JICAgICAgbC0+bGluZW5vc1tpXSA9IGxpbmVubzsKLQkgICAgICBsLT5hZGRyc1tpXSA9IGFkZHI7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGdldCBoZXJlLCB0aGVuIGVpdGhlciAxKSB0aGVyZSBpcyBubyBjdXJyZW50X2xpbmVubwotICAgICBzdHJ1Y3R1cmUsIHdoaWNoIG1lYW5zIHRoaXMgaXMgdGhlIGZpcnN0IGxpbmUgbnVtYmVyIGluIHRoaXMKLSAgICAgY29tcGlsYXRpb24gdW5pdCwgMikgdGhlIGN1cnJlbnRfbGluZW5vIHN0cnVjdHVyZSBpcyBmb3IgYQotICAgICBkaWZmZXJlbnQgZmlsZSwgb3IgMykgdGhlIGN1cnJlbnRfbGluZW5vIHN0cnVjdHVyZSBpcyBmdWxsLgotICAgICBSZWdhcmRsZXNzLCB3ZSB3YW50IHRvIGFsbG9jYXRlIGEgbmV3IGRlYnVnX2xpbmVubyBzdHJ1Y3R1cmUsIHB1dAotICAgICBpdCBpbiB0aGUgcmlnaHQgcGxhY2UsIGFuZCBtYWtlIGl0IHRoZSBuZXcgY3VycmVudF9saW5lbm8KLSAgICAgc3RydWN0dXJlLiAgKi8KLQotICBsID0gKHN0cnVjdCBkZWJ1Z19saW5lbm8gKikgeG1hbGxvYyAoc2l6ZW9mICpsKTsKLSAgbWVtc2V0IChsLCAwLCBzaXplb2YgKmwpOwotCi0gIGwtPmZpbGUgPSBpbmZvLT5jdXJyZW50X2ZpbGU7Ci0gIGwtPmxpbmVub3NbMF0gPSBsaW5lbm87Ci0gIGwtPmFkZHJzWzBdID0gYWRkcjsKLSAgZm9yIChpID0gMTsgaSA8IERFQlVHX0xJTkVOT19DT1VOVDsgaSsrKQotICAgIGwtPmxpbmVub3NbaV0gPSAodW5zaWduZWQgbG9uZykgLTE7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfbGluZW5vICE9IE5VTEwpCi0gICAgaW5mby0+Y3VycmVudF9saW5lbm8tPm5leHQgPSBsOwotICBlbHNlCi0gICAgaW5mby0+Y3VycmVudF91bml0LT5saW5lbm9zID0gbDsKLQotICBpbmZvLT5jdXJyZW50X2xpbmVubyA9IGw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGEgbmFtZWQgY29tbW9uIGJsb2NrLiAgVGhpcyBpcyBhIGJsb2NrIG9mIHZhcmlhYmxlcyB0aGF0IG1heQotICAgbW92ZSBpbiBtZW1vcnkuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19zdGFydF9jb21tb25fYmxvY2sgKGhhbmRsZSwgbmFtZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgLyogRklYTUUgKi8KLSAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3N0YXJ0X2NvbW1vbl9ibG9jazogbm90IGltcGxlbWVudGVkIikpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEVuZCBhIG5hbWVkIGNvbW1vbiBibG9jay4gICovCi0KLWJvb2xlYW4KLWRlYnVnX2VuZF9jb21tb25fYmxvY2sgKGhhbmRsZSwgbmFtZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgLyogRklYTUUgKi8KLSAgZGVidWdfZXJyb3IgKF8oImRlYnVnX2VuZF9jb21tb25fYmxvY2s6IG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWNvcmQgYSBuYW1lZCBpbnRlZ2VyIGNvbnN0YW50LiAgKi8KLQotYm9vbGVhbgotZGVidWdfcmVjb3JkX2ludF9jb25zdCAoaGFuZGxlLCBuYW1lLCB2YWwpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuID0gZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlIChpbmZvLCBuYW1lLCBERUJVR19PQkpFQ1RfSU5UX0NPTlNUQU5ULAotCQkJCSAgICAgIERFQlVHX0xJTktBR0VfTk9ORSk7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG4tPnUuaW50X2NvbnN0YW50ID0gdmFsOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWNvcmQgYSBuYW1lZCBmbG9hdGluZyBwb2ludCBjb25zdGFudC4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF9mbG9hdF9jb25zdCAoaGFuZGxlLCBuYW1lLCB2YWwpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRvdWJsZSB2YWw7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG4gPSBkZWJ1Z19hZGRfdG9fY3VycmVudF9uYW1lc3BhY2UgKGluZm8sIG5hbWUsIERFQlVHX09CSkVDVF9GTE9BVF9DT05TVEFOVCwKLQkJCQkgICAgICBERUJVR19MSU5LQUdFX05PTkUpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuLT51LmZsb2F0X2NvbnN0YW50ID0gdmFsOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWNvcmQgYSB0eXBlZCBjb25zdGFudCB3aXRoIGFuIGludGVncmFsIHZhbHVlLiAgKi8KLQotYm9vbGVhbgotZGVidWdfcmVjb3JkX3R5cGVkX2NvbnN0IChoYW5kbGUsIG5hbWUsIHR5cGUsIHZhbCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0gIHN0cnVjdCBkZWJ1Z190eXBlZF9jb25zdGFudCAqdGM7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCB8fCB0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG4gPSBkZWJ1Z19hZGRfdG9fY3VycmVudF9uYW1lc3BhY2UgKGluZm8sIG5hbWUsIERFQlVHX09CSkVDVF9UWVBFRF9DT05TVEFOVCwKLQkJCQkgICAgICBERUJVR19MSU5LQUdFX05PTkUpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICB0YyA9IChzdHJ1Y3QgZGVidWdfdHlwZWRfY29uc3RhbnQgKikgeG1hbGxvYyAoc2l6ZW9mICp0Yyk7Ci0gIG1lbXNldCAodGMsIDAsIHNpemVvZiAqdGMpOwotCi0gIHRjLT50eXBlID0gdHlwZTsKLSAgdGMtPnZhbCA9IHZhbDsKLQotICBuLT51LnR5cGVkX2NvbnN0YW50ID0gdGM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlY29yZCBhIGxhYmVsLiAgKi8KLQotYm9vbGVhbgotZGVidWdfcmVjb3JkX2xhYmVsIChoYW5kbGUsIG5hbWUsIHR5cGUsIGFkZHIpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICAvKiBGSVhNRS4gICovCi0gIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19yZWNvcmRfbGFiZWwgbm90IGltcGxlbWVudGVkIikpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJlY29yZCBhIHZhcmlhYmxlLiAgKi8KLQotYm9vbGVhbgotZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChoYW5kbGUsIG5hbWUsIHR5cGUsIGtpbmQsIHZhbCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBlbnVtIGRlYnVnX3Zhcl9raW5kIGtpbmQ7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICoqbnNwOwotICBlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlIGxpbmthZ2U7Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotICBzdHJ1Y3QgZGVidWdfdmFyaWFibGUgKnY7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCB8fCB0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTAotICAgICAgfHwgaW5mby0+Y3VycmVudF9maWxlID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3JlY29yZF92YXJpYWJsZTogbm8gY3VycmVudCBmaWxlIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoa2luZCA9PSBERUJVR19HTE9CQUwgfHwga2luZCA9PSBERUJVR19TVEFUSUMpCi0gICAgewotICAgICAgbnNwID0gJmluZm8tPmN1cnJlbnRfZmlsZS0+Z2xvYmFsczsKLSAgICAgIGlmIChraW5kID09IERFQlVHX0dMT0JBTCkKLQlsaW5rYWdlID0gREVCVUdfTElOS0FHRV9HTE9CQUw7Ci0gICAgICBlbHNlCi0JbGlua2FnZSA9IERFQlVHX0xJTktBR0VfU1RBVElDOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpbmZvLT5jdXJyZW50X2Jsb2NrID09IE5VTEwpCi0JewotCSAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3JlY29yZF92YXJpYWJsZTogbm8gY3VycmVudCBibG9jayIpKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBuc3AgPSAmaW5mby0+Y3VycmVudF9ibG9jay0+bG9jYWxzOwotICAgICAgbGlua2FnZSA9IERFQlVHX0xJTktBR0VfQVVUT01BVElDOwotICAgIH0KLQotICBuID0gZGVidWdfYWRkX3RvX25hbWVzcGFjZSAoaW5mbywgbnNwLCBuYW1lLCBERUJVR19PQkpFQ1RfVkFSSUFCTEUsIGxpbmthZ2UpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICB2ID0gKHN0cnVjdCBkZWJ1Z192YXJpYWJsZSAqKSB4bWFsbG9jIChzaXplb2YgKnYpOwotICBtZW1zZXQgKHYsIDAsIHNpemVvZiAqdik7Ci0KLSAgdi0+a2luZCA9IGtpbmQ7Ci0gIHYtPnR5cGUgPSB0eXBlOwotICB2LT52YWwgPSB2YWw7Ci0KLSAgbi0+dS52YXJpYWJsZSA9IHY7Ci0KLSAgcmV0dXJuIHRydWU7ICAKLX0KLQotLyogTWFrZSBhIHR5cGUgd2l0aCBhIGdpdmVuIGtpbmQgYW5kIHNpemUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBzdHJ1Y3QgZGVidWdfdHlwZSAqCi1kZWJ1Z19tYWtlX3R5cGUgKGluZm8sIGtpbmQsIHNpemUpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLQotICB0ID0gKHN0cnVjdCBkZWJ1Z190eXBlICopIHhtYWxsb2MgKHNpemVvZiAqdCk7Ci0gIG1lbXNldCAodCwgMCwgc2l6ZW9mICp0KTsKLQotICB0LT5raW5kID0ga2luZDsKLSAgdC0+c2l6ZSA9IHNpemU7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYW4gaW5kaXJlY3QgdHlwZSB3aGljaCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBhIHR5cGUKLSAgIHdoaWNoIGlzIHJlZmVyZW5jZWQgYmVmb3JlIGl0IGlzIGRlZmluZWQuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGhhbmRsZSwgc2xvdCwgdGFnKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlICpzbG90OwotICAgICBjb25zdCBjaGFyICp0YWc7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfaW5kaXJlY3RfdHlwZSAqaTsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0lORElSRUNULCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGkgPSAoc3RydWN0IGRlYnVnX2luZGlyZWN0X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICppKTsKLSAgbWVtc2V0IChpLCAwLCBzaXplb2YgKmkpOwotCi0gIGktPnNsb3QgPSBzbG90OwotICBpLT50YWcgPSB0YWc7Ci0KLSAgdC0+dS5raW5kaXJlY3QgPSBpOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgdm9pZCB0eXBlLiAgVGhlcmUgaXMgb25seSBvbmUgb2YgdGhlc2UuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoaGFuZGxlKQotICAgICBQVFIgaGFuZGxlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfVk9JRCwgMCk7Ci19Ci0KLS8qIE1ha2UgYW4gaW50ZWdlciB0eXBlIG9mIGEgZ2l2ZW4gc2l6ZS4gIFRoZSBib29sZWFuIGFyZ3VtZW50IGlzIHRydWUKLSAgIGlmIHRoZSBpbnRlZ2VyIGlzIHVuc2lnbmVkLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9pbnRfdHlwZSAoaGFuZGxlLCBzaXplLCB1bnNpZ25lZHApCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBib29sZWFuIHVuc2lnbmVkcDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9JTlQsIHNpemUpOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdC0+dS5raW50ID0gdW5zaWduZWRwOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgZmxvYXRpbmcgcG9pbnQgdHlwZSBvZiBhIGdpdmVuIHNpemUuICBGSVhNRTogT24gc29tZQotICAgcGxhdGZvcm1zLCBsaWtlIGFuIEFscGhhLCB5b3UgcHJvYmFibHkgbmVlZCB0byBiZSBhYmxlIHRvIHNwZWNpZnkKLSAgIHRoZSBmb3JtYXQuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGhhbmRsZSwgc2l6ZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9GTE9BVCwgc2l6ZSk7Ci19Ci0KLS8qIE1ha2UgYSBib29sZWFuIHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9ib29sX3R5cGUgKGhhbmRsZSwgc2l6ZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9CT09MLCBzaXplKTsKLX0KLQotLyogTWFrZSBhIGNvbXBsZXggdHlwZSBvZiBhIGdpdmVuIHNpemUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2NvbXBsZXhfdHlwZSAoaGFuZGxlLCBzaXplKQotICAgICBQVFIgaGFuZGxlOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLQotICByZXR1cm4gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0NPTVBMRVgsIHNpemUpOwotfQotCi0vKiBNYWtlIGEgc3RydWN0dXJlIHR5cGUuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRydWUgZm9yIGEgc3RydWN0LAotICAgZmFsc2UgZm9yIGEgdW5pb24uICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHNpemUgb2YgdGhlIHN0cnVjdC4KLSAgIFRoZSBmb3VydGggYXJndW1lbnQgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgZmllbGRzLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoaGFuZGxlLCBzdHJ1Y3RwLCBzaXplLCBmaWVsZHMpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgYmZkX3ZtYSBzaXplOwotICAgICBkZWJ1Z19maWVsZCAqZmllbGRzOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUgKmM7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywKLQkJICAgICAgIHN0cnVjdHAgPyBERUJVR19LSU5EX1NUUlVDVCA6IERFQlVHX0tJTkRfVU5JT04sCi0JCSAgICAgICBzaXplKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGMgPSAoc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpjKTsKLSAgbWVtc2V0IChjLCAwLCBzaXplb2YgKmMpOwotCi0gIGMtPmZpZWxkcyA9IGZpZWxkczsKLQotICB0LT51LmtjbGFzcyA9IGM7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYW4gb2JqZWN0IHR5cGUuICBUaGUgZmlyc3QgdGhyZWUgYXJndW1lbnRzIGFmdGVyIHRoZSBoYW5kbGUKLSAgIGFyZSB0aGUgc2FtZSBhcyBmb3IgZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZS4gIFRoZSBuZXh0IGFyZ3VtZW50cyBhcmUKLSAgIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGJhc2UgY2xhc3NlcywgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YKLSAgIG1ldGhvZHMsIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgaG9sZGluZyB0aGUgdmlydHVhbCBmdW5jdGlvbiB0YWJsZQotICAgaWYgaXQgaXMgbm90IHRoaXMgb2JqZWN0LCBhbmQgYSBib29sZWFuIHdoaWNoIGlzIHRydWUgaWYgdGhpcwotICAgb2JqZWN0IGhhcyBpdHMgb3duIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX29iamVjdF90eXBlIChoYW5kbGUsIHN0cnVjdHAsIHNpemUsIGZpZWxkcywgYmFzZWNsYXNzZXMsCi0JCQltZXRob2RzLCB2cHRyYmFzZSwgb3dudnB0cikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYm9vbGVhbiBzdHJ1Y3RwOwotICAgICBiZmRfdm1hIHNpemU7Ci0gICAgIGRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0gICAgIGRlYnVnX2Jhc2VjbGFzcyAqYmFzZWNsYXNzZXM7Ci0gICAgIGRlYnVnX21ldGhvZCAqbWV0aG9kczsKLSAgICAgZGVidWdfdHlwZSB2cHRyYmFzZTsKLSAgICAgYm9vbGVhbiBvd252cHRyOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUgKmM7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywKLQkJICAgICAgIHN0cnVjdHAgPyBERUJVR19LSU5EX0NMQVNTIDogREVCVUdfS0lORF9VTklPTl9DTEFTUywKLQkJICAgICAgIHNpemUpOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgYyA9IChzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmMpOwotICBtZW1zZXQgKGMsIDAsIHNpemVvZiAqYyk7Ci0KLSAgYy0+ZmllbGRzID0gZmllbGRzOwotICBjLT5iYXNlY2xhc3NlcyA9IGJhc2VjbGFzc2VzOwotICBjLT5tZXRob2RzID0gbWV0aG9kczsKLSAgaWYgKG93bnZwdHIpCi0gICAgYy0+dnB0cmJhc2UgPSB0OwotICBlbHNlCi0gICAgYy0+dnB0cmJhc2UgPSB2cHRyYmFzZTsKLQotICB0LT51LmtjbGFzcyA9IGM7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYW4gZW51bWVyYXRpb24gdHlwZS4gIFRoZSBhcmd1bWVudHMgYXJlIGEgbnVsbCB0ZXJtaW5hdGVkCi0gICBhcnJheSBvZiBzdHJpbmdzLCBhbmQgYW4gYXJyYXkgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2VudW1fdHlwZSAoaGFuZGxlLCBuYW1lcywgdmFsdWVzKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICoqbmFtZXM7Ci0gICAgIGJmZF9zaWduZWRfdm1hICp2YWx1ZXM7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfZW51bV90eXBlICplOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfRU5VTSwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBlID0gKHN0cnVjdCBkZWJ1Z19lbnVtX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICplKTsKLSAgbWVtc2V0IChlLCAwLCBzaXplb2YgKmUpOwotCi0gIGUtPm5hbWVzID0gbmFtZXM7Ci0gIGUtPnZhbHVlcyA9IHZhbHVlczsKLQotICB0LT51LmtlbnVtID0gZTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIHBvaW50ZXIgdG8gYSBnaXZlbiB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9wb2ludGVyX3R5cGUgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgaWYgKHR5cGUtPnBvaW50ZXIgIT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHJldHVybiB0eXBlLT5wb2ludGVyOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfUE9JTlRFUiwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0LT51Lmtwb2ludGVyID0gdHlwZTsKLQotICB0eXBlLT5wb2ludGVyID0gdDsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIGZ1bmN0aW9uIHJldHVybmluZyBhIGdpdmVuIHR5cGUuICBGSVhNRTogV2Ugc2hvdWxkIGJlIGFibGUKLSAgIHRvIHJlY29yZCB0aGUgcGFyYW1ldGVyIHR5cGVzLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlIChoYW5kbGUsIHR5cGUsIGFyZ190eXBlcywgdmFyYXJncykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBkZWJ1Z190eXBlICphcmdfdHlwZXM7Ci0gICAgIGJvb2xlYW4gdmFyYXJnczsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbl90eXBlICpmOwotCi0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0ZVTkNUSU9OLCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGYgPSAoc3RydWN0IGRlYnVnX2Z1bmN0aW9uX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpmKTsKLSAgbWVtc2V0IChmLCAwLCBzaXplb2YgKmYpOwotCi0gIGYtPnJldHVybl90eXBlID0gdHlwZTsKLSAgZi0+YXJnX3R5cGVzID0gYXJnX3R5cGVzOwotICBmLT52YXJhcmdzID0gdmFyYXJnczsKLQotICB0LT51LmtmdW5jdGlvbiA9IGY7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSByZWZlcmVuY2UgdG8gYSBnaXZlbiB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9yZWZlcmVuY2VfdHlwZSAoaGFuZGxlLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotCi0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX1JFRkVSRU5DRSwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0LT51LmtyZWZlcmVuY2UgPSB0eXBlOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgcmFuZ2Ugb2YgYSBnaXZlbiB0eXBlIGZyb20gYSBsb3dlciB0byBhbiB1cHBlciBib3VuZC4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfcmFuZ2VfdHlwZSAoaGFuZGxlLCB0eXBlLCBsb3dlciwgdXBwZXIpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYmZkX3NpZ25lZF92bWEgbG93ZXI7Ci0gICAgIGJmZF9zaWduZWRfdm1hIHVwcGVyOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX3JhbmdlX3R5cGUgKnI7Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfUkFOR0UsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgciA9IChzdHJ1Y3QgZGVidWdfcmFuZ2VfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKnIpOwotICBtZW1zZXQgKHIsIDAsIHNpemVvZiAqcik7Ci0KLSAgci0+dHlwZSA9IHR5cGU7Ci0gIHItPmxvd2VyID0gbG93ZXI7Ci0gIHItPnVwcGVyID0gdXBwZXI7Ci0KLSAgdC0+dS5rcmFuZ2UgPSByOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGFuIGFycmF5IHR5cGUuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIGFuIGVsZW1lbnQKLSAgIG9mIHRoZSBhcnJheS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiBhIHJhbmdlIG9mIHRoZQotICAgYXJyYXkuICBUaGUgZm91cnRoIGFuZCBmaWZ0aCBhcmd1bWVudCBhcmUgdGhlIGxvd2VyIGFuZCB1cHBlcgotICAgYm91bmRzLCByZXNwZWN0aXZlbHkuICBUaGUgc2l4dGggYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGlzIGFycmF5IGlzCi0gICBhY3R1YWxseSBhIHN0cmluZywgYXMgaW4gQy4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfYXJyYXlfdHlwZSAoaGFuZGxlLCBlbGVtZW50X3R5cGUsIHJhbmdlX3R5cGUsIGxvd2VyLCB1cHBlciwKLQkJICAgICAgIHN0cmluZ3ApCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgZWxlbWVudF90eXBlOwotICAgICBkZWJ1Z190eXBlIHJhbmdlX3R5cGU7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGxvd2VyOwotICAgICBiZmRfc2lnbmVkX3ZtYSB1cHBlcjsKLSAgICAgYm9vbGVhbiBzdHJpbmdwOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX2FycmF5X3R5cGUgKmE7Ci0KLSAgaWYgKGVsZW1lbnRfdHlwZSA9PSBOVUxMIHx8IHJhbmdlX3R5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfQVJSQVksIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgYSA9IChzdHJ1Y3QgZGVidWdfYXJyYXlfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmEpOwotICBtZW1zZXQgKGEsIDAsIHNpemVvZiAqYSk7Ci0KLSAgYS0+ZWxlbWVudF90eXBlID0gZWxlbWVudF90eXBlOwotICBhLT5yYW5nZV90eXBlID0gcmFuZ2VfdHlwZTsKLSAgYS0+bG93ZXIgPSBsb3dlcjsKLSAgYS0+dXBwZXIgPSB1cHBlcjsKLSAgYS0+c3RyaW5ncCA9IHN0cmluZ3A7Ci0KLSAgdC0+dS5rYXJyYXkgPSBhOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgc2V0IG9mIGEgZ2l2ZW4gdHlwZS4gIEZvciBleGFtcGxlLCBhIFBhc2NhbCBzZXQgdHlwZS4gIFRoZQotICAgYm9vbGVhbiBhcmd1bWVudCBpcyB0cnVlIGlmIHRoaXMgc2V0IGlzIGFjdHVhbGx5IGEgYml0c3RyaW5nLCBhcyBpbgotICAgQ0hJTEwuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX3NldF90eXBlIChoYW5kbGUsIHR5cGUsIGJpdHN0cmluZ3ApCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYm9vbGVhbiBiaXRzdHJpbmdwOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX3NldF90eXBlICpzOwotCi0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX1NFVCwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBzID0gKHN0cnVjdCBkZWJ1Z19zZXRfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKnMpOwotICBtZW1zZXQgKHMsIDAsIHNpemVvZiAqcyk7Ci0KLSAgcy0+dHlwZSA9IHR5cGU7Ci0gIHMtPmJpdHN0cmluZ3AgPSBiaXRzdHJpbmdwOwotCi0gIHQtPnUua3NldCA9IHM7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSB0eXBlIGZvciBhIHBvaW50ZXIgd2hpY2ggaXMgcmVsYXRpdmUgdG8gYW4gb2JqZWN0LiAgVGhlCi0gICBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCB0byB3aGljaCB0aGUgcG9pbnRlciBpcwotICAgcmVsYXRpdmUuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgdGhhdCB0aGUgcG9pbnRlciBwb2ludHMKLSAgIHRvLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9vZmZzZXRfdHlwZSAoaGFuZGxlLCBiYXNlX3R5cGUsIHRhcmdldF90eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIGJhc2VfdHlwZTsKLSAgICAgZGVidWdfdHlwZSB0YXJnZXRfdHlwZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19vZmZzZXRfdHlwZSAqbzsKLQotICBpZiAoYmFzZV90eXBlID09IE5VTEwgfHwgdGFyZ2V0X3R5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfT0ZGU0VULCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIG8gPSAoc3RydWN0IGRlYnVnX29mZnNldF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqbyk7Ci0gIG1lbXNldCAobywgMCwgc2l6ZW9mICpvKTsKLQotICBvLT5iYXNlX3R5cGUgPSBiYXNlX3R5cGU7Ci0gIG8tPnRhcmdldF90eXBlID0gdGFyZ2V0X3R5cGU7Ci0KLSAgdC0+dS5rb2Zmc2V0ID0gbzsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIHR5cGUgZm9yIGEgbWV0aG9kIGZ1bmN0aW9uLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUKLSAgIHJldHVybiB0eXBlLCB0aGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIGRvbWFpbiwgYW5kIHRoZSBmb3VydGgKLSAgIGFyZ3VtZW50IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9tZXRob2RfdHlwZSAoaGFuZGxlLCByZXR1cm5fdHlwZSwgZG9tYWluX3R5cGUsIGFyZ190eXBlcywgdmFyYXJncykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLSAgICAgZGVidWdfdHlwZSBkb21haW5fdHlwZTsKLSAgICAgZGVidWdfdHlwZSAqYXJnX3R5cGVzOwotICAgICBib29sZWFuIHZhcmFyZ3M7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3R5cGUgKm07Ci0KLSAgaWYgKHJldHVybl90eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX01FVEhPRCwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBtID0gKHN0cnVjdCBkZWJ1Z19tZXRob2RfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKm0pOwotICBtZW1zZXQgKG0sIDAsIHNpemVvZiAqbSk7Ci0KLSAgbS0+cmV0dXJuX3R5cGUgPSByZXR1cm5fdHlwZTsKLSAgbS0+ZG9tYWluX3R5cGUgPSBkb21haW5fdHlwZTsKLSAgbS0+YXJnX3R5cGVzID0gYXJnX3R5cGVzOwotICBtLT52YXJhcmdzID0gdmFyYXJnczsKLQotICB0LT51LmttZXRob2QgPSBtOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgY29uc3QgcXVhbGlmaWVkIHZlcnNpb24gb2YgYSBnaXZlbiB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9jb25zdF90eXBlIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfQ09OU1QsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdC0+dS5rY29uc3QgPSB0eXBlOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgdm9sYXRpbGUgcXVhbGlmaWVkIHZlcnNpb24gb2YgYSBnaXZlbiB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV92b2xhdGlsZV90eXBlIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfVk9MQVRJTEUsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdC0+dS5rdm9sYXRpbGUgPSB0eXBlOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGFuIHVuZGVmaW5lZCB0YWdnZWQgdHlwZS4gIEZvciBleGFtcGxlLCBhIHN0cnVjdCB3aGljaCBoYXMKLSAgIGJlZW4gbWVudGlvbmVkLCBidXQgbm90IGRlZmluZWQuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX3VuZGVmaW5lZF90YWdnZWRfdHlwZSAoaGFuZGxlLCBuYW1lLCBraW5kKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgc3dpdGNoIChraW5kKQotICAgIHsKLSAgICBjYXNlIERFQlVHX0tJTkRfU1RSVUNUOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTjoKLSAgICBjYXNlIERFQlVHX0tJTkRfQ0xBU1M6Ci0gICAgY2FzZSBERUJVR19LSU5EX1VOSU9OX0NMQVNTOgotICAgIGNhc2UgREVCVUdfS0lORF9FTlVNOgotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX21ha2VfdW5kZWZpbmVkX3R5cGU6IHVuc3VwcG9ydGVkIGtpbmQiKSk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBraW5kLCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHJldHVybiBkZWJ1Z190YWdfdHlwZSAoaGFuZGxlLCBuYW1lLCB0KTsKLX0KLQotLyogTWFrZSBhIGJhc2UgY2xhc3MgZm9yIGFuIG9iamVjdC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIGJhc2UKLSAgIGNsYXNzIHR5cGUuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIGJpdCBwb3NpdGlvbiBvZiB0aGlzIGJhc2UKLSAgIGNsYXNzIGluIHRoZSBvYmplY3QgKGFsd2F5cyAwIHVubGVzcyBkb2luZyBtdWx0aXBsZSBpbmhlcml0YW5jZSkuCi0gICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzIHdoZXRoZXIgdGhpcyBpcyBhIHZpcnR1YWwgY2xhc3MuICBUaGUgZmlmdGgKLSAgIGFyZ3VtZW50IGlzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBiYXNlIGNsYXNzLiAgKi8KLQotLypBUkdTVVNFRCovCi1kZWJ1Z19iYXNlY2xhc3MKLWRlYnVnX21ha2VfYmFzZWNsYXNzIChoYW5kbGUsIHR5cGUsIGJpdHBvcywgdmlydHVhbCwgdmlzaWJpbGl0eSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgYm9vbGVhbiB2aXJ0dWFsOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsgICAgIAotICBzdHJ1Y3QgZGVidWdfYmFzZWNsYXNzICpiOwotCi0gIGIgPSAoc3RydWN0IGRlYnVnX2Jhc2VjbGFzcyAqKSB4bWFsbG9jIChzaXplb2YgKmIpOwotICBtZW1zZXQgKGIsIDAsIHNpemVvZiAqYik7Ci0KLSAgYi0+dHlwZSA9IHR5cGU7Ci0gIGItPmJpdHBvcyA9IGJpdHBvczsKLSAgYi0+dmlydHVhbCA9IHZpcnR1YWw7Ci0gIGItPnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5OwotCi0gIHJldHVybiBiOwotfQotCi0vKiBNYWtlIGEgZmllbGQgZm9yIGEgc3RydWN0LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgbmFtZS4gIFRoZQotICAgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIGZpZWxkLiAgVGhlIGZvdXJ0aCBhcmd1bWVudCBpcwotICAgdGhlIGJpdCBwb3NpdGlvbiBvZiB0aGUgZmllbGQuICBUaGUgZmlmdGggYXJndW1lbnQgaXMgdGhlIHNpemUgb2YKLSAgIHRoZSBmaWVsZCAoaXQgbWF5IGJlIHplcm8pLiAgVGhlIHNpeHRoIGFyZ3VtZW50IGlzIHRoZSB2aXNpYmlsaXR5Ci0gICBvZiB0aGUgZmllbGQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWRlYnVnX2ZpZWxkCi1kZWJ1Z19tYWtlX2ZpZWxkIChoYW5kbGUsIG5hbWUsIHR5cGUsIGJpdHBvcywgYml0c2l6ZSwgdmlzaWJpbGl0eSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgYmZkX3ZtYSBiaXRzaXplOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IGRlYnVnX2ZpZWxkICpmOwotCi0gIGYgPSAoc3RydWN0IGRlYnVnX2ZpZWxkICopIHhtYWxsb2MgKHNpemVvZiAqZik7Ci0gIG1lbXNldCAoZiwgMCwgc2l6ZW9mICpmKTsKLQotICBmLT5uYW1lID0gbmFtZTsKLSAgZi0+dHlwZSA9IHR5cGU7Ci0gIGYtPnN0YXRpY19tZW1iZXIgPSBmYWxzZTsKLSAgZi0+dS5mLmJpdHBvcyA9IGJpdHBvczsKLSAgZi0+dS5mLmJpdHNpemUgPSBiaXRzaXplOwotICBmLT52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKLQotICByZXR1cm4gZjsKLX0KLQotLyogTWFrZSBhIHN0YXRpYyBtZW1iZXIgb2YgYW4gb2JqZWN0LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUKLSAgIG5hbWUuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIG1lbWJlci4gIFRoZSBmb3VydGgKLSAgIGFyZ3VtZW50IGlzIHRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSBtZW1iZXIgKGkuZS4sIHRoZSBuYW1lIGFzIGEKLSAgIGdsb2JhbCB2YXJpYWJsZSkuICBUaGUgZmlmdGggYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlCi0gICBtZW1iZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLWRlYnVnX2ZpZWxkCi1kZWJ1Z19tYWtlX3N0YXRpY19tZW1iZXIgKGhhbmRsZSwgbmFtZSwgdHlwZSwgcGh5c25hbWUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3QgZGVidWdfZmllbGQgKmY7Ci0KLSAgZiA9IChzdHJ1Y3QgZGVidWdfZmllbGQgKikgeG1hbGxvYyAoc2l6ZW9mICpmKTsKLSAgbWVtc2V0IChmLCAwLCBzaXplb2YgKmYpOwotCi0gIGYtPm5hbWUgPSBuYW1lOwotICBmLT50eXBlID0gdHlwZTsKLSAgZi0+c3RhdGljX21lbWJlciA9IHRydWU7Ci0gIGYtPnUucy5waHlzbmFtZSA9IHBoeXNuYW1lOwotICBmLT52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKLQotICByZXR1cm4gZjsKLX0KLQotLyogTWFrZSBhIG1ldGhvZC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIG5hbWUsIGFuZCB0aGUgdGhpcmQKLSAgIGFyZ3VtZW50IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIG1ldGhvZCB2YXJpYW50cy4gICovCi0KLS8qQVJHU1VTRUQqLwotZGVidWdfbWV0aG9kCi1kZWJ1Z19tYWtlX21ldGhvZCAoaGFuZGxlLCBuYW1lLCB2YXJpYW50cykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKnZhcmlhbnRzOwotewotICBzdHJ1Y3QgZGVidWdfbWV0aG9kICptOwotCi0gIG0gPSAoc3RydWN0IGRlYnVnX21ldGhvZCAqKSB4bWFsbG9jIChzaXplb2YgKm0pOwotICBtZW1zZXQgKG0sIDAsIHNpemVvZiAqbSk7Ci0KLSAgbS0+bmFtZSA9IG5hbWU7Ci0gIG0tPnZhcmlhbnRzID0gdmFyaWFudHM7Ci0KLSAgcmV0dXJuIG07Ci19Ci0KLS8qIE1ha2UgYSBtZXRob2QgYXJndW1lbnQuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSByZWFsIG5hbWUgb2YKLSAgIHRoZSBmdW5jdGlvbi4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24uICBUaGUKLSAgIGZvdXJ0aCBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eS4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB3aGV0aGVyCi0gICB0aGlzIGlzIGEgY29uc3QgZnVuY3Rpb24uICBUaGUgc2l4dGggYXJndW1lbnQgaXMgd2hldGhlciB0aGlzIGlzIGEKLSAgIHZvbGF0aWxlIGZ1bmN0aW9uLiAgVGhlIHNldmVudGggYXJndW1lbnQgaXMgdGhlIG9mZnNldCBpbiB0aGUKLSAgIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUsIGlmIGFueS4gIFRoZSBlaWdodGggYXJndW1lbnQgaXMgdGhlIHZpcnR1YWwKLSAgIGZ1bmN0aW9uIGNvbnRleHQuICBGSVhNRTogQXJlIHRoZSBjb25zdCBhbmQgdm9sYXRpbGUgYXJndW1lbnRzCi0gICBuZWNlc3Nhcnk/ICBDb3VsZCB3ZSBqdXN0IHVzZSBkZWJ1Z19tYWtlX2NvbnN0X3R5cGU/ICAqLwotCi0vKkFSR1NVU0VEKi8KLWRlYnVnX21ldGhvZF92YXJpYW50Ci1kZWJ1Z19tYWtlX21ldGhvZF92YXJpYW50IChoYW5kbGUsIHBoeXNuYW1lLCB0eXBlLCB2aXNpYmlsaXR5LCBjb25zdHAsCi0JCQkgICB2b2xhdGlsZXAsIHZvZmZzZXQsIGNvbnRleHQpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci0gICAgIGJmZF92bWEgdm9mZnNldDsKLSAgICAgZGVidWdfdHlwZSBjb250ZXh0OwotewotICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKm07Ci0KLSAgbSA9IChzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKikgeG1hbGxvYyAoc2l6ZW9mICptKTsKLSAgbWVtc2V0IChtLCAwLCBzaXplb2YgKm0pOwotCi0gIG0tPnBoeXNuYW1lID0gcGh5c25hbWU7Ci0gIG0tPnR5cGUgPSB0eXBlOwotICBtLT52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKLSAgbS0+Y29uc3RwID0gY29uc3RwOwotICBtLT52b2xhdGlsZXAgPSB2b2xhdGlsZXA7Ci0gIG0tPnZvZmZzZXQgPSB2b2Zmc2V0OwotICBtLT5jb250ZXh0ID0gY29udGV4dDsKLQotICByZXR1cm4gbTsKLX0KLQotLyogTWFrZSBhIHN0YXRpYyBtZXRob2QgYXJndW1lbnQuICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IKLSAgIGRlYnVnX21ha2VfbWV0aG9kX3ZhcmlhbnQsIGV4Y2VwdCB0aGF0IHRoZSBsYXN0IHR3byBhcmUgb21pdHRlZAotICAgc2luY2UgYSBzdGF0aWMgbWV0aG9kIGNhbiBub3QgYWxzbyBiZSB2aXJ0dWFsLiAgKi8KLQotZGVidWdfbWV0aG9kX3ZhcmlhbnQKLWRlYnVnX21ha2Vfc3RhdGljX21ldGhvZF92YXJpYW50IChoYW5kbGUsIHBoeXNuYW1lLCB0eXBlLCB2aXNpYmlsaXR5LAotCQkJCSAgY29uc3RwLCB2b2xhdGlsZXApCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqbTsKLQotICBtID0gKHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqKSB4bWFsbG9jIChzaXplb2YgKm0pOwotICBtZW1zZXQgKG0sIDAsIHNpemVvZiAqbSk7Ci0KLSAgbS0+cGh5c25hbWUgPSBwaHlzbmFtZTsKLSAgbS0+dHlwZSA9IHR5cGU7Ci0gIG0tPnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5OwotICBtLT5jb25zdHAgPSBjb25zdHA7Ci0gIG0tPnZvbGF0aWxlcCA9IHZvbGF0aWxlcDsKLSAgbS0+dm9mZnNldCA9IFZPRkZTRVRfU1RBVElDX01FVEhPRDsKLQotICByZXR1cm4gbTsKLX0KLQotLyogTmFtZSBhIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19uYW1lX3R5cGUgKGhhbmRsZSwgbmFtZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX25hbWVkX3R5cGUgKm47Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpubTsKLQotICBpZiAobmFtZSA9PSBOVUxMIHx8IHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTAotICAgICAgfHwgaW5mby0+Y3VycmVudF9maWxlID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX25hbWVfdHlwZTogbm8gY3VycmVudCBmaWxlIikpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9OQU1FRCwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBuID0gKHN0cnVjdCBkZWJ1Z19uYW1lZF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gIG1lbXNldCAobiwgMCwgc2l6ZW9mICpuKTsKLQotICBuLT50eXBlID0gdHlwZTsKLQotICB0LT51LmtuYW1lZCA9IG47Ci0KLSAgLyogV2UgYWx3YXlzIGFkZCB0aGUgbmFtZSB0byB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gIFRoaXMgaXMgcHJvYmFibHkKLSAgICAgd3JvbmcgaW4gc29tZSBjYXNlcywgYnV0IGl0IHNlZW1zIHRvIGJlIHJpZ2h0IGZvciBzdGFicy4gIEZJWE1FLiAgKi8KLQotICBubSA9IGRlYnVnX2FkZF90b19uYW1lc3BhY2UgKGluZm8sICZpbmZvLT5jdXJyZW50X2ZpbGUtPmdsb2JhbHMsIG5hbWUsCi0JCQkgICAgICAgREVCVUdfT0JKRUNUX1RZUEUsIERFQlVHX0xJTktBR0VfTk9ORSk7Ci0gIGlmIChubSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBubS0+dS50eXBlID0gdDsKLQotICBuLT5uYW1lID0gbm07Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIFRhZyBhIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z190YWdfdHlwZSAoaGFuZGxlLCBuYW1lLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfbmFtZWRfdHlwZSAqbjsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm5tOwotCi0gIGlmIChuYW1lID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z190YWdfdHlwZTogbm8gY3VycmVudCBmaWxlIikpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgaWYgKHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9UQUdHRUQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAodHlwZS0+dS5rbmFtZWQtPm5hbWUtPm5hbWUsIG5hbWUpID09IDApCi0JcmV0dXJuIHR5cGU7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfdGFnX3R5cGU6IGV4dHJhIHRhZyBhdHRlbXB0ZWQiKSk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX1RBR0dFRCwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBuID0gKHN0cnVjdCBkZWJ1Z19uYW1lZF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gIG1lbXNldCAobiwgMCwgc2l6ZW9mICpuKTsKLQotICBuLT50eXBlID0gdHlwZTsKLQotICB0LT51LmtuYW1lZCA9IG47Ci0KLSAgLyogV2Uga2VlcCBhIGdsb2JhbCBuYW1lc3BhY2Ugb2YgdGFncyBmb3IgZWFjaCBjb21waWxhdGlvbiB1bml0LiAgSQotICAgICBkb24ndCBrbm93IGlmIHRoYXQgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLiAgKi8KLQotICBubSA9IGRlYnVnX2FkZF90b19uYW1lc3BhY2UgKGluZm8sICZpbmZvLT5jdXJyZW50X2ZpbGUtPmdsb2JhbHMsIG5hbWUsCi0JCQkgICAgICAgREVCVUdfT0JKRUNUX1RBRywgREVCVUdfTElOS0FHRV9OT05FKTsKLSAgaWYgKG5tID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG5tLT51LnRhZyA9IHQ7Ci0KLSAgbi0+bmFtZSA9IG5tOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBSZWNvcmQgdGhlIHNpemUgb2YgYSBnaXZlbiB0eXBlLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1kZWJ1Z19yZWNvcmRfdHlwZV9zaXplIChoYW5kbGUsIHR5cGUsIHNpemUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIGlmICh0eXBlLT5zaXplICE9IDAgJiYgdHlwZS0+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+dS5rdm9sYXRpbGU7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBHZXQgdGhlIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBmaWVsZHMgZm9yIGEgc3RydWN0LCB1bmlvbiwgb3IKLSAgIGNsYXNzLiAgKi8KLQotY29uc3QgZGVidWdfZmllbGQgKgotZGVidWdfZ2V0X2ZpZWxkcyAoaGFuZGxlLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHR5cGUgPSBkZWJ1Z19nZXRfcmVhbF90eXBlIChoYW5kbGUsIHR5cGUsIE5VTEwpOwotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBzd2l0Y2ggKHR5cGUtPmtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICBjYXNlIERFQlVHX0tJTkRfU1RSVUNUOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTjoKLSAgICBjYXNlIERFQlVHX0tJTkRfQ0xBU1M6Ci0gICAgY2FzZSBERUJVR19LSU5EX1VOSU9OX0NMQVNTOgotICAgICAgcmV0dXJuIHR5cGUtPnUua2NsYXNzLT5maWVsZHM7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBHZXQgdGhlIHR5cGUgb2YgYSBmaWVsZC4gICovCi0KLS8qQVJHU1VTRUQqLwotZGVidWdfdHlwZQotZGVidWdfZ2V0X2ZpZWxkX3R5cGUgKGhhbmRsZSwgZmllbGQpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX2ZpZWxkIGZpZWxkOwotewotICBpZiAoZmllbGQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGZpZWxkLT50eXBlOwotfQotCi0vKiBHZXQgdGhlIG5hbWUgb2YgYSBmaWVsZC4gICovCi0KLS8qQVJHU1VTRUQqLwotY29uc3QgY2hhciAqCi1kZWJ1Z19nZXRfZmllbGRfbmFtZSAoaGFuZGxlLCBmaWVsZCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfZmllbGQgZmllbGQ7Ci17Ci0gIGlmIChmaWVsZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gZmllbGQtPm5hbWU7Ci19Ci0KLS8qIEdldCB0aGUgYml0IHBvc2l0aW9uIG9mIGEgZmllbGQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJmZF92bWEKLWRlYnVnX2dldF9maWVsZF9iaXRwb3MgKGhhbmRsZSwgZmllbGQpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX2ZpZWxkIGZpZWxkOwotewotICBpZiAoZmllbGQgPT0gTlVMTCB8fCBmaWVsZC0+c3RhdGljX21lbWJlcikKLSAgICByZXR1cm4gKGJmZF92bWEpIC0xOwotICByZXR1cm4gZmllbGQtPnUuZi5iaXRwb3M7Ci19Ci0KLS8qIEdldCB0aGUgYml0IHNpemUgb2YgYSBmaWVsZC4gICovCi0KLS8qQVJHU1VTRUQqLwotYmZkX3ZtYQotZGVidWdfZ2V0X2ZpZWxkX2JpdHNpemUgKGhhbmRsZSwgZmllbGQpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX2ZpZWxkIGZpZWxkOwotewotICBpZiAoZmllbGQgPT0gTlVMTCB8fCBmaWVsZC0+c3RhdGljX21lbWJlcikKLSAgICByZXR1cm4gKGJmZF92bWEpIC0xOwotICByZXR1cm4gZmllbGQtPnUuZi5iaXRzaXplOwotfQotCi0vKiBHZXQgdGhlIHZpc2liaWxpdHkgb2YgYSBmaWVsZC4gICovCi0KLS8qQVJHU1VTRUQqLwotZW51bSBkZWJ1Z192aXNpYmlsaXR5Ci1kZWJ1Z19nZXRfZmllbGRfdmlzaWJpbGl0eSAoaGFuZGxlLCBmaWVsZCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfZmllbGQgZmllbGQ7Ci17Ci0gIGlmIChmaWVsZCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19WSVNJQklMSVRZX0lHTk9SRTsKLSAgcmV0dXJuIGZpZWxkLT52aXNpYmlsaXR5OwotfQotCi0vKiBHZXQgdGhlIHBoeXNpY2FsIG5hbWUgb2YgYSBmaWVsZC4gICovCi0KLWNvbnN0IGNoYXIgKgotZGVidWdfZ2V0X2ZpZWxkX3BoeXNuYW1lIChoYW5kbGUsIGZpZWxkKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z19maWVsZCBmaWVsZDsKLXsKLSAgaWYgKGZpZWxkID09IE5VTEwgfHwgISBmaWVsZC0+c3RhdGljX21lbWJlcikKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGZpZWxkLT51LnMucGh5c25hbWU7Ci19Ci0MCi0vKiBXcml0ZSBvdXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgZ2l2ZW4gYSBoYW5kbGUgdG8KLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgYW5kIGEgc2V0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGNhbGwuICAqLwotCi1ib29sZWFuCi1kZWJ1Z193cml0ZSAoaGFuZGxlLCBmbnMsIGZoYW5kbGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKmZuczsKLSAgICAgUFRSIGZoYW5kbGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z191bml0ICp1OwotCi0gIC8qIFdlIHVzZSBhIG1hcmsgdG8gdGVsbCB3aGV0aGVyIHdlIGhhdmUgYWxyZWFkeSB3cml0dGVuIG91dCBhCi0gICAgIHBhcnRpY3VsYXIgbmFtZS4gIFdlIHVzZSBhbiBpbnRlZ2VyLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8KLSAgICAgY2xlYXIgdGhlIG1hcmsgZmllbGRzIGlmIHdlIGhhcHBlbiB0byB3cml0ZSBvdXQgdGhlIHNhbWUKLSAgICAgaW5mb3JtYXRpb24gbW9yZSB0aGFuIG9uY2UuICAqLwotICArK2luZm8tPm1hcms7Ci0KLSAgLyogVGhlIGJhc2VfaWQgZmllbGQgaG9sZHMgYW4gSUQgdmFsdWUgd2hpY2ggd2lsbCBuZXZlciBiZSB1c2VkLCBzbwotICAgICB0aGF0IHdlIGNhbiB0ZWxsIHdoZXRoZXIgd2UgaGF2ZSBhc3NpZ25lZCBhbiBJRCBkdXJpbmcgdGhpcyBjYWxsCi0gICAgIHRvIGRlYnVnX3dyaXRlLiAgKi8KLSAgaW5mby0+YmFzZV9pZCA9IGluZm8tPmNsYXNzX2lkOwotCi0gIC8qIFdlIGtlZXAgYSBsaW5rZWQgbGlzdCBvZiBjbGFzc2VzIGZvciB3aGljaCB3YXMgaGF2ZSBhc3NpZ25lZCBJRCdzCi0gICAgIGR1cmluZyB0aGlzIGNhbGwgdG8gZGVidWdfd3JpdGUuICAqLwotICBpbmZvLT5pZF9saXN0ID0gTlVMTDsKLQotICBmb3IgKHUgPSBpbmZvLT51bml0czsgdSAhPSBOVUxMOyB1ID0gdS0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGVidWdfZmlsZSAqZjsKLSAgICAgIGJvb2xlYW4gZmlyc3RfZmlsZTsKLQotICAgICAgaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm8gPSB1LT5saW5lbm9zOwotICAgICAgaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXggPSAwOwotCi0gICAgICBpZiAoISAoKmZucy0+c3RhcnRfY29tcGlsYXRpb25fdW5pdCkgKGZoYW5kbGUsIHUtPmZpbGVzLT5maWxlbmFtZSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBmaXJzdF9maWxlID0gdHJ1ZTsKLSAgICAgIGZvciAoZiA9IHUtPmZpbGVzOyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotCXsKLQkgIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotCi0JICBpZiAoZmlyc3RfZmlsZSkKLQkgICAgZmlyc3RfZmlsZSA9IGZhbHNlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCpmbnMtPnN0YXJ0X3NvdXJjZSkgKGZoYW5kbGUsIGYtPmZpbGVuYW1lKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChmLT5nbG9iYWxzICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBmb3IgKG4gPSBmLT5nbG9iYWxzLT5saXN0OyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCQl7Ci0JCSAgaWYgKCEgZGVidWdfd3JpdGVfbmFtZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBuKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBPdXRwdXQgYW55IGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIHdoaWNoIGhhc24ndCBhbHJlYWR5IGJlZW4KLSAgICAgICAgIGhhbmRsZWQuICAqLwotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfbGluZW5vcyAoaW5mbywgZm5zLCBmaGFuZGxlLCAoYmZkX3ZtYSkgLTEpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBlbGVtZW50IGluIGEgbmFtZXNwYWNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX3dyaXRlX25hbWUgKGluZm8sIGZucywgZmhhbmRsZSwgbikKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqZm5zOwotICAgICBQVFIgZmhhbmRsZTsKLSAgICAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci17Ci0gIHN3aXRjaCAobi0+a2luZCkKLSAgICB7Ci0gICAgY2FzZSBERUJVR19PQkpFQ1RfVFlQRToKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgbi0+dS50eXBlLCBuKQotCSAgfHwgISAoKmZucy0+dHlwZGVmKSAoZmhhbmRsZSwgbi0+bmFtZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBERUJVR19PQkpFQ1RfVEFHOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBuLT51LnRhZywgbikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT50YWcpIChmaGFuZGxlLCBuLT5uYW1lKTsKLSAgICBjYXNlIERFQlVHX09CSkVDVF9WQVJJQUJMRToKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgbi0+dS52YXJpYWJsZS0+dHlwZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPnZhcmlhYmxlKSAoZmhhbmRsZSwgbi0+bmFtZSwgbi0+dS52YXJpYWJsZS0+a2luZCwKLQkJCSAgICAgICBuLT51LnZhcmlhYmxlLT52YWwpOwotICAgIGNhc2UgREVCVUdfT0JKRUNUX0ZVTkNUSU9OOgotICAgICAgcmV0dXJuIGRlYnVnX3dyaXRlX2Z1bmN0aW9uIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4tPm5hbWUsCi0JCQkJICAgbi0+bGlua2FnZSwgbi0+dS5mdW5jdGlvbik7Ci0gICAgY2FzZSBERUJVR19PQkpFQ1RfSU5UX0NPTlNUQU5UOgotICAgICAgcmV0dXJuICgqZm5zLT5pbnRfY29uc3RhbnQpIChmaGFuZGxlLCBuLT5uYW1lLCBuLT51LmludF9jb25zdGFudCk7Ci0gICAgY2FzZSBERUJVR19PQkpFQ1RfRkxPQVRfQ09OU1RBTlQ6Ci0gICAgICByZXR1cm4gKCpmbnMtPmZsb2F0X2NvbnN0YW50KSAoZmhhbmRsZSwgbi0+bmFtZSwgbi0+dS5mbG9hdF9jb25zdGFudCk7Ci0gICAgY2FzZSBERUJVR19PQkpFQ1RfVFlQRURfQ09OU1RBTlQ6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4tPnUudHlwZWRfY29uc3RhbnQtPnR5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT50eXBlZF9jb25zdGFudCkgKGZoYW5kbGUsIG4tPm5hbWUsCi0JCQkJICAgICBuLT51LnR5cGVkX2NvbnN0YW50LT52YWwpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIFdyaXRlIG91dCBhIHR5cGUuICBJZiB0aGUgdHlwZSBpcyBERUJVR19LSU5EX05BTUVEIG9yCi0gICBERUJVR19LSU5EX1RBR0dFRCwgdGhlbiB0aGUgbmFtZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBmb3Igd2hpY2ggd2UKLSAgIGFyZSBhYm91dCB0byBjYWxsIHR5cGVkZWYgb3IgdGFnLiAgSWYgdGhlIHR5cGUgaXMgYW55dGhpbmcgZWxzZSwKLSAgIHRoZW4gdGhlIG5hbWUgYXJndW1lbnQgaXMgYSB0YWcgZnJvbSBhIERFQlVHX0tJTkRfVEFHR0VEIHR5cGUgd2hpY2gKLSAgIHBvaW50cyB0byB0aGlzIG9uZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUsIG5hbWUpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKmZuczsKLSAgICAgUFRSIGZoYW5kbGU7Ci0gICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0eXBlOwotICAgICBzdHJ1Y3QgZGVidWdfbmFtZSAqbmFtZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCBpczsKLSAgY29uc3QgY2hhciAqdGFnOwotCi0gIC8qIElmIHdlIGhhdmUgYSBuYW1lIGZvciB0aGlzIHR5cGUsIGp1c3Qgb3V0cHV0IGl0LiAgV2Ugb25seSBvdXRwdXQKLSAgICAgdHlwZWRlZiBuYW1lcyBhZnRlciB0aGV5IGhhdmUgYmVlbiBkZWZpbmVkLiAgV2Ugb3V0cHV0IHR5cGUgdGFncwotICAgICB3aGVuZXZlciB3ZSBhcmUgbm90IGFjdHVhbGx5IGRlZmluaW5nIHRoZW0uICAqLwotICBpZiAoKHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9OQU1FRAotICAgICAgIHx8IHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9UQUdHRUQpCi0gICAgICAmJiAodHlwZS0+dS5rbmFtZWQtPm5hbWUtPm1hcmsgPT0gaW5mby0+bWFyawotCSAgfHwgKHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9UQUdHRUQKLQkgICAgICAmJiB0eXBlLT51LmtuYW1lZC0+bmFtZSAhPSBuYW1lKSkpCi0gICAgewotICAgICAgaWYgKHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9OQU1FRCkKLQlyZXR1cm4gKCpmbnMtPnR5cGVkZWZfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnUua25hbWVkLT5uYW1lLT5uYW1lKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgZGVidWdfdHlwZSAqcmVhbDsKLQkgIHVuc2lnbmVkIGludCBpZDsKLQotCSAgcmVhbCA9IGRlYnVnX2dldF9yZWFsX3R5cGUgKChQVFIpIGluZm8sIHR5cGUsIE5VTEwpOwotCSAgaWYgKHJlYWwgPT0gTlVMTCkKLQkgICAgcmV0dXJuICgqZm5zLT5lbXB0eV90eXBlKSAoZmhhbmRsZSk7Ci0JICBpZCA9IDA7Ci0JICBpZiAoKHJlYWwtPmtpbmQgPT0gREVCVUdfS0lORF9TVFJVQ1QKLQkgICAgICAgfHwgcmVhbC0+a2luZCA9PSBERUJVR19LSU5EX1VOSU9OCi0JICAgICAgIHx8IHJlYWwtPmtpbmQgPT0gREVCVUdfS0lORF9DTEFTUwotCSAgICAgICB8fCByZWFsLT5raW5kID09IERFQlVHX0tJTkRfVU5JT05fQ0xBU1MpCi0JICAgICAgJiYgcmVhbC0+dS5rY2xhc3MgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChyZWFsLT51LmtjbGFzcy0+aWQgPD0gaW5mby0+YmFzZV9pZCkKLQkJewotCQkgIGlmICghIGRlYnVnX3NldF9jbGFzc19pZCAoaW5mbywKLQkJCQkJICAgIHR5cGUtPnUua25hbWVkLT5uYW1lLT5uYW1lLAotCQkJCQkgICAgcmVhbCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBpZCA9IHJlYWwtPnUua2NsYXNzLT5pZDsKLQkgICAgfQotCi0JICByZXR1cm4gKCpmbnMtPnRhZ190eXBlKSAoZmhhbmRsZSwgdHlwZS0+dS5rbmFtZWQtPm5hbWUtPm5hbWUsIGlkLAotCQkJCSAgIHJlYWwtPmtpbmQpOwotCX0KLSAgICB9Ci0KLSAgLyogTWFyayB0aGUgbmFtZSBhZnRlciB3ZSBoYXZlIGFscmVhZHkgbG9va2VkIGZvciBhIGtub3duIG5hbWUsIHNvCi0gICAgIHRoYXQgd2UgZG9uJ3QganVzdCBkZWZpbmUgYSB0eXBlIGluIHRlcm1zIG9mIGl0c2VsZi4gIFdlIG5lZWQgdG8KLSAgICAgbWFyayB0aGUgbmFtZSBoZXJlIHNvIHRoYXQgYSBzdHJ1Y3QgY29udGFpbmluZyBhIHBvaW50ZXIgdG8KLSAgICAgaXRzZWxmIHdpbGwgd29yay4gICovCi0gIGlmIChuYW1lICE9IE5VTEwpCi0gICAgbmFtZS0+bWFyayA9IGluZm8tPm1hcms7Ci0KLSAgdGFnID0gTlVMTDsKLSAgaWYgKG5hbWUgIT0gTlVMTAotICAgICAgJiYgdHlwZS0+a2luZCAhPSBERUJVR19LSU5EX05BTUVECi0gICAgICAmJiB0eXBlLT5raW5kICE9IERFQlVHX0tJTkRfVEFHR0VEKQotICAgIHsKLSAgICAgIGFzc2VydCAobmFtZS0+a2luZCA9PSBERUJVR19PQkpFQ1RfVEFHKTsKLSAgICAgIHRhZyA9IG5hbWUtPm5hbWU7Ci0gICAgfQotCi0gIHN3aXRjaCAodHlwZS0+a2luZCkKLSAgICB7Ci0gICAgY2FzZSBERUJVR19LSU5EX0lMTEVHQUw6Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfd3JpdGVfdHlwZTogaWxsZWdhbCB0eXBlIGVuY291bnRlcmVkIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgREVCVUdfS0lORF9JTkRJUkVDVDoKLSAgICAgIGlmICgqdHlwZS0+dS5raW5kaXJlY3QtPnNsb3QgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiAoKmZucy0+ZW1wdHlfdHlwZSkgKGZoYW5kbGUpOwotICAgICAgcmV0dXJuIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgKnR5cGUtPnUua2luZGlyZWN0LT5zbG90LAotCQkJICAgICAgIG5hbWUpOwotICAgIGNhc2UgREVCVUdfS0lORF9WT0lEOgotICAgICAgcmV0dXJuICgqZm5zLT52b2lkX3R5cGUpIChmaGFuZGxlKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfSU5UOgotICAgICAgcmV0dXJuICgqZm5zLT5pbnRfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnNpemUsIHR5cGUtPnUua2ludCk7Ci0gICAgY2FzZSBERUJVR19LSU5EX0ZMT0FUOgotICAgICAgcmV0dXJuICgqZm5zLT5mbG9hdF90eXBlKSAoZmhhbmRsZSwgdHlwZS0+c2l6ZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX0NPTVBMRVg6Ci0gICAgICByZXR1cm4gKCpmbnMtPmNvbXBsZXhfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnNpemUpOwotICAgIGNhc2UgREVCVUdfS0lORF9CT09MOgotICAgICAgcmV0dXJuICgqZm5zLT5ib29sX3R5cGUpIChmaGFuZGxlLCB0eXBlLT5zaXplKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfU1RSVUNUOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTjoKLSAgICAgIGlmICh0eXBlLT51LmtjbGFzcyAhPSBOVUxMKQotCXsKLQkgIGlmICh0eXBlLT51LmtjbGFzcy0+aWQgPD0gaW5mby0+YmFzZV9pZCkKLQkgICAgewotCSAgICAgIGlmICghIGRlYnVnX3NldF9jbGFzc19pZCAoaW5mbywgdGFnLCB0eXBlKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChpbmZvLT5tYXJrID09IHR5cGUtPnUua2NsYXNzLT5tYXJrKQotCSAgICB7Ci0JICAgICAgLyogV2UgYXJlIGN1cnJlbnRseSBvdXRwdXR0aW5nIHRoaXMgc3RydWN0LCBvciB3ZSBoYXZlCi0JCSBhbHJlYWR5IG91dHB1dCBpdC4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGNhbiBoYXBwZW4sCi0JCSBidXQgaXQgY2FuIGhhcHBlbiBmb3IgYSBjbGFzcy4gICovCi0JICAgICAgYXNzZXJ0ICh0eXBlLT51LmtjbGFzcy0+aWQgPiBpbmZvLT5iYXNlX2lkKTsKLQkgICAgICByZXR1cm4gKCpmbnMtPnRhZ190eXBlKSAoZmhhbmRsZSwgdGFnLCB0eXBlLT51LmtjbGFzcy0+aWQsCi0JCQkJICAgICAgIHR5cGUtPmtpbmQpOwotCSAgICB9Ci0JICB0eXBlLT51LmtjbGFzcy0+bWFyayA9IGluZm8tPm1hcms7Ci0JfQotCi0gICAgICBpZiAoISAoKmZucy0+c3RhcnRfc3RydWN0X3R5cGUpIChmaGFuZGxlLCB0YWcsCi0JCQkJICAgICAgICh0eXBlLT51LmtjbGFzcyAhPSBOVUxMCi0JCQkJCT8gdHlwZS0+dS5rY2xhc3MtPmlkCi0JCQkJCTogMCksCi0JCQkJICAgICAgIHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9TVFJVQ1QsCi0JCQkJICAgICAgIHR5cGUtPnNpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICh0eXBlLT51LmtjbGFzcyAhPSBOVUxMCi0JICAmJiB0eXBlLT51LmtjbGFzcy0+ZmllbGRzICE9IE5VTEwpCi0JewotCSAgZm9yIChpID0gMDsgdHlwZS0+dS5rY2xhc3MtPmZpZWxkc1tpXSAhPSBOVUxMOyBpKyspCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZGVidWdfZmllbGQgKmY7Ci0KLQkgICAgICBmID0gdHlwZS0+dS5rY2xhc3MtPmZpZWxkc1tpXTsKLQkgICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIGYtPnR5cGUsCi0JCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpCi0JCSAgfHwgISAoKmZucy0+c3RydWN0X2ZpZWxkKSAoZmhhbmRsZSwgZi0+bmFtZSwgZi0+dS5mLmJpdHBvcywKLQkJCQkJICAgICBmLT51LmYuYml0c2l6ZSwgZi0+dmlzaWJpbGl0eSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIHJldHVybiAoKmZucy0+ZW5kX3N0cnVjdF90eXBlKSAoZmhhbmRsZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX0NMQVNTOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTl9DTEFTUzoKLSAgICAgIHJldHVybiBkZWJ1Z193cml0ZV9jbGFzc190eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUsIHRhZyk7Ci0gICAgY2FzZSBERUJVR19LSU5EX0VOVU06Ci0gICAgICBpZiAodHlwZS0+dS5rZW51bSA9PSBOVUxMKQotCXJldHVybiAoKmZucy0+ZW51bV90eXBlKSAoZmhhbmRsZSwgdGFnLCAoY29uc3QgY2hhciAqKikgTlVMTCwKLQkJCQkgIChiZmRfc2lnbmVkX3ZtYSAqKSBOVUxMKTsKLSAgICAgIHJldHVybiAoKmZucy0+ZW51bV90eXBlKSAoZmhhbmRsZSwgdGFnLCB0eXBlLT51LmtlbnVtLT5uYW1lcywKLQkJCQl0eXBlLT51LmtlbnVtLT52YWx1ZXMpOwotICAgIGNhc2UgREVCVUdfS0lORF9QT0lOVEVSOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51Lmtwb2ludGVyLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+cG9pbnRlcl90eXBlKSAoZmhhbmRsZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX0ZVTkNUSU9OOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLAotCQkJICAgICAgdHlwZS0+dS5rZnVuY3Rpb24tPnJldHVybl90eXBlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICh0eXBlLT51LmtmdW5jdGlvbi0+YXJnX3R5cGVzID09IE5VTEwpCi0JaXMgPSAtMTsKLSAgICAgIGVsc2UKLQl7Ci0JICBmb3IgKGlzID0gMDsgdHlwZS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlc1tpc10gIT0gTlVMTDsgaXMrKykKLQkgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLAotCQkJCSAgICB0eXBlLT51LmtmdW5jdGlvbi0+YXJnX3R5cGVzW2lzXSwKLQkJCQkgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICByZXR1cm4gKCpmbnMtPmZ1bmN0aW9uX3R5cGUpIChmaGFuZGxlLCBpcywKLQkJCQkgICAgdHlwZS0+dS5rZnVuY3Rpb24tPnZhcmFyZ3MpOwotICAgIGNhc2UgREVCVUdfS0lORF9SRUZFUkVOQ0U6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua3JlZmVyZW5jZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPnJlZmVyZW5jZV90eXBlKSAoZmhhbmRsZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX1JBTkdFOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51LmtyYW5nZS0+dHlwZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPnJhbmdlX3R5cGUpIChmaGFuZGxlLCB0eXBlLT51LmtyYW5nZS0+bG93ZXIsCi0JCQkJIHR5cGUtPnUua3JhbmdlLT51cHBlcik7Ci0gICAgY2FzZSBERUJVR19LSU5EX0FSUkFZOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51LmthcnJheS0+ZWxlbWVudF90eXBlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpCi0JICB8fCAhIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwKLQkJCQkgdHlwZS0+dS5rYXJyYXktPnJhbmdlX3R5cGUsCi0JCQkJIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPmFycmF5X3R5cGUpIChmaGFuZGxlLCB0eXBlLT51LmthcnJheS0+bG93ZXIsCi0JCQkJIHR5cGUtPnUua2FycmF5LT51cHBlciwKLQkJCQkgdHlwZS0+dS5rYXJyYXktPnN0cmluZ3ApOwotICAgIGNhc2UgREVCVUdfS0lORF9TRVQ6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua3NldC0+dHlwZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPnNldF90eXBlKSAoZmhhbmRsZSwgdHlwZS0+dS5rc2V0LT5iaXRzdHJpbmdwKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfT0ZGU0VUOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51LmtvZmZzZXQtPmJhc2VfdHlwZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKQotCSAgfHwgISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsCi0JCQkJIHR5cGUtPnUua29mZnNldC0+dGFyZ2V0X3R5cGUsCi0JCQkJIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPm9mZnNldF90eXBlKSAoZmhhbmRsZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX01FVEhPRDoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwKLQkJCSAgICAgIHR5cGUtPnUua21ldGhvZC0+cmV0dXJuX3R5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHR5cGUtPnUua21ldGhvZC0+YXJnX3R5cGVzID09IE5VTEwpCi0JaXMgPSAtMTsKLSAgICAgIGVsc2UKLQl7Ci0JICBmb3IgKGlzID0gMDsgdHlwZS0+dS5rbWV0aG9kLT5hcmdfdHlwZXNbaXNdICE9IE5VTEw7IGlzKyspCi0JICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwKLQkJCQkgICAgdHlwZS0+dS5rbWV0aG9kLT5hcmdfdHlwZXNbaXNdLAotCQkJCSAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmICh0eXBlLT51LmttZXRob2QtPmRvbWFpbl90eXBlICE9IE5VTEwpCi0JewotCSAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLAotCQkJCSAgdHlwZS0+dS5rbWV0aG9kLT5kb21haW5fdHlwZSwKLQkJCQkgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHJldHVybiAoKmZucy0+bWV0aG9kX3R5cGUpIChmaGFuZGxlLAotCQkJCSAgdHlwZS0+dS5rbWV0aG9kLT5kb21haW5fdHlwZSAhPSBOVUxMLAotCQkJCSAgaXMsCi0JCQkJICB0eXBlLT51LmttZXRob2QtPnZhcmFyZ3MpOwotICAgIGNhc2UgREVCVUdfS0lORF9DT05TVDoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rY29uc3QsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5jb25zdF90eXBlKSAoZmhhbmRsZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX1ZPTEFUSUxFOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51Lmt2b2xhdGlsZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPnZvbGF0aWxlX3R5cGUpIChmaGFuZGxlKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfTkFNRUQ6Ci0gICAgICByZXR1cm4gZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51LmtuYW1lZC0+dHlwZSwKLQkJCSAgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCk7Ci0gICAgY2FzZSBERUJVR19LSU5EX1RBR0dFRDoKLSAgICAgIHJldHVybiBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua25hbWVkLT50eXBlLAotCQkJICAgICAgIHR5cGUtPnUua25hbWVkLT5uYW1lKTsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBvdXQgYSBjbGFzcyB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX3dyaXRlX2NsYXNzX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZSwgdGFnKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICpmbnM7Ci0gICAgIFBUUiBmaGFuZGxlOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IGlkOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdnB0cmJhc2U7Ci0KLSAgaWYgKHR5cGUtPnUua2NsYXNzID09IE5VTEwpCi0gICAgewotICAgICAgaWQgPSAwOwotICAgICAgdnB0cmJhc2UgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICh0eXBlLT51LmtjbGFzcy0+aWQgPD0gaW5mby0+YmFzZV9pZCkKLQl7Ci0JICBpZiAoISBkZWJ1Z19zZXRfY2xhc3NfaWQgKGluZm8sIHRhZywgdHlwZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5tYXJrID09IHR5cGUtPnUua2NsYXNzLT5tYXJrKQotCXsKLQkgIC8qIFdlIGFyZSBjdXJyZW50bHkgb3V0cHV0dGluZyB0aGlzIGNsYXNzLCBvciB3ZSBoYXZlCi0JICAgICBhbHJlYWR5IG91dHB1dCBpdC4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZXJlIGFyZQotCSAgICAgbWV0aG9kcyBmb3IgYW4gYW5vbnltb3VzIGNsYXNzLiAgKi8KLQkgIGFzc2VydCAodHlwZS0+dS5rY2xhc3MtPmlkID4gaW5mby0+YmFzZV9pZCk7Ci0JICByZXR1cm4gKCpmbnMtPnRhZ190eXBlKSAoZmhhbmRsZSwgdGFnLCB0eXBlLT51LmtjbGFzcy0+aWQsCi0JCQkJICAgdHlwZS0+a2luZCk7Ci0JfQotICAgICAgdHlwZS0+dS5rY2xhc3MtPm1hcmsgPSBpbmZvLT5tYXJrOwotICAgICAgaWQgPSB0eXBlLT51LmtjbGFzcy0+aWQ7Ci0KLSAgICAgIHZwdHJiYXNlID0gdHlwZS0+dS5rY2xhc3MtPnZwdHJiYXNlOwotICAgICAgaWYgKHZwdHJiYXNlICE9IE5VTEwgJiYgdnB0cmJhc2UgIT0gdHlwZSkKLQl7Ci0JICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHZwdHJiYXNlLAotCQkJCSAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoISAoKmZucy0+c3RhcnRfY2xhc3NfdHlwZSkgKGZoYW5kbGUsIHRhZywgaWQsCi0JCQkJICB0eXBlLT5raW5kID09IERFQlVHX0tJTkRfQ0xBU1MsCi0JCQkJICB0eXBlLT5zaXplLAotCQkJCSAgdnB0cmJhc2UgIT0gTlVMTCwKLQkJCQkgIHZwdHJiYXNlID09IHR5cGUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodHlwZS0+dS5rY2xhc3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAodHlwZS0+dS5rY2xhc3MtPmZpZWxkcyAhPSBOVUxMKQotCXsKLQkgIGZvciAoaSA9IDA7IHR5cGUtPnUua2NsYXNzLT5maWVsZHNbaV0gIT0gTlVMTDsgaSsrKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGRlYnVnX2ZpZWxkICpmOwotCi0JICAgICAgZiA9IHR5cGUtPnUua2NsYXNzLT5maWVsZHNbaV07Ci0JICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBmLT50eXBlLAotCQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChmLT5zdGF0aWNfbWVtYmVyKQotCQl7Ci0JCSAgaWYgKCEgKCpmbnMtPmNsYXNzX3N0YXRpY19tZW1iZXIpIChmaGFuZGxlLCBmLT5uYW1lLAotCQkJCQkJICAgICBmLT51LnMucGh5c25hbWUsCi0JCQkJCQkgICAgIGYtPnZpc2liaWxpdHkpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKCEgKCpmbnMtPnN0cnVjdF9maWVsZCkgKGZoYW5kbGUsIGYtPm5hbWUsIGYtPnUuZi5iaXRwb3MsCi0JCQkJCSAgICAgIGYtPnUuZi5iaXRzaXplLCBmLT52aXNpYmlsaXR5KSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAodHlwZS0+dS5rY2xhc3MtPmJhc2VjbGFzc2VzICE9IE5VTEwpCi0JewotCSAgZm9yIChpID0gMDsgdHlwZS0+dS5rY2xhc3MtPmJhc2VjbGFzc2VzW2ldICE9IE5VTEw7IGkrKykKLQkgICAgewotCSAgICAgIHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKmI7Ci0KLQkgICAgICBiID0gdHlwZS0+dS5rY2xhc3MtPmJhc2VjbGFzc2VzW2ldOwotCSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgYi0+dHlwZSwKLQkJCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoISAoKmZucy0+Y2xhc3NfYmFzZWNsYXNzKSAoZmhhbmRsZSwgYi0+Yml0cG9zLCBiLT52aXJ0dWFsLAotCQkJCQkgICAgIGItPnZpc2liaWxpdHkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICh0eXBlLT51LmtjbGFzcy0+bWV0aG9kcyAhPSBOVUxMKQotCXsKLQkgIGZvciAoaSA9IDA7IHR5cGUtPnUua2NsYXNzLT5tZXRob2RzW2ldICE9IE5VTEw7IGkrKykKLQkgICAgewotCSAgICAgIHN0cnVjdCBkZWJ1Z19tZXRob2QgKm07Ci0JICAgICAgdW5zaWduZWQgaW50IGo7Ci0KLQkgICAgICBtID0gdHlwZS0+dS5rY2xhc3MtPm1ldGhvZHNbaV07Ci0JICAgICAgaWYgKCEgKCpmbnMtPmNsYXNzX3N0YXJ0X21ldGhvZCkgKGZoYW5kbGUsIG0tPm5hbWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgZm9yIChqID0gMDsgbS0+dmFyaWFudHNbal0gIT0gTlVMTDsgaisrKQotCQl7Ci0JCSAgc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICp2OwotCi0JCSAgdiA9IG0tPnZhcmlhbnRzW2pdOwotCQkgIGlmICh2LT5jb250ZXh0ICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdi0+Y29udGV4dCwKLQkJCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQkgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdi0+dHlwZSwKLQkJCQkJICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgaWYgKHYtPnZvZmZzZXQgIT0gVk9GRlNFVF9TVEFUSUNfTUVUSE9EKQotCQkgICAgewotCQkgICAgICBpZiAoISAoKmZucy0+Y2xhc3NfbWV0aG9kX3ZhcmlhbnQpIChmaGFuZGxlLCB2LT5waHlzbmFtZSwKLQkJCQkJCQkgIHYtPnZpc2liaWxpdHksCi0JCQkJCQkJICB2LT5jb25zdHAsCi0JCQkJCQkJICB2LT52b2xhdGlsZXAsCi0JCQkJCQkJICB2LT52b2Zmc2V0LAotCQkJCQkJCSAgdi0+Y29udGV4dCAhPSBOVUxMKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmICghICgqZm5zLT5jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQpIChmaGFuZGxlLAotCQkJCQkJCQkgdi0+cGh5c25hbWUsCi0JCQkJCQkJCSB2LT52aXNpYmlsaXR5LAotCQkJCQkJCQkgdi0+Y29uc3RwLAotCQkJCQkJCQkgdi0+dm9sYXRpbGVwKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGlmICghICgqZm5zLT5jbGFzc19lbmRfbWV0aG9kKSAoZmhhbmRsZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuICgqZm5zLT5lbmRfY2xhc3NfdHlwZSkgKGZoYW5kbGUpOwotfQotCi0vKiBXcml0ZSBvdXQgaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVidWdfd3JpdGVfZnVuY3Rpb24gKGluZm8sIGZucywgZmhhbmRsZSwgbmFtZSwgbGlua2FnZSwgZnVuY3Rpb24pCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKmZuczsKLSAgICAgUFRSIGZoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UgbGlua2FnZTsKLSAgICAgc3RydWN0IGRlYnVnX2Z1bmN0aW9uICpmdW5jdGlvbjsKLXsKLSAgc3RydWN0IGRlYnVnX3BhcmFtZXRlciAqcDsKLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpiOwotCi0gIGlmICghIGRlYnVnX3dyaXRlX2xpbmVub3MgKGluZm8sIGZucywgZmhhbmRsZSwgZnVuY3Rpb24tPmJsb2Nrcy0+c3RhcnQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIGZ1bmN0aW9uLT5yZXR1cm5fdHlwZSwKLQkJCSAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISAoKmZucy0+c3RhcnRfZnVuY3Rpb24pIChmaGFuZGxlLCBuYW1lLAotCQkJCWxpbmthZ2UgPT0gREVCVUdfTElOS0FHRV9HTE9CQUwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKHAgPSBmdW5jdGlvbi0+cGFyYW1ldGVyczsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHAtPnR5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkKLQkgIHx8ICEgKCpmbnMtPmZ1bmN0aW9uX3BhcmFtZXRlcikgKGZoYW5kbGUsIHAtPm5hbWUsIHAtPmtpbmQsIHAtPnZhbCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBmb3IgKGIgPSBmdW5jdGlvbi0+YmxvY2tzOyBiICE9IE5VTEw7IGIgPSBiLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX2Jsb2NrIChpbmZvLCBmbnMsIGZoYW5kbGUsIGIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuICgqZm5zLT5lbmRfZnVuY3Rpb24pIChmaGFuZGxlKTsKLX0KLQotLyogV3JpdGUgb3V0IGluZm9ybWF0aW9uIGZvciBhIGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX3dyaXRlX2Jsb2NrIChpbmZvLCBmbnMsIGZoYW5kbGUsIGJsb2NrKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICpmbnM7Ci0gICAgIFBUUiBmaGFuZGxlOwotICAgICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmJsb2NrOwotewotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpiOwotCi0gIGlmICghIGRlYnVnX3dyaXRlX2xpbmVub3MgKGluZm8sIGZucywgZmhhbmRsZSwgYmxvY2stPnN0YXJ0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSSBjYW4ndCBzZWUgYW55IHBvaW50IHRvIHdyaXRpbmcgb3V0IGEgYmxvY2sgd2l0aCBubyBsb2NhbAotICAgICB2YXJpYWJsZXMsIHNvIHdlIGRvbid0IGJvdGhlciwgZXhjZXB0IGZvciB0aGUgdG9wIGxldmVsIGJsb2NrLiAgKi8KLSAgaWYgKGJsb2NrLT5sb2NhbHMgIT0gTlVMTCB8fCBibG9jay0+cGFyZW50ID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgKCpmbnMtPnN0YXJ0X2Jsb2NrKSAoZmhhbmRsZSwgYmxvY2stPnN0YXJ0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChibG9jay0+bG9jYWxzICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChuID0gYmxvY2stPmxvY2Fscy0+bGlzdDsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKLQl7Ci0JICBpZiAoISBkZWJ1Z193cml0ZV9uYW1lIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBmb3IgKGIgPSBibG9jay0+Y2hpbGRyZW47IGIgIT0gTlVMTDsgYiA9IGItPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfYmxvY2sgKGluZm8sIGZucywgZmhhbmRsZSwgYikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBkZWJ1Z193cml0ZV9saW5lbm9zIChpbmZvLCBmbnMsIGZoYW5kbGUsIGJsb2NrLT5lbmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmxvY2stPmxvY2FscyAhPSBOVUxMIHx8IGJsb2NrLT5wYXJlbnQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKmZucy0+ZW5kX2Jsb2NrKSAoZmhhbmRsZSwgYmxvY2stPmVuZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIHVwIHRvIEFERFJFU1MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVidWdfd3JpdGVfbGluZW5vcyAoaW5mbywgZm5zLCBmaGFuZGxlLCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICpmbnM7Ci0gICAgIFBUUiBmaGFuZGxlOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci17Ci0gIHdoaWxlIChpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVubyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBkZWJ1Z19saW5lbm8gKmw7Ci0KLSAgICAgIGwgPSBpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVubzsKLQotICAgICAgd2hpbGUgKGluZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4IDwgREVCVUdfTElORU5PX0NPVU5UKQotCXsKLQkgIGlmIChsLT5saW5lbm9zW2luZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4XQotCSAgICAgID09ICh1bnNpZ25lZCBsb25nKSAtMSkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmIChsLT5hZGRyc1tpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleF0gPj0gYWRkcmVzcykKLQkgICAgcmV0dXJuIHRydWU7Ci0KLQkgIGlmICghICgqZm5zLT5saW5lbm8pIChmaGFuZGxlLCBsLT5maWxlLT5maWxlbmFtZSwKLQkJCQlsLT5saW5lbm9zW2luZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4XSwKLQkJCQlsLT5hZGRyc1tpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleF0pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICsraW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXg7Ci0JfQotCi0gICAgICBpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVubyA9IGwtPm5leHQ7Ci0gICAgICBpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleCA9IDA7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHZXQgdGhlIElEIG51bWJlciBmb3IgYSBjbGFzcy4gIElmIGR1cmluZyB0aGUgc2FtZSBjYWxsIHRvCi0gICBkZWJ1Z193cml0ZSB3ZSBmaW5kIGEgc3RydWN0IHdpdGggdGhlIHNhbWUgZGVmaW5pdGlvbiB3aXRoIHRoZSBzYW1lCi0gICBuYW1lLCB3ZSB1c2UgdGhlIHNhbWUgSUQuICBUaGlzIHR5cGUgb2YgdGhpbmdzIGhhcHBlbnMgYmVjYXVzZSB0aGUKLSAgIHNhbWUgc3RydWN0IHdpbGwgYmUgZGVmaW5lZCBieSBtdWx0aXBsZSBjb21waWxhdGlvbiB1bml0cy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z19zZXRfY2xhc3NfaWQgKGluZm8sIHRhZywgdHlwZSkKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLXsKLSAgc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUgKmM7Ci0gIHN0cnVjdCBkZWJ1Z19jbGFzc19pZCAqbDsKLQotICBhc3NlcnQgKHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9TVFJVQ1QKLQkgIHx8IHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9VTklPTgotCSAgfHwgdHlwZS0+a2luZCA9PSBERUJVR19LSU5EX0NMQVNTCi0JICB8fCB0eXBlLT5raW5kID09IERFQlVHX0tJTkRfVU5JT05fQ0xBU1MpOwotCi0gIGMgPSB0eXBlLT51LmtjbGFzczsKLQotICBpZiAoYy0+aWQgPiBpbmZvLT5iYXNlX2lkKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAobCA9IGluZm8tPmlkX2xpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKGwtPnR5cGUtPmtpbmQgIT0gdHlwZS0+a2luZCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKHRhZyA9PSBOVUxMKQotCXsKLQkgIGlmIChsLT50YWcgIT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChsLT50YWcgPT0gTlVMTAotCSAgICAgIHx8IGwtPnRhZ1swXSAhPSB0YWdbMF0KLQkgICAgICB8fCBzdHJjbXAgKGwtPnRhZywgdGFnKSAhPSAwKQotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCBsLT50eXBlLCB0eXBlKSkKLQl7Ci0JICBjLT5pZCA9IGwtPnR5cGUtPnUua2NsYXNzLT5pZDsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlcmUgYXJlIG5vIGlkZW50aWNhbCB0eXBlcy4gIFVzZSBhIG5ldyBJRCwgYW5kIGFkZCBpdCB0byB0aGUKLSAgICAgbGlzdC4gICovCi0gICsraW5mby0+Y2xhc3NfaWQ7Ci0gIGMtPmlkID0gaW5mby0+Y2xhc3NfaWQ7Ci0KLSAgbCA9IChzdHJ1Y3QgZGVidWdfY2xhc3NfaWQgKikgeG1hbGxvYyAoc2l6ZW9mICpsKTsKLSAgbWVtc2V0IChsLCAwLCBzaXplb2YgKmwpOwotCi0gIGwtPnR5cGUgPSB0eXBlOwotICBsLT50YWcgPSB0YWc7Ci0KLSAgbC0+bmV4dCA9IGluZm8tPmlkX2xpc3Q7Ci0gIGluZm8tPmlkX2xpc3QgPSBsOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZWUgaWYgdHdvIHR5cGVzIGFyZSB0aGUgc2FtZS4gIEF0IHRoaXMgcG9pbnQsIHdlIGRvbid0IGNhcmUgYWJvdXQKLSAgIHRhZ3MgYW5kIHRoZSBsaWtlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLCB0MikKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnQxOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z190eXBlX2NvbXBhcmVfbGlzdCAqbDsKLSAgc3RydWN0IGRlYnVnX3R5cGVfY29tcGFyZV9saXN0IHRvcDsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgaWYgKHQxID09IE5VTEwpCi0gICAgcmV0dXJuIHQyID09IE5VTEw7Ci0gIGlmICh0MiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICB3aGlsZSAodDEtPmtpbmQgPT0gREVCVUdfS0lORF9JTkRJUkVDVCkKLSAgICB7Ci0gICAgICB0MSA9ICp0MS0+dS5raW5kaXJlY3QtPnNsb3Q7Ci0gICAgICBpZiAodDEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICB3aGlsZSAodDItPmtpbmQgPT0gREVCVUdfS0lORF9JTkRJUkVDVCkKLSAgICB7Ci0gICAgICB0MiA9ICp0Mi0+dS5raW5kaXJlY3QtPnNsb3Q7Ci0gICAgICBpZiAodDIgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICh0MSA9PSB0MikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBBcyBhIHNwZWNpYWwgY2FzZSwgcGVybWl0IGEgdHlwZWRlZiB0byBtYXRjaCBhIHRhZywgc2luY2UgQysrCi0gICAgIGRlYnVnZ2luZyBvdXRwdXQgd2lsbCBzb21ldGltZXMgYWRkIGEgdHlwZWRlZiB3aGVyZSBDIGRlYnVnZ2luZwotICAgICBvdXRwdXQgd2lsbCBub3QuICAqLwotICBpZiAodDEtPmtpbmQgPT0gREVCVUdfS0lORF9OQU1FRAotICAgICAgJiYgdDItPmtpbmQgPT0gREVCVUdfS0lORF9UQUdHRUQpCi0gICAgcmV0dXJuIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmtuYW1lZC0+dHlwZSwgdDIpOwotICBlbHNlIGlmICh0MS0+a2luZCA9PSBERUJVR19LSU5EX1RBR0dFRAotCSAgICYmIHQyLT5raW5kID09IERFQlVHX0tJTkRfTkFNRUQpCi0gICAgcmV0dXJuIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLCB0Mi0+dS5rbmFtZWQtPnR5cGUpOwotCi0gIGlmICh0MS0+a2luZCAhPSB0Mi0+a2luZAotICAgICAgfHwgdDEtPnNpemUgIT0gdDItPnNpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdldCByaWQgb2YgdGhlIHRyaXZpYWwgY2FzZXMgZmlyc3QuICAqLwotICBzd2l0Y2ggKHQxLT5raW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19LSU5EX1ZPSUQ6Ci0gICAgY2FzZSBERUJVR19LSU5EX0ZMT0FUOgotICAgIGNhc2UgREVCVUdfS0lORF9DT01QTEVYOgotICAgIGNhc2UgREVCVUdfS0lORF9CT09MOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBERUJVR19LSU5EX0lOVDoKLSAgICAgIHJldHVybiB0MS0+dS5raW50ID09IHQyLT51LmtpbnQ7Ci0gICAgfQotCi0gIC8qIFdlIGhhdmUgdG8gYXZvaWQgYW4gaW5maW5pdGUgcmVjdXJzaW9uLiAgV2UgZG8gdGhpcyBieSBrZWVwaW5nIGEKLSAgICAgbGlzdCBvZiB0eXBlcyB3aGljaCB3ZSBhcmUgY29tcGFyaW5nLiAgV2UganVzdCBrZWVwIHRoZSBsaXN0IG9uCi0gICAgIHRoZSBzdGFjay4gIElmIHdlIGVuY291bnRlciBhIHBhaXIgb2YgdHlwZXMgd2UgYXJlIGN1cnJlbnRseQotICAgICBjb21wYXJpbmcsIHdlIGp1c3QgYXNzdW1lIHRoYXQgdGhleSBhcmUgZXF1YWwuICAqLwotICBmb3IgKGwgPSBpbmZvLT5jb21wYXJlX2xpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKGwtPnQxID09IHQxICYmIGwtPnQyID09IHQyKQotCXJldHVybiB0cnVlOwotICAgIH0KLQotICB0b3AudDEgPSB0MTsKLSAgdG9wLnQyID0gdDI7Ci0gIHRvcC5uZXh0ID0gaW5mby0+Y29tcGFyZV9saXN0OwotICBpbmZvLT5jb21wYXJlX2xpc3QgPSAmdG9wOwotCi0gIHN3aXRjaCAodDEtPmtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldCA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfU1RSVUNUOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTjoKLSAgICBjYXNlIERFQlVHX0tJTkRfQ0xBU1M6Ci0gICAgY2FzZSBERUJVR19LSU5EX1VOSU9OX0NMQVNTOgotICAgICAgaWYgKHQxLT51LmtjbGFzcyA9PSBOVUxMKQotCXJldCA9IHQyLT51LmtjbGFzcyA9PSBOVUxMOwotICAgICAgZWxzZSBpZiAodDItPnUua2NsYXNzID09IE5VTEwpCi0JcmV0ID0gZmFsc2U7Ci0gICAgICBlbHNlIGlmICh0MS0+dS5rY2xhc3MtPmlkID4gaW5mby0+YmFzZV9pZAotCSAgICAgICAmJiB0MS0+dS5rY2xhc3MtPmlkID09IHQyLT51LmtjbGFzcy0+aWQpCi0JcmV0ID0gdHJ1ZTsKLSAgICAgIGVsc2UKLQlyZXQgPSBkZWJ1Z19jbGFzc190eXBlX3NhbWVwIChpbmZvLCB0MSwgdDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfRU5VTToKLSAgICAgIGlmICh0MS0+dS5rZW51bSA9PSBOVUxMKQotCXJldCA9IHQyLT51LmtlbnVtID09IE5VTEw7Ci0gICAgICBlbHNlIGlmICh0Mi0+dS5rZW51bSA9PSBOVUxMKQotCXJldCA9IGZhbHNlOwotICAgICAgZWxzZQotCXsKLQkgIGNvbnN0IGNoYXIgKipwbjEsICoqcG4yOwotCSAgYmZkX3NpZ25lZF92bWEgKnB2MSwgKnB2MjsKLQotCSAgcG4xID0gdDEtPnUua2VudW0tPm5hbWVzOwotCSAgcG4yID0gdDItPnUua2VudW0tPm5hbWVzOwotCSAgcHYxID0gdDEtPnUua2VudW0tPnZhbHVlczsKLQkgIHB2MiA9IHQyLT51LmtlbnVtLT52YWx1ZXM7Ci0JICB3aGlsZSAoKnBuMSAhPSBOVUxMICYmICpwbjIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICgqKnBuMSAhPSAqKnBuMgotCQkgIHx8ICpwdjEgIT0gKnB2MgotCQkgIHx8IHN0cmNtcCAoKnBuMSwgKnBuMikgIT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgKytwbjE7Ci0JICAgICAgKytwbjI7Ci0JICAgICAgKytwdjE7Ci0JICAgICAgKytwdjI7Ci0JICAgIH0KLQkgIHJldCA9ICpwbjEgPT0gTlVMTCAmJiAqcG4yID09IE5VTEw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfUE9JTlRFUjoKLSAgICAgIHJldCA9IGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51Lmtwb2ludGVyLCB0Mi0+dS5rcG9pbnRlcik7Ci0gICAgICBicmVhazsKLQkgICAgIAotICAgIGNhc2UgREVCVUdfS0lORF9GVU5DVElPTjoKLSAgICAgIGlmICh0MS0+dS5rZnVuY3Rpb24tPnZhcmFyZ3MgIT0gdDItPnUua2Z1bmN0aW9uLT52YXJhcmdzCi0JICB8fCAhIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmtmdW5jdGlvbi0+cmV0dXJuX3R5cGUsCi0JCQkJIHQyLT51LmtmdW5jdGlvbi0+cmV0dXJuX3R5cGUpCi0JICB8fCAoKHQxLT51LmtmdW5jdGlvbi0+YXJnX3R5cGVzID09IE5VTEwpCi0JICAgICAgIT0gKHQyLT51LmtmdW5jdGlvbi0+YXJnX3R5cGVzID09IE5VTEwpKSkKLQlyZXQgPSBmYWxzZTsKLSAgICAgIGVsc2UgaWYgKHQxLT51LmtmdW5jdGlvbi0+YXJnX3R5cGVzID09IE5VTEwpCi0JcmV0ID0gdHJ1ZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgZGVidWdfdHlwZSAqKmExLCAqKmEyOwotCi0JICBhMSA9IHQxLT51LmtmdW5jdGlvbi0+YXJnX3R5cGVzOwotCSAgYTIgPSB0Mi0+dS5rZnVuY3Rpb24tPmFyZ190eXBlczsKLQkgIHdoaWxlICgqYTEgIT0gTlVMTCAmJiAqYTIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sICphMSwgKmEyKSkKLQkJYnJlYWs7Ci0JICAgICAgKythMTsKLQkgICAgICArK2EyOwotCSAgICB9Ci0JICByZXQgPSAqYTEgPT0gTlVMTCAmJiAqYTIgPT0gTlVMTDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9SRUZFUkVOQ0U6Ci0gICAgICByZXQgPSBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rcmVmZXJlbmNlLCB0Mi0+dS5rcmVmZXJlbmNlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX1JBTkdFOgotICAgICAgcmV0ID0gKHQxLT51LmtyYW5nZS0+bG93ZXIgPT0gdDItPnUua3JhbmdlLT5sb3dlcgotCSAgICAgJiYgdDEtPnUua3JhbmdlLT51cHBlciA9PSB0Mi0+dS5rcmFuZ2UtPnVwcGVyCi0JICAgICAmJiBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rcmFuZ2UtPnR5cGUsCi0JCQkJICB0Mi0+dS5rcmFuZ2UtPnR5cGUpKTsKLQotICAgIGNhc2UgREVCVUdfS0lORF9BUlJBWToKLSAgICAgIHJldCA9ICh0MS0+dS5rYXJyYXktPmxvd2VyID09IHQyLT51LmthcnJheS0+bG93ZXIKLQkgICAgICYmIHQxLT51LmthcnJheS0+dXBwZXIgPT0gdDItPnUua2FycmF5LT51cHBlcgotCSAgICAgJiYgdDEtPnUua2FycmF5LT5zdHJpbmdwID09IHQyLT51LmthcnJheS0+c3RyaW5ncAotCSAgICAgJiYgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua2FycmF5LT5lbGVtZW50X3R5cGUsCi0JCQkJICB0Mi0+dS5rYXJyYXktPmVsZW1lbnRfdHlwZSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfU0VUOgotICAgICAgcmV0ID0gKHQxLT51LmtzZXQtPmJpdHN0cmluZ3AgPT0gdDItPnUua3NldC0+Yml0c3RyaW5ncAotCSAgICAgJiYgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua3NldC0+dHlwZSwgdDItPnUua3NldC0+dHlwZSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfT0ZGU0VUOgotICAgICAgcmV0ID0gKGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmtvZmZzZXQtPmJhc2VfdHlwZSwKLQkJCSAgICAgICB0Mi0+dS5rb2Zmc2V0LT5iYXNlX3R5cGUpCi0JICAgICAmJiBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rb2Zmc2V0LT50YXJnZXRfdHlwZSwKLQkJCQkgIHQyLT51LmtvZmZzZXQtPnRhcmdldF90eXBlKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9NRVRIT0Q6Ci0gICAgICBpZiAodDEtPnUua21ldGhvZC0+dmFyYXJncyAhPSB0Mi0+dS5rbWV0aG9kLT52YXJhcmdzCi0JICB8fCAhIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmttZXRob2QtPnJldHVybl90eXBlLAotCQkJCSB0Mi0+dS5rbWV0aG9kLT5yZXR1cm5fdHlwZSkKLQkgIHx8ICEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua21ldGhvZC0+ZG9tYWluX3R5cGUsCi0JCQkJIHQyLT51LmttZXRob2QtPmRvbWFpbl90eXBlKQotCSAgfHwgKCh0MS0+dS5rbWV0aG9kLT5hcmdfdHlwZXMgPT0gTlVMTCkKLQkgICAgICAhPSAodDItPnUua21ldGhvZC0+YXJnX3R5cGVzID09IE5VTEwpKSkKLQlyZXQgPSBmYWxzZTsKLSAgICAgIGVsc2UgaWYgKHQxLT51LmttZXRob2QtPmFyZ190eXBlcyA9PSBOVUxMKQotCXJldCA9IHRydWU7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGRlYnVnX3R5cGUgKiphMSwgKiphMjsKLQotCSAgYTEgPSB0MS0+dS5rbWV0aG9kLT5hcmdfdHlwZXM7Ci0JICBhMiA9IHQyLT51LmttZXRob2QtPmFyZ190eXBlczsKLQkgIHdoaWxlICgqYTEgIT0gTlVMTCAmJiAqYTIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sICphMSwgKmEyKSkKLQkJYnJlYWs7Ci0JICAgICAgKythMTsKLQkgICAgICArK2EyOwotCSAgICB9Ci0JICByZXQgPSAqYTEgPT0gTlVMTCAmJiAqYTIgPT0gTlVMTDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9DT05TVDoKLSAgICAgIHJldCA9IGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51Lmtjb25zdCwgdDItPnUua2NvbnN0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX1ZPTEFUSUxFOgotICAgICAgcmV0ID0gZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua3ZvbGF0aWxlLCB0Mi0+dS5rdm9sYXRpbGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfTkFNRUQ6Ci0gICAgY2FzZSBERUJVR19LSU5EX1RBR0dFRDoKLSAgICAgIHJldCA9IChzdHJjbXAgKHQxLT51LmtuYW1lZC0+bmFtZS0+bmFtZSwgdDItPnUua25hbWVkLT5uYW1lLT5uYW1lKSA9PSAwCi0JICAgICAmJiBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rbmFtZWQtPnR5cGUsCi0JCQkJICB0Mi0+dS5rbmFtZWQtPnR5cGUpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpbmZvLT5jb21wYXJlX2xpc3QgPSB0b3AubmV4dDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBTZWUgaWYgdHdvIGNsYXNzZXMgYXJlIHRoZSBzYW1lLiAgVGhpcyBpcyBhIHN1YnJvdXRpbmUgb2YKLSAgIGRlYnVnX3R5cGVfc2FtZXAuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVidWdfY2xhc3NfdHlwZV9zYW1lcCAoaW5mbywgdDEsIHQyKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDE7Ci0gICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0MjsKLXsKLSAgc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUgKmMxLCAqYzI7Ci0KLSAgYzEgPSB0MS0+dS5rY2xhc3M7Ci0gIGMyID0gdDItPnUua2NsYXNzOwotCi0gIGlmICgoYzEtPmZpZWxkcyA9PSBOVUxMKSAhPSAoYzItPmZpZWxkcyA9PSBOVUxMKQotICAgICAgfHwgKGMxLT5iYXNlY2xhc3NlcyA9PSBOVUxMKSAhPSAoYzItPmJhc2VjbGFzc2VzID09IE5VTEwpCi0gICAgICB8fCAoYzEtPm1ldGhvZHMgPT0gTlVMTCkgIT0gKGMyLT5tZXRob2RzID09IE5VTEwpCi0gICAgICB8fCAoYzEtPnZwdHJiYXNlID09IE5VTEwpICE9IChjMi0+dnB0cmJhc2UgPT0gTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChjMS0+ZmllbGRzICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGRlYnVnX2ZpZWxkICoqcGYxLCAqKnBmMjsKLQotICAgICAgZm9yIChwZjEgPSBjMS0+ZmllbGRzLCBwZjIgPSBjMi0+ZmllbGRzOwotCSAgICpwZjEgIT0gTlVMTCAmJiAqcGYyICE9IE5VTEw7Ci0JICAgcGYxKyssIHBmMisrKQotCXsKLQkgIHN0cnVjdCBkZWJ1Z19maWVsZCAqZjEsICpmMjsKLQotCSAgZjEgPSAqcGYxOwotCSAgZjIgPSAqcGYyOwotCSAgaWYgKGYxLT5uYW1lWzBdICE9IGYyLT5uYW1lWzBdCi0JICAgICAgfHwgZjEtPnZpc2liaWxpdHkgIT0gZjItPnZpc2liaWxpdHkKLQkgICAgICB8fCBmMS0+c3RhdGljX21lbWJlciAhPSBmMi0+c3RhdGljX21lbWJlcikKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGYxLT5zdGF0aWNfbWVtYmVyKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAoZjEtPnUucy5waHlzbmFtZSwgZjItPnUucy5waHlzbmFtZSkgIT0gMCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoZjEtPnUuZi5iaXRwb3MgIT0gZjItPnUuZi5iaXRwb3MKLQkJICB8fCBmMS0+dS5mLmJpdHNpemUgIT0gZjItPnUuZi5iaXRzaXplKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIC8qIFdlIGRvIHRoZSBjaGVja3Mgd2hpY2ggcmVxdWlyZSBmdW5jdGlvbiBjYWxscyBsYXN0LiAgV2UKLSAgICAgICAgICAgICBkb24ndCByZXF1aXJlIHRoYXQgdGhlIHR5cGVzIG9mIGZpZWxkcyBoYXZlIHRoZSBzYW1lCi0gICAgICAgICAgICAgbmFtZXMsIHNpbmNlIHRoYXQgc29tZXRpbWVzIGZhaWxzIGluIHRoZSBwcmVzZW5jZSBvZgotICAgICAgICAgICAgIHR5cGVkZWZzIGFuZCB3ZSByZWFsbHkgZG9uJ3QgY2FyZS4gICovCi0JICBpZiAoc3RyY21wIChmMS0+bmFtZSwgZjItPm5hbWUpICE9IDAKLQkgICAgICB8fCAhIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sCi0JCQkJICAgICBkZWJ1Z19nZXRfcmVhbF90eXBlICgoUFRSKSBpbmZvLAotCQkJCQkJCSAgZjEtPnR5cGUsIE5VTEwpLAotCQkJCSAgICAgZGVidWdfZ2V0X3JlYWxfdHlwZSAoKFBUUikgaW5mbywKLQkJCQkJCQkgIGYyLT50eXBlLCBOVUxMKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoKnBmMSAhPSBOVUxMIHx8ICpwZjIgIT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChjMS0+dnB0cmJhc2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCBjMS0+dnB0cmJhc2UsIGMyLT52cHRyYmFzZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYzEtPmJhc2VjbGFzc2VzICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGRlYnVnX2Jhc2VjbGFzcyAqKnBiMSwgKipwYjI7Ci0KLSAgICAgIGZvciAocGIxID0gYzEtPmJhc2VjbGFzc2VzLCBwYjIgPSBjMi0+YmFzZWNsYXNzZXM7Ci0JICAgKnBiMSAhPSBOVUxMICYmICpwYjIgIT0gTlVMTDsKLQkgICArK3BiMSwgKytwYjIpCi0JewotCSAgc3RydWN0IGRlYnVnX2Jhc2VjbGFzcyAqYjEsICpiMjsKLQotCSAgYjEgPSAqcGIxOwotCSAgYjIgPSAqcGIyOwotCSAgaWYgKGIxLT5iaXRwb3MgIT0gYjItPmJpdHBvcwotCSAgICAgIHx8IGIxLT52aXJ0dWFsICE9IGIyLT52aXJ0dWFsCi0JICAgICAgfHwgYjEtPnZpc2liaWxpdHkgIT0gYjItPnZpc2liaWxpdHkKLQkgICAgICB8fCAhIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIGIxLT50eXBlLCBiMi0+dHlwZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoKnBiMSAhPSBOVUxMIHx8ICpwYjIgIT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChjMS0+bWV0aG9kcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBkZWJ1Z19tZXRob2QgKipwbTEsICoqcG0yOwotCi0gICAgICBmb3IgKHBtMSA9IGMxLT5tZXRob2RzLCBwbTIgPSBjMi0+bWV0aG9kczsKLQkgICAqcG0xICE9IE5VTEwgJiYgKnBtMiAhPSBOVUxMOwotCSAgICsrcG0xLCArK3BtMikKLQl7Ci0JICBzdHJ1Y3QgZGVidWdfbWV0aG9kICptMSwgKm0yOwotCi0JICBtMSA9ICpwbTE7Ci0JICBtMiA9ICpwbTI7Ci0JICBpZiAobTEtPm5hbWVbMF0gIT0gbTItPm5hbWVbMF0KLQkgICAgICB8fCBzdHJjbXAgKG0xLT5uYW1lLCBtMi0+bmFtZSkgIT0gMAotCSAgICAgIHx8IChtMS0+dmFyaWFudHMgPT0gTlVMTCkgIT0gKG0yLT52YXJpYW50cyA9PSBOVUxMKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKG0xLT52YXJpYW50cyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICoqcHYxLCAqKnB2MjsKLQotCSAgICAgIGZvciAocHYxID0gbTEtPnZhcmlhbnRzLCBwdjIgPSBtMi0+dmFyaWFudHM7Ci0JCSAgICpwdjEgIT0gTlVMTCAmJiAqcHYyICE9IE5VTEw7Ci0JCSAgICsrcHYxLCArK3B2MikKLQkJewotCQkgIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqdjEsICp2MjsKLQotCQkgIHYxID0gKnB2MTsKLQkJICB2MiA9ICpwdjI7Ci0JCSAgaWYgKHYxLT5waHlzbmFtZVswXSAhPSB2Mi0+cGh5c25hbWVbMF0KLQkJICAgICAgfHwgdjEtPnZpc2liaWxpdHkgIT0gdjItPnZpc2liaWxpdHkKLQkJICAgICAgfHwgdjEtPmNvbnN0cCAhPSB2Mi0+Y29uc3RwCi0JCSAgICAgIHx8IHYxLT52b2xhdGlsZXAgIT0gdjItPnZvbGF0aWxlcAotCQkgICAgICB8fCB2MS0+dm9mZnNldCAhPSB2Mi0+dm9mZnNldAotCQkgICAgICB8fCAodjEtPmNvbnRleHQgPT0gTlVMTCkgIT0gKHYyLT5jb250ZXh0ID09IE5VTEwpCi0JCSAgICAgIHx8IHN0cmNtcCAodjEtPnBoeXNuYW1lLCB2Mi0+cGh5c25hbWUpICE9IDAKLQkJICAgICAgfHwgISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB2MS0+dHlwZSwgdjItPnR5cGUpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGlmICh2MS0+Y29udGV4dCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBpZiAoISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB2MS0+Y29udGV4dCwKLQkJCQkJICAgICAgdjItPmNvbnRleHQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0JICAgICAgaWYgKCpwdjEgIT0gTlVMTCB8fCAqcHYyICE9IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGlmICgqcG0xICE9IE5VTEwgfHwgKnBtMiAhPSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9kZWJ1Zy5oIGIvYmludXRpbHMvZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4OTBiMi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9kZWJ1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzk4ICswLDAgQEAKLS8qIGRlYnVnLmggLS0gRGVzY3JpYmUgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBERUJVR19ICi0jZGVmaW5lIERFQlVHX0gKLQotLyogVGhpcyBoZWFkZXIgZmlsZSBkZXNjcmliZXMgYSBnZW5lcmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3JtYXQuCi0gICBXZSBtYXkgZXZlbnR1YWxseSBoYXZlIHJlYWRlcnMgd2hpY2ggY29udmVydCBkaWZmZXJlbnQgZm9ybWF0cyBpbnRvCi0gICB0aGlzIGdlbmVyaWMgZm9ybWF0LCBhbmQgd3JpdGVycyB3aGljaCB3cml0ZSBpdCBvdXQuICBUaGUgaW5pdGlhbAotICAgaW1wZXR1cyBmb3IgdGhpcyB3YXMgd3JpdGluZyBhIGNvbnZlcnRvciBmcm9tIHN0YWJzIHRvIEhQIElFRUUtNjk1Ci0gICBkZWJ1Z2dpbmcgZm9ybWF0LiAgKi8KLQotLyogRGlmZmVyZW50IGtpbmRzIG9mIHR5cGVzLiAgKi8KLQotZW51bSBkZWJ1Z190eXBlX2tpbmQKLXsKLSAgLyogTm90IHVzZWQuICAqLwotICBERUJVR19LSU5EX0lMTEVHQUwsCi0gIC8qIEluZGlyZWN0IHZpYSBhIHBvaW50ZXIuICAqLwotICBERUJVR19LSU5EX0lORElSRUNULAotICAvKiBWb2lkLiAgKi8KLSAgREVCVUdfS0lORF9WT0lELAotICAvKiBJbnRlZ2VyLiAgKi8KLSAgREVCVUdfS0lORF9JTlQsCi0gIC8qIEZsb2F0aW5nIHBvaW50LiAgKi8KLSAgREVCVUdfS0lORF9GTE9BVCwKLSAgLyogQ29tcGxleC4gICovCi0gIERFQlVHX0tJTkRfQ09NUExFWCwKLSAgLyogQm9vbGVhbi4gICovCi0gIERFQlVHX0tJTkRfQk9PTCwKLSAgLyogU3RydWN0LiAgKi8KLSAgREVCVUdfS0lORF9TVFJVQ1QsCi0gIC8qIFVuaW9uLiAgKi8KLSAgREVCVUdfS0lORF9VTklPTiwKLSAgLyogQ2xhc3MuICAqLwotICBERUJVR19LSU5EX0NMQVNTLAotICAvKiBVbmlvbiBjbGFzcyAoY2FuIHRoaXMgcmVhbGx5IGhhcHBlbj8pLiAgKi8KLSAgREVCVUdfS0lORF9VTklPTl9DTEFTUywKLSAgLyogRW51bWVyYXRpb24gdHlwZS4gICovCi0gIERFQlVHX0tJTkRfRU5VTSwKLSAgLyogUG9pbnRlci4gICovCi0gIERFQlVHX0tJTkRfUE9JTlRFUiwKLSAgLyogRnVuY3Rpb24uICAqLwotICBERUJVR19LSU5EX0ZVTkNUSU9OLAotICAvKiBSZWZlcmVuY2UuICAqLwotICBERUJVR19LSU5EX1JFRkVSRU5DRSwKLSAgLyogUmFuZ2UuICAqLwotICBERUJVR19LSU5EX1JBTkdFLAotICAvKiBBcnJheS4gICovCi0gIERFQlVHX0tJTkRfQVJSQVksCi0gIC8qIFNldC4gICovCi0gIERFQlVHX0tJTkRfU0VULAotICAvKiBCYXNlZCBwb2ludGVyLiAgKi8KLSAgREVCVUdfS0lORF9PRkZTRVQsCi0gIC8qIE1ldGhvZC4gICovCi0gIERFQlVHX0tJTkRfTUVUSE9ELAotICAvKiBDb25zdCBxdWFsaWZpZWQgdHlwZS4gICovCi0gIERFQlVHX0tJTkRfQ09OU1QsCi0gIC8qIFZvbGF0aWxlIHF1YWxpZmllZCB0eXBlLiAgKi8KLSAgREVCVUdfS0lORF9WT0xBVElMRSwKLSAgLyogTmFtZWQgdHlwZS4gICovCi0gIERFQlVHX0tJTkRfTkFNRUQsCi0gIC8qIFRhZ2dlZCB0eXBlLiAgKi8KLSAgREVCVUdfS0lORF9UQUdHRUQKLX07Ci0KLS8qIERpZmZlcmVudCBraW5kcyBvZiB2YXJpYWJsZXMuICAqLwotCi1lbnVtIGRlYnVnX3Zhcl9raW5kCi17Ci0gIC8qIE5vdCB1c2VkLiAgKi8KLSAgREVCVUdfVkFSX0lMTEVHQUwsCi0gIC8qIEEgZ2xvYmFsIHZhcmlhYmxlLiAgKi8KLSAgREVCVUdfR0xPQkFMLAotICAvKiBBIHN0YXRpYyB2YXJpYWJsZS4gICovCi0gIERFQlVHX1NUQVRJQywKLSAgLyogQSBsb2NhbCBzdGF0aWMgdmFyaWFibGUuICAqLwotICBERUJVR19MT0NBTF9TVEFUSUMsCi0gIC8qIEEgbG9jYWwgdmFyaWFibGUuICAqLwotICBERUJVR19MT0NBTCwKLSAgLyogQSByZWdpc3RlciB2YXJpYWJsZS4gICovCi0gIERFQlVHX1JFR0lTVEVSCi19OwotCi0vKiBEaWZmZXJlbnQga2luZHMgb2YgZnVuY3Rpb24gcGFyYW1ldGVycy4gICovCi0KLWVudW0gZGVidWdfcGFybV9raW5kCi17Ci0gIC8qIE5vdCB1c2VkLiAgKi8KLSAgREVCVUdfUEFSTV9JTExFR0FMLAotICAvKiBBIHN0YWNrIGJhc2VkIHBhcmFtZXRlci4gICovCi0gIERFQlVHX1BBUk1fU1RBQ0ssCi0gIC8qIEEgcmVnaXN0ZXIgcGFyYW1ldGVyLiAgKi8KLSAgREVCVUdfUEFSTV9SRUcsCi0gIC8qIEEgc3RhY2sgYmFzZWQgcmVmZXJlbmNlIHBhcmFtZXRlci4gICovCi0gIERFQlVHX1BBUk1fUkVGRVJFTkNFLAotICAvKiBBIHJlZ2lzdGVyIHJlZmVyZW5jZSBwYXJhbWV0ZXIuICAqLwotICBERUJVR19QQVJNX1JFRl9SRUcKLX07Ci0KLS8qIERpZmZlcmVudCBraW5kcyBvZiB2aXNpYmlsaXR5LiAgKi8KLQotZW51bSBkZWJ1Z192aXNpYmlsaXR5Ci17Ci0gIC8qIEEgcHVibGljIGZpZWxkIChlLmcuLCBhIGZpZWxkIGluIGEgQyBzdHJ1Y3QpLiAgKi8KLSAgREVCVUdfVklTSUJJTElUWV9QVUJMSUMsCi0gIC8qIEEgcHJvdGVjdGVkIGZpZWxkLiAgKi8KLSAgREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQsCi0gIC8qIEEgcHJpdmF0ZSBmaWVsZC4gICovCi0gIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURSwKLSAgLyogQSBmaWVsZCB3aGljaCBzaG91bGQgYmUgaWdub3JlZC4gICovCi0gIERFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFCi19OwotCi0vKiBBIHR5cGUuICAqLwotCi10eXBlZGVmIHN0cnVjdCBkZWJ1Z190eXBlICpkZWJ1Z190eXBlOwotCi0jZGVmaW5lIERFQlVHX1RZUEVfTlVMTCAoKGRlYnVnX3R5cGUpIE5VTEwpCi0KLS8qIEEgZmllbGQgaW4gYSBzdHJ1Y3Qgb3IgdW5pb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCBkZWJ1Z19maWVsZCAqZGVidWdfZmllbGQ7Ci0KLSNkZWZpbmUgREVCVUdfRklFTERfTlVMTCAoKGRlYnVnX2ZpZWxkKSBOVUxMKQotCi0vKiBBIGJhc2UgY2xhc3MgZm9yIGFuIG9iamVjdC4gICovCi0KLXR5cGVkZWYgc3RydWN0IGRlYnVnX2Jhc2VjbGFzcyAqZGVidWdfYmFzZWNsYXNzOwotCi0jZGVmaW5lIERFQlVHX0JBU0VDTEFTU19OVUxMICgoZGVidWdfYmFzZWNsYXNzKSBOVUxMKQotCi0vKiBBIG1ldGhvZCBvZiBhbiBvYmplY3QuICAqLwotCi10eXBlZGVmIHN0cnVjdCBkZWJ1Z19tZXRob2QgKmRlYnVnX21ldGhvZDsKLQotI2RlZmluZSBERUJVR19NRVRIT0RfTlVMTCAoKGRlYnVnX21ldGhvZCkgTlVMTCkKLQotLyogVGhlIGFyZ3VtZW50cyB0byBhIG1ldGhvZCBmdW5jdGlvbiBvZiBhbiBvYmplY3QuICBUaGVzZSBpbmRpY2F0ZQotICAgd2hpY2ggbWV0aG9kIHRvIHJ1bi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICpkZWJ1Z19tZXRob2RfdmFyaWFudDsKLQotI2RlZmluZSBERUJVR19NRVRIT0RfVkFSSUFOVF9OVUxMICgoZGVidWdfbWV0aG9kX3ZhcmlhbnQpIE5VTEwpCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHBhc3NlZCB0byBkZWJ1Z193cml0ZS4gIEl0IGhvbGRzIGZ1bmN0aW9uCi0gICBwb2ludGVycyB0aGF0IGRlYnVnX3dyaXRlIHdpbGwgY2FsbCBiYXNlZCBvbiB0aGUgYWNjdW11bGF0ZWQKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBkZWJ1Z193cml0ZV9mbnMKLXsKLSAgLyogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggbmV3IGNvbXBpbGF0aW9uIHVuaXQgd2l0aCB0aGUKLSAgICAgbmFtZSBvZiB0aGUgbWFpbiBmaWxlIGluIHRoZSBuZXcgdW5pdC4gICovCi0gIGJvb2xlYW4gKCpzdGFydF9jb21waWxhdGlvbl91bml0KSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0gIC8qIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHdpdGhpbiBhCi0gICAgIGNvbXBpbGF0aW9uIHVuaXQsIGJlZm9yZSBvdXRwdXR0aW5nIGFueSBnbG9iYWwgaW5mb3JtYXRpb24gZm9yCi0gICAgIHRoYXQgZmlsZS4gIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gICovCi0gIGJvb2xlYW4gKCpzdGFydF9zb3VyY2UpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLSAgLyogRWFjaCB3cml0ZXIgbXVzdCBrZWVwIGEgc3RhY2sgb2YgdHlwZXMuICAqLwotCi0gIC8qIFB1c2ggYW4gZW1wdHkgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgVGhpcyB0eXBlIGNhbiBhcHBlYXIgaWYKLSAgICAgdGhlcmUgaXMgYSByZWZlcmVuY2UgdG8gYSB0eXBlIHdoaWNoIGlzIG5ldmVyIGRlZmluZWQuICAqLwotICBib29sZWFuICgqZW1wdHlfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUHVzaCBhIHZvaWQgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnZvaWRfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUHVzaCBhbiBpbnRlZ2VyIHR5cGUgb250byB0aGUgdHlwZSBzdGFjaywgZ2l2ZW4gdGhlIHNpemUgYW5kCi0gICAgIHdoZXRoZXIgaXQgaXMgdW5zaWduZWQuICAqLwotICBib29sZWFuICgqaW50X3R5cGUpIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50LCBib29sZWFuKSk7Ci0KLSAgLyogUHVzaCBhIGZsb2F0aW5nIHR5cGUgb250byB0aGUgdHlwZSBzdGFjaywgZ2l2ZW4gdGhlIHNpemUuICAqLwotICBib29sZWFuICgqZmxvYXRfdHlwZSkgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLQotICAvKiBQdXNoIGEgY29tcGxleCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2ssIGdpdmVuIHRoZSBzaXplLiAgKi8KLSAgYm9vbGVhbiAoKmNvbXBsZXhfdHlwZSkgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLQotICAvKiBQdXNoIGEgYm9vbGVhbiB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2ssIGdpdmVuIHRoZSBzaXplLiAgKi8KLSAgYm9vbGVhbiAoKmJvb2xfdHlwZSkgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLQotICAvKiBQdXNoIGFuIGVudW0gdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLCBnaXZlbiB0aGUgdGFnLCBhIE5VTEwKLSAgICAgdGVybWluYXRlZCBhcnJheSBvZiBuYW1lcyBhbmQgdGhlIGFzc29jaWF0ZWQgdmFsdWVzLiAgSWYgdGhlcmUgaXMKLSAgICAgbm8gdGFnLCB0aGUgdGFnIGFyZ3VtZW50IHdpbGwgYmUgTlVMTC4gIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkCi0gICAgIGVudW0sIHRoZSBuYW1lcyBhbmQgdmFsdWVzIGFyZ3VtZW50cyB3aWxsIGJlIE5VTEwuICAqLwotICBib29sZWFuICgqZW51bV90eXBlKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwKLQkJCQliZmRfc2lnbmVkX3ZtYSAqKSk7Ci0KLSAgLyogUG9wIHRoZSB0b3AgdHlwZSBvbiB0aGUgdHlwZSBzdGFjaywgYW5kIHB1c2ggYSBwb2ludGVyIHRvIHRoYXQKLSAgICAgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnBvaW50ZXJfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUHVzaCBhIGZ1bmN0aW9uIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gIFRoZSBzZWNvbmQgYXJndW1lbnQKLSAgICAgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYXJndW1lbnQgdHlwZXMgdGhhdCBoYXZlIGJlZW4gcHVzaGVkIG9udG8KLSAgICAgdGhlIHN0YWNrLiAgSWYgdGhlIG51bWJlciBvZiBhcmd1bWVudCB0eXBlcyBpcyBwYXNzZWQgYXMgLTEsIHRoZW4KLSAgICAgdGhlIGFyZ3VtZW50IHR5cGVzIG9mIHRoZSBmdW5jdGlvbiBhcmUgdW5rbm93biwgYW5kIG5vIHR5cGVzIGhhdmUKLSAgICAgYmVlbiBwdXNoZWQgb250byB0aGUgc3RhY2suICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGUKLSAgICAgZnVuY3Rpb24gdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLiAgVGhlIHJldHVybiB0eXBlCi0gICAgIG9mIHRoZSBmdW5jdGlvbiBpcyBwdXNoZWQgb250byB0aGUgdHlwZSBzdGFjayBiZWxvdyB0aGUgYXJndW1lbnQKLSAgICAgdHlwZXMsIGlmIGFueS4gICovCi0gIGJvb2xlYW4gKCpmdW5jdGlvbl90eXBlKSBQQVJBTVMgKChQVFIsIGludCwgYm9vbGVhbikpOwotCi0gIC8qIFBvcCB0aGUgdG9wIHR5cGUgb24gdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgcmVmZXJlbmNlIHRvIHRoYXQKLSAgICAgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnJlZmVyZW5jZV90eXBlKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBQb3AgdGhlIHRvcCB0eXBlIG9uIHRoZSB0eXBlIHN0YWNrLCBhbmQgcHVzaCBhIHJhbmdlIG9mIHRoYXQgdHlwZQotICAgICB3aXRoIHRoZSBnaXZlbiBsb3dlciBhbmQgdXBwZXIgYm91bmRzIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqcmFuZ2VfdHlwZSkgUEFSQU1TICgoUFRSLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEpKTsKLQotICAvKiBQdXNoIGFuIGFycmF5IHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gIFRoZSB0b3AgdHlwZSBvbiB0aGUgdHlwZQotICAgICBzdGFjayBpcyB0aGUgcmFuZ2UsIGFuZCB0aGUgbmV4dCB0eXBlIG9uIHRoZSB0eXBlIHN0YWNrIGlzIHRoZQotICAgICBlbGVtZW50IHR5cGUuICBUaGVzZSBzaG91bGQgYmUgcG9wcGVkIGJlZm9yZSB0aGUgYXJyYXkgdHlwZSBpcwotICAgICBwdXNoZWQuICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgbG93ZXIgYm91bmQsIHRoZSB1cHBlciBib3VuZCwgYW5kCi0gICAgIHdoZXRoZXIgdGhlIGFycmF5IGlzIGEgc3RyaW5nLiAgKi8KLSAgYm9vbGVhbiAoKmFycmF5X3R5cGUpIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hLAotCQkJCSBib29sZWFuKSk7Ci0KLSAgLyogUG9wIHRoZSB0b3AgdHlwZSBvbiB0aGUgdHlwZSBzdGFjaywgYW5kIHB1c2ggYSBzZXQgb2YgdGhhdCB0eXBlCi0gICAgIG9udG8gdGhlIHR5cGUgc3RhY2suICBUaGUgYXJndW1lbnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBzZXQgaXMKLSAgICAgYSBiaXRzdHJpbmcuICAqLwotICBib29sZWFuICgqc2V0X3R5cGUpIFBBUkFNUyAoKFBUUiwgYm9vbGVhbikpOwotCi0gIC8qIFB1c2ggYW4gb2Zmc2V0IHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gIFRoZSB0b3AgdHlwZSBvbiB0aGUKLSAgICAgdHlwZSBzdGFjayBpcyB0aGUgdGFyZ2V0IHR5cGUsIGFuZCB0aGUgbmV4dCB0eXBlIG9uIHRoZSB0eXBlCi0gICAgIHN0YWNrIGlzIHRoZSBiYXNlIHR5cGUuICBUaGVzZSBzaG91bGQgYmUgcG9wcGVkIGJlZm9yZSB0aGUgb2Zmc2V0Ci0gICAgIHR5cGUgaXMgcHVzaGVkLiAgKi8KLSAgYm9vbGVhbiAoKm9mZnNldF90eXBlKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBQdXNoIGEgbWV0aG9kIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gIElmIHRoZSBzZWNvbmQgYXJndW1lbnQKLSAgICAgaXMgdHJ1ZSwgdGhlIHRvcCB0eXBlIG9uIHRoZSBzdGFjayBpcyB0aGUgY2xhc3MgdG8gd2hpY2ggdGhlCi0gICAgIG1ldGhvZCBiZWxvbmdzOyBvdGhlcndpc2UsIHRoZSBjbGFzcyBtdXN0IGJlIGRldGVybWluZWQgYnkgdGhlCi0gICAgIGNsYXNzIHRvIHdoaWNoIHRoZSBtZXRob2QgaXMgYXR0YWNoZWQuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlCi0gICAgIG51bWJlciBvZiBhcmd1bWVudCB0eXBlczsgdGhlc2UgYXJlIHB1c2hlZCBvbnRvIHRoZSB0eXBlIHN0YWNrIGluCi0gICAgIHJldmVyc2Ugb3JkZXIgKHRoZSBmaXJzdCB0eXBlIHBvcHBlZCBpcyB0aGUgbGFzdCBhcmd1bWVudCB0byB0aGUKLSAgICAgbWV0aG9kKS4gIEEgdmFsdWUgb2YgLTEgZm9yIHRoZSB0aGlyZCBhcmd1bWVudCBtZWFucyB0aGF0IG5vCi0gICAgIGFyZ3VtZW50IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4gIFRoZSBmb3VydGggYXJndW1lbnQgaXMgdHJ1ZQotICAgICBpZiB0aGUgZnVuY3Rpb24gdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLiAgVGhlIG5leHQKLSAgICAgdHlwZSBvbiB0aGUgdHlwZSBzdGFjayBiZWxvdyB0aGUgZG9tYWluIGFuZCB0aGUgYXJndW1lbnQgdHlwZXMgaXMKLSAgICAgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QuICBBbGwgdGhlc2UgdHlwZXMgbXVzdCBiZSBwb3BwZWQsCi0gICAgIGFuZCB0aGVuIHRoZSBtZXRob2QgdHlwZSBtdXN0IGJlIHB1c2hlZC4gICovCi0gIGJvb2xlYW4gKCptZXRob2RfdHlwZSkgUEFSQU1TICgoUFRSLCBib29sZWFuLCBpbnQsIGJvb2xlYW4pKTsKLQotICAvKiBQb3AgdGhlIHRvcCB0eXBlIG9mZiB0aGUgdHlwZSBzdGFjaywgYW5kIHB1c2ggYSBjb25zdCBxdWFsaWZpZWQKLSAgICAgdmVyc2lvbiBvZiB0aGF0IHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCpjb25zdF90eXBlKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBQb3AgdGhlIHRvcCB0eXBlIG9mZiB0aGUgdHlwZSBzdGFjaywgYW5kIHB1c2ggYSB2b2xhdGlsZQotICAgICBxdWFsaWZpZWQgdmVyc2lvbiBvZiB0aGF0IHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCp2b2xhdGlsZV90eXBlKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBTdGFydCBidWlsZGluZyBhIHN0cnVjdC4gIFRoaXMgaXMgZm9sbG93ZWQgYnkgY2FsbHMgdG8gdGhlCi0gICAgIHN0cnVjdF9maWVsZCBmdW5jdGlvbiwgYW5kIGZpbmlzaGVkIGJ5IGEgY2FsbCB0byB0aGUKLSAgICAgZW5kX3N0cnVjdF90eXBlIGZ1bmN0aW9uLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgdGFnOyB0aGlzCi0gICAgIHdpbGwgYmUgTlVMTCBpZiB0aGVyZSBpc24ndCBvbmUuICBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIE5VTEwsCi0gICAgIHRoZSB0aGlyZCBhcmd1bWVudCBpcyBhIGNvbnN0YW50IGlkZW50aWZ5aW5nIHRoaXMgc3RydWN0IGZvciB1c2UKLSAgICAgd2l0aCB0YWdfdHlwZS4gIFRoZSBmb3VydGggYXJndW1lbnQgaXMgdHJ1ZSBmb3IgYSBzdHJ1Y3QsIGZhbHNlCi0gICAgIGZvciBhIHVuaW9uLiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSBzaXplLiAgSWYgdGhpcyBpcyBhbgotICAgICB1bmRlZmluZWQgc3RydWN0IG9yIHVuaW9uLCB0aGUgc2l6ZSB3aWxsIGJlIDAgYW5kIHN0cnVjdF9maWVsZAotICAgICB3aWxsIG5vdCBiZSBjYWxsZWQgYmVmb3JlIGVuZF9zdHJ1Y3RfdHlwZSBpcyBjYWxsZWQuICAqLwotICBib29sZWFuICgqc3RhcnRfc3RydWN0X3R5cGUpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJCWJvb2xlYW4sIHVuc2lnbmVkIGludCkpOwotCi0gIC8qIEFkZCBhIGZpZWxkIHRvIHRoZSBzdHJ1Y3QgdHlwZSBjdXJyZW50bHkgYmVpbmcgYnVpbHQuICBUaGUgdHlwZQotICAgICBvZiB0aGUgZmllbGQgc2hvdWxkIGJlIHBvcHBlZCBvZmYgdGhlIHR5cGUgc3RhY2suICBUaGUgYXJndW1lbnRzCi0gICAgIGFyZSB0aGUgbmFtZSwgdGhlIGJpdCBwb3NpdGlvbiwgdGhlIGJpdCBzaXplIChtYXkgYmUgemVybyBpZiB0aGUKLSAgICAgZmllbGQgaXMgbm90IHBhY2tlZCksIGFuZCB0aGUgdmlzaWJpbGl0eS4gICovCi0gIGJvb2xlYW4gKCpzdHJ1Y3RfZmllbGQpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hLCBiZmRfdm1hLAotCQkJCSAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotCi0gIC8qIEZpbmlzaCBidWlsZGluZyBhIHN0cnVjdCwgYW5kIHB1c2ggaXQgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCplbmRfc3RydWN0X3R5cGUpIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFN0YXJ0IGJ1aWxkaW5nIGEgY2xhc3MuICBUaGlzIGlzIGZvbGxvd2VkIGJ5IGNhbGxzIHRvIHNldmVyYWwKLSAgICAgZnVuY3Rpb25zOiBzdHJ1Y3RfZmllbGQsIGNsYXNzX3N0YXRpY19tZW1iZXIsIGNsYXNzX2Jhc2VjbGFzcywKLSAgICAgY2xhc3Nfc3RhcnRfbWV0aG9kLCBjbGFzc19tZXRob2RfdmFyaWFudCwKLSAgICAgY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50LCBhbmQgY2xhc3NfZW5kX21ldGhvZC4gIFRoZSBjbGFzcyBpcwotICAgICBmaW5pc2hlZCBieSBhIGNhbGwgdG8gZW5kX2NsYXNzX3R5cGUuICBUaGUgZmlyc3QgZml2ZSBhcmd1bWVudHMKLSAgICAgYXJlIHRoZSBzYW1lIGFzIGZvciBzdGFydF9zdHJ1Y3RfdHlwZS4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcwotICAgICB0cnVlIGlmIHRoZXJlIGlzIGEgdmlydHVhbCBmdW5jdGlvbiB0YWJsZTsgaWYgdGhlcmUgaXMsIHRoZQotICAgICBzZXZlbnRoIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgY2FuIGJlCi0gICAgIGZvdW5kIGluIHRoZSB0eXBlIGl0c2VsZiwgYW5kIGlzIGZhbHNlIGlmIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QKLSAgICAgaG9sZGluZyB0aGUgdmlydHVhbCBmdW5jdGlvbiB0YWJsZSBzaG91bGQgYmUgcG9wcGVkIGZyb20gdGhlIHR5cGUKLSAgICAgc3RhY2suICAqLwotICBib29sZWFuICgqc3RhcnRfY2xhc3NfdHlwZSkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwKLQkJCQkgICAgICAgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBib29sZWFuLAotCQkJCSAgICAgICBib29sZWFuKSk7Ci0KLSAgLyogQWRkIGEgc3RhdGljIG1lbWJlciB0byB0aGUgY2xhc3MgY3VycmVudGx5IGJlaW5nIGJ1aWx0LiAgVGhlCi0gICAgIGFyZ3VtZW50cyBhcmUgdGhlIGZpZWxkIG5hbWUsIHRoZSBwaHlzaWNhbCBuYW1lLCBhbmQgdGhlCi0gICAgIHZpc2liaWxpdHkuICBUaGUgdHlwZSBtdXN0IGJlIHBvcHBlZCBvZmYgdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqY2xhc3Nfc3RhdGljX21lbWJlcikgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKLQkJCQkJICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLSAgCi0gIC8qIEFkZCBhIGJhc2VjbGFzcyB0byB0aGUgY2xhc3MgY3VycmVudGx5IGJlaW5nIGJ1aWx0LiAgVGhlIHR5cGUgb2YKLSAgICAgdGhlIGJhc2VjbGFzcyBtdXN0IGJlIHBvcHBlZCBvZmYgdGhlIHR5cGUgc3RhY2suICBUaGUgYXJndW1lbnRzCi0gICAgIGFyZSB0aGUgYml0IHBvc2l0aW9uLCB3aGV0aGVyIHRoZSBjbGFzcyBpcyB2aXJ0dWFsLCBhbmQgdGhlCi0gICAgIHZpc2liaWxpdHkuICAqLwotICBib29sZWFuICgqY2xhc3NfYmFzZWNsYXNzKSBQQVJBTVMgKChQVFIsIGJmZF92bWEsIGJvb2xlYW4sCi0JCQkJICAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci0KLSAgLyogU3RhcnQgYWRkaW5nIGEgbWV0aG9kIHRvIHRoZSBjbGFzcyBjdXJyZW50bHkgYmVpbmcgYnVpbHQuICBUaGlzCi0gICAgIGlzIGZvbGxvd2VkIGJ5IGNhbGxzIHRvIGNsYXNzX21ldGhvZF92YXJpYW50IGFuZAotICAgICBjbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQgdG8gZGVzY3JpYmUgZGlmZmVyZW50IHZhcmlhbnRzIG9mIHRoZQotICAgICBtZXRob2Qgd2hpY2ggdGFrZSBkaWZmZXJlbnQgYXJndW1lbnRzLiAgVGhlIG1ldGhvZCBpcyBmaW5pc2hlZAotICAgICB3aXRoIGEgY2FsbCB0byBjbGFzc19lbmRfbWV0aG9kLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBtZXRob2QKLSAgICAgbmFtZS4gICovCi0gIGJvb2xlYW4gKCpjbGFzc19zdGFydF9tZXRob2QpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLSAgLyogRGVzY3JpYmUgYSB2YXJpYW50IHRvIHRoZSBjbGFzcyBtZXRob2QgY3VycmVudGx5IGJlaW5nIGJ1aWx0LgotICAgICBUaGUgdHlwZSBvZiB0aGUgdmFyaWFudCBtdXN0IGJlIHBvcHBlZCBvZmYgdGhlIHR5cGUgc3RhY2suICBUaGUKLSAgICAgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSBmdW5jdGlvbi4gIFRoZQotICAgICBmb2xsb3dpbmcgYXJndW1lbnRzIGFyZSB0aGUgdmlzaWJpbGl0eSwgd2hldGhlciB0aGUgdmFyaWFudCBpcwotICAgICBjb25zdCwgd2hldGhlciB0aGUgdmFyaWFudCBpcyB2b2xhdGlsZSwgdGhlIG9mZnNldCBpbiB0aGUgdmlydHVhbAotICAgICBmdW5jdGlvbiB0YWJsZSwgYW5kIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMgb24gdGhlIHR5cGUgc3RhY2sKLSAgICAgKGJlbG93IHRoZSB2YXJpYW50IHR5cGUpLiAgKi8KLSAgYm9vbGVhbiAoKmNsYXNzX21ldGhvZF92YXJpYW50KSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwKLQkJCQkJICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5LAotCQkJCQkgICBib29sZWFuLCBib29sZWFuLAotCQkJCQkgICBiZmRfdm1hLCBib29sZWFuKSk7Ci0KLSAgLyogRGVzY3JpYmUgYSBzdGF0aWMgdmFyaWFudCB0byB0aGUgY2xhc3MgbWV0aG9kIGN1cnJlbnRseSBiZWluZwotICAgICBidWlsdC4gIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciBjbGFzc19tZXRob2RfdmFyaWFudCwKLSAgICAgZXhjZXB0IHRoYXQgdGhlIGxhc3QgdHdvIGFyZ3VtZW50cyBhcmUgb21pdHRlZC4gIFRoZSB0eXBlIG9mIHRoZQotICAgICB2YXJpYW50IG11c3QgYmUgcG9wcGVkIG9mZiB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCpjbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLAotCQkJCQkJICBlbnVtIGRlYnVnX3Zpc2liaWxpdHksCi0JCQkJCQkgIGJvb2xlYW4sIGJvb2xlYW4pKTsKLQotICAvKiBGaW5pc2ggZGVzY3JpYmluZyBhIGNsYXNzIG1ldGhvZC4gICovCi0gIGJvb2xlYW4gKCpjbGFzc19lbmRfbWV0aG9kKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBGaW5pc2ggZGVzY3JpYmluZyBhIGNsYXNzLCBhbmQgcHVzaCBpdCBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKmVuZF9jbGFzc190eXBlKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBQdXNoIGEgdHlwZSBvbiB0aGUgc3RhY2sgd2hpY2ggd2FzIGdpdmVuIGEgbmFtZSBieSBhbiBlYXJsaWVyCi0gICAgIGNhbGwgdG8gdHlwZGVmLiAgKi8KLSAgYm9vbGVhbiAoKnR5cGVkZWZfdHlwZSkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotICAvKiBQdXNoIGEgdGFnZ2VkIHR5cGUgb24gdGhlIHN0YWNrIHdoaWNoIHdhcyBkZWZpbmVkIGVhcmxpZXIuICBJZgotICAgICB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCB0aGUgdHlwZSB3YXMgZGVmaW5lZCBieSBhIGNhbGwKLSAgICAgdG8gdGFnLiAgSWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBOVUxMLCB0aGUgdHlwZSB3YXMgZGVmaW5lZCBieQotICAgICBhIGNhbGwgdG8gc3RhcnRfc3RydWN0X3R5cGUgb3Igc3RhcnRfY2xhc3NfdHlwZSB3aXRoIGEgdGFnIG9mCi0gICAgIE5VTEwgYW5kIHRoZSBudW1iZXIgb2YgdGhlIHRoaXJkIGFyZ3VtZW50LiAgRWl0aGVyIHdheSwgdGhlCi0gICAgIGZvdXJ0aCBhcmd1bWVudCBpcyB0aGUgdGFnIGtpbmQuICBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgY2FsbGVkCi0gICAgIGZvciBhIHN0cnVjdCAoY2xhc3MpIGJlaW5nIGRlZmluZWQsIGluIGJldHdlZW4gdGhlIGNhbGwgdG8KLSAgICAgc3RhcnRfc3RydWN0X3R5cGUgKHN0YXJ0X2NsYXNzX3R5cGUpIGFuZCB0aGUgY2FsbCB0bwotICAgICBlbmRfc3RydWN0X3R5cGUgKGVuZF9jbGFzc190eXBlKS4gICovCi0gIGJvb2xlYW4gKCp0YWdfdHlwZSkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwKLQkJCSAgICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCkpOwotCi0gIC8qIFBvcCB0aGUgdHlwZSBzdGFjaywgYW5kIHR5cGVkZWYgaXQgdG8gdGhlIGdpdmVuIG5hbWUuICAqLwotICBib29sZWFuICgqdHlwZGVmKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0gIC8qIFBvcCB0aGUgdHlwZSBzdGFjaywgYW5kIGRlY2xhcmUgaXQgYXMgYSB0YWdnZWQgc3RydWN0IG9yIHVuaW9uIG9yCi0gICAgIGVudW0gb3Igd2hhdGV2ZXIuICBUaGUgdGFnIHBhc3NlZCBkb3duIGhlcmUgaXMgcmVkdW5kYW50LCBzaW5jZQotICAgICB3YXMgYWxzbyBwYXNzZWQgd2hlbiBlbnVtX3R5cGUsIHN0YXJ0X3N0cnVjdF90eXBlLCBvcgotICAgICBzdGFydF9jbGFzc190eXBlIHdhcyBjYWxsZWQuICAqLwotICBib29sZWFuICgqdGFnKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0gIC8qIFRoaXMgaXMgY2FsbGVkIHRvIHJlY29yZCBhIG5hbWVkIGludGVnZXIgY29uc3RhbnQuICAqLwotICBib29sZWFuICgqaW50X2NvbnN0YW50KSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotCi0gIC8qIFRoaXMgaXMgY2FsbGVkIHRvIHJlY29yZCBhIG5hbWVkIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KLSAgYm9vbGVhbiAoKmZsb2F0X2NvbnN0YW50KSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZG91YmxlKSk7Ci0KLSAgLyogVGhpcyBpcyBjYWxsZWQgdG8gcmVjb3JkIGEgdHlwZWQgaW50ZWdlciBjb25zdGFudC4gIFRoZSB0eXBlIGlzCi0gICAgIHBvcHBlZCBvZmYgdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqdHlwZWRfY29uc3RhbnQpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci0KLSAgLyogVGhpcyBpcyBjYWxsZWQgdG8gcmVjb3JkIGEgdmFyaWFibGUuICBUaGUgdHlwZSBpcyBwb3BwZWQgb2ZmIHRoZQotICAgICB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnZhcmlhYmxlKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192YXJfa2luZCwKLQkJCSAgICAgICBiZmRfdm1hKSk7Ci0KLSAgLyogU3RhcnQgd3JpdGluZyBvdXQgYSBmdW5jdGlvbi4gIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHBvcHBlZCBvZmYKLSAgICAgdGhlIHN0YWNrLiAgVGhlIGJvb2xlYW4gaXMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gaXMgZ2xvYmFsLiAgVGhpcwotICAgICBpcyBmb2xsb3dlZCBieSBjYWxscyB0byBmdW5jdGlvbl9wYXJhbWV0ZXIsIGZvbGxvd2VkIGJ5IGJsb2NrCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgYm9vbGVhbiAoKnN0YXJ0X2Z1bmN0aW9uKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotCi0gIC8qIFJlY29yZCBhIGZ1bmN0aW9uIHBhcmFtZXRlciBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICBUaGUgdHlwZQotICAgICBtdXN0IGJlIHBvcHBlZCBvZmYgdGhlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKmZ1bmN0aW9uX3BhcmFtZXRlcikgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosCi0JCQkJCSBlbnVtIGRlYnVnX3Bhcm1fa2luZCwgYmZkX3ZtYSkpOwotCi0gIC8qIFN0YXJ0IHdyaXRpbmcgb3V0IGEgYmxvY2suICBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgdG9wIGxldmVsIGJsb2NrCi0gICAgIHBlciBmdW5jdGlvbi4gIEJsb2NrcyBtYXkgYmUgbmVzdGVkLiAgVGhlIGFyZ3VtZW50IGlzIHRoZQotICAgICBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBibG9jay4gICovCi0gIGJvb2xlYW4gKCpzdGFydF9ibG9jaykgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci0KLSAgLyogRmluaXNoIHdyaXRpbmcgb3V0IGEgYmxvY2suICBUaGUgYXJndW1lbnQgaXMgdGhlIGVuZGluZyBhZGRyZXNzCi0gICAgIG9mIHRoZSBibG9jay4gICovCi0gIGJvb2xlYW4gKCplbmRfYmxvY2spIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSkpOwotCi0gIC8qIEZpbmlzaCB3cml0aW5nIG91dCBhIGZ1bmN0aW9uLiAgKi8KLSAgYm9vbGVhbiAoKmVuZF9mdW5jdGlvbikgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUmVjb3JkIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgYm9vbGVhbiAoKmxpbmVubykgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGJmZF92bWEpKTsKLX07Ci0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucy4gICovCi0KLS8qIFRoZSBmaXJzdCBhcmd1bWVudCB0byBtb3N0IG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBhIGhhbmRsZS4gIFRoaXMKLSAgIGhhbmRsZSBpcyByZXR1cm5lZCBieSB0aGUgZGVidWdfaW5pdCBmdW5jdGlvbi4gIFRoZSBwdXJwb3NlIG9mIHRoZQotICAgaGFuZGxlIGlzIHRvIHBlcm1pdCB0aGUgZGVidWdnaW5nIHJvdXRpbmVzIHRvIG5vdCB1c2Ugc3RhdGljCi0gICB2YXJpYWJsZXMsIGFuZCBoZW5jZSB0byBiZSByZWVudHJhbnQuICBUaGlzIHdvdWxkIGJlIHVzZWZ1bCBmb3IgYQotICAgcHJvZ3JhbSB3aGljaCB3YW50ZWQgdG8gaGFuZGxlIHR3byBleGVjdXRhYmxlcyBzaW11bHRhbmVvdXNseS4gICovCi0KLS8qIFJldHVybiBhIGRlYnVnZ2luZyBoYW5kbGUuICAqLwotCi1leHRlcm4gUFRSIGRlYnVnX2luaXQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBTZXQgdGhlIHNvdXJjZSBmaWxlbmFtZS4gIFRoaXMgaW1wbGljaXRseSBzdGFydHMgYSBuZXcgY29tcGlsYXRpb24KLSAgIHVuaXQuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19zZXRfZmlsZW5hbWUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotLyogQ2hhbmdlIHNvdXJjZSBmaWxlcyB0byB0aGUgZ2l2ZW4gZmlsZSBuYW1lLiAgVGhpcyBpcyB1c2VkIGZvcgotICAgaW5jbHVkZSBmaWxlcyBpbiBhIHNpbmdsZSBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfc3RhcnRfc291cmNlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIFJlY29yZCBhIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGlzIGltcGxpY2l0bHkgc3RhcnRzIGEgZnVuY3Rpb24KLSAgIGJsb2NrLiAgVGhlIGRlYnVnX3R5cGUgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIHJldHVybiB2YWx1ZS4KLSAgIFRoZSBib29sZWFuIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpcyBnbG9iYWxseSB2aXNpYmxlLgotICAgVGhlIGJmZF92bWEgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4gIEN1cnJlbnRseQotICAgdGhlIHBhcmFtZXRlciB0eXBlcyBhcmUgc3BlY2lmaWVkIGJ5IGNhbGxzIHRvCi0gICBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX2Z1bmN0aW9uCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBib29sZWFuLCBiZmRfdm1hKSk7Ci0KLS8qIFJlY29yZCBhIHBhcmFtZXRlciBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBlbnVtIGRlYnVnX3Bhcm1fa2luZCwgYmZkX3ZtYSkpOwotCi0vKiBFbmQgYSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZQotICAgZnVuY3Rpb24gZW5kcy4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX2VuZF9mdW5jdGlvbiBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLQotLyogU3RhcnQgYSBibG9jayBpbiBhIGZ1bmN0aW9uLiAgQWxsIGxvY2FsIGluZm9ybWF0aW9uIHdpbGwgYmUKLSAgIHJlY29yZGVkIGluIHRoaXMgYmxvY2ssIHVudGlsIHRoZSBtYXRjaGluZyBjYWxsIHRvIGRlYnVnX2VuZF9ibG9jay4KLSAgIGRlYnVnX3N0YXJ0X2Jsb2NrIGFuZCBkZWJ1Z19lbmRfYmxvY2sgbWF5IGJlIG5lc3RlZC4gIFRoZSBhcmd1bWVudAotICAgaXMgdGhlIGFkZHJlc3MgYXQgd2hpY2ggdGhpcyBibG9jayBzdGFydHMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19zdGFydF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLQotLyogRmluaXNoIGEgYmxvY2sgaW4gYSBmdW5jdGlvbi4gIFRoaXMgbWF0Y2hlcyB0aGUgY2FsbCB0bwotICAgZGVidWdfc3RhcnRfYmxvY2suICBUaGUgYXJndW1lbnQgaXMgdGhlIGFkZHJlc3MgYXQgd2hpY2ggdGhpcyBibG9jawotICAgZW5kcy4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX2VuZF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLQotLyogQXNzb2NpYXRlIGEgbGluZSBudW1iZXIgaW4gdGhlIGN1cnJlbnQgc291cmNlIGZpbGUgd2l0aCBhIGdpdmVuCi0gICBhZGRyZXNzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX2xpbmUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBsb25nLCBiZmRfdm1hKSk7Ci0KLS8qIFN0YXJ0IGEgbmFtZWQgY29tbW9uIGJsb2NrLiAgVGhpcyBpcyBhIGJsb2NrIG9mIHZhcmlhYmxlcyB0aGF0IG1heQotICAgbW92ZSBpbiBtZW1vcnkuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19zdGFydF9jb21tb25fYmxvY2sgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotLyogRW5kIGEgbmFtZWQgY29tbW9uIGJsb2NrLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfZW5kX2NvbW1vbl9ibG9jayBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0vKiBSZWNvcmQgYSBuYW1lZCBpbnRlZ2VyIGNvbnN0YW50LiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX2ludF9jb25zdCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotCi0vKiBSZWNvcmQgYSBuYW1lZCBmbG9hdGluZyBwb2ludCBjb25zdGFudC4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF9mbG9hdF9jb25zdCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZG91YmxlKSk7Ci0KLS8qIFJlY29yZCBhIHR5cGVkIGNvbnN0YW50IHdpdGggYW4gaW50ZWdyYWwgdmFsdWUuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfdHlwZWRfY29uc3QKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsIGJmZF92bWEpKTsKLQotLyogUmVjb3JkIGEgbGFiZWwuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfbGFiZWwKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsIGJmZF92bWEpKTsKLQotLyogUmVjb3JkIGEgdmFyaWFibGUuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsIGVudW0gZGVidWdfdmFyX2tpbmQsIGJmZF92bWEpKTsKLQotLyogTWFrZSBhbiBpbmRpcmVjdCB0eXBlLiAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byB0aGUKLSAgIGxvY2F0aW9uIHdoZXJlIHRoZSByZWFsIHR5cGUgd2lsbCBiZSBwbGFjZWQuICBUaGUgc2Vjb25kIGFyZ3VtZW50Ci0gICBpcyB0aGUgdHlwZSB0YWcsIGlmIHRoZXJlIGlzIG9uZTsgdGhpcyBtYXkgYmUgTlVMTDsgdGhlIG9ubHkKLSAgIHB1cnBvc2Ugb2YgdGhpcyBhcmd1bWVudCBpcyBzbyB0aGF0IGRlYnVnX2dldF90eXBlX25hbWUgY2FuIHJldHVybgotICAgc29tZXRoaW5nIHVzZWZ1bC4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgd2hlbiBhIHR5cGUgaXMKLSAgIHJlZmVyZW5jZWQgYmVmb3JlIGl0IGlzIGRlZmluZWQuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBNYWtlIGEgdm9pZCB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV92b2lkX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci0KLS8qIE1ha2UgYW4gaW50ZWdlciB0eXBlIG9mIGEgZ2l2ZW4gc2l6ZS4gIFRoZSBib29sZWFuIGFyZ3VtZW50IGlzIHRydWUKLSAgIGlmIHRoZSBpbnRlZ2VyIGlzIHVuc2lnbmVkLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9pbnRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotCi0vKiBNYWtlIGEgZmxvYXRpbmcgcG9pbnQgdHlwZSBvZiBhIGdpdmVuIHNpemUuICBGSVhNRTogT24gc29tZQotICAgcGxhdGZvcm1zLCBsaWtlIGFuIEFscGhhLCB5b3UgcHJvYmFibHkgbmVlZCB0byBiZSBhYmxlIHRvIHNwZWNpZnkKLSAgIHRoZSBmb3JtYXQuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLQotLyogTWFrZSBhIGJvb2xlYW4gdHlwZSBvZiBhIGdpdmVuIHNpemUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2Jvb2xfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotCi0vKiBNYWtlIGEgY29tcGxleCB0eXBlIG9mIGEgZ2l2ZW4gc2l6ZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfY29tcGxleF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci0KLS8qIE1ha2UgYSBzdHJ1Y3R1cmUgdHlwZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdHJ1ZSBmb3IgYSBzdHJ1Y3QsCi0gICBmYWxzZSBmb3IgYSB1bmlvbi4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0LgotICAgVGhlIGZvdXJ0aCBhcmd1bWVudCBpcyBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBmaWVsZHMuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgYm9vbGVhbiwgYmZkX3ZtYSwgZGVidWdfZmllbGQgKikpOwotCi0vKiBNYWtlIGFuIG9iamVjdCB0eXBlLiAgVGhlIGZpcnN0IHRocmVlIGFyZ3VtZW50cyBhZnRlciB0aGUgaGFuZGxlCi0gICBhcmUgdGhlIHNhbWUgYXMgZm9yIGRlYnVnX21ha2Vfc3RydWN0X3R5cGUuICBUaGUgbmV4dCBhcmd1bWVudHMgYXJlCi0gICBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBiYXNlIGNsYXNzZXMsIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mCi0gICBtZXRob2RzLCB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGhvbGRpbmcgdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUKLSAgIGlmIGl0IGlzIG5vdCB0aGlzIG9iamVjdCwgYW5kIGEgYm9vbGVhbiB3aGljaCBpcyB0cnVlIGlmIHRoaXMKLSAgIG9iamVjdCBoYXMgaXRzIG93biB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9vYmplY3RfdHlwZQotICBQQVJBTVMgKChQVFIsIGJvb2xlYW4sIGJmZF92bWEsIGRlYnVnX2ZpZWxkICosIGRlYnVnX2Jhc2VjbGFzcyAqLAotCSAgIGRlYnVnX21ldGhvZCAqLCBkZWJ1Z190eXBlLCBib29sZWFuKSk7Ci0KLS8qIE1ha2UgYW4gZW51bWVyYXRpb24gdHlwZS4gIFRoZSBhcmd1bWVudHMgYXJlIGEgbnVsbCB0ZXJtaW5hdGVkCi0gICBhcnJheSBvZiBzdHJpbmdzLCBhbmQgYW4gYXJyYXkgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2VudW1fdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiosIGJmZF9zaWduZWRfdm1hICopKTsKLQotLyogTWFrZSBhIHBvaW50ZXIgdG8gYSBnaXZlbiB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9wb2ludGVyX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIE1ha2UgYSBmdW5jdGlvbiB0eXBlLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgcmV0dXJuIHR5cGUuICBUaGUKLSAgIHRoaXJkIGFyZ3VtZW50IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzLiAgVGhlCi0gICBmb3VydGggYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YKLSAgIGFyZ3VtZW50cy4gIElmIHRoZSB0aGlyZCBhcmd1bWVudCBpcyBOVUxMLCB0aGVuIHRoZSBhcmd1bWVudCB0eXBlcwotICAgYXJlIHVua25vd24uICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBkZWJ1Z190eXBlICosIGJvb2xlYW4pKTsKLQotLyogTWFrZSBhIHJlZmVyZW5jZSB0byBhIGdpdmVuIHR5cGUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX3JlZmVyZW5jZV90eXBlIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBNYWtlIGEgcmFuZ2Ugb2YgYSBnaXZlbiB0eXBlIGZyb20gYSBsb3dlciB0byBhbiB1cHBlciBib3VuZC4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfcmFuZ2VfdHlwZQotICBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOwotCi0vKiBNYWtlIGFuIGFycmF5IHR5cGUuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIGFuIGVsZW1lbnQKLSAgIG9mIHRoZSBhcnJheS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiBhIHJhbmdlIG9mIHRoZQotICAgYXJyYXkuICBUaGUgZm91cnRoIGFuZCBmaWZ0aCBhcmd1bWVudCBhcmUgdGhlIGxvd2VyIGFuZCB1cHBlcgotICAgYm91bmRzLCByZXNwZWN0aXZlbHkgKGlmIHRoZSBib3VuZHMgYXJlIG5vdCBrbm93biwgbG93ZXIgc2hvdWxkIGJlCi0gICAwIGFuZCB1cHBlciBzaG91bGQgYmUgLTEpLiAgVGhlIHNpeHRoIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhpcwotICAgYXJyYXkgaXMgYWN0dWFsbHkgYSBzdHJpbmcsIGFzIGluIEMuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2FycmF5X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBkZWJ1Z190eXBlLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEsCi0JICAgYm9vbGVhbikpOwotCi0vKiBNYWtlIGEgc2V0IG9mIGEgZ2l2ZW4gdHlwZS4gIEZvciBleGFtcGxlLCBhIFBhc2NhbCBzZXQgdHlwZS4gIFRoZQotICAgYm9vbGVhbiBhcmd1bWVudCBpcyB0cnVlIGlmIHRoaXMgc2V0IGlzIGFjdHVhbGx5IGEgYml0c3RyaW5nLCBhcyBpbgotICAgQ0hJTEwuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX3NldF90eXBlIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgYm9vbGVhbikpOwotCi0vKiBNYWtlIGEgdHlwZSBmb3IgYSBwb2ludGVyIHdoaWNoIGlzIHJlbGF0aXZlIHRvIGFuIG9iamVjdC4gIFRoZQotICAgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgdG8gd2hpY2ggdGhlIHBvaW50ZXIgaXMKLSAgIHJlbGF0aXZlLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIHRoYXQgdGhlIHBvaW50ZXIgcG9pbnRzCi0gICB0by4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2Vfb2Zmc2V0X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIE1ha2UgYSB0eXBlIGZvciBhIG1ldGhvZCBmdW5jdGlvbi4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlCi0gICByZXR1cm4gdHlwZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgZG9tYWluLiAgVGhlIGZvdXJ0aAotICAgYXJndW1lbnQgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYXJndW1lbnQgdHlwZXMuICBUaGUgZmlmdGgKLSAgIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhlIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mCi0gICBhcmd1bWVudHMsIGluIHdoaWNoIGNhc2UgdGhlIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzIGluZGljYXRlcyB0aGUKLSAgIHR5cGVzIG9mIHRoZSBmaXJzdCBhcmd1bWVudHMuICBUaGUgZG9tYWluIGFuZCB0aGUgYXJndW1lbnQgYXJyYXkKLSAgIG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIHRoaXMgaXMgYSBzdHViIG1ldGhvZCBhbmQgdGhhdAotICAgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4gIFN0YWJzIGRlYnVnZ2luZyB1c2VzIHRoaXMsIGFuZCBnZXRzCi0gICB0aGUgYXJndW1lbnQgdHlwZXMgZnJvbSB0aGUgbWFuZ2xlZCBuYW1lLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9tZXRob2RfdHlwZQotICBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUsIGRlYnVnX3R5cGUsIGRlYnVnX3R5cGUgKiwgYm9vbGVhbikpOwotCi0vKiBNYWtlIGEgY29uc3QgcXVhbGlmaWVkIHZlcnNpb24gb2YgYSBnaXZlbiB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9jb25zdF90eXBlIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBNYWtlIGEgdm9sYXRpbGUgcXVhbGlmaWVkIHZlcnNpb24gb2YgYSBnaXZlbiB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV92b2xhdGlsZV90eXBlIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBNYWtlIGFuIHVuZGVmaW5lZCB0YWdnZWQgdHlwZS4gIEZvciBleGFtcGxlLCBhIHN0cnVjdCB3aGljaCBoYXMKLSAgIGJlZW4gbWVudGlvbmVkLCBidXQgbm90IGRlZmluZWQuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX3VuZGVmaW5lZF90YWdnZWRfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z190eXBlX2tpbmQpKTsKLQotLyogTWFrZSBhIGJhc2UgY2xhc3MgZm9yIGFuIG9iamVjdC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIGJhc2UKLSAgIGNsYXNzIHR5cGUuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIGJpdCBwb3NpdGlvbiBvZiB0aGlzIGJhc2UKLSAgIGNsYXNzIGluIHRoZSBvYmplY3QuICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzIHdoZXRoZXIgdGhpcyBpcyBhCi0gICB2aXJ0dWFsIGNsYXNzLiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBiYXNlCi0gICBjbGFzcy4gICovCi0KLWV4dGVybiBkZWJ1Z19iYXNlY2xhc3MgZGVidWdfbWFrZV9iYXNlY2xhc3MKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBiZmRfdm1hLCBib29sZWFuLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLQotLyogTWFrZSBhIGZpZWxkIGZvciBhIHN0cnVjdC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIG5hbWUuICBUaGUKLSAgIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZC4gIFRoZSBmb3VydGggYXJndW1lbnQgaXMKLSAgIHRoZSBiaXQgcG9zaXRpb24gb2YgdGhlIGZpZWxkLiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSBzaXplIG9mCi0gICB0aGUgZmllbGQgKGl0IG1heSBiZSB6ZXJvKS4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eQotICAgb2YgdGhlIGZpZWxkLiAgKi8KLQotZXh0ZXJuIGRlYnVnX2ZpZWxkIGRlYnVnX21ha2VfZmllbGQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsIGJmZF92bWEsIGJmZF92bWEsCi0JICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci0KLS8qIE1ha2UgYSBzdGF0aWMgbWVtYmVyIG9mIGFuIG9iamVjdC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlCi0gICBuYW1lLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBtZW1iZXIuICBUaGUgZm91cnRoCi0gICBhcmd1bWVudCBpcyB0aGUgcGh5c2ljYWwgbmFtZSBvZiB0aGUgbWVtYmVyIChpLmUuLCB0aGUgbmFtZSBhcyBhCi0gICBnbG9iYWwgdmFyaWFibGUpLiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZQotICAgbWVtYmVyLiAgKi8KLQotZXh0ZXJuIGRlYnVnX2ZpZWxkIGRlYnVnX21ha2Vfc3RhdGljX21lbWJlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgY29uc3QgY2hhciAqLAotCSAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotCi0vKiBNYWtlIGEgbWV0aG9kLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgbmFtZSwgYW5kIHRoZSB0aGlyZAotICAgYXJndW1lbnQgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgbWV0aG9kIHZhcmlhbnRzLiAgRWFjaAotICAgbWV0aG9kIHZhcmlhbnQgaXMgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgYnV0IHdpdGggZGlmZmVyZW50Ci0gICBhcmd1bWVudCB0eXBlcy4gICovCi0KLWV4dGVybiBkZWJ1Z19tZXRob2QgZGVidWdfbWFrZV9tZXRob2QKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX21ldGhvZF92YXJpYW50ICopKTsKLQotLyogTWFrZSBhIG1ldGhvZCB2YXJpYW50LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgcGh5c2ljYWwgbmFtZSBvZgotICAgdGhlIGZ1bmN0aW9uLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiwKLSAgIHByb2JhYmx5IGNvbnN0cnVjdGVkIGJ5IGRlYnVnX21ha2VfbWV0aG9kX3R5cGUuICBUaGUgZm91cnRoCi0gICBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eS4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB3aGV0aGVyIHRoaXMgaXMKLSAgIGEgY29uc3QgZnVuY3Rpb24uICBUaGUgc2l4dGggYXJndW1lbnQgaXMgd2hldGhlciB0aGlzIGlzIGEgdm9sYXRpbGUKLSAgIGZ1bmN0aW9uLiAgVGhlIHNldmVudGggYXJndW1lbnQgaXMgdGhlIGluZGV4IGluIHRoZSB2aXJ0dWFsCi0gICBmdW5jdGlvbiB0YWJsZSwgaWYgYW55LiAgVGhlIGVpZ2h0aCBhcmd1bWVudCBpcyB0aGUgdmlydHVhbAotICAgZnVuY3Rpb24gY29udGV4dC4gICovCi0KLWV4dGVybiBkZWJ1Z19tZXRob2RfdmFyaWFudCBkZWJ1Z19tYWtlX21ldGhvZF92YXJpYW50Ci0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sCi0JICAgYm9vbGVhbiwgYmZkX3ZtYSwgZGVidWdfdHlwZSkpOwotCi0vKiBNYWtlIGEgc3RhdGljIG1ldGhvZCBhcmd1bWVudC4gIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvcgotICAgZGVidWdfbWFrZV9tZXRob2RfdmFyaWFudCwgZXhjZXB0IHRoYXQgdGhlIGxhc3QgdHdvIGFyZSBvbWl0dGVkCi0gICBzaW5jZSBhIHN0YXRpYyBtZXRob2QgY2FuIG5vdCBhbHNvIGJlIHZpcnR1YWwuICAqLwotCi1leHRlcm4gZGVidWdfbWV0aG9kX3ZhcmlhbnQgZGVidWdfbWFrZV9zdGF0aWNfbWV0aG9kX3ZhcmlhbnQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwKLQkgICBib29sZWFuKSk7Ci0KLS8qIE5hbWUgYSB0eXBlLiAgVGhpcyByZXR1cm5zIGEgbmV3IHR5cGUgd2l0aCBhbiBhdHRhY2hlZCBuYW1lLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbmFtZV90eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIEdpdmUgYSB0YWcgdG8gYSB0eXBlLCBzdWNoIGFzIGEgc3RydWN0IG9yIHVuaW9uLiAgVGhpcyByZXR1cm5zIGEKLSAgIG5ldyB0eXBlIHdpdGggYW4gYXR0YWNoZWQgdGFnLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfdGFnX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUpKTsKLQotLyogUmVjb3JkIHRoZSBzaXplIG9mIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF90eXBlX3NpemUgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCB1bnNpZ25lZCBpbnQpKTsKLQotLyogRmluZCBhIG5hbWVkIHR5cGUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotLyogRmluZCBhIHRhZ2dlZCB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfZmluZF90YWdnZWRfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z190eXBlX2tpbmQpKTsKLQotLyogR2V0IHRoZSBraW5kIG9mIGEgdHlwZS4gICovCi0KLWV4dGVybiBlbnVtIGRlYnVnX3R5cGVfa2luZCBkZWJ1Z19nZXRfdHlwZV9raW5kIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBHZXQgdGhlIG5hbWUgb2YgYSB0eXBlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmRlYnVnX2dldF90eXBlX25hbWUgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIEdldCB0aGUgc2l6ZSBvZiBhIHR5cGUuICAqLwotCi1leHRlcm4gYmZkX3ZtYSBkZWJ1Z19nZXRfdHlwZV9zaXplIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBHZXQgdGhlIHJldHVybiB0eXBlIG9mIGEgZnVuY3Rpb24gb3IgbWV0aG9kIHR5cGUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19nZXRfcmV0dXJuX3R5cGUgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIEdldCB0aGUgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIHBhcmFtZXRlciB0eXBlcyBmb3IgYSBmdW5jdGlvbiBvcgotICAgbWV0aG9kIHR5cGUgKGFjdHVhbGx5LCBwYXJhbWV0ZXIgdHlwZXMgYXJlIG5vdCBjdXJyZW50bHkgc3RvcmVkIGZvcgotICAgZnVuY3Rpb24gdHlwZXMpLiAgVGhpcyBtYXkgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIG1ldGhvZAotICAgdHlwZSBpcyBhIHN0dWIgbWV0aG9kIG9yIG5vdC4gIFRoZSBsYXN0IGFyZ3VtZW50IHBvaW50cyB0byBhCi0gICBib29sZWFuIHdoaWNoIGlzIHNldCB0byB0cnVlIGlmIHRoZSBmdW5jdGlvbiB0YWtlcyBhIHZhcmlhYmxlCi0gICBudW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGRlYnVnX3R5cGUgKmRlYnVnX2dldF9wYXJhbWV0ZXJfdHlwZXMgUEFSQU1TICgoUFRSLAotCQkJCQkJCSAgICBkZWJ1Z190eXBlLAotCQkJCQkJCSAgICBib29sZWFuICopKTsKLQotLyogR2V0IHRoZSB0YXJnZXQgdHlwZSBvZiBhIHBvaW50ZXIgb3IgcmVmZXJlbmNlIG9yIGNvbnN0IG9yIHZvbGF0aWxlCi0gICB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfZ2V0X3RhcmdldF90eXBlIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBHZXQgdGhlIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBmaWVsZHMgZm9yIGEgc3RydWN0LCB1bmlvbiwgb3IKLSAgIGNsYXNzLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGRlYnVnX2ZpZWxkICpkZWJ1Z19nZXRfZmllbGRzIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBHZXQgdGhlIHR5cGUgb2YgYSBmaWVsZC4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX2dldF9maWVsZF90eXBlIFBBUkFNUyAoKFBUUiwgZGVidWdfZmllbGQpKTsKLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgZmllbGQuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqZGVidWdfZ2V0X2ZpZWxkX25hbWUgUEFSQU1TICgoUFRSLCBkZWJ1Z19maWVsZCkpOwotCi0vKiBHZXQgdGhlIGJpdCBwb3NpdGlvbiBvZiBhIGZpZWxkIHdpdGhpbiB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUuCi0gICBJZiB0aGUgZmllbGQgaXMgYSBzdGF0aWMgbWVtYmVyLCB0aGlzIHdpbGwgcmV0dXJuIChiZmRfdm1hKSAtMS4gICovCi0KLWV4dGVybiBiZmRfdm1hIGRlYnVnX2dldF9maWVsZF9iaXRwb3MgUEFSQU1TICgoUFRSLCBkZWJ1Z19maWVsZCkpOwotCi0vKiBHZXQgdGhlIGJpdCBzaXplIG9mIGEgZmllbGQuICBJZiB0aGUgZmllbGQgaXMgYSBzdGF0aWMgbWVtYmVyLCB0aGlzCi0gICB3aWxsIHJldHVybiAoYmZkX3ZtYSkgLTEuICAqLwotCi1leHRlcm4gYmZkX3ZtYSBkZWJ1Z19nZXRfZmllbGRfYml0c2l6ZSBQQVJBTVMgKChQVFIsIGRlYnVnX2ZpZWxkKSk7Ci0KLS8qIEdldCB0aGUgdmlzaWJpbGl0eSBvZiBhIGZpZWxkLiAgKi8KLQotZXh0ZXJuIGVudW0gZGVidWdfdmlzaWJpbGl0eSBkZWJ1Z19nZXRfZmllbGRfdmlzaWJpbGl0eQotICBQQVJBTVMgKChQVFIsIGRlYnVnX2ZpZWxkKSk7Ci0KLS8qIEdldCB0aGUgcGh5c2ljYWwgbmFtZSBvZiBhIGZpZWxkLCBpZiBpdCBpcyBhIHN0YXRpYyBtZW1iZXIuICBJZiB0aGUKLSAgIGZpZWxkIGlzIG5vdCBhIHN0YXRpYyBtZW1iZXIsIHRoaXMgd2lsbCByZXR1cm4gTlVMTC4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpkZWJ1Z19nZXRfZmllbGRfcGh5c25hbWUgUEFSQU1TICgoUFRSLCBkZWJ1Z19maWVsZCkpOwotCi0vKiBXcml0ZSBvdXQgdGhlIHJlY29yZGVkIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgdGFrZXMgYSBzZXQgb2YKLSAgIGZ1bmN0aW9uIHBvaW50ZXJzIHdoaWNoIGFyZSBjYWxsZWQgdG8gZG8gdGhlIGFjdHVhbCB3cml0aW5nLiAgVGhlCi0gICBmaXJzdCBQVFIgaXMgdGhlIGRlYnVnZ2luZyBoYW5kbGUuICBUaGUgc2Vjb25kIFBUUiBpcyBhIGhhbmRsZQotICAgd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbnMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z193cml0ZSBQQVJBTVMgKChQVFIsIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKiwgUFRSKSk7Ci0KLSNlbmRpZiAvKiBERUJVR19IICovCmRpZmYgLS1naXQgYS9iaW51dGlscy9kZWZsZXgubCBiL2JpbnV0aWxzL2RlZmxleC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2ZhMzYyLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2RlZmxleC5sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotJXsvKiBkZWZsZXgubCAtIExleGVyIGZvciAuZGVmIGZpbGVzICovCi0KLS8qICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgIAkJICBzYWNAY3lnbnVzLmNvbQotCi0qLwotI2RlZmluZSBET05UREVDTEFSRV9NQUxMT0MKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZWZwYXJzZS5oIgotI2luY2x1ZGUgImRsbHRvb2wuaCIKLQotaW50IGxpbmVudW1iZXI7Ci0KLSV9Ci0lJQotIk5BTUUiIAkJeyByZXR1cm4gTkFNRTt9Ci0iTElCUkFSWSIJeyByZXR1cm4gTElCUkFSWTt9Ci0iREVTQ1JJUFRJT04iIAl7IHJldHVybiBERVNDUklQVElPTjt9Ci0iU1RBQ0tTSVpFIgl7IHJldHVybiBTVEFDS1NJWkU7fQotIkhFQVBTSVpFIiAJeyByZXR1cm4gSEVBUFNJWkU7fQotIkNPREUiIAkJeyByZXR1cm4gQ09ERTt9Ci0iREFUQSIJCXsgcmV0dXJuIERBVEE7fQotIlNFQ1RJT05TIgl7IHJldHVybiBTRUNUSU9OUzt9Ci0iRVhQT1JUUyIJeyByZXR1cm4gRVhQT1JUUzt9Ci0iSU1QT1JUUyIJeyByZXR1cm4gSU1QT1JUUzt9Ci0iVkVSU0lPTiIJeyByZXR1cm4gVkVSU0lPTks7fQotIkJBU0UiCQl7IHJldHVybiBCQVNFO30KLSJDT05TVEFOVCIJeyByZXR1cm4gQ09OU1RBTlQ7IH0KLSJOT05BTUUiCXsgcmV0dXJuIE5PTkFNRTsgfQotIlJFQUQiCQl7IHJldHVybiBSRUFEO30KLSJXUklURSIJCXsgcmV0dXJuIFdSSVRFO30KLSJFWEVDVVRFIgl7IHJldHVybiBFWEVDVVRFO30KLSJTSEFSRUQiCXsgcmV0dXJuIFNIQVJFRDt9Ci0KLVswLTldW3gwLTlBLUZhLWZdKiB7IHl5bHZhbC5udW1iZXIgPSBzdHJ0b2wgKHl5dGV4dCwwLDApOyAKLQkJcmV0dXJuIE5VTUJFUjsgfQotCi1bQS1aYS16JDpcLVxfP11bQS1aYS16MC05LyQ6XC1cX0A/XSsgeyAJCi0JCXl5bHZhbC5pZCA9ICB4c3RyZHVwICh5eXRleHQpOwotCQlyZXR1cm4gSUQ7Ci0JCX0KLQotIlwiIlteXCJdKiJcIiIgewotCQl5eWx2YWwuaWQgPSB4c3RyZHVwICh5eXRleHQrMSk7Ci0JCXl5bHZhbC5pZFt5eWxlbmctMl0gPSAwOwotCQlyZXR1cm4gSUQ7Ci0JCX0KLQotIlwnIlteXCddKiJcJyIgewotCQl5eWx2YWwuaWQgPSB4c3RyZHVwICh5eXRleHQrMSk7Ci0JCXl5bHZhbC5pZFt5eWxlbmctMl0gPSAwOwotCQlyZXR1cm4gSUQ7Ci0JCX0KLSIqIi4qIAkJeyB9Ci0iOyIuKiAJCXsgfQotIiAiCQl7IH0KLSJcdCIJCXsgfQotIlxuIgkgCXsgbGluZW51bWJlciArKyA7fQotIj0iIAkJeyByZXR1cm4gJz0nO30KLSIuIiAJCXsgcmV0dXJuICcuJzt9Ci0iQCIJIAl7IHJldHVybiAnQCc7fQotIiwiCQl7IHJldHVybiAnLCc7fQotJSUKLSNpZm5kZWYgeXl3cmFwCi0vKiBOZWVkZWQgZm9yIGxleCwgdGhvdWdoIG5vdCBmbGV4LiAqLwotaW50IHl5d3JhcCgpIHsgcmV0dXJuIDE7IH0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGVmcGFyc2UueSBiL2JpbnV0aWxzL2RlZnBhcnNlLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjYzNjAuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZGVmcGFyc2UueQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0leyAvKiBkZWZwYXJzZS55IC0gcGFyc2VyIGZvciAuZGVmIGZpbGVzICovCi0KLS8qICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJkbGx0b29sLmgiCi0lfQotCi0ldW5pb24gewotICBjaGFyICppZDsKLSAgaW50IG51bWJlcjsKLX07Ci0KLSV0b2tlbiBOQU1FLCBMSUJSQVJZLCBERVNDUklQVElPTiwgU1RBQ0tTSVpFLCBIRUFQU0laRSwgQ09ERSwgREFUQQotJXRva2VuIFNFQ1RJT05TLCBFWFBPUlRTLCBJTVBPUlRTLCBWRVJTSU9OSywgQkFTRSwgQ09OU1RBTlQKLSV0b2tlbiBSRUFEIFdSSVRFIEVYRUNVVEUgU0hBUkVEIE5PTkFNRQotJXRva2VuIDxpZD4gSUQKLSV0b2tlbiA8bnVtYmVyPiBOVU1CRVIKLSV0eXBlICA8bnVtYmVyPiBvcHRfYmFzZSBvcHRfb3JkaW5hbCBvcHRfTk9OQU1FIG9wdF9DT05TVEFOVCBvcHRfREFUQQotJXR5cGUgIDxudW1iZXI+IGF0dHIgYXR0cl9saXN0IG9wdF9udW1iZXIKLSV0eXBlICA8aWQ+IG9wdF9uYW1lIG9wdF9lcXVhbF9uYW1lIAotCi0lJQotCi1zdGFydDogc3RhcnQgY29tbWFuZAotCXwgY29tbWFuZAotCTsKLQotY29tbWFuZDogCi0JCU5BTUUgb3B0X25hbWUgb3B0X2Jhc2UgeyBkZWZfbmFtZSAoJDIsICQzKTsgfQotCXwJTElCUkFSWSBvcHRfbmFtZSBvcHRfYmFzZSB7IGRlZl9saWJyYXJ5ICgkMiwgJDMpOyB9Ci0JfAlFWFBPUlRTIGV4cGxpc3QgCi0JfAlERVNDUklQVElPTiBJRCB7IGRlZl9kZXNjcmlwdGlvbiAoJDIpO30KLQl8CVNUQUNLU0laRSBOVU1CRVIgb3B0X251bWJlciB7IGRlZl9zdGFja3NpemUgKCQyLCAkMyk7fQotCXwJSEVBUFNJWkUgTlVNQkVSIG9wdF9udW1iZXIgeyBkZWZfaGVhcHNpemUgKCQyLCAkMyk7fQotCXwJQ09ERSBhdHRyX2xpc3QgeyBkZWZfY29kZSAoJDIpO30KLQl8CURBVEEgYXR0cl9saXN0ICB7IGRlZl9kYXRhICgkMik7fQotCXwJU0VDVElPTlMgc2VjbGlzdAotCXwJSU1QT1JUUyBpbXBsaXN0Ci0JfAlWRVJTSU9OSyBOVU1CRVIgeyBkZWZfdmVyc2lvbiAoJDIsMCk7fQotCXwJVkVSU0lPTksgTlVNQkVSICcuJyBOVU1CRVIgeyBkZWZfdmVyc2lvbiAoJDIsJDQpO30KLQk7Ci0KLQotZXhwbGlzdDoKLQkJLyogRU1QVFkgKi8KLQl8CWV4cGxpbmUKLQl8CWV4cGxpc3QgZXhwbGluZQotCTsKLQotZXhwbGluZToKLQkJSUQgb3B0X2VxdWFsX25hbWUgb3B0X29yZGluYWwgb3B0X05PTkFNRSBvcHRfQ09OU1RBTlQgb3B0X0RBVEEKLQkJCXsgZGVmX2V4cG9ydHMgKCQxLCAkMiwgJDMsICQ0LCAkNSwgJDYpO30KLQk7Ci1pbXBsaXN0OgkKLQkJaW1wbGlzdCBpbXBsaW5lCi0JfAlpbXBsaW5lCi0JOwotCi1pbXBsaW5lOgotICAgICAgICAgICAgICAgSUQgJz0nIElEICcuJyBJRCAnLicgSUQgICAgIHsgZGVmX2ltcG9ydCAoJDEsJDMsJDUsJDcsIDApOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIElEICcuJyBOVU1CRVIgeyBkZWZfaW1wb3J0ICgkMSwkMywkNSwgMCwkNyk7IH0KLSAgICAgICB8ICAgICAgIElEICc9JyBJRCAnLicgSUQgICAgICAgICAgICB7IGRlZl9pbXBvcnQgKCQxLCQzLCAwLCQ1LCAwKTsgfQotICAgICAgIHwgICAgICAgSUQgJz0nIElEICcuJyBOVU1CRVIgICAgICAgIHsgZGVmX2ltcG9ydCAoJDEsJDMsIDAsIDAsJDUpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnLicgSUQgJy4nIElEICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICggMCwkMSwkMywkNSwgMCk7IH0KLSAgICAgICB8ICAgICAgIElEICcuJyBJRCAnLicgTlVNQkVSICAgICAgICB7IGRlZl9pbXBvcnQgKCAwLCQxLCQzLCAwLCQ1KTsgfQotICAgICAgIHwgICAgICAgSUQgJy4nIElEICAgICAgICAgICAgICAgICAgIHsgZGVmX2ltcG9ydCAoIDAsJDEsIDAsJDMsIDApOyB9Ci0gICAgICAgfCAgICAgICBJRCAnLicgTlVNQkVSICAgICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICggMCwkMSwgMCwgMCwkMyk7IH0KLTsKLQotc2VjbGlzdDoKLQkJc2VjbGlzdCBzZWNsaW5lCi0JfAlzZWNsaW5lCi0JOwotCi1zZWNsaW5lOgotCUlEIGF0dHJfbGlzdCB7IGRlZl9zZWN0aW9uICgkMSwkMik7fQotCTsKLQotYXR0cl9saXN0OgotCWF0dHJfbGlzdCBvcHRfY29tbWEgYXR0cgotCXwgYXR0cgotCTsKLQotb3B0X2NvbW1hOgotCScsJwotCXwgCi0JOwotb3B0X251bWJlcjogJywnIE5VTUJFUiB7ICQkPSQyO30KLQl8CSAgIHsgJCQ9LTE7fQotCTsKLQkKLWF0dHI6Ci0JCVJFQUQgeyAkJCA9IDE7fQotCXwJV1JJVEUgeyAkJCA9IDI7fQkKLQl8CUVYRUNVVEUgeyAkJD00O30KLQl8CVNIQVJFRCB7ICQkPTg7fQotCTsKLQotb3B0X0NPTlNUQU5UOgotCQlDT05TVEFOVCB7JCQ9MTt9Ci0JfAkJIHskJD0wO30KLQk7Ci0KLW9wdF9OT05BTUU6Ci0JCU5PTkFNRSB7JCQ9MTt9Ci0JfAkJIHskJD0wO30KLQk7Ci0KLW9wdF9EQVRBOgotCQlEQVRBIHsgJCQgPSAxOyB9Ci0JfAkgICAgIHsgJCQgPSAwOyB9Ci0JOwotCi1vcHRfbmFtZTogSUQJCXsgJCQgPSQxOyB9Ci0JfCBJRCAnLicgSUQJCi0JICB7IAotCSAgICBjaGFyICpuYW1lID0geG1hbGxvYyAoc3RybGVuICgkMSkgKyAxICsgc3RybGVuICgkMykgKyAxKTsKLQkgICAgc3ByaW50ZiAobmFtZSwgIiVzLiVzIiwgJDEsICQzKTsKLQkgICAgJCQgPSBuYW1lOwotCSAgfQotCXwJCXsgJCQ9IiI7IH0KLQk7Ci0KLW9wdF9vcmRpbmFsOiAKLQkgICdAJyBOVU1CRVIgICAgIHsgJCQ9JDI7fQotCXwgICAgICAgICAgICAgICAgeyAkJD0tMTt9Ci0JOwotCi1vcHRfZXF1YWxfbmFtZToKLSAgICAgICAgICAnPScgSUQJeyAkJCA9ICQyOyB9Ci0gICAgICAgIHwgCQl7ICQkID0gIDA7IH0JCQkgCi0JOwotCi1vcHRfYmFzZTogQkFTRQknPScgTlVNQkVSCXsgJCQ9ICQzO30KLQl8CXsgJCQ9LTE7fQotCTsKLQotCQotCmRpZmYgLS1naXQgYS9iaW51dGlscy9kZXAtaW4uc2VkIGIvYmludXRpbHMvZGVwLWluLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYxOTIxYS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9kZXAtaW4uc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotOmxvb3AKLS9cXCQvTgotL1xcJC9iIGxvb3AKLQotcyFASU5DRElSQCEkKElOQ0RJUikhZwotcyFAQkZERElSQCEkKEJGRERJUikhZwotcyFAU1JDRElSQC8hIWcKLXMhQE9CSkRJUkAvISFnCi0KLXMvXFxcbiAqLyAvZwotCi1zLyAqJC8vCi1zLyAgKi8gL2cKLS86JC9kCi0KLXMvXCguXHs1MFx9W14gXSpcKSAvXDEgXFxcCi0gIC9nCmRpZmYgLS1naXQgYS9iaW51dGlscy9kbGx0b29sLmMgYi9iaW51dGlscy9kbGx0b29sLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMjkxMjYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZGxsdG9vbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1MSArMCwwIEBACi0vKiBkbGx0b29sLmMgLS0gdG9vbCB0byBnZW5lcmF0ZSBzdHVmZiBmb3IgUEUgc3R5bGUgRExMcwotICAgQ29weXJpZ2h0IChDKSAxOTk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qCi0gICBUaGlzIHByb2dyYW0gYWxsb3dzIHlvdSB0byBidWlsZCB0aGUgZmlsZXMgbmVjZXNzYXJ5IHRvIGNyZWF0ZQotICAgRExMcyB0byBydW4gb24gYSBzeXN0ZW0gd2hpY2ggdW5kZXJzdGFuZHMgUEUgZm9ybWF0IGltYWdlIGZpbGVzLgotICAgKGVnLCBXaW5kb3dzIE5UKQotCi0gICBTZWUgIlBlZXJpbmcgSW5zaWRlIHRoZSBQRTogQSBUb3VyIG9mIHRoZSBXaW4zMiBQb3J0YWJsZSBFeGVjdXRhYmxlCi0gICBGaWxlIEZvcm1hdCIsIE1TSiAxOTk0LCBWb2x1bWUgOSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgIEFsc28gc2VlICJNaWNyb3NvZnQgUG9ydGFibGUgRXhlY3V0YWJsZSBhbmQgQ29tbW9uIE9iamVjdCBGaWxlIEZvcm1hdCwKLSAgIFNwZWNpZmljYXRpb24gNC4xIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotICAgQSBETEwgY29udGFpbnMgYW4gZXhwb3J0IHRhYmxlIHdoaWNoIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbgotICAgd2hpY2ggdGhlIHJ1bnRpbWUgbG9hZGVyIG5lZWRzIHRvIHRpZSB1cCByZWZlcmVuY2VzIGZyb20gYQotICAgcmVmZXJlbmNpbmcgcHJvZ3JhbS4KLQotICAgVGhlIGV4cG9ydCB0YWJsZSBpcyBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtIGJ5IHJlYWRpbmcKLSAgIGluIGEgLkRFRiBmaWxlIG9yIHNjYW5uaW5nIHRoZSAuYSBhbmQgLm8gZmlsZXMgd2hpY2ggd2lsbCBiZSBpbiB0aGUKLSAgIERMTC4gIEEgLm8gZmlsZSBjYW4gY29udGFpbiBpbmZvcm1hdGlvbiBpbiBzcGVjaWFsICAiLmRyZWN0dmUiIHNlY3Rpb25zCi0gICB3aXRoIGV4cG9ydCBpbmZvcm1hdGlvbi4KLQotICAgQSBERUYgZmlsZSBjb250YWlucyBhbnkgbnVtYmVyIG9mIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6Ci0KLQotICAgTkFNRSA8bmFtZT4gWyAsIDxiYXNlPiBdCi0gICBUaGUgcmVzdWx0IGlzIGdvaW5nIHRvIGJlIDxuYW1lPi5FWEUKLQotICAgTElCUkFSWSA8bmFtZT4gWyAsIDxiYXNlPiBdCi0gICBUaGUgcmVzdWx0IGlzIGdvaW5nIHRvIGJlIDxuYW1lPi5ETEwKLQotICAgRVhQT1JUUyAgKCA8bmFtZTE+IFsgPSA8bmFtZTI+IF0gWyBAIDxpbnRlZ2VyPiBdIFsgTk9OQU1FIF0gW0NPTlNUQU5UXSBbREFUQV0gKSAqCi0gICBEZWNsYXJlcyBuYW1lMSBhcyBhbiBleHBvcnRlZCBzeW1ib2wgZnJvbSB0aGUKLSAgIERMTCwgd2l0aCBvcHRpb25hbCBvcmRpbmFsIG51bWJlciA8aW50ZWdlcj4KLQotICAgSU1QT1JUUyAgKCAgKCAgIDxpbnRlcm5hbC1uYW1lPiA9ICAgPG1vZHVsZS1uYW1lPiAuIDxpbnRlZ2VyPiApCi0gICAgICAgICAgICAgfCAoIFsgPGludGVybmFsLW5hbWU+ID0gXSA8bW9kdWxlLW5hbWU+IC4gPGV4dGVybmFsLW5hbWU+ICkpICoKLSAgIERlY2xhcmVzIHRoYXQgPGV4dGVybmFsLW5hbWU+IG9yIHRoZSBleHBvcnRlZCBmdW5jdGlvbiB3aG9lcyBvcmRpbmFsIG51bWJlcgotICAgaXMgPGludGVnZXI+IGlzIHRvIGJlIGltcG9ydGVkIGZyb20gdGhlIGZpbGUgPG1vZHVsZS1uYW1lPi4gIElmCi0gICA8aW50ZXJuYWwtbmFtZT4gaXMgc3BlY2lmaWVkIHRoZW4gdGhpcyBpcyB0aGUgbmFtZSB0aGF0IHRoZSBpbXBvcnRlZAotICAgZnVuY3Rpb24gd2lsbCBiZSByZWZlcmVkIHRvIGluIHRoZSBib2R5IG9mIHRoZSBETEwuCi0KLSAgIERFU0NSSVBUSU9OIDxzdHJpbmc+Ci0gICBQdXRzIDxzdHJpbmc+IGludG8gb3V0cHV0IC5leHAgZmlsZSBpbiB0aGUgLnJkYXRhIHNlY3Rpb24KLQotICAgW1NUQUNLU0laRXxIRUFQU0laRV0gPG51bWJlci1yZXNlcnZlPiBbICwgPG51bWJlci1jb21taXQ+IF0KLSAgIEdlbmVyYXRlcyAtLXN0YWNrfC0taGVhcCA8bnVtYmVyLXJlc2VydmU+LDxudW1iZXItY29tbWl0PgotICAgaW4gdGhlIG91dHB1dCAuZHJlY3R2ZSBzZWN0aW9uLiAgVGhlIGxpbmtlciB3aWxsCi0gICBzZWUgdGhpcyBhbmQgYWN0IHVwb24gaXQuCi0KLSAgIFtDT0RFfERBVEFdIDxhdHRyPisKLSAgIFNFQ1RJT05TICggPHNlY3Rpb25uYW1lPiA8YXR0cj4rICkqCi0gICA8YXR0cj4gPSBSRUFEIHwgV1JJVEUgfCBFWEVDVVRFIHwgU0hBUkVECi0gICBHZW5lcmF0ZXMgLS1hdHRyIDxzZWN0aW9ubmFtZT4gPGF0dHI+IGluIHRoZSBvdXRwdXQKLSAgIC5kcmVjdHZlIHNlY3Rpb24uICBUaGUgbGlua2VyIHdpbGwgc2VlIHRoaXMgYW5kIGFjdAotICAgdXBvbiBpdC4KLQotCi0gICBBIC1leHBvcnQ6PG5hbWU+IGluIGEgLmRyZWN0dmUgc2VjdGlvbiBpbiBhbiBpbnB1dCAubyBvciAuYQotICAgZmlsZSB0byB0aGlzIHByb2dyYW0gaXMgZXF1aXZhbGVudCB0byBhIEVYUE9SVFMgPG5hbWU+Ci0gICBpbiBhIC5ERUYgZmlsZS4KLQotCi0KLSAgIFRoZSBwcm9ncmFtIGdlbmVyYXRlcyBvdXRwdXQgZmlsZXMgd2l0aCB0aGUgcHJlZml4IHN1cHBsaWVkCi0gICBvbiB0aGUgY29tbWFuZCBsaW5lLCBvciBpbiB0aGUgZGVmIGZpbGUsIG9yIHRha2VuIGZyb20gdGhlIGZpcnN0Ci0gICBzdXBwbGllZCBhcmd1bWVudC4KLQotICAgVGhlIC5leHAucyBmaWxlIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gZXhwb3J0Ci0gICB0aGUgcm91dGluZXMgaW4gdGhlIERMTC4gIFRoZSAubGliLnMgZmlsZSBjb250YWlucyB0aGUgaW5mb3JtYXRpb24KLSAgIG5lY2Vzc2FyeSB0byB1c2UgdGhlIERMTCdzIHJvdXRpbmVzIGZyb20gYSByZWZlcmVuY2luZyBwcm9ncmFtLgotCi0KLQotICAgRXhhbXBsZToKLQotIGZpbGUxLmM6Ci0gICBhc20gKCIuc2VjdGlvbiAuZHJlY3R2ZSIpOwotICAgYXNtICgiLmFzY2lpIFwiLWV4cG9ydDphZGVmXCIiKTsKLQotICAgdm9pZCBhZGVmIChjaGFyICogcykKLSAgIHsKLSAgICAgcHJpbnRmICgiaGVsbG8gZnJvbSB0aGUgZGxsICVzXG4iLCBzKTsKLSAgIH0KLQotICAgdm9pZCBiZGVmIChjaGFyICogcykKLSAgIHsKLSAgICAgcHJpbnRmICgiaGVsbG8gZnJvbSB0aGUgZGxsIGFuZCB0aGUgb3RoZXIgZW50cnkgcG9pbnQgJXNcbiIsIHMpOwotICAgfQotCi0gZmlsZTIuYzoKLSAgIGFzbSAoIi5zZWN0aW9uIC5kcmVjdHZlIik7Ci0gICBhc20gKCIuYXNjaWkgXCItZXhwb3J0OmNkZWZcIiIpOwotICAgYXNtICgiLmFzY2lpIFwiLWV4cG9ydDpkZGVmXCIiKTsKLSAgIAotICAgdm9pZCBjZGVmIChjaGFyICogcykKLSAgIHsKLSAgICAgcHJpbnRmICgiaGVsbG8gZnJvbSB0aGUgZGxsICVzXG4iLCBzKTsKLSAgIH0KLQotICAgdm9pZCBkZGVmIChjaGFyICogcykKLSAgIHsKLSAgICAgcHJpbnRmICgiaGVsbG8gZnJvbSB0aGUgZGxsIGFuZCB0aGUgb3RoZXIgZW50cnkgcG9pbnQgJXNcbiIsIHMpOwotICAgfQotCi0gICBpbnQgcHJpbnRmICh2b2lkKQotICAgewotICAgICByZXR1cm4gOTsKLSAgIH0KLQotIHRoZW1haW4uYzoKLSAgIGludCBtYWluICh2b2lkKQotICAgewotICAgICBjZGVmICgpOwotICAgICByZXR1cm4gMDsKLSAgIH0KLQotIHRoZWRsbC5kZWYKLQotICAgTElCUkFSWSB0aGVkbGwKLSAgIEhFQVBTSVpFIDB4NDAwMDAsIDB4MjAwMAotICAgRVhQT1JUUyBiZGVmIEAgMjAKLSAgICAgICAgICAgY2RlZiBAIDMwIE5PTkFNRQotCi0gICBTRUNUSU9OUyBkb25rZXkgUkVBRCBXUklURQotICAgYWFyZHZhcmsgRVhFQ1VURQotCi0gIyBjb21waWxlIHVwIHRoZSBwYXJ0cyBvZiB0aGUgZGxsCi0KLSAgIGdjYyAtYyBmaWxlMS5jCi0gICBnY2MgLWMgZmlsZTIuYwotCi0gIyBwdXQgdGhlbSBpbiBhIGxpYnJhcnkgKHlvdSBkb24ndCBoYXZlIHRvLCB5b3UKLSAjIGNvdWxkIG5hbWUgYWxsIHRoZSAub3Mgb24gdGhlIGRsbHRvb2wgbGluZSkKLQotICAgYXIgIHFjdiB0aGVkbGwuaW4gZmlsZTEubyBmaWxlMi5vCi0gICByYW5saWIgdGhlZGxsLmluCi0KLSAjIHJ1biB0aGlzIHRvb2wgb3ZlciB0aGUgbGlicmFyeSBhbmQgdGhlIGRlZiBmaWxlCi0gICAuL2RsbHRvb2wgLS1kZWYgdGhlZGxsLmRlZiAtLW91dHB1dC1leHAgdGhlZGxsLm8gLS1vdXRwdXQtbGliIHRoZWRsbC5hCi0KLSAjIGJ1aWxkIHRoZSBkbGwgd2l0aCB0aGUgbGlicmFyeSB3aXRoIGZpbGUxLm8sIGZpbGUyLm8gYW5kIHRoZSBleHBvcnQgdGFibGUKLSAgIGxkIC1vIHRoZWRsbC5kbGwgdGhlZGxsLm8gdGhlZGxsLmluCi0KLSAjIGJ1aWxkIHRoZSBtYWlubGluZQotICAgZ2NjIC1jIHRoZW1haW4uYwotCi0gIyBsaW5rIHRoZSBleGVjdXRhYmxlIHdpdGggdGhlIGltcG9ydCBsaWJyYXJ5Ci0gICBnY2MgLW8gdGhlbWFpbi5leGUgdGhlbWFpbi5vIHRoZWRsbC5hCi0KLSAqLwotCi0vKiAuaWRhdGEgc2VjdGlvbiBkZXNjcmlwdGlvbgotCi0gICBUaGUgLmlkYXRhIHNlY3Rpb24gaXMgdGhlIGltcG9ydCB0YWJsZS4gIEl0IGlzIGEgY29sbGVjdGlvbiBvZiBzZXZlcmFsCi0gICBzdWJzZWN0aW9ucyB1c2VkIHRvIGtlZXAgdGhlIHBpZWNlcyBmb3IgZWFjaCBkbGwgdG9nZXRoZXI6IC5pZGF0YSRbMjM0NTY3XS4KLSAgIElFOiBFYWNoIGRsbCdzIC5pZGF0YSQyJ3MgYXJlIGNhdGVuYXRlZCB0b2dldGhlciwgZWFjaCAuaWRhdGEkMydzLCBldGMuCi0KLSAgIC5pZGF0YSQyID0gSW1wb3J0IERpcmVjdG9yeSBUYWJsZQotICAgPSBhcnJheSBvZiBJTUFHRV9JTVBPUlRfREVTQ1JJUFRPUidzLgotCi0JRFdPUkQgICBJbXBvcnQgTG9va3VwIFRhYmxlOyAgLSBwb2ludGVyIHRvIC5pZGF0YSQ0Ci0JRFdPUkQgICBUaW1lRGF0ZVN0YW1wOyAgICAgICAgLSBjdXJyZW50bHkgYWx3YXlzIDAKLQlEV09SRCAgIEZvcndhcmRlckNoYWluOyAgICAgICAtIGN1cnJlbnRseSBhbHdheXMgMAotCURXT1JEICAgTmFtZTsgICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBkbGwncyBuYW1lCi0JUElNQUdFX1RIVU5LX0RBVEEgRmlyc3RUaHVuazsgLSBwb2ludGVyIHRvIC5pZGF0YSQ1Ci0KLSAgIC5pZGF0YSQzID0gbnVsbCB0ZXJtaW5hdGluZyBlbnRyeSBmb3IgLmlkYXRhJDIuCi0KLSAgIC5pZGF0YSQ0ID0gSW1wb3J0IExvb2t1cCBUYWJsZQotICAgPSBhcnJheSBvZiBhcnJheSBvZiBwb2ludGVycyB0byBoaW50IG5hbWUgdGFibGUuCi0gICBUaGVyZSBpcyBvbmUgZm9yIGVhY2ggZGxsIGJlaW5nIGltcG9ydGVkIGZyb20sIGFuZCBlYWNoIGRsbCdzIHNldCBpcwotICAgdGVybWluYXRlZCBieSBhIHRyYWlsaW5nIE5VTEwuCi0KLSAgIC5pZGF0YSQ1ID0gSW1wb3J0IEFkZHJlc3MgVGFibGUKLSAgID0gYXJyYXkgb2YgYXJyYXkgb2YgcG9pbnRlcnMgdG8gaGludCBuYW1lIHRhYmxlLgotICAgVGhlcmUgaXMgb25lIGZvciBlYWNoIGRsbCBiZWluZyBpbXBvcnRlZCBmcm9tLCBhbmQgZWFjaCBkbGwncyBzZXQgaXMKLSAgIHRlcm1pbmF0ZWQgYnkgYSB0cmFpbGluZyBOVUxMLgotICAgSW5pdGlhbGx5LCB0aGlzIHRhYmxlIGlzIGlkZW50aWNhbCB0byB0aGUgSW1wb3J0IExvb2t1cCBUYWJsZS4gIEhvd2V2ZXIsCi0gICBhdCBsb2FkIHRpbWUsIHRoZSBsb2FkZXIgb3ZlcndyaXRlcyB0aGUgZW50cmllcyB3aXRoIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgZnVuY3Rpb24uCi0KLSAgIC5pZGF0YSQ2ID0gSGludCBOYW1lIFRhYmxlCi0gICA9IEFycmF5IG9mIHsgc2hvcnQsIGFzY2l6IH0gZW50cmllcywgb25lIGZvciBlYWNoIGltcG9ydGVkIGZ1bmN0aW9uLgotICAgVGhlIGBzaG9ydCcgaXMgdGhlIGZ1bmN0aW9uJ3Mgb3JkaW5hbCBudW1iZXIuCi0KLSAgIC5pZGF0YSQ3ID0gZGxsIG5hbWUgKGVnOiAia2VybmVsMzIuZGxsIikuICguaWRhdGEkNiBmb3IgcHBjKQotKi8KLQotLyogQUlYIHJlcXVpcmVzIHRoaXMgdG8gYmUgdGhlIGZpcnN0IHRoaW5nIGluIHRoZSBmaWxlLiAgKi8KLSNpZm5kZWYgX19HTlVDX18KLSMgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIHNob3dfYWxsbmFtZXMgMAotCi0jZGVmaW5lIFBBR0VfU0laRSA0MDk2Ci0jZGVmaW5lIFBBR0VfTUFTSyAoLVBBR0VfU0laRSkKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImRsbHRvb2wuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi0jaWZkZWYgRExMVE9PTF9BUk0KLSNpbmNsdWRlICJjb2ZmL2FybS5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNlbmRpZgotCi0KLS8qIEZvcndhcmQgcmVmZXJlbmNlcy4gICovCi1zdGF0aWMgY2hhciAqIGRlZHVjZV9uYW1lIChjaGFyICopOwotCi0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYKLXN0YXRpYyB2b2lkIG1jb3JlX2VsZl9jYWNoZV9maWxlbmFtZSAoY2hhciAqKTsKLXN0YXRpYyB2b2lkIG1jb3JlX2VsZl9nZW5fb3V0X2ZpbGUgKHZvaWQpOwotI2VuZGlmCi0gICAgIAotI2lmZGVmIEhBVkVfU1lTX1dBSVRfSAotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jZWxzZSAvKiAhIEhBVkVfU1lTX1dBSVRfSCAqLwotI2lmICEgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX0NZR1dJTjMyX18pCi0jaWZuZGVmIFdJRkVYSVRFRAotI2RlZmluZSBXSUZFWElURUQodykJKCgodykmMDM3NykgPT0gMCkKLSNlbmRpZgotI2lmbmRlZiBXSUZTSUdOQUxFRAotI2RlZmluZSBXSUZTSUdOQUxFRCh3KQkoKCh3KSYwMzc3KSAhPSAwMTc3ICYmICgodykmfjAzNzcpID09IDApCi0jZW5kaWYKLSNpZm5kZWYgV1RFUk1TSUcKLSNkZWZpbmUgV1RFUk1TSUcodykJKCh3KSAmIDAxNzcpCi0jZW5kaWYKLSNpZm5kZWYgV0VYSVRTVEFUVVMKLSNkZWZpbmUgV0VYSVRTVEFUVVModykJKCgodykgPj4gOCkgJiAwMzc3KQotI2VuZGlmCi0jZWxzZSAvKiBkZWZpbmVkIChfV0lOMzIpICYmICEgZGVmaW5lZCAoX19DWUdXSU4zMl9fKSAqLwotI2lmbmRlZiBXSUZFWElURUQKLSNkZWZpbmUgV0lGRVhJVEVEKHcpCSgoKHcpICYgMHhmZikgPT0gMCkKLSNlbmRpZgotI2lmbmRlZiBXSUZTSUdOQUxFRAotI2RlZmluZSBXSUZTSUdOQUxFRCh3KQkoKCh3KSAmIDB4ZmYpICE9IDAgJiYgKCh3KSAmIDB4ZmYpICE9IDB4N2YpCi0jZW5kaWYKLSNpZm5kZWYgV1RFUk1TSUcKLSNkZWZpbmUgV1RFUk1TSUcodykJKCh3KSAmIDB4N2YpCi0jZW5kaWYKLSNpZm5kZWYgV0VYSVRTVEFUVVMKLSNkZWZpbmUgV0VYSVRTVEFUVVModykJKCgodykgJiAweGZmMDApID4+IDgpCi0jZW5kaWYKLSNlbmRpZiAvKiBkZWZpbmVkIChfV0lOMzIpICYmICEgZGVmaW5lZCAoX19DWUdXSU4zMl9fKSAqLwotI2VuZGlmIC8qICEgSEFWRV9TWVNfV0FJVF9IICovCi0KLS8qIGlmdW5jIGFuZCBpaGVhZCBkYXRhIHN0cnVjdHVyZXM6IHR0a0BjeWdudXMuY29tIDE5OTcKLQotICAgV2hlbiBJTVBPUlQgZGVjbGFyYXRpb25zIGFyZSBlbmNvdW50ZXJlZCBpbiBhIC5kZWYgZmlsZSB0aGUKLSAgIGZ1bmN0aW9uIGltcG9ydCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gYSBzdHJ1Y3R1cmUgcmVmZXJlbmNlZCBieQotICAgdGhlIGdsb2JhbCB2YXJpYWJsZSBJTVBPUlRfTElTVC4gIFRoZSBzdHJ1Y3R1cmUgaXMgYSBsaW5rZWQgbGlzdAotICAgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIGRsbCBmaWxlcyBlYWNoIGZ1bmN0aW9uIGlzIGltcG9ydGVkCi0gICBmcm9tIGFuZCBhIGxpbmtlZCBsaXN0IG9mIGZ1bmN0aW9ucyBiZWluZyBpbXBvcnRlZCBmcm9tIHRoYXQgZGxsCi0gICBmaWxlLiAgVGhpcyByb3VnaGx5IHBhcmFsbGVscyB0aGUgc3RydWN0dXJlIG9mIHRoZSAuaWRhdGEgc2VjdGlvbgotICAgaW4gdGhlIFBFIG9iamVjdCBmaWxlLgotCi0gICBUaGUgY29udGVudHMgb2YgLmRlZiBmaWxlIGFyZSBpbnRlcnByZXRlZCBmcm9tIHdpdGhpbiB0aGUKLSAgIHByb2Nlc3NfZGVmX2ZpbGUgZnVuY3Rpb24uICBFdmVyeSB0aW1lIGFuIElNUE9SVCBkZWNsYXJhdGlvbiBpcwotICAgZW5jb3VudGVyZWQsIGl0IGlzIGJyb2tlbiB1cCBpbnRvIGl0cyBjb21wb25lbnQgcGFydHMgYW5kIHBhc3NlZCB0bwotICAgZGVmX2ltcG9ydC4gIElNUE9SVF9MSVNUIGlzIGluaXRpYWxpemVkIHRvIE5VTEwgaW4gZnVuY3Rpb24gbWFpbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGlmdW5jdAotewotICBjaGFyICAgICAgICAgICpuYW1lOyAgIC8qIG5hbWUgb2YgZnVuY3Rpb24gYmVpbmcgaW1wb3J0ZWQgKi8KLSAgaW50ICAgICAgICAgICAgb3JkOyAgICAvKiB0d28tYnl0ZSBvcmRpbmFsIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBmdW5jdGlvbiAqLwotICBzdHJ1Y3QgaWZ1bmN0ICpuZXh0OwotfSBpZnVuY3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGloZWFkdAotewotICBjaGFyICAgICAgICAgICpkbGxuYW1lOyAgLyogbmFtZSBvZiBkbGwgZmlsZSBpbXBvcnRlZCBmcm9tICovCi0gIGxvbmcgICAgICAgICAgIG5mdW5jczsgICAvKiBudW1iZXIgb2YgZnVuY3Rpb25zIGluIGxpc3QgKi8KLSAgc3RydWN0IGlmdW5jdCAqZnVuY2hlYWQ7IC8qIGZpcnN0IGZ1bmN0aW9uIGluIGxpc3QgKi8KLSAgc3RydWN0IGlmdW5jdCAqZnVuY3RhaWw7IC8qIGxhc3QgIGZ1bmN0aW9uIGluIGxpc3QgKi8KLSAgc3RydWN0IGloZWFkdCAqbmV4dDsgICAgIC8qIG5leHQgZGxsIGZpbGUgaW4gbGlzdCAqLwotfSBpaGVhZHR5cGU7Ci0KLS8qIFN0cnVjdHVyZSBjb250YWluaW5nIGFsbCBpbXBvcnQgaW5mb3JtYXRpb24gYXMgZGVmaW5lZCBpbiAuZGVmIGZpbGUKLSAgIChxdiAiaWhlYWQgc3RydWN0dXJlIikuICAqLwotCi1zdGF0aWMgaWhlYWR0eXBlICppbXBvcnRfbGlzdCA9IE5VTEw7Ci0KLXN0YXRpYyBjaGFyICphc19uYW1lID0gTlVMTDsKLXN0YXRpYyBjaGFyICogYXNfZmxhZ3MgPSAiIjsKLQotc3RhdGljIGludCBub19pZGF0YTQ7Ci1zdGF0aWMgaW50IG5vX2lkYXRhNTsKLXN0YXRpYyBjaGFyICpleHBfbmFtZTsKLXN0YXRpYyBjaGFyICppbXBfbmFtZTsKLXN0YXRpYyBjaGFyICpoZWFkX2xhYmVsOwotc3RhdGljIGNoYXIgKmltcF9uYW1lX2xhYjsKLXN0YXRpYyBjaGFyICpkbGxfbmFtZTsKLQotc3RhdGljIGludCBhZGRfaW5kaXJlY3QgPSAwOwotc3RhdGljIGludCBhZGRfdW5kZXJzY29yZSA9IDA7Ci1zdGF0aWMgaW50IGRvbnRkZWx0ZW1wcyA9IDA7Ci0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIGV4cG9ydCBhbGwgc3ltYm9scy4gIE90aGVyd2lzZSwgd2Ugb25seSBleHBvcnQKLSAgIHN5bWJvbHMgbGlzdGVkIGluIC5kcmVjdHZlIHNlY3Rpb25zIG9yIGluIHRoZSBkZWYgZmlsZS4gICovCi1zdGF0aWMgYm9vbGVhbiBleHBvcnRfYWxsX3N5bWJvbHM7Ci0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgaW4gREVGQVVMVF9FWENMVURFUyB3aGVuCi0gICBleHBvcnRpbmcgYWxsIHN5bWJvbHMuICAqLwotc3RhdGljIGJvb2xlYW4gZG9fZGVmYXVsdF9leGNsdWRlczsKLQotLyogRGVmYXVsdCBzeW1ib2xzIHRvIGV4Y2x1ZGUgd2hlbiBleHBvcnRpbmcgYWxsIHRoZSBzeW1ib2xzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X2V4Y2x1ZGVzID0gIkRsbE1haW5AMTIsRGxsRW50cnlQb2ludEAwLGltcHVyZV9wdHIiOwotCi1zdGF0aWMgY2hhciAqZGVmX2ZpbGU7Ci0KLWV4dGVybiBjaGFyICogcHJvZ3JhbV9uYW1lOwotCi1zdGF0aWMgaW50IG1hY2hpbmU7Ci1zdGF0aWMgaW50IGtpbGxhdDsKLXN0YXRpYyBpbnQgYWRkX3N0ZGNhbGxfYWxpYXM7Ci1zdGF0aWMgaW50IHZlcmJvc2U7Ci1zdGF0aWMgRklMRSAqb3V0cHV0X2RlZjsKLXN0YXRpYyBGSUxFICpiYXNlX2ZpbGU7Ci0KLSNpZmRlZiBETExUT09MX0JFT1MKLXN0YXRpYyBjb25zdCBjaGFyICptbmFtZSA9ICJiZW9zIjsKLSNlbmRpZgotCi0jaWZkZWYgRExMVE9PTF9BUk0KLXN0YXRpYyBjb25zdCBjaGFyICptbmFtZSA9ICJhcm0iOwotI2VuZGlmCi0KLSNpZmRlZiBETExUT09MX0kzODYKLXN0YXRpYyBjb25zdCBjaGFyICptbmFtZSA9ICJpMzg2IjsKLSNlbmRpZgotCi0jaWZkZWYgRExMVE9PTF9QUEMKLXN0YXRpYyBjb25zdCBjaGFyICptbmFtZSA9ICJwcGMiOwotI2VuZGlmCi0KLSNpZmRlZiBETExUT09MX01DT1JFCi1zdGF0aWMgY29uc3QgY2hhciAqIG1uYW1lID0gIm1jb3JlIjsKLSNlbmRpZgotCi0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYKLXN0YXRpYyBjb25zdCBjaGFyICogbW5hbWUgPSAibWNvcmUtZWxmIjsKLXN0YXRpYyBjaGFyICogbWNvcmVfZWxmX291dF9maWxlID0gTlVMTDsKLXN0YXRpYyBjaGFyICogbWNvcmVfZWxmX2xpbmtlciAgID0gTlVMTDsKLXN0YXRpYyBjaGFyICogbWNvcmVfZWxmX2xpbmtlcl9mbGFncyA9IE5VTEw7Ci0KLSNkZWZpbmUgRFJFQ1RWRV9TRUNUSU9OX05BTUUgKChtYWNoaW5lID09IE1NQ09SRV9FTEYgfHwgbWFjaGluZSA9PSBNTUNPUkVfRUxGX0xFKSA/ICIuZXhwb3J0cyIgOiAiLmRyZWN0dmUiKQotI2VuZGlmCi0KLSNpZm5kZWYgRFJFQ1RWRV9TRUNUSU9OX05BTUUKLSNkZWZpbmUgRFJFQ1RWRV9TRUNUSU9OX05BTUUgIi5kcmVjdHZlIgotI2VuZGlmCi0KLSNkZWZpbmUgUEFUSE1BWCAyNTAJCS8qIFdoYXQncyB0aGUgcmlnaHQgbmFtZSBmb3IgdGhpcyA/ICovCi0KLSNkZWZpbmUgVE1QX0FTTQkJImRjLnMiCi0jZGVmaW5lIFRNUF9IRUFEX1MJImRoLnMiCi0jZGVmaW5lIFRNUF9IRUFEX08JImRoLm8iCi0jZGVmaW5lIFRNUF9UQUlMX1MJImR0LnMiCi0jZGVmaW5lIFRNUF9UQUlMX08JImR0Lm8iCi0jZGVmaW5lIFRNUF9TVFVCCSJkcyIKLQotLyogVGhpcyBiaXQgb2YgYXNzZW1seSBkb2VzIGptcCAqIC4uLi4gKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGkzODZfanRhYltdID0KLXsKLSAgMHhmZiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg5MAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYXJtX2p0YWJbXSA9Ci17Ci0gIDB4MDAsIDB4YzAsIDB4OWYsIDB4ZTUsCS8qIGxkciAgaXAsIFtwY10gKi8KLSAgMHgwMCwgMHhmMCwgMHg5YywgMHhlNSwJLyogbGRyICBwYywgW2lwXSAqLwotICAwLCAgICAwLCAgICAwLCAgICAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhcm1faW50ZXJ3b3JrX2p0YWJbXSA9Ci17Ci0gIDB4MDQsIDB4YzAsIDB4OWYsIDB4ZTUsCS8qIGxkciAgaXAsIFtwY10gKi8KLSAgMHgwMCwgMHhjMCwgMHg5YywgMHhlNSwJLyogbGRyICBpcCwgW2lwXSAqLwotICAweDFjLCAweGZmLCAweDJmLCAweGUxLAkvKiBieCAgIGlwICAgICAgICovCi0gIDAsICAgIDAsICAgIDAsICAgIDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRodW1iX2p0YWJbXSA9Ci17Ci0gIDB4NDAsIDB4YjQsICAgICAgICAgICAvKiBwdXNoIHtyNn0gICAgICAgICAqLwotICAweDAyLCAweDRlLCAgICAgICAgICAgLyogbGRyICByNiwgW3BjLCAjOF0gKi8KLSAgMHgzNiwgMHg2OCwgICAgICAgICAgIC8qIGxkciAgcjYsIFtyNl0gICAgICovCi0gIDB4YjQsIDB4NDYsICAgICAgICAgICAvKiBtb3YgIGlwLCByNiAgICAgICAqLwotICAweDQwLCAweGJjLCAgICAgICAgICAgLyogcG9wICB7cjZ9ICAgICAgICAgKi8KLSAgMHg2MCwgMHg0NywgICAgICAgICAgIC8qIGJ4ICAgaXAgICAgICAgICAgICovCi0gIDAsICAgIDAsICAgIDAsICAgIDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1jb3JlX2JlX2p0YWJbXSA9Ci17Ci0gIDB4NzAsIDB4MDEsICAgICAgICAgICAgLyogam1waSAxICAgICAqLwotICAweDEyLCAweDExLCAgICAgICAgICAgIC8qIG5vcCAqLwotICAweDAwLCAweDAwLCAweDAwLCAweDAwIC8qIDxhZGRyZXNzPiAgKi8gIAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWNvcmVfbGVfanRhYltdID0KLXsKLSAgMHgwMSwgMHg3MCwgICAgICAgICAgICAvKiBqbXBpIDEgICAgICovCi0gIDB4MTEsIDB4MTIsICAgICAgICAgICAgLyogbm9wICovCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgLyogPGFkZHJlc3M+ICAqLyAgCi19OwotCi0vKiBUaGlzIGlzIHRoZSBnbHVlIHNlcXVlbmNlIGZvciBQb3dlclBDIFBFLiBUaGVyZSBpcyBhICAqLwotLyogdG9jcmVsMTYtdG9jZGVmbiByZWxvYyBhZ2FpbnN0IHRoZSBmaXJzdCBpbnN0cnVjdGlvbi4gKi8KLS8qIFdlIGFsc28gbmVlZCBhIElNR0xVRSByZWxvYyBhZ2FpbnN0IHRoZSBnbHVlIGZ1bmN0aW9uICovCi0vKiB0byByZXN0b3JlIHRoZSB0b2Mgc2F2ZWQgYnkgdGhlIHRoaXJkIGluc3RydWN0aW9uIGluICAqLwotLyogdGhlIGdsdWUuICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwcGNfanRhYltdID0KLXsKLSAgMHgwMCwgMHgwMCwgMHg2MiwgMHg4MSwgLyogbHd6IHIxMSwwKHIyKSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgUmVsb2MgVE9DUkVMMTYgX19pbXBfeHh4ICAqLwotICAweDAwLCAweDAwLCAweDhCLCAweDgxLCAvKiBsd3ogcjEyLDAocjExKSAgICAgICAgICAgICAgKi8KLSAgMHgwNCwgMHgwMCwgMHg0MSwgMHg5MCwgLyogc3R3IHIyLDQocjEpICAgICAgICAgICAgICAgICovCi0gIDB4QTYsIDB4MDMsIDB4ODksIDB4N0QsIC8qIG10Y3RyIHIxMiAgICAgICAgICAgICAgICAgICAqLwotICAweDA0LCAweDAwLCAweDRCLCAweDgwLCAvKiBsd3ogcjIsNChyMTEpICAgICAgICAgICAgICAgKi8KLSAgMHgyMCwgMHgwNCwgMHg4MCwgMHg0RSAgLyogYmN0ciAgICAgICAgICAgICAgICAgICAgICAgICovCi19OwotCi0jaWZkZWYgRExMVE9PTF9QUEMKLS8qIHRoZSBnbHVlIGluc3RydWN0aW9uLCBwaWNrcyB1cCB0aGUgdG9jIGZyb20gdGhlIHN0dyBpbiAqLwotLyogdGhlIGFib3ZlIGNvZGU6ICJsd3ogcjIsNChyMSkiICAgICAgICAgICAgICAgICAgICAgICAgICovCi1zdGF0aWMgYmZkX3ZtYSBwcGNfZ2x1ZV9pbnNuID0gMHg4MDQxMDAwNDsKLSNlbmRpZgotCi0vKiBUaGUgb3V0ZmlsZSBhcnJheSBtdXN0IGJlIGJpZyBlbm91Z2ggdG8gY29udGFpbiBhIGZ1bGx5Ci0gICBxdWFsaWZpZWQgcGF0aCBuYW1lLCBwbHVzIGFuIGFyYml0YXJ5IHNlcmllcyBvZiBjb21tYW5kCi0gICBsaW5lIHN3aXRjaGVzLiAgV2UgaG9wZSB0aGF0IFBBVEhfTUFYIHRpbWVzIHR3byB3aWxsIGJlCi0gICBlbm91Z2guICAqLwotc3RhdGljIGNoYXIgb3V0ZmlsZSBbUEFUSE1BWCAqIDJdOwotCi1zdHJ1Y3QgbWFjCi0gIHsKLSAgICBjb25zdCBjaGFyICp0eXBlOwotICAgIGNvbnN0IGNoYXIgKmhvd19ieXRlOwotICAgIGNvbnN0IGNoYXIgKmhvd19zaG9ydDsKLSAgICBjb25zdCBjaGFyICpob3dfbG9uZzsKLSAgICBjb25zdCBjaGFyICpob3dfYXNjaXo7Ci0gICAgY29uc3QgY2hhciAqaG93X2NvbW1lbnQ7Ci0gICAgY29uc3QgY2hhciAqaG93X2p1bXA7Ci0gICAgY29uc3QgY2hhciAqaG93X2dsb2JhbDsKLSAgICBjb25zdCBjaGFyICpob3dfc3BhY2U7Ci0gICAgY29uc3QgY2hhciAqaG93X2FsaWduX3Nob3J0OwotICAgIGNvbnN0IGNoYXIgKmhvd19hbGlnbl9sb25nOwotICAgIGNvbnN0IGNoYXIgKmhvd19iZmRfdGFyZ2V0OwotICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBob3dfYmZkX2FyY2g7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqaG93X2p0YWI7Ci0gICAgaW50IGhvd19qdGFiX3NpemU7IC8qIHNpemUgb2YgdGhlIGp0YWIgZW50cnkgKi8KLSAgICBpbnQgaG93X2p0YWJfcm9mZjsgLyogb2Zmc2V0IGludG8gaXQgZm9yIHRoZSBpbmQgMzIgcmVsb2MgaW50byBpZGF0YSA1ICovCi0gIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWFjCi1tdGFibGVbXSA9Ci17Ci0gIHsKLSNkZWZpbmUgTUFSTSAwCi0gICAgImFybSIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIkAiLAotICAgICJsZHJcdGlwLFtwY11cblx0bGRyXHRwYyxbaXBdXG5cdC5sb25nIiwKLSAgICAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwicGUtYXJtLWxpdHRsZSIsIGJmZF9hcmNoX2FybSwKLSAgICBhcm1fanRhYiwgc2l6ZW9mIChhcm1fanRhYiksIDgKLSAgfQotICAsCi0gIHsKLSNkZWZpbmUgTTM4NiAxCi0gICAgImkzODYiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICIjIiwgImptcCAqIiwgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsInBlLWkzODYiLGJmZF9hcmNoX2kzODYsCi0gICBpMzg2X2p0YWIsIHNpemVvZiAoaTM4Nl9qdGFiKSwgMgotICB9Ci0gICwKLSAgewotI2RlZmluZSBNUFBDIDIKLSAgICAicHBjIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiIyIsICJqbXAgKiIsICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCJwZS1wb3dlcnBjbGUiLGJmZF9hcmNoX3Bvd2VycGMsCi0gICBwcGNfanRhYiwgc2l6ZW9mIChwcGNfanRhYiksIDAKLSAgfQotICAsCi0gIHsKLSNkZWZpbmUgTVRIVU1CIDMKLSAgICAidGh1bWIiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICJAIiwKLSAgICAicHVzaFx0e3I2fVxuXHRsZHJcdHI2LCBbcGMsICM4XVxuXHRsZHJcdHI2LCBbcjZdXG5cdG1vdlx0aXAsIHI2XG5cdHBvcFx0e3I2fVxuXHRieFx0aXAiLAotICAgICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCJwZS1hcm0tbGl0dGxlIiwgYmZkX2FyY2hfYXJtLAotICAgIHRodW1iX2p0YWIsIHNpemVvZiAodGh1bWJfanRhYiksIDEyCi0gIH0KLSAgLAotI2RlZmluZSBNQVJNX0lOVEVSV09SSyA0Ci0gIHsKLSAgICAiYXJtX2ludGVyd29yayIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIkAiLAotICAgICJsZHJcdGlwLFtwY11cblx0bGRyXHRpcCxbaXBdXG5cdGJ4XHRpcFxuXHQubG9uZyIsCi0gICAgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsInBlLWFybS1saXR0bGUiLCBiZmRfYXJjaF9hcm0sCi0gICAgYXJtX2ludGVyd29ya19qdGFiLCBzaXplb2YgKGFybV9pbnRlcndvcmtfanRhYiksIDEyCi0gIH0KLSAgLAotICB7Ci0jZGVmaW5lIE1NQ09SRV9CRSA1Ci0gICAgIm1jb3JlIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiLy8iLAotICAgICJqbXBpXHQxXG5cdG5vcFxuXHQubG9uZyIsCi0gICAgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsInBlLW1jb3JlLWJpZyIsIGJmZF9hcmNoX21jb3JlLAotICAgIG1jb3JlX2JlX2p0YWIsIHNpemVvZiAobWNvcmVfYmVfanRhYiksIDgKLSAgfQotICAsCi0gIHsKLSNkZWZpbmUgTU1DT1JFX0xFIDYKLSAgICAibWNvcmUtbGUiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICIvLyIsCi0gICAgImptcGlcdDFcblx0bm9wXG5cdC5sb25nIiwKLSAgICAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwicGUtbWNvcmUtbGl0dGxlIiwgYmZkX2FyY2hfbWNvcmUsCi0gICAgbWNvcmVfbGVfanRhYiwgc2l6ZW9mIChtY29yZV9sZV9qdGFiKSwgOAotICB9Ci0gICwKLSAgewotI2RlZmluZSBNTUNPUkVfRUxGIDcKLSAgICAibWNvcmUtZWxmIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiLy8iLAotICAgICJqbXBpXHQxXG5cdG5vcFxuXHQubG9uZyIsCi0gICAgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsImVsZjMyLW1jb3JlLWJpZyIsIGJmZF9hcmNoX21jb3JlLAotICAgIG1jb3JlX2JlX2p0YWIsIHNpemVvZiAobWNvcmVfYmVfanRhYiksIDgKLSAgfQotICAsCi0gIHsKLSNkZWZpbmUgTU1DT1JFX0VMRl9MRSA4Ci0gICAgIm1jb3JlLWVsZi1sZSIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIi8vIiwKLSAgICAiam1waVx0MVxuXHRub3Bcblx0LmxvbmciLAotICAgICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCJlbGYzMi1tY29yZS1saXR0bGUiLCBiZmRfYXJjaF9tY29yZSwKLSAgICBtY29yZV9sZV9qdGFiLCBzaXplb2YgKG1jb3JlX2xlX2p0YWIpLCA4Ci0gIH0KLSAgLAotIHsgICAgMH0KLX07Ci0KLXR5cGVkZWYgc3RydWN0IGRsaXN0Ci17Ci0gIGNoYXIgKnRleHQ7Ci0gIHN0cnVjdCBkbGlzdCAqbmV4dDsKLX0KLWRsaXN0X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGV4cG9ydAotICB7Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICBjb25zdCBjaGFyICppbnRlcm5hbF9uYW1lOwotICAgIGludCBvcmRpbmFsOwotICAgIGludCBjb25zdGFudDsKLSAgICBpbnQgbm9uYW1lOwotICAgIGludCBkYXRhOwotICAgIGludCBoaW50OwotICAgIHN0cnVjdCBleHBvcnQgKm5leHQ7Ci0gIH0KLWV4cG9ydF90eXBlOwotCi0vKiBBIGxpc3Qgb2Ygc3ltYm9scyB3aGljaCB3ZSBzaG91bGQgbm90IGV4cG9ydC4gICovCi0gCi1zdHJ1Y3Qgc3RyaW5nX2xpc3QKLXsKLSAgc3RydWN0IHN0cmluZ19saXN0ICpuZXh0OwotICBjaGFyICpzdHJpbmc7Ci19OwotCi1zdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICpleGNsdWRlczsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnJ2YWFmdGVyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKnJ2YWJlZm9yZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICphc21fcHJlZml4IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgYXBwZW5kX2ltcG9ydCBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBydW4gUEFSQU1TICgoY29uc3QgY2hhciAqLCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHNjYW5fZHJlY3R2ZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzY2FuX2ZpbHRlcmVkX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIFBUUiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBhZGRfZXhjbHVkZXMgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtYXRjaF9leGNsdWRlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfZXhjbHVkZXMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGxvbmcgZmlsdGVyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIFBUUiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBzY2FuX2FsbF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzY2FuX29wZW5fb2JqX2ZpbGUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNjYW5fb2JqX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkdW1wX2RlZl9pbmZvIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludCBzZnVuYyBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotc3RhdGljIHZvaWQgZmx1c2hfcGFnZSBQQVJBTVMgKChGSUxFICosIGxvbmcgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIGdlbl9kZWZfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnZW5lcmF0ZV9pZGF0YV9vZmlsZSBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkIGdlbl9leHBfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqeGxhdGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0jaWYgMAotc3RhdGljIHZvaWQgZHVtcF9pYXQgUEFSQU1TICgoRklMRSAqLCBleHBvcnRfdHlwZSAqKSk7Ci0jZW5kaWYKLXN0YXRpYyBjaGFyICptYWtlX2xhYmVsIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYmZkICptYWtlX29uZV9saWJfZmlsZSBQQVJBTVMgKChleHBvcnRfdHlwZSAqLCBpbnQpKTsKLXN0YXRpYyBiZmQgKm1ha2VfaGVhZCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYmZkICptYWtlX3RhaWwgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2VuX2xpYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgcGZ1bmMgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLXN0YXRpYyBpbnQgbmZ1bmMgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLXN0YXRpYyB2b2lkIHJlbW92ZV9udWxsX25hbWVzIFBBUkFNUyAoKGV4cG9ydF90eXBlICoqKSk7Ci1zdGF0aWMgdm9pZCBkdGFiIFBBUkFNUyAoKGV4cG9ydF90eXBlICoqKSk7Ci1zdGF0aWMgdm9pZCBwcm9jZXNzX2R1cGxpY2F0ZXMgUEFSQU1TICgoZXhwb3J0X3R5cGUgKiopKTsKLXN0YXRpYyB2b2lkIGZpbGxfb3JkaW5hbHMgUEFSQU1TICgoZXhwb3J0X3R5cGUgKiopKTsKLXN0YXRpYyBpbnQgYWxwaGFmdW5jIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgdm9pZCBtYW5nbGVfZGVmcyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgZGlzcGxheSBQQVJBTVMgKChjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKLXN0YXRpYyB2b2lkIGluZm9ybSBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotc3RhdGljIHZvaWQgd2FybiBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheSAobWVzc2FnZSwgYXJncykKLSAgICAgY29uc3QgY2hhciAqIG1lc3NhZ2U7Ci0gICAgIHZhX2xpc3QgICAgICBhcmdzOwotewotICBpZiAocHJvZ3JhbV9uYW1lICE9IE5VTEwpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0KLSAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7Ci0KLSAgaWYgKG1lc3NhZ2UgW3N0cmxlbiAobWVzc2FnZSkgLSAxXSAhPSAnXG4nKQotICAgIGZwdXRjICgnXG4nLCBzdGRlcnIpOwotfSAgCi0KLQotc3RhdGljIHZvaWQKLSNpZmRlZiBfX1NURENfXwotaW5mb3JtIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQotI2Vsc2UKLWluZm9ybSAobWVzc2FnZSwgdmFfYWxpc3QpCi0gICAgIGNvbnN0IGNoYXIgKiBtZXNzYWdlOwotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZ3M7Ci0gIAotICBpZiAoIXZlcmJvc2UpCi0gICAgcmV0dXJuOwotCi0jaWZkZWYgX19TVERDX18KLSAgdmFfc3RhcnQgKGFyZ3MsIG1lc3NhZ2UpOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZ3MpOwotI2VuZGlmCi0KLSAgZGlzcGxheSAobWVzc2FnZSwgYXJncyk7Ci0gIAotICB2YV9lbmQgKGFyZ3MpOwotfQotCi1zdGF0aWMgdm9pZAotI2lmZGVmIF9fU1REQ19fCi13YXJuIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQotI2Vsc2UKLXdhcm4gKG1lc3NhZ2UsIHZhX2FsaXN0KQotICAgICBjb25zdCBjaGFyICogbWVzc2FnZTsKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgdmFfbGlzdCBhcmdzOwotICAKLSNpZmRlZiBfX1NURENfXwotICB2YV9zdGFydCAoYXJncywgbWVzc2FnZSk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJncyk7Ci0jZW5kaWYKLSAgCi0gIGRpc3BsYXkgKG1lc3NhZ2UsIGFyZ3MpOwotCi0gIHZhX2VuZCAoYXJncyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXJ2YWFmdGVyIChtYWNoaW5lKQotICAgICBpbnQgbWFjaGluZTsKLXsKLSAgc3dpdGNoIChtYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIE1BUk06Ci0gICAgY2FzZSBNMzg2OgotICAgIGNhc2UgTVBQQzoKLSAgICBjYXNlIE1USFVNQjoKLSAgICBjYXNlIE1BUk1fSU5URVJXT1JLOgotICAgIGNhc2UgTU1DT1JFX0JFOgotICAgIGNhc2UgTU1DT1JFX0xFOgotICAgIGNhc2UgTU1DT1JFX0VMRjoKLSAgICBjYXNlIE1NQ09SRV9FTEZfTEU6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZhdGFsIChfKCJJbnRlcm5hbCBlcnJvcjogVW5rbm93biBtYWNoaW5lIHR5cGU6ICVkXG4iKSwgbWFjaGluZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAiIjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcnZhYmVmb3JlIChtYWNoaW5lKQotICAgICBpbnQgbWFjaGluZTsKLXsKLSAgc3dpdGNoIChtYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIE1BUk06Ci0gICAgY2FzZSBNMzg2OgotICAgIGNhc2UgTVBQQzoKLSAgICBjYXNlIE1USFVNQjoKLSAgICBjYXNlIE1BUk1fSU5URVJXT1JLOgotICAgIGNhc2UgTU1DT1JFX0JFOgotICAgIGNhc2UgTU1DT1JFX0xFOgotICAgIGNhc2UgTU1DT1JFX0VMRjoKLSAgICBjYXNlIE1NQ09SRV9FTEZfTEU6Ci0gICAgICByZXR1cm4gIi5ydmFcdCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmYXRhbCAoXygiSW50ZXJuYWwgZXJyb3I6IFVua25vd24gbWFjaGluZSB0eXBlOiAlZFxuIiksIG1hY2hpbmUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gIiI7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWFzbV9wcmVmaXggKG1hY2hpbmUpCi0gICAgIGludCBtYWNoaW5lOwotewotICBzd2l0Y2ggKG1hY2hpbmUpCi0gICAgewotICAgIGNhc2UgTUFSTToKLSAgICBjYXNlIE1QUEM6Ci0gICAgY2FzZSBNVEhVTUI6Ci0gICAgY2FzZSBNQVJNX0lOVEVSV09SSzoKLSAgICBjYXNlIE1NQ09SRV9CRToKLSAgICBjYXNlIE1NQ09SRV9MRToKLSAgICBjYXNlIE1NQ09SRV9FTEY6Ci0gICAgY2FzZSBNTUNPUkVfRUxGX0xFOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzg2OgotICAgICAgcmV0dXJuICJfIjsKLSAgICBkZWZhdWx0OgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZhdGFsIChfKCJJbnRlcm5hbCBlcnJvcjogVW5rbm93biBtYWNoaW5lIHR5cGU6ICVkXG4iKSwgbWFjaGluZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAiIjsKLX0KLQotI2RlZmluZSBBU01fQllURSAJbXRhYmxlW21hY2hpbmVdLmhvd19ieXRlCi0jZGVmaW5lIEFTTV9TSE9SVCAJbXRhYmxlW21hY2hpbmVdLmhvd19zaG9ydAotI2RlZmluZSBBU01fTE9ORwltdGFibGVbbWFjaGluZV0uaG93X2xvbmcKLSNkZWZpbmUgQVNNX1RFWFQJbXRhYmxlW21hY2hpbmVdLmhvd19hc2NpegotI2RlZmluZSBBU01fQyAJCW10YWJsZVttYWNoaW5lXS5ob3dfY29tbWVudAotI2RlZmluZSBBU01fSlVNUCAJbXRhYmxlW21hY2hpbmVdLmhvd19qdW1wCi0jZGVmaW5lIEFTTV9HTE9CQUwJbXRhYmxlW21hY2hpbmVdLmhvd19nbG9iYWwKLSNkZWZpbmUgQVNNX1NQQUNFCW10YWJsZVttYWNoaW5lXS5ob3dfc3BhY2UKLSNkZWZpbmUgQVNNX0FMSUdOX1NIT1JUIG10YWJsZVttYWNoaW5lXS5ob3dfYWxpZ25fc2hvcnQKLSNkZWZpbmUgQVNNX1JWQV9CRUZPUkUgCXJ2YWJlZm9yZShtYWNoaW5lKQotI2RlZmluZSBBU01fUlZBX0FGVEVSICAJcnZhYWZ0ZXIobWFjaGluZSkKLSNkZWZpbmUgQVNNX1BSRUZJWAlhc21fcHJlZml4KG1hY2hpbmUpCi0jZGVmaW5lIEFTTV9BTElHTl9MT05HICBtdGFibGVbbWFjaGluZV0uaG93X2FsaWduX2xvbmcKLSNkZWZpbmUgSE9XX0JGRF9UQVJHRVQgIDAgIC8qIGFsd2F5cyBkZWZhdWx0Ki8KLSNkZWZpbmUgSE9XX0JGRF9BUkNIICAgIG10YWJsZVttYWNoaW5lXS5ob3dfYmZkX2FyY2gKLSNkZWZpbmUgSE9XX0pUQUIgICAgICAgIG10YWJsZVttYWNoaW5lXS5ob3dfanRhYgotI2RlZmluZSBIT1dfSlRBQl9TSVpFICAgbXRhYmxlW21hY2hpbmVdLmhvd19qdGFiX3NpemUKLSNkZWZpbmUgSE9XX0pUQUJfUk9GRiAgIG10YWJsZVttYWNoaW5lXS5ob3dfanRhYl9yb2ZmCi1zdGF0aWMgY2hhciAqKm9hdjsKLQotdm9pZAotcHJvY2Vzc19kZWZfZmlsZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgRklMRSAqZiA9IGZvcGVuIChuYW1lLCBGT1BFTl9SVCk7Ci0gIAotICBpZiAoIWYpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiQ2FuJ3Qgb3BlbiBkZWYgZmlsZTogJXMiKSwgbmFtZSk7Ci0KLSAgeXlpbiA9IGY7Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJQcm9jZXNzaW5nIGRlZiBmaWxlOiAlcyIpLCBuYW1lKTsKLSAgCi0gIHl5cGFyc2UgKCk7Ci0KLSAgaW5mb3JtIChfKCJQcm9jZXNzZWQgZGVmIGZpbGUiKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBDb21tdW5pY2F0aW9ucyB3aXRoIHRoZSBwYXJzZXIgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKmRfbmFtZTsJLyogQXJnIHRvIE5BTUUgb3IgTElCUkFSWSAqLwotc3RhdGljIGludCBkX25mdW5jczsJCS8qIE51bWJlciBvZiBmdW5jdGlvbnMgZXhwb3J0ZWQgKi8KLXN0YXRpYyBpbnQgZF9uYW1lZF9uZnVuY3M7CS8qIE51bWJlciBvZiBuYW1lZCBmdW5jdGlvbnMgZXhwb3J0ZWQgKi8KLXN0YXRpYyBpbnQgZF9sb3dfb3JkOwkJLyogTG93ZXN0IG9yZGluYWwgaW5kZXggKi8KLXN0YXRpYyBpbnQgZF9oaWdoX29yZDsJCS8qIEhpZ2hlc3Qgb3JkaW5hbCBpbmRleCAqLwotc3RhdGljIGV4cG9ydF90eXBlICpkX2V4cG9ydHM7CS8qbGlzdCBvZiBleHBvcnRlZCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBleHBvcnRfdHlwZSAqKmRfZXhwb3J0c19sZXhpY2FsbHk7CS8qIHZlY3RvciBvZiBleHBvcnRlZCBmdW5jdGlvbnMgaW4gYWxwaGEgb3JkZXIgKi8KLXN0YXRpYyBkbGlzdF90eXBlICpkX2xpc3Q7CS8qIERlc2NyaXB0aW9ucyAqLwotc3RhdGljIGRsaXN0X3R5cGUgKmFfbGlzdDsJLyogU3R1ZmYgdG8gZ28gaW4gZGlyZWN0aXZlcyAqLwotCi1zdGF0aWMgaW50IGRfaXNfZGxsOwotc3RhdGljIGludCBkX2lzX2V4ZTsKLQotaW50Ci15eWVycm9yIChlcnIpCi0gICAgIGNvbnN0IGNoYXIgKmVycjsKLXsKLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgd2FybiAoXygiU3ludGF4IGVycm9yIGluIGRlZiBmaWxlICVzOiVkXG4iKSwgZGVmX2ZpbGUsIGxpbmVudW1iZXIpOwotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLWRlZl9leHBvcnRzIChuYW1lLCBpbnRlcm5hbF9uYW1lLCBvcmRpbmFsLCBub25hbWUsIGNvbnN0YW50LCBkYXRhKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICppbnRlcm5hbF9uYW1lOwotICAgICBpbnQgb3JkaW5hbDsKLSAgICAgaW50IG5vbmFtZTsKLSAgICAgaW50IGNvbnN0YW50OwotICAgICBpbnQgZGF0YTsKLXsKLSAgc3RydWN0IGV4cG9ydCAqcCA9IChzdHJ1Y3QgZXhwb3J0ICopIHhtYWxsb2MgKHNpemVvZiAoKnApKTsKLQotICBwLT5uYW1lID0gbmFtZTsKLSAgcC0+aW50ZXJuYWxfbmFtZSA9IGludGVybmFsX25hbWUgPyBpbnRlcm5hbF9uYW1lIDogbmFtZTsKLSAgcC0+b3JkaW5hbCA9IG9yZGluYWw7Ci0gIHAtPmNvbnN0YW50ID0gY29uc3RhbnQ7Ci0gIHAtPm5vbmFtZSA9IG5vbmFtZTsKLSAgcC0+ZGF0YSA9IGRhdGE7Ci0gIHAtPm5leHQgPSBkX2V4cG9ydHM7Ci0gIGRfZXhwb3J0cyA9IHA7Ci0gIGRfbmZ1bmNzKys7Ci19Ci0KLXZvaWQKLWRlZl9uYW1lIChuYW1lLCBiYXNlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgYmFzZTsKLXsKLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJOQU1FOiAlcyBiYXNlOiAleCIpLCBuYW1lLCBiYXNlKTsKLSAgCi0gIGlmIChkX2lzX2RsbCkKLSAgICB3YXJuIChfKCJDYW4ndCBoYXZlIExJQlJBUlkgYW5kIE5BTUVcbiIpKTsKLSAgCi0gIGRfbmFtZSA9IG5hbWU7Ci0gIC8qIGlmIC0tZGxsbmFtZSBub3QgcHJvdmlkZWQsIHVzZSB0aGUgb25lIGluIHRoZSBERUYgZmlsZS4KLSAgICAgRklYTUU6IElzIHRoaXMgYXBwcm9wcmlhdGUgZm9yIGV4ZWN1dGFibGVzPyAqLwotICBpZiAoISBkbGxfbmFtZSkKLSAgICBkbGxfbmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotICBkX2lzX2V4ZSA9IDE7Ci19Ci0KLXZvaWQKLWRlZl9saWJyYXJ5IChuYW1lLCBiYXNlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgYmFzZTsKLXsKLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJMSUJSQVJZOiAlcyBiYXNlOiAleCIpLCBuYW1lLCBiYXNlKTsKLSAgCi0gIGlmIChkX2lzX2V4ZSkKLSAgICB3YXJuIChfKCIlczogQ2FuJ3QgaGF2ZSBMSUJSQVJZIGFuZCBOQU1FXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgCi0gIGRfbmFtZSA9IG5hbWU7Ci0gIC8qIGlmIC0tZGxsbmFtZSBub3QgcHJvdmlkZWQsIHVzZSB0aGUgb25lIGluIHRoZSBERUYgZmlsZS4gKi8KLSAgaWYgKCEgZGxsX25hbWUpCi0gICAgZGxsX25hbWUgPSB4c3RyZHVwIChuYW1lKTsKLSAgZF9pc19kbGwgPSAxOwotfQotCi12b2lkCi1kZWZfZGVzY3JpcHRpb24gKGRlc2MpCi0gICAgIGNvbnN0IGNoYXIgKmRlc2M7Ci17Ci0gIGRsaXN0X3R5cGUgKmQgPSAoZGxpc3RfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKGRsaXN0X3R5cGUpKTsKLSAgZC0+dGV4dCA9IHhzdHJkdXAgKGRlc2MpOwotICBkLT5uZXh0ID0gZF9saXN0OwotICBkX2xpc3QgPSBkOwotfQotCi12b2lkCi1uZXdfZGlyZWN0aXZlIChkaXIpCi0gICAgIGNoYXIgKmRpcjsKLXsKLSAgZGxpc3RfdHlwZSAqZCA9IChkbGlzdF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAoZGxpc3RfdHlwZSkpOwotICBkLT50ZXh0ID0geHN0cmR1cCAoZGlyKTsKLSAgZC0+bmV4dCA9IGFfbGlzdDsKLSAgYV9saXN0ID0gZDsKLX0KLQotdm9pZAotZGVmX2hlYXBzaXplIChyZXNlcnZlLCBjb21taXQpCi0gICAgIGludCByZXNlcnZlOwotICAgICBpbnQgY29tbWl0OwotewotICBjaGFyIGJbMjAwXTsKLSAgaWYgKGNvbW1pdCA+IDApCi0gICAgc3ByaW50ZiAoYiwgIi1oZWFwIDB4JXgsMHgleCAiLCByZXNlcnZlLCBjb21taXQpOwotICBlbHNlCi0gICAgc3ByaW50ZiAoYiwgIi1oZWFwIDB4JXggIiwgcmVzZXJ2ZSk7Ci0gIG5ld19kaXJlY3RpdmUgKHhzdHJkdXAgKGIpKTsKLX0KLQotdm9pZAotZGVmX3N0YWNrc2l6ZSAocmVzZXJ2ZSwgY29tbWl0KQotICAgICBpbnQgcmVzZXJ2ZTsKLSAgICAgaW50IGNvbW1pdDsKLXsKLSAgY2hhciBiWzIwMF07Ci0gIGlmIChjb21taXQgPiAwKQotICAgIHNwcmludGYgKGIsICItc3RhY2sgMHgleCwweCV4ICIsIHJlc2VydmUsIGNvbW1pdCk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChiLCAiLXN0YWNrIDB4JXggIiwgcmVzZXJ2ZSk7Ci0gIG5ld19kaXJlY3RpdmUgKHhzdHJkdXAgKGIpKTsKLX0KLQotLyogYXBwZW5kX2ltcG9ydCBzaW1wbHkgYWRkcyB0aGUgZ2l2ZW4gaW1wb3J0IGRlZmluaXRpb24gdG8gdGhlIGdsb2JhbAotICAgaW1wb3J0X2xpc3QuICBJdCBpcyB1c2VkIGJ5IGRlZl9pbXBvcnQuICAqLwotCi1zdGF0aWMgdm9pZAotYXBwZW5kX2ltcG9ydCAoc3ltYm9sX25hbWUsIGRsbF9uYW1lLCBmdW5jX29yZGluYWwpCi0gICAgIGNvbnN0IGNoYXIgKnN5bWJvbF9uYW1lOwotICAgICBjb25zdCBjaGFyICpkbGxfbmFtZTsKLSAgICAgaW50IGZ1bmNfb3JkaW5hbDsKLXsKLSAgaWhlYWR0eXBlICoqcHE7Ci0gIGloZWFkdHlwZSAqcTsKLQotICBmb3IgKHBxID0gJmltcG9ydF9saXN0OyAqcHEgIT0gTlVMTDsgcHEgPSAmKCpwcSktPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoKCpwcSktPmRsbG5hbWUsIGRsbF9uYW1lKSA9PSAwKQotCXsKLQkgIHEgPSAqcHE7Ci0JICBxLT5mdW5jdGFpbC0+bmV4dCA9IHhtYWxsb2MgKHNpemVvZiAoaWZ1bmN0eXBlKSk7Ci0JICBxLT5mdW5jdGFpbCA9IHEtPmZ1bmN0YWlsLT5uZXh0OwotCSAgcS0+ZnVuY3RhaWwtPm9yZCAgPSBmdW5jX29yZGluYWw7Ci0JICBxLT5mdW5jdGFpbC0+bmFtZSA9IHhzdHJkdXAgKHN5bWJvbF9uYW1lKTsKLQkgIHEtPmZ1bmN0YWlsLT5uZXh0ID0gTlVMTDsKLQkgIHEtPm5mdW5jcysrOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgcSA9IHhtYWxsb2MgKHNpemVvZiAoaWhlYWR0eXBlKSk7Ci0gIHEtPmRsbG5hbWUgPSB4c3RyZHVwIChkbGxfbmFtZSk7Ci0gIHEtPm5mdW5jcyA9IDE7Ci0gIHEtPmZ1bmNoZWFkID0geG1hbGxvYyAoc2l6ZW9mIChpZnVuY3R5cGUpKTsKLSAgcS0+ZnVuY3RhaWwgPSBxLT5mdW5jaGVhZDsKLSAgcS0+bmV4dCA9IE5VTEw7Ci0gIHEtPmZ1bmN0YWlsLT5uYW1lID0geHN0cmR1cCAoc3ltYm9sX25hbWUpOwotICBxLT5mdW5jdGFpbC0+b3JkICA9IGZ1bmNfb3JkaW5hbDsKLSAgcS0+ZnVuY3RhaWwtPm5leHQgPSBOVUxMOwotCi0gICpwcSA9IHE7Ci19Ci0KLS8qIGRlZl9pbXBvcnQgaXMgY2FsbGVkIGZyb20gd2l0aGluIGRlZnBhcnNlLnkgd2hlbiBhbiBJTVBPUlQKLSAgIGRlY2xhcmF0aW9uIGlzIGVuY291bnRlcmVkLiAgRGVwZW5kaW5nIG9uIHRoZSBmb3JtIG9mIHRoZQotICAgZGVjbGFyYXRpb24sIHRoZSBtb2R1bGUgbmFtZSBtYXkgb3IgbWF5IG5vdCBuZWVkICIuZGxsIiB0byBiZQotICAgYXBwZW5kZWQgdG8gaXQsIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBtYXkgYmUgc3RvcmVkIGluIGludGVybmFsCi0gICBvciBlbnRyeSwgYW5kIHRoZXJlIG1heSBvciBtYXkgbm90IGJlIGFuIG9yZGluYWwgdmFsdWUgYXNzb2NpYXRlZAotICAgd2l0aCBpdC4gICovCi0KLS8qIEEgbm90ZSByZWdhcmRpbmcgdGhlIHBhcnNlIG1vZGVzOgotICAgSW4gZGVmcGFyc2UueSB3ZSBoYXZlIHRvIGFjY2VwdCBpbXBvcnQgZGVjbGFyYXRpb25zIHdoaWNoIGZvbGxvdwotICAgYW55IG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOgotICAgICA8ZnVuY19uYW1lX2luX2FwcD4gPSA8ZGxsX25hbWU+LjxmdW5jX25hbWVfaW5fZGxsPgotICAgICA8ZnVuY19uYW1lX2luX2FwcD4gPSA8ZGxsX25hbWU+LjxudW1iZXI+Ci0gICAgIDxkbGxfbmFtZT4uPGZ1bmNfbmFtZV9pbl9kbGw+Ci0gICAgIDxkbGxfbmFtZT4uPG51bWJlcj4KLSAgIEZ1cnRoZXJtb3JlLCB0aGUgZGxsJ3MgbmFtZSBtYXkgb3IgbWF5IG5vdCBlbmQgd2l0aCAiLmRsbCIsIHdoaWNoCi0gICBjb21wbGljYXRlcyB0aGUgcGFyc2luZyBhIGxpdHRsZS4gIE5vcm1hbGx5IHRoZSBkbGwncyBuYW1lIGlzCi0gICBwYXNzZWQgdG8gZGVmX2ltcG9ydCgpIGluIHRoZSAibW9kdWxlIiBwYXJhbWV0ZXIsIGJ1dCB3aGVuIGl0IGVuZHMKLSAgIHdpdGggIi5kbGwiIGl0IGdldHMgcGFzc2VkIGluICJtb2R1bGUiIHNhbnMgIi5kbGwiIGFuZCB0aGF0IG5lZWRzCi0gICB0byBiZSByZWFwcGVuZGVkLgotCi0gIGRlZl9pbXBvcnQgZ2V0cyBmaXZlIHBhcmFtZXRlcnM6Ci0gIEFQUF9OQU1FIC0gdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBhcHBsaWNhdGlvbiwgaWYKLSAgICAgICAgICAgICBwcmVzZW50LCBvciBOVUxMIGlmIG5vdCBwcmVzZW50LgotICBNT0RVTEUgICAtIHRoZSBuYW1lIG9mIHRoZSBkbGwsIHBvc3NpYmx5IHNhbnMgZXh0ZW5zaW9uIChpZSwgJy5kbGwnKS4KLSAgRExMRVhUICAgLSB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBkbGwsIGlmIHByZXNlbnQsIE5VTEwgaWYgbm90IHByZXNlbnQuCi0gIEVOVFJZICAgIC0gdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBkbGwsIGlmIHByZXNlbnQsIG9yIE5VTEwuCi0gIE9SRF9WQUwgIC0gdGhlIG51bWVyaWNhbCB0YWcgb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBkbGwsIGlmIHByZXNlbnQsCi0gICAgICAgICAgICAgb3IgTlVMTC4gIEV4YWN0bHkgb25lIG9mIDxlbnRyeT4gb3IgPG9yZF92YWw+IG11c3QgYmUKLSAgICAgICAgICAgICBwcmVzZW50IChpLmUuLCBub3QgTlVMTCkuICAqLwotCi12b2lkCi1kZWZfaW1wb3J0IChhcHBfbmFtZSwgbW9kdWxlLCBkbGxleHQsIGVudHJ5LCBvcmRfdmFsKQotICAgICBjb25zdCBjaGFyICphcHBfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqbW9kdWxlOwotICAgICBjb25zdCBjaGFyICpkbGxleHQ7Ci0gICAgIGNvbnN0IGNoYXIgKmVudHJ5OwotICAgICBpbnQgb3JkX3ZhbDsKLXsKLSAgY29uc3QgY2hhciAqYXBwbGljYXRpb25fbmFtZTsKLSAgY2hhciAqYnVmOwotCi0gIGlmIChlbnRyeSAhPSBOVUxMKQotICAgIGFwcGxpY2F0aW9uX25hbWUgPSBlbnRyeTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChhcHBfbmFtZSAhPSBOVUxMKQotCWFwcGxpY2F0aW9uX25hbWUgPSBhcHBfbmFtZTsKLSAgICAgIGVsc2UKLQlhcHBsaWNhdGlvbl9uYW1lID0gIiI7Ci0gICAgfQotICAKLSAgaWYgKGRsbGV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJ1ZiA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChtb2R1bGUpICsgc3RybGVuIChkbGxleHQpICsgMik7Ci0gICAgICBzcHJpbnRmIChidWYsICIlcy4lcyIsIG1vZHVsZSwgZGxsZXh0KTsKLSAgICAgIG1vZHVsZSA9IGJ1ZjsKLSAgICB9Ci0KLSAgYXBwZW5kX2ltcG9ydCAoYXBwbGljYXRpb25fbmFtZSwgbW9kdWxlLCBvcmRfdmFsKTsKLX0KLQotdm9pZAotZGVmX3ZlcnNpb24gKG1ham9yLCBtaW5vcikKLSAgICAgaW50IG1ham9yOwotICAgICBpbnQgbWlub3I7Ci17Ci0gIHByaW50ZiAoIlZFUlNJT04gJWQuJWRcbiIsIG1ham9yLCBtaW5vcik7Ci19Ci0KLXZvaWQKLWRlZl9zZWN0aW9uIChuYW1lLCBhdHRyKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgYXR0cjsKLXsKLSAgY2hhciBidWZbMjAwXTsKLSAgY2hhciBhdHRzWzVdOwotICBjaGFyICpkID0gYXR0czsKLSAgaWYgKGF0dHIgJiAxKQotICAgICpkKysgPSAnUic7Ci0KLSAgaWYgKGF0dHIgJiAyKQotICAgICpkKysgPSAnVyc7Ci0gIGlmIChhdHRyICYgNCkKLSAgICAqZCsrID0gJ1gnOwotICBpZiAoYXR0ciAmIDgpCi0gICAgKmQrKyA9ICdTJzsKLSAgKmQrKyA9IDA7Ci0gIHNwcmludGYgKGJ1ZiwgIi1hdHRyICVzICVzIiwgbmFtZSwgYXR0cyk7Ci0gIG5ld19kaXJlY3RpdmUgKHhzdHJkdXAgKGJ1ZikpOwotfQotCi12b2lkCi1kZWZfY29kZSAoYXR0cikKLSAgICAgaW50IGF0dHI7Ci17Ci0KLSAgZGVmX3NlY3Rpb24gKCJDT0RFIiwgYXR0cik7Ci19Ci0KLXZvaWQKLWRlZl9kYXRhIChhdHRyKQotICAgICBpbnQgYXR0cjsKLXsKLSAgZGVmX3NlY3Rpb24gKCJEQVRBIiwgYXR0cik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotcnVuICh3aGF0LCBhcmdzKQotICAgICBjb25zdCBjaGFyICp3aGF0OwotICAgICBjaGFyICphcmdzOwotewotICBjaGFyICpzOwotICBpbnQgcGlkLCB3YWl0X3N0YXR1czsKLSAgaW50IGk7Ci0gIGNvbnN0IGNoYXIgKiphcmd2OwotICBjaGFyICplcnJtc2dfZm10LCAqZXJybXNnX2FyZzsKLSAgY2hhciAqdGVtcF9iYXNlID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKLQotICBpbmZvcm0gKCJydW46ICVzICVzXG4iLCB3aGF0LCBhcmdzKTsKLQotICAvKiBDb3VudCB0aGUgYXJncyAqLwotICBpID0gMDsKLSAgZm9yIChzID0gYXJnczsgKnM7IHMrKykKLSAgICBpZiAoKnMgPT0gJyAnKQotICAgICAgaSsrOwotICBpKys7Ci0gIGFyZ3YgPSBhbGxvY2EgKHNpemVvZiAoY2hhciAqKSAqIChpICsgMykpOwotICBpID0gMDsKLSAgYXJndltpKytdID0gd2hhdDsKLSAgcyA9IGFyZ3M7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIHdoaWxlICgqcyA9PSAnICcpCi0JKytzOwotICAgICAgYXJndltpKytdID0gczsKLSAgICAgIHdoaWxlICgqcyAhPSAnICcgJiYgKnMgIT0gMCkKLQlzKys7Ci0gICAgICBpZiAoKnMgPT0gMCkKLQlicmVhazsKLSAgICAgICpzKysgPSAwOwotICAgIH0KLSAgYXJndltpKytdID0gTlVMTDsKLQotICBwaWQgPSBwZXhlY3V0ZSAoYXJndlswXSwgKGNoYXIgKiBjb25zdCAqKSBhcmd2LCBwcm9ncmFtX25hbWUsIHRlbXBfYmFzZSwKLQkJICAmZXJybXNnX2ZtdCwgJmVycm1zZ19hcmcsIFBFWEVDVVRFX09ORSB8IFBFWEVDVVRFX1NFQVJDSCk7Ci0KLSAgaWYgKHBpZCA9PSAtMSkKLSAgICB7Ci0gICAgICBpbmZvcm0gKHN0cmVycm9yIChlcnJubykpOwotICAgICAgCi0gICAgICBmYXRhbCAoZXJybXNnX2ZtdCwgZXJybXNnX2FyZyk7Ci0gICAgfQotCi0gIHBpZCA9IHB3YWl0IChwaWQsICYgd2FpdF9zdGF0dXMsIDApOwotICAKLSAgaWYgKHBpZCA9PSAtMSkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZmF0YWwgKF8oIndhaXQ6ICVzIiksIHN0cmVycm9yIChlcnJubykpOwotICAgIH0KLSAgZWxzZSBpZiAoV0lGU0lHTkFMRUQgKHdhaXRfc3RhdHVzKSkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZmF0YWwgKF8oInN1YnByb2Nlc3MgZ290IGZhdGFsIHNpZ25hbCAlZCIpLCBXVEVSTVNJRyAod2FpdF9zdGF0dXMpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKFdJRkVYSVRFRCAod2FpdF9zdGF0dXMpKQotICAgIHsKLSAgICAgIGlmIChXRVhJVFNUQVRVUyAod2FpdF9zdGF0dXMpICE9IDApCi0JLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQl3YXJuIChfKCIlcyBleGl0ZWQgd2l0aCBzdGF0dXMgJWRcbiIpLAotCSAgICAgIHdoYXQsIFdFWElUU1RBVFVTICh3YWl0X3N0YXR1cykpOwotICAgIH0KLSAgZWxzZQotICAgIGFib3J0ICgpOwotfQotCi0vKiBMb29rIGZvciBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQgaW4gdGhlIC5kcmVjdHZlIHNlY3Rpb24gb2YKLSAgIEFCRkQuICBQYXNzIGVhY2ggb25lIHRvIGRlZl9leHBvcnRzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNjYW5fZHJlY3R2ZV9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICogczsKLSAgaW50ICAgICAgICBzaXplOwotICBjaGFyICogICAgIGJ1ZjsKLSAgY2hhciAqICAgICBwOwotICBjaGFyICogICAgIGU7Ci0KLSAgLyogTG9vayBmb3IgLmRyZWN0dmUncyAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIERSRUNUVkVfU0VDVElPTl9OQU1FKTsKLSAgCi0gIGlmIChzID09IE5VTEwpCi0gICAgcmV0dXJuOwotICAgICAgCi0gIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHMpOwotICBidWYgID0geG1hbGxvYyAoc2l6ZSk7Ci0KLSAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzLCBidWYsIDAsIHNpemUpOwotICAgICAgCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiU3Vja2luZyBpbiBpbmZvIGZyb20gJXMgc2VjdGlvbiBpbiAlc1xuIiksCi0JICBEUkVDVFZFX1NFQ1RJT05fTkFNRSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIC8qIFNlYXJjaCBmb3IgLWV4cG9ydDogc3RyaW5ncyAqLwotICBwID0gYnVmOwotICBlID0gYnVmICsgc2l6ZTsKLSAgd2hpbGUgKHAgPCBlKQotICAgIHsKLSAgICAgIGlmIChwWzBdID09ICctJwotCSAgJiYgc3RybmNtcCAocCwgIi1leHBvcnQ6IiwgOCkgPT0gMCkKLQl7Ci0JICBjaGFyICogbmFtZTsKLQkgIGNoYXIgKiBjOwotCSAgCi0JICBwICs9IDg7Ci0JICBuYW1lID0gcDsKLQkgIHdoaWxlIChwIDwgZSAmJiAqcCAhPSAnICcgJiYgKnAgIT0gJy0nKQotCSAgICBwKys7Ci0JICBjID0geG1hbGxvYyAocCAtIG5hbWUgKyAxKTsKLQkgIG1lbWNweSAoYywgbmFtZSwgcCAtIG5hbWUpOwotCSAgY1twIC0gbmFtZV0gPSAwOwotCi0JICAvKiBGSVhNRTogVGhlIDV0aCBhcmcgaXMgZm9yIHRoZSBgY29uc3RhbnQnIGZpZWxkLgotCSAgICAgV2hhdCBzaG91bGQgaXQgYmU/ICBOb3QgdGhhdCBpdCBtYXR0ZXJzIHNpbmNlIGl0J3Mgbm90Ci0JICAgICBjdXJyZW50bHkgdXNlZnVsLiAgKi8KLQkgIGRlZl9leHBvcnRzIChjLCAwLCAtMSwgMCwgMCwgMCk7Ci0KLQkgIGlmIChhZGRfc3RkY2FsbF9hbGlhcyAmJiBzdHJjaHIgKGMsICdAJykpCi0JICAgIHsKLQkgICAgICBjaGFyICpleHBvcnRlZF9uYW1lID0geHN0cmR1cCAoYyk7Ci0JICAgICAgY2hhciAqYXRzeW0gPSBzdHJjaHIgKGV4cG9ydGVkX25hbWUsICdAJyk7Ci0JICAgICAgKmF0c3ltID0gJ1wwJzsKLQkgICAgICBkZWZfZXhwb3J0cyAoZXhwb3J0ZWRfbmFtZSwgeHN0cmR1cCAoYyksIC0xLCAwLCAwLCAwKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlwKys7Ci0gICAgfQotICBmcmVlIChidWYpOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHN5bWJvbHMgaW4gTUlOSVNZTVMsIGFuZCBhZGQgZWFjaCBvbmUgdG8gbGlzdCBvZgotICAgc3ltYm9scyB0byBleHBvcnQuICAqLwotCi1zdGF0aWMgdm9pZAotc2Nhbl9maWx0ZXJlZF9zeW1ib2xzIChhYmZkLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIG1pbmlzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgYXN5bWJvbCAqc3RvcmU7Ci0gIGJmZF9ieXRlICpmcm9tLCAqZnJvbWVuZDsKLQotICBzdG9yZSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIGlmIChzdG9yZSA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGZyb20gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0gIGZyb21lbmQgPSBmcm9tICsgc3ltY291bnQgKiBzaXplOwotICBmb3IgKDsgZnJvbSA8IGZyb21lbmQ7IGZyb20gKz0gc2l6ZSkKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBjb25zdCBjaGFyICpzeW1ib2xfbmFtZTsKLQotICAgICAgc3ltID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBmYWxzZSwgZnJvbSwgc3RvcmUpOwotICAgICAgaWYgKHN5bSA9PSBOVUxMKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBzeW1ib2xfbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSk7Ci0gICAgICBpZiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSA9PSBzeW1ib2xfbmFtZVswXSkKLQkrK3N5bWJvbF9uYW1lOwotCi0gICAgICBkZWZfZXhwb3J0cyAoeHN0cmR1cCAoc3ltYm9sX25hbWUpICwgMCwgLTEsIDAsIDAsIDApOwotCi0gICAgICBpZiAoYWRkX3N0ZGNhbGxfYWxpYXMgJiYgc3RyY2hyIChzeW1ib2xfbmFtZSwgJ0AnKSkKLSAgICAgICAgewotCSAgY2hhciAqZXhwb3J0ZWRfbmFtZSA9IHhzdHJkdXAgKHN5bWJvbF9uYW1lKTsKLQkgIGNoYXIgKmF0c3ltID0gc3RyY2hyIChleHBvcnRlZF9uYW1lLCAnQCcpOwotCSAgKmF0c3ltID0gJ1wwJzsKLQkgIGRlZl9leHBvcnRzIChleHBvcnRlZF9uYW1lLCB4c3RyZHVwIChzeW1ib2xfbmFtZSksIC0xLCAwLCAwLCAwKTsKLQl9Ci0gICAgfQotfQotCi0vKiBBZGQgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhjbHVkZS4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGRfZXhjbHVkZXMgKG5ld19leGNsdWRlcykKLSAgICAgY29uc3QgY2hhciAqbmV3X2V4Y2x1ZGVzOwotewotICBjaGFyICpsb2NhbF9jb3B5OwotICBjaGFyICpleGNsdWRlX3N0cmluZzsKLQotICBsb2NhbF9jb3B5ID0geHN0cmR1cCAobmV3X2V4Y2x1ZGVzKTsKLQotICBleGNsdWRlX3N0cmluZyA9IHN0cnRvayAobG9jYWxfY29weSwgIiw6Iik7Ci0gIGZvciAoOyBleGNsdWRlX3N0cmluZzsgZXhjbHVkZV9zdHJpbmcgPSBzdHJ0b2sgKE5VTEwsICIsOiIpKQotICAgIHsKLSAgICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbmV3X2V4Y2x1ZGU7Ci0gICAgICAKLSAgICAgIG5ld19leGNsdWRlID0gKChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKikKLQkJICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzdHJpbmdfbGlzdCkpKTsKLSAgICAgIG5ld19leGNsdWRlLT5zdHJpbmcgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGV4Y2x1ZGVfc3RyaW5nKSArIDIpOwotICAgICAgLyogRklYTUU6IElzIGl0IGFsd2F5cyByaWdodCB0byBhZGQgYSBsZWFkaW5nIHVuZGVyc2NvcmU/ICAqLwotICAgICAgc3ByaW50ZiAobmV3X2V4Y2x1ZGUtPnN0cmluZywgIl8lcyIsIGV4Y2x1ZGVfc3RyaW5nKTsKLSAgICAgIG5ld19leGNsdWRlLT5uZXh0ID0gZXhjbHVkZXM7Ci0gICAgICBleGNsdWRlcyA9IG5ld19leGNsdWRlOwotCi0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgaW5mb3JtIChfKCJFeGNsdWRpbmcgc3ltYm9sOiAlc1xuIiksIGV4Y2x1ZGVfc3RyaW5nKTsKLSAgICB9Ci0KLSAgZnJlZSAobG9jYWxfY29weSk7Ci19Ci0KLS8qIFNlZSBpZiBTVFJJTkcgaXMgb24gdGhlIGxpc3Qgb2Ygc3ltYm9scyB0byBleGNsdWRlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1hdGNoX2V4Y2x1ZGUgKHN0cmluZykKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmV4Y2xfaXRlbTsKLQotICBmb3IgKGV4Y2xfaXRlbSA9IGV4Y2x1ZGVzOyBleGNsX2l0ZW07IGV4Y2xfaXRlbSA9IGV4Y2xfaXRlbS0+bmV4dCkKLSAgICBpZiAoc3RyY21wIChzdHJpbmcsIGV4Y2xfaXRlbS0+c3RyaW5nKSA9PSAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQWRkIHRoZSBkZWZhdWx0IGxpc3Qgb2Ygc3ltYm9scyB0byBleGNsdWRlLiAgKi8KLQotc3RhdGljIHZvaWQKLXNldF9kZWZhdWx0X2V4Y2x1ZGVzICh2b2lkKQotewotICBhZGRfZXhjbHVkZXMgKGRlZmF1bHRfZXhjbHVkZXMpOwotfQotCi0vKiBDaG9vc2Ugd2hpY2ggc3ltYm9scyB0byBleHBvcnQuICAqLwotCi1zdGF0aWMgbG9uZwotZmlsdGVyX3N5bWJvbHMgKGFiZmQsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgbWluaXN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQsICp0bzsKLSAgYXN5bWJvbCAqc3RvcmU7Ci0KLSAgc3RvcmUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAoc3RvcmUgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBmcm9tID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOwotICBmcm9tZW5kID0gZnJvbSArIHN5bWNvdW50ICogc2l6ZTsKLSAgdG8gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0KLSAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tICs9IHNpemUpCi0gICAgewotICAgICAgaW50IGtlZXAgPSAwOwotICAgICAgYXN5bWJvbCAqc3ltOwotCi0gICAgICBzeW0gPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGZhbHNlLCAoY29uc3QgUFRSKSBmcm9tLCBzdG9yZSk7Ci0gICAgICBpZiAoc3ltID09IE5VTEwpCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgICAgIC8qIENoZWNrIGZvciBleHRlcm5hbCBhbmQgZGVmaW5lZCBvbmx5IHN5bWJvbHMuICAqLwotICAgICAga2VlcCA9ICgoKHN5bS0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwCi0JICAgICAgIHx8IChzeW0tPmZsYWdzICYgQlNGX1dFQUspICE9IDAKLQkgICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCSAgICAgICYmICEgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKTsKLSAgICAgIAotICAgICAga2VlcCA9IGtlZXAgJiYgISBtYXRjaF9leGNsdWRlIChzeW0tPm5hbWUpOwotCi0gICAgICBpZiAoa2VlcCkKLQl7Ci0JICBtZW1jcHkgKHRvLCBmcm9tLCBzaXplKTsKLQkgIHRvICs9IHNpemU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gKHRvIC0gKGJmZF9ieXRlICopIG1pbmlzeW1zKSAvIHNpemU7Ci19Ci0KLS8qIEV4cG9ydCBhbGwgc3ltYm9scyBpbiBBQkZELCBleGNlcHQgZm9yIG9uZXMgd2Ugd2VyZSB0b2xkIG5vdCB0bwotICAgZXhwb3J0LiAgKi8KLQotc3RhdGljIHZvaWQKLXNjYW5fYWxsX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbG9uZyBzeW1jb3VudDsKLSAgUFRSIG1pbmlzeW1zOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLQotICAvKiBJZ25vcmUgYmZkcyB3aXRoIGFuIGltcG9ydCBkZXNjcmlwdG9yIHRhYmxlLiAgV2UgYXNzdW1lIHRoYXQgYW55Ci0gICAgIHN1Y2ggQkZEIGNvbnRhaW5zIHN5bWJvbHMgd2hpY2ggYXJlIGV4cG9ydGVkIGZyb20gYW5vdGhlciBETEwsCi0gICAgIGFuZCB3ZSBkb24ndCB3YW50IHRvIHJlZXhwb3J0IHRoZW0gZnJvbSBoZXJlLiAgKi8KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmlkYXRhJDQiKSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCEgKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBIQVNfU1lNUykpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHdhcm4gKF8oIiVzOiBubyBzeW1ib2xzXG4iKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzeW1jb3VudCA9IGJmZF9yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBmYWxzZSwgJm1pbmlzeW1zLCAmc2l6ZSk7Ci0gIGlmIChzeW1jb3VudCA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgaWYgKHN5bWNvdW50ID09IDApCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHdhcm4gKF8oIiVzOiBubyBzeW1ib2xzXG4iKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBEaXNjYXJkIHRoZSBzeW1ib2xzIHdlIGRvbid0IHdhbnQgdG8gZXhwb3J0LiAgSXQncyBPSyB0byBkbyB0aGlzCi0gICAgIGluIHBsYWNlOyB3ZSdsbCBmcmVlIHRoZSBzdG9yYWdlIGFueXdheS4gICovCi0KLSAgc3ltY291bnQgPSBmaWx0ZXJfc3ltYm9scyAoYWJmZCwgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplKTsKLSAgc2Nhbl9maWx0ZXJlZF9zeW1ib2xzIChhYmZkLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUpOwotCi0gIGZyZWUgKG1pbmlzeW1zKTsKLX0KLQotLyogTG9vayBhdCB0aGUgb2JqZWN0IGZpbGUgdG8gZGVjaWRlIHdoaWNoIHN5bWJvbHMgdG8gZXhwb3J0LiAgKi8KLQotc3RhdGljIHZvaWQKLXNjYW5fb3Blbl9vYmpfZmlsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoZXhwb3J0X2FsbF9zeW1ib2xzKQotICAgIHNjYW5fYWxsX3N5bWJvbHMgKGFiZmQpOwotICBlbHNlCi0gICAgc2Nhbl9kcmVjdHZlX3N5bWJvbHMgKGFiZmQpOwotIAotICAvKiBGSVhNRTogd2Ugb3VnaHQgdG8gcmVhZCBpbiBhbmQgYmxvY2sgb3V0IHRoZSBiYXNlIHJlbG9jYXRpb25zICovCi0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJEb25lIHJlYWRpbmcgJXNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zY2FuX29ial9maWxlIChmaWxlbmFtZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGJmZCAqIGYgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCAwKTsKLQotICBpZiAoIWYpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiVW5hYmxlIHRvIG9wZW4gb2JqZWN0IGZpbGU6ICVzIiksIGZpbGVuYW1lKTsKLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIlNjYW5uaW5nIG9iamVjdCBmaWxlICVzIiksIGZpbGVuYW1lKTsKLSAgCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmLCBiZmRfYXJjaGl2ZSkpCi0gICAgewotICAgICAgYmZkICphcmZpbGUgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChmLCAwKTsKLSAgICAgIHdoaWxlIChhcmZpbGUpCi0JewotCSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGFyZmlsZSwgYmZkX29iamVjdCkpCi0JICAgIHNjYW5fb3Blbl9vYmpfZmlsZSAoYXJmaWxlKTsKLQkgIGJmZF9jbG9zZSAoYXJmaWxlKTsKLQkgIGFyZmlsZSA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGYsIGFyZmlsZSk7Ci0JfQotICAgICAgCi0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYKLSAgICAgIGlmIChtY29yZV9lbGZfb3V0X2ZpbGUpCi0JaW5mb3JtIChfKCJDYW5ub3QgcHJvZHVjZSBtY29yZS1lbGYgZGxsIGZyb20gYXJjaGl2ZSBmaWxlOiAlcyIpLCBmaWxlbmFtZSk7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9jaGVja19mb3JtYXQgKGYsIGJmZF9vYmplY3QpKQotICAgIHsKLSAgICAgIHNjYW5fb3Blbl9vYmpfZmlsZSAoZik7Ci0KLSNpZmRlZiBETExUT09MX01DT1JFX0VMRgotICAgICAgaWYgKG1jb3JlX2VsZl9vdXRfZmlsZSkKLQltY29yZV9lbGZfY2FjaGVfZmlsZW5hbWUgKChjaGFyICopIGZpbGVuYW1lKTsKLSNlbmRpZgotICAgIH0KLQotICBiZmRfY2xvc2UgKGYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWR1bXBfZGVmX2luZm8gKGYpCi0gICAgIEZJTEUgKmY7Ci17Ci0gIGludCBpOwotICBleHBvcnRfdHlwZSAqZXhwOwotICBmcHJpbnRmIChmLCAiJXMgIiwgQVNNX0MpOwotICBmb3IgKGkgPSAwOyBvYXZbaV07IGkrKykKLSAgICBmcHJpbnRmIChmLCAiJXMgIiwgb2F2W2ldKTsKLSAgZnByaW50ZiAoZiwgIlxuIik7Ci0gIGZvciAoaSA9IDAsIGV4cCA9IGRfZXhwb3J0czsgZXhwOyBpKyssIGV4cCA9IGV4cC0+bmV4dCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiJXMgICVkID0gJXMgJXMgQCAlZCAlcyVzJXNcbiIsCi0JICAgICAgIEFTTV9DLAotCSAgICAgICBpLAotCSAgICAgICBleHAtPm5hbWUsCi0JICAgICAgIGV4cC0+aW50ZXJuYWxfbmFtZSwKLQkgICAgICAgZXhwLT5vcmRpbmFsLAotCSAgICAgICBleHAtPm5vbmFtZSA/ICJOT05BTUUgIiA6ICIiLAotCSAgICAgICBleHAtPmNvbnN0YW50ID8gIkNPTlNUQU5UIiA6ICIiLAotCSAgICAgICBleHAtPmRhdGEgPyAiREFUQSIgOiAiIik7Ci0gICAgfQotfQotCi0vKiBHZW5lcmF0ZSB0aGUgLmV4cCBmaWxlICovCi0KLXN0YXRpYyBpbnQKLXNmdW5jIChhLCBiKQotICAgICBjb25zdCB2b2lkICphOwotICAgICBjb25zdCB2b2lkICpiOwotewotICByZXR1cm4gKihjb25zdCBsb25nICopIGEgLSAqKGNvbnN0IGxvbmcgKikgYjsKLX0KLQotc3RhdGljIHZvaWQKLWZsdXNoX3BhZ2UgKGYsIG5lZWQsIHBhZ2VfYWRkciwgb25fcGFnZSkKLSAgICAgRklMRSAqZjsKLSAgICAgbG9uZyAqbmVlZDsKLSAgICAgaW50IHBhZ2VfYWRkcjsKLSAgICAgaW50IG9uX3BhZ2U7Ci17Ci0gIGludCBpOwotCi0gIC8qIEZsdXNoIHRoaXMgcGFnZSAqLwotICBmcHJpbnRmIChmLCAiXHQlc1x0MHglMDh4XHQlcyBTdGFydGluZyBSVkEgZm9yIGNodW5rXG4iLAotCSAgIEFTTV9MT05HLAotCSAgIHBhZ2VfYWRkciwKLQkgICBBU01fQyk7Ci0gIGZwcmludGYgKGYsICJcdCVzXHQweCV4XHQlcyBTaXplIG9mIGJsb2NrXG4iLAotCSAgIEFTTV9MT05HLAotCSAgIChvbl9wYWdlICogMikgKyAob25fcGFnZSAmIDEpICogMiArIDgsCi0JICAgQVNNX0MpOwotICBmb3IgKGkgPSAwOyBpIDwgb25fcGFnZTsgaSsrKQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzXHQweCVseFxuIiwgQVNNX1NIT1JULCAobmVlZFtpXSAtIHBhZ2VfYWRkcikgfCAweDMwMDApOwotICAgIH0KLSAgLyogQW5kIHBhZGRpbmcgKi8KLSAgaWYgKG9uX3BhZ2UgJiAxKQotICAgIGZwcmludGYgKGYsICJcdCVzXHQweCV4XG4iLCBBU01fU0hPUlQsIDAgfCAweDAwMDApOwotfQotCi1zdGF0aWMgdm9pZAotZ2VuX2RlZl9maWxlICgpCi17Ci0gIGludCBpOwotICBleHBvcnRfdHlwZSAqZXhwOwotCi0gIGluZm9ybSAoXygiQWRkaW5nIGV4cG9ydHMgdG8gb3V0cHV0IGZpbGUiKSk7Ci0gIAotICBmcHJpbnRmIChvdXRwdXRfZGVmLCAiOyIpOwotICBmb3IgKGkgPSAwOyBvYXZbaV07IGkrKykKLSAgICBmcHJpbnRmIChvdXRwdXRfZGVmLCAiICVzIiwgb2F2W2ldKTsKLQotICBmcHJpbnRmIChvdXRwdXRfZGVmLCAiXG5FWFBPUlRTXG4iKTsKLQotICBmb3IgKGkgPSAwLCBleHAgPSBkX2V4cG9ydHM7IGV4cDsgaSsrLCBleHAgPSBleHAtPm5leHQpCi0gICAgewotICAgICAgY2hhciAqcXVvdGUgPSBzdHJjaHIgKGV4cC0+bmFtZSwgJy4nKSA/ICJcIiIgOiAiIjsKLSAgICAgIGNoYXIgKnJlcyA9IGNwbHVzX2RlbWFuZ2xlIChleHAtPmludGVybmFsX25hbWUsIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKLQotICAgICAgaWYgKHN0cmNtcCAoZXhwLT5uYW1lLCBleHAtPmludGVybmFsX25hbWUpID09IDApCi0gICAgICAgIHsKLQotCSAgZnByaW50ZiAob3V0cHV0X2RlZiwgIlx0JXMlcyVzIEAgJWQlcyVzIDsgJXNcbiIsCi0JCSAgIHF1b3RlLAotCQkgICBleHAtPm5hbWUsCi0JCSAgIHF1b3RlLAotCQkgICBleHAtPm9yZGluYWwsCi0JCSAgIGV4cC0+bm9uYW1lID8gIiBOT05BTUUiIDogIiIsCi0JCSAgIGV4cC0+ZGF0YSA/ICIgREFUQSIgOiAiIiwKLQkJICAgcmVzID8gcmVzIDogIiIpOwotCX0KLSAgICAgIGVsc2UgCi0gICAgICAgIHsKLSAgICAgICAgICBjaGFyICpxdW90ZTEgPSBzdHJjaHIgKGV4cC0+aW50ZXJuYWxfbmFtZSwgJy4nKSA/ICJcIiIgOiAiIjsKLQkgIC8qIGNoYXIgKmFsaWFzID0gICovCi0JICBmcHJpbnRmIChvdXRwdXRfZGVmLCAiXHQlcyVzJXMgPSAlcyVzJXMgQCAlZCVzJXMgOyAlc1xuIiwKLQkJICAgcXVvdGUsCi0JCSAgIGV4cC0+bmFtZSwKLQkJICAgcXVvdGUsCi0JCSAgIHF1b3RlMSwKLQkJICAgZXhwLT5pbnRlcm5hbF9uYW1lLAotCQkgICBxdW90ZTEsCi0JCSAgIGV4cC0+b3JkaW5hbCwKLQkJICAgZXhwLT5ub25hbWUgPyAiIE5PTkFNRSIgOiAiIiwKLQkJICAgZXhwLT5kYXRhID8gIiBEQVRBIiA6ICIiLAotCQkgICByZXMgPyByZXMgOiAiIik7Ci0JfQotICAgICAgaWYgKHJlcykKLSAgICAgICAgZnJlZSAocmVzKTsKLSAgICB9Ci0gIAotICBpbmZvcm0gKF8oIkFkZGVkIGV4cG9ydHMgdG8gb3V0cHV0IGZpbGUiKSk7Ci19Ci0KLS8qIGdlbmVyYXRlX2lkYXRhX29maWxlIGdlbmVyYXRlcyB0aGUgcG9ydGFibGUgYXNzZW1ibHkgc291cmNlIGNvZGUKLSAgIGZvciB0aGUgaWRhdGEgc2VjdGlvbnMuICBJdCBhcHBlbmRzIHRoZSBzb3VyY2UgY29kZSB0byB0aGUgZW5kIG9mCi0gICB0aGUgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nZW5lcmF0ZV9pZGF0YV9vZmlsZSAoZmlsdmFyKQotICAgICBGSUxFICpmaWx2YXI7Ci17Ci0gIGloZWFkdHlwZSAqaGVhZHB0cjsKLSAgaWZ1bmN0eXBlICpmdW5jcHRyOwotICBpbnQgICAgICAgIGhlYWRpbmRleDsKLSAgaW50ICAgICAgICBmdW5jaW5kZXg7Ci0gIGludAkgICAgIG5oZWFkczsKLQotICBpZiAoaW1wb3J0X2xpc3QgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZnByaW50ZiAoZmlsdmFyLCAiJXMgSW1wb3J0IGRhdGEgc2VjdGlvbnNcbiIsIEFTTV9DKTsKLSAgZnByaW50ZiAoZmlsdmFyLCAiXG5cdC5zZWN0aW9uXHQuaWRhdGEkMlxuIik7Ci0gIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdGRvaV9pZGF0YVxuIiwgQVNNX0dMT0JBTCk7Ci0gIGZwcmludGYgKGZpbHZhciwgImRvaV9pZGF0YTpcbiIpOwotCi0gIG5oZWFkcyA9IDA7Ci0gIGZvciAoaGVhZHB0ciA9IGltcG9ydF9saXN0OyBoZWFkcHRyICE9IE5VTEw7IGhlYWRwdHIgPSBoZWFkcHRyLT5uZXh0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNsaXN0b25lJWQlc1x0JXMgJXNcbiIsCi0JICAgICAgIEFTTV9SVkFfQkVGT1JFLCBuaGVhZHMsIEFTTV9SVkFfQUZURVIsCi0JICAgICAgIEFTTV9DLCBoZWFkcHRyLT5kbGxuYW1lKTsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNkbGxuYW1lJWQlc1xuIiwKLQkgICAgICAgQVNNX1JWQV9CRUZPUkUsIG5oZWFkcywgQVNNX1JWQV9BRlRFUik7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsICJcdCVzbGlzdHR3byVkJXNcblxuIiwKLQkgICAgICAgQVNNX1JWQV9CRUZPUkUsIG5oZWFkcywgQVNNX1JWQV9BRlRFUik7Ci0gICAgICBuaGVhZHMrKzsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOyAvKiBOVUxMIHJlY29yZCBhdCAqLwotICBmcHJpbnRmIChmaWx2YXIsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7IC8qIGVuZCBvZiBpZGF0YSQyICovCi0gIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsgLyogc2VjdGlvbiAgICAgICAgKi8KLSAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmaWx2YXIsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0KLSAgZnByaW50ZiAoZmlsdmFyLCAiXG5cdC5zZWN0aW9uXHQuaWRhdGEkNFxuIik7Ci0gIGhlYWRpbmRleCA9IDA7Ci0gIGZvciAoaGVhZHB0ciA9IGltcG9ydF9saXN0OyBoZWFkcHRyICE9IE5VTEw7IGhlYWRwdHIgPSBoZWFkcHRyLT5uZXh0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgImxpc3RvbmUlZDpcbiIsIGhlYWRpbmRleCk7Ci0gICAgICBmb3IgKCBmdW5jaW5kZXggPSAwOyBmdW5jaW5kZXggPCBoZWFkcHRyLT5uZnVuY3M7IGZ1bmNpbmRleCsrICkKLQlmcHJpbnRmIChmaWx2YXIsICJcdCVzZnVuY3B0ciVkXyVkJXNcbiIsCi0JCSBBU01fUlZBX0JFRk9SRSwgaGVhZGluZGV4LCBmdW5jaW5kZXgsIEFTTV9SVkFfQUZURVIpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCJcdCVzXHQwXG4iLCBBU01fTE9ORyk7IC8qIE5VTEwgdGVybWluYXRpbmcgbGlzdCAqLwotICAgICAgaGVhZGluZGV4Kys7Ci0gICAgfQotCi0gIGZwcmludGYgKGZpbHZhciwgIlxuXHQuc2VjdGlvblx0LmlkYXRhJDVcbiIpOwotICBoZWFkaW5kZXggPSAwOwotICBmb3IgKGhlYWRwdHIgPSBpbXBvcnRfbGlzdDsgaGVhZHB0ciAhPSBOVUxMOyBoZWFkcHRyID0gaGVhZHB0ci0+bmV4dCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsICJsaXN0dHdvJWQ6XG4iLCBoZWFkaW5kZXgpOwotICAgICAgZm9yICggZnVuY2luZGV4ID0gMDsgZnVuY2luZGV4IDwgaGVhZHB0ci0+bmZ1bmNzOyBmdW5jaW5kZXgrKyApCi0JZnByaW50ZiAoZmlsdmFyLCAiXHQlc2Z1bmNwdHIlZF8lZCVzXG4iLAotCQkgQVNNX1JWQV9CRUZPUkUsIGhlYWRpbmRleCwgZnVuY2luZGV4LCBBU01fUlZBX0FGVEVSKTsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsgLyogTlVMTCB0ZXJtaW5hdGluZyBsaXN0ICovCi0gICAgICBoZWFkaW5kZXgrKzsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZmlsdmFyLCAiXG5cdC5zZWN0aW9uXHQuaWRhdGEkNlxuIik7Ci0gIGhlYWRpbmRleCA9IDA7Ci0gIGZvciAoaGVhZHB0ciA9IGltcG9ydF9saXN0OyBoZWFkcHRyICE9IE5VTEw7IGhlYWRwdHIgPSBoZWFkcHRyLT5uZXh0KQotICAgIHsKLSAgICAgIGZ1bmNpbmRleCA9IDA7Ci0gICAgICBmb3IgKGZ1bmNwdHIgPSBoZWFkcHRyLT5mdW5jaGVhZDsgZnVuY3B0ciAhPSBOVUxMOwotCSAgIGZ1bmNwdHIgPSBmdW5jcHRyLT5uZXh0KQotCXsKLQkgIGZwcmludGYgKGZpbHZhciwiZnVuY3B0ciVkXyVkOlxuIiwgaGVhZGluZGV4LCBmdW5jaW5kZXgpOwotCSAgZnByaW50ZiAoZmlsdmFyLCJcdCVzXHQlZFxuIiwgQVNNX1NIT1JULAotCQkgICAoKGZ1bmNwdHItPm9yZCkgJiAweEZGRkYpKTsKLQkgIGZwcmludGYgKGZpbHZhciwiXHQlc1x0XCIlc1wiXG4iLCBBU01fVEVYVCwgZnVuY3B0ci0+bmFtZSk7Ci0JICBmcHJpbnRmIChmaWx2YXIsIlx0JXNcdDBcbiIsIEFTTV9CWVRFKTsKLQkgIGZ1bmNpbmRleCsrOwotCX0KLSAgICAgIGhlYWRpbmRleCsrOwotICAgIH0KLQotICBmcHJpbnRmIChmaWx2YXIsICJcblx0LnNlY3Rpb25cdC5pZGF0YSQ3XG4iKTsKLSAgaGVhZGluZGV4ID0gMDsKLSAgZm9yIChoZWFkcHRyID0gaW1wb3J0X2xpc3Q7IGhlYWRwdHIgIT0gTlVMTDsgaGVhZHB0ciA9IGhlYWRwdHItPm5leHQpCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsdmFyLCJkbGxuYW1lJWQ6XG4iLCBoZWFkaW5kZXgpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCJcdCVzXHRcIiVzXCJcbiIsIEFTTV9URVhULCBoZWFkcHRyLT5kbGxuYW1lKTsKLSAgICAgIGZwcmludGYgKGZpbHZhciwiXHQlc1x0MFxuIiwgQVNNX0JZVEUpOwotICAgICAgaGVhZGluZGV4Kys7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZ2VuX2V4cF9maWxlICgpCi17Ci0gIEZJTEUgKmY7Ci0gIGludCBpOwotICBleHBvcnRfdHlwZSAqZXhwOwotICBkbGlzdF90eXBlICpkbDsKLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIkdlbmVyYXRpbmcgZXhwb3J0IGZpbGU6ICVzXG4iKSwgZXhwX25hbWUpOwotICAKLSAgZiA9IGZvcGVuIChUTVBfQVNNLCBGT1BFTl9XVCk7Ci0gIGlmICghZikKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGZhdGFsIChfKCJVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgYXNzZW1ibGVyIGZpbGU6ICVzIiksIFRNUF9BU00pOwotICAKLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJPcGVuZWQgdGVtcG9yYXJ5IGZpbGU6ICVzIiksIFRNUF9BU00pOwotCi0gIGR1bXBfZGVmX2luZm8gKGYpOwotICAKLSAgaWYgKGRfZXhwb3J0cykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuZWRhdGFcblxuIik7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlcwkwCSVzIEFsbHdheXMgMFxuIiwgQVNNX0xPTkcsIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzCTB4JWx4CSVzIFRpbWUgYW5kIGRhdGVcbiIsIEFTTV9MT05HLCAobG9uZykgdGltZSgwKSwKLQkgICAgICAgQVNNX0MpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXMJMAklcyBNYWpvciBhbmQgTWlub3IgdmVyc2lvblxuIiwgQVNNX0xPTkcsIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzbmFtZSVzCSVzIFB0ciB0byBuYW1lIG9mIGRsbFxuIiwgQVNNX1JWQV9CRUZPUkUsIEFTTV9SVkFfQUZURVIsIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzCSVkCSVzIFN0YXJ0aW5nIG9yZGluYWwgb2YgZXhwb3J0c1xuIiwgQVNNX0xPTkcsIGRfbG93X29yZCwgQVNNX0MpOwotCi0KLSAgICAgIGZwcmludGYgKGYsICJcdCVzCSVkCSVzIE51bWJlciBvZiBmdW5jdGlvbnNcbiIsIEFTTV9MT05HLCBkX2hpZ2hfb3JkIC0gZF9sb3dfb3JkICsgMSwgQVNNX0MpOwotICAgICAgZnByaW50ZihmLCJcdCVzIG5hbWVkIGZ1bmNzICVkLCBsb3cgb3JkICVkLCBoaWdoIG9yZCAlZFxuIiwKLQkgICAgICBBU01fQywKLQkgICAgICBkX25hbWVkX25mdW5jcywgZF9sb3dfb3JkLCBkX2hpZ2hfb3JkKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzCSVkCSVzIE51bWJlciBvZiBuYW1lc1xuIiwgQVNNX0xPTkcsCi0JICAgICAgIHNob3dfYWxsbmFtZXMgPyBkX2hpZ2hfb3JkIC0gZF9sb3dfb3JkICsgMSA6IGRfbmFtZWRfbmZ1bmNzLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc2FmdW5jcyVzICAlcyBBZGRyZXNzIG9mIGZ1bmN0aW9uc1xuIiwgQVNNX1JWQV9CRUZPUkUsIEFTTV9SVkFfQUZURVIsIEFTTV9DKTsKLQotICAgICAgZnByaW50ZiAoZiwgIlx0JXNhbmFtZXMlcwklcyBBZGRyZXNzIG9mIE5hbWUgUG9pbnRlciBUYWJsZVxuIiwKLQkgICAgICAgQVNNX1JWQV9CRUZPUkUsIEFTTV9SVkFfQUZURVIsIEFTTV9DKTsKLQotICAgICAgZnByaW50ZiAoZiwgIlx0JXNhbm9yZHMlcwklcyBBZGRyZXNzIG9mIG9yZGluYWxzXG4iLCBBU01fUlZBX0JFRk9SRSwgQVNNX1JWQV9BRlRFUiwgQVNNX0MpOwotCi0gICAgICBmcHJpbnRmIChmLCAibmFtZToJJXMJXCIlc1wiXG4iLCBBU01fVEVYVCwgZGxsX25hbWUpOwotCi0KLSAgICAgIGZwcmludGYoZiwiJXMgRXhwb3J0IGFkZHJlc3MgVGFibGVcbiIsIEFTTV9DKTsKLSAgICAgIGZwcmludGYoZiwiXHQlc1xuIiwgQVNNX0FMSUdOX0xPTkcpOwotICAgICAgZnByaW50ZiAoZiwgImFmdW5jczpcbiIpOwotICAgICAgaSA9IGRfbG93X29yZDsKLQotICAgICAgZm9yIChleHAgPSBkX2V4cG9ydHM7IGV4cDsgZXhwID0gZXhwLT5uZXh0KQotCXsKLQkgIGlmIChleHAtPm9yZGluYWwgIT0gaSkKLQkgICAgewotI2lmIDAKLQkgICAgICBmcHJpbnRmIChmLCAiXHQlc1x0JWRcdCVzICVkLi4lZCBtaXNzaW5nXG4iLAotCQkgICAgICAgQVNNX1NQQUNFLAotCQkgICAgICAgKGV4cC0+b3JkaW5hbCAtIGkpICogNCwKLQkJICAgICAgIEFTTV9DLAotCQkgICAgICAgaSwgZXhwLT5vcmRpbmFsIC0gMSk7Ci0JICAgICAgaSA9IGV4cC0+b3JkaW5hbDsKLSNlbmRpZgotCSAgICAgIHdoaWxlIChpIDwgZXhwLT5vcmRpbmFsKQotCQl7Ci0JCSAgZnByaW50ZihmLCJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0JCSAgaSsrOwotCQl9Ci0JICAgIH0KLQkgIGZwcmludGYgKGYsICJcdCVzJXMlcyVzXHQlcyAlZFxuIiwgQVNNX1JWQV9CRUZPUkUsCi0gICAgICAgICAgICAgICAgICAgQVNNX1BSRUZJWCwKLSAgICAgICAgICAgICAgICAgICBleHAtPmludGVybmFsX25hbWUsIEFTTV9SVkFfQUZURVIsIEFTTV9DLCBleHAtPm9yZGluYWwpOwotCSAgaSsrOwotCX0KLQotICAgICAgZnByaW50ZiAoZiwiJXMgRXhwb3J0IE5hbWUgUG9pbnRlciBUYWJsZVxuIiwgQVNNX0MpOwotICAgICAgZnByaW50ZiAoZiwgImFuYW1lczpcbiIpOwotCi0gICAgICBmb3IgKGkgPSAwOyAoZXhwID0gZF9leHBvcnRzX2xleGljYWxseVtpXSk7IGkrKykKLQl7Ci0JICBpZiAoIWV4cC0+bm9uYW1lIHx8IHNob3dfYWxsbmFtZXMpCi0JICAgIGZwcmludGYgKGYsICJcdCVzbiVkJXNcbiIsCi0JCSAgICAgQVNNX1JWQV9CRUZPUkUsIGV4cC0+b3JkaW5hbCwgQVNNX1JWQV9BRlRFUik7Ci0JfQotCi0gICAgICBmcHJpbnRmIChmLCIlcyBFeHBvcnQgT3JpZGluYWwgVGFibGVcbiIsIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJhbm9yZHM6XG4iKTsKLSAgICAgIGZvciAoaSA9IDA7IChleHAgPSBkX2V4cG9ydHNfbGV4aWNhbGx5W2ldKTsgaSsrKQotCXsKLQkgIGlmICghZXhwLT5ub25hbWUgfHwgc2hvd19hbGxuYW1lcykKLQkgICAgZnByaW50ZiAoZiwgIlx0JXMJJWRcbiIsIEFTTV9TSE9SVCwgZXhwLT5vcmRpbmFsIC0gZF9sb3dfb3JkKTsKLQl9Ci0KLSAgICAgIGZwcmludGYoZiwiJXMgRXhwb3J0IE5hbWUgVGFibGVcbiIsIEFTTV9DKTsKLSAgICAgIGZvciAoaSA9IDA7IChleHAgPSBkX2V4cG9ydHNfbGV4aWNhbGx5W2ldKTsgaSsrKQotCWlmICghZXhwLT5ub25hbWUgfHwgc2hvd19hbGxuYW1lcykKLQkgIGZwcmludGYgKGYsICJuJWQ6CSVzCVwiJXNcIlxuIiwKLQkJICAgZXhwLT5vcmRpbmFsLCBBU01fVEVYVCwgZXhwLT5uYW1lKTsKLQotICAgICAgaWYgKGFfbGlzdCkKLQl7Ci0JICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbiAlc1xuIiwgRFJFQ1RWRV9TRUNUSU9OX05BTUUpOwotCSAgZm9yIChkbCA9IGFfbGlzdDsgZGw7IGRsID0gZGwtPm5leHQpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChmLCAiXHQlc1x0XCIlc1wiXG4iLCBBU01fVEVYVCwgZGwtPnRleHQpOwotCSAgICB9Ci0JfQotICAgICAgCi0gICAgICBpZiAoZF9saXN0KQotCXsKLQkgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uIC5yZGF0YVxuIik7Ci0JICBmb3IgKGRsID0gZF9saXN0OyBkbDsgZGwgPSBkbC0+bmV4dCkKLQkgICAgewotCSAgICAgIGNoYXIgKnA7Ci0JICAgICAgaW50IGw7Ci0JICAgICAgLyogV2UgZG9udCBvdXRwdXQgYXMgYXNjaWkgJ2NhdXNlIHRoZXJlIGNhbgotCSAgICAgICAgIGJlIHF1b3RlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyAqLwotCi0JICAgICAgbCA9IDA7Ci0JICAgICAgZm9yIChwID0gZGwtPnRleHQ7ICpwOyBwKyspCi0JCXsKLQkJICBpZiAobCA9PSAwKQotCQkgICAgZnByaW50ZiAoZiwgIlx0JXNcdCIsIEFTTV9CWVRFKTsKLQkJICBlbHNlCi0JCSAgICBmcHJpbnRmIChmLCAiLCIpOwotCQkgIGZwcmludGYgKGYsICIlZCIsICpwKTsKLQkJICBpZiAocFsxXSA9PSAwKQotCQkgICAgewotCQkgICAgICBmcHJpbnRmIChmLCAiLDBcbiIpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBpZiAoKytsID09IDEwKQotCQkgICAgewotCQkgICAgICBmcHJpbnRmIChmLCAiXG4iKTsKLQkJICAgICAgbCA9IDA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLQotICAvKiBBZGQgdG8gdGhlIG91dHB1dCBmaWxlIGEgd2F5IG9mIGdldHRpbmcgdG8gdGhlIGV4cG9ydGVkIG5hbWVzCi0gICAgIHdpdGhvdXQgdXNpbmcgdGhlIGltcG9ydCBsaWJyYXJ5LiAqLwotICBpZiAoYWRkX2luZGlyZWN0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uXHQucmRhdGFcbiIpOwotICAgICAgZm9yIChpID0gMCwgZXhwID0gZF9leHBvcnRzOyBleHA7IGkrKywgZXhwID0gZXhwLT5uZXh0KQotCWlmICghZXhwLT5ub25hbWUgfHwgc2hvd19hbGxuYW1lcykKLQkgIHsKLQkgICAgLyogV2UgdXNlIGEgc2luZ2xlIHVuZGVyc2NvcmUgZm9yIE1TIGNvbXBhdGliaWxpdHksIGFuZCBhCi0gICAgICAgICAgICAgICBkb3VibGUgdW5kZXJzY29yZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZAotICAgICAgICAgICAgICAgY3lnd2luIHJlbGVhc2VzLiAgKi8KLQkgICAgZnByaW50ZiAoZiwgIlx0JXNcdF9faW1wXyVzXG4iLCBBU01fR0xPQkFMLCBleHAtPm5hbWUpOwotCSAgICBmcHJpbnRmIChmLCAiXHQlc1x0X2ltcF9fJXNcbiIsIEFTTV9HTE9CQUwsIGV4cC0+bmFtZSk7Ci0JICAgIGZwcmludGYgKGYsICJfX2ltcF8lczpcbiIsIGV4cC0+bmFtZSk7Ci0JICAgIGZwcmludGYgKGYsICJfaW1wX18lczpcbiIsIGV4cC0+bmFtZSk7Ci0JICAgIGZwcmludGYgKGYsICJcdCVzXHQlc1xuIiwgQVNNX0xPTkcsIGV4cC0+bmFtZSk7Ci0JICB9Ci0gICAgfQotCi0gIC8qIER1bXAgdGhlIHJlbG9jIHNlY3Rpb24gaWYgYSBiYXNlIGZpbGUgaXMgcHJvdmlkZWQgKi8KLSAgaWYgKGJhc2VfZmlsZSkKLSAgICB7Ci0gICAgICBpbnQgYWRkcjsKLSAgICAgIGxvbmcgbmVlZFtQQUdFX1NJWkVdOwotICAgICAgbG9uZyBwYWdlX2FkZHI7Ci0gICAgICBpbnQgbnVtYnl0ZXM7Ci0gICAgICBpbnQgbnVtX2VudHJpZXM7Ci0gICAgICBsb25nICpjb3B5OwotICAgICAgaW50IGo7Ci0gICAgICBpbnQgb25fcGFnZTsKLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uXHQuaW5pdFxuIik7Ci0gICAgICBmcHJpbnRmIChmLCAibGFiOlxuIik7Ci0KLSAgICAgIGZzZWVrIChiYXNlX2ZpbGUsIDAsIFNFRUtfRU5EKTsKLSAgICAgIG51bWJ5dGVzID0gZnRlbGwgKGJhc2VfZmlsZSk7Ci0gICAgICBmc2VlayAoYmFzZV9maWxlLCAwLCBTRUVLX1NFVCk7Ci0gICAgICBjb3B5ID0geG1hbGxvYyAobnVtYnl0ZXMpOwotICAgICAgZnJlYWQgKGNvcHksIDEsIG51bWJ5dGVzLCBiYXNlX2ZpbGUpOwotICAgICAgbnVtX2VudHJpZXMgPSBudW1ieXRlcyAvIHNpemVvZiAobG9uZyk7Ci0KLQotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb25cdC5yZWxvY1xuIik7Ci0gICAgICBpZiAobnVtX2VudHJpZXMpCi0JewotCSAgaW50IHNyYzsKLQkgIGludCBkc3QgPSAwOwotCSAgaW50IGxhc3QgPSAtMTsKLQkgIGludCB0b3RzaXplID0gMDsKLQotCSAgcXNvcnQgKGNvcHksIG51bV9lbnRyaWVzLCBzaXplb2YgKGxvbmcpLCBzZnVuYyk7Ci0JICAvKiBEZWxldGUgZHVwbGNhdGVzICovCi0JICBmb3IgKHNyYyA9IDA7IHNyYyA8IG51bV9lbnRyaWVzOyBzcmMrKykKLQkgICAgewotCSAgICAgIGlmIChsYXN0ICE9IGNvcHlbc3JjXSkKLQkJbGFzdCA9IGNvcHlbZHN0KytdID0gY29weVtzcmNdOwotCSAgICB9Ci0JICBudW1fZW50cmllcyA9IGRzdDsKLQkgIGFkZHIgPSBjb3B5WzBdOwotCSAgcGFnZV9hZGRyID0gYWRkciAmIFBBR0VfTUFTSzsJCS8qIHdvcmsgb3V0IHRoZSBwYWdlIGFkZHIgKi8KLQkgIG9uX3BhZ2UgPSAwOwotCSAgZm9yIChqID0gMDsgaiA8IG51bV9lbnRyaWVzOyBqKyspCi0JICAgIHsKLQkgICAgICB0b3RzaXplICs9IDI7Ci0JICAgICAgYWRkciA9IGNvcHlbal07Ci0JICAgICAgaWYgKChhZGRyICYgUEFHRV9NQVNLKSAhPSBwYWdlX2FkZHIpCi0JCXsKLQkJICB0b3RzaXplICs9IDggKyAob25fcGFnZSAmIDEpKjI7Ci0JCSAgZmx1c2hfcGFnZSAoZiwgbmVlZCwgcGFnZV9hZGRyLCBvbl9wYWdlKTsKLQkJICBvbl9wYWdlID0gMDsKLQkJICBwYWdlX2FkZHIgPSBhZGRyICYgUEFHRV9NQVNLOwotCQl9Ci0JICAgICAgbmVlZFtvbl9wYWdlKytdID0gYWRkcjsKLQkgICAgfQotCi0JICAvKiBQYWQgdGhlIHNlY3Rpb24gdG8gYW4gZXZlbiAzMi1ieXRlIGJvdW5kYXJ5LiAgVGhpcyB3aWxsIG1ha2UKLQkgICAgIHRoZSBCZU9TIGxvYWRlciBtdWNoIGhhcHBpZXIsIGFuZCBzaG91bGRuJ3QgbWF0dGVyIGZvciBvdGhlcgotCSAgICAgT1Nlcy4gKi8KLQkgIHdoaWxlICgodG90c2l6ZSArIDggKyAob25fcGFnZSAmIDEpKjIpICUgMzIgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIDB4MDAwMCBpcyBhbiBhYnNvbHV0ZSByZWxvY2F0aW9uIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQuICAqLwotCSAgICAgIG5lZWRbb25fcGFnZSsrXSA9IDB4MDAwMDsKLQkgICAgICB0b3RzaXplICs9IDI7Ci0JICAgIH0KLQotCSAgZmx1c2hfcGFnZSAoZiwgbmVlZCwgcGFnZV9hZGRyLCBvbl9wYWdlKTsKLQotCSAgLyogZnByaW50ZiAoZiwgIlx0JXNcdDAsMFx0JXMgRW5kXG4iLCBBU01fTE9ORywgQVNNX0MpOyovCi0JfQotICAgIH0KLQotICBnZW5lcmF0ZV9pZGF0YV9vZmlsZSAoZik7Ci0KLSAgZmNsb3NlIChmKTsKLQotICAvKiBhc3NlbWJsZSB0aGUgZmlsZSAqLwotICBzcHJpbnRmIChvdXRmaWxlLCAiJXMgLW8gJXMgJXMiLCBhc19mbGFncywgZXhwX25hbWUsIFRNUF9BU00pOwotCi0jaWZkZWYgRExMVE9PTF9BUk0KLSAgaWYgKG1hY2hpbmUgPT0gTUFSTV9JTlRFUldPUksgfHwgbWFjaGluZSA9PSBNVEhVTUIpCi0gICAgc3RyY2F0IChvdXRmaWxlLCAiIC1tdGh1bWItaW50ZXJ3b3JrIik7Ci0jZW5kaWYKLSAgCi0gIHJ1biAoYXNfbmFtZSwgb3V0ZmlsZSk7Ci0gIAotICBpZiAoZG9udGRlbHRlbXBzID09IDApCi0gICAgdW5saW5rIChUTVBfQVNNKTsKLSAgCi0gIGluZm9ybSAoXygiR2VuZXJhdGVkIGV4cG9ydHMgZmlsZSIpKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgoteGxhdGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChhZGRfdW5kZXJzY29yZSkKLSAgICB7Ci0gICAgICBjaGFyICpjb3B5ID0geG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDIpOwotICAgICAgY29weVswXSA9ICdfJzsKLSAgICAgIHN0cmNweSAoY29weSArIDEsIG5hbWUpOwotICAgICAgbmFtZSA9IGNvcHk7Ci0gICAgfQotCi0gIGlmIChraWxsYXQpCi0gICAgewotICAgICAgY2hhciAqcDsKLSAgICAgIHAgPSBzdHJjaHIgKG5hbWUsICdAJyk7Ci0gICAgICBpZiAocCkKLQkqcCA9IDA7Ci0gICAgfQotICByZXR1cm4gbmFtZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiAwCi0KLXN0YXRpYyB2b2lkCi1kdW1wX2lhdCAoZiwgZXhwKQotICAgICBGSUxFICpmOwotICAgICBleHBvcnRfdHlwZSAqZXhwOwotewotICBpZiAoZXhwLT5ub25hbWUgJiYgIXNob3dfYWxsbmFtZXMgKQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzXHQweCUwOHhcbiIsCi0JICAgICAgIEFTTV9MT05HLAotCSAgICAgICBleHAtPm9yZGluYWwgfCAweDgwMDAwMDAwKTsgLyogaGludCBvciBvcmluZGFsID8/ICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIlx0JXNJRCVkJXNcbiIsIEFTTV9SVkFfQkVGT1JFLAotCSAgICAgICBleHAtPm9yZGluYWwsCi0JICAgICAgIEFTTV9SVkFfQUZURVIpOwotICAgIH0KLX0KLQotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGludCBpZDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgaW50IGZsYWdzOwotICBpbnQgYWxpZ247Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGFzeW1ib2wgKnN5bTsKLSAgYXN5bWJvbCAqKnN5bXBwOwotICBpbnQgc2l6ZTsKLSAgdW5zaWduZWQgICBjaGFyICpkYXRhOwotfSBzaW5mbzsKLQotI2lmbmRlZiBETExUT09MX1BQQwotCi0jZGVmaW5lIFRFWFQgMAotI2RlZmluZSBEQVRBIDEKLSNkZWZpbmUgQlNTIDIKLSNkZWZpbmUgSURBVEE3IDMKLSNkZWZpbmUgSURBVEE1IDQKLSNkZWZpbmUgSURBVEE0IDUKLSNkZWZpbmUgSURBVEE2IDYKLQotI2RlZmluZSBOU0VDUyA3Ci0KLXN0YXRpYyBzaW5mbyBzZWNkYXRhW05TRUNTXSA9Ci17Ci0gIHsgVEVYVCwgICAiLnRleHQiLCAgICBTRUNfQ09ERSB8IFNFQ19IQVNfQ09OVEVOVFMsIDJ9LAotICB7IERBVEEsICAgIi5kYXRhIiwgICAgU0VDX0RBVEEsICAgICAgICAgICAgICAgICAgICAyfSwKLSAgeyBCU1MsICAgICIuYnNzIiwgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgMn0sCi0gIHsgSURBVEE3LCAiLmlkYXRhJDciLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAotICB7IElEQVRBNSwgIi5pZGF0YSQ1IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAyfSwKLSAgeyBJREFUQTQsICIuaWRhdGEkNCIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCi0gIHsgSURBVEE2LCAiLmlkYXRhJDYiLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDF9Ci19OwotCi0jZWxzZQotCi0vKiBTZWN0aW9ucyBudW1iZXJlZCB0byBtYWtlIHRoZSBvcmRlciB0aGUgc2FtZSBhcyBvdGhlciBQb3dlclBDIE5UICAgICovCi0vKiBjb21waWxlcnMuIFRoaXMgYWxzbyBrZWVwcyBmdW5ueSBhbGlnbm1lbnQgdGhpbmdpZXMgZnJvbSBoYXBwZW5pbmcuICovCi0jZGVmaW5lIFRFWFQgICAwCi0jZGVmaW5lIFBEQVRBICAxCi0jZGVmaW5lIFJEQVRBICAyCi0jZGVmaW5lIElEQVRBNSAzCi0jZGVmaW5lIElEQVRBNCA0Ci0jZGVmaW5lIElEQVRBNiA1Ci0jZGVmaW5lIElEQVRBNyA2Ci0jZGVmaW5lIERBVEEgICA3Ci0jZGVmaW5lIEJTUyAgICA4Ci0KLSNkZWZpbmUgTlNFQ1MgOQotCi1zdGF0aWMgc2luZm8gc2VjZGF0YVtOU0VDU10gPQotewotICB7IFRFWFQsICAgIi50ZXh0IiwgICAgU0VDX0NPREUgfCBTRUNfSEFTX0NPTlRFTlRTLCAzfSwKLSAgeyBQREFUQSwgICIucGRhdGEiLCAgIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCi0gIHsgUkRBVEEsICAiLnJlbGRhdGEiLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAotICB7IElEQVRBNSwgIi5pZGF0YSQ1IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAyfSwKLSAgeyBJREFUQTQsICIuaWRhdGEkNCIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCi0gIHsgSURBVEE2LCAiLmlkYXRhJDYiLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDF9LAotICB7IElEQVRBNywgIi5pZGF0YSQ3IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAyfSwKLSAgeyBEQVRBLCAgICIuZGF0YSIsICAgIFNFQ19EQVRBLCAgICAgICAgICAgICAgICAgICAgMn0sCi0gIHsgQlNTLCAgICAiLmJzcyIsICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDJ9Ci19OwotCi0jZW5kaWYKLQotLyoKLVRoaXMgaXMgd2hhdCB3ZSdyZSB0cnlpbmcgdG8gbWFrZS4gIFdlIGdlbmVyYXRlIHRoZSBpbXAgc3ltYm9scyB3aXRoCi1ib3RoIHNpbmdsZSBhbmQgZG91YmxlIHVuZGVyc2NvcmVzLCBmb3IgY29tcGF0aWJpbGl0eS4KLQotCS50ZXh0Ci0JLmdsb2JhbAlfR2V0RmlsZVZlcnNpb25JbmZvU2l6ZVdAOAotCS5nbG9iYWwJX19pbXBfR2V0RmlsZVZlcnNpb25JbmZvU2l6ZVdAOAotX0dldEZpbGVWZXJzaW9uSW5mb1NpemVXQDg6Ci0Jam1wICoJX19pbXBfR2V0RmlsZVZlcnNpb25JbmZvU2l6ZVdAOAotCS5zZWN0aW9uCS5pZGF0YSQ3CSMgVG8gZm9yY2UgbG9hZGluZyBvZiBoZWFkCi0JLmxvbmcJX192ZXJzaW9uX2FfaGVhZAotIyBJbXBvcnQgQWRkcmVzcyBUYWJsZQotCS5zZWN0aW9uCS5pZGF0YSQ1Ci1fX2ltcF9HZXRGaWxlVmVyc2lvbkluZm9TaXplV0A4OgotCS5ydmEJSUQyCi0KLSMgSW1wb3J0IExvb2t1cCBUYWJsZQotCS5zZWN0aW9uCS5pZGF0YSQ0Ci0JLnJ2YQlJRDIKLSMgSGludC9OYW1lIHRhYmxlCi0JLnNlY3Rpb24JLmlkYXRhJDYKLUlEMjoJLnNob3J0CTIKLQkuYXNjaXoJIkdldEZpbGVWZXJzaW9uSW5mb1NpemVXIgotCi0KLUZvciB0aGUgUG93ZXJQQywgaGVyZSdzIHRoZSB2YXJpYXRpb24gb24gdGhlIGFib3ZlIHNjaGVtZToKLQotIyBSYXRoZXIgdGhhbiBhIHNpbXBsZSAiam1wICoiLCB0aGUgY29kZSB0byBnZXQgdG8gdGhlIGRsbCBmdW5jdGlvbgotIyBsb29rcyBsaWtlOgotICAgICAgICAgLnRleHQKLSAgICAgICAgIGx3eglyMTEsW3RvY3ZdX19pbXBfZnVuY3Rpb25fbmFtZShyMikKLSMJCSAgIFJFTE9DOiAwMDAwMDAwMCBUT0NSRUwxNixUT0NERUZOIF9faW1wX2Z1bmN0aW9uX25hbWUKLSAgICAgICAgIGx3eglyMTIsMChyMTEpCi0JIHN0dwlyMiw0KHIxKQotCSBtdGN0cglyMTIKLQkgbHd6CXIyLDQocjExKQotCSBiY3RyCi0qLwotCi1zdGF0aWMgY2hhciAqCi1tYWtlX2xhYmVsIChwcmVmaXgsIG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKnByZWZpeDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaW50IGxlbiA9IHN0cmxlbiAoQVNNX1BSRUZJWCkgKyBzdHJsZW4gKHByZWZpeCkgKyBzdHJsZW4gKG5hbWUpOwotICBjaGFyICpjb3B5ID0geG1hbGxvYyAobGVuICsxICk7Ci0gIHN0cmNweSAoY29weSwgQVNNX1BSRUZJWCk7Ci0gIHN0cmNhdCAoY29weSwgcHJlZml4KTsKLSAgc3RyY2F0IChjb3B5LCBuYW1lKTsKLSAgcmV0dXJuIGNvcHk7Ci19Ci0KLXN0YXRpYyBiZmQgKgotbWFrZV9vbmVfbGliX2ZpbGUgKGV4cCwgaSkKLSAgICAgZXhwb3J0X3R5cGUgKmV4cDsKLSAgICAgaW50IGk7Ci17Ci0jaWYgMAotICAgIHsKLSAgICAgIEZJTEUgKmY7Ci0gICAgICBjaGFyICpwcmVmaXg9ImQiOwotICAgICAgc3ByaW50ZiAob3V0ZmlsZSwgIiVzcyUwNWQucyIsIHByZWZpeCwgaSk7Ci0gICAgICBmID0gZm9wZW4gKG91dGZpbGUsIEZPUEVOX1dUKTsKLSAgICAgIGZwcmludGYgKGYsICJcdC50ZXh0XG4iKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzXHQlcyVzXG4iLCBBU01fR0xPQkFMLCBBU01fUFJFRklYLCBleHAtPm5hbWUpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdF9faW1wXyVzXG4iLCBBU01fR0xPQkFMLCBleHAtPm5hbWUpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdF9pbXBfXyVzXG4iLCBBU01fR0xPQkFMLCBleHAtPm5hbWUpOwotICAgICAgZnByaW50ZiAoZiwgIiVzJXM6XG5cdCVzXHRfX2ltcF8lc1xuIiwgQVNNX1BSRUZJWCwKLQkgICAgICAgZXhwLT5uYW1lLCBBU01fSlVNUCwgZXhwLT5uYW1lKTsKLQotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb25cdC5pZGF0YSQ3XHQlcyBUbyBmb3JjZSBsb2FkaW5nIG9mIGhlYWRcbiIsIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzXHQlc1xuIiwgQVNNX0xPTkcsIGhlYWRfbGFiZWwpOwotCi0KLSAgICAgIGZwcmludGYgKGYsIiVzIEltcG9ydCBBZGRyZXNzIFRhYmxlXG4iLCBBU01fQyk7Ci0KLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ1XG4iKTsKLSAgICAgIGZwcmludGYgKGYsICJfX2ltcF8lczpcbiIsIGV4cC0+bmFtZSk7Ci0gICAgICBmcHJpbnRmIChmLCAiX2ltcF9fJXM6XG4iLCBleHAtPm5hbWUpOwotCi0gICAgICBkdW1wX2lhdCAoZiwgZXhwKTsKLQotICAgICAgZnByaW50ZiAoZiwgIlxuJXMgSW1wb3J0IExvb2t1cCBUYWJsZVxuIiwgQVNNX0MpOwotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDRcbiIpOwotCi0gICAgICBkdW1wX2lhdCAoZiwgZXhwKTsKLQotICAgICAgaWYoIWV4cC0+bm9uYW1lIHx8IHNob3dfYWxsbmFtZXMpCi0JewotCSAgZnByaW50ZiAoZiwgIiVzIEhpbnQvTmFtZSB0YWJsZVxuIiwgQVNNX0MpOwotCSAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDZcbiIpOwotCSAgZnByaW50ZiAoZiwgIklEJWQ6XHQlc1x0JWRcbiIsIGV4cC0+b3JkaW5hbCwgQVNNX1NIT1JULCBleHAtPmhpbnQpOwotCSAgZnByaW50ZiAoZiwgIlx0JXNcdFwiJXNcIlxuIiwgQVNNX1RFWFQsIHhsYXRlIChleHAtPm5hbWUpKTsKLQl9Ci0KLSAgICAgIGZjbG9zZSAoZik7Ci0KLSAgICAgIHNwcmludGYgKG91dGZpbGUsICIlcyAtbyAlc3MlMDVkLm8gJXNzJWQucyIsCi0JICAgICAgIGFzX2ZsYWdzLCBwcmVmaXgsIGksIHByZWZpeCwgaSk7Ci0KLSNpZmRlZiBETExUT09MX0FSTQotICAgICAgaWYgKG1hY2hpbmUgPT0gTUFSTV9JTlRFUldPUksgfHwgbWFjaGluZSA9PSBNVEhVTUIpCi0Jc3RyY2F0IChvdXRmaWxlLCAiIC1tdGh1bWItaW50ZXJ3b3JrIik7Ci0jZW5kaWYKLSAgCi0gICAgICBydW4gKGFzX25hbWUsIG91dGZpbGUpOwotICAgIH0KLSNlbHNlIC8qIGlmIDAgKi8KLSAgICB7Ci0gICAgICBiZmQgKiAgICAgIGFiZmQ7Ci0gICAgICBhc3ltYm9sICogIGV4cF9sYWJlbDsKLSAgICAgIGFzeW1ib2wgKiAgaW5hbWU7Ci0gICAgICBhc3ltYm9sICogIGluYW1lMjsKLSAgICAgIGFzeW1ib2wgKiAgaW5hbWVfbGFiOwotICAgICAgYXN5bWJvbCAqKiBpbmFtZV9sYWJfcHA7Ci0gICAgICBhc3ltYm9sICoqIGluYW1lX3BwOwotI2lmZGVmIERMTFRPT0xfUFBDCi0gICAgICBhc3ltYm9sICoqIGZuX3BwOwotICAgICAgYXN5bWJvbCAqKiB0b2NfcHA7Ci0jZGVmaW5lIEVYVFJBCSAyCi0jZW5kaWYKLSNpZm5kZWYgRVhUUkEKLSNkZWZpbmUgRVhUUkEgICAgMAotI2VuZGlmCi0gICAgICBhc3ltYm9sICogIHB0cnNbTlNFQ1MgKyA0ICsgRVhUUkEgKyAxXTsKLQotICAgICAgY2hhciAqICAgICBvdXRuYW1lID0geG1hbGxvYyAoMTApOwotICAgICAgaW50ICAgICAgICBvaWR4ID0gMDsKLQotICAgICAgCi0gICAgICBzcHJpbnRmIChvdXRuYW1lLCAiJXMlMDVkLm8iLCBUTVBfU1RVQiwgaSk7Ci0gICAgICAKLSAgICAgIGFiZmQgPSBiZmRfb3BlbncgKG91dG5hbWUsIEhPV19CRkRfVEFSR0VUKTsKLSAgICAgIAotICAgICAgaWYgKCFhYmZkKQotCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JZmF0YWwgKF8oImJmZF9vcGVuIGZhaWxlZCBvcGVuIHN0dWIgZmlsZTogJXMiKSwgb3V0bmFtZSk7Ci0KLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBpbmZvcm0gKF8oIkNyZWF0aW5nIHN0dWIgZmlsZTogJXMiKSwgb3V0bmFtZSk7Ci0gICAgICAKLSAgICAgIGJmZF9zZXRfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KTsKLSAgICAgIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBIT1dfQkZEX0FSQ0gsIDApOwotCi0jaWZkZWYgRExMVE9PTF9BUk0KLSAgICAgIGlmIChtYWNoaW5lID09IE1BUk1fSU5URVJXT1JLIHx8IG1hY2hpbmUgPT0gTVRIVU1CKQotCWJmZF9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgRl9JTlRFUldPUkspOwotI2VuZGlmCi0gICAgICAKLSAgICAgIC8qIEZpcnN0IG1ha2Ugc3ltYm9scyBmb3IgdGhlIHNlY3Rpb25zICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgTlNFQ1M7IGkrKykKLQl7Ci0JICBzaW5mbyAqc2kgPSBzZWNkYXRhICsgaTsKLQkgIGlmIChzaS0+aWQgIT0gaSkKLQkgICAgYWJvcnQoKTsKLQkgIHNpLT5zZWMgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsIHNpLT5uYW1lKTsKLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwKLQkJCQkgc2ktPnNlYywKLQkJCQkgc2ktPmZsYWdzKTsKLQotCSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudChhYmZkLCBzaS0+c2VjLCBzaS0+YWxpZ24pOwotCSAgc2ktPnNlYy0+b3V0cHV0X3NlY3Rpb24gPSBzaS0+c2VjOwotCSAgc2ktPnN5bSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbChhYmZkKTsKLQkgIHNpLT5zeW0tPm5hbWUgPSBzaS0+c2VjLT5uYW1lOwotCSAgc2ktPnN5bS0+c2VjdGlvbiA9IHNpLT5zZWM7Ci0JICBzaS0+c3ltLT5mbGFncyA9IEJTRl9MT0NBTDsKLQkgIHNpLT5zeW0tPnZhbHVlID0gMDsKLQkgIHB0cnNbb2lkeF0gPSBzaS0+c3ltOwotCSAgc2ktPnN5bXBwID0gcHRycyArIG9pZHg7Ci0JICBzaS0+c2l6ZSA9IDA7Ci0JICBzaS0+ZGF0YSA9IE5VTEw7Ci0KLQkgIG9pZHgrKzsKLQl9Ci0KLSAgICAgIGlmICghIGV4cC0+ZGF0YSkKLQl7Ci0JICBleHBfbGFiZWwgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotCSAgZXhwX2xhYmVsLT5uYW1lID0gbWFrZV9sYWJlbCAoIiIsIGV4cC0+bmFtZSk7Ci0KLQkgIC8qIE9uIFBvd2VyUEMsIHRoZSBmdW5jdGlvbiBuYW1lIHBvaW50cyB0byBhIGRlc2NyaXB0b3IgaW4KLQkgICAgIHRoZSByZGF0YSBzZWN0aW9uLCB0aGUgZmlyc3QgZWxlbWVudCBvZiB3aGljaCBpcyBhCi0JICAgICBwb2ludGVyIHRvIHRoZSBjb2RlICguLmZ1bmN0aW9uX25hbWUpLCBhbmQgdGhlIHNlY29uZAotCSAgICAgcG9pbnRzIHRvIHRoZSAudG9jICovCi0jaWZkZWYgRExMVE9PTF9QUEMKLQkgIGlmIChtYWNoaW5lID09IE1QUEMpCi0JICAgIGV4cF9sYWJlbC0+c2VjdGlvbiA9IHNlY2RhdGFbUkRBVEFdLnNlYzsKLQkgIGVsc2UKLSNlbmRpZgotCSAgICBleHBfbGFiZWwtPnNlY3Rpb24gPSBzZWNkYXRhW1RFWFRdLnNlYzsKLQotCSAgZXhwX2xhYmVsLT5mbGFncyA9IEJTRl9HTE9CQUw7Ci0JICBleHBfbGFiZWwtPnZhbHVlID0gMDsKLQotI2lmZGVmIERMTFRPT0xfQVJNCi0JICBpZiAobWFjaGluZSA9PSBNVEhVTUIpCi0JICAgIGJmZF9jb2ZmX3NldF9zeW1ib2xfY2xhc3MgKGFiZmQsIGV4cF9sYWJlbCwgQ19USFVNQkVYVEZVTkMpOwotI2VuZGlmCi0JICBwdHJzW29pZHgrK10gPSBleHBfbGFiZWw7Ci0JfQotCi0gICAgICAvKiBHZW5lcmF0ZSBpbXAgc3ltYm9scyB3aXRoIG9uZSB1bmRlcnNjb3JlIGZvciBNaWNyb3NvZnQKLSAgICAgICAgIGNvbXBhdGliaWxpdHksIGFuZCB3aXRoIHR3byB1bmRlcnNjb3JlcyBmb3IgYmFja3dhcmQKLSAgICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgdmVyc2lvbnMgb2YgY3lnd2luLiAgKi8KLSAgICAgIGluYW1lID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpOwotICAgICAgaW5hbWUtPm5hbWUgPSBtYWtlX2xhYmVsICgiX19pbXBfIiwgZXhwLT5uYW1lKTsKLSAgICAgIGluYW1lLT5zZWN0aW9uID0gc2VjZGF0YVtJREFUQTVdLnNlYzsKLSAgICAgIGluYW1lLT5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gICAgICBpbmFtZS0+dmFsdWUgPSAwOwotCi0gICAgICBpbmFtZTIgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCk7Ci0gICAgICBpbmFtZTItPm5hbWUgPSBtYWtlX2xhYmVsICgiX2ltcF9fIiwgZXhwLT5uYW1lKTsKLSAgICAgIGluYW1lMi0+c2VjdGlvbiA9IHNlY2RhdGFbSURBVEE1XS5zZWM7Ci0gICAgICBpbmFtZTItPmZsYWdzID0gQlNGX0dMT0JBTDsKLSAgICAgIGluYW1lMi0+dmFsdWUgPSAwOwotCi0gICAgICBpbmFtZV9sYWIgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCk7Ci0KLSAgICAgIGluYW1lX2xhYi0+bmFtZSA9IGhlYWRfbGFiZWw7Ci0gICAgICBpbmFtZV9sYWItPnNlY3Rpb24gPSAoYXNlY3Rpb24gKikmYmZkX3VuZF9zZWN0aW9uOwotICAgICAgaW5hbWVfbGFiLT5mbGFncyA9IDA7Ci0gICAgICBpbmFtZV9sYWItPnZhbHVlID0gMDsKLQotCi0gICAgICBpbmFtZV9wcCA9IHB0cnMgKyBvaWR4OwotICAgICAgcHRyc1tvaWR4KytdID0gaW5hbWU7Ci0gICAgICBwdHJzW29pZHgrK10gPSBpbmFtZTI7Ci0KLSAgICAgIGluYW1lX2xhYl9wcCA9IHB0cnMgKyBvaWR4OwotICAgICAgcHRyc1tvaWR4KytdID0gaW5hbWVfbGFiOwotCi0jaWZkZWYgRExMVE9PTF9QUEMKLSAgICAgIC8qIFRoZSBzeW1ib2wgcmVmZXJpbmcgdG8gdGhlIGNvZGUgKC50ZXh0KSAqLwotICAgICAgewotCWFzeW1ib2wgKmZ1bmN0aW9uX25hbWU7Ci0KLQlmdW5jdGlvbl9uYW1lID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpOwotCWZ1bmN0aW9uX25hbWUtPm5hbWUgPSBtYWtlX2xhYmVsICgiLi4iLCBleHAtPm5hbWUpOwotCWZ1bmN0aW9uX25hbWUtPnNlY3Rpb24gPSBzZWNkYXRhW1RFWFRdLnNlYzsKLQlmdW5jdGlvbl9uYW1lLT5mbGFncyA9IEJTRl9HTE9CQUw7Ci0JZnVuY3Rpb25fbmFtZS0+dmFsdWUgPSAwOwotCi0JZm5fcHAgPSBwdHJzICsgb2lkeDsKLQlwdHJzW29pZHgrK10gPSBmdW5jdGlvbl9uYW1lOwotICAgICAgfQotCi0gICAgICAvKiBUaGUgLnRvYyBzeW1ib2wgKi8KLSAgICAgIHsKLQlhc3ltYm9sICp0b2Nfc3ltYm9sOyAgICAvKiBUaGUgLnRvYyBzeW1ib2wgKi8KLQotCXRvY19zeW1ib2wgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotCXRvY19zeW1ib2wtPm5hbWUgPSBtYWtlX2xhYmVsICgiLiIsICJ0b2MiKTsKLQl0b2Nfc3ltYm9sLT5zZWN0aW9uID0gKGFzZWN0aW9uICopJmJmZF91bmRfc2VjdGlvbjsKLQl0b2Nfc3ltYm9sLT5mbGFncyA9IEJTRl9HTE9CQUw7Ci0JdG9jX3N5bWJvbC0+dmFsdWUgPSAwOwotCi0JdG9jX3BwID0gcHRycyArIG9pZHg7Ci0JcHRyc1tvaWR4KytdID0gdG9jX3N5bWJvbDsKLSAgICAgIH0KLSNlbmRpZgotICAgICAgCi0gICAgICBwdHJzW29pZHhdID0gMDsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IE5TRUNTOyBpKyspCi0JewotCSAgc2luZm8gKnNpID0gc2VjZGF0YSArIGk7Ci0JICBhc2VjdGlvbiAqc2VjID0gc2ktPnNlYzsKLQkgIGFyZWxlbnQgKnJlbDsKLQkgIGFyZWxlbnQgKipycHA7Ci0KLQkgIHN3aXRjaCAoaSkKLQkgICAgewotCSAgICBjYXNlIFRFWFQ6Ci0JICAgICAgaWYgKCEgZXhwLT5kYXRhKQotCQl7Ci0JCSAgc2ktPnNpemUgPSBIT1dfSlRBQl9TSVpFOwotCQkgIHNpLT5kYXRhID0geG1hbGxvYyAoSE9XX0pUQUJfU0laRSk7Ci0JCSAgbWVtY3B5IChzaS0+ZGF0YSwgSE9XX0pUQUIsIEhPV19KVEFCX1NJWkUpOwotCi0JCSAgLyogYWRkIHRoZSByZWxvYyBpbnRvIGlkYXRhJDUgKi8KLQkJICByZWwgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkJICAKLQkJICBycHAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQgKikgKiAyKTsKLQkJICBycHBbMF0gPSByZWw7Ci0JCSAgcnBwWzFdID0gMDsKLQkJICAKLQkJICByZWwtPmFkZHJlc3MgPSBIT1dfSlRBQl9ST0ZGOwotCQkgIHJlbC0+YWRkZW5kID0gMDsKLQotCQkgIGlmIChtYWNoaW5lID09IE1QUEMpCi0JCSAgICB7Ci0JCSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsCi0JCQkJCQkJICBCRkRfUkVMT0NfMTZfR09UT0ZGKTsKLQkJICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGluYW1lX3BwOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DXzMyKTsKLQkJICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IHNlY2RhdGFbSURBVEE1XS5zeW1wcDsKLQkJICAgIH0KLQkJICBzZWMtPm9yZWxvY2F0aW9uID0gcnBwOwotCQkgIHNlYy0+cmVsb2NfY291bnQgPSAxOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSURBVEE0OgotCSAgICBjYXNlIElEQVRBNToKLQkgICAgICAvKiBBbiBpZGF0YSQ0IG9yIGlkYXRhJDUgaXMgb25lIHdvcmQgbG9uZywgYW5kIGhhcyBhbgotCQkgcnZhIHRvIGlkYXRhJDYgKi8KLQotCSAgICAgIHNpLT5kYXRhID0geG1hbGxvYyAoNCk7Ci0JICAgICAgc2ktPnNpemUgPSA0OwotCi0JICAgICAgaWYgKGV4cC0+bm9uYW1lKQotCQl7Ci0JCSAgc2ktPmRhdGFbMF0gPSBleHAtPm9yZGluYWwgOwotCQkgIHNpLT5kYXRhWzFdID0gZXhwLT5vcmRpbmFsID4+IDg7Ci0JCSAgc2ktPmRhdGFbMl0gPSBleHAtPm9yZGluYWwgPj4gMTY7Ci0JCSAgc2ktPmRhdGFbM10gPSAweDgwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc2VjLT5yZWxvY19jb3VudCA9IDE7Ci0JCSAgbWVtc2V0IChzaS0+ZGF0YSwgMCwgc2ktPnNpemUpOwotCQkgIHJlbCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCQkgIHJwcCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCAqKSAqIDIpOwotCQkgIHJwcFswXSA9IHJlbDsKLQkJICBycHBbMV0gPSAwOwotCQkgIHJlbC0+YWRkcmVzcyA9IDA7Ci0JCSAgcmVsLT5hZGRlbmQgPSAwOwotCQkgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ19SVkEpOwotCQkgIHJlbC0+c3ltX3B0cl9wdHIgPSBzZWNkYXRhW0lEQVRBNl0uc3ltcHA7Ci0JCSAgc2VjLT5vcmVsb2NhdGlvbiA9IHJwcDsKLQkJfQotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBJREFUQTY6Ci0JICAgICAgaWYgKCFleHAtPm5vbmFtZSkKLQkJewotCQkgIC8qIFRoaXMgdXNlZCB0byBhZGQgMSB0byBleHAtPmhpbnQuICBJIGRvbid0IGtub3cKLSAgICAgICAgICAgICAgICAgICAgIHdoeSBpdCBkaWQgdGhhdCwgYW5kIGl0IGRvZXMgbm90IG1hdGNoIHdoYXQgSSBzZWUKLSAgICAgICAgICAgICAgICAgICAgIGluIHByb2dyYW1zIGNvbXBpbGVkIHdpdGggdGhlIE1TIHRvb2xzLiAgKi8KLQkJICBpbnQgaWR4ID0gZXhwLT5oaW50OwotCQkgIHNpLT5zaXplID0gc3RybGVuICh4bGF0ZSAoZXhwLT5uYW1lKSkgKyAzOwotCQkgIHNpLT5kYXRhID0geG1hbGxvYyAoc2ktPnNpemUpOwotCQkgIHNpLT5kYXRhWzBdID0gaWR4ICYgMHhmZjsKLQkJICBzaS0+ZGF0YVsxXSA9IGlkeCA+PiA4OwotCQkgIHN0cmNweSAoc2ktPmRhdGEgKyAyLCB4bGF0ZSAoZXhwLT5uYW1lKSk7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJREFUQTc6Ci0JICAgICAgc2ktPnNpemUgPSA0OwotCSAgICAgIHNpLT5kYXRhID14bWFsbG9jKDQpOwotCSAgICAgIG1lbXNldCAoc2ktPmRhdGEsIDAsIHNpLT5zaXplKTsKLQkgICAgICByZWwgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkgICAgICBycHAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQgKikgKiAyKTsKLQkgICAgICBycHBbMF0gPSByZWw7Ci0JICAgICAgcmVsLT5hZGRyZXNzID0gMDsKLQkgICAgICByZWwtPmFkZGVuZCA9IDA7Ci0JICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DX1JWQSk7Ci0JICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGluYW1lX2xhYl9wcDsKLQkgICAgICBzZWMtPm9yZWxvY2F0aW9uID0gcnBwOwotCSAgICAgIHNlYy0+cmVsb2NfY291bnQgPSAxOwotCSAgICAgIGJyZWFrOwotCi0jaWZkZWYgRExMVE9PTF9QUEMKLQkgICAgY2FzZSBQREFUQToKLQkgICAgICB7Ci0JCS8qIFRoZSAucGRhdGEgc2VjdGlvbiBpcyA1IHdvcmRzIGxvbmcuICovCi0JCS8qIFRoaW5rIG9mIGl0IGFzOiAgICAgICAgICAgICAgICAgICAgICovCi0JCS8qIHN0cnVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCS8qIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCS8qICAgYmZkX3ZtYSBCZWdpbkFkZHJlc3MsICAgICBbMHgwMF0gICovCi0JCS8qICAgICAgICAgICBFbmRBZGRyZXNzLCAgICAgICBbMHgwNF0gICovCi0JCS8qCSAgICAgRXhjZXB0aW9uSGFuZGxlciwgWzB4MDhdICAqLwotCQkvKgkgICAgIEhhbmRsZXJEYXRhLCAgICAgIFsweDBjXSAgKi8KLQkJLyoJICAgICBQcm9sb2dFbmRBZGRyZXNzOyBbMHgxMF0gICovCi0JCS8qIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLQkJLyogU28gdGhpcyBwZGF0YSBzZWN0aW9uIHNldHVwcyB1cCB0aGlzIGFzIGEgZ2x1ZSBsaW5rYWdlIHRvCi0JCSAgIGEgZGxsIHJvdXRpbmUuIFRoZXJlIGFyZSBhIG51bWJlciBvZiBob3VzZSBrZWVwaW5nIHRoaW5ncwotCQkgICB3ZSBuZWVkIHRvIGRvOgotCi0JCSAgIDEuIEluIHRoZSBuYW1lIG9mIGdsdWUgdHJpY2tlcnksIHRoZSBBRERSMzIgcmVsb2NzIGZvciAwLAotCQkgICAgICA0LCBhbmQgMHgxMCBhcmUgc2V0IHRvIHBvaW50IHRvIHRoZSBzYW1lIHBsYWNlOgotCQkgICAgICAiLi5mdW5jdGlvbl9uYW1lIi4KLQkJICAgMi4gVGhlcmUgaXMgb25lIG1vcmUgcmVsb2MgbmVlZGVkIGluIHRoZSBwZGF0YSBzZWN0aW9uLgotCQkgICAgICBUaGUgYWN0dWFsIGdsdWUgaW5zdHJ1Y3Rpb24gdG8gcmVzdG9yZSB0aGUgdG9jIG9uCi0JCSAgICAgIHJldHVybiBpcyBzYXZlZCBhcyB0aGUgb2Zmc2V0IGluIGFuIElNR0xVRSByZWxvYy4KLQkJICAgICAgU28gd2UgbmVlZCBhIHRvdGFsIG9mIGZvdXIgcmVsb2NzIGZvciB0aGlzIHNlY3Rpb24uCi0KLQkJICAgMy4gTGFzdGx5LCB0aGUgSGFuZGxlckRhdGEgZmllbGQgaXMgc2V0IHRvIDB4MDMsIHRvIGluZGljYXRlCi0JCSAgICAgIHRoYXQgdGhpcyBpcyBhIGdsdWUgcm91dGluZS4KLQkJKi8KLQkJYXJlbGVudCAqaW1nbHVlLCAqYmFfcmVsLCAqZWFfcmVsLCAqcGVhX3JlbDsKLQotCQkvKiBhbGlnbm1lbnQgbXVzdCBiZSBzZXQgdG8gMioqMiBvciB5b3UgZ2V0IGV4dHJhIHN0dWZmICovCi0JCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoYWJmZCwgc2VjLCAyKTsKLQotCQlzaS0+c2l6ZSA9IDQgKiA1OwotCQlzaS0+ZGF0YSA9eG1hbGxvYyg0ICogNSk7Ci0JCW1lbXNldCAoc2ktPmRhdGEsIDAsIHNpLT5zaXplKTsKLQkJcnBwID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50ICopICogNSk7Ci0JCXJwcFswXSA9IGltZ2x1ZSAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkJcnBwWzFdID0gYmFfcmVsICA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCQlycHBbMl0gPSBlYV9yZWwgID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JCXJwcFszXSA9IHBlYV9yZWwgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkJcnBwWzRdID0gMDsKLQotCQkvKiBzdGljayB0aGUgdG9jIHJlbG9hZCBpbnN0cnVjdGlvbiBpbiB0aGUgZ2x1ZSByZWxvYyAqLwotCQliZmRfcHV0XzMyKGFiZmQsIHBwY19nbHVlX2luc24sIChjaGFyICopICZpbWdsdWUtPmFkZHJlc3MpOwotCi0JCWltZ2x1ZS0+YWRkZW5kID0gMDsKLQkJaW1nbHVlLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwKLQkJCQkJCSAgICAgICBCRkRfUkVMT0NfMzJfR09UT0ZGKTsKLQkJaW1nbHVlLT5zeW1fcHRyX3B0ciA9IGZuX3BwOwotCi0JCWJhX3JlbC0+YWRkcmVzcyA9IDA7Ci0JCWJhX3JlbC0+YWRkZW5kID0gMDsKLQkJYmFfcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DXzMyKTsKLQkJYmFfcmVsLT5zeW1fcHRyX3B0ciA9IGZuX3BwOwotCi0JCWJmZF9wdXRfMzIoYWJmZCwgMHgxOCwgc2ktPmRhdGEgKyAweDA0KTsKLQkJZWFfcmVsLT5hZGRyZXNzID0gNDsKLQkJZWFfcmVsLT5hZGRlbmQgPSAwOwotCQllYV9yZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfMzIpOwotCQllYV9yZWwtPnN5bV9wdHJfcHRyID0gZm5fcHA7Ci0KLQkJLyogbWFyayBpdCBhcyBnbHVlICovCi0JCWJmZF9wdXRfMzIoYWJmZCwgMHgwMywgc2ktPmRhdGEgKyAweDBjKTsKLQotCQkvKiBtYXJrIHRoZSBwcm9sb2cgZW5kIGFkZHJlc3MgKi8KLQkJYmZkX3B1dF8zMihhYmZkLCAweDBELCBzaS0+ZGF0YSArIDB4MTApOwotCQlwZWFfcmVsLT5hZGRyZXNzID0gMHgxMDsKLQkJcGVhX3JlbC0+YWRkZW5kID0gMDsKLQkJcGVhX3JlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ18zMik7Ci0JCXBlYV9yZWwtPnN5bV9wdHJfcHRyID0gZm5fcHA7Ci0KLQkJc2VjLT5vcmVsb2NhdGlvbiA9IHJwcDsKLQkJc2VjLT5yZWxvY19jb3VudCA9IDQ7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgY2FzZSBSREFUQToKLQkgICAgICAvKiBFYWNoIGV4dGVybmFsIGZ1bmN0aW9uIGluIGEgUG93ZXJQQyBQRSBmaWxlIGhhcyBhIHR3byB3b3JkCi0JCSBkZXNjcmlwdG9yIGNvbnNpc3Rpbmcgb2Y6Ci0JCSAxLiBUaGUgYWRkcmVzcyBvZiB0aGUgY29kZS4KLQkJIDIuIFRoZSBhZGRyZXNzIG9mIHRoZSBhcHByb3ByaWF0ZSAudG9jCi0JICAgICAgICAgV2UgdXNlIHJlbG9jcyB0byBidWlsZCB0aGlzLgotCSAgICAgICovCi0KLQkgICAgICBzaS0+c2l6ZSA9IDg7Ci0JICAgICAgc2ktPmRhdGEgPSB4bWFsbG9jICg4KTsKLQkgICAgICBtZW1zZXQgKHNpLT5kYXRhLCAwLCBzaS0+c2l6ZSk7Ci0KLQkgICAgICBycHAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQgKikgKiAzKTsKLQkgICAgICBycHBbMF0gPSByZWwgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkgICAgICBycHBbMV0gPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkgICAgICBycHBbMl0gPSAwOwotCi0JICAgICAgcmVsLT5hZGRyZXNzID0gMDsKLQkgICAgICByZWwtPmFkZGVuZCA9IDA7Ci0JICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DXzMyKTsKLQkgICAgICByZWwtPnN5bV9wdHJfcHRyID0gZm5fcHA7Ci0KLQkgICAgICByZWwgPSBycHBbMV07Ci0KLQkgICAgICByZWwtPmFkZHJlc3MgPSA0OwotCSAgICAgIHJlbC0+YWRkZW5kID0gMDsKLQkgICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfMzIpOwotCSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSB0b2NfcHA7Ci0KLQkgICAgICBzZWMtPm9yZWxvY2F0aW9uID0gcnBwOwotCSAgICAgIHNlYy0+cmVsb2NfY291bnQgPSAyOwotCSAgICAgIGJyZWFrOwotI2VuZGlmIC8qIERMTFRPT0xfUFBDICovCi0JICAgIH0KLQl9Ci0KLSAgICAgIHsKLQliZmRfdm1hIHZtYSA9IDA7Ci0JLyogU2l6ZSB1cCBhbGwgdGhlIHNlY3Rpb25zICovCi0JZm9yIChpID0gMDsgaSA8IE5TRUNTOyBpKyspCi0JICB7Ci0JICAgIHNpbmZvICpzaSA9IHNlY2RhdGEgKyBpOwotCi0JICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBzaS0+c2VjLCBzaS0+c2l6ZSk7Ci0JICAgIGJmZF9zZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNpLT5zZWMsIHZtYSk7Ci0KLS8qCSAgICB2bWEgKz0gc2ktPnNpemU7Ki8KLQkgIH0KLSAgICAgIH0KLSAgICAgIC8qIFdyaXRlIHRoZW0gb3V0ICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgTlNFQ1M7IGkrKykKLQl7Ci0JICBzaW5mbyAqc2kgPSBzZWNkYXRhICsgaTsKLQotCSAgaWYgKGkgPT0gSURBVEE1ICYmIG5vX2lkYXRhNSkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChpID09IElEQVRBNCAmJiBub19pZGF0YTQpCi0JICAgIGNvbnRpbnVlOwotCi0JICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNpLT5zZWMsCi0JCQkJICAgIHNpLT5kYXRhLCAwLAotCQkJCSAgICBzaS0+c2l6ZSk7Ci0JfQotCi0gICAgICBiZmRfc2V0X3N5bXRhYiAoYWJmZCwgcHRycywgb2lkeCk7Ci0gICAgICBiZmRfY2xvc2UgKGFiZmQpOwotICAgICAgYWJmZCA9IGJmZF9vcGVuciAob3V0bmFtZSwgSE9XX0JGRF9UQVJHRVQpOwotICAgICAgcmV0dXJuIGFiZmQ7Ci0gICAgfQotI2VuZGlmCi19Ci0KLXN0YXRpYyBiZmQgKgotbWFrZV9oZWFkICgpCi17Ci0gIEZJTEUgKiAgZiA9IGZvcGVuIChUTVBfSEVBRF9TLCBGT1BFTl9XVCk7Ci0KLSAgaWYgKGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmYXRhbCAoXygiZmFpbGVkIHRvIG9wZW4gdGVtcG9yYXJ5IGhlYWQgZmlsZTogJXMiKSwgVE1QX0hFQURfUyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIAotICBmcHJpbnRmIChmLCAiJXMgSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1JcbiIsIEFTTV9DKTsKLSAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDJcbiIpOwotCi0gIGZwcmludGYoZiwiXHQlc1x0JXNcbiIsIEFTTV9HTE9CQUwsaGVhZF9sYWJlbCk7Ci0KLSAgZnByaW50ZiAoZiwgIiVzOlxuIiwgaGVhZF9sYWJlbCk7Ci0KLSAgZnByaW50ZiAoZiwgIlx0JXNobmFtZSVzXHQlc1B0ciB0byBpbWFnZSBpbXBvcnQgYnkgbmFtZSBsaXN0XG4iLAotCSAgIEFTTV9SVkFfQkVGT1JFLCBBU01fUlZBX0FGVEVSLCBBU01fQyk7Ci0KLSAgZnByaW50ZiAoZiwgIlx0JXN0aGlzIHNob3VsZCBiZSB0aGUgdGltZXN0YW1wLCBidXQgTlQgc29tZXRpbWVzXG4iLCBBU01fQyk7Ci0gIGZwcmludGYgKGYsICJcdCVzZG9lc24ndCBsb2FkIERMTHMgd2hlbiB0aGlzIGlzIHNldC5cbiIsIEFTTV9DKTsKLSAgZnByaW50ZiAoZiwgIlx0JXNcdDBcdCVzIGxvYWRlZCB0aW1lXG4iLCBBU01fTE9ORywgQVNNX0MpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFx0JXMgRm9yd2FyZGVyIGNoYWluXG4iLCBBU01fTE9ORywgQVNNX0MpOwotICBmcHJpbnRmIChmLCAiXHQlc19fJXNfaW5hbWUlc1x0JXMgaW1wb3J0ZWQgZGxsJ3MgbmFtZVxuIiwKLQkgICBBU01fUlZBX0JFRk9SRSwKLQkgICBpbXBfbmFtZV9sYWIsCi0JICAgQVNNX1JWQV9BRlRFUiwKLQkgICBBU01fQyk7Ci0gIGZwcmludGYgKGYsICJcdCVzZnRodW5rJXNcdCVzIHBvaW50ZXIgdG8gZmlyc3R0aHVua1xuIiwKLQkgICBBU01fUlZBX0JFRk9SRSwKLQkgICBBU01fUlZBX0FGVEVSLCBBU01fQyk7Ci0KLSAgZnByaW50ZiAoZiwgIiVzU3R1ZmYgZm9yIGNvbXBhdGliaWxpdHlcbiIsIEFTTV9DKTsKLQotICBpZiAoIW5vX2lkYXRhNSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvblx0LmlkYXRhJDVcbiIpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKLSAgICAgIGZwcmludGYgKGYsICJmdGh1bms6XG4iKTsKLSAgICB9Ci0gIAotICBpZiAoIW5vX2lkYXRhNCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvblx0LmlkYXRhJDRcbiIpOwotCi0gICAgICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDRcbiIpOwotICAgICAgZnByaW50ZiAoZiwgImhuYW1lOlxuIik7Ci0gICAgfQotICAKLSAgZmNsb3NlIChmKTsKLQotICBzcHJpbnRmIChvdXRmaWxlLCAiJXMgLW8gJXMgJXMiLCBhc19mbGFncywgVE1QX0hFQURfTywgVE1QX0hFQURfUyk7Ci0gIAotI2lmZGVmIERMTFRPT0xfQVJNCi0gIGlmIChtYWNoaW5lID09IE1BUk1fSU5URVJXT1JLIHx8IG1hY2hpbmUgPT0gTVRIVU1CKQotICAgIHN0cmNhdCAob3V0ZmlsZSwgIiAtbXRodW1iLWludGVyd29yayIpOwotI2VuZGlmCi0gIAotICBydW4gKGFzX25hbWUsIG91dGZpbGUpOwotCi0gIHJldHVybiAgYmZkX29wZW5yIChUTVBfSEVBRF9PLCBIT1dfQkZEX1RBUkdFVCk7Ci19Ci0KLXN0YXRpYyBiZmQgKgotbWFrZV90YWlsICgpCi17Ci0gIEZJTEUgKiAgZiA9IGZvcGVuIChUTVBfVEFJTF9TLCBGT1BFTl9XVCk7Ci0KLSAgaWYgKGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmYXRhbCAoXygiZmFpbGVkIHRvIG9wZW4gdGVtcG9yYXJ5IHRhaWwgZmlsZTogJXMiKSwgVE1QX1RBSUxfUyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIAotICBpZiAoIW5vX2lkYXRhNCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkNFxuIik7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICAgIH0KLSAgCi0gIGlmICghbm9faWRhdGE1KQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ1XG4iKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gICAgfQotCi0jaWZkZWYgRExMVE9PTF9QUEMKLSAgLyogTm9ybWFsbHksIHdlIG5lZWQgdG8gc2VlIGEgbnVsbCBkZXNjcmlwdG9yIGJ1aWx0IGluIGlkYXRhJDMgdG8KLSAgICAgYWN0IGFzIHRoZSB0ZXJtaW5hdG9yIGZvciB0aGUgbGlzdC4gVGhlIGlkZWFsIHdheSwgSSBzdXBwb3NlLAotICAgICB3b3VsZCBiZSB0byBtYXJrIHRoaXMgc2VjdGlvbiBhcyBhIGNvbWRhdCB0eXBlIDIgc2VjdGlvbiwgc28KLSAgICAgb25seSBvbmUgd291bGQgYXBwZWFyIGluIHRoZSBmaW5hbCAuZXhlIChpZiBvdXIgbGlua2VyIHN1cHBvcnRlZAotICAgICBjb21kYXQsIHRoYXQgaXMpIG9yIGNhdXNlIGl0IHRvIGJlIGluc2VydGVkIGJ5IHNvbWV0aGluZyBlbHNlIChzYXkKLSAgICAgY3J0MCkKLSAgKi8KLQotICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkM1xuIik7Ci0gIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0jZW5kaWYKLQotI2lmZGVmIERMTFRPT0xfUFBDCi0gIC8qIE90aGVyIFBvd2VyUEMgTlQgY29tcGlsZXJzIHVzZSBpZGF0YSQ2IGZvciB0aGUgZGxsbmFtZSwgc28gSQotICAgICBkbyB0b28uIE9yaWdpbmFsLCBodWg/ICovCi0gIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ2XG4iKTsKLSNlbHNlCi0gIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ3XG4iKTsKLSNlbmRpZgotCi0gIGZwcmludGYgKGYsICJcdCVzXHRfXyVzX2luYW1lXG4iLCBBU01fR0xPQkFMLCBpbXBfbmFtZV9sYWIpOwotICBmcHJpbnRmIChmLCAiX18lc19pbmFtZTpcdCVzXHRcIiVzXCJcbiIsCi0JICAgaW1wX25hbWVfbGFiLCBBU01fVEVYVCwgZGxsX25hbWUpOwotCi0gIGZjbG9zZSAoZik7Ci0KLSAgc3ByaW50ZiAob3V0ZmlsZSwgIiVzIC1vICVzICVzIiwgYXNfZmxhZ3MsIFRNUF9UQUlMX08sIFRNUF9UQUlMX1MpOwotICAKLSNpZmRlZiBETExUT09MX0FSTQotICBpZiAobWFjaGluZSA9PSBNQVJNX0lOVEVSV09SSyB8fCBNVEhVTUIpCi0gICAgc3RyY2F0IChvdXRmaWxlLCAiIC1tdGh1bWItaW50ZXJ3b3JrIik7Ci0jZW5kaWYKLSAgCi0gIHJ1biAoYXNfbmFtZSwgb3V0ZmlsZSk7Ci0gIAotICByZXR1cm4gIGJmZF9vcGVuciAoVE1QX1RBSUxfTywgSE9XX0JGRF9UQVJHRVQpOwotfQotCi1zdGF0aWMgdm9pZAotZ2VuX2xpYl9maWxlICgpCi17Ci0gIGludCBpOwotICBleHBvcnRfdHlwZSAqZXhwOwotICBiZmQgKmFyX2hlYWQ7Ci0gIGJmZCAqYXJfdGFpbDsKLSAgYmZkICpvdXRhcmNoOwotICBiZmQgKiBoZWFkICA9IDA7Ci0KLSAgdW5saW5rIChpbXBfbmFtZSk7Ci0KLSAgb3V0YXJjaCA9IGJmZF9vcGVudyAoaW1wX25hbWUsIEhPV19CRkRfVEFSR0VUKTsKLQotICBpZiAoIW91dGFyY2gpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiQ2FuJ3Qgb3BlbiAubGliIGZpbGU6ICVzIiksIGltcF9uYW1lKTsKLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIkNyZWF0aW5nIGxpYnJhcnkgZmlsZTogJXNcbiIpLCBpbXBfbmFtZSk7Ci0gIAotICBiZmRfc2V0X2Zvcm1hdCAob3V0YXJjaCwgYmZkX2FyY2hpdmUpOwotICBvdXRhcmNoLT5oYXNfYXJtYXAgPSAxOwotCi0gIC8qIFdvcmsgb3V0IGEgcmVhc29uYWJsZSBzaXplIG9mIHRoaW5ncyB0byBwdXQgb250byBvbmUgbGluZS4gKi8KLQotICBhcl9oZWFkID0gbWFrZV9oZWFkICgpOwotICBhcl90YWlsID0gbWFrZV90YWlsKCk7Ci0KLSAgaWYgKGFyX2hlYWQgPT0gTlVMTCB8fCBhcl90YWlsID09IE5VTEwpCi0gICAgcmV0dXJuOwotICAKLSAgZm9yIChpID0gMDsgKGV4cCA9IGRfZXhwb3J0c19sZXhpY2FsbHlbaV0pOyBpKyspCi0gICAgewotICAgICAgYmZkICpuID0gbWFrZV9vbmVfbGliX2ZpbGUgKGV4cCwgaSk7Ci0gICAgICBuLT5uZXh0ID0gaGVhZDsKLSAgICAgIGhlYWQgPSBuOwotICAgIH0KLQotICAvKiBOb3cgc3RpY2sgdGhlbSBhbGwgaW50byB0aGUgYXJjaGl2ZSAqLwotCi0gIGFyX2hlYWQtPm5leHQgPSBoZWFkOwotICBhcl90YWlsLT5uZXh0ID0gYXJfaGVhZDsKLSAgaGVhZCA9IGFyX3RhaWw7Ci0KLSAgaWYgKCEgYmZkX3NldF9hcmNoaXZlX2hlYWQgKG91dGFyY2gsIGhlYWQpKQotICAgIGJmZF9mYXRhbCAoImJmZF9zZXRfYXJjaGl2ZV9oZWFkIik7Ci0gIAotICBpZiAoISBiZmRfY2xvc2UgKG91dGFyY2gpKQotICAgIGJmZF9mYXRhbCAoaW1wX25hbWUpOwotCi0gIHdoaWxlIChoZWFkICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkICpuID0gaGVhZC0+bmV4dDsKLSAgICAgIGJmZF9jbG9zZSAoaGVhZCk7Ci0gICAgICBoZWFkID0gbjsKLSAgICB9Ci0KLSAgLyogRGVsZXRlIGFsbCB0aGUgdGVtcCBmaWxlcyAqLwotCi0gIGlmIChkb250ZGVsdGVtcHMgPT0gMCkKLSAgICB7Ci0gICAgICB1bmxpbmsgKFRNUF9IRUFEX08pOwotICAgICAgdW5saW5rIChUTVBfSEVBRF9TKTsKLSAgICAgIHVubGluayAoVE1QX1RBSUxfTyk7Ci0gICAgICB1bmxpbmsgKFRNUF9UQUlMX1MpOwotICAgIH0KLQotICBpZiAoZG9udGRlbHRlbXBzIDwgMikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwLCBleHAgPSBkX2V4cG9ydHM7IGV4cDsgaSsrLCBleHAgPSBleHAtPm5leHQpCi0JewotCSAgc3ByaW50ZiAob3V0ZmlsZSwgIiVzJTA1ZC5vIiwgVE1QX1NUVUIsIGkpOwotCSAgaWYgKHVubGluayAob3V0ZmlsZSkgPCAwKQotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICB3YXJuIChfKCJjYW5ub3QgZGVsZXRlICVzOiAlc1xuIiksIG91dGZpbGUsIHN0cmVycm9yIChlcnJubykpOwotCX0KLSAgICB9Ci0gIAotICBpbmZvcm0gKF8oIkNyZWF0ZWQgbGliIGZpbGUiKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBSdW4gdGhyb3VnaCB0aGUgaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUgLm8gZmlsZXMgYW5kIHRoZQotICAgLmRlZiBmaWxlIGFuZCB3b3JrIG91dCB0aGUgYmVzdCBzdHVmZiAqLwotc3RhdGljIGludAotcGZ1bmMgKGEsIGIpCi0gICAgIGNvbnN0IHZvaWQgKmE7Ci0gICAgIGNvbnN0IHZvaWQgKmI7Ci17Ci0gIGV4cG9ydF90eXBlICphcCA9ICooZXhwb3J0X3R5cGUgKiopIGE7Ci0gIGV4cG9ydF90eXBlICpicCA9ICooZXhwb3J0X3R5cGUgKiopIGI7Ci0gIGlmIChhcC0+b3JkaW5hbCA9PSBicC0+b3JkaW5hbCkKLSAgICByZXR1cm4gMDsKLQotICAvKiB1bnNldCBvcmRpbmFscyBnbyB0byB0aGUgYm90dG9tICovCi0gIGlmIChhcC0+b3JkaW5hbCA9PSAtMSkKLSAgICByZXR1cm4gMTsKLSAgaWYgKGJwLT5vcmRpbmFsID09IC0xKQotICAgIHJldHVybiAtMTsKLSAgcmV0dXJuIChhcC0+b3JkaW5hbCAtIGJwLT5vcmRpbmFsKTsKLX0KLQotc3RhdGljIGludAotbmZ1bmMgKGEsIGIpCi0gICAgIGNvbnN0IHZvaWQgKmE7Ci0gICAgIGNvbnN0IHZvaWQgKmI7Ci17Ci0gIGV4cG9ydF90eXBlICphcCA9ICooZXhwb3J0X3R5cGUgKiopIGE7Ci0gIGV4cG9ydF90eXBlICpicCA9ICooZXhwb3J0X3R5cGUgKiopIGI7Ci0KLSAgcmV0dXJuIChzdHJjbXAgKGFwLT5uYW1lLCBicC0+bmFtZSkpOwotfQotCi1zdGF0aWMgdm9pZAotcmVtb3ZlX251bGxfbmFtZXMgKHB0cikKLSAgICAgZXhwb3J0X3R5cGUgKipwdHI7Ci17Ci0gIGludCBzcmM7Ci0gIGludCBkc3Q7Ci0gIGZvciAoZHN0ID0gc3JjID0gMDsgc3JjIDwgZF9uZnVuY3M7IHNyYysrKQotICAgIHsKLSAgICAgIGlmIChwdHJbc3JjXSkKLQl7Ci0JICBwdHJbZHN0XSA9IHB0cltzcmNdOwotCSAgZHN0Kys7Ci0JfQotICAgIH0KLSAgZF9uZnVuY3MgPSBkc3Q7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdGFiIChwdHIpCi0gICAgIGV4cG9ydF90eXBlICoqcHRyOwotewotI2lmZGVmIFNBQ0RFQlVHCi0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgZF9uZnVuY3M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocHRyW2ldKQotCXsKLQkgIHByaW50ZiAoIiVkICVzIEAgJWQgJXMlcyVzXG4iLAotCQkgIGksIHB0cltpXS0+bmFtZSwgcHRyW2ldLT5vcmRpbmFsLAotCQkgIHB0cltpXS0+bm9uYW1lID8gIk5PTkFNRSAiIDogIiIsCi0JCSAgcHRyW2ldLT5jb25zdGFudCA/ICJDT05TVEFOVCIgOiAiIiwKLQkJICBwdHJbaV0tPmRhdGEgPyAiREFUQSIgOiAiIik7Ci0JfQotICAgICAgZWxzZQotCXByaW50ZiAoImVtcHR5XG4iKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfZHVwbGljYXRlcyAoZF9leHBvcnRfdmVjKQotICAgICBleHBvcnRfdHlwZSAqKmRfZXhwb3J0X3ZlYzsKLXsKLSAgaW50IG1vcmUgPSAxOwotICBpbnQgaTsKLSAgd2hpbGUgKG1vcmUpCi0gICAgewotCi0gICAgICBtb3JlID0gMDsKLSAgICAgIC8qIFJlbW92ZSBkdXBsaWNhdGVzICovCi0gICAgICBxc29ydCAoZF9leHBvcnRfdmVjLCBkX25mdW5jcywgc2l6ZW9mIChleHBvcnRfdHlwZSAqKSwgbmZ1bmMpOwotCi0gICAgICBkdGFiIChkX2V4cG9ydF92ZWMpOwotICAgICAgZm9yIChpID0gMDsgaSA8IGRfbmZ1bmNzIC0gMTsgaSsrKQotCXsKLQkgIGlmIChzdHJjbXAgKGRfZXhwb3J0X3ZlY1tpXS0+bmFtZSwKLQkJICAgICAgZF9leHBvcnRfdmVjW2kgKyAxXS0+bmFtZSkgPT0gMCkKLQkgICAgewotCi0JICAgICAgZXhwb3J0X3R5cGUgKmEgPSBkX2V4cG9ydF92ZWNbaV07Ci0JICAgICAgZXhwb3J0X3R5cGUgKmIgPSBkX2V4cG9ydF92ZWNbaSArIDFdOwotCi0JICAgICAgbW9yZSA9IDE7Ci0JICAgICAgCi0JICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgICBpbmZvcm0gKF8oIldhcm5pbmcsIGlnbm9yaW5nIGR1cGxpY2F0ZSBFWFBPUlQgJXMgJWQsJWRcbiIpLAotCQkgICAgICBhLT5uYW1lLCBhLT5vcmRpbmFsLCBiLT5vcmRpbmFsKTsKLQkgICAgICAKLQkgICAgICBpZiAoYS0+b3JkaW5hbCAhPSAtMQotCQkgICYmIGItPm9yZGluYWwgIT0gLTEpCi0JCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCWZhdGFsIChfKCJFcnJvciwgZHVwbGljYXRlIEVYUE9SVCB3aXRoIG9yaWRpbmFsczogJXMiKSwKLQkJICAgICAgYS0+bmFtZSk7Ci0KLQkgICAgICAvKiBNZXJnZSBhdHRyaWJ1dGVzICovCi0JICAgICAgYi0+b3JkaW5hbCA9IGEtPm9yZGluYWwgPiAwID8gYS0+b3JkaW5hbCA6IGItPm9yZGluYWw7Ci0JICAgICAgYi0+Y29uc3RhbnQgfD0gYS0+Y29uc3RhbnQ7Ci0JICAgICAgYi0+bm9uYW1lIHw9IGEtPm5vbmFtZTsKLQkgICAgICBiLT5kYXRhIHw9IGEtPmRhdGE7Ci0JICAgICAgZF9leHBvcnRfdmVjW2ldID0gMDsKLQkgICAgfQotCi0JICBkdGFiIChkX2V4cG9ydF92ZWMpOwotCSAgcmVtb3ZlX251bGxfbmFtZXMgKGRfZXhwb3J0X3ZlYyk7Ci0JICBkdGFiIChkX2V4cG9ydF92ZWMpOwotCX0KLSAgICB9Ci0KLQotICAvKiBDb3VudCB0aGUgbmFtZXMgKi8KLSAgZm9yIChpID0gMDsgaSA8IGRfbmZ1bmNzOyBpKyspCi0gICAgewotICAgICAgaWYgKCFkX2V4cG9ydF92ZWNbaV0tPm5vbmFtZSkKLQlkX25hbWVkX25mdW5jcysrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWZpbGxfb3JkaW5hbHMgKGRfZXhwb3J0X3ZlYykKLSAgICAgZXhwb3J0X3R5cGUgKipkX2V4cG9ydF92ZWM7Ci17Ci0gIGludCBsb3dlc3QgPSAtMTsKLSAgaW50IGk7Ci0gIGNoYXIgKnB0cjsKLSAgaW50IHNpemUgPSA2NTUzNjsKLQotICBxc29ydCAoZF9leHBvcnRfdmVjLCBkX25mdW5jcywgc2l6ZW9mIChleHBvcnRfdHlwZSAqKSwgcGZ1bmMpOwotCi0gIC8qIGZpbGwgaW4gdGhlIHVuc2V0IG9yZGluYWxzIHdpdGggb25lcyBmcm9tIG91ciByYW5nZSAqLwotCi0gIHB0ciA9IChjaGFyICopIHhtYWxsb2MgKHNpemUpOwotCi0gIG1lbXNldCAocHRyLCAwLCBzaXplKTsKLQotICAvKiBNYXJrIGluIG91ciBsYXJnZSB2ZWN0b3IgYWxsIHRoZSBudW1iZXJzIHRoYXQgYXJlIHRha2VuICovCi0gIGZvciAoaSA9IDA7IGkgPCBkX25mdW5jczsgaSsrKQotICAgIHsKLSAgICAgIGlmIChkX2V4cG9ydF92ZWNbaV0tPm9yZGluYWwgIT0gLTEpCi0JewotCSAgcHRyW2RfZXhwb3J0X3ZlY1tpXS0+b3JkaW5hbF0gPSAxOwotCSAgaWYgKGxvd2VzdCA9PSAtMSB8fCBkX2V4cG9ydF92ZWNbaV0tPm9yZGluYWwgPCBsb3dlc3QpCi0JICAgIHsKLQkgICAgICBsb3dlc3QgPSBkX2V4cG9ydF92ZWNbaV0tPm9yZGluYWw7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFN0YXJ0IGF0IDEgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBNUyB0b29sY2hhaW4uICAqLwotICBpZiAobG93ZXN0ID09IC0xKQotICAgIGxvd2VzdCA9IDE7Ci0KLSAgLyogTm93IGZpbGwgaW4gb3JkaW5hbHMgd2hlcmUgdGhlIHVzZXIgd2FudHMgdXMgdG8gY2hvb3NlLiAqLwotICBmb3IgKGkgPSAwOyBpIDwgZF9uZnVuY3M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsID09IC0xKQotCXsKLQkgIHJlZ2lzdGVyIGludCBqOwotCi0JICAvKiBGaXJzdCB0cnkgd2l0aGluIG9yIGFmdGVyIGFueSB1c2VyIHN1cHBsaWVkIHJhbmdlLiAqLwotCSAgZm9yIChqID0gbG93ZXN0OyBqIDwgc2l6ZTsgaisrKQotCSAgICBpZiAocHRyW2pdID09IDApCi0JICAgICAgewotCQlwdHJbal0gPSAxOwotCQlkX2V4cG9ydF92ZWNbaV0tPm9yZGluYWwgPSBqOwotCQlnb3RvIGRvbmU7Ci0JICAgICAgfQotCi0JICAvKiBUaGVuIHRyeSBiZWZvcmUgdGhlIHJhbmdlLiAqLwotCSAgZm9yIChqID0gbG93ZXN0OyBqID4wOyBqLS0pCi0JICAgIGlmIChwdHJbal0gPT0gMCkKLQkgICAgICB7Ci0JCXB0cltqXSA9IDE7Ci0JCWRfZXhwb3J0X3ZlY1tpXS0+b3JkaW5hbCA9IGo7Ci0JCWdvdG8gZG9uZTsKLQkgICAgICB9Ci0JZG9uZTo7Ci0JfQotICAgIH0KLQotICBmcmVlIChwdHIpOwotCi0gIC8qIEFuZCByZXNvcnQgKi8KLQotICBxc29ydCAoZF9leHBvcnRfdmVjLCBkX25mdW5jcywgc2l6ZW9mIChleHBvcnRfdHlwZSAqKSwgcGZ1bmMpOwotCi0gIC8qIFdvcmsgb3V0IHRoZSBsb3dlc3QgYW5kIGhpZ2hlc3Qgb3JkaW5hbCBudW1iZXJzLiAgKi8KLSAgaWYgKGRfbmZ1bmNzKQotICAgIHsKLSAgICAgIGlmIChkX2V4cG9ydF92ZWNbMF0pCi0JZF9sb3dfb3JkID0gZF9leHBvcnRfdmVjWzBdLT5vcmRpbmFsOwotICAgICAgaWYgKGRfZXhwb3J0X3ZlY1tkX25mdW5jcy0xXSkKLQlkX2hpZ2hfb3JkID0gZF9leHBvcnRfdmVjW2RfbmZ1bmNzLTFdLT5vcmRpbmFsOwotICAgIH0KLX0KLQotc3RhdGljIGludAotYWxwaGFmdW5jIChhdixidikKLSAgICAgY29uc3Qgdm9pZCAqYXY7Ci0gICAgIGNvbnN0IHZvaWQgKmJ2OwotewotICBjb25zdCBleHBvcnRfdHlwZSAqKmEgPSAoY29uc3QgZXhwb3J0X3R5cGUgKiopIGF2OwotICBjb25zdCBleHBvcnRfdHlwZSAqKmIgPSAoY29uc3QgZXhwb3J0X3R5cGUgKiopIGJ2OwotCi0gIHJldHVybiBzdHJjbXAgKCgqYSktPm5hbWUsICgqYiktPm5hbWUpOwotfQotCi1zdGF0aWMgdm9pZAotbWFuZ2xlX2RlZnMgKCkKLXsKLSAgLyogRmlyc3Qgd29yayBvdXQgdGhlIG1pbmltdW0gb3JkaW5hbCBjaG9zZW4gKi8KLQotICBleHBvcnRfdHlwZSAqZXhwOwotCi0gIGludCBpOwotICBpbnQgaGludCA9IDA7Ci0gIGV4cG9ydF90eXBlICoqZF9leHBvcnRfdmVjCi0gID0gKGV4cG9ydF90eXBlICoqKSB4bWFsbG9jIChzaXplb2YgKGV4cG9ydF90eXBlICopICogZF9uZnVuY3MpOwotCi0gIGluZm9ybSAoXygiUHJvY2Vzc2luZyBkZWZpbml0aW9ucyIpKTsKLSAgCi0gIGZvciAoaSA9IDAsIGV4cCA9IGRfZXhwb3J0czsgZXhwOyBpKyssIGV4cCA9IGV4cC0+bmV4dCkKLSAgICB7Ci0gICAgICBkX2V4cG9ydF92ZWNbaV0gPSBleHA7Ci0gICAgfQotCi0gIHByb2Nlc3NfZHVwbGljYXRlcyAoZF9leHBvcnRfdmVjKTsKLSAgZmlsbF9vcmRpbmFscyAoZF9leHBvcnRfdmVjKTsKLQotICAvKiBQdXQgYmFjayB0aGUgbGlzdCBpbiB0aGUgbmV3IG9yZGVyICovCi0gIGRfZXhwb3J0cyA9IDA7Ci0gIGZvciAoaSA9IGRfbmZ1bmNzIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgZF9leHBvcnRfdmVjW2ldLT5uZXh0ID0gZF9leHBvcnRzOwotICAgICAgZF9leHBvcnRzID0gZF9leHBvcnRfdmVjW2ldOwotICAgIH0KLQotICAvKiBCdWlsZCBsaXN0IGluIGFscGhhIG9yZGVyICovCi0gIGRfZXhwb3J0c19sZXhpY2FsbHkgPSAoZXhwb3J0X3R5cGUgKiopCi0gICAgeG1hbGxvYyAoc2l6ZW9mIChleHBvcnRfdHlwZSAqKSAqIChkX25mdW5jcyArIDEpKTsKLQotICBmb3IgKGkgPSAwLCBleHAgPSBkX2V4cG9ydHM7IGV4cDsgaSsrLCBleHAgPSBleHAtPm5leHQpCi0gICAgewotICAgICAgZF9leHBvcnRzX2xleGljYWxseVtpXSA9IGV4cDsKLSAgICB9Ci0gIGRfZXhwb3J0c19sZXhpY2FsbHlbaV0gPSAwOwotCi0gIHFzb3J0IChkX2V4cG9ydHNfbGV4aWNhbGx5LCBpLCBzaXplb2YgKGV4cG9ydF90eXBlICopLCBhbHBoYWZ1bmMpOwotCi0gIC8qIEZpbGwgZXhwIGVudHJpZXMgd2l0aCB0aGVpciBoaW50IHZhbHVlcyAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCBkX25mdW5jczsgaSsrKQotICAgIHsKLSAgICAgIGlmICghZF9leHBvcnRzX2xleGljYWxseVtpXS0+bm9uYW1lIHx8IHNob3dfYWxsbmFtZXMpCi0JZF9leHBvcnRzX2xleGljYWxseVtpXS0+aGludCA9IGhpbnQrKzsKLSAgICB9Ci0gIAotICBpbmZvcm0gKF8oIlByb2Nlc3NlZCBkZWZpbml0aW9ucyIpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi11c2FnZSAoZmlsZSwgc3RhdHVzKQotICAgICBGSUxFICpmaWxlOwotICAgICBpbnQgc3RhdHVzOwotewotICAvKiB4Z2V0ZXh0OmMtZm9ybWF0ICovCi0gIGZwcmludGYgKGZpbGUsIF8oIlVzYWdlICVzIDxvcHRpb25zPiA8b2JqZWN0LWZpbGVzPlxuIiksIHByb2dyYW1fbmFtZSk7Ci0gIC8qIHhnZXRleHQ6Yy1mb3JtYXQgKi8KLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLW0gLS1tYWNoaW5lIDxtYWNoaW5lPiAgICBDcmVhdGUgYXMgRExMIGZvciA8bWFjaGluZT4uICBbZGVmYXVsdDogJXNdXG4iKSwgbW5hbWUpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAgICAgIHBvc3NpYmxlIDxtYWNoaW5lPjogYXJtW19pbnRlcndvcmtdLCBpMzg2LCBtY29yZVstZWxmXVstbGVdLCBwcGMsIHRodW1iXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1lIC0tb3V0cHV0LWV4cCA8b3V0bmFtZT4gR2VuZXJhdGUgYW4gZXhwb3J0IGZpbGUuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1sIC0tb3V0cHV0LWxpYiA8b3V0bmFtZT4gR2VuZXJhdGUgYW4gaW50ZXJmYWNlIGxpYnJhcnkuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1hIC0tYWRkLWluZGlyZWN0ICAgICAgICAgQWRkIGRsbCBpbmRpcmVjdHMgdG8gZXhwb3J0IGZpbGUuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1EIC0tZGxsbmFtZSA8bmFtZT4gICAgICAgTmFtZSBvZiBpbnB1dCBkbGwgdG8gcHV0IGludG8gaW50ZXJmYWNlIGxpYi5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLWQgLS1pbnB1dC1kZWYgPGRlZmZpbGU+ICBOYW1lIG9mIC5kZWYgZmlsZSB0byBiZSByZWFkIGluLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAteiAtLW91dHB1dC1kZWYgPGRlZmZpbGU+IE5hbWUgb2YgLmRlZiBmaWxlIHRvIGJlIGNyZWF0ZWQuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgICAgIC0tZXhwb3J0LWFsbC1zeW1ib2xzICAgRXhwb3J0IGFsbCBzeW1ib2xzIHRvIC5kZWZcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgICAgLS1uby1leHBvcnQtYWxsLXN5bWJvbHMgIE9ubHkgZXhwb3J0IGxpc3RlZCBzeW1ib2xzXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgICAgIC0tZXhjbHVkZS1zeW1ib2xzIDxsaXN0PiBEb24ndCBleHBvcnQgPGxpc3Q+XG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgICAgIC0tbm8tZGVmYXVsdC1leGNsdWRlcyAgQ2xlYXIgZGVmYXVsdCBleGNsdWRlIHN5bWJvbHNcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLWIgLS1iYXNlLWZpbGUgPGJhc2VmaWxlPiBSZWFkIGxpbmtlciBnZW5lcmF0ZWQgYmFzZSBmaWxlLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAteCAtLW5vLWlkYXRhNCAgICAgICAgICAgIERvbid0IGdlbmVyYXRlIGlkYXRhJDQgc2VjdGlvbi5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLWMgLS1uby1pZGF0YTUgICAgICAgICAgICBEb24ndCBnZW5lcmF0ZSBpZGF0YSQ1IHNlY3Rpb24uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1VIC0tYWRkLXVuZGVyc2NvcmUgICAgICAgQWRkIHVuZGVyc2NvcmVzIHRvIHN5bWJvbHMgaW4gaW50ZXJmYWNlIGxpYnJhcnkuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1rIC0ta2lsbC1hdCAgICAgICAgICAgICAgS2lsbCBAPG4+IGZyb20gZXhwb3J0ZWQgbmFtZXMuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1BIC0tYWRkLXN0ZGNhbGwtYWxpYXMgICAgQWRkIGFsaWFzZXMgd2l0aG91dCBAPG4+LlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtUyAtLWFzIDxuYW1lPiAgICAgICAgICAgIFVzZSA8bmFtZT4gZm9yIGFzc2VtYmxlci5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLWYgLS1hcy1mbGFncyA8ZmxhZ3M+ICAgICBQYXNzIDxmbGFncz4gdG8gdGhlIGFzc2VtYmxlci5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLW4gLS1uby1kZWxldGUgICAgICAgICAgICBLZWVwIHRlbXAgZmlsZXMgKHJlcGVhdCBmb3IgZXh0cmEgcHJlc2VydmF0aW9uKS5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLXYgLS12ZXJib3NlICAgICAgICAgICAgICBCZSB2ZXJib3NlLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtViAtLXZlcnNpb24gICAgICAgICAgICAgIERpc3BsYXkgdGhlIHByb2dyYW0gdmVyc2lvbi5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLWggLS1oZWxwICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaW5mb3JtYXRpb24uXG4iKSk7Ci0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLU0gLS1tY29yZS1lbGYgPG91dG5hbWU+ICBQcm9jZXNzIG1jb3JlLWVsZiBvYmplY3QgZmlsZXMgaW50byA8b3V0bmFtZT4uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1MIC0tbGlua2VyIDxuYW1lPiAgICAgICAgVXNlIDxuYW1lPiBhcyB0aGUgbGlua2VyLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtRiAtLWxpbmtlci1mbGFncyA8ZmxhZ3M+IFBhc3MgPGZsYWdzPiB0byB0aGUgbGlua2VyLlxuIikpOwotI2VuZGlmCi0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLSNkZWZpbmUgT1BUSU9OX0VYUE9SVF9BTExfU1lNUwkJMTUwCi0jZGVmaW5lIE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVMJKE9QVElPTl9FWFBPUlRfQUxMX1NZTVMgKyAxKQotI2RlZmluZSBPUFRJT05fRVhDTFVERV9TWU1TCQkoT1BUSU9OX05PX0VYUE9SVF9BTExfU1lNUyArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19ERUZBVUxUX0VYQ0xVREVTCShPUFRJT05fRVhDTFVERV9TWU1TICsgMSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotewotICB7Im5vLWRlbGV0ZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnbid9LAotICB7ImRsbG5hbWUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0QnfSwKLSAgeyJuby1pZGF0YTQiLCBub19hcmd1bWVudCwgTlVMTCwgJ3gnfSwKLSAgeyJuby1pZGF0YTUiLCBub19hcmd1bWVudCwgTlVMTCwgJ2MnfSwKLSAgeyJvdXRwdXQtZXhwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdlJ30sCi0gIHsib3V0cHV0LWRlZiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAneid9LAotICB7ImV4cG9ydC1hbGwtc3ltYm9scyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhQT1JUX0FMTF9TWU1TfSwKLSAgeyJuby1leHBvcnQtYWxsLXN5bWJvbHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0VYUE9SVF9BTExfU1lNU30sCi0gIHsiZXhjbHVkZS1zeW1ib2xzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWENMVURFX1NZTVN9LAotICB7Im5vLWRlZmF1bHQtZXhjbHVkZXMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0RFRkFVTFRfRVhDTFVERVN9LAotICB7Im91dHB1dC1saWIiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2wnfSwKLSAgeyJkZWYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2QnfSwgLyogZm9yIGNvbXBhdGlibGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zICovCi0gIHsiaW5wdXQtZGVmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdkJ30sCi0gIHsiYWRkLXVuZGVyc2NvcmUiLCBub19hcmd1bWVudCwgTlVMTCwgJ1UnfSwKLSAgeyJraWxsLWF0Iiwgbm9fYXJndW1lbnQsIE5VTEwsICdrJ30sCi0gIHsiYWRkLXN0ZGNhbGwtYWxpYXMiLCBub19hcmd1bWVudCwgTlVMTCwgJ0EnfSwKLSAgeyJ2ZXJib3NlIiwgbm9fYXJndW1lbnQsIE5VTEwsICd2J30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVid9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKLSAgeyJtYWNoaW5lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdtJ30sCi0gIHsiYWRkLWluZGlyZWN0Iiwgbm9fYXJndW1lbnQsIE5VTEwsICdhJ30sCi0gIHsiYmFzZS1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdiJ30sCi0gIHsiYXMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1MnfSwKLSAgeyJhcy1mbGFncyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZid9LAotICB7Im1jb3JlLWVsZiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnTSd9LAotICB7MH0KLX07Ci0KLWludAotbWFpbiAoYWMsIGF2KQotICAgICBpbnQgYWM7Ci0gICAgIGNoYXIgKiphdjsKLXsKLSAgaW50IGM7Ci0gIGludCBpOwotICBjaGFyICpmaXJzdGFyZyA9IDA7Ci0gIHByb2dyYW1fbmFtZSA9IGF2WzBdOwotICBvYXYgPSBhdjsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhYywgYXYsCi0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYJCQkgICAKLQkJCSAgICJtOmU6bDphRDpkOno6Yjp4Y3VVa0FTOmY6bnZWaE06TDpGOiIsCi0jZWxzZQotCQkJICAgIm06ZTpsOmFEOmQ6ejpiOnhjdVVrQVM6ZjpudlZoIiwKLSNlbmRpZgotCQkJICAgbG9uZ19vcHRpb25zLCAwKSkKLQkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSBPUFRJT05fRVhQT1JUX0FMTF9TWU1TOgotCSAgZXhwb3J0X2FsbF9zeW1ib2xzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0VYUE9SVF9BTExfU1lNUzoKLQkgIGV4cG9ydF9hbGxfc3ltYm9scyA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRVhDTFVERV9TWU1TOgotCSAgYWRkX2V4Y2x1ZGVzIChvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9fREVGQVVMVF9FWENMVURFUzoKLQkgIGRvX2RlZmF1bHRfZXhjbHVkZXMgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgbm9faWRhdGE0ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2MnOgotCSAgbm9faWRhdGE1ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotCSAgYXNfbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ2YnOgotCSAgYXNfZmxhZ3MgPSBvcHRhcmc7Ci0JICBicmVhazsKLQotCSAgLyogaWdub3JlZCBmb3IgY29tcGF0aWJpbGl0eSAqLwotCWNhc2UgJ3UnOgotCSAgYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JICBhZGRfaW5kaXJlY3QgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAneic6Ci0JICBvdXRwdXRfZGVmID0gZm9wZW4gKG9wdGFyZywgRk9QRU5fV1QpOwotCSAgYnJlYWs7Ci0JY2FzZSAnRCc6Ci0JICBkbGxfbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgaW1wX25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdlJzoKLQkgIGV4cF9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ20nOgotCSAgbW5hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIHZlcmJvc2UgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnVic6Ci0JICBwcmludF92ZXJzaW9uIChwcm9ncmFtX25hbWUpOwotCSAgYnJlYWs7Ci0JY2FzZSAnVSc6Ci0JICBhZGRfdW5kZXJzY29yZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdrJzoKLQkgIGtpbGxhdCA9IDE7Ci0JICBicmVhazsKLQljYXNlICdBJzoKLQkgIGFkZF9zdGRjYWxsX2FsaWFzID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgZGVmX2ZpbGUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICduJzoKLQkgIGRvbnRkZWx0ZW1wcysrOwotCSAgYnJlYWs7Ci0JY2FzZSAnYic6Ci0JICBiYXNlX2ZpbGUgPSBmb3BlbiAob3B0YXJnLCBGT1BFTl9SQik7Ci0JICAKLQkgIGlmICghYmFzZV9maWxlKQotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICBmYXRhbCAoXygiVW5hYmxlIHRvIG9wZW4gYmFzZS1maWxlOiAlcyIpLCBvcHRhcmcpOwotCi0JICBicmVhazsKLSNpZmRlZiBETExUT09MX01DT1JFX0VMRgotCWNhc2UgJ00nOgotCSAgbWNvcmVfZWxmX291dF9maWxlID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnTCc6Ci0JICBtY29yZV9lbGZfbGlua2VyID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnRic6Ci0JICBtY29yZV9lbGZfbGlua2VyX2ZsYWdzID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IG10YWJsZVtpXS50eXBlOyBpKyspCi0gICAgICBpZiAoc3RyY21wIChtdGFibGVbaV0udHlwZSwgbW5hbWUpID09IDApCi0JYnJlYWs7Ci0KLSAgaWYgKCFtdGFibGVbaV0udHlwZSkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGZhdGFsIChfKCJNYWNoaW5lICclcycgbm90IHN1cHBvcnRlZCIpLCBtbmFtZSk7Ci0KLSAgbWFjaGluZSA9IGk7Ci0KLSAgaWYgKCFkbGxfbmFtZSAmJiBleHBfbmFtZSkKLSAgICB7Ci0gICAgICBpbnQgbGVuID0gc3RybGVuIChleHBfbmFtZSkgKyA1OwotICAgICAgZGxsX25hbWUgPSB4bWFsbG9jIChsZW4pOwotICAgICAgc3RyY3B5IChkbGxfbmFtZSwgZXhwX25hbWUpOwotICAgICAgc3RyY2F0IChkbGxfbmFtZSwgIi5kbGwiKTsKLSAgICB9Ci0KLSAgaWYgKGFzX25hbWUgPT0gTlVMTCkKLSAgICBhc19uYW1lID0gZGVkdWNlX25hbWUgKCJhcyIpOwotICAKLSAgLyogRG9uJ3QgdXNlIHRoZSBkZWZhdWx0IGV4Y2x1ZGUgbGlzdCBpZiB3ZSdyZSByZWFkaW5nIG9ubHkgdGhlCi0gICAgIHN5bWJvbHMgaW4gdGhlIC5kcmVjdHZlIHNlY3Rpb24uICBUaGUgZGVmYXVsdCBleGNsdWRlcyBhcmUgbWVhbnQKLSAgICAgdG8gYXZvaWQgZXhwb3J0aW5nIERMTCBlbnRyeSBwb2ludCBhbmQgQ3lnd2luMzIgaW1wdXJlX3B0ci4gICovCi0gIGlmICghIGV4cG9ydF9hbGxfc3ltYm9scykKLSAgICBkb19kZWZhdWx0X2V4Y2x1ZGVzID0gZmFsc2U7Ci0gIAotICBpZiAoZG9fZGVmYXVsdF9leGNsdWRlcykKLSAgICBzZXRfZGVmYXVsdF9leGNsdWRlcyAoKTsKLQotICBpZiAoZGVmX2ZpbGUpCi0gICAgcHJvY2Vzc19kZWZfZmlsZSAoZGVmX2ZpbGUpOwotCi0gIHdoaWxlIChvcHRpbmQgPCBhYykKLSAgICB7Ci0gICAgICBpZiAoIWZpcnN0YXJnKQotCWZpcnN0YXJnID0gYXZbb3B0aW5kXTsKLSAgICAgIHNjYW5fb2JqX2ZpbGUgKGF2W29wdGluZF0pOwotICAgICAgb3B0aW5kKys7Ci0gICAgfQotCi0gIG1hbmdsZV9kZWZzICgpOwotCi0gIGlmIChleHBfbmFtZSkKLSAgICBnZW5fZXhwX2ZpbGUgKCk7Ci0gIAotICBpZiAoaW1wX25hbWUpCi0gICAgewotICAgICAgLyogTWFrZSBpbXBfbmFtZSBzYWZlIGZvciB1c2UgYXMgYSBsYWJlbC4gKi8KLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIGltcF9uYW1lX2xhYiA9IHhzdHJkdXAgKGltcF9uYW1lKTsKLSAgICAgIGZvciAocCA9IGltcF9uYW1lX2xhYjsgKnA7IHArKykKLQl7Ci0JICBpZiAoIWlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSAqcCkgJiYgIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcCkpCi0JICAgICpwID0gJ18nOwotCX0KLSAgICAgIGhlYWRfbGFiZWwgPSBtYWtlX2xhYmVsKCJfaGVhZF8iLCBpbXBfbmFtZV9sYWIpOwotICAgICAgZ2VuX2xpYl9maWxlICgpOwotICAgIH0KLSAgCi0gIGlmIChvdXRwdXRfZGVmKQotICAgIGdlbl9kZWZfZmlsZSAoKTsKLQotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi0gIGlmIChtY29yZV9lbGZfb3V0X2ZpbGUpCi0gICAgbWNvcmVfZWxmX2dlbl9vdXRfZmlsZSAoKTsKLSNlbmRpZgotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB3ZSBhcmUgd2FudCB0byBpbnZva2UuCi0gICBQUk9HX05BTUUgaXMgdGhlIGJhc2ljIG5hbWUgb2YgdGhlIHByb2dyYW0gd2Ugd2FudCB0byBydW4sCi0gICBlZyAiYXMiIG9yICJsZCIuICBUaGUgY2F0Y2ggaXMgdGhhdCB3ZSBtaWdodCB3YW50IGFjdHVhbGx5Ci0gICBydW4gImkzODYtcGUtYXMiIG9yICJwcGMtcGUtbGQiLiAgV2UgZGV0ZWN0IHRoaXMgY2FzZSBieQotICAgZXhhbWluaW5nIHRoZSBuYW1lIHVzZWQgdG8gaW52b2tlIGRsbHRvb2wgaXRzZWxmLiAgSWYKLSAgIGRsbHRvb2wgaXMgYWN0dWFsbHkgY2FsbGVkIDxmb28+LTxiYXI+LWRsbHRvb2wgdGhlbiB3ZQotICAgcHJlcGVuZCA8Zm9vPi08YmFyPiB0byB0aGUgZGVmYXVsdCBuYW1lLiAgKi8KLXN0YXRpYyBjaGFyICoKLWRlZHVjZV9uYW1lIChjaGFyICogcHJvZ19uYW1lKQotewotICAvKiBVc2Ugb3VyIG93biBzdGF0aWMgYXJyYXkgdG8gaG9sZCB0aGUgY29uc3RydWN0ZWQgbmFtZQotICAgICByYXRoZXIgdGhhbiB0aGUgb3V0ZmlsZVtdIGFycmF5LCBhcyB0aGF0IGFycmF5IG1heQotICAgICBhbHJlYWR5IGJlIGluIHVzZS4gICovCi0gIHN0YXRpYyBjaGFyIG5ld19uYW1lWzMyXTsKLSAgY2hhciAqIHA7Ci0KLSAgcCA9IHN0cnJjaHIgKHByb2dyYW1fbmFtZSwgJy0nKTsKLSAgCi0gIGlmIChwID09IE5VTEwpCi0gICAgcmV0dXJuIHByb2dfbmFtZTsKLQotICAvKiBhc3NlcnQgKHN0cmxlbiAocHJvZ3JhbV9uYW1lKSA8IDMyKTsgKi8KLSAgCi0gIHN0cmNweSAobmV3X25hbWUsIHByb2dyYW1fbmFtZSk7Ci0gIAotICBuZXdfbmFtZSBbKHAgLSBwcm9ncmFtX25hbWUpICsgMV0gPSAwOwotCi0gIHN0cmNhdCAobmV3X25hbWUsIHByb2dfbmFtZSk7Ci0KLSAgcmV0dXJuIG5ld19uYW1lOwotfQotCi0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYKLXR5cGVkZWYgc3RydWN0IGZuYW1lX2NhY2hlCi17Ci0gIGNoYXIgKiAgICAgICAgICAgICAgIGZpbGVuYW1lOwotICBzdHJ1Y3QgZm5hbWVfY2FjaGUgKiBuZXh0OwotfQotZm5hbWVfY2FjaGU7Ci0KLXN0YXRpYyBmbmFtZV9jYWNoZSBmbmFtZXM7Ci0KLXN0YXRpYyB2b2lkCi1tY29yZV9lbGZfY2FjaGVfZmlsZW5hbWUgKGNoYXIgKiBmaWxlbmFtZSkKLXsKLSAgZm5hbWVfY2FjaGUgKiBwdHI7Ci0KLSAgcHRyID0gJiBmbmFtZXM7Ci0KLSAgd2hpbGUgKHB0ci0+bmV4dCAhPSBOVUxMKQotICAgIHB0ciA9IHB0ci0+bmV4dDsKLQotICBwdHItPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIHB0ci0+bmV4dCAgICAgPSAoZm5hbWVfY2FjaGUgKikgbWFsbG9jIChzaXplb2YgKGZuYW1lX2NhY2hlKSk7Ci0gIGlmIChwdHItPm5leHQgIT0gTlVMTCkKLSAgICBwdHItPm5leHQtPm5leHQgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotbWNvcmVfZWxmX2dlbl9vdXRfZmlsZSAodm9pZCkKLXsKLSAgZm5hbWVfY2FjaGUgKiBwdHI7Ci0KLSAgLyogU3RlcCBvbmUuICBSdW4gJ2xkIC1yJyBvbiB0aGUgaW5wdXQgb2JqZWN0IGZpbGVzIGluIG9yZGVyIHRvIHJlc29sdmUKLSAgICAgYW55IGludGVybmFsIHJlZmVyZW5jZXMgYW5kIHRvIGdlbmVyYXRlIGEgc2luZ2xlIC5leHBvcnRzIHNlY3Rpb24uICAqLwotICBwdHIgPSAmIGZuYW1lczsKLQotICBzdHJjcHkgKG91dGZpbGUsICItciAiKTsKLQotICBpZiAobWNvcmVfZWxmX2xpbmtlcl9mbGFncyAhPSBOVUxMKQotICAgIHN0cmNhdCAob3V0ZmlsZSwgbWNvcmVfZWxmX2xpbmtlcl9mbGFncyk7Ci0gIAotICB3aGlsZSAocHRyLT5uZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogQ2hlY2sgZm9yIG92ZXJydW46IHdoYXQgdGhlIGhlbGwsIGl0J3Mgb25seSBjcHUgY3ljbGVzLi4uICovCi0gICAgICBpZiAoc3RybGVuIChvdXRmaWxlKSArIHN0cmxlbiAocHRyLT5maWxlbmFtZSkgKyAyID49IHNpemVvZiAob3V0ZmlsZSkpCi0JewotCSAgZmF0YWwgKF8oImJ1ZmZlciBvdmVyZmxvd1xuIikpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIAotICAgICAgc3RyY2F0IChvdXRmaWxlLCBwdHItPmZpbGVuYW1lKTsKLSAgICAgIHN0cmNhdCAob3V0ZmlsZSwgIiAiKTsKLQotICAgICAgcHRyID0gcHRyLT5uZXh0OwotICAgIH0KLQotICBzdHJjYXQgKG91dGZpbGUsICItbyBtY29yZWVsZi50bXAiKTsKLQotICBpZiAobWNvcmVfZWxmX2xpbmtlciA9PSBOVUxMKQotICAgIG1jb3JlX2VsZl9saW5rZXIgPSBkZWR1Y2VfbmFtZSAoImxkIik7Ci0gIAotICBydW4gKG1jb3JlX2VsZl9saW5rZXIsIG91dGZpbGUpOwotCi0gIC8qIFN0ZXAgdHdvLiBDcmVhdGUgYSAuZXhwIGZpbGUgYW5kIGEgLmxpYiBmaWxlIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlLiAKLSAgICAgRG8gdGhpcyBieSByZWN1cnNpdmVseSBpbnZva2luZyBkbGx0b29sLi4uLiovCi0gIHNwcmludGYgKG91dGZpbGUsICItUyAlcyIsIGFzX25hbWUpOwotICAKLSAgc3RyY2F0IChvdXRmaWxlLCAiIC1lIG1jb3JlZWxmLmV4cCAtbCBtY29yZWVsZi5saWIgbWNvcmVlbGYudG1wIik7Ci0KLSAgaWYgKHZlcmJvc2UpCi0gICAgc3RyY2F0IChvdXRmaWxlLCAiIC12Iik7Ci0gIAotICBpZiAoZG9udGRlbHRlbXBzKQotICAgIHN0cmNhdCAob3V0ZmlsZSwgIiAtbiIpOwotICAKLSAgaWYgKGRvbnRkZWx0ZW1wcyA+IDEpCi0gICAgc3RyY2F0IChvdXRmaWxlLCAiIC1uIik7Ci0KLSAgLyogWFhYIC0gRklNRTogb3VnaHQgdG8gY2hlY2svY29weSBvdGhlciBjb21tYW5kIGxpbmUgb3B0aW9ucyBhcyB3ZWxsLiAgKi8KLSAgCi0gIHJ1biAocHJvZ3JhbV9uYW1lLCBvdXRmaWxlKTsKLQotICAvKiBTdGVwIGZvdXIuIEZlZWQgdGhlIHR3byBuZXcgZmlsZXMgdG8gbGQgLXNoYXJlZC4gICovCi0gIHN0cmNweSAob3V0ZmlsZSwgIi1zaGFyZWQgIik7Ci0KLSAgaWYgKG1jb3JlX2VsZl9saW5rZXJfZmxhZ3MpCi0gICAgc3RyY2F0IChvdXRmaWxlLCBtY29yZV9lbGZfbGlua2VyX2ZsYWdzKTsKLQotICBzdHJjYXQgKG91dGZpbGUsICIgbWNvcmVlbGYuZXhwIG1jb3JlZWxmLmxpYiAtbyAiKTsKLSAgc3RyY2F0IChvdXRmaWxlLCBtY29yZV9lbGZfb3V0X2ZpbGUpOwotCi0gIHJ1biAobWNvcmVfZWxmX2xpbmtlciwgb3V0ZmlsZSk7Ci19Ci0jZW5kaWYgLyogRExMVE9PTF9NQ09SRV9FTEYgKi8KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2RsbHRvb2wuaCBiL2JpbnV0aWxzL2RsbHRvb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxNjdjOC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9kbGx0b29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBkbGx0b29sLmggLS0gaGVhZGVyIGZpbGUgZm9yIGRsbHRvb2wKLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotZXh0ZXJuIHZvaWQgZGVmX2NvZGUgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfZGF0YSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGRlZl9kZXNjcmlwdGlvbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGRlZl9leHBvcnRzCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50LCBpbnQpKTsKLWV4dGVybiB2b2lkIGRlZl9oZWFwc2l6ZSBQQVJBTVMgKChpbnQsIGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX2ltcG9ydAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX2xpYnJhcnkgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIGRlZl9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfc2VjdGlvbiBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX3N0YWNrc2l6ZSBQQVJBTVMgKChpbnQsIGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX3ZlcnNpb24gUEFSQU1TICgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgeXlwYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gaW50IHl5ZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gaW50IHl5ZGVidWc7Ci1leHRlcm4gaW50IHl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBGSUxFICp5eWluOwotZXh0ZXJuIGludCBsaW5lbnVtYmVyOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGxsd3JhcC5jIGIvYmludXRpbHMvZGxsd3JhcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzQ2MTFiLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2RsbHdyYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNTAgKzAsMCBAQAotLyogZGxsd3JhcC5jIC0tIHdyYXBwZXIgZm9yIERMTFRPT0wgYW5kIEdDQyB0byBnZW5lcmF0ZSBQRSBzdHlsZSBETExzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNdW1pdCBLaGFuIChraGFuQHhyYXlsaXRoLndpc2MuZWR1KS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQUlYIHJlcXVpcmVzIHRoaXMgdG8gYmUgdGhlIGZpcnN0IHRoaW5nIGluIHRoZSBmaWxlLiAgKi8KLSNpZm5kZWYgX19HTlVDX18KLSMgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jZW5kaWYKLSNlbmRpZgotCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImR5bi1zdHJpbmcuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaWZkZWYgSEFWRV9TWVNfV0FJVF9ICi0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNlbHNlIC8qICEgSEFWRV9TWVNfV0FJVF9IICovCi0jaWYgISBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLSNpZm5kZWYgV0lGRVhJVEVECi0jZGVmaW5lIFdJRkVYSVRFRCh3KQkoKCh3KSYwMzc3KSA9PSAwKQotI2VuZGlmCi0jaWZuZGVmIFdJRlNJR05BTEVECi0jZGVmaW5lIFdJRlNJR05BTEVEKHcpCSgoKHcpJjAzNzcpICE9IDAxNzcgJiYgKCh3KSZ+MDM3NykgPT0gMCkKLSNlbmRpZgotI2lmbmRlZiBXVEVSTVNJRwotI2RlZmluZSBXVEVSTVNJRyh3KQkoKHcpICYgMDE3NykKLSNlbmRpZgotI2lmbmRlZiBXRVhJVFNUQVRVUwotI2RlZmluZSBXRVhJVFNUQVRVUyh3KQkoKCh3KSA+PiA4KSAmIDAzNzcpCi0jZW5kaWYKLSNlbHNlIC8qIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTjMyX18pICovCi0jaWZuZGVmIFdJRkVYSVRFRAotI2RlZmluZSBXSUZFWElURUQodykJKCgodykgJiAweGZmKSA9PSAwKQotI2VuZGlmCi0jaWZuZGVmIFdJRlNJR05BTEVECi0jZGVmaW5lIFdJRlNJR05BTEVEKHcpCSgoKHcpICYgMHhmZikgIT0gMCAmJiAoKHcpICYgMHhmZikgIT0gMHg3ZikKLSNlbmRpZgotI2lmbmRlZiBXVEVSTVNJRwotI2RlZmluZSBXVEVSTVNJRyh3KQkoKHcpICYgMHg3ZikKLSNlbmRpZgotI2lmbmRlZiBXRVhJVFNUQVRVUwotI2RlZmluZSBXRVhJVFNUQVRVUyh3KQkoKCh3KSAmIDB4ZmYwMCkgPj4gOCkKLSNlbmRpZgotI2VuZGlmIC8qIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTjMyX18pICovCi0jZW5kaWYgLyogISBIQVZFX1NZU19XQUlUX0ggKi8KLQotc3RhdGljIGNoYXIgKnByb2dyYW1fdmVyc2lvbiA9ICIwLjIuNCI7Ci1zdGF0aWMgY2hhciAqZHJpdmVyX25hbWUgPSAiZ2NjIjsKLXN0YXRpYyBjaGFyICpjeWd3aW5fZHJpdmVyX2ZsYWdzID0gCi0gICItV2wsLS1kbGwgLW5vc3RhcnRmaWxlcyI7Ci1zdGF0aWMgY2hhciAqbWluZ3czMl9kcml2ZXJfZmxhZ3MgPSAiLW1kbGwiOwotc3RhdGljIGNoYXIgKmdlbmVyaWNfZHJpdmVyX2ZsYWdzID0gIi1XbCwtLWRsbCI7Ci0KLXN0YXRpYyBjaGFyICplbnRyeV9wb2ludDsKLQotc3RhdGljIGNoYXIgKmRsbHRvb2xfbmFtZSA9ICJkbGx0b29sIjsKLQotc3RhdGljIGNoYXIgKnRhcmdldCA9IFRBUkdFVDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgVU5LTk9XTl9UQVJHRVQsIAotICBDWUdXSU5fVEFSR0VULCAKLSAgTUlOR1czMl9UQVJHRVQKLX0gCi10YXJnZXRfdHlwZTsKLQotc3RhdGljIHRhcmdldF90eXBlIHdoaWNoX3RhcmdldCA9IFVOS05PV05fVEFSR0VUOwotCi1zdGF0aWMgaW50IGRvbnRkZWx0ZW1wcyA9IDA7Ci1zdGF0aWMgaW50IGRyeV9ydW4gPSAwOwotCi1zdGF0aWMgY2hhciAqcHJvZ3JhbV9uYW1lOwotCi1zdGF0aWMgaW50IHZlcmJvc2UgPSAwOwotCi1zdGF0aWMgY2hhciAqZGxsX2ZpbGVfbmFtZTsKLXN0YXRpYyBjaGFyICpkbGxfbmFtZTsKLXN0YXRpYyBjaGFyICpiYXNlX2ZpbGVfbmFtZTsKLXN0YXRpYyBjaGFyICpleHBfZmlsZV9uYW1lOwotc3RhdGljIGNoYXIgKmRlZl9maWxlX25hbWU7Ci1zdGF0aWMgaW50IGRlbGV0ZV9iYXNlX2ZpbGUgPSAxOwotc3RhdGljIGludCBkZWxldGVfZXhwX2ZpbGUgPSAxOwotc3RhdGljIGludCBkZWxldGVfZGVmX2ZpbGUgPSAxOwotCi1zdGF0aWMgaW50IHJ1biBQQVJBTVMgKChjb25zdCBjaGFyICosIGNoYXIgKikpOwotc3RhdGljIHZvaWQgdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRlbGV0ZV90ZW1wX2ZpbGVzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGNsZWFudXBfYW5kX2V4aXQgUEFSQU1TICgoaW50IHN0YXR1cykpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWRlbGV0ZV90ZW1wX2ZpbGVzICgpCi17Ci0gIGlmIChkZWxldGVfYmFzZV9maWxlICYmIGJhc2VfZmlsZV9uYW1lKQotICAgIHsKLSAgICAgIGlmICh2ZXJib3NlKQotCWZwcmludGYgKHN0ZGVyciwgIiVzIHRlbXBvcmFyeSBiYXNlIGZpbGUgJXNcbiIsCi0JCSBkb250ZGVsdGVtcHMgPyAiS2VlcGluZyIgOiAiRGVsZXRpbmciLAotCSAgICAgICAgIGJhc2VfZmlsZV9uYW1lKTsKLSAgICAgIGlmICghIGRvbnRkZWx0ZW1wcykKLSAgICAgICAgewotICAgICAgICAgIHVubGluayAoYmFzZV9maWxlX25hbWUpOwotCSAgZnJlZSAoYmFzZV9maWxlX25hbWUpOwotCX0KLSAgICB9Ci0gIAotICBpZiAoZGVsZXRlX2V4cF9maWxlICYmIGV4cF9maWxlX25hbWUpCi0gICAgewotICAgICAgaWYgKHZlcmJvc2UpCi0JZnByaW50ZiAoc3RkZXJyLCAiJXMgdGVtcG9yYXJ5IGV4cCBmaWxlICVzXG4iLAotCQkgZG9udGRlbHRlbXBzID8gIktlZXBpbmciIDogIkRlbGV0aW5nIiwKLQkgICAgICAgICBleHBfZmlsZV9uYW1lKTsKLSAgICAgIGlmICghIGRvbnRkZWx0ZW1wcykKLSAgICAgICAgewotICAgICAgICAgIHVubGluayAoZXhwX2ZpbGVfbmFtZSk7Ci0gICAgICAgICAgZnJlZSAoZXhwX2ZpbGVfbmFtZSk7Ci0JfQotICAgIH0KLSAgaWYgKGRlbGV0ZV9kZWZfZmlsZSAmJiBkZWZfZmlsZV9uYW1lKQotICAgIHsKLSAgICAgIGlmICh2ZXJib3NlKQotCWZwcmludGYgKHN0ZGVyciwgIiVzIHRlbXBvcmFyeSBkZWYgZmlsZSAlc1xuIiwKLQkJIGRvbnRkZWx0ZW1wcyA/ICJLZWVwaW5nIiA6ICJEZWxldGluZyIsCi0JICAgICAgICAgZGVmX2ZpbGVfbmFtZSk7Ci0gICAgICBpZiAoISBkb250ZGVsdGVtcHMpCi0gICAgICAgIHsKLSAgICAgICAgICB1bmxpbmsgKGRlZl9maWxlX25hbWUpOwotICAgICAgICAgIGZyZWUgKGRlZl9maWxlX25hbWUpOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIAotY2xlYW51cF9hbmRfZXhpdCAoaW50IHN0YXR1cykKLXsKLSAgZGVsZXRlX3RlbXBfZmlsZXMgKCk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0gIAotc3RhdGljIGludAotcnVuICh3aGF0LCBhcmdzKQotICAgICBjb25zdCBjaGFyICp3aGF0OwotICAgICBjaGFyICphcmdzOwotewotICBjaGFyICpzOwotICBpbnQgcGlkLCB3YWl0X3N0YXR1cywgcmV0Y29kZTsKLSAgaW50IGk7Ci0gIGNvbnN0IGNoYXIgKiphcmd2OwotICBjaGFyICplcnJtc2dfZm10LCAqZXJybXNnX2FyZzsKLSAgY2hhciAqdGVtcF9iYXNlID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKLSAgaW50IGluX3F1b3RlOwotICBjaGFyIHNlcDsKLQotICBpZiAodmVyYm9zZSB8fCBkcnlfcnVuKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzICVzXG4iLCB3aGF0LCBhcmdzKTsKLQotICAvKiBDb3VudCB0aGUgYXJncyAqLwotICBpID0gMDsKLSAgZm9yIChzID0gYXJnczsgKnM7IHMrKykKLSAgICBpZiAoKnMgPT0gJyAnKQotICAgICAgaSsrOwotICBpKys7Ci0gIGFyZ3YgPSBhbGxvY2EgKHNpemVvZiAoY2hhciAqKSAqIChpICsgMykpOwotICBpID0gMDsKLSAgYXJndltpKytdID0gd2hhdDsKLSAgcyA9IGFyZ3M7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIHdoaWxlICgqcyA9PSAnICcgJiYgKnMgIT0gMCkKLQlzKys7Ci0gICAgICBpZiAoKnMgPT0gMCkKLQlicmVhazsKLSAgICAgIGluX3F1b3RlID0gKCpzID09ICdcJycgfHwgKnMgPT0gJyInKTsKLSAgICAgIHNlcCA9IChpbl9xdW90ZSkgPyAqcysrIDogJyAnOwotICAgICAgYXJndltpKytdID0gczsKLSAgICAgIHdoaWxlICgqcyAhPSBzZXAgJiYgKnMgIT0gMCkKLQlzKys7Ci0gICAgICBpZiAoKnMgPT0gMCkKLQlicmVhazsKLSAgICAgICpzKysgPSAwOwotICAgICAgaWYgKGluX3F1b3RlKQotICAgICAgICBzKys7Ci0gICAgfQotICBhcmd2W2krK10gPSBOVUxMOwotCi0gIGlmIChkcnlfcnVuKQotICAgIHJldHVybiAwOwotCi0gIHBpZCA9IHBleGVjdXRlIChhcmd2WzBdLCAoY2hhciAqIGNvbnN0ICopIGFyZ3YsIHByb2dyYW1fbmFtZSwgdGVtcF9iYXNlLAotCQkgICZlcnJtc2dfZm10LCAmZXJybXNnX2FyZywgUEVYRUNVVEVfT05FIHwgUEVYRUNVVEVfU0VBUkNIKTsKLQotICBpZiAocGlkID09IC0xKQotICAgIHsKLSAgICAgIGludCBlcnJub192YWwgPSBlcnJubzsKLQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIGVycm1zZ19mbXQsIGVycm1zZ19hcmcpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiOiAlc1xuIiwgc3RyZXJyb3IgKGVycm5vX3ZhbCkpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIHJldGNvZGUgPSAwOwotICBwaWQgPSBwd2FpdCAocGlkLCAmd2FpdF9zdGF0dXMsIDApOwotICBpZiAocGlkID09IC0xKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB3YWl0OiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIHJldGNvZGUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoV0lGU0lHTkFMRUQgKHdhaXRfc3RhdHVzKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogc3VicHJvY2VzcyBnb3QgZmF0YWwgc2lnbmFsICVkXG4iLAotCSAgICAgICBwcm9ncmFtX25hbWUsIFdURVJNU0lHICh3YWl0X3N0YXR1cykpOwotICAgICAgcmV0Y29kZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChXSUZFWElURUQgKHdhaXRfc3RhdHVzKSkKLSAgICB7Ci0gICAgICBpZiAoV0VYSVRTVEFUVVMgKHdhaXRfc3RhdHVzKSAhPSAwKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlcyBleGl0ZWQgd2l0aCBzdGF0dXMgJWRcbiIsCi0JICAJICAgcHJvZ3JhbV9uYW1lLCB3aGF0LCBXRVhJVFNUQVRVUyAod2FpdF9zdGF0dXMpKTsKLQkgIHJldGNvZGUgPSAxOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICByZXRjb2RlID0gMTsKLSAgCi0gIHJldHVybiByZXRjb2RlOwotfQotCi1zdGF0aWMgY2hhciAqCi1teWJhc2VuYW1lIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBjaGFyICpiYXNlID0gbmFtZTsKLQotICB3aGlsZSAoKm5hbWUpCi0gICAgewotICAgICAgaWYgKCpuYW1lID09ICcvJyB8fCAqbmFtZSA9PSAnXFwnKQotCXsKLQkgIGJhc2UgPSBuYW1lICsgMTsKLQl9Ci0gICAgICArK25hbWU7Ci0gICAgfQotICByZXR1cm4gKGNoYXIgKikgYmFzZTsKLX0KLQotc3RhdGljIGludCAKLXN0cmhhc2ggKGNvbnN0IGNoYXIgKnN0cikKLXsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqczsKLSAgdW5zaWduZWQgbG9uZyBoYXNoOwotICB1bnNpZ25lZCBpbnQgYzsKLSAgdW5zaWduZWQgaW50IGxlbjsKLQotICBoYXNoID0gMDsKLSAgbGVuID0gMDsKLSAgcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHN0cjsKLSAgd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBoYXNoICs9IGMgKyAoYyA8PCAxNyk7Ci0gICAgICBoYXNoIF49IGhhc2ggPj4gMjsKLSAgICAgICsrbGVuOwotICAgIH0KLSAgaGFzaCArPSBsZW4gKyAobGVuIDw8IDE3KTsKLSAgaGFzaCBePSBoYXNoID4+IDI7Ci0KLSAgcmV0dXJuIGhhc2g7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1wcmludF92ZXJzaW9uIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICAvKiBUaGlzIG91dHB1dCBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIEdOVSBzdGFuZGFyZHMgZG9jdW1lbnQuICAqLwotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBwcmludGYgKCJHTlUgJXMgJXNcbiIsIG5hbWUsIHByb2dyYW1fdmVyc2lvbik7Ci0gIHByaW50ZiAoIkNvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIik7Ci0gIHByaW50ZiAoIlwKLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcblwKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIpOwotICBleGl0ICgwKTsKLX0KLQotc3RhdGljIHZvaWQKLXVzYWdlIChmaWxlLCBzdGF0dXMpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKGZpbGUsICJVc2FnZSAlcyA8b3B0aW9ucz4gPG9iamVjdC1maWxlcz5cbiIsIHByb2dyYW1fbmFtZSk7Ci0gIGZwcmludGYgKGZpbGUsICIgIEdlbmVyaWMgb3B0aW9uczpcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1xdWlldCwgLXEgICAgICAgICAgICBXb3JrIHF1aWV0bHlcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS12ZXJib3NlLCAtdiAgICAgICAgICBWZXJib3NlXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tdmVyc2lvbiAgICAgICAgICAgICAgUHJpbnQgZGxsd3JhcCB2ZXJzaW9uXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0taW1wbGliIDxvdXRuYW1lPiAgICAgU3lub255bSBmb3IgLS1vdXRwdXQtbGliXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgT3B0aW9ucyBmb3IgJXM6XG4iLCBwcm9ncmFtX25hbWUpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1kcml2ZXItbmFtZSA8ZHJpdmVyPiBEZWZhdWx0cyB0byBcImdjY1wiXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZHJpdmVyLWZsYWdzIDxmbGFncz4gT3ZlcnJpZGUgZGVmYXVsdCBsZCBmbGFnc1xuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWRsbHRvb2wtbmFtZSA8ZGxsdG9vbD4gRGVmYXVsdHMgdG8gXCJkbGx0b29sXCJcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1lbnRyeSA8ZW50cnk+ICAgICAgICBTcGVjaWZ5IGFsdGVybmF0ZSBETEwgZW50cnkgcG9pbnRcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1pbWFnZS1iYXNlIDxiYXNlPiAgICBTcGVjaWZ5IGltYWdlIGJhc2UgYWRkcmVzc1xuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLXRhcmdldCA8bWFjaGluZT4gICAgIGkzODYtY3lnd2luMzIgb3IgaTM4Ni1taW5ndzMyXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZHJ5LXJ1biAgICAgICAgICAgICAgU2hvdyB3aGF0IG5lZWRzIHRvIGJlIHJ1blxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgIE9wdGlvbnMgcGFzc2VkIHRvIERMTFRPT0w6XG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tbWFjaGluZSA8bWFjaGluZT5cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1vdXRwdXQtZXhwIDxvdXRuYW1lPiBHZW5lcmF0ZSBleHBvcnQgZmlsZS5cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1vdXRwdXQtbGliIDxvdXRuYW1lPiBHZW5lcmF0ZSBpbnB1dCBsaWJyYXJ5LlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWFkZC1pbmRpcmVjdCAgICAgICAgIEFkZCBkbGwgaW5kaXJlY3RzIHRvIGV4cG9ydCBmaWxlLlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWRsbG5hbWUgPG5hbWU+ICAgICAgIE5hbWUgb2YgaW5wdXQgZGxsIHRvIHB1dCBpbnRvIG91dHB1dCBsaWIuXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZGVmIDxkZWZmaWxlPiAgICAgICAgTmFtZSBpbnB1dCAuZGVmIGZpbGVcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1vdXRwdXQtZGVmIDxkZWZmaWxlPiBOYW1lIG91dHB1dCAuZGVmIGZpbGVcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1leHBvcnQtYWxsLXN5bWJvbHMgICAgIEV4cG9ydCBhbGwgc3ltYm9scyB0byAuZGVmXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzICBPbmx5IGV4cG9ydCAuZHJlY3R2ZSBzeW1ib2xzXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZXhjbHVkZS1zeW1ib2xzIDxsaXN0PiBFeGNsdWRlIDxsaXN0PiBmcm9tIC5kZWZcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1uby1kZWZhdWx0LWV4Y2x1ZGVzICAgIFphcCBkZWZhdWx0IGV4Y2x1ZGUgc3ltYm9sc1xuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWJhc2UtZmlsZSA8YmFzZWZpbGU+IFJlYWQgbGlua2VyIGdlbmVyYXRlZCBiYXNlIGZpbGVcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1uby1pZGF0YTQgICAgICAgICAgIERvbid0IGdlbmVyYXRlIGlkYXRhJDQgc2VjdGlvblxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLW5vLWlkYXRhNSAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgaWRhdGEkNSBzZWN0aW9uXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC1VICAgICAgICAgICAgICAgICAgICAgQWRkIHVuZGVyc2NvcmVzIHRvIC5saWJcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLWsgICAgICAgICAgICAgICAgICAgICBLaWxsIEA8bj4gZnJvbSBleHBvcnRlZCBuYW1lc1xuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWFkZC1zdGRjYWxsLWFsaWFzICAgIEFkZCBhbGlhc2VzIHdpdGhvdXQgQDxuPlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWFzIDxuYW1lPiAgICAgICAgICAgIFVzZSA8bmFtZT4gZm9yIGFzc2VtYmxlclxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLW5vZGVsZXRlICAgICAgICAgICAgIEtlZXAgdGVtcCBmaWxlcy5cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICBSZXN0IGFyZSBwYXNzZWQgdW5tb2RpZmllZCB0byB0aGUgbGFuZ3VhZ2UgZHJpdmVyXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIlxuXG4iKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotI2RlZmluZSBPUFRJT05fU1RBUlQJCTE0OQotCi0vKiBHRU5FUklDIG9wdGlvbnMuICovCi0jZGVmaW5lIE9QVElPTl9RVUlFVAkJKE9QVElPTl9TVEFSVCArIDEpCi0jZGVmaW5lIE9QVElPTl9WRVJCT1NFCQkoT1BUSU9OX1FVSUVUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1ZFUlNJT04JCShPUFRJT05fVkVSQk9TRSArIDEpCi0KLS8qIERMTFdSQVAgb3B0aW9ucy4gKi8KLSNkZWZpbmUgT1BUSU9OX0RSWV9SVU4JCShPUFRJT05fVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9EUklWRVJfTkFNRQkoT1BUSU9OX0RSWV9SVU4gKyAxKQotI2RlZmluZSBPUFRJT05fRFJJVkVSX0ZMQUdTCShPUFRJT05fRFJJVkVSX05BTUUgKyAxKQotI2RlZmluZSBPUFRJT05fRExMVE9PTF9OQU1FCShPUFRJT05fRFJJVkVSX0ZMQUdTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VOVFJZCQkoT1BUSU9OX0RMTFRPT0xfTkFNRSArIDEpCi0jZGVmaW5lIE9QVElPTl9JTUFHRV9CQVNFCShPUFRJT05fRU5UUlkgKyAxKQotI2RlZmluZSBPUFRJT05fVEFSR0VUCQkoT1BUSU9OX0lNQUdFX0JBU0UgKyAxKQotCi0vKiBETExUT09MIG9wdGlvbnMuICovCi0jZGVmaW5lIE9QVElPTl9OT0RFTEVURQkJKE9QVElPTl9UQVJHRVQgKyAxKQotI2RlZmluZSBPUFRJT05fRExMTkFNRQkJKE9QVElPTl9OT0RFTEVURSArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19JREFUQTQgCShPUFRJT05fRExMTkFNRSArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19JREFUQTUJKE9QVElPTl9OT19JREFUQTQgKyAxKQotI2RlZmluZSBPUFRJT05fT1VUUFVUX0VYUAkoT1BUSU9OX05PX0lEQVRBNSArIDEpCi0jZGVmaW5lIE9QVElPTl9PVVRQVVRfREVGCShPUFRJT05fT1VUUFVUX0VYUCArIDEpCi0jZGVmaW5lIE9QVElPTl9FWFBPUlRfQUxMX1NZTVMJKE9QVElPTl9PVVRQVVRfREVGICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX0VYUE9SVF9BTExfU1lNUyAoT1BUSU9OX0VYUE9SVF9BTExfU1lNUyArIDEpCi0jZGVmaW5lIE9QVElPTl9FWENMVURFX1NZTVMJKE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVMgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fREVGQVVMVF9FWENMVURFUyAoT1BUSU9OX0VYQ0xVREVfU1lNUyArIDEpCi0jZGVmaW5lIE9QVElPTl9PVVRQVVRfTElCCShPUFRJT05fTk9fREVGQVVMVF9FWENMVURFUyArIDEpCi0jZGVmaW5lIE9QVElPTl9ERUYJCShPUFRJT05fT1VUUFVUX0xJQiArIDEpCi0jZGVmaW5lIE9QVElPTl9BRERfVU5ERVJTQ09SRQkoT1BUSU9OX0RFRiArIDEpCi0jZGVmaW5lIE9QVElPTl9LSUxMQVQJCShPUFRJT05fQUREX1VOREVSU0NPUkUgKyAxKQotI2RlZmluZSBPUFRJT05fSEVMUAkJKE9QVElPTl9LSUxMQVQgKyAxKQotI2RlZmluZSBPUFRJT05fTUFDSElORQkJKE9QVElPTl9IRUxQICsgMSkKLSNkZWZpbmUgT1BUSU9OX0FERF9JTkRJUkVDVAkoT1BUSU9OX01BQ0hJTkUgKyAxKQotI2RlZmluZSBPUFRJT05fQkFTRV9GSUxFCShPUFRJT05fQUREX0lORElSRUNUICsgMSkKLSNkZWZpbmUgT1BUSU9OX0FTCQkoT1BUSU9OX0JBU0VfRklMRSArIDEpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgLyogZ2VuZXJpYyBvcHRpb25zLiAqLwotICB7InF1aWV0Iiwgbm9fYXJndW1lbnQsIE5VTEwsICdxJ30sCi0gIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUlNJT059LAotICB7ImltcGxpYiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fT1VUUFVUX0xJQn0sCi0KLSAgLyogZGxsd3JhcCBvcHRpb25zLiAqLwotICB7ImRyeS1ydW4iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RSWV9SVU59LAotICB7ImRyaXZlci1uYW1lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9EUklWRVJfTkFNRX0sCi0gIHsiZHJpdmVyLWZsYWdzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9EUklWRVJfRkxBR1N9LAotICB7ImRsbHRvb2wtbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRExMVE9PTF9OQU1FfSwKLSAgeyJlbnRyeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZSd9LAotICB7ImltYWdlLWJhc2UiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNQUdFX0JBU0V9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVEFSR0VUfSwKLQotICAvKiBkbGx0b29sIG9wdGlvbnMuICovCi0gIHsibm8tZGVsZXRlIiwgbm9fYXJndW1lbnQsIE5VTEwsICduJ30sCi0gIHsiZGxsbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRExMTkFNRX0sCi0gIHsibm8taWRhdGE0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19JREFUQTR9LAotICB7Im5vLWlkYXRhNSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fSURBVEE1fSwKLSAgeyJvdXRwdXQtZXhwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRQVVRfRVhQfSwKLSAgeyJvdXRwdXQtZGVmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRQVVRfREVGfSwKLSAgeyJleHBvcnQtYWxsLXN5bWJvbHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVF9BTExfU1lNU30sCi0gIHsibm8tZXhwb3J0LWFsbC1zeW1ib2xzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVN9LAotICB7ImV4Y2x1ZGUtc3ltYm9scyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhDTFVERV9TWU1TfSwKLSAgeyJuby1kZWZhdWx0LWV4Y2x1ZGVzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19ERUZBVUxUX0VYQ0xVREVTfSwKLSAgeyJvdXRwdXQtbGliIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRQVVRfTElCfSwKLSAgeyJkZWYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RFRn0sCi0gIHsiYWRkLXVuZGVyc2NvcmUiLCBub19hcmd1bWVudCwgTlVMTCwgJ1UnfSwKLSAgeyJraWxsYXQiLCBub19hcmd1bWVudCwgTlVMTCwgJ2snfSwKLSAgeyJhZGQtc3RkY2FsbC1hbGlhcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnQSd9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKLSAgeyJtYWNoaW5lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUNISU5FfSwKLSAgeyJhZGQtaW5kaXJlY3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FERF9JTkRJUkVDVH0sCi0gIHsiYmFzZS1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CQVNFX0ZJTEV9LAotICB7ImFzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BU30sCi0gIHswfQotfTsKLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBjOwotICBpbnQgaTsKLQotICBjaGFyICoqc2F2ZWRfYXJndiA9IDA7Ci0gIGludCBjbWRsaW5lX2xlbiA9IDA7Ci0KLSAgaW50IGV4cG9ydF9hbGwgPSAwOwotCi0gIGludCAqZGxsdG9vbF9hcmdfaW5kaWNlczsKLSAgaW50ICpkcml2ZXJfYXJnX2luZGljZXM7Ci0KLSAgY2hhciAqZHJpdmVyX2ZsYWdzID0gMDsKLSAgY2hhciAqb3V0cHV0X2xpYl9maWxlX25hbWUgPSAwOwotCi0gIGR5bl9zdHJpbmdfdCBkbGx0b29sX2NtZGxpbmU7Ci0gIGR5bl9zdHJpbmdfdCBkcml2ZXJfY21kbGluZTsKLQotICBpbnQgZGVmX2ZpbGVfc2VlbiA9IDA7Ci0KLSAgY2hhciAqaW1hZ2VfYmFzZV9zdHIgPSAwOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0KLSAgc2F2ZWRfYXJndiA9IChjaGFyICoqKSB4bWFsbG9jIChhcmdjICogc2l6ZW9mIChjaGFyKikpOwotICBkbGx0b29sX2FyZ19pbmRpY2VzID0gKGludCAqKSB4bWFsbG9jIChhcmdjICogc2l6ZW9mIChpbnQpKTsKLSAgZHJpdmVyX2FyZ19pbmRpY2VzID0gKGludCAqKSB4bWFsbG9jIChhcmdjICogc2l6ZW9mIChpbnQpKTsKLSAgZm9yIChpID0gMDsgaSA8IGFyZ2M7ICsraSkgCi0gICAgewotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoYXJndltpXSk7Ci0gICAgICBjaGFyICphcmcgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgICAgIHN0cmNweSAoYXJnLCBhcmd2W2ldKTsKLSAgICAgIGNtZGxpbmVfbGVuICs9IGxlbjsKLSAgICAgIHNhdmVkX2FyZ3ZbaV0gPSBhcmc7Ci0gICAgICBkbGx0b29sX2FyZ19pbmRpY2VzW2ldID0gMDsKLSAgICAgIGRyaXZlcl9hcmdfaW5kaWNlc1tpXSA9IDE7Ci0gICAgfQotICBjbWRsaW5lX2xlbisrOwotCi0gIC8qIFdlIHJlY29nbml6ZSBkbGx3cmFwIGFuZCBkbGx0b29sIG9wdGlvbnMsIGFuZCBldmVyeXRoaW5nIGVsc2UgaXMKLSAgICAgcGFzc2VkIG9udG8gdGhlIGxhbmd1YWdlIGRyaXZlciAoZWcuLCB0byBHQ0MpLiBXZSBjb2xsZWN0IG9wdGlvbnMKLSAgICAgdG8gZGxsdG9vbCBhbmQgZHJpdmVyIGluIGRsbHRvb2xfYXJncyBhbmQgZHJpdmVyX2FyZ3MuICovCi0gICAKLSAgb3B0ZXJyID0gMDsKLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgIm5rQXF2ZTpVaG86bDpMOkk6IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGludCBkbGx0b29sX2FyZzsKLSAgICAgIGludCBkcml2ZXJfYXJnOwotICAgICAgaW50IHNpbmdsZV93b3JkX29wdGlvbl92YWx1ZV9wYWlyOwotCi0gICAgICBkbGx0b29sX2FyZyA9IDA7Ci0gICAgICBkcml2ZXJfYXJnID0gMTsKLSAgICAgIHNpbmdsZV93b3JkX29wdGlvbl92YWx1ZV9wYWlyID0gMDsKLQotICAgICAgaWYgKGMgIT0gJz8nKQotICAgICAgICB7Ci0JICAvKiBXZSByZWNvZ25pemUgdGhpcyBvcHRpb24sIHNvIGl0IGhhcyB0byBiZSBlaXRoZXIgZGxsd3JhcCBvcgotCSAgICAgZGxsdG9vbCBvcHRpb24uIERvIG5vdCBwYXNzIHRvIGRyaXZlciB1bmxlc3MgaXQncyBvbmUgb2YgdGhlCi0JICAgICBnZW5lcmljIG9wdGlvbnMgdGhhdCBhcmUgcGFzc2VkIHRvIGFsbCB0aGUgdG9vbHMgKHN1Y2ggYXMgLXYpCi0JICAgICB3aGljaCBhcmUgZGVhbHQgd2l0aCBsYXRlci4gKi8KLQkgIGRyaXZlcl9hcmcgPSAwOwotCX0KLQotICAgICAgLyogZGVhbCB3aXRoIGdlbmVyaWMgYW5kIGRsbHdyYXAgb3B0aW9ucyBmaXJzdC4gKi8KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnaCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3EnOgotCSAgdmVyYm9zZSA9IDA7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIHZlcmJvc2UgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVkVSU0lPTjoKLQkgIHByaW50X3ZlcnNpb24gKHByb2dyYW1fbmFtZSk7Ci0JICBicmVhazsKLQljYXNlICdlJzoKLQkgIGVudHJ5X3BvaW50ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fSU1BR0VfQkFTRToKLQkgIGltYWdlX2Jhc2Vfc3RyID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fREVGOgotCSAgZGVmX2ZpbGVfbmFtZSA9IG9wdGFyZzsKLQkgIGRlZl9maWxlX3NlZW4gPSAxOwotCSAgZGVsZXRlX2RlZl9maWxlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgJ24nOgotCSAgZG9udGRlbHRlbXBzID0gMTsKLQkgIGRsbHRvb2xfYXJnID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ28nOgotCSAgZGxsX2ZpbGVfbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ0knOgotCWNhc2UgJ2wnOgotCWNhc2UgJ0wnOgotCSAgZHJpdmVyX2FyZyA9IDE7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9ETExOQU1FOgotCSAgZGxsX25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9EUllfUlVOOgotCSAgZHJ5X3J1biA9IDE7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9EUklWRVJfTkFNRToKLQkgIGRyaXZlcl9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRFJJVkVSX0ZMQUdTOgotCSAgZHJpdmVyX2ZsYWdzID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRExMVE9PTF9OQU1FOgotCSAgZGxsdG9vbF9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVEFSR0VUOgotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQkFTRV9GSUxFOgotCSAgYmFzZV9maWxlX25hbWUgPSBvcHRhcmc7Ci0JICBkZWxldGVfYmFzZV9maWxlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX09VVFBVVF9FWFA6Ci0JICBleHBfZmlsZV9uYW1lID0gb3B0YXJnOwotCSAgZGVsZXRlX2V4cF9maWxlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VYUE9SVF9BTExfU1lNUzoKLQkgIGV4cG9ydF9hbGwgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fT1VUUFVUX0xJQjoKLQkgIG91dHB1dF9saWJfZmlsZV9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnPyc6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZGxsdG9vbF9hcmcgPSAxOwotCSAgYnJlYWs7Ci0JfQotICAgICAgCi0gICAgICAvKiBIYW5kbGUgcGFzc2luZyB0aHJvdWdoIC0tb3B0aW9uPXZhbHVlIGNhc2UuICovCi0gICAgICBpZiAob3B0YXJnIAotICAgICAgICAgICYmIHNhdmVkX2FyZ3Zbb3B0aW5kLTFdWzBdID09ICctJyAKLSAgICAgICAgICAmJiBzYXZlZF9hcmd2W29wdGluZC0xXVsxXSA9PSAnLScgCi0JICAmJiBzdHJjaHIgKHNhdmVkX2FyZ3Zbb3B0aW5kLTFdLCAnPScpKQotCXNpbmdsZV93b3JkX29wdGlvbl92YWx1ZV9wYWlyID0gMTsKLQotICAgICAgaWYgKGRsbHRvb2xfYXJnKQotICAgICAgICB7Ci0JICBkbGx0b29sX2FyZ19pbmRpY2VzW29wdGluZC0xXSA9IDE7Ci0JICBpZiAob3B0YXJnICYmICEgc2luZ2xlX3dvcmRfb3B0aW9uX3ZhbHVlX3BhaXIpCi0JICAgIHsKLQkgICAgICBkbGx0b29sX2FyZ19pbmRpY2VzW29wdGluZC0yXSA9IDE7Ci0JICAgIH0gCi0JfQotCi0gICAgICBpZiAoISBkcml2ZXJfYXJnKQotICAgICAgICB7Ci0JICBkcml2ZXJfYXJnX2luZGljZXNbb3B0aW5kLTFdID0gMDsKLQkgIGlmIChvcHRhcmcgJiYgISBzaW5nbGVfd29yZF9vcHRpb25fdmFsdWVfcGFpcikKLQkgICAgewotCSAgICAgIGRyaXZlcl9hcmdfaW5kaWNlc1tvcHRpbmQtMl0gPSAwOwotCSAgICB9IAotCX0KLSAgICB9Ci0gIAotICAvKiBzYW5pdHkgY2hlY2tzLiAqLwotICBpZiAoISBkbGxfbmFtZSAmJiAhIGRsbF9maWxlX25hbWUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLAotICAgICAgICAgICAgICAgIiVzOiBNdXN0IHByb3ZpZGUgYXQgbGVhc3Qgb25lIG9mIC1vIG9yIC0tZGxsbmFtZSBvcHRpb25zXG4iLAotICAgICAgICAgICAgICAgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLSAgZWxzZSBpZiAoISBkbGxfbmFtZSkKLSAgICB7Ci0gICAgICBkbGxfbmFtZSA9IHhzdHJkdXAgKG15YmFzZW5hbWUgKGRsbF9maWxlX25hbWUpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgZGxsX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBkbGxfZmlsZV9uYW1lID0geHN0cmR1cCAoZGxsX25hbWUpOwotICAgIH0KLSAgCi0gIGlmICghIGRlZl9maWxlX3NlZW4pCi0gICAgewotICAgICAgY2hhciAqZmlsZXByZWZpeCA9IGNob29zZV90ZW1wX2Jhc2UgKCk7Ci0gICAgICBkZWZfZmlsZV9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaWxlcHJlZml4KSArIDUpOwotICAgICAgc3ByaW50ZiAoZGVmX2ZpbGVfbmFtZSwgIiVzLmRlZiIsIAotICAgICAgICAgICAgICAgKGRvbnRkZWx0ZW1wcykgPyBteWJhc2VuYW1lIChmaWxlcHJlZml4KSA6IGZpbGVwcmVmaXgpOwotICAgICAgZGVsZXRlX2RlZl9maWxlID0gMTsKLSAgICAgIGZyZWUgKGZpbGVwcmVmaXgpOwotICAgICAgZGVsZXRlX2RlZl9maWxlID0gMTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IG5vIGV4cG9ydCBkZWZpbml0aW9uIGZpbGUgcHJvdmlkZWRcbiIpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAKLSAgICAgICAgICAgICAgICJkbGx3cmFwIHdpbGwgY3JlYXRlIG9uZSwgYnV0IG1heSBub3QgYmUgd2hhdCB5b3Ugd2FudFxuIik7Ci0gICAgfQotICAKLSAgLyogc2V0IHRoZSB0YXJnZXQgcGxhdGZvcm0uICovCi0gIGlmIChzdHJzdHIgKHRhcmdldCwgImN5Z3dpbjMyIikpCi0gICAgd2hpY2hfdGFyZ2V0ID0gQ1lHV0lOX1RBUkdFVDsKLSAgZWxzZSBpZiAoc3Ryc3RyICh0YXJnZXQsICJtaW5ndzMyIikpCi0gICAgd2hpY2hfdGFyZ2V0ID0gTUlOR1czMl9UQVJHRVQ7Ci0gIGVsc2UgCi0gICAgd2hpY2hfdGFyZ2V0ID0gVU5LTk9XTl9UQVJHRVQ7Ci0KLSAgLyogcmUtY3JlYXRlIHRoZSBjb21tYW5kIGxpbmVzIGFzIGEgc3RyaW5nLCB0YWtpbmcgY2FyZSB0byBxdW90ZSBzdHVmZi4gKi8KLSAgZGxsdG9vbF9jbWRsaW5lID0gZHluX3N0cmluZ19uZXcgKGNtZGxpbmVfbGVuKTsKLSAgaWYgKHZlcmJvc2UpCi0gICAgewotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgIiAtdiIpOwotICAgIH0KLSAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgIiAtLWRsbG5hbWUgIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIGRsbF9uYW1lKTsKLQotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgKytpKQotICAgIHsKLSAgICAgIGlmIChkbGx0b29sX2FyZ19pbmRpY2VzW2ldKQotICAgICAgICB7Ci0JICBjaGFyICphcmcgPSBzYXZlZF9hcmd2W2ldOwotICAgICAgICAgIGludCBxdW90ZSA9IChzdHJjaHIgKGFyZywgJyAnKSB8fCBzdHJjaHIgKGFyZywgJ1x0JykpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgCi0JICAgICAgICAgICAgICAgICAgICAgKHF1b3RlKSA/ICIgXCIiIDogIiAiKTsKLQkgIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIGFyZyk7Ci0JICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAKLQkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLQl9Ci0gICAgfQotCi0gIGRyaXZlcl9jbWRsaW5lID0gZHluX3N0cmluZ19uZXcgKGNtZGxpbmVfbGVuKTsKLSAgaWYgKCEgZHJpdmVyX2ZsYWdzIHx8IHN0cmxlbiAoZHJpdmVyX2ZsYWdzKSA9PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAod2hpY2hfdGFyZ2V0KQotICAgICAgICB7Ci0JY2FzZSBDWUdXSU5fVEFSR0VUOgotICAgICAgICAgIGRyaXZlcl9mbGFncyA9IGN5Z3dpbl9kcml2ZXJfZmxhZ3M7Ci0JICBicmVhazsKLQkKLQljYXNlIE1JTkdXMzJfVEFSR0VUOgotICAgICAgICAgIGRyaXZlcl9mbGFncyA9IG1pbmd3MzJfZHJpdmVyX2ZsYWdzOwotCSAgYnJlYWs7Ci0JCi0JZGVmYXVsdDoKLSAgICAgICAgICBkcml2ZXJfZmxhZ3MgPSBnZW5lcmljX2RyaXZlcl9mbGFnczsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgZHJpdmVyX2ZsYWdzKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAiIC1vICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsIGRsbF9maWxlX25hbWUpOwotCi0gIGlmICghIGVudHJ5X3BvaW50IHx8IHN0cmxlbiAoZW50cnlfcG9pbnQpID09IDApCi0gICAgewotICAgICAgc3dpdGNoICh3aGljaF90YXJnZXQpCi0gICAgICAgIHsKLQljYXNlIENZR1dJTl9UQVJHRVQ6Ci0JICBlbnRyeV9wb2ludCA9ICJfX2N5Z3dpbl9kbGxfZW50cnlAMTIiOwotCSAgYnJlYWs7Ci0JCi0JY2FzZSBNSU5HVzMyX1RBUkdFVDoKLQkgIGVudHJ5X3BvaW50ID0gIl9EbGxNYWluQ1JUU3RhcnR1cEAxMiI7Ci0JICBicmVhazsKLQkKLQlkZWZhdWx0OgotICAgICAgICAgIGVudHJ5X3BvaW50ID0gIl9EbGxNYWluQDEyIjsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgIiAtV2wsLWUsIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgZW50cnlfcG9pbnQpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAiIC0tZXhjbHVkZS1zeW1ib2w9Iik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIAotICAgICAgICAgICAgICAgICAgICAgKGVudHJ5X3BvaW50WzBdID09ICdfJykgPyBlbnRyeV9wb2ludCsxIDogZW50cnlfcG9pbnQpOwotCi0gIGlmICghIGltYWdlX2Jhc2Vfc3RyIHx8IHN0cmxlbiAoaW1hZ2VfYmFzZV9zdHIpID09IDApCi0gICAgewotICAgICAgY2hhciAqdG1wYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc2l6ZW9mICgiMHgxMjM0NTY3OCIpICsgMSk7Ci0gICAgICB1bnNpZ25lZCBsb25nIGhhc2ggPSBzdHJoYXNoIChkbGxfZmlsZV9uYW1lKTsKLSAgICAgIHNwcmludGYgKHRtcGJ1ZiwgIjB4JS44bFgiLCAweDYwMDAwMDAwfCgoaGFzaDw8MTYpJjB4RkZDMDAwMCkpOwotICAgICAgaW1hZ2VfYmFzZV9zdHIgPSB0bXBidWY7Ci0gICAgfQotCi0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgIiAtV2wsLS1pbWFnZS1iYXNlLCIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsIGltYWdlX2Jhc2Vfc3RyKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICB7Ci0gICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsICIgLXYiKTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7ICsraSkKLSAgICB7Ci0gICAgICBpZiAoZHJpdmVyX2FyZ19pbmRpY2VzW2ldKQotICAgICAgICB7Ci0JICBjaGFyICphcmcgPSBzYXZlZF9hcmd2W2ldOwotICAgICAgICAgIGludCBxdW90ZSA9IChzdHJjaHIgKGFyZywgJyAnKSB8fCBzdHJjaHIgKGFyZywgJ1x0JykpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAKLQkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIiBcIiIgOiAiICIpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCBhcmcpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAKLQkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLQl9Ci0gICAgfQotICAKLSAgLyoKLSAgICogU3RlcCBwcmUtMS4gSWYgbm8gLS1kZWYgPEVYUE9SVF9ERUY+IGlzIHNwZWNpZmllZCwgdGhlbiBjcmVhdGUgaXQKLSAgICogYW5kIHRoZW4gcGFzcyBpdCBvbi4KLSAgICovCi0gIAotICBpZiAoISBkZWZfZmlsZV9zZWVuKSAKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGR5bl9zdHJpbmdfdCBzdGVwX3ByZTE7Ci0KLSAgICAgIHN0ZXBfcHJlMSA9IGR5bl9zdHJpbmdfbmV3ICgxMDI0KTsKLQotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXBfcHJlMSwgZGxsdG9vbF9jbWRsaW5lLT5zKTsKLSAgICAgIGlmIChleHBvcnRfYWxsKQotCXsKLSAgICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLCAiIC0tZXhwb3J0LWFsbCAtLWV4Y2x1ZGUtc3ltYm9sPSIpOwotICAgICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsIAotCSAgIl9jeWd3aW5fZGxsX2VudHJ5QDEyLERsbE1haW5DUlRTdGFydHVwQDEyLERsbE1haW5AMTIsRGxsRW50cnlQb2ludEAxMiIpOwotCX0KLSAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsICIgLS1vdXRwdXQtZGVmICIpOwotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXBfcHJlMSwgZGVmX2ZpbGVfbmFtZSk7Ci0KLSAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyArK2kpCi0JewotCSAgaWYgKGRyaXZlcl9hcmdfaW5kaWNlc1tpXSkKLQkgICAgewotCSAgICAgIGNoYXIgKmFyZyA9IHNhdmVkX2FyZ3ZbaV07Ci0JICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoYXJnKTsKLQkgICAgICBpZiAobGVuID49IDIgJiYgYXJnW2xlbi0yXSA9PSAnLicgCi0JICAgICAgICAgICYmIChhcmdbbGVuLTFdID09ICdvJyB8fCBhcmdbbGVuLTFdID09ICdhJykpCi0JCXsKLQkJICBpbnQgcXVvdGUgPSAoc3RyY2hyIChhcmcsICcgJykgfHwgc3RyY2hyIChhcmcsICdcdCcpKTsKLQkJICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLAotCQkJCSAgICAgKHF1b3RlKSA/ICIgXCIiIDogIiAiKTsKLQkJICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLCBhcmcpOwotCQkgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsCi0JCQkJICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocnVuIChkbGx0b29sX25hbWUsIHN0ZXBfcHJlMS0+cykpCi0JY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgICAKLSAgICAgIGR5bl9zdHJpbmdfZGVsZXRlIChzdGVwX3ByZTEpOwotICAgIH0KLQotICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAiIC0tZGVmICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCBkZWZfZmlsZV9uYW1lKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJETExUT09MIG5hbWUgICAgOiAlc1xuIiwgZGxsdG9vbF9uYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkRMTFRPT0wgb3B0aW9ucyA6ICVzXG4iLCBkbGx0b29sX2NtZGxpbmUtPnMpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRFJJVkVSIG5hbWUgICAgIDogJXNcbiIsIGRyaXZlcl9uYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkRSSVZFUiBvcHRpb25zICA6ICVzXG4iLCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgfQotIAotICAvKgotICAgKiBTdGVwIDEuIENhbGwgR0NDL0xEIHRvIGNyZWF0ZSBiYXNlIHJlbG9jYXRpb24gZmlsZS4gSWYgdXNpbmcgR0NDLCB0aGUKLSAgICogZHJpdmVyIGNvbW1hbmQgbGluZSB3aWxsIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgotICAgKiAgICAKLSAgICogICAgJSBnY2MgLVdsLC0tZGxsIC0tV2wsLS1iYXNlLWZpbGUsZm9vLmJhc2UgW3Jlc3Qgb2YgY29tbWFuZCBsaW5lXQotICAgKgotICAgKiBJZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGEgYmFzZSBuYW1lLCBjcmVhdGUgdGVtcG9yYXJ5IG9uZSB0aGF0Ci0gICAqIGlzIGRlbGV0ZWQgYXQgZXhpdC4KLSAgICoKLSAgICovCi0gIAotICBpZiAoISBiYXNlX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBjaGFyICpmaWxlcHJlZml4ID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKLSAgICAgIGJhc2VfZmlsZV9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaWxlcHJlZml4KSArIDYpOwotICAgICAgc3ByaW50ZiAoYmFzZV9maWxlX25hbWUsICIlcy5iYXNlIiwgCi0gICAgICAgICAgICAgICAoZG9udGRlbHRlbXBzKSA/IG15YmFzZW5hbWUgKGZpbGVwcmVmaXgpIDogZmlsZXByZWZpeCk7Ci0gICAgICBkZWxldGVfYmFzZV9maWxlID0gMTsKLSAgICAgIGZyZWUgKGZpbGVwcmVmaXgpOwotICAgIH0KLSAgCi0gIHsKLSAgICBpbnQgcXVvdGU7Ci0KLSAgICBkeW5fc3RyaW5nX3Qgc3RlcDEgPSBkeW5fc3RyaW5nX25ldyAoZHJpdmVyX2NtZGxpbmUtPmxlbmd0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGJhc2VfZmlsZV9uYW1lKQotCQkJCSAgICAgICAgICsgMjApOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgIi1XbCwtLWJhc2UtZmlsZSwiKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoYmFzZV9maWxlX25hbWUsICdcdCcpKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDEsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgYmFzZV9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAxLCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDEtPnMpKQotICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgCi0gICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXAxKTsKLSAgfQotCi0KLQotICAvKgotICAgKiBTdGVwIDIuIGdlbmVyYXRlIHRoZSBleHAgZmlsZSBieSBydW5uaW5nIGRsbHRvb2wuIAotICAgKiBkbGx0b29sIGNvbW1hbmQgbGluZSB3aWxsIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgotICAgKiAgICAKLSAgICogICAgJSBkbGx0b29sIC1XbCwtLWRsbCAtLVdsLC0tYmFzZS1maWxlLGZvby5iYXNlIFtyZXN0IG9mIGNvbW1hbmQgbGluZV0KLSAgICoKLSAgICogSWYgdGhlIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSBhIGJhc2UgbmFtZSwgY3JlYXRlIHRlbXBvcmFyeSBvbmUgdGhhdAotICAgKiBpcyBkZWxldGVkIGF0IGV4aXQuCi0gICAqCi0gICAqLwotICAKLSAgaWYgKCEgZXhwX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBjaGFyICpwID0gc3RycmNociAoZGxsX25hbWUsICcuJyk7Ci0gICAgICBzaXplX3QgcHJlZml4X2xlbiA9IChwKSA/IHAgLSBkbGxfbmFtZSA6IHN0cmxlbiAoZGxsX25hbWUpOwotICAgICAgZXhwX2ZpbGVfbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHByZWZpeF9sZW4gKyA0ICsgMSk7Ci0gICAgICBzdHJuY3B5IChleHBfZmlsZV9uYW1lLCBkbGxfbmFtZSwgcHJlZml4X2xlbik7Ci0gICAgICBleHBfZmlsZV9uYW1lW3ByZWZpeF9sZW5dID0gJ1wwJzsKLSAgICAgIHN0cmNhdCAoZXhwX2ZpbGVfbmFtZSwgIi5leHAiKTsKLSAgICAgIGRlbGV0ZV9leHBfZmlsZSA9IDE7Ci0gICAgfQotICAKLSAgewotICAgIGludCBxdW90ZTsKLSAgICBkeW5fc3RyaW5nX3Qgc3RlcDIgPSBkeW5fc3RyaW5nX25ldyAoZGxsdG9vbF9jbWRsaW5lLT5sZW5ndGggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChiYXNlX2ZpbGVfbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGV4cF9maWxlX25hbWUpCi0JCQkJICAgICAgICAgKyAyMCk7Ci0KLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsICItLWJhc2UtZmlsZSAiKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoYmFzZV9maWxlX25hbWUsICdcdCcpKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgYmFzZV9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiAiIDogIiAiKTsKLQotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgIi0tb3V0cHV0LWV4cCAiKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGV4cF9maWxlX25hbWUsICcgJykgCi0gICAgICAgICAgICAgfHwgc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnXHQnKSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAyLCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsIGV4cF9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0KLSAgICBpZiAoZGxsdG9vbF9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAyLCBkbGx0b29sX2NtZGxpbmUtPnMpOwotICAgICAgfQotCi0gICAgaWYgKHJ1biAoZGxsdG9vbF9uYW1lLCBzdGVwMi0+cykpCi0gICAgICBjbGVhbnVwX2FuZF9leGl0ICgxKTsKLSAgICAKLSAgICBkeW5fc3RyaW5nX2RlbGV0ZSAoc3RlcDIpOwotICB9Ci0KLSAgLyoKLSAgICogU3RlcCAzLiBDYWxsIEdDQy9MRCB0byBhZ2FpbiwgYWRkaW5nIHRoZSBleHAgZmlsZSB0aGlzIHRpbWUuCi0gICAqIGRyaXZlciBjb21tYW5kIGxpbmUgd2lsbCBsb29rIGxpa2UgdGhlIGZvbGxvd2luZzoKLSAgICogICAgCi0gICAqICAgICUgZ2NjIC1XbCwtLWRsbCAtLVdsLC0tYmFzZS1maWxlLGZvby5iYXNlIGZvby5leHAgW3Jlc3QgLi4uXQotICAgKi8KLQotICB7Ci0gICAgaW50IHF1b3RlOwotCi0gICAgZHluX3N0cmluZ190IHN0ZXAzID0gZHluX3N0cmluZ19uZXcgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChleHBfZmlsZV9uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmxlbiAoYmFzZV9maWxlX25hbWUpCi0JCQkJICAgICAgICAgKyAyMCk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCAiLVdsLC0tYmFzZS1maWxlLCIpOwotICAgIHF1b3RlID0gKHN0cmNociAoYmFzZV9maWxlX25hbWUsICcgJykgCi0gICAgICAgICAgICAgfHwgc3RyY2hyIChiYXNlX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBiYXNlX2ZpbGVfbmFtZSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiICIgOiAiICIpOwotCi0gICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBleHBfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDMsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCi0gICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDMtPnMpKQotICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgCi0gICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXAzKTsKLSAgfQotCi0KLSAgLyoKLSAgICogU3RlcCA0LiBSdW4gRExMVE9PTCBhZ2FpbiB1c2luZyB0aGUgc2FtZSBjb21tYW5kIGxpbmUuCi0gICAqLwotCi0gIHsKLSAgICBpbnQgcXVvdGU7Ci0gICAgZHluX3N0cmluZ190IHN0ZXA0ID0gZHluX3N0cmluZ19uZXcgKGRsbHRvb2xfY21kbGluZS0+bGVuZ3RoIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmxlbiAoYmFzZV9maWxlX25hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChleHBfZmlsZV9uYW1lKQotCQkJCSAgICAgICAgICsgMjApOwotCi0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAiLS1iYXNlLWZpbGUgIik7Ci0gICAgcXVvdGUgPSAoc3RyY2hyIChiYXNlX2ZpbGVfbmFtZSwgJyAnKSAKLSAgICAgICAgICAgICB8fCBzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnXHQnKSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIGJhc2VfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIgIiA6ICIgIik7Ci0KLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsICItLW91dHB1dC1leHAgIik7Ci0gICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNCwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCBleHBfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCi0gICAgaWYgKGRsbHRvb2xfY21kbGluZS0+bGVuZ3RoKQotICAgICAgewotICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsICIgIik7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNCwgZGxsdG9vbF9jbWRsaW5lLT5zKTsKLSAgICAgIH0KLQotICAgIGlmIChvdXRwdXRfbGliX2ZpbGVfbmFtZSkKLSAgICAgIHsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAiIC0tb3V0cHV0LWxpYiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCBvdXRwdXRfbGliX2ZpbGVfbmFtZSk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkbGx0b29sX25hbWUsIHN0ZXA0LT5zKSkKLSAgICAgIGNsZWFudXBfYW5kX2V4aXQgKDEpOwotICAgIAotICAgIGR5bl9zdHJpbmdfZGVsZXRlIChzdGVwNCk7Ci0gIH0KLSAgCi0KLSAgLyoKLSAgICogU3RlcCA1LiBMaW5rIGl0IGFsbCB0b2dldGhlciBhbmQgYmUgZG9uZSB3aXRoIGl0LgotICAgKiBkcml2ZXIgY29tbWFuZCBsaW5lIHdpbGwgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmc6Ci0gICAqICAgIAotICAgKiAgICAlIGdjYyAtV2wsLS1kbGwgZm9vLmV4cCBbcmVzdCAuLi5dCi0gICAqCi0gICAqLwotCi0gIHsKLSAgICBpbnQgcXVvdGU7Ci0KLSAgICBkeW5fc3RyaW5nX3Qgc3RlcDUgPSBkeW5fc3RyaW5nX25ldyAoZHJpdmVyX2NtZGxpbmUtPmxlbmd0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGV4cF9maWxlX25hbWUpCi0JCQkJICAgICAgICAgKyAyMCk7Ci0gICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNSwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA1LCBleHBfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDUsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCi0gICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNSwgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA1LCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDUtPnMpKQotICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgCi0gICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXA1KTsKLSAgfQotCi0gIGNsZWFudXBfYW5kX2V4aXQgKDApOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZHluLXN0cmluZy5jIGIvYmludXRpbHMvZHluLXN0cmluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGEzMDQzLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2R5bi1zdHJpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKiBBbiBhYnN0cmFjdCBzdHJpbmcgZGF0YXR5cGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJrIE1pdGNoZWxsIChtYXJrQG1hcmttaXRjaGVsbC5jb20pLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0gICAKLSAgIEdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBsaXZlcyBpbiBhdCBsZWFzdCB0d28gcGxhY2VzOiBiaW51dGlscyBhbmQgZ2NjLgotICAgRG9uJ3QgY2hhbmdlIG9uZSB3aXRob3V0IHRoZSBvdGhlci4gICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpZmRlZiBJTl9HQ0MKLSNpbmNsdWRlICJzeXN0ZW0uaCIKLSNpbmNsdWRlICJnYW5zaWRlY2wuaCIKLSNlbHNlCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNlbmRpZgotI2luY2x1ZGUgImR5bi1zdHJpbmcuaCIKLQotZXh0ZXJuIGNoYXIgKnhtYWxsb2MgKCk7Ci1leHRlcm4gY2hhciAqeHJlYWxsb2MgKCk7Ci0KLS8qIENyZWF0ZSBhIG5ldyBkeW5hbWljIHN0cmluZyBjYXBhYmxlIG9mIGhvbGRpbmcgYXQgbGVhc3QgU1BBQ0UKLSAgIGNoYXJhY3RlcnMsIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMLiAgSWYgU1BBQ0UgaXMgMCwgaXQKLSAgIHdpbGwgYmUgc2lsZW50bHkgaW5jcmVhc2VkIHRvIDEuICAqLwotCi1keW5fc3RyaW5nX3QgCi1keW5fc3RyaW5nX25ldyAoc3BhY2UpCi0gICAgIGludCBzcGFjZTsKLXsKLSAgZHluX3N0cmluZ190IHJlc3VsdCA9IChkeW5fc3RyaW5nX3QpIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGR5bl9zdHJpbmcpKTsKLSAKLSAgaWYgKHNwYWNlID09IDApCi0gICAgLyogV2UgbmVlZCBhdCBsZWFzdCBvbmUgYnl0ZSBpbiB3aGljaCB0byBzdG9yZSB0aGUgdGVybWluYXRpbmcKLSAgICAgICBOVUwuICAqLwotICAgIHNwYWNlID0gMTsKLQotICByZXN1bHQtPmFsbG9jYXRlZCA9IHNwYWNlOwotICByZXN1bHQtPnMgPSAoY2hhciopIHhtYWxsb2MgKHNwYWNlKTsKLSAgcmVzdWx0LT5sZW5ndGggPSAwOwotICByZXN1bHQtPnNbMF0gPSAnXDAnOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIEZyZWUgdGhlIG1lbW9yeSB1c2VkIGJ5IERTLiAgKi8KLQotdm9pZCAKLWR5bl9zdHJpbmdfZGVsZXRlIChkcykKLSAgICAgZHluX3N0cmluZ190IGRzOwotewotICBmcmVlIChkcy0+cyk7Ci0gIGZyZWUgKGRzKTsKLX0KLQotLyogQXBwZW5kIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgUyB0byBEUywgcmVzaXppbmcgRFMgaWYKLSAgIG5lY2Vzc2FyeS4gICovCi0KLWR5bl9zdHJpbmdfdCAKLWR5bl9zdHJpbmdfYXBwZW5kIChkcywgcykKLSAgICAgZHluX3N0cmluZ190IGRzOwotICAgICBjaGFyICpzOwotewotICBpbnQgbGVuID0gc3RybGVuIChzKTsKLSAgZHluX3N0cmluZ19yZXNpemUgKGRzLCBkcy0+bGVuZ3RoICsgbGVuICsgMSAvKiAnXDAnICovKTsKLSAgc3RyY3B5IChkcy0+cyArIGRzLT5sZW5ndGgsIHMpOwotICBkcy0+bGVuZ3RoICs9IGxlbjsKLQotICByZXR1cm4gZHM7Ci19Ci0KLS8qIEluY3JlYXNlIHRoZSBjYXBhY2l0eSBvZiBEUyBzbyB0aGF0IGl0IGNhbiBob2xkIGF0IGxlYXN0IFNQQUNFCi0gICBjaGFyYWN0ZXJzLCBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTC4gIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QKLSAgIChhdCBwcmVzZW50KSByZWR1Y2UgdGhlIGNhcGFjaXR5IG9mIERTLiAgKi8KLQotZHluX3N0cmluZ190IAotZHluX3N0cmluZ19yZXNpemUgKGRzLCBzcGFjZSkKLSAgICAgZHluX3N0cmluZ190IGRzOwotICAgICBpbnQgc3BhY2U7Ci17Ci0gIGludCBuZXdfYWxsb2NhdGVkID0gZHMtPmFsbG9jYXRlZDsKLQotICB3aGlsZSAoc3BhY2UgPiBuZXdfYWxsb2NhdGVkKQotICAgIG5ld19hbGxvY2F0ZWQgKj0gMjsKLSAgICAKLSAgaWYgKG5ld19hbGxvY2F0ZWQgIT0gZHMtPmFsbG9jYXRlZCkKLSAgICB7Ci0gICAgICAvKiBXZSBhY3R1YWxseSBuZWVkIG1vcmUgc3BhY2UuICAqLwotICAgICAgZHMtPmFsbG9jYXRlZCA9IG5ld19hbGxvY2F0ZWQ7Ci0gICAgICBkcy0+cyA9IChjaGFyKikgeHJlYWxsb2MgKGRzLT5zLCBkcy0+YWxsb2NhdGVkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGRzOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZHluLXN0cmluZy5oIGIvYmludXRpbHMvZHluLXN0cmluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjJiYmJmLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2R5bi1zdHJpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIEFuIGFic3RyYWN0IHN0cmluZyBkYXRhdHlwZS4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcmsgTWl0Y2hlbGwgKG1hcmtAbWFya21pdGNoZWxsLmNvbSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLSAgIAotICAgR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGxpdmVzIGluIGF0IGxlYXN0IHR3byBwbGFjZXM6IGJpbnV0aWxzIGFuZCBnY2MuCi0gICBEb24ndCBjaGFuZ2Ugb25lIHdpdGhvdXQgdGhlIG90aGVyLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZHluX3N0cmluZwotewotICBpbnQgYWxsb2NhdGVkOyAvKiBUaGUgYW1vdW50IG9mIHNwYWNlIGFsbG9jYXRlZCBmb3IgdGhlIHN0cmluZy4gICovCi0gIGludCBsZW5ndGg7IC8qIFRoZSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuICAqLwotICBjaGFyICpzOyAvKiBUaGUgc3RyaW5nIGl0c2VsZiwgTlVMLXRlcm1pbmF0ZWQuICAqLwotfSogZHluX3N0cmluZ190OwotCi1leHRlcm4gZHluX3N0cmluZ190IGR5bl9zdHJpbmdfbmV3ICAgICAgUEFSQU1TKChpbnQpKTsKLWV4dGVybiB2b2lkIGR5bl9zdHJpbmdfZGVsZXRlICAgICAgICAgICBQQVJBTVMoKGR5bl9zdHJpbmdfdCkpOwotZXh0ZXJuIGR5bl9zdHJpbmdfdCBkeW5fc3RyaW5nX2FwcGVuZCAgIFBBUkFNUygoZHluX3N0cmluZ190LCBjaGFyKikpOwotZXh0ZXJuIGR5bl9zdHJpbmdfdCBkeW5fc3RyaW5nX3Jlc2l6ZSAgIFBBUkFNUygoZHluX3N0cmluZ190LCBpbnQpKTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2ZpbGVtb2RlLmMgYi9iaW51dGlscy9maWxlbW9kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGI1MmJhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2ZpbGVtb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyogZmlsZW1vZGUuYyAtLSBtYWtlIGEgc3RyaW5nIGRlc2NyaWJpbmcgZmlsZSBtb2RlcwotICAgQ29weXJpZ2h0IChDKSAxOTg1LCA5MCwgOTEsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0MCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLXN0YXRpYyBjaGFyIGZ0eXBlbGV0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIHNldHN0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGNoYXIgKikpOwotCi0vKiBmaWxlbW9kZXN0cmluZyAtIGZpbGwgaW4gc3RyaW5nIFNUUiB3aXRoIGFuIGxzLXN0eWxlIEFTQ0lJCi0gICByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RfbW9kZSBmaWVsZCBvZiBmaWxlIHN0YXRzIGJsb2NrIFNUQVRQLgotICAgMTAgY2hhcmFjdGVycyBhcmUgc3RvcmVkIGluIFNUUjsgbm8gdGVybWluYXRpbmcgbnVsbCBpcyBhZGRlZC4KLSAgIFRoZSBjaGFyYWN0ZXJzIHN0b3JlZCBpbiBTVFIgYXJlOgotCi0gICAwCUZpbGUgdHlwZS4gICdkJyBmb3IgZGlyZWN0b3J5LCAnYycgZm9yIGNoYXJhY3RlcgotCXNwZWNpYWwsICdiJyBmb3IgYmxvY2sgc3BlY2lhbCwgJ20nIGZvciBtdWx0aXBsZXgsCi0JJ2wnIGZvciBzeW1ib2xpYyBsaW5rLCAncycgZm9yIHNvY2tldCwgJ3AnIGZvciBmaWZvLAotCSctJyBmb3IgYW55IG90aGVyIGZpbGUgdHlwZQotCi0gICAxCSdyJyBpZiB0aGUgb3duZXIgbWF5IHJlYWQsICctJyBvdGhlcndpc2UuCi0KLSAgIDIJJ3cnIGlmIHRoZSBvd25lciBtYXkgd3JpdGUsICctJyBvdGhlcndpc2UuCi0KLSAgIDMJJ3gnIGlmIHRoZSBvd25lciBtYXkgZXhlY3V0ZSwgJ3MnIGlmIHRoZSBmaWxlIGlzCi0Jc2V0LXVzZXItaWQsICctJyBvdGhlcndpc2UuCi0JJ1MnIGlmIHRoZSBmaWxlIGlzIHNldC11c2VyLWlkLCBidXQgdGhlIGV4ZWN1dGUKLQliaXQgaXNuJ3Qgc2V0LgotCi0gICA0CSdyJyBpZiBncm91cCBtZW1iZXJzIG1heSByZWFkLCAnLScgb3RoZXJ3aXNlLgotCi0gICA1CSd3JyBpZiBncm91cCBtZW1iZXJzIG1heSB3cml0ZSwgJy0nIG90aGVyd2lzZS4KLQotICAgNgkneCcgaWYgZ3JvdXAgbWVtYmVycyBtYXkgZXhlY3V0ZSwgJ3MnIGlmIHRoZSBmaWxlIGlzCi0Jc2V0LWdyb3VwLWlkLCAnLScgb3RoZXJ3aXNlLgotCSdTJyBpZiBpdCBpcyBzZXQtZ3JvdXAtaWQgYnV0IG5vdCBleGVjdXRhYmxlLgotCi0gICA3CSdyJyBpZiBhbnkgdXNlciBtYXkgcmVhZCwgJy0nIG90aGVyd2lzZS4KLQotICAgOAkndycgaWYgYW55IHVzZXIgbWF5IHdyaXRlLCAnLScgb3RoZXJ3aXNlLgotCi0gICA5CSd4JyBpZiBhbnkgdXNlciBtYXkgZXhlY3V0ZSwgJ3QnIGlmIHRoZSBmaWxlIGlzICJzdGlja3kiCi0JKHdpbGwgYmUgcmV0YWluZWQgaW4gc3dhcCBzcGFjZSBhZnRlciBleGVjdXRpb24pLCAnLScKLQlvdGhlcndpc2UuCi0JJ1QnIGlmIHRoZSBmaWxlIGlzIHN0aWNreSBidXQgbm90IGV4ZWN1dGFibGUuICovCi0KLSNpZiAwCi0KLS8qIFRoaXMgaXMgbm90IHVzZWQ7IG9ubHkgbW9kZV9zdHJpbmcgaXMgdXNlZC4gICovCi0KLXZvaWQKLWZpbGVtb2Rlc3RyaW5nIChzdGF0cCwgc3RyKQotICAgICBzdHJ1Y3Qgc3RhdCAqc3RhdHA7Ci0gICAgIGNoYXIgKnN0cjsKLXsKLSAgbW9kZV9zdHJpbmcgKCh1bnNpZ25lZCBsb25nKSBzdGF0cC0+c3RfbW9kZSwgc3RyKTsKLX0KLQotI2VuZGlmCi0KLS8qIEdldCBkZWZpbml0aW9ucyBmb3IgdGhlIGZpbGUgcGVybWlzc2lvbiBiaXRzLiAgKi8KLQotI2lmbmRlZiBTX0lSV1hVCi0jZGVmaW5lIFNfSVJXWFUgMDcwMAotI2VuZGlmCi0jaWZuZGVmIFNfSVJVU1IKLSNkZWZpbmUgU19JUlVTUiAwNDAwCi0jZW5kaWYKLSNpZm5kZWYgU19JV1VTUgotI2RlZmluZSBTX0lXVVNSIDAyMDAKLSNlbmRpZgotI2lmbmRlZiBTX0lYVVNSCi0jZGVmaW5lIFNfSVhVU1IgMDEwMAotI2VuZGlmCi0KLSNpZm5kZWYgU19JUldYRwotI2RlZmluZSBTX0lSV1hHIDAwNzAKLSNlbmRpZgotI2lmbmRlZiBTX0lSR1JQCi0jZGVmaW5lIFNfSVJHUlAgMDA0MAotI2VuZGlmCi0jaWZuZGVmIFNfSVdHUlAKLSNkZWZpbmUgU19JV0dSUCAwMDIwCi0jZW5kaWYKLSNpZm5kZWYgU19JWEdSUAotI2RlZmluZSBTX0lYR1JQIDAwMTAKLSNlbmRpZgotCi0jaWZuZGVmIFNfSVJXWE8KLSNkZWZpbmUgU19JUldYTyAwMDA3Ci0jZW5kaWYKLSNpZm5kZWYgU19JUk9USAotI2RlZmluZSBTX0lST1RIIDAwMDQKLSNlbmRpZgotI2lmbmRlZiBTX0lXT1RICi0jZGVmaW5lIFNfSVdPVEggMDAwMgotI2VuZGlmCi0jaWZuZGVmIFNfSVhPVEgKLSNkZWZpbmUgU19JWE9USCAwMDAxCi0jZW5kaWYKLQotLyogTGlrZSBmaWxlbW9kZXN0cmluZywgYnV0IG9ubHkgdGhlIHJlbGV2YW50IHBhcnQgb2YgdGhlIGBzdHJ1Y3Qgc3RhdCcKLSAgIGlzIGdpdmVuIGFzIGFuIGFyZ3VtZW50LiAqLwotCi12b2lkCi1tb2RlX3N0cmluZyAobW9kZSwgc3RyKQotICAgICB1bnNpZ25lZCBsb25nIG1vZGU7Ci0gICAgIGNoYXIgKnN0cjsKLXsKLSAgc3RyWzBdID0gZnR5cGVsZXQgKCh1bnNpZ25lZCBsb25nKSBtb2RlKTsKLSAgc3RyWzFdID0gKG1vZGUgJiBTX0lSVVNSKSAhPSAwID8gJ3InIDogJy0nOwotICBzdHJbMl0gPSAobW9kZSAmIFNfSVdVU1IpICE9IDAgPyAndycgOiAnLSc7Ci0gIHN0clszXSA9IChtb2RlICYgU19JWFVTUikgIT0gMCA/ICd4JyA6ICctJzsKLSAgc3RyWzRdID0gKG1vZGUgJiBTX0lSR1JQKSAhPSAwID8gJ3InIDogJy0nOwotICBzdHJbNV0gPSAobW9kZSAmIFNfSVdHUlApICE9IDAgPyAndycgOiAnLSc7Ci0gIHN0cls2XSA9IChtb2RlICYgU19JWEdSUCkgIT0gMCA/ICd4JyA6ICctJzsKLSAgc3RyWzddID0gKG1vZGUgJiBTX0lST1RIKSAhPSAwID8gJ3InIDogJy0nOwotICBzdHJbOF0gPSAobW9kZSAmIFNfSVdPVEgpICE9IDAgPyAndycgOiAnLSc7Ci0gIHN0cls5XSA9IChtb2RlICYgU19JWE9USCkgIT0gMCA/ICd4JyA6ICctJzsKLSAgc2V0c3QgKCh1bnNpZ25lZCBsb25nKSBtb2RlLCBzdHIpOwotfQotCi0vKiBSZXR1cm4gYSBjaGFyYWN0ZXIgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBmaWxlIGRlc2NyaWJlZCBieQotICAgZmlsZSBtb2RlIEJJVFM6Ci0gICAnZCcgZm9yIGRpcmVjdG9yaWVzCi0gICAnYicgZm9yIGJsb2NrIHNwZWNpYWwgZmlsZXMKLSAgICdjJyBmb3IgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZXMKLSAgICdtJyBmb3IgbXVsdGlwbGV4b3IgZmlsZXMKLSAgICdsJyBmb3Igc3ltYm9saWMgbGlua3MKLSAgICdzJyBmb3Igc29ja2V0cwotICAgJ3AnIGZvciBmaWZvcwotICAgJy0nIGZvciBhbnkgb3RoZXIgZmlsZSB0eXBlLiAqLwotCi0jaWZuZGVmIFNfSVNESVIKLSNpZmRlZiBTX0lGRElSCi0jZGVmaW5lIFNfSVNESVIoaSkgKCgoaSkgJiBTX0lGTVQpID09IFNfSUZESVIpCi0jZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZESVIpICovCi0jZGVmaW5lIFNfSVNESVIoaSkgKCgoaSkgJiAwMTcwMDAwKSA9PSAwNDAwMDApCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lGRElSKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JU0RJUikgKi8KLQotI2lmbmRlZiBTX0lTQkxLCi0jaWZkZWYgU19JRkJMSwotI2RlZmluZSBTX0lTQkxLKGkpICgoKGkpICYgU19JRk1UKSA9PSBTX0lGQkxLKQotI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGQkxLKSAqLwotI2RlZmluZSBTX0lTQkxLKGkpIDAKLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSUZCTEspICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lTQkxLKSAqLwotCi0jaWZuZGVmIFNfSVNDSFIKLSNpZmRlZiBTX0lGQ0hSCi0jZGVmaW5lIFNfSVNDSFIoaSkgKCgoaSkgJiBTX0lGTVQpID09IFNfSUZDSFIpCi0jZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZDSFIpICovCi0jZGVmaW5lIFNfSVNDSFIoaSkgMAotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JRkNIUikgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNDSFIpICovCi0KLSNpZm5kZWYgU19JU0ZJRk8KLSNpZmRlZiBTX0lGSUZPCi0jZGVmaW5lIFNfSVNGSUZPKGkpICgoKGkpICYgU19JRk1UKSA9PSBTX0lGSUZPKQotI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGSUZPKSAqLwotI2RlZmluZSBTX0lTRklGTyhpKSAwCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lGSUZPKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JU0ZJRk8pICovCi0KLSNpZm5kZWYgU19JU1NPQ0sKLSNpZmRlZiBTX0lGU09DSwotI2RlZmluZSBTX0lTU09DSyhpKSAoKChpKSAmIFNfSUZNVCkgPT0gU19JRlNPQ0spCi0jZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZTT0NLKSAqLwotI2RlZmluZSBTX0lTU09DSyhpKSAwCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lGU09DSykgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNTT0NLKSAqLwotCi0jaWZuZGVmIFNfSVNMTksKLSNpZmRlZiBTX0lGTE5LCi0jZGVmaW5lIFNfSVNMTksoaSkgKCgoaSkgJiBTX0lGTVQpID09IFNfSUZMTkspCi0jZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZMTkspICovCi0jZGVmaW5lIFNfSVNMTksoaSkgMAotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JRkxOSykgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNMTkspICovCi0KLXN0YXRpYyBjaGFyCi1mdHlwZWxldCAoYml0cykKLSAgICAgdW5zaWduZWQgbG9uZyBiaXRzOwotewotICBpZiAoU19JU0RJUiAoYml0cykpCi0gICAgcmV0dXJuICdkJzsKLSAgaWYgKFNfSVNMTksgKGJpdHMpKQotICAgIHJldHVybiAnbCc7Ci0gIGlmIChTX0lTQkxLIChiaXRzKSkKLSAgICByZXR1cm4gJ2InOwotICBpZiAoU19JU0NIUiAoYml0cykpCi0gICAgcmV0dXJuICdjJzsKLSAgaWYgKFNfSVNTT0NLIChiaXRzKSkKLSAgICByZXR1cm4gJ3MnOwotICBpZiAoU19JU0ZJRk8gKGJpdHMpKQotICAgIHJldHVybiAncCc7Ci0KLSNpZmRlZiBTX0lGTVQKLSNpZmRlZiBTX0lGTVBDCi0gIGlmICgoYml0cyAmIFNfSUZNVCkgPT0gU19JRk1QQwotICAgICAgfHwgKGJpdHMgJiBTX0lGTVQpID09IFNfSUZNUEIpCi0gICAgcmV0dXJuICdtJzsKLSNlbmRpZgotI2lmZGVmIFNfSUZOV0sKLSAgaWYgKChiaXRzICYgU19JRk1UKSA9PSBTX0lGTldLKQotICAgIHJldHVybiAnbic7Ci0jZW5kaWYKLSNlbmRpZgotCi0gIHJldHVybiAnLSc7Ci19Ci0KLS8qIFNldCB0aGUgJ3MnIGFuZCAndCcgZmxhZ3MgaW4gZmlsZSBhdHRyaWJ1dGVzIHN0cmluZyBDSEFSUywKLSAgIGFjY29yZGluZyB0byB0aGUgZmlsZSBtb2RlIEJJVFMuICovCi0KLXN0YXRpYyB2b2lkCi1zZXRzdCAoYml0cywgY2hhcnMpCi0gICAgIHVuc2lnbmVkIGxvbmcgYml0czsKLSAgICAgY2hhciAqY2hhcnM7Ci17Ci0jaWZkZWYgU19JU1VJRAotICBpZiAoYml0cyAmIFNfSVNVSUQpCi0gICAgewotICAgICAgaWYgKGNoYXJzWzNdICE9ICd4JykKLQkvKiBTZXQtdWlkLCBidXQgbm90IGV4ZWN1dGFibGUgYnkgb3duZXIuICovCi0JY2hhcnNbM10gPSAnUyc7Ci0gICAgICBlbHNlCi0JY2hhcnNbM10gPSAncyc7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgU19JU0dJRAotICBpZiAoYml0cyAmIFNfSVNHSUQpCi0gICAgewotICAgICAgaWYgKGNoYXJzWzZdICE9ICd4JykKLQkvKiBTZXQtZ2lkLCBidXQgbm90IGV4ZWN1dGFibGUgYnkgZ3JvdXAuICovCi0JY2hhcnNbNl0gPSAnUyc7Ci0gICAgICBlbHNlCi0JY2hhcnNbNl0gPSAncyc7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgU19JU1ZUWAotICBpZiAoYml0cyAmIFNfSVNWVFgpCi0gICAgewotICAgICAgaWYgKGNoYXJzWzldICE9ICd4JykKLQkvKiBTdGlja3ksIGJ1dCBub3QgZXhlY3V0YWJsZSBieSBvdGhlcnMuICovCi0JY2hhcnNbOV0gPSAnVCc7Ci0gICAgICBlbHNlCi0JY2hhcnNbOV0gPSAndCc7Ci0gICAgfQotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9iaW51dGlscy9pZWVlLmMgYi9iaW51dGlscy9pZWVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YTViODguLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvaWVlZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYwOSArMCwwIEBACi0vKiBpZWVlLmMgLS0gUmVhZCBhbmQgd3JpdGUgSUVFRS02OTUgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSByZWFkcyBhbmQgd3JpdGVzIElFRUUtNjk1IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiaWVlZS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYW4gZW50cnkgb24gdGhlIGJsb2NrIHN0YWNrLiAgKi8KLQotc3RydWN0IGllZWVfYmxvY2sKLXsKLSAgLyogVGhlIGtpbmQgb2YgYmxvY2suICAqLwotICBpbnQga2luZDsKLSAgLyogVGhlIHNvdXJjZSBmaWxlIG5hbWUsIGZvciBhIEJCNSBibG9jay4gICovCi0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAvKiBUaGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIHR5cGUsIGZvciBhIEJCNCBvciBCQjYgYmxvY2suICAqLwotICB1bnNpZ25lZCBpbnQgZm5pbmR4OwotICAvKiBUcnVlIGlmIHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgc2tpcHBlZC4gICovCi0gIGJvb2xlYW4gc2tpcDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBibG9jayBzdGFjay4gICovCi0KLSNkZWZpbmUgQkxPQ0tTVEFDS19TSVpFICgxNikKLQotc3RydWN0IGllZWVfYmxvY2tzdGFjawotewotICAvKiBUaGUgc3RhY2sgcG9pbnRlci4gICovCi0gIHN0cnVjdCBpZWVlX2Jsb2NrICpic3A7Ci0gIC8qIFRoZSBzdGFjay4gICovCi0gIHN0cnVjdCBpZWVlX2Jsb2NrIHN0YWNrW0JMT0NLU1RBQ0tfU0laRV07Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBmb3IgYSB2YXJpYWJsZS4gICovCi0KLXN0cnVjdCBpZWVlX3ZhcgotewotICAvKiBTdGFydCBvZiBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogTGVuZ3RoIG9mIG5hbWUuICAqLwotICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLSAgLyogVHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogU2xvdCBpZiB3ZSBtYWtlIGFuIGluZGlyZWN0IHR5cGUuICAqLwotICBkZWJ1Z190eXBlICpwc2xvdDsKLSAgLyogS2luZCBvZiB2YXJpYWJsZSBvciBmdW5jdGlvbi4gICovCi0gIGVudW0KLSAgICB7Ci0gICAgICBJRUVFX1VOS05PV04sCi0gICAgICBJRUVFX0VYVEVSTkFMLAotICAgICAgSUVFRV9HTE9CQUwsCi0gICAgICBJRUVFX1NUQVRJQywKLSAgICAgIElFRUVfTE9DQUwsCi0gICAgICBJRUVFX0ZVTkNUSU9OCi0gICAgfSBraW5kOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYWxsIHRoZSB2YXJpYWJsZXMuICAqLwotCi1zdHJ1Y3QgaWVlZV92YXJzCi17Ci0gIC8qIE51bWJlciBvZiBzbG90cyBhbGxvY2F0ZWQuICAqLwotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0gIC8qIFZhcmlhYmxlcy4gICovCi0gIHN0cnVjdCBpZWVlX3ZhciAqdmFyczsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGZvciBhIHR5cGUuICBXZSBuZWVkIHRoaXMgYmVjYXVzZQotICAgd2UgZG9uJ3Qgd2FudCB0byByZXByZXNlbnQgYml0ZmllbGRzIGFzIHJlYWwgdHlwZXMuICAqLwotCi1zdHJ1Y3QgaWVlZV90eXBlCi17Ci0gIC8qIFR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIC8qIFNsb3QgaWYgdGhpcyBpcyB0eXBlIGlzIHJlZmVyZW5jZWQgYmVmb3JlIGl0IGlzIGRlZmluZWQuICAqLwotICBkZWJ1Z190eXBlICpwc2xvdDsKLSAgLyogU2xvdHMgZm9yIGFyZ3VtZW50cyBpZiB3ZSBtYWtlIGluZGlyZWN0IHR5cGVzIGZvciB0aGVtLiAgKi8KLSAgZGVidWdfdHlwZSAqYXJnX3Nsb3RzOwotICAvKiBJZiB0aGlzIGlzIGEgYml0ZmllbGQsIHRoaXMgaXMgdGhlIHNpemUgaW4gYml0cy4gIElmIHRoaXMgaXMgbm90Ci0gICAgIGEgYml0ZmllbGQsIHRoaXMgaXMgemVyby4gICovCi0gIHVuc2lnbmVkIGxvbmcgYml0c2l6ZTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGFsbCB0aGUgdHlwZSBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBpZWVlX3R5cGVzCi17Ci0gIC8qIE51bWJlciBvZiBzbG90cyBhbGxvY2F0ZWQuICAqLwotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0gIC8qIFR5cGVzLiAgKi8KLSAgc3RydWN0IGllZWVfdHlwZSAqdHlwZXM7Ci0gIC8qIEJ1aWx0aW4gdHlwZXMuICAqLwotI2RlZmluZSBCVUlMVElOX1RZUEVfQ09VTlQgKDYwKQotICBkZWJ1Z190eXBlIGJ1aWx0aW5zW0JVSUxUSU5fVFlQRV9DT1VOVF07Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhIGxpbmtlZCBsYXN0IG9mIHN0cnVjdHMgd2l0aCB0aGVpciB0YWcgbmFtZXMsCi0gICBzbyB0aGF0IHdlIGNhbiBjb252ZXJ0IHRoZW0gdG8gQysrIGNsYXNzZXMgaWYgbmVjZXNzYXJ5LiAgKi8KLQotc3RydWN0IGllZWVfdGFnCi17Ci0gIC8qIE5leHQgdGFnLiAgKi8KLSAgc3RydWN0IGllZWVfdGFnICpuZXh0OwotICAvKiBUaGlzIHRhZyBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVGhlIHR5cGUgb2YgdGhlIHRhZy4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogVGhlIHRhZ2dlZCB0eXBlIGlzIGFuIGluZGlyZWN0IHR5cGUgcG9pbnRpbmcgYXQgdGhpcyBzbG90LiAgKi8KLSAgZGVidWdfdHlwZSBzbG90OwotICAvKiBUaGlzIGlzIGFuIGFycmF5IG9mIHNsb3RzIHVzZWQgd2hlbiBhIGZpZWxkIHR5cGUgaXMgY29udmVydGVkCi0gICAgIGludG8gYSBpbmRpcmVjdCB0eXBlLCBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIGxhdGVyIGNvbnZlcnRlZCBpbnRvCi0gICAgIGEgcmVmZXJlbmNlIHR5cGUuICAqLwotICBkZWJ1Z190eXBlICpmc2xvdHM7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyB0aGUgaW5mb3JtYXRpb24gd2UgcGFzcyBhcm91bmQgdG8gdGhlIHBhcnNpbmcKLSAgIGZ1bmN0aW9ucy4gICovCi0KLXN0cnVjdCBpZWVlX2luZm8KLXsKLSAgLyogVGhlIGRlYnVnZ2luZyBoYW5kbGUuICAqLwotICBQVFIgZGhhbmRsZTsKLSAgLyogVGhlIEJGRC4gICovCi0gIGJmZCAqYWJmZDsKLSAgLyogVGhlIHN0YXJ0IG9mIHRoZSBieXRlcyB0byBiZSBwYXJzZWQuICAqLwotICBjb25zdCBiZmRfYnl0ZSAqYnl0ZXM7Ci0gIC8qIFRoZSBlbmQgb2YgdGhlIGJ5dGVzIHRvIGJlIHBhcnNlZC4gICovCi0gIGNvbnN0IGJmZF9ieXRlICpwZW5kOwotICAvKiBUaGUgYmxvY2sgc3RhY2suICAqLwotICBzdHJ1Y3QgaWVlZV9ibG9ja3N0YWNrIGJsb2Nrc3RhY2s7Ci0gIC8qIFdoZXRoZXIgd2UgaGF2ZSBzZWVuIGEgQkIxIG9yIEJCMi4gICovCi0gIGJvb2xlYW4gc2F3X2ZpbGVuYW1lOwotICAvKiBUaGUgdmFyaWFibGVzLiAgKi8KLSAgc3RydWN0IGllZWVfdmFycyB2YXJzOwotICAvKiBUaGUgZ2xvYmFsIHZhcmlhYmxlcywgYWZ0ZXIgYSBnbG9iYWwgdHlwZWRlZiBibG9jay4gICovCi0gIHN0cnVjdCBpZWVlX3ZhcnMgKmdsb2JhbF92YXJzOwotICAvKiBUaGUgdHlwZXMuICAqLwotICBzdHJ1Y3QgaWVlZV90eXBlcyB0eXBlczsKLSAgLyogVGhlIGdsb2JhbCB0eXBlcywgYWZ0ZXIgYSBnbG9iYWwgdHlwZWRlZiBibG9jay4gICovCi0gIHN0cnVjdCBpZWVlX3R5cGVzICpnbG9iYWxfdHlwZXM7Ci0gIC8qIFRoZSBsaXN0IG9mIHRhZ2dlZCBzdHJ1Y3RzLiAgKi8KLSAgc3RydWN0IGllZWVfdGFnICp0YWdzOwotfTsKLQotLyogQmFzaWMgYnVpbHRpbiB0eXBlcywgbm90IGluY2x1ZGluZyB0aGUgcG9pbnRlcnMuICAqLwotCi1lbnVtIGJ1aWx0aW5fdHlwZXMKLXsKLSAgYnVpbHRpbl91bmtub3duID0gMCwKLSAgYnVpbHRpbl92b2lkID0gMSwKLSAgYnVpbHRpbl9zaWduZWRfY2hhciA9IDIsCi0gIGJ1aWx0aW5fdW5zaWduZWRfY2hhciA9IDMsCi0gIGJ1aWx0aW5fc2lnbmVkX3Nob3J0X2ludCA9IDQsCi0gIGJ1aWx0aW5fdW5zaWduZWRfc2hvcnRfaW50ID0gNSwKLSAgYnVpbHRpbl9zaWduZWRfbG9uZyA9IDYsCi0gIGJ1aWx0aW5fdW5zaWduZWRfbG9uZyA9IDcsCi0gIGJ1aWx0aW5fc2lnbmVkX2xvbmdfbG9uZyA9IDgsCi0gIGJ1aWx0aW5fdW5zaWduZWRfbG9uZ19sb25nID0gOSwKLSAgYnVpbHRpbl9mbG9hdCA9IDEwLAotICBidWlsdGluX2RvdWJsZSA9IDExLAotICBidWlsdGluX2xvbmdfZG91YmxlID0gMTIsCi0gIGJ1aWx0aW5fbG9uZ19sb25nX2RvdWJsZSA9IDEzLAotICBidWlsdGluX3F1b3RlZF9zdHJpbmcgPSAxNCwKLSAgYnVpbHRpbl9pbnN0cnVjdGlvbl9hZGRyZXNzID0gMTUsCi0gIGJ1aWx0aW5faW50ID0gMTYsCi0gIGJ1aWx0aW5fdW5zaWduZWQgPSAxNywKLSAgYnVpbHRpbl91bnNpZ25lZF9pbnQgPSAxOCwKLSAgYnVpbHRpbl9jaGFyID0gMTksCi0gIGJ1aWx0aW5fbG9uZyA9IDIwLAotICBidWlsdGluX3Nob3J0ID0gMjEsCi0gIGJ1aWx0aW5fdW5zaWduZWRfc2hvcnQgPSAyMiwKLSAgYnVpbHRpbl9zaG9ydF9pbnQgPSAyMywKLSAgYnVpbHRpbl9zaWduZWRfc2hvcnQgPSAyNCwKLSAgYnVpbHRpbl9iY2RfZmxvYXQgPSAyNQotfTsKLQotLyogVGhlc2UgYXJlIHRoZSB2YWx1ZXMgZm91bmQgaW4gdGhlIGRlcml2YXRpb24gZmxhZ3Mgb2YgYSAnYicKLSAgIGNvbXBvbmVudCByZWNvcmQgb2YgYSAnVCcgdHlwZSBleHRlbnNpb24gcmVjb3JkIGluIGEgQysrIHBtaXNjCi0gICByZWNvcmQuICBUaGVzZSBhcmUgYml0bWFza3MuICAqLwotCi0vKiBTZXQgZm9yIGEgcHJpdmF0ZSBiYXNlIGNsYXNzLCBjbGVhciBmb3IgYSBwdWJsaWMgYmFzZSBjbGFzcy4KLSAgIFByb3RlY3RlZCBiYXNlIGNsYXNzZXMgYXJlIG5vdCBzdXBwb3J0ZWQuICAqLwotI2RlZmluZSBCQVNFRkxBR1NfUFJJVkFURSAoMHgxKQotLyogU2V0IGZvciBhIHZpcnR1YWwgYmFzZSBjbGFzcy4gICovCi0jZGVmaW5lIEJBU0VGTEFHU19WSVJUVUFMICgweDIpCi0vKiBTZXQgZm9yIGEgZnJpZW5kIGNsYXNzLCBjbGVhciBmb3IgYSBiYXNlIGNsYXNzLiAgKi8KLSNkZWZpbmUgQkFTRUZMQUdTX0ZSSUVORCAoMHgxMCkKLQotLyogVGhlc2UgYXJlIHRoZSB2YWx1ZXMgZm91bmQgaW4gdGhlIHNwZWNzIGZsYWdzIG9mIGEgJ2QnLCAnbScsIG9yICd2JwotICAgY29tcG9uZW50IHJlY29yZCBvZiBhICdUJyB0eXBlIGV4dGVuc2lvbiByZWNvcmQgaW4gYSBDKysgcG1pc2MKLSAgIHJlY29yZC4gIFRoZSBzYW1lIGZsYWdzIGFyZSB1c2VkIGZvciBhICdNJyByZWNvcmQgaW4gYSBDKysgcG1pc2MKLSAgIHJlY29yZC4gICovCi0KLS8qIFRoZSBsb3dlciB0d28gYml0cyBob2xkIHZpc2liaWxpdHkgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBDWFhGTEFHU19WSVNJQklMSVRZICgweDMpCi0vKiBUaGlzIHZhbHVlIGluIHRoZSBsb3dlciB0d28gYml0cyBpbmRpY2F0ZXMgYSBwdWJsaWMgbWVtYmVyLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfVklTSUJJTElUWV9QVUJMSUMgKDB4MCkKLS8qIFRoaXMgdmFsdWUgaW4gdGhlIGxvd2VyIHR3byBiaXRzIGluZGljYXRlcyBhIHByaXZhdGUgbWVtYmVyLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfVklTSUJJTElUWV9QUklWQVRFICgweDEpCi0vKiBUaGlzIHZhbHVlIGluIHRoZSBsb3dlciB0d28gYml0cyBpbmRpY2F0ZXMgYSBwcm90ZWN0ZWQgbWVtYmVyLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfVklTSUJJTElUWV9QUk9URUNURUQgKDB4MikKLS8qIFNldCBmb3IgYSBzdGF0aWMgbWVtYmVyLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfU1RBVElDICgweDQpCi0vKiBTZXQgZm9yIGEgdmlydHVhbCBvdmVycmlkZS4gICovCi0jZGVmaW5lIENYWEZMQUdTX09WRVJSSURFICgweDgpCi0vKiBTZXQgZm9yIGEgZnJpZW5kIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfRlJJRU5EICgweDEwKQotLyogU2V0IGZvciBhIGNvbnN0IGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfQ09OU1QgKDB4MjApCi0vKiBTZXQgZm9yIGEgdm9sYXRpbGUgZnVuY3Rpb24uICAqLwotI2RlZmluZSBDWFhGTEFHU19WT0xBVElMRSAoMHg0MCkKLS8qIFNldCBmb3IgYW4gb3ZlcmxvYWRlZCBmdW5jdGlvbi4gICovCi0jZGVmaW5lIENYWEZMQUdTX09WRVJMT0FERUQgKDB4ODApCi0vKiBTZXQgZm9yIGFuIG9wZXJhdG9yIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfT1BFUkFUT1IgKDB4MTAwKQotLyogU2V0IGZvciBhIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IuICAqLwotI2RlZmluZSBDWFhGTEFHU19DVE9SRFRPUiAoMHg0MDApCi0vKiBTZXQgZm9yIGEgY29uc3RydWN0b3IuICAqLwotI2RlZmluZSBDWFhGTEFHU19DVE9SICgweDIwMCkKLS8qIFNldCBmb3IgYW4gaW5saW5lIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfSU5MSU5FICgweDgwMCkKLQotLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQgaWVlZV9lcnJvcgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgaWVlZV9lb2YgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqKSk7Ci1zdGF0aWMgY2hhciAqc2F2ZXN0cmluZyBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9udW1iZXIKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIGJmZF92bWEgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfaWQKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgY29uc3QgY2hhciAqKiwKLQkgICB1bnNpZ25lZCBsb25nICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9vcHRpb25hbF9pZAotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBjb25zdCBjaGFyICoqLAotCSAgIHVuc2lnbmVkIGxvbmcgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfZXhwcmVzc2lvbgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBkZWJ1Z190eXBlIGllZWVfYnVpbHRpbl90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2FsbG9jX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF90eXBlX2luZGV4Ci0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIGRlYnVnX3R5cGUgKikpOwotc3RhdGljIGludCBpZWVlX3JlZ25vX3RvX2dlbnJlZyBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1zdGF0aWMgaW50IGllZWVfZ2VucmVnX3RvX3JlZ25vIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX2llZWVfYmIgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2VfaWVlZV9iZSBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9pZWVlX25uIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX2llZWVfdHkgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2VfaWVlZV9hdG4gUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX2N4eF9taXNjCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9jeHhfY2xhc3MKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX2N4eF9kZWZhdWx0cwotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfcmVmZXJlbmNlCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVxdWlyZV9hc24KLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlcXVpcmVfYXRuNjUKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgY29uc3QgY2hhciAqKiwKLQkgICB1bnNpZ25lZCBsb25nICopKTsKLQotLyogUmVwb3J0IGFuIGVycm9yIGluIHRoZSBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1pZWVlX2Vycm9yIChpbmZvLCBwLCBzKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqcDsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgaWYgKHAgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogMHglbHg6ICVzICgweCV4KVxuIiwgYmZkX2dldF9maWxlbmFtZSAoaW5mby0+YWJmZCksCi0JICAgICAodW5zaWduZWQgbG9uZykgKHAgLSBpbmZvLT5ieXRlcyksIHMsICpwKTsKLSAgZWxzZQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlc1xuIiwgYmZkX2dldF9maWxlbmFtZSAoaW5mby0+YWJmZCksIHMpOwotfQotCi0vKiBSZXBvcnQgYW4gdW5leHBlY3RlZCBFT0YgaW4gdGhlIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWllZWVfZW9mIChpbmZvKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotewotICBpZWVlX2Vycm9yIChpbmZvLCAoY29uc3QgYmZkX2J5dGUgKikgTlVMTCwKLQkgICAgICBfKCJ1bmV4cGVjdGVkIGVuZCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24iKSk7Ci19Ci0KLS8qIFNhdmUgYSBzdHJpbmcgaW4gbWVtb3J5LiAgKi8KLQotc3RhdGljIGNoYXIgKgotc2F2ZXN0cmluZyAoc3RhcnQsIGxlbikKLSAgICAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuOwotewotICBjaGFyICpyZXQ7Ci0KLSAgcmV0ID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgMSk7Ci0gIG1lbWNweSAocmV0LCBzdGFydCwgbGVuKTsKLSAgcmV0W2xlbl0gPSAnXDAnOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBSZWFkIGEgbnVtYmVyIHdoaWNoIG11c3QgYmUgcHJlc2VudCBpbiBhbiBJRUVFIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsIHB2KQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICBiZmRfdm1hICpwdjsKLXsKLSAgcmV0dXJuIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCBwdiwgKGJvb2xlYW4gKikgTlVMTCk7Ci19Ci0KLS8qIFJlYWQgYSBudW1iZXIgaW4gYW4gSUVFRSBmaWxlLiAgSWYgcHByZXNlbnQgaXMgbm90IE5VTEwsIHRoZSBudW1iZXIKLSAgIG5lZWQgbm90IGJlIHRoZXJlLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsIHB2LCBwcHJlc2VudCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgYmZkX3ZtYSAqcHY7Ci0gICAgIGJvb2xlYW4gKnBwcmVzZW50OwotewotICBpZWVlX3JlY29yZF9lbnVtX3R5cGUgYjsKLQotICBpZiAoKnBwID49IGluZm8tPnBlbmQpCi0gICAgewotICAgICAgaWYgKHBwcmVzZW50ICE9IE5VTEwpCi0JewotCSAgKnBwcmVzZW50ID0gZmFsc2U7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICBpZWVlX2VvZiAoaW5mbyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGIgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAqKnBwOwotICArKypwcDsKLQotICBpZiAoYiA8PSBpZWVlX251bWJlcl9lbmRfZW51bSkKLSAgICB7Ci0gICAgICAqcHYgPSAoYmZkX3ZtYSkgYjsKLSAgICAgIGlmIChwcHJlc2VudCAhPSBOVUxMKQotCSpwcHJlc2VudCA9IHRydWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGIgPj0gaWVlZV9udW1iZXJfcmVwZWF0X3N0YXJ0X2VudW0gJiYgYiA8PSBpZWVlX251bWJlcl9yZXBlYXRfZW5kX2VudW0pCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGkgPSAoaW50KSBiIC0gKGludCkgaWVlZV9udW1iZXJfcmVwZWF0X3N0YXJ0X2VudW07Ci0gICAgICBpZiAoKnBwICsgaSAtIDEgPj0gaW5mby0+cGVuZCkKLQl7Ci0JICBpZWVlX2VvZiAoaW5mbyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAqcHYgPSAwOwotICAgICAgZm9yICg7IGkgPiAwOyBpLS0pCi0JewotCSAgKnB2IDw8PSA4OwotCSAgKnB2ICs9ICoqcHA7Ci0JICArKypwcDsKLQl9Ci0KLSAgICAgIGlmIChwcHJlc2VudCAhPSBOVUxMKQotCSpwcHJlc2VudCA9IHRydWU7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAocHByZXNlbnQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAtLSpwcDsKLSAgICAgICpwcHJlc2VudCA9IGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGllZWVfZXJyb3IgKGluZm8sICpwcCAtIDEsIF8oImludmFsaWQgbnVtYmVyIikpOwotICByZXR1cm4gZmFsc2U7ICAKLX0KLQotLyogUmVhZCBhIHJlcXVpcmVkIHN0cmluZyBmcm9tIGFuIElFRUUgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlYWRfaWQgKGluZm8sIHBwLCBwbmFtZSwgcG5hbWxlbikKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgY29uc3QgY2hhciAqKnBuYW1lOwotICAgICB1bnNpZ25lZCBsb25nICpwbmFtbGVuOwotewotICByZXR1cm4gaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgcG5hbWUsIHBuYW1sZW4sIChib29sZWFuICopIE5VTEwpOwotfQotCi0vKiBSZWFkIGEgc3RyaW5nIGZyb20gYW4gSUVFRSBmaWxlLiAgSWYgcHByZXNlbnQgaXMgbm90IE5VTEwsIHRoZQotICAgc3RyaW5nIGlzIG9wdGlvbmFsLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9vcHRpb25hbF9pZCAoaW5mbywgcHAsIHBuYW1lLCBwbmFtbGVuLCBwcHJlc2VudCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgY29uc3QgY2hhciAqKnBuYW1lOwotICAgICB1bnNpZ25lZCBsb25nICpwbmFtbGVuOwotICAgICBib29sZWFuICpwcHJlc2VudDsKLXsKLSAgYmZkX2J5dGUgYjsKLSAgdW5zaWduZWQgbG9uZyBsZW47Ci0KLSAgaWYgKCpwcCA+PSBpbmZvLT5wZW5kKQotICAgIHsKLSAgICAgIGllZWVfZW9mIChpbmZvKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYiA9ICoqcHA7Ci0gICsrKnBwOwotCi0gIGlmIChiIDw9IDB4N2YpCi0gICAgbGVuID0gYjsKLSAgZWxzZSBpZiAoKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgYiA9PSBpZWVlX2V4dGVuc2lvbl9sZW5ndGhfMV9lbnVtKQotICAgIHsKLSAgICAgIGxlbiA9ICoqcHA7Ci0gICAgICArKypwcDsKLSAgICB9Ci0gIGVsc2UgaWYgKChpZWVlX3JlY29yZF9lbnVtX3R5cGUpIGIgPT0gaWVlZV9leHRlbnNpb25fbGVuZ3RoXzJfZW51bSkKLSAgICB7Ci0gICAgICBsZW4gPSAoKipwcCA8PCA4KSArICgqcHApWzFdOwotICAgICAgKnBwICs9IDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHBwcmVzZW50ICE9IE5VTEwpCi0JewotCSAgLS0qcHA7Ci0JICAqcHByZXNlbnQgPSBmYWxzZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGllZWVfZXJyb3IgKGluZm8sICpwcCAtIDEsIF8oImludmFsaWQgc3RyaW5nIGxlbmd0aCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCh1bnNpZ25lZCBsb25nKSAoaW5mby0+cGVuZCAtICpwcCkgPCBsZW4pCi0gICAgewotICAgICAgaWVlZV9lb2YgKGluZm8pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAqcG5hbWUgPSAoY29uc3QgY2hhciAqKSAqcHA7Ci0gICpwbmFtbGVuID0gbGVuOwotICAqcHAgKz0gbGVuOwotCi0gIGlmIChwcHJlc2VudCAhPSBOVUxMKQotICAgICpwcHJlc2VudCA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYW4gZXhwcmVzc2lvbiBmcm9tIGFuIElFRUUgZmlsZS4gIFNpbmNlIHRoaXMgY29kZSBpcyBvbmx5IHVzZWQKLSAgIHRvIHBhcnNlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgSSBoYXZlbid0IGJvdGhlcmVkIHRvIHdyaXRlIGEgZnVsbAotICAgYmxvd24gSUVFRSBleHByZXNzaW9uIHBhcnNlci4gIEkndmUgb25seSB0aHJvd24gaW4gdGhlIHRoaW5ncyBJJ3ZlCi0gICBzZWVuIGluIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgY2FuIGJlIGVhc2lseSBleHRlbmRlZCBpZgotICAgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9leHByZXNzaW9uIChpbmZvLCBwcCwgcHYpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci0gICAgIGJmZF92bWEgKnB2OwotewotICBjb25zdCBiZmRfYnl0ZSAqZXhwcl9zdGFydDsKLSNkZWZpbmUgRVhQUl9TVEFDS19TSVpFICgxMCkKLSAgYmZkX3ZtYSBleHByX3N0YWNrW0VYUFJfU1RBQ0tfU0laRV07Ci0gIGJmZF92bWEgKmVzcDsKLQotICBleHByX3N0YXJ0ID0gKnBwOwotCi0gIGVzcCA9IGV4cHJfc3RhY2s7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICBib29sZWFuIHByZXNlbnQ7Ci0gICAgICBpZWVlX3JlY29yZF9lbnVtX3R5cGUgYzsKLQotICAgICAgc3RhcnQgPSAqcHA7Ci0KLSAgICAgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdmFsLCAmcHJlc2VudCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAocHJlc2VudCkKLQl7Ci0JICBpZiAoZXNwIC0gZXhwcl9zdGFjayA+PSBFWFBSX1NUQUNLX1NJWkUpCi0JICAgIHsKLQkgICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiZXhwcmVzc2lvbiBzdGFjayBvdmVyZmxvdyIpKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgICplc3ArKyA9IHZhbDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgYyA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICoqcHA7Ci0KLSAgICAgIGlmIChjID49IGllZWVfbW9kdWxlX2JlZ2lubmluZ19lbnVtKQotCWJyZWFrOwotCi0gICAgICArKypwcDsKLQotICAgICAgaWYgKGMgPT0gaWVlZV9jb21tYSkKLQlicmVhazsKLQotICAgICAgc3dpdGNoIChjKQotCXsKLQlkZWZhdWx0OgotCSAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVuc3VwcG9ydGVkIElFRUUgZXhwcmVzc2lvbiBvcGVyYXRvciIpKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX3ZhcmlhYmxlX1JfZW51bToKLQkgIHsKLQkgICAgYmZkX3ZtYSBpbmR4OwotCSAgICBhc2VjdGlvbiAqczsKLQotCSAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmluZHgpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgZm9yIChzID0gaW5mby0+YWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JICAgICAgaWYgKChiZmRfdm1hKSBzLT50YXJnZXRfaW5kZXggPT0gaW5keCkKLQkJYnJlYWs7Ci0JICAgIGlmIChzID09IE5VTEwpCi0JICAgICAgewotCQlpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5rbm93biBzZWN0aW9uIikpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAKLQkgICAgaWYgKGVzcCAtIGV4cHJfc3RhY2sgPj0gRVhQUl9TVEFDS19TSVpFKQotCSAgICAgIHsKLQkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oImV4cHJlc3Npb24gc3RhY2sgb3ZlcmZsb3ciKSk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgKmVzcCsrID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoaW5mby0+YWJmZCwgcyk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgaWVlZV9mdW5jdGlvbl9wbHVzX2VudW06Ci0JY2FzZSBpZWVlX2Z1bmN0aW9uX21pbnVzX2VudW06Ci0JICB7Ci0JICAgIGJmZF92bWEgdjEsIHYyOwotCi0JICAgIGlmIChlc3AgLSBleHByX3N0YWNrIDwgMikKLQkgICAgICB7Ci0JCWllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJleHByZXNzaW9uIHN0YWNrIHVuZGVyZmxvdyIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICB2MSA9ICotLWVzcDsKLQkgICAgdjIgPSAqLS1lc3A7Ci0JICAgICplc3ArKyA9IHYxICsgdjI7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChlc3AgLSAxICE9IGV4cHJfc3RhY2spCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgZXhwcl9zdGFydCwgXygiZXhwcmVzc2lvbiBzdGFjayBtaXNtYXRjaCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgKnB2ID0gKi0tZXNwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gYW4gSUVFRSBidWlsdGluIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHAsIGluZHgpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICpwOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLXsKLSAgUFRSIGRoYW5kbGU7Ci0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBpZiAoaW5keCA8IEJVSUxUSU5fVFlQRV9DT1VOVAotICAgICAgJiYgaW5mby0+dHlwZXMuYnVpbHRpbnNbaW5keF0gIT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHJldHVybiBpbmZvLT50eXBlcy5idWlsdGluc1tpbmR4XTsKLQotICBkaGFuZGxlID0gaW5mby0+ZGhhbmRsZTsKLQotICBpZiAoaW5keCA+PSAzMiAmJiBpbmR4IDwgNjQpCi0gICAgewotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChkaGFuZGxlLAotCQkJCSAgICAgIGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCBwLCBpbmR4IC0gMzIpKTsKLSAgICAgIGFzc2VydCAoaW5keCA8IEJVSUxUSU5fVFlQRV9DT1VOVCk7Ci0gICAgICBpbmZvLT50eXBlcy5idWlsdGluc1tpbmR4XSA9IHR5cGU7Ci0gICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgc3dpdGNoICgoZW51bSBidWlsdGluX3R5cGVzKSBpbmR4KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWVlZV9lcnJvciAoaW5mbywgcCwgXygidW5rbm93biBidWlsdGluIHR5cGUiKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGNhc2UgYnVpbHRpbl91bmtub3duOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIG5hbWUgPSBOVUxMOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdm9pZDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBuYW1lID0gInZvaWQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fc2lnbmVkX2NoYXI6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaWduZWQgY2hhciI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl91bnNpZ25lZF9jaGFyOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3NpZ25lZF9zaG9ydF9pbnQ6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaWduZWQgc2hvcnQgaW50IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Vuc2lnbmVkX3Nob3J0X2ludDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgc2hvcnQgaW50IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3NpZ25lZF9sb25nOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAic2lnbmVkIGxvbmciOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdW5zaWduZWRfbG9uZzoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgbG9uZyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9zaWduZWRfbG9uZ19sb25nOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAic2lnbmVkIGxvbmcgbG9uZyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl91bnNpZ25lZF9sb25nX2xvbmc6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGxvbmcgbG9uZyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9mbG9hdDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDQpOwotICAgICAgbmFtZSA9ICJmbG9hdCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9kb3VibGU6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIG5hbWUgPSAiZG91YmxlIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2xvbmdfZG91YmxlOgotICAgICAgLyogRklYTUU6IFRoZSBzaXplIGZvciB0aGlzIHR5cGUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZQotICAgICAgICAgcHJvY2Vzc29yLiAgKi8KLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDEyKTsKLSAgICAgIG5hbWUgPSAibG9uZyBkb3VibGUiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fbG9uZ19sb25nX2RvdWJsZToKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDE2KTsKLSAgICAgIG5hbWUgPSAibG9uZyBsb25nIGRvdWJsZSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9xdW90ZWRfc3RyaW5nOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfYXJyYXlfdHlwZSAoZGhhbmRsZSwKLQkJCQkgICAgaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHAsCi0JCQkJCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpCi0JCQkJCQkJYnVpbHRpbl9jaGFyKSksCi0JCQkJICAgIGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCBwLAotCQkJCQkJICAgICAgICgodW5zaWduZWQgaW50KQotCQkJCQkJCWJ1aWx0aW5faW50KSksCi0JCQkJICAgIDAsIC0xLCB0cnVlKTsKLSAgICAgIG5hbWUgPSAiUVVPVEVEIFNUUklORyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9pbnN0cnVjdGlvbl9hZGRyZXNzOgotICAgICAgLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGEgY29kZSBhZGRyZXNzLiAgKi8KLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSAgICAgIG5hbWUgPSAiaW5zdHJ1Y3Rpb24gYWRkcmVzcyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9pbnQ6Ci0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgZm9yIHRoaXMgdHlwZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlCi0gICAgICAgICBwcm9jZXNzb3IuICAqLwotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAiaW50IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Vuc2lnbmVkOgotICAgICAgLyogRklYTUU6IFRoZSBzaXplIGZvciB0aGlzIHR5cGUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZQotICAgICAgICAgcHJvY2Vzc29yLiAgKi8KLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdW5zaWduZWRfaW50OgotICAgICAgLyogRklYTUU6IFRoZSBzaXplIGZvciB0aGlzIHR5cGUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZQotICAgICAgICAgcHJvY2Vzc29yLiAgKi8KLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgaW50IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2NoYXI6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2xvbmc6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Nob3J0OgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAic2hvcnQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdW5zaWduZWRfc2hvcnQ6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIHNob3J0IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Nob3J0X2ludDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7Ci0gICAgICBuYW1lID0gInNob3J0IGludCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9zaWduZWRfc2hvcnQ6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaWduZWQgc2hvcnQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fYmNkX2Zsb2F0OgotICAgICAgaWVlZV9lcnJvciAoaW5mbywgcCwgXygiQkNEIGZsb2F0IHR5cGUgbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG5hbWUgIT0gTlVMTCkKLSAgICB0eXBlID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBuYW1lLCB0eXBlKTsKLQotICBhc3NlcnQgKGluZHggPCBCVUlMVElOX1RZUEVfQ09VTlQpOwotCi0gIGluZm8tPnR5cGVzLmJ1aWx0aW5zW2luZHhdID0gdHlwZTsKLQotICByZXR1cm4gdHlwZTsKLX0KLQotLyogQWxsb2NhdGUgbW9yZSBzcGFjZSBpbiB0aGUgdHlwZSB0YWJsZS4gIElmIHJlZiBpcyB0cnVlLCB0aGlzIGlzIGEKLSAgIHJlZmVyZW5jZSB0byB0aGUgdHlwZTsgaWYgaXQgaXMgbm90IGFscmVhZHkgZGVmaW5lZCwgd2Ugc2hvdWxkIHNldAotICAgdXAgYW4gaW5kaXJlY3QgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2FsbG9jX3R5cGUgKGluZm8sIGluZHgsIHJlZikKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgaW50IGluZHg7Ci0gICAgIGJvb2xlYW4gcmVmOwotewotICB1bnNpZ25lZCBpbnQgbmFsbG9jOwotICByZWdpc3RlciBzdHJ1Y3QgaWVlZV90eXBlICp0OwotICBzdHJ1Y3QgaWVlZV90eXBlICp0ZW5kOwotCi0gIGlmIChpbmR4ID49IGluZm8tPnR5cGVzLmFsbG9jKQotICAgIHsKLSAgICAgIG5hbGxvYyA9IGluZm8tPnR5cGVzLmFsbG9jOwotICAgICAgaWYgKG5hbGxvYyA9PSAwKQotCW5hbGxvYyA9IDQ7Ci0gICAgICB3aGlsZSAoaW5keCA+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+dHlwZSk7Ci0JCSAgaWYgKHBmID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LAotCQkJCSAgIkMrKyByZWZlcmVuY2UgaW4gY2xhc3Mgd2l0aCBubyBmaWVsZHMiKTsKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCi0JCSAgZm9yIChmaW5keCA9IDA7ICpwZiAhPSBERUJVR19GSUVMRF9OVUxMOyBwZisrLCBmaW5keCsrKQotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpmbmFtZTsKLQotCQkgICAgICBmbmFtZSA9IGRlYnVnX2dldF9maWVsZF9uYW1lIChpbmZvLT5kaGFuZGxlLCAqcGYpOwotCQkgICAgICBpZiAoZm5hbWUgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgaWYgKHN0cm5jbXAgKGZuYW1lLCBuYW1lLCBuYW1sZW4pID09IDAKLQkJCSAgJiYgc3RybGVuIChmbmFtZSkgPT0gbmFtbGVuKQotCQkJewotCQkJICBwc2xvdCA9IGl0LT5mc2xvdHMgKyBmaW5keDsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAocHNsb3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiQysrIHJlZmVyZW5jZSBub3QgZm91bmQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdlIGFsbG9jYXRlZCB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGFzIGFuIGluZGlyZWN0IHR5cGUgcG9pbnRpbmcKLSAgICAgdG8gKnBzbG90LCB3aGljaCB3ZSBjYW4gbm93IHVwZGF0ZSB0byBiZSBhIHJlZmVyZW5jZSB0eXBlLiAgKi8KLSAgaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGluZm8tPmRoYW5kbGUsICpwc2xvdCkgIT0gREVCVUdfS0lORF9QT0lOVEVSKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgcmVmZXJlbmNlIGlzIG5vdCBwb2ludGVyIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICB0YXJnZXQgPSBkZWJ1Z19nZXRfdGFyZ2V0X3R5cGUgKGluZm8tPmRoYW5kbGUsICpwc2xvdCk7Ci0gICpwc2xvdCA9IGRlYnVnX21ha2VfcmVmZXJlbmNlX3R5cGUgKGluZm8tPmRoYW5kbGUsIHRhcmdldCk7Ci0gIGlmICgqcHNsb3QgPT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVxdWlyZSBhbiBBU04gcmVjb3JkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCBwdikKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgYmZkX3ZtYSAqcHY7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgaWVlZV9yZWNvcmRfZW51bV90eXBlIGM7Ci0gIGJmZF92bWEgdmFyaW5keDsKLQotICBzdGFydCA9ICpwcDsKLQotICBjID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKipwcDsKLSAgaWYgKGMgIT0gaWVlZV9lMl9maXJzdF9ieXRlX2VudW0pCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIm1pc3NpbmcgcmVxdWlyZWQgQVNOIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYyA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICgoKHVuc2lnbmVkIGludCkgYyA8PCA4KSB8ICoqcHApOwotICBpZiAoYyAhPSBpZWVlX2Fzbl9yZWNvcmRfZW51bSkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygibWlzc2luZyByZXF1aXJlZCBBU04iKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICAvKiBKdXN0IGlnbm9yZSB0aGUgdmFyaWFibGUgaW5kZXguICAqLwotICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnZhcmluZHgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gaWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCBwdik7Ci19Ci0KLS8qIFJlcXVpcmUgYW4gQVRONjUgcmVjb3JkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsIHBuYW1lLCBwbmFtbGVuKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICBjb25zdCBjaGFyICoqcG5hbWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnBuYW1sZW47Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgaWVlZV9yZWNvcmRfZW51bV90eXBlIGM7Ci0gIGJmZF92bWEgbmFtZV9pbmR4LCB0eXBlX2luZHgsIGF0bl9jb2RlOwotCi0gIHN0YXJ0ID0gKnBwOwotCi0gIGMgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAqKnBwOwotICBpZiAoYyAhPSBpZWVlX2F0X3JlY29yZF9lbnVtKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJtaXNzaW5nIHJlcXVpcmVkIEFUTjY1IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYyA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICgoKHVuc2lnbmVkIGludCkgYyA8PCA4KSB8ICoqcHApOwotICBpZiAoYyAhPSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygibWlzc2luZyByZXF1aXJlZCBBVE42NSIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmbmFtZV9pbmR4KQotICAgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnR5cGVfaW5keCkKLSAgICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZhdG5fY29kZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEp1c3QgaWdub3JlIG5hbWVfaW5keC4gICovCi0KLSAgaWYgKHR5cGVfaW5keCAhPSAwIHx8IGF0bl9jb2RlICE9IDY1KQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJiYWQgQVRONjUgcmVjb3JkIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gaWVlZV9yZWFkX2lkIChpbmZvLCBwcCwgcG5hbWUsIHBuYW1sZW4pOwotfQotDAotLyogQ29udmVydCBhIHJlZ2lzdGVyIG51bWJlciBpbiBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbnRvIGEKLSAgIGdlbmVyaWMgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLQotc3RhdGljIGludAotaWVlZV9yZWdub190b19nZW5yZWcgKGFiZmQsIHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHI7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgLyogRm9yIHNvbWUgcmVhc29ucyBzdGFicyBhZGRzIDIgdG8gdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyCi0gICAgICAgICBudW1iZXJzLiAgKi8KLSAgICAgIGlmIChyID49IDE2KQotCXIgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotICAgICAgLyogU3RhYnMgdXNlcyAwIHRvIDE1IGZvciByMCB0byByMTUsIDE2IHRvIDMxIGZvciBnMCB0byBnMTUsIGFuZAotICAgICAgICAgMzIgdG8gMzUgZm9yIGZwMCB0byBmcDMuICAqLwotICAgICAgLS1yOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IGEgZ2VuZXJpYyByZWdpc3RlciBudW1iZXIgdG8gYW4gSUVFRSBzcGVjaWZpYyBvbmUuICAqLwotCi1zdGF0aWMgaW50Ci1pZWVlX2dlbnJlZ190b19yZWdubyAoYWJmZCwgcikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgcjsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb24gc3RhYnMgYWRkIDIgdG8gdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyCi0gICAgICAgICBudW1iZXJzLiAgKi8KLSAgICAgIGlmIChyID49IDE4KQotCXIgLT0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotICAgICAgLyogU3RhYnMgdXNlcyAwIHRvIDE1IGZvciByMCB0byByMTUsIDE2IHRvIDMxIGZvciBnMCB0byBnMTUsIGFuZAotICAgICAgICAgMzIgdG8gMzUgZm9yIGZwMCB0byBmcDMuICAqLwotICAgICAgKytyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiByOwotfQotDAotLyogVGhlc2Ugcm91dGluZXMgYnVpbGQgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gb3V0IG9mIHRoZSBnZW5lcmljCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi0vKiBXZSBidWlsZCB0aGUgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYnl0ZSBieSBieXRlLiAgUmF0aGVyIHRoYW4KLSAgIHdhc3RlIHRpbWUgY29weWluZyBkYXRhIGFyb3VuZCwgd2UgdXNlIGEgbGlua2VkIGxpc3Qgb2YgYnVmZmVycyB0bwotICAgaG9sZCB0aGUgZGF0YS4gICovCi0KLSNkZWZpbmUgSUVFRV9CVUZTSVpFICg0OTApCi0KLXN0cnVjdCBpZWVlX2J1ZgotewotICAvKiBOZXh0IGJ1ZmZlci4gICovCi0gIHN0cnVjdCBpZWVlX2J1ZiAqbmV4dDsKLSAgLyogTnVtYmVyIG9mIGRhdGEgYnl0ZXMgaW4gdGhpcyBidWZmZXIuICAqLwotICB1bnNpZ25lZCBpbnQgYzsKLSAgLyogQnl0ZXMuICAqLwotICBiZmRfYnl0ZSBidWZbSUVFRV9CVUZTSVpFXTsKLX07Ci0KLS8qIEEgbGlzdCBvZiBidWZmZXJzLiAgKi8KLQotc3RydWN0IGllZWVfYnVmbGlzdAotewotICAvKiBIZWFkIG9mIGxpc3QuICAqLwotICBzdHJ1Y3QgaWVlZV9idWYgKmhlYWQ7Ci0gIC8qIFRhaWwtLWxhc3QgYnVmZmVyIG9uIGxpc3QuICAqLwotICBzdHJ1Y3QgaWVlZV9idWYgKnRhaWw7Ci19OwotCi0vKiBJbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgQkIxMSBibG9ja3MgcmVxdWlyZWQgYnkgdGhlIEhQIGVtdWxhdG9yLAotICAgd2Uga2VlcCB0cmFjayBvZiByYW5nZXMgb2YgYWRkcmVzc2VzIHdoaWNoIGNvcnJlc3BvbmQgdG8gYSBnaXZlbgotICAgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0cnVjdCBpZWVlX3JhbmdlCi17Ci0gIC8qIE5leHQgcmFuZ2UuICAqLwotICBzdHJ1Y3QgaWVlZV9yYW5nZSAqbmV4dDsKLSAgLyogTG93IGFkZHJlc3MuICAqLwotICBiZmRfdm1hIGxvdzsKLSAgLyogSGlnaCBhZGRyZXNzLiAgKi8KLSAgYmZkX3ZtYSBoaWdoOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gZm9yIGEgY2xhc3Mgb24gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdHJ1Y3QgaWVlZV90eXBlX2NsYXNzCi17Ci0gIC8qIFRoZSBuYW1lIGluZGV4IGluIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgLyogVGhlIHBtaXNjIHJlY29yZHMgZm9yIHRoZSBjbGFzcy4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgcG1pc2NidWY7Ci0gIC8qIFRoZSBudW1iZXIgb2YgcG1pc2MgcmVjb3Jkcy4gICovCi0gIHVuc2lnbmVkIGludCBwbWlzY2NvdW50OwotICAvKiBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgaG9sZGluZyB0aGUgdmlydHVhbCB0YWJsZSwgaWYgbm90IHRoaXMKLSAgICAgY2xhc3MuICAqLwotICBjb25zdCBjaGFyICp2Y2xhc3M7Ci0gIC8qIFdoZXRoZXIgdGhpcyBjbGFzcyBob2xkcyBpdHMgb3duIHZpcnR1YWwgdGFibGUuICAqLwotICBib29sZWFuIG93bnZwdHI7Ci0gIC8qIFRoZSBsYXJnZXN0IHZpcnR1YWwgdGFibGUgb2Zmc2V0IHNlZW4gc28gZmFyLiAgKi8KLSAgYmZkX3ZtYSB2b2Zmc2V0OwotICAvKiBUaGUgY3VycmVudCBtZXRob2QuICAqLwotICBjb25zdCBjaGFyICptZXRob2Q7Ci0gIC8qIEFkZGl0aW9uYWwgcG1pc2MgcmVjb3JkcyB1c2VkIHRvIHJlY29yZCBmaWVsZHMgb2YgcmVmZXJlbmNlIHR5cGUuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHJlZnM7Ci19OwotCi0vKiBUaGlzIGlzIGhvdyB3ZSBzdG9yZSB0eXBlcyBmb3IgdGhlIHdyaXRpbmcgcm91dGluZXMuICBNb3N0IHR5cGVzCi0gICBhcmUgc2ltcGx5IHJlcHJlc2VudGVkIGJ5IGEgdHlwZSBpbmRleC4gICovCi0KLXN0cnVjdCBpZWVlX3dyaXRlX3R5cGUKLXsKLSAgLyogVHlwZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCBpbmR4OwotICAvKiBUaGUgc2l6ZSBvZiB0aGUgdHlwZSwgaWYga25vd24uICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIHR5cGUsIGlmIGFueS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiBvciBtZXRob2QgdHlwZSwgd2UgYnVpbGQgdGhlIHR5cGUgaGVyZSwgYW5kCi0gICAgIG9ubHkgYWRkIGl0IHRvIHRoZSBvdXRwdXQgYnVmZmVycyBpZiB3ZSBuZWVkIGl0LiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBmbmRlZjsKLSAgLyogSWYgdGhpcyBpcyBhIHN0cnVjdCwgdGhpcyBpcyB3aGVyZSB0aGUgc3RydWN0IGRlZmluaXRpb24gaXMKLSAgICAgYnVpbHQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHN0cmRlZjsKLSAgLyogSWYgdGhpcyBpcyBhIGNsYXNzLCB0aGlzIGlzIHdoZXJlIHRoZSBjbGFzcyBpbmZvcm1hdGlvbiBpcyBidWlsdC4gICovCi0gIHN0cnVjdCBpZWVlX3R5cGVfY2xhc3MgKmNsYXNzZGVmOwotICAvKiBXaGV0aGVyIHRoZSB0eXBlIGlzIHVuc2lnbmVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHVuc2lnbmVkcCA6IDE7Ci0gIC8qIFdoZXRoZXIgdGhpcyBpcyBhIHJlZmVyZW5jZSB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IHJlZmVyZW5jZXAgOiAxOwotICAvKiBXaGV0aGVyIHRoaXMgaXMgaW4gdGhlIGxvY2FsIHR5cGUgYmxvY2suICAqLwotICB1bnNpZ25lZCBpbnQgbG9jYWxwIDogMTsKLSAgLyogV2hldGhlciB0aGlzIGlzIGEgZHVwbGljYXRlIHN0cnVjdCBkZWZpbml0aW9uIHdoaWNoIHdlIGFyZQotICAgICBpZ25vcmluZy4gICovCi0gIHVuc2lnbmVkIGludCBpZ25vcmVwIDogMTsKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIHR5cGUgc3RhY2sgdXNlZCBieSB0aGUgZGVidWcgd3JpdGluZyByb3V0aW5lcy4gIEZJWE1FOgotICAgV2UgY291bGQgZ2VuZXJhdGUgbW9yZSBlZmZpY2llbnQgb3V0cHV0IGlmIHdlIHJlbWVtYmVyZWQgd2hlbiB3ZQotICAgaGF2ZSBvdXRwdXQgYSBwYXJ0aWN1bGFyIHR5cGUgYmVmb3JlLiAgKi8KLQotc3RydWN0IGllZWVfdHlwZV9zdGFjawotewotICAvKiBOZXh0IGVudHJ5IG9uIHN0YWNrLiAgKi8KLSAgc3RydWN0IGllZWVfdHlwZV9zdGFjayAqbmV4dDsKLSAgLyogVHlwZSBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBpZWVlX3dyaXRlX3R5cGUgdHlwZTsKLX07Ci0KLS8qIFRoaXMgaXMgYSBsaXN0IG9mIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGEgbmFtZSBhbmQgc29tZSB0eXBlcy4KLSAgIFRoZXNlIGFyZSB1c2VkIGZvciB0eXBlZGVmcyBhbmQgdGFncy4gICovCi0KLXN0cnVjdCBpZWVlX25hbWVfdHlwZQotewotICAvKiBOZXh0IHR5cGUgZm9yIHRoaXMgbmFtZS4gICovCi0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqbmV4dDsKLSAgLyogSUQgbnVtYmVyLiAgRm9yIGEgdHlwZWRlZiwgdGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIHR5cGUgdG8gd2hpY2gKLSAgICAgdGhpcyBuYW1lIGlzIHR5cGVkZWZlZC4gICovCi0gIHVuc2lnbmVkIGludCBpZDsKLSAgLyogVHlwZS4gICovCi0gIHN0cnVjdCBpZWVlX3dyaXRlX3R5cGUgdHlwZTsKLSAgLyogSWYgdGhpcyBpcyBhIHRhZyB3aGljaCBoYXMgbm90IHlldCBiZWVuIGRlZmluZWQsIHRoaXMgaXMgdGhlCi0gICAgIGtpbmQuICBJZiB0aGUgdGFnIGhhcyBiZWVuIGRlZmluZWQsIHRoaXMgaXMgREVCVUdfS0lORF9JTExFR0FMLiAgKi8KLSAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLX07Ci0KLS8qIFdlIHVzZSBhIGhhc2ggdGFibGUgdG8gYXNzb2NpYXRlIG5hbWVzIGFuZCB0eXBlcy4gICovCi0KLXN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OwotfTsKLQotc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIEluZm9ybWF0aW9uIGZvciB0aGlzIG5hbWUuICAqLwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKnR5cGVzOwotfTsKLQotLyogVGhpcyBpcyBhIGxpc3Qgb2YgZW51bXMuICAqLwotCi1zdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0KLXsKLSAgLyogTmV4dCBlbnVtLiAgKi8KLSAgc3RydWN0IGllZWVfZGVmaW5lZF9lbnVtICpuZXh0OwotICAvKiBUeXBlIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIC8qIFdoZXRoZXIgdGhpcyBlbnVtIGhhcyBiZWVuIGRlZmluZWQuICAqLwotICBib29sZWFuIGRlZmluZWQ7Ci0gIC8qIFRhZy4gICovCi0gIGNvbnN0IGNoYXIgKnRhZzsKLSAgLyogTmFtZXMuICAqLwotICBjb25zdCBjaGFyICoqbmFtZXM7Ci0gIC8qIFZhbHVlcy4gICovCi0gIGJmZF9zaWduZWRfdm1hICp2YWxzOwotfTsKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdHlwZXMsIHNvIHRoYXQgd2UgZG9uJ3QKLSAgIG91dHB1dCB0aGVtIG1vcmUgdGhhbiBvbmNlLiAgKi8KLQotc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZQotewotICAvKiBQb2ludGVyIHRvIHRoaXMgdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBwb2ludGVyOwotICAvKiBGdW5jdGlvbiB3aXRoIHVua25vd24gYXJndW1lbnRzIHJldHVybmluZyB0aGlzIHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgZnVuY3Rpb247Ci0gIC8qIENvbnN0IHZlcnNpb24gb2YgdGhpcyB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvbnN0X3F1YWxpZmllZDsKLSAgLyogVm9sYXRpbGUgdmVyc2lvbiBvZiB0aGlzIHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgdm9sYXRpbGVfcXVhbGlmaWVkOwotICAvKiBMaXN0IG9mIGFycmF5cyBvZiB0aGlzIHR5cGUgb2YgdmFyaW91cyBib3VuZHMuICAqLwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF9hcnJheV90eXBlICphcnJheXM7Ci19OwotCi0vKiBBIGxpc3Qgb2YgYXJyYXlzIGJvdW5kcy4gICovCi0KLXN0cnVjdCBpZWVlX21vZGlmaWVkX2FycmF5X3R5cGUKLXsKLSAgLyogTmV4dCBhcnJheSBib3VuZHMuICAqLwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF9hcnJheV90eXBlICpuZXh0OwotICAvKiBUeXBlIGluZGV4IHdpdGggdGhlc2UgYm91bmRzLiAgKi8KLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIC8qIExvdyBib3VuZC4gICovCi0gIGJmZF9zaWduZWRfdm1hIGxvdzsKLSAgLyogSGlnaCBib3VuZC4gICovCi0gIGJmZF9zaWduZWRfdm1hIGhpZ2g7Ci19OwotCi0vKiBUaGlzIGlzIGEgbGlzdCBvZiBwZW5kaW5nIGZ1bmN0aW9uIHBhcmFtZXRlciBpbmZvcm1hdGlvbi4gIFdlIGRvbid0Ci0gICBvdXRwdXQgdGhlbSB1bnRpbCB3ZSBzZWUgdGhlIGZpcnN0IGJsb2NrLiAgKi8KLQotc3RydWN0IGllZWVfcGVuZGluZ19wYXJtCi17Ci0gIC8qIE5leHQgcGVuZGluZyBwYXJhbWV0ZXIuICAqLwotICBzdHJ1Y3QgaWVlZV9wZW5kaW5nX3Bhcm0gKm5leHQ7Ci0gIC8qIE5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUeXBlIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0gIC8qIFdoZXRoZXIgdGhlIHR5cGUgaXMgYSByZWZlcmVuY2UuICAqLwotICBib29sZWFuIHJlZmVyZW5jZXA7Ci0gIC8qIEtpbmQuICAqLwotICBlbnVtIGRlYnVnX3Bhcm1fa2luZCBraW5kOwotICAvKiBWYWx1ZS4gICovCi0gIGJmZF92bWEgdmFsOwotfTsKLQotLyogVGhpcyBpcyB0aGUgaGFuZGxlIHBhc3NlZCBkb3duIGJ5IGRlYnVnX3dyaXRlLiAgKi8KLQotc3RydWN0IGllZWVfaGFuZGxlCi17Ci0gIC8qIEJGRCB3ZSBhcmUgd3JpdGluZyB0by4gICovCi0gIGJmZCAqYWJmZDsKLSAgLyogV2hldGhlciB3ZSBnb3QgYW4gZXJyb3IgaW4gYSBzdWJyb3V0aW5lIGNhbGxlZCB2aWEgdHJhdmVyc2Ugb3IKLSAgICAgbWFwX292ZXJfc2VjdGlvbnMuICAqLwotICBib29sZWFuIGVycm9yOwotICAvKiBDdXJyZW50IGRhdGEgYnVmZmVyIGxpc3QuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICpjdXJyZW50OwotICAvKiBDdXJyZW50IGRhdGEgYnVmZmVyLiAgKi8KLSAgc3RydWN0IGllZWVfYnVmICpjdXJidWY7Ci0gIC8qIEZpbGVuYW1lIG9mIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAvKiBNb2R1bGUgbmFtZSBvZiBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBjb25zdCBjaGFyICptb2RuYW1lOwotICAvKiBMaXN0IG9mIGJ1ZmZlciBmb3IgZ2xvYmFsIHR5cGVzLiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBnbG9iYWxfdHlwZXM7Ci0gIC8qIExpc3Qgb2YgZmluaXNoZWQgZGF0YSBidWZmZXJzLiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBkYXRhOwotICAvKiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIHR5cGVkZWZzIGluIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHR5cGVzOwotICAvKiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGluIHRoZSBjdXJyZW50Ci0gICAgIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHZhcnM7Ci0gIC8qIExpc3Qgb2YgYnVmZmVycyBmb3IgQysrIGNsYXNzIGRlZmluaXRpb25zIGluIHRoZSBjdXJyZW50Ci0gICAgIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IGN4eDsKLSAgLyogTGlzdCBvZiBidWZmZXJzIGZvciBsaW5lIG51bWJlcnMgaW4gdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgbGluZW5vczsKLSAgLyogUmFuZ2VzIGZvciB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgc3RydWN0IGllZWVfcmFuZ2UgKnJhbmdlczsKLSAgLyogUmFuZ2VzIGZvciBhbGwgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGllZWVfcmFuZ2UgKmdsb2JhbF9yYW5nZXM7Ci0gIC8qIE5lc3RlZCBwZW5kaW5nIHJhbmdlcy4gICovCi0gIHN0cnVjdCBpZWVlX3JhbmdlICpwZW5kaW5nX3JhbmdlczsKLSAgLyogVHlwZSBzdGFjay4gICovCi0gIHN0cnVjdCBpZWVlX3R5cGVfc3RhY2sgKnR5cGVfc3RhY2s7Ci0gIC8qIE5leHQgdW5hbGxvY2F0ZWQgdHlwZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCB0eXBlX2luZHg7Ci0gIC8qIE5leHQgdW5hbGxvY2F0ZWQgbmFtZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCBuYW1lX2luZHg7Ci0gIC8qIFR5cGVkZWZzLiAgKi8KLSAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfdGFibGUgdHlwZWRlZnM7Ci0gIC8qIFRhZ3MuICAqLwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF90YWJsZSB0YWdzOwotICAvKiBFbnVtcy4gICovCi0gIHN0cnVjdCBpZWVlX2RlZmluZWRfZW51bSAqZW51bXM7Ci0gIC8qIE1vZGlmaWVkIHZlcnNpb25zIG9mIHR5cGVzLiAgKi8KLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbW9kaWZpZWQ7Ci0gIC8qIE51bWJlciBvZiBlbnRyaWVzIGFsbG9jYXRlZCBpbiBtb2RpZmllZC4gICovCi0gIHVuc2lnbmVkIGludCBtb2RpZmllZF9hbGxvYzsKLSAgLyogNCBieXRlIGNvbXBsZXggdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBjb21wbGV4X2Zsb2F0X2luZGV4OwotICAvKiA4IGJ5dGUgY29tcGxleCB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvbXBsZXhfZG91YmxlX2luZGV4OwotICAvKiBUaGUgZGVwdGggb2YgYmxvY2sgbmVzdGluZy4gIFRoaXMgaXMgMCBvdXRzaWRlIGEgZnVuY3Rpb24sIGFuZCAxCi0gICAgIGp1c3QgYWZ0ZXIgc3RhcnRfZnVuY3Rpb24gaXMgY2FsbGVkLiAgKi8KLSAgdW5zaWduZWQgaW50IGJsb2NrX2RlcHRoOwotICAvKiBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKmZubmFtZTsKLSAgLyogTGlzdCBvZiBidWZmZXJzIGZvciB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gd2UgYXJlIGN1cnJlbnRseQotICAgICB3cml0aW5nIG91dC4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgZm50eXBlOwotICAvKiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBmdW5jdGlvbiB3ZSBhcmUKLSAgICAgY3VycmVudGx5IHdyaXRpbmcgb3V0LiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBmbmFyZ3M7Ci0gIC8qIE51bWJlciBvZiBhcmd1bWVudHMgd3JpdHRlbiB0byBmbmFyZ3MuICAqLwotICB1bnNpZ25lZCBpbnQgZm5hcmdjb3VudDsKLSAgLyogUGVuZGluZyBmdW5jdGlvbiBwYXJhbWV0ZXJzLiAgKi8KLSAgc3RydWN0IGllZWVfcGVuZGluZ19wYXJtICpwZW5kaW5nX3Bhcm1zOwotICAvKiBDdXJyZW50IGxpbmUgbnVtYmVyIGZpbGVuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbGluZW5vX2ZpbGVuYW1lOwotICAvKiBMaW5lIG51bWJlciBuYW1lIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgaW50IGxpbmVub19uYW1lX2luZHg7Ci0gIC8qIEZpbGVuYW1lIG9mIHBlbmRpbmcgbGluZSBudW1iZXIuICAqLwotICBjb25zdCBjaGFyICpwZW5kaW5nX2xpbmVub19maWxlbmFtZTsKLSAgLyogUGVuZGluZyBsaW5lIG51bWJlci4gICovCi0gIHVuc2lnbmVkIGxvbmcgcGVuZGluZ19saW5lbm87Ci0gIC8qIEFkZHJlc3Mgb2YgcGVuZGluZyBsaW5lIG51bWJlci4gICovCi0gIGJmZF92bWEgcGVuZGluZ19saW5lbm9fYWRkcjsKLSAgLyogSGlnaGVzdCBhZGRyZXNzIHNlZW4gYXQgZW5kIG9mIHByb2NlZHVyZS4gICovCi0gIGJmZF92bWEgaGlnaGFkZHI7Ci19OwotCi1zdGF0aWMgYm9vbGVhbiBpZWVlX2luaXRfYnVmZmVyCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBzdHJ1Y3QgaWVlZV9idWZsaXN0ICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2hhbmdlX2J1ZmZlcgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgc3RydWN0IGllZWVfYnVmbGlzdCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2FwcGVuZF9idWZmZXIKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKiwKLQkgICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhbF93cml0ZV9ieXRlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfMmJ5dGVzIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfbnVtYmVyIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2lkIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfYXNuCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCB1bnNpZ25lZCBpbnQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfYXRuNjUKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHVuc2lnbmVkIGludCwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3B1c2hfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sCi0JICAgYm9vbGVhbikpOwotc3RhdGljIHVuc2lnbmVkIGludCBpZWVlX3BvcF90eXBlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSk7Ci1zdGF0aWMgdm9pZCBpZWVlX3BvcF91bnVzZWRfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBpZWVlX3BvcF90eXBlX3VzZWQKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfYWRkX3JhbmdlCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBib29sZWFuLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X3JhbmdlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VuZF9yYW5nZSBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9kZWZpbmVfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgdW5zaWduZWQgaW50LCBib29sZWFuLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2RlZmluZV9uYW1lZF90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCSAgIGJvb2xlYW4sIGJvb2xlYW4sIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKikpOwotc3RhdGljIHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKmllZWVfZ2V0X21vZGlmaWVkX2luZm8KLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqaWVlZV9uYW1lX3R5cGVfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV91bmRlZmluZWRfdGFnCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9maW5pc2hfY29tcGlsYXRpb25fdW5pdCBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikpOwotc3RhdGljIHZvaWQgaWVlZV9hZGRfYmIxMV9ibG9ja3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9hZGRfYmIxMQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9vdXRwdXRfcGVuZGluZ19wYXJtcyBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBpZWVlX3Zpc190b19mbGFncyBQQVJBTVMgKChlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3NfbWV0aG9kX3ZhcgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sCi0JICAgYm9vbGVhbiwgYm9vbGVhbiwgYmZkX3ZtYSwgYm9vbGVhbikpOwotCi1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfc291cmNlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VtcHR5X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3ZvaWRfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfaW50X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZmxvYXRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9jb21wbGV4X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfYm9vbF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VudW1fdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgYmZkX3NpZ25lZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9wb2ludGVyX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2Z1bmN0aW9uX3R5cGUgUEFSQU1TICgoUFRSLCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVmZXJlbmNlX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JhbmdlX3R5cGUgUEFSQU1TICgoUFRSLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfYXJyYXlfdHlwZQotICBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9zZXRfdHlwZSBQQVJBTVMgKChQVFIsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfb2Zmc2V0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX21ldGhvZF90eXBlIFBBUkFNUyAoKFBUUiwgYm9vbGVhbiwgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2NvbnN0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3ZvbGF0aWxlX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X3N0cnVjdF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9zdHJ1Y3RfZmllbGQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEsIGJmZF92bWEsIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9lbmRfc3RydWN0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X2NsYXNzX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBib29sZWFuLAotCSAgIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3Nfc3RhdGljX21lbWJlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3NfYmFzZWNsYXNzCi0gIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSwgYm9vbGVhbiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2NsYXNzX3N0YXJ0X21ldGhvZCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9jbGFzc19tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLCBib29sZWFuLAotCSAgIGJmZF92bWEsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50Ci0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3NfZW5kX21ldGhvZCBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZW5kX2NsYXNzX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3R5cGVkZWZfdHlwZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV90YWdfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBlbnVtIGRlYnVnX3R5cGVfa2luZCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV90eXBkZWYgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfdGFnIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2ludF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9mbG9hdF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZG91YmxlKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3R5cGVkX2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3ZhcmlhYmxlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zhcl9raW5kLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X2Z1bmN0aW9uIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2Z1bmN0aW9uX3BhcmFtZXRlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z19wYXJtX2tpbmQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VuZF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZW5kX2Z1bmN0aW9uIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9saW5lbm8KLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGJmZF92bWEpKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgaWVlZV9mbnMgPQotewotICBpZWVlX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQsCi0gIGllZWVfc3RhcnRfc291cmNlLAotICBpZWVlX2VtcHR5X3R5cGUsCi0gIGllZWVfdm9pZF90eXBlLAotICBpZWVlX2ludF90eXBlLAotICBpZWVlX2Zsb2F0X3R5cGUsCi0gIGllZWVfY29tcGxleF90eXBlLAotICBpZWVlX2Jvb2xfdHlwZSwKLSAgaWVlZV9lbnVtX3R5cGUsCi0gIGllZWVfcG9pbnRlcl90eXBlLAotICBpZWVlX2Z1bmN0aW9uX3R5cGUsCi0gIGllZWVfcmVmZXJlbmNlX3R5cGUsCi0gIGllZWVfcmFuZ2VfdHlwZSwKLSAgaWVlZV9hcnJheV90eXBlLAotICBpZWVlX3NldF90eXBlLAotICBpZWVlX29mZnNldF90eXBlLAotICBpZWVlX21ldGhvZF90eXBlLAotICBpZWVlX2NvbnN0X3R5cGUsCi0gIGllZWVfdm9sYXRpbGVfdHlwZSwKLSAgaWVlZV9zdGFydF9zdHJ1Y3RfdHlwZSwKLSAgaWVlZV9zdHJ1Y3RfZmllbGQsCi0gIGllZWVfZW5kX3N0cnVjdF90eXBlLAotICBpZWVlX3N0YXJ0X2NsYXNzX3R5cGUsCi0gIGllZWVfY2xhc3Nfc3RhdGljX21lbWJlciwKLSAgaWVlZV9jbGFzc19iYXNlY2xhc3MsCi0gIGllZWVfY2xhc3Nfc3RhcnRfbWV0aG9kLAotICBpZWVlX2NsYXNzX21ldGhvZF92YXJpYW50LAotICBpZWVlX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCwKLSAgaWVlZV9jbGFzc19lbmRfbWV0aG9kLAotICBpZWVlX2VuZF9jbGFzc190eXBlLAotICBpZWVlX3R5cGVkZWZfdHlwZSwKLSAgaWVlZV90YWdfdHlwZSwKLSAgaWVlZV90eXBkZWYsCi0gIGllZWVfdGFnLAotICBpZWVlX2ludF9jb25zdGFudCwKLSAgaWVlZV9mbG9hdF9jb25zdGFudCwKLSAgaWVlZV90eXBlZF9jb25zdGFudCwKLSAgaWVlZV92YXJpYWJsZSwKLSAgaWVlZV9zdGFydF9mdW5jdGlvbiwKLSAgaWVlZV9mdW5jdGlvbl9wYXJhbWV0ZXIsCi0gIGllZWVfc3RhcnRfYmxvY2ssCi0gIGllZWVfZW5kX2Jsb2NrLAotICBpZWVlX2VuZF9mdW5jdGlvbiwKLSAgaWVlZV9saW5lbm8KLX07Ci0KLS8qIEluaXRpYWxpemUgYSBidWZmZXIgdG8gYmUgZW1wdHkuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1pZWVlX2luaXRfYnVmZmVyIChpbmZvLCBidWZsaXN0KQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKmJ1Zmxpc3Q7Ci17Ci0gIGJ1Zmxpc3QtPmhlYWQgPSBOVUxMOwotICBidWZsaXN0LT50YWlsID0gTlVMTDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIGEgYnVmZmVyIGxpc3QgaGFzIGFueSBkYXRhLiAgKi8KLQotI2RlZmluZSBpZWVlX2J1ZmZlcl9lbXB0eXAoYnVmbGlzdCkgKChidWZsaXN0KS0+aGVhZCA9PSBOVUxMKQotCi0vKiBDaGFuZ2UgdGhlIGN1cnJlbnQgYnVmZmVyIHRvIGEgc3BlY2lmaWVkIGJ1ZmZlciBjaGFpbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sIGJ1Zmxpc3QpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqYnVmbGlzdDsKLXsKLSAgaWYgKGJ1Zmxpc3QtPmhlYWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaWVlZV9idWYgKmJ1ZjsKLQotICAgICAgYnVmID0gKHN0cnVjdCBpZWVlX2J1ZiAqKSB4bWFsbG9jIChzaXplb2YgKmJ1Zik7Ci0gICAgICBidWYtPm5leHQgPSBOVUxMOwotICAgICAgYnVmLT5jID0gMDsKLSAgICAgIGJ1Zmxpc3QtPmhlYWQgPSBidWY7Ci0gICAgICBidWZsaXN0LT50YWlsID0gYnVmOwotICAgIH0KLQotICBpbmZvLT5jdXJyZW50ID0gYnVmbGlzdDsKLSAgaW5mby0+Y3VyYnVmID0gYnVmbGlzdC0+dGFpbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXBwZW5kIGEgYnVmZmVyIGNoYWluLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCBtYWluYnVmLCBuZXdidWYpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqbWFpbmJ1ZjsKLSAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqbmV3YnVmOwotewotICBpZiAobmV3YnVmLT5oZWFkICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKG1haW5idWYtPmhlYWQgPT0gTlVMTCkKLQltYWluYnVmLT5oZWFkID0gbmV3YnVmLT5oZWFkOwotICAgICAgZWxzZQotCW1haW5idWYtPnRhaWwtPm5leHQgPSBuZXdidWYtPmhlYWQ7Ci0gICAgICBtYWluYnVmLT50YWlsID0gbmV3YnVmLT50YWlsOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIGEgYnl0ZSBpbnRvIHRoZSBidWZmZXIuICBXZSB1c2UgYSBtYWNybyBmb3Igc3BlZWQgYW5kIGEKLSAgIGZ1bmN0aW9uIGZvciB0aGUgY29tcGxleCBjYXNlcy4gICovCi0KLSNkZWZpbmUgaWVlZV93cml0ZV9ieXRlKGluZm8sIGIpCQkJCVwKLSAgKChpbmZvKS0+Y3VyYnVmLT5jIDwgSUVFRV9CVUZTSVpFCQkJCVwKLSAgID8gKChpbmZvKS0+Y3VyYnVmLT5idWZbKGluZm8pLT5jdXJidWYtPmMrK10gPSAoYiksIHRydWUpCVwKLSAgIDogaWVlZV9yZWFsX3dyaXRlX2J5dGUgKChpbmZvKSwgKGIpKSkKLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhbF93cml0ZV9ieXRlIChpbmZvLCBiKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGludCBiOwotewotICBpZiAoaW5mby0+Y3VyYnVmLT5jID49IElFRUVfQlVGU0laRSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaWVlZV9idWYgKm47Ci0KLSAgICAgIG4gPSAoc3RydWN0IGllZWVfYnVmICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gICAgICBuLT5uZXh0ID0gTlVMTDsKLSAgICAgIG4tPmMgPSAwOwotICAgICAgaWYgKGluZm8tPmN1cnJlbnQtPmhlYWQgPT0gTlVMTCkKLQlpbmZvLT5jdXJyZW50LT5oZWFkID0gbjsKLSAgICAgIGVsc2UKLQlpbmZvLT5jdXJyZW50LT50YWlsLT5uZXh0ID0gbjsKLSAgICAgIGluZm8tPmN1cnJlbnQtPnRhaWwgPSBuOwotICAgICAgaW5mby0+Y3VyYnVmID0gbjsKLSAgICB9Ci0KLSAgaW5mby0+Y3VyYnVmLT5idWZbaW5mby0+Y3VyYnVmLT5jXSA9IGI7Ci0gICsraW5mby0+Y3VyYnVmLT5jOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdHdvIGJ5dGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCBpKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGludCBpOwotewotICByZXR1cm4gKGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgaSA+PiA4KQotCSAgJiYgaWVlZV93cml0ZV9ieXRlIChpbmZvLCBpICYgMHhmZikpOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gaW50ZWdlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX251bWJlciAoaW5mbywgdikKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBiZmRfdm1hIHY7Ci17Ci0gIGJmZF92bWEgdDsKLSAgYmZkX2J5dGUgYWJbMjBdOwotICBiZmRfYnl0ZSAqcDsKLSAgdW5zaWduZWQgaW50IGM7Ci0KLSAgaWYgKHYgPD0gKGJmZF92bWEpIGllZWVfbnVtYmVyX2VuZF9lbnVtKQotICAgIHJldHVybiBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIHYpOwotCi0gIHQgPSB2OwotICBwID0gYWIgKyBzaXplb2YgYWI7Ci0gIHdoaWxlICh0ICE9IDApCi0gICAgewotICAgICAgKi0tcCA9IHQgJiAweGZmOwotICAgICAgdCA+Pj0gODsKLSAgICB9Ci0gIGMgPSAoYWIgKyAyMCkgLSBwOwotCi0gIGlmIChjID4gKHVuc2lnbmVkIGludCkgKGllZWVfbnVtYmVyX3JlcGVhdF9lbmRfZW51bQotCQkJICAtIGllZWVfbnVtYmVyX3JlcGVhdF9zdGFydF9lbnVtKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIklFRUUgbnVtZXJpYyBvdmVyZmxvdzogMHgiKSk7Ci0gICAgICBmcHJpbnRmX3ZtYSAoc3RkZXJyLCB2KTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9udW1iZXJfcmVwZWF0X3N0YXJ0X2VudW0gKyBjKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoOyBjID4gMDsgLS1jLCArK3ApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAqcCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgc3RyaW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfaWQgKGluZm8sIHMpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgdW5zaWduZWQgaW50IGxlbjsKLQotICBsZW4gPSBzdHJsZW4gKHMpOwotICBpZiAobGVuIDw9IDB4N2YpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCBsZW4pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlbiA8PSAweGZmKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9leHRlbnNpb25fbGVuZ3RoXzFfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCBsZW4pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlbiA8PSAweGZmZmYpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2V4dGVuc2lvbl9sZW5ndGhfMl9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgbGVuKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJRUVFIHN0cmluZyBsZW5ndGggb3ZlcmZsb3c6ICV1XG4iKSwgbGVuKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZm9yICg7ICpzICE9ICdcMCc7IHMrKykKLSAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sICpzKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIEFTTiByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9hc24gKGluZm8sIGluZHgsIHZhbCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHJldHVybiAoaWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIChpbnQpIGllZWVfYXNuX3JlY29yZF9lbnVtKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZHgpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgdmFsKSk7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBBVE42NSByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9hdG42NSAoaW5mbywgaW5keCwgcykKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgcmV0dXJuIChpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDY1KQotCSAgJiYgaWVlZV93cml0ZV9pZCAoaW5mbywgcykpOwotfQotCi0vKiBQdXNoIGEgdHlwZSBpbmRleCBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcHVzaF90eXBlIChpbmZvLCBpbmR4LCBzaXplLCB1bnNpZ25lZHAsIGxvY2FscCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotICAgICBib29sZWFuIGxvY2FscDsKLXsKLSAgc3RydWN0IGllZWVfdHlwZV9zdGFjayAqdHM7Ci0KLSAgdHMgPSAoc3RydWN0IGllZWVfdHlwZV9zdGFjayAqKSB4bWFsbG9jIChzaXplb2YgKnRzKTsKLSAgbWVtc2V0ICh0cywgMCwgc2l6ZW9mICp0cyk7Ci0KLSAgdHMtPnR5cGUuaW5keCA9IGluZHg7Ci0gIHRzLT50eXBlLnNpemUgPSBzaXplOwotICB0cy0+dHlwZS51bnNpZ25lZHAgPSB1bnNpZ25lZHA7Ci0gIHRzLT50eXBlLmxvY2FscCA9IGxvY2FscDsKLQotICB0cy0+bmV4dCA9IGluZm8tPnR5cGVfc3RhY2s7Ci0gIGluZm8tPnR5cGVfc3RhY2sgPSB0czsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUG9wIGEgdHlwZSBpbmRleCBvZmYgdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1pZWVlX3BvcF90eXBlIChpbmZvKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci17Ci0gIHJldHVybiBpZWVlX3BvcF90eXBlX3VzZWQgKGluZm8sIHRydWUpOwotfQotCi0vKiBQb3AgYW4gdW51c2VkIHR5cGUgaW5kZXggb2ZmIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIHZvaWQKLWllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci17Ci0gICh2b2lkKSBpZWVlX3BvcF90eXBlX3VzZWQgKGluZm8sIGZhbHNlKTsKLX0KLQotLyogUG9wIGEgdXNlZCBvciB1bnVzZWQgdHlwZSBpbmRleCBvZmYgdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1pZWVlX3BvcF90eXBlX3VzZWQgKGluZm8sIHVzZWQpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgYm9vbGVhbiB1c2VkOwotewotICBzdHJ1Y3QgaWVlZV90eXBlX3N0YWNrICp0czsKLSAgdW5zaWduZWQgaW50IHJldDsKLQotICB0cyA9IGluZm8tPnR5cGVfc3RhY2s7Ci0gIGFzc2VydCAodHMgIT0gTlVMTCk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uIHR5cGUsIGFuZCB3ZSBuZWVkIGl0LCB3ZSBuZWVkIHRvIGFwcGVuZCB0aGUKLSAgICAgYWN0dWFsIGRlZmluaXRpb24gdG8gdGhlIHR5cGVkZWYgYmxvY2sgbm93LiAgKi8KLSAgaWYgKHVzZWQgJiYgISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZ0cy0+dHlwZS5mbmRlZikpCi0gICAgewotICAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqYnVmbGlzdDsKLQotICAgICAgaWYgKHRzLT50eXBlLmxvY2FscCkKLQl7Ci0JICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBzdGFydGVkIHRoZSB0eXBlcyBibG9jay4gICovCi0JICBpZiAoaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZXMpKQotCSAgICB7Ci0JICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDEpCi0JCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkJICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPm1vZG5hbWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJ1Zmxpc3QgPSAmaW5mby0+dHlwZXM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIE1ha2Ugc3VyZSB3ZSBzdGFydGVkIHRoZSBnbG9iYWwgdHlwZSBibG9jay4gICovCi0JICBpZiAoaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+Z2xvYmFsX3R5cGVzKSkKLQkgICAgewotCSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmdsb2JhbF90eXBlcykKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMikKLQkJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJ1Zmxpc3QgPSAmaW5mby0+Z2xvYmFsX3R5cGVzOwotCX0KLQotICAgICAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCBidWZsaXN0LCAmdHMtPnR5cGUuZm5kZWYpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0ID0gdHMtPnR5cGUuaW5keDsKLSAgaW5mby0+dHlwZV9zdGFjayA9IHRzLT5uZXh0OwotICBmcmVlICh0cyk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEFkZCBhIHJhbmdlIG9mIGJ5dGVzIGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9hZGRfcmFuZ2UgKGluZm8sIGdsb2JhbCwgbG93LCBoaWdoKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGJvb2xlYW4gZ2xvYmFsOwotICAgICBiZmRfdm1hIGxvdzsKLSAgICAgYmZkX3ZtYSBoaWdoOwotewotICBzdHJ1Y3QgaWVlZV9yYW5nZSAqKnBsaXN0LCAqciwgKipwcjsKLQotICBpZiAobG93ID09IChiZmRfdm1hKSAtMSB8fCBoaWdoID09IChiZmRfdm1hKSAtMSB8fCBsb3cgPT0gaGlnaCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoZ2xvYmFsKQotICAgIHBsaXN0ID0gJmluZm8tPmdsb2JhbF9yYW5nZXM7Ci0gIGVsc2UKLSAgICBwbGlzdCA9ICZpbmZvLT5yYW5nZXM7Ci0KLSAgZm9yIChyID0gKnBsaXN0OyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChoaWdoID49IHItPmxvdyAmJiBsb3cgPD0gci0+aGlnaCkKLQl7Ci0JICAvKiBUaGUgbmV3IHJhbmdlIG92ZXJsYXBzIHIuICAqLwotCSAgaWYgKGxvdyA8IHItPmxvdykKLQkgICAgci0+bG93ID0gbG93OwotCSAgaWYgKGhpZ2ggPiByLT5oaWdoKQotCSAgICByLT5oaWdoID0gaGlnaDsKLQkgIHByID0gJnItPm5leHQ7Ci0JICB3aGlsZSAoKnByICE9IE5VTEwgJiYgKCpwciktPmxvdyA8PSByLT5oaWdoKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGllZWVfcmFuZ2UgKm47Ci0KLQkgICAgICBpZiAoKCpwciktPmhpZ2ggPiByLT5oaWdoKQotCQlyLT5oaWdoID0gKCpwciktPmhpZ2g7Ci0JICAgICAgbiA9ICgqcHIpLT5uZXh0OwotCSAgICAgIGZyZWUgKCpwcik7Ci0JICAgICAgKnByID0gbjsKLQkgICAgfQotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICByID0gKHN0cnVjdCBpZWVlX3JhbmdlICopIHhtYWxsb2MgKHNpemVvZiAqcik7Ci0gIG1lbXNldCAociwgMCwgc2l6ZW9mICpyKTsKLQotICByLT5sb3cgPSBsb3c7Ci0gIHItPmhpZ2ggPSBoaWdoOwotCi0gIC8qIFN0b3JlIHRoZSByYW5nZXMgc29ydGVkIGJ5IGFkZHJlc3MuICAqLwotICBmb3IgKHByID0gcGxpc3Q7ICpwciAhPSBOVUxMOyBwciA9ICYoKnByKS0+bmV4dCkKLSAgICBpZiAoKCpwciktPmxvdyA+IGhpZ2gpCi0gICAgICBicmVhazsKLSAgci0+bmV4dCA9ICpwcjsKLSAgKnByID0gcjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgYSBuZXcgcmFuZ2UgZm9yIHdoaWNoIHdlIG9ubHkgaGF2ZSB0aGUgbG93IGFkZHJlc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdGFydF9yYW5nZSAoaW5mbywgbG93KQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGJmZF92bWEgbG93OwotewotICBzdHJ1Y3QgaWVlZV9yYW5nZSAqcjsKLQotICByID0gKHN0cnVjdCBpZWVlX3JhbmdlICopIHhtYWxsb2MgKHNpemVvZiAqcik7Ci0gIG1lbXNldCAociwgMCwgc2l6ZW9mICpyKTsKLSAgci0+bG93ID0gbG93OwotICByLT5uZXh0ID0gaW5mby0+cGVuZGluZ19yYW5nZXM7Ci0gIGluZm8tPnBlbmRpbmdfcmFuZ2VzID0gcjsKLSAgcmV0dXJuIHRydWU7Ci19ICAKLQotLyogRmluaXNoIGEgcmFuZ2Ugc3RhcnRlZCBieSBpZWVlX3N0YXJ0X3JhbmdlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZW5kX3JhbmdlIChpbmZvLCBoaWdoKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGJmZF92bWEgaGlnaDsKLXsKLSAgc3RydWN0IGllZWVfcmFuZ2UgKnI7Ci0gIGJmZF92bWEgbG93OwotCi0gIGFzc2VydCAoaW5mby0+cGVuZGluZ19yYW5nZXMgIT0gTlVMTCk7Ci0gIHIgPSBpbmZvLT5wZW5kaW5nX3JhbmdlczsKLSAgbG93ID0gci0+bG93OwotICBpbmZvLT5wZW5kaW5nX3JhbmdlcyA9IHItPm5leHQ7Ci0gIGZyZWUgKHIpOwotICByZXR1cm4gaWVlZV9hZGRfcmFuZ2UgKGluZm8sIGZhbHNlLCBsb3csIGhpZ2gpOwotfQotCi0vKiBTdGFydCBkZWZpbmluZyBhIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgc2l6ZSwgdW5zaWduZWRwLCBsb2NhbHApCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotICAgICBib29sZWFuIGxvY2FscDsKLXsKLSAgcmV0dXJuIGllZWVfZGVmaW5lX25hbWVkX3R5cGUgKGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICh1bnNpZ25lZCBpbnQpIC0xLCBzaXplLCB1bnNpZ25lZHAsCi0JCQkJIGxvY2FscCwgKHN0cnVjdCBpZWVlX2J1Zmxpc3QgKikgTlVMTCk7Ci19Ci0KLS8qIFN0YXJ0IGRlZmluaW5nIGEgbmFtZWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCBuYW1lLCBpbmR4LCBzaXplLCB1bnNpZ25lZHAsIGxvY2FscCwgYnVmbGlzdCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotICAgICBib29sZWFuIGxvY2FscDsKLSAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqYnVmbGlzdDsKLXsKLSAgdW5zaWduZWQgaW50IHR5cGVfaW5keDsKLSAgdW5zaWduZWQgaW50IG5hbWVfaW5keDsKLQotICBpZiAoaW5keCAhPSAodW5zaWduZWQgaW50KSAtMSkKLSAgICB0eXBlX2luZHggPSBpbmR4OwotICBlbHNlCi0gICAgewotICAgICAgdHlwZV9pbmR4ID0gaW5mby0+dHlwZV9pbmR4OwotICAgICAgKytpbmZvLT50eXBlX2luZHg7Ci0gICAgfQotCi0gIG5hbWVfaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLSAgKytpbmZvLT5uYW1lX2luZHg7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICBuYW1lID0gIiI7Ci0KLSAgLyogSWYgd2Ugd2VyZSBnaXZlbiBhIGJ1ZmZlciwgdXNlIGl0OyBvdGhlcndpc2UsIHVzZSBlaXRoZXIgdGhlCi0gICAgIGxvY2FsIG9yIHRoZSBnbG9iYWwgdHlwZSBpbmZvcm1hdGlvbiwgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSB0eXBlCi0gICAgIGJsb2NrIGlzIHN0YXJ0ZWQuICAqLwotICBpZiAoYnVmbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgYnVmbGlzdCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZSBpZiAobG9jYWxwKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVzKSkKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDEpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPm1vZG5hbWUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPmdsb2JhbF90eXBlcykpCi0JewotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Z2xvYmFsX3R5cGVzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5nbG9iYWxfdHlwZXMpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDIpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogUHVzaCB0aGUgbmV3IHR5cGUgb24gdGhlIHR5cGUgc3RhY2ssIHdyaXRlIG91dCBhbiBOTiByZWNvcmQsIGFuZAotICAgICB3cml0ZSBvdXQgdGhlIHN0YXJ0IG9mIGEgVFkgcmVjb3JkLiAgVGhlIGNhbGxlciB3aWxsIHRoZW4gZmluaXNoCi0gICAgIHRoZSBUWSByZWNvcmQuICAqLwotICBpZiAoISBpZWVlX3B1c2hfdHlwZSAoaW5mbywgdHlwZV9pbmR4LCBzaXplLCB1bnNpZ25lZHAsIGxvY2FscCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiAoaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuYW1lX2luZHgpCi0JICAmJiBpZWVlX3dyaXRlX2lkIChpbmZvLCBuYW1lKQotCSAgJiYgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX3R5X3JlY29yZF9lbnVtKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHR5cGVfaW5keCkKLQkgICYmIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMHhjZSkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuYW1lX2luZHgpKTsKLX0KLQotLyogR2V0IGFuIGVudHJ5IHRvIHRoZSBsaXN0IG9mIG1vZGlmaWVkIHZlcnNpb25zIG9mIGEgdHlwZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICoKLWllZWVfZ2V0X21vZGlmaWVkX2luZm8gKGluZm8sIGluZHgpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgdW5zaWduZWQgaW50IGluZHg7Ci17Ci0gIGlmIChpbmR4ID49IGluZm8tPm1vZGlmaWVkX2FsbG9jKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBuYWxsb2M7Ci0KLSAgICAgIG5hbGxvYyA9IGluZm8tPm1vZGlmaWVkX2FsbG9jOwotICAgICAgaWYgKG5hbGxvYyA9PSAwKQotCW5hbGxvYyA9IDE2OwotICAgICAgd2hpbGUgKGluZHggPj0gbmFsbG9jKQotCW5hbGxvYyAqPSAyOwotICAgICAgaW5mby0+bW9kaWZpZWQgPSAoKHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKikKLQkJCXhyZWFsbG9jIChpbmZvLT5tb2RpZmllZCwKLQkJCQkgIG5hbGxvYyAqIHNpemVvZiAqaW5mby0+bW9kaWZpZWQpKTsKLSAgICAgIG1lbXNldCAoaW5mby0+bW9kaWZpZWQgKyBpbmZvLT5tb2RpZmllZF9hbGxvYywgMCwKLQkgICAgICAobmFsbG9jIC0gaW5mby0+bW9kaWZpZWRfYWxsb2MpICogc2l6ZW9mICppbmZvLT5tb2RpZmllZCk7Ci0gICAgICBpbmZvLT5tb2RpZmllZF9hbGxvYyA9IG5hbGxvYzsKLSAgICB9Ci0KLSAgcmV0dXJuIGluZm8tPm1vZGlmaWVkICsgaW5keDsKLX0KLQwKLS8qIFJvdXRpbmVzIGZvciB0aGUgaGFzaCB0YWJsZSBtYXBwaW5nIG5hbWVzIHRvIHR5cGVzLiAgKi8KLQotLyogSW5pdGlhbGl6ZSBhbiBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotaWVlZV9uYW1lX3R5cGVfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mICpyZXQpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT50eXBlcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgaWVlZV9uYW1lX3R5cGVfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBUcmF2ZXJzZSB0aGUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgaWVlZV9uYW1lX3R5cGVfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfaGFzaF90cmF2ZXJzZQkJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotDAotLyogVGhlIGdlbmVyYWwgcm91dGluZSB0byB3cml0ZSBvdXQgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1ib29sZWFuCi13cml0ZV9pZWVlX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBkaGFuZGxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgaW5mbzsKLSAgYXNlY3Rpb24gKnM7Ci0gIGNvbnN0IGNoYXIgKmVycjsKLSAgc3RydWN0IGllZWVfYnVmICpiOwotCi0gIG1lbXNldCAoJmluZm8sIDAsIHNpemVvZiBpbmZvKTsKLSAgaW5mby5hYmZkID0gYWJmZDsKLSAgaW5mby50eXBlX2luZHggPSAyNTY7Ci0gIGluZm8ubmFtZV9pbmR4ID0gMzI7Ci0KLSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdCAoJmluZm8udHlwZWRlZnMucm9vdCwgaWVlZV9uYW1lX3R5cGVfbmV3ZnVuYykKLSAgICAgIHx8ICEgYmZkX2hhc2hfdGFibGVfaW5pdCAoJmluZm8udGFncy5yb290LCBpZWVlX25hbWVfdHlwZV9uZXdmdW5jKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLmdsb2JhbF90eXBlcykKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLmRhdGEpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby50eXBlcykKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLnZhcnMpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby5jeHgpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby5saW5lbm9zKQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyICgmaW5mbywgJmluZm8uZm50eXBlKQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyICgmaW5mbywgJmluZm8uZm5hcmdzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgZGVidWdfd3JpdGUgKGRoYW5kbGUsICZpZWVlX2ZucywgKFBUUikgJmluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW5mby5maWxlbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfZmluaXNoX2NvbXBpbGF0aW9uX3VuaXQgKCZpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFB1dCBhbnkgdW5kZWZpbmVkIHRhZ3MgaW4gdGhlIGdsb2JhbCB0eXBlZGVmIGluZm9ybWF0aW9uLiAgKi8KLSAgaW5mby5lcnJvciA9IGZhbHNlOwotICBpZWVlX25hbWVfdHlwZV9oYXNoX3RyYXZlcnNlICgmaW5mby50YWdzLAotCQkJCWllZWVfd3JpdGVfdW5kZWZpbmVkX3RhZywKLQkJCQkoUFRSKSAmaW5mbyk7Ci0gIGlmIChpbmZvLmVycm9yKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBQcmVwZW5kIHRoZSBnbG9iYWwgdHlwZWRlZiBpbmZvcm1hdGlvbiB0byB0aGUgb3RoZXIgZGF0YS4gICovCi0gIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8uZ2xvYmFsX3R5cGVzKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgSFAgZGVidWdnZXIgc2VlbXMgdG8gaGF2ZSBhIGJ1ZyBpbiB3aGljaCBpdCBpZ25vcmVzIHRoZQotICAgICAgICAgbGFzdCBlbnRyeSBpbiB0aGUgZ2xvYmFsIHR5cGVzLCBzbyB3ZSBhZGQgYSBkdW1teSBlbnRyeS4gICovCi0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKCZpbmZvLCAmaW5mby5nbG9iYWxfdHlwZXMpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoJmluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoJmluZm8sIGluZm8ubmFtZV9pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX2lkICgmaW5mbywgIiIpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoJmluZm8sIChpbnQpIGllZWVfdHlfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyICgmaW5mbywgaW5mby50eXBlX2luZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoJmluZm8sIDB4Y2UpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyICgmaW5mbywgaW5mby5uYW1lX2luZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyICgmaW5mbywgJ1AnKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoJmluZm8sIChpbnQpIGJ1aWx0aW5fdm9pZCArIDMyKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKCZpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGllZWVfYXBwZW5kX2J1ZmZlciAoJmluZm8sICZpbmZvLmdsb2JhbF90eXBlcywgJmluZm8uZGF0YSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5mby5kYXRhID0gaW5mby5nbG9iYWxfdHlwZXM7Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgZGVjbGFyZSBCQjExIGJsb2NrcyBmb3IgZWFjaCByYW5nZSBpbiB0aGUKLSAgICAgZmlsZS4gIFRoZXkgYXJlIGFkZGVkIHRvIGluZm8tPnZhcnMuICAqLwotICBpbmZvLmVycm9yID0gZmFsc2U7Ci0gIGlmICghIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby52YXJzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgaWVlZV9hZGRfYmIxMV9ibG9ja3MsIChQVFIpICZpbmZvKTsKLSAgaWYgKGluZm8uZXJyb3IpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLnZhcnMpKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoJmluZm8sICZpbmZvLnZhcnMpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoJmluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyICgmaW5mbywgJmluZm8uZGF0YSwgJmluZm8udmFycykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBOb3cgYWxsIHRoZSBkYXRhIGlzIGluIGluZm8uZGF0YS4gIFdyaXRlIGl0IG91dCB0byB0aGUgQkZELiAgV2UKLSAgICAgbm9ybWFsbHkgd291bGQgbmVlZCB0byB3b3JyeSBhYm91dCB3aGV0aGVyIGFsbCB0aGUgb3RoZXIgc2VjdGlvbnMKLSAgICAgYXJlIHNldCB1cCB5ZXQsIGJ1dCB0aGUgSUVFRSBiYWNrZW5kIHdpbGwgaGFuZGxlIHRoaXMgcGFydGljdWxhcgotICAgICBjYXNlIGNvcnJlY3RseSByZWdhcmRsZXNzLiAgKi8KLSAgaWYgKGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8uZGF0YSkpCi0gICAgewotICAgICAgLyogVGhlcmUgaXMgbm8gZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZXJyID0gTlVMTDsKLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZGVidWciKTsKLSAgaWYgKHMgPT0gTlVMTCkKLSAgICBlcnIgPSAiYmZkX21ha2Vfc2VjdGlvbiI7Ci0gIGlmIChlcnIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIFNFQ19ERUJVR0dJTkcgfCBTRUNfSEFTX0NPTlRFTlRTKSkKLQllcnIgPSAiYmZkX3NldF9zZWN0aW9uX2ZsYWdzIjsKLSAgICB9Ci0gIGlmIChlcnIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLSAgICAgIHNpemUgPSAwOwotICAgICAgZm9yIChiID0gaW5mby5kYXRhLmhlYWQ7IGIgIT0gTlVMTDsgYiA9IGItPm5leHQpCi0Jc2l6ZSArPSBiLT5jOwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHMsIHNpemUpKQotCWVyciA9ICJiZmRfc2V0X3NlY3Rpb25fc2l6ZSI7Ci0gICAgfQotICBpZiAoZXJyID09IE5VTEwpCi0gICAgewotICAgICAgZmlsZV9wdHIgb2Zmc2V0OwotCi0gICAgICBvZmZzZXQgPSAwOwotICAgICAgZm9yIChiID0gaW5mby5kYXRhLmhlYWQ7IGIgIT0gTlVMTDsgYiA9IGItPm5leHQpCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzLCBiLT5idWYsIG9mZnNldCwgYi0+YykpCi0JICAgIHsKLQkgICAgICBlcnIgPSAiYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgb2Zmc2V0ICs9IGItPmM7Ci0JfQotICAgIH0KLQotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGVyciwKLQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBiZmRfaGFzaF90YWJsZV9mcmVlICgmaW5mby50eXBlZGVmcy5yb290KTsKLSAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJmluZm8udGFncy5yb290KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGluZm9ybWF0aW9uIGZvciBhbiB1bmRlZmluZWQgdGFnLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi0gICBpZWVlX25hbWVfdHlwZV9oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfdW5kZWZpbmVkX3RhZyAoaCwgcCkKLSAgICAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqbnQ7Ci0KLSAgZm9yIChudCA9IGgtPnR5cGVzOyBudCAhPSBOVUxMOyBudCA9IG50LT5uZXh0KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBuYW1lX2luZHg7Ci0gICAgICBjaGFyIGNvZGU7Ci0KLSAgICAgIGlmIChudC0+a2luZCA9PSBERUJVR19LSU5EX0lMTEVHQUwpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT5nbG9iYWxfdHlwZXMpKQotCXsKLQkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmdsb2JhbF90eXBlcykKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMikKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpKQotCSAgICB7Ci0JICAgICAgaW5mby0+ZXJyb3IgPSB0cnVlOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5nbG9iYWxfdHlwZXMpKQotCSAgICB7Ci0JICAgICAgaW5mby0+ZXJyb3IgPSB0cnVlOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgbmFtZV9pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotICAgICAgKytpbmZvLT5uYW1lX2luZHg7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmFtZV9pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBudC0+dHlwZS5uYW1lKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfdHlfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBudC0+dHlwZS5pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDB4Y2UpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuYW1lX2luZHgpKQotCXsKLQkgIGluZm8tPmVycm9yID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAobnQtPmtpbmQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQkgIGluZm8tPmVycm9yID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIERFQlVHX0tJTkRfU1RSVUNUOgotCWNhc2UgREVCVUdfS0lORF9DTEFTUzoKLQkgIGNvZGUgPSAnUyc7Ci0JICBicmVhazsKLQljYXNlIERFQlVHX0tJTkRfVU5JT046Ci0JY2FzZSBERUJVR19LSU5EX1VOSU9OX0NMQVNTOgotCSAgY29kZSA9ICdVJzsKLQkgIGJyZWFrOwotCWNhc2UgREVCVUdfS0lORF9FTlVNOgotCSAgY29kZSA9ICdFJzsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBjb2RlKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkpCi0JewotCSAgaW5mby0+ZXJyb3IgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IHdyaXRpbmcgb3V0IGluZm9ybWF0aW9uIGZvciBhIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdGFydF9jb21waWxhdGlvbl91bml0IChwLCBmaWxlbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIGNvbnN0IGNoYXIgKm1vZG5hbWU7Ci0gIGNoYXIgKmMsICpzOwotICB1bnNpZ25lZCBpbnQgbmluZHg7Ci0KLSAgaWYgKGluZm8tPmZpbGVuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9maW5pc2hfY29tcGlsYXRpb25fdW5pdCAoaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBtb2RuYW1lID0gc3RycmNociAoZmlsZW5hbWUsICcvJyk7Ci0gIGlmIChtb2RuYW1lICE9IE5VTEwpCi0gICAgKyttb2RuYW1lOwotICBlbHNlCi0gICAgewotICAgICAgbW9kbmFtZSA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnXFwnKTsKLSAgICAgIGlmIChtb2RuYW1lICE9IE5VTEwpCi0JKyttb2RuYW1lOwotICAgICAgZWxzZQotCW1vZG5hbWUgPSBmaWxlbmFtZTsKLSAgICB9Ci0gIGMgPSB4c3RyZHVwIChtb2RuYW1lKTsKLSAgcyA9IHN0cnJjaHIgKGMsICcuJyk7Ci0gIGlmIChzICE9IE5VTEwpCi0gICAgKnMgPSAnXDAnOwotICBpbmZvLT5tb2RuYW1lID0gYzsKLQotICBpZiAoISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+Y3h4KQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+bGluZW5vcykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpbmZvLT5yYW5nZXMgPSBOVUxMOwotCi0gIC8qIEFsd2F5cyBpbmNsdWRlIGEgQkIxIGFuZCBhIEJCMyBibG9jay4gIFRoYXQgaXMgd2hhdCB0aGUgb3V0cHV0IG9mCi0gICAgIHRoZSBNUkkgbGlua2VyIHNlZW1zIHRvIGxvb2sgbGlrZS4gICovCi0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPm1vZG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLSAgKytpbmZvLT5uYW1lX2luZHg7Ci0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+bW9kbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgYSBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZmluaXNoX2NvbXBpbGF0aW9uX3VuaXQgKGluZm8pCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLXsKLSAgc3RydWN0IGllZWVfcmFuZ2UgKnI7Ci0KLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZXMpKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+Y3h4KSkKLSAgICB7Ci0gICAgICAvKiBBcHBlbmQgYW55IEMrKyBpbmZvcm1hdGlvbiB0byB0aGUgZ2xvYmFsIGZ1bmN0aW9uIGFuZAotICAgICAgICAgdmFyaWFibGUgaW5mb3JtYXRpb24uICAqLwotICAgICAgYXNzZXJ0ICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnZhcnMpKTsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV2UgcHV0IHRoZSBwbWlzYyByZWNvcmRzIGluIGEgZHVtbXkgcHJvY2VkdXJlLCBqdXN0IGFzIHRoZQotICAgICAgICAgTVJJIGNvbXBpbGVyIGRvZXMuICAqLwotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDYpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiX19YUllDUFAiKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmZvLT5oaWdoYWRkciAtIDEpCi0JICB8fCAhIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMsICZpbmZvLT5jeHgpCi0JICB8fCAhIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZm8tPmhpZ2hhZGRyIC0gMSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT52YXJzKSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPnBlbmRpbmdfbGluZW5vX2ZpbGVuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgLyogRm9yY2Ugb3V0IHRoZSBwZW5kaW5nIGxpbmUgbnVtYmVyLiAgKi8KLSAgICAgIGlmICghIGllZWVfbGluZW5vICgoUFRSKSBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAwLCAoYmZkX3ZtYSkgLTEpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPmxpbmVub3MpKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmxpbmVub3MpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHN0cmNtcCAoaW5mby0+ZmlsZW5hbWUsIGluZm8tPmxpbmVub19maWxlbmFtZSkgIT0gMCkKLQl7Ci0JICAvKiBXZSB3ZXJlIG5vdCBpbiB0aGUgbWFpbiBmaWxlLiAgV2UganVzdCBjbG9zZWQgdGhlCi0gICAgICAgICAgICAgaW5jbHVkZWQgbGluZSBudW1iZXIgYmxvY2ssIGFuZCBub3cgd2UgbXVzdCBjbG9zZSB0aGUKLSAgICAgICAgICAgICBtYWluIGxpbmUgbnVtYmVyIGJsb2NrLiAgKi8KLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmICghIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgJmluZm8tPmRhdGEsICZpbmZvLT50eXBlcykKLSAgICAgIHx8ICEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+ZGF0YSwgJmluZm8tPnZhcnMpCi0gICAgICB8fCAhIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgJmluZm8tPmRhdGEsICZpbmZvLT5saW5lbm9zKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQnVpbGQgQkIxMC9CQjExIGJsb2NrcyBiYXNlZCBvbiB0aGUgcmFuZ2VzIHdlIHJlY29yZGVkLiAgKi8KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+ZGF0YSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPm1vZG5hbWUpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIkdOVSBvYmpjb3B5IikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAociA9IGluZm8tPnJhbmdlczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGxvdywgaGlnaDsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgaW50IGtpbmQ7Ci0KLSAgICAgIGxvdyA9IHItPmxvdzsKLSAgICAgIGhpZ2ggPSByLT5oaWdoOwotCi0gICAgICAvKiBGaW5kIHRoZSBzZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyByYW5nZS4gICovCi0gICAgICBmb3IgKHMgPSBpbmZvLT5hYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpZiAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoaW5mby0+YWJmZCwgcykgPD0gbG93Ci0JICAgICAgJiYgaGlnaCA8PSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoaW5mby0+YWJmZCwgcykKLQkJCSAgKyBiZmRfc2VjdGlvbl9zaXplIChpbmZvLT5hYmZkLCBzKSkpCi0JICAgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHMgPT0gTlVMTCkKLQl7Ci0JICAvKiBKdXN0IGlnbm9yZSB0aGlzIHJhbmdlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQ29hbGVzY2UgcmFuZ2VzIGlmIGl0IHNlZW1zIHJlYXNvbmFibGUuICAqLwotICAgICAgd2hpbGUgKHItPm5leHQgIT0gTlVMTAotCSAgICAgJiYgaGlnaCArIDB4MTAwMCA+PSByLT5uZXh0LT5sb3cKLQkgICAgICYmIChyLT5uZXh0LT5oaWdoCi0JCSA8PSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoaW5mby0+YWJmZCwgcykKLQkJICAgICArIGJmZF9zZWN0aW9uX3NpemUgKGluZm8tPmFiZmQsIHMpKSkpCi0JewotCSAgciA9IHItPm5leHQ7Ci0JICBoaWdoID0gci0+aGlnaDsKLQl9Ci0KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLQlraW5kID0gMTsKLSAgICAgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMCkKLQlraW5kID0gMzsKLSAgICAgIGVsc2UKLQlraW5kID0gMjsKLQotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDExKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBraW5kKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgcy0+aW5kZXggKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBsb3cpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGhpZ2ggLSBsb3cpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQWRkIHRoaXMgcmFuZ2UgdG8gdGhlIGxpc3Qgb2YgZ2xvYmFsIHJhbmdlcy4gICovCi0gICAgICBpZiAoISBpZWVlX2FkZF9yYW5nZSAoaW5mbywgdHJ1ZSwgbG93LCBoaWdoKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgQkIxMSBibG9ja3MgZGVzY3JpYmluZyBlYWNoIHJhbmdlIHRoYXQgd2UgaGF2ZSBub3QgYWxyZWFkeQotICAgZGVzY3JpYmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWllZWVfYWRkX2JiMTFfYmxvY2tzIChhYmZkLCBzZWMsIGRhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgZGF0YTsKLSAgYmZkX3ZtYSBsb3csIGhpZ2g7Ci0gIHN0cnVjdCBpZWVlX3JhbmdlICpyOwotCi0gIGxvdyA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYyk7Ci0gIGhpZ2ggPSBsb3cgKyBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpOwotCi0gIC8qIEZpbmQgdGhlIGZpcnN0IHJhbmdlIGF0IG9yIGFmdGVyIHRoaXMgc2VjdGlvbi4gIFRoZSByYW5nZXMgYXJlCi0gICAgIHNvcnRlZCBieSBhZGRyZXNzLiAgKi8KLSAgZm9yIChyID0gaW5mby0+Z2xvYmFsX3JhbmdlczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLSAgICBpZiAoci0+aGlnaCA+IGxvdykKLSAgICAgIGJyZWFrOwotCi0gIHdoaWxlIChsb3cgPCBoaWdoKQotICAgIHsKLSAgICAgIGlmIChyID09IE5VTEwgfHwgci0+bG93ID49IGhpZ2gpCi0JewotCSAgaWYgKCEgaWVlZV9hZGRfYmIxMSAoaW5mbywgc2VjLCBsb3csIGhpZ2gpKQotCSAgICBpbmZvLT5lcnJvciA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAobG93IDwgci0+bG93Ci0JICAmJiByLT5sb3cgLSBsb3cgPiAweDEwMCkKLQl7Ci0JICBpZiAoISBpZWVlX2FkZF9iYjExIChpbmZvLCBzZWMsIGxvdywgci0+bG93KSkKLQkgICAgewotCSAgICAgIGluZm8tPmVycm9yID0gdHJ1ZTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgICBsb3cgPSByLT5oaWdoOwotCi0gICAgICByID0gci0+bmV4dDsKLSAgICB9Ci19Ci0KLS8qIEFkZCBhIHNpbmdsZSBCQjExIGJsb2NrIGZvciBhIHJhbmdlLiAgV2UgYWRkIGl0IHRvIGluZm8tPnZhcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9hZGRfYmIxMSAoaW5mbywgc2VjLCBsb3csIGhpZ2gpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSBsb3c7Ci0gICAgIGJmZF92bWEgaGlnaDsKLXsKLSAgaW50IGtpbmQ7Ci0KLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dmFycykpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCAqbW9kbmFtZTsKLSAgICAgIGNoYXIgKmMsICpzOwotCi0gICAgICAvKiBTdGFydCB0aGUgZW5jbG9zaW5nIEJCMTAgYmxvY2suICAqLwotICAgICAgZmlsZW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChpbmZvLT5hYmZkKTsKLSAgICAgIG1vZG5hbWUgPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLSAgICAgIGlmIChtb2RuYW1lICE9IE5VTEwpCi0JKyttb2RuYW1lOwotICAgICAgZWxzZQotCXsKLQkgIG1vZG5hbWUgPSBzdHJyY2hyIChmaWxlbmFtZSwgJ1xcJyk7Ci0JICBpZiAobW9kbmFtZSAhPSBOVUxMKQotCSAgICArK21vZG5hbWU7Ci0JICBlbHNlCi0JICAgIG1vZG5hbWUgPSBmaWxlbmFtZTsKLQl9Ci0gICAgICBjID0geHN0cmR1cCAobW9kbmFtZSk7Ci0gICAgICBzID0gc3RycmNociAoYywgJy4nKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JKnMgPSAnXDAnOwotCi0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMTApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBjKQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICJHTlUgb2JqY29weSIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZnJlZSAoYyk7Ci0gICAgfQotCi0gIGlmICgoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotICAgIGtpbmQgPSAxOwotICBlbHNlIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMCkKLSAgICBraW5kID0gMzsKLSAgZWxzZQotICAgIGtpbmQgPSAyOwotCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxMSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywga2luZCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHNlYy0+aW5kZXggKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBsb3cpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGhpZ2ggLSBsb3cpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgcmVjb3JkaW5nIGluZm9ybWF0aW9uIGZyb20gYSBwYXJ0aWN1bGFyIHNvdXJjZSBmaWxlLiAgVGhpcyBpcwotICAgdXNlZCB0byByZWNvcmQgd2hpY2ggZmlsZSBkZWZpbmVkIHdoaWNoIHR5cGVzLCB2YXJpYWJsZXMsIGV0Yy4gIEl0Ci0gICBpcyBub3QgdXNlZCBmb3IgbGluZSBudW1iZXJzLCBzaW5jZSB0aGUgbGluZW5vIGVudHJ5IHBvaW50IHBhc3NlcwotICAgZG93biB0aGUgZmlsZSBuYW1lIGFueWhvdy4gIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGRvZXNuJ3Qgc2VlbQotICAgdG8gc3RvcmUgdGhpcyBpbmZvcm1hdGlvbiBhbnl3aGVyZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWllZWVfc3RhcnRfc291cmNlIChwLCBmaWxlbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhbiBlbXB0eSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZW1wdHlfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIChpbnQpIGJ1aWx0aW5fdW5rbm93biwgMCwgZmFsc2UsIGZhbHNlKTsKLX0KLQotLyogTWFrZSBhIHZvaWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3ZvaWRfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIChpbnQpIGJ1aWx0aW5fdm9pZCwgMCwgZmFsc2UsIGZhbHNlKTsKLX0KLQotLyogTWFrZSBhbiBpbnRlZ2VyIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9pbnRfdHlwZSAocCwgc2l6ZSwgdW5zaWduZWRwKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBpbmR4OwotCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fc2lnbmVkX2NoYXI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpbmR4ID0gKGludCkgYnVpbHRpbl9zaWduZWRfc2hvcnRfaW50OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fc2lnbmVkX2xvbmc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICBpbmR4ID0gKGludCkgYnVpbHRpbl9zaWduZWRfbG9uZ19sb25nOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiSUVFRSB1bnN1cHBvcnRlZCBpbnRlZ2VyIHR5cGUgc2l6ZSAldVxuIiksIHNpemUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAodW5zaWduZWRwKQotICAgICsraW5keDsKLQotICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGluZHgsIHNpemUsIHVuc2lnbmVkcCwgZmFsc2UpOwotfQotCi0vKiBNYWtlIGEgZmxvYXRpbmcgcG9pbnQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2Zsb2F0X3R5cGUgKHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLQotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIGluZHggPSAoaW50KSBidWlsdGluX2Zsb2F0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fZG91YmxlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjoKLSAgICAgIC8qIEZJWE1FOiBUaGlzIHNpemUgcmVhbGx5IGRlcGVuZHMgdXBvbiB0aGUgcHJvY2Vzc29yLiAgKi8KLSAgICAgIGluZHggPSAoaW50KSBidWlsdGluX2xvbmdfZG91YmxlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGluZHggPSAoaW50KSBidWlsdGluX2xvbmdfbG9uZ19kb3VibGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJRUVFIHVuc3VwcG9ydGVkIGZsb2F0IHR5cGUgc2l6ZSAldVxuIiksIHNpemUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGluZHgsIHNpemUsIGZhbHNlLCBmYWxzZSk7Ci19Ci0KLS8qIE1ha2UgYSBjb21wbGV4IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9jb21wbGV4X3R5cGUgKHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBjaGFyIGNvZGU7Ci0KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICBpZiAoaW5mby0+Y29tcGxleF9mbG9hdF9pbmRleCAhPSAwKQotCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgaW5mby0+Y29tcGxleF9mbG9hdF9pbmRleCwgc2l6ZSAqIDIsCi0JCQkgICAgICAgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGNvZGUgPSAnYyc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEyOgotICAgIGNhc2UgMTY6Ci0gICAgICAvKiBUaGVzZSBjYXNlcyBjYW4gYmUgb3V0cHV0IGJ5IGdjYyAtZ3N0YWJzLiAgT3V0cHV0dGluZyB0aGUKLSAgICAgICAgIHdyb25nIHR5cGUgaXMgYmV0dGVyIHRoYW4gY3Jhc2hpbmcuICAqLwotICAgIGNhc2UgODoKLSAgICAgIGlmIChpbmZvLT5jb21wbGV4X2RvdWJsZV9pbmRleCAhPSAwKQotCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgaW5mby0+Y29tcGxleF9kb3VibGVfaW5kZXgsIHNpemUgKiAyLAotCQkJICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBjb2RlID0gJ2QnOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiSUVFRSB1bnN1cHBvcnRlZCBjb21wbGV4IHR5cGUgc2l6ZSAldVxuIiksIHNpemUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBGSVhNRTogSSBkb24ndCBrbm93IHdoYXQgdGhlIHN0cmluZyBpcyBmb3IuICAqLwotICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCBzaXplICogMiwgZmFsc2UsIGZhbHNlKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgY29kZSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoc2l6ZSA9PSA0KQotICAgIGluZm8tPmNvbXBsZXhfZmxvYXRfaW5kZXggPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0gIGVsc2UKLSAgICBpbmZvLT5jb21wbGV4X2RvdWJsZV9pbmRleCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhIGJvb2xlYW4gdHlwZS4gIElFRUUgZG9lc24ndCBzdXBwb3J0IHRoZXNlLCBzbyB3ZSBqdXN0IG1ha2UKLSAgIGFuIGludGVnZXIgdHlwZSBpbnN0ZWFkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfYm9vbF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHJldHVybiBpZWVlX2ludF90eXBlIChwLCBzaXplLCB0cnVlKTsKLX0KLQotLyogTWFrZSBhbiBlbnVtZXJhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2VudW1fdHlwZSAocCwgdGFnLCBuYW1lcywgdmFscykKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVzOwotICAgICBiZmRfc2lnbmVkX3ZtYSAqdmFsczsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBzdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0gKmU7Ci0gIGJvb2xlYW4gbG9jYWxwLCBzaW1wbGU7Ci0gIHVuc2lnbmVkIGludCBpbmR4OwotICBpbnQgaSA9IDA7Ci0KLSAgbG9jYWxwID0gZmFsc2U7Ci0gIGluZHggPSAodW5zaWduZWQgaW50KSAtMTsKLSAgZm9yIChlID0gaW5mby0+ZW51bXM7IGUgIT0gTlVMTDsgZSA9IGUtPm5leHQpCi0gICAgewotICAgICAgaWYgKHRhZyA9PSBOVUxMKQotCXsKLQkgIGlmIChlLT50YWcgIT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChlLT50YWcgPT0gTlVMTAotCSAgICAgIHx8IHRhZ1swXSAhPSBlLT50YWdbMF0KLQkgICAgICB8fCBzdHJjbXAgKHRhZywgZS0+dGFnKSAhPSAwKQotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICghIGUtPmRlZmluZWQpCi0JewotCSAgLyogVGhpcyBlbnVtIHRhZyBoYXMgYmVlbiBzZWVuIGJ1dCBub3QgZGVmaW5lZC4gICovCi0JICBpbmR4ID0gZS0+aW5keDsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKG5hbWVzICE9IE5VTEwgJiYgZS0+bmFtZXMgIT0gTlVMTCkKLQl7Ci0JICBmb3IgKGkgPSAwOyBuYW1lc1tpXSAhPSBOVUxMICYmIGUtPm5hbWVzW2ldICE9IE5VTEw7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChuYW1lc1tpXVswXSAhPSBlLT5uYW1lc1tpXVswXQotCQkgIHx8IHZhbHNbaV0gIT0gZS0+dmFsc1tpXQotCQkgIHx8IHN0cmNtcCAobmFtZXNbaV0sIGUtPm5hbWVzW2ldKSAhPSAwKQotCQlicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKChuYW1lcyA9PSBOVUxMICYmIGUtPm5hbWVzID09IE5VTEwpCi0JICB8fCAobmFtZXMgIT0gTlVMTAotCSAgICAgICYmIGUtPm5hbWVzICE9IE5VTEwKLQkgICAgICAmJiBuYW1lc1tpXSA9PSBOVUxMCi0JICAgICAgJiYgZS0+bmFtZXNbaV0gPT0gTlVMTCkpCi0JewotCSAgLyogV2UndmUgc2VlbiB0aGlzIGVudW0gYmVmb3JlLiAgKi8KLQkgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgZS0+aW5keCwgMCwgdHJ1ZSwgZmFsc2UpOwotCX0KLQotICAgICAgaWYgKHRhZyAhPSBOVUxMKQotCXsKLQkgIC8qIFdlJ3ZlIGFscmVhZHkgc2VlbiBhbiBlbnVtIG9mIHRoZSBzYW1lIG5hbWUsIHNvIHdlIG11c3QgbWFrZQotCSAgICAgc3VyZSB0byBvdXRwdXQgdGhpcyBvbmUgbG9jYWxseS4gICovCi0JICBsb2NhbHAgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgc2ltcGxlIGVudW1lcmF0aW9uLCBpbiB3aGljaCB0aGUgdmFsdWVzIHN0YXJ0IGF0IDAKLSAgICAgYW5kIGFsd2F5cyBpbmNyZW1lbnQgYnkgMSwgd2UgY2FuIHVzZSB0eXBlIEUuICBPdGhlcndpc2Ugd2UgbXVzdAotICAgICB1c2UgdHlwZSBOLiAgKi8KLQotICBzaW1wbGUgPSB0cnVlOwotICBpZiAobmFtZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBuYW1lc1tpXSAhPSBOVUxMOyBpKyspCi0JewotCSAgaWYgKHZhbHNbaV0gIT0gaSkKLQkgICAgewotCSAgICAgIHNpbXBsZSA9IGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoISBpZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCB0YWcsIGluZHgsIDAsIHRydWUsIGxvY2FscCwKLQkJCQkoc3RydWN0IGllZWVfYnVmbGlzdCAqKSBOVUxMKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgc2ltcGxlID8gJ0UnIDogJ04nKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChzaW1wbGUpCi0gICAgewotICAgICAgLyogRklYTUU6IFRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIGVudW1lcmF0aW9uIHNpemUsIGJ1dCB3ZQotICAgICAgICAgZG9uJ3Qgc3RvcmUgdGhhdC4gICovCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKG5hbWVzICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgbmFtZXNbaV0gIT0gTlVMTDsgaSsrKQotCXsKLQkgIGlmICghIGllZWVfd3JpdGVfaWQgKGluZm8sIG5hbWVzW2ldKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKCEgc2ltcGxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHZhbHNbaV0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICghIGxvY2FscCkKLSAgICB7Ci0gICAgICBpZiAoaW5keCA9PSAodW5zaWduZWQgaW50KSAtMSkKLQl7Ci0JICBlID0gKHN0cnVjdCBpZWVlX2RlZmluZWRfZW51bSAqKSB4bWFsbG9jIChzaXplb2YgKmUpOwotCSAgbWVtc2V0IChlLCAwLCBzaXplb2YgKmUpOwotCSAgZS0+aW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLQkgIGUtPnRhZyA9IHRhZzsKLQotCSAgZS0+bmV4dCA9IGluZm8tPmVudW1zOwotCSAgaW5mby0+ZW51bXMgPSBlOwotCX0KLQotICAgICAgZS0+bmFtZXMgPSBuYW1lczsKLSAgICAgIGUtPnZhbHMgPSB2YWxzOwotICAgICAgZS0+ZGVmaW5lZCA9IHRydWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGEgcG9pbnRlciB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcG9pbnRlcl90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGxvY2FscDsKLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKm0gPSBOVUxMOwotCi0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogQSBwb2ludGVyIHRvIGEgc2ltcGxlIGJ1aWx0aW4gdHlwZSBjYW4gYmUgb2J0YWluZWQgYnkgYWRkaW5nIDMyLgotICAgICBGSVhNRTogV2lsbCB0aGlzIGJlIGEgc2hvcnQgcG9pbnRlciwgYW5kIHdpbGwgdGhhdCBtYXR0ZXI/ICAqLwotICBpZiAoaW5keCA8IDMyKQotICAgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgaW5keCArIDMyLCAwLCB0cnVlLCBmYWxzZSk7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIHsKLSAgICAgIG0gPSBpZWVlX2dldF9tb2RpZmllZF9pbmZvIChwLCBpbmR4KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZSBhcmNoaXRlY3R1cmUuICAqLwotICAgICAgaWYgKG0tPnBvaW50ZXIgPiAwKQotCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbS0+cG9pbnRlciwgNCwgdHJ1ZSwgZmFsc2UpOwotICAgIH0KLQotICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCA0LCB0cnVlLCBsb2NhbHApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAnUCcpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIG0tPnBvaW50ZXIgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSBmdW5jdGlvbiB0eXBlLiAgVGhpcyB3aWxsIGJlIGNhbGxlZCBmb3IgYSBtZXRob2QsIGJ1dCB3ZQotICAgZG9uJ3Qgd2FudCB0byBhY3R1YWxseSBhZGQgaXQgdG8gdGhlIHR5cGUgdGFibGUgaW4gdGhhdCBjYXNlLiAgV2UKLSAgIGhhbmRsZSB0aGlzIGJ5IGRlZmluaW5nIHRoZSB0eXBlIGluIGEgcHJpdmF0ZSBidWZmZXIsIGFuZCBvbmx5Ci0gICBhZGRpbmcgdGhhdCBidWZmZXIgdG8gdGhlIHR5cGVkZWYgYmxvY2sgaWYgd2UgYXJlIGdvaW5nIHRvIHVzZSBpdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2Z1bmN0aW9uX3R5cGUgKHAsIGFyZ2NvdW50LCB2YXJhcmdzKQotICAgICBQVFIgcDsKLSAgICAgaW50IGFyZ2NvdW50OwotICAgICBib29sZWFuIHZhcmFyZ3M7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCAqYXJncyA9IE5VTEw7Ci0gIGludCBpOwotICB1bnNpZ25lZCBpbnQgcmV0aW5keDsKLSAgc3RydWN0IGllZWVfYnVmbGlzdCBmbmRlZjsKLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbTsKLQotICBsb2NhbHAgPSBmYWxzZTsKLQotICBpZiAoYXJnY291bnQgPiAwKQotICAgIHsKLSAgICAgIGFyZ3MgPSAodW5zaWduZWQgaW50ICopIHhtYWxsb2MgKGFyZ2NvdW50ICogc2l6ZW9mICphcmdzKTsKLSAgICAgIGZvciAoaSA9IGFyZ2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwKQotCSAgICBsb2NhbHAgPSB0cnVlOwotCSAgYXJnc1tpXSA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGFyZ2NvdW50IDwgMCkKLSAgICB2YXJhcmdzID0gZmFsc2U7Ci0KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwKQotICAgIGxvY2FscCA9IHRydWU7Ci0gIHJldGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBtID0gTlVMTDsKLSAgaWYgKGFyZ2NvdW50IDwgMCAmJiAhIGxvY2FscCkKLSAgICB7Ci0gICAgICBtID0gaWVlZV9nZXRfbW9kaWZpZWRfaW5mbyAocCwgcmV0aW5keCk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKG0tPmZ1bmN0aW9uID4gMCkKLQlyZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIG0tPmZ1bmN0aW9uLCAwLCB0cnVlLCBmYWxzZSk7Ci0gICAgfQotCi0gIC8qIEFuIGF0dHJpYnV0ZSBvZiAweDQxIG1lYW5zIHRoYXQgdGhlIGZyYW1lIGFuZCBwdXNoIG1hc2sgYXJlCi0gICAgIHVua25vd24uICAqLwotICBpZiAoISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmZm5kZWYpCi0gICAgICB8fCAhIGllZWVfZGVmaW5lX25hbWVkX3R5cGUgKGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICAgKHVuc2lnbmVkIGludCkgLTEsIDAsIHRydWUsIGxvY2FscCwKLQkJCQkgICAmZm5kZWYpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAneCcpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAweDQxKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCByZXRpbmR4KQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgKGJmZF92bWEpIGFyZ2NvdW50ICsgKHZhcmFyZ3MgPyAxIDogMCkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGFyZ2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykKLQlpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgYXJnc1tpXSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICBmcmVlIChhcmdzKTsKLSAgICB9Ci0gIGlmICh2YXJhcmdzKQotICAgIHsKLSAgICAgIC8qIEEgdmFyYXJncyBmdW5jdGlvbiBpcyByZXByZXNlbnRlZCBieSB3cml0aW5nIG91dCB0aGUgbGFzdAotICAgICAgICAgYXJndW1lbnQgYXMgdHlwZSB2b2lkICosIGFsdGhvdWdoIHRoaXMgbWFrZXMgbGl0dGxlIHNlbnNlLiAgKi8KLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAoYmZkX3ZtYSkgYnVpbHRpbl92b2lkICsgMzIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXZSB3cm90ZSB0aGUgaW5mb3JtYXRpb24gaW50byBmbmRlZiwgaW4gY2FzZSB3ZSBkb24ndCBuZWVkIGl0LgotICAgICBJdCB3aWxsIGJlIGFwcGVuZGVkIHRvIGluZm8tPnR5cGVzIGJ5IGllZWVfcG9wX3R5cGUuICAqLwotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmZuZGVmID0gZm5kZWY7Ci0KLSAgaWYgKG0gIT0gTlVMTCkKLSAgICBtLT5mdW5jdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhIHJlZmVyZW5jZSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVmZXJlbmNlX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgLyogSUVFRSBhcHBlYXJzIHRvIHJlY29yZCBhIG5vcm1hbCBwb2ludGVyIHR5cGUsIGFuZCB0aGVuIHVzZSBhCi0gICAgIHBtaXNjIHJlY29yZCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIHJlYWxseSBhIHJlZmVyZW5jZS4gICovCi0KLSAgaWYgKCEgaWVlZV9wb2ludGVyX3R5cGUgKHApKQotICAgIHJldHVybiBmYWxzZTsKLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5yZWZlcmVuY2VwID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSByYW5nZSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmFuZ2VfdHlwZSAocCwgbG93LCBoaWdoKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3NpZ25lZF92bWEgbG93OwotICAgICBiZmRfc2lnbmVkX3ZtYSBoaWdoOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBib29sZWFuIHVuc2lnbmVkcCwgbG9jYWxwOwotCi0gIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnNpemU7Ci0gIHVuc2lnbmVkcCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUudW5zaWduZWRwOwotICBsb2NhbHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscDsKLSAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotICByZXR1cm4gKGllZWVfZGVmaW5lX3R5cGUgKGluZm8sIHNpemUsIHVuc2lnbmVkcCwgbG9jYWxwKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICdSJykKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAoYmZkX3ZtYSkgbG93KQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIChiZmRfdm1hKSBoaWdoKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHVuc2lnbmVkcCA/IDAgOiAxKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHNpemUpKTsKLX0KLQotLyogTWFrZSBhbiBhcnJheSB0eXBlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9hcnJheV90eXBlIChwLCBsb3csIGhpZ2gsIHN0cmluZ3ApCi0gICAgIFBUUiBwOwotICAgICBiZmRfc2lnbmVkX3ZtYSBsb3c7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGhpZ2g7Ci0gICAgIGJvb2xlYW4gc3RyaW5ncDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgZWxlaW5keDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICptID0gTlVMTDsKLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfYXJyYXlfdHlwZSAqYTsKLQotICAvKiBJRUVFIGRvZXMgbm90IHN0b3JlIHRoZSByYW5nZSwgc28gd2UganVzdCBpZ25vcmUgaXQuICAqLwotICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zaXplOwotICBlbGVpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogSWYgd2UgZG9uJ3Qga25vdyB0aGUgcmFuZ2UsIHRyZWF0IHRoZSBzaXplIGFzIGV4YWN0bHkgb25lCi0gICAgIGVsZW1lbnQuICAqLwotICBpZiAobG93IDwgaGlnaCkKLSAgICBzaXplICo9IChoaWdoIC0gbG93KSArIDE7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIHsKLSAgICAgIG0gPSBpZWVlX2dldF9tb2RpZmllZF9pbmZvIChpbmZvLCBlbGVpbmR4KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBmb3IgKGEgPSBtLT5hcnJheXM7IGEgIT0gTlVMTDsgYSA9IGEtPm5leHQpCi0JewotCSAgaWYgKGEtPmxvdyA9PSBsb3cgJiYgYS0+aGlnaCA9PSBoaWdoKQotCSAgICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGEtPmluZHgsIHNpemUsIGZhbHNlLCBmYWxzZSk7Ci0JfQotICAgIH0KLQotICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCBzaXplLCBmYWxzZSwgbG9jYWxwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbG93ID09IDAgPyAnWicgOiAnQycpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBlbGVpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChsb3cgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbG93KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBoaWdoICsgMSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGxvY2FscCkKLSAgICB7Ci0gICAgICBhID0gKHN0cnVjdCBpZWVlX21vZGlmaWVkX2FycmF5X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICphKTsKLSAgICAgIG1lbXNldCAoYSwgMCwgc2l6ZW9mICphKTsKLQotICAgICAgYS0+aW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLSAgICAgIGEtPmxvdyA9IGxvdzsKLSAgICAgIGEtPmhpZ2ggPSBoaWdoOwotCi0gICAgICBhLT5uZXh0ID0gbS0+YXJyYXlzOwotICAgICAgbS0+YXJyYXlzID0gYTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSBzZXQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3NldF90eXBlIChwLCBiaXRzdHJpbmdwKQotICAgICBQVFIgcDsKLSAgICAgYm9vbGVhbiBiaXRzdHJpbmdwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gbG9jYWxwOwotICB1bnNpZ25lZCBpbnQgZWxlaW5keDsKLQotICBsb2NhbHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscDsKLSAgZWxlaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIC8qIEZJWE1FOiBXZSBkb24ndCBrbm93IHRoZSBzaXplLCBzbyB3ZSBqdXN0IHVzZSA0LiAgKi8KLQotICByZXR1cm4gKGllZWVfZGVmaW5lX3R5cGUgKGluZm8sIDAsIHRydWUsIGxvY2FscCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAncycpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBlbGVpbmR4KSk7Ci19Ci0KLS8qIE1ha2UgYW4gb2Zmc2V0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9vZmZzZXRfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IHRhcmdldGluZHgsIGJhc2VpbmR4OwotCi0gIHRhcmdldGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLSAgYmFzZWluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICAvKiBGSVhNRTogVGhlIE1SSSBDKysgY29tcGlsZXIgZG9lcyBub3QgYXBwZWFyIHRvIGdlbmVyYXRlIGFueQotICAgICB1c2VmdWwgdHlwZSBpbmZvcm1hdGlvbiBhYm91dCBhbiBvZmZzZXQgdHlwZS4gIEl0IGp1c3QgcmVjb3JkcyBhCi0gICAgIHBvaW50ZXIgdG8gbWVtYmVyIGFzIGFuIGludGVnZXIuICBUaGUgTVJJL0hQIElFRUUgc3BlYyBkb2VzCi0gICAgIGRlc2NyaWJlIGEgcG1pc2MgcmVjb3JkIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBhIHBvaW50ZXIgdG8KLSAgICAgbWVtYmVyLiAgVW5mb3J0dW5hdGVseSwgaXQgZG9lcyBub3QgZGVzY3JpYmUgdGhlIHRhcmdldCB0eXBlLAotICAgICB3aGljaCBzZWVtcyBwcmV0dHkgaW1wb3J0YW50LiAgSSdtIGdvaW5nIHRvIHB1bnQgdGhpcyBmb3Igbm93LiAgKi8KLQotICByZXR1cm4gaWVlZV9pbnRfdHlwZSAocCwgNCwgdHJ1ZSk7Ci19ICAKLQotLyogTWFrZSBhIG1ldGhvZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfbWV0aG9kX3R5cGUgKHAsIGRvbWFpbiwgYXJnY291bnQsIHZhcmFyZ3MpCi0gICAgIFBUUiBwOwotICAgICBib29sZWFuIGRvbWFpbjsKLSAgICAgaW50IGFyZ2NvdW50OwotICAgICBib29sZWFuIHZhcmFyZ3M7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICAvKiBGSVhNRTogVGhlIE1SSS9IUCBJRUVFIHNwZWMgZGVmaW5lcyBhIHBtaXNjIHJlY29yZCB0byB1c2UgZm9yIGEKLSAgICAgbWV0aG9kLCBidXQgdGhlIGRlZmluaXRpb24gaXMgaW5jb21wbGV0ZS4gIFdlIGp1c3Qgb3V0cHV0IGFuICd4JwotICAgICB0eXBlLiAgKi8KLQotICBpZiAoZG9tYWluKQotICAgIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKLQotICByZXR1cm4gaWVlZV9mdW5jdGlvbl90eXBlIChwLCBhcmdjb3VudCwgdmFyYXJncyk7Ci19Ci0KLS8qIE1ha2UgYSBjb25zdCBxdWFsaWZpZWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NvbnN0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBib29sZWFuIHVuc2lnbmVkcCwgbG9jYWxwOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbSA9IE5VTEw7Ci0KLSAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuc2l6ZTsKLSAgdW5zaWduZWRwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS51bnNpZ25lZHA7Ci0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIHsKLSAgICAgIG0gPSBpZWVlX2dldF9tb2RpZmllZF9pbmZvIChpbmZvLCBpbmR4KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAobS0+Y29uc3RfcXVhbGlmaWVkID4gMCkKLQlyZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIG0tPmNvbnN0X3F1YWxpZmllZCwgc2l6ZSwgdW5zaWduZWRwLAotCQkJICAgICAgIGZhbHNlKTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgc2l6ZSwgdW5zaWduZWRwLCBsb2NhbHApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAnbicpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAxKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGxvY2FscCkKLSAgICBtLT5jb25zdF9xdWFsaWZpZWQgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSB2b2xhdGlsZSBxdWFsaWZpZWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3ZvbGF0aWxlX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBib29sZWFuIHVuc2lnbmVkcCwgbG9jYWxwOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbSA9IE5VTEw7Ci0KLSAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuc2l6ZTsKLSAgdW5zaWduZWRwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS51bnNpZ25lZHA7Ci0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIHsKLSAgICAgIG0gPSBpZWVlX2dldF9tb2RpZmllZF9pbmZvIChpbmZvLCBpbmR4KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAobS0+dm9sYXRpbGVfcXVhbGlmaWVkID4gMCkKLQlyZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIG0tPnZvbGF0aWxlX3F1YWxpZmllZCwgc2l6ZSwgdW5zaWduZWRwLAotCQkJICAgICAgIGZhbHNlKTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgc2l6ZSwgdW5zaWduZWRwLCBsb2NhbHApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAnbicpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAyKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGxvY2FscCkKLSAgICBtLT52b2xhdGlsZV9xdWFsaWZpZWQgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvbnZlcnQgYW4gZW51bSBkZWJ1Z192aXNpYmlsaXR5IGludG8gYSBDWFhGTEFHUyB2YWx1ZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWllZWVfdmlzX3RvX2ZsYWdzICh2aXNpYmlsaXR5KQotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3dpdGNoICh2aXNpYmlsaXR5KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzoKLSAgICAgIHJldHVybiBDWFhGTEFHU19WSVNJQklMSVRZX1BVQkxJQzsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURToKLSAgICAgIHJldHVybiBDWFhGTEFHU19WSVNJQklMSVRZX1BSSVZBVEU7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDoKLSAgICAgIHJldHVybiBDWFhGTEFHU19WSVNJQklMSVRZX1BST1RFQ1RFRDsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIFN0YXJ0IGRlZmluaW5nIGEgc3RydWN0IHR5cGUuICBXZSBidWlsZCBpdCBpbiB0aGUgc3RyZGVmIGZpZWxkIG9uCi0gICB0aGUgc3RhY2ssIHRvIGF2b2lkIGNvbmZ1c2luZyB0eXBlIGRlZmluaXRpb25zIHJlcXVpcmVkIGJ5IHRoZQotICAgZmllbGRzIHdpdGggdGhlIHN0cnVjdCB0eXBlIGl0c2VsZi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3N0YXJ0X3N0cnVjdF90eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBsb2NhbHAsIGlnbm9yZXA7Ci0gIGJvb2xlYW4gY29weTsKLSAgY2hhciBhYlsyMF07Ci0gIGNvbnN0IGNoYXIgKmxvb2s7Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKm50LCAqbnRsb29rOwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHN0cmRlZjsKLQotICBsb2NhbHAgPSBmYWxzZTsKLSAgaWdub3JlcCA9IGZhbHNlOwotCi0gIC8qIFdlIG5lZWQgdG8gY3JlYXRlIGEgdGFnIGZvciBpbnRlcm5hbCB1c2UgZXZlbiBpZiB3ZSBkb24ndCB3YW50Ci0gICAgIG9uZSBmb3IgZXh0ZXJuYWwgdXNlLiAgVGhpcyB3aWxsIGxldCB1cyByZWZlciB0byBhbiBhbm9ueW1vdXMKLSAgICAgc3RydWN0LiAgKi8KLSAgaWYgKHRhZyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGxvb2sgPSB0YWc7Ci0gICAgICBjb3B5ID0gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ByaW50ZiAoYWIsICJfX2Fub24ldSIsIGlkKTsKLSAgICAgIGxvb2sgPSBhYjsKLSAgICAgIGNvcHkgPSB0cnVlOwotICAgIH0KLQotICAvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgcmVmZXJlbmNlcyB0byB0aGUgdGFnLCB3ZSBtdXN0IHVzZSB0aGUKLSAgICAgZXhpc3RpbmcgdHlwZSBpbmRleC4gICovCi0gIGggPSBpZWVlX25hbWVfdHlwZV9oYXNoX2xvb2t1cCAoJmluZm8tPnRhZ3MsIGxvb2ssIHRydWUsIGNvcHkpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBudCA9IE5VTEw7Ci0gIGZvciAobnRsb29rID0gaC0+dHlwZXM7IG50bG9vayAhPSBOVUxMOyBudGxvb2sgPSBudGxvb2stPm5leHQpCi0gICAgewotICAgICAgaWYgKG50bG9vay0+aWQgPT0gaWQpCi0JbnQgPSBudGxvb2s7Ci0gICAgICBlbHNlIGlmICghIG50bG9vay0+dHlwZS5sb2NhbHApCi0JewotCSAgLyogV2UgYXJlIGNyZWF0aW5nIGEgZHVwbGljYXRlIGRlZmluaXRpb24gb2YgYSBnbG9iYWxseQotCSAgICAgZGVmaW5lZCB0YWcuICBGb3JjZSBpdCB0byBiZSBsb2NhbCB0byBhdm9pZAotCSAgICAgY29uZnVzaW9uLiAgKi8KLQkgIGxvY2FscCA9IHRydWU7Ci0JfQotICAgIH0KLQotICBpZiAobnQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGxvY2FscCA9PSBudC0+dHlwZS5sb2NhbHApOwotICAgICAgaWYgKG50LT5raW5kID09IERFQlVHX0tJTkRfSUxMRUdBTCAmJiAhIGxvY2FscCkKLQl7Ci0JICAvKiBXZSd2ZSBhbHJlYWR5IHNlZW4gYSBnbG9iYWwgZGVmaW5pdGlvbiBvZiB0aGUgdHlwZS4KLSAgICAgICAgICAgICBJZ25vcmUgdGhpcyBuZXcgZGVmaW5pdGlvbi4gICovCi0JICBpZ25vcmVwID0gdHJ1ZTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbnQgPSAoc3RydWN0IGllZWVfbmFtZV90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqbnQpOwotICAgICAgbWVtc2V0IChudCwgMCwgc2l6ZW9mICpudCk7Ci0gICAgICBudC0+aWQgPSBpZDsKLSAgICAgIG50LT50eXBlLm5hbWUgPSBoLT5yb290LnN0cmluZzsKLSAgICAgIG50LT5uZXh0ID0gaC0+dHlwZXM7Ci0gICAgICBoLT50eXBlcyA9IG50OwotICAgICAgbnQtPnR5cGUuaW5keCA9IGluZm8tPnR5cGVfaW5keDsKLSAgICAgICsraW5mby0+dHlwZV9pbmR4OwotICAgIH0KLQotICBudC0+a2luZCA9IERFQlVHX0tJTkRfSUxMRUdBTDsKLQotICBpZiAoISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmc3RyZGVmKQotICAgICAgfHwgISBpZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCB0YWcsIG50LT50eXBlLmluZHgsIHNpemUsIHRydWUsCi0JCQkJICAgbG9jYWxwLCAmc3RyZGVmKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgc3RydWN0cCA/ICdTJyA6ICdVJykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBpZ25vcmVwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmhvbGQ7Ci0KLSAgICAgIC8qIFdlIG5ldmVyIHdhbnQgbnQtPnR5cGUubmFtZSB0byBiZSBOVUxMLiAgV2Ugd2FudCB0aGUgcmVzdCBvZgotCSB0aGUgdHlwZSB0byBiZSB0aGUgb2JqZWN0IHNldCB1cCBvbiB0aGUgdHlwZSBzdGFjazsgaXQgd2lsbAotCSBoYXZlIGEgTlVMTCBuYW1lIGlmIHRhZyBpcyBOVUxMLiAgKi8KLSAgICAgIGhvbGQgPSBudC0+dHlwZS5uYW1lOwotICAgICAgbnQtPnR5cGUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlOwotICAgICAgbnQtPnR5cGUubmFtZSA9IGhvbGQ7Ci0gICAgfQotCi0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUubmFtZSA9IHRhZzsKLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zdHJkZWYgPSBzdHJkZWY7Ci0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaWdub3JlcCA9IGlnbm9yZXA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIGZpZWxkIHRvIGEgc3RydWN0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc3RydWN0X2ZpZWxkIChwLCBuYW1lLCBiaXRwb3MsIGJpdHNpemUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgYmZkX3ZtYSBiaXRzaXplOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgYm9vbGVhbiB1bnNpZ25lZHA7Ci0gIGJvb2xlYW4gcmVmZXJlbmNlcDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCBpbmR4OwotICBiZmRfdm1hIG9mZnNldDsKLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTAotCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+bmV4dCAhPSBOVUxMCi0JICAmJiAhIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVfc3RhY2stPm5leHQtPnR5cGUuc3RyZGVmKSk7Ci0KLSAgLyogSWYgd2UgYXJlIGlnbm9yaW5nIHRoaXMgc3RydWN0IGRlZmluaXRpb24sIGp1c3QgcG9wIGFuZCBpZ25vcmUKLSAgICAgdGhlIHR5cGUuICAqLwotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+bmV4dC0+dHlwZS5pZ25vcmVwKQotICAgIHsKLSAgICAgIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zaXplOwotICB1bnNpZ25lZHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnVuc2lnbmVkcDsKLSAgcmVmZXJlbmNlcCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUucmVmZXJlbmNlcDsKLSAgbG9jYWxwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHA7Ci0gIGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBpZiAobG9jYWxwKQotICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwID0gdHJ1ZTsKLQotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBmbGFnczsKLSAgICAgIHVuc2lnbmVkIGludCBuaW5keDsKLQotICAgICAgLyogVGhpcyBpcyBhIGNsYXNzLiAgV2UgbXVzdCBhZGQgYSBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpZWxkIHRvCi0gICAgICAgICB0aGUgY2xhc3MgcmVjb3JkcyB3ZSBhcmUgYnVpbGRpbmcuICAqLwotCi0gICAgICBmbGFncyA9IGllZWVfdmlzX3RvX2ZsYWdzICh2aXNpYmlsaXR5KTsKLSAgICAgIG5pbmR4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+aW5keDsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywKLQkJCQkmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2NidWYpCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgJ2QnKQotCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIGZsYWdzKQotCSAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgbmFtZSkKLQkgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIG5hbWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjY291bnQgKz0gNDsKLQotICAgICAgaWYgKHJlZmVyZW5jZXApCi0JewotCSAgdW5zaWduZWQgaW50IG5pbmR4OwotCi0JICAvKiBXZSBuZWVkIHRvIG91dHB1dCBhIHJlY29yZCByZWNvcmRpbmcgdGhhdCB0aGlzIGZpZWxkIGlzCi0gICAgICAgICAgICAgcmVhbGx5IG9mIHJlZmVyZW5jZSB0eXBlLiAgV2UgcHV0IHRoaXMgb24gdGhlIHJlZnMgZmllbGQKLSAgICAgICAgICAgICBvZiBjbGFzc2RlZiwgc28gdGhhdCBpdCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIEMrKwotICAgICAgICAgICAgIHJlY29yZHMgYWZ0ZXIgdGhlIGNsYXNzIGlzIGRlZmluZWQuICAqLwotCi0JICBuaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLQkgICsraW5mby0+bmFtZV9pbmR4OwotCi0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sCi0JCQkJICAgICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5yZWZzKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIChpbnQpIGllZWVfYXRuX3JlY29yZF9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNjIpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgODApCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgJ1InKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAzKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIGluZm8tPnR5cGVfc3RhY2stPnR5cGUubmFtZSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBuYW1lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhlIGJpdHNpemUgZG9lc24ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgc2l6ZSwgd2UgbmVlZCB0byBvdXRwdXQKLSAgICAgYSBiaXRmaWVsZCB0eXBlLiAgKi8KLSAgaWYgKHNpemUgPT0gMCB8fCBiaXRzaXplID09IDAgfHwgYml0c2l6ZSA9PSBzaXplICogOCkKLSAgICBvZmZzZXQgPSBiaXRwb3MgLyA4OwotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgMCwgdW5zaWduZWRwLAotCQkJICAgICAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAnZycpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCB1bnNpZ25lZHAgPyAwIDogMSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGJpdHNpemUpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmR4KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0gICAgICBvZmZzZXQgPSBiaXRwb3M7Ci0gICAgfQotCi0gIC8qIFN3aXRjaCB0byB0aGUgc3RydWN0IHdlIGFyZSBidWlsZGluZyBpbiBvcmRlciB0byBvdXRwdXQgdGhpcwotICAgICBmaWVsZCBkZWZpbml0aW9uLiAgKi8KLSAgcmV0dXJuIChpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLnN0cmRlZikKLQkgICYmIGllZWVfd3JpdGVfaWQgKGluZm8sIG5hbWUpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBvZmZzZXQpKTsKLX0KLQotLyogRmluaXNoIHVwIGEgc3RydWN0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9lbmRfc3RydWN0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKnBiOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiAhIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuc3RyZGVmKSk7Ci0KLSAgLyogSWYgd2Ugd2VyZSBpZ25vcmluZyB0aGlzIHN0cnVjdCBkZWZpbml0aW9uIGJlY2F1c2UgaXQgd2FzIGEKLSAgICAgZHVwbGljYXRlIGRlZmludGlvbiwganVzdCB0aHJvdWdoIGF3YXkgd2hhdGV2ZXIgYnl0ZXMgd2UgaGF2ZQotICAgICBhY2N1bXVsYXRlZC4gIExlYXZlIHRoZSB0eXBlIG9uIHRoZSBzdGFjay4gKi8KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaWdub3JlcCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGlzIGlzIG5vdCBhIGR1cGxpY2F0ZSBkZWZpbml0aW9uIG9mIHRoaXMgdGFnLCB0aGVuIGxvY2FscAotICAgICB3aWxsIGJlIGZhbHNlLCBhbmQgd2UgY2FuIHB1dCBpdCBpbiB0aGUgZ2xvYmFsIHR5cGUgYmxvY2suCi0gICAgIEZJWE1FOiBXZSBzaG91bGQgYXZvaWQgb3V0cHV0dGluZyBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgd2hpY2ggYXJlCi0gICAgIHRoZSBzYW1lLiAgKi8KLSAgaWYgKCEgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHApCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgc3RhcnRlZCB0aGUgZ2xvYmFsIHR5cGUgYmxvY2suICAqLwotICAgICAgaWYgKGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPmdsb2JhbF90eXBlcykpCi0JewotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Z2xvYmFsX3R5cGVzKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAyKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBwYiA9ICZpbmZvLT5nbG9iYWxfdHlwZXM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgc3RhcnRlZCB0aGUgdHlwZXMgYmxvY2suICAqLwotICAgICAgaWYgKGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVzKSkKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcykKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+bW9kbmFtZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBwYiA9ICZpbmZvLT50eXBlczsKLSAgICB9Ci0KLSAgLyogQXBwZW5kIHRoZSBzdHJ1Y3QgZGVmaW5pdGlvbiB0byB0aGUgdHlwZXMuICAqLwotICBpZiAoISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sIHBiLCAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zdHJkZWYpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLnN0cmRlZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIExlYXZlIHRoZSBzdHJ1Y3Qgb24gdGhlIHR5cGUgc3RhY2suICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIGNsYXNzIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdGFydF9jbGFzc190eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplLCB2cHRyLCBvd252cHRyKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdnB0cjsKLSAgICAgYm9vbGVhbiBvd252cHRyOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIGNvbnN0IGNoYXIgKnZjbGFzczsKLSAgc3RydWN0IGllZWVfYnVmbGlzdCBwbWlzY2J1ZjsKLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIHN0cnVjdCBpZWVlX3R5cGVfY2xhc3MgKmNsYXNzZGVmOwotCi0gIC8qIEEgQysrIGNsYXNzIGlzIG91dHB1dCBhcyBhIEMrKyBzdHJ1Y3QgYWxvbmcgd2l0aCBhIHNldCBvZiBwbWlzYwotICAgICByZWNvcmRzIGRlc2NyaWJpbmcgdGhlIGNsYXNzLiAgKi8KLQotICAvKiBXZSBuZWVkIHRvIGhhdmUgYSBuYW1lIHNvIHRoYXQgd2UgY2FuIGFzc29jaWF0ZSB0aGUgc3RydWN0IGFuZAotICAgICB0aGUgY2xhc3MuICAqLwotICBpZiAodGFnID09IE5VTEwpCi0gICAgewotICAgICAgY2hhciAqdDsKLQotICAgICAgdCA9IChjaGFyICopIHhtYWxsb2MgKDIwKTsKLSAgICAgIHNwcmludGYgKHQsICJfX2Fub24ldSIsIGlkKTsKLSAgICAgIHRhZyA9IHQ7Ci0gICAgfQotCi0gIC8qIFdlIGNhbid0IHdyaXRlIG91dCB0aGUgdmlydHVhbCB0YWJsZSBpbmZvcm1hdGlvbiB1bnRpbCB3ZSBoYXZlCi0gICAgIGZpbmlzaGVkIHRoZSBjbGFzcywgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZSB2aXJ0dWFsIHRhYmxlIHNpemUuCi0gICAgIFdlIGdldCB0aGUgc2l6ZSBmcm9tIHRoZSBsYXJnZXN0IHZvZmZzZXQgd2Ugc2VlLiAgKi8KLSAgdmNsYXNzID0gTlVMTDsKLSAgaWYgKHZwdHIgJiYgISBvd252cHRyKQotICAgIHsKLSAgICAgIHZjbGFzcyA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubmFtZTsKLSAgICAgIGFzc2VydCAodmNsYXNzICE9IE5VTEwpOwotICAgICAgLyogV2UgZG9uJ3QgY2FsbCBpZWVlX3BvcF91bnVzZWRfdHlwZSwgc2luY2UgdGhlIGNsYXNzIHNob3VsZAotICAgICAgICAgZ2V0IGRlZmluZWQuICAqLwotICAgICAgKHZvaWQpIGllZWVfcG9wX3R5cGUgKGluZm8pOwotICAgIH0KLQotICBpZiAoISBpZWVlX3N0YXJ0X3N0cnVjdF90eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLSAgKytpbmZvLT5uYW1lX2luZHg7Ci0KLSAgLyogV2Ugd3JpdGUgb3V0IHBtaXNjIHJlY29yZHMgaW50byB0aGUgY2xhc3NkZWYgZmllbGQuICBXZSB3aWxsCi0gICAgIHdyaXRlIG91dCB0aGUgcG1pc2Mgc3RhcnQgYWZ0ZXIgd2Uga25vdyB0aGUgbnVtYmVyIG9mIHJlY29yZHMgd2UKLSAgICAgbmVlZC4gICovCi0gIGlmICghIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZwbWlzY2J1ZikKLSAgICAgIHx8ICEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmcG1pc2NidWYpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBpbmR4LCAnVCcpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBpbmR4LCBzdHJ1Y3RwID8gJ28nIDogJ3UnKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBpbmR4LCB0YWcpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjbGFzc2RlZiA9IChzdHJ1Y3QgaWVlZV90eXBlX2NsYXNzICopIHhtYWxsb2MgKHNpemVvZiAqY2xhc3NkZWYpOwotICBtZW1zZXQgKGNsYXNzZGVmLCAwLCBzaXplb2YgKmNsYXNzZGVmKTsKLQotICBjbGFzc2RlZi0+aW5keCA9IGluZHg7Ci0gIGNsYXNzZGVmLT5wbWlzY2J1ZiA9IHBtaXNjYnVmOwotICBjbGFzc2RlZi0+cG1pc2Njb3VudCA9IDM7Ci0gIGNsYXNzZGVmLT52Y2xhc3MgPSB2Y2xhc3M7Ci0gIGNsYXNzZGVmLT5vd252cHRyID0gb3dudnB0cjsKLQotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmID0gY2xhc3NkZWY7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIHN0YXRpYyBtZW1iZXIgdG8gYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NsYXNzX3N0YXRpY19tZW1iZXIgKHAsIG5hbWUsIHBoeXNuYW1lLCB2aXNpYmlsaXR5KQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBmbGFnczsKLSAgdW5zaWduZWQgaW50IG5pbmR4OwotCi0gIC8qIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHR5cGUuICBIb3BlZnVsbHkgdGhlcmUgd2lsbCBiZSBhIGNhbGwgdG8KLSAgICAgaWVlZV92YXJpYWJsZSBkZWNsYXJpbmcgdGhlIHBoeXNpY2FsIG5hbWUgYW5kIHRoZSB0eXBlLCBzaW5jZQotICAgICB0aGF0IGlzIHdoZXJlIGFuIElFRUUgY29uc3VtZXIgbXVzdCBnZXQgdGhlIHR5cGUuICAqLwotICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYgIT0gTlVMTCk7Ci0KLSAgZmxhZ3MgPSBpZWVlX3Zpc190b19mbGFncyAodmlzaWJpbGl0eSk7Ci0gIGZsYWdzIHw9IENYWEZMQUdTX1NUQVRJQzsKLQotICBuaW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPmluZHg7Ci0KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2NidWYpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgJ2QnKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIGZsYWdzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgbmFtZSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIHBoeXNuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjY291bnQgKz0gNDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgYmFzZSBjbGFzcyB0byBhIGNsYXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfY2xhc3NfYmFzZWNsYXNzIChwLCBiaXRwb3MsIHZpcnR1YWwsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgYm9vbGVhbiB2aXJ0dWFsOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBjb25zdCBjaGFyICpibmFtZTsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCBiaW5keDsKLSAgY2hhciAqZm5hbWU7Ci0gIHVuc2lnbmVkIGludCBmbGFnczsKLSAgdW5zaWduZWQgaW50IG5pbmR4OwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLm5hbWUgIT0gTlVMTAotCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+bmV4dCAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT5uZXh0LT50eXBlLmNsYXNzZGVmICE9IE5VTEwKLQkgICYmICEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZV9zdGFjay0+bmV4dC0+dHlwZS5zdHJkZWYpKTsKLQotICBibmFtZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubmFtZTsKLSAgbG9jYWxwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHA7Ci0gIGJpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogV2UgYXJlIGN1cnJlbnRseSBkZWZpbmluZyBib3RoIGEgc3RydWN0IGFuZCBhIGNsYXNzLiAgV2UgbXVzdAotICAgICB3cml0ZSBvdXQgYSBmaWVsZCBkZWZpbml0aW9uIGluIHRoZSBzdHJ1Y3Qgd2hpY2ggaG9sZHMgdGhlIGJhc2UKLSAgICAgY2xhc3MuICBUaGUgc3RhYnMgZGVidWdnaW5nIHJlYWRlciB3aWxsIGNyZWF0ZSBhIGZpZWxkIG5hbWVkCi0gICAgIF92YiRDTEFTUyBmb3IgYSB2aXJ0dWFsIGJhc2UgY2xhc3MsIHNvIHdlIGp1c3QgdXNlIHRoYXQuICBGSVhNRToKLSAgICAgd2Ugc2hvdWxkIG5vdCBkZXBlbmQgdXBvbiBhIGRldGFpbCBvZiBzdGFicyBkZWJ1Z2dpbmcuICAqLwotICBpZiAodmlydHVhbCkKLSAgICB7Ci0gICAgICBmbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoYm5hbWUpICsgc2l6ZW9mICJfdmIkIik7Ci0gICAgICBzcHJpbnRmIChmbmFtZSwgIl92YiQlcyIsIGJuYW1lKTsKLSAgICAgIGZsYWdzID0gQkFTRUZMQUdTX1ZJUlRVQUw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGxvY2FscCkKLQlpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscCA9IHRydWU7Ci0KLSAgICAgIGZuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChibmFtZSkgKyBzaXplb2YgIl9iJCIpOwotICAgICAgc3ByaW50ZiAoZm5hbWUsICJfYiQlcyIsIGJuYW1lKTsKLQotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zdHJkZWYpCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGZuYW1lKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgYmluZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBiaXRwb3MgLyA4KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmbGFncyA9IDA7Ci0gICAgfQotCi0gIGlmICh2aXNpYmlsaXR5ID09IERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURSkKLSAgICBmbGFncyB8PSBCQVNFRkxBR1NfUFJJVkFURTsKLQotICBuaW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPmluZHg7Ci0KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2NidWYpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgJ2InKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIGZsYWdzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgYm5hbWUpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIGZuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjY291bnQgKz0gNTsKLQotICBmcmVlIChmbmFtZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGJ1aWxkaW5nIGEgbWV0aG9kIGZvciBhIGNsYXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfY2xhc3Nfc3RhcnRfbWV0aG9kIChwLCBuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm1ldGhvZCA9PSBOVUxMKTsKLQotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5tZXRob2QgPSBuYW1lOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZWZpbmUgYSBuZXcgbWV0aG9kIHZhcmlhbnQsIGVpdGhlciBzdGF0aWMgb3Igbm90LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfY2xhc3NfbWV0aG9kX3ZhciAoaW5mbywgcGh5c25hbWUsIHZpc2liaWxpdHksIHN0YXRpY3AsIGNvbnN0cCwKLQkJICAgICAgIHZvbGF0aWxlcCwgdm9mZnNldCwgY29udGV4dCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgIGJvb2xlYW4gc3RhdGljcDsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotICAgICBiZmRfdm1hIHZvZmZzZXQ7Ci0gICAgIGJvb2xlYW4gY29udGV4dDsKLXsKLSAgdW5zaWduZWQgaW50IGZsYWdzOwotICB1bnNpZ25lZCBpbnQgbmluZHg7Ci0gIGJvb2xlYW4gdmlydHVhbDsKLQotICAvKiBXZSBkb24ndCBuZWVkIHRoZSB0eXBlIG9mIHRoZSBtZXRob2QuICBBbiBJRUVFIGNvbnN1bWVyIHdoaWNoCi0gICAgIHdhbnRzIHRoZSB0eXBlIG11c3QgdHJhY2sgZG93biB0aGUgZnVuY3Rpb24gYnkgdGhlIHBoeXNpY2FsIG5hbWUKLSAgICAgYW5kIGdldCB0aGUgdHlwZSBmcm9tIHRoYXQuICAqLwotICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0KLSAgLyogV2UgZG9uJ3QgdXNlIHRoZSBjb250ZXh0LiAgRklYTUU6IFdlIHByb2JhYmx5IG91Z2h0IHRvIHVzZSBpdCB0bwotICAgICBhZGp1c3QgdGhlIHZvZmZzZXQgc29tZWhvdywgYnV0IEkgZG9uJ3QgcmVhbGx5IGtub3cgaG93LiAgKi8KLSAgaWYgKGNvbnRleHQpCi0gICAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm1ldGhvZCAhPSBOVUxMKTsKLQotICBmbGFncyA9IGllZWVfdmlzX3RvX2ZsYWdzICh2aXNpYmlsaXR5KTsKLQotICAvKiBGSVhNRTogV2UgbmV2ZXIgc2V0IENYWEZMQUdTX09WRVJSSURFLCBDWFhGTEFHU19PUEVSQVRPUiwKLSAgICAgQ1hYRkxBR1NfQ1RPUkRUT1IsIENYWEZMQUdTX0NUT1IsIG9yIENYWEZMQUdTX0lOTElORS4gICovCi0KLSAgaWYgKHN0YXRpY3ApCi0gICAgZmxhZ3MgfD0gQ1hYRkxBR1NfU1RBVElDOwotICBpZiAoY29uc3RwKQotICAgIGZsYWdzIHw9IENYWEZMQUdTX0NPTlNUOwotICBpZiAodm9sYXRpbGVwKQotICAgIGZsYWdzIHw9IENYWEZMQUdTX1ZPTEFUSUxFOwotCi0gIG5pbmR4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+aW5keDsKLQotICB2aXJ0dWFsID0gY29udGV4dCB8fCB2b2Zmc2V0ID4gMDsKLQotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sCi0JCQkgICAgJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjYnVmKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIHZpcnR1YWwgPyAndicgOiAnbScpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgZmxhZ3MpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LAotCQkJICAgICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5tZXRob2QpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBwaHlzbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh2aXJ0dWFsKQotICAgIHsKLSAgICAgIGlmICh2b2Zmc2V0ID4gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+dm9mZnNldCkKLQlpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT52b2Zmc2V0ID0gdm9mZnNldDsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgdm9mZnNldCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgKytpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2NvdW50OwotICAgIH0KLQotICBpZiAoISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIDApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2NvdW50ICs9IDU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlZmluZSBhIG5ldyBtZXRob2QgdmFyaWFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NsYXNzX21ldGhvZF92YXJpYW50IChwLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgY29uc3RwLCB2b2xhdGlsZXAsCi0JCQkgICB2b2Zmc2V0LCBjb250ZXh0KQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci0gICAgIGJmZF92bWEgdm9mZnNldDsKLSAgICAgYm9vbGVhbiBjb250ZXh0OwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgcmV0dXJuIGllZWVfY2xhc3NfbWV0aG9kX3ZhciAoaW5mbywgcGh5c25hbWUsIHZpc2liaWxpdHksIGZhbHNlLCBjb25zdHAsCi0JCQkJdm9sYXRpbGVwLCB2b2Zmc2V0LCBjb250ZXh0KTsKLX0KLQotLyogRGVmaW5lIGEgbmV3IHN0YXRpYyBtZXRob2QgdmFyaWFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCAocCwgcGh5c25hbWUsIHZpc2liaWxpdHksIGNvbnN0cCwgdm9sYXRpbGVwKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gaWVlZV9jbGFzc19tZXRob2RfdmFyIChpbmZvLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgdHJ1ZSwgY29uc3RwLAotCQkJCXZvbGF0aWxlcCwgMCwgZmFsc2UpOwotfQotCi0vKiBGaW5pc2ggdXAgYSBtZXRob2QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9jbGFzc19lbmRfbWV0aG9kIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm1ldGhvZCAhPSBOVUxMKTsKLQotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5tZXRob2QgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2VuZF9jbGFzc190eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgbmluZHg7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYgIT0gTlVMTCk7Ci0KLSAgLyogSWYgd2Ugd2VyZSBpZ25vcmluZyB0aGlzIGNsYXNzIGRlZmluaXRpb24gYmVjYXVzZSBpdCB3YXMgYQotICAgICBkdXBsaWNhdGUgZGVmaW5pdGlvbiwganVzdCB0aHJvdWdoIGF3YXkgd2hhdGV2ZXIgYnl0ZXMgd2UgaGF2ZQotICAgICBhY2N1bXVsYXRlZC4gIExlYXZlIHRoZSB0eXBlIG9uIHRoZSBzdGFjay4gICovCi0gIGlmIChpbmZvLT50eXBlX3N0YWNrLT50eXBlLmlnbm9yZXApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbmluZHggPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5pbmR4OwotCi0gIC8qIElmIHdlIGhhdmUgYSB2aXJ0dWFsIHRhYmxlLCB3ZSBjYW4gd3JpdGUgb3V0IHRoZSBpbmZvcm1hdGlvbiBub3cuICAqLwotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+dmNsYXNzICE9IE5VTEwKLSAgICAgIHx8IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm93bnZwdHIpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLAotCQkJCSZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2J1ZikKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAneicpCi0JICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCAiIikKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LAotCQkJICAgICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnZvZmZzZXQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5vd252cHRyKQotCXsKLQkgIGlmICghIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCAiIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsCi0JCQkJICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT52Y2xhc3MpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2NvdW50ICs9IDU7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGF0IHdlIGtub3cgdGhlIG51bWJlciBvZiBwbWlzYyByZWNvcmRzLCB3ZSBjYW4gd3JpdGUgb3V0Ci0gICAgIHRoZSBhdG42MiB3aGljaCBzdGFydHMgdGhlIHBtaXNjIHJlY29yZHMsIGFuZCBhcHBlbmQgdGhlbSB0byB0aGUKLSAgICAgQysrIGJ1ZmZlcnMuICAqLwotCi0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmN4eCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQotICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikKLSAgICAgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIChpbnQpIGllZWVfYXRuX3JlY29yZF9lbnVtKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNjIpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA4MCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sCi0JCQkgICAgICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2NvdW50KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+Y3h4LAotCQkJICAgICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2J1ZikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5yZWZzKSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sICZpbmZvLT5jeHgsCi0JCQkJJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnJlZnMpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGllZWVfZW5kX3N0cnVjdF90eXBlIChwKTsKLX0KLQotLyogUHVzaCBhIHByZXZpb3VzbHkgc2VlbiB0eXBlZGVmIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV90eXBlZGVmX3R5cGUgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKm50OwotCi0gIGggPSBpZWVlX25hbWVfdHlwZV9oYXNoX2xvb2t1cCAoJmluZm8tPnR5cGVkZWZzLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotCi0gIC8qIGggc2hvdWxkIG5ldmVyIGJlIE5VTEwsIHNpbmNlIHRoYXQgd291bGQgaW1wbHkgdGhhdCB0aGUgZ2VuZXJpYwotICAgICBkZWJ1Z2dpbmcgY29kZSBoYXMgYXNrZWQgZm9yIGEgdHlwZWRlZiB3aGljaCBpdCBoYXMgbm90IHlldAotICAgICBkZWZpbmVkLiAgKi8KLSAgYXNzZXJ0IChoICE9IE5VTEwpOwotCi0gIC8qIFdlIGFsd2F5cyB1c2UgdGhlIG1vc3QgcmVjZW50bHkgZGVmaW5lZCB0eXBlIGZvciB0aGlzIG5hbWUsIHdoaWNoCi0gICAgIHdpbGwgYmUgdGhlIGZpcnN0IG9uZSBvbiB0aGUgbGlzdC4gICovCi0KLSAgbnQgPSBoLT50eXBlczsKLSAgaWYgKCEgaWVlZV9wdXNoX3R5cGUgKGluZm8sIG50LT50eXBlLmluZHgsIG50LT50eXBlLnNpemUsCi0JCQludC0+dHlwZS51bnNpZ25lZHAsIG50LT50eXBlLmxvY2FscCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENvcHkgb3ZlciBhbnkgb3RoZXIgdHlwZSBpbmZvcm1hdGlvbiB3ZSBtYXkgaGF2ZS4gICovCi0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUgPSBudC0+dHlwZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhIHRhZ2dlZCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV90YWdfdHlwZSAocCwgbmFtZSwgaWQsIGtpbmQpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIGJvb2xlYW4gY29weTsKLSAgY2hhciBhYlsyMF07Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKm50OwotCi0gIGlmIChraW5kID09IERFQlVHX0tJTkRfRU5VTSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0gKmU7Ci0KLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JYWJvcnQgKCk7Ci0gICAgICBmb3IgKGUgPSBpbmZvLT5lbnVtczsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkKLQlpZiAoZS0+dGFnICE9IE5VTEwgJiYgc3RyY21wIChlLT50YWcsIG5hbWUpID09IDApCi0JICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGUtPmluZHgsIDAsIHRydWUsIGZhbHNlKTsKLQotICAgICAgZSA9IChzdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0gKikgeG1hbGxvYyAoc2l6ZW9mICplKTsKLSAgICAgIG1lbXNldCAoZSwgMCwgc2l6ZW9mICplKTsKLQotICAgICAgZS0+aW5keCA9IGluZm8tPnR5cGVfaW5keDsKLSAgICAgICsraW5mby0+dHlwZV9pbmR4OwotICAgICAgZS0+dGFnID0gbmFtZTsKLSAgICAgIGUtPmRlZmluZWQgPSBmYWxzZTsKLQotICAgICAgZS0+bmV4dCA9IGluZm8tPmVudW1zOwotICAgICAgaW5mby0+ZW51bXMgPSBlOwotCi0gICAgICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGUtPmluZHgsIDAsIHRydWUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgbG9jYWxwID0gZmFsc2U7Ci0KLSAgY29weSA9IGZhbHNlOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNwcmludGYgKGFiLCAiX19hbm9uJXUiLCBpZCk7Ci0gICAgICBuYW1lID0gYWI7Ci0gICAgICBjb3B5ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaCA9IGllZWVfbmFtZV90eXBlX2hhc2hfbG9va3VwICgmaW5mby0+dGFncywgbmFtZSwgdHJ1ZSwgY29weSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAobnQgPSBoLT50eXBlczsgbnQgIT0gTlVMTDsgbnQgPSBudC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobnQtPmlkID09IGlkKQotCXsKLQkgIGlmICghIGllZWVfcHVzaF90eXBlIChpbmZvLCBudC0+dHlwZS5pbmR4LCBudC0+dHlwZS5zaXplLAotCQkJCW50LT50eXBlLnVuc2lnbmVkcCwgbnQtPnR5cGUubG9jYWxwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogQ29weSBvdmVyIGFueSBvdGhlciB0eXBlIGluZm9ybWF0aW9uIHdlIG1heSBoYXZlLiAgKi8KLQkgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUgPSBudC0+dHlwZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgaWYgKCEgbnQtPnR5cGUubG9jYWxwKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBkdXBsaWNhdGUgb2YgYSBnbG9iYWwgdHlwZSwgc28gaXQgbXVzdCBiZQotICAgICAgICAgICAgIGxvY2FsLiAqLwotCSAgbG9jYWxwID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIG50ID0gKHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKm50KTsKLSAgbWVtc2V0IChudCwgMCwgc2l6ZW9mICpudCk7Ci0KLSAgbnQtPmlkID0gaWQ7Ci0gIG50LT50eXBlLm5hbWUgPSBoLT5yb290LnN0cmluZzsKLSAgbnQtPnR5cGUuaW5keCA9IGluZm8tPnR5cGVfaW5keDsKLSAgbnQtPnR5cGUubG9jYWxwID0gbG9jYWxwOwotICArK2luZm8tPnR5cGVfaW5keDsKLSAgbnQtPmtpbmQgPSBraW5kOwotCi0gIG50LT5uZXh0ID0gaC0+dHlwZXM7Ci0gIGgtPnR5cGVzID0gbnQ7Ci0KLSAgaWYgKCEgaWVlZV9wdXNoX3R5cGUgKGluZm8sIG50LT50eXBlLmluZHgsIDAsIGZhbHNlLCBsb2NhbHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLm5hbWUgPSBoLT5yb290LnN0cmluZzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgdHlwZWRlZi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3R5cGRlZiAocCwgbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgc3RydWN0IGllZWVfd3JpdGVfdHlwZSB0eXBlOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgYm9vbGVhbiBmb3VuZDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKm50OwotCi0gIHR5cGUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlOwotICBpbmR4ID0gdHlwZS5pbmR4OwotCi0gIC8qIElmIHRoaXMgaXMgYSBzaW1wbGUgYnVpbHRpbiB0eXBlIHVzaW5nIGEgYnVpbHRpbiBuYW1lLCB3ZSBkb24ndAotICAgICB3YW50IHRvIG91dHB1dCB0aGUgdHlwZWRlZiBpdHNlbGYuICBXZSBhbHNvIHdhbnQgdG8gY2hhbmdlIHRoZQotICAgICB0eXBlIGluZGV4IHRvIGNvcnJlc3BvbmQgdG8gdGhlIG5hbWUgYmVpbmcgdXNlZC4gIFdlIHJlY29nbml6ZQotICAgICBuYW1lcyB1c2VkIGluIHN0YWJzIGRlYnVnZ2luZyBvdXRwdXQgZXZlbiBpZiB0aGV5IGRvbid0IGV4YWN0bHkKLSAgICAgY29ycmVzcG9uZCB0byB0aGUgbmFtZXMgdXNlZCBmb3IgdGhlIElFRUUgYnVpbHRpbiB0eXBlcy4gICovCi0gIGZvdW5kID0gZmFsc2U7Ci0gIGlmIChpbmR4IDw9ICh1bnNpZ25lZCBpbnQpIGJ1aWx0aW5fYmNkX2Zsb2F0KQotICAgIHsKLSAgICAgIHN3aXRjaCAoKGVudW0gYnVpbHRpbl90eXBlcykgaW5keCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX3ZvaWQ6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAidm9pZCIpID09IDApCi0JICAgIGZvdW5kID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX3NpZ25lZF9jaGFyOgotCWNhc2UgYnVpbHRpbl9jaGFyOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgInNpZ25lZCBjaGFyIikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSAodW5zaWduZWQgaW50KSBidWlsdGluX3NpZ25lZF9jaGFyOwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiY2hhciIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gKHVuc2lnbmVkIGludCkgYnVpbHRpbl9jaGFyOwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fdW5zaWduZWRfY2hhcjoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJ1bnNpZ25lZCBjaGFyIikgPT0gMCkKLQkgICAgZm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fc2lnbmVkX3Nob3J0X2ludDoKLQljYXNlIGJ1aWx0aW5fc2hvcnQ6Ci0JY2FzZSBidWlsdGluX3Nob3J0X2ludDoKLQljYXNlIGJ1aWx0aW5fc2lnbmVkX3Nob3J0OgotCSAgaWYgKHN0cmNtcCAobmFtZSwgInNpZ25lZCBzaG9ydCBpbnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9ICh1bnNpZ25lZCBpbnQpIGJ1aWx0aW5fc2lnbmVkX3Nob3J0X2ludDsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInNob3J0IikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSAodW5zaWduZWQgaW50KSBidWlsdGluX3Nob3J0OwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAic2hvcnQgaW50IikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSAodW5zaWduZWQgaW50KSBidWlsdGluX3Nob3J0X2ludDsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInNpZ25lZCBzaG9ydCIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gKHVuc2lnbmVkIGludCkgYnVpbHRpbl9zaWduZWRfc2hvcnQ7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl91bnNpZ25lZF9zaG9ydF9pbnQ6Ci0JY2FzZSBidWlsdGluX3Vuc2lnbmVkX3Nob3J0OgotCSAgaWYgKHN0cmNtcCAobmFtZSwgInVuc2lnbmVkIHNob3J0IGludCIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKG5hbWUsICJzaG9ydCB1bnNpZ25lZCBpbnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9IGJ1aWx0aW5fdW5zaWduZWRfc2hvcnRfaW50OwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAidW5zaWduZWQgc2hvcnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9IGJ1aWx0aW5fdW5zaWduZWRfc2hvcnQ7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl9zaWduZWRfbG9uZzoKLQljYXNlIGJ1aWx0aW5faW50OiAvKiBGSVhNRTogU2l6ZSBkZXBlbmRzIHVwb24gYXJjaGl0ZWN0dXJlLiAgKi8KLQljYXNlIGJ1aWx0aW5fbG9uZzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJzaWduZWQgbG9uZyIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gYnVpbHRpbl9zaWduZWRfbG9uZzsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImludCIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gYnVpbHRpbl9pbnQ7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJsb25nIikgPT0gMAotCQkgICB8fCBzdHJjbXAgKG5hbWUsICJsb25nIGludCIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gYnVpbHRpbl9sb25nOwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fdW5zaWduZWRfbG9uZzoKLQljYXNlIGJ1aWx0aW5fdW5zaWduZWQ6IC8qIEZJWE1FOiBTaXplIGRlcGVuZHMgdXBvbiBhcmNoaXRlY3R1cmUuICAqLwotCWNhc2UgYnVpbHRpbl91bnNpZ25lZF9pbnQ6IC8qIEZJWE1FOiBMaWtlIGJ1aWx0aW5fdW5zaWduZWQuICAqLwotCSAgaWYgKHN0cmNtcCAobmFtZSwgInVuc2lnbmVkIGxvbmciKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChuYW1lLCAibG9uZyB1bnNpZ25lZCBpbnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9IGJ1aWx0aW5fdW5zaWduZWRfbG9uZzsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInVuc2lnbmVkIikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSBidWlsdGluX3Vuc2lnbmVkOwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAidW5zaWduZWQgaW50IikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSBidWlsdGluX3Vuc2lnbmVkX2ludDsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX3NpZ25lZF9sb25nX2xvbmc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAic2lnbmVkIGxvbmcgbG9uZyIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKG5hbWUsICJsb25nIGxvbmcgaW50IikgPT0gMCkKLQkgICAgZm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fdW5zaWduZWRfbG9uZ19sb25nOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgInVuc2lnbmVkIGxvbmcgbG9uZyIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKG5hbWUsICJsb25nIGxvbmcgdW5zaWduZWQgaW50IikgPT0gMCkKLQkgICAgZm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fZmxvYXQ6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiZmxvYXQiKSA9PSAwKQotCSAgICBmb3VuZCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl9kb3VibGU6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiZG91YmxlIikgPT0gMCkKLQkgICAgZm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fbG9uZ19kb3VibGU6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAibG9uZyBkb3VibGUiKSA9PSAwKQotCSAgICBmb3VuZCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl9sb25nX2xvbmdfZG91YmxlOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgImxvbmcgbG9uZyBkb3VibGUiKSA9PSAwKQotCSAgICBmb3VuZCA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChmb3VuZCkKLQl0eXBlLmluZHggPSBpbmR4OwotICAgIH0KLQotICBoID0gaWVlZV9uYW1lX3R5cGVfaGFzaF9sb29rdXAgKCZpbmZvLT50eXBlZGVmcywgbmFtZSwgdHJ1ZSwgZmFsc2UpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTZWUgaWYgd2UgaGF2ZSBhbHJlYWR5IGRlZmluZWQgdGhpcyB0eXBlIHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgbG9jYWxwID0gdHlwZS5sb2NhbHA7Ci0gIGZvciAobnQgPSBoLT50eXBlczsgbnQgIT0gTlVMTDsgbnQgPSBudC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobnQtPmlkID09IGluZHgpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIGdsb2JhbCBkZWZpbml0aW9uLCB0aGVuIHdlIGRvbid0IG5lZWQgdG8KLQkgICAgIGRvIGFueXRoaW5nIGhlcmUuICAqLwotCSAgaWYgKCEgbnQtPnR5cGUubG9jYWxwKQotCSAgICB7Ci0JICAgICAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgaXMgYSBkdXBsaWNhdGUgZGVmaW5pdGlvbiwgc28gbWFrZSB0aGlzIG9uZSBsb2NhbC4gICovCi0JICBsb2NhbHAgPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBhZGQgYSBuZXcgdHlwZWRlZiBmb3IgdGhpcyB0eXBlLiAgKi8KLQotICBudCA9IChzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpudCk7Ci0gIG1lbXNldCAobnQsIDAsIHNpemVvZiAqbnQpOwotICBudC0+aWQgPSBpbmR4OwotICBudC0+dHlwZSA9IHR5cGU7Ci0gIG50LT50eXBlLm5hbWUgPSBuYW1lOwotICBudC0+dHlwZS5sb2NhbHAgPSBsb2NhbHA7Ci0gIG50LT5raW5kID0gREVCVUdfS0lORF9JTExFR0FMOwotCi0gIG50LT5uZXh0ID0gaC0+dHlwZXM7Ci0gIGgtPnR5cGVzID0gbnQ7Ci0KLSAgaWYgKGZvdW5kKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgb25lIG9mIHRoZSBidWlsdGluIHR5cGVkZWZzLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0gICAgICAgICBhY3R1YWxseSBkZWZpbmUgaXQuICAqLwotICAgICAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBpZiAoISBpZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCBuYW1lLCAodW5zaWduZWQgaW50KSAtMSwgdHlwZS5zaXplLAotCQkJCXR5cGUudW5zaWduZWRwLAlsb2NhbHAsCi0JCQkJKHN0cnVjdCBpZWVlX2J1Zmxpc3QgKikgTlVMTCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICdUJykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZHgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZW1vdmUgdGhlIHR5cGUgd2UganVzdCBhZGRlZCB0byB0aGUgdHlwZSBzdGFjay4gIFRoaXMgc2hvdWxkIG5vdAotICAgICBiZSBpZWVlX3BvcF91bnVzZWRfdHlwZSwgc2luY2UgdGhlIHR5cGUgaXMgdXNlZCwgd2UganVzdCBkb24ndAotICAgICBuZWVkIGl0IG5vdy4gICovCi0gICh2b2lkKSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgdGFnIGZvciBhIHR5cGUuICBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV90YWcgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgLyogVGhpcyBzaG91bGQgbm90IGJlIGllZWVfcG9wX3VudXNlZF90eXBlLCBzaW5jZSB3ZSB3YW50IHRoZSB0eXBlCi0gICAgIHRvIGJlIGRlZmluZWQuICAqLwotICAodm9pZCkgaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYW4gaW50ZWdlciBjb25zdGFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2ludF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIC8qIEZJWE1FLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZmxvYXRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRvdWJsZSB2YWw7Ci17Ci0gIC8qIEZJWE1FLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIHR5cGVkIGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfdHlwZWRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgLyogRklYTUUuICAqLwotICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3ZhcmlhYmxlIChwLCBuYW1lLCBraW5kLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zhcl9raW5kIGtpbmQ7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBuYW1lX2luZHg7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBib29sZWFuIHJlZmVyZW5jZXA7Ci0gIHVuc2lnbmVkIGludCB0eXBlX2luZHg7Ci0gIGJvb2xlYW4gYXNuOwotICBpbnQgcmVmZmxhZzsKLQotICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zaXplOwotICByZWZlcmVuY2VwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5yZWZlcmVuY2VwOwotICB0eXBlX2luZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBhc3NlcnQgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dmFycykpOwotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbmFtZV9pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotICArK2luZm8tPm5hbWVfaW5keDsKLQotICAvKiBXcml0ZSBvdXQgYW4gTk4gYW5kIGFuIEFUTiByZWNvcmQgZm9yIHRoaXMgdmFyaWFibGUuICAqLwotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmFtZV9pbmR4KQotICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBuYW1lKQotICAgICAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuYW1lX2luZHgpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCB0eXBlX2luZHgpKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3dpdGNoIChraW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSBERUJVR19HTE9CQUw6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgOCkKLQkgIHx8ICEgaWVlZV9hZGRfcmFuZ2UgKGluZm8sIGZhbHNlLCB2YWwsIHZhbCArIHNpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJlZmZsYWcgPSAwOwotICAgICAgYXNuID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfU1RBVElDOgotICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDMpCi0JICB8fCAhIGllZWVfYWRkX3JhbmdlIChpbmZvLCBmYWxzZSwgdmFsLCB2YWwgKyBzaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZWZmbGFnID0gMTsKLSAgICAgIGFzbiA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX0xPQ0FMX1NUQVRJQzoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAzKQotCSAgfHwgISBpZWVlX2FkZF9yYW5nZSAoaW5mbywgZmFsc2UsIHZhbCwgdmFsICsgc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmVmZmxhZyA9IDI7Ci0gICAgICBhc24gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19MT0NBTDoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAxKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgdmFsKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZWZmbGFnID0gMjsKLSAgICAgIGFzbiA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19SRUdJU1RFUjoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAyKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywKLQkJCQkgIGllZWVfZ2VucmVnX3RvX3JlZ25vIChpbmZvLT5hYmZkLCB2YWwpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZWZmbGFnID0gMjsKLSAgICAgIGFzbiA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChhc24pCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5hbWVfaW5keCwgdmFsKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgcmVhbGx5IGEgcmVmZXJlbmNlIHR5cGUsIHRoZW4gd2UganVzdCBvdXRwdXQgaXQgd2l0aAotICAgICBwb2ludGVyIHR5cGUsIGFuZCBtdXN0IG5vdyBvdXRwdXQgYSBDKysgcmVjb3JkIGluZGljYXRpbmcgdGhhdCBpdAotICAgICBpcyByZWFsbHkgcmVmZXJlbmNlIHR5cGUuICAqLwotICBpZiAocmVmZXJlbmNlcCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbmluZHg7Ci0KLSAgICAgIG5pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotICAgICAgKytpbmZvLT5uYW1lX2luZHg7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBnbG9iYWwgdmFyaWFibGUsIHdlIHdhbnQgdG8gb3V0cHV0IHRoZSBtaXNjCi0gICAgICAgICByZWNvcmQgaW4gdGhlIEMrKyBtaXNjIHJlY29yZCBibG9jay4gIE90aGVyd2lzZSwgd2Ugd2FudCB0bwotICAgICAgICAgb3V0cHV0IGl0IGp1c3QgYWZ0ZXIgdGhlIHZhcmlhYmxlIGRlZmluaXRpb24sIHdoaWNoIGlzIHdoZXJlCi0gICAgICAgICB0aGUgY3VycmVudCBidWZmZXIgaXMuICAqLwotICAgICAgaWYgKHJlZmZsYWcgIT0gMikKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5jeHgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotCSAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA2MikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDgwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMykKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAnUicpCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgcmVmZmxhZykKLQkgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIG5hbWUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IG91dHB1dHRpbmcgaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdGFydF9mdW5jdGlvbiAocCwgbmFtZSwgZ2xvYmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYm9vbGVhbiBnbG9iYWw7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiByZWZlcmVuY2VwOwotICB1bnNpZ25lZCBpbnQgcmV0aW5keCwgdHlwZWluZHg7Ci0KLSAgcmVmZXJlbmNlcCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUucmVmZXJlbmNlcDsKLSAgcmV0aW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIC8qIEJlc2lkZXMgcmVjb3JkaW5nIGEgQkI0IG9yIEJCNiBibG9jaywgd2UgcmVjb3JkIHRoZSB0eXBlIG9mIHRoZQotICAgICBmdW5jdGlvbiBpbiB0aGUgQkIxIHR5cGVkZWYgYmxvY2suICBXZSBjYW4ndCB3cml0ZSBvdXQgdGhlIGZ1bGwKLSAgICAgdHlwZSB1bnRpbCB3ZSBoYXZlIHNlZW4gYWxsIHRoZSBwYXJhbWV0ZXJzLCBzbyB3ZSBhY2N1bXVsYXRlIGl0Ci0gICAgIGluIGluZm8tPmZudHlwZSBhbmQgaW5mby0+Zm5hcmdzLiAgKi8KLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+Zm50eXBlKSkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogVGhpcyBtaWdodCBoYXBwZW4gc29tZWRheSBpZiB3ZSBzdXBwb3J0IG5lc3RlZAotICAgICAgICAgZnVuY3Rpb25zLiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpbmZvLT5mbm5hbWUgPSBuYW1lOwotCi0gIC8qIEFuIGF0dHJpYnV0ZSBvZiAweDQwIG1lYW5zIHRoYXQgdGhlIHB1c2ggbWFzayBpcyB1bmtub3duLiAgKi8KLSAgaWYgKCEgaWVlZV9kZWZpbmVfbmFtZWRfdHlwZSAoaW5mbywgbmFtZSwgKHVuc2lnbmVkIGludCkgLTEsIDAsIGZhbHNlLCB0cnVlLAotCQkJCSZpbmZvLT5mbnR5cGUpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAneCcpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAweDQwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCByZXRpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdHlwZWluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBpZiAoISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+Zm5hcmdzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGluZm8tPmZuYXJnY291bnQgPSAwOwotCi0gIC8qIElmIHRoZSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgaXMgYWN0dWFsbHkgYSByZWZlcmVuY2UgdHlwZSwgd2UKLSAgICAgbXVzdCBhZGQgYSByZWNvcmQgaW5kaWNhdGluZyB0aGF0LiAgKi8KLSAgaWYgKHJlZmVyZW5jZXApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG5pbmR4OwotCi0gICAgICBuaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLSAgICAgICsraW5mby0+bmFtZV9pbmR4OwotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Y3h4KQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotCSAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA2MikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDgwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMykKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAnUicpCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgZ2xvYmFsID8gMCA6IDEpCi0JICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBuYW1lKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGFzc2VydCAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT52YXJzKSk7Ci0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgYWRkcmVzcyBpcyB3cml0dGVuIG91dCBhcyB0aGUgZmlyc3QgYmxvY2suICAqLwotCi0gICsraW5mby0+YmxvY2tfZGVwdGg7Ci0KLSAgcmV0dXJuIChpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICAmJiBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIGdsb2JhbCA/IDQgOiA2KQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAmJiBpZWVlX3dyaXRlX2lkIChpbmZvLCBuYW1lKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgdHlwZWluZHgpKTsKLX0KLQotLyogQWRkIGEgZnVuY3Rpb24gcGFyYW1ldGVyLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlIGNhbGxlZCBiZWZvcmUgdGhlCi0gICBmaXJzdCBibG9jaywgc28gd2UgcG9zdHBvbmUgdGhlbSB1bnRpbCB3ZSBzZWUgdGhlIGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZnVuY3Rpb25fcGFyYW1ldGVyIChwLCBuYW1lLCBraW5kLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX3Bhcm1fa2luZCBraW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBzdHJ1Y3QgaWVlZV9wZW5kaW5nX3Bhcm0gKm0sICoqcG07Ci0KLSAgYXNzZXJ0IChpbmZvLT5ibG9ja19kZXB0aCA9PSAxKTsKLQotICBtID0gKHN0cnVjdCBpZWVlX3BlbmRpbmdfcGFybSAqKSB4bWFsbG9jIChzaXplb2YgKm0pOwotICBtZW1zZXQgKG0sIDAsIHNpemVvZiAqbSk7Ci0KLSAgbS0+bmV4dCA9IE5VTEw7Ci0gIG0tPm5hbWUgPSBuYW1lOwotICBtLT5yZWZlcmVuY2VwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5yZWZlcmVuY2VwOwotICBtLT50eXBlID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0gIG0tPmtpbmQgPSBraW5kOwotICBtLT52YWwgPSB2YWw7Ci0KLSAgZm9yIChwbSA9ICZpbmZvLT5wZW5kaW5nX3Bhcm1zOyAqcG0gIT0gTlVMTDsgcG0gPSAmKCpwbSktPm5leHQpCi0gICAgOwotICAqcG0gPSBtOwotCi0gIC8qIEFkZCB0aGUgdHlwZSB0byB0aGUgZm5hcmdzIGxpc3QuICAqLwotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5mbmFyZ3MpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBtLT50eXBlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICsraW5mby0+Zm5hcmdjb3VudDsKLQotICByZXR1cm4gdHJ1ZTsgIAotfQotCi0vKiBPdXRwdXQgcGVuZGluZyBmdW5jdGlvbiBwYXJhbWV0ZXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfb3V0cHV0X3BlbmRpbmdfcGFybXMgKGluZm8pCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLXsKLSAgc3RydWN0IGllZWVfcGVuZGluZ19wYXJtICptOwotICB1bnNpZ25lZCBpbnQgcmVmY291bnQ7Ci0KLSAgcmVmY291bnQgPSAwOwotICBmb3IgKG0gPSBpbmZvLT5wZW5kaW5nX3Bhcm1zOyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQotICAgIHsKLSAgICAgIGVudW0gZGVidWdfdmFyX2tpbmQgdmtpbmQ7Ci0KLSAgICAgIHN3aXRjaCAobS0+a2luZCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCSAgcmV0dXJuIGZhbHNlOwotCWNhc2UgREVCVUdfUEFSTV9TVEFDSzoKLQljYXNlIERFQlVHX1BBUk1fUkVGRVJFTkNFOgotCSAgdmtpbmQgPSBERUJVR19MT0NBTDsKLQkgIGJyZWFrOwotCWNhc2UgREVCVUdfUEFSTV9SRUc6Ci0JY2FzZSBERUJVR19QQVJNX1JFRl9SRUc6Ci0JICB2a2luZCA9IERFQlVHX1JFR0lTVEVSOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoISBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbS0+dHlwZSwgMCwgZmFsc2UsIGZhbHNlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnJlZmVyZW5jZXAgPSBtLT5yZWZlcmVuY2VwOwotICAgICAgaWYgKG0tPnJlZmVyZW5jZXApCi0JKytyZWZjb3VudDsKLSAgICAgIGlmICghIGllZWVfdmFyaWFibGUgKChQVFIpIGluZm8sIG0tPm5hbWUsIHZraW5kLCBtLT52YWwpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlcmUgYXJlIGFueSByZWZlcmVuY2UgcGFyYW1ldGVycywgd2UgbmVlZCB0byBvdXRwdXQgYQotICAgICBtaXNjZWxsYW5lb3VzIHJlY29yZCBpbmRpY2F0aW5nIHRoZW0uICAqLwotICBpZiAocmVmY291bnQgPiAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBuaW5keCwgdmFyaW5keDsKLQotICAgICAgLyogRklYTUU6IFRoZSBNUkkgY29tcGlsZXIgb3V0cHV0cyB0aGUgZGVtYW5nbGVkIGZ1bmN0aW9uIG5hbWUKLSAgICAgICAgIGhlcmUsIGJ1dCB3ZSBhcmUgb3V0cHV0dGluZyB0aGUgbWFuZ2xlZCBuYW1lLiAgKi8KLSAgICAgIG5pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotICAgICAgKytpbmZvLT5uYW1lX2luZHg7Ci0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotCSAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA2MikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDgwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgcmVmY291bnQgKyAzKQotCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsICdCJykKLQkgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIGluZm8tPmZubmFtZSkKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmb3IgKG0gPSBpbmZvLT5wZW5kaW5nX3Bhcm1zLCB2YXJpbmR4ID0gMTsKLQkgICBtICE9IE5VTEw7Ci0JICAgbSA9IG0tPm5leHQsIHZhcmluZHgrKykKLQl7Ci0JICBpZiAobS0+cmVmZXJlbmNlcCkKLQkgICAgewotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgdmFyaW5keCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgbSA9IGluZm8tPnBlbmRpbmdfcGFybXM7Ci0gIHdoaWxlIChtICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGllZWVfcGVuZGluZ19wYXJtICpuZXh0OwotCi0gICAgICBuZXh0ID0gbS0+bmV4dDsKLSAgICAgIGZyZWUgKG0pOwotICAgICAgbSA9IG5leHQ7Ci0gICAgfQotCi0gIGluZm8tPnBlbmRpbmdfcGFybXMgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIGJsb2NrLiAgSWYgdGhpcyBpcyB0aGUgZmlyc3QgYmxvY2ssIHdlIG91dHB1dCB0aGUgYWRkcmVzcwotICAgdG8gZmluaXNoIHRoZSBCQjQgb3IgQkI2LCBhbmQgdGhlbiBvdXRwdXQgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdGFydF9ibG9jayAocCwgYWRkcikKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW5mby0+YmxvY2tfZGVwdGggPT0gMSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgYWRkcikKLQkgIHx8ICEgaWVlZV9vdXRwdXRfcGVuZGluZ19wYXJtcyAoaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCA2KQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGFkZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9zdGFydF9yYW5nZSAoaW5mbywgYWRkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICsraW5mby0+YmxvY2tfZGVwdGg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEVuZCBhIGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZW5kX2Jsb2NrIChwLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgd2UgYXJlIGdpdmVuIGlzIHRoZSBlbmQgb2YgdGhlIGJsb2NrLCBidXQgSUVFRSBzZWVtcwotICAgICB0byB3YW50IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBsYXN0IGJ5dGUgaW4gdGhlIGJsb2NrLCBzbyB3ZQotICAgICBzdWJ0cmFjdCBvbmUuICAqLwotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBhZGRyIC0gMSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGllZWVfZW5kX3JhbmdlIChpbmZvLCBhZGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLS1pbmZvLT5ibG9ja19kZXB0aDsKLQotICBpZiAoYWRkciA+IGluZm8tPmhpZ2hhZGRyKQotICAgIGluZm8tPmhpZ2hhZGRyID0gYWRkcjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRW5kIGEgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9lbmRfZnVuY3Rpb24gKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT5ibG9ja19kZXB0aCA9PSAxKTsKLQotICAtLWluZm8tPmJsb2NrX2RlcHRoOwotCi0gIC8qIE5vdyB3ZSBjYW4gZmluaXNoIHVwIGZudHlwZSwgYW5kIGFkZCBpdCB0byB0aGUgdHlwZGVmIHNlY3Rpb24uCi0gICAgIEF0IHRoaXMgcG9pbnQsIGZudHlwZSBpcyB0aGUgJ3gnIHR5cGUgdXAgdG8gdGhlIGFyZ3VtZW50IGNvdW50LAotICAgICBhbmQgZm5hcmdzIGlzIHRoZSBhcmd1bWVudCB0eXBlcy4gIFdlIG11c3QgYWRkIHRoZSBhcmd1bWVudAotICAgICBjb3VudCwgYW5kIHdlIG11c3QgYWRkIHRoZSBsZXZlbC4gIEZJWE1FOiBXZSBkb24ndCByZWNvcmQgdmFyYXJncwotICAgICBmdW5jdGlvbnMgY29ycmVjdGx5LiAgSW4gZmFjdCwgc3RhYnMgZGVidWdnaW5nIGRvZXMgbm90IGdpdmUgdXMKLSAgICAgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGRvIHNvLiAgKi8KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Zm50eXBlKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5mby0+Zm5hcmdjb3VudCkKLSAgICAgIHx8ICEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Zm5hcmdzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgdHlwZGVmIGJsb2NrIGhhcyBiZWVuIHN0YXJ0ZWQuICAqLwotICBpZiAoaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZXMpKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPm1vZG5hbWUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMsICZpbmZvLT5mbnR5cGUpCi0gICAgICB8fCAhIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzLCAmaW5mby0+Zm5hcmdzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5mby0+Zm5uYW1lID0gTlVMTDsKLSAgaWYgKCEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJmluZm8tPmZudHlwZSkKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJmluZm8tPmZuYXJncykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpbmZvLT5mbmFyZ2NvdW50ID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfbGluZW5vIChwLCBmaWxlbmFtZSwgbGluZW5vLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGluZW5vOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICBhc3NlcnQgKGluZm8tPmZpbGVuYW1lICE9IE5VTEwpOwotCi0gIC8qIFRoZSBIUCBzaW11bGF0b3Igc2VlbXMgdG8gZ2V0IGNvbmZ1c2VkIHdoZW4gbW9yZSB0aGFuIG9uZSBsaW5lIGlzCi0gICAgIGxpc3RlZCBmb3IgdGhlIHNhbWUgYWRkcmVzcywgYXQgbGVhc3QgaWYgdGhleSBhcmUgaW4gZGlmZmVyZW50Ci0gICAgIGZpbGVzLiAgV2UgaGFuZGxlIHRoaXMgYnkgYWx3YXlzIGxpc3RpbmcgdGhlIGxhc3QgbGluZSBmb3IgYQotICAgICBnaXZlbiBhZGRyZXNzLCBzaW5jZSB0aGF0IHNlZW1zIHRvIGJlIHRoZSBvbmUgdGhhdCBnZGIgdXNlcy4gICovCi0gIGlmIChpbmZvLT5wZW5kaW5nX2xpbmVub19maWxlbmFtZSAhPSBOVUxMCi0gICAgICAmJiBhZGRyICE9IGluZm8tPnBlbmRpbmdfbGluZW5vX2FkZHIpCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBsaW5lIG51bWJlciBibG9jay4gICovCi0gICAgICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT5saW5lbm9zKSkKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5saW5lbm9zKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbmZvLT5saW5lbm9fbmFtZV9pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotCSAgKytpbmZvLT5uYW1lX2luZHg7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5saW5lbm9zKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCA1KQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBpbmZvLT5maWxlbmFtZSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5mby0+bGluZW5vX25hbWVfaW5keCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaW5mby0+bGluZW5vX2ZpbGVuYW1lID0gaW5mby0+ZmlsZW5hbWU7Ci0JfQotCi0gICAgICBpZiAoc3RyY21wIChpbmZvLT5wZW5kaW5nX2xpbmVub19maWxlbmFtZSwgaW5mby0+bGluZW5vX2ZpbGVuYW1lKSAhPSAwKQotCXsKLQkgIGlmIChzdHJjbXAgKGluZm8tPmZpbGVuYW1lLCBpbmZvLT5saW5lbm9fZmlsZW5hbWUpICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBXZSB3ZXJlIG5vdCBpbiB0aGUgbWFpbiBmaWxlLiAgQ2xvc2UgdGhlIGJsb2NrIGZvciB0aGUKLQkJIGluY2x1ZGVkIGZpbGUuICAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoc3RyY21wIChpbmZvLT5maWxlbmFtZSwgaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWUpID09IDApCi0JCXsKLQkJICAvKiBXZSBuZWVkIGEgbmV3IE5OIHJlY29yZCwgYW5kIHdlIGFyZW4ndCBhYm91dCB0bwotCQkgICAgIG91dHB1dCBvbmUuICAqLwotCQkgIGluZm8tPmxpbmVub19uYW1lX2luZHggPSBpbmZvLT5uYW1lX2luZHg7Ci0JCSAgKytpbmZvLT5uYW1lX2luZHg7Ci0JCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLQkJICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5mby0+bGluZW5vX25hbWVfaW5keCkKLQkJICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCSAgaWYgKHN0cmNtcCAoaW5mby0+ZmlsZW5hbWUsIGluZm8tPnBlbmRpbmdfbGluZW5vX2ZpbGVuYW1lKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogV2UgYXJlIG5vdCBjaGFuZ2luZyB0byB0aGUgbWFpbiBmaWxlLiAgT3BlbiBhIGJsb2NrIGZvcgotCQkgdGhlIG5ldyBpbmNsdWRlZCBmaWxlLiAgKi8KLQkgICAgICBpbmZvLT5saW5lbm9fbmFtZV9pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotCSAgICAgICsraW5mby0+bmFtZV9pbmR4OwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgNSkKLQkJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWUpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZm8tPmxpbmVub19uYW1lX2luZHgpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaW5mby0+bGluZW5vX2ZpbGVuYW1lID0gaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWU7Ci0JfQotCi0gICAgICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmZvLT5saW5lbm9fbmFtZV9pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDcpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmZvLT5wZW5kaW5nX2xpbmVubykKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBpbmZvLT5saW5lbm9fbmFtZV9pbmR4LAotCQkJICAgICAgIGluZm8tPnBlbmRpbmdfbGluZW5vX2FkZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgaW5mby0+cGVuZGluZ19saW5lbm8gPSBsaW5lbm87Ci0gIGluZm8tPnBlbmRpbmdfbGluZW5vX2FkZHIgPSBhZGRyOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvaXMtcmFubGliLmMgYi9iaW51dGlscy9pcy1yYW5saWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRlNzJhNC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9pcy1yYW5saWIuYworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotLyogTGlua2VkIHdpdGggYXIubyB0byBmbGFnIHRoYXQgdGhpcyBwcm9ncmFtIGlzICdyYW5saWInIChub3QgJ2FyJykuICovCi0KLWludCBpc19yYW5saWIgPSAxOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvaXMtc3RyaXAuYyBiL2JpbnV0aWxzL2lzLXN0cmlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNTM0MWEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvaXMtc3RyaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotLyogTGlua2VkIHdpdGggb2JqY29weS5vIHRvIGZsYWcgdGhhdCB0aGlzIHByb2dyYW0gaXMgJ3N0cmlwJyAobm90Ci0gICAnb2JqY29weScpLiAqLwotCi1pbnQgaXNfc3RyaXAgPSAxOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbWFjLWJpbnV0aWxzLnIgYi9iaW51dGlscy9tYWMtYmludXRpbHMucgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxYTMwMy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9tYWMtYmludXRpbHMucgorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIFJlc291cmNlcyBmb3IgR05VIGJpbnV0aWxzLiAqLwotCi0jaW5jbHVkZSAiU3lzVHlwZXMuciIKLQotLyogVmVyc2lvbiByZXNvdXJjZXMuICovCi0KLXJlc291cmNlICd2ZXJzJyAoMSkgIHsKLQkwLAotCTAsCi0JMCwKLQkwLAotCXZlclVzLAotCVZFUlNJT05fU1RSSU5HLAotCVZFUlNJT05fU1RSSU5HICAiIChDKSAxOTg2LTk1IEZTRiwgSW5jLiIKLX07Ci0KLXJlc291cmNlICd2ZXJzJyAoMiwgcHVyZ2VhYmxlKSAgewotCTAsCi0JMCwKLQkwLAotCTAsCi0JdmVyVXMsCi0JVkVSU0lPTl9TVFJJTkcsCi0JImJpbnV0aWxzICIgVkVSU0lPTl9TVFJJTkcgIiBmb3IgTVBXIgotfTsKLQotI2lmZGVmIFdBTlRfQ0ZSRwotCi0jaW5jbHVkZSAiQ29kZUZyYWdtZW50VHlwZXMuciIKLQotcmVzb3VyY2UgJ2NmcmcnICgwKSB7Ci0JewotCQlrUG93ZXJQQywKLQkJa0Z1bGxMaWIsCi0JCWtOb1ZlcnNpb25OdW0sIGtOb1ZlcnNpb25OdW0sCi0JCTAsMCwKLQkJa0lzQXBwLCBrT25EaXNrRmxhdCwga1plcm9PZmZzZXQsIGtXaG9sZUZvcmssCi0JCVBST0dfTkFNRQotCX0KLX07Ci0KLSNlbmRpZiAvKiBXQU5UX0NGUkcgKi8KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL21ha2VmaWxlLnZtcy1pbiBiL2JpbnV0aWxzL21ha2VmaWxlLnZtcy1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwOWQxYi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9tYWtlZmlsZS52bXMtaW4KKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciBiaW51dGlscyB1bmRlciBvcGVuVk1TIChBbHBoYSBhbmQgVmF4KQotIwotIyBGb3IgdXNlIHdpdGggZ251LW1ha2UgZm9yIHZtcwotIwotIyBDcmVhdGVkIGJ5IEtsYXVzIEsiYW1wZiwga2thZW1wZkBybWkuZGUKLSMKLSMKLQotIyBEaXN0cmlidXRpb24gdmVyc2lvbiwgZmlsbGVkIGluIGJ5IGNvbmZpZ3VyZS5jb20KLVZFUlNJT049QFZFUlNJT05ACi0KLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1UQVJHRVQ9IiJ2bXMtYWxwaGEiIgotZWxzZQotVEFSR0VUPSIidm1zLXZheCIiCi1lbmRpZgotCi1pZmVxICgkKENDKSxnY2MpCi1DRkxBR1M9L2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdLFstLmJmZF0pJChERUZTKQotREVGUz0vZGVmaW5lPSgiVEFSR0VUPSQoVEFSR0VUKSIpCi1MSUJTPSxnbnVfY2NfbGlicmFyeTpsaWJnY2MvbGliLHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIsZ251X2NjX2xpYnJhcnk6Y3J0MC5vYmoKLWVsc2UKLUNGTEFHUz0vbm9vcHQvZGVidWcvaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0sWy0uYmZkXSkkKERFRlMpXAotL3dhcm5pbmdzPWRpc2FibGU9KG1pc3NpbmdyZXR1cm4saW1wbGljaXRmdW5jLGxvbmdleHRlcm4pCi1ERUZTPS9kZWZpbmU9KCJUQVJHRVQ9JChUQVJHRVQpIiwiY29uc3Q9IiwidW5saW5rPXJlbW92ZSIpCi1MSUJTPSxzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliCi1lbmRpZgotCi1CRkRMSUIgPSBbLS5iZmRdbGliYmZkLm9sYi9saWIKLUJGRExJQl9ERVAgPSBbLS5iZmRdbGliYmZkLm9sYgotTElCSUJFUlRZX0RFUCA9IFstLmxpYmliZXJ0eV1saWJpYmVydHkub2xiCi1MSUJJQkVSVFkgPSBbLS5saWJpYmVydHldbGliaWJlcnR5Lm9sYi9saWIKLU9QQ09ERVNfREVQID0gWy0ub3Bjb2Rlc11saWJvcGNvZGVzLm9sYgotT1BDT0RFUyA9IFstLm9wY29kZXNdbGlib3Bjb2Rlcy5vbGIvbGliCi0KLURFQlVHX09CSlMgPSByZGRiZy5vYmosZGVidWcub2JqLHN0YWJzLm9iaixpZWVlLm9iaixyZGNvZmYub2JqCi0KLVdSSVRFX0RFQlVHX09CSlMgPSAkKERFQlVHX09CSlMpLHdyc3RhYnMub2JqCi0KLUJVTElCUyA9IFtdYnVjb21tLm9iaix2ZXJzaW9uLm9iaixmaWxlbW9kZS5vYmoKLQotQURETF9ERVBTID0gJChCVUxJQlMpLCQoQkZETElCX0RFUCksJChMSUJJQkVSVFlfREVQKQotQURETF9MSUJTID0gJChCVUxJQlMpLCQoQkZETElCKSwkKExJQklCRVJUWSkKLQotU0laRU9CSlMgPSAkKEFERExfREVQUyksc2l6ZS5vYmoKLQotU1RSSU5HU09CSlMgPSAkKEFERExfREVQUyksc3RyaW5ncy5vYmoKLQotTk1PQkpTID0gJChBRERMX0RFUFMpLG5tLm9iagotCi1PQkpEVU1QT0JKUyA9ICQoQURETF9ERVBTKSxvYmpkdW1wLm9iaixwcmRiZy5vYmosJChERUJVR19PQkpTKSwkKE9QQ09ERVNfREVQKQotCi1hbGw6IGNvbmZpZy5oIHNpemUuZXhlIHN0cmluZ3MuZXhlIG9iamR1bXAuZXhlIG5tLmV4ZQotCi1zaXplLmV4ZTogJChTSVpFT0JKUykKLQlsaW5rL2V4ZT0kQCBzaXplLm9iaiwkKEFERExfTElCUykkKExJQlMpCi0KLXN0cmluZ3MuZXhlOiAkKFNUUklOR1NPQkpTKQotCWxpbmsvZXhlPSRAIHN0cmluZ3Mub2JqLCQoQURETF9MSUJTKSQoTElCUykKLQotbm0uZXhlOiAkKE5NT0JKUykKLQlsaW5rL2V4ZT0kQCBubS5vYmosJChBRERMX0xJQlMpJChMSUJTKQotCi1vYmpkdW1wLmV4ZTogJChPQkpEVU1QT0JKUykKLQlsaW5rL2V4ZT0kQCBvYmpkdW1wLm9iaixwcmRiZy5vYmosJChERUJVR19PQkpTKSwkKEJGRExJQiksJChPUENPREVTKSwkKEFERExfTElCUykkKExJQlMpCi0KLQotdmVyc2lvbi5vYmo6IHZlcnNpb24uYwotCSQoQ0MpICQoQ0ZMQUdTKS9kZWZpbmU9KFZFUlNJT049IiIiJChWRVJTSU9OKSIiIikgJDwKLQotY29uZmlnLmg6Ci0JJCQgQGNvbmZpZ3VyZQotCSQoTUFLRSkgLWYgbWFrZWZpbGUudm1zICJDQz0kKENDKSIKLQotWy0uYmZkXWxpYmJmZC5vbGI6Ci0JJChDRCkgWy0uYmZkXQotCSQoTUFLRSkgLWYgbWFrZWZpbGUudm1zICJDQz0kKENDKSIKLQkkKENEKSBbLS5iaW51dGlsc10KLQotWy0ubGliaWJlcnR5XWxpYmliZXJ0eS5vbGI6Ci0JJChDRCkgWy0ubGliaWJlcnR5XQotCSQoTUFLRSkgLWYgbWFrZWZpbGUudm1zICJDQz0kKENDKSIKLQkkKENEKSBbLS5iaW51dGlsc10KLQotWy0ub3Bjb2Rlc11saWJvcGNvZGVzLm9sYjoKLQkkKENEKSBbLS5vcGNvZGVzXQotCSQoTUFLRSkgLWYgbWFrZWZpbGUudm1zICJDQz0kKENDKSIKLQkkKENEKSBbLS5iaW51dGlsc10KLQotY2xlYW46Ci0JJCQgcHVyZ2UKLQkkKFJNKSAqLm9iajsKLQkkKFJNKSAqLmV4ZTsKLQotZGlzdGNsZWFuOiBjbGVhbgotCSQoUk0pIGNvbmZpZy5oOwotCSQoUk0pIG1ha2VmaWxlLnZtczsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL21heWJlLXJhbmxpYi5jIGIvYmludXRpbHMvbWF5YmUtcmFubGliLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzN2JjMGYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbWF5YmUtcmFubGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLS8qIExpbmtlZCB3aXRoIGFyLm8gdG8gZmxhZyB0aGF0IHRoaXMgcHJvZ3JhbSBkZWNpZGVzIGF0IHJ1bnRpbWUKLSAgICh1c2luZyBhcmd2WzBdIGlmIGl0IGlzIGlzICdhcicgb3IgJ3JhbmxpYicuICovCi0KLWludCBpc19yYW5saWIgPSAtMTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL21heWJlLXN0cmlwLmMgYi9iaW51dGlscy9tYXliZS1zdHJpcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDY3Yzk5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL21heWJlLXN0cmlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLS8qIExpbmtlZCB3aXRoIG9iamNvcHkubyB0byBmbGFnIHRoYXQgdGhpcyBwcm9ncmFtIGRlY2lkZXMgYXQgcnVudGltZQotICAgKHVzaW5nIGFyZ3ZbMF0gaWYgaXQgaXMgaXMgJ3N0cmlwJyBvciAnb2JqY29weScuICovCi0KLWludCBpc19zdHJpcCA9IC0xOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbXB3LWNvbmZpZy5pbiBiL2JpbnV0aWxzL21wdy1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTA2N2QuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbXB3LWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgYmludXRpbHMuCi0KLVNldCB0YXJnZXRfYXJjaCBgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgLWUgJ3MvLS4qLS4qLy8nYAotCi0jIChzaG91bGQgY2Fub25pY2FsaXplIGFyY2ggbmFtZSkgKi8KLQotU2V0IGFyY2huYW1lIEFSQ0hfe3RhcmdldF9hcmNofQotCi1TZXQgdW5kZXJzY29yZSAwCi0KLUlmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9zaC1oaXRhY2hpLWhtcy8KLQlTZXQgdW5kZXJzY29yZSAxCi1FbmQgSWYKLQotRWNobyAnIyBGcm9tIG1wdy1jb25maWcuaW4nCQkJCSA+ICJ7b30ibWsudG1wCi1FY2hvICJBUkNIREVGUyA9IC1kIiB7YXJjaG5hbWV9CQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICJVTkRFUlNDT1JFID0gIiB7dW5kZXJzY29yZX0JCQk+PiAie299Im1rLnRtcAotRWNobyAiQlVJTERfTkxNQ09OViA9ICIJCQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICJCVUlMRF9TUkNPTlYgPSAiCQkJCQk+PiAie299Im1rLnRtcAotRWNobyAiU1lTSU5GT19QUk9HID0gIgkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gIkJVSUxEX0RMTFRPT0wgPSAiCQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnIyBFbmQgZnJvbSBtcHctY29uZmlnLmluJwkJCQk+PiAie299Im1rLnRtcAotCi1FY2hvICcvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBtcHctY29uZmlndXJlLiAgKi8nCSA+ICJ7b30iY29uZmlnLm5ldwotRWNobyAnI2luY2x1ZGUgIm1wdy5oIicJCQkJCT4+ICJ7b30iY29uZmlnLm5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJjb25maWcubmV3ICJ7b30iY29uZmlnLmgKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL21wdy1tYWtlLnNlZCBiL2JpbnV0aWxzL21wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhYmZmZS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9tcHctbWFrZS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotIyBTZWQgY29tbWFuZHMgdG8gZmluaXNoIHRyYW5zbGF0aW5nIHRoZSBiaW51dGlscyBVbml4IG1ha2VmaWxlIGludG8gTVBXIHN5bnRheC4KLQotIyBBZGQgYSBydWxlLgotL14jIyMjIC4qL2FcCi1cCi0ie299InVuZGVyc2NvcmUuYy5vIFxcT3B0aW9uLWYgIntvfSJ1bmRlcnNjb3JlLmNcCi0KLSMgQ29tbWVudCBvdXQgYW55IGFsaWFzIHNldHRpbmdzLgotL15ob3N0X2FsaWFzID0vcy9eLyMvCi0vXnRhcmdldF9hbGlhcyA9L3MvXi8jLwotCi0jIFdoYWNrIG91dCB1bnVzZWQgaG9zdCBkZWZpbmUgYml0cy4KLS9IREVGSU5FUy9zL0BIREVGSU5FU0AvLwotCi0jIERvbid0IGJ1aWxkIHNwZWNpYWxpemVkIHRvb2xzLgotL0JVSUxEX05MTUNPTlYvcy9AQlVJTERfTkxNQ09OVkAvLwotL0JVSUxEX1NSQ09OVi9zL0BCVUlMRF9TUkNPTlZALy8KLS9CVUlMRF9ETExUT09ML3MvQEJVSUxEX0RMTFRPT0xALy8KLQotL1VOREVSU0NPUkUvcy9AVU5ERVJTQ09SRUAve1VOREVSU0NPUkV9LwotCi0jIERvbid0IG5lZWQgdGhpcy4KLS9ASExERkxBR1NAL3MvQEhMREZMQUdTQC8vCi0KLSMgUG9pbnQgYXQgdGhlIGxpYnJhcmllcyBkaXJlY3RseS4KLS9AQkZETElCQC9zL0BCRkRMSUJALzo6YmZkOmxpYmJmZC5vLwotL0BPUENPREVTQC9zL0BPUENPREVTQC86Om9wY29kZXM6bGlib3Bjb2Rlcy5vLwotCi0jIFdoYWNrIG91dCB0YXJnZXQgbWFrZWZpbGUgZnJhZ21lbnQuCi0vdGFyZ2V0X21ha2VmaWxlX2ZyYWdtZW50L3MvdGFyZ2V0X21ha2VmaWxlX2ZyYWdtZW50QC8vCi0KLSMgRml4IGFuZCBhZGQgdG8gdGhlIGluY2x1ZGUgcGF0aHMuCi0vXklOQ0xVREVTID0gLiokL3MvJC8gLWkgIntJTkNESVJ9IjptcHc6IC1pIDo6ZXh0cmEtaW5jbHVkZTovCi0vQkZERElSL3MvLWkge0JGRERJUn0gLy1pICJ7QkZERElSfSI6IC8KLS9JTkNESVIvcy8taSB7SU5DRElSfSAvLWkgIntJTkNESVJ9IjogLwotCi0jIFVzZSBieWFjYyBpbnN0ZWFkIG9mIGJpc29uIChmb3Igbm93IGFueXdheSkuCi0vQklTT04vcy9eQklTT04gPS4qJC9CSVNPTiA9IGJ5YWNjLwotIy9CSVNPTkZMQUdTL3MvXkJJU09ORkxBR1MgPS4qJC9CSVNPTkZMQUdTID0gLwotCi0jIEVtYmVkIHRoZSB2ZXJzaW9uIGluIHN5bWJvbGljIGRvdWJsZXF1b3RlcyB0aGF0IHdpbGwgZXhwYW5kIHRvCi0jIHRoZSByaWdodCB0aGluZyBmb3IgZWFjaCBjb21waWxlci4KLS9WRVJTSU9OL3MvJyJ7VkVSU0lPTn0iJy97ZHF9e1ZFUlNJT059e2RxfS8KLQotIyAnKycgaXMgYSBzcGVjaWFsIGNoYXIgdG8gTVBXLCBkb24ndCB1c2UgaXQgZXZlci4KLS9jKytmaWx0L3MvYysrZmlsdC9jcGx1c2ZpbHQvCi0KLSMgQWxsIG9mIHRoZSBiaW51dGlscyB1c2UgdGhlIHNhbWUgUmV6IGZpbGUsIGNoYW5nZSBuYW1lcyB0byByZWZlciB0byBpdC4KLS9ee1tBLVpdKl9QUk9HfS9zLyQvICJ7c30ibWFjLWJpbnV0aWxzLnIvCi0ve1tBLVpdKl9QUk9HfVwuci9zL3tbQS1aXSpfUFJPR31cLnIvbWFjLWJpbnV0aWxzLnIvCi0KLSMgVGhlcmUgYXJlIGF1dG8tZ2VuZXJhdGVkIHJlZmVyZW5jZXMgdG8gQkZEIC5oIGZpbGVzIHRoYXQgYXJlIG5vdAotIyBpbiB0aGUgb2JqZGlyIChsaWtlIGJmZC5oKSBidXQgYXJlIGluIHRoZSBzb3VyY2UgZGlyLgotLzo6YmZkOmxpYi9zLzo6YmZkOmxpYlwoW2Etel0qXClcLmgve0JGRERJUn06bGliXDEuaC9nCi0KLSMgRml4IHRoZSBsb2NhdGlvbnMgb2YgZ2VuZXJhdGVkIGZpbGVzLgotL2NvbmZpZy9zLyJ7c30iY29uZmlnXC5oLyJ7b30iY29uZmlnLmgvZwotL2NvbmZpZy9zL15jb25maWdcLmgvIntvfSJjb25maWdcLmgvCi0vdW5kZXJzY29yZS9zLyJ7c30idW5kZXJzY29yZVwuYy8ie299InVuZGVyc2NvcmUuYy9nCi0vdW5kZXJzY29yZS9zL151bmRlcnNjb3JlXC5jLyJ7b30idW5kZXJzY29yZVwuYy8KLQotIyBGaXggcGF0aHMgdG8gZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcy4KLS9sZXgueXkuYy9zLyJ7c30ibGV4XC55eVwuYy8ie299ImxleC55eS5jL2cKLS9sZXgueXkuYy9zL15sZXhcLnl5XC5jLyJ7b30ibGV4Lnl5LmMvCi0vYXJsZXguYy9zLyJ7c30iYXJsZXhcLmMvIntvfSJhcmxleC5jL2cKLS9hcmxleC5jL3MvXmFybGV4XC5jLyJ7b30iYXJsZXguYy8KLS95LnRhYi5jL3MvIntzfSJ5XC50YWJcLmMvIntvfSJ5LnRhYi5jL2cKLS95LnRhYi5jL3MvXnlcLnRhYlwuYy8ie299InkudGFiLmMvCi0vYXJwYXJzZS5jL3MvIntzfSJhcnBhcnNlXC5jLyJ7b30iYXJwYXJzZS5jL2cKLS9hcnBhcnNlLmMvcy9eYXJwYXJzZVwuYy8ie299ImFycGFyc2UuYy8KLS95LnRhYi5oL3MvIntzfSJ5XC50YWJcLmgvIntvfSJ5LnRhYi5oL2cKLS95LnRhYi5oL3MvXnlcLnRhYlwuaC8ie299InkudGFiLmgvCi0vYXJwYXJzZS5oL3MvIntzfSJhcnBhcnNlXC5oLyJ7b30iYXJwYXJzZS5oL2cKLS9hcnBhcnNlLmgvcy9eYXJwYXJzZVwuaC8ie299ImFycGFyc2UuaC8KLQotLyJ7c30ie0lOQ0RJUn0vcy8ie3N9IntJTkNESVJ9LyJ7SU5DRElSfSIvZwotCi0jIFRoZSBnZW5lcmF0ZWQgbGV4ZXIgbWF5IGluY2x1ZGUgYW4gaWZkZWYgZm9yIG9sZGVyIE1hYyBjb21waWxlcnMgdGhhdAotIyBuZWVkcyB0byB3b3JrIHdpdGggbmV3ZXIgY29tcGlsZXJzIGFsc28uCi0vbGV4Lnl5LmMvcy9SZW5hbWUgLXkgXChbXiBdKlwpIFwoW14gXSpcKSQvc2VkIC1lICdzLGlmZGVmIG1hY2ludG9zaCxpZiBkZWZpbmVkKG1hY2ludG9zaCkgfHwgZGVmaW5lZChfX01XRVJLU19fKSwnIFwxID4gXDIvCi0KLSMgRml4IGFuIG92ZXItZWFnZXJuZXNzLgotL2VjaG8uKldBUk5JTkcuKlRoaXMgZmlsZS9zLycuKicvJyAnLwotCi0jIEFkZCBhICJzdGFtcHMiIHRhcmdldC4KLSRhXAotc3RhbXBzIFxcT3B0aW9uLWYgc3RhbXAtdW5kZXJcCi0KLS9eaW5zdGFsbCBcXE9wdGlvbi1mIC8sL14kL2NcCi1pbnN0YWxsIFxcT3B0aW9uLWYgIGFsbCBpbnN0YWxsLW9ubHlcCi1cCi1pbnN0YWxsLW9ubHkgXFxPcHRpb24tZlwKLQlOZXdGb2xkZXJSZWN1cnNpdmUgIntiaW5kaXJ9IlwKLQkjIE5lZWQgdG8gY29weSBhbGwgdGhlIHRvb2xzXAotCUZvciBwcm9nIGluIHtQUk9HU31cCi0JCVNldCBwcm9nbmFtZSBgZWNobyB7cHJvZ30gfCBzZWQgLWUgJ3MvLm5ldy8vJ2BcCi0JCUR1cGxpY2F0ZSAteSA6e3Byb2d9ICJ7YmluZGlyfSJ7cHJvZ25hbWV9XAotCUVuZCBGb3JcCi0KLQotL3RydWUvcy8gOyBAdHJ1ZSQvLwotCi0jIGRvdCBmaWxlcyBhcmUgdHJvdWJsZSwgcmVtb3ZlIHRoZW0gYW5kIHRoZWlyIGFjdGlvbnMuCi0vXlwuZGVwLywvXiQvZAotCi0jIFJlbW92ZSB1bi11c2VmdWwgdGFyZ2V0cy4KLS9eTWFrZWZpbGUgXFxPcHRpb24tZi8sL14kL2QKLS9eIntvfSJjb25maWcuaCBcXE9wdGlvbi1mLywvXiQvZAotL15jb25maWcuc3RhdHVzIFxcT3B0aW9uLWYvLC9eJC9kCi0KLSMgRG9uJ3QgdHJ5IHRvIG1ha2UgdGhlIGRlbWFuZ2xlcidzIG1hbiBwYWdlLCBpdCdzIHVzZWxlc3MuCi0vXntERU1BTkdMRVJfUFJPR31cLjEgXFxPcHRpb24tZi8sL14kL2QKLSMgRG9uJ3QgZGVwZW5kIG9uIGl0IGVpdGhlci4KLS97REVNQU5HTEVSX1BST0d9L3MvIHtERU1BTkdMRVJfUFJPR31cLjEvLwotCmRpZmYgLS1naXQgYS9iaW51dGlscy9ubG1jb252LjEgYi9iaW51dGlscy9ubG1jb252LjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYzNhZWQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbmxtY29udi4xCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggbmxtY29udiAxICJNYXJjaCAxOTk2IiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotbmxtY29udiBcLSBjb252ZXJ0cyBvYmplY3QgY29kZSBpbnRvIGFuIE5MTQotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgbmxtY29udgotLlJCICJbXHwiIFwtSVwgXGZJYmZkbmFtZVxmQlwgfFwgXC1cLWlucHV0XC10YXJnZXQ9XGZJYmZkbmFtZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLU9cIFxmSWJmZG5hbWVcZkJcIHxcIFwtXC1vdXRwdXRcLXRhcmdldD1cZkliZmRuYW1lXGZSICJcfF0iIAotLlJCICJbXHwiIFwtVFwgXGZJaGVhZGVyZmlsZVxmQlwgfFwgXC1cLWhlYWRlclwtZmlsZT1cZkloZWFkZXJmaWxlXGZSICJcfF0iIAotLlJCICJbXHwiIFwtVlwgfFwgXC1cLXZlcnNpb25cZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1cLWhlbHBcZlIgIlx8XSIgCi0uQiBpbmZpbGUKLS5CIG91dGZpbGUKLS5TSCBERVNDUklQVElPTgotLkIgbmxtY29udgotY29udmVydHMgdGhlIHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlIAotLkIgaW5maWxlCi1pbnRvIHRoZSBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSAKLS5CUiBvdXRmaWxlICwKLW9wdGlvbmFsbHkgcmVhZGluZyAKLS5JIGhlYWRlcmZpbGUKLWZvciBOTE0gaGVhZGVyIGluZm9ybWF0aW9uLiAgRm9yIGluc3RydWN0aW9ucyBvbiB3cml0aW5nIHRoZSBOTE0KLWNvbW1hbmQgZmlsZSBsYW5ndWFnZSB1c2VkIGluIGhlYWRlciBmaWxlcywgc2VlIAotLklSICJUaGUgTmV0V2FyZSBUb29sIE1ha2VyIFNwZWNpZmljYXRpb24gTWFudWFsIiAsCi1hdmFpbGFibGUgZnJvbSBOb3ZlbGwsIEluYy4KLS5CIG5sbWNvbnYKLWN1cnJlbnRseSB3b3JrcyB3aXRoIGkzODYgb2JqZWN0IGZpbGVzIGluIAotLkJSIENPRkYgLAotLkJSIEVMRiAsCi1vcgotLkIgYS5vdXQKLWZvcm1hdCwgYW5kIHdpdGggU1BBUkMgb2JqZWN0IGZpbGVzIGluCi0uQiBFTEYKLW9yCi0uQiBhLm91dAotZm9ybWF0LgotLmJyCi0uQiBubG1jb252Ci11c2VzIHRoZSBHTlUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5IHRvIHJlYWQgCi0uSVIgaW5maWxlIC4KLS5TSCBPUFRJT05TCi0uVFAKLS5CIFwtSSBcZkliZmRuYW1lXGZSLCBcZkJcLVwtaW5wdXRcLXRhcmdldD1cZkliZmRuYW1lCi1Db25zaWRlciB0aGUgc291cmNlIGZpbGUncyBvYmplY3QgZm9ybWF0IHRvIGJlIAotLklSIGJmZG5hbWUgLAotcmF0aGVyIHRoYW4gYXR0ZW1wdGluZyB0byBkZWR1Y2UgaXQuCi0uVFAKLS5CIFwtTyBcZkliZmRuYW1lXGZSLCBcZkJcLVwtb3V0cHV0XC10YXJnZXQ9XGZJYmZkbmFtZQotV3JpdGUgdGhlIG91dHB1dCBmaWxlIHVzaW5nIHRoZSBvYmplY3QgZm9ybWF0IAotLklSIGJmZG5hbWUgLgotLkIgbmxtY29udgotaW5mZXJzIHRoZSBvdXRwdXQgZm9ybWF0IGJhc2VkIG9uIHRoZSBpbnB1dCBmb3JtYXQsIGUuZy4gZm9yIGFuIGkzODYKLWlucHV0IGZpbGUgdGhlIG91dHB1dCBmb3JtYXQgaXMKLS5JUiBubG0zMlwtaTM4NiAuCi0uVFAKLS5CIFwtVCBcZkloZWFkZXJmaWxlXGZSLCBcZkJcLVwtaGVhZGVyXC1maWxlPVxmSWhlYWRlcmZpbGUKLVJlYWRzIAotLkkgaGVhZGVyZmlsZQotZm9yIE5MTSBoZWFkZXIgaW5mb3JtYXRpb24uICBGb3IgaW5zdHJ1Y3Rpb25zIG9uIHdyaXRpbmcgdGhlIE5MTQotY29tbWFuZCBmaWxlIGxhbmd1YWdlIHVzZWQgaW4gaGVhZGVyIGZpbGVzLCBzZWUgCi0uSVIgIlRoZSBOZXRXYXJlIFRvb2wgTWFrZXIgU3BlY2lmaWNhdGlvbiBNYW51YWwiICwKLWF2YWlsYWJsZSBmcm9tIE5vdmVsbCwgSW5jLgotLlRQCi0uQiBcLVZcZlIsIFxmQlwtXC12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZgotLkIgbmxtY29udgotYW5kIGV4aXQuCi0uVFAKLS5CIFwtaFxmUiwgXGZCXC1cLWhlbHAKLVNob3cgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvCi0uQiBubG1jb252Ci1hbmQgZXhpdC4KLS5TSCAiU0VFIEFMU08iCi0uUkIgImBcfCIgYmludXRpbHMgIlx8JyIgCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoSnVuZSAxOTkzKS4KLQotLlNIIENPUFlJTkcKLUNvcHlyaWdodCAoYykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbmxtY29udi5jIGIvYmludXRpbHMvbmxtY29udi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWM4YjZjLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25sbWNvbnYuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMTIgKzAsMCBAQAotLyogbmxtY29udi5jIC0tIE5MTSBjb252ZXJzaW9uIHByb2dyYW0KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIHByb2dyYW0gY2FuIGJlIHVzZWQgdG8gY29udmVydCBhbnkgYXBwcm9wcmlhdGUgb2JqZWN0IGZpbGUKLSAgIGludG8gYSBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSAoYW4gTkxNKS4gIEl0IHdpbGwgYWNjZXB0IGEgbGlua2VyCi0gICBzcGVjaWZpY2F0aW9uIGZpbGUgd2hpY2ggaXMgaWRlbnRpY2FsIHRvIHRoYXQgYWNjZXB0ZWQgYnkgdGhlCi0gICBOZXRXYXJlIGxpbmtlciwgTkxNTElOSy4gICovCi0KLS8qIEFJWCByZXF1aXJlcyB0aGlzIHRvIGJlIHRoZSBmaXJzdCB0aGluZyBpbiB0aGUgZmlsZS4gICovCi0jaWZuZGVmIF9fR05VQ19fCi0jIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotI2VuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0KLS8qIEludGVybmFsIEJGRCBOTE0gaGVhZGVyLiAgKi8KLSNpbmNsdWRlICJsaWJubG0uaCIKLSNpbmNsdWRlICJubG1jb252LmgiCi0KLSNpZmRlZiBOTE1DT05WX0FMUEhBCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jZW5kaWYKLQotLyogSWYgc3RyZXJyb3IgaXMganVzdCBhIG1hY3JvLCB3ZSB3YW50IHRvIHVzZSB0aGUgb25lIGZyb20gbGliaWJlcnR5Ci0gICBzaW5jZSBpdCB3aWxsIGhhbmRsZSB1bmRlZmluZWQgdmFsdWVzLiAgKi8KLSN1bmRlZiBzdHJlcnJvcgotZXh0ZXJuIGNoYXIgKnN0cmVycm9yICgpOwotCi0jaWZuZGVmIGxvY2FsdGltZQotZXh0ZXJuIHN0cnVjdCB0bSAqbG9jYWx0aW1lICgpOwotI2VuZGlmCi0KLSNpZm5kZWYgU0VFS19TRVQKLSNkZWZpbmUgU0VFS19TRVQgMAotI2VuZGlmCi0KLSNpZm5kZWYgUl9PSwotI2RlZmluZSBSX09LIDQKLSNkZWZpbmUgV19PSyAyCi0jZGVmaW5lIFhfT0sgMQotI2VuZGlmCi0MCi0vKiBHbG9iYWwgdmFyaWFibGVzLiAgKi8KLQotLyogVGhlIG5hbWUgdXNlZCB0byBpbnZva2UgdGhlIHByb2dyYW0uICAqLwotY2hhciAqcHJvZ3JhbV9uYW1lOwotCi0vKiBMb2NhbCB2YXJpYWJsZXMuICAqLwotCi0vKiBXaGV0aGVyIHRvIHByaW50IG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKGN1cnJlbnRseSBqdXN0IGNvbnRyb2xzCi0gICB3aGV0aGVyIGl0IHByaW50cyB0aGUgbGlua2VyIGNvbW1hbmQgaWYgdGhlcmUgaXMgb25lKS4gICovCi1zdGF0aWMgaW50IGRlYnVnOwotCi0vKiBUaGUgc3ltYm9sIHRhYmxlLiAgKi8KLXN0YXRpYyBhc3ltYm9sICoqc3ltYm9sczsKLQotLyogQSBzZWN0aW9uIHdlIGNyZWF0ZSBpbiB0aGUgb3V0cHV0IGZpbGUgdG8gaG9sZCBwb2ludGVycyB0byB3aGVyZQotICAgdGhlIHNlY3Rpb25zIG9mIHRoZSBpbnB1dCBmaWxlIGVuZCB1cC4gIFdlIHdpbGwgcHV0IGEgcG9pbnRlciB0bwotICAgdGhpcyBzZWN0aW9uIGluIHRoZSBOTE0gaGVhZGVyLiAgVGhlc2UgaXMgYW4gZW50cnkgZm9yIGVhY2ggaW5wdXQKLSAgIHNlY3Rpb24uICBUaGUgZm9ybWF0IGlzCi0gICAgICAgbnVsbCB0ZXJtaW5hdGVkIHNlY3Rpb24gbmFtZQotICAgICAgIHplcm9lcyB0byBhZGp1c3QgdG8gNCBieXRlIGJvdW5kYXJ5Ci0gICAgICAgNCBieXRlIHNlY3Rpb24gZGF0YSBmaWxlIHBvaW50ZXIKLSAgICAgICA0IGJ5dGUgc2VjdGlvbiBzaXplCi0gICBXZSBkb24ndCBuZWVkIGEgdmVyc2lvbiBudW1iZXIuICBUaGUgd2F5IHdlIGZpbmQgdGhpcyBpbmZvcm1hdGlvbgotICAgaXMgYnkgZmluZGluZyBhIHN0YW1wIGluIHRoZSBOTE0gaGVhZGVyIGluZm9ybWF0aW9uLiAgSWYgd2UgbmVlZCB0bwotICAgY2hhbmdlIHRoZSBmb3JtYXQgb2YgdGhpcyBpbmZvcm1hdGlvbiwgd2UgY2FuIHNpbXBseSBjaGFuZ2UgdGhlCi0gICBzdGFtcC4gICovCi1zdGF0aWMgYXNlY3Rpb24gKnNlY3NlYzsKLQotLyogQSB0ZW1wb3JhcnkgZmlsZSBuYW1lIHRvIGJlIHVubGlua2VkIG9uIGV4aXQuICBBY3R1YWxseSwgZm9yIG1vc3QKLSAgIGVycm9ycywgd2UgbGVhdmUgaXQgYXJvdW5kLiAgSXQncyBub3QgY2xlYXIgd2hldGhlciB0aGF0IGlzIGhlbHBmdWwKLSAgIG9yIG5vdC4gICovCi1zdGF0aWMgY2hhciAqdW5saW5rX29uX2V4aXQ7Ci0KLS8qIFRoZSBsaXN0IG9mIGxvbmcgb3B0aW9ucy4gICovCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsgImRlYnVnIiwgbm9fYXJndW1lbnQsIDAsICdkJyB9LAotICB7ICJoZWFkZXItZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnVCcgfSwKLSAgeyAiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCcgfSwKLSAgeyAiaW5wdXQtdGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJyB9LAotICB7ICJpbnB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knIH0sIC8qIE9ic29sZXRlICovCi0gIHsgImxpbmtlciIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbCcgfSwKLSAgeyAib3V0cHV0LXRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTycgfSwKLSAgeyAib3V0cHV0LWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTycgfSwgLyogT2Jzb2xldGUgKi8KLSAgeyAidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAnVicgfSwKLSAgeyBOVUxMLCBub19hcmd1bWVudCwgMCwgMCB9Ci19OwotCi0vKiBMb2NhbCByb3V0aW5lcy4gICovCi0KLXN0YXRpYyB2b2lkIHNob3dfaGVscCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBzaG93X3VzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqc2VsZWN0X291dHB1dF9mb3JtYXQgUEFSQU1TICgoZW51bSBiZmRfYXJjaGl0ZWN0dXJlLAotCQkJCQkJIHVuc2lnbmVkIGxvbmcsIGJvb2xlYW4pKTsKLXN0YXRpYyB2b2lkIHNldHVwX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvcHlfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgbWFuZ2xlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiosCi0JCQkJICAgbG9uZyAqLCBjaGFyICosCi0JCQkJICAgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIHZvaWQgZGVmYXVsdF9tYW5nbGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqKiwKLQkJCQkJICAgbG9uZyAqLCBjaGFyICosCi0JCQkJCSAgIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBjaGFyICpsaW5rX2lucHV0cyBQQVJBTVMgKChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKiwgY2hhciAqKSk7Ci0KLSNpZmRlZiBOTE1DT05WX0kzODYKLXN0YXRpYyB2b2lkIGkzODZfbWFuZ2xlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiosCi0JCQkJCWxvbmcgKiwgY2hhciAqLAotCQkJCQliZmRfc2l6ZV90eXBlKSk7Ci0jZW5kaWYKLQotI2lmZGVmIE5MTUNPTlZfQUxQSEEKLXN0YXRpYyB2b2lkIGFscGhhX21hbmdsZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKioqLAotCQkJCQkgbG9uZyAqLCBjaGFyICosCi0JCQkJCSBiZmRfc2l6ZV90eXBlKSk7Ci0jZW5kaWYKLQotI2lmZGVmIE5MTUNPTlZfUE9XRVJQQwotc3RhdGljIHZvaWQgcG93ZXJwY19idWlsZF9zdHVicyBQQVJBTVMgKChiZmQgKiwgYmZkICosIGFzeW1ib2wgKioqLCBsb25nICopKTsKLXN0YXRpYyB2b2lkIHBvd2VycGNfcmVzb2x2ZV9zdHVicyBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIHBvd2VycGNfbWFuZ2xlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiosCi0JCQkJCSAgIGxvbmcgKiwgY2hhciAqLAotCQkJCQkgICBiZmRfc2l6ZV90eXBlKSk7Ci0jZW5kaWYKLQwKLS8qIFRoZSBtYWluIHJvdXRpbmUuICAqLwotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IG9wdDsKLSAgY2hhciAqaW5wdXRfZmlsZSA9IE5VTEw7Ci0gIGNvbnN0IGNoYXIgKmlucHV0X2Zvcm1hdCA9IE5VTEw7Ci0gIGNvbnN0IGNoYXIgKm91dHB1dF9mb3JtYXQgPSBOVUxMOwotICBjb25zdCBjaGFyICpoZWFkZXJfZmlsZSA9IE5VTEw7Ci0gIGNoYXIgKmxkX2FyZyA9IE5VTEw7Ci0gIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgZml4ZWRfaGRyX3N0cnVjdDsKLSAgTmxtX0ludGVybmFsX1ZhcmlhYmxlX0hlYWRlciB2YXJfaGRyX3N0cnVjdDsKLSAgTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyIHZlcnNpb25faGRyX3N0cnVjdDsKLSAgTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIgY29weXJpZ2h0X2hkcl9zdHJ1Y3Q7Ci0gIE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIgZXh0ZW5kZWRfaGRyX3N0cnVjdDsKLSAgYmZkICppbmJmZDsKLSAgYmZkICpvdXRiZmQ7Ci0gIGFzeW1ib2wgKipuZXdzeW1zLCAqKm91dHN5bXM7Ci0gIGxvbmcgc3ltY291bnQsIG5ld3N5bWFsbG9jLCBuZXdzeW1jb3VudDsKLSAgbG9uZyBzeW1zaXplOwotICBhc2VjdGlvbiAqdGV4dF9zZWMsICpic3Nfc2VjLCAqZGF0YV9zZWM7Ci0gIGJmZF92bWEgdm1hOwotICBiZmRfc2l6ZV90eXBlIGFsaWduOwotICBhc3ltYm9sICplbmRzeW07Ci0gIGxvbmcgaTsKLSAgY2hhciBpbmxlYWQsIG91dGxlYWQ7Ci0gIGJvb2xlYW4gZ290c3RhcnQsIGdvdGV4aXQsIGdvdGNoZWNrOwotICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgRklMRSAqY3VzdG9tX2RhdGEgPSBOVUxMOwotICBGSUxFICpoZWxwX2RhdGEgPSBOVUxMOwotICBGSUxFICptZXNzYWdlX2RhdGEgPSBOVUxMOwotICBGSUxFICpycGNfZGF0YSA9IE5VTEw7Ci0gIEZJTEUgKnNoYXJlZF9kYXRhID0gTlVMTDsKLSAgc2l6ZV90IGN1c3RvbV9zaXplID0gMDsKLSAgc2l6ZV90IGhlbHBfc2l6ZSA9IDA7Ci0gIHNpemVfdCBtZXNzYWdlX3NpemUgPSAwOwotICBzaXplX3QgbW9kdWxlX3NpemUgPSAwOwotICBzaXplX3QgcnBjX3NpemUgPSAwOwotICBhc2VjdGlvbiAqY3VzdG9tX3NlY3Rpb24gPSBOVUxMOwotICBhc2VjdGlvbiAqaGVscF9zZWN0aW9uID0gTlVMTDsKLSAgYXNlY3Rpb24gKm1lc3NhZ2Vfc2VjdGlvbiA9IE5VTEw7Ci0gIGFzZWN0aW9uICptb2R1bGVfc2VjdGlvbiA9IE5VTEw7Ci0gIGFzZWN0aW9uICpycGNfc2VjdGlvbiA9IE5VTEw7Ci0gIGFzZWN0aW9uICpzaGFyZWRfc2VjdGlvbiA9IE5VTEw7Ci0gIGJmZCAqc2hhcmVkYmZkOwotICBzaXplX3Qgc2hhcmVkX29mZnNldCA9IDA7Ci0gIHNpemVfdCBzaGFyZWRfc2l6ZSA9IDA7Ci0gIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgc2hhcmVkaGRyOwotICBpbnQgbGVuOwotICBjaGFyICptb2RuYW1lOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSBhcmd2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgYmZkX2luaXQgKCk7Ci0gIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7Ci0KLSAgd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImRoSTpsOk86VDpWIiwgbG9uZ19vcHRpb25zLAotCQkJICAgICAoaW50ICopIE5VTEwpKQotCSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChvcHQpCi0JewotCWNhc2UgJ2QnOgotCSAgZGVidWcgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICBzaG93X2hlbHAgKCk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCWNhc2UgJ0knOgotCSAgaW5wdXRfZm9ybWF0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnbCc6Ci0JICBsZF9hcmcgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdPJzoKLQkgIG91dHB1dF9mb3JtYXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdUJzoKLQkgIGhlYWRlcl9maWxlID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnVic6Ci0JICBwcmludF92ZXJzaW9uICgibmxtY29udiIpOwotCSAgLypOT1RSRUFDSEVEKi8KLQljYXNlIDA6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JfQotICAgIH0KLQotICAvKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtYXkgYmUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gICovCi0gIG91dHB1dF9maWxlID0gTlVMTDsKLSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgaW5wdXRfZmlsZSA9IGFyZ3Zbb3B0aW5kXTsKLSAgICAgICsrb3B0aW5kOwotICAgICAgaWYgKG9wdGluZCA8IGFyZ2MpCi0JewotCSAgb3V0cHV0X2ZpbGUgPSBhcmd2W29wdGluZF07Ci0JICArK29wdGluZDsKLQkgIGlmIChvcHRpbmQgPCBhcmdjKQotCSAgICBzaG93X3VzYWdlIChzdGRlcnIsIDEpOwotCSAgaWYgKHN0cmNtcCAoaW5wdXRfZmlsZSwgb3V0cHV0X2ZpbGUpID09IDApCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICBfKCIlczogaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtdXN0IGJlIGRpZmZlcmVudFxuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUpOwotCSAgICAgIGV4aXQgKDEpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJbml0aWFsaXplIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gdG8gZGVmYXVsdCB2YWx1ZXMuICAqLwotICBmaXhlZF9oZHIgPSAmZml4ZWRfaGRyX3N0cnVjdDsKLSAgbWVtc2V0ICgoUFRSKSAmZml4ZWRfaGRyX3N0cnVjdCwgMCwgc2l6ZW9mIGZpeGVkX2hkcl9zdHJ1Y3QpOwotICB2YXJfaGRyID0gJnZhcl9oZHJfc3RydWN0OwotICBtZW1zZXQgKChQVFIpICZ2YXJfaGRyX3N0cnVjdCwgMCwgc2l6ZW9mIHZhcl9oZHJfc3RydWN0KTsKLSAgdmVyc2lvbl9oZHIgPSAmdmVyc2lvbl9oZHJfc3RydWN0OwotICBtZW1zZXQgKChQVFIpICZ2ZXJzaW9uX2hkcl9zdHJ1Y3QsIDAsIHNpemVvZiB2ZXJzaW9uX2hkcl9zdHJ1Y3QpOwotICBjb3B5cmlnaHRfaGRyID0gJmNvcHlyaWdodF9oZHJfc3RydWN0OwotICBtZW1zZXQgKChQVFIpICZjb3B5cmlnaHRfaGRyX3N0cnVjdCwgMCwgc2l6ZW9mIGNvcHlyaWdodF9oZHJfc3RydWN0KTsKLSAgZXh0ZW5kZWRfaGRyID0gJmV4dGVuZGVkX2hkcl9zdHJ1Y3Q7Ci0gIG1lbXNldCAoKFBUUikgJmV4dGVuZGVkX2hkcl9zdHJ1Y3QsIDAsIHNpemVvZiBleHRlbmRlZF9oZHJfc3RydWN0KTsKLSAgY2hlY2tfcHJvY2VkdXJlID0gTlVMTDsKLSAgY3VzdG9tX2ZpbGUgPSBOVUxMOwotICBkZWJ1Z19pbmZvID0gZmFsc2U7Ci0gIGV4aXRfcHJvY2VkdXJlID0gIl9TdG9wIjsKLSAgZXhwb3J0X3N5bWJvbHMgPSBOVUxMOwotICBtYXBfZmlsZSA9IE5VTEw7Ci0gIGZ1bGxfbWFwID0gZmFsc2U7Ci0gIGhlbHBfZmlsZSA9IE5VTEw7Ci0gIGltcG9ydF9zeW1ib2xzID0gTlVMTDsKLSAgbWVzc2FnZV9maWxlID0gTlVMTDsKLSAgbW9kdWxlcyA9IE5VTEw7Ci0gIHNoYXJlbGliX2ZpbGUgPSBOVUxMOwotICBzdGFydF9wcm9jZWR1cmUgPSAiX1ByZWx1ZGUiOwotICB2ZXJib3NlID0gZmFsc2U7Ci0gIHJwY19maWxlID0gTlVMTDsKLQotICBwYXJzZV9lcnJvcnMgPSAwOwotCi0gIC8qIFBhcnNlIHRoZSBoZWFkZXIgZmlsZSAoaWYgdGhlcmUgaXMgb25lKS4gICovCi0gIGlmIChoZWFkZXJfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIG5sbWxleF9maWxlIChoZWFkZXJfZmlsZSkKLQkgIHx8IHl5cGFyc2UgKCkgIT0gMAotCSAgfHwgcGFyc2VfZXJyb3JzICE9IDApCi0JZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmIChpbnB1dF9maWxlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChpbnB1dF9maWxlICE9IE5VTEwpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLAotCQkgICBfKCIlczogaW5wdXQgZmlsZSBuYW1lZCBib3RoIG9uIGNvbW1hbmQgbGluZSBhbmQgd2l0aCBJTlBVVFxuIiksCi0JCSAgIHByb2dyYW1fbmFtZSk7Ci0JICBleGl0ICgxKTsKLQl9Ci0gICAgICBpZiAoaW5wdXRfZmlsZXMtPm5leHQgPT0gTlVMTCkKLQlpbnB1dF9maWxlID0gaW5wdXRfZmlsZXMtPnN0cmluZzsKLSAgICAgIGVsc2UKLQlpbnB1dF9maWxlID0gbGlua19pbnB1dHMgKGlucHV0X2ZpbGVzLCBsZF9hcmcpOwotICAgIH0KLSAgZWxzZSBpZiAoaW5wdXRfZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIGlucHV0IGZpbGVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgICAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLSAgICB9Ci0KLSAgaW5iZmQgPSBiZmRfb3BlbnIgKGlucHV0X2ZpbGUsIGlucHV0X2Zvcm1hdCk7Ci0gIGlmIChpbmJmZCA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoaW5wdXRfZmlsZSk7Ci0KLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChpbmJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGlucHV0X2ZpbGUpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9mb3JtYXQgPT0gTlVMTCkKLSAgICBvdXRwdXRfZm9ybWF0ID0gc2VsZWN0X291dHB1dF9mb3JtYXQgKGJmZF9nZXRfYXJjaCAoaW5iZmQpLAotCQkJCQkgIGJmZF9nZXRfbWFjaCAoaW5iZmQpLAotCQkJCQkgIGJmZF9iaWdfZW5kaWFuIChpbmJmZCkpOwotCi0gIGFzc2VydCAob3V0cHV0X2Zvcm1hdCAhPSBOVUxMKTsKLQotICAvKiBVc2UgdGhlIG91dHB1dCBmaWxlIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgaWYgaXQgZXhpc3RzLgotICAgICBPdGhlcndpc2UgdXNlIHRoZSBmaWxlIG5hbWVkIGluIHRoZSBPVVRQVVQgc3RhdGVtZW50LiAgKi8KLSAgaWYgKG91dHB1dF9maWxlID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gbmFtZSBmb3Igb3V0cHV0IGZpbGVcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUpOwotICAgICAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLSAgICB9Ci0KLSAgb3V0YmZkID0gYmZkX29wZW53IChvdXRwdXRfZmlsZSwgb3V0cHV0X2Zvcm1hdCk7Ci0gIGlmIChvdXRiZmQgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKG91dHB1dF9maWxlKTsKLSAgaWYgKCEgYmZkX3NldF9mb3JtYXQgKG91dGJmZCwgYmZkX29iamVjdCkpCi0gICAgYmZkX2ZhdGFsIChvdXRwdXRfZmlsZSk7Ci0KLSAgYXNzZXJ0IChiZmRfZ2V0X2ZsYXZvdXIgKG91dGJmZCkgPT0gYmZkX3RhcmdldF9ubG1fZmxhdm91cik7Ci0KLSAgaWYgKGJmZF9hcmNoX2dldF9jb21wYXRpYmxlIChpbmJmZCwgb3V0YmZkKSA9PSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwKLQkgICAgIF8oIiVzOiB3YXJuaW5nOmlucHV0IGFuZCBvdXRwdXQgZm9ybWF0cyBhcmUgbm90IGNvbXBhdGlibGVcbiIpLAotCSAgICAgcHJvZ3JhbV9uYW1lKTsKLQotICAvKiBNb3ZlIHRoZSB2YWx1ZXMgcmVhZCBmcm9tIHRoZSBjb21tYW5kIGZpbGUgaW50byBvdXRiZmQuICAqLwotICAqbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKSA9IGZpeGVkX2hkcl9zdHJ1Y3Q7Ci0gICpubG1fdmFyaWFibGVfaGVhZGVyIChvdXRiZmQpID0gdmFyX2hkcl9zdHJ1Y3Q7Ci0gICpubG1fdmVyc2lvbl9oZWFkZXIgKG91dGJmZCkgPSB2ZXJzaW9uX2hkcl9zdHJ1Y3Q7Ci0gICpubG1fY29weXJpZ2h0X2hlYWRlciAob3V0YmZkKSA9IGNvcHlyaWdodF9oZHJfc3RydWN0OwotICAqbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKSA9IGV4dGVuZGVkX2hkcl9zdHJ1Y3Q7Ci0KLSAgLyogU3RhcnQgY29weWluZyB0aGUgaW5wdXQgQkZEIHRvIHRoZSBvdXRwdXQgQkZELiAgKi8KLSAgaWYgKCEgYmZkX3NldF9maWxlX2ZsYWdzIChvdXRiZmQsIGJmZF9nZXRfZmlsZV9mbGFncyAoaW5iZmQpKSkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKG91dGJmZCkpOwotCi0gIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoaW5iZmQpOwotICBpZiAoc3ltc2l6ZSA8IDApCi0gICAgYmZkX2ZhdGFsIChpbnB1dF9maWxlKTsKLSAgc3ltYm9scyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1zaXplKTsKLSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoaW5iZmQsIHN5bWJvbHMpOwotICBpZiAoc3ltY291bnQgPCAwKQotICAgIGJmZF9mYXRhbCAoaW5wdXRfZmlsZSk7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSAuYnNzIHNlY3Rpb24uICAqLwotICBic3Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dGJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgaWYgKGJzc19zZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBic3Nfc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICAgICAgaWYgKGJzc19zZWMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgYnNzX3NlYywgU0VDX0FMTE9DKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChvdXRiZmQsIGJzc19zZWMsIDEpKQotCWJmZF9mYXRhbCAoXygibWFrZSAuYnNzIHNlY3Rpb24iKSk7Ci0gICAgfQotCi0gIC8qIFdlIHN0b3JlIHRoZSBvcmlnaW5hbCBzZWN0aW9uIG5hbWVzIGluIHRoZSAubmxtc2VjdGlvbnMgc2VjdGlvbiwKLSAgICAgc28gdGhhdCBwcm9ncmFtcyB3aGljaCB1bmRlcnN0YW5kIGl0IGNhbiByZXN1cnJlY3QgdGhlIG9yaWdpbmFsCi0gICAgIHNlY3Rpb25zIGZyb20gdGhlIE5MTS4gIFdlIHdpbGwgcHV0IGEgcG9pbnRlciB0byAubmxtc2VjdGlvbnMgaW4KLSAgICAgdGhlIE5MTSBoZWFkZXIgYXJlYS4gICovCi0gIHNlY3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgIi5ubG1zZWN0aW9ucyIpOwotICBpZiAoc2Vjc2VjID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChfKCJtYWtlIC5ubG1zZWN0aW9ucyBzZWN0aW9uIikpOwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgc2Vjc2VjLCBTRUNfSEFTX0NPTlRFTlRTKSkKLSAgICBiZmRfZmF0YWwgKF8oInNldCAubmxtc2VjdGlvbnMgZmxhZ3MiKSk7Ci0KLSNpZmRlZiBOTE1DT05WX1BPV0VSUEMKLSAgLyogRm9yIFBvd2VyUEMgTmV0V2FyZSB3ZSBuZWVkIHRvIGJ1aWxkIHN0dWJzIGZvciBjYWxscyB0byB1bmRlZmluZWQKLSAgICAgc3ltYm9scy4gIEJlY2F1c2UgZWFjaCBzdHViIHJlcXVpcmVzIGFuIGVudHJ5IGluIHRoZSBUT0Mgc2VjdGlvbgotICAgICB3aGljaCBtdXN0IGJlIGF0IHRoZSBzYW1lIGxvY2F0aW9uIGFzIG90aGVyIGVudHJpZXMgaW4gdGhlIFRPQwotICAgICBzZWN0aW9uLCB3ZSBtdXN0IGRvIHRoaXMgYmVmb3JlIGRldGVybWluaW5nIHdoZXJlIHRoZSBUT0Mgc2VjdGlvbgotICAgICBnb2VzIGluIHNldHVwX3NlY3Rpb25zLiAgKi8KLSAgaWYgKGJmZF9nZXRfYXJjaCAoaW5iZmQpID09IGJmZF9hcmNoX3Bvd2VycGMpCi0gICAgcG93ZXJwY19idWlsZF9zdHVicyAoaW5iZmQsIG91dGJmZCwgJnN5bWJvbHMsICZzeW1jb3VudCk7Ci0jZW5kaWYKLQotICAvKiBTZXQgdXAgdGhlIHNlY3Rpb25zLiAgKi8KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChpbmJmZCwgc2V0dXBfc2VjdGlvbnMsIChQVFIpIG91dGJmZCk7Ci0KLSAgdGV4dF9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0YmZkLCBOTE1fQ09ERV9OQU1FKTsKLQotICAvKiBUaGUgLmJzcyBzZWN0aW9uIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIC5kYXRhIHNlY3Rpb24uICAqLwotICBkYXRhX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBpZiAoZGF0YV9zZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGFkZDsKLQotICAgICAgdm1hID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChkYXRhX3NlYyk7Ci0gICAgICBhbGlnbiA9IDEgPDwgYnNzX3NlYy0+YWxpZ25tZW50X3Bvd2VyOwotICAgICAgYWRkID0gKCh2bWEgKyBhbGlnbiAtIDEpICZ+IChhbGlnbiAtIDEpKSAtIHZtYTsKLSAgICAgIHZtYSArPSBhZGQ7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fdm1hIChvdXRiZmQsIGJzc19zZWMsIHZtYSkpCi0JYmZkX2ZhdGFsIChfKCJzZXQgLmJzcyB2bWEiKSk7Ci0gICAgICBpZiAoYWRkICE9IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBkYXRhX3NpemU7Ci0KLQkgIGRhdGFfc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoZGF0YV9zZWMpOwotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dGJmZCwgZGF0YV9zZWMsIGRhdGFfc2l6ZSArIGFkZCkpCi0JICAgIGJmZF9mYXRhbCAoXygic2V0IC5kYXRhIHNpemUiKSk7Ci0JfQotICAgIH0KLQotICAvKiBBZGp1c3Qgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSAgaW5sZWFkID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChpbmJmZCk7Ci0gIG91dGxlYWQgPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKG91dGJmZCk7Ci0gIGdvdHN0YXJ0ID0gZmFsc2U7Ci0gIGdvdGV4aXQgPSBmYWxzZTsKLSAgZ290Y2hlY2sgPSBmYWxzZTsKLSAgbmV3c3ltYWxsb2MgPSAxMDsKLSAgbmV3c3ltcyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChuZXdzeW1hbGxvYyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIG5ld3N5bWNvdW50ID0gMDsKLSAgZW5kc3ltID0gTlVMTDsKLSAgZm9yIChpID0gMDsgaSA8IHN5bWNvdW50OyBpKyspCi0gICAgewotICAgICAgcmVnaXN0ZXIgYXN5bWJvbCAqc3ltOwotCi0gICAgICBzeW0gPSBzeW1ib2xzW2ldOwotCi0gICAgICAvKiBBZGQgb3IgcmVtb3ZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLiAgKi8KLSAgICAgIGlmIChpbmxlYWQgIT0gb3V0bGVhZCkKLQl7Ci0JICBpZiAoaW5sZWFkICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKVswXSA9PSBpbmxlYWQpCi0JCXsKLQkJICBpZiAob3V0bGVhZCA9PSAnXDAnKQotCQkgICAgKytzeW0tPm5hbWU7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBjaGFyICpuZXc7Ci0KLQkJICAgICAgbmV3ID0geG1hbGxvYyAoc3RybGVuIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pKSArIDEpOwotCQkgICAgICBuZXdbMF0gPSBvdXRsZWFkOwotCQkgICAgICBzdHJjcHkgKG5ldyArIDEsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkgKyAxKTsKLQkJICAgICAgc3ltLT5uYW1lID0gbmV3OwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKm5ldzsKLQotCSAgICAgIG5ldyA9IHhtYWxsb2MgKHN0cmxlbiAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSkgKyAyKTsKLQkgICAgICBuZXdbMF0gPSBvdXRsZWFkOwotCSAgICAgIHN0cmNweSAobmV3ICsgMSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSk7Ci0JICAgICAgc3ltLT5uYW1lID0gbmV3OwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBOTE0ncyBoYXZlIGFuIHVuaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uLCBidXQgdGhleSBkbyBub3QKLQkgaGF2ZSBhIGNvbW1vbiBzZWN0aW9uIGluIHRoZSBVbml4IHNlbnNlLiAgTW92ZSBhbGwgY29tbW9uCi0JIHN5bWJvbHMgaW50byB0aGUgLmJzcyBzZWN0aW9uLCBhbmQgbWFyayB0aGVtIGFzIGV4cG9ydGVkLiAgKi8KLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JewotCSAgYmZkX3ZtYSBzaXplOwotCi0JICBzeW0tPnNlY3Rpb24gPSBic3Nfc2VjOwotCSAgc2l6ZSA9IHN5bS0+dmFsdWU7Ci0JICBzeW0tPnZhbHVlID0gYnNzX3NlYy0+X3Jhd19zaXplOwotCSAgYnNzX3NlYy0+X3Jhd19zaXplICs9IHNpemU7Ci0JICBhbGlnbiA9IDEgPDwgYnNzX3NlYy0+YWxpZ25tZW50X3Bvd2VyOwotCSAgYnNzX3NlYy0+X3Jhd19zaXplID0gKGJzc19zZWMtPl9yYXdfc2l6ZSArIGFsaWduIC0gMSkgJn4gKGFsaWduIC0gMSk7Ci0JICBzeW0tPmZsYWdzIHw9IEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMOwotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9nZXRfc2VjdGlvbiAoc3ltKS0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQl7Ci0JICAvKiBNb3ZlIHRoZSBzeW1ib2wgaW50byB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgc3ltLT52YWx1ZSArPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSktPm91dHB1dF9vZmZzZXQ7Ci0JICBzeW0tPnNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSktPm91dHB1dF9zZWN0aW9uOwotCSAgLyogVGhpcyBpcyBubyBsb25nZXIgYSBzZWN0aW9uIHN5bWJvbC4gICovCi0JICBzeW0tPmZsYWdzICY9fiBCU0ZfU0VDVElPTl9TWU07Ci0JfQotCi0gICAgICAvKiBGb3JjZSBfZWRhdGEgYW5kIF9lbmQgdG8gYmUgZGVmaW5lZC4gIFRoaXMgd291bGQgbm9ybWFsbHkgYmUKLQkgZG9uZSBieSB0aGUgbGlua2VyLCBidXQgdGhlIG1hbmlwdWxhdGlvbiBvZiB0aGUgY29tbW9uCi0JIHN5bWJvbHMgd2lsbCBjb25mdXNlIGl0LiAgKi8KLSAgICAgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpID09IDAKLQkgICYmIGJmZF9hc3ltYm9sX25hbWUgKHN5bSlbMF0gPT0gJ18nCi0JICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JewotCSAgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgIl9lZGF0YSIpID09IDApCi0JICAgIHsKLQkgICAgICBzeW0tPnNlY3Rpb24gPSBic3Nfc2VjOwotCSAgICAgIHN5bS0+dmFsdWUgPSAwOwotCSAgICB9Ci0JICBpZiAoc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCAiX2VuZCIpID09IDApCi0JICAgIHsKLQkgICAgICBzeW0tPnNlY3Rpb24gPSBic3Nfc2VjOwotCSAgICAgIGVuZHN5bSA9IHN5bTsKLQkgICAgfQotCi0jaWZkZWYgTkxNQ09OVl9QT1dFUlBDCi0JICAvKiBGb3IgUG93ZXJQQyBOZXRXYXJlLCB3ZSBkZWZpbmUgX19HT1QwLiAgVGhpcyBpcyB0aGUgc3RhcnQKLQkgICAgIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotCSAgaWYgKGJmZF9nZXRfYXJjaCAoaW5iZmQpID09IGJmZF9hcmNoX3Bvd2VycGMKLQkgICAgICAmJiBzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksICJfX0dPVDAiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmdvdF9zZWM7Ci0KLQkgICAgICBnb3Rfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGluYmZkLCAiLmdvdCIpOwotCSAgICAgIGFzc2VydCAoZ290X3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCk7Ci0JICAgICAgc3ltLT52YWx1ZSA9IGdvdF9zZWMtPm91dHB1dF9vZmZzZXQ7Ci0JICAgICAgc3ltLT5zZWN0aW9uID0gZ290X3NlYy0+b3V0cHV0X3NlY3Rpb247Ci0JICAgIH0KLSNlbmRpZgotIAl9Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBnbG9iYWwgc3ltYm9sLCBjaGVjayB0aGUgZXhwb3J0IGxpc3QuICAqLwotICAgICAgaWYgKChzeW0tPmZsYWdzICYgKEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMKSkgIT0gMCkKLQl7Ci0JICByZWdpc3RlciBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmw7Ci0JICBpbnQgZm91bmRfc2ltcGxlOwotCi0JICAvKiBVbmZvcnR1bmF0ZWx5LCBhIHN5bWJvbCBjYW4gYXBwZWFyIG11bHRpcGxlIHRpbWVzIG9uIHRoZQotCSAgICAgZXhwb3J0IGxpc3QsIHdpdGggYW5kIHdpdGhvdXQgcHJlZml4ZXMuICAqLwotCSAgZm91bmRfc2ltcGxlID0gMDsKLQkgIGZvciAobCA9IGV4cG9ydF9zeW1ib2xzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAobC0+c3RyaW5nLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKSA9PSAwKQotCQlmb3VuZF9zaW1wbGUgPSAxOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGNoYXIgKnpiYXNlOwotCi0JCSAgemJhc2UgPSBzdHJjaHIgKGwtPnN0cmluZywgJ0AnKTsKLQkJICBpZiAoemJhc2UgIT0gTlVMTAotCQkgICAgICAmJiBzdHJjbXAgKHpiYXNlICsgMSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSkgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogV2UgbXVzdCBhZGQgYSBzeW1ib2wgd2l0aCB0aGlzIHByZWZpeC4gICovCi0JCSAgICAgIGlmIChuZXdzeW1jb3VudCA+PSBuZXdzeW1hbGxvYykKLQkJCXsKLQkJCSAgbmV3c3ltYWxsb2MgKz0gMTA7Ci0JCQkgIG5ld3N5bXMgPSAoKGFzeW1ib2wgKiopCi0JCQkJICAgICB4cmVhbGxvYyAoKFBUUikgbmV3c3ltcywKLQkJCQkJICAgICAgIChuZXdzeW1hbGxvYwotCQkJCQkJKiBzaXplb2YgKGFzeW1ib2wgKikpKSk7Ci0JCQl9Ci0JCSAgICAgIG5ld3N5bXNbbmV3c3ltY291bnRdID0KLQkJCShhc3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCkpOwotCQkgICAgICAqbmV3c3ltc1tuZXdzeW1jb3VudF0gPSAqc3ltOwotCQkgICAgICBuZXdzeW1zW25ld3N5bWNvdW50XS0+bmFtZSA9IGwtPnN0cmluZzsKLQkJICAgICAgKytuZXdzeW1jb3VudDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBpZiAoISBmb3VuZF9zaW1wbGUpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgdW5tb2RpZmllZCBzeW1ib2wgaXMgYWN0dWFsbHkgbm90IGV4cG9ydGVkIGF0Ci0JCSBhbGwuICAqLwotCSAgICAgIHN5bS0+ZmxhZ3MgJj1+IChCU0ZfR0xPQkFMIHwgQlNGX0VYUE9SVCk7Ci0JICAgICAgc3ltLT5mbGFncyB8PSBCU0ZfTE9DQUw7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIGl0J3MgYW4gdW5kZWZpbmVkIHN5bWJvbCwgc2VlIGlmIGl0J3Mgb24gdGhlIGltcG9ydCBsaXN0LgotCSBDaGFuZ2UgdGhlIHByZWZpeCBpZiBuZWNlc3NhcnkuICAqLwotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQl7Ci0JICByZWdpc3RlciBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmw7Ci0KLQkgIGZvciAobCA9IGltcG9ydF9zeW1ib2xzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAobC0+c3RyaW5nLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKSA9PSAwKQotCQlicmVhazsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBjaGFyICp6YmFzZTsKLQotCQkgIHpiYXNlID0gc3RyY2hyIChsLT5zdHJpbmcsICdAJyk7Ci0JCSAgaWYgKHpiYXNlICE9IE5VTEwKLQkJICAgICAgJiYgc3RyY21wICh6YmFzZSArIDEsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHN5bS0+bmFtZSA9IGwtPnN0cmluZzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgaWYgKGwgPT0gTlVMTCkKLQkgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgIF8oIiVzOiB3YXJuaW5nOiBzeW1ib2wgJXMgaW1wb3J0ZWQgYnV0IG5vdCBpbiBpbXBvcnQgbGlzdFxuIiksCi0JCSAgICAgcHJvZ3JhbV9uYW1lLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKTsKLQl9Ci0JCi0gICAgICAvKiBTZWUgaWYgaXQncyBvbmUgb2YgdGhlIHNwZWNpYWwgbmFtZWQgc3ltYm9scy4gICovCi0gICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSA9PSAwKQotCXsKLQkgIGJmZF92bWEgdmFsOwotCi0JICAvKiBGSVhNRTogSWYgdGhlc2Ugc3ltYm9scyBhcmUgbm90IGluIHRoZSAudGV4dCBzZWN0aW9uLCB3ZQotCSAgICAgYWRkIHRoZSAudGV4dCBzZWN0aW9uIHNpemUgdG8gdGhlIHZhbHVlLiAgVGhpcyBtYXkgbm90IGJlCi0JICAgICBjb3JyZWN0IGZvciBhbGwgdGFyZ2V0cy4gIEknbSBub3Qgc3VyZSBob3cgdGhpcyBzaG91bGQKLQkgICAgIHJlYWxseSBiZSBoYW5kbGVkLiAgKi8KLQkgIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHN0YXJ0X3Byb2NlZHVyZSkgPT0gMCkKLQkgICAgewotCSAgICAgIHZhbCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotCSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkgPT0gZGF0YV9zZWMKLQkJICAmJiB0ZXh0X3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQkJdmFsICs9IGJmZF9zZWN0aW9uX3NpemUgKG91dGJmZCwgdGV4dF9zZWMpOwotCSAgICAgIGlmICghIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAob3V0YmZkLCB2YWwpKQotCQliZmRfZmF0YWwgKF8oInNldCBzdGFydCBhZGRyZXNzIikpOwotCSAgICAgIGdvdHN0YXJ0ID0gdHJ1ZTsKLQkgICAgfQotCSAgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgZXhpdF9wcm9jZWR1cmUpID09IDApCi0JICAgIHsKLQkgICAgICB2YWwgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLQkgICAgICBpZiAoYmZkX2dldF9zZWN0aW9uIChzeW0pID09IGRhdGFfc2VjCi0JCSAgJiYgdGV4dF9zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JCXZhbCArPSBiZmRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHRleHRfc2VjKTsKLQkgICAgICBubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5leGl0UHJvY2VkdXJlT2Zmc2V0ID0gdmFsOwotCSAgICAgIGdvdGV4aXQgPSB0cnVlOwotCSAgICB9Ci0JICBpZiAoY2hlY2tfcHJvY2VkdXJlICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIGNoZWNrX3Byb2NlZHVyZSkgPT0gMCkKLQkgICAgewotCSAgICAgIHZhbCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotCSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkgPT0gZGF0YV9zZWMKLQkJICAmJiB0ZXh0X3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQkJdmFsICs9IGJmZF9zZWN0aW9uX3NpemUgKG91dGJmZCwgdGV4dF9zZWMpOwotCSAgICAgIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPmNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0ID0gdmFsOwotCSAgICAgIGdvdGNoZWNrID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGVuZHN5bSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGVuZHN5bS0+dmFsdWUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGJzc19zZWMpOwotCi0gICAgICAvKiBGSVhNRTogSWYgYW55IHJlbG9jcyByZWZlcnJpbmcgdG8gX2VuZCB1c2UgaW5wbGFjZSBhZGRlbmRzLAotCSB0aGVuIEkgdGhpbmsgdGhleSBuZWVkIHRvIGJlIHVwZGF0ZWQuICBUaGlzIGlzIGhhbmRsZWQgYnkKLQkgaTM4Nl9tYW5nbGVfcmVsb2NzLiAgSXMgaXQgbmVlZGVkIGZvciBhbnkgb3RoZXIgb2JqZWN0Ci0JIGZvcm1hdHM/ICAqLwotICAgIH0KLQotICBpZiAobmV3c3ltY291bnQgPT0gMCkKLSAgICBvdXRzeW1zID0gc3ltYm9sczsKLSAgZWxzZQotICAgIHsKLSAgICAgIG91dHN5bXMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoKHN5bWNvdW50ICsgbmV3c3ltY291bnQgKyAxKQotCQkJCSAgICAgICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgIG1lbWNweSAob3V0c3ltcywgc3ltYm9scywgc3ltY291bnQgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgbWVtY3B5IChvdXRzeW1zICsgc3ltY291bnQsIG5ld3N5bXMsIG5ld3N5bWNvdW50ICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgIG91dHN5bXNbc3ltY291bnQgKyBuZXdzeW1jb3VudF0gPSBOVUxMOwotICAgIH0KLQotICBiZmRfc2V0X3N5bXRhYiAob3V0YmZkLCBvdXRzeW1zLCBzeW1jb3VudCArIG5ld3N5bWNvdW50KTsKLSAgICAKLSAgaWYgKCEgZ290c3RhcnQpCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogd2FybmluZzogU1RBUlQgcHJvY2VkdXJlICVzIG5vdCBkZWZpbmVkXG4iKSwKLQkgICAgIHByb2dyYW1fbmFtZSwgc3RhcnRfcHJvY2VkdXJlKTsKLSAgaWYgKCEgZ290ZXhpdCkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB3YXJuaW5nOiBFWElUIHByb2NlZHVyZSAlcyBub3QgZGVmaW5lZFxuIiksCi0JICAgICBwcm9ncmFtX25hbWUsIGV4aXRfcHJvY2VkdXJlKTsKLSAgaWYgKGNoZWNrX3Byb2NlZHVyZSAhPSBOVUxMCi0gICAgICAmJiAhIGdvdGNoZWNrKQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHdhcm5pbmc6IENIRUNLIHByb2NlZHVyZSAlcyBub3QgZGVmaW5lZFxuIiksCi0JICAgICBwcm9ncmFtX25hbWUsIGNoZWNrX3Byb2NlZHVyZSk7Ci0KLSAgLyogQWRkIGFkZGl0aW9uYWwgc2VjdGlvbnMgcmVxdWlyZWQgZm9yIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24uICAqLwotICBpZiAoY3VzdG9tX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjdXN0b21fZGF0YSA9IGZvcGVuIChjdXN0b21fZmlsZSwgInIiKTsKLSAgICAgIGlmIChjdXN0b21fZGF0YSA9PSBOVUxMCi0JICB8fCBmc3RhdCAoZmlsZW5vIChjdXN0b21fZGF0YSksICZzdCkgPCAwKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBjdXN0b21fZmlsZSwKLQkJICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0JICBjdXN0b21fZmlsZSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGN1c3RvbV9zaXplID0gc3Quc3Rfc2l6ZTsKLQkgIGN1c3RvbV9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCAiLm5sbWN1c3RvbSIpOwotCSAgaWYgKGN1c3RvbV9zZWN0aW9uID09IE5VTEwKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIGN1c3RvbV9zZWN0aW9uLCBjdXN0b21fc2l6ZSkKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBjdXN0b21fc2VjdGlvbiwKLQkJCQkJICBTRUNfSEFTX0NPTlRFTlRTKSkKLQkgICAgYmZkX2ZhdGFsIChfKCJjdXN0b20gc2VjdGlvbiIpKTsKLQl9Ci0gICAgfQotICBpZiAoaGVscF9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgaGVscF9kYXRhID0gZm9wZW4gKGhlbHBfZmlsZSwgInIiKTsKLSAgICAgIGlmIChoZWxwX2RhdGEgPT0gTlVMTAotCSAgfHwgZnN0YXQgKGZpbGVubyAoaGVscF9kYXRhKSwgJnN0KSA8IDApCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIGhlbHBfZmlsZSwKLQkJICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0JICBoZWxwX2ZpbGUgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoZWxwX3NpemUgPSBzdC5zdF9zaXplOwotCSAgaGVscF9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCAiLm5sbWhlbHAiKTsKLQkgIGlmIChoZWxwX3NlY3Rpb24gPT0gTlVMTAotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dGJmZCwgaGVscF9zZWN0aW9uLCBoZWxwX3NpemUpCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgaGVscF9zZWN0aW9uLAotCQkJCQkgIFNFQ19IQVNfQ09OVEVOVFMpKQotCSAgICBiZmRfZmF0YWwgKF8oImhlbHAgc2VjdGlvbiIpKTsKLQkgIHN0cm5jcHkgKG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnN0YW1wLCAiTWVTc0FnRXMiLCA4KTsKLQl9Ci0gICAgfQotICBpZiAobWVzc2FnZV9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgbWVzc2FnZV9kYXRhID0gZm9wZW4gKG1lc3NhZ2VfZmlsZSwgInIiKTsKLSAgICAgIGlmIChtZXNzYWdlX2RhdGEgPT0gTlVMTAotCSAgfHwgZnN0YXQgKGZpbGVubyAobWVzc2FnZV9kYXRhKSwgJnN0KSA8IDApCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIG1lc3NhZ2VfZmlsZSwKLQkJICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0JICBtZXNzYWdlX2ZpbGUgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtZXNzYWdlX3NpemUgPSBzdC5zdF9zaXplOwotCSAgbWVzc2FnZV9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCAiLm5sbW1lc3NhZ2VzIik7Ci0JICBpZiAobWVzc2FnZV9zZWN0aW9uID09IE5VTEwKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIG1lc3NhZ2Vfc2VjdGlvbiwgbWVzc2FnZV9zaXplKQotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIG1lc3NhZ2Vfc2VjdGlvbiwKLQkJCQkJICBTRUNfSEFTX0NPTlRFTlRTKSkKLQkgICAgYmZkX2ZhdGFsIChfKCJtZXNzYWdlIHNlY3Rpb24iKSk7Ci0JICBzdHJuY3B5IChubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zdGFtcCwgIk1lU3NBZ0VzIiwgOCk7Ci0JfQotICAgIH0KLSAgaWYgKG1vZHVsZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmw7Ci0KLSAgICAgIG1vZHVsZV9zaXplID0gMDsKLSAgICAgIGZvciAobCA9IG1vZHVsZXM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0JbW9kdWxlX3NpemUgKz0gc3RybGVuIChsLT5zdHJpbmcpICsgMTsKLSAgICAgIG1vZHVsZV9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCAiLm5sbW1vZHVsZXMiKTsKLSAgICAgIGlmIChtb2R1bGVfc2VjdGlvbiA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIG1vZHVsZV9zZWN0aW9uLCBtb2R1bGVfc2l6ZSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIG1vZHVsZV9zZWN0aW9uLAotCQkJCSAgICAgIFNFQ19IQVNfQ09OVEVOVFMpKQotCWJmZF9mYXRhbCAoXygibW9kdWxlIHNlY3Rpb24iKSk7Ci0gICAgfQotICBpZiAocnBjX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBycGNfZGF0YSA9IGZvcGVuIChycGNfZmlsZSwgInIiKTsKLSAgICAgIGlmIChycGNfZGF0YSA9PSBOVUxMCi0JICB8fCBmc3RhdCAoZmlsZW5vIChycGNfZGF0YSksICZzdCkgPCAwKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBycGNfZmlsZSwKLQkJICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0JICBycGNfZmlsZSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJwY19zaXplID0gc3Quc3Rfc2l6ZTsKLQkgIHJwY19zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCAiLm5sbXJwYyIpOwotCSAgaWYgKHJwY19zZWN0aW9uID09IE5VTEwKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHJwY19zZWN0aW9uLCBycGNfc2l6ZSkKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBycGNfc2VjdGlvbiwKLQkJCQkJICBTRUNfSEFTX0NPTlRFTlRTKSkKLQkgICAgYmZkX2ZhdGFsIChfKCJycGMgc2VjdGlvbiIpKTsKLQkgIHN0cm5jcHkgKG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnN0YW1wLCAiTWVTc0FnRXMiLCA4KTsKLQl9Ci0gICAgfQotICBpZiAoc2hhcmVsaWJfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNoYXJlZGJmZCA9IGJmZF9vcGVuciAoc2hhcmVsaWJfZmlsZSwgb3V0cHV0X2Zvcm1hdCk7Ci0gICAgICBpZiAoc2hhcmVkYmZkID09IE5VTEwKLQkgIHx8ICEgYmZkX2NoZWNrX2Zvcm1hdCAoc2hhcmVkYmZkLCBiZmRfb2JqZWN0KSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIlczolczogJXNcbiIsIHByb2dyYW1fbmFtZSwgc2hhcmVsaWJfZmlsZSwKLQkJICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgc2hhcmVsaWJfZmlsZSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNoYXJlZGhkciA9ICpubG1fZml4ZWRfaGVhZGVyIChzaGFyZWRiZmQpOwotCSAgYmZkX2Nsb3NlIChzaGFyZWRiZmQpOwotCSAgc2hhcmVkX2RhdGEgPSBmb3BlbiAoc2hhcmVsaWJfZmlsZSwgInIiKTsKLQkgIGlmIChzaGFyZWRfZGF0YSA9PSBOVUxMCi0JICAgICAgfHwgKGZzdGF0IChmaWxlbm8gKHNoYXJlZF9kYXRhKSwgJnN0KSA8IDApKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIHNoYXJlbGliX2ZpbGUsCi0JCSAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKLQkgICAgICBzaGFyZWxpYl9maWxlID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogSWYgd2Ugd2VyZSBjbGV2ZXIsIHdlIGNvdWxkIGp1c3QgY29weSBvdXQgdGhlCi0JCSBzZWN0aW9ucyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgd2hpY2ggd2UgYWN0dWFsbHkKLQkJIG5lZWQuICBIb3dldmVyLCB3ZSB3b3VsZCBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlIHNpemVzCi0JCSBvZiB0aGUgZXh0ZXJuYWwgYW5kIHB1YmxpYyBpbmZvcm1hdGlvbiwgYW5kIHRoYXQgY2FuCi0JCSBub3QgYmUgZG9uZSB3aXRob3V0IHJlYWRpbmcgdGhyb3VnaCB0aGVtLiAgKi8KLQkgICAgICBpZiAoc2hhcmVkaGRyLnVuaW5pdGlhbGl6ZWREYXRhU2l6ZSA+IDApCi0JCXsKLQkJICAvKiBUaGVyZSBpcyBubyBwbGFjZSB0byByZWNvcmQgdGhpcyBpbmZvcm1hdGlvbi4gICovCi0JCSAgZnByaW50ZiAoc3RkZXJyLAotCQkJICAgXygiJXM6JXM6IHdhcm5pbmc6IHNoYXJlZCBsaWJyYXJpZXMgY2FuIG5vdCBoYXZlIHVuaW5pdGlhbGl6ZWQgZGF0YVxuIiksCi0JCQkgICBwcm9ncmFtX25hbWUsIHNoYXJlbGliX2ZpbGUpOwotCQl9Ci0JICAgICAgc2hhcmVkX29mZnNldCA9IHN0LnN0X3NpemU7Ci0JICAgICAgaWYgKHNoYXJlZF9vZmZzZXQgPiAoc2l6ZV90KSBzaGFyZWRoZHIuY29kZUltYWdlT2Zmc2V0KQotCQlzaGFyZWRfb2Zmc2V0ID0gc2hhcmVkaGRyLmNvZGVJbWFnZU9mZnNldDsKLQkgICAgICBpZiAoc2hhcmVkX29mZnNldCA+IChzaXplX3QpIHNoYXJlZGhkci5kYXRhSW1hZ2VPZmZzZXQpCi0JCXNoYXJlZF9vZmZzZXQgPSBzaGFyZWRoZHIuZGF0YUltYWdlT2Zmc2V0OwotCSAgICAgIGlmIChzaGFyZWRfb2Zmc2V0ID4gKHNpemVfdCkgc2hhcmVkaGRyLnJlbG9jYXRpb25GaXh1cE9mZnNldCkKLQkJc2hhcmVkX29mZnNldCA9IHNoYXJlZGhkci5yZWxvY2F0aW9uRml4dXBPZmZzZXQ7Ci0JICAgICAgaWYgKHNoYXJlZF9vZmZzZXQgPiAoc2l6ZV90KSBzaGFyZWRoZHIuZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0KQotCQlzaGFyZWRfb2Zmc2V0ID0gc2hhcmVkaGRyLmV4dGVybmFsUmVmZXJlbmNlc09mZnNldDsKLQkgICAgICBpZiAoc2hhcmVkX29mZnNldCA+IChzaXplX3QpIHNoYXJlZGhkci5wdWJsaWNzT2Zmc2V0KQotCQlzaGFyZWRfb2Zmc2V0ID0gc2hhcmVkaGRyLnB1YmxpY3NPZmZzZXQ7Ci0JICAgICAgc2hhcmVkX3NpemUgPSBzdC5zdF9zaXplIC0gc2hhcmVkX29mZnNldDsKLQkgICAgICBzaGFyZWRfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgIi5ubG1zaGFyZWQiKTsKLQkgICAgICBpZiAoc2hhcmVkX3NlY3Rpb24gPT0gTlVMTAotCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dGJmZCwgc2hhcmVkX3NlY3Rpb24sCi0JCQkJCSAgICAgc2hhcmVkX3NpemUpCi0JCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgc2hhcmVkX3NlY3Rpb24sCi0JCQkJCSAgICAgIFNFQ19IQVNfQ09OVEVOVFMpKQotCQliZmRfZmF0YWwgKF8oInNoYXJlZCBzZWN0aW9uIikpOwotCSAgICAgIHN0cm5jcHkgKG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnN0YW1wLCAiTWVTc0FnRXMiLCA4KTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQ2hlY2sgd2hldGhlciBhIHZlcnNpb24gd2FzIGdpdmVuLiAgKi8KLSAgaWYgKHN0cm5jbXAgKHZlcnNpb25faGRyLT5zdGFtcCwgIlZlUnNJb04jIiwgOCkgIT0gMCkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB3YXJuaW5nOiBObyB2ZXJzaW9uIG51bWJlciBnaXZlblxuIiksCi0JICAgICBwcm9ncmFtX25hbWUpOwotCi0gIC8qIEF0IGxlYXN0IGZvciBub3csIGFsd2F5cyBjcmVhdGUgYW4gZXh0ZW5kZWQgaGVhZGVyLCBiZWNhdXNlIHRoYXQKLSAgICAgaXMgd2hhdCBOTE1MSU5LIGRvZXMuICAqLwotICBzdHJuY3B5IChubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zdGFtcCwgIk1lU3NBZ0VzIiwgOCk7Ci0KLSAgc3RybmNweSAobmxtX2N5Z251c19leHRfaGVhZGVyIChvdXRiZmQpLT5zdGFtcCwgIkN5R25Vc0V4IiwgOCk7Ci0KLSAgLyogSWYgdGhlIGRhdGUgd2FzIG5vdCBnaXZlbiwgZm9yY2UgaXQgaW4uICAqLwotICBpZiAobmxtX3ZlcnNpb25faGVhZGVyIChvdXRiZmQpLT5tb250aCA9PSAwCi0gICAgICAmJiBubG1fdmVyc2lvbl9oZWFkZXIgKG91dGJmZCktPmRheSA9PSAwCi0gICAgICAmJiBubG1fdmVyc2lvbl9oZWFkZXIgKG91dGJmZCktPnllYXIgPT0gMCkKLSAgICB7Ci0gICAgICB0aW1lX3Qgbm93OwotICAgICAgc3RydWN0IHRtICpwdG07Ci0KLSAgICAgIHRpbWUgKCZub3cpOwotICAgICAgcHRtID0gbG9jYWx0aW1lICgmbm93KTsKLSAgICAgIG5sbV92ZXJzaW9uX2hlYWRlciAob3V0YmZkKS0+bW9udGggPSBwdG0tPnRtX21vbiArIDE7Ci0gICAgICBubG1fdmVyc2lvbl9oZWFkZXIgKG91dGJmZCktPmRheSA9IHB0bS0+dG1fbWRheTsKLSAgICAgIG5sbV92ZXJzaW9uX2hlYWRlciAob3V0YmZkKS0+eWVhciA9IHB0bS0+dG1feWVhciArIDE5MDA7Ci0gICAgICBzdHJuY3B5ICh2ZXJzaW9uX2hkci0+c3RhbXAsICJWZVJzSW9OIyIsIDgpOwotICAgIH0KLQotI2lmZGVmIE5MTUNPTlZfUE9XRVJQQwotICAvKiBSZXNvbHZlIHRoZSBzdHVicyB3ZSBidWlsZCBmb3IgUG93ZXJQQyBOZXRXYXJlLiAgKi8KLSAgaWYgKGJmZF9nZXRfYXJjaCAoaW5iZmQpID09IGJmZF9hcmNoX3Bvd2VycGMpCi0gICAgcG93ZXJwY19yZXNvbHZlX3N0dWJzIChpbmJmZCwgb3V0YmZkKTsKLSNlbmRpZgotCi0gIC8qIENvcHkgb3ZlciB0aGUgc2VjdGlvbnMuICAqLwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGluYmZkLCBjb3B5X3NlY3Rpb25zLCAoUFRSKSBvdXRiZmQpOwotCi0gIC8qIEZpbmlzaCB1cCB0aGUgaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGN1c3RvbV9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgUFRSIGRhdGE7Ci0KLSAgICAgIGRhdGEgPSB4bWFsbG9jIChjdXN0b21fc2l6ZSk7Ci0gICAgICBpZiAoZnJlYWQgKGRhdGEsIDEsIGN1c3RvbV9zaXplLCBjdXN0b21fZGF0YSkgIT0gY3VzdG9tX3NpemUpCi0JZnByaW50ZiAoc3RkZXJyLCBfKCIlczolczogcmVhZDogJXNcbiIpLCBwcm9ncmFtX25hbWUsIGN1c3RvbV9maWxlLAotCQkgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIGN1c3RvbV9zZWN0aW9uLCBkYXRhLAotCQkJCQkgIChmaWxlX3B0cikgMCwgY3VzdG9tX3NpemUpKQotCSAgICBiZmRfZmF0YWwgKF8oImN1c3RvbSBzZWN0aW9uIikpOwotCSAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+Y3VzdG9tRGF0YU9mZnNldCA9Ci0JICAgIGN1c3RvbV9zZWN0aW9uLT5maWxlcG9zOwotCSAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+Y3VzdG9tRGF0YVNpemUgPSBjdXN0b21fc2l6ZTsKLQl9Ci0gICAgICBmcmVlIChkYXRhKTsKLSAgICB9Ci0gIGlmICghIGRlYnVnX2luZm8pCi0gICAgewotICAgICAgLyogQXMgYSBzcGVjaWFsIGhhY2ssIHRoZSBiYWNrZW5kIHJlY29nbml6ZXMgYSBkZWJ1Z0luZm9PZmZzZXQKLQkgb2YgLTEgdG8gbWVhbiB0aGF0IGl0IHNob3VsZCBub3Qgb3V0cHV0IGFueSBkZWJ1Z2dpbmcKLQkgaW5mb3JtYXRpb24uICBUaGlzIGNhbiBub3QgYmUgaGFuZGxpbmcgYnkgZmlkZGxpbmcgd2l0aCB0aGUKLQkgc3ltYm9sIHRhYmxlIGJlY2F1c2UgZXhwb3J0ZWQgc3ltYm9scyBhcHBlYXIgaW4gYm90aCB0aGUKLQkgZXhwb3J0IGluZm9ybWF0aW9uIGFuZCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPmRlYnVnSW5mb09mZnNldCA9IChmaWxlX3B0cikgLTE7Ci0gICAgfQotICBpZiAobWFwX2ZpbGUgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICBfKCIlczogd2FybmluZzogTUFQIGFuZCBGVUxMTUFQIGFyZSBub3Qgc3VwcG9ydGVkOyB0cnkgbGQgLU1cbiIpLAotCSAgICAgcHJvZ3JhbV9uYW1lKTsKLSAgaWYgKGhlbHBfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIFBUUiBkYXRhOwotCi0gICAgICBkYXRhID0geG1hbGxvYyAoaGVscF9zaXplKTsKLSAgICAgIGlmIChmcmVhZCAoZGF0YSwgMSwgaGVscF9zaXplLCBoZWxwX2RhdGEpICE9IGhlbHBfc2l6ZSkKLQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVzOiByZWFkOiAlc1xuIiksIHByb2dyYW1fbmFtZSwgaGVscF9maWxlLAotCQkgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIGhlbHBfc2VjdGlvbiwgZGF0YSwKLQkJCQkJICAoZmlsZV9wdHIpIDAsIGhlbHBfc2l6ZSkpCi0JICAgIGJmZF9mYXRhbCAoXygiaGVscCBzZWN0aW9uIikpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+aGVscEZpbGVPZmZzZXQgPQotCSAgICBoZWxwX3NlY3Rpb24tPmZpbGVwb3M7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5oZWxwRmlsZUxlbmd0aCA9IGhlbHBfc2l6ZTsKLQl9Ci0gICAgICBmcmVlIChkYXRhKTsKLSAgICB9Ci0gIGlmIChtZXNzYWdlX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBQVFIgZGF0YTsKLQotICAgICAgZGF0YSA9IHhtYWxsb2MgKG1lc3NhZ2Vfc2l6ZSk7Ci0gICAgICBpZiAoZnJlYWQgKGRhdGEsIDEsIG1lc3NhZ2Vfc2l6ZSwgbWVzc2FnZV9kYXRhKSAhPSBtZXNzYWdlX3NpemUpCi0JZnByaW50ZiAoc3RkZXJyLCBfKCIlczolczogcmVhZDogJXNcbiIpLCBwcm9ncmFtX25hbWUsIG1lc3NhZ2VfZmlsZSwKLQkJIHN0cmVycm9yIChlcnJubykpOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBtZXNzYWdlX3NlY3Rpb24sIGRhdGEsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBtZXNzYWdlX3NpemUpKQotCSAgICBiZmRfZmF0YWwgKF8oIm1lc3NhZ2Ugc2VjdGlvbiIpKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPm1lc3NhZ2VGaWxlT2Zmc2V0ID0KLQkgICAgbWVzc2FnZV9zZWN0aW9uLT5maWxlcG9zOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+bWVzc2FnZUZpbGVMZW5ndGggPSBtZXNzYWdlX3NpemU7Ci0KLQkgIC8qIEZJWE1FOiBBcmUgdGhlc2Ugb2Zmc2V0cyBjb3JyZWN0IG9uIGFsbCBwbGF0Zm9ybXM/ICBBcmUKLQkgICAgIHRoZXkgMzIgYml0cyBvbiBhbGwgcGxhdGZvcm1zPyAgV2hhdCBlbmRpYW5uZXNzPyAgKi8KLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPmxhbmd1YWdlSUQgPQotCSAgICBiZmRfaF9nZXRfMzIgKG91dGJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyAxMDYpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+bWVzc2FnZUNvdW50ID0KLQkgICAgYmZkX2hfZ2V0XzMyIChvdXRiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgMTEwKTsKLQl9Ci0gICAgICBmcmVlIChkYXRhKTsKLSAgICB9Ci0gIGlmIChtb2R1bGVzICE9IE5VTEwpCi0gICAgewotICAgICAgUFRSIGRhdGE7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpzZXQ7Ci0gICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmw7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGM7Ci0KLSAgICAgIGRhdGEgPSB4bWFsbG9jIChtb2R1bGVfc2l6ZSk7Ci0gICAgICBjID0gMDsKLSAgICAgIHNldCA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGE7Ci0gICAgICBmb3IgKGwgPSBtb2R1bGVzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCXsKLQkgICpzZXQgPSBzdHJsZW4gKGwtPnN0cmluZyk7Ci0JICBzdHJuY3B5IChzZXQgKyAxLCBsLT5zdHJpbmcsICpzZXQpOwotCSAgc2V0ICs9ICpzZXQgKyAxOwotCSAgKytjOwotCX0KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBtb2R1bGVfc2VjdGlvbiwgZGF0YSwKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIG1vZHVsZV9zaXplKSkKLQliZmRfZmF0YWwgKF8oIm1vZHVsZSBzZWN0aW9uIikpOwotICAgICAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+bW9kdWxlRGVwZW5kZW5jeU9mZnNldCA9Ci0JbW9kdWxlX3NlY3Rpb24tPmZpbGVwb3M7Ci0gICAgICBubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5udW1iZXJPZk1vZHVsZURlcGVuZGVuY2llcyA9IGM7Ci0gICAgfQotICBpZiAocnBjX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBQVFIgZGF0YTsKLQotICAgICAgZGF0YSA9IHhtYWxsb2MgKHJwY19zaXplKTsKLSAgICAgIGlmIChmcmVhZCAoZGF0YSwgMSwgcnBjX3NpemUsIHJwY19kYXRhKSAhPSBycGNfc2l6ZSkKLQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVzOiByZWFkOiAlc1xuIiksIHByb2dyYW1fbmFtZSwgcnBjX2ZpbGUsCi0JCSBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgcnBjX3NlY3Rpb24sIGRhdGEsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBycGNfc2l6ZSkpCi0JICAgIGJmZF9mYXRhbCAoXygicnBjIHNlY3Rpb24iKSk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5SUENEYXRhT2Zmc2V0ID0KLQkgICAgcnBjX3NlY3Rpb24tPmZpbGVwb3M7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5SUENEYXRhTGVuZ3RoID0gcnBjX3NpemU7Ci0JfQotICAgICAgZnJlZSAoZGF0YSk7Ci0gICAgfQotICBpZiAoc2hhcmVsaWJfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIFBUUiBkYXRhOwotCi0gICAgICBkYXRhID0geG1hbGxvYyAoc2hhcmVkX3NpemUpOwotICAgICAgaWYgKGZzZWVrIChzaGFyZWRfZGF0YSwgc2hhcmVkX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgIHx8IGZyZWFkIChkYXRhLCAxLCBzaGFyZWRfc2l6ZSwgc2hhcmVkX2RhdGEpICE9IHNoYXJlZF9zaXplKQotCWZwcmludGYgKHN0ZGVyciwgXygiJXM6JXM6IHJlYWQ6ICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBzaGFyZWxpYl9maWxlLAotCQkgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIHNoYXJlZF9zZWN0aW9uLCBkYXRhLAotCQkJCQkgIChmaWxlX3B0cikgMCwgc2hhcmVkX3NpemUpKQotCSAgICBiZmRfZmF0YWwgKF8oInNoYXJlZCBzZWN0aW9uIikpOwotCX0KLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZENvZGVPZmZzZXQgPQotCXNoYXJlZGhkci5jb2RlSW1hZ2VPZmZzZXQgLSBzaGFyZWRfb2Zmc2V0ICsgc2hhcmVkX3NlY3Rpb24tPmZpbGVwb3M7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWRDb2RlTGVuZ3RoID0KLQlzaGFyZWRoZHIuY29kZUltYWdlU2l6ZTsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZERhdGFPZmZzZXQgPQotCXNoYXJlZGhkci5kYXRhSW1hZ2VPZmZzZXQgLSBzaGFyZWRfb2Zmc2V0ICsgc2hhcmVkX3NlY3Rpb24tPmZpbGVwb3M7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWREYXRhTGVuZ3RoID0KLQlzaGFyZWRoZHIuZGF0YUltYWdlU2l6ZTsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZFJlbG9jYXRpb25GaXh1cE9mZnNldCA9Ci0JKHNoYXJlZGhkci5yZWxvY2F0aW9uRml4dXBPZmZzZXQKLQkgLSBzaGFyZWRfb2Zmc2V0Ci0JICsgc2hhcmVkX3NlY3Rpb24tPmZpbGVwb3MpOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnQgPQotCXNoYXJlZGhkci5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHM7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWRFeHRlcm5hbFJlZmVyZW5jZU9mZnNldCA9Ci0JKHNoYXJlZGhkci5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQKLQkgLSBzaGFyZWRfb2Zmc2V0Ci0JICsgc2hhcmVkX3NlY3Rpb24tPmZpbGVwb3MpOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCA9Ci0Jc2hhcmVkaGRyLm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkUHVibGljc09mZnNldCA9Ci0Jc2hhcmVkaGRyLnB1YmxpY3NPZmZzZXQgLSBzaGFyZWRfb2Zmc2V0ICsgc2hhcmVkX3NlY3Rpb24tPmZpbGVwb3M7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWRQdWJsaWNzQ291bnQgPQotCXNoYXJlZGhkci5udW1iZXJPZlB1YmxpY3M7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWREZWJ1Z1JlY29yZE9mZnNldCA9Ci0Jc2hhcmVkaGRyLmRlYnVnSW5mb09mZnNldCAtIHNoYXJlZF9vZmZzZXQgKyBzaGFyZWRfc2VjdGlvbi0+ZmlsZXBvczsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZERlYnVnUmVjb3JkQ291bnQgPQotCXNoYXJlZGhkci5udW1iZXJPZkRlYnVnUmVjb3JkczsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPlNoYXJlZEluaXRpYWxpemF0aW9uT2Zmc2V0ID0KLQlzaGFyZWRoZHIuY29kZVN0YXJ0T2Zmc2V0OwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+U2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCA9Ci0Jc2hhcmVkaGRyLmV4aXRQcm9jZWR1cmVPZmZzZXQ7Ci0gICAgICBmcmVlIChkYXRhKTsKLSAgICB9Ci0gIGxlbiA9IHN0cmxlbiAob3V0cHV0X2ZpbGUpOwotICBpZiAobGVuID4gTkxNX01PRFVMRV9OQU1FX1NJWkUgLSAyKQotICAgIGxlbiA9IE5MTV9NT0RVTEVfTkFNRV9TSVpFIC0gMjsKLSAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+bW9kdWxlTmFtZVswXSA9IGxlbjsKLQotICBzdHJuY3B5IChubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5tb2R1bGVOYW1lICsgMSwgb3V0cHV0X2ZpbGUsCi0JICAgTkxNX01PRFVMRV9OQU1FX1NJWkUgLSAyKTsKLSAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+bW9kdWxlTmFtZVtOTE1fTU9EVUxFX05BTUVfU0laRSAtIDFdID0gJ1wwJzsKLSAgZm9yIChtb2RuYW1lID0gbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+bW9kdWxlTmFtZTsKLSAgICAgICAqbW9kbmFtZSAhPSAnXDAnOwotICAgICAgIG1vZG5hbWUrKykKLSAgICBpZiAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpICptb2RuYW1lKSkKLSAgICAgICptb2RuYW1lID0gdG91cHBlciAoKm1vZG5hbWUpOwotCi0gIHN0cm5jcHkgKG5sbV92YXJpYWJsZV9oZWFkZXIgKG91dGJmZCktPm9sZFRocmVhZE5hbWUsICIgTE9ORyIsCi0JICAgTkxNX09MRF9USFJFQURfTkFNRV9MRU5HVEgpOwotCi0gIG5sbV9jeWdudXNfZXh0X2hlYWRlciAob3V0YmZkKS0+b2Zmc2V0ID0gc2Vjc2VjLT5maWxlcG9zOwotICBubG1fY3lnbnVzX2V4dF9oZWFkZXIgKG91dGJmZCktPmxlbmd0aCA9IGJmZF9zZWN0aW9uX3NpemUgKG91dGJmZCwgc2Vjc2VjKTsKLQotICBpZiAoISBiZmRfY2xvc2UgKG91dGJmZCkpCi0gICAgYmZkX2ZhdGFsIChvdXRwdXRfZmlsZSk7Ci0gIGlmICghIGJmZF9jbG9zZSAoaW5iZmQpKQotICAgIGJmZF9mYXRhbCAoaW5wdXRfZmlsZSk7Ci0KLSAgaWYgKHVubGlua19vbl9leGl0ICE9IE5VTEwpCi0gICAgdW5saW5rICh1bmxpbmtfb25fZXhpdCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBEaXNwbGF5IGEgaGVscCBtZXNzYWdlIGFuZCBleGl0LiAgKi8KLQotc3RhdGljIHZvaWQKLXNob3dfaGVscCAoKQotewotICBwcmludGYgKF8oIiVzOiBDb252ZXJ0IGFuIG9iamVjdCBmaWxlIGludG8gYSBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZVxuIiksCi0JICBwcm9ncmFtX25hbWUpOwotICBzaG93X3VzYWdlIChzdGRvdXQsIDApOwotfQotCi0vKiBTaG93IGEgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4gICovCi0KLXN0YXRpYyB2b2lkCi1zaG93X3VzYWdlIChmaWxlLCBzdGF0dXMpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKGZpbGUsIF8oIlwKLVVzYWdlOiAlcyBbLWRoVl0gWy1JIGJmZG5hbWVdIFstTyBiZmRuYW1lXSBbLVQgaGVhZGVyLWZpbGVdIFstbCBsaW5rZXJdXG5cCi0gICAgICAgWy0taW5wdXQtdGFyZ2V0PWJmZG5hbWVdIFstLW91dHB1dC10YXJnZXQ9YmZkbmFtZV1cblwKLSAgICAgICBbLS1oZWFkZXItZmlsZT1maWxlXSBbLS1saW5rZXI9bGlua2VyXSBbLS1kZWJ1Z11cblwKLSAgICAgICBbLS1oZWxwXSBbLS12ZXJzaW9uXVxuXAotICAgICAgIFtpbi1maWxlIFtvdXQtZmlsZV1dXG4iKSwKLQkgICBwcm9ncmFtX25hbWUpOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoZmlsZSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0MCi0vKiBTZWxlY3QgdGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gdGhlIGlucHV0IGFyY2hpdGVjdHVyZSwgbWFjaGluZSwKLSAgIGFuZCBlbmRpYW5uZXNzLiAgVGhpcyBjaG9vc2VzIHRoZSBhcHByb3ByaWF0ZSBOTE0gdGFyZ2V0LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotc2VsZWN0X291dHB1dF9mb3JtYXQgKGFyY2gsIG1hY2gsIGJpZ2VuZGlhbikKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaDsKLSAgICAgYm9vbGVhbiBiaWdlbmRpYW47Ci17Ci0gIHN3aXRjaCAoYXJjaCkKLSAgICB7Ci0jaWZkZWYgTkxNQ09OVl9JMzg2Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgcmV0dXJuICJubG0zMi1pMzg2IjsKLSNlbmRpZgotI2lmZGVmIE5MTUNPTlZfU1BBUkMKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgcmV0dXJuICJubG0zMi1zcGFyYyI7Ci0jZW5kaWYKLSNpZmRlZiBOTE1DT05WX0FMUEhBCi0gICAgY2FzZSBiZmRfYXJjaF9hbHBoYToKLSAgICAgIHJldHVybiAibmxtMzItYWxwaGEiOwotI2VuZGlmCi0jaWZkZWYgTkxNQ09OVl9QT1dFUlBDCi0gICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgotICAgICAgcmV0dXJuICJubG0zMi1wb3dlcnBjIjsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBzdXBwb3J0IG5vdCBjb21waWxlZCBpbiBmb3IgJXNcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUsIGJmZF9wcmludGFibGVfYXJjaF9tYWNoIChhcmNoLCBtYWNoKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICAgIC8qIEF2b2lkIHdhcm5pbmcuICAqLwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotDAotLyogVGhlIEJGRCBzZWN0aW9ucyBhcmUgY29waWVkIGluIHR3byBwYXNzZXMuICBUaGlzIGZ1bmN0aW9uIHNlbGVjdHMKLSAgIHRoZSBvdXRwdXQgc2VjdGlvbiBmb3IgZWFjaCBpbnB1dCBzZWN0aW9uLCBhbmQgc2V0cyB1cCB0aGUgc2VjdGlvbgotICAgbmFtZSwgc2l6ZSwgZXRjLiAgKi8KLQotc3RhdGljIHZvaWQKLXNldHVwX3NlY3Rpb25zIChpbmJmZCwgaW5zZWMsIGRhdGFfcHRyKQotICAgICBiZmQgKmluYmZkOwotICAgICBhc2VjdGlvbiAqaW5zZWM7Ci0gICAgIFBUUiBkYXRhX3B0cjsKLXsKLSAgYmZkICpvdXRiZmQgPSAoYmZkICopIGRhdGFfcHRyOwotICBmbGFnd29yZCBmOwotICBjb25zdCBjaGFyICpvdXRuYW1lOwotICBhc2VjdGlvbiAqb3V0c2VjOwotICBiZmRfdm1hIG9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBhbGlnbjsKLSAgYmZkX3NpemVfdHlwZSBhZGQ7Ci0gIGJmZF9zaXplX3R5cGUgc2Vjc2Vjc2l6ZTsKLQotICBmID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChpbmJmZCwgaW5zZWMpOwotICBpZiAoZiAmIFNFQ19DT0RFKQotICAgIG91dG5hbWUgPSBOTE1fQ09ERV9OQU1FOwotICBlbHNlIGlmICgoZiAmIFNFQ19MT0FEKSAmJiAoZiAmIFNFQ19IQVNfQ09OVEVOVFMpKQotICAgIG91dG5hbWUgPSBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FOwotICBlbHNlIGlmIChmICYgU0VDX0FMTE9DKQotICAgIG91dG5hbWUgPSBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUU7Ci0gIGVsc2UKLSAgICBvdXRuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5iZmQsIGluc2VjKTsKLQotICBvdXRzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0YmZkLCBvdXRuYW1lKTsKLSAgaWYgKG91dHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG91dHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgb3V0bmFtZSk7Ci0gICAgICBpZiAob3V0c2VjID09IE5VTEwpCi0JYmZkX2ZhdGFsIChfKCJtYWtlIHNlY3Rpb24iKSk7Ci0gICAgfQotCi0gIGluc2VjLT5vdXRwdXRfc2VjdGlvbiA9IG91dHNlYzsKLQotICBvZmZzZXQgPSBiZmRfc2VjdGlvbl9zaXplIChvdXRiZmQsIG91dHNlYyk7Ci0gIGFsaWduID0gMSA8PCBiZmRfc2VjdGlvbl9hbGlnbm1lbnQgKGluYmZkLCBpbnNlYyk7Ci0gIGFkZCA9ICgob2Zmc2V0ICsgYWxpZ24gLSAxKSAmfiAoYWxpZ24gLSAxKSkgLSBvZmZzZXQ7Ci0gIGluc2VjLT5vdXRwdXRfb2Zmc2V0ID0gb2Zmc2V0ICsgYWRkOwotCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIG91dHNlYywKLQkJCSAgICAgIChiZmRfc2VjdGlvbl9zaXplIChvdXRiZmQsIG91dHNlYykKLQkJCSAgICAgICArIGJmZF9zZWN0aW9uX3NpemUgKGluYmZkLCBpbnNlYykKLQkJCSAgICAgICArIGFkZCkpKQotICAgIGJmZF9mYXRhbCAoXygic2V0IHNlY3Rpb24gc2l6ZSIpKTsKLQotICBpZiAoKGJmZF9zZWN0aW9uX2FsaWdubWVudCAoaW5iZmQsIGluc2VjKQotICAgICAgID4gYmZkX3NlY3Rpb25fYWxpZ25tZW50IChvdXRiZmQsIG91dHNlYykpCi0gICAgICAmJiAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKG91dGJmZCwgb3V0c2VjLAotCQkJCSAgICAgIGJmZF9zZWN0aW9uX2FsaWdubWVudCAoaW5iZmQsIGluc2VjKSkpCi0gICAgYmZkX2ZhdGFsIChfKCJzZXQgc2VjdGlvbiBhbGlnbm1lbnQiKSk7Ci0KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIG91dHNlYywKLQkJCSAgICAgICBmIHwgYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIG91dHNlYykpKQotICAgIGJmZF9mYXRhbCAoXygic2V0IHNlY3Rpb24gZmxhZ3MiKSk7Ci0KLSAgYmZkX3NldF9yZWxvYyAob3V0YmZkLCBvdXRzZWMsIChhcmVsZW50ICoqKSBOVUxMLCAwKTsKLQotICAvKiBGb3IgZWFjaCBpbnB1dCBzZWN0aW9uIHdlIGFsbG9jYXRlIHNwYWNlIGZvciBhbiBlbnRyeSBpbgotICAgICAubmxtc2VjdGlvbnMuICAqLwotICBzZWNzZWNzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBzZWNzZWMpOwotICBzZWNzZWNzaXplICs9IHN0cmxlbiAoYmZkX3NlY3Rpb25fbmFtZSAoaW5iZmQsIGluc2VjKSkgKyAxOwotICBzZWNzZWNzaXplID0gKHNlY3NlY3NpemUgKyAzKSAmfiAzOwotICBzZWNzZWNzaXplICs9IDg7Ci0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHNlY3NlYywgc2Vjc2Vjc2l6ZSkpCi0gICAgYmZkX2ZhdGFsIChfKCJzZXQgLm5sbXNlY3Rpb25zIHNpemUiKSk7Ci19Ci0KLS8qIENvcHkgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotCi1zdGF0aWMgdm9pZAotY29weV9zZWN0aW9ucyAoaW5iZmQsIGluc2VjLCBkYXRhX3B0cikKLSAgICAgYmZkICppbmJmZDsKLSAgICAgYXNlY3Rpb24gKmluc2VjOwotICAgICBQVFIgZGF0YV9wdHI7Ci17Ci0gIHN0YXRpYyBiZmRfc2l6ZV90eXBlIHNlY3NlY29mZiA9IDA7Ci0gIGJmZCAqb3V0YmZkID0gKGJmZCAqKSBkYXRhX3B0cjsKLSAgY29uc3QgY2hhciAqaW5uYW1lOwotICBhc2VjdGlvbiAqb3V0c2VjOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIFBUUiBjb250ZW50czsKLSAgbG9uZyByZWxvY19zaXplOwotICBiZmRfYnl0ZSBidWZbNF07Ci0gIGJmZF9zaXplX3R5cGUgYWRkOwotCi0gIGlubmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGluYmZkLCBpbnNlYyk7Ci0KLSAgb3V0c2VjID0gaW5zZWMtPm91dHB1dF9zZWN0aW9uOwotICBhc3NlcnQgKG91dHNlYyAhPSBOVUxMKTsKLQotICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChpbnNlYyk7Ci0KLSAgLyogRklYTUU6IFdoeSBhcmUgdGhlc2UgbmVjZXNzYXJ5PyAgKi8KLSAgaW5zZWMtPl9jb29rZWRfc2l6ZSA9IGluc2VjLT5fcmF3X3NpemU7Ci0gIGluc2VjLT5yZWxvY19kb25lID0gdHJ1ZTsKLQotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaW5iZmQsIGluc2VjKSAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0gICAgY29udGVudHMgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgY29udGVudHMgPSB4bWFsbG9jIChzaXplKTsKLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5iZmQsIGluc2VjLCBjb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNpemUpKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoaW5iZmQpKTsKLSAgICB9Ci0KLSAgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGluYmZkLCBpbnNlYyk7Ci0gIGlmIChyZWxvY19zaXplIDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGluYmZkKSk7Ci0gIGlmIChyZWxvY19zaXplICE9IDApCi0gICAgewotICAgICAgYXJlbGVudCAqKnJlbG9jczsKLSAgICAgIGxvbmcgcmVsb2NfY291bnQ7Ci0KLSAgICAgIHJlbG9jcyA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxvY19zaXplKTsKLSAgICAgIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5iZmQsIGluc2VjLCByZWxvY3MsIHN5bWJvbHMpOwotICAgICAgaWYgKHJlbG9jX2NvdW50IDwgMCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGluYmZkKSk7Ci0gICAgICBtYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCAmcmVsb2NzLCAmcmVsb2NfY291bnQsIChjaGFyICopIGNvbnRlbnRzLAotCQkgICAgIHNpemUpOwotCi0gICAgICAvKiBGSVhNRTogcmVmZXJzIHRvIGludGVybmFsIEJGRCBmaWVsZHMuICAqLwotICAgICAgaWYgKG91dHNlYy0+b3JlbG9jYXRpb24gIT0gKGFyZWxlbnQgKiopIE5VTEwpCi0JewotCSAgYmZkX3NpemVfdHlwZSB0b3RhbF9jb3VudDsKLQkgIGFyZWxlbnQgKipjb21iaW5lZDsKLQotCSAgdG90YWxfY291bnQgPSByZWxvY19jb3VudCArIG91dHNlYy0+cmVsb2NfY291bnQ7Ci0JICBjb21iaW5lZCA9IChhcmVsZW50ICoqKSB4bWFsbG9jICh0b3RhbF9jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0JICBtZW1jcHkgKGNvbWJpbmVkLCBvdXRzZWMtPm9yZWxvY2F0aW9uLAotCQkgIG91dHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFyZWxlbnQgKikpOwotCSAgbWVtY3B5IChjb21iaW5lZCArIG91dHNlYy0+cmVsb2NfY291bnQsIHJlbG9jcywKLQkJICAoc2l6ZV90KSAocmVsb2NfY291bnQgKiBzaXplb2YgKGFyZWxlbnQgKikpKTsKLQkgIGZyZWUgKG91dHNlYy0+b3JlbG9jYXRpb24pOwotCSAgcmVsb2NfY291bnQgPSB0b3RhbF9jb3VudDsKLQkgIHJlbG9jcyA9IGNvbWJpbmVkOwotCX0KLQotICAgICAgYmZkX3NldF9yZWxvYyAob3V0YmZkLCBvdXRzZWMsIHJlbG9jcywgcmVsb2NfY291bnQpOwotICAgIH0KLQotICBpZiAoY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgb3V0c2VjLCBjb250ZW50cywKLQkJCQkgICAgICBpbnNlYy0+b3V0cHV0X29mZnNldCwgc2l6ZSkpCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChvdXRiZmQpKTsKLSAgICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgICB9Ci0KLSAgLyogQWRkIHRoaXMgc2VjdGlvbiB0byAubmxtc2VjdGlvbnMuICAqLwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgc2Vjc2VjLCAoUFRSKSBpbm5hbWUsIHNlY3NlY29mZiwKLQkJCQkgIHN0cmxlbiAoaW5uYW1lKSArIDEpKQotICAgIGJmZF9mYXRhbCAoXygic2V0IC5ubG1zZWN0aW9uIGNvbnRlbnRzIikpOwotICBzZWNzZWNvZmYgKz0gc3RybGVuIChpbm5hbWUpICsgMTsKLQotICBhZGQgPSAoKHNlY3NlY29mZiArIDMpICZ+IDMpIC0gc2Vjc2Vjb2ZmOwotICBpZiAoYWRkICE9IDApCi0gICAgewotICAgICAgYmZkX2hfcHV0XzMyIChvdXRiZmQsIChiZmRfdm1hKSAwLCBidWYpOwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIHNlY3NlYywgYnVmLCBzZWNzZWNvZmYsIGFkZCkpCi0JYmZkX2ZhdGFsIChfKCJzZXQgLm5sbXNlY3Rpb24gY29udGVudHMiKSk7Ci0gICAgICBzZWNzZWNvZmYgKz0gYWRkOwotICAgIH0KLQotICBpZiAoY29udGVudHMgIT0gTlVMTCkKLSAgICBiZmRfaF9wdXRfMzIgKG91dGJmZCwgKGJmZF92bWEpIG91dHNlYy0+ZmlsZXBvcywgYnVmKTsKLSAgZWxzZQotICAgIGJmZF9oX3B1dF8zMiAob3V0YmZkLCAoYmZkX3ZtYSkgMCwgYnVmKTsKLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIHNlY3NlYywgYnVmLCBzZWNzZWNvZmYsIDQpKQotICAgIGJmZF9mYXRhbCAoXygic2V0IC5ubG1zZWN0aW9uIGNvbnRlbnRzIikpOwotICBzZWNzZWNvZmYgKz0gNDsKLQotICBiZmRfaF9wdXRfMzIgKG91dGJmZCwgKGJmZF92bWEpIHNpemUsIGJ1Zik7Ci0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBzZWNzZWMsIGJ1Ziwgc2Vjc2Vjb2ZmLCA0KSkKLSAgICBiZmRfZmF0YWwgKF8oInNldCAubmxtc2VjdGlvbiBjb250ZW50cyIpKTsKLSAgc2Vjc2Vjb2ZmICs9IDQ7Ci19Ci0KLS8qIFNvbWUsIHBlcmhhcHMgYWxsLCBOZXRXYXJlIHRhcmdldHMgcmVxdWlyZSBjaGFuZ2luZyB0aGUgcmVsb2NzIHVzZWQKLSAgIGJ5IHRoZSBpbnB1dCBmb3JtYXRzLiAgKi8KLQotc3RhdGljIHZvaWQKLW1hbmdsZV9yZWxvY3MgKG91dGJmZCwgaW5zZWMsIHJlbG9jc19wdHIsIHJlbG9jX2NvdW50X3B0ciwgY29udGVudHMsCi0JICAgICAgIGNvbnRlbnRzX3NpemUpCi0gICAgIGJmZCAqb3V0YmZkOwotICAgICBhc2VjdGlvbiAqaW5zZWM7Ci0gICAgIGFyZWxlbnQgKioqcmVsb2NzX3B0cjsKLSAgICAgbG9uZyAqcmVsb2NfY291bnRfcHRyOwotICAgICBjaGFyICpjb250ZW50czsKLSAgICAgYmZkX3NpemVfdHlwZSBjb250ZW50c19zaXplOwotewotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAob3V0YmZkKSkKLSAgICB7Ci0jaWZkZWYgTkxNQ09OVl9JMzg2Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgaTM4Nl9tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsCi0JCQkgIGNvbnRlbnRzLCBjb250ZW50c19zaXplKTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTkxNQ09OVl9BTFBIQQotICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6Ci0gICAgICBhbHBoYV9tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsCi0JCQkgICBjb250ZW50cywgY29udGVudHNfc2l6ZSk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIE5MTUNPTlZfUE9XRVJQQwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSAgICAgIHBvd2VycGNfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLAotCQkJICAgICBjb250ZW50cywgY29udGVudHNfc2l6ZSk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBkZWZhdWx0X21hbmdsZV9yZWxvY3MgKG91dGJmZCwgaW5zZWMsIHJlbG9jc19wdHIsIHJlbG9jX2NvdW50X3B0ciwKLQkJCSAgICAgY29udGVudHMsIGNvbnRlbnRzX3NpemUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBCeSBkZWZhdWx0IGFsbCB3ZSBuZWVkIHRvIGRvIGZvciByZWxvY3MgaXMgY2hhbmdlIHRoZSBhZGRyZXNzIGJ5Ci0gICB0aGUgb3V0cHV0X29mZnNldC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLWRlZmF1bHRfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLCBjb250ZW50cywKLQkJICAgICAgIGNvbnRlbnRzX3NpemUpCi0gICAgIGJmZCAqb3V0YmZkOwotICAgICBhc2VjdGlvbiAqaW5zZWM7Ci0gICAgIGFyZWxlbnQgKioqcmVsb2NzX3B0cjsKLSAgICAgbG9uZyAqcmVsb2NfY291bnRfcHRyOwotICAgICBjaGFyICpjb250ZW50czsKLSAgICAgYmZkX3NpemVfdHlwZSBjb250ZW50c19zaXplOwotewotICBpZiAoaW5zZWMtPm91dHB1dF9vZmZzZXQgIT0gMCkKLSAgICB7Ci0gICAgICBsb25nIHJlbG9jX2NvdW50OwotICAgICAgcmVnaXN0ZXIgYXJlbGVudCAqKnJlbG9jczsKLSAgICAgIHJlZ2lzdGVyIGxvbmcgaTsKLQotICAgICAgcmVsb2NfY291bnQgPSAqcmVsb2NfY291bnRfcHRyOwotICAgICAgcmVsb2NzID0gKnJlbG9jc19wdHI7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcmVsb2NfY291bnQ7IGkrKywgcmVsb2NzKyspCi0JKCpyZWxvY3MpLT5hZGRyZXNzICs9IGluc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgIH0KLX0KLQwKLSNpZmRlZiBOTE1DT05WX0kzODYKLQotLyogTmV0V2FyZSBvbiB0aGUgaTM4NiBzdXBwb3J0cyBhIHJlc3RyaWN0ZWQgc2V0IG9mIHJlbG9jcywgd2hpY2ggYXJlCi0gICBkaWZmZXJlbnQgZnJvbSB0aG9zZSB1c2VkIG9uIG90aGVyIGkzODYgdGFyZ2V0cy4gIFRoaXMgcm91dGluZQotICAgY29udmVydHMgdGhlIHJlbG9jcy4gIEl0IGlzLCBvYnZpb3VzbHksIHZlcnkgdGFyZ2V0IGRlcGVuZGVudC4gIEF0Ci0gICB0aGUgbW9tZW50LCB0aGUgbmxtMzItaTM4NiBiYWNrZW5kIHBlcmZvcm1zIHNpbWlsYXIgdHJhbnNsYXRpb25zOwotICAgaG93ZXZlciwgaXQgaXMgbW9yZSByZWxpYWJsZSBhbmQgZWZmaWNpZW50IHRvIGRvIHRoZW0gaGVyZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbV9pMzg2X3BjcmVsX2hvd3RvID0KLSAgSE9XVE8gKDEsCQkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJESVNQMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpOwkJCS8qIHBjcmVsX29mZnNldCAqLwotCi1zdGF0aWMgdm9pZAotaTM4Nl9tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsIGNvbnRlbnRzLAotCQkgICAgY29udGVudHNfc2l6ZSkKLSAgICAgYmZkICpvdXRiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnNlYzsKLSAgICAgYXJlbGVudCAqKipyZWxvY3NfcHRyOwotICAgICBsb25nICpyZWxvY19jb3VudF9wdHI7Ci0gICAgIGNoYXIgKmNvbnRlbnRzOwotICAgICBiZmRfc2l6ZV90eXBlIGNvbnRlbnRzX3NpemU7Ci17Ci0gIGxvbmcgcmVsb2NfY291bnQsIGk7Ci0gIGFyZWxlbnQgKipyZWxvY3M7Ci0KLSAgcmVsb2NfY291bnQgPSAqcmVsb2NfY291bnRfcHRyOwotICByZWxvY3MgPSAqcmVsb2NzX3B0cjsKLSAgZm9yIChpID0gMDsgaSA8IHJlbG9jX2NvdW50OyBpKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcmVsOwotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgYmZkX3NpemVfdHlwZSBhZGRyZXNzOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0KLSAgICAgIHJlbCA9ICpyZWxvY3MrKzsKLSAgICAgIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0gICAgICAvKiBXZSdyZSBtb3ZpbmcgdGhlIHJlbG9jcyBmcm9tIHRoZSBpbnB1dCBzZWN0aW9uIHRvIHRoZSBvdXRwdXQKLQkgc2VjdGlvbiwgc28gd2UgbXVzdCBhZGp1c3QgdGhlIGFkZHJlc3MgYWNjb3JkaW5nbHkuICAqLwotICAgICAgYWRkcmVzcyA9IHJlbC0+YWRkcmVzczsKLSAgICAgIHJlbC0+YWRkcmVzcyArPSBpbnNlYy0+b3V0cHV0X29mZnNldDsKLQotICAgICAgLyogTm90ZSB0aGF0IG5vIHNlcmlvdXMgaGFybSB3aWxsIGVuc3VlIGlmIHdlIGZhaWwgdG8gY2hhbmdlIGEKLQkgcmVsb2MuICBUaGUgYmFja2VuZCB3aWxsIGZhaWwgd2hlbiB3cml0aW5nIG91dCB0aGUgcmVsb2MuICAqLwotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhpcyByZWxvYyBpcyB3aXRoaW4gdGhlIGRhdGEgd2UgaGF2ZS4gIFdlIHVzZSBvbmx5Ci0JIDQgYnl0ZSByZWxvY3MgaGVyZSwgc28gd2UgaW5zaXN0IG9uIGhhdmluZyA0IGJ5dGVzLiAgKi8KLSAgICAgIGlmIChhZGRyZXNzICsgNCA+IGNvbnRlbnRzX3NpemUpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEEgUEMgcmVsYXRpdmUgcmVsb2MgZW50aXJlbHkgd2l0aGluIGEgc2luZ2xlIHNlY3Rpb24gaXMKLQkgY29tcGxldGVseSB1bm5lY2Vzc2FyeS4gIFRoaXMgY2FuIGJlIGdlbmVyYXRlZCBieSBsZCAtci4gICovCi0gICAgICBpZiAoc3ltID09IGluc2VjLT5zeW1ib2wKLQkgICYmIHJlbC0+aG93dG8gIT0gTlVMTAotCSAgJiYgcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkgICYmICEgcmVsLT5ob3d0by0+cGNyZWxfb2Zmc2V0KQotCXsKLQkgIC0tKnJlbG9jX2NvdW50X3B0cjsKLQkgIC0tcmVsb2NzOwotCSAgbWVtbW92ZSAocmVsb2NzLCByZWxvY3MgKyAxLAotCQkgICAoc2l6ZV90KSAoKHJlbG9jX2NvdW50IC0gaSkgKiBzaXplb2YgKGFyZWxlbnQgKikpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSBhbW91bnQgdGhlIHJlbG9jYXRpb24gd2lsbCBhZGQgaW4uICAqLwotICAgICAgYWRkZW5kID0gcmVsLT5hZGRlbmQgKyBzeW0tPnZhbHVlOwotCi0gICAgICAvKiBOZXRXYXJlIGRvZXNuJ3Qgc3VwcG9ydCBQQyByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBkZWZpbmVkCi0JIHN5bWJvbHMsIHNvIHdlIGhhdmUgdG8gZWxpbWluYXRlIHRoZW0gYnkgZG9pbmcgdGhlIHJlbG9jYXRpb24KLQkgbm93LiAgV2UgY2FuIG9ubHkgZG8gdGhpcyBpZiB0aGUgcmVsb2MgaXMgd2l0aGluIGEgc2luZ2xlCi0JIHNlY3Rpb24uICAqLwotICAgICAgaWYgKHJlbC0+aG93dG8gIT0gTlVMTAotCSAgJiYgcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkgICYmIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSA9PSBpbnNlYy0+b3V0cHV0X3NlY3Rpb24pCi0JewotCSAgYmZkX3ZtYSB2YWw7Ci0KLQkgIGlmIChyZWwtPmhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JICAgIGFkZGVuZCAtPSBhZGRyZXNzOwotCi0JICB2YWwgPSBiZmRfZ2V0XzMyIChvdXRiZmQsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIGFkZHJlc3MpOwotCSAgdmFsICs9IGFkZGVuZDsKLQkgIGJmZF9wdXRfMzIgKG91dGJmZCwgdmFsLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyBhZGRyZXNzKTsKLQotCSAgLS0qcmVsb2NfY291bnRfcHRyOwotCSAgLS1yZWxvY3M7Ci0JICBtZW1tb3ZlIChyZWxvY3MsIHJlbG9jcyArIDEsCi0JCSAgIChzaXplX3QpICgocmVsb2NfY291bnQgLSBpKSAqIHNpemVvZiAoYXJlbGVudCAqKSkpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBOZXRXYXJlIGRvZXNuJ3Qgc3VwcG9ydCByZWxvYyBhZGRlbmRzLCBzbyB3ZSBnZXQgcmlkIG9mIHRoZW0KLQkgaGVyZSBieSBzaW1wbHkgYWRkaW5nIHRoZW0gaW50byB0aGUgb2JqZWN0IGRhdGEuICBXZSBoYW5kbGUKLQkgdGhlIHN5bWJvbCB2YWx1ZSwgaWYgYW55LCB0aGUgc2FtZSB3YXkuICAqLwotICAgICAgaWYgKGFkZGVuZCAhPSAwCi0JICAmJiByZWwtPmhvd3RvICE9IE5VTEwKLQkgICYmIHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c2l6ZSA9PSAyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRzaXplID09IDMyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRwb3MgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c3JjX21hc2sgPT0gMHhmZmZmZmZmZgotCSAgJiYgcmVsLT5ob3d0by0+ZHN0X21hc2sgPT0gMHhmZmZmZmZmZikKLQl7Ci0JICBiZmRfdm1hIHZhbDsKLQotCSAgdmFsID0gYmZkX2dldF8zMiAob3V0YmZkLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyBhZGRyZXNzKTsKLQkgIHZhbCArPSBhZGRlbmQ7Ci0JICBiZmRfcHV0XzMyIChvdXRiZmQsIHZhbCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci0KLQkgIC8qIEFkanVzdCB0aGUgcmVsb2MgZm9yIHRoZSBjaGFuZ2VzIHdlIGp1c3QgbWFkZS4gICovCi0JICByZWwtPmFkZGVuZCA9IDA7Ci0JICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSktPnN5bWJvbF9wdHJfcHRyOwotCX0KLQotICAgICAgLyogTmV0V2FyZSB1c2VzIGEgcmVsb2Mgd2l0aCBwY3JlbF9vZmZzZXQgc2V0LiAgV2UgYWRqdXN0Ci0JIHBjX3JlbGF0aXZlIHJlbG9jcyBhY2NvcmRpbmdseS4gIFdlIGFyZSBnb2luZyB0byBjaGFuZ2UgdGhlCi0JIGhvd3RvIGZpZWxkLCBzbyB3ZSBjYW4gb25seSBkbyB0aGlzIGlmIHRoZSBjdXJyZW50IG9uZSBpcwotCSBjb21wYXRpYmxlLiAgV2Ugc2hvdWxkIGNoZWNrIHRoYXQgc3BlY2lhbF9mdW5jdGlvbiBpcyBOVUxMCi0JIGhlcmUsIGJ1dCBhdCB0aGUgbW9tZW50IGNvZmYtaTM4NiB1c2VzIGEgc3BlY2lhbF9mdW5jdGlvbgotCSB3aGljaCBkb2VzIG5vdCBhZmZlY3Qgd2hhdCB3ZSBhcmUgZG9pbmcgaGVyZS4gICovCi0gICAgICBpZiAocmVsLT5ob3d0byAhPSBOVUxMCi0JICAmJiByZWwtPmhvd3RvLT5wY19yZWxhdGl2ZQotCSAgJiYgISByZWwtPmhvd3RvLT5wY3JlbF9vZmZzZXQKLQkgICYmIHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c2l6ZSA9PSAyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRzaXplID09IDMyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRwb3MgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c3JjX21hc2sgPT0gMHhmZmZmZmZmZgotCSAgJiYgcmVsLT5ob3d0by0+ZHN0X21hc2sgPT0gMHhmZmZmZmZmZikKLQl7Ci0JICBiZmRfdm1hIHZhbDsKLQotCSAgLyogV2hlbiBwY3JlbF9vZmZzZXQgaXMgbm90IHNldCwgaXQgbWVhbnMgdGhhdCB0aGUgbmVnYXRpdmUKLQkgICAgIG9mIHRoZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgbG9jYXRpb24gaXMgc3RvcmVkIGluIHRoZQotCSAgICAgbWVtb3J5IGxvY2F0aW9uLiAgV2UgbXVzdCBhZGQgaXQgYmFjayBpbi4gICovCi0JICB2YWwgPSBiZmRfZ2V0XzMyIChvdXRiZmQsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIGFkZHJlc3MpOwotCSAgdmFsICs9IGFkZHJlc3M7Ci0JICBiZmRfcHV0XzMyIChvdXRiZmQsIHZhbCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci0KLQkgIC8qIFdlIG11c3QgY2hhbmdlIHRvIGEgbmV3IGhvd3RvLiAgKi8KLQkgIHJlbC0+aG93dG8gPSAmbmxtX2kzODZfcGNyZWxfaG93dG87Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmIC8qIE5MTUNPTlZfSTM4NiAqLwotDAotI2lmZGVmIE5MTUNPTlZfQUxQSEEKLQotLyogT24gdGhlIEFscGhhIHRoZSBmaXJzdCByZWxvYyBmb3IgZXZlcnkgc2VjdGlvbiBtdXN0IGJlIGEgc3BlY2lhbAotICAgcmVsb2NzIHdoaWNoIGhvbGQgdGhlIEdQIGFkZHJlc3MuICBBbHNvLCB0aGUgZmlyc3QgcmVsb2MgaW4gdGhlCi0gICBmaWxlIG11c3QgYmUgYSBzcGVjaWFsIHJlbG9jIHdoaWNoIGhvbGRzIHRoZSBhZGRyZXNzIG9mIHRoZSAubGl0YQotICAgc2VjdGlvbi4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbTMyX2FscGhhX253X2hvd3RvID0KLSAgSE9XVE8gKEFMUEhBX1JfTldfUkVMT0MsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk5XX1JFTE9DIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotYWxwaGFfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLCBjb250ZW50cywKLQkJICAgICBjb250ZW50c19zaXplKQotICAgICBiZmQgKm91dGJmZDsKLSAgICAgYXNlY3Rpb24gKmluc2VjOwotICAgICByZWdpc3RlciBhcmVsZW50ICoqKnJlbG9jc19wdHI7Ci0gICAgIGxvbmcgKnJlbG9jX2NvdW50X3B0cjsKLSAgICAgY2hhciAqY29udGVudHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgY29udGVudHNfc2l6ZTsKLXsKLSAgbG9uZyBvbGRfcmVsb2NfY291bnQ7Ci0gIGFyZWxlbnQgKipvbGRfcmVsb2NzOwotICByZWdpc3RlciBhcmVsZW50ICoqcmVsb2NzOwotCi0gIG9sZF9yZWxvY19jb3VudCA9ICpyZWxvY19jb3VudF9wdHI7Ci0gIG9sZF9yZWxvY3MgPSAqcmVsb2NzX3B0cjsKLSAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKChvbGRfcmVsb2NfY291bnQgKyAzKSAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gICpyZWxvY3NfcHRyID0gcmVsb2NzOwotCi0gIGlmIChubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5saXRhX2FkZHJlc3MgPT0gMCkKLSAgICB7Ci0gICAgICBiZmQgKmluYmZkOwotICAgICAgYXNlY3Rpb24gKmxpdGFfc2VjdGlvbjsKLQotICAgICAgaW5iZmQgPSBpbnNlYy0+b3duZXI7Ci0gICAgICBsaXRhX3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5iZmQsIF9MSVRBKTsKLSAgICAgIGlmIChsaXRhX3NlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgbmxtX2FscGhhX2JhY2tlbmRfZGF0YSAob3V0YmZkKS0+bGl0YV9hZGRyZXNzID0KLQkgICAgYmZkX2dldF9zZWN0aW9uX3ZtYSAoaW5iZmQsIGxpdGFfc2VjdGlvbik7Ci0JICBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5saXRhX3NpemUgPQotCSAgICBiZmRfc2VjdGlvbl9zaXplIChpbmJmZCwgbGl0YV9zZWN0aW9uKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQXZvaWQgb3V0cHV0dGluZyB0aGlzIHJlbG9jIGFnYWluLiAgKi8KLQkgIG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmxpdGFfYWRkcmVzcyA9IDQ7Ci0JfQotCi0gICAgICAqcmVsb2NzID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gICAgICAoKnJlbG9jcyktPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgICAoKnJlbG9jcyktPmFkZHJlc3MgPSBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5saXRhX2FkZHJlc3M7Ci0gICAgICAoKnJlbG9jcyktPmFkZGVuZCA9IG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmxpdGFfc2l6ZSArIDE7Ci0gICAgICAoKnJlbG9jcyktPmhvd3RvID0gJm5sbTMyX2FscGhhX253X2hvd3RvOwotICAgICAgKytyZWxvY3M7Ci0gICAgICArKygqcmVsb2NfY291bnRfcHRyKTsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBHUCB2YWx1ZSBmcm9tIGJmZC4gICovCi0gIGlmIChubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5ncCA9PSAwKQotICAgIG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmdwID0KLSAgICAgIGJmZF9lY29mZl9nZXRfZ3BfdmFsdWUgKGluc2VjLT5vd25lcik7Ci0KLSAgKnJlbG9jcyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICAoKnJlbG9jcyktPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICgqcmVsb2NzKS0+YWRkcmVzcyA9IG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmdwOwotICAoKnJlbG9jcyktPmFkZGVuZCA9IDA7Ci0gICgqcmVsb2NzKS0+aG93dG8gPSAmbmxtMzJfYWxwaGFfbndfaG93dG87Ci0gICsrcmVsb2NzOwotICArKygqcmVsb2NfY291bnRfcHRyKTsKLQotICBtZW1jcHkgKChQVFIpIHJlbG9jcywgKFBUUikgb2xkX3JlbG9jcywKLQkgIChzaXplX3QpIG9sZF9yZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gIHJlbG9jc1tvbGRfcmVsb2NfY291bnRdID0gKGFyZWxlbnQgKikgTlVMTDsKLQotICBmcmVlIChvbGRfcmVsb2NzKTsKLQotICBpZiAoaW5zZWMtPm91dHB1dF9vZmZzZXQgIT0gMCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBiZmRfc2l6ZV90eXBlIGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCAoYmZkX3NpemVfdHlwZSkgb2xkX3JlbG9jX2NvdW50OyBpKyssIHJlbG9jcysrKQotCSgqcmVsb2NzKS0+YWRkcmVzcyArPSBpbnNlYy0+b3V0cHV0X29mZnNldDsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBOTE1DT05WX0FMUEhBICovCi0MCi0jaWZkZWYgTkxNQ09OVl9QT1dFUlBDCi0KLS8qIFdlIGtlZXAgYSBsaW5rZWQgbGlzdCBvZiBzdHVicyB3aGljaCB3ZSBtdXN0IGJ1aWxkLiAgQmVjYXVzZSBCRkQKLSAgIHJlcXVpcmVzIHVzIHRvIGtub3cgdGhlIHNpemVzIG9mIGFsbCBzZWN0aW9ucyBiZWZvcmUgd2UgY2FuIHNldCB0aGUKLSAgIGNvbnRlbnRzIG9mIGFueSwgd2UgbXVzdCBmaWd1cmUgb3V0IHdoaWNoIHN0dWJzIHdlIHdhbnQgdG8gYnVpbGQKLSAgIGJlZm9yZSB3ZSBjYW4gYWN0dWFsbHkgYnVpbGQgYW55IG9mIHRoZW0uICAqLwotCi1zdHJ1Y3QgcG93ZXJwY19zdHViCi17Ci0gIC8qIE5leHQgc3R1YiBpbiBsaW5rZWQgbGlzdC4gICovCi0gIHN0cnVjdCBwb3dlcnBjX3N0dWIgKm5leHQ7Ci0KLSAgLyogU3ltYm9sIHdob3NlIHZhbHVlIGlzIHRoZSBzdGFydCBvZiB0aGUgc3R1Yi4gIFRoaXMgaXMgYSBzeW1ib2wKLSAgICAgd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCBgLicuICAqLwotICBhc3ltYm9sICpzdGFydDsKLQotICAvKiBTeW1ib2wgd2UgYXJlIGdvaW5nIHRvIGNyZWF0ZSBhIHJlbG9jIGFnYWluc3QuICBUaGlzIGlzIGEgc3ltYm9sCi0gICAgIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBTVEFSVCBidXQgd2l0aG91dCB0aGUgbGVhZGluZyBgLicuICAqLwotICBhc3ltYm9sICpyZWxvYzsKLQotICAvKiBUaGUgVE9DIGluZGV4IGZvciB0aGlzIHN0dWIuICBUaGlzIGlzIHRoZSBpbmRleCBpbnRvIHRoZSBUT0MKLSAgICAgc2VjdGlvbiBhdCB3aGljaCB0aGUgcmVsb2MgaXMgY3JlYXRlZC4gICovCi0gIHVuc2lnbmVkIGludCB0b2NfaW5kZXg7Ci19OwotCi0vKiBUaGUgbGlua2VkIGxpc3Qgb2Ygc3R1YnMuICAqLwotCi1zdGF0aWMgc3RydWN0IHBvd2VycGNfc3R1YiAqcG93ZXJwY19zdHViczsKLQotLyogVGhpcyBpcyB3aGF0IGEgc3R1YiBsb29rcyBsaWtlLiAgVGhlIGZpcnN0IGluc3RydWN0aW9uIHdpbGwgZ2V0Ci0gICBhZGp1c3RlZCB3aXRoIHRoZSBjb3JyZWN0IFRPQyBpbmRleC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBvd2VycGNfc3R1Yl9pbnNuc1tdID0KLXsKLSAgMHg4MTgyMDAwMCwJCS8qIGx3egkgcjEyLDAocjIpICovCi0gIDB4OTA0MTAwMTQsCQkvKiBzdHcJIHIyLDIwKHIxKSAqLwotICAweDgwMGMwMDAwLAkJLyogbHd6CSByMCwwKHIxMikgKi8KLSAgMHg4MDRjMDAwNCwJCS8qIGx3egkgcjIscihyMTIpICovCi0gIDB4N2MwOTAzYTYsCQkvKiBtdGN0ciByMCAqLwotICAweDRlODAwNDIwLAkJLyogYmN0ciAqLwotICAwLAkJCS8qIFRyYWNlYmFjayB0YWJsZS4gICovCi0gIDB4YzgwMDAsCi0gIDAKLX07Ci0KLSNkZWZpbmUgUE9XRVJQQ19TVFVCX0lOU05fQ09VTlQgXAotICAoc2l6ZW9mIHBvd2VycGNfc3R1Yl9pbnNucyAvIHNpemVvZiBwb3dlcnBjX3N0dWJfaW5zbnNbMF0pCi0KLSNkZWZpbmUgUE9XRVJQQ19TVFVCX1NJWkUgKDQgKiBQT1dFUlBDX1NUVUJfSU5TTl9DT1VOVCkKLQotLyogRWFjaCBzdHViIHVzZXMgYSBmb3VyIGJ5dGUgVE9DIGVudHJ5LiAgKi8KLSNkZWZpbmUgUE9XRVJQQ19TVFVCX1RPQ19FTlRSWV9TSVpFICg0KQotCi0vKiBUaGUgb3JpZ2luYWwgc2l6ZSBvZiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLXN0YXRpYyBiZmRfc2l6ZV90eXBlIHBvd2VycGNfaW5pdGlhbF9nb3Rfc2l6ZTsKLQotLyogTG9vayBmb3IgYWxsIHVuZGVmaW5lZCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoIGAuJywgYW5kIHByZXBhcmUgdG8KLSAgIGJ1aWxkIGEgc3R1YiBmb3IgZWFjaCBvbmUuICAqLwotCi1zdGF0aWMgdm9pZAotcG93ZXJwY19idWlsZF9zdHVicyAoaW5iZmQsIG91dGJmZCwgc3ltYm9sc19wdHIsIHN5bWNvdW50X3B0cikKLSAgICAgYmZkICppbmJmZDsKLSAgICAgYmZkICpvdXRiZmQ7Ci0gICAgIGFzeW1ib2wgKioqc3ltYm9sc19wdHI7Ci0gICAgIGxvbmcgKnN5bWNvdW50X3B0cjsKLXsKLSAgYXNlY3Rpb24gKnN0dWJfc2VjOwotICBhc2VjdGlvbiAqZ290X3NlYzsKLSAgdW5zaWduZWQgaW50IGdvdF9iYXNlOwotICBsb25nIGk7Ci0gIGxvbmcgc3ltY291bnQ7Ci0gIGxvbmcgc3R1YmNvdW50OwotCi0gIC8qIE1ha2UgYSBzZWN0aW9uIHRvIGhvbGQgc3R1YnMuICBXZSBkb24ndCBzZXQgU0VDX0hBU19DT05URU5UUyBmb3IKLSAgICAgdGhlIHNlY3Rpb24gdG8gcHJldmVudCBjb3B5X3NlY3Rpb25zIGZyb20gcmVhZGluZyBmcm9tIGl0LiAgKi8KLSAgc3R1Yl9zZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChpbmJmZCwgIi5zdHVicyIpOwotICBpZiAoc3R1Yl9zZWMgPT0gKGFzZWN0aW9uICopIE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChpbmJmZCwgc3R1Yl9zZWMsCi0JCQkJICAoU0VDX0NPREUKLQkJCQkgICB8IFNFQ19SRUxPQwotCQkJCSAgIHwgU0VDX0FMTE9DCi0JCQkJICAgfCBTRUNfTE9BRCkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGluYmZkLCBzdHViX3NlYywgMikpCi0gICAgYmZkX2ZhdGFsICgiLnN0dWJzIik7Ci0KLSAgLyogR2V0IHRoZSBUT0Mgc2VjdGlvbiwgd2hpY2ggaXMgbmFtZWQgLmdvdC4gICovCi0gIGdvdF9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5iZmQsICIuZ290Iik7Ci0gIGlmIChnb3Rfc2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGdvdF9zZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChpbmJmZCwgIi5nb3QiKTsKLSAgICAgIGlmIChnb3Rfc2VjID09IChhc2VjdGlvbiAqKSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoaW5iZmQsIGdvdF9zZWMsCi0JCQkJICAgICAgKFNFQ19EQVRBCi0JCQkJICAgICAgIHwgU0VDX1JFTE9DCi0JCQkJICAgICAgIHwgU0VDX0FMTE9DCi0JCQkJICAgICAgIHwgU0VDX0xPQUQKLQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTKSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoaW5iZmQsIGdvdF9zZWMsIDIpKQotCWJmZF9mYXRhbCAoIi5nb3QiKTsKLSAgICB9Ci0KLSAgcG93ZXJwY19pbml0aWFsX2dvdF9zaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoaW5iZmQsIGdvdF9zZWMpOwotICBnb3RfYmFzZSA9IHBvd2VycGNfaW5pdGlhbF9nb3Rfc2l6ZTsKLSAgZ290X2Jhc2UgPSAoZ290X2Jhc2UgKyAzKSAmfiAzOwotCi0gIHN0dWJjb3VudCA9IDA7Ci0KLSAgc3ltY291bnQgPSAqc3ltY291bnRfcHRyOwotICBmb3IgKGkgPSAwOyBpIDwgc3ltY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBhc3ltYm9sICpuZXdzeW07Ci0gICAgICBjaGFyICpuZXduYW1lOwotICAgICAgc3RydWN0IHBvd2VycGNfc3R1YiAqaXRlbTsKLQotICAgICAgc3ltID0gKCpzeW1ib2xzX3B0cilbaV07Ci0KLSAgICAgIC8qIFdlIG11c3QgbWFrZSBhIHN0dWIgZm9yIGV2ZXJ5IHVuZGVmaW5lZCBzeW1ib2wgd2hvc2UgbmFtZQotCSBzdGFydHMgd2l0aCAnLicuICAqLwotICAgICAgaWYgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSlbMF0gIT0gJy4nCi0JICB8fCAhIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQljb250aW51ZTsKLQotICAgICAgLyogTWFrZSBhIG5ldyB1bmRlZmluZWQgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZSBidXQgd2l0aG91dAotCSB0aGUgbGVhZGluZyBgLicuICAqLwotICAgICAgbmV3c3ltID0gKGFzeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sKSk7Ci0gICAgICAqbmV3c3ltID0gKnN5bTsKLSAgICAgIG5ld25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpKTsKLSAgICAgIHN0cmNweSAobmV3bmFtZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSArIDEpOwotICAgICAgbmV3c3ltLT5uYW1lID0gbmV3bmFtZTsKLQotICAgICAgLyogRGVmaW5lIHRoZSBgLicgc3ltYm9sIHRvIGJlIGluIHRoZSBzdHViIHNlY3Rpb24uICAqLwotICAgICAgc3ltLT5zZWN0aW9uID0gc3R1Yl9zZWM7Ci0gICAgICBzeW0tPnZhbHVlID0gc3R1YmNvdW50ICogUE9XRVJQQ19TVFVCX1NJWkU7Ci0gICAgICAvKiBXZSBzZXQgdGhlIEJTRl9EWU5BTUlDIGZsYWcgaGVyZSBzbyB0aGF0IHdlIGNhbiBjaGVjayBpdCB3aGVuCi0JIHdlIGFyZSBtYW5nbGluZyByZWxvY3MuICBGSVhNRTogVGhpcyBpcyBhIGhhY2suICAqLwotICAgICAgc3ltLT5mbGFncyA9IEJTRl9MT0NBTCB8IEJTRl9EWU5BTUlDOwotCi0gICAgICAvKiBBZGQgdGhpcyBzdHViIHRvIHRoZSBsaW5rZWQgbGlzdC4gICovCi0gICAgICBpdGVtID0gKHN0cnVjdCBwb3dlcnBjX3N0dWIgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcG93ZXJwY19zdHViKSk7Ci0gICAgICBpdGVtLT5zdGFydCA9IHN5bTsKLSAgICAgIGl0ZW0tPnJlbG9jID0gbmV3c3ltOwotICAgICAgaXRlbS0+dG9jX2luZGV4ID0gZ290X2Jhc2UgKyBzdHViY291bnQgKiBQT1dFUlBDX1NUVUJfVE9DX0VOVFJZX1NJWkU7Ci0KLSAgICAgIGl0ZW0tPm5leHQgPSBwb3dlcnBjX3N0dWJzOwotICAgICAgcG93ZXJwY19zdHVicyA9IGl0ZW07Ci0gICAgICAKLSAgICAgICsrc3R1YmNvdW50OwotICAgIH0KLQotICBpZiAoc3R1YmNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBhc3ltYm9sICoqczsKLSAgICAgIHN0cnVjdCBwb3dlcnBjX3N0dWIgKmw7Ci0KLSAgICAgIC8qIEFkZCB0aGUgbmV3IHN5bWJvbHMgd2UganVzdCBjcmVhdGVkIHRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICAgICAgKnN5bWJvbHNfcHRyID0gKGFzeW1ib2wgKiopIHhyZWFsbG9jICgoY2hhciAqKSAqc3ltYm9sc19wdHIsCi0JCQkJCSAgICAoKHN5bWNvdW50ICsgc3R1YmNvdW50KQotCQkJCQkgICAgICogc2l6ZW9mIChhc3ltYm9sKSkpOwotICAgICAgKnN5bWNvdW50X3B0ciArPSBzdHViY291bnQ7Ci0gICAgICBzID0gJigqc3ltYm9sc19wdHIpW3N5bWNvdW50XTsKLSAgICAgIGZvciAobCA9IHBvd2VycGNfc3R1YnM7IGwgIT0gKHN0cnVjdCBwb3dlcnBjX3N0dWIgKikgTlVMTDsgbCA9IGwtPm5leHQpCi0JKnMrKyA9IGwtPnJlbG9jOwotCi0gICAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIC5zdHVicyBzZWN0aW9uIGFuZCBpbmNyZWFzZSB0aGUgc2l6ZSBvZgotCSB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChpbmJmZCwgc3R1Yl9zZWMsCi0JCQkJICBzdHViY291bnQgKiBQT1dFUlBDX1NUVUJfU0laRSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGluYmZkLCBnb3Rfc2VjLAotCQkJCSAgICAgKGdvdF9iYXNlCi0JCQkJICAgICAgKyAoc3R1YmNvdW50Ci0JCQkJCSAqIFBPV0VSUENfU1RVQl9UT0NfRU5UUllfU0laRSkpKSkKLQliZmRfZmF0YWwgKF8oInN0dWIgc2VjdGlvbiBzaXplcyIpKTsKLSAgICB9Ci19Ci0KLS8qIFJlc29sdmUgYWxsIHRoZSBzdHVicyBmb3IgUG93ZXJQQyBOZXRXYXJlLiAgV2UgZmlsbCBpbiB0aGUgY29udGVudHMKLSAgIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiwgYW5kIGNyZWF0ZSBuZXcgcmVsb2NzIGluIHRoZSBUT0MuICAqLwotCi1zdGF0aWMgdm9pZAotcG93ZXJwY19yZXNvbHZlX3N0dWJzIChpbmJmZCwgb3V0YmZkKQotICAgICBiZmQgKmluYmZkOwotICAgICBiZmQgKm91dGJmZDsKLXsKLSAgYmZkX2J5dGUgYnVmW1BPV0VSUENfU1RVQl9TSVpFXTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBzdHViY291bnQ7Ci0gIGFyZWxlbnQgKipyZWxvY3M7Ci0gIGFzZWN0aW9uICpnb3Rfc2VjOwotICBhcmVsZW50ICoqcjsKLSAgc3RydWN0IHBvd2VycGNfc3R1YiAqbDsKLQotICBpZiAocG93ZXJwY19zdHVicyA9PSAoc3RydWN0IHBvd2VycGNfc3R1YiAqKSBOVUxMKQotICAgIHJldHVybjsKLQotICBmb3IgKGkgPSAwOyBpIDwgUE9XRVJQQ19TVFVCX0lOU05fQ09VTlQ7IGkrKykKLSAgICBiZmRfcHV0XzMyIChvdXRiZmQsIChiZmRfdm1hKSBwb3dlcnBjX3N0dWJfaW5zbnNbaV0sIGJ1ZiArIGkgKiA0KTsKLQotICBnb3Rfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGluYmZkLCAiLmdvdCIpOwotICBhc3NlcnQgKGdvdF9zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpOwotICBhc3NlcnQgKGdvdF9zZWMtPm91dHB1dF9zZWN0aW9uLT5vcmVsb2NhdGlvbiA9PSAoYXJlbGVudCAqKikgTlVMTCk7Ci0KLSAgc3R1YmNvdW50ID0gMDsKLSAgZm9yIChsID0gcG93ZXJwY19zdHViczsgbCAhPSAoc3RydWN0IHBvd2VycGNfc3R1YiAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICArK3N0dWJjb3VudDsKLSAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHN0dWJjb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0KLSAgciA9IHJlbG9jczsKLSAgZm9yIChsID0gcG93ZXJwY19zdHViczsgbCAhPSAoc3RydWN0IHBvd2VycGNfc3R1YiAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICpyZWxvYzsKLQotICAgICAgLyogQWRqdXN0IHRoZSBmaXJzdCBpbnN0cnVjdGlvbiB0byB1c2UgdGhlIHJpZ2h0IFRPQyBpbmRleC4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRiZmQsIChiZmRfdm1hKSBwb3dlcnBjX3N0dWJfaW5zbnNbMF0gKyBsLT50b2NfaW5kZXgsIGJ1Zik7Ci0KLSAgICAgIC8qIFdyaXRlIHRoaXMgc3R1YiBvdXQuICAqLwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsCi0JCQkJICAgICAgYmZkX2dldF9zZWN0aW9uIChsLT5zdGFydCksCi0JCQkJICAgICAgYnVmLAotCQkJCSAgICAgIGwtPnN0YXJ0LT52YWx1ZSwKLQkJCQkgICAgICBQT1dFUlBDX1NUVUJfU0laRSkpCi0JYmZkX2ZhdGFsIChfKCJ3cml0aW5nIHN0dWIiKSk7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIG5ldyByZWxvYyBmb3IgdGhlIFRPQyBlbnRyeS4gICovCi0gICAgICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICAgICAgcmVsb2MtPnN5bV9wdHJfcHRyID0gJmwtPnJlbG9jOwotICAgICAgcmVsb2MtPmFkZHJlc3MgPSBsLT50b2NfaW5kZXggKyBnb3Rfc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmVsb2MtPmFkZGVuZCA9IDA7Ci0gICAgICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGluYmZkLCBCRkRfUkVMT0NfMzIpOwotCQkJCSAgICAgIAotICAgICAgKnIrKyA9IHJlbG9jOwotICAgIH0KLQotICBiZmRfc2V0X3JlbG9jIChvdXRiZmQsIGdvdF9zZWMtPm91dHB1dF9zZWN0aW9uLCByZWxvY3MsIHN0dWJjb3VudCk7Ci19Ci0KLS8qIEFkanVzdCByZWxvY2F0aW9uIGVudHJpZXMgZm9yIFBvd2VyUEMgTmV0V2FyZS4gIFdlIGRvIG5vdCBvdXRwdXQKLSAgIFRPQyByZWxvY2F0aW9ucy4gIFRoZSBvYmplY3QgY29kZSBhbHJlYWR5IGNvbnRhaW5zIHRoZSBvZmZzZXQgZnJvbQotICAgdGhlIFRPQyBwb2ludGVyLiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgVE9DIHJlZ2lzdGVyLAotICAgcjIsIHdpbGwgYmUgc2V0IHRvIHRoZSBjb3JyZWN0IFRPQyB2YWx1ZSwgc28gdGhlcmUgaXMgbm8gbmVlZCBmb3IKLSAgIGFueSBmdXJ0aGVyIHJlbG9jLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotcG93ZXJwY19tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsIGNvbnRlbnRzLAotCQkgICAgICAgY29udGVudHNfc2l6ZSkKLSAgICAgYmZkICpvdXRiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnNlYzsKLSAgICAgcmVnaXN0ZXIgYXJlbGVudCAqKipyZWxvY3NfcHRyOwotICAgICBsb25nICpyZWxvY19jb3VudF9wdHI7Ci0gICAgIGNoYXIgKmNvbnRlbnRzOwotICAgICBiZmRfc2l6ZV90eXBlIGNvbnRlbnRzX3NpemU7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKnRvY19ob3d0bzsKLSAgbG9uZyByZWxvY19jb3VudDsKLSAgcmVnaXN0ZXIgYXJlbGVudCAqKnJlbG9jczsKLSAgcmVnaXN0ZXIgbG9uZyBpOwotCi0gIHRvY19ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoaW5zZWMtPm93bmVyLCBCRkRfUkVMT0NfUFBDX1RPQzE2KTsKLSAgaWYgKHRvY19ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIGFib3J0ICgpOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIC5nb3Qgc2VjdGlvbiwgY2xlYXIgb3V0IGFsbCB0aGUgY29udGVudHMgYmV5b25kCi0gICAgIHRoZSBpbml0aWFsIHNpemUuICBXZSBtdXN0IGRvIHRoaXMgaGVyZSBiZWNhdXNlIGNvcHlfc2VjdGlvbnMgaXMKLSAgICAgZ29pbmcgdG8gd3JpdGUgb3V0IHdoYXRldmVyIHdlIHJldHVybiBpbiB0aGUgY29udGVudHMgZmllbGQuICAqLwotICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5zZWMtPm93bmVyLCBpbnNlYyksICIuZ290IikgPT0gMCkKLSAgICBtZW1zZXQgKGNvbnRlbnRzICsgcG93ZXJwY19pbml0aWFsX2dvdF9zaXplLCAwLAotCSAgICAoc2l6ZV90KSAoYmZkX2dldF9zZWN0aW9uX3NpemVfYWZ0ZXJfcmVsb2MgKGluc2VjKQotCQkgICAgICAtIHBvd2VycGNfaW5pdGlhbF9nb3Rfc2l6ZSkpOwotCi0gIHJlbG9jX2NvdW50ID0gKnJlbG9jX2NvdW50X3B0cjsKLSAgcmVsb2NzID0gKnJlbG9jc19wdHI7Ci0gIGZvciAoaSA9IDA7IGkgPCByZWxvY19jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnJlbDsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIGJmZF92bWEgc3ltX3ZhbHVlOwotCi0gICAgICByZWwgPSAqcmVsb2NzKys7Ci0gICAgICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotICAgICAgLyogQ29udmVydCBhbnkgcmVsb2NzIGFnYWluc3QgdGhlIC5ic3Mgc2VjdGlvbiBpbnRvIHJlbG9jcwotICAgICAgICAgYWdhaW5zdCB0aGUgLmRhdGEgc2VjdGlvbi4gICovCi0gICAgICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0YmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpLAotCQkgIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSkgPT0gMCkKLQl7Ci0JICBhc2VjdGlvbiAqZGF0YXNlYzsKLQotCSAgZGF0YXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRiZmQsCi0JCQkJCSAgICAgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0JICBpZiAoZGF0YXNlYyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgcmVsLT5hZGRlbmQgKz0gKGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dGJmZCwKLQkJCQkJCSAgIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkJCSAgICAgICsgc3ltLT52YWx1ZSk7Ci0JICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGRhdGFzZWMtPnN5bWJvbF9wdHJfcHRyOwotCSAgICAgIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXZSBtdXN0IGJlIGFibGUgdG8gcmVzb2x2ZSBhbGwgUEMgcmVsYXRpdmUgcmVsb2NzIGF0IHRoaXMKLQkgcG9pbnQuICBJZiB3ZSBnZXQgYSBicmFuY2ggdG8gYW4gdW5kZWZpbmVkIHN5bWJvbCB3ZSBidWlsZCBhCi0JIHN0dWIsIHNpbmNlIE5ldFdhcmUgd2lsbCByZXNvbHZlIHVuZGVmaW5lZCBzeW1ib2xzIGludG8gYQotCSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gZGVzY3JpcHRvci4gICovCi0gICAgICBpZiAocmVsLT5ob3d0by0+cGNfcmVsYXRpdmUpCi0JewotCSAgLyogVGhpcyBjaGVjayBmb3Igd2hldGhlciBhIHN5bWJvbCBpcyBpbiB0aGUgc2FtZSBzZWN0aW9uIGFzCi0JICAgICB0aGUgcmVsb2Mgd2lsbCBiZSB3cm9uZyBpZiB0aGVyZSBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jCi0JICAgICBiZXR3ZWVuIHR3byBzZWN0aW9ucyBib3RoIG9mIHdoaWNoIHdlcmUgcGxhY2VkIGluIHRoZQotCSAgICAgc2FtZSBvdXRwdXQgc2VjdGlvbi4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uICAqLwotCSAgaWYgKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSAhPSBpbnNlYy0+b3V0cHV0X3NlY3Rpb24pCi0JICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVucmVzb2x2ZWQgUEMgcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCAlc1xuIiksCi0JCSAgICAgcHJvZ3JhbV9uYW1lLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgdmFsOwotCi0JICAgICAgYXNzZXJ0IChyZWwtPmhvd3RvLT5zaXplID09IDIgJiYgcmVsLT5ob3d0by0+cGNyZWxfb2Zmc2V0KTsKLQkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChvdXRiZmQsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyk7Ci0JICAgICAgdmFsID0gKCh2YWwgJn4gcmVsLT5ob3d0by0+ZHN0X21hc2spCi0JCSAgICAgfCAoKCh2YWwgJiByZWwtPmhvd3RvLT5zcmNfbWFzaykKLQkJCSArIChzeW0tPnZhbHVlIC0gcmVsLT5hZGRyZXNzKQotCQkJICsgcmVsLT5hZGRlbmQpCi0JCQkmIHJlbC0+aG93dG8tPmRzdF9tYXNrKSk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0YmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyk7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jIGlzIGFnYWluc3QgYW4gc3R1YmJlZCBzeW1ib2wgYW5kIHRoZQotCQkgbmV4dCBpbnN0cnVjdGlvbiBpcwotCQkgICAgIGNyb3IgMzEsMzEsMzEKLQkJIHRoZW4gd2UgcmVwbGFjZSB0aGUgbmV4dCBpbnN0cnVjdGlvbiB3aXRoCi0JCSAgICAgbHd6ICByMiwyMChyMSkKLQkJIFRoaXMgcmVsb2FkcyB0aGUgVE9DIHBvaW50ZXIgYWZ0ZXIgYSBzdHViIGNhbGwuICAqLwotCSAgICAgIGlmIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pWzBdID09ICcuJwotCQkgICYmIChzeW0tPmZsYWdzICYgQlNGX0RZTkFNSUMpICE9IDAKLQkJICAmJiAoYmZkX2dldF8zMiAob3V0YmZkLAotCQkJCSAgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgcmVsLT5hZGRyZXNzICsgNCkKLQkJICAgICAgPT0gMHg0ZmZmZmI4MikpIC8qIGNyb3IgMzEsMzEsMzEgKi8KLQkJYmZkX3B1dF8zMiAob3V0YmZkLCAoYmZkX3ZtYSkgMHg4MDQxMDAxNCwgLyogbHd6IHIyLDIwKHIxKSAqLwotCQkJICAgIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyArIDQpOwotCi0JICAgICAgLS0qcmVsb2NfY291bnRfcHRyOwotCSAgICAgIC0tcmVsb2NzOwotCSAgICAgIG1lbW1vdmUgKHJlbG9jcywgcmVsb2NzICsgMSwKLQkJICAgICAgIChzaXplX3QpICgocmVsb2NfY291bnQgLSAxKSAqIHNpemVvZiAoYXJlbGVudCAqKSkpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXaGVuIGNvbnNpZGVyaW5nIGEgVE9DIHJlbG9jLCB3ZSBkbyBub3Qgd2FudCB0byBpbmNsdWRlIHRoZQotCSBzeW1ib2wgdmFsdWUuICBUaGUgc3ltYm9sIHdpbGwgYmUgc3RhcnQgb2YgdGhlIFRPQyBzZWN0aW9uCi0JICh3aGljaCBpcyBuYW1lZCAuZ290KS4gIFdlIGRvIHdhbnQgdG8gaW5jbHVkZSB0aGUgYWRkZW5kLiAgKi8KLSAgICAgIGlmIChyZWwtPmhvd3RvID09IHRvY19ob3d0bykKLQlzeW1fdmFsdWUgPSAwOwotICAgICAgZWxzZQotCXN5bV92YWx1ZSA9IHN5bS0+dmFsdWU7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzeW1ib2wgd2l0aCBhIHZhbHVlLCBvcgotCSB0aGVyZSBpcyBhIHJlbG9jIGFkZGVuZCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGFkZGVuZCBpbiB0aGUKLQkgb2JqZWN0IGZpbGUuICAqLwotICAgICAgaWYgKHN5bV92YWx1ZSArIHJlbC0+YWRkZW5kICE9IDApCi0JewotCSAgYmZkX3ZtYSB2YWw7Ci0KLQkgIHN3aXRjaCAocmVsLT5ob3d0by0+c2l6ZSkKLQkgICAgewotCSAgICBjYXNlIDE6Ci0JICAgICAgdmFsID0gYmZkX2dldF8xNiAob3V0YmZkLAotCQkJCShiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyk7Ci0JICAgICAgdmFsID0gKCh2YWwgJn4gcmVsLT5ob3d0by0+ZHN0X21hc2spCi0JCSAgICAgfCAoKCh2YWwgJiByZWwtPmhvd3RvLT5zcmNfbWFzaykKLQkJCSArIHN5bV92YWx1ZQotCQkJICsgcmVsLT5hZGRlbmQpCi0JCQkmIHJlbC0+aG93dG8tPmRzdF9tYXNrKSk7Ci0JICAgICAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgdmFsIDwgLSAweDgwMDAKLQkJICB8fCAoYmZkX3NpZ25lZF92bWEpIHZhbCA+PSAweDgwMDApCi0JCWZwcmludGYgKHN0ZGVyciwKLQkJCSBfKCIlczogb3ZlcmZsb3cgd2hlbiBhZGp1c3RpbmcgcmVsb2NhdGlvbiBhZ2FpbnN0ICVzXG4iKSwKLQkJCSBwcm9ncmFtX25hbWUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpOwotCSAgICAgIGJmZF9wdXRfMTYgKG91dGJmZCwgdmFsLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyByZWwtPmFkZHJlc3MpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMjoKLQkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChvdXRiZmQsCi0JCQkJKGJmZF9ieXRlICopIGNvbnRlbnRzICsgcmVsLT5hZGRyZXNzKTsKLQkgICAgICB2YWwgPSAoKHZhbCAmfiByZWwtPmhvd3RvLT5kc3RfbWFzaykKLQkJICAgICB8ICgoKHZhbCAmIHJlbC0+aG93dG8tPnNyY19tYXNrKQotCQkJICsgc3ltX3ZhbHVlCi0JCQkgKyByZWwtPmFkZGVuZCkKLQkJCSYgcmVsLT5ob3d0by0+ZHN0X21hc2spKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRiZmQsIHZhbCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgcmVsLT5hZGRyZXNzKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0KLQkgIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQkgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltKS0+c3ltYm9sX3B0cl9wdHI7Ci0JICByZWwtPmFkZGVuZCA9IDA7Ci0JfQotCi0gICAgICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGluY29ycG9yYXRlZCB0aGUgYWRkZW5kLCByZW1vdmUgYW55IFRPQwotCSByZWxvY3MuICAqLwotICAgICAgaWYgKHJlbC0+aG93dG8gPT0gdG9jX2hvd3RvKQotCXsKLQkgIC0tKnJlbG9jX2NvdW50X3B0cjsKLQkgIC0tcmVsb2NzOwotCSAgbWVtbW92ZSAocmVsb2NzLCByZWxvY3MgKyAxLAotCQkgICAoc2l6ZV90KSAoKHJlbG9jX2NvdW50IC0gaSkgKiBzaXplb2YgKGFyZWxlbnQgKikpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgcmVsLT5hZGRyZXNzICs9IGluc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgIH0KLX0KLQotI2VuZGlmIC8qIE5MTUNPTlZfUE9XRVJQQyAqLwotDAotLyogTmFtZSBvZiBsaW5rZXIuICAqLwotI2lmbmRlZiBMRF9OQU1FCi0jZGVmaW5lIExEX05BTUUgImxkIgotI2VuZGlmCi0KLS8qIFRlbXBvcmFyeSBmaWxlIG5hbWUgYmFzZS4gICovCi1zdGF0aWMgY2hhciAqdGVtcF9maWxlbmFtZTsKLQotLyogVGhlIHVzZXIgaGFzIHNwZWNpZmllZCBzZXZlcmFsIGlucHV0IGZpbGVzLiAgSW52b2tlIHRoZSBsaW5rZXIgdG8KLSAgIGxpbmsgdGhlbSBhbGwgdG9nZXRoZXIsIGFuZCBjb252ZXJ0IGFuZCBkZWxldGUgdGhlIHJlc3VsdGluZyBvdXRwdXQKLSAgIGZpbGUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1saW5rX2lucHV0cyAoaW5wdXRzLCBsZCkKLSAgICAgc3RydWN0IHN0cmluZ19saXN0ICppbnB1dHM7Ci0gICAgIGNoYXIgKmxkOwotewotICBzaXplX3QgYzsKLSAgc3RydWN0IHN0cmluZ19saXN0ICpxOwotICBjaGFyICoqYXJndjsKLSAgc2l6ZV90IGk7Ci0gIGludCBwaWQ7Ci0gIGludCBzdGF0dXM7Ci0gIGNoYXIgKmVycmZtdDsKLSAgY2hhciAqZXJyYXJnOwotCi0gIGMgPSAwOwotICBmb3IgKHEgPSBpbnB1dHM7IHEgIT0gTlVMTDsgcSA9IHEtPm5leHQpCi0gICAgKytjOwotCi0gIGFyZ3YgPSAoY2hhciAqKikgYWxsb2NhICgoYyArIDUpICogc2l6ZW9mKGNoYXIgKikpOwotCi0jaWZuZGVmIF9fTVNET1NfXwotICBpZiAobGQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpwOwotCi0gICAgICAvKiBGaW5kIHRoZSBsaW5rZXIgdG8gaW52b2tlIGJhc2VkIG9uIGhvdyBubG1jb252IHdhcyBydW4uICAqLwotICAgICAgcCA9IHByb2dyYW1fbmFtZSArIHN0cmxlbiAocHJvZ3JhbV9uYW1lKTsKLSAgICAgIHdoaWxlIChwICE9IHByb2dyYW1fbmFtZSkKLQl7Ci0JICBpZiAocFstMV0gPT0gJy8nKQotCSAgICB7Ci0JICAgICAgbGQgPSAoY2hhciAqKSB4bWFsbG9jIChwIC0gcHJvZ3JhbV9uYW1lICsgc3RybGVuIChMRF9OQU1FKSArIDEpOwotCSAgICAgIG1lbWNweSAobGQsIHByb2dyYW1fbmFtZSwgcCAtIHByb2dyYW1fbmFtZSk7Ci0JICAgICAgc3RyY3B5IChsZCArIChwIC0gcHJvZ3JhbV9uYW1lKSwgTERfTkFNRSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC0tcDsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKGxkID09IE5VTEwpCi0gICAgbGQgPSAoY2hhciAqKSBMRF9OQU1FOwotCi0gIHRlbXBfZmlsZW5hbWUgPSBjaG9vc2VfdGVtcF9iYXNlICgpOwotCi0gIHVubGlua19vbl9leGl0ID0geG1hbGxvYyAoc3RybGVuICh0ZW1wX2ZpbGVuYW1lKSArIDMpOwotICBzcHJpbnRmICh1bmxpbmtfb25fZXhpdCwgIiVzLk8iLCB0ZW1wX2ZpbGVuYW1lKTsKLQotICBhcmd2WzBdID0gbGQ7Ci0gIGFyZ3ZbMV0gPSAoY2hhciAqKSAiLVVyIjsKLSAgYXJndlsyXSA9IChjaGFyICopICItbyI7Ci0gIGFyZ3ZbM10gPSB1bmxpbmtfb25fZXhpdDsKLSAgaSA9IDQ7Ci0gIGZvciAocSA9IGlucHV0czsgcSAhPSBOVUxMOyBxID0gcS0+bmV4dCwgaSsrKQotICAgIGFyZ3ZbaV0gPSBxLT5zdHJpbmc7Ci0gIGFyZ3ZbaV0gPSBOVUxMOwotCi0gIGlmIChkZWJ1ZykKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBhcmd2W2ldICE9IE5VTEw7IGkrKykKLQlmcHJpbnRmIChzdGRlcnIsICIgJXMiLCBhcmd2W2ldKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotCi0gIHBpZCA9IHBleGVjdXRlIChsZCwgYXJndiwgcHJvZ3JhbV9uYW1lLCAoY2hhciAqKSBOVUxMLCAmZXJyZm10LCAmZXJyYXJnLAotCQkgIFBFWEVDVVRFX1NFQVJDSCB8IFBFWEVDVVRFX09ORSk7Ci0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZXhlY3V0aW9uIG9mICVzIGZhaWxlZDogIiksIHByb2dyYW1fbmFtZSwgbGQpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBlcnJmbXQsIGVycmFyZyk7Ci0gICAgICB1bmxpbmsgKHVubGlua19vbl9leGl0KTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAocHdhaXQgKHBpZCwgJnN0YXR1cywgMCkgPCAwKQotICAgIHsKLSAgICAgIHBlcnJvciAoInB3YWl0Iik7Ci0gICAgICB1bmxpbmsgKHVubGlua19vbl9leGl0KTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogRXhlY3V0aW9uIG9mICVzIGZhaWxlZFxuIiksIHByb2dyYW1fbmFtZSwgbGQpOwotICAgICAgdW5saW5rICh1bmxpbmtfb25fZXhpdCk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHVubGlua19vbl9leGl0OwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbmxtY29udi5oIGIvYmludXRpbHMvbmxtY29udi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTJhNTU3Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25sbWNvbnYuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qIG5sbWNvbnYuaCAtLSBoZWFkZXIgZmlsZSBmb3IgTkxNIGNvbnZlcnNpb24gcHJvZ3JhbQotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBiZmQuaCwgbmxtL2NvbW1vbi5oIGFuZCBubG0vaW50ZXJuYWwuaCBtdXN0IGJlIGluY2x1ZGVkIGJlZm9yZSB0aGlzCi0gICBmaWxlLiAgKi8KLQotLyogQSBsaW5rZWQgbGlzdCBvZiBzdHJpbmdzLiAgKi8KLQotc3RydWN0IHN0cmluZ19saXN0Ci17Ci0gIHN0cnVjdCBzdHJpbmdfbGlzdCAqbmV4dDsKLSAgY2hhciAqc3RyaW5nOwotfTsKLQotLyogVGhlIE5MTSBoZWFkZXIgcGFyc2VyIGluIG5sbWhlYWRlci55IHN0b3JlcyBpbmZvcm1hdGlvbiBpbiB0aGUKLSAgIGZvbGxvd2luZyB2YXJpYWJsZXMuICAqLwotCi1leHRlcm4gTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqZml4ZWRfaGRyOwotZXh0ZXJuIE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIgKnZhcl9oZHI7Ci1leHRlcm4gTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyICp2ZXJzaW9uX2hkcjsKLWV4dGVybiBObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlciAqY29weXJpZ2h0X2hkcjsKLWV4dGVybiBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyICpleHRlbmRlZF9oZHI7Ci0KLS8qIFByb2NlZHVyZSBuYW1lZCBieSBDSEVDSy4gICovCi1leHRlcm4gY2hhciAqY2hlY2tfcHJvY2VkdXJlOwotLyogRmlsZSBuYW1lZCBieSBDVVNUT00uICAqLwotZXh0ZXJuIGNoYXIgKmN1c3RvbV9maWxlOwotLyogV2hldGhlciB0byBnZW5lcmF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKERFQlVHKS4gICovCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19pbmZvOwotLyogUHJvY2VkdXJlIG5hbWVkIGJ5IEVYSVQuICAqLwotZXh0ZXJuIGNoYXIgKmV4aXRfcHJvY2VkdXJlOwotLyogRXhwb3J0ZWQgc3ltYm9scyAoRVhQT1JUKS4gICovCi1leHRlcm4gc3RydWN0IHN0cmluZ19saXN0ICpleHBvcnRfc3ltYm9sczsKLS8qIExpc3Qgb2YgZmlsZXMgZnJvbSBJTlBVVC4gICovCi1leHRlcm4gc3RydWN0IHN0cmluZ19saXN0ICppbnB1dF9maWxlczsKLS8qIE1hcCBmaWxlIG5hbWUgKE1BUCwgRlVMTE1BUCkuICAqLwotZXh0ZXJuIGNoYXIgKm1hcF9maWxlOwotLyogV2hldGhlciBhIGZ1bGwgbWFwIGhhcyBiZWVuIHJlcXVlc3RlZCAoRlVMTE1BUCkuICAqLwotZXh0ZXJuIGJvb2xlYW4gZnVsbF9tYXA7Ci0vKiBGaWxlIG5hbWVkIGJ5IEhFTFAuICAqLwotZXh0ZXJuIGNoYXIgKmhlbHBfZmlsZTsKLS8qIEltcG9ydGVkIHN5bWJvbHMgKElNUE9SVCkuICAqLwotZXh0ZXJuIHN0cnVjdCBzdHJpbmdfbGlzdCAqaW1wb3J0X3N5bWJvbHM7Ci0vKiBGaWxlIG5hbWVkIGJ5IE1FU1NBR0VTLiAgKi8KLWV4dGVybiBjaGFyICptZXNzYWdlX2ZpbGU7Ci0vKiBBdXRvbG9hZCBtb2R1bGUgbGlzdCAoTU9EVUxFKS4gICovCi1leHRlcm4gc3RydWN0IHN0cmluZ19saXN0ICptb2R1bGVzOwotLyogRmlsZSBuYW1lZCBieSBPVVRQVVQuICAqLwotZXh0ZXJuIGNoYXIgKm91dHB1dF9maWxlOwotLyogRmlsZSBuYW1lZCBieSBTSEFSRUxJQi4gICovCi1leHRlcm4gY2hhciAqc2hhcmVsaWJfZmlsZTsKLS8qIFN0YXJ0IHByb2NlZHVyZSBuYW1lIChTVEFSVCkuICAqLwotZXh0ZXJuIGNoYXIgKnN0YXJ0X3Byb2NlZHVyZTsKLS8qIFZFUkJPU0UuICAqLwotZXh0ZXJuIGJvb2xlYW4gdmVyYm9zZTsKLS8qIFJQQyBkZXNjcmlwdGlvbiBmaWxlIChYRENEQVRBKS4gICovCi1leHRlcm4gY2hhciAqcnBjX2ZpbGU7Ci0KLS8qIFRoZSBudW1iZXIgb2Ygc2VyaW91cyBwYXJzZSBlcnJvcnMuICAqLwotZXh0ZXJuIGludCBwYXJzZV9lcnJvcnM7Ci0KLS8qIFRoZSBwYXJzZXIuICAqLwotZXh0ZXJuIGludCB5eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVGVsbCB0aGUgbGV4ZXIgd2hhdCBmaWxlIHRvIHJlYWQuICAqLwotZXh0ZXJuIGJvb2xlYW4gbmxtbGV4X2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CmRpZmYgLS1naXQgYS9iaW51dGlscy9ubG1oZWFkZXIueSBiL2JpbnV0aWxzL25sbWhlYWRlci55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjFlMjJhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25sbWhlYWRlci55CisrKyAvZGV2L251bGwKQEAgLTEsOTc4ICswLDAgQEAKLSV7LyogbmxtaGVhZGVyLnkgLSBwYXJzZSBOTE0gaGVhZGVyIHNwZWNpZmljYXRpb24ga2V5d29yZHMuCi0gICAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBiaXNvbiBmaWxlIHBhcnNlcyB0aGUgY29tbWFuZHMgcmVjb2duaXplZCBieSB0aGUgTmV0V2FyZSBOTE0KLSAgIGxpbmtlciwgZXhjZXB0IGZvciBsaXN0cyBvZiBvYmplY3QgZmlsZXMuICBJdCBzdG9yZXMgdGhlCi0gICBpbmZvcm1hdGlvbiBpbiBnbG9iYWwgdmFyaWFibGVzLgotCi0gICBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBkZXNjcmlwdGlvbiBpbiB0aGUgTmV0V2FyZSBUb29sCi0gICBNYWtlciBTcGVjaWZpY2F0aW9uIG1hbnVhbCwgZWRpdGlvbiAxLjAuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibmxtL2NvbW1vbi5oIgotI2luY2x1ZGUgIm5sbS9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIm5sbWNvbnYuaCIKLQotLyogSW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSBzdHJ1Y3R1cmVzIHBvaW50ZWQgdG8gYnkgdGhlc2UKLSAgIHZhcmlhYmxlcy4gICovCi0KLU5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKmZpeGVkX2hkcjsKLU5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIgKnZhcl9oZHI7Ci1ObG1fSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXIgKnZlcnNpb25faGRyOwotTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIgKmNvcHlyaWdodF9oZHI7Ci1ObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyICpleHRlbmRlZF9oZHI7Ci0KLS8qIFByb2NlZHVyZSBuYW1lZCBieSBDSEVDSy4gICovCi1jaGFyICpjaGVja19wcm9jZWR1cmU7Ci0vKiBGaWxlIG5hbWVkIGJ5IENVU1RPTS4gICovCi1jaGFyICpjdXN0b21fZmlsZTsKLS8qIFdoZXRoZXIgdG8gZ2VuZXJhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIChERUJVRykuICAqLwotYm9vbGVhbiBkZWJ1Z19pbmZvOwotLyogUHJvY2VkdXJlIG5hbWVkIGJ5IEVYSVQuICAqLwotY2hhciAqZXhpdF9wcm9jZWR1cmU7Ci0vKiBFeHBvcnRlZCBzeW1ib2xzIChFWFBPUlQpLiAgKi8KLXN0cnVjdCBzdHJpbmdfbGlzdCAqZXhwb3J0X3N5bWJvbHM7Ci0vKiBMaXN0IG9mIGZpbGVzIGZyb20gSU5QVVQuICAqLwotc3RydWN0IHN0cmluZ19saXN0ICppbnB1dF9maWxlczsKLS8qIE1hcCBmaWxlIG5hbWUgKE1BUCwgRlVMTE1BUCkuICAqLwotY2hhciAqbWFwX2ZpbGU7Ci0vKiBXaGV0aGVyIGEgZnVsbCBtYXAgaGFzIGJlZW4gcmVxdWVzdGVkIChGVUxMTUFQKS4gICovCi1ib29sZWFuIGZ1bGxfbWFwOwotLyogRmlsZSBuYW1lZCBieSBIRUxQLiAgKi8KLWNoYXIgKmhlbHBfZmlsZTsKLS8qIEltcG9ydGVkIHN5bWJvbHMgKElNUE9SVCkuICAqLwotc3RydWN0IHN0cmluZ19saXN0ICppbXBvcnRfc3ltYm9sczsKLS8qIEZpbGUgbmFtZWQgYnkgTUVTU0FHRVMuICAqLwotY2hhciAqbWVzc2FnZV9maWxlOwotLyogQXV0b2xvYWQgbW9kdWxlIGxpc3QgKE1PRFVMRSkuICAqLwotc3RydWN0IHN0cmluZ19saXN0ICptb2R1bGVzOwotLyogRmlsZSBuYW1lZCBieSBPVVRQVVQuICAqLwotY2hhciAqb3V0cHV0X2ZpbGU7Ci0vKiBGaWxlIG5hbWVkIGJ5IFNIQVJFTElCLiAgKi8KLWNoYXIgKnNoYXJlbGliX2ZpbGU7Ci0vKiBTdGFydCBwcm9jZWR1cmUgbmFtZSAoU1RBUlQpLiAgKi8KLWNoYXIgKnN0YXJ0X3Byb2NlZHVyZTsKLS8qIFZFUkJPU0UuICAqLwotYm9vbGVhbiB2ZXJib3NlOwotLyogUlBDIGRlc2NyaXB0aW9uIGZpbGUgKFhEQ0RBVEEpLiAgKi8KLWNoYXIgKnJwY19maWxlOwotCi0vKiBUaGUgbnVtYmVyIG9mIHNlcmlvdXMgZXJyb3JzIHRoYXQgaGF2ZSBvY2N1cnJlZC4gICovCi1pbnQgcGFyc2VfZXJyb3JzOwotCi0vKiBUaGUgY3VycmVudCBzeW1ib2wgcHJlZml4IHdoZW4gcmVhZGluZyBhIGxpc3Qgb2YgaW1wb3J0IG9yIGV4cG9ydAotICAgc3ltYm9scy4gICovCi1zdGF0aWMgY2hhciAqc3ltYm9sX3ByZWZpeDsKLQotLyogUGFyc2VyIGVycm9yIG1lc3NhZ2UgaGFuZGxlci4gICovCi0jZGVmaW5lIHl5ZXJyb3IobXNnKSBubG1oZWFkZXJfZXJyb3IgKG1zZyk7Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgaW50IHl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIG5sbWxleF9maWxlX3B1c2ggUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1sZXhfZmlsZV9vcGVuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBubG1sZXhfYnVmX2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgbmxtbGV4X2J1Zl9hZGQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgbG9uZyBubG1sZXhfZ2V0X251bWJlciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIG5sbWhlYWRlcl9pZGVudGlmeSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBubG1oZWFkZXJfd2FybiBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgbmxtaGVhZGVyX2Vycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBzdHJpbmdfbGlzdCAqIHN0cmluZ19saXN0X2NvbnMgUEFSQU1TICgoY2hhciAqLAotCQkJCQkJICAgICAgc3RydWN0IHN0cmluZ19saXN0ICopKTsKLXN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKiBzdHJpbmdfbGlzdF9hcHBlbmQgUEFSQU1TICgoc3RydWN0IHN0cmluZ19saXN0ICosCi0JCQkJCQkJc3RydWN0IHN0cmluZ19saXN0ICopKTsKLXN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKiBzdHJpbmdfbGlzdF9hcHBlbmQxIFBBUkFNUyAoKHN0cnVjdCBzdHJpbmdfbGlzdCAqLAotCQkJCQkJCSBjaGFyICopKTsKLXN0YXRpYyBjaGFyICp4c3RyZHVwIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0lfQotCi0ldW5pb24KLXsKLSAgY2hhciAqc3RyaW5nOwotICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmxpc3Q7Ci19OwotCi0vKiBUaGUgcmVzZXJ2ZWQgd29yZHMuICAqLwotCi0ldG9rZW4gQ0hFQ0sgQ09ERVNUQVJUIENPUFlSSUdIVCBDVVNUT00gREFURSBERUJVRyBERVNDUklQVElPTiBFWElUCi0ldG9rZW4gRVhQT1JUIEZMQUdfT04gRkxBR19PRkYgRlVMTE1BUCBIRUxQIElNUE9SVCBJTlBVVCBNQVAgTUVTU0FHRVMKLSV0b2tlbiBNT0RVTEUgTVVMVElQTEUgT1NfRE9NQUlOIE9VVFBVVCBQU0VVRE9QUkVFTVBUSU9OIFJFRU5UUkFOVAotJXRva2VuIFNDUkVFTk5BTUUgU0hBUkVMSUIgU1RBQ0sgU1RBUlQgU1lOQ0hST05JWkUKLSV0b2tlbiBUSFJFQUROQU1FIFRZUEUgVkVSQk9TRSBWRVJTSU9OSyBYRENEQVRBCi0KLS8qIEFyZ3VtZW50cy4gICovCi0KLSV0b2tlbiA8c3RyaW5nPiBTVFJJTkcKLSV0b2tlbiA8c3RyaW5nPiBRVU9URURfU1RSSU5HCi0KLS8qIFR5cGVkIG5vbi10ZXJtaW5hbHMuICAqLwotJXR5cGUgPGxpc3Q+IHN5bWJvbF9saXN0X29wdCBzeW1ib2xfbGlzdCBzdHJpbmdfbGlzdAotJXR5cGUgPHN0cmluZz4gc3ltYm9sCi0KLSUlCi0KLS8qIEtleXdvcmRzIG11c3Qgc3RhcnQgaW4gdGhlIGxlZnRtb3N0IGNvbHVtbiBvZiB0aGUgZmlsZS4gIEFyZ3VtZW50cwotICAgbWF5IGFwcGVhciBhbnl3aGVyZSBlbHNlLiAgVGhlIGxleGVyIHVzZXMgdGhpcyB0byBkZXRlcm1pbmUgd2hhdAotICAgdG9rZW4gdG8gcmV0dXJuLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGl0IGhlcmUuICAqLwotCi0vKiBUaGUgZW50aXJlIGZpbGUgaXMganVzdCBhIGxpc3Qgb2YgY29tbWFuZHMuICAqLwotCi1maWxlOgkKLQkgIGNvbW1hbmRzCi0JOwotCi0vKiBBIHBvc3NpYmx5IGVtcHR5IGxpc3Qgb2YgY29tbWFuZHMuICAqLwotCi1jb21tYW5kczoKLQkgIC8qIE1heSBiZSBlbXB0eS4gICovCi0JfCBjb21tYW5kIGNvbW1hbmRzCi0JOwotCi0vKiBBIHNpbmdsZSBjb21tYW5kLiAgVGhlcmUgaXMgd2hlcmUgbW9zdCBvZiB0aGUgd29yayB0YWtlcyBwbGFjZS4gICovCi0KLWNvbW1hbmQ6Ci0JICBDSEVDSyBTVFJJTkcKLQkgIHsKLQkgICAgY2hlY2tfcHJvY2VkdXJlID0gJDI7Ci0JICB9Ci0JfCBDT0RFU1RBUlQgU1RSSU5HCi0JICB7Ci0JICAgIG5sbWhlYWRlcl93YXJuIChfKCJDT0RFU1RBUlQgaXMgbm90IGltcGxlbWVudGVkOyBzb3JyeSIpLCAtMSk7Ci0JICAgIGZyZWUgKCQyKTsKLQkgIH0KLQl8IENPUFlSSUdIVCBRVU9URURfU1RSSU5HCi0JICB7Ci0JICAgIGludCBsZW47Ci0KLQkgICAgc3RybmNweSAoY29weXJpZ2h0X2hkci0+c3RhbXAsICJDb1B5UmlHaFQ9IiwgMTApOwotCSAgICBsZW4gPSBzdHJsZW4gKCQyKTsKLQkgICAgaWYgKGxlbiA+PSBOTE1fTUFYX0NPUFlSSUdIVF9NRVNTQUdFX0xFTkdUSCkKLQkgICAgICB7Ci0JCW5sbWhlYWRlcl93YXJuIChfKCJjb3B5cmlnaHQgc3RyaW5nIGlzIHRvbyBsb25nIiksCi0JCQkJTkxNX01BWF9DT1BZUklHSFRfTUVTU0FHRV9MRU5HVEggLSAxKTsKLQkJbGVuID0gTkxNX01BWF9DT1BZUklHSFRfTUVTU0FHRV9MRU5HVEggLSAxOwotCSAgICAgIH0KLQkgICAgY29weXJpZ2h0X2hkci0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aCA9IGxlbjsKLQkgICAgc3RybmNweSAoY29weXJpZ2h0X2hkci0+Y29weXJpZ2h0TWVzc2FnZSwgJDIsIGxlbik7Ci0JICAgIGNvcHlyaWdodF9oZHItPmNvcHlyaWdodE1lc3NhZ2VbbGVuXSA9ICdcMCc7Ci0JICAgIGZyZWUgKCQyKTsKLQkgIH0KLQl8IENVU1RPTSBTVFJJTkcKLQkgIHsKLQkgICAgY3VzdG9tX2ZpbGUgPSAkMjsKLQkgIH0KLQl8IERBVEUgU1RSSU5HIFNUUklORyBTVFJJTkcKLQkgIHsKLQkgICAgLyogV2UgZG9uJ3Qgc2V0IHRoZSB2ZXJzaW9uIHN0YW1wIGhlcmUsIGJlY2F1c2Ugd2UgdXNlIHRoZQotCSAgICAgICB2ZXJzaW9uIHN0YW1wIHRvIGRldGVjdCB3aGV0aGVyIHRoZSByZXF1aXJlZCBWRVJTSU9OCi0JICAgICAgIGtleXdvcmQgd2FzIGdpdmVuLiAgKi8KLQkgICAgdmVyc2lvbl9oZHItPm1vbnRoID0gbmxtbGV4X2dldF9udW1iZXIgKCQyKTsKLQkgICAgdmVyc2lvbl9oZHItPmRheSA9IG5sbWxleF9nZXRfbnVtYmVyICgkMyk7Ci0JICAgIHZlcnNpb25faGRyLT55ZWFyID0gbmxtbGV4X2dldF9udW1iZXIgKCQ0KTsKLQkgICAgZnJlZSAoJDIpOwotCSAgICBmcmVlICgkMyk7Ci0JICAgIGZyZWUgKCQ0KTsKLQkgICAgaWYgKHZlcnNpb25faGRyLT5tb250aCA8IDEgfHwgdmVyc2lvbl9oZHItPm1vbnRoID4gMTIpCi0JICAgICAgbmxtaGVhZGVyX3dhcm4gKF8oImlsbGVnYWwgbW9udGgiKSwgLTEpOwotCSAgICBpZiAodmVyc2lvbl9oZHItPmRheSA8IDEgfHwgdmVyc2lvbl9oZHItPmRheSA+IDMxKQotCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpbGxlZ2FsIGRheSIpLCAtMSk7Ci0JICAgIGlmICh2ZXJzaW9uX2hkci0+eWVhciA8IDE5MDAgfHwgdmVyc2lvbl9oZHItPnllYXIgPiAzMDAwKQotCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpbGxlZ2FsIHllYXIiKSwgLTEpOwotCSAgfQotCXwgREVCVUcKLQkgIHsKLQkgICAgZGVidWdfaW5mbyA9IHRydWU7Ci0JICB9Ci0JfCBERVNDUklQVElPTiBRVU9URURfU1RSSU5HCi0JICB7Ci0JICAgIGludCBsZW47Ci0KLQkgICAgbGVuID0gc3RybGVuICgkMik7Ci0JICAgIGlmIChsZW4gPiBOTE1fTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCkKLQkgICAgICB7Ci0JCW5sbWhlYWRlcl93YXJuIChfKCJkZXNjcmlwdGlvbiBzdHJpbmcgaXMgdG9vIGxvbmciKSwKLQkJCQlOTE1fTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCk7Ci0JCWxlbiA9IE5MTV9NQVhfREVTQ1JJUFRJT05fTEVOR1RIOwotCSAgICAgIH0KLQkgICAgdmFyX2hkci0+ZGVzY3JpcHRpb25MZW5ndGggPSBsZW47Ci0JICAgIHN0cm5jcHkgKHZhcl9oZHItPmRlc2NyaXB0aW9uVGV4dCwgJDIsIGxlbik7Ci0JICAgIHZhcl9oZHItPmRlc2NyaXB0aW9uVGV4dFtsZW5dID0gJ1wwJzsKLQkgICAgZnJlZSAoJDIpOwotCSAgfQotCXwgRVhJVCBTVFJJTkcKLQkgIHsKLQkgICAgZXhpdF9wcm9jZWR1cmUgPSAkMjsKLQkgIH0KLQl8IEVYUE9SVAotCSAgewotCSAgICBzeW1ib2xfcHJlZml4ID0gTlVMTDsKLQkgIH0KLQkgIHN5bWJvbF9saXN0X29wdAotCSAgewotCSAgICBleHBvcnRfc3ltYm9scyA9IHN0cmluZ19saXN0X2FwcGVuZCAoZXhwb3J0X3N5bWJvbHMsICQzKTsKLQkgIH0KLQl8IEZMQUdfT04gU1RSSU5HCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgfD0gbmxtbGV4X2dldF9udW1iZXIgKCQyKTsKLQkgICAgZnJlZSAoJDIpOwotCSAgfQotCXwgRkxBR19PRkYgU1RSSU5HCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgJj1+IG5sbWxleF9nZXRfbnVtYmVyICgkMik7Ci0JICAgIGZyZWUgKCQyKTsKLQkgIH0KLQl8IEZVTExNQVAKLQkgIHsKLQkgICAgbWFwX2ZpbGUgPSAiIjsKLQkgICAgZnVsbF9tYXAgPSB0cnVlOwotCSAgfQotCXwgRlVMTE1BUCBTVFJJTkcKLQkgIHsKLQkgICAgbWFwX2ZpbGUgPSAkMjsKLQkgICAgZnVsbF9tYXAgPSB0cnVlOwotCSAgfQotCXwgSEVMUCBTVFJJTkcKLQkgIHsKLQkgICAgaGVscF9maWxlID0gJDI7Ci0JICB9Ci0JfCBJTVBPUlQKLQkgIHsKLQkgICAgc3ltYm9sX3ByZWZpeCA9IE5VTEw7Ci0JICB9Ci0JICBzeW1ib2xfbGlzdF9vcHQKLQkgIHsKLQkgICAgaW1wb3J0X3N5bWJvbHMgPSBzdHJpbmdfbGlzdF9hcHBlbmQgKGltcG9ydF9zeW1ib2xzLCAkMyk7Ci0JICB9Ci0JfCBJTlBVVCBzdHJpbmdfbGlzdAotCSAgewotCSAgICBpbnB1dF9maWxlcyA9IHN0cmluZ19saXN0X2FwcGVuZCAoaW5wdXRfZmlsZXMsICQyKTsKLQkgIH0KLQl8IE1BUAotCSAgewotCSAgICBtYXBfZmlsZSA9ICIiOwotCSAgfQotCXwgTUFQIFNUUklORwotCSAgewotCSAgICBtYXBfZmlsZSA9ICQyOwotCSAgfQotCXwgTUVTU0FHRVMgU1RSSU5HCi0JICB7Ci0JICAgIG1lc3NhZ2VfZmlsZSA9ICQyOwotCSAgfQotCXwgTU9EVUxFIHN0cmluZ19saXN0Ci0JICB7Ci0JICAgIG1vZHVsZXMgPSBzdHJpbmdfbGlzdF9hcHBlbmQgKG1vZHVsZXMsICQyKTsKLQkgIH0KLQl8IE1VTFRJUExFCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgfD0gMHgyOwotCSAgfQotCXwgT1NfRE9NQUlOCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgfD0gMHgxMDsKLQkgIH0KLQl8IE9VVFBVVCBTVFJJTkcKLQkgIHsKLQkgICAgaWYgKG91dHB1dF9maWxlID09IE5VTEwpCi0JICAgICAgb3V0cHV0X2ZpbGUgPSAkMjsKLQkgICAgZWxzZQotCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpZ25vcmluZyBkdXBsaWNhdGUgT1VUUFVUIHN0YXRlbWVudCIpLCAtMSk7Ci0JICB9Ci0JfCBQU0VVRE9QUkVFTVBUSU9OCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgfD0gMHg4OwotCSAgfQotCXwgUkVFTlRSQU5UCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgfD0gMHgxOwotCSAgfQotCXwgU0NSRUVOTkFNRSBRVU9URURfU1RSSU5HCi0JICB7Ci0JICAgIGludCBsZW47Ci0KLQkgICAgbGVuID0gc3RybGVuICgkMik7Ci0JICAgIGlmIChsZW4gPj0gTkxNX01BWF9TQ1JFRU5fTkFNRV9MRU5HVEgpCi0JICAgICAgewotCQlubG1oZWFkZXJfd2FybiAoXygic2NyZWVuIG5hbWUgaXMgdG9vIGxvbmciKSwKLQkJCQlOTE1fTUFYX1NDUkVFTl9OQU1FX0xFTkdUSCk7Ci0JCWxlbiA9IE5MTV9NQVhfU0NSRUVOX05BTUVfTEVOR1RIOwotCSAgICAgIH0KLQkgICAgdmFyX2hkci0+c2NyZWVuTmFtZUxlbmd0aCA9IGxlbjsKLQkgICAgc3RybmNweSAodmFyX2hkci0+c2NyZWVuTmFtZSwgJDIsIGxlbik7Ci0JICAgIHZhcl9oZHItPnNjcmVlbk5hbWVbTkxNX01BWF9TQ1JFRU5fTkFNRV9MRU5HVEhdID0gJ1wwJzsKLQkgICAgZnJlZSAoJDIpOwotCSAgfQotCXwgU0hBUkVMSUIgU1RSSU5HCi0JICB7Ci0JICAgIHNoYXJlbGliX2ZpbGUgPSAkMjsKLQkgIH0KLQl8IFNUQUNLIFNUUklORwotCSAgewotCSAgICB2YXJfaGRyLT5zdGFja1NpemUgPSBubG1sZXhfZ2V0X251bWJlciAoJDIpOwotCSAgICBmcmVlICgkMik7Ci0JICB9Ci0JfCBTVEFSVCBTVFJJTkcKLQkgIHsKLQkgICAgc3RhcnRfcHJvY2VkdXJlID0gJDI7Ci0JICB9Ci0JfCBTWU5DSFJPTklaRQotCSAgewotCSAgICBmaXhlZF9oZHItPmZsYWdzIHw9IDB4NDsKLQkgIH0KLQl8IFRIUkVBRE5BTUUgUVVPVEVEX1NUUklORwotCSAgewotCSAgICBpbnQgbGVuOwotCi0JICAgIGxlbiA9IHN0cmxlbiAoJDIpOwotCSAgICBpZiAobGVuID49IE5MTV9NQVhfVEhSRUFEX05BTUVfTEVOR1RIKQotCSAgICAgIHsKLQkJbmxtaGVhZGVyX3dhcm4gKF8oInRocmVhZCBuYW1lIGlzIHRvbyBsb25nIiksCi0JCQkJTkxNX01BWF9USFJFQURfTkFNRV9MRU5HVEgpOwotCQlsZW4gPSBOTE1fTUFYX1RIUkVBRF9OQU1FX0xFTkdUSDsKLQkgICAgICB9Ci0JICAgIHZhcl9oZHItPnRocmVhZE5hbWVMZW5ndGggPSBsZW47Ci0JICAgIHN0cm5jcHkgKHZhcl9oZHItPnRocmVhZE5hbWUsICQyLCBsZW4pOwotCSAgICB2YXJfaGRyLT50aHJlYWROYW1lW2xlbl0gPSAnXDAnOwotCSAgICBmcmVlICgkMik7Ci0JICB9Ci0JfCBUWVBFIFNUUklORwotCSAgewotCSAgICBmaXhlZF9oZHItPm1vZHVsZVR5cGUgPSBubG1sZXhfZ2V0X251bWJlciAoJDIpOwotCSAgICBmcmVlICgkMik7Ci0JICB9Ci0JfCBWRVJCT1NFCi0JICB7Ci0JICAgIHZlcmJvc2UgPSB0cnVlOwotCSAgfQotCXwgVkVSU0lPTksgU1RSSU5HIFNUUklORyBTVFJJTkcKLQkgIHsKLQkgICAgbG9uZyB2YWw7Ci0KLQkgICAgc3RybmNweSAodmVyc2lvbl9oZHItPnN0YW1wLCAiVmVSc0lvTiMiLCA4KTsKLQkgICAgdmVyc2lvbl9oZHItPm1ham9yVmVyc2lvbiA9IG5sbWxleF9nZXRfbnVtYmVyICgkMik7Ci0JICAgIHZhbCA9IG5sbWxleF9nZXRfbnVtYmVyICgkMyk7Ci0JICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+IDk5KQotCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpbGxlZ2FsIG1pbm9yIHZlcnNpb24gbnVtYmVyIChtdXN0IGJlIGJldHdlZW4gMCBhbmQgOTkpIiksCi0JCQkgICAgICAtMSk7Ci0JICAgIGVsc2UKLQkgICAgICB2ZXJzaW9uX2hkci0+bWlub3JWZXJzaW9uID0gdmFsOwotCSAgICB2YWwgPSBubG1sZXhfZ2V0X251bWJlciAoJDQpOwotCSAgICBpZiAodmFsIDwgMCkKLQkgICAgICBubG1oZWFkZXJfd2FybiAoXygiaWxsZWdhbCByZXZpc2lvbiBudW1iZXIgKG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNikiKSwKLQkJCSAgICAgIC0xKTsKLQkgICAgZWxzZSBpZiAodmFsID4gMjYpCi0JICAgICAgdmVyc2lvbl9oZHItPnJldmlzaW9uID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHZlcnNpb25faGRyLT5yZXZpc2lvbiA9IHZhbDsKLQkgICAgZnJlZSAoJDIpOwotCSAgICBmcmVlICgkMyk7Ci0JICAgIGZyZWUgKCQ0KTsKLQkgIH0KLQl8IFZFUlNJT05LIFNUUklORyBTVFJJTkcKLQkgIHsKLQkgICAgbG9uZyB2YWw7Ci0KLQkgICAgc3RybmNweSAodmVyc2lvbl9oZHItPnN0YW1wLCAiVmVSc0lvTiMiLCA4KTsKLQkgICAgdmVyc2lvbl9oZHItPm1ham9yVmVyc2lvbiA9IG5sbWxleF9nZXRfbnVtYmVyICgkMik7Ci0JICAgIHZhbCA9IG5sbWxleF9nZXRfbnVtYmVyICgkMyk7Ci0JICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+IDk5KQotCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpbGxlZ2FsIG1pbm9yIHZlcnNpb24gbnVtYmVyIChtdXN0IGJlIGJldHdlZW4gMCBhbmQgOTkpIiksCi0JCQkgICAgICAtMSk7Ci0JICAgIGVsc2UKLQkgICAgICB2ZXJzaW9uX2hkci0+bWlub3JWZXJzaW9uID0gdmFsOwotCSAgICB2ZXJzaW9uX2hkci0+cmV2aXNpb24gPSAwOwotCSAgICBmcmVlICgkMik7Ci0JICAgIGZyZWUgKCQzKTsKLQkgIH0KLQl8IFhEQ0RBVEEgU1RSSU5HCi0JICB7Ci0JICAgIHJwY19maWxlID0gJDI7Ci0JICB9Ci0JOwotCi0vKiBBIHBvc3NpYmx5IGVtcHR5IGxpc3Qgb2Ygc3ltYm9scy4gICovCi0KLXN5bWJvbF9saXN0X29wdDoKLQkgIC8qIEVtcHR5LiAgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgc3ltYm9sX2xpc3QKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLS8qIEEgbGlzdCBvZiBzeW1ib2xzIGluIGFuIGltcG9ydCBvciBleHBvcnQgbGlzdC4gIFByZWZpeGVzIG1heSBhcHBlYXIKLSAgIGluIHBhcmVudGhlc2VzLiAgV2UgbmVlZCB0byB1c2UgbGVmdCByZWN1cnNpb24gaGVyZSB0byBhdm9pZAotICAgYnVpbGRpbmcgdXAgYSBsYXJnZSBpbXBvcnQgbGlzdCBvbiB0aGUgcGFyc2VyIHN0YWNrLiAgKi8KLQotc3ltYm9sX2xpc3Q6Ci0JICBzeW1ib2wKLQkgIHsKLQkgICAgJCQgPSBzdHJpbmdfbGlzdF9jb25zICgkMSwgTlVMTCk7Ci0JICB9Ci0JfCBzeW1ib2xfcHJlZml4Ci0JICB7Ci0JICAgICQkID0gTlVMTDsKLQkgIH0KLQl8IHN5bWJvbF9saXN0IHN5bWJvbAotCSAgewotCSAgICAkJCA9IHN0cmluZ19saXN0X2FwcGVuZDEgKCQxLCAkMik7Ci0JICB9Ci0JfCBzeW1ib2xfbGlzdCBzeW1ib2xfcHJlZml4Ci0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotCi0vKiBBIHByZWZpeCBmb3Igc3Vic2VxdWVudCBzeW1ib2xzLiAgKi8KLQotc3ltYm9sX3ByZWZpeDoKLQkgICcoJyBTVFJJTkcgJyknCi0JICB7Ci0JICAgIGlmIChzeW1ib2xfcHJlZml4ICE9IE5VTEwpCi0JICAgICAgZnJlZSAoc3ltYm9sX3ByZWZpeCk7Ci0JICAgIHN5bWJvbF9wcmVmaXggPSAkMjsKLQkgIH0KLQk7Ci0KLS8qIEEgc2luZ2xlIHN5bWJvbC4gICovCi0KLXN5bWJvbDoKLQkgIFNUUklORwotCSAgewotCSAgICBpZiAoc3ltYm9sX3ByZWZpeCA9PSBOVUxMKQotCSAgICAgICQkID0gJDE7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCSQkID0geG1hbGxvYyAoc3RybGVuIChzeW1ib2xfcHJlZml4KSArIHN0cmxlbiAoJDEpICsgMik7Ci0JCXNwcmludGYgKCQkLCAiJXNAJXMiLCBzeW1ib2xfcHJlZml4LCAkMSk7Ci0JCWZyZWUgKCQxKTsKLQkgICAgICB9Ci0JICB9Ci0JOwotCi0vKiBBIGxpc3Qgb2Ygc3RyaW5ncy4gICovCi0KLXN0cmluZ19saXN0OgotCSAgLyogTWF5IGJlIGVtcHR5LiAgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgU1RSSU5HIHN0cmluZ19saXN0Ci0JICB7Ci0JICAgICQkID0gc3RyaW5nX2xpc3RfY29ucyAoJDEsICQyKTsKLQkgIH0KLQk7Ci0KLSUlCi0KLS8qIElmIHN0cmVycm9yIGlzIGp1c3QgYSBtYWNybywgd2Ugd2FudCB0byB1c2UgdGhlIG9uZSBmcm9tIGxpYmliZXJ0eQotICAgc2luY2UgaXQgd2lsbCBoYW5kbGUgdW5kZWZpbmVkIHZhbHVlcy4gICovCi0jdW5kZWYgc3RyZXJyb3IKLWV4dGVybiBjaGFyICpzdHJlcnJvciAoKTsKLQotLyogVGhlIGxleGVyIGlzIHNpbXBsZSwgdG9vIHNpbXBsZSBmb3IgZmxleC4gIEtleXdvcmRzIGFyZSBvbmx5Ci0gICByZWNvZ25pemVkIGF0IHRoZSBzdGFydCBvZiBsaW5lcy4gIEV2ZXJ5dGhpbmcgZWxzZSBtdXN0IGJlIGFuCi0gICBhcmd1bWVudC4gIEEgY29tbWEgaXMgdHJlYXRlZCBhcyB3aGl0ZXNwYWNlLiAgKi8KLQotLyogVGhlIHN0YXRlcyB0aGUgbGV4ZXIgY2FuIGJlIGluLiAgKi8KLQotZW51bSBsZXhfc3RhdGUKLXsKLSAgLyogQXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotICBCRUdJTk5JTkdfT0ZfTElORSwKLSAgLyogSW4gdGhlIG1pZGRsZSBvZiBhIGxpbmUuICAqLwotICBJTl9MSU5FCi19OwotCi0vKiBXZSBuZWVkIHRvIGtlZXAgYSBzdGFjayBvZiBmaWxlcyB0byBoYW5kbGUgZmlsZSBpbmNsdXNpb24uICAqLwotCi1zdHJ1Y3QgaW5wdXQKLXsKLSAgLyogVGhlIGZpbGUgdG8gcmVhZCBmcm9tLiAgKi8KLSAgRklMRSAqZmlsZTsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIGZpbGUuICAqLwotICBjaGFyICpuYW1lOwotICAvKiBUaGUgY3VycmVudCBsaW5lIG51bWJlci4gICovCi0gIGludCBsaW5lbm87Ci0gIC8qIFRoZSBjdXJyZW50IHN0YXRlLiAgKi8KLSAgZW51bSBsZXhfc3RhdGUgc3RhdGU7Ci0gIC8qIFRoZSBuZXh0IGZpbGUgb24gdGhlIHN0YWNrLiAgKi8KLSAgc3RydWN0IGlucHV0ICpuZXh0OwotfTsKLQotLyogVGhlIGN1cnJlbnQgaW5wdXQgZmlsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgaW5wdXQgY3VycmVudDsKLQotLyogVGhlIGNoYXJhY3RlciB3aGljaCBpbnRyb2R1Y2VzIGNvbW1lbnRzLiAgKi8KLSNkZWZpbmUgQ09NTUVOVF9DSEFSICcjJwotDAotLyogU3RhcnQgdGhlIGxleGVyIGdvaW5nIG9uIHRoZSBtYWluIGlucHV0IGZpbGUuICAqLwotCi1ib29sZWFuCi1ubG1sZXhfZmlsZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY3VycmVudC5uZXh0ID0gTlVMTDsKLSAgcmV0dXJuIG5sbWxleF9maWxlX29wZW4gKG5hbWUpOwotfQotCi0vKiBTdGFydCB0aGUgbGV4ZXIgZ29pbmcgb24gYSBzdWJzaWRpYXJ5IGlucHV0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotbmxtbGV4X2ZpbGVfcHVzaCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGlucHV0ICpwdXNoOwotCi0gIHB1c2ggPSAoc3RydWN0IGlucHV0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGlucHV0KSk7Ci0gICpwdXNoID0gY3VycmVudDsKLSAgaWYgKG5sbWxleF9maWxlX29wZW4gKG5hbWUpKQotICAgIGN1cnJlbnQubmV4dCA9IHB1c2g7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjdXJyZW50ID0gKnB1c2g7Ci0gICAgICBmcmVlIChwdXNoKTsKLSAgICB9Ci19Ci0KLS8qIFN0YXJ0IGxleGluZyBmcm9tIGEgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1sZXhfZmlsZV9vcGVuIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjdXJyZW50LmZpbGUgPSBmb3BlbiAobmFtZSwgInIiKTsKLSAgaWYgKGN1cnJlbnQuZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgICsrcGFyc2VfZXJyb3JzOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgY3VycmVudC5uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0gIGN1cnJlbnQubGluZW5vID0gMTsKLSAgY3VycmVudC5zdGF0ZSA9IEJFR0lOTklOR19PRl9MSU5FOwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRhYmxlIHVzZWQgdG8gdHVybiBrZXl3b3JkcyBpbnRvIHRva2Vucy4gICovCi0KLXN0cnVjdCBrZXl3b3JkX3Rva2Vuc19zdHJ1Y3QKLXsKLSAgY29uc3QgY2hhciAqa2V5d29yZDsKLSAgaW50IHRva2VuOwotfTsKLQotc3RydWN0IGtleXdvcmRfdG9rZW5zX3N0cnVjdCBrZXl3b3JkX3Rva2Vuc1tdID0KLXsKLSAgeyAiQ0hFQ0siLCBDSEVDSyB9LAotICB7ICJDT0RFU1RBUlQiLCBDT0RFU1RBUlQgfSwKLSAgeyAiQ09QWVJJR0hUIiwgQ09QWVJJR0hUIH0sCi0gIHsgIkNVU1RPTSIsIENVU1RPTSB9LAotICB7ICJEQVRFIiwgREFURSB9LAotICB7ICJERUJVRyIsIERFQlVHIH0sCi0gIHsgIkRFU0NSSVBUSU9OIiwgREVTQ1JJUFRJT04gfSwKLSAgeyAiRVhJVCIsIEVYSVQgfSwKLSAgeyAiRVhQT1JUIiwgRVhQT1JUIH0sCi0gIHsgIkZMQUdfT04iLCBGTEFHX09OIH0sCi0gIHsgIkZMQUdfT0ZGIiwgRkxBR19PRkYgfSwKLSAgeyAiRlVMTE1BUCIsIEZVTExNQVAgfSwKLSAgeyAiSEVMUCIsIEhFTFAgfSwKLSAgeyAiSU1QT1JUIiwgSU1QT1JUIH0sCi0gIHsgIklOUFVUIiwgSU5QVVQgfSwKLSAgeyAiTUFQIiwgTUFQIH0sCi0gIHsgIk1FU1NBR0VTIiwgTUVTU0FHRVMgfSwKLSAgeyAiTU9EVUxFIiwgTU9EVUxFIH0sCi0gIHsgIk1VTFRJUExFIiwgTVVMVElQTEUgfSwKLSAgeyAiT1NfRE9NQUlOIiwgT1NfRE9NQUlOIH0sCi0gIHsgIk9VVFBVVCIsIE9VVFBVVCB9LAotICB7ICJQU0VVRE9QUkVFTVBUSU9OIiwgUFNFVURPUFJFRU1QVElPTiB9LAotICB7ICJSRUVOVFJBTlQiLCBSRUVOVFJBTlQgfSwKLSAgeyAiU0NSRUVOTkFNRSIsIFNDUkVFTk5BTUUgfSwKLSAgeyAiU0hBUkVMSUIiLCBTSEFSRUxJQiB9LAotICB7ICJTVEFDSyIsIFNUQUNLIH0sCi0gIHsgIlNUQUNLU0laRSIsIFNUQUNLIH0sCi0gIHsgIlNUQVJUIiwgU1RBUlQgfSwKLSAgeyAiU1lOQ0hST05JWkUiLCBTWU5DSFJPTklaRSB9LAotICB7ICJUSFJFQUROQU1FIiwgVEhSRUFETkFNRSB9LAotICB7ICJUWVBFIiwgVFlQRSB9LAotICB7ICJWRVJCT1NFIiwgVkVSQk9TRSB9LAotICB7ICJWRVJTSU9OIiwgVkVSU0lPTksgfSwKLSAgeyAiWERDREFUQSIsIFhEQ0RBVEEgfQotfTsKLQotI2RlZmluZSBLRVlXT1JEX0NPVU5UIChzaXplb2YgKGtleXdvcmRfdG9rZW5zKSAvIHNpemVvZiAoa2V5d29yZF90b2tlbnNbMF0pKQotDAotLyogVGhlIGxleGVyIGFjY3VtdWxhdGVzIHN0cmluZ3MgaW4gdGhlc2UgdmFyaWFibGVzLiAgKi8KLXN0YXRpYyBjaGFyICpsZXhfYnVmOwotc3RhdGljIGludCBsZXhfc2l6ZTsKLXN0YXRpYyBpbnQgbGV4X3BvczsKLQotLyogU3RhcnQgYWNjdW11bGF0aW5nIHN0cmluZ3MgaW50byB0aGUgYnVmZmVyLiAgKi8KLSNkZWZpbmUgQlVGX0lOSVQoKSBcCi0gICgodm9pZCkgKGxleF9idWYgIT0gTlVMTCA/IGxleF9wb3MgPSAwIDogbmxtbGV4X2J1Zl9pbml0ICgpKSkKLQotc3RhdGljIGludAotbmxtbGV4X2J1Zl9pbml0ICgpCi17Ci0gIGxleF9zaXplID0gMTA7Ci0gIGxleF9idWYgPSB4bWFsbG9jIChsZXhfc2l6ZSArIDEpOwotICBsZXhfcG9zID0gMDsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEZpbmlzaCBhIHN0cmluZyBpbiB0aGUgYnVmZmVyLiAgKi8KLSNkZWZpbmUgQlVGX0ZJTklTSCgpICgodm9pZCkgKGxleF9idWZbbGV4X3Bvc10gPSAnXDAnKSkKLQotLyogQWNjdW11bGF0ZSBhIGNoYXJhY3RlciBpbnRvIHRoZSBidWZmZXIuICAqLwotI2RlZmluZSBCVUZfQUREKGMpIFwKLSAgKCh2b2lkKSAobGV4X3BvcyA8IGxleF9zaXplIFwKLQkgICA/IGxleF9idWZbbGV4X3BvcysrXSA9IChjKSBcCi0JICAgOiBubG1sZXhfYnVmX2FkZCAoYykpKQotCi1zdGF0aWMgY2hhcgotbmxtbGV4X2J1Zl9hZGQgKGMpCi0gICAgIGludCBjOwotewotICBpZiAobGV4X3BvcyA+PSBsZXhfc2l6ZSkKLSAgICB7Ci0gICAgICBsZXhfc2l6ZSAqPSAyOwotICAgICAgbGV4X2J1ZiA9IHhyZWFsbG9jIChsZXhfYnVmLCBsZXhfc2l6ZSArIDEpOwotICAgIH0KLQotICByZXR1cm4gbGV4X2J1ZltsZXhfcG9zKytdID0gYzsKLX0KLQwKLS8qIFRoZSBsZXhlciBwcm9wZXIuICBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYmlzb24gZ2VuZXJhdGVkIHBhcnNpbmcKLSAgIGNvZGUuICAqLwotCi1zdGF0aWMgaW50Ci15eWxleCAoKQotewotICBpbnQgYzsKLQotdGFpbF9yZWN1cnNlOgotCi0gIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOwotCi0gIC8qIENvbW1hcyBhcmUgdHJlYXRlZCBhcyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuICAqLwotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGMpIHx8IGMgPT0gJywnKQotICAgIHsKLSAgICAgIGN1cnJlbnQuc3RhdGUgPSBJTl9MSU5FOwotICAgICAgaWYgKGMgPT0gJ1xuJykKLQl7Ci0JICArK2N1cnJlbnQubGluZW5vOwotCSAgY3VycmVudC5zdGF0ZSA9IEJFR0lOTklOR19PRl9MSU5FOwotCX0KLSAgICAgIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOwotICAgIH0KLQotICAvKiBBdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHdlIGVpdGhlciBwb3AgdG8gdGhlIHByZXZpb3VzIGZpbGUgb3IKLSAgICAgZmluaXNoIHVwLiAgKi8KLSAgaWYgKGMgPT0gRU9GKQotICAgIHsKLSAgICAgIGZjbG9zZSAoY3VycmVudC5maWxlKTsKLSAgICAgIGZyZWUgKGN1cnJlbnQubmFtZSk7Ci0gICAgICBpZiAoY3VycmVudC5uZXh0ID09IE5VTEwpCi0JcmV0dXJuIDA7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGlucHV0ICpuZXh0OwotCi0JICBuZXh0ID0gY3VycmVudC5uZXh0OwotCSAgY3VycmVudCA9ICpuZXh0OwotCSAgZnJlZSAobmV4dCk7Ci0JICBnb3RvIHRhaWxfcmVjdXJzZTsKLQl9Ci0gICAgfQotCi0gIC8qIEEgY29tbWVudCBjaGFyYWN0ZXIgYWx3YXlzIG1lYW5zIHRvIGRyb3AgZXZlcnl0aGluZyB1bnRpbCB0aGUKLSAgICAgbmV4dCBuZXdsaW5lLiAgKi8KLSAgaWYgKGMgPT0gQ09NTUVOVF9DSEFSKQotICAgIHsKLSAgICAgIGRvCi0JewotCSAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7Ci0JfQotICAgICAgd2hpbGUgKGMgIT0gJ1xuJyk7Ci0gICAgICArK2N1cnJlbnQubGluZW5vOwotICAgICAgY3VycmVudC5zdGF0ZSA9IEJFR0lOTklOR19PRl9MSU5FOwotICAgICAgZ290byB0YWlsX3JlY3Vyc2U7Ci0gICAgfQotCi0gIC8qIEFuICdAJyBpbnRyb2R1Y2VzIGFuIGluY2x1ZGUgZmlsZS4gICovCi0gIGlmIChjID09ICdAJykKLSAgICB7Ci0gICAgICBkbwotCXsKLQkgIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOwotCSAgaWYgKGMgPT0gJ1xuJykKLQkgICAgKytjdXJyZW50LmxpbmVubzsKLQl9Ci0gICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGMpKTsKLSAgICAgIEJVRl9JTklUICgpOwotICAgICAgd2hpbGUgKCEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGMpICYmIGMgIT0gRU9GKQotCXsKLQkgIEJVRl9BREQgKGMpOwotCSAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7Ci0JfQotICAgICAgQlVGX0ZJTklTSCAoKTsKLQotICAgICAgdW5nZXRjIChjLCBjdXJyZW50LmZpbGUpOwotICAgICAgCi0gICAgICBubG1sZXhfZmlsZV9wdXNoIChsZXhfYnVmKTsKLSAgICAgIGdvdG8gdGFpbF9yZWN1cnNlOwotICAgIH0KLQotICAvKiBBIG5vbi1zcGFjZSBjaGFyYWN0ZXIgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZSBtdXN0IGJlIHRoZSBzdGFydCBvZgotICAgICBhIGtleXdvcmQuICAqLwotICBpZiAoY3VycmVudC5zdGF0ZSA9PSBCRUdJTk5JTkdfT0ZfTElORSkKLSAgICB7Ci0gICAgICBCVUZfSU5JVCAoKTsKLSAgICAgIHdoaWxlIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgYykgfHwgYyA9PSAnXycpCi0JewotCSAgaWYgKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSBjKSkKLQkgICAgQlVGX0FERCAodG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGMpKTsKLQkgIGVsc2UKLQkgICAgQlVGX0FERCAoYyk7Ci0JICBjID0gZ2V0YyAoY3VycmVudC5maWxlKTsKLQl9Ci0gICAgICBCVUZfRklOSVNIICgpOwotCi0gICAgICBpZiAoYyAhPSBFT0YgJiYgISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgYykgJiYgYyAhPSAnLCcpCi0JewotCSAgbmxtaGVhZGVyX2lkZW50aWZ5ICgpOwotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczolZDogaWxsZWdhbCBjaGFyYWN0ZXIgaW4ga2V5d29yZDogJWNcbiIpLAotCQkgICBjdXJyZW50Lm5hbWUsIGN1cnJlbnQubGluZW5vLCBjKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgaW50IGk7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBLRVlXT1JEX0NPVU5UOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAobGV4X2J1ZlswXSA9PSBrZXl3b3JkX3Rva2Vuc1tpXS5rZXl3b3JkWzBdCi0JCSAgJiYgc3RyY21wIChsZXhfYnVmLCBrZXl3b3JkX3Rva2Vuc1tpXS5rZXl3b3JkKSA9PSAwKQotCQl7Ci0JCSAgLyogUHVzaGluZyBiYWNrIHRoZSBmaW5hbCB3aGl0ZXNwYWNlIGF2b2lkcyB3b3JyeWluZwotCQkgICAgIGFib3V0IFxuIGhlcmUuICAqLwotCQkgIHVuZ2V0YyAoYywgY3VycmVudC5maWxlKTsKLQkJICBjdXJyZW50LnN0YXRlID0gSU5fTElORTsKLQkJICByZXR1cm4ga2V5d29yZF90b2tlbnNbaV0udG9rZW47Ci0JCX0KLQkgICAgfQotCSAgCi0JICBubG1oZWFkZXJfaWRlbnRpZnkgKCk7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVkOiB1bnJlY29nbml6ZWQga2V5d29yZDogJXNcbiIpLAotCQkgICBjdXJyZW50Lm5hbWUsIGN1cnJlbnQubGluZW5vLCBsZXhfYnVmKTsKLQl9Ci0KLSAgICAgICsrcGFyc2VfZXJyb3JzOwotICAgICAgLyogVHJlYXQgdGhlIHJlc3Qgb2YgdGhpcyBsaW5lIGFzIGEgY29tbWVudC4gICovCi0gICAgICB1bmdldGMgKENPTU1FTlRfQ0hBUiwgY3VycmVudC5maWxlKTsKLSAgICAgIGdvdG8gdGFpbF9yZWN1cnNlOwotICAgIH0KLQotICAvKiBQYXJlbnRoZXNlcyBqdXN0IHJlcHJlc2VudCB0aGVtc2VsdmVzLiAgKi8KLSAgaWYgKGMgPT0gJygnIHx8IGMgPT0gJyknKQotICAgIHJldHVybiBjOwotCi0gIC8qIEhhbmRsZSBxdW90ZWQgc3RyaW5ncy4gICovCi0gIGlmIChjID09ICciJyB8fCBjID09ICdcJycpCi0gICAgewotICAgICAgaW50IHF1b3RlOwotICAgICAgaW50IHN0YXJ0X2xpbmVubzsKLQotICAgICAgcXVvdGUgPSBjOwotICAgICAgc3RhcnRfbGluZW5vID0gY3VycmVudC5saW5lbm87Ci0KLSAgICAgIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOwotICAgICAgQlVGX0lOSVQgKCk7Ci0gICAgICB3aGlsZSAoYyAhPSBxdW90ZSAmJiBjICE9IEVPRikKLQl7Ci0JICBCVUZfQUREIChjKTsKLQkgIGlmIChjID09ICdcbicpCi0JICAgICsrY3VycmVudC5saW5lbm87Ci0JICBjID0gZ2V0YyAoY3VycmVudC5maWxlKTsKLQl9Ci0gICAgICBCVUZfRklOSVNIICgpOwotCi0gICAgICBpZiAoYyA9PSBFT0YpCi0JewotCSAgbmxtaGVhZGVyX2lkZW50aWZ5ICgpOwotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczolZDogZW5kIG9mIGZpbGUgaW4gcXVvdGVkIHN0cmluZ1xuIiksCi0JCSAgIGN1cnJlbnQubmFtZSwgc3RhcnRfbGluZW5vKTsKLQkgICsrcGFyc2VfZXJyb3JzOwotCX0KLQotICAgICAgLyogRklYTUU6IFBvc3NpYmxlIG1lbW9yeSBsZWFrLiAgKi8KLSAgICAgIHl5bHZhbC5zdHJpbmcgPSB4c3RyZHVwIChsZXhfYnVmKTsKLSAgICAgIHJldHVybiBRVU9URURfU1RSSU5HOwotICAgIH0KLQotICAvKiBHYXRoZXIgYSBnZW5lcmljIGFyZ3VtZW50LiAgKi8KLSAgQlVGX0lOSVQgKCk7Ci0gIHdoaWxlICghIGlzc3BhY2UgKGMpCi0JICYmIGMgIT0gJywnCi0JICYmIGMgIT0gQ09NTUVOVF9DSEFSCi0JICYmIGMgIT0gJygnCi0JICYmIGMgIT0gJyknKQotICAgIHsKLSAgICAgIEJVRl9BREQgKGMpOwotICAgICAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7Ci0gICAgfQotICBCVUZfRklOSVNIICgpOwotCi0gIHVuZ2V0YyAoYywgY3VycmVudC5maWxlKTsKLQotICAvKiBGSVhNRTogUG9zc2libGUgbWVtb3J5IGxlYWsuICAqLwotICB5eWx2YWwuc3RyaW5nID0geHN0cmR1cCAobGV4X2J1Zik7Ci0gIHJldHVybiBTVFJJTkc7Ci19Ci0MCi0vKiBHZXQgYSBudW1iZXIgZnJvbSBhIHN0cmluZy4gICovCi0KLXN0YXRpYyBsb25nCi1ubG1sZXhfZ2V0X251bWJlciAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgbG9uZyByZXQ7Ci0gIGNoYXIgKnNlbmQ7Ci0KLSAgcmV0ID0gc3RydG9sIChzLCAmc2VuZCwgMTApOwotICBpZiAoKnNlbmQgIT0gJ1wwJykKLSAgICBubG1oZWFkZXJfd2FybiAoXygiYmFkIG51bWJlciIpLCAtMSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFByZWZpeCB0aGUgbmxtY29udiB3YXJuaW5ncyB3aXRoIGEgbm90ZSBhcyB0byB3aGVyZSB0aGV5IGNvbWUgZnJvbS4KLSAgIFdlIGRvbid0IHVzZSBwcm9ncmFtX25hbWUgb24gZXZlcnkgd2FybmluZywgYmVjYXVzZSB0aGVuIHNvbWUKLSAgIHZlcnNpb25zIG9mIHRoZSBlbWFjcyBuZXh0LWVycm9yIGZ1bmN0aW9uIGNhbid0IHJlY29nbml6ZSB0aGUgbGluZQotICAgbnVtYmVyLiAgKi8KLQotc3RhdGljIHZvaWQKLW5sbWhlYWRlcl9pZGVudGlmeSAoKQotewotICBzdGF0aWMgaW50IGRvbmU7Ci0KLSAgaWYgKCEgZG9uZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBwcm9ibGVtcyBpbiBOTE0gY29tbWFuZCBsYW5ndWFnZSBpbnB1dDpcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUpOwotICAgICAgZG9uZSA9IDE7Ci0gICAgfQotfQotCi0vKiBJc3N1ZSBhIHdhcm5pbmcuICAqLwotCi1zdGF0aWMgdm9pZAotbmxtaGVhZGVyX3dhcm4gKHMsIGltYXgpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgIGludCBpbWF4OwotewotICBubG1oZWFkZXJfaWRlbnRpZnkgKCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkOiAlcyIsIGN1cnJlbnQubmFtZSwgY3VycmVudC5saW5lbm8sIHMpOwotICBpZiAoaW1heCAhPSAtMSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgKG1heCAlZCkiLCBpbWF4KTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLX0KLQotLyogUmVwb3J0IGFuIGVycm9yLiAgKi8KLQotc3RhdGljIHZvaWQKLW5sbWhlYWRlcl9lcnJvciAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgbmxtaGVhZGVyX3dhcm4gKHMsIC0xKTsKLSAgKytwYXJzZV9lcnJvcnM7Ci19Ci0KLS8qIEFkZCBhIHN0cmluZyB0byBhIHN0cmluZyBsaXN0LiAgKi8KLQotc3RhdGljIHN0cnVjdCBzdHJpbmdfbGlzdCAqCi1zdHJpbmdfbGlzdF9jb25zIChzLCBsKQotICAgICBjaGFyICpzOwotICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmw7Ci17Ci0gIHN0cnVjdCBzdHJpbmdfbGlzdCAqcmV0OwotCi0gIHJldCA9IChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3RyaW5nX2xpc3QpKTsKLSAgcmV0LT5uZXh0ID0gbDsKLSAgcmV0LT5zdHJpbmcgPSBzOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBBcHBlbmQgYSBzdHJpbmcgbGlzdCB0byBhbm90aGVyIHN0cmluZyBsaXN0LiAgKi8KLQotc3RhdGljIHN0cnVjdCBzdHJpbmdfbGlzdCAqCi1zdHJpbmdfbGlzdF9hcHBlbmQgKGwxLCBsMikKLSAgICAgc3RydWN0IHN0cmluZ19saXN0ICpsMTsKLSAgICAgc3RydWN0IHN0cmluZ19saXN0ICpsMjsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHN0cmluZ19saXN0ICoqcHA7Ci0KLSAgZm9yIChwcCA9ICZsMTsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotICAgIDsKLSAgKnBwID0gbDI7Ci0gIHJldHVybiBsMTsKLX0KLQotLyogQXBwZW5kIGEgc3RyaW5nIHRvIGEgc3RyaW5nIGxpc3QuICAqLwotCi1zdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICoKLXN0cmluZ19saXN0X2FwcGVuZDEgKGwsIHMpCi0gICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbDsKLSAgICAgY2hhciAqczsKLXsKLSAgc3RydWN0IHN0cmluZ19saXN0ICpuOwotICByZWdpc3RlciBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKipwcDsKLQotICBuID0gKHN0cnVjdCBzdHJpbmdfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzdHJpbmdfbGlzdCkpOwotICBuLT5uZXh0ID0gTlVMTDsKLSAgbi0+c3RyaW5nID0gczsKLSAgZm9yIChwcCA9ICZsOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0gICAgOwotICAqcHAgPSBuOwotICByZXR1cm4gbDsKLX0KLQotLyogRHVwbGljYXRlIGEgc3RyaW5nIGluIG1lbW9yeS4gICovCi0KLXN0YXRpYyBjaGFyICoKLXhzdHJkdXAgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgbGVuOwotICBjaGFyICpyZXQ7Ci0KLSAgbGVuID0gc3RybGVuIChzKTsKLSAgcmV0ID0geG1hbGxvYyAobGVuICsgMSk7Ci0gIHN0cmNweSAocmV0LCBzKTsKLSAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25tLjEgYi9iaW51dGlscy9ubS4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmFkOTllLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25tLjEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIG5tIDEgIjUgTm92ZW1iZXIgMTk5MSIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLW5tIFwtIGxpc3Qgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcy4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIG5tCi0uUkIgIltcfCIgXC1hIHwgXC1cLWRlYnVnXC1zeW1zICJcfF0iIAotLlJCICJbXHwiIFwtZyB8IFwtXC1leHRlcm5cLW9ubHkgIlx8XSIKLS5SQiAiW1x8IiBcLUIgIlx8XSIgIAotLlJCICJbXHwiIFwtQyB8IFwtXC1kZW1hbmdsZSAiXHxdIiAKLS5SQiAiW1x8IiBcLUQgfCBcLVwtZHluYW1pYyAiXHxdIiAKLS5SQiAiW1x8IiBcLXMgfCBcLVwtcHJpbnRcLWFybWFwICJcfF0iIAotLlJCICJbXHwiIFwtbyB8IFwtXC1wcmludFwtZmlsZVwtbmFtZSAiXHxdIiAgCi0uUkIgIltcfCIgXC1uIHwgXC1cLW51bWVyaWNcLXNvcnQgIlx8XSIgCi0uUkIgIltcfCIgXC1wIHwgXC1cLW5vXC1zb3J0ICJcfF0iCi0uUkIgIltcfCIgXC1yIHwgXC1cLXJldmVyc2VcLXNvcnQgIlx8XSIgCi0uUkIgIltcfCIgXC1cLXNpemVcLXNvcnQgIlx8XSIgCi0uUkIgIltcfCIgXC11IHwgXC1cLXVuZGVmaW5lZFwtb25seSAiXHxdIiAgCi0uUkIgIltcfCIgXC1sIHwgXC1cLWxpbmVcLW51bWJlcnMgIlx8XSIKLS5SQiAiW1x8IiBcLVwtaGVscCAiXHxdIiAgCi0uUkIgIltcfCIgXC1cLXZlcnNpb24gIlx8XSIgIAotLlJCICJbXHwiICJcLXQgXGZJcmFkaXgiIHwgXC1cLXJhZGl4PVxmSXJhZGl4ICJcfF0iCi0uUkIgIltcfCIgXC1QIHwgLS1wb3J0YWJpbGl0eSAiXHxdIgotLlJCICJbXHwiICJcLWYgXGZJZm9ybWF0IiB8IFwtXC1mb3JtYXQ9XGZJZm9ybWF0ICJcfF0iCi0uUkIgIltcfCIgIlwtXC10YXJnZXQ9XGZJYmZkbmFtZSIgIlx8XSIKLS5SQiAiW1x8IiBcYwotLkkgb2JqZmlsZVxjCi1cJi5cfC5cfC5cfF0KLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1HTlUgXGMKLS5CIG5tXGMKLVwmIGxpc3RzIHRoZSBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzIFxjCi0uSSBvYmpmaWxlXGMKLVwmLiAgSWYgbm8gb2JqZWN0IGZpbGVzIGFyZSBnaXZlbiBhcyBhcmd1bWVudHMsIFxjCi0uQiBubVxjCi1cJiBhc3N1bWVzIGBcfFxjCi0uQiBhLm91dFxjCi1cfCcuCi0KLS5TSCBPUFRJT05TCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4KLQotLlRQCi0uQiBcLUEKLS5UUAotLkIgXC1vCi0uVFAKLS5CIFwtXC1wcmludFwtZmlsZVwtbmFtZSAKLVByZWNlZGUgZWFjaCBzeW1ib2wgYnkgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUgd2hlcmUgaXQgd2FzIGZvdW5kLAotcmF0aGVyIHRoYW4gaWRlbnRpZnlpbmcgdGhlIGlucHV0IGZpbGUgb25jZSBvbmx5IGJlZm9yZSBhbGwgb2YgaXRzCi1zeW1ib2xzLiAKLQotLlRQCi0uQiBcLWEKLS5UUAotLkIgXC1cLWRlYnVnXC1zeW1zIAotRGlzcGxheSBkZWJ1Z2dlci1vbmx5IHN5bWJvbHM7IG5vcm1hbGx5IHRoZXNlIGFyZSBub3QgbGlzdGVkLgotCi0uVFAKLS5CIFwtQgotVGhlIHNhbWUgYXMKLS5CIFwtXC1mb3JtYXQ9YnNkCi0oZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgTUlQUyBcZkJubVxmUCkuCi0KLS5UUAotLkIgXC1DCi0uVFAKLS5CIFwtXC1kZW1hbmdsZQotRGVjb2RlIChcZklkZW1hbmdsZVxmUCkgbG93LWxldmVsIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMuCi1CZXNpZGVzIHJlbW92aW5nIGFueSBpbml0aWFsIHVuZGVyc2NvcmUgcHJlcGVuZGVkIGJ5IHRoZSBzeXN0ZW0sIHRoaXMKLW1ha2VzIEMrKyBmdW5jdGlvbiBuYW1lcyByZWFkYWJsZS4KLQotLlRQCi0uQiBcLUQKLS5UUAotLkIgXC1cLWR5bmFtaWMKLURpc3BsYXkgdGhlIGR5bmFtaWMgc3ltYm9scyByYXRoZXIgdGhhbiB0aGUgbm9ybWFsIHN5bWJvbHMuICBUaGlzIGlzCi1vbmx5IG1lYW5pbmdmdWwgZm9yIGR5bmFtaWMgb2JqZWN0cywgc3VjaCBhcyBjZXJ0YWluIHR5cGVzIG9mIHNoYXJlZAotbGlicmFyaWVzLgotCi0uVFAKLS5CICJcLWYgXGZJZm9ybWF0IgotVXNlIHRoZSBvdXRwdXQgZm9ybWF0IFxmSWZvcm1hdFxmUCwgd2hpY2ggY2FuIGJlIGBgYnNkJycsCi1gYHN5c3YnJywgb3IgYGBwb3NpeCcnLiAgVGhlIGRlZmF1bHQgaXMgYGBic2QnJy4KLU9ubHkgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBcZklmb3JtYXRcZlAgaXMgc2lnbmlmaWNhbnQ7IGl0IGNhbiBiZQotZWl0aGVyIHVwcGVyIG9yIGxvd2VyIGNhc2UuCi0KLS5UUAotLkIgXC1nCi0uVFAKLS5CIFwtXC1leHRlcm5cLW9ubHkgCi1EaXNwbGF5IG9ubHkgZXh0ZXJuYWwgc3ltYm9scy4KLQotLlRQCi0uQiBcLW4KLS5UUAotLkIgXC12Ci0uVFAKLS5CIFwtXC1udW1lcmljXC1zb3J0IAotU29ydCBzeW1ib2xzIG51bWVyaWNhbGx5IGJ5IHRoZWlyIGFkZHJlc3Nlcywgbm90IGFscGhhYmV0aWNhbGx5IGJ5IHRoZWlyCi1uYW1lcy4gCi0KLS5UUAotLkIgXC1wCi0uVFAKLS5CIFwtXC1ub1wtc29ydCAKLURvbid0IGJvdGhlciB0byBzb3J0IHRoZSBzeW1ib2xzIGluIGFueSBvcmRlcjsganVzdCBwcmludCB0aGVtIGluIHRoZQotb3JkZXIgZW5jb3VudGVyZWQuCi0KLS5UUAotLkIgXC1QCi0uVFAKLS5CIFwtXC1wb3J0YWJpbGl0eQotVXNlIHRoZSBQT1NJWC4yIHN0YW5kYXJkIG91dHB1dCBmb3JtYXQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBmb3JtYXQuCi1FcXVpdmFsZW50IHRvIGBgXC1mIHBvc2l4JycuCi0KLS5UUAotLkIgXC1zCi0uVFAKLS5CIFwtXC1wcmludFwtYXJtYXAKLVdoZW4gbGlzdGluZyBzeW1ib2xzIGZyb20gYXJjaGl2ZSBtZW1iZXJzLCBpbmNsdWRlIHRoZSBpbmRleDogYSBtYXBwaW5nCi0oc3RvcmVkIGluIHRoZSBhcmNoaXZlIGJ5IFxjCi0uQiBhclxjCi1cJiBvciBcYwotLkIgcmFubGliXGMKLVwmKSBvZiB3aGF0IG1vZHVsZXMKLWNvbnRhaW4gZGVmaW5pdGlvbnMgZm9yIHdoYXQgbmFtZXMuCi0KLS5UUAotLkIgXC1yCi0uVFAKLS5CIFwtXC1yZXZlcnNlXC1zb3J0IAotUmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhlIHNvcnQgKHdoZXRoZXIgbnVtZXJpYyBvciBhbHBoYWJldGljKTsgbGV0IHRoZQotbGFzdCBjb21lIGZpcnN0LgotCi0uVFAKLS5CIFwtXC1zaXplXC1zb3J0IAotU29ydCBzeW1ib2xzIGJ5IHNpemUuICBUaGUgc2l6ZSBpcyBjb21wdXRlZCBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi10aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgd2l0aCB0aGUgbmV4dCBoaWdoZXIKLXZhbHVlLiAgVGhlIHNpemUgb2YgdGhlIHN5bWJvbCBpcyBwcmludGVkLCByYXRoZXIgdGhhbiB0aGUgdmFsdWUuCi0KLS5UUAotLkIgIlwtdCBcZklyYWRpeCIKLS5UUAotLkIgIlwtXC1yYWRpeD1cZklyYWRpeCIKLVVzZSBcZklyYWRpeFxmUCBhcyB0aGUgcmFkaXggZm9yIHByaW50aW5nIHRoZSBzeW1ib2wgdmFsdWVzLiAgSXQgbXVzdCBiZQotYGBkJycgZm9yIGRlY2ltYWwsIGBgbycnIGZvciBvY3RhbCwgb3IgYGB4JycgZm9yIGhleGFkZWNpbWFsLgotCi0uVFAKLS5CSSAiXC1cLXRhcmdldD0iICJiZmRuYW1lIgotU3BlY2lmeSBhbiBvYmplY3QgY29kZSBmb3JtYXQgb3RoZXIgdGhhbiB5b3VyIHN5c3RlbSdzIGRlZmF1bHQgZm9ybWF0LgotU2VlIAotLkJSIG9iamR1bXAgKCAxICksCi1mb3IgaW5mb3JtYXRpb24gb24gbGlzdGluZyBhdmFpbGFibGUgZm9ybWF0cy4KLQotLlRQCi0uQiBcLXUKLS5UUAotLkIgXC1cLXVuZGVmaW5lZFwtb25seSAKLURpc3BsYXkgb25seSB1bmRlZmluZWQgc3ltYm9scyAodGhvc2UgZXh0ZXJuYWwgdG8gZWFjaCBvYmplY3QgZmlsZSkuCi0KLS5UUAotLkIgXC1sCi0uVFAKLS5CIFwtXC1saW5lXC1udW1iZXJzCi1Gb3IgZWFjaCBzeW1ib2wsIHVzZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gdHJ5IHRvIGZpbmQgYSBmaWxlbmFtZSBhbmQKLWxpbmUgbnVtYmVyLiAgRm9yIGEgZGVmaW5lZCBzeW1ib2wsIGxvb2sgZm9yIHRoZSBsaW5lIG51bWJlciBvZiB0aGUKLWFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4gIEZvciBhbiB1bmRlZmluZWQgc3ltYm9sLCBsb29rIGZvciB0aGUgbGluZQotbnVtYmVyIG9mIGEgcmVsb2NhdGlvbiBlbnRyeSB3aGljaCByZWZlcnMgdG8gdGhlIHN5bWJvbC4gIElmIGxpbmUgbnVtYmVyCi1pbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQsIHByaW50IGl0IGFmdGVyIHRoZSBvdGhlciBzeW1ib2wgaW5mb3JtYXRpb24uCi0KLS5UUAotLkIgXC1WCi0uVFAKLS5CIFwtXC12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZgotLkIgbm0KLWFuZCBleGl0LgotCi0uVFAKLS5CIFwtXC1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0bwotLkIgbm0KLWFuZCBleGl0LgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsKLS5CUiBhciAiKCIgMSAiKSwiCi0uQlIgb2JqZHVtcCAoIDEgKSwKLS5CUiByYW5saWIgIigiIDEgIikuIgotCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25tLmMgYi9iaW51dGlscy9ubS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTFiN2ZiLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU4ICswLDAgQEAKLS8qIG5tLmMgLS0gRGVzY3JpYmUgc3ltYm9sIHRhYmxlIG9mIGEgcmVsIGZpbGUuCi0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAicHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9yYW5saWIuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0vKiBXaGVuIHNvcnRpbmcgYnkgc2l6ZSwgd2UgdXNlIHRoaXMgc3RydWN0dXJlIHRvIGhvbGQgdGhlIHNpemUgYW5kIGEKLSAgIHBvaW50ZXIgdG8gdGhlIG1pbmlzeW1ib2wuICAqLwotCi1zdHJ1Y3Qgc2l6ZV9zeW0KLXsKLSAgY29uc3QgUFRSIG1pbmlzeW07Ci0gIGJmZF92bWEgc2l6ZTsKLX07Ci0KLS8qIFdoZW4gZmV0Y2hpbmcgcmVsb2NzLCB3ZSB1c2UgdGhpcyBzdHJ1Y3R1cmUgdG8gcGFzcyBpbmZvcm1hdGlvbiB0bwotICAgZ2V0X3JlbG9jcy4gICovCi0KLXN0cnVjdCBnZXRfcmVsb2NzX2luZm8KLXsKLSAgYXNlY3Rpb24gKipzZWNzOwotICBhcmVsZW50ICoqKnJlbG9jczsKLSAgbG9uZyAqcmVsY291bnQ7Ci0gIGFzeW1ib2wgKipzeW1zOwotfTsKLQotc3RhdGljIHZvaWQKLXVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1zZXRfcHJpbnRfcmFkaXggUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zZXRfb3V0cHV0X2Zvcm1hdCBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfYXJjaGl2ZSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotZGlzcGxheV9maWxlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X3JlbF9maWxlIFBBUkFNUyAoKGJmZCAqIGZpbGUsIGJmZCAqIGFyY2hpdmUpKTsKLQotc3RhdGljIGxvbmcKLWZpbHRlcl9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIsIGxvbmcsIHVuc2lnbmVkIGludCkpOwotCi1zdGF0aWMgbG9uZwotc29ydF9zeW1ib2xzX2J5X3NpemUgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiwgbG9uZywgdW5zaWduZWQgaW50LAotCQkJICAgICAgc3RydWN0IHNpemVfc3ltICoqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIsIGxvbmcsIHVuc2lnbmVkIGludCwgYmZkICopKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3NpemVfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgc3RydWN0IHNpemVfc3ltICosIGxvbmcsIGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1kZWZfZW50cnkgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi0vKiBUaGUgc29ydGluZyBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgaW50Ci1udW1lcmljX2ZvcndhcmQgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotc3RhdGljIGludAotbnVtZXJpY19yZXZlcnNlIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyBpbnQKLW5vbl9udW1lcmljX2ZvcndhcmQgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotc3RhdGljIGludAotbm9uX251bWVyaWNfcmV2ZXJzZSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi1zdGF0aWMgaW50Ci1zaXplX2ZvcndhcmQxIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyBpbnQKLXNpemVfZm9yd2FyZDIgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotLyogVGhlIG91dHB1dCBmb3JtYXR0aW5nIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9vYmplY3RfZmlsZW5hbWVfYnNkIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9vYmplY3RfZmlsZW5hbWVfc3lzdiBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX3Bvc2l4IFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfZmlsZW5hbWVfYnNkIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX2ZpbGVuYW1lX3N5c3YgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfZmlsZW5hbWVfcG9zaXggUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9tZW1iZXJfYnNkIFBBUkFNUyAoKGNoYXIgKmFyY2hpdmUsIENPTlNUIGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX21lbWJlcl9zeXN2IFBBUkFNUyAoKGNoYXIgKmFyY2hpdmUsIENPTlNUIGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX21lbWJlcl9wb3NpeCBQQVJBTVMgKChjaGFyICphcmNoaXZlLCBDT05TVCBjaGFyICpmaWxlbmFtZSkpOwotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfYnNkIFBBUkFNUyAoKGJmZCAqIGFyY2hpdmVfYmZkLCBiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfc3lzdiBQQVJBTVMgKChiZmQgKiBhcmNoaXZlX2JmZCwgYmZkICogYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2ZpbGVuYW1lX3Bvc2l4IFBBUkFNUyAoKGJmZCAqIGFyY2hpdmVfYmZkLCBiZmQgKiBhYmZkKSk7Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X3ZhbHVlIFBBUkFNUyAoKGJmZF92bWEpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9pbmZvX2JzZCBQQVJBTVMgKChzeW1ib2xfaW5mbyAqIGluZm8sIGJmZCAqIGFiZmQpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9pbmZvX3N5c3YgUEFSQU1TICgoc3ltYm9sX2luZm8gKiBpbmZvLCBiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfaW5mb19wb3NpeCBQQVJBTVMgKChzeW1ib2xfaW5mbyAqIGluZm8sIGJmZCAqIGFiZmQpKTsKLQotc3RhdGljIHZvaWQKLWdldF9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi0vKiBTdXBwb3J0IGZvciBkaWZmZXJlbnQgb3V0cHV0IGZvcm1hdHMuICAqLwotc3RydWN0IG91dHB1dF9mbnMKLSAgewotICAgIC8qIFByaW50IHRoZSBuYW1lIG9mIGFuIG9iamVjdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotICAgIHZvaWQgKCpwcmludF9vYmplY3RfZmlsZW5hbWUpIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSAgICAvKiBQcmludCB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIGZpbGUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gICovCi0gICAgdm9pZCAoKnByaW50X2FyY2hpdmVfZmlsZW5hbWUpIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSAgICAvKiBQcmludCB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIG1lbWJlciBmaWxlLiAgKi8KLSAgICB2b2lkICgqcHJpbnRfYXJjaGl2ZV9tZW1iZXIpIFBBUkFNUyAoKGNoYXIgKmFyY2hpdmUsIENPTlNUIGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSAgICAvKiBQcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSAoYW5kIGFyY2hpdmUsIGlmIHRoZXJlIGlzIG9uZSkKLSAgICAgICBjb250YWluaW5nIGEgc3ltYm9sLiAgKi8KLSAgICB2b2lkICgqcHJpbnRfc3ltYm9sX2ZpbGVuYW1lKSBQQVJBTVMgKChiZmQgKiBhcmNoaXZlX2JmZCwgYmZkICogYWJmZCkpOwotCi0gICAgLyogUHJpbnQgYSBsaW5lIG9mIGluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sLiAgKi8KLSAgICB2b2lkICgqcHJpbnRfc3ltYm9sX2luZm8pIFBBUkFNUyAoKHN5bWJvbF9pbmZvICogaW5mbywgYmZkICogYWJmZCkpOwotICB9Owotc3RhdGljIHN0cnVjdCBvdXRwdXRfZm5zIGZvcm1hdHNbXSA9Ci17Ci0gIHtwcmludF9vYmplY3RfZmlsZW5hbWVfYnNkLAotICAgcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9ic2QsCi0gICBwcmludF9hcmNoaXZlX21lbWJlcl9ic2QsCi0gICBwcmludF9zeW1ib2xfZmlsZW5hbWVfYnNkLAotICAgcHJpbnRfc3ltYm9sX2luZm9fYnNkfSwKLSAge3ByaW50X29iamVjdF9maWxlbmFtZV9zeXN2LAotICAgcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9zeXN2LAotICAgcHJpbnRfYXJjaGl2ZV9tZW1iZXJfc3lzdiwKLSAgIHByaW50X3N5bWJvbF9maWxlbmFtZV9zeXN2LAotICAgcHJpbnRfc3ltYm9sX2luZm9fc3lzdn0sCi0gIHtwcmludF9vYmplY3RfZmlsZW5hbWVfcG9zaXgsCi0gICBwcmludF9hcmNoaXZlX2ZpbGVuYW1lX3Bvc2l4LAotICAgcHJpbnRfYXJjaGl2ZV9tZW1iZXJfcG9zaXgsCi0gICBwcmludF9zeW1ib2xfZmlsZW5hbWVfcG9zaXgsCi0gICBwcmludF9zeW1ib2xfaW5mb19wb3NpeH0KLX07Ci0KLS8qIEluZGljZXMgaW4gYGZvcm1hdHMnLiAgKi8KLSNkZWZpbmUgRk9STUFUX0JTRCAwCi0jZGVmaW5lIEZPUk1BVF9TWVNWIDEKLSNkZWZpbmUgRk9STUFUX1BPU0lYIDIKLSNkZWZpbmUgRk9STUFUX0RFRkFVTFQgRk9STUFUX0JTRAotCi0vKiBUaGUgb3V0cHV0IGZvcm1hdCB0byB1c2UuICAqLwotc3RhdGljIHN0cnVjdCBvdXRwdXRfZm5zICpmb3JtYXQgPSAmZm9ybWF0c1tGT1JNQVRfREVGQVVMVF07Ci0KLQotLyogQ29tbWFuZCBvcHRpb25zLiAgKi8KLQotc3RhdGljIGludCBkb19kZW1hbmdsZSA9IDA7CS8qIFByZXR0eSBwcmludCBDKysgc3ltYm9sIG5hbWVzLiAgKi8KLXN0YXRpYyBpbnQgZXh0ZXJuYWxfb25seSA9IDA7CS8qIHByaW50IGV4dGVybmFsIHN5bWJvbHMgb25seSAqLwotc3RhdGljIGludCBkZWZpbmVkX29ubHkgPSAwOwkvKiBQcmludCBkZWZpbmVkIHN5bWJvbHMgb25seSAqLwotc3RhdGljIGludCBub19zb3J0ID0gMDsJCS8qIGRvbid0IHNvcnQ7IHByaW50IHN5bXMgaW4gb3JkZXIgZm91bmQgKi8KLXN0YXRpYyBpbnQgcHJpbnRfZGVidWdfc3ltcyA9IDA7CS8qIHByaW50IGRlYnVnZ2VyLW9ubHkgc3ltYm9scyB0b28gKi8KLXN0YXRpYyBpbnQgcHJpbnRfYXJtYXAgPSAwOwkvKiBkZXNjcmliZSBfXy5TWU1ERUYgZGF0YSBpbiBhcmNoaXZlIGZpbGVzLiAgKi8KLXN0YXRpYyBpbnQgcmV2ZXJzZV9zb3J0ID0gMDsJLyogc29ydCBpbiBkb3dud2FyZChhbHBoYSBvciBudW1lcmljKSBvcmRlciAqLwotc3RhdGljIGludCBzb3J0X251bWVyaWNhbGx5ID0gMDsJLyogc29ydCBpbiBudW1lcmljIHJhdGhlciB0aGFuIGFscGhhIG9yZGVyICovCi1zdGF0aWMgaW50IHNvcnRfYnlfc2l6ZSA9IDA7CS8qIHNvcnQgYnkgc2l6ZSBvZiBzeW1ib2wgKi8KLXN0YXRpYyBpbnQgdW5kZWZpbmVkX29ubHkgPSAwOwkvKiBwcmludCB1bmRlZmluZWQgc3ltYm9scyBvbmx5ICovCi1zdGF0aWMgaW50IGR5bmFtaWMgPSAwOwkJLyogcHJpbnQgZHluYW1pYyBzeW1ib2xzLiAgKi8KLXN0YXRpYyBpbnQgc2hvd192ZXJzaW9uID0gMDsJLyogc2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgKi8KLXN0YXRpYyBpbnQgc2hvd19zdGF0cyA9IDA7CS8qIHNob3cgc3RhdGlzdGljcyAqLwotc3RhdGljIGludCBsaW5lX251bWJlcnMgPSAwOwkvKiBwcmludCBsaW5lIG51bWJlcnMgZm9yIHN5bWJvbHMgKi8KLQotLyogV2hlbiB0byBwcmludCB0aGUgbmFtZXMgb2YgZmlsZXMuICBOb3QgbXV0dWFsbHkgZXhjbHVzaXZlIGluIFNZU1YgZm9ybWF0LiAgKi8KLXN0YXRpYyBpbnQgZmlsZW5hbWVfcGVyX2ZpbGUgPSAwOwkvKiBPbmNlIHBlciBmaWxlLCBvbiBpdHMgb3duIGxpbmUuICAqLwotc3RhdGljIGludCBmaWxlbmFtZV9wZXJfc3ltYm9sID0gMDsJLyogT25jZSBwZXIgc3ltYm9sLCBhdCBzdGFydCBvZiBsaW5lLiAgKi8KLQotLyogUHJpbnQgZm9ybWF0cyBmb3IgcHJpbnRpbmcgYSBzeW1ib2wgdmFsdWUuICAqLwotI2lmbmRlZiBCRkQ2NAotc3RhdGljIGNoYXIgdmFsdWVfZm9ybWF0W10gPSAiJTA4bHgiOwotI2Vsc2UKLSNpZiBCRkRfSE9TVF82NEJJVF9MT05HCi1zdGF0aWMgY2hhciB2YWx1ZV9mb3JtYXRbXSA9ICIlMDE2bHgiOwotI2Vsc2UKLS8qIFdlIGRvbid0IHVzZSB2YWx1ZV9mb3JtYXQgZm9yIHRoaXMgY2FzZS4gICovCi0jZW5kaWYKLSNlbmRpZgotc3RhdGljIGludCBwcmludF9yYWRpeCA9IDE2OwotLyogUHJpbnQgZm9ybWF0cyBmb3IgcHJpbnRpbmcgc3RhYiBpbmZvLiAgKi8KLXN0YXRpYyBjaGFyIG90aGVyX2Zvcm1hdFtdID0gIiUwMngiOwotc3RhdGljIGNoYXIgZGVzY19mb3JtYXRbXSA9ICIlMDR4IjsKLQotc3RhdGljIGNoYXIgKnRhcmdldCA9IE5VTEw7Ci0KLS8qIFVzZWQgdG8gY2FjaGUgdGhlIGxpbmUgbnVtYmVycyBmb3IgYSBCRkQuICAqLwotc3RhdGljIGJmZCAqbGluZW5vX2NhY2hlX2JmZDsKLXN0YXRpYyBiZmQgKmxpbmVub19jYWNoZV9yZWxfYmZkOwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsiZGVidWctc3ltcyIsIG5vX2FyZ3VtZW50LCAmcHJpbnRfZGVidWdfc3ltcywgMX0sCi0gIHsiZGVtYW5nbGUiLCBub19hcmd1bWVudCwgJmRvX2RlbWFuZ2xlLCAxfSwKLSAgeyJkeW5hbWljIiwgbm9fYXJndW1lbnQsICZkeW5hbWljLCAxfSwKLSAgeyJleHRlcm4tb25seSIsIG5vX2FyZ3VtZW50LCAmZXh0ZXJuYWxfb25seSwgMX0sCi0gIHsiZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdmJ30sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICB7ImxpbmUtbnVtYmVycyIsIG5vX2FyZ3VtZW50LCAwLCAnbCd9LAotICB7Im5vLWNwbHVzIiwgbm9fYXJndW1lbnQsICZkb19kZW1hbmdsZSwgMH0sICAvKiBMaW51eCBjb21wYXRpYmlsaXR5LiAgKi8KLSAgeyJuby1kZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCAmZG9fZGVtYW5nbGUsIDB9LAotICB7Im5vLXNvcnQiLCBub19hcmd1bWVudCwgJm5vX3NvcnQsIDF9LAotICB7Im51bWVyaWMtc29ydCIsIG5vX2FyZ3VtZW50LCAmc29ydF9udW1lcmljYWxseSwgMX0sCi0gIHsicG9ydGFiaWxpdHkiLCBub19hcmd1bWVudCwgMCwgJ1AnfSwKLSAgeyJwcmludC1hcm1hcCIsIG5vX2FyZ3VtZW50LCAmcHJpbnRfYXJtYXAsIDF9LAotICB7InByaW50LWZpbGUtbmFtZSIsIG5vX2FyZ3VtZW50LCAwLCAnbyd9LAotICB7InJhZGl4IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICd0J30sCi0gIHsicmV2ZXJzZS1zb3J0Iiwgbm9fYXJndW1lbnQsICZyZXZlcnNlX3NvcnQsIDF9LAotICB7InNpemUtc29ydCIsIG5vX2FyZ3VtZW50LCAmc29ydF9ieV9zaXplLCAxfSwKLSAgeyJzdGF0cyIsIG5vX2FyZ3VtZW50LCAmc2hvd19zdGF0cywgMX0sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIDIwMH0sCi0gIHsiZGVmaW5lZC1vbmx5Iiwgbm9fYXJndW1lbnQsICZkZWZpbmVkX29ubHksIDF9LAotICB7InVuZGVmaW5lZC1vbmx5Iiwgbm9fYXJndW1lbnQsICZ1bmRlZmluZWRfb25seSwgMX0sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAmc2hvd192ZXJzaW9uLCAxfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQwKLS8qIFNvbWUgZXJyb3ItcmVwb3J0aW5nIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotVXNhZ2U6ICVzIFstYUFCQ0RnbG5vcFByc3V2Vl0gWy10IHJhZGl4XSBbLS1yYWRpeD1yYWRpeF0gWy0tdGFyZ2V0PWJmZG5hbWVdXG5cCi0gICAgICAgWy0tZGVidWctc3ltc10gWy0tZXh0ZXJuLW9ubHldIFstLXByaW50LWFybWFwXSBbLS1wcmludC1maWxlLW5hbWVdXG5cCi0gICAgICAgWy0tbnVtZXJpYy1zb3J0XSBbLS1uby1zb3J0XSBbLS1yZXZlcnNlLXNvcnRdIFstLXNpemUtc29ydF1cblwKLSAgICAgICBbLS11bmRlZmluZWQtb25seV0gWy0tcG9ydGFiaWxpdHldIFstZiB7YnNkLHN5c3YscG9zaXh9XVxuXAotICAgICAgIFstLWZvcm1hdD17YnNkLHN5c3YscG9zaXh9XSBbLS1kZW1hbmdsZV0gWy0tbm8tZGVtYW5nbGVdIFstLWR5bmFtaWNdXG5cCi0gICAgICAgWy0tZGVmaW5lZC1vbmx5XSBbLS1saW5lLW51bWJlcnNdXG5cCi0gICAgICAgWy0tdmVyc2lvbl0gWy0taGVscF1cblwKLSAgICAgICBbZmlsZS4uLl1cbiIpLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLS8qIFNldCB0aGUgcmFkaXggZm9yIHRoZSBzeW1ib2wgdmFsdWUgYW5kIHNpemUgYWNjb3JkaW5nIHRvIFJBRElYLiAgKi8KLQotc3RhdGljIHZvaWQKLXNldF9wcmludF9yYWRpeCAocmFkaXgpCi0gICAgIGNoYXIgKnJhZGl4OwotewotICBzd2l0Y2ggKCpyYWRpeCkKLSAgICB7Ci0gICAgY2FzZSAneCc6Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdvJzoKLSAgICAgIGlmICgqcmFkaXggPT0gJ2QnKQotCXByaW50X3JhZGl4ID0gMTA7Ci0gICAgICBlbHNlCi0JcHJpbnRfcmFkaXggPSA4OwotI2lmbmRlZiBCRkQ2NAotICAgICAgdmFsdWVfZm9ybWF0WzRdID0gKnJhZGl4OwotI2Vsc2UKLSNpZiBCRkRfSE9TVF82NEJJVF9MT05HCi0gICAgICB2YWx1ZV9mb3JtYXRbNV0gPSAqcmFkaXg7Ci0jZWxzZQotICAgICAgLyogVGhpcyBjYXNlIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG9jdGFsIGFuZCBkZWNpbWFsCi0gICAgICAgICBwcmludGluZy4gICovCi0jZW5kaWYKLSNlbmRpZgotICAgICAgb3RoZXJfZm9ybWF0WzNdID0gZGVzY19mb3JtYXRbM10gPSAqcmFkaXg7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IGludmFsaWQgcmFkaXhcbiIpLCBwcm9ncmFtX25hbWUsIHJhZGl4KTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNldF9vdXRwdXRfZm9ybWF0IChmKQotICAgICBjaGFyICpmOwotewotICBpbnQgaTsKLQotICBzd2l0Y2ggKCpmKQotICAgIHsKLSAgICBjYXNlICdiJzoKLSAgICBjYXNlICdCJzoKLSAgICAgIGkgPSBGT1JNQVRfQlNEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBpID0gRk9STUFUX1BPU0lYOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBpID0gRk9STUFUX1NZU1Y7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IGludmFsaWQgb3V0cHV0IGZvcm1hdFxuIiksIHByb2dyYW1fbmFtZSwgZik7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIGZvcm1hdCA9ICZmb3JtYXRzW2ldOwotfQotDAotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBjOwotICBpbnQgcmV0dmFsOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gKmFyZ3Y7Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBTVEFSVF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lLCAwKTsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImFBQkNEZWY6Z2xub3BQcnN0OnV2ViIsIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnYSc6Ci0JICBwcmludF9kZWJ1Z19zeW1zID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ0EnOgotCWNhc2UgJ28nOgotCSAgZmlsZW5hbWVfcGVyX3N5bWJvbCA9IDE7Ci0JICBicmVhazsKLQljYXNlICdCJzoJCS8qIEZvciBNSVBTIGNvbXBhdGliaWxpdHkuICAqLwotCSAgc2V0X291dHB1dF9mb3JtYXQgKCJic2QiKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0MnOgotCSAgZG9fZGVtYW5nbGUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnRCc6Ci0JICBkeW5hbWljID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgLyogSWdub3JlZCBmb3IgSFAvVVggY29tcGF0aWJpbGl0eS4gICovCi0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIHNldF9vdXRwdXRfZm9ybWF0IChvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnZyc6Ci0JICBleHRlcm5hbF9vbmx5ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JY2FzZSAnbCc6Ci0JICBsaW5lX251bWJlcnMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnbic6Ci0JY2FzZSAndic6Ci0JICBzb3J0X251bWVyaWNhbGx5ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgbm9fc29ydCA9IDE7Ci0JICBicmVhazsKLQljYXNlICdQJzoKLQkgIHNldF9vdXRwdXRfZm9ybWF0ICgicG9zaXgiKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgcmV2ZXJzZV9zb3J0ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgcHJpbnRfYXJtYXAgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICBzZXRfcHJpbnRfcmFkaXggKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICd1JzoKLQkgIHVuZGVmaW5lZF9vbmx5ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgc2hvd192ZXJzaW9uID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAyMDA6CQkvKiAtLXRhcmdldCAqLwotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQljYXNlIDA6CQkvKiBBIGxvbmcgb3B0aW9uIHRoYXQganVzdCBzZXRzIGEgZmxhZy4gICovCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICB1c2FnZSAoc3RkZXJyLCAxKTsKLQl9Ci0gICAgfQotCi0gIGlmIChzaG93X3ZlcnNpb24pCi0gICAgcHJpbnRfdmVyc2lvbiAoIm5tIik7Ci0KLSAgLyogT0ssIGFsbCBvcHRpb25zIG5vdyBwYXJzZWQuICBJZiBubyBmaWxlbmFtZSBzcGVjaWZpZWQsIGRvIGEub3V0LiAgKi8KLSAgaWYgKG9wdGluZCA9PSBhcmdjKQotICAgIHJldHVybiAhZGlzcGxheV9maWxlICgiYS5vdXQiKTsKLQotICByZXR2YWwgPSAwOwotCi0gIGlmIChhcmdjIC0gb3B0aW5kID4gMSkKLSAgICBmaWxlbmFtZV9wZXJfZmlsZSA9IDE7Ci0KLSAgLyogV2Ugd2VyZSBnaXZlbiBzZXZlcmFsIGZpbGVuYW1lcyB0byBkby4gICovCi0gIHdoaWxlIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIFBST0dSRVNTICgxKTsKLSAgICAgIGlmICghZGlzcGxheV9maWxlIChhcmd2W29wdGluZCsrXSkpCi0JcmV0dmFsKys7Ci0gICAgfQotCi0gIEVORF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lKTsKLQotI2lmZGVmIEhBVkVfU0JSSwotICBpZiAoc2hvd19zdGF0cykKLSAgICB7Ci0gICAgICBjaGFyICpsaW0gPSAoY2hhciAqKSBzYnJrICgwKTsKLQotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZGF0YSBzaXplICVsZFxuIiksIHByb2dyYW1fbmFtZSwKLQkgICAgICAgKGxvbmcpIChsaW0gLSAoY2hhciAqKSAmZW52aXJvbikpOwotICAgIH0KLSNlbmRpZgotCi0gIGV4aXQgKHJldHZhbCk7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0MCi1zdGF0aWMgdm9pZAotZGlzcGxheV9hcmNoaXZlIChmaWxlKQotICAgICBiZmQgKmZpbGU7Ci17Ci0gIGJmZCAqYXJmaWxlID0gTlVMTDsKLSAgYmZkICpsYXN0X2FyZmlsZSA9IE5VTEw7Ci0gIGNoYXIgKiptYXRjaGluZzsKLQotICAoKmZvcm1hdC0+cHJpbnRfYXJjaGl2ZV9maWxlbmFtZSkgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKLQotICBpZiAocHJpbnRfYXJtYXApCi0gICAgcHJpbnRfc3ltZGVmX2VudHJ5IChmaWxlKTsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIFBST0dSRVNTICgxKTsKLQotICAgICAgYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZmlsZSwgYXJmaWxlKTsKLQotICAgICAgaWYgKGFyZmlsZSA9PSBOVUxMKQotCXsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKQotCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYXJmaWxlLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotCXsKLQkgICgqZm9ybWF0LT5wcmludF9hcmNoaXZlX21lbWJlcikgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpLAotCQkJCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhcmZpbGUpKTsKLQkgIGRpc3BsYXlfcmVsX2ZpbGUgKGFyZmlsZSwgZmlsZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYXJmaWxlKSk7Ci0JICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCSAgICB7Ci0JICAgICAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICAgICAgZnJlZSAobWF0Y2hpbmcpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobGFzdF9hcmZpbGUgIT0gTlVMTCkKLQl7Ci0JICBiZmRfY2xvc2UgKGxhc3RfYXJmaWxlKTsKLQkgIGxpbmVub19jYWNoZV9iZmQgPSBOVUxMOwotCSAgbGluZW5vX2NhY2hlX3JlbF9iZmQgPSBOVUxMOwotCX0KLSAgICAgIGxhc3RfYXJmaWxlID0gYXJmaWxlOwotICAgIH0KLQotICBpZiAobGFzdF9hcmZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfY2xvc2UgKGxhc3RfYXJmaWxlKTsKLSAgICAgIGxpbmVub19jYWNoZV9iZmQgPSBOVUxMOwotICAgICAgbGluZW5vX2NhY2hlX3JlbF9iZmQgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGJvb2xlYW4KLWRpc3BsYXlfZmlsZSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBib29sZWFuIHJldHZhbCA9IHRydWU7Ci0gIGJmZCAqZmlsZTsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGZpbGUgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoZmlsZW5hbWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZmlsZSwgYmZkX2FyY2hpdmUpKQotICAgIHsKLSAgICAgIGRpc3BsYXlfYXJjaGl2ZSAoZmlsZSk7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGZpbGUsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgKCpmb3JtYXQtPnByaW50X29iamVjdF9maWxlbmFtZSkgKGZpbGVuYW1lKTsKLSAgICAgIGRpc3BsYXlfcmVsX2ZpbGUgKGZpbGUsIE5VTEwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoZmlsZW5hbWUpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICByZXR2YWwgPSBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9jbG9zZSAoZmlsZSkgPT0gZmFsc2UpCi0gICAgYmZkX2ZhdGFsIChmaWxlbmFtZSk7Ci0KLSAgbGluZW5vX2NhY2hlX2JmZCA9IE5VTEw7Ci0gIGxpbmVub19jYWNoZV9yZWxfYmZkID0gTlVMTDsKLQotICByZXR1cm4gcmV0dmFsOwotfQotDAotLyogVGhlc2UgZ2xvYmFscyBhcmUgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIGludG8gdGhlIHNvcnRpbmcKLSAgIHJvdXRpbmVzLiAgKi8KLXN0YXRpYyBiZmQgKnNvcnRfYmZkOwotc3RhdGljIGJvb2xlYW4gc29ydF9keW5hbWljOwotc3RhdGljIGFzeW1ib2wgKnNvcnRfeDsKLXN0YXRpYyBhc3ltYm9sICpzb3J0X3k7Ci0KLS8qIFN5bWJvbC1zb3J0aW5nIHByZWRpY2F0ZXMgKi8KLSNkZWZpbmUgdmFsdWVvZih4KSAoKHgpLT5zZWN0aW9uLT52bWEgKyAoeCktPnZhbHVlKQotCi0vKiBOdW1lcmljIHNvcnRzLiAgVW5kZWZpbmVkIHN5bWJvbHMgYXJlIGFsd2F5cyBjb25zaWRlcmVkICJsZXNzIHRoYW4iCi0gICBkZWZpbmVkIHN5bWJvbHMgd2l0aCB6ZXJvIHZhbHVlcy4gIENvbW1vbiBzeW1ib2xzIGFyZSBub3QgdHJlYXRlZAotICAgc3BlY2lhbGx5IC0tIGkuZS4sIHRoZWlyIHNpemVzIGFyZSB1c2VkIGFzIHRoZWlyICJ2YWx1ZXMiLiAgKi8KLQotc3RhdGljIGludAotbnVtZXJpY19mb3J3YXJkIChQX3gsIFBfeSkKLSAgICAgY29uc3QgUFRSIFBfeDsKLSAgICAgY29uc3QgUFRSIFBfeTsKLXsKLSAgYXN5bWJvbCAqeCwgKnk7Ci0gIGFzZWN0aW9uICp4cywgKnlzOwotCi0gIHggPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeCwgc29ydF94KTsKLSAgeSA9ICBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeSwgc29ydF95KTsKLSAgaWYgKHggPT0gTlVMTCB8fCB5ID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChzb3J0X2JmZCkpOwotCi0gIHhzID0gYmZkX2dldF9zZWN0aW9uICh4KTsKLSAgeXMgPSBiZmRfZ2V0X3NlY3Rpb24gKHkpOwotCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHhzKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKHlzKSkKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHlzKSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAodmFsdWVvZiAoeCkgIT0gdmFsdWVvZiAoeSkpCi0gICAgcmV0dXJuIHZhbHVlb2YgKHgpIDwgdmFsdWVvZiAoeSkgPyAtMSA6IDE7Ci0KLSAgcmV0dXJuIG5vbl9udW1lcmljX2ZvcndhcmQgKFBfeCwgUF95KTsKLX0KLQotc3RhdGljIGludAotbnVtZXJpY19yZXZlcnNlICh4LCB5KQotICAgICBjb25zdCBQVFIgeDsKLSAgICAgY29uc3QgUFRSIHk7Ci17Ci0gIHJldHVybiAtIG51bWVyaWNfZm9yd2FyZCAoeCwgeSk7Ci19Ci0KLXN0YXRpYyBpbnQKLW5vbl9udW1lcmljX2ZvcndhcmQgKFBfeCwgUF95KQotICAgICBjb25zdCBQVFIgUF94OwotICAgICBjb25zdCBQVFIgUF95OwotewotICBhc3ltYm9sICp4LCAqeTsKLSAgY29uc3QgY2hhciAqeG4sICp5bjsKLQotICB4ID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChzb3J0X2JmZCwgc29ydF9keW5hbWljLCBQX3gsIHNvcnRfeCk7Ci0gIHkgPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeSwgc29ydF95KTsKLSAgaWYgKHggPT0gTlVMTCB8fCB5ID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChzb3J0X2JmZCkpOwotCi0gIHhuID0gYmZkX2FzeW1ib2xfbmFtZSAoeCk7Ci0gIHluID0gYmZkX2FzeW1ib2xfbmFtZSAoeSk7Ci0KLSAgcmV0dXJuICgoeG4gPT0gTlVMTCkgPyAoKHluID09IE5VTEwpID8gMCA6IC0xKSA6Ci0JICAoKHluID09IE5VTEwpID8gMSA6IHN0cmNtcCAoeG4sIHluKSkpOwotfQotCi1zdGF0aWMgaW50Ci1ub25fbnVtZXJpY19yZXZlcnNlICh4LCB5KQotICAgICBjb25zdCBQVFIgeDsKLSAgICAgY29uc3QgUFRSIHk7Ci17Ci0gIHJldHVybiAtIG5vbl9udW1lcmljX2ZvcndhcmQgKHgsIHkpOwotfQotCi1zdGF0aWMgaW50ICgqKHNvcnRlcnNbMl1bMl0pKSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpID0KLXsKLSAgeyBub25fbnVtZXJpY19mb3J3YXJkLCBub25fbnVtZXJpY19yZXZlcnNlIH0sCi0gIHsgbnVtZXJpY19mb3J3YXJkLCBudW1lcmljX3JldmVyc2UgfQotfTsKLQotLyogVGhpcyBzb3J0IHJvdXRpbmUgaXMgdXNlZCBieSBzb3J0X3N5bWJvbHNfYnlfc2l6ZS4gIEl0IGlzIHNpbWlsYXIKLSAgIHRvIG51bWVyaWNfZm9yd2FyZCwgYnV0IHdoZW4gc3ltYm9scyBoYXZlIHRoZSBzYW1lIHZhbHVlIGl0IHNvcnRzCi0gICBieSBzZWN0aW9uIFZNQS4gIFRoaXMgc2ltcGxpZmllcyB0aGUgc29ydF9zeW1ib2xzX2J5X3NpemUgY29kZQotICAgd2hpY2ggaGFuZGxlcyBzeW1ib2xzIGF0IHRoZSBlbmQgb2Ygc2VjdGlvbnMuICBBbHNvLCB0aGlzIHJvdXRpbmUKLSAgIHRyaWVzIHRvIHNvcnQgZmlsZSBuYW1lcyBiZWZvcmUgb3RoZXIgc3ltYm9scyB3aXRoIHRoZSBzYW1lIHZhbHVlLgotICAgVGhhdCB3aWxsIG1ha2UgdGhlIGZpbGUgbmFtZSBoYXZlIGEgemVybyBzaXplLCB3aGljaCB3aWxsIG1ha2UKLSAgIHNvcnRfc3ltYm9sc19ieV9zaXplIGNob29zZSB0aGUgbm9uIGZpbGUgbmFtZSBzeW1ib2wsIGxlYWRpbmcgdG8KLSAgIG1vcmUgbWVhbmluZ2Z1bCBvdXRwdXQuICBGb3Igc2ltaWxhciByZWFzb25zLCB0aGlzIGNvZGUgc29ydHMKLSAgIGdudV9jb21waWxlZF8qIGFuZCBnY2MyX2NvbXBpbGVkIGJlZm9yZSBvdGhlciBzeW1ib2xzIHdpdGggdGhlIHNhbWUKLSAgIHZhbHVlLiAgKi8KLQotc3RhdGljIGludAotc2l6ZV9mb3J3YXJkMSAoUF94LCBQX3kpCi0gICAgIGNvbnN0IFBUUiBQX3g7Ci0gICAgIGNvbnN0IFBUUiBQX3k7Ci17Ci0gIGFzeW1ib2wgKngsICp5OwotICBhc2VjdGlvbiAqeHMsICp5czsKLSAgY29uc3QgY2hhciAqeG4sICp5bjsKLSAgc2l6ZV90IHhubCwgeW5sOwotICBpbnQgeGYsIHlmOwotCi0gIHggPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeCwgc29ydF94KTsKLSAgeSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoc29ydF9iZmQsIHNvcnRfZHluYW1pYywgUF95LCBzb3J0X3kpOwotICBpZiAoeCA9PSBOVUxMIHx8IHkgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKHNvcnRfYmZkKSk7Ci0KLSAgeHMgPSBiZmRfZ2V0X3NlY3Rpb24gKHgpOwotICB5cyA9IGJmZF9nZXRfc2VjdGlvbiAoeSk7Ci0KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoeHMpKQotICAgIGFib3J0ICgpOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uICh5cykpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHZhbHVlb2YgKHgpICE9IHZhbHVlb2YgKHkpKQotICAgIHJldHVybiB2YWx1ZW9mICh4KSA8IHZhbHVlb2YgKHkpID8gLTEgOiAxOwotCi0gIGlmICh4cy0+dm1hICE9IHlzLT52bWEpCi0gICAgcmV0dXJuIHhzLT52bWEgPCB5cy0+dm1hID8gLTEgOiAxOwotCi0gIHhuID0gYmZkX2FzeW1ib2xfbmFtZSAoeCk7Ci0gIHluID0gYmZkX2FzeW1ib2xfbmFtZSAoeSk7Ci0gIHhubCA9IHN0cmxlbiAoeG4pOwotICB5bmwgPSBzdHJsZW4gKHluKTsKLQotICAvKiBUaGUgc3ltYm9scyBnbnVfY29tcGlsZWQgYW5kIGdjYzJfY29tcGlsZWQgY29udmV5IGV2ZW4gbGVzcwotICAgICBpbmZvcm1hdGlvbiB0aGFuIHRoZSBmaWxlIG5hbWUsIHNvIHNvcnQgdGhlbSBvdXQgZmlyc3QuICAqLwotCi0gIHhmID0gKHN0cnN0ciAoeG4sICJnbnVfY29tcGlsZWQiKSAhPSBOVUxMCi0JfHwgc3Ryc3RyICh4biwgImdjYzJfY29tcGlsZWQiKSAhPSBOVUxMKTsKLSAgeWYgPSAoc3Ryc3RyICh5biwgImdudV9jb21waWxlZCIpICE9IE5VTEwKLQl8fCBzdHJzdHIgKHluLCAiZ2NjMl9jb21waWxlZCIpICE9IE5VTEwpOwotCi0gIGlmICh4ZiAmJiAhIHlmKQotICAgIHJldHVybiAtMTsKLSAgaWYgKCEgeGYgJiYgeWYpCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogV2UgdXNlIGEgaGV1cmlzdGljIGZvciB0aGUgZmlsZSBuYW1lLiAgSXQgbWF5IG5vdCB3b3JrIG9uIG5vbgotICAgICBVbml4IHN5c3RlbXMsIGJ1dCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXI7IHRoZSBvbmx5IGRpZmZlcmVuY2UKLSAgICAgaXMgcHJlY2lzZWx5IHdoaWNoIHN5bWJvbCBuYW1lcyBnZXQgcHJpbnRlZC4gICovCi0KLSNkZWZpbmUgZmlsZV9zeW1ib2wocywgc24sIHNubCkJCQlcCi0gICgoKHMpLT5mbGFncyAmIEJTRl9GSUxFKSAhPSAwCQkJXAotICAgfHwgKChzbilbKHNubCkgLSAyXSA9PSAnLicJCQlcCi0gICAgICAgJiYgKChzbilbKHNubCkgLSAxXSA9PSAnbycJCVwKLQkgICB8fCAoc24pWyhzbmwpIC0gMV0gPT0gJ2EnKSkpCi0KLSAgeGYgPSBmaWxlX3N5bWJvbCAoeCwgeG4sIHhubCk7Ci0gIHlmID0gZmlsZV9zeW1ib2wgKHksIHluLCB5bmwpOwotCi0gIGlmICh4ZiAmJiAhIHlmKQotICAgIHJldHVybiAtMTsKLSAgaWYgKCEgeGYgJiYgeWYpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIG5vbl9udW1lcmljX2ZvcndhcmQgKFBfeCwgUF95KTsKLX0KLQotLyogVGhpcyBzb3J0IHJvdXRpbmUgaXMgdXNlZCBieSBzb3J0X3N5bWJvbHNfYnlfc2l6ZS4gIEl0IGlzIHNvcnRpbmcKLSAgIGFuIGFycmF5IG9mIHNpemVfc3ltIHN0cnVjdHVyZXMgaW50byBzaXplIG9yZGVyLiAgKi8KLQotc3RhdGljIGludAotc2l6ZV9mb3J3YXJkMiAoUF94LCBQX3kpCi0gICAgIGNvbnN0IFBUUiBQX3g7Ci0gICAgIGNvbnN0IFBUUiBQX3k7Ci17Ci0gIGNvbnN0IHN0cnVjdCBzaXplX3N5bSAqeCA9IChjb25zdCBzdHJ1Y3Qgc2l6ZV9zeW0gKikgUF94OwotICBjb25zdCBzdHJ1Y3Qgc2l6ZV9zeW0gKnkgPSAoY29uc3Qgc3RydWN0IHNpemVfc3ltICopIFBfeTsKLQotICBpZiAoeC0+c2l6ZSA8IHktPnNpemUpCi0gICAgcmV0dXJuIHJldmVyc2Vfc29ydCA/IDEgOiAtMTsKLSAgZWxzZSBpZiAoeC0+c2l6ZSA+IHktPnNpemUpCi0gICAgcmV0dXJuIHJldmVyc2Vfc29ydCA/IC0xIDogMTsKLSAgZWxzZQotICAgIHJldHVybiBzb3J0ZXJzWzBdW3JldmVyc2Vfc29ydF0gKHgtPm1pbmlzeW0sIHktPm1pbmlzeW0pOwotfQotCi0vKiBTb3J0IHRoZSBzeW1ib2xzIGJ5IHNpemUuICBXZSBndWVzcyB0aGUgc2l6ZSBieSBhc3N1bWluZyB0aGF0IHRoZQotICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIGEgc3ltYm9sIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgIG5leHQgaGlnaGVyIHN5bWJvbCBpcyB0aGUgc2l6ZS4gIEZJWE1FOiBFTEYgYWN0dWFsbHkgc3RvcmVzIGEgc2l6ZQotICAgd2l0aCBlYWNoIHN5bWJvbC4gIFdlIHNob3VsZCB1c2UgaXQuICAqLwotCi1zdGF0aWMgbG9uZwotc29ydF9zeW1ib2xzX2J5X3NpemUgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSwgc3ltc2l6ZXNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgUFRSIG1pbmlzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgc3RydWN0IHNpemVfc3ltICoqc3ltc2l6ZXNwOwotewotICBzdHJ1Y3Qgc2l6ZV9zeW0gKnN5bXNpemVzOwotICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQ7Ci0gIGFzeW1ib2wgKnN5bSA9IE5VTEw7Ci0gIGFzeW1ib2wgKnN0b3JlX3N5bSwgKnN0b3JlX25leHQ7Ci0KLSAgcXNvcnQgKG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSwgc2l6ZV9mb3J3YXJkMSk7Ci0KLSAgLyogV2UgYXJlIGdvaW5nIHRvIHJldHVybiBhIHNwZWNpYWwgc2V0IG9mIHN5bWJvbHMgYW5kIHNpemVzIHRvCi0gICAgIHByaW50LiAgKi8KLSAgc3ltc2l6ZXMgPSAoc3RydWN0IHNpemVfc3ltICopIHhtYWxsb2MgKHN5bWNvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc2l6ZV9zeW0pKTsKLSAgKnN5bXNpemVzcCA9IHN5bXNpemVzOwotCi0gIC8qIE5vdGUgdGhhdCBmaWx0ZXJfc3ltYm9scyBoYXMgYWxyZWFkeSByZW1vdmVkIGFsbCBhYnNvbHV0ZSBhbmQKLSAgICAgdW5kZWZpbmVkIHN5bWJvbHMuICBIZXJlIHdlIHJlbW92ZSBhbGwgc3ltYm9scyB3aG9zZSBzaXplIHdpbmRzCi0gICAgIHVwIGFzIHplcm8uICAqLwotCi0gIGZyb20gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0gIGZyb21lbmQgPSBmcm9tICsgc3ltY291bnQgKiBzaXplOwotCi0gIHN0b3JlX3N5bSA9IHNvcnRfeDsKLSAgc3RvcmVfbmV4dCA9IHNvcnRfeTsKLQotICBpZiAoZnJvbSA8IGZyb21lbmQpCi0gICAgewotICAgICAgc3ltID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBkeW5hbWljLCAoY29uc3QgUFRSKSBmcm9tLAotCQkJCSAgICAgIHN0b3JlX3N5bSk7Ci0gICAgICBpZiAoc3ltID09IE5VTEwpCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgfQotCi0gIGZvciAoOyBmcm9tIDwgZnJvbWVuZDsgZnJvbSArPSBzaXplKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKm5leHQ7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgYmZkX3ZtYSBzejsKLSAgICAgIGFzeW1ib2wgKnRlbXA7Ci0KLSAgICAgIGlmIChmcm9tICsgc2l6ZSA8IGZyb21lbmQpCi0JewotCSAgbmV4dCA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwKLQkJCQkJICAgZHluYW1pYywKLQkJCQkJICAgKGNvbnN0IFBUUikgKGZyb20gKyBzaXplKSwKLQkJCQkJICAgc3RvcmVfbmV4dCk7Ci0JICBpZiAobmV4dCA9PSBOVUxMKQotCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQl9Ci0gICAgICBlbHNlCi0JbmV4dCA9IE5VTEw7Ci0KLSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltKTsKLQotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKLQlzeiA9IHN5bS0+dmFsdWU7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGZyb20gKyBzaXplIDwgZnJvbWVuZAotCSAgICAgICYmIHNlYyA9PSBiZmRfZ2V0X3NlY3Rpb24gKG5leHQpKQotCSAgICBzeiA9IHZhbHVlb2YgKG5leHQpIC0gdmFsdWVvZiAoc3ltKTsKLQkgIGVsc2UKLQkgICAgc3ogPSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCQkgICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKQotCQkgIC0gdmFsdWVvZiAoc3ltKSk7Ci0JfQotCi0gICAgICBpZiAoc3ogIT0gMCkKLQl7Ci0JICBzeW1zaXplcy0+bWluaXN5bSA9IChjb25zdCBQVFIpIGZyb207Ci0JICBzeW1zaXplcy0+c2l6ZSA9IHN6OwotCSAgKytzeW1zaXplczsKLQl9Ci0KLSAgICAgIHN5bSA9IG5leHQ7Ci0KLSAgICAgIHRlbXAgPSBzdG9yZV9zeW07Ci0gICAgICBzdG9yZV9zeW0gPSBzdG9yZV9uZXh0OwotICAgICAgc3RvcmVfbmV4dCA9IHRlbXA7Ci0gICAgfQotCi0gIHN5bWNvdW50ID0gc3ltc2l6ZXMgLSAqc3ltc2l6ZXNwOwotCi0gIC8qIFdlIG11c3Qgbm93IHNvcnQgYWdhaW4gYnkgc2l6ZS4gICovCi0gIHFzb3J0ICgoUFRSKSAqc3ltc2l6ZXNwLCBzeW1jb3VudCwgc2l6ZW9mIChzdHJ1Y3Qgc2l6ZV9zeW0pLCBzaXplX2ZvcndhcmQyKTsKLQotICByZXR1cm4gc3ltY291bnQ7Ci19Ci0MCi0vKiBJZiBBUkNISVZFX0JGRCBpcyBub24tTlVMTCwgaXQgaXMgdGhlIGFyY2hpdmUgY29udGFpbmluZyBBQkZELiAgKi8KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfcmVsX2ZpbGUgKGFiZmQsIGFyY2hpdmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZCAqYXJjaGl2ZV9iZmQ7Ci17Ci0gIGxvbmcgc3ltY291bnQ7Ci0gIFBUUiBtaW5pc3ltczsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIHN0cnVjdCBzaXplX3N5bSAqc3ltc2l6ZXM7Ci0KLSAgaWYgKCEgZHluYW1pYykKLSAgICB7Ci0gICAgICBpZiAoIShiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgSEFTX1NZTVMpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIHN5bWJvbHNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBzeW1jb3VudCA9IGJmZF9yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCAmbWluaXN5bXMsICZzaXplKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBpZiAoc3ltY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBzeW1ib2xzXG4iKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBEaXNjYXJkIHRoZSBzeW1ib2xzIHdlIGRvbid0IHdhbnQgdG8gcHJpbnQuCi0gICAgIEl0J3MgT0sgdG8gZG8gdGhpcyBpbiBwbGFjZTsgd2UnbGwgZnJlZSB0aGUgc3RvcmFnZSBhbnl3YXkKLSAgICAgKGFmdGVyIHByaW50aW5nKS4gICovCi0KLSAgc3ltY291bnQgPSBmaWx0ZXJfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplKTsKLQotICBzeW1zaXplcyA9IE5VTEw7Ci0gIGlmICghIG5vX3NvcnQpCi0gICAgewotICAgICAgc29ydF9iZmQgPSBhYmZkOwotICAgICAgc29ydF9keW5hbWljID0gZHluYW1pYzsKLSAgICAgIHNvcnRfeCA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gICAgICBzb3J0X3kgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICAgICAgaWYgKHNvcnRfeCA9PSBOVUxMIHx8IHNvcnRfeSA9PSBOVUxMKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBpZiAoISBzb3J0X2J5X3NpemUpCi0JcXNvcnQgKG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSwKLQkgICAgICAgc29ydGVyc1tzb3J0X251bWVyaWNhbGx5XVtyZXZlcnNlX3NvcnRdKTsKLSAgICAgIGVsc2UKLQlzeW1jb3VudCA9IHNvcnRfc3ltYm9sc19ieV9zaXplIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltcywgc3ltY291bnQsCi0JCQkJCSBzaXplLCAmc3ltc2l6ZXMpOwotICAgIH0KLQotICBpZiAoISBzb3J0X2J5X3NpemUpCi0gICAgcHJpbnRfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplLCBhcmNoaXZlX2JmZCk7Ci0gIGVsc2UKLSAgICBwcmludF9zaXplX3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIHN5bXNpemVzLCBzeW1jb3VudCwgYXJjaGl2ZV9iZmQpOwotCi0gIGZyZWUgKG1pbmlzeW1zKTsKLX0KLQwKLS8qIENob29zZSB3aGljaCBzeW1ib2wgZW50cmllcyB0byBwcmludDsKLSAgIGNvbXBhY3QgdGhlbSBkb3dud2FyZCB0byBnZXQgcmlkIG9mIHRoZSByZXN0LgotICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0byBiZSBwcmludGVkLiAgKi8KLQotc3RhdGljIGxvbmcKLWZpbHRlcl9zeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBQVFIgbWluaXN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQsICp0bzsKLSAgYXN5bWJvbCAqc3RvcmU7Ci0KLSAgc3RvcmUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAoc3RvcmUgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBmcm9tID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOwotICBmcm9tZW5kID0gZnJvbSArIHN5bWNvdW50ICogc2l6ZTsKLSAgdG8gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0KLSAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tICs9IHNpemUpCi0gICAgewotICAgICAgaW50IGtlZXAgPSAwOwotICAgICAgYXN5bWJvbCAqc3ltOwotCi0gICAgICBQUk9HUkVTUyAoMSk7Ci0gICAgICAKLSAgICAgIHN5bSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgKGNvbnN0IFBUUikgZnJvbSwgc3RvcmUpOwotICAgICAgaWYgKHN5bSA9PSBOVUxMKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBpZiAodW5kZWZpbmVkX29ubHkpCi0Ja2VlcCA9IGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKTsKLSAgICAgIGVsc2UgaWYgKGV4dGVybmFsX29ubHkpCi0Ja2VlcCA9ICgoc3ltLT5mbGFncyAmIEJTRl9HTE9CQUwpICE9IDAKLQkJfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMAotCQl8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKLQkJfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKTsKLSAgICAgIGVsc2UKLQlrZWVwID0gMTsKLQotICAgICAgaWYgKGtlZXAKLQkgICYmICEgcHJpbnRfZGVidWdfc3ltcwotCSAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQotCWtlZXAgPSAwOwotCi0gICAgICBpZiAoa2VlcAotCSAgJiYgc29ydF9ieV9zaXplCi0JICAmJiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW0tPnNlY3Rpb24pCi0JICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKSkKLQlrZWVwID0gMDsKLQotICAgICAgaWYgKGtlZXAKLQkgICYmIGRlZmluZWRfb25seSkKLQl7Ci0JICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCSAgICBrZWVwID0gMDsKLQl9Ci0KLSAgICAgIGlmIChrZWVwKQotCXsKLQkgIG1lbWNweSAodG8sIGZyb20sIHNpemUpOwotCSAgdG8gKz0gc2l6ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAodG8gLSAoYmZkX2J5dGUgKikgbWluaXN5bXMpIC8gc2l6ZTsKLX0KLQwKLS8qIFByaW50IHN5bWJvbCBuYW1lIE5BTUUsIHJlYWQgZnJvbSBBQkZELCB3aXRoIHByaW50ZiBmb3JtYXQgRk9STUFULAotICAgZGVtYW5nbGluZyBpdCBpZiByZXF1ZXN0ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltbmFtZSAoZm9ybWF0LCBuYW1lLCBhYmZkKQotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGRvX2RlbWFuZ2xlICYmICpuYW1lKQotICAgIHsKLSAgICAgIGNoYXIgKnJlczsKLQotICAgICAgLyogSW4gdGhpcyBtb2RlLCBnaXZlIGEgdXNlci1sZXZlbCB2aWV3IG9mIHRoZSBzeW1ib2wgbmFtZQotCSBldmVuIGlmIGl0J3Mgbm90IG1hbmdsZWQ7IHN0cmlwIG9mZiBhbnkgbGVhZGluZwotCSB1bmRlcnNjb3JlLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09IG5hbWVbMF0pCi0JbmFtZSsrOwotCi0gICAgICByZXMgPSBjcGx1c19kZW1hbmdsZSAobmFtZSwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOwotICAgICAgaWYgKHJlcykKLQl7Ci0JICBwcmludGYgKGZvcm1hdCwgcmVzKTsKLQkgIGZyZWUgKHJlcyk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBwcmludGYgKGZvcm1hdCwgbmFtZSk7Ci19Ci0KLS8qIFByaW50IHRoZSBzeW1ib2xzLiAgSWYgQVJDSElWRV9CRkQgaXMgbm9uLU5VTEwsIGl0IGlzIHRoZSBhcmNoaXZlCi0gICBjb250YWluaW5nIEFCRkQuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplLCBhcmNoaXZlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIFBUUiBtaW5pc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJmZCAqYXJjaGl2ZV9iZmQ7Ci17Ci0gIGFzeW1ib2wgKnN0b3JlOwotICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQ7Ci0KLSAgc3RvcmUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAoc3RvcmUgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBmcm9tID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOwotICBmcm9tZW5kID0gZnJvbSArIHN5bWNvdW50ICogc2l6ZTsKLSAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tICs9IHNpemUpCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotCi0gICAgICBzeW0gPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIGZyb20sIHN0b3JlKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgcHJpbnRfc3ltYm9sIChhYmZkLCBzeW0sIGFyY2hpdmVfYmZkKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IHRoZSBzeW1ib2xzIHdoZW4gc29ydGluZyBieSBzaXplLiAgKi8KLQotc3RhdGljIHZvaWQgCi1wcmludF9zaXplX3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIHN5bXNpemVzLCBzeW1jb3VudCwgYXJjaGl2ZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBzdHJ1Y3Qgc2l6ZV9zeW0gKnN5bXNpemVzOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICBiZmQgKmFyY2hpdmVfYmZkOwotewotICBhc3ltYm9sICpzdG9yZTsKLSAgc3RydWN0IHNpemVfc3ltICpmcm9tLCAqZnJvbWVuZDsKLQotICBzdG9yZSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIGlmIChzdG9yZSA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGZyb20gPSBzeW1zaXplczsKLSAgZnJvbWVuZCA9IGZyb20gKyBzeW1jb3VudDsKLSAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotCi0gICAgICBzeW0gPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIGZyb20tPm1pbmlzeW0sIHN0b3JlKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgLyogU2V0IHRoZSBzeW1ib2wgdmFsdWUgc28gdGhhdCB3ZSBhY3R1YWxseSBkaXNwbGF5IHRoZSBzeW1ib2wKLSAgICAgICAgIHNpemUuICAqLwotICAgICAgc3ltLT52YWx1ZSA9IGZyb20tPnNpemUgLSBiZmRfc2VjdGlvbl92bWEgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSk7Ci0KLSAgICAgIHByaW50X3N5bWJvbCAoYWJmZCwgc3ltLCBhcmNoaXZlX2JmZCk7Ci0gICAgfQotfQotCi0vKiBQcmludCBhIHNpbmdsZSBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sIChhYmZkLCBzeW0sIGFyY2hpdmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgYmZkICphcmNoaXZlX2JmZDsKLXsKLSAgUFJPR1JFU1MgKDEpOwotCi0gICgqZm9ybWF0LT5wcmludF9zeW1ib2xfZmlsZW5hbWUpIChhcmNoaXZlX2JmZCwgYWJmZCk7Ci0KLSAgaWYgKHVuZGVmaW5lZF9vbmx5KQotICAgIHsKLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JcHJpbnRfc3ltbmFtZSAoIiVzIiwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgYWJmZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltYm9sX2luZm8gc3ltaW5mbzsKLQotICAgICAgYmZkX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltLCAmc3ltaW5mbyk7Ci0gICAgICAoKmZvcm1hdC0+cHJpbnRfc3ltYm9sX2luZm8pICgmc3ltaW5mbywgYWJmZCk7Ci0gICAgfQotCi0gIGlmIChsaW5lX251bWJlcnMpCi0gICAgewotICAgICAgc3RhdGljIGFzeW1ib2wgKipzeW1zOwotICAgICAgc3RhdGljIGxvbmcgc3ltY291bnQ7Ci0gICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgKmZ1bmN0aW9ubmFtZTsKLSAgICAgIHVuc2lnbmVkIGludCBsaW5lbm87Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gZ2V0IHRoZSBjYW5vbmljYWwgc3ltYm9scyBpbiBvcmRlciB0byBjYWxsCi0gICAgICAgICBiZmRfZmluZF9uZWFyZXN0X2xpbmUuICBUaGlzIGlzIGluZWZmaWNpZW50LCBidXQsIHRoZW4sIHlvdQotICAgICAgICAgZG9uJ3QgaGF2ZSB0byB1c2UgLS1saW5lLW51bWJlcnMuICAqLwotICAgICAgaWYgKGFiZmQgIT0gbGluZW5vX2NhY2hlX2JmZCAmJiBzeW1zICE9IE5VTEwpCi0JewotCSAgZnJlZSAoc3ltcyk7Ci0JICBzeW1zID0gTlVMTDsKLQl9Ci0gICAgICBpZiAoc3ltcyA9PSBOVUxMKQotCXsKLQkgIGxvbmcgc3ltc2l6ZTsKLQotCSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLQkgIGlmIChzeW1zaXplIDwgMCkKLQkgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICBzeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotCSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltcyk7Ci0JICBpZiAoc3ltY291bnQgPCAwKQotCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIGxpbmVub19jYWNoZV9iZmQgPSBhYmZkOwotCX0KLQotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQl7Ci0JICBzdGF0aWMgYXNlY3Rpb24gKipzZWNzOwotCSAgc3RhdGljIGFyZWxlbnQgKioqcmVsb2NzOwotCSAgc3RhdGljIGxvbmcgKnJlbGNvdW50OwotCSAgc3RhdGljIHVuc2lnbmVkIGludCBzZWNjb3VudDsKLQkgIHVuc2lnbmVkIGludCBpOwotCSAgY29uc3QgY2hhciAqc3ltbmFtZTsKLQotCSAgLyogRm9yIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHdlIHRyeSB0byBmaW5kIGEgcmVsb2MgZm9yIHRoZQotICAgICAgICAgICAgIHN5bWJvbCwgYW5kIHByaW50IHRoZSBsaW5lIG51bWJlciBvZiB0aGUgcmVsb2MuICAqLwotCi0JICBpZiAoYWJmZCAhPSBsaW5lbm9fY2FjaGVfcmVsX2JmZCAmJiByZWxvY3MgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWNjb3VudDsgaSsrKQotCQlpZiAocmVsb2NzW2ldICE9IE5VTEwpCi0JCSAgZnJlZSAocmVsb2NzW2ldKTsKLQkgICAgICBmcmVlIChzZWNzKTsKLQkgICAgICBmcmVlIChyZWxvY3MpOwotCSAgICAgIGZyZWUgKHJlbGNvdW50KTsKLQkgICAgICBzZWNzID0gTlVMTDsKLQkgICAgICByZWxvY3MgPSBOVUxMOwotCSAgICAgIHJlbGNvdW50ID0gTlVMTDsKLQkgICAgfQotCi0JICBpZiAocmVsb2NzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZ2V0X3JlbG9jc19pbmZvIGluZm87Ci0KLQkgICAgICBzZWNjb3VudCA9IGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCk7Ci0KLQkgICAgICBzZWNzID0gKGFzZWN0aW9uICoqKSB4bWFsbG9jIChzZWNjb3VudCAqIHNpemVvZiAqc2Vjcyk7Ci0JICAgICAgcmVsb2NzID0gKGFyZWxlbnQgKioqKSB4bWFsbG9jIChzZWNjb3VudCAqIHNpemVvZiAqcmVsb2NzKTsKLQkgICAgICByZWxjb3VudCA9IChsb25nICopIHhtYWxsb2MgKHNlY2NvdW50ICogc2l6ZW9mICpyZWxjb3VudCk7Ci0KLQkgICAgICBpbmZvLnNlY3MgPSBzZWNzOwotCSAgICAgIGluZm8ucmVsb2NzID0gcmVsb2NzOwotCSAgICAgIGluZm8ucmVsY291bnQgPSByZWxjb3VudDsKLQkgICAgICBpbmZvLnN5bXMgPSBzeW1zOwotCSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgZ2V0X3JlbG9jcywgKFBUUikgJmluZm8pOwotCSAgICAgIGxpbmVub19jYWNoZV9yZWxfYmZkID0gYWJmZDsKLQkgICAgfQotCi0JICBzeW1uYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKTsKLQkgIGZvciAoaSA9IDA7IGkgPCBzZWNjb3VudDsgaSsrKQotCSAgICB7Ci0JICAgICAgbG9uZyBqOwotCi0JICAgICAgZm9yIChqID0gMDsgaiA8IHJlbGNvdW50W2ldOyBqKyspCi0JCXsKLQkJICBhcmVsZW50ICpyOwotCi0JCSAgciA9IHJlbG9jc1tpXVtqXTsKLQkJICBpZiAoci0+c3ltX3B0cl9wdHIgIT0gTlVMTAotCQkgICAgICAmJiAoKnItPnN5bV9wdHJfcHRyKS0+c2VjdGlvbiA9PSBzeW0tPnNlY3Rpb24KLQkJICAgICAgJiYgKCpyLT5zeW1fcHRyX3B0ciktPnZhbHVlID09IHN5bS0+dmFsdWUKLQkJICAgICAgJiYgc3RyY21wIChzeW1uYW1lLAotCQkJCSBiZmRfYXN5bWJvbF9uYW1lICgqci0+c3ltX3B0cl9wdHIpKSA9PSAwCi0JCSAgICAgICYmIGJmZF9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2Vjc1tpXSwgc3ltcywKLQkJCQkJCXItPmFkZHJlc3MsICZmaWxlbmFtZSwKLQkJCQkJCSZmdW5jdGlvbm5hbWUsICZsaW5lbm8pKQotCQkgICAgewotCQkgICAgICAvKiBXZSBvbmx5IHByaW50IHRoZSBmaXJzdCBvbmUgd2UgZmluZC4gICovCi0JCSAgICAgIHByaW50ZiAoIlx0JXM6JXUiLCBmaWxlbmFtZSwgbGluZW5vKTsKLQkJICAgICAgaSA9IHNlY2NvdW50OwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoYmZkX2dldF9zZWN0aW9uIChzeW0pLT5vd25lciA9PSBhYmZkKQotCXsKLQkgIGlmIChiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSwgc3ltcywKLQkJCQkgICAgIHN5bS0+dmFsdWUsICZmaWxlbmFtZSwgJmZ1bmN0aW9ubmFtZSwKLQkJCQkgICAgICZsaW5lbm8pCi0JICAgICAgJiYgZmlsZW5hbWUgIT0gTlVMTAotCSAgICAgICYmIGxpbmVubyAhPSAwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiXHQlczoldSIsIGZpbGVuYW1lLCBsaW5lbm8pOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBwdXRjaGFyICgnXG4nKTsKLX0KLQwKLS8qIFRoZSBmb2xsb3dpbmcgMyBncm91cHMgb2YgZnVuY3Rpb25zIGFyZSBjYWxsZWQgdW5jb25kaXRpb25hbGx5LAotICAgb25jZSBhdCB0aGUgc3RhcnQgb2YgcHJvY2Vzc2luZyBlYWNoIGZpbGUgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuCi0gICBUaGV5IHNob3VsZCBjaGVjayBgZmlsZW5hbWVfcGVyX2ZpbGUnIGFuZCBgZmlsZW5hbWVfcGVyX3N5bWJvbCcsCi0gICBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlaXIgb3V0cHV0IGZvcm1hdCwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8KLSAgIHByaW50IGFueXRoaW5nLiAgKi8KLQwKLS8qIFByaW50IHRoZSBuYW1lIG9mIGFuIG9iamVjdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX2JzZCAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBpZiAoZmlsZW5hbWVfcGVyX2ZpbGUgJiYgIWZpbGVuYW1lX3Blcl9zeW1ib2wpCi0gICAgcHJpbnRmICgiXG4lczpcbiIsIGZpbGVuYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X29iamVjdF9maWxlbmFtZV9zeXN2IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmICh1bmRlZmluZWRfb25seSkKLSAgICBwcmludGYgKF8oIlxuXG5VbmRlZmluZWQgc3ltYm9scyBmcm9tICVzOlxuXG4iKSwgZmlsZW5hbWUpOwotICBlbHNlCi0gICAgcHJpbnRmIChfKCJcblxuU3ltYm9scyBmcm9tICVzOlxuXG4iKSwgZmlsZW5hbWUpOwotICBwcmludGYgKF8oIlwKLU5hbWUgICAgICAgICAgICAgICAgICBWYWx1ZSAgIENsYXNzICAgICAgICBUeXBlICAgICAgICAgU2l6ZSAgIExpbmUgIFNlY3Rpb25cblxuIikpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX3Bvc2l4IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmIChmaWxlbmFtZV9wZXJfZmlsZSAmJiAhZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICBwcmludGYgKCIlczpcbiIsIGZpbGVuYW1lKTsKLX0KLQwKLS8qIFByaW50IHRoZSBuYW1lIG9mIGFuIGFyY2hpdmUgZmlsZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfZmlsZW5hbWVfYnNkIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmIChmaWxlbmFtZV9wZXJfZmlsZSkKLSAgICBwcmludGYgKCJcbiVzOlxuIiwgZmlsZW5hbWUpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9zeXN2IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX2ZpbGVuYW1lX3Bvc2l4IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci19Ci0MCi0vKiBQcmludCB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIG1lbWJlciBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfbWVtYmVyX2JzZCAoYXJjaGl2ZSwgZmlsZW5hbWUpCi0gICAgIGNoYXIgKmFyY2hpdmU7Ci0gICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotewotICBpZiAoIWZpbGVuYW1lX3Blcl9zeW1ib2wpCi0gICAgcHJpbnRmICgiXG4lczpcbiIsIGZpbGVuYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfbWVtYmVyX3N5c3YgKGFyY2hpdmUsIGZpbGVuYW1lKQotICAgICBjaGFyICphcmNoaXZlOwotICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgaWYgKHVuZGVmaW5lZF9vbmx5KQotICAgIHByaW50ZiAoXygiXG5cblVuZGVmaW5lZCBzeW1ib2xzIGZyb20gJXNbJXNdOlxuXG4iKSwgYXJjaGl2ZSwgZmlsZW5hbWUpOwotICBlbHNlCi0gICAgcHJpbnRmIChfKCJcblxuU3ltYm9scyBmcm9tICVzWyVzXTpcblxuIiksIGFyY2hpdmUsIGZpbGVuYW1lKTsKLSAgcHJpbnRmIChfKCJcCi1OYW1lICAgICAgICAgICAgICAgICAgVmFsdWUgICBDbGFzcyAgICAgICAgVHlwZSAgICAgICAgIFNpemUgICBMaW5lICBTZWN0aW9uXG5cbiIpKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfbWVtYmVyX3Bvc2l4IChhcmNoaXZlLCBmaWxlbmFtZSkKLSAgICAgY2hhciAqYXJjaGl2ZTsKLSAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmICghZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICBwcmludGYgKCIlc1slc106XG4iLCBhcmNoaXZlLCBmaWxlbmFtZSk7Ci19Ci0MCi0vKiBQcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSAoYW5kIGFyY2hpdmUsIGlmIHRoZXJlIGlzIG9uZSkKLSAgIGNvbnRhaW5pbmcgYSBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2ZpbGVuYW1lX2JzZCAoYXJjaGl2ZV9iZmQsIGFiZmQpCi0gICAgIGJmZCAqYXJjaGl2ZV9iZmQsICphYmZkOwotewotICBpZiAoZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICB7Ci0gICAgICBpZiAoYXJjaGl2ZV9iZmQpCi0JcHJpbnRmICgiJXM6IiwgYmZkX2dldF9maWxlbmFtZSAoYXJjaGl2ZV9iZmQpKTsKLSAgICAgIHByaW50ZiAoIiVzOiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfc3lzdiAoYXJjaGl2ZV9iZmQsIGFiZmQpCi0gICAgIGJmZCAqYXJjaGl2ZV9iZmQsICphYmZkOwotewotICBpZiAoZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICB7Ci0gICAgICBpZiAoYXJjaGl2ZV9iZmQpCi0JcHJpbnRmICgiJXM6IiwgYmZkX2dldF9maWxlbmFtZSAoYXJjaGl2ZV9iZmQpKTsKLSAgICAgIHByaW50ZiAoIiVzOiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfcG9zaXggKGFyY2hpdmVfYmZkLCBhYmZkKQotICAgICBiZmQgKmFyY2hpdmVfYmZkLCAqYWJmZDsKLXsKLSAgaWYgKGZpbGVuYW1lX3Blcl9zeW1ib2wpCi0gICAgewotICAgICAgaWYgKGFyY2hpdmVfYmZkKQotCXByaW50ZiAoIiVzWyVzXTogIiwgYmZkX2dldF9maWxlbmFtZSAoYXJjaGl2ZV9iZmQpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBlbHNlCi0JcHJpbnRmICgiJXM6ICIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci19Ci0MCi0vKiBQcmludCBhIHN5bWJvbCB2YWx1ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF92YWx1ZSAodmFsKQotICAgICBiZmRfdm1hIHZhbDsKLXsKLSNpZiAhIGRlZmluZWQgKEJGRDY0KSB8fCBCRkRfSE9TVF82NEJJVF9MT05HCi0gIHByaW50ZiAodmFsdWVfZm9ybWF0LCB2YWwpOwotI2Vsc2UKLSAgLyogV2UgaGF2ZSBhIDY0IGJpdCB2YWx1ZSB0byBwcmludCwgYnV0IHRoZSBob3N0IGlzIG9ubHkgMzIgYml0LiAgKi8KLSAgaWYgKHByaW50X3JhZGl4ID09IDE2KQotICAgIGZwcmludGZfdm1hIChzdGRvdXQsIHZhbCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZlszMF07Ci0gICAgICBjaGFyICpzOwotCi0gICAgICBzID0gYnVmICsgc2l6ZW9mIGJ1ZjsKLSAgICAgICotLXMgPSAnXDAnOwotICAgICAgd2hpbGUgKHZhbCA+IDApCi0JewotCSAgKi0tcyA9ICh2YWwgJSBwcmludF9yYWRpeCkgKyAnMCc7Ci0JICB2YWwgLz0gcHJpbnRfcmFkaXg7Ci0JfQotICAgICAgd2hpbGUgKChidWYgKyBzaXplb2YgYnVmIC0gMSkgLSBzIDwgMTYpCi0JKi0tcyA9ICcwJzsKLSAgICAgIHByaW50ZiAoIiVzIiwgcyk7Ci0gICAgfQotI2VuZGlmCi19Ci0KLS8qIFByaW50IGEgbGluZSBvZiBpbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfaW5mb19ic2QgKGluZm8sIGFiZmQpCi0gICAgIHN5bWJvbF9pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChpbmZvLT50eXBlID09ICdVJykKLSAgICB7Ci0gICAgICBwcmludGYgKCIlKnMiLAotI2lmZGVmIEJGRDY0Ci0JICAgICAgMTYsCi0jZWxzZQotCSAgICAgIDgsCi0jZW5kaWYKLQkgICAgICAiIik7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpbnRfdmFsdWUgKGluZm8tPnZhbHVlKTsKLSAgcHJpbnRmICgiICVjIiwgaW5mby0+dHlwZSk7Ci0gIGlmIChpbmZvLT50eXBlID09ICctJykKLSAgICB7Ci0gICAgICAvKiBBIHN0YWIuICAqLwotICAgICAgcHJpbnRmICgiICIpOwotICAgICAgcHJpbnRmIChvdGhlcl9mb3JtYXQsIGluZm8tPnN0YWJfb3RoZXIpOwotICAgICAgcHJpbnRmICgiICIpOwotICAgICAgcHJpbnRmIChkZXNjX2Zvcm1hdCwgaW5mby0+c3RhYl9kZXNjKTsKLSAgICAgIHByaW50ZiAoIiAlNXMiLCBpbmZvLT5zdGFiX25hbWUpOwotICAgIH0KLSAgcHJpbnRfc3ltbmFtZSAoIiAlcyIsIGluZm8tPm5hbWUsIGFiZmQpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2luZm9fc3lzdiAoaW5mbywgYWJmZCkKLSAgICAgc3ltYm9sX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcHJpbnRfc3ltbmFtZSAoIiUtMjBzfCIsIGluZm8tPm5hbWUsIGFiZmQpOwkvKiBOYW1lICovCi0gIGlmIChpbmZvLT50eXBlID09ICdVJykKLSAgICBwcmludGYgKCIgICAgICAgICIpOwkvKiBWYWx1ZSAqLwotICBlbHNlCi0gICAgcHJpbnRfdmFsdWUgKGluZm8tPnZhbHVlKTsKLSAgcHJpbnRmICgifCAgICVjICB8IiwgaW5mby0+dHlwZSk7CS8qIENsYXNzICovCi0gIGlmIChpbmZvLT50eXBlID09ICctJykKLSAgICB7Ci0gICAgICAvKiBBIHN0YWIuICAqLwotICAgICAgcHJpbnRmICgiJTE4c3wgICIsIGluZm8tPnN0YWJfbmFtZSk7CS8qIChDKSBUeXBlICovCi0gICAgICBwcmludGYgKGRlc2NfZm9ybWF0LCBpbmZvLT5zdGFiX2Rlc2MpOwkvKiBTaXplICovCi0gICAgICBwcmludGYgKCJ8ICAgICB8Iik7CS8qIExpbmUsIFNlY3Rpb24gKi8KLSAgICB9Ci0gIGVsc2UKLSAgICBwcmludGYgKCIgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCIpOwkvKiBUeXBlLCBTaXplLCBMaW5lLCBTZWN0aW9uICovCi19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfaW5mb19wb3NpeCAoaW5mbywgYWJmZCkKLSAgICAgc3ltYm9sX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcHJpbnRfc3ltbmFtZSAoIiVzICIsIGluZm8tPm5hbWUsIGFiZmQpOwotICBwcmludGYgKCIlYyAiLCBpbmZvLT50eXBlKTsKLSAgaWYgKGluZm8tPnR5cGUgPT0gJ1UnKQotICAgIHByaW50ZiAoIiAgICAgICAgIik7Ci0gIGVsc2UKLSAgICBwcmludF92YWx1ZSAoaW5mby0+dmFsdWUpOwotICAvKiBQT1NJWC4yIHdhbnRzIHRoZSBzeW1ib2wgc2l6ZSBwcmludGVkIGhlcmUsIHdoZW4gYXBwbGljYWJsZTsKLSAgICAgQkZEIGN1cnJlbnRseSBkb2Vzbid0IHByb3ZpZGUgaXQsIHNvIHdlIHRha2UgdGhlIGVhc3kgd2F5IG91dCBieQotICAgICBjb25zaWRlcmluZyBpdCB0byBuZXZlciBiZSBhcHBsaWNhYmxlLiAgKi8KLX0KLQwKLXN0YXRpYyB2b2lkCi1wcmludF9zeW1kZWZfZW50cnkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3ltaW5kZXggaWR4ID0gQkZEX05PX01PUkVfU1lNQk9MUzsKLSAgY2Fyc3ltICp0aGVzeW07Ci0gIGJvb2xlYW4gZXZlcnByaW50ZWQgPSBmYWxzZTsKLQotICBmb3IgKGlkeCA9IGJmZF9nZXRfbmV4dF9tYXBlbnQgKGFiZmQsIGlkeCwgJnRoZXN5bSk7Ci0gICAgICAgaWR4ICE9IEJGRF9OT19NT1JFX1NZTUJPTFM7Ci0gICAgICAgaWR4ID0gYmZkX2dldF9uZXh0X21hcGVudCAoYWJmZCwgaWR4LCAmdGhlc3ltKSkKLSAgICB7Ci0gICAgICBiZmQgKmVsdDsKLSAgICAgIGlmICghZXZlcnByaW50ZWQpCi0JewotCSAgcHJpbnRmIChfKCJcbkFyY2hpdmUgaW5kZXg6XG4iKSk7Ci0JICBldmVycHJpbnRlZCA9IHRydWU7Ci0JfQotICAgICAgZWx0ID0gYmZkX2dldF9lbHRfYXRfaW5kZXggKGFiZmQsIGlkeCk7Ci0gICAgICBpZiAoZWx0ID09IE5VTEwpCi0JYmZkX2ZhdGFsICgiYmZkX2dldF9lbHRfYXRfaW5kZXgiKTsKLSAgICAgIGlmICh0aGVzeW0tPm5hbWUgIT0gKGNoYXIgKikgTlVMTCkKLQl7Ci0JICBwcmludF9zeW1uYW1lICgiJXMiLCB0aGVzeW0tPm5hbWUsIGFiZmQpOwotCSAgcHJpbnRmICgiIGluICVzXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChlbHQpKTsKLQl9Ci0gICAgfQotfQotDAotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgcmVsb2NzIGZvciBhIHBhcnRpY3VsYXIgc2VjdGlvbi4KLSAgIEl0IGlzIGNhbGxlZCB2aWEgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLWdldF9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YWFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YWFyZzsKLXsKLSAgc3RydWN0IGdldF9yZWxvY3NfaW5mbyAqZGF0YSA9IChzdHJ1Y3QgZ2V0X3JlbG9jc19pbmZvICopIGRhdGFhcmc7Ci0KLSAgKmRhdGEtPnNlY3MgPSBzZWM7Ci0KLSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwKQotICAgIHsKLSAgICAgICpkYXRhLT5yZWxvY3MgPSBOVUxMOwotICAgICAgKmRhdGEtPnJlbGNvdW50ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIHJlbHNpemU7Ci0KLSAgICAgIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpOwotICAgICAgaWYgKHJlbHNpemUgPCAwKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICAqZGF0YS0+cmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotICAgICAgKmRhdGEtPnJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjLCAqZGF0YS0+cmVsb2NzLAotCQkJCQkJZGF0YS0+c3ltcyk7Ci0gICAgICBpZiAoKmRhdGEtPnJlbGNvdW50IDwgMCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci0KLSAgKytkYXRhLT5zZWNzOwotICArK2RhdGEtPnJlbG9jczsKLSAgKytkYXRhLT5yZWxjb3VudDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25vdC1yYW5saWIuYyBiL2JpbnV0aWxzL25vdC1yYW5saWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiOWNlYi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9ub3QtcmFubGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLS8qIExpbmtlZCB3aXRoIGFyLm8gdG8gZmxhZyB0aGF0IHRoaXMgcHJvZ3JhbSBpcyAnYXInIChub3QgJ3JhbmxpYicpLiAqLwotCi1pbnQgaXNfcmFubGliID0gMDsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25vdC1zdHJpcC5jIGIvYmludXRpbHMvbm90LXN0cmlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDkzY2UuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbm90LXN0cmlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLS8qIExpbmtlZCB3aXRoIG9iamNvcHkubyB0byBmbGFnIHRoYXQgdGhpcyBwcm9ncmFtIGlzICdvYmpjb3B5JyAobm90Ci0gICAnc3RyaXAnKS4gKi8KLQotaW50IGlzX3N0cmlwID0gMDsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL29iamNvcHkuMSBiL2JpbnV0aWxzL29iamNvcHkuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVlNzc2MC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9vYmpjb3B5LjEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggb2JqY29weSAxICJPY3RvYmVyIDE5OTQiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1vYmpjb3B5IFwtIGNvcHkgYW5kIHRyYW5zbGF0ZSBvYmplY3QgZmlsZXMKLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIG9iamNvcHkKLS5SQiAiW1x8IiBcLUZcIFxmSWJmZG5hbWVcZlJcIHxcIFxmQlwtXC10YXJnZXQ9XGZJYmZkbmFtZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLUlcIFxmSWJmZG5hbWVcZlJcIHxcIFxmQlwtXC1pbnB1dFwtdGFyZ2V0PVxmSWJmZG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1PXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtb3V0cHV0XC10YXJnZXQ9XGZJYmZkbmFtZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLVJcIFxmSXNlY3Rpb25uYW1lXGZSXCB8XCBcZkJcLVwtcmVtb3ZlXC1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lXGZSICJcfF0iCi0uUkIgIltcfCIgXC1TXGZSXCB8XCBcZkJcLVwtc3RyaXBcLWFsbFxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLWdcZlJcIHxcIFxmQlwtXC1zdHJpcFwtZGVidWdcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1cLXN0cmlwXC11bm5lZWRlZFxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLUtcIFxmSXN5bWJvbG5hbWVcZlJcIHxcIFxmQlwtXC1rZWVwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLU5cIFxmSXN5bWJvbG5hbWVcZlJcIHxcIFxmQlwtXC1zdHJpcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1MXCBcZklzeW1ib2xuYW1lXGZSXCB8XCBcZkJcLVwtbG9jYWxpemVcLXN5bWJvbD1cZklzeW1ib2xuYW1lXGZSICJcfF0iIAotLlJCICJbXHwiIFwtV1wgXGZJc3ltYm9sbmFtZVxmUlwgfFwgXGZCXC1cLXdlYWtlblwtc3ltYm9sPVxmSXN5bWJvbG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC14XGZSXCB8XCBcZkJcLVwtZGlzY2FyZFwtYWxsXGZSICJcfF0iIAotLlJCICJbXHwiIFwtWFxmUlwgfFwgXGZCXC1cLWRpc2NhcmRcLWxvY2Fsc1xmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLWJcIFxmSWJ5dGVcZlJcIHxcIFxmQlwtXC1ieXRlPVxmSWJ5dGVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1pXCBcZklpbnRlcmxlYXZlXGZSXCB8XCBcZkJcLVwtaW50ZXJsZWF2ZT1cZklpbnRlcmxlYXZlXGZSICJcfF0iIAotLlJCICJbXHwiIFwtcFxmUlwgfFwgXGZCXC1cLXByZXNlcnZlXC1kYXRlc1xmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtZGVidWdnaW5nICJcfF0iCi0uUkIgIltcfCIgXC1cLWdhcFwtZmlsbD1cZkl2YWxcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtcGFkXC10bz1cZklhZGRyZXNzXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLXNldFwtc3RhcnQ9XGZJdmFsXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLWNoYW5nZVwtc3RhcnQ9XGZJaW5jclxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLWFkZHJlc3Nlcz1cZklpbmNyXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLWNoYW5nZVwtc2VjdGlvblwtYWRkcmVzcz1cZklzZWN0aW9uez0sKywtfXZhbFxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLXNlY3Rpb25cLWxtYT1cZklzZWN0aW9uez0sKywtfXZhbFxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLXNlY3Rpb25cLXZtYT1cZklzZWN0aW9uez0sKywtfXZhbFxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLXdhcm5pbmdzXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLW5vXC1jaGFuZ2VcLXdhcm5pbmdzXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLXNldFwtc2VjdGlvblwtZmxhZ3M9XGZJc2VjdGlvbj1mbGFnc1xmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1hZGRcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWU9ZmlsZW5hbWVcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtY2hhbmdlXC1sZWFkaW5nXC1jaGFyXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLXJlbW92ZVwtbGVhZGluZ1wtY2hhclxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC13ZWFrZW5cZlIgIlx8XSIKLS5SQiAiW1x8IiBcLXZcIHxcIFwtXC12ZXJib3NlXGZSICJcfF0iIAotLlJCICJbXHwiIFwtVlwgfFwgXC1cLXZlcnNpb25cZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1cLWhlbHBcZlIgIlx8XSIgCi0uQiBpbmZpbGUKLS5SQiAiW1x8IiBvdXRmaWxlXGZSICJcfF0iIAotLlNIIERFU0NSSVBUSU9OCi1UaGUgR05VIAotLkIgb2JqY29weQotdXRpbGl0eSBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIGFuIG9iamVjdCBmaWxlIHRvIGFub3RoZXIuICAKLS5CIG9iamNvcHkgCi11c2VzIHRoZSBHTlUgQkZEIExpYnJhcnkgdG8gcmVhZCBhbmQgd3JpdGUgdGhlIG9iamVjdCBmaWxlcy4gIEl0IGNhbgotd3JpdGUgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmaWxlIGluIGEgZm9ybWF0IGRpZmZlcmVudCBmcm9tIHRoYXQgb2YKLXRoZSBzb3VyY2Ugb2JqZWN0IGZpbGUuICBUaGUgZXhhY3QgYmVoYXZpb3Igb2YgCi0uQiBvYmpjb3B5Ci1pcyBjb250cm9sbGVkIGJ5IGNvbW1hbmQtbGluZSBvcHRpb25zLgotLlBQCi0uQiBvYmpjb3B5Ci1jcmVhdGVzIHRlbXBvcmFyeSBmaWxlcyB0byBkbyBpdHMgdHJhbnNsYXRpb25zIGFuZCBkZWxldGVzIHRoZW0KLWFmdGVyd2FyZC4KLS5CIG9iamNvcHkKLXVzZXMgQkZEIHRvIGRvIGFsbCBpdHMgdHJhbnNsYXRpb24gd29yazsgaXQga25vd3MgYWJvdXQgYWxsIHRoZQotZm9ybWF0cyBCRkQga25vd3MgYWJvdXQsIGFuZCB0aHVzIGlzIGFibGUgdG8gcmVjb2duaXplIG1vc3QgZm9ybWF0cwotd2l0aG91dCBiZWluZyB0b2xkIGV4cGxpY2l0bHkuCi0uUFAKLS5CIG9iamNvcHkKLWNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIFMtcmVjb3JkcyBieSB1c2luZyBhbiBvdXRwdXQgdGFyZ2V0IG9mCi0uQiBzcmVjCi0oZS5nLiwgdXNlCi0uQiAtTyBzcmVjKS4KLS5QUAotLkIgb2JqY29weQotY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSByYXcgYmluYXJ5IGZpbGUgYnkgdXNpbmcgYW4gb3V0cHV0IHRhcmdldCBvZgotLkIgYmluYXJ5Ci0oZS5nLiwgdXNlCi0uQiAtTyBiaW5hcnkpLgotV2hlbgotLkIgb2JqY29weQotZ2VuZXJhdGVzIGEgcmF3IGJpbmFyeSBmaWxlLCBpdCB3aWxsIGVzc2VudGlhbGx5IHByb2R1Y2UgYSBtZW1vcnkgZHVtcAotb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBvYmplY3QgZmlsZS4gIEFsbCBzeW1ib2xzIGFuZCByZWxvY2F0aW9uCi1pbmZvcm1hdGlvbiB3aWxsIGJlIGRpc2NhcmRlZC4gIFRoZSBtZW1vcnkgZHVtcCB3aWxsIHN0YXJ0IGF0IHRoZQotdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBsb3dlc3Qgc2VjdGlvbiBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuCi0uUFAKLVdoZW4gZ2VuZXJhdGluZyBhbiBTLXJlY29yZCBvciBhIHJhdyBiaW5hcnkgZmlsZSwgaXQgbWF5IGJlIGhlbHBmdWwgdG8KLXVzZQotLkIgLVMKLXRvIHJlbW92ZSBzZWN0aW9ucyBjb250YWluaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEluIHNvbWUgY2FzZXMKLS5CIC1SCi13aWxsIGJlIHVzZWZ1bCB0byByZW1vdmUgc2VjdGlvbnMgd2hpY2ggY29udGFpbiBpbmZvcm1hdGlvbiB3aGljaCBpcwotbm90IG5lZWRlZCBieSB0aGUgYmluYXJ5IGZpbGUuCi0uUFAKLS5JIGluZmlsZQotYW5kCi0uSSBvdXRmaWxlCi1hcmUgdGhlIHNvdXJjZSBhbmQgb3V0cHV0IGZpbGVzIHJlc3BlY3RpdmVseS4gIElmIHlvdSBkbyBub3Qgc3BlY2lmeQotLklSIG91dGZpbGUgLAotLkIgb2JqY29weQotY3JlYXRlcyBhIHRlbXBvcmFyeSBmaWxlIGFuZCBkZXN0cnVjdGl2ZWx5IHJlbmFtZXMgdGhlIHJlc3VsdCB3aXRoIHRoZQotbmFtZSBvZiB0aGUgaW5wdXQgZmlsZS4KLQotLlNIIE9QVElPTlMKLS5UUAotLkIgXC1JIFxmSWJmZG5hbWVcZlIsIFxmQlwtXC1pbnB1dFwtdGFyZ2V0PVxmSWJmZG5hbWUKLUNvbnNpZGVyIHRoZSBzb3VyY2UgZmlsZSdzIG9iamVjdCBmb3JtYXQgdG8gYmUgCi0uSVIgYmZkbmFtZSAsCi1yYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIGRlZHVjZSBpdC4KLS5UUAotLkIgXC1PIFxmSWJmZG5hbWVcZlIsIFxmQlwtXC1vdXRwdXRcLXRhcmdldD1cZkliZmRuYW1lCi1Xcml0ZSB0aGUgb3V0cHV0IGZpbGUgdXNpbmcgdGhlIG9iamVjdCBmb3JtYXQgCi0uSVIgYmZkbmFtZSAuCi0uVFAKLS5CIFwtRiBcZkliZmRuYW1lXGZSLCBcZkJcLVwtdGFyZ2V0PVxmSWJmZG5hbWUKLVVzZSAKLS5JIGJmZG5hbWUKLWFzIHRoZSBvYmplY3QgZm9ybWF0IGZvciBib3RoIHRoZSBpbnB1dCBhbmQgdGhlIG91dHB1dCBmaWxlOyBpLmUuCi1zaW1wbHkgdHJhbnNmZXIgZGF0YSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiB3aXRoIG5vIHRyYW5zbGF0aW9uLgotLlRQCi0uQiBcLVIgXGZJc2VjdGlvbm5hbWVcZlIsIFxmQlwtXC1yZW1vdmUtc2VjdGlvbj1cZklzZWN0aW9ubmFtZQotUmVtb3ZlIHRoZSBuYW1lZCBzZWN0aW9uIGZyb20gdGhlIGZpbGUuICBUaGlzIG9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZQotdGhhbiBvbmNlLiAgTm90ZSB0aGF0IHVzaW5nIHRoaXMgb3B0aW9uIGluYXBwcm9wcmlhdGVseSBtYXkgbWFrZSB0aGUKLW91dHB1dCBmaWxlIHVudXNhYmxlLgotLlRQCi0uQiBcLVNcZlIsIFxmQlwtXC1zdHJpcFwtYWxsCi1EbyBub3QgY29weSByZWxvY2F0aW9uIGFuZCBzeW1ib2wgaW5mb3JtYXRpb24gZnJvbSB0aGUgc291cmNlIGZpbGUuCi0uVFAKLS5CIFwtZ1xmUiwgXGZCXC1cLXN0cmlwXC1kZWJ1ZwotRG8gbm90IGNvcHkgZGVidWdnaW5nIHN5bWJvbHMgZnJvbSB0aGUgc291cmNlIGZpbGUuCi0uVFAKLS5CIFwtXC1zdHJpcFwtdW5uZWVkZWQKLVN0cmlwIGFsbCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBuZWVkZWQgZm9yIHJlbG9jYXRpb24gcHJvY2Vzc2luZy4KLS5UUAotLkIgXC1LIFxmSXN5bWJvbG5hbWVcZlIsIFxmQlwtXC1rZWVwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQotQ29weSBvbmx5IHN5bWJvbCBcZklzeW1ib2xuYW1lXGZQIGZyb20gdGhlIHNvdXJjZSBmaWxlLiBUaGlzIG9wdGlvbgotbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotLlRQCi0uQiBcLU4gXGZJc3ltYm9sbmFtZVxmUiwgXGZCXC1cLXN0cmlwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQotRG8gbm90IGNvcHkgc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgZnJvbSB0aGUgc291cmNlIGZpbGUuIFRoaXMgb3B0aW9uCi1tYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0uVFAKLS5CIFwtTCBcZklzeW1ib2xuYW1lXGZSLCBcZkJcLVwtbG9jYWxpemVcLXN5bWJvbD1cZklzeW1ib2xuYW1lCi1NYWtlIHN5bWJvbCBcZklzeW1ib2xuYW1lXGZQIGxvY2FsIHRvIHRoZSBmaWxlLCBzbyB0aGF0IGl0IGlzIG5vdAotdmlzaWJsZSBleHRlcm5hbGx5LiAgVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotLlRQCi0uQiBcLVcgXGZJc3ltYm9sbmFtZVxmUiwgXGZCXC1cLXdlYWtlblwtc3ltYm9sPVxmSXN5bWJvbG5hbWUKLU1ha2Ugc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgd2Vhay4gVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotLlRQCi0uQiBcLXhcZlIsIFxmQiBcLVwtZGlzY2FyZFwtYWxsCi1EbyBub3QgY29weSBub24tZ2xvYmFsIHN5bWJvbHMgZnJvbSB0aGUgc291cmNlIGZpbGUuCi0uVFAKLS5CIFwtWFxmUiwgXGZCXC1cLWRpc2NhcmRcLWxvY2FscwotRG8gbm90IGNvcHkgY29tcGlsZXItZ2VuZXJhdGVkIGxvY2FsIHN5bWJvbHMuIChUaGVzZSB1c3VhbGx5IHN0YXJ0Ci13aXRoICJMIiBvciAiLiIpLgotLlRQCi0uQiBcLWIgXGZJYnl0ZVxmUiwgXGZCXC1cLWJ5dGU9XGZJYnl0ZQotS2VlcCBvbmx5IGV2ZXJ5IFxmSWJ5dGVcZlB0aCBieXRlIG9mIHRoZSBpbnB1dCBmaWxlIChoZWFkZXIgZGF0YSBpcwotbm90IGFmZmVjdGVkKS4gIFxmSWJ5dGVcZlAgY2FuIGJlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gdGhlCi1pbnRlcmxlYXZlLTEuICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgZm9yIGNyZWF0aW5nIGZpbGVzIHRvIHByb2dyYW0KLVJPTXMuICBJdCBpcyB0eXBpY2FsbHkgdXNlZCB3aXRoIGFuIHNyZWMgb3V0cHV0IHRhcmdldC4KLS5UUAotLkIgXC1pIFxmSWludGVybGVhdmVcZlIsIFxmQlwtXC1pbnRlcmxlYXZlPVxmSWludGVybGVhdmUKLU9ubHkgY29weSBvbmUgb3V0IG9mIGV2ZXJ5IFxmSWludGVybGVhdmVcZlAgYnl0ZXMuICBXaGljaCBvbmUgdG8gY29weSBpcwotc2VsZWN0ZWQgYnkgdGhlIFxmQlwtYlxmUCBvciBcZkJcLVwtYnl0ZVxmUCBvcHRpb24uICBUaGUgZGVmYXVsdCBpcyA0LgotVGhlIGludGVybGVhdmUgaXMgaWdub3JlZCBpZiBuZWl0aGVyIFxmQlwtYlxmUCBub3IgXGZCXC1cLWJ5dGVcZlAgaXMgZ2l2ZW4uCi0uVFAKLS5CIFwtcFxmUiwgXGZCXC1cLXByZXNlcnZlXC1kYXRlcwotU2V0IHRoZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiBkYXRlcyBvZiB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgdGhlIHNhbWUKLWFzIHRob3NlIG9mIHRoZSBpbnB1dCBmaWxlLgotLlRQCi0uQiBcLVwtZGVidWdnaW5nCi1Db252ZXJ0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgaWYgcG9zc2libGUuICBUaGlzIGlzIG5vdCB0aGUgZGVmYXVsdAotYmVjYXVzZSBvbmx5IGNlcnRhaW4gZGVidWdnaW5nIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCwgYW5kIHRoZQotY29udmVyc2lvbiBwcm9jZXNzIGNhbiBiZSB0aW1lIGNvbnN1bWluZy4KLS5UUAotLkIgXC1cLWdhcFwtZmlsbD1cZkl2YWwKLUZpbGwgZ2FwcyBiZXR3ZWVuIHNlY3Rpb25zIHdpdGggXGZJdmFsXGZQLiAgVGhpcyBvcGVyYXRpb24gYXBwbGllcyB0bwotdGhlIFxmSWxvYWQgYWRkcmVzc1xmUCAoTE1BKSBvZiB0aGUgc2VjdGlvbnMuICBJdCBpcyBkb25lIGJ5IGluY3JlYXNpbmcKLXRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIHdpdGggdGhlIGxvd2VyIGFkZHJlc3MsIGFuZCBmaWxsaW5nIGluIHRoZSBleHRyYQotc3BhY2UgY3JlYXRlZCB3aXRoIFxmSXZhbFxmUC4KLS5UUAotLkIgXC1cLXBhZFwtdG89XGZJYWRkcmVzcwotUGFkIHRoZSBvdXRwdXQgZmlsZSB1cCB0byB0aGUgbG9hZCBhZGRyZXNzIFxmSWFkZHJlc3NcZlAuICBUaGlzIGlzCi1kb25lIGJ5IGluY3JlYXNpbmcgdGhlIHNpemUgb2YgdGhlIGxhc3Qgc2VjdGlvbi4gIFRoZSBleHRyYSBzcGFjZSBpcwotZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlIHNwZWNpZmllZCBieSBcZkJcLVwtZ2FwXC1maWxsXGZQIChkZWZhdWx0Ci16ZXJvKS4KLS5UUAotLkIgXGZCXC1cLXNldFwtc3RhcnQ9XGZJdmFsCi1TZXQgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG5ldyBmaWxlIHRvIFxmSXZhbFxmUC4gIE5vdCBhbGwgb2JqZWN0Ci1maWxlIGZvcm1hdHMgc3VwcG9ydCBzZXR0aW5nIHRoZSBzdGFydCBhZGRyZXNzLgotLlRQCi0uQiBcZkJcLVwtY2hhbmdlXC1zdGFydD1cZklpbmNyXGZSLCBcZkJcLVwtYWRqdXN0XC1zdGFydD1cZklpbmNyCi1DaGFuZ2VzIHRoZSBzdGFydCBhZGRyZXNzIGJ5IGFkZGluZyBcZklpbmNyXGZQLiAgTm90IGFsbCBvYmplY3QgZmlsZQotZm9ybWF0cyBzdXBwb3J0IHNldHRpbmcgdGhlIHN0YXJ0IGFkZHJlc3MuCi0uVFAKLS5CIFxmQlwtXC1jaGFuZ2VcLWFkZHJlc3Nlcz1cZklpbmNyXGZSLCBcZkJcLVwtYWRqdXN0XC12bWE9XGZJaW5jcgotQ2hhbmdlcyB0aGUgYWRkcmVzcyBvZiBhbGwgc2VjdGlvbnMsIGFzIHdlbGwgYXMgdGhlIHN0YXJ0IGFkZHJlc3MsIGJ5Ci1hZGRpbmcgXGZJaW5jclxmUC4gIFNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyBkbyBub3QgcGVybWl0IHNlY3Rpb24KLWFkZHJlc3NlcyB0byBiZSBjaGFuZ2VkIGFyYml0cmFyaWx5LiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgcmVsb2NhdGUKLXRoZSBzZWN0aW9uczsgaWYgdGhlIHByb2dyYW0gZXhwZWN0cyBzZWN0aW9ucyB0byBiZSBsb2FkZWQgYXQgYQotY2VydGFpbiBhZGRyZXNzLCBhbmQgdGhpcyBvcHRpb24gaXMgdXNlZCB0byBjaGFuZ2UgdGhlIHNlY3Rpb25zIHN1Y2gKLXRoYXQgdGhleSBhcmUgbG9hZGVkIGF0IGEgZGlmZmVyZW50IGFkZHJlc3MsIHRoZSBwcm9ncmFtIG1heSBmYWlsLgotLlRQCi0uQiBcZkJcLVwtY2hhbmdlXC1zZWN0aW9uXC1hZGRyZXNzPVxmSXNlY3Rpb257PSwrLC19dmFsXGZSLCBcZkJcLVwtYWRqdXN0XC1zZWN0aW9uXC12bWE9XGZJc2VjdGlvbns9LCssLX12YWwKLVNldCBvciBjaGFuZ2VzIHRoZSBWTUEgYW5kIExNQSBhZGRyZXNzZXMgb2YgdGhlIG5hbWVkIFxmSXNlY3Rpb25cZlAuCi1JZiBcZkk9XGZQIGlzIHVzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MgaXMgc2V0IHRvIFxmSXZhbFxmUC4KLU90aGVyd2lzZSwgXGZJdmFsXGZQIGlzIGFkZGVkIHRvIG9yIHN1YnRyYWN0ZWQgZnJvbSB0aGUgc2VjdGlvbgotYWRkcmVzcy4gIFNlZSB0aGUgY29tbWVudHMgdW5kZXIgXGZCXC1cLWNoYW5nZVwtYWRkcmVzc2VzXGZQLCBhYm92ZS4gIElmCi1cZklzZWN0aW9uXGZQIGRvZXMgbm90IGV4aXN0IGluIHRoZSBpbnB1dCBmaWxlLCBhIHdhcm5pbmcgd2lsbCBiZQotaXNzdWVkLCB1bmxlc3MgXGZCXC1cLW5vXC1jaGFuZ2VcLXdhcm5pbmdzXGZQIGlzIHVzZWQuCi0uVFAKLS5CIFxmQlwtXC1jaGFuZ2VcLXNlY3Rpb25cLWxtYT1cZklzZWN0aW9uez0sKywtfXZhbAotU2V0IG9yIGNoYW5nZSB0aGUgTE1BIGFkZHJlc3Mgb2YgdGhlIG5hbWVkIFxmSXNlY3Rpb25cZlAuICBJZiBcZkk9XGZQIGlzCi11c2VkLCB0aGUgc2VjdGlvbiBhZGRyZXNzIGlzIHNldCB0byBcZkl2YWxcZlAuICBPdGhlcndpc2UsIFxmSXZhbFxmUAotaXMgYWRkZWQgdG8gb3Igc3VidHJhY3RlZCBmcm9tIHRoZSBzZWN0aW9uIGFkZHJlc3MuICBTZWUgdGhlIGNvbW1lbnRzCi11bmRlciBcZkJcLVwtY2hhbmdlXC1hZGRyZXNzZXNcZlAsIGFib3ZlLiAgSWYgXGZJc2VjdGlvblxmUCBkb2VzIG5vdCBleGlzdAotaW4gdGhlIGlucHV0IGZpbGUsIGEgd2FybmluZyB3aWxsIGJlIGlzc3VlZCwgdW5sZXNzCi1cZkJcLVwtbm9cLWNoYW5nZVwtd2FybmluZ3NcZlAgaXMgdXNlZC4KLS5UUAotLkIgXGZCXC1cLWNoYW5nZVwtc2VjdGlvblwtdm1hPVxmSXNlY3Rpb257PSwrLC19dmFsCi1TZXQgb3IgY2hhbmdlIHRoZSBWTUEgYWRkcmVzcyBvZiB0aGUgbmFtZWQgXGZJc2VjdGlvblxmUC4gIElmIFxmST1cZlAgaXMKLXVzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MgaXMgc2V0IHRvIFxmSXZhbFxmUC4gIE90aGVyd2lzZSwgXGZJdmFsXGZQCi1pcyBhZGRlZCB0byBvciBzdWJ0cmFjdGVkIGZyb20gdGhlIHNlY3Rpb24gYWRkcmVzcy4gIFNlZSB0aGUgY29tbWVudHMKLXVuZGVyIFxmQlwtXC1jaGFuZ2VcLWFkZHJlc3Nlc1xmUCwgYWJvdmUuICBJZiBcZklzZWN0aW9uXGZQIGRvZXMgbm90IGV4aXN0Ci1pbiB0aGUgaW5wdXQgZmlsZSwgYSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkLCB1bmxlc3MKLVxmQlwtXC1ub1wtY2hhbmdlXC13YXJuaW5nc1xmUCBpcyB1c2VkLgotLlRQCi0uQiBcZkJcLVwtY2hhbmdlXC13YXJuaW5nc1xmUiwgXGZCXC1cLWFkanVzdFwtd2FybmluZ3MKLUlmIFxmQlwtXC1jaGFuZ2VcLXNlY3Rpb25cLVhYWFxmUCBpcyB1c2VkLCBhbmQgdGhlIG5hbWVkIHNlY3Rpb24gZG9lcwotbm90IGV4aXN0LCBpc3N1ZSBhIHdhcm5pbmcuICBUaGlzIGlzIHRoZSBkZWZhdWx0LgotLlRQCi0uQiBcZkJcLVwtbm9cLWNoYW5nZVwtd2FybmluZ3NcZlIsIFxmQlwtXC1ub1wtYWRqdXN0XC13YXJuaW5ncwotRG8gbm90IGlzc3VlIGEgd2FybmluZyBpZiBcZkJcLVwtY2hhbmdlXC1zZWN0aW9uXC1YWFhcZlAgaXMgdXNlZCwgZXZlbgotaWYgdGhlIG5hbWVkIHNlY3Rpb24gZG9lcyBub3QgZXhpc3QuCi0uVFAKLS5CIFxmQlwtXC1zZXRcLXNlY3Rpb25cLWZsYWdzPVxmSXNlY3Rpb249ZmxhZ3MKLVNldCB0aGUgZmxhZ3MgZm9yIHRoZSBuYW1lZCBzZWN0aW9uLiAgVGhlIFxmSWZsYWdzXGZQIGFyZ3VtZW50IGlzIGEKLWNvbW1hIHNlcGFyYXRlZCBzdHJpbmcgb2YgZmxhZyBuYW1lcy4gIFRoZSByZWNvZ25pemVkIG5hbWVzIGFyZQotXGZJYWxsb2NcZlAsIFxmSWxvYWRcZlAsIFxmSXJlYWRvbmx5XGZQLCBcZkljb2RlXGZQLCBcZklkYXRhXGZQLCBhbmQKLVxmSXJvbVxmUC4gIE5vdCBhbGwgZmxhZ3MgYXJlIG1lYW5pbmdmdWwgZm9yIGFsbCBvYmplY3QgZmlsZQotZm9ybWF0cy4KLS5UUAotLkIgXGZCXC1cLWFkZFwtc2VjdGlvbj1cZklzZWN0aW9ubmFtZT1maWxlbmFtZQotQWRkIGEgbmV3IHNlY3Rpb24gbmFtZWQgXGZJc2VjdGlvbm5hbWVcZlIgd2hpbGUgY29weWluZyB0aGUgZmlsZS4gIFRoZQotY29udGVudHMgb2YgdGhlIG5ldyBzZWN0aW9uIGFyZSB0YWtlbiBmcm9tIHRoZSBmaWxlIFxmSWZpbGVuYW1lXGZSLgotVGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gd2lsbCBiZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZS4gIFRoaXMgb3B0aW9uCi1vbmx5IHdvcmtzIG9uIGZpbGUgZm9ybWF0cyB3aGljaCBjYW4gc3VwcG9ydCBzZWN0aW9ucyB3aXRoIGFyYml0cmFyeQotbmFtZXMuCi0uVFAKLS5CIFwtXC1jaGFuZ2VcLWxlYWRpbmdcLWNoYXIKLVNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyB1c2Ugc3BlY2lhbCBjaGFyYWN0ZXJzIGF0IHRoZSBzdGFydCBvZgotc3ltYm9scy4gIFRoZSBtb3N0IGNvbW1vbiBzdWNoIGNoYXJhY3RlciBpcyB1bmRlcnNjb3JlLCB3aGljaCBjb21waWxlcnMKLW9mdGVuIGFkZCBiZWZvcmUgZXZlcnkgc3ltYm9sLiAgVGhpcyBvcHRpb24gdGVsbHMgCi0uQiBvYmpjb3B5Ci10byBjaGFuZ2UgdGhlIGxlYWRpbmcgY2hhcmFjdGVyIG9mIGV2ZXJ5IHN5bWJvbCB3aGVuIGl0IGNvbnZlcnRzCi1iZXR3ZWVuIG9iamVjdCBmaWxlIGZvcm1hdHMuICBJZiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0cyB1c2UgdGhlIHNhbWUKLWxlYWRpbmcgY2hhcmFjdGVyLCB0aGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0LiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGFkZAotYSBjaGFyYWN0ZXIsIG9yIHJlbW92ZSBhIGNoYXJhY3Rlciwgb3IgY2hhbmdlIGEgY2hhcmFjdGVyLCBhcwotYXBwcm9wcmlhdGUuCi0uVFAKLS5CIFwtXC1yZW1vdmVcLWxlYWRpbmdcLWNoYXIKLUlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBnbG9iYWwgc3ltYm9sIGlzIGEgc3BlY2lhbCBzeW1ib2wgbGVhZGluZwotY2hhcmFjdGVyIHVzZWQgYnkgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCwgcmVtb3ZlIHRoZSBjaGFyYWN0ZXIuICBUaGUKLW1vc3QgY29tbW9uIHN5bWJvbCBsZWFkaW5nIGNoYXJhY3RlciBpcyB1bmRlcnNjb3JlLiAgVGhpcyBvcHRpb24gd2lsbAotcmVtb3ZlIGEgbGVhZGluZyB1bmRlcnNjb3JlIGZyb20gYWxsIGdsb2JhbCBzeW1ib2xzLiAgVGhpcyBjYW4gYmUKLXVzZWZ1bCBpZiB5b3Ugd2FudCB0byBsaW5rIHRvZ2V0aGVyIG9iamVjdHMgb2YgZGlmZmVyZW50IGZpbGUgZm9ybWF0cwotd2l0aCBkaWZmZXJlbnQgY29udmVudGlvbnMgZm9yIHN5bWJvbCBuYW1lcy4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20KLVxmQlwtXC1jaGFuZ2VcLWxlYWRpbmdcLWNoYXJcZlAgYmVjYXVzZSBpdCBhbHdheXMgY2hhbmdlcyB0aGUgc3ltYm9sIG5hbWUKLXdoZW4gYXBwcm9wcmlhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCBvZiB0aGUgb3V0cHV0Ci0uVFAKLS5CIFwtXC13ZWFrZW4KLUNoYW5nZSBhbGwgZ2xvYmFsIHN5bWJvbHMgaW4gdGhlIGZpbGUgdG8gYmUgd2Vhay4KLS5UUAotLkIgXC12XGZSLCBcZkJcLVwtdmVyYm9zZQotVmVyYm9zZSBvdXRwdXQ6IGxpc3QgYWxsIG9iamVjdCBmaWxlcyBtb2RpZmllZC4gIEluIHRoZSBjYXNlIG9mCi1hcmNoaXZlcywgIlxmQm9iamNvcHkgXC1WXGZSIiBsaXN0cyBhbGwgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZS4KLS5UUAotLkIgXC1WXGZSLCBcZkJcLVwtdmVyc2lvbgotU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgb2YKLS5CIG9iamNvcHkKLWFuZCBleGl0LgotLlRQCi0uQiBcLVwtaGVscAotU2hvdyBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8KLS5CIG9iamNvcHkKLWFuZCBleGl0LgotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIiAKLWVudHJ5IGluIAotLkIKLWluZm9cYwotXCY7IAotLkkKLVRoZSBHTlUgQmluYXJ5IFV0aWxpdGllc1xjCi1cJiwgUm9sYW5kIEguIFBlc2NoIChKdW5lIDE5OTMpLgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9vYmpjb3B5LmMgYi9iaW51dGlscy9vYmpjb3B5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZDc3NzcuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvb2JqY29weS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAyOSArMCwwIEBACi0vKiBvYmpjb3B5LmMgLS0gY29weSBvYmplY3QgZmlsZSBmcm9tIGlucHV0IHRvIG91dHB1dCwgb3B0aW9uYWxseSBtYXNzYWdpbmcgaXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJwcm9ncmVzcy5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1ZGJnLmgiCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotLyogQSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwbGljaXRseSBzdHJpcCBvdXQsIG9yIHRvIGtlZXAuICBBIGxpbmtlZAotICAgbGlzdCBpcyBnb29kIGVub3VnaCBmb3IgYSBzbWFsbCBudW1iZXIgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBidXQKLSAgIHRoaXMgd2lsbCBzbG93IHRoaW5ncyBkb3duIGEgbG90IGlmIG1hbnkgc3ltYm9scyBhcmUgYmVpbmcKLSAgIGRlbGV0ZWQuICovCi0KLXN0cnVjdCBzeW1saXN0Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBzeW1saXN0ICpuZXh0OwotfTsKLQotc3RhdGljIHZvaWQgY29weV91c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgc3RyaXBfdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKLXN0YXRpYyBmbGFnd29yZCBwYXJzZV9mbGFncyBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpmaW5kX3NlY3Rpb25fbGlzdCBQQVJBTVMgKChjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLXN0YXRpYyB2b2lkIHNldHVwX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgY29weV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGdldF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgaW50IGNvbXBhcmVfc2VjdGlvbl9sbWEgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGFkZF9zcGVjaWZpY19zeW1ib2wgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3ltbGlzdCAqKikpOwotc3RhdGljIGJvb2xlYW4gaXNfc3BlY2lmaWVkX3N5bWJvbCBQQVJBTVMgKChjb25zdCBjaGFyICosIHN0cnVjdCBzeW1saXN0ICopKTsKLXN0YXRpYyBib29sZWFuIGlzX3N0cmlwX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZmlsdGVyX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqLCBhc3ltYm9sICoqLCBhc3ltYm9sICoqLCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBmaWx0ZXJfYnl0ZXMgUEFSQU1TICgoY2hhciAqLCBiZmRfc2l6ZV90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIHdyaXRlX2RlYnVnZ2luZ19pbmZvIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGxvbmcgKiwgYXN5bWJvbCAqKiopKTsKLXN0YXRpYyB2b2lkIGNvcHlfb2JqZWN0IFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQgY29weV9hcmNoaXZlIFBBUkFNUyAoKGJmZCAqLCBiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBjb3B5X2ZpbGUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IHN0cmlwX21haW4gUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1zdGF0aWMgaW50IGNvcHlfbWFpbiBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLQotI2RlZmluZSBSRVRVUk5fTk9ORkFUQUwocykge2JmZF9ub25mYXRhbCAocyk7IHN0YXR1cyA9IDE7IHJldHVybjt9Ci0KLXN0YXRpYyBhc3ltYm9sICoqaXN5bXBwID0gTlVMTDsJLyogSW5wdXQgc3ltYm9scyAqLwotc3RhdGljIGFzeW1ib2wgKipvc3ltcHAgPSBOVUxMOwkvKiBPdXRwdXQgc3ltYm9scyB0aGF0IHN1cnZpdmUgc3RyaXBwaW5nICovCi0KLS8qIElmIGBjb3B5X2J5dGUnID49IDAsIGNvcHkgb25seSB0aGF0IGJ5dGUgb2YgZXZlcnkgYGludGVybGVhdmUnIGJ5dGVzLiAgKi8KLXN0YXRpYyBpbnQgY29weV9ieXRlID0gLTE7Ci1zdGF0aWMgaW50IGludGVybGVhdmUgPSA0OwotCi1zdGF0aWMgYm9vbGVhbiB2ZXJib3NlOwkJLyogUHJpbnQgZmlsZSBhbmQgdGFyZ2V0IG5hbWVzLiAqLwotc3RhdGljIGJvb2xlYW4gcHJlc2VydmVfZGF0ZXM7CS8qIFByZXNlcnZlIGlucHV0IGZpbGUgdGltZXN0YW1wLiAgKi8KLXN0YXRpYyBpbnQgc3RhdHVzID0gMDsJCS8qIEV4aXQgc3RhdHVzLiAgKi8KLQotZW51bSBzdHJpcF9hY3Rpb24KLSAgewotICAgIFNUUklQX1VOREVGLAotICAgIFNUUklQX05PTkUsCQkJLyogZG9uJ3Qgc3RyaXAgKi8KLSAgICBTVFJJUF9ERUJVRywJCS8qIHN0cmlwIGFsbCBkZWJ1Z2dlciBzeW1ib2xzICovCi0gICAgU1RSSVBfVU5ORUVERUQsCQkvKiBzdHJpcCB1bm5lY2Vzc2FyeSBzeW1ib2xzICovCi0gICAgU1RSSVBfQUxMCQkJLyogc3RyaXAgYWxsIHN5bWJvbHMgKi8KLSAgfTsKLQotLyogV2hpY2ggc3ltYm9scyB0byByZW1vdmUuICovCi1zdGF0aWMgZW51bSBzdHJpcF9hY3Rpb24gc3RyaXBfc3ltYm9sczsKLQotZW51bSBsb2NhbHNfYWN0aW9uCi0gIHsKLSAgICBMT0NBTFNfVU5ERUYsCi0gICAgTE9DQUxTX1NUQVJUX0wsCQkvKiBkaXNjYXJkIGxvY2FscyBzdGFydGluZyB3aXRoIEwgKi8KLSAgICBMT0NBTFNfQUxMCQkJLyogZGlzY2FyZCBhbGwgbG9jYWxzICovCi0gIH07Ci0KLS8qIFdoaWNoIGxvY2FsIHN5bWJvbHMgdG8gcmVtb3ZlLiAgT3ZlcnJpZGVzIFNUUklQX0FMTC4gICovCi1zdGF0aWMgZW51bSBsb2NhbHNfYWN0aW9uIGRpc2NhcmRfbG9jYWxzOwotCi0vKiBXaGF0IGtpbmQgb2YgY2hhbmdlIHRvIHBlcmZvcm0uICAqLwotZW51bSBjaGFuZ2VfYWN0aW9uCi17Ci0gIENIQU5HRV9JR05PUkUsCi0gIENIQU5HRV9NT0RJRlksCi0gIENIQU5HRV9TRVQKLX07Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgbGlzdHMgb2Ygc2VjdGlvbnMgYW5kIGFjdGlvbnMgdG8gdGFrZS4gICovCi1zdHJ1Y3Qgc2VjdGlvbl9saXN0Ci17Ci0gIHN0cnVjdCBzZWN0aW9uX2xpc3QgKiBuZXh0OyAgICAgIC8qIE5leHQgc2VjdGlvbiB0byBjaGFuZ2UuICAqLwotICBjb25zdCBjaGFyICogICAgICAgICAgbmFtZTsgICAgICAvKiBTZWN0aW9uIG5hbWUuICAqLwotICBib29sZWFuICAgICAgICAgICAgICAgdXNlZDsgICAgICAvKiBXaGV0aGVyIHRoaXMgZW50cnkgd2FzIHVzZWQuICAqLwotICBib29sZWFuICAgICAgICAgICAgICAgcmVtb3ZlOyAgICAvKiBXaGV0aGVyIHRvIHJlbW92ZSB0aGlzIHNlY3Rpb24uICAqLwotICBlbnVtIGNoYW5nZV9hY3Rpb24gICAgY2hhbmdlX3ZtYTsvKiBXaGV0aGVyIHRvIGNoYW5nZSBvciBzZXQgVk1BLiAgKi8KLSAgYmZkX3ZtYSAJCXZtYV92YWw7ICAgLyogQW1vdW50IHRvIGNoYW5nZSBieSBvciBzZXQgdG8uICAqLwotICBlbnVtIGNoYW5nZV9hY3Rpb24gICAgY2hhbmdlX2xtYTsvKiBXaGV0aGVyIHRvIGNoYW5nZSBvciBzZXQgTE1BLiAgKi8KLSAgYmZkX3ZtYSAJCWxtYV92YWw7ICAgLyogQW1vdW50IHRvIGNoYW5nZSBieSBvciBzZXQgdG8uICAqLwotICBib29sZWFuIAkJc2V0X2ZsYWdzOyAvKiBXaGV0aGVyIHRvIHNldCB0aGUgc2VjdGlvbiBmbGFncy4gICovCi0gIGZsYWd3b3JkIAkJZmxhZ3M7ICAgICAvKiBXaGF0IHRvIHNldCB0aGUgc2VjdGlvbiBmbGFncyB0by4gICovCi19OwotCi1zdGF0aWMgc3RydWN0IHNlY3Rpb25fbGlzdCAqY2hhbmdlX3NlY3Rpb25zOwotc3RhdGljIGJvb2xlYW4gc2VjdGlvbnNfcmVtb3ZlZDsKLQotLyogQ2hhbmdlcyB0byB0aGUgc3RhcnQgYWRkcmVzcy4gICovCi1zdGF0aWMgYmZkX3ZtYSBjaGFuZ2Vfc3RhcnQgPSAwOwotc3RhdGljIGJvb2xlYW4gc2V0X3N0YXJ0X3NldCA9IGZhbHNlOwotc3RhdGljIGJmZF92bWEgc2V0X3N0YXJ0OwotCi0vKiBDaGFuZ2VzIHRvIHNlY3Rpb24gYWRkcmVzc2VzLiAgKi8KLXN0YXRpYyBiZmRfdm1hIGNoYW5nZV9zZWN0aW9uX2FkZHJlc3MgPSAwOwotCi0vKiBGaWxsaW5nIGdhcHMgYmV0d2VlbiBzZWN0aW9ucy4gICovCi1zdGF0aWMgYm9vbGVhbiBnYXBfZmlsbF9zZXQgPSBmYWxzZTsKLXN0YXRpYyBiZmRfYnl0ZSBnYXBfZmlsbCA9IDA7Ci0KLS8qIFBhZCB0byBhIGdpdmVuIGFkZHJlc3MuICAqLwotc3RhdGljIGJvb2xlYW4gcGFkX3RvX3NldCA9IGZhbHNlOwotc3RhdGljIGJmZF92bWEgcGFkX3RvOwotCi0vKiBMaXN0IG9mIHNlY3Rpb25zIHRvIGFkZC4gICovCi0KLXN0cnVjdCBzZWN0aW9uX2FkZAotewotICAvKiBOZXh0IHNlY3Rpb24gdG8gYWRkLiAgKi8KLSAgc3RydWN0IHNlY3Rpb25fYWRkICpuZXh0OwotICAvKiBOYW1lIG9mIHNlY3Rpb24gdG8gYWRkLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogTmFtZSBvZiBmaWxlIGhvbGRpbmcgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAvKiBTaXplIG9mIGZpbGUuICAqLwotICBzaXplX3Qgc2l6ZTsKLSAgLyogQ29udGVudHMgb2YgZmlsZS4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogQkZEIHNlY3Rpb24sIGFmdGVyIGl0IGhhcyBiZWVuIGFkZGVkLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci19OwotCi1zdGF0aWMgc3RydWN0IHNlY3Rpb25fYWRkICphZGRfc2VjdGlvbnM7Ci0KLS8qIFdoZXRoZXIgdG8gY29udmVydCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb252ZXJ0X2RlYnVnZ2luZyA9IGZhbHNlOwotCi0vKiBXaGV0aGVyIHRvIGNoYW5nZSB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgaW4gc3ltYm9sIG5hbWVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gY2hhbmdlX2xlYWRpbmdfY2hhciA9IGZhbHNlOwotCi0vKiBXaGV0aGVyIHRvIHJlbW92ZSB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgZnJvbSBnbG9iYWwgc3ltYm9sIG5hbWVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gcmVtb3ZlX2xlYWRpbmdfY2hhciA9IGZhbHNlOwotCi0vKiBMaXN0IG9mIHN5bWJvbHMgdG8gc3RyaXAsIGtlZXAsIGxvY2FsaXplLCBhbmQgd2Vha2VuLiAgKi8KLQotc3RhdGljIHN0cnVjdCBzeW1saXN0ICpzdHJpcF9zcGVjaWZpY19saXN0ID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3Qgc3ltbGlzdCAqa2VlcF9zcGVjaWZpY19saXN0ID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3Qgc3ltbGlzdCAqbG9jYWxpemVfc3BlY2lmaWNfbGlzdCA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IHN5bWxpc3QgKndlYWtlbl9zcGVjaWZpY19saXN0ID0gTlVMTDsKLQotLyogSWYgdGhpcyBpcyB0cnVlLCB3ZSB3ZWFrZW4gZ2xvYmFsIHN5bWJvbHMgKHNldCBCU0ZfV0VBSykuICAqLwotCi1zdGF0aWMgYm9vbGVhbiB3ZWFrZW4gPSBmYWxzZTsKLQotLyogMTUwIGlzbid0IHNwZWNpYWw7IGl0J3MganVzdCBhbiBhcmJpdHJhcnkgbm9uLUFTQ0lJIGNoYXIgdmFsdWUuICAqLwotCi0jZGVmaW5lIE9QVElPTl9BRERfU0VDVElPTiAxNTAKLSNkZWZpbmUgT1BUSU9OX0NIQU5HRV9BRERSRVNTRVMgKE9QVElPTl9BRERfU0VDVElPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9DSEFOR0VfTEVBRElOR19DSEFSIChPUFRJT05fQ0hBTkdFX0FERFJFU1NFUyArIDEpCi0jZGVmaW5lIE9QVElPTl9DSEFOR0VfU1RBUlQgKE9QVElPTl9DSEFOR0VfTEVBRElOR19DSEFSICsgMSkKLSNkZWZpbmUgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1MgKE9QVElPTl9DSEFOR0VfU1RBUlQgKyAxKQotI2RlZmluZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fTE1BIChPUFRJT05fQ0hBTkdFX1NFQ1RJT05fQUREUkVTUyArIDEpCi0jZGVmaW5lIE9QVElPTl9DSEFOR0VfU0VDVElPTl9WTUEgKE9QVElPTl9DSEFOR0VfU0VDVElPTl9MTUEgKyAxKQotI2RlZmluZSBPUFRJT05fQ0hBTkdFX1dBUk5JTkdTIChPUFRJT05fQ0hBTkdFX1NFQ1RJT05fVk1BICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RFQlVHR0lORyAoT1BUSU9OX0NIQU5HRV9XQVJOSU5HUyArIDEpCi0jZGVmaW5lIE9QVElPTl9HQVBfRklMTCAoT1BUSU9OX0RFQlVHR0lORyArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19DSEFOR0VfV0FSTklOR1MgKE9QVElPTl9HQVBfRklMTCArIDEpCi0jZGVmaW5lIE9QVElPTl9QQURfVE8gKE9QVElPTl9OT19DSEFOR0VfV0FSTklOR1MgKyAxKQotI2RlZmluZSBPUFRJT05fUkVNT1ZFX0xFQURJTkdfQ0hBUiAoT1BUSU9OX1BBRF9UTyArIDEpCi0jZGVmaW5lIE9QVElPTl9TRVRfU0VDVElPTl9GTEFHUyAoT1BUSU9OX1JFTU9WRV9MRUFESU5HX0NIQVIgKyAxKQotI2RlZmluZSBPUFRJT05fU0VUX1NUQVJUIChPUFRJT05fU0VUX1NFQ1RJT05fRkxBR1MgKyAxKQotI2RlZmluZSBPUFRJT05fU1RSSVBfVU5ORUVERUQgKE9QVElPTl9TRVRfU1RBUlQgKyAxKQotI2RlZmluZSBPUFRJT05fV0VBS0VOIChPUFRJT05fU1RSSVBfVU5ORUVERUQgKyAxKQotCi0vKiBPcHRpb25zIHRvIGhhbmRsZSBpZiBydW5uaW5nIGFzICJzdHJpcCIuICAqLwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBzdHJpcF9vcHRpb25zW10gPQotewotICB7ImRpc2NhcmQtYWxsIiwgbm9fYXJndW1lbnQsIDAsICd4J30sCi0gIHsiZGlzY2FyZC1sb2NhbHMiLCBub19hcmd1bWVudCwgMCwgJ1gnfSwKLSAgeyJmb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0YnfSwgLyogT2Jzb2xldGUgKi8KLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJ30sCi0gIHsiaW5wdXQtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sIC8qIE9ic29sZXRlICovCi0gIHsiaW5wdXQtdGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sCi0gIHsia2VlcC1zeW1ib2wiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0snfSwKLSAgeyJvdXRwdXQtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdPJ30sCS8qIE9ic29sZXRlICovCi0gIHsib3V0cHV0LXRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTyd9LAotICB7InByZXNlcnZlLWRhdGVzIiwgbm9fYXJndW1lbnQsIDAsICdwJ30sCi0gIHsicmVtb3ZlLXNlY3Rpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1InfSwKLSAgeyJzdHJpcC1hbGwiLCBub19hcmd1bWVudCwgMCwgJ3MnfSwKLSAgeyJzdHJpcC1kZWJ1ZyIsIG5vX2FyZ3VtZW50LCAwLCAnUyd9LAotICB7InN0cmlwLXVubmVlZGVkIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9TVFJJUF9VTk5FRURFRH0sCi0gIHsic3RyaXAtc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdOJ30sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJ30sCi0gIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCAwLCAndid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ1YnfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQotLyogT3B0aW9ucyB0byBoYW5kbGUgaWYgcnVubmluZyBhcyAib2JqY29weSIuICAqLwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBjb3B5X29wdGlvbnNbXSA9Ci17Ci0gIHsiYWRkLXNlY3Rpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0FERF9TRUNUSU9OfSwKLSAgeyJhZGp1c3Qtc3RhcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9TVEFSVH0sCi0gIHsiYWRqdXN0LXZtYSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX0FERFJFU1NFU30sCi0gIHsiYWRqdXN0LXNlY3Rpb24tdm1hIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfU0VDVElPTl9BRERSRVNTfSwKLSAgeyJhZGp1c3Qtd2FybmluZ3MiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9XQVJOSU5HU30sCi0gIHsiYnl0ZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnYid9LAotICB7ImNoYW5nZS1hZGRyZXNzZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9BRERSRVNTRVN9LAotICB7ImNoYW5nZS1sZWFkaW5nLWNoYXIiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9MRUFESU5HX0NIQVJ9LAotICB7ImNoYW5nZS1zZWN0aW9uLWFkZHJlc3MiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1N9LAotICB7ImNoYW5nZS1zZWN0aW9uLWxtYSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fTE1BfSwKLSAgeyJjaGFuZ2Utc2VjdGlvbi12bWEiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX1ZNQX0sCi0gIHsiY2hhbmdlLXN0YXJ0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfU1RBUlR9LAotICB7ImNoYW5nZS13YXJuaW5ncyIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1dBUk5JTkdTfSwKLSAgeyJkZWJ1Z2dpbmciLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX0RFQlVHR0lOR30sCi0gIHsiZGlzY2FyZC1hbGwiLCBub19hcmd1bWVudCwgMCwgJ3gnfSwKLSAgeyJkaXNjYXJkLWxvY2FscyIsIG5vX2FyZ3VtZW50LCAwLCAnWCd9LAotICB7ImZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRid9LCAvKiBPYnNvbGV0ZSAqLwotICB7ImdhcC1maWxsIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9HQVBfRklMTH0sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICB7ImlucHV0LWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSSd9LCAvKiBPYnNvbGV0ZSAqLwotICB7ImlucHV0LXRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSSd9LAotICB7ImludGVybGVhdmUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2knfSwKLSAgeyJrZWVwLXN5bWJvbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSyd9LAotICB7Im5vLWFkanVzdC13YXJuaW5ncyIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fTk9fQ0hBTkdFX1dBUk5JTkdTfSwKLSAgeyJuby1jaGFuZ2Utd2FybmluZ3MiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX05PX0NIQU5HRV9XQVJOSU5HU30sCi0gIHsib3V0cHV0LWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTyd9LAkvKiBPYnNvbGV0ZSAqLwotICB7Im91dHB1dC10YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nfSwKLSAgeyJwYWQtdG8iLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX1BBRF9UT30sCi0gIHsicHJlc2VydmUtZGF0ZXMiLCBub19hcmd1bWVudCwgMCwgJ3AnfSwKLSAgeyJsb2NhbGl6ZS1zeW1ib2wiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0wnfSwKLSAgeyJyZW1vdmUtbGVhZGluZy1jaGFyIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9SRU1PVkVfTEVBRElOR19DSEFSfSwKLSAgeyJyZW1vdmUtc2VjdGlvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUid9LAotICB7InNldC1zZWN0aW9uLWZsYWdzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9TRVRfU0VDVElPTl9GTEFHU30sCi0gIHsic2V0LXN0YXJ0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9TRVRfU1RBUlR9LAotICB7InN0cmlwLWFsbCIsIG5vX2FyZ3VtZW50LCAwLCAnUyd9LAotICB7InN0cmlwLWRlYnVnIiwgbm9fYXJndW1lbnQsIDAsICdnJ30sCi0gIHsic3RyaXAtdW5uZWVkZWQiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX1NUUklQX1VOTkVFREVEfSwKLSAgeyJzdHJpcC1zeW1ib2wiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ04nfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0YnfSwKLSAgeyJ2ZXJib3NlIiwgbm9fYXJndW1lbnQsIDAsICd2J30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAnVid9LAotICB7IndlYWtlbiIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fV0VBS0VOfSwKLSAgeyJ3ZWFrZW4tc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdXJ30sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0KLS8qIElNUE9SVFMgKi8KLWV4dGVybiBjaGFyICpwcm9ncmFtX25hbWU7Ci0KLS8qIFRoaXMgZmxhZyBkaXN0aW5ndWlzaGVzIGJldHdlZW4gc3RyaXAgYW5kIG9iamNvcHk6Ci0gICAxIG1lYW5zIHRoaXMgaXMgJ3N0cmlwJzsgMCBtZWFucyB0aGlzIGlzICdvYmpjb3B5Jy4KLSAgIC0xIG1lYW5zIGlmIHdlIHNob3VsZCB1c2UgYXJndlswXSB0byBkZWNpZGUuICovCi1leHRlcm4gaW50IGlzX3N0cmlwOwotCi0KLXN0YXRpYyB2b2lkCi1jb3B5X3VzYWdlIChzdHJlYW0sIGV4aXRfc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBleGl0X3N0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1Vc2FnZTogJXMgWy12VlNwZ3hYXSBbLUkgYmZkbmFtZV0gWy1PIGJmZG5hbWVdIFstRiBiZmRuYW1lXSBbLWIgYnl0ZV1cblwKLSAgICAgICBbLVIgc2VjdGlvbl0gWy1pIGludGVybGVhdmVdIFstLWludGVybGVhdmU9aW50ZXJsZWF2ZV0gWy0tYnl0ZT1ieXRlXVxuXAotICAgICAgIFstLWlucHV0LXRhcmdldD1iZmRuYW1lXSBbLS1vdXRwdXQtdGFyZ2V0PWJmZG5hbWVdIFstLXRhcmdldD1iZmRuYW1lXVxuXAotICAgICAgIFstLXN0cmlwLWFsbF0gWy0tc3RyaXAtZGVidWddIFstLXN0cmlwLXVubmVlZGVkXSBbLS1kaXNjYXJkLWFsbF1cblwKLSAgICAgICBbLS1kaXNjYXJkLWxvY2Fsc10gWy0tZGVidWdnaW5nXSBbLS1yZW1vdmUtc2VjdGlvbj1zZWN0aW9uXVxuIiksCi0JICAgcHJvZ3JhbV9uYW1lKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gICAgICAgWy0tZ2FwLWZpbGw9dmFsXSBbLS1wYWQtdG89YWRkcmVzc10gWy0tcHJlc2VydmUtZGF0ZXNdXG5cCi0gICAgICAgWy0tc2V0LXN0YXJ0PXZhbF0gXG5cCi0gICAgICAgWy0tY2hhbmdlLXN0YXJ0PWluY3JdIFstLWNoYW5nZS1hZGRyZXNzZXM9aW5jcl0gXG5cCi0gICAgICAgKC0tYWRqdXN0LXN0YXJ0ICAgYW5kICAtLWFkanVzdC12bWEgYXJlIGFsaWFzZXMgZm9yIHRoZXNlIHR3bykgXG5cCi0gICAgICAgWy0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzcz1zZWN0aW9uez0sKywtfXZhbF1cblwKLSAgICAgICAoLS1hZGp1c3Qtc2VjdGlvbi12bWEgaXMgYW4gYWxpYXMgZm9yIC0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzcylcblwKLSAgICAgICBbLS1jaGFuZ2Utc2VjdGlvbi1sbWE9c2VjdGlvbns9LCssLX12YWxdXG5cCi0gICAgICAgWy0tY2hhbmdlLXNlY3Rpb24tdm1hPXNlY3Rpb257PSwrLC19dmFsXVxuXAotICAgICAgIFstLWFkanVzdC13YXJuaW5nc10gWy0tbm8tYWRqdXN0LXdhcm5pbmdzXVxuXAotICAgICAgIFstLWNoYW5nZS13YXJuaW5nc10gWy0tbm8tY2hhbmdlLXdhcm5pbmdzXVxuXAotICAgICAgIFstLXNldC1zZWN0aW9uLWZsYWdzPXNlY3Rpb249ZmxhZ3NdIFstLWFkZC1zZWN0aW9uPXNlY3Rpb25uYW1lPWZpbGVuYW1lXVxuXAotICAgICAgIFstLWtlZXAtc3ltYm9sIHN5bWJvbF0gWy1LIHN5bWJvbF0gWy0tc3RyaXAtc3ltYm9sIHN5bWJvbF0gWy1OIHN5bWJvbF1cblwKLSAgICAgICBbLS1sb2NhbGl6ZS1zeW1ib2wgc3ltYm9sXSBbLUwgc3ltYm9sXSBbLS13ZWFrZW4tc3ltYm9sIHN5bWJvbF1cblwKLSAgICAgICBbLVcgc3ltYm9sXSBbLS1jaGFuZ2UtbGVhZGluZy1jaGFyXSBbLS1yZW1vdmUtbGVhZGluZy1jaGFyXSBbLS13ZWFrZW5dXG5cCi0gICAgICAgWy0tdmVyYm9zZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gaW4tZmlsZSBbb3V0LWZpbGVdXG4iKSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKGV4aXRfc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoZXhpdF9zdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZAotc3RyaXBfdXNhZ2UgKHN0cmVhbSwgZXhpdF9zdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IGV4aXRfc3RhdHVzOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLVVzYWdlOiAlcyBbLXZWc1NwZ3hYXSBbLUkgYmZkbmFtZV0gWy1PIGJmZG5hbWVdIFstRiBiZmRuYW1lXSBbLVIgc2VjdGlvbl1cblwKLSAgICAgICBbLS1pbnB1dC10YXJnZXQ9YmZkbmFtZV0gWy0tb3V0cHV0LXRhcmdldD1iZmRuYW1lXSBbLS10YXJnZXQ9YmZkbmFtZV1cblwKLSAgICAgICBbLS1zdHJpcC1hbGxdIFstLXN0cmlwLWRlYnVnXSBbLS1zdHJpcC11bm5lZWRlZF0gWy0tZGlzY2FyZC1hbGxdXG5cCi0gICAgICAgWy0tZGlzY2FyZC1sb2NhbHNdIFstLWtlZXAtc3ltYm9sIHN5bWJvbF0gWy1LIHN5bWJvbF1cblwKLSAgICAgICBbLS1zdHJpcC1zeW1ib2wgc3ltYm9sXSBbLU4gc3ltYm9sXSBbLS1yZW1vdmUtc2VjdGlvbj1zZWN0aW9uXVxuXAotICAgICAgIFstbyBmaWxlXSBbLS1wcmVzZXJ2ZS1kYXRlc10gWy0tdmVyYm9zZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gZmlsZS4uLlxuIiksCi0JICAgcHJvZ3JhbV9uYW1lKTsKLSAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOwotICBpZiAoZXhpdF9zdGF0dXMgPT0gMCkKLSAgICBmcHJpbnRmIChzdHJlYW0sIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotICBleGl0IChleGl0X3N0YXR1cyk7Ci19Ci0KLS8qIFBhcnNlIHNlY3Rpb24gZmxhZ3MgaW50byBhIGZsYWd3b3JkLCB3aXRoIGEgZmF0YWwgZXJyb3IgaWYgdGhlCi0gICBzdHJpbmcgY2FuJ3QgYmUgcGFyc2VkLiAgKi8KLQotc3RhdGljIGZsYWd3b3JkCi1wYXJzZV9mbGFncyAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgZmxhZ3dvcmQgcmV0OwotICBjb25zdCBjaGFyICpzbmV4dDsKLSAgaW50IGxlbjsKLQotICByZXQgPSBTRUNfTk9fRkxBR1M7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBzbmV4dCA9IHN0cmNociAocywgJywnKTsKLSAgICAgIGlmIChzbmV4dCA9PSBOVUxMKQotCWxlbiA9IHN0cmxlbiAocyk7Ci0gICAgICBlbHNlCi0JewotCSAgbGVuID0gc25leHQgLSBzOwotCSAgKytzbmV4dDsKLQl9Ci0KLSAgICAgIGlmICgwKSA7Ci0jZGVmaW5lIFBBUlNFX0ZMQUcoZm5hbWUsZnZhbCkgXAotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoZm5hbWUsIHMsIGxlbikgPT0gMCkgcmV0IHw9IGZ2YWwKLSAgICAgIFBBUlNFX0ZMQUcgKCJhbGxvYyIsIFNFQ19BTExPQyk7Ci0gICAgICBQQVJTRV9GTEFHICgibG9hZCIsIFNFQ19MT0FEKTsKLSAgICAgIFBBUlNFX0ZMQUcgKCJyZWFkb25seSIsIFNFQ19SRUFET05MWSk7Ci0gICAgICBQQVJTRV9GTEFHICgiY29kZSIsIFNFQ19DT0RFKTsKLSAgICAgIFBBUlNFX0ZMQUcgKCJkYXRhIiwgU0VDX0RBVEEpOwotICAgICAgUEFSU0VfRkxBRyAoInJvbSIsIFNFQ19ST00pOwotICAgICAgUEFSU0VfRkxBRyAoImNvbnRlbnRzIiwgU0VDX0hBU19DT05URU5UUyk7Ci0jdW5kZWYgUEFSU0VfRkxBRwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKmNvcHk7Ci0KLQkgIGNvcHkgPSB4bWFsbG9jIChsZW4gKyAxKTsKLQkgIHN0cm5jcHkgKGNvcHksIHMsIGxlbik7Ci0JICBjb3B5W2xlbl0gPSAnXDAnOwotCSAgbm9uX2ZhdGFsIChfKCJ1bnJlY29nbml6ZWQgc2VjdGlvbiBmbGFnIGAlcyciKSwgY29weSk7Ci0JICBmYXRhbCAoXygic3VwcG9ydGVkIGZsYWdzOiBhbGxvYywgbG9hZCwgcmVhZG9ubHksIGNvZGUsIGRhdGEsIHJvbSwgY29udGVudHMiKSk7Ci0JfQotCi0gICAgICBzID0gc25leHQ7Ci0gICAgfQotICB3aGlsZSAocyAhPSBOVUxMKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBGaW5kIGFuZCBvcHRpb25hbGx5IGFkZCBhbiBlbnRyeSBpbiB0aGUgY2hhbmdlX3NlY3Rpb25zIGxpc3QuICAqLwotCi1zdGF0aWMgc3RydWN0IHNlY3Rpb25fbGlzdCAqCi1maW5kX3NlY3Rpb25fbGlzdCAobmFtZSwgYWRkKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBib29sZWFuIGFkZDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHNlY3Rpb25fbGlzdCAqcDsKLQotICBmb3IgKHAgPSBjaGFuZ2Vfc2VjdGlvbnM7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgaWYgKHN0cmNtcCAocC0+bmFtZSwgbmFtZSkgPT0gMCkKLSAgICAgIHJldHVybiBwOwotCi0gIGlmICghIGFkZCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBwID0gKHN0cnVjdCBzZWN0aW9uX2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc2VjdGlvbl9saXN0KSk7Ci0gIHAtPm5hbWUgPSBuYW1lOwotICBwLT51c2VkID0gZmFsc2U7Ci0gIHAtPnJlbW92ZSA9IGZhbHNlOwotICBwLT5jaGFuZ2Vfdm1hID0gQ0hBTkdFX0lHTk9SRTsKLSAgcC0+Y2hhbmdlX2xtYSA9IENIQU5HRV9JR05PUkU7Ci0gIHAtPnZtYV92YWwgPSAwOwotICBwLT5sbWFfdmFsID0gMDsKLSAgcC0+c2V0X2ZsYWdzID0gZmFsc2U7Ci0gIHAtPmZsYWdzID0gMDsKLQotICBwLT5uZXh0ID0gY2hhbmdlX3NlY3Rpb25zOwotICBjaGFuZ2Vfc2VjdGlvbnMgPSBwOwotCi0gIHJldHVybiBwOwotfQotCi0vKiBBZGQgYSBzeW1ib2wgdG8gc3RyaXBfc3BlY2lmaWNfbGlzdC4gICovCi0KLXN0YXRpYyB2b2lkIAotYWRkX3NwZWNpZmljX3N5bWJvbCAobmFtZSwgbGlzdCkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IHN5bWxpc3QgKipsaXN0OwotewotICBzdHJ1Y3Qgc3ltbGlzdCAqdG1wX2xpc3Q7Ci0KLSAgdG1wX2xpc3QgPSAoc3RydWN0IHN5bWxpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3ltbGlzdCkpOwotICB0bXBfbGlzdC0+bmFtZSA9IG5hbWU7Ci0gIHRtcF9saXN0LT5uZXh0ID0gKmxpc3Q7Ci0gICpsaXN0ID0gdG1wX2xpc3Q7Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIGEgc3ltYm9sIHNob3VsZCBiZSBzdHJpcHBlZCBvciBrZXB0IGJhc2VkIG9uCi0gICBzdHJpcF9zcGVjaWZpY19saXN0IGFuZCBrZWVwX3N5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaXNfc3BlY2lmaWVkX3N5bWJvbCAobmFtZSwgbGlzdCkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IHN5bWxpc3QgKmxpc3Q7Ci17Ci0gIHN0cnVjdCBzeW1saXN0ICp0bXBfbGlzdDsKLQotICBmb3IgKHRtcF9saXN0ID0gbGlzdDsgdG1wX2xpc3Q7IHRtcF9saXN0ID0gdG1wX2xpc3QtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgdG1wX2xpc3QtPm5hbWUpID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNlZSBpZiBhIHNlY3Rpb24gaXMgYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pc19zdHJpcF9zZWN0aW9uIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgc3RydWN0IHNlY3Rpb25fbGlzdCAqcDsKLQotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19ERUJVR0dJTkcpICE9IDAKLSAgICAgICYmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX0RFQlVHCi0JICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX1VOTkVFREVECi0JICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX0FMTAotCSAgfHwgZGlzY2FyZF9sb2NhbHMgPT0gTE9DQUxTX0FMTAotCSAgfHwgY29udmVydF9kZWJ1Z2dpbmcpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIHNlY3Rpb25zX3JlbW92ZWQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBwID0gZmluZF9zZWN0aW9uX2xpc3QgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCBmYWxzZSk7Ci0gIHJldHVybiBwICE9IE5VTEwgJiYgcC0+cmVtb3ZlID8gdHJ1ZSA6IGZhbHNlOwotfQotCi0vKiBDaG9vc2Ugd2hpY2ggc3ltYm9sIGVudHJpZXMgdG8gY29weTsgcHV0IHRoZSByZXN1bHQgaW4gT1NZTVMuCi0gICBXZSBkb24ndCBjb3B5IGluIHBsYWNlLCBiZWNhdXNlIHRoYXQgY29uZnVzZXMgdGhlIHJlbG9jcy4KLSAgIFJldHVybiB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgdG8gcHJpbnQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1maWx0ZXJfc3ltYm9scyAoYWJmZCwgb2JmZCwgb3N5bXMsIGlzeW1zLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzeW1ib2wgKipvc3ltcywgKippc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLXsKLSAgcmVnaXN0ZXIgYXN5bWJvbCAqKmZyb20gPSBpc3ltcywgKip0byA9IG9zeW1zOwotICBsb25nIHNyY19jb3VudCA9IDAsIGRzdF9jb3VudCA9IDA7Ci0KLSAgZm9yICg7IHNyY19jb3VudCA8IHN5bWNvdW50OyBzcmNfY291bnQrKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW0gPSBmcm9tW3NyY19jb3VudF07Ci0gICAgICBmbGFnd29yZCBmbGFncyA9IHN5bS0+ZmxhZ3M7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKTsKLSAgICAgIGludCBrZWVwOwotCi0gICAgICBpZiAoY2hhbmdlX2xlYWRpbmdfY2hhcgotCSAgJiYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkKLQkgICAgICAhPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKG9iZmQpKQotCSAgJiYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkgPT0gJ1wwJwotCSAgICAgIHx8IChuYW1lWzBdID09IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkpKSkKLQl7Ci0JICBpZiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChvYmZkKSA9PSAnXDAnKQotCSAgICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSA9IG5hbWUgKyAxOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqbjsKLQotCSAgICAgIG4gPSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMik7Ci0JICAgICAgblswXSA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAob2JmZCk7Ci0JICAgICAgaWYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkgPT0gJ1wwJykKLQkJc3RyY3B5IChuICsgMSwgbmFtZSk7Ci0JICAgICAgZWxzZQotCQlzdHJjcHkgKG4gKyAxLCBuYW1lICsgMSk7Ci0JICAgICAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSkgPSBuOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocmVtb3ZlX2xlYWRpbmdfY2hhcgotCSAgJiYgKChmbGFncyAmIEJTRl9HTE9CQUwpICE9IDAKLQkgICAgICB8fCAoZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMAotCSAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKQotCSAgICAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQkgICYmIG5hbWVbMF0gPT0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSkKLQluYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSA9IG5hbWUgKyAxOwotCi0gICAgICBpZiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9BTEwpCi0Ja2VlcCA9IDA7Ci0gICAgICBlbHNlIGlmICgoZmxhZ3MgJiBCU0ZfS0VFUCkgIT0gMAkJLyogVXNlZCBpbiByZWxvY2F0aW9uLiAgKi8KLQkgICAgICAgfHwgKChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMAotCQkgICAmJiAoKCpiZmRfZ2V0X3NlY3Rpb24gKHN5bSktPnN5bWJvbF9wdHJfcHRyKS0+ZmxhZ3MKLQkJICAgICAgICYgQlNGX0tFRVApICE9IDApKQotCWtlZXAgPSAxOwotICAgICAgZWxzZSBpZiAoKGZsYWdzICYgQlNGX0dMT0JBTCkgIT0gMAkvKiBHbG9iYWwgc3ltYm9sLiAgKi8KLQkgICAgICAgfHwgKGZsYWdzICYgQlNGX1dFQUspICE9IDAKLQkgICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICAgICAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQlrZWVwID0gc3RyaXBfc3ltYm9scyAhPSBTVFJJUF9VTk5FRURFRDsKLSAgICAgIGVsc2UgaWYgKChmbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDApCS8qIERlYnVnZ2luZyBzeW1ib2wuICAqLwotCWtlZXAgPSAoc3RyaXBfc3ltYm9scyAhPSBTVFJJUF9ERUJVRwotCQkmJiBzdHJpcF9zeW1ib2xzICE9IFNUUklQX1VOTkVFREVECi0JCSYmICEgY29udmVydF9kZWJ1Z2dpbmcpOwotICAgICAgZWxzZQkJCS8qIExvY2FsIHN5bWJvbC4gICovCi0Ja2VlcCA9IChzdHJpcF9zeW1ib2xzICE9IFNUUklQX1VOTkVFREVECi0JCSYmIChkaXNjYXJkX2xvY2FscyAhPSBMT0NBTFNfQUxMCi0JCSAgICAmJiAoZGlzY2FyZF9sb2NhbHMgIT0gTE9DQUxTX1NUQVJUX0wKLQkJCXx8ICEgYmZkX2lzX2xvY2FsX2xhYmVsIChhYmZkLCBzeW0pKSkpOwotCi0gICAgICBpZiAoa2VlcCAmJiBpc19zcGVjaWZpZWRfc3ltYm9sIChuYW1lLCBzdHJpcF9zcGVjaWZpY19saXN0KSkKLQlrZWVwID0gMDsKLSAgICAgIGlmICgha2VlcCAmJiBpc19zcGVjaWZpZWRfc3ltYm9sIChuYW1lLCBrZWVwX3NwZWNpZmljX2xpc3QpKQotCWtlZXAgPSAxOwotICAgICAgaWYgKGtlZXAgJiYgaXNfc3RyaXBfc2VjdGlvbiAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQlrZWVwID0gMDsKLQotICAgICAgaWYgKGtlZXAgJiYgKGZsYWdzICYgQlNGX0dMT0JBTCkgIT0gMAotCSAgJiYgKHdlYWtlbiB8fCBpc19zcGVjaWZpZWRfc3ltYm9sIChuYW1lLCB3ZWFrZW5fc3BlY2lmaWNfbGlzdCkpKQotCXsKLQkgIHN5bS0+ZmxhZ3MgJj1+IEJTRl9HTE9CQUw7Ci0JICBzeW0tPmZsYWdzIHw9IEJTRl9XRUFLOwotCX0KLSAgICAgIGlmIChrZWVwICYmIChmbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX1dFQUspKQotCSAgJiYgaXNfc3BlY2lmaWVkX3N5bWJvbCAobmFtZSwgbG9jYWxpemVfc3BlY2lmaWNfbGlzdCkpCi0JewotCSAgc3ltLT5mbGFncyAmPSB+KEJTRl9HTE9CQUwgfCBCU0ZfV0VBSyk7Ci0JICBzeW0tPmZsYWdzIHw9IEJTRl9MT0NBTDsKLQl9Ci0KLSAgICAgIGlmIChrZWVwKQotCXRvW2RzdF9jb3VudCsrXSA9IHN5bTsKLSAgICB9Ci0KLSAgdG9bZHN0X2NvdW50XSA9IE5VTEw7Ci0KLSAgcmV0dXJuIGRzdF9jb3VudDsKLX0KLQotLyogS2VlcCBvbmx5IGV2ZXJ5IGBjb3B5X2J5dGUndGggYnl0ZSBpbiBNRU1IVU5LLCB3aGljaCBpcyAqU0laRSBieXRlcyBsb25nLgotICAgQWRqdXN0ICpTSVpFLiAgKi8KLQotc3RhdGljIHZvaWQKLWZpbHRlcl9ieXRlcyAobWVtaHVuaywgc2l6ZSkKLSAgICAgY2hhciAqbWVtaHVuazsKLSAgICAgYmZkX3NpemVfdHlwZSAqc2l6ZTsKLXsKLSAgY2hhciAqZnJvbSA9IG1lbWh1bmsgKyBjb3B5X2J5dGUsICp0byA9IG1lbWh1bmssICplbmQgPSBtZW1odW5rICsgKnNpemU7Ci0KLSAgZm9yICg7IGZyb20gPCBlbmQ7IGZyb20gKz0gaW50ZXJsZWF2ZSkKLSAgICAqdG8rKyA9ICpmcm9tOwotICBpZiAoKnNpemUgJSBpbnRlcmxlYXZlID4gY29weV9ieXRlKQotICAgICpzaXplID0gKCpzaXplIC8gaW50ZXJsZWF2ZSkgKyAxOwotICBlbHNlCi0gICAgKnNpemUgLz0gaW50ZXJsZWF2ZTsKLX0KLQotLyogQ29weSBvYmplY3QgZmlsZSBJQkZEIG9udG8gT0JGRC4gICovCi0KLXN0YXRpYyB2b2lkCi1jb3B5X29iamVjdCAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGJmZF92bWEgc3RhcnQ7Ci0gIGxvbmcgc3ltY291bnQ7Ci0gIGFzZWN0aW9uICoqb3NlY3Rpb25zID0gTlVMTDsKLSAgYmZkX3NpemVfdHlwZSAqZ2FwcyA9IE5VTEw7Ci0gIGJmZF9zaXplX3R5cGUgbWF4X2dhcCA9IDA7Ci0gIGxvbmcgc3ltc2l6ZTsKLSAgUFRSIGRoYW5kbGU7Ci0KLQotICBpZiAoIWJmZF9zZXRfZm9ybWF0IChvYmZkLCBiZmRfZ2V0X2Zvcm1hdCAoaWJmZCkpKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0gIGlmICh2ZXJib3NlKQotICAgIHByaW50ZiAoXygiY29weSBmcm9tICVzKCVzKSB0byAlcyglcylcbiIpLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwgYmZkX2dldF90YXJnZXQgKGliZmQpLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwgYmZkX2dldF90YXJnZXQgKG9iZmQpKTsKLQotICBpZiAoc2V0X3N0YXJ0X3NldCkKLSAgICBzdGFydCA9IHNldF9zdGFydDsKLSAgZWxzZQotICAgIHN0YXJ0ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChpYmZkKTsKLSAgc3RhcnQgKz0gY2hhbmdlX3N0YXJ0OwotCi0gIGlmICghYmZkX3NldF9zdGFydF9hZGRyZXNzIChvYmZkLCBzdGFydCkKLSAgICAgIHx8ICFiZmRfc2V0X2ZpbGVfZmxhZ3MgKG9iZmQsCi0JCQkgICAgICAoYmZkX2dldF9maWxlX2ZsYWdzIChpYmZkKQotCQkJICAgICAgICYgYmZkX2FwcGxpY2FibGVfZmlsZV9mbGFncyAob2JmZCkpKSkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICAvKiBDb3B5IGFyY2hpdGVjdHVyZSBvZiBpbnB1dCBmaWxlIHRvIG91dHB1dCBmaWxlICovCi0gIGlmICghYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksCi0JCQkgIGJmZF9nZXRfbWFjaCAoaWJmZCkpKQotICAgIG5vbl9mYXRhbCAoXygiV2FybmluZzogT3V0cHV0IGZpbGUgY2Fubm90IHJlcHJlc2VudCBhcmNoaXRlY3R1cmUgJXMiKSwKLQkgICAgICAgYmZkX3ByaW50YWJsZV9hcmNoX21hY2ggKGJmZF9nZXRfYXJjaCAoaWJmZCksCi0JCQkJCWJmZF9nZXRfbWFjaCAoaWJmZCkpKTsKLSAgCi0gIGlmICghYmZkX3NldF9mb3JtYXQgKG9iZmQsIGJmZF9nZXRfZm9ybWF0IChpYmZkKSkpCi0gICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgaWYgKGlzeW1wcCkKLSAgICBmcmVlIChpc3ltcHApOwotICAKLSAgaWYgKG9zeW1wcCAhPSBpc3ltcHApCi0gICAgZnJlZSAob3N5bXBwKTsKLQotICAvKiBCRkQgbWFuZGF0ZXMgdGhhdCBhbGwgb3V0cHV0IHNlY3Rpb25zIGJlIGNyZWF0ZWQgYW5kIHNpemVzIHNldCBiZWZvcmUKLSAgICAgYW55IG91dHB1dCBpcyBkb25lLiAgVGh1cywgd2UgdHJhdmVyc2UgYWxsIHNlY3Rpb25zIG11bHRpcGxlIHRpbWVzLiAgKi8KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChpYmZkLCBzZXR1cF9zZWN0aW9uLCAodm9pZCAqKSBvYmZkKTsKLQotICBpZiAoYWRkX3NlY3Rpb25zICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IHNlY3Rpb25fYWRkICpwYWRkOwotICAgICAgc3RydWN0IHNlY3Rpb25fbGlzdCAqcHNldDsKLQotICAgICAgZm9yIChwYWRkID0gYWRkX3NlY3Rpb25zOyBwYWRkICE9IE5VTEw7IHBhZGQgPSBwYWRkLT5uZXh0KQotCXsKLQkgIHBhZGQtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChvYmZkLCBwYWRkLT5uYW1lKTsKLQkgIGlmIChwYWRkLT5zZWN0aW9uID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBub25fZmF0YWwgKF8oImNhbid0IGNyZWF0ZSBzZWN0aW9uIGAlcyc6ICVzIiksCi0JCSAgICAgICBwYWRkLT5uYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICAgICAgc3RhdHVzID0gMTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCSAgICAgIAotCSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvYmZkLCBwYWRkLT5zZWN0aW9uLCBwYWRkLT5zaXplKSkKLQkJUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLQkgICAgICBwc2V0ID0gZmluZF9zZWN0aW9uX2xpc3QgKHBhZGQtPm5hbWUsIGZhbHNlKTsKLQkgICAgICBpZiAocHNldCAhPSBOVUxMKQotCQlwc2V0LT51c2VkID0gdHJ1ZTsKLQotCSAgICAgIGlmIChwc2V0ICE9IE5VTEwgJiYgcHNldC0+c2V0X2ZsYWdzKQotCQlmbGFncyA9IHBzZXQtPmZsYWdzIHwgU0VDX0hBU19DT05URU5UUzsKLQkgICAgICBlbHNlCi0JCWZsYWdzID0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWSB8IFNFQ19EQVRBOwotCSAgICAgIAotCSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob2JmZCwgcGFkZC0+c2VjdGlvbiwgZmxhZ3MpKQotCQlSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotCSAgICAgIGlmIChwc2V0ICE9IE5VTEwpCi0JCXsKLQkJICBpZiAocHNldC0+Y2hhbmdlX3ZtYSAhPSBDSEFOR0VfSUdOT1JFKQotCQkgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3ZtYSAob2JmZCwgcGFkZC0+c2VjdGlvbiwgcHNldC0+dm1hX3ZhbCkpCi0JCSAgICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCQkgIAotCQkgIGlmIChwc2V0LT5jaGFuZ2VfbG1hICE9IENIQU5HRV9JR05PUkUpCi0JCSAgICB7Ci0JCSAgICAgIHBhZGQtPnNlY3Rpb24tPmxtYSA9IHBzZXQtPmxtYV92YWw7Ci0JCSAgICAgIAotCQkgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50Ci0JCQkgIChvYmZkLCBwYWRkLT5zZWN0aW9uLAotCQkJICAgYmZkX3NlY3Rpb25fYWxpZ25tZW50IChvYmZkLCBwYWRkLT5zZWN0aW9uKSkpCi0JCQlSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoZ2FwX2ZpbGxfc2V0IHx8IHBhZF90b19zZXQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKipzZXQ7Ci0gICAgICB1bnNpZ25lZCBpbnQgYywgaTsKLQotICAgICAgLyogV2UgbXVzdCBmaWxsIGluIGdhcHMgYmV0d2VlbiB0aGUgc2VjdGlvbnMgYW5kL29yIHdlIG11c3QgcGFkCi0JIHRoZSBsYXN0IHNlY3Rpb24gdG8gYSBzcGVjaWZpZWQgYWRkcmVzcy4gIFdlIGRvIHRoaXMgYnkKLQkgZ3JhYmJpbmcgYSBsaXN0IG9mIHRoZSBzZWN0aW9ucywgc29ydGluZyB0aGVtIGJ5IFZNQSwgYW5kCi0JIGluY3JlYXNpbmcgdGhlIHNlY3Rpb24gc2l6ZXMgYXMgcmVxdWlyZWQgdG8gZmlsbCB0aGUgZ2Fwcy4KLQkgV2Ugd3JpdGUgb3V0IHRoZSBnYXAgY29udGVudHMgYmVsb3cuICAqLwotCi0gICAgICBjID0gYmZkX2NvdW50X3NlY3Rpb25zIChvYmZkKTsKLSAgICAgIG9zZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgeG1hbGxvYyAoYyAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICAgICAgc2V0ID0gb3NlY3Rpb25zOwotICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChvYmZkLCBnZXRfc2VjdGlvbnMsICh2b2lkICopICZzZXQpOwotCi0gICAgICBxc29ydCAob3NlY3Rpb25zLCBjLCBzaXplb2YgKGFzZWN0aW9uICopLCBjb21wYXJlX3NlY3Rpb25fbG1hKTsKLQotICAgICAgZ2FwcyA9IChiZmRfc2l6ZV90eXBlICopIHhtYWxsb2MgKGMgKiBzaXplb2YgKGJmZF9zaXplX3R5cGUpKTsKLSAgICAgIG1lbXNldCAoZ2FwcywgMCwgYyAqIHNpemVvZiAoYmZkX3NpemVfdHlwZSkpOwotCi0gICAgICBpZiAoZ2FwX2ZpbGxfc2V0KQotCXsKLQkgIGZvciAoaSA9IDA7IGkgPCBjIC0gMTsgaSsrKQotCSAgICB7Ci0JICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotCSAgICAgIGJmZF92bWEgZ2FwX3N0YXJ0LCBnYXBfc3RvcDsKLQotCSAgICAgIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChvYmZkLCBvc2VjdGlvbnNbaV0pOwotCSAgICAgIGlmICgoZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0JCSAgfHwgKGZsYWdzICYgU0VDX0xPQUQpID09IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKG9iZmQsIG9zZWN0aW9uc1tpXSk7Ci0JICAgICAgZ2FwX3N0YXJ0ID0gYmZkX3NlY3Rpb25fbG1hIChvYmZkLCBvc2VjdGlvbnNbaV0pICsgc2l6ZTsKLQkgICAgICBnYXBfc3RvcCA9IGJmZF9zZWN0aW9uX2xtYSAob2JmZCwgb3NlY3Rpb25zW2kgKyAxXSk7Ci0JICAgICAgaWYgKGdhcF9zdGFydCA8IGdhcF9zdG9wKQotCQl7Ci0JCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG9iZmQsIG9zZWN0aW9uc1tpXSwKLQkJCQkJICAgICAgc2l6ZSArIChnYXBfc3RvcCAtIGdhcF9zdGFydCkpKQotCQkgICAgewotCQkgICAgICBub25fZmF0YWwgKF8oIkNhbid0IGZpbGwgZ2FwIGFmdGVyICVzOiAlcyIpLAotCQkJICAgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvYmZkLCBvc2VjdGlvbnNbaV0pLAotCQkJICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkJICAgICAgc3RhdHVzID0gMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgZ2Fwc1tpXSA9IGdhcF9zdG9wIC0gZ2FwX3N0YXJ0OwotCQkgIGlmIChtYXhfZ2FwIDwgZ2FwX3N0b3AgLSBnYXBfc3RhcnQpCi0JCSAgICBtYXhfZ2FwID0gZ2FwX3N0b3AgLSBnYXBfc3RhcnQ7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKHBhZF90b19zZXQpCi0JewotCSAgYmZkX3ZtYSBsbWE7Ci0JICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLQkgIGxtYSA9IGJmZF9zZWN0aW9uX2xtYSAob2JmZCwgb3NlY3Rpb25zW2MgLSAxXSk7Ci0JICBzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAob2JmZCwgb3NlY3Rpb25zW2MgLSAxXSk7Ci0JICBpZiAobG1hICsgc2l6ZSA8IHBhZF90bykKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvYmZkLCBvc2VjdGlvbnNbYyAtIDFdLAotCQkJCQkgIHBhZF90byAtIGxtYSkpCi0JCXsKLQkJICBub25fZmF0YWwgKF8oIkNhbid0IGFkZCBwYWRkaW5nIHRvICVzOiAlcyIpLAotCQkJICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKG9iZmQsIG9zZWN0aW9uc1tjIC0gMV0pLAotCQkJICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCQkgIHN0YXR1cyA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBnYXBzW2MgLSAxXSA9IHBhZF90byAtIChsbWEgKyBzaXplKTsKLQkJICBpZiAobWF4X2dhcCA8IHBhZF90byAtIChsbWEgKyBzaXplKSkKLQkJICAgIG1heF9nYXAgPSBwYWRfdG8gLSAobG1hICsgc2l6ZSk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogU3ltYm9sIGZpbHRlcmluZyBtdXN0IGhhcHBlbiBhZnRlciB0aGUgb3V0cHV0IHNlY3Rpb25zIGhhdmUKLSAgICAgYmVlbiBjcmVhdGVkLCBidXQgYmVmb3JlIHRoZWlyIGNvbnRlbnRzIGFyZSBzZXQuICAqLwotICBkaGFuZGxlID0gTlVMTDsKLSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChpYmZkKTsKLSAgaWYgKHN5bXNpemUgPCAwKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAKLSAgb3N5bXBwID0gaXN5bXBwID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChpYmZkLCBpc3ltcHApOwotICBpZiAoc3ltY291bnQgPCAwKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAKLSAgaWYgKGNvbnZlcnRfZGVidWdnaW5nKQotICAgIGRoYW5kbGUgPSByZWFkX2RlYnVnZ2luZ19pbmZvIChpYmZkLCBpc3ltcHAsIHN5bWNvdW50KTsKLSAgCi0gIGlmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX0RFQlVHIAotICAgICAgfHwgc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9BTEwKLSAgICAgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfVU5ORUVERUQKLSAgICAgIHx8IGRpc2NhcmRfbG9jYWxzICE9IExPQ0FMU19VTkRFRgotICAgICAgfHwgc3RyaXBfc3BlY2lmaWNfbGlzdCAhPSBOVUxMCi0gICAgICB8fCBrZWVwX3NwZWNpZmljX2xpc3QgIT0gTlVMTAotICAgICAgfHwgbG9jYWxpemVfc3BlY2lmaWNfbGlzdCAhPSBOVUxMCi0gICAgICB8fCB3ZWFrZW5fc3BlY2lmaWNfbGlzdCAhPSBOVUxMCi0gICAgICB8fCBzZWN0aW9uc19yZW1vdmVkCi0gICAgICB8fCBjb252ZXJ0X2RlYnVnZ2luZwotICAgICAgfHwgY2hhbmdlX2xlYWRpbmdfY2hhcgotICAgICAgfHwgcmVtb3ZlX2xlYWRpbmdfY2hhcgotICAgICAgfHwgd2Vha2VuKQotICAgIHsKLSAgICAgIC8qIE1hcmsgc3ltYm9scyB1c2VkIGluIG91dHB1dCByZWxvY2F0aW9ucyBzbyB0aGF0IHRoZXkKLQkgYXJlIGtlcHQsIGV2ZW4gaWYgdGhleSBhcmUgbG9jYWwgbGFiZWxzIG9yIHN0YXRpYyBzeW1ib2xzLgotCSAKLQkgTm90ZSB3ZSBpdGVyYXRlIG92ZXIgdGhlIGlucHV0IHNlY3Rpb25zIGV4YW1pbmluZyB0aGVpcgotCSByZWxvY2F0aW9ucyBzaW5jZSB0aGUgcmVsb2NhdGlvbnMgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMKLQkgaGF2ZW4ndCBiZWVuIHNldCB5ZXQuICBtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyB3aWxsCi0JIGlnbm9yZSBpbnB1dCBzZWN0aW9ucyB3aGljaCBoYXZlIG5vIGNvcnJlc3BvbmRpbmcgb3V0cHV0Ci0JIHNlY3Rpb24uICAqLwotICAgICAgaWYgKHN0cmlwX3N5bWJvbHMgIT0gU1RSSVBfQUxMKQotCWJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoaWJmZCwKLQkJCSAgICAgICBtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucywKLQkJCSAgICAgICAoUFRSKWlzeW1wcCk7Ci0gICAgICBvc3ltcHAgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoKHN5bWNvdW50ICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgc3ltY291bnQgPSBmaWx0ZXJfc3ltYm9scyAoaWJmZCwgb2JmZCwgb3N5bXBwLCBpc3ltcHAsIHN5bWNvdW50KTsKLSAgICB9Ci0KLSAgaWYgKGNvbnZlcnRfZGVidWdnaW5nICYmIGRoYW5kbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISB3cml0ZV9kZWJ1Z2dpbmdfaW5mbyAob2JmZCwgZGhhbmRsZSwgJnN5bWNvdW50LCAmb3N5bXBwKSkKLQl7Ci0JICBzdGF0dXMgPSAxOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgYmZkX3NldF9zeW10YWIgKG9iZmQsIG9zeW1wcCwgc3ltY291bnQpOwotCi0gIC8qIFRoaXMgaGFzIHRvIGhhcHBlbiBhZnRlciB0aGUgc3ltYm9sIHRhYmxlIGhhcyBiZWVuIHNldC4gICovCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoaWJmZCwgY29weV9zZWN0aW9uLCAodm9pZCAqKSBvYmZkKTsKLQotICBpZiAoYWRkX3NlY3Rpb25zICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IHNlY3Rpb25fYWRkICpwYWRkOwotCi0gICAgICBmb3IgKHBhZGQgPSBhZGRfc2VjdGlvbnM7IHBhZGQgIT0gTlVMTDsgcGFkZCA9IHBhZGQtPm5leHQpCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBwYWRkLT5zZWN0aW9uLAotCQkJCQkgIChQVFIpIHBhZGQtPmNvbnRlbnRzLAotCQkJCQkgIChmaWxlX3B0cikgMCwKLQkJCQkJICAoYmZkX3NpemVfdHlwZSkgcGFkZC0+c2l6ZSkpCi0JICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCX0KLSAgICB9Ci0KLSAgaWYgKGdhcF9maWxsX3NldCB8fCBwYWRfdG9fc2V0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpidWY7Ci0gICAgICBpbnQgYywgaTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZ2Fwcy4gICovCi0KLSAgICAgIGlmIChtYXhfZ2FwID4gODE5MikKLQltYXhfZ2FwID0gODE5MjsKLSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChtYXhfZ2FwKTsKLSAgICAgIG1lbXNldCAoYnVmLCBnYXBfZmlsbCwgKHNpemVfdCkgbWF4X2dhcCk7Ci0KLSAgICAgIGMgPSBiZmRfY291bnRfc2VjdGlvbnMgKG9iZmQpOwotICAgICAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLQl7Ci0JICBpZiAoZ2Fwc1tpXSAhPSAwKQotCSAgICB7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBsZWZ0OwotCSAgICAgIGZpbGVfcHRyIG9mZjsKLQotCSAgICAgIGxlZnQgPSBnYXBzW2ldOwotCSAgICAgIG9mZiA9IGJmZF9zZWN0aW9uX3NpemUgKG9iZmQsIG9zZWN0aW9uc1tpXSkgLSBsZWZ0OwotCSAgICAgIHdoaWxlIChsZWZ0ID4gMCkKLQkJewotCQkgIGJmZF9zaXplX3R5cGUgbm93OwotCi0JCSAgaWYgKGxlZnQgPiA4MTkyKQotCQkgICAgbm93ID0gODE5MjsKLQkJICBlbHNlCi0JCSAgICBub3cgPSBsZWZ0OwotCi0JCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBvc2VjdGlvbnNbaV0sIGJ1ZiwKLQkJCQkJCSAgb2ZmLCBub3cpKQotCQkgICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLQkJICBsZWZ0IC09IG5vdzsKLQkJICBvZmYgKz0gbm93OwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFsbG93IHRoZSBCRkQgYmFja2VuZCB0byBjb3B5IGFueSBwcml2YXRlIGRhdGEgaXQgdW5kZXJzdGFuZHMKLSAgICAgZnJvbSB0aGUgaW5wdXQgQkZEIHRvIHRoZSBvdXRwdXQgQkZELiAgVGhpcyBpcyBkb25lIGxhc3QgdG8KLSAgICAgcGVybWl0IHRoZSByb3V0aW5lIHRvIGxvb2sgYXQgdGhlIGZpbHRlcmVkIHN5bWJvbCB0YWJsZSwgd2hpY2ggaXMKLSAgICAgaW1wb3J0YW50IGZvciB0aGUgRUNPRkYgY29kZSBhdCBsZWFzdC4gICovCi0gIGlmICghYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkpCi0gICAgewotICAgICAgbm9uX2ZhdGFsIChfKCIlczogZXJyb3IgY29weWluZyBwcml2YXRlIEJGRCBkYXRhOiAlcyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCSBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICBzdGF0dXMgPSAxOwotICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotLyogUmVhZCBlYWNoIGFyY2hpdmUgZWxlbWVudCBpbiB0dXJuIGZyb20gSUJGRCwgY29weSB0aGUKLSAgIGNvbnRlbnRzIHRvIHRlbXAgZmlsZSwgYW5kIGtlZXAgdGhlIHRlbXAgZmlsZSBoYW5kbGUuICAqLwotCi1zdGF0aWMgdm9pZAotY29weV9hcmNoaXZlIChpYmZkLCBvYmZkLCBvdXRwdXRfdGFyZ2V0KQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgY29uc3QgY2hhciAqb3V0cHV0X3RhcmdldDsKLXsKLSAgc3RydWN0IG5hbWVfbGlzdAotICAgIHsKLSAgICAgIHN0cnVjdCBuYW1lX2xpc3QgKm5leHQ7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgYmZkICpvYmZkOwotICAgIH0gKmxpc3QsICpsOwotICBiZmQgKipwdHIgPSAmb2JmZC0+YXJjaGl2ZV9oZWFkOwotICBiZmQgKnRoaXNfZWxlbWVudDsKLSAgY2hhciAqZGlyID0gbWFrZV90ZW1wbmFtZSAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0gIC8qIE1ha2UgYSB0ZW1wIGRpcmVjdG9yeSB0byBob2xkIHRoZSBjb250ZW50cy4gICovCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSAmJiAhZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotICBpZiAobWtkaXIgKGRpcikgIT0gMCkKLSNlbHNlCi0gIGlmIChta2RpciAoZGlyLCAwNzAwKSAhPSAwKQotI2VuZGlmCi0gICAgewotICAgICAgZmF0YWwgKF8oImNhbm5vdCBta2RpciAlcyBmb3IgYXJjaGl2ZSBjb3B5aW5nIChlcnJvcjogJXMpIiksCi0JICAgICBkaXIsIHN0cmVycm9yIChlcnJubykpOwotICAgIH0KLSAgb2JmZC0+aGFzX2FybWFwID0gaWJmZC0+aGFzX2FybWFwOwotCi0gIGxpc3QgPSBOVUxMOwotCi0gIHRoaXNfZWxlbWVudCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGliZmQsIE5VTEwpOwotICB3aGlsZSAoIXN0YXR1cyAmJiB0aGlzX2VsZW1lbnQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBhbiBvdXRwdXQgZmlsZSBmb3IgdGhpcyBtZW1iZXIuICAqLwotICAgICAgY2hhciAqb3V0cHV0X25hbWUgPSBjb25jYXQgKGRpciwgIi8iLCBiZmRfZ2V0X2ZpbGVuYW1lICh0aGlzX2VsZW1lbnQpLAotCQkJCSAgKGNoYXIgKikgTlVMTCk7Ci0gICAgICBiZmQgKm91dHB1dF9iZmQgPSBiZmRfb3BlbncgKG91dHB1dF9uYW1lLCBvdXRwdXRfdGFyZ2V0KTsKLSAgICAgIGJmZCAqbGFzdF9lbGVtZW50OwotCi0gICAgICBsID0gKHN0cnVjdCBuYW1lX2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbmFtZV9saXN0KSk7Ci0gICAgICBsLT5uYW1lID0gb3V0cHV0X25hbWU7Ci0gICAgICBsLT5uZXh0ID0gbGlzdDsKLSAgICAgIGxpc3QgPSBsOwotCi0gICAgICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0JUkVUVVJOX05PTkZBVEFMIChvdXRwdXRfbmFtZSk7Ci0KLSAgICAgIGlmICghYmZkX3NldF9mb3JtYXQgKG9iZmQsIGJmZF9nZXRfZm9ybWF0IChpYmZkKSkpCi0JUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLSAgICAgIGlmIChiZmRfY2hlY2tfZm9ybWF0ICh0aGlzX2VsZW1lbnQsIGJmZF9vYmplY3QpID09IHRydWUpCi0JY29weV9vYmplY3QgKHRoaXNfZWxlbWVudCwgb3V0cHV0X2JmZCk7Ci0KLSAgICAgIGlmICghYmZkX2Nsb3NlIChvdXRwdXRfYmZkKSkKLQl7Ci0JICBiZmRfbm9uZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKG91dHB1dF9iZmQpKTsKLQkgIC8qIEVycm9yIGluIG5ldyBvYmplY3QgZmlsZS4gRG9uJ3QgY2hhbmdlIGFyY2hpdmUuICovCi0JICBzdGF0dXMgPSAxOwotCX0KLQotICAgICAgLyogT3BlbiB0aGUgbmV3bHkgb3V0cHV0IGZpbGUgYW5kIGF0dGFjaCB0byBvdXIgbGlzdC4gICovCi0gICAgICBvdXRwdXRfYmZkID0gYmZkX29wZW5yIChvdXRwdXRfbmFtZSwgb3V0cHV0X3RhcmdldCk7Ci0KLSAgICAgIGwtPm9iZmQgPSBvdXRwdXRfYmZkOwotCi0gICAgICAqcHRyID0gb3V0cHV0X2JmZDsKLSAgICAgIHB0ciA9ICZvdXRwdXRfYmZkLT5uZXh0OwotCi0gICAgICBsYXN0X2VsZW1lbnQgPSB0aGlzX2VsZW1lbnQ7Ci0KLSAgICAgIHRoaXNfZWxlbWVudCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGliZmQsIGxhc3RfZWxlbWVudCk7Ci0KLSAgICAgIGJmZF9jbG9zZSAobGFzdF9lbGVtZW50KTsKLSAgICB9Ci0gICpwdHIgPSAoYmZkICopIE5VTEw7Ci0KLSAgaWYgKCFiZmRfY2xvc2UgKG9iZmQpKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0gIGlmICghYmZkX2Nsb3NlIChpYmZkKSkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICAvKiBEZWxldGUgYWxsIHRoZSBmaWxlcyB0aGF0IHdlIG9wZW5lZC4gICovCi0gIGZvciAobCA9IGxpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgYmZkX2Nsb3NlIChsLT5vYmZkKTsKLSAgICAgIHVubGluayAobC0+bmFtZSk7Ci0gICAgfQotICBybWRpciAoZGlyKTsKLX0KLQotLyogVGhlIHRvcC1sZXZlbCBjb250cm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLWNvcHlfZmlsZSAoaW5wdXRfZmlsZW5hbWUsIG91dHB1dF9maWxlbmFtZSwgaW5wdXRfdGFyZ2V0LCBvdXRwdXRfdGFyZ2V0KQotICAgICBjb25zdCBjaGFyICppbnB1dF9maWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqb3V0cHV0X2ZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICppbnB1dF90YXJnZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKm91dHB1dF90YXJnZXQ7Ci17Ci0gIGJmZCAqaWJmZDsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIC8qIFRvIGFsbG93IHVzIHRvIGRvICJzdHJpcCAqIiB3aXRob3V0IGR5aW5nIG9uIHRoZSBmaXJzdAotICAgICBub24tb2JqZWN0IGZpbGUsIGZhaWx1cmVzIGFyZSBub25mYXRhbC4gICovCi0KLSAgaWJmZCA9IGJmZF9vcGVuciAoaW5wdXRfZmlsZW5hbWUsIGlucHV0X3RhcmdldCk7Ci0gIGlmIChpYmZkID09IE5VTEwpCi0gICAgUkVUVVJOX05PTkZBVEFMIChpbnB1dF9maWxlbmFtZSk7Ci0KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGliZmQsIGJmZF9hcmNoaXZlKSkKLSAgICB7Ci0gICAgICBiZmQgKm9iZmQ7Ci0KLSAgICAgIC8qIGJmZF9nZXRfdGFyZ2V0IGRvZXMgbm90IHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB1bnRpbAotICAgICAgICAgYmZkX2NoZWNrX2Zvcm1hdCBzdWNjZWVkcy4gICovCi0gICAgICBpZiAob3V0cHV0X3RhcmdldCA9PSBOVUxMKQotCW91dHB1dF90YXJnZXQgPSBiZmRfZ2V0X3RhcmdldCAoaWJmZCk7Ci0KLSAgICAgIG9iZmQgPSBiZmRfb3BlbncgKG91dHB1dF9maWxlbmFtZSwgb3V0cHV0X3RhcmdldCk7Ci0gICAgICBpZiAob2JmZCA9PSBOVUxMKQotCVJFVFVSTl9OT05GQVRBTCAob3V0cHV0X2ZpbGVuYW1lKTsKLQotICAgICAgY29weV9hcmNoaXZlIChpYmZkLCBvYmZkLCBvdXRwdXRfdGFyZ2V0KTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoaWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmQgKm9iZmQ7Ci0KLSAgICAgIC8qIGJmZF9nZXRfdGFyZ2V0IGRvZXMgbm90IHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB1bnRpbAotICAgICAgICAgYmZkX2NoZWNrX2Zvcm1hdCBzdWNjZWVkcy4gICovCi0gICAgICBpZiAob3V0cHV0X3RhcmdldCA9PSBOVUxMKQotCW91dHB1dF90YXJnZXQgPSBiZmRfZ2V0X3RhcmdldCAoaWJmZCk7Ci0KLSAgICAgIG9iZmQgPSBiZmRfb3BlbncgKG91dHB1dF9maWxlbmFtZSwgb3V0cHV0X3RhcmdldCk7Ci0gICAgICBpZiAob2JmZCA9PSBOVUxMKQotCVJFVFVSTl9OT05GQVRBTCAob3V0cHV0X2ZpbGVuYW1lKTsKLQotICAgICAgY29weV9vYmplY3QgKGliZmQsIG9iZmQpOwotCi0gICAgICBpZiAoIWJmZF9jbG9zZSAob2JmZCkpCi0JUkVUVVJOX05PTkZBVEFMIChvdXRwdXRfZmlsZW5hbWUpOwotCi0gICAgICBpZiAoIWJmZF9jbG9zZSAoaWJmZCkpCi0JUkVUVVJOX05PTkZBVEFMIChpbnB1dF9maWxlbmFtZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChpbnB1dF9maWxlbmFtZSk7Ci0gICAgICAKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICBmcmVlIChtYXRjaGluZyk7Ci0JfQotICAgICAgCi0gICAgICBzdGF0dXMgPSAxOwotICAgIH0KLX0KLQotLyogQ3JlYXRlIGEgc2VjdGlvbiBpbiBPQkZEIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgYXR0cmlidXRlcwotICAgYXMgSVNFQ1RJT04gaW4gSUJGRC4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXR1cF9zZWN0aW9uIChpYmZkLCBpc2VjdGlvbiwgb2JmZGFyZykKLSAgICAgYmZkICppYmZkOwotICAgICBzZWNfcHRyIGlzZWN0aW9uOwotICAgICBQVFIgb2JmZGFyZzsKLXsKLSAgYmZkICpvYmZkID0gKGJmZCAqKSBvYmZkYXJnOwotICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpwOwotICBzZWNfcHRyIG9zZWN0aW9uOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGJmZF92bWEgdm1hOwotICBiZmRfdm1hIGxtYTsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGNoYXIgKmVycjsKLQotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaWJmZCwgaXNlY3Rpb24pICYgU0VDX0RFQlVHR0lORykgIT0gMAotICAgICAgJiYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfREVCVUcKLQkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfVU5ORUVERUQKLQkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfQUxMCi0JICB8fCBkaXNjYXJkX2xvY2FscyA9PSBMT0NBTFNfQUxMCi0JICB8fCBjb252ZXJ0X2RlYnVnZ2luZykpCi0gICAgcmV0dXJuOwotCi0gIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAoYmZkX3NlY3Rpb25fbmFtZSAoaWJmZCwgaXNlY3Rpb24pLCBmYWxzZSk7Ci0gIGlmIChwICE9IE5VTEwpCi0gICAgcC0+dXNlZCA9IHRydWU7Ci0KLSAgaWYgKHAgIT0gTlVMTCAmJiBwLT5yZW1vdmUpCi0gICAgcmV0dXJuOwotCi0gIG9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKG9iZmQsIGJmZF9zZWN0aW9uX25hbWUgKGliZmQsIGlzZWN0aW9uKSk7Ci0gIAotICBpZiAob3NlY3Rpb24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnIgPSAibWFraW5nIjsKLSAgICAgIGdvdG8gbG9zZXI7Ci0gICAgfQotCi0gIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChpYmZkLCBpc2VjdGlvbik7Ci0gIGlmIChjb3B5X2J5dGUgPj0gMCkKLSAgICBzaXplID0gKHNpemUgKyBpbnRlcmxlYXZlIC0gMSkgLyBpbnRlcmxlYXZlOwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob2JmZCwgb3NlY3Rpb24sIHNpemUpKQotICAgIHsKLSAgICAgIGVyciA9ICJzaXplIjsKLSAgICAgIGdvdG8gbG9zZXI7Ci0gICAgfQotICAKLSAgdm1hID0gYmZkX3NlY3Rpb25fdm1hIChpYmZkLCBpc2VjdGlvbik7Ci0gIGlmIChwICE9IE5VTEwgJiYgcC0+Y2hhbmdlX3ZtYSA9PSBDSEFOR0VfTU9ESUZZKQotICAgIHZtYSArPSBwLT52bWFfdmFsOwotICBlbHNlIGlmIChwICE9IE5VTEwgJiYgcC0+Y2hhbmdlX3ZtYSA9PSBDSEFOR0VfU0VUKQotICAgIHZtYSA9IHAtPnZtYV92YWw7Ci0gIGVsc2UKLSAgICB2bWEgKz0gY2hhbmdlX3NlY3Rpb25fYWRkcmVzczsKLSAgCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl92bWEgKG9iZmQsIG9zZWN0aW9uLCB2bWEpKQotICAgIHsKLSAgICAgIGVyciA9ICJ2bWEiOwotICAgICAgZ290byBsb3NlcjsKLSAgICB9Ci0KLSAgbG1hID0gaXNlY3Rpb24tPmxtYTsKLSAgaWYgKChwICE9IE5VTEwpICYmIHAtPmNoYW5nZV9sbWEgIT0gQ0hBTkdFX0lHTk9SRSkKLSAgICB7Ci0gICAgICBpZiAocC0+Y2hhbmdlX2xtYSA9PSBDSEFOR0VfTU9ESUZZKQotCWxtYSArPSBwLT5sbWFfdmFsOwotICAgICAgZWxzZSBpZiAocC0+Y2hhbmdlX2xtYSA9PSBDSEFOR0VfU0VUKQotCWxtYSA9IHAtPmxtYV92YWw7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgbG1hICs9IGNoYW5nZV9zZWN0aW9uX2FkZHJlc3M7Ci0gIAotICBvc2VjdGlvbi0+bG1hID0gbG1hOwotCi0gIC8qIEZJWE1FOiBUaGlzIGlzIHByb2JhYmx5IG5vdCBlbm91Z2guICBJZiB3ZSBjaGFuZ2UgdGhlIExNQSB3ZQotICAgICBtYXkgaGF2ZSB0byByZWNvbXB1dGUgdGhlIGhlYWRlciBmb3IgdGhlIGZpbGUgYXMgd2VsbC4gICovCi0gIGlmIChiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChvYmZkLAotCQkJCSBvc2VjdGlvbiwKLQkJCQkgYmZkX3NlY3Rpb25fYWxpZ25tZW50IChpYmZkLCBpc2VjdGlvbikpCi0gICAgICA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBlcnIgPSAiYWxpZ25tZW50IjsKLSAgICAgIGdvdG8gbG9zZXI7Ci0gICAgfQotCi0gIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChpYmZkLCBpc2VjdGlvbik7Ci0gIGlmIChwICE9IE5VTEwgJiYgcC0+c2V0X2ZsYWdzKQotICAgIGZsYWdzID0gcC0+ZmxhZ3MgfCAoZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKTsKLSAgaWYgKCFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG9iZmQsIG9zZWN0aW9uLCBmbGFncykpCi0gICAgewotICAgICAgZXJyID0gImZsYWdzIjsKLSAgICAgIGdvdG8gbG9zZXI7Ci0gICAgfQotCi0gIC8qIFRoaXMgdXNlZCB0byBiZSBtYW5nbGVfc2VjdGlvbjsgd2UgZG8gaGVyZSB0byBhdm9pZCB1c2luZwotICAgICBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSBzaW5jZSBzb21lIGZvcm1hdHMgYWxsb3cgbXVsdGlwbGUKLSAgICAgc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLiAgKi8KLSAgaXNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID0gb3NlY3Rpb247Ci0gIGlzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ID0gMDsKLQotICAvKiBBbGxvdyB0aGUgQkZEIGJhY2tlbmQgdG8gY29weSBhbnkgcHJpdmF0ZSBkYXRhIGl0IHVuZGVyc3RhbmRzCi0gICAgIGZyb20gdGhlIGlucHV0IHNlY3Rpb24gdG8gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLSAgaWYgKCFiZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlY3Rpb24sIG9iZmQsIG9zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBlcnIgPSAicHJpdmF0ZSBkYXRhIjsKLSAgICAgIGdvdG8gbG9zZXI7Ci0gICAgfQotCi0gIC8qIEFsbCB3ZW50IHdlbGwgKi8KLSAgcmV0dXJuOwotCi1sb3NlcjoKLSAgbm9uX2ZhdGFsIChfKCIlczogc2VjdGlvbiBgJXMnOiBlcnJvciBpbiAlczogJXMiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCSAgICAgYmZkX3NlY3Rpb25fbmFtZSAoaWJmZCwgaXNlY3Rpb24pLAotCSAgICAgZXJyLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gIHN0YXR1cyA9IDE7Ci19Ci0KLS8qIENvcHkgdGhlIGRhdGEgb2YgaW5wdXQgc2VjdGlvbiBJU0VDVElPTiBvZiBJQkZECi0gICB0byBhbiBvdXRwdXQgc2VjdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gT0JGRC4KLSAgIElmIHN0cmlwcGluZyB0aGVuIGRvbid0IGNvcHkgYW55IHJlbG9jYXRpb24gaW5mby4gICovCi0KLXN0YXRpYyB2b2lkCi1jb3B5X3NlY3Rpb24gKGliZmQsIGlzZWN0aW9uLCBvYmZkYXJnKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIHNlY19wdHIgaXNlY3Rpb247Ci0gICAgIFBUUiBvYmZkYXJnOwotewotICBiZmQgKm9iZmQgPSAoYmZkICopIG9iZmRhcmc7Ci0gIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnA7Ci0gIGFyZWxlbnQgKipyZWxwcDsKLSAgbG9uZyByZWxjb3VudDsKLSAgc2VjX3B0ciBvc2VjdGlvbjsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBsb25nIHJlbHNpemU7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGZhaWxlZCBlYXJsaWVyIG9uLCBkbyBub3Qga2VlcCBvbiBnZW5lcmF0aW5nCi0gICAgIGNvbXBsYWludHMgbm93LiAgKi8KLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHJldHVybjsKLSAgCi0gIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChpYmZkLCBpc2VjdGlvbikgJiBTRUNfREVCVUdHSU5HKSAhPSAwCi0gICAgICAmJiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9ERUJVRwotCSAgfHwgc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9VTk5FRURFRAotCSAgfHwgc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9BTEwKLQkgIHx8IGRpc2NhcmRfbG9jYWxzID09IExPQ0FMU19BTEwKLQkgIHx8IGNvbnZlcnRfZGVidWdnaW5nKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAoYmZkX3NlY3Rpb25fbmFtZSAoaWJmZCwgaXNlY3Rpb24pLCBmYWxzZSk7Ci0KLSAgaWYgKHAgIT0gTlVMTCAmJiBwLT5yZW1vdmUpCi0gICAgcmV0dXJuOwotCi0gIG9zZWN0aW9uID0gaXNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChpc2VjdGlvbik7Ci0KLSAgaWYgKHNpemUgPT0gMCB8fCBvc2VjdGlvbiA9PSAwKQotICAgIHJldHVybjsKLQotCi0gIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpYmZkLCBpc2VjdGlvbik7Ci0gIGlmIChyZWxzaXplIDwgMCkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgCi0gIGlmIChyZWxzaXplID09IDApCi0gICAgYmZkX3NldF9yZWxvYyAob2JmZCwgb3NlY3Rpb24sIChhcmVsZW50ICoqKSBOVUxMLCAwKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotICAgICAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpYmZkLCBpc2VjdGlvbiwgcmVscHAsIGlzeW1wcCk7Ci0gICAgICBpZiAocmVsY291bnQgPCAwKQotCVJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgICAgCi0gICAgICBpZiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9BTEwpCi0JewotCSAgLyogUmVtb3ZlIHJlbG9jYXRpb25zIHdoaWNoIGFyZSBub3QgaW4KLQkgICAgIGtlZXBfc3RyaXBfc3BlY2lmaWNfbGlzdC4gKi8KLQkgIGFyZWxlbnQgKip0ZW1wX3JlbHBwOwotCSAgbG9uZyB0ZW1wX3JlbGNvdW50ID0gMDsKLQkgIGxvbmcgaTsKLQkgIAotCSAgdGVtcF9yZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLQkgIGZvciAoaSA9IDA7IGkgPCByZWxjb3VudDsgaSsrKQotCSAgICBpZiAoaXNfc3BlY2lmaWVkX3N5bWJvbAotCQkoYmZkX2FzeW1ib2xfbmFtZSAoKnJlbHBwIFtpXS0+c3ltX3B0cl9wdHIpLAotCQkga2VlcF9zcGVjaWZpY19saXN0KSkKLQkgICAgICB0ZW1wX3JlbHBwIFt0ZW1wX3JlbGNvdW50KytdID0gcmVscHAgW2ldOwotCSAgcmVsY291bnQgPSB0ZW1wX3JlbGNvdW50OwotCSAgZnJlZSAocmVscHApOwotCSAgcmVscHAgPSB0ZW1wX3JlbHBwOwotCX0KLSAgICAgIGJmZF9zZXRfcmVsb2MgKG9iZmQsIG9zZWN0aW9uLAotCQkgICAgIChyZWxjb3VudCA9PSAwID8gKGFyZWxlbnQgKiopIE5VTEwgOiByZWxwcCksIHJlbGNvdW50KTsKLSAgICB9Ci0gIAotICBpc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gaXNlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgaXNlY3Rpb24tPnJlbG9jX2RvbmUgPSB0cnVlOwotCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGliZmQsIGlzZWN0aW9uKSAmIFNFQ19IQVNfQ09OVEVOVFMpCi0gICAgewotICAgICAgUFRSIG1lbWh1bmsgPSAoUFRSKSB4bWFsbG9jICgodW5zaWduZWQpIHNpemUpOwotCi0gICAgICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaWJmZCwgaXNlY3Rpb24sIG1lbWh1bmssIChmaWxlX3B0cikgMCwKLQkJCQkgICAgIHNpemUpKQotCVJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gICAgICBpZiAoY29weV9ieXRlID49IDApIAotCWZpbHRlcl9ieXRlcyAobWVtaHVuaywgJnNpemUpOwotCi0gICAgICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob2JmZCwgb3NlY3Rpb24sIG1lbWh1bmssIChmaWxlX3B0cikgMCwKLQkJCQkgICAgIHNpemUpKQotCVJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0gICAgICBmcmVlIChtZW1odW5rKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHAgIT0gTlVMTCAmJiBwLT5zZXRfZmxhZ3MgJiYgKHAtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLSAgICB7Ci0gICAgICBQVFIgbWVtaHVuayA9IChQVFIpIHhtYWxsb2MgKCh1bnNpZ25lZCkgc2l6ZSk7Ci0KLSAgICAgIC8qIFdlIGRvbid0IHBlcm1pdCB0aGUgdXNlciB0byB0dXJuIG9mZiB0aGUgU0VDX0hBU19DT05URU5UUwotCSBmbGFnLS10aGV5IGNhbiBqdXN0IHJlbW92ZSB0aGUgc2VjdGlvbiBlbnRpcmVseSBhbmQgYWRkIGl0Ci0JIGJhY2sgYWdhaW4uICBIb3dldmVyLCB3ZSBkbyBwZXJtaXQgdGhlbSB0byB0dXJuIG9uIHRoZQotCSBTRUNfSEFTX0NPTlRFTlRTIGZsYWcsIGFuZCB0YWtlIGl0IHRvIG1lYW4gdGhhdCB0aGUgc2VjdGlvbgotCSBjb250ZW50cyBzaG91bGQgYmUgemVyb2VkIG91dC4gICovCi0KLSAgICAgIG1lbXNldCAobWVtaHVuaywgMCwgc2l6ZSk7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG9iZmQsIG9zZWN0aW9uLCBtZW1odW5rLCAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgc2l6ZSkpCi0JUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0gICAgICBmcmVlIChtZW1odW5rKTsKLSAgICB9Ci19Ci0KLS8qIEdldCBhbGwgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyB1c2VkIHdoZW4gLS1nYXAtZmlsbCBvciAtLXBhZC10byBpcwotICAgdXNlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nZXRfc2VjdGlvbnMgKG9iZmQsIG9zZWN0aW9uLCBzZWNwcHBhcmcpCi0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXNlY3Rpb24gKm9zZWN0aW9uOwotICAgICBQVFIgc2VjcHBwYXJnOwotewotICBhc2VjdGlvbiAqKipzZWNwcHAgPSAoYXNlY3Rpb24gKioqKSBzZWNwcHBhcmc7Ci0KLSAgKipzZWNwcHAgPSBvc2VjdGlvbjsKLSAgKysoKnNlY3BwcCk7Ci19Ci0KLS8qIFNvcnQgc2VjdGlvbnMgYnkgVk1BLiAgVGhpcyBpcyBjYWxsZWQgdmlhIHFzb3J0LCBhbmQgaXMgdXNlZCB3aGVuCi0gICAtLWdhcC1maWxsIG9yIC0tcGFkLXRvIGlzIHVzZWQuICBXZSBmb3JjZSBub24gbG9hZGFibGUgb3IgZW1wdHkKLSAgIHNlY3Rpb25zIHRvIHRoZSBmcm9udCwgd2hlcmUgdGhleSBhcmUgZWFzaWVyIHRvIGlnbm9yZS4gICovCi0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfc2VjdGlvbl9sbWEgKGFyZzEsIGFyZzIpCi0gICAgIGNvbnN0IFBUUiBhcmcxOwotICAgICBjb25zdCBQVFIgYXJnMjsKLXsKLSAgY29uc3QgYXNlY3Rpb24gKipzZWMxID0gKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcxOwotICBjb25zdCBhc2VjdGlvbiAqKnNlYzIgPSAoY29uc3QgYXNlY3Rpb24gKiopIGFyZzI7Ci0gIGZsYWd3b3JkIGZsYWdzMSwgZmxhZ3MyOwotCi0gIC8qIFNvcnQgbm9uIGxvYWRhYmxlIHNlY3Rpb25zIHRvIHRoZSBmcm9udC4gICovCi0gIGZsYWdzMSA9ICgqc2VjMSktPmZsYWdzOwotICBmbGFnczIgPSAoKnNlYzIpLT5mbGFnczsKLSAgaWYgKChmbGFnczEgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0gICAgICB8fCAoZmxhZ3MxICYgU0VDX0xPQUQpID09IDApCi0gICAgewotICAgICAgaWYgKChmbGFnczIgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwCi0JICAmJiAoZmxhZ3MyICYgU0VDX0xPQUQpICE9IDApCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICgoZmxhZ3MyICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCSAgfHwgKGZsYWdzMiAmIFNFQ19MT0FEKSA9PSAwKQotCXJldHVybiAxOwotICAgIH0KLQotICAvKiBTb3J0IHNlY3Rpb25zIGJ5IExNQS4gICovCi0gIGlmICgoKnNlYzEpLT5sbWEgPiAoKnNlYzIpLT5sbWEpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKCgqc2VjMSktPmxtYSA8ICgqc2VjMiktPmxtYSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogU29ydCBzZWN0aW9ucyB3aXRoIHRoZSBzYW1lIExNQSBieSBzaXplLiAgKi8KLSAgaWYgKCgqc2VjMSktPl9yYXdfc2l6ZSA+ICgqc2VjMiktPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoKCpzZWMxKS0+X3Jhd19zaXplIDwgKCpzZWMyKS0+X3Jhd19zaXplKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogTWFyayBhbGwgdGhlIHN5bWJvbHMgd2hpY2ggd2lsbCBiZSB1c2VkIGluIG91dHB1dCByZWxvY2F0aW9ucyB3aXRoCi0gICB0aGUgQlNGX0tFRVAgZmxhZyBzbyB0aGF0IHRob3NlIHN5bWJvbHMgd2lsbCBub3QgYmUgc3RyaXBwZWQuCi0KLSAgIElnbm9yZSByZWxvY2F0aW9ucyB3aGljaCB3aWxsIG5vdCBhcHBlYXIgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLW1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zIChpYmZkLCBpc2VjdGlvbiwgc3ltYm9sc2FyZykKLSAgICAgYmZkICppYmZkOwotICAgICBzZWNfcHRyIGlzZWN0aW9uOwotICAgICBQVFIgc3ltYm9sc2FyZzsKLXsKLSAgYXN5bWJvbCAqKnN5bWJvbHMgPSAoYXN5bWJvbCAqKikgc3ltYm9sc2FyZzsKLSAgbG9uZyByZWxzaXplOwotICBhcmVsZW50ICoqcmVscHA7Ci0gIGxvbmcgcmVsY291bnQsIGk7Ci0KLSAgLyogSWdub3JlIGFuIGlucHV0IHNlY3Rpb24gd2l0aCBubyBjb3JyZXNwb25kaW5nIG91dHB1dCBzZWN0aW9uLiAgKi8KLSAgaWYgKGlzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaWJmZCwgaXNlY3Rpb24pOwotICBpZiAocmVsc2l6ZSA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgaWYgKHJlbHNpemUgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgcmVscHAgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7Ci0gIHJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaWJmZCwgaXNlY3Rpb24sIHJlbHBwLCBzeW1ib2xzKTsKLSAgaWYgKHJlbGNvdW50IDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICAvKiBFeGFtaW5lIGVhY2ggc3ltYm9sIHVzZWQgaW4gYSByZWxvY2F0aW9uLiAgSWYgaXQncyBub3Qgb25lIG9mIHRoZQotICAgICBzcGVjaWFsIGJmZCBzZWN0aW9uIHN5bWJvbHMsIHRoZW4gbWFyayBpdCB3aXRoIEJTRl9LRUVQLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IHJlbGNvdW50OyBpKyspCi0gICAgewotICAgICAgaWYgKCpyZWxwcFtpXS0+c3ltX3B0cl9wdHIgIT0gYmZkX2NvbV9zZWN0aW9uX3B0ci0+c3ltYm9sCi0JICAmJiAqcmVscHBbaV0tPnN5bV9wdHJfcHRyICE9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbAotCSAgJiYgKnJlbHBwW2ldLT5zeW1fcHRyX3B0ciAhPSBiZmRfdW5kX3NlY3Rpb25fcHRyLT5zeW1ib2wpCi0JKCpyZWxwcFtpXS0+c3ltX3B0cl9wdHIpLT5mbGFncyB8PSBCU0ZfS0VFUDsKLSAgICB9Ci0KLSAgaWYgKHJlbHBwICE9IE5VTEwpCi0gICAgZnJlZSAocmVscHApOwotfQotCi0vKiBXcml0ZSBvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXdyaXRlX2RlYnVnZ2luZ19pbmZvIChvYmZkLCBkaGFuZGxlLCBzeW1jb3VudHAsIHN5bXBwcCkKLSAgICAgYmZkICpvYmZkOwotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgbG9uZyAqc3ltY291bnRwOwotICAgICBhc3ltYm9sICoqKnN5bXBwcDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAob2JmZCkgPT0gYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8gKG9iZmQsIGRoYW5kbGUpOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgewotICAgICAgYmZkX2J5dGUgKnN5bXMsICpzdHJpbmdzOwotICAgICAgYmZkX3NpemVfdHlwZSBzeW1zaXplLCBzdHJpbmdzaXplOwotICAgICAgYXNlY3Rpb24gKnN0YWJzZWMsICpzdGFic3Ryc2VjOwotCi0gICAgICBpZiAoISB3cml0ZV9zdGFic19pbl9zZWN0aW9uc19kZWJ1Z2dpbmdfaW5mbyAob2JmZCwgZGhhbmRsZSwgJnN5bXMsCi0JCQkJCQkgICAgJnN5bXNpemUsICZzdHJpbmdzLAotCQkJCQkJICAgICZzdHJpbmdzaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHN0YWJzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChvYmZkLCAiLnN0YWIiKTsKLSAgICAgIHN0YWJzdHJzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChvYmZkLCAiLnN0YWJzdHIiKTsKLSAgICAgIGlmIChzdGFic2VjID09IE5VTEwKLQkgIHx8IHN0YWJzdHJzZWMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob2JmZCwgc3RhYnNlYywgc3ltc2l6ZSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG9iZmQsIHN0YWJzdHJzZWMsIHN0cmluZ3NpemUpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKG9iZmQsIHN0YWJzZWMsIDIpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKG9iZmQsIHN0YWJzdHJzZWMsIDApCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob2JmZCwgc3RhYnNlYywKLQkJCQkgICAoU0VDX0hBU19DT05URU5UUwotCQkJCSAgICB8IFNFQ19SRUFET05MWQotCQkJCSAgICB8IFNFQ19ERUJVR0dJTkcpKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG9iZmQsIHN0YWJzdHJzZWMsCi0JCQkJICAgICAgKFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkKLQkJCQkgICAgICAgfCBTRUNfREVCVUdHSU5HKSkpCi0JewotCSAgbm9uX2ZhdGFsIChfKCIlczogY2FuJ3QgY3JlYXRlIGRlYnVnZ2luZyBzZWN0aW9uOiAlcyIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLAotCQkgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGNhbiBnZXQgYXdheSB3aXRoIHNldHRpbmcgdGhlIHNlY3Rpb24gY29udGVudHMgbm93IGJlY2F1c2UKLSAgICAgICAgIHRoZSBuZXh0IHRoaW5nIHRoZSBjYWxsZXIgaXMgZ29pbmcgdG8gZG8gaXMgY29weSBvdmVyIHRoZQotICAgICAgICAgcmVhbCBzZWN0aW9ucy4gIFdlIG1heSBzb21lZGF5IGhhdmUgdG8gc3BsaXQgdGhlIGNvbnRlbnRzCi0gICAgICAgICBzZXR0aW5nIG91dCBvZiB0aGlzIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob2JmZCwgc3RhYnNlYywgc3ltcywgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAgIHN5bXNpemUpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob2JmZCwgc3RhYnN0cnNlYywgc3RyaW5ncywKLQkJCQkJIChmaWxlX3B0cikgMCwgc3RyaW5nc2l6ZSkpCi0JewotCSAgbm9uX2ZhdGFsIChfKCIlczogY2FuJ3Qgc2V0IGRlYnVnZ2luZyBzZWN0aW9uIGNvbnRlbnRzOiAlcyIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLAotCQkgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBub25fZmF0YWwgKF8oIiVzOiBkb24ndCBrbm93IGhvdyB0byB3cml0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yICVzIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwgYmZkX2dldF90YXJnZXQgKG9iZmQpKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50Ci1zdHJpcF9tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqYXJndltdOwotewotICBjaGFyICppbnB1dF90YXJnZXQgPSBOVUxMLCAqb3V0cHV0X3RhcmdldCA9IE5VTEw7Ci0gIGJvb2xlYW4gc2hvd192ZXJzaW9uID0gZmFsc2U7Ci0gIGludCBjLCBpOwotICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpwOwotICBjaGFyICpvdXRwdXRfZmlsZSA9IE5VTEw7Ci0KLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJJOk86RjpLOk46UjpvOnNTcGd4WFZ2IiwKLQkJCSAgIHN0cmlwX29wdGlvbnMsIChpbnQgKikgMCkpICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJ0knOgotCSAgaW5wdXRfdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnTyc6Ci0JICBvdXRwdXRfdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnRic6Ci0JICBpbnB1dF90YXJnZXQgPSBvdXRwdXRfdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnUic6Ci0JICBwID0gZmluZF9zZWN0aW9uX2xpc3QgKG9wdGFyZywgdHJ1ZSk7Ci0JICBwLT5yZW1vdmUgPSB0cnVlOwotCSAgc2VjdGlvbnNfcmVtb3ZlZCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9BTEw7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQljYXNlICdnJzoKLQkgIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9ERUJVRzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NUUklQX1VOTkVFREVEOgotCSAgc3RyaXBfc3ltYm9scyA9IFNUUklQX1VOTkVFREVEOwotCSAgYnJlYWs7Ci0JY2FzZSAnSyc6Ci0JICBhZGRfc3BlY2lmaWNfc3ltYm9sIChvcHRhcmcsICZrZWVwX3NwZWNpZmljX2xpc3QpOwotCSAgYnJlYWs7Ci0JY2FzZSAnTic6Ci0JICBhZGRfc3BlY2lmaWNfc3ltYm9sIChvcHRhcmcsICZzdHJpcF9zcGVjaWZpY19saXN0KTsKLQkgIGJyZWFrOwotCWNhc2UgJ28nOgotCSAgb3V0cHV0X2ZpbGUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdwJzoKLQkgIHByZXNlcnZlX2RhdGVzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgZGlzY2FyZF9sb2NhbHMgPSBMT0NBTFNfQUxMOwotCSAgYnJlYWs7Ci0JY2FzZSAnWCc6Ci0JICBkaXNjYXJkX2xvY2FscyA9IExPQ0FMU19TVEFSVF9MOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICB2ZXJib3NlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgc2hvd192ZXJzaW9uID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMDoKLQkgIGJyZWFrOwkJLyogd2UndmUgYmVlbiBnaXZlbiBhIGxvbmcgb3B0aW9uICovCi0JY2FzZSAnaCc6Ci0JICBzdHJpcF91c2FnZSAoc3Rkb3V0LCAwKTsKLQlkZWZhdWx0OgotCSAgc3RyaXBfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JfQotICAgIH0KLQotICBpZiAoc2hvd192ZXJzaW9uKQotICAgIHByaW50X3ZlcnNpb24gKCJzdHJpcCIpOwotCi0gIC8qIERlZmF1bHQgaXMgdG8gc3RyaXAgYWxsIHN5bWJvbHMuICAqLwotICBpZiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9VTkRFRgotICAgICAgJiYgZGlzY2FyZF9sb2NhbHMgPT0gTE9DQUxTX1VOREVGCi0gICAgICAmJiBzdHJpcF9zcGVjaWZpY19saXN0ID09IE5VTEwpCi0gICAgc3RyaXBfc3ltYm9scyA9IFNUUklQX0FMTDsKLQotICBpZiAob3V0cHV0X3RhcmdldCA9PSAoY2hhciAqKSBOVUxMKQotICAgIG91dHB1dF90YXJnZXQgPSBpbnB1dF90YXJnZXQ7Ci0KLSAgaSA9IG9wdGluZDsKLSAgaWYgKGkgPT0gYXJnYwotICAgICAgfHwgKG91dHB1dF9maWxlICE9IE5VTEwgJiYgKGkgKyAxKSA8IGFyZ2MpKQotICAgIHN0cmlwX3VzYWdlIChzdGRlcnIsIDEpOwotCi0gIGZvciAoOyBpIDwgYXJnYzsgaSsrKQotICAgIHsKLSAgICAgIGludCBob2xkX3N0YXR1cyA9IHN0YXR1czsKLSAgICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gICAgICBjaGFyICp0bXBuYW1lOwotCi0gICAgICBpZiAocHJlc2VydmVfZGF0ZXMpCi0JewotCSAgaWYgKHN0YXQgKGFyZ3ZbaV0sICZzdGF0YnVmKSA8IDApCi0JICAgIHsKLQkgICAgICBub25fZmF0YWwgKF8oIiVzOiBjYW5ub3Qgc3RhdDogJXMiKSwgYXJndltpXSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChvdXRwdXRfZmlsZSAhPSBOVUxMKQotCXRtcG5hbWUgPSBvdXRwdXRfZmlsZTsKLSAgICAgIGVsc2UKLQl0bXBuYW1lID0gbWFrZV90ZW1wbmFtZSAoYXJndltpXSk7Ci0gICAgICBzdGF0dXMgPSAwOwotCi0gICAgICBjb3B5X2ZpbGUgKGFyZ3ZbaV0sIHRtcG5hbWUsIGlucHV0X3RhcmdldCwgb3V0cHV0X3RhcmdldCk7Ci0gICAgICBpZiAoc3RhdHVzID09IDApCi0JewotCSAgaWYgKHByZXNlcnZlX2RhdGVzKQotCSAgICBzZXRfdGltZXMgKHRtcG5hbWUsICZzdGF0YnVmKTsKLQkgIGlmIChvdXRwdXRfZmlsZSA9PSBOVUxMKQotCSAgICBzbWFydF9yZW5hbWUgKHRtcG5hbWUsIGFyZ3ZbaV0sIHByZXNlcnZlX2RhdGVzKTsKLQkgIHN0YXR1cyA9IGhvbGRfc3RhdHVzOwotCX0KLSAgICAgIGVsc2UKLQl1bmxpbmsgKHRtcG5hbWUpOwotICAgICAgaWYgKG91dHB1dF9maWxlID09IE5VTEwpCi0JZnJlZSAodG1wbmFtZSk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1jb3B5X21haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0gIGNoYXIgKmlucHV0X2ZpbGVuYW1lID0gTlVMTCwgKm91dHB1dF9maWxlbmFtZSA9IE5VTEw7Ci0gIGNoYXIgKmlucHV0X3RhcmdldCA9IE5VTEwsICpvdXRwdXRfdGFyZ2V0ID0gTlVMTDsKLSAgYm9vbGVhbiBzaG93X3ZlcnNpb24gPSBmYWxzZTsKLSAgYm9vbGVhbiBjaGFuZ2Vfd2FybiA9IHRydWU7Ci0gIGludCBjOwotICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpwOwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiYjppOkk6SzpOOnM6TzpkOkY6TDpSOlNwZ3hYVnZXOiIsCi0JCQkgICBjb3B5X29wdGlvbnMsIChpbnQgKikgMCkpICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJ2InOgotCSAgY29weV9ieXRlID0gYXRvaSAob3B0YXJnKTsKLQkgIGlmIChjb3B5X2J5dGUgPCAwKQotCSAgICBmYXRhbCAoXygiYnl0ZSBudW1iZXIgbXVzdCBiZSBub24tbmVnYXRpdmUiKSk7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQkgIGludGVybGVhdmUgPSBhdG9pIChvcHRhcmcpOwotCSAgaWYgKGludGVybGVhdmUgPCAxKQotCSAgICBmYXRhbCAoXygiaW50ZXJsZWF2ZSBtdXN0IGJlIHBvc2l0aXZlIikpOwotCSAgYnJlYWs7Ci0JY2FzZSAnSSc6Ci0JY2FzZSAncyc6CQkvKiAic291cmNlIiAtICdJJyBpcyBwcmVmZXJyZWQgKi8KLQkgIGlucHV0X3RhcmdldCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ08nOgotCWNhc2UgJ2QnOgkJLyogImRlc3RpbmF0aW9uIiAtICdPJyBpcyBwcmVmZXJyZWQgKi8KLQkgIG91dHB1dF90YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdGJzoKLQkgIGlucHV0X3RhcmdldCA9IG91dHB1dF90YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdSJzoKLQkgIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAob3B0YXJnLCB0cnVlKTsKLQkgIHAtPnJlbW92ZSA9IHRydWU7Ci0JICBzZWN0aW9uc19yZW1vdmVkID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotCSAgc3RyaXBfc3ltYm9scyA9IFNUUklQX0FMTDsKLQkgIGJyZWFrOwotCWNhc2UgJ2cnOgotCSAgc3RyaXBfc3ltYm9scyA9IFNUUklQX0RFQlVHOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU1RSSVBfVU5ORUVERUQ6Ci0JICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfVU5ORUVERUQ7Ci0JICBicmVhazsKLQljYXNlICdLJzoKLQkgIGFkZF9zcGVjaWZpY19zeW1ib2wgKG9wdGFyZywgJmtlZXBfc3BlY2lmaWNfbGlzdCk7Ci0JICBicmVhazsKLQljYXNlICdOJzoKLQkgIGFkZF9zcGVjaWZpY19zeW1ib2wgKG9wdGFyZywgJnN0cmlwX3NwZWNpZmljX2xpc3QpOwotCSAgYnJlYWs7Ci0JY2FzZSAnTCc6Ci0JICBhZGRfc3BlY2lmaWNfc3ltYm9sIChvcHRhcmcsICZsb2NhbGl6ZV9zcGVjaWZpY19saXN0KTsKLQkgIGJyZWFrOwotCWNhc2UgJ1cnOgotCSAgYWRkX3NwZWNpZmljX3N5bWJvbCAob3B0YXJnLCAmd2Vha2VuX3NwZWNpZmljX2xpc3QpOwotCSAgYnJlYWs7Ci0JY2FzZSAncCc6Ci0JICBwcmVzZXJ2ZV9kYXRlcyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIGRpc2NhcmRfbG9jYWxzID0gTE9DQUxTX0FMTDsKLQkgIGJyZWFrOwotCWNhc2UgJ1gnOgotCSAgZGlzY2FyZF9sb2NhbHMgPSBMT0NBTFNfU1RBUlRfTDsKLQkgIGJyZWFrOwotCWNhc2UgJ3YnOgotCSAgdmVyYm9zZSA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdWJzoKLQkgIHNob3dfdmVyc2lvbiA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9XRUFLRU46Ci0JICB3ZWFrZW4gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQUREX1NFQ1RJT046Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKnM7Ci0JICAgIHN0cnVjdCBzdGF0IHN0OwotCSAgICBzdHJ1Y3Qgc2VjdGlvbl9hZGQgKnBhOwotCSAgICBpbnQgbGVuOwotCSAgICBjaGFyICpuYW1lOwotCSAgICBGSUxFICpmOwotCi0JICAgIHMgPSBzdHJjaHIgKG9wdGFyZywgJz0nKTsKLQkgICAgCi0JICAgIGlmIChzID09IE5VTEwpCi0JICAgICAgZmF0YWwgKF8oImJhZCBmb3JtYXQgZm9yIC0tYWRkLXNlY3Rpb24gTkFNRT1GSUxFTkFNRSIpKTsKLQotCSAgICBpZiAoc3RhdCAocyArIDEsICYgc3QpIDwgMCkKLQkgICAgICBmYXRhbCAoXygiY2Fubm90IHN0YXQ6ICVzOiAlcyIpLCBzICsgMSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLQkgICAgcGEgPSAoc3RydWN0IHNlY3Rpb25fYWRkICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNlY3Rpb25fYWRkKSk7Ci0KLQkgICAgbGVuID0gcyAtIG9wdGFyZzsKLQkgICAgbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKGxlbiArIDEpOwotCSAgICBzdHJuY3B5IChuYW1lLCBvcHRhcmcsIGxlbik7Ci0JICAgIG5hbWVbbGVuXSA9ICdcMCc7Ci0JICAgIHBhLT5uYW1lID0gbmFtZTsKLQotCSAgICBwYS0+ZmlsZW5hbWUgPSBzICsgMTsKLQotCSAgICBwYS0+c2l6ZSA9IHN0LnN0X3NpemU7Ci0KLQkgICAgcGEtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKHBhLT5zaXplKTsKLQkgICAgZiA9IGZvcGVuIChwYS0+ZmlsZW5hbWUsIEZPUEVOX1JCKTsKLQkgICAgCi0JICAgIGlmIChmID09IE5VTEwpCi0JICAgICAgZmF0YWwgKF8oImNhbm5vdCBvcGVuOiAlczogJXMiKSwgcGEtPmZpbGVuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLQkgICAgCi0JICAgIGlmIChmcmVhZCAocGEtPmNvbnRlbnRzLCAxLCBwYS0+c2l6ZSwgZikgPT0gMAotCQl8fCBmZXJyb3IgKGYpKQotCSAgICAgIGZhdGFsIChfKCIlczogZnJlYWQgZmFpbGVkIiksIHBhLT5maWxlbmFtZSk7Ci0KLQkgICAgZmNsb3NlIChmKTsKLQotCSAgICBwYS0+bmV4dCA9IGFkZF9zZWN0aW9uczsKLQkgICAgYWRkX3NlY3Rpb25zID0gcGE7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9DSEFOR0VfU1RBUlQ6Ci0JICBjaGFuZ2Vfc3RhcnQgPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tY2hhbmdlLXN0YXJ0Iik7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9BRERSRVNTOgotCWNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0xNQToKLQljYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9WTUE6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKnM7Ci0JICAgIGludCBsZW47Ci0JICAgIGNoYXIgKm5hbWU7Ci0JICAgIGNoYXIgKm9wdGlvbjsKLQkgICAgYmZkX3ZtYSB2YWw7Ci0JICAgIGVudW0gY2hhbmdlX2FjdGlvbiB3aGF0OwotCSAgICAKLQkgICAgc3dpdGNoIChjKQotCSAgICAgIHsKLQkgICAgICBjYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9BRERSRVNTOiBvcHRpb24gPSAiLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzIjsgYnJlYWs7Ci0JICAgICAgY2FzZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fTE1BOiBvcHRpb24gPSAiLS1jaGFuZ2Utc2VjdGlvbi1sbWEiOyBicmVhazsKLQkgICAgICBjYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9WTUE6IG9wdGlvbiA9ICItLWNoYW5nZS1zZWN0aW9uLXZtYSI7IGJyZWFrOwotCSAgICAgIH0KLQkgICAgCi0JICAgIHMgPSBzdHJjaHIgKG9wdGFyZywgJz0nKTsKLQkgICAgaWYgKHMgPT0gTlVMTCkKLQkgICAgICB7Ci0JCXMgPSBzdHJjaHIgKG9wdGFyZywgJysnKTsKLQkJaWYgKHMgPT0gTlVMTCkKLQkJICB7Ci0JCSAgICBzID0gc3RyY2hyIChvcHRhcmcsICctJyk7Ci0JCSAgICBpZiAocyA9PSBOVUxMKQotCQkgICAgICBmYXRhbCAoXygiYmFkIGZvcm1hdCBmb3IgJXMiKSwgb3B0aW9uKTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGxlbiA9IHMgLSBvcHRhcmc7Ci0JICAgIG5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKLQkgICAgc3RybmNweSAobmFtZSwgb3B0YXJnLCBsZW4pOwotCSAgICBuYW1lW2xlbl0gPSAnXDAnOwotCi0JICAgIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAobmFtZSwgdHJ1ZSk7Ci0KLQkgICAgdmFsID0gcGFyc2Vfdm1hIChzICsgMSwgb3B0aW9uKTsKLQotCSAgICBzd2l0Y2ggKCpzKQotCSAgICAgIHsKLQkgICAgICBjYXNlICc9Jzogd2hhdCA9IENIQU5HRV9TRVQ7IGJyZWFrOwotCSAgICAgIGNhc2UgJy0nOiB2YWwgID0gLSB2YWw7IC8qIERyb3AgdGhyb3VnaC4gICovCi0JICAgICAgY2FzZSAnKyc6IHdoYXQgPSBDSEFOR0VfTU9ESUZZOyBicmVhazsKLQkgICAgICB9Ci0JICAgIAotCSAgICBzd2l0Y2ggKGMpCi0JICAgICAgewotCSAgICAgIGNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1M6Ci0JCXAtPmNoYW5nZV92bWEgPSB3aGF0OwotCQlwLT52bWFfdmFsICAgID0gdmFsOwotCQkvKiBEcm9wIHRocm91Z2guICAqLwotCQkKLQkgICAgICBjYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9MTUE6Ci0JCXAtPmNoYW5nZV9sbWEgPSB3aGF0OwotCQlwLT5sbWFfdmFsICAgID0gdmFsOwotCQlicmVhazsKLQkJCi0JICAgICAgY2FzZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fVk1BOgotCQlwLT5jaGFuZ2Vfdm1hID0gd2hhdDsKLQkJcC0+dm1hX3ZhbCAgICA9IHZhbDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQ0hBTkdFX0FERFJFU1NFUzoKLQkgIGNoYW5nZV9zZWN0aW9uX2FkZHJlc3MgPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tY2hhbmdlLWFkZHJlc3NlcyIpOwotCSAgY2hhbmdlX3N0YXJ0ID0gY2hhbmdlX3NlY3Rpb25fYWRkcmVzczsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0NIQU5HRV9XQVJOSU5HUzoKLQkgIGNoYW5nZV93YXJuID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0NIQU5HRV9MRUFESU5HX0NIQVI6Ci0JICBjaGFuZ2VfbGVhZGluZ19jaGFyID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0RFQlVHR0lORzoKLQkgIGNvbnZlcnRfZGVidWdnaW5nID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0dBUF9GSUxMOgotCSAgewotCSAgICBiZmRfdm1hIGdhcF9maWxsX3ZtYTsKLQotCSAgICBnYXBfZmlsbF92bWEgPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tZ2FwLWZpbGwiKTsKLQkgICAgZ2FwX2ZpbGwgPSAoYmZkX2J5dGUpIGdhcF9maWxsX3ZtYTsKLQkgICAgaWYgKChiZmRfdm1hKSBnYXBfZmlsbCAhPSBnYXBfZmlsbF92bWEpCi0JICAgICAgewotCQljaGFyIGJ1ZmZbMjBdOwotCQkKLQkJc3ByaW50Zl92bWEgKGJ1ZmYsIGdhcF9maWxsX3ZtYSk7Ci0JCQotCQlub25fZmF0YWwgKF8oIldhcm5pbmc6IHRydW5jYXRpbmcgZ2FwLWZpbGwgZnJvbSAweCVzIHRvIDB4JXgiKSwKLQkJCSAgIGJ1ZmYsIGdhcF9maWxsKTsKLQkgICAgICB9Ci0JICAgIGdhcF9maWxsX3NldCA9IHRydWU7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19DSEFOR0VfV0FSTklOR1M6Ci0JICBjaGFuZ2Vfd2FybiA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fUEFEX1RPOgotCSAgcGFkX3RvID0gcGFyc2Vfdm1hIChvcHRhcmcsICItLXBhZC10byIpOwotCSAgcGFkX3RvX3NldCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9SRU1PVkVfTEVBRElOR19DSEFSOgotCSAgcmVtb3ZlX2xlYWRpbmdfY2hhciA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9TRVRfU0VDVElPTl9GTEFHUzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqczsKLQkgICAgaW50IGxlbjsKLQkgICAgY2hhciAqbmFtZTsKLQotCSAgICBzID0gc3RyY2hyIChvcHRhcmcsICc9Jyk7Ci0JICAgIGlmIChzID09IE5VTEwpCi0JICAgICAgZmF0YWwgKF8oImJhZCBmb3JtYXQgZm9yIC0tc2V0LXNlY3Rpb24tZmxhZ3MiKSk7Ci0KLQkgICAgbGVuID0gcyAtIG9wdGFyZzsKLQkgICAgbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKGxlbiArIDEpOwotCSAgICBzdHJuY3B5IChuYW1lLCBvcHRhcmcsIGxlbik7Ci0JICAgIG5hbWVbbGVuXSA9ICdcMCc7Ci0KLQkgICAgcCA9IGZpbmRfc2VjdGlvbl9saXN0IChuYW1lLCB0cnVlKTsKLQotCSAgICBwLT5zZXRfZmxhZ3MgPSB0cnVlOwotCSAgICBwLT5mbGFncyA9IHBhcnNlX2ZsYWdzIChzICsgMSk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9TRVRfU1RBUlQ6Ci0JICBzZXRfc3RhcnQgPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tc2V0LXN0YXJ0Iik7Ci0JICBzZXRfc3RhcnRfc2V0ID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMDoKLQkgIGJyZWFrOwkJLyogd2UndmUgYmVlbiBnaXZlbiBhIGxvbmcgb3B0aW9uICovCi0JY2FzZSAnaCc6Ci0JICBjb3B5X3VzYWdlIChzdGRvdXQsIDApOwotCWRlZmF1bHQ6Ci0JICBjb3B5X3VzYWdlIChzdGRlcnIsIDEpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNob3dfdmVyc2lvbikKLSAgICBwcmludF92ZXJzaW9uICgib2JqY29weSIpOwotCi0gIGlmIChjb3B5X2J5dGUgPj0gaW50ZXJsZWF2ZSkKLSAgICBmYXRhbCAoXygiYnl0ZSBudW1iZXIgbXVzdCBiZSBsZXNzIHRoYW4gaW50ZXJsZWF2ZSIpKTsKLQotICBpZiAob3B0aW5kID09IGFyZ2MgfHwgb3B0aW5kICsgMiA8IGFyZ2MpCi0gICAgY29weV91c2FnZSAoc3RkZXJyLCAxKTsKLQotICBpbnB1dF9maWxlbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKLSAgaWYgKG9wdGluZCArIDEgPCBhcmdjKQotICAgIG91dHB1dF9maWxlbmFtZSA9IGFyZ3Zbb3B0aW5kICsgMV07Ci0KLSAgLyogRGVmYXVsdCBpcyB0byBzdHJpcCBubyBzeW1ib2xzLiAgKi8KLSAgaWYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfVU5ERUYgJiYgZGlzY2FyZF9sb2NhbHMgPT0gTE9DQUxTX1VOREVGKQotICAgIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9OT05FOwotCi0gIGlmIChvdXRwdXRfdGFyZ2V0ID09IChjaGFyICopIE5VTEwpCi0gICAgb3V0cHV0X3RhcmdldCA9IGlucHV0X3RhcmdldDsKLQotICBpZiAocHJlc2VydmVfZGF0ZXMpCi0gICAgewotICAgICAgaWYgKHN0YXQgKGlucHV0X2ZpbGVuYW1lLCAmc3RhdGJ1ZikgPCAwKQotCWZhdGFsIChfKCJDYW5ub3Qgc3RhdDogJXM6ICVzIiksIGlucHV0X2ZpbGVuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlcmUgaXMgbm8gZGVzdGluYXRpb24gZmlsZSB0aGVuIGNyZWF0ZSBhIHRlbXAgYW5kIHJlbmFtZQotICAgICB0aGUgcmVzdWx0IGludG8gdGhlIGlucHV0LiAgKi8KLQotICBpZiAob3V0cHV0X2ZpbGVuYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgY2hhciAqdG1wbmFtZSA9IG1ha2VfdGVtcG5hbWUgKGlucHV0X2ZpbGVuYW1lKTsKLQotICAgICAgY29weV9maWxlIChpbnB1dF9maWxlbmFtZSwgdG1wbmFtZSwgaW5wdXRfdGFyZ2V0LCBvdXRwdXRfdGFyZ2V0KTsKLSAgICAgIGlmIChzdGF0dXMgPT0gMCkKLQl7CQotCSAgaWYgKHByZXNlcnZlX2RhdGVzKQotCSAgICBzZXRfdGltZXMgKHRtcG5hbWUsICZzdGF0YnVmKTsKLQkgIHNtYXJ0X3JlbmFtZSAodG1wbmFtZSwgaW5wdXRfZmlsZW5hbWUsIHByZXNlcnZlX2RhdGVzKTsKLQl9Ci0gICAgICBlbHNlCi0JdW5saW5rICh0bXBuYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb3B5X2ZpbGUgKGlucHV0X2ZpbGVuYW1lLCBvdXRwdXRfZmlsZW5hbWUsIGlucHV0X3RhcmdldCwgb3V0cHV0X3RhcmdldCk7Ci0gICAgICBpZiAoc3RhdHVzID09IDAgJiYgcHJlc2VydmVfZGF0ZXMpCi0Jc2V0X3RpbWVzIChvdXRwdXRfZmlsZW5hbWUsICZzdGF0YnVmKTsKLSAgICB9Ci0KLSAgaWYgKGNoYW5nZV93YXJuKQotICAgIHsKLSAgICAgIGZvciAocCA9IGNoYW5nZV9zZWN0aW9uczsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAoISBwLT51c2VkKQotCSAgICB7Ci0JICAgICAgaWYgKHAtPmNoYW5nZV92bWEgIT0gQ0hBTkdFX0lHTk9SRSkKLQkJewotCQkgIGNoYXIgYnVmZiBbMjBdOwotCi0JCSAgc3ByaW50Zl92bWEgKGJ1ZmYsIHAtPnZtYV92YWwpOwotCQkgIAotCQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCSAgbm9uX2ZhdGFsIChfKCJXYXJuaW5nOiAtLWNoYW5nZS1zZWN0aW9uLXZtYSAlcyVjMHglcyBuZXZlciB1c2VkIiksCi0JCQkgICAgIHAtPm5hbWUsCi0JCQkgICAgIHAtPmNoYW5nZV92bWEgPT0gQ0hBTkdFX1NFVCA/ICc9JyA6ICcrJywKLQkJCSAgICAgYnVmZik7Ci0JCX0KLQkgICAgICAKLQkgICAgICBpZiAocC0+Y2hhbmdlX2xtYSAhPSBDSEFOR0VfSUdOT1JFKQotCQl7Ci0JCSAgY2hhciBidWZmIFsyMF07Ci0KLQkJICBzcHJpbnRmX3ZtYSAoYnVmZiwgcC0+bG1hX3ZhbCk7Ci0JCSAgCi0JCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJICBub25fZmF0YWwgKF8oIldhcm5pbmc6IC0tY2hhbmdlLXNlY3Rpb24tbG1hICVzJWMweCVzIG5ldmVyIHVzZWQiKSwKLQkJCSAgICAgcC0+bmFtZSwKLQkJCSAgICAgcC0+Y2hhbmdlX2xtYSA9PSBDSEFOR0VfU0VUID8gJz0nIDogJysnLAotCQkJICAgICBidWZmKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqYXJndltdOwotewotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBTVEFSVF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lLCAwKTsKLQotICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfVU5ERUY7Ci0gIGRpc2NhcmRfbG9jYWxzID0gTE9DQUxTX1VOREVGOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIGlmIChpc19zdHJpcCA8IDApCi0gICAgewotICAgICAgaW50IGkgPSBzdHJsZW4gKHByb2dyYW1fbmFtZSk7Ci0gICAgICBpc19zdHJpcCA9IChpID49IDUgJiYgc3RyY21wIChwcm9ncmFtX25hbWUgKyBpIC0gNSwgInN0cmlwIikgPT0gMCk7Ci0gICAgfQotCi0gIGlmIChpc19zdHJpcCkKLSAgICBzdHJpcF9tYWluIChhcmdjLCBhcmd2KTsKLSAgZWxzZQotICAgIGNvcHlfbWFpbiAoYXJnYywgYXJndik7Ci0KLSAgRU5EX1BST0dSRVNTIChwcm9ncmFtX25hbWUpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9vYmpkdW1wLjEgYi9iaW51dGlscy9vYmpkdW1wLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYzE1M2UuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvb2JqZHVtcC4xCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBvYmpkdW1wIDEgIjUgTm92ZW1iZXIgMTk5MSIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLW9iamR1bXAgXC0gZGlzcGxheSBpbmZvcm1hdGlvbiBmcm9tIG9iamVjdCBmaWxlcy4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIG9iamR1bXAKLS5SQiAiW1x8IiBcLWEgfCBcLVwtYXJjaGl2ZVwtaGVhZGVycyAiXHxdIiAKLS5SQiAiW1x8IiAiXC1iXCAiXGMKLS5JIGJmZG5hbWVcYwotLlJCICIgfCAiICJcLVwtdGFyZ2V0PSJcYwotLkkgYmZkbmFtZVxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLUMgfCBcLVwtZGVtYW5nbGUgIlx8XSIgCi0uUkIgIltcfCIgXC1cLWRlYnVnZ2luZyAiXHxdIiAKLS5SQiAiW1x8IiBcLWQgfCBcLVwtZGlzYXNzZW1ibGUgIlx8XSIgCi0uUkIgIltcfCIgXC1EIHwgXC1cLWRpc2Fzc2VtYmxlLWFsbCAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtZGlzYXNzZW1ibGVcLXplcm9lcyAiXHxdIiAKLS5SQiAiW1x8IiBcLUVCIHwgXC1FTCB8IFwtXC1lbmRpYW49XGMKLS5JIHtiaWd8bGl0dGxlfVxjCi1cJlx8XQotLlJCICJbXHwiIFwtZiB8IFwtXC1maWxlXC1oZWFkZXJzICJcfF0iCi0uUkIgIltcfCIgXC1oIHwgXC1cLXNlY3Rpb25cLWhlYWRlcnMKLS5SQiAifCAiIFwtXC1oZWFkZXJzICJcfF0iIAotLlJCICJbXHwiIFwtaSB8IFwtXC1pbmZvICJcfF0iIAotLlJCICJbXHwiICJcLWpcICJcYwotLkkgc2VjdGlvblxjCi0uUkIgIiB8ICIgIlwtXC1zZWN0aW9uPSJcYwotLkkgc2VjdGlvblxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLWwgfCBcLVwtbGluZVwtbnVtYmVycyAiXHxdIgotLlJCICJbXHwiICJcLW1cICJcYwotLkkgbWFjaGluZVxjCi0uUkIgIiB8ICIgIlwtXC1hcmNoaXRlY3R1cmU9IlxjCi0uSSBtYWNoaW5lXGMKLVwmXHxdIAotLlJCICJbXHwiIFwtcCB8IFwtXC1wcml2YXRlXC1oZWFkZXJzICJcfF0iIAotLlJCICJbXHwiIFwtXC1wcmVmaXhcLWFkZHJlc3NlcyAiXHxdIiAKLS5SQiAiW1x8IiBcLXIgfCBcLVwtcmVsb2MgIlx8XSIgCi0uUkIgIltcfCIgXC1SIHwgXC1cLWR5bmFtaWNcLXJlbG9jICJcfF0iIAotLlJCICJbXHwiIFwtcyB8IFwtXC1mdWxsXC1jb250ZW50cyAiXHxdIgotLlJCICJbXHwiIFwtUyB8IFwtXC1zb3VyY2UgIlx8XSIKLS5SQiAiW1x8IiBcLVwtW25vXC1dc2hvd1wtcmF3XC1pbnNuICJcfF0iIAotLlJCICJbXHwiIFwtXC1zdGFicyAiXHxdIgotLlJCICJbXHwiIFwtdCB8IFwtXC1zeW1zICJcfF0iIAotLlJCICJbXHwiIFwtVCB8IFwtXC1keW5hbWljXC1zeW1zICJcfF0iIAotLlJCICJbXHwiIFwteCB8IFwtXC1hbGxcLWhlYWRlcnMgIlx8XSIKLS5SQiAiW1x8IiAiXC1cLXN0YXJ0XC1hZGRyZXNzPSJcYwotLkkgYWRkcmVzc1xjCi1cJlx8XQotLlJCICJbXHwiICJcLVwtc3RvcFwtYWRkcmVzcz0iXGMKLS5JIGFkZHJlc3NcYwotXCZcfF0KLS5SQiAiW1x8IiAiXC1cLWFkanVzdFwtdm1hPSJcYwotLkkgb2Zmc2V0XGMKLVwmXHxdCi0uUkIgIltcfCIgXC1cLXZlcnNpb24gIlx8XSIKLS5SQiAiW1x8IiBcLVwtaGVscCAiXHxdIgotLkkgb2JqZmlsZVxjCi1cJi5cfC5cfC4KLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1cYwotLkIgb2JqZHVtcFxjCi1cJiBkaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3IgbW9yZSBvYmplY3QgZmlsZXMuCi1UaGUgb3B0aW9ucyBjb250cm9sIHdoYXQgcGFydGljdWxhciBpbmZvcm1hdGlvbiB0byBkaXNwbGF5LiAgVGhpcwotaW5mb3JtYXRpb24gaXMgbW9zdGx5IHVzZWZ1bCB0byBwcm9ncmFtbWVycyB3aG8gYXJlIHdvcmtpbmcgb24gdGhlCi1jb21waWxhdGlvbiB0b29scywgYXMgb3Bwb3NlZCB0byBwcm9ncmFtbWVycyB3aG8ganVzdCB3YW50IHRoZWlyCi1wcm9ncmFtIHRvIGNvbXBpbGUgYW5kIHdvcmsuCi0uUFAKLS5JUiAgIm9iamZpbGUiIC5cfC5cfC4KLWFyZSB0aGUgb2JqZWN0IGZpbGVzIHRvIGJlIGV4YW1pbmVkLiAgV2hlbiB5b3Ugc3BlY2lmeSBhcmNoaXZlcywKLVxjCi0uQiBvYmpkdW1wXGMKLVwmIHNob3dzIGluZm9ybWF0aW9uIG9uIGVhY2ggb2YgdGhlIG1lbWJlciBvYmplY3QgZmlsZXMuCi0KLS5TSCBPUFRJT05TCi1XaGVyZSBsb25nIGFuZCBzaG9ydCBmb3JtcyBvZiBhbiBvcHRpb24gYXJlIHNob3duIHRvZ2V0aGVyLCB0aGV5IGFyZQotZXF1aXZhbGVudC4gIEF0IGxlYXN0IG9uZSBvcHRpb24gYmVzaWRlcwotLkIgXC1sCi0oXGZCXC1cLWxpbmVcLW51bWJlcnNcZlApIG11c3QgYmUgZ2l2ZW4uCi0KLS5UUAotLkIgXC1hCi0uVFAKLS5CIFwtXC1hcmNoaXZlXC1oZWFkZXJzCi1JZiBhbnkgZmlsZXMgZnJvbSBcYwotLkkgb2JqZmlsZVxjCi1cJiBhcmUgYXJjaGl2ZXMsIGRpc3BsYXkgdGhlIGFyY2hpdmUKLWhlYWRlciBpbmZvcm1hdGlvbiAoaW4gYSBmb3JtYXQgc2ltaWxhciB0byBgXHxcYwotLkIgbHMgXC1sXGMKLVx8JykuICBCZXNpZGVzIHRoZQotaW5mb3JtYXRpb24geW91IGNvdWxkIGxpc3Qgd2l0aCBgXHxcYwotLkIgYXIgdHZcYwotXHwnLCBgXHxcYwotLkIgb2JqZHVtcCBcLWFcYwotXHwnIHNob3dzCi10aGUgb2JqZWN0IGZpbGUgZm9ybWF0IG9mIGVhY2ggYXJjaGl2ZSBtZW1iZXIuCi0KLS5UUAotLkJJICJcLVwtYWRqdXN0XC12bWE9IiAib2Zmc2V0IgotV2hlbiBkdW1waW5nIGluZm9ybWF0aW9uLCBmaXJzdCBhZGQKLS5JIG9mZnNldAotdG8gYWxsIHRoZSBzZWN0aW9uIGFkZHJlc3Nlcy4gIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSBzZWN0aW9uIGFkZHJlc3NlcwotZG8gbm90IGNvcnJlc3BvbmQgdG8gdGhlIHN5bWJvbCB0YWJsZSwgd2hpY2ggY2FuIGhhcHBlbiB3aGVuIHB1dHRpbmcKLXNlY3Rpb25zIGF0IHBhcnRpY3VsYXIgYWRkcmVzc2VzIHdoZW4gdXNpbmcgYSBmb3JtYXQgd2hpY2ggY2FuIG5vdAotcmVwcmVzZW50IHNlY3Rpb24gYWRkcmVzc2VzLCBzdWNoIGFzIGEub3V0LgotCi0uVFAKLS5CSSAiXC1iICIgImJmZG5hbWUiXGMKLS5UUAotLkJJICJcLVwtdGFyZ2V0PSIgImJmZG5hbWUiCi1TcGVjaWZ5IHRoZSBvYmplY3QtY29kZSBmb3JtYXQgZm9yIHRoZSBvYmplY3QgZmlsZXMgdG8gYmUKLVxjCi0uSSBiZmRuYW1lXGMKLVwmLiAgVGhpcyBtYXkgbm90IGJlIG5lY2Vzc2FyeTsgXGMKLS5JIG9iamR1bXBcYwotXCYgY2FuCi1hdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBtYW55IGZvcm1hdHMuICBGb3IgZXhhbXBsZSwKLS5zcAotLmJyCi1vYmpkdW1wXCBcLWJcIG9hc3lzXCBcLW1cIHZheFwgXC1oXCBmdS5vCi0uYnIKLS5zcAotZGlzcGxheSBzdW1tYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIHNlY3Rpb24gaGVhZGVycyAoYFx8XGMKLS5CIFwtaFxjCi1cfCcpIG9mCi1gXHxcYwotLkIgZnUub1xjCi1cfCcsIHdoaWNoIGlzIGV4cGxpY2l0bHkgaWRlbnRpZmllZCAoYFx8XGMKLS5CIFwtbVxjCi1cfCcpIGFzIGEgVmF4IG9iamVjdAotZmlsZSBpbiB0aGUgZm9ybWF0IHByb2R1Y2VkIGJ5IE9hc3lzIGNvbXBpbGVycy4gIFlvdSBjYW4gbGlzdCB0aGUKLWZvcm1hdHMgYXZhaWxhYmxlIHdpdGggdGhlIGBcfFxjCi0uQiBcLWlcYwotXHwnIG9wdGlvbi4KLQotLlRQCi0uQiBcLUMKLS5UUAotLkIgXC1cLWRlbWFuZ2xlCi1EZWNvZGUgKFxmSWRlbWFuZ2xlXGZQKSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzIGludG8gdXNlci1sZXZlbCBuYW1lcy4KLUJlc2lkZXMgcmVtb3ZpbmcgYW55IGluaXRpYWwgdW5kZXJzY29yZSBwcmVwZW5kZWQgYnkgdGhlIHN5c3RlbSwgdGhpcwotbWFrZXMgQysrIGZ1bmN0aW9uIG5hbWVzIHJlYWRhYmxlLgotCi0uVFAKLS5CIFwtXC1kZWJ1Z2dpbmcKLURpc3BsYXkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBhdHRlbXB0cyB0byBwYXJzZSBkZWJ1Z2dpbmcKLWluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgZmlsZSBhbmQgcHJpbnQgaXQgb3V0IHVzaW5nIGEgQyBsaWtlIHN5bnRheC4KLU9ubHkgY2VydGFpbiB0eXBlcyBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaGF2ZSBiZWVuIGltcGxlbWVudGVkLgotCi0uVFAKLS5CIFwtZAotLlRQCi0uQiBcLVwtZGlzYXNzZW1ibGUKLURpc3BsYXkgdGhlIGFzc2VtYmxlciBtbmVtb25pY3MgZm9yIHRoZSBtYWNoaW5lCi1pbnN0cnVjdGlvbnMgZnJvbSBcYwotLkkgb2JqZmlsZVxjCi1cJi4KLVRoaXMgb3B0aW9uIG9ubHkgZGlzYXNzZW1ibGVzIHRob3NlIHNlY3Rpb25zIHdoaWNoIGFyZQotZXhwZWN0ZWQgdG8gY29udGFpbiBpbnN0cnVjdGlvbnMuCi0KLS5UUAotLkIgXC1ECi0uVFAKLS5CIFwtXC1kaXNhc3NlbWJsZS1hbGwKLUxpa2UgXGZCXC1kXGZQLCBidXQgZGlzYXNzZW1ibGUgdGhlIGNvbnRlbnRzIG9mIGFsbCBzZWN0aW9ucywgbm90IGp1c3QKLXRob3NlIGV4cGVjdGVkIHRvIGNvbnRhaW4gaW5zdHJ1Y3Rpb25zLgotCi0uVFAKLS5CIFwtXC1wcmVmaXhcLWFkZHJlc3NlcwotV2hlbiBkaXNhc3NlbWJsaW5nLCBwcmludCB0aGUgY29tcGxldGUgYWRkcmVzcyBvbiBlYWNoIGxpbmUuICBUaGlzIGlzCi10aGUgb2xkZXIgZGlzYXNzZW1ibHkgZm9ybWF0LgotCi0uVFAKLS5CIFwtXC1kaXNhc3NlbWJsZVwtemVyb2VzCi1Ob3JtYWxseSB0aGUgZGlzYXNzZW1ibHkgb3V0cHV0IHdpbGwgc2tpcCBibG9ja3Mgb2YgemVyb2VzLiAgVGhpcwotb3B0aW9uIGRpcmVjdHMgdGhlIGRpc2Fzc2VtYmxlciB0byBkaXNhc3NlbWJsZSB0aG9zZSBibG9ja3MsIGp1c3QgbGlrZQotYW55IG90aGVyIGRhdGEuCi0KLS5UUAotLkIgXC1FQgotLlRQCi0uQiBcLUVMCi0uVFAKLS5CSSAiXC1cLWVuZGlhbj0iICJ7YmlnfGxpdHRsZX0iCi1TcGVjaWZ5IHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBvYmplY3QgZmlsZXMuICBUaGlzIG9ubHkgYWZmZWN0cwotZGlzYXNzZW1ibHkuICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBkaXNhc3NlbWJsaW5nIGEgZmlsZSBmb3JtYXQgd2hpY2gKLWRvZXMgbm90IGRlc2NyaWJlIGVuZGlhbm5lc3MgaW5mb3JtYXRpb24sIHN1Y2ggYXMgUy1yZWNvcmRzLgotCi0uVFAKLS5CIFwtZgotLlRQCi0uQiBcLVwtZmlsZVwtaGVhZGVycwotRGlzcGxheSBzdW1tYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIG92ZXJhbGwgaGVhZGVyIG9mCi1lYWNoIGZpbGUgaW4gXGMKLS5JIG9iamZpbGVcYwotXCYuCi0KLS5UUAotLkIgXC1oCi0uVFAKLS5CIFwtXC1zZWN0aW9uXC1oZWFkZXJzCi0uVFAKLS5CIFwtXC1oZWFkZXJzCi1EaXNwbGF5IHN1bW1hcnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2VjdGlvbiBoZWFkZXJzIG9mIHRoZQotb2JqZWN0IGZpbGUuCi0KLS5UUAotLkIgXC1cLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0bwotLkIgb2JqZHVtcAotYW5kIGV4aXQuCi0KLS5UUAotLkIgXC1pCi0uVFAKLS5CIFwtXC1pbmZvCi1EaXNwbGF5IGEgbGlzdCBzaG93aW5nIGFsbCBhcmNoaXRlY3R1cmVzIGFuZCBvYmplY3QgZm9ybWF0cyBhdmFpbGFibGUKLWZvciBzcGVjaWZpY2F0aW9uIHdpdGggXGMKLS5CIFwtYlxjCi1cJiBvciBcYwotLkIgXC1tXGMKLVwmLgotCi0uVFAKLS5CSSAiXC1qICIgIm5hbWUiXGMKLS5UUAotLkJJICJcLVwtc2VjdGlvbj0iICJuYW1lIgotRGlzcGxheSBpbmZvcm1hdGlvbiBvbmx5IGZvciBzZWN0aW9uIFxjCi0uSSBuYW1lXGMKLVwmLgotCi0uVFAKLS5CIFwtbAotLlRQCi0uQiBcLVwtbGluZVwtbnVtYmVycwotTGFiZWwgdGhlIGRpc3BsYXkgKHVzaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbikgd2l0aCB0aGUgZmlsZW5hbWUKLWFuZCBzb3VyY2UgbGluZSBudW1iZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9iamVjdCBjb2RlIHNob3duLgotT25seSB1c2VmdWwgd2l0aCBcZkJcLWRcZlAsIFxmQlwtRFxmUCwgb3IgXGZCXC1yXGZQLgotCi0uVFAKLS5CSSAiXC1tICIgIm1hY2hpbmUiXGMKLS5UUAotLkJJICJcLVwtYXJjaGl0ZWN0dXJlPSIgIm1hY2hpbmUiCi1TcGVjaWZ5IHRoZSBhcmNoaXRlY3R1cmUgdG8gdXNlIHdoZW4gZGlzYXNzZW1ibGluZyBvYmplY3QgZmlsZXMuICBUaGlzCi1jYW4gYmUgdXNlZnVsIHdoZW4gZGlzYXNzZW1ibGluZyBvYmplY3QgZmlsZXMgd2hpY2ggZG8gbm90IGRlc2NyaWJlCi1hcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgUy1yZWNvcmRzLiAgWW91IGNhbiBsaXN0IHRoZSBhdmFpbGFibGUKLWFyY2hpdGVjdHVyZXMgd2l0aCB0aGUgXGZCXC1pXGZQIG9wdGlvbi4gCi0KLS5UUAotLkIgXC1wCi0uVFAKLS5CIFwtXC1wcml2YXRlXC1oZWFkZXJzCi1QcmludCBpbmZvcm1hdGlvbiB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGUKLWV4YWN0IGluZm9ybWF0aW9uIHByaW50ZWQgZGVwZW5kcyB1cG9uIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuICBGb3IKLXNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cywgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBwcmludGVkLgotCi0uVFAKLS5CIFwtcgotLlRQCi0uQiBcLVwtcmVsb2MKLVByaW50IHRoZSByZWxvY2F0aW9uIGVudHJpZXMgb2YgdGhlIGZpbGUuICBJZiB1c2VkIHdpdGggXGZCXC1kXGZQIG9yCi1cZkJcLURcZlAsIHRoZSByZWxvY2F0aW9ucyBhcmUgcHJpbnRlZCBpbnRlcnNwZXJzZWQgd2l0aCB0aGUKLWRpc2Fzc2VtYmx5LgotCi0uVFAKLS5CIFwtUgotLlRQCi0uQiBcLVwtZHluYW1pY1wtcmVsb2MKLVByaW50IHRoZSBkeW5hbWljIHJlbG9jYXRpb24gZW50cmllcyBvZiB0aGUgZmlsZS4gIFRoaXMgaXMgb25seQotbWVhbmluZ2Z1bCBmb3IgZHluYW1pYyBvYmplY3RzLCBzdWNoIGFzIGNlcnRhaW4gdHlwZXMgb2Ygc2hhcmVkCi1saWJyYXJpZXMuCi0KLS5UUAotLkIgXC1zCi0uVFAKLS5CIFwtXC1mdWxsXC1jb250ZW50cwotRGlzcGxheSB0aGUgZnVsbCBjb250ZW50cyBvZiBhbnkgc2VjdGlvbnMgcmVxdWVzdGVkLgotCi0uVFAKLS5CIFwtUwotLlRQCi0uQiBcLVwtc291cmNlCi1EaXNwbGF5IHNvdXJjZSBjb2RlIGludGVybWl4ZWQgd2l0aCBkaXNhc3NlbWJseSwgaWYgcG9zc2libGUuICBJbXBsaWVzCi1cZkItZFxmUC4KLQotLlRQCi0uQiBcLVwtc2hvd1wtcmF3XC1pbnNuCi1XaGVuIGRpc2Fzc2VtYmxpbmcgaW5zdHJ1Y3Rpb25zLCBwcmludCB0aGUgaW5zdHJ1Y3Rpb24gaW4gaGV4IGFzIHdlbGwgYXMKLWluIHN5bWJvbGljIGZvcm0uICBUaGlzIGlzIHRoZSBkZWZhdWx0IGV4Y2VwdCB3aGVuCi0uQiBcLVwtcHJlZml4XC1hZGRyZXNzZXMKLWlzIHVzZWQuCi0KLS5UUAotLkIgXC1cLW5vXC1zaG93XC1yYXdcLWluc24KLVdoZW4gZGlzYXNzZW1ibGluZyBpbnN0cnVjdGlvbnMsIGRvIG5vdCBwcmludCB0aGUgaW5zdHJ1Y3Rpb24gYnl0ZXMuCi1UaGlzIGlzIHRoZSBkZWZhdWx0IHdoZW4KLS5CIFwtXC1wcmVmaXhcLWFkZHJlc3NlcwotaXMgdXNlZC4KLQotLlRQCi0uQiBcLVwtc3RhYnMKLURpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSAuc3RhYiwgLnN0YWIuaW5kZXgsIGFuZCAuc3RhYi5leGNsCi1zZWN0aW9ucyBmcm9tIGFuIEVMRiBmaWxlLiAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBvbiBzeXN0ZW1zIChzdWNoIGFzCi1Tb2xhcmlzIDIuMCkgaW4gd2hpY2ggLnN0YWIgZGVidWdnaW5nIHN5bWJvbC10YWJsZSBlbnRyaWVzIGFyZSBjYXJyaWVkCi1pbiBhbiBFTEYgc2VjdGlvbi4gIEluIG1vc3Qgb3RoZXIgZmlsZSBmb3JtYXRzLCBkZWJ1Z2dpbmcgc3ltYm9sLXRhYmxlCi1lbnRyaWVzIGFyZSBpbnRlcmxlYXZlZCB3aXRoIGxpbmthZ2Ugc3ltYm9scywgYW5kIGFyZSB2aXNpYmxlIGluIHRoZQotLkIgXC1cLXN5bXMKLW91dHB1dC4KLQotLlRQCi0uQkkgIlwtXC1zdGFydFwtYWRkcmVzcz0iICJhZGRyZXNzIgotU3RhcnQgZGlzcGxheWluZyBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gIFRoaXMgYWZmZWN0cyB0aGUgb3V0cHV0Ci1vZiB0aGUKLS5CIFwtZFxjCi0sCi0uQiBcLXIKLWFuZAotLkIgXC1zCi1vcHRpb25zLgotCi0uVFAKLS5CSSAiXC1cLXN0b3BcLWFkZHJlc3M9IiAiYWRkcmVzcyIKLVN0b3AgZGlzcGxheWluZyBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gIFRoaXMgYWZmZWN0cyB0aGUgb3V0cHV0Ci1vZiB0aGUKLS5CIFwtZFxjCi0sCi0uQiBcLXIKLWFuZAotLkIgXC1zCi1vcHRpb25zLgotCi0uVFAKLS5CIFwtdAotLlRQCi0uQiBcLVwtc3ltcwotU3ltYm9sIFRhYmxlLiAgUHJpbnQgdGhlIHN5bWJvbCB0YWJsZSBlbnRyaWVzIG9mIHRoZSBmaWxlLgotVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgYFx8XGMKLS5CIG5tXGMKLVx8JyBwcm9ncmFtLgotCi0uVFAKLS5CIFwtVAotLlRQCi0uQiBcLVwtZHluYW1pY1wtc3ltcwotRHluYW1pYyBTeW1ib2wgVGFibGUuICBQcmludCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgZW50cmllcyBvZiB0aGUKLWZpbGUuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgZHluYW1pYyBvYmplY3RzLCBzdWNoIGFzIGNlcnRhaW4KLXR5cGVzIG9mIHNoYXJlZCBsaWJyYXJpZXMuICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGluZm9ybWF0aW9uCi1wcm92aWRlZCBieSB0aGUgYFx8XGMKLS5CIG5tXGMKLVx8JyBwcm9ncmFtIHdoZW4gZ2l2ZW4gdGhlCi0uQiBcLUQgKFwtXC1keW5hbWljKQotb3B0aW9uLgotCi0uVFAKLS5CIFwtXC12ZXJzaW9uCi1QcmludCB0aGUgdmVyc2lvbiBudW1iZXIgb2YKLS5CIG9iamR1bXAKLWFuZCBleGl0LgotCi0uVFAKLS5CIFwteAotLlRQCi0uQiBcLVwtYWxsXC1oZWFkZXJzCi1EaXNwbGF5IGFsbCBhdmFpbGFibGUgaGVhZGVyIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIHN5bWJvbCB0YWJsZSBhbmQKLXJlbG9jYXRpb24gZW50cmllcy4gIFVzaW5nIGBcfFxjCi0uQiBcLXhcYwotXHwnIGlzIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyBhbGwgb2YKLWBcfFxjCi0uQiBcLWEgXC1mIFwtaCBcLXIgXC10XGMKLVx8Jy4KLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIgotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLVwmLCBSb2xhbmQgSC4gUGVzY2ggKE9jdG9iZXIgMTk5MSk7IAotLkJSIG5tICIoIiAxICIpLiIKLQotLlNIIENPUFlJTkcKLUNvcHlyaWdodCAoYykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL29iamR1bXAuYyBiL2JpbnV0aWxzL29iamR1bXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJhZjIzNS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9vYmpkdW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODMyICswLDAgQEAKLS8qIG9iamR1bXAuYyAtLSBkdW1wIGluZm9ybWF0aW9uIGFib3V0IGFuIG9iamVjdCBmaWxlLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgInByb2dyZXNzLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZGVtYW5nbGUuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgImJ1ZGJnLmgiCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLS8qIEludGVybmFsIGhlYWRlcnMgZm9yIHRoZSBFTEYgLnN0YWItZHVtcCBjb2RlIC0gc29ycnkuICAqLwotI2RlZmluZQlCWVRFU19JTl9XT1JECTMyCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRlBSSU5URgotLyogVGhpcyBpcyBuZWVkZWQgYnkgSU5JVF9ESVNBU1NFTUJMRV9JTkZPLiAgKi8KLWV4dGVybiBpbnQgZnByaW50ZiBQQVJBTVMgKChGSUxFICosIGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0jZW5kaWYKLQotc3RhdGljIGNoYXIgKmRlZmF1bHRfdGFyZ2V0ID0gTlVMTDsJLyogZGVmYXVsdCBhdCBydW50aW1lICovCi0KLXN0YXRpYyBpbnQgc2hvd192ZXJzaW9uID0gMDsJCS8qIHNob3cgdGhlIHZlcnNpb24gbnVtYmVyICovCi1zdGF0aWMgaW50IGR1bXBfc2VjdGlvbl9jb250ZW50czsJLyogLXMgKi8KLXN0YXRpYyBpbnQgZHVtcF9zZWN0aW9uX2hlYWRlcnM7CS8qIC1oICovCi1zdGF0aWMgYm9vbGVhbiBkdW1wX2ZpbGVfaGVhZGVyOwkvKiAtZiAqLwotc3RhdGljIGludCBkdW1wX3N5bXRhYjsJCQkvKiAtdCAqLwotc3RhdGljIGludCBkdW1wX2R5bmFtaWNfc3ltdGFiOwkJLyogLVQgKi8KLXN0YXRpYyBpbnQgZHVtcF9yZWxvY19pbmZvOwkJLyogLXIgKi8KLXN0YXRpYyBpbnQgZHVtcF9keW5hbWljX3JlbG9jX2luZm87CS8qIC1SICovCi1zdGF0aWMgaW50IGR1bXBfYXJfaGRyczsJCS8qIC1hICovCi1zdGF0aWMgaW50IGR1bXBfcHJpdmF0ZV9oZWFkZXJzOwkvKiAtcCAqLwotc3RhdGljIGludCBwcmVmaXhfYWRkcmVzc2VzOwkJLyogLS1wcmVmaXgtYWRkcmVzc2VzICovCi1zdGF0aWMgaW50IHdpdGhfbGluZV9udW1iZXJzOwkJLyogLWwgKi8KLXN0YXRpYyBib29sZWFuIHdpdGhfc291cmNlX2NvZGU7CS8qIC1TICovCi1zdGF0aWMgaW50IHNob3dfcmF3X2luc247CQkvKiAtLXNob3ctcmF3LWluc24gKi8KLXN0YXRpYyBpbnQgZHVtcF9zdGFiX3NlY3Rpb25faW5mbzsJLyogLS1zdGFicyAqLwotc3RhdGljIGludCBkb19kZW1hbmdsZTsJCQkvKiAtQywgLS1kZW1hbmdsZSAqLwotc3RhdGljIGJvb2xlYW4gZGlzYXNzZW1ibGU7CQkvKiAtZCAqLwotc3RhdGljIGJvb2xlYW4gZGlzYXNzZW1ibGVfYWxsOwkJLyogLUQgKi8KLXN0YXRpYyBpbnQgZGlzYXNzZW1ibGVfemVyb2VzOwkJLyogLS1kaXNhc3NlbWJsZS16ZXJvZXMgKi8KLXN0YXRpYyBib29sZWFuIGZvcm1hdHNfaW5mbzsJCS8qIC1pICovCi1zdGF0aWMgY2hhciAqb25seTsJCQkvKiAtaiBzZWNuYW1lICovCi1zdGF0aWMgaW50IHdpZGVfb3V0cHV0OwkJCS8qIC13ICovCi1zdGF0aWMgYmZkX3ZtYSBzdGFydF9hZGRyZXNzID0gKGJmZF92bWEpIC0xOyAvKiAtLXN0YXJ0LWFkZHJlc3MgKi8KLXN0YXRpYyBiZmRfdm1hIHN0b3BfYWRkcmVzcyA9IChiZmRfdm1hKSAtMTsgIC8qIC0tc3RvcC1hZGRyZXNzICovCi1zdGF0aWMgaW50IGR1bXBfZGVidWdnaW5nOwkJLyogLS1kZWJ1Z2dpbmcgKi8KLXN0YXRpYyBiZmRfdm1hIGFkanVzdF9zZWN0aW9uX3ZtYSA9IDA7CS8qIC0tYWRqdXN0LXZtYSAqLwotCi0vKiBFeHRyYSBpbmZvIHRvIHBhc3MgdG8gdGhlIGRpc2Fzc2VtYmxlciBhZGRyZXNzIHByaW50aW5nIGZ1bmN0aW9uLiAgKi8KLXN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvIHsKLSAgYmZkICphYmZkOwotICBhc2VjdGlvbiAqc2VjOwotICBib29sZWFuIHJlcXVpcmVfc2VjOwotfTsKLQotLyogQXJjaGl0ZWN0dXJlIHRvIGRpc2Fzc2VtYmxlIGZvciwgb3IgZGVmYXVsdCBpZiBOVUxMLiAgKi8KLXN0YXRpYyBjaGFyICptYWNoaW5lID0gKGNoYXIgKikgTlVMTDsKLQotLyogRW5kaWFubmVzcyB0byBkaXNhc3NlbWJsZSBmb3IsIG9yIGRlZmF1bHQgaWYgQkZEX0VORElBTl9VTktOT1dOLiAgKi8KLXN0YXRpYyBlbnVtIGJmZF9lbmRpYW4gZW5kaWFuID0gQkZEX0VORElBTl9VTktOT1dOOwotCi0vKiBUaGUgc3ltYm9sIHRhYmxlLiAgKi8KLXN0YXRpYyBhc3ltYm9sICoqc3ltczsKLQotLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN5bXMnLiAgKi8KLXN0YXRpYyBsb25nIHN5bWNvdW50ID0gMDsKLQotLyogVGhlIHNvcnRlZCBzeW1ib2wgdGFibGUuICAqLwotc3RhdGljIGFzeW1ib2wgKipzb3J0ZWRfc3ltczsKLQotLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYHNvcnRlZF9zeW1zJy4gICovCi1zdGF0aWMgbG9uZyBzb3J0ZWRfc3ltY291bnQgPSAwOwotCi0vKiBUaGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICAqLwotc3RhdGljIGFzeW1ib2wgKipkeW5zeW1zOwotCi0vKiBOdW1iZXIgb2Ygc3ltYm9scyBpbiBgZHluc3ltcycuICAqLwotc3RhdGljIGxvbmcgZHluc3ltY291bnQgPSAwOwotCi0vKiBTdGF0aWMgZGVjbGFyYXRpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLXVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2ZpbGUgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUsIGNoYXIgKnRhcmdldCkpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9zZWN0aW9uX2hlYWRlciBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2hlYWRlcnMgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfZGF0YSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfcmVsb2NzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9keW5hbWljX3JlbG9jcyBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3JlbG9jX3NldCBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgbG9uZykpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqYWJmZCwgYm9vbGVhbiBkeW5hbWljKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2JmZF9oZWFkZXIgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfYmZkX3ByaXZhdGVfaGVhZGVyIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2JmZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfdGFyZ2V0X2xpc3QgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9pbmZvX3RhYmxlIFBBUkFNUyAoKGludCwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X3RhcmdldF90YWJsZXMgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9pbmZvIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfdmFsdWUgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYm9vbGVhbikpOwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF9zeW1uYW1lIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBhc3ltYm9sICopKTsKLQotc3RhdGljIGFzeW1ib2wgKgotZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGJvb2xlYW4sIGxvbmcgKikpOwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICosIGJmZF92bWEsCi0JCQkJICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBib29sZWFuKSk7Ci0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X2FkZHIgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYm9vbGVhbikpOwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF9hZGRyZXNzIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIHZvaWQKLXNob3dfbGluZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGVfYnl0ZXMgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgZGlzYXNzZW1ibGVyX2Z0eXBlLAotCQkJICAgYm9vbGVhbiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwKLQkJCSAgIGFyZWxlbnQgKioqLCBhcmVsZW50ICoqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNhc3NlbWJsZV9kYXRhIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWVuZGlhbl9zdHJpbmcgUEFSQU1TICgoZW51bSBiZmRfZW5kaWFuKSk7Ci0KLXN0YXRpYyBhc3ltYm9sICoqCi1zbHVycF9zeW10YWIgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGFzeW1ib2wgKioKLXNsdXJwX2R5bmFtaWNfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBsb25nCi1yZW1vdmVfdXNlbGVzc19zeW1ib2xzIFBBUkFNUyAoKGFzeW1ib2wgKiosIGxvbmcpKTsKLQotc3RhdGljIGludAotY29tcGFyZV9zeW1ib2xzIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfcmVsb2NzIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3N0YWJzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1yZWFkX3NlY3Rpb25fc3RhYnMgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zZWN0aW9uX3N0YWJzIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotDAotc3RhdGljIHZvaWQKLXVzYWdlIChzdHJlYW0sIHN0YXR1cykKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBpbnQgc3RhdHVzOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLVVzYWdlOiAlcyBbLWFoaWZDZERwclJ0VHhzU2x3XSBbLWIgYmZkbmFtZV0gWy1tIG1hY2hpbmVdIFstaiBzZWN0aW9uLW5hbWVdXG5cCi0gICAgICAgWy0tYXJjaGl2ZS1oZWFkZXJzXSBbLS10YXJnZXQ9YmZkbmFtZV0gWy0tZGVidWdnaW5nXSBbLS1kaXNhc3NlbWJsZV1cblwKLSAgICAgICBbLS1kaXNhc3NlbWJsZS1hbGxdIFstLWRpc2Fzc2VtYmxlLXplcm9lc10gWy0tZmlsZS1oZWFkZXJzXVxuXAotICAgICAgIFstLXNlY3Rpb24taGVhZGVyc10gWy0taGVhZGVyc11cblwKLSAgICAgICBbLS1pbmZvXSBbLS1zZWN0aW9uPXNlY3Rpb24tbmFtZV0gWy0tbGluZS1udW1iZXJzXSBbLS1zb3VyY2VdXG4iKSwKLQkgICBwcm9ncmFtX25hbWUpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgICAgICBbLS1hcmNoaXRlY3R1cmU9bWFjaGluZV0gWy0tcmVsb2NdIFstLWZ1bGwtY29udGVudHNdIFstLXN0YWJzXVxuXAotICAgICAgIFstLXN5bXNdIFstLWFsbC1oZWFkZXJzXSBbLS1keW5hbWljLXN5bXNdIFstLWR5bmFtaWMtcmVsb2NdXG5cCi0gICAgICAgWy0td2lkZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gWy0tcHJpdmF0ZS1oZWFkZXJzXVxuXAotICAgICAgIFstLXN0YXJ0LWFkZHJlc3M9YWRkcl0gWy0tc3RvcC1hZGRyZXNzPWFkZHJdXG5cCi0gICAgICAgWy0tcHJlZml4LWFkZHJlc3Nlc10gWy0tW25vLV1zaG93LXJhdy1pbnNuXSBbLS1kZW1hbmdsZV1cblwKLSAgICAgICBbLS1hZGp1c3Qtdm1hPW9mZnNldF0gWy1FQnwtRUxdIFstLWVuZGlhbj17YmlnfGxpdHRsZX1dIG9iamZpbGUuLi5cblwKLWF0IGxlYXN0IG9uZSBvcHRpb24gYmVzaWRlcyAtbCAoLS1saW5lLW51bWJlcnMpIG11c3QgYmUgZ2l2ZW5cbiIpKTsKLSAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotLyogMTUwIGlzbid0IHNwZWNpYWw7IGl0J3MganVzdCBhbiBhcmJpdHJhcnkgbm9uLUFTQ0lJIGNoYXIgdmFsdWUuICAqLwotCi0jZGVmaW5lIE9QVElPTl9FTkRJQU4gKDE1MCkKLSNkZWZpbmUgT1BUSU9OX1NUQVJUX0FERFJFU1MgKE9QVElPTl9FTkRJQU4gKyAxKQotI2RlZmluZSBPUFRJT05fU1RPUF9BRERSRVNTIChPUFRJT05fU1RBUlRfQUREUkVTUyArIDEpCi0jZGVmaW5lIE9QVElPTl9BREpVU1RfVk1BIChPUFRJT05fU1RPUF9BRERSRVNTICsgMSkKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW109Ci17Ci0gIHsiYWRqdXN0LXZtYSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQURKVVNUX1ZNQX0sCi0gIHsiYWxsLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ3gnfSwKLSAgeyJwcml2YXRlLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ3AnfSwKLSAgeyJhcmNoaXRlY3R1cmUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ20nfSwKLSAgeyJhcmNoaXZlLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2EnfSwKLSAgeyJkZWJ1Z2dpbmciLCBub19hcmd1bWVudCwgJmR1bXBfZGVidWdnaW5nLCAxfSwKLSAgeyJkZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCAmZG9fZGVtYW5nbGUsIDF9LAotICB7ImRpc2Fzc2VtYmxlIiwgbm9fYXJndW1lbnQsIE5VTEwsICdkJ30sCi0gIHsiZGlzYXNzZW1ibGUtYWxsIiwgbm9fYXJndW1lbnQsIE5VTEwsICdEJ30sCi0gIHsiZGlzYXNzZW1ibGUtemVyb2VzIiwgbm9fYXJndW1lbnQsICZkaXNhc3NlbWJsZV96ZXJvZXMsIDF9LAotICB7ImR5bmFtaWMtcmVsb2MiLCBub19hcmd1bWVudCwgTlVMTCwgJ1InfSwKLSAgeyJkeW5hbWljLXN5bXMiLCBub19hcmd1bWVudCwgTlVMTCwgJ1QnfSwKLSAgeyJlbmRpYW4iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VORElBTn0sCi0gIHsiZmlsZS1oZWFkZXJzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdmJ30sCi0gIHsiZnVsbC1jb250ZW50cyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAncyd9LAotICB7ImhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdIJ30sCi0gIHsiaW5mbyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnaSd9LAotICB7ImxpbmUtbnVtYmVycyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnbCd9LAotICB7Im5vLXNob3ctcmF3LWluc24iLCBub19hcmd1bWVudCwgJnNob3dfcmF3X2luc24sIC0xfSwKLSAgeyJwcmVmaXgtYWRkcmVzc2VzIiwgbm9fYXJndW1lbnQsICZwcmVmaXhfYWRkcmVzc2VzLCAxfSwKLSAgeyJyZWxvYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAncid9LAotICB7InNlY3Rpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2onfSwKLSAgeyJzZWN0aW9uLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKLSAgeyJzaG93LXJhdy1pbnNuIiwgbm9fYXJndW1lbnQsICZzaG93X3Jhd19pbnNuLCAxfSwKLSAgeyJzb3VyY2UiLCBub19hcmd1bWVudCwgTlVMTCwgJ1MnfSwKLSAgeyJzdGFicyIsIG5vX2FyZ3VtZW50LCAmZHVtcF9zdGFiX3NlY3Rpb25faW5mbywgMX0sCi0gIHsic3RhcnQtYWRkcmVzcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RBUlRfQUREUkVTU30sCi0gIHsic3RvcC1hZGRyZXNzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVE9QX0FERFJFU1N9LAotICB7InN5bXMiLCBub19hcmd1bWVudCwgTlVMTCwgJ3QnfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2InfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsICZzaG93X3ZlcnNpb24sIDF9LAotICB7IndpZGUiLCBub19hcmd1bWVudCwgJndpZGVfb3V0cHV0LCAndyd9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotDAotc3RhdGljIHZvaWQKLWR1bXBfc2VjdGlvbl9oZWFkZXIgKGFiZmQsIHNlY3Rpb24sIGlnbm9yZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBpZ25vcmVkOwotewotICBjaGFyICpjb21tYSA9ICIiOwotCi0gIHByaW50ZiAoIiUzZCAlLTEzcyAlMDhseCAgIiwgc2VjdGlvbi0+aW5kZXgsCi0JICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjdGlvbiksCi0JICAodW5zaWduZWQgbG9uZykgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotICBwcmludGZfdm1hIChiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKSk7Ci0gIHByaW50ZiAoIiAgIik7Ci0gIHByaW50Zl92bWEgKHNlY3Rpb24tPmxtYSk7Ci0gIHByaW50ZiAoIiAgJTA4bHggIDIqKiV1Iiwgc2VjdGlvbi0+ZmlsZXBvcywKLQkgIGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlY3Rpb24pKTsKLSAgaWYgKCEgd2lkZV9vdXRwdXQpCi0gICAgcHJpbnRmICgiXG4gICAgICAgICAgICAgICAgIik7Ci0gIHByaW50ZiAoIiAgIik7Ci0KLSNkZWZpbmUgUEYoeCwgeSkgXAotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiB4KSB7IHByaW50ZiAoIiVzJXMiLCBjb21tYSwgeSk7IGNvbW1hID0gIiwgIjsgfQotCi0gIFBGIChTRUNfSEFTX0NPTlRFTlRTLCAiQ09OVEVOVFMiKTsKLSAgUEYgKFNFQ19BTExPQywgIkFMTE9DIik7Ci0gIFBGIChTRUNfQ09OU1RSVUNUT1IsICJDT05TVFJVQ1RPUiIpOwotICBQRiAoU0VDX0NPTlNUUlVDVE9SX1RFWFQsICJDT05TVFJVQ1RPUiBURVhUIik7Ci0gIFBGIChTRUNfQ09OU1RSVUNUT1JfREFUQSwgIkNPTlNUUlVDVE9SIERBVEEiKTsKLSAgUEYgKFNFQ19DT05TVFJVQ1RPUl9CU1MsICJDT05TVFJVQ1RPUiBCU1MiKTsKLSAgUEYgKFNFQ19MT0FELCAiTE9BRCIpOwotICBQRiAoU0VDX1JFTE9DLCAiUkVMT0MiKTsKLSNpZmRlZiBTRUNfQkFMSUdOCi0gIFBGIChTRUNfQkFMSUdOLCAiQkFMSUdOIik7Ci0jZW5kaWYKLSAgUEYgKFNFQ19SRUFET05MWSwgIlJFQURPTkxZIik7Ci0gIFBGIChTRUNfQ09ERSwgIkNPREUiKTsKLSAgUEYgKFNFQ19EQVRBLCAiREFUQSIpOwotICBQRiAoU0VDX1JPTSwgIlJPTSIpOwotICBQRiAoU0VDX0RFQlVHR0lORywgIkRFQlVHR0lORyIpOwotICBQRiAoU0VDX05FVkVSX0xPQUQsICJORVZFUl9MT0FEIik7Ci0gIFBGIChTRUNfRVhDTFVERSwgIkVYQ0xVREUiKTsKLSAgUEYgKFNFQ19TT1JUX0VOVFJJRVMsICJTT1JUX0VOVFJJRVMiKTsKLQotICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0xJTktfT05DRSkgIT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpsczsKLQotICAgICAgc3dpdGNoIChzZWN0aW9uLT5mbGFncyAmIFNFQ19MSU5LX0RVUExJQ0FURVMpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDoKLQkgIGxzID0gIkxJTktfT05DRV9ESVNDQVJEIjsKLQkgIGJyZWFrOwotCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19PTkVfT05MWToKLQkgIGxzID0gIkxJTktfT05DRV9PTkVfT05MWSI7Ci0JICBicmVhazsKLQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFOgotCSAgbHMgPSAiTElOS19PTkNFX1NBTUVfU0laRSI7Ci0JICBicmVhazsKLQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUzoKLQkgIGxzID0gIkxJTktfT05DRV9TQU1FX0NPTlRFTlRTIjsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHByaW50ZiAoIiVzJXMiLCBjb21tYSwgbHMpOwotICAgICAgY29tbWEgPSAiLCAiOwotICAgIH0KLQotICBwcmludGYgKCJcbiIpOwotI3VuZGVmIFBGCi19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2hlYWRlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcHJpbnRmIChfKCJTZWN0aW9uczpcbiIpKTsKLSNpZm5kZWYgQkZENjQKLSAgcHJpbnRmIChfKCJJZHggTmFtZSAgICAgICAgICBTaXplICAgICAgVk1BICAgICAgIExNQSAgICAgICBGaWxlIG9mZiAgQWxnblxuIikpOwotI2Vsc2UKLSAgcHJpbnRmIChfKCJJZHggTmFtZSAgICAgICAgICBTaXplICAgICAgVk1BICAgICAgICAgICAgICAgTE1BICAgICAgICAgICAgICAgRmlsZSBvZmYgIEFsZ25cbiIpKTsKLSNlbmRpZgotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIGR1bXBfc2VjdGlvbl9oZWFkZXIsIChQVFIpIE5VTEwpOwotfQotDAotc3RhdGljIGFzeW1ib2wgKioKLXNsdXJwX3N5bXRhYiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICoqc3kgPSAoYXN5bWJvbCAqKikgTlVMTDsKLSAgbG9uZyBzdG9yYWdlOwotCi0gIGlmICghKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBIQVNfU1lNUykpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gc3ltYm9sc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIHN5bWNvdW50ID0gMDsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBzdG9yYWdlID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotICBpZiAoc3RvcmFnZSA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgaWYgKHN0b3JhZ2UpCi0gICAgewotICAgICAgc3kgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZSk7Ci0gICAgfQotICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChhYmZkLCBzeSk7Ci0gIGlmIChzeW1jb3VudCA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gIGlmIChzeW1jb3VudCA9PSAwKQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIHN5bWJvbHNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gIHJldHVybiBzeTsKLX0KLQotLyogUmVhZCBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKioKLXNsdXJwX2R5bmFtaWNfc3ltdGFiIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKipzeSA9IChhc3ltYm9sICoqKSBOVUxMOwotICBsb25nIHN0b3JhZ2U7Ci0KLSAgc3RvcmFnZSA9IGJmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotICBpZiAoc3RvcmFnZSA8IDApCi0gICAgewotICAgICAgaWYgKCEoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiBub3QgYSBkeW5hbWljIG9iamVjdFxuIiksCi0JCSAgIHByb2dyYW1fbmFtZSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgZHluc3ltY291bnQgPSAwOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotCi0gICAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci0KLSAgaWYgKHN0b3JhZ2UpCi0gICAgewotICAgICAgc3kgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZSk7Ci0gICAgfQotICBkeW5zeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIHN5KTsKLSAgaWYgKGR5bnN5bWNvdW50IDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgaWYgKGR5bnN5bWNvdW50ID09IDApCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IE5vIGR5bmFtaWMgc3ltYm9sc1xuIiksCi0JICAgICBwcm9ncmFtX25hbWUsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgcmV0dXJuIHN5OwotfQotCi0vKiBGaWx0ZXIgb3V0IChpbiBwbGFjZSkgc3ltYm9scyB0aGF0IGFyZSB1c2VsZXNzIGZvciBkaXNhc3NlbWJseS4KLSAgIENPVU5UIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gU1lNQk9MUy4KLSAgIFJldHVybiB0aGUgbnVtYmVyIG9mIHVzZWZ1bCBzeW1ib2xzLiAqLwotCi1zdGF0aWMgbG9uZwotcmVtb3ZlX3VzZWxlc3Nfc3ltYm9scyAoc3ltYm9scywgY291bnQpCi0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBsb25nIGNvdW50OwotewotICByZWdpc3RlciBhc3ltYm9sICoqaW5fcHRyID0gc3ltYm9scywgKipvdXRfcHRyID0gc3ltYm9sczsKLQotICB3aGlsZSAoLS1jb3VudCA+PSAwKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bSA9ICppbl9wdHIrKzsKLQotICAgICAgaWYgKHN5bS0+bmFtZSA9PSBOVUxMIHx8IHN5bS0+bmFtZVswXSA9PSAnXDAnKQotCWNvbnRpbnVlOwotICAgICAgaWYgKHN5bS0+ZmxhZ3MgJiAoQlNGX0RFQlVHR0lORykpCi0JY29udGludWU7Ci0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pCi0JICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JY29udGludWU7Ci0KLSAgICAgICpvdXRfcHRyKysgPSBzeW07Ci0gICAgfQotICByZXR1cm4gb3V0X3B0ciAtIHN5bWJvbHM7Ci19Ci0KLS8qIFNvcnQgc3ltYm9scyBpbnRvIHZhbHVlIG9yZGVyLiAgKi8KLQotc3RhdGljIGludCAKLWNvbXBhcmVfc3ltYm9scyAoYXAsIGJwKQotICAgICBjb25zdCBQVFIgYXA7Ci0gICAgIGNvbnN0IFBUUiBicDsKLXsKLSAgY29uc3QgYXN5bWJvbCAqYSA9ICooY29uc3QgYXN5bWJvbCAqKilhcDsKLSAgY29uc3QgYXN5bWJvbCAqYiA9ICooY29uc3QgYXN5bWJvbCAqKilicDsKLSAgY29uc3QgY2hhciAqYW4sICpibjsKLSAgc2l6ZV90IGFubCwgYm5sOwotICBib29sZWFuIGFmLCBiZjsKLSAgZmxhZ3dvcmQgYWZsYWdzLCBiZmxhZ3M7Ci0KLSAgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChhKSA+IGJmZF9hc3ltYm9sX3ZhbHVlIChiKSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKGEpIDwgYmZkX2FzeW1ib2xfdmFsdWUgKGIpKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoYS0+c2VjdGlvbiA+IGItPnNlY3Rpb24pCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKGEtPnNlY3Rpb24gPCBiLT5zZWN0aW9uKQotICAgIHJldHVybiAtMTsKLQotICBhbiA9IGJmZF9hc3ltYm9sX25hbWUgKGEpOwotICBibiA9IGJmZF9hc3ltYm9sX25hbWUgKGIpOwotICBhbmwgPSBzdHJsZW4gKGFuKTsKLSAgYm5sID0gc3RybGVuIChibik7Ci0KLSAgLyogVGhlIHN5bWJvbHMgZ251X2NvbXBpbGVkIGFuZCBnY2MyX2NvbXBpbGVkIGNvbnZleSBubyByZWFsCi0gICAgIGluZm9ybWF0aW9uLCBzbyBwdXQgdGhlbSBhZnRlciBvdGhlciBzeW1ib2xzIHdpdGggdGhlIHNhbWUgdmFsdWUuICAqLwotCi0gIGFmID0gKHN0cnN0ciAoYW4sICJnbnVfY29tcGlsZWQiKSAhPSBOVUxMCi0JfHwgc3Ryc3RyIChhbiwgImdjYzJfY29tcGlsZWQiKSAhPSBOVUxMKTsKLSAgYmYgPSAoc3Ryc3RyIChibiwgImdudV9jb21waWxlZCIpICE9IE5VTEwKLQl8fCBzdHJzdHIgKGJuLCAiZ2NjMl9jb21waWxlZCIpICE9IE5VTEwpOwotCi0gIGlmIChhZiAmJiAhIGJmKQotICAgIHJldHVybiAxOwotICBpZiAoISBhZiAmJiBiZikKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogV2UgdXNlIGEgaGV1cmlzdGljIGZvciB0aGUgZmlsZSBuYW1lLCB0byB0cnkgdG8gc29ydCBpdCBhZnRlcgotICAgICBtb3JlIHVzZWZ1bCBzeW1ib2xzLiAgSXQgbWF5IG5vdCB3b3JrIG9uIG5vbiBVbml4IHN5c3RlbXMsIGJ1dCBpdAotICAgICBkb2Vzbid0IHJlYWxseSBtYXR0ZXI7IHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgcHJlY2lzZWx5IHdoaWNoCi0gICAgIHN5bWJvbCBuYW1lcyBnZXQgcHJpbnRlZC4gICovCi0KLSNkZWZpbmUgZmlsZV9zeW1ib2wocywgc24sIHNubCkJCQlcCi0gICgoKHMpLT5mbGFncyAmIEJTRl9GSUxFKSAhPSAwCQkJXAotICAgfHwgKChzbilbKHNubCkgLSAyXSA9PSAnLicJCQlcCi0gICAgICAgJiYgKChzbilbKHNubCkgLSAxXSA9PSAnbycJCVwKLQkgICB8fCAoc24pWyhzbmwpIC0gMV0gPT0gJ2EnKSkpCi0KLSAgYWYgPSBmaWxlX3N5bWJvbCAoYSwgYW4sIGFubCk7Ci0gIGJmID0gZmlsZV9zeW1ib2wgKGIsIGJuLCBibmwpOwotCi0gIGlmIChhZiAmJiAhIGJmKQotICAgIHJldHVybiAxOwotICBpZiAoISBhZiAmJiBiZikKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogVHJ5IHRvIHNvcnQgZ2xvYmFsIHN5bWJvbHMgYmVmb3JlIGxvY2FsIHN5bWJvbHMgYmVmb3JlIGZ1bmN0aW9uCi0gICAgIHN5bWJvbHMgYmVmb3JlIGRlYnVnZ2luZyBzeW1ib2xzLiAgKi8KLQotICBhZmxhZ3MgPSBhLT5mbGFnczsKLSAgYmZsYWdzID0gYi0+ZmxhZ3M7Ci0KLSAgaWYgKChhZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAoYmZsYWdzICYgQlNGX0RFQlVHR0lORykpCi0gICAgewotICAgICAgaWYgKChhZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQotCXJldHVybiAxOwotICAgICAgZWxzZQotCXJldHVybiAtMTsKLSAgICB9Ci0gIGlmICgoYWZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAoYmZsYWdzICYgQlNGX0ZVTkNUSU9OKSkKLSAgICB7Ci0gICAgICBpZiAoKGFmbGFncyAmIEJTRl9GVU5DVElPTikgIT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDE7Ci0gICAgfQotICBpZiAoKGFmbGFncyAmIEJTRl9MT0NBTCkgIT0gKGJmbGFncyAmIEJTRl9MT0NBTCkpCi0gICAgewotICAgICAgaWYgKChhZmxhZ3MgJiBCU0ZfTE9DQUwpICE9IDApCi0JcmV0dXJuIDE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgaWYgKChhZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAoYmZsYWdzICYgQlNGX0dMT0JBTCkpCi0gICAgewotICAgICAgaWYgKChhZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwKQotCXJldHVybiAtMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgLyogU3ltYm9scyB0aGF0IHN0YXJ0IHdpdGggJy4nIG1pZ2h0IGJlIHNlY3Rpb24gbmFtZXMsIHNvIHNvcnQgdGhlbQotICAgICBhZnRlciBzeW1ib2xzIHRoYXQgZG9uJ3Qgc3RhcnQgd2l0aCAnLicuICAqLwotICBpZiAoYW5bMF0gPT0gJy4nICYmIGJuWzBdICE9ICcuJykKLSAgICByZXR1cm4gMTsKLSAgaWYgKGFuWzBdICE9ICcuJyAmJiBiblswXSA9PSAnLicpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIEZpbmFsbHksIGlmIHdlIGNhbid0IGRpc3Rpbmd1aXNoIHRoZW0gaW4gYW55IG90aGVyIHdheSwgdHJ5IHRvCi0gICAgIGdldCBjb25zaXN0ZW50IHJlc3VsdHMgYnkgc29ydGluZyB0aGUgc3ltYm9scyBieSBuYW1lLiAgKi8KLSAgcmV0dXJuIHN0cmNtcCAoYW4sIGJuKTsKLX0KLQotLyogU29ydCByZWxvY3MgaW50byBhZGRyZXNzIG9yZGVyLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9yZWxvY3MgKGFwLCBicCkKLSAgICAgY29uc3QgUFRSIGFwOwotICAgICBjb25zdCBQVFIgYnA7Ci17Ci0gIGNvbnN0IGFyZWxlbnQgKmEgPSAqKGNvbnN0IGFyZWxlbnQgKiopYXA7Ci0gIGNvbnN0IGFyZWxlbnQgKmIgPSAqKGNvbnN0IGFyZWxlbnQgKiopYnA7Ci0KLSAgaWYgKGEtPmFkZHJlc3MgPiBiLT5hZGRyZXNzKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChhLT5hZGRyZXNzIDwgYi0+YWRkcmVzcykKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogU28gdGhhdCBhc3NvY2lhdGVkIHJlbG9jYXRpb25zIHRpZWQgdG8gdGhlIHNhbWUgYWRkcmVzcyBzaG93IHVwCi0gICAgIGluIHRoZSBjb3JyZWN0IG9yZGVyLCB3ZSBkb24ndCBkbyBhbnkgZnVydGhlciBzb3J0aW5nLiAgKi8KLSAgaWYgKGEgPiBiKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChhIDwgYikKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogUHJpbnQgVk1BIHRvIFNUUkVBTS4gIElmIFNLSVBfWkVST0VTIGlzIHRydWUsIG9taXQgbGVhZGluZyB6ZXJvZXMuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF92YWx1ZSAodm1hLCBpbmZvLCBza2lwX3plcm9lcykKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBib29sZWFuIHNraXBfemVyb2VzOwotewotICBjaGFyIGJ1ZlszMF07Ci0gIGNoYXIgKnA7Ci0KLSAgc3ByaW50Zl92bWEgKGJ1Ziwgdm1hKTsKLSAgaWYgKCEgc2tpcF96ZXJvZXMpCi0gICAgcCA9IGJ1ZjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAocCA9IGJ1ZjsgKnAgPT0gJzAnOyArK3ApCi0JOwotICAgICAgaWYgKCpwID09ICdcMCcpCi0JLS1wOwotICAgIH0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHApOwotfQotCi0vKiBQcmludCB0aGUgbmFtZSBvZiBhIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X3N5bW5hbWUgKGFiZmQsIGluZm8sIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICBjaGFyICphbGxvYzsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY29uc3QgY2hhciAqcHJpbnQ7Ci0KLSAgYWxsb2MgPSBOVUxMOwotICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKTsKLSAgaWYgKCEgZG9fZGVtYW5nbGUgfHwgbmFtZVswXSA9PSAnXDAnKQotICAgIHByaW50ID0gbmFtZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIERlbWFuZ2xlIHRoZSBuYW1lLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09IG5hbWVbMF0pCi0JKytuYW1lOwotCi0gICAgICBhbGxvYyA9IGNwbHVzX2RlbWFuZ2xlIChuYW1lLCBETUdMX0FOU0kgfCBETUdMX1BBUkFNUyk7Ci0gICAgICBpZiAoYWxsb2MgPT0gTlVMTCkKLQlwcmludCA9IG5hbWU7Ci0gICAgICBlbHNlCi0JcHJpbnQgPSBhbGxvYzsKLSAgICB9Ci0KLSAgaWYgKGluZm8gIT0gTlVMTCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcHJpbnQpOwotICBlbHNlCi0gICAgcHJpbnRmICgiJXMiLCBwcmludCk7Ci0KLSAgaWYgKGFsbG9jICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2MpOwotfQotCi0vKiBMb2NhdGUgYSBzeW1ib2wgZ2l2ZW4gYSBiZmQsIGEgc2VjdGlvbiwgYW5kIGEgVk1BLiAgSWYgUkVRVUlSRV9TRUMKLSAgIGlzIHRydWUsIHRoZW4gYWx3YXlzIHJlcXVpcmUgdGhlIHN5bWJvbCB0byBiZSBpbiB0aGUgc2VjdGlvbi4gIFRoaXMKLSAgIHJldHVybnMgTlVMTCBpZiB0aGVyZSBpcyBubyBzdWl0YWJsZSBzeW1ib2wuICBJZiBQTEFDRSBpcyBub3QgTlVMTCwKLSAgIHRoZW4gKlBMQUNFIGlzIHNldCB0byB0aGUgaW5kZXggb2YgdGhlIHN5bWJvbCBpbiBzb3J0ZWRfc3ltcy4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLWZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzIChhYmZkLCBzZWMsIHZtYSwgcmVxdWlyZV9zZWMsIHBsYWNlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBib29sZWFuIHJlcXVpcmVfc2VjOwotICAgICBsb25nICpwbGFjZTsKLXsKLSAgLyogQEAgV291bGQgaXQgc3BlZWQgdGhpbmdzIHVwIHRvIGNhY2hlIHRoZSBsYXN0IHR3byBzeW1ib2xzIHJldHVybmVkLAotICAgICBhbmQgbWF5YmUgdGhlaXIgYWRkcmVzcyByYW5nZXM/ICBGb3IgbWFueSBwcm9jZXNzb3JzLCBvbmx5IG9uZSBtZW1vcnkKLSAgICAgb3BlcmFuZCBjYW4gYmUgcHJlc2VudCBhdCBhIHRpbWUsIHNvIHRoZSAyLWVudHJ5IGNhY2hlIHdvdWxkbid0IGJlCi0gICAgIGNvbnN0YW50bHkgY2h1cm5lZCBieSBjb2RlIGRvaW5nIGhlYXZ5IG1lbW9yeSBhY2Nlc3Nlcy4gICovCi0KLSAgLyogSW5kaWNlcyBpbiBgc29ydGVkX3N5bXMnLiAgKi8KLSAgbG9uZyBtaW4gPSAwOwotICBsb25nIG1heCA9IHNvcnRlZF9zeW1jb3VudDsKLSAgbG9uZyB0aGlzcGxhY2U7Ci0KLSAgaWYgKHNvcnRlZF9zeW1jb3VudCA8IDEpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogUGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggbG9va2luZyBmb3IgdGhlIGNsb3Nlc3Qgc3ltYm9sIHRvIHRoZQotICAgICByZXF1aXJlZCB2YWx1ZS4gIFdlIGFyZSBzZWFyY2hpbmcgdGhlIHJhbmdlIChtaW4sIG1heF0uICAqLwotICB3aGlsZSAobWluICsgMSA8IG1heCkKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0KLSAgICAgIHRoaXNwbGFjZSA9IChtYXggKyBtaW4pIC8gMjsKLSAgICAgIHN5bSA9IHNvcnRlZF9zeW1zW3RoaXNwbGFjZV07Ci0KLSAgICAgIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA+IHZtYSkKLQltYXggPSB0aGlzcGxhY2U7Ci0gICAgICBlbHNlIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA8IHZtYSkKLQltaW4gPSB0aGlzcGxhY2U7Ci0gICAgICBlbHNlCi0JewotCSAgbWluID0gdGhpc3BsYWNlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgc3ltYm9sIHdlIHdhbnQgaXMgbm93IGluIG1pbiwgdGhlIGxvdyBlbmQgb2YgdGhlIHJhbmdlIHdlCi0gICAgIHdlcmUgc2VhcmNoaW5nLiAgSWYgdGhlcmUgYXJlIHNldmVyYWwgc3ltYm9scyB3aXRoIHRoZSBzYW1lCi0gICAgIHZhbHVlLCB3ZSB3YW50IHRoZSBmaXJzdCBvbmUuICAqLwotICB0aGlzcGxhY2UgPSBtaW47Ci0gIHdoaWxlICh0aGlzcGxhY2UgPiAwCi0JICYmIChiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbdGhpc3BsYWNlXSkKLQkgICAgID09IGJmZF9hc3ltYm9sX3ZhbHVlIChzb3J0ZWRfc3ltc1t0aGlzcGxhY2UgLSAxXSkpKQotICAgIC0tdGhpc3BsYWNlOwotCi0gIC8qIElmIHRoZSBmaWxlIGlzIHJlbG9jYXRlYWJsZSwgYW5kIHRoZSBzeW1ib2wgY291bGQgYmUgZnJvbSB0aGlzCi0gICAgIHNlY3Rpb24sIHByZWZlciBhIHN5bWJvbCBmcm9tIHRoaXMgc2VjdGlvbiBvdmVyIHN5bWJvbHMgZnJvbQotICAgICBvdGhlcnMsIGV2ZW4gaWYgdGhlIG90aGVyIHN5bWJvbCdzIHZhbHVlIG1pZ2h0IGJlIGNsb3Nlci4KLSAgICAgICAKLSAgICAgTm90ZSB0aGF0IHRoaXMgbWF5IGJlIHdyb25nIGZvciBzb21lIHN5bWJvbCByZWZlcmVuY2VzIGlmIHRoZQotICAgICBzZWN0aW9ucyBoYXZlIG92ZXJsYXBwaW5nIG1lbW9yeSByYW5nZXMsIGJ1dCBpbiB0aGF0IGNhc2UgdGhlcmUncwotICAgICBubyB3YXkgdG8gdGVsbCB3aGF0J3MgZGVzaXJlZCB3aXRob3V0IGxvb2tpbmcgYXQgdGhlIHJlbG9jYXRpb24KLSAgICAgdGFibGUuICAqLwotCi0gIGlmIChzb3J0ZWRfc3ltc1t0aGlzcGxhY2VdLT5zZWN0aW9uICE9IHNlYwotICAgICAgJiYgKHJlcXVpcmVfc2VjCi0JICB8fCAoKGFiZmQtPmZsYWdzICYgSEFTX1JFTE9DKSAhPSAwCi0JICAgICAgJiYgdm1hID49IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykKLQkgICAgICAmJiB2bWEgPCAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCQkJKyBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpKSkpKQotICAgIHsKLSAgICAgIGxvbmcgaTsKLQotICAgICAgZm9yIChpID0gdGhpc3BsYWNlICsgMTsgaSA8IHNvcnRlZF9zeW1jb3VudDsgaSsrKQotCXsKLQkgIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbaV0pCi0JICAgICAgIT0gYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW3RoaXNwbGFjZV0pKQotCSAgICBicmVhazsKLQl9Ci0gICAgICAtLWk7Ci0gICAgICBmb3IgKDsgaSA+PSAwOyBpLS0pCi0JewotCSAgaWYgKHNvcnRlZF9zeW1zW2ldLT5zZWN0aW9uID09IHNlYwotCSAgICAgICYmIChpID09IDAKLQkJICB8fCBzb3J0ZWRfc3ltc1tpIC0gMV0tPnNlY3Rpb24gIT0gc2VjCi0JCSAgfHwgKGJmZF9hc3ltYm9sX3ZhbHVlIChzb3J0ZWRfc3ltc1tpXSkKLQkJICAgICAgIT0gYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW2kgLSAxXSkpKSkKLQkgICAgewotCSAgICAgIHRoaXNwbGFjZSA9IGk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChzb3J0ZWRfc3ltc1t0aGlzcGxhY2VdLT5zZWN0aW9uICE9IHNlYykKLQl7Ci0JICAvKiBXZSBkaWRuJ3QgZmluZCBhIGdvb2Qgc3ltYm9sIHdpdGggYSBzbWFsbGVyIHZhbHVlLgotCSAgICAgTG9vayBmb3Igb25lIHdpdGggYSBsYXJnZXIgdmFsdWUuICAqLwotCSAgZm9yIChpID0gdGhpc3BsYWNlICsgMTsgaSA8IHNvcnRlZF9zeW1jb3VudDsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKHNvcnRlZF9zeW1zW2ldLT5zZWN0aW9uID09IHNlYykKLQkJewotCQkgIHRoaXNwbGFjZSA9IGk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKHNvcnRlZF9zeW1zW3RoaXNwbGFjZV0tPnNlY3Rpb24gIT0gc2VjCi0JICAmJiAocmVxdWlyZV9zZWMKLQkgICAgICB8fCAoKGFiZmQtPmZsYWdzICYgSEFTX1JFTE9DKSAhPSAwCi0JCSAgJiYgdm1hID49IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykKLQkJICAmJiB2bWEgPCAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCQkJICAgICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKSkpKSkKLQl7Ci0JICAvKiBUaGVyZSBpcyBubyBzdWl0YWJsZSBzeW1ib2wuICAqLwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgIH0KLQotICBpZiAocGxhY2UgIT0gTlVMTCkKLSAgICAqcGxhY2UgPSB0aGlzcGxhY2U7Ci0KLSAgcmV0dXJuIHNvcnRlZF9zeW1zW3RoaXNwbGFjZV07Ci19Ci0KLS8qIFByaW50IGFuIGFkZHJlc3MgdG8gSU5GTyBzeW1ib2xpY2FsbHkuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltIChhYmZkLCBzZWMsIHN5bSwgdm1hLCBpbmZvLCBza2lwX3plcm9lcykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiBza2lwX3plcm9lczsKLXsKLSAgb2JqZHVtcF9wcmludF92YWx1ZSAodm1hLCBpbmZvLCBza2lwX3plcm9lcyk7Ci0KLSAgaWYgKHN5bSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF92bWEgc2VjYWRkcjsKLQotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgPCVzIiwKLQkJCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOwotICAgICAgc2VjYWRkciA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYyk7Ci0gICAgICBpZiAodm1hIDwgc2VjYWRkcikKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0weCIpOwotCSAgb2JqZHVtcF9wcmludF92YWx1ZSAoc2VjYWRkciAtIHZtYSwgaW5mbywgdHJ1ZSk7Ci0JfQotICAgICAgZWxzZSBpZiAodm1hID4gc2VjYWRkcikKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIisweCIpOwotCSAgb2JqZHVtcF9wcmludF92YWx1ZSAodm1hIC0gc2VjYWRkciwgaW5mbywgdHJ1ZSk7Ci0JfQotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI+Iik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgPCIpOwotICAgICAgb2JqZHVtcF9wcmludF9zeW1uYW1lIChhYmZkLCBpbmZvLCBzeW0pOwotICAgICAgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pID4gdm1hKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLTB4Iik7Ci0JICBvYmpkdW1wX3ByaW50X3ZhbHVlIChiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSAtIHZtYSwgaW5mbywgdHJ1ZSk7Ci0JfQotICAgICAgZWxzZSBpZiAodm1hID4gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIrMHgiKTsKLQkgIG9iamR1bXBfcHJpbnRfdmFsdWUgKHZtYSAtIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pLCBpbmZvLCB0cnVlKTsKLQl9Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIj4iKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IFZNQSB0byBJTkZPLCBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICBJZiBTS0lQX1pFUk9FUyBpcwotICAgdHJ1ZSwgZG9uJ3Qgb3V0cHV0IGxlYWRpbmcgemVyb2VzLiAgKi8KLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfYWRkciAodm1hLCBpbmZvLCBza2lwX3plcm9lcykKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBib29sZWFuIHNraXBfemVyb2VzOwotewotICBzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyAqYXV4OwotICBhc3ltYm9sICpzeW07Ci0KLSAgaWYgKHNvcnRlZF9zeW1jb3VudCA8IDEpCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCIpOwotICAgICAgb2JqZHVtcF9wcmludF92YWx1ZSAodm1hLCBpbmZvLCBza2lwX3plcm9lcyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGF1eCA9IChzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyAqKSBpbmZvLT5hcHBsaWNhdGlvbl9kYXRhOwotICBzeW0gPSBmaW5kX3N5bWJvbF9mb3JfYWRkcmVzcyAoYXV4LT5hYmZkLCBhdXgtPnNlYywgdm1hLCBhdXgtPnJlcXVpcmVfc2VjLAotCQkJCSAobG9uZyAqKSBOVUxMKTsKLSAgb2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltIChhdXgtPmFiZmQsIGF1eC0+c2VjLCBzeW0sIHZtYSwgaW5mbywKLQkJCSAgICAgICBza2lwX3plcm9lcyk7Ci19Ci0KLS8qIFByaW50IFZNQSB0byBJTkZPLiAgVGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gdGhlIGRpc2Fzc2VtYmxlcgotICAgcm91dGluZS4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X2FkZHJlc3MgKHZtYSwgaW5mbykKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBvYmpkdW1wX3ByaW50X2FkZHIgKHZtYSwgaW5mbywgISBwcmVmaXhfYWRkcmVzc2VzKTsKLX0KLQotLyogRGV0ZXJtaW5lIG9mIHRoZSBnaXZlbiBhZGRyZXNzIGhhcyBhIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggaXQuICAqLwotCi1zdGF0aWMgaW50Ci1vYmpkdW1wX3N5bWJvbF9hdF9hZGRyZXNzICh2bWEsIGluZm8pCi0gICAgIGJmZF92bWEgdm1hOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Ci17Ci0gIHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvICogYXV4OwotICBhc3ltYm9sICogc3ltOwotCi0gIC8qIE5vIHN5bWJvbHMgLSBkbyBub3QgYm90aGVyIGNoZWNraW5nLiAgKi8KLSAgaWYgKHNvcnRlZF9zeW1jb3VudCA8IDEpCi0gICAgcmV0dXJuIDA7Ci0KLSAgYXV4ID0gKHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvICopIGluZm8tPmFwcGxpY2F0aW9uX2RhdGE7Ci0gIHN5bSA9IGZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzIChhdXgtPmFiZmQsIGF1eC0+c2VjLCB2bWEsIGF1eC0+cmVxdWlyZV9zZWMsCi0JCQkJIChsb25nICopIE5VTEwpOwotCi0gIHJldHVybiAoc3ltICE9IE5VTEwgJiYgKGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pID09IHZtYSkpOwotfQotCi0vKiBIb2xkIHRoZSBsYXN0IGZ1bmN0aW9uIG5hbWUgYW5kIHRoZSBsYXN0IGxpbmUgbnVtYmVyIHdlIGRpc3BsYXllZAotICAgaW4gYSBkaXNhc3NlbWJseS4gICovCi0KLXN0YXRpYyBjaGFyICpwcmV2X2Z1bmN0aW9ubmFtZTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcHJldl9saW5lOwotCi0vKiBXZSBrZWVwIGEgbGlzdCBvZiBhbGwgZmlsZXMgdGhhdCB3ZSBoYXZlIHNlZW4gd2hlbiBkb2luZyBhCi0gICBkaXNzYXNzZW1ibHkgd2l0aCBzb3VyY2UsIHNvIHRoYXQgd2Uga25vdyBob3cgbXVjaCBvZiB0aGUgZmlsZSB0bwotICAgZGlzcGxheS4gIFRoaXMgY2FuIGJlIGltcG9ydGFudCBmb3IgaW5saW5lZCBmdW5jdGlvbnMuICAqLwotCi1zdHJ1Y3QgcHJpbnRfZmlsZV9saXN0Ci17Ci0gIHN0cnVjdCBwcmludF9maWxlX2xpc3QgKm5leHQ7Ci0gIGNoYXIgKmZpbGVuYW1lOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgRklMRSAqZjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0ICpwcmludF9maWxlczsKLQotLyogVGhlIG51bWJlciBvZiBwcmVjZWRpbmcgY29udGV4dCBsaW5lcyB0byBzaG93IHdoZW4gd2Ugc3RhcnQKLSAgIGRpc3BsYXlpbmcgYSBmaWxlIGZvciB0aGUgZmlyc3QgdGltZS4gICovCi0KLSNkZWZpbmUgU0hPV19QUkVDRURJTkdfQ09OVEVYVF9MSU5FUyAoNSkKLQotLyogU2tpcCBhaGVhZCB0byBhIGdpdmVuIGxpbmUgaW4gYSBmaWxlLCBvcHRpb25hbGx5IHByaW50aW5nIGVhY2gKLSAgIGxpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotc2tpcF90b19saW5lIFBBUkFNUyAoKHN0cnVjdCBwcmludF9maWxlX2xpc3QgKiwgdW5zaWduZWQgaW50LCBib29sZWFuKSk7Ci0KLXN0YXRpYyB2b2lkCi1za2lwX3RvX2xpbmUgKHAsIGxpbmUsIHNob3cpCi0gICAgIHN0cnVjdCBwcmludF9maWxlX2xpc3QgKnA7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICBib29sZWFuIHNob3c7Ci17Ci0gIHdoaWxlIChwLT5saW5lIDwgbGluZSkKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZlsxMDBdOwotCi0gICAgICBpZiAoZmdldHMgKGJ1Ziwgc2l6ZW9mIGJ1ZiwgcC0+ZikgPT0gTlVMTCkKLQl7Ci0JICBmY2xvc2UgKHAtPmYpOwotCSAgcC0+ZiA9IE5VTEw7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChzaG93KQotCXByaW50ZiAoIiVzIiwgYnVmKTsKLQotICAgICAgaWYgKHN0cmNociAoYnVmLCAnXG4nKSAhPSBOVUxMKQotCSsrcC0+bGluZTsKLSAgICB9Ci19ICAKLQotLyogU2hvdyB0aGUgbGluZSBudW1iZXIsIG9yIHRoZSBzb3VyY2UgbGluZSwgaW4gYSBkaXNzYXNzZW1ibHkKLSAgIGxpc3RpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotc2hvd19saW5lIChhYmZkLCBzZWN0aW9uLCBvZmYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgb2ZmOwotewotICBDT05TVCBjaGFyICpmaWxlbmFtZTsKLSAgQ09OU1QgY2hhciAqZnVuY3Rpb25uYW1lOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLQotICBpZiAoISB3aXRoX2xpbmVfbnVtYmVycyAmJiAhIHdpdGhfc291cmNlX2NvZGUpCi0gICAgcmV0dXJuOwotCi0gIGlmICghIGJmZF9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltcywgb2ZmLCAmZmlsZW5hbWUsCi0JCQkgICAgICAgJmZ1bmN0aW9ubmFtZSwgJmxpbmUpKQotICAgIHJldHVybjsKLQotICBpZiAoZmlsZW5hbWUgIT0gTlVMTCAmJiAqZmlsZW5hbWUgPT0gJ1wwJykKLSAgICBmaWxlbmFtZSA9IE5VTEw7Ci0gIGlmIChmdW5jdGlvbm5hbWUgIT0gTlVMTCAmJiAqZnVuY3Rpb25uYW1lID09ICdcMCcpCi0gICAgZnVuY3Rpb25uYW1lID0gTlVMTDsKLQotICBpZiAod2l0aF9saW5lX251bWJlcnMpCi0gICAgewotICAgICAgaWYgKGZ1bmN0aW9ubmFtZSAhPSBOVUxMCi0JICAmJiAocHJldl9mdW5jdGlvbm5hbWUgPT0gTlVMTAotCSAgICAgIHx8IHN0cmNtcCAoZnVuY3Rpb25uYW1lLCBwcmV2X2Z1bmN0aW9ubmFtZSkgIT0gMCkpCi0JcHJpbnRmICgiJXMoKTpcbiIsIGZ1bmN0aW9ubmFtZSk7Ci0gICAgICBpZiAobGluZSA+IDAgJiYgbGluZSAhPSBwcmV2X2xpbmUpCi0JcHJpbnRmICgiJXM6JXVcbiIsIGZpbGVuYW1lID09IE5VTEwgPyAiPz8/IiA6IGZpbGVuYW1lLCBsaW5lKTsKLSAgICB9Ci0KLSAgaWYgKHdpdGhfc291cmNlX2NvZGUKLSAgICAgICYmIGZpbGVuYW1lICE9IE5VTEwKLSAgICAgICYmIGxpbmUgPiAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBwcmludF9maWxlX2xpc3QgKipwcCwgKnA7Ci0KLSAgICAgIGZvciAocHAgPSAmcHJpbnRfZmlsZXM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLQlpZiAoc3RyY21wICgoKnBwKS0+ZmlsZW5hbWUsIGZpbGVuYW1lKSA9PSAwKQotCSAgYnJlYWs7Ci0gICAgICBwID0gKnBwOwotCi0gICAgICBpZiAocCAhPSBOVUxMKQotCXsKLQkgIGlmIChwICE9IHByaW50X2ZpbGVzKQotCSAgICB7Ci0JICAgICAgaW50IGw7Ci0KLQkgICAgICAvKiBXZSBoYXZlIHJlZW5jb3VudGVyZWQgYSBmaWxlIG5hbWUgd2hpY2ggd2Ugc2F3Ci0JCSBlYXJsaWVyLiAgVGhpcyBpbXBsaWVzIHRoYXQgZWl0aGVyIHdlIGFyZSBkdW1waW5nIG91dAotCQkgY29kZSBmcm9tIGFuIGluY2x1ZGVkIGZpbGUsIG9yIHRoZSBzYW1lIGZpbGUgd2FzCi0JCSBsaW5rZWQgaW4gbW9yZSB0aGFuIG9uY2UuICBUaGVyZSBhcmUgdHdvIGNvbW1vbiBjYXNlcwotCQkgb2YgYW4gaW5jbHVkZWQgZmlsZTogaW5saW5lIGZ1bmN0aW9ucyBpbiBhIGhlYWRlcgotCQkgZmlsZSwgYW5kIGEgYmlzb24gb3IgZmxleCBza2VsZXRvbiBmaWxlLiAgSW4gdGhlCi0JCSBmb3JtZXIgY2FzZSB3ZSB3YW50IHRvIGp1c3Qgc3RhcnQgcHJpbnRpbmcgKGJ1dCB3ZQotCQkgYmFjayB1cCBhIGZldyBsaW5lcyB0byBnaXZlIGNvbnRleHQpOyBpbiB0aGUgbGF0dGVyCi0JCSBjYXNlIHdlIHdhbnQgdG8gY29udGludWUgZnJvbSB3aGVyZSB3ZSBsZWZ0IG9mZi4gIEkKLQkJIGNhbid0IHRoaW5rIG9mIGEgZ29vZCB3YXkgdG8gZGlzdGluZ3Vpc2ggdGhlIGNhc2VzLAotCQkgc28gSSB1c2VkIGEgaGV1cmlzdGljIGJhc2VkIG9uIHRoZSBmaWxlIG5hbWUuICAqLwotCSAgICAgIGlmIChzdHJjbXAgKHAtPmZpbGVuYW1lICsgc3RybGVuIChwLT5maWxlbmFtZSkgLSAyLCAiLmgiKSAhPSAwKQotCQlsID0gcC0+bGluZTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBsID0gbGluZSAtIFNIT1dfUFJFQ0VESU5HX0NPTlRFWFRfTElORVM7Ci0JCSAgaWYgKGwgPD0gMCkKLQkJICAgIGwgPSAxOwotCQl9Ci0KLQkgICAgICBpZiAocC0+ZiA9PSBOVUxMKQotCQl7Ci0JCSAgcC0+ZiA9IGZvcGVuIChwLT5maWxlbmFtZSwgInIiKTsKLQkJICBwLT5saW5lID0gMDsKLQkJfQotCSAgICAgIGlmIChwLT5mICE9IE5VTEwpCi0JCXNraXBfdG9fbGluZSAocCwgbCwgZmFsc2UpOwotCi0JICAgICAgaWYgKHByaW50X2ZpbGVzLT5mICE9IE5VTEwpCi0JCXsKLQkJICBmY2xvc2UgKHByaW50X2ZpbGVzLT5mKTsKLQkJICBwcmludF9maWxlcy0+ZiA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAocC0+ZiAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2tpcF90b19saW5lIChwLCBsaW5lLCB0cnVlKTsKLQkgICAgICAqcHAgPSBwLT5uZXh0OwotCSAgICAgIHAtPm5leHQgPSBwcmludF9maWxlczsKLQkgICAgICBwcmludF9maWxlcyA9IHA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgRklMRSAqZjsKLQotCSAgZiA9IGZvcGVuIChmaWxlbmFtZSwgInIiKTsKLQkgIGlmIChmICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpbnQgbDsKLQotCSAgICAgIHAgPSAoKHN0cnVjdCBwcmludF9maWxlX2xpc3QgKikKLQkJICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0KSkpOwotCSAgICAgIHAtPmZpbGVuYW1lID0geG1hbGxvYyAoc3RybGVuIChmaWxlbmFtZSkgKyAxKTsKLQkgICAgICBzdHJjcHkgKHAtPmZpbGVuYW1lLCBmaWxlbmFtZSk7Ci0JICAgICAgcC0+bGluZSA9IDA7Ci0JICAgICAgcC0+ZiA9IGY7Ci0KLQkgICAgICBpZiAocHJpbnRfZmlsZXMgIT0gTlVMTCAmJiBwcmludF9maWxlcy0+ZiAhPSBOVUxMKQotCQl7Ci0JCSAgZmNsb3NlIChwcmludF9maWxlcy0+Zik7Ci0JCSAgcHJpbnRfZmlsZXMtPmYgPSBOVUxMOwotCQl9Ci0JICAgICAgcC0+bmV4dCA9IHByaW50X2ZpbGVzOwotCSAgICAgIHByaW50X2ZpbGVzID0gcDsKLQotCSAgICAgIGwgPSBsaW5lIC0gU0hPV19QUkVDRURJTkdfQ09OVEVYVF9MSU5FUzsKLQkgICAgICBpZiAobCA8PSAwKQotCQlsID0gMTsKLQkgICAgICBza2lwX3RvX2xpbmUgKHAsIGwsIGZhbHNlKTsKLQkgICAgICBpZiAocC0+ZiAhPSBOVUxMKQotCQlza2lwX3RvX2xpbmUgKHAsIGxpbmUsIHRydWUpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwKLSAgICAgICYmIChwcmV2X2Z1bmN0aW9ubmFtZSA9PSBOVUxMCi0JICB8fCBzdHJjbXAgKGZ1bmN0aW9ubmFtZSwgcHJldl9mdW5jdGlvbm5hbWUpICE9IDApKQotICAgIHsKLSAgICAgIGlmIChwcmV2X2Z1bmN0aW9ubmFtZSAhPSBOVUxMKQotCWZyZWUgKHByZXZfZnVuY3Rpb25uYW1lKTsKLSAgICAgIHByZXZfZnVuY3Rpb25uYW1lID0geG1hbGxvYyAoc3RybGVuIChmdW5jdGlvbm5hbWUpICsgMSk7Ci0gICAgICBzdHJjcHkgKHByZXZfZnVuY3Rpb25uYW1lLCBmdW5jdGlvbm5hbWUpOwotICAgIH0KLQotICBpZiAobGluZSA+IDAgJiYgbGluZSAhPSBwcmV2X2xpbmUpCi0gICAgcHJldl9saW5lID0gbGluZTsKLX0KLQotLyogUHNldWRvIEZJTEUgb2JqZWN0IGZvciBzdHJpbmdzLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNoYXIgKmJ1ZmZlcjsKLSAgc2l6ZV90IHNpemU7Ci0gIGNoYXIgKmN1cnJlbnQ7Ci19IFNGSUxFOwotCi0vKiBzcHJpbnRmIHRvIGEgInN0cmVhbSIgKi8KLQotc3RhdGljIGludAotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotb2JqZHVtcF9zcHJpbnRmIChTRklMRSAqZiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0jZWxzZQotb2JqZHVtcF9zcHJpbnRmICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSNpZm5kZWYgQU5TSV9QUk9UT1RZUEVTCi0gIFNGSUxFICpmOwotICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0jZW5kaWYKLSAgY2hhciAqYnVmOwotICB2YV9saXN0IGFyZ3M7Ci0gIHNpemVfdCBuOwotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBmID0gdmFfYXJnIChhcmdzLCBTRklMRSAqKTsKLSAgZm9ybWF0ID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopOwotI2VuZGlmCi0KLSAgdmFzcHJpbnRmICgmYnVmLCBmb3JtYXQsIGFyZ3MpOwotCi0gIHZhX2VuZCAoYXJncyk7Ci0KLSAgaWYgKGJ1ZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiT3V0IG9mIHZpcnR1YWwgbWVtb3J5XG4iKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgbiA9IHN0cmxlbiAoYnVmKTsKLQotICB3aGlsZSAoKGYtPmJ1ZmZlciArIGYtPnNpemUpIC0gZi0+Y3VycmVudCA8IG4gKyAxKQotICAgIHsKLSAgICAgIHNpemVfdCBjdXJyb2ZmOwotCi0gICAgICBjdXJyb2ZmID0gZi0+Y3VycmVudCAtIGYtPmJ1ZmZlcjsKLSAgICAgIGYtPnNpemUgKj0gMjsKLSAgICAgIGYtPmJ1ZmZlciA9IHhyZWFsbG9jIChmLT5idWZmZXIsIGYtPnNpemUpOwotICAgICAgZi0+Y3VycmVudCA9IGYtPmJ1ZmZlciArIGN1cnJvZmY7Ci0gICAgfQotCi0gIG1lbWNweSAoZi0+Y3VycmVudCwgYnVmLCBuKTsKLSAgZi0+Y3VycmVudCArPSBuOwotICBmLT5jdXJyZW50WzBdID0gJ1wwJzsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiBuOwotfQotCi0vKiBUaGUgbnVtYmVyIG9mIHplcm9lcyB3ZSB3YW50IHRvIHNlZSBiZWZvcmUgd2Ugc3RhcnQgc2tpcHBpbmcgdGhlbS4KLSAgIFRoZSBudW1iZXIgaXMgYXJiaXRyYXJpbHkgY2hvc2VuLiAgKi8KLQotI2RlZmluZSBTS0lQX1pFUk9FUyAoOCkKLQotLyogVGhlIG51bWJlciBvZiB6ZXJvZXMgdG8gc2tpcCBhdCB0aGUgZW5kIG9mIGEgc2VjdGlvbi4gIElmIHRoZQotICAgbnVtYmVyIG9mIHplcm9lcyBhdCB0aGUgZW5kIGlzIGJldHdlZW4gU0tJUF9aRVJPRVNfQVRfRU5EIGFuZAotICAgU0tJUF9aRVJPRVMsIHRoZXkgd2lsbCBiZSBkaXNhc3NlbWJsZWQuICBJZiB0aGVyZSBhcmUgZmV3ZXIgdGhhbgotICAgU0tJUF9aRVJPRVNfQVRfRU5ELCB0aGV5IHdpbGwgYmUgc2tpcHBlZC4gIFRoaXMgaXMgYSBoZXVyaXN0aWMKLSAgIGF0dGVtcHQgdG8gYXZvaWQgZGlzYXNzZW1ibGluZyB6ZXJvZXMgaW5zZXJ0ZWQgYnkgc2VjdGlvbgotICAgYWxpZ25tZW50LiAgKi8KLQotI2RlZmluZSBTS0lQX1pFUk9FU19BVF9FTkQgKDMpCi0KLS8qIERpc2Fzc2VtYmxlIHNvbWUgZGF0YSBpbiBtZW1vcnkgYmV0d2VlbiBnaXZlbiB2YWx1ZXMuICAqLwotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGVfYnl0ZXMgKGluZm8sIGRpc2Fzc2VtYmxlX2ZuLCBpbnNucywgZGF0YSwgc3RhcnQsIHN0b3AsIHJlbHBwcCwKLQkJICAgcmVscHBlbmQpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBkaXNhc3NlbWJsZXJfZnR5cGUgZGlzYXNzZW1ibGVfZm47Ci0gICAgIGJvb2xlYW4gaW5zbnM7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBiZmRfdm1hIHN0YXJ0OwotICAgICBiZmRfdm1hIHN0b3A7Ci0gICAgIGFyZWxlbnQgKioqcmVscHBwOwotICAgICBhcmVsZW50ICoqcmVscHBlbmQ7Ci17Ci0gIHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvICphdXg7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBpbnQgYnl0ZXNfcGVyX2xpbmU7Ci0gIGJvb2xlYW4gZG9uZV9kb3Q7Ci0gIGludCBza2lwX2FkZHJfY2hhcnM7Ci0gIGJmZF92bWEgaTsKLQotICBhdXggPSAoc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gKikgaW5mby0+YXBwbGljYXRpb25fZGF0YTsKLSAgc2VjdGlvbiA9IGF1eC0+c2VjOwotCi0gIGlmIChpbnNucykKLSAgICBieXRlc19wZXJfbGluZSA9IDQ7Ci0gIGVsc2UKLSAgICBieXRlc19wZXJfbGluZSA9IDE2OwotCi0gIC8qIEZpZ3VyZSBvdXQgaG93IG1hbnkgY2hhcmFjdGVycyB0byBza2lwIGF0IHRoZSBzdGFydCBvZiBhbgotICAgICBhZGRyZXNzLCB0byBtYWtlIHRoZSBkaXNhc3NlbWJseSBsb29rIG5pY2VyLiAgV2UgZGlzY2FyZCBsZWFkaW5nCi0gICAgIHplcm9lcyBpbiBjaHVua3Mgb2YgNCwgZW5zdXJpbmcgdGhhdCB0aGVyZSBpcyBhbHdheXMgYSBsZWFkaW5nCi0gICAgIHplcm8gcmVtYWluaW5nLiAgKi8KLSAgc2tpcF9hZGRyX2NoYXJzID0gMDsKLSAgaWYgKCEgcHJlZml4X2FkZHJlc3NlcykKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZlszMF07Ci0gICAgICBjaGFyICpzOwotCi0gICAgICBzcHJpbnRmX3ZtYSAoYnVmLAotCQkgICBzZWN0aW9uLT52bWEgKyBiZmRfc2VjdGlvbl9zaXplIChzZWN0aW9uLT5vd25lciwgc2VjdGlvbikpOwotICAgICAgcyA9IGJ1ZjsKLSAgICAgIHdoaWxlIChzWzBdID09ICcwJyAmJiBzWzFdID09ICcwJyAmJiBzWzJdID09ICcwJyAmJiBzWzNdID09ICcwJwotCSAgICAgJiYgc1s0XSA9PSAnMCcpCi0JewotCSAgc2tpcF9hZGRyX2NoYXJzICs9IDQ7Ci0JICBzICs9IDQ7Ci0JfQotICAgIH0KLQotICBpbmZvLT5pbnNuX2luZm9fdmFsaWQgPSAwOwotCi0gIGRvbmVfZG90ID0gZmFsc2U7Ci0gIGkgPSBzdGFydDsKLSAgd2hpbGUgKGkgPCBzdG9wKQotICAgIHsKLSAgICAgIGJmZF92bWEgejsKLSAgICAgIGludCBieXRlcyA9IDA7Ci0gICAgICBib29sZWFuIG5lZWRfbmwgPSBmYWxzZTsKLQotICAgICAgLyogSWYgd2Ugc2VlIG1vcmUgdGhhbiBTS0lQX1pFUk9FUyBieXRlcyBvZiB6ZXJvZXMsIHdlIGp1c3QKLSAgICAgICAgIHByaW50IGAuLi4nLiAgKi8KLSAgICAgIGZvciAoeiA9IGk7IHogPCBzdG9wOyB6KyspCi0JaWYgKGRhdGFbel0gIT0gMCkKLQkgIGJyZWFrOwotICAgICAgaWYgKCEgZGlzYXNzZW1ibGVfemVyb2VzCi0JICAmJiAoaW5mby0+aW5zbl9pbmZvX3ZhbGlkID09IDAKLQkgICAgICB8fCBpbmZvLT5icmFuY2hfZGVsYXlfaW5zbnMgPT0gMCkKLQkgICYmICh6IC0gaSA+PSBTS0lQX1pFUk9FUwotCSAgICAgIHx8ICh6ID09IHN0b3AgJiYgeiAtIGkgPCBTS0lQX1pFUk9FU19BVF9FTkQpKSkKLQl7Ci0JICBwcmludGYgKCJcdC4uLlxuIik7Ci0KLQkgIC8qIElmIHRoZXJlIGFyZSBtb3JlIG5vbnplcm8gYnl0ZXMgdG8gZm9sbG93LCB3ZSBvbmx5IHNraXAKLSAgICAgICAgICAgICB6ZXJvZXMgaW4gbXVsdGlwbGVzIG9mIDQsIHRvIHRyeSB0byBhdm9pZCBydW5uaW5nIG92ZXIKLSAgICAgICAgICAgICB0aGUgc3RhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggaGFwcGVucyB0byBzdGFydCB3aXRoCi0gICAgICAgICAgICAgemVyby4gICovCi0JICBpZiAoeiAhPSBzdG9wKQotCSAgICB6ID0gaSArICgoeiAtIGkpICZ+IDMpOwotCi0JICBieXRlcyA9IHogLSBpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyIGJ1Zls1MF07Ci0JICBTRklMRSBzZmlsZTsKLQkgIGludCBicGMgPSAwOwotCSAgaW50IHBiID0gMDsKLQotCSAgZG9uZV9kb3QgPSBmYWxzZTsKLQotCSAgaWYgKHdpdGhfbGluZV9udW1iZXJzIHx8IHdpdGhfc291cmNlX2NvZGUpCi0JICAgIHNob3dfbGluZSAoYXV4LT5hYmZkLCBzZWN0aW9uLCBpKTsKLQotCSAgaWYgKCEgcHJlZml4X2FkZHJlc3NlcykKLQkgICAgewotCSAgICAgIGNoYXIgKnM7Ci0KLQkgICAgICBzcHJpbnRmX3ZtYSAoYnVmLCBzZWN0aW9uLT52bWEgKyBpKTsKLQkgICAgICBmb3IgKHMgPSBidWYgKyBza2lwX2FkZHJfY2hhcnM7ICpzID09ICcwJzsgcysrKQotCQkqcyA9ICcgJzsKLQkgICAgICBpZiAoKnMgPT0gJ1wwJykKLQkJKi0tcyA9ICcwJzsKLQkgICAgICBwcmludGYgKCIlczpcdCIsIGJ1ZiArIHNraXBfYWRkcl9jaGFycyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGF1eC0+cmVxdWlyZV9zZWMgPSB0cnVlOwotCSAgICAgIG9iamR1bXBfcHJpbnRfYWRkcmVzcyAoc2VjdGlvbi0+dm1hICsgaSwgaW5mbyk7Ci0JICAgICAgYXV4LT5yZXF1aXJlX3NlYyA9IGZhbHNlOwotCSAgICAgIHB1dGNoYXIgKCcgJyk7Ci0JICAgIH0KLQotCSAgaWYgKGluc25zKQotCSAgICB7Ci0JICAgICAgc2ZpbGUuc2l6ZSA9IDEyMDsKLQkgICAgICBzZmlsZS5idWZmZXIgPSB4bWFsbG9jIChzZmlsZS5zaXplKTsKLQkgICAgICBzZmlsZS5jdXJyZW50ID0gc2ZpbGUuYnVmZmVyOwotCSAgICAgIGluZm8tPmZwcmludGZfZnVuYyA9IChmcHJpbnRmX2Z0eXBlKSBvYmpkdW1wX3NwcmludGY7Ci0JICAgICAgaW5mby0+c3RyZWFtID0gKEZJTEUgKikgJnNmaWxlOwotCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9saW5lID0gMDsKLQkgICAgICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSAwOwotCi0JICAgICAgLyogRklYTUU6IFRoaXMgaXMgd3JvbmcuICBJdCB0ZXN0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gICAgICAgICAgICAgICAgIGluIHRoZSBsYXN0IGluc3RydWN0aW9uLCBub3QgdGhlIGN1cnJlbnQgb25lLiAgKi8KLQkgICAgICBpZiAoKnJlbHBwcCA8IHJlbHBwZW5kCi0JCSAgJiYgKCoqcmVscHBwKS0+YWRkcmVzcyA+PSBpCi0JCSAgJiYgKCoqcmVscHBwKS0+YWRkcmVzcyA8IGkgKyBieXRlcykKLQkJaW5mby0+ZmxhZ3MgPSBJTlNOX0hBU19SRUxPQzsKLQkgICAgICBlbHNlCi0JCWluZm8tPmZsYWdzID0gMDsKLQotCSAgICAgIGJ5dGVzID0gKCpkaXNhc3NlbWJsZV9mbikgKHNlY3Rpb24tPnZtYSArIGksIGluZm8pOwotCSAgICAgIGluZm8tPmZwcmludGZfZnVuYyA9IChmcHJpbnRmX2Z0eXBlKSBmcHJpbnRmOwotCSAgICAgIGluZm8tPnN0cmVhbSA9IHN0ZG91dDsKLQkgICAgICBpZiAoaW5mby0+Ynl0ZXNfcGVyX2xpbmUgIT0gMCkKLQkJYnl0ZXNfcGVyX2xpbmUgPSBpbmZvLT5ieXRlc19wZXJfbGluZTsKLQkgICAgICBpZiAoYnl0ZXMgPCAwKQotCQlicmVhazsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbG9uZyBqOwotCi0JICAgICAgYnl0ZXMgPSBieXRlc19wZXJfbGluZTsKLQkgICAgICBpZiAoaSArIGJ5dGVzID4gc3RvcCkKLQkJYnl0ZXMgPSBzdG9wIC0gaTsKLQotCSAgICAgIGZvciAoaiA9IGk7IGogPCBpICsgYnl0ZXM7ICsraikKLQkJewotCQkgIGlmIChpc3ByaW50IChkYXRhW2pdKSkKLQkJICAgIGJ1ZltqIC0gaV0gPSBkYXRhW2pdOwotCQkgIGVsc2UKLQkJICAgIGJ1ZltqIC0gaV0gPSAnLic7Ci0JCX0KLQkgICAgICBidWZbaiAtIGldID0gJ1wwJzsKLQkgICAgfQotCi0JICBpZiAocHJlZml4X2FkZHJlc3NlcwotCSAgICAgID8gc2hvd19yYXdfaW5zbiA+IDAKLQkgICAgICA6IHNob3dfcmF3X2luc24gPj0gMCkKLQkgICAgewotCSAgICAgIGxvbmcgajsKLQotCSAgICAgIC8qIElmICEgcHJlZml4X2FkZHJlc3NlcyBhbmQgISB3aWRlX291dHB1dCwgd2UgcHJpbnQKLSAgICAgICAgICAgICAgICAgYnl0ZXNfcGVyX2xpbmUgYnl0ZXMgcGVyIGxpbmUuICAqLwotCSAgICAgIHBiID0gYnl0ZXM7Ci0JICAgICAgaWYgKHBiID4gYnl0ZXNfcGVyX2xpbmUgJiYgISBwcmVmaXhfYWRkcmVzc2VzICYmICEgd2lkZV9vdXRwdXQpCi0JCXBiID0gYnl0ZXNfcGVyX2xpbmU7Ci0KLQkgICAgICBpZiAoaW5mby0+Ynl0ZXNfcGVyX2NodW5rKQotCQlicGMgPSBpbmZvLT5ieXRlc19wZXJfY2h1bms7Ci0JICAgICAgZWxzZQotCQlicGMgPSAxOwotCi0JICAgICAgZm9yIChqID0gaTsgaiA8IGkgKyBwYjsgaiArPSBicGMpCi0JCXsKLQkJICBpbnQgazsKLQkJICBpZiAoYnBjID4gMSAmJiBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLQkJICAgIHsKLQkJICAgICAgZm9yIChrID0gYnBjIC0gMTsgayA+PSAwOyBrLS0pCi0JCQlwcmludGYgKCIlMDJ4IiwgKHVuc2lnbmVkKSBkYXRhW2ogKyBrXSk7Ci0JCSAgICAgIHB1dGNoYXIgKCcgJyk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBmb3IgKGsgPSAwOyBrIDwgYnBjOyBrKyspCi0JCQlwcmludGYgKCIlMDJ4IiwgKHVuc2lnbmVkKSBkYXRhW2ogKyBrXSk7Ci0JCSAgICAgIHB1dGNoYXIgKCcgJyk7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGZvciAoOyBwYiA8IGJ5dGVzX3Blcl9saW5lOyBwYiArPSBicGMpCi0JCXsKLQkJICBpbnQgazsKLQotCQkgIGZvciAoayA9IDA7IGsgPCBicGM7IGsrKykKLQkJICAgIHByaW50ZiAoIiAgIik7Ci0JCSAgcHV0Y2hhciAoJyAnKTsKLQkJfQotCi0JICAgICAgLyogU2VwYXJhdGUgcmF3IGRhdGEgZnJvbSBpbnN0cnVjdGlvbiBieSBleHRyYSBzcGFjZS4gICovCi0JICAgICAgaWYgKGluc25zKQotCQlwdXRjaGFyICgnXHQnKTsKLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIiAgICAiKTsKLQkgICAgfQotCi0JICBpZiAoISBpbnNucykKLQkgICAgcHJpbnRmICgiJXMiLCBidWYpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiJXMiLCBzZmlsZS5idWZmZXIpOwotCSAgICAgIGZyZWUgKHNmaWxlLmJ1ZmZlcik7Ci0JICAgIH0KLQotCSAgaWYgKHByZWZpeF9hZGRyZXNzZXMKLQkgICAgICA/IHNob3dfcmF3X2luc24gPiAwCi0JICAgICAgOiBzaG93X3Jhd19pbnNuID49IDApCi0JICAgIHsKLQkgICAgICB3aGlsZSAocGIgPCBieXRlcykKLQkJewotCQkgIGxvbmcgajsKLQkJICBjaGFyICpzOwotCi0JCSAgcHV0Y2hhciAoJ1xuJyk7Ci0JCSAgaiA9IGkgKyBwYjsKLQotCQkgIHNwcmludGZfdm1hIChidWYsIHNlY3Rpb24tPnZtYSArIGopOwotCQkgIGZvciAocyA9IGJ1ZiArIHNraXBfYWRkcl9jaGFyczsgKnMgPT0gJzAnOyBzKyspCi0JCSAgICAqcyA9ICcgJzsKLQkJICBpZiAoKnMgPT0gJ1wwJykKLQkJICAgICotLXMgPSAnMCc7Ci0JCSAgcHJpbnRmICgiJXM6XHQiLCBidWYgKyBza2lwX2FkZHJfY2hhcnMpOwotCi0JCSAgcGIgKz0gYnl0ZXNfcGVyX2xpbmU7Ci0JCSAgaWYgKHBiID4gYnl0ZXMpCi0JCSAgICBwYiA9IGJ5dGVzOwotCQkgIGZvciAoOyBqIDwgaSArIHBiOyBqICs9IGJwYykKLQkJICAgIHsKLQkJICAgICAgaW50IGs7Ci0KLQkJICAgICAgaWYgKGJwYyA+IDEgJiYgaW5mby0+ZGlzcGxheV9lbmRpYW4gPT0gQkZEX0VORElBTl9MSVRUTEUpCi0JCQl7Ci0JCQkgIGZvciAoayA9IGJwYyAtIDE7IGsgPj0gMDsgay0tKQotCQkJICAgIHByaW50ZiAoIiUwMngiLCAodW5zaWduZWQpIGRhdGFbaiArIGtdKTsKLQkJCSAgcHV0Y2hhciAoJyAnKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBmb3IgKGsgPSAwOyBrIDwgYnBjOyBrKyspCi0JCQkgICAgcHJpbnRmICgiJTAyeCIsICh1bnNpZ25lZCkgZGF0YVtqICsga10pOwotCQkJICBwdXRjaGFyICgnICcpOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCF3aWRlX291dHB1dCkKLQkgICAgcHV0Y2hhciAoJ1xuJyk7Ci0JICBlbHNlCi0JICAgIG5lZWRfbmwgPSB0cnVlOwotCX0KLQotICAgICAgaWYgKGR1bXBfcmVsb2NfaW5mbwotCSAgJiYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCXsKLQkgIHdoaWxlICgoKnJlbHBwcCkgPCByZWxwcGVuZAotCQkgJiYgKCgqKnJlbHBwcCktPmFkZHJlc3MgPj0gKGJmZF92bWEpIGkKLQkJICAgICAmJiAoKipyZWxwcHApLT5hZGRyZXNzIDwgKGJmZF92bWEpIGkgKyBieXRlcykpCi0JICAgIHsKLQkgICAgICBhcmVsZW50ICpxOwotCi0JICAgICAgcSA9ICoqcmVscHBwOwotCi0JICAgICAgaWYgKHdpZGVfb3V0cHV0KQotCQlwdXRjaGFyICgnXHQnKTsKLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIlx0XHRcdCIpOwotCi0JICAgICAgb2JqZHVtcF9wcmludF92YWx1ZSAoc2VjdGlvbi0+dm1hICsgcS0+YWRkcmVzcywgaW5mbywgdHJ1ZSk7Ci0KLQkgICAgICBwcmludGYgKCI6ICVzXHQiLCBxLT5ob3d0by0+bmFtZSk7Ci0KLQkgICAgICBpZiAocS0+c3ltX3B0cl9wdHIgPT0gTlVMTCB8fCAqcS0+c3ltX3B0cl9wdHIgPT0gTlVMTCkKLQkJcHJpbnRmICgiKnVua25vd24qIik7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci0KLQkJICBzeW1fbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCpxLT5zeW1fcHRyX3B0cik7Ci0JCSAgaWYgKHN5bV9uYW1lICE9IE5VTEwgJiYgKnN5bV9uYW1lICE9ICdcMCcpCi0JCSAgICBvYmpkdW1wX3ByaW50X3N5bW5hbWUgKGF1eC0+YWJmZCwgaW5mbywgKnEtPnN5bV9wdHJfcHRyKTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGFzZWN0aW9uICpzeW1fc2VjOwotCi0JCSAgICAgIHN5bV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKCpxLT5zeW1fcHRyX3B0cik7Ci0JCSAgICAgIHN5bV9uYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGF1eC0+YWJmZCwgc3ltX3NlYyk7Ci0JCSAgICAgIGlmIChzeW1fbmFtZSA9PSBOVUxMIHx8ICpzeW1fbmFtZSA9PSAnXDAnKQotCQkJc3ltX25hbWUgPSAiKnVua25vd24qIjsKLQkJICAgICAgcHJpbnRmICgiJXMiLCBzeW1fbmFtZSk7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGlmIChxLT5hZGRlbmQpCi0JCXsKLQkJICBwcmludGYgKCIrMHgiKTsKLQkJICBvYmpkdW1wX3ByaW50X3ZhbHVlIChxLT5hZGRlbmQsIGluZm8sIHRydWUpOwotCQl9Ci0KLQkgICAgICBwcmludGYgKCJcbiIpOwotCSAgICAgIG5lZWRfbmwgPSBmYWxzZTsKLQkgICAgICArKygqcmVscHBwKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKG5lZWRfbmwpCi0JcHJpbnRmICgiXG4iKTsKLQotICAgICAgaSArPSBieXRlczsKLSAgICB9Ci19Ci0KLS8qIERpc2Fzc2VtYmxlIHRoZSBjb250ZW50cyBvZiBhbiBvYmplY3QgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1kaXNhc3NlbWJsZV9kYXRhIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGxvbmcgaTsKLSAgZGlzYXNzZW1ibGVyX2Z0eXBlIGRpc2Fzc2VtYmxlX2ZuOwotICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyBkaXNhc21faW5mbzsKLSAgc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gYXV4OwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICBwcmludF9maWxlcyA9IE5VTEw7Ci0gIHByZXZfZnVuY3Rpb25uYW1lID0gTlVMTDsKLSAgcHJldl9saW5lID0gLTE7Ci0KLSAgLyogV2UgbWFrZSBhIGNvcHkgb2Ygc3ltcyB0byBzb3J0LiAgV2UgZG9uJ3Qgd2FudCB0byBzb3J0IHN5bXMKLSAgICAgYmVjYXVzZSB0aGF0IHdpbGwgc2NyZXcgdXAgdGhlIHJlbG9jcy4gICovCi0gIHNvcnRlZF9zeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bWNvdW50ICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgbWVtY3B5IChzb3J0ZWRfc3ltcywgc3ltcywgc3ltY291bnQgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotCi0gIHNvcnRlZF9zeW1jb3VudCA9IHJlbW92ZV91c2VsZXNzX3N5bWJvbHMgKHNvcnRlZF9zeW1zLCBzeW1jb3VudCk7Ci0KLSAgLyogU29ydCB0aGUgc3ltYm9scyBpbnRvIHNlY3Rpb24gYW5kIHN5bWJvbCBvcmRlciAqLwotICBxc29ydCAoc29ydGVkX3N5bXMsIHNvcnRlZF9zeW1jb3VudCwgc2l6ZW9mIChhc3ltYm9sICopLCBjb21wYXJlX3N5bWJvbHMpOwotCi0gIElOSVRfRElTQVNTRU1CTEVfSU5GTyhkaXNhc21faW5mbywgc3Rkb3V0LCBmcHJpbnRmKTsKLSAgZGlzYXNtX2luZm8uYXBwbGljYXRpb25fZGF0YSA9IChQVFIpICZhdXg7Ci0gIGF1eC5hYmZkID0gYWJmZDsKLSAgYXV4LnJlcXVpcmVfc2VjID0gZmFsc2U7Ci0gIGRpc2FzbV9pbmZvLnByaW50X2FkZHJlc3NfZnVuYyA9IG9iamR1bXBfcHJpbnRfYWRkcmVzczsKLSAgZGlzYXNtX2luZm8uc3ltYm9sX2F0X2FkZHJlc3NfZnVuYyA9IG9iamR1bXBfc3ltYm9sX2F0X2FkZHJlc3M7Ci0KLSAgaWYgKG1hY2hpbmUgIT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmluZm8gPSBiZmRfc2Nhbl9hcmNoIChtYWNoaW5lKTsKLSAgICAgIGlmIChpbmZvID09IE5VTEwpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogQ2FuJ3QgdXNlIHN1cHBsaWVkIG1hY2hpbmUgJXNcbiIpLAotCQkgICBwcm9ncmFtX25hbWUsCi0JCSAgIG1hY2hpbmUpOwotCSAgZXhpdCAoMSk7Ci0JfQotICAgICAgYWJmZC0+YXJjaF9pbmZvID0gaW5mbzsKLSAgICB9Ci0KLSAgaWYgKGVuZGlhbiAhPSBCRkRfRU5ESUFOX1VOS05PV04pCi0gICAgewotICAgICAgc3RydWN0IGJmZF90YXJnZXQgKnh2ZWM7Ci0KLSAgICAgIHh2ZWMgPSAoc3RydWN0IGJmZF90YXJnZXQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX3RhcmdldCkpOwotICAgICAgbWVtY3B5ICh4dmVjLCBhYmZkLT54dmVjLCBzaXplb2YgKHN0cnVjdCBiZmRfdGFyZ2V0KSk7Ci0gICAgICB4dmVjLT5ieXRlb3JkZXIgPSBlbmRpYW47Ci0gICAgICBhYmZkLT54dmVjID0geHZlYzsKLSAgICB9Ci0KLSAgZGlzYXNzZW1ibGVfZm4gPSBkaXNhc3NlbWJsZXIgKGFiZmQpOwotICBpZiAoIWRpc2Fzc2VtYmxlX2ZuKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IENhbid0IGRpc2Fzc2VtYmxlIGZvciBhcmNoaXRlY3R1cmUgJXNcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUsCi0JICAgICAgIGJmZF9wcmludGFibGVfYXJjaF9tYWNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpLCAwKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRpc2FzbV9pbmZvLmZsYXZvdXIgPSBiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpOwotICBkaXNhc21faW5mby5hcmNoID0gYmZkX2dldF9hcmNoIChhYmZkKTsKLSAgZGlzYXNtX2luZm8ubWFjaCA9IGJmZF9nZXRfbWFjaCAoYWJmZCk7Ci0gIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgZGlzYXNtX2luZm8uZGlzcGxheV9lbmRpYW4gPSBkaXNhc21faW5mby5lbmRpYW4gPSBCRkRfRU5ESUFOX0JJRzsKLSAgZWxzZSBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKQotICAgIGRpc2FzbV9pbmZvLmRpc3BsYXlfZW5kaWFuID0gZGlzYXNtX2luZm8uZW5kaWFuID0gQkZEX0VORElBTl9MSVRUTEU7Ci0gIGVsc2UKLSAgICAvKiA/Pz8gQWJvcnRpbmcgaGVyZSBzZWVtcyB0b28gZHJhc3RpYy4gIFdlIGNvdWxkIGRlZmF1bHQgdG8gYmlnIG9yIGxpdHRsZQotICAgICAgIGluc3RlYWQuICAqLwotICAgIGRpc2FzbV9pbmZvLmVuZGlhbiA9IEJGRF9FTkRJQU5fVU5LTk9XTjsKLQotICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBzZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMOwotICAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpkYXRhID0gTlVMTDsKLSAgICAgIGJmZF9zaXplX3R5cGUgZGF0YXNpemUgPSAwOwotICAgICAgYXJlbGVudCAqKnJlbGJ1ZiA9IE5VTEw7Ci0gICAgICBhcmVsZW50ICoqcmVscHAgPSBOVUxMOwotICAgICAgYXJlbGVudCAqKnJlbHBwZW5kID0gTlVMTDsKLSAgICAgIGxvbmcgc3RvcDsKLSAgICAgIGFzeW1ib2wgKnN5bSA9IE5VTEw7Ci0gICAgICBsb25nIHBsYWNlID0gMDsKLQotICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwCi0JICB8fCAoISBkaXNhc3NlbWJsZV9hbGwKLQkgICAgICAmJiBvbmx5ID09IE5VTEwKLQkgICAgICAmJiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkpCi0JY29udGludWU7Ci0gICAgICBpZiAob25seSAhPSAoY2hhciAqKSBOVUxMICYmIHN0cmNtcCAob25seSwgc2VjdGlvbi0+bmFtZSkgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKGR1bXBfcmVsb2NfaW5mbwotCSAgJiYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCXsKLQkgIGxvbmcgcmVsc2l6ZTsKLQotCSAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlY3Rpb24pOwotCSAgaWYgKHJlbHNpemUgPCAwKQotCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotCSAgaWYgKHJlbHNpemUgPiAwKQotCSAgICB7Ci0JICAgICAgbG9uZyByZWxjb3VudDsKLQotCSAgICAgIHJlbGJ1ZiA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLQkgICAgICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlY3Rpb24sIHJlbGJ1Ziwgc3ltcyk7Ci0JICAgICAgaWYgKHJlbGNvdW50IDwgMCkKLQkJYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLQkgICAgICAvKiBTb3J0IHRoZSByZWxvY3MgYnkgYWRkcmVzcy4gICovCi0JICAgICAgcXNvcnQgKHJlbGJ1ZiwgcmVsY291bnQsIHNpemVvZiAoYXJlbGVudCAqKSwgY29tcGFyZV9yZWxvY3MpOwotCi0JICAgICAgcmVscHAgPSByZWxidWY7Ci0JICAgICAgcmVscHBlbmQgPSByZWxwcCArIHJlbGNvdW50OwotCi0JICAgICAgLyogU2tpcCBvdmVyIHRoZSByZWxvY3MgYmVsb25naW5nIHRvIGFkZHJlc3NlcyBiZWxvdyB0aGUKLQkJIHN0YXJ0IGFkZHJlc3MuICAqLwotCSAgICAgIGlmIChzdGFydF9hZGRyZXNzICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIHdoaWxlIChyZWxwcCA8IHJlbHBwZW5kCi0JCQkgJiYgKCpyZWxwcCktPmFkZHJlc3MgPCBzdGFydF9hZGRyZXNzKQotCQkgICAgKytyZWxwcDsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBwcmludGYgKF8oIkRpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gJXM6XG4iKSwgc2VjdGlvbi0+bmFtZSk7Ci0KLSAgICAgIGRhdGFzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWN0aW9uKTsKLSAgICAgIGlmIChkYXRhc2l6ZSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBkYXRhID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKChzaXplX3QpIGRhdGFzaXplKTsKLQotICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBkYXRhLCAwLCBkYXRhc2l6ZSk7Ci0KLSAgICAgIGF1eC5zZWMgPSBzZWN0aW9uOwotICAgICAgZGlzYXNtX2luZm8uYnVmZmVyID0gZGF0YTsKLSAgICAgIGRpc2FzbV9pbmZvLmJ1ZmZlcl92bWEgPSBzZWN0aW9uLT52bWE7Ci0gICAgICBkaXNhc21faW5mby5idWZmZXJfbGVuZ3RoID0gZGF0YXNpemU7Ci0gICAgICBpZiAoc3RhcnRfYWRkcmVzcyA9PSAoYmZkX3ZtYSkgLTEKLQkgIHx8IHN0YXJ0X2FkZHJlc3MgPCBkaXNhc21faW5mby5idWZmZXJfdm1hKQotCWkgPSAwOwotICAgICAgZWxzZQotCWkgPSBzdGFydF9hZGRyZXNzIC0gZGlzYXNtX2luZm8uYnVmZmVyX3ZtYTsKLSAgICAgIGlmIChzdG9wX2FkZHJlc3MgPT0gKGJmZF92bWEpIC0xKQotCXN0b3AgPSBkYXRhc2l6ZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoc3RvcF9hZGRyZXNzIDwgZGlzYXNtX2luZm8uYnVmZmVyX3ZtYSkKLQkgICAgc3RvcCA9IDA7Ci0JICBlbHNlCi0JICAgIHN0b3AgPSBzdG9wX2FkZHJlc3MgLSBkaXNhc21faW5mby5idWZmZXJfdm1hOwotCSAgaWYgKHN0b3AgPiBkaXNhc21faW5mby5idWZmZXJfbGVuZ3RoKQotCSAgICBzdG9wID0gZGlzYXNtX2luZm8uYnVmZmVyX2xlbmd0aDsKLQl9Ci0KLSAgICAgIHN5bSA9IGZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzIChhYmZkLCBzZWN0aW9uLCBzZWN0aW9uLT52bWEgKyBpLAotCQkJCSAgICAgdHJ1ZSwgJnBsYWNlKTsKLQotICAgICAgd2hpbGUgKGkgPCBzdG9wKQotCXsKLQkgIGFzeW1ib2wgKm5leHRzeW07Ci0JICBsb25nIG5leHRzdG9wOwotCSAgYm9vbGVhbiBpbnNuczsKLQkgIAotCSAgaWYgKHN5bSAhPSBOVUxMICYmIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pIDw9IHNlY3Rpb24tPnZtYSArIGkpCi0JICAgIHsKLQkgICAgICBpbnQgeDsKLQotCSAgICAgIGZvciAoeCA9IHBsYWNlOwotCQkgICAoeCA8IHNvcnRlZF9zeW1jb3VudAotCQkgICAgJiYgYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW3hdKSA8PSBzZWN0aW9uLT52bWEgKyBpKTsKLQkJICAgKyt4KQotCQljb250aW51ZTsKLQkgICAgICBkaXNhc21faW5mby5zeW1ib2xzID0gJiBzb3J0ZWRfc3ltc1twbGFjZV07Ci0JICAgICAgZGlzYXNtX2luZm8ubnVtX3N5bWJvbHMgPSB4IC0gcGxhY2U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZGlzYXNtX2luZm8uc3ltYm9scyA9IE5VTEw7Ci0KLQkgIGlmICghIHByZWZpeF9hZGRyZXNzZXMpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJcbiIpOwotCSAgICAgIG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSAoYWJmZCwgc2VjdGlvbiwgc3ltLAotCQkJCQkgICBzZWN0aW9uLT52bWEgKyBpLAotCQkJCQkgICAmZGlzYXNtX2luZm8sCi0JCQkJCSAgIGZhbHNlKTsKLQkgICAgICBwcmludGYgKCI6XG4iKTsKLQkgICAgfQotCSAgCi0JICBpZiAoc3ltICE9IE5VTEwgJiYgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPiBzZWN0aW9uLT52bWEgKyBpKQotCSAgICBuZXh0c3ltID0gc3ltOwotCSAgZWxzZSBpZiAoc3ltID09IE5VTEwpCi0JICAgIG5leHRzeW0gPSBOVUxMOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgd2hpbGUgKHBsYWNlIDwgc29ydGVkX3N5bWNvdW50Ci0JCSAgICAgLyogPz8/IFdoeSB0aGUgdGVzdCBmb3IgIT0gc2VjdGlvbj8gICovCi0JCSAgICAgJiYgKHNvcnRlZF9zeW1zW3BsYWNlXS0+c2VjdGlvbiAhPSBzZWN0aW9uCi0JCQkgfHwgKGJmZF9hc3ltYm9sX3ZhbHVlIChzb3J0ZWRfc3ltc1twbGFjZV0pCi0JCQkgICAgIDw9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkpCi0JCSsrcGxhY2U7Ci0JICAgICAgaWYgKHBsYWNlID49IHNvcnRlZF9zeW1jb3VudCkKLQkJbmV4dHN5bSA9IE5VTEw7Ci0JICAgICAgZWxzZQotCQluZXh0c3ltID0gc29ydGVkX3N5bXNbcGxhY2VdOwotCSAgICB9Ci0JICAKLQkgIGlmIChzeW0gIT0gTlVMTCAmJiBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA+IHNlY3Rpb24tPnZtYSArIGkpCi0JICAgIHsKLQkgICAgICBuZXh0c3RvcCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pIC0gc2VjdGlvbi0+dm1hOwotCSAgICAgIGlmIChuZXh0c3RvcCA+IHN0b3ApCi0JCW5leHRzdG9wID0gc3RvcDsKLQkgICAgfQotCSAgZWxzZSBpZiAobmV4dHN5bSA9PSBOVUxMKQotCSAgICBuZXh0c3RvcCA9IHN0b3A7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuZXh0c3RvcCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChuZXh0c3ltKSAtIHNlY3Rpb24tPnZtYTsKLQkgICAgICBpZiAobmV4dHN0b3AgPiBzdG9wKQotCQluZXh0c3RvcCA9IHN0b3A7Ci0JICAgIH0KLQkgIAotCSAgLyogSWYgYSBzeW1ib2wgaXMgZXhwbGljaXRseSBtYXJrZWQgYXMgYmVpbmcgYW4gb2JqZWN0Ci0JICAgICByYXRoZXIgdGhhbiBhIGZ1bmN0aW9uLCBqdXN0IGR1bXAgdGhlIGJ5dGVzIHdpdGhvdXQKLQkgICAgIGRpc2Fzc2VtYmxpbmcgdGhlbS4gICovCi0JICBpZiAoZGlzYXNzZW1ibGVfYWxsCi0JICAgICAgfHwgc3ltID09IE5VTEwKLQkgICAgICB8fCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA+IHNlY3Rpb24tPnZtYSArIGkKLQkgICAgICB8fCAoKHN5bS0+ZmxhZ3MgJiBCU0ZfT0JKRUNUKSA9PSAwCi0JCSAgJiYgKHN0cnN0ciAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgImdudV9jb21waWxlZCIpCi0JCSAgICAgID09IE5VTEwpCi0JCSAgJiYgKHN0cnN0ciAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgImdjYzJfY29tcGlsZWQiKQotCQkgICAgICA9PSBOVUxMKSkKLQkgICAgICB8fCAoc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikgIT0gMCkKLQkgICAgaW5zbnMgPSB0cnVlOwotCSAgZWxzZQotCSAgICBpbnNucyA9IGZhbHNlOwotCSAgCi0JICBkaXNhc3NlbWJsZV9ieXRlcyAoJmRpc2FzbV9pbmZvLCBkaXNhc3NlbWJsZV9mbiwgaW5zbnMsIGRhdGEsIGksCi0JCQkgICAgIG5leHRzdG9wLCAmcmVscHAsIHJlbHBwZW5kKTsKLQkgIAotCSAgaSA9IG5leHRzdG9wOwotCSAgc3ltID0gbmV4dHN5bTsKLQl9Ci0gICAgICAKLSAgICAgIGZyZWUgKGRhdGEpOwotICAgICAgaWYgKHJlbGJ1ZiAhPSBOVUxMKQotCWZyZWUgKHJlbGJ1Zik7Ci0gICAgfQotICBmcmVlIChzb3J0ZWRfc3ltcyk7Ci19Ci0MCi0KLS8qIERlZmluZSBhIHRhYmxlIG9mIHN0YWIgdmFsdWVzIGFuZCBwcmludC1zdHJpbmdzLiAgV2Ugd2lzaCB0aGUgaW5pdGlhbGl6ZXIKLSAgIGNvdWxkIGJlIGEgZGlyZWN0LW1hcHBlZCB0YWJsZSwgYnV0IGluc3RlYWQgd2UgYnVpbGQgb25lIHRoZSBmaXJzdAotICAgdGltZSB3ZSBuZWVkIGl0LiAgKi8KLQotc3RhdGljIHZvaWQgZHVtcF9zZWN0aW9uX3N0YWJzIFBBUkFNUyAoKGJmZCAqYWJmZCwgY2hhciAqc3RhYnNlY3RfbmFtZSwKLQkJCQkJY2hhciAqc3Ryc2VjdF9uYW1lKSk7Ci0KLS8qIER1bXAgdGhlIHN0YWJzIHNlY3Rpb25zIGZyb20gYW4gb2JqZWN0IGZpbGUgdGhhdCBoYXMgYSBzZWN0aW9uIHRoYXQKLSAgIHVzZXMgU3VuIHN0YWJzIGVuY29kaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWR1bXBfc3RhYnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZHVtcF9zZWN0aW9uX3N0YWJzIChhYmZkLCAiLnN0YWIiLCAiLnN0YWJzdHIiKTsKLSAgZHVtcF9zZWN0aW9uX3N0YWJzIChhYmZkLCAiLnN0YWIuZXhjbCIsICIuc3RhYi5leGNsc3RyIik7Ci0gIGR1bXBfc2VjdGlvbl9zdGFicyAoYWJmZCwgIi5zdGFiLmluZGV4IiwgIi5zdGFiLmluZGV4c3RyIik7Ci0gIGR1bXBfc2VjdGlvbl9zdGFicyAoYWJmZCwgIiRHREJfU1lNQk9MUyQiLCAiJEdEQl9TVFJJTkdTJCIpOwotfQotCi1zdGF0aWMgYmZkX2J5dGUgKnN0YWJzOwotc3RhdGljIGJmZF9zaXplX3R5cGUgc3RhYl9zaXplOwotCi1zdGF0aWMgY2hhciAqc3RydGFiOwotc3RhdGljIGJmZF9zaXplX3R5cGUgc3RhYnN0cl9zaXplOwotCi0vKiBSZWFkIEFCRkQncyBzdGFicyBzZWN0aW9uIFNUQUJTRUNUX05BTUUgaW50byBgc3RhYnMnCi0gICBhbmQgc3RyaW5nIHRhYmxlIHNlY3Rpb24gU1RSU0VDVF9OQU1FIGludG8gYHN0cnRhYicuCi0gICBJZiB0aGUgc2VjdGlvbiBleGlzdHMgYW5kIHdhcyByZWFkLCBhbGxvY2F0ZSB0aGUgc3BhY2UgYW5kIHJldHVybiB0cnVlLgotICAgT3RoZXJ3aXNlIHJldHVybiBmYWxzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1yZWFkX3NlY3Rpb25fc3RhYnMgKGFiZmQsIHN0YWJzZWN0X25hbWUsIHN0cnNlY3RfbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpzdGFic2VjdF9uYW1lOwotICAgICBjb25zdCBjaGFyICpzdHJzZWN0X25hbWU7Ci17Ci0gIGFzZWN0aW9uICpzdGFic2VjdCwgKnN0YWJzdHJzZWN0OwotCi0gIHN0YWJzZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN0YWJzZWN0X25hbWUpOwotICBpZiAoMCA9PSBzdGFic2VjdCkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIk5vICVzIHNlY3Rpb24gcHJlc2VudFxuXG4iKSwgc3RhYnNlY3RfbmFtZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHN0YWJzdHJzZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN0cnNlY3RfbmFtZSk7Ci0gIGlmICgwID09IHN0YWJzdHJzZWN0KQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzIGhhcyBubyAlcyBzZWN0aW9uXG4iKSwgcHJvZ3JhbV9uYW1lLAotCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc3Ryc2VjdF9uYW1lKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gCi0gIHN0YWJfc2l6ZSAgICA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN0YWJzZWN0KTsKLSAgc3RhYnN0cl9zaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3RhYnN0cnNlY3QpOwotCi0gIHN0YWJzICA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChzdGFiX3NpemUpOwotICBzdHJ0YWIgPSAoY2hhciAqKSB4bWFsbG9jIChzdGFic3RyX3NpemUpOwotICAKLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzdGFic2VjdCwgKFBUUikgc3RhYnMsIDAsIHN0YWJfc2l6ZSkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogUmVhZGluZyAlcyBzZWN0aW9uIG9mICVzIGZhaWxlZDogJXNcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUsIHN0YWJzZWN0X25hbWUsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICBmcmVlIChzdGFicyk7Ci0gICAgICBmcmVlIChzdHJ0YWIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHN0YWJzdHJzZWN0LCAoUFRSKSBzdHJ0YWIsIDAsCi0JCQkJICBzdGFic3RyX3NpemUpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IFJlYWRpbmcgJXMgc2VjdGlvbiBvZiAlcyBmYWlsZWQ6ICVzXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lLCBzdHJzZWN0X25hbWUsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICBmcmVlIChzdGFicyk7Ci0gICAgICBmcmVlIChzdHJ0YWIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhYnMgZW50cmllcyB1c2UgYSAxMiBieXRlIGZvcm1hdDoKLSAgICAgNCBieXRlIHN0cmluZyB0YWJsZSBpbmRleAotICAgICAxIGJ5dGUgc3RhYiB0eXBlCi0gICAgIDEgYnl0ZSBzdGFiIG90aGVyIGZpZWxkCi0gICAgIDIgYnl0ZSBzdGFiIGRlc2MgZmllbGQKLSAgICAgNCBieXRlIHN0YWIgdmFsdWUKLSAgIEZJWE1FOiBUaGlzIHdpbGwgaGF2ZSB0byBjaGFuZ2UgZm9yIGEgNjQgYml0IG9iamVjdCBmb3JtYXQuICAqLwotCi0jZGVmaW5lIFNUUkRYT0ZGICgwKQotI2RlZmluZSBUWVBFT0ZGICg0KQotI2RlZmluZSBPVEhFUk9GRiAoNSkKLSNkZWZpbmUgREVTQ09GRiAoNikKLSNkZWZpbmUgVkFMT0ZGICg4KQotI2RlZmluZSBTVEFCU0laRSAoMTIpCi0KLS8qIFByaW50IEFCRkQncyBzdGFicyBzZWN0aW9uIFNUQUJTRUNUX05BTUUgKGluIGBzdGFicycpLAotICAgdXNpbmcgc3RyaW5nIHRhYmxlIHNlY3Rpb24gU1RSU0VDVF9OQU1FIChpbiBgc3RydGFiJykuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc2VjdGlvbl9zdGFicyAoYWJmZCwgc3RhYnNlY3RfbmFtZSwgc3Ryc2VjdF9uYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YWJzZWN0X25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cnNlY3RfbmFtZTsKLXsKLSAgaW50IGk7Ci0gIHVuc2lnbmVkIGZpbGVfc3RyaW5nX3RhYmxlX29mZnNldCA9IDAsIG5leHRfZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0ID0gMDsKLSAgYmZkX2J5dGUgKnN0YWJwLCAqc3RhYnNfZW5kOwotCi0gIHN0YWJwID0gc3RhYnM7Ci0gIHN0YWJzX2VuZCA9IHN0YWJwICsgc3RhYl9zaXplOwotCi0gIHByaW50ZiAoXygiQ29udGVudHMgb2YgJXMgc2VjdGlvbjpcblxuIiksIHN0YWJzZWN0X25hbWUpOwotICBwcmludGYgKCJTeW1udW0gbl90eXBlIG5fb3RociBuX2Rlc2Mgbl92YWx1ZSAgbl9zdHJ4IFN0cmluZ1xuIik7Ci0KLSAgLyogTG9vcCB0aHJvdWdoIGFsbCBzeW1ib2xzIGFuZCBwcmludCB0aGVtLgotCi0gICAgIFdlIHN0YXJ0IHRoZSBpbmRleCBhdCAtMSBiZWNhdXNlIHRoZXJlIGlzIGEgZHVtbXkgc3ltYm9sIG9uCi0gICAgIHRoZSBmcm9udCBvZiBzdGFicy1pbi17Y29mZixlbGZ9IHNlY3Rpb25zIHRoYXQgc3VwcGxpZXMgc2l6ZXMuICAqLwotCi0gIGZvciAoaSA9IC0xOyBzdGFicCA8IHN0YWJzX2VuZDsgc3RhYnAgKz0gU1RBQlNJWkUsIGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgdW5zaWduZWQgbG9uZyBzdHJ4OwotICAgICAgdW5zaWduZWQgY2hhciB0eXBlLCBvdGhlcjsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGRlc2M7Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotCi0gICAgICBzdHJ4ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzdGFicCArIFNUUkRYT0ZGKTsKLSAgICAgIHR5cGUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgc3RhYnAgKyBUWVBFT0ZGKTsKLSAgICAgIG90aGVyID0gYmZkX2hfZ2V0XzggKGFiZmQsIHN0YWJwICsgT1RIRVJPRkYpOwotICAgICAgZGVzYyA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3RhYnAgKyBERVNDT0ZGKTsKLSAgICAgIHZhbHVlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzdGFicCArIFZBTE9GRik7Ci0KLSAgICAgIHByaW50ZiAoIlxuJS02ZCAiLCBpKTsKLSAgICAgIC8qIEVpdGhlciBwcmludCB0aGUgc3RhYiBuYW1lLCBvciwgaWYgdW5uYW1lZCwgcHJpbnQgaXRzIG51bWJlcgotCSBhZ2FpbiAobWFrZXMgY29uc2lzdGVudCBmb3JtYXR0aW5nIGZvciB0b29scyBsaWtlIGF3aykuICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zdGFiX25hbWUgKHR5cGUpOwotICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKLQlwcmludGYgKCIlLTZzIiwgbmFtZSk7Ci0gICAgICBlbHNlIGlmICh0eXBlID09IE5fVU5ERikKLQlwcmludGYgKCJIZHJTeW0iKTsKLSAgICAgIGVsc2UKLQlwcmludGYgKCIlLTZkIiwgdHlwZSk7Ci0gICAgICBwcmludGYgKCIgJS02ZCAlLTZkICIsIG90aGVyLCBkZXNjKTsKLSAgICAgIHByaW50Zl92bWEgKHZhbHVlKTsKLSAgICAgIHByaW50ZiAoIiAlLTZsdSIsIHN0cngpOwotCi0gICAgICAvKiBTeW1ib2xzIHdpdGggdHlwZSA9PSAwIChOX1VOREYpIHNwZWNpZnkgdGhlIGxlbmd0aCBvZiB0aGUKLQkgc3RyaW5nIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbGUuICBXZSB1c2UgdGhhdCBpbmZvCi0JIHRvIGtub3cgaG93IHRvIHJlbG9jYXRlIHRoZSAqbmV4dCogZmlsZSdzIHN0cmluZyB0YWJsZSBpbmRpY2VzLiAgKi8KLQotICAgICAgaWYgKHR5cGUgPT0gTl9VTkRGKQotCXsKLQkgIGZpbGVfc3RyaW5nX3RhYmxlX29mZnNldCA9IG5leHRfZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0OwotCSAgbmV4dF9maWxlX3N0cmluZ190YWJsZV9vZmZzZXQgKz0gdmFsdWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFVzaW5nIHRoZSAocG9zc2libHkgdXBkYXRlZCkgc3RyaW5nIHRhYmxlIG9mZnNldCwgcHJpbnQgdGhlCi0JICAgICBzdHJpbmcgKGlmIGFueSkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3ltYm9sLiAgKi8KLQotCSAgaWYgKChzdHJ4ICsgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0KSA8IHN0YWJzdHJfc2l6ZSkKLQkgICAgcHJpbnRmICgiICVzIiwgJnN0cnRhYltzdHJ4ICsgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0XSk7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoIiAqIik7Ci0JfQotICAgIH0KLSAgcHJpbnRmICgiXG5cbiIpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9zZWN0aW9uX3N0YWJzIChhYmZkLCBzdGFic2VjdF9uYW1lLCBzdHJzZWN0X25hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqc3RhYnNlY3RfbmFtZTsKLSAgICAgY2hhciAqc3Ryc2VjdF9uYW1lOwotewotICBhc2VjdGlvbiAqczsKLQotICAvKiBDaGVjayBmb3Igc2VjdGlvbiBuYW1lcyBmb3Igd2hpY2ggc3RhYnNlY3RfbmFtZSBpcyBhIHByZWZpeCwgdG8KLSAgICAgaGFuZGxlIC5zdGFiMCwgZXRjLiAgKi8KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgcyAhPSBOVUxMOwotICAgICAgIHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBsZW47Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoc3RhYnNlY3RfbmFtZSk7Ci0KLSAgICAgIC8qIElmIHRoZSBwcmVmaXggbWF0Y2hlcywgYW5kIHRoZSBmaWxlcyBzZWN0aW9uIG5hbWUgZW5kcyB3aXRoIGEKLQkgbnVsIG9yIGEgZGlnaXQsIHRoZW4gd2UgbWF0Y2guICBJLmUuLCB3ZSB3YW50IGVpdGhlciBhbiBleGFjdAotCSBtYXRjaCBvciBhIHNlY3Rpb24gZm9sbG93ZWQgYnkgYSBudW1iZXIuICAqLwotICAgICAgaWYgKHN0cm5jbXAgKHN0YWJzZWN0X25hbWUsIHMtPm5hbWUsIGxlbikgPT0gMAotCSAgJiYgKHMtPm5hbWVbbGVuXSA9PSAnXDAwMCcKLQkgICAgICB8fCBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgcy0+bmFtZVtsZW5dKSkpCi0JewotCSAgaWYgKHJlYWRfc2VjdGlvbl9zdGFicyAoYWJmZCwgcy0+bmFtZSwgc3Ryc2VjdF9uYW1lKSkKLQkgICAgewotCSAgICAgIHByaW50X3NlY3Rpb25fc3RhYnMgKGFiZmQsIHMtPm5hbWUsIHN0cnNlY3RfbmFtZSk7Ci0JICAgICAgZnJlZSAoc3RhYnMpOwotCSAgICAgIGZyZWUgKHN0cnRhYik7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotDAotc3RhdGljIHZvaWQKLWR1bXBfYmZkX2hlYWRlciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICpjb21tYSA9ICIiOwotCi0gIHByaW50ZiAoXygiYXJjaGl0ZWN0dXJlOiAlcywgIiksCi0JICBiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCAoYmZkX2dldF9hcmNoIChhYmZkKSwKLQkJCQkgICBiZmRfZ2V0X21hY2ggKGFiZmQpKSk7Ci0gIHByaW50ZiAoXygiZmxhZ3MgMHglMDh4OlxuIiksIGFiZmQtPmZsYWdzKTsKLQotI2RlZmluZSBQRih4LCB5KSAgICBpZiAoYWJmZC0+ZmxhZ3MgJiB4KSB7cHJpbnRmKCIlcyVzIiwgY29tbWEsIHkpOyBjb21tYT0iLCAiO30KLSAgUEYgKEhBU19SRUxPQywgIkhBU19SRUxPQyIpOwotICBQRiAoRVhFQ19QLCAiRVhFQ19QIik7Ci0gIFBGIChIQVNfTElORU5PLCAiSEFTX0xJTkVOTyIpOwotICBQRiAoSEFTX0RFQlVHLCAiSEFTX0RFQlVHIik7Ci0gIFBGIChIQVNfU1lNUywgIkhBU19TWU1TIik7Ci0gIFBGIChIQVNfTE9DQUxTLCAiSEFTX0xPQ0FMUyIpOwotICBQRiAoRFlOQU1JQywgIkRZTkFNSUMiKTsKLSAgUEYgKFdQX1RFWFQsICJXUF9URVhUIik7Ci0gIFBGIChEX1BBR0VELCAiRF9QQUdFRCIpOwotICBQRiAoQkZEX0lTX1JFTEFYQUJMRSwgIkJGRF9JU19SRUxBWEFCTEUiKTsKLSAgcHJpbnRmIChfKCJcbnN0YXJ0IGFkZHJlc3MgMHgiKSk7Ci0gIHByaW50Zl92bWEgKGFiZmQtPnN0YXJ0X2FkZHJlc3MpOwotICBwcmludGYgKCJcbiIpOwotfQotDAotc3RhdGljIHZvaWQKLWR1bXBfYmZkX3ByaXZhdGVfaGVhZGVyIChhYmZkKQotYmZkICphYmZkOwotewotICBiZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgc3Rkb3V0KTsKLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfYmZkIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKiptYXRjaGluZzsKLQotICBpZiAoIWJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICBmcmVlIChtYXRjaGluZyk7Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgYWRqdXN0aW5nIHNlY3Rpb24gVk1BJ3MsIGNoYW5nZSB0aGVtIGFsbCBub3cuICBDaGFuZ2luZwotICAgICB0aGUgQkZEIGluZm9ybWF0aW9uIGlzIGEgaGFjay4gIEhvd2V2ZXIsIHdlIG11c3QgZG8gaXQsIG9yCi0gICAgIGJmZF9maW5kX25lYXJlc3RfbGluZSB3aWxsIG5vdCBkbyB0aGUgcmlnaHQgdGhpbmcuICAqLwotICBpZiAoYWRqdXN0X3NlY3Rpb25fdm1hICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXsKLQkgIHMtPnZtYSArPSBhZGp1c3Rfc2VjdGlvbl92bWE7Ci0JICBzLT5sbWEgKz0gYWRqdXN0X3NlY3Rpb25fdm1hOwotCX0KLSAgICB9Ci0KLSAgcHJpbnRmIChfKCJcbiVzOiAgICAgZmlsZSBmb3JtYXQgJXNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkgIGFiZmQtPnh2ZWMtPm5hbWUpOwotICBpZiAoZHVtcF9hcl9oZHJzKQotICAgIHByaW50X2FyZWx0X2Rlc2NyIChzdGRvdXQsIGFiZmQsIHRydWUpOwotICBpZiAoZHVtcF9maWxlX2hlYWRlcikKLSAgICBkdW1wX2JmZF9oZWFkZXIgKGFiZmQpOwotICBpZiAoZHVtcF9wcml2YXRlX2hlYWRlcnMpCi0gICAgZHVtcF9iZmRfcHJpdmF0ZV9oZWFkZXIgKGFiZmQpOwotICBwdXRjaGFyICgnXG4nKTsKLSAgaWYgKGR1bXBfc2VjdGlvbl9oZWFkZXJzKQotICAgIGR1bXBfaGVhZGVycyAoYWJmZCk7Ci0gIGlmIChkdW1wX3N5bXRhYiB8fCBkdW1wX3JlbG9jX2luZm8gfHwgZGlzYXNzZW1ibGUgfHwgZHVtcF9kZWJ1Z2dpbmcpCi0gICAgewotICAgICAgc3ltcyA9IHNsdXJwX3N5bXRhYiAoYWJmZCk7Ci0gICAgfQotICBpZiAoZHVtcF9keW5hbWljX3N5bXRhYiB8fCBkdW1wX2R5bmFtaWNfcmVsb2NfaW5mbykKLSAgICB7Ci0gICAgICBkeW5zeW1zID0gc2x1cnBfZHluYW1pY19zeW10YWIgKGFiZmQpOwotICAgIH0KLSAgaWYgKGR1bXBfc3ltdGFiKQotICAgIGR1bXBfc3ltYm9scyAoYWJmZCwgZmFsc2UpOwotICBpZiAoZHVtcF9keW5hbWljX3N5bXRhYikKLSAgICBkdW1wX3N5bWJvbHMgKGFiZmQsIHRydWUpOwotICBpZiAoZHVtcF9zdGFiX3NlY3Rpb25faW5mbykKLSAgICBkdW1wX3N0YWJzIChhYmZkKTsKLSAgaWYgKGR1bXBfcmVsb2NfaW5mbyAmJiAhIGRpc2Fzc2VtYmxlKQotICAgIGR1bXBfcmVsb2NzIChhYmZkKTsKLSAgaWYgKGR1bXBfZHluYW1pY19yZWxvY19pbmZvKQotICAgIGR1bXBfZHluYW1pY19yZWxvY3MgKGFiZmQpOwotICBpZiAoZHVtcF9zZWN0aW9uX2NvbnRlbnRzKQotICAgIGR1bXBfZGF0YSAoYWJmZCk7Ci0gIGlmIChkaXNhc3NlbWJsZSkKLSAgICBkaXNhc3NlbWJsZV9kYXRhIChhYmZkKTsKLSAgaWYgKGR1bXBfZGVidWdnaW5nKQotICAgIHsKLSAgICAgIFBUUiBkaGFuZGxlOwotCi0gICAgICBkaGFuZGxlID0gcmVhZF9kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgc3ltcywgc3ltY291bnQpOwotICAgICAgaWYgKGRoYW5kbGUgIT0gTlVMTCkKLQl7Ci0JICBpZiAoISBwcmludF9kZWJ1Z2dpbmdfaW5mbyAoc3Rkb3V0LCBkaGFuZGxlKSkKLQkgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogcHJpbnRpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZhaWxlZFxuIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCX0KLSAgICB9Ci0gIGlmIChzeW1zKQotICAgIHsKLSAgICAgIGZyZWUgKHN5bXMpOwotICAgICAgc3ltcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZHluc3ltcykKLSAgICB7Ci0gICAgICBmcmVlIChkeW5zeW1zKTsKLSAgICAgIGR5bnN5bXMgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfZmlsZSAoZmlsZW5hbWUsIHRhcmdldCkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGNoYXIgKnRhcmdldDsKLXsKLSAgYmZkICpmaWxlLCAqYXJmaWxlID0gKGJmZCAqKSBOVUxMOwotCi0gIGZpbGUgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoZmlsZW5hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZmlsZSwgYmZkX2FyY2hpdmUpID09IHRydWUpCi0gICAgewotICAgICAgYmZkICpsYXN0X2FyZmlsZSA9IE5VTEw7Ci0KLSAgICAgIHByaW50ZiAoXygiSW4gYXJjaGl2ZSAlczpcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChmaWxlKSk7Ci0gICAgICBmb3IgKDs7KQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19lcnJvcik7Ci0KLQkgIGFyZmlsZSA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGZpbGUsIGFyZmlsZSk7Ci0JICBpZiAoYXJmaWxlID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcykKLQkJewotCQkgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoZmlsZSkpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgZGlzcGxheV9iZmQgKGFyZmlsZSk7Ci0KLQkgIGlmIChsYXN0X2FyZmlsZSAhPSBOVUxMKQotCSAgICBiZmRfY2xvc2UgKGxhc3RfYXJmaWxlKTsKLQkgIGxhc3RfYXJmaWxlID0gYXJmaWxlOwotCX0KLQotICAgICAgaWYgKGxhc3RfYXJmaWxlICE9IE5VTEwpCi0JYmZkX2Nsb3NlIChsYXN0X2FyZmlsZSk7Ci0gICAgfQotICBlbHNlCi0gICAgZGlzcGxheV9iZmQgKGZpbGUpOwotCi0gIGJmZF9jbG9zZSAoZmlsZSk7Ci19Ci0MCi0vKiBBY3R1YWxseSBkaXNwbGF5IHRoZSB2YXJpb3VzIHJlcXVlc3RlZCByZWdpb25zICovCi0KLXN0YXRpYyB2b2lkCi1kdW1wX2RhdGEgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGJmZF9ieXRlICpkYXRhID0gMDsKLSAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZSA9IDA7Ci0gIGJmZF9zaXplX3R5cGUgaTsKLSAgYmZkX3NpemVfdHlwZSBzdGFydCwgc3RvcDsKLQotICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbiAhPSBOVUxMOyBzZWN0aW9uID0KLSAgICAgICBzZWN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBvbmFsaW5lID0gMTY7Ci0KLSAgICAgIGlmIChvbmx5ID09IChjaGFyICopIE5VTEwgfHwKLQkgIHN0cmNtcCAob25seSwgc2VjdGlvbi0+bmFtZSkgPT0gMCkKLQl7Ci0JICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCJDb250ZW50cyBvZiBzZWN0aW9uICVzOlxuIiksIHNlY3Rpb24tPm5hbWUpOwotCi0JICAgICAgaWYgKGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pID09IDApCi0JCWNvbnRpbnVlOwotCSAgICAgIGRhdGEgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoKHNpemVfdCkgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotCSAgICAgIGRhdGFzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0KLQotCSAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgKFBUUikgZGF0YSwgMCwgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotCi0JICAgICAgaWYgKHN0YXJ0X2FkZHJlc3MgPT0gKGJmZF92bWEpIC0xCi0JCSAgfHwgc3RhcnRfYWRkcmVzcyA8IHNlY3Rpb24tPnZtYSkKLQkJc3RhcnQgPSAwOwotCSAgICAgIGVsc2UKLQkJc3RhcnQgPSBzdGFydF9hZGRyZXNzIC0gc2VjdGlvbi0+dm1hOwotCSAgICAgIGlmIChzdG9wX2FkZHJlc3MgPT0gKGJmZF92bWEpIC0xKQotCQlzdG9wID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHN0b3BfYWRkcmVzcyA8IHNlY3Rpb24tPnZtYSkKLQkJICAgIHN0b3AgPSAwOwotCQkgIGVsc2UKLQkJICAgIHN0b3AgPSBzdG9wX2FkZHJlc3MgLSBzZWN0aW9uLT52bWE7Ci0JCSAgaWYgKHN0b3AgPiBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSkKLQkJICAgIHN0b3AgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLQkJfQotCSAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBvbmFsaW5lKQotCQl7Ci0JCSAgYmZkX3NpemVfdHlwZSBqOwotCi0JCSAgcHJpbnRmICgiICUwNGx4ICIsICh1bnNpZ25lZCBsb25nIGludCkgKGkgKyBzZWN0aW9uLT52bWEpKTsKLQkJICBmb3IgKGogPSBpOyBqIDwgaSArIG9uYWxpbmU7IGorKykKLQkJICAgIHsKLQkJICAgICAgaWYgKGogPCBzdG9wKQotCQkJcHJpbnRmICgiJTAyeCIsICh1bnNpZ25lZCkgKGRhdGFbal0pKTsKLQkJICAgICAgZWxzZQotCQkJcHJpbnRmICgiICAiKTsKLQkJICAgICAgaWYgKChqICYgMykgPT0gMykKLQkJCXByaW50ZiAoIiAiKTsKLQkJICAgIH0KLQotCQkgIHByaW50ZiAoIiAiKTsKLQkJICBmb3IgKGogPSBpOyBqIDwgaSArIG9uYWxpbmU7IGorKykKLQkJICAgIHsKLQkJICAgICAgaWYgKGogPj0gc3RvcCkKLQkJCXByaW50ZiAoIiAiKTsKLQkJICAgICAgZWxzZQotCQkJcHJpbnRmICgiJWMiLCBpc3ByaW50IChkYXRhW2pdKSA/IGRhdGFbal0gOiAnLicpOwotCQkgICAgfQotCQkgIHB1dGNoYXIgKCdcbicpOwotCQl9Ci0JICAgICAgZnJlZSAoZGF0YSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBTaG91bGQgcGVyaGFwcyBzaGFyZSBjb2RlIGFuZCBkaXNwbGF5IHdpdGggbm0/ICovCi1zdGF0aWMgdm9pZAotZHVtcF9zeW1ib2xzIChhYmZkLCBkeW5hbWljKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLXsKLSAgYXN5bWJvbCAqKmN1cnJlbnQ7Ci0gIGxvbmcgbWF4OwotICBsb25nIGNvdW50OwotCi0gIGlmIChkeW5hbWljKQotICAgIHsKLSAgICAgIGN1cnJlbnQgPSBkeW5zeW1zOwotICAgICAgbWF4ID0gZHluc3ltY291bnQ7Ci0gICAgICBpZiAobWF4ID09IDApCi0JcmV0dXJuOwotICAgICAgcHJpbnRmICgiRFlOQU1JQyBTWU1CT0wgVEFCTEU6XG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjdXJyZW50ID0gc3ltczsKLSAgICAgIG1heCA9IHN5bWNvdW50OwotICAgICAgaWYgKG1heCA9PSAwKQotCXJldHVybjsKLSAgICAgIHByaW50ZiAoIlNZTUJPTCBUQUJMRTpcbiIpOwotICAgIH0KLQotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBtYXg7IGNvdW50KyspCi0gICAgewotICAgICAgaWYgKCpjdXJyZW50KQotCXsKLQkgIGJmZCAqY3VyX2JmZCA9IGJmZF9hc3ltYm9sX2JmZCAoKmN1cnJlbnQpOwotCi0JICBpZiAoY3VyX2JmZCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgICBjaGFyICphbGxvYzsKLQotCSAgICAgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgqY3VycmVudCk7Ci0JICAgICAgYWxsb2MgPSBOVUxMOwotCSAgICAgIGlmIChkb19kZW1hbmdsZSAmJiBuYW1lICE9IE5VTEwgJiYgKm5hbWUgIT0gJ1wwJykKLQkJewotCQkgIGNvbnN0IGNoYXIgKm47Ci0KLQkJICAvKiBJZiB3ZSB3YW50IHRvIGRlbWFuZ2xlIHRoZSBuYW1lLCB3ZSBkZW1hbmdsZSBpdAotICAgICAgICAgICAgICAgICAgICAgaGVyZSwgYW5kIHRlbXBvcmFyaWx5IGNsb2JiZXIgaXQgd2hpbGUgY2FsbGluZwotICAgICAgICAgICAgICAgICAgICAgYmZkX3ByaW50X3N5bWJvbC4gIEZJWE1FOiBUaGlzIGlzIGEgZ3Jvc3MgaGFjay4gICovCi0KLQkJICBuID0gbmFtZTsKLQkJICBpZiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChjdXJfYmZkKSA9PSAqbikKLQkJICAgICsrbjsKLQkJICBhbGxvYyA9IGNwbHVzX2RlbWFuZ2xlIChuLCBETUdMX0FOU0kgfCBETUdMX1BBUkFNUyk7Ci0JCSAgaWYgKGFsbG9jICE9IE5VTEwpCi0JCSAgICAoKmN1cnJlbnQpLT5uYW1lID0gYWxsb2M7Ci0JCSAgZWxzZQotCQkgICAgKCpjdXJyZW50KS0+bmFtZSA9IG47Ci0JCX0KLQotCSAgICAgIGJmZF9wcmludF9zeW1ib2wgKGN1cl9iZmQsIHN0ZG91dCwgKmN1cnJlbnQsCi0JCQkJYmZkX3ByaW50X3N5bWJvbF9hbGwpOwotCi0JICAgICAgKCpjdXJyZW50KS0+bmFtZSA9IG5hbWU7Ci0JICAgICAgaWYgKGFsbG9jICE9IE5VTEwpCi0JCWZyZWUgKGFsbG9jKTsKLQotCSAgICAgIHByaW50ZiAoIlxuIik7Ci0JICAgIH0KLQl9Ci0gICAgICBjdXJyZW50Kys7Ci0gICAgfQotICBwcmludGYgKCJcbiIpOwotICBwcmludGYgKCJcbiIpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9yZWxvY3MgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXJlbGVudCAqKnJlbHBwOwotICBsb25nIHJlbGNvdW50OwotICBhc2VjdGlvbiAqYTsKLQotICBmb3IgKGEgPSBhYmZkLT5zZWN0aW9uczsgYSAhPSAoYXNlY3Rpb24gKikgTlVMTDsgYSA9IGEtPm5leHQpCi0gICAgewotICAgICAgbG9uZyByZWxzaXplOwotCi0gICAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChhKSkKLQljb250aW51ZTsKLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGEpKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoYSkpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChvbmx5KQotCXsKLQkgIGlmIChzdHJjbXAgKG9ubHksIGEtPm5hbWUpKQotCSAgICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlIGlmICgoYS0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhKTsKLSAgICAgIGlmIChyZWxzaXplIDwgMCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgcHJpbnRmICgiUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbJXNdOiIsIGEtPm5hbWUpOwotCi0gICAgICBpZiAocmVsc2l6ZSA9PSAwKQotCXsKLQkgIHByaW50ZiAoIiAobm9uZSlcblxuIik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotCSAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBhLCByZWxwcCwgc3ltcyk7Ci0JICBpZiAocmVsY291bnQgPCAwKQotCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIGVsc2UgaWYgKHJlbGNvdW50ID09IDApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIgKG5vbmUpXG5cbiIpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJcbiIpOwotCSAgICAgIGR1bXBfcmVsb2Nfc2V0IChhYmZkLCBhLCByZWxwcCwgcmVsY291bnQpOwotCSAgICAgIHByaW50ZiAoIlxuXG4iKTsKLQkgICAgfQotCSAgZnJlZSAocmVscHApOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2R5bmFtaWNfcmVsb2NzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGxvbmcgcmVsc2l6ZTsKLSAgYXJlbGVudCAqKnJlbHBwOwotICBsb25nIHJlbGNvdW50OwotCi0gIHJlbHNpemUgPSBiZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQpOwotICBpZiAocmVsc2l6ZSA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgcHJpbnRmICgiRFlOQU1JQyBSRUxPQ0FUSU9OIFJFQ09SRFMiKTsKLQotICBpZiAocmVsc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAobm9uZSlcblxuIik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVscHAgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7Ci0gICAgICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyAoYWJmZCwgcmVscHAsIGR5bnN5bXMpOwotICAgICAgaWYgKHJlbGNvdW50IDwgMCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGVsc2UgaWYgKHJlbGNvdW50ID09IDApCi0JewotCSAgcHJpbnRmICgiIChub25lKVxuXG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmICgiXG4iKTsKLQkgIGR1bXBfcmVsb2Nfc2V0IChhYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwgcmVscHAsIHJlbGNvdW50KTsKLQkgIHByaW50ZiAoIlxuXG4iKTsKLQl9Ci0gICAgICBmcmVlIChyZWxwcCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9yZWxvY19zZXQgKGFiZmQsIHNlYywgcmVscHAsIHJlbGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFyZWxlbnQgKipyZWxwcDsKLSAgICAgbG9uZyByZWxjb3VudDsKLXsKLSAgYXJlbGVudCAqKnA7Ci0gIGNoYXIgKmxhc3RfZmlsZW5hbWUsICpsYXN0X2Z1bmN0aW9ubmFtZTsKLSAgdW5zaWduZWQgaW50IGxhc3RfbGluZTsKLQotICAvKiBHZXQgY29sdW1uIGhlYWRlcnMgbGluZWQgdXAgcmVhc29uYWJseS4gICovCi0gIHsKLSAgICBzdGF0aWMgaW50IHdpZHRoOwotICAgIGlmICh3aWR0aCA9PSAwKQotICAgICAgewotCWNoYXIgYnVmWzMwXTsKLQlzcHJpbnRmX3ZtYSAoYnVmLCAoYmZkX3ZtYSkgLTEpOwotCXdpZHRoID0gc3RybGVuIChidWYpIC0gNzsKLSAgICAgIH0KLSAgICBwcmludGYgKCJPRkZTRVQgJSpzIFRZUEUgJSpzIFZBTFVFIFxuIiwgd2lkdGgsICIiLCAxMiwgIiIpOwotICB9Ci0KLSAgbGFzdF9maWxlbmFtZSA9IE5VTEw7Ci0gIGxhc3RfZnVuY3Rpb25uYW1lID0gTlVMTDsKLSAgbGFzdF9saW5lID0gMDsKLQotICBmb3IgKHAgPSByZWxwcDsgcmVsY291bnQgJiYgKnAgIT0gKGFyZWxlbnQgKikgTlVMTDsgcCsrLCByZWxjb3VudC0tKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnEgPSAqcDsKLSAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCAqZnVuY3Rpb25uYW1lOwotICAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZTsKLQotICAgICAgaWYgKHN0YXJ0X2FkZHJlc3MgIT0gKGJmZF92bWEpIC0xCi0JICAmJiBxLT5hZGRyZXNzIDwgc3RhcnRfYWRkcmVzcykKLQljb250aW51ZTsKLSAgICAgIGlmIChzdG9wX2FkZHJlc3MgIT0gKGJmZF92bWEpIC0xCi0JICAmJiBxLT5hZGRyZXNzID4gc3RvcF9hZGRyZXNzKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAod2l0aF9saW5lX251bWJlcnMKLQkgICYmIHNlYyAhPSBOVUxMCi0JICAmJiBiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlYywgc3ltcywgcS0+YWRkcmVzcywKLQkJCQkgICAgJmZpbGVuYW1lLCAmZnVuY3Rpb25uYW1lLCAmbGluZSkpCi0JewotCSAgaWYgKGZ1bmN0aW9ubmFtZSAhPSBOVUxMCi0JICAgICAgJiYgKGxhc3RfZnVuY3Rpb25uYW1lID09IE5VTEwKLQkJICB8fCBzdHJjbXAgKGZ1bmN0aW9ubmFtZSwgbGFzdF9mdW5jdGlvbm5hbWUpICE9IDApKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiJXMoKTpcbiIsIGZ1bmN0aW9ubmFtZSk7Ci0JICAgICAgaWYgKGxhc3RfZnVuY3Rpb25uYW1lICE9IE5VTEwpCi0JCWZyZWUgKGxhc3RfZnVuY3Rpb25uYW1lKTsKLQkgICAgICBsYXN0X2Z1bmN0aW9ubmFtZSA9IHhzdHJkdXAgKGZ1bmN0aW9ubmFtZSk7Ci0JICAgIH0KLQkgIGlmIChsaW5lID4gMAotCSAgICAgICYmIChsaW5lICE9IGxhc3RfbGluZQotCQkgIHx8IChmaWxlbmFtZSAhPSBOVUxMCi0JCSAgICAgICYmIGxhc3RfZmlsZW5hbWUgIT0gTlVMTAotCQkgICAgICAmJiBzdHJjbXAgKGZpbGVuYW1lLCBsYXN0X2ZpbGVuYW1lKSAhPSAwKSkpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlczoldVxuIiwgZmlsZW5hbWUgPT0gTlVMTCA/ICI/Pz8iIDogZmlsZW5hbWUsIGxpbmUpOwotCSAgICAgIGxhc3RfbGluZSA9IGxpbmU7Ci0JICAgICAgaWYgKGxhc3RfZmlsZW5hbWUgIT0gTlVMTCkKLQkJZnJlZSAobGFzdF9maWxlbmFtZSk7Ci0JICAgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpCi0JCWxhc3RfZmlsZW5hbWUgPSBOVUxMOwotCSAgICAgIGVsc2UKLQkJbGFzdF9maWxlbmFtZSA9IHhzdHJkdXAgKGZpbGVuYW1lKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHEtPnN5bV9wdHJfcHRyICYmICpxLT5zeW1fcHRyX3B0cikKLQl7Ci0JICBzeW1fbmFtZSA9ICgqKHEtPnN5bV9wdHJfcHRyKSktPm5hbWU7Ci0JICBzZWN0aW9uX25hbWUgPSAoKihxLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5uYW1lOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1fbmFtZSA9IE5VTEw7Ci0JICBzZWN0aW9uX25hbWUgPSBOVUxMOwotCX0KLSAgICAgIGlmIChzeW1fbmFtZSkKLQl7Ci0JICBwcmludGZfdm1hIChxLT5hZGRyZXNzKTsKLQkgIGlmIChxLT5ob3d0by0+bmFtZSkKLQkgICAgcHJpbnRmICgiICUtMTZzICAiLCBxLT5ob3d0by0+bmFtZSk7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoIiAlLTE2ZCAgIiwgcS0+aG93dG8tPnR5cGUpOwotCSAgb2JqZHVtcF9wcmludF9zeW1uYW1lIChhYmZkLCAoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikgTlVMTCwKLQkJCQkgKnEtPnN5bV9wdHJfcHRyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHNlY3Rpb25fbmFtZSA9PSAoQ09OU1QgY2hhciAqKSBOVUxMKQotCSAgICBzZWN0aW9uX25hbWUgPSAiKnVua25vd24qIjsKLQkgIHByaW50Zl92bWEgKHEtPmFkZHJlc3MpOwotCSAgcHJpbnRmICgiICUtMTZzICBbJXNdIiwKLQkJICBxLT5ob3d0by0+bmFtZSwKLQkJICBzZWN0aW9uX25hbWUpOwotCX0KLSAgICAgIGlmIChxLT5hZGRlbmQpCi0JewotCSAgcHJpbnRmICgiKzB4Iik7Ci0JICBwcmludGZfdm1hIChxLT5hZGRlbmQpOwotCX0KLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotfQotDAotLyogVGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBhcmNoaXRlY3R1cmUgbmFtZSArIDEuICAqLwotI2RlZmluZSBMT05HRVNUX0FSQ0ggc2l6ZW9mKCJyczYwMDA6NjAwMCIpCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWVuZGlhbl9zdHJpbmcgKGVuZGlhbikKLSAgICAgZW51bSBiZmRfZW5kaWFuIGVuZGlhbjsKLXsKLSAgaWYgKGVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRykKLSAgICByZXR1cm4gImJpZyBlbmRpYW4iOwotICBlbHNlIGlmIChlbmRpYW4gPT0gQkZEX0VORElBTl9MSVRUTEUpCi0gICAgcmV0dXJuICJsaXR0bGUgZW5kaWFuIjsKLSAgZWxzZQotICAgIHJldHVybiAiZW5kaWFubmVzcyB1bmtub3duIjsKLX0KLQotLyogTGlzdCB0aGUgdGFyZ2V0cyB0aGF0IEJGRCBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQsIGVhY2ggZm9sbG93ZWQKLSAgIGJ5IGl0cyBlbmRpYW5uZXNzIGFuZCB0aGUgYXJjaGl0ZWN0dXJlcyBpdCBzdXBwb3J0cy4gICovCi0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X3RhcmdldF9saXN0ICgpCi17Ci0gIGV4dGVybiBiZmRfdGFyZ2V0ICpiZmRfdGFyZ2V0X3ZlY3RvcltdOwotICBjaGFyICpkdW1teV9uYW1lOwotICBpbnQgdDsKLQotICBkdW1teV9uYW1lID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKLSAgZm9yICh0ID0gMDsgYmZkX3RhcmdldF92ZWN0b3JbdF07IHQrKykKLSAgICB7Ci0gICAgICBiZmRfdGFyZ2V0ICpwID0gYmZkX3RhcmdldF92ZWN0b3JbdF07Ci0gICAgICBiZmQgKmFiZmQgPSBiZmRfb3BlbncgKGR1bW15X25hbWUsIHAtPm5hbWUpOwotICAgICAgaW50IGE7Ci0KLSAgICAgIHByaW50ZiAoIiVzXG4gKGhlYWRlciAlcywgZGF0YSAlcylcbiIsIHAtPm5hbWUsCi0JICAgICAgZW5kaWFuX3N0cmluZyAocC0+aGVhZGVyX2J5dGVvcmRlciksCi0JICAgICAgZW5kaWFuX3N0cmluZyAocC0+Ynl0ZW9yZGVyKSk7Ci0KLSAgICAgIGlmIChhYmZkID09IE5VTEwpCi0JewotCSAgYmZkX25vbmZhdGFsIChkdW1teV9uYW1lKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKCEgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQotCXsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbikKLQkgICAgYmZkX25vbmZhdGFsIChwLT5uYW1lKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgZm9yIChhID0gKGludCkgYmZkX2FyY2hfb2JzY3VyZSArIDE7IGEgPCAoaW50KSBiZmRfYXJjaF9sYXN0OyBhKyspCi0JaWYgKGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCAoZW51bSBiZmRfYXJjaGl0ZWN0dXJlKSBhLCAwKSkKLQkgIHByaW50ZiAoIiAgJXNcbiIsCi0JCSAgYmZkX3ByaW50YWJsZV9hcmNoX21hY2ggKChlbnVtIGJmZF9hcmNoaXRlY3R1cmUpIGEsIDApKTsKLSAgICB9Ci0gIHVubGluayAoZHVtbXlfbmFtZSk7Ci0gIGZyZWUgKGR1bW15X25hbWUpOwotfQotCi0vKiBQcmludCBhIHRhYmxlIHNob3dpbmcgd2hpY2ggYXJjaGl0ZWN0dXJlcyBhcmUgc3VwcG9ydGVkIGZvciBlbnRyaWVzCi0gICBGSVJTVCB0aHJvdWdoIExBU1QtMSBvZiBiZmRfdGFyZ2V0X3ZlY3RvciAodGFyZ2V0cyBhY3Jvc3MsCi0gICBhcmNoaXRlY3R1cmVzIGRvd24pLiAgKi8KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfaW5mb190YWJsZSAoZmlyc3QsIGxhc3QpCi0gICAgIGludCBmaXJzdDsKLSAgICAgaW50IGxhc3Q7Ci17Ci0gIGV4dGVybiBiZmRfdGFyZ2V0ICpiZmRfdGFyZ2V0X3ZlY3RvcltdOwotICBpbnQgdCwgYTsKLSAgY2hhciAqZHVtbXlfbmFtZTsKLQotICAvKiBQcmludCBoZWFkaW5nIG9mIHRhcmdldCBuYW1lcy4gICovCi0gIHByaW50ZiAoIlxuJSpzIiwgKGludCkgTE9OR0VTVF9BUkNILCAiICIpOwotICBmb3IgKHQgPSBmaXJzdDsgdCA8IGxhc3QgJiYgYmZkX3RhcmdldF92ZWN0b3JbdF07IHQrKykKLSAgICBwcmludGYgKCIlcyAiLCBiZmRfdGFyZ2V0X3ZlY3Rvclt0XS0+bmFtZSk7Ci0gIHB1dGNoYXIgKCdcbicpOwotCi0gIGR1bW15X25hbWUgPSBjaG9vc2VfdGVtcF9iYXNlICgpOwotICBmb3IgKGEgPSAoaW50KSBiZmRfYXJjaF9vYnNjdXJlICsgMTsgYSA8IChpbnQpIGJmZF9hcmNoX2xhc3Q7IGErKykKLSAgICBpZiAoc3RyY21wIChiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCAoYSwgMCksICJVTktOT1dOISIpICE9IDApCi0gICAgICB7Ci0JcHJpbnRmICgiJSpzICIsIChpbnQpIExPTkdFU1RfQVJDSCAtIDEsCi0JCWJmZF9wcmludGFibGVfYXJjaF9tYWNoIChhLCAwKSk7Ci0JZm9yICh0ID0gZmlyc3Q7IHQgPCBsYXN0ICYmIGJmZF90YXJnZXRfdmVjdG9yW3RdOyB0KyspCi0JICB7Ci0JICAgIGJmZF90YXJnZXQgKnAgPSBiZmRfdGFyZ2V0X3ZlY3Rvclt0XTsKLQkgICAgYm9vbGVhbiBvayA9IHRydWU7Ci0JICAgIGJmZCAqYWJmZCA9IGJmZF9vcGVudyAoZHVtbXlfbmFtZSwgcC0+bmFtZSk7Ci0KLQkgICAgaWYgKGFiZmQgPT0gTlVMTCkKLQkgICAgICB7Ci0JCWJmZF9ub25mYXRhbCAocC0+bmFtZSk7Ci0JCW9rID0gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIGlmIChvaykKLQkgICAgICB7Ci0JCWlmICghIGJmZF9zZXRfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLQkJICB7Ci0JCSAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pCi0JCSAgICAgIGJmZF9ub25mYXRhbCAocC0+bmFtZSk7Ci0JCSAgICBvayA9IGZhbHNlOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgaWYgKG9rKQotCSAgICAgIHsKLQkJaWYgKCEgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIGEsIDApKQotCQkgIG9rID0gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIGlmIChvaykKLQkgICAgICBwcmludGYgKCIlcyAiLCBwLT5uYW1lKTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaW50IGwgPSBzdHJsZW4gKHAtPm5hbWUpOwotCQl3aGlsZSAobC0tKQotCQkgIHB1dGNoYXIgKCctJyk7Ci0JCXB1dGNoYXIgKCcgJyk7Ci0JICAgICAgfQotCSAgfQotCXB1dGNoYXIgKCdcbicpOwotICAgICAgfQotICB1bmxpbmsgKGR1bW15X25hbWUpOwotICBmcmVlIChkdW1teV9uYW1lKTsKLX0KLQotLyogUHJpbnQgdGFibGVzIG9mIGFsbCB0aGUgdGFyZ2V0LWFyY2hpdGVjdHVyZSBjb21iaW5hdGlvbnMgdGhhdAotICAgQkZEIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydC4gICovCi0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X3RhcmdldF90YWJsZXMgKCkKLXsKLSAgaW50IHQsIGNvbHVtbnM7Ci0gIGV4dGVybiBiZmRfdGFyZ2V0ICpiZmRfdGFyZ2V0X3ZlY3RvcltdOwotICBjaGFyICpjb2x1bTsKLQotICBjb2x1bW5zID0gMDsKLSAgY29sdW0gPSBnZXRlbnYgKCJDT0xVTU5TIik7Ci0gIGlmIChjb2x1bSAhPSBOVUxMKQotICAgIGNvbHVtbnMgPSBhdG9pIChjb2x1bSk7Ci0gIGlmIChjb2x1bW5zID09IDApCi0gICAgY29sdW1ucyA9IDgwOwotCi0gIHQgPSAwOwotICB3aGlsZSAoYmZkX3RhcmdldF92ZWN0b3JbdF0gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgb2xkdCA9IHQsIHdpZDsKLQotICAgICAgd2lkID0gTE9OR0VTVF9BUkNIICsgc3RybGVuIChiZmRfdGFyZ2V0X3ZlY3Rvclt0XS0+bmFtZSkgKyAxOwotICAgICAgKyt0OwotICAgICAgd2hpbGUgKHdpZCA8IGNvbHVtbnMgJiYgYmZkX3RhcmdldF92ZWN0b3JbdF0gIT0gTlVMTCkKLQl7Ci0JICBpbnQgbmV3d2lkOwotCi0JICBuZXd3aWQgPSB3aWQgKyBzdHJsZW4gKGJmZF90YXJnZXRfdmVjdG9yW3RdLT5uYW1lKSArIDE7Ci0JICBpZiAobmV3d2lkID49IGNvbHVtbnMpCi0JICAgIGJyZWFrOwotCSAgd2lkID0gbmV3d2lkOwotCSAgKyt0OwotCX0KLSAgICAgIGRpc3BsYXlfaW5mb190YWJsZSAob2xkdCwgdCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9pbmZvICgpCi17Ci0gIHByaW50ZiAoXygiQkZEIGhlYWRlciBmaWxlIHZlcnNpb24gJXNcbiIpLCBCRkRfVkVSU0lPTik7Ci0gIGRpc3BsYXlfdGFyZ2V0X2xpc3QgKCk7Ci0gIGRpc3BsYXlfdGFyZ2V0X3RhYmxlcyAoKTsKLX0KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBjOwotICBjaGFyICp0YXJnZXQgPSBkZWZhdWx0X3RhcmdldDsKLSAgYm9vbGVhbiBzZWVuZmxhZyA9IGZhbHNlOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gKmFyZ3Y7Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBTVEFSVF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lLCAwKTsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgInBpYjptOlZDZERsZmFoclJ0VHhzU2o6d0U6IiwKLQkJCSAgIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkKLQkgIT0gRU9GKQotICAgIHsKLSAgICAgIGlmIChjICE9ICdsJyAmJiBjICE9IE9QVElPTl9TVEFSVF9BRERSRVNTICYmIGMgIT0gT1BUSU9OX1NUT1BfQUREUkVTUykKLQlzZWVuZmxhZyA9IHRydWU7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgMDoKLQkgIGJyZWFrOwkJLyogd2UndmUgYmVlbiBnaXZlbiBhIGxvbmcgb3B0aW9uICovCi0JY2FzZSAnbSc6Ci0JICBtYWNoaW5lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnaic6Ci0JICBvbmx5ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnbCc6Ci0JICB3aXRoX2xpbmVfbnVtYmVycyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdiJzoKLQkgIHRhcmdldCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ2YnOgotCSAgZHVtcF9maWxlX2hlYWRlciA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQkgIGZvcm1hdHNfaW5mbyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdwJzoKLQkgIGR1bXBfcHJpdmF0ZV9oZWFkZXJzID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgZHVtcF9wcml2YXRlX2hlYWRlcnMgPSAxOwotCSAgZHVtcF9zeW10YWIgPSAxOwotCSAgZHVtcF9yZWxvY19pbmZvID0gMTsKLQkgIGR1bXBfZmlsZV9oZWFkZXIgPSB0cnVlOwotCSAgZHVtcF9hcl9oZHJzID0gMTsKLQkgIGR1bXBfc2VjdGlvbl9oZWFkZXJzID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgZHVtcF9zeW10YWIgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnVCc6Ci0JICBkdW1wX2R5bmFtaWNfc3ltdGFiID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ0MnOgotCSAgZG9fZGVtYW5nbGUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBkaXNhc3NlbWJsZSA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdEJzoKLQkgIGRpc2Fzc2VtYmxlID0gZGlzYXNzZW1ibGVfYWxsID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotCSAgZGlzYXNzZW1ibGUgPSB0cnVlOwotCSAgd2l0aF9zb3VyY2VfY29kZSA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGR1bXBfc2VjdGlvbl9jb250ZW50cyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdyJzoKLQkgIGR1bXBfcmVsb2NfaW5mbyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdSJzoKLQkgIGR1bXBfZHluYW1pY19yZWxvY19pbmZvID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2EnOgotCSAgZHVtcF9hcl9oZHJzID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgZHVtcF9zZWN0aW9uX2hlYWRlcnMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnSCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQljYXNlICdWJzoKLQkgIHNob3dfdmVyc2lvbiA9IDE7Ci0JICBicmVhazsKLQljYXNlICd3JzoKLQkgIHdpZGVfb3V0cHV0ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0FESlVTVF9WTUE6Ci0JICBhZGp1c3Rfc2VjdGlvbl92bWEgPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tYWRqdXN0LXZtYSIpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU1RBUlRfQUREUkVTUzoKLQkgIHN0YXJ0X2FkZHJlc3MgPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tc3RhcnQtYWRkcmVzcyIpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU1RPUF9BRERSRVNTOgotCSAgc3RvcF9hZGRyZXNzID0gcGFyc2Vfdm1hIChvcHRhcmcsICItLXN0b3AtYWRkcmVzcyIpOwotCSAgYnJlYWs7Ci0JY2FzZSAnRSc6Ci0JICBpZiAoc3RyY21wIChvcHRhcmcsICJCIikgPT0gMCkKLQkgICAgZW5kaWFuID0gQkZEX0VORElBTl9CSUc7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgIkwiKSA9PSAwKQotCSAgICBlbmRpYW4gPSBCRkRfRU5ESUFOX0xJVFRMRTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVucmVjb2duaXplZCAtRSBvcHRpb25cbiIpLCBwcm9ncmFtX25hbWUpOwotCSAgICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9FTkRJQU46Ci0JICBpZiAoc3RybmNtcCAob3B0YXJnLCAiYmlnIiwgc3RybGVuIChvcHRhcmcpKSA9PSAwKQotCSAgICBlbmRpYW4gPSBCRkRfRU5ESUFOX0JJRzsKLQkgIGVsc2UgaWYgKHN0cm5jbXAgKG9wdGFyZywgImxpdHRsZSIsIHN0cmxlbiAob3B0YXJnKSkgPT0gMCkKLQkgICAgZW5kaWFuID0gQkZEX0VORElBTl9MSVRUTEU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bnJlY29nbml6ZWQgLS1lbmRpYW4gdHlwZSBgJXMnXG4iKSwKLQkJICAgICAgcHJvZ3JhbV9uYW1lLCBvcHRhcmcpOwotCSAgICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JfQotICAgIH0KLQotICBpZiAoc2hvd192ZXJzaW9uKQotICAgIHByaW50X3ZlcnNpb24gKCJvYmpkdW1wIik7Ci0KLSAgaWYgKHNlZW5mbGFnID09IGZhbHNlKQotICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCi0gIGlmIChmb3JtYXRzX2luZm8pCi0gICAgewotICAgICAgZGlzcGxheV9pbmZvICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChvcHRpbmQgPT0gYXJnYykKLQlkaXNwbGF5X2ZpbGUgKCJhLm91dCIsIHRhcmdldCk7Ci0gICAgICBlbHNlCi0JZm9yICg7IG9wdGluZCA8IGFyZ2M7KQotCSAgZGlzcGxheV9maWxlIChhcmd2W29wdGluZCsrXSwgdGFyZ2V0KTsKLSAgICB9Ci0KLSAgRU5EX1BST0dSRVNTIChwcm9ncmFtX25hbWUpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcG8vTWFrZS1pbiBiL2JpbnV0aWxzL3BvL01ha2UtaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTJkYjEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcG8vTWFrZS1pbgorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBwcm9ncmFtIHNvdXJjZSBkaXJlY3RvcnkgaW4gR05VIE5MUyB1dGlsaXRpZXMgcGFja2FnZS4KLSMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi1QQUNLQUdFID0gQFBBQ0tBR0VACi1WRVJTSU9OID0gQFZFUlNJT05ACi0KLVNIRUxMID0gL2Jpbi9zaAotQFNFVF9NQUtFQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1kYXRhZGlyID0gJChwcmVmaXgpL0BEQVRBRElSTkFNRUAKLWxvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCi1nbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCi1nZXR0ZXh0c3JjZGlyID0gJChwcmVmaXgpL3NoYXJlL2dldHRleHQvcG8KLXN1YmRpciA9IHBvCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi0KLUNDID0gQENDQAotR0VOQ0FUID0gQEdFTkNBVEAKLUdNU0dGTVQgPSBQQVRIPS4uL3NyYzokJFBBVEggQEdNU0dGTVRACi1NU0dGTVQgPSBATVNHRk1UQAotWEdFVFRFWFQgPSBQQVRIPS4uL3NyYzokJFBBVEggQFhHRVRURVhUQAotTVNHTUVSR0UgPSBQQVRIPS4uL3NyYzokJFBBVEggbXNnbWVyZ2UKLQotREVGUyA9IEBERUZTQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotCi1JTkNMVURFUyA9IC1JLi4gLUkkKHRvcF9zcmNkaXIpL2ludGwKLQotQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKLQotU09VUkNFUyA9IGNhdC1pZC10YmwuYwotUE9GSUxFUyA9IEBQT0ZJTEVTQAotR01PRklMRVMgPSBAR01PRklMRVNACi1ESVNURklMRVMgPSBDaGFuZ2VMb2cgTWFrZWZpbGUuaW4uaW4gUE9URklMRVMuaW4gJChQQUNLQUdFKS5wb3QgXAotc3RhbXAtY2F0LWlkICQoUE9GSUxFUykgJChHTU9GSUxFUykgJChTT1VSQ0VTKQotCi1QT1RGSUxFUyA9IFwKLQotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5wbyAucG94IC5nbW8gLm1vIC5tc2cgLmNhdAotCi0uYy5vOgotCSQoQ09NUElMRSkgJDwKLQotLnBvLnBveDoKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JJChNU0dNRVJHRSkgJDwgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IC1vICQqLnBveAotCi0ucG8ubW86Ci0JJChNU0dGTVQpIC1vICRAICQ8Ci0KLS5wby5nbW86Ci0JZmlsZT0kKHNyY2RpcikvYGVjaG8gJCogfCBzZWQgJ3MsLiovLCwnYC5nbW8gXAotCSAgJiYgcm0gLWYgJCRmaWxlICYmICQoR01TR0ZNVCkgLW8gJCRmaWxlICQ8Ci0KLS5wby5jYXQ6Ci0Jc2VkIC1mIC4uL2ludGwvcG8ybXNnLnNlZCA8ICQ8ID4gJCoubXNnIFwKLQkgICYmIHJtIC1mICRAICYmICQoR0VOQ0FUKSAkQCAkKi5tc2cKLQotCi1hbGw6IGFsbC1AVVNFX05MU0AKLQotYWxsLXllczogJChDQVRBTE9HUykgQE1BSU5UQCAkKFBBQ0tBR0UpLnBvdAotYWxsLW5vOgotCi0kKHNyY2RpcikvJChQQUNLQUdFKS5wb3Q6ICQoUE9URklMRVMpCi0JJChYR0VUVEVYVCkgLS1kZWZhdWx0LWRvbWFpbj0kKFBBQ0tBR0UpIC0tZGlyZWN0b3J5PSQodG9wX3NyY2RpcikgXAotCSAgLS1hZGQtY29tbWVudHMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKLQkgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4KLQlybSAtZiAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQltdiAkKFBBQ0tBR0UpLnBvICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCi0kKHNyY2RpcikvY2F0LWlkLXRibC5jOiBzdGFtcC1jYXQtaWQ7IEA6Ci0kKHNyY2Rpcikvc3RhbXAtY2F0LWlkOiAkKFBBQ0tBR0UpLnBvdAotCXJtIC1mIGNhdC1pZC10YmwudG1wCi0Jc2VkIC1mIC4uL2ludGwvcG8ydGJsLnNlZCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgXAotCQl8IHNlZCAtZSAicy9AUEFDS0FHRSBOQU1FQC8kKFBBQ0tBR0UpLyIgPiBjYXQtaWQtdGJsLnRtcAotCWlmIGNtcCAtcyBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyB0aGVuIFwKLQkgIHJtIGNhdC1pZC10YmwudG1wOyBcCi0JZWxzZSBcCi0JICBlY2hvIGNhdC1pZC10YmwuYyBjaGFuZ2VkOyBcCi0JICBybSAtZiAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JICBtdiBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JZmkKLQljZCAkKHNyY2RpcikgJiYgcm0gLWYgc3RhbXAtY2F0LWlkICYmIGVjaG8gdGltZXN0YW1wID4gc3RhbXAtY2F0LWlkCi0KLQotaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQotaW5zdGFsbC1leGVjOgotaW5zdGFsbC1pbmZvOgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtQFVTRV9OTFNACi1pbnN0YWxsLWRhdGEtbm86IGFsbAotaW5zdGFsbC1kYXRhLXllczogYWxsCi0JaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICQoTUtJTlNUQUxMRElSUykgJChkYXRhZGlyKTsgXAotCWVsc2UgXAotCSAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZGF0YWRpcik7IFwKLQlmaQotCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgY2FzZSAiJCRjYXQiIGluIFwKLQkgICAgKi5nbW8pIGRlc3RkaXI9JChnbnVsb2NhbGVkaXIpOzsgXAotCSAgICAqKSAgICAgZGVzdGRpcj0kKGxvY2FsZWRpcik7OyBcCi0JICBlc2FjOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIGRpcj0kJGRlc3RkaXIvJCRsYW5nL0xDX01FU1NBR0VTOyBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQkZGlyOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQkZGlyOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0IGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZWxzZSBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0Lm07IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQubSAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQubSBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgZWxzZSBcCi0JICAgIGlmIHRlc3QgLXIgJChzcmNkaXIpLyQkY2F0Lm0gOyB0aGVuIFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0Lm0gXAotCQkkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICAgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5pbiBcCi0JCQkgICQoZ2V0dGV4dHNyY2RpcikvTWFrZWZpbGUuaW4uaW47IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQotIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgotaW5zdGFsbGNoZWNrOgotCi11bmluc3RhbGw6Ci0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQlkb25lCi0Jcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS9wby1NYWtlZmlsZS5pbi5pbgotCi1jaGVjazogYWxsCi0KLWNhdC1pZC10YmwubzogLi4vaW50bC9saWJnZXR0ZXh0LmgKLQotZHZpIGluZm8gdGFncyBUQUdTIElEOgotCi1tb3N0bHljbGVhbjoKLQlybSAtZiBjb3JlIGNvcmUuKiAqLnBveCAkKFBBQ0tBR0UpLnBvICoub2xkLnBvIGNhdC1pZC10YmwudG1wCi0Jcm0gLWZyICoubwotCi1jbGVhbjogbW9zdGx5Y2xlYW4KLQotZGlzdGNsZWFuOiBjbGVhbgotCXJtIC1mIE1ha2VmaWxlIE1ha2VmaWxlLmluIFBPVEZJTEVTICoubW8gKi5tc2cgKi5jYXQgKi5jYXQubQotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQlybSAtZiAkKEdNT0ZJTEVTKQotCi1kaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotZGlzdCBkaXN0ZGlyOiB1cGRhdGUtcG8gJChESVNURklMRVMpCi0JZGlzdHM9IiQoRElTVEZJTEVTKSI7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCi0JZG9uZQotCi11cGRhdGUtcG86IE1ha2VmaWxlCi0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCVBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgXAotCWNkICQoc3JjZGlyKTsgXAotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIG12ICQkbGFuZy5wbyAkJGxhbmcub2xkLnBvOyBcCi0JICBlY2hvICIkJGxhbmc6IjsgXAotCSAgaWYgJChNU0dNRVJHRSkgJCRsYW5nLm9sZC5wbyAkKFBBQ0tBR0UpLnBvdCAtbyAkJGxhbmcucG87IHRoZW4gXAotCSAgICBybSAtZiAkJGxhbmcub2xkLnBvOyBcCi0JICBlbHNlIFwKLQkgICAgZWNobyAibXNnbWVyZ2UgZm9yICQkY2F0IGZhaWxlZCEiOyBcCi0JICAgIHJtIC1mICQkbGFuZy5wbzsgXAotCSAgICBtdiAkJGxhbmcub2xkLnBvICQkbGFuZy5wbzsgXAotCSAgZmk7IFwKLQlkb25lCi0KLVBPVEZJTEVTOiBQT1RGSUxFUy5pbgotCSggaWYgdGVzdCAneCQoc3JjZGlyKScgIT0gJ3guJzsgdGhlbiBcCi0JICAgIHBvc3JjcHJlZml4PSckKHRvcF9zcmNkaXIpLyc7IFwKLQkgIGVsc2UgXAotCSAgICBwb3NyY3ByZWZpeD0iLi4vIjsgXAotCSAgZmk7IFwKLQkgIHJtIC1mICRALXQgJEAgXAotCSAgICAmJiAoc2VkIC1lICcvXiMvZCcgLWUgJy9eWyAJXSokJC9kJyBcCi0JCSAgICAtZSAic0AuKkAJJCRwb3NyY3ByZWZpeCYgXFxcXEAiIDwgJChzcmNkaXIpLyRALmluIFwKLQkJfCBzZWQgLWUgJyQkcy9cXCQkLy8nKSA+ICRALXQgXAotCSAgICAmJiBjaG1vZCBhLXcgJEAtdCBcCi0JICAgICYmIG12ICRALXQgJEAgKQotCi1QT1RGSUxFUy5pbjogQE1BSU5UQCAuLi9NYWtlZmlsZQotCWNkIC4uICYmICQoTUFLRSkgcG8vUE9URklMRVMuaW4KLQotTWFrZWZpbGU6IE1ha2UtaW4gLi4vY29uZmlnLnN0YXR1cyBQT1RGSUxFUwotCWNkIC4uIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvTWFrZWZpbGUuaW46JChzdWJkaXIpL01ha2UtaW4gXAotCSAgICAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9iaW51dGlscy9wby9QT1RGSUxFUy5pbiBiL2JpbnV0aWxzL3BvL1BPVEZJTEVTLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2YzODYwLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3BvL1BPVEZJTEVTLmluCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotcmVhZGVsZi5jCi1hZGRyMmxpbmUuYwotYXIuYwotYXJzdXAuYwotYXJzdXAuaAotYnVjb21tLmMKLWJ1Y29tbS5oCi1idWRiZy5oCi1jb2ZmZHVtcC5jCi1jb2ZmZ3Jvay5jCi1jb2ZmZ3Jvay5oCi1kZWJ1Zy5jCi1kZWJ1Zy5oCi1kbGx0b29sLmMKLWRsbHRvb2wuaAotZGxsd3JhcC5jCi1keW4tc3RyaW5nLmMKLWR5bi1zdHJpbmcuaAotZmlsZW1vZGUuYwotaWVlZS5jCi1pcy1yYW5saWIuYwotaXMtc3RyaXAuYwotbWF5YmUtcmFubGliLmMKLW1heWJlLXN0cmlwLmMKLW5sbWNvbnYuYwotbmxtY29udi5oCi1ubS5jCi1ub3QtcmFubGliLmMKLW5vdC1zdHJpcC5jCi1vYmpjb3B5LmMKLW9iamR1bXAuYwotcHJkYmcuYwotcmRjb2ZmLmMKLXJkZGJnLmMKLXJlbmFtZS5jCi1yZXNiaW4uYwotcmVzY29mZi5jCi1yZXNyYy5jCi1yZXNyZXMuYwotc2l6ZS5jCi1zcmNvbnYuYwotc3RhYnMuYwotc3RyaW5ncy5jCi1zeXNkdW1wLmMKLXZlcnNpb24uYwotd2luZHJlcy5jCi13aW5kcmVzLmgKLXdpbmR1bmkuYwotd2luZHVuaS5oCi13cnN0YWJzLmMKLXRlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5oCi10ZXN0c3VpdGUvYmludXRpbHMtYWxsL3Rlc3Rwcm9nLmMKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3BvL2JpbnV0aWxzLnBvdCBiL2JpbnV0aWxzL3BvL2JpbnV0aWxzLnBvdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlYjM4My4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9wby9iaW51dGlscy5wb3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQzICswLDAgQEAKLSMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KLSMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgotIwotIywgZnV6enkKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAxOTk5LTA0LTI2IDEwOjExLTA2MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKLSJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgotCi0jOiBhZGRyMmxpbmUuYzo3NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVXNhZ2U6ICVzIFstQ2ZzSFZdIFstYiBiZmRuYW1lXSBbLS10YXJnZXQ9YmZkbmFtZV1cbiIKLSIgICAgICAgWy1lIGV4ZWN1dGFibGVdIFstLWV4ZT1leGVjdXRhYmxlXSBbLS1kZW1hbmdsZV1cbiIKLSIgICAgICAgWy0tYmFzZW5hbWVzXSBbLS1mdW5jdGlvbnNdIFthZGRyIGFkZHIgLi4uXVxuIgotbXNnc3RyICIiCi0KLSM6IGFkZHIybGluZS5jOjgzIGFyLmM6MjU1IG5sbWNvbnYuYzoxMTQxIG5tLmM6MzA0IG9iamNvcHkuYzozMTggb2JqY29weS5jOjMzNwotIzogb2JqZHVtcC5jOjIzNiByZWFkZWxmLmM6MTEzMyBzaXplLmM6ODkgc3RyaW5ncy5jOjUxMiB3aW5kcmVzLmM6NzIzCi1tc2dpZCAiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iCi1tc2dzdHIgIiIKLQotIzogYWRkcjJsaW5lLmM6MjQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW4gbm90IGdldCBhZGRyZXNzZXMgZnJvbSBhcmNoaXZlIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIGVudHJ5ICVzIGluIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVXNhZ2U6ICVzIFstXXtkbXBxcnN0eH1bYWJjaWxvc1N1dlZdIFttZW1iZXItbmFtZV0gYXJjaGl2ZS1maWxlIGZpbGUuLi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIyNgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAgJXMgLU0gWzxtcmktc2NyaXB0XVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjI3Ci1tc2dpZCAiIGNvbW1hbmRzOlxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjI4Ci1tc2dpZCAiICBkICAgICAgICAgICAgLSBkZWxldGUgZmlsZShzKSBmcm9tIHRoZSBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMjkKLW1zZ2lkICIgIG1bYWJdICAgICAgICAtIG1vdmUgZmlsZShzKSBpbiB0aGUgYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjMwCi1tc2dpZCAiICBwICAgICAgICAgICAgLSBwcmludCBmaWxlKHMpIGZvdW5kIGluIHRoZSBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzEKLW1zZ2lkICIgIHFbZl0gICAgICAgICAtIHF1aWNrIGFwcGVuZCBmaWxlKHMpIHRvIHRoZSBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzIKLW1zZ2lkICIiCi0iICByW2FiXVtmXVt1XSAgLSByZXBsYWNlIGV4aXN0aW5nIG9yIGluc2VydCBuZXcgZmlsZShzKSBpbnRvIHRoZSBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzMKLW1zZ2lkICIgIHQgICAgICAgICAgICAtIGRpc3BsYXkgY29udGVudHMgb2YgYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjM0Ci1tc2dpZCAiICB4W29dICAgICAgICAgLSBleHRyYWN0IGZpbGUocykgZnJvbSB0aGUgYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjM1Ci1tc2dpZCAiIGNvbW1hbmQgc3BlY2lmaWMgbW9kaWZpZXJzOlxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjM2Ci1tc2dpZCAiICBbYV0gICAgICAgICAgLSBwdXQgZmlsZShzKSBhZnRlciBbbWVtYmVyLW5hbWVdXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzcKLW1zZ2lkICIgIFtiXSAgICAgICAgICAtIHB1dCBmaWxlKHMpIGJlZm9yZSBbbWVtYmVyLW5hbWVdIChzYW1lIGFzIFtpXSlcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIzOAotbXNnaWQgIiAgW2ZdICAgICAgICAgIC0gdHJ1bmNhdGUgaW5zZXJ0ZWQgZmlsZSBuYW1lc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjM5Ci1tc2dpZCAiICBbb10gICAgICAgICAgLSBwcmVzZXJ2ZSBvcmlnaW5hbCBkYXRlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjQwCi1tc2dpZCAiIgotIiAgW3VdICAgICAgICAgIC0gb25seSByZXBsYWNlIGZpbGVzIHRoYXQgYXJlIG5ld2VyIHRoYW4gY3VycmVudCBhcmNoaXZlICIKLSJjb250ZW50c1xuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjQxCi1tc2dpZCAiIGdlbmVyaWMgbW9kaWZpZXJzOlxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjQyCi1tc2dpZCAiICBbY10gICAgICAgICAgLSBkbyBub3Qgd2FybiBpZiB0aGUgbGlicmFyeSBoYWQgdG8gYmUgY3JlYXRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjQzCi1tc2dpZCAiICBbc10gICAgICAgICAgLSBjcmVhdGUgYW4gYXJjaGl2ZSBpbmRleCAoY2YuIHJhbmxpYilcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI0NAotbXNnaWQgIiAgW1NdICAgICAgICAgIC0gZG8gbm90IGJ1aWxkIGEgc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNDUKLW1zZ2lkICIgIFt2XSAgICAgICAgICAtIGJlIHZlcmJvc2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI0NgotbXNnaWQgIiAgW1ZdICAgICAgICAgIC0gZGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2FnZTogJXMgWy12Vl0gYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6NDMxCi1tc2dpZCAidHdvIGRpZmZlcmVudCBvcGVyYXRpb24gb3B0aW9ucyBzcGVjaWZpZWQiCi1tc2dzdHIgIiIKLQotIzogYXIuYzo1MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGlsbGVnYWwgb3B0aW9uIC0tICVjXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzo1MzIKLW1zZ2lkICJubyBvcGVyYXRpb24gc3BlY2lmaWVkIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6NTM1Ci1tc2dpZCAiYHUnIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aXRoIHRoZSBgcicgb3B0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjYxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW50ZXJuYWwgZXJyb3IgLS0gdGhpcyBvcHRpb24gbm90IGltcGxlbWVudGVkXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzo3MzAgYXIuYzo3ODIgYXIuYzoxMjEyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIHN0YXQgZXJyb3Igb24gJXMiCi1tc2dzdHIgIiIKLQotIzogYXIuYzo3MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIjxtZW1iZXIgJXM+XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzo3NTEgYXIuYzo4MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgaXMgbm90IGEgdmFsaWQgYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjc4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzdGF0IHJldHVybnMgbmVnYXRpdmUgc2l6ZSBmb3IgJXMiCi1tc2dzdHIgIiIKLQotIzogYXIuYzo5MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgaXMgbm90IGFuIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogYXIuYzo5MTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNyZWF0aW5nICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoxMTEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIk5vIG1lbWJlciBuYW1lZCBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoxMTYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBlbnRyeSAlcyBpbiBhcmNoaXZlICVzIVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MTMyMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gYXJjaGl2ZSBtYXAgdG8gdXBkYXRlIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTm8gZW50cnkgJXMgaW4gYXJjaGl2ZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjExOAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBvcGVuIGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjE2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3Qgb3BlbiBvdXRwdXQgYXJjaGl2ZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6MTc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBDYW4ndCBvcGVuIGlucHV0IGFyY2hpdmUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjE4NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZmlsZSAlcyBpcyBub3QgYW4gYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6MjI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBvdXRwdXQgYXJjaGl2ZSBzcGVjaWZpZWQgeWV0XG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzoyNDUgYXJzdXAuYzoyODAgYXJzdXAuYzozMTYgYXJzdXAuYzozMzYgYXJzdXAuYzozOTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIG9wZW4gb3V0cHV0IGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjI1MyBhcnN1cC5jOjM1NCBhcnN1cC5jOjM3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuJ3Qgb3BlbiBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzozMDEgYXJzdXAuYzozNzAgYXJzdXAuYzo0NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbid0IGZpbmQgbW9kdWxlIGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjQwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJDdXJyZW50IG9wZW4gYXJjaGl2ZSBpcyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6NDI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBvcGVuICBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYnVjb21tLmM6MTM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IHNldCBCRkQgZGVmYXVsdCB0YXJnZXQgdG8gYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogYnVjb21tLmM6MTUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBNYXRjaGluZyBmb3JtYXRzOiIKLW1zZ3N0ciAiIgotCi0jOiBidWNvbW0uYzoxNjgKLW1zZ2lkICJTdXBwb3J0ZWQgdGFyZ2V0czoiCi1tc2dzdHIgIiIKLQotIzogYnVjb21tLmM6MTcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzdXBwb3J0ZWQgdGFyZ2V0czoiCi1tc2dzdHIgIiIKLQotIzogYnVjb21tLmM6MjYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiYWQgbnVtYmVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmZHVtcC5jOjk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiNsaW5lcyAlZCAiCi1tc2dzdHIgIiIKLQotIzogY29mZmR1bXAuYzo0NTYgc3lzZHVtcC5jOjcxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogUHJpbnQgYSBodW1hbiByZWFkYWJsZSBpbnRlcnByZXRhdGlvbiBvZiBhIFNZU1JPRkYgb2JqZWN0IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmZHVtcC5jOjQ5OCBzcmNvbnYuYzoxOTQwIHN5c2R1bXAuYzo3NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR05VICVzIHZlcnNpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmZHVtcC5jOjUxNiBzcmNvbnYuYzoxOTc3IHN5c2R1bXAuYzo3NzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIGlucHV0IGZpbGUgc3BlY2lmaWVkXG4iCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo2NTMKLW1zZ2lkICJkZWJ1Z19hZGRfdG9fY3VycmVudF9uYW1lc3BhY2U6IG5vIGN1cnJlbnQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjczNgotbXNnaWQgImRlYnVnX3N0YXJ0X3NvdXJjZTogbm8gZGVidWdfc2V0X2ZpbGVuYW1lIGNhbGwiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo3OTUKLW1zZ2lkICJkZWJ1Z19yZWNvcmRfZnVuY3Rpb246IG5vIGRlYnVnX3NldF9maWxlbmFtZSBjYWxsIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6ODUxCi1tc2dpZCAiZGVidWdfcmVjb3JkX3BhcmFtZXRlcjogbm8gY3VycmVudCBmdW5jdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjg4NQotbXNnaWQgImRlYnVnX2VuZF9mdW5jdGlvbjogbm8gY3VycmVudCBmdW5jdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjg5MQotbXNnaWQgImRlYnVnX2VuZF9mdW5jdGlvbjogc29tZSBibG9ja3Mgd2VyZSBub3QgY2xvc2VkIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6OTIxCi1tc2dpZCAiZGVidWdfc3RhcnRfYmxvY2s6IG5vIGN1cnJlbnQgYmxvY2siCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo5NTkKLW1zZ2lkICJkZWJ1Z19lbmRfYmxvY2s6IG5vIGN1cnJlbnQgYmxvY2siCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo5NjYKLW1zZ2lkICJkZWJ1Z19lbmRfYmxvY2s6IGF0dGVtcHQgdG8gY2xvc2UgdG9wIGxldmVsIGJsb2NrIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6OTkyCi1tc2dpZCAiZGVidWdfcmVjb3JkX2xpbmU6IG5vIGN1cnJlbnQgdW5pdCIKLW1zZ3N0ciAiIgotCi0jLiBGSVhNRQotIzogZGVidWcuYzoxMDQ2Ci1tc2dpZCAiZGVidWdfc3RhcnRfY29tbW9uX2Jsb2NrOiBub3QgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIy4gRklYTUUKLSM6IGRlYnVnLmM6MTA1OAotbXNnaWQgImRlYnVnX2VuZF9jb21tb25fYmxvY2s6IG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jLiBGSVhNRS4KLSM6IGRlYnVnLmM6MTE1MgotbXNnaWQgImRlYnVnX3JlY29yZF9sYWJlbCBub3QgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoxMTc4Ci1tc2dpZCAiZGVidWdfcmVjb3JkX3ZhcmlhYmxlOiBubyBjdXJyZW50IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoxMTk0Ci1tc2dpZCAiZGVidWdfcmVjb3JkX3ZhcmlhYmxlOiBubyBjdXJyZW50IGJsb2NrIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MTc2NAotbXNnaWQgImRlYnVnX21ha2VfdW5kZWZpbmVkX3R5cGU6IHVuc3VwcG9ydGVkIGtpbmQiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoxOTcwCi1tc2dpZCAiZGVidWdfbmFtZV90eXBlOiBubyBjdXJyZW50IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoyMDE4Ci1tc2dpZCAiZGVidWdfdGFnX3R5cGU6IG5vIGN1cnJlbnQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjIwMjYKLW1zZ2lkICJkZWJ1Z190YWdfdHlwZTogZXh0cmEgdGFnIGF0dGVtcHRlZCIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjIwNjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogY2hhbmdpbmcgdHlwZSBzaXplIGZyb20gJWQgdG8gJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjIwOTAKLW1zZ2lkICJkZWJ1Z19maW5kX25hbWVkX3R5cGU6IG5vIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdCIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjIxOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVidWdfZ2V0X3JlYWxfdHlwZTogY2lyY3VsYXIgZGVidWcgaW5mb3JtYXRpb24gZm9yICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoyNjYzCi1tc2dpZCAiZGVidWdfd3JpdGVfdHlwZTogaWxsZWdhbCB0eXBlIGVuY291bnRlcmVkIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo2MjcgZGxsdG9vbC5jOjY0NiBkbGx0b29sLmM6NjY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGVycm9yOiBVbmtub3duIG1hY2hpbmUgdHlwZTogJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6NzAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IG9wZW4gZGVmIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo3MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUHJvY2Vzc2luZyBkZWYgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjcwOQotbXNnaWQgIlByb2Nlc3NlZCBkZWYgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6NzM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bnRheCBlcnJvciBpbiBkZWYgZmlsZSAlczolZFxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo3NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTkFNRTogJXMgYmFzZTogJXgiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjc3MAotbXNnaWQgIkNhbid0IGhhdmUgTElCUkFSWSBhbmQgTkFNRVxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo3ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTElCUkFSWTogJXMgYmFzZTogJXgiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjc4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3QgaGF2ZSBMSUJSQVJZIGFuZCBOQU1FXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjEwNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2FpdDogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjEwNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3VicHJvY2VzcyBnb3QgZmF0YWwgc2lnbmFsICVkIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxMDU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxMDg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN1Y2tpbmcgaW4gaW5mbyBmcm9tIC5kcmVjdGl2ZSBzZWN0aW9uIGluICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjExOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXhjbHVkaW5nIHN5bWJvbDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTI5MiBkbGx0b29sLmM6MTMwMyBubS5jOjkwMiBubS5jOjkxMyBvYmpkdW1wLmM6Mzc5IG9iamR1bXAuYzozOTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jLiBGSVhNRTogd2Ugb3VnaHQgdG8gcmVhZCBpbiBhbmQgYmxvY2sgb3V0IHRoZSBiYXNlIHJlbG9jYXRpb25zCi0jOiBkbGx0b29sLmM6MTMzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogRG9uZSByZWFkaW5nICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjEzNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5hYmxlIHRvIG9wZW4gb2JqZWN0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxMzQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlNjYW5uaW5nIG9iamVjdCBmaWxlICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxNDM0Ci1tc2dpZCAiQWRkaW5nIGV4cG9ydHMgdG8gb3V0cHV0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE0NzkKLW1zZ2lkICJBZGRlZCBleHBvcnRzIHRvIG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxNTg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkdlbmVyYXRpbmcgZXhwb3J0IGZpbGU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE1OTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGFzc2VtYmxlciBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTU5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJPcGVuZWQgdGVtcG9yYXJ5IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxODI4Ci1tc2dpZCAiR2VuZXJhdGVkIGV4cG9ydHMgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MjA4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJiZmRfb3BlbiBmYWlsZWQgb3BlbiBzdHViIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyMDg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNyZWF0aW5nIHN0dWIgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI1OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3Qgb3BlbiAubGliIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyNTk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNyZWF0aW5nIGxpYnJhcnkgZmlsZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MjY1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZGVsZXRlICVzOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyNjU2Ci1tc2dpZCAiQ3JlYXRlZCBsaWIgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjc1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nLCBpZ25vcmluZyBkdXBsaWNhdGUgRVhQT1JUICVzICVkLCVkXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI3NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXJyb3IsIGR1cGxpY2F0ZSBFWFBPUlQgd2l0aCBvcmlkaW5hbHM6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyODkwCi1tc2dpZCAiUHJvY2Vzc2luZyBkZWZpbml0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MjkyOAotbXNnaWQgIlByb2Nlc3NlZCBkZWZpbml0aW9ucyIKLW1zZ3N0ciAiIgotCi0jLiB4Z2V0ZXh0OmMtZm9ybWF0Ci0jOiBkbGx0b29sLmM6MjkzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2FnZSAlcyA8b3B0aW9ucz4gPG9iamVjdC1maWxlcz5cbiIKLW1zZ3N0ciAiIgotCi0jLiB4Z2V0ZXh0OmMtZm9ybWF0Ci0jOiBkbGx0b29sLmM6Mjk0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iICAgLW0gLS1tYWNoaW5lIDxtYWNoaW5lPiAgICBDcmVhdGUge2FybSwgaTM4NiwgcHBjLCB0aHVtYn0gRExMLiBbZGVmYXVsdDogIgotIiVzXVxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyOTQyCi1tc2dpZCAiICAgLWUgLS1vdXRwdXQtZXhwIDxvdXRuYW1lPiBHZW5lcmF0ZSBhbiBleHBvcnQgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjk0MwotbXNnaWQgIiAgIC1sIC0tb3V0cHV0LWxpYiA8b3V0bmFtZT4gR2VuZXJhdGUgYW4gaW50ZXJmYWNlIGxpYnJhcnkuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI5NDQKLW1zZ2lkICIgICAtYSAtLWFkZC1pbmRpcmVjdCAgICAgICAgIEFkZCBkbGwgaW5kaXJlY3RzIHRvIGV4cG9ydCBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyOTQ1Ci1tc2dpZCAiIgotIiAgIC1EIC0tZGxsbmFtZSA8bmFtZT4gICAgICAgTmFtZSBvZiBpbnB1dCBkbGwgdG8gcHV0IGludG8gaW50ZXJmYWNlIGxpYi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjk0NgotbXNnaWQgIiAgIC1kIC0taW5wdXQtZGVmIDxkZWZmaWxlPiAgTmFtZSBvZiAuZGVmIGZpbGUgdG8gYmUgcmVhZCBpbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjk0NwotbXNnaWQgIiAgIC16IC0tb3V0cHV0LWRlZiA8ZGVmZmlsZT4gTmFtZSBvZiAuZGVmIGZpbGUgdG8gYmUgY3JlYXRlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjk0OAotbXNnaWQgIiAgIC0tZXhwb3J0LWFsbC1zeW1ib2xzICAgICAgRXhwb3J0IGFsbCBzeW1ib2xzIHRvIC5kZWZcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjk0OQotbXNnaWQgIiAgIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzICAgT25seSBleHBvcnQgbGlzdGVkIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjk1MAotbXNnaWQgIiAgIC0tZXhjbHVkZS1zeW1ib2xzIDxsaXN0PiAgRG9uJ3QgZXhwb3J0IDxsaXN0PlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyOTUxCi1tc2dpZCAiICAgLS1uby1kZWZhdWx0LWV4Y2x1ZGVzICAgICBDbGVhciBkZWZhdWx0IGV4Y2x1ZGUgc3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyOTUyCi1tc2dpZCAiICAgLWIgLS1iYXNlLWZpbGUgPGJhc2VmaWxlPiBSZWFkIGxpbmtlciBnZW5lcmF0ZWQgYmFzZSBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyOTUzCi1tc2dpZCAiICAgLXggLS1uby1pZGF0YTQgICAgICAgICAgICBEb24ndCBnZW5lcmF0ZSBpZGF0YSQ0IHNlY3Rpb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI5NTQKLW1zZ2lkICIgICAtYyAtLW5vLWlkYXRhNSAgICAgICAgICAgIERvbid0IGdlbmVyYXRlIGlkYXRhJDUgc2VjdGlvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjk1NQotbXNnaWQgIiIKLSIgICAtVSAtLWFkZC11bmRlcnNjb3JlICAgICAgIEFkZCB1bmRlcnNjb3JlcyB0byBzeW1ib2xzIGluIGludGVyZmFjZSAiCi0ibGlicmFyeS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjk1NgotbXNnaWQgIiAgIC1rIC0ta2lsbC1hdCAgICAgICAgICAgICAgS2lsbCBAPG4+IGZyb20gZXhwb3J0ZWQgbmFtZXMuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI5NTcKLW1zZ2lkICIgICAtQSAtLWFkZC1zdGRjYWxsLWFsaWFzICAgIEFkZCBhbGlhc2VzIHdpdGhvdXQgQDxuPi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjk1OAotbXNnaWQgIiAgIC1TIC0tYXMgPG5hbWU+ICAgICAgICAgICAgVXNlIDxuYW1lPiBmb3IgYXNzZW1ibGVyLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyOTU5Ci1tc2dpZCAiICAgLWYgLS1hcy1mbGFncyA8ZmxhZ3M+ICAgICBQYXNzIDxmbGFncz4gdG8gdGhlIGFzc2VtYmxlci5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjk2MQotbXNnaWQgIiAgIC1pIC0taW50ZXJ3b3JrICAgICAgICAgICAgU3VwcG9ydCBBUk0vVGh1bWIgaW50ZXJ3b3JraW5nLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyOTYzCi1tc2dpZCAiIgotIiAgIC1uIC0tbm8tZGVsZXRlICAgICAgICAgICAgS2VlcCB0ZW1wIGZpbGVzIChyZXBlYXQgZm9yIGV4dHJhICIKLSJwcmVzZXJ2YXRpb24pLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyOTY0Ci1tc2dpZCAiICAgLXYgLS12ZXJib3NlICAgICAgICAgICAgICBCZSB2ZXJib3NlLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyOTY1Ci1tc2dpZCAiICAgLVYgLS12ZXJzaW9uICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBwcm9ncmFtIHZlcnNpb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI5NjYKLW1zZ2lkICIgICAtaCAtLWhlbHAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBpbmZvcm1hdGlvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzEyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmFibGUgdG8gb3BlbiBiYXNlLWZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk1hY2hpbmUgJyVzJyBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozMTYKLW1zZ2lkICJ1bmV4cGVjdGVkIGVuZCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjQxMQotbXNnaWQgImludmFsaWQgbnVtYmVyIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo0NzAKLW1zZ2lkICJpbnZhbGlkIHN0cmluZyBsZW5ndGgiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjUyNyBpZWVlLmM6NTY4Ci1tc2dpZCAiZXhwcmVzc2lvbiBzdGFjayBvdmVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NTQ3Ci1tc2dpZCAidW5zdXBwb3J0ZWQgSUVFRSBleHByZXNzaW9uIG9wZXJhdG9yIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo1NjIKLW1zZ2lkICJ1bmtub3duIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjU4MwotbXNnaWQgImV4cHJlc3Npb24gc3RhY2sgdW5kZXJmbG93IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo1OTcKLW1zZ2lkICJleHByZXNzaW9uIHN0YWNrIG1pc21hdGNoIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo2MzYKLW1zZ2lkICJ1bmtub3duIGJ1aWx0aW4gdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NzgxCi1tc2dpZCAiQkNEIGZsb2F0IHR5cGUgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6OTI3Ci1tc2dpZCAidW5leHBlY3RlZCBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjkzNAotbXNnaWQgInVuZXhwZWN0ZWQgcmVjb3JkIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjk2NwotbXNnaWQgImJsb2NrcyBsZWZ0IG9uIHN0YWNrIGF0IGVuZCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MTIzMgotbXNnaWQgInVua25vd24gQkIgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MTI0MQotbXNnaWQgInN0YWNrIG92ZXJmbG93IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoxMjY2Ci1tc2dpZCAic3RhY2sgdW5kZXJmbG93IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoxMzgwIGllZWUuYzoxNDUyIGllZWUuYzoyMTUxCi1tc2dpZCAiaWxsZWdhbCB2YXJpYWJsZSBpbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MTQzMAotbXNnaWQgImlsbGVnYWwgdHlwZSBpbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MTQ0MCBpZWVlLmM6MTQ3NwotbXNnaWQgInVua25vd24gVFkgY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MTQ1OQotbXNnaWQgInVuZGVmaW5lZCB2YXJpYWJsZSBpbiBUWSIKLW1zZ3N0ciAiIgotCi0jLiBQYXNjYWwgZmlsZSBuYW1lLiAgRklYTUUuCi0jOiBpZWVlLmM6MTg3MAotbXNnaWQgIlBhc2NhbCBmaWxlIG5hbWUgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MTkxOAotbXNnaWQgInVuc3VwcG9ydGVkIHF1YWxpZmVyIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyMTg5Ci1tc2dpZCAidW5kZWZpbmVkIHZhcmlhYmxlIGluIEFUTiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjIzMgotbXNnaWQgInVua25vd24gQVROIHR5cGUiCi1tc2dzdHIgIiIKLQotIy4gUmVzZXJ2ZWQgZm9yIEZPUlRSQU4gY29tbW9uLgotIzogaWVlZS5jOjIzNTQKLW1zZ2lkICJ1bnN1cHBvcnRlZCBBVE4xMSIKLW1zZ3N0ciAiIgotCi0jLiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhpcyBpbmZvcm1hdGlvbi4gIEZJWE1FLgotIzogaWVlZS5jOjIzODEKLW1zZ2lkICJ1bnN1cHBvcnRlZCBBVE4xMiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjQ0MQotbXNnaWQgInVuZXhwZWN0ZWQgc3RyaW5nIGluIEMrKyBtaXNjIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyNDU0Ci1tc2dpZCAiYmFkIG1pc2MgcmVjb3JkIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyNDk3Ci1tc2dpZCAidW5yZWNvZ25pemVkIEMrKyBtaXNjIHJlY29yZCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjYxNAotbXNnaWQgInVuZGVmaW5lZCBDKysgb2JqZWN0IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyNjQ4Ci1tc2dpZCAidW5yZWNvZ25pemVkIEMrKyBvYmplY3Qgc3BlYyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjY4NAotbXNnaWQgInVuc3VwcG9ydGVkIEMrKyBvYmplY3QgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjY5NAotbXNnaWQgIkMrKyBiYXNlIGNsYXNzIG5vdCBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyNzA2IGllZWUuYzoyODExCi1tc2dpZCAiQysrIG9iamVjdCBoYXMgbm8gZmllbGRzIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyNzI1Ci1tc2dpZCAiQysrIGJhc2UgY2xhc3Mgbm90IGZvdW5kIGluIGNvbnRhaW5lciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjgzMgotbXNnaWQgIkMrKyBkYXRhIG1lbWJlciBub3QgZm91bmQgaW4gY29udGFpbmVyIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyODczIGllZWUuYzozMDIzCi1tc2dpZCAidW5rbm93biBDKysgdmlzaWJpbGl0eSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjkwNwotbXNnaWQgImJhZCBDKysgZmllbGQgYml0IHBvcyBvciBzaXplIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyOTk5Ci1tc2dpZCAiYmFkIHR5cGUgZm9yIEMrKyBtZXRob2QgZnVuY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjMwMDkKLW1zZ2lkICJubyB0eXBlIGluZm9ybWF0aW9uIGZvciBDKysgbWV0aG9kIGZ1bmN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozMDQ4Ci1tc2dpZCAiQysrIHN0YXRpYyB2aXJ0dWFsIG1ldGhvZCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzE0MwotbXNnaWQgInVucmVjb2duaXplZCBDKysgb2JqZWN0IG92ZXJoZWFkIHNwZWMiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjMxODIKLW1zZ2lkICJ1bmRlZmluZWQgQysrIHZ0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzI1MwotbXNnaWQgIkMrKyBkZWZhdWx0IHZhbHVlcyBub3QgaW4gYSBmdW5jdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzI5MwotbXNnaWQgInVucmVjb2duaXplZCBDKysgZGVmYXVsdCB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozMzI0Ci1tc2dpZCAicmVmZXJlbmNlIHBhcmFtZXRlciBpcyBub3QgYSBwb2ludGVyIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozNDA5Ci1tc2dpZCAidW5yZWNvZ25pemVkIEMrKyByZWZlcmVuY2UgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzQ5MQotbXNnaWQgIkMrKyByZWZlcmVuY2Ugbm90IGZvdW5kIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozNDk5Ci1tc2dpZCAiQysrIHJlZmVyZW5jZSBpcyBub3QgcG9pbnRlciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzUyOCBpZWVlLmM6MzUzNgotbXNnaWQgIm1pc3NpbmcgcmVxdWlyZWQgQVNOIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozNTY2IGllZWUuYzozNTc0Ci1tc2dpZCAibWlzc2luZyByZXF1aXJlZCBBVE42NSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzU4OAotbXNnaWQgImJhZCBBVE42NSByZWNvcmQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjQyMzUKLW1zZ2lkICJJRUVFIG51bWVyaWMgb3ZlcmZsb3c6IDB4IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo0MjgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIklFRUUgc3RyaW5nIGxlbmd0aCBvdmVyZmxvdzogJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NTMxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJJRUVFIHVuc3VwcG9ydGVkIGludGVnZXIgdHlwZSBzaXplICV1XG4iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjUzNTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSUVFRSB1bnN1cHBvcnRlZCBmbG9hdCB0eXBlIHNpemUgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NTM4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJJRUVFIHVuc3VwcG9ydGVkIGNvbXBsZXggdHlwZSBzaXplICV1XG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjI3NSBzcmNvbnYuYzoxOTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIG11c3QgYmUgZGlmZmVyZW50XG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjMyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW5wdXQgZmlsZSBuYW1lZCBib3RoIG9uIGNvbW1hbmQgbGluZSBhbmQgd2l0aCBJTlBVVFxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzozMzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIGlucHV0IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MzY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBuYW1lIGZvciBvdXRwdXQgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzozODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6aW5wdXQgYW5kIG91dHB1dCBmb3JtYXRzIGFyZSBub3QgY29tcGF0aWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo0MTEKLW1zZ2lkICJtYWtlIC5ic3Mgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NDIwCi1tc2dpZCAibWFrZSAubmxtc2VjdGlvbnMgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NDIyCi1tc2dpZCAic2V0IC5ubG1zZWN0aW9ucyBmbGFncyIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NDUwCi1tc2dpZCAic2V0IC5ic3Mgdm1hIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo0NTcKLW1zZ2lkICJzZXQgLmRhdGEgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NjM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBzeW1ib2wgJXMgaW1wb3J0ZWQgYnV0IG5vdCBpbiBpbXBvcnQgbGlzdFxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo2NTgKLW1zZ2lkICJzZXQgc3RhcnQgYWRkcmVzcyIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NzA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBTVEFSVCBwcm9jZWR1cmUgJXMgbm90IGRlZmluZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NzEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBFWElUIHByb2NlZHVyZSAlcyBub3QgZGVmaW5lZFxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo3MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IENIRUNLIHByb2NlZHVyZSAlcyBub3QgZGVmaW5lZFxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo3MzYgbmxtY29udi5jOjkyOAotbXNnaWQgImN1c3RvbSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo3NTcgbmxtY29udi5jOjk2MAotbXNnaWQgImhlbHAgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6Nzc5IG5sbWNvbnYuYzo5NzkKLW1zZ2lkICJtZXNzYWdlIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjc5NSBubG1jb252LmM6MTAxMgotbXNnaWQgIm1vZHVsZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo4MTUgbmxtY29udi5jOjEwMjkKLW1zZ2lkICJycGMgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6ODUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVzOiB3YXJuaW5nOiBzaGFyZWQgbGlicmFyaWVzIGNhbiBub3QgaGF2ZSB1bmluaXRpYWxpemVkIGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6ODczIG5sbWNvbnYuYzoxMDQ5Ci1tc2dpZCAic2hhcmVkIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjg4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogTm8gdmVyc2lvbiBudW1iZXIgZ2l2ZW5cbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6OTIyIG5sbWNvbnYuYzo5NTQgbmxtY29udi5jOjk3MyBubG1jb252LmM6MTAyMyBubG1jb252LmM6MTA0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolczogcmVhZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6OTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBNQVAgYW5kIEZVTExNQVAgYXJlIG5vdCBzdXBwb3J0ZWQ7IHRyeSBsZCAtTVxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBDb252ZXJ0IGFuIG9iamVjdCBmaWxlIGludG8gYSBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZVxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMTMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy1kaFZdIFstSSBiZmRuYW1lXSBbLU8gYmZkbmFtZV0gWy1UIGhlYWRlci1maWxlXSBbLWwgbGlua2VyXVxuIgotIiAgICAgICBbLS1pbnB1dC10YXJnZXQ9YmZkbmFtZV0gWy0tb3V0cHV0LXRhcmdldD1iZmRuYW1lXVxuIgotIiAgICAgICBbLS1oZWFkZXItZmlsZT1maWxlXSBbLS1saW5rZXI9bGlua2VyXSBbLS1kZWJ1Z11cbiIKLSIgICAgICAgWy0taGVscF0gWy0tdmVyc2lvbl1cbiIKLSIgICAgICAgW2luLWZpbGUgW291dC1maWxlXV1cbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTE3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3VwcG9ydCBub3QgY29tcGlsZWQgaW4gZm9yICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjEyMTYKLW1zZ2lkICJtYWtlIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjEyMzAKLW1zZ2lkICJzZXQgc2VjdGlvbiBzaXplIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMjM2Ci1tc2dpZCAic2V0IHNlY3Rpb24gYWxpZ25tZW50IgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMjQwCi1tc2dpZCAic2V0IHNlY3Rpb24gZmxhZ3MiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjEyNTEKLW1zZ2lkICJzZXQgLm5sbXNlY3Rpb25zIHNpemUiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjEzMzkgbmxtY29udi5jOjEzNDcgbmxtY29udi5jOjEzNTYgbmxtY29udi5jOjEzNjEKLW1zZ2lkICJzZXQgLm5sbXNlY3Rpb24gY29udGVudHMiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjE4NjQKLW1zZ2lkICJzdHViIHNlY3Rpb24gc2l6ZXMiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjE5MTMKLW1zZ2lkICJ3cml0aW5nIHN0dWIiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjIwMDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVucmVzb2x2ZWQgUEMgcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoyMDY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBvdmVyZmxvdyB3aGVuIGFkanVzdGluZyByZWxvY2F0aW9uIGFnYWluc3QgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MjE5MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZXhlY3V0aW9uIG9mICVzIGZhaWxlZDogIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoyMjA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBFeGVjdXRpb24gb2YgJXMgZmFpbGVkXG4iCi1tc2dzdHIgIiIKLQotIzogbm0uYzoyOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLWFBQkNEZ2xub3BQcnN1dlZdIFstdCByYWRpeF0gWy0tcmFkaXg9cmFkaXhdIFstLXRhcmdldD1iZmRuYW1lXVxuIgotIiAgICAgICBbLS1kZWJ1Zy1zeW1zXSBbLS1leHRlcm4tb25seV0gWy0tcHJpbnQtYXJtYXBdIFstLXByaW50LWZpbGUtbmFtZV1cbiIKLSIgICAgICAgWy0tbnVtZXJpYy1zb3J0XSBbLS1uby1zb3J0XSBbLS1yZXZlcnNlLXNvcnRdIFstLXNpemUtc29ydF1cbiIKLSIgICAgICAgWy0tdW5kZWZpbmVkLW9ubHldIFstLXBvcnRhYmlsaXR5XSBbLWYge2JzZCxzeXN2LHBvc2l4fV1cbiIKLSIgICAgICAgWy0tZm9ybWF0PXtic2Qsc3lzdixwb3NpeH1dIFstLWRlbWFuZ2xlXSBbLS1uby1kZW1hbmdsZV0gWy0tZHluYW1pY11cbiIKLSIgICAgICAgWy0tZGVmaW5lZC1vbmx5XSBbLS1saW5lLW51bWJlcnNdXG4iCi0iICAgICAgIFstLXZlcnNpb25dIFstLWhlbHBdXG4iCi0iICAgICAgIFtmaWxlLi4uXVxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MzM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogaW52YWxpZCByYWRpeFxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MzYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogaW52YWxpZCBvdXRwdXQgZm9ybWF0XG4iCi1tc2dzdHIgIiIKLQotIzogbm0uYzo0OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGRhdGEgc2l6ZSAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjEyODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlVuZGVmaW5lZCBzeW1ib2xzIGZyb20gJXM6XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogbm0uYzoxMjgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJcbiIKLSJTeW1ib2xzIGZyb20gJXM6XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogbm0uYzoxMjg0IG5tLmM6MTMzOAotbXNnaWQgIiIKLSJOYW1lICAgICAgICAgICAgICAgICAgVmFsdWUgICBDbGFzcyAgICAgICAgVHlwZSAgICAgICAgIFNpemUgICBMaW5lICAiCi0iU2VjdGlvblxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MTMzNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iXG4iCi0iVW5kZWZpbmVkIHN5bWJvbHMgZnJvbSAlc1slc106XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogbm0uYzoxMzM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJcbiIKLSJTeW1ib2xzIGZyb20gJXNbJXNdOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MTUwOAotbXNnaWQgIiIKLSJcbiIKLSJBcmNoaXZlIGluZGV4OlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoyOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLXZWU3BneFhdIFstSSBiZmRuYW1lXSBbLU8gYmZkbmFtZV0gWy1GIGJmZG5hbWVdIFstYiBieXRlXVxuIgotIiAgICAgICBbLVIgc2VjdGlvbl0gWy1pIGludGVybGVhdmVdIFstLWludGVybGVhdmU9aW50ZXJsZWF2ZV0gWy0tYnl0ZT1ieXRlXVxuIgotIiAgICAgICBbLS1pbnB1dC10YXJnZXQ9YmZkbmFtZV0gWy0tb3V0cHV0LXRhcmdldD1iZmRuYW1lXSAiCi0iWy0tdGFyZ2V0PWJmZG5hbWVdXG4iCi0iICAgICAgIFstLXN0cmlwLWFsbF0gWy0tc3RyaXAtZGVidWddIFstLXN0cmlwLXVubmVlZGVkXSBbLS1kaXNjYXJkLWFsbF1cbiIKLSIgICAgICAgWy0tZGlzY2FyZC1sb2NhbHNdIFstLWRlYnVnZ2luZ10gWy0tcmVtb3ZlLXNlY3Rpb249c2VjdGlvbl1cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MzAwCi1tc2dpZCAiIgotIiAgICAgICBbLS1nYXAtZmlsbD12YWxdIFstLXBhZC10bz1hZGRyZXNzXSBbLS1wcmVzZXJ2ZS1kYXRlc11cbiIKLSIgICAgICAgWy0tc2V0LXN0YXJ0PXZhbF0gXG4iCi0iICAgICAgIFstLWNoYW5nZS1zdGFydD1pbmNyXSBbLS1jaGFuZ2UtYWRkcmVzc2VzPWluY3JdIFxuIgotIiAgICAgICAoLS1hZGp1c3Qtc3RhcnQgICBhbmQgIC0tYWRqdXN0LXZtYSBhcmUgYWxpYXNlcyBmb3IgdGhlc2UgdHdvKSBcbiIKLSIgICAgICAgWy0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzcz1zZWN0aW9uez0sKywtfXZhbF1cbiIKLSIgICAgICAgKC0tYWRqdXN0LXNlY3Rpb24tdm1hIGlzIGFuIGFsaWFzIGZvciAtLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3MpXG4iCi0iICAgICAgIFstLWNoYW5nZS1zZWN0aW9uLWxtYT1zZWN0aW9uez0sKywtfXZhbF1cbiIKLSIgICAgICAgWy0tY2hhbmdlLXNlY3Rpb24tdm1hPXNlY3Rpb257PSwrLC19dmFsXVxuIgotIiAgICAgICBbLS1hZGp1c3Qtd2FybmluZ3NdIFstLW5vLWFkanVzdC13YXJuaW5nc11cbiIKLSIgICAgICAgWy0tY2hhbmdlLXdhcm5pbmdzXSBbLS1uby1jaGFuZ2Utd2FybmluZ3NdXG4iCi0iICAgICAgIFstLXNldC1zZWN0aW9uLWZsYWdzPXNlY3Rpb249ZmxhZ3NdICIKLSJbLS1hZGQtc2VjdGlvbj1zZWN0aW9ubmFtZT1maWxlbmFtZV1cbiIKLSIgICAgICAgWy0ta2VlcC1zeW1ib2wgc3ltYm9sXSBbLUsgc3ltYm9sXSBbLS1zdHJpcC1zeW1ib2wgc3ltYm9sXSBbLU4gIgotInN5bWJvbF1cbiIKLSIgICAgICAgWy0tbG9jYWxpemUtc3ltYm9sIHN5bWJvbF0gWy1MIHN5bWJvbF0gWy0td2Vha2VuLXN5bWJvbCBzeW1ib2xdXG4iCi0iICAgICAgIFstVyBzeW1ib2xdIFstLWNoYW5nZS1sZWFkaW5nLWNoYXJdIFstLXJlbW92ZS1sZWFkaW5nLWNoYXJdICIKLSJbLS13ZWFrZW5dXG4iCi0iICAgICAgIFstLXZlcmJvc2VdIFstLXZlcnNpb25dIFstLWhlbHBdIGluLWZpbGUgW291dC1maWxlXVxuIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzozMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLXZWc1NwZ3hYXSBbLUkgYmZkbmFtZV0gWy1PIGJmZG5hbWVdIFstRiBiZmRuYW1lXSBbLVIgc2VjdGlvbl1cbiIKLSIgICAgICAgWy0taW5wdXQtdGFyZ2V0PWJmZG5hbWVdIFstLW91dHB1dC10YXJnZXQ9YmZkbmFtZV0gIgotIlstLXRhcmdldD1iZmRuYW1lXVxuIgotIiAgICAgICBbLS1zdHJpcC1hbGxdIFstLXN0cmlwLWRlYnVnXSBbLS1zdHJpcC11bm5lZWRlZF0gWy0tZGlzY2FyZC1hbGxdXG4iCi0iICAgICAgIFstLWRpc2NhcmQtbG9jYWxzXSBbLS1rZWVwLXN5bWJvbCBzeW1ib2xdIFstSyBzeW1ib2xdXG4iCi0iICAgICAgIFstLXN0cmlwLXN5bWJvbCBzeW1ib2xdIFstTiBzeW1ib2xdIFstLXJlbW92ZS1zZWN0aW9uPXNlY3Rpb25dXG4iCi0iICAgICAgIFstbyBmaWxlXSBbLS1wcmVzZXJ2ZS1kYXRlc10gWy0tdmVyYm9zZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gIgotImZpbGUuLi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MzgzCi0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXplZCBzZWN0aW9uIGZsYWcgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6Mzg0Ci1tc2dpZCAic3VwcG9ydGVkIGZsYWdzOiBhbGxvYywgbG9hZCwgcmVhZG9ubHksIGNvZGUsIGRhdGEsIHJvbSwgY29udGVudHMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjYyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJjb3B5IGZyb20gJXMoJXMpIHRvICVzKCVzKVxuIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzo2NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogT3V0cHV0IGZpbGUgY2Fubm90IHJlcHJlc2VudCBhcmNoaXRlY3R1cmUgJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjY2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBjcmVhdGUgc2VjdGlvbiBgJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6NzU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IGZpbGwgZ2FwIGFmdGVyICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6NzgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IGFkZCBwYWRkaW5nIHRvICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6OTE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlcnJvciBjb3B5aW5nIHByaXZhdGUgQkZEIGRhdGE6ICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzo5NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG1rZGlyICVzIGZvciBhcmNoaXZlIGNvcHlpbmcgKGVycm9yOiAlcykiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjEyMDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNlY3Rpb24gYCVzJzogZXJyb3IgaW4gJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxNDc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW4ndCBjcmVhdGUgZGVidWdnaW5nIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxNDkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW4ndCBzZXQgZGVidWdnaW5nIHNlY3Rpb24gY29udGVudHM6ICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxNTAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkb24ndCBrbm93IGhvdyB0byB3cml0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxNjA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW5ub3Qgc3RhdDogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE2NTUKLW1zZ2lkICJieXRlIG51bWJlciBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTY2MAotbXNnaWQgImludGVybGVhdmUgbXVzdCBiZSBwb3NpdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTcyOQotbXNnaWQgImJhZCBmb3JtYXQgZm9yIC0tYWRkLXNlY3Rpb24gTkFNRT1GSUxFTkFNRSIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTczMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgc3RhdDogJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxNzUwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuOiAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE3NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZyZWFkIGZhaWxlZCIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTc5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgZm9ybWF0IGZvciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTg1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiB0cnVuY2F0aW5nIGdhcC1maWxsIGZyb20gMHglcyB0byAweCV4IgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxODc5Ci1tc2dpZCAiYmFkIGZvcm1hdCBmb3IgLS1zZXQtc2VjdGlvbi1mbGFncyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTkwOQotbXNnaWQgImJ5dGUgbnVtYmVyIG11c3QgYmUgbGVzcyB0aGFuIGludGVybGVhdmUiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE5MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IHN0YXQ6ICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTk2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiAtLWNoYW5nZS1zZWN0aW9uLXZtYSAlcyVjMHglcyBuZXZlciB1c2VkIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxOTgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IC0tY2hhbmdlLXNlY3Rpb24tbG1hICVzJWMweCVzIG5ldmVyIHVzZWQiCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjIxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVXNhZ2U6ICVzIFstYWhpZkNkRHByUnRUeHNTbHddIFstYiBiZmRuYW1lXSBbLW0gbWFjaGluZV0gWy1qIHNlY3Rpb24tbmFtZV1cbiIKLSIgICAgICAgWy0tYXJjaGl2ZS1oZWFkZXJzXSBbLS10YXJnZXQ9YmZkbmFtZV0gWy0tZGVidWdnaW5nXSBbLS1kaXNhc3NlbWJsZV1cbiIKLSIgICAgICAgWy0tZGlzYXNzZW1ibGUtYWxsXSBbLS1kaXNhc3NlbWJsZS16ZXJvZXNdIFstLWZpbGUtaGVhZGVyc11cbiIKLSIgICAgICAgWy0tc2VjdGlvbi1oZWFkZXJzXSBbLS1oZWFkZXJzXVxuIgotIiAgICAgICBbLS1pbmZvXSBbLS1zZWN0aW9uPXNlY3Rpb24tbmFtZV0gWy0tbGluZS1udW1iZXJzXSBbLS1zb3VyY2VdXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjIyNgotbXNnaWQgIiIKLSIgICAgICAgWy0tYXJjaGl0ZWN0dXJlPW1hY2hpbmVdIFstLXJlbG9jXSBbLS1mdWxsLWNvbnRlbnRzXSBbLS1zdGFic11cbiIKLSIgICAgICAgWy0tc3ltc10gWy0tYWxsLWhlYWRlcnNdIFstLWR5bmFtaWMtc3ltc10gWy0tZHluYW1pYy1yZWxvY11cbiIKLSIgICAgICAgWy0td2lkZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gWy0tcHJpdmF0ZS1oZWFkZXJzXVxuIgotIiAgICAgICBbLS1zdGFydC1hZGRyZXNzPWFkZHJdIFstLXN0b3AtYWRkcmVzcz1hZGRyXVxuIgotIiAgICAgICBbLS1wcmVmaXgtYWRkcmVzc2VzXSBbLS1bbm8tXXNob3ctcmF3LWluc25dIFstLWRlbWFuZ2xlXVxuIgotIiAgICAgICBbLS1hZGp1c3Qtdm1hPW9mZnNldF0gWy1FQnwtRUxdIFstLWVuZGlhbj17YmlnfGxpdHRsZX1dIG9iamZpbGUuLi5cbiIKLSJhdCBsZWFzdCBvbmUgb3B0aW9uIGJlc2lkZXMgLWwgKC0tbGluZS1udW1iZXJzKSBtdXN0IGJlIGdpdmVuXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjM2MQotbXNnaWQgIlNlY3Rpb25zOlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzozNjMKLW1zZ2lkICJJZHggTmFtZSAgICAgICAgICBTaXplICAgICAgVk1BICAgICAgIExNQSAgICAgICBGaWxlIG9mZiAgQWxnblxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzozNjUKLW1zZ2lkICIiCi0iSWR4IE5hbWUgICAgICAgICAgU2l6ZSAgICAgIFZNQSAgICAgICAgICAgICAgIExNQSAgICAgICAgICAgICAgIEZpbGUgb2ZmICAiCi0iQWxnblxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzo0MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBub3QgYSBkeW5hbWljIG9iamVjdFxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzo0MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBObyBkeW5hbWljIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTEzMQotbXNnaWQgIk91dCBvZiB2aXJ0dWFsIG1lbW9yeVxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxNTMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBDYW4ndCB1c2Ugc3VwcGxpZWQgbWFjaGluZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxNTUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBDYW4ndCBkaXNhc3NlbWJsZSBmb3IgYXJjaGl0ZWN0dXJlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjE2MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTc5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iTm8gJXMgc2VjdGlvbiBwcmVzZW50XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjE4MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzIGhhcyBubyAlcyBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjE4MTggb2JqZHVtcC5jOjE4MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFJlYWRpbmcgJXMgc2VjdGlvbiBvZiAlcyBmYWlsZWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjE4NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkNvbnRlbnRzIG9mICVzIHNlY3Rpb246XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjE5NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXJjaGl0ZWN0dXJlOiAlcywgIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxOTc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImZsYWdzIDB4JTA4eDpcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTk4NwotbXNnaWQgIiIKLSJcbiIKLSJzdGFydCBhZGRyZXNzIDB4IgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyMDMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIlczogICAgIGZpbGUgZm9ybWF0ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjIwNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHByaW50aW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmYWlsZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjEwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbiBhcmNoaXZlICVzOlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyMTU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNvbnRlbnRzIG9mIHNlY3Rpb24gJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjI2NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQkZEIGhlYWRlciBmaWxlIHZlcnNpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6Mjc4NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5yZWNvZ25pemVkIC1FIG9wdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyNzk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bnJlY29nbml6ZWQgLS1lbmRpYW4gdHlwZSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogcmRjb2ZmLmM6MjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBwYXJzZV9jb2ZmX3R5cGU6IEJhZCB0eXBlIGNvZGUgMHgleFxuIgotbXNnc3RyICIiCi0KLSM6IHJkY29mZi5jOjQyMyByZGNvZmYuYzo1MzEgcmRjb2ZmLmM6NzEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiZmRfY29mZl9nZXRfc3ltZW50IGZhaWxlZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZGNvZmYuYzo0MzkgcmRjb2ZmLmM6NzMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiZmRfY29mZl9nZXRfYXV4ZW50IGZhaWxlZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZGNvZmYuYzo3OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVsZDogLmJmIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogcmRjb2ZmLmM6ODQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlbGQ6IHVuZXhwZWN0ZWQgLmVmXG4iCi1tc2dzdHIgIiIKLQotIzogcmRkYmcuYzo4NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gcmVjb2duaXplZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiByZGRiZy5jOjQwMAotbXNnaWQgIkxhc3Qgc3RhYnMgZW50cmllcyBiZWZvcmUgZXJyb3I6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIyOSByZWFkZWxmLmM6MjU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBFcnJvcjogIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNDEgcmVhZGVsZi5jOjI3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogV2FybmluZzogIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDAgcmVhZGVsZi5jOjMyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmhhbmRsZWQgZGF0YSBsZW5ndGg6ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQyMAotbXNnaWQgIkRvbid0IGtub3cgYWJvdXQgcmVsb2NhdGlvbnMgb24gdGhpcyBtYWNoaW5lIGFyY2hpdGVjdHVyZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MjYKLW1zZ2lkICIiCi0iICBPZmZzZXQgICAgSW5mbyAgVHlwZSAgICAgICAgICAgIFN5bWJvbCdzIFZhbHVlICBTeW1ib2wncyBOYW1lICAgICAgICAgICIKLSJBZGRlbmRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDI5Ci1tc2dpZCAiICBPZmZzZXQgICAgSW5mbyAgVHlwZSAgICAgICAgICAgIFN5bWJvbCdzIFZhbHVlICBTeW1ib2wncyBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbmlzZWQ6ICUtN2x4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHN0cmluZyB0YWJsZSBpbmRleCAlM2xkPiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlByb2Nlc3NvciBTcGVjaWZpYzogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3BlcmF0aW5nIFN5c3RlbSBzcGVjaWZpYzogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3MDggcmVhZGVsZi5jOjk2MQotIywgYy1mb3JtYXQKLW1zZ2lkICI8dW5rbm93bj46ICVseCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzIyCi1tc2dpZCAiTk9ORSAoTm9uZSkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjcyMwotbXNnaWQgIlJFTCAoUmVsb2NhdGFibGUgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjcyNAotbXNnaWQgIkVYRUMgKEV4ZWN1dGFibGUgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjcyNQotbXNnaWQgIkRZTiAoU2hhcmVkIG9iamVjdCBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzI2Ci1tc2dpZCAiQ09SRSAoQ29yZSBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlByb2Nlc3NvciBTcGVjaWZpYzogKCV4KSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIk9TIFNwZWNpZmljOiAoJXgpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3MzQgcmVhZGVsZi5jOjc5MyByZWFkZWxmLmM6ODk3IHJlYWRlbGYuYzoxMDcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIjx1bmtub3duPjogJXgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjc0NwotbXNnaWQgIk5vbmUiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjg5NAotbXNnaWQgIkVMRkRBVEEyTFNCIChsaXR0bGUgZW5kaWFuKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6ODk1Ci1tc2dpZCAiRUxGREFUQTJNU0IgKGJpZyBlbmRpYW4pIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTA4Ci1tc2dpZCAiVXNhZ2U6IHJlYWRlbGYge29wdGlvbnN9IGVsZi1maWxlKHMpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExMDkKLW1zZ2lkICIgIE9wdGlvbnMgYXJlOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTEwCi1tc2dpZCAiIgotIiAgLWEgb3IgLS1hbGwgICAgICAgICAgICAgICBFcXVpdmFsZW50IHRvOiAtaCAtbCAtUyAtcyAtciAtZCAtViAtLWhpc3RvZ3JhbVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTExCi1tc2dpZCAiICAtaCBvciAtLWZpbGUtaGVhZGVyICAgICAgIERpc3BsYXkgdGhlIEVMRiBmaWxlIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTEyCi1tc2dpZCAiICAtbCBvciAtLXByb2dyYW0taGVhZGVycyBvciAtLXNlZ21lbnRzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExMTMKLW1zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGUgcHJvZ3JhbSBoZWFkZXJzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExMTQKLW1zZ2lkICIgIC1TIG9yIC0tc2VjdGlvbi1oZWFkZXJzIG9yIC0tc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTExNQotbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBzZWN0aW9ucycgaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExMTYKLW1zZ2lkICIgIC1lIG9yIC0taGVhZGVycyAgICAgICAgICAgRXF1aXZhbGVudCB0bzogLWggLWwgLVNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTExNwotbXNnaWQgIiAgLXMgb3IgLS1zeW1zIG9yIC0tc3ltYm9scyBEaXNwbGF5IHRoZSBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTExOAotbXNnaWQgIiAgLXIgb3IgLS1yZWxvY3MgICAgICAgICAgICBEaXNwbGF5IHRoZSByZWxvY2F0aW9ucyAoaWYgcHJlc2VudClcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTExOQotbXNnaWQgIiAgLWQgb3IgLS1keW5hbWljICAgICAgICAgICBEaXNwbGF5IHRoZSBkeW5hbWljIHNlZ21lbnQgKGlmIHByZXNlbnQpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExMjAKLW1zZ2lkICIgIC1WIG9yIC0tdmVyc2lvbi1pbmZvICAgICAgRGlzcGxheSB0aGUgdmVyc2lvbiBzZWN0aW9ucyAoaWYgcHJlc2VudClcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTEyMQotbXNnaWQgIiIKLSIgIC1EIG9yIC0tdXNlLWR5bmFtaWMgICAgICAgVXNlIHRoZSBkeW5hbWljIHNlY3Rpb24gaW5mbyB3aGVuIGRpc3BsYXlpbmcgIgotInN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTEyMgotbXNnaWQgIiAgLXggPG51bWJlcj4gb3IgLS1oZXgtZHVtcD08bnVtYmVyPlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTIzCi1tc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1bXAgdGhlIGNvbnRlbnRzIG9mIHNlY3Rpb24gPG51bWJlcj5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTEyNAotbXNnaWQgIiAgLXdbbGlhcHJdIG9yIC0tZGVidWctZHVtcFs9bGluZSw9aW5mbyw9YWJicmV2LD1wdWJuYW1lcyw9cmFuZ2VzXVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTI1Ci1tc2dpZCAiIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiBEV0FSRjIgZGVidWcgc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTEyNwotbXNnaWQgIiAgLWkgPG51bWJlcj4gb3IgLS1pbnN0cnVjdGlvbi1kdW1wPTxudW1iZXI+XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExMjgKLW1zZ2lkICIiCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2Fzc2VtYmxlIHRoZSBjb250ZW50cyBvZiBzZWN0aW9uIDxudW1iZXI+XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExMzAKLW1zZ2lkICIgICAgICAgIC0taGlzdG9ncmFtICAgICAgICAgRGlzcGxheSBoaXN0b2dyYW0gb2YgYnVja2V0IGxpc3QgbGVuZ3Roc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTMxCi1tc2dpZCAiICAtdiBvciAtLXZlcnNpb24gICAgICAgICAgIERpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHJlYWRlbGZcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTEzMgotbXNnaWQgIiAgLUggb3IgLS1oZWxwICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaW5mb3JtYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1MAotbXNnaWQgIk91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBkdW1wIHJlcXVlc3QgdGFibGUuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMjc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXNlZCBkZWJ1ZyBvcHRpb24gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMjk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgb3B0aW9uICctJWMnXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjEzMTIKLW1zZ2lkICJOb3RoaW5nIHRvIGRvLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzIzIHJlYWRlbGYuYzoxMzM2IHJlYWRlbGYuYzoyNDU5Ci1tc2dpZCAibm9uZSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTMyNAotbXNnaWQgIkVMRjMyIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzI1Ci1tc2dpZCAiRUxGNjQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjEzMjYgcmVhZGVsZi5jOjEzMzkgcmVhZGVsZi5jOjEzNTIKLW1zZ2lkICI8dW5rbm93bj4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjEzMzcKLW1zZ2lkICIyJ3MgY29tcGlsbWVudCwgbGl0dGxlIGVuZGlhbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTMzOAotbXNnaWQgIjIncyBjb21waWxtZW50LCBiaWcgZW5kaWFuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzQ5Ci1tc2dpZCAiVU5JWCAtIFN5c3RlbSBWIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzUwCi1tc2dpZCAiVU5JWCAtIEhQLVVYIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzUxCi1tc2dpZCAiU3RhbmRhbG9uZSBBcHAiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjEzNjYKLW1zZ2lkICJOb3QgYW4gRUxGIGZpbGUgLSBpdCBoYXMgdGhlIHdyb25nIG1hZ2ljIGJ5dGVzIGF0IHRoZSBzdGFydFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzc0Ci1tc2dpZCAiRUxGIEhlYWRlcjpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTM3NQotbXNnaWQgIiAgTWFnaWM6ICAgIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQ2xhc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzgxIHJlYWRlbGYuYzoxMzk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRGF0YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAlZCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgT1MvQUJJOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQUJJIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTWFjaGluZTogICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAweCVseFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRW50cnkgcG9pbnQgYWRkcmVzczogICAgICAgICAgICAgICAweCVseFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU3RhcnQgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAlbGQgKGJ5dGVzIGludG8gZmlsZSlcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFN0YXJ0IG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgJWxkIChieXRlcyBpbnRvIGZpbGUpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBGbGFnczogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JWx4JXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQwOAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgdGhpcyBoZWFkZXI6ICAgICAgICAgICAgICAgJWxkIChieXRlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAgJWxkIChieXRlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgICVsZCAoYnl0ZXMpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBOdW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4OiAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQyOAotbXNnaWQgIk5vdCBhIDMyIGJpdCBFTEYgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDQ4Ci1tc2dpZCAiIgotIlxuIgotIlRoZXJlIGFyZSBubyBwcm9ncmFtIGhlYWRlcnMgaW4gdGhpcyBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJFbGYgZmlsZSBpcyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkVudHJ5IHBvaW50IDB4JWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVGhlcmUgYXJlICVkIHByb2dyYW0gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0ICVseDpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ2OSByZWFkZWxmLmM6MTYxOSByZWFkZWxmLmM6MTY2MiByZWFkZWxmLmM6MjAxOCByZWFkZWxmLmM6MjE0MgotIzogcmVhZGVsZi5jOjMwNDMgcmVhZGVsZi5jOjMwNTcKLW1zZ2lkICJPdXQgb2YgbWVtb3J5XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0OTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlByb2dyYW0gSGVhZGVyJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0OTQKLW1zZ2lkICIiCi0iICBUeXBlICAgICAgICBPZmZzZXQgICBWaXJ0QWRkciAgIFBoeXNBZGRyICAgRmlsZVNpeiBNZW1TaXogIEZsZyBBbGlnblxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTI5Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSBkeW5hbWljIHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTUzNwotbXNnaWQgIlVuYWJsZSB0byBmaW5kIHByb2dyYW0gaW50ZXJwcmV0ZXIgbmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgICAgICBbUmVxdWVzdGluZyBwcm9ncmFtIGludGVycHJldGVyOiAlc10iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE1NjIKLW1zZ2lkICIiCi0iXG4iCi0iIFNlY3Rpb24gdG8gU2VnbWVudCBtYXBwaW5nOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTYzCi1tc2dpZCAiICBTZWdtZW50IFNlY3Rpb25zLi4uXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE2OTcKLW1zZ2lkICIiCi0iXG4iCi0iVGhlcmUgYXJlIG5vIHNlY3Rpb25zIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTcwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJUaGVyZSBhcmUgJWQgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgJWx4OlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNzM3Ci1tc2dpZCAiRmlsZSBjb250YWlucyBtdWx0aXBsZSBkeW5hbWljIHN5bWJvbCB0YWJsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTc1MAotbXNnaWQgIkZpbGUgY29udGFpbnMgbXVsdGlwbGUgZHluYW1pYyBzdHJpbmcgdGFibGVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE3NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gSGVhZGVyJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE3NzkKLW1zZ2lkICIiCi0iICBbTnJdIE5hbWUgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBBZGRyICAgICBPZmYgICAgU2l6ZSAgIEVTIEZsZyBMayAiCi0iSW5mIEFsXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE4NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlJlbG9jYXRpb24gc2VjdGlvbiBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWxkIGJ5dGVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxODUxCi1tc2dpZCAiIgotIlxuIgotIlRoZXJlIGFyZSBubyBkeW5hbWljIHJlbG9jYXRpb25zIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTg3NwotbXNnaWQgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxODg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWx1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE5MTAKLW1zZ2lkICIiCi0iXG4iCi0iVGhlcmUgYXJlIG5vIHJlbG9jYXRpb25zIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTk5OAotbXNnaWQgIiIKLSJcbiIKLSJUaGVyZSBpcyBubyBkeW5hbWljIHNlZ21lbnQgaW4gdGhpcyBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMDU2Ci1tc2dpZCAiVW5hYmxlIHRvIHNlZWsgdG8gZW5kIG9mIGZpbGUhIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMDYyCi1tc2dpZCAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgdG8gbG9hZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMDkyCi1tc2dpZCAiVW5hYmxlIHRvIHNlZWsgdG8gZW5kIG9mIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjA5OAotbXNnaWQgIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjE1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRHluYW1pYyBzZWdtZW50IGF0IG9mZnNldCAweCV4IGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIxNjIKLW1zZ2lkICIgIFRhZyAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lL1ZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIxNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAweCUtOC44bHggKCVzKSUqcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjE4MgotbXNnaWQgIkF1eGlsaWFyeSBsaWJyYXJ5IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMTg0Ci1tc2dpZCAiRmlsdGVyIGxpYnJhcnkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIxOTYgcmVhZGVsZi5jOjIyMTcgcmVhZGVsZi5jOjIyNDMKLW1zZ2lkICJGbGFnczoiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIxOTggcmVhZGVsZi5jOjIyMTkgcmVhZGVsZi5jOjIyNDUKLW1zZ2lkICIgTm9uZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMzQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlNoYXJlZCBsaWJyYXJ5OiBbJXNdIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMzUzCi1tc2dpZCAiIHByb2dyYW0gaW50ZXJwcmV0ZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjM1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJMaWJyYXJ5IHNvbmFtZTogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMzYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkxpYnJhcnkgcnBhdGg6IFslc11cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjQxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJOb3QgbmVlZGVkIG9iamVjdDogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiAnJXMnIGNvbnRhaW5zICVsZCBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNTA4Ci1tc2dpZCAiICBBZGRyOiAweCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjUxMCByZWFkZWxmLmM6MjY5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE9mZnNldDogJSMwOGx4ICBMaW5rOiAlbHggKCVzKVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNTQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IFJldjogJWQgIEZsYWdzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjU0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEluZGV4OiAlZCAgQ250OiAlZCAgIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNTU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5hbWU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI1NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTmFtZSBpbmRleDogJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI1NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogUGFyZW50ICVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNTc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IFBhcmVudCAlZCwgbmFtZSBpbmRleDogJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI1OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gbmVlZHMgc2VjdGlvbiAnJXMnIGNvbnRhaW5zICVsZCBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNTk2Ci1tc2dpZCAiIEFkZHI6IDB4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgT2Zmc2V0OiAlIzA4bHggIExpbmsgdG8gc2VjdGlvbjogJWxkICglcylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjYyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBWZXJzaW9uOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjYyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRmlsZTogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQ250OiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IE5hbWU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IE5hbWUgaW5kZXg6ICVseCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjY1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEZsYWdzOiAlcyAgVmVyc2lvbjogJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjY5NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBzeW1ib2xzIHNlY3Rpb24gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjk3Ci1tc2dpZCAiIEFkZHI6ICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjcyNgotbXNnaWQgIiAgIDAgKCpsb2NhbCopICAgICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjczMAotbXNnaWQgIiAgIDEgKCpnbG9iYWwqKSAgICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mjk1MwotbXNnaWQgIiIKLSJcbiIKLSJObyB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvdW5kIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mjk2NgotbXNnaWQgIkxPQ0FMIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyOTY3Ci1tc2dpZCAiR0xPQkFMIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyOTY4Ci1tc2dpZCAiV0VBSyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mjk3MSByZWFkZWxmLmM6Mjk5NQotIywgYy1mb3JtYXQKLW1zZ2lkICI8cHJvY2Vzc29yIHNwZWNpZmljPjogJWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI5NzMgcmVhZGVsZi5jOjI5OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPE9TIHNwZWNpZmljPjogJWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI5NzUgcmVhZGVsZi5jOjI5OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHVua25vd24+OiAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mjk4OAotbXNnaWQgIk5PVFlQRSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mjk4OQotbXNnaWQgIk9CSkVDVCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mjk5MAotbXNnaWQgIkZVTkMiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI5OTEKLW1zZ2lkICJTRUNUSU9OIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyOTkyCi1tc2dpZCAiRklMRSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA0OQotbXNnaWQgIlVuYWJsZSB0byByZWFkIGluIGR5bmFtaWMgZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDkxCi1tc2dpZCAiVW5hYmxlIHRvIHNlZWsgdG8gc3RhcnQgb2YgZHluYW1pYyBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA5NwotbXNnaWQgIkZhaWxlZCB0byByZWFkIGluIG51bWJlciBvZiBidWNrZXRzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMxMDMKLW1zZ2lkICJGYWlsZWQgdG8gcmVhZCBpbiBudW1iZXIgb2YgY2hhaW5zXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMxMjMKLW1zZ2lkICIiCi0iXG4iCi0iU3ltYm9sIHRhYmxlIGZvciBpbWFnZTpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzEyNAotbXNnaWQgIiAgTnVtIEJ1YzogICAgVmFsdWUgIFNpemUgICBUeXBlICAgQmluZCBPdCBOZHggTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMTY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTeW1ib2wgdGFibGUgJyVzJyBjb250YWlucyAlbHUgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzE3MgotbXNnaWQgIiAgTnVtOiAgICBWYWx1ZSAgU2l6ZSBUeXBlICAgIEJpbmQgICBPdCAgTmR4IE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzI5MQotbXNnaWQgImJhZCBkeW5hbWljIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzM1MAotbXNnaWQgIiIKLSJcbiIKLSJEeW5hbWljIHN5bWJvbCBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGZvciBkaXNwbGF5aW5nIHN5bWJvbHMuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMzNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkhpc3RvZ3JhbSBmb3IgYnVja2V0IGxpc3QgbGVuZ3RoICh0b3RhbCBvZiAlZCBidWNrZXRzKTpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzM2NAotbXNnaWQgIiBMZW5ndGggIE51bWJlciAgICAgJSUgb2YgdG90YWwgIENvdmVyYWdlXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMzNjkgcmVhZGVsZi5jOjMzODggcmVhZGVsZi5jOjUyNzEgcmVhZGVsZi5jOjU0NjEKLW1zZ2lkICJPdXQgb2YgbWVtb3J5IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEeW5hbWljIGluZm8gc2VnbWVudCBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWQgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzQzNwotbXNnaWQgIiBOdW06IE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZFRvICAgICBGbGFnc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNDg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJBc3NlbWJseSBkdW1wIG9mIHNlY3Rpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzUwOAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiAnJXMnIGhhcyBubyBkYXRhIHRvIGR1bXAuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM1MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkhleCBkdW1wIG9mIHNlY3Rpb24gJyVzJzpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzY2MwotbXNnaWQgImJhZGx5IGZvcm1lZCBleHRlbmRlZCBsaW5lIG9wIGVuY291bnRlcmVkISIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzY3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEV4dGVuZGVkIG9wY29kZSAlZDogIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNjc1Ci1tc2dpZCAiIgotIkVuZCBvZiBTZXF1ZW5jZVxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNjgyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNldCBBZGRyZXNzIHRvIDB4JWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM2ODcKLW1zZ2lkICIgIGRlZmluZSBuZXcgRmlsZSBUYWJsZSBlbnRyeVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNjg4IHJlYWRlbGYuYzozODA2Ci1tc2dpZCAiICBFbnRyeVx0RGlyXHRUaW1lXHRTaXplXHROYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM2OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgJWRcdCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzY5MyByZWFkZWxmLmM6MzY5NSByZWFkZWxmLmM6MzY5NyByZWFkZWxmLmM6MzgxOCByZWFkZWxmLmM6MzgyMAotIzogcmVhZGVsZi5jOjM4MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJWx1XHQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM2OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVU5LTk9XTjogbGVuZ3RoICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkR1bXAgb2YgZGVidWcgY29udGVudHMgb2Ygc2VjdGlvbiAlczpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzczNgotbXNnaWQgIlRoZSBsaW5lIGluZm8gYXBwZWFycyB0byBiZSBjb3JydXB0IC0gdGhlIHNlY3Rpb24gaXMgdG9vIHNtYWxsXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NDQKLW1zZ2lkICJPbmx5IERXQVJGIHZlcnNpb24gMiBsaW5lIGluZm8gaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzc1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIExlbmd0aDogICAgICAgICAgICAgICAgICAgICAgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBEV0FSRiBWZXJzaW9uOiAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBQcm9sZ3VlIExlbmd0aDogICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBNaW5pbXVtIEluc3RydWN0aW9uIExlbmd0aDogICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBJbml0aWFsIHZhbHVlIG9mICdpc19zdG10JzogICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBMaW5lIEJhc2U6ICAgICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBMaW5lIFJhbmdlOiAgICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPcGNvZGUgQmFzZTogICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NzUKLW1zZ2lkICIiCi0iXG4iCi0iIE9wY29kZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPcGNvZGUgJWQgaGFzICVkIGFyZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzc4NAotbXNnaWQgIiIKLSJcbiIKLSIgVGhlIERpcmVjdG9yeSBUYWJsZSBpcyBlbXB0eS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzc4NwotbXNnaWQgIiIKLSJcbiIKLSIgVGhlIERpcmVjdG9yeSBUYWJsZTpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzc5MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MDIKLW1zZ2lkICIiCi0iXG4iCi0iIFRoZSBGaWxlIE5hbWUgVGFibGUgaXMgZW1wdHkuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MDUKLW1zZ2lkICIiCi0iXG4iCi0iIFRoZSBGaWxlIE5hbWUgVGFibGU6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlZFx0IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzXG4iCi1tc2dzdHIgIiIKLQotIy4gTm93IGRpc3BsYXkgdGhlIHN0YXRlbWVudHMuCi0jOiByZWFkZWxmLmM6MzgzMgotbXNnaWQgIiIKLSJcbiIKLSIgTGluZSBOdW1iZXIgU3RhdGVtZW50czpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzg1MAotbXNnaWQgIiAgQ29weVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQWR2YW5jZSBQQyBieSAlZCB0byAlbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzg2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFkdmFuY2UgTGluZSBieSAlZCB0byAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2V0IEZpbGUgTmFtZSB0byBlbnRyeSAlZCBpbiB0aGUgRmlsZSBOYW1lIFRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTZXQgY29sdW1uIHRvICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTZXQgaXNfc3RtdCB0byAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODkyCi1tc2dpZCAiICBTZXQgYmFzaWMgYmxvY2tcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzg5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFkdmFuY2UgUEMgYnkgY29uc3RhbnQgJWQgdG8gMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzkwNwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFkdmFuY2UgUEMgYnkgZml4ZWQgc2l6ZSBhbW91bnQgJWQgdG8gMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzkxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNwZWNpYWwgb3Bjb2RlICVkOiBhZHZhbmNlIEFkZHJlc3MgYnkgJWQgdG8gMHglbHgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGFuZCBMaW5lIGJ5ICVkIHRvICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5NDIgcmVhZGVsZi5jOjQzNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkNvbnRlbnRzIG9mIHRoZSAlcyBzZWN0aW9uOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozOTYxCi1tc2dpZCAiT25seSBEV0FSRiAyIHB1Ym5hbWVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozOTY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozOTY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPZmZzZXQgaW50byAuZGVidWdfaW5mbyBzZWN0aW9uOiAgICAgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIGFyZWEgaW4gLmRlYnVnX2luZm8gc2VjdGlvbjogJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5NzQKLW1zZ2lkICIiCi0iXG4iCi0iICAgIE9mZnNldFx0TmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MDU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gVEFHIHZhbHVlOiAlbHgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQxNTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBBVCB2YWx1ZTogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MTg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gRk9STSB2YWx1ZTogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MzY3Ci1tc2dpZCAiICBOdW1iZXIgVEFHXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQzNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgJWxkICAgICAgJXMgICAgWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0Mzc2Ci1tc2dpZCAiaGFzIGNoaWxkcmVuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0Mzc2Ci1tc2dpZCAibm8gY2hpbGRyZW4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQzODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICUtMThzICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQzOTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICVsdSBieXRlIGJsb2NrOiAiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ1NjgKLW1zZ2lkICIoVXNlciBkZWZpbmVkIGxvY2F0aW9uIG9wKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDU3MAotbXNnaWQgIihVbmtub3duIGxvY2F0aW9uIG9wKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDY4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmFibGUgdG8gaGFuZGxlIEZPUk06ICVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NjkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXNlZCBmb3JtOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDcwNAotbXNnaWQgIihub3QgaW5saW5lZCkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ3MDUKLW1zZ2lkICIoaW5saW5lZCkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ3MDYKLW1zZ2lkICIoZGVjbGFyZWQgYXMgaW5saW5lIGJ1dCBpZ25vcmVkKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDcwNwotbXNnaWQgIihkZWNsYXJlZCBhcyBpbmxpbmUgYW5kIGlubGluZWQpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NzA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgKFVua25vd24gaW5saW5lIGF0dHJpYnV0ZSB2YWx1ZTogJWx4KSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDgzOCByZWFkZWxmLmM6NDk2MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVGhlIHNlY3Rpb24gJXMgY29udGFpbnM6XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ4NjAKLW1zZ2lkICJPbmx5IHZlcnNpb24gMiBEV0FSRiBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0ODY0Ci1tc2dpZCAiICBDb21waWxhdGlvbiBVbml0OlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0ODY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgIExlbmd0aDogICAgICAgICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0ODY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgIFZlcnNpb246ICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ4NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgQWJicmV2IE9mZnNldDogJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ4NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgUG9pbnRlciBTaXplOiAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDg4OAotbXNnaWQgIlVuYWJsZSB0byBsb2NhdGUgLmRlYnVnX2FiYnJldiBzZWN0aW9uIVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuYWJsZSB0byBsb2NhdGUgZW50cnkgJWQgaW4gdGhlIGFiYnJldmlhdGlvbiB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiA8JWQ+PCV4PjogQWJicmV2IE51bWJlcjogJWQgKCVzKVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDk4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDk4MgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE9mZnNldCBpbnRvIC5kZWJ1Z19pbmZvOiAgJWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ5ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBQb2ludGVyIFNpemU6ICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ5ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTZWdtZW50IFNpemU6ICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ5ODYKLW1zZ2lkICIiCi0iXG4iCi0iICAgIEFkZHJlc3MgIExlbmd0aFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1MDIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkRpc3BsYXlpbmcgdGhlIGRlYnVnIGNvbnRlbnRzIG9mIHNlY3Rpb24gJXMgaXMgbm90IHlldCBzdXBwb3J0ZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUwNjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gJyVzJyBoYXMgbm8gZGVidWdnaW5nIGRhdGEuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUwNzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pc2VkIGRlYnVnIHNlY3Rpb246ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUxMTgKLW1zZ2lkICJTb21lIHNlY3Rpb25zIHdlcmUgbm90IGR1bXBlZCBiZWNhdXNlIHRoZXkgZG8gbm90IGV4aXN0IVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1MjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTQ1NAotbXNnaWQgImNvbmZsaWN0IGxpc3Qgd2l0aCB3aXRob3V0IHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1NDgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uICcuY29uZmxpY3QnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU0ODMKLW1zZ2lkICIgIE51bTogICAgSW5kZXggICAgICAgVmFsdWUgIE5hbWUiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU1NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IHN0YXQgaW5wdXQgZmlsZSAlcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTU2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnB1dCBmaWxlICVzIG5vdCBmb3VuZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTU3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogRmFpbGVkIHRvIHJlYWQgZmlsZSBoZWFkZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTU4NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRmlsZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZW5hbWUuYzoxMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbm5vdCBzZXQgdGltZTogJXMiCi1tc2dzdHIgIiIKLQotIy4gV2UgaGF2ZSB0byBjbGVhbiB1cCBoZXJlLgotIzogcmVuYW1lLmM6MTYwIHJlbmFtZS5jOjE5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcmVuYW1lOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZW5hbWUuYzoyMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNpbXBsZV9jb3B5OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vdCBlbm91Z2ggYmluYXJ5IGRhdGEiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTQ5Ci1tc2dpZCAibnVsbCB0ZXJtaW5hdGVkIHVuaWNvZGUgc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjE3OSByZXNiaW4uYzoxODUKLW1zZ2lkICJyZXNvdXJjZSBJRCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoyMjkKLW1zZ2lkICJjdXJzb3IiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MjYzIHJlc2Jpbi5jOjI3MAotbXNnaWQgIm1lbnUgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjI4MAotbXNnaWQgIm1lbnVleCBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6Mjg0Ci1tc2dpZCAibWVudWV4IG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoyOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgbWVudSB2ZXJzaW9uICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjMxOSByZXNiaW4uYzozMzQgcmVzYmluLmM6NDAwCi1tc2dpZCAibWVudWl0ZW0gaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjQzMAotbXNnaWQgIm1lbnVpdGVtIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjQ3MSByZXNiaW4uYzo0OTkKLW1zZ2lkICJkaWFsb2cgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjQ4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGRpYWxvZyBzaWduYXR1cmUgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NTMxCi1tc2dpZCAiZGlhbG9nIGZvbnQgcG9pbnQgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo1MzkKLW1zZ2lkICJkaWFsb2dleCBmb250IGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjU2NCByZXNiaW4uYzo1ODIKLW1zZ2lkICJkaWFsb2cgY29udHJvbCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo1NzQKLW1zZ2lkICJkaWFsb2dleCBjb250cm9sIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjYwMwotbXNnaWQgImRpYWxvZyBjb250cm9sIGVuZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo2MTUKLW1zZ2lkICJkaWFsb2cgY29udHJvbCBkYXRhIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjY1OAotbXNnaWQgInN0cmluZ3RhYmxlIHN0cmluZyBsZW5ndGgiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NjY4Ci1tc2dpZCAic3RyaW5ndGFibGUgc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjcwMQotbXNnaWQgImZvbnRkaXIgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjcxNAotbXNnaWQgImZvbnRkaXIiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NzMwCi1tc2dpZCAiZm9udGRpciBkZXZpY2UgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo3MzYKLW1zZ2lkICJmb250ZGlyIGZhY2UgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo3NzkKLW1zZ2lkICJhY2NlbGVyYXRvciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo4NDMKLW1zZ2lkICJncm91cCBjdXJzb3IgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjg0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGdyb3VwIGN1cnNvciB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjg2MgotbXNnaWQgImdyb3VwIGN1cnNvciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo5MDEKLW1zZ2lkICJncm91cCBpY29uIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo5MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBncm91cCBpY29uIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6OTIwCi1tc2dpZCAiZ3JvdXAgaWNvbiIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo5OTEgcmVzYmluLmM6MTIxMAotbXNnaWQgInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmciCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTAyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJ2ZXJzaW9uIGxlbmd0aCAlZCBkb2VzIG5vdCBtYXRjaCByZXNvdXJjZSBsZW5ndGggJWx1IgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCB2ZXJzaW9uIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTA0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGZpeGVkIHZlcnNpb24gaW5mb3JtYXRpb24gbGVuZ3RoICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwNDQKLW1zZ2lkICJmaXhlZCB2ZXJzaW9uIGluZm8iCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTA0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGZpeGVkIHZlcnNpb24gc2lnbmF0dXJlICVsdSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMDUyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgZml4ZWQgdmVyc2lvbiBpbmZvIHZlcnNpb24gJWx1IgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwODEKLW1zZ2lkICJ2ZXJzaW9uIHZhciBpbmZvIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBzdHJpbmdmaWxlaW5mbyB2YWx1ZSBsZW5ndGggJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTEwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5ndGFibGUgdmFsdWUgbGVuZ3RoICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjExNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZyBsZW5ndGggJWQgIT0gJWQgKyAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMTUzCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmcgbGVuZ3RoICVkIDwgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTE3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIHZhcmZpbGVpbmZvIHZhbHVlIGxlbmd0aCAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMTg5Ci1tc2dpZCAidmVyc2lvbiB2YXJmaWxlaW5mbyIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgdmVyc2lvbiB2YWx1ZSBsZW5ndGggJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjEyOAotbXNnaWQgImZpbGVuYW1lIHJlcXVpcmVkIGZvciBDT0ZGIGlucHV0IgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzoxNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBubyByZXNvdXJjZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjE1NAotbXNnaWQgImNhbid0IHJlYWQgcmVzb3VyY2Ugc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MTgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogYWRkcmVzcyBvdXQgb2YgYm91bmRzIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzoxOTkKLW1zZ2lkICJkaXJlY3RvcnkiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjIyNwotbXNnaWQgIm5hbWVkIGRpcmVjdG9yeSBlbnRyeSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MjM2Ci1tc2dpZCAiZGlyZWN0b3J5IGVudHJ5IG5hbWUiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjI1NgotbXNnaWQgIm5hbWVkIHN1YmRpcmVjdG9yeSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MjY0Ci1tc2dpZCAibmFtZWQgcmVzb3VyY2UiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjI3OQotbXNnaWQgIklEIGRpcmVjdG9yeSBlbnRyeSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6Mjk2Ci1tc2dpZCAiSUQgc3ViZGlyZWN0b3J5IgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzozMDQKLW1zZ2lkICJJRCByZXNvdXJjZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MzMwCi1tc2dpZCAicmVzb3VyY2UgdHlwZSB1bmtub3duIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzozMzMKLW1zZ2lkICJkYXRhIGVudHJ5IgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzozNDEKLW1zZ2lkICJyZXNvdXJjZSBkYXRhIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzozNDYKLW1zZ2lkICJyZXNvdXJjZSBkYXRhIHNpemUiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjQ0MQotbXNnaWQgImZpbGVuYW1lIHJlcXVpcmVkIGZvciBDT0ZGIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6NzI5Ci1tc2dpZCAiY2FuJ3QgZ2V0IEJGRF9SRUxPQ19SVkEgcmVsb2NhdGlvbiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IHBvcGVuIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MTYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBwcmVwcm9jZXNzb3IgZmFpbGVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzoyMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuZXhwZWN0ZWQgRU9GIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MjY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiByZWFkIG9mICVsdSByZXR1cm5lZCAlbHUiCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzozMDcgcmVzcmMuYzo1MzggcmVzcmMuYzo4MTEgcmVzcmMuYzo5NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3RhdCBmYWlsZWQgb24gYml0bWFwIGZpbGUgYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzozNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY3Vyc29yIGZpbGUgYCVzJyBkb2VzIG5vdCBjb250YWluIGN1cnNvciBkYXRhIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MzkyIHJlc3JjLmM6NjgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBmc2VlayB0byAlbHUgZmFpbGVkOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZXNyYy5jOjY1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJpY29uIGZpbGUgYCVzJyBkb2VzIG5vdCBjb250YWluIGljb24gZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiByZXNyYy5jOjExNzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuJ3Qgb3BlbiBgJXMnIGZvciBvdXRwdXQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNpemUuYzo3OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVXNhZ2U6ICVzIFstQUJkb3hWXSBbLS1mb3JtYXQ9YmVya2VsZXl8c3lzdl0gWy0tcmFkaXg9OHwxMHwxNl1cbiIKLSIgICAgICAgWy0tdGFyZ2V0PWJmZG5hbWVdIFstLXZlcnNpb25dIFstLWhlbHBdIFtmaWxlLi4uXVxuIgotbXNnc3RyICIiCi0KLSM6IHNpemUuYzo4MwotbXNnaWQgImRlZmF1bHQgaXMgLS1mb3JtYXQ9YmVya2VsZXlcbiIKLW1zZ3N0ciAiIgotCi0jOiBzaXplLmM6ODUKLW1zZ2lkICJkZWZhdWx0IGlzIC0tZm9ybWF0PXN5c3ZcbiIKLW1zZ3N0ciAiIgotCi0jOiBzaXplLmM6MTM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgYXJndW1lbnQgdG8gLS1mb3JtYXQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc2l6ZS5jOjE2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIHJhZGl4OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyY29udi5jOjE4NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVXNhZ2U6ICVzIFstZGhWcV0gaW4tZmlsZSBbb3V0LWZpbGVdXG4iCi1tc2dzdHIgIiIKLQotIzogc3Jjb252LmM6MTg4NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ29udmVydCBhIENPRkYgb2JqZWN0IGZpbGUgaW50byBhIFNZU1JPRkYgb2JqZWN0IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmNvbnYuYzoyMDI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmFibGUgdG8gb3BlbiBvdXRwdXQgZmlsZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MzQ5IHN0YWJzLmM6MTc2MgotbXNnaWQgIm51bWVyaWMgb3ZlcmZsb3ciCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzozNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQmFkIHN0YWI6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzozNzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogJXM6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzo0OTIKLW1zZ2lkICJOX0xCUkFDIG5vdCB3aXRoaW4gZnVuY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjUzMQotbXNnaWQgIlRvbyBtYW55IE5fUkJSQUNzXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzo3ODAKLW1zZ2lkICJ1bmtub3duIEMrKyBlbmNvZGVkIG5hbWUiCi1tc2dzdHIgIiIKLQotIy4gQ29tcGxhaW4gYW5kIGtlZXAgZ29pbmcsIHNvIGNvbXBpbGVycyBjYW4gaW52ZW50IG5ldwotIy4gY3Jvc3MtcmVmZXJlbmNlIHR5cGVzLgotIzogc3RhYnMuYzoxMzA2Ci1tc2dpZCAidW5yZWNvZ25pemVkIGNyb3NzIHJlZmVyZW5jZSB0eXBlIgotbXNnc3RyICIiCi0KLSMuIERvZXMgdGhpcyBhY3R1YWxseSBldmVyIGhhcHBlbj8gIElzIHRoYXQgd2h5IHdlIGFyZSB3b3JyeWluZwotIy4gYWJvdXQgZGVhbGluZyB3aXRoIGl0IHJhdGhlciB0aGFuIGp1c3QgY2FsbGluZyBlcnJvcl90eXBlPwotIzogc3RhYnMuYzoxODU0Ci1tc2dpZCAibWlzc2luZyBpbmRleCB0eXBlIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MjE4MQotbXNnaWQgInVua25vd24gdmlydHVhbCBjaGFyYWN0ZXIgZm9yIGJhc2VjbGFzcyIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjIxOTkKLW1zZ2lkICJ1bmtub3duIHZpc2liaWxpdHkgY2hhcmFjdGVyIGZvciBiYXNlY2xhc3MiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyMzkxCi1tc2dpZCAidW5uYW1lZCAkdmIgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjIzOTcKLW1zZ2lkICJ1bnJlY29nbml6ZWQgQysrIGFiYnJldmlhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjI0NzcKLW1zZ2lkICJ1bmtub3duIHZpc2liaWxpdHkgY2hhcmFjdGVyIGZvciBmaWVsZCIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjI3MzMKLW1zZ2lkICJjb25zdC92b2xhdGlsZSBpbmRpY2F0b3IgbWlzc2luZyIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjI5NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTm8gbWFuZ2xpbmcgZm9yIFwiJXNcIlxuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MzI4NgotbXNnaWQgIlVuZGVmaW5lZCBOX0VYQ0wiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzozMzc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlR5cGUgZmlsZSBudW1iZXIgJWQgb3V0IG9mIHJhbmdlXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzozMzc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlR5cGUgaW5kZXggbnVtYmVyICVkIG91dCBvZiByYW5nZVxuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MzQ2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgWENPRkYgdHlwZSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6Mzc2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgbWFuZ2xlZCBuYW1lIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjM4NjEKLW1zZ2lkICJubyBhcmd1bWVudCB0eXBlcyBpbiBtYW5nbGVkIHN0cmluZ1xuIgotbXNnc3RyICIiCi0KLSM6IHN0cmluZ3MuYzoxNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGludmFsaWQgbnVtYmVyICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3RyaW5ncy5jOjQ5NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW52YWxpZCBpbnRlZ2VyIGFyZ3VtZW50ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3RyaW5ncy5jOjUwNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVXNhZ2U6ICVzIFstYWZvdl0gWy1uIG1pbi1sZW5dIFstbWluLWxlbl0gWy10IHtvLHgsZH1dIFstXVxuIgotIiAgICAgICBbLS1hbGxdIFstLXByaW50LWZpbGUtbmFtZV0gWy0tYnl0ZXM9bWluLWxlbl0gWy0tcmFkaXg9e28seCxkfV1cbiIKLSIgICAgICAgWy0tdGFyZ2V0PWJmZG5hbWVdIFstLWhlbHBdIFstLXZlcnNpb25dIGZpbGUuLi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzeXNkdW1wLmM6NzEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVzYWdlOiAlcyBbLWhWXSBpbi1maWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3lzZHVtcC5jOjc4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHZlcnNpb24uYzozOQotbXNnaWQgIkNvcHlyaWdodCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIgotbXNnc3RyICIiCi0KLSM6IHZlcnNpb24uYzo0MAotbXNnaWQgIiIKLSJUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG4iCi0idGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzoyMjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuJ3Qgb3BlbiAlcyBgJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NDA3Ci1tc2dpZCAiOiBleHBlY3RlZCB0byBiZSBhIGRpcmVjdG9yeVxuIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo0MTkKLW1zZ2lkICI6IGV4cGVjdGVkIHRvIGJlIGEgbGVhZlxuIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo0MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6ICIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NDMwCi1tc2dpZCAiOiBkdXBsaWNhdGUgdmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmtub3duIGZvcm1hdCB0eXBlIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NTk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzdXBwb3J0ZWQgZm9ybWF0czoiCi1tc2dzdHIgIiIKLQotIy4gT3RoZXJ3aXNlLCB3ZSBnaXZlIHVwLgotIzogd2luZHJlcy5jOjY4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4gbm90IGRldGVybWluZSB0eXBlIG9mIGZpbGUgYCVzJzsgdXNlIHRoZSAtSSBvcHRpb24iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjY5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2FnZTogJXMgW29wdGlvbnNdIFtpbnB1dC1maWxlXSBbb3V0cHV0LWZpbGVdXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjY5NwotbXNnaWQgIiIKLSJPcHRpb25zOlxuIgotIiAgLWkgRklMRSwgLS1pbnB1dCBGSUxFICAgICAgIE5hbWUgaW5wdXQgZmlsZVxuIgotIiAgLW8gRklMRSwgLS1vdXRwdXQgRklMRSAgICAgIE5hbWUgb3V0cHV0IGZpbGVcbiIKLSIgIC1JIEZPUk1BVCwgLS1pbnB1dC1mb3JtYXQgRk9STUFUXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmeSBpbnB1dCBmb3JtYXRcbiIKLSIgIC1PIEZPUk1BVCwgLS1vdXRwdXQtZm9ybWF0IEZPUk1BVFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZnkgb3V0cHV0IGZvcm1hdFxuIgotIiAgLUYgVEFSR0VULCAtLXRhcmdldCBUQVJHRVQgIFNwZWNpZnkgQ09GRiB0YXJnZXRcbiIKLSIgIC0tcHJlcHJvY2Vzc29yIFBST0dSQU0gICAgICBQcm9ncmFtIHRvIHVzZSB0byBwcmVwcm9jZXNzIHJjIGZpbGVcbiIKLSIgIC0taW5jbHVkZS1kaXIgRElSICAgICAgICAgICBJbmNsdWRlIGRpcmVjdG9yeSB3aGVuIHByZXByb2Nlc3NpbmcgcmMgZmlsZVxuIgotIiAgLS1kZWZpbmUgU1lNWz1WQUxdICAgICAgICAgIERlZmluZSBTWU0gd2hlbiBwcmVwcm9jZXNzaW5nIHJjIGZpbGVcbiIKLSIgIC0tbGFuZ3VhZ2UgVkFMICAgICAgICAgICAgICBTZXQgbGFuZ3VhZ2Ugd2hlbiByZWFkaW5nIHJjIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NzExCi1tc2dpZCAiICAtLXl5ZGVidWcgICAgICAgICAgICAgICAgICAgVHVybiBvbiBwYXJzZXIgZGVidWdnaW5nXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjcxNAotbXNnaWQgIiIKLSIgIC0taGVscCAgICAgICAgICAgICAgICAgICAgICBQcmludCB0aGlzIGhlbHAgbWVzc2FnZVxuIgotIiAgLS12ZXJzaW9uICAgICAgICAgICAgICAgICAgIFByaW50IHZlcnNpb24gaW5mb3JtYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NzE3Ci1tc2dpZCAiIgotIkZPUk1BVCBpcyBvbmUgb2YgcmMsIHJlcywgb3IgY29mZiwgYW5kIGlzIGRlZHVjZWQgZnJvbSB0aGUgZmlsZSBuYW1lXG4iCi0iZXh0ZW5zaW9uIGlmIG5vdCBzcGVjaWZpZWQuICBBIHNpbmdsZSBmaWxlIG5hbWUgaXMgYW4gaW5wdXQgZmlsZS5cbiIKLSJObyBpbnB1dC1maWxlIGlzIHN0ZGluLCBkZWZhdWx0IHJjLiAgTm8gb3V0cHV0LWZpbGUgaXMgc3Rkb3V0LCBkZWZhdWx0IHJjLlxuIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo5MTgKLW1zZ2lkICJubyByZXNvdXJjZXMiCi1tc2dzdHIgIiIKLQotIzogd3JzdGFicy5jOjM2NiB3cnN0YWJzLmM6MjAyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzdHJpbmdfaGFzaF9sb29rdXAgZmFpbGVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHdyc3RhYnMuYzo2NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3RhYl9pbnRfdHlwZTogYmFkIHNpemUgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiB3cnN0YWJzLmM6MTQ2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogdW5rbm93biBzaXplIGZvciBmaWVsZCBgJXMnIGluIHN0cnVjdFxuIgotbXNnc3RyICIiCmRpZmYgLS1naXQgYS9iaW51dGlscy9wcmRiZy5jIGIvYmludXRpbHMvcHJkYmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4Y2JkMi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9wcmRiZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg2MiArMCwwIEBACi0vKiBwcmRiZy5jIC0tIFByaW50IG91dCBnZW5lcmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgcHJpbnRzIG91dCB0aGUgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGJ5Ci0gICBzdXBwbHlpbmcgYSBzZXQgb2Ygcm91dGluZXMgdG8gZGVidWdfd3JpdGUuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotLyogVGhpcyBpcyB0aGUgc3RydWN0dXJlIHdlIHVzZSBhcyBhIGhhbmRsZSBmb3IgdGhlc2Ugcm91dGluZXMuICAqLwotCi1zdHJ1Y3QgcHJfaGFuZGxlCi17Ci0gIC8qIEZpbGUgdG8gcHJpbnQgaW5mb3JtYXRpb24gdG8uICAqLwotICBGSUxFICpmOwotICAvKiBDdXJyZW50IGluZGVudGF0aW9uIGxldmVsLiAgKi8KLSAgdW5zaWduZWQgaW50IGluZGVudDsKLSAgLyogVHlwZSBzdGFjay4gICovCi0gIHN0cnVjdCBwcl9zdGFjayAqc3RhY2s7Ci0gIC8qIFBhcmFtZXRlciBudW1iZXIgd2UgYXJlIGFib3V0IHRvIG91dHB1dC4gICovCi0gIGludCBwYXJhbWV0ZXI7Ci19OwotCi0vKiBUaGUgdHlwZSBzdGFjay4gICovCi0KLXN0cnVjdCBwcl9zdGFjawotewotICAvKiBOZXh0IGVsZW1lbnQgb24gdGhlIHN0YWNrLiAgKi8KLSAgc3RydWN0IHByX3N0YWNrICpuZXh0OwotICAvKiBUaGlzIGVsZW1lbnQuICAqLwotICBjaGFyICp0eXBlOwotICAvKiBDdXJyZW50IHZpc2liaWxpdHkgb2YgZmllbGRzIGlmIHRoaXMgaXMgYSBjbGFzcy4gICovCi0gIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAvKiBOYW1lIG9mIHRoZSBjdXJyZW50IG1ldGhvZCB3ZSBhcmUgaGFuZGxpbmcuICAqLwotICBjb25zdCBjaGFyICptZXRob2Q7Ci19OwotCi1zdGF0aWMgdm9pZCBpbmRlbnQgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwdXNoX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByZXBlbmRfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgcHJfaGFuZGxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gYXBwZW5kX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN1YnN0aXR1dGVfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgcHJfaGFuZGxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaW5kZW50X3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqKSk7Ci1zdGF0aWMgY2hhciAqcG9wX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqKSk7Ci1zdGF0aWMgdm9pZCBwcmludF92bWEgUEFSQU1TICgoYmZkX3ZtYSwgY2hhciAqLCBib29sZWFuLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9maXhfdmlzaWJpbGl0eQotICBQQVJBTVMgKChzdHJ1Y3QgcHJfaGFuZGxlICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotCi1zdGF0aWMgYm9vbGVhbiBwcl9zdGFydF9jb21waWxhdGlvbl91bml0IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zdGFydF9zb3VyY2UgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByX2VtcHR5X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl92b2lkX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9pbnRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfZmxvYXRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gcHJfY29tcGxleF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9ib29sX3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHByX2VudW1fdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgYmZkX3NpZ25lZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gcHJfcG9pbnRlcl90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfZnVuY3Rpb25fdHlwZSBQQVJBTVMgKChQVFIsIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfcmVmZXJlbmNlX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9yYW5nZV90eXBlIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9hcnJheV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zZXRfdHlwZSBQQVJBTVMgKChQVFIsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX29mZnNldF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfbWV0aG9kX3R5cGUgUEFSQU1TICgoUFRSLCBib29sZWFuLCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX2NvbnN0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl92b2xhdGlsZV90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfc3RhcnRfc3RydWN0X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zdHJ1Y3RfZmllbGQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEsIGJmZF92bWEsIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gcHJfZW5kX3N0cnVjdF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfc3RhcnRfY2xhc3NfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBib29sZWFuLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sCi0JICAgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfY2xhc3Nfc3RhdGljX21lbWJlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIHByX2NsYXNzX2Jhc2VjbGFzcwotICBQQVJBTVMgKChQVFIsIGJmZF92bWEsIGJvb2xlYW4sIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gcHJfY2xhc3Nfc3RhcnRfbWV0aG9kIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9jbGFzc19tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLCBib29sZWFuLAotCSAgIGJmZF92bWEsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9jbGFzc19lbmRfbWV0aG9kIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfZW5kX2NsYXNzX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl90eXBlZGVmX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByX3RhZ190eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGVudW0gZGVidWdfdHlwZV9raW5kKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl90eXBkZWYgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByX3RhZyBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gcHJfaW50X2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9mbG9hdF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZG91YmxlKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl90eXBlZF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gcHJfdmFyaWFibGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmFyX2tpbmQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHByX3N0YXJ0X2Z1bmN0aW9uIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9mdW5jdGlvbl9wYXJhbWV0ZXIKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfcGFybV9raW5kLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zdGFydF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHByX2VuZF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHByX2VuZF9mdW5jdGlvbiBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHByX2xpbmVubyBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSkpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyBwcl9mbnMgPQotewotICBwcl9zdGFydF9jb21waWxhdGlvbl91bml0LAotICBwcl9zdGFydF9zb3VyY2UsCi0gIHByX2VtcHR5X3R5cGUsCi0gIHByX3ZvaWRfdHlwZSwKLSAgcHJfaW50X3R5cGUsCi0gIHByX2Zsb2F0X3R5cGUsCi0gIHByX2NvbXBsZXhfdHlwZSwKLSAgcHJfYm9vbF90eXBlLAotICBwcl9lbnVtX3R5cGUsCi0gIHByX3BvaW50ZXJfdHlwZSwKLSAgcHJfZnVuY3Rpb25fdHlwZSwKLSAgcHJfcmVmZXJlbmNlX3R5cGUsCi0gIHByX3JhbmdlX3R5cGUsCi0gIHByX2FycmF5X3R5cGUsCi0gIHByX3NldF90eXBlLAotICBwcl9vZmZzZXRfdHlwZSwKLSAgcHJfbWV0aG9kX3R5cGUsCi0gIHByX2NvbnN0X3R5cGUsCi0gIHByX3ZvbGF0aWxlX3R5cGUsCi0gIHByX3N0YXJ0X3N0cnVjdF90eXBlLAotICBwcl9zdHJ1Y3RfZmllbGQsCi0gIHByX2VuZF9zdHJ1Y3RfdHlwZSwKLSAgcHJfc3RhcnRfY2xhc3NfdHlwZSwKLSAgcHJfY2xhc3Nfc3RhdGljX21lbWJlciwKLSAgcHJfY2xhc3NfYmFzZWNsYXNzLAotICBwcl9jbGFzc19zdGFydF9tZXRob2QsCi0gIHByX2NsYXNzX21ldGhvZF92YXJpYW50LAotICBwcl9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQsCi0gIHByX2NsYXNzX2VuZF9tZXRob2QsCi0gIHByX2VuZF9jbGFzc190eXBlLAotICBwcl90eXBlZGVmX3R5cGUsCi0gIHByX3RhZ190eXBlLAotICBwcl90eXBkZWYsCi0gIHByX3RhZywKLSAgcHJfaW50X2NvbnN0YW50LAotICBwcl9mbG9hdF9jb25zdGFudCwKLSAgcHJfdHlwZWRfY29uc3RhbnQsCi0gIHByX3ZhcmlhYmxlLAotICBwcl9zdGFydF9mdW5jdGlvbiwKLSAgcHJfZnVuY3Rpb25fcGFyYW1ldGVyLAotICBwcl9zdGFydF9ibG9jaywKLSAgcHJfZW5kX2Jsb2NrLAotICBwcl9lbmRfZnVuY3Rpb24sCi0gIHByX2xpbmVubwotfTsKLQwKLS8qIFByaW50IG91dCB0aGUgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gcmVjb3JkZWQgaW4gZGhhbmRsZS4gICovCi0KLWJvb2xlYW4KLXByaW50X2RlYnVnZ2luZ19pbmZvIChmLCBkaGFuZGxlKQotICAgICBGSUxFICpmOwotICAgICBQVFIgZGhhbmRsZTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSBpbmZvOwotCi0gIGluZm8uZiA9IGY7Ci0gIGluZm8uaW5kZW50ID0gMDsKLSAgaW5mby5zdGFjayA9IE5VTEw7Ci0gIGluZm8ucGFyYW1ldGVyID0gMDsKLQotICByZXR1cm4gZGVidWdfd3JpdGUgKGRoYW5kbGUsICZwcl9mbnMsIChQVFIpICZpbmZvKTsKLX0KLQwKLS8qIEluZGVudCB0byB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbC4gICovCi0KLXN0YXRpYyB2b2lkCi1pbmRlbnQgKGluZm8pCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5pbmRlbnQ7IGkrKykKLSAgICBwdXRjICgnICcsIGluZm8tPmYpOwotfQotCi0vKiBQdXNoIGEgdHlwZSBvbiB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wdXNoX3R5cGUgKGluZm8sIHR5cGUpCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnR5cGU7Ci17Ci0gIHN0cnVjdCBwcl9zdGFjayAqbjsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuID0gKHN0cnVjdCBwcl9zdGFjayAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBtZW1zZXQgKG4sIDAsIHNpemVvZiAqbik7Ci0KLSAgbi0+dHlwZSA9IHhzdHJkdXAgKHR5cGUpOwotICBuLT52aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9JR05PUkU7Ci0gIG4tPm1ldGhvZCA9IE5VTEw7Ci0gIG4tPm5leHQgPSBpbmZvLT5zdGFjazsKLSAgaW5mby0+c3RhY2sgPSBuOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQcmVwZW5kIGEgc3RyaW5nIG9udG8gdGhlIHR5cGUgb24gdGhlIHRvcCBvZiB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcmVwZW5kX3R5cGUgKGluZm8sIHMpCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGNoYXIgKm47Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzKSArIHN0cmxlbiAoaW5mby0+c3RhY2stPnR5cGUpICsgMSk7Ci0gIHNwcmludGYgKG4sICIlcyVzIiwgcywgaW5mby0+c3RhY2stPnR5cGUpOwotICBmcmVlIChpbmZvLT5zdGFjay0+dHlwZSk7Ci0gIGluZm8tPnN0YWNrLT50eXBlID0gbjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXBwZW5kIGEgc3RyaW5nIHRvIHRoZSB0eXBlIG9uIHRoZSB0b3Agb2YgdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYXBwZW5kX3R5cGUgKGluZm8sIHMpCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0KLSAgaWYgKHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICBsZW4gPSBzdHJsZW4gKGluZm8tPnN0YWNrLT50eXBlKTsKLSAgaW5mby0+c3RhY2stPnR5cGUgPSAoY2hhciAqKSB4cmVhbGxvYyAoaW5mby0+c3RhY2stPnR5cGUsCi0JCQkJCSBsZW4gKyBzdHJsZW4gKHMpICsgMSk7Ci0gIHN0cmNweSAoaW5mby0+c3RhY2stPnR5cGUgKyBsZW4sIHMpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSB1c2UgYW4gdW5kZXJzY29yZSB0byBpbmRpY2F0ZSB3aGVyZSB0aGUgbmFtZSBzaG91bGQgZ28gaW4gYSB0eXBlCi0gICBzdHJpbmcuICBUaGlzIGZ1bmN0aW9uIHN1YnN0aXR1dGVzIGEgc3RyaW5nIGZvciB0aGUgdW5kZXJzY29yZS4gIElmCi0gICB0aGVyZSBpcyBubyB1bmRlcnNjb3JlLCB0aGUgbmFtZSBmb2xsb3dzIHRoZSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1YnN0aXR1dGVfdHlwZSAoaW5mbywgcykKLSAgICAgc3RydWN0IHByX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgY2hhciAqdTsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIHUgPSBzdHJjaHIgKGluZm8tPnN0YWNrLT50eXBlLCAnfCcpOwotICBpZiAodSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKm47Ci0KLSAgICAgIG4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGluZm8tPnN0YWNrLT50eXBlKSArIHN0cmxlbiAocykpOwotCi0gICAgICBtZW1jcHkgKG4sIGluZm8tPnN0YWNrLT50eXBlLCB1IC0gaW5mby0+c3RhY2stPnR5cGUpOwotICAgICAgc3RyY3B5IChuICsgKHUgLSBpbmZvLT5zdGFjay0+dHlwZSksIHMpOwotICAgICAgc3RyY2F0IChuLCB1ICsgMSk7Ci0KLSAgICAgIGZyZWUgKGluZm8tPnN0YWNrLT50eXBlKTsKLSAgICAgIGluZm8tPnN0YWNrLT50eXBlID0gbjsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChzdHJjaHIgKHMsICd8JykgIT0gTlVMTAotICAgICAgJiYgKHN0cmNociAoaW5mby0+c3RhY2stPnR5cGUsICd7JykgIT0gTlVMTAotCSAgfHwgc3RyY2hyIChpbmZvLT5zdGFjay0+dHlwZSwgJygnKSAhPSBOVUxMKSkKLSAgICB7Ci0gICAgICBpZiAoISBwcmVwZW5kX3R5cGUgKGluZm8sICIoIikKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIpIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoKnMgPT0gJ1wwJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gKGFwcGVuZF90eXBlIChpbmZvLCAiICIpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgcykpOwotfQotCi0vKiBJbmRlbnQgdGhlIHR5cGUgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgYnkgYXBwZW5kaW5nIHNwYWNlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pbmRlbnRfdHlwZSAoaW5mbykKLSAgICAgc3RydWN0IHByX2hhbmRsZSAqaW5mbzsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGluZm8tPmluZGVudDsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiICIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBvcCBhIHR5cGUgZnJvbSB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBjaGFyICoKLXBvcF90eXBlIChpbmZvKQotICAgICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvOwotewotICBzdHJ1Y3QgcHJfc3RhY2sgKm87Ci0gIGNoYXIgKnJldDsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIG8gPSBpbmZvLT5zdGFjazsKLSAgaW5mby0+c3RhY2sgPSBvLT5uZXh0OwotICByZXQgPSBvLT50eXBlOwotICBmcmVlIChvKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBQcmludCBhIFZNQSB2YWx1ZSBpbnRvIGEgc3RyaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3ZtYSAodm1hLCBidWYsIHVuc2lnbmVkcCwgaGV4cCkKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgYm9vbGVhbiB1bnNpZ25lZHA7Ci0gICAgIGJvb2xlYW4gaGV4cDsKLXsKLSAgaWYgKHNpemVvZiAodm1hKSA8PSBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKQotICAgIHsKLSAgICAgIGlmIChoZXhwKQotCXNwcmludGYgKGJ1ZiwgIjB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpIHZtYSk7Ci0gICAgICBlbHNlIGlmICh1bnNpZ25lZHApCi0Jc3ByaW50ZiAoYnVmLCAiJWx1IiwgKHVuc2lnbmVkIGxvbmcpIHZtYSk7Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmLCAiJWxkIiwgKGxvbmcpIHZtYSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYnVmWzBdID0gJzAnOwotICAgICAgYnVmWzFdID0gJ3gnOwotICAgICAgc3ByaW50Zl92bWEgKGJ1ZiArIDIsIHZtYSk7Ci0gICAgfQotfQotDAotLyogU3RhcnQgYSBuZXcgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9zdGFydF9jb21waWxhdGlvbl91bml0IChwLCBmaWxlbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBhc3NlcnQgKGluZm8tPmluZGVudCA9PSAwKTsKLQotICBmcHJpbnRmIChpbmZvLT5mLCAiJXM6XG4iLCBmaWxlbmFtZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGEgc291cmNlIGZpbGUgd2l0aGluIGEgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9zdGFydF9zb3VyY2UgKHAsIGZpbGVuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+aW5kZW50ID09IDApOwotCi0gIGZwcmludGYgKGluZm8tPmYsICIgJXM6XG4iLCBmaWxlbmFtZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1c2ggYW4gZW1wdHkgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2VtcHR5X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gcHVzaF90eXBlIChpbmZvLCAiPHVuZGVmaW5lZD4iKTsKLX0KLQotLyogUHVzaCBhIHZvaWQgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3ZvaWRfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBwdXNoX3R5cGUgKGluZm8sICJ2b2lkIik7Ci19Ci0KLS8qIFB1c2ggYW4gaW50ZWdlciB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfaW50X3R5cGUgKHAsIHNpemUsIHVuc2lnbmVkcCkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBib29sZWFuIHVuc2lnbmVkcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJbMTBdOwotCi0gIHNwcmludGYgKGFiLCAiJXNpbnQlZCIsIHVuc2lnbmVkcCA/ICJ1IiA6ICIiLCBzaXplICogOCk7Ci0gIHJldHVybiBwdXNoX3R5cGUgKGluZm8sIGFiKTsKLX0KLQotLyogUHVzaCBhIGZsb2F0aW5nIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9mbG9hdF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyIGFiWzEwXTsKLQotICBpZiAoc2l6ZSA9PSA0KQotICAgIHJldHVybiBwdXNoX3R5cGUgKGluZm8sICJmbG9hdCIpOwotICBlbHNlIGlmIChzaXplID09IDgpCi0gICAgcmV0dXJuIHB1c2hfdHlwZSAoaW5mbywgImRvdWJsZSIpOwotCi0gIHNwcmludGYgKGFiLCAiZmxvYXQlZCIsIHNpemUgKiA4KTsKLSAgcmV0dXJuIHB1c2hfdHlwZSAoaW5mbywgYWIpOwotfQotCi0vKiBQdXNoIGEgY29tcGxleCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY29tcGxleF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGlmICghIHByX2Zsb2F0X3R5cGUgKHAsIHNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gcHJlcGVuZF90eXBlIChpbmZvLCAiY29tcGxleCAiKTsKLX0KLQotLyogUHVzaCBhIGJvb2xlYW4gdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2Jvb2xfdHlwZSAocCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsxMF07Ci0KLSAgc3ByaW50ZiAoYWIsICJib29sJWQiLCBzaXplICogOCk7Ci0KLSAgcmV0dXJuIHB1c2hfdHlwZSAoaW5mbywgYWIpOwotfQotCi0vKiBQdXNoIGFuIGVudW0gdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2VudW1fdHlwZSAocCwgdGFnLCBuYW1lcywgdmFsdWVzKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICBjb25zdCBjaGFyICoqbmFtZXM7Ci0gICAgIGJmZF9zaWduZWRfdm1hICp2YWx1ZXM7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgYmZkX3NpZ25lZF92bWEgdmFsOwotCi0gIGlmICghIHB1c2hfdHlwZSAoaW5mbywgImVudW0gIikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAodGFnICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIHRhZykKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICJ7ICIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIi8qIHVuZGVmaW5lZCAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgPSAwOwotICAgICAgZm9yIChpID0gMDsgbmFtZXNbaV0gIT0gTlVMTDsgaSsrKQotCXsKLQkgIGlmIChpID4gMCkKLQkgICAgewotCSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiLCAiKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBuYW1lc1tpXSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKHZhbHVlc1tpXSAhPSB2YWwpCi0JICAgIHsKLQkgICAgICBjaGFyIGFiWzIwXTsKLQotCSAgICAgIHByaW50X3ZtYSAodmFsdWVzW2ldLCBhYiwgZmFsc2UsIGZhbHNlKTsKLQkgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiA9ICIpCi0JCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgdmFsID0gdmFsdWVzW2ldOwotCSAgICB9Ci0KLQkgICsrdmFsOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGFwcGVuZF90eXBlIChpbmZvLCAiIH0iKTsKLX0KLQotLyogVHVybiB0aGUgdG9wIHR5cGUgb24gdGhlIHN0YWNrIGludG8gYSBwb2ludGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3BvaW50ZXJfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICpzOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0KLSAgcyA9IHN0cmNociAoaW5mby0+c3RhY2stPnR5cGUsICd8Jyk7Ci0gIGlmIChzICE9IE5VTEwgJiYgc1sxXSA9PSAnWycpCi0gICAgcmV0dXJuIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIigqfCkiKTsKLSAgcmV0dXJuIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIip8Iik7Ci19Ci0KLS8qIFR1cm4gdGhlIHRvcCB0eXBlIG9uIHRoZSBzdGFjayBpbnRvIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoYXQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9mdW5jdGlvbl90eXBlIChwLCBhcmdjb3VudCwgdmFyYXJncykKLSAgICAgUFRSIHA7Ci0gICAgIGludCBhcmdjb3VudDsKLSAgICAgYm9vbGVhbiB2YXJhcmdzOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqKmFyZ190eXBlczsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgY2hhciAqczsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIGxlbiA9IDEwOwotCi0gIGlmIChhcmdjb3VudCA8PSAwKQotICAgIHsKLSAgICAgIGFyZ190eXBlcyA9IE5VTEw7Ci0gICAgICBsZW4gKz0gMTU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGFyZ190eXBlcyA9IChjaGFyICoqKSB4bWFsbG9jIChhcmdjb3VudCAqIHNpemVvZiAqYXJnX3R5cGVzKTsKLSAgICAgIGZvciAoaSA9IGFyZ2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGFyZ190eXBlc1tpXSA9IHBvcF90eXBlIChpbmZvKTsKLQkgIGlmIChhcmdfdHlwZXNbaV0gPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgbGVuICs9IHN0cmxlbiAoYXJnX3R5cGVzW2ldKSArIDI7Ci0JfQotICAgICAgaWYgKHZhcmFyZ3MpCi0JbGVuICs9IDU7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGUgcmV0dXJuIHR5cGUgaXMgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suICAqLwotCi0gIHMgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOwotICBzdHJjcHkgKHMsICIofCkgKCIpOwotCi0gIGlmIChhcmdjb3VudCA8IDApCi0gICAgc3RyY2F0IChzLCAiLyogdW5rbm93biAqLyIpOwotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKQotCXsKLQkgIGlmIChpID4gMCkKLQkgICAgc3RyY2F0IChzLCAiLCAiKTsKLQkgIHN0cmNhdCAocywgYXJnX3R5cGVzW2ldKTsKLQl9Ci0gICAgICBpZiAodmFyYXJncykKLQl7Ci0JICBpZiAoaSA+IDApCi0JICAgIHN0cmNhdCAocywgIiwgIik7Ci0JICBzdHJjYXQgKHMsICIuLi4iKTsKLQl9Ci0gICAgICBpZiAoYXJnY291bnQgPiAwKQotCWZyZWUgKGFyZ190eXBlcyk7Ci0gICAgfQotCi0gIHN0cmNhdCAocywgIikiKTsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIHMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVHVybiB0aGUgdG9wIHR5cGUgb24gdGhlIHN0YWNrIGludG8gYSByZWZlcmVuY2UgdG8gdGhhdCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3JlZmVyZW5jZV90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICByZXR1cm4gc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiJnwiKTsKLX0KLQotLyogTWFrZSBhIHJhbmdlIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfcmFuZ2VfdHlwZSAocCwgbG93ZXIsIHVwcGVyKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3NpZ25lZF92bWEgbG93ZXI7Ci0gICAgIGJmZF9zaWduZWRfdm1hIHVwcGVyOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYmxbMjBdLCBhYnVbMjBdOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHByaW50X3ZtYSAobG93ZXIsIGFibCwgZmFsc2UsIGZhbHNlKTsKLSAgcHJpbnRfdm1hICh1cHBlciwgYWJ1LCBmYWxzZSwgZmFsc2UpOwotCi0gIHJldHVybiAocHJlcGVuZF90eXBlIChpbmZvLCAicmFuZ2UgKCIpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgIik6IikKLQkgICYmIGFwcGVuZF90eXBlIChpbmZvLCBhYmwpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgIjoiKQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sIGFidSkpOwotfQotCi0vKiBNYWtlIGFuIGFycmF5IHR5cGUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1wcl9hcnJheV90eXBlIChwLCBsb3dlciwgdXBwZXIsIHN0cmluZ3ApCi0gICAgIFBUUiBwOwotICAgICBiZmRfc2lnbmVkX3ZtYSBsb3dlcjsKLSAgICAgYmZkX3NpZ25lZF92bWEgdXBwZXI7Ci0gICAgIGJvb2xlYW4gc3RyaW5ncDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnJhbmdlX3R5cGU7Ci0gIGNoYXIgYWJsWzIwXSwgYWJ1WzIwXSwgYWJbNTBdOwotCi0gIHJhbmdlX3R5cGUgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmIChyYW5nZV90eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChsb3dlciA9PSAwKQotICAgIHsKLSAgICAgIGlmICh1cHBlciA9PSAtMSkKLQlzcHJpbnRmIChhYiwgInxbXSIpOwotICAgICAgZWxzZQotCXsKLQkgIHByaW50X3ZtYSAodXBwZXIgKyAxLCBhYnUsIGZhbHNlLCBmYWxzZSk7Ci0JICBzcHJpbnRmIChhYiwgInxbJXNdIiwgYWJ1KTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRfdm1hIChsb3dlciwgYWJsLCBmYWxzZSwgZmFsc2UpOwotICAgICAgcHJpbnRfdm1hICh1cHBlciwgYWJ1LCBmYWxzZSwgZmFsc2UpOwotICAgICAgc3ByaW50ZiAoYWIsICJ8WyVzOiVzXSIsIGFibCwgYWJ1KTsKLSAgICB9Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBhYikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChzdHJjbXAgKHJhbmdlX3R5cGUsICJpbnQiKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiOiIpCi0JICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCByYW5nZV90eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChzdHJpbmdwKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIC8qIHN0cmluZyAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSBzZXQgdHlwZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXByX3NldF90eXBlIChwLCBiaXRzdHJpbmdwKQotICAgICBQVFIgcDsKLSAgICAgYm9vbGVhbiBiaXRzdHJpbmdwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCAic2V0IHsgIikKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgfSIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYml0c3RyaW5ncCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIi8qIGJpdHN0cmluZyAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYW4gb2Zmc2V0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfb2Zmc2V0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdDsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIChzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKQotCSAgJiYgcHJlcGVuZF90eXBlIChpbmZvLCAiICIpCi0JICAmJiBwcmVwZW5kX3R5cGUgKGluZm8sIHQpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgIjo6fCIpKTsKLX0KLQotLyogTWFrZSBhIG1ldGhvZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX21ldGhvZF90eXBlIChwLCBkb21haW4sIGFyZ2NvdW50LCB2YXJhcmdzKQotICAgICBQVFIgcDsKLSAgICAgYm9vbGVhbiBkb21haW47Ci0gICAgIGludCBhcmdjb3VudDsKLSAgICAgYm9vbGVhbiB2YXJhcmdzOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgY2hhciAqZG9tYWluX3R5cGU7Ci0gIGNoYXIgKiphcmdfdHlwZXM7Ci0gIGNoYXIgKnM7Ci0KLSAgbGVuID0gMTA7Ci0KLSAgaWYgKCEgZG9tYWluKQotICAgIGRvbWFpbl90eXBlID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGRvbWFpbl90eXBlID0gcG9wX3R5cGUgKGluZm8pOwotICAgICAgaWYgKGRvbWFpbl90eXBlID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHN0cm5jbXAgKGRvbWFpbl90eXBlLCAiY2xhc3MgIiwgc2l6ZW9mICJjbGFzcyAiIC0gMSkgPT0gMAotCSAgJiYgc3RyY2hyIChkb21haW5fdHlwZSArIHNpemVvZiAiY2xhc3MgIiAtIDEsICcgJykgPT0gTlVMTCkKLQlkb21haW5fdHlwZSArPSBzaXplb2YgImNsYXNzICIgLSAxOwotICAgICAgZWxzZSBpZiAoc3RybmNtcCAoZG9tYWluX3R5cGUsICJ1bmlvbiBjbGFzcyAiLAotCQkJc2l6ZW9mICJ1bmlvbiBjbGFzcyAiKSA9PSAwCi0JICAgICAgICYmIChzdHJjaHIgKGRvbWFpbl90eXBlICsgc2l6ZW9mICJ1bmlvbiBjbGFzcyAiIC0gMSwgJyAnKQotCQkgICA9PSBOVUxMKSkKLQlkb21haW5fdHlwZSArPSBzaXplb2YgInVuaW9uIGNsYXNzICIgLSAxOwotICAgICAgbGVuICs9IHN0cmxlbiAoZG9tYWluX3R5cGUpOwotICAgIH0KLQotICBpZiAoYXJnY291bnQgPD0gMCkKLSAgICB7Ci0gICAgICBhcmdfdHlwZXMgPSBOVUxMOwotICAgICAgbGVuICs9IDE1OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBhcmdfdHlwZXMgPSAoY2hhciAqKikgeG1hbGxvYyAoYXJnY291bnQgKiBzaXplb2YgKmFyZ190eXBlcyk7Ci0gICAgICBmb3IgKGkgPSBhcmdjb3VudCAtIDE7IGkgPj0gMDsgaS0tKQotCXsKLQkgIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBhcmdfdHlwZXNbaV0gPSBwb3BfdHlwZSAoaW5mbyk7Ci0JICBpZiAoYXJnX3R5cGVzW2ldID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGxlbiArPSBzdHJsZW4gKGFyZ190eXBlc1tpXSkgKyAyOwotCX0KLSAgICAgIGlmICh2YXJhcmdzKQotCWxlbiArPSA1OwotICAgIH0KLQotICAvKiBOb3cgdGhlIHJldHVybiB0eXBlIGlzIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KLQotICBzID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLSAgaWYgKCEgZG9tYWluKQotICAgICpzID0gJ1wwJzsKLSAgZWxzZQotICAgIHN0cmNweSAocywgZG9tYWluX3R5cGUpOwotICBzdHJjYXQgKHMsICI6OnwgKCIpOwotCi0gIGlmIChhcmdjb3VudCA8IDApCi0gICAgc3RyY2F0IChzLCAiLyogdW5rbm93biAqLyIpOwotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKQotCXsKLQkgIGlmIChpID4gMCkKLQkgICAgc3RyY2F0IChzLCAiLCAiKTsKLQkgIHN0cmNhdCAocywgYXJnX3R5cGVzW2ldKTsKLQl9Ci0gICAgICBpZiAodmFyYXJncykKLQl7Ci0JICBpZiAoaSA+IDApCi0JICAgIHN0cmNhdCAocywgIiwgIik7Ci0JICBzdHJjYXQgKHMsICIuLi4iKTsKLQl9Ci0gICAgICBpZiAoYXJnY291bnQgPiAwKQotCWZyZWUgKGFyZ190eXBlcyk7Ci0gICAgfQotCi0gIHN0cmNhdCAocywgIikiKTsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIHMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhIGNvbnN0IHF1YWxpZmllZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2NvbnN0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiY29uc3QgfCIpOwotfQotCi0vKiBNYWtlIGEgdm9sYXRpbGUgcXVhbGlmaWVkIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfdm9sYXRpbGVfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICJ2b2xhdGlsZSB8Iik7Ci19Ci0KLS8qIFN0YXJ0IGFjY3VtdWxhdGluZyBhIHN0cnVjdCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3N0YXJ0X3N0cnVjdF90eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGluZm8tPmluZGVudCArPSAyOwotCi0gIGlmICghIHB1c2hfdHlwZSAoaW5mbywgc3RydWN0cCA/ICJzdHJ1Y3QgIiA6ICJ1bmlvbiAiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICh0YWcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgdGFnKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciBpZGJ1ZlsyMF07Ci0KLSAgICAgIHNwcmludGYgKGlkYnVmLCAiJSVhbm9uJXUiLCBpZCk7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgaWRidWYpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgeyIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHNpemUgIT0gMCB8fCB0YWcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyIGFiWzMwXTsKLQotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgLyoiKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChzaXplICE9IDApCi0JewotCSAgc3ByaW50ZiAoYWIsICIgc2l6ZSAldSIsIHNpemUpOwotCSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmICh0YWcgIT0gTlVMTCkKLQl7Ci0JICBzcHJpbnRmIChhYiwgIiBpZCAldSIsIGlkKTsKLQkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBhYikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiXG4iKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5mby0+c3RhY2stPnZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQotICByZXR1cm4gaW5kZW50X3R5cGUgKGluZm8pOwotfQotCi0vKiBPdXRwdXQgdGhlIHZpc2liaWxpdHkgb2YgYSBmaWVsZCBpbiBhIHN0cnVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9maXhfdmlzaWJpbGl0eSAoaW5mbywgdmlzaWJpbGl0eSkKLSAgICAgc3RydWN0IHByX2hhbmRsZSAqaW5mbzsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIGNoYXIgKnQ7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICBpZiAoaW5mby0+c3RhY2stPnZpc2liaWxpdHkgPT0gdmlzaWJpbGl0eSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrLT52aXNpYmlsaXR5ICE9IERFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFKTsKLQotICBzd2l0Y2ggKHZpc2liaWxpdHkpCi0gICAgewotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QVUJMSUM6Ci0gICAgICBzID0gInB1YmxpYyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURToKLSAgICAgIHMgPSAicHJpdmF0ZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOgotICAgICAgcyA9ICJwcm90ZWN0ZWQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX0lHTk9SRToKLSAgICAgIHMgPSAiLyogaWdub3JlICovIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVHJpbSBvZmYgYSB0cmFpbGluZyBzcGFjZSBpbiB0aGUgc3RydWN0IHN0cmluZywgdG8gbWFrZSB0aGUKLSAgICAgb3V0cHV0IGxvb2sgYSBiaXQgYmV0dGVyLCB0aGVuIHN0aWNrIG9uIHRoZSB2aXNpYmlsaXR5IHN0cmluZy4gICovCi0KLSAgdCA9IGluZm8tPnN0YWNrLT50eXBlOwotICBsZW4gPSBzdHJsZW4gKHQpOwotICBhc3NlcnQgKHRbbGVuIC0gMV0gPT0gJyAnKTsKLSAgdFtsZW4gLSAxXSA9ICdcMCc7Ci0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIHMpCi0gICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiOlxuIikKLSAgICAgIHx8ICEgaW5kZW50X3R5cGUgKGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmZvLT5zdGFjay0+dmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIGZpZWxkIHRvIGEgc3RydWN0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfc3RydWN0X2ZpZWxkIChwLCBuYW1lLCBiaXRwb3MsIGJpdHNpemUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgYmZkX3ZtYSBiaXRzaXplOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJbMjBdOwotICBjaGFyICp0OwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiOyAvKiAiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJpdHNpemUgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF92bWEgKGJpdHNpemUsIGFiLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgImJpdHNpemUgIikKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKQotCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiwgIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBwcmludF92bWEgKGJpdHBvcywgYWIsIHRydWUsIGZhbHNlKTsKLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICJiaXRwb3MgIikKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAqL1xuIikKLSAgICAgIHx8ICEgaW5kZW50X3R5cGUgKGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBwcl9maXhfdmlzaWJpbGl0eSAoaW5mbywgdmlzaWJpbGl0eSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBhcHBlbmRfdHlwZSAoaW5mbywgdCk7Ci19Ci0KLS8qIEZpbmlzaCBhIHN0cnVjdCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2VuZF9zdHJ1Y3RfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICpzOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0gIGFzc2VydCAoaW5mby0+aW5kZW50ID49IDIpOwotCi0gIGluZm8tPmluZGVudCAtPSAyOwotCi0gIC8qIENoYW5nZSB0aGUgdHJhaWxpbmcgaW5kZW50YXRpb24gdG8gaGF2ZSBhIGNsb3NlIGJyYWNlLiAgKi8KLSAgcyA9IGluZm8tPnN0YWNrLT50eXBlICsgc3RybGVuIChpbmZvLT5zdGFjay0+dHlwZSkgLSAyOwotICBhc3NlcnQgKHNbMF0gPT0gJyAnICYmIHNbMV0gPT0gJyAnICYmIHNbMl0gPT0gJ1wwJyk7Ci0KLSAgKnMrKyA9ICd9JzsKLSAgKnMgPSAnXDAnOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIGNsYXNzIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfc3RhcnRfY2xhc3NfdHlwZSAocCwgdGFnLCBpZCwgc3RydWN0cCwgc2l6ZSwgdnB0ciwgb3dudnB0cikKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgdW5zaWduZWQgaW50IGlkOwotICAgICBib29sZWFuIHN0cnVjdHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBib29sZWFuIHZwdHI7Ci0gICAgIGJvb2xlYW4gb3dudnB0cjsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnR2ID0gTlVMTDsKLQotICBpbmZvLT5pbmRlbnQgKz0gMjsKLQotICBpZiAodnB0ciAmJiAhIG93bnZwdHIpCi0gICAgewotICAgICAgdHYgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gICAgICBpZiAodHYgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIHB1c2hfdHlwZSAoaW5mbywgc3RydWN0cCA/ICJjbGFzcyAiIDogInVuaW9uIGNsYXNzICIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHRhZyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCB0YWcpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGlkYnVmWzIwXTsKLQotICAgICAgc3ByaW50ZiAoaWRidWYsICIlJWFub24ldSIsIGlkKTsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBpZGJ1ZikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiB7IikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoc2l6ZSAhPSAwIHx8IHZwdHIgfHwgb3dudnB0ciB8fCB0YWcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAvKiIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHNpemUgIT0gMCkKLQl7Ci0JICBjaGFyIGFiWzIwXTsKLQotCSAgc3ByaW50ZiAoYWIsICIldSIsIHNpemUpOwotCSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgc2l6ZSAiKQotCSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHZwdHIpCi0JewotCSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgdnRhYmxlICIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAob3dudnB0cikKLQkgICAgewotCSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAic2VsZiAiKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgdHYpCi0JCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAiKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAodGFnICE9IE5VTEwpCi0JewotCSAgY2hhciBhYlszMF07Ci0KLQkgIHNwcmludGYgKGFiLCAiIGlkICV1IiwgaWQpOwotCSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgKi8iKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8tPnN0YWNrLT52aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFOwotCi0gIHJldHVybiAoYXBwZW5kX3R5cGUgKGluZm8sICJcbiIpCi0JICAmJiBpbmRlbnRfdHlwZSAoaW5mbykpOwotfQotCi0vKiBBZGQgYSBzdGF0aWMgbWVtYmVyIHRvIGEgY2xhc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY2xhc3Nfc3RhdGljX21lbWJlciAocCwgbmFtZSwgcGh5c25hbWUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0OwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHByZXBlbmRfdHlwZSAoaW5mbywgInN0YXRpYyAiKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIjsgLyogIikKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIHBoeXNuYW1lKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAqL1xuIikKLSAgICAgIHx8ICEgaW5kZW50X3R5cGUgKGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBwcl9maXhfdmlzaWJpbGl0eSAoaW5mbywgdmlzaWJpbGl0eSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBhcHBlbmRfdHlwZSAoaW5mbywgdCk7Ci19Ci0KLS8qIEFkZCBhIGJhc2UgY2xhc3MgdG8gYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9jbGFzc19iYXNlY2xhc3MgKHAsIGJpdHBvcywgdmlydHVhbCwgdmlzaWJpbGl0eSkKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF92bWEgYml0cG9zOwotICAgICBib29sZWFuIHZpcnR1YWw7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdDsKLSAgY29uc3QgY2hhciAqcHJlZml4OwotICBjaGFyIGFiWzIwXTsKLSAgY2hhciAqcywgKmwsICpuOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCAmJiBpbmZvLT5zdGFjay0+bmV4dCAhPSBOVUxMKTsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHN0cm5jbXAgKHQsICJjbGFzcyAiLCBzaXplb2YgImNsYXNzICIgLSAxKSA9PSAwKQotICAgIHQgKz0gc2l6ZW9mICJjbGFzcyAiIC0gMTsKLQotICAvKiBQdXNoIGl0IGJhY2sgb24gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIHByZXBlbmRfdHlwZSBhbmQKLSAgICAgYXBwZW5kX3R5cGUgcm91dGluZXMuICAqLwotICBpZiAoISBwdXNoX3R5cGUgKGluZm8sIHQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodmlydHVhbCkKLSAgICB7Ci0gICAgICBpZiAoISBwcmVwZW5kX3R5cGUgKGluZm8sICJ2aXJ0dWFsICIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgc3dpdGNoICh2aXNpYmlsaXR5KQotICAgIHsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOgotICAgICAgcHJlZml4ID0gInB1YmxpYyAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDoKLSAgICAgIHByZWZpeCA9ICJwcm90ZWN0ZWQgIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUklWQVRFOgotICAgICAgcHJlZml4ID0gInByaXZhdGUgIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwcmVmaXggPSAiLyogdW5rbm93biB2aXNpYmlsaXR5ICovICI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCBwcmVmaXgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYml0cG9zICE9IDApCi0gICAgewotICAgICAgcHJpbnRfdm1hIChiaXRwb3MsIGFiLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAvKiBiaXRwb3MgIikKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKQotCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTm93IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGlzIHNvbWV0aGluZyBsaWtlICJwdWJsaWMgQSAvICogYml0cG9zCi0gICAgIDEwICogLyIuICBUaGUgbmV4dCBlbGVtZW50IG9uIHRoZSBzdGFjayBpcyBzb21ldGhpbmcgbGlrZSAiY2xhc3MKLSAgICAgeHggeyAvICogc2l6ZSA4ICogL1xuLi4uIi4gIFdlIHdhbnQgdG8gc3Vic3RpdHV0ZSB0aGUgdG9wIG9mIHRoZQotICAgICBzdGFjayBpbiBiZWZvcmUgdGhlIHsuICAqLwotICBzID0gc3RyY2hyIChpbmZvLT5zdGFjay0+bmV4dC0+dHlwZSwgJ3snKTsKLSAgYXNzZXJ0IChzICE9IE5VTEwpOwotICAtLXM7Ci0KLSAgLyogSWYgdGhlcmUgaXMgYWxyZWFkeSBhICc6JywgdGhlbiB3ZSBhbHJlYWR5IGhhdmUgYSBiYXNlY2xhc3MsIGFuZAotICAgICB3ZSBtdXN0IGFwcGVuZCB0aGlzIG9uZSBhZnRlciBhIGNvbW1hLiAgKi8KLSAgZm9yIChsID0gaW5mby0+c3RhY2stPm5leHQtPnR5cGU7IGwgIT0gczsgbCsrKQotICAgIGlmICgqbCA9PSAnOicpCi0gICAgICBicmVhazsKLSAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCBsID09IHMgPyAiIDogIiA6ICIsICIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChpbmZvLT5zdGFjay0+dHlwZSkgKyBzdHJsZW4gKHQpICsgMSk7Ci0gIG1lbWNweSAobiwgaW5mby0+c3RhY2stPnR5cGUsIHMgLSBpbmZvLT5zdGFjay0+dHlwZSk7Ci0gIHN0cmNweSAobiArIChzIC0gaW5mby0+c3RhY2stPnR5cGUpLCB0KTsKLSAgc3RyY2F0IChuLCBzKTsKLQotICBmcmVlIChpbmZvLT5zdGFjay0+dHlwZSk7Ci0gIGluZm8tPnN0YWNrLT50eXBlID0gbjsKLQotICBmcmVlICh0KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgYWRkaW5nIGEgbWV0aG9kIHRvIGEgY2xhc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY2xhc3Nfc3RhcnRfbWV0aG9kIChwLCBuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLSAgaW5mby0+c3RhY2stPm1ldGhvZCA9IG5hbWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSB2YXJpYW50IHRvIGEgbWV0aG9kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2NsYXNzX21ldGhvZF92YXJpYW50IChwLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgY29uc3RwLCB2b2xhdGlsZXAsIHZvZmZzZXQsCi0JCQkgY29udGV4dCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotICAgICBiZmRfdm1hIHZvZmZzZXQ7Ci0gICAgIGJvb2xlYW4gY29udGV4dDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKm1ldGhvZF90eXBlOwotICBjaGFyICpjb250ZXh0X3R5cGU7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLSAgYXNzZXJ0IChpbmZvLT5zdGFjay0+bmV4dCAhPSBOVUxMKTsKLQotICAvKiBQdXQgdGhlIGNvbnN0IGFuZCB2b2xhdGlsZSBxdWFsaWZpZXJzIG9uIHRoZSB0eXBlLiAgKi8KLSAgaWYgKHZvbGF0aWxlcCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiB2b2xhdGlsZSIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmIChjb25zdHApCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgY29uc3QiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFN0aWNrIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW50byBpdHMgdHlwZS4gICovCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywKLQkJCSAoY29udGV4dAotCQkJICA/IGluZm8tPnN0YWNrLT5uZXh0LT5uZXh0LT5tZXRob2QKLQkJCSAgOiBpbmZvLT5zdGFjay0+bmV4dC0+bWV0aG9kKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdldCB0aGUgdHlwZS4gICovCi0gIG1ldGhvZF90eXBlID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAobWV0aG9kX3R5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUHVsbCBvZmYgdGhlIGNvbnRleHQgdHlwZSBpZiB0aGVyZSBpcyBvbmUuICAqLwotICBpZiAoISBjb250ZXh0KQotICAgIGNvbnRleHRfdHlwZSA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb250ZXh0X3R5cGUgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gICAgICBpZiAoY29udGV4dF90eXBlID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBOb3cgdGhlIHRvcCBvZiB0aGUgc3RhY2sgaXMgdGhlIGNsYXNzLiAgKi8KLQotICBpZiAoISBwcl9maXhfdmlzaWJpbGl0eSAoaW5mbywgdmlzaWJpbGl0eSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBtZXRob2RfdHlwZSkKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgLyogIikKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIHBoeXNuYW1lKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChjb250ZXh0IHx8IHZvZmZzZXQgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyIGFiWzIwXTsKLQotICAgICAgaWYgKGNvbnRleHQpCi0JewotCSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICJjb250ZXh0ICIpCi0JICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgY29udGV4dF90eXBlKQotCSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBwcmludF92bWEgKHZvZmZzZXQsIGFiLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgInZvZmZzZXQgIikKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiAoYXBwZW5kX3R5cGUgKGluZm8sICIgKi87XG4iKQotCSAgJiYgaW5kZW50X3R5cGUgKGluZm8pKTsKLX0KLQotLyogQWRkIGEgc3RhdGljIHZhcmlhbnQgdG8gYSBtZXRob2QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50IChwLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgY29uc3RwLCB2b2xhdGlsZXApCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgIGJvb2xlYW4gY29uc3RwOwotICAgICBib29sZWFuIHZvbGF0aWxlcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKm1ldGhvZF90eXBlOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0gIGFzc2VydCAoaW5mby0+c3RhY2stPm5leHQgIT0gTlVMTCk7Ci0gIGFzc2VydCAoaW5mby0+c3RhY2stPm5leHQtPm1ldGhvZCAhPSBOVUxMKTsKLQotICAvKiBQdXQgdGhlIGNvbnN0IGFuZCB2b2xhdGlsZSBxdWFsaWZpZXJzIG9uIHRoZSB0eXBlLiAgKi8KLSAgaWYgKHZvbGF0aWxlcCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiB2b2xhdGlsZSIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmIChjb25zdHApCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgY29uc3QiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIE1hcmsgaXQgYXMgc3RhdGljLiAgKi8KLSAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCAic3RhdGljICIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTdGljayB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGludG8gaXRzIHR5cGUuICAqLwotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIGluZm8tPnN0YWNrLT5uZXh0LT5tZXRob2QpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHZXQgdGhlIHR5cGUuICAqLwotICBtZXRob2RfdHlwZSA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKG1ldGhvZF90eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB0aGUgdG9wIG9mIHRoZSBzdGFjayBpcyB0aGUgY2xhc3MuICAqLwotCi0gIGlmICghIHByX2ZpeF92aXNpYmlsaXR5IChpbmZvLCB2aXNpYmlsaXR5KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIChhcHBlbmRfdHlwZSAoaW5mbywgbWV0aG9kX3R5cGUpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgIiAvKiAiKQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sIHBoeXNuYW1lKQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sICIgKi87XG4iKQotCSAgJiYgaW5kZW50X3R5cGUgKGluZm8pKTsKLX0KLQotLyogRmluaXNoIHVwIGEgbWV0aG9kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2NsYXNzX2VuZF9tZXRob2QgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBpbmZvLT5zdGFjay0+bWV0aG9kID0gTlVMTDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCBhIGNsYXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2VuZF9jbGFzc190eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgcmV0dXJuIHByX2VuZF9zdHJ1Y3RfdHlwZSAocCk7Ci19Ci0KLS8qIFB1c2ggYSB0eXBlIG9uIHRoZSBzdGFjayB1c2luZyBhIHR5cGVkZWYgbmFtZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl90eXBlZGVmX3R5cGUgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gcHVzaF90eXBlIChpbmZvLCBuYW1lKTsKLX0KLQotLyogUHVzaCBhIHR5cGUgb24gdGhlIHN0YWNrIHVzaW5nIGEgdGFnIG5hbWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfdGFnX3R5cGUgKHAsIG5hbWUsIGlkLCBraW5kKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgdW5zaWduZWQgaW50IGlkOwotICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY29uc3QgY2hhciAqdCwgKnRhZzsKLSAgY2hhciBpZGJ1ZlsyMF07Ci0KLSAgc3dpdGNoIChraW5kKQotICAgIHsKLSAgICBjYXNlIERFQlVHX0tJTkRfU1RSVUNUOgotICAgICAgdCA9ICJzdHJ1Y3QgIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTjoKLSAgICAgIHQgPSAidW5pb24gIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfS0lORF9FTlVNOgotICAgICAgdCA9ICJlbnVtICI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX0tJTkRfQ0xBU1M6Ci0gICAgICB0ID0gImNsYXNzICI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT05fQ0xBU1M6Ci0gICAgICB0ID0gInVuaW9uIGNsYXNzICI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIHB1c2hfdHlwZSAoaW5mbywgdCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIHRhZyA9IG5hbWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzcHJpbnRmIChpZGJ1ZiwgIiUlYW5vbiV1IiwgaWQpOwotICAgICAgdGFnID0gaWRidWY7Ci0gICAgfQotCi0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCB0YWcpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG5hbWUgIT0gTlVMTCAmJiBraW5kICE9IERFQlVHX0tJTkRfRU5VTSkKLSAgICB7Ci0gICAgICBzcHJpbnRmIChpZGJ1ZiwgIiAvKiBpZCAldSAqLyIsIGlkKTsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBpZGJ1ZikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgdHlwZWRlZi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl90eXBkZWYgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqczsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAocyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmRlbnQgKGluZm8pOwotICBmcHJpbnRmIChpbmZvLT5mLCAidHlwZWRlZiAlcztcbiIsIHMpOwotCi0gIGZyZWUgKHMpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB0YWcuICBUaGUgdGFnIHNob3VsZCBhbHJlYWR5IGJlIGluIHRoZSBzdHJpbmcgb24gdGhlCi0gICBzdGFjaywgc28gYWxsIHdlIGhhdmUgdG8gZG8gaGVyZSBpcyBwcmludCBpdCBvdXQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1wcl90YWcgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdDsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmRlbnQgKGluZm8pOwotICBmcHJpbnRmIChpbmZvLT5mLCAiJXM7XG4iLCB0KTsKLQotICBmcmVlICh0KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGFuIGludGVnZXIgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfaW50X2NvbnN0YW50IChwLCBuYW1lLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJbMjBdOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIHByaW50X3ZtYSAodmFsLCBhYiwgZmFsc2UsIGZhbHNlKTsKLSAgZnByaW50ZiAoaW5mby0+ZiwgImNvbnN0IGludCAlcyA9ICVzO1xuIiwgbmFtZSwgYWIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZmxvYXRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRvdWJsZSB2YWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJjb25zdCBkb3VibGUgJXMgPSAlZztcbiIsIG5hbWUsIHZhbCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB0eXBlZCBjb25zdGFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl90eXBlZF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0OwotICBjaGFyIGFiWzIwXTsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmRlbnQgKGluZm8pOwotICBwcmludF92bWEgKHZhbCwgYWIsIGZhbHNlLCBmYWxzZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJjb25zdCAlcyAlcyA9ICVzO1xuIiwgdCwgbmFtZSwgYWIpOwotCi0gIGZyZWUgKHQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl92YXJpYWJsZSAocCwgbmFtZSwga2luZCwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192YXJfa2luZCBraW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnQ7Ci0gIGNoYXIgYWJbMjBdOwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHQgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIHN3aXRjaCAoa2luZCkKLSAgICB7Ci0gICAgY2FzZSBERUJVR19TVEFUSUM6Ci0gICAgY2FzZSBERUJVR19MT0NBTF9TVEFUSUM6Ci0gICAgICBmcHJpbnRmIChpbmZvLT5mLCAic3RhdGljICIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19SRUdJU1RFUjoKLSAgICAgIGZwcmludGYgKGluZm8tPmYsICJyZWdpc3RlciAiKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHByaW50X3ZtYSAodmFsLCBhYiwgdHJ1ZSwgdHJ1ZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICIlcyAvKiAlcyAqLztcbiIsIHQsIGFiKTsKLQotICBmcmVlICh0KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgb3V0cHV0dGluZyBhIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3N0YXJ0X2Z1bmN0aW9uIChwLCBuYW1lLCBnbG9iYWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBib29sZWFuIGdsb2JhbDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnQ7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgaWYgKCEgZ2xvYmFsKQotICAgIGZwcmludGYgKGluZm8tPmYsICJzdGF0aWMgIik7Ci0gIGZwcmludGYgKGluZm8tPmYsICIlcyAoIiwgdCk7Ci0KLSAgaW5mby0+cGFyYW1ldGVyID0gMTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgZnVuY3Rpb24gcGFyYW1ldGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2Z1bmN0aW9uX3BhcmFtZXRlciAocCwgbmFtZSwga2luZCwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z19wYXJtX2tpbmQga2luZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0OwotICBjaGFyIGFiWzIwXTsKLQotICBpZiAoa2luZCA9PSBERUJVR19QQVJNX1JFRkVSRU5DRQotICAgICAgfHwga2luZCA9PSBERUJVR19QQVJNX1JFRl9SRUcpCi0gICAgewotICAgICAgaWYgKCEgcHJfcmVmZXJlbmNlX3R5cGUgKHApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGluZm8tPnBhcmFtZXRlciAhPSAxKQotICAgIGZwcmludGYgKGluZm8tPmYsICIsICIpOwotCi0gIGlmIChraW5kID09IERFQlVHX1BBUk1fUkVHIHx8IGtpbmQgPT0gREVCVUdfUEFSTV9SRUZfUkVHKQotICAgIGZwcmludGYgKGluZm8tPmYsICJyZWdpc3RlciAiKTsKLQotICBwcmludF92bWEgKHZhbCwgYWIsIHRydWUsIHRydWUpOwotICBmcHJpbnRmIChpbmZvLT5mLCAiJXMgLyogJXMgKi8iLCB0LCBhYik7Ci0KLSAgZnJlZSAodCk7Ci0KLSAgKytpbmZvLT5wYXJhbWV0ZXI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IHdyaXRpbmcgb3V0IGEgYmxvY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfc3RhcnRfYmxvY2sgKHAsIGFkZHIpCi0gICAgIFBUUiBwOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyIGFiWzIwXTsKLQotICBpZiAoaW5mby0+cGFyYW1ldGVyID4gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChpbmZvLT5mLCAiKVxuIik7Ci0gICAgICBpbmZvLT5wYXJhbWV0ZXIgPSAwOwotICAgIH0KLQotICBpbmRlbnQgKGluZm8pOwotICBwcmludF92bWEgKGFkZHIsIGFiLCB0cnVlLCB0cnVlKTsKLSAgZnByaW50ZiAoaW5mby0+ZiwgInsgLyogJXMgKi9cbiIsIGFiKTsKLQotICBpbmZvLT5pbmRlbnQgKz0gMjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2xpbmVubyAocCwgZmlsZW5hbWUsIGxpbmVubywgYWRkcikKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICB1bnNpZ25lZCBsb25nIGxpbmVubzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsyMF07Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgcHJpbnRfdm1hIChhZGRyLCBhYiwgdHJ1ZSwgdHJ1ZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICIvKiBmaWxlICVzIGxpbmUgJWx1IGFkZHIgJXMgKi9cbiIsIGZpbGVuYW1lLCBsaW5lbm8sIGFiKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHdyaXRpbmcgb3V0IGEgYmxvY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZW5kX2Jsb2NrIChwLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsyMF07Ci0KLSAgaW5mby0+aW5kZW50IC09IDI7Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgcHJpbnRfdm1hIChhZGRyLCBhYiwgdHJ1ZSwgdHJ1ZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJ9IC8qICVzICovXG4iLCBhYik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB3cml0aW5nIG91dCBhIGZ1bmN0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotcHJfZW5kX2Z1bmN0aW9uIChwKQotICAgICBQVFIgcDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yYW5saWIuMSBiL2JpbnV0aWxzL3JhbmxpYi4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWZiNWM4Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3JhbmxpYi4xCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIHJhbmxpYiAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1yYW5saWIgXC0gZ2VuZXJhdGUgaW5kZXggdG8gYXJjaGl2ZS4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uQiByYW5saWIgXGMKLS5SQiAiW1x8IiBcLXYgfCBcLVYgIlx8XSIKLS5JIGFyY2hpdmVcYwotXCYKLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi0uQiByYW5saWIKLWdlbmVyYXRlcyBhbiBpbmRleCB0byB0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSwgYW5kCi1zdG9yZXMgaXQgaW4gdGhlIGFyY2hpdmUuICBUaGUgaW5kZXggbGlzdHMgZWFjaCBzeW1ib2wgZGVmaW5lZCBieSBhCi1tZW1iZXIgb2YgYW4gYXJjaGl2ZSB0aGF0IGlzIGEgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUuICAKLS5QUAotWW91IG1heSB1c2UKLS5SQiBgICJubSBcLXMiICcKLW9yCi0uUkIgYCAibm0gXC1cLXByaW50LWFybWFwIiAnCi10byBsaXN0IHRoaXMgaW5kZXguCi0uUFAKLUFuIGFyY2hpdmUgd2l0aCBzdWNoIGFuIGluZGV4IHNwZWVkcyB1cCBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5LCBhbmQKLWFsbG93cyByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSB0byBjYWxsIGVhY2ggb3RoZXIgd2l0aG91dCByZWdhcmQgdG8KLXRoZWlyIHBsYWNlbWVudCBpbiB0aGUgYXJjaGl2ZS4KLS5QUAotVGhlIEdOVQotLkIgcmFubGliCi1wcm9ncmFtIGlzIGFub3RoZXIgZm9ybSBvZiBHTlUKLS5CUiBhciA7Ci1ydW5uaW5nCi0uQiByYW5saWIKLWlzIGNvbXBsZXRlbHkgZXF1aXZhbGVudCB0byBleGVjdXRpbmcKLS5SQiBgICJhciBcLXMiICcuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CIFwtdgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mCi0uQiByYW5saWIKLWFuZCBleGl0LgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsgCi0uQlIgYXIgIigiIDEgIiksIgotLkJSIG5tICIoIiAxICIpLiIKLQotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9yYW5saWIuc2ggYi9iaW51dGlscy9yYW5saWIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiNmZiYzQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmFubGliLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIS9iaW4vc2gKLSMgQSBzaW1wbGUgcmFubGliIHNjcmlwdCwgdG8gdXNlIGxlc3MgZGlzayBzcGFjZSB0aGFuIGEgcmFubGliIHByb2dyYW0uCi1hciBzICQxCmRpZmYgLS1naXQgYS9iaW51dGlscy9yY2xleC5sIGIvYmludXRpbHMvcmNsZXgubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiNDc5Yi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yY2xleC5sCisrKyAvZGV2L251bGwKQEAgLTEsNDk2ICswLDAgQEAKLSV7IC8qIHJjbGV4LmwgLS0gbGV4ZXIgZm9yIFdpbmRvd3MgcmMgZmlsZXMgcGFyc2VyICAqLwotLyogQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGlzIGEgbGV4IGlucHV0IGZpbGUgd2hpY2ggZ2VuZXJhdGVzIGEgbGV4ZXIgdXNlZCBieSB0aGUKLSAgIFdpbmRvd3MgcmMgZmlsZSBwYXJzZXIuICBJdCBiYXNpY2FsbHkganVzdCByZWNvZ25pemVkIGEgYnVuY2ggb2YKLSAgIGtleXdvcmRzLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgIndpbmRyZXMuaCIKLSNpbmNsdWRlICJyY3BhcnNlLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0vKiBXaGV0aGVyIHdlIGFyZSBpbiByY2RhdGEgbW9kZSwgaW4gd2hpY2ggd2UgcmV0dXJucyB0aGUgbGVuZ3RocyBvZgotICAgc3RyaW5ncy4gICovCi0KLXN0YXRpYyBpbnQgcmNkYXRhX21vZGU7Ci0KLS8qIFdoZXRoZXIgd2UgYXJlIHN1cHJlc3NpbmcgbGluZXMgZnJvbSBjcHAgKGluY2x1ZGluZyB3aW5kb3dzLmggb3IKLSAgIGhlYWRlcnMgZnJvbSB5b3VyIEMgc291cmNlcyBtYXkgYnJpbmcgaW4gZXh0ZXJucyBhbmQgdHlwZWRlZnMpLgotICAgV2hlbiBhY3RpdmUsIHdlIHJldHVybiBJR05PUkVEX1RPS0VOLCB3aGljaCBsZXRzIHVzIGlnbm9yZSB0aGVzZQotICAgb3V0c2lkZSBvZiByZXNvdXJjZSBjb25zdHJ1Y3RzLiAgVGh1cywgaXQgaXNuJ3QgcmVxdWlyZWQgdG8gcHJvdGVjdAotICAgYWxsIHRoZSBub24tcHJlcHJvY2Vzc29yIGxpbmVzIGluIHlvdXIgaGVhZGVyIGZpbGVzIHdpdGggI2lmZGVmCi0gICBSQ19JTlZPS0VELiAgSXQgYWxzbyBtZWFucyB5b3VyIFJDIGZpbGUgY2FuJ3QgaW5jbHVkZSBvdGhlciBSQwotICAgZmlsZXMgaWYgdGhleSdyZSBuYW1lZCAiKi5oIi4gIFNvcnJ5LiAgTmFtZSB0aGVtICoucmNoIG9yIHdoYXRldmVyLiAgKi8KLQotc3RhdGljIGludCBzdXBwcmVzc19jcHBfZGF0YTsKLQotI2RlZmluZSBNQVlCRV9SRVRVUk4oeCkgcmV0dXJuIHN1cHByZXNzX2NwcF9kYXRhID8gSUdOT1JFRF9UT0tFTiA6ICh4KQotCi0vKiBUaGUgZmlyc3QgZmlsZW5hbWUgd2UgZGV0ZWN0IGluIHRoZSBjcHAgb3V0cHV0LiAgV2UgdXNlIHRoaXMgdG8KLSAgIHRlbGwgaW5jbHVkZWQgZmlsZXMgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZS4gICovCi0KLXN0YXRpYyBjaGFyICppbml0aWFsX2ZuOwotCi0vKiBMaXN0IG9mIGFsbG9jYXRlZCBzdHJpbmdzLiAgKi8KLQotc3RydWN0IGFsbG9jX3N0cmluZwotewotICBzdHJ1Y3QgYWxsb2Nfc3RyaW5nICpuZXh0OwotICBjaGFyICpzOwotfTsKLQotc3RhdGljIHN0cnVjdCBhbGxvY19zdHJpbmcgKnN0cmluZ3M7Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkIGNwcF9saW5lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGNoYXIgKmhhbmRsZV9xdW90ZXMgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nICopKTsKLXN0YXRpYyBjaGFyICpnZXRfc3RyaW5nIFBBUkFNUyAoKGludCkpOwotCi0lfQotCi0lJQotCi0iQkVHSU4iCQkJeyBNQVlCRV9SRVRVUk4gKEJFRyk7IH0KLSJ7IgkJCXsgTUFZQkVfUkVUVVJOIChCRUcpOyB9Ci0iRU5EIgkJCXsgTUFZQkVfUkVUVVJOIChFTkQpOyB9Ci0ifSIJCQl7IE1BWUJFX1JFVFVSTiAoRU5EKTsgfQotIkFDQ0VMRVJBVE9SUyIJCXsgTUFZQkVfUkVUVVJOIChBQ0NFTEVSQVRPUlMpOyB9Ci0iVklSVEtFWSIJCXsgTUFZQkVfUkVUVVJOIChWSVJUS0VZKTsgfQotIkFTQ0lJIgkJCXsgTUFZQkVfUkVUVVJOIChBU0NJSSk7IH0KLSJOT0lOVkVSVCIJCXsgTUFZQkVfUkVUVVJOIChOT0lOVkVSVCk7IH0KLSJTSElGVCIJCQl7IE1BWUJFX1JFVFVSTiAoU0hJRlQpOyB9Ci0iQ09OVFJPTCIJCXsgTUFZQkVfUkVUVVJOIChDT05UUk9MKTsgfQotIkFMVCIJCQl7IE1BWUJFX1JFVFVSTiAoQUxUKTsgfQotIkJJVE1BUCIJCXsgTUFZQkVfUkVUVVJOIChCSVRNQVApOyB9Ci0iQ1VSU09SIgkJeyBNQVlCRV9SRVRVUk4gKENVUlNPUik7IH0KLSJESUFMT0ciCQl7IE1BWUJFX1JFVFVSTiAoRElBTE9HKTsgfQotIkRJQUxPR0VYIgkJeyBNQVlCRV9SRVRVUk4gKERJQUxPR0VYKTsgfQotIkVYU1RZTEUiCQl7IE1BWUJFX1JFVFVSTiAoRVhTVFlMRSk7IH0KLSJDQVBUSU9OIgkJeyBNQVlCRV9SRVRVUk4gKENBUFRJT04pOyB9Ci0iQ0xBU1MiCQkJeyBNQVlCRV9SRVRVUk4gKENMQVNTKTsgfQotIlNUWUxFIgkJCXsgTUFZQkVfUkVUVVJOIChTVFlMRSk7IH0KLSJBVVRPM1NUQVRFIgkJeyBNQVlCRV9SRVRVUk4gKEFVVE8zU1RBVEUpOyB9Ci0iQVVUT0NIRUNLQk9YIgkJeyBNQVlCRV9SRVRVUk4gKEFVVE9DSEVDS0JPWCk7IH0KLSJBVVRPUkFESU9CVVRUT04iCXsgTUFZQkVfUkVUVVJOIChBVVRPUkFESU9CVVRUT04pOyB9Ci0iQ0hFQ0tCT1giCQl7IE1BWUJFX1JFVFVSTiAoQ0hFQ0tCT1gpOyB9Ci0iQ09NQk9CT1giCQl7IE1BWUJFX1JFVFVSTiAoQ09NQk9CT1gpOyB9Ci0iQ1RFWFQiCQkJeyBNQVlCRV9SRVRVUk4gKENURVhUKTsgfQotIkRFRlBVU0hCVVRUT04iCQl7IE1BWUJFX1JFVFVSTiAoREVGUFVTSEJVVFRPTik7IH0KLSJFRElUVEVYVCIJCXsgTUFZQkVfUkVUVVJOIChFRElUVEVYVCk7IH0KLSJHUk9VUEJPWCIJCXsgTUFZQkVfUkVUVVJOIChHUk9VUEJPWCk7IH0KLSJMSVNUQk9YIgkJeyBNQVlCRV9SRVRVUk4gKExJU1RCT1gpOyB9Ci0iTFRFWFQiCQkJeyBNQVlCRV9SRVRVUk4gKExURVhUKTsgfQotIlBVU0hCT1giCQl7IE1BWUJFX1JFVFVSTiAoUFVTSEJPWCk7IH0KLSJQVVNIQlVUVE9OIgkJeyBNQVlCRV9SRVRVUk4gKFBVU0hCVVRUT04pOyB9Ci0iUkFESU9CVVRUT04iCQl7IE1BWUJFX1JFVFVSTiAoUkFESU9CVVRUT04pOyB9Ci0iUlRFWFQiCQkJeyBNQVlCRV9SRVRVUk4gKFJURVhUKTsgfQotIlNDUk9MTEJBUiIJCXsgTUFZQkVfUkVUVVJOIChTQ1JPTExCQVIpOyB9Ci0iU1RBVEUzIgkJeyBNQVlCRV9SRVRVUk4gKFNUQVRFMyk7IH0KLSJVU0VSQlVUVE9OIgkJeyBNQVlCRV9SRVRVUk4gKFVTRVJCVVRUT04pOyB9Ci0iQkVESVQiCQkJeyBNQVlCRV9SRVRVUk4gKEJFRElUKTsgfQotIkhFRElUIgkJCXsgTUFZQkVfUkVUVVJOIChIRURJVCk7IH0KLSJJRURJVCIJCQl7IE1BWUJFX1JFVFVSTiAoSUVESVQpOyB9Ci0iRk9OVCIJCQl7IE1BWUJFX1JFVFVSTiAoRk9OVCk7IH0KLSJJQ09OIgkJCXsgTUFZQkVfUkVUVVJOIChJQ09OKTsgfQotIkxBTkdVQUdFIgkJeyBNQVlCRV9SRVRVUk4gKExBTkdVQUdFKTsgfQotIkNIQVJBQ1RFUklTVElDUyIJeyBNQVlCRV9SRVRVUk4gKENIQVJBQ1RFUklTVElDUyk7IH0KLSJWRVJTSU9OIgkJeyBNQVlCRV9SRVRVUk4gKFZFUlNJT05LKTsgfQotIk1FTlUiCQkJeyBNQVlCRV9SRVRVUk4gKE1FTlUpOyB9Ci0iTUVOVUVYIgkJeyBNQVlCRV9SRVRVUk4gKE1FTlVFWCk7IH0KLSJNRU5VSVRFTSIJCXsgTUFZQkVfUkVUVVJOIChNRU5VSVRFTSk7IH0KLSJTRVBBUkFUT1IiCQl7IE1BWUJFX1JFVFVSTiAoU0VQQVJBVE9SKTsgfQotIlBPUFVQIgkJCXsgTUFZQkVfUkVUVVJOIChQT1BVUCk7IH0KLSJDSEVDS0VEIgkJeyBNQVlCRV9SRVRVUk4gKENIRUNLRUQpOyB9Ci0iR1JBWUVEIgkJeyBNQVlCRV9SRVRVUk4gKEdSQVlFRCk7IH0KLSJIRUxQIgkJCXsgTUFZQkVfUkVUVVJOIChIRUxQKTsgfQotIklOQUNUSVZFIgkJeyBNQVlCRV9SRVRVUk4gKElOQUNUSVZFKTsgfQotIk1FTlVCQVJCUkVBSyIJCXsgTUFZQkVfUkVUVVJOIChNRU5VQkFSQlJFQUspOyB9Ci0iTUVOVUJSRUFLIgkJeyBNQVlCRV9SRVRVUk4gKE1FTlVCUkVBSyk7IH0KLSJNRVNTQUdFVEFCTEUiCQl7IE1BWUJFX1JFVFVSTiAoTUVTU0FHRVRBQkxFKTsgfQotIlJDREFUQSIJCXsgTUFZQkVfUkVUVVJOIChSQ0RBVEEpOyB9Ci0iU1RSSU5HVEFCTEUiCQl7IE1BWUJFX1JFVFVSTiAoU1RSSU5HVEFCTEUpOyB9Ci0iVkVSU0lPTklORk8iCQl7IE1BWUJFX1JFVFVSTiAoVkVSU0lPTklORk8pOyB9Ci0iRklMRVZFUlNJT04iCQl7IE1BWUJFX1JFVFVSTiAoRklMRVZFUlNJT04pOyB9Ci0iUFJPRFVDVFZFUlNJT04iCXsgTUFZQkVfUkVUVVJOIChQUk9EVUNUVkVSU0lPTik7IH0KLSJGSUxFRkxBR1NNQVNLIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVGTEFHU01BU0spOyB9Ci0iRklMRUZMQUdTIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVGTEFHUyk7IH0KLSJGSUxFT1MiCQl7IE1BWUJFX1JFVFVSTiAoRklMRU9TKTsgfQotIkZJTEVUWVBFIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVUWVBFKTsgfQotIkZJTEVTVUJUWVBFIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVTVUJUWVBFKTsgfQotIlZBTFVFIgkJCXsgTUFZQkVfUkVUVVJOIChWQUxVRSk7IH0KLSJNT1ZFQUJMRSIJCXsgTUFZQkVfUkVUVVJOIChNT1ZFQUJMRSk7IH0KLSJGSVhFRCIJCQl7IE1BWUJFX1JFVFVSTiAoRklYRUQpOyB9Ci0iUFVSRSIJCQl7IE1BWUJFX1JFVFVSTiAoUFVSRSk7IH0KLSJJTVBVUkUiCQl7IE1BWUJFX1JFVFVSTiAoSU1QVVJFKTsgfQotIlBSRUxPQUQiCQl7IE1BWUJFX1JFVFVSTiAoUFJFTE9BRCk7IH0KLSJMT0FET05DQUxMIgkJeyBNQVlCRV9SRVRVUk4gKExPQURPTkNBTEwpOyB9Ci0iRElTQ0FSREFCTEUiCQl7IE1BWUJFX1JFVFVSTiAoRElTQ0FSREFCTEUpOyB9Ci0iTk9UIgkJCXsgTUFZQkVfUkVUVVJOIChOT1QpOyB9Ci0KLSJCTE9DSyJbIFx0XG5dKiJcIiJbXlwjXG5dKiJcIiIgewotCQkJICBjaGFyICpzLCAqc2VuZDsKLQotCQkJICAvKiBUaGlzIGlzIGEgaGFjayB0byBsZXQgdXMgcGFyc2UgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBlYXNpbHkuICAqLwotCi0JCQkgIHMgPSBzdHJjaHIgKHl5dGV4dCwgJyInKTsKLQkJCSAgKytzOwotCQkJICBzZW5kID0gc3RyY2hyIChzLCAnIicpOwotCQkJICBpZiAoc3RybmNtcCAocywgIlN0cmluZ0ZpbGVJbmZvIiwKLQkJCQkgICAgICAgc2l6ZW9mICJTdHJpbmdGaWxlSW5mbyIgLSAxKSA9PSAwCi0JCQkgICAgICAmJiBzICsgc2l6ZW9mICJTdHJpbmdGaWxlSW5mbyIgLSAxID09IHNlbmQpCi0JCQkgICAgTUFZQkVfUkVUVVJOIChCTE9DS1NUUklOR0ZJTEVJTkZPKTsKLQkJCSAgZWxzZSBpZiAoc3RybmNtcCAocywgIlZhckZpbGVJbmZvIiwKLQkJCQkJICAgIHNpemVvZiAiVmFyRmlsZUluZm8iIC0gMSkgPT0gMAotCQkJCSAgICYmIHMgKyBzaXplb2YgIlZhckZpbGVJbmZvIiAtIDEgPT0gc2VuZCkKLQkJCSAgICBNQVlCRV9SRVRVUk4gKEJMT0NLVkFSRklMRUlORk8pOwotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgY2hhciAqcjsKLQotCQkJICAgICAgciA9IGdldF9zdHJpbmcgKHNlbmQgLSBzICsgMSk7Ci0JCQkgICAgICBzdHJuY3B5IChyLCBzLCBzZW5kIC0gcyk7Ci0JCQkgICAgICByW3NlbmQgLSBzXSA9ICdcMCc7Ci0JCQkgICAgICB5eWx2YWwucyA9IHI7Ci0JCQkgICAgICBNQVlCRV9SRVRVUk4gKEJMT0NLKTsKLQkJCSAgICB9Ci0JCQl9Ci0KLSIjIlteXG5dKgkJewotCQkJICBjcHBfbGluZSAoeXl0ZXh0KTsKLQkJCX0KLQotWzAtOV1beDAtOUEtRmEtZl0qTAl7Ci0JCQkgIHl5bHZhbC5pLnZhbCA9IHN0cnRvdWwgKHl5dGV4dCwgMCwgMCk7Ci0JCQkgIHl5bHZhbC5pLmR3b3JkID0gMTsKLQkJCSAgTUFZQkVfUkVUVVJOIChOVU1CRVIpOwotCQkJfQotCi1bMC05XVt4MC05QS1GYS1mXSoJewotCQkJICB5eWx2YWwuaS52YWwgPSBzdHJ0b3VsICh5eXRleHQsIDAsIDApOwotCQkJICB5eWx2YWwuaS5kd29yZCA9IDA7Ci0JCQkgIE1BWUJFX1JFVFVSTiAoTlVNQkVSKTsKLQkJCX0KLQotKCJcIiJbXlwiXG5dKiJcIiJbIFx0XSopKyB7Ci0JCQkgIGNoYXIgKnM7Ci0JCQkgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotCi0JCQkgIHMgPSBoYW5kbGVfcXVvdGVzICh5eXRleHQsICZsZW5ndGgpOwotCQkJICBpZiAoISByY2RhdGFfbW9kZSkKLQkJCSAgICB7Ci0JCQkgICAgICB5eWx2YWwucyA9IHM7Ci0JCQkgICAgICBNQVlCRV9SRVRVUk4gKFFVT1RFRFNUUklORyk7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgeXlsdmFsLnNzLmxlbmd0aCA9IGxlbmd0aDsKLQkJCSAgICAgIHl5bHZhbC5zcy5zID0gczsKLQkJCSAgICAgIE1BWUJFX1JFVFVSTiAoU0laRURTVFJJTkcpOwotCQkJICAgIH0KLQkJCX0KLQotW0EtWmEtel1bXiAsXHRcclxuXSoJewotCQkJICBjaGFyICpzOwotCi0JCQkgIC8qIEkgcmVqZWN0ZWQgY29tbWEgaW4gYSBzdHJpbmcgaW4gb3JkZXIgdG8KLQkJCSAgICAgaGFuZGxlIFZJUlRLRVksIENPTlRST0wgaW4gYW4gYWNjZWxlcmF0b3IKLQkJCSAgICAgcmVzb3VyY2UuICBUaGlzIG1lYW5zIHRoYXQgYW4gdW5xdW90ZWQKLQkJCSAgICAgZmlsZSBuYW1lIGNhbiBub3QgY29udGFpbiBhIGNvbW1hLiAgSQotCQkJICAgICBkb24ndCBrbm93IHdoYXQgcmMgcGVybWl0cy4gICovCi0KLQkJCSAgcyA9IGdldF9zdHJpbmcgKHN0cmxlbiAoeXl0ZXh0KSArIDEpOwotCQkJICBzdHJjcHkgKHMsIHl5dGV4dCk7Ci0JCQkgIHl5bHZhbC5zID0gczsKLQkJCSAgTUFZQkVfUkVUVVJOIChTVFJJTkcpOwotCQkJfQotCi1bXG5dCQkJeyArK3JjX2xpbmVubzsgfQotWyBcdFxyXSsJCXsgLyogaWdub3JlIHdoaXRlc3BhY2UgKi8gfQotLgkJCXsgTUFZQkVfUkVUVVJOICgqeXl0ZXh0KTsgfQotCi0lJQotI2lmbmRlZiB5eXdyYXAKLS8qIFRoaXMgaXMgbmVlZGVkIGZvciBzb21lIHZlcnNpb25zIG9mIGxleC4gICovCi1pbnQgeXl3cmFwICgpCi17Ci0gIHJldHVybiAxOwotfQotI2VuZGlmCi0KLS8qIEhhbmRsZSBhIEMgcHJlcHJvY2Vzc29yIGxpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotY3BwX2xpbmUgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGludCBsaW5lOwotICBjaGFyICpzZW5kLCAqZm47Ci0KLSAgKytzOwotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLSAgICArK3M7Ci0gIAotICBsaW5lID0gc3RydG9sIChzLCAmc2VuZCwgMCk7Ci0gIGlmICgqc2VuZCAhPSAnXDAnICYmICEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzZW5kKSkKLSAgICByZXR1cm47Ci0KLSAgLyogU3VidHJhY3QgMSBiZWNhdXNlIHdlIGFyZSBhYm91dCB0byBjb3VudCB0aGUgbmV3bGluZS4gICovCi0gIHJjX2xpbmVubyA9IGxpbmUgLSAxOwotCi0gIHMgPSBzZW5kOwotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLSAgICArK3M7Ci0KLSAgaWYgKCpzICE9ICciJykKLSAgICByZXR1cm47Ci0KLSAgKytzOwotICBzZW5kID0gc3RyY2hyIChzLCAnIicpOwotICBpZiAoc2VuZCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBmbiA9IChjaGFyICopIHhtYWxsb2MgKHNlbmQgLSBzICsgMSk7Ci0gIHN0cm5jcHkgKGZuLCBzLCBzZW5kIC0gcyk7Ci0gIGZuW3NlbmQgLSBzXSA9ICdcMCc7Ci0KLSAgZnJlZSAocmNfZmlsZW5hbWUpOwotICByY19maWxlbmFtZSA9IGZuOwotCi0gIGlmICghaW5pdGlhbF9mbikKLSAgICB7Ci0gICAgICBpbml0aWFsX2ZuID0geG1hbGxvYyAoc3RybGVuIChmbikgKyAxKTsKLSAgICAgIHN0cmNweShpbml0aWFsX2ZuLCBmbik7Ci0gICAgfQotCi0gIC8qIEFsbG93IHRoZSBpbml0aWFsIGZpbGUsIHJlZ2FyZGxlc3Mgb2YgbmFtZS4gIFN1cHByZXNzIGFsbCBvdGhlcgotICAgICBmaWxlcyBpZiB0aGV5IGVuZCBpbiAiLmgiICh0aGlzIGFsbG93cyBpbmNsdWRlZCAiKi5yYyIpICovCi0gIGlmIChzdHJjbXAgKGluaXRpYWxfZm4sIGZuKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGZuICsgc3RybGVuIChmbikgLSAyLCAiLmgiKSAhPSAwKQotICAgIHN1cHByZXNzX2NwcF9kYXRhID0gMDsKLSAgZWxzZQotICAgIHN1cHByZXNzX2NwcF9kYXRhID0gMTsKLX0KLQotLyogSGFuZGxlIGEgcXVvdGVkIHN0cmluZy4gIFRoZSBxdW90ZXMgYXJlIHN0cmlwcGVkLiAgQSBwYWlyIG9mIHF1b3RlcwotICAgaW4gYSBzdHJpbmcgYXJlIHR1cm5lZCBpbnRvIGEgc2luZ2xlIHF1b3RlLiAgQWRqYWNlbnQgc3RyaW5ncyBhcmUKLSAgIG1lcmdlZCBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSBhcmUgbWVyZ2VkLCBhcyBpbiBDLiAgKi8KLQotc3RhdGljIGNoYXIgKgotaGFuZGxlX3F1b3RlcyAoaW5wdXQsIGxlbikKLSAgICAgY29uc3QgY2hhciAqaW5wdXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmxlbjsKLXsKLSAgY2hhciAqcmV0LCAqczsKLSAgY29uc3QgY2hhciAqdDsKLSAgaW50IGNoOwotCi0gIHJldCA9IGdldF9zdHJpbmcgKHN0cmxlbiAoaW5wdXQpICsgMSk7Ci0KLSAgcyA9IHJldDsKLSAgdCA9IGlucHV0OwotICBpZiAoKnQgPT0gJyInKQotICAgICsrdDsKLSAgd2hpbGUgKCp0ICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKCp0ID09ICdcXCcpCi0JewotCSAgKyt0OwotCSAgc3dpdGNoICgqdCkKLQkgICAgewotCSAgICBjYXNlICdcMCc6Ci0JICAgICAgcmNwYXJzZV93YXJuaW5nICgiYmFja3NsYXNoIGF0IGVuZCBvZiBzdHJpbmciKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdcIic6Ci0JICAgICAgcmNwYXJzZV93YXJuaW5nICgidXNlIFwiXCIgdG8gcHV0IFwiIGluIGEgc3RyaW5nIik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnYSc6Ci0JICAgICAgKnMrKyA9IEVTQ0FQRV9BOwotCSAgICAgICsrdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdiJzoKLQkgICAgICAqcysrID0gRVNDQVBFX0I7Ci0JICAgICAgKyt0OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ2YnOgotCSAgICAgICpzKysgPSBFU0NBUEVfRjsKLQkgICAgICArK3Q7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnbic6Ci0JICAgICAgKnMrKyA9IEVTQ0FQRV9OOwotCSAgICAgICsrdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdyJzoKLQkgICAgICAqcysrID0gRVNDQVBFX1I7Ci0JICAgICAgKyt0OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3QnOgotCSAgICAgICpzKysgPSBFU0NBUEVfVDsKLQkgICAgICArK3Q7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAndic6Ci0JICAgICAgKnMrKyA9IEVTQ0FQRV9WOwotCSAgICAgICsrdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdcXCc6Ci0JICAgICAgKnMrKyA9ICp0Kys7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6Ci0JICAgIGNhc2UgJzQnOiBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOgotCSAgICAgIGNoID0gKnQgLSAnMCc7Ci0JICAgICAgKyt0OwotCSAgICAgIGlmICgqdCA+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+ICQyLm9mZjsKLQkgIH0KLQk7Ci0KLS8qIE1lbW9yeSBmbGFncy4gIFRoaXMgcmV0dXJucyBhIHN0cnVjdCB3aXRoIHR3byBpbnRlZ2VycywgYmVjYXVzZSB3ZQotICAgc29tZXRpbWVzIHdhbnQgdG8gc2V0IGJpdHMgYW5kIHdlIHNvbWV0aW1lcyB3YW50IHRvIGNsZWFyIHRoZW0uICAqLwotCi1tZW1mbGFnOgotCSAgTU9WRUFCTEUKLQkgIHsKLQkgICAgJCQub24gPSBNRU1GTEFHX01PVkVBQkxFOwotCSAgICAkJC5vZmYgPSAwOwotCSAgfQotCXwgRklYRUQKLQkgIHsKLQkgICAgJCQub24gPSAwOwotCSAgICAkJC5vZmYgPSBNRU1GTEFHX01PVkVBQkxFOwotCSAgfQotCXwgUFVSRQotCSAgewotCSAgICAkJC5vbiA9IE1FTUZMQUdfUFVSRTsKLQkgICAgJCQub2ZmID0gMDsKLQkgIH0KLQl8IElNUFVSRQotCSAgewotCSAgICAkJC5vbiA9IDA7Ci0JICAgICQkLm9mZiA9IE1FTUZMQUdfUFVSRTsKLQkgIH0KLQl8IFBSRUxPQUQKLQkgIHsKLQkgICAgJCQub24gPSBNRU1GTEFHX1BSRUxPQUQ7Ci0JICAgICQkLm9mZiA9IDA7Ci0JICB9Ci0JfCBMT0FET05DQUxMCi0JICB7Ci0JICAgICQkLm9uID0gMDsKLQkgICAgJCQub2ZmID0gTUVNRkxBR19QUkVMT0FEOwotCSAgfQotCXwgRElTQ0FSREFCTEUKLQkgIHsKLQkgICAgJCQub24gPSBNRU1GTEFHX0RJU0NBUkRBQkxFOwotCSAgICAkJC5vZmYgPSAwOwotCSAgfQotCTsKLQotLyogQSBmaWxlIG5hbWUuICAqLwotCi1maWxlX25hbWU6Ci0JICBRVU9URURTVFJJTkcKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IFNUUklORwotCSAgewotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLQotLyogQSBzdHlsZSBleHByZXNzaW9uLiAgVGhpcyBjaGFuZ2VzIHRoZSBzdGF0aWMgdmFyaWFibGUgU1RZTEUuICBXZSBkbwotICAgaXQgdGhpcyB3YXkgYmVjYXVzZSByYyBhcHBlYXJzIHRvIHBlcm1pdCBhIHN0eWxlIHRvIGJlIHNldCB0bwotICAgc29tZXRoaW5nIGxpa2UKLSAgICAgICBXU19HUk9VUCB8IE5PVCBXU19UQUJTVE9QCi0gICB0byBtZWFuIHRoYXQgYSBkZWZhdWx0IG9mIFdTX1RBQlNUT1Agc2hvdWxkIGJlIHJlbW92ZWQuICBBbnl0aGluZwotICAgd2hpY2ggd2FudHMgdG8gYWNjZXB0IGEgc3R5bGUgbXVzdCBmaXJzdCBzZXQgU1RZTEUgdG8gdGhlIGRlZmF1bHQKLSAgIHZhbHVlLiAgVGhlIHN0eWxlZXhwciBub250ZXJtaW5hbCB3aWxsIGNoYW5nZSBTVFlMRSBhcyBzcGVjaWZpZWQgYnkKLSAgIHRoZSB1c2VyLiAgTm90ZSB0aGF0IHdlIGRvIG5vdCBhY2NlcHQgYXJiaXRyYXJ5IGV4cHJlc3Npb25zIGhlcmUsCi0gICBqdXN0IG51bWJlcnMgc2VwYXJhdGVkIGJ5ICd8Jy4gICovCi0KLXN0eWxlZXhwcjoKLQkgIHBhcmVubnVtYmVyCi0JICB7Ci0JICAgIHN0eWxlIHw9ICQxOwotCSAgfQotCXwgTk9UIHBhcmVubnVtYmVyCi0JICB7Ci0JICAgIHN0eWxlICY9fiAkMjsKLQkgIH0KLQl8IHN0eWxlZXhwciAnfCcgcGFyZW5udW1iZXIKLQkgIHsKLQkgICAgc3R5bGUgfD0gJDM7Ci0JICB9Ci0JfCBzdHlsZWV4cHIgJ3wnIE5PVCBwYXJlbm51bWJlcgotCSAgewotCSAgICBzdHlsZSAmPX4gJDQ7Ci0JICB9Ci0JOwotCi1wYXJlbm51bWJlcjoKLQkgIE5VTUJFUgotCSAgewotCSAgICAkJCA9ICQxLnZhbDsKLQkgIH0KLQl8ICcoJyBudW1leHByICcpJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCTsKLQotLyogQW4gb3B0aW9uYWwgZXhwcmVzc2lvbiB3aXRoIGEgbGVhZGluZyBjb21tYS4gICovCi0KLW9wdGNudW1leHByOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSAwOwotCSAgfQotCXwgY251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2l0aCBhIGxlYWRpbmcgY29tbWEuICAqLwotCi1jbnVtZXhwcjoKLQkgICcsJyBudW1leHByCi0JICB7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JOwotCi0vKiBBIHBvc3NpYmx5IG5lZ2F0ZWQgbnVtZXJpYyBleHByZXNzaW9uLiAgKi8KLQotbnVtZXhwcjoKLQkgIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJCA9ICQxLnZhbDsKLQkgIH0KLQk7Ci0KLS8qIEEgcG9zc2libHkgbmVnYXRlZCBleHByZXNzaW9uIHdpdGggYSBzaXplLiAgKi8KLQotc2l6ZWRudW1leHByOgotCSAgTlVNQkVSCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCAnKCcgc2l6ZWRudW1leHByICcpJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCXwgJ34nIHNpemVkbnVtZXhwciAlcHJlYyAnficKLQkgIHsKLQkgICAgJCQudmFsID0gfiAkMi52YWw7Ci0JICAgICQkLmR3b3JkID0gJDIuZHdvcmQ7Ci0JICB9Ci0JfCAnLScgc2l6ZWRudW1leHByICVwcmVjIE5FRwotCSAgewotCSAgICAkJC52YWwgPSAtICQyLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMi5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnKicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAqICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnLycgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAvICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnJScgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAlICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnKycgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCArICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnLScgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAtICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnJicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAmICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnXicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCBeICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnfCcgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCB8ICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2l0aCBhIGxlYWRpbmcgY29tbWEgd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5Ci0gICBuZWdhdGlvbi4gICovCi0KLWNwb3NudW1leHByOgotCSAgJywnIHBvc251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMjsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5IG5lZ2F0aW9uLiAgKi8KLQotcG9zbnVtZXhwcjoKLQkgIHNpemVkcG9zbnVtZXhwcgotCSAgewotCSAgICAkJCA9ICQxLnZhbDsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5IG5lZ2F0aW9uLiAgV2Ugc2VwYXJhdGUgdW5hcnkKLSAgIG5lZ2F0aW9uIHRvIGF2b2lkIHBhcnNpbmcgY29uZmxpY3RzIHdoZW4gdHdvIG51bWVyaWMgZXhwcmVzc2lvbnMKLSAgIGFwcGVhciBjb25zZWN1dGl2ZWx5LiAgKi8KLQotc2l6ZWRwb3NudW1leHByOgotCSAgTlVNQkVSCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCAnKCcgc2l6ZWRudW1leHByICcpJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCXwgJ34nIHNpemVkbnVtZXhwciAlcHJlYyAnficKLQkgIHsKLQkgICAgJCQudmFsID0gfiAkMi52YWw7Ci0JICAgICQkLmR3b3JkID0gJDIuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJyonIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgKiAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJy8nIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgLyAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJyUnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgJSAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJysnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgKyAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJy0nIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgLSAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJyYnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgJiAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJ14nIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgXiAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJ3wnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgfCAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JOwotCi0lJQotCi0vKiBTZXQgdGhlIGxhbmd1YWdlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICovCi0KLXZvaWQKLXJjcGFyc2Vfc2V0X2xhbmd1YWdlIChsYW5nKQotICAgICBpbnQgbGFuZzsKLXsKLSAgbGFuZ3VhZ2UgPSBsYW5nOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcmRjb2ZmLmMgYi9iaW51dGlscy9yZGNvZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2OGJjNi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZGNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDg4OSArMCwwIEBACi0vKiBzdGFicy5jIC0tIFBhcnNlIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgd2hpY2ggcGFyc2VzIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotLyogRklYTUU6IFdlIHNob3VsZCBub3QgbmVlZCB0aGlzIEJGRCBpbnRlcm5hbCBmaWxlLiAgV2UgbmVlZCBpdCBmb3IKLSAgIHRoZSBOX0JUTUFTSywgZXRjLiwgdmFsdWVzLiAgKi8KLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLS8qIFRoZXNlIG1hY3JvcyBleHRyYWN0IHRoZSByaWdodCBtYXNrIGFuZCBzaGlmdHMgZm9yIHRoaXMgQkZELiAgVGhleQotICAgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBsb2NhbCB2YXJpYWJsZSBuYW1lZCBBQkZELiAgVGhpcyBpcyBzbyB0aGF0Ci0gICBtYWNyb3MgbGlrZSBJU0ZDTiBhbmQgREVDUkVGLCBmcm9tIGNvZmYvaW50ZXJuYWwuaCwgd2lsbCB3b3JrCi0gICB3aXRob3V0IG1vZGlmaWNhdGlvbi4gICovCi0jZGVmaW5lIE5fQlRNQVNLIChjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX2J0bWFzaykKLSNkZWZpbmUJTl9CVFNIRlQgKGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fYnRzaGZ0KQotI2RlZmluZQlOX1RNQVNLICAoY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl90bWFzaykKLSNkZWZpbmUJTl9UU0hJRlQgKGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fdHNoaWZ0KQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgdGhlIHN5bWJvbHMsIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQKLSAgIGxvY2F0aW9uIHdpdGhpbiB0aGUgc3ltYm9scy4gICovCi0KLXN0cnVjdCBjb2ZmX3N5bWJvbHMKLXsKLSAgLyogVGhlIHN5bWJvbHMuICAqLwotICBhc3ltYm9sICoqc3ltczsKLSAgLyogVGhlIG51bWJlciBvZiBzeW1ib2xzLiAgKi8KLSAgbG9uZyBzeW1jb3VudDsKLSAgLyogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHN5bWJvbC4gICovCi0gIGxvbmcgc3ltbm87Ci0gIC8qIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzeW1ib2wgaW4gdGhlIENPRkYgc3ltYm9sIHRhYmxlICh3aGVyZQotICAgICBlYWNoIGF1eGVudCBjb3VudHMgYXMgYSBzeW1ib2wpLiAgKi8KLSAgbG9uZyBjb2ZmX3N5bW5vOwotfTsKLQotLyogVGhlIGxhcmdlc3QgYmFzaWMgdHlwZSB3ZSBhcmUgcHJlcGFyZWQgdG8gaGFuZGxlLiAgKi8KLQotI2RlZmluZSBUX01BWCAoVF9MTkdEQkwpCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBzbG90cy4gICovCi0KLXN0cnVjdCBjb2ZmX3Nsb3RzCi17Ci0gIC8qIE5leHQgc2V0IG9mIHNsb3RzLiAgKi8KLSAgc3RydWN0IGNvZmZfc2xvdHMgKm5leHQ7Ci0gIC8qIFNsb3RzLiAgKi8KLSNkZWZpbmUgQ09GRl9TTE9UUyAoMTYpCi0gIGRlYnVnX3R5cGUgc2xvdHNbQ09GRl9TTE9UU107Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIG1hcCBzeW1ib2wgaW5kaWNlcyB0byB0eXBlcy4gICovCi0KLXN0cnVjdCBjb2ZmX3R5cGVzCi17Ci0gIC8qIFNsb3RzLiAgKi8KLSAgc3RydWN0IGNvZmZfc2xvdHMgKnNsb3RzOwotICAvKiBCYXNpYyB0eXBlcy4gICovCi0gIGRlYnVnX3R5cGUgYmFzaWNbVF9NQVggKyAxXTsKLX07Ci0KLXN0YXRpYyBkZWJ1Z190eXBlICpjb2ZmX2dldF9zbG90IFBBUkFNUyAoKHN0cnVjdCBjb2ZmX3R5cGVzICosIGludCkpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2VfY29mZl90eXBlCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9zeW1ib2xzICosIHN0cnVjdCBjb2ZmX3R5cGVzICosIGxvbmcsIGludCwKLQkgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKiwgYm9vbGVhbiwgUFRSKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9jb2ZmX2Jhc2VfdHlwZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfc3ltYm9scyAqLCBzdHJ1Y3QgY29mZl90eXBlcyAqLCBsb25nLCBpbnQsCi0JICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICosIFBUUikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfc3ltYm9scyAqLCBzdHJ1Y3QgY29mZl90eXBlcyAqLCBpbnQsCi0JICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICosIFBUUikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2VfY29mZl9lbnVtX3R5cGUKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKiwgc3RydWN0IGNvZmZfdHlwZXMgKiwKLQkgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9jb2ZmX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfdHlwZXMgKiwgYXN5bWJvbCAqLCBsb25nLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgUFRSLCBkZWJ1Z190eXBlLCBib29sZWFuKSk7Ci0MCi0vKiBSZXR1cm4gdGhlIHNsb3QgZm9yIGEgdHlwZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlICoKLWNvZmZfZ2V0X3Nsb3QgKHR5cGVzLCBpbmR4KQotICAgICBzdHJ1Y3QgY29mZl90eXBlcyAqdHlwZXM7Ci0gICAgIGludCBpbmR4OwotewotICBzdHJ1Y3QgY29mZl9zbG90cyAqKnBwczsKLQotICBwcHMgPSAmdHlwZXMtPnNsb3RzOwotCi0gIHdoaWxlIChpbmR4ID49IENPRkZfU0xPVFMpCi0gICAgewotICAgICAgaWYgKCpwcHMgPT0gTlVMTCkKLQl7Ci0JICAqcHBzID0gKHN0cnVjdCBjb2ZmX3Nsb3RzICopIHhtYWxsb2MgKHNpemVvZiAqKnBwcyk7Ci0JICBtZW1zZXQgKCpwcHMsIDAsIHNpemVvZiAqKnBwcyk7Ci0JfQotICAgICAgcHBzID0gJigqcHBzKS0+bmV4dDsKLSAgICAgIGluZHggLT0gQ09GRl9TTE9UUzsKLSAgICB9Ci0KLSAgaWYgKCpwcHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAqcHBzID0gKHN0cnVjdCBjb2ZmX3Nsb3RzICopIHhtYWxsb2MgKHNpemVvZiAqKnBwcyk7Ci0gICAgICBtZW1zZXQgKCpwcHMsIDAsIHNpemVvZiAqKnBwcyk7Ci0gICAgfQotCi0gIHJldHVybiAoKnBwcyktPnNsb3RzICsgaW5keDsKLX0KLQotLyogUGFyc2UgYSBDT0ZGIHR5cGUgY29kZSBpbiBOVFlQRS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9jb2ZmX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBudHlwZSwgcGF1eGVudCwgdXNlYXV4LAotCQkgZGhhbmRsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2xzICpzeW1ib2xzOwotICAgICBzdHJ1Y3QgY29mZl90eXBlcyAqdHlwZXM7Ci0gICAgIGxvbmcgY29mZl9zeW1ubzsKLSAgICAgaW50IG50eXBlOwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci0gICAgIGJvb2xlYW4gdXNlYXV4OwotICAgICBQVFIgZGhhbmRsZTsKLXsKLSAgZGVidWdfdHlwZSB0eXBlOwotCi0gIGlmICgobnR5cGUgJiB+Tl9CVE1BU0spICE9IDApCi0gICAgewotICAgICAgaW50IG5ld3R5cGU7Ci0KLSAgICAgIG5ld3R5cGUgPSBERUNSRUYgKG50eXBlKTsKLQotICAgICAgaWYgKElTUFRSIChudHlwZSkpCi0JewotCSAgdHlwZSA9IHBhcnNlX2NvZmZfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIGNvZmZfc3ltbm8sIG5ld3R5cGUsCi0JCQkJICBwYXV4ZW50LCB1c2VhdXgsIGRoYW5kbGUpOwotCSAgdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChkaGFuZGxlLCB0eXBlKTsKLQl9Ci0gICAgICBlbHNlIGlmIChJU0ZDTiAobnR5cGUpKQotCXsKLQkgIHR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBuZXd0eXBlLAotCQkJCSAgcGF1eGVudCwgdXNlYXV4LCBkaGFuZGxlKTsKLQkgIHR5cGUgPSBkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUgKGRoYW5kbGUsIHR5cGUsIChkZWJ1Z190eXBlICopIE5VTEwsCi0JCQkJCSAgIGZhbHNlKTsKLQl9Ci0gICAgICBlbHNlIGlmIChJU0FSWSAobnR5cGUpKQotCXsKLQkgIGludCBuOwotCi0JICBpZiAocGF1eGVudCA9PSBOVUxMKQotCSAgICBuID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIHNob3J0ICpkaW07Ci0JICAgICAgaW50IGk7Ci0KLQkgICAgICAvKiBGSVhNRTogSWYgcGF1eGVudC0+eF9zeW0ueF90YWduZHgubCA9PSAwLCBnZGIgc2V0cwotICAgICAgICAgICAgICAgICB0aGUgY19uYXV4IGZpZWxkIG9mIHRoZSBzeW1lbnQgdG8gMC4gICovCi0KLQkgICAgICAvKiBNb3ZlIHRoZSBkaW1lbnNpb25zIGRvd24sIHNvIHRoYXQgdGhlIG5leHQgYXJyYXkKLSAgICAgICAgICAgICAgICAgcGlja3MgdXAgdGhlIG5leHQgb25lLiAgKi8KLQkgICAgICBkaW0gPSBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuOwotCSAgICAgIG4gPSBkaW1bMF07Ci0JICAgICAgZm9yIChpID0gMDsgKmRpbSAhPSAwICYmIGkgPCBESU1OVU0gLSAxOyBpKyssIGRpbSsrKQotCQkqZGltID0gKihkaW0gKyAxKTsKLQkgICAgICAqZGltID0gMDsKLQkgICAgfQotCi0JICB0eXBlID0gcGFyc2VfY29mZl90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgY29mZl9zeW1ubywgbmV3dHlwZSwKLQkJCQkgIHBhdXhlbnQsIGZhbHNlLCBkaGFuZGxlKTsKLQkgIHR5cGUgPSBkZWJ1Z19tYWtlX2FycmF5X3R5cGUgKGRoYW5kbGUsIHR5cGUsCi0JCQkJCXBhcnNlX2NvZmZfYmFzZV90eXBlIChhYmZkLCBzeW1ib2xzLAotCQkJCQkJCSAgICAgIHR5cGVzLAotCQkJCQkJCSAgICAgIGNvZmZfc3ltbm8sCi0JCQkJCQkJICAgICAgVF9JTlQsCi0JCQkJCQkJICAgICAgTlVMTCwgZGhhbmRsZSksCi0JCQkJCTAsIG4gLSAxLCBmYWxzZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHBhcnNlX2NvZmZfdHlwZTogQmFkIHR5cGUgY29kZSAweCV4XG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLCBudHlwZSk7Ci0JICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCX0KLQotICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gIGlmIChwYXV4ZW50ICE9IE5VTEwgJiYgcGF1eGVudC0+eF9zeW0ueF90YWduZHgubCA+IDApCi0gICAgewotICAgICAgZGVidWdfdHlwZSAqc2xvdDsKLQotICAgICAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyB0eXBlLiAgRklYTUU6IGdkYiBjaGVja3MKLQkgdGhhdCB0aGUgY2xhc3MgaXMgbm90IENfU1RSVEFHLCBub3IgQ19VTlRBRywgbm9yIENfRU5UQUcuICAqLwotICAgICAgc2xvdCA9IGNvZmZfZ2V0X3Nsb3QgKHR5cGVzLCBwYXV4ZW50LT54X3N5bS54X3RhZ25keC5sKTsKLSAgICAgIGlmICgqc2xvdCAhPSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuICpzbG90OwotICAgICAgZWxzZQotCXJldHVybiBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsIHNsb3QsIChjb25zdCBjaGFyICopIE5VTEwpOwotICAgIH0KLQotICAvKiBJZiB0aGUgYXV4IGVudHJ5IGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBmb3Igc29tZXRoaW5nLCB1c2VhdXggd2lsbAotICAgICBoYXZlIGJlZW4gc2V0IHRvIGZhbHNlLCBpbmRpY2F0aW5nIHRoYXQgcGFyc2VfY29mZl9iYXNlX3R5cGUKLSAgICAgc2hvdWxkIG5vdCB1c2UgaXQuICBXZSBuZWVkIHRvIGRvIGl0IHRoaXMgd2F5LCByYXRoZXIgdGhhbiBzaW1wbHkKLSAgICAgcGFzc2luZyBwYXV4ZW50IGFzIE5VTEwsIGJlY2F1c2Ugd2UgbmVlZCB0byBiZSBhYmxlIGhhbmRsZQotICAgICBtdWx0aXBsZSBhcnJheSBkaW1lbnNpb25zIHdoaWxlIHN0aWxsIGRpc2NhcmRpbmcgcGF1eGVudCBhZnRlcgotICAgICBoYXZpbmcgaGFuZGxlZCBhbGwgb2YgdGhlbS4gICovCi0gIGlmICghIHVzZWF1eCkKLSAgICBwYXV4ZW50ID0gTlVMTDsKLQotICByZXR1cm4gcGFyc2VfY29mZl9iYXNlX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBudHlwZSwKLQkJCSAgICAgICBwYXV4ZW50LCBkaGFuZGxlKTsKLX0KLQotLyogUGFyc2UgYSBiYXNpYyBDT0ZGIHR5cGUgaW4gTlRZUEUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2VfY29mZl9iYXNlX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBudHlwZSwgcGF1eGVudCwKLQkJICAgICAgZGhhbmRsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2xzICpzeW1ib2xzOwotICAgICBzdHJ1Y3QgY29mZl90eXBlcyAqdHlwZXM7Ci0gICAgIGxvbmcgY29mZl9zeW1ubzsKLSAgICAgaW50IG50eXBlOwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBkZWJ1Z190eXBlIHJldDsKLSAgYm9vbGVhbiBzZXRfYmFzaWM7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGRlYnVnX3R5cGUgKnNsb3Q7Ci0KLSAgaWYgKG50eXBlID49IDAKLSAgICAgICYmIG50eXBlIDw9IFRfTUFYCi0gICAgICAmJiB0eXBlcy0+YmFzaWNbbnR5cGVdICE9IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gdHlwZXMtPmJhc2ljW250eXBlXTsKLQotICBzZXRfYmFzaWMgPSB0cnVlOwotICBuYW1lID0gTlVMTDsKLQotICBzd2l0Y2ggKG50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0ID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfTlVMTDoKLSAgICBjYXNlIFRfVk9JRDoKLSAgICAgIHJldCA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIG5hbWUgPSAidm9pZCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9DSEFSOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1NIT1JUOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaG9ydCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9JTlQ6Ci0gICAgICAvKiBGSVhNRTogUGVyaGFwcyB0aGUgc2l6ZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlIGFyY2hpdGVjdHVyZS4gICovCi0gICAgICByZXQgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBuYW1lID0gImludCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9MT05HOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX0ZMT0FUOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA0KTsKLSAgICAgIG5hbWUgPSAiZmxvYXQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfRE9VQkxFOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIG5hbWUgPSAiZG91YmxlIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX0xOR0RCTDoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgMTIpOwotICAgICAgbmFtZSA9ICJsb25nIGRvdWJsZSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9VQ0hBUjoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1VTSE9SVDoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBzaG9ydCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9VSU5UOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGludCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9VTE9ORzoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1NUUlVDVDoKLSAgICAgIGlmIChwYXV4ZW50ID09IE5VTEwpCi0JcmV0ID0gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgdHJ1ZSwgMCwKLQkJCQkgICAgICAoZGVidWdfZmllbGQgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JcmV0ID0gcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIG50eXBlLCBwYXV4ZW50LAotCQkJCSAgICAgIGRoYW5kbGUpOwotCi0gICAgICBzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIGNvZmZfc3ltbm8pOwotICAgICAgKnNsb3QgPSByZXQ7Ci0KLSAgICAgIHNldF9iYXNpYyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfVU5JT046Ci0gICAgICBpZiAocGF1eGVudCA9PSBOVUxMKQotCXJldCA9IGRlYnVnX21ha2Vfc3RydWN0X3R5cGUgKGRoYW5kbGUsIGZhbHNlLCAwLCAoZGVidWdfZmllbGQgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JcmV0ID0gcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIG50eXBlLCBwYXV4ZW50LAotCQkJCSAgICAgIGRoYW5kbGUpOwotCi0gICAgICBzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIGNvZmZfc3ltbm8pOwotICAgICAgKnNsb3QgPSByZXQ7Ci0KLSAgICAgIHNldF9iYXNpYyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfRU5VTToKLSAgICAgIGlmIChwYXV4ZW50ID09IE5VTEwpCi0JcmV0ID0gZGVidWdfbWFrZV9lbnVtX3R5cGUgKGRoYW5kbGUsIChjb25zdCBjaGFyICoqKSBOVUxMLAotCQkJCSAgICAoYmZkX3NpZ25lZF92bWEgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JcmV0ID0gcGFyc2VfY29mZl9lbnVtX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBwYXV4ZW50LCBkaGFuZGxlKTsKLQotICAgICAgc2xvdCA9IGNvZmZfZ2V0X3Nsb3QgKHR5cGVzLCBjb2ZmX3N5bW5vKTsKLSAgICAgICpzbG90ID0gcmV0OwotCi0gICAgICBzZXRfYmFzaWMgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIHJldCA9IGRlYnVnX25hbWVfdHlwZSAoZGhhbmRsZSwgbmFtZSwgcmV0KTsKLQotICBpZiAoc2V0X2Jhc2ljCi0gICAgICAmJiBudHlwZSA+PSAwCi0gICAgICAmJiBudHlwZSA8PSBUX01BWCkKLSAgICB0eXBlcy0+YmFzaWNbbnR5cGVdID0gcmV0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFBhcnNlIGEgc3RydWN0IHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIG50eXBlLCBwYXV4ZW50LCBkaGFuZGxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKnN5bWJvbHM7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlczsKLSAgICAgaW50IG50eXBlOwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBsb25nIHN5bWVuZDsKLSAgaW50IGFsbG9jOwotICBkZWJ1Z19maWVsZCAqZmllbGRzOwotICBpbnQgY291bnQ7Ci0gIGJvb2xlYW4gZG9uZTsKLQotICBzeW1lbmQgPSBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sOwotCi0gIGFsbG9jID0gMTA7Ci0gIGZpZWxkcyA9IChkZWJ1Z19maWVsZCAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqZmllbGRzKTsKLSAgY291bnQgPSAwOwotCi0gIGRvbmUgPSBmYWxzZTsKLSAgd2hpbGUgKCEgZG9uZQotCSAmJiBzeW1ib2xzLT5jb2ZmX3N5bW5vIDwgc3ltZW5kCi0JICYmIHN5bWJvbHMtPnN5bW5vIDwgc3ltYm9scy0+c3ltY291bnQpCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgbG9uZyB0aGlzX2NvZmZfc3ltbm87Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWVudDsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhlbnQ7Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBzdWJhdXg7Ci0gICAgICBiZmRfdm1hIGJpdHBvcyA9IDAsIGJpdHNpemUgPSAwOwotCi0gICAgICBzeW0gPSBzeW1ib2xzLT5zeW1zW3N5bWJvbHMtPnN5bW5vXTsKLQotICAgICAgaWYgKCEgYmZkX2NvZmZfZ2V0X3N5bWVudCAoYWJmZCwgc3ltLCAmc3ltZW50KSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfY29mZl9nZXRfc3ltZW50IGZhaWxlZDogJXNcbiIpLAotCQkgICBwcm9ncmFtX25hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JfQotCi0gICAgICB0aGlzX2NvZmZfc3ltbm8gPSBzeW1ib2xzLT5jb2ZmX3N5bW5vOwotCi0gICAgICArK3N5bWJvbHMtPnN5bW5vOwotICAgICAgc3ltYm9scy0+Y29mZl9zeW1ubyArPSAxICsgc3ltZW50Lm5fbnVtYXV4OwotCi0gICAgICBpZiAoc3ltZW50Lm5fbnVtYXV4ID09IDApCi0JcHN1YmF1eCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX2NvZmZfZ2V0X2F1eGVudCAoYWJmZCwgc3ltLCAwLCAmYXV4ZW50KSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGJmZF9jb2ZmX2dldF9hdXhlbnQgZmFpbGVkOiAlc1xuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgICB9Ci0JICBwc3ViYXV4ID0gJmF1eGVudDsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoc3ltZW50Lm5fc2NsYXNzKQotCXsKLQljYXNlIENfTU9TOgotCWNhc2UgQ19NT1U6Ci0JICBiaXRwb3MgPSA4ICogYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICBiaXRzaXplID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBDX0ZJRUxEOgotCSAgYml0cG9zID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICBiaXRzaXplID0gYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplOwotCSAgYnJlYWs7Ci0KLQljYXNlIENfRU9TOgotCSAgZG9uZSA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICghIGRvbmUpCi0JewotCSAgZGVidWdfdHlwZSBmdHlwZTsKLQkgIGRlYnVnX2ZpZWxkIGY7Ci0KLQkgIGZ0eXBlID0gcGFyc2VfY29mZl90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgdGhpc19jb2ZmX3N5bW5vLAotCQkJCSAgIHN5bWVudC5uX3R5cGUsIHBzdWJhdXgsIHRydWUsIGRoYW5kbGUpOwotCSAgZiA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIGZ0eXBlLAotCQkJCWJpdHBvcywgYml0c2l6ZSwgREVCVUdfVklTSUJJTElUWV9QVUJMSUMpOwotCSAgaWYgKGYgPT0gREVCVUdfRklFTERfTlVMTCkKLQkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotCSAgaWYgKGNvdW50ICsgMSA+PSBhbGxvYykKLQkgICAgewotCSAgICAgIGFsbG9jICs9IDEwOwotCSAgICAgIGZpZWxkcyA9ICgoZGVidWdfZmllbGQgKikKLQkJCXhyZWFsbG9jIChmaWVsZHMsIGFsbG9jICogc2l6ZW9mICpmaWVsZHMpKTsKLQkgICAgfQotCi0JICBmaWVsZHNbY291bnRdID0gZjsKLQkgICsrY291bnQ7Ci0JfQotICAgIH0KLQotICBmaWVsZHNbY291bnRdID0gREVCVUdfRklFTERfTlVMTDsKLQotICByZXR1cm4gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgbnR5cGUgPT0gVF9TVFJVQ1QsCi0JCQkJIHBhdXhlbnQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplLAotCQkJCSBmaWVsZHMpOwotfQotCi0vKiBQYXJzZSBhbiBlbnVtIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2VfY29mZl9lbnVtX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBwYXV4ZW50LCBkaGFuZGxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKnN5bWJvbHM7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlczsKLSAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICpwYXV4ZW50OwotICAgICBQVFIgZGhhbmRsZTsKLXsKLSAgbG9uZyBzeW1lbmQ7Ci0gIGludCBhbGxvYzsKLSAgY29uc3QgY2hhciAqKm5hbWVzOwotICBiZmRfc2lnbmVkX3ZtYSAqdmFsczsKLSAgaW50IGNvdW50OwotICBib29sZWFuIGRvbmU7Ci0KLSAgc3ltZW5kID0gcGF1eGVudC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubDsKLQotICBhbGxvYyA9IDEwOwotICBuYW1lcyA9IChjb25zdCBjaGFyICoqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqbmFtZXMpOwotICB2YWxzID0gKGJmZF9zaWduZWRfdm1hICopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICp2YWxzKTsKLSAgY291bnQgPSAwOwotCi0gIGRvbmUgPSBmYWxzZTsKLSAgd2hpbGUgKCEgZG9uZQotCSAmJiBzeW1ib2xzLT5jb2ZmX3N5bW5vIDwgc3ltZW5kCi0JICYmIHN5bWJvbHMtPnN5bW5vIDwgc3ltYm9scy0+c3ltY291bnQpCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW1lbnQ7Ci0KLSAgICAgIHN5bSA9IHN5bWJvbHMtPnN5bXNbc3ltYm9scy0+c3ltbm9dOwotCi0gICAgICBpZiAoISBiZmRfY29mZl9nZXRfc3ltZW50IChhYmZkLCBzeW0sICZzeW1lbnQpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGJmZF9jb2ZmX2dldF9zeW1lbnQgZmFpbGVkOiAlc1xuIiksCi0JCSAgIHByb2dyYW1fbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQl9Ci0KLSAgICAgICsrc3ltYm9scy0+c3ltbm87Ci0gICAgICBzeW1ib2xzLT5jb2ZmX3N5bW5vICs9IDEgKyBzeW1lbnQubl9udW1hdXg7Ci0KLSAgICAgIHN3aXRjaCAoc3ltZW50Lm5fc2NsYXNzKQotCXsKLQljYXNlIENfTU9FOgotCSAgaWYgKGNvdW50ICsgMSA+PSBhbGxvYykKLQkgICAgewotCSAgICAgIGFsbG9jICs9IDEwOwotCSAgICAgIG5hbWVzID0gKChjb25zdCBjaGFyICoqKQotCQkgICAgICAgeHJlYWxsb2MgKG5hbWVzLCBhbGxvYyAqIHNpemVvZiAqbmFtZXMpKTsKLQkgICAgICB2YWxzID0gKChiZmRfc2lnbmVkX3ZtYSAqKQotCQkgICAgICB4cmVhbGxvYyAodmFscywgYWxsb2MgKiBzaXplb2YgKnZhbHMpKTsKLQkgICAgfQotCi0JICBuYW1lc1tjb3VudF0gPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pOwotCSAgdmFsc1tjb3VudF0gPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLQkgICsrY291bnQ7Ci0JICBicmVhazsKLQotCWNhc2UgQ19FT1M6Ci0JICBkb25lID0gdHJ1ZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgbmFtZXNbY291bnRdID0gTlVMTDsKLQotICByZXR1cm4gZGVidWdfbWFrZV9lbnVtX3R5cGUgKGRoYW5kbGUsIG5hbWVzLCB2YWxzKTsKLX0KLQotLyogSGFuZGxlIGEgc2luZ2xlIENPRkYgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2NvZmZfc3ltYm9sIChhYmZkLCB0eXBlcywgc3ltLCBjb2ZmX3N5bW5vLCBwc3ltZW50LCBkaGFuZGxlLCB0eXBlLAotCQkgICB3aXRoaW5fZnVuY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGNvZmZfdHlwZXMgKnR5cGVzOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIGxvbmcgY29mZl9zeW1ubzsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqcHN5bWVudDsKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYm9vbGVhbiB3aXRoaW5fZnVuY3Rpb247Ci17Ci0gIHN3aXRjaCAocHN5bWVudC0+bl9zY2xhc3MpCi0gICAgewotICAgIGNhc2UgQ19OVUxMOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfQVVUTzoKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICBERUJVR19MT0NBTCwgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0VYVDoKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICBERUJVR19HTE9CQUwsIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19TVEFUOgotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlLAotCQkJCSAgICh3aXRoaW5fZnVuY3Rpb24KLQkJCQkgICAgPyBERUJVR19MT0NBTF9TVEFUSUMKLQkJCQkgICAgOiBERUJVR19TVEFUSUMpLAotCQkJCSAgIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19SRUc6Ci0gICAgICAvKiBGSVhNRTogV2UgbWF5IG5lZWQgdG8gY29udmVydCB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICBERUJVR19SRUdJU1RFUiwgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0xBQkVMOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfQVJHOgotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3BhcmFtZXRlciAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICAgREVCVUdfUEFSTV9TVEFDSywgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX1JFR1BBUk06Ci0gICAgICAvKiBGSVhNRTogV2UgbWF5IG5lZWQgdG8gY29udmVydCB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHR5cGUsCi0JCQkJICAgIERFQlVHX1BBUk1fUkVHLCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfVFBERUY6Ci0gICAgICB0eXBlID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlKTsKLSAgICAgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19TVFJUQUc6Ci0gICAgY2FzZSBDX1VOVEFHOgotICAgIGNhc2UgQ19FTlRBRzoKLSAgICAgIHsKLQlkZWJ1Z190eXBlICpzbG90OwotCi0JdHlwZSA9IGRlYnVnX3RhZ190eXBlIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlKTsKLQlpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBTdG9yZSB0aGUgbmFtZWQgdHlwZSBpbnRvIHRoZSBzbG90LCBzbyB0aGF0IHJlZmVyZW5jZXMgZ2V0Ci0gICAgICAgICAgIHRoZSBuYW1lLiAgKi8KLQlzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIGNvZmZfc3ltbm8pOwotCSpzbG90ID0gdHlwZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsJCQkJICAgCi19Ci0KLS8qIFRoaXMgaXMgdGhlIG1haW4gcm91dGluZS4gIEl0IGxvb2tzIHRocm91Z2ggYWxsIHRoZSBzeW1ib2xzIGFuZAotICAgaGFuZGxlcyB0aGVtLiAgKi8KLQotYm9vbGVhbgotcGFyc2VfY29mZiAoYWJmZCwgc3ltcywgc3ltY291bnQsIGRoYW5kbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBzdHJ1Y3QgY29mZl9zeW1ib2xzIHN5bWJvbHM7Ci0gIHN0cnVjdCBjb2ZmX3R5cGVzIHR5cGVzOwotICBpbnQgaTsKLSAgbG9uZyBuZXh0X2NfZmlsZTsKLSAgY29uc3QgY2hhciAqZm5uYW1lOwotICBpbnQgZm5jbGFzczsKLSAgaW50IGZudHlwZTsKLSAgYmZkX3ZtYSBmbmVuZDsKLSAgYWxlbnQgKmxpbmVub3M7Ci0gIGJvb2xlYW4gd2l0aGluX2Z1bmN0aW9uOwotICBsb25nIHRoaXNfY29mZl9zeW1ubzsKLQotICBzeW1ib2xzLnN5bXMgPSBzeW1zOwotICBzeW1ib2xzLnN5bWNvdW50ID0gc3ltY291bnQ7Ci0gIHN5bWJvbHMuc3ltbm8gPSAwOwotICBzeW1ib2xzLmNvZmZfc3ltbm8gPSAwOwotCi0gIHR5cGVzLnNsb3RzID0gTlVMTDsKLSAgZm9yIChpID0gMDsgaSA8PSBUX01BWDsgaSsrKQotICAgIHR5cGVzLmJhc2ljW2ldID0gREVCVUdfVFlQRV9OVUxMOwotCi0gIG5leHRfY19maWxlID0gLTE7Ci0gIGZubmFtZSA9IE5VTEw7Ci0gIGZuY2xhc3MgPSAwOwotICBmbnR5cGUgPSAwOwotICBmbmVuZCA9IDA7Ci0gIGxpbmVub3MgPSBOVUxMOwotICB3aXRoaW5fZnVuY3Rpb24gPSBmYWxzZTsKLQotICB3aGlsZSAoc3ltYm9scy5zeW1ubyA8IHN5bWNvdW50KQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWVudDsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhlbnQ7Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXg7Ci0gICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0KLSAgICAgIHN5bSA9IHN5bXNbc3ltYm9scy5zeW1ub107Ci0KLSAgICAgIGlmICghIGJmZF9jb2ZmX2dldF9zeW1lbnQgKGFiZmQsIHN5bSwgJnN5bWVudCkpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogYmZkX2NvZmZfZ2V0X3N5bWVudCBmYWlsZWQ6ICVzXG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKTsKLQotICAgICAgdGhpc19jb2ZmX3N5bW5vID0gc3ltYm9scy5jb2ZmX3N5bW5vOwotCi0gICAgICArK3N5bWJvbHMuc3ltbm87Ci0gICAgICBzeW1ib2xzLmNvZmZfc3ltbm8gKz0gMSArIHN5bWVudC5uX251bWF1eDsKLQotICAgICAgLyogV2Ugb25seSB3b3JyeSBhYm91dCB0aGUgZmlyc3QgYXV4ZW50LCBiZWNhdXNlIHRoYXQgaXMgdGhlCi0JIG9ubHkgb25lIHdoaWNoIGlzIHJlbGV2YW50IGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKHN5bWVudC5uX251bWF1eCA9PSAwKQotCXBhdXggPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGJmZF9jb2ZmX2dldF9hdXhlbnQgKGFiZmQsIHN5bSwgMCwgJmF1eGVudCkpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfY29mZl9nZXRfYXV4ZW50IGZhaWxlZDogJXNcbiIpLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBwYXV4ID0gJmF1eGVudDsKLQl9Ci0KLSAgICAgIGlmICh0aGlzX2NvZmZfc3ltbm8gPT0gbmV4dF9jX2ZpbGUgJiYgc3ltZW50Lm5fc2NsYXNzICE9IENfRklMRSkKLQl7Ci0JICAvKiBUaGUgbGFzdCBDX0ZJTEUgc3ltYm9sIHBvaW50cyB0byB0aGUgZmlyc3QgZXh0ZXJuYWwKLSAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgaWYgKCEgZGVidWdfc2V0X2ZpbGVuYW1lIChkaGFuZGxlLCAiKmdsb2JhbHMqIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoc3ltZW50Lm5fc2NsYXNzKQotCXsKLQljYXNlIENfRUZDTjoKLQljYXNlIENfRVhUREVGOgotCWNhc2UgQ19VTEFCRUw6Ci0JY2FzZSBDX1VTVEFUSUM6Ci0JY2FzZSBDX0xJTkU6Ci0JY2FzZSBDX0FMSUFTOgotCWNhc2UgQ19ISURERU46Ci0JICAvKiBKdXN0IGlnbm9yZSB0aGVzZSBjbGFzc2VzLiAgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSBDX0ZJTEU6Ci0JICBuZXh0X2NfZmlsZSA9IHN5bWVudC5uX3ZhbHVlOwotCSAgaWYgKCEgZGVidWdfc2V0X2ZpbGVuYW1lIChkaGFuZGxlLCBuYW1lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIENfU1RBVDoKLQkgIC8qIElnbm9yZSBzdGF0aWMgc3ltYm9scyB3aXRoIGEgdHlwZSBvZiBUX05VTEwuICBUaGVzZQotICAgICAgICAgICAgIHJlcHJlc2VudCBzZWN0aW9uIGVudHJpZXMuICAqLwotCSAgaWYgKHN5bWVudC5uX3R5cGUgPT0gVF9OVUxMKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBDX0VYVDoKLQkgIGlmIChJU0ZDTiAoc3ltZW50Lm5fdHlwZSkpCi0JICAgIHsKLQkgICAgICBmbm5hbWUgPSBuYW1lOwotCSAgICAgIGZuY2xhc3MgPSBzeW1lbnQubl9zY2xhc3M7Ci0JICAgICAgZm50eXBlID0gc3ltZW50Lm5fdHlwZTsKLQkgICAgICBpZiAoc3ltZW50Lm5fbnVtYXV4ID4gMCkKLQkJZm5lbmQgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSArIGF1eGVudC54X3N5bS54X21pc2MueF9mc2l6ZTsKLQkgICAgICBlbHNlCi0JCWZuZW5kID0gMDsKLQkgICAgICBsaW5lbm9zID0gQkZEX1NFTkQgKGFiZmQsIF9nZXRfbGluZW5vLCAoYWJmZCwgc3ltKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsICZzeW1ib2xzLCAmdHlwZXMsIHRoaXNfY29mZl9zeW1ubywKLQkJCQkgIHN5bWVudC5uX3R5cGUsIHBhdXgsIHRydWUsIGRoYW5kbGUpOwotCSAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoISBwYXJzZV9jb2ZmX3N5bWJvbCAoYWJmZCwgJnR5cGVzLCBzeW0sIHRoaXNfY29mZl9zeW1ubywgJnN5bWVudCwKLQkJCQkgICBkaGFuZGxlLCB0eXBlLCB3aXRoaW5fZnVuY3Rpb24pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgQ19GQ046Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLmJmIikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChmbm5hbWUgPT0gTlVMTCkKLQkJewotCQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVsZDogLmJmIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uXG4iKSwKLQkJCSAgIHByb2dyYW1fbmFtZSwgdGhpc19jb2ZmX3N5bW5vKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsICZzeW1ib2xzLCAmdHlwZXMsIHRoaXNfY29mZl9zeW1ubywKLQkJCQkgICAgICBERUNSRUYgKGZudHlwZSksIHBhdXgsIGZhbHNlLCBkaGFuZGxlKTsKLQkgICAgICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9mdW5jdGlvbiAoZGhhbmRsZSwgZm5uYW1lLCB0eXBlLAotCQkJCQkgICBmbmNsYXNzID09IENfRVhULAotCQkJCQkgICBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmIChsaW5lbm9zICE9IE5VTEwpCi0JCXsKLQkJICBpbnQgYmFzZTsKLQkJICBiZmRfdm1hIGFkZHI7Ci0KLQkJICBpZiAoc3ltZW50Lm5fbnVtYXV4ID09IDApCi0JCSAgICBiYXNlID0gMDsKLQkJICBlbHNlCi0JCSAgICBiYXNlID0gYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vIC0gMTsKLQotCQkgIGFkZHIgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpOwotCi0JCSAgKytsaW5lbm9zOwotCi0JCSAgd2hpbGUgKGxpbmVub3MtPmxpbmVfbnVtYmVyICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9saW5lIChkaGFuZGxlLAotCQkJCQkgICAgICAgbGluZW5vcy0+bGluZV9udW1iZXIgKyBiYXNlLAotCQkJCQkgICAgICAgbGluZW5vcy0+dS5vZmZzZXQgKyBhZGRyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgKytsaW5lbm9zOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBmbm5hbWUgPSBOVUxMOwotCSAgICAgIGxpbmVub3MgPSBOVUxMOwotCSAgICAgIGZuY2xhc3MgPSAwOwotCSAgICAgIGZudHlwZSA9IDA7Ci0KLQkgICAgICB3aXRoaW5fZnVuY3Rpb24gPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZWYiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgd2l0aGluX2Z1bmN0aW9uKQotCQl7Ci0JCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJWxkOiB1bmV4cGVjdGVkIC5lZlxuIiksCi0JCQkgICBwcm9ncmFtX25hbWUsIHRoaXNfY29mZl9zeW1ubyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPiBmbmVuZCkKLQkJZm5lbmQgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLQkgICAgICBpZiAoISBkZWJ1Z19lbmRfZnVuY3Rpb24gKGRoYW5kbGUsIGZuZW5kKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgZm5lbmQgPSAwOwotCSAgICAgIHdpdGhpbl9mdW5jdGlvbiA9IGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgQ19CTE9DSzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIuYmIiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZGVidWdfc3RhcnRfYmxvY2sgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZWIiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZGVidWdfZW5kX2Jsb2NrIChkaGFuZGxlLCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgdHlwZSA9IHBhcnNlX2NvZmZfdHlwZSAoYWJmZCwgJnN5bWJvbHMsICZ0eXBlcywgdGhpc19jb2ZmX3N5bW5vLAotCQkJCSAgc3ltZW50Lm5fdHlwZSwgcGF1eCwgdHJ1ZSwgZGhhbmRsZSk7Ci0JICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmICghIHBhcnNlX2NvZmZfc3ltYm9sIChhYmZkLCAmdHlwZXMsIHN5bSwgdGhpc19jb2ZmX3N5bW5vLCAmc3ltZW50LAotCQkJCSAgIGRoYW5kbGUsIHR5cGUsIHdpdGhpbl9mdW5jdGlvbikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZGRiZy5jIGIvYmludXRpbHMvcmRkYmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQyOGMzNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZGRiZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLS8qIHJkZGJnLmMgLS0gUmVhZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW50byBhIGdlbmVyaWMgZm9ybS4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgOTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIHJlYWRzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbnRvIGEgZ2VuZXJpYyBmb3JtLiAgVGhpcwotICAgZmlsZSBrbm93cyBob3cgdG8gZGlnIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gb3V0IG9mIGFuIG9iamVjdAotICAgZmlsZS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgImJ1ZGJnLmgiCi0KLXN0YXRpYyBib29sZWFuIHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgbG9uZywgUFRSLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBsb25nLCBQVFIsIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gcmVhZF9pZWVlX2RlYnVnZ2luZ19pbmZvIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGJvb2xlYW4gKikpOwotc3RhdGljIHZvaWQgc2F2ZV9zdGFiIFBBUkFNUyAoKGludCwgaW50LCBiZmRfdm1hLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHN0YWJfY29udGV4dCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBmcmVlX3NhdmVkX3N0YWJzIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogUmVhZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBhIEJGRC4gIFJldHVybnMgYSBnZW5lcmljIGRlYnVnZ2luZwotICAgcG9pbnRlci4gICovCi0KLVBUUgotcmVhZF9kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgc3ltcywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci17Ci0gIFBUUiBkaGFuZGxlOwotICBib29sZWFuIGZvdW5kOwotCi0gIGRoYW5kbGUgPSBkZWJ1Z19pbml0ICgpOwotICBpZiAoZGhhbmRsZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgc3ltcywgc3ltY291bnQsIGRoYW5kbGUsCi0JCQkJCSAgICZmb3VuZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0gICAgewotICAgICAgaWYgKCEgcmVhZF9zeW1ib2xfc3RhYnNfZGVidWdnaW5nX2luZm8gKGFiZmQsIHN5bXMsIHN5bWNvdW50LCBkaGFuZGxlLAotCQkJCQkgICAgICAmZm91bmQpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2llZWVfZmxhdm91cikKLSAgICB7Ci0gICAgICBpZiAoISByZWFkX2llZWVfZGVidWdnaW5nX2luZm8gKGFiZmQsIGRoYW5kbGUsICZmb3VuZCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFRyeSByZWFkaW5nIHRoZSBDT0ZGIHN5bWJvbHMgaWYgd2UgZGlkbid0IGZpbmQgYW55IHN0YWJzIGluIENPRkYKLSAgICAgc2VjdGlvbnMuICAqLwotICBpZiAoISBmb3VuZAotICAgICAgJiYgYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotICAgICAgJiYgc3ltY291bnQgPiAwKQotICAgIHsKLSAgICAgIGlmICghIHBhcnNlX2NvZmYgKGFiZmQsIHN5bXMsIHN5bWNvdW50LCBkaGFuZGxlKSkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKCEgZm91bmQpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gcmVjb2duaXplZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiIpLAotCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRoYW5kbGU7Ci19Ci0KLS8qIFJlYWQgc3RhYnMgaW4gc2VjdGlvbnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gYSBCRkQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcmVhZF9zZWN0aW9uX3N0YWJzX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBzeW1zLCBzeW1jb3VudCwgZGhhbmRsZSwgcGZvdW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgYm9vbGVhbiAqcGZvdW5kOwotewotICBzdGF0aWMgc3RydWN0Ci0gICAgewotICAgICAgY29uc3QgY2hhciAqc2VjbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cnNlY25hbWU7Ci0gICAgfSBuYW1lc1tdID0geyB7ICIuc3RhYiIsICIuc3RhYnN0ciIgfSB9OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgUFRSIHNoYW5kbGU7Ci0KLSAgKnBmb3VuZCA9IGZhbHNlOwotICBzaGFuZGxlID0gTlVMTDsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIG5hbWVzIC8gc2l6ZW9mIG5hbWVzWzBdOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYywgKnN0cnNlYzsKLQotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWVzW2ldLnNlY25hbWUpOwotICAgICAgc3Ryc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWVzW2ldLnN0cnNlY25hbWUpOwotICAgICAgaWYgKHNlYyAhPSBOVUxMICYmIHN0cnNlYyAhPSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgc3RhYnNpemUsIHN0cnNpemU7Ci0JICBiZmRfYnl0ZSAqc3RhYnMsICpzdHJpbmdzOwotCSAgYmZkX2J5dGUgKnN0YWI7Ci0JICBiZmRfc2l6ZV90eXBlIHN0cm9mZiwgbmV4dF9zdHJvZmY7Ci0KLQkgIHN0YWJzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKTsKLQkgIHN0YWJzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKHN0YWJzaXplKTsKLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBzdGFicywgMCwgc3RhYnNpemUpKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwKLQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lc1tpXS5zZWNuYW1lLAotCQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBzdHJzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Ryc2VjKTsKLQkgIHN0cmluZ3MgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoc3Ryc2l6ZSk7Ci0JICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHN0cnNlYywgc3RyaW5ncywgMCwgc3Ryc2l6ZSkpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICVzXG4iLAotCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWVzW2ldLnN0cnNlY25hbWUsCi0JCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChzaGFuZGxlID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzaGFuZGxlID0gc3RhcnRfc3RhYiAoZGhhbmRsZSwgYWJmZCwgdHJ1ZSwgc3ltcywgc3ltY291bnQpOwotCSAgICAgIGlmIChzaGFuZGxlID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAqcGZvdW5kID0gdHJ1ZTsKLQotCSAgc3Ryb2ZmID0gMDsKLQkgIG5leHRfc3Ryb2ZmID0gMDsKLQkgIGZvciAoc3RhYiA9IHN0YWJzOyBzdGFiIDwgc3RhYnMgKyBzdGFic2l6ZTsgc3RhYiArPSAxMikKLQkgICAgewotCSAgICAgIGJmZF9zaXplX3R5cGUgc3RyeDsKLQkgICAgICBpbnQgdHlwZTsKLQkgICAgICBpbnQgb3RoZXI7Ci0JICAgICAgaW50IGRlc2M7Ci0JICAgICAgYmZkX3ZtYSB2YWx1ZTsKLQotCSAgICAgIC8qIFRoaXMgY29kZSBwcmVzdW1lcyAzMiBiaXQgdmFsdWVzLiAgKi8KLQotCSAgICAgIHN0cnggPSBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiKTsKLQkgICAgICB0eXBlID0gYmZkX2dldF84IChhYmZkLCBzdGFiICsgNCk7Ci0JICAgICAgb3RoZXIgPSBiZmRfZ2V0XzggKGFiZmQsIHN0YWIgKyA1KTsKLQkgICAgICBkZXNjID0gYmZkX2dldF8xNiAoYWJmZCwgc3RhYiArIDYpOwotCSAgICAgIHZhbHVlID0gYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIDgpOwotCi0JICAgICAgaWYgKHR5cGUgPT0gMCkKLQkJewotCQkgIC8qIFNwZWNpYWwgdHlwZSAwIHN0YWJzIGluZGljYXRlIHRoZSBvZmZzZXQgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICBuZXh0IHN0cmluZyB0YWJsZS4gICovCi0JCSAgc3Ryb2ZmID0gbmV4dF9zdHJvZmY7Ci0JCSAgbmV4dF9zdHJvZmYgKz0gdmFsdWU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjaGFyICpmLCAqczsKLQotCQkgIGYgPSBOVUxMOwotCQkgIHMgPSAoY2hhciAqKSBzdHJpbmdzICsgc3Ryb2ZmICsgc3RyeDsKLQkJICB3aGlsZSAoc1tzdHJsZW4gKHMpIC0gMV0gPT0gJ1xcJwotCQkJICYmIHN0YWIgKyAxMiA8IHN0YWJzICsgc3RhYnNpemUpCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgKnA7Ci0KLQkJICAgICAgc3RhYiArPSAxMjsKLQkJICAgICAgcCA9IHMgKyBzdHJsZW4gKHMpIC0gMTsKLQkJICAgICAgKnAgPSAnXDAnOwotCQkgICAgICBzID0gY29uY2F0IChzLAotCQkJCSAgKChjaGFyICopIHN0cmluZ3MKLQkJCQkgICArIHN0cm9mZgotCQkJCSAgICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYikpLAotCQkJCSAgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0KLQkJICAgICAgLyogV2UgaGF2ZSB0byByZXN0b3JlIHRoZSBiYWNrc2xhc2gsIGJlY2F1c2UsIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpbmtlciBpcyBoYXNoaW5nIHN0YWJzIHN0cmluZ3MsIHdlIG1heQotICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSB0aGUgc2FtZSBzdHJpbmcgbW9yZSB0aGFuIG9uY2UuICAqLwotCQkgICAgICAqcCA9ICdcXCc7Ci0KLQkJICAgICAgaWYgKGYgIT0gTlVMTCkKLQkJCWZyZWUgKGYpOwotCQkgICAgICBmID0gczsKLQkJICAgIH0KLQotCQkgIHNhdmVfc3RhYiAodHlwZSwgZGVzYywgdmFsdWUsIHMpOwotCi0JCSAgaWYgKCEgcGFyc2Vfc3RhYiAoZGhhbmRsZSwgc2hhbmRsZSwgdHlwZSwgZGVzYywgdmFsdWUsIHMpKQotCQkgICAgewotCQkgICAgICBzdGFiX2NvbnRleHQgKCk7Ci0JCSAgICAgIGZyZWVfc2F2ZWRfc3RhYnMgKCk7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIC8qIERvbid0IGZyZWUgZiwgc2luY2UgSSB0aGluayB0aGUgc3RhYnMgY29kZQotICAgICAgICAgICAgICAgICAgICAgZXhwZWN0cyBzdHJpbmdzIHRvIGhhbmcgYXJvdW5kLiAgVGhpcyBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgIHN0cmFpZ2h0ZW5lZCBvdXQuICBGSVhNRS4gICovCi0JCX0KLQkgICAgfQotCi0JICBmcmVlX3NhdmVkX3N0YWJzICgpOwotCSAgZnJlZSAoc3RhYnMpOwotCi0JICAvKiBEb24ndCBmcmVlIHN0cmluZ3MsIHNpbmNlIEkgdGhpbmsgdGhlIHN0YWJzIGNvZGUgZXhwZWN0cwotICAgICAgICAgICAgIHRoZSBzdHJpbmdzIHRvIGhhbmcgYXJvdW5kLiAgVGhpcyBzaG91bGQgYmUgc3RyYWlnaHRlbmVkCi0gICAgICAgICAgICAgb3V0LiAgRklYTUUuICAqLwotCX0KLSAgICB9Ci0KLSAgaWYgKHNoYW5kbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBmaW5pc2hfc3RhYiAoZGhhbmRsZSwgc2hhbmRsZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBzdGFicyBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBzeW1zLCBzeW1jb3VudCwgZGhhbmRsZSwgcGZvdW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgYm9vbGVhbiAqcGZvdW5kOwotewotICBQVFIgc2hhbmRsZTsKLSAgYXN5bWJvbCAqKnBzLCAqKnN5bWVuZDsKLQotICBzaGFuZGxlID0gTlVMTDsKLSAgc3ltZW5kID0gc3ltcyArIHN5bWNvdW50OwotICBmb3IgKHBzID0gc3ltczsgcHMgPCBzeW1lbmQ7IHBzKyspCi0gICAgewotICAgICAgc3ltYm9sX2luZm8gaTsKLQotICAgICAgYmZkX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgKnBzLCAmaSk7Ci0KLSAgICAgIGlmIChpLnR5cGUgPT0gJy0nKQotCXsKLQkgIGNvbnN0IGNoYXIgKnM7Ci0JICBjaGFyICpmOwotCi0JICBpZiAoc2hhbmRsZSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2hhbmRsZSA9IHN0YXJ0X3N0YWIgKGRoYW5kbGUsIGFiZmQsIGZhbHNlLCBzeW1zLCBzeW1jb3VudCk7Ci0JICAgICAgaWYgKHNoYW5kbGUgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgICpwZm91bmQgPSB0cnVlOwotCi0JICBzID0gaS5uYW1lOwotCSAgZiA9IE5VTEw7Ci0JICB3aGlsZSAoc1tzdHJsZW4gKHMpIC0gMV0gPT0gJ1xcJwotCQkgJiYgcHMgKyAxIDwgc3ltZW5kKQotCSAgICB7Ci0JICAgICAgY2hhciAqc2MsICpuOwotCi0JICAgICAgKytwczsKLQkgICAgICBzYyA9IHhzdHJkdXAgKHMpOwotCSAgICAgIHNjW3N0cmxlbiAoc2MpIC0gMV0gPSAnXDAnOwotCSAgICAgIG4gPSBjb25jYXQgKHNjLCBiZmRfYXN5bWJvbF9uYW1lICgqcHMpLCAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQkgICAgICBmcmVlIChzYyk7Ci0JICAgICAgaWYgKGYgIT0gTlVMTCkKLQkJZnJlZSAoZik7Ci0JICAgICAgZiA9IG47Ci0JICAgICAgcyA9IG47Ci0JICAgIH0KLQotCSAgc2F2ZV9zdGFiIChpLnN0YWJfdHlwZSwgaS5zdGFiX2Rlc2MsIGkudmFsdWUsIHMpOwotCi0JICBpZiAoISBwYXJzZV9zdGFiIChkaGFuZGxlLCBzaGFuZGxlLCBpLnN0YWJfdHlwZSwgaS5zdGFiX2Rlc2MsCi0JCQkgICAgaS52YWx1ZSwgcykpCi0JICAgIHsKLQkgICAgICBzdGFiX2NvbnRleHQgKCk7Ci0JICAgICAgZnJlZV9zYXZlZF9zdGFicyAoKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogRG9uJ3QgZnJlZSBmLCBzaW5jZSBJIHRoaW5rIHRoZSBzdGFicyBjb2RlIGV4cGVjdHMKLQkgICAgIHN0cmluZ3MgdG8gaGFuZyBhcm91bmQuICBUaGlzIHNob3VsZCBiZSBzdHJhaWdodGVuZWQgb3V0LgotCSAgICAgRklYTUUuICAqLwotCX0KLSAgICB9Ci0KLSAgZnJlZV9zYXZlZF9zdGFicyAoKTsKLQotICBpZiAoc2hhbmRsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGZpbmlzaF9zdGFiIChkaGFuZGxlLCBzaGFuZGxlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXJlYWRfaWVlZV9kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgZGhhbmRsZSwgcGZvdW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotICAgICBib29sZWFuICpwZm91bmQ7Ci17Ci0gIGFzZWN0aW9uICpkc2VjOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLQotICAvKiBUaGUgQkZEIGJhY2tlbmQgcHV0cyB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGludG8gYSBzZWN0aW9uCi0gICAgIG5hbWVkIC5kZWJ1Zy4gICovCi0KLSAgZHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnIik7Ci0gIGlmIChkc2VjID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGRzZWMpOwotICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChzaXplKTsKLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBkc2VjLCBjb250ZW50cywgMCwgc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHBhcnNlX2llZWUgKGRoYW5kbGUsIGFiZmQsIGNvbnRlbnRzLCBzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoY29udGVudHMpOwotCi0gICpwZm91bmQgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVjb3JkIHN0YWJzIHN0cmluZ3MsIHNvIHRoYXQgd2UgY2FuIGdpdmUgc29tZSBjb250ZXh0IGZvciBlcnJvcnMuICAqLwotCi0jZGVmaW5lIFNBVkVfU1RBQlNfQ09VTlQgKDE2KQotCi1zdHJ1Y3Qgc2F2ZWRfc3RhYgotewotICBpbnQgdHlwZTsKLSAgaW50IGRlc2M7Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGNoYXIgKnN0cmluZzsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2F2ZWRfc3RhYiBzYXZlZF9zdGFic1tTQVZFX1NUQUJTX0NPVU5UXTsKLXN0YXRpYyBpbnQgc2F2ZWRfc3RhYnNfaW5kZXg7Ci0KLS8qIFNhdmUgYSBzdGFicyBzdHJpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotc2F2ZV9zdGFiICh0eXBlLCBkZXNjLCB2YWx1ZSwgc3RyaW5nKQotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IGRlc2M7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHNhdmVkX3N0YWJzW3NhdmVkX3N0YWJzX2luZGV4XS5zdHJpbmcgIT0gTlVMTCkKLSAgICBmcmVlIChzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0uc3RyaW5nKTsKLSAgc2F2ZWRfc3RhYnNbc2F2ZWRfc3RhYnNfaW5kZXhdLnR5cGUgPSB0eXBlOwotICBzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0uZGVzYyA9IGRlc2M7Ci0gIHNhdmVkX3N0YWJzW3NhdmVkX3N0YWJzX2luZGV4XS52YWx1ZSA9IHZhbHVlOwotICBzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0uc3RyaW5nID0geHN0cmR1cCAoc3RyaW5nKTsKLSAgc2F2ZWRfc3RhYnNfaW5kZXggPSAoc2F2ZWRfc3RhYnNfaW5kZXggKyAxKSAlIFNBVkVfU1RBQlNfQ09VTlQ7Ci19Ci0KLS8qIFByb3ZpZGUgY29udGV4dCBmb3IgYW4gZXJyb3IuICAqLwotCi1zdGF0aWMgdm9pZAotc3RhYl9jb250ZXh0ICgpCi17Ci0gIGludCBpOwotCi0gIGZwcmludGYgKHN0ZGVyciwgXygiTGFzdCBzdGFicyBlbnRyaWVzIGJlZm9yZSBlcnJvcjpcbiIpKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAibl90eXBlIG5fZGVzYyBuX3ZhbHVlICBzdHJpbmdcbiIpOwotCi0gIGkgPSBzYXZlZF9zdGFic19pbmRleDsKLSAgZG8KLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc2F2ZWRfc3RhYiAqc3RhYnA7Ci0KLSAgICAgIHN0YWJwID0gc2F2ZWRfc3RhYnMgKyBpOwotICAgICAgaWYgKHN0YWJwLT5zdHJpbmcgIT0gTlVMTCkKLQl7Ci0JICBjb25zdCBjaGFyICpzOwotCi0JICBzID0gYmZkX2dldF9zdGFiX25hbWUgKHN0YWJwLT50eXBlKTsKLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIGZwcmludGYgKHN0ZGVyciwgIiUtNnMiLCBzKTsKLQkgIGVsc2UgaWYgKHN0YWJwLT50eXBlID09IDApCi0JICAgIGZwcmludGYgKHN0ZGVyciwgIkhkclN5bSIpOwotCSAgZWxzZQotCSAgICBmcHJpbnRmIChzdGRlcnIsICIlLTZkIiwgc3RhYnAtPnR5cGUpOwotCSAgZnByaW50ZiAoc3RkZXJyLCAiICUtNmQgIiwgc3RhYnAtPmRlc2MpOwotCSAgZnByaW50Zl92bWEgKHN0ZGVyciwgc3RhYnAtPnZhbHVlKTsKLQkgIGlmIChzdGFicC0+dHlwZSAhPSAwKQotCSAgICBmcHJpbnRmIChzdGRlcnIsICIgJXMiLCBzdGFicC0+c3RyaW5nKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0JfQotICAgICAgaSA9IChpICsgMSkgJSBTQVZFX1NUQUJTX0NPVU5UOwotICAgIH0KLSAgd2hpbGUgKGkgIT0gc2F2ZWRfc3RhYnNfaW5kZXgpOwotfQotCi0vKiBGcmVlIHRoZSBzYXZlZCBzdGFiIHN0cmluZ3MuICAqLwotCi1zdGF0aWMgdm9pZAotZnJlZV9zYXZlZF9zdGFicyAoKQotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgU0FWRV9TVEFCU19DT1VOVDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzYXZlZF9zdGFic1tpXS5zdHJpbmcgIT0gTlVMTCkKLQl7Ci0JICBmcmVlIChzYXZlZF9zdGFic1tpXS5zdHJpbmcpOwotCSAgc2F2ZWRfc3RhYnNbaV0uc3RyaW5nID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIHNhdmVkX3N0YWJzX2luZGV4ID0gMDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3JlYWRlbGYuYyBiL2JpbnV0aWxzL3JlYWRlbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBkM2Q1NS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZWFkZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1Njg3ICswLDAgQEAKLS8qIHJlYWRlbGYuYyAtLSBkaXNwbGF5IGNvbnRlbnRzIG9mIGFuIEVMRiBmb3JtYXQgZmlsZQotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBPcmlnaW5hbGx5IGRldmVsb3BlZCBieSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+Ci0gICBNb2RpZmljYXRpb25zIGJ5IE5pY2sgQ2xpZnRvbiA8bmlja2NAY3lnbnVzLmNvbT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLQotI2luY2x1ZGUgImVsZi9jb21tb24uaCIKLSNpbmNsdWRlICJlbGYvZXh0ZXJuYWwuaCIKLSNpbmNsdWRlICJlbGYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJlbGYvZHdhcmYyLmgiCi0KLS8qIFRoZSBmb2xsb3dpbmcgaGVhZGVycyB1c2UgdGhlIGVsZi9yZWxvYy1tYWNyb3MuaCBmaWxlIHRvCi0gICBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHJlbG9jYXRpb24gcmVjb2duaXRpb24gZnVuY3Rpb25zCi0gICBzdWNoIGFzIGVsZl9taXBzX3JlbG9jX3R5cGUoKSAgKi8KLQotI2RlZmluZSBSRUxPQ19NQUNST1NfR0VOX0ZVTkMKLQotI2luY2x1ZGUgImVsZi9pMzg2LmgiCi0jaW5jbHVkZSAiZWxmL3Y4NTAuaCIKLSNpbmNsdWRlICJlbGYvcHBjLmgiCi0jaW5jbHVkZSAiZWxmL21pcHMuaCIKLSNpbmNsdWRlICJlbGYvYWxwaGEuaCIKLSNpbmNsdWRlICJlbGYvYXJtLmgiCi0jaW5jbHVkZSAiZWxmL202OGsuaCIKLSNpbmNsdWRlICJlbGYvc3BhcmMuaCIKLSNpbmNsdWRlICJlbGYvbTMyci5oIgotI2luY2x1ZGUgImVsZi9kMTB2LmgiCi0jaW5jbHVkZSAiZWxmL2QzMHYuaCIKLSNpbmNsdWRlICJlbGYvc2guaCIKLSNpbmNsdWRlICJlbGYvbW4xMDIwMC5oIgotI2luY2x1ZGUgImVsZi9tbjEwMzAwLmgiCi0jaW5jbHVkZSAiZWxmL2hwcGEuaCIKLSNpbmNsdWRlICJlbGYvYXJjLmgiCi0jaW5jbHVkZSAiZWxmL2ZyMzAuaCIKLSNpbmNsdWRlICJlbGYvbWNvcmUuaCIKLQotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi1jaGFyICogICAgICAgICAgCXByb2dyYW1fbmFtZSA9ICJyZWFkZWxmIjsKLXVuc2lnbmVkIGludCAgICAJZHluYW1pY19hZGRyOwotdW5zaWduZWQgaW50ICAgIAlkeW5hbWljX3NpemU7Ci11bnNpZ25lZCBpbnQgICAgCXJlbGFfYWRkcjsKLXVuc2lnbmVkIGludCAgICAJcmVsYV9zaXplOwotY2hhciAqICAgICAgICAgIAlkeW5hbWljX3N0cmluZ3M7Ci1jaGFyICoJCQlzdHJpbmdfdGFibGU7Ci1FbGZfSW50ZXJuYWxfU3ltICogCWR5bmFtaWNfc3ltYm9sczsKLUVsZl9JbnRlcm5hbF9TeW1pbmZvICoJZHluYW1pY19zeW1pbmZvOwotdW5zaWduZWQgbG9uZyAgIAlkeW5hbWljX3N5bWluZm9fb2Zmc2V0OwotdW5zaWduZWQgaW50CQlkeW5hbWljX3N5bWluZm9fbmVudDsKLWNoYXIgICAgICAgICAgICAJcHJvZ3JhbV9pbnRlcnByZXRlciBbNjRdOwotaW50ICAgICAgICAgICAgIAlkeW5hbWljX2luZm9bRFRfSk1QUkVMICsgMV07Ci1pbnQgICAgICAgICAgICAgCXZlcnNpb25faW5mb1sxNl07Ci1pbnQgICAgICAgICAgICAgCWxvYWRhZGRyID0gMDsKLUVsZl9JbnRlcm5hbF9FaGRyICAgICAgIGVsZl9oZWFkZXI7Ci1FbGZfSW50ZXJuYWxfU2hkciAqICAgICBzZWN0aW9uX2hlYWRlcnM7Ci1FbGZfSW50ZXJuYWxfRHluICogICAgICBkeW5hbWljX3NlZ21lbnQ7Ci1pbnQgCQkJc2hvd19uYW1lOwotaW50IAkJCWRvX2R5bmFtaWM7Ci1pbnQgCQkJZG9fc3ltczsKLWludCAJCQlkb19yZWxvYzsKLWludCAJCQlkb19zZWN0aW9uczsKLWludCAJCQlkb19zZWdtZW50czsKLWludCAJCQlkb191c2luZ19keW5hbWljOwotaW50IAkJCWRvX2hlYWRlcjsKLWludCAJCQlkb19kdW1wOwotaW50IAkJCWRvX3ZlcnNpb247Ci1pbnQJCQlkb19oaXN0b2dyYW07Ci1pbnQJCQlkb19kZWJ1Z2dpbmc7Ci1pbnQgICAgICAgICAgICAgICAgICAgICBkb19kZWJ1Z19pbmZvOwotaW50ICAgICAgICAgICAgICAgICAgICAgZG9fZGVidWdfYWJicmV2czsKLWludCAgICAgICAgICAgICAgICAgICAgIGRvX2RlYnVnX2xpbmVzOwotaW50ICAgICAgICAgICAgICAgICAgICAgZG9fZGVidWdfcHVibmFtZXM7Ci1pbnQgICAgICAgICAgICAgICAgICAgICBkb19kZWJ1Z19hcmFuZ2VzOwotaW50CQkJYmluYXJ5X2NsYXNzOwotCi0vKiBBIGR5bmFtaWMgYXJyYXkgb2YgZmxhZ3MgaW5kaWNhdGluZyB3aGljaCBzZWN0aW9ucyByZXF1aXJlIGR1bXBpbmcuICAqLwotY2hhciAqCQkJZHVtcF9zZWN0cyA9IE5VTEw7Ci11bnNpZ25lZCBpbnQJCW51bV9kdW1wX3NlY3RzID0gMDsKLQotI2RlZmluZSBIRVhfRFVNUAkoMSA8PCAwKQotI2RlZmluZSBESVNBU1NfRFVNUAkoMSA8PCAxKQotI2RlZmluZSBERUJVR19EVU1QCSgxIDw8IDIpCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBkdW1iIGNvbXBpbGVycy4gICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyAoKiAgIGJ5dGVfZ2V0KSAgICAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfbWlwc19keW5hbWljX3R5cGUgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZyB0eXBlKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9keW5hbWljX3R5cGUgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIHR5cGUpKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZHVtcF9yZWxvY2F0aW9ucyAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgRWxmX0ludGVybmFsX1N5bSAqLCBjaGFyICopKTsKLXN0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X2ZpbGVfdHlwZSAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGVfdHlwZSkpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfbWFjaGluZV9uYW1lICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgZV9tYWNoaW5lKSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9tYWNoaW5lX2RhdGEgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBlX2RhdGEpKTsKLXN0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X21hY2hpbmVfZmxhZ3MgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkLCB1bnNpZ25lZCBlX21hY2hpbmUpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X21pcHNfc2VnbWVudF90eXBlICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgdHlwZSkpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfc2VnbWVudF90eXBlICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZyBwX3R5cGUpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X21pcHNfc2VjdGlvbl90eXBlX25hbWUgIFBBUkFNUyAoKHVuc2lnbmVkIGludCBzaF90eXBlKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9zZWN0aW9uX3R5cGVfbmFtZSAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgc2hfdHlwZSkpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfc3ltYm9sX2JpbmRpbmcgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgaW50IGJpbmRpbmcpKTsKLXN0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X3N5bWJvbF90eXBlICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCB0eXBlKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIHVzYWdlICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIHBhcnNlX2FyZ3MgICAgICAgICAgICAgICAgICBQQVJBTVMgKChpbnQgYXJnYywgY2hhciAqKiBhcmd2KSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3NfZmlsZV9oZWFkZXIgICAgICAgICBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3NfcHJvZ3JhbV9oZWFkZXJzICAgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19zZWN0aW9uX2hlYWRlcnMgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBkeW5hbWljX3NlZ21lbnRfbWlwc192YWwgICAgUEFSQU1TICgoRWxmX0ludGVybmFsX0R5biAqZW50cnkpKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19keW5hbWljX3NlZ21lbnQgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX3N5bWJvbF90YWJsZSAgICAgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3Nfc2VjdGlvbl9jb250ZW50cyAgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkICAgICAgICAgICAgICAgcHJvY2Vzc19maWxlICAgICAgICAgICAgICAgIFBBUkFNUyAoKGNoYXIgKiBmaWxlX25hbWUpKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19yZWxvY3MgICAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX3ZlcnNpb25fc2VjdGlvbnMgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF92ZXJfZmxhZ3MgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgZmxhZ3MpKTsKLXN0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X3N5bWJvbF9pbmRleF90eXBlICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCB0eXBlKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGdldF9zZWN0aW9uX2hlYWRlcnMgICAgICAgICBQQVJBTVMgKChGSUxFICogZmlsZSkpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBnZXRfZmlsZV9oZWFkZXIgICAgICAgICAgICAgUEFSQU1TICgoRklMRSAqIGZpbGUpKTsKLXN0YXRpYyBFbGZfSW50ZXJuYWxfU3ltICogZ2V0X2VsZl9zeW1ib2xzICAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKiBmaWxlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBudW1iZXIpKTsKLXN0YXRpYyBpbnQgKiAgICAgICAgICAgICAgZ2V0X2R5bmFtaWNfZGF0YSAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKiBmaWxlLCB1bnNpZ25lZCBpbnQgbnVtYmVyKSk7Ci0jaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQotc3RhdGljIGludCAJICAgICAgICAgIGRpc2Fzc2VtYmxlX3NlY3Rpb24gICAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIEZJTEUgKikpOwotI2VuZGlmCi1zdGF0aWMgaW50IAkgICAgICAgICAgZHVtcF9zZWN0aW9uICAgICAgICAgICAgICAgIFBBUkFNUyAoKEVsZjMyX0ludGVybmFsX1NoZHIgKiwgRklMRSAqKSk7Ci1zdGF0aWMgaW50IAkgICAgICAgICAgZGlzcGxheV9kZWJ1Z19zZWN0aW9uICAgICAgIFBBUkFNUyAoKEVsZjMyX0ludGVybmFsX1NoZHIgKiwgRklMRSAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGRpc3BsYXlfZGVidWdfaW5mbyAgICAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIHVuc2lnbmVkIGNoYXIgKiwgRklMRSAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIHVuc2lnbmVkIGNoYXIgKiwgRklMRSAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGRpc3BsYXlfZGVidWdfbGluZXMgICAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIHVuc2lnbmVkIGNoYXIgKiwgRklMRSAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGRpc3BsYXlfZGVidWdfYWJicmV2ICAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIHVuc2lnbmVkIGNoYXIgKiwgRklMRSAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGRpc3BsYXlfZGVidWdfYXJhbmdlcyAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIHVuc2lnbmVkIGNoYXIgKiwgRklMRSAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqICAgIHByb2Nlc3NfYWJicmV2X3NlY3Rpb24gICAgICBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgICAgICByZWFkX2xlYjEyOCAgICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBpbnQgKiwgaW50KSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3NfZXh0ZW5kZWRfbGluZV9vcCAgICBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICByZXNldF9zdGF0ZV9tYWNoaW5lICAgICAgICAgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9UQUdfbmFtZSAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9BVF9uYW1lICAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9GT1JNX25hbWUgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGZyZWVfYWJicmV2cyAgICAgICAgICAgICAgICBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGFkZF9hYmJyZXYgICAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyB2b2lkICAgICAgICAgICAgICAgYWRkX2FiYnJldl9hdHRyICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICogICAgcmVhZF9hbmRfZGlzcGxheV9hdHRyICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKiAgICBkaXNwbGF5X2Jsb2NrICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGRlY29kZV9sb2NhdGlvbl9leHByZXNzaW9uICBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQJCSAgcmVxdWVzdF9kdW1wICAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgY2hhcikpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfZWxmX2NsYXNzICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhcikpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfZGF0YV9lbmNvZGluZyAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhcikpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfb3NhYmlfbmFtZSAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhcikpOwotCi10eXBlZGVmIGludCBFbGYzMl9Xb3JkOwotCi0jZGVmaW5lIFNFQ1RJT05fTkFNRShYKSAJKHN0cmluZ190YWJsZSArIChYKS0+c2hfbmFtZSkKLQotI2RlZmluZSBEVF9WRVJTSU9OVEFHSURYKHRhZykJKERUX1ZFUk5FRUROVU0gLSAodGFnKSkJLyogUmV2ZXJzZSBvcmRlciEgKi8KLQotI2RlZmluZSBCWVRFX0dFVChmaWVsZCkgCWJ5dGVfZ2V0IChmaWVsZCwgc2l6ZW9mIChmaWVsZCkpCi0KLSNkZWZpbmUgTlVNX0VMRU0oYXJyYXkpIAkoc2l6ZW9mIChhcnJheSkgLyBzaXplb2YgKChhcnJheSlbMF0pKQotCi0jZGVmaW5lIEdFVF9EQVRBX0FMTE9DKG9mZnNldCwgc2l6ZSwgdmFyLCB0eXBlLCByZWFzb24pCQkJXAotICBpZiAoZnNlZWsgKGZpbGUsIG9mZnNldCwgU0VFS19TRVQpKQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBlcnJvciAoXygiVW5hYmxlIHRvIHNlZWsgdG8gc3RhcnQgb2YgJXMgYXQgJXhcbiIpLCByZWFzb24sIG9mZnNldCk7IFwKLSAgICAgIHJldHVybiAwOwkJCQkJCQkJXAotICAgIH0JCQkJCQkJCQlcCi0JCQkJCQkJCQlcCi0gIHZhciA9ICh0eXBlKSBtYWxsb2MgKHNpemUpOwkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgaWYgKHZhciA9PSBOVUxMKQkJCQkJCQlcCi0gICAgewkJCQkJCQkJCVwKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgJWQgYnl0ZXMgZm9yICVzXG4iKSwgc2l6ZSwgcmVhc29uKTsgXAotICAgICAgcmV0dXJuIDA7CQkJCQkJCQlcCi0gICAgfSAJCQkJCQkJCQlcCi0gCQkJCQkJCQkJXAotICBpZiAoZnJlYWQgKHZhciwgc2l6ZSwgMSwgZmlsZSkgIT0gMSkgCQkJCQlcCi0gICAgeyAJCQkJCQkJCQlcCi0gICAgICBlcnJvciAoXygiVW5hYmxlIHRvIHJlYWQgaW4gJWQgYnl0ZXMgb2YgJXNcbiIpLCBzaXplLCByZWFzb24pOyAJXAotICAgICAgZnJlZSAodmFyKTsgCQkJCQkJCVwKLSAgICAgIHZhciA9IE5VTEw7CQkJCQkJCVwKLSAgICAgIHJldHVybiAwOyAJCQkJCQkJXAotICAgIH0KLQotCi0jZGVmaW5lIEdFVF9EQVRBKG9mZnNldCwgdmFyLCByZWFzb24pIAkJCQkJXAotICBpZiAoZnNlZWsgKGZpbGUsIG9mZnNldCwgU0VFS19TRVQpKQkJCQkJXAotICAgIHsgCQkJCQkJCQkJXAotICAgICAgZXJyb3IgKF8oIlVuYWJsZSB0byBzZWVrIHRvICV4IGZvciAlc1xuIiksIG9mZnNldCwgcmVhc29uKTsJXAotICAgICAgcmV0dXJuIDA7CQkJCQkJCQlcCi0gICAgfQkJCQkJCQkJCVwKLSAgZWxzZSBpZiAoZnJlYWQgKCYgdmFyLCBzaXplb2YgKHZhciksIDEsIGZpbGUpICE9IDEpCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBlcnJvciAoXygiVW5hYmxlIHRvIHJlYWQgZGF0YSBhdCAleCBmb3IgJXNcbiIpLCBvZmZzZXQsIHJlYXNvbik7CVwKLSAgICAgIHJldHVybiAwOwkJCQkJCQkJXAotICAgIH0KLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RhdGljIHZvaWQKLWVycm9yIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogRXJyb3I6ICIpLCBwcm9ncmFtX25hbWUpOwotICB2YV9zdGFydCAoYXJncywgbWVzc2FnZSk7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi13YXJuIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogV2FybmluZzogIiksIHByb2dyYW1fbmFtZSk7Ci0gIHZhX3N0YXJ0IChhcmdzLCBtZXNzYWdlKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHJldHVybjsKLX0KLSNlbHNlCi1zdGF0aWMgdm9pZAotZXJyb3IgKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLXsKLSAgY2hhciAqIG1lc3NhZ2U7Ci0gIHZhX2xpc3QgYXJnczsKLQotICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBFcnJvcjogIiksIHByb2dyYW1fbmFtZSk7Ci0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgbWVzc2FnZSA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXdhcm4gKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLXsKLSAgY2hhciAqIG1lc3NhZ2U7Ci0gIHZhX2xpc3QgYXJnczsKLQotICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBXYXJuaW5nOiAiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBtZXNzYWdlID0gdmFfYXJnIChhcmdzLCBjaGFyICopOwotICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgcmV0dXJuOwotfQotI2VuZGlmCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGludAotYnl0ZV9nZXRfbGl0dGxlX2VuZGlhbiAoZmllbGQsIHNpemUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKiBmaWVsZDsKLSAgICAgaW50ICAgICAgICAgICAgIHNpemU7Ci17Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgcmV0dXJuICogZmllbGQ7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICByZXR1cm4gICgodW5zaWduZWQgaW50KSAoZmllbGQgWzBdKSkKLQl8ICAgICgoKHVuc2lnbmVkIGludCkgKGZpZWxkIFsxXSkpIDw8IDgpOwotCi0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuICAoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbMF0pKQotCXwgICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFsxXSkpIDw8IDgpCi0JfCAgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzJdKSkgPDwgMTYpCi0JfCAgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzNdKSkgPDwgMjQpOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yIChfKCJVbmhhbmRsZWQgZGF0YSBsZW5ndGg6ICVkXG4iKSwgc2l6ZSk7Ci0gICAgICBhYm9ydCgpOwotICAgIH0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50Ci1ieXRlX2dldF9iaWdfZW5kaWFuIChmaWVsZCwgc2l6ZSkKLSAgICAgdW5zaWduZWQgY2hhciAqIGZpZWxkOwotICAgICBpbnQgICAgICAgICAgICAgc2l6ZTsKLXsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICByZXR1cm4gKiBmaWVsZDsKLQotICAgIGNhc2UgMjoKLSAgICAgIHJldHVybiAoKHVuc2lnbmVkIGludCkgKGZpZWxkIFsxXSkpIHwgKCgoaW50KSAoZmllbGQgWzBdKSkgPDwgOCk7Ci0KLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzNdKSkKLQl8ICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFsyXSkpIDw8IDgpCi0JfCAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbMV0pKSA8PCAxNikKLQl8ICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFswXSkpIDw8IDI0KTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvciAoXygiVW5oYW5kbGVkIGRhdGEgbGVuZ3RoOiAlZFxuIiksIHNpemUpOwotICAgICAgYWJvcnQoKTsKLSAgICB9Ci19Ci0KLQotLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIHJlbG9jYXRpb24gZGF0YQotICAgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuICAqLwotc3RhdGljIGludAotZHVtcF9yZWxvY2F0aW9ucyAoZmlsZSwgcmVsX29mZnNldCwgcmVsX3NpemUsIHN5bXRhYiwgc3RydGFiKQotICAgICBGSUxFICogICAgICAgICAgICAgICAgIGZpbGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgcmVsX29mZnNldDsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICByZWxfc2l6ZTsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICBzeW10YWI7Ci0gICAgIGNoYXIgKiAgICAgICAgICAgICAgICAgc3RydGFiOwotewotICB1bnNpZ25lZCBpbnQgICAgICAgIGk7Ci0gIGludCAgICAgICAgICAgICAgICAgaXNfcmVsYTsKLSAgRWxmX0ludGVybmFsX1JlbCAqICByZWxzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqIHJlbGFzOwotCi0KLSAgLyogQ29tcHV0ZSBudW1iZXIgb2YgcmVsb2NhdGlvbnMgYW5kIHJlYWQgdGhlbSBpbi4gICovCi0gIHN3aXRjaCAoZWxmX2hlYWRlci5lX21hY2hpbmUpCi0gICAgewotICAgICAgLyogVGFyZ2V0cyB0aGF0IHVzZSBSRUwgcmVsb2NhdGlvbnMuICAqLwotICAgIGNhc2UgRU1fQVJNOgotICAgIGNhc2UgRU1fMzg2OgotICAgIGNhc2UgRU1fNDg2OgotICAgIGNhc2UgRU1fQ1lHTlVTX00zMlI6Ci0gICAgY2FzZSBFTV9DWUdOVVNfRDEwVjoKLSAgICBjYXNlIEVNX01JUFM6Ci0gICAgY2FzZSBFTV9NSVBTX1JTNF9CRToKLSAgICAgIHsKLQlFbGYzMl9FeHRlcm5hbF9SZWwgKiBlcmVsczsKLQotCUdFVF9EQVRBX0FMTE9DIChyZWxfb2Zmc2V0LCByZWxfc2l6ZSwgZXJlbHMsCi0JCQlFbGYzMl9FeHRlcm5hbF9SZWwgKiwgInJlbG9jcyIpOwotCi0JcmVsX3NpemUgPSByZWxfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQotCXJlbHMgPSAoRWxmX0ludGVybmFsX1JlbCAqKSBtYWxsb2MgKHJlbF9zaXplICoKLQkJCQkJICAgIHNpemVvZiAoRWxmX0ludGVybmFsX1JlbCkpOwotCi0JZm9yIChpID0gMDsgaSA8IHJlbF9zaXplOyBpKyspCi0JICB7Ci0JICAgIHJlbHNbaV0ucl9vZmZzZXQgPSBCWVRFX0dFVCAoZXJlbHNbaV0ucl9vZmZzZXQpOwotCSAgICByZWxzW2ldLnJfaW5mbyAgID0gQllURV9HRVQgKGVyZWxzW2ldLnJfaW5mbyk7Ci0JICB9Ci0KLQlmcmVlIChlcmVscyk7Ci0KLQlpc19yZWxhID0gMDsKLQlyZWxhcyAgID0gKEVsZl9JbnRlcm5hbF9SZWxhICopIHJlbHM7Ci0gICAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgICAgIC8qIFRhcmdldHMgdGhhdCB1c2UgUkVMQSByZWxvY2F0aW9ucy4gICovCi0gICAgY2FzZSBFTV82OEs6Ci0gICAgY2FzZSBFTV9TUEFSQzoKLSAgICBjYXNlIEVNX1BQQzoKLSAgICBjYXNlIEVNX0NZR05VU19WODUwOgotICAgIGNhc2UgRU1fQ1lHTlVTX0QzMFY6Ci0gICAgY2FzZSBFTV9DWUdOVVNfTU4xMDIwMDoKLSAgICBjYXNlIEVNX0NZR05VU19NTjEwMzAwOgotICAgIGNhc2UgRU1fQ1lHTlVTX0ZSMzA6Ci0gICAgY2FzZSBFTV9TSDoKLSAgICBjYXNlIEVNX0FMUEhBOgotICAgIGNhc2UgRU1fTUNPUkU6Ci0gICAgICB7Ci0JRWxmMzJfRXh0ZXJuYWxfUmVsYSAqIGVyZWxhczsKLQotCUdFVF9EQVRBX0FMTE9DIChyZWxfb2Zmc2V0LCByZWxfc2l6ZSwgZXJlbGFzLAotCQkJRWxmMzJfRXh0ZXJuYWxfUmVsYSAqLCAicmVsb2NzIik7Ci0KLQlyZWxfc2l6ZSA9IHJlbF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotCXJlbGFzID0gKEVsZl9JbnRlcm5hbF9SZWxhICopIG1hbGxvYyAocmVsX3NpemUgKgotCQkJCQkgICAgICBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWxhKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmVsX3NpemU7IGkrKykKLQkgIHsKLQkgICAgcmVsYXNbaV0ucl9vZmZzZXQgPSBCWVRFX0dFVCAoZXJlbGFzW2ldLnJfb2Zmc2V0KTsKLQkgICAgcmVsYXNbaV0ucl9pbmZvICAgPSBCWVRFX0dFVCAoZXJlbGFzW2ldLnJfaW5mbyk7Ci0JICAgIHJlbGFzW2ldLnJfYWRkZW5kID0gQllURV9HRVQgKGVyZWxhc1tpXS5yX2FkZGVuZCk7Ci0JICB9Ci0KLQlmcmVlIChlcmVsYXMpOwotCi0JaXNfcmVsYSA9IDE7Ci0JcmVscyAgICA9IChFbGZfSW50ZXJuYWxfUmVsICopIHJlbGFzOwotICAgICAgfQotICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHdhcm4gKF8oIkRvbid0IGtub3cgYWJvdXQgcmVsb2NhdGlvbnMgb24gdGhpcyBtYWNoaW5lIGFyY2hpdGVjdHVyZVxuIikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChpc19yZWxhKQotICAgIHByaW50ZgotICAgICAgKF8oIiAgT2Zmc2V0ICAgIEluZm8gIFR5cGUgICAgICAgICAgICBTeW1ib2wncyBWYWx1ZSAgU3ltYm9sJ3MgTmFtZSAgICAgICAgICBBZGRlbmRcbiIpKTsKLSAgZWxzZQotICAgIHByaW50ZgotICAgICAgKF8oIiAgT2Zmc2V0ICAgIEluZm8gIFR5cGUgICAgICAgICAgICBTeW1ib2wncyBWYWx1ZSAgU3ltYm9sJ3MgTmFtZVxuIikpOwotCi0gIGZvciAoaSA9IDA7IGkgPCByZWxfc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKiAgcnR5cGU7Ci0gICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaW5mbzsKLSAgICAgIGludCAgICAgICAgICAgc3ltdGFiX2luZGV4OwotCi0gICAgICBpZiAoaXNfcmVsYSkKLQl7Ci0JICBvZmZzZXQgPSByZWxhcyBbaV0ucl9vZmZzZXQ7Ci0JICBpbmZvICAgPSByZWxhcyBbaV0ucl9pbmZvOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvZmZzZXQgPSByZWxzIFtpXS5yX29mZnNldDsKLQkgIGluZm8gICA9IHJlbHMgW2ldLnJfaW5mbzsKLQl9Ci0KLSAgICAgIHByaW50ZiAoIiAgJTguOGx4ICAlNS41bHggIiwgb2Zmc2V0LCBpbmZvKTsKLQotICAgICAgc3dpdGNoIChlbGZfaGVhZGVyLmVfbWFjaGluZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIHJ0eXBlID0gTlVMTDsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfTTMyUjoKLQkgIHJ0eXBlID0gZWxmX20zMnJfcmVsb2NfdHlwZSAoRUxGMzJfUl9UWVBFIChpbmZvKSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fMzg2OgotCWNhc2UgRU1fNDg2OgotCSAgcnR5cGUgPSBlbGZfaTM4Nl9yZWxvY190eXBlIChFTEYzMl9SX1RZUEUgKGluZm8pKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV82OEs6Ci0JICBydHlwZSA9IGVsZl9tNjhrX3JlbG9jX3R5cGUgKEVMRjMyX1JfVFlQRSAoaW5mbykpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX1NQQVJDOgotCSAgcnR5cGUgPSBlbGZfc3BhcmNfcmVsb2NfdHlwZSAoRUxGMzJfUl9UWVBFIChpbmZvKSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX1Y4NTA6Ci0JICBydHlwZSA9IHY4NTBfcmVsb2NfdHlwZSAoRUxGMzJfUl9UWVBFIChpbmZvKSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX0QxMFY6Ci0JICBydHlwZSA9IGVsZl9kMTB2X3JlbG9jX3R5cGUgKEVMRjMyX1JfVFlQRSAoaW5mbykpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19EMzBWOgotCSAgcnR5cGUgPSBlbGZfZDMwdl9yZWxvY190eXBlIChFTEYzMl9SX1RZUEUgKGluZm8pKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9TSDoKLQkgIHJ0eXBlID0gZWxmX3NoX3JlbG9jX3R5cGUgKEVMRjMyX1JfVFlQRSAoaW5mbykpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19NTjEwMzAwOgotCSAgcnR5cGUgPSBlbGZfbW4xMDMwMF9yZWxvY190eXBlIChFTEYzMl9SX1RZUEUgKGluZm8pKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfTU4xMDIwMDoKLQkgIHJ0eXBlID0gZWxmX21uMTAyMDBfcmVsb2NfdHlwZSAoRUxGMzJfUl9UWVBFIChpbmZvKSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX0ZSMzA6Ci0JICBydHlwZSA9IGVsZl9mcjMwX3JlbG9jX3R5cGUgKEVMRjMyX1JfVFlQRSAoaW5mbykpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX01DT1JFOgotCSAgcnR5cGUgPSBlbGZfbWNvcmVfcmVsb2NfdHlwZSAoRUxGMzJfUl9UWVBFIChpbmZvKSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fUFBDOgotCSAgcnR5cGUgPSBlbGZfcHBjX3JlbG9jX3R5cGUgKEVMRjMyX1JfVFlQRSAoaW5mbykpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX01JUFM6Ci0JY2FzZSBFTV9NSVBTX1JTNF9CRToKLQkgIHJ0eXBlID0gZWxmX21pcHNfcmVsb2NfdHlwZSAoRUxGMzJfUl9UWVBFIChpbmZvKSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQUxQSEE6Ci0JICBydHlwZSA9IGVsZl9hbHBoYV9yZWxvY190eXBlIChFTEYzMl9SX1RZUEUgKGluZm8pKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9BUk06Ci0JICBydHlwZSA9IGVsZl9hcm1fcmVsb2NfdHlwZSAoRUxGMzJfUl9UWVBFIChpbmZvKSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX0FSQzoKLQkgIHJ0eXBlID0gZWxmX2FyY19yZWxvY190eXBlIChFTEYzMl9SX1RZUEUgKGluZm8pKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9QQVJJU0M6Ci0JICBydHlwZSA9IGVsZjMyX2hwcGFfcmVsb2NfdHlwZSAoRUxGMzJfUl9UWVBFIChpbmZvKSk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChydHlwZSA9PSBOVUxMKQotCXByaW50ZiAoXygidW5yZWNvZ25pc2VkOiAlLTdseCIpLCBFTEYzMl9SX1RZUEUgKGluZm8pKTsKLSAgICAgIGVsc2UKLQlwcmludGYgKCIlLTIxLjIxcyIsIHJ0eXBlKTsKLQotICAgICAgc3ltdGFiX2luZGV4ID0gRUxGMzJfUl9TWU0gKGluZm8pOwotCi0gICAgICBpZiAoc3ltdGFiX2luZGV4ICYmIHN5bXRhYiAhPSBOVUxMKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gKiBwc3ltOwotCi0JICBwc3ltID0gc3ltdGFiICsgc3ltdGFiX2luZGV4OwotCi0JICBwcmludGYgKCIgJTA4bHggICIsICh1bnNpZ25lZCBsb25nKSBwc3ltLT5zdF92YWx1ZSk7Ci0KLQkgIGlmIChwc3ltLT5zdF9uYW1lID09IDApCi0JICAgIHByaW50ZiAoIiUtMjUuMjVzIiwKLQkJICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbl9oZWFkZXJzICsgcHN5bS0+c3Rfc2huZHgpKTsKLQkgIGVsc2UgaWYgKHN0cnRhYiA9PSBOVUxMKQotCSAgICBwcmludGYgKF8oIjxzdHJpbmcgdGFibGUgaW5kZXggJTNsZD4iKSwgcHN5bS0+c3RfbmFtZSk7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoIiUtMjUuMjVzIiwgc3RydGFiICsgcHN5bS0+c3RfbmFtZSk7Ci0KLQkgIGlmIChpc19yZWxhKQotCSAgICBwcmludGYgKCIgKyAlbHgiLCAodW5zaWduZWQgbG9uZykgcmVsYXMgW2ldLnJfYWRkZW5kKTsKLQl9Ci0KLSAgICAgIHB1dGNoYXIgKCdcbicpOwotICAgIH0KLQotICBmcmVlIChyZWxhcyk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9taXBzX2R5bmFtaWNfdHlwZSAodHlwZSkKLSAgICAgdW5zaWduZWQgbG9uZyB0eXBlOwotewotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgRFRfTUlQU19STERfVkVSU0lPTjogcmV0dXJuICJNSVBTX1JMRF9WRVJTSU9OIjsKLSAgICBjYXNlIERUX01JUFNfVElNRV9TVEFNUDogcmV0dXJuICJNSVBTX1RJTUVfU1RBTVAiOwotICAgIGNhc2UgRFRfTUlQU19JQ0hFQ0tTVU06IHJldHVybiAiTUlQU19JQ0hFQ0tTVU0iOwotICAgIGNhc2UgRFRfTUlQU19JVkVSU0lPTjogcmV0dXJuICJNSVBTX0lWRVJTSU9OIjsKLSAgICBjYXNlIERUX01JUFNfRkxBR1M6IHJldHVybiAiTUlQU19GTEFHUyI7Ci0gICAgY2FzZSBEVF9NSVBTX0JBU0VfQUREUkVTUzogcmV0dXJuICJNSVBTX0JBU0VfQUREUkVTUyI7Ci0gICAgY2FzZSBEVF9NSVBTX01TWU06IHJldHVybiAiTUlQU19NU1lNIjsKLSAgICBjYXNlIERUX01JUFNfQ09ORkxJQ1Q6IHJldHVybiAiTUlQU19DT05GTElDVCI7Ci0gICAgY2FzZSBEVF9NSVBTX0xJQkxJU1Q6IHJldHVybiAiTUlQU19MSUJMSVNUIjsKLSAgICBjYXNlIERUX01JUFNfTE9DQUxfR09UTk86IHJldHVybiAiTUlQU19MT0NBTF9HT1ROTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUTk86IHJldHVybiAiTUlQU19DT05GTElDVE5PIjsKLSAgICBjYXNlIERUX01JUFNfTElCTElTVE5POiByZXR1cm4gIk1JUFNfTElCTElTVE5PIjsKLSAgICBjYXNlIERUX01JUFNfU1lNVEFCTk86IHJldHVybiAiTUlQU19TWU1UQUJOTyI7Ci0gICAgY2FzZSBEVF9NSVBTX1VOUkVGRVhUTk86IHJldHVybiAiTUlQU19VTlJFRkVYVE5PIjsKLSAgICBjYXNlIERUX01JUFNfR09UU1lNOiByZXR1cm4gIk1JUFNfR09UU1lNIjsKLSAgICBjYXNlIERUX01JUFNfSElQQUdFTk86IHJldHVybiAiTUlQU19ISVBBR0VOTyI7Ci0gICAgY2FzZSBEVF9NSVBTX1JMRF9NQVA6IHJldHVybiAiTUlQU19STERfTUFQIjsKLSAgICBjYXNlIERUX01JUFNfREVMVEFfQ0xBU1M6IHJldHVybiAiTUlQU19ERUxUQV9DTEFTUyI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0NMQVNTX05POiByZXR1cm4gIk1JUFNfREVMVEFfQ0xBU1NfTk8iOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9JTlNUQU5DRTogcmV0dXJuICJNSVBTX0RFTFRBX0lOU1RBTkNFIjsKLSAgICBjYXNlIERUX01JUFNfREVMVEFfSU5TVEFOQ0VfTk86IHJldHVybiAiTUlQU19ERUxUQV9JTlNUQU5DRV9OTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX1JFTE9DOiByZXR1cm4gIk1JUFNfREVMVEFfUkVMT0MiOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9SRUxPQ19OTzogcmV0dXJuICJNSVBTX0RFTFRBX1JFTE9DX05PIjsKLSAgICBjYXNlIERUX01JUFNfREVMVEFfU1lNOiByZXR1cm4gIk1JUFNfREVMVEFfU1lNIjsKLSAgICBjYXNlIERUX01JUFNfREVMVEFfU1lNX05POiByZXR1cm4gIk1JUFNfREVMVEFfU1lNX05PIjsKLSAgICBjYXNlIERUX01JUFNfREVMVEFfQ0xBU1NTWU06IHJldHVybiAiTUlQU19ERUxUQV9DTEFTU1NZTSI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0NMQVNTU1lNX05POiByZXR1cm4gIk1JUFNfREVMVEFfQ0xBU1NTWU1fTk8iOwotICAgIGNhc2UgRFRfTUlQU19DWFhfRkxBR1M6IHJldHVybiAiTUlQU19DWFhfRkxBR1MiOwotICAgIGNhc2UgRFRfTUlQU19QSVhJRV9JTklUOiByZXR1cm4gIk1JUFNfUElYSUVfSU5JVCI7Ci0gICAgY2FzZSBEVF9NSVBTX1NZTUJPTF9MSUI6IHJldHVybiAiTUlQU19TWU1CT0xfTElCIjsKLSAgICBjYXNlIERUX01JUFNfTE9DQUxQQUdFX0dPVElEWDogcmV0dXJuICJNSVBTX0xPQ0FMUEFHRV9HT1RJRFgiOwotICAgIGNhc2UgRFRfTUlQU19MT0NBTF9HT1RJRFg6IHJldHVybiAiTUlQU19MT0NBTF9HT1RJRFgiOwotICAgIGNhc2UgRFRfTUlQU19ISURERU5fR09USURYOiByZXR1cm4gIk1JUFNfSElEREVOX0dPVElEWCI7Ci0gICAgY2FzZSBEVF9NSVBTX1BST1RFQ1RFRF9HT1RJRFg6IHJldHVybiAiTUlQU19QUk9URUNURURfR09USURYIjsKLSAgICBjYXNlIERUX01JUFNfT1BUSU9OUzogcmV0dXJuICJNSVBTX09QVElPTlMiOwotICAgIGNhc2UgRFRfTUlQU19JTlRFUkZBQ0U6IHJldHVybiAiTUlQU19JTlRFUkZBQ0UiOwotICAgIGNhc2UgRFRfTUlQU19EWU5TVFJfQUxJR046IHJldHVybiAiTUlQU19EWU5TVFJfQUxJR04iOwotICAgIGNhc2UgRFRfTUlQU19JTlRFUkZBQ0VfU0laRTogcmV0dXJuICJNSVBTX0lOVEVSRkFDRV9TSVpFIjsKLSAgICBjYXNlIERUX01JUFNfUkxEX1RFWFRfUkVTT0xWRV9BRERSOiByZXR1cm4gIk1JUFNfUkxEX1RFWFRfUkVTT0xWRV9BRERSIjsKLSAgICBjYXNlIERUX01JUFNfUEVSRl9TVUZGSVg6IHJldHVybiAiTUlQU19QRVJGX1NVRkZJWCI7Ci0gICAgY2FzZSBEVF9NSVBTX0NPTVBBQ1RfU0laRTogcmV0dXJuICJNSVBTX0NPTVBBQ1RfU0laRSI7Ci0gICAgY2FzZSBEVF9NSVBTX0dQX1ZBTFVFOiByZXR1cm4gIk1JUFNfR1BfVkFMVUUiOwotICAgIGNhc2UgRFRfTUlQU19BVVhfRFlOQU1JQzogcmV0dXJuICJNSVBTX0FVWF9EWU5BTUlDIjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfZHluYW1pY190eXBlICh0eXBlKQotICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgRFRfTlVMTDoJcmV0dXJuICJOVUxMIjsKLSAgICBjYXNlIERUX05FRURFRDoJcmV0dXJuICJORUVERUQiOwotICAgIGNhc2UgRFRfUExUUkVMU1o6CXJldHVybiAiUExUUkVMU1oiOwotICAgIGNhc2UgRFRfUExUR09UOglyZXR1cm4gIlBMVEdPVCI7Ci0gICAgY2FzZSBEVF9IQVNIOglyZXR1cm4gIkhBU0giOwotICAgIGNhc2UgRFRfU1RSVEFCOglyZXR1cm4gIlNUUlRBQiI7Ci0gICAgY2FzZSBEVF9TWU1UQUI6CXJldHVybiAiU1lNVEFCIjsKLSAgICBjYXNlIERUX1JFTEE6CXJldHVybiAiUkVMQSI7Ci0gICAgY2FzZSBEVF9SRUxBU1o6CXJldHVybiAiUkVMQVNaIjsKLSAgICBjYXNlIERUX1JFTEFFTlQ6CXJldHVybiAiUkVMQUVOVCI7Ci0gICAgY2FzZSBEVF9TVFJTWjoJcmV0dXJuICJTVFJTWiI7Ci0gICAgY2FzZSBEVF9TWU1FTlQ6CXJldHVybiAiU1lNRU5UIjsKLSAgICBjYXNlIERUX0lOSVQ6CXJldHVybiAiSU5JVCI7Ci0gICAgY2FzZSBEVF9GSU5JOglyZXR1cm4gIkZJTkkiOwotICAgIGNhc2UgRFRfU09OQU1FOglyZXR1cm4gIlNPTkFNRSI7Ci0gICAgY2FzZSBEVF9SUEFUSDoJcmV0dXJuICJSUEFUSCI7Ci0gICAgY2FzZSBEVF9TWU1CT0xJQzoJcmV0dXJuICJTWU1CT0xJQyI7Ci0gICAgY2FzZSBEVF9SRUw6CXJldHVybiAiUkVMIjsKLSAgICBjYXNlIERUX1JFTFNaOglyZXR1cm4gIlJFTFNaIjsKLSAgICBjYXNlIERUX1JFTEVOVDoJcmV0dXJuICJSRUxFTlQiOwotICAgIGNhc2UgRFRfUExUUkVMOglyZXR1cm4gIlBMVFJFTCI7Ci0gICAgY2FzZSBEVF9ERUJVRzoJcmV0dXJuICJERUJVRyI7Ci0gICAgY2FzZSBEVF9URVhUUkVMOglyZXR1cm4gIlRFWFRSRUwiOwotICAgIGNhc2UgRFRfSk1QUkVMOglyZXR1cm4gIkpNUFJFTCI7Ci0gICAgY2FzZSBEVF9CSU5EX05PVzogICByZXR1cm4gIkJJTkRfTk9XIjsKLSAgICBjYXNlIERUX0lOSVRfQVJSQVk6IHJldHVybiAiSU5JVF9BUlJBWSI7Ci0gICAgY2FzZSBEVF9GSU5JX0FSUkFZOiByZXR1cm4gIkZJTklfQVJSQVkiOwotICAgIGNhc2UgRFRfSU5JVF9BUlJBWVNaOiByZXR1cm4gIklOSVRfQVJSQVlTWiI7Ci0gICAgY2FzZSBEVF9GSU5JX0FSUkFZU1o6IHJldHVybiAiRklOSV9BUlJBWVNaIjsKLSAgICAgIAotICAgIGNhc2UgRFRfUExUUEFEU1o6CXJldHVybiAiUExUUEFEU1oiOwotICAgIGNhc2UgRFRfTU9WRUVOVDoJcmV0dXJuICJNT1ZFRU5UIjsKLSAgICBjYXNlIERUX01PVkVTWjoJcmV0dXJuICJNT1ZFU1oiOwotICAgIGNhc2UgRFRfRkVBVFVSRV8xOglyZXR1cm4gIkZFQVRVUkVfMSI7Ci0gICAgY2FzZSBEVF9QT1NGTEFHXzE6CXJldHVybiAiUE9TRkxBR18xIjsKLSAgICBjYXNlIERUX1NZTUlOU1o6CXJldHVybiAiU1lNSU5TWiI7Ci0gICAgY2FzZSBEVF9TWU1JTkVOVDoJcmV0dXJuICJTWU1JTkVOVCI7IC8qIGFrYSBWQUxSTkdISSAqLwotICAgICAgCi0gICAgY2FzZSBEVF9BRERSUk5HTE86ICByZXR1cm4gIkFERFJSTkdMTyI7Ci0gICAgY2FzZSBEVF9TWU1JTkZPOglyZXR1cm4gIlNZTUlORk8iOyAvKiBha2EgQUREUlJOR0hJICovCi0gICAgICAKLSAgICBjYXNlIERUX1ZFUlNZTToJcmV0dXJuICJWRVJTWU0iOwotICAgICAgCi0gICAgY2FzZSBEVF9SRUxBQ09VTlQ6CXJldHVybiAiUkVMQUNPVU5UIjsKLSAgICBjYXNlIERUX1JFTENPVU5UOglyZXR1cm4gIlJFTENPVU5UIjsKLSAgICBjYXNlIERUX0ZMQUdTXzE6CXJldHVybiAiRkxBR1NfMSI7Ci0gICAgY2FzZSBEVF9WRVJERUY6CXJldHVybiAiVkVSREVGIjsKLSAgICBjYXNlIERUX1ZFUkRFRk5VTToJcmV0dXJuICJWRVJERUZOVU0iOwotICAgIGNhc2UgRFRfVkVSTkVFRDoJcmV0dXJuICJWRVJORUVEIjsKLSAgICBjYXNlIERUX1ZFUk5FRUROVU06CXJldHVybiAiVkVSTkVFRE5VTSI7Ci0gICAgICAKLSAgICBjYXNlIERUX0FVWElMSUFSWToJcmV0dXJuICJBVVhJTEFSWSI7Ci0gICAgY2FzZSBEVF9VU0VEOglyZXR1cm4gIlVTRUQiOwotICAgIGNhc2UgRFRfRklMVEVSOglyZXR1cm4gIkZJTFRFUiI7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKCh0eXBlID49IERUX0xPUFJPQykgJiYgKHR5cGUgPD0gRFRfSElQUk9DKSkKLQl7Ci0JICBjb25zdCBjaGFyICogcmVzdWx0OwotCSAgCi0JICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQotCSAgICB7Ci0JICAgIGNhc2UgRU1fTUlQUzoKLQkgICAgY2FzZSBFTV9NSVBTX1JTNF9CRToKLQkgICAgICByZXN1bHQgPSBnZXRfbWlwc19keW5hbWljX3R5cGUgKHR5cGUpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJlc3VsdCA9IE5VTEw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHJlc3VsdCAhPSBOVUxMKQotCSAgICByZXR1cm4gcmVzdWx0OwotCi0JICBzcHJpbnRmIChidWZmLCBfKCJQcm9jZXNzb3IgU3BlY2lmaWM6ICVseCIpLCB0eXBlKTsKLQl9Ci0gICAgICBlbHNlIGlmICgodHlwZSA+PSBEVF9MT09TKSAmJiAodHlwZSA8PSBEVF9ISU9TKSkKLQlzcHJpbnRmIChidWZmLCBfKCJPcGVyYXRpbmcgU3lzdGVtIHNwZWNpZmljOiAlbHgiKSwgdHlwZSk7Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAlbHgiKSwgdHlwZSk7Ci0gICAgICAKLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2ZpbGVfdHlwZSAoZV90eXBlKQotICAgICB1bnNpZ25lZCBlX3R5cGU7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKGVfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBFVF9OT05FOglyZXR1cm4gXygiTk9ORSAoTm9uZSkiKTsKLSAgICBjYXNlIEVUX1JFTDoJcmV0dXJuIF8oIlJFTCAoUmVsb2NhdGFibGUgZmlsZSkiKTsKLSAgICBjYXNlIEVUX0VYRUM6ICAgICAgIHJldHVybiBfKCJFWEVDIChFeGVjdXRhYmxlIGZpbGUpIik7Ci0gICAgY2FzZSBFVF9EWU46ICAgICAgICByZXR1cm4gXygiRFlOIChTaGFyZWQgb2JqZWN0IGZpbGUpIik7Ci0gICAgY2FzZSBFVF9DT1JFOiAgICAgICByZXR1cm4gXygiQ09SRSAoQ29yZSBmaWxlKSIpOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmICgoZV90eXBlID49IEVUX0xPUFJPQykgJiYgKGVfdHlwZSA8PSBFVF9ISVBST0MpKQotCXNwcmludGYgKGJ1ZmYsIF8oIlByb2Nlc3NvciBTcGVjaWZpYzogKCV4KSIpLCBlX3R5cGUpOwotICAgICAgZWxzZSBpZiAoKGVfdHlwZSA+PSBFVF9MT09TKSAmJiAoZV90eXBlIDw9IEVUX0hJT1MpKQotCXNwcmludGYgKGJ1ZmYsIF8oIk9TIFNwZWNpZmljOiAoJXgpIiksIGVfdHlwZSk7Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAleCIpLCBlX3R5cGUpOwotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfbWFjaGluZV9uYW1lIChlX21hY2hpbmUpCi0gICAgIHVuc2lnbmVkIGVfbWFjaGluZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAoZV9tYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIEVNX05PTkU6ICAgICAgICAJcmV0dXJuIF8oIk5vbmUiKTsKLSAgICBjYXNlIEVNX00zMjogICAgICAgICAJcmV0dXJuICJXRTMyMTAwIjsKLSAgICBjYXNlIEVNX1NQQVJDOiAgICAgICAJcmV0dXJuICJTcGFyYyI7Ci0gICAgY2FzZSBFTV8zODY6ICAgICAgICAgCXJldHVybiAiSW50ZWwgODAzODYiOwotICAgIGNhc2UgRU1fNjhLOiAgICAgICAgIAlyZXR1cm4gIk1DNjgwMDAiOwotICAgIGNhc2UgRU1fODhLOiAgICAgICAgIAlyZXR1cm4gIk1DODgwMDAiOwotICAgIGNhc2UgRU1fNDg2OiAgICAgICAgIAlyZXR1cm4gIkludGVsIDgwNDg2IjsKLSAgICBjYXNlIEVNXzg2MDogICAgICAgICAJcmV0dXJuICJJbnRlbCA4MDg2MCI7Ci0gICAgY2FzZSBFTV9NSVBTOiAgICAgICAgCXJldHVybiAiTUlQUyBSMzAwMCBiaWctZW5kaWFuIjsKLSAgICBjYXNlIEVNX1MzNzA6ICAgICAgICAJcmV0dXJuICJBbWRhaGwiOwotICAgIGNhc2UgRU1fTUlQU19SUzRfQkU6IAlyZXR1cm4gIk1JUFMgUjQwMDAgYmlnLWVuZGlhbiI7Ci0gICAgY2FzZSBFTV9PTERfU1BBUkNWOToJcmV0dXJuICJTcGFyYyB2OSAob2xkKSI7Ci0gICAgY2FzZSBFTV9QQVJJU0M6ICAgICAgCXJldHVybiAiSFBQQSI7Ci0gICAgY2FzZSBFTV9QUENfT0xEOgkJcmV0dXJuICJQb3dlciBQQyAob2xkKSI7Ci0gICAgY2FzZSBFTV9TUEFSQzMyUExVUzogCXJldHVybiAiU3BhcmMgdjgrIiA7Ci0gICAgY2FzZSBFTV85NjA6ICAgICAgICAgCXJldHVybiAiSW50ZWwgOTA4NjAiOwotICAgIGNhc2UgRU1fUFBDOiAgICAgICAgIAlyZXR1cm4gIlBvd2VyUEMiOwotICAgIGNhc2UgRU1fVjgwMDogICAgICAgICAJcmV0dXJuICJORUMgVjgwMCI7Ci0gICAgY2FzZSBFTV9GUjIwOiAgICAgICAgIAlyZXR1cm4gIkZ1aml0c3UgRlIyMCI7Ci0gICAgY2FzZSBFTV9SSDMyOiAgICAgICAgIAlyZXR1cm4gIlRSVyBSSDMyIjsKLSAgICBjYXNlIEVNX01DT1JFOgkgICAgICAgIHJldHVybiAiTUNPUkUiOwotICAgIGNhc2UgRU1fQVJNOgkgCXJldHVybiAiQVJNIjsKLSAgICBjYXNlIEVNX09MRF9BTFBIQToJIAlyZXR1cm4gIkRpZ2l0YWwgQWxwaGEgKG9sZCkiOwotICAgIGNhc2UgRU1fU0g6CQkgCXJldHVybiAiSGl0YWNoaSBTSCI7Ci0gICAgY2FzZSBFTV9TUEFSQ1Y5OiAgICAgCXJldHVybiAiU3BhcmMgdjkiOwotICAgIGNhc2UgRU1fVFJJQ09SRTogICAgCXJldHVybiAiU2llbWVucyBUcmljb3JlIjsKLSAgICBjYXNlIEVNX0FSQzoJCXJldHVybiAiQXJnb25hdXQgUklTQyBDb3JlIjsKLSAgICBjYXNlIEVNX0g4XzMwMDoJCXJldHVybiAiSGl0YWNoaSBIOC8zMDAiOwotICAgIGNhc2UgRU1fSDhfMzAwSDoJCXJldHVybiAiSGl0YWNoaSBIOC8zMDBIIjsKLSAgICBjYXNlIEVNX0g4UzoJCXJldHVybiAiSGl0YWNoaSBIOFMiOwotICAgIGNhc2UgRU1fSDhfNTAwOgkJcmV0dXJuICJIaXRhY2hpIEg4LzUwMCI7Ci0gICAgY2FzZSBFTV9JQV82NDoJCXJldHVybiAiSW50ZWwgTWVyY2VkIjsKLSAgICBjYXNlIEVNX01JUFNfWDoJCXJldHVybiAiU3RhbmZvcmQgTUlQUy1YIjsKLSAgICBjYXNlIEVNX0NPTERGSVJFOgkJcmV0dXJuICJNb3Rvcm9sYSBDb2xkZmlyZSI7Ci0gICAgY2FzZSBFTV82OEhDMTI6CQlyZXR1cm4gIk1vdG9yb2xhIE02OEhDMTIiOwotICAgIGNhc2UgRU1fQUxQSEE6ICAgICAgIAlyZXR1cm4gIkFscGhhIjsKLSAgICBjYXNlIEVNX0NZR05VU19EMTBWOiAgICAgICAgcmV0dXJuICJkMTB2IjsKLSAgICBjYXNlIEVNX0NZR05VU19EMzBWOiAgICAgICAgcmV0dXJuICJkMzB2IjsKLSAgICBjYXNlIEVNX0NZR05VU19BUkM6CQlyZXR1cm4gIkFyYyI7Ci0gICAgY2FzZSBFTV9DWUdOVVNfTTMyUjoJcmV0dXJuICJNaXRzdWJpc2hpIE0zMnIiOwotICAgIGNhc2UgRU1fQ1lHTlVTX1Y4NTA6CXJldHVybiAiTkVDIHY4NTAiOwotICAgIGNhc2UgRU1fQ1lHTlVTX01OMTAzMDA6CXJldHVybiAibW4xMDMwMCI7Ci0gICAgY2FzZSBFTV9DWUdOVVNfTU4xMDIwMDoJcmV0dXJuICJtbjEwMjAwIjsKLSAgICBjYXNlIEVNX0NZR05VU19GUjMwOglyZXR1cm4gIkZ1aml0c3UgRlIzMCI7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAleCIpLCBlX21hY2hpbmUpOwotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfbWFjaGluZV9mbGFncyAoZV9mbGFncywgZV9tYWNoaW5lKQotICAgICB1bnNpZ25lZCBlX2ZsYWdzOwotICAgICB1bnNpZ25lZCBlX21hY2hpbmU7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZiBbMTAyNF07Ci0KLSAgYnVmWzBdID0gJ1wwJzsKLSAgaWYgKGVfZmxhZ3MpCi0gICAgewotICAgICAgc3dpdGNoIChlX21hY2hpbmUpCi0JewotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQotICAgICAgICBjYXNlIEVNXzY4SzoKLSAgICAgICAgICBpZiAoZV9mbGFncyAmIEVGX0NQVTMyKQotICAgICAgICAgICAgc3RyY2F0IChidWYsICIsIGNwdTMyIik7Ci0gICAgICAgICAgYnJlYWs7Ci0KLQljYXNlIEVNX1BQQzoKLQkgIGlmIChlX2ZsYWdzICYgRUZfUFBDX0VNQikKLQkgICAgc3RyY2F0IChidWYsICIsIGVtYiIpOwotCi0JICBpZiAoZV9mbGFncyAmIEVGX1BQQ19SRUxPQ0FUQUJMRSkKLQkgICAgc3RyY2F0IChidWYsICIsIHJlbG9jYXRhYmxlIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQikKLQkgICAgc3RyY2F0IChidWYsICIsIHJlbG9jYXRhYmxlLWxpYiIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19WODUwOgotCSAgc3dpdGNoIChlX2ZsYWdzICYgRUZfVjg1MF9BUkNIKQotCSAgICB7Ci0JICAgIGNhc2UgRV9WODUwRV9BUkNIOgotCSAgICAgIHN0cmNhdCAoYnVmLCAiLCB2ODUwZSIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEVfVjg1MEVBX0FSQ0g6Ci0JICAgICAgc3RyY2F0IChidWYsICIsIHY4NTBlYSIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEVfVjg1MF9BUkNIOgotCSAgICAgIHN0cmNhdCAoYnVmLCAiLCB2ODUwIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgc3RyY2F0IChidWYsICIsIHVua25vd24gdjg1MCBhcmNoaXRlY3R1cmUgdmFyaWFudCIpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX00zMlI6Ci0JICBpZiAoKGVfZmxhZ3MgJiBFRl9NMzJSX0FSQ0gpID09IEVfTTMyUl9BUkNIKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgbTMyciIpOwotCi0JICBicmVhazsKLQotCWNhc2UgRU1fTUlQUzoKLQljYXNlIEVNX01JUFNfUlM0X0JFOgotCSAgaWYgKGVfZmxhZ3MgJiBFRl9NSVBTX05PUkVPUkRFUikKLQkgICAgc3RyY2F0IChidWYsICIsIG5vcmVvcmRlciIpOwotCi0JICBpZiAoZV9mbGFncyAmIEVGX01JUFNfUElDKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgcGljIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfTUlQU19DUElDKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgY3BpYyIpOwotCi0JICBpZiAoZV9mbGFncyAmIEVGX01JUFNfQUJJMikKLQkgICAgc3RyY2F0IChidWYsICIsIGFiaTIiKTsKLQotCSAgaWYgKChlX2ZsYWdzICYgRUZfTUlQU19BUkNIKSA9PSBFX01JUFNfQVJDSF8xKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgbWlwczEiKTsKLQotCSAgaWYgKChlX2ZsYWdzICYgRUZfTUlQU19BUkNIKSA9PSBFX01JUFNfQVJDSF8yKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgbWlwczIiKTsKLQotCSAgaWYgKChlX2ZsYWdzICYgRUZfTUlQU19BUkNIKSA9PSBFX01JUFNfQVJDSF8zKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgbWlwczMiKTsKLQotCSAgaWYgKChlX2ZsYWdzICYgRUZfTUlQU19BUkNIKSA9PSBFX01JUFNfQVJDSF80KQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgbWlwczQiKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X21hY2hpbmVfZGF0YSAoZV9kYXRhKQotICAgICB1bnNpZ25lZCBlX2RhdGE7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKGVfZGF0YSkKLSAgICB7Ci0gICAgY2FzZSBFTEZEQVRBMkxTQjogcmV0dXJuIF8oIkVMRkRBVEEyTFNCIChsaXR0bGUgZW5kaWFuKSIpOwotICAgIGNhc2UgRUxGREFUQTJNU0I6IHJldHVybiBfKCJFTEZEQVRBMk1TQiAoYmlnIGVuZGlhbikiKTsKLSAgICBkZWZhdWx0OgotICAgICAgc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAleCIpLCBlX2RhdGEpOwotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfbWlwc19zZWdtZW50X3R5cGUgKHR5cGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgdHlwZTsKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIFBUX01JUFNfUkVHSU5GTzoKLSAgICAgIHJldHVybiAiUkVHSU5GTyI7Ci0gICAgY2FzZSBQVF9NSVBTX1JUUFJPQzoKLSAgICAgIHJldHVybiAiUlRQUk9DIjsKLSAgICBjYXNlIFBUX01JUFNfT1BUSU9OUzoKLSAgICAgIHJldHVybiAiT1BUSU9OUyI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X3NlZ21lbnRfdHlwZSAocF90eXBlKQotICAgICB1bnNpZ25lZCBsb25nIHBfdHlwZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAocF90eXBlKQotICAgIHsKLSAgICBjYXNlIFBUX05VTEw6ICAgICAgIHJldHVybiAiTlVMTCI7Ci0gICAgY2FzZSBQVF9MT0FEOiAgICAgICByZXR1cm4gIkxPQUQiOwotICAgIGNhc2UgUFRfRFlOQU1JQzoJcmV0dXJuICJEWU5BTUlDIjsKLSAgICBjYXNlIFBUX0lOVEVSUDogICAgIHJldHVybiAiSU5URVJQIjsKLSAgICBjYXNlIFBUX05PVEU6ICAgICAgIHJldHVybiAiTk9URSI7Ci0gICAgY2FzZSBQVF9TSExJQjogICAgICByZXR1cm4gIlNITElCIjsKLSAgICBjYXNlIFBUX1BIRFI6ICAgICAgIHJldHVybiAiUEhEUiI7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKChwX3R5cGUgPj0gUFRfTE9QUk9DKSAmJiAocF90eXBlIDw9IFBUX0hJUFJPQykpCi0JewotCSAgY29uc3QgY2hhciAqIHJlc3VsdDsKLQkgIAotCSAgc3dpdGNoIChlbGZfaGVhZGVyLmVfbWFjaGluZSkKLQkgICAgewotCSAgICBjYXNlIEVNX01JUFM6Ci0JICAgIGNhc2UgRU1fTUlQU19SUzRfQkU6Ci0JICAgICAgcmVzdWx0ID0gZ2V0X21pcHNfc2VnbWVudF90eXBlIChwX3R5cGUpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJlc3VsdCA9IE5VTEw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIAotCSAgaWYgKHJlc3VsdCAhPSBOVUxMKQotCSAgICByZXR1cm4gcmVzdWx0OwotCSAgCi0JICBzcHJpbnRmIChidWZmLCAiTE9QUk9DKyVseCIsIHBfdHlwZSAtIFBUX0xPUFJPQyk7Ci0JfQotICAgICAgZWxzZSBpZiAoKHBfdHlwZSA+PSBQVF9MT09TKSAmJiAocF90eXBlIDw9IFBUX0hJT1MpKQotCXNwcmludGYgKGJ1ZmYsICJMT09TKyVseCIsIHBfdHlwZSAtIFBUX0xPT1MpOwotICAgICAgZWxzZQotCXNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duPjogJWx4IiksIHBfdHlwZSk7Ci0KLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X21pcHNfc2VjdGlvbl90eXBlX25hbWUgKHNoX3R5cGUpCi0gICAgIHVuc2lnbmVkIGludCBzaF90eXBlOwotewotICBzd2l0Y2ggKHNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX01JUFNfTElCTElTVDogICAgICAgcmV0dXJuICJNSVBTX0xJQkxJU1QiOwotICAgIGNhc2UgU0hUX01JUFNfTVNZTTogICAgICAgICAgcmV0dXJuICJNSVBTX01TWU0iOwotICAgIGNhc2UgU0hUX01JUFNfQ09ORkxJQ1Q6ICAgICAgcmV0dXJuICJNSVBTX0NPTkZMSUNUIjsKLSAgICBjYXNlIFNIVF9NSVBTX0dQVEFCOiAgICAgICAgIHJldHVybiAiTUlQU19HUFRBQiI7Ci0gICAgY2FzZSBTSFRfTUlQU19VQ09ERTogICAgICAgICByZXR1cm4gIk1JUFNfVUNPREUiOwotICAgIGNhc2UgU0hUX01JUFNfREVCVUc6ICAgICAgICAgcmV0dXJuICJNSVBTX0RFQlVHIjsKLSAgICBjYXNlIFNIVF9NSVBTX1JFR0lORk86ICAgICAgIHJldHVybiAiTUlQU19SRUdJTkZPIjsKLSAgICBjYXNlIFNIVF9NSVBTX1BBQ0tBR0U6ICAgICAgIHJldHVybiAiTUlQU19QQUNLQUdFIjsKLSAgICBjYXNlIFNIVF9NSVBTX1BBQ0tTWU06ICAgICAgIHJldHVybiAiTUlQU19QQUNLU1lNIjsKLSAgICBjYXNlIFNIVF9NSVBTX1JFTEQ6ICAgICAgICAgIHJldHVybiAiTUlQU19SRUxEIjsKLSAgICBjYXNlIFNIVF9NSVBTX0lGQUNFOiAgICAgICAgIHJldHVybiAiTUlQU19JRkFDRSI7Ci0gICAgY2FzZSBTSFRfTUlQU19DT05URU5UOiAgICAgICByZXR1cm4gIk1JUFNfQ09OVEVOVCI7Ci0gICAgY2FzZSBTSFRfTUlQU19PUFRJT05TOiAgICAgICByZXR1cm4gIk1JUFNfT1BUSU9OUyI7Ci0gICAgY2FzZSBTSFRfTUlQU19TSERSOiAgICAgICAgICByZXR1cm4gIk1JUFNfU0hEUiI7Ci0gICAgY2FzZSBTSFRfTUlQU19GREVTQzogICAgICAgICByZXR1cm4gIk1JUFNfRkRFU0MiOwotICAgIGNhc2UgU0hUX01JUFNfRVhUU1lNOiAgICAgICAgcmV0dXJuICJNSVBTX0VYVFNZTSI7Ci0gICAgY2FzZSBTSFRfTUlQU19ERU5TRTogICAgICAgICByZXR1cm4gIk1JUFNfREVOU0UiOwotICAgIGNhc2UgU0hUX01JUFNfUERFU0M6ICAgICAgICAgcmV0dXJuICJNSVBTX1BERVNDIjsKLSAgICBjYXNlIFNIVF9NSVBTX0xPQ1NZTTogICAgICAgIHJldHVybiAiTUlQU19MT0NTWU0iOwotICAgIGNhc2UgU0hUX01JUFNfQVVYU1lNOiAgICAgICAgcmV0dXJuICJNSVBTX0FVWFNZTSI7Ci0gICAgY2FzZSBTSFRfTUlQU19PUFRTWU06ICAgICAgICByZXR1cm4gIk1JUFNfT1BUU1lNIjsKLSAgICBjYXNlIFNIVF9NSVBTX0xPQ1NUUjogICAgICAgIHJldHVybiAiTUlQU19MT0NTVFIiOwotICAgIGNhc2UgU0hUX01JUFNfTElORTogICAgICAgICAgcmV0dXJuICJNSVBTX0xJTkUiOwotICAgIGNhc2UgU0hUX01JUFNfUkZERVNDOiAgICAgICAgcmV0dXJuICJNSVBTX1JGREVTQyI7Ci0gICAgY2FzZSBTSFRfTUlQU19ERUxUQVNZTTogICAgICByZXR1cm4gIk1JUFNfREVMVEFTWU0iOwotICAgIGNhc2UgU0hUX01JUFNfREVMVEFJTlNUOiAgICAgcmV0dXJuICJNSVBTX0RFTFRBSU5TVCI7Ci0gICAgY2FzZSBTSFRfTUlQU19ERUxUQUNMQVNTOiAgICByZXR1cm4gIk1JUFNfREVMVEFDTEFTUyI7Ci0gICAgY2FzZSBTSFRfTUlQU19EV0FSRjogICAgICAgICByZXR1cm4gIk1JUFNfRFdBUkYiOwotICAgIGNhc2UgU0hUX01JUFNfREVMVEFERUNMOiAgICAgcmV0dXJuICJNSVBTX0RFTFRBREVDTCI7Ci0gICAgY2FzZSBTSFRfTUlQU19TWU1CT0xfTElCOiAgICByZXR1cm4gIk1JUFNfU1lNQk9MX0xJQiI7Ci0gICAgY2FzZSBTSFRfTUlQU19FVkVOVFM6ICAgICAgICByZXR1cm4gIk1JUFNfRVZFTlRTIjsKLSAgICBjYXNlIFNIVF9NSVBTX1RSQU5TTEFURTogICAgIHJldHVybiAiTUlQU19UUkFOU0xBVEUiOwotICAgIGNhc2UgU0hUX01JUFNfUElYSUU6ICAgICAgICAgcmV0dXJuICJNSVBTX1BJWElFIjsKLSAgICBjYXNlIFNIVF9NSVBTX1hMQVRFOiAgICAgICAgIHJldHVybiAiTUlQU19YTEFURSI7Ci0gICAgY2FzZSBTSFRfTUlQU19YTEFURV9ERUJVRzogICByZXR1cm4gIk1JUFNfWExBVEVfREVCVUciOwotICAgIGNhc2UgU0hUX01JUFNfV0hJUkw6ICAgICAgICAgcmV0dXJuICJNSVBTX1dISVJMIjsKLSAgICBjYXNlIFNIVF9NSVBTX0VIX1JFR0lPTjogICAgIHJldHVybiAiTUlQU19FSF9SRUdJT04iOwotICAgIGNhc2UgU0hUX01JUFNfWExBVEVfT0xEOiAgICAgcmV0dXJuICJNSVBTX1hMQVRFX09MRCI7Ci0gICAgY2FzZSBTSFRfTUlQU19QRFJfRVhDRVBUSU9OOiByZXR1cm4gIk1JUFNfUERSX0VYQ0VQVElPTiI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9zZWN0aW9uX3R5cGVfbmFtZSAoc2hfdHlwZSkKLSAgICAgdW5zaWduZWQgaW50IHNoX3R5cGU7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKHNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX05VTEw6CQlyZXR1cm4gIk5VTEwiOwotICAgIGNhc2UgU0hUX1BST0dCSVRTOgkJcmV0dXJuICJQUk9HQklUUyI7Ci0gICAgY2FzZSBTSFRfU1lNVEFCOgkJcmV0dXJuICJTWU1UQUIiOwotICAgIGNhc2UgU0hUX1NUUlRBQjoJCXJldHVybiAiU1RSVEFCIjsKLSAgICBjYXNlIFNIVF9SRUxBOgkJcmV0dXJuICJSRUxBIjsKLSAgICBjYXNlIFNIVF9IQVNIOgkJcmV0dXJuICJIQVNIIjsKLSAgICBjYXNlIFNIVF9EWU5BTUlDOgkJcmV0dXJuICJEWU5BTUlDIjsKLSAgICBjYXNlIFNIVF9OT1RFOgkJcmV0dXJuICJOT1RFIjsKLSAgICBjYXNlIFNIVF9OT0JJVFM6CQlyZXR1cm4gIk5PQklUUyI7Ci0gICAgY2FzZSBTSFRfUkVMOgkJcmV0dXJuICJSRUwiOwotICAgIGNhc2UgU0hUX1NITElCOgkJcmV0dXJuICJTSExJQiI7Ci0gICAgY2FzZSBTSFRfRFlOU1lNOgkJcmV0dXJuICJEWU5TWU0iOwotICAgIGNhc2UgU0hUX0dOVV92ZXJkZWY6CXJldHVybiAiVkVSREVGIjsKLSAgICBjYXNlIFNIVF9HTlVfdmVybmVlZDoJcmV0dXJuICJWRVJORUVEIjsKLSAgICBjYXNlIFNIVF9HTlVfdmVyc3ltOglyZXR1cm4gIlZFUlNZTSI7Ci0gICAgY2FzZSAweDZmZmZmZmYwOgkgICAgICAgIHJldHVybiAiVkVSU1lNIjsKLSAgICBjYXNlIDB4NmZmZmZmZmM6CSAgICAgICAgcmV0dXJuICJWRVJERUYiOwotICAgIGNhc2UgMHg3ZmZmZmZmZDoJCXJldHVybiAiQVVYSUxJQVJZIjsKLSAgICBjYXNlIDB4N2ZmZmZmZmY6CQlyZXR1cm4gIkZJTFRFUiI7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKChzaF90eXBlID49IFNIVF9MT1BST0MpICYmIChzaF90eXBlIDw9IFNIVF9ISVBST0MpKQotCXsKLQkgIGNvbnN0IGNoYXIgKiByZXN1bHQ7Ci0KLQkgIHN3aXRjaCAoZWxmX2hlYWRlci5lX21hY2hpbmUpCi0JICAgIHsKLQkgICAgY2FzZSBFTV9NSVBTOgotCSAgICBjYXNlIEVNX01JUFNfUlM0X0JFOgotCSAgICAgIHJlc3VsdCA9IGdldF9taXBzX3NlY3Rpb25fdHlwZV9uYW1lIChzaF90eXBlKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXN1bHQgPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChyZXN1bHQgIT0gTlVMTCkKLQkgICAgcmV0dXJuIHJlc3VsdDsKLQotCSAgc3ByaW50ZiAoYnVmZiwgIlNIVF9MT1BST0MrJXgiLCBzaF90eXBlIC0gU0hUX0xPUFJPQyk7Ci0JfQotICAgICAgZWxzZSBpZiAoKHNoX3R5cGUgPj0gU0hUX0xPT1MpICYmIChzaF90eXBlIDw9IFNIVF9ISU9TKSkKLQlzcHJpbnRmIChidWZmLCAiU0hUX0xPT1MrJXgiLCBzaF90eXBlIC0gU0hUX0xPT1MpOwotICAgICAgZWxzZSBpZiAoKHNoX3R5cGUgPj0gU0hUX0xPVVNFUikgJiYgKHNoX3R5cGUgPD0gU0hUX0hJVVNFUikpCi0Jc3ByaW50ZiAoYnVmZiwgIlNIVF9MT1VTRVIrJXgiLCBzaF90eXBlIC0gU0hUX0xPVVNFUik7Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAleCIpLCBzaF90eXBlKTsKLSAgICAgIAotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdHJ1Y3Qgb3B0aW9uIG9wdGlvbnMgW10gPQotewotICB7ImFsbCIsICAgICAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ2EnfSwKLSAgeyJmaWxlLWhlYWRlciIsICAgICAgbm9fYXJndW1lbnQsIDAsICdoJ30sCi0gIHsicHJvZ3JhbS1oZWFkZXJzIiwgIG5vX2FyZ3VtZW50LCAwLCAnbCd9LAotICB7ImhlYWRlcnMiLCAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ2UnfSwKLSAgeyJoaXN0b2dyYW0iLCAgICAgICAgbm9fYXJndW1lbnQsICYgZG9faGlzdG9ncmFtLCAxfSwKLSAgeyJzZWdtZW50cyIsICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdsJ30sCi0gIHsic2VjdGlvbnMiLCAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAnUyd9LAotICB7InNlY3Rpb24taGVhZGVycyIsICBub19hcmd1bWVudCwgMCwgJ1MnfSwKLSAgeyJzeW1ib2xzIiwgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdzJ30sCi0gIHsic3ltcyIsICAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAncyd9LAotICB7InJlbG9jcyIsICAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ3InfSwKLSAgeyJkeW5hbWljIiwgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdkJ30sCi0gIHsidmVyc2lvbi1pbmZvIiwgICAgIG5vX2FyZ3VtZW50LCAwLCAnVid9LAotICB7InVzZS1keW5hbWljIiwgICAgICBub19hcmd1bWVudCwgMCwgJ0QnfSwKLSAgeyJoZXgtZHVtcCIsICAgICAgICAgcmVxdWlyZWRfYXJndW1lbnQsIDAsICd4J30sCi0gIHsiZGVidWctZHVtcCIsICAgICAgIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAndyd9LAotI2lmZGVmIFNVUFBPUlRfRElTQVNTRU1CTFkKLSAgeyJpbnN0cnVjdGlvbi1kdW1wIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdpJ30sCi0jZW5kaWYKLQotICB7InZlcnNpb24iLCAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ3YnfSwKLSAgeyJoZWxwIiwgICAgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdIJ30sCi0gIHswLCAgICAgICAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQotc3RhdGljIHZvaWQKLXVzYWdlICgpCi17Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiVXNhZ2U6IHJlYWRlbGYge29wdGlvbnN9IGVsZi1maWxlKHMpXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICBPcHRpb25zIGFyZTpcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1hIG9yIC0tYWxsICAgICAgICAgICAgICAgRXF1aXZhbGVudCB0bzogLWggLWwgLVMgLXMgLXIgLWQgLVYgLS1oaXN0b2dyYW1cbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1oIG9yIC0tZmlsZS1oZWFkZXIgICAgICAgRGlzcGxheSB0aGUgRUxGIGZpbGUgaGVhZGVyXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtbCBvciAtLXByb2dyYW0taGVhZGVycyBvciAtLXNlZ21lbnRzXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIHByb2dyYW0gaGVhZGVyc1xuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLVMgb3IgLS1zZWN0aW9uLWhlYWRlcnMgb3IgLS1zZWN0aW9uc1xuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBzZWN0aW9ucycgaGVhZGVyXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtZSBvciAtLWhlYWRlcnMgICAgICAgICAgIEVxdWl2YWxlbnQgdG86IC1oIC1sIC1TXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtcyBvciAtLXN5bXMgb3IgLS1zeW1ib2xzIERpc3BsYXkgdGhlIHN5bWJvbCB0YWJsZVxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLXIgb3IgLS1yZWxvY3MgICAgICAgICAgICBEaXNwbGF5IHRoZSByZWxvY2F0aW9ucyAoaWYgcHJlc2VudClcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1kIG9yIC0tZHluYW1pYyAgICAgICAgICAgRGlzcGxheSB0aGUgZHluYW1pYyBzZWdtZW50IChpZiBwcmVzZW50KVxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLVYgb3IgLS12ZXJzaW9uLWluZm8gICAgICBEaXNwbGF5IHRoZSB2ZXJzaW9uIHNlY3Rpb25zIChpZiBwcmVzZW50KVxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLUQgb3IgLS11c2UtZHluYW1pYyAgICAgICBVc2UgdGhlIGR5bmFtaWMgc2VjdGlvbiBpbmZvIHdoZW4gZGlzcGxheWluZyBzeW1ib2xzXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAteCA8bnVtYmVyPiBvciAtLWhleC1kdW1wPTxudW1iZXI+XG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1bXAgdGhlIGNvbnRlbnRzIG9mIHNlY3Rpb24gPG51bWJlcj5cbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC13W2xpYXByXSBvciAtLWRlYnVnLWR1bXBbPWxpbmUsPWluZm8sPWFiYnJldiw9cHVibmFtZXMsPXJhbmdlc11cbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGUgY29udGVudHMgb2YgRFdBUkYyIGRlYnVnIHNlY3Rpb25zXG4iKSk7Ci0jaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLWkgPG51bWJlcj4gb3IgLS1pbnN0cnVjdGlvbi1kdW1wPTxudW1iZXI+XG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2Fzc2VtYmxlIHRoZSBjb250ZW50cyBvZiBzZWN0aW9uIDxudW1iZXI+XG4iKSk7Ci0jZW5kaWYKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgICAgICAgIC0taGlzdG9ncmFtICAgICAgICAgRGlzcGxheSBoaXN0b2dyYW0gb2YgYnVja2V0IGxpc3QgbGVuZ3Roc1xuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLXYgb3IgLS12ZXJzaW9uICAgICAgICAgICBEaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBvZiByZWFkZWxmXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtSCBvciAtLWhlbHAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBpbmZvcm1hdGlvblxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotCi0gIGV4aXQgKDApOwotfQotCi1zdGF0aWMgdm9pZAotcmVxdWVzdF9kdW1wIChzZWN0aW9uLCB0eXBlKQotICAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbjsKLSAgICAgY2hhciAgICAgICAgIHR5cGU7Ci17Ci0gIGlmIChzZWN0aW9uID49IG51bV9kdW1wX3NlY3RzKQotICAgIHsKLSAgICAgIGNoYXIgKiBuZXdfZHVtcF9zZWN0czsKLQotICAgICAgbmV3X2R1bXBfc2VjdHMgPSAoY2hhciAqKSBjYWxsb2MgKHNlY3Rpb24gKyAxLCAxKTsKLQotICAgICAgaWYgKG5ld19kdW1wX3NlY3RzID09IE5VTEwpCi0JZXJyb3IgKF8oIk91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBkdW1wIHJlcXVlc3QgdGFibGUuIikpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENvcHkgY3VycmVudCBmbGFnIHNldHRpbmdzLiAgKi8KLQkgIG1lbWNweSAobmV3X2R1bXBfc2VjdHMsIGR1bXBfc2VjdHMsIG51bV9kdW1wX3NlY3RzKTsKLQotCSAgZnJlZSAoZHVtcF9zZWN0cyk7Ci0KLQkgIGR1bXBfc2VjdHMgPSBuZXdfZHVtcF9zZWN0czsKLQkgIG51bV9kdW1wX3NlY3RzID0gc2VjdGlvbiArIDE7Ci0JfQotICAgIH0KLQotICBpZiAoZHVtcF9zZWN0cykKLSAgICBkdW1wX3NlY3RzIFtzZWN0aW9uXSB8PSB0eXBlOwotCi0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXBhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqIGFyZ3Y7Ci17Ci0gIGludCBjOwotCi0gIGlmIChhcmdjIDwgMikKLSAgICB1c2FnZSAoKTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZwotCSAgKGFyZ2MsIGFyZ3YsICJlcnNhaGxkU0R3Ojp4Omk6dlYiLCBvcHRpb25zLCBOVUxMKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGNoYXIgKiAgICBjcDsKLSAgICAgIGludAlzZWN0aW9uOwotCi0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgMDoKLQkgIC8qIExvbmcgb3B0aW9ucy4gICovCi0JICBicmVhazsKLQljYXNlICdIJzoKLQkgIHVzYWdlICgpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdhJzoKLQkgIGRvX3N5bXMgKys7Ci0JICBkb19yZWxvYyArKzsKLQkgIGRvX2R5bmFtaWMgKys7Ci0JICBkb19oZWFkZXIgKys7Ci0JICBkb19zZWN0aW9ucyArKzsKLQkgIGRvX3NlZ21lbnRzICsrOwotCSAgZG9fdmVyc2lvbiArKzsKLQkgIGRvX2hpc3RvZ3JhbSArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgZG9faGVhZGVyICsrOwotCSAgZG9fc2VjdGlvbnMgKys7Ci0JICBkb19zZWdtZW50cyArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ0QnOgotCSAgZG9fdXNpbmdfZHluYW1pYyArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgZG9fcmVsb2MgKys7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIGRvX2hlYWRlciArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgZG9fc2VnbWVudHMgKys7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGRvX3N5bXMgKys7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQkgIGRvX3NlY3Rpb25zICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBkb19keW5hbWljICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAneCc6Ci0JICBkb19kdW1wICsrOwotCSAgc2VjdGlvbiA9IHN0cnRvdWwgKG9wdGFyZywgJiBjcCwgMCk7Ci0JICBpZiAoISAqIGNwICYmIHNlY3Rpb24gPj0gMCkKLQkgICAgewotCSAgICAgIHJlcXVlc3RfZHVtcCAoc2VjdGlvbiwgSEVYX0RVTVApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBnb3RvIG9vcHM7Ci0JY2FzZSAndyc6Ci0JICBkb19kdW1wICsrOwotCSAgaWYgKG9wdGFyZyA9PSAwKQotCSAgICBkb19kZWJ1Z2dpbmcgPSAxOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZG9fZGVidWdnaW5nID0gMDsKLQkgICAgICBzd2l0Y2ggKG9wdGFyZ1swXSkKLQkJewotCQljYXNlICdpJzoKLQkJY2FzZSAnSSc6Ci0JCSAgZG9fZGVidWdfaW5mbyA9IDE7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnYSc6Ci0JCWNhc2UgJ0EnOgotCQkgIGRvX2RlYnVnX2FiYnJldnMgPSAxOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2wnOgotCQljYXNlICdMJzoKLQkJICBkb19kZWJ1Z19saW5lcyA9IDE7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAncCc6Ci0JCWNhc2UgJ1AnOgotCQkgIGRvX2RlYnVnX3B1Ym5hbWVzID0gMTsKLQkJICBicmVhazsKLQotCQljYXNlICdyJzoKLQkJY2FzZSAnUic6Ci0JCSAgZG9fZGVidWdfYXJhbmdlcyA9IDE7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICB3YXJuIChfKCJVbnJlY29nbmlzZWQgZGVidWcgb3B0aW9uICclcydcbiIpLCBvcHRhcmcpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotI2lmZGVmIFNVUFBPUlRfRElTQVNTRU1CTFkKLQljYXNlICdpJzoKLQkgIGRvX2R1bXAgKys7Ci0JICBzZWN0aW9uID0gc3RydG91bCAob3B0YXJnLCAmIGNwLCAwKTsKLQkgIGlmICghICogY3AgJiYgc2VjdGlvbiA+PSAwKQotCSAgICB7Ci0JICAgICAgcmVxdWVzdF9kdW1wIChzZWN0aW9uLCBESVNBU1NfRFVNUCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGdvdG8gb29wczsKLSNlbmRpZgotCWNhc2UgJ3YnOgotCSAgcHJpbnRfdmVyc2lvbiAocHJvZ3JhbV9uYW1lKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgZG9fdmVyc2lvbiArKzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0Jb29wczoKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBlcnJvciAoXygiSW52YWxpZCBvcHRpb24gJy0lYydcbiIpLCBjKTsKLQkgIC8qIERyb3AgdGhyb3VnaC4gICovCi0JY2FzZSAnPyc6Ci0JICB1c2FnZSAoKTsKLQl9Ci0gICAgfQotCi0gIGlmICghZG9fZHluYW1pYyAmJiAhZG9fc3ltcyAmJiAhZG9fcmVsb2MgJiYgIWRvX3NlY3Rpb25zCi0gICAgICAmJiAhZG9fc2VnbWVudHMgJiYgIWRvX2hlYWRlciAmJiAhZG9fZHVtcCAmJiAhZG9fdmVyc2lvbgotICAgICAgJiYgIWRvX2hpc3RvZ3JhbSAmJiAhZG9fZGVidWdnaW5nKQotICAgIHVzYWdlICgpOwotICBlbHNlIGlmIChhcmdjIDwgMykKLSAgICB7Ci0gICAgICB3YXJuIChfKCJOb3RoaW5nIHRvIGRvLlxuIikpOwotICAgICAgdXNhZ2UoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9lbGZfY2xhc3MgKGVsZl9jbGFzcykKLSAgICAgdW5zaWduZWQgY2hhciBlbGZfY2xhc3M7Ci17Ci0gIHN3aXRjaCAoZWxmX2NsYXNzKQotICAgIHsKLSAgICBjYXNlIEVMRkNMQVNTTk9ORTogcmV0dXJuIF8oIm5vbmUiKTsKLSAgICBjYXNlIEVMRkNMQVNTMzI6ICAgcmV0dXJuIF8oIkVMRjMyIik7Ci0gICAgY2FzZSBFTEZDTEFTUzY0OiAgIHJldHVybiBfKCJFTEY2NCIpOwotICAgIGRlZmF1bHQ6ICAgICAgICAgICByZXR1cm4gXygiPHVua25vd24+Iik7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfZGF0YV9lbmNvZGluZyAoZW5jb2RpbmcpCi0gICAgIHVuc2lnbmVkIGNoYXIgZW5jb2Rpbmc7Ci17Ci0gIHN3aXRjaCAoZW5jb2RpbmcpCi0gICAgewotICAgIGNhc2UgRUxGREFUQU5PTkU6IHJldHVybiBfKCJub25lIik7Ci0gICAgY2FzZSBFTEZEQVRBMkxTQjogcmV0dXJuIF8oIjIncyBjb21wbGVtZW50LCBsaXR0bGUgZW5kaWFuIik7Ci0gICAgY2FzZSBFTEZEQVRBMk1TQjogcmV0dXJuIF8oIjIncyBjb21wbGVtZW50LCBiaWcgZW5kaWFuIik7Ci0gICAgZGVmYXVsdDogICAgICAgICAgcmV0dXJuIF8oIjx1bmtub3duPiIpOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X29zYWJpX25hbWUgKG9zYWJpKQotICAgICB1bnNpZ25lZCBjaGFyIG9zYWJpOwotewotICBzd2l0Y2ggKG9zYWJpKQotICAgIHsKLSAgICBjYXNlIEVMRk9TQUJJX1NZU1Y6ICAgICAgIHJldHVybiBfKCJVTklYIC0gU3lzdGVtIFYiKTsKLSAgICBjYXNlIEVMRk9TQUJJX0hQVVg6ICAgICAgIHJldHVybiBfKCJVTklYIC0gSFAtVVgiKTsKLSAgICBjYXNlIEVMRk9TQUJJX1NUQU5EQUxPTkU6IHJldHVybiBfKCJTdGFuZGFsb25lIEFwcCIpOwotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuIF8oIjx1bmtub3duPiIpOwotICAgIH0KLX0KLQotLyogRGVjb2RlIHRoZSBkYXRhIGhlbGQgaW4gJ2VsZl9oZWFkZXInLiAgKi8KLXN0YXRpYyBpbnQKLXByb2Nlc3NfZmlsZV9oZWFkZXIgKCkKLXsKLSAgaWYgKCAgIGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfTUFHMF0gIT0gRUxGTUFHMAotICAgICAgfHwgZWxmX2hlYWRlci5lX2lkZW50IFtFSV9NQUcxXSAhPSBFTEZNQUcxCi0gICAgICB8fCBlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX01BRzJdICE9IEVMRk1BRzIKLSAgICAgIHx8IGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfTUFHM10gIT0gRUxGTUFHMykKLSAgICB7Ci0gICAgICBlcnJvcgotCShfKCJOb3QgYW4gRUxGIGZpbGUgLSBpdCBoYXMgdGhlIHdyb25nIG1hZ2ljIGJ5dGVzIGF0IHRoZSBzdGFydFxuIikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChkb19oZWFkZXIpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIHByaW50ZiAoXygiRUxGIEhlYWRlcjpcbiIpKTsKLSAgICAgIHByaW50ZiAoXygiICBNYWdpYzogICAiKSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgRUlfTklERU5UOyBpICsrKQotCXByaW50ZiAoIiUyLjJ4ICIsIGVsZl9oZWFkZXIuZV9pZGVudCBbaV0pOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgIHByaW50ZiAoXygiICBDbGFzczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iKSwKLQkgICAgICBnZXRfZWxmX2NsYXNzIChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX0NMQVNTXSkpOwotICAgICAgcHJpbnRmIChfKCIgIERhdGE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAotCSAgICAgIGdldF9kYXRhX2VuY29kaW5nIChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX0RBVEFdKSk7Ci0gICAgICBwcmludGYgKF8oIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAlZCAlc1xuIiksCi0JICAgICAgZWxmX2hlYWRlci5lX2lkZW50IFtFSV9WRVJTSU9OXSwKLQkgICAgICBlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX1ZFUlNJT05dID09IEVWX0NVUlJFTlQgPyAiKGN1cnJlbnQpIiA6Ci0JICAgICAgZWxmX2hlYWRlci5lX2lkZW50IFtFSV9WRVJTSU9OXSAhPSBFVl9OT05FID8gIjx1bmtub3duPiIgOiAiIik7Ci0gICAgICBwcmludGYgKF8oIiAgT1MvQUJJOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiksCi0JICAgICAgZ2V0X29zYWJpX25hbWUgKGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfT1NBQkldKSk7Ci0gICAgICBwcmludGYgKF8oIiAgQUJJIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAlZFxuIiksCi0JICAgICAgZWxmX2hlYWRlci5lX2lkZW50IFtFSV9BQklWRVJTSU9OXSk7Ci0gICAgICBwcmludGYgKF8oIiAgVHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiksCi0JICAgICAgZ2V0X2ZpbGVfdHlwZSAoZWxmX2hlYWRlci5lX3R5cGUpKTsKLSAgICAgIHByaW50ZiAoXygiICBNYWNoaW5lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iKSwKLQkgICAgICBnZXRfbWFjaGluZV9uYW1lIChlbGZfaGVhZGVyLmVfbWFjaGluZSkpOwotICAgICAgcHJpbnRmIChfKCIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHglbHhcbiIpLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBlbGZfaGVhZGVyLmVfdmVyc2lvbik7Ci0gICAgICBwcmludGYgKF8oIiAgRGF0YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiksCi0JICAgICAgZ2V0X21hY2hpbmVfZGF0YSAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9EQVRBXSkpOwotICAgICAgcHJpbnRmIChfKCIgIEVudHJ5IHBvaW50IGFkZHJlc3M6ICAgICAgICAgICAgICAgMHglbHhcbiIpLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBlbGZfaGVhZGVyLmVfZW50cnkpOwotICAgICAgcHJpbnRmIChfKCIgIFN0YXJ0IG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAgJWxkIChieXRlcyBpbnRvIGZpbGUpXG4iKSwKLQkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX3Bob2ZmKTsKLSAgICAgIHByaW50ZiAoXygiICBTdGFydCBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICVsZCAoYnl0ZXMgaW50byBmaWxlKVxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9zaG9mZik7Ci0gICAgICBwcmludGYgKF8oIiAgRmxhZ3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweCVseCVzXG4iKSwKLQkgICAgICAodW5zaWduZWQgbG9uZykgZWxmX2hlYWRlci5lX2ZsYWdzLAotCSAgICAgIGdldF9tYWNoaW5lX2ZsYWdzIChlbGZfaGVhZGVyLmVfZmxhZ3MsIGVsZl9oZWFkZXIuZV9tYWNoaW5lKSk7Ci0gICAgICBwcmludGYgKF8oIiAgU2l6ZSBvZiB0aGlzIGhlYWRlcjogICAgICAgICAgICAgICAlbGQgKGJ5dGVzKVxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9laHNpemUpOwotICAgICAgcHJpbnRmIChfKCIgIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAgJWxkIChieXRlcylcbiIpLAotCSAgICAgIChsb25nKSBlbGZfaGVhZGVyLmVfcGhlbnRzaXplKTsKLSAgICAgIHByaW50ZiAoXygiICBOdW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICVsZFxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9waG51bSk7Ci0gICAgICBwcmludGYgKF8oIiAgU2l6ZSBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICAlbGQgKGJ5dGVzKVxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9zaGVudHNpemUpOwotICAgICAgcHJpbnRmIChfKCIgIE51bWJlciBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgJWxkXG4iKSwKLQkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX3NobnVtKTsKLSAgICAgIHByaW50ZiAoXygiICBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6ICVsZFxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9zaHN0cm5keCk7Ci0gICAgfQotCi0gIC8qIFRlc3QgY2xhc3MgYWZ0ZXIgZHVtcGluZyBoZWFkZXIgc28gdGhhdCBhdCBsZWFzdCB0aGUgaGVhZGVyIGNhbiBiZQotICAgICBkaXNwbGF5IG9uIDY0IGJpdCBiaW5hcmllcy4gICovCi0gIAotICBiaW5hcnlfY2xhc3MgPSBlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX0NMQVNTXTsKLSAgaWYgKGJpbmFyeV9jbGFzcyAhPSBFTEZDTEFTUzMyKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJOb3QgYSAzMiBiaXQgRUxGIGZpbGVcbiIpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3Byb2dyYW1faGVhZGVycyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZjMyX0V4dGVybmFsX1BoZHIgKiBwaGRyczsKLSAgRWxmMzJfSW50ZXJuYWxfUGhkciAqIHByb2dyYW1faGVhZGVyczsKLSAgRWxmMzJfSW50ZXJuYWxfUGhkciAqIHNlZ21lbnQ7Ci0gIHVuc2lnbmVkIGludAkgICAgICAgIGk7Ci0KLSAgaWYgKGVsZl9oZWFkZXIuZV9waG51bSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChkb19zZWdtZW50cykKLQlwcmludGYgKF8oIlxuVGhlcmUgYXJlIG5vIHByb2dyYW0gaGVhZGVycyBpbiB0aGlzIGZpbGUuXG4iKSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKGRvX3NlZ21lbnRzICYmICFkb19oZWFkZXIpCi0gICAgewotICAgICAgcHJpbnRmIChfKCJcbkVsZiBmaWxlIGlzICVzXG4iKSwgZ2V0X2ZpbGVfdHlwZSAoZWxmX2hlYWRlci5lX3R5cGUpKTsKLSAgICAgIHByaW50ZiAoXygiRW50cnkgcG9pbnQgMHglbHhcbiIpLCAodW5zaWduZWQgbG9uZykgZWxmX2hlYWRlci5lX2VudHJ5KTsKLSAgICAgIHByaW50ZiAoXygiVGhlcmUgYXJlICVkIHByb2dyYW0gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0ICVseDpcbiIpLAotCSAgICAgIGVsZl9oZWFkZXIuZV9waG51bSwgKHVuc2lnbmVkIGxvbmcpIGVsZl9oZWFkZXIuZV9waG9mZik7Ci0gICAgfQotCi0gIEdFVF9EQVRBX0FMTE9DIChlbGZfaGVhZGVyLmVfcGhvZmYsCi0JCSAgZWxmX2hlYWRlci5lX3BoZW50c2l6ZSAqIGVsZl9oZWFkZXIuZV9waG51bSwKLQkJICBwaGRycywgRWxmMzJfRXh0ZXJuYWxfUGhkciAqLCAicHJvZ3JhbSBoZWFkZXJzIik7Ci0KLSAgcHJvZ3JhbV9oZWFkZXJzID0gKEVsZjMyX0ludGVybmFsX1BoZHIgKikgbWFsbG9jCi0gICAgKGVsZl9oZWFkZXIuZV9waG51bSAqIHNpemVvZiAoRWxmMzJfSW50ZXJuYWxfUGhkcikpOwotCi0gIGlmIChwcm9ncmFtX2hlYWRlcnMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGZvciAoaSA9IDAsIHNlZ21lbnQgPSBwcm9ncmFtX2hlYWRlcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9waG51bTsKLSAgICAgICBpICsrLCBzZWdtZW50ICsrKQotICAgIHsKLSAgICAgIHNlZ21lbnQtPnBfdHlwZSAgID0gQllURV9HRVQgKHBoZHJzW2ldLnBfdHlwZSk7Ci0gICAgICBzZWdtZW50LT5wX29mZnNldCA9IEJZVEVfR0VUIChwaGRyc1tpXS5wX29mZnNldCk7Ci0gICAgICBzZWdtZW50LT5wX3ZhZGRyICA9IEJZVEVfR0VUIChwaGRyc1tpXS5wX3ZhZGRyKTsKLSAgICAgIHNlZ21lbnQtPnBfcGFkZHIgID0gQllURV9HRVQgKHBoZHJzW2ldLnBfcGFkZHIpOwotICAgICAgc2VnbWVudC0+cF9maWxlc3ogPSBCWVRFX0dFVCAocGhkcnNbaV0ucF9maWxlc3opOwotICAgICAgc2VnbWVudC0+cF9tZW1zeiAgPSBCWVRFX0dFVCAocGhkcnNbaV0ucF9tZW1zeik7Ci0gICAgICBzZWdtZW50LT5wX2ZsYWdzICA9IEJZVEVfR0VUIChwaGRyc1tpXS5wX2ZsYWdzKTsKLSAgICAgIHNlZ21lbnQtPnBfYWxpZ24gID0gQllURV9HRVQgKHBoZHJzW2ldLnBfYWxpZ24pOwotICAgIH0KLQotICBmcmVlIChwaGRycyk7Ci0KLSAgaWYgKGRvX3NlZ21lbnRzKQotICAgIHsKLSAgICAgIHByaW50ZgotCShfKCJcblByb2dyYW0gSGVhZGVyJXM6XG4iKSwgZWxmX2hlYWRlci5lX3BobnVtID4gMSA/ICJzIiA6ICIiKTsKLSAgICAgIHByaW50ZgotCShfKCIgIFR5cGUgICAgICAgIE9mZnNldCAgIFZpcnRBZGRyICAgUGh5c0FkZHIgICBGaWxlU2l6IE1lbVNpeiAgRmxnIEFsaWduXG4iKSk7Ci0gICAgfQotCi0gIGxvYWRhZGRyID0gLTE7Ci0gIGR5bmFtaWNfYWRkciA9IDA7Ci0KLSAgZm9yIChpID0gMCwgc2VnbWVudCA9IHByb2dyYW1faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3BobnVtOwotICAgICAgIGkgKyssIHNlZ21lbnQgKyspCi0gICAgewotICAgICAgaWYgKGRvX3NlZ21lbnRzKQotCXsKLQkgIHByaW50ZiAoIiAgJS0xMS4xMXMgIiwgZ2V0X3NlZ21lbnRfdHlwZSAoc2VnbWVudC0+cF90eXBlKSk7Ci0JICBwcmludGYgKCIweCU2LjZseCAiLCAodW5zaWduZWQgbG9uZykgc2VnbWVudC0+cF9vZmZzZXQpOwotCSAgcHJpbnRmICgiMHglOC44bHggIiwgKHVuc2lnbmVkIGxvbmcpIHNlZ21lbnQtPnBfdmFkZHIpOwotCSAgcHJpbnRmICgiMHglOC44bHggIiwgKHVuc2lnbmVkIGxvbmcpIHNlZ21lbnQtPnBfcGFkZHIpOwotCSAgcHJpbnRmICgiMHglNS41bHggIiwgKHVuc2lnbmVkIGxvbmcpIHNlZ21lbnQtPnBfZmlsZXN6KTsKLQkgIHByaW50ZiAoIjB4JTUuNWx4ICIsICh1bnNpZ25lZCBsb25nKSBzZWdtZW50LT5wX21lbXN6KTsKLQkgIHByaW50ZiAoIiVjJWMlYyAiLAotCQkgIChzZWdtZW50LT5wX2ZsYWdzICYgUEZfUiA/ICdSJyA6ICcgJyksCi0JCSAgKHNlZ21lbnQtPnBfZmxhZ3MgJiBQRl9XID8gJ1cnIDogJyAnKSwKLQkJICAoc2VnbWVudC0+cF9mbGFncyAmIFBGX1ggPyAnRScgOiAnICcpKTsKLQkgIHByaW50ZiAoIiUjbHgiLCAodW5zaWduZWQgbG9uZykgc2VnbWVudC0+cF9hbGlnbik7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHNlZ21lbnQtPnBfdHlwZSkKLQl7Ci0JY2FzZSBQVF9MT0FEOgotCSAgaWYgKGxvYWRhZGRyID09IC0xKQotCSAgICBsb2FkYWRkciA9IChzZWdtZW50LT5wX3ZhZGRyICYgMHhmZmZmZjAwMCkKLQkgICAgICAtIChzZWdtZW50LT5wX29mZnNldCAmIDB4ZmZmZmYwMDApOwotCSAgYnJlYWs7Ci0KLQljYXNlIFBUX0RZTkFNSUM6Ci0JICBpZiAoZHluYW1pY19hZGRyKQotCSAgICBlcnJvciAoXygibW9yZSB0aGFuIG9uZSBkeW5hbWljIHNlZ21lbnRcbiIpKTsKLQotCSAgZHluYW1pY19hZGRyID0gc2VnbWVudC0+cF9vZmZzZXQ7Ci0JICBkeW5hbWljX3NpemUgPSBzZWdtZW50LT5wX2ZpbGVzejsKLQkgIGJyZWFrOwotCi0JY2FzZSBQVF9JTlRFUlA6Ci0JICBpZiAoZnNlZWsgKGZpbGUsIHNlZ21lbnQtPnBfb2Zmc2V0LCBTRUVLX1NFVCkpCi0JICAgIGVycm9yIChfKCJVbmFibGUgdG8gZmluZCBwcm9ncmFtIGludGVycHJldGVyIG5hbWVcbiIpKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHByb2dyYW1faW50ZXJwcmV0ZXJbMF0gPSAwOwotCSAgICAgIGZzY2FuZiAoZmlsZSwgIiU2M3MiLCBwcm9ncmFtX2ludGVycHJldGVyKTsKLQotCSAgICAgIGlmIChkb19zZWdtZW50cykKLQkJcHJpbnRmIChfKCJcbiAgICAgIFtSZXF1ZXN0aW5nIHByb2dyYW0gaW50ZXJwcmV0ZXI6ICVzXSIpLAotCQkgICAgcHJvZ3JhbV9pbnRlcnByZXRlcik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGRvX3NlZ21lbnRzKQotCXB1dGMgKCdcbicsIHN0ZG91dCk7Ci0gICAgfQotCi0gIGlmIChsb2FkYWRkciA9PSAtMSkKLSAgICB7Ci0gICAgICAvKiBWZXJ5IHN0cmFuZ2UuICovCi0gICAgICBsb2FkYWRkciA9IDA7Ci0gICAgfQotCi0gIGlmIChkb19zZWdtZW50cyAmJiBzZWN0aW9uX2hlYWRlcnMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIlxuIFNlY3Rpb24gdG8gU2VnbWVudCBtYXBwaW5nOlxuIikpOwotICAgICAgcHJpbnRmIChfKCIgIFNlZ21lbnQgU2VjdGlvbnMuLi5cbiIpKTsKLQotICAgICAgYXNzZXJ0IChzdHJpbmdfdGFibGUgIT0gTlVMTCk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBlbGZfaGVhZGVyLmVfcGhudW07IGkrKykKLQl7Ci0JICBpbnQgICAgICAgIGo7Ci0JICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLQotCSAgc2VnbWVudCA9IHByb2dyYW1faGVhZGVycyArIGk7Ci0JICBzZWN0aW9uID0gc2VjdGlvbl9oZWFkZXJzOwotCi0JICBwcmludGYgKCIgICAlMi4yZCAgICAgIiwgaSk7Ci0KLQkgIGZvciAoaiA9IDA7IGogPCBlbGZfaGVhZGVyLmVfc2hudW07IGorKywgc2VjdGlvbiArKykKLQkgICAgewotCSAgICAgIGlmIChzZWN0aW9uLT5zaF9zaXplID4gMAotCQkgIC8qIENvbXBhcmUgYWxsb2NhdGVkIHNlY3Rpb25zIGJ5IFZNQSwgdW5hbGxvY2F0ZWQKLQkJICAgICBzZWN0aW9ucyBieSBmaWxlIG9mZnNldC4gICovCi0JCSAgJiYgKHNlY3Rpb24tPnNoX2ZsYWdzICYgU0hGX0FMTE9DCi0JCSAgICAgID8gKHNlY3Rpb24tPnNoX2FkZHIgPj0gc2VnbWVudC0+cF92YWRkcgotCQkJICYmIHNlY3Rpb24tPnNoX2FkZHIgKyBzZWN0aW9uLT5zaF9zaXplCi0JCQkgPD0gc2VnbWVudC0+cF92YWRkciArIHNlZ21lbnQtPnBfbWVtc3opCi0JCSAgICAgIDogKHNlY3Rpb24tPnNoX29mZnNldCA+PSBzZWdtZW50LT5wX29mZnNldAotCQkJICYmIChzZWN0aW9uLT5zaF9vZmZzZXQgKyBzZWN0aW9uLT5zaF9zaXplCi0JCQkgICAgIDw9IHNlZ21lbnQtPnBfb2Zmc2V0ICsgc2VnbWVudC0+cF9maWxlc3opKSkpCi0JCXByaW50ZiAoIiVzICIsIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCSAgICB9Ci0KLQkgIHB1dGMgKCdcbicsc3Rkb3V0KTsKLQl9Ci0gICAgfQotCi0gIGZyZWUgKHByb2dyYW1faGVhZGVycyk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIGludAotZ2V0X3NlY3Rpb25faGVhZGVycyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZjMyX0V4dGVybmFsX1NoZHIgKiBzaGRyczsKLSAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIGludGVybmFsOwotICB1bnNpZ25lZCBpbnQgICAgICAgICAgaTsKLQotICBHRVRfREFUQV9BTExPQyAoZWxmX2hlYWRlci5lX3Nob2ZmLAotCQkgIGVsZl9oZWFkZXIuZV9zaGVudHNpemUgKiBlbGZfaGVhZGVyLmVfc2hudW0sCi0JCSAgc2hkcnMsIEVsZjMyX0V4dGVybmFsX1NoZHIgKiwgInNlY3Rpb24gaGVhZGVycyIpOwotCi0gIHNlY3Rpb25faGVhZGVycyA9IChFbGYzMl9JbnRlcm5hbF9TaGRyICopIG1hbGxvYwotICAgIChlbGZfaGVhZGVyLmVfc2hudW0gKiBzaXplb2YgKEVsZjMyX0ludGVybmFsX1NoZHIpKTsKLQotICBpZiAoc2VjdGlvbl9oZWFkZXJzID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBmb3IgKGkgPSAwLCBpbnRlcm5hbCA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotICAgICAgIGkgKyssIGludGVybmFsICsrKQotICAgIHsKLSAgICAgIGludGVybmFsLT5zaF9uYW1lICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfbmFtZSk7Ci0gICAgICBpbnRlcm5hbC0+c2hfdHlwZSAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX3R5cGUpOwotICAgICAgaW50ZXJuYWwtPnNoX2ZsYWdzICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9mbGFncyk7Ci0gICAgICBpbnRlcm5hbC0+c2hfYWRkciAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2FkZHIpOwotICAgICAgaW50ZXJuYWwtPnNoX29mZnNldCAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9vZmZzZXQpOwotICAgICAgaW50ZXJuYWwtPnNoX3NpemUgICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9zaXplKTsKLSAgICAgIGludGVybmFsLT5zaF9saW5rICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfbGluayk7Ci0gICAgICBpbnRlcm5hbC0+c2hfaW5mbyAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2luZm8pOwotICAgICAgaW50ZXJuYWwtPnNoX2FkZHJhbGlnbiA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9hZGRyYWxpZ24pOwotICAgICAgaW50ZXJuYWwtPnNoX2VudHNpemUgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9lbnRzaXplKTsKLSAgICB9Ci0KLSAgZnJlZSAoc2hkcnMpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgRWxmX0ludGVybmFsX1N5bSAqCi1nZXRfZWxmX3N5bWJvbHMgKGZpbGUsIG9mZnNldCwgbnVtYmVyKQotICAgICBGSUxFICogZmlsZTsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbnVtYmVyOwotewotICBFbGYzMl9FeHRlcm5hbF9TeW0gKiBlc3ltczsKLSAgRWxmX0ludGVybmFsX1N5bSAqICAgaXN5bXM7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gKiAgIHBzeW07Ci0gIHVuc2lnbmVkIGludCAgICAgICAgIGo7Ci0KLSAgR0VUX0RBVEFfQUxMT0MgKG9mZnNldCwgbnVtYmVyICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pLAotCQkgIGVzeW1zLCBFbGYzMl9FeHRlcm5hbF9TeW0gKiwgInN5bWJvbHMiKTsKLQotICBpc3ltcyA9IChFbGZfSW50ZXJuYWxfU3ltICopIG1hbGxvYyAobnVtYmVyICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSk7Ci0KLSAgaWYgKGlzeW1zID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIGZyZWUgKGVzeW1zKTsKLQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGZvciAoaiA9IDAsIHBzeW0gPSBpc3ltczsKLSAgICAgICBqIDwgbnVtYmVyOwotICAgICAgIGogKyssIHBzeW0gKyspCi0gICAgewotICAgICAgcHN5bS0+c3RfbmFtZSAgPSBCWVRFX0dFVCAoZXN5bXNbal0uc3RfbmFtZSk7Ci0gICAgICBwc3ltLT5zdF92YWx1ZSA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF92YWx1ZSk7Ci0gICAgICBwc3ltLT5zdF9zaXplICA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF9zaXplKTsKLSAgICAgIHBzeW0tPnN0X3NobmR4ID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X3NobmR4KTsKLSAgICAgIHBzeW0tPnN0X2luZm8gID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X2luZm8pOwotICAgICAgcHN5bS0+c3Rfb3RoZXIgPSBCWVRFX0dFVCAoZXN5bXNbal0uc3Rfb3RoZXIpOwotICAgIH0KLQotICBmcmVlIChlc3ltcyk7Ci0KLSAgcmV0dXJuIGlzeW1zOwotfQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3NlY3Rpb25faGVhZGVycyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICBpbnQgICAgICAgIGk7Ci0KLSAgc2VjdGlvbl9oZWFkZXJzID0gTlVMTDsKLQotICBpZiAoZWxmX2hlYWRlci5lX3NobnVtID09IDApCi0gICAgewotICAgICAgaWYgKGRvX3NlY3Rpb25zKQotCXByaW50ZiAoXygiXG5UaGVyZSBhcmUgbm8gc2VjdGlvbnMgaW4gdGhpcyBmaWxlLlxuIikpOwotCi0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKGRvX3NlY3Rpb25zICYmICFkb19oZWFkZXIpCi0gICAgcHJpbnRmIChfKCJUaGVyZSBhcmUgJWQgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgJWx4OlxuIiksCi0JICAgIGVsZl9oZWFkZXIuZV9zaG51bSwgKHVuc2lnbmVkIGxvbmcpIGVsZl9oZWFkZXIuZV9zaG9mZik7Ci0KLSAgaWYgKCEgZ2V0X3NlY3Rpb25faGVhZGVycyAoZmlsZSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogUmVhZCBpbiB0aGUgc3RyaW5nIHRhYmxlLCBzbyB0aGF0IHdlIGhhdmUgbmFtZXMgdG8gZGlzcGxheS4gICovCi0gIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnMgKyBlbGZfaGVhZGVyLmVfc2hzdHJuZHg7Ci0KLSAgaWYgKHNlY3Rpb24tPnNoX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHN0cmluZ190YWJsZV9vZmZzZXQ7Ci0KLSAgICAgIHN0cmluZ190YWJsZV9vZmZzZXQgPSBzZWN0aW9uLT5zaF9vZmZzZXQ7Ci0KLSAgICAgIEdFVF9EQVRBX0FMTE9DIChzZWN0aW9uLT5zaF9vZmZzZXQsIHNlY3Rpb24tPnNoX3NpemUsCi0JCSAgICAgIHN0cmluZ190YWJsZSwgY2hhciAqLCAic3RyaW5nIHRhYmxlIik7Ci0gICAgfQotCi0gIC8qIFNjYW4gdGhlIHNlY3Rpb25zIGZvciB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUKLSAgICAgYW5kIGR5bmFtaWMgc3RyaW5nIHRhYmxlIGFuZCBkZWJ1ZyBzZWN0aW9ucy4gKi8KLSAgZHluYW1pY19zeW1ib2xzID0gTlVMTDsKLSAgZHluYW1pY19zdHJpbmdzID0gTlVMTDsKLSAgZHluYW1pY19zeW1pbmZvID0gTlVMTDsKLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotICAgICAgIGkgKyssIHNlY3Rpb24gKyspCi0gICAgewotICAgICAgY2hhciAqIG5hbWUgPSBTRUNUSU9OX05BTUUgKHNlY3Rpb24pOwotCi0gICAgICBpZiAoc2VjdGlvbi0+c2hfdHlwZSA9PSBTSFRfRFlOU1lNKQotCXsKLQkgIGlmIChkeW5hbWljX3N5bWJvbHMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGVycm9yIChfKCJGaWxlIGNvbnRhaW5zIG11bHRpcGxlIGR5bmFtaWMgc3ltYm9sIHRhYmxlc1xuIikpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGR5bmFtaWNfc3ltYm9scyA9IGdldF9lbGZfc3ltYm9scwotCSAgICAoZmlsZSwgc2VjdGlvbi0+c2hfb2Zmc2V0LAotCSAgICAgc2VjdGlvbi0+c2hfc2l6ZSAvIHNlY3Rpb24tPnNoX2VudHNpemUpOwotCX0KLSAgICAgIGVsc2UgaWYgKHNlY3Rpb24tPnNoX3R5cGUgPT0gU0hUX1NUUlRBQgotCSAgICAgICAmJiBzdHJjbXAgKG5hbWUsICIuZHluc3RyIikgPT0gMCkKLQl7Ci0JICBpZiAoZHluYW1pY19zdHJpbmdzICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciAoXygiRmlsZSBjb250YWlucyBtdWx0aXBsZSBkeW5hbWljIHN0cmluZyB0YWJsZXNcbiIpKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBHRVRfREFUQV9BTExPQyAoc2VjdGlvbi0+c2hfb2Zmc2V0LCBzZWN0aW9uLT5zaF9zaXplLAotCQkJICBkeW5hbWljX3N0cmluZ3MsIGNoYXIgKiwgImR5bmFtaWMgc3RyaW5ncyIpOwotCX0KLSAgICAgIGVsc2UgaWYgKChkb19kZWJ1Z2dpbmcgfHwgZG9fZGVidWdfaW5mbyB8fCBkb19kZWJ1Z19hYmJyZXZzCi0JCXx8IGRvX2RlYnVnX2xpbmVzIHx8IGRvX2RlYnVnX3B1Ym5hbWVzIHx8IGRvX2RlYnVnX2FyYW5nZXMpCi0JICAgICAgICYmIHN0cm5jbXAgKG5hbWUsICIuZGVidWdfIiwgNykgPT0gMCkKLQl7Ci0JICBuYW1lICs9IDc7Ci0KLQkgIGlmIChkb19kZWJ1Z2dpbmcKLQkgICAgICB8fCAoZG9fZGVidWdfaW5mbyAgICAgJiYgKHN0cmNtcCAobmFtZSwgImluZm8iKSA9PSAwKSkKLQkgICAgICB8fCAoZG9fZGVidWdfYWJicmV2cyAgJiYgKHN0cmNtcCAobmFtZSwgImFiYnJldiIpID09IDApKQotCSAgICAgIHx8IChkb19kZWJ1Z19saW5lcyAgICAmJiAoc3RyY21wIChuYW1lLCAibGluZSIpID09IDApKQotCSAgICAgIHx8IChkb19kZWJ1Z19wdWJuYW1lcyAmJiAoc3RyY21wIChuYW1lLCAicHVibmFtZXMiKSA9PSAwKSkKLQkgICAgICB8fCAoZG9fZGVidWdfYXJhbmdlcyAgJiYgKHN0cmNtcCAobmFtZSwgImFyYW5nZXMiKSA9PSAwKSkKLQkgICAgICApCi0JICAgIHJlcXVlc3RfZHVtcCAoaSwgREVCVUdfRFVNUCk7Ci0JfQotICAgIH0KLQotICBpZiAoISBkb19zZWN0aW9ucykKLSAgICByZXR1cm4gMTsKLQotICBwcmludGYgKF8oIlxuU2VjdGlvbiBIZWFkZXIlczpcbiIpLCBlbGZfaGVhZGVyLmVfc2hudW0gPiAxID8gInMiIDogIiIpOwotICBwcmludGYKLSAgICAoXygiICBbTnJdIE5hbWUgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBBZGRyICAgICBPZmYgICAgU2l6ZSAgIEVTIEZsZyBMayBJbmYgQWxcbiIpKTsKLQotICBmb3IgKGkgPSAwLCBzZWN0aW9uID0gc2VjdGlvbl9oZWFkZXJzOwotICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW07Ci0gICAgICAgaSArKywgc2VjdGlvbiArKykKLSAgICB7Ci0gICAgICBwcmludGYgKCIgIFslMmRdICUtMTcuMTdzICUtMTUuMTVzICIsCi0JICAgICAgaSwKLQkgICAgICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pLAotCSAgICAgIGdldF9zZWN0aW9uX3R5cGVfbmFtZSAoc2VjdGlvbi0+c2hfdHlwZSkpOwotCi0gICAgICBwcmludGYgKCAiJTguOGx4ICU2LjZseCAlNi42bHggJTIuMmx4IiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX2FkZHIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9vZmZzZXQsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9zaXplLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfZW50c2l6ZSk7Ci0KLSAgICAgIHByaW50ZiAoIiAlYyVjJWMgJTJsZCAlM2x4ICVsZFxuIiwKLQkgICAgICAoc2VjdGlvbi0+c2hfZmxhZ3MgJiBTSEZfV1JJVEUgPyAnVycgOiAnICcpLAotCSAgICAgIChzZWN0aW9uLT5zaF9mbGFncyAmIFNIRl9BTExPQyA/ICdBJyA6ICcgJyksCi0JICAgICAgKHNlY3Rpb24tPnNoX2ZsYWdzICYgU0hGX0VYRUNJTlNUUiA/ICdYJyA6ICcgJyksCi0JICAgICAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX2xpbmssCi0JICAgICAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX2luZm8sCi0JICAgICAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX2FkZHJhbGlnbik7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBQcm9jZXNzIHRoZSByZWxvYyBzZWN0aW9uLiAgKi8KLXN0YXRpYyBpbnQKLXByb2Nlc3NfcmVsb2NzIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgdW5zaWduZWQgbG9uZyAgICByZWxfc2l6ZTsKLSAgdW5zaWduZWQgbG9uZwkgICByZWxfb2Zmc2V0OwotCi0KLSAgaWYgKCFkb19yZWxvYykKLSAgICByZXR1cm4gMTsKLQotICBpZiAoZG9fdXNpbmdfZHluYW1pYykKLSAgICB7Ci0gICAgICByZWxfc2l6ZSAgID0gMDsKLSAgICAgIHJlbF9vZmZzZXQgPSAwOwotCi0gICAgICBpZiAoZHluYW1pY19pbmZvW0RUX1JFTF0pCi0JewotCSAgcmVsX29mZnNldCA9IGR5bmFtaWNfaW5mb1tEVF9SRUxdOwotCSAgcmVsX3NpemUgICA9IGR5bmFtaWNfaW5mb1tEVF9SRUxTWl07Ci0JfQotICAgICAgZWxzZSBpZiAoZHluYW1pY19pbmZvIFtEVF9SRUxBXSkKLQl7Ci0JICByZWxfb2Zmc2V0ID0gZHluYW1pY19pbmZvW0RUX1JFTEFdOwotCSAgcmVsX3NpemUgICA9IGR5bmFtaWNfaW5mb1tEVF9SRUxBU1pdOwotCX0KLSAgICAgIGVsc2UgaWYgKGR5bmFtaWNfaW5mb1tEVF9KTVBSRUxdKQotCXsKLQkgIHJlbF9vZmZzZXQgPSBkeW5hbWljX2luZm9bRFRfSk1QUkVMXTsKLQkgIHJlbF9zaXplICAgPSBkeW5hbWljX2luZm9bRFRfUExUUkVMU1pdOwotCX0KLQotICAgICAgaWYgKHJlbF9zaXplKQotCXsKLQkgIHByaW50ZgotCSAgICAoXygiXG5SZWxvY2F0aW9uIHNlY3Rpb24gYXQgb2Zmc2V0IDB4JWx4IGNvbnRhaW5zICVsZCBieXRlczpcbiIpLAotCSAgICAgcmVsX29mZnNldCwgcmVsX3NpemUpOwotCi0JICBkdW1wX3JlbG9jYXRpb25zIChmaWxlLCByZWxfb2Zmc2V0IC0gbG9hZGFkZHIsIHJlbF9zaXplLAotCQkJICAgIGR5bmFtaWNfc3ltYm9scywgZHluYW1pY19zdHJpbmdzKTsKLQl9Ci0gICAgICBlbHNlCi0JcHJpbnRmIChfKCJcblRoZXJlIGFyZSBubyBkeW5hbWljIHJlbG9jYXRpb25zIGluIHRoaXMgZmlsZS5cbiIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogICAgIHNlY3Rpb247Ci0gICAgICB1bnNpZ25lZCBsb25nIAkJaTsKLSAgICAgIGludCAgICAgICAgICAgCQlmb3VuZCA9IDA7Ci0KLSAgICAgIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7Ci0JICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bTsKLQkgICBpKyssIHNlY3Rpb24gKyspCi0JewotCSAgaWYgKCAgIHNlY3Rpb24tPnNoX3R5cGUgIT0gU0hUX1JFTEEKLQkgICAgICAmJiBzZWN0aW9uLT5zaF90eXBlICE9IFNIVF9SRUwpCi0JICAgIGNvbnRpbnVlOwotCi0JICByZWxfb2Zmc2V0ID0gc2VjdGlvbi0+c2hfb2Zmc2V0OwotCSAgcmVsX3NpemUgICA9IHNlY3Rpb24tPnNoX3NpemU7Ci0KLQkgIGlmIChyZWxfc2l6ZSkKLQkgICAgewotCSAgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzdHJzZWM7Ci0JICAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHN5bXNlYzsKLQkgICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgc3ltdGFiOwotCSAgICAgIGNoYXIgKiAgICAgICAgICAgICAgICBzdHJ0YWI7Ci0KLQkgICAgICBwcmludGYgKF8oIlxuUmVsb2NhdGlvbiBzZWN0aW9uICIpKTsKLQotCSAgICAgIGlmIChzdHJpbmdfdGFibGUgPT0gTlVMTCkKLQkJcHJpbnRmICgiJWQiLCBzZWN0aW9uLT5zaF9uYW1lKTsKLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIiclcyciLCBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotCSAgICAgIHByaW50ZiAoXygiIGF0IG9mZnNldCAweCVseCBjb250YWlucyAlbHUgZW50cmllczpcbiIpLAotCQkgcmVsX29mZnNldCwgKHVuc2lnbmVkIGxvbmcpIChyZWxfc2l6ZSAvIHNlY3Rpb24tPnNoX2VudHNpemUpKTsKLQotCSAgICAgIHN5bXNlYyA9IHNlY3Rpb25faGVhZGVycyArIHNlY3Rpb24tPnNoX2xpbms7Ci0KLQkgICAgICBzeW10YWIgPSBnZXRfZWxmX3N5bWJvbHMgKGZpbGUsIHN5bXNlYy0+c2hfb2Zmc2V0LAotCQkJCQlzeW1zZWMtPnNoX3NpemUgLyBzeW1zZWMtPnNoX2VudHNpemUpOwotCi0JICAgICAgaWYgKHN5bXRhYiA9PSBOVUxMKQotCQljb250aW51ZTsKLQotCSAgICAgIHN0cnNlYyA9IHNlY3Rpb25faGVhZGVycyArIHN5bXNlYy0+c2hfbGluazsKLQotCSAgICAgIEdFVF9EQVRBX0FMTE9DIChzdHJzZWMtPnNoX29mZnNldCwgc3Ryc2VjLT5zaF9zaXplLCBzdHJ0YWIsCi0JCQkgICAgICBjaGFyICosICJzdHJpbmcgdGFibGUiKTsKLQotCSAgICAgIGR1bXBfcmVsb2NhdGlvbnMgKGZpbGUsIHJlbF9vZmZzZXQsIHJlbF9zaXplLCBzeW10YWIsIHN0cnRhYik7Ci0KLQkgICAgICBmcmVlIChzdHJ0YWIpOwotCSAgICAgIGZyZWUgKHN5bXRhYik7Ci0KLQkgICAgICBmb3VuZCA9IDE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghIGZvdW5kKQotCXByaW50ZiAoXygiXG5UaGVyZSBhcmUgbm8gcmVsb2NhdGlvbnMgaW4gdGhpcyBmaWxlLlxuIikpOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgdm9pZAotZHluYW1pY19zZWdtZW50X21pcHNfdmFsIChlbnRyeSkKLSAgICAgRWxmX0ludGVybmFsX0R5biAqIGVudHJ5OwotewotICBzd2l0Y2ggKGVudHJ5LT5kX3RhZykKLSAgICB7Ci0gICAgY2FzZSBEVF9NSVBTX0ZMQUdTOgotICAgICAgaWYgKGVudHJ5LT5kX3VuLmRfdmFsID09IDApCi0JcHJpbnRmICgiTk9ORVxuIik7Ci0gICAgICBlbHNlCi0JewotCSAgc3RhdGljIGNvbnN0IGNoYXIgKiBvcHRzW10gPQotCSAgewotCSAgICAiUVVJQ0tTVEFSVCIsICJOT1RQT1QiLCAiTk9fTElCUkFSWV9SRVBMQUNFTUVOVCIsCi0JICAgICJOT19NT1ZFIiwgIlNHSV9PTkxZIiwgIkdVQVJBTlRFRV9JTklUIiwgIkRFTFRBX0NfUExVU19QTFVTIiwKLQkgICAgIkdVQVJBTlRFRV9TVEFSVF9JTklUIiwgIlBJWElFIiwgIkRFRkFVTFRfREVMQVlfTE9BRCIsCi0JICAgICJSRVFVSUNLU1RBUlQiLCAiUkVRVUlDS1NUQVJURUQiLCAiQ09SRCIsICJOT19VTlJFU19VTkRFRiIsCi0JICAgICJSTERfT1JERVJfU0FGRSIKLQkgIH07Ci0JICB1bnNpZ25lZCBpbnQgY250OwotCSAgaW50IGZpcnN0ID0gMTsKLQkgIGZvciAoY250ID0gMDsgY250IDwgTlVNX0VMRU0gKG9wdHMpOyArKyBjbnQpCi0JICAgIGlmIChlbnRyeS0+ZF91bi5kX3ZhbCAmICgxIDw8IGNudCkpCi0JICAgICAgewotCQlwcmludGYgKCIlcyVzIiwgZmlyc3QgPyAiIiA6ICIgIiwgb3B0c1tjbnRdKTsKLQkJZmlyc3QgPSAwOwotCSAgICAgIH0KLQkgIHB1dHMgKCIiKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgRFRfTUlQU19JVkVSU0lPTjoKLSAgICAgIGlmIChkeW5hbWljX3N0cmluZ3MgIT0gTlVMTCkKLQlwcmludGYgKCJJbnRlcmZhY2UgVmVyc2lvbjogJXNcbiIsCi0JCWR5bmFtaWNfc3RyaW5ncyArIGVudHJ5LT5kX3VuLmRfdmFsKTsKLSAgICAgIGVsc2UKLQlwcmludGYgKCIlbGRcbiIsIChsb25nKSBlbnRyeS0+ZF91bi5kX3B0cik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgRFRfTUlQU19USU1FX1NUQU1QOgotICAgICAgewotCWNoYXIgdGltZWJ1ZlsyMF07Ci0JdGltZV90IHRpbWUgPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQlzdHJmdGltZSAodGltZWJ1ZiwgMjAsICIlWS0lbS0lZFQlSDolTTolUyIsIGdtdGltZSAoJnRpbWUpKTsKLQlwcmludGYgKCJUaW1lIFN0YW1wOiAlc1xuIiwgdGltZWJ1Zik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgRFRfTUlQU19STERfVkVSU0lPTjoKLSAgICBjYXNlIERUX01JUFNfTE9DQUxfR09UTk86Ci0gICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUTk86Ci0gICAgY2FzZSBEVF9NSVBTX0xJQkxJU1ROTzoKLSAgICBjYXNlIERUX01JUFNfU1lNVEFCTk86Ci0gICAgY2FzZSBEVF9NSVBTX1VOUkVGRVhUTk86Ci0gICAgY2FzZSBEVF9NSVBTX0hJUEFHRU5POgotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9DTEFTU19OTzoKLSAgICBjYXNlIERUX01JUFNfREVMVEFfSU5TVEFOQ0VfTk86Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX1JFTE9DX05POgotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9TWU1fTk86Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0NMQVNTU1lNX05POgotICAgIGNhc2UgRFRfTUlQU19DT01QQUNUX1NJWkU6Ci0gICAgICBwcmludGYgKCIlbGRcbiIsIChsb25nKSBlbnRyeS0+ZF91bi5kX3B0cik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBwcmludGYgKCIlI2x4XG4iLCAobG9uZykgZW50cnktPmRfdW4uZF9wdHIpOwotICAgIH0KLX0KLQotLyogUGFyc2UgdGhlIGR5bmFtaWMgc2VnbWVudCAqLwotc3RhdGljIGludAotcHJvY2Vzc19keW5hbWljX3NlZ21lbnQgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGZfSW50ZXJuYWxfRHluICogICAgZW50cnk7Ci0gIEVsZjMyX0V4dGVybmFsX0R5biAqICBlZHluOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBpZiAoZHluYW1pY19zaXplID09IDApCi0gICAgewotICAgICAgaWYgKGRvX2R5bmFtaWMpCi0JcHJpbnRmIChfKCJcblRoZXJlIGlzIG5vIGR5bmFtaWMgc2VnbWVudCBpbiB0aGlzIGZpbGUuXG4iKSk7Ci0KLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBHRVRfREFUQV9BTExPQyAoZHluYW1pY19hZGRyLCBkeW5hbWljX3NpemUsCi0JCSAgZWR5biwgRWxmMzJfRXh0ZXJuYWxfRHluICosICJkeW5hbWljIHNlZ21lbnQiKTsKLSAgCi0gIC8qIFNHSSdzIEVMRiBoYXMgbW9yZSB0aGFuIG9uZSBzZWN0aW9uIGluIHRoZSBEWU5BTUlDIHNlZ21lbnQuICBEZXRlcm1pbmUKLSAgICAgaG93IGxhcmdlIC5keW5hbWljIGlzIG5vdy4gIFdlIGNhbiBkbyB0aGlzIGV2ZW4gYmVmb3JlIHRoZSBieXRlCi0gICAgIHN3YXBwaW5nIHNpbmNlIHRoZSBEVF9OVUxMIHRhZyBpcyByZWNvZ25pemFibGUuICAqLwotICBkeW5hbWljX3NpemUgPSAwOwotICB3aGlsZSAoKihFbGYzMl9Xb3JkICopIGVkeW5bZHluYW1pY19zaXplKytdLmRfdGFnICE9IERUX05VTEwpCi0gICAgOwotCi0gIGR5bmFtaWNfc2VnbWVudCA9IChFbGZfSW50ZXJuYWxfRHluICopCi0gICAgbWFsbG9jIChkeW5hbWljX3NpemUgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9EeW4pKTsKLQotICBpZiAoZHluYW1pY19zZWdtZW50ID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIGZyZWUgKGVkeW4pOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGZvciAoaSA9IDAsIGVudHJ5ID0gZHluYW1pY19zZWdtZW50OwotICAgICAgIGkgPCBkeW5hbWljX3NpemU7Ci0gICAgICAgaSArKywgZW50cnkgKyspCi0gICAgewotICAgICAgZW50cnktPmRfdGFnICAgICAgPSBCWVRFX0dFVCAoZWR5biBbaV0uZF90YWcpOwotICAgICAgZW50cnktPmRfdW4uZF92YWwgPSBCWVRFX0dFVCAoZWR5biBbaV0uZF91bi5kX3ZhbCk7Ci0gICAgfQotCi0gIGZyZWUgKGVkeW4pOwotCi0gIC8qIEZpbmQgdGhlIGFwcHJvcHJpYXRlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChkeW5hbWljX3N5bWJvbHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwLCBlbnRyeSA9IGR5bmFtaWNfc2VnbWVudDsKLQkgICBpIDwgZHluYW1pY19zaXplOwotCSAgICsraSwgKysgZW50cnkpCi0JewotCSAgdW5zaWduZWQgbG9uZyAgICAgICAgb2Zmc2V0OwotCSAgbG9uZyAgICAgICAgICAgICAgICAgbnVtX3N5bXM7Ci0KLQkgIGlmIChlbnRyeS0+ZF90YWcgIT0gRFRfU1lNVEFCKQotCSAgICBjb250aW51ZTsKLQotCSAgZHluYW1pY19pbmZvW0RUX1NZTVRBQl0gPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQotCSAgLyogU2luY2Ugd2UgZG8gbm90IGtub3cgaG93IGJpZyB0aGUgc3ltYm9sIHRhYmxlIGlzLAotCSAgICAgd2UgZGVmYXVsdCB0byByZWFkaW5nIGluIHRoZSBlbnRpcmUgZmlsZSAoISkgYW5kCi0JICAgICBwcm9jZXNzaW5nIHRoYXQuICBUaGlzIGlzIG92ZXJraWxsLCBJIGtub3csIGJ1dCBpdAotCSAgICAgc2hvdWxkIHdvcmsuICovCi0KLQkgIG9mZnNldCA9IGVudHJ5LT5kX3VuLmRfdmFsIC0gbG9hZGFkZHI7Ci0KLQkgIGlmIChmc2VlayAoZmlsZSwgMCwgU0VFS19FTkQpKQotCSAgICBlcnJvciAoXygiVW5hYmxlIHRvIHNlZWsgdG8gZW5kIG9mIGZpbGUhIikpOwotCi0JICBudW1fc3ltcyA9IChmdGVsbCAoZmlsZSkgLSBvZmZzZXQpIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pOwotCi0JICBpZiAobnVtX3N5bXMgPCAxKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKF8oIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzeW1ib2xzIHRvIGxvYWRcbiIpKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBkeW5hbWljX3N5bWJvbHMgPSBnZXRfZWxmX3N5bWJvbHMgKGZpbGUsIG9mZnNldCwgbnVtX3N5bXMpOwotCX0KLSAgICB9Ci0KLSAgLyogU2ltaWxhcmx5IGZpbmQgYSBzdHJpbmcgdGFibGUuICAqLwotICBpZiAoZHluYW1pY19zdHJpbmdzID09IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gMCwgZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7Ci0JICAgaSA8IGR5bmFtaWNfc2l6ZTsKLQkgICArK2ksICsrIGVudHJ5KQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCSAgbG9uZyAgICAgICAgICBzdHJfdGFiX2xlbjsKLQotCSAgaWYgKGVudHJ5LT5kX3RhZyAhPSBEVF9TVFJUQUIpCi0JICAgIGNvbnRpbnVlOwotCi0JICBkeW5hbWljX2luZm9bRFRfU1RSVEFCXSA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCi0JICAvKiBTaW5jZSB3ZSBkbyBub3Qga25vdyBob3cgYmlnIHRoZSBzdHJpbmcgdGFibGUgaXMsCi0JICAgICB3ZSBkZWZhdWx0IHRvIHJlYWRpbmcgaW4gdGhlIGVudGlyZSBmaWxlICghKSBhbmQKLQkgICAgIHByb2Nlc3NpbmcgdGhhdC4gIFRoaXMgaXMgb3ZlcmtpbGwsIEkga25vdywgYnV0IGl0Ci0JICAgICBzaG91bGQgd29yay4gKi8KLQotCSAgb2Zmc2V0ID0gZW50cnktPmRfdW4uZF92YWwgLSBsb2FkYWRkcjsKLQkgIGlmIChmc2VlayAoZmlsZSwgMCwgU0VFS19FTkQpKQotCSAgICBlcnJvciAoXygiVW5hYmxlIHRvIHNlZWsgdG8gZW5kIG9mIGZpbGVcbiIpKTsKLQkgIHN0cl90YWJfbGVuID0gZnRlbGwgKGZpbGUpIC0gb2Zmc2V0OwotCi0JICBpZiAoc3RyX3RhYl9sZW4gPCAxKQotCSAgICB7Ci0JICAgICAgZXJyb3IKLQkJKF8oIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGVcbiIpKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBHRVRfREFUQV9BTExPQyAob2Zmc2V0LCBzdHJfdGFiX2xlbiwgZHluYW1pY19zdHJpbmdzLCBjaGFyICosCi0JCQkgICJkeW5hbWljIHN0cmluZyB0YWJsZSIpOwotCi0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIEFuZCBmaW5kIHRoZSBzeW1pbmZvIHNlY3Rpb24gaWYgYXZhaWxhYmxlLiAgKi8KLSAgaWYgKGR5bmFtaWNfc3ltaW5mbyA9PSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzeW1pbnN6ID0gMDsKLQotICAgICAgZm9yIChpID0gMCwgZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7Ci0JICAgaSA8IGR5bmFtaWNfc2l6ZTsKLQkgICArK2ksICsrIGVudHJ5KQotCXsKLQkgIGlmIChlbnRyeS0+ZF90YWcgPT0gRFRfU1lNSU5FTlQpCi0JICAgIHsKLQkgICAgICAvKiBOb3RlOiB0aGVzZSBicmFjZXMgYXJlIG5lY2Vzc2FyeSB0byBhdm9pZCBhIHN5bnRheAotCQkgZXJyb3IgZnJvbSB0aGUgU3VuT1M0IEMgY29tcGlsZXIuICAqLwotCSAgICAgIGFzc2VydCAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltaW5mbykgPT0gZW50cnktPmRfdW4uZF92YWwpOwotCSAgICB9Ci0JICBlbHNlIGlmIChlbnRyeS0+ZF90YWcgPT0gRFRfU1lNSU5TWikKLQkgICAgc3ltaW5zeiA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCSAgZWxzZSBpZiAoZW50cnktPmRfdGFnID09IERUX1NZTUlORk8pCi0JICAgIGR5bmFtaWNfc3ltaW5mb19vZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCX0KLQotICAgICAgaWYgKGR5bmFtaWNfc3ltaW5mb19vZmZzZXQgIT0gMCAmJiBzeW1pbnN6ICE9IDApCi0JewotCSAgRWxmX0V4dGVybmFsX1N5bWluZm8gKmV4dHN5bWluZm87Ci0JICBFbGZfSW50ZXJuYWxfU3ltaW5mbyAqc3ltaW5mbzsKLQotCSAgLyogVGhlcmUgaXMgYSBzeW1pbmZvIHNlY3Rpb24uICBSZWFkIHRoZSBkYXRhLiAgKi8KLQkgIEdFVF9EQVRBX0FMTE9DIChkeW5hbWljX3N5bWluZm9fb2Zmc2V0LCBzeW1pbnN6LCBleHRzeW1pbmZvLAotCQkJICBFbGZfRXh0ZXJuYWxfU3ltaW5mbyAqLCAic3ltYm9sIGluZm9ybWF0aW9uIik7Ci0KLQkgIGR5bmFtaWNfc3ltaW5mbyA9IChFbGZfSW50ZXJuYWxfU3ltaW5mbyAqKSBtYWxsb2MgKHN5bWluc3opOwotCSAgaWYgKGR5bmFtaWNfc3ltaW5mbyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCi0JICBkeW5hbWljX3N5bWluZm9fbmVudCA9IHN5bWluc3ogLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW1pbmZvKTsKLQkgIGZvciAoaSA9IDAsIHN5bWluZm8gPSBkeW5hbWljX3N5bWluZm87IGkgPCBkeW5hbWljX3N5bWluZm9fbmVudDsKLQkgICAgICAgKytpLCArK3N5bWluZm8pCi0JICAgIHsKLQkgICAgICBzeW1pbmZvLT5zaV9ib3VuZHRvID0gQllURV9HRVQgKGV4dHN5bWluZm9baV0uc2lfYm91bmR0byk7Ci0JICAgICAgc3ltaW5mby0+c2lfZmxhZ3MgPSBCWVRFX0dFVCAoZXh0c3ltaW5mb1tpXS5zaV9mbGFncyk7Ci0JICAgIH0KLQotCSAgZnJlZSAoZXh0c3ltaW5mbyk7Ci0JfQotICAgIH0KLQotICBpZiAoZG9fZHluYW1pYyAmJiBkeW5hbWljX2FkZHIpCi0gICAgcHJpbnRmIChfKCJcbkR5bmFtaWMgc2VnbWVudCBhdCBvZmZzZXQgMHgleCBjb250YWlucyAlZCBlbnRyaWVzOlxuIiksCi0JICAgIGR5bmFtaWNfYWRkciwgZHluYW1pY19zaXplKTsKLSAgaWYgKGRvX2R5bmFtaWMpCi0gICAgcHJpbnRmIChfKCIgIFRhZyAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lL1ZhbHVlXG4iKSk7Ci0KLSAgZm9yIChpID0gMCwgZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7Ci0gICAgICAgaSA8IGR5bmFtaWNfc2l6ZTsKLSAgICAgICBpKyssIGVudHJ5ICsrKQotICAgIHsKLSAgICAgIGlmIChkb19keW5hbWljKQotCXByaW50ZiAoXygiICAweCUtOC44bHggKCVzKSUqcyIpLAotCQkodW5zaWduZWQgbG9uZykgZW50cnktPmRfdGFnLAotCQlnZXRfZHluYW1pY190eXBlIChlbnRyeS0+ZF90YWcpLAotCQkyNyAtIHN0cmxlbiAoZ2V0X2R5bmFtaWNfdHlwZSAoZW50cnktPmRfdGFnKSksCi0JCSIgIik7Ci0KLSAgICAgIHN3aXRjaCAoZW50cnktPmRfdGFnKQotCXsKLQljYXNlIERUX0FVWElMSUFSWToKLQljYXNlIERUX0ZJTFRFUjoKLQkgIGlmIChkb19keW5hbWljKQotCSAgICB7Ci0JICAgICAgaWYgKGVudHJ5LT5kX3RhZyA9PSBEVF9BVVhJTElBUlkpCi0JCXByaW50ZiAoXygiQXV4aWxpYXJ5IGxpYnJhcnkiKSk7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKF8oIkZpbHRlciBsaWJyYXJ5IikpOwotCi0JICAgICAgaWYgKGR5bmFtaWNfc3RyaW5ncykKLQkJcHJpbnRmICgiOiBbJXNdXG4iLCBkeW5hbWljX3N0cmluZ3MgKyBlbnRyeS0+ZF91bi5kX3ZhbCk7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCI6ICUjbHhcbiIsIChsb25nKSBlbnRyeS0+ZF91bi5kX3ZhbCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9GRUFUVVJFXzE6Ci0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgewotCSAgICAgIHByaW50ZiAoXygiRmxhZ3M6IikpOwotCSAgICAgIGlmIChlbnRyeS0+ZF91bi5kX3ZhbCA9PSAwKQotCQlwcmludGYgKF8oIiBOb25lXG4iKSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyBpbnQgdmFsID0gZW50cnktPmRfdW4uZF92YWw7Ci0JCSAgaWYgKHZhbCAmIERURl8xX1BBUklOSVQpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBQQVJJTklUIik7Ci0JCSAgICAgIHZhbCBePSBEVEZfMV9QQVJJTklUOwotCQkgICAgfQotCQkgIGlmICh2YWwgIT0gMCkKLQkJICAgIHByaW50ZiAoIiAlbHgiLCB2YWwpOwotCQkgIHB1dHMgKCIiKTsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRFRfUE9TRkxBR18xOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBwcmludGYgKF8oIkZsYWdzOiIpKTsKLQkgICAgICBpZiAoZW50cnktPmRfdW4uZF92YWwgPT0gMCkKLQkJcHJpbnRmIChfKCIgTm9uZVxuIikpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgaW50IHZhbCA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCQkgIGlmICh2YWwgJiBERl9QMV9MQVpZTE9BRCkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIExBWllMT0FEIik7Ci0JCSAgICAgIHZhbCBePSBERl9QMV9MQVpZTE9BRDsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfUDFfR1JPVVBQRVJNKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgR1JPVVBQRVJNIik7Ci0JCSAgICAgIHZhbCBePSBERl9QMV9HUk9VUFBFUk07Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAhPSAwKQotCQkgICAgcHJpbnRmICgiICVseCIsIHZhbCk7Ci0JCSAgcHV0cyAoIiIpOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9GTEFHU18xOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBwcmludGYgKF8oIkZsYWdzOiIpKTsKLQkgICAgICBpZiAoZW50cnktPmRfdW4uZF92YWwgPT0gMCkKLQkJcHJpbnRmIChfKCIgTm9uZVxuIikpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgaW50IHZhbCA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCQkgIGlmICh2YWwgJiBERl8xX05PVykKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIE5PVyIpOwotCQkgICAgICB2YWwgXj0gREZfMV9OT1c7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfR0xPQkFMKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgR0xPQkFMIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX0dMT0JBTDsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9HUk9VUCkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIEdST1VQIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX0dST1VQOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX05PREVMRVRFKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgTk9ERUxFVEUiKTsKLQkJICAgICAgdmFsIF49IERGXzFfTk9ERUxFVEU7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfTE9BREZMVFIpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBMT0FERkxUUiIpOwotCQkgICAgICB2YWwgXj0gREZfMV9MT0FERkxUUjsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9JTklURklSU1QpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBJTklURklSU1QiKTsKLQkJICAgICAgdmFsIF49IERGXzFfSU5JVEZJUlNUOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX05PT1BFTikKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIE5PT1BFTiIpOwotCQkgICAgICB2YWwgXj0gREZfMV9OT09QRU47Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfT1JJR0lOKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgT1JJR0lOIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX09SSUdJTjsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9ESVJFQ1QpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBESVJFQ1QiKTsKLQkJICAgICAgdmFsIF49IERGXzFfRElSRUNUOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX1RSQU5TKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgVFJBTlMiKTsKLQkJICAgICAgdmFsIF49IERGXzFfVFJBTlM7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfSU5URVJQT1NFKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgSU5URVJQT1NFIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX0lOVEVSUE9TRTsKLQkJICAgIH0KLQkJICBpZiAodmFsICE9IDApCi0JCSAgICBwcmludGYgKCIgJWx4IiwgdmFsKTsKLQkJICBwdXRzICgiIik7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIERUX1BMVFJFTDoKLQkgIGlmIChkb19keW5hbWljKQotCSAgICBwdXRzIChnZXRfZHluYW1pY190eXBlIChlbnRyeS0+ZF91bi5kX3ZhbCkpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERUX05VTEwJOgotCWNhc2UgRFRfTkVFREVECToKLQljYXNlIERUX1BMVEdPVAk6Ci0JY2FzZSBEVF9IQVNICToKLQljYXNlIERUX1NUUlRBQgk6Ci0JY2FzZSBEVF9TWU1UQUIJOgotCWNhc2UgRFRfUkVMQQk6Ci0JY2FzZSBEVF9JTklUCToKLQljYXNlIERUX0ZJTkkJOgotCWNhc2UgRFRfU09OQU1FCToKLQljYXNlIERUX1JQQVRICToKLQljYXNlIERUX1NZTUJPTElDOgotCWNhc2UgRFRfUkVMCToKLQljYXNlIERUX0RFQlVHCToKLQljYXNlIERUX1RFWFRSRUwJOgotCWNhc2UgRFRfSk1QUkVMCToKLQkgIGR5bmFtaWNfaW5mb1tlbnRyeS0+ZF90YWddID0gZW50cnktPmRfdW4uZF92YWw7Ci0KLQkgIGlmIChkb19keW5hbWljKQotCSAgICB7Ci0JICAgICAgY2hhciAqIG5hbWU7Ci0KLQkgICAgICBpZiAoZHluYW1pY19zdHJpbmdzID09IE5VTEwpCi0JCW5hbWUgPSBOVUxMOwotCSAgICAgIGVsc2UKLQkJbmFtZSA9IGR5bmFtaWNfc3RyaW5ncyArIGVudHJ5LT5kX3VuLmRfdmFsOwotCi0JICAgICAgaWYgKG5hbWUpCi0JCXsKLQkJICBzd2l0Y2ggKGVudHJ5LT5kX3RhZykKLQkJICAgIHsKLQkJICAgIGNhc2UgRFRfTkVFREVEOgotCQkgICAgICBwcmludGYgKF8oIlNoYXJlZCBsaWJyYXJ5OiBbJXNdIiksIG5hbWUpOwotCi0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHByb2dyYW1faW50ZXJwcmV0ZXIpKQotCQkJcHJpbnRmICgiXG4iKTsKLQkJICAgICAgZWxzZQotCQkJcHJpbnRmIChfKCIgcHJvZ3JhbSBpbnRlcnByZXRlclxuIikpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSBEVF9TT05BTUU6Ci0JCSAgICAgIHByaW50ZiAoXygiTGlicmFyeSBzb25hbWU6IFslc11cbiIpLCBuYW1lKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgRFRfUlBBVEg6Ci0JCSAgICAgIHByaW50ZiAoXygiTGlicmFyeSBycGF0aDogWyVzXVxuIiksIG5hbWUpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgcHJpbnRmICgiJSNseFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfdmFsKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgiJSNseFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfdmFsKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIERUX1BMVFJFTFNaOgotCWNhc2UgRFRfUkVMQVNaCToKLQljYXNlIERUX1NUUlNaCToKLQljYXNlIERUX1JFTFNaCToKLQljYXNlIERUX1JFTEFFTlQJOgotCWNhc2UgRFRfU1lNRU5UCToKLQljYXNlIERUX1JFTEVOVAk6Ci0JY2FzZSBEVF9QTFRQQURTWjoKLQljYXNlIERUX01PVkVFTlQJOgotCWNhc2UgRFRfTU9WRVNaCToKLQljYXNlIERUX0lOSVRfQVJSQVlTWjoKLQljYXNlIERUX0ZJTklfQVJSQVlTWjoKLQkgIGlmIChkb19keW5hbWljKQotCSAgICBwcmludGYgKCIlbHUgKGJ5dGVzKVxuIiwgKHVuc2lnbmVkIGxvbmcpIGVudHJ5LT5kX3VuLmRfdmFsKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9WRVJERUZOVU06Ci0JY2FzZSBEVF9WRVJORUVETlVNOgotCWNhc2UgRFRfUkVMQUNPVU5UOgotCWNhc2UgRFRfUkVMQ09VTlQ6Ci0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgcHJpbnRmICgiJWx1XG4iLCAodW5zaWduZWQgbG9uZykgZW50cnktPmRfdW4uZF92YWwpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERUX1NZTUlOU1o6Ci0JY2FzZSBEVF9TWU1JTkVOVDoKLQljYXNlIERUX1NZTUlORk86Ci0JY2FzZSBEVF9VU0VEOgotCWNhc2UgRFRfSU5JVF9BUlJBWToKLQljYXNlIERUX0ZJTklfQVJSQVk6Ci0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgewotCSAgICAgIGlmIChkeW5hbWljX3N0cmluZ3MgIT0gTlVMTCAmJiBlbnRyeS0+ZF90YWcgPT0gRFRfVVNFRCkKLQkJewotCQkgIGNoYXIgKiBuYW1lOwotCi0JCSAgbmFtZSA9IGR5bmFtaWNfc3RyaW5ncyArIGVudHJ5LT5kX3VuLmRfdmFsOwotCi0JCSAgaWYgKCogbmFtZSkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmIChfKCJOb3QgbmVlZGVkIG9iamVjdDogWyVzXVxuIiksIG5hbWUpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgIAotCSAgICAgIHByaW50ZiAoIiUjbHhcbiIsIChsb25nKSBlbnRyeS0+ZF91bi5kX3ZhbCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9CSU5EX05PVzoKLQkgIC8qIFRoZSB2YWx1ZSBvZiB0aGlzIGVudHJ5IGlzIGlnbm9yZWQuICAqLwotCSAgYnJlYWs7Ci0JICAKLQlkZWZhdWx0OgotCSAgaWYgKChlbnRyeS0+ZF90YWcgPj0gRFRfVkVSU1lNKSAmJiAoZW50cnktPmRfdGFnIDw9IERUX1ZFUk5FRUROVU0pKQotCSAgICB2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKGVudHJ5LT5kX3RhZyldID0KLQkgICAgICBlbnRyeS0+ZF91bi5kX3ZhbDsKLQotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQotCQl7Ci0JCWNhc2UgRU1fTUlQUzoKLQkJY2FzZSBFTV9NSVBTX1JTNF9CRToKLQkJICBkeW5hbWljX3NlZ21lbnRfbWlwc192YWwgKGVudHJ5KTsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBwcmludGYgKCIlI2x4XG4iLCAobG9uZykgZW50cnktPmRfdW4uZF9wdHIpOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF92ZXJfZmxhZ3MgKGZsYWdzKQotICAgICB1bnNpZ25lZCBpbnQgZmxhZ3M7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBidWZmWzBdID0gMDsKLQotICBpZiAoZmxhZ3MgPT0gMCkKLSAgICByZXR1cm4gXygibm9uZSIpOwotCi0gIGlmIChmbGFncyAmIFZFUl9GTEdfQkFTRSkKLSAgICBzdHJjYXQgKGJ1ZmYsICJCQVNFICIpOwotCi0gIGlmIChmbGFncyAmIFZFUl9GTEdfV0VBSykKLSAgICB7Ci0gICAgICBpZiAoZmxhZ3MgJiBWRVJfRkxHX0JBU0UpCi0Jc3RyY2F0IChidWZmLCAifCAiKTsKLQotICAgICAgc3RyY2F0IChidWZmLCAiV0VBSyAiKTsKLSAgICB9Ci0KLSAgaWYgKGZsYWdzICYgfihWRVJfRkxHX0JBU0UgfCBWRVJfRkxHX1dFQUspKQotICAgIHN0cmNhdCAoYnVmZiwgInwgPHVua25vd24+Iik7Ci0KLSAgcmV0dXJuIGJ1ZmY7Ci19Ci0KLS8qIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSB2ZXJzaW9uIHNlY3Rpb25zLiAgKi8KLXN0YXRpYyBpbnQKLXByb2Nlc3NfdmVyc2lvbl9zZWN0aW9ucyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICB1bnNpZ25lZCAgIGk7Ci0gIGludCAgICAgICAgZm91bmQgPSAwOwotCi0gIGlmICghIGRvX3ZlcnNpb24pCi0gICAgcmV0dXJuIDE7Ci0KLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotICAgICAgIGkrKywgc2VjdGlvbiArKykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHNlY3Rpb24tPnNoX3R5cGUpCi0JewotCWNhc2UgU0hUX0dOVV92ZXJkZWY6Ci0JICB7Ci0JICAgIEVsZl9FeHRlcm5hbF9WZXJkZWYgKiBlZGVmczsKLQkgICAgdW5zaWduZWQgaW50ICAgICAgICAgIGlkeDsKLQkgICAgdW5zaWduZWQgaW50ICAgICAgICAgIGNudDsKLQotCSAgICBmb3VuZCA9IDE7Ci0KLQkgICAgcHJpbnRmCi0JICAgICAgKF8oIlxuVmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24gJyVzJyBjb250YWlucyAlbGQgZW50cmllczpcbiIpLAotCSAgICAgICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pLCBzZWN0aW9uLT5zaF9pbmZvKTsKLQotCSAgICBwcmludGYgKF8oIiAgQWRkcjogMHgiKSk7Ci0JICAgIHByaW50Zl92bWEgKHNlY3Rpb24tPnNoX2FkZHIpOwotCSAgICBwcmludGYgKF8oIiAgT2Zmc2V0OiAlIzA4bHggIExpbms6ICVseCAoJXMpXG4iKSwKLQkJICAgIHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfbGluaywKLQkJICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbl9oZWFkZXJzICsgc2VjdGlvbi0+c2hfbGluaykpOwotCi0JICAgIEdFVF9EQVRBX0FMTE9DIChzZWN0aW9uLT5zaF9vZmZzZXQsIHNlY3Rpb24tPnNoX3NpemUsCi0JCQkgICAgZWRlZnMsIEVsZl9FeHRlcm5hbF9WZXJkZWYgKiwKLQkJCSAgICAidmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24iKTsKLQotCSAgICBmb3IgKGlkeCA9IGNudCA9IDA7IGNudCA8IHNlY3Rpb24tPnNoX2luZm87ICsrIGNudCkKLQkgICAgICB7Ci0JCWNoYXIgKiAgICAgICAgICAgICAgICAgdnN0YXJ0OwotCQlFbGZfRXh0ZXJuYWxfVmVyZGVmICogIGVkZWY7Ci0JCUVsZl9JbnRlcm5hbF9WZXJkZWYgICAgZW50OwotCQlFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqIGVhdXg7Ci0JCUVsZl9JbnRlcm5hbF9WZXJkYXV4ICAgYXV4OwotCQlpbnQgICAgICAgICAgICAgICAgICAgIGo7Ci0JCWludCAgICAgICAgICAgICAgICAgICAgaXN1bTsKLQkJCi0JCXZzdGFydCA9ICgoY2hhciAqKSBlZGVmcykgKyBpZHg7Ci0KLQkJZWRlZiA9IChFbGZfRXh0ZXJuYWxfVmVyZGVmICopIHZzdGFydDsKLQotCQllbnQudmRfdmVyc2lvbiA9IEJZVEVfR0VUIChlZGVmLT52ZF92ZXJzaW9uKTsKLQkJZW50LnZkX2ZsYWdzICAgPSBCWVRFX0dFVCAoZWRlZi0+dmRfZmxhZ3MpOwotCQllbnQudmRfbmR4ICAgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9uZHgpOwotCQllbnQudmRfY250ICAgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9jbnQpOwotCQllbnQudmRfaGFzaCAgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9oYXNoKTsKLQkJZW50LnZkX2F1eCAgICAgPSBCWVRFX0dFVCAoZWRlZi0+dmRfYXV4KTsKLQkJZW50LnZkX25leHQgICAgPSBCWVRFX0dFVCAoZWRlZi0+dmRfbmV4dCk7Ci0KLQkJcHJpbnRmIChfKCIgICUjMDZ4OiBSZXY6ICVkICBGbGFnczogJXMiKSwKLQkJCWlkeCwgZW50LnZkX3ZlcnNpb24sIGdldF92ZXJfZmxhZ3MgKGVudC52ZF9mbGFncykpOwotCi0JCXByaW50ZiAoXygiICBJbmRleDogJWQgIENudDogJWQgICIpLAotCQkJZW50LnZkX25keCwgZW50LnZkX2NudCk7Ci0KLQkJdnN0YXJ0ICs9IGVudC52ZF9hdXg7Ci0KLQkJZWF1eCA9IChFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqKSB2c3RhcnQ7Ci0KLQkJYXV4LnZkYV9uYW1lID0gQllURV9HRVQgKGVhdXgtPnZkYV9uYW1lKTsKLQkJYXV4LnZkYV9uZXh0ID0gQllURV9HRVQgKGVhdXgtPnZkYV9uZXh0KTsKLQotCQlpZiAoZHluYW1pY19zdHJpbmdzKQotCQkgIHByaW50ZiAoXygiTmFtZTogJXNcbiIpLCBkeW5hbWljX3N0cmluZ3MgKyBhdXgudmRhX25hbWUpOwotCQllbHNlCi0JCSAgcHJpbnRmIChfKCJOYW1lIGluZGV4OiAlbGRcbiIpLCBhdXgudmRhX25hbWUpOwotCi0JCWlzdW0gPSBpZHggKyBlbnQudmRfYXV4OwotCi0JCWZvciAoaiA9IDE7IGogPCBlbnQudmRfY250OyBqICsrKQotCQkgIHsKLQkJICAgIGlzdW0gICArPSBhdXgudmRhX25leHQ7Ci0JCSAgICB2c3RhcnQgKz0gYXV4LnZkYV9uZXh0OwotCi0JCSAgICBlYXV4ID0gKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopIHZzdGFydDsKLQotCQkgICAgYXV4LnZkYV9uYW1lID0gQllURV9HRVQgKGVhdXgtPnZkYV9uYW1lKTsKLQkJICAgIGF1eC52ZGFfbmV4dCA9IEJZVEVfR0VUIChlYXV4LT52ZGFfbmV4dCk7Ci0KLQkJICAgIGlmIChkeW5hbWljX3N0cmluZ3MpCi0JCSAgICAgIHByaW50ZiAoXygiICAlIzA2eDogUGFyZW50ICVkOiAlc1xuIiksCi0JCQkgICAgICBpc3VtLCBqLCBkeW5hbWljX3N0cmluZ3MgKyBhdXgudmRhX25hbWUpOwotCQkgICAgZWxzZQotCQkgICAgICBwcmludGYgKF8oIiAgJSMwNng6IFBhcmVudCAlZCwgbmFtZSBpbmRleDogJWxkXG4iKSwKLQkJCSAgICAgIGlzdW0sIGosIGF1eC52ZGFfbmFtZSk7Ci0JCSAgfQotCi0JCWlkeCArPSBlbnQudmRfbmV4dDsKLQkgICAgICB9Ci0KLQkgICAgZnJlZSAoZWRlZnMpOwotCSAgfQotCSAgYnJlYWs7Ci0JICAKLQljYXNlIFNIVF9HTlVfdmVybmVlZDoKLQkgIHsKLQkgICAgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKiAgZW5lZWQ7Ci0JICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIGlkeDsKLQkgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgY250OwotCi0JICAgIGZvdW5kID0gMTsKLQotCSAgICBwcmludGYgKF8oIlxuVmVyc2lvbiBuZWVkcyBzZWN0aW9uICclcycgY29udGFpbnMgJWxkIGVudHJpZXM6XG4iKSwKLQkJICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbiksIHNlY3Rpb24tPnNoX2luZm8pOwotCi0JICAgIHByaW50ZiAoXygiIEFkZHI6IDB4IikpOwotCSAgICBwcmludGZfdm1hIChzZWN0aW9uLT5zaF9hZGRyKTsKLQkgICAgcHJpbnRmIChfKCIgIE9mZnNldDogJSMwOGx4ICBMaW5rIHRvIHNlY3Rpb246ICVsZCAoJXMpXG4iKSwKLQkJICAgIHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfbGluaywKLQkJICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbl9oZWFkZXJzICsgc2VjdGlvbi0+c2hfbGluaykpOwotCi0JICAgIEdFVF9EQVRBX0FMTE9DIChzZWN0aW9uLT5zaF9vZmZzZXQsIHNlY3Rpb24tPnNoX3NpemUsCi0JCQkgICAgZW5lZWQsIEVsZl9FeHRlcm5hbF9WZXJuZWVkICosCi0JCQkgICAgInZlcnNpb24gbmVlZCBzZWN0aW9uIik7Ci0KLQkgICAgZm9yIChpZHggPSBjbnQgPSAwOyBjbnQgPCBzZWN0aW9uLT5zaF9pbmZvOyArK2NudCkKLQkgICAgICB7Ci0JCUVsZl9FeHRlcm5hbF9WZXJuZWVkICogZW50cnk7Ci0JCUVsZl9JbnRlcm5hbF9WZXJuZWVkICAgICBlbnQ7Ci0JCWludCAgICAgICAgICAgICAgICAgICAgICBqOwotCQlpbnQgICAgICAgICAgICAgICAgICAgICAgaXN1bTsKLQkJY2hhciAqICAgICAgICAgICAgICAgICAgIHZzdGFydDsKLQotCQl2c3RhcnQgPSAoKGNoYXIgKikgZW5lZWQpICsgaWR4OwotCi0JCWVudHJ5ID0gKEVsZl9FeHRlcm5hbF9WZXJuZWVkICopIHZzdGFydDsKLQotCQllbnQudm5fdmVyc2lvbiA9IEJZVEVfR0VUIChlbnRyeS0+dm5fdmVyc2lvbik7Ci0JCWVudC52bl9jbnQgICAgID0gQllURV9HRVQgKGVudHJ5LT52bl9jbnQpOwotCQllbnQudm5fZmlsZSAgICA9IEJZVEVfR0VUIChlbnRyeS0+dm5fZmlsZSk7Ci0JCWVudC52bl9hdXggICAgID0gQllURV9HRVQgKGVudHJ5LT52bl9hdXgpOwotCQllbnQudm5fbmV4dCAgICA9IEJZVEVfR0VUIChlbnRyeS0+dm5fbmV4dCk7Ci0KLQkJcHJpbnRmIChfKCIgICUjMDZ4OiBWZXJzaW9uOiAlZCIpLCBpZHgsIGVudC52bl92ZXJzaW9uKTsKLQotCQlpZiAoZHluYW1pY19zdHJpbmdzKQotCQkgIHByaW50ZiAoXygiICBGaWxlOiAlcyIpLCBkeW5hbWljX3N0cmluZ3MgKyBlbnQudm5fZmlsZSk7Ci0JCWVsc2UKLQkJICBwcmludGYgKF8oIiAgRmlsZTogJWx4IiksIGVudC52bl9maWxlKTsKLQotCQlwcmludGYgKF8oIiAgQ250OiAlZFxuIiksIGVudC52bl9jbnQpOwotCi0JCXZzdGFydCArPSBlbnQudm5fYXV4OwotCi0JCWZvciAoaiA9IDAsIGlzdW0gPSBpZHggKyBlbnQudm5fYXV4OyBqIDwgZW50LnZuX2NudDsgKytqKQotCQkgIHsKLQkJICAgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICogZWF1eDsKLQkJICAgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICAgYXV4OwotCi0JCSAgICBlYXV4ID0gKEVsZl9FeHRlcm5hbF9WZXJuYXV4ICopIHZzdGFydDsKLQotCQkgICAgYXV4LnZuYV9oYXNoICA9IEJZVEVfR0VUIChlYXV4LT52bmFfaGFzaCk7Ci0JCSAgICBhdXgudm5hX2ZsYWdzID0gQllURV9HRVQgKGVhdXgtPnZuYV9mbGFncyk7Ci0JCSAgICBhdXgudm5hX290aGVyID0gQllURV9HRVQgKGVhdXgtPnZuYV9vdGhlcik7Ci0JCSAgICBhdXgudm5hX25hbWUgID0gQllURV9HRVQgKGVhdXgtPnZuYV9uYW1lKTsKLQkJICAgIGF1eC52bmFfbmV4dCAgPSBCWVRFX0dFVCAoZWF1eC0+dm5hX25leHQpOwotCi0JCSAgICBpZiAoZHluYW1pY19zdHJpbmdzKQotCQkgICAgICBwcmludGYgKF8oIiAgJSMwNng6IE5hbWU6ICVzIiksCi0JCQkgICAgICBpc3VtLCBkeW5hbWljX3N0cmluZ3MgKyBhdXgudm5hX25hbWUpOwotCQkgICAgZWxzZQotCQkgICAgICBwcmludGYgKF8oIiAgJSMwNng6IE5hbWUgaW5kZXg6ICVseCIpLAotCQkJICAgICAgaXN1bSwgYXV4LnZuYV9uYW1lKTsKLQotCQkgICAgcHJpbnRmIChfKCIgIEZsYWdzOiAlcyAgVmVyc2lvbjogJWRcbiIpLAotCQkJICAgIGdldF92ZXJfZmxhZ3MgKGF1eC52bmFfZmxhZ3MpLCBhdXgudm5hX290aGVyKTsKLQotCQkgICAgaXN1bSAgICs9IGF1eC52bmFfbmV4dDsKLQkJICAgIHZzdGFydCArPSBhdXgudm5hX25leHQ7Ci0JCSAgfQotCi0JCWlkeCArPSBlbnQudm5fbmV4dDsKLQkgICAgICB9Ci0JICAgIAotCSAgICBmcmVlIChlbmVlZCk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX0dOVV92ZXJzeW06Ci0JICB7Ci0JICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiAgICAgICBsaW5rX3NlY3Rpb247Ci0JICAgIGludCAgICAgICAgICAgICAgCQl0b3RhbDsKLQkgICAgaW50ICAgICAgICAgICAgICAJCWNudDsKLQkgICAgdW5zaWduZWQgY2hhciAqIAkJZWRhdGE7Ci0JICAgIHVuc2lnbmVkIHNob3J0ICogCQlkYXRhOwotCSAgICBjaGFyICogICAgICAgICAgIAkJc3RydGFiOwotCSAgICBFbGZfSW50ZXJuYWxfU3ltICogCQlzeW1ib2xzOwotCSAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogICAgICAgc3RyaW5nX3NlYzsKLQotCSAgICBsaW5rX3NlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnMgKyBzZWN0aW9uLT5zaF9saW5rOwotCSAgICB0b3RhbCA9IHNlY3Rpb24tPnNoX3NpemUgLyBzZWN0aW9uLT5zaF9lbnRzaXplOwotCi0JICAgIGZvdW5kID0gMTsKLQotCSAgICBzeW1ib2xzID0gZ2V0X2VsZl9zeW1ib2xzCi0JICAgICAgKGZpbGUsIGxpbmtfc2VjdGlvbi0+c2hfb2Zmc2V0LAotCSAgICAgICBsaW5rX3NlY3Rpb24tPnNoX3NpemUgLyBsaW5rX3NlY3Rpb24tPnNoX2VudHNpemUpOwotCi0JICAgIHN0cmluZ19zZWMgPSBzZWN0aW9uX2hlYWRlcnMgKyBsaW5rX3NlY3Rpb24tPnNoX2xpbms7Ci0KLQkgICAgR0VUX0RBVEFfQUxMT0MgKHN0cmluZ19zZWMtPnNoX29mZnNldCwgc3RyaW5nX3NlYy0+c2hfc2l6ZSwKLQkJCSAgICBzdHJ0YWIsIGNoYXIgKiwgInZlcnNpb24gc3RyaW5nIHRhYmxlIik7Ci0KLQkgICAgcHJpbnRmIChfKCJcblZlcnNpb24gc3ltYm9scyBzZWN0aW9uICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIpLAotCQkgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSwgdG90YWwpOwotCi0JICAgIHByaW50ZiAoXygiIEFkZHI6ICIpKTsKLQkgICAgcHJpbnRmX3ZtYSAoc2VjdGlvbi0+c2hfYWRkcik7Ci0JICAgIHByaW50ZiAoXygiICBPZmZzZXQ6ICUjMDhseCAgTGluazogJWx4ICglcylcbiIpLAotCQkgICAgc2VjdGlvbi0+c2hfb2Zmc2V0LCBzZWN0aW9uLT5zaF9saW5rLAotCQkgICAgU0VDVElPTl9OQU1FIChsaW5rX3NlY3Rpb24pKTsKLQotCSAgICBHRVRfREFUQV9BTExPQyAodmVyc2lvbl9pbmZvIFtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJTWU0pXQotCQkJICAgIC0gbG9hZGFkZHIsCi0JCQkgICAgdG90YWwgKiBzaXplb2YgKHNob3J0KSwgZWRhdGEsCi0JCQkgICAgdW5zaWduZWQgY2hhciAqLCAidmVyc2lvbiBzeW1ib2wgZGF0YSIpOwotCi0JICAgIGRhdGEgPSAodW5zaWduZWQgc2hvcnQgKikgbWFsbG9jICh0b3RhbCAqIHNpemVvZiAoc2hvcnQpKTsKLQotCSAgICBmb3IgKGNudCA9IHRvdGFsOyBjbnQgLS07KQotCSAgICAgIGRhdGEgW2NudF0gPSBieXRlX2dldCAoZWRhdGEgKyBjbnQgKiBzaXplb2YgKHNob3J0KSwKLQkJCQkgICAgIHNpemVvZiAoc2hvcnQpKTsKLQotCSAgICBmcmVlIChlZGF0YSk7Ci0KLQkgICAgZm9yIChjbnQgPSAwOyBjbnQgPCB0b3RhbDsgY250ICs9IDQpCi0JICAgICAgewotCQlpbnQgaiwgbm47Ci0KLQkJcHJpbnRmICgiICAlMDN4OiIsIGNudCk7Ci0KLQkJZm9yIChqID0gMDsgKGogPCA0KSAmJiAoY250ICsgaikgPCB0b3RhbDsgKytqKQotCQkgIHN3aXRjaCAoZGF0YSBbY250ICsgal0pCi0JCSAgICB7Ci0JCSAgICBjYXNlIDA6Ci0JCSAgICAgIGZwdXRzIChfKCIgICAwICgqbG9jYWwqKSAgICAiKSwgc3Rkb3V0KTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgMToKLQkJICAgICAgZnB1dHMgKF8oIiAgIDEgKCpnbG9iYWwqKSAgICIpLCBzdGRvdXQpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgbm4gPSBwcmludGYgKCIlNHglYyIsIGRhdGEgW2NudCArIGpdICYgMHg3ZmZmLAotCQkJCSAgIGRhdGEgW2NudCArIGpdICYgMHg4MDAwID8gJ2gnIDogJyAnKTsKLQotCQkgICAgICBpZiAoc3ltYm9scyBbY250ICsgal0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFCi0JCQkgICYmIHNlY3Rpb25faGVhZGVyc1tzeW1ib2xzIFtjbnQgKyBqXS5zdF9zaG5keF0uc2hfdHlwZQotCQkJICA9PSBTSFRfTk9CSVRTKQotCQkJewotCQkJICAvKiBXZSBtdXN0IHRlc3QgYm90aC4gICovCi0JCQkgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICAgICBpdm47Ci0JCQkgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBvZmZzZXQ7Ci0KLQkJCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvIFtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJORUVEKV0KLQkJCSAgICAtIGxvYWRhZGRyOwotCi0JCQkgIGRvCi0JCQkgICAgewotCQkJICAgICAgRWxmX0V4dGVybmFsX1Zlcm5lZWQgICBldm47Ci0JCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVybmF1eCAgIGV2bmE7Ci0JCQkgICAgICBFbGZfSW50ZXJuYWxfVmVybmF1eCAgICAgaXZuYTsKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICB2bmFfb2ZmOwotCi0JCQkgICAgICBHRVRfREFUQSAob2Zmc2V0LCBldm4sICJ2ZXJzaW9uIG5lZWQiKTsKLQotCQkJICAgICAgaXZuLnZuX2F1eCAgPSBCWVRFX0dFVCAoZXZuLnZuX2F1eCk7Ci0JCQkgICAgICBpdm4udm5fbmV4dCA9IEJZVEVfR0VUIChldm4udm5fbmV4dCk7Ci0KLQkJCSAgICAgIHZuYV9vZmYgPSBvZmZzZXQgKyBpdm4udm5fYXV4OwotCi0JCQkgICAgICBkbwotCQkJCXsKLQkJCQkgIEdFVF9EQVRBICh2bmFfb2ZmLCBldm5hLAotCQkJCQkgICAgInZlcnNpb24gbmVlZCBhdXggKDEpIik7Ci0KLQkJCQkgIGl2bmEudm5hX25leHQgID0gQllURV9HRVQgKGV2bmEudm5hX25leHQpOwotCQkJCSAgaXZuYS52bmFfb3RoZXIgPSBCWVRFX0dFVCAoZXZuYS52bmFfb3RoZXIpOwotCi0JCQkJICB2bmFfb2ZmICs9IGl2bmEudm5hX25leHQ7Ci0JCQkJfQotCQkJICAgICAgd2hpbGUgKGl2bmEudm5hX290aGVyICE9IGRhdGEgW2NudCArIGpdCi0JCQkJICAgICAmJiBpdm5hLnZuYV9uZXh0ICE9IDApOwotCi0JCQkgICAgICBpZiAoaXZuYS52bmFfb3RoZXIgPT0gZGF0YSBbY250ICsgal0pCi0JCQkJewotCQkJCSAgaXZuYS52bmFfbmFtZSA9IEJZVEVfR0VUIChldm5hLnZuYV9uYW1lKTsKLQotCQkJCSAgbm4gKz0gcHJpbnRmICgiKCVzJS0qcyIsCi0JCQkJCQlzdHJ0YWIgKyBpdm5hLnZuYV9uYW1lLAotCQkJCQkJMTIgLSBzdHJsZW4gKHN0cnRhYgotCQkJCQkJCSAgICAgKyBpdm5hLnZuYV9uYW1lKSwKLQkJCQkJCSIpIik7Ci0JCQkJICBicmVhazsKLQkJCQl9Ci0JCQkgICAgICBlbHNlIGlmIChpdm4udm5fbmV4dCA9PSAwKQotCQkJCXsKLQkJCQkgIGlmIChkYXRhIFtjbnQgKyBqXSAhPSAweDgwMDEpCi0JCQkJICAgIHsKLQkJCQkgICAgICBFbGZfSW50ZXJuYWxfVmVyZGVmICBpdmQ7Ci0JCQkJICAgICAgRWxmX0V4dGVybmFsX1ZlcmRlZiAgZXZkOwotCi0JCQkJICAgICAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvCi0JCQkJCVtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJERUYpXQotCQkJCQktIGxvYWRhZGRyOwotCi0JCQkJICAgICAgZG8KLQkJCQkJewotCQkJCQkgIEdFVF9EQVRBIChvZmZzZXQsIGV2ZCwKLQkJCQkJCSAgICAidmVyc2lvbiBkZWZpbml0aW9uIik7Ci0KLQkJCQkJICBpdmQudmRfbmV4dCA9IEJZVEVfR0VUIChldmQudmRfbmV4dCk7Ci0JCQkJCSAgaXZkLnZkX25keCAgPSBCWVRFX0dFVCAoZXZkLnZkX25keCk7Ci0KLQkJCQkJICBvZmZzZXQgKz0gaXZkLnZkX25leHQ7Ci0JCQkJCX0KLQkJCQkgICAgICB3aGlsZSAoaXZkLnZkX25keAotCQkJCQkgICAgICE9IChkYXRhIFtjbnQgKyBqXSAmIDB4N2ZmZikKLQkJCQkJICAgICAmJiBpdmQudmRfbmV4dCAhPSAwKTsKLQotCQkJCSAgICAgIGlmIChpdmQudmRfbmR4Ci0JCQkJCSAgPT0gKGRhdGEgW2NudCArIGpdICYgMHg3ZmZmKSkKLQkJCQkJewotCQkJCQkgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICBldmRhOwotCQkJCQkgIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICBpdmRhOwotCi0JCQkJCSAgaXZkLnZkX2F1eCA9IEJZVEVfR0VUIChldmQudmRfYXV4KTsKLQotCQkJCQkgIEdFVF9EQVRBIChvZmZzZXQgKyBpdmQudmRfYXV4LCBldmRhLAotCQkJCQkJICAgICJ2ZXJzaW9uIGRlZmluaXRpb24gYXV4Iik7Ci0KLQkJCQkJICBpdmRhLnZkYV9uYW1lID0KLQkJCQkJICAgIEJZVEVfR0VUIChldmRhLnZkYV9uYW1lKTsKLQotCQkJCQkgIG5uICs9Ci0JCQkJCSAgICBwcmludGYgKCIoJXMlLSpzIiwKLQkJCQkJCSAgICBzdHJ0YWIgKyBpdmRhLnZkYV9uYW1lLAotCQkJCQkJICAgIDEyCi0JCQkJCQkgICAgLSBzdHJsZW4gKHN0cnRhYgotCQkJCQkJCSAgICAgICsgaXZkYS52ZGFfbmFtZSksCi0JCQkJCQkgICAgIikiKTsKLQkJCQkJfQotCQkJCSAgICB9Ci0KLQkJCQkgIGJyZWFrOwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQlvZmZzZXQgKz0gaXZuLnZuX25leHQ7Ci0JCQkgICAgfQotCQkJICB3aGlsZSAoaXZuLnZuX25leHQpOwotCQkJfQotCQkgICAgICBlbHNlIGlmIChzeW1ib2xzIFtjbnQgKyBqXS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JCQl7Ci0JCQkgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICAgICBpdm47Ci0JCQkgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBvZmZzZXQ7Ci0KLQkJCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvIFtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJORUVEKV0KLQkJCSAgICAtIGxvYWRhZGRyOwotCi0JCSAgICAgICAgICBkbwotCQkJICAgIHsKLQkJCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICAgICBpdm5hOwotCQkJICAgICAgRWxmX0V4dGVybmFsX1Zlcm5lZWQgICBldm47Ci0JCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVybmF1eCAgIGV2bmE7Ci0JCQkgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgYV9vZmY7Ci0KLQkJCSAgICAgIEdFVF9EQVRBIChvZmZzZXQsIGV2biwgInZlcnNpb24gbmVlZCIpOwotCi0JCQkgICAgICBpdm4udm5fYXV4ICA9IEJZVEVfR0VUIChldm4udm5fYXV4KTsKLQkJCSAgICAgIGl2bi52bl9uZXh0ID0gQllURV9HRVQgKGV2bi52bl9uZXh0KTsKLQotCQkJICAgICAgYV9vZmYgPSBvZmZzZXQgKyBpdm4udm5fYXV4OwotCi0JCQkgICAgICBkbwotCQkJCXsKLQkJCQkgIEdFVF9EQVRBIChhX29mZiwgZXZuYSwKLQkJCQkJICAgICJ2ZXJzaW9uIG5lZWQgYXV4ICgyKSIpOwotCi0JCQkJICBpdm5hLnZuYV9uZXh0ICA9IEJZVEVfR0VUIChldm5hLnZuYV9uZXh0KTsKLQkJCQkgIGl2bmEudm5hX290aGVyID0gQllURV9HRVQgKGV2bmEudm5hX290aGVyKTsKLQotCQkJCSAgYV9vZmYgKz0gaXZuYS52bmFfbmV4dDsKLQkJCQl9Ci0JCQkgICAgICB3aGlsZSAoaXZuYS52bmFfb3RoZXIgIT0gZGF0YSBbY250ICsgal0KLQkJCQkgICAgICYmIGl2bmEudm5hX25leHQgIT0gMCk7Ci0KLQkJCSAgICAgIGlmIChpdm5hLnZuYV9vdGhlciA9PSBkYXRhIFtjbnQgKyBqXSkKLQkJCQl7Ci0JCQkJICBpdm5hLnZuYV9uYW1lID0gQllURV9HRVQgKGV2bmEudm5hX25hbWUpOwotCi0JCQkJICBubiArPSBwcmludGYgKCIoJXMlLSpzIiwKLQkJCQkJCXN0cnRhYiArIGl2bmEudm5hX25hbWUsCi0JCQkJCQkxMiAtIHN0cmxlbiAoc3RydGFiCi0JCQkJCQkJICAgICArIGl2bmEudm5hX25hbWUpLAotCQkJCQkJIikiKTsKLQkJCQkgIGJyZWFrOwotCQkJCX0KLQotCQkJICAgICAgb2Zmc2V0ICs9IGl2bi52bl9uZXh0OwotCQkJICAgIH0KLQkJCSAgd2hpbGUgKGl2bi52bl9uZXh0KTsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoZGF0YSBbY250ICsgal0gIT0gMHg4MDAxKQotCQkJewotCQkJICBFbGZfSW50ZXJuYWxfVmVyZGVmICBpdmQ7Ci0JCQkgIEVsZl9FeHRlcm5hbF9WZXJkZWYgIGV2ZDsKLQkJCSAgdW5zaWduZWQgbG9uZyAgICAgICAgb2Zmc2V0OwotCi0JCQkgIG9mZnNldCA9IHZlcnNpb25faW5mbwotCQkJICAgIFtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJERUYpXSAtIGxvYWRhZGRyOwotCi0JCQkgIGRvCi0JCQkgICAgewotCQkJICAgICAgR0VUX0RBVEEgKG9mZnNldCwgZXZkLCAidmVyc2lvbiBkZWYiKTsKLQotCQkJICAgICAgaXZkLnZkX25leHQgPSBCWVRFX0dFVCAoZXZkLnZkX25leHQpOwotCQkJICAgICAgaXZkLnZkX25keCAgPSBCWVRFX0dFVCAoZXZkLnZkX25keCk7Ci0KLQkJCSAgICAgIG9mZnNldCArPSBpdmQudmRfbmV4dDsKLQkJCSAgICB9Ci0JCQkgIHdoaWxlIChpdmQudmRfbmR4ICE9IChkYXRhIFtjbnQgKyBqXSAmIDB4N2ZmZikKLQkJCQkgJiYgaXZkLnZkX25leHQgIT0gMCk7Ci0KLQkJCSAgaWYgKGl2ZC52ZF9uZHggPT0gKGRhdGEgW2NudCArIGpdICYgMHg3ZmZmKSkKLQkJCSAgICB7Ci0JCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVyZGF1eCAgZXZkYTsKLQkJCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICBpdmRhOwotCi0JCQkgICAgICBpdmQudmRfYXV4ID0gQllURV9HRVQgKGV2ZC52ZF9hdXgpOwotCi0JCQkgICAgICBHRVRfREFUQSAob2Zmc2V0IC0gaXZkLnZkX25leHQgKyBpdmQudmRfYXV4LAotCQkJCQlldmRhLCAidmVyc2lvbiBkZWYgYXV4Iik7Ci0KLQkJCSAgICAgIGl2ZGEudmRhX25hbWUgPSBCWVRFX0dFVCAoZXZkYS52ZGFfbmFtZSk7Ci0KLQkJCSAgICAgIG5uICs9IHByaW50ZiAoIiglcyUtKnMiLAotCQkJCQkgICAgc3RydGFiICsgaXZkYS52ZGFfbmFtZSwKLQkJCQkJICAgIDEyIC0gc3RybGVuIChzdHJ0YWIKLQkJCQkJCQkgKyBpdmRhLnZkYV9uYW1lKSwKLQkJCQkJICAgICIpIik7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIGlmIChubiA8IDE4KQotCQkJcHJpbnRmICgiJSpjIiwgMTggLSBubiwgJyAnKTsKLQkJICAgIH0KLQotCQlwdXRjaGFyICgnXG4nKTsKLQkgICAgICB9Ci0KLQkgICAgZnJlZSAoZGF0YSk7Ci0JICAgIGZyZWUgKHN0cnRhYik7Ci0JICAgIGZyZWUgKHN5bWJvbHMpOwotCSAgfQotCSAgYnJlYWs7Ci0JCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgZm91bmQpCi0gICAgcHJpbnRmIChfKCJcbk5vIHZlcnNpb24gaW5mb3JtYXRpb24gZm91bmQgaW4gdGhpcyBmaWxlLlxuIikpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfc3ltYm9sX2JpbmRpbmcgKGJpbmRpbmcpCi0gICAgIHVuc2lnbmVkIGludCBiaW5kaW5nOwotewotICBzdGF0aWMgY2hhciBidWZmIFszMl07Ci0KLSAgc3dpdGNoIChiaW5kaW5nKQotICAgIHsKLSAgICBjYXNlIFNUQl9MT0NBTDogIHJldHVybiBfKCJMT0NBTCIpOwotICAgIGNhc2UgU1RCX0dMT0JBTDogcmV0dXJuIF8oIkdMT0JBTCIpOwotICAgIGNhc2UgU1RCX1dFQUs6ICAgcmV0dXJuIF8oIldFQUsiKTsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKGJpbmRpbmcgPj0gU1RCX0xPUFJPQyAmJiBiaW5kaW5nIDw9IFNUQl9ISVBST0MpCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHByb2Nlc3NvciBzcGVjaWZpYz46ICVkIiksIGJpbmRpbmcpOwotICAgICAgZWxzZSBpZiAoYmluZGluZyA+PSBTVEJfTE9PUyAmJiBiaW5kaW5nIDw9IFNUQl9ISU9TKQotCXNwcmludGYgKGJ1ZmYsIF8oIjxPUyBzcGVjaWZpYz46ICVkIiksIGJpbmRpbmcpOwotICAgICAgZWxzZQotCXNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duPjogJWQiKSwgYmluZGluZyk7Ci0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9zeW1ib2xfdHlwZSAodHlwZSkKLSAgICAgdW5zaWduZWQgaW50IHR5cGU7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgU1RUX05PVFlQRTogICByZXR1cm4gXygiTk9UWVBFIik7Ci0gICAgY2FzZSBTVFRfT0JKRUNUOiAgIHJldHVybiBfKCJPQkpFQ1QiKTsKLSAgICBjYXNlIFNUVF9GVU5DOiAgICAgcmV0dXJuIF8oIkZVTkMiKTsKLSAgICBjYXNlIFNUVF9TRUNUSU9OOiAgcmV0dXJuIF8oIlNFQ1RJT04iKTsKLSAgICBjYXNlIFNUVF9GSUxFOiAgICAgcmV0dXJuIF8oIkZJTEUiKTsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHR5cGUgPj0gU1RUX0xPUFJPQyAmJiB0eXBlIDw9IFNUVF9ISVBST0MpCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHByb2Nlc3NvciBzcGVjaWZpYz46ICVkIiksIHR5cGUpOwotICAgICAgZWxzZSBpZiAodHlwZSA+PSBTVFRfTE9PUyAmJiB0eXBlIDw9IFNUVF9ISU9TKQotCXNwcmludGYgKGJ1ZmYsIF8oIjxPUyBzcGVjaWZpYz46ICVkIiksIHR5cGUpOwotICAgICAgZWxzZQotCXNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duPjogJWQiKSwgdHlwZSk7Ci0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9zeW1ib2xfaW5kZXhfdHlwZSAodHlwZSkKLSAgICAgdW5zaWduZWQgaW50IHR5cGU7Ci17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBTSE5fVU5ERUY6ICByZXR1cm4gIlVORCI7Ci0gICAgY2FzZSBTSE5fQUJTOiAgICByZXR1cm4gIkFCUyI7Ci0gICAgY2FzZSBTSE5fQ09NTU9OOiByZXR1cm4gIkNPTSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICh0eXBlID49IFNITl9MT1BST0MgJiYgdHlwZSA8PSBTSE5fSElQUk9DKQotCXJldHVybiAiUFJDIjsKLSAgICAgIGVsc2UgaWYgKHR5cGUgPj0gU0hOX0xPUkVTRVJWRSAmJiB0eXBlIDw9IFNITl9ISVJFU0VSVkUpCi0JcmV0dXJuICJSU1YiOwotICAgICAgZWxzZSBpZiAodHlwZSA+PSBTSE5fTE9PUyAmJiB0eXBlIDw9IFNITl9ISU9TKQotCXJldHVybiAiT1MgIjsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdGF0aWMgY2hhciBidWZmIFszMl07Ci0KLQkgIHNwcmludGYgKGJ1ZmYsICIlM2QiLCB0eXBlKTsKLQkgIHJldHVybiBidWZmOwotCX0KLSAgICB9Ci19Ci0KLQotc3RhdGljIGludCAqCi1nZXRfZHluYW1pY19kYXRhIChmaWxlLCBudW1iZXIpCi0gICAgIEZJTEUgKiAgICAgICBmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbnVtYmVyOwotewotICBjaGFyICogZV9kYXRhOwotICBpbnQgKiAgaV9kYXRhOwotCi0gIGVfZGF0YSA9IChjaGFyICopIG1hbGxvYyAobnVtYmVyICogNCk7Ci0KLSAgaWYgKGVfZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWFkIChlX2RhdGEsIDQsIG51bWJlciwgZmlsZSkgIT0gbnVtYmVyKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJVbmFibGUgdG8gcmVhZCBpbiBkeW5hbWljIGRhdGFcbiIpKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpX2RhdGEgPSAoaW50ICopIG1hbGxvYyAobnVtYmVyICogc2l6ZW9mICgqIGlfZGF0YSkpOwotCi0gIGlmIChpX2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotICAgICAgZnJlZSAoZV9kYXRhKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICB3aGlsZSAobnVtYmVyLS0pCi0gICAgaV9kYXRhIFtudW1iZXJdID0gYnl0ZV9nZXQgKGVfZGF0YSArIG51bWJlciAqIDQsIDQpOwotCi0gIGZyZWUgKGVfZGF0YSk7Ci0KLSAgcmV0dXJuIGlfZGF0YTsKLX0KLQotLyogRHVtcCB0aGUgc3ltYm9sIHRhYmxlICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3N5bWJvbF90YWJsZSAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZjMyX0ludGVybmFsX1NoZHIgKiAgIHNlY3Rpb247Ci0gIGNoYXIgICBuYiBbNF07Ci0gIGNoYXIgICBuYyBbNF07Ci0gIGludCAgICBuYnVja2V0czsKLSAgaW50ICAgIG5jaGFpbnM7Ci0gIGludCAqICBidWNrZXRzID0gTlVMTDsKLSAgaW50ICogIGNoYWlucyA9IE5VTEw7Ci0KLSAgaWYgKCEgZG9fc3ltcyAmJiAhZG9faGlzdG9ncmFtKQotICAgIHJldHVybiAxOwotCi0gIGlmIChkeW5hbWljX2luZm9bRFRfSEFTSF0gJiYgKChkb191c2luZ19keW5hbWljICYmIGR5bmFtaWNfc3RyaW5ncyAhPSBOVUxMKQotCQkJCXx8IGRvX2hpc3RvZ3JhbSkpCi0gICAgewotICAgICAgaWYgKGZzZWVrIChmaWxlLCBkeW5hbWljX2luZm9bRFRfSEFTSF0gLSBsb2FkYWRkciwgU0VFS19TRVQpKQotCXsKLQkgIGVycm9yIChfKCJVbmFibGUgdG8gc2VlayB0byBzdGFydCBvZiBkeW5hbWljIGluZm9ybWF0aW9uIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBpZiAoZnJlYWQgKG5iLCBzaXplb2YgKG5iKSwgMSwgZmlsZSkgIT0gMSkKLQl7Ci0JICBlcnJvciAoXygiRmFpbGVkIHRvIHJlYWQgaW4gbnVtYmVyIG9mIGJ1Y2tldHNcbiIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgaWYgKGZyZWFkIChuYywgc2l6ZW9mIChuYyksIDEsIGZpbGUpICE9IDEpCi0JewotCSAgZXJyb3IgKF8oIkZhaWxlZCB0byByZWFkIGluIG51bWJlciBvZiBjaGFpbnNcbiIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgbmJ1Y2tldHMgPSBieXRlX2dldCAobmIsIDQpOwotICAgICAgbmNoYWlucyAgPSBieXRlX2dldCAobmMsIDQpOwotCi0gICAgICBidWNrZXRzID0gZ2V0X2R5bmFtaWNfZGF0YSAoZmlsZSwgbmJ1Y2tldHMpOwotICAgICAgY2hhaW5zICA9IGdldF9keW5hbWljX2RhdGEgKGZpbGUsIG5jaGFpbnMpOwotCi0gICAgICBpZiAoYnVja2V0cyA9PSBOVUxMIHx8IGNoYWlucyA9PSBOVUxMKQotCXJldHVybiAwOwotICAgIH0KLQotICBpZiAoZG9fc3ltcwotICAgICAgJiYgZHluYW1pY19pbmZvW0RUX0hBU0hdICYmIGRvX3VzaW5nX2R5bmFtaWMgJiYgZHluYW1pY19zdHJpbmdzICE9IE5VTEwpCi0gICAgewotICAgICAgaW50ICAgIGhuOwotICAgICAgaW50ICAgIHNpOwotCi0gICAgICBwcmludGYgKF8oIlxuU3ltYm9sIHRhYmxlIGZvciBpbWFnZTpcbiIpKTsKLSAgICAgIHByaW50ZiAoXygiICBOdW0gQnVjOiAgICBWYWx1ZSAgU2l6ZSAgIFR5cGUgICBCaW5kIE90IE5keCBOYW1lXG4iKSk7Ci0KLSAgICAgIGZvciAoaG4gPSAwOyBobiA8IG5idWNrZXRzOyBobisrKQotCXsKLQkgIGlmICghIGJ1Y2tldHMgW2huXSkKLQkgICAgY29udGludWU7Ci0KLQkgIGZvciAoc2kgPSBidWNrZXRzIFtobl07IHNpOyBzaSA9IGNoYWlucyBbc2ldKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1N5bSAqIHBzeW07Ci0KLQkgICAgICBwc3ltID0gZHluYW1pY19zeW1ib2xzICsgc2k7Ci0KLQkgICAgICBwcmludGYgKCIgICUzZCAlM2Q6ICU4bHggJTVsZCAlNnMgJTZzICUyZCAiLAotCQkgICAgICBzaSwgaG4sCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKSBwc3ltLT5zdF92YWx1ZSwKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIHBzeW0tPnN0X3NpemUsCi0JCSAgICAgIGdldF9zeW1ib2xfdHlwZSAoRUxGX1NUX1RZUEUgKHBzeW0tPnN0X2luZm8pKSwKLQkJICAgICAgZ2V0X3N5bWJvbF9iaW5kaW5nIChFTEZfU1RfQklORCAocHN5bS0+c3RfaW5mbykpLAotCQkgICAgICBwc3ltLT5zdF9vdGhlcik7Ci0KLQkgICAgICBwcmludGYgKCIlMy4zcyIsIGdldF9zeW1ib2xfaW5kZXhfdHlwZSAocHN5bS0+c3Rfc2huZHgpKTsKLQotCSAgICAgIHByaW50ZiAoIiAlc1xuIiwgZHluYW1pY19zdHJpbmdzICsgcHN5bS0+c3RfbmFtZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmIChkb19zeW1zICYmICFkb191c2luZ19keW5hbWljKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCAgICAgaTsKLQotICAgICAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKLQkgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotCSAgIGkrKywgc2VjdGlvbisrKQotCXsKLQkgIHVuc2lnbmVkIGludCAgICAgICAgICBzaTsKLQkgIGNoYXIgKiAgICAgICAgICAgICAgICBzdHJ0YWI7Ci0JICBFbGZfSW50ZXJuYWxfU3ltICogICAgc3ltdGFiOwotCSAgRWxmX0ludGVybmFsX1N5bSAqICAgIHBzeW07Ci0KLQotCSAgaWYgKCAgIHNlY3Rpb24tPnNoX3R5cGUgIT0gU0hUX1NZTVRBQgotCSAgICAgICYmIHNlY3Rpb24tPnNoX3R5cGUgIT0gU0hUX0RZTlNZTSkKLQkgICAgY29udGludWU7Ci0KLQkgIHByaW50ZiAoXygiXG5TeW1ib2wgdGFibGUgJyVzJyBjb250YWlucyAlbHUgZW50cmllczpcbiIpLAotCQkgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbiksCi0JCSAgKHVuc2lnbmVkIGxvbmcpIChzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZSkpOwotCSAgZnB1dHMgKF8oIiAgTnVtOiAgICBWYWx1ZSAgU2l6ZSBUeXBlICAgIEJpbmQgICBPdCAgTmR4IE5hbWVcbiIpLAotCQkgc3Rkb3V0KTsKLQotCSAgc3ltdGFiID0gZ2V0X2VsZl9zeW1ib2xzIChmaWxlLCBzZWN0aW9uLT5zaF9vZmZzZXQsCi0JCQkJICAgIHNlY3Rpb24tPnNoX3NpemUgLyBzZWN0aW9uLT5zaF9lbnRzaXplKTsKLQkgIGlmIChzeW10YWIgPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChzZWN0aW9uLT5zaF9saW5rID09IGVsZl9oZWFkZXIuZV9zaHN0cm5keCkKLQkgICAgc3RydGFiID0gc3RyaW5nX3RhYmxlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHN0cmluZ19zZWM7Ci0KLQkgICAgICBzdHJpbmdfc2VjID0gc2VjdGlvbl9oZWFkZXJzICsgc2VjdGlvbi0+c2hfbGluazsKLQotCSAgICAgIEdFVF9EQVRBX0FMTE9DIChzdHJpbmdfc2VjLT5zaF9vZmZzZXQsIHN0cmluZ19zZWMtPnNoX3NpemUsCi0JCQkgICAgICBzdHJ0YWIsIGNoYXIgKiwgInN0cmluZyB0YWJsZSIpOwotCSAgICB9Ci0KLQkgIGZvciAoc2kgPSAwLCBwc3ltID0gc3ltdGFiOwotCSAgICAgICBzaSA8IHNlY3Rpb24tPnNoX3NpemUgLyBzZWN0aW9uLT5zaF9lbnRzaXplOwotCSAgICAgICBzaSArKywgcHN5bSArKykKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiAgJTNkOiAlOGx4ICU1bGQgJS03cyAlLTZzICUyZCAiLAotCQkgICAgICBzaSwKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIHBzeW0tPnN0X3ZhbHVlLAotCQkgICAgICAodW5zaWduZWQgbG9uZykgcHN5bS0+c3Rfc2l6ZSwKLQkJICAgICAgZ2V0X3N5bWJvbF90eXBlIChFTEZfU1RfVFlQRSAocHN5bS0+c3RfaW5mbykpLAotCQkgICAgICBnZXRfc3ltYm9sX2JpbmRpbmcgKEVMRl9TVF9CSU5EIChwc3ltLT5zdF9pbmZvKSksCi0JCSAgICAgIHBzeW0tPnN0X290aGVyKTsKLQotCSAgICAgIGlmIChwc3ltLT5zdF9zaG5keCA9PSAwKQotCQlmcHV0cyAoIiBVTkQiLCBzdGRvdXQpOwotCSAgICAgIGVsc2UgaWYgKChwc3ltLT5zdF9zaG5keCAmIDB4ZmZmZikgPT0gMHhmZmYxKQotCQlmcHV0cyAoIiBBQlMiLCBzdGRvdXQpOwotCSAgICAgIGVsc2UgaWYgKChwc3ltLT5zdF9zaG5keCAmIDB4ZmZmZikgPT0gMHhmZmYyKQotCQlmcHV0cyAoIiBDT00iLCBzdGRvdXQpOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgiJTR4IiwgcHN5bS0+c3Rfc2huZHgpOwotCi0JICAgICAgcHJpbnRmICgiICVzIiwgc3RydGFiICsgcHN5bS0+c3RfbmFtZSk7Ci0KLQkgICAgICBpZiAoc2VjdGlvbi0+c2hfdHlwZSA9PSBTSFRfRFlOU1lNICYmCi0JCSAgdmVyc2lvbl9pbmZvIFtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJTWU0pXSAhPSAwKQotCQl7Ci0JCSAgdW5zaWduZWQgY2hhciAgIGRhdGFbMl07Ci0JCSAgdW5zaWduZWQgc2hvcnQgIHZlcnNfZGF0YTsKLQkJICB1bnNpZ25lZCBsb25nICAgb2Zmc2V0OwotCQkgIGludCAgICAgICAgICAgICBpc19ub2JpdHM7Ci0JCSAgaW50ICAgICAgICAgICAgIGNoZWNrX2RlZjsKLQotCQkgIG9mZnNldCA9IHZlcnNpb25faW5mbyBbRFRfVkVSU0lPTlRBR0lEWCAoRFRfVkVSU1lNKV0KLQkJICAgIC0gbG9hZGFkZHI7Ci0KLQkJICBHRVRfREFUQSAob2Zmc2V0ICsgc2kgKiBzaXplb2YgKHZlcnNfZGF0YSksIGRhdGEsCi0JCQkgICAgInZlcnNpb24gZGF0YSIpOwotCi0JCSAgdmVyc19kYXRhID0gYnl0ZV9nZXQgKGRhdGEsIDIpOwotCi0JCSAgaXNfbm9iaXRzID0gcHN5bS0+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFID8KLQkJICAgIChzZWN0aW9uX2hlYWRlcnMgW3BzeW0tPnN0X3NobmR4XS5zaF90eXBlID09IFNIVF9OT0JJVFMpCi0JCSAgICA6IDA7Ci0KLQkJICBjaGVja19kZWYgPSAocHN5bS0+c3Rfc2huZHggIT0gU0hOX1VOREVGKTsKLQotCQkgIGlmICgodmVyc19kYXRhICYgMHg4MDAwKSB8fCB2ZXJzX2RhdGEgPiAxKQotCQkgICAgewotCQkgICAgICBpZiAoaXNfbm9iaXRzIHx8ICEgY2hlY2tfZGVmKQotCQkJewotCQkJICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAgZXZuOwotCQkJICBFbGZfSW50ZXJuYWxfVmVybmVlZCAgaXZuOwotCQkJICBFbGZfSW50ZXJuYWxfVmVybmF1eCAgaXZuYTsKLQotCQkJICAvKiBXZSBtdXN0IHRlc3QgYm90aC4gICovCi0JCQkgIG9mZnNldCA9IHZlcnNpb25faW5mbwotCQkJICAgIFtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJORUVEKV0gLSBsb2FkYWRkcjsKLQotCQkJICBHRVRfREFUQSAob2Zmc2V0LCBldm4sICJ2ZXJzaW9uIG5lZWQiKTsKLQotCQkJICBpdm4udm5fYXV4ICA9IEJZVEVfR0VUIChldm4udm5fYXV4KTsKLQkJCSAgaXZuLnZuX25leHQgPSBCWVRFX0dFVCAoZXZuLnZuX25leHQpOwotCi0JCQkgIGRvCi0JCQkgICAgewotCQkJICAgICAgdW5zaWduZWQgbG9uZyAgdm5hX29mZjsKLQotCQkJICAgICAgdm5hX29mZiA9IG9mZnNldCArIGl2bi52bl9hdXg7Ci0KLQkJCSAgICAgIGRvCi0JCQkJewotCQkJCSAgRWxmX0V4dGVybmFsX1Zlcm5hdXggIGV2bmE7Ci0KLQkJCQkgIEdFVF9EQVRBICh2bmFfb2ZmLCBldm5hLAotCQkJCQkgICAgInZlcnNpb24gbmVlZCBhdXggKDMpIik7Ci0KLQkJCQkgIGl2bmEudm5hX290aGVyID0gQllURV9HRVQgKGV2bmEudm5hX290aGVyKTsKLQkJCQkgIGl2bmEudm5hX25leHQgID0gQllURV9HRVQgKGV2bmEudm5hX25leHQpOwotCQkJCSAgaXZuYS52bmFfbmFtZSAgPSBCWVRFX0dFVCAoZXZuYS52bmFfbmFtZSk7Ci0KLQkJCQkgIHZuYV9vZmYgKz0gaXZuYS52bmFfbmV4dDsKLQkJCQl9Ci0JCQkgICAgICB3aGlsZSAoaXZuYS52bmFfb3RoZXIgIT0gdmVyc19kYXRhCi0JCQkJICAgICAmJiBpdm5hLnZuYV9uZXh0ICE9IDApOwotCi0JCQkgICAgICBpZiAoaXZuYS52bmFfb3RoZXIgPT0gdmVyc19kYXRhKQotCQkJCWJyZWFrOwotCi0JCQkgICAgICBvZmZzZXQgKz0gaXZuLnZuX25leHQ7Ci0JCQkgICAgfQotCQkJICB3aGlsZSAoaXZuLnZuX25leHQgIT0gMCk7Ci0KLQkJCSAgaWYgKGl2bmEudm5hX290aGVyID09IHZlcnNfZGF0YSkKLQkJCSAgICB7Ci0JCQkgICAgICBwcmludGYgKCJAJXMgKCVkKSIsCi0JCQkJICAgICAgc3RydGFiICsgaXZuYS52bmFfbmFtZSwgaXZuYS52bmFfb3RoZXIpOwotCQkJICAgICAgY2hlY2tfZGVmID0gMDsKLQkJCSAgICB9Ci0JCQkgIGVsc2UgaWYgKCEgaXNfbm9iaXRzKQotCQkJICAgIGVycm9yIChfKCJiYWQgZHluYW1pYyBzeW1ib2wiKSk7Ci0JCQkgIGVsc2UKLQkJCSAgICBjaGVja19kZWYgPSAxOwotCQkJfQotCi0JCSAgICAgIGlmIChjaGVja19kZWYpCi0JCQl7Ci0JCQkgIGlmICh2ZXJzX2RhdGEgIT0gMHg4MDAxKQotCQkJICAgIHsKLQkJCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgICAgIGl2ZDsKLQkJCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICAgIGl2ZGE7Ci0JCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVyZGF1eCAgZXZkYTsKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIG9mZnNldDsKLQotCQkJICAgICAgb2Zmc2V0ID0KLQkJCQl2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUkRFRildCi0JCQkJLSBsb2FkYWRkcjsKLQotCQkJICAgICAgZG8KLQkJCQl7Ci0JCQkJICBFbGZfRXh0ZXJuYWxfVmVyZGVmICAgZXZkOwotCi0JCQkJICBHRVRfREFUQSAob2Zmc2V0LCBldmQsICJ2ZXJzaW9uIGRlZiIpOwotCi0JCQkJICBpdmQudmRfbmR4ICA9IEJZVEVfR0VUIChldmQudmRfbmR4KTsKLQkJCQkgIGl2ZC52ZF9hdXggID0gQllURV9HRVQgKGV2ZC52ZF9hdXgpOwotCQkJCSAgaXZkLnZkX25leHQgPSBCWVRFX0dFVCAoZXZkLnZkX25leHQpOwotCi0JCQkJICBvZmZzZXQgKz0gaXZkLnZkX25leHQ7Ci0JCQkJfQotCQkJICAgICAgd2hpbGUgKGl2ZC52ZF9uZHggIT0gKHZlcnNfZGF0YSAmIDB4N2ZmZikKLQkJCQkgICAgICYmIGl2ZC52ZF9uZXh0ICE9IDApOwotCi0JCQkgICAgICBvZmZzZXQgLT0gaXZkLnZkX25leHQ7Ci0JCQkgICAgICBvZmZzZXQgKz0gaXZkLnZkX2F1eDsKLQotCQkJICAgICAgR0VUX0RBVEEgKG9mZnNldCwgZXZkYSwgInZlcnNpb24gZGVmIGF1eCIpOwotCi0JCQkgICAgICBpdmRhLnZkYV9uYW1lID0gQllURV9HRVQgKGV2ZGEudmRhX25hbWUpOwotCi0JCQkgICAgICBpZiAocHN5bS0+c3RfbmFtZSAhPSBpdmRhLnZkYV9uYW1lKQotCQkJCXByaW50ZiAoKHZlcnNfZGF0YSAmIDB4ODAwMCkKLQkJCQkJPyAiQCVzIiA6ICJAQCVzIiwKLQkJCQkJc3RydGFiICsgaXZkYS52ZGFfbmFtZSk7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQl9Ci0KLQkgICAgICBwdXRjaGFyICgnXG4nKTsKLQkgICAgfQotCi0JICBmcmVlIChzeW10YWIpOwotCSAgaWYgKHN0cnRhYiAhPSBzdHJpbmdfdGFibGUpCi0JICAgIGZyZWUgKHN0cnRhYik7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZG9fc3ltcykKLSAgICBwcmludGYKLSAgICAgIChfKCJcbkR5bmFtaWMgc3ltYm9sIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgZm9yIGRpc3BsYXlpbmcgc3ltYm9scy5cbiIpKTsKLQotICBpZiAoZG9faGlzdG9ncmFtICYmIGJ1Y2tldHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgKmxlbmd0aHM7Ci0gICAgICBpbnQgKmNvdW50czsKLSAgICAgIGludCBobjsKLSAgICAgIGludCBzaTsKLSAgICAgIGludCBtYXhsZW5ndGggPSAwOwotICAgICAgaW50IG56ZXJvX2NvdW50cyA9IDA7Ci0gICAgICBpbnQgbnN5bXMgPSAwOwotCi0gICAgICBwcmludGYgKF8oIlxuSGlzdG9ncmFtIGZvciBidWNrZXQgbGlzdCBsZW5ndGggKHRvdGFsIG9mICVkIGJ1Y2tldHMpOlxuIiksCi0JICAgICAgbmJ1Y2tldHMpOwotICAgICAgcHJpbnRmIChfKCIgTGVuZ3RoICBOdW1iZXIgICAgICUlIG9mIHRvdGFsICBDb3ZlcmFnZVxuIikpOwotCi0gICAgICBsZW5ndGhzID0gKGludCAqKSBjYWxsb2MgKG5idWNrZXRzLCBzaXplb2YgKGludCkpOwotICAgICAgaWYgKGxlbmd0aHMgPT0gTlVMTCkKLQl7Ci0JICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeSIpKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGZvciAoaG4gPSAwOyBobiA8IG5idWNrZXRzOyArK2huKQotCXsKLQkgIGlmICghIGJ1Y2tldHMgW2huXSkKLQkgICAgY29udGludWU7Ci0KLQkgIGZvciAoc2kgPSBidWNrZXRzW2huXTsgc2k7IHNpID0gY2hhaW5zW3NpXSkKLQkgICAgewotCSAgICAgICsrbnN5bXM7Ci0JICAgICAgaWYgKG1heGxlbmd0aCA8ICsrbGVuZ3Roc1tobl0pCi0JCSsrbWF4bGVuZ3RoOwotCSAgICB9Ci0JfQotCi0gICAgICBjb3VudHMgPSAoaW50ICopIGNhbGxvYyAobWF4bGVuZ3RoICsgMSwgc2l6ZW9mIChpbnQpKTsKLSAgICAgIGlmIChjb3VudHMgPT0gTlVMTCkKLQl7Ci0JICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeSIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgZm9yIChobiA9IDA7IGhuIDwgbmJ1Y2tldHM7ICsraG4pCi0JKysgY291bnRzIFtsZW5ndGhzIFtobl1dOwotCi0gICAgICBwcmludGYgKCIgICAgICAwICAlLTEwZCAoJTUuMWYlJSlcbiIsCi0JICAgICAgY291bnRzWzBdLCAoY291bnRzWzBdICogMTAwLjApIC8gbmJ1Y2tldHMpOwotICAgICAgZm9yIChzaSA9IDE7IHNpIDw9IG1heGxlbmd0aDsgKytzaSkKLQl7Ci0JICBuemVyb19jb3VudHMgKz0gY291bnRzW3NpXSAqIHNpOwotCSAgcHJpbnRmICgiJTdkICAlLTEwZCAoJTUuMWYlJSkgICAgJTUuMWYlJVxuIiwKLQkJICBzaSwgY291bnRzW3NpXSwgKGNvdW50c1tzaV0gKiAxMDAuMCkgLyBuYnVja2V0cywKLQkJICAobnplcm9fY291bnRzICogMTAwLjApIC8gbnN5bXMpOwotCX0KLQotICAgICAgZnJlZSAoY291bnRzKTsKLSAgICAgIGZyZWUgKGxlbmd0aHMpOwotICAgIH0KLQotICBpZiAoYnVja2V0cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGJ1Y2tldHMpOwotICAgICAgZnJlZSAoY2hhaW5zKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3Nfc3ltaW5mbyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIGludCBpOwotCi0gIGlmIChkeW5hbWljX3N5bWluZm8gPT0gTlVMTAotICAgICAgfHwgIWRvX2R5bmFtaWMpCi0gICAgLyogTm8gc3ltaW5mbywgdGhpcyBpcyBvay4gICovCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogVGhlcmUgYmV0dGVyIHNob3VsZCBiZSBhIGR5bmFtaWMgc3ltYm9sIHNlY3Rpb24uICAqLwotICBpZiAoZHluYW1pY19zeW1ib2xzID09IE5VTEwgfHwgZHluYW1pY19zdHJpbmdzID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGR5bmFtaWNfYWRkcikKLSAgICBwcmludGYgKF8oIlxuRHluYW1pYyBpbmZvIHNlZ21lbnQgYXQgb2Zmc2V0IDB4JWx4IGNvbnRhaW5zICVkIGVudHJpZXM6XG4iKSwKLQkgICAgZHluYW1pY19zeW1pbmZvX29mZnNldCwgZHluYW1pY19zeW1pbmZvX25lbnQpOwotCi0gIHByaW50ZiAoXygiIE51bTogTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kVG8gICAgIEZsYWdzXG4iKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBkeW5hbWljX3N5bWluZm9fbmVudDsgKytpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGludCBmbGFncyA9IGR5bmFtaWNfc3ltaW5mb1tpXS5zaV9mbGFnczsKLQotICAgICAgcHJpbnRmICgiJTRkOiAlLTMwcyAiLCBpLAotCSAgICAgIGR5bmFtaWNfc3RyaW5ncyArIGR5bmFtaWNfc3ltYm9sc1tpXS5zdF9uYW1lKTsKLQotICAgICAgc3dpdGNoIChkeW5hbWljX3N5bWluZm9baV0uc2lfYm91bmR0bykKLQl7Ci0JY2FzZSBTWU1JTkZPX0JUX1NFTEY6Ci0JICBmcHV0cyAoIlNFTEYgICAgICAgIiwgc3Rkb3V0KTsKLQkgIGJyZWFrOwotCWNhc2UgU1lNSU5GT19CVF9QQVJFTlQ6Ci0JICBmcHV0cyAoIlBBUkVOVCAgICAgIiwgc3Rkb3V0KTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBpZiAoZHluYW1pY19zeW1pbmZvW2ldLnNpX2JvdW5kdG8gPiAwCi0JICAgICAgJiYgZHluYW1pY19zeW1pbmZvW2ldLnNpX2JvdW5kdG8gPCBkeW5hbWljX3NpemUpCi0JICAgIHByaW50ZiAoIiUtMTBzICIsCi0JCSAgICBkeW5hbWljX3N0cmluZ3MKLQkJICAgICsgZHluYW1pY19zZWdtZW50W2R5bmFtaWNfc3ltaW5mb1tpXS5zaV9ib3VuZHRvXS5kX3VuLmRfdmFsKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiJS0xMGQgIiwgZHluYW1pY19zeW1pbmZvW2ldLnNpX2JvdW5kdG8pOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoZmxhZ3MgJiBTWU1JTkZPX0ZMR19ESVJFQ1QpCi0JcHJpbnRmICgiIERJUkVDVCIpOwotICAgICAgaWYgKGZsYWdzICYgU1lNSU5GT19GTEdfUEFTU1RIUlUpCi0JcHJpbnRmICgiIFBBU1NUSFJVIik7Ci0gICAgICBpZiAoZmxhZ3MgJiBTWU1JTkZPX0ZMR19DT1BZKQotCXByaW50ZiAoIiBDT1BZIik7Ci0gICAgICBpZiAoZmxhZ3MgJiBTWU1JTkZPX0ZMR19MQVpZTE9BRCkKLQlwcmludGYgKCIgTEFaWUxPQUQiKTsKLQotICAgICAgcHV0cyAoIiIpOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotI2lmZGVmIFNVUFBPUlRfRElTQVNTRU1CTFkKLXN0YXRpYyB2b2lkCi1kaXNhc3NlbWJsZV9zZWN0aW9uIChzZWN0aW9uLCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIHByaW50ZiAoXygiXG5Bc3NlbWJseSBkdW1wIG9mIHNlY3Rpb24gJXNcbiIpLAotCSAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0KLSAgLyogWFhYIC0tIHRvIGJlIGRvbmUgLS0tIFhYWCAqLwotCi0gIHJldHVybiAxOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLWR1bXBfc2VjdGlvbiAoc2VjdGlvbiwgZmlsZSkKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb247Ci0gICAgIEZJTEUgKiBmaWxlOwotewotICBpbnQgICAgICAgICAgICAgYnl0ZXM7Ci0gIGludCAgICAgICAgICAgICBhZGRyOwotICB1bnNpZ25lZCBjaGFyICogZGF0YTsKLSAgdW5zaWduZWQgY2hhciAqIHN0YXJ0OwotCi0gIGJ5dGVzID0gc2VjdGlvbi0+c2hfc2l6ZTsKLQotICBpZiAoYnl0ZXMgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIlxuU2VjdGlvbiAnJXMnIGhhcyBubyBkYXRhIHRvIGR1bXAuXG4iKSwKLQkgICAgICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgZWxzZQotICAgIHByaW50ZiAoXygiXG5IZXggZHVtcCBvZiBzZWN0aW9uICclcyc6XG4iKSwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0KLSAgYWRkciA9IHNlY3Rpb24tPnNoX2FkZHI7Ci0KLSAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgYnl0ZXMsIHN0YXJ0LCB1bnNpZ25lZCBjaGFyICosCi0JCSAgInNlY3Rpb24gZGF0YSIpOwotCi0gIGRhdGEgPSBzdGFydDsKLQotICB3aGlsZSAoYnl0ZXMpCi0gICAgewotICAgICAgaW50IGo7Ci0gICAgICBpbnQgazsKLSAgICAgIGludCBsYnl0ZXM7Ci0KLSAgICAgIGxieXRlcyA9IChieXRlcyA+IDE2ID8gMTYgOiBieXRlcyk7Ci0KLSAgICAgIHByaW50ZiAoIiAgMHglOC44eCAiLCBhZGRyKTsKLQotICAgICAgc3dpdGNoIChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX0RBVEFdKQotCXsKLQljYXNlIEVMRkRBVEEyTFNCOgotCSAgZm9yIChqID0gMTU7IGogPj0gMDsgaiAtLSkKLQkgICAgewotCSAgICAgIGlmIChqIDwgbGJ5dGVzKQotCQlwcmludGYgKCIlMi4yeCIsIGRhdGEgW2pdKTsKLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIiAgIik7Ci0KLQkgICAgICBpZiAoIShqICYgMHgzKSkKLQkJcHJpbnRmICgiICIpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRUxGREFUQTJNU0I6Ci0JICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkgICAgewotCSAgICAgIGlmIChqIDwgbGJ5dGVzKQotCQlwcmludGYgKCIlMi4yeCIsIGRhdGEgW2pdKTsKLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIiAgIik7Ci0KLQkgICAgICBpZiAoKGogJiAzKSA9PSAzKQotCQlwcmludGYgKCIgIik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgZm9yIChqID0gMDsgaiA8IGxieXRlczsgaisrKQotCXsKLQkgIGsgPSBkYXRhIFtqXTsKLQkgIGlmIChrID49ICcgJyAmJiBrIDwgMHg4MCkKLQkgICAgcHJpbnRmICgiJWMiLCBrKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiLiIpOwotCX0KLQotICAgICAgcHV0Y2hhciAoJ1xuJyk7Ci0KLSAgICAgIGRhdGEgICs9IGxieXRlczsKLSAgICAgIGFkZHIgICs9IGxieXRlczsKLSAgICAgIGJ5dGVzIC09IGxieXRlczsKLSAgICB9Ci0KLSAgZnJlZSAoc3RhcnQpOwotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGludAotcmVhZF9sZWIxMjggKGRhdGEsIGxlbmd0aF9yZXR1cm4sIHNpZ24pCi0gICAgIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICAgICBpbnQgKiAgICAgICAgICAgbGVuZ3RoX3JldHVybjsKLSAgICAgaW50ICAgICAgICAgICAgIHNpZ247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW50IHJlc3VsdCA9IDA7Ci0gIHVuc2lnbmVkIGludCAgICAgIG51bV9yZWFkID0gMDsKLSAgaW50ICAgICAgICAgICAgICAgc2hpZnQgPSAwOwotICB1bnNpZ25lZCBjaGFyICAgICBieXRlOwotCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9ICogZGF0YSArKzsKLSAgICAgIG51bV9yZWFkICsrOwotCi0gICAgICByZXN1bHQgfD0gKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKLQotICAgICAgc2hpZnQgKz0gNzsKLQotICAgIH0KLSAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKLQotICBpZiAobGVuZ3RoX3JldHVybiAhPSBOVUxMKQotICAgICogbGVuZ3RoX3JldHVybiA9IG51bV9yZWFkOwotCi0gIGlmIChzaWduICYmIChzaGlmdCA8IDMyKSAmJiAoYnl0ZSAmIDB4NDApKQotICAgIHJlc3VsdCB8PSAtMSA8PCBzaGlmdDsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi10eXBlZGVmIHN0cnVjdCBTdGF0ZV9NYWNoaW5lX1JlZ2lzdGVycwotewotICB1bnNpZ25lZCBsb25nCWFkZHJlc3M7Ci0gIHVuc2lnbmVkIGludCAgZmlsZTsKLSAgdW5zaWduZWQgaW50ICBsaW5lOwotICB1bnNpZ25lZCBpbnQgIGNvbHVtbjsKLSAgaW50ICAgICAgICAgICBpc19zdG10OwotICBpbnQgICAgICAgICAgIGJhc2ljX2Jsb2NrOwotICBpbnQJICAgICAgICBlbmRfc2VxdWVuY2U7Ci0vKiBUaGlzIHZhcmlhYmxlIGhvbGQgdGhlIG51bWJlciBvZiB0aGUgbGFzdCBlbnRyeSBzZWVuCi0gICBpbiB0aGUgRmlsZSBUYWJsZS4gICovCi0gIHVuc2lnbmVkIGludCAgbGFzdF9maWxlX2VudHJ5OwotfSBTTVI7Ci0KLXN0YXRpYyBTTVIgc3RhdGVfbWFjaGluZV9yZWdzOwotCi1zdGF0aWMgdm9pZAotcmVzZXRfc3RhdGVfbWFjaGluZSAoaXNfc3RtdCkKLSAgICAgaW50IGlzX3N0bXQ7Ci17Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzID0gMDsKLSAgc3RhdGVfbWFjaGluZV9yZWdzLmZpbGUgPSAxOwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MubGluZSA9IDE7Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5jb2x1bW4gPSAwOwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MuaXNfc3RtdCA9IGlzX3N0bXQ7Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5iYXNpY19ibG9jayA9IDA7Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5lbmRfc2VxdWVuY2UgPSAwOwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MubGFzdF9maWxlX2VudHJ5ID0gMDsKLX0KLQotLyogSGFuZGxlZCBhbiBleHRlbmQgbGluZSBvcC4gIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBlbmQKLSAgIG9mIHNlcXVlbmNlLiAgKi8KLXN0YXRpYyBpbnQKLXByb2Nlc3NfZXh0ZW5kZWRfbGluZV9vcCAoZGF0YSwgaXNfc3RtdCkKLSAgICAgdW5zaWduZWQgY2hhciAqIGRhdGE7Ci0gICAgIGludCBpc19zdG10OwotewotICB1bnNpZ25lZCBjaGFyICAgb3BfY29kZTsKLSAgaW50ICAgICAgICAgICAgIGJ5dGVzX3JlYWQ7Ci0gIHVuc2lnbmVkIGludCAgICBsZW47Ci0gIHVuc2lnbmVkIGNoYXIgKiBuYW1lOwotICB1bnNpZ25lZCBsb25nICAgYWRyOwotICAKLSAgbGVuID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0gIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQotICBpZiAobGVuID09IDApCi0gICAgewotICAgICAgd2FybiAoXygiYmFkbHkgZm9ybWVkIGV4dGVuZGVkIGxpbmUgb3AgZW5jb3VudGVyZWQhIikpOwotICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQ7Ci0gICAgfQotCi0gIGxlbiArPSBieXRlc19yZWFkOwotICBvcF9jb2RlID0gKiBkYXRhICsrOwotCi0gIHByaW50ZiAoXygiICBFeHRlbmRlZCBvcGNvZGUgJWQ6ICIpLCBvcF9jb2RlKTsKLSAgCi0gIHN3aXRjaCAob3BfY29kZSkKLSAgICB7Ci0gICAgY2FzZSBEV19MTkVfZW5kX3NlcXVlbmNlOgotICAgICAgcHJpbnRmIChfKCJFbmQgb2YgU2VxdWVuY2VcblxuIikpOwotICAgICAgcmVzZXRfc3RhdGVfbWFjaGluZSAoaXNfc3RtdCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfTE5FX3NldF9hZGRyZXNzOgotICAgICAgLyogWFhYIC0gYXNzdW1wdGlvbiBoZXJlIHRoYXQgYWRkcmVzcyBzaXplIGlzIDQhICovCi0gICAgICBhZHIgPSBieXRlX2dldCAoZGF0YSwgNCk7Ci0gICAgICBwcmludGYgKF8oInNldCBBZGRyZXNzIHRvIDB4JWx4XG4iKSwgYWRyKTsKLSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzID0gYWRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0xORV9kZWZpbmVfZmlsZToKLSAgICAgIHByaW50ZiAoXygiICBkZWZpbmUgbmV3IEZpbGUgVGFibGUgZW50cnlcbiIpKTsKLSAgICAgIHByaW50ZiAoXygiICBFbnRyeVx0RGlyXHRUaW1lXHRTaXplXHROYW1lXG4iKSk7Ci0JIAotICAgICAgcHJpbnRmIChfKCIgICAlZFx0IiksICsrIHN0YXRlX21hY2hpbmVfcmVncy5sYXN0X2ZpbGVfZW50cnkpOwotICAgICAgbmFtZSA9IGRhdGE7Ci0gICAgICBkYXRhICs9IHN0cmxlbiAoZGF0YSkgKyAxOwotICAgICAgcHJpbnRmIChfKCIlbHVcdCIpLCByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKSk7Ci0gICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBwcmludGYgKF8oIiVsdVx0IiksIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApKTsKLSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIHByaW50ZiAoXygiJWx1XHQiKSwgcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCkpOwotICAgICAgcHJpbnRmIChfKCIlc1xuXG4iKSwgbmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBwcmludGYgKF8oIlVOS05PV046IGxlbmd0aCAlZFxuIiksIGxlbiAtIGJ5dGVzX3JlYWQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBsZW47Ci19Ci0KLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19saW5lcyAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgc3RhcnQ7Ci0gICAgIEZJTEUgKiAgICAgICAgICAgICAgICBmaWxlOwotewotICBEV0FSRjJfRXh0ZXJuYWxfTGluZUluZm8gKiBleHRlcm5hbDsKLSAgRFdBUkYyX0ludGVybmFsX0xpbmVJbmZvICAgaW5mbzsKLSAgdW5zaWduZWQgY2hhciAqICAgICAgICAgICAgc3RhbmRhcmRfb3Bjb2RlczsKLSAgdW5zaWduZWQgY2hhciAqICAgICAgICAgICAgZGF0YSA9IHN0YXJ0OwotICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICBlbmQgID0gc3RhcnQgKyBzZWN0aW9uLT5zaF9zaXplOwotICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICBlbmRfb2Zfc2VxdWVuY2U7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0KLSAgcHJpbnRmIChfKCJcbkR1bXAgb2YgZGVidWcgY29udGVudHMgb2Ygc2VjdGlvbiAlczpcblxuIiksCi0JICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICB3aGlsZSAoZGF0YSA8IGVuZCkKLSAgICB7Ci0gICAgICBleHRlcm5hbCA9IChEV0FSRjJfRXh0ZXJuYWxfTGluZUluZm8gKikgZGF0YTsKLQotICAgICAgLyogQ2hlY2sgdGhlIGxlbmd0aCBvZiB0aGUgYmxvY2suICAqLwotICAgICAgaW5mby5saV9sZW5ndGggPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX2xlbmd0aCk7Ci0gICAgICBpZiAoaW5mby5saV9sZW5ndGggPiBzZWN0aW9uLT5zaF9zaXplKQotCXsKLQkgIHdhcm4KLQkgICAgKF8oIlRoZSBsaW5lIGluZm8gYXBwZWFycyB0byBiZSBjb3JydXB0IC0gdGhlIHNlY3Rpb24gaXMgdG9vIHNtYWxsXG4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICAKLSAgICAgIC8qIENoZWNrIGl0cyB2ZXJzaW9uIG51bWJlci4gICovCi0gICAgICBpbmZvLmxpX3ZlcnNpb24gPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX3ZlcnNpb24pOwotICAgICAgaWYgKGluZm8ubGlfdmVyc2lvbiAhPSAyKQotCXsKLQkgIHdhcm4gKF8oIk9ubHkgRFdBUkYgdmVyc2lvbiAyIGxpbmUgaW5mbyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgCi0gICAgICBpbmZvLmxpX3Byb2xvZ3VlX2xlbmd0aCA9IEJZVEVfR0VUIChleHRlcm5hbC0+bGlfcHJvbG9ndWVfbGVuZ3RoKTsKLSAgICAgIGluZm8ubGlfbWluX2luc25fbGVuZ3RoID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9taW5faW5zbl9sZW5ndGgpOwotICAgICAgaW5mby5saV9kZWZhdWx0X2lzX3N0bXQgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX2RlZmF1bHRfaXNfc3RtdCk7Ci0gICAgICBpbmZvLmxpX2xpbmVfYmFzZSAgICAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+bGlfbGluZV9iYXNlKTsKLSAgICAgIGluZm8ubGlfbGluZV9yYW5nZSAgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9saW5lX3JhbmdlKTsKLSAgICAgIGluZm8ubGlfb3Bjb2RlX2Jhc2UgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9vcGNvZGVfYmFzZSk7Ci0gICAgICAKLSAgICAgIC8qIFNpZ24gZXh0ZW5kIHRoZSBsaW5lIGJhc2UgZmllbGQuICAqLwotICAgICAgaW5mby5saV9saW5lX2Jhc2UgPDw9IDI0OwotICAgICAgaW5mby5saV9saW5lX2Jhc2UgPj49IDI0OwotICAgICAgCi0gICAgICBwcmludGYgKF8oIiAgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICAlbGRcbiIpLCBpbmZvLmxpX2xlbmd0aCk7Ci0gICAgICBwcmludGYgKF8oIiAgRFdBUkYgVmVyc2lvbjogICAgICAgICAgICAgICAlZFxuIiksIGluZm8ubGlfdmVyc2lvbik7Ci0gICAgICBwcmludGYgKF8oIiAgUHJvbGd1ZSBMZW5ndGg6ICAgICAgICAgICAgICAlZFxuIiksIGluZm8ubGlfcHJvbG9ndWVfbGVuZ3RoKTsKLSAgICAgIHByaW50ZiAoXygiICBNaW5pbXVtIEluc3RydWN0aW9uIExlbmd0aDogICVkXG4iKSwgaW5mby5saV9taW5faW5zbl9sZW5ndGgpOwotICAgICAgcHJpbnRmIChfKCIgIEluaXRpYWwgdmFsdWUgb2YgJ2lzX3N0bXQnOiAgJWRcbiIpLCBpbmZvLmxpX2RlZmF1bHRfaXNfc3RtdCk7Ci0gICAgICBwcmludGYgKF8oIiAgTGluZSBCYXNlOiAgICAgICAgICAgICAgICAgICAlZFxuIiksIGluZm8ubGlfbGluZV9iYXNlKTsKLSAgICAgIHByaW50ZiAoXygiICBMaW5lIFJhbmdlOiAgICAgICAgICAgICAgICAgICVkXG4iKSwgaW5mby5saV9saW5lX3JhbmdlKTsKLSAgICAgIHByaW50ZiAoXygiICBPcGNvZGUgQmFzZTogICAgICAgICAgICAgICAgICVkXG4iKSwgaW5mby5saV9vcGNvZGVfYmFzZSk7Ci0KLSAgICAgIGVuZF9vZl9zZXF1ZW5jZSA9IGRhdGEgKyBpbmZvLmxpX2xlbmd0aCArIHNpemVvZiAoaW5mby5saV9sZW5ndGgpOwotCi0gICAgICByZXNldF9zdGF0ZV9tYWNoaW5lIChpbmZvLmxpX2RlZmF1bHRfaXNfc3RtdCk7Ci0gICAgICAKLSAgICAgIC8qIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBPcGNvZGVzIHRhYmxlLiAgKi8KLSAgICAgIHN0YW5kYXJkX29wY29kZXMgPSBkYXRhICsgc2l6ZW9mICgqIGV4dGVybmFsKTsKLSAgICAgIAotICAgICAgcHJpbnRmIChfKCJcbiBPcGNvZGVzOlxuIikpOwotICAgICAgCi0gICAgICBmb3IgKGkgPSAxOyBpIDwgaW5mby5saV9vcGNvZGVfYmFzZTsgaSsrKQotCXByaW50ZiAoXygiICBPcGNvZGUgJWQgaGFzICVkIGFyZ3NcbiIpLCBpLCBzdGFuZGFyZF9vcGNvZGVzW2ldKTsKLSAgICAgIAotICAgICAgLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIERpcmVjdG9yeSB0YWJsZS4gICovCi0gICAgICBkYXRhID0gc3RhbmRhcmRfb3Bjb2RlcyArIGluZm8ubGlfb3Bjb2RlX2Jhc2UgLSAxOwotICAgICAgCi0gICAgICBpZiAoKiBkYXRhID09IDApCi0JcHJpbnRmIChfKCJcbiBUaGUgRGlyZWN0b3J5IFRhYmxlIGlzIGVtcHR5LlxuIikpOwotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoXygiXG4gVGhlIERpcmVjdG9yeSBUYWJsZTpcbiIpKTsKLQkgIAotCSAgd2hpbGUgKCogZGF0YSAhPSAwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCIgICVzXG4iKSwgZGF0YSk7Ci0JICAgICAgCi0JICAgICAgZGF0YSArPSBzdHJsZW4gKGRhdGEpICsgMTsKLQkgICAgfQotCX0KLSAgICAgIAotICAgICAgLyogU2tpcCB0aGUgTlVMIGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlLiAgKi8KLSAgICAgIGRhdGEgKys7Ci0gICAgICAKLSAgICAgIC8qIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBGaWxlIE5hbWUgdGFibGUuICAqLwotICAgICAgaWYgKCogZGF0YSA9PSAwKQotCXByaW50ZiAoXygiXG4gVGhlIEZpbGUgTmFtZSBUYWJsZSBpcyBlbXB0eS5cbiIpKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKF8oIlxuIFRoZSBGaWxlIE5hbWUgVGFibGU6XG4iKSk7Ci0JICBwcmludGYgKF8oIiAgRW50cnlcdERpclx0VGltZVx0U2l6ZVx0TmFtZVxuIikpOwotCSAgCi0JICB3aGlsZSAoKiBkYXRhICE9IDApCi0JICAgIHsKLQkgICAgICBjaGFyICogbmFtZTsKLQkgICAgICBpbnQgYnl0ZXNfcmVhZDsKLQkgICAgICAKLQkgICAgICBwcmludGYgKF8oIiAgJWRcdCIpLCArKyBzdGF0ZV9tYWNoaW5lX3JlZ3MubGFzdF9maWxlX2VudHJ5KTsKLQkgICAgICBuYW1lID0gZGF0YTsKLQkgICAgICAKLQkgICAgICBkYXRhICs9IHN0cmxlbiAoZGF0YSkgKyAxOwotCSAgICAgIAotCSAgICAgIHByaW50ZiAoXygiJWx1XHQiKSwgcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCkpOwotCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBwcmludGYgKF8oIiVsdVx0IiksIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApKTsKLQkgICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0JICAgICAgcHJpbnRmIChfKCIlbHVcdCIpLCByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKSk7Ci0JICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotCSAgICAgIHByaW50ZiAoXygiJXNcbiIpLCBuYW1lKTsKLQkgICAgfQotCX0KLSAgICAgIAotICAgICAgLyogU2tpcCB0aGUgTlVMIGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlLiAgKi8KLSAgICAgIGRhdGEgKys7Ci0gICAgICAKLSAgICAgIC8qIE5vdyBkaXNwbGF5IHRoZSBzdGF0ZW1lbnRzLiAgKi8KLSAgICAgIHByaW50ZiAoXygiXG4gTGluZSBOdW1iZXIgU3RhdGVtZW50czpcbiIpKTsKLSAgICAgIAotICAgICAgCi0gICAgICB3aGlsZSAoZGF0YSA8IGVuZF9vZl9zZXF1ZW5jZSkKLQl7Ci0JICB1bnNpZ25lZCBjaGFyIG9wX2NvZGU7Ci0JICBpbnQgICAgICAgICAgIGFkdjsKLQkgIGludCAgICAgICAgICAgYnl0ZXNfcmVhZDsKLQkgIAotCSAgb3BfY29kZSA9ICogZGF0YSArKzsKLQkgIAotCSAgc3dpdGNoIChvcF9jb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgRFdfTE5TX2V4dGVuZGVkX29wOgotCSAgICAgIGRhdGEgKz0gcHJvY2Vzc19leHRlbmRlZF9saW5lX29wIChkYXRhLCBpbmZvLmxpX2RlZmF1bHRfaXNfc3RtdCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgRFdfTE5TX2NvcHk6Ci0JICAgICAgcHJpbnRmIChfKCIgIENvcHlcbiIpKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBEV19MTlNfYWR2YW5jZV9wYzoKLQkgICAgICBhZHYgPSBpbmZvLmxpX21pbl9pbnNuX2xlbmd0aCAqIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyArPSBhZHY7Ci0JICAgICAgcHJpbnRmIChfKCIgIEFkdmFuY2UgUEMgYnkgJWQgdG8gJWx4XG4iKSwgYWR2LAotCQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgRFdfTE5TX2FkdmFuY2VfbGluZToKLQkgICAgICBhZHYgPSByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAxKTsKLQkgICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmxpbmUgKz0gYWR2OwotCSAgICAgIHByaW50ZiAoXygiICBBZHZhbmNlIExpbmUgYnkgJWQgdG8gJWRcbiIpLCBhZHYsCi0JCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5saW5lKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBEV19MTlNfc2V0X2ZpbGU6Ci0JICAgICAgYWR2ID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0JICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotCSAgICAgIHByaW50ZiAoXygiICBTZXQgRmlsZSBOYW1lIHRvIGVudHJ5ICVkIGluIHRoZSBGaWxlIE5hbWUgVGFibGVcbiIpLAotCQkgICAgICBhZHYpOwotCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5maWxlID0gYWR2OwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIERXX0xOU19zZXRfY29sdW1uOgotCSAgICAgIGFkdiA9IHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBwcmludGYgKF8oIiAgU2V0IGNvbHVtbiB0byAlZFxuIiksIGFkdik7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmNvbHVtbiA9IGFkdjsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBEV19MTlNfbmVnYXRlX3N0bXQ6Ci0JICAgICAgYWR2ID0gc3RhdGVfbWFjaGluZV9yZWdzLmlzX3N0bXQ7Ci0JICAgICAgYWR2ID0gISBhZHY7Ci0JICAgICAgcHJpbnRmIChfKCIgIFNldCBpc19zdG10IHRvICVkXG4iKSwgYWR2KTsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuaXNfc3RtdCA9IGFkdjsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBEV19MTlNfc2V0X2Jhc2ljX2Jsb2NrOgotCSAgICAgIHByaW50ZiAoXygiICBTZXQgYmFzaWMgYmxvY2tcbiIpKTsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYmFzaWNfYmxvY2sgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIERXX0xOU19jb25zdF9hZGRfcGM6Ci0JICAgICAgYWR2ID0gKDI1NSAtIGluZm8ubGlfb3Bjb2RlX2Jhc2UpIC8gaW5mby5saV9saW5lX3JhbmdlOwotCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzICs9IGFkdjsKLQkgICAgICBwcmludGYgKF8oIiAgQWR2YW5jZSBQQyBieSBjb25zdGFudCAlZCB0byAweCVseFxuIiksIGFkdiwKLQkJICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MpOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIERXX0xOU19maXhlZF9hZHZhbmNlX3BjOgotCSAgICAgIGFkdiA9IGJ5dGVfZ2V0IChkYXRhLCAyKTsKLQkgICAgICBkYXRhICs9IDI7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MgKz0gYWR2OwotCSAgICAgIHByaW50ZiAoXygiICBBZHZhbmNlIFBDIGJ5IGZpeGVkIHNpemUgYW1vdW50ICVkIHRvIDB4JWx4XG4iKSwKLQkJICAgICAgYWR2LCBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgb3BfY29kZSAtPSBpbmZvLmxpX29wY29kZV9iYXNlOwotCSAgICAgIGFkdiAgICAgID0gKG9wX2NvZGUgLyBpbmZvLmxpX2xpbmVfcmFuZ2UpICogaW5mby5saV9taW5faW5zbl9sZW5ndGg7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MgKz0gYWR2OwotCSAgICAgIHByaW50ZiAoXygiICBTcGVjaWFsIG9wY29kZSAlZDogYWR2YW5jZSBBZGRyZXNzIGJ5ICVkIHRvIDB4JWx4IiksCi0JCSAgICAgIG9wX2NvZGUsIGFkdiwgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MpOwotCSAgICAgIGFkdiAgICArPSAob3BfY29kZSAlIGluZm8ubGlfbGluZV9yYW5nZSkgKyBpbmZvLmxpX2xpbmVfYmFzZTsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MubGluZSArPSBhZHY7Ci0JICAgICAgcHJpbnRmIChfKCIgYW5kIExpbmUgYnkgJWQgdG8gJWRcbiIpLAotCQkgICAgICBhZHYsIHN0YXRlX21hY2hpbmVfcmVncy5saW5lKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotICAKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWRpc3BsYXlfZGVidWdfcHVibmFtZXMgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZTsKLXsKLSAgRFdBUkYyX0V4dGVybmFsX1B1Yk5hbWVzICogZXh0ZXJuYWw7Ci0gIERXQVJGMl9JbnRlcm5hbF9QdWJOYW1lcyAgIHB1Ym5hbWVzOwotICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICBlbmQ7Ci0KLSAgZW5kID0gc3RhcnQgKyBzZWN0aW9uLT5zaF9zaXplOwotCi0gIHByaW50ZiAoXygiQ29udGVudHMgb2YgdGhlICVzIHNlY3Rpb246XG5cbiIpLCBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICB3aGlsZSAoc3RhcnQgPCBlbmQpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqIGRhdGE7Ci0gICAgICB1bnNpZ25lZCBsb25nICAgb2Zmc2V0OwotCi0gICAgICBleHRlcm5hbCA9IChEV0FSRjJfRXh0ZXJuYWxfUHViTmFtZXMgKikgc3RhcnQ7Ci0KLSAgICAgIHB1Ym5hbWVzLnBuX2xlbmd0aCAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBuX2xlbmd0aCk7Ci0gICAgICBwdWJuYW1lcy5wbl92ZXJzaW9uID0gQllURV9HRVQgKGV4dGVybmFsLT5wbl92ZXJzaW9uKTsKLSAgICAgIHB1Ym5hbWVzLnBuX29mZnNldCAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBuX29mZnNldCk7Ci0gICAgICBwdWJuYW1lcy5wbl9zaXplICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5wbl9zaXplKTsKLQotICAgICAgZGF0YSAgID0gc3RhcnQgKyBzaXplb2YgKCogZXh0ZXJuYWwpOwotICAgICAgc3RhcnQgKz0gcHVibmFtZXMucG5fbGVuZ3RoICsgc2l6ZW9mIChleHRlcm5hbC0+cG5fbGVuZ3RoKTsKLQotICAgICAgaWYgKHB1Ym5hbWVzLnBuX3ZlcnNpb24gIT0gMikKLQl7Ci0JICB3YXJuIChfKCJPbmx5IERXQVJGIDIgcHVibmFtZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQiKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHByaW50ZiAoXygiICBMZW5ndGg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWxkXG4iKSwKLQkgICAgICBwdWJuYW1lcy5wbl9sZW5ndGgpOwotICAgICAgcHJpbnRmIChfKCIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlZFxuIiksCi0JICAgICAgcHVibmFtZXMucG5fdmVyc2lvbik7Ci0gICAgICBwcmludGYgKF8oIiAgT2Zmc2V0IGludG8gLmRlYnVnX2luZm8gc2VjdGlvbjogICAgICVsZFxuIiksCi0JICAgICAgcHVibmFtZXMucG5fb2Zmc2V0KTsKLSAgICAgIHByaW50ZiAoXygiICBTaXplIG9mIGFyZWEgaW4gLmRlYnVnX2luZm8gc2VjdGlvbjogJWxkXG4iKSwKLQkgICAgICBwdWJuYW1lcy5wbl9zaXplKTsKLQotICAgICAgcHJpbnRmIChfKCJcbiAgICBPZmZzZXRcdE5hbWVcbiIpKTsKLQotICAgICAgZG8KLQl7Ci0JICBvZmZzZXQgPSBieXRlX2dldCAoZGF0YSwgNCk7Ci0KLQkgIGlmIChvZmZzZXQgIT0gMCkKLQkgICAgewotCSAgICAgIGRhdGEgKz0gNDsKLQkgICAgICBwcmludGYgKCIgICAgJWxkXHRcdCVzXG4iLCBvZmZzZXQsIGRhdGEpOwotCSAgICAgIGRhdGEgKz0gc3RybGVuIChkYXRhKSArIDE7Ci0JICAgIH0KLQl9Ci0gICAgICB3aGlsZSAob2Zmc2V0ICE9IDApOwotICAgIH0KLQotICBwcmludGYgKCJcbiIpOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X1RBR19uYW1lICh0YWcpCi0gICAgIHVuc2lnbmVkIGxvbmcgdGFnOwotewotICBzd2l0Y2ggKHRhZykKLSAgICB7Ci0gICAgY2FzZSBEV19UQUdfcGFkZGluZzogcmV0dXJuICJEV19UQUdfcGFkZGluZyI7Ci0gICAgY2FzZSBEV19UQUdfYXJyYXlfdHlwZTogcmV0dXJuICJEV19UQUdfYXJyYXlfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfY2xhc3NfdHlwZTogcmV0dXJuICJEV19UQUdfY2xhc3NfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfZW50cnlfcG9pbnQ6IHJldHVybiAiRFdfVEFHX2VudHJ5X3BvaW50IjsKLSAgICBjYXNlIERXX1RBR19lbnVtZXJhdGlvbl90eXBlOiByZXR1cm4gIkRXX1RBR19lbnVtZXJhdGlvbl90eXBlIjsKLSAgICBjYXNlIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyOiByZXR1cm4gIkRXX1RBR19mb3JtYWxfcGFyYW1ldGVyIjsKLSAgICBjYXNlIERXX1RBR19pbXBvcnRlZF9kZWNsYXJhdGlvbjogcmV0dXJuICJEV19UQUdfaW1wb3J0ZWRfZGVjbGFyYXRpb24iOwotICAgIGNhc2UgRFdfVEFHX2xhYmVsOiByZXR1cm4gIkRXX1RBR19sYWJlbCI7Ci0gICAgY2FzZSBEV19UQUdfbGV4aWNhbF9ibG9jazogcmV0dXJuICJEV19UQUdfbGV4aWNhbF9ibG9jayI7Ci0gICAgY2FzZSBEV19UQUdfbWVtYmVyOiByZXR1cm4gIkRXX1RBR19tZW1iZXIiOwotICAgIGNhc2UgRFdfVEFHX3BvaW50ZXJfdHlwZTogcmV0dXJuICJEV19UQUdfcG9pbnRlcl90eXBlIjsKLSAgICBjYXNlIERXX1RBR19yZWZlcmVuY2VfdHlwZTogcmV0dXJuICJEV19UQUdfcmVmZXJlbmNlX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX2NvbXBpbGVfdW5pdDogcmV0dXJuICJEV19UQUdfY29tcGlsZV91bml0IjsKLSAgICBjYXNlIERXX1RBR19zdHJpbmdfdHlwZTogcmV0dXJuICJEV19UQUdfc3RyaW5nX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3N0cnVjdHVyZV90eXBlOiByZXR1cm4gIkRXX1RBR19zdHJ1Y3R1cmVfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfc3Vicm91dGluZV90eXBlOiByZXR1cm4gIkRXX1RBR19zdWJyb3V0aW5lX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3R5cGVkZWY6IHJldHVybiAiRFdfVEFHX3R5cGVkZWYiOwotICAgIGNhc2UgRFdfVEFHX3VuaW9uX3R5cGU6IHJldHVybiAiRFdfVEFHX3VuaW9uX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnM6IHJldHVybiAiRFdfVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnMiOwotICAgIGNhc2UgRFdfVEFHX3ZhcmlhbnQ6IHJldHVybiAiRFdfVEFHX3ZhcmlhbnQiOwotICAgIGNhc2UgRFdfVEFHX2NvbW1vbl9ibG9jazogcmV0dXJuICJEV19UQUdfY29tbW9uX2Jsb2NrIjsKLSAgICBjYXNlIERXX1RBR19jb21tb25faW5jbHVzaW9uOiByZXR1cm4gIkRXX1RBR19jb21tb25faW5jbHVzaW9uIjsKLSAgICBjYXNlIERXX1RBR19pbmhlcml0YW5jZTogcmV0dXJuICJEV19UQUdfaW5oZXJpdGFuY2UiOwotICAgIGNhc2UgRFdfVEFHX2lubGluZWRfc3Vicm91dGluZTogcmV0dXJuICJEV19UQUdfaW5saW5lZF9zdWJyb3V0aW5lIjsKLSAgICBjYXNlIERXX1RBR19tb2R1bGU6IHJldHVybiAiRFdfVEFHX21vZHVsZSI7Ci0gICAgY2FzZSBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlOiByZXR1cm4gIkRXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3NldF90eXBlOiByZXR1cm4gIkRXX1RBR19zZXRfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfc3VicmFuZ2VfdHlwZTogcmV0dXJuICJEV19UQUdfc3VicmFuZ2VfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfd2l0aF9zdG10OiByZXR1cm4gIkRXX1RBR193aXRoX3N0bXQiOwotICAgIGNhc2UgRFdfVEFHX2FjY2Vzc19kZWNsYXJhdGlvbjogcmV0dXJuICJEV19UQUdfYWNjZXNzX2RlY2xhcmF0aW9uIjsKLSAgICBjYXNlIERXX1RBR19iYXNlX3R5cGU6IHJldHVybiAiRFdfVEFHX2Jhc2VfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfY2F0Y2hfYmxvY2s6IHJldHVybiAiRFdfVEFHX2NhdGNoX2Jsb2NrIjsKLSAgICBjYXNlIERXX1RBR19jb25zdF90eXBlOiByZXR1cm4gIkRXX1RBR19jb25zdF90eXBlIjsKLSAgICBjYXNlIERXX1RBR19jb25zdGFudDogcmV0dXJuICJEV19UQUdfY29uc3RhbnQiOwotICAgIGNhc2UgRFdfVEFHX2VudW1lcmF0b3I6IHJldHVybiAiRFdfVEFHX2VudW1lcmF0b3IiOwotICAgIGNhc2UgRFdfVEFHX2ZpbGVfdHlwZTogcmV0dXJuICJEV19UQUdfZmlsZV90eXBlIjsKLSAgICBjYXNlIERXX1RBR19mcmllbmQ6IHJldHVybiAiRFdfVEFHX2ZyaWVuZCI7Ci0gICAgY2FzZSBEV19UQUdfbmFtZWxpc3Q6IHJldHVybiAiRFdfVEFHX25hbWVsaXN0IjsKLSAgICBjYXNlIERXX1RBR19uYW1lbGlzdF9pdGVtOiByZXR1cm4gIkRXX1RBR19uYW1lbGlzdF9pdGVtIjsKLSAgICBjYXNlIERXX1RBR19wYWNrZWRfdHlwZTogcmV0dXJuICJEV19UQUdfcGFja2VkX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3N1YnByb2dyYW06IHJldHVybiAiRFdfVEFHX3N1YnByb2dyYW0iOwotICAgIGNhc2UgRFdfVEFHX3RlbXBsYXRlX3R5cGVfcGFyYW06IHJldHVybiAiRFdfVEFHX3RlbXBsYXRlX3R5cGVfcGFyYW0iOwotICAgIGNhc2UgRFdfVEFHX3RlbXBsYXRlX3ZhbHVlX3BhcmFtOiByZXR1cm4gIkRXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbSI7Ci0gICAgY2FzZSBEV19UQUdfdGhyb3duX3R5cGU6IHJldHVybiAiRFdfVEFHX3Rocm93bl90eXBlIjsKLSAgICBjYXNlIERXX1RBR190cnlfYmxvY2s6IHJldHVybiAiRFdfVEFHX3RyeV9ibG9jayI7Ci0gICAgY2FzZSBEV19UQUdfdmFyaWFudF9wYXJ0OiByZXR1cm4gIkRXX1RBR192YXJpYW50X3BhcnQiOwotICAgIGNhc2UgRFdfVEFHX3ZhcmlhYmxlOiByZXR1cm4gIkRXX1RBR192YXJpYWJsZSI7Ci0gICAgY2FzZSBEV19UQUdfdm9sYXRpbGVfdHlwZTogcmV0dXJuICJEV19UQUdfdm9sYXRpbGVfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfTUlQU19sb29wOiByZXR1cm4gIkRXX1RBR19NSVBTX2xvb3AiOwotICAgIGNhc2UgRFdfVEFHX2Zvcm1hdF9sYWJlbDogcmV0dXJuICJEV19UQUdfZm9ybWF0X2xhYmVsIjsKLSAgICBjYXNlIERXX1RBR19mdW5jdGlvbl90ZW1wbGF0ZTogcmV0dXJuICJEV19UQUdfZnVuY3Rpb25fdGVtcGxhdGUiOwotICAgIGNhc2UgRFdfVEFHX2NsYXNzX3RlbXBsYXRlOiByZXR1cm4gIkRXX1RBR19jbGFzc190ZW1wbGF0ZSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHsKLQlzdGF0aWMgY2hhciBidWZmZXIgWzEwMF07Ci0KLQlzcHJpbnRmIChidWZmZXIsIF8oIlVua25vd24gVEFHIHZhbHVlOiAlbHgiKSwgdGFnKTsKLQlyZXR1cm4gYnVmZmVyOwotICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X0FUX25hbWUgKGF0dHJpYnV0ZSkKLSAgICAgdW5zaWduZWQgbG9uZyBhdHRyaWJ1dGU7Ci17Ci0gIHN3aXRjaCAoYXR0cmlidXRlKQotICAgIHsKLSAgICBjYXNlIERXX0FUX3NpYmxpbmc6IHJldHVybiAiRFdfQVRfc2libGluZyI7Ci0gICAgY2FzZSBEV19BVF9sb2NhdGlvbjogcmV0dXJuICJEV19BVF9sb2NhdGlvbiI7Ci0gICAgY2FzZSBEV19BVF9uYW1lOiByZXR1cm4gIkRXX0FUX25hbWUiOwotICAgIGNhc2UgRFdfQVRfb3JkZXJpbmc6IHJldHVybiAiRFdfQVRfb3JkZXJpbmciOwotICAgIGNhc2UgRFdfQVRfc3Vic2NyX2RhdGE6IHJldHVybiAiRFdfQVRfc3Vic2NyX2RhdGEiOwotICAgIGNhc2UgRFdfQVRfYnl0ZV9zaXplOiByZXR1cm4gIkRXX0FUX2J5dGVfc2l6ZSI7Ci0gICAgY2FzZSBEV19BVF9iaXRfb2Zmc2V0OiByZXR1cm4gIkRXX0FUX2JpdF9vZmZzZXQiOwotICAgIGNhc2UgRFdfQVRfYml0X3NpemU6IHJldHVybiAiRFdfQVRfYml0X3NpemUiOwotICAgIGNhc2UgRFdfQVRfZWxlbWVudF9saXN0OiByZXR1cm4gIkRXX0FUX2VsZW1lbnRfbGlzdCI7Ci0gICAgY2FzZSBEV19BVF9zdG10X2xpc3Q6IHJldHVybiAiRFdfQVRfc3RtdF9saXN0IjsKLSAgICBjYXNlIERXX0FUX2xvd19wYzogcmV0dXJuICJEV19BVF9sb3dfcGMiOwotICAgIGNhc2UgRFdfQVRfaGlnaF9wYzogcmV0dXJuICJEV19BVF9oaWdoX3BjIjsKLSAgICBjYXNlIERXX0FUX2xhbmd1YWdlOiByZXR1cm4gIkRXX0FUX2xhbmd1YWdlIjsKLSAgICBjYXNlIERXX0FUX21lbWJlcjogcmV0dXJuICJEV19BVF9tZW1iZXIiOwotICAgIGNhc2UgRFdfQVRfZGlzY3I6IHJldHVybiAiRFdfQVRfZGlzY3IiOwotICAgIGNhc2UgRFdfQVRfZGlzY3JfdmFsdWU6IHJldHVybiAiRFdfQVRfZGlzY3JfdmFsdWUiOwotICAgIGNhc2UgRFdfQVRfdmlzaWJpbGl0eTogcmV0dXJuICJEV19BVF92aXNpYmlsaXR5IjsKLSAgICBjYXNlIERXX0FUX2ltcG9ydDogcmV0dXJuICJEV19BVF9pbXBvcnQiOwotICAgIGNhc2UgRFdfQVRfc3RyaW5nX2xlbmd0aDogcmV0dXJuICJEV19BVF9zdHJpbmdfbGVuZ3RoIjsKLSAgICBjYXNlIERXX0FUX2NvbW1vbl9yZWZlcmVuY2U6IHJldHVybiAiRFdfQVRfY29tbW9uX3JlZmVyZW5jZSI7Ci0gICAgY2FzZSBEV19BVF9jb21wX2RpcjogcmV0dXJuICJEV19BVF9jb21wX2RpciI7Ci0gICAgY2FzZSBEV19BVF9jb25zdF92YWx1ZTogcmV0dXJuICJEV19BVF9jb25zdF92YWx1ZSI7Ci0gICAgY2FzZSBEV19BVF9jb250YWluaW5nX3R5cGU6IHJldHVybiAiRFdfQVRfY29udGFpbmluZ190eXBlIjsKLSAgICBjYXNlIERXX0FUX2RlZmF1bHRfdmFsdWU6IHJldHVybiAiRFdfQVRfZGVmYXVsdF92YWx1ZSI7Ci0gICAgY2FzZSBEV19BVF9pbmxpbmU6IHJldHVybiAiRFdfQVRfaW5saW5lIjsKLSAgICBjYXNlIERXX0FUX2lzX29wdGlvbmFsOiByZXR1cm4gIkRXX0FUX2lzX29wdGlvbmFsIjsKLSAgICBjYXNlIERXX0FUX2xvd2VyX2JvdW5kOiByZXR1cm4gIkRXX0FUX2xvd2VyX2JvdW5kIjsKLSAgICBjYXNlIERXX0FUX3Byb2R1Y2VyOiByZXR1cm4gIkRXX0FUX3Byb2R1Y2VyIjsKLSAgICBjYXNlIERXX0FUX3Byb3RvdHlwZWQ6IHJldHVybiAiRFdfQVRfcHJvdG90eXBlZCI7Ci0gICAgY2FzZSBEV19BVF9yZXR1cm5fYWRkcjogcmV0dXJuICJEV19BVF9yZXR1cm5fYWRkciI7Ci0gICAgY2FzZSBEV19BVF9zdGFydF9zY29wZTogcmV0dXJuICJEV19BVF9zdGFydF9zY29wZSI7Ci0gICAgY2FzZSBEV19BVF9zdHJpZGVfc2l6ZTogcmV0dXJuICJEV19BVF9zdHJpZGVfc2l6ZSI7Ci0gICAgY2FzZSBEV19BVF91cHBlcl9ib3VuZDogcmV0dXJuICJEV19BVF91cHBlcl9ib3VuZCI7Ci0gICAgY2FzZSBEV19BVF9hYnN0cmFjdF9vcmlnaW46IHJldHVybiAiRFdfQVRfYWJzdHJhY3Rfb3JpZ2luIjsKLSAgICBjYXNlIERXX0FUX2FjY2Vzc2liaWxpdHk6IHJldHVybiAiRFdfQVRfYWNjZXNzaWJpbGl0eSI7Ci0gICAgY2FzZSBEV19BVF9hZGRyZXNzX2NsYXNzOiByZXR1cm4gIkRXX0FUX2FkZHJlc3NfY2xhc3MiOwotICAgIGNhc2UgRFdfQVRfYXJ0aWZpY2lhbDogcmV0dXJuICJEV19BVF9hcnRpZmljaWFsIjsKLSAgICBjYXNlIERXX0FUX2Jhc2VfdHlwZXM6IHJldHVybiAiRFdfQVRfYmFzZV90eXBlcyI7Ci0gICAgY2FzZSBEV19BVF9jYWxsaW5nX2NvbnZlbnRpb246IHJldHVybiAiRFdfQVRfY2FsbGluZ19jb252ZW50aW9uIjsKLSAgICBjYXNlIERXX0FUX2NvdW50OiByZXR1cm4gIkRXX0FUX2NvdW50IjsKLSAgICBjYXNlIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uOiByZXR1cm4gIkRXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uIjsKLSAgICBjYXNlIERXX0FUX2RlY2xfY29sdW1uOiByZXR1cm4gIkRXX0FUX2RlY2xfY29sdW1uIjsKLSAgICBjYXNlIERXX0FUX2RlY2xfZmlsZTogcmV0dXJuICJEV19BVF9kZWNsX2ZpbGUiOwotICAgIGNhc2UgRFdfQVRfZGVjbF9saW5lOiByZXR1cm4gIkRXX0FUX2RlY2xfbGluZSI7Ci0gICAgY2FzZSBEV19BVF9kZWNsYXJhdGlvbjogcmV0dXJuICJEV19BVF9kZWNsYXJhdGlvbiI7Ci0gICAgY2FzZSBEV19BVF9kaXNjcl9saXN0OiByZXR1cm4gIkRXX0FUX2Rpc2NyX2xpc3QiOwotICAgIGNhc2UgRFdfQVRfZW5jb2Rpbmc6IHJldHVybiAiRFdfQVRfZW5jb2RpbmciOwotICAgIGNhc2UgRFdfQVRfZXh0ZXJuYWw6IHJldHVybiAiRFdfQVRfZXh0ZXJuYWwiOwotICAgIGNhc2UgRFdfQVRfZnJhbWVfYmFzZTogcmV0dXJuICJEV19BVF9mcmFtZV9iYXNlIjsKLSAgICBjYXNlIERXX0FUX2ZyaWVuZDogcmV0dXJuICJEV19BVF9mcmllbmQiOwotICAgIGNhc2UgRFdfQVRfaWRlbnRpZmllcl9jYXNlOiByZXR1cm4gIkRXX0FUX2lkZW50aWZpZXJfY2FzZSI7Ci0gICAgY2FzZSBEV19BVF9tYWNyb19pbmZvOiByZXR1cm4gIkRXX0FUX21hY3JvX2luZm8iOwotICAgIGNhc2UgRFdfQVRfbmFtZWxpc3RfaXRlbXM6IHJldHVybiAiRFdfQVRfbmFtZWxpc3RfaXRlbXMiOwotICAgIGNhc2UgRFdfQVRfcHJpb3JpdHk6IHJldHVybiAiRFdfQVRfcHJpb3JpdHkiOwotICAgIGNhc2UgRFdfQVRfc2VnbWVudDogcmV0dXJuICJEV19BVF9zZWdtZW50IjsKLSAgICBjYXNlIERXX0FUX3NwZWNpZmljYXRpb246IHJldHVybiAiRFdfQVRfc3BlY2lmaWNhdGlvbiI7Ci0gICAgY2FzZSBEV19BVF9zdGF0aWNfbGluazogcmV0dXJuICJEV19BVF9zdGF0aWNfbGluayI7Ci0gICAgY2FzZSBEV19BVF90eXBlOiByZXR1cm4gIkRXX0FUX3R5cGUiOwotICAgIGNhc2UgRFdfQVRfdXNlX2xvY2F0aW9uOiByZXR1cm4gIkRXX0FUX3VzZV9sb2NhdGlvbiI7Ci0gICAgY2FzZSBEV19BVF92YXJpYWJsZV9wYXJhbWV0ZXI6IHJldHVybiAiRFdfQVRfdmFyaWFibGVfcGFyYW1ldGVyIjsKLSAgICBjYXNlIERXX0FUX3ZpcnR1YWxpdHk6IHJldHVybiAiRFdfQVRfdmlydHVhbGl0eSI7Ci0gICAgY2FzZSBEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbjogcmV0dXJuICJEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbiI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2ZkZTogcmV0dXJuICJEV19BVF9NSVBTX2ZkZSI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2xvb3BfYmVnaW46IHJldHVybiAiRFdfQVRfTUlQU19sb29wX2JlZ2luIjsKLSAgICBjYXNlIERXX0FUX01JUFNfdGFpbF9sb29wX2JlZ2luOiByZXR1cm4gIkRXX0FUX01JUFNfdGFpbF9sb29wX2JlZ2luIjsKLSAgICBjYXNlIERXX0FUX01JUFNfZXBpbG9nX2JlZ2luOiByZXR1cm4gIkRXX0FUX01JUFNfZXBpbG9nX2JlZ2luIjsKLSAgICBjYXNlIERXX0FUX01JUFNfbG9vcF91bnJvbGxfZmFjdG9yOiByZXR1cm4gIkRXX0FUX01JUFNfbG9vcF91bnJvbGxfZmFjdG9yIjsKLSAgICBjYXNlIERXX0FUX01JUFNfc29mdHdhcmVfcGlwZWxpbmVfZGVwdGg6IHJldHVybiAiRFdfQVRfTUlQU19zb2Z0d2FyZV9waXBlbGluZV9kZXB0aCI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZTogcmV0dXJuICJEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX3N0cmlkZTogcmV0dXJuICJEV19BVF9NSVBTX3N0cmlkZSI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2Fic3RyYWN0X25hbWU6IHJldHVybiAiRFdfQVRfTUlQU19hYnN0cmFjdF9uYW1lIjsKLSAgICBjYXNlIERXX0FUX01JUFNfY2xvbmVfb3JpZ2luOiByZXR1cm4gIkRXX0FUX01JUFNfY2xvbmVfb3JpZ2luIjsKLSAgICBjYXNlIERXX0FUX01JUFNfaGFzX2lubGluZXM6IHJldHVybiAiRFdfQVRfTUlQU19oYXNfaW5saW5lcyI7Ci0gICAgY2FzZSBEV19BVF9zZl9uYW1lczogcmV0dXJuICJEV19BVF9zZl9uYW1lcyI7Ci0gICAgY2FzZSBEV19BVF9zcmNfaW5mbzogcmV0dXJuICJEV19BVF9zcmNfaW5mbyI7Ci0gICAgY2FzZSBEV19BVF9tYWNfaW5mbzogcmV0dXJuICJEV19BVF9tYWNfaW5mbyI7Ci0gICAgY2FzZSBEV19BVF9zcmNfY29vcmRzOiByZXR1cm4gIkRXX0FUX3NyY19jb29yZHMiOwotICAgIGNhc2UgRFdfQVRfYm9keV9iZWdpbjogcmV0dXJuICJEV19BVF9ib2R5X2JlZ2luIjsKLSAgICBjYXNlIERXX0FUX2JvZHlfZW5kOiByZXR1cm4gIkRXX0FUX2JvZHlfZW5kIjsKLSAgICBkZWZhdWx0OgotICAgICAgewotCXN0YXRpYyBjaGFyIGJ1ZmZlciBbMTAwXTsKLQotCXNwcmludGYgKGJ1ZmZlciwgXygiVW5rbm93biBBVCB2YWx1ZTogJWx4IiksIGF0dHJpYnV0ZSk7Ci0JcmV0dXJuIGJ1ZmZlcjsKLSAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9GT1JNX25hbWUgKGZvcm0pCi0gICAgIHVuc2lnbmVkIGxvbmcgZm9ybTsKLXsKLSAgc3dpdGNoIChmb3JtKQotICAgIHsKLSAgICBjYXNlIERXX0ZPUk1fYWRkcjogcmV0dXJuICJEV19GT1JNX2FkZHIiOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazI6IHJldHVybiAiRFdfRk9STV9ibG9jazIiOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazQ6IHJldHVybiAiRFdfRk9STV9ibG9jazQiOwotICAgIGNhc2UgRFdfRk9STV9kYXRhMjogcmV0dXJuICJEV19GT1JNX2RhdGEyIjsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTQ6IHJldHVybiAiRFdfRk9STV9kYXRhNCI7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGE4OiByZXR1cm4gIkRXX0ZPUk1fZGF0YTgiOwotICAgIGNhc2UgRFdfRk9STV9zdHJpbmc6IHJldHVybiAiRFdfRk9STV9zdHJpbmciOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazogcmV0dXJuICJEV19GT1JNX2Jsb2NrIjsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2sxOiByZXR1cm4gIkRXX0ZPUk1fYmxvY2sxIjsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTE6IHJldHVybiAiRFdfRk9STV9kYXRhMSI7Ci0gICAgY2FzZSBEV19GT1JNX2ZsYWc6IHJldHVybiAiRFdfRk9STV9mbGFnIjsKLSAgICBjYXNlIERXX0ZPUk1fc2RhdGE6IHJldHVybiAiRFdfRk9STV9zZGF0YSI7Ci0gICAgY2FzZSBEV19GT1JNX3N0cnA6IHJldHVybiAiRFdfRk9STV9zdHJwIjsKLSAgICBjYXNlIERXX0ZPUk1fdWRhdGE6IHJldHVybiAiRFdfRk9STV91ZGF0YSI7Ci0gICAgY2FzZSBEV19GT1JNX3JlZl9hZGRyOiByZXR1cm4gIkRXX0ZPUk1fcmVmX2FkZHIiOwotICAgIGNhc2UgRFdfRk9STV9yZWYxOiByZXR1cm4gIkRXX0ZPUk1fcmVmMSI7Ci0gICAgY2FzZSBEV19GT1JNX3JlZjI6IHJldHVybiAiRFdfRk9STV9yZWYyIjsKLSAgICBjYXNlIERXX0ZPUk1fcmVmNDogcmV0dXJuICJEV19GT1JNX3JlZjQiOwotICAgIGNhc2UgRFdfRk9STV9yZWY4OiByZXR1cm4gIkRXX0ZPUk1fcmVmOCI7Ci0gICAgY2FzZSBEV19GT1JNX3JlZl91ZGF0YTogcmV0dXJuICJEV19GT1JNX3JlZl91ZGF0YSI7Ci0gICAgY2FzZSBEV19GT1JNX2luZGlyZWN0OiByZXR1cm4gIkRXX0ZPUk1faW5kaXJlY3QiOwotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyIFsxMDBdOwotCi0Jc3ByaW50ZiAoYnVmZmVyLCBfKCJVbmtub3duIEZPUk0gdmFsdWU6ICVseCIpLCBmb3JtKTsKLQlyZXR1cm4gYnVmZmVyOwotICAgICAgfQotICAgIH0KLX0KLQotLyogRklYTUU6ICBUaGVyZSBhcmUgYmV0dGVyIGFuZCBtb3JlIGVmZmllY2ludCB3YXlzIHRvIGhhbmRsZQotICAgdGhlc2Ugc3RydWN0dXJlcy4gIEZvciBub3cgdGhvdWdoLCBJIGp1c3Qgd2FudCBzb21ldGhpbmcgdGhhdAotICAgaXMgc2ltcGxlIHRvIGltcGxlbWVudC4gICovCi10eXBlZGVmIHN0cnVjdCBhYmJyZXZfYXR0cgotewotICB1bnNpZ25lZCBsb25nICAgICAgICBhdHRyaWJ1dGU7Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgIGZvcm07Ci0gIHN0cnVjdCBhYmJyZXZfYXR0ciAqIG5leHQ7Ci19Ci1hYmJyZXZfYXR0cjsKLQotdHlwZWRlZiBzdHJ1Y3QgYWJicmV2X2VudHJ5Ci17Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgZW50cnk7Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgdGFnOwotICBpbnQgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOwotICBzdHJ1Y3QgYWJicmV2X2F0dHIgKiAgIGZpcnN0X2F0dHI7Ci0gIHN0cnVjdCBhYmJyZXZfYXR0ciAqICAgbGFzdF9hdHRyOwotICBzdHJ1Y3QgYWJicmV2X2VudHJ5ICogIG5leHQ7Ci19Ci1hYmJyZXZfZW50cnk7Ci0KLXN0YXRpYyBhYmJyZXZfZW50cnkgKiBmaXJzdF9hYmJyZXYgPSBOVUxMOwotc3RhdGljIGFiYnJldl9lbnRyeSAqIGxhc3RfYWJicmV2ID0gTlVMTDsKLQotc3RhdGljIHZvaWQKLWZyZWVfYWJicmV2cyBQQVJBTVMgKCh2b2lkKSkKLXsKLSAgYWJicmV2X2VudHJ5ICogYWJicmV2OwotCi0gIGZvciAoYWJicmV2ID0gZmlyc3RfYWJicmV2OyBhYmJyZXY7KQotICAgIHsKLSAgICAgIGFiYnJldl9lbnRyeSAqIG5leHQgPSBhYmJyZXYtPm5leHQ7Ci0gICAgICBhYmJyZXZfYXR0ciAgKiBhdHRyOwotCi0gICAgICBmb3IgKGF0dHIgPSBhYmJyZXYtPmZpcnN0X2F0dHI7IGF0dHI7KQotCXsKLQkgIGFiYnJldl9hdHRyICogbmV4dCA9IGF0dHItPm5leHQ7Ci0KLQkgIGZyZWUgKGF0dHIpOwotCSAgYXR0ciA9IG5leHQ7Ci0JfQotCi0gICAgICBmcmVlIChhYmJyZXYpOwotICAgICAgYWJicmV2ID0gbmV4dDsKLSAgICB9Ci0KLSAgbGFzdF9hYmJyZXYgPSBmaXJzdF9hYmJyZXYgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotYWRkX2FiYnJldiAobnVtYmVyLCB0YWcsIGNoaWxkcmVuKQotICAgICB1bnNpZ25lZCBsb25nIG51bWJlcjsKLSAgICAgdW5zaWduZWQgbG9uZyB0YWc7Ci0gICAgIGludCAgICAgICAgICAgY2hpbGRyZW47Ci17Ci0gIGFiYnJldl9lbnRyeSAqIGVudHJ5OwotCi0gIGVudHJ5ID0gKGFiYnJldl9lbnRyeSAqKSBtYWxsb2MgKHNpemVvZiAoKiBlbnRyeSkpOwotCi0gIGlmIChlbnRyeSA9PSBOVUxMKQotICAgIC8qIHVnZyAqLwotICAgIHJldHVybjsKLQotICBlbnRyeS0+ZW50cnkgICAgICA9IG51bWJlcjsKLSAgZW50cnktPnRhZyAgICAgICAgPSB0YWc7Ci0gIGVudHJ5LT5jaGlsZHJlbiAgID0gY2hpbGRyZW47Ci0gIGVudHJ5LT5maXJzdF9hdHRyID0gTlVMTDsKLSAgZW50cnktPmxhc3RfYXR0ciAgPSBOVUxMOwotICBlbnRyeS0+bmV4dCAgICAgICA9IE5VTEw7Ci0KLSAgaWYgKGZpcnN0X2FiYnJldiA9PSBOVUxMKQotICAgIGZpcnN0X2FiYnJldiA9IGVudHJ5OwotICBlbHNlCi0gICAgbGFzdF9hYmJyZXYtPm5leHQgPSBlbnRyeTsKLQotICBsYXN0X2FiYnJldiA9IGVudHJ5OwotfQotCi1zdGF0aWMgdm9pZAotYWRkX2FiYnJldl9hdHRyIChhdHRyaWJ1dGUsIGZvcm0pCi0gICAgIHVuc2lnbmVkIGxvbmcgYXR0cmlidXRlOwotICAgICB1bnNpZ25lZCBsb25nIGZvcm07Ci17Ci0gIGFiYnJldl9hdHRyICogYXR0cjsKLQotICBhdHRyID0gKGFiYnJldl9hdHRyICopIG1hbGxvYyAoc2l6ZW9mICgqIGF0dHIpKTsKLQotICBpZiAoYXR0ciA9PSBOVUxMKQotICAgIC8qIHVnZyAqLwotICAgIHJldHVybjsKLQotICBhdHRyLT5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7Ci0gIGF0dHItPmZvcm0gICAgICA9IGZvcm07Ci0gIGF0dHItPm5leHQgICAgICA9IE5VTEw7Ci0KLSAgaWYgKGxhc3RfYWJicmV2LT5maXJzdF9hdHRyID09IE5VTEwpCi0gICAgbGFzdF9hYmJyZXYtPmZpcnN0X2F0dHIgPSBhdHRyOwotICBlbHNlCi0gICAgbGFzdF9hYmJyZXYtPmxhc3RfYXR0ci0+bmV4dCA9IGF0dHI7Ci0KLSAgbGFzdF9hYmJyZXYtPmxhc3RfYXR0ciA9IGF0dHI7Ci19Ci0KLS8qIFByb2Nlc3NlcyB0aGUgKHBhcnRpYWwpIGNvbnRlbnRzIG9mIGEgLmRlYnVnX2FiYnJldiBzZWN0aW9uLgotICAgUmV0dXJucyBOVUxMIGlmIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24gd2FzIGVuY291bnRlcmVkLgotICAgUmV0dXJucyB0aGUgYWRkcmVzcyBhZnRlciB0aGUgbGFzdCBieXRlIHJlYWQgaWYgdGhlIGVuZCBvZgotICAgYW4gYWJicmV2aWF0aW9uIHNldCB3YXMgZm91bmQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1wcm9jZXNzX2FiYnJldl9zZWN0aW9uIChzdGFydCwgZW5kKQotICAgICB1bnNpZ25lZCBjaGFyICogc3RhcnQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKiBlbmQ7Ci17Ci0gIGlmIChmaXJzdF9hYmJyZXYgIT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB3aGlsZSAoc3RhcnQgPCBlbmQpCi0gICAgewotICAgICAgaW50ICAgICAgICAgICBieXRlc19yZWFkOwotICAgICAgdW5zaWduZWQgbG9uZyBlbnRyeTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdGFnOwotICAgICAgdW5zaWduZWQgbG9uZyBhdHRyaWJ1dGU7Ci0gICAgICBpbnQgICAgICAgICAgIGNoaWxkcmVuOwotCi0gICAgICBlbnRyeSA9IHJlYWRfbGViMTI4IChzdGFydCwgJiBieXRlc19yZWFkLCAwKTsKLSAgICAgIHN0YXJ0ICs9IGJ5dGVzX3JlYWQ7Ci0KLSAgICAgIGlmIChlbnRyeSA9PSAwKQotCXJldHVybiBzdGFydDsKLQotICAgICAgdGFnID0gcmVhZF9sZWIxMjggKHN0YXJ0LCAmIGJ5dGVzX3JlYWQsIDApOwotICAgICAgc3RhcnQgKz0gYnl0ZXNfcmVhZDsKLQotICAgICAgY2hpbGRyZW4gPSAqIHN0YXJ0ICsrOwotCi0gICAgICBhZGRfYWJicmV2IChlbnRyeSwgdGFnLCBjaGlsZHJlbik7Ci0KLSAgICAgIGRvCi0JewotCSAgdW5zaWduZWQgbG9uZyBmb3JtOwotCi0JICBhdHRyaWJ1dGUgPSByZWFkX2xlYjEyOCAoc3RhcnQsICYgYnl0ZXNfcmVhZCwgMCk7Ci0JICBzdGFydCArPSBieXRlc19yZWFkOwotCi0JICBmb3JtID0gcmVhZF9sZWIxMjggKHN0YXJ0LCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgc3RhcnQgKz0gYnl0ZXNfcmVhZDsKLQotCSAgaWYgKGF0dHJpYnV0ZSAhPSAwKQotCSAgICBhZGRfYWJicmV2X2F0dHIgKGF0dHJpYnV0ZSwgZm9ybSk7Ci0JfQotICAgICAgd2hpbGUgKGF0dHJpYnV0ZSAhPSAwKTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19hYmJyZXYgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZTsKLXsKLSAgYWJicmV2X2VudHJ5ICogZW50cnk7Ci0gIHVuc2lnbmVkIGNoYXIgKiBlbmQgPSBzdGFydCArIHNlY3Rpb24tPnNoX3NpemU7Ci0KLSAgcHJpbnRmIChfKCJDb250ZW50cyBvZiB0aGUgJXMgc2VjdGlvbjpcblxuIiksIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCi0gIGRvCi0gICAgewotICAgICAgc3RhcnQgPSBwcm9jZXNzX2FiYnJldl9zZWN0aW9uIChzdGFydCwgZW5kKTsKLQotICAgICAgcHJpbnRmIChfKCIgIE51bWJlciBUQUdcbiIpKTsKLQotICAgICAgZm9yIChlbnRyeSA9IGZpcnN0X2FiYnJldjsgZW50cnk7IGVudHJ5ID0gZW50cnktPm5leHQpCi0JewotCSAgYWJicmV2X2F0dHIgKiBhdHRyOwotCi0JICBwcmludGYgKF8oIiAgICVsZCAgICAgICVzICAgIFslc11cbiIpLAotCQkgIGVudHJ5LT5lbnRyeSwKLQkJICBnZXRfVEFHX25hbWUgKGVudHJ5LT50YWcpLAotCQkgIGVudHJ5LT5jaGlsZHJlbiA/IF8oImhhcyBjaGlsZHJlbiIpIDogXygibm8gY2hpbGRyZW4iKSk7Ci0KLQkgIGZvciAoYXR0ciA9IGVudHJ5LT5maXJzdF9hdHRyOyBhdHRyOyBhdHRyID0gYXR0ci0+bmV4dCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoXygiICAgICUtMThzICVzXG4iKSwKLQkJICAgICAgZ2V0X0FUX25hbWUgKGF0dHItPmF0dHJpYnV0ZSksCi0JCSAgICAgIGdldF9GT1JNX25hbWUgKGF0dHItPmZvcm0pKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHdoaWxlIChzdGFydCk7Ci0KLSAgcHJpbnRmICgiXG4iKTsKLQotICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1kaXNwbGF5X2Jsb2NrIChkYXRhLCBsZW5ndGgpCi0gICAgIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICAgICB1bnNpZ25lZCBsb25nICAgbGVuZ3RoOwotewotICBwcmludGYgKF8oIiAlbHUgYnl0ZSBibG9jazogIiksIGxlbmd0aCk7Ci0KLSAgd2hpbGUgKGxlbmd0aCAtLSkKLSAgICBwcmludGYgKCIlbHggIiwgYnl0ZV9nZXQgKGRhdGEgKyssIDEpKTsKLQotICByZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIHZvaWQKLWRlY29kZV9sb2NhdGlvbl9leHByZXNzaW9uIChkYXRhLCBwb2ludGVyX3NpemUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICAgICB1bnNpZ25lZCBpbnQgICAgcG9pbnRlcl9zaXplOwotewotICB1bnNpZ25lZCBjaGFyIG9wOwotICBpbnQgICAgICAgICAgIGJ5dGVzX3JlYWQ7Ci0KLSAgb3AgPSAqIGRhdGEgKys7Ci0KLSAgc3dpdGNoIChvcCkKLSAgICB7Ci0gICAgY2FzZSBEV19PUF9hZGRyOglwcmludGYgKCJEV19PUF9hZGRyOiAlbHgiLCBieXRlX2dldCAoZGF0YSwgcG9pbnRlcl9zaXplKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZGVyZWY6CXByaW50ZiAoIkRXX09QX2RlcmVmIik7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3QxdToJcHJpbnRmICgiRFdfT1BfY29uc3QxdTogJWx1IiwgYnl0ZV9nZXQgKGRhdGEsIDEpKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9jb25zdDFzOglwcmludGYgKCJEV19PUF9jb25zdDFzOiAlbGQiLCAobG9uZykgYnl0ZV9nZXQgKGRhdGEsIDEpKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9jb25zdDJ1OglwcmludGYgKCJEV19PUF9jb25zdDJ1OiAlbHUiLCBieXRlX2dldCAoZGF0YSwgMikpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0MnM6CXByaW50ZiAoIkRXX09QX2NvbnN0MnM6ICVsZCIsIChsb25nKSBieXRlX2dldCAoZGF0YSwgMikpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0NHU6CXByaW50ZiAoIkRXX09QX2NvbnN0NHU6ICVsdSIsIGJ5dGVfZ2V0IChkYXRhLCA0KSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3Q0czoJcHJpbnRmICgiRFdfT1BfY29uc3Q0czogJWxkIiwgKGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCA0KSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3Q4dToJcHJpbnRmICgiRFdfT1BfY29uc3Q4dTogJWx1ICVsdSIsIGJ5dGVfZ2V0IChkYXRhLCA0KSwgYnl0ZV9nZXQgKGRhdGEgKyA0LCA0KSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3Q4czoJcHJpbnRmICgiRFdfT1BfY29uc3Q4czogJWxkICVsZCIsIGJ5dGVfZ2V0IChkYXRhLCA0KSwgYnl0ZV9nZXQgKGRhdGEgKyA0LCA0KSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3R1OglwcmludGYgKCJEV19PUF9jb25zdHU6ICVsdSIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAwKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3RzOglwcmludGYgKCJEV19PUF9jb25zdHM6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZHVwOglwcmludGYgKCJEV19PUF9kdXAiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9kcm9wOglwcmludGYgKCJEV19PUF9kcm9wIik7IGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfb3ZlcjoJcHJpbnRmICgiRFdfT1Bfb3ZlciIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX3BpY2s6CXByaW50ZiAoIkRXX09QX3BpY2s6ICVsZCIsIGJ5dGVfZ2V0IChkYXRhLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfc3dhcDoJcHJpbnRmICgiRFdfT1Bfc3dhcCIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX3JvdDoJcHJpbnRmICgiRFdfT1Bfcm90Iik7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfeGRlcmVmOglwcmludGYgKCJEV19PUF94ZGVyZWYiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9hYnM6CXByaW50ZiAoIkRXX09QX2FicyIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2FuZDoJcHJpbnRmICgiRFdfT1BfYW5kIik7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZGl2OglwcmludGYgKCJEV19PUF9kaXYiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9taW51czoJcHJpbnRmICgiRFdfT1BfbWludXMiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9tb2Q6CXByaW50ZiAoIkRXX09QX21vZCIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX211bDoJcHJpbnRmICgiRFdfT1BfbXVsIik7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbmVnOglwcmludGYgKCJEV19PUF9uZWciKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9ub3Q6CXByaW50ZiAoIkRXX09QX25vdCIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX29yOglwcmludGYgKCJEV19PUF9vciIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX3BsdXM6CXByaW50ZiAoIkRXX09QX3BsdXMiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9wbHVzX3Vjb25zdDoJcHJpbnRmICgiRFdfT1BfcGx1c191Y29uc3Q6ICVsdSIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAwKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfc2hsOglwcmludGYgKCJEV19PUF9zaGwiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9zaHI6CXByaW50ZiAoIkRXX09QX3NociIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX3NocmE6CXByaW50ZiAoIkRXX09QX3NocmEiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF94b3I6CXByaW50ZiAoIkRXX09QX3hvciIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2JyYToJcHJpbnRmICgiRFdfT1BfYnJhOiAlbGQiLCBieXRlX2dldCAoZGF0YSwgMikpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2VxOglwcmludGYgKCJEV19PUF9lcSIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2dlOglwcmludGYgKCJEV19PUF9nZSIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2d0OglwcmludGYgKCJEV19PUF9ndCIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xlOglwcmludGYgKCJEV19PUF9sZSIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2x0OglwcmludGYgKCJEV19PUF9sdCIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX25lOglwcmludGYgKCJEV19PUF9uZSIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX3NraXA6CXByaW50ZiAoIkRXX09QX3NraXA6ICVsZCIsIGJ5dGVfZ2V0IChkYXRhLCAyKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MDoJcHJpbnRmICgiRFdfT1BfbGl0MCIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE6CXByaW50ZiAoIkRXX09QX2xpdDEiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyOglwcmludGYgKCJEV19PUF9saXQyIik7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MzoJcHJpbnRmICgiRFdfT1BfbGl0MyIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDQ6CXByaW50ZiAoIkRXX09QX2xpdDQiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ1OglwcmludGYgKCJEV19PUF9saXQ1Iik7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0NjoJcHJpbnRmICgiRFdfT1BfbGl0NiIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDc6CXByaW50ZiAoIkRXX09QX2xpdDciKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ4OglwcmludGYgKCJEV19PUF9saXQ4Iik7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0OToJcHJpbnRmICgiRFdfT1BfbGl0OSIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDEwOglwcmludGYgKCJEV19PUF9saXQxMCIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDExOglwcmludGYgKCJEV19PUF9saXQxMSIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDEyOglwcmludGYgKCJEV19PUF9saXQxMiIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDEzOglwcmludGYgKCJEV19PUF9saXQxMyIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE0OglwcmludGYgKCJEV19PUF9saXQxNCIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE1OglwcmludGYgKCJEV19PUF9saXQxNSIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE2OglwcmludGYgKCJEV19PUF9saXQxNiIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE3OglwcmludGYgKCJEV19PUF9saXQxNyIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE4OglwcmludGYgKCJEV19PUF9saXQxOCIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE5OglwcmludGYgKCJEV19PUF9saXQxOSIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDIwOglwcmludGYgKCJEV19PUF9saXQyMCIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDIxOglwcmludGYgKCJEV19PUF9saXQyMSIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDIyOglwcmludGYgKCJEV19PUF9saXQyMiIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDIzOglwcmludGYgKCJEV19PUF9saXQyMyIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI0OglwcmludGYgKCJEV19PUF9saXQyNCIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI1OglwcmludGYgKCJEV19PUF9saXQyNSIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI2OglwcmludGYgKCJEV19PUF9saXQyNiIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI3OglwcmludGYgKCJEV19PUF9saXQyNyIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI4OglwcmludGYgKCJEV19PUF9saXQyOCIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI5OglwcmludGYgKCJEV19PUF9saXQyOSIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDMwOglwcmludGYgKCJEV19PUF9saXQzMCIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDMxOglwcmludGYgKCJEV19PUF9saXQzMSIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzA6CXByaW50ZiAoIkRXX09QX3JlZzAiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxOglwcmludGYgKCJEV19PUF9yZWcxIik7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjoJcHJpbnRmICgiRFdfT1BfcmVnMiIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzM6CXByaW50ZiAoIkRXX09QX3JlZzMiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWc0OglwcmludGYgKCJEV19PUF9yZWc0Iik7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnNToJcHJpbnRmICgiRFdfT1BfcmVnNSIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzY6CXByaW50ZiAoIkRXX09QX3JlZzYiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWc3OglwcmludGYgKCJEV19PUF9yZWc3Iik7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnODoJcHJpbnRmICgiRFdfT1BfcmVnOCIpOyBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzk6CXByaW50ZiAoIkRXX09QX3JlZzkiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxMDoJcHJpbnRmICgiRFdfT1BfcmVnMTAiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxMToJcHJpbnRmICgiRFdfT1BfcmVnMTEiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxMjoJcHJpbnRmICgiRFdfT1BfcmVnMTIiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxMzoJcHJpbnRmICgiRFdfT1BfcmVnMTMiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxNDoJcHJpbnRmICgiRFdfT1BfcmVnMTQiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxNToJcHJpbnRmICgiRFdfT1BfcmVnMTUiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxNjoJcHJpbnRmICgiRFdfT1BfcmVnMTYiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxNzoJcHJpbnRmICgiRFdfT1BfcmVnMTciKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxODoJcHJpbnRmICgiRFdfT1BfcmVnMTgiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxOToJcHJpbnRmICgiRFdfT1BfcmVnMTkiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyMDoJcHJpbnRmICgiRFdfT1BfcmVnMjAiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyMToJcHJpbnRmICgiRFdfT1BfcmVnMjEiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyMjoJcHJpbnRmICgiRFdfT1BfcmVnMjIiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyMzoJcHJpbnRmICgiRFdfT1BfcmVnMjMiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyNDoJcHJpbnRmICgiRFdfT1BfcmVnMjQiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyNToJcHJpbnRmICgiRFdfT1BfcmVnMjUiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyNjoJcHJpbnRmICgiRFdfT1BfcmVnMjYiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyNzoJcHJpbnRmICgiRFdfT1BfcmVnMjciKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyODoJcHJpbnRmICgiRFdfT1BfcmVnMjgiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyOToJcHJpbnRmICgiRFdfT1BfcmVnMjkiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWczMDoJcHJpbnRmICgiRFdfT1BfcmVnMzAiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWczMToJcHJpbnRmICgiRFdfT1BfcmVnMzEiKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMDoJcHJpbnRmICgiRFdfT1BfYnJlZzA6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE6CXByaW50ZiAoIkRXX09QX2JyZWcxOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyOglwcmludGYgKCJEV19PUF9icmVnMjogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMzoJcHJpbnRmICgiRFdfT1BfYnJlZzM6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzQ6CXByaW50ZiAoIkRXX09QX2JyZWc0OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWc1OglwcmludGYgKCJEV19PUF9icmVnNTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnNjoJcHJpbnRmICgiRFdfT1BfYnJlZzY6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzc6CXByaW50ZiAoIkRXX09QX2JyZWc3OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOyBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWc4OglwcmludGYgKCJEV19PUF9icmVnODogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnOToJcHJpbnRmICgiRFdfT1BfYnJlZzk6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzEwOglwcmludGYgKCJEV19PUF9icmVnMTA6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzExOglwcmludGYgKCJEV19PUF9icmVnMTE6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzEyOglwcmludGYgKCJEV19PUF9icmVnMTI6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzEzOglwcmludGYgKCJEV19PUF9icmVnMTM6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE0OglwcmludGYgKCJEV19PUF9icmVnMTQ6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE1OglwcmludGYgKCJEV19PUF9icmVnMTU6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE2OglwcmludGYgKCJEV19PUF9icmVnMTY6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE3OglwcmludGYgKCJEV19PUF9icmVnMTc6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE4OglwcmludGYgKCJEV19PUF9icmVnMTg6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE5OglwcmludGYgKCJEV19PUF9icmVnMTk6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzIwOglwcmludGYgKCJEV19PUF9icmVnMjA6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzIxOglwcmludGYgKCJEV19PUF9icmVnMjE6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzIyOglwcmludGYgKCJEV19PUF9icmVnMjI6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzIzOglwcmludGYgKCJEV19PUF9icmVnMjM6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI0OglwcmludGYgKCJEV19PUF9icmVnMjQ6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI1OglwcmludGYgKCJEV19PUF9icmVnMjU6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI2OglwcmludGYgKCJEV19PUF9icmVnMjY6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI3OglwcmludGYgKCJEV19PUF9icmVnMjc6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI4OglwcmludGYgKCJEV19PUF9icmVnMjg6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI5OglwcmludGYgKCJEV19PUF9icmVnMjk6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzMwOglwcmludGYgKCJEV19PUF9icmVnMzA6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzMxOglwcmludGYgKCJEV19PUF9icmVnMzE6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVneDoJcHJpbnRmICgiRFdfT1BfcmVneDogJWx1IiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDApKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9mYnJlZzoJcHJpbnRmICgiRFdfT1BfZmJyZWc6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZ3g6CXByaW50ZiAoIkRXX09QX2JyZWd4OiAlbHUgJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCksIHJlYWRfbGViMTI4IChkYXRhICsgYnl0ZXNfcmVhZCwgTlVMTCwgMSkpOyBicmVhazsKLSAgICBjYXNlIERXX09QX3BpZWNlOglwcmludGYgKCJEV19PUF9waWVjZTogJWx1IiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDApKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9kZXJlZl9zaXplOglwcmludGYgKCJEV19PUF9kZXJlZl9zaXplOiAlbGQiLCBieXRlX2dldCAoZGF0YSwgMSkpOyBicmVhazsKLSAgICBjYXNlIERXX09QX3hkZXJlZl9zaXplOglwcmludGYgKCJEV19PUF94ZGVyZWZfc2l6ZTogJWxkIiwgYnl0ZV9nZXQgKGRhdGEsIDEpKTsgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9ub3A6CXByaW50ZiAoIkRXX09QX25vcCIpOyBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAob3AgPj0gRFdfT1BfbG9fdXNlcgotCSAgJiYgb3AgPD0gRFdfT1BfaGlfdXNlcikKLQlwcmludGYgKF8oIihVc2VyIGRlZmluZWQgbG9jYXRpb24gb3ApIikpOwotICAgICAgZWxzZQotCXByaW50ZiAoXygiKFVua25vd24gbG9jYXRpb24gb3ApIikpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXJlYWRfYW5kX2Rpc3BsYXlfYXR0ciAoYXR0cmlidXRlLCBmb3JtLCBkYXRhLCBwb2ludGVyX3NpemUpCi0gICAgIHVuc2lnbmVkIGxvbmcgICBhdHRyaWJ1dGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICBmb3JtOwotICAgICB1bnNpZ25lZCBjaGFyICogZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyAgIHBvaW50ZXJfc2l6ZTsKLXsKLSAgdW5zaWduZWQgbG9uZyAgIHV2YWx1ZTsKLSAgdW5zaWduZWQgY2hhciAqIGJsb2NrX3N0YXJ0OwotICBpbnQgICAgICAgICAgICAgYnl0ZXNfcmVhZDsKLSAgaW50CQkgIGlzX3JlZiA9IDA7Ci0KLSAgcHJpbnRmICgiICAgICAlLTE4czoiLCBnZXRfQVRfbmFtZSAoYXR0cmlidXRlKSk7Ci0KLSAgc3dpdGNoIChmb3JtKQotICAgIHsKLSAgICBjYXNlIERXX0ZPUk1fcmVmX2FkZHI6Ci0gICAgY2FzZSBEV19GT1JNX3JlZjE6Ci0gICAgY2FzZSBEV19GT1JNX3JlZjI6Ci0gICAgY2FzZSBEV19GT1JNX3JlZjQ6Ci0gICAgY2FzZSBEV19GT1JNX3JlZjg6Ci0gICAgY2FzZSBEV19GT1JNX3JlZl91ZGF0YToKLSAgICAgIGlzX3JlZiA9IDE7Ci0gICAgfQotCi0gIHN3aXRjaCAoZm9ybSkKLSAgICB7Ci0gICAgY2FzZSBEV19GT1JNX3JlZl9hZGRyOgotICAgIGNhc2UgRFdfRk9STV9hZGRyOgotICAgICAgdXZhbHVlID0gYnl0ZV9nZXQgKGRhdGEsIHBvaW50ZXJfc2l6ZSk7Ci0gICAgICBwcmludGYgKGlzX3JlZiA/ICIgPCV4PiIgOiAiICUjeCIsIHV2YWx1ZSk7Ci0gICAgICBkYXRhICs9IHBvaW50ZXJfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3JlZjE6Ci0gICAgY2FzZSBEV19GT1JNX2ZsYWc6Ci0gICAgY2FzZSBEV19GT1JNX2RhdGExOgotICAgICAgdXZhbHVlID0gYnl0ZV9nZXQgKGRhdGEgKyssIDEpOwotICAgICAgcHJpbnRmIChpc19yZWYgPyAiIDwleD4iIDogIiAlZCIsIHV2YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9yZWYyOgotICAgIGNhc2UgRFdfRk9STV9kYXRhMjoKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCAyKTsKLSAgICAgIGRhdGEgKz0gMjsKLSAgICAgIHByaW50ZiAoaXNfcmVmID8gIiA8JXg+IiA6ICIgJWQiLCB1dmFsdWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fcmVmNDoKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTQ6Ci0gICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSwgNCk7Ci0gICAgICBkYXRhICs9IDQ7Ci0gICAgICBwcmludGYgKGlzX3JlZiA/ICIgPCV4PiIgOiAiICVkIiwgdXZhbHVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3JlZjg6Ci0gICAgY2FzZSBEV19GT1JNX2RhdGE4OgotICAgICAgdXZhbHVlID0gYnl0ZV9nZXQgKGRhdGEsIDQpOwotICAgICAgcHJpbnRmICgiICVseCIsIHV2YWx1ZSk7Ci0gICAgICBwcmludGYgKCIgJWx4IiwgYnl0ZV9nZXQgKGRhdGEgKyA0LCA0KSk7Ci0gICAgICBkYXRhICs9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9zdHJpbmc6Ci0gICAgICBwcmludGYgKCIgJXMiLCBkYXRhKTsKLSAgICAgIGRhdGEgKz0gc3RybGVuIChkYXRhKSArIDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9zZGF0YToKLSAgICAgIHV2YWx1ZSA9IHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDEpOwotICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotICAgICAgcHJpbnRmICgiICVsZCIsIChsb25nKSB1dmFsdWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fcmVmX3VkYXRhOgotICAgIGNhc2UgRFdfRk9STV91ZGF0YToKLSAgICAgIHV2YWx1ZSA9IHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApOwotICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotICAgICAgcHJpbnRmIChpc19yZWYgPyAiIDwlbHg+IiA6ICIgJWxkIiwgdXZhbHVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX2Jsb2NrOgotICAgICAgdXZhbHVlID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0gICAgICBibG9ja19zdGFydCA9IGRhdGEgKyBieXRlc19yZWFkOwotICAgICAgZGF0YSA9IGRpc3BsYXlfYmxvY2sgKGJsb2NrX3N0YXJ0LCB1dmFsdWUpOwotICAgICAgdXZhbHVlID0gKiBibG9ja19zdGFydDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX2Jsb2NrMToKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCAxKTsKLSAgICAgIGJsb2NrX3N0YXJ0ID0gZGF0YSArIDE7Ci0gICAgICBkYXRhID0gZGlzcGxheV9ibG9jayAoYmxvY2tfc3RhcnQsIHV2YWx1ZSk7Ci0gICAgICB1dmFsdWUgPSAqIGJsb2NrX3N0YXJ0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fYmxvY2syOgotICAgICAgdXZhbHVlID0gYnl0ZV9nZXQgKGRhdGEsIDIpOwotICAgICAgYmxvY2tfc3RhcnQgPSBkYXRhICsgMjsKLSAgICAgIGRhdGEgPSBkaXNwbGF5X2Jsb2NrIChibG9ja19zdGFydCwgdXZhbHVlKTsKLSAgICAgIHV2YWx1ZSA9ICogYmxvY2tfc3RhcnQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9ibG9jazQ6Ci0gICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSwgNCk7Ci0gICAgICBibG9ja19zdGFydCA9IGRhdGEgKyA0OwotICAgICAgZGF0YSA9IGRpc3BsYXlfYmxvY2sgKGJsb2NrX3N0YXJ0LCB1dmFsdWUpOwotICAgICAgdXZhbHVlID0gKiBibG9ja19zdGFydDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3N0cnA6Ci0gICAgY2FzZSBEV19GT1JNX2luZGlyZWN0OgotICAgICAgd2FybiAoXygiVW5hYmxlIHRvIGhhbmRsZSBGT1JNOiAlZCIpLCBmb3JtKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHdhcm4gKF8oIlVucmVjb2duaXNlZCBmb3JtOiAlZCIpLCBmb3JtKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBGb3Igc29tZSBhdHRyaWJ1dGVzIHdlIGNhbiBkaXNwbGF5IGZ1dGhlciBpbmZvcm1hdGlvbi4gICovCi0KLSAgcHJpbnRmICgiXHQiKTsKLQotICBzd2l0Y2ggKGF0dHJpYnV0ZSkKLSAgICB7Ci0gICAgY2FzZSBEV19BVF9pbmxpbmU6Ci0gICAgICBzd2l0Y2ggKHV2YWx1ZSkKLQl7Ci0JY2FzZSBEV19JTkxfbm90X2lubGluZWQ6ICAgICAgICAgIHByaW50ZiAoXygiKG5vdCBpbmxpbmVkKSIpKTsgYnJlYWs7Ci0JY2FzZSBEV19JTkxfaW5saW5lZDogICAgICAgICAgICAgIHByaW50ZiAoXygiKGlubGluZWQpIikpOyBicmVhazsKLQljYXNlIERXX0lOTF9kZWNsYXJlZF9ub3RfaW5saW5lZDogcHJpbnRmIChfKCIoZGVjbGFyZWQgYXMgaW5saW5lIGJ1dCBpZ25vcmVkKSIpKTsgYnJlYWs7Ci0JY2FzZSBEV19JTkxfZGVjbGFyZWRfaW5saW5lZDogICAgIHByaW50ZiAoXygiKGRlY2xhcmVkIGFzIGlubGluZSBhbmQgaW5saW5lZCkiKSk7IGJyZWFrOwotCWRlZmF1bHQ6IHByaW50ZiAoXygiICAoVW5rbm93biBpbmxpbmUgYXR0cmlidXRlIHZhbHVlOiAlbHgpIiksIHV2YWx1ZSk7IGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19BVF9mcmFtZV9iYXNlOgotICAgICAgaWYgKHV2YWx1ZSA+PSBEV19PUF9yZWcwICYmIHV2YWx1ZSA8PSBEV19PUF9yZWczMSkKLQlwcmludGYgKCIocmVnICVsZCkiLCB1dmFsdWUgLSBEV19PUF9yZWcwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19BVF9sYW5ndWFnZToKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX0xBTkdfQzogICAgICAgICAgICAgIHByaW50ZiAoIihub24tQU5TSSBDKSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfQzg5OiAgICAgICAgICAgIHByaW50ZiAoIihBTlNJIEMpIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19DX3BsdXNfcGx1czogICAgcHJpbnRmICgiKEMrKykiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX0ZvcnRyYW43NzogICAgICBwcmludGYgKCIoRk9SVFJBTiA3NykiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX0ZvcnRyYW45MDogICAgICBwcmludGYgKCIoRm9ydHJhbiA5MCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX01vZHVsYTI6ICAgICAgICBwcmludGYgKCIoTW9kdWxhIDIpIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19QYXNjYWw4MzogICAgICAgcHJpbnRmICgiKEFOU0kgUGFzY2FsKSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfQWRhODM6ICAgICAgICAgIHByaW50ZiAoIihBZGEpIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19Db2JvbDc0OiAgICAgICAgcHJpbnRmICgiKENvYm9sIDc0KSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfQ29ib2w4NTogICAgICAgIHByaW50ZiAoIihDb2JvbCA4NSkiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX01pcHNfQXNzZW1ibGVyOiBwcmludGYgKCIoTUlQUyBhc3NlbWJsZXIpIik7IGJyZWFrOwotCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiKFVua25vd246ICVseCkiLCB1dmFsdWUpOyBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfZW5jb2Rpbmc6Ci0gICAgICBzd2l0Y2ggKHV2YWx1ZSkKLQl7Ci0JY2FzZSBEV19BVEVfdm9pZDogICAgICAgICAgICBwcmludGYgKCIodm9pZCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19BVEVfYWRkcmVzczogICAgICAgICBwcmludGYgKCIobWFjaGluZSBhZGRyZXNzKSIpOyBicmVhazsKLQljYXNlIERXX0FURV9ib29sZWFuOiAgICAgICAgIHByaW50ZiAoIihib29sZWFuKSIpOyBicmVhazsKLQljYXNlIERXX0FURV9jb21wbGV4X2Zsb2F0OiAgIHByaW50ZiAoIihjb21wbGV4IGZsb2F0KSIpOyBicmVhazsKLQljYXNlIERXX0FURV9mbG9hdDogICAgICAgICAgIHByaW50ZiAoIihmbG9hdCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19BVEVfc2lnbmVkOiAgICAgICAgICBwcmludGYgKCIoc2lnbmVkKSIpOyBicmVhazsKLQljYXNlIERXX0FURV9zaWduZWRfY2hhcjogICAgIHByaW50ZiAoIihzaWduZWQgY2hhcikiKTsgYnJlYWs7Ci0JY2FzZSBEV19BVEVfdW5zaWduZWQ6ICAgICAgICBwcmludGYgKCIodW5zaWduZWQpIik7IGJyZWFrOwotCWNhc2UgRFdfQVRFX3Vuc2lnbmVkX2NoYXI6ICAgcHJpbnRmICgiKHVuc2lnbmVkIGNoYXIpIik7IGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBpZiAodXZhbHVlID49IERXX0FURV9sb191c2VyCi0JICAgICAgJiYgdXZhbHVlIDw9IERXX0FURV9oaV91c2VyKQotCSAgICBwcmludGYgKCIodXNlciBkZWZpbmVkIHR5cGUpIik7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoIih1bmtub3duIHR5cGUpIik7Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfYWNjZXNzaWJpbGl0eToKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX0FDQ0VTU19wdWJsaWM6CQlwcmludGYgKCIocHVibGljKSIpOyBicmVhazsKLQljYXNlIERXX0FDQ0VTU19wcm90ZWN0ZWQ6CXByaW50ZiAoIihwcm90ZWN0ZWQpIik7IGJyZWFrOwotCWNhc2UgRFdfQUNDRVNTX3ByaXZhdGU6CQlwcmludGYgKCIocHJpdmF0ZSkiKTsgYnJlYWs7Ci0JZGVmYXVsdDoJCSAgICAgICAgcHJpbnRmICgiKHVua25vd24gYWNjZXNzaWJpbGl0eSkiKTsgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX3Zpc2liaWxpdHk6Ci0gICAgICBzd2l0Y2ggKHV2YWx1ZSkKLQl7Ci0JY2FzZSBEV19WSVNfbG9jYWw6CXByaW50ZiAoIihsb2NhbCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19WSVNfZXhwb3J0ZWQ6CXByaW50ZiAoIihleHBvcnRlZCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19WSVNfcXVhbGlmaWVkOglwcmludGYgKCIocXVhbGlmaWVkKSIpOyBicmVhazsKLQlkZWZhdWx0OgkJcHJpbnRmICgiKHVua25vd24gdmlzaWJpbGl0eSkiKTsgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX3ZpcnR1YWxpdHk6Ci0gICAgICBzd2l0Y2ggKHV2YWx1ZSkKLQl7Ci0JY2FzZSBEV19WSVJUVUFMSVRZX25vbmU6CXByaW50ZiAoIihub25lKSIpOyBicmVhazsKLQljYXNlIERXX1ZJUlRVQUxJVFlfdmlydHVhbDoJcHJpbnRmICgiKHZpcnR1YWwpIik7IGJyZWFrOwotCWNhc2UgRFdfVklSVFVBTElUWV9wdXJlX3ZpcnR1YWw6cHJpbnRmICgiKHB1cmVfdmlydHVhbCkiKTsgYnJlYWs7Ci0JZGVmYXVsdDoJCSAgICAgICAgcHJpbnRmICgiKHVua25vd24gdmlydHVhbGl0eSkiKTsgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX2lkZW50aWZpZXJfY2FzZToKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX0lEX2Nhc2Vfc2Vuc2l0aXZlOglwcmludGYgKCIoY2FzZV9zZW5zaXRpdmUpIik7IGJyZWFrOwotCWNhc2UgRFdfSURfdXBfY2FzZToJCXByaW50ZiAoIih1cF9jYXNlKSIpOyBicmVhazsKLQljYXNlIERXX0lEX2Rvd25fY2FzZToJCXByaW50ZiAoIihkb3duX2Nhc2UpIik7IGJyZWFrOwotCWNhc2UgRFdfSURfY2FzZV9pbnNlbnNpdGl2ZToJcHJpbnRmICgiKGNhc2VfaW5zZW5zaXRpdmUpIik7IGJyZWFrOwotCWRlZmF1bHQ6CQkgICAgICAgIHByaW50ZiAoIih1bmtub3duIGNhc2UpIik7IGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19BVF9jYWxsaW5nX2NvbnZlbnRpb246Ci0gICAgICBzd2l0Y2ggKHV2YWx1ZSkKLQl7Ci0JY2FzZSBEV19DQ19ub3JtYWw6CXByaW50ZiAoIihub3JtYWwpIik7IGJyZWFrOwotCWNhc2UgRFdfQ0NfcHJvZ3JhbToJcHJpbnRmICgiKHByb2dyYW0pIik7IGJyZWFrOwotCWNhc2UgRFdfQ0Nfbm9jYWxsOglwcmludGYgKCIobm9jYWxsKSIpOyBicmVhazsKLQlkZWZhdWx0OgotCSAgaWYgKHV2YWx1ZSA+PSBEV19DQ19sb191c2VyCi0JICAgICAgJiYgdXZhbHVlIDw9IERXX0NDX2hpX3VzZXIpCi0JICAgIHByaW50ZiAoIih1c2VyIGRlZmluZWQpIik7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoIih1bmtub3duIGNvbnZlbnRpb24pIik7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX2xvY2F0aW9uOgotICAgIGNhc2UgRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb246Ci0gICAgY2FzZSBEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbjoKLSAgICAgIHByaW50ZiAoIigiKTsKLSAgICAgIGRlY29kZV9sb2NhdGlvbl9leHByZXNzaW9uIChibG9ja19zdGFydCwgcG9pbnRlcl9zaXplKTsKLSAgICAgIHByaW50ZiAoIikiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBwcmludGYgKCJcbiIpOwotICByZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19pbmZvIChzZWN0aW9uLCBzdGFydCwgZmlsZSkKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb247Ci0gICAgIHVuc2lnbmVkIGNoYXIgKiAgICAgICBzdGFydDsKLSAgICAgRklMRSAqICAgICAgICAgICAgICAgIGZpbGU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKiBlbmQgPSBzdGFydCArIHNlY3Rpb24tPnNoX3NpemU7Ci0gIHVuc2lnbmVkIGNoYXIgKiBzZWN0aW9uX2JlZ2luID0gc3RhcnQ7Ci0KLSAgcHJpbnRmIChfKCJUaGUgc2VjdGlvbiAlcyBjb250YWluczpcblxuIiksIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCi0gIHdoaWxlIChzdGFydCA8IGVuZCkKLSAgICB7Ci0gICAgICBEV0FSRjJfRXh0ZXJuYWxfQ29tcFVuaXQgKiBleHRlcm5hbDsKLSAgICAgIERXQVJGMl9JbnRlcm5hbF9Db21wVW5pdCAgIGNvbXB1bml0OwotICAgICAgdW5zaWduZWQgY2hhciAqICAgICAgICAgICAgdGFnczsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0gICAgICBpbnQJCQkgbGV2ZWw7Ci0KLSAgICAgIGV4dGVybmFsID0gKERXQVJGMl9FeHRlcm5hbF9Db21wVW5pdCAqKSBzdGFydDsKLQotICAgICAgY29tcHVuaXQuY3VfbGVuZ3RoICAgICAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+Y3VfbGVuZ3RoKTsKLSAgICAgIGNvbXB1bml0LmN1X3ZlcnNpb24gICAgICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmN1X3ZlcnNpb24pOwotICAgICAgY29tcHVuaXQuY3VfYWJicmV2X29mZnNldCA9IEJZVEVfR0VUIChleHRlcm5hbC0+Y3VfYWJicmV2X29mZnNldCk7Ci0gICAgICBjb21wdW5pdC5jdV9wb2ludGVyX3NpemUgID0gQllURV9HRVQgKGV4dGVybmFsLT5jdV9wb2ludGVyX3NpemUpOwotCi0gICAgICB0YWdzID0gc3RhcnQgKyBzaXplb2YgKCogZXh0ZXJuYWwpOwotICAgICAgc3RhcnQgKz0gY29tcHVuaXQuY3VfbGVuZ3RoICsgc2l6ZW9mIChleHRlcm5hbC0+Y3VfbGVuZ3RoKTsKLQotICAgICAgaWYgKGNvbXB1bml0LmN1X3ZlcnNpb24gIT0gMikKLQl7Ci0JICB3YXJuIChfKCJPbmx5IHZlcnNpb24gMiBEV0FSRiBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBwcmludGYgKF8oIiAgQ29tcGlsYXRpb24gVW5pdDpcbiIpKTsKLSAgICAgIHByaW50ZiAoXygiICAgTGVuZ3RoOiAgICAgICAgJWxkXG4iKSwgY29tcHVuaXQuY3VfbGVuZ3RoKTsKLSAgICAgIHByaW50ZiAoXygiICAgVmVyc2lvbjogICAgICAgJWRcbiIpLCBjb21wdW5pdC5jdV92ZXJzaW9uKTsKLSAgICAgIHByaW50ZiAoXygiICAgQWJicmV2IE9mZnNldDogJWxkXG4iKSwgY29tcHVuaXQuY3VfYWJicmV2X29mZnNldCk7Ci0gICAgICBwcmludGYgKF8oIiAgIFBvaW50ZXIgU2l6ZTogICVkXG4iKSwgY29tcHVuaXQuY3VfcG9pbnRlcl9zaXplKTsKLQotICAgICAgaWYgKGZpcnN0X2FiYnJldiAhPSBOVUxMKQotCWZyZWVfYWJicmV2cyAoKTsKLQotICAgICAgLyogUmVhZCBpbiB0aGUgYWJicmV2cyB1c2VkIGJ5IHRoaXMgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLSAgICAgIHsKLQlFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjOwotCXVuc2lnbmVkIGNoYXIgKiAgICAgICBiZWdpbjsKLQotCS8qIExvY2F0ZSB0aGUgLmRlYnVnX2FiYnJldiBzZWN0aW9uIGFuZCBwcm9jZXNzIGl0LiAgKi8KLQlmb3IgKGkgPSAwLCBzZWMgPSBzZWN0aW9uX2hlYWRlcnM7Ci0JICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotCSAgICAgaSArKywgc2VjICsrKQotCSAgaWYgKHN0cmNtcCAoU0VDVElPTl9OQU1FIChzZWMpLCAiLmRlYnVnX2FiYnJldiIpID09IDApCi0JICAgIGJyZWFrOwotCi0JaWYgKGkgPT0gLTEgfHwgc2VjLT5zaF9zaXplID09IDApCi0JICB7Ci0JICAgIHdhcm4gKF8oIlVuYWJsZSB0byBsb2NhdGUgLmRlYnVnX2FiYnJldiBzZWN0aW9uIVxuIikpOwotCSAgICByZXR1cm4gMDsKLQkgIH0KLQotCUdFVF9EQVRBX0FMTE9DIChzZWMtPnNoX29mZnNldCwgc2VjLT5zaF9zaXplLCBiZWdpbiwgdW5zaWduZWQgY2hhciAqLAotCQkJImRlYnVnX2FiYnJldiBzZWN0aW9uIGRhdGEiKTsKLQotCXByb2Nlc3NfYWJicmV2X3NlY3Rpb24gKGJlZ2luICsgY29tcHVuaXQuY3VfYWJicmV2X29mZnNldCwKLQkJCQliZWdpbiArIHNlYy0+c2hfc2l6ZSk7Ci0KLQlmcmVlIChiZWdpbik7Ci0gICAgICB9Ci0KLSAgICAgIGxldmVsID0gMDsKLSAgICAgIHdoaWxlICh0YWdzIDwgc3RhcnQpCi0JewotCSAgaW50ICAgICAgICAgICAgYnl0ZXNfcmVhZDsKLQkgIGludCAgICAgICAgICAgIGFiYnJldl9udW1iZXI7Ci0JICBhYmJyZXZfZW50cnkgKiBlbnRyeTsKLQkgIGFiYnJldl9hdHRyICAqIGF0dHI7Ci0KLQkgIGFiYnJldl9udW1iZXIgPSByZWFkX2xlYjEyOCAodGFncywgJiBieXRlc19yZWFkLCAwKTsKLQkgIHRhZ3MgKz0gYnl0ZXNfcmVhZDsKLQotCSAgLyogQSBudWxsIERJRSBtYXJrcyB0aGUgZW5kIG9mIGEgbGlzdCBvZiBjaGlsZHJlbi4gICovCi0JICBpZiAoYWJicmV2X251bWJlciA9PSAwKQotCSAgICB7Ci0JICAgICAgLS1sZXZlbDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBTY2FuIHRocm91Z2ggdGhlIGFiYnJldmlhdGlvbiBsaXN0IHVudGlsIHdlIHJlYWNoIHRoZQotCSAgICAgY29ycmVjdCBlbnRyeS4gICovCi0JICBmb3IgKGVudHJ5ID0gZmlyc3RfYWJicmV2OwotCSAgICAgICBlbnRyeSAmJiBlbnRyeS0+ZW50cnkgIT0gYWJicmV2X251bWJlcjsKLQkgICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChlbnRyeSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgd2FybiAoXygiVW5hYmxlIHRvIGxvY2F0ZSBlbnRyeSAlZCBpbiB0aGUgYWJicmV2aWF0aW9uIHRhYmxlXG4iKSwKLQkJICAgIGFiYnJldl9udW1iZXIpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0KLQkgIHByaW50ZiAoXygiIDwlZD48JXg+OiBBYmJyZXYgTnVtYmVyOiAlZCAoJXMpXG4iKSwKLQkJICBsZXZlbCwgdGFncyAtIHNlY3Rpb25fYmVnaW4gLSBieXRlc19yZWFkLAotCQkgIGFiYnJldl9udW1iZXIsCi0JCSAgZ2V0X1RBR19uYW1lIChlbnRyeS0+dGFnKSk7Ci0KLQkgIGZvciAoYXR0ciA9IGVudHJ5LT5maXJzdF9hdHRyOyBhdHRyOyBhdHRyID0gYXR0ci0+bmV4dCkKLQkgICAgdGFncyA9IHJlYWRfYW5kX2Rpc3BsYXlfYXR0ciAoYXR0ci0+YXR0cmlidXRlLAotCQkJCQkgIGF0dHItPmZvcm0sCi0JCQkJCSAgdGFncywKLQkJCQkJICBjb21wdW5pdC5jdV9wb2ludGVyX3NpemUpOwotCi0JICBpZiAoZW50cnktPmNoaWxkcmVuKQotCSAgICArK2xldmVsOwotCX0KLSAgICB9Ci0KLSAgcHJpbnRmICgiXG4iKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19hcmFuZ2VzIChzZWN0aW9uLCBzdGFydCwgZmlsZSkKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb247Ci0gICAgIHVuc2lnbmVkIGNoYXIgKiAgICAgICBzdGFydDsKLSAgICAgRklMRSAqICAgICAgICAgICAgICAgIGZpbGU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKiBlbmQgPSBzdGFydCArIHNlY3Rpb24tPnNoX3NpemU7Ci0KLSAgcHJpbnRmIChfKCJUaGUgc2VjdGlvbiAlcyBjb250YWluczpcblxuIiksIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCi0gIHdoaWxlIChzdGFydCA8IGVuZCkKLSAgICB7Ci0gICAgICBEV0FSRjJfRXh0ZXJuYWxfQVJhbmdlICogZXh0ZXJuYWw7Ci0gICAgICBEV0FSRjJfSW50ZXJuYWxfQVJhbmdlICAgYXJhbmdlOwotICAgICAgdW5zaWduZWQgY2hhciAqICAgICAgICAgIHJhbmdlczsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBsZW5ndGg7Ci0gICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgYWRkcmVzczsKLQotICAgICAgZXh0ZXJuYWwgPSAoRFdBUkYyX0V4dGVybmFsX0FSYW5nZSAqKSBzdGFydDsKLQotICAgICAgYXJhbmdlLmFyX2xlbmd0aCAgICAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+YXJfbGVuZ3RoKTsKLSAgICAgIGFyYW5nZS5hcl92ZXJzaW9uICAgICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmFyX3ZlcnNpb24pOwotICAgICAgYXJhbmdlLmFyX2luZm9fb2Zmc2V0ICA9IEJZVEVfR0VUIChleHRlcm5hbC0+YXJfaW5mb19vZmZzZXQpOwotICAgICAgYXJhbmdlLmFyX3BvaW50ZXJfc2l6ZSA9IEJZVEVfR0VUIChleHRlcm5hbC0+YXJfcG9pbnRlcl9zaXplKTsKLSAgICAgIGFyYW5nZS5hcl9zZWdtZW50X3NpemUgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmFyX3NlZ21lbnRfc2l6ZSk7Ci0KLSAgICAgIHByaW50ZiAoXygiICBMZW5ndGg6ICAgICAgICAgICAgICAgICAgICVsZFxuIiksIGFyYW5nZS5hcl9sZW5ndGgpOwotICAgICAgcHJpbnRmIChfKCIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgJWRcbiIpLCBhcmFuZ2UuYXJfdmVyc2lvbik7Ci0gICAgICBwcmludGYgKF8oIiAgT2Zmc2V0IGludG8gLmRlYnVnX2luZm86ICAlbHhcbiIpLCBhcmFuZ2UuYXJfaW5mb19vZmZzZXQpOwotICAgICAgcHJpbnRmIChfKCIgIFBvaW50ZXIgU2l6ZTogICAgICAgICAgICAgJWRcbiIpLCBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplKTsKLSAgICAgIHByaW50ZiAoXygiICBTZWdtZW50IFNpemU6ICAgICAgICAgICAgICVkXG4iKSwgYXJhbmdlLmFyX3NlZ21lbnRfc2l6ZSk7Ci0KLSAgICAgIHByaW50ZiAoXygiXG4gICAgQWRkcmVzcyAgTGVuZ3RoXG4iKSk7Ci0KLSAgICAgIHJhbmdlcyA9IHN0YXJ0ICsgc2l6ZW9mICgqIGV4dGVybmFsKTsKLQotICAgICAgZm9yICg7OykKLQl7Ci0JICBhZGRyZXNzID0gYnl0ZV9nZXQgKHJhbmdlcywgYXJhbmdlLmFyX3BvaW50ZXJfc2l6ZSk7Ci0KLQkgIGlmIChhZGRyZXNzID09IDApCi0JICAgIGJyZWFrOwotCi0JICByYW5nZXMgKz0gYXJhbmdlLmFyX3BvaW50ZXJfc2l6ZTsKLQotCSAgbGVuZ3RoICA9IGJ5dGVfZ2V0IChyYW5nZXMsIGFyYW5nZS5hcl9wb2ludGVyX3NpemUpOwotCi0JICByYW5nZXMgKz0gYXJhbmdlLmFyX3BvaW50ZXJfc2l6ZTsKLQotCSAgcHJpbnRmICgiICAgICU4LjhseCAlbHVcbiIsIGFkZHJlc3MsIGxlbmd0aCk7Ci0JfQotCi0gICAgICBzdGFydCArPSBhcmFuZ2UuYXJfbGVuZ3RoICsgc2l6ZW9mIChleHRlcm5hbC0+YXJfbGVuZ3RoKTsKLSAgICB9Ci0KLSAgcHJpbnRmICgiXG4iKTsKLQotICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgaW50Ci1kaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZTsKLXsKLSAgcHJpbnRmIChfKCJEaXNwbGF5aW5nIHRoZSBkZWJ1ZyBjb250ZW50cyBvZiBzZWN0aW9uICVzIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLlxuIiksCi0JICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCi0gIHJldHVybiAxOwotfQotCi0gIC8qIEEgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgYSBkZWJ1ZyBzZWN0aW9uIGFuZCBhIHBvaW50ZXIKLSAgICAgdG8gYSBmdW5jdGlvbiB0aGF0IGNhbiBkZWNvZGUgaXQuICAqLwotc3RydWN0Ci17Ci0gIGNoYXIgKiBuYW1lOwotICBpbnQgKCogZGlzcGxheSkgUEFSQU1TKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIHVuc2lnbmVkIGNoYXIgKiwgRklMRSAqKSk7Ci19Ci1kZWJ1Z19kaXNwbGF5c1tdID0KLXsKLSAgeyAiLmRlYnVnX2luZm8iLCAgICAgICAgZGlzcGxheV9kZWJ1Z19pbmZvIH0sCi0gIHsgIi5kZWJ1Z19hYmJyZXYiLCAgICAgIGRpc3BsYXlfZGVidWdfYWJicmV2IH0sCi0gIHsgIi5kZWJ1Z19saW5lIiwgICAgICAgIGRpc3BsYXlfZGVidWdfbGluZXMgfSwKLSAgeyAiLmRlYnVnX2FyYW5nZXMiLCAgICAgZGlzcGxheV9kZWJ1Z19hcmFuZ2VzIH0sCi0gIHsgIi5kZWJ1Z19wdWJuYW1lcyIsICAgIGRpc3BsYXlfZGVidWdfcHVibmFtZXMgfSwKLSAgeyAiLmRlYnVnX21hY2luZm8iLCAgICAgZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkIH0sCi0gIHsgIi5kZWJ1Z19mcmFtZSIsICAgICAgIGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCB9LAotICB7ICIuZGVidWdfc3RyIiwgICAgICAgICBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQgfSwKLSAgeyAiLmRlYnVnX3N0YXRpY19mdW5jIiwgZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkIH0sCi0gIHsgIi5kZWJ1Z19zdGF0aWNfdmFycyIsIGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCB9LAotICB7ICIuZGVidWdfdHlwZXMiLCAgICAgICBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQgfSwKLSAgeyAiLmRlYnVnX3dlYWtuYW1lcyIsICAgZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkIH0KLX07Ci0KLXN0YXRpYyBpbnQKLWRpc3BsYXlfZGVidWdfc2VjdGlvbiAoc2VjdGlvbiwgZmlsZSkKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb247Ci0gICAgIEZJTEUgKiBmaWxlOwotewotICBjaGFyICogICAgICAgICAgbmFtZSA9IFNFQ1RJT05fTkFNRSAoc2VjdGlvbik7Ci0gIGJmZF9zaXplX3R5cGUgICBsZW5ndGg7Ci0gIHVuc2lnbmVkIGNoYXIgKiBzdGFydDsKLSAgaW50ICAgICAgICAgICAgIGk7Ci0KLSAgbGVuZ3RoID0gc2VjdGlvbi0+c2hfc2l6ZTsKLSAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiXG5TZWN0aW9uICclcycgaGFzIG5vIGRlYnVnZ2luZyBkYXRhLlxuIiksIG5hbWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIEdFVF9EQVRBX0FMTE9DIChzZWN0aW9uLT5zaF9vZmZzZXQsIGxlbmd0aCwgc3RhcnQsIHVuc2lnbmVkIGNoYXIgKiwKLQkJICAiZGVidWcgc2VjdGlvbiBkYXRhIik7Ci0KLSAgLyogU2VlIGlmIHdlIGtub3cgaG93IHRvIGRpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbi4gICovCi0gIGZvciAoaSA9IE5VTV9FTEVNIChkZWJ1Z19kaXNwbGF5cyk7IGktLTspCi0gICAgaWYgKHN0cmNtcCAoZGVidWdfZGlzcGxheXNbaV0ubmFtZSwgbmFtZSkgPT0gMCkKLSAgICAgIHsKLQlkZWJ1Z19kaXNwbGF5c1tpXS5kaXNwbGF5IChzZWN0aW9uLCBzdGFydCwgZmlsZSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgaWYgKGkgPT0gLTEpCi0gICAgcHJpbnRmIChfKCJVbnJlY29nbmlzZWQgZGVidWcgc2VjdGlvbjogJXNcbiIpLCBuYW1lKTsKLQotICBmcmVlIChzdGFydCk7Ci0KLSAgLyogSWYgd2UgbG9hZGVkIGluIHRoZSBhYmJyZXYgc2VjdGlvbiBhdCBzb21lIHBvaW50LAotICAgICB3ZSBtdXN0IHJlbGVhc2UgaXQgaGVyZS4gICovCi0gIGlmIChmaXJzdF9hYmJyZXYgIT0gTlVMTCkKLSAgICBmcmVlX2FiYnJldnMgKCk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3Nfc2VjdGlvbl9jb250ZW50cyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZjMyX0ludGVybmFsX1NoZHIgKiAgICBzZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgIGk7Ci0KLSAgaWYgKCEgZG9fZHVtcCkKLSAgICByZXR1cm4gMTsKLQotICBmb3IgKGkgPSAwLCBzZWN0aW9uID0gc2VjdGlvbl9oZWFkZXJzOwotICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW0KLSAgICAgICAmJiBpIDwgbnVtX2R1bXBfc2VjdHM7Ci0gICAgICAgaSArKywgc2VjdGlvbiArKykKLSAgICB7Ci0jaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQotICAgICAgaWYgKGR1bXBfc2VjdHNbaV0gJiBESVNBU1NfRFVNUCkKLQlkaXNhc3NlbWJsZV9zZWN0aW9uIChzZWN0aW9uLCBmaWxlKTsKLSNlbmRpZgotICAgICAgaWYgKGR1bXBfc2VjdHNbaV0gJiBIRVhfRFVNUCkKLQlkdW1wX3NlY3Rpb24gKHNlY3Rpb24sIGZpbGUpOwotCi0gICAgICBpZiAoZHVtcF9zZWN0c1tpXSAmIERFQlVHX0RVTVApCi0JZGlzcGxheV9kZWJ1Z19zZWN0aW9uIChzZWN0aW9uLCBmaWxlKTsKLSAgICB9Ci0KLSAgaWYgKGkgPCBudW1fZHVtcF9zZWN0cykKLSAgICB3YXJuIChfKCJTb21lIHNlY3Rpb25zIHdlcmUgbm90IGR1bXBlZCBiZWNhdXNlIHRoZXkgZG8gbm90IGV4aXN0IVxuIikpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19taXBzX2ZwZV9leGNlcHRpb24gKG1hc2spCi0gICAgIGludCBtYXNrOwotewotICBpZiAobWFzaykKLSAgICB7Ci0gICAgICBpbnQgZmlyc3QgPSAxOwotICAgICAgaWYgKG1hc2sgJiBPRVhfRlBVX0lORVgpCi0JZnB1dHMgKCJJTkVYIiwgc3Rkb3V0KSwgZmlyc3QgPSAwOwotICAgICAgaWYgKG1hc2sgJiBPRVhfRlBVX1VGTE8pCi0JcHJpbnRmICgiJXNVRkxPIiwgZmlyc3QgPyAiIiA6ICJ8IiksIGZpcnN0ID0gMDsKLSAgICAgIGlmIChtYXNrICYgT0VYX0ZQVV9PRkxPKQotCXByaW50ZiAoIiVzT0ZMTyIsIGZpcnN0ID8gIiIgOiAifCIpLCBmaXJzdCA9IDA7Ci0gICAgICBpZiAobWFzayAmIE9FWF9GUFVfRElWMCkKLQlwcmludGYgKCIlc0RJVjAiLCBmaXJzdCA/ICIiIDogInwiKSwgZmlyc3QgPSAwOwotICAgICAgaWYgKG1hc2sgJiBPRVhfRlBVX0lOVkFMKQotCXByaW50ZiAoIiVzSU5WQUwiLCBmaXJzdCA/ICIiIDogInwiKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBmcHV0cyAoIjAiLCBzdGRvdXQpOwotfQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX21pcHNfc3BlY2lmaWMgKGZpbGUpCi0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIEVsZl9JbnRlcm5hbF9EeW4gKmVudHJ5OwotICBzaXplX3QgbGlibGlzdF9vZmZzZXQgPSAwOwotICBzaXplX3QgbGlibGlzdG5vID0gMDsKLSAgc2l6ZV90IGNvbmZsaWN0c25vID0gMDsKLSAgc2l6ZV90IG9wdGlvbnNfb2Zmc2V0ID0gMDsKLSAgc2l6ZV90IGNvbmZsaWN0c19vZmZzZXQgPSAwOwotCi0gIC8qIFdlIGhhdmUgYSBsb3Qgb2Ygc3BlY2lhbCBzZWN0aW9ucy4gIFRoYW5rcyBTR0khICAqLwotICBpZiAoZHluYW1pY19zZWdtZW50ID09IE5VTEwpCi0gICAgLyogTm8gaW5mb3JtYXRpb24gYXZhaWxhYmxlLiAgKi8KLSAgICByZXR1cm4gMDsKLQotICBmb3IgKGVudHJ5ID0gZHluYW1pY19zZWdtZW50OyBlbnRyeS0+ZF90YWcgIT0gRFRfTlVMTDsgKytlbnRyeSkKLSAgICBzd2l0Y2ggKGVudHJ5LT5kX3RhZykKLSAgICAgIHsKLSAgICAgIGNhc2UgRFRfTUlQU19MSUJMSVNUOgotCWxpYmxpc3Rfb2Zmc2V0ID0gZW50cnktPmRfdW4uZF92YWwgLSBsb2FkYWRkcjsKLQlicmVhazsKLSAgICAgIGNhc2UgRFRfTUlQU19MSUJMSVNUTk86Ci0JbGlibGlzdG5vID0gZW50cnktPmRfdW4uZF92YWw7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIERUX01JUFNfT1BUSU9OUzoKLQlvcHRpb25zX29mZnNldCA9IGVudHJ5LT5kX3VuLmRfdmFsIC0gbG9hZGFkZHI7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIERUX01JUFNfQ09ORkxJQ1Q6Ci0JY29uZmxpY3RzX29mZnNldCA9IGVudHJ5LT5kX3VuLmRfdmFsIC0gbG9hZGFkZHI7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIERUX01JUFNfQ09ORkxJQ1ROTzoKLQljb25mbGljdHNubyA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLQotICBpZiAobGlibGlzdF9vZmZzZXQgIT0gMCAmJiBsaWJsaXN0bm8gIT0gMCAmJiBkb19keW5hbWljKQotICAgIHsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0xpYiAqZWxpYjsKLSAgICAgIHNpemVfdCBjbnQ7Ci0KLSAgICAgIEdFVF9EQVRBX0FMTE9DIChsaWJsaXN0X29mZnNldCwgbGlibGlzdG5vICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9MaWIpLAotCQkgICAgICBlbGliLCBFbGYzMl9FeHRlcm5hbF9MaWIgKiwgImxpYmxpc3QiKTsKLQotICAgICAgcHJpbnRmICgiXG5TZWN0aW9uICcubGlibGlzdCcgY29udGFpbnMgJWQgZW50cmllczpcbiIsIGxpYmxpc3Rubyk7Ci0gICAgICBmcHV0cyAoIiAgICAgTGlicmFyeSAgICAgICAgICAgICAgVGltZSBTdGFtcCAgICAgICAgICBDaGVja3N1bSAgIFZlcnNpb24gRmxhZ3NcbiIsCi0JICAgICBzdGRvdXQpOwotCi0gICAgICBmb3IgKGNudCA9IDA7IGNudCA8IGxpYmxpc3RubzsgKytjbnQpCi0JewotCSAgRWxmMzJfTGliIGxpYmxpc3Q7Ci0JICB0aW1lX3QgdGltZTsKLQkgIGNoYXIgdGltZWJ1ZlsyMF07Ci0KLQkgIGxpYmxpc3QubF9uYW1lID0gQllURV9HRVQgKGVsaWJbY250XS5sX25hbWUpOwotCSAgdGltZSA9IEJZVEVfR0VUIChlbGliW2NudF0ubF90aW1lX3N0YW1wKTsKLQkgIGxpYmxpc3QubF9jaGVja3N1bSA9IEJZVEVfR0VUIChlbGliW2NudF0ubF9jaGVja3N1bSk7Ci0JICBsaWJsaXN0LmxfdmVyc2lvbiA9IEJZVEVfR0VUIChlbGliW2NudF0ubF92ZXJzaW9uKTsKLQkgIGxpYmxpc3QubF9mbGFncyA9IEJZVEVfR0VUIChlbGliW2NudF0ubF9mbGFncyk7Ci0KLQkgIHN0cmZ0aW1lICh0aW1lYnVmLCAyMCwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgZ210aW1lICgmdGltZSkpOwotCi0JICBwcmludGYgKCIlM2Q6ICUtMjBzICVzICUjMTBseCAlLTdsZCIsIGNudCwKLQkJICBkeW5hbWljX3N0cmluZ3MgKyBsaWJsaXN0LmxfbmFtZSwgdGltZWJ1ZiwKLQkJICBsaWJsaXN0LmxfY2hlY2tzdW0sIGxpYmxpc3QubF92ZXJzaW9uKTsKLQotCSAgaWYgKGxpYmxpc3QubF9mbGFncyA9PSAwKQotCSAgICBwdXRzICgiIE5PTkUiKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0JCWludCBiaXQ7Ci0JICAgICAgfSBsX2ZsYWdzX3ZhbHNbXSA9Ci0JCXsKLQkJICB7ICIgRVhBQ1RfTUFUQ0giLCBMTF9FWEFDVF9NQVRDSCB9LAotCQkgIHsgIiBJR05PUkVfSU5UX1ZFUiIsIExMX0lHTk9SRV9JTlRfVkVSIH0sCi0JCSAgeyAiIFJFUVVJUkVfTUlOT1IiLCBMTF9SRVFVSVJFX01JTk9SIH0sCi0JCSAgeyAiIEVYUE9SVFMiLCBMTF9FWFBPUlRTIH0sCi0JCSAgeyAiIERFTEFZX0xPQUQiLCBMTF9ERUxBWV9MT0FEIH0sCi0JCSAgeyAiIERFTFRBIiwgTExfREVMVEEgfQotCQl9OwotCSAgICAgIGludCBmbGFncyA9IGxpYmxpc3QubF9mbGFnczsKLQkgICAgICBpbnQgZmNudDsKLQotCSAgICAgIGZvciAoZmNudCA9IDA7Ci0JCSAgIGZjbnQgPCBzaXplb2YgKGxfZmxhZ3NfdmFscykgLyBzaXplb2YgKGxfZmxhZ3NfdmFsc1swXSk7Ci0JCSAgICsrZmNudCkKLQkJaWYgKChmbGFncyAmIGxfZmxhZ3NfdmFsc1tmY250XS5iaXQpICE9IDApCi0JCSAgewotCQkgICAgZnB1dHMgKGxfZmxhZ3NfdmFsc1tmY250XS5uYW1lLCBzdGRvdXQpOwotCQkgICAgZmxhZ3MgXj0gbF9mbGFnc192YWxzW2ZjbnRdLmJpdDsKLQkJICB9Ci0JICAgICAgaWYgKGZsYWdzICE9IDApCi0JCXByaW50ZiAoIiAlI3giLCAodW5zaWduZWQgaW50KSBmbGFncyk7Ci0KLQkgICAgICBwdXRzICgiIik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZyZWUgKGVsaWIpOwotICAgIH0KLQotICBpZiAob3B0aW9uc19vZmZzZXQgIT0gMCkKLSAgICB7Ci0gICAgICBFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqZW9wdDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzZWN0ID0gc2VjdGlvbl9oZWFkZXJzOwotICAgICAgRWxmX0ludGVybmFsX09wdGlvbnMgKmlvcHQ7Ci0gICAgICBFbGZfSW50ZXJuYWxfT3B0aW9ucyAqb3B0aW9uOwotICAgICAgc2l6ZV90IG9mZnNldDsKLSAgICAgIGludCBjbnQ7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIHNlY3Rpb24gaGVhZGVyIHNvIHRoYXQgd2UgZ2V0IHRoZSBzaXplLiAgKi8KLSAgICAgIHdoaWxlIChzZWN0LT5zaF90eXBlICE9IFNIVF9NSVBTX09QVElPTlMpCi0JKytzZWN0OwotCi0gICAgICBHRVRfREFUQV9BTExPQyAob3B0aW9uc19vZmZzZXQsIHNlY3QtPnNoX3NpemUsIGVvcHQsCi0JCSAgICAgIEVsZl9FeHRlcm5hbF9PcHRpb25zICosICJvcHRpb25zIik7Ci0KLSAgICAgIGlvcHQgPSAoRWxmX0ludGVybmFsX09wdGlvbnMgKikgbWFsbG9jICgoc2VjdC0+c2hfc2l6ZSAvIHNpemVvZiAoZW9wdCkpCi0JCQkJCSAgICAgICogc2l6ZW9mICgqaW9wdCkpOwotICAgICAgaWYgKGlvcHQgPT0gTlVMTCkKLQl7Ci0JICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeSIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgb2Zmc2V0ID0gY250ID0gMDsKLSAgICAgIG9wdGlvbiA9IGlvcHQ7Ci0gICAgICB3aGlsZSAob2Zmc2V0IDwgc2VjdC0+c2hfc2l6ZSkKLQl7Ci0JICBFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqZW9wdGlvbjsKLQotCSAgZW9wdGlvbiA9IChFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqKSAoKGNoYXIgKikgZW9wdCArIG9mZnNldCk7Ci0KLQkgIG9wdGlvbi0+a2luZCA9IEJZVEVfR0VUIChlb3B0aW9uLT5raW5kKTsKLQkgIG9wdGlvbi0+c2l6ZSA9IEJZVEVfR0VUIChlb3B0aW9uLT5zaXplKTsKLQkgIG9wdGlvbi0+c2VjdGlvbiA9IEJZVEVfR0VUIChlb3B0aW9uLT5zZWN0aW9uKTsKLQkgIG9wdGlvbi0+aW5mbyA9IEJZVEVfR0VUIChlb3B0aW9uLT5pbmZvKTsKLQotCSAgb2Zmc2V0ICs9IG9wdGlvbi0+c2l6ZTsKLQkgICsrb3B0aW9uOwotCSAgKytjbnQ7Ci0JfQotCi0gICAgICBwcmludGYgKF8oIlxuU2VjdGlvbiAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iKSwKLQkgICAgICBzdHJpbmdfdGFibGUgKyBzZWN0LT5zaF9uYW1lLCBjbnQpOwotCi0gICAgICBvcHRpb24gPSBpb3B0OwotICAgICAgd2hpbGUgKGNudC0tID4gMCkKLQl7Ci0JICBzaXplX3QgbGVuOwotCi0JICBzd2l0Y2ggKG9wdGlvbi0+a2luZCkKLQkgICAgewotCSAgICBjYXNlIE9ES19OVUxMOgotCSAgICAgIC8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbi4gICovCi0JICAgICAgcHJpbnRmICgiIE5VTEwgICAgICAgJWQgJWx4Iiwgb3B0aW9uLT5zZWN0aW9uLCBvcHRpb24tPmluZm8pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19SRUdJTkZPOgotCSAgICAgIHByaW50ZiAoIiBSRUdJTkZPICAgICIpOwotCSAgICAgIGlmIChlbGZfaGVhZGVyLmVfbWFjaGluZSA9PSBFTV9NSVBTKQotCQl7Ci0JCSAgLyogMzJiaXQgZm9ybS4gICovCi0JCSAgRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyAqZXJlZzsKLQkJICBFbGYzMl9SZWdJbmZvIHJlZ2luZm87Ci0KLQkJICBlcmVnID0gKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKikgKG9wdGlvbiArIDEpOwotCQkgIHJlZ2luZm8ucmlfZ3BybWFzayA9IEJZVEVfR0VUIChlcmVnLT5yaV9ncHJtYXNrKTsKLQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMF0gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1swXSk7Ci0JCSAgcmVnaW5mby5yaV9jcHJtYXNrWzFdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbMV0pOwotCQkgIHJlZ2luZm8ucmlfY3BybWFza1syXSA9IEJZVEVfR0VUIChlcmVnLT5yaV9jcHJtYXNrWzJdKTsKLQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbM10gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1szXSk7Ci0JCSAgcmVnaW5mby5yaV9ncF92YWx1ZSA9IEJZVEVfR0VUIChlcmVnLT5yaV9ncF92YWx1ZSk7Ci0KLQkJICBwcmludGYgKCJHUFIgJTA4bHggIEdQIDB4JWx4XG4iLAotCQkJICByZWdpbmZvLnJpX2dwcm1hc2ssCi0JCQkgICh1bnNpZ25lZCBsb25nKSByZWdpbmZvLnJpX2dwX3ZhbHVlKTsKLQkJICBwcmludGYgKCIgICAgICAgICAgICBDUFIwICUwOGx4ICBDUFIxICUwOGx4ICBDUFIyICUwOGx4ICBDUFIzICUwOGx4XG4iLAotCQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMF0sIHJlZ2luZm8ucmlfY3BybWFza1sxXSwKLQkJCSAgcmVnaW5mby5yaV9jcHJtYXNrWzJdLCByZWdpbmZvLnJpX2Nwcm1hc2tbM10pOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogNjQgYml0IGZvcm0uICAqLwotCQkgIEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKmVyZWc7Ci0JCSAgRWxmNjRfSW50ZXJuYWxfUmVnSW5mbyByZWdpbmZvOwotCi0JCSAgZXJlZyA9IChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvICopIChvcHRpb24gKyAxKTsKLQkJICByZWdpbmZvLnJpX2dwcm1hc2sgPSBCWVRFX0dFVCAoZXJlZy0+cmlfZ3BybWFzayk7Ci0JCSAgcmVnaW5mby5yaV9jcHJtYXNrWzBdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbMF0pOwotCQkgIHJlZ2luZm8ucmlfY3BybWFza1sxXSA9IEJZVEVfR0VUIChlcmVnLT5yaV9jcHJtYXNrWzFdKTsKLQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMl0gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1syXSk7Ci0JCSAgcmVnaW5mby5yaV9jcHJtYXNrWzNdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbM10pOwotCQkgIHJlZ2luZm8ucmlfZ3BfdmFsdWUgPSBCWVRFX0dFVCAoZXJlZy0+cmlfZ3BfdmFsdWUpOwotCi0JCSAgcHJpbnRmICgiR1BSICUwOGx4ICBHUCAweCIsCi0JCQkgIHJlZ2luZm8ucmlfZ3BybWFzayk7Ci0JCSAgcHJpbnRmX3ZtYSAocmVnaW5mby5yaV9ncF92YWx1ZSk7Ci0JCSAgcHJpbnRmICgiXG4iKTsKLQotCQkgIHByaW50ZiAoIiAgICAgICAgICAgIENQUjAgJTA4bHggIENQUjEgJTA4bHggIENQUjIgJTA4bHggIENQUjMgJTA4bHhcbiIsCi0JCQkgIHJlZ2luZm8ucmlfY3BybWFza1swXSwgcmVnaW5mby5yaV9jcHJtYXNrWzFdLAotCQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMl0sIHJlZ2luZm8ucmlfY3BybWFza1szXSk7Ci0JCX0KLQkgICAgICArK29wdGlvbjsKLQkgICAgICBjb250aW51ZTsKLQkgICAgY2FzZSBPREtfRVhDRVBUSU9OUzoKLQkgICAgICBmcHV0cyAoIiBFWENFUFRJT05TIGZwZV9taW4oIiwgc3Rkb3V0KTsKLQkgICAgICBwcm9jZXNzX21pcHNfZnBlX2V4Y2VwdGlvbiAob3B0aW9uLT5pbmZvICYgT0VYX0ZQVV9NSU4pOwotCSAgICAgIGZwdXRzICgiKSBmcGVfbWF4KCIsIHN0ZG91dCk7Ci0JICAgICAgcHJvY2Vzc19taXBzX2ZwZV9leGNlcHRpb24gKChvcHRpb24tPmluZm8gJiBPRVhfRlBVX01BWCkgPj4gOCk7Ci0JICAgICAgZnB1dHMgKCIpIiwgc3Rkb3V0KTsKLQotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPRVhfUEFHRTApCi0JCWZwdXRzICgiIFBBR0UwIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0VYX1NNTSkKLQkJZnB1dHMgKCIgU01NIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0VYX0ZQREJVRykKLQkJZnB1dHMgKCIgRlBEQlVHIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0VYX0RJU01JU1MpCi0JCWZwdXRzICgiIERJU01JU1MiLCBzdGRvdXQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19QQUQ6Ci0JICAgICAgZnB1dHMgKCIgUEFEICAgICAgICIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9QQURfUFJFRklYKQotCQlmcHV0cyAoIiBQUkVGSVgiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPUEFEX1BPU1RGSVgpCi0JCWZwdXRzICgiIFBPU1RGSVgiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPUEFEX1NZTUJPTCkKLQkJZnB1dHMgKCIgU1lNQk9MIiwgc3Rkb3V0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPREtfSFdQQVRDSDoKLQkgICAgICBmcHV0cyAoIiBIV1BBVENIICAgIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0hXX1I0S0VPUCkKLQkJZnB1dHMgKCIgUjRLRU9QIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0hXX1I4S1BGRVRDSCkKLQkJZnB1dHMgKCIgUjhLUEZFVENIIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0hXX1I1S0VPUCkKLQkJZnB1dHMgKCIgUjVLRU9QIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0hXX1I1S0NWVEwpCi0JCWZwdXRzICgiIFI1S0NWVEwiLCBzdGRvdXQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19GSUxMOgotCSAgICAgIGZwdXRzICgiIEZJTEwgICAgICAgIiwgc3Rkb3V0KTsKLQkgICAgICAvKiBYWFggUHJpbnQgY29udGVudCBvZiBpbmZvIHdvcmQ/ICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19UQUdTOgotCSAgICAgIGZwdXRzICgiIFRBR1MgICAgICAgIiwgc3Rkb3V0KTsKLQkgICAgICAvKiBYWFggUHJpbnQgY29udGVudCBvZiBpbmZvIHdvcmQ/ICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19IV0FORDoKLQkgICAgICBmcHV0cyAoIiBIV0FORCAgICAgIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0hXQTBfUjRLRU9QX0NIRUNLRUQpCi0JCWZwdXRzICgiIFI0S0VPUF9DSEVDS0VEIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0hXQTBfUjRLRU9QX0NMRUFOKQotCQlmcHV0cyAoIiBSNEtFT1BfQ0xFQU4iLCBzdGRvdXQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19IV09SOgotCSAgICAgIGZwdXRzICgiIEhXT1IgICAgICAiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdBMF9SNEtFT1BfQ0hFQ0tFRCkKLQkJZnB1dHMgKCIgUjRLRU9QX0NIRUNLRUQiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdBMF9SNEtFT1BfQ0xFQU4pCi0JCWZwdXRzICgiIFI0S0VPUF9DTEVBTiIsIHN0ZG91dCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX0dQX0dST1VQOgotCSAgICAgIHByaW50ZiAoIiBHUF9HUk9VUCAgJSMwNmx4ICBzZWxmLWNvbnRhaW5lZCAlIzA2bHgiLAotCQkgICAgICBvcHRpb24tPmluZm8gJiBPR1BfR1JPVVAsCi0JCSAgICAgIChvcHRpb24tPmluZm8gJiBPR1BfU0VMRikgPj4gMTYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19JREVOVDoKLQkgICAgICBwcmludGYgKCIgSURFTlQgICAgICUjMDZseCAgc2VsZi1jb250YWluZWQgJSMwNmx4IiwKLQkJICAgICAgb3B0aW9uLT5pbmZvICYgT0dQX0dST1VQLAotCQkgICAgICAob3B0aW9uLT5pbmZvICYgT0dQX1NFTEYpID4+IDE2KTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4uICAqLwotCSAgICAgIHByaW50ZiAoIiAlM2QgPz8/ICAgICAlZCAlbHgiLAotCQkgICAgICBvcHRpb24tPmtpbmQsIG9wdGlvbi0+c2VjdGlvbiwgb3B0aW9uLT5pbmZvKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBsZW4gPSBzaXplb2YgKCplb3B0KTsKLQkgIHdoaWxlIChsZW4gPCBvcHRpb24tPnNpemUpCi0JICAgIGlmICgoKGNoYXIgKikgb3B0aW9uKVtsZW5dID49ICcgJwotCQkmJiAoKGNoYXIgKikgb3B0aW9uKVtsZW5dIDwgMHg3ZikKLQkgICAgICBwcmludGYgKCIlYyIsICgoY2hhciAqKSBvcHRpb24pW2xlbisrXSk7Ci0JICAgIGVsc2UKLQkgICAgICBwcmludGYgKCJcXCUwM28iLCAoKGNoYXIgKikgb3B0aW9uKVtsZW4rK10pOwotCi0JICBmcHV0cyAoIlxuIiwgc3Rkb3V0KTsKLQkgICsrb3B0aW9uOwotCX0KLQotICAgICAgZnJlZSAoZW9wdCk7Ci0gICAgfQotCi0gIGlmIChjb25mbGljdHNfb2Zmc2V0ICE9IDAgJiYgY29uZmxpY3Rzbm8gIT0gMCkKLSAgICB7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9Db25mbGljdCAqZWNvbmYzMjsKLSAgICAgIEVsZjY0X0V4dGVybmFsX0NvbmZsaWN0ICplY29uZjY0OwotICAgICAgRWxmMzJfQ29uZmxpY3QgKmljb25mOwotICAgICAgc2l6ZV90IGNudDsKLQotICAgICAgaWYgKGR5bmFtaWNfc3ltYm9scyA9PSBOVUxMKQotCXsKLQkgIGVycm9yIChfKCJjb25mbGljdCBsaXN0IHdpdGggd2l0aG91dCB0YWJsZSIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgaWNvbmYgPSAoRWxmMzJfQ29uZmxpY3QgKikgbWFsbG9jIChjb25mbGljdHNubyAqIHNpemVvZiAoKmljb25mKSk7Ci0gICAgICBpZiAoaWNvbmYgPT0gTlVMTCkKLQl7Ci0JICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeSIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgaWYgKGJpbmFyeV9jbGFzcyA9PSBFTEZDTEFTUzMyKQotCXsKLQkgIEdFVF9EQVRBX0FMTE9DIChjb25mbGljdHNfb2Zmc2V0LCBjb25mbGljdHNubyAqIHNpemVvZiAoKmVjb25mMzIpLAotCQkJICBlY29uZjMyLCBFbGYzMl9FeHRlcm5hbF9Db25mbGljdCAqLCAiY29uZmxpY3QiKTsKLQotCSAgZm9yIChjbnQgPSAwOyBjbnQgPCBjb25mbGljdHNubzsgKytjbnQpCi0JICAgIGljb25mW2NudF0gPSBCWVRFX0dFVCAoZWNvbmYzMltjbnRdKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgR0VUX0RBVEFfQUxMT0MgKGNvbmZsaWN0c19vZmZzZXQsIGNvbmZsaWN0c25vICogc2l6ZW9mICgqZWNvbmY2NCksCi0JCQkgIGVjb25mNjQsIEVsZjY0X0V4dGVybmFsX0NvbmZsaWN0ICosICJjb25mbGljdCIpOwotCi0JICBmb3IgKGNudCA9IDA7IGNudCA8IGNvbmZsaWN0c25vOyArK2NudCkKLQkgICAgaWNvbmZbY250XSA9IEJZVEVfR0VUIChlY29uZjY0W2NudF0pOwotCX0KLQotICAgICAgcHJpbnRmIChfKCJcblNlY3Rpb24gJy5jb25mbGljdCcgY29udGFpbnMgJWQgZW50cmllczpcbiIpLCBjb25mbGljdHNubyk7Ci0gICAgICBwdXRzIChfKCIgIE51bTogICAgSW5kZXggICAgICAgVmFsdWUgIE5hbWUiKSk7Ci0KLSAgICAgIGZvciAoY250ID0gMDsgY250IDwgY29uZmxpY3Rzbm87ICsrY250KQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gKnBzeW0gPSAmZHluYW1pY19zeW1ib2xzW2ljb25mW2NudF1dOwotCi0JICBwcmludGYgKCIlNXU6ICU4bHUgICUjMTBseCAgJXNcbiIsCi0JCSAgY250LCBpY29uZltjbnRdLCAodW5zaWduZWQgbG9uZykgcHN5bS0+c3RfdmFsdWUsCi0JCSAgZHluYW1pY19zdHJpbmdzICsgcHN5bS0+c3RfbmFtZSk7Ci0JfQotCi0KLSAgICAgIGZyZWUgKGljb25mKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3NfYXJjaF9zcGVjaWZpYyAoZmlsZSkKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgc3dpdGNoIChlbGZfaGVhZGVyLmVfbWFjaGluZSkKLSAgICB7Ci0gICAgY2FzZSBFTV9NSVBTOgotICAgIGNhc2UgRU1fTUlQU19SUzRfQkU6Ci0gICAgICByZXR1cm4gcHJvY2Vzc19taXBzX3NwZWNpZmljIChmaWxlKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1nZXRfZmlsZV9oZWFkZXIgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGYzMl9FeHRlcm5hbF9FaGRyIGVoZHI7Ci0KLSAgaWYgKGZyZWFkICgmIGVoZHIsIHNpemVvZiAoZWhkciksIDEsIGZpbGUpICE9IDEpCi0gICAgcmV0dXJuIDA7Ci0KLSAgbWVtY3B5IChlbGZfaGVhZGVyLmVfaWRlbnQsIGVoZHIuZV9pZGVudCwgRUlfTklERU5UKTsKLQotICBpZiAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9EQVRBXSA9PSBFTEZEQVRBMkxTQikKLSAgICBieXRlX2dldCA9IGJ5dGVfZ2V0X2xpdHRsZV9lbmRpYW47Ci0gIGVsc2UKLSAgICBieXRlX2dldCA9IGJ5dGVfZ2V0X2JpZ19lbmRpYW47Ci0KLSAgZWxmX2hlYWRlci5lX2VudHJ5ICAgICA9IEJZVEVfR0VUIChlaGRyLmVfZW50cnkpOwotICBlbGZfaGVhZGVyLmVfcGhvZmYgICAgID0gQllURV9HRVQgKGVoZHIuZV9waG9mZik7Ci0gIGVsZl9oZWFkZXIuZV9zaG9mZiAgICAgPSBCWVRFX0dFVCAoZWhkci5lX3Nob2ZmKTsKLSAgZWxmX2hlYWRlci5lX3ZlcnNpb24gICA9IEJZVEVfR0VUIChlaGRyLmVfdmVyc2lvbik7Ci0gIGVsZl9oZWFkZXIuZV9mbGFncyAgICAgPSBCWVRFX0dFVCAoZWhkci5lX2ZsYWdzKTsKLSAgZWxmX2hlYWRlci5lX3R5cGUgICAgICA9IEJZVEVfR0VUIChlaGRyLmVfdHlwZSk7Ci0gIGVsZl9oZWFkZXIuZV9tYWNoaW5lICAgPSBCWVRFX0dFVCAoZWhkci5lX21hY2hpbmUpOwotICBlbGZfaGVhZGVyLmVfZWhzaXplICAgID0gQllURV9HRVQgKGVoZHIuZV9laHNpemUpOwotICBlbGZfaGVhZGVyLmVfcGhlbnRzaXplID0gQllURV9HRVQgKGVoZHIuZV9waGVudHNpemUpOwotICBlbGZfaGVhZGVyLmVfcGhudW0gICAgID0gQllURV9HRVQgKGVoZHIuZV9waG51bSk7Ci0gIGVsZl9oZWFkZXIuZV9zaGVudHNpemUgPSBCWVRFX0dFVCAoZWhkci5lX3NoZW50c2l6ZSk7Ci0gIGVsZl9oZWFkZXIuZV9zaG51bSAgICAgPSBCWVRFX0dFVCAoZWhkci5lX3NobnVtKTsKLSAgZWxmX2hlYWRlci5lX3Noc3RybmR4ICA9IEJZVEVfR0VUIChlaGRyLmVfc2hzdHJuZHgpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19maWxlIChmaWxlX25hbWUpCi0gICAgIGNoYXIgKiBmaWxlX25hbWU7Ci17Ci0gIEZJTEUgKiAgICAgICBmaWxlOwotICBzdHJ1Y3Qgc3RhdCAgc3RhdGJ1ZjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKHN0YXQgKGZpbGVfbmFtZSwgJiBzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgZXJyb3IgKF8oIkNhbm5vdCBzdGF0IGlucHV0IGZpbGUgJXMuXG4iKSwgZmlsZV9uYW1lKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZmlsZSA9IGZvcGVuIChmaWxlX25hbWUsICJyYiIpOwotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJJbnB1dCBmaWxlICVzIG5vdCBmb3VuZC5cbiIpLCBmaWxlX25hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoISBnZXRfZmlsZV9oZWFkZXIgKGZpbGUpKQotICAgIHsKLSAgICAgIGVycm9yIChfKCIlczogRmFpbGVkIHRvIHJlYWQgZmlsZSBoZWFkZXJcbiIpLCBmaWxlX25hbWUpOwotICAgICAgZmNsb3NlIChmaWxlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSW5pdGlhbGlzZSBwZXIgZmlsZSB2YXJpYWJsZXMuICAqLwotICBmb3IgKGkgPSBOVU1fRUxFTSAodmVyc2lvbl9pbmZvKTsgaS0tOykKLSAgICB2ZXJzaW9uX2luZm9baV0gPSAwOwotCi0gIGZvciAoaSA9IE5VTV9FTEVNIChkeW5hbWljX2luZm8pOyBpLS07KQotICAgIGR5bmFtaWNfaW5mb1tpXSA9IDA7Ci0KLSAgLyogUHJvY2VzcyB0aGUgZmlsZS4gICovCi0gIGlmIChzaG93X25hbWUpCi0gICAgcHJpbnRmIChfKCJcbkZpbGU6ICVzXG4iKSwgZmlsZV9uYW1lKTsKLQotICBpZiAoISBwcm9jZXNzX2ZpbGVfaGVhZGVyICgpKQotICAgIHsKLSAgICAgIGZjbG9zZSAoZmlsZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHByb2Nlc3Nfc2VjdGlvbl9oZWFkZXJzIChmaWxlKTsKLQotICBwcm9jZXNzX3Byb2dyYW1faGVhZGVycyAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19keW5hbWljX3NlZ21lbnQgKGZpbGUpOwotCi0gIHByb2Nlc3NfcmVsb2NzIChmaWxlKTsKLQotICBwcm9jZXNzX3N5bWJvbF90YWJsZSAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19zeW1pbmZvIChmaWxlKTsKLQotICBwcm9jZXNzX3ZlcnNpb25fc2VjdGlvbnMgKGZpbGUpOwotCi0gIHByb2Nlc3Nfc2VjdGlvbl9jb250ZW50cyAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19hcmNoX3NwZWNpZmljIChmaWxlKTsKLQotICBmY2xvc2UgKGZpbGUpOwotCi0gIGlmIChzZWN0aW9uX2hlYWRlcnMpCi0gICAgewotICAgICAgZnJlZSAoc2VjdGlvbl9oZWFkZXJzKTsKLSAgICAgIHNlY3Rpb25faGVhZGVycyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChzdHJpbmdfdGFibGUpCi0gICAgewotICAgICAgZnJlZSAoc3RyaW5nX3RhYmxlKTsKLSAgICAgIHN0cmluZ190YWJsZSA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChkeW5hbWljX3N0cmluZ3MpCi0gICAgewotICAgICAgZnJlZSAoZHluYW1pY19zdHJpbmdzKTsKLSAgICAgIGR5bmFtaWNfc3RyaW5ncyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChkeW5hbWljX3N5bWJvbHMpCi0gICAgewotICAgICAgZnJlZSAoZHluYW1pY19zeW1ib2xzKTsKLSAgICAgIGR5bmFtaWNfc3ltYm9scyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChkeW5hbWljX3N5bWluZm8pCi0gICAgewotICAgICAgZnJlZSAoZHluYW1pY19zeW1pbmZvKTsKLSAgICAgIGR5bmFtaWNfc3ltaW5mbyA9IE5VTEw7Ci0gICAgfQotfQotCi0jaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQotLyogTmVlZGVkIGJ5IHRoZSBpMzg2IGRpc2Fzc2VtYmxlci4gIEZvciBleHRyYSBjcmVkaXQsIHNvbWVvbmUgY291bGQKLWZpeCB0aGlzIHNvIHRoYXQgd2UgaW5zZXJ0IHN5bWJvbGljIGFkZHJlc3NlcyBoZXJlLCBlc3AgZm9yIEdPVC9QTFQKLXN5bWJvbHMgKi8KLQotdm9pZAotcHJpbnRfYWRkcmVzcyAodW5zaWduZWQgaW50IGFkZHIsIEZJTEUgKiBvdXRmaWxlKQotewotICBmcHJpbnRmIChvdXRmaWxlLCIweCU4Ljh4IiwgYWRkcik7Ci19Ci0KLS8qIE5lZWRlZCBieSB0aGUgaTM4NiBkaXNhc3NlbWJsZXIuICovCi12b2lkCi1kYl90YXNrX3ByaW50c3ltICh1bnNpZ25lZCBpbnQgYWRkcikKLXsKLSAgcHJpbnRfYWRkcmVzcyAoYWRkciwgc3RkZXJyKTsKLX0KLSNlbmRpZgotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCAgICAgYXJnYzsKLSAgICAgY2hhciAqKiBhcmd2OwotewotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHBhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpOwotCi0gIGlmIChvcHRpbmQgPCAoYXJnYyAtIDEpKQotICAgIHNob3dfbmFtZSA9IDE7Ci0KLSAgd2hpbGUgKG9wdGluZCA8IGFyZ2MpCi0gICAgcHJvY2Vzc19maWxlIChhcmd2IFtvcHRpbmQgKytdKTsKLQotICBpZiAoZHVtcF9zZWN0cyAhPSBOVUxMKQotICAgIGZyZWUgKGR1bXBfc2VjdHMpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcmVuYW1lLmMgYi9iaW51dGlscy9yZW5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgzMTRmYi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZW5hbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKiByZW5hbWUuYyAtLSByZW5hbWUgYSBmaWxlLCBwcmVzZXJ2aW5nIHN5bWxpbmtzLgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWZkZWYgSEFWRV9HT09EX1VUSU1FX0gKLSNpbmNsdWRlIDx1dGltZS5oPgotI2Vsc2UgLyogISBIQVZFX0dPT0RfVVRJTUVfSCAqLwotI2lmZGVmIEhBVkVfVVRJTUVTCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZiAvKiBIQVZFX1VUSU1FUyAqLwotI2VuZGlmIC8qICEgSEFWRV9HT09EX1VUSU1FX0ggKi8KLQotc3RhdGljIGludCBzaW1wbGVfY29weSBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgYXQgb25jZS4gICovCi0jZGVmaW5lIENPUFlfQlVGIDgxOTIKLQotLyogQ29weSBmaWxlIEZST00gdG8gZmlsZSBUTywgcGVyZm9ybWluZyBubyB0cmFuc2xhdGlvbnMuCi0gICBSZXR1cm4gMCBpZiBvaywgLTEgaWYgZXJyb3IuICAqLwotCi1zdGF0aWMgaW50Ci1zaW1wbGVfY29weSAoZnJvbSwgdG8pCi0gICAgIGNvbnN0IGNoYXIgKmZyb207Ci0gICAgIGNvbnN0IGNoYXIgKnRvOwotewotICBpbnQgZnJvbWZkLCB0b2ZkLCBucmVhZDsKLSAgaW50IHNhdmVkOwotICBjaGFyIGJ1ZltDT1BZX0JVRl07Ci0KLSAgZnJvbWZkID0gb3BlbiAoZnJvbSwgT19SRE9OTFkpOwotICBpZiAoZnJvbWZkIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0gIHRvZmQgPSBjcmVhdCAodG8sIDA3NzcpOwotICBpZiAodG9mZCA8IDApCi0gICAgewotICAgICAgc2F2ZWQgPSBlcnJubzsKLSAgICAgIGNsb3NlIChmcm9tZmQpOwotICAgICAgZXJybm8gPSBzYXZlZDsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHdoaWxlICgobnJlYWQgPSByZWFkIChmcm9tZmQsIGJ1Ziwgc2l6ZW9mIGJ1ZikpID4gMCkKLSAgICB7Ci0gICAgICBpZiAod3JpdGUgKHRvZmQsIGJ1ZiwgbnJlYWQpICE9IG5yZWFkKQotCXsKLQkgIHNhdmVkID0gZXJybm87Ci0JICBjbG9zZSAoZnJvbWZkKTsKLQkgIGNsb3NlICh0b2ZkKTsKLQkgIGVycm5vID0gc2F2ZWQ7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLSAgc2F2ZWQgPSBlcnJubzsKLSAgY2xvc2UgKGZyb21mZCk7Ci0gIGNsb3NlICh0b2ZkKTsKLSAgaWYgKG5yZWFkIDwgMCkKLSAgICB7Ci0gICAgICBlcnJubyA9IHNhdmVkOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNldCB0aGUgdGltZXMgb2YgdGhlIGZpbGUgREVTVElOQVRJT04gdG8gYmUgdGhlIHNhbWUgYXMgdGhvc2UgaW4KLSAgIFNUQVRCVUYuICAqLwotCi12b2lkCi1zZXRfdGltZXMgKGRlc3RpbmF0aW9uLCBzdGF0YnVmKQotICAgICBjb25zdCBjaGFyICpkZXN0aW5hdGlvbjsKLSAgICAgY29uc3Qgc3RydWN0IHN0YXQgKnN0YXRidWY7Ci17Ci0gIGludCByZXN1bHQ7Ci0KLSAgewotI2lmZGVmIEhBVkVfR09PRF9VVElNRV9ICi0gICAgc3RydWN0IHV0aW1idWYgdGI7Ci0KLSAgICB0Yi5hY3RpbWUgPSBzdGF0YnVmLT5zdF9hdGltZTsKLSAgICB0Yi5tb2R0aW1lID0gc3RhdGJ1Zi0+c3RfbXRpbWU7Ci0gICAgcmVzdWx0ID0gdXRpbWUgKGRlc3RpbmF0aW9uLCAmdGIpOwotI2Vsc2UgLyogISBIQVZFX0dPT0RfVVRJTUVfSCAqLwotI2lmbmRlZiBIQVZFX1VUSU1FUwotICAgIGxvbmcgdGJbMl07Ci0KLSAgICB0YlswXSA9IHN0YXRidWYtPnN0X2F0aW1lOwotICAgIHRiWzFdID0gc3RhdGJ1Zi0+c3RfbXRpbWU7Ci0gICAgcmVzdWx0ID0gdXRpbWUgKGRlc3RpbmF0aW9uLCB0Yik7Ci0jZWxzZSAvKiBIQVZFX1VUSU1FUyAqLwotICAgIHN0cnVjdCB0aW1ldmFsIHR2WzJdOwotCi0gICAgdHZbMF0udHZfc2VjID0gc3RhdGJ1Zi0+c3RfYXRpbWU7Ci0gICAgdHZbMF0udHZfdXNlYyA9IDA7Ci0gICAgdHZbMV0udHZfc2VjID0gc3RhdGJ1Zi0+c3RfbXRpbWU7Ci0gICAgdHZbMV0udHZfdXNlYyA9IDA7Ci0gICAgcmVzdWx0ID0gdXRpbWVzIChkZXN0aW5hdGlvbiwgdHYpOwotI2VuZGlmIC8qIEhBVkVfVVRJTUVTICovCi0jZW5kaWYgLyogISBIQVZFX0dPT0RfVVRJTUVfSCAqLwotICB9Ci0KLSAgaWYgKHJlc3VsdCAhPSAwKQotICAgIG5vbl9mYXRhbCAoXygiJXM6IGNhbm5vdCBzZXQgdGltZTogJXMiKSwgZGVzdGluYXRpb24sIHN0cmVycm9yIChlcnJubykpOwotfQotCi0jaWZuZGVmIFNfSVNMTksKLSNpZmRlZiBTX0lGTE5LCi0jZGVmaW5lIFNfSVNMTksobSkgKCgobSkgJiBTX0lGTVQpID09IFNfSUZMTkspCi0jZWxzZQotI2RlZmluZSBTX0lTTE5LKG0pIDAKLSNkZWZpbmUgbHN0YXQgc3RhdAotI2VuZGlmCi0jZW5kaWYKLQotLyogUmVuYW1lIEZST00gdG8gVE8sIGNvcHlpbmcgaWYgVE8gaXMgYSBsaW5rLgotICAgUmV0dXJuIDAgaWYgb2ssIC0xIGlmIGVycm9yLiAgKi8KLQotaW50Ci1zbWFydF9yZW5hbWUgKGZyb20sIHRvLCBwcmVzZXJ2ZV9kYXRlcykKLSAgICAgY29uc3QgY2hhciAqZnJvbTsKLSAgICAgY29uc3QgY2hhciAqdG87Ci0gICAgIGludCBwcmVzZXJ2ZV9kYXRlczsKLXsKLSAgYm9vbGVhbiBleGlzdHM7Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIGludCByZXQgPSAwOwotCi0gIGV4aXN0cyA9IGxzdGF0ICh0bywgJnMpID09IDA7Ci0KLSNpZiBkZWZpbmVkIChfV0lOMzIpICYmICFkZWZpbmVkIChfX0NZR1dJTjMyX18pCi0gIC8qIFdpbjMyLCB1bmxpa2UgdW5peCwgd2lsbCBub3QgZXJhc2UgYHRvJyBpbiBgcmVuYW1lKGZyb20sIHRvKScgYnV0Ci0gICAgIGZhaWwgaW5zdGVhZC4gIEFsc28sIGNob3duIGlzIG5vdCBwcmVzZW50LiAgKi8KLQotICBpZiAoZXhpc3RzKQotICAgIHJlbW92ZSAodG8pOwotCi0gIHJldCA9IHJlbmFtZSAoZnJvbSwgdG8pOwotICBpZiAocmV0ICE9IDApCi0gICAgewotICAgICAgLyogV2UgaGF2ZSB0byBjbGVhbiB1cCBoZXJlLiAqLwotICAgICAgCi0gICAgICBub25fZmF0YWwgKF8oIiVzOiByZW5hbWU6ICVzIiksIHRvLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIHVubGluayAoZnJvbSk7Ci0gICAgfQotI2Vsc2UKLSAgLyogVXNlIHJlbmFtZSBvbmx5IGlmIFRPIGlzIG5vdCBhIHN5bWJvbGljIGxpbmsgYW5kIGhhcwotICAgICBvbmx5IG9uZSBoYXJkIGxpbmsuICAqLwotICBpZiAoISBleGlzdHMgfHwgKCFTX0lTTE5LIChzLnN0X21vZGUpICYmIHMuc3RfbmxpbmsgPT0gMSkpCi0gICAgewotICAgICAgcmV0ID0gcmVuYW1lIChmcm9tLCB0byk7Ci0gICAgICBpZiAocmV0ID09IDApCi0JewotCSAgaWYgKGV4aXN0cykKLQkgICAgewotCSAgICAgIC8qIFRyeSB0byBwcmVzZXJ2ZSB0aGUgcGVybWlzc2lvbiBiaXRzIGFuZCBvd25lcnNoaXAgb2YKLQkJIFRPLiAgRmlyc3QgZ2V0IHRoZSBtb2RlIHJpZ2h0IGV4Y2VwdCBmb3IgdGhlIHNldHVpZAotCQkgYml0LiAgVGhlbiBjaGFuZ2UgdGhlIG93bmVyc2hpcC4gIFRoZW4gZml4IHRoZSBzZXR1aWQKLQkJIGJpdC4gIFdlIGRvIHRoZSBjaG1vZCBiZWZvcmUgdGhlIGNob3duIGJlY2F1c2UgaWYgdGhlCi0JCSBjaG93biBzdWNjZWVkcywgYW5kIHdlIGFyZSBhIG5vcm1hbCB1c2VyLCB3ZSB3b24ndCBiZQotCQkgYWJsZSB0byBkbyB0aGUgY2htb2QgYWZ0ZXJ3YXJkLiAgV2UgZG9uJ3QgYm90aGVyIHRvCi0JCSBmaXggdGhlIHNldHVpZCBiaXQgZmlyc3QgYmVjYXVzZSB0aGF0IG1pZ2h0IGludHJvZHVjZQotCQkgYSBmbGVldGluZyBzZWN1cml0eSBwcm9ibGVtLCBhbmQgYmVjYXVzZSB0aGUgY2hvd24KLQkJIHdpbGwgY2xlYXIgdGhlIHNldHVpZCBiaXQgYW55aG93LiAgV2Ugb25seSBmaXggdGhlCi0JCSBzZXR1aWQgYml0IGlmIHRoZSBjaG93biBzdWNjZWVkcywgYmVjYXVzZSB3ZSBkb24ndAotCQkgd2FudCB0byBpbnRyb2R1Y2UgYW4gdW5leHBlY3RlZCBzZXR1aWQgZmlsZSBvd25lZCBieQotCQkgdGhlIHVzZXIgcnVubmluZyBvYmpjb3B5LiAgKi8KLQkgICAgICBjaG1vZCAodG8sIHMuc3RfbW9kZSAmIDA3NzcpOwotCSAgICAgIGlmIChjaG93biAodG8sIHMuc3RfdWlkLCBzLnN0X2dpZCkgPj0gMCkKLQkJY2htb2QgKHRvLCBzLnN0X21vZGUgJiAwNzc3Nyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgaGF2ZSB0byBjbGVhbiB1cCBoZXJlLiAqLwotCSAgbm9uX2ZhdGFsIChfKCIlczogcmVuYW1lOiAlcyIpLCB0bywgc3RyZXJyb3IgKGVycm5vKSk7Ci0JICB1bmxpbmsgKGZyb20pOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXQgPSBzaW1wbGVfY29weSAoZnJvbSwgdG8pOwotICAgICAgaWYgKHJldCAhPSAwKQotCW5vbl9mYXRhbCAoXygiJXM6IHNpbXBsZV9jb3B5OiAlcyIpLCB0bywgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgICAgIGlmIChwcmVzZXJ2ZV9kYXRlcykKLQlzZXRfdGltZXMgKHRvLCAmcyk7Ci0gICAgICB1bmxpbmsgKGZyb20pOwotICAgIH0KLSNlbmRpZiAvKiBfV0lOMzIgJiYgIV9fQ1lHV0lOMzJfXyAqLwotCi0gIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZXNiaW4uYyBiL2JpbnV0aWxzL3Jlc2Jpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmMwN2ZiLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Jlc2Jpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM4NyArMCwwIEBACi0vKiByZXNiaW4uYyAtLSBtYW5pcHVsYXRlIHRoZSBXaW5kb3dzIGJpbmFyeSByZXNvdXJjZSBmb3JtYXQuCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgdG8gY29udmVydCBiZXR3ZWVuIHRoZSBiaW5hcnkgcmVzb3VyY2UKLSAgIGZvcm1hdCBhbmQgdGhlIGludGVybmFsIHN0cnVjdHVyZXMgdGhhdCB3ZSB3YW50IHRvIHVzZS4gIFRoZSBzYW1lCi0gICBiaW5hcnkgcmVzb3VyY2UgZm9ybWF0IGlzIHVzZWQgaW4gYm90aCByZXMgYW5kIENPRkYgZmlsZXMuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAid2luZHJlcy5oIgotCi0vKiBNYWNyb3MgdG8gc3dhcCBpbiB2YWx1ZXMuICAqLwotCi0jZGVmaW5lIGdldF8xNihiZSwgcykgKChiZSkgPyBiZmRfZ2V0YjE2IChzKSA6IGJmZF9nZXRsMTYgKHMpKQotI2RlZmluZSBnZXRfMzIoYmUsIHMpICgoYmUpID8gYmZkX2dldGIzMiAocykgOiBiZmRfZ2V0bDMyIChzKSkKLQotLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQgdG9vc21hbGwgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdW5pY2hhciAqZ2V0X3VuaWNvZGUKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGdldF9yZXNpZAotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19nZW5lcmljCi0gIFBBUkFNUyAoKGVudW0gcmVzX3R5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfY3Vyc29yCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19tZW51Ci0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IG1lbnVpdGVtICpiaW5fdG9fcmVzX21lbnVpdGVtcwotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCwgaW50ICopKTsKLXN0YXRpYyBzdHJ1Y3QgbWVudWl0ZW0gKmJpbl90b19yZXNfbWVudWV4aXRlbXMKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQsIGludCAqKSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19kaWFsb2cKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX3N0cmluZwotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfZm9udGRpcgotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfYWNjZWxlcmF0b3JzCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19yY2RhdGEKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX2dyb3VwX2N1cnNvcgotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfZ3JvdXBfaWNvbgotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfdmVyc2lvbgotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfdXNlcmRhdGEKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLQotLyogR2l2ZW4gYSByZXNvdXJjZSB0eXBlIElELCBhIHBvaW50ZXIgdG8gZGF0YSwgYSBsZW5ndGgsIHJldHVybiBhCi0gICByZXNfcmVzb3VyY2Ugc3RydWN0dXJlIHdoaWNoIHJlcHJlc2VudHMgdGhhdCByZXNvdXJjZS4gIFRoZSBjYWxsZXIKLSAgIGlzIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgdGhlIHJlc19pbmZvIGFuZCBjb2ZmX2luZm8gZmllbGRzCi0gICBvZiB0aGUgcmV0dXJuZWQgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzICh0eXBlLCBkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCi0gICAgIHN0cnVjdCByZXNfaWQgdHlwZTsKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpZiAodHlwZS5uYW1lZCkKLSAgICByZXR1cm4gYmluX3RvX3Jlc191c2VyZGF0YSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAodHlwZS51LmlkKQotCXsKLQlkZWZhdWx0OgotCSAgcmV0dXJuIGJpbl90b19yZXNfdXNlcmRhdGEgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9DVVJTT1I6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19jdXJzb3IgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9CSVRNQVA6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19nZW5lcmljIChSRVNfVFlQRV9CSVRNQVAsIGRhdGEsIGxlbmd0aCk7Ci0JY2FzZSBSVF9JQ09OOgotCSAgcmV0dXJuIGJpbl90b19yZXNfZ2VuZXJpYyAoUkVTX1RZUEVfSUNPTiwgZGF0YSwgbGVuZ3RoKTsKLQljYXNlIFJUX01FTlU6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19tZW51IChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOwotCWNhc2UgUlRfRElBTE9HOgotCSAgcmV0dXJuIGJpbl90b19yZXNfZGlhbG9nIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOwotCWNhc2UgUlRfU1RSSU5HOgotCSAgcmV0dXJuIGJpbl90b19yZXNfc3RyaW5nIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOwotCWNhc2UgUlRfRk9OVERJUjoKLQkgIHJldHVybiBiaW5fdG9fcmVzX2ZvbnRkaXIgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9GT05UOgotCSAgcmV0dXJuIGJpbl90b19yZXNfZ2VuZXJpYyAoUkVTX1RZUEVfRk9OVCwgZGF0YSwgbGVuZ3RoKTsKLQljYXNlIFJUX0FDQ0VMRVJBVE9SOgotCSAgcmV0dXJuIGJpbl90b19yZXNfYWNjZWxlcmF0b3JzIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOwotCWNhc2UgUlRfUkNEQVRBOgotCSAgcmV0dXJuIGJpbl90b19yZXNfcmNkYXRhIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOwotCWNhc2UgUlRfTUVTU0FHRVRBQkxFOgotCSAgcmV0dXJuIGJpbl90b19yZXNfZ2VuZXJpYyAoUkVTX1RZUEVfTUVTU0FHRVRBQkxFLCBkYXRhLCBsZW5ndGgpOwotCWNhc2UgUlRfR1JPVVBfQ1VSU09SOgotCSAgcmV0dXJuIGJpbl90b19yZXNfZ3JvdXBfY3Vyc29yIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOwotCWNhc2UgUlRfR1JPVVBfSUNPTjoKLQkgIHJldHVybiBiaW5fdG9fcmVzX2dyb3VwX2ljb24gKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9WRVJTSU9OOgotCSAgcmV0dXJuIGJpbl90b19yZXNfdmVyc2lvbiAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQl9Ci0gICAgfQotfQotCi0vKiBHaXZlIGFuIGVycm9yIGlmIHRoZSBiaW5hcnkgZGF0YSBpcyB0b28gc21hbGwuICAqLwotCi1zdGF0aWMgdm9pZAotdG9vc21hbGwgKG1zZykKLSAgICAgY29uc3QgY2hhciAqbXNnOwotewotICBmYXRhbCAoXygiJXM6IG5vdCBlbm91Z2ggYmluYXJ5IGRhdGEiKSwgbXNnKTsKLX0KLQotLyogU3dhcCBpbiBhIE5VTEwgdGVybWluYXRlZCB1bmljb2RlIHN0cmluZy4gICovCi0KLXN0YXRpYyB1bmljaGFyICoKLWdldF91bmljb2RlIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sIHJldGxlbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotICAgICBpbnQgKnJldGxlbjsKLXsKLSAgaW50IGMsIGk7Ci0gIHVuaWNoYXIgKnJldDsKLQotICBjID0gMDsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaWYgKGxlbmd0aCA8ICh1bnNpZ25lZCBsb25nKSBjICogMiArIDIpCi0JdG9vc21hbGwgKF8oIm51bGwgdGVybWluYXRlZCB1bmljb2RlIHN0cmluZyIpKTsKLSAgICAgIGlmIChnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBjICogMikgPT0gMCkKLQlicmVhazsKLSAgICAgICsrYzsKLSAgICB9Ci0KLSAgcmV0ID0gKHVuaWNoYXIgKikgcmVzX2FsbG9jICgoYyArIDEpICogc2l6ZW9mICh1bmljaGFyKSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLSAgICByZXRbaV0gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBpICogMik7Ci0gIHJldFtpXSA9IDA7Ci0KLSAgaWYgKHJldGxlbiAhPSBOVUxMKQotICAgICpyZXRsZW4gPSBjOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEdldCBhIHJlc291cmNlIGlkZW50aWZpZXIuICBUaGlzIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB1c2VkLiAgKi8KLQotc3RhdGljIGludAotZ2V0X3Jlc2lkIChpZCwgZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBzdHJ1Y3QgcmVzX2lkICppZDsKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgZmlyc3Q7Ci0KLSAgaWYgKGxlbmd0aCA8IDIpCi0gICAgdG9vc21hbGwgKF8oInJlc291cmNlIElEIikpOwotCi0gIGZpcnN0ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLSAgaWYgKGZpcnN0ID09IDB4ZmZmZikKLSAgICB7Ci0gICAgICBpZiAobGVuZ3RoIDwgNCkKLQl0b29zbWFsbCAoXygicmVzb3VyY2UgSUQiKSk7Ci0gICAgICBpZC0+bmFtZWQgPSAwOwotICAgICAgaWQtPnUuaWQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKLSAgICAgIHJldHVybiA0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlkLT5uYW1lZCA9IDE7Ci0gICAgICBpZC0+dS5uLm5hbWUgPSBnZXRfdW5pY29kZSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCAmaWQtPnUubi5sZW5ndGgpOwotICAgICAgcmV0dXJuIGlkLT51Lm4ubGVuZ3RoICogMiArIDI7Ci0gICAgfQotfQotCi0vKiBDb252ZXJ0IGEgcmVzb3VyY2Ugd2hpY2gganVzdCBzdG9yZXMgdW5pbnRlcnByZXRlZCBkYXRhIGZyb20KLSAgIGJpbmFyeS4gICovCi0KLXN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc19nZW5lcmljICh0eXBlLCBkYXRhLCBsZW5ndGgpCi0gICAgIGVudW0gcmVzX3R5cGUgdHlwZTsKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci17Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IHR5cGU7Ci0gIHItPnUuZGF0YS5kYXRhID0gZGF0YTsKLSAgci0+dS5kYXRhLmxlbmd0aCA9IGxlbmd0aDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhIGN1cnNvciByZXNvdXJjZSBmcm9tIGJpbmFyeS4gICovCi0KLXN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc19jdXJzb3IgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgY3Vyc29yICpjOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGlmIChsZW5ndGggPCA0KQotICAgIHRvb3NtYWxsIChfKCJjdXJzb3IiKSk7Ci0KLSAgYyA9IChzdHJ1Y3QgY3Vyc29yICopIHJlc19hbGxvYyAoc2l6ZW9mICpjKTsKLSAgYy0+eGhvdHNwb3QgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotICBjLT55aG90c3BvdCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOwotICBjLT5sZW5ndGggPSBsZW5ndGggLSA0OwotICBjLT5kYXRhID0gZGF0YSArIDQ7Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX0NVUlNPUjsKLSAgci0+dS5jdXJzb3IgPSBjOwotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IGEgbWVudSByZXNvdXJjZSBmcm9tIGJpbmFyeS4gICovCi0KLXN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc19tZW51IChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLSAgc3RydWN0IG1lbnUgKm07Ci0gIGludCB2ZXJzaW9uLCByZWFkOwotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9NRU5VOwotCi0gIG0gPSAoc3RydWN0IG1lbnUgKikgcmVzX2FsbG9jIChzaXplb2YgKm0pOwotICByLT51Lm1lbnUgPSBtOwotCi0gIGlmIChsZW5ndGggPCAyKQotICAgIHRvb3NtYWxsIChfKCJtZW51IGhlYWRlciIpKTsKLQotICB2ZXJzaW9uID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLQotICBpZiAodmVyc2lvbiA9PSAwKQotICAgIHsKLSAgICAgIGlmIChsZW5ndGggPCA0KQotCXRvb3NtYWxsIChfKCJtZW51IGhlYWRlciIpKTsKLSAgICAgIG0tPmhlbHAgPSAwOwotICAgICAgbS0+aXRlbXMgPSBiaW5fdG9fcmVzX21lbnVpdGVtcyAoZGF0YSArIDQsIGxlbmd0aCAtIDQsIGJpZ19lbmRpYW4sCi0JCQkJICAgICAgICZyZWFkKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHZlcnNpb24gPT0gMSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotCi0gICAgICBpZiAobGVuZ3RoIDwgOCkKLQl0b29zbWFsbCAoXygibWVudWV4IGhlYWRlciIpKTsKLSAgICAgIG0tPmhlbHAgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLSAgICAgIG9mZnNldCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOwotICAgICAgaWYgKG9mZnNldCArIDQgPj0gbGVuZ3RoKQotCXRvb3NtYWxsIChfKCJtZW51ZXggb2Zmc2V0IikpOwotICAgICAgbS0+aXRlbXMgPSBiaW5fdG9fcmVzX21lbnVleGl0ZW1zIChkYXRhICsgNCArIG9mZnNldCwKLQkJCQkJIGxlbmd0aCAtICg0ICsgb2Zmc2V0KSwKLQkJCQkJIGJpZ19lbmRpYW4sCi0JCQkJCSAmcmVhZCk7Ci0gICAgfQotICBlbHNlCi0gICAgZmF0YWwgKF8oInVuc3VwcG9ydGVkIG1lbnUgdmVyc2lvbiAlZCIpLCB2ZXJzaW9uKTsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBtZW51IGl0ZW1zIGZyb20gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBtZW51aXRlbSAqCi1iaW5fdG9fcmVzX21lbnVpdGVtcyAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCByZWFkKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci0gICAgIGludCAqcmVhZDsKLXsKLSAgc3RydWN0IG1lbnVpdGVtICpmaXJzdCwgKipwcDsKLQotICBmaXJzdCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0OwotCi0gICpyZWFkID0gMDsKLQotICB3aGlsZSAobGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBpbnQgZmxhZ3MsIHNsZW4sIGl0ZW1sZW47Ci0gICAgICB1bnNpZ25lZCBpbnQgc3Ryb2ZmOwotICAgICAgc3RydWN0IG1lbnVpdGVtICptaTsKLQotICAgICAgaWYgKGxlbmd0aCA8IDQpCi0JdG9vc21hbGwgKF8oIm1lbnVpdGVtIGhlYWRlciIpKTsKLQotICAgICAgbWkgPSAoc3RydWN0IG1lbnVpdGVtICopIHJlc19hbGxvYyAoc2l6ZW9mICptaSk7Ci0gICAgICBtaS0+c3RhdGUgPSAwOwotICAgICAgbWktPmhlbHAgPSAwOwotCi0gICAgICBmbGFncyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gICAgICBtaS0+dHlwZSA9IGZsYWdzICZ+IChNRU5VSVRFTV9QT1BVUCB8IE1FTlVJVEVNX0VORE1FTlUpOwotCi0gICAgICBpZiAoKGZsYWdzICYgTUVOVUlURU1fUE9QVVApID09IDApCi0Jc3Ryb2ZmID0gNDsKLSAgICAgIGVsc2UKLQlzdHJvZmYgPSAyOwotCi0gICAgICBpZiAobGVuZ3RoIDwgc3Ryb2ZmICsgMikKLQl0b29zbWFsbCAoXygibWVudWl0ZW0gaGVhZGVyIikpOwotCi0gICAgICBpZiAoZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgc3Ryb2ZmKSA9PSAwKQotCXsKLQkgIHNsZW4gPSAwOwotCSAgbWktPnRleHQgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQltaS0+dGV4dCA9IGdldF91bmljb2RlIChkYXRhICsgc3Ryb2ZmLCBsZW5ndGggLSBzdHJvZmYsIGJpZ19lbmRpYW4sCi0JCQkJJnNsZW4pOwotCi0gICAgICBpdGVtbGVuID0gc3Ryb2ZmICsgc2xlbiAqIDIgKyAyOwotCi0gICAgICBpZiAoKGZsYWdzICYgTUVOVUlURU1fUE9QVVApID09IDApCi0JewotCSAgbWktPnBvcHVwID0gTlVMTDsKLQkgIG1pLT5pZCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgc3VicmVhZDsKLQotCSAgbWktPmlkID0gMDsKLQkgIG1pLT5wb3B1cCA9IGJpbl90b19yZXNfbWVudWl0ZW1zIChkYXRhICsgaXRlbWxlbiwgbGVuZ3RoIC0gaXRlbWxlbiwKLQkJCQkJICAgIGJpZ19lbmRpYW4sICZzdWJyZWFkKTsKLQkgIGl0ZW1sZW4gKz0gc3VicmVhZDsKLQl9Ci0KLSAgICAgIG1pLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IG1pOwotICAgICAgcHAgPSAmbWktPm5leHQ7Ci0KLSAgICAgIGRhdGEgKz0gaXRlbWxlbjsKLSAgICAgIGxlbmd0aCAtPSBpdGVtbGVuOwotICAgICAgKnJlYWQgKz0gaXRlbWxlbjsKLQotICAgICAgaWYgKChmbGFncyAmIE1FTlVJVEVNX0VORE1FTlUpICE9IDApCi0JcmV0dXJuIGZpcnN0OwotICAgIH0KLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgbWVudWV4IGl0ZW1zIGZyb20gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBtZW51aXRlbSAqCi1iaW5fdG9fcmVzX21lbnVleGl0ZW1zIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sIHJlYWQpCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLSAgICAgaW50ICpyZWFkOwotewotICBzdHJ1Y3QgbWVudWl0ZW0gKmZpcnN0LCAqKnBwOwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgKnJlYWQgPSAwOwotCi0gIHdoaWxlIChsZW5ndGggPiAwKQotICAgIHsKLSAgICAgIGludCBmbGFncywgc2xlbjsKLSAgICAgIHVuc2lnbmVkIGludCBpdGVtbGVuOwotICAgICAgc3RydWN0IG1lbnVpdGVtICptaTsKLQotICAgICAgaWYgKGxlbmd0aCA8IDE0KQotCXRvb3NtYWxsIChfKCJtZW51aXRlbSBoZWFkZXIiKSk7Ci0KLSAgICAgIG1pID0gKHN0cnVjdCBtZW51aXRlbSAqKSByZXNfYWxsb2MgKHNpemVvZiAqbWkpOwotICAgICAgbWktPnR5cGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEpOwotICAgICAgbWktPnN0YXRlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgNCk7Ci0gICAgICBtaS0+aWQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA4KTsKLQotICAgICAgZmxhZ3MgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAxMCk7Ci0KLSAgICAgIGlmIChnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAxMikgPT0gMCkKLQl7Ci0JICBzbGVuID0gMDsKLQkgIG1pLT50ZXh0ID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JbWktPnRleHQgPSBnZXRfdW5pY29kZSAoZGF0YSArIDEyLCBsZW5ndGggLSAxMiwgYmlnX2VuZGlhbiwgJnNsZW4pOwotCi0gICAgICBpdGVtbGVuID0gMTIgKyBzbGVuICogMiArIDI7Ci0gICAgICBpdGVtbGVuID0gKGl0ZW1sZW4gKyAzKSAmfiAzOwotCi0gICAgICBpZiAoKGZsYWdzICYgMSkgPT0gMCkKLQl7Ci0JICBtaS0+cG9wdXAgPSBOVUxMOwotCSAgbWktPmhlbHAgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgc3VicmVhZDsKLQotCSAgaWYgKGxlbmd0aCA8IGl0ZW1sZW4gKyA0KQotCSAgICB0b29zbWFsbCAoXygibWVudWl0ZW0iKSk7Ci0JICBtaS0+aGVscCA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIGl0ZW1sZW4pOwotCSAgaXRlbWxlbiArPSA0OwotCi0JICBtaS0+cG9wdXAgPSBiaW5fdG9fcmVzX21lbnVleGl0ZW1zIChkYXRhICsgaXRlbWxlbiwKLQkJCQkJICAgICAgbGVuZ3RoIC0gaXRlbWxlbiwKLQkJCQkJICAgICAgYmlnX2VuZGlhbiwgJnN1YnJlYWQpOwotCSAgaXRlbWxlbiArPSBzdWJyZWFkOwotCX0KLQotICAgICAgbWktPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gbWk7Ci0gICAgICBwcCA9ICZtaS0+bmV4dDsKLQotICAgICAgZGF0YSArPSBpdGVtbGVuOwotICAgICAgbGVuZ3RoIC09IGl0ZW1sZW47Ci0gICAgICAqcmVhZCArPSBpdGVtbGVuOwotCi0gICAgICBpZiAoKGZsYWdzICYgMHg4MCkgIT0gMCkKLQlyZXR1cm4gZmlyc3Q7Ci0gICAgfQotCi0gIHJldHVybiBmaXJzdDsKLX0KLQotLyogQ29udmVydCBhIGRpYWxvZyByZXNvdXJjZSBmcm9tIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICoKLWJpbl90b19yZXNfZGlhbG9nIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgaW50IHZlcnNpb247Ci0gIHN0cnVjdCBkaWFsb2cgKmQ7Ci0gIGludCBjLCBzdWJsZW4sIGk7Ci0gIHVuc2lnbmVkIGludCBvZmY7Ci0gIHN0cnVjdCBkaWFsb2dfY29udHJvbCAqKnBwOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGlmIChsZW5ndGggPCAxOCkKLSAgICB0b29zbWFsbCAoXygiZGlhbG9nIGhlYWRlciIpKTsKLQotICBkID0gKHN0cnVjdCBkaWFsb2cgKikgcmVzX2FsbG9jIChzaXplb2YgKmQpOwotCi0gIHZlcnNpb24gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotICBpZiAodmVyc2lvbiAhPSAxKQotICAgIHsKLSAgICAgIGQtPmV4ID0gTlVMTDsKLSAgICAgIGQtPnN0eWxlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhKTsKLSAgICAgIGQtPmV4c3R5bGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLSAgICAgIG9mZiA9IDg7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IHNpZ25hdHVyZTsKLQotICAgICAgc2lnbmF0dXJlID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0gICAgICBpZiAoc2lnbmF0dXJlICE9IDB4ZmZmZikKLQlmYXRhbCAoXygidW5leHBlY3RlZCBkaWFsb2cgc2lnbmF0dXJlICVkIiksIHNpZ25hdHVyZSk7Ci0KLSAgICAgIGQtPmV4ID0gKHN0cnVjdCBkaWFsb2dfZXggKikgcmVzX2FsbG9jIChzaXplb2YgKHN0cnVjdCBkaWFsb2dfZXgpKTsKLSAgICAgIGQtPmV4LT5oZWxwID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgNCk7Ci0gICAgICBkLT5leHN0eWxlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgOCk7Ci0gICAgICBkLT5zdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDEyKTsKLSAgICAgIG9mZiA9IDE2OwotICAgIH0KLQotICBpZiAobGVuZ3RoIDwgb2ZmICsgMTApCi0gICAgdG9vc21hbGwgKF8oImRpYWxvZyBoZWFkZXIiKSk7Ci0KLSAgYyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZik7Ci0gIGQtPnggPSBnZXRfMTYgIChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgMik7Ci0gIGQtPnkgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA0KTsKLSAgZC0+d2lkdGggPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA2KTsKLSAgZC0+aGVpZ2h0ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgOCk7Ci0KLSAgb2ZmICs9IDEwOwotCi0gIHN1YmxlbiA9IGdldF9yZXNpZCAoJmQtPm1lbnUsIGRhdGEgKyBvZmYsIGxlbmd0aCAtIG9mZiwgYmlnX2VuZGlhbik7Ci0gIG9mZiArPSBzdWJsZW47Ci0KLSAgc3VibGVuID0gZ2V0X3Jlc2lkICgmZC0+Y2xhc3MsIGRhdGEgKyBvZmYsIGxlbmd0aCAtIG9mZiwgYmlnX2VuZGlhbik7Ci0gIG9mZiArPSBzdWJsZW47Ci0KLSAgZC0+Y2FwdGlvbiA9IGdldF91bmljb2RlIChkYXRhICsgb2ZmLCBsZW5ndGggLSBvZmYsIGJpZ19lbmRpYW4sICZzdWJsZW4pOwotICBvZmYgKz0gc3VibGVuICogMiArIDI7Ci0KLSAgaWYgKChkLT5zdHlsZSAmIERTX1NFVEZPTlQpID09IDApCi0gICAgewotICAgICAgZC0+cG9pbnRzaXplID0gMDsKLSAgICAgIGQtPmZvbnQgPSBOVUxMOwotICAgICAgaWYgKGQtPmV4ICE9IE5VTEwpCi0JewotCSAgZC0+ZXgtPndlaWdodCA9IDA7Ci0JICBkLT5leC0+aXRhbGljID0gMDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGxlbmd0aCA8IG9mZiArIDIpCi0JdG9vc21hbGwgKF8oImRpYWxvZyBmb250IHBvaW50IHNpemUiKSk7Ci0KLSAgICAgIGQtPnBvaW50c2l6ZSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZik7Ci0gICAgICBvZmYgKz0gMjsKLQotICAgICAgaWYgKGQtPmV4ICE9IE5VTEwpCi0JewotCSAgaWYgKGxlbmd0aCA8IG9mZiArIDQpCi0JICAgIHRvb3NtYWxsIChfKCJkaWFsb2dleCBmb250IGluZm9ybWF0aW9uIikpOwotCSAgZC0+ZXgtPndlaWdodCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZik7Ci0JICBkLT5leC0+aXRhbGljID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgMik7Ci0JICBvZmYgKz0gNDsKLQl9Ci0KLSAgICAgIGQtPmZvbnQgPSBnZXRfdW5pY29kZSAoZGF0YSArIG9mZiwgbGVuZ3RoIC0gb2ZmLCBiaWdfZW5kaWFuLCAmc3VibGVuKTsKLSAgICAgIG9mZiArPSBzdWJsZW4gKiAyICsgMjsKLSAgICB9Ci0KLSAgZC0+Y29udHJvbHMgPSBOVUxMOwotICBwcCA9ICZkLT5jb250cm9sczsKLQotICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBkaWFsb2dfY29udHJvbCAqZGM7Ci0gICAgICBpbnQgZGF0YWxlbjsKLQotICAgICAgb2ZmID0gKG9mZiArIDMpICZ+IDM7Ci0KLSAgICAgIGRjID0gKHN0cnVjdCBkaWFsb2dfY29udHJvbCAqKSByZXNfYWxsb2MgKHNpemVvZiAqZGMpOwotCi0gICAgICBpZiAoZC0+ZXggPT0gTlVMTCkKLQl7Ci0JICBpZiAobGVuZ3RoIDwgb2ZmICsgOCkKLQkgICAgdG9vc21hbGwgKF8oImRpYWxvZyBjb250cm9sIikpOwotCi0JICBkYy0+c3R5bGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYpOwotCSAgZGMtPmV4c3R5bGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA0KTsKLQkgIGRjLT5oZWxwID0gMDsKLQkgIG9mZiArPSA4OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAobGVuZ3RoIDwgb2ZmICsgMTIpCi0JICAgIHRvb3NtYWxsIChfKCJkaWFsb2dleCBjb250cm9sIikpOwotCSAgZGMtPmhlbHAgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYpOwotCSAgZGMtPmV4c3R5bGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA0KTsKLQkgIGRjLT5zdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDgpOwotCSAgb2ZmICs9IDEyOwotCX0KLQotICAgICAgaWYgKGxlbmd0aCA8IG9mZiArIDEwKQotCXRvb3NtYWxsIChfKCJkaWFsb2cgY29udHJvbCIpKTsKLQotICAgICAgZGMtPnggPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYpOwotICAgICAgZGMtPnkgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyAyKTsKLSAgICAgIGRjLT53aWR0aCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDQpOwotICAgICAgZGMtPmhlaWdodCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDYpOwotCi0gICAgICBpZiAoZC0+ZXggIT0gTlVMTCkKLSAgICAgICAgZGMtPmlkID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgOCk7Ci0gICAgICBlbHNlCi0gICAgICAgIGRjLT5pZCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDgpOwotCi0gICAgICBvZmYgKz0gMTAgKyAoZC0+ZXggIT0gTlVMTCA/IDIgOiAwKTsKLQotICAgICAgc3VibGVuID0gZ2V0X3Jlc2lkICgmZGMtPmNsYXNzLCBkYXRhICsgb2ZmLCBsZW5ndGggLSBvZmYsIGJpZ19lbmRpYW4pOwotICAgICAgb2ZmICs9IHN1YmxlbjsKLQotICAgICAgc3VibGVuID0gZ2V0X3Jlc2lkICgmZGMtPnRleHQsIGRhdGEgKyBvZmYsIGxlbmd0aCAtIG9mZiwgYmlnX2VuZGlhbik7Ci0gICAgICBvZmYgKz0gc3VibGVuOwotCi0gICAgICBpZiAobGVuZ3RoIDwgb2ZmICsgMikKLQl0b29zbWFsbCAoXygiZGlhbG9nIGNvbnRyb2wgZW5kIikpOwotCi0gICAgICBkYXRhbGVuID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmKTsKLSAgICAgIG9mZiArPSAyOwotCi0gICAgICBpZiAoZGF0YWxlbiA9PSAwKQotCWRjLT5kYXRhID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBvZmYgPSAob2ZmICsgMykgJn4gMzsKLQotCSAgaWYgKGxlbmd0aCA8IG9mZiArIGRhdGFsZW4pCi0JICAgIHRvb3NtYWxsIChfKCJkaWFsb2cgY29udHJvbCBkYXRhIikpOwotCi0JICBkYy0+ZGF0YSA9ICgoc3RydWN0IHJjZGF0YV9pdGVtICopCi0JCSAgICAgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcmNkYXRhX2l0ZW0pKSk7Ci0JICBkYy0+ZGF0YS0+bmV4dCA9IE5VTEw7Ci0JICBkYy0+ZGF0YS0+dHlwZSA9IFJDREFUQV9CVUZGRVI7Ci0JICBkYy0+ZGF0YS0+dS5idWZmZXIubGVuZ3RoID0gZGF0YWxlbjsKLQkgIGRjLT5kYXRhLT51LmJ1ZmZlci5kYXRhID0gZGF0YSArIG9mZjsKLQotCSAgb2ZmICs9IGRhdGFsZW47CSAgCi0JfQotCi0gICAgICBkYy0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBkYzsKLSAgICAgIHBwID0gJmRjLT5uZXh0OwotICAgIH0KLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gUkVTX1RZUEVfRElBTE9HOwotICByLT51LmRpYWxvZyA9IGQ7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIENvbnZlcnQgYSBzdHJpbmd0YWJsZSByZXNvdXJjZSBmcm9tIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICoKLWJpbl90b19yZXNfc3RyaW5nIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IHN0cmluZ3RhYmxlICpzdDsKLSAgaW50IGk7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgc3QgPSAoc3RydWN0IHN0cmluZ3RhYmxlICopIHJlc19hbGxvYyAoc2l6ZW9mICpzdCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHNsZW47Ci0KLSAgICAgIGlmIChsZW5ndGggPCAyKQotCXRvb3NtYWxsIChfKCJzdHJpbmd0YWJsZSBzdHJpbmcgbGVuZ3RoIikpOwotICAgICAgc2xlbiA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gICAgICBzdC0+c3RyaW5nc1tpXS5sZW5ndGggPSBzbGVuOwotCi0gICAgICBpZiAoc2xlbiA+IDApCi0JewotCSAgdW5pY2hhciAqczsKLQkgIHVuc2lnbmVkIGludCBqOwotCi0JICBpZiAobGVuZ3RoIDwgMiArIDIgKiBzbGVuKQotCSAgICB0b29zbWFsbCAoXygic3RyaW5ndGFibGUgc3RyaW5nIikpOwotCi0JICBzID0gKHVuaWNoYXIgKikgcmVzX2FsbG9jIChzbGVuICogc2l6ZW9mICh1bmljaGFyKSk7Ci0JICBzdC0+c3RyaW5nc1tpXS5zdHJpbmcgPSBzOwotCi0JICBmb3IgKGogPSAwOyBqIDwgc2xlbjsgaisrKQotCSAgICBzW2pdID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMiArIGogKiAyKTsKLQl9Ci0KLSAgICAgIGRhdGEgKz0gMiArIDIgKiBzbGVuOwotICAgICAgbGVuZ3RoIC09IDIgKyAyICogc2xlbjsKLSAgICB9Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX1NUUklOR1RBQkxFOwotICByLT51LnN0cmluZ3RhYmxlID0gc3Q7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIENvbnZlcnQgYSBmb250ZGlyIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc19mb250ZGlyIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgaW50IGMsIGk7Ci0gIHN0cnVjdCBmb250ZGlyICpmaXJzdCwgKipwcDsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICBpZiAobGVuZ3RoIDwgMikKLSAgICB0b29zbWFsbCAoXygiZm9udGRpciBoZWFkZXIiKSk7Ci0KLSAgYyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBmb250ZGlyICpmZDsKLSAgICAgIHVuc2lnbmVkIGludCBvZmY7Ci0KLSAgICAgIGlmIChsZW5ndGggPCA1NikKLQl0b29zbWFsbCAoXygiZm9udGRpciIpKTsKLQotICAgICAgZmQgPSAoc3RydWN0IGZvbnRkaXIgKikgcmVzX2FsbG9jIChzaXplb2YgKmZkKTsKLSAgICAgIGZkLT5pbmRleCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0KLSAgICAgIC8qIFRvIHdvcmsgb3V0IHRoZSBsZW5ndGggb2YgdGhlIGZvbnRkaXIgZGF0YSwgd2UgbXVzdCBnZXQgdGhlCi0gICAgICAgICBsZW5ndGggb2YgdGhlIGRldmljZSBuYW1lIGFuZCBmYWNlIG5hbWUgc3RyaW5ncywgZXZlbiB0aG91Z2gKLSAgICAgICAgIHdlIGRvbid0IHN0b3JlIHRoZW0gaW4gdGhlIGZvbnRkaXIgc3RydWN0dXJlLiAgVGhlCi0gICAgICAgICBkb2N1bWVudGF0aW9uIHNheXMgdGhhdCB0aGVzZSBhcmUgTlVMTCB0ZXJtaW5hdGVkIGNoYXIKLSAgICAgICAgIHN0cmluZ3MsIG5vdCBVbmljb2RlIHN0cmluZ3MuICAqLwotCi0gICAgICBvZmYgPSA1NjsKLQotICAgICAgd2hpbGUgKG9mZiA8IGxlbmd0aCAmJiBkYXRhW29mZl0gIT0gJ1wwJykKLQkrK29mZjsKLSAgICAgIGlmIChvZmYgPj0gbGVuZ3RoKQotCXRvb3NtYWxsIChfKCJmb250ZGlyIGRldmljZSBuYW1lIikpOwotICAgICAgKytvZmY7Ci0KLSAgICAgIHdoaWxlIChvZmYgPCBsZW5ndGggJiYgZGF0YVtvZmZdICE9ICdcMCcpCi0JKytvZmY7Ci0gICAgICBpZiAob2ZmID49IGxlbmd0aCkKLQl0b29zbWFsbCAoXygiZm9udGRpciBmYWNlIG5hbWUiKSk7Ci0gICAgICArK29mZjsKLQotICAgICAgZmQtPmxlbmd0aCA9IG9mZjsKLSAgICAgIGZkLT5kYXRhID0gZGF0YTsKLQotICAgICAgZmQtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gZmQ7Ci0gICAgICBwcCA9ICZmZC0+bmV4dDsKLQotICAgICAgLyogVGhlIGRvY3VtZW50YXRpb24gZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhbnkgcm91bmRpbmcgaXMKLSAgICAgICAgIHJlcXVpcmVkLiAgKi8KLQotICAgICAgZGF0YSArPSBvZmY7Ci0gICAgICBsZW5ndGggLT0gb2ZmOwotICAgIH0KLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gUkVTX1RZUEVfRk9OVERJUjsKLSAgci0+dS5mb250ZGlyID0gZmlyc3Q7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIENvbnZlcnQgYW4gYWNjZWxlcmF0b3JzIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc19hY2NlbGVyYXRvcnMgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYWNjZWxlcmF0b3IgKmZpcnN0LCAqKnBwOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgc3RydWN0IGFjY2VsZXJhdG9yICphOwotCi0gICAgICBpZiAobGVuZ3RoIDwgOCkKLQl0b29zbWFsbCAoXygiYWNjZWxlcmF0b3IiKSk7Ci0KLSAgICAgIGEgPSAoc3RydWN0IGFjY2VsZXJhdG9yICopIHJlc19hbGxvYyAoc2l6ZW9mICphKTsKLQotICAgICAgYS0+ZmxhZ3MgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotICAgICAgYS0+a2V5ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0gICAgICBhLT5pZCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOwotCi0gICAgICBhLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGE7Ci0gICAgICBwcCA9ICZhLT5uZXh0OwotCi0gICAgICBpZiAoKGEtPmZsYWdzICYgQUNDX0xBU1QpICE9IDApCi0JYnJlYWs7Ci0KLSAgICAgIGRhdGEgKz0gODsKLSAgICAgIGxlbmd0aCAtPSA4OwotICAgIH0KLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gUkVTX1RZUEVfQUNDRUxFUkFUT1I7Ci0gIHItPnUuYWNjID0gZmlyc3Q7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIENvbnZlcnQgYW4gcmNkYXRhIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc19yY2RhdGEgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnJpOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIHJpID0gKHN0cnVjdCByY2RhdGFfaXRlbSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcmkpOwotCi0gIHJpLT5uZXh0ID0gTlVMTDsKLSAgcmktPnR5cGUgPSBSQ0RBVEFfQlVGRkVSOwotICByaS0+dS5idWZmZXIubGVuZ3RoID0gbGVuZ3RoOwotICByaS0+dS5idWZmZXIuZGF0YSA9IGRhdGE7Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX1JDREFUQTsKLSAgci0+dS5yY2RhdGEgPSByaTsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhIGdyb3VwIGN1cnNvciByZXNvdXJjZSBmcm9tIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICoKLWJpbl90b19yZXNfZ3JvdXBfY3Vyc29yIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgaW50IHR5cGUsIGMsIGk7Ci0gIHN0cnVjdCBncm91cF9jdXJzb3IgKmZpcnN0LCAqKnBwOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGlmIChsZW5ndGggPCA2KQotICAgIHRvb3NtYWxsIChfKCJncm91cCBjdXJzb3IgaGVhZGVyIikpOwotCi0gIHR5cGUgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKLSAgaWYgKHR5cGUgIT0gMikKLSAgICBmYXRhbCAoXygidW5leHBlY3RlZCBncm91cCBjdXJzb3IgdHlwZSAlZCIpLCB0eXBlKTsKLQotICBjID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNCk7Ci0KLSAgZGF0YSArPSA2OwotICBsZW5ndGggLT0gNjsKLQotICBmaXJzdCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0OwotCi0gIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGdyb3VwX2N1cnNvciAqZ2M7Ci0KLSAgICAgIGlmIChsZW5ndGggPCAxNCkKLQl0b29zbWFsbCAoXygiZ3JvdXAgY3Vyc29yIikpOwotCi0gICAgICBnYyA9IChzdHJ1Y3QgZ3JvdXBfY3Vyc29yICopIHJlc19hbGxvYyAoc2l6ZW9mICpnYyk7Ci0KLSAgICAgIGdjLT53aWR0aCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gICAgICBnYy0+aGVpZ2h0ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0gICAgICBnYy0+cGxhbmVzID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNCk7Ci0gICAgICBnYy0+Yml0cyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDYpOwotICAgICAgZ2MtPmJ5dGVzID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgOCk7Ci0gICAgICBnYy0+aW5kZXggPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAxMik7Ci0KLSAgICAgIGdjLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGdjOwotICAgICAgcHAgPSAmZ2MtPm5leHQ7Ci0KLSAgICAgIGRhdGEgKz0gMTQ7Ci0gICAgICBsZW5ndGggLT0gMTQ7Ci0gICAgfQotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9HUk9VUF9DVVJTT1I7Ci0gIHItPnUuZ3JvdXBfY3Vyc29yID0gZmlyc3Q7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIENvbnZlcnQgYSBncm91cCBpY29uIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc19ncm91cF9pY29uIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgaW50IHR5cGUsIGMsIGk7Ci0gIHN0cnVjdCBncm91cF9pY29uICpmaXJzdCwgKipwcDsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICBpZiAobGVuZ3RoIDwgNikKLSAgICB0b29zbWFsbCAoXygiZ3JvdXAgaWNvbiBoZWFkZXIiKSk7Ci0KLSAgdHlwZSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOwotICBpZiAodHlwZSAhPSAxKQotICAgIGZhdGFsIChfKCJ1bmV4cGVjdGVkIGdyb3VwIGljb24gdHlwZSAlZCIpLCB0eXBlKTsKLQotICBjID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNCk7Ci0KLSAgZGF0YSArPSA2OwotICBsZW5ndGggLT0gNjsKLQotICBmaXJzdCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0OwotCi0gIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGdyb3VwX2ljb24gKmdpOwotCi0gICAgICBpZiAobGVuZ3RoIDwgMTQpCi0JdG9vc21hbGwgKF8oImdyb3VwIGljb24iKSk7Ci0KLSAgICAgIGdpID0gKHN0cnVjdCBncm91cF9pY29uICopIHJlc19hbGxvYyAoc2l6ZW9mICpnaSk7Ci0KLSAgICAgIGdpLT53aWR0aCA9IGRhdGFbMF07Ci0gICAgICBnaS0+aGVpZ2h0ID0gZGF0YVsxXTsKLSAgICAgIGdpLT5jb2xvcnMgPSBkYXRhWzJdOwotICAgICAgZ2ktPnBsYW5lcyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOwotICAgICAgZ2ktPmJpdHMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA2KTsKLSAgICAgIGdpLT5ieXRlcyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDgpOwotICAgICAgZ2ktPmluZGV4ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMTIpOwotCi0gICAgICBnaS0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBnaTsKLSAgICAgIHBwID0gJmdpLT5uZXh0OwotCi0gICAgICBkYXRhICs9IDE0OwotICAgICAgbGVuZ3RoIC09IDE0OwotICAgIH0KLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gUkVTX1RZUEVfR1JPVVBfSUNPTjsKLSAgci0+dS5ncm91cF9pY29uID0gZmlyc3Q7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIEV4dHJhY3QgZGF0YSBmcm9tIGEgdmVyc2lvbiBoZWFkZXIuICBJZiBLRVkgaXMgbm90IE5VTEwsIHRoZW4gdGhlCi0gICBrZXkgbXVzdCBiZSBLRVk7IG90aGVyd2lzZSwgdGhlIGtleSBpcyByZXR1cm5lZCBpbiAqUEtFWS4gIFRoaXMKLSAgIHNldHMgKkxFTiB0byB0aGUgdG90YWwgbGVuZ3RoLCAqVkFMTEVOIHRvIHRoZSB2YWx1ZSBsZW5ndGgsICpUWVBFCi0gICB0byB0aGUgdHlwZSwgYW5kICpPRkYgdG8gdGhlIG9mZnNldCB0byB0aGUgY2hpbGRyZW4uICAqLwotCi1zdGF0aWMgdm9pZAotZ2V0X3ZlcnNpb25faGVhZGVyIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sIGtleSwgcGtleSwgbGVuLCB2YWxsZW4sIHR5cGUsCi0JCSAgICBvZmYpCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLSAgICAgY29uc3QgY2hhciAqa2V5OwotICAgICB1bmljaGFyICoqcGtleTsKLSAgICAgaW50ICpsZW47Ci0gICAgIGludCAqdmFsbGVuOwotICAgICBpbnQgKnR5cGU7Ci0gICAgIGludCAqb2ZmOwotewotICBpZiAobGVuZ3RoIDwgOCkKLSAgICB0b29zbWFsbCAoa2V5KTsKLQotICAqbGVuID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLSAgKnZhbGxlbiA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOwotICAqdHlwZSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOwotCi0gICpvZmYgPSA2OwotCi0gIGxlbmd0aCAtPSA2OwotICBkYXRhICs9IDY7Ci0KLSAgaWYgKGtleSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGludCBzdWJsZW47Ci0KLSAgICAgICpwa2V5ID0gZ2V0X3VuaWNvZGUgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgJnN1Ymxlbik7Ci0gICAgICAqb2ZmICs9IHN1YmxlbiAqIDIgKyAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIGlmIChsZW5ndGggPCAyKQotCSAgICB0b29zbWFsbCAoa2V5KTsKLQkgIGlmIChnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpICE9ICh1bnNpZ25lZCBjaGFyKSAqa2V5KQotCSAgICBmYXRhbCAoXygidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZyIpKTsKLQotCSAgKm9mZiArPSAyOwotCSAgbGVuZ3RoIC09IDI7Ci0JICBkYXRhICs9IDI7Ci0KLQkgIGlmICgqa2V5ID09ICdcMCcpCi0JICAgIGJyZWFrOwotCi0JICArK2tleTsKLQl9Ci0gICAgfQotCi0gICpvZmYgPSAoKm9mZiArIDMpICZ+IDM7Ci19Ci0KLS8qIENvbnZlcnQgYSB2ZXJzaW9uIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc192ZXJzaW9uIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgaW50IHZlcmxlbiwgdmFsbGVuLCB0eXBlLCBvZmY7Ci0gIHN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbyAqZmk7Ci0gIHN0cnVjdCB2ZXJfaW5mbyAqZmlyc3QsICoqcHA7Ci0gIHN0cnVjdCB2ZXJzaW9uaW5mbyAqdjsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICBnZXRfdmVyc2lvbl9oZWFkZXIgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgIlZTX1ZFUlNJT05fSU5GTyIsCi0JCSAgICAgICh1bmljaGFyICopIE5VTEwsICZ2ZXJsZW4sICZ2YWxsZW4sICZ0eXBlLCAmb2ZmKTsKLQotICBpZiAoKHVuc2lnbmVkIGludCkgdmVybGVuICE9IGxlbmd0aCkKLSAgICBmYXRhbCAoXygidmVyc2lvbiBsZW5ndGggJWQgZG9lcyBub3QgbWF0Y2ggcmVzb3VyY2UgbGVuZ3RoICVsdSIpLAotCSAgIHZlcmxlbiwgbGVuZ3RoKTsKLQotICBpZiAodHlwZSAhPSAwKQotICAgIGZhdGFsIChfKCJ1bmV4cGVjdGVkIHZlcnNpb24gdHlwZSAlZCIpLCB0eXBlKTsKLQotICBkYXRhICs9IG9mZjsKLSAgbGVuZ3RoIC09IG9mZjsKLQotICBpZiAodmFsbGVuID09IDApCi0gICAgZmkgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBzaWduYXR1cmUsIGZpdjsKLQotICAgICAgaWYgKHZhbGxlbiAhPSA1MikKLQlmYXRhbCAoXygidW5leHBlY3RlZCBmaXhlZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGxlbmd0aCAlZCIpLCB2YWxsZW4pOwotCi0gICAgICBpZiAobGVuZ3RoIDwgNTIpCi0JdG9vc21hbGwgKF8oImZpeGVkIHZlcnNpb24gaW5mbyIpKTsKLQotICAgICAgc2lnbmF0dXJlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhKTsKLSAgICAgIGlmIChzaWduYXR1cmUgIT0gMHhmZWVmMDRiZCkKLQlmYXRhbCAoXygidW5leHBlY3RlZCBmaXhlZCB2ZXJzaW9uIHNpZ25hdHVyZSAlbHUiKSwgc2lnbmF0dXJlKTsKLQotICAgICAgZml2ID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgNCk7Ci0gICAgICBpZiAoZml2ICE9IDAgJiYgZml2ICE9IDB4MTAwMDApCi0JZmF0YWwgKF8oInVuZXhwZWN0ZWQgZml4ZWQgdmVyc2lvbiBpbmZvIHZlcnNpb24gJWx1IiksIGZpdik7Ci0KLSAgICAgIGZpID0gKHN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqZmkpOwotCi0gICAgICBmaS0+ZmlsZV92ZXJzaW9uX21zID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgOCk7Ci0gICAgICBmaS0+ZmlsZV92ZXJzaW9uX2xzID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgMTIpOwotICAgICAgZmktPnByb2R1Y3RfdmVyc2lvbl9tcyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDE2KTsKLSAgICAgIGZpLT5wcm9kdWN0X3ZlcnNpb25fbHMgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyAyMCk7Ci0gICAgICBmaS0+ZmlsZV9mbGFnc19tYXNrID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgMjQpOwotICAgICAgZmktPmZpbGVfZmxhZ3MgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyAyOCk7Ci0gICAgICBmaS0+ZmlsZV9vcyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDMyKTsKLSAgICAgIGZpLT5maWxlX3R5cGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyAzNik7Ci0gICAgICBmaS0+ZmlsZV9zdWJ0eXBlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgNDApOwotICAgICAgZmktPmZpbGVfZGF0ZV9tcyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQ0KTsKLSAgICAgIGZpLT5maWxlX2RhdGVfbHMgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA0OCk7Ci0KLSAgICAgIGRhdGEgKz0gNTI7Ci0gICAgICBsZW5ndGggLT0gNTI7Ci0gICAgfQotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgd2hpbGUgKGxlbmd0aCA+IDApCi0gICAgewotICAgICAgc3RydWN0IHZlcl9pbmZvICp2aTsKLSAgICAgIGludCBjaDsKLQotICAgICAgaWYgKGxlbmd0aCA8IDgpCi0JdG9vc21hbGwgKF8oInZlcnNpb24gdmFyIGluZm8iKSk7Ci0KLSAgICAgIHZpID0gKHN0cnVjdCB2ZXJfaW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqdmkpOwotCi0gICAgICBjaCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDYpOwotCi0gICAgICBpZiAoY2ggPT0gJ1MnKQotCXsKLQkgIHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqKnBwdnM7Ci0KLQkgIHZpLT50eXBlID0gVkVSSU5GT19TVFJJTkc7Ci0KLQkgIGdldF92ZXJzaW9uX2hlYWRlciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCAiU3RyaW5nRmlsZUluZm8iLAotCQkJICAgICAgKHVuaWNoYXIgKikgTlVMTCwgJnZlcmxlbiwgJnZhbGxlbiwgJnR5cGUsCi0JCQkgICAgICAmb2ZmKTsKLQotCSAgaWYgKHZhbGxlbiAhPSAwKQotCSAgICBmYXRhbCAoXygidW5leHBlY3RlZCBzdHJpbmdmaWxlaW5mbyB2YWx1ZSBsZW5ndGggJWQiKSwgdmFsbGVuKTsKLQotCSAgZGF0YSArPSBvZmY7Ci0JICBsZW5ndGggLT0gb2ZmOwotCi0JICBnZXRfdmVyc2lvbl9oZWFkZXIgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCSAgICAgICZ2aS0+dS5zdHJpbmcubGFuZ3VhZ2UsICZ2ZXJsZW4sICZ2YWxsZW4sCi0JCQkgICAgICAmdHlwZSwgJm9mZik7Ci0KLQkgIGlmICh2YWxsZW4gIT0gMCkKLQkgICAgZmF0YWwgKF8oInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmd0YWJsZSB2YWx1ZSBsZW5ndGggJWQiKSwgdmFsbGVuKTsKLQotCSAgZGF0YSArPSBvZmY7Ci0JICBsZW5ndGggLT0gb2ZmOwotCSAgdmVybGVuIC09IG9mZjsKLQotCSAgdmktPnUuc3RyaW5nLnN0cmluZ3MgPSBOVUxMOwotCSAgcHB2cyA9ICZ2aS0+dS5zdHJpbmcuc3RyaW5nczsKLQotCSAgLyogSXQncyBjb252ZW5pZW50IHRvIHJvdW5kIHZlcmxlbiB0byBhIDQgYnl0ZSBhbGlnbm1lbnQsCi0gICAgICAgICAgICAgc2luY2Ugd2Ugcm91bmQgdGhlIHN1YnZhcmlhYmxlcyBpbiB0aGUgbG9vcC4gICovCi0JICB2ZXJsZW4gPSAodmVybGVuICsgMykgJn4gMzsKLQotCSAgd2hpbGUgKHZlcmxlbiA+IDApCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKnZzOwotCSAgICAgIGludCBzdWJ2ZXJsZW4sIHZzbGVuLCB2YWxvZmY7Ci0KLQkgICAgICB2cyA9IChzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKikgcmVzX2FsbG9jIChzaXplb2YgKnZzKTsKLQotCSAgICAgIGdldF92ZXJzaW9uX2hlYWRlciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLAotCQkJCSAgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnZzLT5rZXksICZzdWJ2ZXJsZW4sCi0JCQkJICAmdmFsbGVuLCAmdHlwZSwgJm9mZik7Ci0KLQkgICAgICBzdWJ2ZXJsZW4gPSAoc3VidmVybGVuICsgMykgJn4gMzsKLQotCSAgICAgIGRhdGEgKz0gb2ZmOwotCSAgICAgIGxlbmd0aCAtPSBvZmY7Ci0KLQkgICAgICB2cy0+dmFsdWUgPSBnZXRfdW5pY29kZSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCAmdnNsZW4pOwotCSAgICAgIHZhbG9mZiA9IHZzbGVuICogMiArIDI7Ci0JICAgICAgdmFsb2ZmID0gKHZhbG9mZiArIDMpICZ+IDM7Ci0KLQkgICAgICBpZiAob2ZmICsgdmFsb2ZmICE9IHN1YnZlcmxlbikKLQkJZmF0YWwgKF8oInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmcgbGVuZ3RoICVkICE9ICVkICsgJWQiKSwKLQkJICAgICAgIHN1YnZlcmxlbiwgb2ZmLCB2YWxvZmYpOwotCi0JICAgICAgdnMtPm5leHQgPSBOVUxMOwotCSAgICAgICpwcHZzID0gdnM7Ci0JICAgICAgcHB2cyA9ICZ2cy0+bmV4dDsKLQotCSAgICAgIGRhdGEgKz0gdmFsb2ZmOwotCSAgICAgIGxlbmd0aCAtPSB2YWxvZmY7Ci0KLQkgICAgICBpZiAodmVybGVuIDwgc3VidmVybGVuKQotCQlmYXRhbCAoXygidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZyBsZW5ndGggJWQgPCAlZCIpLAotCQkgICAgICAgdmVybGVuLCBzdWJ2ZXJsZW4pOwotCi0JICAgICAgdmVybGVuIC09IHN1YnZlcmxlbjsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGNoID09ICdWJykKLQl7Ci0JICBzdHJ1Y3QgdmVyX3ZhcmluZm8gKipwcHZ2OwotCi0JICB2aS0+dHlwZSA9IFZFUklORk9fVkFSOwotCi0JICBnZXRfdmVyc2lvbl9oZWFkZXIgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgIlZhckZpbGVJbmZvIiwKLQkJCSAgICAgICh1bmljaGFyICopIE5VTEwsICZ2ZXJsZW4sICZ2YWxsZW4sICZ0eXBlLAotCQkJICAgICAgJm9mZik7Ci0KLQkgIGlmICh2YWxsZW4gIT0gMCkKLQkgICAgZmF0YWwgKF8oInVuZXhwZWN0ZWQgdmFyZmlsZWluZm8gdmFsdWUgbGVuZ3RoICVkIiksIHZhbGxlbik7Ci0KLQkgIGRhdGEgKz0gb2ZmOwotCSAgbGVuZ3RoIC09IG9mZjsKLQotCSAgZ2V0X3ZlcnNpb25faGVhZGVyIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkgICAgICAmdmktPnUudmFyLmtleSwgJnZlcmxlbiwgJnZhbGxlbiwgJnR5cGUsICZvZmYpOwotCi0JICBkYXRhICs9IG9mZjsKLQkgIGxlbmd0aCAtPSBvZmY7Ci0KLQkgIHZpLT51LnZhci52YXIgPSBOVUxMOwotCSAgcHB2diA9ICZ2aS0+dS52YXIudmFyOwotCi0JICB3aGlsZSAodmFsbGVuID4gMCkKLQkgICAgewotCSAgICAgIHN0cnVjdCB2ZXJfdmFyaW5mbyAqdnY7Ci0KLQkgICAgICBpZiAobGVuZ3RoIDwgNCkKLQkJdG9vc21hbGwgKF8oInZlcnNpb24gdmFyZmlsZWluZm8iKSk7Ci0KLQkgICAgICB2diA9IChzdHJ1Y3QgdmVyX3ZhcmluZm8gKikgcmVzX2FsbG9jIChzaXplb2YgKnZ2KTsKLQotCSAgICAgIHZ2LT5sYW5ndWFnZSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0JICAgICAgdnYtPmNoYXJzZXQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKLQotCSAgICAgIHZ2LT5uZXh0ID0gTlVMTDsKLQkgICAgICAqcHB2diA9IHZ2OwotCSAgICAgIHBwdnYgPSAmdnYtPm5leHQ7Ci0KLQkgICAgICBkYXRhICs9IDQ7Ci0JICAgICAgbGVuZ3RoIC09IDQ7Ci0KLQkgICAgICBpZiAodmFsbGVuIDwgNCkKLQkJZmF0YWwgKF8oInVuZXhwZWN0ZWQgdmVyc2lvbiB2YWx1ZSBsZW5ndGggJWQiKSwgdmFsbGVuKTsKLQotCSAgICAgIHZhbGxlbiAtPSA0OwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCWZhdGFsIChfKCJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5nIikpOwotCi0gICAgICB2aS0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSB2aTsKLSAgICAgIHBwID0gJnZpLT5uZXh0OyAgICAgIAotICAgIH0KLQotICB2ID0gKHN0cnVjdCB2ZXJzaW9uaW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqdik7Ci0gIHYtPmZpeGVkID0gZmk7Ci0gIHYtPnZhciA9IGZpcnN0OwotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9WRVJTSU9OSU5GTzsKLSAgci0+dS52ZXJzaW9uaW5mbyA9IHY7Ci0KLSAgcmV0dXJuIHI7ICAKLX0KLQotLyogQ29udmVydCBhbiBhcmJpdHJhcnkgdXNlciBkZWZpbmVkIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc191c2VyZGF0YSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgcmkgPSAoc3RydWN0IHJjZGF0YV9pdGVtICopIHJlc19hbGxvYyAoc2l6ZW9mICpyaSk7Ci0KLSAgcmktPm5leHQgPSBOVUxMOwotICByaS0+dHlwZSA9IFJDREFUQV9CVUZGRVI7Ci0gIHJpLT51LmJ1ZmZlci5sZW5ndGggPSBsZW5ndGg7Ci0gIHJpLT51LmJ1ZmZlci5kYXRhID0gZGF0YTsKLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gUkVTX1RZUEVfVVNFUkRBVEE7Ci0gIHItPnUucmNkYXRhID0gcmk7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0MCi0vKiBNYWNyb3MgdG8gc3dhcCBvdXQgdmFsdWVzLiAgKi8KLQotI2RlZmluZSBwdXRfMTYoYmUsIHYsIHMpICgoYmUpID8gYmZkX3B1dGIxNiAoKHYpLCAocykpIDogYmZkX3B1dGwxNiAoKHYpLCAocykpKQotI2RlZmluZSBwdXRfMzIoYmUsIHYsIHMpICgoYmUpID8gYmZkX3B1dGIzMiAoKHYpLCAocykpIDogYmZkX3B1dGwzMiAoKHYpLCAocykpKQotCi0vKiBMb2NhbCBmdW5jdGlvbnMgdXNlZCB0byBjb252ZXJ0IHJlc291cmNlcyB0byBiaW5hcnkgZm9ybWF0LiAgKi8KLQotc3RhdGljIHZvaWQgZHdvcmRfYWxpZ25fYmluIFBBUkFNUyAoKHN0cnVjdCBiaW5kYXRhICoqKiwgdW5zaWduZWQgbG9uZyAqKSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc2lkX3RvX2JpbiBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqdW5pY29kZV90b19iaW4gUEFSQU1TICgoY29uc3QgdW5pY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9hY2NlbGVyYXRvcgotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWNjZWxlcmF0b3IgKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fY3Vyc29yCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBjdXJzb3IgKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fZ3JvdXBfY3Vyc29yCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBncm91cF9jdXJzb3IgKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fZGlhbG9nCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBkaWFsb2cgKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fZm9udGRpcgotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZm9udGRpciAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9ncm91cF9pY29uCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBncm91cF9pY29uICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX21lbnUKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IG1lbnUgKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fbWVudWl0ZW1zCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9tZW51ZXhpdGVtcwotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fcmNkYXRhCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByY2RhdGFfaXRlbSAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9zdHJpbmd0YWJsZQotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3Qgc3RyaW5ndGFibGUgKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnN0cmluZ190b191bmljb2RlX2JpbiBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX3ZlcnNpb25pbmZvCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCB2ZXJzaW9uaW5mbyAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9nZW5lcmljCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotCi0vKiBDb252ZXJ0IGEgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2JpbiAocmVzLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyZXM7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzd2l0Y2ggKHJlcy0+dHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgUkVTX1RZUEVfQklUTUFQOgotICAgIGNhc2UgUkVTX1RZUEVfRk9OVDoKLSAgICBjYXNlIFJFU19UWVBFX0lDT046Ci0gICAgY2FzZSBSRVNfVFlQRV9NRVNTQUdFVEFCTEU6Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl9nZW5lcmljIChyZXMtPnUuZGF0YS5sZW5ndGgsIHJlcy0+dS5kYXRhLmRhdGEpOwotICAgIGNhc2UgUkVTX1RZUEVfQUNDRUxFUkFUT1I6Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl9hY2NlbGVyYXRvciAocmVzLT51LmFjYywgYmlnX2VuZGlhbik7Ci0gICAgY2FzZSBSRVNfVFlQRV9DVVJTT1I6Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl9jdXJzb3IgKHJlcy0+dS5jdXJzb3IsIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfR1JPVVBfQ1VSU09SOgotICAgICAgcmV0dXJuIHJlc190b19iaW5fZ3JvdXBfY3Vyc29yIChyZXMtPnUuZ3JvdXBfY3Vyc29yLCBiaWdfZW5kaWFuKTsKLSAgICBjYXNlIFJFU19UWVBFX0RJQUxPRzoKLSAgICAgIHJldHVybiByZXNfdG9fYmluX2RpYWxvZyAocmVzLT51LmRpYWxvZywgYmlnX2VuZGlhbik7Ci0gICAgY2FzZSBSRVNfVFlQRV9GT05URElSOgotICAgICAgcmV0dXJuIHJlc190b19iaW5fZm9udGRpciAocmVzLT51LmZvbnRkaXIsIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfR1JPVVBfSUNPTjoKLSAgICAgIHJldHVybiByZXNfdG9fYmluX2dyb3VwX2ljb24gKHJlcy0+dS5ncm91cF9pY29uLCBiaWdfZW5kaWFuKTsKLSAgICBjYXNlIFJFU19UWVBFX01FTlU6Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl9tZW51IChyZXMtPnUubWVudSwgYmlnX2VuZGlhbik7Ci0gICAgY2FzZSBSRVNfVFlQRV9SQ0RBVEE6Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl9yY2RhdGEgKHJlcy0+dS5yY2RhdGEsIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfU1RSSU5HVEFCTEU6Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl9zdHJpbmd0YWJsZSAocmVzLT51LnN0cmluZ3RhYmxlLCBiaWdfZW5kaWFuKTsKLSAgICBjYXNlIFJFU19UWVBFX1VTRVJEQVRBOgotICAgICAgcmV0dXJuIHJlc190b19iaW5fcmNkYXRhIChyZXMtPnUucmNkYXRhLCBiaWdfZW5kaWFuKTsKLSAgICBjYXNlIFJFU19UWVBFX1ZFUlNJT05JTkZPOgotICAgICAgcmV0dXJuIHJlc190b19iaW5fdmVyc2lvbmluZm8gKHJlcy0+dS52ZXJzaW9uaW5mbywgYmlnX2VuZGlhbik7Ci0gICAgfQotfQotCi0vKiBBbGlnbiB0byBhIDMyIGJpdCBib3VuZGFyeS4gIFBQUCBwb2ludHMgdG8gdGhlIG9mIGEgbGlzdCBvZiBiaW5kYXRhCi0gICBzdHJ1Y3R1cmVzLiAgTEVOR1RIIHBvaW50cyB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJ1Y3R1cmVzLiAgSWYKLSAgIG5lY2Vzc2FyeSwgdGhpcyBhZGRzIGEgbmV3IGJpbmRhdGEgdG8gYnJpbmcgbGVuZ3RoIHVwIHRvIGEgMzIgYml0Ci0gICBib3VuZGFyeS4gIEl0IHVwZGF0ZXMgKlBQUCBhbmQgKkxFTkdUSC4gICovCi0KLXN0YXRpYyB2b2lkCi1kd29yZF9hbGlnbl9iaW4gKHBwcCwgbGVuZ3RoKQotICAgICBzdHJ1Y3QgYmluZGF0YSAqKipwcHA7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmxlbmd0aDsKLXsKLSAgaW50IGFkZDsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgaWYgKCgqbGVuZ3RoICYgMykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgYWRkID0gNCAtICgqbGVuZ3RoICYgMyk7Ci0KLSAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgZC0+bGVuZ3RoID0gYWRkOwotICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGFkZCk7Ci0gIG1lbXNldCAoZC0+ZGF0YSwgMCwgYWRkKTsKLQotICBkLT5uZXh0ID0gTlVMTDsKLSAgKipwcHAgPSBkOwotICAqcHBwID0gJigqKnBwcCktPm5leHQ7Ci0KLSAgKmxlbmd0aCArPSBhZGQ7Ci19Ci0KLS8qIENvbnZlcnQgYSByZXNvdXJjZSBJRCB0byBiaW5hcnkuICBUaGlzIGFsd2F5cyByZXR1cm5zIGV4YWN0bHkgb25lCi0gICBiaW5kYXRhIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNpZF90b19iaW4gKGlkLCBiaWdfZW5kaWFuKQotICAgICBzdHJ1Y3QgcmVzX2lkIGlkOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLQotICBpZiAoISBpZC5uYW1lZCkKLSAgICB7Ci0gICAgICBkLT5sZW5ndGggPSA0OwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg0KTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMHhmZmZmLCBkLT5kYXRhKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgaWQudS5pZCwgZC0+ZGF0YSArIDIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBkLT5sZW5ndGggPSBpZC51Lm4ubGVuZ3RoICogMiArIDI7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGQtPmxlbmd0aCk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgaWQudS5uLmxlbmd0aDsgaSsrKQotCXB1dF8xNiAoYmlnX2VuZGlhbiwgaWQudS5uLm5hbWVbaV0sIGQtPmRhdGEgKyBpICogMik7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEgKyBpICogMik7Ci0gICAgfQotCi0gIGQtPm5leHQgPSBOVUxMOwotCi0gIHJldHVybiBkOwotfQotCi0vKiBDb252ZXJ0IGEgbnVsbCB0ZXJtaW5hdGVkIHVuaWNvZGUgc3RyaW5nIHRvIGJpbmFyeS4gIFRoaXMgYWx3YXlzCi0gICByZXR1cm5zIGV4YWN0bHkgb25lIGJpbmRhdGEgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXVuaWNvZGVfdG9fYmluIChzdHIsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHVuaWNoYXIgKnN0cjsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIGludCBsZW47Ci0gIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gIGxlbiA9IDA7Ci0gIGlmIChzdHIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCB1bmljaGFyICpzOwotCi0gICAgICBmb3IgKHMgPSBzdHI7ICpzICE9IDA7IHMrKykKLQkrK2xlbjsKLSAgICB9Ci0KLSAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgZC0+bGVuZ3RoID0gbGVuICogMiArIDI7Ci0gIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoZC0+bGVuZ3RoKTsKLQotICBpZiAoc3RyID09IE5VTEwpCi0gICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBkLT5kYXRhKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IHVuaWNoYXIgKnM7Ci0gICAgICBpbnQgaTsKLQotICAgICAgZm9yIChzID0gc3RyLCBpID0gMDsgKnMgIT0gMDsgcysrLCBpKyspCi0JcHV0XzE2IChiaWdfZW5kaWFuLCAqcywgZC0+ZGF0YSArIGkgKiAyKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSArIGkgKiAyKTsKLSAgICB9Ci0KLSAgZC0+bmV4dCA9IE5VTEw7Ci0KLSAgcmV0dXJuIGQ7Ci19Ci0KLS8qIENvbnZlcnQgYW4gYWNjZWxlcmF0b3IgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fYWNjZWxlcmF0b3IgKGFjY2VsZXJhdG9ycywgYmlnX2VuZGlhbikKLSAgICAgY29uc3Qgc3RydWN0IGFjY2VsZXJhdG9yICphY2NlbGVyYXRvcnM7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7Ci0gIGNvbnN0IHN0cnVjdCBhY2NlbGVyYXRvciAqYTsKLQotICBmaXJzdCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0OwotCi0gIGZvciAoYSA9IGFjY2VsZXJhdG9yczsgYSAhPSBOVUxMOyBhID0gYS0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDg7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDgpOwotCi0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sCi0JICAgICAgYS0+ZmxhZ3MgfCAoYS0+bmV4dCAhPSBOVUxMID8gMCA6IEFDQ19MQVNUKSwKLQkgICAgICBkLT5kYXRhKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgYS0+a2V5LCBkLT5kYXRhICsgMik7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGEtPmlkLCBkLT5kYXRhICsgNCk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEgKyA4KTsKLQotICAgICAgZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpcnN0OwotfQotCi0vKiBDb252ZXJ0IGEgY3Vyc29yIHJlc291cmNlIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX2N1cnNvciAoYywgYmlnX2VuZGlhbikKLSAgICAgY29uc3Qgc3RydWN0IGN1cnNvciAqYzsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gIGQtPmxlbmd0aCA9IDQ7Ci0gIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNCk7Ci0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBjLT54aG90c3BvdCwgZC0+ZGF0YSk7Ci0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgYy0+eWhvdHNwb3QsIGQtPmRhdGEgKyAyKTsKLQotICBkLT5uZXh0ID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICBkLT5uZXh0LT5sZW5ndGggPSBjLT5sZW5ndGg7Ci0gIGQtPm5leHQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSBjLT5kYXRhOwotICBkLT5uZXh0LT5uZXh0ID0gTlVMTDsKLQotICByZXR1cm4gZDsKLX0KLQotLyogQ29udmVydCBhIGdyb3VwIGN1cnNvciByZXNvdXJjZSB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9ncm91cF9jdXJzb3IgKGdyb3VwX2N1cnNvcnMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBncm91cF9jdXJzb3IgKmdyb3VwX2N1cnNvcnM7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7Ci0gIGludCBjOwotICBjb25zdCBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpnYzsKLQotICBmaXJzdCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpmaXJzdCk7Ci0gIGZpcnN0LT5sZW5ndGggPSA2OwotICBmaXJzdC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg2KTsKLQotICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGZpcnN0LT5kYXRhKTsKLSAgcHV0XzE2IChiaWdfZW5kaWFuLCAyLCBmaXJzdC0+ZGF0YSArIDIpOwotCi0gIGZpcnN0LT5uZXh0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3QtPm5leHQ7Ci0KLSAgYyA9IDA7Ci0gIGZvciAoZ2MgPSBncm91cF9jdXJzb3JzOyBnYyAhPSBOVUxMOyBnYyA9IGdjLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gICAgICArK2M7Ci0KLSAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gICAgICBkLT5sZW5ndGggPSAxNDsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoMTQpOwotCi0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGdjLT53aWR0aCwgZC0+ZGF0YSk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGdjLT5oZWlnaHQsIGQtPmRhdGEgKyAyKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZ2MtPnBsYW5lcywgZC0+ZGF0YSArIDQpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBnYy0+Yml0cywgZC0+ZGF0YSArIDYpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBnYy0+Ynl0ZXMsIGQtPmRhdGEgKyA4KTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZ2MtPmluZGV4LCBkLT5kYXRhICsgMTIpOwotCi0gICAgICBkLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OwotICAgIH0KLQotICBwdXRfMTYgKGJpZ19lbmRpYW4sIGMsIGZpcnN0LT5kYXRhICsgNCk7Ci0KLSAgcmV0dXJuIGZpcnN0OwotfQotCi0vKiBDb252ZXJ0IGEgZGlhbG9nIHJlc291cmNlIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX2RpYWxvZyAoZGlhbG9nLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgZGlhbG9nICpkaWFsb2c7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgZGlhbG9nZXg7Ci0gIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKLSAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIGludCBvZmYsIGM7Ci0gIHN0cnVjdCBkaWFsb2dfY29udHJvbCAqZGM7Ci0KLSAgZGlhbG9nZXggPSBleHRlbmRlZF9kaWFsb2cgKGRpYWxvZyk7Ci0KLSAgZmlyc3QgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZmlyc3QpOwotICBmaXJzdC0+bGVuZ3RoID0gZGlhbG9nZXggPyAyNiA6IDE4OwotICBmaXJzdC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChmaXJzdC0+bGVuZ3RoKTsKLQotICBsZW5ndGggPSBmaXJzdC0+bGVuZ3RoOwotCi0gIGlmICghIGRpYWxvZ2V4KQotICAgIHsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGlhbG9nLT5zdHlsZSwgZmlyc3QtPmRhdGEpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBkaWFsb2ctPmV4c3R5bGUsIGZpcnN0LT5kYXRhICsgNCk7Ci0gICAgICBvZmYgPSA4OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMSwgZmlyc3QtPmRhdGEpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAweGZmZmYsIGZpcnN0LT5kYXRhICsgMik7Ci0KLSAgICAgIGlmIChkaWFsb2ctPmV4ID09IE5VTEwpCi0JcHV0XzMyIChiaWdfZW5kaWFuLCAwLCBmaXJzdC0+ZGF0YSArIDQpOwotICAgICAgZWxzZQotCXB1dF8zMiAoYmlnX2VuZGlhbiwgZGlhbG9nLT5leC0+aGVscCwgZmlyc3QtPmRhdGEgKyA0KTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGlhbG9nLT5leHN0eWxlLCBmaXJzdC0+ZGF0YSArIDgpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBkaWFsb2ctPnN0eWxlLCBmaXJzdC0+ZGF0YSArIDEyKTsKLSAgICAgIG9mZiA9IDE2OwotICAgIH0KLQotICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRpYWxvZy0+eCwgZmlyc3QtPmRhdGEgKyBvZmYgKyAyKTsKLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBkaWFsb2ctPnksIGZpcnN0LT5kYXRhICsgb2ZmICsgNCk7Ci0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGlhbG9nLT53aWR0aCwgZmlyc3QtPmRhdGEgKyBvZmYgKyA2KTsKLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBkaWFsb2ctPmhlaWdodCwgZmlyc3QtPmRhdGEgKyBvZmYgKyA4KTsKLQotICBwcCA9ICZmaXJzdC0+bmV4dDsKLQotICAqcHAgPSByZXNpZF90b19iaW4gKGRpYWxvZy0+bWVudSwgYmlnX2VuZGlhbik7Ci0gIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotICAqcHAgPSByZXNpZF90b19iaW4gKGRpYWxvZy0+Y2xhc3MsIGJpZ19lbmRpYW4pOwotICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLSAgcHAgPSAmKCpwcCktPm5leHQ7Ci0KLSAgKnBwID0gdW5pY29kZV90b19iaW4gKGRpYWxvZy0+Y2FwdGlvbiwgYmlnX2VuZGlhbik7Ci0gIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotICBpZiAoKGRpYWxvZy0+c3R5bGUgJiBEU19TRVRGT05UKSAhPSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gZGlhbG9nZXggPyA2IDogMjsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoZC0+bGVuZ3RoKTsKLQotICAgICAgbGVuZ3RoICs9IGQtPmxlbmd0aDsKLQotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBkaWFsb2ctPnBvaW50c2l6ZSwgZC0+ZGF0YSk7Ci0KLSAgICAgIGlmIChkaWFsb2dleCkKLQl7Ci0JICBpZiAoZGlhbG9nLT5leCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBkLT5kYXRhICsgMik7Ci0JICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBkLT5kYXRhICsgNCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGlhbG9nLT5leC0+d2VpZ2h0LCBkLT5kYXRhICsgMik7Ci0JICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBkaWFsb2ctPmV4LT5pdGFsaWMsIGQtPmRhdGEgKyA0KTsKLQkgICAgfQotCX0KLQotICAgICAgKnBwID0gZDsKLSAgICAgIHBwID0gJmQtPm5leHQ7Ci0KLSAgICAgICpwcCA9IHVuaWNvZGVfdG9fYmluIChkaWFsb2ctPmZvbnQsIGJpZ19lbmRpYW4pOwotICAgICAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0gICAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLSAgICB9Ci0KLSAgYyA9IDA7Ci0gIGZvciAoZGMgPSBkaWFsb2ctPmNvbnRyb2xzOyBkYyAhPSBOVUxMOyBkYyA9IGRjLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICpkOwotICAgICAgaW50IGRjb2ZmOwotCi0gICAgICArK2M7Ci0KLSAgICAgIGR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IGRpYWxvZ2V4ID8gMjQgOiAxODsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoZC0+bGVuZ3RoKTsKLQotICAgICAgbGVuZ3RoICs9IGQtPmxlbmd0aDsKLQotICAgICAgaWYgKCEgZGlhbG9nZXgpCi0JewotCSAgcHV0XzMyIChiaWdfZW5kaWFuLCBkYy0+c3R5bGUsIGQtPmRhdGEpOwotCSAgcHV0XzMyIChiaWdfZW5kaWFuLCBkYy0+ZXhzdHlsZSwgZC0+ZGF0YSArIDQpOwotCSAgZGNvZmYgPSA4OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRjLT5oZWxwLCBkLT5kYXRhKTsKLQkgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGMtPmV4c3R5bGUsIGQtPmRhdGEgKyA0KTsKLQkgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGMtPnN0eWxlLCBkLT5kYXRhICsgOCk7Ci0JICBkY29mZiA9IDEyOwotCX0KLQotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBkYy0+eCwgZC0+ZGF0YSArIGRjb2ZmKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGMtPnksIGQtPmRhdGEgKyBkY29mZiArIDIpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBkYy0+d2lkdGgsIGQtPmRhdGEgKyBkY29mZiArIDQpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBkYy0+aGVpZ2h0LCBkLT5kYXRhICsgZGNvZmYgKyA2KTsKLQotICAgICAgaWYgKGRpYWxvZ2V4KQotICAgICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRjLT5pZCwgZC0+ZGF0YSArIGRjb2ZmICsgOCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGMtPmlkLCBkLT5kYXRhICsgZGNvZmYgKyA4KTsKLQotICAgICAgKnBwID0gZDsKLSAgICAgIHBwID0gJmQtPm5leHQ7Ci0KLSAgICAgICpwcCA9IHJlc2lkX3RvX2JpbiAoZGMtPmNsYXNzLCBiaWdfZW5kaWFuKTsKLSAgICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotICAgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0KLSAgICAgICpwcCA9IHJlc2lkX3RvX2JpbiAoZGMtPnRleHQsIGJpZ19lbmRpYW4pOwotICAgICAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0gICAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDI7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDIpOwotCi0gICAgICBsZW5ndGggKz0gMjsKLQotICAgICAgZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLQotICAgICAgaWYgKGRjLT5kYXRhID09IE5VTEwpCi0JcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBkLT5kYXRhKTsKLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHN1YmxlbjsKLQotCSAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCi0JICAqcHAgPSByZXNfdG9fYmluX3JjZGF0YSAoZGMtPmRhdGEsIGJpZ19lbmRpYW4pOwotCSAgc3VibGVuID0gMDsKLQkgIHdoaWxlICgqcHAgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHN1YmxlbiArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotCSAgICB9Ci0KLQkgIHB1dF8xNiAoYmlnX2VuZGlhbiwgc3VibGVuLCBkLT5kYXRhKTsKLQotCSAgbGVuZ3RoICs9IHN1YmxlbjsKLQl9Ci0gICAgfQotICBwdXRfMTYgKGJpZ19lbmRpYW4sIGMsIGZpcnN0LT5kYXRhICsgb2ZmKTsKLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYSBmb250ZGlyIHJlc291cmNlIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX2ZvbnRkaXIgKGZvbnRkaXJzLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgZm9udGRpciAqZm9udGRpcnM7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7Ci0gIGludCBjOwotICBjb25zdCBzdHJ1Y3QgZm9udGRpciAqZmQ7Ci0KLSAgZmlyc3QgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZmlyc3QpOwotICBmaXJzdC0+bGVuZ3RoID0gMjsKLSAgZmlyc3QtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoMik7Ci0KLSAgZmlyc3QtPm5leHQgPSBOVUxMOwotICBwcCA9ICZmaXJzdC0+bmV4dDsKLQotICBjID0gMDsKLSAgZm9yIChmZCA9IGZvbnRkaXJzOyBmZCAhPSBOVUxMOyBmZCA9IGZkLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gICAgICArK2M7Ci0KLSAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gICAgICBkLT5sZW5ndGggPSAyOwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICgyKTsKLQotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBmZC0+aW5kZXgsIGQtPmRhdGEpOwotCi0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IGZkLT5sZW5ndGg7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgZmQtPmRhdGE7Ci0KLSAgICAgIGQtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gZDsKLSAgICAgIHBwID0gJmQtPm5leHQ7ICAgICAgCi0gICAgfQotCi0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgYywgZmlyc3QtPmRhdGEpOwotCi0gIHJldHVybiBmaXJzdDsgIAotfQotCi0vKiBDb252ZXJ0IGEgZ3JvdXAgaWNvbiByZXNvdXJjZSB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9ncm91cF9pY29uIChncm91cF9pY29ucywgYmlnX2VuZGlhbikKLSAgICAgY29uc3Qgc3RydWN0IGdyb3VwX2ljb24gKmdyb3VwX2ljb25zOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICBpbnQgYzsKLSAgY29uc3Qgc3RydWN0IGdyb3VwX2ljb24gKmdpOwotCi0gIGZpcnN0ID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmZpcnN0KTsKLSAgZmlyc3QtPmxlbmd0aCA9IDY7Ci0gIGZpcnN0LT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDYpOwotCi0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZmlyc3QtPmRhdGEpOwotICBwdXRfMTYgKGJpZ19lbmRpYW4sIDEsIGZpcnN0LT5kYXRhICsgMik7Ci0KLSAgZmlyc3QtPm5leHQgPSBOVUxMOwotICBwcCA9ICZmaXJzdC0+bmV4dDsKLQotICBjID0gMDsKLSAgZm9yIChnaSA9IGdyb3VwX2ljb25zOyBnaSAhPSBOVUxMOyBnaSA9IGdpLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gICAgICArK2M7Ci0KLSAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gICAgICBkLT5sZW5ndGggPSAxNDsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoMTQpOwotCi0gICAgICBkLT5kYXRhWzBdID0gZ2ktPndpZHRoOwotICAgICAgZC0+ZGF0YVsxXSA9IGdpLT5oZWlnaHQ7Ci0gICAgICBkLT5kYXRhWzJdID0gZ2ktPmNvbG9yczsKLSAgICAgIGQtPmRhdGFbM10gPSAwOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBnaS0+cGxhbmVzLCBkLT5kYXRhICsgNCk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGdpLT5iaXRzLCBkLT5kYXRhICsgNik7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGdpLT5ieXRlcywgZC0+ZGF0YSArIDgpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBnaS0+aW5kZXgsIGQtPmRhdGEgKyAxMik7Ci0KLSAgICAgIGQtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gZDsKLSAgICAgIHBwID0gJmQtPm5leHQ7Ci0gICAgfQotCi0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgYywgZmlyc3QtPmRhdGEgKyA0KTsKLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYSBtZW51IHJlc291cmNlIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX21lbnUgKG1lbnUsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBtZW51ICptZW51OwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgaW50IG1lbnVleDsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgbWVudWV4ID0gZXh0ZW5kZWRfbWVudSAobWVudSk7Ci0KLSAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgZC0+bGVuZ3RoID0gbWVudWV4ID8gOCA6IDQ7Ci0gIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoZC0+bGVuZ3RoKTsKLQotICBpZiAoISBtZW51ZXgpCi0gICAgewotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBkLT5kYXRhKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSArIDIpOwotCi0gICAgICBkLT5uZXh0ID0gcmVzX3RvX2Jpbl9tZW51aXRlbXMgKG1lbnUtPml0ZW1zLCBiaWdfZW5kaWFuKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDEsIGQtPmRhdGEpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCA0LCBkLT5kYXRhICsgMik7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIG1lbnUtPmhlbHAsIGQtPmRhdGEgKyA0KTsKLQotICAgICAgZC0+bmV4dCA9IHJlc190b19iaW5fbWVudWV4aXRlbXMgKG1lbnUtPml0ZW1zLCBiaWdfZW5kaWFuKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGQ7Ci19Ci0KLS8qIENvbnZlcnQgbWVudSBpdGVtcyB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9tZW51aXRlbXMgKGl0ZW1zLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKml0ZW1zOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKm1pOwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgZm9yIChtaSA9IGl0ZW1zOyBtaSAhPSBOVUxMOyBtaSA9IG1pLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICpkOwotICAgICAgaW50IGZsYWdzOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gbWktPnBvcHVwID09IE5VTEwgPyA0IDogMjsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoZC0+bGVuZ3RoKTsKLQotICAgICAgZmxhZ3MgPSBtaS0+dHlwZTsKLSAgICAgIGlmIChtaS0+bmV4dCA9PSBOVUxMKQotCWZsYWdzIHw9IE1FTlVJVEVNX0VORE1FTlU7Ci0gICAgICBpZiAobWktPnBvcHVwICE9IE5VTEwpCi0JZmxhZ3MgfD0gTUVOVUlURU1fUE9QVVA7Ci0KLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZmxhZ3MsIGQtPmRhdGEpOwotCi0gICAgICBpZiAobWktPnBvcHVwID09IE5VTEwpCi0JcHV0XzE2IChiaWdfZW5kaWFuLCBtaS0+aWQsIGQtPmRhdGEgKyAyKTsKLQotICAgICAgKnBwID0gZDsKLSAgICAgIHBwID0gJmQtPm5leHQ7Ci0KLSAgICAgICpwcCA9IHVuaWNvZGVfdG9fYmluIChtaS0+dGV4dCwgYmlnX2VuZGlhbik7Ci0gICAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotICAgICAgaWYgKG1pLT5wb3B1cCAhPSBOVUxMKQotCXsKLQkgICpwcCA9IHJlc190b19iaW5fbWVudWl0ZW1zIChtaS0+cG9wdXAsIGJpZ19lbmRpYW4pOwotCSAgd2hpbGUgKCpwcCAhPSBOVUxMKQotCSAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBmaXJzdDsKLX0KLQotLyogQ29udmVydCBtZW51ZXggaXRlbXMgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fbWVudWV4aXRlbXMgKGl0ZW1zLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKml0ZW1zOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgY29uc3Qgc3RydWN0IG1lbnVpdGVtICptaTsKLQotICBmaXJzdCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0OwotCi0gIGxlbmd0aCA9IDA7Ci0KLSAgZm9yIChtaSA9IGl0ZW1zOyBtaSAhPSBOVUxMOyBtaSA9IG1pLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICpkOwotICAgICAgaW50IGZsYWdzOwotCi0gICAgICBkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0KLSAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gICAgICBkLT5sZW5ndGggPSAxMjsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoMTIpOwotCi0gICAgICBsZW5ndGggKz0gMTI7Ci0KLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgbWktPnR5cGUsIGQtPmRhdGEpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBtaS0+c3RhdGUsIGQtPmRhdGEgKyA0KTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgbWktPmlkLCBkLT5kYXRhICsgOCk7Ci0KLSAgICAgIGZsYWdzID0gMDsKLSAgICAgIGlmIChtaS0+bmV4dCA9PSBOVUxMKQotCWZsYWdzIHw9IDB4ODA7Ci0gICAgICBpZiAobWktPnBvcHVwICE9IE5VTEwpCi0JZmxhZ3MgfD0gMTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZmxhZ3MsIGQtPmRhdGEgKyAxMCk7Ci0KLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OwotCi0gICAgICAqcHAgPSB1bmljb2RlX3RvX2JpbiAobWktPnRleHQsIGJpZ19lbmRpYW4pOwotICAgICAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0gICAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotICAgICAgaWYgKG1pLT5wb3B1cCAhPSBOVUxMKQotCXsKLQkgIGR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKLQotCSAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLQkgIGQtPmxlbmd0aCA9IDQ7Ci0JICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDQpOwotCi0JICBwdXRfMzIgKGJpZ19lbmRpYW4sIG1pLT5oZWxwLCBkLT5kYXRhKTsKLQotCSAgKnBwID0gZDsKLQkgIHBwID0gJmQtPm5leHQ7Ci0KLQkgICpwcCA9IHJlc190b19iaW5fbWVudWV4aXRlbXMgKG1pLT5wb3B1cCwgYmlnX2VuZGlhbik7Ci0JICB3aGlsZSAoKnBwICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZpcnN0OwotfQotCi0vKiBDb252ZXJ0IGFuIHJjZGF0YSByZXNvdXJjZSB0byBiaW5hcnkuICBUaGlzIGlzIGFsc28gdXNlZCB0byBjb252ZXJ0Ci0gICBvdGhlciBpbmZvcm1hdGlvbiB3aGljaCBoYXBwZW5zIHRvIGJlIHN0b3JlZCBpbiByY2RhdGFfaXRlbSBsaXN0cwotICAgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fcmNkYXRhIChpdGVtcywgYmlnX2VuZGlhbikKLSAgICAgY29uc3Qgc3RydWN0IHJjZGF0YV9pdGVtICppdGVtczsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKLSAgY29uc3Qgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLQotICBmaXJzdCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0OwotCi0gIGZvciAocmkgPSBpdGVtczsgcmkgIT0gTlVMTDsgcmkgPSByaS0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLQotICAgICAgc3dpdGNoIChyaS0+dHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCi0JY2FzZSBSQ0RBVEFfV09SRDoKLQkgIGQtPmxlbmd0aCA9IDI7Ci0JICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDIpOwotCSAgcHV0XzE2IChiaWdfZW5kaWFuLCByaS0+dS53b3JkLCBkLT5kYXRhKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSQ0RBVEFfRFdPUkQ6Ci0JICBkLT5sZW5ndGggPSA0OwotCSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg0KTsKLQkgIHB1dF8zMiAoYmlnX2VuZGlhbiwgcmktPnUuZHdvcmQsIGQtPmRhdGEpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJDREFUQV9TVFJJTkc6Ci0JICBkLT5sZW5ndGggPSByaS0+dS5zdHJpbmcubGVuZ3RoOwotCSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJpLT51LnN0cmluZy5zOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJDREFUQV9XU1RSSU5HOgotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIGk7Ci0KLQkgICAgZC0+bGVuZ3RoID0gcmktPnUud3N0cmluZy5sZW5ndGggKiAyOwotCSAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGQtPmxlbmd0aCk7Ci0JICAgIGZvciAoaSA9IDA7IGkgPCByaS0+dS53c3RyaW5nLmxlbmd0aDsgaSsrKQotCSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgcmktPnUud3N0cmluZy53W2ldLCBkLT5kYXRhICsgaSAqIDIpOwotCSAgICBicmVhazsKLQkgIH0KLQotCWNhc2UgUkNEQVRBX0JVRkZFUjoKLQkgIGQtPmxlbmd0aCA9IHJpLT51LmJ1ZmZlci5sZW5ndGg7Ci0JICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmktPnUuYnVmZmVyLmRhdGE7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGQtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gZDsKLSAgICAgIHBwID0gJmQtPm5leHQ7Ci0gICAgfQotCi0gIHJldHVybiBmaXJzdDsKLX0KLQotLyogQ29udmVydCBhIHN0cmluZ3RhYmxlIHJlc291cmNlIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX3N0cmluZ3RhYmxlIChzdCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3Qgc3RydWN0IHN0cmluZ3RhYmxlICpzdDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKLSAgaW50IGk7Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgc2xlbiwgajsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICpkOwotICAgICAgdW5pY2hhciAqczsKLQotICAgICAgc2xlbiA9IHN0LT5zdHJpbmdzW2ldLmxlbmd0aDsKLSAgICAgIHMgPSBzdC0+c3RyaW5nc1tpXS5zdHJpbmc7Ci0KLSAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gICAgICBkLT5sZW5ndGggPSAyICsgc2xlbiAqIDI7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGQtPmxlbmd0aCk7Ci0KLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgc2xlbiwgZC0+ZGF0YSk7Ci0KLSAgICAgIGZvciAoaiA9IDA7IGogPCBzbGVuOyBqKyspCi0JcHV0XzE2IChiaWdfZW5kaWFuLCBzW2pdLCBkLT5kYXRhICsgMiArIGogKiAyKTsKLQotICAgICAgZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsgICAgICAKLSAgICB9Ci0KLSAgcmV0dXJuIGZpcnN0OwotfQotCi0vKiBDb252ZXJ0IGFuIEFTQ0lJIHN0cmluZyB0byBhIHVuaWNvZGUgYmluYXJ5IHN0cmluZy4gIFRoaXMgYWx3YXlzCi0gICByZXR1cm5zIGV4YWN0bHkgb25lIGJpbmRhdGEgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXN0cmluZ190b191bmljb2RlX2JpbiAocywgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgY2hhciAqczsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHNpemVfdCBsZW4sIGk7Ci0gIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gIGxlbiA9IHN0cmxlbiAocyk7Ci0KLSAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgZC0+bGVuZ3RoID0gbGVuICogMiArIDI7Ci0gIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoZC0+bGVuZ3RoKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgcHV0XzE2IChiaWdfZW5kaWFuLCBzW2ldLCBkLT5kYXRhICsgaSAqIDIpOwotICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEgKyBpICogMik7Ci0KLSAgZC0+bmV4dCA9IE5VTEw7Ci0KLSAgcmV0dXJuIGQ7ICAKLX0KLQotLyogQ29udmVydCBhIHZlcnNpb25pbmZvIHJlc291cmNlIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX3ZlcnNpb25pbmZvICh2ZXJzaW9uaW5mbywgYmlnX2VuZGlhbikKLSAgICAgY29uc3Qgc3RydWN0IHZlcnNpb25pbmZvICp2ZXJzaW9uaW5mbzsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKLSAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIHN0cnVjdCB2ZXJfaW5mbyAqdmk7Ci0KLSAgZmlyc3QgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZmlyc3QpOwotICBmaXJzdC0+bGVuZ3RoID0gNjsKLSAgZmlyc3QtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNik7Ci0KLSAgbGVuZ3RoID0gNjsKLQotICBpZiAodmVyc2lvbmluZm8tPmZpeGVkID09IE5VTEwpCi0gICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBmaXJzdC0+ZGF0YSArIDIpOwotICBlbHNlCi0gICAgcHV0XzE2IChiaWdfZW5kaWFuLCA1MiwgZmlyc3QtPmRhdGEgKyAyKTsKLQotICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGZpcnN0LT5kYXRhICsgNCk7Ci0KLSAgcHAgPSAmZmlyc3QtPm5leHQ7Ci0KLSAgKnBwID0gc3RyaW5nX3RvX3VuaWNvZGVfYmluICgiVlNfVkVSU0lPTl9JTkZPIiwgYmlnX2VuZGlhbik7Ci0gIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotICBkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0KLSAgaWYgKHZlcnNpb25pbmZvLT5maXhlZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbyAqZmk7Ci0gICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDUyOwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg1Mik7Ci0KLSAgICAgIGxlbmd0aCArPSA1MjsKLQotICAgICAgZmkgPSB2ZXJzaW9uaW5mby0+Zml4ZWQ7Ci0KLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgMHhmZWVmMDRiZCwgZC0+ZGF0YSk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIDB4MTAwMDAsIGQtPmRhdGEgKyA0KTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfdmVyc2lvbl9tcywgZC0+ZGF0YSArIDgpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+ZmlsZV92ZXJzaW9uX2xzLCBkLT5kYXRhICsgMTIpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+cHJvZHVjdF92ZXJzaW9uX21zLCBkLT5kYXRhICsgMTYpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+cHJvZHVjdF92ZXJzaW9uX2xzLCBkLT5kYXRhICsgMjApOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+ZmlsZV9mbGFnc19tYXNrLCBkLT5kYXRhICsgMjQpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+ZmlsZV9mbGFncywgZC0+ZGF0YSArIDI4KTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfb3MsIGQtPmRhdGEgKyAzMik7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5maWxlX3R5cGUsIGQtPmRhdGEgKyAzNik7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5maWxlX3N1YnR5cGUsIGQtPmRhdGEgKyA0MCk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5maWxlX2RhdGVfbXMsIGQtPmRhdGEgKyA0NCk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5maWxlX2RhdGVfbHMsIGQtPmRhdGEgKyA0OCk7Ci0KLSAgICAgIGQtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gZDsKLSAgICAgIHBwID0gJmQtPm5leHQ7Ci0gICAgfQotCi0gIGZvciAodmkgPSB2ZXJzaW9uaW5mby0+dmFyOyB2aSAhPSBOVUxMOyB2aSA9IHZpLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICp2aWQ7Ci0gICAgICB1bnNpZ25lZCBsb25nIHZpbGVuOwotCi0gICAgICBkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0KLSAgICAgIHZpZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICp2aWQpOwotICAgICAgdmlkLT5sZW5ndGggPSA2OwotICAgICAgdmlkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDYpOwotCi0gICAgICBsZW5ndGggKz0gNjsKLSAgICAgIHZpbGVuID0gNjsKLQotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCB2aWQtPmRhdGEgKyAyKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgdmlkLT5kYXRhICsgNCk7Ci0KLSAgICAgICpwcCA9IHZpZDsKLSAgICAgIHBwID0gJnZpZC0+bmV4dDsKLQotICAgICAgc3dpdGNoICh2aS0+dHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCi0JY2FzZSBWRVJJTkZPX1NUUklORzoKLQkgIHsKLQkgICAgdW5zaWduZWQgbG9uZyBob2xkLCB2c2xlbjsKLQkgICAgc3RydWN0IGJpbmRhdGEgKnZzZDsKLQkgICAgY29uc3Qgc3RydWN0IHZlcl9zdHJpbmdpbmZvICp2czsKLQotCSAgICAqcHAgPSBzdHJpbmdfdG9fdW5pY29kZV9iaW4gKCJTdHJpbmdGaWxlSW5mbyIsIGJpZ19lbmRpYW4pOwotCSAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgdmlsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0KLQkgICAgaG9sZCA9IGxlbmd0aDsKLQkgICAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCSAgICB2aWxlbiArPSBsZW5ndGggLSBob2xkOwotCi0JICAgIHZzZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICp2c2QpOwotCSAgICB2c2QtPmxlbmd0aCA9IDY7Ci0JICAgIHZzZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg2KTsKLQotCSAgICBsZW5ndGggKz0gNjsKLQkgICAgdmlsZW4gKz0gNjsKLQkgICAgdnNsZW4gPSA2OwotCi0JICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgdnNkLT5kYXRhICsgMik7Ci0JICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgdnNkLT5kYXRhICsgNCk7Ci0KLQkgICAgKnBwID0gdnNkOwotCSAgICBwcCA9ICZ2c2QtPm5leHQ7Ci0KLQkgICAgKnBwID0gdW5pY29kZV90b19iaW4gKHZpLT51LnN0cmluZy5sYW5ndWFnZSwgYmlnX2VuZGlhbik7Ci0JICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICB2aWxlbiArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICB2c2xlbiArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotCSAgICBmb3IgKHZzID0gdmktPnUuc3RyaW5nLnN0cmluZ3M7IHZzICE9IE5VTEw7IHZzID0gdnMtPm5leHQpCi0JICAgICAgewotCQlzdHJ1Y3QgYmluZGF0YSAqdnNzZDsKLQkJdW5zaWduZWQgbG9uZyB2c3NsZW47Ci0KLQkJaG9sZCA9IGxlbmd0aDsKLQkJZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCQl2aWxlbiArPSBsZW5ndGggLSBob2xkOwotCQl2c2xlbiArPSBsZW5ndGggLSBob2xkOwotCi0JCXZzc2QgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqdnNzZCk7Ci0JCXZzc2QtPmxlbmd0aCA9IDY7Ci0JCXZzc2QtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNik7Ci0KLQkJbGVuZ3RoICs9IDY7Ci0JCXZpbGVuICs9IDY7Ci0JCXZzbGVuICs9IDY7Ci0JCXZzc2xlbiA9IDY7Ci0KLQkJcHV0XzE2IChiaWdfZW5kaWFuLCAxLCB2c3NkLT5kYXRhICsgNCk7Ci0KLQkJKnBwID0gdnNzZDsKLQkJcHAgPSAmdnNzZC0+bmV4dDsKLQotCQkqcHAgPSB1bmljb2RlX3RvX2JpbiAodnMtPmtleSwgYmlnX2VuZGlhbik7Ci0JCWxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotCQl2aWxlbiArPSAoKnBwKS0+bGVuZ3RoOwotCQl2c2xlbiArPSAoKnBwKS0+bGVuZ3RoOwotCQl2c3NsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkJcHAgPSAmKCpwcCktPm5leHQ7Ci0KLQkJaG9sZCA9IGxlbmd0aDsKLQkJZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCQl2aWxlbiArPSBsZW5ndGggLSBob2xkOwotCQl2c2xlbiArPSBsZW5ndGggLSBob2xkOwotCQl2c3NsZW4gKz0gbGVuZ3RoIC0gaG9sZDsKLQotCQkqcHAgPSB1bmljb2RlX3RvX2JpbiAodnMtPnZhbHVlLCBiaWdfZW5kaWFuKTsKLSAJCXB1dF8xNiAoYmlnX2VuZGlhbiwgKCpwcCktPmxlbmd0aCAvIDIsIHZzc2QtPmRhdGEgKyAyKTsKLQkJbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0JCXZpbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JCXZzbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JCXZzc2xlbiArPSAoKnBwKS0+bGVuZ3RoOwotCQlwcCA9ICYoKnBwKS0+bmV4dDsKLQotCQlwdXRfMTYgKGJpZ19lbmRpYW4sIHZzc2xlbiwgdnNzZC0+ZGF0YSk7Ci0JICAgICAgfQotCi0JICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgdnNsZW4sIHZzZC0+ZGF0YSk7Ci0KLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQljYXNlIFZFUklORk9fVkFSOgotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIGhvbGQsIHZ2bGVuLCB2dnZsZW47Ci0JICAgIHN0cnVjdCBiaW5kYXRhICp2dmQ7Ci0JICAgIGNvbnN0IHN0cnVjdCB2ZXJfdmFyaW5mbyAqdnY7Ci0KLQkgICAgKnBwID0gc3RyaW5nX3RvX3VuaWNvZGVfYmluICgiVmFyRmlsZUluZm8iLCBiaWdfZW5kaWFuKTsKLQkgICAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgIHZpbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgIHBwID0gJigqcHApLT5uZXh0OwotCi0JICAgIGhvbGQgPSBsZW5ndGg7Ci0JICAgIGR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKLQkgICAgdmlsZW4gKz0gbGVuZ3RoIC0gaG9sZDsKLQotCSAgICB2dmQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqdnZkKTsKLQkgICAgdnZkLT5sZW5ndGggPSA2OwotCSAgICB2dmQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNik7Ci0KLQkgICAgbGVuZ3RoICs9IDY7Ci0JICAgIHZpbGVuICs9IDY7Ci0JICAgIHZ2bGVuID0gNjsKLQotCSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIHZ2ZC0+ZGF0YSArIDQpOwotCi0JICAgICpwcCA9IHZ2ZDsKLQkgICAgcHAgPSAmdnZkLT5uZXh0OwotCi0JICAgICpwcCA9IHVuaWNvZGVfdG9fYmluICh2aS0+dS52YXIua2V5LCBiaWdfZW5kaWFuKTsKLQkgICAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgIHZpbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgIHZ2bGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgIHBwID0gJigqcHApLT5uZXh0OwotCi0JICAgIGhvbGQgPSBsZW5ndGg7Ci0JICAgIGR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKLQkgICAgdmlsZW4gKz0gbGVuZ3RoIC0gaG9sZDsKLQkgICAgdnZsZW4gKz0gbGVuZ3RoIC0gaG9sZDsKLQotCSAgICB2dnZsZW4gPSAwOwotCi0JICAgIGZvciAodnYgPSB2aS0+dS52YXIudmFyOyB2diAhPSBOVUxMOyB2diA9IHZ2LT5uZXh0KQotCSAgICAgIHsKLQkJc3RydWN0IGJpbmRhdGEgKnZ2c2Q7Ci0KLQkJdnZzZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICp2dnNkKTsKLQkJdnZzZC0+bGVuZ3RoID0gNDsKLQkJdnZzZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg0KTsKLQotCQlsZW5ndGggKz0gNDsKLQkJdmlsZW4gKz0gNDsKLQkJdnZsZW4gKz0gNDsKLQkJdnZ2bGVuICs9IDQ7Ci0KLQkJcHV0XzE2IChiaWdfZW5kaWFuLCB2di0+bGFuZ3VhZ2UsIHZ2c2QtPmRhdGEpOwotCQlwdXRfMTYgKGJpZ19lbmRpYW4sIHZ2LT5jaGFyc2V0LCB2dnNkLT5kYXRhICsgMik7Ci0KLQkJdnZzZC0+bmV4dCA9IE5VTEw7Ci0JCSpwcCA9IHZ2c2Q7Ci0JCXBwID0gJnZ2c2QtPm5leHQ7Ci0JICAgICAgfQotCi0JICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgdnZsZW4sIHZ2ZC0+ZGF0YSk7Ci0JICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgdnZ2bGVuLCB2dmQtPmRhdGEgKyAyKTsKLQotCSAgICBicmVhazsKLQkgIH0KLQl9Ci0KLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgdmlsZW4sIHZpZC0+ZGF0YSk7Ci0gICAgfQotCi0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgbGVuZ3RoLCBmaXJzdC0+ZGF0YSk7Ci0KLSAgcmV0dXJuIGZpcnN0OwotfQotCi0vKiBDb252ZXJ0IGEgZ2VuZXJpYyByZXNvdXJjZSB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9nZW5lcmljIChsZW5ndGgsIGRhdGEpCi0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICBkLT5sZW5ndGggPSBsZW5ndGg7Ci0gIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSBkYXRhOwotCi0gIGQtPm5leHQgPSBOVUxMOwotCi0gIHJldHVybiBkOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcmVzY29mZi5jIGIvYmludXRpbHMvcmVzY29mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTI0ODdhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Jlc2NvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDc4MSArMCwwIEBACi0vKiByZXNjb2ZmLmMgLS0gcmVhZCBhbmQgd3JpdGUgcmVzb3VyY2VzIGluIFdpbmRvd3MgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9uIHRoYXQgcmVhZCBhbmQgd3JpdGUgV2luZG93cyByZXNvdXJjZXMKLSAgIGluIENPRkYgZmlsZXMuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAid2luZHJlcy5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLS8qIEluIG9yZGVyIHRvIHVzZSB0aGUgYWRkcmVzcyBvZiBhIHJlc291cmNlIGRhdGEgZW50cnksIHdlIG5lZWQgdG8KLSAgIGdldCB0aGUgaW1hZ2UgYmFzZSBvZiB0aGUgZmlsZS4gIFJpZ2h0IG5vdyB3ZSBleHRyYWN0IGl0IGZyb20KLSAgIGludGVybmFsIEJGRCBpbmZvcm1hdGlvbi4gIEZJWE1FLiAgKi8KLQotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLS8qIEluZm9ybWF0aW9uIHdlIGV4dHJhY3QgZnJvbSB0aGUgZmlsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2ZpbGVfaW5mbwotewotICAvKiBGaWxlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgLyogRGF0YSByZWFkIGZyb20gdGhlIGZpbGUuICAqLwotICBjb25zdCBiZmRfYnl0ZSAqZGF0YTsKLSAgLyogRW5kIG9mIGRhdGEgcmVhZCBmcm9tIGZpbGUuICAqLwotICBjb25zdCBiZmRfYnl0ZSAqZGF0YV9lbmQ7Ci0gIC8qIEFkZHJlc3Mgb2YgdGhlIHJlc291cmNlIHNlY3Rpb24gbWludXMgdGhlIGltYWdlIGJhc2Ugb2YgdGhlIGZpbGUuICAqLwotICBiZmRfdm1hIHNlY2FkZHI7Ci0gIC8qIE5vbi16ZXJvIGlmIHRoZSBmaWxlIGlzIGJpZyBlbmRpYW4uICAqLwotICBpbnQgYmlnX2VuZGlhbjsKLX07Ci0KLS8qIEEgcmVzb3VyY2UgZGlyZWN0b3J5IHRhYmxlIGluIGEgQ09GRiBmaWxlLiAgKi8KLQotc3RydWN0IGV4dGVybl9yZXNfZGlyZWN0b3J5Ci17Ci0gIC8qIENoYXJhY3RlcmlzdGljcy4gICovCi0gIGJmZF9ieXRlIGNoYXJhY3RlcmlzdGljc1s0XTsKLSAgLyogVGltZSBzdGFtcC4gICovCi0gIGJmZF9ieXRlIHRpbWVbNF07Ci0gIC8qIE1ham9yIHZlcnNpb24gbnVtYmVyLiAgKi8KLSAgYmZkX2J5dGUgbWFqb3JbMl07Ci0gIC8qIE1pbm9yIHZlcnNpb24gbnVtYmVyLiAgKi8KLSAgYmZkX2J5dGUgbWlub3JbMl07Ci0gIC8qIE51bWJlciBvZiBuYW1lZCBkaXJlY3RvcnkgZW50cmllcy4gICovCi0gIGJmZF9ieXRlIG5hbWVfY291bnRbMl07Ci0gIC8qIE51bWJlciBvZiBkaXJlY3RvcnkgZW50cmllcyB3aXRoIElEcy4gICovCi0gIGJmZF9ieXRlIGlkX2NvdW50WzJdOwotfTsKLQotLyogQSByZXNvdXJjZSBkaXJlY3RvcnkgZW50cnkgaW4gYSBDT0ZGIGZpbGUuICAqLwotCi1zdHJ1Y3QgZXh0ZXJuX3Jlc19lbnRyeQotewotICAvKiBOYW1lIG9yIElELiAgKi8KLSAgYmZkX2J5dGUgbmFtZVs0XTsKLSAgLyogQWRkcmVzcyBvZiByZXNvdXJjZSBlbnRyeSBvciBzdWJkaXJlY3RvcnkuICAqLwotICBiZmRfYnl0ZSBydmFbNF07Ci19OwotCi0vKiBBIHJlc291cmNlIGRhdGEgZW50cnkgaW4gYSBDT0ZGIGZpbGUuICAqLwotCi1zdHJ1Y3QgZXh0ZXJuX3Jlc19kYXRhCi17Ci0gIC8qIEFkZHJlc3Mgb2YgcmVzb3VyY2UgZGF0YS4gIFRoaXMgaXMgYXBwYXJlbnRseSBhIGZpbGUgcmVsYXRpdmUKLSAgICAgYWRkcmVzcywgcmF0aGVyIHRoYW4gYSBzZWN0aW9uIG9mZnNldC4gICovCi0gIGJmZF9ieXRlIHJ2YVs0XTsKLSAgLyogU2l6ZSBvZiByZXNvdXJjZSBkYXRhLiAgKi8KLSAgYmZkX2J5dGUgc2l6ZVs0XTsKLSAgLyogQ29kZSBwYWdlLiAgKi8KLSAgYmZkX2J5dGUgY29kZXBhZ2VbNF07Ci0gIC8qIFJlc2VydmVkLiAgKi8KLSAgYmZkX2J5dGUgcmVzZXJ2ZWRbNF07Ci19OwotCi0vKiBNYWNyb3MgdG8gc3dhcCBpbiB2YWx1ZXMuICAqLwotCi0jZGVmaW5lIGdldGZpXzE2KGZpLCBzKSAoKGZpKS0+YmlnX2VuZGlhbiA/IGJmZF9nZXRiMTYgKHMpIDogYmZkX2dldGwxNiAocykpCi0jZGVmaW5lIGdldGZpXzMyKGZpLCBzKSAoKGZpKS0+YmlnX2VuZGlhbiA/IGJmZF9nZXRiMzIgKHMpIDogYmZkX2dldGwzMiAocykpCi0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkIG92ZXJydW4gUEFSQU1TICgoY29uc3Qgc3RydWN0IGNvZmZfZmlsZV9pbmZvICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZWFkX2NvZmZfcmVzX2RpcgotICBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqLCBjb25zdCBzdHJ1Y3QgY29mZl9maWxlX2luZm8gKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGludCkpOwotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlYWRfY29mZl9kYXRhX2VudHJ5Ci0gIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICosIGNvbnN0IHN0cnVjdCBjb2ZmX2ZpbGVfaW5mbyAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKikpOwotDAotLyogUmVhZCB0aGUgcmVzb3VyY2VzIGluIGEgQ09GRiBmaWxlLiAgKi8KLQotc3RydWN0IHJlc19kaXJlY3RvcnkgKgotcmVhZF9jb2ZmX3JzcmMgKGZpbGVuYW1lLCB0YXJnZXQpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICp0YXJnZXQ7Ci17Ci0gIGJmZCAqYWJmZDsKLSAgY2hhciAqKm1hdGNoaW5nOwotICBhc2VjdGlvbiAqc2VjOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGJmZF9ieXRlICpkYXRhOwotICBzdHJ1Y3QgY29mZl9maWxlX2luZm8gZmluZm87Ci0KLSAgaWYgKGZpbGVuYW1lID09IE5VTEwpCi0gICAgZmF0YWwgKF8oImZpbGVuYW1lIHJlcXVpcmVkIGZvciBDT0ZGIGlucHV0IikpOwotCi0gIGFiZmQgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoZmlsZW5hbWUpOwotCi0gIGlmICghIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotCi0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJzcmMiKTsKLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiBubyByZXNvdXJjZSBzZWN0aW9uXG4iKSwgcHJvZ3JhbV9uYW1lLAotCSAgICAgICBmaWxlbmFtZSk7Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotCi0gIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpOwotICBkYXRhID0gKGJmZF9ieXRlICopIHJlc19hbGxvYyAoc2l6ZSk7Ci0KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGRhdGEsIDAsIHNpemUpKQotICAgIGJmZF9mYXRhbCAoXygiY2FuJ3QgcmVhZCByZXNvdXJjZSBzZWN0aW9uIikpOwotCi0gIGZpbmZvLmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIGZpbmZvLmRhdGEgPSBkYXRhOwotICBmaW5mby5kYXRhX2VuZCA9IGRhdGEgKyBzaXplOwotICBmaW5mby5zZWNhZGRyID0gKGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykKLQkJICAgLSBwZV9kYXRhIChhYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZSk7Ci0gIGZpbmZvLmJpZ19lbmRpYW4gPSBiZmRfYmlnX2VuZGlhbiAoYWJmZCk7Ci0KLSAgYmZkX2Nsb3NlIChhYmZkKTsKLQotICAvKiBOb3cganVzdCByZWFkIGluIHRoZSB0b3AgbGV2ZWwgcmVzb3VyY2UgZGlyZWN0b3J5LiAgTm90ZSB0aGF0IHdlCi0gICAgIGRvbid0IGZyZWUgZGF0YSwgc2luY2Ugd2UgY3JlYXRlIHJlc291cmNlIGVudHJpZXMgdGhhdCBwb2ludCBpbnRvCi0gICAgIGl0LiAgSWYgd2UgZXZlciB3YW50IHRvIGZyZWUgdXAgdGhlIHJlc291cmNlIGluZm9ybWF0aW9uIHdlIHJlYWQsCi0gICAgIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGNsZWFuZWQgdXAuICAqLwotCi0gIHJldHVybiByZWFkX2NvZmZfcmVzX2RpciAoZGF0YSwgJmZpbmZvLCAoY29uc3Qgc3RydWN0IHJlc19pZCAqKSBOVUxMLCAwKTsKLX0KLQotLyogR2l2ZSBhbiBlcnJvciBpZiB3ZSBhcmUgb3V0IG9mIGJvdW5kcy4gICovCi0KLXN0YXRpYyB2b2lkCi1vdmVycnVuIChmaW5mbywgbXNnKQotICAgICBjb25zdCBzdHJ1Y3QgY29mZl9maWxlX2luZm8gKmZpbmZvOwotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGZhdGFsIChfKCIlczogJXM6IGFkZHJlc3Mgb3V0IG9mIGJvdW5kcyIpLCBmaW5mby0+ZmlsZW5hbWUsIG1zZyk7Ci19Ci0KLS8qIFJlYWQgYSByZXNvdXJjZSBkaXJlY3RvcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKgotcmVhZF9jb2ZmX3Jlc19kaXIgKGRhdGEsIGZpbmZvLCB0eXBlLCBsZXZlbCkKLSAgICAgY29uc3QgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGNvbnN0IHN0cnVjdCBjb2ZmX2ZpbGVfaW5mbyAqZmluZm87Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci0gICAgIGludCBsZXZlbDsKLXsKLSAgY29uc3Qgc3RydWN0IGV4dGVybl9yZXNfZGlyZWN0b3J5ICplcmQ7Ci0gIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZDsKLSAgaW50IG5hbWVfY291bnQsIGlkX2NvdW50LCBpOwotICBzdHJ1Y3QgcmVzX2VudHJ5ICoqcHA7Ci0gIGNvbnN0IHN0cnVjdCBleHRlcm5fcmVzX2VudHJ5ICplcmU7Ci0KLSAgaWYgKChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBkYXRhKSA8IHNpemVvZiAoc3RydWN0IGV4dGVybl9yZXNfZGlyZWN0b3J5KSkKLSAgICBvdmVycnVuIChmaW5mbywgXygiZGlyZWN0b3J5IikpOwotCi0gIGVyZCA9IChjb25zdCBzdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkgKikgZGF0YTsKLQotICByZCA9IChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcmQpOwotICByZC0+Y2hhcmFjdGVyaXN0aWNzID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmQtPmNoYXJhY3RlcmlzdGljcyk7Ci0gIHJkLT50aW1lID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmQtPnRpbWUpOwotICByZC0+bWFqb3IgPSBnZXRmaV8xNiAoZmluZm8sIGVyZC0+bWFqb3IpOwotICByZC0+bWlub3IgPSBnZXRmaV8xNiAoZmluZm8sIGVyZC0+bWlub3IpOwotICByZC0+ZW50cmllcyA9IE5VTEw7Ci0KLSAgbmFtZV9jb3VudCA9IGdldGZpXzE2IChmaW5mbywgZXJkLT5uYW1lX2NvdW50KTsKLSAgaWRfY291bnQgPSBnZXRmaV8xNiAoZmluZm8sIGVyZC0+aWRfY291bnQpOwotCi0gIHBwID0gJnJkLT5lbnRyaWVzOwotCi0gIC8qIFRoZSByZXNvdXJjZSBkaXJlY3RvcnkgZW50cmllcyBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIGRpcmVjdG9yeQotICAgICB0YWJsZS4gICovCi0gIGVyZSA9IChjb25zdCBzdHJ1Y3QgZXh0ZXJuX3Jlc19lbnRyeSAqKSAoZXJkICsgMSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG5hbWVfY291bnQ7IGkrKywgZXJlKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBuYW1lLCBydmE7Ci0gICAgICBzdHJ1Y3QgcmVzX2VudHJ5ICpyZTsKLSAgICAgIGNvbnN0IGJmZF9ieXRlICplcnM7Ci0gICAgICBpbnQgbGVuZ3RoLCBqOwotCi0gICAgICBpZiAoKGNvbnN0IGJmZF9ieXRlICopIGVyZSA+PSBmaW5mby0+ZGF0YV9lbmQpCi0Jb3ZlcnJ1biAoZmluZm8sIF8oIm5hbWVkIGRpcmVjdG9yeSBlbnRyeSIpKTsKLQotICAgICAgbmFtZSA9IGdldGZpXzMyIChmaW5mbywgZXJlLT5uYW1lKTsKLSAgICAgIHJ2YSA9IGdldGZpXzMyIChmaW5mbywgZXJlLT5ydmEpOwotCi0gICAgICAvKiBGb3Igc29tZSByZWFzb24gdGhlIGhpZ2ggYml0IGluIE5BTUUgaXMgc2V0LiAgKi8KLSAgICAgIG5hbWUgJj1+IDB4ODAwMDAwMDA7Ci0KLSAgICAgIGlmIChuYW1lID4gKHNpemVfdCkgKGZpbmZvLT5kYXRhX2VuZCAtIGZpbmZvLT5kYXRhKSkKLQlvdmVycnVuIChmaW5mbywgXygiZGlyZWN0b3J5IGVudHJ5IG5hbWUiKSk7Ci0KLSAgICAgIGVycyA9IGZpbmZvLT5kYXRhICsgbmFtZTsKLQotICAgICAgcmUgPSAoc3RydWN0IHJlc19lbnRyeSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcmUpOwotICAgICAgcmUtPm5leHQgPSBOVUxMOwotICAgICAgcmUtPmlkLm5hbWVkID0gMTsKLSAgICAgIGxlbmd0aCA9IGdldGZpXzE2IChmaW5mbywgZXJzKTsKLSAgICAgIHJlLT5pZC51Lm4ubGVuZ3RoID0gbGVuZ3RoOwotICAgICAgcmUtPmlkLnUubi5uYW1lID0gKHVuaWNoYXIgKikgcmVzX2FsbG9jIChsZW5ndGggKiBzaXplb2YgKHVuaWNoYXIpKTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGg7IGorKykKLQlyZS0+aWQudS5uLm5hbWVbal0gPSBnZXRmaV8xNiAoZmluZm8sIGVycyArIGogKiAyICsgMik7Ci0KLSAgICAgIGlmIChsZXZlbCA9PSAwKQotCXR5cGUgPSAmcmUtPmlkOwotCi0gICAgICBpZiAoKHJ2YSAmIDB4ODAwMDAwMDApICE9IDApCi0JewotCSAgcnZhICY9fiAweDgwMDAwMDAwOwotCSAgaWYgKHJ2YSA+PSAoc2l6ZV90KSAoZmluZm8tPmRhdGFfZW5kIC0gZmluZm8tPmRhdGEpKQotCSAgICBvdmVycnVuIChmaW5mbywgXygibmFtZWQgc3ViZGlyZWN0b3J5IikpOwotCSAgcmUtPnN1YmRpciA9IDE7Ci0JICByZS0+dS5kaXIgPSByZWFkX2NvZmZfcmVzX2RpciAoZmluZm8tPmRhdGEgKyBydmEsIGZpbmZvLCB0eXBlLAotCQkJCQkgbGV2ZWwgKyAxKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHJ2YSA+PSAoc2l6ZV90KSAoZmluZm8tPmRhdGFfZW5kIC0gZmluZm8tPmRhdGEpKQotCSAgICBvdmVycnVuIChmaW5mbywgXygibmFtZWQgcmVzb3VyY2UiKSk7Ci0JICByZS0+c3ViZGlyID0gMDsKLQkgIHJlLT51LnJlcyA9IHJlYWRfY29mZl9kYXRhX2VudHJ5IChmaW5mby0+ZGF0YSArIHJ2YSwgZmluZm8sIHR5cGUpOwotCX0KLQotICAgICAgKnBwID0gcmU7Ci0gICAgICBwcCA9ICZyZS0+bmV4dDsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IGlkX2NvdW50OyBpKyssIGVyZSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbmFtZSwgcnZhOwotICAgICAgc3RydWN0IHJlc19lbnRyeSAqcmU7Ci0KLSAgICAgIGlmICgoY29uc3QgYmZkX2J5dGUgKikgZXJlID49IGZpbmZvLT5kYXRhX2VuZCkKLQlvdmVycnVuIChmaW5mbywgXygiSUQgZGlyZWN0b3J5IGVudHJ5IikpOwotCi0gICAgICBuYW1lID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmUtPm5hbWUpOwotICAgICAgcnZhID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmUtPnJ2YSk7Ci0KLSAgICAgIHJlID0gKHN0cnVjdCByZXNfZW50cnkgKikgcmVzX2FsbG9jIChzaXplb2YgKnJlKTsKLSAgICAgIHJlLT5uZXh0ID0gTlVMTDsKLSAgICAgIHJlLT5pZC5uYW1lZCA9IDA7Ci0gICAgICByZS0+aWQudS5pZCA9IG5hbWU7Ci0KLSAgICAgIGlmIChsZXZlbCA9PSAwKQotCXR5cGUgPSAmcmUtPmlkOwotCi0gICAgICBpZiAoKHJ2YSAmIDB4ODAwMDAwMDApICE9IDApCi0JewotCSAgcnZhICY9fiAweDgwMDAwMDAwOwotCSAgaWYgKHJ2YSA+PSAoc2l6ZV90KSAoZmluZm8tPmRhdGFfZW5kIC0gZmluZm8tPmRhdGEpKQotCSAgICBvdmVycnVuIChmaW5mbywgXygiSUQgc3ViZGlyZWN0b3J5IikpOwotCSAgcmUtPnN1YmRpciA9IDE7Ci0JICByZS0+dS5kaXIgPSByZWFkX2NvZmZfcmVzX2RpciAoZmluZm8tPmRhdGEgKyBydmEsIGZpbmZvLCB0eXBlLAotCQkJCQkgbGV2ZWwgKyAxKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHJ2YSA+PSAoc2l6ZV90KSAoZmluZm8tPmRhdGFfZW5kIC0gZmluZm8tPmRhdGEpKQotCSAgICBvdmVycnVuIChmaW5mbywgXygiSUQgcmVzb3VyY2UiKSk7Ci0JICByZS0+c3ViZGlyID0gMDsKLQkgIHJlLT51LnJlcyA9IHJlYWRfY29mZl9kYXRhX2VudHJ5IChmaW5mby0+ZGF0YSArIHJ2YSwgZmluZm8sIHR5cGUpOwotCX0KLQotICAgICAgKnBwID0gcmU7Ci0gICAgICBwcCA9ICZyZS0+bmV4dDsKLSAgICB9Ci0KLSAgcmV0dXJuIHJkOwotfQotCi0vKiBSZWFkIGEgcmVzb3VyY2UgZGF0YSBlbnRyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICoKLXJlYWRfY29mZl9kYXRhX2VudHJ5IChkYXRhLCBmaW5mbywgdHlwZSkKLSAgICAgY29uc3QgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGNvbnN0IHN0cnVjdCBjb2ZmX2ZpbGVfaW5mbyAqZmluZm87Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci17Ci0gIGNvbnN0IHN0cnVjdCBleHRlcm5fcmVzX2RhdGEgKmVyZDsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLSAgdW5zaWduZWQgbG9uZyBzaXplLCBydmE7Ci0gIGNvbnN0IGJmZF9ieXRlICpyZXNkYXRhOwotCi0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgZmF0YWwgKF8oInJlc291cmNlIHR5cGUgdW5rbm93biIpKTsKLQotICBpZiAoKHNpemVfdCkgKGZpbmZvLT5kYXRhX2VuZCAtIGRhdGEpIDwgc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuX3Jlc19kYXRhKSkKLSAgICBvdmVycnVuIChmaW5mbywgXygiZGF0YSBlbnRyeSIpKTsKLQotICBlcmQgPSAoY29uc3Qgc3RydWN0IGV4dGVybl9yZXNfZGF0YSAqKSBkYXRhOwotCi0gIHNpemUgPSBnZXRmaV8zMiAoZmluZm8sIGVyZC0+c2l6ZSk7Ci0gIHJ2YSA9IGdldGZpXzMyIChmaW5mbywgZXJkLT5ydmEpOwotICBpZiAocnZhIDwgZmluZm8tPnNlY2FkZHIKLSAgICAgIHx8IHJ2YSAtIGZpbmZvLT5zZWNhZGRyID49IChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBmaW5mby0+ZGF0YSkpCi0gICAgb3ZlcnJ1biAoZmluZm8sIF8oInJlc291cmNlIGRhdGEiKSk7Ci0KLSAgcmVzZGF0YSA9IGZpbmZvLT5kYXRhICsgKHJ2YSAtIGZpbmZvLT5zZWNhZGRyKTsKLQotICBpZiAoc2l6ZSA+IChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSByZXNkYXRhKSkKLSAgICBvdmVycnVuIChmaW5mbywgXygicmVzb3VyY2UgZGF0YSBzaXplIikpOwotCi0gIHIgPSBiaW5fdG9fcmVzICgqdHlwZSwgcmVzZGF0YSwgc2l6ZSwgZmluZm8tPmJpZ19lbmRpYW4pOwotCi0gIG1lbXNldCAoJnItPnJlc19pbmZvLCAwLCBzaXplb2YgKHN0cnVjdCByZXNfcmVzX2luZm8pKTsKLSAgci0+Y29mZl9pbmZvLmNvZGVwYWdlID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmQtPmNvZGVwYWdlKTsKLSAgci0+Y29mZl9pbmZvLnJlc2VydmVkID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmQtPnJlc2VydmVkKTsKLQotICByZXR1cm4gcjsKLX0KLQwKLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gYnVpbGQgYSBsaXN0IG9mIGJpbmRhdGEgc3RydWN0dXJlcy4gICovCi0KLXN0cnVjdCBiaW5kYXRhX2J1aWxkCi17Ci0gIC8qIFRoZSBkYXRhLiAgKi8KLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0gIC8qIFRoZSBsYXN0IHN0cnVjdHVyZSB3ZSBoYXZlIGFkZGVkIHRvIHRoZSBsaXN0LiAgKi8KLSAgc3RydWN0IGJpbmRhdGEgKmxhc3Q7Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSBsaXN0IGFzIGEgd2hvbGUuICAqLwotICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGtlZXBzIHRyYWNrIG9mIGluZm9ybWF0aW9uIGFzIHdlIGJ1aWxkIHRoZSBkaXJlY3RvcnkKLSAgIHRyZWUuICAqLwotCi1zdHJ1Y3QgY29mZl93cml0ZV9pbmZvCi17Ci0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgYmFzZWQgb24gdGhlIEJGRC4gICovCi0gIC8qIFRoZSBCRkQgaXRzZWxmLiAgKi8KLSAgYmZkICphYmZkOwotICAvKiBOb24temVybyBpZiB0aGUgZmlsZSBpcyBiaWcgZW5kaWFuLiAgKi8KLSAgaW50IGJpZ19lbmRpYW47Ci0gIC8qIFBvaW50ZXIgdG8gc2VjdGlvbiBzeW1ib2wgdXNlZCB0byBidWlsZCBSVkEgcmVsb2NzLiAgKi8KLSAgYXN5bWJvbCAqKnN5bXBwOwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgY29tcHV0ZWQgaW5pdGlhbGx5LCBhbmQgdGhlbiBub3QgY2hhbmdlZC4gICovCi0gIC8qIExlbmd0aCBvZiBkaXJlY3RvcnkgdGFibGVzIGFuZCBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBkaXJzaXplOwotICAvKiBMZW5ndGggb2YgZGlyZWN0b3J5IGVudHJ5IHN0cmluZ3MuICAqLwotICB1bnNpZ25lZCBsb25nIGRpcnN0cnNpemU7Ci0gIC8qIExlbmd0aCBvZiByZXNvdXJjZSBkYXRhIGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBsb25nIGRhdGFlbnRzaXplOwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgdXBkYXRlZCBhcyB3ZSBhZGQgZGF0YS4gICovCi0gIC8qIERpcmVjdG9yeSB0YWJsZXMgYW5kIGVudHJpZXMuICAqLwotICBzdHJ1Y3QgYmluZGF0YV9idWlsZCBkaXJzOwotICAvKiBEaXJlY3RvcnkgZW50cnkgc3RyaW5ncy4gICovCi0gIHN0cnVjdCBiaW5kYXRhX2J1aWxkIGRpcnN0cnM7Ci0gIC8qIFJlc291cmNlIGRhdGEgZW50cmllcy4gICovCi0gIHN0cnVjdCBiaW5kYXRhX2J1aWxkIGRhdGFlbnRzOwotICAvKiBBY3R1YWwgcmVzb3VyY2UgZGF0YS4gICovCi0gIHN0cnVjdCBiaW5kYXRhX2J1aWxkIHJlc291cmNlczsKLSAgLyogUmVsb2NhdGlvbnMuICAqLwotICBhcmVsZW50ICoqcmVsb2NzOwotICAvKiBOdW1iZXIgb2YgcmVsb2NhdGlvbnMuICAqLwotICB1bnNpZ25lZCBpbnQgcmVsb2NfY291bnQ7Ci19OwotCi0vKiBNYWNyb3MgdG8gc3dhcCBvdXQgdmFsdWVzLiAgKi8KLQotI2RlZmluZSBwdXRjd2lfMTYoY3dpLCB2LCBzKSBcCi0gICgoY3dpLT5iaWdfZW5kaWFuKSA/IGJmZF9wdXRiMTYgKCh2KSwgKHMpKSA6IGJmZF9wdXRsMTYgKCh2KSwgKHMpKSkKLSNkZWZpbmUgcHV0Y3dpXzMyKGN3aSwgdiwgcykgXAotICAoKGN3aS0+YmlnX2VuZGlhbikgPyBiZmRfcHV0YjMyICgodiksIChzKSkgOiBiZmRfcHV0bDMyICgodiksIChzKSkpCi0KLXN0YXRpYyB2b2lkIGNvZmZfYmluX3NpemVzCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICosIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gKikpOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKmNvZmZfYWxsb2MgUEFSQU1TICgoc3RydWN0IGJpbmRhdGFfYnVpbGQgKiwgc2l6ZV90KSk7Ci1zdGF0aWMgdm9pZCBjb2ZmX3RvX2JpbgotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqLCBzdHJ1Y3QgY29mZl93cml0ZV9pbmZvICopKTsKLXN0YXRpYyB2b2lkIGNvZmZfcmVzX3RvX2JpbgotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICosIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gKikpOwotCi0vKiBXcml0ZSByZXNvdXJjZXMgdG8gYSBDT0ZGIGZpbGUuICBSRVNPVVJDRVMgc2hvdWxkIGFscmVhZHkgYmUKLSAgIHNvcnRlZC4KLQotICAgUmlnaHQgbm93IHdlIGFsd2F5cyBjcmVhdGUgYSBuZXcgZmlsZS4gIFNvbWVkYXkgd2Ugc2hvdWxkIGFsc28KLSAgIG9mZmVyIHRoZSBhYmlsaXR5IHRvIG1lcmdlIHJlc291cmNlcyBpbnRvIGFuIGV4aXN0aW5nIGZpbGUuICBUaGlzCi0gICB3b3VsZCByZXF1aXJlIGRvaW5nIHRoZSBiYXNpYyB3b3JrIG9mIG9iamNvcHksIGp1c3QgbW9kaWZ5aW5nIG9yCi0gICBhZGRpbmcgdGhlIC5yc3JjIHNlY3Rpb24uICAqLwotCi12b2lkCi13cml0ZV9jb2ZmX2ZpbGUgKGZpbGVuYW1lLCB0YXJnZXQsIHJlc291cmNlcykKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRhcmdldDsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc291cmNlczsKLXsKLSAgYmZkICphYmZkOwotICBhc2VjdGlvbiAqc2VjOwotICBzdHJ1Y3QgY29mZl93cml0ZV9pbmZvIGN3aTsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoLCBvZmZzZXQ7Ci0KLSAgaWYgKGZpbGVuYW1lID09IE5VTEwpCi0gICAgZmF0YWwgKF8oImZpbGVuYW1lIHJlcXVpcmVkIGZvciBDT0ZGIG91dHB1dCIpKTsKLQotICBhYmZkID0gYmZkX29wZW53IChmaWxlbmFtZSwgdGFyZ2V0KTsKLSAgaWYgKGFiZmQgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGZpbGVuYW1lKTsKLQotICBpZiAoISBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkpCi0gICAgYmZkX2ZhdGFsICgiYmZkX3NldF9mb3JtYXQiKTsKLQotI2lmZGVmIERMTFRPT0xfQVJNCi0gIGlmICghIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9hcm0sIDApKQotICAgIGJmZF9mYXRhbCAoImJmZF9zZXRfYXJjaF9tYWNoKGFybSkiKTsKLSNlbHNlCi0gIC8qIEZJWE1FOiBUaGlzIGlzIG9idmlvdXNseSBpMzg2IHNwZWNpZmljLiAgKi8KLSAgaWYgKCEgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2kzODYsIDApKQotICAgIGJmZF9mYXRhbCAoImJmZF9zZXRfYXJjaF9tYWNoKGkzODYpIik7Ci0jZW5kaWYgLyogYXJtICovCi0KLSAgaWYgKCEgYmZkX3NldF9maWxlX2ZsYWdzIChhYmZkLCBIQVNfU1lNUyB8IEhBU19SRUxPQykpCi0gICAgYmZkX2ZhdGFsICgiYmZkX3NldF9maWxlX2ZsYWdzIik7Ci0KLSAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5yc3JjIik7Ci0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKCJiZmRfbWFrZV9zZWN0aW9uIik7Ci0KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsCi0JCQkgICAgICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MKLQkJCQl8IFNFQ19MT0FEIHwgU0VDX0RBVEEpKSkKLSAgICBiZmRfZmF0YWwgKCJiZmRfc2V0X3NlY3Rpb25fZmxhZ3MiKTsKLQotICBpZiAoISBiZmRfc2V0X3N5bXRhYiAoYWJmZCwgc2VjLT5zeW1ib2xfcHRyX3B0ciwgMSkpCi0gICAgYmZkX2ZhdGFsICgiYmZkX3NldF9zeW10YWIiKTsKLQotICAvKiBSZXF1aXJpbmcgdGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBCRkQuICAqLwotICBzZWMtPm91dHB1dF9zZWN0aW9uID0gc2VjOwotCi0gIC8qIFRoZSBvcmRlciBvZiBkYXRhIGluIHRoZSAucnNyYyBzZWN0aW9uIGlzCi0gICAgICAgcmVzb3VyY2UgZGlyZWN0b3J5IHRhYmxlcyBhbmQgZW50cmllcwotICAgICAgIHJlc291cmNlIGRpcmVjdG9yeSBzdHJpbmdzCi0gICAgICAgcmVzb3VyY2UgZGF0YSBlbnRyaWVzCi0gICAgICAgYWN0dWFsIHJlc291cmNlIGRhdGEKLQotICAgICBXZSBidWlsZCB0aGVzZSBkaWZmZXJlbnQgdHlwZXMgb2YgZGF0YSBpbiBkaWZmZXJlbnQgbGlzdHMuICAqLwotCi0gIGN3aS5hYmZkID0gYWJmZDsKLSAgY3dpLmJpZ19lbmRpYW4gPSBiZmRfYmlnX2VuZGlhbiAoYWJmZCk7Ci0gIGN3aS5zeW1wcCA9IHNlYy0+c3ltYm9sX3B0cl9wdHI7Ci0gIGN3aS5kaXJzaXplID0gMDsKLSAgY3dpLmRpcnN0cnNpemUgPSAwOwotICBjd2kuZGF0YWVudHNpemUgPSAwOwotICBjd2kuZGlycy5kID0gTlVMTDsKLSAgY3dpLmRpcnMubGFzdCA9IE5VTEw7Ci0gIGN3aS5kaXJzLmxlbmd0aCA9IDA7Ci0gIGN3aS5kaXJzdHJzLmQgPSBOVUxMOwotICBjd2kuZGlyc3Rycy5sYXN0ID0gTlVMTDsKLSAgY3dpLmRpcnN0cnMubGVuZ3RoID0gMDsKLSAgY3dpLmRhdGFlbnRzLmQgPSBOVUxMOwotICBjd2kuZGF0YWVudHMubGFzdCA9IE5VTEw7Ci0gIGN3aS5kYXRhZW50cy5sZW5ndGggPSAwOwotICBjd2kucmVzb3VyY2VzLmQgPSBOVUxMOwotICBjd2kucmVzb3VyY2VzLmxhc3QgPSBOVUxMOwotICBjd2kucmVzb3VyY2VzLmxlbmd0aCA9IDA7Ci0gIGN3aS5yZWxvY3MgPSBOVUxMOwotICBjd2kucmVsb2NfY291bnQgPSAwOwotCi0gIC8qIFdvcmsgb3V0IHRoZSBzaXplcyBvZiB0aGUgcmVzb3VyY2UgZGlyZWN0b3J5IGVudHJpZXMsIHNvIHRoYXQgd2UKLSAgICAga25vdyB0aGUgdmFyaW91cyBvZmZzZXRzIHdlIHdpbGwgbmVlZC4gICovCi0gIGNvZmZfYmluX3NpemVzIChyZXNvdXJjZXMsICZjd2kpOwotCi0gIC8qIEZvcmNlIHRoZSBkaXJlY3Rvcnkgc3RyaW5ncyB0byBiZSAzMiBiaXQgYWxpZ25lZC4gIEV2ZXJ5IG90aGVyCi0gICAgIHN0cnVjdHVyZSBpcyAzMiBiaXQgYWxpZ25lZCBhbnlob3cuICAqLwotICBjd2kuZGlyc3Ryc2l6ZSA9IChjd2kuZGlyc3Ryc2l6ZSArIDMpICZ+IDM7Ci0KLSAgLyogQWN0dWFsbHkgY29udmVydCB0aGUgcmVzb3VyY2VzIHRvIGJpbmFyeS4gICovCi0gIGNvZmZfdG9fYmluIChyZXNvdXJjZXMsICZjd2kpOwotCi0gIC8qIEFkZCBhbm90aGVyIDIgYnl0ZXMgdG8gdGhlIGRpcmVjdG9yeSBzdHJpbmdzIGlmIG5lZWRlZCBmb3IKLSAgICAgYWxpZ25tZW50LiAgKi8KLSAgaWYgKChjd2kuZGlyc3Rycy5sZW5ndGggJiAzKSAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmV4OwotCi0gICAgICBleCA9IGNvZmZfYWxsb2MgKCZjd2kuZGlyc3RycywgMik7Ci0gICAgICBleFswXSA9IDA7Ci0gICAgICBleFsxXSA9IDA7Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBkYXRhIHdlIGJ1aWx0IGNhbWUgb3V0IHRvIHRoZSBzYW1lIHNpemUgYXMgd2UKLSAgICAgY2FsY3VsYXRlZCBpbml0aWFsbHkuICAqLwotICBhc3NlcnQgKGN3aS5kaXJzLmxlbmd0aCA9PSBjd2kuZGlyc2l6ZSk7Ci0gIGFzc2VydCAoY3dpLmRpcnN0cnMubGVuZ3RoID09IGN3aS5kaXJzdHJzaXplKTsKLSAgYXNzZXJ0IChjd2kuZGF0YWVudHMubGVuZ3RoID09IGN3aS5kYXRhZW50c2l6ZSk7Ci0KLSAgbGVuZ3RoID0gKGN3aS5kaXJzaXplCi0JICAgICsgY3dpLmRpcnN0cnNpemUKLQkgICAgKyBjd2kuZGF0YWVudHNpemUKLQkgICAgKyBjd2kucmVzb3VyY2VzLmxlbmd0aCk7Ci0KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYywgbGVuZ3RoKSkKLSAgICBiZmRfZmF0YWwgKCJiZmRfc2V0X3NlY3Rpb25fc2l6ZSIpOwotCi0gIGJmZF9zZXRfcmVsb2MgKGFiZmQsIHNlYywgY3dpLnJlbG9jcywgY3dpLnJlbG9jX2NvdW50KTsKLQotICBvZmZzZXQgPSAwOwotICBmb3IgKGQgPSBjd2kuZGlycy5kOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBkLT5kYXRhLCBvZmZzZXQsIGQtPmxlbmd0aCkpCi0JYmZkX2ZhdGFsICgiYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIik7Ci0gICAgICBvZmZzZXQgKz0gZC0+bGVuZ3RoOwotICAgIH0KLSAgZm9yIChkID0gY3dpLmRpcnN0cnMuZDsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZC0+ZGF0YSwgb2Zmc2V0LCBkLT5sZW5ndGgpKQotCWJmZF9mYXRhbCAoImJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyIpOwotICAgICAgb2Zmc2V0ICs9IGQtPmxlbmd0aDsKLSAgICB9Ci0gIGZvciAoZCA9IGN3aS5kYXRhZW50cy5kOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBkLT5kYXRhLCBvZmZzZXQsIGQtPmxlbmd0aCkpCi0JYmZkX2ZhdGFsICgiYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIik7Ci0gICAgICBvZmZzZXQgKz0gZC0+bGVuZ3RoOwotICAgIH0KLSAgZm9yIChkID0gY3dpLnJlc291cmNlcy5kOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBkLT5kYXRhLCBvZmZzZXQsIGQtPmxlbmd0aCkpCi0JYmZkX2ZhdGFsICgiYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIik7Ci0gICAgICBvZmZzZXQgKz0gZC0+bGVuZ3RoOwotICAgIH0KLQotICBhc3NlcnQgKG9mZnNldCA9PSBsZW5ndGgpOwotCi0gIGlmICghIGJmZF9jbG9zZSAoYWJmZCkpCi0gICAgYmZkX2ZhdGFsICgiYmZkX2Nsb3NlIik7Ci0KLSAgLyogV2UgYWxsb2NhdGVkIHRoZSByZWxvY3MgYXJyYXkgdXNpbmcgbWFsbG9jLiAgKi8KLSAgZnJlZSAoY3dpLnJlbG9jcyk7Ci19Ci0KLS8qIFdvcmsgb3V0IHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBmaXhlZCBzaXplIHJlc291cmNlIGRpcmVjdG9yeQotICAgZW50cmllcy4gIFRoaXMgdXBkYXRlcyBmaWVsZHMgaW4gQ1dJLiAgKi8KLQotc3RhdGljIHZvaWQKLWNvZmZfYmluX3NpemVzIChyZXNkaXIsIGN3aSkKLSAgICAgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc2RpcjsKLSAgICAgc3RydWN0IGNvZmZfd3JpdGVfaW5mbyAqY3dpOwotewotICBjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICpyZTsKLQotICBjd2ktPmRpcnNpemUgKz0gc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkpOwotCi0gIGZvciAocmUgPSByZXNkaXItPmVudHJpZXM7IHJlICE9IE5VTEw7IHJlID0gcmUtPm5leHQpCi0gICAgewotICAgICAgY3dpLT5kaXJzaXplICs9IHNpemVvZiAoc3RydWN0IGV4dGVybl9yZXNfZW50cnkpOwotCi0gICAgICBpZiAocmUtPmlkLm5hbWVkKQotCWN3aS0+ZGlyc3Ryc2l6ZSArPSByZS0+aWQudS5uLmxlbmd0aCAqIDIgKyAyOwotCi0gICAgICBpZiAocmUtPnN1YmRpcikKLQljb2ZmX2Jpbl9zaXplcyAocmUtPnUuZGlyLCBjd2kpOwotICAgICAgZWxzZQotCWN3aS0+ZGF0YWVudHNpemUgKz0gc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuX3Jlc19kYXRhKTsKLSAgICB9Ci19Ci0KLS8qIEFsbG9jYXRlIGRhdGEgZm9yIGEgcGFydGljdWxhciBsaXN0LiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotY29mZl9hbGxvYyAoYmIsIHNpemUpCi0gICAgIHN0cnVjdCBiaW5kYXRhX2J1aWxkICpiYjsKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0KLSAgZC0+bmV4dCA9IE5VTEw7Ci0gIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoc2l6ZSk7Ci0gIGQtPmxlbmd0aCA9IHNpemU7Ci0KLSAgaWYgKGJiLT5kID09IE5VTEwpCi0gICAgYmItPmQgPSBkOwotICBlbHNlCi0gICAgYmItPmxhc3QtPm5leHQgPSBkOwotICBiYi0+bGFzdCA9IGQ7Ci0gIGJiLT5sZW5ndGggKz0gc2l6ZTsKLQotICByZXR1cm4gZC0+ZGF0YTsKLX0KLQotLyogQ29udmVydCB0aGUgcmVzb3VyY2UgZGlyZWN0b3J5IFJFU0RJUiB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgdm9pZAotY29mZl90b19iaW4gKHJlc2RpciwgY3dpKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzZGlyOwotICAgICBzdHJ1Y3QgY29mZl93cml0ZV9pbmZvICpjd2k7Ci17Ci0gIHN0cnVjdCBleHRlcm5fcmVzX2RpcmVjdG9yeSAqZXJkOwotICBpbnQgY2ksIGNuOwotICBjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICplOwotICBzdHJ1Y3QgZXh0ZXJuX3Jlc19lbnRyeSAqZXJlOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZGlyZWN0b3J5IHRhYmxlLiAgKi8KLQotICBlcmQgPSAoKHN0cnVjdCBleHRlcm5fcmVzX2RpcmVjdG9yeSAqKQotCSBjb2ZmX2FsbG9jICgmY3dpLT5kaXJzLCBzaXplb2YgKCplcmQpKSk7Ci0KLSAgcHV0Y3dpXzMyIChjd2ksIHJlc2Rpci0+Y2hhcmFjdGVyaXN0aWNzLCBlcmQtPmNoYXJhY3RlcmlzdGljcyk7Ci0gIHB1dGN3aV8zMiAoY3dpLCByZXNkaXItPnRpbWUsIGVyZC0+dGltZSk7Ci0gIHB1dGN3aV8xNiAoY3dpLCByZXNkaXItPm1ham9yLCBlcmQtPm1ham9yKTsKLSAgcHV0Y3dpXzE2IChjd2ksIHJlc2Rpci0+bWlub3IsIGVyZC0+bWlub3IpOwotCi0gIGNpID0gMDsKLSAgY24gPSAwOwotICBmb3IgKGUgPSByZXNkaXItPmVudHJpZXM7IGUgIT0gTlVMTDsgZSA9IGUtPm5leHQpCi0gICAgewotICAgICAgaWYgKGUtPmlkLm5hbWVkKQotCSsrY247Ci0gICAgICBlbHNlCi0JKytjaTsKLSAgICB9Ci0KLSAgcHV0Y3dpXzE2IChjd2ksIGNuLCBlcmQtPm5hbWVfY291bnQpOwotICBwdXRjd2lfMTYgKGN3aSwgY2ksIGVyZC0+aWRfY291bnQpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZGF0YSBlbnRyaWVzLiAgTm90ZSB0aGF0IHdlIGFsbG9jYXRlIHNwYWNlIGZvciBhbGwKLSAgICAgdGhlIGVudHJpZXMgYmVmb3JlIHdyaXRpbmcgdGhlbSBvdXQuICBUaGF0IHBlcm1pdHMgYSByZWN1cnNpdmUKLSAgICAgY2FsbCB0byB3b3JrIGNvcnJlY3RseSB3aGVuIHdyaXRpbmcgb3V0IHN1YmRpcmVjdG9yaWVzLiAgKi8KLQotICBlcmUgPSAoKHN0cnVjdCBleHRlcm5fcmVzX2VudHJ5ICopCi0JIGNvZmZfYWxsb2MgKCZjd2ktPmRpcnMsIChjaSArIGNuKSAqIHNpemVvZiAoKmVyZSkpKTsKLSAgZm9yIChlID0gcmVzZGlyLT5lbnRyaWVzOyBlICE9IE5VTEw7IGUgPSBlLT5uZXh0LCBlcmUrKykKLSAgICB7Ci0gICAgICBpZiAoISBlLT5pZC5uYW1lZCkKLQlwdXRjd2lfMzIgKGN3aSwgZS0+aWQudS5pZCwgZXJlLT5uYW1lKTsKLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBjaGFyICpzdHI7Ci0JICBpbnQgaTsKLQotCSAgLyogRm9yIHNvbWUgcmVhc29uIGV4aXN0aW5nIGZpbGVzIHNlZW0gdG8gaGF2ZSB0aGUgaGlnaCBiaXQKLSAgICAgICAgICAgICBzZXQgb24gdGhlIGFkZHJlc3Mgb2YgdGhlIG5hbWUsIGFsdGhvdWdoIHRoYXQgaXMgbm90Ci0gICAgICAgICAgICAgZG9jdW1lbnRlZC4gICovCi0JICBwdXRjd2lfMzIgKGN3aSwKLQkJICAgICAweDgwMDAwMDAwIHwgKGN3aS0+ZGlyc2l6ZSArIGN3aS0+ZGlyc3Rycy5sZW5ndGgpLAotCQkgICAgIGVyZS0+bmFtZSk7Ci0KLQkgIHN0ciA9IGNvZmZfYWxsb2MgKCZjd2ktPmRpcnN0cnMsIGUtPmlkLnUubi5sZW5ndGggKiAyICsgMik7Ci0JICBwdXRjd2lfMTYgKGN3aSwgZS0+aWQudS5uLmxlbmd0aCwgc3RyKTsKLQkgIGZvciAoaSA9IDA7IGkgPCBlLT5pZC51Lm4ubGVuZ3RoOyBpKyspCi0JICAgIHB1dGN3aV8xNiAoY3dpLCBlLT5pZC51Lm4ubmFtZVtpXSwgc3RyICsgaSAqIDIgKyAyKTsKLQl9Ci0KLSAgICAgIGlmIChlLT5zdWJkaXIpCi0JewotCSAgcHV0Y3dpXzMyIChjd2ksIDB4ODAwMDAwMDAgfCBjd2ktPmRpcnMubGVuZ3RoLCBlcmUtPnJ2YSk7Ci0JICBjb2ZmX3RvX2JpbiAoZS0+dS5kaXIsIGN3aSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHB1dGN3aV8zMiAoY3dpLAotCQkgICAgIGN3aS0+ZGlyc2l6ZSArIGN3aS0+ZGlyc3Ryc2l6ZSArIGN3aS0+ZGF0YWVudHMubGVuZ3RoLAotCQkgICAgIGVyZS0+cnZhKTsKLQotCSAgY29mZl9yZXNfdG9fYmluIChlLT51LnJlcywgY3dpKTsKLQl9Ci0gICAgfQotfQotCi0vKiBDb252ZXJ0IHRoZSByZXNvdXJjZSBSRVMgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHZvaWQKLWNvZmZfcmVzX3RvX2JpbiAocmVzLCBjd2kpCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlczsKLSAgICAgc3RydWN0IGNvZmZfd3JpdGVfaW5mbyAqY3dpOwotewotICBhcmVsZW50ICpyOwotICBzdHJ1Y3QgZXh0ZXJuX3Jlc19kYXRhICplcmQ7Ci0gIHN0cnVjdCBiaW5kYXRhICpkOwotICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLQotICAvKiBGb3Igc29tZSByZWFzb24sIGFsdGhvdWdoIGV2ZXJ5IG90aGVyIGFkZHJlc3MgaXMgYSBzZWN0aW9uCi0gICAgIG9mZnNldCwgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlc291cmNlIGRhdGEgaXRzZWxmIGlzIGFuIFJWQS4gIFRoYXQKLSAgICAgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgcmVsb2NhdGlvbiBmb3IgaXQuICBXZSBhbGxvY2F0ZQotICAgICB0aGUgcmVsb2NzIGFycmF5IHVzaW5nIG1hbGxvYyBzbyB0aGF0IHdlIGNhbiB1c2UgcmVhbGxvYy4gIEZJWE1FOgotICAgICBUaGlzIHJlbG9jYXRpb24gaGFuZGxpbmcgaXMgY29ycmVjdCBmb3IgdGhlIGkzODYsIGJ1dCBwcm9iYWJseQotICAgICBub3QgZm9yIGFueSBvdGhlciB0YXJnZXQuICAqLwotCi0gIHIgPSAoYXJlbGVudCAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHItPnN5bV9wdHJfcHRyID0gY3dpLT5zeW1wcDsKLSAgci0+YWRkcmVzcyA9IGN3aS0+ZGlyc2l6ZSArIGN3aS0+ZGlyc3Ryc2l6ZSArIGN3aS0+ZGF0YWVudHMubGVuZ3RoOwotICByLT5hZGRlbmQgPSAwOwotICByLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoY3dpLT5hYmZkLCBCRkRfUkVMT0NfUlZBKTsKLSAgaWYgKHItPmhvd3RvID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChfKCJjYW4ndCBnZXQgQkZEX1JFTE9DX1JWQSByZWxvY2F0aW9uIHR5cGUiKSk7Ci0KLSAgY3dpLT5yZWxvY3MgPSB4cmVhbGxvYyAoY3dpLT5yZWxvY3MsCi0JCQkgIChjd2ktPnJlbG9jX2NvdW50ICsgMikgKiBzaXplb2YgKGFyZWxlbnQgKikpOwotICBjd2ktPnJlbG9jc1tjd2ktPnJlbG9jX2NvdW50XSA9IHI7Ci0gIGN3aS0+cmVsb2NzW2N3aS0+cmVsb2NfY291bnQgKyAxXSA9IE5VTEw7Ci0gICsrY3dpLT5yZWxvY19jb3VudDsKLQotICBlcmQgPSAoc3RydWN0IGV4dGVybl9yZXNfZGF0YSAqKSBjb2ZmX2FsbG9jICgmY3dpLT5kYXRhZW50cywgc2l6ZW9mICgqZXJkKSk7Ci0KLSAgcHV0Y3dpXzMyIChjd2ksCi0JICAgICAoY3dpLT5kaXJzaXplCi0JICAgICAgKyBjd2ktPmRpcnN0cnNpemUKLQkgICAgICArIGN3aS0+ZGF0YWVudHNpemUKLQkgICAgICArIGN3aS0+cmVzb3VyY2VzLmxlbmd0aCksCi0JICAgICBlcmQtPnJ2YSk7Ci0gIHB1dGN3aV8zMiAoY3dpLCByZXMtPmNvZmZfaW5mby5jb2RlcGFnZSwgZXJkLT5jb2RlcGFnZSk7Ci0gIHB1dGN3aV8zMiAoY3dpLCByZXMtPmNvZmZfaW5mby5yZXNlcnZlZCwgZXJkLT5yZXNlcnZlZCk7Ci0KLSAgZCA9IHJlc190b19iaW4gKHJlcywgY3dpLT5iaWdfZW5kaWFuKTsKLQotICBpZiAoY3dpLT5yZXNvdXJjZXMuZCA9PSBOVUxMKQotICAgIGN3aS0+cmVzb3VyY2VzLmQgPSBkOwotICBlbHNlCi0gICAgY3dpLT5yZXNvdXJjZXMubGFzdC0+bmV4dCA9IGQ7Ci0KLSAgbGVuZ3RoID0gMDsKLSAgZm9yICg7IGQtPm5leHQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCi0gICAgbGVuZ3RoICs9IGQtPmxlbmd0aDsKLSAgbGVuZ3RoICs9IGQtPmxlbmd0aDsKLSAgY3dpLT5yZXNvdXJjZXMubGFzdCA9IGQ7Ci0gIGN3aS0+cmVzb3VyY2VzLmxlbmd0aCArPSBsZW5ndGg7Ci0KLSAgcHV0Y3dpXzMyIChjd2ksIGxlbmd0aCwgZXJkLT5zaXplKTsKLQotICAvKiBGb3JjZSB0aGUgbmV4dCByZXNvdXJjZSB0byBoYXZlIDMyIGJpdCBhbGlnbm1lbnQuICAqLwotCi0gIGlmICgobGVuZ3RoICYgMykgIT0gMCkKLSAgICB7Ci0gICAgICBpbnQgYWRkOwotICAgICAgdW5zaWduZWQgY2hhciAqZXg7Ci0KLSAgICAgIGFkZCA9IDQgLSAobGVuZ3RoICYgMyk7Ci0KLSAgICAgIGV4ID0gY29mZl9hbGxvYyAoJmN3aS0+cmVzb3VyY2VzLCBhZGQpOwotICAgICAgbWVtc2V0IChleCwgMCwgYWRkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZXNyYy5jIGIvYmludXRpbHMvcmVzcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFjOWNjYS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZXNyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM2OCArMCwwIEBACi0vKiByZXNyYy5jIC0tIHJlYWQgYW5kIHdyaXRlIFdpbmRvd3MgcmMgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgdGhhdCByZWFkIGFuZCB3cml0ZSBXaW5kb3dzIHJjIGZpbGVzLgotICAgVGhlc2UgYXJlIHRleHQgZmlsZXMgdGhhdCByZXByZXNlbnQgcmVzb3VyY2VzLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgIndpbmRyZXMuaCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTjMyX18pCi0jZGVmaW5lIHBvcGVuIF9wb3BlbgotI2RlZmluZSBwY2xvc2UgX3BjbG9zZQotI2VuZGlmCi0KLS8qIFRoZSBkZWZhdWx0IHByZXByb2Nlc3Nvci4gICovCi0KLSNkZWZpbmUgREVGQVVMVF9QUkVQUk9DRVNTT1IgImdjYyAtRSAteGMtaGVhZGVyIC1EUkNfSU5WT0tFRCIKLQotLyogV2UgcmVhZCB0aGUgZGlyZWN0b3J5IGVudHJpZXMgaW4gYSBjdXJzb3Igb3IgaWNvbiBmaWxlIGludG8KLSAgIGluc3RhbmNlcyBvZiB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBpY29uZGlyCi17Ci0gIC8qIFdpZHRoIG9mIGltYWdlLiAgKi8KLSAgdW5zaWduZWQgY2hhciB3aWR0aDsKLSAgLyogSGVpZ2h0IG9mIGltYWdlLiAgKi8KLSAgdW5zaWduZWQgY2hhciBoZWlnaHQ7Ci0gIC8qIE51bWJlciBvZiBjb2xvcnMgaW4gaW1hZ2UuICAqLwotICB1bnNpZ25lZCBjaGFyIGNvbG9yY291bnQ7Ci0gIHVuaW9uCi0gIHsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICAvKiBDb2xvciBwbGFuZXMuICAqLwotICAgICAgdW5zaWduZWQgc2hvcnQgcGxhbmVzOwotICAgICAgLyogQml0cyBwZXIgcGl4ZWwuICAqLwotICAgICAgdW5zaWduZWQgc2hvcnQgYml0czsKLSAgICB9IGljb247Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgLyogWCBjb29yZGluYXRlIG9mIGhvdHNwb3QuICAqLwotICAgICAgdW5zaWduZWQgc2hvcnQgeGhvdHNwb3Q7Ci0gICAgICAvKiBZIGNvb3JkaW5hdGUgb2YgaG90c3BvdC4gICovCi0gICAgICB1bnNpZ25lZCBzaG9ydCB5aG90c3BvdDsKLSAgICB9IGN1cnNvcjsKLSAgfSB1OwotICAvKiBCeXRlcyBpbiBpbWFnZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgYnl0ZXM7Ci0gIC8qIEZpbGUgb2Zmc2V0IG9mIGltYWdlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci19OwotCi0vKiBUaGUgbmFtZSBvZiB0aGUgcmMgZmlsZSB3ZSBhcmUgcmVhZGluZy4gICovCi0KLWNoYXIgKnJjX2ZpbGVuYW1lOwotCi0vKiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIHJjIGZpbGUuICAqLwotCi1pbnQgcmNfbGluZW5vOwotCi0vKiBUaGUgcGlwZSB3ZSBhcmUgcmVhZGluZyBmcm9tLCBzbyB0aGF0IHdlIGNhbiBjbG9zZSBpdCBpZiB3ZSBleGl0LiAgKi8KLQotc3RhdGljIEZJTEUgKmNwcF9waXBlOwotCi0vKiBBcyB3ZSByZWFkIHRoZSByYyBmaWxlLCB3ZSBhdHRhY2ggaW5mb3JtYXRpb24gdG8gdGhpcyBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc291cmNlczsKLQotLyogVGhlIG51bWJlciBvZiBjdXJzb3IgcmVzb3VyY2VzIHdlIGhhdmUgd3JpdHRlbiBvdXQuICAqLwotCi1zdGF0aWMgaW50IGN1cnNvcnM7Ci0KLS8qIFRoZSBudW1iZXIgb2YgZm9udCByZXNvdXJjZXMgd2UgaGF2ZSB3cml0dGVuIG91dC4gICovCi0KLXN0YXRpYyBpbnQgZm9udHM7Ci0KLS8qIEZvbnQgZGlyZWN0b3J5IGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IGZvbnRkaXIgKmZvbnRkaXJzOwotCi0vKiBSZXNvdXJjZSBpbmZvIHRvIHVzZSBmb3IgZm9udGRpcnMuICAqLwotCi1zdHJ1Y3QgcmVzX3Jlc19pbmZvIGZvbnRkaXJzX3Jlc2luZm87Ci0KLS8qIFRoZSBudW1iZXIgb2YgaWNvbiByZXNvdXJjZXMgd2UgaGF2ZSB3cml0dGVuIG91dC4gICovCi0KLXN0YXRpYyBpbnQgaWNvbnM7Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkIGNsb3NlX3BpcGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgdW5leHBlY3RlZF9lb2YgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IGdldF93b3JkIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfbG9uZyBQQVJBTVMgKChGSUxFICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZ2V0X2RhdGEKLSAgUEFSQU1TICgoRklMRSAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZGVmaW5lX2ZvbnRkaXJzIFBBUkFNUyAoKHZvaWQpKTsKLQwKLS8qIGxvb2sgZm9yIHRoZSBwcmVwcm9jZXNzb3IgcHJvZ3JhbSAqLwotCi1GSUxFICoKLWxvb2tfZm9yX2RlZmF1bHQgKGNtZCwgcHJlZml4LCBlbmRfcHJlZml4LCBwcmVwcm9jYXJncywgZmlsZW5hbWUpCi0gICAgIGNoYXIgKmNtZDsKLSAgICAgY2hhciAqcHJlZml4OwotICAgICBpbnQgZW5kX3ByZWZpeDsKLSAgICAgY2hhciAqcHJlcHJvY2FyZ3M7Ci0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBjaGFyICpwYXRoID0gZ2V0ZW52ICgiUEFUSCIpOwotICBjaGFyICpzcGFjZTsKLSAgaW50IGZvdW5kOwotICBzdHJ1Y3Qgc3RhdCBzOwotCi0gIHN0cmNweSAoY21kLCBwcmVmaXgpOwotCi0gIHNwcmludGYgKGNtZCtlbmRfcHJlZml4LCAiJXMiLCBERUZBVUxUX1BSRVBST0NFU1NPUik7Ci0gIHNwYWNlID0gc3RyY2hyIChjbWQrZW5kX3ByZWZpeCwgJyAnKTsKLSAgaWYgKHNwYWNlKQotICAgICpzcGFjZSA9IDA7Ci0KLSAgaWYgKHN0cmNociAoY21kLCAnLycpKQotICAgIHsKLSAgICAgIGZvdW5kID0gc3RhdCAoY21kLCAmcyk7Ci0KLSAgICAgIGlmIChmb3VuZCA8IDApCi0JewotCSAgaWYgKHZlcmJvc2UpCi0JICAgIGZwcmludGYgKHN0ZGVyciwgIlRyaWVkIGAlcydcbiIsIGNtZCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIHN0cmNweSAoY21kLCBwcmVmaXgpOwotCi0gIHNwcmludGYgKGNtZCtlbmRfcHJlZml4LCAiJXMgJXMgJXMiLAotCSAgIERFRkFVTFRfUFJFUFJPQ0VTU09SLCBwcmVwcm9jYXJncywgZmlsZW5hbWUpOwotCi0gIGlmICh2ZXJib3NlKQotICAgIGZwcmludGYgKHN0ZGVyciwgIlVzaW5nIGAlcydcbiIsIGNtZCk7Ci0KLSAgY3BwX3BpcGUgPSBwb3BlbiAoY21kLCBGT1BFTl9SVCk7Ci0gIHJldHVybiBjcHBfcGlwZTsKLX0KLQotLyogUmVhZCBhbiByYyBmaWxlLiAgKi8KLQotc3RydWN0IHJlc19kaXJlY3RvcnkgKgotcmVhZF9yY19maWxlIChmaWxlbmFtZSwgcHJlcHJvY2Vzc29yLCBwcmVwcm9jYXJncywgbGFuZ3VhZ2UpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICpwcmVwcm9jZXNzb3I7Ci0gICAgIGNvbnN0IGNoYXIgKnByZXByb2NhcmdzOwotICAgICBpbnQgbGFuZ3VhZ2U7Ci17Ci0gIGNoYXIgKmNtZDsKLQotICBpZiAocHJlcHJvY2FyZ3MgPT0gTlVMTCkKLSAgICBwcmVwcm9jYXJncyA9ICIiOwotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICBmaWxlbmFtZSA9ICItIjsKLQotICBpZiAocHJlcHJvY2Vzc29yKQotICAgIHsKLSAgICAgIGNtZCA9IHhtYWxsb2MgKHN0cmxlbiAocHJlcHJvY2Vzc29yKQotCQkgICAgICsgc3RybGVuIChwcmVwcm9jYXJncykKLQkJICAgICArIHN0cmxlbiAoZmlsZW5hbWUpCi0JCSAgICAgKyAxMCk7Ci0gICAgICBzcHJpbnRmIChjbWQsICIlcyAlcyAlcyIsIHByZXByb2Nlc3NvciwgcHJlcHJvY2FyZ3MsIGZpbGVuYW1lKTsKLQotICAgICAgY3BwX3BpcGUgPSBwb3BlbiAoY21kLCBGT1BFTl9SVCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqZGFzaCwgKnNsYXNoLCAqY3A7Ci0KLSAgICAgIHByZXByb2Nlc3NvciA9IERFRkFVTFRfUFJFUFJPQ0VTU09SOwotCi0gICAgICBjbWQgPSB4bWFsbG9jIChzdHJsZW4gKHByb2dyYW1fbmFtZSkKLQkJICAgICArIHN0cmxlbiAocHJlcHJvY2Vzc29yKQotCQkgICAgICsgc3RybGVuIChwcmVwcm9jYXJncykKLQkJICAgICArIHN0cmxlbiAoZmlsZW5hbWUpCi0JCSAgICAgKyAxMCk7Ci0KLQotICAgICAgZGFzaCA9IHNsYXNoID0gMDsKLSAgICAgIGZvciAoY3A9cHJvZ3JhbV9uYW1lOyAqY3A7IGNwKyspCi0JewotCSAgaWYgKCpjcCA9PSAnLScpCi0JICAgIGRhc2ggPSBjcDsKLQkgIGlmICgKLSNpZiBkZWZpbmVkKF9fREpHUFBfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX1dJTjMyX18pCi0JICAgICAgKmNwID09ICc6JyB8fCAqY3AgPT0gJ1xcJyB8fAotI2VuZGlmCi0JICAgICAgKmNwID09ICcvJykKLQkgICAgewotCSAgICAgIHNsYXNoID0gY3A7Ci0JICAgICAgZGFzaCA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGNwcF9waXBlID0gMDsKLQotICAgICAgaWYgKGRhc2gpCi0JewotCSAgLyogRmlyc3QsIHRyeSBsb29raW5nIGZvciBhIHByZWZpeGVkIGdjYyBpbiB0aGUgd2luZHJlcwotCSAgICAgZGlyZWN0b3J5LCB3aXRoIHRoZSBzYW1lIHByZWZpeCBhcyB3aW5kcmVzICovCi0KLQkgIGNwcF9waXBlID0gbG9va19mb3JfZGVmYXVsdCAoY21kLCBwcm9ncmFtX25hbWUsIGRhc2gtcHJvZ3JhbV9uYW1lKzEsCi0JCQkJICAgICAgIHByZXByb2NhcmdzLCBmaWxlbmFtZSk7Ci0JfQotCi0gICAgICBpZiAoc2xhc2ggJiYgIWNwcF9waXBlKQotCXsKLQkgIC8qIE5leHQsIHRyeSBsb29raW5nIGZvciBhIGdjYyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMKLSAgICAgICAgICAgICB0aGF0IHdpbmRyZXMgKi8KLQotCSAgY3BwX3BpcGUgPSBsb29rX2Zvcl9kZWZhdWx0IChjbWQsIHByb2dyYW1fbmFtZSwgc2xhc2gtcHJvZ3JhbV9uYW1lKzEsCi0JCQkJICAgICAgIHByZXByb2NhcmdzLCBmaWxlbmFtZSk7Ci0JfQotCi0gICAgICBpZiAoIWNwcF9waXBlKQotCXsKLQkgIC8qIFNpZ2gsIHRyeSB0aGUgZGVmYXVsdCAqLwotCi0JICBjcHBfcGlwZSA9IGxvb2tfZm9yX2RlZmF1bHQgKGNtZCwgIiIsIDAsIHByZXByb2NhcmdzLCBmaWxlbmFtZSk7Ci0JfQotCi0gICAgfQotICBpZiAoY3BwX3BpcGUgPT0gTlVMTCkKLSAgICBmYXRhbCAoXygiY2FuJ3QgcG9wZW4gYCVzJzogJXMiKSwgY21kLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgZnJlZSAoY21kKTsKLQotICB4YXRleGl0IChjbG9zZV9waXBlKTsKLQotICByY19maWxlbmFtZSA9IHhzdHJkdXAgKGZpbGVuYW1lKTsKLSAgcmNfbGluZW5vID0gMTsKLSAgaWYgKGxhbmd1YWdlICE9IC0xKQotICAgIHJjcGFyc2Vfc2V0X2xhbmd1YWdlIChsYW5ndWFnZSk7Ci0gIHl5aW4gPSBjcHBfcGlwZTsKLSAgeXlwYXJzZSAoKTsKLQotICBpZiAocGNsb3NlIChjcHBfcGlwZSkgIT0gMCkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB3YXJuaW5nOiBwcmVwcm9jZXNzb3IgZmFpbGVkXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgY3BwX3BpcGUgPSBOVUxMOwotCi0gIGlmIChmb250ZGlycyAhPSBOVUxMKQotICAgIGRlZmluZV9mb250ZGlycyAoKTsKLQotICBmcmVlIChyY19maWxlbmFtZSk7Ci0gIHJjX2ZpbGVuYW1lID0gTlVMTDsKLQotICByZXR1cm4gcmVzb3VyY2VzOwotfQotCi0vKiBDbG9zZSB0aGUgcGlwZSBpZiBpdCBpcyBvcGVuLiAgVGhpcyBpcyBjYWxsZWQgdmlhIHhhdGV4aXQuICAqLwotCi12b2lkCi1jbG9zZV9waXBlICgpCi17Ci0gIGlmIChjcHBfcGlwZSAhPSBOVUxMKQotICAgIHBjbG9zZSAoY3BwX3BpcGUpOwotfQotCi0vKiBSZXBvcnQgYW4gZXJyb3Igd2hpbGUgcmVhZGluZyBhbiByYyBmaWxlLiAgKi8KLQotdm9pZAoteXllcnJvciAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGZhdGFsICgiJXM6JWQ6ICVzIiwgcmNfZmlsZW5hbWUsIHJjX2xpbmVubywgbXNnKTsKLX0KLQotLyogSXNzdWUgYSB3YXJuaW5nIHdoaWxlIHJlYWRpbmcgYW4gcmMgZmlsZS4gICovCi0KLXZvaWQKLXJjcGFyc2Vfd2FybmluZyAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkOiAlc1xuIiwgcmNfZmlsZW5hbWUsIHJjX2xpbmVubywgbXNnKTsKLX0KLQotLyogRGllIGlmIHdlIGdldCBhbiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXVuZXhwZWN0ZWRfZW9mIChtc2cpCi0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgZmF0YWwgKF8oIiVzOiB1bmV4cGVjdGVkIEVPRiIpLCBtc2cpOwotfQotCi0vKiBSZWFkIGEgMTYgYml0IHdvcmQgZnJvbSBhIGZpbGUuICBUaGUgZGF0YSBpcyBhc3N1bWVkIHRvIGJlIGxpdHRsZQotICAgZW5kaWFuLiAgKi8KLQotc3RhdGljIGludAotZ2V0X3dvcmQgKGUsIG1zZykKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3QgY2hhciAqbXNnOwotewotICBpbnQgYjEsIGIyOwotCi0gIGIxID0gZ2V0YyAoZSk7Ci0gIGIyID0gZ2V0YyAoZSk7Ci0gIGlmIChmZW9mIChlKSkKLSAgICB1bmV4cGVjdGVkX2VvZiAobXNnKTsKLSAgcmV0dXJuICgoYjIgJiAweGZmKSA8PCA4KSB8IChiMSAmIDB4ZmYpOwotfQotCi0vKiBSZWFkIGEgMzIgYml0IHdvcmQgZnJvbSBhIGZpbGUuICBUaGUgZGF0YSBpcyBhc3N1bWVkIHRvIGJlIGxpdHRsZQotICAgZW5kaWFuLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWdldF9sb25nIChlLCBtc2cpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgaW50IGIxLCBiMiwgYjMsIGI0OwotCi0gIGIxID0gZ2V0YyAoZSk7Ci0gIGIyID0gZ2V0YyAoZSk7Ci0gIGIzID0gZ2V0YyAoZSk7Ci0gIGI0ID0gZ2V0YyAoZSk7Ci0gIGlmIChmZW9mIChlKSkKLSAgICB1bmV4cGVjdGVkX2VvZiAobXNnKTsKLSAgcmV0dXJuICgoKCgoKChiNCAmIDB4ZmYpIDw8IDgpCi0JICAgICAgfCAoYjMgJiAweGZmKSkgPDwgOCkKLQkgICAgfCAoYjIgJiAweGZmKSkgPDwgOCkKLQkgIHwgKGIxICYgMHhmZikpOwotfQotCi0vKiBSZWFkIGRhdGEgZnJvbSBhIGZpbGUuICBUaGlzIGlzIGEgd3JhcHBlciB0byBkbyBlcnJvciBjaGVja2luZy4gICovCi0KLXN0YXRpYyB2b2lkCi1nZXRfZGF0YSAoZSwgcCwgYywgbXNnKQotICAgICBGSUxFICplOwotICAgICB1bnNpZ25lZCBjaGFyICpwOwotICAgICB1bnNpZ25lZCBsb25nIGM7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgdW5zaWduZWQgbG9uZyBnb3Q7Ci0KLSAgZ290ID0gZnJlYWQgKHAsIDEsIGMsIGUpOwotICBpZiAoZ290ID09IGMpCi0gICAgcmV0dXJuOwotCi0gIGZhdGFsIChfKCIlczogcmVhZCBvZiAlbHUgcmV0dXJuZWQgJWx1IiksIG1zZywgYywgZ290KTsKLX0KLQwKLS8qIERlZmluZSBhbiBhY2NlbGVyYXRvciByZXNvdXJjZS4gICovCi0KLXZvaWQKLWRlZmluZV9hY2NlbGVyYXRvciAoaWQsIHJlc2luZm8sIGRhdGEpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIHN0cnVjdCBhY2NlbGVyYXRvciAqZGF0YTsKLXsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICByID0gZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlICgmcmVzb3VyY2VzLCBSVF9BQ0NFTEVSQVRPUiwgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOwotICByLT50eXBlID0gUkVTX1RZUEVfQUNDRUxFUkFUT1I7Ci0gIHItPnUuYWNjID0gZGF0YTsKLSAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKLX0KLQotLyogRGVmaW5lIGEgYml0bWFwIHJlc291cmNlLiAgQml0bWFwIGRhdGEgaXMgc3RvcmVkIGluIGEgZmlsZS4gIFRoZQotICAgZmlyc3QgMTQgYnl0ZXMgb2YgdGhlIGZpbGUgYXJlIGEgc3RhbmRhcmQgaGVhZGVyLCB3aGljaCBpcyBub3QKLSAgIGluY2x1ZGVkIGluIHRoZSByZXNvdXJjZSBkYXRhLiAgKi8KLQotI2RlZmluZSBCSVRNQVBfU0tJUCAoMTQpCi0KLXZvaWQKLWRlZmluZV9iaXRtYXAgKGlkLCByZXNpbmZvLCBmaWxlbmFtZSkKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIEZJTEUgKmU7Ci0gIGNoYXIgKnJlYWxfZmlsZW5hbWU7Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gIGludCBpOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGUgPSBvcGVuX2ZpbGVfc2VhcmNoIChmaWxlbmFtZSwgRk9QRU5fUkIsICJiaXRtYXAgZmlsZSIsICZyZWFsX2ZpbGVuYW1lKTsKLQotICBpZiAoc3RhdCAocmVhbF9maWxlbmFtZSwgJnMpIDwgMCkKLSAgICBmYXRhbCAoXygic3RhdCBmYWlsZWQgb24gYml0bWFwIGZpbGUgYCVzJzogJXMiKSwgcmVhbF9maWxlbmFtZSwKLQkgICBzdHJlcnJvciAoZXJybm8pKTsKLQotICBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzX2FsbG9jIChzLnN0X3NpemUgLSBCSVRNQVBfU0tJUCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJJVE1BUF9TS0lQOyBpKyspCi0gICAgZ2V0YyAoZSk7Ci0KLSAgZ2V0X2RhdGEgKGUsIGRhdGEsIHMuc3Rfc2l6ZSAtIEJJVE1BUF9TS0lQLCByZWFsX2ZpbGVuYW1lKTsKLQotICBmY2xvc2UgKGUpOwotICBmcmVlIChyZWFsX2ZpbGVuYW1lKTsKLQotICByID0gZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlICgmcmVzb3VyY2VzLCBSVF9CSVRNQVAsIGlkLAotCQkJCXJlc2luZm8tPmxhbmd1YWdlLCAwKTsKLQotICByLT50eXBlID0gUkVTX1RZUEVfQklUTUFQOwotICByLT51LmRhdGEubGVuZ3RoID0gcy5zdF9zaXplIC0gQklUTUFQX1NLSVA7Ci0gIHItPnUuZGF0YS5kYXRhID0gZGF0YTsKLSAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKLX0KLQotLyogRGVmaW5lIGEgY3Vyc29yIHJlc291cmNlLiAgQSBjdXJzb3IgZmlsZSBtYXkgY29udGFpbiBhIHNldCBvZgotICAgYml0bWFwcywgZWFjaCByZXByZXNlbnRpbmcgdGhlIHNhbWUgY3Vyc29yIGF0IHZhcmlvdXMgZGlmZmVyZW50Ci0gICByZXNvbHV0aW9ucy4gIFRoZXkgZWFjaCBnZXQgd3JpdHRlbiBvdXQgd2l0aCBhIGRpZmZlcmVudCBJRC4gIFRoZQotICAgcmVhbCBjdXJzb3IgcmVzb3VyY2UgaXMgdGhlbiBhIGdyb3VwIHJlc291cmNlIHdoaWNoIGNhbiBiZSB1c2VkIHRvCi0gICBzZWxlY3Qgb25lIG9mIHRoZSBhY3R1YWwgY3Vyc29ycy4gICovCi0KLXZvaWQKLWRlZmluZV9jdXJzb3IgKGlkLCByZXNpbmZvLCBmaWxlbmFtZSkKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIEZJTEUgKmU7Ci0gIGNoYXIgKnJlYWxfZmlsZW5hbWU7Ci0gIGludCB0eXBlLCBjb3VudCwgaTsKLSAgc3RydWN0IGljb25kaXIgKmljb25kaXJzOwotICBpbnQgZmlyc3RfY3Vyc29yOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotICBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpmaXJzdCwgKipwcDsKLQotICBlID0gb3Blbl9maWxlX3NlYXJjaCAoZmlsZW5hbWUsIEZPUEVOX1JCLCAiY3Vyc29yIGZpbGUiLCAmcmVhbF9maWxlbmFtZSk7Ci0KLSAgLyogQSBjdXJzb3IgZmlsZSBpcyBiYXNpY2FsbHkgYW4gaWNvbiBmaWxlLiAgVGhlIHN0YXJ0IG9mIHRoZSBmaWxlCi0gICAgIGlzIGEgdGhyZWUgd29yZCBzdHJ1Y3R1cmUuICBUaGUgZmlyc3Qgd29yZCBpcyBpZ25vcmVkLiAgVGhlCi0gICAgIHNlY29uZCB3b3JkIGlzIHRoZSB0eXBlIG9mIGRhdGEuICBUaGUgdGhpcmQgd29yZCBpcyB0aGUgbnVtYmVyIG9mCi0gICAgIGVudHJpZXMuICAqLwotCi0gIGdldF93b3JkIChlLCByZWFsX2ZpbGVuYW1lKTsKLSAgdHlwZSA9IGdldF93b3JkIChlLCByZWFsX2ZpbGVuYW1lKTsKLSAgY291bnQgPSBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gIGlmICh0eXBlICE9IDIpCi0gICAgZmF0YWwgKF8oImN1cnNvciBmaWxlIGAlcycgZG9lcyBub3QgY29udGFpbiBjdXJzb3IgZGF0YSIpLCByZWFsX2ZpbGVuYW1lKTsKLQotICAvKiBSZWFkIGluIHRoZSBpY29uIGRpcmVjdG9yeSBlbnRyaWVzLiAgKi8KLQotICBpY29uZGlycyA9IChzdHJ1Y3QgaWNvbmRpciAqKSB4bWFsbG9jIChjb3VudCAqIHNpemVvZiAqaWNvbmRpcnMpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGljb25kaXJzW2ldLndpZHRoID0gZ2V0YyAoZSk7Ci0gICAgICBpY29uZGlyc1tpXS5oZWlnaHQgPSBnZXRjIChlKTsKLSAgICAgIGljb25kaXJzW2ldLmNvbG9yY291bnQgPSBnZXRjIChlKTsKLSAgICAgIGdldGMgKGUpOwotICAgICAgaWNvbmRpcnNbaV0udS5jdXJzb3IueGhvdHNwb3QgPSBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gICAgICBpY29uZGlyc1tpXS51LmN1cnNvci55aG90c3BvdCA9IGdldF93b3JkIChlLCByZWFsX2ZpbGVuYW1lKTsKLSAgICAgIGljb25kaXJzW2ldLmJ5dGVzID0gZ2V0X2xvbmcgKGUsIHJlYWxfZmlsZW5hbWUpOwotICAgICAgaWNvbmRpcnNbaV0ub2Zmc2V0ID0gZ2V0X2xvbmcgKGUsIHJlYWxfZmlsZW5hbWUpOwotCi0gICAgICBpZiAoZmVvZiAoZSkpCi0JdW5leHBlY3RlZF9lb2YgKHJlYWxfZmlsZW5hbWUpOwotICAgIH0KLQotICAvKiBEZWZpbmUgZWFjaCBjdXJzb3IgYXMgYSB1bmlxdWUgcmVzb3VyY2UuICAqLwotCi0gIGZpcnN0X2N1cnNvciA9IGN1cnNvcnM7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgIHN0cnVjdCByZXNfaWQgbmFtZTsKLSAgICAgIHN0cnVjdCBjdXJzb3IgKmM7Ci0KLSAgICAgIGlmIChmc2VlayAoZSwgaWNvbmRpcnNbaV0ub2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQlmYXRhbCAoXygiJXM6IGZzZWVrIHRvICVsdSBmYWlsZWQ6ICVzIiksIHJlYWxfZmlsZW5hbWUsCi0JICAgICAgIGljb25kaXJzW2ldLm9mZnNldCwgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgICAgIGRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXNfYWxsb2MgKGljb25kaXJzW2ldLmJ5dGVzKTsKLQotICAgICAgZ2V0X2RhdGEgKGUsIGRhdGEsIGljb25kaXJzW2ldLmJ5dGVzLCByZWFsX2ZpbGVuYW1lKTsKLQotICAgICAgYyA9IChzdHJ1Y3QgY3Vyc29yICopIHJlc19hbGxvYyAoc2l6ZW9mICpjKTsKLSAgICAgIGMtPnhob3RzcG90ID0gaWNvbmRpcnNbaV0udS5jdXJzb3IueGhvdHNwb3Q7Ci0gICAgICBjLT55aG90c3BvdCA9IGljb25kaXJzW2ldLnUuY3Vyc29yLnlob3RzcG90OwotICAgICAgYy0+bGVuZ3RoID0gaWNvbmRpcnNbaV0uYnl0ZXM7Ci0gICAgICBjLT5kYXRhID0gZGF0YTsKLQotICAgICAgKytjdXJzb3JzOwotCi0gICAgICBuYW1lLm5hbWVkID0gMDsKLSAgICAgIG5hbWUudS5pZCA9IGN1cnNvcnM7Ci0KLSAgICAgIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX0NVUlNPUiwgbmFtZSwKLQkJCQkgICAgcmVzaW5mby0+bGFuZ3VhZ2UsIDApOwotICAgICAgci0+dHlwZSA9IFJFU19UWVBFX0NVUlNPUjsKLSAgICAgIHItPnUuY3Vyc29yID0gYzsKLSAgICAgIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci0gICAgfQotCi0gIGZjbG9zZSAoZSk7Ci0gIGZyZWUgKHJlYWxfZmlsZW5hbWUpOwotCi0gIC8qIERlZmluZSBhIGN1cnNvciBncm91cCByZXNvdXJjZS4gICovCi0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGdyb3VwX2N1cnNvciAqY2c7Ci0KLSAgICAgIGNnID0gKHN0cnVjdCBncm91cF9jdXJzb3IgKikgcmVzX2FsbG9jIChzaXplb2YgKmNnKTsKLSAgICAgIGNnLT5uZXh0ID0gTlVMTDsKLSAgICAgIGNnLT53aWR0aCA9IGljb25kaXJzW2ldLndpZHRoOwotICAgICAgY2ctPmhlaWdodCA9IDIgKiBpY29uZGlyc1tpXS5oZWlnaHQ7Ci0KLSAgICAgIC8qIEZJWE1FOiBXaGF0IHNob3VsZCB0aGVzZSBiZSBzZXQgdG8/ICAqLwotICAgICAgY2ctPnBsYW5lcyA9IDE7Ci0gICAgICBjZy0+Yml0cyA9IDE7Ci0KLSAgICAgIGNnLT5ieXRlcyA9IGljb25kaXJzW2ldLmJ5dGVzICsgNDsKLSAgICAgIGNnLT5pbmRleCA9IGZpcnN0X2N1cnNvciArIGkgKyAxOwotCi0gICAgICAqcHAgPSBjZzsKLSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotICAgIH0KLQotICBmcmVlIChpY29uZGlycyk7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfR1JPVVBfQ1VSU09SLCBpZCwKLQkJCQlyZXNpbmZvLT5sYW5ndWFnZSwgMCk7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9HUk9VUF9DVVJTT1I7Ci0gIHItPnUuZ3JvdXBfY3Vyc29yID0gZmlyc3Q7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIGRpYWxvZyByZXNvdXJjZS4gICovCi0KLXZvaWQKLWRlZmluZV9kaWFsb2cgKGlkLCByZXNpbmZvLCBkaWFsb2cpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBkaWFsb2cgKmRpYWxvZzsKLXsKLSAgc3RydWN0IGRpYWxvZyAqY29weTsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICBjb3B5ID0gKHN0cnVjdCBkaWFsb2cgKikgcmVzX2FsbG9jIChzaXplb2YgKmNvcHkpOwotICAqY29weSA9ICpkaWFsb2c7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfRElBTE9HLCBpZCwKLQkJCQlyZXNpbmZvLT5sYW5ndWFnZSwgMCk7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9ESUFMT0c7Ci0gIHItPnUuZGlhbG9nID0gY29weTsKLSAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKLX0KLQotLyogRGVmaW5lIGEgZGlhbG9nIGNvbnRyb2wuICBUaGlzIGRvZXMgbm90IGRlZmluZSBhIHJlc291cmNlLCBidXQKLSAgIG1lcmVseSBhbGxvY2F0ZXMgYW5kIGZpbGxzIGluIGEgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGRpYWxvZ19jb250cm9sICoKLWRlZmluZV9jb250cm9sICh0ZXh0LCBpZCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgY2xhc3MsIHN0eWxlLCBleHN0eWxlKQotICAgICBjb25zdCBjaGFyICp0ZXh0OwotICAgICB1bnNpZ25lZCBsb25nIGlkOwotICAgICB1bnNpZ25lZCBsb25nIHg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgeTsKLSAgICAgdW5zaWduZWQgbG9uZyB3aWR0aDsKLSAgICAgdW5zaWduZWQgbG9uZyBoZWlnaHQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY2xhc3M7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc3R5bGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZXhzdHlsZTsKLXsKLSAgc3RydWN0IGRpYWxvZ19jb250cm9sICpuOwotCi0gIG4gPSAoc3RydWN0IGRpYWxvZ19jb250cm9sICopIHJlc19hbGxvYyAoc2l6ZW9mICpuKTsKLSAgbi0+bmV4dCA9IE5VTEw7Ci0gIG4tPmlkID0gaWQ7Ci0gIG4tPnN0eWxlID0gc3R5bGU7Ci0gIG4tPmV4c3R5bGUgPSBleHN0eWxlOwotICBuLT54ID0geDsKLSAgbi0+eSA9IHk7Ci0gIG4tPndpZHRoID0gd2lkdGg7Ci0gIG4tPmhlaWdodCA9IGhlaWdodDsKLSAgbi0+Y2xhc3MubmFtZWQgPSAwOwotICBuLT5jbGFzcy51LmlkID0gY2xhc3M7Ci0gIGlmICh0ZXh0ICE9IE5VTEwpCi0gICAgcmVzX3N0cmluZ190b19pZCAoJm4tPnRleHQsIHRleHQpOwotICBlbHNlCi0gICAgewotICAgICAgbi0+dGV4dC5uYW1lZCA9IDA7Ci0gICAgICBuLT50ZXh0LnUuaWQgPSAwOwotICAgIH0KLSAgbi0+ZGF0YSA9IE5VTEw7Ci0gIG4tPmhlbHAgPSAwOwotCi0gIHJldHVybiBuOwotfQotCi0vKiBEZWZpbmUgYSBmb250IHJlc291cmNlLiAgKi8KLQotdm9pZAotZGVmaW5lX2ZvbnQgKGlkLCByZXNpbmZvLCBmaWxlbmFtZSkKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIEZJTEUgKmU7Ci0gIGNoYXIgKnJlYWxfZmlsZW5hbWU7Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0gIGxvbmcgb2Zmc2V0OwotICBsb25nIGZvbnRkYXRhbGVuZ3RoOwotICB1bnNpZ25lZCBjaGFyICpmb250ZGF0YTsKLSAgc3RydWN0IGZvbnRkaXIgKmZkOwotICBjb25zdCBjaGFyICpkZXZpY2UsICpmYWNlOwotICBzdHJ1Y3QgZm9udGRpciAqKnBwOwotCi0gIGUgPSBvcGVuX2ZpbGVfc2VhcmNoIChmaWxlbmFtZSwgRk9QRU5fUkIsICJmb250IGZpbGUiLCAmcmVhbF9maWxlbmFtZSk7Ci0KLSAgaWYgKHN0YXQgKHJlYWxfZmlsZW5hbWUsICZzKSA8IDApCi0gICAgZmF0YWwgKF8oInN0YXQgZmFpbGVkIG9uIGJpdG1hcCBmaWxlIGAlcyc6ICVzIiksIHJlYWxfZmlsZW5hbWUsCi0JICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc19hbGxvYyAocy5zdF9zaXplKTsKLQotICBnZXRfZGF0YSAoZSwgZGF0YSwgcy5zdF9zaXplLCByZWFsX2ZpbGVuYW1lKTsKLQotICBmY2xvc2UgKGUpOwotICBmcmVlIChyZWFsX2ZpbGVuYW1lKTsKLQotICByID0gZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlICgmcmVzb3VyY2VzLCBSVF9GT05ULCBpZCwKLQkJCQlyZXNpbmZvLT5sYW5ndWFnZSwgMCk7Ci0KLSAgci0+dHlwZSA9IFJFU19UWVBFX0ZPTlQ7Ci0gIHItPnUuZGF0YS5sZW5ndGggPSBzLnN0X3NpemU7Ci0gIHItPnUuZGF0YS5kYXRhID0gZGF0YTsKLSAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKLQotICAvKiBGb3IgZWFjaCBmb250IHJlc291cmNlLCB3ZSBtdXN0IGFkZCBhbiBlbnRyeSBpbiB0aGUgRk9OVERJUgotICAgICByZXNvdXJjZS4gIFRoZSBGT05URElSIHJlc291cmNlIGluY2x1ZGVzIHNvbWUgc3RyaW5ncyBpbiB0aGUgZm9udAotICAgICBmaWxlLiAgVG8gZmluZCB0aGVtLCB3ZSBoYXZlIHRvIGRvIHNvbWUgbWFnaWMgb24gdGhlIGRhdGEgd2UgaGF2ZQotICAgICByZWFkLiAgKi8KLQotICBvZmZzZXQgPSAoKCgoKChkYXRhWzQ3XSA8PCA4KQotCQl8IGRhdGFbNDZdKSA8PCA4KQotCSAgICAgIHwgZGF0YVs0NV0pIDw8IDgpCi0JICAgIHwgZGF0YVs0NF0pOwotICBpZiAob2Zmc2V0ID4gMCAmJiBvZmZzZXQgPCBzLnN0X3NpemUpCi0gICAgZGV2aWNlID0gKGNoYXIgKikgZGF0YSArIG9mZnNldDsKLSAgZWxzZQotICAgIGRldmljZSA9ICIiOwotCi0gIG9mZnNldCA9ICgoKCgoKGRhdGFbNTFdIDw8IDgpCi0JCXwgZGF0YVs1MF0pIDw8IDgpCi0JICAgICAgfCBkYXRhWzQ5XSkgPDwgOCkKLQkgICAgfCBkYXRhWzQ4XSk7Ci0gIGlmIChvZmZzZXQgPiAwICYmIG9mZnNldCA8IHMuc3Rfc2l6ZSkKLSAgICBmYWNlID0gKGNoYXIgKikgZGF0YSArIG9mZnNldDsKLSAgZWxzZQotICAgIGZhY2UgPSAiIjsKLQotICArK2ZvbnRzOwotCi0gIGZvbnRkYXRhbGVuZ3RoID0gNTggKyBzdHJsZW4gKGRldmljZSkgKyBzdHJsZW4gKGZhY2UpOwotICBmb250ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc19hbGxvYyAoZm9udGRhdGFsZW5ndGgpOwotICBtZW1jcHkgKGZvbnRkYXRhLCBkYXRhLCA1Nik7Ci0gIHN0cmNweSAoKGNoYXIgKikgZm9udGRhdGEgKyA1NiwgZGV2aWNlKTsKLSAgc3RyY3B5ICgoY2hhciAqKSBmb250ZGF0YSArIDU3ICsgc3RybGVuIChkZXZpY2UpLCBmYWNlKTsKLQotICBmZCA9IChzdHJ1Y3QgZm9udGRpciAqKSByZXNfYWxsb2MgKHNpemVvZiAqZmQpOwotICBmZC0+bmV4dCA9IE5VTEw7Ci0gIGZkLT5pbmRleCA9IGZvbnRzOwotICBmZC0+bGVuZ3RoID0gZm9udGRhdGFsZW5ndGg7Ci0gIGZkLT5kYXRhID0gZm9udGRhdGE7Ci0KLSAgZm9yIChwcCA9ICZmb250ZGlyczsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotICAgIDsKLSAgKnBwID0gZmQ7Ci0KLSAgLyogRm9yIHRoZSBzaW5nbGUgZm9udGRpcnMgcmVzb3VyY2UsIHdlIGFsd2F5cyB1c2UgdGhlIHJlc291cmNlCi0gICAgIGluZm9ybWF0aW9uIG9mIHRoZSBsYXN0IGZvbnQuICBJIGRvbid0IGtub3cgd2hhdCBlbHNlIHRvIGRvLiAgKi8KLSAgZm9udGRpcnNfcmVzaW5mbyA9ICpyZXNpbmZvOwotfQotCi0vKiBEZWZpbmUgdGhlIGZvbnRkaXJzIHJlc291cmNlLiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGVudGlyZSByYwotICAgZmlsZSBoYXMgYmVlbiBwYXJzZWQsIGlmIGFueSBmb250IHJlc291cmNlcyB3ZXJlIHNlZW4uICAqLwotCi1zdGF0aWMgdm9pZAotZGVmaW5lX2ZvbnRkaXJzICgpCi17Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0gIHN0cnVjdCByZXNfaWQgaWQ7Ci0KLSAgaWQubmFtZWQgPSAwOwotICBpZC51LmlkID0gMTsKLQotICByID0gZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlICgmcmVzb3VyY2VzLCBSVF9GT05URElSLCBpZCwgMHg0MDksIDApOwotCi0gIHItPnR5cGUgPSBSRVNfVFlQRV9GT05URElSOwotICByLT51LmZvbnRkaXIgPSBmb250ZGlyczsKLSAgci0+cmVzX2luZm8gPSBmb250ZGlyc19yZXNpbmZvOwotfQotCi0vKiBEZWZpbmUgYW4gaWNvbiByZXNvdXJjZS4gIEFuIGljb24gZmlsZSBtYXkgY29udGFpbiBhIHNldCBvZgotICAgYml0bWFwcywgZWFjaCByZXByZXNlbnRpbmcgdGhlIHNhbWUgaWNvbiBhdCB2YXJpb3VzIGRpZmZlcmVudAotICAgcmVzb2x1dGlvbnMuICBUaGV5IGVhY2ggZ2V0IHdyaXR0ZW4gb3V0IHdpdGggYSBkaWZmZXJlbnQgSUQuICBUaGUKLSAgIHJlYWwgaWNvbiByZXNvdXJjZSBpcyB0aGVuIGEgZ3JvdXAgcmVzb3VyY2Ugd2hpY2ggY2FuIGJlIHVzZWQgdG8KLSAgIHNlbGVjdCBvbmUgb2YgdGhlIGFjdHVhbCBpY29uIGJpdG1hcHMuICAqLwotCi12b2lkCi1kZWZpbmVfaWNvbiAoaWQsIHJlc2luZm8sIGZpbGVuYW1lKQotICAgICBzdHJ1Y3QgcmVzX2lkIGlkOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgRklMRSAqZTsKLSAgY2hhciAqcmVhbF9maWxlbmFtZTsKLSAgaW50IHR5cGUsIGNvdW50LCBpOwotICBzdHJ1Y3QgaWNvbmRpciAqaWNvbmRpcnM7Ci0gIGludCBmaXJzdF9pY29uOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotICBzdHJ1Y3QgZ3JvdXBfaWNvbiAqZmlyc3QsICoqcHA7Ci0KLSAgZSA9IG9wZW5fZmlsZV9zZWFyY2ggKGZpbGVuYW1lLCBGT1BFTl9SQiwgImljb24gZmlsZSIsICZyZWFsX2ZpbGVuYW1lKTsKLQotICAvKiBUaGUgc3RhcnQgb2YgYW4gaWNvbiBmaWxlIGlzIGEgdGhyZWUgd29yZCBzdHJ1Y3R1cmUuICBUaGUgZmlyc3QKLSAgICAgd29yZCBpcyBpZ25vcmVkLiAgVGhlIHNlY29uZCB3b3JkIGlzIHRoZSB0eXBlIG9mIGRhdGEuICBUaGUgdGhpcmQKLSAgICAgd29yZCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMuICAqLwotCi0gIGdldF93b3JkIChlLCByZWFsX2ZpbGVuYW1lKTsKLSAgdHlwZSA9IGdldF93b3JkIChlLCByZWFsX2ZpbGVuYW1lKTsKLSAgY291bnQgPSBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gIGlmICh0eXBlICE9IDEpCi0gICAgZmF0YWwgKF8oImljb24gZmlsZSBgJXMnIGRvZXMgbm90IGNvbnRhaW4gaWNvbiBkYXRhIiksIHJlYWxfZmlsZW5hbWUpOwotCi0gIC8qIFJlYWQgaW4gdGhlIGljb24gZGlyZWN0b3J5IGVudHJpZXMuICAqLwotCi0gIGljb25kaXJzID0gKHN0cnVjdCBpY29uZGlyICopIHhtYWxsb2MgKGNvdW50ICogc2l6ZW9mICppY29uZGlycyk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgaWNvbmRpcnNbaV0ud2lkdGggPSBnZXRjIChlKTsKLSAgICAgIGljb25kaXJzW2ldLmhlaWdodCA9IGdldGMgKGUpOwotICAgICAgaWNvbmRpcnNbaV0uY29sb3Jjb3VudCA9IGdldGMgKGUpOwotICAgICAgZ2V0YyAoZSk7Ci0gICAgICBpY29uZGlyc1tpXS51Lmljb24ucGxhbmVzID0gZ2V0X3dvcmQgKGUsIHJlYWxfZmlsZW5hbWUpOwotICAgICAgaWNvbmRpcnNbaV0udS5pY29uLmJpdHMgPSBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gICAgICBpY29uZGlyc1tpXS5ieXRlcyA9IGdldF9sb25nIChlLCByZWFsX2ZpbGVuYW1lKTsKLSAgICAgIGljb25kaXJzW2ldLm9mZnNldCA9IGdldF9sb25nIChlLCByZWFsX2ZpbGVuYW1lKTsKLQotICAgICAgaWYgKGZlb2YgKGUpKQotCXVuZXhwZWN0ZWRfZW9mIChyZWFsX2ZpbGVuYW1lKTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIGVhY2ggaWNvbiBhcyBhIHVuaXF1ZSByZXNvdXJjZS4gICovCi0KLSAgZmlyc3RfaWNvbiA9IGljb25zOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgICBzdHJ1Y3QgcmVzX2lkIG5hbWU7Ci0KLSAgICAgIGlmIChmc2VlayAoZSwgaWNvbmRpcnNbaV0ub2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQlmYXRhbCAoXygiJXM6IGZzZWVrIHRvICVsdSBmYWlsZWQ6ICVzIiksIHJlYWxfZmlsZW5hbWUsCi0JICAgICAgIGljb25kaXJzW2ldLm9mZnNldCwgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgICAgIGRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXNfYWxsb2MgKGljb25kaXJzW2ldLmJ5dGVzKTsKLQotICAgICAgZ2V0X2RhdGEgKGUsIGRhdGEsIGljb25kaXJzW2ldLmJ5dGVzLCByZWFsX2ZpbGVuYW1lKTsKLQotICAgICAgKytpY29uczsKLQotICAgICAgbmFtZS5uYW1lZCA9IDA7Ci0gICAgICBuYW1lLnUuaWQgPSBpY29uczsKLQotICAgICAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfSUNPTiwgbmFtZSwKLQkJCQkgICAgcmVzaW5mby0+bGFuZ3VhZ2UsIDApOwotICAgICAgci0+dHlwZSA9IFJFU19UWVBFX0lDT047Ci0gICAgICByLT51LmRhdGEubGVuZ3RoID0gaWNvbmRpcnNbaV0uYnl0ZXM7Ci0gICAgICByLT51LmRhdGEuZGF0YSA9IGRhdGE7Ci0gICAgICByLT5yZXNfaW5mbyA9ICpyZXNpbmZvOwotICAgIH0KLQotICBmY2xvc2UgKGUpOwotICBmcmVlIChyZWFsX2ZpbGVuYW1lKTsKLQotICAvKiBEZWZpbmUgYW4gaWNvbiBncm91cCByZXNvdXJjZS4gICovCi0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGdyb3VwX2ljb24gKmNnOwotCi0gICAgICAvKiBGb3Igc29tZSByZWFzb24sIGF0IGxlYXN0IGluIHNvbWUgZmlsZXMgdGhlIHBsYW5lcyBhbmQgYml0cwotICAgICAgICAgYXJlIHplcm8uICBXZSBpbnN0ZWFkIHNldCB0aGVtIGZyb20gdGhlIGNvbG9yLiAgVGhpcyBpcwotICAgICAgICAgY29waWVkIGZyb20gcmNsLiAgKi8KLQotICAgICAgY2cgPSAoc3RydWN0IGdyb3VwX2ljb24gKikgcmVzX2FsbG9jIChzaXplb2YgKmNnKTsKLSAgICAgIGNnLT5uZXh0ID0gTlVMTDsKLSAgICAgIGNnLT53aWR0aCA9IGljb25kaXJzW2ldLndpZHRoOwotICAgICAgY2ctPmhlaWdodCA9IGljb25kaXJzW2ldLmhlaWdodDsKLSAgICAgIGNnLT5jb2xvcnMgPSBpY29uZGlyc1tpXS5jb2xvcmNvdW50OwotCi0gICAgICBjZy0+cGxhbmVzID0gMTsKLSAgICAgIGNnLT5iaXRzID0gMDsKLSAgICAgIHdoaWxlICgoMSA8PCBjZy0+Yml0cykgPCBjZy0+Y29sb3JzKQotCSsrY2ctPmJpdHM7Ci0KLSAgICAgIGNnLT5ieXRlcyA9IGljb25kaXJzW2ldLmJ5dGVzOwotICAgICAgY2ctPmluZGV4ID0gZmlyc3RfaWNvbiArIGkgKyAxOwotCi0gICAgICAqcHAgPSBjZzsKLSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotICAgIH0KLQotICBmcmVlIChpY29uZGlycyk7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfR1JPVVBfSUNPTiwgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOwotICByLT50eXBlID0gUkVTX1RZUEVfR1JPVVBfSUNPTjsKLSAgci0+dS5ncm91cF9pY29uID0gZmlyc3Q7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIG1lbnUgcmVzb3VyY2UuICAqLwotCi12b2lkCi1kZWZpbmVfbWVudSAoaWQsIHJlc2luZm8sIG1lbnVpdGVtcykKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLSAgICAgc3RydWN0IG1lbnVpdGVtICptZW51aXRlbXM7Ci17Ci0gIHN0cnVjdCBtZW51ICptOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIG0gPSAoc3RydWN0IG1lbnUgKikgcmVzX2FsbG9jIChzaXplb2YgKm0pOwotICBtLT5pdGVtcyA9IG1lbnVpdGVtczsKLSAgbS0+aGVscCA9IDA7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfTUVOVSwgaWQsIHJlc2luZm8tPmxhbmd1YWdlLCAwKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX01FTlU7Ci0gIHItPnUubWVudSA9IG07Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIG1lbnUgaXRlbS4gIFRoaXMgZG9lcyBub3QgZGVmaW5lIGEgcmVzb3VyY2UsIGJ1dCBtZXJlbHkKLSAgIGFsbG9jYXRlcyBhbmQgZmlsbHMgaW4gYSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgbWVudWl0ZW0gKgotZGVmaW5lX21lbnVpdGVtICh0ZXh0LCBtZW51aWQsIHR5cGUsIHN0YXRlLCBoZWxwLCBtZW51aXRlbXMpCi0gICAgIGNvbnN0IGNoYXIgKnRleHQ7Ci0gICAgIGludCBtZW51aWQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdHlwZTsKLSAgICAgdW5zaWduZWQgbG9uZyBzdGF0ZTsKLSAgICAgdW5zaWduZWQgbG9uZyBoZWxwOwotICAgICBzdHJ1Y3QgbWVudWl0ZW0gKm1lbnVpdGVtczsKLXsKLSAgc3RydWN0IG1lbnVpdGVtICptaTsKLQotICBtaSA9IChzdHJ1Y3QgbWVudWl0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKm1pKTsKLSAgbWktPm5leHQgPSBOVUxMOwotICBtaS0+dHlwZSA9IHR5cGU7Ci0gIG1pLT5zdGF0ZSA9IHN0YXRlOwotICBtaS0+aWQgPSBtZW51aWQ7Ci0gIGlmICh0ZXh0ID09IE5VTEwpCi0gICAgbWktPnRleHQgPSBOVUxMOwotICBlbHNlCi0gICAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZtaS0+dGV4dCwgdGV4dCk7Ci0gIG1pLT5oZWxwID0gaGVscDsKLSAgbWktPnBvcHVwID0gbWVudWl0ZW1zOwotICByZXR1cm4gbWk7Ci19Ci0KLS8qIERlZmluZSBhIG1lc3NhZ2V0YWJsZSByZXNvdXJjZS4gICovCi0KLXZvaWQKLWRlZmluZV9tZXNzYWdldGFibGUgKGlkLCByZXNpbmZvLCBmaWxlbmFtZSkKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIEZJTEUgKmU7Ci0gIGNoYXIgKnJlYWxfZmlsZW5hbWU7Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgZSA9IG9wZW5fZmlsZV9zZWFyY2ggKGZpbGVuYW1lLCBGT1BFTl9SQiwgIm1lc3NhZ2V0YWJsZSBmaWxlIiwKLQkJCSZyZWFsX2ZpbGVuYW1lKTsKLQotICBpZiAoc3RhdCAocmVhbF9maWxlbmFtZSwgJnMpIDwgMCkKLSAgICBmYXRhbCAoXygic3RhdCBmYWlsZWQgb24gYml0bWFwIGZpbGUgYCVzJzogJXMiKSwgcmVhbF9maWxlbmFtZSwKLQkgICBzdHJlcnJvciAoZXJybm8pKTsKLQotICBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzX2FsbG9jIChzLnN0X3NpemUpOwotCi0gIGdldF9kYXRhIChlLCBkYXRhLCBzLnN0X3NpemUsIHJlYWxfZmlsZW5hbWUpOwotCi0gIGZjbG9zZSAoZSk7Ci0gIGZyZWUgKHJlYWxfZmlsZW5hbWUpOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX01FU1NBR0VUQUJMRSwgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOwotCi0gIHItPnR5cGUgPSBSRVNfVFlQRV9NRVNTQUdFVEFCTEU7Ci0gIHItPnUuZGF0YS5sZW5ndGggPSBzLnN0X3NpemU7Ci0gIHItPnUuZGF0YS5kYXRhID0gZGF0YTsKLSAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKLX0KLQotLyogRGVmaW5lIGFuIHJjZGF0YSByZXNvdXJjZS4gICovCi0KLXZvaWQKLWRlZmluZV9yY2RhdGEgKGlkLCByZXNpbmZvLCBkYXRhKQotICAgICBzdHJ1Y3QgcmVzX2lkIGlkOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotICAgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKmRhdGE7Ci17Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfUkNEQVRBLCBpZCwKLQkJCQlyZXNpbmZvLT5sYW5ndWFnZSwgMCk7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9SQ0RBVEE7Ci0gIHItPnUucmNkYXRhID0gZGF0YTsKLSAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKLX0KLQotLyogQ3JlYXRlIGFuIHJjZGF0YSBpdGVtIGhvbGRpbmcgYSBzdHJpbmcuICAqLwotCi1zdHJ1Y3QgcmNkYXRhX2l0ZW0gKgotZGVmaW5lX3JjZGF0YV9zdHJpbmcgKHN0cmluZywgbGVuKQotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuOwotewotICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnJpOwotICBjaGFyICpzOwotCi0gIHJpID0gKHN0cnVjdCByY2RhdGFfaXRlbSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcmkpOwotICByaS0+bmV4dCA9IE5VTEw7Ci0gIHJpLT50eXBlID0gUkNEQVRBX1NUUklORzsKLSAgcmktPnUuc3RyaW5nLmxlbmd0aCA9IGxlbjsKLSAgcyA9IChjaGFyICopIHJlc19hbGxvYyAobGVuKTsKLSAgbWVtY3B5IChzLCBzdHJpbmcsIGxlbik7Ci0gIHJpLT51LnN0cmluZy5zID0gczsKLQotICByZXR1cm4gcmk7Ci19Ci0KLS8qIENyZWF0ZSBhbiByY2RhdGEgaXRlbSBob2xkaW5nIGEgbnVtYmVyLiAgKi8KLQotc3RydWN0IHJjZGF0YV9pdGVtICoKLWRlZmluZV9yY2RhdGFfbnVtYmVyICh2YWwsIGR3b3JkKQotICAgICB1bnNpZ25lZCBsb25nIHZhbDsKLSAgICAgaW50IGR3b3JkOwotewotICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnJpOwotCi0gIHJpID0gKHN0cnVjdCByY2RhdGFfaXRlbSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcmkpOwotICByaS0+bmV4dCA9IE5VTEw7Ci0gIHJpLT50eXBlID0gZHdvcmQgPyBSQ0RBVEFfRFdPUkQgOiBSQ0RBVEFfV09SRDsKLSAgcmktPnUud29yZCA9IHZhbDsKLQotICByZXR1cm4gcmk7Ci19Ci0KLS8qIERlZmluZSBhIHN0cmluZ3RhYmxlIHJlc291cmNlLiAgVGhpcyBpcyBjYWxsZWQgZm9yIGVhY2ggc3RyaW5nCi0gICB3aGljaCBhcHBlYXJzIGluIGEgU1RSSU5HVEFCTEUgc3RhdGVtZW50LiAgKi8KLQotdm9pZAotZGVmaW5lX3N0cmluZ3RhYmxlIChyZXNpbmZvLCBzdHJpbmdpZCwgc3RyaW5nKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotICAgICB1bnNpZ25lZCBsb25nIHN0cmluZ2lkOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCByZXNfaWQgaWQ7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgaWQubmFtZWQgPSAwOwotICBpZC51LmlkID0gKHN0cmluZ2lkID4+IDQpICsgMTsKLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfU1RSSU5HLCBpZCwKLQkJCQlyZXNpbmZvLT5sYW5ndWFnZSwgMSk7Ci0KLSAgaWYgKHItPnR5cGUgPT0gUkVTX1RZUEVfVU5JTklUSUFMSVpFRCkKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgci0+dHlwZSA9IFJFU19UWVBFX1NUUklOR1RBQkxFOwotICAgICAgci0+dS5zdHJpbmd0YWJsZSA9ICgoc3RydWN0IHN0cmluZ3RhYmxlICopCi0JCQkgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3RyaW5ndGFibGUpKSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQl7Ci0JICByLT51LnN0cmluZ3RhYmxlLT5zdHJpbmdzW2ldLmxlbmd0aCA9IDA7Ci0JICByLT51LnN0cmluZ3RhYmxlLT5zdHJpbmdzW2ldLnN0cmluZyA9IE5VTEw7Ci0JfQotCi0gICAgICByLT5yZXNfaW5mbyA9ICpyZXNpbmZvOwotICAgIH0KLQotICB1bmljb2RlX2Zyb21fYXNjaWkgKCZyLT51LnN0cmluZ3RhYmxlLT5zdHJpbmdzW3N0cmluZ2lkICYgMHhmXS5sZW5ndGgsCi0JCSAgICAgICZyLT51LnN0cmluZ3RhYmxlLT5zdHJpbmdzW3N0cmluZ2lkICYgMHhmXS5zdHJpbmcsCi0JCSAgICAgIHN0cmluZyk7Ci19Ci0KLS8qIERlZmluZSBhIHVzZXIgZGF0YSByZXNvdXJjZSB3aGVyZSB0aGUgZGF0YSBpcyBpbiB0aGUgcmMgZmlsZS4gICovCi0KLXZvaWQKLWRlZmluZV91c2VyX2RhdGEgKGlkLCB0eXBlLCByZXNpbmZvLCBkYXRhKQotICAgICBzdHJ1Y3QgcmVzX2lkIGlkOwotICAgICBzdHJ1Y3QgcmVzX2lkIHR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqZGF0YTsKLXsKLSAgc3RydWN0IHJlc19pZCBpZHNbM107Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgaWRzWzBdID0gdHlwZTsKLSAgaWRzWzFdID0gaWQ7Ci0gIGlkc1syXS5uYW1lZCA9IDA7Ci0gIGlkc1syXS51LmlkID0gcmVzaW5mby0+bGFuZ3VhZ2U7Ci0KLSAgciA9IGRlZmluZV9yZXNvdXJjZSAoJnJlc291cmNlcywgMywgaWRzLCAwKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX1VTRVJEQVRBOwotICByLT51LnVzZXJkYXRhID0gZGF0YTsKLSAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKLX0KLQotLyogRGVmaW5lIGEgdXNlciBkYXRhIHJlc291cmNlIHdoZXJlIHRoZSBkYXRhIGlzIGluIGEgZmlsZS4gICovCi0KLXZvaWQKLWRlZmluZV91c2VyX2ZpbGUgKGlkLCB0eXBlLCByZXNpbmZvLCBmaWxlbmFtZSkKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgc3RydWN0IHJlc19pZCB0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgRklMRSAqZTsKLSAgY2hhciAqcmVhbF9maWxlbmFtZTsKLSAgc3RydWN0IHN0YXQgczsKLSAgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgc3RydWN0IHJlc19pZCBpZHNbM107Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgZSA9IG9wZW5fZmlsZV9zZWFyY2ggKGZpbGVuYW1lLCBGT1BFTl9SQiwgImZvbnQgZmlsZSIsICZyZWFsX2ZpbGVuYW1lKTsKLQotICBpZiAoc3RhdCAocmVhbF9maWxlbmFtZSwgJnMpIDwgMCkKLSAgICBmYXRhbCAoXygic3RhdCBmYWlsZWQgb24gYml0bWFwIGZpbGUgYCVzJzogJXMiKSwgcmVhbF9maWxlbmFtZSwKLQkgICBzdHJlcnJvciAoZXJybm8pKTsKLQotICBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzX2FsbG9jIChzLnN0X3NpemUpOwotCi0gIGdldF9kYXRhIChlLCBkYXRhLCBzLnN0X3NpemUsIHJlYWxfZmlsZW5hbWUpOwotCi0gIGZjbG9zZSAoZSk7Ci0gIGZyZWUgKHJlYWxfZmlsZW5hbWUpOwotCi0gIGlkc1swXSA9IHR5cGU7Ci0gIGlkc1sxXSA9IGlkOwotICBpZHNbMl0ubmFtZWQgPSAwOwotICBpZHNbMl0udS5pZCA9IHJlc2luZm8tPmxhbmd1YWdlOwotCi0gIHIgPSBkZWZpbmVfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIDMsIGlkcywgMCk7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9VU0VSREFUQTsKLSAgci0+dS51c2VyZGF0YSA9ICgoc3RydWN0IHJjZGF0YV9pdGVtICopCi0JCSAgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcmNkYXRhX2l0ZW0pKSk7Ci0gIHItPnUudXNlcmRhdGEtPm5leHQgPSBOVUxMOwotICByLT51LnVzZXJkYXRhLT50eXBlID0gUkNEQVRBX0JVRkZFUjsKLSAgci0+dS51c2VyZGF0YS0+dS5idWZmZXIubGVuZ3RoID0gcy5zdF9zaXplOwotICByLT51LnVzZXJkYXRhLT51LmJ1ZmZlci5kYXRhID0gZGF0YTsKLSAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKLX0KLQotLyogRGVmaW5lIGEgdmVyc2lvbmluZm8gcmVzb3VyY2UuICAqLwotCi12b2lkCi1kZWZpbmVfdmVyc2lvbmluZm8gKGlkLCBsYW5ndWFnZSwgZml4ZWR2ZXJpbmZvLCB2ZXJpbmZvKQotICAgICBzdHJ1Y3QgcmVzX2lkIGlkOwotICAgICBpbnQgbGFuZ3VhZ2U7Ci0gICAgIHN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbyAqZml4ZWR2ZXJpbmZvOwotICAgICBzdHJ1Y3QgdmVyX2luZm8gKnZlcmluZm87Ci17Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfVkVSU0lPTiwgaWQsIGxhbmd1YWdlLCAwKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX1ZFUlNJT05JTkZPOwotICByLT51LnZlcnNpb25pbmZvID0gKChzdHJ1Y3QgdmVyc2lvbmluZm8gKikKLQkJICAgICAgcmVzX2FsbG9jIChzaXplb2YgKHN0cnVjdCB2ZXJzaW9uaW5mbykpKTsKLSAgci0+dS52ZXJzaW9uaW5mby0+Zml4ZWQgPSBmaXhlZHZlcmluZm87Ci0gIHItPnUudmVyc2lvbmluZm8tPnZhciA9IHZlcmluZm87Ci0gIHItPnJlc19pbmZvLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci19Ci0KLS8qIEFkZCBzdHJpbmcgdmVyc2lvbiBpbmZvIHRvIGEgbGlzdCBvZiB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IHZlcl9pbmZvICoKLWFwcGVuZF92ZXJfc3RyaW5nZmlsZWluZm8gKHZlcmluZm8sIGxhbmd1YWdlLCBzdHJpbmdzKQotICAgICBzdHJ1Y3QgdmVyX2luZm8gKnZlcmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKmxhbmd1YWdlOwotICAgICBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKnN0cmluZ3M7Ci17Ci0gIHN0cnVjdCB2ZXJfaW5mbyAqdmksICoqcHA7Ci0KLSAgdmkgPSAoc3RydWN0IHZlcl9pbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2aSk7Ci0gIHZpLT5uZXh0ID0gTlVMTDsKLSAgdmktPnR5cGUgPSBWRVJJTkZPX1NUUklORzsKLSAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZ2aS0+dS5zdHJpbmcubGFuZ3VhZ2UsIGxhbmd1YWdlKTsKLSAgdmktPnUuc3RyaW5nLnN0cmluZ3MgPSBzdHJpbmdzOwotCi0gIGZvciAocHAgPSAmdmVyaW5mbzsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotICAgIDsKLSAgKnBwID0gdmk7Ci0KLSAgcmV0dXJuIHZlcmluZm87Ci19Ci0KLS8qIEFkZCB2YXJpYWJsZSB2ZXJzaW9uIGluZm8gdG8gYSBsaXN0IG9mIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgdmVyX2luZm8gKgotYXBwZW5kX3Zlcl92YXJmaWxlaW5mbyAodmVyaW5mbywga2V5LCB2YXIpCi0gICAgIHN0cnVjdCB2ZXJfaW5mbyAqdmVyaW5mbzsKLSAgICAgY29uc3QgY2hhciAqa2V5OwotICAgICBzdHJ1Y3QgdmVyX3ZhcmluZm8gKnZhcjsKLXsKLSAgc3RydWN0IHZlcl9pbmZvICp2aSwgKipwcDsKLQotICB2aSA9IChzdHJ1Y3QgdmVyX2luZm8gKikgcmVzX2FsbG9jIChzaXplb2YgKnZpKTsKLSAgdmktPm5leHQgPSBOVUxMOwotICB2aS0+dHlwZSA9IFZFUklORk9fVkFSOwotICB1bmljb2RlX2Zyb21fYXNjaWkgKChpbnQgKikgTlVMTCwgJnZpLT51LnZhci5rZXksIGtleSk7Ci0gIHZpLT51LnZhci52YXIgPSB2YXI7Ci0KLSAgZm9yIChwcCA9ICZ2ZXJpbmZvOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0gICAgOwotICAqcHAgPSB2aTsKLQotICByZXR1cm4gdmVyaW5mbzsKLX0KLQotLyogQXBwZW5kIHZlcnNpb24gc3RyaW5nIGluZm9ybWF0aW9uIHRvIGEgbGlzdC4gICovCi0KLXN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqCi1hcHBlbmRfdmVydmFsIChzdHJpbmdzLCBrZXksIHZhbHVlKQotICAgICBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKnN0cmluZ3M7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgY29uc3QgY2hhciAqdmFsdWU7Ci17Ci0gIHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqdnMsICoqcHA7Ci0KLSAgdnMgPSAoc3RydWN0IHZlcl9zdHJpbmdpbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2cyk7Ci0gIHZzLT5uZXh0ID0gTlVMTDsKLSAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZ2cy0+a2V5LCBrZXkpOwotICB1bmljb2RlX2Zyb21fYXNjaWkgKChpbnQgKikgTlVMTCwgJnZzLT52YWx1ZSwgdmFsdWUpOwotCi0gIGZvciAocHAgPSAmc3RyaW5nczsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotICAgIDsKLSAgKnBwID0gdnM7Ci0KLSAgcmV0dXJuIHN0cmluZ3M7Ci19Ci0KLS8qIEFwcGVuZCB2ZXJzaW9uIHZhcmlhYmxlIGluZm9ybWF0aW9uIHRvIGEgbGlzdC4gICovCi0KLXN0cnVjdCB2ZXJfdmFyaW5mbyAqCi1hcHBlbmRfdmVydHJhbnMgKHZhciwgbGFuZ3VhZ2UsIGNoYXJzZXQpCi0gICAgIHN0cnVjdCB2ZXJfdmFyaW5mbyAqdmFyOwotICAgICB1bnNpZ25lZCBsb25nIGxhbmd1YWdlOwotICAgICB1bnNpZ25lZCBsb25nIGNoYXJzZXQ7Ci17Ci0gIHN0cnVjdCB2ZXJfdmFyaW5mbyAqdnYsICoqcHA7Ci0KLSAgdnYgPSAoc3RydWN0IHZlcl92YXJpbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2dik7Ci0gIHZ2LT5uZXh0ID0gTlVMTDsKLSAgdnYtPmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gIHZ2LT5jaGFyc2V0ID0gY2hhcnNldDsKLQotICBmb3IgKHBwID0gJnZhcjsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotICAgIDsKLSAgKnBwID0gdnY7Ci0KLSAgcmV0dXJuIHZhcjsKLX0KLQwKLS8qIExvY2FsIGZ1bmN0aW9ucyB1c2VkIHRvIHdyaXRlIG91dCBhbiByYyBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQgaW5kZW50IFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19kaXJlY3RvcnkKLSAgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosCi0JICAgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBpbnQgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19zdWJkaXIKLSAgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGludCAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX3Jlc291cmNlCi0gIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosCi0JICAgY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqLCBpbnQgKikpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfYWNjZWxlcmF0b3JzCi0gIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IGFjY2VsZXJhdG9yICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX2N1cnNvciBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBjdXJzb3IgKikpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfZ3JvdXBfY3Vyc29yCi0gIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IGdyb3VwX2N1cnNvciAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19kaWFsb2cgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgZGlhbG9nICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX2RpYWxvZ19jb250cm9sCi0gIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IGRpYWxvZ19jb250cm9sICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX2ZvbnRkaXIgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgZm9udGRpciAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19ncm91cF9pY29uIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IGdyb3VwX2ljb24gKikpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfbWVudSBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBtZW51ICosIGludCkpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfbWVudWl0ZW1zCi0gIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IG1lbnVpdGVtICosIGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19yY2RhdGEgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19zdHJpbmd0YWJsZQotICBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgY29uc3Qgc3RydWN0IHN0cmluZ3RhYmxlICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX3ZlcnNpb25pbmZvIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IHZlcnNpb25pbmZvICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX2ZpbGVkYXRhCi0gIFBBUkFNUyAoKEZJTEUgKiwgdW5zaWduZWQgbG9uZywgY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci0KLS8qIEluZGVudCBhIGdpdmVuIG51bWJlciBvZiBzcGFjZXMuICAqLwotCi1zdGF0aWMgdm9pZAotaW5kZW50IChlLCBjKQotICAgICBGSUxFICplOwotICAgICBpbnQgYzsKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLSAgICBwdXRjICgnICcsIGUpOwotfQotCi0vKiBEdW1wIHRoZSByZXNvdXJjZXMgd2UgaGF2ZSByZWFkIGluIHRoZSBmb3JtYXQgb2YgYW4gcmMgZmlsZS4KLQotICAgQWN0dWFsbHksIHdlIGRvbid0IHVzZSB0aGUgZm9ybWF0IG9mIGFuIHJjIGZpbGUsIGJlY2F1c2UgaXQncyB3YXkKLSAgIHRvbyBtdWNoIG9mIGEgcGFpbi0tZm9yIGV4YW1wbGUsIHdlJ2QgaGF2ZSB0byB3cml0ZSBpY29uIHJlc291cmNlcwotICAgaW50byBhIGZpbGUgYW5kIHJlZmVyIHRvIHRoYXQgZmlsZS4gIFdlIGp1c3QgZ2VuZXJhdGUgYSByZWFkYWJsZQotICAgZm9ybWF0IHRoYXQga2luZCBvZiBsb29rcyBsaWtlIGFuIHJjIGZpbGUsIGFuZCBpcyB1c2VmdWwgZm9yCi0gICB1bmRlcnN0YW5kaW5nIHRoZSBjb250ZW50cyBvZiBhIHJlc291cmNlIGZpbGUuICBTb21lZGF5IHdlIG1heSB3YW50Ci0gICB0byBnZW5lcmF0ZSBhbiByYyBmaWxlIHdoaWNoIHRoZSByYyBjb21waWxlciBjYW4gcmVhZDsgaWYgdGhhdCBkYXkKLSAgIGNvbWVzLCB0aGlzIGNvZGUgd2lsbCBoYXZlIHRvIGJlIGZpeGVkIHVwLiAgKi8KLQotdm9pZAotd3JpdGVfcmNfZmlsZSAoZmlsZW5hbWUsIHJlc291cmNlcykKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNvdXJjZXM7Ci17Ci0gIEZJTEUgKmU7Ci0gIGludCBsYW5ndWFnZTsKLQotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICBlID0gc3Rkb3V0OwotICBlbHNlCi0gICAgewotICAgICAgZSA9IGZvcGVuIChmaWxlbmFtZSwgRk9QRU5fV1QpOwotICAgICAgaWYgKGUgPT0gTlVMTCkKLQlmYXRhbCAoXygiY2FuJ3Qgb3BlbiBgJXMnIGZvciBvdXRwdXQ6ICVzIiksIGZpbGVuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICB9Ci0KLSAgbGFuZ3VhZ2UgPSAtMTsKLSAgd3JpdGVfcmNfZGlyZWN0b3J5IChlLCByZXNvdXJjZXMsIChjb25zdCBzdHJ1Y3QgcmVzX2lkICopIE5VTEwsCi0JCSAgICAgIChjb25zdCBzdHJ1Y3QgcmVzX2lkICopIE5VTEwsICZsYW5ndWFnZSwgMSk7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIGRpcmVjdG9yeS4gIEUgaXMgdGhlIGZpbGUgdG8gd3JpdGUgdG8uICBSRCBpcyB0aGUKLSAgIGRpcmVjdG9yeS4gIFRZUEUgaXMgYSBwb2ludGVyIHRvIHRoZSBsZXZlbCAxIElEIHdoaWNoIHNlcnZlcyBhcyB0aGUKLSAgIHJlc291cmNlIHR5cGUuICBOQU1FIGlzIGEgcG9pbnRlciB0byB0aGUgbGV2ZWwgMiBJRCB3aGljaCBzZXJ2ZXMgYXMKLSAgIGFuIGluZGl2aWR1YWwgcmVzb3VyY2UgbmFtZS4gIExBTkdVQUdFIGlzIGEgcG9pbnRlciB0byB0aGUgY3VycmVudAotICAgbGFuZ3VhZ2UuICBMRVZFTCBpcyB0aGUgbGV2ZWwgaW4gdGhlIHRyZWUuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfZGlyZWN0b3J5IChlLCByZCwgdHlwZSwgbmFtZSwgbGFuZ3VhZ2UsIGxldmVsKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7Ci0gICAgIGludCAqbGFuZ3VhZ2U7Ci0gICAgIGludCBsZXZlbDsKLXsKLSAgY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqcmU7Ci0KLSAgLyogUHJpbnQgb3V0IHNvbWUgQ09GRiBpbmZvcm1hdGlvbiB0aGF0IHJjIGZpbGVzIGNhbid0IHJlcHJlc2VudC4gICovCi0KLSAgaWYgKHJkLT50aW1lICE9IDApCi0gICAgZnByaW50ZiAoZSwgIi8vIFRpbWUgc3RhbXA6ICVsdVxuIiwgcmQtPnRpbWUpOwotICBpZiAocmQtPmNoYXJhY3RlcmlzdGljcyAhPSAwKQotICAgIGZwcmludGYgKGUsICIvLyBDaGFyYWN0ZXJpc3RpY3M6ICVsdVxuIiwgcmQtPmNoYXJhY3RlcmlzdGljcyk7Ci0gIGlmIChyZC0+bWFqb3IgIT0gMCB8fCByZC0+bWlub3IgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiLy8gVmVyc2lvbjogJWQgJWRcbiIsIHJkLT5tYWpvciwgcmQtPm1pbm9yKTsKLQotICBmb3IgKHJlID0gcmQtPmVudHJpZXM7ICByZSAhPSBOVUxMOyByZSA9IHJlLT5uZXh0KQotICAgIHsKLSAgICAgIHN3aXRjaCAobGV2ZWwpCi0JewotCWNhc2UgMToKLQkgIC8qIElmIHdlJ3JlIGF0IGxldmVsIDEsIHRoZSBrZXkgb2YgdGhpcyByZXNvdXJjZSBpcyB0aGUKLSAgICAgICAgICAgICB0eXBlLiAgVGhpcyBub3JtYWxseSBkdXBsaWNhdGVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlCi0gICAgICAgICAgICAgc3RvcmVkIHdpdGggdGhlIHJlc291cmNlIGl0c2VsZiwgYnV0IHdlIG5lZWQgdG8gcmVtZW1iZXIKLSAgICAgICAgICAgICB0aGUgdHlwZSBpZiB0aGlzIGlzIGEgdXNlciBkZWZpbmUgcmVzb3VyY2UgdHlwZS4gICovCi0JICB0eXBlID0gJnJlLT5pZDsKLQkgIGJyZWFrOwotCi0JY2FzZSAyOgotCSAgLyogSWYgd2UncmUgYXQgbGV2ZWwgMiwgdGhlIGtleSBvZiB0aGlzIHJlc291cmNlIGlzIHRoZSBuYW1lCi0JICAgICB3ZSBhcmUgZ29pbmcgdG8gdXNlIGluIHRoZSByYyBwcmludG91dC4gKi8KLQkgIG5hbWUgPSAmcmUtPmlkOwotCSAgYnJlYWs7Ci0KLQljYXNlIDM6Ci0JICAvKiBJZiB3ZSdyZSBhdCBsZXZlbCAzLCB0aGVuIHRoaXMga2V5IHJlcHJlc2VudHMgYSBsYW5ndWFnZS4KLQkgICAgIFVzZSBpdCB0byB1cGRhdGUgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuICAqLwotCSAgaWYgKCEgcmUtPmlkLm5hbWVkCi0JICAgICAgJiYgcmUtPmlkLnUuaWQgIT0gKHVuc2lnbmVkIGxvbmcpICh1bnNpZ25lZCBpbnQpICpsYW5ndWFnZQotCSAgICAgICYmIChyZS0+aWQudS5pZCAmIDB4ZmZmZikgPT0gcmUtPmlkLnUuaWQpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChlLCAiTEFOR1VBR0UgJWx1LCAlbHVcbiIsCi0JCSAgICAgICByZS0+aWQudS5pZCAmIDB4ZmYsIChyZS0+aWQudS5pZCA+PiA4KSAmIDB4ZmYpOwotCSAgICAgICpsYW5ndWFnZSA9IHJlLT5pZC51LmlkOwotCSAgICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChyZS0+c3ViZGlyKQotCXdyaXRlX3JjX3N1YmRpciAoZSwgcmUsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBsZXZlbCk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGxldmVsID09IDMpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIHRoZSBub3JtYWwgY2FzZTogdGhlIHRocmVlIGxldmVscyBhcmUKLSAgICAgICAgICAgICAgICAgVFlQRS9OQU1FL0xBTkdVQUdFLiAgTkFNRSB3aWxsIGhhdmUgYmVlbiBzZXQgYXQgbGV2ZWwKLSAgICAgICAgICAgICAgICAgMiwgYW5kIHJlcHJlc2VudHMgdGhlIG5hbWUgdG8gdXNlLiAgV2UgcHJvYmFibHkganVzdAotICAgICAgICAgICAgICAgICBzZXQgTEFOR1VBR0UsIGFuZCBpdCB3aWxsIHByb2JhYmx5IG1hdGNoIHdoYXQgdGhlCi0gICAgICAgICAgICAgICAgIHJlc291cmNlIGl0c2VsZiByZWNvcmRzIGlmIGFueXRoaW5nLiAgKi8KLQkgICAgICB3cml0ZV9yY19yZXNvdXJjZSAoZSwgdHlwZSwgbmFtZSwgcmUtPnUucmVzLCBsYW5ndWFnZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZwcmludGYgKGUsICIvLyBSZXNvdXJjZSBhdCB1bmV4cGVjdGVkIGxldmVsICVkXG4iLCBsZXZlbCk7Ci0JICAgICAgd3JpdGVfcmNfcmVzb3VyY2UgKGUsIHR5cGUsIChzdHJ1Y3QgcmVzX2lkICopIE5VTEwsIHJlLT51LnJlcywKLQkJCQkgbGFuZ3VhZ2UpOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogV3JpdGUgb3V0IGEgc3ViZGlyZWN0b3J5IGVudHJ5LiAgRSBpcyB0aGUgZmlsZSB0byB3cml0ZSB0by4gIFJFIGlzCi0gICB0aGUgc3ViZGlyZWN0b3J5IGVudHJ5LiAgVFlQRSBhbmQgTkFNRSBhcmUgcG9pbnRlcnMgdG8gaGlnaGVyIGxldmVsCi0gICBJRHMsIG9yIE5VTEwuICBMQU5HVUFHRSBpcyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuCi0gICBMRVZFTCBpcyB0aGUgbGV2ZWwgaW4gdGhlIHRyZWUuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfc3ViZGlyIChlLCByZSwgdHlwZSwgbmFtZSwgbGFuZ3VhZ2UsIGxldmVsKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICpyZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqbmFtZTsKLSAgICAgaW50ICpsYW5ndWFnZTsKLSAgICAgaW50IGxldmVsOwotewotICBmcHJpbnRmIChlLCAiXG4iKTsKLSAgc3dpdGNoIChsZXZlbCkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgZnByaW50ZiAoZSwgIi8vIFR5cGU6ICIpOwotICAgICAgaWYgKHJlLT5pZC5uYW1lZCkKLQlyZXNfaWRfcHJpbnQgKGUsIHJlLT5pZCwgMSk7Ci0gICAgICBlbHNlCi0JewotCSAgY29uc3QgY2hhciAqczsKLQotCSAgc3dpdGNoIChyZS0+aWQudS5pZCkKLQkgICAgewotCSAgICBjYXNlIFJUX0NVUlNPUjogcyA9ICJjdXJzb3IiOyBicmVhazsKLQkgICAgY2FzZSBSVF9CSVRNQVA6IHMgPSAiYml0bWFwIjsgYnJlYWs7Ci0JICAgIGNhc2UgUlRfSUNPTjogcyA9ICJpY29uIjsgYnJlYWs7Ci0JICAgIGNhc2UgUlRfTUVOVTogcyA9ICJtZW51IjsgYnJlYWs7Ci0JICAgIGNhc2UgUlRfRElBTE9HOiBzID0gImRpYWxvZyI7IGJyZWFrOwotCSAgICBjYXNlIFJUX1NUUklORzogcyA9ICJzdHJpbmd0YWJsZSI7IGJyZWFrOwotCSAgICBjYXNlIFJUX0ZPTlRESVI6IHMgPSAiZm9udGRpciI7IGJyZWFrOwotCSAgICBjYXNlIFJUX0ZPTlQ6IHMgPSAiZm9udCI7IGJyZWFrOwotCSAgICBjYXNlIFJUX0FDQ0VMRVJBVE9SOiBzID0gImFjY2VsZXJhdG9ycyI7IGJyZWFrOwotCSAgICBjYXNlIFJUX1JDREFUQTogcyA9ICJyY2RhdGEiOyBicmVhazsKLQkgICAgY2FzZSBSVF9NRVNTQUdFVEFCTEU6IHMgPSAibWVzc2FnZXRhYmxlIjsgYnJlYWs7Ci0JICAgIGNhc2UgUlRfR1JPVVBfQ1VSU09SOiBzID0gImdyb3VwIGN1cnNvciI7IGJyZWFrOwotCSAgICBjYXNlIFJUX0dST1VQX0lDT046IHMgPSAiZ3JvdXAgaWNvbiI7IGJyZWFrOwotCSAgICBjYXNlIFJUX1ZFUlNJT046IHMgPSAidmVyc2lvbiI7IGJyZWFrOwotCSAgICBjYXNlIFJUX0RMR0lOQ0xVREU6IHMgPSAiZGxnaW5jbHVkZSI7IGJyZWFrOwotCSAgICBjYXNlIFJUX1BMVUdQTEFZOiBzID0gInBsdWdwbGF5IjsgYnJlYWs7Ci0JICAgIGNhc2UgUlRfVlhEOiBzID0gInZ4ZCI7IGJyZWFrOwotCSAgICBjYXNlIFJUX0FOSUNVUlNPUjogcyA9ICJhbmljdXJzb3IiOyBicmVhazsKLQkgICAgY2FzZSBSVF9BTklJQ09OOiBzID0gImFuaWljb24iOyBicmVhazsKLQkgICAgZGVmYXVsdDogcyA9IE5VTEw7IGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIGZwcmludGYgKGUsICIlcyIsIHMpOwotCSAgZWxzZQotCSAgICByZXNfaWRfcHJpbnQgKGUsIHJlLT5pZCwgMSk7Ci0JfQotICAgICAgZnByaW50ZiAoZSwgIlxuIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjoKLSAgICAgIGZwcmludGYgKGUsICIvLyBOYW1lOiAiKTsKLSAgICAgIHJlc19pZF9wcmludCAoZSwgcmUtPmlkLCAxKTsKLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICBmcHJpbnRmIChlLCAiLy8gTGFuZ3VhZ2U6ICIpOwotICAgICAgcmVzX2lkX3ByaW50IChlLCByZS0+aWQsIDEpOwotICAgICAgZnByaW50ZiAoZSwgIlxuIik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChlLCAiLy8gTGV2ZWwgJWQ6ICIsIGxldmVsKTsKLSAgICAgIHJlc19pZF9wcmludCAoZSwgcmUtPmlkLCAxKTsKLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgIH0JCQotCi0gIHdyaXRlX3JjX2RpcmVjdG9yeSAoZSwgcmUtPnUuZGlyLCB0eXBlLCBuYW1lLCBsYW5ndWFnZSwgbGV2ZWwgKyAxKTsKLX0KLQotLyogV3JpdGUgb3V0IGEgc2luZ2xlIHJlc291cmNlLiAgRSBpcyB0aGUgZmlsZSB0byB3cml0ZSB0by4gIFRZUEUgaXMgYQotICAgcG9pbnRlciB0byB0aGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UuICBOQU1FIGlzIGEgcG9pbnRlciB0byB0aGUgbmFtZQotICAgb2YgdGhlIHJlc291cmNlOyBpdCB3aWxsIGJlIE5VTEwgaWYgdGhlcmUgaXMgYSBsZXZlbCBtaXNtYXRjaC4gIFJFUwotICAgaXMgdGhlIHJlc291cmNlIGRhdGEuICBMQU5HVUFHRSBpcyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQKLSAgIGxhbmd1YWdlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX3Jlc291cmNlIChlLCB0eXBlLCBuYW1lLCByZXMsIGxhbmd1YWdlKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyZXM7Ci0gICAgIGludCAqbGFuZ3VhZ2U7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIGludCBydDsKLSAgaW50IG1lbnVleCA9IDA7Ci0KLSAgZnByaW50ZiAoZSwgIlxuIik7Ci0KLSAgc3dpdGNoIChyZXMtPnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIGNhc2UgUkVTX1RZUEVfQUNDRUxFUkFUT1I6Ci0gICAgICBzID0gIkFDQ0VMRVJBVE9SIjsKLSAgICAgIHJ0ID0gUlRfQUNDRUxFUkFUT1I7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfQklUTUFQOgotICAgICAgcyA9ICJCSVRNQVAiOwotICAgICAgcnQgPSBSVF9CSVRNQVA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfQ1VSU09SOgotICAgICAgcyA9ICJDVVJTT1IiOwotICAgICAgcnQgPSBSVF9DVVJTT1I7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfR1JPVVBfQ1VSU09SOgotICAgICAgcyA9ICJHUk9VUF9DVVJTT1IiOwotICAgICAgcnQgPSBSVF9HUk9VUF9DVVJTT1I7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfRElBTE9HOgotICAgICAgaWYgKGV4dGVuZGVkX2RpYWxvZyAocmVzLT51LmRpYWxvZykpCi0JcyA9ICJESUFMT0dFWCI7Ci0gICAgICBlbHNlCi0JcyA9ICJESUFMT0ciOwotICAgICAgcnQgPSBSVF9ESUFMT0c7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfRk9OVDoKLSAgICAgIHMgPSAiRk9OVCI7Ci0gICAgICBydCA9IFJUX0ZPTlQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfRk9OVERJUjoKLSAgICAgIHMgPSAiRk9OVERJUiI7Ci0gICAgICBydCA9IFJUX0ZPTlRESVI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfSUNPTjoKLSAgICAgIHMgPSAiSUNPTiI7Ci0gICAgICBydCA9IFJUX0lDT047Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfR1JPVVBfSUNPTjoKLSAgICAgIHMgPSAiR1JPVVBfSUNPTiI7Ci0gICAgICBydCA9IFJUX0dST1VQX0lDT047Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfTUVOVToKLSAgICAgIGlmIChleHRlbmRlZF9tZW51IChyZXMtPnUubWVudSkpCi0JewotCSAgcyA9ICJNRU5VRVgiOwotCSAgbWVudWV4ID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcyA9ICJNRU5VIjsKLQkgIG1lbnVleCA9IDA7Ci0JfQotICAgICAgcnQgPSBSVF9NRU5VOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX01FU1NBR0VUQUJMRToKLSAgICAgIHMgPSAiTUVTU0FHRVRBQkxFIjsKLSAgICAgIHJ0ID0gUlRfTUVTU0FHRVRBQkxFOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX1JDREFUQToKLSAgICAgIHMgPSAiUkNEQVRBIjsKLSAgICAgIHJ0ID0gUlRfUkNEQVRBOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX1NUUklOR1RBQkxFOgotICAgICAgcyA9ICJTVFJJTkdUQUJMRSI7Ci0gICAgICBydCA9IFJUX1NUUklORzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9VU0VSREFUQToKLSAgICAgIHMgPSBOVUxMOwotICAgICAgcnQgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX1ZFUlNJT05JTkZPOgotICAgICAgcyA9ICJWRVJTSU9OSU5GTyI7Ci0gICAgICBydCA9IFJUX1ZFUlNJT047Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKHJ0ICE9IDAKLSAgICAgICYmIHR5cGUgIT0gTlVMTAotICAgICAgJiYgKHR5cGUtPm5hbWVkIHx8IHR5cGUtPnUuaWQgIT0gKHVuc2lnbmVkIGxvbmcpIHJ0KSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiLy8gVW5leHBlY3RlZCByZXNvdXJjZSB0eXBlIG1pc21hdGNoOiAiKTsKLSAgICAgIHJlc19pZF9wcmludCAoZSwgKnR5cGUsIDEpOwotICAgICAgZnByaW50ZiAoZSwgIiAhPSAlZCIsIHJ0KTsKLSAgICB9Ci0KLSAgaWYgKHJlcy0+Y29mZl9pbmZvLmNvZGVwYWdlICE9IDApCi0gICAgZnByaW50ZiAoZSwgIi8vIENvZGUgcGFnZTogJWx1XG4iLCByZXMtPmNvZmZfaW5mby5jb2RlcGFnZSk7Ci0gIGlmIChyZXMtPmNvZmZfaW5mby5yZXNlcnZlZCAhPSAwKQotICAgIGZwcmludGYgKGUsICIvLyBDT0ZGIHJlc2VydmVkIHZhbHVlOiAlbHVcbiIsIHJlcy0+Y29mZl9pbmZvLnJlc2VydmVkKTsKLQotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIHJlc19pZF9wcmludCAoZSwgKm5hbWUsIDApOwotICBlbHNlCi0gICAgZnByaW50ZiAoZSwgIj8/VW5rbm93bi1OYW1lPz8iKTsKLQotICBmcHJpbnRmIChlLCAiICIpOwotICBpZiAocyAhPSBOVUxMKQotICAgIGZwcmludGYgKGUsICIlcyIsIHMpOwotICBlbHNlIGlmICh0eXBlICE9IE5VTEwpCi0gICAgcmVzX2lkX3ByaW50IChlLCAqdHlwZSwgMCk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChlLCAiPz9Vbmtub3duLVR5cGU/PyIpOwotCi0gIGlmIChyZXMtPnJlc19pbmZvLm1lbWZsYWdzICE9IDApCi0gICAgewotICAgICAgaWYgKChyZXMtPnJlc19pbmZvLm1lbWZsYWdzICYgTUVNRkxBR19NT1ZFQUJMRSkgIT0gMCkKLQlmcHJpbnRmIChlLCAiIE1PVkVBQkxFIik7Ci0gICAgICBpZiAoKHJlcy0+cmVzX2luZm8ubWVtZmxhZ3MgJiBNRU1GTEFHX1BVUkUpICE9IDApCi0JZnByaW50ZiAoZSwgIiBQVVJFIik7Ci0gICAgICBpZiAoKHJlcy0+cmVzX2luZm8ubWVtZmxhZ3MgJiBNRU1GTEFHX1BSRUxPQUQpICE9IDApCi0JZnByaW50ZiAoZSwgIiBQUkVMT0FEIik7Ci0gICAgICBpZiAoKHJlcy0+cmVzX2luZm8ubWVtZmxhZ3MgJiBNRU1GTEFHX0RJU0NBUkRBQkxFKSAhPSAwKQotCWZwcmludGYgKGUsICIgRElTQ0FSREFCTEUiKTsKLSAgICB9Ci0KLSAgaWYgKHJlcy0+dHlwZSA9PSBSRVNfVFlQRV9ESUFMT0cpCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIiAlZCwgJWQsICVkLCAlZCIsIHJlcy0+dS5kaWFsb2ctPngsIHJlcy0+dS5kaWFsb2ctPnksCi0JICAgICAgIHJlcy0+dS5kaWFsb2ctPndpZHRoLCByZXMtPnUuZGlhbG9nLT5oZWlnaHQpOwotICAgICAgaWYgKHJlcy0+dS5kaWFsb2ctPmV4ICE9IE5VTEwKLQkgICYmIHJlcy0+dS5kaWFsb2ctPmV4LT5oZWxwICE9IDApCi0JZnByaW50ZiAoZSwgIiwgJWx1IiwgcmVzLT51LmRpYWxvZy0+ZXgtPmhlbHApOwotICAgIH0KLQotICBmcHJpbnRmIChlLCAiXG4iKTsKLQotICBpZiAoKHJlcy0+cmVzX2luZm8ubGFuZ3VhZ2UgIT0gMCAmJiByZXMtPnJlc19pbmZvLmxhbmd1YWdlICE9ICpsYW5ndWFnZSkKLSAgICAgIHx8IHJlcy0+cmVzX2luZm8uY2hhcmFjdGVyaXN0aWNzICE9IDAKLSAgICAgIHx8IHJlcy0+cmVzX2luZm8udmVyc2lvbiAhPSAwKQotICAgIHsKLSAgICAgIGludCBtb2RpZmllcnM7Ci0KLSAgICAgIHN3aXRjaCAocmVzLT50eXBlKQotCXsKLQljYXNlIFJFU19UWVBFX0FDQ0VMRVJBVE9SOgotCWNhc2UgUkVTX1RZUEVfRElBTE9HOgotCWNhc2UgUkVTX1RZUEVfTUVOVToKLQljYXNlIFJFU19UWVBFX1JDREFUQToKLQljYXNlIFJFU19UWVBFX1NUUklOR1RBQkxFOgotCSAgbW9kaWZpZXJzID0gMTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIG1vZGlmaWVycyA9IDA7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChyZXMtPnJlc19pbmZvLmxhbmd1YWdlICE9IDAgJiYgcmVzLT5yZXNfaW5mby5sYW5ndWFnZSAhPSAqbGFuZ3VhZ2UpCi0JZnByaW50ZiAoZSwgIiVzTEFOR1VBR0UgJWQsICVkXG4iLAotCQkgbW9kaWZpZXJzID8gIi8vICIgOiAiIiwKLQkJIHJlcy0+cmVzX2luZm8ubGFuZ3VhZ2UgJiAweGZmLAotCQkgKHJlcy0+cmVzX2luZm8ubGFuZ3VhZ2UgPj4gOCkgJiAweGZmKTsKLSAgICAgIGlmIChyZXMtPnJlc19pbmZvLmNoYXJhY3RlcmlzdGljcyAhPSAwKQotCWZwcmludGYgKGUsICIlc0NIQVJBQ1RFUklTVElDUyAlbHVcbiIsCi0JCSBtb2RpZmllcnMgPyAiLy8gIiA6ICIiLAotCQkgcmVzLT5yZXNfaW5mby5jaGFyYWN0ZXJpc3RpY3MpOwotICAgICAgaWYgKHJlcy0+cmVzX2luZm8udmVyc2lvbiAhPSAwKQotCWZwcmludGYgKGUsICIlc1ZFUlNJT04gJWx1XG4iLAotCQkgbW9kaWZpZXJzID8gIi8vICIgOiAiIiwKLQkJIHJlcy0+cmVzX2luZm8udmVyc2lvbik7Ci0gICAgfQotCi0gIHN3aXRjaCAocmVzLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0FDQ0VMRVJBVE9SOgotICAgICAgd3JpdGVfcmNfYWNjZWxlcmF0b3JzIChlLCByZXMtPnUuYWNjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9DVVJTT1I6Ci0gICAgICB3cml0ZV9yY19jdXJzb3IgKGUsIHJlcy0+dS5jdXJzb3IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0dST1VQX0NVUlNPUjoKLSAgICAgIHdyaXRlX3JjX2dyb3VwX2N1cnNvciAoZSwgcmVzLT51Lmdyb3VwX2N1cnNvcik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfRElBTE9HOgotICAgICAgd3JpdGVfcmNfZGlhbG9nIChlLCByZXMtPnUuZGlhbG9nKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9GT05URElSOgotICAgICAgd3JpdGVfcmNfZm9udGRpciAoZSwgcmVzLT51LmZvbnRkaXIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0dST1VQX0lDT046Ci0gICAgICB3cml0ZV9yY19ncm91cF9pY29uIChlLCByZXMtPnUuZ3JvdXBfaWNvbik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfTUVOVToKLSAgICAgIHdyaXRlX3JjX21lbnUgKGUsIHJlcy0+dS5tZW51LCBtZW51ZXgpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX1JDREFUQToKLSAgICAgIHdyaXRlX3JjX3JjZGF0YSAoZSwgcmVzLT51LnJjZGF0YSwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfU1RSSU5HVEFCTEU6Ci0gICAgICB3cml0ZV9yY19zdHJpbmd0YWJsZSAoZSwgbmFtZSwgcmVzLT51LnN0cmluZ3RhYmxlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9VU0VSREFUQToKLSAgICAgIHdyaXRlX3JjX3JjZGF0YSAoZSwgcmVzLT51LnVzZXJkYXRhLCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9WRVJTSU9OSU5GTzoKLSAgICAgIHdyaXRlX3JjX3ZlcnNpb25pbmZvIChlLCByZXMtPnUudmVyc2lvbmluZm8pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0JJVE1BUDoKLSAgICBjYXNlIFJFU19UWVBFX0ZPTlQ6Ci0gICAgY2FzZSBSRVNfVFlQRV9JQ09OOgotICAgIGNhc2UgUkVTX1RZUEVfTUVTU0FHRVRBQkxFOgotICAgICAgd3JpdGVfcmNfZmlsZWRhdGEgKGUsIHJlcy0+dS5kYXRhLmxlbmd0aCwgcmVzLT51LmRhdGEuZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIFdyaXRlIG91dCBhY2NlbGVyYXRvciBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yY19hY2NlbGVyYXRvcnMgKGUsIGFjY2VsZXJhdG9ycykKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IGFjY2VsZXJhdG9yICphY2NlbGVyYXRvcnM7Ci17Ci0gIGNvbnN0IHN0cnVjdCBhY2NlbGVyYXRvciAqYWNjOwotCi0gIGZwcmludGYgKGUsICJCRUdJTlxuIik7Ci0gIGZvciAoYWNjID0gYWNjZWxlcmF0b3JzOyBhY2MgIT0gTlVMTDsgYWNjID0gYWNjLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBwcmludGFibGU7Ci0KLSAgICAgIGZwcmludGYgKGUsICIgICIpOwotCi0gICAgICBpZiAoKGFjYy0+a2V5ICYgMHg3ZikgPT0gYWNjLT5rZXkKLQkgICYmIGlzcHJpbnQgKCh1bnNpZ25lZCBjaGFyKSBhY2MtPmtleSkKLQkgICYmIChhY2MtPmZsYWdzICYgQUNDX1ZJUlRLRVkpID09IDApCi0JewotCSAgZnByaW50ZiAoZSwgIlwiJWNcIiIsIGFjYy0+a2V5KTsKLQkgIHByaW50YWJsZSA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwcmludGYgKGUsICIlZCIsIGFjYy0+a2V5KTsKLQkgIHByaW50YWJsZSA9IDA7Ci0JfQotCi0gICAgICBmcHJpbnRmIChlLCAiLCAlZCIsIGFjYy0+aWQpOwotCi0gICAgICBpZiAoISBwcmludGFibGUpCi0JewotCSAgaWYgKChhY2MtPmZsYWdzICYgQUNDX1ZJUlRLRVkpICE9IDApCi0JICAgIGZwcmludGYgKGUsICIsIFZJUlRLRVkiKTsKLQkgIGVsc2UKLQkgICAgZnByaW50ZiAoZSwgIiwgQVNDSUkiKTsKLQl9Ci0KLSAgICAgIGlmICgoYWNjLT5mbGFncyAmIEFDQ19TSElGVCkgIT0gMCkKLQlmcHJpbnRmIChlLCAiLCBTSElGVCIpOwotICAgICAgaWYgKChhY2MtPmZsYWdzICYgQUNDX0NPTlRST0wpICE9IDApCi0JZnByaW50ZiAoZSwgIiwgQ09OVFJPTCIpOwotICAgICAgaWYgKChhY2MtPmZsYWdzICYgQUNDX0FMVCkgIT0gMCkKLQlmcHJpbnRmIChlLCAiLCBBTFQiKTsKLQotICAgICAgZnByaW50ZiAoZSwgIlxuIik7Ci0gICAgfQotCi0gIGZwcmludGYgKGUsICJFTkRcbiIpOwotfQotCi0vKiBXcml0ZSBvdXQgY3Vyc29yIGluZm9ybWF0aW9uLiAgVGhpcyB3b3VsZCBub3JtYWxseSBiZSBpbiBhIHNlcGFyYXRlCi0gICBmaWxlLCB3aGljaCB0aGUgcmMgZmlsZSB3b3VsZCBpbmNsdWRlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX2N1cnNvciAoZSwgY3Vyc29yKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgY3Vyc29yICpjdXJzb3I7Ci17Ci0gIGZwcmludGYgKGUsICIvLyBIb3RzcG90OiB4OiAlZDsgeTogJWRcbiIsIGN1cnNvci0+eGhvdHNwb3QsCi0JICAgY3Vyc29yLT55aG90c3BvdCk7Ci0gIHdyaXRlX3JjX2ZpbGVkYXRhIChlLCBjdXJzb3ItPmxlbmd0aCwgY3Vyc29yLT5kYXRhKTsKLX0KLQotLyogV3JpdGUgb3V0IGdyb3VwIGN1cnNvciBkYXRhLiAgVGhpcyB3b3VsZCBub3JtYWxseSBiZSBidWlsdCBmcm9tIHRoZQotICAgY3Vyc29yIGRhdGEuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfZ3JvdXBfY3Vyc29yIChlLCBncm91cF9jdXJzb3IpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCBncm91cF9jdXJzb3IgKmdyb3VwX2N1cnNvcjsKLXsKLSAgY29uc3Qgc3RydWN0IGdyb3VwX2N1cnNvciAqZ2M7Ci0KLSAgZm9yIChnYyA9IGdyb3VwX2N1cnNvcjsgZ2MgIT0gTlVMTDsgZ2MgPSBnYy0+bmV4dCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiLy8gd2lkdGg6ICVkOyBoZWlnaHQgJWQ7IHBsYW5lcyAlZDsgYml0cyAlZFxuIiwKLQkgICAgIGdjLT53aWR0aCwgZ2MtPmhlaWdodCwgZ2MtPnBsYW5lcywgZ2MtPmJpdHMpOwotICAgICAgZnByaW50ZiAoZSwgIi8vIGRhdGEgYnl0ZXM6ICVsdTsgaW5kZXg6ICVkXG4iLAotCSAgICAgICBnYy0+Ynl0ZXMsIGdjLT5pbmRleCk7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBkaWFsb2cgZGF0YS4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yY19kaWFsb2cgKGUsIGRpYWxvZykKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IGRpYWxvZyAqZGlhbG9nOwotewotICBjb25zdCBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKmNvbnRyb2w7Ci0KLSAgaWYgKGRpYWxvZy0+c3R5bGUgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiU1RZTEUgMHglbHhcbiIsIGRpYWxvZy0+c3R5bGUpOwotICBpZiAoZGlhbG9nLT5leHN0eWxlICE9IDApCi0gICAgZnByaW50ZiAoZSwgIkVYU1RZTEUgMHglbHhcbiIsIGRpYWxvZy0+ZXhzdHlsZSk7Ci0gIGlmICgoZGlhbG9nLT5jbGFzcy5uYW1lZCAmJiBkaWFsb2ctPmNsYXNzLnUubi5sZW5ndGggPiAwKQotICAgICAgfHwgZGlhbG9nLT5jbGFzcy51LmlkICE9IDApCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIkNMQVNTICIpOwotICAgICAgcmVzX2lkX3ByaW50IChlLCBkaWFsb2ctPmNsYXNzLCAwKTsKLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgIH0KLSAgaWYgKGRpYWxvZy0+Y2FwdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICJDQVBUSU9OIFwiIik7Ci0gICAgICB1bmljb2RlX3ByaW50IChlLCBkaWFsb2ctPmNhcHRpb24sIC0xKTsKLSAgICAgIGZwcmludGYgKGUsICJcIlxuIik7Ci0gICAgfQotICBpZiAoKGRpYWxvZy0+bWVudS5uYW1lZCAmJiBkaWFsb2ctPm1lbnUudS5uLmxlbmd0aCA+IDApCi0gICAgICB8fCBkaWFsb2ctPm1lbnUudS5pZCAhPSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICJNRU5VICIpOwotICAgICAgcmVzX2lkX3ByaW50IChlLCBkaWFsb2ctPm1lbnUsIDApOwotICAgICAgZnByaW50ZiAoZSwgIlxuIik7Ci0gICAgfQotICBpZiAoZGlhbG9nLT5mb250ICE9IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIkZPTlQgJWQsIFwiIiwgZGlhbG9nLT5wb2ludHNpemUpOwotICAgICAgdW5pY29kZV9wcmludCAoZSwgZGlhbG9nLT5mb250LCAtMSk7Ci0gICAgICBmcHJpbnRmIChlLCAiXCIiKTsKLSAgICAgIGlmIChkaWFsb2ctPmV4ICE9IE5VTEwKLQkgICYmIChkaWFsb2ctPmV4LT53ZWlnaHQgIT0gMCB8fCBkaWFsb2ctPmV4LT5pdGFsaWMgIT0gMCkpCi0JZnByaW50ZiAoZSwgIiwgJWQsICVkIiwgZGlhbG9nLT5leC0+d2VpZ2h0LCBkaWFsb2ctPmV4LT5pdGFsaWMpOwotICAgICAgZnByaW50ZiAoZSwgIlxuIik7Ci0gICAgfQotCi0gIGZwcmludGYgKGUsICJCRUdJTlxuIik7Ci0KLSAgZm9yIChjb250cm9sID0gZGlhbG9nLT5jb250cm9sczsgY29udHJvbCAhPSBOVUxMOyBjb250cm9sID0gY29udHJvbC0+bmV4dCkKLSAgICB3cml0ZV9yY19kaWFsb2dfY29udHJvbCAoZSwgY29udHJvbCk7Ci0KLSAgZnByaW50ZiAoZSwgIkVORFxuIik7Ci19Ci0KLS8qIEZvciBlYWNoIHByZWRlZmluZWQgY29udHJvbCBrZXl3b3JkLCB0aGlzIHRhYmxlIHByb3ZpZGVzIHRoZSBjbGFzcwotICAgYW5kIHRoZSBzdHlsZS4gICovCi0KLXN0cnVjdCBjb250cm9sX2luZm8KLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgc2hvcnQgY2xhc3M7Ci0gIHVuc2lnbmVkIGxvbmcgc3R5bGU7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNvbnRyb2xfaW5mbyBjb250cm9sX2luZm9bXSA9Ci17Ci0gIHsgIkFVVE8zU1RBVEUiLCBDVExfQlVUVE9OLCBCU19BVVRPM1NUQVRFIH0sCi0gIHsgIkFVVE9DSEVDS0JPWCIsIENUTF9CVVRUT04sIEJTX0FVVE9DSEVDS0JPWCB9LAotICB7ICJBVVRPUkFESU9CVVRUT04iLCBDVExfQlVUVE9OLCBCU19BVVRPUkFESU9CVVRUT04gfSwKLSAgeyAiQ0hFQ0tCT1giLCBDVExfQlVUVE9OLCBCU19DSEVDS0JPWCB9LAotICB7ICJDT01CT0JPWCIsIENUTF9DT01CT0JPWCwgKHVuc2lnbmVkIGxvbmcpIC0xIH0sCi0gIHsgIkNURVhUIiwgQ1RMX1NUQVRJQywgU1NfQ0VOVEVSIH0sCi0gIHsgIkRFRlBVU0hCVVRUT04iLCBDVExfQlVUVE9OLCBCU19ERUZQVVNIQlVUVE9OIH0sCi0gIHsgIkVESVRURVhUIiwgQ1RMX0VESVQsICh1bnNpZ25lZCBsb25nKSAtMSB9LAotICB7ICJHUk9VUEJPWCIsIENUTF9CVVRUT04sIEJTX0dST1VQQk9YIH0sCi0gIHsgIklDT04iLCBDVExfU1RBVElDLCBTU19JQ09OIH0sCi0gIHsgIkxJU1RCT1giLCBDVExfTElTVEJPWCwgKHVuc2lnbmVkIGxvbmcpIC0xIH0sCi0gIHsgIkxURVhUIiwgQ1RMX1NUQVRJQywgU1NfTEVGVCB9LAotICB7ICJQVVNIQk9YIiwgQ1RMX0JVVFRPTiwgQlNfUFVTSEJPWCB9LAotICB7ICJQVVNIQlVUVE9OIiwgQ1RMX0JVVFRPTiwgQlNfUFVTSEJVVFRPTiB9LAotICB7ICJSQURJT0JVVFRPTiIsIENUTF9CVVRUT04sIEJTX1JBRElPQlVUVE9OIH0sCi0gIHsgIlJURVhUIiwgQ1RMX1NUQVRJQywgU1NfUklHSFQgfSwKLSAgeyAiU0NST0xMQkFSIiwgQ1RMX1NDUk9MTEJBUiwgKHVuc2lnbmVkIGxvbmcpIC0xIH0sCi0gIHsgIlNUQVRFMyIsIENUTF9CVVRUT04sIEJTXzNTVEFURSB9LAotICAvKiBJdCdzIGltcG9ydGFudCB0aGF0IFVTRVJCVVRUT04gY29tZSBhZnRlciBhbGwgdGhlIG90aGVyIGJ1dHRvbgotICAgICB0eXBlcywgc28gdGhhdCBpdCB3b24ndCBiZSBtYXRjaGVkIHRvbyBlYXJseS4gICovCi0gIHsgIlVTRVJCVVRUT04iLCBDVExfQlVUVE9OLCAodW5zaWduZWQgbG9uZykgLTEgfSwKLSAgeyBOVUxMLCAwLCAwIH0KLX07Ci0KLS8qIFdyaXRlIGEgZGlhbG9nIGNvbnRyb2wuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfZGlhbG9nX2NvbnRyb2wgKGUsIGNvbnRyb2wpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCBkaWFsb2dfY29udHJvbCAqY29udHJvbDsKLXsKLSAgY29uc3Qgc3RydWN0IGNvbnRyb2xfaW5mbyAqY2k7Ci0KLSAgZnByaW50ZiAoZSwgIiAgIik7Ci0KLSAgaWYgKGNvbnRyb2wtPmNsYXNzLm5hbWVkKQotICAgIGNpID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoY2kgPSBjb250cm9sX2luZm87IGNpLT5uYW1lICE9IE5VTEw7ICsrY2kpCi0JaWYgKGNpLT5jbGFzcyA9PSBjb250cm9sLT5jbGFzcy51LmlkCi0JICAgICYmIChjaS0+c3R5bGUgPT0gKHVuc2lnbmVkIGxvbmcpIC0xCi0JCXx8IGNpLT5zdHlsZSA9PSAoY29udHJvbC0+c3R5bGUgJiAweGZmKSkpCi0JICBicmVhazsKLSAgICB9Ci0gIGlmIChjaSA9PSBOVUxMKQotICAgIGZwcmludGYgKGUsICJDT05UUk9MIik7Ci0gIGVsc2UgaWYgKGNpLT5uYW1lICE9IE5VTEwpCi0gICAgZnByaW50ZiAoZSwgIiVzIiwgY2ktPm5hbWUpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZSwgIkNPTlRST0wiKTsKLSAgCi0gIGlmIChjb250cm9sLT50ZXh0Lm5hbWVkIHx8IGNvbnRyb2wtPnRleHQudS5pZCAhPSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICIgIik7Ci0gICAgICByZXNfaWRfcHJpbnQgKGUsIGNvbnRyb2wtPnRleHQsIDEpOwotICAgICAgZnByaW50ZiAoZSwgIiwiKTsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZSwgIiAlZCwgIiwgY29udHJvbC0+aWQpOwotCi0gIGlmIChjaSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChjb250cm9sLT5jbGFzcy5uYW1lZCkKLQlmcHJpbnRmIChlLCAiXCIiKTsKLSAgICAgIHJlc19pZF9wcmludCAoZSwgY29udHJvbC0+Y2xhc3MsIDApOwotICAgICAgaWYgKGNvbnRyb2wtPmNsYXNzLm5hbWVkKQotCWZwcmludGYgKGUsICJcIiIpOwotICAgICAgZnByaW50ZiAoZSwgIiwgMHglbHgsICIsIGNvbnRyb2wtPnN0eWxlKTsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZSwgIiVkLCAlZCIsIGNvbnRyb2wtPngsIGNvbnRyb2wtPnkpOwotCi0gIGlmIChjb250cm9sLT5zdHlsZSAhPSBTU19JQ09OCi0gICAgICB8fCBjb250cm9sLT5leHN0eWxlICE9IDAKLSAgICAgIHx8IGNvbnRyb2wtPndpZHRoICE9IDAKLSAgICAgIHx8IGNvbnRyb2wtPmhlaWdodCAhPSAwCi0gICAgICB8fCBjb250cm9sLT5oZWxwICE9IDApCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIiwgJWQsICVkIiwgY29udHJvbC0+d2lkdGgsIGNvbnRyb2wtPmhlaWdodCk7Ci0KLSAgICAgIC8qIEZJWE1FOiBXZSBkb24ndCBuZWVkIHRvIHByaW50IHRoZSBzdHlsZSBpZiBpdCBpcyB0aGUgZGVmYXVsdC4KLQkgTW9yZSBpbXBvcnRhbnRseSwgaW4gY2VydGFpbiBjYXNlcyB3ZSBhY3R1YWxseSBuZWVkIHRvIHR1cm4KLQkgb2ZmIHBhcnRzIG9mIHRoZSBmb3JjZWQgc3R5bGUsIGJ5IHVzaW5nIE5PVC4gICovCi0gICAgICBmcHJpbnRmIChlLCAiLCAweCVseCIsIGNvbnRyb2wtPnN0eWxlKTsKLQotICAgICAgaWYgKGNvbnRyb2wtPmV4c3R5bGUgIT0gMCB8fCBjb250cm9sLT5oZWxwICE9IDApCi0JZnByaW50ZiAoZSwgIiwgMHglbHgsICVsdSIsIGNvbnRyb2wtPmV4c3R5bGUsIGNvbnRyb2wtPmhlbHApOwotICAgIH0KLQotICBmcHJpbnRmIChlLCAiXG4iKTsKLQotICBpZiAoY29udHJvbC0+ZGF0YSAhPSBOVUxMKQotICAgIHdyaXRlX3JjX3JjZGF0YSAoZSwgY29udHJvbC0+ZGF0YSwgMik7Ci19Ci0KLS8qIFdyaXRlIG91dCBmb250IGRpcmVjdG9yeSBkYXRhLiAgVGhpcyB3b3VsZCBub3JtYWxseSBiZSBidWlsdCBmcm9tCi0gICB0aGUgZm9udCBkYXRhLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX2ZvbnRkaXIgKGUsIGZvbnRkaXIpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCBmb250ZGlyICpmb250ZGlyOwotewotICBjb25zdCBzdHJ1Y3QgZm9udGRpciAqZmM7Ci0KLSAgZm9yIChmYyA9IGZvbnRkaXI7IGZjICE9IE5VTEw7IGZjID0gZmMtPm5leHQpCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIi8vIEZvbnQgaW5kZXg6ICVkXG4iLCBmYy0+aW5kZXgpOwotICAgICAgd3JpdGVfcmNfZmlsZWRhdGEgKGUsIGZjLT5sZW5ndGgsIGZjLT5kYXRhKTsKLSAgICB9Ci19Ci0KLS8qIFdyaXRlIG91dCBncm91cCBpY29uIGRhdGEuICBUaGlzIHdvdWxkIG5vcm1hbGx5IGJlIGJ1aWx0IGZyb20gdGhlCi0gICBpY29uIGRhdGEuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfZ3JvdXBfaWNvbiAoZSwgZ3JvdXBfaWNvbikKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IGdyb3VwX2ljb24gKmdyb3VwX2ljb247Ci17Ci0gIGNvbnN0IHN0cnVjdCBncm91cF9pY29uICpnaTsKLQotICBmb3IgKGdpID0gZ3JvdXBfaWNvbjsgZ2kgIT0gTlVMTDsgZ2kgPSBnaS0+bmV4dCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiLy8gd2lkdGg6ICVkOyBoZWlnaHQgJWQ7IGNvbG9yczogJWQ7IHBsYW5lcyAlZDsgYml0cyAlZFxuIiwKLQkgICAgICAgZ2ktPndpZHRoLCBnaS0+aGVpZ2h0LCBnaS0+Y29sb3JzLCBnaS0+cGxhbmVzLCBnaS0+Yml0cyk7Ci0gICAgICBmcHJpbnRmIChlLCAiLy8gZGF0YSBieXRlczogJWx1OyBpbmRleDogJWRcbiIsCi0JICAgICAgIGdpLT5ieXRlcywgZ2ktPmluZGV4KTsKLSAgICB9Ci19Ci0KLS8qIFdyaXRlIG91dCBhIG1lbnUgcmVzb3VyY2UuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfbWVudSAoZSwgbWVudSwgbWVudWV4KQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgbWVudSAqbWVudTsKLSAgICAgaW50IG1lbnVleDsKLXsKLSAgaWYgKG1lbnUtPmhlbHAgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiLy8gSGVscCBJRDogJWx1XG4iLCBtZW51LT5oZWxwKTsKLSAgd3JpdGVfcmNfbWVudWl0ZW1zIChlLCBtZW51LT5pdGVtcywgbWVudWV4LCAwKTsKLX0KLQotLyogV3JpdGUgb3V0IG1lbnVpdGVtcy4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yY19tZW51aXRlbXMgKGUsIG1lbnVpdGVtcywgbWVudWV4LCBpbmQpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqbWVudWl0ZW1zOwotICAgICBpbnQgbWVudWV4OwotICAgICBpbnQgaW5kOwotewotICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKm1pOwotCi0gIGluZGVudCAoZSwgaW5kKTsKLSAgZnByaW50ZiAoZSwgIkJFR0lOXG4iKTsKLQotICBmb3IgKG1pID0gbWVudWl0ZW1zOyBtaSAhPSBOVUxMOyBtaSA9IG1pLT5uZXh0KQotICAgIHsKLSAgICAgIGluZGVudCAoZSwgaW5kICsgMik7Ci0KLSAgICAgIGlmIChtaS0+cG9wdXAgPT0gTlVMTCkKLQlmcHJpbnRmIChlLCAiTUVOVUlURU0iKTsKLSAgICAgIGVsc2UKLQlmcHJpbnRmIChlLCAiUE9QVVAiKTsKLQotICAgICAgaWYgKCEgbWVudWV4Ci0JICAmJiBtaS0+cG9wdXAgPT0gTlVMTAotCSAgJiYgbWktPnRleHQgPT0gTlVMTAotCSAgJiYgbWktPnR5cGUgPT0gMAotCSAgJiYgbWktPmlkID09IDApCi0JewotCSAgZnByaW50ZiAoZSwgIiBTRVBBUkFUT1JcbiIpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAobWktPnRleHQgPT0gTlVMTCkKLQlmcHJpbnRmIChlLCAiIFwiXCIiKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBmcHJpbnRmIChlLCAiIFwiIik7Ci0JICB1bmljb2RlX3ByaW50IChlLCBtaS0+dGV4dCwgLTEpOwotCSAgZnByaW50ZiAoZSwgIlwiIik7Ci0JfQotCi0gICAgICBpZiAoISBtZW51ZXgpCi0JewotCSAgaWYgKG1pLT5wb3B1cCA9PSBOVUxMKQotCSAgICBmcHJpbnRmIChlLCAiLCAlZCIsIG1pLT5pZCk7Ci0KLQkgIGlmICgobWktPnR5cGUgJiBNRU5VSVRFTV9DSEVDS0VEKSAhPSAwKQotCSAgICBmcHJpbnRmIChlLCAiLCBDSEVDS0VEIik7Ci0JICBpZiAoKG1pLT50eXBlICYgTUVOVUlURU1fR1JBWUVEKSAhPSAwKQotCSAgICBmcHJpbnRmIChlLCAiLCBHUkFZRUQiKTsKLQkgIGlmICgobWktPnR5cGUgJiBNRU5VSVRFTV9IRUxQKSAhPSAwKQotCSAgICBmcHJpbnRmIChlLCAiLCBIRUxQIik7Ci0JICBpZiAoKG1pLT50eXBlICYgTUVOVUlURU1fSU5BQ1RJVkUpICE9IDApCi0JICAgIGZwcmludGYgKGUsICIsIElOQUNUSVZFIik7Ci0JICBpZiAoKG1pLT50eXBlICYgTUVOVUlURU1fTUVOVUJBUkJSRUFLKSAhPSAwKQotCSAgICBmcHJpbnRmIChlLCAiLCBNRU5VQkFSQlJFQUsiKTsKLQkgIGlmICgobWktPnR5cGUgJiBNRU5VSVRFTV9NRU5VQlJFQUspICE9IDApCi0JICAgIGZwcmludGYgKGUsICIsIE1FTlVCUkVBSyIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAobWktPmlkICE9IDAgfHwgbWktPnR5cGUgIT0gMCB8fCBtaS0+c3RhdGUgIT0gMCB8fCBtaS0+aGVscCAhPSAwKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoZSwgIiwgJWQiLCBtaS0+aWQpOwotCSAgICAgIGlmIChtaS0+dHlwZSAhPSAwIHx8IG1pLT5zdGF0ZSAhPSAwIHx8IG1pLT5oZWxwICE9IDApCi0JCXsKLQkJICBmcHJpbnRmIChlLCAiLCAlbHUiLCBtaS0+dHlwZSk7Ci0JCSAgaWYgKG1pLT5zdGF0ZSAhPSAwIHx8IG1pLT5oZWxwICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGZwcmludGYgKGUsICIsICVsdSIsIG1pLT5zdGF0ZSk7Ci0JCSAgICAgIGlmIChtaS0+aGVscCAhPSAwKQotCQkJZnByaW50ZiAoZSwgIiwgJWx1IiwgbWktPmhlbHApOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotCi0gICAgICBpZiAobWktPnBvcHVwICE9IE5VTEwpCi0Jd3JpdGVfcmNfbWVudWl0ZW1zIChlLCBtaS0+cG9wdXAsIG1lbnVleCwgaW5kICsgMik7Ci0gICAgfQotCi0gIGluZGVudCAoZSwgaW5kKTsKLSAgZnByaW50ZiAoZSwgIkVORFxuIik7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiByY2RhdGEgcmVzb3VyY2UuICBUaGlzIGlzIGFsc28gdXNlZCBmb3Igb3RoZXIgdHlwZXMgb2YKLSAgIHJlc291cmNlcyB0aGF0IG5lZWQgdG8gcHJpbnQgYXJiaXRyYXJ5IGRhdGEuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfcmNkYXRhIChlLCByY2RhdGEsIGluZCkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IHJjZGF0YV9pdGVtICpyY2RhdGE7Ci0gICAgIGludCBpbmQ7Ci17Ci0gIGNvbnN0IHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7Ci0KLSAgaW5kZW50IChlLCBpbmQpOwotICBmcHJpbnRmIChlLCAiQkVHSU5cbiIpOwotCi0gIGZvciAocmkgPSByY2RhdGE7IHJpICE9IE5VTEw7IHJpID0gcmktPm5leHQpCi0gICAgewotICAgICAgaWYgKHJpLT50eXBlID09IFJDREFUQV9CVUZGRVIgJiYgcmktPnUuYnVmZmVyLmxlbmd0aCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpbmRlbnQgKGUsIGluZCArIDIpOwotCi0gICAgICBzd2l0Y2ggKHJpLT50eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0KLQljYXNlIFJDREFUQV9XT1JEOgotCSAgZnByaW50ZiAoZSwgIiVkIiwgcmktPnUud29yZCk7Ci0JICBicmVhazsKLQotCWNhc2UgUkNEQVRBX0RXT1JEOgotCSAgZnByaW50ZiAoZSwgIiVsdUwiLCByaS0+dS5kd29yZCk7Ci0JICBicmVhazsKLQotCWNhc2UgUkNEQVRBX1NUUklORzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqczsKLQkgICAgdW5zaWduZWQgbG9uZyBpOwotCi0JICAgIGZwcmludGYgKGUsICJcIiIpOwotCSAgICBzID0gcmktPnUuc3RyaW5nLnM7Ci0JICAgIGZvciAoaSA9IDA7IGkgPCByaS0+dS5zdHJpbmcubGVuZ3RoOyBpKyspCi0JICAgICAgewotCQlpZiAoaXNwcmludCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJICBwdXRjICgqcywgZSk7Ci0JCWVsc2UKLQkJICBmcHJpbnRmIChlLCAiXFwlMDNvIiwgKnMpOwotCSAgICAgIH0KLQkgICAgZnByaW50ZiAoZSwgIlwiIik7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FzZSBSQ0RBVEFfV1NUUklORzoKLQkgIGZwcmludGYgKGUsICJMXCIiKTsKLQkgIHVuaWNvZGVfcHJpbnQgKGUsIHJpLT51LndzdHJpbmcudywgcmktPnUud3N0cmluZy5sZW5ndGgpOwotCSAgZnByaW50ZiAoZSwgIlwiIik7Ci0JICBicmVhazsKLQotCWNhc2UgUkNEQVRBX0JVRkZFUjoKLQkgIHsKLQkgICAgdW5zaWduZWQgbG9uZyBpOwotCSAgICBpbnQgZmlyc3Q7Ci0KLQkgICAgLyogQXNzdW1lIGxpdHRsZSBlbmRpYW4gZGF0YS4gICovCi0KLQkgICAgZmlyc3QgPSAxOwotCSAgICBmb3IgKGkgPSAwOyBpICsgMyA8IHJpLT51LmJ1ZmZlci5sZW5ndGg7IGkgKz0gNCkKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGxvbmcgbDsKLQotCQlsID0gKCgoKCgocmktPnUuYnVmZmVyLmRhdGFbaSArIDNdIDw8IDgpCi0JCQkgfCByaS0+dS5idWZmZXIuZGF0YVtpICsgMl0pIDw8IDgpCi0JCSAgICAgICB8IHJpLT51LmJ1ZmZlci5kYXRhW2kgKyAxXSkgPDwgOCkKLQkJICAgICB8IHJpLT51LmJ1ZmZlci5kYXRhW2ldKTsKLQkJaWYgKGZpcnN0KQotCQkgIGZpcnN0ID0gMDsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGZwcmludGYgKGUsICIsXG4iKTsKLQkJICAgIGluZGVudCAoZSwgaW5kICsgMik7Ci0JCSAgfQotCQlmcHJpbnRmIChlLCAiJWx1TCIsIGwpOwotCSAgICAgIH0KLQotCSAgICBpZiAoaSArIDEgPCByaS0+dS5idWZmZXIubGVuZ3RoKQotCSAgICAgIHsKLQkJaW50IGk7Ci0KLQkJaSA9IChyaS0+dS5idWZmZXIuZGF0YVtpICsgMV0gPDwgOCkgfCByaS0+dS5idWZmZXIuZGF0YVtpXTsKLQkJaWYgKGZpcnN0KQotCQkgIGZpcnN0ID0gMDsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGZwcmludGYgKGUsICIsXG4iKTsKLQkJICAgIGluZGVudCAoZSwgaW5kICsgMik7Ci0JCSAgfQotCQlmcHJpbnRmIChlLCAiJWQiLCBpKTsKLQkJaSArPSAyOwotCSAgICAgIH0KLQotCSAgICBpZiAoaSA8IHJpLT51LmJ1ZmZlci5sZW5ndGgpCi0JICAgICAgewotCQlpZiAoZmlyc3QpCi0JCSAgZmlyc3QgPSAwOwotCQllbHNlCi0JCSAgewotCQkgICAgZnByaW50ZiAoZSwgIixcbiIpOwotCQkgICAgaW5kZW50IChlLCBpbmQgKyAyKTsKLQkJICB9Ci0JCWlmICgocmktPnUuYnVmZmVyLmRhdGFbaV0gJiAweDdmKSA9PSByaS0+dS5idWZmZXIuZGF0YVtpXQotCQkgICAgJiYgaXNwcmludCAocmktPnUuYnVmZmVyLmRhdGFbaV0pKQotCQkgIGZwcmludGYgKGUsICJcIiVjXCIiLCByaS0+dS5idWZmZXIuZGF0YVtpXSk7Ci0JCWVsc2UKLQkJICBmcHJpbnRmIChlLCAiXCJcJTAzb1wiIiwgcmktPnUuYnVmZmVyLmRhdGFbaV0pOwotCSAgICAgIH0KLQotCSAgICBicmVhazsKLQkgIH0KLQl9Ci0KLSAgICAgIGlmIChyaS0+bmV4dCAhPSBOVUxMKQotCWZwcmludGYgKGUsICIsIik7Ci0gICAgICBmcHJpbnRmIChlLCAiXG4iKTsKLSAgICB9Ci0KLSAgaW5kZW50IChlLCBpbmQpOwotICBmcHJpbnRmIChlLCAiRU5EXG4iKTsKLX0KLQotLyogV3JpdGUgb3V0IGEgc3RyaW5ndGFibGUgcmVzb3VyY2UuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfc3RyaW5ndGFibGUgKGUsIG5hbWUsIHN0cmluZ3RhYmxlKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOwotICAgICBjb25zdCBzdHJ1Y3Qgc3RyaW5ndGFibGUgKnN0cmluZ3RhYmxlOwotewotICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLSAgaW50IGk7Ci0KLSAgaWYgKG5hbWUgIT0gTlVMTCAmJiAhIG5hbWUtPm5hbWVkKQotICAgIG9mZnNldCA9IChuYW1lLT51LmlkIC0gMSkgPDwgNDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICIvLyAlcyBzdHJpbmcgdGFibGUgbmFtZVxuIiwKLQkgICAgICAgbmFtZSA9PSBOVUxMID8gIk1pc3NpbmciIDogIkludmFsaWQiKTsKLSAgICAgIG9mZnNldCA9IDA7Ci0gICAgfQotCi0gIGZwcmludGYgKGUsICJCRUdJTlxuIik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgaWYgKHN0cmluZ3RhYmxlLT5zdHJpbmdzW2ldLmxlbmd0aCAhPSAwKQotCXsKLQkgIGZwcmludGYgKGUsICIgICVsdSwgXCIiLCBvZmZzZXQgKyBpKTsKLQkgIHVuaWNvZGVfcHJpbnQgKGUsIHN0cmluZ3RhYmxlLT5zdHJpbmdzW2ldLnN0cmluZywKLQkJCSBzdHJpbmd0YWJsZS0+c3RyaW5nc1tpXS5sZW5ndGgpOwotCSAgZnByaW50ZiAoZSwgIlwiXG4iKTsKLQl9Ci0gICAgfQotCi0gIGZwcmludGYgKGUsICJFTkRcbiIpOwotfQotCi0vKiBXcml0ZSBvdXQgYSB2ZXJzaW9uaW5mbyByZXNvdXJjZS4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yY192ZXJzaW9uaW5mbyAoZSwgdmVyc2lvbmluZm8pCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCB2ZXJzaW9uaW5mbyAqdmVyc2lvbmluZm87Ci17Ci0gIGNvbnN0IHN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbyAqZjsKLSAgY29uc3Qgc3RydWN0IHZlcl9pbmZvICp2aTsKLQotICBmID0gdmVyc2lvbmluZm8tPmZpeGVkOwotICBpZiAoZi0+ZmlsZV92ZXJzaW9uX21zICE9IDAgfHwgZi0+ZmlsZV92ZXJzaW9uX2xzICE9IDApCi0gICAgZnByaW50ZiAoZSwgIiBGSUxFVkVSU0lPTiAlbHUsICVsdSwgJWx1LCAlbHVcbiIsCi0JICAgICAoZi0+ZmlsZV92ZXJzaW9uX21zID4+IDE2KSAmIDB4ZmZmZiwKLQkgICAgIGYtPmZpbGVfdmVyc2lvbl9tcyAmIDB4ZmZmZiwKLQkgICAgIChmLT5maWxlX3ZlcnNpb25fbHMgPj4gMTYpICYgMHhmZmZmLAotCSAgICAgZi0+ZmlsZV92ZXJzaW9uX2xzICYgMHhmZmZmKTsKLSAgaWYgKGYtPnByb2R1Y3RfdmVyc2lvbl9tcyAhPSAwIHx8IGYtPnByb2R1Y3RfdmVyc2lvbl9scyAhPSAwKQotICAgIGZwcmludGYgKGUsICIgUFJPRFVDVFZFUlNJT04gJWx1LCAlbHUsICVsdSwgJWx1XG4iLAotCSAgICAgKGYtPnByb2R1Y3RfdmVyc2lvbl9tcyA+PiAxNikgJiAweGZmZmYsCi0JICAgICBmLT5wcm9kdWN0X3ZlcnNpb25fbXMgJiAweGZmZmYsCi0JICAgICAoZi0+cHJvZHVjdF92ZXJzaW9uX2xzID4+IDE2KSAmIDB4ZmZmZiwKLQkgICAgIGYtPnByb2R1Y3RfdmVyc2lvbl9scyAmIDB4ZmZmZik7Ci0gIGlmIChmLT5maWxlX2ZsYWdzX21hc2sgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiIEZJTEVGTEFHU01BU0sgMHglbHhcbiIsIGYtPmZpbGVfZmxhZ3NfbWFzayk7Ci0gIGlmIChmLT5maWxlX2ZsYWdzICE9IDApCi0gICAgZnByaW50ZiAoZSwgIiBGSUxFRkxBR1MgMHglbHhcbiIsIGYtPmZpbGVfZmxhZ3MpOwotICBpZiAoZi0+ZmlsZV9vcyAhPSAwKQotICAgIGZwcmludGYgKGUsICIgRklMRU9TIDB4JWx4XG4iLCBmLT5maWxlX29zKTsKLSAgaWYgKGYtPmZpbGVfdHlwZSAhPSAwKQotICAgIGZwcmludGYgKGUsICIgRklMRVRZUEUgMHglbHhcbiIsIGYtPmZpbGVfdHlwZSk7Ci0gIGlmIChmLT5maWxlX3N1YnR5cGUgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiIEZJTEVTVUJUWVBFIDB4JWx4XG4iLCBmLT5maWxlX3N1YnR5cGUpOwotICBpZiAoZi0+ZmlsZV9kYXRlX21zICE9IDAgfHwgZi0+ZmlsZV9kYXRlX2xzICE9IDApCi0gICAgZnByaW50ZiAoZSwgIi8vIERhdGU6ICVsdSwgJWx1XG4iLCBmLT5maWxlX2RhdGVfbXMsIGYtPmZpbGVfZGF0ZV9scyk7Ci0KLSAgZnByaW50ZiAoZSwgIkJFR0lOXG4iKTsKLQotICBmb3IgKHZpID0gdmVyc2lvbmluZm8tPnZhcjsgdmkgIT0gTlVMTDsgdmkgPSB2aS0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHZpLT50eXBlKQotCXsKLQljYXNlIFZFUklORk9fU1RSSU5HOgotCSAgewotCSAgICBjb25zdCBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKnZzOwotCi0JICAgIGZwcmludGYgKGUsICIgIEJMT0NLIFwiU3RyaW5nRmlsZUluZm9cIlxuIik7Ci0JICAgIGZwcmludGYgKGUsICIgIEJFR0lOXG4iKTsKLQkgICAgZnByaW50ZiAoZSwgIiAgICBCTE9DSyBcIiIpOwotCSAgICB1bmljb2RlX3ByaW50IChlLCB2aS0+dS5zdHJpbmcubGFuZ3VhZ2UsIC0xKTsKLQkgICAgZnByaW50ZiAoZSwgIlwiXG4iKTsKLQkgICAgZnByaW50ZiAoZSwgIiAgICBCRUdJTlxuIik7Ci0KLQkgICAgZm9yICh2cyA9IHZpLT51LnN0cmluZy5zdHJpbmdzOyB2cyAhPSBOVUxMOyB2cyA9IHZzLT5uZXh0KQotCSAgICAgIHsKLQkJZnByaW50ZiAoZSwgIiAgICAgIFZBTFVFIFwiIik7Ci0JCXVuaWNvZGVfcHJpbnQgKGUsIHZzLT5rZXksIC0xKTsKLQkJZnByaW50ZiAoZSwgIlwiLCBcIiIpOwotCQl1bmljb2RlX3ByaW50IChlLCB2cy0+dmFsdWUsIC0xKTsKLQkJZnByaW50ZiAoZSwgIlwiXG4iKTsKLQkgICAgICB9Ci0KLQkgICAgZnByaW50ZiAoZSwgIiAgICBFTkRcbiIpOwotCSAgICBmcHJpbnRmIChlLCAiICBFTkRcbiIpOwotCSAgICBicmVhazsKLQkgIH0KLQotCWNhc2UgVkVSSU5GT19WQVI6Ci0JICB7Ci0JICAgIGNvbnN0IHN0cnVjdCB2ZXJfdmFyaW5mbyAqdnY7Ci0KLQkgICAgZnByaW50ZiAoZSwgIiAgQkxPQ0sgXCJWYXJGaWxlSW5mb1wiXG4iKTsKLQkgICAgZnByaW50ZiAoZSwgIiAgQkVHSU5cbiIpOwotCSAgICBmcHJpbnRmIChlLCAiICAgIFZBTFVFIFwiIik7Ci0JICAgIHVuaWNvZGVfcHJpbnQgKGUsIHZpLT51LnZhci5rZXksIC0xKTsKLQkgICAgZnByaW50ZiAoZSwgIlwiIik7Ci0KLQkgICAgZm9yICh2diA9IHZpLT51LnZhci52YXI7IHZ2ICE9IE5VTEw7IHZ2ID0gdnYtPm5leHQpCi0JICAgICAgZnByaW50ZiAoZSwgIiwgMHgleCwgJWQiLCAodW5zaWduZWQgaW50KSB2di0+bGFuZ3VhZ2UsCi0JCSAgICAgICB2di0+Y2hhcnNldCk7Ci0KLQkgICAgZnByaW50ZiAoZSwgIlxuICBFTkRcbiIpOwotCi0JICAgIGJyZWFrOwotCSAgfQotCX0KLSAgICB9Ci0KLSAgZnByaW50ZiAoZSwgIkVORFxuIik7Ci19Ci0KLS8qIFdyaXRlIG91dCBkYXRhIHdoaWNoIHdvdWxkIG5vcm1hbGx5IGJlIHJlYWQgZnJvbSBhIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfZmlsZWRhdGEgKGUsIGxlbmd0aCwgZGF0YSkKLSAgICAgRklMRSAqZTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaTsKLQotICBmb3IgKGkgPSAwOyBpICsgMTUgPCBsZW5ndGg7IGkgKz0gMTYpCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIi8vICU0bHg6ICIsIGkpOwotICAgICAgZnByaW50ZiAoZSwgIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAiLAotCSAgICAgICBkYXRhW2kgKyAwXSwgZGF0YVtpICsgMV0sIGRhdGFbaSArIDJdLCBkYXRhW2kgKyAzXSwKLQkgICAgICAgZGF0YVtpICsgNF0sIGRhdGFbaSArIDVdLCBkYXRhW2kgKyA2XSwgZGF0YVtpICsgN10pOwotICAgICAgZnByaW50ZiAoZSwgIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLQkgICAgICAgZGF0YVtpICsgIDhdLCBkYXRhW2kgKyAgOV0sIGRhdGFbaSArIDEwXSwgZGF0YVtpICsgMTFdLAotCSAgICAgICBkYXRhW2kgKyAxMl0sIGRhdGFbaSArIDEzXSwgZGF0YVtpICsgMTRdLCBkYXRhW2kgKyAxNV0pOwotICAgIH0KLQotICBpZiAoaSA8IGxlbmd0aCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiLy8gJTRseDoiLCBpKTsKLSAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKQotCXsKLQkgIGZwcmludGYgKGUsICIgJTAyeCIsIGRhdGFbaV0pOwotCSAgKytpOwotCX0KLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Jlc3Jlcy5jIGIvYmludXRpbHMvcmVzcmVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MjY0ZjQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmVzcmVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NTYgKzAsMCBAQAotLyogcmVzcmVzLmM6IHJlYWRfcmVzX2ZpbGUgYW5kIHdyaXRlX3Jlc19maWxlIGltcGxlbWVudGF0aW9uIGZvciB3aW5kcmVzLgotCi0gICBDb3B5cmlnaHQgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQW5kZXJzIE5vcmxhbmRlciA8YW5vcmxhbmRAaGVtMi5wYXNzYWdlbi5zZT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJ3aW5kcmVzLmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLXN0cnVjdCByZXNfaGRyCi0gIHsKLSAgICB1bnNpZ25lZCBsb25nIGRhdGFfc2l6ZTsKLSAgICB1bnNpZ25lZCBsb25nIGhlYWRlcl9zaXplOwotICB9OwotCi1zdGF0aWMgdm9pZCB3cml0ZV9yZXNfZGlyZWN0b3J5Ci0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICosCi0JICAgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosCi0JICAgaW50ICosIGludCkpOwotc3RhdGljIHZvaWQgd3JpdGVfcmVzX3Jlc291cmNlCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKiwgaW50ICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3Jlc19iaW4KLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosCi0JICAgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICopKTsKLQotc3RhdGljIHZvaWQgd3JpdGVfcmVzX2lkIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfaWQgKikpOwotc3RhdGljIHZvaWQgd3JpdGVfcmVzX2luZm8gUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yZXNfZGF0YSBQQVJBTVMgKChjb25zdCB2b2lkICosIHNpemVfdCwgaW50KSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yZXNfaGVhZGVyCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKikpOwotCi1zdGF0aWMgaW50IHJlYWRfcmVzb3VyY2VfZW50cnkgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgcmVhZF9yZXNfZGF0YSBQQVJBTVMgKCh2b2lkICosIHNpemVfdCwgaW50KSk7Ci1zdGF0aWMgdm9pZCByZWFkX3Jlc19pZCBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkICopKTsKLXN0YXRpYyB1bmljaGFyICpyZWFkX3VuaXN0cmluZyBQQVJBTVMgKChpbnQgKikpOwotc3RhdGljIHZvaWQgc2tpcF9udWxsX3Jlc291cmNlIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2lkX3NpemUgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19pZCAqKSk7Ci1zdGF0aWMgdm9pZCByZXNfYWxpZ25fZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyB2b2lkCi0gIHJlc19hZGRfcmVzb3VyY2UKLSAgUEFSQU1TICgoc3RydWN0IHJlc19yZXNvdXJjZSAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosCi0JICAgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBpbnQsIGludCkpOwotCi12b2lkCi0gIHJlc19hcHBlbmRfcmVzb3VyY2UKLSAgUEFSQU1TICgoc3RydWN0IHJlc19kaXJlY3RvcnkgKiosIHN0cnVjdCByZXNfcmVzb3VyY2UgKiwKLQkgICBpbnQsIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgaW50KSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzb3VyY2VzID0gTlVMTDsKLQotc3RhdGljIEZJTEUgKmZyZXM7Ci1zdGF0aWMgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0KLWV4dGVybiBjaGFyICpwcm9ncmFtX25hbWU7Ci0KLS8qIFJlYWQgcmVzb3VyY2UgZmlsZSAqLwotc3RydWN0IHJlc19kaXJlY3RvcnkgKgotcmVhZF9yZXNfZmlsZSAoZm4pCi0gICAgIGNvbnN0IGNoYXIgKmZuOwotewotICBmaWxlbmFtZSA9IGZuOwotICBmcmVzID0gZm9wZW4gKGZpbGVuYW1lLCAicmIiKTsKLSAgaWYgKGZyZXMgPT0gTlVMTCkKLSAgICBmYXRhbCAoImNhbid0IG9wZW4gYCVzJyBmb3Igb3V0cHV0OiAlcyIsIGZpbGVuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLQotICBza2lwX251bGxfcmVzb3VyY2UgKCk7Ci0KLSAgd2hpbGUgKHJlYWRfcmVzb3VyY2VfZW50cnkgKCkpCi0gICAgOwotCi0gIGZjbG9zZSAoZnJlcyk7Ci0KLSAgcmV0dXJuIHJlc291cmNlczsKLX0KLQotLyogV3JpdGUgcmVzb3VyY2UgZmlsZSAqLwotdm9pZAotd3JpdGVfcmVzX2ZpbGUgKGZuLCByZXNkaXIpCi0gICAgIGNvbnN0IGNoYXIgKmZuOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzZGlyOwotewotICBpbnQgbGFuZ3VhZ2U7Ci0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNpZ25bXSA9Ci0gIHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLAotICAgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKLSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLSAgbG9uZyBmcG9zOwotCi0gIGZpbGVuYW1lID0gZm47Ci0KLSAgZnJlcyA9IGZvcGVuIChmaWxlbmFtZSwgIndiIik7Ci0gIGlmIChmcmVzID09IE5VTEwpCi0gICAgZmF0YWwgKCJjYW4ndCBvcGVuIGAlcycgZm9yIG91dHB1dDogJXMiLCBmaWxlbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgLyogV3JpdGUgMzIgYml0IHJlc291cmNlIHNpZ25hdHVyZSAqLwotICB3cml0ZV9yZXNfZGF0YSAoc2lnbiwgc2l6ZW9mIChzaWduKSwgMSk7Ci0KLSAgLyogd3JpdGUgcmVzb3VyY2VzICovCi0KLSAgbGFuZ3VhZ2UgPSAtMTsKLSAgd3JpdGVfcmVzX2RpcmVjdG9yeSAocmVzZGlyLCAoY29uc3Qgc3RydWN0IHJlc19pZCAqKSBOVUxMLAotCQkgICAgICAgKGNvbnN0IHN0cnVjdCByZXNfaWQgKikgTlVMTCwgJmxhbmd1YWdlLCAxKTsKLQotICAvKiBlbmQgZmlsZSBvbiBEV09SRCBib3VuZGFyeSAqLwotICBmcG9zID0gZnRlbGwgKGZyZXMpOwotICBpZiAoZnBvcyAlIDQpCi0gICAgd3JpdGVfcmVzX2RhdGEgKHNpZ24sIGZwb3MgJSA0LCAxKTsKLQotICBmY2xvc2UgKGZyZXMpOwotfQotCi0vKiBSZWFkIGEgcmVzb3VyY2UgZW50cnksIHJldHVybnMgMCB3aGVuIGFsbCByZXNvdXJjZXMgYXJlIHJlYWQgKi8KLXN0YXRpYyBpbnQKLXJlYWRfcmVzb3VyY2VfZW50cnkgKHZvaWQpCi17Ci0gIHN0cnVjdCByZXNfaWQgdHlwZTsKLSAgc3RydWN0IHJlc19pZCBuYW1lOwotICBzdHJ1Y3QgcmVzX3Jlc19pbmZvIHJlc2luZm87Ci0gIHN0cnVjdCByZXNfaGRyIHJlc2hkcjsKLSAgbG9uZyB2ZXJzaW9uOwotICB2b2lkICpidWZmOwotCi0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgcmVzX2FsaWduX2ZpbGUgKCk7Ci0KLSAgLyogUmVhZCBoZWFkZXIgKi8KLSAgaWYgKGZyZWFkICgmcmVzaGRyLCBzaXplb2YgKHJlc2hkciksIDEsIGZyZXMpICE9IDEpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogcmVhZCByZXNvdXJjZSB0eXBlICovCi0gIHJlYWRfcmVzX2lkICgmdHlwZSk7Ci0gIC8qIHJlYWQgcmVzb3VyY2UgaWQgKi8KLSAgcmVhZF9yZXNfaWQgKCZuYW1lKTsKLQotICByZXNfYWxpZ25fZmlsZSAoKTsKLQotICAvKiBSZWFkIGFkZGl0aW9uYWwgcmVzb3VyY2UgaGVhZGVyICovCi0gIHJlYWRfcmVzX2RhdGEgKCZyZXNpbmZvLnZlcnNpb24sIHNpemVvZiAocmVzaW5mby52ZXJzaW9uKSwgMSk7Ci0gIHJlYWRfcmVzX2RhdGEgKCZyZXNpbmZvLm1lbWZsYWdzLCBzaXplb2YgKHJlc2luZm8ubWVtZmxhZ3MpLCAxKTsKLSAgcmVhZF9yZXNfZGF0YSAoJnJlc2luZm8ubGFuZ3VhZ2UsIHNpemVvZiAocmVzaW5mby5sYW5ndWFnZSksIDEpOwotICByZWFkX3Jlc19kYXRhICgmdmVyc2lvbiwgc2l6ZW9mICh2ZXJzaW9uKSwgMSk7Ci0gIHJlYWRfcmVzX2RhdGEgKCZyZXNpbmZvLmNoYXJhY3RlcmlzdGljcywgc2l6ZW9mIChyZXNpbmZvLmNoYXJhY3RlcmlzdGljcyksIDEpOwotCi0gIHJlc19hbGlnbl9maWxlICgpOwotCi0gIC8qIEFsbG9jYXRlIGJ1ZmZlciBmb3IgZGF0YSAqLwotICBidWZmID0gcmVzX2FsbG9jIChyZXNoZHIuZGF0YV9zaXplKTsKLSAgLyogUmVhZCBkYXRhICovCi0gIHJlYWRfcmVzX2RhdGEgKGJ1ZmYsIHJlc2hkci5kYXRhX3NpemUsIDEpOwotICAvKiBDb252ZXJ0IGJpbmFyeSBkYXRhIHRvIHJlc291cmNlICovCi0gIHIgPSBiaW5fdG9fcmVzICh0eXBlLCBidWZmLCByZXNoZHIuZGF0YV9zaXplLCAwKTsKLSAgci0+cmVzX2luZm8gPSByZXNpbmZvOwotICAvKiBBZGQgcmVzb3VyY2UgdG8gcmVzb3VyY2UgZGlyZWN0b3J5ICovCi0gIHJlc19hZGRfcmVzb3VyY2UgKHIsICZ0eXBlLCAmbmFtZSwgcmVzaW5mby5sYW5ndWFnZSwgMCk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIHdyaXRlIHJlc291cmNlIGRpcmVjdG9yeSB0byBiaW5hcnkgcmVzb3VyY2UgZmlsZSAqLwotc3RhdGljIHZvaWQKLXdyaXRlX3Jlc19kaXJlY3RvcnkgKHJkLCB0eXBlLCBuYW1lLCBsYW5ndWFnZSwgbGV2ZWwpCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZDsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqbmFtZTsKLSAgICAgaW50ICpsYW5ndWFnZTsKLSAgICAgaW50IGxldmVsOwotewotICBjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICpyZTsKLQotICBmb3IgKHJlID0gcmQtPmVudHJpZXM7IHJlICE9IE5VTEw7IHJlID0gcmUtPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChsZXZlbCkKLQl7Ci0JY2FzZSAxOgotCSAgLyogSWYgd2UncmUgYXQgbGV2ZWwgMSwgdGhlIGtleSBvZiB0aGlzIHJlc291cmNlIGlzIHRoZQotCSAgICAgdHlwZS4gIFRoaXMgbm9ybWFsbHkgZHVwbGljYXRlcyB0aGUgaW5mb3JtYXRpb24gd2UgaGF2ZQotCSAgICAgc3RvcmVkIHdpdGggdGhlIHJlc291cmNlIGl0c2VsZiwgYnV0IHdlIG5lZWQgdG8gcmVtZW1iZXIKLQkgICAgIHRoZSB0eXBlIGlmIHRoaXMgaXMgYSB1c2VyIGRlZmluZSByZXNvdXJjZSB0eXBlLiAgKi8KLQkgIHR5cGUgPSAmcmUtPmlkOwotCSAgYnJlYWs7Ci0KLQljYXNlIDI6Ci0JICAvKiBJZiB3ZSdyZSBhdCBsZXZlbCAyLCB0aGUga2V5IG9mIHRoaXMgcmVzb3VyY2UgaXMgdGhlIG5hbWUKLQkgICAgIHdlIGFyZSBnb2luZyB0byB1c2UgaW4gdGhlIHJjIHByaW50b3V0LiAqLwotCSAgbmFtZSA9ICZyZS0+aWQ7Ci0JICBicmVhazsKLQotCWNhc2UgMzoKLQkgIC8qIElmIHdlJ3JlIGF0IGxldmVsIDMsIHRoZW4gdGhpcyBrZXkgcmVwcmVzZW50cyBhIGxhbmd1YWdlLgotCSAgICAgVXNlIGl0IHRvIHVwZGF0ZSB0aGUgY3VycmVudCBsYW5ndWFnZS4gICovCi0JICBpZiAoIXJlLT5pZC5uYW1lZAotCSAgICAgICYmIHJlLT5pZC51LmlkICE9ICpsYW5ndWFnZQotCSAgICAgICYmIChyZS0+aWQudS5pZCAmIDB4ZmZmZikgPT0gcmUtPmlkLnUuaWQpCi0JICAgIHsKLQkgICAgICAqbGFuZ3VhZ2UgPSByZS0+aWQudS5pZDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocmUtPnN1YmRpcikKLQl3cml0ZV9yZXNfZGlyZWN0b3J5IChyZS0+dS5kaXIsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBsZXZlbCArIDEpOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChsZXZlbCA9PSAzKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgbm9ybWFsIGNhc2U6IHRoZSB0aHJlZSBsZXZlbHMgYXJlCi0JICAgICAgICAgVFlQRS9OQU1FL0xBTkdVQUdFLiAgTkFNRSB3aWxsIGhhdmUgYmVlbiBzZXQgYXQgbGV2ZWwKLQkgICAgICAgICAyLCBhbmQgcmVwcmVzZW50cyB0aGUgbmFtZSB0byB1c2UuICBXZSBwcm9iYWJseSBqdXN0Ci0JICAgICAgICAgc2V0IExBTkdVQUdFLCBhbmQgaXQgd2lsbCBwcm9iYWJseSBtYXRjaCB3aGF0IHRoZQotCSAgICAgICAgIHJlc291cmNlIGl0c2VsZiByZWNvcmRzIGlmIGFueXRoaW5nLiAgKi8KLQkgICAgICB3cml0ZV9yZXNfcmVzb3VyY2UgKHR5cGUsIG5hbWUsIHJlLT51LnJlcywgbGFuZ3VhZ2UpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICIvLyBSZXNvdXJjZSBhdCB1bmV4cGVjdGVkIGxldmVsICVkXG4iLCBsZXZlbCk7Ci0JICAgICAgd3JpdGVfcmVzX3Jlc291cmNlICh0eXBlLCAoc3RydWN0IHJlc19pZCAqKSBOVUxMLCByZS0+dS5yZXMsCi0JCQkJICBsYW5ndWFnZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9yZXNfcmVzb3VyY2UgKHR5cGUsIG5hbWUsIHJlcywgbGFuZ3VhZ2UpCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlczsKLSAgICAgaW50ICpsYW5ndWFnZTsKLXsKLSAgaW50IHJ0OwotCi0gIHN3aXRjaCAocmVzLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0FDQ0VMRVJBVE9SOgotICAgICAgcnQgPSBSVF9BQ0NFTEVSQVRPUjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9CSVRNQVA6Ci0gICAgICBydCA9IFJUX0JJVE1BUDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9DVVJTT1I6Ci0gICAgICBydCA9IFJUX0NVUlNPUjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9HUk9VUF9DVVJTT1I6Ci0gICAgICBydCA9IFJUX0dST1VQX0NVUlNPUjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9ESUFMT0c6Ci0gICAgICBydCA9IFJUX0RJQUxPRzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9GT05UOgotICAgICAgcnQgPSBSVF9GT05UOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0ZPTlRESVI6Ci0gICAgICBydCA9IFJUX0ZPTlRESVI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfSUNPTjoKLSAgICAgIHJ0ID0gUlRfSUNPTjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9HUk9VUF9JQ09OOgotICAgICAgcnQgPSBSVF9HUk9VUF9JQ09OOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX01FTlU6Ci0gICAgICBydCA9IFJUX01FTlU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfTUVTU0FHRVRBQkxFOgotICAgICAgcnQgPSBSVF9NRVNTQUdFVEFCTEU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfUkNEQVRBOgotICAgICAgcnQgPSBSVF9SQ0RBVEE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfU1RSSU5HVEFCTEU6Ci0gICAgICBydCA9IFJUX1NUUklORzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9VU0VSREFUQToKLSAgICAgIHJ0ID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9WRVJTSU9OSU5GTzoKLSAgICAgIHJ0ID0gUlRfVkVSU0lPTjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAocnQgIT0gMAotICAgICAgJiYgdHlwZSAhPSBOVUxMCi0gICAgICAmJiAodHlwZS0+bmFtZWQgfHwgdHlwZS0+dS5pZCAhPSBydCkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLy8gVW5leHBlY3RlZCByZXNvdXJjZSB0eXBlIG1pc21hdGNoOiAiKTsKLSAgICAgIHJlc19pZF9wcmludCAoc3RkZXJyLCAqdHlwZSwgMSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgIT0gJWQiLCBydCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgd3JpdGVfcmVzX2JpbiAocmVzLCB0eXBlLCBuYW1lLCAmcmVzLT5yZXNfaW5mbyk7Ci0gIHJldHVybjsKLX0KLQotLyogV3JpdGUgYSByZXNvdXJjZSBpbiBiaW5hcnkgcmVzb3VyY2UgZm9ybWF0ICovCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVzX2JpbiAocmVzLCB0eXBlLCBuYW1lLCByZXNpbmZvKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyZXM7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci17Ci0gIHVuc2lnbmVkIGxvbmcgZGF0YXNpemUgPSAwOwotICBjb25zdCBzdHJ1Y3QgYmluZGF0YSAqYmluX3JlcCwgKmRhdGE7Ci0KLSAgYmluX3JlcCA9IHJlc190b19iaW4gKHJlcywgMCk7Ci0gIGZvciAoZGF0YSA9IGJpbl9yZXA7IGRhdGEgIT0gTlVMTDsgZGF0YSA9IGRhdGEtPm5leHQpCi0gICAgZGF0YXNpemUgKz0gZGF0YS0+bGVuZ3RoOwotCi0gIHdyaXRlX3Jlc19oZWFkZXIgKGRhdGFzaXplLCB0eXBlLCBuYW1lLCByZXNpbmZvKTsKLQotICBmb3IgKGRhdGEgPSBiaW5fcmVwOyBkYXRhICE9IE5VTEw7IGRhdGEgPSBkYXRhLT5uZXh0KQotICAgIHdyaXRlX3Jlc19kYXRhIChkYXRhLT5kYXRhLCBkYXRhLT5sZW5ndGgsIDEpOwotfQotCi0vKiBHZXQgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBzdG9yZSBhbiBpZCBpbiBiaW5hcnkgZm9ybWF0ICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZ2V0X2lkX3NpemUgKGlkKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICppZDsKLXsKLSAgaWYgKGlkLT5uYW1lZCkKLSAgICByZXR1cm4gc2l6ZW9mICh1bmljaGFyKSAqIChpZC0+dS5uLmxlbmd0aCArIDEpOwotICBlbHNlCi0gICAgcmV0dXJuIHNpemVvZiAodW5pY2hhcikgKiAyOwotfQotCi0vKiBXcml0ZSBhIHJlc291cmNlIGhlYWRlciAqLwotc3RhdGljIHZvaWQKLXdyaXRlX3Jlc19oZWFkZXIgKGRhdGFzaXplLCB0eXBlLCBuYW1lLCByZXNpbmZvKQotICAgICB1bnNpZ25lZCBsb25nIGRhdGFzaXplOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotewotICBzdHJ1Y3QgcmVzX2hkciByZXNoZHI7Ci0gIHJlc2hkci5kYXRhX3NpemUgPSBkYXRhc2l6ZTsKLSAgcmVzaGRyLmhlYWRlcl9zaXplID0gMjQgKyBnZXRfaWRfc2l6ZSAodHlwZSkgKyBnZXRfaWRfc2l6ZSAobmFtZSk7Ci0KLSAgcmVzX2FsaWduX2ZpbGUgKCk7Ci0gIHdyaXRlX3Jlc19kYXRhICgmcmVzaGRyLCBzaXplb2YgKHJlc2hkciksIDEpOwotICB3cml0ZV9yZXNfaWQgKHR5cGUpOwotICB3cml0ZV9yZXNfaWQgKG5hbWUpOwotCi0gIHJlc19hbGlnbl9maWxlICgpOwotCi0gIHdyaXRlX3Jlc19pbmZvIChyZXNpbmZvKTsKLSAgcmVzX2FsaWduX2ZpbGUgKCk7Ci19Ci0KLQotLyogV3JpdGUgZGF0YSB0byBmaWxlLCBhYm9ydCBvbiBmYWlsdXJlICovCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVzX2RhdGEgKGRhdGEsIHNpemUsIGNvdW50KQotICAgICBjb25zdCB2b2lkICpkYXRhOwotICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgaW50IGNvdW50OwotewotICBpZiAoZndyaXRlIChkYXRhLCBzaXplLCBjb3VudCwgZnJlcykgIT0gY291bnQpCi0gICAgZmF0YWwgKCIlczogJXM6IGNvdWxkIG5vdCB3cml0ZSB0byBmaWxlIiwgcHJvZ3JhbV9uYW1lLCBmaWxlbmFtZSk7Ci19Ci0KLS8qIFJlYWQgZGF0YSBmcm9tIGZpbGUsIGFib3J0IG9uIGZhaWx1cmUgKi8KLXN0YXRpYyB2b2lkCi1yZWFkX3Jlc19kYXRhIChkYXRhLCBzaXplLCBjb3VudCkKLSAgICAgdm9pZCAqZGF0YTsKLSAgICAgc2l6ZV90IHNpemU7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgaWYgKGZyZWFkIChkYXRhLCBzaXplLCBjb3VudCwgZnJlcykgIT0gY291bnQpCi0gICAgZmF0YWwgKCIlczogJXM6IHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiLCBwcm9ncmFtX25hbWUsIGZpbGVuYW1lKTsKLX0KLQotLyogV3JpdGUgYSByZXNvdXJjZSBpZCAqLwotc3RhdGljIHZvaWQKLXdyaXRlX3Jlc19pZCAoaWQpCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKmlkOwotewotICBpZiAoaWQtPm5hbWVkKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuID0gaWQtPnUubi5sZW5ndGg7Ci0gICAgICB1bmljaGFyIG51bGxfdGVybSA9IDA7Ci0gICAgICB3cml0ZV9yZXNfZGF0YSAoaWQtPnUubi5uYW1lLCBsZW4gKiBzaXplb2YgKHVuaWNoYXIpLCAxKTsKLSAgICAgIHdyaXRlX3Jlc19kYXRhICgmbnVsbF90ZXJtLCBzaXplb2YgKG51bGxfdGVybSksIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGkgPSAweEZGRkY7Ci0gICAgICB3cml0ZV9yZXNfZGF0YSAoJmksIHNpemVvZiAoaSksIDEpOwotICAgICAgaSA9IGlkLT51LmlkOwotICAgICAgd3JpdGVfcmVzX2RhdGEgKCZpLCBzaXplb2YgKGkpLCAxKTsKLSAgICB9Ci19Ci0KLS8qIFdyaXRlIHJlc291cmNlIGluZm8gKi8KLXN0YXRpYyB2b2lkCi13cml0ZV9yZXNfaW5mbyAoaW5mbykKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqaW5mbzsKLXsKLSAgd3JpdGVfcmVzX2RhdGEgKCZpbmZvLT52ZXJzaW9uLCBzaXplb2YgKGluZm8tPnZlcnNpb24pLCAxKTsKLSAgd3JpdGVfcmVzX2RhdGEgKCZpbmZvLT5tZW1mbGFncywgc2l6ZW9mIChpbmZvLT5tZW1mbGFncyksIDEpOwotICB3cml0ZV9yZXNfZGF0YSAoJmluZm8tPmxhbmd1YWdlLCBzaXplb2YgKGluZm8tPmxhbmd1YWdlKSwgMSk7Ci0gIHdyaXRlX3Jlc19kYXRhICgmaW5mby0+dmVyc2lvbiwgc2l6ZW9mIChpbmZvLT52ZXJzaW9uKSwgMSk7Ci0gIHdyaXRlX3Jlc19kYXRhICgmaW5mby0+Y2hhcmFjdGVyaXN0aWNzLCBzaXplb2YgKGluZm8tPmNoYXJhY3RlcmlzdGljcyksIDEpOwotfQotCi0vKiByZWFkIGEgcmVzb3VyY2UgaWRlbnRpZmllciAqLwotdm9pZCAKLXJlYWRfcmVzX2lkIChpZCkKLSAgICAgc3RydWN0IHJlc19pZCAqaWQ7Ci17Ci0gIHVuc2lnbmVkIHNob3J0IG9yZDsKLSAgdW5pY2hhciAqaWRfcyA9IE5VTEw7Ci0gIGludCBsZW47Ci0KLSAgcmVhZF9yZXNfZGF0YSAoJm9yZCwgc2l6ZW9mIChvcmQpLCAxKTsKLSAgaWYgKG9yZCA9PSAweEZGRkYpCQkvKiBhbiBvcmRpbmFsIGlkICovCi0gICAgewotICAgICAgcmVhZF9yZXNfZGF0YSAoJm9yZCwgc2l6ZW9mIChvcmQpLCAxKTsKLSAgICAgIGlkLT5uYW1lZCA9IDA7Ci0gICAgICBpZC0+dS5pZCA9IG9yZDsKLSAgICB9Ci0gIGVsc2UKLSAgICAvKiBuYW1lZCBpZCAqLwotICAgIHsKLSAgICAgIGlmIChmc2VlayAoZnJlcywgLXNpemVvZiAob3JkKSwgU0VFS19DVVIpICE9IDApCi0JZmF0YWwgKCIlczogJXM6IGNvdWxkIG5vdCBzZWVrIGluIGZpbGUiLCBwcm9ncmFtX25hbWUsIGZpbGVuYW1lKTsKLSAgICAgIGlkX3MgPSByZWFkX3VuaXN0cmluZyAoJmxlbik7Ci0gICAgICBpZC0+bmFtZWQgPSAxOwotICAgICAgaWQtPnUubi5sZW5ndGggPSBsZW47Ci0gICAgICBpZC0+dS5uLm5hbWUgPSBpZF9zOwotICAgIH0KLX0KLQotLyogUmVhZCBhIG51bGwgdGVybWluYXRlZCBVTklDT0RFIHN0cmluZyAqLwotc3RhdGljIHVuaWNoYXIgKgotcmVhZF91bmlzdHJpbmcgKGxlbikKLSAgICAgaW50ICpsZW47Ci17Ci0gIHVuaWNoYXIgKnM7Ci0gIHVuaWNoYXIgYzsKLSAgdW5pY2hhciAqcDsKLSAgaW50IGw7Ci0KLSAgKmxlbiA9IDA7Ci0gIGwgPSAwOwotCi0gIC8qIHRoZXJlIGFyZSBoYXJkbHkgYW55IG5hbWVzIGxvbmdlciB0aGFuIDI1NiBjaGFyYWN0ZXJzICovCi0gIHAgPSBzID0gKHVuaWNoYXIgKikgeG1hbGxvYyAoc2l6ZW9mICh1bmljaGFyKSAqIDI1Nik7Ci0gIGRvCi0gICAgewotICAgICAgcmVhZF9yZXNfZGF0YSAoJmMsIHNpemVvZiAoYyksIDEpOwotICAgICAgKnArKyA9IGM7Ci0gICAgICBpZiAoYyAhPSAwKQotCWwrKzsKLSAgICB9Ci0gIHdoaWxlIChjICE9IDApOwotICAqbGVuID0gbDsKLSAgcmV0dXJuIHM7Ci19Ci0KLS8qIGFsaWduIGZpbGUgb24gRFdPUkQgYm91bmRhcnkgKi8KLXN0YXRpYyB2b2lkCi1yZXNfYWxpZ25fZmlsZSAodm9pZCkKLXsKLSAgaWYgKGZzZWVrIChmcmVzLCBmdGVsbCAoZnJlcykgJSA0LCBTRUVLX0NVUikgIT0gMCkKLSAgICBmYXRhbCAoIiVzOiAlczogdW5hYmxlIHRvIGFsaWduIGZpbGUiLCBwcm9ncmFtX25hbWUsIGZpbGVuYW1lKTsKLX0KLQotLyogQ2hlY2sgaWYgZmlsZSBpcyBhIHdpbjMyIGJpbmFyeSByZXNvdXJjZSBmaWxlLCBpZiBzbwotICAgc2tpcCBwYXN0IHRoZSBudWxsIHJlc291cmNlLiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgLTEgb24KLSAgIGVycm9yLgotICovCi1zdGF0aWMgdm9pZAotc2tpcF9udWxsX3Jlc291cmNlICh2b2lkKQotewotICBzdHJ1Y3QgcmVzX2hkciByZXNoZHIgPQotICB7MCwgMH07Ci0gIHJlYWRfcmVzX2RhdGEgKCZyZXNoZHIsIHNpemVvZiAocmVzaGRyKSwgMSk7Ci0gIGlmICgocmVzaGRyLmRhdGFfc2l6ZSAhPSAwKSB8fCAocmVzaGRyLmhlYWRlcl9zaXplICE9IDB4MjApKQotICAgIGdvdG8gc2tpcF9lcnI7Ci0KLSAgLyogU3VidHJhY3Qgc2l6ZSBvZiBIZWFkZXJTaXplIGFuZCBEYXRhU2l6ZSAqLwotICBpZiAoZnNlZWsgKGZyZXMsIHJlc2hkci5oZWFkZXJfc2l6ZSAtIDgsIFNFRUtfQ1VSKSAhPSAwKQotICAgIGdvdG8gc2tpcF9lcnI7Ci0KLSAgcmV0dXJuOwotCi1za2lwX2VycjoKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiBOb3QgYSB2YWxpZCBXSU4zMiByZXNvdXJjZSBmaWxlXG4iLCBwcm9ncmFtX25hbWUsCi0JICAgZmlsZW5hbWUpOwotICB4ZXhpdCAoMSk7Ci19Ci0KLS8qIEFkZCBhIHJlc291cmNlIHRvIHJlc291cmNlIGRpcmVjdG9yeSAqLwotdm9pZAotcmVzX2FkZF9yZXNvdXJjZSAociwgdHlwZSwgaWQsIGxhbmd1YWdlLCBkdXBvaykKLSAgICAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqaWQ7Ci0gICAgIGludCBsYW5ndWFnZTsKLSAgICAgaW50IGR1cG9rOwotewotICBzdHJ1Y3QgcmVzX2lkIGFbM107Ci0KLSAgYVswXSA9ICp0eXBlOwotICBhWzFdID0gKmlkOwotICBhWzJdLm5hbWVkID0gMDsKLSAgYVsyXS51LmlkID0gbGFuZ3VhZ2U7Ci0gIHJlc19hcHBlbmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIHIsIDMsIGEsIGR1cG9rKTsKLX0KLQotLyogQXBwZW5kIGEgcmVzb3VyY2UgdG8gcmVzb3VyY2UgZGlyZWN0b3J5LgotICAgVGhpcyBpcyBqdXN0IGNvcGllZCBmcm9tIGRlZmluZV9yZXNvdXJjZQotICAgYW5kIG1vZGlmaWVkIHRvIGFkZCBhbiBleGlzdGluZyByZXNvdXJjZS4KLSAqLwotdm9pZAotcmVzX2FwcGVuZF9yZXNvdXJjZSAocmVzb3VyY2VzLCByZXNvdXJjZSwgY2lkcywgaWRzLCBkdXBvaykKLSAgICAgc3RydWN0IHJlc19kaXJlY3RvcnkgKipyZXNvdXJjZXM7Ci0gICAgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlc291cmNlOwotICAgICBpbnQgY2lkczsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqaWRzOwotICAgICBpbnQgZHVwb2s7Ci17Ci0gIHN0cnVjdCByZXNfZW50cnkgKnJlID0gTlVMTDsKLSAgaW50IGk7Ci0KLSAgYXNzZXJ0IChjaWRzID4gMCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjaWRzOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IHJlc19lbnRyeSAqKnBwOwotCi0gICAgICBpZiAoKnJlc291cmNlcyA9PSBOVUxMKQotCXsKLQkgIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWV2YWw7Ci0KLQkgIC8qIFVzZSB0aGUgc2FtZSB0aW1lc3RhbXAgZm9yIGV2ZXJ5IHJlc291cmNlIGNyZWF0ZWQgaW4gYQotCSAgICAgc2luZ2xlIHJ1bi4gICovCi0JICBpZiAodGltZXZhbCA9PSAwKQotCSAgICB0aW1ldmFsID0gdGltZSAoTlVMTCk7Ci0KLQkgICpyZXNvdXJjZXMgPSAoKHN0cnVjdCByZXNfZGlyZWN0b3J5ICopCi0JCQlyZXNfYWxsb2MgKHNpemVvZiAqKnJlc291cmNlcykpOwotCSAgKCpyZXNvdXJjZXMpLT5jaGFyYWN0ZXJpc3RpY3MgPSAwOwotCSAgKCpyZXNvdXJjZXMpLT50aW1lID0gdGltZXZhbDsKLQkgICgqcmVzb3VyY2VzKS0+bWFqb3IgPSAwOwotCSAgKCpyZXNvdXJjZXMpLT5taW5vciA9IDA7Ci0JICAoKnJlc291cmNlcyktPmVudHJpZXMgPSBOVUxMOwotCX0KLQotICAgICAgZm9yIChwcCA9ICYoKnJlc291cmNlcyktPmVudHJpZXM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLQlpZiAocmVzX2lkX2NtcCAoKCpwcCktPmlkLCBpZHNbaV0pID09IDApCi0JICBicmVhazsKLQotICAgICAgaWYgKCpwcCAhPSBOVUxMKQotCXJlID0gKnBwOwotICAgICAgZWxzZQotCXsKLQkgIHJlID0gKHN0cnVjdCByZXNfZW50cnkgKikgcmVzX2FsbG9jIChzaXplb2YgKnJlKTsKLQkgIHJlLT5uZXh0ID0gTlVMTDsKLQkgIHJlLT5pZCA9IGlkc1tpXTsKLQkgIGlmICgoaSArIDEpIDwgY2lkcykKLQkgICAgewotCSAgICAgIHJlLT5zdWJkaXIgPSAxOwotCSAgICAgIHJlLT51LmRpciA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlLT5zdWJkaXIgPSAwOwotCSAgICAgIHJlLT51LnJlcyA9IE5VTEw7Ci0JICAgIH0KLQotCSAgKnBwID0gcmU7Ci0JfQotCi0gICAgICBpZiAoKGkgKyAxKSA8IGNpZHMpCi0JewotCSAgaWYgKCFyZS0+c3ViZGlyKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0JICAgICAgcmVzX2lkc19wcmludCAoc3RkZXJyLCBpLCBpZHMpOwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIjogZXhwZWN0ZWQgdG8gYmUgYSBkaXJlY3RvcnlcbiIpOwotCSAgICAgIHhleGl0ICgxKTsKLQkgICAgfQotCi0JICByZXNvdXJjZXMgPSAmcmUtPnUuZGlyOwotCX0KLSAgICB9Ci0KLSAgaWYgKHJlLT5zdWJkaXIpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0gICAgICByZXNfaWRzX3ByaW50IChzdGRlcnIsIGNpZHMsIGlkcyk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICI6IGV4cGVjdGVkIHRvIGJlIGEgbGVhZlxuIik7Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmIChyZS0+dS5yZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZHVwb2spCi0JcmV0dXJuOwotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogd2FybmluZzogIiwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgY2lkcywgaWRzKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIjogZHVwbGljYXRlIHZhbHVlXG4iKTsKLSAgICB9Ci0KLSAgcmUtPnUucmVzID0gcmVzb3VyY2U7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zYW5pdHkuc2ggYi9iaW51dGlscy9zYW5pdHkuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0MmNhYmYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc2FuaXR5LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotIyEvYmluL3NoCi0jIyMgcXVpY2sgc2FuaXR5IHRlc3QgZm9yIHRoZSBiaW51dGlscy4KLSMjIwotIyMjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBhbmQgaXMgbWFpbnRhaW5lZCBieSBLLiBSaWNoYXJkIFBpeGxleSwKLSMjIyByaWNoQGN5Z251cy5jb20uCi0KLSMjIyBmYWlsIG9uIGVycm9ycwotc2V0IC1lCi0KLSMjIyBmaXJzdCBhcmcgaXMgZGlyZWN0b3J5IGluIHdoaWNoIGJpbmFyaWVzIHRvIGJlIHRlc3RlZCByZXNpZGUuCi1jYXNlICIkMSIgaW4KLSIiKSBCSU49LiA7OwotKikgIEJJTj0iJDEiIDs7Ci1lc2FjCi0KLSMjIyBzaXplCi1mb3IgaSBpbiBzaXplIG9iamR1bXAgbm0gYXIgc3RyaXAgcmFubGliIDsgZG8KLQkke0JJTn0vc2l6ZSAke0JJTn0vJGkgPiAvZGV2L251bGwKLWRvbmUKLQotIyMjIG9iamR1bXAKLWZvciBpIGluIHNpemUgb2JqZHVtcCBubSBhciBzdHJpcCByYW5saWIgOyBkbwotCSR7QklOfS9vYmpkdW1wIC1haGlmZHJ0eHNsICR7QklOfS8kaSA+IC9kZXYvbnVsbAotZG9uZQotCi0jIyMgbm0KLWZvciBpIGluIHNpemUgb2JqZHVtcCBubSBhciBzdHJpcCByYW5saWIgOyBkbwotCSR7QklOfS9ubSAke0JJTn0vJGkgPiAvZGV2L251bGwKLWRvbmUKLQotIyMjIHN0cmlwCi1UTVBESVI9Li9iaW51dGlscy0kJAotbWtkaXIgJHtUTVBESVJ9Ci0KLWNwICR7QklOfS9zdHJpcCAke1RNUERJUn0vc3RyaXAKLQotZm9yIGkgaW4gc2l6ZSBvYmpkdW1wIG5tIGFyIHJhbmxpYiA7IGRvCi0JY3AgJHtCSU59LyRpICR7VE1QRElSfS8kaQotCSR7QklOfS9zdHJpcCAke1RNUERJUn0vJGkKLQljcCAke0JJTn0vJGkgJHtUTVBESVJ9LyRpCi0JJHtUTVBESVJ9L3N0cmlwICR7VE1QRElSfS8kaQotZG9uZQotCi0jIyMgYXIKLQotIyMjIHJhbmxpYgotCi1ybSAtcmYgJHtUTVBESVJ9Ci0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvYmludXRpbHMvc2l6ZS4xIGIvYmludXRpbHMvc2l6ZS4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjE5YmQyLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3NpemUuMQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggc2l6ZSAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1zaXplIFwtIGxpc3Qgc2VjdGlvbiBzaXplcyBhbmQgdG90YWwgc2l6ZS4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIHNpemUKLS5SQiAiW1x8IiBcLUEgXHx8XHwgXC1CIFx8fFx8IFxjCi0uQkkgIlwtXC1mb3JtYXQ9IiBjb21wYXRpYmlsaXR5XGMKLVwmXHxdCi0uUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIgCi0uUkIgIltcfCIgXC1kIFx8fFx8IFwtbyBcfHxcfCBcLXhcYwotXHx8XHxcYwotLkJJICJcLVwtcmFkaXg9IiBudW1iZXJcYwotXCZcfF0KLS5SQiAiW1x8IiBcYwotLkJJICJcLVwtdGFyZ2V0PSIgYmZkbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiIFwtViBcfHxcfCBcLVwtdmVyc2lvbiAiXHxdIiAgCi0uSSBvYmpmaWxlXGMKLVwmLlx8Llx8LgotLmFkIGIKLS5oeSAxCi0uU0ggREVTQ1JJUFRJT04KLVRoZSBHTlUgXGMKLS5CIHNpemVcYwotXCYgdXRpbGl0eSBsaXN0cyB0aGUgc2VjdGlvbiBzaXplc1woZW1cJmFuZCB0aGUgdG90YWwKLXNpemVcKGVtXCZmb3IgZWFjaCBvZiB0aGUgb2JqZWN0IGZpbGVzCi0uSSBvYmpmaWxlCi1pbiBpdHMgYXJndW1lbnQgbGlzdC4KLUJ5IGRlZmF1bHQsIG9uZSBsaW5lIG9mIG91dHB1dCBpcyBnZW5lcmF0ZWQgZm9yIGVhY2ggb2JqZWN0IGZpbGUgb3IgZWFjaAotbW9kdWxlIGluIGFuIGFyY2hpdmUuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CIFwtQQotLlRQCi0uQiBcLUIKLS5UUAotLkJJICJcLVwtZm9ybWF0ICIgImNvbXBhdGliaWxpdHkiCi1Vc2luZyBvbmUgb2YgdGhlc2Ugb3B0aW9ucywgeW91IGNhbiBjaG9vc2Ugd2hldGhlciB0aGUgb3V0cHV0IGZyb20gR05VCi1cYwotLkIgc2l6ZVxjCi1cJiByZXNlbWJsZXMgb3V0cHV0IGZyb20gU3lzdGVtIFYgXGMKLS5CIHNpemVcYwotXCYgKHVzaW5nIGBcfFxjCi0uQiBcLUFcYwotXHwnLAotb3IgYFx8XGMKLS5CIFwtXC1mb3JtYXQ9c3lzdlxjCi1cfCcpLCBvciBCZXJrZWxleSBcYwotLkIgc2l6ZVxjCi1cJiAodXNpbmcgYFx8XGMKLS5CIFwtQlxjCi1cfCcsIG9yCi1gXHxcYwotLkIgXC1cLWZvcm1hdD1iZXJrZWxleVxjCi1cfCcpLiAgVGhlIGRlZmF1bHQgaXMgdGhlIG9uZS1saW5lIGZvcm1hdCBzaW1pbGFyIHRvCi1CZXJrZWxleSdzLiAgCi0KLS5UUAotLkIgXC1cLWhlbHAKLVNob3cgYSBzdW1tYXJ5IG9mIGFjY2VwdGFibGUgYXJndW1lbnRzIGFuZCBvcHRpb25zLgotCi0uVFAKLS5CIFwtZAotLlRQCi0uQiBcLW8KLS5UUAotLkIgXC14Ci0uVFAKLS5CSSAiXC1cLXJhZGl4ICIgIm51bWJlciIKLVVzaW5nIG9uZSBvZiB0aGVzZSBvcHRpb25zLCB5b3UgY2FuIGNvbnRyb2wgd2hldGhlciB0aGUgc2l6ZSBvZiBlYWNoCi1zZWN0aW9uIGlzIGdpdmVuIGluIGRlY2ltYWwgKGBcfFxjCi0uQiBcLWRcYwotXHwnLCBvciBgXHxcYwotLkIgXC1cLXJhZGl4IDEwXGMKLVx8Jyk7IG9jdGFsCi0oYFx8XGMKLS5CIFwtb1xjCi1cfCcsIG9yIGBcfFxjCi0uQiBcLVwtcmFkaXggOFxjCi1cfCcpOyBvciBoZXhhZGVjaW1hbCAoYFx8XGMKLS5CIFwteFxjCi1cfCcsIG9yCi1gXHxcYwotLkIgXC1cLXJhZGl4IDE2XGMKLVx8JykuICBJbiBgXHxcYwotLkIgXC1cLXJhZGl4IFxjCi0uSSBudW1iZXJcYwotXCZcYwotXHwnLCBvbmx5IHRoZSB0aHJlZQotdmFsdWVzICg4LCAxMCwgMTYpIGFyZSBzdXBwb3J0ZWQuICBUaGUgdG90YWwgc2l6ZSBpcyBhbHdheXMgZ2l2ZW4gaW4gdHdvCi1yYWRpY2VzOyBkZWNpbWFsIGFuZCBoZXhhZGVjaW1hbCBmb3IgYFx8XGMKLS5CIFwtZFxjCi1cfCcgb3IgYFx8XGMKLS5CIFwteFxjCi1cfCcgb3V0cHV0LCBvcgotb2N0YWwgYW5kIGhleGFkZWNpbWFsIGlmIHlvdSdyZSB1c2luZyBgXHxcYwotLkIgXC1vXGMKLVx8Jy4KLQotLlRQCi0uQkkgIlwtXC10YXJnZXQgIiAiYmZkbmFtZSIKLVlvdSBjYW4gc3BlY2lmeSBhIHBhcnRpY3VsYXIgb2JqZWN0LWNvZGUgZm9ybWF0IGZvciBcYwotLkkgb2JqZmlsZVxjCi1cJiBhcwotXGMKLS5JIGJmZG5hbWVcYwotXCYuICBUaGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5OyBcYwotLkkgc2l6ZVxjCi1cJiBjYW4KLWF1dG9tYXRpY2FsbHkgcmVjb2duaXplIG1hbnkgZm9ybWF0cy4gICBTZWUgCi0uQlIgb2JqZHVtcCAoIDEgKSAKLWZvciBpbmZvcm1hdGlvbgotb24gbGlzdGluZyBhdmFpbGFibGUgZm9ybWF0cy4KLQotLlRQCi0uQiBcLVYKLS5UUAotLkIgXC1cLXZlcnNpb24KLURpc3BsYXkgdmVyc2lvbiBudW1iZXIgaW5mb3JtYXRpb24gb24gXGMKLS5CIHNpemVcYwotXCYgaXRzZWxmLgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciIAotZW50cnkgaW4gCi0uQlIgaW5mbyA7Ci0uSVIgIlRoZSBHTlUgQmluYXJ5IFV0aWxpdGllcyIgLAotIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsgCi0uQlIgYXIgIigiIDEgIiksIgotLkJSIG9iamR1bXAgKCAxICkuCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3NpemUuYyBiL2JpbnV0aWxzL3NpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU3YzdlZC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zaXplLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTUgKzAsMCBAQAotLyogc2l6ZS5jIC0tIHJlcG9ydCBzaXplIG9mIHZhcmlvdXMgc2VjdGlvbnMgb2YgYW4gZXhlY3V0YWJsZSBmaWxlLgotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotLyogRXh0ZW5zaW9ucy9pbmNvbXBhdGliaWxpdGllczoKLSAgIG8gLSBCU0Qgb3V0cHV0IGhhcyBmaWxlbmFtZXMgYXQgdGhlIGVuZC4KLSAgIG8gLSBCU0Qgb3V0cHV0IGNhbiBhcHBlYXIgaW4gZGlmZmVyZW50IHJhZGljaWVzLgotICAgbyAtIFN5c1Ygb3V0cHV0IGhhcyBsZXNzIHJlZHVuZGFudCB3aGl0ZXNwYWNlLiAgRmlsZW5hbWUgY29tZXMgYXQgZW5kLgotICAgbyAtIFN5c1Ygb3V0cHV0IGRvZXNuJ3Qgc2hvdyBWTUEgd2hpY2ggaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBQTUEuCi0gICBvIC0gV2UgYWxzbyBoYW5kbGUgY29yZSBmaWxlcy4KLSAgIG8gLSBXZSBhbHNvIGhhbmRsZSBhcmNoaXZlcy4KLSAgIElmIHlvdSB3cml0ZSBzaGVsbCBzY3JpcHRzIHdoaWNoIG1hbmlwdWxhdGUgdGhpcyBpbmZvIHRoZW4geW91IG1heSBiZQotICAgb3V0IG9mIGx1Y2s7IHRoZXJlJ3Mgbm8gLS1jb21wYXRpYmlsaXR5IG9yIC0tcGVkYW50aWMgb3B0aW9uLgotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWZuZGVmIEJTRF9ERUZBVUxUCi0jZGVmaW5lIEJTRF9ERUZBVUxUIDEKLSNlbmRpZgotCi0vKiBQcm9ncmFtIG9wdGlvbnMuICAqLwotCi1lbnVtCi0gIHsKLSAgICBkZWNpbWFsLCBvY3RhbCwgaGV4Ci0gIH0gcmFkaXggPSBkZWNpbWFsOwotaW50IGJlcmtlbGV5X2Zvcm1hdCA9IEJTRF9ERUZBVUxUOwkvKiAwIG1lYW5zIHVzZSBBVCZULXN0eWxlIG91dHB1dC4gICovCi1pbnQgc2hvd192ZXJzaW9uID0gMDsKLWludCBzaG93X2hlbHAgPSAwOwotCi0vKiBQcm9ncmFtIGV4aXQgc3RhdHVzLiAgKi8KLWludCByZXR1cm5fY29kZSA9IDA7Ci0KLXN0YXRpYyBjaGFyICp0YXJnZXQgPSBOVUxMOwotCi0vKiBTdGF0aWMgZGVjbGFyYXRpb25zICovCi0KLXN0YXRpYyB2b2lkIHVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkaXNwbGF5X2ZpbGUgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLXN0YXRpYyB2b2lkIGRpc3BsYXlfYmZkIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBkaXNwbGF5X2FyY2hpdmUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgc2l6ZV9udW1iZXIgUEFSQU1TICgoYmZkX3NpemVfdHlwZSkpOwotI2lmIDAKLXN0YXRpYyB2b2lkIGxwcmludF9udW1iZXIgUEFSQU1TICgoaW50LCBiZmRfc2l6ZV90eXBlKSk7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIHJwcmludF9udW1iZXIgUEFSQU1TICgoaW50LCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9iZXJrZWxleV9mb3JtYXQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHN5c3ZfaW50ZXJuYWxfc2l6ZXIgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgc3lzdl9pbnRlcm5hbF9wcmludGVyIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIHByaW50X3N5c3ZfZm9ybWF0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zaXplcyBQQVJBTVMgKChiZmQgKiBmaWxlKSk7Ci1zdGF0aWMgdm9pZCBiZXJrZWxleV9zdW0gUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUikpOwotDAotc3RhdGljIHZvaWQKLXVzYWdlIChzdHJlYW0sIHN0YXR1cykKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBpbnQgc3RhdHVzOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLVVzYWdlOiAlcyBbLUFCZG94Vl0gWy0tZm9ybWF0PWJlcmtlbGV5fHN5c3ZdIFstLXJhZGl4PTh8MTB8MTZdXG5cCi0gICAgICAgWy0tdGFyZ2V0PWJmZG5hbWVdIFstLXZlcnNpb25dIFstLWhlbHBdIFtmaWxlLi4uXVxuIiksIHByb2dyYW1fbmFtZSk7Ci0jaWYgQlNEX0RFRkFVTFQKLSAgZnB1dHMgKF8oImRlZmF1bHQgaXMgLS1mb3JtYXQ9YmVya2VsZXlcbiIpLCBzdHJlYW0pOwotI2Vsc2UKLSAgZnB1dHMgKF8oImRlZmF1bHQgaXMgLS1mb3JtYXQ9c3lzdlxuIiksIHN0cmVhbSk7Ci0jZW5kaWYKLSAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsiZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIDIwMH0sCi0gIHsicmFkaXgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgMjAxfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgMjAyfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsICZzaG93X3ZlcnNpb24sIDF9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgJnNob3dfaGVscCwgMX0sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgdGVtcDsKLSAgaW50IGM7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSAqYXJndjsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiQUJWZG94IiwgbG9uZ19vcHRpb25zLAotCQkJICAgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHN3aXRjaCAoYykKLSAgICAgIHsKLSAgICAgIGNhc2UgMjAwOgkJLyogLS1mb3JtYXQgKi8KLQlzd2l0Y2ggKCpvcHRhcmcpCi0JICB7Ci0JICBjYXNlICdCJzoKLQkgIGNhc2UgJ2InOgotCSAgICBiZXJrZWxleV9mb3JtYXQgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ1MnOgotCSAgY2FzZSAncyc6Ci0JICAgIGJlcmtlbGV5X2Zvcm1hdCA9IDA7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJpbnZhbGlkIGFyZ3VtZW50IHRvIC0tZm9ybWF0OiAlc1xuIiksIG9wdGFyZyk7Ci0JICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgfQotCWJyZWFrOwotCi0gICAgICBjYXNlIDIwMjoJCS8qIC0tdGFyZ2V0ICovCi0JdGFyZ2V0ID0gb3B0YXJnOwotCWJyZWFrOwotCi0gICAgICBjYXNlIDIwMToJCS8qIC0tcmFkaXggKi8KLSNpZmRlZiBBTlNJX0xJQlJBUklFUwotCXRlbXAgPSBzdHJ0b2wgKG9wdGFyZywgTlVMTCwgMTApOwotI2Vsc2UKLQl0ZW1wID0gYXRvbCAob3B0YXJnKTsKLSNlbmRpZgotCXN3aXRjaCAodGVtcCkKLQkgIHsKLQkgIGNhc2UgMTA6Ci0JICAgIHJhZGl4ID0gZGVjaW1hbDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDg6Ci0JICAgIHJhZGl4ID0gb2N0YWw7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAxNjoKLQkgICAgcmFkaXggPSBoZXg7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgcHJpbnRmIChfKCJJbnZhbGlkIHJhZGl4OiAlc1xuIiksIG9wdGFyZyk7Ci0JICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgfQotCWJyZWFrOwotCi0gICAgICBjYXNlICdBJzoKLQliZXJrZWxleV9mb3JtYXQgPSAwOwotCWJyZWFrOwotICAgICAgY2FzZSAnQic6Ci0JYmVya2VsZXlfZm9ybWF0ID0gMTsKLQlicmVhazsKLSAgICAgIGNhc2UgJ1YnOgotCXNob3dfdmVyc2lvbiA9IDE7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICdkJzoKLQlyYWRpeCA9IGRlY2ltYWw7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICd4JzoKLQlyYWRpeCA9IGhleDsKLQlicmVhazsKLSAgICAgIGNhc2UgJ28nOgotCXJhZGl4ID0gb2N0YWw7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDA6Ci0JYnJlYWs7Ci0gICAgICBjYXNlICc/JzoKLQl1c2FnZSAoc3RkZXJyLCAxKTsKLSAgICAgIH0KLQotICBpZiAoc2hvd192ZXJzaW9uKQotICAgIHByaW50X3ZlcnNpb24gKCJzaXplIik7Ci0gIGlmIChzaG93X2hlbHApCi0gICAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0KLSAgaWYgKG9wdGluZCA9PSBhcmdjKQotICAgIGRpc3BsYXlfZmlsZSAoImEub3V0Iik7Ci0gIGVsc2UKLSAgICBmb3IgKDsgb3B0aW5kIDwgYXJnYzspCi0gICAgICBkaXNwbGF5X2ZpbGUgKGFyZ3Zbb3B0aW5kKytdKTsKLQotICByZXR1cm4gcmV0dXJuX2NvZGU7Ci19Ci0MCi0vKiBEaXNwbGF5IHN0YXRzIG9uIGZpbGUgb3IgYXJjaGl2ZSBtZW1iZXIgQUJGRC4gICovCi0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2JmZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICoqbWF0Y2hpbmc7Ci0KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9hcmNoaXZlKSkKLSAgICAvKiBBbiBhcmNoaXZlIHdpdGhpbiBhbiBhcmNoaXZlLiAgKi8KLSAgICByZXR1cm47Ci0KLSAgaWYgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBwcmludF9zaXplcyAoYWJmZCk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0gICAgICBmcmVlIChtYXRjaGluZyk7Ci0gICAgICByZXR1cm5fY29kZSA9IDM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9jb3JlLCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIENPTlNUIGNoYXIgKmNvcmVfY21kOwotCi0gICAgICBwcmludF9zaXplcyAoYWJmZCk7Ci0gICAgICBmcHV0cyAoIiAoY29yZSBmaWxlIiwgc3Rkb3V0KTsKLQotICAgICAgY29yZV9jbWQgPSBiZmRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCk7Ci0gICAgICBpZiAoY29yZV9jbWQpCi0JcHJpbnRmICgiIGludm9rZWQgYXMgJXMiLCBjb3JlX2NtZCk7Ci0KLSAgICAgIHB1dHMgKCIpXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLSAgICB7Ci0gICAgICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLSAgICAgIGZyZWUgKG1hdGNoaW5nKTsKLSAgICB9Ci0KLSAgcmV0dXJuX2NvZGUgPSAzOwotfQotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9hcmNoaXZlIChmaWxlKQotICAgICBiZmQgKmZpbGU7Ci17Ci0gIGJmZCAqYXJmaWxlID0gKGJmZCAqKSBOVUxMOwotCi0gIGZvciAoOzspCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLQotICAgICAgYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZmlsZSwgYXJmaWxlKTsKLSAgICAgIGlmIChhcmZpbGUgPT0gTlVMTCkKLQl7Ci0JICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcykKLQkgICAgewotCSAgICAgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoZmlsZSkpOwotCSAgICAgIHJldHVybl9jb2RlID0gMjsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBkaXNwbGF5X2JmZCAoYXJmaWxlKTsKLSAgICAgIC8qIERvbid0IGNsb3NlIHRoZSBhcmNoaXZlIGVsZW1lbnRzOyB3ZSBuZWVkIHRoZW0gZm9yIG5leHRfYXJjaGl2ZSAqLwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfZmlsZSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBiZmQgKmZpbGUgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoZmlsZW5hbWUpOwotICAgICAgcmV0dXJuX2NvZGUgPSAxOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZmlsZSwgYmZkX2FyY2hpdmUpID09IHRydWUpCi0gICAgZGlzcGxheV9hcmNoaXZlIChmaWxlKTsKLSAgZWxzZQotICAgIGRpc3BsYXlfYmZkIChmaWxlKTsKLQotICBpZiAoYmZkX2Nsb3NlIChmaWxlKSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGZpbGVuYW1lKTsKLSAgICAgIHJldHVybl9jb2RlID0gMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0MCi0vKiBUaGlzIGlzIHdoYXQgbGV4aWNhbCBmdW5jdGlvbnMgYXJlIGZvci4gICovCi0KLXN0YXRpYyBpbnQKLXNpemVfbnVtYmVyIChudW0pCi0gICAgIGJmZF9zaXplX3R5cGUgbnVtOwotewotICBjaGFyIGJ1ZmZlcls0MF07Ci0gIHNwcmludGYgKGJ1ZmZlciwKLQkgICAocmFkaXggPT0gZGVjaW1hbCA/ICIlbHUiIDoKLQkgICAoKHJhZGl4ID09IG9jdGFsKSA/ICIwJWxvIiA6ICIweCVseCIpKSwKLQkgICAodW5zaWduZWQgbG9uZykgbnVtKTsKLQotICByZXR1cm4gc3RybGVuIChidWZmZXIpOwotfQotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vdCB1c2VkLiAgKi8KLQotc3RhdGljIHZvaWQKLWxwcmludF9udW1iZXIgKHdpZHRoLCBudW0pCi0gICAgIGludCB3aWR0aDsKLSAgICAgYmZkX3NpemVfdHlwZSBudW07Ci17Ci0gIGNoYXIgYnVmZmVyWzQwXTsKLSAgc3ByaW50ZiAoYnVmZmVyLAotCSAgIChyYWRpeCA9PSBkZWNpbWFsID8gIiVsdSIgOgotCSAgICgocmFkaXggPT0gb2N0YWwpID8gIjAlbG8iIDogIjB4JWx4IikpLAotCSAgICh1bnNpZ25lZCBsb25nKSBudW0pOwotCi0gIHByaW50ZiAoIiUtKnMiLCB3aWR0aCwgYnVmZmVyKTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1ycHJpbnRfbnVtYmVyICh3aWR0aCwgbnVtKQotICAgICBpbnQgd2lkdGg7Ci0gICAgIGJmZF9zaXplX3R5cGUgbnVtOwotewotICBjaGFyIGJ1ZmZlcls0MF07Ci0gIHNwcmludGYgKGJ1ZmZlciwKLQkgICAocmFkaXggPT0gZGVjaW1hbCA/ICIlbHUiIDoKLQkgICAoKHJhZGl4ID09IG9jdGFsKSA/ICIwJWxvIiA6ICIweCVseCIpKSwKLQkgICAodW5zaWduZWQgbG9uZykgbnVtKTsKLQotICBwcmludGYgKCIlKnMiLCB3aWR0aCwgYnVmZmVyKTsKLX0KLQotc3RhdGljIGJmZF9zaXplX3R5cGUgYnNzc2l6ZTsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIGRhdGFzaXplOwotc3RhdGljIGJmZF9zaXplX3R5cGUgdGV4dHNpemU7Ci0KLXN0YXRpYyB2b2lkCi1iZXJrZWxleV9zdW0gKGFiZmQsIHNlYywgaWdub3JlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjOwotICAgICBQVFIgaWdub3JlOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0gIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpOwotICBpZiAoKGZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotICAgIHJldHVybjsKLQotICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWMpOwotICBpZiAoKGZsYWdzICYgU0VDX0NPREUpICE9IDAgfHwgKGZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwKQotICAgIHRleHRzaXplICs9IHNpemU7Ci0gIGVsc2UgaWYgKChmbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0gICAgZGF0YXNpemUgKz0gc2l6ZTsKLSAgZWxzZQotICAgIGJzc3NpemUgKz0gc2l6ZTsKLX0KLQotc3RhdGljIHZvaWQgCi1wcmludF9iZXJrZWxleV9mb3JtYXQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RhdGljIGludCBmaWxlc19zZWVuID0gMDsKLSAgYmZkX3NpemVfdHlwZSB0b3RhbDsKLQotICBic3NzaXplID0gMDsKLSAgZGF0YXNpemUgPSAwOwotICB0ZXh0c2l6ZSA9IDA7Ci0KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBiZXJrZWxleV9zdW0sIChQVFIpIE5VTEwpOwotCi0gIGlmIChmaWxlc19zZWVuKysgPT0gMCkKLSNpZiAwCi0gICAgLyogSW50ZWwgZG9lc24ndCBsaWtlIGJzcy9zdGsgYmVjYXVzZSB0aGV5IGRvbid0IGhhdmUgY29yZSBmaWxlcy4gICovCi0gICAgcHV0cyAoKHJhZGl4ID09IG9jdGFsKSA/ICIgICB0ZXh0XHQgICBkYXRhXHRic3Mvc3RrXHQgICAgb2N0XHQgICAgaGV4XHRmaWxlbmFtZSIgOgotCSAgIiAgIHRleHRcdCAgIGRhdGFcdGJzcy9zdGtcdCAgICBkZWNcdCAgICBoZXhcdGZpbGVuYW1lIik7Ci0jZWxzZQotICAgIHB1dHMgKChyYWRpeCA9PSBvY3RhbCkgPyAiICAgdGV4dFx0ICAgZGF0YVx0ICAgIGJzc1x0ICAgIG9jdFx0ICAgIGhleFx0ZmlsZW5hbWUiIDoKLQkgICIgICB0ZXh0XHQgICBkYXRhXHQgICAgYnNzXHQgICAgZGVjXHQgICAgaGV4XHRmaWxlbmFtZSIpOwotI2VuZGlmCi0KLSAgdG90YWwgPSB0ZXh0c2l6ZSArIGRhdGFzaXplICsgYnNzc2l6ZTsKLQotICBycHJpbnRfbnVtYmVyICg3LCB0ZXh0c2l6ZSk7Ci0gIHB1dGNoYXIgKCdcdCcpOwotICBycHJpbnRfbnVtYmVyICg3LCBkYXRhc2l6ZSk7Ci0gIHB1dGNoYXIgKCdcdCcpOwotICBycHJpbnRfbnVtYmVyICg3LCBic3NzaXplKTsKLSAgcHJpbnRmICgoKHJhZGl4ID09IG9jdGFsKSA/ICJcdCU3bG9cdCU3bHhcdCIgOiAiXHQlN2x1XHQlN2x4XHQiKSwKLQkgICh1bnNpZ25lZCBsb25nKSB0b3RhbCwgKHVuc2lnbmVkIGxvbmcpIHRvdGFsKTsKLQotICBmcHV0cyAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN0ZG91dCk7Ci0gIGlmIChiZmRfbXlfYXJjaGl2ZSAoYWJmZCkpCi0gICAgcHJpbnRmICgiIChleCAlcykiLCBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoYWJmZCkpKTsKLX0KLQotLyogSSBSRUFMTFkgbWlzcyBsZXhpY2FsIGZ1bmN0aW9ucyEgKi8KLWJmZF9zaXplX3R5cGUgc3ZpX3RvdGFsID0gMDsKLWJmZF92bWEgc3ZpX21heHZtYSA9IDA7Ci1pbnQgc3ZpX25hbWVsZW4gPSAwOwotaW50IHN2aV92bWFsZW4gPSAwOwotaW50IHN2aV9zaXplbGVuID0gMDsKLQotc3RhdGljIHZvaWQKLXN5c3ZfaW50ZXJuYWxfc2l6ZXIgKGZpbGUsIHNlYywgaWdub3JlKQotICAgICBiZmQgKmZpbGU7Ci0gICAgIHNlY19wdHIgc2VjOwotICAgICBQVFIgaWdub3JlOwotewotICBiZmRfc2l6ZV90eXBlIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChmaWxlLCBzZWMpOwotICBpZiAoIWJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKQotICAgICAgJiYgIWJmZF9pc19jb21fc2VjdGlvbiAoc2VjKQotICAgICAgJiYgIWJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSkKLSAgICB7Ci0gICAgICBpbnQgbmFtZWxlbiA9IHN0cmxlbiAoYmZkX3NlY3Rpb25fbmFtZSAoZmlsZSwgc2VjKSk7Ci0gICAgICBpZiAobmFtZWxlbiA+IHN2aV9uYW1lbGVuKQotCXN2aV9uYW1lbGVuID0gbmFtZWxlbjsKLQotICAgICAgc3ZpX3RvdGFsICs9IHNpemU7Ci0gICAgICBpZiAoYmZkX3NlY3Rpb25fdm1hIChmaWxlLCBzZWMpID4gc3ZpX21heHZtYSkKLQlzdmlfbWF4dm1hID0gYmZkX3NlY3Rpb25fdm1hIChmaWxlLCBzZWMpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXN5c3ZfaW50ZXJuYWxfcHJpbnRlciAoZmlsZSwgc2VjLCBpZ25vcmUpCi0gICAgIGJmZCAqZmlsZTsKLSAgICAgc2VjX3B0ciBzZWM7Ci0gICAgIFBUUiBpZ25vcmU7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGZpbGUsIHNlYyk7Ci0gIGlmICghYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpCi0gICAgICAmJiAhYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpCi0gICAgICAmJiAhYmZkX2lzX3VuZF9zZWN0aW9uIChzZWMpKQotICAgIHsKLSAgICAgIHN2aV90b3RhbCArPSBzaXplOwotCi0gICAgICBwcmludGYgKCIlLSpzICAgIiwgc3ZpX25hbWVsZW4sIGJmZF9zZWN0aW9uX25hbWUgKGZpbGUsIHNlYykpOwotICAgICAgcnByaW50X251bWJlciAoc3ZpX3NpemVsZW4sIHNpemUpOwotICAgICAgcHJpbnRmICgiICAgIik7Ci0gICAgICBycHJpbnRfbnVtYmVyIChzdmlfdm1hbGVuLCBiZmRfc2VjdGlvbl92bWEgKGZpbGUsIHNlYykpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeXN2X2Zvcm1hdCAoZmlsZSkKLSAgICAgYmZkICpmaWxlOwotewotICAvKiBzaXplIGFsbCBvZiB0aGUgY29sdW1ucyAqLwotICBzdmlfdG90YWwgPSAwOwotICBzdmlfbWF4dm1hID0gMDsKLSAgc3ZpX25hbWVsZW4gPSAwOwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGZpbGUsIHN5c3ZfaW50ZXJuYWxfc2l6ZXIsIChQVFIpIE5VTEwpOwotICBzdmlfdm1hbGVuID0gc2l6ZV9udW1iZXIgKChiZmRfc2l6ZV90eXBlKXN2aV9tYXh2bWEpOwotICBpZiAoKHNpemVfdCkgc3ZpX3ZtYWxlbiA8IHNpemVvZiAoImFkZHIiKSAtIDEpCi0gICAgc3ZpX3ZtYWxlbiA9IHNpemVvZiAoImFkZHIiKS0xOwotCi0gIHN2aV9zaXplbGVuID0gc2l6ZV9udW1iZXIgKHN2aV90b3RhbCk7Ci0gIGlmICgoc2l6ZV90KSBzdmlfc2l6ZWxlbiA8IHNpemVvZiAoInNpemUiKSAtIDEpCi0gICAgc3ZpX3NpemVsZW4gPSBzaXplb2YgKCJzaXplIiktMTsKLQotICBzdmlfdG90YWwgPSAwOwotICBwcmludGYgKCIlcyAgIiwgYmZkX2dldF9maWxlbmFtZSAoZmlsZSkpOwotICBpZiAoYmZkX215X2FyY2hpdmUgKGZpbGUpKQotICAgIHByaW50ZiAoIiAoZXggJXMpIiwgYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGZpbGUpKSk7Ci0KLSAgcHJpbnRmICgiOlxuJS0qcyAgICUqcyAgICUqc1xuIiwgc3ZpX25hbWVsZW4sICJzZWN0aW9uIiwKLQkgIHN2aV9zaXplbGVuLCAic2l6ZSIsIHN2aV92bWFsZW4sICJhZGRyIik7Ci0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoZmlsZSwgc3lzdl9pbnRlcm5hbF9wcmludGVyLCAoUFRSKSBOVUxMKTsKLQotICBwcmludGYgKCIlLSpzICAgIiwgc3ZpX25hbWVsZW4sICJUb3RhbCIpOwotICBycHJpbnRfbnVtYmVyIChzdmlfc2l6ZWxlbiwgc3ZpX3RvdGFsKTsKLSAgcHJpbnRmICgiXG5cbiIpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc2l6ZXMgKGZpbGUpCi0gICAgIGJmZCAqZmlsZTsKLXsKLSAgaWYgKGJlcmtlbGV5X2Zvcm1hdCkKLSAgICBwcmludF9iZXJrZWxleV9mb3JtYXQgKGZpbGUpOwotICBlbHNlCi0gICAgcHJpbnRfc3lzdl9mb3JtYXQgKGZpbGUpOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvc3Jjb252LmMgYi9iaW51dGlscy9zcmNvbnYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIwZjJiNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zcmNvbnYuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMzYgKzAsMCBAQAotLyogc3Jjb252LmMgLS0gU3lzcm9mZiBjb252ZXJzaW9uIHByb2dyYW0KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiAoc2FjQGN5Z251cy5jb20pCi0KLSAgIFRoaXMgcHJvZ3JhbSBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGEgY29mZiBvYmplY3QgZmlsZQotICAgaW50byBhIEhpdGFjaGkgT00vTE0gKFN5c3JvZmYpIGZvcm1hdC4KLQotICAgQWxsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBwcmVzZXJ2ZWQgKi8KLQotI2luY2x1ZGUgPGJmZC5oPgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgInN5c3JvZmYuaCIKLSNpbmNsdWRlICJjb2ZmZ3Jvay5oIgotI2luY2x1ZGUgPGxpYmliZXJ0eS5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIi4uL2JmZC9saWJjb2ZmLmgiCi0KLSNkZWZpbmUgUFJPR1JBTV9WRVJTSU9OICIxLjUiCi0vKiNkZWZpbmUgRk9PUDEgMSAqLwotCi1zdGF0aWMgaW50IGFkZHJzaXplOwotc3RhdGljIGNoYXIgKnRvb2xuYW1lOwotc3RhdGljIGNoYXIgKipybmFtZXM7Ci0KLXN0YXRpYyB2b2lkIHdyX2NzICgpOwotc3RhdGljIHZvaWQgd2Fsa190cmVlX3Njb3BlICgpOwotc3RhdGljIHZvaWQgd3JfZ2xvYmFscyAoKTsKLXN0YXRpYyBpbnQgZmluZF9iYXNlICgpOwotCi1zdGF0aWMgRklMRSAqZmlsZTsKLXN0YXRpYyBiZmQgKmFiZmQ7Ci1zdGF0aWMgaW50IGRlYnVnID0gMDsKLXN0YXRpYyBpbnQgcXVpY2sgPSAwOwotc3RhdGljIGludCBub3ByZXNjYW4gPSAwOwotc3RhdGljIHN0cnVjdCBjb2ZmX29maWxlICp0cmVlOwotLyogT2Jzb2xldGUgPz8gCi0gICBzdGF0aWMgaW50IGFic29sdXRlX3A7Ci0gKi8KLQotc3RhdGljIGludCBzZWdtZW50ZWRfcDsKLXN0YXRpYyBpbnQgY29kZTsKLQotc3RhdGljIGludCBpZHMxWzIwMDAwXTsKLXN0YXRpYyBpbnQgaWRzMlsyMDAwMF07Ci0KLXN0YXRpYyBpbnQgYmFzZTEgPSAweDE4Owotc3RhdGljIGludCBiYXNlMiA9IDB4MjAxODsKLQotc3RhdGljIGludAotZ2V0X21lbWJlcl9pZCAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIGlmIChpZHMyW3hdKQotICAgIHsKLSAgICAgIHJldHVybiBpZHMyW3hdOwotICAgIH0KLSAgaWRzMlt4XSA9IGJhc2UyKys7Ci0gIHJldHVybiBpZHMyW3hdOwotfQotCi1zdGF0aWMgaW50Ci1nZXRfb3JkaW5hcnlfaWQgKHgpCi0gICAgIGludCB4OwotewotICBpZiAoaWRzMVt4XSkKLSAgICB7Ci0gICAgICByZXR1cm4gaWRzMVt4XTsKLSAgICB9Ci0gIGlkczFbeF0gPSBiYXNlMSsrOwotICByZXR1cm4gaWRzMVt4XTsKLX0KLXN0YXRpYyBjaGFyICoKLXNlY3Rpb25fdHJhbnNsYXRlIChuKQotICAgICBjaGFyICpuOwotewotICBpZiAoc3RyY21wIChuLCAiLnRleHQiKSA9PSAwKQotICAgIHJldHVybiAiUCI7Ci0gIGlmIChzdHJjbXAgKG4sICIuZGF0YSIpID09IDApCi0gICAgcmV0dXJuICJEIjsKLSAgaWYgKHN0cmNtcCAobiwgIi5ic3MiKSA9PSAwKQotICAgIHJldHVybiAiQiI7Ci0gIHJldHVybiBuOwotfQotCi0KLQotI2RlZmluZSBEQVRFICI5NDAyMDEwNzMwMDAiOwkvKiBKdXN0IGEgdGltZSBvbiBteSBiaXJ0aGRheSAqLwotCi0KLXN0YXRpYwotY2hhciAqCi1zdHJpcF9zdWZmaXggKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGludCBpOwotICBjaGFyICpyZXM7Ci0gIGZvciAoaSA9IDA7IG5hbWVbaV0gIT0gMCAmJiBuYW1lW2ldICE9ICcuJzsgaSsrKQotICAgIDsKLSAgcmVzID0gKGNoYXIgKikgeG1hbGxvYyAoaSArIDEpOwotICBtZW1jcHkgKHJlcywgbmFtZSwgaSk7Ci0gIHJlc1tpXSA9IDA7Ci0gIHJldHVybiByZXM7Ci19Ci0KLQotLyogSVQgTEVOIHN0dWZmIENTICovCi1zdGF0aWMgdm9pZAotY2hlY2tzdW0gKGZpbGUsIHB0ciwgc2l6ZSwgY29kZSkKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgY2hhciAqcHRyOwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IGNvZGU7Ci17Ci0gIGludCBqOwotICBpbnQgbGFzdDsKLSAgaW50IHN1bSA9IDA7Ci0gIGludCBieXRlcyA9IHNpemUgLyA4OwotICBsYXN0ID0gIShjb2RlICYgMHhmZjAwKTsKLSAgaWYgKHNpemUgJiAweDcpCi0gICAgYWJvcnQgKCk7Ci0gIHB0clswXSA9IGNvZGUgfCAobGFzdCA/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+c2l6ZSArPSBzLT50eXBlLT5zaXplOwotCSAgY29tbW9uX3NlY3Rpb24tPnNpemUgPSBhbGlnbiAoY29tbW9uX3NlY3Rpb24tPnNpemUpOwotCX0KLSAgICB9Ci19Ci0KLWNoYXIgKnByb2dyYW1fbmFtZTsKLQotc3RhdGljIHZvaWQKLXNob3dfdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiVXNhZ2U6ICVzIFstZGhWcV0gaW4tZmlsZSBbb3V0LWZpbGVdXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQKLXNob3dfaGVscCAoKQotewotICBwcmludGYgKF8oIiVzOiBDb252ZXJ0IGEgQ09GRiBvYmplY3QgZmlsZSBpbnRvIGEgU1lTUk9GRiBvYmplY3QgZmlsZVxuIiksCi0JICBwcm9ncmFtX25hbWUpOwotICBzaG93X3VzYWdlIChzdGRvdXQsIDApOwotfQotCi0KLQotaW50Ci1tYWluIChhYywgYXYpCi0gICAgIGludCBhYzsKLSAgICAgY2hhciAqYXZbXTsKLXsKLSAgaW50IG9wdDsKLSAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotICB7Ci0gICAgeyJkZWJ1ZyIsIG5vX2FyZ3VtZW50LCAwLCAnZCd9LAotICAgIHsicXVpY2siLCBub19hcmd1bWVudCwgMCwgJ3EnfSwKLSAgICB7Im5vcHJlc2NhbiIsIG5vX2FyZ3VtZW50LCAwLCAnbid9LAotICAgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICAgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAnVid9LAotICAgIHtOVUxMLCBub19hcmd1bWVudCwgMCwgMH0KLSAgfTsKLSAgY2hhciAqKm1hdGNoaW5nOwotICBjaGFyICppbnB1dF9maWxlOwotICBjaGFyICpvdXRwdXRfZmlsZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGF2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyAoYWMsIGF2LCAiZGhWcW4iLCBsb25nX29wdGlvbnMsCi0JCQkgICAgIChpbnQgKikgTlVMTCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9wdCkKLQl7Ci0JY2FzZSAncSc6Ci0JICBxdWljayA9IDE7Ci0JICBicmVhazsKLQljYXNlICduJzoKLQkgIG5vcHJlc2NhbiA9IDE7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGRlYnVnID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgc2hvd19oZWxwICgpOwotCSAgLypOT1RSRUFDSEVEICovCi0JY2FzZSAnVic6Ci0JICBwcmludGYgKF8oIkdOVSAlcyB2ZXJzaW9uICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBQUk9HUkFNX1ZFUlNJT04pOwotCSAgZXhpdCAoMCk7Ci0JICAvKk5PVFJFQUNIRUQgKi8KLQljYXNlIDA6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLQkgIC8qTk9UUkVBQ0hFRCAqLwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgbWF5IGJlIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotICBvdXRwdXRfZmlsZSA9IE5VTEw7Ci0gIGlmIChvcHRpbmQgPCBhYykKLSAgICB7Ci0gICAgICBpbnB1dF9maWxlID0gYXZbb3B0aW5kXTsKLSAgICAgICsrb3B0aW5kOwotICAgICAgaWYgKG9wdGluZCA8IGFjKQotCXsKLQkgIG91dHB1dF9maWxlID0gYXZbb3B0aW5kXTsKLQkgICsrb3B0aW5kOwotCSAgaWYgKG9wdGluZCA8IGFjKQotCSAgICBzaG93X3VzYWdlIChzdGRlcnIsIDEpOwotCSAgaWYgKHN0cmNtcCAoaW5wdXRfZmlsZSwgb3V0cHV0X2ZpbGUpID09IDApCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICBfKCIlczogaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtdXN0IGJlIGRpZmZlcmVudFxuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUpOwotCSAgICAgIGV4aXQgKDEpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGlucHV0X2ZpbGUgPSAwOwotCi0gIGlmICghaW5wdXRfZmlsZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZFxuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKCFvdXRwdXRfZmlsZSkKLSAgICB7Ci0gICAgICAvKiBUYWtlIGEgLm8gb2ZmIHRoZSBpbnB1dCBmaWxlIGFuZCBzdGljayBvbiBhIC5vYmouICBJZgotICAgICAgICAgaXQgZG9lc24ndCBlbmQgaW4gLm8sIHRoZW4gc3RpY2sgYSAub2JqIG9uIGFueXdheSAqLwotCi0gICAgICBpbnQgbGVuID0gc3RybGVuIChpbnB1dF9maWxlKTsKLSAgICAgIG91dHB1dF9maWxlID0geG1hbGxvYyAobGVuICsgNSk7Ci0gICAgICBzdHJjcHkgKG91dHB1dF9maWxlLCBpbnB1dF9maWxlKTsKLSAgICAgIGlmIChsZW4gPiAzCi0JICAmJiBvdXRwdXRfZmlsZVtsZW4gLSAyXSA9PSAnLicKLQkgICYmIG91dHB1dF9maWxlW2xlbiAtIDFdID09ICdvJykKLQl7Ci0JICBvdXRwdXRfZmlsZVtsZW5dID0gJ2InOwotCSAgb3V0cHV0X2ZpbGVbbGVuICsgMV0gPSAnaic7Ci0JICBvdXRwdXRfZmlsZVtsZW4gKyAyXSA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cmNhdCAob3V0cHV0X2ZpbGUsICIub2JqIik7Ci0JfQotICAgIH0KLQotICBhYmZkID0gYmZkX29wZW5yIChpbnB1dF9maWxlLCAwKTsKLQotICBpZiAoIWFiZmQpCi0gICAgYmZkX2ZhdGFsIChpbnB1dF9maWxlKTsKLQotICBpZiAoIWJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGlucHV0X2ZpbGUpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZmlsZSA9IGZvcGVuIChvdXRwdXRfZmlsZSwgRk9QRU5fV0IpOwotCi0gIGlmICghZmlsZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bmFibGUgdG8gb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSwgb3V0cHV0X2ZpbGUpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmIChkZWJ1ZykKLSAgICBwcmludGYgKCJpZHMgJWQgJWRcbiIsIGJhc2UxLCBiYXNlMik7Ci0gIHRyZWUgPSBjb2ZmX2dyb2sgKGFiZmQpOwotICBpZiAoIW5vcHJlc2NhbikKLSAgICBwcmVzY2FuICh0cmVlKTsKLSAgd3JfbW9kdWxlICh0cmVlKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zdGFicy5jIGIvYmludXRpbHMvc3RhYnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3YjNiZC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zdGFicy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE4OCArMCwwIEBACi0vKiBzdGFicy5jIC0tIFBhcnNlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIHdoaWNoIHBhcnNlcyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0gICBUaGUgb3JnYW5pemF0aW9uIG9mIHRoaXMgY29kZSBpcyBiYXNlZCBvbiB0aGUgZ2RiIHN0YWJzIHJlYWRpbmcKLSAgIGNvZGUuICBUaGUgam9iIGl0IGRvZXMgaXMgc29tZXdoYXQgZGlmZmVyZW50LCBiZWNhdXNlIGl0IGlzIG5vdAotICAgdHJ5aW5nIHRvIGlkZW50aWZ5IHRoZSBjb3JyZWN0IGFkZHJlc3MgZm9yIGFueXRoaW5nLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlbWFuZ2xlLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJidWRiZy5oIgotCi0vKiBNZWFuaW5nbGVzcyBkZWZpbml0aW9uIG5lZWRzIGJ5IGFvdXQ2NC5oLiAgRklYTUUuICAqLwotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLQotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotCi0jaWZuZGVmIERJUl9TRVBBUkFUT1IKLSNpZmRlZiBfV0lOMzIKLSNkZWZpbmUgRElSX1NFUEFSQVRPUiAnXFwnCi0jZWxzZQotI2RlZmluZSBESVJfU0VQQVJBVE9SICcvJwotI2VuZGlmCi0jZW5kaWYKLQotLyogVGhlIG51bWJlciBvZiBwcmVkZWZpbmVkIFhDT0ZGIHR5cGVzLiAgKi8KLQotI2RlZmluZSBYQ09GRl9UWVBFX0NPVU5UIDM0Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYXMgYSBoYW5kbGUgc28gdGhhdCB0aGUgc3RhYiBwYXJzaW5nIGRvZXNuJ3QKLSAgIG5lZWQgdG8gdXNlIGFueSBzdGF0aWMgdmFyaWFibGVzLiAgKi8KLQotc3RydWN0IHN0YWJfaGFuZGxlCi17Ci0gIC8qIFRoZSBCRkQuICAqLwotICBiZmQgKmFiZmQ7Ci0gIC8qIFRydWUgaWYgdGhpcyBpcyBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0gIGJvb2xlYW4gc2VjdGlvbnM7Ci0gIC8qIFRoZSBzeW1ib2wgdGFibGUuICAqLwotICBhc3ltYm9sICoqc3ltczsKLSAgLyogVGhlIG51bWJlciBvZiBzeW1ib2xzLiAgKi8KLSAgbG9uZyBzeW1jb3VudDsKLSAgLyogVGhlIGFjY3VtdWxhdGVkIGZpbGUgbmFtZSBzdHJpbmcuICAqLwotICBjaGFyICpzb19zdHJpbmc7Ci0gIC8qIFRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBOX1NPIHN5bWJvbC4gICovCi0gIGJmZF92bWEgc29fdmFsdWU7Ci0gIC8qIFRoZSB2YWx1ZSBvZiB0aGUgc3RhcnQgb2YgdGhlIGZpbGUsIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBmaWxlCi0gICAgIHJlbGF0aXZlIE5fTEJSQUMgYW5kIE5fUkJSQUMgc3ltYm9scy4gICovCi0gIGJmZF92bWEgZmlsZV9zdGFydF9vZmZzZXQ7Ci0gIC8qIFRoZSBvZmZzZXQgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiwgc28gdGhhdCB3ZSBjYW4gaGFuZGxlCi0gICAgIGZ1bmN0aW9uIHJlbGF0aXZlIE5fTEJSQUMgYW5kIE5fUkJSQUMgc3ltYm9scy4gICovCi0gIGJmZF92bWEgZnVuY3Rpb25fc3RhcnRfb2Zmc2V0OwotICAvKiBUaGUgdmVyc2lvbiBudW1iZXIgb2YgZ2NjIHdoaWNoIGNvbXBpbGVkIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uCi0gICAgIHVuaXQsIDAgaWYgbm90IGNvbXBpbGVkIGJ5IGdjYy4gICovCi0gIGludCBnY2NfY29tcGlsZWQ7Ci0gIC8qIFdoZXRoZXIgYW4gTl9PUFQgc3ltYm9sIHdhcyBzZWVuIHRoYXQgd2FzIG5vdCBnZW5lcmF0ZWQgYnkgZ2NjLAotICAgICBzbyB0aGF0IHdlIGNhbiBkZXRlY3QgdGhlIFN1blBSTyBjb21waWxlci4gICovCi0gIGJvb2xlYW4gbl9vcHRfZm91bmQ7Ci0gIC8qIFRoZSBtYWluIGZpbGUgbmFtZS4gICovCi0gIGNoYXIgKm1haW5fZmlsZW5hbWU7Ci0gIC8qIEEgc3RhY2sgb2YgdW5maW5pc2hlZCBOX0JJTkNMIGZpbGVzLiAgKi8KLSAgc3RydWN0IGJpbmNsX2ZpbGUgKmJpbmNsX3N0YWNrOwotICAvKiBBIGxpc3Qgb2YgZmluaXNoZWQgTl9CSU5DTCBmaWxlcy4gICovCi0gIHN0cnVjdCBiaW5jbF9maWxlICpiaW5jbF9saXN0OwotICAvKiBXaGV0aGVyIHdlIGFyZSBpbnNpZGUgYSBmdW5jdGlvbiBvciBub3QuICAqLwotICBib29sZWFuIHdpdGhpbl9mdW5jdGlvbjsKLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIHVzZWQgaWYgd2UgaGF2ZSBzZWVuIGFuCi0gICAgIE5fRlVOIHN5bWJvbCB3aGlsZSBpbiBhIGZ1bmN0aW9uLiAgVGhpcyBpcyAtMSBpZiB3ZSBoYXZlIG5vdCBzZWVuCi0gICAgIGFuIE5fRlVOICh0aGUgbm9ybWFsIGNhc2UpLiAgKi8KLSAgYmZkX3ZtYSBmdW5jdGlvbl9lbmQ7Ci0gIC8qIFRoZSBkZXB0aCBvZiBibG9jayBuZXN0aW5nLiAgKi8KLSAgaW50IGJsb2NrX2RlcHRoOwotICAvKiBMaXN0IG9mIHBlbmRpbmcgdmFyaWFibGUgZGVmaW5pdGlvbnMuICAqLwotICBzdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhciAqcGVuZGluZzsKLSAgLyogTnVtYmVyIG9mIGZpbGVzIGZvciB3aGljaCB3ZSBoYXZlIHR5cGVzLiAgKi8KLSAgdW5zaWduZWQgaW50IGZpbGVzOwotICAvKiBMaXN0cyBvZiB0eXBlcyBwZXIgZmlsZS4gICovCi0gIHN0cnVjdCBzdGFiX3R5cGVzICoqZmlsZV90eXBlczsKLSAgLyogUHJlZGVmaW5lZCBYQ09GRiB0eXBlcy4gICovCi0gIGRlYnVnX3R5cGUgeGNvZmZfdHlwZXNbWENPRkZfVFlQRV9DT1VOVF07Ci0gIC8qIFVuZGVmaW5lZCB0YWdzLiAgKi8KLSAgc3RydWN0IHN0YWJfdGFnICp0YWdzOwotICAvKiBTZXQgYnkgcGFyc2Vfc3RhYl90eXBlIGlmIGl0IHNlZXMgYSBzdHJ1Y3R1cmUgZGVmaW5lZCBhcyBhIGNyb3NzCi0gICAgIHJlZmVyZW5jZSB0byBpdHNlbGYuICBSZXNldCBieSBwYXJzZV9zdGFiX3R5cGUgb3RoZXJ3aXNlLiAgKi8KLSAgYm9vbGVhbiBzZWxmX2Nyb3NzcmVmOwotfTsKLQotLyogQSBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMgdXNlZCB0byBob2xkIHBlbmRpbmcgdmFyaWFibGUKLSAgIGRlZmluaXRpb25zIHNlZW4gYmVmb3JlIHRoZSBOX0xCUkFDIG9mIGEgYmxvY2suICAqLwotCi1zdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhcgotewotICAvKiBOZXh0IHBlbmRpbmcgdmFyaWFibGUgZGVmaW5pdGlvbi4gICovCi0gIHN0cnVjdCBzdGFiX3BlbmRpbmdfdmFyICpuZXh0OwotICAvKiBOYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogS2luZC4gICovCi0gIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKLSAgLyogVmFsdWUuICAqLwotICBiZmRfdm1hIHZhbDsKLX07Ci0KLS8qIEEgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzIHVzZWQgdG8gaG9sZCB0aGUgdHlwZXMgZm9yIGEgc2luZ2xlCi0gICBmaWxlLiAgKi8KLQotc3RydWN0IHN0YWJfdHlwZXMKLXsKLSAgLyogTmV4dCBzZXQgb2Ygc2xvdHMgZm9yIHRoaXMgZmlsZS4gICovCi0gIHN0cnVjdCBzdGFiX3R5cGVzICpuZXh0OwotICAvKiBUeXBlcyBpbmRleGVkIGJ5IHR5cGUgbnVtYmVyLiAgKi8KLSNkZWZpbmUgU1RBQl9UWVBFU19TTE9UUyAoMTYpCi0gIGRlYnVnX3R5cGUgdHlwZXNbU1RBQl9UWVBFU19TTE9UU107Ci19OwotCi0vKiBXZSBrZWVwIGEgbGlzdCBvZiB1bmRlZmluZWQgdGFncyB0aGF0IHdlIGVuY291bnRlciwgc28gdGhhdCB3ZSBjYW4KLSAgIGZpbGwgdGhlbSBpbiBpZiB0aGUgdGFnIGlzIGxhdGVyIGRlZmluZWQuICAqLwotCi1zdHJ1Y3Qgc3RhYl90YWcKLXsKLSAgLyogTmV4dCB1bmRlZmluZWQgdGFnLiAgKi8KLSAgc3RydWN0IHN0YWJfdGFnICpuZXh0OwotICAvKiBUYWcgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFR5cGUga2luZC4gICovCi0gIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci0gIC8qIFNsb3QgdG8gaG9sZCByZWFsIHR5cGUgd2hlbiB3ZSBkaXNjb3ZlciBpdC4gIElmIHdlIGRvbid0LCB3ZSBmaWxsCi0gICAgIGluIGFuIHVuZGVmaW5lZCB0YWcgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgc2xvdDsKLSAgLyogSW5kaXJlY3QgdHlwZSB3ZSBoYXZlIGNyZWF0ZWQgdG8gcG9pbnQgYXQgc2xvdC4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLX07Ci0KLXN0YXRpYyBjaGFyICpzYXZlc3RyaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgYmZkX3ZtYSBwYXJzZV9udW1iZXIgUEFSQU1TICgoY29uc3QgY2hhciAqKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgdm9pZCBiYWRfc3RhYiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHdhcm5fc3RhYiBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl9zdHJpbmcKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgaW50LCBpbnQsIGJmZF92bWEsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwKLQkgICBkZWJ1Z190eXBlICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9zdGFiX3R5cGVfbnVtYmVyCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiosIGludCAqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX3JhbmdlX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGludCAqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX3N1bl9idWlsdGluX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX3N1bl9mbG9hdGluZ190eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9lbnVtX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX3N0cnVjdF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgYm9vbGVhbiwKLQkgICBjb25zdCBpbnQgKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl9iYXNlY2xhc3NlcwotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z19iYXNlY2xhc3MgKiopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfc3RydWN0X2ZpZWxkcwotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z19maWVsZCAqKiwKLQkgICBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfY3BwX2FiYnJldgotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z19maWVsZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9zdGFiX29uZV9zdHJ1Y3RfZmllbGQKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqLAotCSAgIGRlYnVnX2ZpZWxkICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl9tZW1iZXJzCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBpbnQgKiwgZGVidWdfbWV0aG9kICoqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX2FyZ3R5cGVzCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGRlYnVnX3R5cGUsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCSAgIGRlYnVnX3R5cGUsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl90aWxkZV9maWVsZAotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBjb25zdCBpbnQgKiwKLQkgICBkZWJ1Z190eXBlICosIGJvb2xlYW4gKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9hcnJheV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiosIGJvb2xlYW4pKTsKLXN0YXRpYyB2b2lkIHB1c2hfYmluY2wgUEFSQU1TICgoc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGNvbnN0IGNoYXIgKnBvcF9iaW5jbCBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9oYW5kbGUgKikpOwotc3RhdGljIGJvb2xlYW4gZmluZF9leGNsCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfcmVjb3JkX3ZhcmlhYmxlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwKLQkgICBlbnVtIGRlYnVnX3Zhcl9raW5kLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2VtaXRfcGVuZGluZ192YXJzIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICopKTsKLXN0YXRpYyBkZWJ1Z190eXBlICpzdGFiX2ZpbmRfc2xvdAotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgaW50ICopKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHN0YWJfZmluZF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3JlY29yZF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGludCAqLCBkZWJ1Z190eXBlKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBzdGFiX3hjb2ZmX2J1aWx0aW5fdHlwZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBpbnQpKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHN0YWJfZmluZF90YWdnZWRfdHlwZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGludCwKLQkgICBlbnVtIGRlYnVnX3R5cGVfa2luZCkpOwotc3RhdGljIGRlYnVnX3R5cGUgKnN0YWJfZGVtYW5nbGVfYXJndHlwZXMKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBib29sZWFuICopKTsKLQotLyogU2F2ZSBhIHN0cmluZyBpbiBtZW1vcnkuICAqLwotCi1zdGF0aWMgY2hhciAqCi1zYXZlc3RyaW5nIChzdGFydCwgbGVuKQotICAgICBjb25zdCBjaGFyICpzdGFydDsKLSAgICAgaW50IGxlbjsKLXsKLSAgY2hhciAqcmV0OwotCi0gIHJldCA9IChjaGFyICopIHhtYWxsb2MgKGxlbiArIDEpOwotICBtZW1jcHkgKHJldCwgc3RhcnQsIGxlbik7Ci0gIHJldFtsZW5dID0gJ1wwJzsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUmVhZCBhIG51bWJlciBmcm9tIGEgc3RyaW5nLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLXBhcnNlX251bWJlciAocHAsIHBvdmVyZmxvdykKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBib29sZWFuICpwb3ZlcmZsb3c7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdWw7Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0KLSAgaWYgKHBvdmVyZmxvdyAhPSBOVUxMKQotICAgICpwb3ZlcmZsb3cgPSBmYWxzZTsKLQotICBvcmlnID0gKnBwOwotCi0gIGVycm5vID0gMDsKLSAgdWwgPSBzdHJ0b3VsICgqcHAsIChjaGFyICoqKSBwcCwgMCk7Ci0gIGlmICh1bCArIDEgIT0gMCB8fCBlcnJubyA9PSAwKQotICAgIHsKLSAgICAgIC8qIElmIGJmZF92bWEgaXMgbGFyZ2VyIHRoYW4gdW5zaWduZWQgbG9uZywgYW5kIHRoZSBudW1iZXIgaXMKLSAgICAgICAgIG1lYW50IHRvIGJlIG5lZ2F0aXZlLCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHNpZ24KLSAgICAgICAgIGV4dGVuZCBwcm9wZXJseS4gICovCi0gICAgICBpZiAoKm9yaWcgPT0gJy0nKQotCXJldHVybiAoYmZkX3ZtYSkgKGJmZF9zaWduZWRfdm1hKSAobG9uZykgdWw7Ci0gICAgICByZXR1cm4gKGJmZF92bWEpIHVsOwotICAgIH0KLQotICAvKiBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggc3RydG91bCBvdmVyZmxvd2VkLCBpdCBzaG91bGQgaGF2ZSBzZXQgKnBwCi0gICAgIHRvIHRoZSBlbmQgb2YgdGhlIG51bWJlciwgd2hpY2ggaXMgd2hlcmUgd2Ugd2FudCBpdC4gICovCi0KLSAgaWYgKHNpemVvZiAoYmZkX3ZtYSkgPiBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgICBib29sZWFuIG5lZzsKLSAgICAgIGludCBiYXNlOwotICAgICAgYmZkX3ZtYSBvdmVyLCBsYXN0ZGlnOwotICAgICAgYm9vbGVhbiBvdmVyZmxvdzsKLSAgICAgIGJmZF92bWEgdjsKLQotICAgICAgLyogT3VyIG93biB2ZXJzaW9uIG9mIHN0cnRvdWwsIGZvciBhIGJmZF92bWEuICAqLwotCi0gICAgICBwID0gb3JpZzsKLQotICAgICAgbmVnID0gZmFsc2U7Ci0gICAgICBpZiAoKnAgPT0gJysnKQotCSsrcDsKLSAgICAgIGVsc2UgaWYgKCpwID09ICctJykKLQl7Ci0JICBuZWcgPSB0cnVlOwotCSAgKytwOwotCX0KLQotICAgICAgYmFzZSA9IDEwOwotICAgICAgaWYgKCpwID09ICcwJykKLQl7Ci0JICBpZiAocFsxXSA9PSAneCcgfHwgcFsxXSA9PSAnWCcpCi0JICAgIHsKLQkgICAgICBiYXNlID0gMTY7Ci0JICAgICAgcCArPSAyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiYXNlID0gODsKLQkgICAgICArK3A7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIG92ZXIgPSAoKGJmZF92bWEpIChiZmRfc2lnbmVkX3ZtYSkgLTEpIC8gKGJmZF92bWEpIGJhc2U7Ci0gICAgICBsYXN0ZGlnID0gKChiZmRfdm1hKSAoYmZkX3NpZ25lZF92bWEpIC0xKSAlIChiZmRfdm1hKSBiYXNlOwotCi0gICAgICBvdmVyZmxvdyA9IGZhbHNlOwotICAgICAgdiA9IDA7Ci0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBpbnQgZDsKLQotCSAgZCA9ICpwKys7Ci0JICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGQpKQotCSAgICBkIC09ICcwJzsKLQkgIGVsc2UgaWYgKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBkKSkKLQkgICAgZCAtPSAnQSc7Ci0JICBlbHNlIGlmIChpc2xvd2VyICgodW5zaWduZWQgY2hhcikgZCkpCi0JICAgIGQgLT0gJ2EnOwotCSAgZWxzZQotCSAgICBicmVhazsKLQotCSAgaWYgKGQgPj0gYmFzZSkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmICh2ID4gb3ZlciB8fCAodiA9PSBvdmVyICYmIChiZmRfdm1hKSBkID4gbGFzdGRpZykpCi0JICAgIHsKLQkgICAgICBvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghIG92ZXJmbG93KQotCXsKLQkgIGlmIChuZWcpCi0JICAgIHYgPSAtIHY7Ci0JICByZXR1cm4gdjsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGdldCBoZXJlLCB0aGUgbnVtYmVyIGlzIHRvbyBsYXJnZSB0byByZXByZXNlbnQgaW4gYQotICAgICBiZmRfdm1hLiAgKi8KLQotICBpZiAocG92ZXJmbG93ICE9IE5VTEwpCi0gICAgKnBvdmVyZmxvdyA9IHRydWU7Ci0gIGVsc2UKLSAgICB3YXJuX3N0YWIgKG9yaWcsIF8oIm51bWVyaWMgb3ZlcmZsb3ciKSk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEdpdmUgYW4gZXJyb3IgZm9yIGEgYmFkIHN0YWIgc3RyaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWJhZF9zdGFiIChwKQotICAgICBjb25zdCBjaGFyICpwOwotewotICBmcHJpbnRmIChzdGRlcnIsIF8oIkJhZCBzdGFiOiAlc1xuIiksIHApOwotfQotCi0vKiBXYXJuIGFib3V0IHNvbWV0aGluZyBpbiBhIHN0YWIgc3RyaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLXdhcm5fc3RhYiAocCwgZXJyKQotICAgICBjb25zdCBjaGFyICpwOwotICAgICBjb25zdCBjaGFyICplcnI7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiV2FybmluZzogJXM6ICVzXG4iKSwgZXJyLCBwKTsKLX0KLQotLyogQ3JlYXRlIGEgaGFuZGxlIHRvIHBhcnNlIHN0YWJzIHN5bWJvbHMgd2l0aC4gICovCi0KLS8qQVJHU1VTRUQqLwotUFRSCi1zdGFydF9zdGFiIChkaGFuZGxlLCBhYmZkLCBzZWN0aW9ucywgc3ltcywgc3ltY291bnQpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gc2VjdGlvbnM7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotewotICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKnJldDsKLQotICByZXQgPSAoc3RydWN0IHN0YWJfaGFuZGxlICopIHhtYWxsb2MgKHNpemVvZiAqcmV0KTsKLSAgbWVtc2V0IChyZXQsIDAsIHNpemVvZiAqcmV0KTsKLSAgcmV0LT5hYmZkID0gYWJmZDsKLSAgcmV0LT5zZWN0aW9ucyA9IHNlY3Rpb25zOwotICByZXQtPnN5bXMgPSBzeW1zOwotICByZXQtPnN5bWNvdW50ID0gc3ltY291bnQ7Ci0gIHJldC0+ZmlsZXMgPSAxOwotICByZXQtPmZpbGVfdHlwZXMgPSAoc3RydWN0IHN0YWJfdHlwZXMgKiopIHhtYWxsb2MgKHNpemVvZiAqcmV0LT5maWxlX3R5cGVzKTsKLSAgcmV0LT5maWxlX3R5cGVzWzBdID0gTlVMTDsKLSAgcmV0LT5mdW5jdGlvbl9lbmQgPSAoYmZkX3ZtYSkgLTE7Ci0gIHJldHVybiAoUFRSKSByZXQ7Ci19Ci0KLS8qIFdoZW4gd2UgaGF2ZSBwcm9jZXNzZWQgYWxsIHRoZSBzdGFicyBpbmZvcm1hdGlvbiwgd2UgbmVlZCB0byBnbwotICAgdGhyb3VnaCBhbmQgZmlsbCBpbiBhbGwgdGhlIHVuZGVmaW5lZCB0YWdzLiAgKi8KLQotYm9vbGVhbgotZmluaXNoX3N0YWIgKGRoYW5kbGUsIGhhbmRsZSkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIFBUUiBoYW5kbGU7Ci17Ci0gIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl9oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3Qgc3RhYl90YWcgKnN0OwotCi0gIGlmIChpbmZvLT53aXRoaW5fZnVuY3Rpb24pCi0gICAgewotICAgICAgaWYgKCEgc3RhYl9lbWl0X3BlbmRpbmdfdmFycyAoZGhhbmRsZSwgaW5mbykKLQkgIHx8ICEgZGVidWdfZW5kX2Z1bmN0aW9uIChkaGFuZGxlLCBpbmZvLT5mdW5jdGlvbl9lbmQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZm8tPndpdGhpbl9mdW5jdGlvbiA9IGZhbHNlOwotICAgICAgaW5mby0+ZnVuY3Rpb25fZW5kID0gKGJmZF92bWEpIC0xOwotICAgIH0KLQotICBmb3IgKHN0ID0gaW5mby0+dGFnczsgc3QgIT0gTlVMTDsgc3QgPSBzdC0+bmV4dCkKLSAgICB7Ci0gICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotCi0gICAgICBraW5kID0gc3QtPmtpbmQ7Ci0gICAgICBpZiAoa2luZCA9PSBERUJVR19LSU5EX0lMTEVHQUwpCi0Ja2luZCA9IERFQlVHX0tJTkRfU1RSVUNUOwotICAgICAgc3QtPnNsb3QgPSBkZWJ1Z19tYWtlX3VuZGVmaW5lZF90YWdnZWRfdHlwZSAoZGhhbmRsZSwgc3QtPm5hbWUsIGtpbmQpOwotICAgICAgaWYgKHN0LT5zbG90ID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYW5kbGUgYSBzaW5nbGUgc3RhYnMgc3ltYm9sLiAgKi8KLQotYm9vbGVhbgotcGFyc2Vfc3RhYiAoZGhhbmRsZSwgaGFuZGxlLCB0eXBlLCBkZXNjLCB2YWx1ZSwgc3RyaW5nKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGludCBkZXNjOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl9oYW5kbGUgKikgaGFuZGxlOwotCi0gIC8qIGdjYyB3aWxsIGVtaXQgdHdvIE5fU08gc3RyaW5ncyBwZXIgY29tcGlsYXRpb24gdW5pdCwgb25lIGZvciB0aGUKLSAgICAgZGlyZWN0b3J5IG5hbWUgYW5kIG9uZSBmb3IgdGhlIGZpbGUgbmFtZS4gIFdlIGp1c3QgY29sbGVjdCBOX1NPCi0gICAgIHN0cmluZ3MgYXMgd2Ugc2VlIHRoZW0sIGFuZCBzdGFydCB0aGUgbmV3IGNvbXBpbGF0aW9uIHVuaXQgd2hlbgotICAgICB3ZSBzZWUgYSBub24gTl9TTyBzeW1ib2wuICAqLwotICBpZiAoaW5mby0+c29fc3RyaW5nICE9IE5VTEwKLSAgICAgICYmICh0eXBlICE9IE5fU08gfHwgKnN0cmluZyA9PSAnXDAnIHx8IHZhbHVlICE9IGluZm8tPnNvX3ZhbHVlKSkKLSAgICB7Ci0gICAgICBpZiAoISBkZWJ1Z19zZXRfZmlsZW5hbWUgKGRoYW5kbGUsIGluZm8tPnNvX3N0cmluZykpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5mby0+bWFpbl9maWxlbmFtZSA9IGluZm8tPnNvX3N0cmluZzsKLQotICAgICAgaW5mby0+Z2NjX2NvbXBpbGVkID0gMDsKLSAgICAgIGluZm8tPm5fb3B0X2ZvdW5kID0gZmFsc2U7Ci0KLSAgICAgIC8qIEdlbmVyYWxseSwgZm9yIHN0YWJzIGluIHRoZSBzeW1ib2wgdGFibGUsIHRoZSBOX0xCUkFDIGFuZAotCSBOX1JCUkFDIHN5bWJvbHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBOX1NPIHN5bWJvbCB2YWx1ZS4gICovCi0gICAgICBpZiAoISBpbmZvLT5zZWN0aW9ucykKLQlpbmZvLT5maWxlX3N0YXJ0X29mZnNldCA9IGluZm8tPnNvX3ZhbHVlOwotCi0gICAgICAvKiBXZSBuZWVkIHRvIHJlc2V0IHRoZSBtYXBwaW5nIGZyb20gdHlwZSBudW1iZXJzIHRvIHR5cGVzLiAgV2UKLQkgY2FuJ3QgZnJlZSB0aGUgb2xkIG1hcHBpbmcsIGJlY2F1c2Ugb2YgdGhlIHVzZSBvZgotCSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUuICAqLwotICAgICAgaW5mby0+ZmlsZXMgPSAxOwotICAgICAgaW5mby0+ZmlsZV90eXBlcyA9ICgoc3RydWN0IHN0YWJfdHlwZXMgKiopCi0JCQkgIHhtYWxsb2MgKHNpemVvZiAqaW5mby0+ZmlsZV90eXBlcykpOwotICAgICAgaW5mby0+ZmlsZV90eXBlc1swXSA9IE5VTEw7Ci0KLSAgICAgIGluZm8tPnNvX3N0cmluZyA9IE5VTEw7Ci0KLSAgICAgIC8qIE5vdyBwcm9jZXNzIHdoYXRldmVyIHR5cGUgd2UganVzdCBnb3QuICAqLwotICAgIH0KLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgTl9GTjoKLSAgICBjYXNlIE5fRk5fU0VROgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fTEJSQUM6Ci0gICAgICAvKiBJZ25vcmUgZXh0cmEgb3V0ZXJtb3N0IGNvbnRleHQgZnJvbSBTdW5QUk8gY2MgYW5kIGFjYy4gICovCi0gICAgICBpZiAoaW5mby0+bl9vcHRfZm91bmQgJiYgZGVzYyA9PSAxKQotCWJyZWFrOwotCi0gICAgICBpZiAoISBpbmZvLT53aXRoaW5fZnVuY3Rpb24pCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJOX0xCUkFDIG5vdCB3aXRoaW4gZnVuY3Rpb25cbiIpKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIFN0YXJ0IGFuIGlubmVyIGxleGljYWwgYmxvY2suICAqLwotICAgICAgaWYgKCEgZGVidWdfc3RhcnRfYmxvY2sgKGRoYW5kbGUsCi0JCQkgICAgICAgKHZhbHVlCi0JCQkJKyBpbmZvLT5maWxlX3N0YXJ0X29mZnNldAotCQkJCSsgaW5mby0+ZnVuY3Rpb25fc3RhcnRfb2Zmc2V0KSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBFbWl0IGFueSBwZW5kaW5nIHZhcmlhYmxlIGRlZmluaXRpb25zLiAgKi8KLSAgICAgIGlmICghIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgKGRoYW5kbGUsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgKytpbmZvLT5ibG9ja19kZXB0aDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1JCUkFDOgotICAgICAgLyogSWdub3JlIGV4dHJhIG91dGVybW9zdCBjb250ZXh0IGZyb20gU3VuUFJPIGNjIGFuZCBhY2MuICAqLwotICAgICAgaWYgKGluZm8tPm5fb3B0X2ZvdW5kICYmIGRlc2MgPT0gMSkKLQlicmVhazsKLQotICAgICAgLyogV2Ugc2hvdWxkbid0IGhhdmUgYW55IHBlbmRpbmcgdmFyaWFibGUgZGVmaW5pdGlvbnMgaGVyZSwgYnV0LAotICAgICAgICAgaWYgd2UgZG8sIHdlIHByb2JhYmx5IG5lZWQgdG8gZW1pdCB0aGVtIGJlZm9yZSBjbG9zaW5nIHRoZQotICAgICAgICAgYmxvY2suICAqLwotICAgICAgaWYgKCEgc3RhYl9lbWl0X3BlbmRpbmdfdmFycyAoZGhhbmRsZSwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBFbmQgYW4gaW5uZXIgbGV4aWNhbCBibG9jay4gICovCi0gICAgICBpZiAoISBkZWJ1Z19lbmRfYmxvY2sgKGRoYW5kbGUsCi0JCQkgICAgICh2YWx1ZQotCQkJICAgICAgKyBpbmZvLT5maWxlX3N0YXJ0X29mZnNldAotCQkJICAgICAgKyBpbmZvLT5mdW5jdGlvbl9zdGFydF9vZmZzZXQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC0taW5mby0+YmxvY2tfZGVwdGg7Ci0gICAgICBpZiAoaW5mby0+YmxvY2tfZGVwdGggPCAwKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiVG9vIG1hbnkgTl9SQlJBQ3NcbiIpKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9TTzoKLSAgICAgIC8qIFRoaXMgYWx3YXlzIGVuZHMgYSBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoaW5mby0+d2l0aGluX2Z1bmN0aW9uKQotCXsKLQkgIGJmZF92bWEgZW5kdmFsOwotCi0JICBlbmR2YWwgPSB2YWx1ZTsKLQkgIGlmICgqc3RyaW5nICE9ICdcMCcKLQkgICAgICAmJiBpbmZvLT5mdW5jdGlvbl9lbmQgIT0gKGJmZF92bWEpIC0xCi0JICAgICAgJiYgaW5mby0+ZnVuY3Rpb25fZW5kIDwgZW5kdmFsKQotCSAgICBlbmR2YWwgPSBpbmZvLT5mdW5jdGlvbl9lbmQ7Ci0JICBpZiAoISBzdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKQotCSAgICAgIHx8ICEgZGVidWdfZW5kX2Z1bmN0aW9uIChkaGFuZGxlLCBlbmR2YWwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpbmZvLT53aXRoaW5fZnVuY3Rpb24gPSBmYWxzZTsKLQkgIGluZm8tPmZ1bmN0aW9uX2VuZCA9IChiZmRfdm1hKSAtMTsKLQl9Ci0KLSAgICAgIC8qIEFuIGVtcHR5IHN0cmluZyBpcyBlbWl0dGVkIGJ5IGdjYyBhdCB0aGUgZW5kIG9mIGEgY29tcGlsYXRpb24KLSAgICAgICAgIHVuaXQuICAqLwotICAgICAgaWYgKCpzdHJpbmcgPT0gJ1wwJykKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgLyogSnVzdCBhY2N1bXVsYXRlIHN0cmluZ3MgdW50aWwgd2Ugc2VlIGEgbm9uIE5fU08gc3ltYm9sLiAgSWYKLSAgICAgICAgIHRoZSBzdHJpbmcgc3RhcnRzIHdpdGggYSBkaXJlY3Rvcnkgc2VwYXJhdG9yIG9yIHNvbWUgb3RoZXIKLQkgZm9ybSBvZiBhYnNvbHV0ZSBwYXRoIHNwZWNpZmljYXRpb24sIHdlIGRpc2NhcmQgdGhlIHByZXZpb3VzbHkKLSAgICAgICAgIGFjY3VtdWxhdGVkIHN0cmluZ3MuICAqLwotICAgICAgaWYgKGluZm8tPnNvX3N0cmluZyA9PSBOVUxMKQotCWluZm8tPnNvX3N0cmluZyA9IHhzdHJkdXAgKHN0cmluZyk7Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqZjsKLQotCSAgZiA9IGluZm8tPnNvX3N0cmluZzsKLQotCSAgaWYgKCAgIChzdHJpbmdbMF0gPT0gJy8nKQotCSAgICAgIHx8IChzdHJpbmdbMF0gPT0gRElSX1NFUEFSQVRPUikKLQkgICAgICB8fCAoICAgKERJUl9TRVBBUkFUT1IgPT0gJ1xcJykKLQkJICAmJiAoc3RyaW5nWzFdID09ICc6JykKLQkJICAmJiAoICAgKHN0cmluZ1syXSA9PSBESVJfU0VQQVJBVE9SKQotCQkgICAgICB8fCAoc3RyaW5nWzJdID09ICcvJykpKSkKLQkgICAgaW5mby0+c29fc3RyaW5nID0geHN0cmR1cCAoc3RyaW5nKTsKLQkgIGVsc2UKLQkgICAgaW5mby0+c29fc3RyaW5nID0gY29uY2F0IChpbmZvLT5zb19zdHJpbmcsIHN0cmluZywKLQkJCQkgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQkgIGZyZWUgKGYpOwotCX0KLQotICAgICAgaW5mby0+c29fdmFsdWUgPSB2YWx1ZTsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fU09MOgotICAgICAgLyogU3RhcnQgYW4gaW5jbHVkZSBmaWxlLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX3N0YXJ0X3NvdXJjZSAoZGhhbmRsZSwgc3RyaW5nKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9CSU5DTDoKLSAgICAgIC8qIFN0YXJ0IGFuIGluY2x1ZGUgZmlsZSB3aGljaCBtYXkgYmUgcmVwbGFjZWQuICAqLwotICAgICAgcHVzaF9iaW5jbCAoaW5mbywgc3RyaW5nLCB2YWx1ZSk7Ci0gICAgICBpZiAoISBkZWJ1Z19zdGFydF9zb3VyY2UgKGRoYW5kbGUsIHN0cmluZykpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fRUlOQ0w6Ci0gICAgICAvKiBFbmQgYW4gTl9CSU5DTCBpbmNsdWRlLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX3N0YXJ0X3NvdXJjZSAoZGhhbmRsZSwgcG9wX2JpbmNsIChpbmZvKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fRVhDTDoKLSAgICAgIC8qIFRoaXMgaXMgYSBkdXBsaWNhdGUgb2YgYSBoZWFkZXIgZmlsZSBuYW1lZCBieSBOX0JJTkNMIHdoaWNoCi0gICAgICAgICB3YXMgZWxpbWluYXRlZCBieSB0aGUgbGlua2VyLiAgKi8KLSAgICAgIGlmICghIGZpbmRfZXhjbCAoaW5mbywgc3RyaW5nLCB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fU0xJTkU6Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfbGluZSAoZGhhbmRsZSwgZGVzYywKLQkJCSAgICAgICB2YWx1ZSArIGluZm8tPmZ1bmN0aW9uX3N0YXJ0X29mZnNldCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fQkNPTU06Ci0gICAgICBpZiAoISBkZWJ1Z19zdGFydF9jb21tb25fYmxvY2sgKGRoYW5kbGUsIHN0cmluZykpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fRUNPTU06Ci0gICAgICBpZiAoISBkZWJ1Z19lbmRfY29tbW9uX2Jsb2NrIChkaGFuZGxlLCBzdHJpbmcpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0ZVTjoKLSAgICAgIGlmICgqc3RyaW5nID09ICdcMCcpCi0JewotCSAgaWYgKGluZm8tPndpdGhpbl9mdW5jdGlvbikKLQkgICAgewotCSAgICAgIC8qIFRoaXMgYWx3YXlzIG1hcmtzIHRoZSBlbmQgb2YgYSBmdW5jdGlvbjsgd2UgZG9uJ3QKLSAgICAgICAgICAgICAgICAgbmVlZCB0byB3b3JyeSBhYm91dCBpbmZvLT5mdW5jdGlvbl9lbmQuICAqLwotCSAgICAgIGlmIChpbmZvLT5zZWN0aW9ucykKLQkJdmFsdWUgKz0gaW5mby0+ZnVuY3Rpb25fc3RhcnRfb2Zmc2V0OwotCSAgICAgIGlmICghIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgKGRoYW5kbGUsIGluZm8pCi0JCSAgfHwgISBkZWJ1Z19lbmRfZnVuY3Rpb24gKGRoYW5kbGUsIHZhbHVlKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGluZm8tPndpdGhpbl9mdW5jdGlvbiA9IGZhbHNlOwotCSAgICAgIGluZm8tPmZ1bmN0aW9uX2VuZCA9IChiZmRfdm1hKSAtMTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBBIGNvbnN0IHN0YXRpYyBzeW1ib2wgaW4gdGhlIC50ZXh0IHNlY3Rpb24gd2lsbCBoYXZlIGFuIE5fRlVOCi0gICAgICAgICBlbnRyeS4gIFdlIG5lZWQgdG8gdXNlIHRoZXNlIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sCi0gICAgICAgICBpbiBjYXNlIHdlIGFyZSBsb29raW5nIGF0IGdjYyBvdXRwdXQgYmVmb3JlIGl0IHdhcyBjaGFuZ2VkIHRvCi0gICAgICAgICBhbHdheXMgZW1pdCBhbiBlbXB0eSBOX0ZVTi4gIFdlIGNhbid0IGNhbGwgZGVidWdfZW5kX2Z1bmN0aW9uCi0gICAgICAgICBoZXJlLCBiZWNhdXNlIGl0IG1pZ2h0IGJlIGEgbG9jYWwgc3RhdGljIHN5bWJvbC4gICovCi0gICAgICBpZiAoaW5mby0+d2l0aGluX2Z1bmN0aW9uCi0JICAmJiAoaW5mby0+ZnVuY3Rpb25fZW5kID09IChiZmRfdm1hKSAtMQotCSAgICAgIHx8IHZhbHVlIDwgaW5mby0+ZnVuY3Rpb25fZW5kKSkKLQlpbmZvLT5mdW5jdGlvbl9lbmQgPSB2YWx1ZTsKLQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICAgIC8qIEZJWE1FOiBnZGIgY2hlY2tzIHRoZSBzdHJpbmcgZm9yIE5fU1RTWU0sIE5fTENTWU0gb3IgTl9ST1NZTQotICAgICAgICAgc3ltYm9scywgYW5kIGlmIGl0IGRvZXMgbm90IHN0YXJ0IHdpdGggOlMsIGdkYiByZWxvY2F0ZXMgdGhlCi0gICAgICAgICB2YWx1ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24uICBnY2MgYWx3YXlzIHNlZW1zIHRvIHVzZQotICAgICAgICAgOlMsIHNvIHdlIGRvbid0IHdvcnJ5IGFib3V0IHRoaXMuICAqLwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBkZWZhdWx0OgotICAgICAgewotCWNvbnN0IGNoYXIgKmNvbG9uOwotCi0JY29sb24gPSBzdHJjaHIgKHN0cmluZywgJzonKTsKLQlpZiAoY29sb24gIT0gTlVMTAotCSAgICAmJiAoY29sb25bMV0gPT0gJ2YnIHx8IGNvbG9uWzFdID09ICdGJykpCi0JICB7Ci0JICAgIGlmIChpbmZvLT53aXRoaW5fZnVuY3Rpb24pCi0JICAgICAgewotCQliZmRfdm1hIGVuZHZhbDsKLQotCQllbmR2YWwgPSB2YWx1ZTsKLQkJaWYgKGluZm8tPmZ1bmN0aW9uX2VuZCAhPSAoYmZkX3ZtYSkgLTEKLQkJICAgICYmIGluZm8tPmZ1bmN0aW9uX2VuZCA8IGVuZHZhbCkKLQkJICBlbmR2YWwgPSBpbmZvLT5mdW5jdGlvbl9lbmQ7Ci0JCWlmICghIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgKGRoYW5kbGUsIGluZm8pCi0JCSAgICB8fCAhIGRlYnVnX2VuZF9mdW5jdGlvbiAoZGhhbmRsZSwgZW5kdmFsKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCWluZm8tPmZ1bmN0aW9uX2VuZCA9IChiZmRfdm1hKSAtMTsKLQkgICAgICB9Ci0JICAgIC8qIEZvciBzdGFicyBpbiBzZWN0aW9ucywgbGluZSBudW1iZXJzIGFuZCBibG9jayBhZGRyZXNzZXMKLSAgICAgICAgICAgICAgIGFyZSBvZmZzZXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4gICovCi0JICAgIGlmIChpbmZvLT5zZWN0aW9ucykKLQkgICAgICBpbmZvLT5mdW5jdGlvbl9zdGFydF9vZmZzZXQgPSB2YWx1ZTsKLQkgICAgaW5mby0+d2l0aGluX2Z1bmN0aW9uID0gdHJ1ZTsKLQkgIH0KLQotCWlmICghIHBhcnNlX3N0YWJfc3RyaW5nIChkaGFuZGxlLCBpbmZvLCB0eXBlLCBkZXNjLCB2YWx1ZSwgc3RyaW5nKSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX09QVDoKLSAgICAgIGlmIChzdHJpbmcgIT0gTlVMTCAmJiBzdHJjbXAgKHN0cmluZywgImdjYzJfY29tcGlsZWQuIikgPT0gMCkKLQlpbmZvLT5nY2NfY29tcGlsZWQgPSAyOwotICAgICAgZWxzZSBpZiAoc3RyaW5nICE9IE5VTEwgJiYgc3RyY21wIChzdHJpbmcsICJnY2NfY29tcGlsZWQuIikgPT0gMCkKLQlpbmZvLT5nY2NfY29tcGlsZWQgPSAxOwotICAgICAgZWxzZQotCWluZm8tPm5fb3B0X2ZvdW5kID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX09CSjoKLSAgICBjYXNlIE5fRU5ETToKLSAgICBjYXNlIE5fTUFJTjoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgdGhlIHN0YWJzIHN0cmluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9zdGFiX3N0cmluZyAoZGhhbmRsZSwgaW5mbywgc3RhYnR5cGUsIGRlc2MsIHZhbHVlLCBzdHJpbmcpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGludCBzdGFidHlwZTsKLSAgICAgaW50IGRlc2M7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgY29uc3QgY2hhciAqcDsKLSAgY2hhciAqbmFtZTsKLSAgaW50IHR5cGU7Ci0gIGRlYnVnX3R5cGUgZHR5cGU7Ci0gIGJvb2xlYW4gc3lub255bTsKLSAgYm9vbGVhbiBzZWxmX2Nyb3NzcmVmOwotICB1bnNpZ25lZCBpbnQgbGluZW5vOwotICBkZWJ1Z190eXBlICpzbG90OwotCi0gIHAgPSBzdHJjaHIgKHN0cmluZywgJzonKTsKLSAgaWYgKHAgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICB3aGlsZSAocFsxXSA9PSAnOicpCi0gICAgewotICAgICAgcCArPSAyOwotICAgICAgcCA9IHN0cmNociAocCwgJzonKTsKLSAgICAgIGlmIChwID09IE5VTEwpCi0JewotCSAgYmFkX3N0YWIgKHN0cmluZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBHQ0MgMi54IHB1dHMgdGhlIGxpbmUgbnVtYmVyIGluIGRlc2MuICBTdW5PUyBhcHBhcmVudGx5IHB1dHMgaW4KLSAgICAgdGhlIG51bWJlciBvZiBieXRlcyBvY2N1cGllZCBieSBhIHR5cGUgb3Igb2JqZWN0LCB3aGljaCB3ZQotICAgICBpZ25vcmUuICAqLwotICBpZiAoaW5mby0+Z2NjX2NvbXBpbGVkID49IDIpCi0gICAgbGluZW5vID0gZGVzYzsKLSAgZWxzZQotICAgIGxpbmVubyA9IDA7Ci0KLSAgLyogRklYTUU6IFNvbWV0aW1lcyB0aGUgc3BlY2lhbCBDKysgbmFtZXMgc3RhcnQgd2l0aCAnLicuICAqLwotICBuYW1lID0gTlVMTDsKLSAgaWYgKHN0cmluZ1swXSA9PSAnJCcpCi0gICAgewotICAgICAgc3dpdGNoIChzdHJpbmdbMV0pCi0JewotCWNhc2UgJ3QnOgotCSAgbmFtZSA9ICJ0aGlzIjsKLQkgIGJyZWFrOwotCWNhc2UgJ3YnOgotCSAgLyogV2FzOiBuYW1lID0gInZwdHIiOyAqLwotCSAgYnJlYWs7Ci0JY2FzZSAnZSc6Ci0JICBuYW1lID0gImVoX3Rocm93IjsKLQkgIGJyZWFrOwotCWNhc2UgJ18nOgotCSAgLyogVGhpcyB3YXMgYW4gYW5vbnltb3VzIHR5cGUgdGhhdCB3YXMgbmV2ZXIgZml4ZWQgdXAuICAqLwotCSAgYnJlYWs7Ci0JY2FzZSAnWCc6Ci0JICAvKiBTdW5QUk8gKDMuMCBhdCBsZWFzdCkgc3RhdGljIHZhcmlhYmxlIGVuY29kaW5nLiAgKi8KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICB3YXJuX3N0YWIgKHN0cmluZywgXygidW5rbm93biBDKysgZW5jb2RlZCBuYW1lIikpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChwID09IHN0cmluZyB8fCAoc3RyaW5nWzBdID09ICcgJyAmJiBwID09IHN0cmluZyArIDEpKQotCW5hbWUgPSBOVUxMOwotICAgICAgZWxzZQotCW5hbWUgPSBzYXZlc3RyaW5nIChzdHJpbmcsIHAgLSBzdHJpbmcpOwotICAgIH0KLQotICArK3A7Ci0gIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApIHx8ICpwID09ICcoJyB8fCAqcCA9PSAnLScpCi0gICAgdHlwZSA9ICdsJzsKLSAgZWxzZQotICAgIHR5cGUgPSAqcCsrOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnYyc6Ci0gICAgICAvKiBjIGlzIGEgc3BlY2lhbCBjYXNlLCBub3QgZm9sbG93ZWQgYnkgYSB0eXBlLW51bWJlci4KLQkgU1lNQk9MOmM9aVZBTFVFIGZvciBhbiBpbnRlZ2VyIGNvbnN0YW50IHN5bWJvbC4KLQkgU1lNQk9MOmM9clZBTFVFIGZvciBhIGZsb2F0aW5nIGNvbnN0YW50IHN5bWJvbC4KLQkgU1lNQk9MOmM9ZVRZUEUsSU5UVkFMVUUgZm9yIGFuIGVudW0gY29uc3RhbnQgc3ltYm9sLgotCSBlLmcuICJiOmM9ZTYsMCIgZm9yICJjb25zdCBiID0gYmxvYjEiCi0JICh3aGVyZSB0eXBlIDYgaXMgZGVmaW5lZCBieSAiYmxvYnM6dDY9ZWJsb2IxOjAsYmxvYjI6MSw7IikuICAqLwotICAgICAgaWYgKCpwICE9ICc9JykKLQl7Ci0JICBiYWRfc3RhYiAoc3RyaW5nKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICArK3A7Ci0gICAgICBzd2l0Y2ggKCpwKyspCi0JewotCWNhc2UgJ3InOgotCSAgLyogRmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotCSAgaWYgKCEgZGVidWdfcmVjb3JkX2Zsb2F0X2NvbnN0IChkaGFuZGxlLCBuYW1lLCBhdG9mIChwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2knOgotCSAgLyogSW50ZWdlciBjb25zdGFudC4gICovCi0JICAvKiBEZWZpbmluZyBpbnRlZ2VyIGNvbnN0YW50cyB0aGlzIHdheSBpcyBraW5kIG9mIHNpbGx5LAotCSAgICAgc2luY2UgJ2UnIGNvbnN0YW50cyBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIGdpdmUgbm90IG9ubHkKLQkgICAgIHRoZSB2YWx1ZSwgYnV0IHRoZSB0eXBlIGFzIHdlbGwuICBDIGhhcyBhdCBsZWFzdCBpbnQsCi0JICAgICBsb25nLCB1bnNpZ25lZCBpbnQsIGFuZCBsb25nIGxvbmcgYXMgY29uc3RhbnQgdHlwZXM7Ci0JICAgICBvdGhlciBsYW5ndWFnZXMgcHJvYmFibHkgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdW5zaWduZWQgYXMKLQkgICAgIHdlbGwgYXMgc2lnbmVkIGNvbnN0YW50cy4gICovCi0JICBpZiAoISBkZWJ1Z19yZWNvcmRfaW50X2NvbnN0IChkaGFuZGxlLCBuYW1lLCBhdG9pIChwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgLyogU1lNQk9MOmM9ZVRZUEUsSU5UVkFMVUUgZm9yIGEgY29uc3RhbnQgc3ltYm9sIHdob3NlIHZhbHVlCi0JICAgICBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgaW50ZWdyYWwuCi0JICAgICBlLmcuICJiOmM9ZTYsMCIgZm9yICJjb25zdCBiID0gYmxvYjEiCi0JICAgICAod2hlcmUgdHlwZSA2IGlzIGRlZmluZWQgYnkgImJsb2JzOnQ2PWVibG9iMTowLGJsb2IyOjEsOyIpLiAgKi8KLQkgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAgICZwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0JICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoKnAgIT0gJywnKQotCSAgICB7Ci0JICAgICAgYmFkX3N0YWIgKHN0cmluZyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBpZiAoISBkZWJ1Z19yZWNvcmRfdHlwZWRfY29uc3QgKGRoYW5kbGUsIG5hbWUsIGR0eXBlLCBhdG9pIChwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBiYWRfc3RhYiAoc3RyaW5nKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQyc6Ci0gICAgICAvKiBUaGUgbmFtZSBvZiBhIGNhdWdodCBleGNlcHRpb24uICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkgICAgICAgJnAsIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX2xhYmVsIChkaGFuZGxlLCBuYW1lLCBkdHlwZSwgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgICAvKiBBIGZ1bmN0aW9uIGRlZmluaXRpb24uICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX2Z1bmN0aW9uIChkaGFuZGxlLCBuYW1lLCBkdHlwZSwgdHlwZSA9PSAnRicsIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFN1biBhY2MgcHV0cyBkZWNsYXJlZCB0eXBlcyBvZiBhcmd1bWVudHMgaGVyZS4gIFdlIGRvbid0IGNhcmUKLQkgYWJvdXQgdGhlaXIgYWN0dWFsIHR5cGVzIChGSVhNRSAtLSB3ZSBzaG91bGQgcmVtZW1iZXIgdGhlIHdob2xlCi0JIGZ1bmN0aW9uIHByb3RvdHlwZSksIGJ1dCB0aGUgbGlzdCBtYXkgZGVmaW5lIHNvbWUgbmV3IHR5cGVzCi0JIHRoYXQgd2UgaGF2ZSB0byByZW1lbWJlciwgc28gd2UgbXVzdCBzY2FuIGl0IG5vdy4gICovCi0gICAgICB3aGlsZSAoKnAgPT0gJzsnKQotCXsKLQkgICsrcDsKLQkgIGlmIChwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKQotCSAgICAgID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdHJzoKLSAgICAgIHsKLQljaGFyIGxlYWRpbmc7Ci0JbG9uZyBjOwotCWFzeW1ib2wgKipwczsKLQotCS8qIEEgZ2xvYmFsIHN5bWJvbC4gIFRoZSB2YWx1ZSBtdXN0IGJlIGV4dHJhY3RlZCBmcm9tIHRoZQotCSAgIHN5bWJvbCB0YWJsZS4gICovCi0JZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJCSAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0JaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgIHJldHVybiBmYWxzZTsKLQlsZWFkaW5nID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChpbmZvLT5hYmZkKTsKLQlmb3IgKGMgPSBpbmZvLT5zeW1jb3VudCwgcHMgPSBpbmZvLT5zeW1zOyBjID4gMDsgLS1jLCArK3BzKQotCSAgewotCSAgICBjb25zdCBjaGFyICpuOwotCi0JICAgIG4gPSBiZmRfYXN5bWJvbF9uYW1lICgqcHMpOwotCSAgICBpZiAobGVhZGluZyAhPSAnXDAnICYmICpuID09IGxlYWRpbmcpCi0JICAgICAgKytuOwotCSAgICBpZiAoKm4gPT0gKm5hbWUgJiYgc3RyY21wIChuLCBuYW1lKSA9PSAwKQotCSAgICAgIGJyZWFrOwotCSAgfQotCWlmIChjID4gMCkKLQkgIHZhbHVlID0gYmZkX2FzeW1ib2xfdmFsdWUgKCpwcyk7Ci0JaWYgKCEgc3RhYl9yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGluZm8sIG5hbWUsIGR0eXBlLCBERUJVR19HTE9CQUwsCi0JCQkJICAgIHZhbHVlKSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBUaGlzIGNhc2UgaXMgZmFrZWQgYnkgYSBjb25kaXRpb25hbCBhYm92ZSwgd2hlbiB0aGVyZSBpcyBubwotCSBjb2RlIGxldHRlciBpbiB0aGUgZGJ4IGRhdGEuICBEYnggZGF0YSBuZXZlciBhY3R1YWxseQotCSBjb250YWlucyAnbCcuICAqLwotICAgIGNhc2UgJ2wnOgotICAgIGNhc2UgJ3MnOgotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgc3RhYl9yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGluZm8sIG5hbWUsIGR0eXBlLCBERUJVR19MT0NBTCwKLQkJCQkgIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgICAgLyogQSBmdW5jdGlvbiBwYXJhbWV0ZXIuICAqLwotICAgICAgaWYgKCpwICE9ICdGJykKLQlkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkJIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGVsc2UKLQl7Ci0JLyogcEYgaXMgYSB0d28tbGV0dGVyIGNvZGUgdGhhdCBtZWFucyBhIGZ1bmN0aW9uIHBhcmFtZXRlciBpbgotCSAgIEZvcnRyYW4uICBUaGUgdHlwZS1udW1iZXIgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4KLQkgICB2YWx1ZS4gIFRyYW5zbGF0ZSBpdCBpbnRvIGEgcG9pbnRlci10by1mdW5jdGlvbiB0eXBlLiAgKi8KLQkgICsrcDsKLQkgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCQkgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0JICBpZiAoZHR5cGUgIT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICB7Ci0JICAgICAgZGVidWdfdHlwZSBmdHlwZTsKLQotCSAgICAgIGZ0eXBlID0gZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlIChkaGFuZGxlLCBkdHlwZSwKLQkJCQkJCShkZWJ1Z190eXBlICopIE5VTEwsIGZhbHNlKTsKLQkgICAgICBkdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChkaGFuZGxlLCBmdHlwZSk7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIgKGRoYW5kbGUsIG5hbWUsIGR0eXBlLCBERUJVR19QQVJNX1NUQUNLLAotCQkJCSAgICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGSVhNRTogQXQgdGhpcyBwb2ludCBnZGIgY29uc2lkZXJzIHJlYXJyYW5naW5nIHRoZSBwYXJhbWV0ZXIKLQkgYWRkcmVzcyBvbiBhIGJpZyBlbmRpYW4gbWFjaGluZSBpZiBpdCBpcyBzbWFsbGVyIHRoYW4gYW4gaW50LgotCSBXZSBoYXZlIG5vIHdheSB0byBkbyB0aGF0LCBzaW5jZSB3ZSBkb24ndCByZWFsbHkga25vdyBtdWNoCi0JIGFib3V0IHRoZSB0YXJnZXQuICAqLwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1AnOgotICAgICAgaWYgKHN0YWJ0eXBlID09IE5fRlVOKQotCXsKLQkgIC8qIFByb3RvdHlwZSBvZiBhIGZ1bmN0aW9uIHJlZmVyZW5jZWQgYnkgdGhpcyBmaWxlLiAgKi8KLQkgIHdoaWxlICgqcCA9PSAnOycpCi0JICAgIHsKLQkgICAgICArK3A7Ci0JICAgICAgaWYgKHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkJICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpCi0JCSAgPT0gREVCVUdfVFlQRV9OVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSAnUic6Ci0gICAgICAvKiBQYXJhbWV0ZXIgd2hpY2ggaXMgaW4gYSByZWdpc3Rlci4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyIChkaGFuZGxlLCBuYW1lLCBkdHlwZSwgREVCVUdfUEFSTV9SRUcsCi0JCQkJICAgIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3InOgotICAgICAgLyogUmVnaXN0ZXIgdmFyaWFibGUgKGVpdGhlciBnbG9iYWwgb3IgbG9jYWwpLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIHN0YWJfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCBkdHlwZSwgREVCVUdfUkVHSVNURVIsCi0JCQkJICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGSVhNRTogQXQgdGhpcyBwb2ludCBnZGIgY2hlY2tzIHRvIGNvbWJpbmUgcGFpcnMgb2YgJ3AnIGFuZAotCSAncicgc3RhYnMgaW50byBhIHNpbmdsZSAnUCcgc3RhYi4gICovCi0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUyc6Ci0gICAgICAvKiBTdGF0aWMgc3ltYm9sIGF0IHRvcCBsZXZlbCBvZiBmaWxlICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBzdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgZHR5cGUsIERFQlVHX1NUQVRJQywKLQkJCQkgIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3QnOgotICAgICAgLyogQSB0eXBlZGVmLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCAmcCwgJnNsb3QpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIEEgbmFtZWxlc3MgdHlwZS4gIE5vdGhpbmcgdG8gZG8uICAqLwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBkdHlwZSA9IGRlYnVnX25hbWVfdHlwZSAoZGhhbmRsZSwgbmFtZSwgZHR5cGUpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChzbG90ICE9IE5VTEwpCi0JKnNsb3QgPSBkdHlwZTsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdUJzoKLSAgICAgIC8qIFN0cnVjdCwgdW5pb24sIG9yIGVudW0gdGFnLiAgRm9yIEdOVSBDKyssIHRoaXMgY2FuIGJlIGJlIGZvbGxvd2VkCi0JIGJ5ICd0JyB3aGljaCBtZWFucyB3ZSBhcmUgdHlwZWRlZidpbmcgaXQgYXMgd2VsbC4gICovCi0gICAgICBpZiAoKnAgIT0gJ3QnKQotCXsKLQkgIHN5bm9ueW0gPSBmYWxzZTsKLQkgIC8qIEZJWE1FOiBnZGIgc2V0cyBzeW5vbnltIHRvIHRydWUgaWYgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UKLSAgICAgICAgICAgICBpcyBDKysuICAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW5vbnltID0gdHJ1ZTsKLQkgICsrcDsKLQl9Ci0KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCAmcCwgJnNsb3QpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCXJldHVybiB0cnVlOwotCi0gICAgICAvKiBJTkZPLT5TRUxGX0NST1NTUkVGIGlzIHNldCBieSBwYXJzZV9zdGFiX3R5cGUgaWYgdGhpcyB0eXBlIGlzCi0gICAgICAgICBhIGNyb3NzIHJlZmVyZW5jZSB0byBpdHNlbGYuICBUaGVzZSBhcmUgZ2VuZXJhdGVkIGJ5IHNvbWUKLSAgICAgICAgIHZlcnNpb25zIG9mIGcrKy4gICovCi0gICAgICBzZWxmX2Nyb3NzcmVmID0gaW5mby0+c2VsZl9jcm9zc3JlZjsKLQotICAgICAgZHR5cGUgPSBkZWJ1Z190YWdfdHlwZSAoZGhhbmRsZSwgbmFtZSwgZHR5cGUpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoc2xvdCAhPSBOVUxMKQotCSpzbG90ID0gZHR5cGU7Ci0KLSAgICAgIC8qIFNlZSBpZiB3ZSBoYXZlIGEgY3Jvc3MgcmVmZXJlbmNlIHRvIHRoaXMgdGFnIHdoaWNoIHdlIGNhbiBub3cKLSAgICAgICAgIGZpbGwgaW4uICBBdm9pZCBmaWxsaW5nIGluIGEgY3Jvc3MgcmVmZXJlbmNlIHRvIG91cnNlbHZlcywKLSAgICAgICAgIGJlY2F1c2UgdGhhdCB3b3VsZCBsZWFkIHRvIGNpcmN1bGFyIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gICAgICBpZiAoISBzZWxmX2Nyb3NzcmVmKQotCXsKLQkgIHJlZ2lzdGVyIHN0cnVjdCBzdGFiX3RhZyAqKnBzdDsKLQotCSAgZm9yIChwc3QgPSAmaW5mby0+dGFnczsgKnBzdCAhPSBOVUxMOyBwc3QgPSAmKCpwc3QpLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKCgqcHN0KS0+bmFtZVswXSA9PSBuYW1lWzBdCi0JCSAgJiYgc3RyY21wICgoKnBzdCktPm5hbWUsIG5hbWUpID09IDApCi0JCXsKLQkJICAoKnBzdCktPnNsb3QgPSBkdHlwZTsKLQkJICAqcHN0ID0gKCpwc3QpLT5uZXh0OwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChzeW5vbnltKQotCXsKLQkgIGR0eXBlID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBuYW1lLCBkdHlwZSk7Ci0JICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmIChzbG90ICE9IE5VTEwpCi0JICAgICpzbG90ID0gZHR5cGU7Ci0JfQotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1YnOgotICAgICAgLyogU3RhdGljIHN5bWJvbCBvZiBsb2NhbCBzY29wZSAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgLyogRklYTUU6IGdkYiBjaGVja3Mgb3M5a19zdGFicyBoZXJlLiAgKi8KLSAgICAgIGlmICghIHN0YWJfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCBkdHlwZSwKLQkJCQkgIERFQlVHX0xPQ0FMX1NUQVRJQywgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndic6Ci0gICAgICAvKiBSZWZlcmVuY2UgcGFyYW1ldGVyLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIgKGRoYW5kbGUsIG5hbWUsIGR0eXBlLCBERUJVR19QQVJNX1JFRkVSRU5DRSwKLQkJCQkgICAgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYSc6Ci0gICAgICAvKiBSZWZlcmVuY2UgcGFyYW1ldGVyIHdoaWNoIGlzIGluIGEgcmVnaXN0ZXIuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3BhcmFtZXRlciAoZGhhbmRsZSwgbmFtZSwgZHR5cGUsIERFQlVHX1BBUk1fUkVGX1JFRywKLQkJCQkgICAgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnWCc6Ci0gICAgICAvKiBUaGlzIGlzIHVzZWQgYnkgU3VuIEZPUlRSQU4gZm9yICJmdW5jdGlvbiByZXN1bHQgdmFsdWUiLgotCSBTdW4gY2xhaW1zICgiZGJ4IGFuZCBkYnh0b29sIGludGVyZmFjZXMiLCAybmQgZWQpCi0JIHRoYXQgUGFzY2FsIHVzZXMgaXQgdG9vLCBidXQgd2hlbiBJIHRyaWVkIGl0IFBhc2NhbCB1c2VkCi0JICJ4OjMiIChsb2NhbCBzeW1ib2wpIGluc3RlYWQuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgc3RhYl9yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGluZm8sIG5hbWUsIGR0eXBlLCBERUJVR19MT0NBTCwKLQkJCQkgIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBiYWRfc3RhYiAoc3RyaW5nKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRklYTUU6IGdkYiBjb252ZXJ0cyBzdHJ1Y3R1cmUgdmFsdWVzIHRvIHN0cnVjdHVyZSBwb2ludGVycyBpbiBhCi0gICAgIGNvdXBsZSBvZiBjYXNlcywgZGVwZW5kaW5nIHVwb24gdGhlIHRhcmdldC4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIGEgc3RhYnMgdHlwZS4gIFRoZSB0eXBlbmFtZSBhcmd1bWVudCBpcyBub24tTlVMTCBpZiB0aGlzIGlzIGEKLSAgIHR5cGVkZWYgb3IgYSB0YWcgZGVmaW5pdGlvbi4gIFRoZSBwcCBhcmd1bWVudCBwb2ludHMgdG8gdGhlIHN0YWIKLSAgIHN0cmluZywgYW5kIGlzIHVwZGF0ZWQuICBUaGUgc2xvdHAgYXJndW1lbnQgcG9pbnRzIHRvIGEgcGxhY2UgdG8KLSAgIHN0b3JlIHRoZSBzbG90IHVzZWQgaWYgdGhlIHR5cGUgaXMgYmVpbmcgZGVmaW5lZC4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVuYW1lLCBwcCwgc2xvdHApCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnR5cGVuYW1lOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGRlYnVnX3R5cGUgKipzbG90cDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgaW50IHR5cGVudW1zWzJdOwotICBpbnQgc2l6ZTsKLSAgYm9vbGVhbiBzdHJpbmdwOwotICBpbnQgZGVzY3JpcHRvcjsKLSAgZGVidWdfdHlwZSBkdHlwZTsKLQotICBpZiAoc2xvdHAgIT0gTlVMTCkKLSAgICAqc2xvdHAgPSBOVUxMOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgc2l6ZSA9IC0xOwotICBzdHJpbmdwID0gZmFsc2U7Ci0KLSAgaW5mby0+c2VsZl9jcm9zc3JlZiA9IGZhbHNlOwotCi0gIC8qIFJlYWQgdHlwZSBudW1iZXIgaWYgcHJlc2VudC4gIFRoZSB0eXBlIG51bWJlciBtYXkgYmUgb21pdHRlZC4KLSAgICAgZm9yIGluc3RhbmNlIGluIGEgdHdvLWRpbWVuc2lvbmFsIGFycmF5IGRlY2xhcmVkIHdpdGggdHlwZQotICAgICAiYXIxOzE7MTA7YXIxOzE7MTA7NCIuICAqLwotICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkgJiYgKipwcCAhPSAnKCcgJiYgKipwcCAhPSAnLScpCi0gICAgewotICAgICAgLyogJ3R5cGVudW1zPScgbm90IHByZXNlbnQsIHR5cGUgaXMgYW5vbnltb3VzLiAgUmVhZCBhbmQgcmV0dXJuCi0JIHRoZSBkZWZpbml0aW9uLCBidXQgZG9uJ3QgcHV0IGl0IGluIHRoZSB0eXBlIHZlY3Rvci4gICovCi0gICAgICB0eXBlbnVtc1swXSA9IHR5cGVudW1zWzFdID0gLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgcGFyc2Vfc3RhYl90eXBlX251bWJlciAocHAsIHR5cGVudW1zKSkKLQlyZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gICAgICBpZiAoKipwcCAhPSAnPScpCi0JewotCSAgLyogVHlwZSBpcyBub3QgYmVpbmcgZGVmaW5lZCBoZXJlLiAgRWl0aGVyIGl0IGFscmVhZHkKLQkgICAgIGV4aXN0cywgb3IgdGhpcyBpcyBhIGZvcndhcmQgcmVmZXJlbmNlIHRvIGl0LiAgKi8KLQkgIHJldHVybiBzdGFiX2ZpbmRfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bXMpOwotCX0KLQotICAgICAgLyogT25seSBzZXQgdGhlIHNsb3QgaWYgdGhlIHR5cGUgaXMgYmVpbmcgZGVmaW5lZC4gIFRoaXMgbWVhbnMKLSAgICAgICAgIHRoYXQgdGhlIG1hcHBpbmcgZnJvbSB0eXBlIG51bWJlcnMgdG8gdHlwZXMgd2lsbCBvbmx5IHJlY29yZAotICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYgd2hpY2ggZGVmaW5lcyBhIHR5cGUuICBJZiB3ZSBkb24ndCBkbwotICAgICAgICAgdGhpcywgdGhlbiBzb21ldGhpbmcgbGlrZQotCSAgICAgdHlwZWRlZiBpbnQgZm9vOwotCSAgICAgaW50IGk7Ci0JIHdpbGwgcmVjb3JkIHRoYXQgaSBpcyBvZiB0eXBlIGZvby4gIFVuZm9ydHVuYXRlbHksIHN0YWJzCi0JIGluZm9ybWF0aW9uIGlzIGFtYmlndW91cyBhYm91dCB2YXJpYWJsZSB0eXBlcy4gIEZvciB0aGlzIGNvZGUsCi0JICAgICB0eXBlZGVmIGludCBmb287Ci0JICAgICBpbnQgaTsKLQkgICAgIGZvbyBqOwotCSB0aGUgc3RhYnMgaW5mb3JtYXRpb24gcmVjb3JkcyBib3RoIGkgYW5kIGogYXMgaGF2aW5nIHRoZSBzYW1lCi0JIHR5cGUuICBUaGlzIGNvdWxkIGJlIGZpeGVkIGJ5IHBhdGNoaW5nIHRoZSBjb21waWxlci4gICovCi0gICAgICBpZiAoc2xvdHAgIT0gTlVMTCAmJiB0eXBlbnVtc1swXSA+PSAwICYmIHR5cGVudW1zWzFdID49IDApCi0JKnNsb3RwID0gc3RhYl9maW5kX3Nsb3QgKGluZm8sIHR5cGVudW1zKTsKLQotICAgICAgLyogVHlwZSBpcyBiZWluZyBkZWZpbmVkIGhlcmUuICAqLwotICAgICAgLyogU2tpcCB0aGUgJz0nLiAgKi8KLSAgICAgICsrKnBwOwotCi0gICAgICB3aGlsZSAoKipwcCA9PSAnQCcpCi0JewotCSAgY29uc3QgY2hhciAqcCA9ICpwcCArIDE7Ci0JICBjb25zdCBjaGFyICphdHRyOwotCi0JICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKSB8fCAqcCA9PSAnKCcgfHwgKnAgPT0gJy0nKQotCSAgICB7Ci0JICAgICAgLyogTWVtYmVyIHR5cGUuICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIFR5cGUgYXR0cmlidXRlcy4gICovCi0JICBhdHRyID0gcDsKLQotCSAgZm9yICg7ICpwICE9ICc7JzsgKytwKQotCSAgICB7Ci0JICAgICAgaWYgKCpwID09ICdcMCcpCi0JCXsKLQkJICBiYWRfc3RhYiAob3JpZyk7Ci0JCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkJfQotCSAgICB9Ci0JICAqcHAgPSBwICsgMTsKLQotCSAgc3dpdGNoICgqYXR0cikKLQkgICAgewotCSAgICBjYXNlICdzJzoKLQkgICAgICBzaXplID0gYXRvaSAoYXR0ciArIDEpOwotCSAgICAgIGlmIChzaXplIDw9IDApCi0JCXNpemUgPSAtMTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdTJzoKLQkgICAgICBzdHJpbmdwID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIC8qIElnbm9yZSB1bnJlY29nbml6ZWQgdHlwZSBhdHRyaWJ1dGVzLCBzbyBmdXR1cmUKLQkJIGNvbXBpbGVycyBjYW4gaW52ZW50IG5ldyBvbmVzLiAgKi8KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgZGVzY3JpcHRvciA9ICoqcHA7Ci0gICsrKnBwOwotCi0gIHN3aXRjaCAoZGVzY3JpcHRvcikKLSAgICB7Ci0gICAgY2FzZSAneCc6Ci0gICAgICB7Ci0JZW51bSBkZWJ1Z190eXBlX2tpbmQgY29kZTsKLQljb25zdCBjaGFyICpxMSwgKnEyLCAqcDsKLQotCS8qIEEgY3Jvc3MgcmVmZXJlbmNlIHRvIGFub3RoZXIgdHlwZS4gICovCi0KLQlzd2l0Y2ggKCoqcHApCi0JICB7Ci0JICBjYXNlICdzJzoKLQkgICAgY29kZSA9IERFQlVHX0tJTkRfU1RSVUNUOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ3UnOgotCSAgICBjb2RlID0gREVCVUdfS0lORF9VTklPTjsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdlJzoKLQkgICAgY29kZSA9IERFQlVHX0tJTkRfRU5VTTsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICAvKiBDb21wbGFpbiBhbmQga2VlcCBnb2luZywgc28gY29tcGlsZXJzIGNhbiBpbnZlbnQgbmV3Ci0JICAgICAgIGNyb3NzLXJlZmVyZW5jZSB0eXBlcy4gICovCi0JICAgIHdhcm5fc3RhYiAob3JpZywgXygidW5yZWNvZ25pemVkIGNyb3NzIHJlZmVyZW5jZSB0eXBlIikpOwotCSAgICBjb2RlID0gREVCVUdfS0lORF9TVFJVQ1Q7Ci0JICAgIGJyZWFrOwotCSAgfQotCSsrKnBwOwotCi0JcTEgPSBzdHJjaHIgKCpwcCwgJzwnKTsKLQlwID0gc3RyY2hyICgqcHAsICc6Jyk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkgIHsKLQkgICAgYmFkX3N0YWIgKG9yaWcpOwotCSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgfQotCXdoaWxlIChxMSAhPSBOVUxMICYmIHAgPiBxMSAmJiBwWzFdID09ICc6JykKLQkgIHsKLQkgICAgcTIgPSBzdHJjaHIgKHExLCAnPicpOwotCSAgICBpZiAocTIgPT0gTlVMTCB8fCBxMiA8IHApCi0JICAgICAgYnJlYWs7Ci0JICAgIHAgKz0gMjsKLQkgICAgcCA9IHN0cmNociAocCwgJzonKTsKLQkgICAgaWYgKHAgPT0gTlVMTCkKLQkgICAgICB7Ci0JCWJhZF9zdGFiIChvcmlnKTsKLQkJcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgICAgICB9Ci0JICB9Ci0KLQkvKiBTb21lIHZlcnNpb25zIG9mIGcrKyBjYW4gZW1pdCBzdGFicyBsaWtlCi0JICAgICAgIGZsZWVwOlQyMD14c2ZsZWVwOgotCSAgIHdoaWNoIGRlZmluZSBzdHJ1Y3R1cmVzIGluIHRlcm1zIG9mIHRoZW1zZWx2ZXMuICBXZSBuZWVkIHRvCi0JICAgdGVsbCB0aGUgY2FsbGVyIHRvIGF2b2lkIGJ1aWxkaW5nIGEgY2lyY3VsYXIgc3RydWN0dXJlLiAgKi8KLQlpZiAodHlwZW5hbWUgIT0gTlVMTAotCSAgICAmJiBzdHJuY21wICh0eXBlbmFtZSwgKnBwLCBwIC0gKnBwKSA9PSAwCi0JICAgICYmIHR5cGVuYW1lW3AgLSAqcHBdID09ICdcMCcpCi0JICBpbmZvLT5zZWxmX2Nyb3NzcmVmID0gdHJ1ZTsKLQotCWR0eXBlID0gc3RhYl9maW5kX3RhZ2dlZF90eXBlIChkaGFuZGxlLCBpbmZvLCAqcHAsIHAgLSAqcHAsIGNvZGUpOwotCi0JKnBwID0gcCArIDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJy0nOgotICAgIGNhc2UgJzAnOgotICAgIGNhc2UgJzEnOgotICAgIGNhc2UgJzInOgotICAgIGNhc2UgJzMnOgotICAgIGNhc2UgJzQnOgotICAgIGNhc2UgJzUnOgotICAgIGNhc2UgJzYnOgotICAgIGNhc2UgJzcnOgotICAgIGNhc2UgJzgnOgotICAgIGNhc2UgJzknOgotICAgIGNhc2UgJygnOgotICAgICAgewotCWNvbnN0IGNoYXIgKmhvbGQ7Ci0JaW50IHh0eXBlbnVtc1syXTsKLQotCS8qIFRoaXMgdHlwZSBpcyBkZWZpbmVkIGFzIGFub3RoZXIgdHlwZS4gICovCi0KLQkoKnBwKS0tOwotCWhvbGQgPSAqcHA7Ci0KLQkvKiBQZWVrIGFoZWFkIGF0IHRoZSBudW1iZXIgdG8gZGV0ZWN0IHZvaWQuICAqLwotCWlmICghIHBhcnNlX3N0YWJfdHlwZV9udW1iZXIgKHBwLCB4dHlwZW51bXMpKQotCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotCWlmICh0eXBlbnVtc1swXSA9PSB4dHlwZW51bXNbMF0gJiYgdHlwZW51bXNbMV0gPT0geHR5cGVudW1zWzFdKQotCSAgewotCSAgICAvKiBUaGlzIHR5cGUgaXMgYmVpbmcgZGVmaW5lZCBhcyBpdHNlbGYsIHdoaWNoIG1lYW5zIHRoYXQKLSAgICAgICAgICAgICAgIGl0IGlzIHZvaWQuICAqLwotCSAgICBkdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgICpwcCA9IGhvbGQ7Ci0KLQkgICAgLyogR28gYmFjayB0byB0aGUgbnVtYmVyIGFuZCBoYXZlIHBhcnNlX3N0YWJfdHlwZSBnZXQgaXQuCi0JICAgICAgIFRoaXMgbWVhbnMgdGhhdCB3ZSBjYW4gZGVhbCB3aXRoIHNvbWV0aGluZyBsaWtlCi0JICAgICAgIHQoMSwyKT0oMyw0KT0uLi4gd2hpY2ggdGhlIEx1Y2lkIGNvbXBpbGVyIHVzZXMuICAqLwotCSAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkgICAgIHBwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0JICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgIH0KLQotCWlmICh0eXBlbnVtc1swXSAhPSAtMSkKLQkgIHsKLQkgICAgaWYgKCEgc3RhYl9yZWNvcmRfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bXMsIGR0eXBlKSkKLQkgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgfQotCi0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlICcqJzoKLSAgICAgIGR0eXBlID0gZGVidWdfbWFrZV9wb2ludGVyX3R5cGUgKGRoYW5kbGUsCi0JCQkJICAgICAgIHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywKLQkJCQkJCQkoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkJCXBwLAotCQkJCQkJCShkZWJ1Z190eXBlICoqKSBOVUxMKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyYnOgotICAgICAgLyogUmVmZXJlbmNlIHRvIGFub3RoZXIgdHlwZS4gICovCi0gICAgICBkdHlwZSA9IChkZWJ1Z19tYWtlX3JlZmVyZW5jZV90eXBlCi0JICAgICAgIChkaGFuZGxlLAotCQlwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAoZGVidWdfdHlwZSAqKikgTlVMTCkpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZic6Ci0gICAgICAvKiBGdW5jdGlvbiByZXR1cm5pbmcgYW5vdGhlciB0eXBlLiAgKi8KLSAgICAgIC8qIEZJWE1FOiBnZGIgY2hlY2tzIG9zOWtfc3RhYnMgaGVyZS4gICovCi0gICAgICBkdHlwZSA9IChkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUKLQkgICAgICAgKGRoYW5kbGUsCi0JCXBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCi0JCQkJIChkZWJ1Z190eXBlICoqKSBOVUxMKSwKLQkJKGRlYnVnX3R5cGUgKikgTlVMTCwgZmFsc2UpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnayc6Ci0gICAgICAvKiBDb25zdCBxdWFsaWZpZXIgb24gc29tZSB0eXBlIChTdW4pLiAgKi8KLSAgICAgIC8qIEZJWE1FOiBnZGIgYWNjZXB0cyAnYycgaGVyZSBpZiBvczlrX3N0YWJzLiAgKi8KLSAgICAgIGR0eXBlID0gZGVidWdfbWFrZV9jb25zdF90eXBlIChkaGFuZGxlLAotCQkJCSAgICAgcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLAotCQkJCQkJICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJCSAgICAgIHBwLAotCQkJCQkJICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQic6Ci0gICAgICAvKiBWb2xhdGlsZSBxdWFsIG9uIHNvbWUgdHlwZSAoU3VuKS4gICovCi0gICAgICAvKiBGSVhNRTogZ2RiIGFjY2VwdHMgJ2knIGhlcmUgaWYgb3M5a19zdGFicy4gICovCi0gICAgICBkdHlwZSA9IChkZWJ1Z19tYWtlX3ZvbGF0aWxlX3R5cGUKLQkgICAgICAgKGRoYW5kbGUsCi0JCXBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCi0JCQkJIChkZWJ1Z190eXBlICoqKSBOVUxMKSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdAJzoKLSAgICAgIC8qIE9mZnNldCAoY2xhc3MgJiB2YXJpYWJsZSkgdHlwZS4gIFRoaXMgaXMgdXNlZCBmb3IgYSBwb2ludGVyCi0gICAgICAgICByZWxhdGl2ZSB0byBhbiBvYmplY3QuICAqLwotICAgICAgewotCWRlYnVnX3R5cGUgZG9tYWluOwotCWRlYnVnX3R5cGUgbWVtdHlwZTsKLQotCS8qIE1lbWJlciB0eXBlLiAgKi8KLQotCWRvbWFpbiA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCi0JCQkJICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0JaWYgKGRvbWFpbiA9PSBERUJVR19UWVBFX05VTEwpCi0JICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0JaWYgKCoqcHAgIT0gJywnKQotCSAgewotCSAgICBiYWRfc3RhYiAob3JpZyk7Ci0JICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICB9Ci0JKysqcHA7Ci0KLQltZW10eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCQkgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0JaWYgKG1lbXR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotCWR0eXBlID0gZGVidWdfbWFrZV9vZmZzZXRfdHlwZSAoZGhhbmRsZSwgZG9tYWluLCBtZW10eXBlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnIyc6Ci0gICAgICAvKiBNZXRob2QgKGNsYXNzICYgZm4pIHR5cGUuICAqLwotICAgICAgaWYgKCoqcHAgPT0gJyMnKQotCXsKLQkgIGRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0KLQkgICsrKnBwOwotCSAgcmV0dXJuX3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCSBwcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgaWYgKHJldHVybl90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgIGlmICgqKnBwICE9ICc7JykKLQkgICAgewotCSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLQkgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgICB9Ci0JICArKypwcDsKLQkgIGR0eXBlID0gZGVidWdfbWFrZV9tZXRob2RfdHlwZSAoZGhhbmRsZSwgcmV0dXJuX3R5cGUsCi0JCQkJCSAgREVCVUdfVFlQRV9OVUxMLAotCQkJCQkgIChkZWJ1Z190eXBlICopIE5VTEwsIGZhbHNlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZGVidWdfdHlwZSBkb21haW47Ci0JICBkZWJ1Z190eXBlIHJldHVybl90eXBlOwotCSAgZGVidWdfdHlwZSAqYXJnczsKLQkgIHVuc2lnbmVkIGludCBuOwotCSAgdW5zaWduZWQgaW50IGFsbG9jOwotCSAgYm9vbGVhbiB2YXJhcmdzOwotCi0JICBkb21haW4gPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICAgIHBwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0JICBpZiAoZG9tYWluID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotCSAgaWYgKCoqcHAgIT0gJywnKQotCSAgICB7Ci0JICAgICAgYmFkX3N0YWIgKG9yaWcpOwotCSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICAgIH0KLQkgICsrKnBwOwotCi0JICByZXR1cm5fdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJIHBwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0JICBpZiAocmV0dXJuX3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0JICBhbGxvYyA9IDEwOwotCSAgYXJncyA9IChkZWJ1Z190eXBlICopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICphcmdzKTsKLQkgIG4gPSAwOwotCSAgd2hpbGUgKCoqcHAgIT0gJzsnKQotCSAgICB7Ci0JICAgICAgaWYgKCoqcHAgIT0gJywnKQotCQl7Ci0JCSAgYmFkX3N0YWIgKG9yaWcpOwotCQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JCX0KLQkgICAgICArKypwcDsKLQotCSAgICAgIGlmIChuICsgMSA+PSBhbGxvYykKLQkJewotCQkgIGFsbG9jICs9IDEwOwotCQkgIGFyZ3MgPSAoKGRlYnVnX3R5cGUgKikKLQkJCSAgeHJlYWxsb2MgKChQVFIpIGFyZ3MsIGFsbG9jICogc2l6ZW9mICphcmdzKSk7Ci0JCX0KLQotCSAgICAgIGFyZ3Nbbl0gPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCSBwcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgICAgIGlmIChhcmdzW25dID09IERFQlVHX1RZUEVfTlVMTCkKLQkJcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgICAgICArK247Ci0JICAgIH0KLQkgICsrKnBwOwotCi0JICAvKiBJZiB0aGUgbGFzdCB0eXBlIGlzIG5vdCB2b2lkLCB0aGVuIHRoaXMgZnVuY3Rpb24gdGFrZXMgYQotCSAgICAgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIE90aGVyd2lzZSwgd2UgbXVzdCBzdHJpcAotCSAgICAgdGhlIHZvaWQgdHlwZS4gICovCi0JICBpZiAobiA9PSAwCi0JICAgICAgfHwgZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgYXJnc1tuIC0gMV0pICE9IERFQlVHX0tJTkRfVk9JRCkKLQkgICAgdmFyYXJncyA9IHRydWU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAtLW47Ci0JICAgICAgdmFyYXJncyA9IGZhbHNlOwotCSAgICB9Ci0KLQkgIGFyZ3Nbbl0gPSBERUJVR19UWVBFX05VTEw7Ci0KLQkgIGR0eXBlID0gZGVidWdfbWFrZV9tZXRob2RfdHlwZSAoZGhhbmRsZSwgcmV0dXJuX3R5cGUsIGRvbWFpbiwgYXJncywKLQkJCQkJICB2YXJhcmdzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3InOgotICAgICAgLyogUmFuZ2UgdHlwZS4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfcmFuZ2VfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW5hbWUsIHBwLCB0eXBlbnVtcyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2InOgotICAgICAgLyogRklYTUU6IGdkYiBjaGVja3Mgb3M5a19zdGFicyBoZXJlLiAgKi8KLSAgICAgIC8qIFN1biBBQ0MgYnVpbHRpbiBpbnQgdHlwZS4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfc3VuX2J1aWx0aW5fdHlwZSAoZGhhbmRsZSwgcHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdSJzoKLSAgICAgIC8qIFN1biBBQ0MgYnVpbHRpbiBmbG9hdCB0eXBlLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl9zdW5fZmxvYXRpbmdfdHlwZSAoZGhhbmRsZSwgcHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdlJzoKLSAgICAgIC8qIEVudW1lcmF0aW9uIHR5cGUuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX2VudW1fdHlwZSAoZGhhbmRsZSwgcHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICd1JzoKLSAgICAgIC8qIFN0cnVjdCBvciB1bmlvbiB0eXBlLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW5hbWUsIHBwLAotCQkJCSAgICAgIGRlc2NyaXB0b3IgPT0gJ3MnLCB0eXBlbnVtcyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2EnOgotICAgICAgLyogQXJyYXkgdHlwZS4gICovCi0gICAgICBpZiAoKipwcCAhPSAncicpCi0JewotCSAgYmFkX3N0YWIgKG9yaWcpOwotCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQl9Ci0gICAgICArKypwcDsKLQotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX2FycmF5X3R5cGUgKGRoYW5kbGUsIGluZm8sIHBwLCBzdHJpbmdwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUyc6Ci0gICAgICBkdHlwZSA9IGRlYnVnX21ha2Vfc2V0X3R5cGUgKGRoYW5kbGUsCi0JCQkJICAgcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLAotCQkJCQkJICAgIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCQkgICAgcHAsCi0JCQkJCQkgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpLAotCQkJCSAgIHN0cmluZ3ApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGlmICh0eXBlbnVtc1swXSAhPSAtMSkKLSAgICB7Ci0gICAgICBpZiAoISBzdGFiX3JlY29yZF90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtcywgZHR5cGUpKQotCXJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIGlmIChzaXplICE9IC0xKQotICAgIHsKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF90eXBlX3NpemUgKGRoYW5kbGUsIGR0eXBlLCAodW5zaWduZWQgaW50KSBzaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiBkdHlwZTsKLX0KLQotLyogUmVhZCBhIG51bWJlciBieSB3aGljaCBhIHR5cGUgaXMgcmVmZXJyZWQgdG8gaW4gZGJ4IGRhdGEsIG9yCi0gICBwZXJoYXBzIHJlYWQgYSBwYWlyIChGSUxFTlVNLCBUWVBFTlVNKSBpbiBwYXJlbnRoZXNlcy4gIEp1c3QgYQotICAgc2luZ2xlIG51bWJlciBOIGlzIGVxdWl2YWxlbnQgdG8gKDAsTikuICBSZXR1cm4gdGhlIHR3byBudW1iZXJzIGJ5Ci0gICBzdG9yaW5nIHRoZW0gaW4gdGhlIHZlY3RvciBUWVBFTlVNUy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9zdGFiX3R5cGVfbnVtYmVyIChwcCwgdHlwZW51bXMpCi0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgaW50ICp0eXBlbnVtczsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLQotICBvcmlnID0gKnBwOwotCi0gIGlmICgqKnBwICE9ICcoJykKLSAgICB7Ci0gICAgICB0eXBlbnVtc1swXSA9IDA7Ci0gICAgICB0eXBlbnVtc1sxXSA9IChpbnQpIHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICsrKnBwOwotICAgICAgdHlwZW51bXNbMF0gPSAoaW50KSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgICAgIGlmICgqKnBwICE9ICcsJykKLQl7Ci0JICBiYWRfc3RhYiAob3JpZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICB0eXBlbnVtc1sxXSA9IChpbnQpIHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICAgICAgaWYgKCoqcHAgIT0gJyknKQotCXsKLQkgIGJhZF9zdGFiIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICArKypwcDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIGEgcmFuZ2UgdHlwZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9zdGFiX3JhbmdlX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVuYW1lLCBwcCwgdHlwZW51bXMpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnR5cGVuYW1lOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGNvbnN0IGludCAqdHlwZW51bXM7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGludCByYW5nZW51bXNbMl07Ci0gIGJvb2xlYW4gc2VsZl9zdWJyYW5nZTsKLSAgZGVidWdfdHlwZSBpbmRleF90eXBlOwotICBjb25zdCBjaGFyICpzMiwgKnMzOwotICBiZmRfc2lnbmVkX3ZtYSBuMiwgbjM7Ci0gIGJvb2xlYW4gb3YyLCBvdjM7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBpbmRleF90eXBlID0gREVCVUdfVFlQRV9OVUxMOwotCi0gIC8qIEZpcnN0IGNvbWVzIGEgdHlwZSB3ZSBhcmUgYSBzdWJyYW5nZSBvZi4KLSAgICAgSW4gQyBpdCBpcyB1c3VhbGx5IDAsIDEgb3IgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC4gICovCi0gIGlmICghIHBhcnNlX3N0YWJfdHlwZV9udW1iZXIgKHBwLCByYW5nZW51bXMpKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgc2VsZl9zdWJyYW5nZSA9IChyYW5nZW51bXNbMF0gPT0gdHlwZW51bXNbMF0KLQkJICAgJiYgcmFuZ2VudW1zWzFdID09IHR5cGVudW1zWzFdKTsKLQotICBpZiAoKipwcCA9PSAnPScpCi0gICAgewotICAgICAgKnBwID0gb3JpZzsKLSAgICAgIGluZGV4X3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICAgIHBwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoaW5kZXhfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgaWYgKCoqcHAgPT0gJzsnKQotICAgICsrKnBwOwotCi0gIC8qIFRoZSByZW1haW5pbmcgdHdvIG9wZXJhbmRzIGFyZSB1c3VhbGx5IGxvd2VyIGFuZCB1cHBlciBib3VuZHMgb2YKLSAgICAgdGhlIHJhbmdlLiAgQnV0IGluIHNvbWUgc3BlY2lhbCBjYXNlcyB0aGV5IG1lYW4gc29tZXRoaW5nIGVsc2UuICAqLwotICBzMiA9ICpwcDsKLSAgbjIgPSBwYXJzZV9udW1iZXIgKHBwLCAmb3YyKTsKLSAgaWYgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotICArKypwcDsKLQotICBzMyA9ICpwcDsKLSAgbjMgPSBwYXJzZV9udW1iZXIgKHBwLCAmb3YzKTsKLSAgaWYgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotICArKypwcDsKLQotICBpZiAob3YyIHx8IG92MykKLSAgICB7Ci0gICAgICAvKiBnY2Mgd2lsbCBlbWl0IHJhbmdlIHN0YWJzIGZvciBsb25nIGxvbmcgdHlwZXMuICBIYW5kbGUgdGhpcwotICAgICAgICAgYXMgYSBzcGVjaWFsIGNhc2UuICBGSVhNRTogVGhpcyBuZWVkcyB0byBiZSBtb3JlIGdlbmVyYWwuICAqLwotI2RlZmluZSBMTExPVyAgIjAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwOyIKLSNkZWZpbmUgTExISUdIICIwNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3OyIKLSNkZWZpbmUgVUxMSElHSCAiMDE3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7IgotICAgICAgaWYgKGluZGV4X3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXsKLQkgIGlmIChzdHJuY21wIChzMiwgTExMT1csIHNpemVvZiBMTExPVyAtIDEpID09IDAKLQkgICAgICAmJiBzdHJuY21wIChzMywgTExISUdILCBzaXplb2YgTExISUdIIC0gMSkgPT0gMCkKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIGZhbHNlKTsKLQkgIGlmICghIG92MgotCSAgICAgICYmIG4yID09IDAKLQkgICAgICAmJiBzdHJuY21wIChzMywgVUxMSElHSCwgc2l6ZW9mIFVMTEhJR0ggLSAxKSA9PSAwKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgdHJ1ZSk7Ci0JfQotCi0gICAgICB3YXJuX3N0YWIgKG9yaWcsIF8oIm51bWVyaWMgb3ZlcmZsb3ciKSk7Ci0gICAgfQotCi0gIGlmIChpbmRleF90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICB7Ci0gICAgICAvKiBBIHR5cGUgZGVmaW5lZCBhcyBhIHN1YnJhbmdlIG9mIGl0c2VsZiwgd2l0aCBib3RoIGJvdW5kcyAwLAotICAgICAgICAgaXMgdm9pZC4gICovCi0gICAgICBpZiAoc2VsZl9zdWJyYW5nZSAmJiBuMiA9PSAwICYmIG4zID09IDApCi0JcmV0dXJuIGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLQotICAgICAgLyogQSB0eXBlIGRlZmluZWQgYXMgYSBzdWJyYW5nZSBvZiBpdHNlbGYsIHdpdGggbjIgcG9zaXRpdmUgYW5kCi0JIG4zIHplcm8sIGlzIGEgY29tcGxleCB0eXBlLCBhbmQgbjIgaXMgdGhlIG51bWJlciBvZiBieXRlcy4gICovCi0gICAgICBpZiAoc2VsZl9zdWJyYW5nZSAmJiBuMyA9PSAwICYmIG4yID4gMCkKLQlyZXR1cm4gZGVidWdfbWFrZV9jb21wbGV4X3R5cGUgKGRoYW5kbGUsIG4yKTsKLQotICAgICAgLyogSWYgbjMgaXMgemVybyBhbmQgbjIgaXMgcG9zaXRpdmUsIHRoaXMgaXMgYSBmbG9hdGluZyBwb2ludAotICAgICAgICAgdHlwZSwgYW5kIG4yIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMuICAqLwotICAgICAgaWYgKG4zID09IDAgJiYgbjIgPiAwKQotCXJldHVybiBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIG4yKTsKLQotICAgICAgLyogSWYgdGhlIHVwcGVyIGJvdW5kIGlzIC0xLCB0aGlzIGlzIGFuIHVuc2lnbmVkIGludC4gICovCi0gICAgICBpZiAobjIgPT0gMCAmJiBuMyA9PSAtMSkKLQl7Ci0JICAvKiBXaGVuIGdjYyBpcyB1c2VkIHdpdGggLWdzdGFicywgYnV0IG5vdCAtZ3N0YWJzKywgaXQgd2lsbCBlbWl0Ci0JICAgICAgICAgbG9uZyBsb25nIGludDp0Nj1yMTswOy0xOwotCQkgbG9uZyBsb25nIHVuc2lnbmVkIGludDp0Nz1yMTswOy0xOwotCSAgICAgV2UgaGFjayBoZXJlIHRvIGhhbmRsZSB0aGlzIHJlYXNvbmFibHkuICAqLwotCSAgaWYgKHR5cGVuYW1lICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY21wICh0eXBlbmFtZSwgImxvbmcgbG9uZyBpbnQiKSA9PSAwKQotCQlyZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgZmFsc2UpOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAodHlwZW5hbWUsICJsb25nIGxvbmcgdW5zaWduZWQgaW50IikgPT0gMCkKLQkJcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIHRydWUpOwotCSAgICB9Ci0JICAvKiBGSVhNRTogVGhlIHNpemUgaGVyZSByZWFsbHkgZGVwZW5kcyB1cG9uIHRoZSB0YXJnZXQuICAqLwotCSAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotCX0KLQotICAgICAgLyogQSByYW5nZSBvZiAwIHRvIDEyNyBpcyBjaGFyLiAgKi8KLSAgICAgIGlmIChzZWxmX3N1YnJhbmdlICYmIG4yID09IDAgJiYgbjMgPT0gMTI3KQotCXJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7Ci0KLSAgICAgIC8qIEZJWE1FOiBnZGIgY2hlY2tzIGZvciB0aGUgbGFuZ3VhZ2UgQ0hJTEwgaGVyZS4gICovCi0KLSAgICAgIGlmIChuMiA9PSAwKQotCXsKLQkgIGlmIChuMyA8IDApCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAtIG4zLCB0cnVlKTsKLQkgIGVsc2UgaWYgKG4zID09IDB4ZmYpCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCB0cnVlKTsKLQkgIGVsc2UgaWYgKG4zID09IDB4ZmZmZikKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIHRydWUpOwotCSAgZWxzZSBpZiAobjMgPT0gMHhmZmZmZmZmZikKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotI2lmZGVmIEJGRDY0Ci0JICBlbHNlIGlmIChuMyA9PSAoKCgoYmZkX3ZtYSkgMHhmZmZmZmZmZikgPDwgMzIpIHwgMHhmZmZmZmZmZikpCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCB0cnVlKTsKLSNlbmRpZgotCX0KLSAgICAgIGVsc2UgaWYgKG4zID09IDAKLQkgICAgICAgJiYgbjIgPCAwCi0JICAgICAgICYmIChzZWxmX3N1YnJhbmdlIHx8IG4yID09IC04KSkKLQlyZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgLSBuMiwgdHJ1ZSk7Ci0gICAgICBlbHNlIGlmIChuMiA9PSAtIG4zIC0gMSB8fCBuMiA9PSBuMyArIDEpCi0JewotCSAgaWYgKG4zID09IDB4N2YpCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7Ci0JICBlbHNlIGlmIChuMyA9PSAweDdmZmYpCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7Ci0JICBlbHNlIGlmIChuMyA9PSAweDdmZmZmZmZmKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotI2lmZGVmIEJGRDY0Ci0JICBlbHNlIGlmIChuMyA9PSAoKCgoYmZkX3ZtYSkgMHg3ZmZmZmZmZikgPDwgMzIpIHwgMHhmZmZmZmZmZikpCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCBmYWxzZSk7Ci0jZW5kaWYKLQl9Ci0gICAgfQotCi0gIC8qIEF0IHRoaXMgcG9pbnQgSSBkb24ndCBoYXZlIHRoZSBmYWludGVzdCBpZGVhIGhvdyB0byBkZWFsIHdpdGggYQotICAgICBzZWxmX3N1YnJhbmdlIHR5cGU7IEknbSBnb2luZyB0byBhc3N1bWUgdGhhdCB0aGlzIGlzIHVzZWQgYXMgYW4KLSAgICAgaWRpb20sIGFuZCB0aGF0IGFsbCBvZiB0aGVtIGFyZSBzcGVjaWFsIGNhc2VzLiAgU28gLiAuIC4gICovCi0gIGlmIChzZWxmX3N1YnJhbmdlKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIGluZGV4X3R5cGUgPSBzdGFiX2ZpbmRfdHlwZSAoZGhhbmRsZSwgaW5mbywgcmFuZ2VudW1zKTsKLSAgaWYgKGluZGV4X3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHsKLSAgICAgIC8qIERvZXMgdGhpcyBhY3R1YWxseSBldmVyIGhhcHBlbj8gIElzIHRoYXQgd2h5IHdlIGFyZSB3b3JyeWluZwotICAgICAgICAgYWJvdXQgZGVhbGluZyB3aXRoIGl0IHJhdGhlciB0aGFuIGp1c3QgY2FsbGluZyBlcnJvcl90eXBlPyAgKi8KLSAgICAgIHdhcm5fc3RhYiAob3JpZywgXygibWlzc2luZyBpbmRleCB0eXBlIikpOwotICAgICAgaW5kZXhfdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfcmFuZ2VfdHlwZSAoZGhhbmRsZSwgaW5kZXhfdHlwZSwgbjIsIG4zKTsKLX0KLQotLyogU3VuJ3MgQUNDIHVzZXMgYSBzb21ld2hhdCBzYW5lciBtZXRob2QgZm9yIHNwZWNpZnlpbmcgdGhlIGJ1aWx0aW4KLSAgIHR5cGVkZWZzIGluIGV2ZXJ5IGZpbGUgKGZvciBpbnQsIGxvbmcsIGV0Yyk6Ci0KLQl0eXBlID0gYiA8c2lnbmVkPiA8d2lkdGg+OyA8b2Zmc2V0PjsgPG5iaXRzPgotCXNpZ25lZCA9IHUgb3Igcy4gIFBvc3NpYmxlIGMgaW4gYWRkaXRpb24gdG8gdSBvciBzIChmb3IgY2hhcj8pLgotCW9mZnNldCA9IG9mZnNldCBmcm9tIGhpZ2ggb3JkZXIgYml0IHRvIHN0YXJ0IGJpdCBvZiB0eXBlLgotCXdpZHRoIGlzICMgYnl0ZXMgaW4gb2JqZWN0IG9mIHRoaXMgdHlwZSwgbmJpdHMgaXMgIyBiaXRzIGluIHR5cGUuCi0KLSAgIFRoZSB3aWR0aC9vZmZzZXQgc3R1ZmYgYXBwZWFycyB0byBiZSBmb3Igc21hbGwgb2JqZWN0cyBzdG9yZWQgaW4KLSAgIGxhcmdlciBvbmVzIChlLmcuIGBzaG9ydHMnIGluIGBpbnQnIHJlZ2lzdGVycykuICBXZSBpZ25vcmUgaXQgZm9yIG5vdywKLSAgIEZJWE1FLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXBhcnNlX3N0YWJfc3VuX2J1aWx0aW5fdHlwZSAoZGhhbmRsZSwgcHApCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGJvb2xlYW4gdW5zaWduZWRwOwotICBiZmRfdm1hIGJpdHM7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBzd2l0Y2ggKCoqcHApCi0gICAgewotICAgIGNhc2UgJ3MnOgotICAgICAgdW5zaWduZWRwID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICd1JzoKLSAgICAgIHVuc2lnbmVkcCA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0gICsrKnBwOwotCi0gIC8qIEZvciBzb21lIG9kZCByZWFzb24sIGFsbCBmb3JtcyBvZiBjaGFyIHB1dCBhIGMgaGVyZS4gIFRoaXMgaXMgc3RyYW5nZQotICAgICBiZWNhdXNlIG5vIG90aGVyIHR5cGUgaGFzIHRoaXMgaG9ub3IuICBXZSBjYW4gc2FmZWx5IGlnbm9yZSB0aGlzIGJlY2F1c2UKLSAgICAgd2UgYWN0dWFsbHkgZGV0ZXJtaW5lICdjaGFyJ2FjdGVybmVzcyBieSB0aGUgbnVtYmVyIG9mIGJpdHMgc3BlY2lmaWVkIGluCi0gICAgIHRoZSBkZXNjcmlwdG9yLiAgKi8KLSAgaWYgKCoqcHAgPT0gJ2MnKQotICAgICsrKnBwOwotCi0gIC8qIFRoZSBmaXJzdCBudW1iZXIgYXBwZWFycyB0byBiZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9jY3VwaWVkCi0gICAgIGJ5IHRoaXMgdHlwZSwgZXhjZXB0IHRoYXQgdW5zaWduZWQgc2hvcnQgaXMgNCBpbnN0ZWFkIG9mIDIuCi0gICAgIFNpbmNlIHRoaXMgaW5mb3JtYXRpb24gaXMgcmVkdW5kYW50IHdpdGggdGhlIHRoaXJkIG51bWJlciwKLSAgICAgd2Ugd2lsbCBpZ25vcmUgaXQuICAqLwotICAodm9pZCkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgLyogVGhlIHNlY29uZCBudW1iZXIgaXMgYWx3YXlzIDAsIHNvIGlnbm9yZSBpdCB0b28uICovCi0gICh2b2lkKSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgaWYgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotICArKypwcDsKLQotICAvKiBUaGUgdGhpcmQgbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YgYml0cyBmb3IgdGhpcyB0eXBlLiAqLwotICBiaXRzID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0KLSAgLyogVGhlIHR5cGUgKnNob3VsZCogZW5kIHdpdGggYSBzZW1pY29sb24uICBJZiBpdCBhcmUgZW1iZWRkZWQKLSAgICAgaW4gYSBsYXJnZXIgdHlwZSB0aGUgc2VtaWNvbG9uIG1heSBiZSB0aGUgb25seSB3YXkgdG8ga25vdyB3aGVyZQotICAgICB0aGUgdHlwZSBlbmRzLiAgSWYgdGhpcyB0eXBlIGlzIGF0IHRoZSBlbmQgb2YgdGhlIHN0YWJzdHJpbmcgd2UKLSAgICAgY2FuIGRlYWwgd2l0aCB0aGUgb21pdHRlZCBzZW1pY29sb24gKGJ1dCB3ZSBkb24ndCBoYXZlIHRvIGxpa2UKLSAgICAgaXQpLiAgRG9uJ3QgYm90aGVyIHRvIGNvbXBsYWluKCksIFN1bidzIGNvbXBpbGVyIG9taXRzIHRoZSBzZW1pY29sb24KLSAgICAgZm9yICJ2b2lkIi4gICovCi0gIGlmICgqKnBwID09ICc7JykKLSAgICArKypwcDsKLQotICBpZiAoYml0cyA9PSAwKQotICAgIHJldHVybiBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIGJpdHMgLyA4LCB1bnNpZ25lZHApOwotfQotCi0vKiBQYXJzZSBhIGJ1aWx0aW4gZmxvYXRpbmcgdHlwZSBnZW5lcmF0ZWQgYnkgdGhlIFN1biBjb21waWxlci4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9zdGFiX3N1bl9mbG9hdGluZ190eXBlIChkaGFuZGxlLCBwcCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgYmZkX3ZtYSBkZXRhaWxzOwotICBiZmRfdm1hIGJ5dGVzOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgLyogVGhlIGZpcnN0IG51bWJlciBoYXMgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSB0eXBlLCBmb3IgZXhhbXBsZQotICAgICBGTl9DT01QTEVYLiAgKi8KLSAgZGV0YWlscyA9IHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICBpZiAoKipwcCAhPSAnOycpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgLyogVGhlIHNlY29uZCBudW1iZXIgaXMgdGhlIG51bWJlciBvZiBieXRlcyBvY2N1cGllZCBieSB0aGlzIHR5cGUgKi8KLSAgYnl0ZXMgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgaWYgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIGlmIChkZXRhaWxzID09IE5GX0NPTVBMRVgKLSAgICAgIHx8IGRldGFpbHMgPT0gTkZfQ09NUExFWDE2Ci0gICAgICB8fCBkZXRhaWxzID09IE5GX0NPTVBMRVgzMikKLSAgICByZXR1cm4gZGVidWdfbWFrZV9jb21wbGV4X3R5cGUgKGRoYW5kbGUsIGJ5dGVzKTsKLQotICByZXR1cm4gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCBieXRlcyk7ICAgICAgCi19Ci0KLS8qIEhhbmRsZSBhbiBlbnVtIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2Vfc3RhYl9lbnVtX3R5cGUgKGRoYW5kbGUsIHBwKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBjb25zdCBjaGFyICoqbmFtZXM7Ci0gIGJmZF9zaWduZWRfdm1hICp2YWx1ZXM7Ci0gIHVuc2lnbmVkIGludCBuOwotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICAvKiBGSVhNRTogZ2RiIGNoZWNrcyBvczlrX3N0YWJzIGhlcmUuICAqLwotCi0gIC8qIFRoZSBhaXg0IGNvbXBpbGVyIGVtaXRzIGFuIGV4dHJhIGZpZWxkIGJlZm9yZSB0aGUgZW51bSBtZW1iZXJzOwotICAgICBteSBndWVzcyBpcyBpdCdzIGEgdHlwZSBvZiBzb21lIHNvcnQuICBKdXN0IGlnbm9yZSBpdC4gICovCi0gIGlmICgqKnBwID09ICctJykKLSAgICB7Ci0gICAgICB3aGlsZSAoKipwcCAhPSAnOicpCi0JKysqcHA7Ci0gICAgICArKypwcDsKLSAgICB9Ci0KLSAgLyogUmVhZCB0aGUgdmFsdWUtbmFtZXMgYW5kIHRoZWlyIHZhbHVlcy4KLSAgICAgVGhlIGlucHV0IHN5bnRheCBpcyBOQU1FOlZBTFVFLE5BTUU6VkFMVUUsIGFuZCBzbyBvbi4KLSAgICAgQSBzZW1pY29sb24gb3IgY29tbWEgaW5zdGVhZCBvZiBhIE5BTUUgbWVhbnMgdGhlIGVuZC4gICovCi0gIGFsbG9jID0gMTA7Ci0gIG5hbWVzID0gKGNvbnN0IGNoYXIgKiopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpuYW1lcyk7Ci0gIHZhbHVlcyA9IChiZmRfc2lnbmVkX3ZtYSAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqdmFsdWVzKTsKLSAgbiA9IDA7Ci0gIHdoaWxlICgqKnBwICE9ICdcMCcgJiYgKipwcCAhPSAnOycgJiYgKipwcCAhPSAnLCcpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqcDsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSB2YWw7Ci0KLSAgICAgIHAgPSAqcHA7Ci0gICAgICB3aGlsZSAoKnAgIT0gJzonKQotCSsrcDsKLQotICAgICAgbmFtZSA9IHNhdmVzdHJpbmcgKCpwcCwgcCAtICpwcCk7Ci0KLSAgICAgICpwcCA9IHAgKyAxOwotICAgICAgdmFsID0gKGJmZF9zaWduZWRfdm1hKSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgICAgIGlmICgqKnBwICE9ICcsJykKLQl7Ci0JICBiYWRfc3RhYiAob3JpZyk7Ci0JICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCX0KLSAgICAgICsrKnBwOwotCi0gICAgICBpZiAobiArIDEgPj0gYWxsb2MpCi0JewotCSAgYWxsb2MgKz0gMTA7Ci0JICBuYW1lcyA9ICgoY29uc3QgY2hhciAqKikKLQkJICAgeHJlYWxsb2MgKChQVFIpIG5hbWVzLCBhbGxvYyAqIHNpemVvZiAqbmFtZXMpKTsKLQkgIHZhbHVlcyA9ICgoYmZkX3NpZ25lZF92bWEgKikKLQkJICAgIHhyZWFsbG9jICgoUFRSKSB2YWx1ZXMsIGFsbG9jICogc2l6ZW9mICp2YWx1ZXMpKTsKLQl9Ci0KLSAgICAgIG5hbWVzW25dID0gbmFtZTsKLSAgICAgIHZhbHVlc1tuXSA9IHZhbDsKLSAgICAgICsrbjsKLSAgICB9Ci0KLSAgbmFtZXNbbl0gPSBOVUxMOwotICB2YWx1ZXNbbl0gPSAwOwotCi0gIGlmICgqKnBwID09ICc7JykKLSAgICArKypwcDsKLQotICByZXR1cm4gZGVidWdfbWFrZV9lbnVtX3R5cGUgKGRoYW5kbGUsIG5hbWVzLCB2YWx1ZXMpOwotfQotCi0vKiBSZWFkIHRoZSBkZXNjcmlwdGlvbiBvZiBhIHN0cnVjdHVyZSAob3IgdW5pb24gdHlwZSkgYW5kIHJldHVybiBhbiBvYmplY3QKLSAgIGRlc2NyaWJpbmcgdGhlIHR5cGUuCi0KLSAgIFBQIHBvaW50cyB0byBhIGNoYXJhY3RlciBwb2ludGVyIHRoYXQgcG9pbnRzIHRvIHRoZSBuZXh0IHVuY29uc3VtZWQgdG9rZW4KLSAgIGluIHRoZSB0aGUgc3RhYnMgc3RyaW5nLiAgRm9yIGV4YW1wbGUsIGdpdmVuIHN0YWJzICJBOlQ0PXM0YToxLDAsMzI7OyIsCi0gICAqUFAgd2lsbCBwb2ludCB0byAiNGE6MSwwLDMyOzsiLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXBhcnNlX3N0YWJfc3RydWN0X3R5cGUgKGRoYW5kbGUsIGluZm8sIHRhZ25hbWUsIHBwLCBzdHJ1Y3RwLCB0eXBlbnVtcykKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqdGFnbmFtZTsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBib29sZWFuIHN0cnVjdHA7Ci0gICAgIGNvbnN0IGludCAqdHlwZW51bXM7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGJmZF92bWEgc2l6ZTsKLSAgZGVidWdfYmFzZWNsYXNzICpiYXNlY2xhc3NlczsKLSAgZGVidWdfZmllbGQgKmZpZWxkczsKLSAgYm9vbGVhbiBzdGF0aWNzOwotICBkZWJ1Z19tZXRob2QgKm1ldGhvZHM7Ci0gIGRlYnVnX3R5cGUgdnB0cmJhc2U7Ci0gIGJvb2xlYW4gb3dudnB0cjsKLQotICBvcmlnID0gKnBwOwotCi0gIC8qIEdldCB0aGUgc2l6ZS4gICovCi0gIHNpemUgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLQotICAvKiBHZXQgdGhlIG90aGVyIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKCEgcGFyc2Vfc3RhYl9iYXNlY2xhc3NlcyAoZGhhbmRsZSwgaW5mbywgcHAsICZiYXNlY2xhc3NlcykKLSAgICAgIHx8ICEgcGFyc2Vfc3RhYl9zdHJ1Y3RfZmllbGRzIChkaGFuZGxlLCBpbmZvLCBwcCwgJmZpZWxkcywgJnN0YXRpY3MpCi0gICAgICB8fCAhIHBhcnNlX3N0YWJfbWVtYmVycyAoZGhhbmRsZSwgaW5mbywgdGFnbmFtZSwgcHAsIHR5cGVudW1zLCAmbWV0aG9kcykKLSAgICAgIHx8ICEgcGFyc2Vfc3RhYl90aWxkZV9maWVsZCAoZGhhbmRsZSwgaW5mbywgcHAsIHR5cGVudW1zLCAmdnB0cmJhc2UsCi0JCQkJICAgJm93bnZwdHIpKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgaWYgKCEgc3RhdGljcwotICAgICAgJiYgYmFzZWNsYXNzZXMgPT0gTlVMTAotICAgICAgJiYgbWV0aG9kcyA9PSBOVUxMCi0gICAgICAmJiB2cHRyYmFzZSA9PSBERUJVR19UWVBFX05VTEwKLSAgICAgICYmICEgb3dudnB0cikKLSAgICByZXR1cm4gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgc3RydWN0cCwgc2l6ZSwgZmllbGRzKTsKLQotICByZXR1cm4gZGVidWdfbWFrZV9vYmplY3RfdHlwZSAoZGhhbmRsZSwgc3RydWN0cCwgc2l6ZSwgZmllbGRzLCBiYXNlY2xhc3NlcywKLQkJCQkgbWV0aG9kcywgdnB0cmJhc2UsIG93bnZwdHIpOwotfQotCi0vKiBUaGUgc3RhYnMgZm9yIEMrKyBkZXJpdmVkIGNsYXNzZXMgY29udGFpbiBiYXNlY2xhc3MgaW5mb3JtYXRpb24gd2hpY2gKLSAgIGlzIG1hcmtlZCBieSBhICchJyBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIHRvdGFsIHNpemUuICBUaGlzIGZ1bmN0aW9uIGlzCi0gICBjYWxsZWQgd2hlbiB3ZSBlbmNvdW50ZXIgdGhlIGJhc2VjbGFzcyBtYXJrZXIsIGFuZCBzbHVycHMgdXAgYWxsIHRoZQotICAgYmFzZWNsYXNzIGluZm9ybWF0aW9uLgotCi0gICBJbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlICchJyBtYXJrZXIgaXMgdGhlIG51bWJlciBvZiBiYXNlIGNsYXNzZXMgdGhhdAotICAgdGhlIGNsYXNzIGlzIGRlcml2ZWQgZnJvbSwgZm9sbG93ZWQgYnkgaW5mb3JtYXRpb24gZm9yIGVhY2ggYmFzZSBjbGFzcy4KLSAgIEZvciBlYWNoIGJhc2UgY2xhc3MsIHRoZXJlIGFyZSB0d28gdmlzaWJpbGl0eSBzcGVjaWZpZXJzLCBhIGJpdCBvZmZzZXQKLSAgIHRvIHRoZSBiYXNlIGNsYXNzIGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgZGVyaXZlZCBjbGFzcywgYSByZWZlcmVuY2UgdG8KLSAgIHRoZSB0eXBlIGZvciB0aGUgYmFzZSBjbGFzcywgYW5kIGEgdGVybWluYXRpbmcgc2VtaWNvbG9uLgotCi0gICBBIHR5cGljYWwgZXhhbXBsZSwgd2l0aCB0d28gYmFzZSBjbGFzc2VzLCB3b3VsZCBiZSAiITIsMDIwLDE5OzAyNjQsMjE7Ii4KLSAgIAkJCQkJCSAgICAgICBeXiBeIF4gXiAgXiBeICBeCi0JQmFzZWNsYXNzIGluZm9ybWF0aW9uIG1hcmtlciBfX19fX19fX19fX19fX19fX198fCB8IHwgfCAgfCB8ICB8Ci0JTnVtYmVyIG9mIGJhc2VjbGFzc2VzIF9fX19fX19fX19fX19fX19fX19fX19fX19ffCB8IHwgfCAgfCB8ICB8Ci0JVmlzaWJpbGl0eSBzcGVjaWZpZXJzICgyKSBfX19fX19fX19fX19fX19fX19fX19fX198IHwgfCAgfCB8ICB8Ci0JT2Zmc2V0IGluIGJpdHMgZnJvbSBzdGFydCBvZiBjbGFzcyBfX19fX19fX19fX19fX19fX3wgfCAgfCB8ICB8Ci0JVHlwZSBudW1iZXIgZm9yIGJhc2UgY2xhc3MgX19fX19fX19fX19fX19fX19fX19fX19fX19ffCAgfCB8ICB8Ci0JVmlzaWJpbGl0eSBzcGVjaWZpZXJzICgyKSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCB8ICB8Ci0JT2Zmc2V0IGluIGJpdHMgZnJvbSBzdGFydCBvZiBjbGFzcyBfX19fX19fX19fX19fX19fX19fX19fX198ICB8Ci0JVHlwZSBudW1iZXIgb2YgYmFzZSBjbGFzcyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0KLSAgUmV0dXJuIHRydWUgZm9yIHN1Y2Nlc3MsIGZhbHNlIGZvciBmYWlsdXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX3N0YWJfYmFzZWNsYXNzZXMgKGRoYW5kbGUsIGluZm8sIHBwLCByZXRwKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGRlYnVnX2Jhc2VjbGFzcyAqKnJldHA7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIHVuc2lnbmVkIGludCBjLCBpOwotICBkZWJ1Z19iYXNlY2xhc3MgKmNsYXNzZXM7Ci0KLSAgKnJldHAgPSBOVUxMOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgaWYgKCoqcHAgIT0gJyEnKQotICAgIHsKLSAgICAgIC8qIE5vIGJhc2UgY2xhc3Nlcy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIGMgPSAodW5zaWduZWQgaW50KSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLQotICBpZiAoKipwcCAhPSAnLCcpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgY2xhc3NlcyA9IChkZWJ1Z19iYXNlY2xhc3MgKikgeG1hbGxvYyAoKGMgKyAxKSAqIHNpemVvZiAoKipyZXRwKSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLSAgICB7Ci0gICAgICBib29sZWFuIHZpcnR1YWw7Ci0gICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgIGJmZF92bWEgYml0cG9zOwotICAgICAgZGVidWdfdHlwZSB0eXBlOwotCi0gICAgICBzd2l0Y2ggKCoqcHApCi0JewotCWNhc2UgJzAnOgotCSAgdmlydHVhbCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAnMSc6Ci0JICB2aXJ0dWFsID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICB3YXJuX3N0YWIgKG9yaWcsIF8oInVua25vd24gdmlydHVhbCBjaGFyYWN0ZXIgZm9yIGJhc2VjbGFzcyIpKTsKLQkgIHZpcnR1YWwgPSBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLSAgICAgICsrKnBwOwotCi0gICAgICBzd2l0Y2ggKCoqcHApCi0JewotCWNhc2UgJzAnOgotCSAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURTsKLQkgIGJyZWFrOwotCWNhc2UgJzEnOgotCSAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOwotCSAgYnJlYWs7Ci0JY2FzZSAnMic6Ci0JICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgd2Fybl9zdGFiIChvcmlnLCBfKCJ1bmtub3duIHZpc2liaWxpdHkgY2hhcmFjdGVyIGZvciBiYXNlY2xhc3MiKSk7Ci0JICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7Ci0JICBicmVhazsKLQl9Ci0gICAgICArKypwcDsKLQotICAgICAgLyogVGhlIHJlbWFpbmluZyB2YWx1ZSBpcyB0aGUgYml0IG9mZnNldCBvZiB0aGUgcG9ydGlvbiBvZiB0aGUKLQkgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBiYXNlY2xhc3MuICBBbHdheXMgemVybyBpbiB0aGUKLQkgYWJzZW5jZSBvZiBtdWx0aXBsZSBpbmhlcml0YW5jZS4gICovCi0gICAgICBiaXRwb3MgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgICAgIGlmICgqKnBwICE9ICcsJykKLQl7Ci0JICBiYWRfc3RhYiAob3JpZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgKysqcHA7Ci0KLSAgICAgIHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgY2xhc3Nlc1tpXSA9IGRlYnVnX21ha2VfYmFzZWNsYXNzIChkaGFuZGxlLCB0eXBlLCBiaXRwb3MsIHZpcnR1YWwsCi0JCQkJCSB2aXNpYmlsaXR5KTsKLSAgICAgIGlmIChjbGFzc2VzW2ldID09IERFQlVHX0JBU0VDTEFTU19OVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCoqcHAgIT0gJzsnKQotCXJldHVybiBmYWxzZTsKLSAgICAgICsrKnBwOwotICAgIH0KLQotICBjbGFzc2VzW2ldID0gREVCVUdfQkFTRUNMQVNTX05VTEw7Ci0KLSAgKnJldHAgPSBjbGFzc2VzOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIHN0cnVjdCBvciBjbGFzcyBkYXRhIGZpZWxkcy4gIFRoZXkgaGF2ZSB0aGUgZm9ybToKLQotICAgCU5BTUUgOiBbVklTSUJJTElUWV0gVFlQRU5VTSAsIEJJVFBPUyAsIEJJVFNJWkUgOwotCi0gICBBdCB0aGUgZW5kLCB3ZSBzZWUgYSBzZW1pY29sb24gaW5zdGVhZCBvZiBhIGZpZWxkLgotCi0gICBJbiBDKyssIHRoaXMgbWF5IHdpbmQgdXAgYmVpbmcgTkFNRTo/VFlQRU5VTTpQSFlTTkFNRTsgZm9yCi0gICBhIHN0YXRpYyBmaWVsZC4KLQotICAgVGhlIG9wdGlvbmFsIFZJU0lCSUxJVFkgaXMgb25lIG9mOgotCi0gICAJJy8wJwkoVklTSUJJTElUWV9QUklWQVRFKQotCScvMScJKFZJU0lCSUxJVFlfUFJPVEVDVEVEKQotCScvMicJKFZJU0lCSUxJVFlfUFVCTElDKQotCScvOScJKFZJU0lCSUxJVFlfSUdOT1JFKQotCi0gICBvciBub3RoaW5nLCBmb3IgQyBzdHlsZSBmaWVsZHMgd2l0aCBwdWJsaWMgdmlzaWJpbGl0eS4KLQotICAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX3N0YWJfc3RydWN0X2ZpZWxkcyAoZGhhbmRsZSwgaW5mbywgcHAsIHJldHAsIHN0YXRpY3NwKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGRlYnVnX2ZpZWxkICoqcmV0cDsKLSAgICAgYm9vbGVhbiAqc3RhdGljc3A7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0gIHVuc2lnbmVkIGludCBjOwotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0KLSAgKnJldHAgPSBOVUxMOwotICAqc3RhdGljc3AgPSBmYWxzZTsKLQotICBvcmlnID0gKnBwOwotCi0gIGMgPSAwOwotICBhbGxvYyA9IDEwOwotICBmaWVsZHMgPSAoZGVidWdfZmllbGQgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKmZpZWxkcyk7Ci0gIHdoaWxlICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogZ2RiIGNoZWNrcyBvczlrX3N0YWJzIGhlcmUuICAqLwotCi0gICAgICBwID0gKnBwOwotCi0gICAgICAvKiBBZGQgMSB0byBjIHRvIGxlYXZlIHJvb20gZm9yIE5VTEwgcG9pbnRlciBhdCBlbmQuICAqLwotICAgICAgaWYgKGMgKyAxID49IGFsbG9jKQotCXsKLQkgIGFsbG9jICs9IDEwOwotCSAgZmllbGRzID0gKChkZWJ1Z19maWVsZCAqKQotCQkgICAgeHJlYWxsb2MgKChQVFIpIGZpZWxkcywgYWxsb2MgKiBzaXplb2YgKmZpZWxkcykpOwotCX0KLQotICAgICAgLyogSWYgaXQgc3RhcnRzIHdpdGggQ1BMVVNfTUFSS0VSIGl0IGlzIGEgc3BlY2lhbCBhYmJyZXZpYXRpb24sCi0JIHVubGVzcyB0aGUgQ1BMVVNfTUFSS0VSIGlzIGZvbGxvd2VkIGJ5IGFuIHVuZGVyc2NvcmUsIGluCi0JIHdoaWNoIGNhc2UgaXQgaXMganVzdCB0aGUgbmFtZSBvZiBhbiBhbm9ueW1vdXMgdHlwZSwgd2hpY2ggd2UKLQkgc2hvdWxkIGhhbmRsZSBsaWtlIGFueSBvdGhlciB0eXBlIG5hbWUuICBXZSBhY2NlcHQgZWl0aGVyICckJwotCSBvciAnLicsIGJlY2F1c2UgYSBmaWVsZCBuYW1lIGNhbiBuZXZlciBjb250YWluIG9uZSBvZiB0aGVzZQotCSBjaGFyYWN0ZXJzIGV4Y2VwdCBhcyBhIENQTFVTX01BUktFUi4gICovCi0KLSAgICAgIGlmICgoKnAgPT0gJyQnIHx8ICpwID09ICcuJykgJiYgcFsxXSAhPSAnXycpCi0JewotCSAgKysqcHA7Ci0JICBpZiAoISBwYXJzZV9zdGFiX2NwcF9hYmJyZXYgKGRoYW5kbGUsIGluZm8sIHBwLCBmaWVsZHMgKyBjKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgKytjOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBMb29rIGZvciB0aGUgJzonIHRoYXQgc2VwYXJhdGVzIHRoZSBmaWVsZCBuYW1lIGZyb20gdGhlIGZpZWxkCi0JIHZhbHVlcy4gIERhdGEgbWVtYmVycyBhcmUgZGVsaW1pdGVkIGJ5IGEgc2luZ2xlICc6Jywgd2hpbGUgbWVtYmVyCi0JIGZ1bmN0aW9ucyBhcmUgZGVsaW1pdGVkIGJ5IGEgcGFpciBvZiAnOidzLiAgV2hlbiB3ZSBoaXQgdGhlIG1lbWJlcgotCSBmdW5jdGlvbnMgKGlmIGFueSksIHRlcm1pbmF0ZSBzY2FuIGxvb3AgYW5kIHJldHVybi4gKi8KLQotICAgICAgcCA9IHN0cmNociAocCwgJzonKTsKLSAgICAgIGlmIChwID09IE5VTEwpCi0JewotCSAgYmFkX3N0YWIgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHBbMV0gPT0gJzonKQotCWJyZWFrOwotCi0gICAgICBpZiAoISBwYXJzZV9zdGFiX29uZV9zdHJ1Y3RfZmllbGQgKGRoYW5kbGUsIGluZm8sIHBwLCBwLCBmaWVsZHMgKyBjLAotCQkJCQkgc3RhdGljc3ApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgKytjOwotICAgIH0KLQotICBmaWVsZHNbY10gPSBERUJVR19GSUVMRF9OVUxMOwotCi0gICpyZXRwID0gZmllbGRzOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTcGVjaWFsIEdOVSBDKysgbmFtZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9zdGFiX2NwcF9hYmJyZXYgKGRoYW5kbGUsIGluZm8sIHBwLCByZXRwKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGRlYnVnX2ZpZWxkICpyZXRwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBpbnQgY3BwX2FiYnJldjsKLSAgZGVidWdfdHlwZSBjb250ZXh0OwotICBjb25zdCBjaGFyICpuYW1lOwotICBjb25zdCBjaGFyICp0eXBlbmFtZTsKLSAgZGVidWdfdHlwZSB0eXBlOwotICBiZmRfdm1hIGJpdHBvczsKLQotICAqcmV0cCA9IERFQlVHX0ZJRUxEX05VTEw7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBpZiAoKipwcCAhPSAndicpCi0gICAgewotICAgICAgYmFkX3N0YWIgKCpwcCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICBjcHBfYWJicmV2ID0gKipwcDsKLSAgKysqcHA7Ci0KLSAgLyogQXQgdGhpcyBwb2ludCwgKnBwIHBvaW50cyB0byBzb21ldGhpbmcgbGlrZSAiMjI6MjM9KjIyLi4uIiwgd2hlcmUKLSAgICAgdGhlIHR5cGUgbnVtYmVyIGJlZm9yZSB0aGUgJzonIGlzIHRoZSAiY29udGV4dCIgYW5kIGV2ZXJ5dGhpbmcKLSAgICAgYWZ0ZXIgaXMgYSByZWd1bGFyIHR5cGUgZGVmaW5pdGlvbi4gIExvb2t1cCB0aGUgdHlwZSwgZmluZCBpdCdzCi0gICAgIG5hbWUsIGFuZCBjb25zdHJ1Y3QgdGhlIGZpZWxkIG5hbWUuICAqLwotCi0gIGNvbnRleHQgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gIGlmIChjb250ZXh0ID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3dpdGNoIChjcHBfYWJicmV2KQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIC8qICR2ZiAtLSBhIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgcG9pbnRlci4gICovCi0gICAgICBuYW1lID0gIl92cHRyJCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdiJzoKLSAgICAgIC8qICR2YiAtLSBhIHZpcnR1YWwgYnNvbWV0aGluZ29yb3RoZXIgKi8KLSAgICAgIHR5cGVuYW1lID0gZGVidWdfZ2V0X3R5cGVfbmFtZSAoZGhhbmRsZSwgY29udGV4dCk7Ci0gICAgICBpZiAodHlwZW5hbWUgPT0gTlVMTCkKLQl7Ci0JICB3YXJuX3N0YWIgKG9yaWcsIF8oInVubmFtZWQgJHZiIHR5cGUiKSk7Ci0JICB0eXBlbmFtZSA9ICJGT08iOwotCX0KLSAgICAgIG5hbWUgPSBjb25jYXQgKCJfdmIkIiwgdHlwZW5hbWUsIChjb25zdCBjaGFyICopIE5VTEwpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHdhcm5fc3RhYiAob3JpZywgXygidW5yZWNvZ25pemVkIEMrKyBhYmJyZXZpYXRpb24iKSk7Ci0gICAgICBuYW1lID0gIklOVkFMSURfQ1BMVVNQTFVTX0FCQlJFViI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKCoqcHAgIT0gJzonKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICcsJykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICBiaXRwb3MgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgaWYgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gICpyZXRwID0gZGVidWdfbWFrZV9maWVsZCAoZGhhbmRsZSwgbmFtZSwgdHlwZSwgYml0cG9zLCAwLAotCQkJICAgIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURSk7Ci0gIGlmICgqcmV0cCA9PSBERUJVR19GSUVMRF9OVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgYSBzaW5nbGUgZmllbGQgaW4gYSBzdHJ1Y3Qgb3IgdW5pb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2Vfc3RhYl9vbmVfc3RydWN0X2ZpZWxkIChkaGFuZGxlLCBpbmZvLCBwcCwgcCwgcmV0cCwgc3RhdGljc3ApCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgY29uc3QgY2hhciAqcDsKLSAgICAgZGVidWdfZmllbGQgKnJldHA7Ci0gICAgIGJvb2xlYW4gKnN0YXRpY3NwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBjaGFyICpuYW1lOwotICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgZGVidWdfdHlwZSB0eXBlOwotICBiZmRfdm1hIGJpdHBvczsKLSAgYmZkX3ZtYSBiaXRzaXplOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgLyogRklYTUU6IGdkYiBjaGVja3MgQVJNX0RFTUFOR0xJTkcgaGVyZS4gICovCi0KLSAgbmFtZSA9IHNhdmVzdHJpbmcgKCpwcCwgcCAtICpwcCk7Ci0KLSAgKnBwID0gcCArIDE7Ci0KLSAgaWYgKCoqcHAgIT0gJy8nKQotICAgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLSAgZWxzZQotICAgIHsKLSAgICAgICsrKnBwOwotICAgICAgc3dpdGNoICgqKnBwKQotCXsKLQljYXNlICcwJzoKLQkgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU7Ci0JICBicmVhazsKLQljYXNlICcxJzoKLQkgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDsKLQkgIGJyZWFrOwotCWNhc2UgJzInOgotCSAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHdhcm5fc3RhYiAob3JpZywgXygidW5rbm93biB2aXNpYmlsaXR5IGNoYXJhY3RlciBmb3IgZmllbGQiKSk7Ci0JICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7Ci0JICBicmVhazsKLQl9Ci0gICAgICArKypwcDsKLSAgICB9Ci0KLSAgdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCi0JCQkgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoKipwcCA9PSAnOicpCi0gICAgewotICAgICAgY2hhciAqdmFybmFtZTsKLQotICAgICAgLyogVGhpcyBpcyBhIHN0YXRpYyBjbGFzcyBtZW1iZXIuICAqLwotICAgICAgKysqcHA7Ci0gICAgICBwID0gc3RyY2hyICgqcHAsICc7Jyk7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCXsKLQkgIGJhZF9zdGFiIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHZhcm5hbWUgPSBzYXZlc3RyaW5nICgqcHAsIHAgLSAqcHApOwotCi0gICAgICAqcHAgPSBwICsgMTsKLQotICAgICAgKnJldHAgPSBkZWJ1Z19tYWtlX3N0YXRpY19tZW1iZXIgKGRoYW5kbGUsIG5hbWUsIHR5cGUsIHZhcm5hbWUsCi0JCQkJCXZpc2liaWxpdHkpOwotICAgICAgKnN0YXRpY3NwID0gdHJ1ZTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmICgqKnBwICE9ICcsJykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICBiaXRwb3MgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgaWYgKCoqcHAgIT0gJywnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIGJpdHNpemUgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgaWYgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIGlmIChiaXRwb3MgPT0gMCAmJiBiaXRzaXplID09IDApCi0gICAgewotICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIGluIHR3byBjYXNlczogKDEpIGF0IGxlYXN0IGZvciBnY2MgMi40LjUgb3IKLQkgc28sIGl0IGlzIGEgZmllbGQgd2hpY2ggaGFzIGJlZW4gb3B0aW1pemVkIG91dC4gIFRoZSBjb3JyZWN0Ci0JIHN0YWIgZm9yIHRoaXMgY2FzZSBpcyB0byB1c2UgVklTSUJJTElUWV9JR05PUkUsIGJ1dCB0aGF0IGlzIGEKLQkgcmVjZW50IGludmVudGlvbi4gICgyKSBJdCBpcyBhIDAtc2l6ZSBhcnJheS4gIEZvciBleGFtcGxlCi0JIHVuaW9uIHsgaW50IG51bTsgY2hhciBzdHJbMF07IH0gZm9vLiAgUHJpbnRpbmcgIjxubyB2YWx1ZT4iCi0JIGZvciBzdHIgaW4gInAgZm9vIiBpcyBPSywgc2luY2UgZm9vLnN0ciAoYW5kIHRodXMgZm9vLnN0clszXSkKLQkgd2lsbCBjb250aW51ZSB0byB3b3JrLCBhbmQgYSAwLXNpemUgYXJyYXkgYXMgYSB3aG9sZSBkb2Vzbid0Ci0JIGhhdmUgYW55IGNvbnRlbnRzIHRvIHByaW50LgotCi0JIEkgc3VzcGVjdCB0aGlzIHByb2JhYmx5IGNvdWxkIGFsc28gaGFwcGVuIHdpdGggZ2NjIC1nc3RhYnMKLQkgKG5vdCAtZ3N0YWJzKykgZm9yIHN0YXRpYyBmaWVsZHMsIGFuZCBwZXJoYXBzIG90aGVyIEMrKwotCSBleHRlbnNpb25zLiAgSG9wZWZ1bGx5IGZldyBwZW9wbGUgdXNlIC1nc3RhYnMgd2l0aCBnZGIsIHNpbmNlCi0JIGl0IGlzIGludGVuZGVkIGZvciBkYnggY29tcGF0aWJpbGl0eS4gICovCi0gICAgICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9JR05PUkU7Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBnZGIgZG9lcyBzb21lIHN0dWZmIGhlcmUgdG8gbWFyayBmaWVsZHMgYXMgdW5wYWNrZWQuICAqLwotCi0gICpyZXRwID0gZGVidWdfbWFrZV9maWVsZCAoZGhhbmRsZSwgbmFtZSwgdHlwZSwgYml0cG9zLCBiaXRzaXplLCB2aXNpYmlsaXR5KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBtZW1iZXIgZnVuY3Rpb24gc3RhYnMgaW5mbyBmb3IgQysrIGNsYXNzZXMuICBUaGUgZm9ybSBvZiBlYWNoIG1lbWJlcgotICAgZnVuY3Rpb24gZGF0YSBpczoKLQotCU5BTUUgOjogVFlQRU5VTVs9dHlwZSBkZWZpbml0aW9uXSBBUkdTIDogUEhZU05BTUUgOwotCi0gICBBbiBleGFtcGxlIHdpdGggdHdvIG1lbWJlciBmdW5jdGlvbnMgaXM6Ci0KLQlhZnVuYzE6OjIwPSMjMTU7Omk7MkEuO2FmdW5jMjo6MjA6aTsyQS47Ci0KLSAgIEZvciB0aGUgY2FzZSBvZiBvdmVybG9hZGVkIG9wZXJhdG9ycywgdGhlIGZvcm1hdCBpcyBvcCQ6OiouZnVuY3MsIHdoZXJlCi0gICAkIGlzIHRoZSBDUExVU19NQVJLRVIgKHVzdWFsbHkgJyQnKSwgYConIGhvbGRzIHRoZSBwbGFjZSBmb3IgYW4gb3BlcmF0b3IKLSAgIG5hbWUgKHN1Y2ggYXMgYCs9JykgYW5kIGAuJyBtYXJrcyB0aGUgZW5kIG9mIHRoZSBvcGVyYXRvciBuYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX3N0YWJfbWVtYmVycyAoZGhhbmRsZSwgaW5mbywgdGFnbmFtZSwgcHAsIHR5cGVudW1zLCByZXRwKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICp0YWduYW1lOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGNvbnN0IGludCAqdHlwZW51bXM7Ci0gICAgIGRlYnVnX21ldGhvZCAqKnJldHA7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGRlYnVnX21ldGhvZCAqbWV0aG9kczsKLSAgdW5zaWduZWQgaW50IGM7Ci0gIHVuc2lnbmVkIGludCBhbGxvYzsKLQotICAqcmV0cCA9IE5VTEw7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBhbGxvYyA9IDA7Ci0gIG1ldGhvZHMgPSBOVUxMOwotICBjID0gMDsKLQotICB3aGlsZSAoKipwcCAhPSAnOycpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqcDsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBkZWJ1Z19tZXRob2RfdmFyaWFudCAqdmFyaWFudHM7Ci0gICAgICB1bnNpZ25lZCBpbnQgY3ZhcnM7Ci0gICAgICB1bnNpZ25lZCBpbnQgYWxsb2N2YXJzOwotICAgICAgZGVidWdfdHlwZSBsb29rX2FoZWFkX3R5cGU7Ci0KLSAgICAgIHAgPSBzdHJjaHIgKCpwcCwgJzonKTsKLSAgICAgIGlmIChwID09IE5VTEwgfHwgcFsxXSAhPSAnOicpCi0JYnJlYWs7Ci0KLSAgICAgIC8qIEZJWE1FOiBTb21lIHN5c3RlbXMgdXNlIHNvbWV0aGluZyBvdGhlciB0aGFuICckJyBoZXJlLiAgKi8KLSAgICAgIGlmICgoKnBwKVswXSAhPSAnbycgfHwgKCpwcClbMV0gIT0gJ3AnIHx8ICgqcHApWzJdICE9ICckJykKLQl7Ci0JICBuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBwIC0gKnBwKTsKLQkgICpwcCA9IHAgKyAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIGlzIGEgY29tcGxldGVseSB3aWVyZCBjYXNlLiAgSW4gb3JkZXIgdG8gc3R1ZmYgaW4gdGhlCi0JICAgICBuYW1lcyB0aGF0IG1pZ2h0IGNvbnRhaW4gY29sb25zICh0aGUgdXN1YWwgbmFtZSBkZWxpbWl0ZXIpLAotCSAgICAgTWlrZSBUaWVtYW5uIGRlZmluZWQgYSBkaWZmZXJlbnQgbmFtZSBmb3JtYXQgd2hpY2ggaXMKLQkgICAgIHNpZ25hbGxlZCBpZiB0aGUgaWRlbnRpZmllciBpcyAib3AkIi4gIEluIHRoYXQgY2FzZSwgdGhlCi0JICAgICBmb3JtYXQgaXMgIm9wJDo6WFhYWC4iIHdoZXJlIFhYWFggaXMgdGhlIG5hbWUuICBUaGlzIGlzCi0JICAgICB1c2VkIGZvciBuYW1lcyBsaWtlICIrIiBvciAiPSIuICBZVVVVVVVVVUshICBGSVhNRSEgICovCi0JICAqcHAgPSBwICsgMjsKLQkgIGZvciAocCA9ICpwcDsgKnAgIT0gJy4nICYmICpwICE9ICdcMCc7IHArKykKLQkgICAgOwotCSAgaWYgKCpwICE9ICcuJykKLQkgICAgewotCSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIG5hbWUgPSBzYXZlc3RyaW5nICgqcHAsIHAgLSAqcHApOwotCSAgKnBwID0gcCArIDE7Ci0JfQotCi0gICAgICBhbGxvY3ZhcnMgPSAxMDsKLSAgICAgIHZhcmlhbnRzID0gKChkZWJ1Z19tZXRob2RfdmFyaWFudCAqKQotCQkgIHhtYWxsb2MgKGFsbG9jdmFycyAqIHNpemVvZiAqdmFyaWFudHMpKTsKLSAgICAgIGN2YXJzID0gMDsKLQotICAgICAgbG9va19haGVhZF90eXBlID0gREVCVUdfVFlQRV9OVUxMOwotCi0gICAgICBkbwotCXsKLQkgIGRlYnVnX3R5cGUgdHlwZTsKLQkgIGJvb2xlYW4gc3R1YjsKLQkgIGNoYXIgKmFyZ3R5cGVzOwotCSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0JICBib29sZWFuIGNvbnN0cCwgdm9sYXRpbGVwLCBzdGF0aWNwOwotCSAgYmZkX3ZtYSB2b2Zmc2V0OwotCSAgZGVidWdfdHlwZSBjb250ZXh0OwotCSAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0JICBib29sZWFuIHZhcmFyZ3M7Ci0KLQkgIGlmIChsb29rX2FoZWFkX3R5cGUgIT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICB7Ci0JICAgICAgLyogZysrIHZlcnNpb24gMSBrbHVkZ2UgKi8KLQkgICAgICB0eXBlID0gbG9va19haGVhZF90eXBlOwotCSAgICAgIGxvb2tfYWhlYWRfdHlwZSA9IERFQlVHX1RZUEVfTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCi0JCQkJICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgICAgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmICgqKnBwICE9ICc6JykKLQkJewotCQkgIGJhZF9zdGFiIChvcmlnKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICArKypwcDsKLQkgIHAgPSBzdHJjaHIgKCpwcCwgJzsnKTsKLQkgIGlmIChwID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBiYWRfc3RhYiAob3JpZyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIHN0dWIgPSBmYWxzZTsKLQkgIGlmIChkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCB0eXBlKSA9PSBERUJVR19LSU5EX01FVEhPRAotCSAgICAgICYmIGRlYnVnX2dldF9wYXJhbWV0ZXJfdHlwZXMgKGRoYW5kbGUsIHR5cGUsICZ2YXJhcmdzKSA9PSBOVUxMKQotCSAgICBzdHViID0gdHJ1ZTsKLQotCSAgYXJndHlwZXMgPSBzYXZlc3RyaW5nICgqcHAsIHAgLSAqcHApOwotCSAgKnBwID0gcCArIDE7Ci0KLQkgIHN3aXRjaCAoKipwcCkKLQkgICAgewotCSAgICBjYXNlICcwJzoKLQkgICAgICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICcxJzoKLQkgICAgICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICArKypwcDsKLQotCSAgY29uc3RwID0gZmFsc2U7Ci0JICB2b2xhdGlsZXAgPSBmYWxzZTsKLQkgIHN3aXRjaCAoKipwcCkKLQkgICAgewotCSAgICBjYXNlICdBJzoKLQkgICAgICAvKiBOb3JtYWwgZnVuY3Rpb24uICAqLwotCSAgICAgICsrKnBwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdCJzoKLQkgICAgICAvKiBjb25zdCBtZW1iZXIgZnVuY3Rpb24uICAqLwotCSAgICAgIGNvbnN0cCA9IHRydWU7Ci0JICAgICAgKysqcHA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0MnOgotCSAgICAgIC8qIHZvbGF0aWxlIG1lbWJlciBmdW5jdGlvbi4gICovCi0JICAgICAgdm9sYXRpbGVwID0gdHJ1ZTsKLQkgICAgICArKypwcDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnRCc6Ci0JICAgICAgLyogY29uc3Qgdm9sYXRpbGUgbWVtYmVyIGZ1bmN0aW9uLiAgKi8KLQkgICAgICBjb25zdHAgPSB0cnVlOwotCSAgICAgIHZvbGF0aWxlcCA9IHRydWU7Ci0JICAgICAgKysqcHA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJyonOgotCSAgICBjYXNlICc/JzoKLQkgICAgY2FzZSAnLic6Ci0JICAgICAgLyogRmlsZSBjb21waWxlZCB3aXRoIGcrKyB2ZXJzaW9uIDE7IG5vIGluZm9ybWF0aW9uLiAgKi8KLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICB3YXJuX3N0YWIgKG9yaWcsIF8oImNvbnN0L3ZvbGF0aWxlIGluZGljYXRvciBtaXNzaW5nIikpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIHN0YXRpY3AgPSBmYWxzZTsKLQkgIHN3aXRjaCAoKipwcCkKLQkgICAgewotCSAgICBjYXNlICcqJzoKLQkgICAgICAvKiB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbiwgZm9sbG93ZWQgYnkgaW5kZXguICBUaGUgc2lnbgotCQkgYml0IGlzIHN1cHBvc2VkbHkgc2V0IHRvIGRpc3Rpbmd1aXNoCi0JCSBwb2ludGVycy10by1tZXRob2RzIGZyb20gdmlydHVhbCBmdW5jdGlvbiBpbmRpY2llcy4gICovCi0JICAgICAgKysqcHA7Ci0JICAgICAgdm9mZnNldCA9IHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotCSAgICAgIGlmICgqKnBwICE9ICc7JykKLQkJewotCQkgIGJhZF9zdGFiIChvcmlnKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICArKypwcDsKLQkgICAgICB2b2Zmc2V0ICY9IDB4N2ZmZmZmZmY7Ci0KLQkgICAgICBpZiAoKipwcCA9PSAnOycgfHwgKnBwID09ICdcMCcpCi0JCXsKLQkJICAvKiBNdXN0IGJlIGcrKyB2ZXJzaW9uIDEuICAqLwotCQkgIGNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBGaWd1cmUgb3V0IGZyb20gd2hlbmNlIHRoaXMgdmlydHVhbCBmdW5jdGlvbgotCQkgICAgIGNhbWUuICBJdCBtYXkgYmVsb25nIHRvIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgb2YKLQkJICAgICBvbmUgb2YgaXRzIGJhc2VjbGFzc2VzLiAgKi8KLQkJICAgIGxvb2tfYWhlYWRfdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywKLQkJCQkJCSAgICAgICAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkJICAgICAgIHBwLAotCQkJCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkJICAgIGlmICgqKnBwID09ICc6JykKLQkJICAgICAgewotCQkJLyogZysrIHZlcnNpb24gMSBvdmVybG9hZGVkIG1ldGhvZHMuICAqLwotCQkJY29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQljb250ZXh0ID0gbG9va19haGVhZF90eXBlOwotCQkJbG9va19haGVhZF90eXBlID0gREVCVUdfVFlQRV9OVUxMOwotCQkJaWYgKCoqcHAgIT0gJzsnKQotCQkJICB7Ci0JCQkgICAgYmFkX3N0YWIgKG9yaWcpOwotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCSAgfQotCQkJKysqcHA7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnPyc6Ci0JICAgICAgLyogc3RhdGljIG1lbWJlciBmdW5jdGlvbi4gICovCi0JICAgICAgKysqcHA7Ci0JICAgICAgc3RhdGljcCA9IHRydWU7Ci0JICAgICAgdm9mZnNldCA9IDA7Ci0JICAgICAgY29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKLQkgICAgICBpZiAoc3RybmNtcCAoYXJndHlwZXMsIG5hbWUsIHN0cmxlbiAobmFtZSkpICE9IDApCi0JCXN0dWIgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgd2Fybl9zdGFiIChvcmlnLCAibWVtYmVyIGZ1bmN0aW9uIHR5cGUgbWlzc2luZyIpOwotCSAgICAgIHZvZmZzZXQgPSAwOwotCSAgICAgIGNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnLic6Ci0JICAgICAgKysqcHA7Ci0JICAgICAgdm9mZnNldCA9IDA7Ci0JICAgICAgY29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBJZiB0aGUgdHlwZSBpcyBub3QgYSBzdHViLCB0aGVuIHRoZSBhcmd0eXBlcyBzdHJpbmcgaXMKLSAgICAgICAgICAgICB0aGUgcGh5c2ljYWwgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICBPdGhlcndpc2UgdGhlCi0gICAgICAgICAgICAgYXJndHlwZXMgc3RyaW5nIGlzIHRoZSBtYW5nbGVkIGZvcm0gb2YgdGhlIGFyZ3VtZW50Ci0gICAgICAgICAgICAgdHlwZXMsIGFuZCB0aGUgZnVsbCB0eXBlIGFuZCB0aGUgcGh5c2ljYWwgbmFtZSBtdXN0IGJlCi0gICAgICAgICAgICAgZXh0cmFjdGVkIGZyb20gdGhlbS4gICovCi0JICBpZiAoISBzdHViKQotCSAgICBwaHlzbmFtZSA9IGFyZ3R5cGVzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZGVidWdfdHlwZSBjbGFzc190eXBlLCByZXR1cm5fdHlwZTsKLQotCSAgICAgIGNsYXNzX3R5cGUgPSBzdGFiX2ZpbmRfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bXMpOwotCSAgICAgIGlmIChjbGFzc190eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJldHVybl90eXBlID0gZGVidWdfZ2V0X3JldHVybl90eXBlIChkaGFuZGxlLCB0eXBlKTsKLQkgICAgICBpZiAocmV0dXJuX3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCQl7Ci0JCSAgYmFkX3N0YWIgKG9yaWcpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIHR5cGUgPSBwYXJzZV9zdGFiX2FyZ3R5cGVzIChkaGFuZGxlLCBpbmZvLCBjbGFzc190eXBlLCBuYW1lLAotCQkJCQkgIHRhZ25hbWUsIHJldHVybl90eXBlLCBhcmd0eXBlcywKLQkJCQkJICBjb25zdHAsIHZvbGF0aWxlcCwgJnBoeXNuYW1lKTsKLQkgICAgICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoY3ZhcnMgKyAxID49IGFsbG9jdmFycykKLQkgICAgewotCSAgICAgIGFsbG9jdmFycyArPSAxMDsKLQkgICAgICB2YXJpYW50cyA9ICgoZGVidWdfbWV0aG9kX3ZhcmlhbnQgKikKLQkJCSAgeHJlYWxsb2MgKChQVFIpIHZhcmlhbnRzLAotCQkJCSAgICBhbGxvY3ZhcnMgKiBzaXplb2YgKnZhcmlhbnRzKSk7Ci0JICAgIH0KLQotCSAgaWYgKCEgc3RhdGljcCkKLQkgICAgdmFyaWFudHNbY3ZhcnNdID0gZGVidWdfbWFrZV9tZXRob2RfdmFyaWFudCAoZGhhbmRsZSwgcGh5c25hbWUsCi0JCQkJCQkJIHR5cGUsIHZpc2liaWxpdHksCi0JCQkJCQkJIGNvbnN0cCwgdm9sYXRpbGVwLAotCQkJCQkJCSB2b2Zmc2V0LCBjb250ZXh0KTsKLQkgIGVsc2UKLQkgICAgdmFyaWFudHNbY3ZhcnNdID0gZGVidWdfbWFrZV9zdGF0aWNfbWV0aG9kX3ZhcmlhbnQgKGRoYW5kbGUsCi0JCQkJCQkJCXBoeXNuYW1lLAotCQkJCQkJCQl0eXBlLAotCQkJCQkJCQl2aXNpYmlsaXR5LAotCQkJCQkJCQljb25zdHAsCi0JCQkJCQkJCXZvbGF0aWxlcCk7Ci0JICBpZiAodmFyaWFudHNbY3ZhcnNdID09IERFQlVHX01FVEhPRF9WQVJJQU5UX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgKytjdmFyczsKLQl9Ci0gICAgICB3aGlsZSAoKipwcCAhPSAnOycgJiYgKipwcCAhPSAnXDAnKTsKLQotICAgICAgdmFyaWFudHNbY3ZhcnNdID0gREVCVUdfTUVUSE9EX1ZBUklBTlRfTlVMTDsKLQotICAgICAgaWYgKCoqcHAgIT0gJ1wwJykKLQkrKypwcDsKLQotICAgICAgaWYgKGMgKyAxID49IGFsbG9jKQotCXsKLQkgIGFsbG9jICs9IDEwOwotCSAgbWV0aG9kcyA9ICgoZGVidWdfbWV0aG9kICopCi0JCSAgICAgeHJlYWxsb2MgKChQVFIpIG1ldGhvZHMsIGFsbG9jICogc2l6ZW9mICptZXRob2RzKSk7Ci0JfQotCi0gICAgICBtZXRob2RzW2NdID0gZGVidWdfbWFrZV9tZXRob2QgKGRoYW5kbGUsIG5hbWUsIHZhcmlhbnRzKTsKLQotICAgICAgKytjOwotICAgIH0KLQotICBpZiAobWV0aG9kcyAhPSBOVUxMKQotICAgIG1ldGhvZHNbY10gPSBERUJVR19NRVRIT0RfTlVMTDsKLQotICAqcmV0cCA9IG1ldGhvZHM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhcmd1bWVudCB0eXBlcyBmb3IgYSBtZXRob2QuICBTdGFicwotICAgdHJpZXMgdG8gc2F2ZSBzcGFjZSBieSBwYWNraW5nIGFyZ3VtZW50IHR5cGVzIGludG8gYSBtYW5nbGVkCi0gICBzdHJpbmcuICBUaGlzIHN0cmluZyBzaG91bGQgZ2l2ZSB1cyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZXh0cmFjdAotICAgYm90aCBhcmd1bWVudCB0eXBlcyBhbmQgdGhlIHBoeXNpY2FsIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLCBnaXZlbgotICAgdGhlIHRhZyBuYW1lLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXBhcnNlX3N0YWJfYXJndHlwZXMgKGRoYW5kbGUsIGluZm8sIGNsYXNzX3R5cGUsIGZpZWxkbmFtZSwgdGFnbmFtZSwKLQkJICAgICByZXR1cm5fdHlwZSwgYXJndHlwZXMsIGNvbnN0cCwgdm9sYXRpbGVwLCBwcGh5c25hbWUpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGRlYnVnX3R5cGUgY2xhc3NfdHlwZTsKLSAgICAgY29uc3QgY2hhciAqZmllbGRuYW1lOwotICAgICBjb25zdCBjaGFyICp0YWduYW1lOwotICAgICBkZWJ1Z190eXBlIHJldHVybl90eXBlOwotICAgICBjb25zdCBjaGFyICphcmd0eXBlczsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotICAgICBjb25zdCBjaGFyICoqcHBoeXNuYW1lOwotewotICBib29sZWFuIGlzX2Z1bGxfcGh5c25hbWVfY29uc3RydWN0b3I7Ci0gIGJvb2xlYW4gaXNfY29uc3RydWN0b3I7Ci0gIGJvb2xlYW4gaXNfZGVzdHJ1Y3RvcjsKLSAgZGVidWdfdHlwZSAqYXJnczsKLSAgYm9vbGVhbiB2YXJhcmdzOwotCi0gIC8qIENvbnN0cnVjdG9ycyBhcmUgc29tZXRpbWVzIGhhbmRsZWQgc3BlY2lhbGx5LiAgKi8KLSAgaXNfZnVsbF9waHlzbmFtZV9jb25zdHJ1Y3RvciA9ICgoYXJndHlwZXNbMF0gPT0gJ18nCi0JCQkJICAgJiYgYXJndHlwZXNbMV0gPT0gJ18nCi0JCQkJICAgJiYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBhcmd0eXBlc1syXSkKLQkJCQkgICAgICAgfHwgYXJndHlwZXNbMl0gPT0gJ1EnCi0JCQkJICAgICAgIHx8IGFyZ3R5cGVzWzJdID09ICd0JykpCi0JCQkJICB8fCBzdHJuY21wIChhcmd0eXBlcywgIl9fY3QiLCA0KSA9PSAwKTsKLQotICBpc19jb25zdHJ1Y3RvciA9IChpc19mdWxsX3BoeXNuYW1lX2NvbnN0cnVjdG9yCi0JCSAgICB8fCAodGFnbmFtZSAhPSBOVUxMCi0JCQkmJiBzdHJjbXAgKGZpZWxkbmFtZSwgdGFnbmFtZSkgPT0gMCkpOwotICBpc19kZXN0cnVjdG9yID0gKChhcmd0eXBlc1swXSA9PSAnXycKLQkJICAgICYmIChhcmd0eXBlc1sxXSA9PSAnJCcgfHwgYXJndHlwZXNbMV0gPT0gJy4nKQotCQkgICAgJiYgYXJndHlwZXNbMl0gPT0gJ18nKQotCQkgICB8fCBzdHJuY21wIChhcmd0eXBlcywgIl9fZHQiLCA0KSA9PSAwKTsKLQotICBpZiAoaXNfZGVzdHJ1Y3RvciB8fCBpc19mdWxsX3BoeXNuYW1lX2NvbnN0cnVjdG9yKQotICAgICpwcGh5c25hbWUgPSBhcmd0eXBlczsKLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBsZW47Ci0gICAgICBjb25zdCBjaGFyICpjb25zdF9wcmVmaXg7Ci0gICAgICBjb25zdCBjaGFyICp2b2xhdGlsZV9wcmVmaXg7Ci0gICAgICBjaGFyIGJ1ZlsyMF07Ci0gICAgICB1bnNpZ25lZCBpbnQgbWFuZ2xlZF9uYW1lX2xlbjsKLSAgICAgIGNoYXIgKnBoeXNuYW1lOwotCi0gICAgICBsZW4gPSB0YWduYW1lID09IE5VTEwgPyAwIDogc3RybGVuICh0YWduYW1lKTsKLSAgICAgIGNvbnN0X3ByZWZpeCA9IGNvbnN0cCA/ICJDIiA6ICIiOwotICAgICAgdm9sYXRpbGVfcHJlZml4ID0gdm9sYXRpbGVwID8gIlYiIDogIiI7Ci0KLSAgICAgIGlmIChsZW4gPT0gMCkKLQlzcHJpbnRmIChidWYsICJfXyVzJXMiLCBjb25zdF9wcmVmaXgsIHZvbGF0aWxlX3ByZWZpeCk7Ci0gICAgICBlbHNlIGlmICh0YWduYW1lICE9IE5VTEwgJiYgc3RyY2hyICh0YWduYW1lLCAnPCcpICE9IE5VTEwpCi0JewotCSAgLyogVGVtcGxhdGUgbWV0aG9kcyBhcmUgZnVsbHkgbWFuZ2xlZC4gICovCi0JICBzcHJpbnRmIChidWYsICJfXyVzJXMiLCBjb25zdF9wcmVmaXgsIHZvbGF0aWxlX3ByZWZpeCk7Ci0JICB0YWduYW1lID0gTlVMTDsKLQkgIGxlbiA9IDA7Ci0JfQotICAgICAgZWxzZQotCXNwcmludGYgKGJ1ZiwgIl9fJXMlcyVkIiwgY29uc3RfcHJlZml4LCB2b2xhdGlsZV9wcmVmaXgsIGxlbik7Ci0KLSAgICAgIG1hbmdsZWRfbmFtZV9sZW4gPSAoKGlzX2NvbnN0cnVjdG9yID8gMCA6IHN0cmxlbiAoZmllbGRuYW1lKSkKLQkJCSAgKyBzdHJsZW4gKGJ1ZikKLQkJCSAgKyBsZW4KLQkJCSAgKyBzdHJsZW4gKGFyZ3R5cGVzKQotCQkJICArIDEpOwotCi0gICAgICBpZiAoZmllbGRuYW1lWzBdID09ICdvJwotCSAgJiYgZmllbGRuYW1lWzFdID09ICdwJwotCSAgJiYgKGZpZWxkbmFtZVsyXSA9PSAnJCcgfHwgZmllbGRuYW1lWzJdID09ICcuJykpCi0JewotCSAgY29uc3QgY2hhciAqb3BuYW1lOwotCi0JICBvcG5hbWUgPSBjcGx1c19tYW5nbGVfb3BuYW1lIChmaWVsZG5hbWUgKyAzLCAwKTsKLQkgIGlmIChvcG5hbWUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiTm8gbWFuZ2xpbmcgZm9yIFwiJXNcIlxuIiksIGZpZWxkbmFtZSk7Ci0JICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgICAgfQotCSAgbWFuZ2xlZF9uYW1lX2xlbiArPSBzdHJsZW4gKG9wbmFtZSk7Ci0JICBwaHlzbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKG1hbmdsZWRfbmFtZV9sZW4pOwotCSAgc3RybmNweSAocGh5c25hbWUsIGZpZWxkbmFtZSwgMyk7Ci0JICBzdHJjcHkgKHBoeXNuYW1lICsgMywgb3BuYW1lKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcGh5c25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChtYW5nbGVkX25hbWVfbGVuKTsKLQkgIGlmIChpc19jb25zdHJ1Y3RvcikKLQkgICAgcGh5c25hbWVbMF0gPSAnXDAnOwotCSAgZWxzZQotCSAgICBzdHJjcHkgKHBoeXNuYW1lLCBmaWVsZG5hbWUpOwotCX0KLQotICAgICAgc3RyY2F0IChwaHlzbmFtZSwgYnVmKTsKLSAgICAgIGlmICh0YWduYW1lICE9IE5VTEwpCi0Jc3RyY2F0IChwaHlzbmFtZSwgdGFnbmFtZSk7Ci0gICAgICBzdHJjYXQgKHBoeXNuYW1lLCBhcmd0eXBlcyk7Ci0KLSAgICAgICpwcGh5c25hbWUgPSBwaHlzbmFtZTsKLSAgICB9Ci0KLSAgaWYgKCphcmd0eXBlcyA9PSAnXDAnIHx8IGlzX2Rlc3RydWN0b3IpCi0gICAgewotICAgICAgYXJncyA9IChkZWJ1Z190eXBlICopIHhtYWxsb2MgKHNpemVvZiAqYXJncyk7Ci0gICAgICAqYXJncyA9IE5VTEw7Ci0gICAgICByZXR1cm4gZGVidWdfbWFrZV9tZXRob2RfdHlwZSAoZGhhbmRsZSwgcmV0dXJuX3R5cGUsIGNsYXNzX3R5cGUsIGFyZ3MsCi0JCQkJICAgICBmYWxzZSk7Ci0gICAgfQotCi0gIGFyZ3MgPSBzdGFiX2RlbWFuZ2xlX2FyZ3R5cGVzIChkaGFuZGxlLCBpbmZvLCAqcHBoeXNuYW1lLCAmdmFyYXJncyk7Ci0gIGlmIChhcmdzID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICByZXR1cm4gZGVidWdfbWFrZV9tZXRob2RfdHlwZSAoZGhhbmRsZSwgcmV0dXJuX3R5cGUsIGNsYXNzX3R5cGUsIGFyZ3MsCi0JCQkJIHZhcmFyZ3MpOwotfQotCi0vKiBUaGUgdGFpbCBlbmQgb2Ygc3RhYnMgZm9yIEMrKyBjbGFzc2VzIHRoYXQgY29udGFpbiBhIHZpcnR1YWwgZnVuY3Rpb24KLSAgIHBvaW50ZXIgY29udGFpbnMgYSB0aWxkZSwgYSAlLCBhbmQgYSB0eXBlIG51bWJlci4KLSAgIFRoZSB0eXBlIG51bWJlciByZWZlcnMgdG8gdGhlIGJhc2UgY2xhc3MgKHBvc3NpYmx5IHRoaXMgY2xhc3MgaXRzZWxmKSB3aGljaAotICAgY29udGFpbnMgdGhlIHZ0YWJsZSBwb2ludGVyIGZvciB0aGUgY3VycmVudCBjbGFzcy4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBoYXZlIHBhcnNlZCBhbGwgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbnMsCi0gICBzbyB3ZSBjYW4gbG9vayBmb3IgdGhlIHZwdHIgYmFzZSBjbGFzcyBpbmZvLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX3N0YWJfdGlsZGVfZmllbGQgKGRoYW5kbGUsIGluZm8sIHBwLCB0eXBlbnVtcywgcmV0dnB0cmJhc2UsIHJldG93bnZwdHIpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgY29uc3QgaW50ICp0eXBlbnVtczsKLSAgICAgZGVidWdfdHlwZSAqcmV0dnB0cmJhc2U7Ci0gICAgIGJvb2xlYW4gKnJldG93bnZwdHI7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGNvbnN0IGNoYXIgKmhvbGQ7Ci0gIGludCB2dHlwZW51bXNbMl07Ci0KLSAgKnJldHZwdHJiYXNlID0gREVCVUdfVFlQRV9OVUxMOwotICAqcmV0b3dudnB0ciA9IGZhbHNlOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgLyogSWYgd2UgYXJlIHBvc2l0aW9uZWQgYXQgYSAnOycsIHRoZW4gc2tpcCBpdC4gKi8KLSAgaWYgKCoqcHAgPT0gJzsnKQotICAgICsrKnBwOwotCi0gIGlmICgqKnBwICE9ICd+JykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICArKypwcDsKLQotICBpZiAoKipwcCA9PSAnPScgfHwgKipwcCA9PSAnKycgfHwgKipwcCA9PSAnLScpCi0gICAgewotICAgICAgLyogT2Jzb2xldGUgZmxhZ3MgdGhhdCB1c2VkIHRvIGluZGljYXRlIHRoZSBwcmVzZW5jZSBvZgotCSBjb25zdHJ1Y3RvcnMgYW5kL29yIGRlc3RydWN0b3JzLiAqLwotICAgICAgKysqcHA7Ci0gICAgfQotCi0gIGlmICgqKnBwICE9ICclJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICArKypwcDsKLQotICBob2xkID0gKnBwOwotCi0gIC8qIFRoZSBuZXh0IG51bWJlciBpcyB0aGUgdHlwZSBudW1iZXIgb2YgdGhlIGJhc2UgY2xhc3MgKHBvc3NpYmx5Ci0gICAgIG91ciBvd24gY2xhc3MpIHdoaWNoIHN1cHBsaWVzIHRoZSB2dGFibGUgZm9yIHRoaXMgY2xhc3MuICAqLwotICBpZiAoISBwYXJzZV9zdGFiX3R5cGVfbnVtYmVyIChwcCwgdnR5cGVudW1zKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHZ0eXBlbnVtc1swXSA9PSB0eXBlbnVtc1swXQotICAgICAgJiYgdnR5cGVudW1zWzFdID09IHR5cGVudW1zWzFdKQotICAgICpyZXRvd252cHRyID0gdHJ1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGRlYnVnX3R5cGUgdnR5cGU7Ci0gICAgICBjb25zdCBjaGFyICpwOwotCi0gICAgICAqcHAgPSBob2xkOwotCi0gICAgICB2dHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgZm9yIChwID0gKnBwOyAqcCAhPSAnOycgJiYgKnAgIT0gJ1wwJzsgcCsrKQotCTsKLSAgICAgIGlmICgqcCAhPSAnOycpCi0JewotCSAgYmFkX3N0YWIgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgKnJldHZwdHJiYXNlID0gdnR5cGU7Ci0KLSAgICAgICpwcCA9IHAgKyAxOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsgICAgCi19Ci0KLS8qIFJlYWQgYSBkZWZpbml0aW9uIG9mIGFuIGFycmF5IHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2Vfc3RhYl9hcnJheV90eXBlIChkaGFuZGxlLCBpbmZvLCBwcCwgc3RyaW5ncCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBib29sZWFuIHN0cmluZ3A7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGludCB0eXBlbnVtc1syXTsKLSAgZGVidWdfdHlwZSBpbmRleF90eXBlOwotICBib29sZWFuIGFkanVzdGFibGU7Ci0gIGJmZF9zaWduZWRfdm1hIGxvd2VyLCB1cHBlcjsKLSAgZGVidWdfdHlwZSBlbGVtZW50X3R5cGU7Ci0KLSAgLyogRm9ybWF0IG9mIGFuIGFycmF5IHR5cGU6Ci0gICAgICJhcjxpbmRleCB0eXBlPjtsb3dlcjt1cHBlcjs8YXJyYXlfY29udGVudHNfdHlwZT4iLgotICAgICBPUzkwMDA6ICJhcmxvd2VyLHVwcGVyOzxhcnJheV9jb250ZW50c190eXBlPiIuCi0KLSAgICAgRm9ydHJhbiBhZGp1c3RhYmxlIGFycmF5cyB1c2UgQWRpZ2l0cyBvciBUZGlnaXRzIGZvciBsb3dlciBvciB1cHBlcjsKLSAgICAgZm9yIHRoZXNlLCBwcm9kdWNlIGEgdHlwZSBsaWtlIGZsb2F0W11bXS4gICovCi0KLSAgb3JpZyA9ICpwcDsKLQotICAvKiBGSVhNRTogZ2RiIGNoZWNrcyBvczlrX3N0YWJzIGhlcmUuICAqLwotCi0gIC8qIElmIHRoZSBpbmRleCB0eXBlIGlzIHR5cGUgMCwgd2UgdGFrZSBpdCBhcyBpbnQuICAqLwotICBwID0gKnBwOwotICBpZiAoISBwYXJzZV9zdGFiX3R5cGVfbnVtYmVyICgmcCwgdHlwZW51bXMpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHR5cGVudW1zWzBdID09IDAgJiYgdHlwZW51bXNbMV0gPT0gMCAmJiAqKnBwICE9ICc9JykKLSAgICB7Ci0gICAgICBpbmRleF90eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChkaGFuZGxlLCAiaW50Iik7Ci0gICAgICBpZiAoaW5kZXhfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JewotCSAgaW5kZXhfdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLQkgIGlmIChpbmRleF90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICpwcCA9IHA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5kZXhfdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCi0JCQkJICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICB9Ci0KLSAgaWYgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotICArKypwcDsKLQotICBhZGp1c3RhYmxlID0gZmFsc2U7Ci0KLSAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApICYmICoqcHAgIT0gJy0nKQotICAgIHsKLSAgICAgICsrKnBwOwotICAgICAgYWRqdXN0YWJsZSA9IHRydWU7Ci0gICAgfQotCi0gIGxvd2VyID0gKGJmZF9zaWduZWRfdm1hKSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgaWYgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSAmJiAqKnBwICE9ICctJykKLSAgICB7Ci0gICAgICArKypwcDsKLSAgICAgIGFkanVzdGFibGUgPSB0cnVlOwotICAgIH0KLQotICB1cHBlciA9IChiZmRfc2lnbmVkX3ZtYSkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICBlbGVtZW50X3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICBpZiAoZWxlbWVudF90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGFkanVzdGFibGUpCi0gICAgewotICAgICAgbG93ZXIgPSAwOwotICAgICAgdXBwZXIgPSAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfYXJyYXlfdHlwZSAoZGhhbmRsZSwgZWxlbWVudF90eXBlLCBpbmRleF90eXBlLCBsb3dlciwKLQkJCQl1cHBlciwgc3RyaW5ncCk7Ci19Ci0KLS8qIFRoaXMgc3RydWN0IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGZpbGVzIHdlIGhhdmUgc2VlbiB1c2luZwotICAgTl9CSU5DTC4gICovCi0KLXN0cnVjdCBiaW5jbF9maWxlCi17Ci0gIC8qIFRoZSBuZXh0IE5fQklOQ0wgZmlsZS4gICovCi0gIHN0cnVjdCBiaW5jbF9maWxlICpuZXh0OwotICAvKiBUaGUgbmV4dCBOX0JJTkNMIG9uIHRoZSBzdGFjay4gICovCi0gIHN0cnVjdCBiaW5jbF9maWxlICpuZXh0X3N0YWNrOwotICAvKiBUaGUgZmlsZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVGhlIGhhc2ggdmFsdWUuICAqLwotICBiZmRfdm1hIGhhc2g7Ci0gIC8qIFRoZSBmaWxlIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgaW50IGZpbGU7Ci0gIC8qIFRoZSBsaXN0IG9mIHR5cGVzIGRlZmluZWQgaW4gdGhpcyBmaWxlLiAgKi8KLSAgc3RydWN0IHN0YWJfdHlwZXMgKmZpbGVfdHlwZXM7Ci19OwotCi0vKiBTdGFydCBhIG5ldyBOX0JJTkNMIGZpbGUsIHB1c2hpbmcgaXQgb250byB0aGUgc3RhY2suICAqLwotCi1zdGF0aWMgdm9pZAotcHVzaF9iaW5jbCAoaW5mbywgbmFtZSwgaGFzaCkKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIGhhc2g7Ci17Ci0gIHN0cnVjdCBiaW5jbF9maWxlICpuOwotCi0gIG4gPSAoc3RydWN0IGJpbmNsX2ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLSAgbi0+bmV4dCA9IGluZm8tPmJpbmNsX2xpc3Q7Ci0gIG4tPm5leHRfc3RhY2sgPSBpbmZvLT5iaW5jbF9zdGFjazsKLSAgbi0+bmFtZSA9IG5hbWU7Ci0gIG4tPmhhc2ggPSBoYXNoOwotICBuLT5maWxlID0gaW5mby0+ZmlsZXM7Ci0gIG4tPmZpbGVfdHlwZXMgPSBOVUxMOwotICBpbmZvLT5iaW5jbF9saXN0ID0gbjsKLSAgaW5mby0+YmluY2xfc3RhY2sgPSBuOwotCi0gICsraW5mby0+ZmlsZXM7Ci0gIGluZm8tPmZpbGVfdHlwZXMgPSAoKHN0cnVjdCBzdGFiX3R5cGVzICoqKQotCQkgICAgICB4cmVhbGxvYyAoKFBUUikgaW5mby0+ZmlsZV90eXBlcywKLQkJCQkoaW5mby0+ZmlsZXMKLQkJCQkgKiBzaXplb2YgKmluZm8tPmZpbGVfdHlwZXMpKSk7Ci0gIGluZm8tPmZpbGVfdHlwZXNbbi0+ZmlsZV0gPSBOVUxMOwotfQotCi0vKiBGaW5pc2ggYW4gTl9CSU5DTCBmaWxlLCBhdCBhbiBOX0VJTkNMLCBwb3BwaW5nIHRoZSBuYW1lIG9mZiB0aGUKLSAgIHN0YWNrLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcG9wX2JpbmNsIChpbmZvKQotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci17Ci0gIHN0cnVjdCBiaW5jbF9maWxlICpvOwotCi0gIG8gPSBpbmZvLT5iaW5jbF9zdGFjazsKLSAgaWYgKG8gPT0gTlVMTCkKLSAgICByZXR1cm4gaW5mby0+bWFpbl9maWxlbmFtZTsKLSAgaW5mby0+YmluY2xfc3RhY2sgPSBvLT5uZXh0X3N0YWNrOwotCi0gIG8tPmZpbGVfdHlwZXMgPSBpbmZvLT5maWxlX3R5cGVzW28tPmZpbGVdOwotCi0gIGlmIChpbmZvLT5iaW5jbF9zdGFjayA9PSBOVUxMKQotICAgIHJldHVybiBpbmZvLT5tYWluX2ZpbGVuYW1lOwotICByZXR1cm4gaW5mby0+YmluY2xfc3RhY2stPm5hbWU7Ci19Ci0KLS8qIEhhbmRsZSBhbiBOX0VYQ0w6IGdldCB0aGUgdHlwZXMgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBOX0JJTkNMLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWZpbmRfZXhjbCAoaW5mbywgbmFtZSwgaGFzaCkKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIGhhc2g7Ci17Ci0gIHN0cnVjdCBiaW5jbF9maWxlICpsOwotCi0gICsraW5mby0+ZmlsZXM7Ci0gIGluZm8tPmZpbGVfdHlwZXMgPSAoKHN0cnVjdCBzdGFiX3R5cGVzICoqKQotCQkgICAgICB4cmVhbGxvYyAoKFBUUikgaW5mby0+ZmlsZV90eXBlcywKLQkJCQkoaW5mby0+ZmlsZXMKLQkJCQkgKiBzaXplb2YgKmluZm8tPmZpbGVfdHlwZXMpKSk7Ci0KLSAgZm9yIChsID0gaW5mby0+YmluY2xfbGlzdDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICBpZiAobC0+aGFzaCA9PSBoYXNoICYmIHN0cmNtcCAobC0+bmFtZSwgbmFtZSkgPT0gMCkKLSAgICAgIGJyZWFrOwotICBpZiAobCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHdhcm5fc3RhYiAobmFtZSwgXygiVW5kZWZpbmVkIE5fRVhDTCIpKTsKLSAgICAgIGluZm8tPmZpbGVfdHlwZXNbaW5mby0+ZmlsZXMgLSAxXSA9IE5VTEw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaW5mby0+ZmlsZV90eXBlc1tpbmZvLT5maWxlcyAtIDFdID0gbC0+ZmlsZV90eXBlczsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIGEgdmFyaWFibGUgZGVmaW5pdGlvbi4gIGdjYyBlbWl0cyB2YXJpYWJsZSBkZWZpbml0aW9ucyBmb3IgYQotICAgYmxvY2sgYmVmb3JlIHRoZSBOX0xCUkFDLCBzbyB3ZSBtdXN0IGhvbGQgb250byB0aGVtIHVudGlsIHdlIHNlZQotICAgaXQuICBUaGUgU3VuUFJPIGNvbXBpbGVyIGVtaXRzIHZhcmlhYmxlIGRlZmluaXRpb25zIGFmdGVyIHRoZQotICAgTl9MQlJBQywgc28gd2UgY2FuIGNhbGwgZGVidWdfcmVjb3JkX3ZhcmlhYmxlIGltbWVkaWF0ZWx5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCB0eXBlLCBraW5kLCB2YWwpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgZW51bSBkZWJ1Z192YXJfa2luZCBraW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IHN0YWJfcGVuZGluZ192YXIgKnY7Ci0KLSAgaWYgKChraW5kID09IERFQlVHX0dMT0JBTCB8fCBraW5kID09IERFQlVHX1NUQVRJQykKLSAgICAgIHx8ICEgaW5mby0+d2l0aGluX2Z1bmN0aW9uCi0gICAgICB8fCAoaW5mby0+Z2NjX2NvbXBpbGVkID09IDAgJiYgaW5mby0+bl9vcHRfZm91bmQpKQotICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIG5hbWUsIHR5cGUsIGtpbmQsIHZhbCk7Ci0KLSAgdiA9IChzdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhciAqKSB4bWFsbG9jIChzaXplb2YgKnYpOwotICBtZW1zZXQgKHYsIDAsIHNpemVvZiAqdik7Ci0KLSAgdi0+bmV4dCA9IGluZm8tPnBlbmRpbmc7Ci0gIHYtPm5hbWUgPSBuYW1lOwotICB2LT50eXBlID0gdHlwZTsKLSAgdi0+a2luZCA9IGtpbmQ7Ci0gIHYtPnZhbCA9IHZhbDsKLSAgaW5mby0+cGVuZGluZyA9IHY7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEVtaXQgcGVuZGluZyB2YXJpYWJsZSBkZWZpbml0aW9ucy4gIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHdlIHNlZSB0aGUKLSAgIE5fTEJSQUMgdGhhdCBzdGFydHMgdGhlIGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgKGRoYW5kbGUsIGluZm8pCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci17Ci0gIHN0cnVjdCBzdGFiX3BlbmRpbmdfdmFyICp2OwotCi0gIHYgPSBpbmZvLT5wZW5kaW5nOwotICB3aGlsZSAodiAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBzdGFiX3BlbmRpbmdfdmFyICpuZXh0OwotCi0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIHYtPm5hbWUsIHYtPnR5cGUsIHYtPmtpbmQsIHYtPnZhbCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBuZXh0ID0gdi0+bmV4dDsKLSAgICAgIGZyZWUgKHYpOwotICAgICAgdiA9IG5leHQ7Ci0gICAgfQotCi0gIGluZm8tPnBlbmRpbmcgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5kIHRoZSBzbG90IGZvciBhIHR5cGUgaW4gdGhlIGRhdGFiYXNlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUgKgotc3RhYl9maW5kX3Nsb3QgKGluZm8sIHR5cGVudW1zKQotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGludCAqdHlwZW51bXM7Ci17Ci0gIGludCBmaWxlbnVtOwotICBpbnQgaW5kZXg7Ci0gIHN0cnVjdCBzdGFiX3R5cGVzICoqcHM7Ci0KLSAgZmlsZW51bSA9IHR5cGVudW1zWzBdOwotICBpbmRleCA9IHR5cGVudW1zWzFdOwotCi0gIGlmIChmaWxlbnVtIDwgMCB8fCAodW5zaWduZWQgaW50KSBmaWxlbnVtID49IGluZm8tPmZpbGVzKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVHlwZSBmaWxlIG51bWJlciAlZCBvdXQgb2YgcmFuZ2VcbiIpLCBmaWxlbnVtKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgaWYgKGluZGV4IDwgMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlR5cGUgaW5kZXggbnVtYmVyICVkIG91dCBvZiByYW5nZVxuIiksIGluZGV4KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBwcyA9IGluZm8tPmZpbGVfdHlwZXMgKyBmaWxlbnVtOwotCi0gIHdoaWxlIChpbmRleCA+PSBTVEFCX1RZUEVTX1NMT1RTKQotICAgIHsKLSAgICAgIGlmICgqcHMgPT0gTlVMTCkKLQl7Ci0JICAqcHMgPSAoc3RydWN0IHN0YWJfdHlwZXMgKikgeG1hbGxvYyAoc2l6ZW9mICoqcHMpOwotCSAgbWVtc2V0ICgqcHMsIDAsIHNpemVvZiAqKnBzKTsKLQl9Ci0gICAgICBwcyA9ICYoKnBzKS0+bmV4dDsKLSAgICAgIGluZGV4IC09IFNUQUJfVFlQRVNfU0xPVFM7Ci0gICAgfQotICBpZiAoKnBzID09IE5VTEwpCi0gICAgewotICAgICAgKnBzID0gKHN0cnVjdCBzdGFiX3R5cGVzICopIHhtYWxsb2MgKHNpemVvZiAqKnBzKTsKLSAgICAgIG1lbXNldCAoKnBzLCAwLCBzaXplb2YgKipwcyk7Ci0gICAgfQotCi0gIHJldHVybiAoKnBzKS0+dHlwZXMgKyBpbmRleDsKLX0KLQotLyogRmluZCBhIHR5cGUgZ2l2ZW4gYSB0eXBlIG51bWJlci4gIElmIHRoZSB0eXBlIGhhcyBub3QgYmVlbgotICAgYWxsb2NhdGVkIHlldCwgY3JlYXRlIGFuIGluZGlyZWN0IHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotc3RhYl9maW5kX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW1zKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBpbnQgKnR5cGVudW1zOwotewotICBkZWJ1Z190eXBlICpzbG90OwotCi0gIGlmICh0eXBlbnVtc1swXSA9PSAwICYmIHR5cGVudW1zWzFdIDwgMCkKLSAgICB7Ci0gICAgICAvKiBBIG5lZ2F0aXZlIHR5cGUgbnVtYmVyIGluZGljYXRlcyBhbiBYQ09GRiBidWlsdGluIHR5cGUuICAqLwotICAgICAgcmV0dXJuIHN0YWJfeGNvZmZfYnVpbHRpbl90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtc1sxXSk7Ci0gICAgfQotCi0gIHNsb3QgPSBzdGFiX2ZpbmRfc2xvdCAoaW5mbywgdHlwZW51bXMpOwotICBpZiAoc2xvdCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgaWYgKCpzbG90ID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlIChkaGFuZGxlLCBzbG90LCAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQotICByZXR1cm4gKnNsb3Q7Ci19Ci0KLS8qIFJlY29yZCB0aGF0IGEgZ2l2ZW4gdHlwZSBudW1iZXIgcmVmZXJzIHRvIGEgZ2l2ZW4gdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3JlY29yZF90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtcywgdHlwZSkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgaW50ICp0eXBlbnVtczsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBkZWJ1Z190eXBlICpzbG90OwotCi0gIHNsb3QgPSBzdGFiX2ZpbmRfc2xvdCAoaW5mbywgdHlwZW51bXMpOwotICBpZiAoc2xvdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBnZGIgYXBwZWFycyB0byBpZ25vcmUgdHlwZSByZWRlZmluaXRpb25zLCBzbyB3ZSBkbyBhcyB3ZWxsLiAgKi8KLQotICAqc2xvdCA9IHR5cGU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiBhbiBYQ09GRiBidWlsdGluIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotc3RhYl94Y29mZl9idWlsdGluX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW0pCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGludCB0eXBlbnVtOwotewotICBkZWJ1Z190eXBlIHJldHR5cGU7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgaWYgKHR5cGVudW0gPj0gMCB8fCB0eXBlbnVtIDwgLVhDT0ZGX1RZUEVfQ09VTlQpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgWENPRkYgdHlwZSAlZFxuIiksIHR5cGVudW0pOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0gIGlmIChpbmZvLT54Y29mZl90eXBlc1stdHlwZW51bV0gIT0gTlVMTCkKLSAgICByZXR1cm4gaW5mby0+eGNvZmZfdHlwZXNbLXR5cGVudW1dOwotCi0gIHN3aXRjaCAoLXR5cGVudW0pCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIC8qIFRoZSBzaXplIG9mIHRoaXMgYW5kIGFsbCB0aGUgb3RoZXIgdHlwZXMgYXJlIGZpeGVkLCBkZWZpbmVkCi0JIGJ5IHRoZSBkZWJ1Z2dpbmcgZm9ybWF0LiAgKi8KLSAgICAgIG5hbWUgPSAiaW50IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBuYW1lID0gImNoYXIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIG5hbWUgPSAic2hvcnQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIG5hbWUgPSAibG9uZyI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBjaGFyIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCB0cnVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgIG5hbWUgPSAic2lnbmVkIGNoYXIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNzoKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgc2hvcnQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIHRydWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBpbnQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5OgotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0gICAgY2FzZSAxMDoKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgbG9uZyI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDExOgotICAgICAgbmFtZSA9ICJ2b2lkIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEyOgotICAgICAgLyogSUVFRSBzaW5nbGUgcHJlY2lzaW9uICgzMiBiaXQpLiAgKi8KLSAgICAgIG5hbWUgPSAiZmxvYXQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEzOgotICAgICAgLyogSUVFRSBkb3VibGUgcHJlY2lzaW9uICg2NCBiaXQpLiAgKi8KLSAgICAgIG5hbWUgPSAiZG91YmxlIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNDoKLSAgICAgIC8qIFRoaXMgaXMgYW4gSUVFRSBkb3VibGUgb24gdGhlIFJTLzYwMDAsIGFuZCBkaWZmZXJlbnQgbWFjaGluZXMKLQkgd2l0aCBkaWZmZXJlbnQgc2l6ZXMgZm9yICJsb25nIGRvdWJsZSIgc2hvdWxkIHVzZSBkaWZmZXJlbnQKLQkgbmVnYXRpdmUgdHlwZSBudW1iZXJzLiAgU2VlIHN0YWJzLnRleGluZm8uICAqLwotICAgICAgbmFtZSA9ICJsb25nIGRvdWJsZSI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTU6Ci0gICAgICBuYW1lID0gImludGVnZXIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBuYW1lID0gImJvb2xlYW4iOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfYm9vbF90eXBlIChkaGFuZGxlLCA0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTc6Ci0gICAgICBuYW1lID0gInNob3J0IHJlYWwiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE4OgotICAgICAgbmFtZSA9ICJyZWFsIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOToKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBuYW1lID0gInN0cmluZ3B0ciI7Ci0gICAgICByZXR0eXBlID0gTlVMTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjA6Ci0gICAgICAvKiBGSVhNRSAqLwotICAgICAgbmFtZSA9ICJjaGFyYWN0ZXIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIHRydWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMToKLSAgICAgIG5hbWUgPSAibG9naWNhbCoxIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Jvb2xfdHlwZSAoZGhhbmRsZSwgMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDIyOgotICAgICAgbmFtZSA9ICJsb2dpY2FsKjIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfYm9vbF90eXBlIChkaGFuZGxlLCAyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjM6Ci0gICAgICBuYW1lID0gImxvZ2ljYWwqNCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKGRoYW5kbGUsIDQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIG5hbWUgPSAibG9naWNhbCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKGRoYW5kbGUsIDQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNToKLSAgICAgIC8qIENvbXBsZXggdHlwZSBjb25zaXN0aW5nIG9mIHR3byBJRUVFIHNpbmdsZSBwcmVjaXNpb24gdmFsdWVzLiAgKi8KLSAgICAgIG5hbWUgPSAiY29tcGxleCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9jb21wbGV4X3R5cGUgKGRoYW5kbGUsIDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNjoKLSAgICAgIC8qIENvbXBsZXggdHlwZSBjb25zaXN0aW5nIG9mIHR3byBJRUVFIGRvdWJsZSBwcmVjaXNpb24gdmFsdWVzLiAgKi8KLSAgICAgIG5hbWUgPSAiZG91YmxlIGNvbXBsZXgiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfY29tcGxleF90eXBlIChkaGFuZGxlLCAxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI3OgotICAgICAgbmFtZSA9ICJpbnRlZ2VyKjEiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjg6Ci0gICAgICBuYW1lID0gImludGVnZXIqMiI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOToKLSAgICAgIG5hbWUgPSAiaW50ZWdlcio0IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMwOgotICAgICAgLyogRklYTUUgKi8KLSAgICAgIG5hbWUgPSAid2NoYXIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzE6Ci0gICAgICBuYW1lID0gImxvbmcgbG9uZyI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgbG9uZyBsb25nIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCB0cnVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzM6Ci0gICAgICBuYW1lID0gImxvZ2ljYWwqOCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKGRoYW5kbGUsIDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzNDoKLSAgICAgIG5hbWUgPSAiaW50ZWdlcio4IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHR5cGUgPSBkZWJ1Z19uYW1lX3R5cGUgKGRoYW5kbGUsIG5hbWUsIHJldHR5cGUpOwotCi0gIGluZm8tPnhjb2ZmX3R5cGVzWy10eXBlbnVtXSA9IHJldHR5cGU7Ci0KLSAgcmV0dXJuIHJldHR5cGU7Ci19Ci0KLS8qIEZpbmQgb3IgY3JlYXRlIGEgdGFnZ2VkIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotc3RhYl9maW5kX3RhZ2dlZF90eXBlIChkaGFuZGxlLCBpbmZvLCBwLCBsZW4sIGtpbmQpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgIGludCBsZW47Ci0gICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGRlYnVnX3R5cGUgZHR5cGU7Ci0gIHN0cnVjdCBzdGFiX3RhZyAqc3Q7Ci0KLSAgbmFtZSA9IHNhdmVzdHJpbmcgKHAsIGxlbik7Ci0KLSAgLyogV2UgcGFzcyBERUJVR19LSU5EX0lMTEVHQUwgYmVjYXVzZSB3ZSB3YW50IGFsbCB0YWdzIGluIHRoZSBzYW1lCi0gICAgIG5hbWVzcGFjZS4gIFRoaXMgaXMgcmlnaHQgZm9yIEMsIGFuZCBJIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZQotICAgICBvdGhlciBsYW5ndWFnZXMuICBGSVhNRS4gICovCi0gIGR0eXBlID0gZGVidWdfZmluZF90YWdnZWRfdHlwZSAoZGhhbmRsZSwgbmFtZSwgREVCVUdfS0lORF9JTExFR0FMKTsKLSAgaWYgKGR0eXBlICE9IERFQlVHX1RZUEVfTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChuYW1lKTsKLSAgICAgIHJldHVybiBkdHlwZTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBlbnRyeSBvbiB0aGUgdW5kZWZpbmVkIHRhZyBsaXN0LiAgKi8KLSAgZm9yIChzdCA9IGluZm8tPnRhZ3M7IHN0ICE9IE5VTEw7IHN0ID0gc3QtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0LT5uYW1lWzBdID09IG5hbWVbMF0KLQkgICYmIHN0cmNtcCAoc3QtPm5hbWUsIG5hbWUpID09IDApCi0JewotCSAgaWYgKHN0LT5raW5kID09IERFQlVHX0tJTkRfSUxMRUdBTCkKLQkgICAgc3QtPmtpbmQgPSBraW5kOwotCSAgZnJlZSAobmFtZSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBpZiAoc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdCA9IChzdHJ1Y3Qgc3RhYl90YWcgKikgeG1hbGxvYyAoc2l6ZW9mICpzdCk7Ci0gICAgICBtZW1zZXQgKHN0LCAwLCBzaXplb2YgKnN0KTsKLQotICAgICAgc3QtPm5leHQgPSBpbmZvLT50YWdzOwotICAgICAgc3QtPm5hbWUgPSBuYW1lOwotICAgICAgc3QtPmtpbmQgPSBraW5kOwotICAgICAgc3QtPnNsb3QgPSBERUJVR19UWVBFX05VTEw7Ci0gICAgICBzdC0+dHlwZSA9IGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgJnN0LT5zbG90LCBuYW1lKTsKLSAgICAgIGluZm8tPnRhZ3MgPSBzdDsKLSAgICB9Ci0KLSAgcmV0dXJuIHN0LT50eXBlOwotfQotDAotLyogSW4gb3JkZXIgdG8gZ2V0IHRoZSBjb3JyZWN0IGFyZ3VtZW50IHR5cGVzIGZvciBhIHN0dWJiZWQgbWV0aG9kLCB3ZQotICAgbmVlZCB0byBleHRyYWN0IHRoZSBhcmd1bWVudCB0eXBlcyBmcm9tIGEgQysrIG1hbmdsZWQgc3RyaW5nLgotICAgU2luY2UgdGhlIGFyZ3VtZW50IHR5cGVzIGNhbiByZWZlciBiYWNrIHRvIHRoZSByZXR1cm4gdHlwZSwgdGhpcwotICAgbWVhbnMgdGhhdCB3ZSBtdXN0IGRlbWFuZ2xlIHRoZSBlbnRpcmUgcGh5c2ljYWwgbmFtZS4gIEluIGdkYiB0aGlzCi0gICBpcyBkb25lIGJ5IGNhbGxpbmcgY3BsdXNfZGVtYW5nbGUgYW5kIHJ1bm5pbmcgdGhlIHJlc3VsdHMgYmFjawotICAgdGhyb3VnaCB0aGUgQysrIGV4cHJlc3Npb24gcGFyc2VyLiAgU2luY2Ugd2UgaGF2ZSBubyBleHByZXNzaW9uCi0gICBwYXJzZXIsIHdlIG11c3QgZHVwbGljYXRlIG11Y2ggb2YgdGhlIHdvcmsgb2YgY3BsdXNfZGVtYW5nbGUgaGVyZS4KLQotICAgV2UgYXNzdW1lIHRoYXQgR05VIHN0eWxlIGRlbWFuZ2xpbmcgaXMgdXNlZCwgc2luY2UgdGhpcyBpcyBvbmx5Ci0gICBkb25lIGZvciBtZXRob2Qgc3R1YnMsIGFuZCBvbmx5IGcrKyBzaG91bGQgb3V0cHV0IHRoYXQgZm9ybSBvZgotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIGEgcG9pbnRlciB0byB0eXBlIGluZm9ybWF0aW9uIHdoaWNoCi0gICBkZW1hbmdsaW5nIGEgc3RyaW5nLiAgKi8KLQotc3RydWN0IHN0YWJfZGVtYW5nbGVfdHlwZXN0cmluZwotewotICAvKiBUaGUgc3RhcnQgb2YgdGhlIHR5cGUuICBUaGlzIGlzIG5vdCBudWxsIHRlcm1pbmF0ZWQuICAqLwotICBjb25zdCBjaGFyICp0eXBlc3RyaW5nOwotICAvKiBUaGUgbGVuZ3RoIG9mIHRoZSB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IGxlbjsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiB3aGlsZSBkZW1hbmdsaW5nIGEKLSAgIHN0cmluZy4gICovCi0KLXN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8KLXsKLSAgLyogVGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBoYW5kbGUuICAqLwotICBQVFIgZGhhbmRsZTsKLSAgLyogVGhlIHN0YWIgaW5mb3JtYXRpb24gaGFuZGxlLiAgKi8KLSAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAvKiBUaGUgYXJyYXkgb2YgYXJndW1lbnRzIHdlIGFyZSBidWlsZGluZy4gICovCi0gIGRlYnVnX3R5cGUgKmFyZ3M7Ci0gIC8qIFdoZXRoZXIgdGhlIG1ldGhvZCB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuICAqLwotICBib29sZWFuIHZhcmFyZ3M7Ci0gIC8qIFRoZSBhcnJheSBvZiB0eXBlcyB3ZSBoYXZlIHJlbWVtYmVyZWQuICAqLwotICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV90eXBlc3RyaW5nICp0eXBlc3RyaW5nczsKLSAgLyogVGhlIG51bWJlciBvZiB0eXBlc3RyaW5ncy4gICovCi0gIHVuc2lnbmVkIGludCB0eXBlc3RyaW5nX2NvdW50OwotICAvKiBUaGUgbnVtYmVyIG9mIHR5cGVzdHJpbmcgc2xvdHMgd2UgaGF2ZSBhbGxvY2F0ZWQuICAqLwotICB1bnNpZ25lZCBpbnQgdHlwZXN0cmluZ19hbGxvYzsKLX07Ci0KLXN0YXRpYyB2b2lkIHN0YWJfYmFkX2RlbWFuZ2xlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBzdGFiX2RlbWFuZ2xlX2NvdW50IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfZ2V0X2NvdW50Ci0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX3ByZWZpeAotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfZnVuY3Rpb25fbmFtZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9zaWduYXR1cmUKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX3F1YWxpZmllZAotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGRlYnVnX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfY2xhc3MKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX2FyZ3MKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z190eXBlICoqLAotCSAgIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9hcmcKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z190eXBlICoqLAotCSAgIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqKiwgZGVidWdfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX2Z1bmRfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGRlYnVnX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9yZW1lbWJlcl90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLQotLyogV2FybiBhYm91dCBhIGJhZCBkZW1hbmdsaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLXN0YWJfYmFkX2RlbWFuZ2xlIChzKQotICAgICBjb25zdCBjaGFyICpzOwotewotICBmcHJpbnRmIChzdGRlcnIsIF8oImJhZCBtYW5nbGVkIG5hbWUgYCVzJ1xuIiksIHMpOwotfQotCi0vKiBHZXQgYSBjb3VudCBmcm9tIGEgc3RhYiBzdHJpbmcuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1zdGFiX2RlbWFuZ2xlX2NvdW50IChwcCkKLSAgICAgY29uc3QgY2hhciAqKnBwOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgY291bnQgPSAwOwotICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotICAgIHsKLSAgICAgIGNvdW50ICo9IDEwOwotICAgICAgY291bnQgKz0gKipwcCAtICcwJzsKLSAgICAgICsrKnBwOwotICAgIH0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKiBSZXF1aXJlIGEgY291bnQgaW4gYSBzdHJpbmcuICBUaGUgY291bnQgbWF5IGJlIG11bHRpcGxlIGRpZ2l0cywgaW4KLSAgIHdoaWNoIGNhc2UgaXQgbXVzdCBlbmQgaW4gYW4gdW5kZXJzY29yZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX2dldF9jb3VudCAocHAsIHBpKQotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIHVuc2lnbmVkIGludCAqcGk7Ci17Ci0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKnBpID0gKipwcCAtICcwJzsKLSAgKysqcHA7Ci0gIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGNvdW50OwotICAgICAgY29uc3QgY2hhciAqcDsKLQotICAgICAgY291bnQgPSAqcGk7Ci0gICAgICBwID0gKnBwOwotICAgICAgZG8KLQl7Ci0JICBjb3VudCAqPSAxMDsKLQkgIGNvdW50ICs9ICpwIC0gJzAnOwotCSAgKytwOwotCX0KLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApKTsKLSAgICAgIGlmICgqcCA9PSAnXycpCi0JewotCSAgKnBwID0gcCArIDE7Ci0JICAqcGkgPSBjb3VudDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGRlbWFuZ2xlcyBhIHBoeXNpY2FsIG5hbWUsIHJldHVybmluZyBhIE5VTEwKLSAgIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYXJndW1lbnQgdHlwZXMuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZSAqCi1zdGFiX2RlbWFuZ2xlX2FyZ3R5cGVzIChkaGFuZGxlLCBpbmZvLCBwaHlzbmFtZSwgcHZhcmFyZ3MpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBib29sZWFuICpwdmFyYXJnczsKLXsKLSAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyBtaW5mbzsKLQotICBtaW5mby5kaGFuZGxlID0gZGhhbmRsZTsKLSAgbWluZm8uaW5mbyA9IGluZm87Ci0gIG1pbmZvLmFyZ3MgPSBOVUxMOwotICBtaW5mby52YXJhcmdzID0gZmFsc2U7Ci0gIG1pbmZvLnR5cGVzdHJpbmdfYWxsb2MgPSAxMDsKLSAgbWluZm8udHlwZXN0cmluZ3MgPSAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX3R5cGVzdHJpbmcgKikKLQkJICAgICAgIHhtYWxsb2MgKG1pbmZvLnR5cGVzdHJpbmdfYWxsb2MKLQkJCQkqIHNpemVvZiAqbWluZm8udHlwZXN0cmluZ3MpKTsKLSAgbWluZm8udHlwZXN0cmluZ19jb3VudCA9IDA7Ci0KLSAgLyogY3BsdXNfZGVtYW5nbGUgY2hlY2tzIGZvciBzcGVjaWFsIEdOVSBtYW5nbGVkIGZvcm1zLCBidXQgd2UgY2FuJ3QKLSAgICAgc2VlIGFueSBvZiB0aGVtIGluIG1hbmdsZWQgbWV0aG9kIGFyZ3VtZW50IHR5cGVzLiAgKi8KLQotICBpZiAoISBzdGFiX2RlbWFuZ2xlX3ByZWZpeCAoJm1pbmZvLCAmcGh5c25hbWUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICgqcGh5c25hbWUgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX3NpZ25hdHVyZSAoJm1pbmZvLCAmcGh5c25hbWUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBmcmVlIChtaW5mby50eXBlc3RyaW5ncyk7Ci0gIG1pbmZvLnR5cGVzdHJpbmdzID0gTlVMTDsKLQotICBpZiAobWluZm8uYXJncyA9PSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwgXygibm8gYXJndW1lbnQgdHlwZXMgaW4gbWFuZ2xlZCBzdHJpbmdcbiIpKTsKLQotICAqcHZhcmFyZ3MgPSBtaW5mby52YXJhcmdzOwotICByZXR1cm4gbWluZm8uYXJnczsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKG1pbmZvLnR5cGVzdHJpbmdzICE9IE5VTEwpCi0gICAgZnJlZSAobWluZm8udHlwZXN0cmluZ3MpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRGVtYW5nbGUgdGhlIHByZWZpeCBvZiB0aGUgbWFuZ2xlZCBuYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfcHJlZml4IChtaW5mbywgcHApCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci17Ci0gIGNvbnN0IGNoYXIgKnNjYW47Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIGNwbHVzX2RlbWFuZ2xlIGNoZWNrcyBmb3IgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMsCi0gICAgIGJ1dCB3ZSBjYW4ndCBzZWUgdGhlbSBpbiBtYW5nbGVkIGFyZ3VtZW50IHR5cGVzLiAgKi8KLQotICAvKiBMb29rIGZvciBgX18nLiAgKi8KLSAgc2NhbiA9ICpwcDsKLSAgZG8KLSAgICB7Ci0gICAgICBzY2FuID0gc3RyY2hyIChzY2FuLCAnXycpOwotICAgIH0KLSAgd2hpbGUgKHNjYW4gIT0gTlVMTCAmJiAqKytzY2FuICE9ICdfJyk7Ci0KLSAgaWYgKHNjYW4gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdGFiX2JhZF9kZW1hbmdsZSAoKnBwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLS1zY2FuOwotCi0gIC8qIFdlIGZvdW5kIGBfXyc7IG1vdmUgYWhlYWQgdG8gdGhlIGxhc3QgY29udGlndW91cyBgX18nIHBhaXIuICAqLwotICBpID0gc3Ryc3BuIChzY2FuLCAiXyIpOwotICBpZiAoaSA+IDIpCi0gICAgc2NhbiArPSBpIC0gMjsKLQotICBpZiAoc2NhbiA9PSAqcHAKLSAgICAgICYmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc2NhblsyXSkKLQkgIHx8IHNjYW5bMl0gPT0gJ1EnCi0JICB8fCBzY2FuWzJdID09ICd0JykpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIEdOVSBzdHlsZSBjb25zdHJ1Y3RvciBuYW1lLiAgKi8KLSAgICAgICpwcCA9IHNjYW4gKyAyOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlIGlmIChzY2FuID09ICpwcAotCSAgICYmICEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIHNjYW5bMl0pCi0JICAgJiYgc2NhblsyXSAhPSAndCcpCi0gICAgewotICAgICAgLyogTG9vayBmb3IgdGhlIGBfXycgdGhhdCBzZXBhcmF0ZXMgdGhlIHByZWZpeCBmcm9tIHRoZQotICAgICAgICAgc2lnbmF0dXJlLiAgKi8KLSAgICAgIHdoaWxlICgqc2NhbiA9PSAnXycpCi0JKytzY2FuOwotICAgICAgc2NhbiA9IHN0cnN0ciAoc2NhbiwgIl9fIik7Ci0gICAgICBpZiAoc2NhbiA9PSBOVUxMIHx8IHNjYW5bMl0gPT0gJ1wwJykKLQl7Ci0JICBzdGFiX2JhZF9kZW1hbmdsZSAoKnBwKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHJldHVybiBzdGFiX2RlbWFuZ2xlX2Z1bmN0aW9uX25hbWUgKG1pbmZvLCBwcCwgc2Nhbik7Ci0gICAgfQotICBlbHNlIGlmIChzY2FuWzJdICE9ICdcMCcpCi0gICAgewotICAgICAgLyogVGhlIG5hbWUgZG9lc24ndCBzdGFydCB3aXRoIGBfXycsIGJ1dCBpdCBkb2VzIGNvbnRhaW4gYF9fJy4gICovCi0gICAgICByZXR1cm4gc3RhYl9kZW1hbmdsZV9mdW5jdGlvbl9uYW1lIChtaW5mbywgcHAsIHNjYW4pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlICgqcHApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogRGVtYW5nbGUgYSBmdW5jdGlvbiBuYW1lIHByZWZpeC4gIFRoZSBzY2FuIGFyZ3VtZW50IHBvaW50cyB0byB0aGUKLSAgIGRvdWJsZSB1bmRlcnNjb3JlIHdoaWNoIHNlcGFyYXRlcyB0aGUgZnVuY3Rpb24gbmFtZSBmcm9tIHRoZQotICAgc2lnbmF0dXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSAobWluZm8sIHBwLCBzY2FuKQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBjb25zdCBjaGFyICpzY2FuOwotewotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBzdHJpbmcgZnJvbSAqcHAgdG8gc2NhbiBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICBXZQotICAgICBkb24ndCBjYXJlIGFib3V0IHRoZSBuYW1lLCBzaW5jZSB3ZSBqdXN0IGxvb2tpbmcgZm9yIGFyZ3VtZW50Ci0gICAgIHR5cGVzLiAgSG93ZXZlciwgZm9yIGNvbnZlcnNpb24gb3BlcmF0b3JzLCB0aGUgbmFtZSBtYXkgaW5jbHVkZSBhCi0gICAgIHR5cGUgd2hpY2ggd2UgbXVzdCByZW1lbWJlciBpbiBvcmRlciB0byBoYW5kbGUgYmFja3JlZmVyZW5jZXMuICAqLwotCi0gIG5hbWUgPSAqcHA7Ci0gICpwcCA9IHNjYW4gKyAyOwotCi0gIGlmICgqcHAgLSBuYW1lID49IDUKLQkgICAmJiBzdHJuY21wIChuYW1lLCAidHlwZSIsIDQpID09IDAKLQkgICAmJiAobmFtZVs0XSA9PSAnJCcgfHwgbmFtZVs0XSA9PSAnLicpKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnRlbTsKLQotICAgICAgLyogVGhpcyBpcyBhIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvci4gICovCi0gICAgICB0ZW0gPSBuYW1lICsgNTsKLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sICZ0ZW0sIChkZWJ1Z190eXBlICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKG5hbWVbMF0gPT0gJ18nCi0JICAgJiYgbmFtZVsxXSA9PSAnXycKLQkgICAmJiBuYW1lWzJdID09ICdvJwotCSAgICYmIG5hbWVbM10gPT0gJ3AnKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnRlbTsKLQotICAgICAgLyogVGhpcyBpcyBhIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvci4gICovCi0gICAgICB0ZW0gPSBuYW1lICsgNDsKLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sICZ0ZW0sIChkZWJ1Z190eXBlICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlbWFuZ2xlIHRoZSBzaWduYXR1cmUuICBUaGlzIGlzIHdoZXJlIHRoZSBhcmd1bWVudCB0eXBlcyBhcmUKLSAgIGZvdW5kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfc2lnbmF0dXJlIChtaW5mbywgcHApCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGJvb2xlYW4gZXhwZWN0X2Z1bmMsIGZ1bmNfZG9uZTsKLSAgY29uc3QgY2hhciAqaG9sZDsKLQotICBvcmlnID0gKnBwOwotCi0gIGV4cGVjdF9mdW5jID0gZmFsc2U7Ci0gIGZ1bmNfZG9uZSA9IGZhbHNlOwotICBob2xkID0gTlVMTDsKLQotICB3aGlsZSAoKipwcCAhPSAnXDAnKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKipwcCkKLQl7Ci0JY2FzZSAnUSc6Ci0JICBob2xkID0gKnBwOwotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV9xdWFsaWZpZWQgKG1pbmZvLCBwcCwgKGRlYnVnX3R5cGUgKikgTlVMTCkKLQkgICAgICB8fCAhIHN0YWJfZGVtYW5nbGVfcmVtZW1iZXJfdHlwZSAobWluZm8sIGhvbGQsICpwcCAtIGhvbGQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBleHBlY3RfZnVuYyA9IHRydWU7Ci0JICBob2xkID0gTlVMTDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnUyc6Ci0JICAvKiBTdGF0aWMgbWVtYmVyIGZ1bmN0aW9uLiAgRklYTUU6IENhbiB0aGlzIGhhcHBlbj8gICovCi0JICBpZiAoaG9sZCA9PSBOVUxMKQotCSAgICBob2xkID0gKnBwOwotCSAgKysqcHA7Ci0JICBicmVhazsKLQotCWNhc2UgJ0MnOgotCSAgLyogQ29uc3QgbWVtYmVyIGZ1bmN0aW9uLiAgKi8KLQkgIGlmIChob2xkID09IE5VTEwpCi0JICAgIGhvbGQgPSAqcHA7Ci0JICArKypwcDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgotCWNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLQkgIGlmIChob2xkID09IE5VTEwpCi0JICAgIGhvbGQgPSAqcHA7Ci0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX2NsYXNzIChtaW5mbywgcHAsIChjb25zdCBjaGFyICoqKSBOVUxMKQotCSAgICAgIHx8ICEgc3RhYl9kZW1hbmdsZV9yZW1lbWJlcl90eXBlIChtaW5mbywgaG9sZCwgKnBwIC0gaG9sZCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGV4cGVjdF9mdW5jID0gdHJ1ZTsKLQkgIGhvbGQgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlICdGJzoKLQkgIC8qIEZ1bmN0aW9uLiAgSSBkb24ndCBrbm93IGlmIHRoaXMgYWN0dWFsbHkgaGFwcGVucyB3aXRoIGcrKwotICAgICAgICAgICAgIG91dHB1dC4gICovCi0JICBob2xkID0gTlVMTDsKLQkgIGZ1bmNfZG9uZSA9IHRydWU7Ci0JICArKypwcDsKLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLCAmbWluZm8tPmFyZ3MsICZtaW5mby0+dmFyYXJncykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAndCc6Ci0JICAvKiBUZW1wbGF0ZS4gICovCi0JICBpZiAoaG9sZCA9PSBOVUxMKQotCSAgICBob2xkID0gKnBwOwotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZSAobWluZm8sIHBwLCAoY2hhciAqKikgTlVMTCkKLQkgICAgICB8fCAhIHN0YWJfZGVtYW5nbGVfcmVtZW1iZXJfdHlwZSAobWluZm8sIGhvbGQsICpwcCAtIGhvbGQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBob2xkID0gTlVMTDsKLQkgIGV4cGVjdF9mdW5jID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnXyc6Ci0JICAvKiBBdCB0aGUgb3V0ZXJtb3N0IGxldmVsLCB3ZSBjYW5ub3QgaGF2ZSBhIHJldHVybiB0eXBlCi0JICAgICBzcGVjaWZpZWQsIHNvIGlmIHdlIHJ1biBpbnRvIGFub3RoZXIgJ18nIGF0IHRoaXMgcG9pbnQgd2UKLQkgICAgIGFyZSBkZWFsaW5nIHdpdGggYSBtYW5nbGVkIG5hbWUgdGhhdCBpcyBlaXRoZXIgYm9ndXMsIG9yCi0JICAgICBoYXMgYmVlbiBtYW5nbGVkIGJ5IHNvbWUgYWxnb3JpdGhtIHdlIGRvbid0IGtub3cgaG93IHRvCi0JICAgICBkZWFsIHdpdGguICBTbyBqdXN0IHJlamVjdCB0aGUgZW50aXJlIGRlbWFuZ2xpbmcuICAqLwotCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCi0JZGVmYXVsdDoKLQkgIC8qIEFzc3VtZSB3ZSBoYXZlIHN0dW1ibGVkIG9udG8gdGhlIGZpcnN0IG91dGVybW9zdCBmdW5jdGlvbgotCSAgICAgYXJndW1lbnQgdG9rZW4sIGFuZCBzdGFydCBwcm9jZXNzaW5nIGFyZ3MuICAqLwotCSAgZnVuY19kb25lID0gdHJ1ZTsKLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLCAmbWluZm8tPmFyZ3MsICZtaW5mby0+dmFyYXJncykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGV4cGVjdF9mdW5jKQotCXsKLQkgIGZ1bmNfZG9uZSA9IHRydWU7Ci0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwgJm1pbmZvLT5hcmdzLCAmbWluZm8tPnZhcmFyZ3MpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoISBmdW5jX2RvbmUpCi0gICAgewotICAgICAgLyogV2l0aCBHTlUgc3R5bGUgZGVtYW5nbGluZywgYmFyX18zZm9vIGlzICdmb286OmJhcih2b2lkKScsIGFuZAotCSBiYXJfXzNmb29pIGlzICdmb286OmJhcihpbnQpJy4gIFdlIGdldCBoZXJlIHdoZW4gd2UgZmluZCB0aGUKLQkgZmlyc3QgY2FzZSwgYW5kIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlICcodm9pZCknIGdldHMgYWRkZWQKLQkgdG8gdGhlIGN1cnJlbnQgZGVjbHAuICAqLwotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9hcmdzIChtaW5mbywgcHAsICZtaW5mby0+YXJncywgJm1pbmZvLT52YXJhcmdzKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZW1hbmdsZSBhIHF1YWxpZmllZCBuYW1lLCBzdWNoIGFzICJRMjVPdXRlcjVJbm5lciIgd2hpY2ggaXMgdGhlCi0gICBtYW5nbGVkIGZvcm0gb2YgIk91dGVyOjpJbm5lciIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV9xdWFsaWZpZWQgKG1pbmZvLCBwcCwgcHR5cGUpCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGRlYnVnX3R5cGUgKnB0eXBlOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBjb25zdCBjaGFyICpwOwotICB1bnNpZ25lZCBpbnQgcXVhbGlmaWVyczsKLSAgZGVidWdfdHlwZSBjb250ZXh0OwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgc3dpdGNoICgoKnBwKVsxXSkKLSAgICB7Ci0gICAgY2FzZSAnXyc6Ci0gICAgICAvKiBHTlUgbWFuZ2xlZCBuYW1lIHdpdGggbW9yZSB0aGFuIDkgY2xhc3Nlcy4gIFRoZSBjb3VudCBpcwotCSBwcmVjZWRlZCBieSBhbiB1bmRlcnNjb3JlICh0byBkaXN0aW5ndWlzaCBpdCBmcm9tIHRoZSA8PSA5Ci0JIGNhc2UpIGFuZCBmb2xsb3dlZCBieSBhbiB1bmRlcnNjb3JlLiAgKi8KLSAgICAgIHAgPSAqcHAgKyAyOwotICAgICAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKSB8fCAqcCA9PSAnMCcpCi0JewotCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHF1YWxpZmllcnMgPSBhdG9pIChwKTsKLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApKQotCSsrcDsKLSAgICAgIGlmICgqcCAhPSAnXycpCi0JewotCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICpwcCA9IHAgKyAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzogY2FzZSAnNSc6Ci0gICAgY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0gICAgICBxdWFsaWZpZXJzID0gKCpwcClbMV0gLSAnMCc7Ci0gICAgICAvKiBTa2lwIGFuIG9wdGlvbmFsIHVuZGVyc2NvcmUgYWZ0ZXIgdGhlIGNvdW50LiAgKi8KLSAgICAgIGlmICgoKnBwKVsyXSA9PSAnXycpCi0JKysqcHA7Ci0gICAgICAqcHAgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMCc6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgY29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKLQotICAvKiBQaWNrIG9mZiB0aGUgbmFtZXMuICAqLwotICB3aGlsZSAocXVhbGlmaWVycy0tID4gMCkKLSAgICB7Ci0gICAgICBpZiAoKipwcCA9PSAnXycpCi0JKysqcHA7Ci0gICAgICBpZiAoKipwcCA9PSAndCcpCi0JewotCSAgY2hhciAqbmFtZTsKLQotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZSAobWluZm8sIHBwLAotCQkJCQlwdHlwZSAhPSBOVUxMID8gJm5hbWUgOiBOVUxMKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAocHR5cGUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNvbnRleHQgPSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCBtaW5mby0+aW5mbywKLQkJCQkJICAgICAgIG5hbWUsIHN0cmxlbiAobmFtZSksCi0JCQkJCSAgICAgICBERUJVR19LSU5EX0NMQVNTKTsKLQkgICAgICBmcmVlIChuYW1lKTsKLQkgICAgICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbGVuOwotCi0JICBsZW4gPSBzdGFiX2RlbWFuZ2xlX2NvdW50IChwcCk7Ci0JICBpZiAoc3RybGVuICgqcHApIDwgbGVuKQotCSAgICB7Ci0JICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAocHR5cGUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNvbnN0IGRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0KLQkgICAgICBmaWVsZHMgPSBOVUxMOwotCSAgICAgIGlmIChjb250ZXh0ICE9IERFQlVHX1RZUEVfTlVMTCkKLQkJZmllbGRzID0gZGVidWdfZ2V0X2ZpZWxkcyAobWluZm8tPmRoYW5kbGUsIGNvbnRleHQpOwotCi0JICAgICAgY29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKLQotCSAgICAgIGlmIChmaWVsZHMgIT0gTlVMTCkKLQkJewotCQkgIGNoYXIgKm5hbWU7Ci0KLQkJICAvKiBUcnkgdG8gZmluZCB0aGUgdHlwZSBieSBsb29raW5nIHRocm91Z2ggdGhlCi0gICAgICAgICAgICAgICAgICAgICBmaWVsZHMgb2YgY29udGV4dCB1bnRpbCB3ZSBmaW5kIGEgZmllbGQgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHNhbWUgdHlwZS4gIFRoaXMgb3VnaHQgdG8gd29yayBmb3IgYSBjbGFzcwotICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCB3aXRoaW4gYSBjbGFzcywgYnV0IGl0IHdvbid0IHdvcmsgZm9yLAotICAgICAgICAgICAgICAgICAgICAgZS5nLiwgYW4gZW51bSBkZWZpbmVkIHdpdGhpbiBhIGNsYXNzLiAgc3RhYnMgZG9lcwotICAgICAgICAgICAgICAgICAgICAgbm90IGdpdmUgdXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGZpZ3VyZSBvdXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICBsYXR0ZXIgY2FzZS4gICovCi0KLQkJICBuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBsZW4pOwotCi0JCSAgZm9yICg7ICpmaWVsZHMgIT0gREVCVUdfRklFTERfTlVMTDsgZmllbGRzKyspCi0JCSAgICB7Ci0JCSAgICAgIGRlYnVnX3R5cGUgZnQ7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKmRuOwotCi0JCSAgICAgIGZ0ID0gZGVidWdfZ2V0X2ZpZWxkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqZmllbGRzKTsKLQkJICAgICAgaWYgKGZ0ID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGRuID0gZGVidWdfZ2V0X3R5cGVfbmFtZSAobWluZm8tPmRoYW5kbGUsIGZ0KTsKLQkJICAgICAgaWYgKGRuICE9IE5VTEwgJiYgc3RyY21wIChkbiwgbmFtZSkgPT0gMCkKLQkJCXsKLQkJCSAgY29udGV4dCA9IGZ0OwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGZyZWUgKG5hbWUpOwotCQl9Ci0KLQkgICAgICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCi0JCXsKLQkJICAvKiBXZSBoYXZlIHRvIGZhbGwgYmFjayBvbiBmaW5kaW5nIHRoZSB0eXBlIGJ5IG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICBJZiB0aGVyZSBhcmUgbW9yZSB0eXBlcyB0byBjb21lLCB0aGVuIHRoaXMgbXVzdAotICAgICAgICAgICAgICAgICAgICAgYmUgYSBjbGFzcy4gIE90aGVyd2lzZSwgaXQgY291bGQgYmUgYW55dGhpbmcuICAqLwotCi0JCSAgaWYgKHF1YWxpZmllcnMgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY2hhciAqbmFtZTsKLQotCQkgICAgICBuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBsZW4pOwotCQkgICAgICBjb250ZXh0ID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJCSAgICAgICBuYW1lKTsKLQkJICAgICAgZnJlZSAobmFtZSk7Ci0JCSAgICB9Ci0KLQkJICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGNvbnRleHQgPSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLAotCQkJCQkJICAgICAgIG1pbmZvLT5pbmZvLAotCQkJCQkJICAgICAgICpwcCwgbGVuLAotCQkJCQkJICAgICAgIChxdWFsaWZpZXJzID09IDAKLQkJCQkJCQk/IERFQlVHX0tJTkRfSUxMRUdBTAotCQkJCQkJCTogREVCVUdfS0lORF9DTEFTUykpOwotCQkgICAgICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICAqcHAgKz0gbGVuOwotCX0KLSAgICB9Ci0KLSAgaWYgKHB0eXBlICE9IE5VTEwpCi0gICAgKnB0eXBlID0gY29udGV4dDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVtYW5nbGUgYSB0ZW1wbGF0ZS4gIElmIFBOQU1FIGlzIG5vdCBOVUxMLCB0aGlzIHNldHMgKlBOQU1FIHRvIGEKLSAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVtcGxhdGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZSAobWluZm8sIHBwLCBwbmFtZSkKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgY2hhciAqKnBuYW1lOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICB1bnNpZ25lZCBpbnQgciwgaTsKLQotICBvcmlnID0gKnBwOwotCi0gICsrKnBwOwotCi0gIC8qIFNraXAgdGhlIHRlbXBsYXRlIG5hbWUuICAqLwotICByID0gc3RhYl9kZW1hbmdsZV9jb3VudCAocHApOwotICBpZiAociA9PSAwIHx8IHN0cmxlbiAoKnBwKSA8IHIpCi0gICAgewotICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKnBwICs9IHI7Ci0KLSAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgbGlzdC4gICovCi0gIGlmIChzdGFiX2RlbWFuZ2xlX2dldF9jb3VudCAocHAsICZyKSA9PSAwKQotICAgIHsKLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IHI7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoKipwcCA9PSAnWicpCi0JewotCSAgLyogVGhpcyBpcyBhIHR5cGUgcGFyYW1ldGVyLiAgKi8KLQkgICsrKnBwOwotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIChkZWJ1Z190eXBlICopIE5VTEwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNvbnN0IGNoYXIgKm9sZF9wOwotCSAgYm9vbGVhbiBwb2ludGVycCwgcmVhbHAsIGludGVncmFscCwgY2hhcnAsIGJvb2xwOwotCSAgYm9vbGVhbiBkb25lOwotCi0JICBvbGRfcCA9ICpwcDsKLQkgIHBvaW50ZXJwID0gZmFsc2U7Ci0JICByZWFscCA9IGZhbHNlOwotCSAgaW50ZWdyYWxwID0gZmFsc2U7Ci0JICBjaGFycCA9IGZhbHNlOwotCSAgYm9vbHAgPSBmYWxzZTsKLQkgIGRvbmUgPSBmYWxzZTsKLQotCSAgLyogVGhpcyBpcyBhIHZhbHVlIHBhcmFtZXRlci4gICovCi0KLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCAoZGVidWdfdHlwZSAqKSBOVUxMKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICB3aGlsZSAoKm9sZF9wICE9ICdcMCcgJiYgISBkb25lKQotCSAgICB7Ci0JICAgICAgc3dpdGNoICgqb2xkX3ApCi0JCXsKLQkJY2FzZSAnUCc6Ci0JCWNhc2UgJ3AnOgotCQljYXNlICdSJzoKLQkJICBwb2ludGVycCA9IHRydWU7Ci0JCSAgZG9uZSA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0MnOgkvKiBDb25zdC4gICovCi0JCWNhc2UgJ1MnOgkvKiBTaWduZWQuICAqLwotCQljYXNlICdVJzoJLyogVW5zaWduZWQuICAqLwotCQljYXNlICdWJzoJLyogVm9sYXRpbGUuICAqLwotCQljYXNlICdGJzoJLyogRnVuY3Rpb24uICAqLwotCQljYXNlICdNJzoJLyogTWVtYmVyIGZ1bmN0aW9uLiAgKi8KLQkJY2FzZSAnTyc6CS8qID8/PyAqLwotCQkgICsrb2xkX3A7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1EnOgkvKiBRdWFsaWZpZWQgbmFtZS4gICovCi0JCSAgaW50ZWdyYWxwID0gdHJ1ZTsKLQkJICBkb25lID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJY2FzZSAnVCc6CS8qIFJlbWVtYmVyZWQgdHlwZS4gICovCi0JCSAgYWJvcnQgKCk7Ci0JCWNhc2UgJ3YnOgkvKiBWb2lkLiAgKi8KLQkJICBhYm9ydCAoKTsKLQkJY2FzZSAneCc6CS8qIExvbmcgbG9uZy4gICovCi0JCWNhc2UgJ2wnOgkvKiBMb25nLiAgKi8KLQkJY2FzZSAnaSc6CS8qIEludC4gICovCi0JCWNhc2UgJ3MnOgkvKiBTaG9ydC4gICovCi0JCWNhc2UgJ3cnOgkvKiBXY2hhcl90LiAgKi8KLQkJICBpbnRlZ3JhbHAgPSB0cnVlOwotCQkgIGRvbmUgPSB0cnVlOwotCQkgIGJyZWFrOwotCQljYXNlICdiJzoJLyogQm9vbC4gICovCi0JCSAgYm9vbHAgPSB0cnVlOwotCQkgIGRvbmUgPSB0cnVlOwotCQkgIGJyZWFrOwotCQljYXNlICdjJzoJLyogQ2hhci4gICovCi0JCSAgY2hhcnAgPSB0cnVlOwotCQkgIGRvbmUgPSB0cnVlOwotCQkgIGJyZWFrOwotCQljYXNlICdyJzoJLyogTG9uZyBkb3VibGUuICAqLwotCQljYXNlICdkJzoJLyogRG91YmxlLiAgKi8KLQkJY2FzZSAnZic6CS8qIEZsb2F0LiAgKi8KLQkJICByZWFscCA9IHRydWU7Ci0JCSAgZG9uZSA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgLyogQXNzdW1lIGl0J3MgYSB1c2VyIGRlZmluZWQgaW50ZWdyYWwgdHlwZS4gICovCi0JCSAgaW50ZWdyYWxwID0gdHJ1ZTsKLQkJICBkb25lID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChpbnRlZ3JhbHApCi0JICAgIHsKLQkgICAgICBpZiAoKipwcCA9PSAnbScpCi0JCSsrKnBwOwotCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCi0JCSsrKnBwOwotCSAgICB9Ci0JICBlbHNlIGlmIChjaGFycCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCB2YWw7Ci0KLQkgICAgICBpZiAoKipwcCA9PSAnbScpCi0JCSsrKnBwOwotCSAgICAgIHZhbCA9IHN0YWJfZGVtYW5nbGVfY291bnQgKHBwKTsKLQkgICAgICBpZiAodmFsID09IDApCi0JCXsKLQkJICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGJvb2xwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IHZhbDsKLQotCSAgICAgIHZhbCA9IHN0YWJfZGVtYW5nbGVfY291bnQgKHBwKTsKLQkgICAgICBpZiAodmFsICE9IDAgJiYgdmFsICE9IDEpCi0JCXsKLQkJICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJlYWxwKQotCSAgICB7Ci0JICAgICAgaWYgKCoqcHAgPT0gJ20nKQotCQkrKypwcDsKLQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCQkrKypwcDsKLQkgICAgICBpZiAoKipwcCA9PSAnLicpCi0JCXsKLQkJICArKypwcDsKLQkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCQkgICAgKysqcHA7Ci0JCX0KLQkgICAgICBpZiAoKipwcCA9PSAnZScpCi0JCXsKLQkJICArKypwcDsKLQkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCQkgICAgKysqcHA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocG9pbnRlcnApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgbGVuOwotCi0JICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9nZXRfY291bnQgKHBwLCAmbGVuKSkKLQkJewotCQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICAqcHAgKz0gbGVuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBXZSBjYW4gdHJhbnNsYXRlIHRoaXMgdG8gYSBzdHJpbmcgZmFpcmx5IGVhc2lseSBieSBpbnZva2luZyB0aGUKLSAgICAgcmVndWxhciBkZW1hbmdsaW5nIHJvdXRpbmUuICAqLwotICBpZiAocG5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpzMSwgKnMyLCAqczMsICpzNDsKLSAgICAgIGNoYXIgKmZyb20sICp0bzsKLQotICAgICAgczEgPSBzYXZlc3RyaW5nIChvcmlnLCAqcHAgLSBvcmlnKTsKLQotICAgICAgczIgPSBjb25jYXQgKCJOb1N1Y2hTdHJpbkdfXyIsIHMxLCAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQotICAgICAgZnJlZSAoczEpOwotCi0gICAgICBzMyA9IGNwbHVzX2RlbWFuZ2xlIChzMiwgRE1HTF9BTlNJKTsKLQotICAgICAgZnJlZSAoczIpOwotCi0gICAgICBpZiAoczMgIT0gTlVMTCkKLQlzNCA9IHN0cnN0ciAoczMsICI6Ok5vU3VjaFN0cmluRyIpOwotICAgICAgaWYgKHMzID09IE5VTEwgfHwgczQgPT0gTlVMTCkKLQl7Ci0JICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICBpZiAoczMgIT0gTlVMTCkKLQkgICAgZnJlZSAoczMpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogRWxpbWluYXRpbmcgYWxsIHNwYWNlcywgZXhjZXB0IHRob3NlIGJldHdlZW4gPiBjaGFyYWN0ZXJzLAotICAgICAgICAgbWFrZXMgaXQgbW9yZSBsaWtlbHkgdGhhdCB0aGUgZGVtYW5nbGVkIG5hbWUgd2lsbCBtYXRjaCB0aGUKLSAgICAgICAgIG5hbWUgd2hpY2ggZysrIHVzZWQgYXMgdGhlIHN0cnVjdHVyZSBuYW1lLiAgKi8KLSAgICAgIGZvciAoZnJvbSA9IHRvID0gczM7IGZyb20gIT0gczQ7ICsrZnJvbSkKLQlpZiAoKmZyb20gIT0gJyAnCi0JICAgIHx8IChmcm9tWzFdID09ICc+JyAmJiBmcm9tID4gczMgJiYgZnJvbVstMV0gPT0gJz4nKSkKLQkgICp0bysrID0gKmZyb207Ci0KLSAgICAgICpwbmFtZSA9IHNhdmVzdHJpbmcgKHMzLCB0byAtIHMzKTsKLQotICAgICAgZnJlZSAoczMpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVtYW5nbGUgYSBjbGFzcyBuYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfY2xhc3MgKG1pbmZvLCBwcCwgcHN0YXJ0KQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBjb25zdCBjaGFyICoqcHN0YXJ0OwotewotICBjb25zdCBjaGFyICpvcmlnOwotICB1bnNpZ25lZCBpbnQgbjsKLQotICBvcmlnID0gKnBwOwotCi0gIG4gPSBzdGFiX2RlbWFuZ2xlX2NvdW50IChwcCk7Ci0gIGlmIChzdHJsZW4gKCpwcCkgPCBuKQotICAgIHsKLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKHBzdGFydCAhPSBOVUxMKQotICAgICpwc3RhcnQgPSAqcHA7Ci0KLSAgKnBwICs9IG47Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlbWFuZ2xlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gIElmIHRoZSBwYXJncyBhcmd1bWVudCBpcyBub3QgTlVMTCwgaXQKLSAgIGlzIHNldCB0byBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBob2xkaW5nIHRoZSBhcmd1bWVudHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV9hcmdzIChtaW5mbywgcHAsIHBhcmdzLCBwdmFyYXJncykKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgZGVidWdfdHlwZSAqKnBhcmdzOwotICAgICBib29sZWFuICpwdmFyYXJnczsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgdW5zaWduZWQgaW50IGFsbG9jLCBjb3VudDsKLQotICBvcmlnID0gKnBwOwotCi0gIGFsbG9jID0gMTA7Ci0gIGlmIChwYXJncyAhPSBOVUxMKQotICAgIHsKLSAgICAgICpwYXJncyA9IChkZWJ1Z190eXBlICopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICoqcGFyZ3MpOwotICAgICAgKnB2YXJhcmdzID0gZmFsc2U7Ci0gICAgfQotICBjb3VudCA9IDA7Ci0KLSAgd2hpbGUgKCoqcHAgIT0gJ18nICYmICoqcHAgIT0gJ1wwJyAmJiAqKnBwICE9ICdlJykKLSAgICB7Ci0gICAgICBpZiAoKipwcCA9PSAnTicgfHwgKipwcCA9PSAnVCcpCi0JewotCSAgY2hhciB0ZW1wdHlwZTsKLQkgIHVuc2lnbmVkIGludCByLCB0OwotCi0JICB0ZW1wdHlwZSA9ICoqcHA7Ci0JICArKypwcDsKLQotCSAgaWYgKHRlbXB0eXBlID09ICdUJykKLQkgICAgciA9IDE7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX2dldF9jb3VudCAocHAsICZyKSkKLQkJewotCQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX2dldF9jb3VudCAocHAsICZ0KSkKLQkgICAgewotCSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHQgPj0gbWluZm8tPnR5cGVzdHJpbmdfY291bnQpCi0JICAgIHsKLQkgICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICB3aGlsZSAoci0tID4gMCkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKnRlbTsKLQotCSAgICAgIHRlbSA9IG1pbmZvLT50eXBlc3RyaW5nc1t0XS50eXBlc3RyaW5nOwotCSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJnIChtaW5mbywgJnRlbSwgcGFyZ3MsICZjb3VudCwgJmFsbG9jKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJnIChtaW5mbywgcHAsIHBhcmdzLCAmY291bnQsICZhbGxvYykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChwYXJncyAhPSBOVUxMKQotICAgICgqcGFyZ3MpW2NvdW50XSA9IERFQlVHX1RZUEVfTlVMTDsKLQotICBpZiAoKipwcCA9PSAnZScpCi0gICAgewotICAgICAgaWYgKHBhcmdzICE9IE5VTEwpCi0JKnB2YXJhcmdzID0gdHJ1ZTsKLSAgICAgICsrKnBwOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVtYW5nbGUgYSBzaW5nbGUgYXJndW1lbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV9hcmcgKG1pbmZvLCBwcCwgcGFyZ3MsIHBjb3VudCwgcGFsbG9jKQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z190eXBlICoqcGFyZ3M7Ci0gICAgIHVuc2lnbmVkIGludCAqcGNvdW50OwotICAgICB1bnNpZ25lZCBpbnQgKnBhbGxvYzsKLXsKLSAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gIGRlYnVnX3R5cGUgdHlwZTsKLQotICBzdGFydCA9ICpwcDsKLSAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsCi0JCQkgICAgcGFyZ3MgPT0gTlVMTCA/IChkZWJ1Z190eXBlICopIE5VTEwgOiAmdHlwZSkKLSAgICAgIHx8ICEgc3RhYl9kZW1hbmdsZV9yZW1lbWJlcl90eXBlIChtaW5mbywgc3RhcnQsICpwcCAtIHN0YXJ0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHBhcmdzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCpwY291bnQgKyAxID49ICpwYWxsb2MpCi0JewotCSAgKnBhbGxvYyArPSAxMDsKLQkgICpwYXJncyA9ICgoZGVidWdfdHlwZSAqKQotCQkgICAgeHJlYWxsb2MgKCpwYXJncywgKnBhbGxvYyAqIHNpemVvZiAqKnBhcmdzKSk7Ci0JfQotICAgICAgKCpwYXJncylbKnBjb3VudF0gPSB0eXBlOwotICAgICAgKysqcGNvdW50OwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVtYW5nbGUgYSB0eXBlLiAgSWYgdGhlIHB0eXBlIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCAqcHR5cGUgaXMgc2V0Ci0gICB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z190eXBlICpwdHlwZTsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLQotICBvcmlnID0gKnBwOwotCi0gIHN3aXRjaCAoKipwcCkKLSAgICB7Ci0gICAgY2FzZSAnUCc6Ci0gICAgY2FzZSAncCc6Ci0gICAgICAvKiBBIHBvaW50ZXIgdHlwZS4gICovCi0gICAgICArKypwcDsKLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JKnB0eXBlID0gZGVidWdfbWFrZV9wb2ludGVyX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdSJzoKLSAgICAgIC8qIEEgcmVmZXJlbmNlIHR5cGUuICAqLwotICAgICAgKysqcHA7Ci0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCSpwdHlwZSA9IGRlYnVnX21ha2VfcmVmZXJlbmNlX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdBJzoKLSAgICAgIC8qIEFuIGFycmF5LiAgKi8KLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nIGhpZ2g7Ci0KLQkrKypwcDsKLQloaWdoID0gMDsKLQl3aGlsZSAoKipwcCAhPSAnXDAnICYmICoqcHAgIT0gJ18nKQotCSAgewotCSAgICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCi0JICAgICAgewotCQlzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgIGhpZ2ggKj0gMTA7Ci0JICAgIGhpZ2ggKz0gKipwcCAtICcwJzsKLQkgICAgKysqcHA7Ci0JICB9Ci0JaWYgKCoqcHAgIT0gJ18nKQotCSAgewotCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQkrKypwcDsKLQotCWlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKHB0eXBlICE9IE5VTEwpCi0JICB7Ci0JICAgIGRlYnVnX3R5cGUgaW50X3R5cGU7Ci0KLQkgICAgaW50X3R5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAiaW50Iik7Ci0JICAgIGlmIChpbnRfdHlwZSA9PSBOVUxMKQotCSAgICAgIGludF90eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDQsIGZhbHNlKTsKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9hcnJheV90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlLCBpbnRfdHlwZSwKLQkJCQkJICAgIDAsIGhpZ2gsIGZhbHNlKTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgICAvKiBBIGJhY2sgcmVmZXJlbmNlIHRvIGEgcmVtZW1iZXJlZCB0eXBlLiAgKi8KLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgaTsKLQljb25zdCBjaGFyICpwOwotCi0JKysqcHA7Ci0JaWYgKCEgc3RhYl9kZW1hbmdsZV9nZXRfY291bnQgKHBwLCAmaSkpCi0JICB7Ci0JICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCWlmIChpID49IG1pbmZvLT50eXBlc3RyaW5nX2NvdW50KQotCSAgewotCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQlwID0gbWluZm8tPnR5cGVzdHJpbmdzW2ldLnR5cGVzdHJpbmc7Ci0JaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgJnAsIHB0eXBlKSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRic6Ci0gICAgICAvKiBBIGZ1bmN0aW9uLiAgKi8KLSAgICAgIHsKLQlkZWJ1Z190eXBlICphcmdzOwotCWJvb2xlYW4gdmFyYXJnczsKLQotCSsrKnBwOwotCWlmICghIHN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLAotCQkJCSAgKHB0eXBlID09IE5VTEwKLQkJCQkgICA/IChkZWJ1Z190eXBlICoqKSBOVUxMCi0JCQkJICAgOiAmYXJncyksCi0JCQkJICAocHR5cGUgPT0gTlVMTAotCQkJCSAgID8gKGJvb2xlYW4gKikgTlVMTAotCQkJCSAgIDogJnZhcmFyZ3MpKSkKLQkgIHJldHVybiBmYWxzZTsKLQlpZiAoKipwcCAhPSAnXycpCi0JICB7Ci0JICAgIC8qIGNwbHVzX2RlbWFuZ2xlIHdpbGwgYWNjZXB0IGEgZnVuY3Rpb24gd2l0aG91dCBhIHJldHVybgotCSAgICAgICB0eXBlLCBidXQgSSBkb24ndCBrbm93IHdoZW4gdGhhdCB3aWxsIGhhcHBlbiwgb3Igd2hhdAotCSAgICAgICB0byBkbyBpZiBpdCBkb2VzLiAgKi8KLQkgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JKysqcHA7Ci0JaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKLQkgIHJldHVybiBmYWxzZTsKLQlpZiAocHR5cGUgIT0gTlVMTCkKLQkgICpwdHlwZSA9IGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSwgYXJncywKLQkJCQkJICAgICB2YXJhcmdzKTsKLQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdNJzoKLSAgICBjYXNlICdPJzoKLSAgICAgIHsKLQlib29sZWFuIG1lbWJlcnAsIGNvbnN0cCwgdm9sYXRpbGVwOwotCWRlYnVnX3R5cGUgKmFyZ3M7Ci0JYm9vbGVhbiB2YXJhcmdzOwotCXVuc2lnbmVkIGludCBuOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQltZW1iZXJwID0gKipwcCA9PSAnTSc7Ci0JY29uc3RwID0gZmFsc2U7Ci0Jdm9sYXRpbGVwID0gZmFsc2U7Ci0JYXJncyA9IE5VTEw7Ci0JdmFyYXJncyA9IGZhbHNlOwotCi0JKysqcHA7Ci0JaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCSAgewotCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQluID0gc3RhYl9kZW1hbmdsZV9jb3VudCAocHApOwotCWlmIChzdHJsZW4gKCpwcCkgPCBuKQotCSAgewotCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQluYW1lID0gKnBwOwotCSpwcCArPSBuOwotCi0JaWYgKG1lbWJlcnApCi0JICB7Ci0JICAgIGlmICgqKnBwID09ICdDJykKLQkgICAgICB7Ci0JCWNvbnN0cCA9IHRydWU7Ci0JCSsrKnBwOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoKipwcCA9PSAnVicpCi0JICAgICAgewotCQl2b2xhdGlsZXAgPSB0cnVlOwotCQkrKypwcDsKLQkgICAgICB9Ci0JICAgIGlmICgqKnBwICE9ICdGJykKLQkgICAgICB7Ci0JCXN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgKysqcHA7Ci0JICAgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLAotCQkJCSAgICAgIChwdHlwZSA9PSBOVUxMCi0JCQkJICAgICAgID8gKGRlYnVnX3R5cGUgKiopIE5VTEwKLQkJCQkgICAgICAgOiAmYXJncyksCi0JCQkJICAgICAgKHB0eXBlID09IE5VTEwKLQkJCQkgICAgICAgPyAoYm9vbGVhbiAqKSBOVUxMCi0JCQkJICAgICAgIDogJnZhcmFyZ3MpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0KLQlpZiAoKipwcCAhPSAnXycpCi0JICB7Ci0JICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSsrKnBwOwotCi0JaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKLQkgIHJldHVybiBmYWxzZTsKLQotCWlmIChwdHlwZSAhPSBOVUxMKQotCSAgewotCSAgICBkZWJ1Z190eXBlIGNsYXNzX3R5cGU7Ci0KLQkgICAgY2xhc3NfdHlwZSA9IHN0YWJfZmluZF90YWdnZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsIG1pbmZvLT5pbmZvLAotCQkJCQkJbmFtZSwgKGludCkgbiwKLQkJCQkJCURFQlVHX0tJTkRfQ0xBU1MpOwotCSAgICBpZiAoY2xhc3NfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIGlmICghIG1lbWJlcnApCi0JICAgICAgKnB0eXBlID0gZGVidWdfbWFrZV9vZmZzZXRfdHlwZSAobWluZm8tPmRoYW5kbGUsIGNsYXNzX3R5cGUsCi0JCQkJCSAgICAgICAqcHR5cGUpOwotCSAgICBlbHNlCi0JICAgICAgewotCQkvKiBGSVhNRTogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIGNvbnN0cCBvcgotICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlcC4gICovCi0JCSpwdHlwZSA9IGRlYnVnX21ha2VfbWV0aG9kX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUsCi0JCQkJCQkgY2xhc3NfdHlwZSwgYXJncywgdmFyYXJncyk7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdHJzoKLSAgICAgICsrKnBwOwotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0MnOgotICAgICAgKysqcHA7Ci0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCSpwdHlwZSA9IGRlYnVnX21ha2VfY29uc3RfdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1EnOgotICAgICAgewotCWNvbnN0IGNoYXIgKmhvbGQ7Ci0KLQlob2xkID0gKnBwOwotCWlmICghIHN0YWJfZGVtYW5nbGVfcXVhbGlmaWVkIChtaW5mbywgcHAsIHB0eXBlKSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfZnVuZF90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlbWFuZ2xlIGEgZnVuZGFtZW50YWwgdHlwZS4gIElmIHRoZSBwdHlwZSBhcmd1bWVudCBpcyBub3QgTlVMTCwKLSAgICpwdHlwZSBpcyBzZXQgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfZnVuZF90eXBlIChtaW5mbywgcHAsIHB0eXBlKQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z190eXBlICpwdHlwZTsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgYm9vbGVhbiBjb25zdHAsIHZvbGF0aWxlcCwgdW5zaWduZWRwLCBzaWduZWRwOwotICBib29sZWFuIGRvbmU7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBjb25zdHAgPSBmYWxzZTsKLSAgdm9sYXRpbGVwID0gZmFsc2U7Ci0gIHVuc2lnbmVkcCA9IGZhbHNlOwotICBzaWduZWRwID0gZmFsc2U7Ci0KLSAgZG9uZSA9IGZhbHNlOwotICB3aGlsZSAoISBkb25lKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKipwcCkKLQl7Ci0JY2FzZSAnQyc6Ci0JICBjb25zdHAgPSB0cnVlOwotCSAgKysqcHA7Ci0JICBicmVhazsKLQotCWNhc2UgJ1UnOgotCSAgdW5zaWduZWRwID0gdHJ1ZTsKLQkgICsrKnBwOwotCSAgYnJlYWs7Ci0KLQljYXNlICdTJzoKLQkgIHNpZ25lZHAgPSB0cnVlOwotCSAgKysqcHA7Ci0JICBicmVhazsKLQotCWNhc2UgJ1YnOgotCSAgdm9sYXRpbGVwID0gdHJ1ZTsKLQkgICsrKnBwOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgZG9uZSA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHN3aXRjaCAoKipwcCkKLSAgICB7Ci0gICAgY2FzZSAnXDAnOgotICAgIGNhc2UgJ18nOgotICAgICAgLyogY3BsdXNfZGVtYW5nbGUgcGVybWl0cyB0aGlzLCBidXQgSSBkb24ndCBrbm93IHdoYXQgaXQgbWVhbnMuICAqLwotICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd2JzogLyogdm9pZCAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgInZvaWQiKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAobWluZm8tPmRoYW5kbGUpOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzogLyogbG9uZyBsb25nICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLAotCQkJCQkgICh1bnNpZ25lZHAKLQkJCQkJICAgPyAibG9uZyBsb25nIHVuc2lnbmVkIGludCIKLQkJCQkJICAgOiAibG9uZyBsb25nIGludCIpKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChtaW5mby0+ZGhhbmRsZSwgOCwgdW5zaWduZWRwKTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbCc6IC8qIGxvbmcgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsCi0JCQkJCSAgKHVuc2lnbmVkcAotCQkJCQkgICA/ICJsb25nIHVuc2lnbmVkIGludCIKLQkJCQkJICAgOiAibG9uZyBpbnQiKSk7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDQsIHVuc2lnbmVkcCk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2knOiAvKiBpbnQgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsCi0JCQkJCSAgKHVuc2lnbmVkcAotCQkJCQkgICA/ICJ1bnNpZ25lZCBpbnQiCi0JCQkJCSAgIDogImludCIpKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChtaW5mby0+ZGhhbmRsZSwgNCwgdW5zaWduZWRwKTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncyc6IC8qIHNob3J0ICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLAotCQkJCQkgICh1bnNpZ25lZHAKLQkJCQkJICAgPyAic2hvcnQgdW5zaWduZWQgaW50IgotCQkJCQkgICA6ICJzaG9ydCBpbnQiKSk7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDIsIHVuc2lnbmVkcCk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2InOiAvKiBib29sICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAiYm9vbCIpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfYm9vbF90eXBlIChtaW5mby0+ZGhhbmRsZSwgNCk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2MnOiAvKiBjaGFyICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLAotCQkJCQkgICh1bnNpZ25lZHAKLQkJCQkJICAgPyAidW5zaWduZWQgY2hhciIKLQkJCQkJICAgOiAoc2lnbmVkcAotCQkJCQkgICAgICA/ICJzaWduZWQgY2hhciIKLQkJCQkJICAgICAgOiAiY2hhciIpKSk7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDEsIHVuc2lnbmVkcCk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3cnOiAvKiB3Y2hhcl90ICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAiX193Y2hhcl90Iik7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDIsIHRydWUpOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdyJzogLyogbG9uZyBkb3VibGUgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsICJsb25nIGRvdWJsZSIpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDgpOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzogLyogZG91YmxlICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAiZG91YmxlIik7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChtaW5mby0+ZGhhbmRsZSwgOCk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2YnOiAvKiBmbG9hdCAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgImZsb2F0Iik7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChtaW5mby0+ZGhhbmRsZSwgNCk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0cnOgotICAgICAgKysqcHA7Ci0gICAgICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCi0JewotCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgotICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLSAgICAgIHsKLQljb25zdCBjaGFyICpob2xkOwotCi0JaWYgKCEgc3RhYl9kZW1hbmdsZV9jbGFzcyAobWluZm8sIHBwLCAmaG9sZCkpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKHB0eXBlICE9IE5VTEwpCi0JICB7Ci0JICAgIGNoYXIgKm5hbWU7Ci0KLQkgICAgbmFtZSA9IHNhdmVzdHJpbmcgKGhvbGQsICpwcCAtIGhvbGQpOwotCSAgICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCBuYW1lKTsKLQkgICAgZnJlZSAobmFtZSk7Ci0JICAgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAgIHsKLQkJLyogRklYTUU6IEl0IGlzIHByb2JhYmx5IGluY29ycmVjdCB0byBhc3N1bWUgdGhhdAotICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCB0eXBlcyBhcmUgdGFnZ2VkIHR5cGVzLiAgKi8KLQkJKnB0eXBlID0gc3RhYl9maW5kX3RhZ2dlZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgbWluZm8tPmluZm8sCi0JCQkJCQlob2xkLCAqcHAgLSBob2xkLAotCQkJCQkJREVCVUdfS0lORF9JTExFR0FMKTsKLQkJaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndCc6Ci0gICAgICB7Ci0JY2hhciAqbmFtZTsKLQotCWlmICghIHN0YWJfZGVtYW5nbGVfdGVtcGxhdGUgKG1pbmZvLCBwcCwKLQkJCQkgICAgICBwdHlwZSAhPSBOVUxMID8gJm5hbWUgOiBOVUxMKSkKLQkgIHJldHVybiBmYWxzZTsKLQlpZiAocHR5cGUgIT0gTlVMTCkKLQkgIHsKLQkgICAgKnB0eXBlID0gc3RhYl9maW5kX3RhZ2dlZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgbWluZm8tPmluZm8sCi0JCQkJCSAgICBuYW1lLCBzdHJsZW4gKG5hbWUpLAotCQkJCQkgICAgREVCVUdfS0lORF9DTEFTUyk7Ci0JICAgIGZyZWUgKG5hbWUpOwotCSAgICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChwdHlwZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChjb25zdHApCi0JKnB0eXBlID0gZGVidWdfbWFrZV9jb25zdF90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlKTsKLSAgICAgIGlmICh2b2xhdGlsZXApCi0JKnB0eXBlID0gZGVidWdfbWFrZV92b2xhdGlsZV90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbWVtYmVyIGEgdHlwZSBzdHJpbmcgaW4gYSBkZW1hbmdsZWQgc3RyaW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfcmVtZW1iZXJfdHlwZSAobWluZm8sIHAsIGxlbikKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgIGludCBsZW47Ci17Ci0gIGlmIChtaW5mby0+dHlwZXN0cmluZ19jb3VudCA+PSBtaW5mby0+dHlwZXN0cmluZ19hbGxvYykKLSAgICB7Ci0gICAgICBtaW5mby0+dHlwZXN0cmluZ19hbGxvYyArPSAxMDsKLSAgICAgIG1pbmZvLT50eXBlc3RyaW5ncyA9ICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfdHlwZXN0cmluZyAqKQotCQkJICAgIHhyZWFsbG9jIChtaW5mby0+dHlwZXN0cmluZ3MsCi0JCQkJICAgICAgKG1pbmZvLT50eXBlc3RyaW5nX2FsbG9jCi0JCQkJICAgICAgICogc2l6ZW9mICptaW5mby0+dHlwZXN0cmluZ3MpKSk7Ci0gICAgfQotCi0gIG1pbmZvLT50eXBlc3RyaW5nc1ttaW5mby0+dHlwZXN0cmluZ19jb3VudF0udHlwZXN0cmluZyA9IHA7Ci0gIG1pbmZvLT50eXBlc3RyaW5nc1ttaW5mby0+dHlwZXN0cmluZ19jb3VudF0ubGVuID0gKHVuc2lnbmVkIGludCkgbGVuOwotICArK21pbmZvLT50eXBlc3RyaW5nX2NvdW50OwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvc3RhbXAtaC5pbiBiL2JpbnV0aWxzL3N0YW1wLWguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODhmNzAuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc3RhbXAtaC5pbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXRpbWVzdGFtcApkaWZmIC0tZ2l0IGEvYmludXRpbHMvc3RyaW5ncy4xIGIvYmludXRpbHMvc3RyaW5ncy4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDhkZTI5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3N0cmluZ3MuMQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggc3RyaW5ncyAxICIyNSBKdW5lIDE5OTMiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1zdHJpbmdzIFwtIHByaW50IHRoZSBzdHJpbmdzIG9mIHByaW50YWJsZSBjaGFyYWN0ZXJzIGluIGZpbGVzCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBzdHJpbmdzCi0uUkIgIltcfCIgXC1hIHwgXC1cYwotLlJCIHwgXC1cLWFsbCAiXHxdIiAKLS5SQiAiW1x8IiBcLWYgfCBcLVwtcHJpbnRcLWZpbGVcLW5hbWUgIlx8XSIKLS5SQiAiW1x8IiBcLW8gIlx8XSIgCi0uUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIgCi0uUkIgIltcfCIgXC12IHwgXC1cLXZlcnNpb24gIlx8XSIgIAotLlJCICJbXHwiIFwtbgotLkkgbWluXC1sZW5cYwotLlJJIHwgXC1taW5cLWxlblxjCi0uUkIgfCAiXC1cLWJ5dGVzPSJcYwotLkkgbWluXC1sZW5cYwotXCZcfF0KLS5SQiAiW1x8IiBcLXQKLS5JIHtvLHgsZH1cYwotLlJCICJbXHwiICJcLVwtdGFyZ2V0PVxmSWJmZG5hbWUiICJcfF0iCi0uUkIgfCAiXC1cLXJhZGl4PSJcYwotLkkge28seCxkfVxjCi1cJlx8XQotLkkgZmlsZVxjCi0uYWQgYgotLmh5IDEKLS5TSCBERVNDUklQVElPTgotRm9yIGVhY2gKLS5JIGZpbGUKLWdpdmVuLCBHTlUgXGMKLS5CIHN0cmluZ3MKLXByaW50cyB0aGUgcHJpbnRhYmxlIGNoYXJhY3RlciBzZXF1ZW5jZXMgdGhhdCBhcmUgYXQgbGVhc3QgNAotY2hhcmFjdGVycyBsb25nIChvciB0aGUgbnVtYmVyIGdpdmVuIHdpdGggdGhlIG9wdGlvbnMgYmVsb3cpIGFuZCBhcmUKLWZvbGxvd2VkIGJ5IGFuIHVucHJpbnRhYmxlIGNoYXJhY3Rlci4gIEJ5IGRlZmF1bHQsIGl0IG9ubHkgcHJpbnRzIHRoZQotc3RyaW5ncyBmcm9tIHRoZSBpbml0aWFsaXplZCBhbmQgbG9hZGVkIHNlY3Rpb25zIG9mIG9iamVjdCBmaWxlczsgZm9yCi1vdGhlciB0eXBlcyBvZiBmaWxlcywgaXQgcHJpbnRzIHRoZSBzdHJpbmdzIGZyb20gdGhlIHdob2xlIGZpbGUuCi0KLS5QUAotLkIgc3RyaW5ncwotaXMgbWFpbmx5IHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgdGhlIGNvbnRlbnRzIG9mIG5vbi10ZXh0IGZpbGVzLgotCi0uU0ggT1BUSU9OUwotVGhlIGxvbmcgYW5kIHNob3J0IGZvcm1zIG9mIG9wdGlvbnMsIHNob3duIGhlcmUgYXMgYWx0ZXJuYXRpdmVzLCBhcmUKLWVxdWl2YWxlbnQuCi0KLS5UUAotLkIgXC1hCi0uVFAKLS5CIFwtXC1hbGwKLS5UUAotLkIgXC0KLURvIG5vdCBzY2FuIG9ubHkgdGhlIGluaXRpYWxpemVkIGFuZCBsb2FkZWQgc2VjdGlvbnMgb2Ygb2JqZWN0IGZpbGVzOwotc2NhbiB0aGUgd2hvbGUgZmlsZXMuCi0KLS5UUAotLkIgXC1mCi0uVFAKLS5CIFwtXC1wcmludFwtZmlsZVwtbmFtZQotUHJpbnQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLgotCi0uVFAKLS5CIFwtXC1oZWxwCi1QcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8KLS5CIHN0cmluZ3MKLW9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCi0KLS5UUAotLkIgXC12Ci0uVFAKLS5CIFwtXC12ZXJzaW9uCi1QcmludCB0aGUgdmVyc2lvbiBudW1iZXIKLW9mCi0uQiBzdHJpbmdzCi1vbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgotCi0uVFAKLS5CICJcLW4gXGZJbWluXC1sZW5cZlAiCi0uVFAKLS5CICJcLVxmSW1pblwtbGVuXGZQIgotLlRQCi0uQiAiXC1ieXRlcz1cZkltaW5cLWxlblxmUCIKLVByaW50IHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGF0IGxlYXN0Ci0uSSBtaW5cLWxlbgotY2hhcmFjdGVycyBsb25nLCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDQuCi0KLS5UUAotLkJSICJcLXQgIiB7byx4LGR9Ci0uVFAKLS5CUiAiXC1cLXJhZGl4PSIge28seCxkfQotUHJpbnQgdGhlIG9mZnNldCB3aXRoaW4gdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLiAgVGhlIHNpbmdsZQotY2hhcmFjdGVyIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgcmFkaXggb2YgdGhlIG9mZnNldFwoZW1vY3RhbCwKLWhleGFkZWNpbWFsLCBvciBkZWNpbWFsLgotCi0uVFAKLS5CSSAiXC1cLXRhcmdldD0iICJiZmRuYW1lIgotU3BlY2lmeSBhbiBvYmplY3QgY29kZSBmb3JtYXQgb3RoZXIgdGhhbiB5b3VyIHN5c3RlbSdzIGRlZmF1bHQgZm9ybWF0LgotU2VlIAotLkJSIG9iamR1bXAgKCAxICksCi1mb3IgaW5mb3JtYXRpb24gb24gbGlzdGluZyBhdmFpbGFibGUgZm9ybWF0cy4KLQotLlRQCi0uQiBcLW8KLUxpa2UKLS5CUiAiXC10IG8iIC4KLQotLlBQCi0KLS5TSCAiU0VFIEFMU08iCi0uUkIgImBcfCIgYmludXRpbHMgIlx8JyIKLWVudHJ5IGluIAotLkIKLWluZm9cYwotXCY7IAotLkkKLVRoZSBHTlUgQmluYXJ5IFV0aWxpdGllc1xjCi1cJiwgUm9sYW5kIEguIFBlc2NoIChPY3RvYmVyIDE5OTEpOwotLkJSIGFyICggMSApLAotLkJSIG5tICggMSApLAotLkJSIG9iamR1bXAgKCAxICksCi0uQlIgcmFubGliICggMSApLgotCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N0cmluZ3MuYyBiL2JpbnV0aWxzL3N0cmluZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmZTZhMS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zdHJpbmdzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLyogc3RyaW5ncyAtLSBwcmludCB0aGUgc3RyaW5ncyBvZiBwcmludGFibGUgY2hhcmFjdGVycyBpbiBmaWxlcwotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotLyogVXNhZ2U6IHN0cmluZ3MgW29wdGlvbnNdIGZpbGUuLi4KLQotICAgT3B0aW9uczoKLSAgIC0tYWxsCi0gICAtYQotICAgLQkJRG8gbm90IHNjYW4gb25seSB0aGUgaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uIG9mIG9iamVjdCBmaWxlcy4KLQotICAgLS1wcmludC1maWxlLW5hbWUKLSAgIC1mCQlQcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSBiZWZvcmUgZWFjaCBzdHJpbmcuCi0KLSAgIC0tYnl0ZXM9bWluLWxlbgotICAgLW4gbWluLWxlbgotICAgLW1pbi1sZW4JUHJpbnQgZ3JhcGhpYyBjaGFyIHNlcXVlbmNlcywgTUlOLUxFTiBvciBtb3JlIGJ5dGVzIGxvbmcsCi0JCXRoYXQgYXJlIGZvbGxvd2VkIGJ5IGEgTlVMIG9yIGEgbmV3bGluZS4gIERlZmF1bHQgaXMgNC4KLQotICAgLS1yYWRpeD17byx4LGR9Ci0gICAtdCB7byx4LGR9CVByaW50IHRoZSBvZmZzZXQgd2l0aGluIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZywKLQkJaW4gb2N0YWwvaGV4L2RlY2ltYWwuCi0KLSAgIC1vCQlMaWtlIC10by4gIChTb21lIG90aGVyIGltcGxlbWVudGF0aW9ucyBoYXZlIC1vIGxpa2UgLXRvLAotCQlvdGhlcnMgbGlrZSAtdGQuICBXZSBjaG9zZSBvbmUgYXJiaXRyYXJpbHkuKQotCi0gICAtLXRhcmdldD1CRkROQU1FCi0JCVNwZWNpZnkgYSBub24tZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQuCi0KLSAgIC0taGVscAotICAgLWgJCVByaW50IHRoZSB1c2FnZSBtZXNzYWdlIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCi0KLSAgIC0tdmVyc2lvbgotICAgLXYJCVByaW50IHRoZSBwcm9ncmFtIHZlcnNpb24gbnVtYmVyLgotCi0gICBXcml0dGVuIGJ5IFJpY2hhcmQgU3RhbGxtYW4gPHJtc0BnbnUuYWkubWl0LmVkdT4KLSAgIGFuZCBEYXZpZCBNYWNLZW56aWUgPGRqbUBnbnUuYWkubWl0LmVkdT4uICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpZmRlZiBpc2FzY2lpCi0jZGVmaW5lIGlzZ3JhcGhpYyhjKSAoaXNhc2NpaSAoYykgJiYgaXNwcmludCAoYykpCi0jZWxzZQotI2RlZmluZSBpc2dyYXBoaWMoYykgKGlzcHJpbnQgKGMpKQotI2VuZGlmCi0KLSNpZm5kZWYgZXJybm8KLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLQotLyogVGhlIEJGRCBzZWN0aW9uIGZsYWdzIHRoYXQgaWRlbnRpZnkgYW4gaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgREFUQV9GTEFHUyAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTKQotCi0vKiBSYWRpeCBmb3IgcHJpbnRpbmcgYWRkcmVzc2VzIChtdXN0IGJlIDgsIDEwIG9yIDE2KS4gICovCi1zdGF0aWMgaW50IGFkZHJlc3NfcmFkaXg7Ci0KLS8qIE1pbmltdW0gbGVuZ3RoIG9mIHNlcXVlbmNlIG9mIGdyYXBoaWMgY2hhcnMgdG8gdHJpZ2dlciBvdXRwdXQuICAqLwotc3RhdGljIGludCBzdHJpbmdfbWluOwotCi0vKiB0cnVlIG1lYW5zIHByaW50IGFkZHJlc3Mgd2l0aGluIGZpbGUgZm9yIGVhY2ggc3RyaW5nLiAgKi8KLXN0YXRpYyBib29sZWFuIHByaW50X2FkZHJlc3NlczsKLQotLyogdHJ1ZSBtZWFucyBwcmludCBmaWxlbmFtZSBmb3IgZWFjaCBzdHJpbmcuICAqLwotc3RhdGljIGJvb2xlYW4gcHJpbnRfZmlsZW5hbWVzOwotCi0vKiB0cnVlIG1lYW5zIGZvciBvYmplY3QgZmlsZXMgc2NhbiBvbmx5IHRoZSBkYXRhIHNlY3Rpb24uICAqLwotc3RhdGljIGJvb2xlYW4gZGF0YXNlY3Rpb25fb25seTsKLQotLyogdHJ1ZSBpZiB3ZSBmb3VuZCBhbiBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb24gaW4gdGhlIGN1cnJlbnQgZmlsZS4gICovCi1zdGF0aWMgYm9vbGVhbiBnb3RfYV9zZWN0aW9uOwotCi0vKiBUaGUgQkZEIG9iamVjdCBmaWxlIGZvcm1hdC4gICovCi1zdGF0aWMgY2hhciAqdGFyZ2V0OwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsiYWxsIiwgbm9fYXJndW1lbnQsIE5VTEwsICdhJ30sCi0gIHsicHJpbnQtZmlsZS1uYW1lIiwgbm9fYXJndW1lbnQsIE5VTEwsICdmJ30sCi0gIHsiYnl0ZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ24nfSwKLSAgeyJyYWRpeCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAndCd9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnVCd9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsICd2J30sCi0gIHtOVUxMLCAwLCBOVUxMLCAwfQotfTsKLQotc3RhdGljIHZvaWQgc3RyaW5nc19hX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gc3RyaW5nc19vYmplY3RfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN0cmluZ3NfZmlsZSBQQVJBTVMgKChjaGFyICpmaWxlKSk7Ci1zdGF0aWMgaW50IGludGVnZXJfYXJnIFBBUkFNUyAoKGNoYXIgKnMpKTsKLXN0YXRpYyB2b2lkIHByaW50X3N0cmluZ3MgUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZW5hbWUsIEZJTEUgKnN0cmVhbSwKLQkJCQkgIGZpbGVfcHRyIGFkZHJlc3MsIGludCBzdG9wX3BvaW50LAotCQkJCSAgaW50IG1hZ2ljY291bnQsIGNoYXIgKm1hZ2ljKSk7Ci1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICpzdHJlYW0sIGludCBzdGF0dXMpKTsKLQwKLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgb3B0YzsKLSAgaW50IGV4aXRfc3RhdHVzID0gMDsKLSAgYm9vbGVhbiBmaWxlc19naXZlbiA9IGZhbHNlOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotICBzdHJpbmdfbWluID0gLTE7Ci0gIHByaW50X2FkZHJlc3NlcyA9IGZhbHNlOwotICBwcmludF9maWxlbmFtZXMgPSBmYWxzZTsKLSAgZGF0YXNlY3Rpb25fb25seSA9IHRydWU7Ci0gIHRhcmdldCA9IE5VTEw7Ci0KLSAgd2hpbGUgKChvcHRjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJhZm46b3Q6djAxMjM0NTY3ODkiLAotCQkJICAgICAgbG9uZ19vcHRpb25zLCAoaW50ICopIDApKSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChvcHRjKQotCXsKLQljYXNlICdhJzoKLQkgIGRhdGFzZWN0aW9uX29ubHkgPSBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnZic6Ci0JICBwcmludF9maWxlbmFtZXMgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlICdoJzoKLQkgIHVzYWdlIChzdGRvdXQsIDApOwotCi0JY2FzZSAnbic6Ci0JICBzdHJpbmdfbWluID0gaW50ZWdlcl9hcmcgKG9wdGFyZyk7Ci0JICBpZiAoc3RyaW5nX21pbiA8IDEpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBpbnZhbGlkIG51bWJlciAlc1xuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUsIG9wdGFyZyk7Ci0JICAgICAgZXhpdCAoMSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnbyc6Ci0JICBwcmludF9hZGRyZXNzZXMgPSB0cnVlOwotCSAgYWRkcmVzc19yYWRpeCA9IDg7Ci0JICBicmVhazsKLQotCWNhc2UgJ3QnOgotCSAgcHJpbnRfYWRkcmVzc2VzID0gdHJ1ZTsKLQkgIGlmIChvcHRhcmdbMV0gIT0gJ1wwJykKLQkgICAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICBzd2l0Y2ggKG9wdGFyZ1swXSkKLQkgICAgewotCSAgICBjYXNlICdvJzoKLQkgICAgICBhZGRyZXNzX3JhZGl4ID0gODsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdkJzoKLQkgICAgICBhZGRyZXNzX3JhZGl4ID0gMTA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAneCc6Ci0JICAgICAgYWRkcmVzc19yYWRpeCA9IDE2OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnVCc6Ci0JICB0YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQotCWNhc2UgJ3YnOgotCSAgcHJpbnRfdmVyc2lvbiAoInN0cmluZ3MiKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnPyc6Ci0JICB1c2FnZSAoc3RkZXJyLCAxKTsKLQotCWRlZmF1bHQ6Ci0JICBpZiAoc3RyaW5nX21pbiA8IDApCi0JICAgIHN0cmluZ19taW4gPSBvcHRjOwotCSAgZWxzZQotCSAgICBzdHJpbmdfbWluID0gc3RyaW5nX21pbiAqIDEwICsgb3B0YyAtICcwJzsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKHN0cmluZ19taW4gPCAwKQotICAgIHN0cmluZ19taW4gPSA0OwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIGlmIChvcHRpbmQgPj0gYXJnYykKLSAgICB7Ci0gICAgICBkYXRhc2VjdGlvbl9vbmx5ID0gZmFsc2U7Ci0gICAgICBwcmludF9zdHJpbmdzICgie3N0YW5kYXJkIGlucHV0fSIsIHN0ZGluLCAwLCAwLCAwLCAoY2hhciAqKSBOVUxMKTsKLSAgICAgIGZpbGVzX2dpdmVuID0gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKDsgb3B0aW5kIDwgYXJnYzsgKytvcHRpbmQpCi0JewotCSAgaWYgKHN0cmNtcCAoYXJndltvcHRpbmRdLCAiLSIpID09IDApCi0JICAgIGRhdGFzZWN0aW9uX29ubHkgPSBmYWxzZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZpbGVzX2dpdmVuID0gdHJ1ZTsKLQkgICAgICBleGl0X3N0YXR1cyB8PSAoc3RyaW5nc19maWxlIChhcmd2W29wdGluZF0pID09IGZhbHNlKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGZpbGVzX2dpdmVuID09IGZhbHNlKQotICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCi0gIHJldHVybiAoZXhpdF9zdGF0dXMpOwotfQotDAotLyogU2NhbiBzZWN0aW9uIFNFQ1Qgb2YgdGhlIGZpbGUgQUJGRCwgd2hvc2UgcHJpbnRhYmxlIG5hbWUgaXMgRklMRS4KLSAgIElmIGl0IGNvbnRhaW5zIGluaXRpYWxpemVkIGRhdGEsCi0gICBzZXQgYGdvdF9hX3NlY3Rpb24nIGFuZCBwcmludCB0aGUgc3RyaW5ncyBpbiBpdC4gICovCi0KLXN0YXRpYyB2b2lkCi1zdHJpbmdzX2Ffc2VjdGlvbiAoYWJmZCwgc2VjdCwgZmlsZWFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdDsKLSAgICAgUFRSIGZpbGVhcmc7Ci17Ci0gIGNvbnN0IGNoYXIgKmZpbGUgPSAoY29uc3QgY2hhciAqKSBmaWxlYXJnOwotCi0gIGlmICgoc2VjdC0+ZmxhZ3MgJiBEQVRBX0ZMQUdTKSA9PSBEQVRBX0ZMQUdTKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3ogPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3QpOwotICAgICAgUFRSIG1lbSA9IHhtYWxsb2MgKHN6KTsKLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3QsIG1lbSwgKGZpbGVfcHRyKSAwLCBzeikpCi0JewotCSAgZ290X2Ffc2VjdGlvbiA9IHRydWU7Ci0JICBwcmludF9zdHJpbmdzIChmaWxlLCAoRklMRSAqKSBOVUxMLCBzZWN0LT5maWxlcG9zLCAwLCBzeiwgbWVtKTsKLQl9Ci0gICAgICBmcmVlIChtZW0pOwotICAgIH0KLX0KLQotLyogU2NhbiBhbGwgb2YgdGhlIHNlY3Rpb25zIGluIEZJTEUsIGFuZCBwcmludCB0aGUgc3RyaW5ncwotICAgaW4gdGhlIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbihzKS4KLQotICAgUmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwKLSAgIGZhbHNlIGlmIG5vdCAoc3VjaCBhcyBpZiBGSUxFIGlzIG5vdCBhbiBvYmplY3QgZmlsZSkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RyaW5nc19vYmplY3RfZmlsZSAoZmlsZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLXsKLSAgYmZkICphYmZkID0gYmZkX29wZW5yIChmaWxlLCB0YXJnZXQpOwotCi0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgewotICAgICAgLyogVHJlYXQgdGhlIGZpbGUgYXMgYSBub24tb2JqZWN0IGZpbGUuICAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGlzIGNhbGwgaXMgbWFpbmx5IGZvciBpdHMgc2lkZSBlZmZlY3Qgb2YgcmVhZGluZyBpbiB0aGUgc2VjdGlvbnMuCi0gICAgIFdlIGZvbGxvdyB0aGUgdHJhZGl0aW9uYWwgYmVoYXZpb3Igb2YgYHN0cmluZ3MnIGluIHRoYXQgd2UgZG9uJ3QKLSAgICAgY29tcGxhaW4gaWYgd2UgZG9uJ3QgcmVjb2duaXplIGEgZmlsZSB0byBiZSBhbiBvYmplY3QgZmlsZS4gICovCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBiZmRfY2xvc2UgKGFiZmQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBnb3RfYV9zZWN0aW9uID0gZmFsc2U7Ci0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgc3RyaW5nc19hX3NlY3Rpb24sIChQVFIpIGZpbGUpOwotCi0gIGlmICghYmZkX2Nsb3NlIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGZpbGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gZ290X2Ffc2VjdGlvbjsKLX0KLQotLyogUHJpbnQgdGhlIHN0cmluZ3MgaW4gRklMRS4gIFJldHVybiB0cnVlIGlmIG9rLCBmYWxzZSBpZiBhbiBlcnJvciBvY2N1cnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RyaW5nc19maWxlIChmaWxlKQotICAgICBjaGFyICpmaWxlOwotewotICAvKiBJZiB3ZSB3ZXJlbid0IHRvbGQgdG8gc2NhbiB0aGUgd2hvbGUgZmlsZSwKLSAgICAgdHJ5IHRvIG9wZW4gaXQgYXMgYW4gb2JqZWN0IGZpbGUgYW5kIG9ubHkgbG9vayBhdAotICAgICBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb25zLiAgSWYgdGhhdCBmYWlscywgZmFsbCBiYWNrIHRvIHRoZQotICAgICB3aG9sZSBmaWxlLiAgKi8KLSAgaWYgKCFkYXRhc2VjdGlvbl9vbmx5IHx8ICFzdHJpbmdzX29iamVjdF9maWxlIChmaWxlKSkKLSAgICB7Ci0gICAgICBGSUxFICpzdHJlYW07Ci0KLSAgICAgIHN0cmVhbSA9IGZvcGVuIChmaWxlLCAicmIiKTsKLSAgICAgIC8qIE5vdCBhbGwgc3lzdGVtcyBwZXJtaXQgInJiIiwgc28gdHJ5ICJyIiBpZiBpdCBmYWlsZWQuICAqLwotICAgICAgaWYgKHN0cmVhbSA9PSBOVUxMKQotCXN0cmVhbSA9IGZvcGVuIChmaWxlLCAiciIpOwotICAgICAgaWYgKHN0cmVhbSA9PSBOVUxMKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCSAgcGVycm9yIChmaWxlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHByaW50X3N0cmluZ3MgKGZpbGUsIHN0cmVhbSwgKGZpbGVfcHRyKSAwLCAwLCAwLCAoY2hhciAqKSAwKTsKLQotICAgICAgaWYgKGZjbG9zZSAoc3RyZWFtKSA9PSBFT0YpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0JICBwZXJyb3IgKGZpbGUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBGaW5kIHRoZSBzdHJpbmdzIGluIGZpbGUgRklMRU5BTUUsIHJlYWQgZnJvbSBTVFJFQU0uCi0gICBBc3N1bWUgdGhhdCBTVFJFQU0gaXMgcG9zaXRpb25lZCBzbyB0aGF0IHRoZSBuZXh0IGJ5dGUgcmVhZAotICAgaXMgYXQgYWRkcmVzcyBBRERSRVNTIGluIHRoZSBmaWxlLgotICAgU3RvcCByZWFkaW5nIGF0IGFkZHJlc3MgU1RPUF9QT0lOVCBpbiB0aGUgZmlsZSwgaWYgbm9uemVyby4KLQotICAgSWYgU1RSRUFNIGlzIE5VTEwsIGRvIG5vdCByZWFkIGZyb20gaXQuCi0gICBUaGUgY2FsbGVyIGNhbiBzdXBwbHkgYSBidWZmZXIgb2YgY2hhcmFjdGVycwotICAgdG8gYmUgcHJvY2Vzc2VkIGJlZm9yZSB0aGUgZGF0YSBpbiBTVFJFQU0uCi0gICBNQUdJQyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGFuZAotICAgTUFHSUNDT1VOVCBpcyBob3cgbWFueSBjaGFyYWN0ZXJzIGFyZSBpbiBpdC4KLSAgIFRob3NlIGNoYXJhY3RlcnMgY29tZSBhdCBhZGRyZXNzIEFERFJFU1MgYW5kIHRoZSBkYXRhIGluIFNUUkVBTSBmb2xsb3cuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3RyaW5ncyAoZmlsZW5hbWUsIHN0cmVhbSwgYWRkcmVzcywgc3RvcF9wb2ludCwgbWFnaWNjb3VudCwgbWFnaWMpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGZpbGVfcHRyIGFkZHJlc3M7Ci0gICAgIGludCBzdG9wX3BvaW50OwotICAgICBpbnQgbWFnaWNjb3VudDsKLSAgICAgY2hhciAqbWFnaWM7Ci17Ci0gIGNoYXIgKmJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmluZ19taW4gKyAxKTsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBmaWxlX3B0ciBzdGFydDsKLSAgICAgIGludCBpOwotICAgICAgaW50IGM7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGUgbmV4dCBgc3RyaW5nX21pbicgY2hhcnMgYXJlIGFsbCBncmFwaGljIGNoYXJzLiAgKi8KLSAgICB0cnlsaW5lOgotICAgICAgaWYgKHN0b3BfcG9pbnQgJiYgYWRkcmVzcyA+PSBzdG9wX3BvaW50KQotCWJyZWFrOwotICAgICAgc3RhcnQgPSBhZGRyZXNzOwotICAgICAgZm9yIChpID0gMDsgaSA8IHN0cmluZ19taW47IGkrKykKLQl7Ci0JICBpZiAobWFnaWNjb3VudCkKLQkgICAgewotCSAgICAgIG1hZ2ljY291bnQtLTsKLQkgICAgICBjID0gKm1hZ2ljKys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCSAgICAgIGMgPSBnZXRjIChzdHJlYW0pOwotCSAgICAgIGlmIChjID09IEVPRikKLQkJcmV0dXJuOwotCSAgICB9Ci0JICBhZGRyZXNzKys7Ci0JICBpZiAoIWlzZ3JhcGhpYyAoYykpCi0JICAgIC8qIEZvdW5kIGEgbm9uLWdyYXBoaWMuICBUcnkgYWdhaW4gc3RhcnRpbmcgd2l0aCBuZXh0IGNoYXIuICAqLwotCSAgICBnb3RvIHRyeWxpbmU7Ci0JICBidWZbaV0gPSBjOwotCX0KLQotICAgICAgLyogV2UgZm91bmQgYSBydW4gb2YgYHN0cmluZ19taW4nIGdyYXBoaWMgY2hhcmFjdGVycy4gIFByaW50IHVwCi0gICAgICAgICB0byB0aGUgbmV4dCBub24tZ3JhcGhpYyBjaGFyYWN0ZXIuICAqLwotCi0gICAgICBpZiAocHJpbnRfZmlsZW5hbWVzKQotCXByaW50ZiAoIiVzOiAiLCBmaWxlbmFtZSk7Ci0gICAgICBpZiAocHJpbnRfYWRkcmVzc2VzKQotCXN3aXRjaCAoYWRkcmVzc19yYWRpeCkKLQkgIHsKLQkgIGNhc2UgODoKLQkgICAgcHJpbnRmICgiJTdsbyAiLCAodW5zaWduZWQgbG9uZykgc3RhcnQpOwotCSAgICBicmVhazsKLQotCSAgY2FzZSAxMDoKLQkgICAgcHJpbnRmICgiJTdsZCAiLCAobG9uZykgc3RhcnQpOwotCSAgICBicmVhazsKLQotCSAgY2FzZSAxNjoKLQkgICAgcHJpbnRmICgiJTdseCAiLCAodW5zaWduZWQgbG9uZykgc3RhcnQpOwotCSAgICBicmVhazsKLQkgIH0KLQotICAgICAgYnVmW2ldID0gJ1wwJzsKLSAgICAgIGZwdXRzIChidWYsIHN0ZG91dCk7Ci0KLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIGlmIChtYWdpY2NvdW50KQotCSAgICB7Ci0JICAgICAgbWFnaWNjb3VudC0tOwotCSAgICAgIGMgPSAqbWFnaWMrKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmVhbSA9PSBOVUxMKQotCQlicmVhazsKLQkgICAgICBjID0gZ2V0YyAoc3RyZWFtKTsKLQkgICAgICBpZiAoYyA9PSBFT0YpCi0JCWJyZWFrOwotCSAgICB9Ci0JICBhZGRyZXNzKys7Ci0JICBpZiAoISBpc2dyYXBoaWMgKGMpKQotCSAgICBicmVhazsKLQkgIHB1dGNoYXIgKGMpOwotCX0KLQotICAgICAgcHV0Y2hhciAoJ1xuJyk7Ci0gICAgfQotfQotDAotLyogUGFyc2Ugc3RyaW5nIFMgYXMgYW4gaW50ZWdlciwgdXNpbmcgZGVjaW1hbCByYWRpeCBieSBkZWZhdWx0LAotICAgYnV0IGFsbG93aW5nIG9jdGFsIGFuZCBoZXggbnVtYmVycyBhcyBpbiBDLiAgKi8KLQotc3RhdGljIGludAotaW50ZWdlcl9hcmcgKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIGludCB2YWx1ZTsKLSAgaW50IHJhZGl4ID0gMTA7Ci0gIGNoYXIgKnAgPSBzOwotICBpbnQgYzsKLQotICBpZiAoKnAgIT0gJzAnKQotICAgIHJhZGl4ID0gMTA7Ci0gIGVsc2UgaWYgKCorK3AgPT0gJ3gnKQotICAgIHsKLSAgICAgIHJhZGl4ID0gMTY7Ci0gICAgICBwKys7Ci0gICAgfQotICBlbHNlCi0gICAgcmFkaXggPSA4OwotCi0gIHZhbHVlID0gMDsKLSAgd2hpbGUgKCgoYyA9ICpwKyspID49ICcwJyAmJiBjIDw9ICc5JykKLQkgfHwgKHJhZGl4ID09IDE2ICYmIChjICYgfjQwKSA+PSAnQScgJiYgKGMgJiB+NDApIDw9ICdaJykpCi0gICAgewotICAgICAgdmFsdWUgKj0gcmFkaXg7Ci0gICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0JdmFsdWUgKz0gYyAtICcwJzsKLSAgICAgIGVsc2UKLQl2YWx1ZSArPSAoYyAmIH40MCkgLSAnQSc7Ci0gICAgfQotCi0gIGlmIChjID09ICdiJykKLSAgICB2YWx1ZSAqPSA1MTI7Ci0gIGVsc2UgaWYgKGMgPT0gJ0InKQotICAgIHZhbHVlICo9IDEwMjQ7Ci0gIGVsc2UKLSAgICBwLS07Ci0KLSAgaWYgKCpwKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGludmFsaWQgaW50ZWdlciBhcmd1bWVudCAlc1xuIiksIHByb2dyYW1fbmFtZSwgcyk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIHZvaWQKLXVzYWdlIChzdHJlYW0sIHN0YXR1cykKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBpbnQgc3RhdHVzOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLVVzYWdlOiAlcyBbLWFmb3ZdIFstbiBtaW4tbGVuXSBbLW1pbi1sZW5dIFstdCB7byx4LGR9XSBbLV1cblwKLSAgICAgICBbLS1hbGxdIFstLXByaW50LWZpbGUtbmFtZV0gWy0tYnl0ZXM9bWluLWxlbl0gWy0tcmFkaXg9e28seCxkfV1cblwKLSAgICAgICBbLS10YXJnZXQ9YmZkbmFtZV0gWy0taGVscF0gWy0tdmVyc2lvbl0gZmlsZS4uLlxuIiksCi0JICAgcHJvZ3JhbV9uYW1lKTsKLSAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N0cmlwLjEgYi9iaW51dGlscy9zdHJpcC4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDg4MTdkLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3N0cmlwLjEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIHN0cmlwIDEgIjUgTm92ZW1iZXIgMTk5MSIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLXN0cmlwIFwtIERpc2NhcmQgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcy4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIHN0cmlwCi0uUkIgIltcfCIgXC1GXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtdGFyZ2V0PVxmSWJmZG5hbWVcZlAgIlx8XSIKLS5SQiAiW1x8IiBcLUlcIFxmSWJmZG5hbWVcZlJcIHxcIFxmQlwtXC1pbnB1dFwtdGFyZ2V0PVxmSWJmZG5hbWVcZlAgIlx8XSIKLS5SQiAiW1x8IiBcLU9cIFxmSWJmZG5hbWVcZlJcIHxcIFxmQlwtXC1vdXRwdXRcLXRhcmdldD1cZkliZmRuYW1lXGZQICJcfF0iCi0uUkIgIltcfCIgXC1SXCBcZklzZWN0aW9ubmFtZVxmUlwgfFwgXGZCXC1cLXJlbW92ZVwtc2VjdGlvbj1cZklzZWN0aW9ubmFtZVxmUCAiXHxdIgotLlJCICJbXHwiIFwtc1xmUlwgfFwgXGZCXC1cLXN0cmlwXC1hbGwgIlx8XSIKLS5SQiAiW1x8IiBcLVNcZlJcIHxcIFxmQlwtZ1xmUlwgfFwgXGZCXC1cLXN0cmlwXC1kZWJ1ZyAiXHxdIgotLlJCICJbXHwiIFwtXC1zdHJpcFwtdW5uZWVkZWRcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLXhcZlJcIHxcIFxmQlwtXC1kaXNjYXJkXC1hbGwgIlx8XSIKLS5SQiAiW1x8IiBcLVhcZlJcIHxcIFxmQlwtXC1kaXNjYXJkXC1sb2NhbHMgIlx8XSIKLS5SQiAiW1x8IiBcLUtcIFxmSXN5bWJvbG5hbWVcZlJcIHxcIFxmQlwtXC1rZWVwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLU5cIFxmSXN5bWJvbG5hbWVcZlJcIHxcIFxmQlwtXC1zdHJpcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWVcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLW9cIFxmSWZpbGVcZlxSICJcfF0iCi0uUkIgIltcfCIgXC1wXGZSXCB8XCBcZkJcLVwtcHJlc2VydmVcLWRhdGVzICJcfF0iCi0uUkIgIltcfCIgXC12XGZSXCB8XCBcZkJcLVwtdmVyYm9zZSAiXHxdIgotLlJCICJbXHwiIFwtVlxmUlwgfFwgXGZCXC1cLXZlcnNpb24gIlx8XSIKLS5SQiAiW1x8IiBcLVZcZlJcIHxcIFxmQlwtXC1oZWxwICJcfF0iCi0uSSBvYmpmaWxlXGMKLVwmLlx8Llx8LgotCi0uU0ggREVTQ1JJUFRJT04KLUdOVQotLkIgc3RyaXAKLWRpc2NhcmRzIGFsbCBzeW1ib2xzIGZyb20gdGhlIG9iamVjdCBmaWxlcwotLklSIG9iamZpbGUgLgotVGhlIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIG1heSBpbmNsdWRlIGFyY2hpdmVzLgotQXQgbGVhc3Qgb25lIG9iamVjdCBmaWxlIG11c3QgYmUgZ2l2ZW4uCi0KLS5QCi0uQiBzdHJpcAotbW9kaWZpZXMgdGhlIGZpbGVzIG5hbWVkIGluIGl0cyBhcmd1bWVudCwKLXJhdGhlciB0aGFuIHdyaXRpbmcgbW9kaWZpZWQgY29waWVzIHVuZGVyIGRpZmZlcmVudCBuYW1lcy4KLQotLlNIIE9QVElPTlMKLS5UUAotLkIgIlwtRiBcZkliZmRuYW1lIgotLlRQCi0uQiAiXC1cLXRhcmdldD1cZkliZmRuYW1lIgotVHJlYXQgdGhlIG9yaWdpbmFsIFxmSW9iamZpbGVcZlAgYXMgYSBmaWxlIHdpdGggdGhlIG9iamVjdAotY29kZSBmb3JtYXQgXGZJYmZkbmFtZVxmUCwgYW5kIHJld3JpdGUgaXQgaW4gdGhlIHNhbWUgZm9ybWF0LgotCi0uVFAKLS5CIFwtXC1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0bwotLkIgc3RyaXAKLWFuZCBleGl0LgotCi0uVFAKLS5CICJcLUkgXGZJYmZkbmFtZQotLlRQCi0uQiAiXC1cLWlucHV0XC10YXJnZXQ9XGZJYmZkbmFtZSIKLVRyZWF0IHRoZSBvcmlnaW5hbCBcZklvYmpmaWxlXGZQIGFzIGEgZmlsZSB3aXRoIHRoZSBvYmplY3QKLWNvZGUgZm9ybWF0IFxmSWJmZG5hbWVcZlAuCi0KLS5UUAotLkIgIlwtTyBcZkliZmRuYW1lXGZQIgotLlRQCi0uQiAiXC1cLW91dHB1dFwtdGFyZ2V0PVxmSWJmZG5hbWUiCi1SZXBsYWNlIFxmSW9iamZpbGVcZlAgd2l0aCBhIGZpbGUgaW4gdGhlIG91dHB1dCBmb3JtYXQgXGZJYmZkbmFtZVxmUC4KLQotLlRQCi0uQiAiXC1SIFxmSXNlY3Rpb25uYW1lXGZQIgotLlRQCi0uQiAiXC1cLXJlbW92ZVwtc2VjdGlvbj1cZklzZWN0aW9ubmFtZSIKLVJlbW92ZSB0aGUgbmFtZWQgc2VjdGlvbiBmcm9tIHRoZSBmaWxlLiAgVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUKLXRoYW4gb25jZS4gIE5vdGUgdGhhdCB1c2luZyB0aGlzIG9wdGlvbiBpbmFwcHJvcHJpYXRlbHkgbWF5IG1ha2UgdGhlCi1vYmplY3QgZmlsZSB1bnVzYWJsZS4KLQotLlRQCi0uQiBcLXMKLS5UUAotLkIgXC1cLXN0cmlwXC1hbGwKLVJlbW92ZSBhbGwgc3ltYm9scy4KLQotLlRQCi0uQiBcLVMKLS5UUAotLkIgXC1nCi0uVFAKLS5CIFwtXC1zdHJpcFwtZGVidWcKLVJlbW92ZSBkZWJ1Z2dpbmcgc3ltYm9scyBvbmx5LgotCi0uVFAKLS5CIFwtXC1zdHJpcFwtdW5uZWVkZWQKLVN0cmlwIGFsbCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBuZWVkZWQgZm9yIHJlbG9jYXRpb24gcHJvY2Vzc2luZy4KLQotLlRQCi0uQiBcLU4gXGZJc3ltYm9sbmFtZVxmUgotLlRQCi0uQiBcLVwtc3RyaXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lCi1SZW1vdmUgc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgZnJvbSB0aGUgc291cmNlIGZpbGUuIFRoaXMgb3B0aW9uCi1tYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UsIGFuZCBtYXkgYmUgY29tYmluZWQgd2l0aCBvdGhlciBzdHJpcAotb3B0aW9ucy4KLQotLlRQCi0uQiBcLW8gXGZJZmlsZVxmUgotUHV0IHRoZSBzdHJpcHBlZCBvdXRwdXQgaW4gXGZJZmlsZVxmUiwgcmF0aGVyIHRoYW4gcmVwbGFjaW5nIHRoZQotZXhpc3RpbmcgZmlsZS4gIFdoZW4gdGhpcyBhcmd1bWVudCBpcyB1c2VkLCBvbmx5IG9uZSBcZklvYmpmaWxlXGZSCi1hcmd1bWVudCBtYXkgYmUgc3BlY2lmaWVkLgotCi0uVFAKLS5CIFwtcAotLlRQCi0uQiBcLVwtcHJlc2VydmUtZGF0ZXMKLVByZXNlcnZlIHRoZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiBkYXRlcyBvZiB0aGUgZmlsZS4KLQotLlRQCi0uQiBcLXgKLS5UUAotLkIgXC1cLWRpc2NhcmRcLWFsbAotUmVtb3ZlIG5vbi1nbG9iYWwgc3ltYm9scy4KLQotLlRQCi0uQiBcLVgKLS5UUAotLkIgXC1cLWRpc2NhcmRcLWxvY2FscwotUmVtb3ZlIGNvbXBpbGVyLWdlbmVyYXRlZCBsb2NhbCBzeW1ib2xzLgotKFRoZXNlIHVzdWFsbHkgc3RhcnQgd2l0aCBgYEwnJyBvciBgYC4nJy4pCi0KLS5UUAotLkIgXC1LIFxmSXN5bWJvbG5hbWVcZlIsIFxmQlwtXC1rZWVwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQotQ29weSBvbmx5IHN5bWJvbCBcZklzeW1ib2xuYW1lXGZQIGZyb20gdGhlIHNvdXJjZSBmaWxlLiBUaGlzIG9wdGlvbgotbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotCi0uVFAKLS5CIFwtTiBcZklzeW1ib2xuYW1lXGZSLCBcZkJcLVwtc3RyaXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lCi1EbyBub3QgY29weSBzeW1ib2wgXGZJc3ltYm9sbmFtZVxmUCBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBvcHRpb24KLW1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZSwgYW5kIG1heSBiZSBjb21iaW5lZCB3aXRoIHN0cmlwIG9wdGlvbnMKLW90aGVyIHRoYW4gXGZCXC1LXGZSLgotCi0uVFAKLS5CIFwtdgotLlRQCi0uQiBcLVwtdmVyYm9zZQotVmVyYm9zZSBvdXRwdXQ6IGxpc3QgYWxsIG9iamVjdCBmaWxlcyBtb2RpZmllZC4gIEluIHRoZSBjYXNlIG9mCi1hcmNoaXZlcywKLS5CICJzdHJpcCBcLXYiCi1saXN0cyBhbGwgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZS4KLQotLlRQCi0uQiBcLVYKLS5UUAotLkIgXC1cLXZlcnNpb24KLVNob3cgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBcZkJzdHJpcFxmUCBhbmQgZXhpdC4KLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIiAKLWVudHJ5IGluIAotLkJSIGluZm8gOwotLklSICJUaGUgR05VIEJpbmFyeSBVdGlsaXRpZXMiICwKLVJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKS4KLQotLlNIIENPUFlJTkcKLUNvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvc3lzZHVtcC5jIGIvYmludXRpbHMvc3lzZHVtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODIxZThjLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3N5c2R1bXAuYworKysgL2Rldi9udWxsCkBAIC0xLDc5MCArMCwwIEBACi0vKiBTeXNyb2ZmIG9iamVjdCBmb3JtYXQgZHVtcGVyLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+LgotCi0gVGhpcyBwcm9ncmFtIHJlYWRzIGEgU1lTUk9GRiBvYmplY3QgZmlsZSBhbmQgcHJpbnRzIGl0IGluIGFuCi0gYWxtb3N0IGh1bWFuIHJlYWRhYmxlIGZvcm0gdG8gc3Rkb3V0LiAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8bGliaWJlcnR5Lmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSAic3lzcm9mZi5oIgotCi0jZGVmaW5lIFBST0dSQU1fVkVSU0lPTiAiMS4wIgotCi1zdGF0aWMgaW50IGR1bXAgPSAxOwotc3RhdGljIGludCBzZWdtZW50ZWRfcDsKLXN0YXRpYyBpbnQgY29kZTsKLXN0YXRpYyBpbnQgYWRkcnNpemUgPSA0Owotc3RhdGljIEZJTEUgKmZpbGU7Ci0KLWNoYXIgKgotZ2V0Q0hBUlMgKHB0ciwgaWR4LCBzaXplLCBtYXgpCi0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICAgaW50ICppZHg7Ci0gICAgIGludCBzaXplOwotICAgICBpbnQgbWF4OwotewotICBpbnQgb2MgPSAqaWR4IC8gODsKLSAgY2hhciAqcjsKLSAgaW50IGIgPSBzaXplOwotICBpZiAoYiA+PSBtYXgpCi0gICAgewotICAgICAgcmV0dXJuICIqdW5kZWZpbmVkKiI7Ci0gICAgfQotCi0gIGlmIChiID09IDApCi0gICAgewotICAgICAgLyogR290IHRvIHdvcmsgb3V0IHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBmcm9tIHNlbGYgKi8KLSAgICAgIGIgPSBwdHJbb2MrK107Ci0gICAgICAoKmlkeCkgKz0gODsKLSAgICB9Ci0KLSAgKmlkeCArPSBiICogODsKLSAgciA9IHhjYWxsb2MgKGIgKyAxLCAxKTsKLSAgbWVtY3B5IChyLCBwdHIgKyBvYywgYik7Ci0gIHJbYl0gPSAwOwotICByZXR1cm4gcjsKLX0KLQotc3RhdGljIHZvaWQKLWRoIChwdHIsIHNpemUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBpOwotICBpbnQgajsKLSAgaW50IHNwYW4gPSAxNjsKLQotICBwcmludGYgKCJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gc3BhbikKLSAgICB7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgc3BhbjsgaisrKQotCXsKLQkgIGlmIChqICsgaSA8IHNpemUpIAotCSAgICBwcmludGYgKCIlMDJ4ICIsIHB0cltpICsgal0pOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHByaW50ZiAoIiAgICIpOwotCX0KLQotICAgICAgZm9yIChqID0gMDsgaiA8IHNwYW4gJiYgaiArIGkgPCBzaXplOyBqKyspCi0JewotCSAgaW50IGMgPSBwdHJbaSArIGpdOwotCSAgaWYgKGMgPCAzMiB8fCBjID4gMTI3KQotCSAgICBjID0gJy4nOwotCSAgcHJpbnRmICgiJWMiLCBjKTsKLQl9Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLX0KLQotaW50Ci1maWxsdXAgKHB0cikKLSAgICAgY2hhciAqcHRyOwotewotICBpbnQgc2l6ZTsKLSAgaW50IHN1bTsKLSAgaW50IGk7Ci0gIHNpemUgPSBnZXRjIChmaWxlKSAtIDI7Ci0gIGZyZWFkIChwdHIsIDEsIHNpemUsIGZpbGUpOwotICBzdW0gPSBjb2RlICsgc2l6ZSArIDI7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgc3VtICs9IHB0cltpXTsKLSAgICB9Ci0KLSAgaWYgKChzdW0gJiAweGZmKSAhPSAweGZmKQotICAgIHsKLSAgICAgIHByaW50ZiAoIlNVTSBJUyAleFxuIiwgc3VtKTsKLSAgICB9Ci0gIGlmIChkdW1wKQotICAgIGRoIChwdHIsIHNpemUpOwotCi0gIHJldHVybiBzaXplIC0gMTsKLX0KLQotYmFycmF5Ci1nZXRCQVJSQVkgKHB0ciwgaWR4LCBkc2l6ZSwgbWF4KQotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIGludCAqaWR4OwotICAgICBpbnQgZHNpemU7Ci0gICAgIGludCBtYXg7Ci17Ci0gIGJhcnJheSByZXM7Ci0gIGludCBpOwotICBpbnQgYnl0ZSA9ICppZHggLyA4OwotICBpbnQgc2l6ZSA9IHB0cltieXRlKytdOwotICByZXMubGVuID0gc2l6ZTsKLSAgcmVzLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jIChzaXplKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICByZXMuZGF0YVtpXSA9IHB0cltieXRlKytdOwotICAgIH0KLSAgcmV0dXJuIHJlczsKLX0KLQotaW50Ci1nZXRJTlQgKHB0ciwgaWR4LCBzaXplLCBtYXgpCi0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICAgaW50ICppZHg7Ci0gICAgIGludCBzaXplOwotICAgICBpbnQgbWF4OwotewotICBpbnQgbiA9IDA7Ci0gIGludCBieXRlID0gKmlkeCAvIDg7Ci0KLSAgaWYgKGJ5dGUgPj0gbWF4KQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKHNpemUgPT0gLTIpCi0gICAgc2l6ZSA9IGFkZHJzaXplOwotICBpZiAoc2l6ZSA9PSAtMSkKLSAgICBzaXplID0gMDsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIDE6Ci0gICAgICBuID0gKHB0cltieXRlXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBuID0gKHB0cltieXRlICsgMF0gPDwgOCkgKyBwdHJbYnl0ZSArIDFdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgbiA9IChwdHJbYnl0ZSArIDBdIDw8IDI0KSArIChwdHJbYnl0ZSArIDFdIDw8IDE2KSArIChwdHJbYnl0ZSArIDJdIDw8IDgpICsgKHB0cltieXRlICsgM10pOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgKmlkeCArPSBzaXplICogODsKLSAgcmV0dXJuIG47Ci19Ci0KLWludAotZ2V0QklUUyAocHRyLCBpZHgsIHNpemUsIG1heCkKLSAgICAgY2hhciAqcHRyOwotICAgICBpbnQgKmlkeDsKLSAgICAgaW50IHNpemUsIG1heDsKLXsKLSAgaW50IGJ5dGUgPSAqaWR4IC8gODsKLSAgaW50IGJpdCA9ICppZHggJSA4OwotCi0gIGlmIChieXRlID49IG1heCkKLSAgICByZXR1cm4gMDsKLQotICAqaWR4ICs9IHNpemU7Ci0KLSAgcmV0dXJuIChwdHJbYnl0ZV0gPj4gKDggLSBiaXQgLSBzaXplKSkgJiAoKDEgPDwgc2l6ZSkgLSAxKTsKLX0KLQotc3RhdGljIHZvaWQKLWl0aGVhZGVyIChuYW1lLCBjb2RlKQotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgY29kZTsKLXsKLSAgcHJpbnRmICgiXG4lcyAweCUwMnhcbiIsIG5hbWUsIGNvZGUpOwotfQotCi1zdGF0aWMgaW50IGluZGVudDsKLXN0YXRpYyB2b2lkCi1wICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCi0gICAgewotICAgICAgcHJpbnRmICgifCAiKTsKLSAgICB9Ci0gIHByaW50ZiAoIj4gIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi10YWJvdXQgKCkKLXsKLSAgcCAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXBiYXJyYXkgKHkpCi0gICAgIGJhcnJheSAqeTsKLXsKLSAgaW50IHg7Ci0gIHByaW50ZiAoIiVkICgiLCB5LT5sZW4pOwotICBmb3IgKHggPSAwOyB4IDwgeS0+bGVuOyB4KyspCi0gICAgewotICAgICAgcHJpbnRmICgiKCUwMnggJWMpIiwgeS0+ZGF0YVt4XSwgaXNwcmludCAoeS0+ZGF0YVt4XSkgPyB5LT5kYXRhW3hdIDogJy4nKTsKLSAgICB9Ci0gIHByaW50ZiAoIilcbiIpOwotfQotCi0jZGVmaW5lIFNZU1JPRkZfUFJJTlQKLSNkZWZpbmUgU1lTUk9GRl9TV0FQX0lOCi0KLSNpbmNsdWRlICJzeXNyb2ZmLmMiCi0KLS8qIAotICogRklYTUU6IHN5c2luZm8sIHdoaWNoIGdlbmVyYXRlcyBzeXNyb2ZmLltjaF0gZnJvbSBzeXNyb2ZmLmluZm8sIGNhbid0Ci0gKiBoYWNrIHRoZSBzcGVjaWFsIGNhc2Ugb2YgdGhlIHRyIGJsb2NrLCB3aGljaCBoYXMgbm8gY29udGVudHMuICBTbyB3ZQotICogaW1wbGVtZW50IG91ciBvd24gZnVuY3Rpb25zIGZvciByZWFkaW5nIGluIGFuZCBwcmludGluZyBvdXQgdGhlIHRyCi0gKiBibG9jay4KLSAqLwotCi0jZGVmaW5lIElUX3RyX0NPREUJMHg3Zgotdm9pZAotc3lzcm9mZl9zd2FwX3RyX2luKCkKLXsKLQljaGFyIHJhd1syNTVdOwotCi0JbWVtc2V0KHJhdywgMCwgMjU1KTsKLQlmaWxsdXAocmF3KTsKLX0KLQotdm9pZAotc3lzcm9mZl9wcmludF90cl9vdXQoKQotewotCWl0aGVhZGVyKCJ0ciIsIElUX3RyX0NPREUpOwotfQotCi1zdGF0aWMgaW50Ci1nZXRvbmUgKHR5cGUpCi0gICAgIGludCB0eXBlOwotewotICBpbnQgYyA9IGdldGMgKGZpbGUpOwotICBjb2RlID0gYzsKLQotICBpZiAoKGMgJiAweDdmKSAhPSB0eXBlKQotICAgIHsKLSAgICAgIHVuZ2V0YyAoYywgZmlsZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgc3dpdGNoIChjICYgMHg3ZikKLSAgICB7Ci0gICAgY2FzZSBJVF9jc19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9jcyBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfY3NfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9jc19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rsbl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kbG4gZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rsbl9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rsbl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2hkX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2hkIGR1bW15OwotCXN5c3JvZmZfc3dhcF9oZF9pbiAoJmR1bW15KTsKLQlhZGRyc2l6ZSA9IGR1bW15LmFmbDsKLQlzeXNyb2ZmX3ByaW50X2hkX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZGFyX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RhciBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZGFyX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZGFyX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZHN5X0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RzeSBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZHN5X2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZHN5X291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZGZwX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RmcCBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZGZwX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZGZwX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZHNvX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RzbyBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZHNvX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZHNvX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZHB0X0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RwdCBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZHB0X2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZHB0X291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZGVuX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RlbiBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZGVuX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZGVuX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZGJ0X0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RidCBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZGJ0X2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZGJ0X291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZHR5X0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2R0eSBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZHR5X2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZHR5X291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfdW5fQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfdW4gZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX3VuX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfdW5fb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9zY19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9zYyBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfc2NfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9zY19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2VyX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2VyIGR1bW15OwotCXN5c3JvZmZfc3dhcF9lcl9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2VyX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZWRfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZWQgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2VkX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZWRfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9zaF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9zaCBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfc2hfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9zaF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX29iX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX29iIGR1bW15OwotCXN5c3JvZmZfc3dhcF9vYl9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X29iX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfcmxfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfcmwgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX3JsX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfcmxfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kdV9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kdSBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZHVfaW4gKCZkdW1teSk7Ci0KLQlzeXNyb2ZmX3ByaW50X2R1X291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZHVzX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2R1cyBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZHVzX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZHVzX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZHVsX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2R1bCBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZHVsX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZHVsX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZHNzX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RzcyBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZHNzX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZHNzX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfaHNfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfaHMgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2hzX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfaHNfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kcHNfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZHBzIGR1bW15OwotCXN5c3JvZmZfc3dhcF9kcHNfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9kcHNfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF90cl9DT0RFOgotICAgICAgewotCXN5c3JvZmZfc3dhcF90cl9pbiAoKTsKLQlzeXNyb2ZmX3ByaW50X3RyX291dCAoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZGRzX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RkcyBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZGRzX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZGRzX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwcmludGYgKCJHT1QgQSAleFxuIiwgYyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLW9wdCAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIHJldHVybiBnZXRvbmUgKHgpOwotfQotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vIGxvbmdlciB1c2VkLiAgKi8KLQotc3RhdGljIHZvaWQKLXVuaXRfaW5mb19saXN0ICgpCi17Ci0gIHdoaWxlIChvcHQgKElUX3VuX0NPREUpKQotICAgIHsKLSAgICAgIGdldG9uZSAoSVRfdXNfQ09ERSk7Ci0KLSAgICAgIHdoaWxlIChnZXRvbmUgKElUX3NjX0NPREUpKQotCWdldG9uZSAoSVRfc3NfQ09ERSk7Ci0KLSAgICAgIHdoaWxlIChnZXRvbmUgKElUX2VyX0NPREUpKQotCTsKLQotICAgICAgd2hpbGUgKGdldG9uZSAoSVRfZWRfQ09ERSkpCi0JOwotICAgIH0KLX0KLQotI2VuZGlmCi0KLSNpZiAwCi0KLS8qIFRoaXMgaXMgbm8gbG9uZ2VyIHVzZWQuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqZWN0X2JvZHlfbGlzdCAoKQotewotICB3aGlsZSAoZ2V0b25lIChJVF9zaF9DT0RFKSkKLSAgICB7Ci0gICAgICB3aGlsZSAoZ2V0b25lIChJVF9vYl9DT0RFKSkKLQk7Ci0gICAgICB3aGlsZSAoZ2V0b25lIChJVF9ybF9DT0RFKSkKLQk7Ci0gICAgfQotfQotCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLW11c3QgKHgpCi0gICAgIGludCB4OwotewotICBpZiAoIWdldG9uZSAoeCkpCi0gICAgewotICAgICAgcHJpbnRmICgiV0FOVEVEICV4ISFcbiIsIHgpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXRhYiAoaSwgcykKLSAgICAgaW50IGk7Ci0gICAgIGNoYXIgKnM7Ci17Ci0gIGluZGVudCArPSBpOwotICBpZiAocykKLSAgICB7Ci0gICAgICBwICgpOwotICAgICAgcHJpbnRmIChzKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBkZXJpdmVkX3R5cGUgKCk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3N5bWJvbF9pbmZvICgpCi17Ci0gIHRhYiAoMSwgIlNZTUJPTCBJTkZPIik7Ci0gIHdoaWxlIChvcHQgKElUX2RzeV9DT0RFKSkKLSAgICB7Ci0gICAgICBpZiAob3B0IChJVF9kdHlfQ09ERSkpCi0JewotCSAgbXVzdCAoSVRfZGJ0X0NPREUpOwotCSAgZGVyaXZlZF90eXBlICgpOwotCSAgbXVzdCAoSVRfZHR5X0NPREUpOwotCX0KLSAgICB9Ci0gIHRhYiAoLTEsICIiKTsKLX0KLQotc3RhdGljIHZvaWQKLWRlcml2ZWRfdHlwZSAoKQotewotICB0YWIgKDEsICJERVJJVkVEIFRZUEUiKTsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaWYgKG9wdCAoSVRfZHBwX0NPREUpKQotCXsKLQkgIGR1bXBfc3ltYm9sX2luZm8gKCk7Ci0JICBtdXN0IChJVF9kcHBfQ09ERSk7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kZnBfQ09ERSkpCi0JewotCSAgZHVtcF9zeW1ib2xfaW5mbyAoKTsKLQkgIG11c3QgKElUX2RmcF9DT0RFKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcHQgKElUX2Rlbl9DT0RFKSkKLQl7Ci0JICBkdW1wX3N5bWJvbF9pbmZvICgpOwotCSAgbXVzdCAoSVRfZGVuX0NPREUpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZGVuX0NPREUpKQotCXsKLQkgIGR1bXBfc3ltYm9sX2luZm8gKCk7Ci0JICBtdXN0IChJVF9kZW5fQ09ERSk7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kZHNfQ09ERSkpCi0JewotCSAgZHVtcF9zeW1ib2xfaW5mbyAoKTsKLQkgIG11c3QgKElUX2Rkc19DT0RFKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcHQgKElUX2Rhcl9DT0RFKSkKLQl7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kcHRfQ09ERSkpCi0JewotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZHVsX0NPREUpKQotCXsKLQl9Ci0gICAgICBlbHNlIGlmIChvcHQgKElUX2RzZV9DT0RFKSkKLQl7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kb3RfQ09ERSkpCi0JewotCX0KLSAgICAgIGVsc2UKLQlicmVhazsKLSAgICB9Ci0KLSAgdGFiICgtMSwgIiIpOwotfQotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vIGxvbmdlciB1c2VkLiAgKi8KLQotc3RhdGljIHZvaWQKLXByb2dyYW1fc3RydWN0dXJlICgpCi17Ci0gIHRhYiAoMSwgIlBST0dSQU0gU1RSVUNUVVJFIik7Ci0gIHdoaWxlIChvcHQgKElUX2Rwc19DT0RFKSkKLSAgICB7Ci0gICAgICBtdXN0IChJVF9kc29fQ09ERSk7Ci0gICAgICBvcHQgKElUX2Rzc19DT0RFKTsKLSAgICAgIGR1bXBfc3ltYm9sX2luZm8gKCk7Ci0gICAgICBtdXN0IChJVF9kcHNfQ09ERSk7Ci0gICAgfQotICB0YWIgKC0xLCAiIik7Ci19Ci0KLSNlbmRpZgotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vIGxvbmdlciB1c2VkLiAgKi8KLQotc3RhdGljIHZvaWQKLWRlYnVnX2xpc3QgKCkKLXsKLSAgdGFiICgxLCAiREVCVUcgTElTVCIpOwotCi0gIG11c3QgKElUX2R1X0NPREUpOwotICBvcHQgKElUX2R1c19DT0RFKTsKLSAgcHJvZ3JhbV9zdHJ1Y3R1cmUgKCk7Ci0gIG11c3QgKElUX2Rsbl9DT0RFKTsKLQotICB0YWIgKC0xLCAiIik7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotbW9kdWxlICgpCi17Ci0gIGludCBjID0gMDsKLSAgaW50IGwgPSAwOwotCi0gIHRhYiAoMSwgIk1PRFVMRSoqKlxuIik7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBjID0gZ2V0YyAoZmlsZSk7Ci0gICAgICB1bmdldGMgKGMsIGZpbGUpOwotCi0gICAgICBjICY9IDB4N2Y7Ci0gICAgfQotICB3aGlsZSAoZ2V0b25lIChjKSAmJiBjICE9IElUX3RyX0NPREUpOwotCi0jaWYgMAotICBtdXN0IChJVF9jc19DT0RFKTsKLSAgbXVzdCAoSVRfaGRfQ09ERSk7Ci0gIG9wdCAoSVRfaHNfQ09ERSk7Ci0KLSAgdW5pdF9pbmZvX2xpc3QgKCk7Ci0gIG9iamVjdF9ib2R5X2xpc3QgKCk7Ci0gIGRlYnVnX2xpc3QgKCk7Ci0KLSAgbXVzdCAoSVRfdHJfQ09ERSk7Ci0jZW5kaWYKLSAgdGFiICgtMSwgIiIpOwotCi0gIGMgPSBnZXRjIChmaWxlKTsKLSAgd2hpbGUgKGMgIT0gRU9GKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiUwMnggIiwgYyk7Ci0gICAgICBsKys7Ci0gICAgICBpZiAobCA9PSAzMikKLQl7Ci0JICBwcmludGYgKCJcbiIpOwotCSAgbCA9IDA7Ci0JfQotICAgICAgYyA9IGdldGMgKGZpbGUpOwotICAgIH0KLX0KLQotY2hhciAqcHJvZ3JhbV9uYW1lOwotCi1zdGF0aWMgdm9pZAotc2hvd191c2FnZSAoZmlsZSwgc3RhdHVzKQotICAgICBGSUxFICpmaWxlOwotICAgICBpbnQgc3RhdHVzOwotewotICBmcHJpbnRmIChmaWxlLCBfKCJVc2FnZTogJXMgWy1oVl0gaW4tZmlsZVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zaG93X2hlbHAgKCkKLXsKLSAgcHJpbnRmIChfKCIlczogUHJpbnQgYSBodW1hbiByZWFkYWJsZSBpbnRlcnByZXRhdGlvbiBvZiBhIFNZU1JPRkYgb2JqZWN0IGZpbGVcbiIpLAotCSAgcHJvZ3JhbV9uYW1lKTsKLSAgc2hvd191c2FnZSAoc3Rkb3V0LCAwKTsKLX0KLQotaW50Ci1tYWluIChhYywgYXYpCi0gICAgIGludCBhYzsKLSAgICAgY2hhciAqKmF2OwotewotICBjaGFyICppbnB1dF9maWxlID0gTlVMTDsKLSAgaW50IG9wdDsKLSAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotICB7Ci0gICAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJ30sCi0gICAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICdWJ30sCi0gICAge05VTEwsIG5vX2FyZ3VtZW50LCAwLCAwfQotICB9OwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICB3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nIChhYywgYXYsICJoViIsIGxvbmdfb3B0aW9ucywgKGludCAqKSBOVUxMKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAob3B0KQotCXsKLQljYXNlICdoJzoKLQkgIHNob3dfaGVscCAoKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JY2FzZSAnVic6Ci0JICBwcmludGYgKF8oIkdOVSAlcyB2ZXJzaW9uICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBQUk9HUkFNX1ZFUlNJT04pOwotCSAgZXhpdCAoMCk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCWNhc2UgMDoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBzaG93X3VzYWdlIChzdGRlcnIsIDEpOwotCSAgLypOT1RSRUFDSEVEKi8KLQl9Ci0gICAgfQotCi0gIC8qIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIG1heSBiZSBuYW1lZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLQotICBpZiAob3B0aW5kIDwgYWMpCi0gICAgewotICAgICAgaW5wdXRfZmlsZSA9IGF2W29wdGluZF07Ci0gICAgfQotCi0gIGlmICghaW5wdXRfZmlsZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZFxuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZmlsZSA9IGZvcGVuIChpbnB1dF9maWxlLCBGT1BFTl9SQik7Ci0gIGlmICghZmlsZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBjYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICVzXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lLCBpbnB1dF9maWxlKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBtb2R1bGUgKCk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvc3lzaW5mby55IGIvYmludXRpbHMvc3lzaW5mby55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWE4NzM3Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3N5c2luZm8ueQorKysgL2Rldi9udWxsCkBAIC0xLDQxNSArMCwwIEBACi0lewotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLWV4dGVybiBjaGFyICp3b3JkOwotZXh0ZXJuIGNoYXIgd3JpdGVjb2RlOwotZXh0ZXJuIGludCBudW1iZXI7Ci1leHRlcm4gaW50IHVuaXQ7Ci1jaGFyIG5pY2VfbmFtZVsxMDAwXTsKLWNoYXIgKml0OwotaW50IHNvZmFyOwotaW50IHdpZHRoOwotaW50IGNvZGU7Ci1jaGFyICogcmVwZWF0OwotY2hhciAqb2xkcmVwZWF0OwotY2hhciAqbmFtZTsKLWludCByZGVwdGg7Ci1jaGFyICpsb29wIFtdID0geyIiLCJuIiwibSIsIi8qQkFEKi8ifTsKLWNoYXIgKm5hbWVzW10gPSB7IiAiLCJbbl0iLCJbbl1bbV0ifTsKLWNoYXIgKnBuYW1lc1tdPSB7IiIsIioiLCIqKiJ9OwotJX0KLQotCi0ldW5pb24gewotIGludCBpOwotIGNoYXIgKnM7Ci19IAotJXRva2VuIENPTkQKLSV0b2tlbiBSRVBFQVQKLSV0b2tlbiAnKCcgJyknCi0ldG9rZW4gPHM+IFRZUEUKLSV0b2tlbiA8cz4gTkFNRQotJXRva2VuIDxpPiBOVU1CRVIgVU5JVAotJXR5cGUgPGk+IGF0dHJfc2l6ZSAKLSV0eXBlIDxzPiBhdHRyX2Rlc2MgYXR0cl9pZCBhdHRyX3R5cGUKLSUlCi0KLXRvcDogIHsKLSAgc3dpdGNoICh3cml0ZWNvZGUpCi0gICAgewotICAgIGNhc2UgJ2knOgotICAgICAgcHJpbnRmKCIjaWZkZWYgU1lTUk9GRl9TV0FQX0lOXG4iKTsKLSAgICAgIGJyZWFrOyAKLSAgICBjYXNlICdwJzoKLSAgICAgIHByaW50ZigiI2lmZGVmIFNZU1JPRkZfcFxuIik7Ci0gICAgICBicmVhazsgCi0gICAgY2FzZSAnZCc6Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdnJzoKLSAgICAgIHByaW50ZigiI2lmZGVmIFNZU1JPRkZfU1dBUF9PVVRcbiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYyc6Ci0gICAgICBwcmludGYoIiNpZmRlZiBTWVNST0ZGX1BSSU5UXG4iKTsKLSAgICAgIHByaW50ZigiI2luY2x1ZGUgPHN0ZGlvLmg+XG4iKTsKLSAgICAgIHByaW50ZigiI2luY2x1ZGUgPHN0ZGxpYi5oPlxuIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gfSAKLWl0X2xpc3QgewotICBzd2l0Y2ggKHdyaXRlY29kZSkgewotICBjYXNlICdpJzoKLSAgY2FzZSAncCc6Ci0gIGNhc2UgJ2cnOgotICBjYXNlICdjJzoKLSAgICBwcmludGYoIiNlbmRpZlxuIik7Ci0gICAgYnJlYWs7IAotICBjYXNlICdkJzoKLSAgICBicmVhazsKLSAgfQotfQotCi0gIDsKLQotCi1pdF9saXN0OiBpdCBpdF9saXN0Ci0gIHwKLSAgOwotCi1pdDoKLQknKCcgTkFNRSBOVU1CRVIgCi0gICAgICB7Ci0JaXQgPSAkMjsgY29kZSA9ICQzOwotCXN3aXRjaCAod3JpdGVjb2RlKSAKLQkgIHsKLQkgIGNhc2UgJ2QnOgotCSAgICBwcmludGYoIlxuXG5cbiNkZWZpbmUgSVRfJXNfQ09ERSAweCV4XG4iLCBpdCxjb2RlKTsKLQkgICAgcHJpbnRmKCJzdHJ1Y3QgSVRfJXMgeyBcbiIsIGl0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdpJzoKLQkgICAgcHJpbnRmKCJ2b2lkIHN5c3JvZmZfc3dhcF8lc19pbihwdHIpXG4iLCQyKTsKLQkgICAgcHJpbnRmKCJzdHJ1Y3QgSVRfJXMgKnB0cjtcbiIsIGl0KTsKLQkgICAgcHJpbnRmKCJ7XG4iKTsKLQkgICAgcHJpbnRmKCJjaGFyIHJhd1syNTVdO1xuIik7Ci0JICAgIHByaW50ZigiXHRpbnQgaWR4ID0gMCA7XG4iKTsKLQkgICAgcHJpbnRmKCJcdGludCBzaXplO1xuIik7Ci0JICAgIHByaW50ZigibWVtc2V0KHJhdywwLDI1NSk7XG4iKTsJCi0JICAgIHByaW50ZigibWVtc2V0KHB0ciwwLHNpemVvZigqcHRyKSk7XG4iKTsKLQkgICAgcHJpbnRmKCJzaXplID0gZmlsbHVwKHJhdyk7XG4iKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdnJzoKLQkgICAgcHJpbnRmKCJ2b2lkIHN5c3JvZmZfc3dhcF8lc19vdXQoZmlsZSxwdHIpXG4iLCQyKTsKLQkgICAgcHJpbnRmKCJGSUxFICogZmlsZTtcbiIpOwotCSAgICBwcmludGYoInN0cnVjdCBJVF8lcyAqcHRyO1xuIiwgaXQpOwotCSAgICBwcmludGYoIntcbiIpOwotCSAgICBwcmludGYoIlx0Y2hhciByYXdbMjU1XTtcbiIpOwotCSAgICBwcmludGYoIlx0aW50IGlkeCA9IDE2IDtcbiIpOwotCSAgICBwcmludGYoIlx0bWVtc2V0IChyYXcsIDAsIDI1NSk7XG4iKTsKLQkgICAgcHJpbnRmKCJcdGNvZGUgPSBJVF8lc19DT0RFO1xuIiwgaXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ28nOgotCSAgICBwcmludGYoInZvaWQgc3lzcm9mZl9zd2FwXyVzX291dChhYmZkLHB0cilcbiIsJDIpOwotCSAgICBwcmludGYoImJmZCAqIGFiZmQ7XG4iKTsKLQkgICAgcHJpbnRmKCJzdHJ1Y3QgSVRfJXMgKnB0cjtcbiIsaXQpOwotCSAgICBwcmludGYoIntcbiIpOwotCSAgICBwcmludGYoImludCBpZHggPSAwIDtcbiIpOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ2MnOgotCSAgICBwcmludGYoInZvaWQgc3lzcm9mZl9wcmludF8lc19vdXQocHRyKVxuIiwkMik7Ci0JICAgIHByaW50Zigic3RydWN0IElUXyVzICpwdHI7XG4iLCBpdCk7Ci0JICAgIHByaW50Zigie1xuIik7Ci0JICAgIHByaW50ZigiaXRoZWFkZXIoXCIlc1wiLCBJVF8lc19DT0RFKTtcbiIsJDIsJDIpOwotCSAgICBicmVhazsKLQotCSAgY2FzZSAndCc6Ci0JICAgIGJyZWFrOwotCSAgfQotCi0gICAgICB9IAotCWl0X2ZpZWxkX2xpc3QgCi0nKScKLXsKLSAgc3dpdGNoICh3cml0ZWNvZGUpIHsKLSAgY2FzZSAnZCc6IAotICAgIHByaW50ZigifTtcbiIpOwotICAgIGJyZWFrOwotICBjYXNlICdnJzoKLSAgICBwcmludGYoIlx0Y2hlY2tzdW0oZmlsZSxyYXcsIGlkeCwgSVRfJXNfQ09ERSk7XG4iLCBpdCk7Ci0gICAgCi0gIGNhc2UgJ2knOgotCi0gIGNhc2UgJ28nOgotICBjYXNlICdjJzoKLSAgICBwcmludGYoIn1cbiIpOwotICB9Ci19Ci07Ci0KLQotCi1pdF9maWVsZF9saXN0OgotCQlpdF9maWVsZCBpdF9maWVsZF9saXN0Ci0JfAljb25kX2l0X2ZpZWxkIGl0X2ZpZWxkX2xpc3QJCi0JfAlyZXBlYXRfaXRfZmllbGQgaXRfZmllbGRfbGlzdAotCXwKLQk7Ci0KLXJlcGVhdF9pdF9maWVsZDogJygnIFJFUEVBVCBOQU1FCi0JewotCSAgcmRlcHRoKys7Ci0JICBzd2l0Y2ggKHdyaXRlY29kZSkgCi0JICAgIHsKLQkgICAgY2FzZSAnYyc6Ci0JICAgICAgaWYgKHJkZXB0aD09MSkKLQkgICAgICBwcmludGYoIlx0cHJpbnRmKFwicmVwZWF0ICUlZFxcblwiLCAlcyk7XG4iLCQzKTsKLQkgICAgICBpZiAocmRlcHRoPT0yKQotCSAgICAgIHByaW50ZigiXHRwcmludGYoXCJyZXBlYXQgJSVkXFxuXCIsICVzW25dKTtcbiIsJDMpOwotCSAgICBjYXNlICdpJzoKLQkgICAgY2FzZSAnZyc6Ci0JICAgIGNhc2UgJ28nOgotCi0JICAgICAgaWYgKHJkZXB0aD09MSkgCi0JCXsKLQkgICAgICBwcmludGYoIlx0eyBpbnQgbjsgZm9yIChuID0gMDsgbiA8ICVzOyBuKyspIHtcbiIsICAgICQzKTsKLQkgICAgfQotCSAgICAgIGlmIChyZGVwdGggPT0gMikgewotCSAgICAgIHByaW50ZigiXHR7IGludCBtOyBmb3IgKG0gPSAwOyBtIDwgJXNbbl07IG0rKykge1xuIiwgICAgJDMpOwotCSAgICB9CQkKLQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIG9sZHJlcGVhdCA9IHJlcGVhdDsKLSAgICAgICAgIHJlcGVhdCA9ICQzOwotCX0KLQotCSBpdF9maWVsZF9saXN0ICcpJyAKLQotCXsKLQkgIHJlcGVhdCA9IG9sZHJlcGVhdDsKLQkgIG9sZHJlcGVhdCA9MDsKLQkgIHJkZXB0aC0tOwotCSAgc3dpdGNoICh3cml0ZWNvZGUpCi0JICAgIHsKLQkgICAgY2FzZSAnaSc6Ci0JICAgIGNhc2UgJ2cnOgotCSAgICBjYXNlICdvJzoKLQkgICAgY2FzZSAnYyc6Ci0JICBwcmludGYoIlx0fX1cbiIpOwotCX0KLQl9Ci0gICAgICAgOwotCi0KLWNvbmRfaXRfZmllbGQ6ICcoJyBDT05EIE5BTUUKLQl7Ci0JICBzd2l0Y2ggKHdyaXRlY29kZSkgCi0JICAgIHsKLQkgICAgY2FzZSAnaSc6Ci0JICAgIGNhc2UgJ2cnOgotCSAgICBjYXNlICdvJzoKLQkgICAgY2FzZSAnYyc6Ci0JICAgICAgcHJpbnRmKCJcdGlmICglcykge1xuIiwgJDMpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0JIGl0X2ZpZWxkX2xpc3QgJyknIAotCXsKLQkgIHN3aXRjaCAod3JpdGVjb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgJ2knOgotCSAgICBjYXNlICdnJzoKLQkgICAgY2FzZSAnbyc6Ci0JICAgIGNhc2UgJ2MnOgotCSAgcHJpbnRmKCJcdH1cbiIpOwotCX0KLQl9Ci0gICAgICAgOwotCi1pdF9maWVsZDoKLQknKCcgYXR0cl9kZXNjICcoJyBhdHRyX3R5cGUgYXR0cl9zaXplICcpJyBhdHRyX2lkIAotCXtuYW1lID0gJDc7IH0gCi0JZW51bXMgJyknCi0JewotCSAgY2hhciAqZGVzYyA9ICQyOwotCSAgY2hhciAqdHlwZSA9ICQ0OwotCSAgaW50IHNpemUgPSAkNTsKLQkgIGNoYXIgKmlkID0gJDc7Ci1jaGFyICpwID0gbmFtZXNbcmRlcHRoXTsKLWNoYXIgKnB0ciA9IHBuYW1lc1tyZGVwdGhdOwotCSAgc3dpdGNoICh3cml0ZWNvZGUpIAotCSAgICB7Ci0JICAgIGNhc2UgJ2cnOgotCSAgICAgIGlmIChzaXplICUgOCkgCi0JCXsKLQkJICAKLQkJICBwcmludGYoIlx0d3JpdGVCSVRTKHB0ci0+JXMlcyxyYXcsJmlkeCwlZCk7XG4iLAotCQkJIGlkLAotCQkJIG5hbWVzW3JkZXB0aF0sIHNpemUpOwotCi0JCX0KLQkgICAgICBlbHNlIHsKLQkJcHJpbnRmKCJcdHdyaXRlJXMocHRyLT4lcyVzLHJhdywmaWR4LCVkLGZpbGUpO1xuIiwKLQkJICAgICAgIHR5cGUsCi0JCSAgICAgICBpZCwKLQkJICAgICAgIG5hbWVzW3JkZXB0aF0sc2l6ZS84KTsKLQkJfQotCSAgICAgIGJyZWFrOwkgICAgICAKLQkgICAgY2FzZSAnaSc6Ci0JICAgICAgewotCi0JCWlmIChyZGVwdGggPj0gMSkKLQotCQkgIHsKLQkJICAgIHByaW50ZigiaWYgKCFwdHItPiVzKSBwdHItPiVzID0gKCVzKil4Y2FsbG9jKCVzLCBzaXplb2YocHRyLT4lc1swXSkpO1xuIiwgCi0JCQkgICBpZCwgCi0JCQkgICBpZCwKLQkJCSAgIHR5cGUsCi0JCQkgICByZXBlYXQsCi0JCQkgICBpZCk7Ci0JCSAgfQotCi0JCWlmIChyZGVwdGggPT0gMikKLQkJICB7Ci0JCSAgICBwcmludGYoImlmICghcHRyLT4lc1tuXSkgcHRyLT4lc1tuXSA9ICglcyoqKXhjYWxsb2MoJXNbbl0sIHNpemVvZihwdHItPiVzW25dWzBdKSk7XG4iLCAKLQkJCSAgIGlkLCAKLQkJCSAgIGlkLAotCQkJICAgdHlwZSwKLQkJCSAgIHJlcGVhdCwKLQkJCSAgIGlkKTsKLQkJICB9Ci0KLQkgICAgICB9Ci0KLQkgICAgICBpZiAoc2l6ZSAlIDgpIAotCQl7Ci0JCSAgcHJpbnRmKCJcdHB0ci0+JXMlcyA9IGdldEJJVFMocmF3LCZpZHgsICVkLHNpemUpO1xuIiwKLQkJCSBpZCwKLQkJCSBuYW1lc1tyZGVwdGhdLCAKLQkJCSBzaXplKTsKLQkJfQotCSAgICAgIGVsc2UgewotCQlwcmludGYoIlx0cHRyLT4lcyVzID0gZ2V0JXMocmF3LCZpZHgsICVkLHNpemUpO1xuIiwKLQkJICAgICAgIGlkLAotCQkgICAgICAgbmFtZXNbcmRlcHRoXSwKLQkJICAgICAgIHR5cGUsCi0JCSAgICAgICBzaXplLzgpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ28nOgotCSAgICAgIHByaW50ZigiXHRwdXQlcyhyYXcsJWQsJWQsJmlkeCxwdHItPiVzJXMpO1xuIiwgdHlwZSxzaXplLzgsc2l6ZSU4LGlkLG5hbWVzW3JkZXB0aF0pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdkJzoKLQkgICAgICBpZiAocmVwZWF0KSAKLQkJcHJpbnRmKCJcdC8qIHJlcGVhdCAlcyAqL1xuIiwgcmVwZWF0KTsKLQotCQkgIGlmICh0eXBlWzBdID09ICdJJykgewotCQkgIHByaW50ZigiXHRpbnQgJXMlczsgXHQvKiAlcyAqL1xuIixwdHIsaWQsIGRlc2MpOwotCQl9Ci0JCSAgZWxzZSBpZiAodHlwZVswXSA9PSdDJykgewotCQkgIHByaW50ZigiXHRjaGFyICVzKiVzO1x0IC8qICVzICovXG4iLHB0cixpZCwgZGVzYyk7Ci0JCX0KLQkgICAgICBlbHNlIHsKLQkJcHJpbnRmKCJcdGJhcnJheSAlcyVzO1x0IC8qICVzICovXG4iLHB0cixpZCwgZGVzYyk7Ci0JICAgICAgfQotCQkgIGJyZWFrOwotCQljYXNlICdjJzoKLQkgICAgICBwcmludGYoInRhYm91dCgpO1xuIik7Ci0JCSAgcHJpbnRmKCJcdHByaW50ZihcIi8qJS0zMHMqLyBwdHItPiVzID0gXCIpO1xuIiwgZGVzYywgaWQpOwotCi0JCSAgaWYgKHR5cGVbMF0gPT0gJ0knKQotCQkgIHByaW50ZigiXHRwcmludGYoXCIlJWRcXG5cIixwdHItPiVzJXMpO1xuIiwgaWQscCk7Ci0JCSAgZWxzZSAgIGlmICh0eXBlWzBdID09ICdDJykKLQkJICBwcmludGYoIlx0cHJpbnRmKFwiJSVzXFxuXCIscHRyLT4lcyVzKTtcbiIsIGlkLHApOwotCi0JCSAgZWxzZSAgIGlmICh0eXBlWzBdID09ICdCJykgCi0JCSAgICB7Ci0JCSAgcHJpbnRmKCJcdHBiYXJyYXkoJnB0ci0+JXMlcyk7XG4iLCBpZCxwKTsKLQkJfQotCSAgICAgIGVsc2UgYWJvcnQoKTsKLQkJICBicmVhazsKLQkJfQotCX0KLQotCTsKLQotCi1hdHRyX3R5cGU6CQotCSBUWVBFIHsgJCQgPSAkMTsgfQotIAl8ICB7ICQkID0gIklOVCI7fQotCTsKLQotYXR0cl9kZXNjOiAKLQknKCcgTkFNRSAnKScJCi0JeyAkJCA9ICQyOyB9Ci0JOwotCi1hdHRyX3NpemU6Ci0JIE5VTUJFUiBVTklUIAotCXsgJCQgPSAkMSAqICQyOyB9Ci0JOwotCi0KLWF0dHJfaWQ6Ci0JCScoJyBOQU1FICcpJwl7ICQkID0gJDI7IH0KLQl8CXsgJCQgPSAiZHVtbXkiO30KLQk7CQotCQotZW51bXM6IAotCXwgJygnIGVudW1fbGlzdCAnKScgOwotCi1lbnVtX2xpc3Q6Ci0JfAotCWVudW1fbGlzdCAnKCcgTkFNRSBOQU1FICcpJyB7IAotCSAgc3dpdGNoICh3cml0ZWNvZGUpIAotCSAgICB7Ci0JICAgIGNhc2UgJ2QnOgotCSAgICAgIHByaW50ZigiI2RlZmluZSAlcyAlc1xuIiwgJDMsJDQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdjJzoKLQkJcHJpbnRmKCJpZiAocHRyLT4lcyVzID09ICVzKSB7IHRhYm91dCgpOyBwcmludGYoXCIlc1xcblwiKTt9XG4iLCBuYW1lLCBuYW1lc1tyZGVwdGhdLCQ0LCQzKTsKLQkgICAgfQotCX0KLQotCTsKLQotCi0KLSUlCi0vKiBmb3VyIG1vZGVzCi0KLSAgIC1kIHdyaXRlIHN0cnVjdHVyZSBkZWZpbnRpb25zIGZvciBzeXNyb2ZmIGluIGhvc3QgZm9ybWF0Ci0gICAtaSB3cml0ZSBmdW5jdGlvbnMgdG8gc3dhcCBpbnRvIHN5c3JvZmYgZm9ybWF0IGluCi0gICAtbyB3cml0ZSBmdW5jdGlvbnMgdG8gc3dhcCBpbnRvIHN5c3JvZmYgZm9ybWF0IG91dAotICAgLWMgd3JpdGUgY29kZSB0byBwcmludCBpbmZvIGluIGh1bWFuIGZvcm0gKi8KLQotaW50IHl5ZGVidWc7Ci1jaGFyIHdyaXRlY29kZTsKLQotaW50IAotbWFpbihhYyxhdikKLWludCBhYzsKLWNoYXIgKiphdjsKLXsKLSAgeXlkZWJ1Zz0wOwotICBpZiAoYWMgPiAxKQotICAgIHdyaXRlY29kZSA9IGF2WzFdWzFdOwotaWYgKHdyaXRlY29kZSA9PSAnZCcpCi0gIHsKLSAgICBwcmludGYoInR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgY2hhciAqZGF0YTsgaW50IGxlbjsgfSBiYXJyYXk7IFxuIik7Ci0gICAgcHJpbnRmKCJ0eXBlZGVmICBpbnQgSU5UO1xuIik7Ci0gICAgcHJpbnRmKCJ0eXBlZGVmICBjaGFyICogQ0hBUlM7XG4iKTsKLQotICB9Ci0gIHl5cGFyc2UoKTsKLXJldHVybiAwOwotfQotCi1pbnQKLXl5ZXJyb3IocykKLSAgICAgY2hhciAqczsKLXsKLSAgZnByaW50ZihzdGRlcnIsICIlc1xuIiAsIHMpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N5c2xleC5sIGIvYmludXRpbHMvc3lzbGV4LmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOTQ4NDIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc3lzbGV4LmwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0lewotI2luY2x1ZGUgInN5c2luZm8uaCIKLWNoYXIgKndvcmQ7Ci1pbnQgbnVtYmVyOwotaW50IHVuaXQ7Ci0KLSNpZm5kZWYgeXl3cmFwCi1zdGF0aWMgaW50IHl5d3JhcCAoKSB7IHJldHVybiAxOyB9Ci0jZW5kaWYKLSV9Ci0lJQotIigiIHsgcmV0dXJuICcoJzt9Ci0iKSIgeyByZXR1cm4gJyknO30KLSJbIiB7IHJldHVybiAnWyc7fQotIl0iIHsgcmV0dXJuICddJzt9Ci0iICIgeyA7IH0KLSI7Ii4qIHsgOyB9IAotIlx0IiB7IDsgfQotIlxuIiB7IDsgfQotIlwiIlteXCJdKiJcIiIgewoteXlsdmFsLnMgPSBtYWxsb2Moc3RybGVuICh5eXRleHQpKTsKLXN0cmNweSh5eWx2YWwucywgeXl0ZXh0KzEpOwoteXlsdmFsLnNbc3RybGVuKHl5bHZhbC5zKS0xXSA9IDA7Ci0gICAgICAgIHJldHVybiBOQU1FOwotCX0KLQotMHhbMC05YS1mXSsgewotICAgICAgICB5eWx2YWwuaSA9IHN0cnRvbCh5eXRleHQsMCwxNik7Ci0JcmV0dXJuICBOVU1CRVI7Ci0JfQotCi1bMC05XSsgewotICAgICAgICB5eWx2YWwuaSA9IGF0b2koeXl0ZXh0KTsKLQlyZXR1cm4gIE5VTUJFUjsKLQl9Ci0KLQotImJpdHMiIHsgeXlsdmFsLmkgPTEgO3JldHVybiBVTklUO30KLSJiaXQiIHsgeXlsdmFsLmkgPSAxOyByZXR1cm4gVU5JVDt9Ci0iYnl0ZXMiIHsgeXlsdmFsLmk9IDg7IHJldHVybiBVTklUO30KLSJieXRlIiB7IHl5bHZhbC5pID0gODsgcmV0dXJuIFVOSVQ7fQotCi0iaW50IiB7IHl5bHZhbC5zID0gIklOVCI7IHJldHVybiBUWVBFO30KLSJiYXJyYXkiIHsgeXlsdmFsLnMgPSAiQkFSUkFZIjsgcmV0dXJuIFRZUEU7fQotImNoYXJzIiB7IHl5bHZhbC5zID0gIkNIQVJTIjsgcmV0dXJuIFRZUEU7fQotInZhcmlhYmxlIiB7IHl5bHZhbC5pID0gMDsgcmV0dXJuIE5VTUJFUjt9Ci0iY291bnRlZCIgeyB5eWx2YWwuaSA9IC00OyByZXR1cm4gTlVNQkVSO30KLSJhZGRyc2l6ZSIgeyB5eWx2YWwuaSA9IC0yOyByZXR1cm4gTlVNQkVSOyB9Ci0ic2Vnc2l6ZSIgeyB5eWx2YWwuaSA9IC0xOyByZXR1cm4gTlVNQkVSOyB9Ci0iY29uZCIgeyByZXR1cm4gQ09ORDt9Ci0icmVwZWF0IiB7IHJldHVybiBSRVBFQVQ7fQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvc3lzcm9mZi5pbmZvIGIvYmludXRpbHMvc3lzcm9mZi5pbmZvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWYwMDFhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3N5c3JvZmYuaW5mbworKysgL2Rldi9udWxsCkBAIC0xLDUwNCArMCwwIEBACi0oImNzIiAweDAKLSAoKCJzaXplIikgKDEgYnl0ZSkgKCJzaXplIikpCi0KLSAoKCJoZCIpICgxIGJ5dGUpICgiaGQiKSkKLSAoKCJocyIpICgxIGJ5dGUpICgiaHMiKSkKLSAoKCJ1biIpICgxIGJ5dGUpICgidW4iKSkKLSAoKCJ1cyIpICgxIGJ5dGUpICgidXMiKSkKLQotICgoInNjIikgKDEgYnl0ZSkgKCJzYyIpKQotICgoInNzIikgKDEgYnl0ZSkgKCJzcyIpKQotICgoImVyIikgKDEgYnl0ZSkgKCJlciIpKQotICgoImVkIikgKDEgYnl0ZSkgKCJlZCIpKQotCi0gKCgic2giKSAoMSBieXRlKSAoInNoIikpCi0gKCgib2IiKSAoMSBieXRlKSAoIm9iIikpCi0gKCgicmwiKSAoMSBieXRlKSAoInJsIikpCi0gKCgiZHUiKSAoMSBieXRlKSAoImR1IikpCi0KLSAoKCJkcHMiKSAoMSBieXRlKSAoImRwcyIpKQotICgoImRzeSIpICgxIGJ5dGUpICgiZHN5IikpCi0gKCgiZHR5IikgKDEgYnl0ZSkgKCJkdHkiKSkKLSAoKCJkbG4iKSAoMSBieXRlKSAoImRsbiIpKQotCi0gKCgiZHNvIikgKDEgYnl0ZSkgKCJkc28iKSkKLSAoKCJkdXMiKSAoMSBieXRlKSAoImR1cyIpKQotICgoImRzcyIpICgxIGJ5dGUpICgiZHNzIikpCi0gKCgiZGJ0IikgKDEgYnl0ZSkgKCJkYnQiKSkKLQotICgoImRwcCIpICgxIGJ5dGUpICgiZHBwIikpCi0gKCgiZGZwIikgKDEgYnl0ZSkgKCJkZnAiKSkKLSAoKCJkZW4iKSAoMSBieXRlKSAoImRlbiIpKQotICgoImRkcyIpICgxIGJ5dGUpICgiZGRzIikpCi0KLSAoKCJkYXIiKSAoMSBieXRlKSAoImRhciIpKQotICgoImRwdCIpICgxIGJ5dGUpICgiZHB0IikpCi0gKCgiZHVsIikgKDEgYnl0ZSkgKCJkdWwiKSkKLSAoKCJkc2UiKSAoMSBieXRlKSAoImRzZSIpKQotCi0gKCgiZG90IikgKDEgYnl0ZSkgKCJkb3QiKSkpCi0KLQotKCJoZCIgMHgwNAotICgoIm1vZHVsZSB0eXBlIikgKDQgYml0cykgKCJtdCIpCi0gICgoIk1UWVBFX0FCU19MTSIgCSIwIikKLSAgICgiTVRZUEVfUkVMX0xNIiAJIjEiKQotICAgKCJNVFlQRV9PTVNfT1JfTE1TIiAJIjIiKQotICAgKCJNVFlQRV9VTlNQRUMiIAkiMHhmIikpKQotICgoInNwYXJlIikoNCBiaXRzKSAoInNwYXJlMSIpKQotICgoImNyZWF0aW9uIGRhdGUiKSggY2hhcnMgMTIgYnl0ZXMpKCAiY2QiKSkKLSAoKCJudW1iZXIgb2YgdW5pdHMiKSAoMiBieXRlcykgKCJudSIpKQotICgoImNvZGUiKSAoMSBieXRlKSAoImNvZGUiKSkKLSAoKCJ2ZXJzaW9uIikgKGNoYXJzIDQgYnl0ZXMpICgidmVyIikpCi0gKCgiYWRkcmVzcyB1cGRhdGUiKSAoMSBieXRlKSAoImF1IikpCi0gKCgic2VnbWVudCBpZGVudGlmaWVyIikgKDEgYml0KSAoInNpIikpCi0gKCgiYWRkcmVzcyBmaWVsZCBsZW5ndGgiKSAoNCBiaXRzKSAoImFmbCIpKQotICgoInNwYXJlIikoMyBiaXRzKSAoInNwYXJlMiIpKQotICgoInNwYWNlIHNpemUgd2l0aGluIHNlZ21lbnQiKSAoMSBieXRlKSAoInNwY3N6IikpCi0gKCgic2VnbWVudCBzaXplIikgIAkoMSBieXRlKSAoInNlZ3N6IikpCi0gKCgic2VnbWVudCBzaGlmdCIpIAkoMSBieXRlKSAoInNlZ3NoIikpCi0gKCgiZW50cnkgcG9pbnQiKSAJKDEgYnl0ZSkgKCJlcCIpKQotIChjb25kICJwdHItPmVwIgotICAgICAgIChjb25kICJwdHItPm10ICE9IE1UWVBFX0FCU19MTSIgCi0JICAgICAoKCJ1bml0IGFwcGVhcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgidWFuIikpCi0JICAgICAoKCJzZWN0aW9uIGFwcGVhcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgic2EiKSkpCi0gICAgICAgKGNvbmQgInNlZ21lbnRlZF9wIgotCSAgICAgKCgic2VnbWVudCBhZGRyZXNzIikgKHNlZ3NpemUgYnl0ZXMpICgic2FkIikpKQotICAgICAgICgoImFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWRkcmVzcyIpKSkKLSAoKCJvcyBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoIm9zIikpCi0gKCgic3lzIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgic3lzIikpCi0gKCgibW9kdWxlIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgibW4iKSkKLSAoKCJjcHUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgiY3B1IikpKQotCi0KLSgiaHMiIDB4MDUKLSAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKQotCi0KLSgidW4iIDB4MDYKLSAoKCJmb3JtYXQiKSAoMiBiaXRzKSAoImZvcm1hdCIpCi0gICgoIkZPUk1BVF9MTSIgIjAiKQotICAgKCJGT1JNQVRfT00iICIxIikKLSAgICgiRk9STUFUX09NU19PUl9MTVMiICIyIikpKQotICgoInNwYXJlIikgKDYgYml0cykgKCJzcGFyZTEiKSkKLSAoKCJudW1iZXIgb2Ygc2VjdGlvbnMiKSAoMiBieXRlcykgKCJuc2VjdGlvbnMiKSkKLSAoKCJudW1iZXIgb2YgZXh0ZXJuYWwgcmVmcyIpICgyIGJ5dGVzKSAoIm5leHRyZWZzIikpCi0gKCgibnVtYmVyIG9mIGV4dGVybmFsIGRlZnMiKSAoMiBieXRlcykgKCJuZXh0ZGVmcyIpKQotICgoInVuaXQgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoIm5hbWUiKSkKLSAoKCJ0b29sIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJ0b29sIikpCi0gKCgiY3JlYXRpb24gZGF0ZSIpIChjaGFycyAxMiBieXRlcykgKCJ0Y2QiKSkKLSAoKCJsaW5rZXIgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoImxpbmtlciIpKQotICgoImNyZWF0aW9uIGRhdGUiKSAoY2hhcnMgMTIgYnl0ZXMpICgibGNkIikpKQotCi0KLSgidXMiIDB4MDcKLSAoKCJuZWdvdGlhdGlvbiBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkpCi0KLQotKCJzYyIgMHgwOAotICgoImZvcm1hdCIpICgyIGJpdHMpICgiZm9ybWF0IikpCQotICgoInNwYXJlIikgKDYgYml0cykgKCJzcGFyZSIpKQotICgoInNlZ21lbnQgYWRkcmVzcyIpIChzZWdzaXplIGJ5dGVzKSAoInNlZ2FkZCIpKQotICgoImFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWRkciIpKQotICgoImxlbmd0aCIpIChhZGRyc2l6ZSBieXRlcykgKCJsZW5ndGgiKSkKLSAoKCJhbGlnbm1lbnQiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWxpZ24iKSkKLSAoKCJjb250ZW50cyIpICg0IGJpdHMpICgiY29udGVudHMiKQotICAoKCJDT05URU5UU19DT0RFIiAiMCIpCi0gICAoIkNPTlRFTlRTX0RBVEEiICIxIikKLSAgICgiQ09OVEVOVFNfU1RBQ0siICIyIikKLSAgICgiQ09OVEVOVFNfRFVNTVkiICIzIikKLSAgICgiQ09OVEVOVFNfU1BFQ0lBTCIgIjQiKQotICAgKCJDT05URU5UU19OT05TUEVDIiAiMHhmIikpKQotICgoImNvbmNhdCIpICg0IGJpdHMpICgiY29uY2F0IikKLSAgKCgiQ09OQ0FUX1NJTVBMRSIgIjAiKQotICAgKCJDT05DQVRfU0hBUkVEQyIgIjEiKQotICAgKCJDT05DQVRfRFVNTVkiICIyIikKLSAgICgiQ09OQ0FUX0dST1VQIiAiMyIpCi0gICAoIkNPTkNBVF9TSEFSRUQiICI0IikKLSAgICgiQ09OQ0FUX1BSSVZBVEUiICI1IikKLSAgICgiQ09OQ0FUX1VOU1BFQyIgIjB4ZiIpKSkKLSAoKCJyZWFkIikgKDIgYml0cykgKCJyZWFkIikpCi0gKCgid3JpdGUiKSAoMiBiaXRzKSAoIndyaXRlIikpCi0gKCgiZXhlYyIpICgyIGJpdHMpICgiZXhlYyIpKQotICgoImluaXRpYWxpemVkIikgKDIgYml0cykgKCJpbml0IikpCi0gKCgibW9kZSIpICgyIGJpdHMpICgibW9kZSIpKQotICgoInNwYXJlIikgKDYgYml0cykgKCJzcGFyZTEiKSkKLSAoKCJuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgibmFtZSIpKSkKLQotCi0oInNzIiAweDA5Ci0gKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKLQotCQotKCJlciIgMHgwYwotICgoInN5bWJvbCB0eXBlIikgKDIgYml0cykgKCJ0eXBlIikKLSAgKCgiRVJfRU5UUlkiICIwIikKLSAgICgiRVJfREFUQSIgIjEiKQotICAgKCJFUl9OT1RERUYiICIyIikKLSAgICgiRVJfTk9UU1BFQyIgIjMiKSkpCi0gKCgic3BhcmUiKSAoNiBiaXRzKSAoInNwYXJlIikpCi0gKCgic3ltYm9sIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJuYW1lIikpKQotCQotCi0oImVkIiAweDE0Ci0gKCgic2VjdGlvbiBhcHBlYXJhbmNlIG51bWJlciIpICgyIGJ5dGVzKSAoInNlY3Rpb24iKSkKLSAoKCJzeW1ib2wgdHlwZSIpICgzIGJpdHMpICgidHlwZSIpCi0gICgoIkVEX1RZUEVfRU5UUlkiICIwIikKLSAgICgiRURfVFlQRV9EQVRBIiAiMSIpCi0gICAoIkVEX1RZUEVfQ09OU1QiICIyIikKLSAgICgiRURfVFlQRV9OT1RTUEVDIiAiNyIpKSkKLSAoKCJzcGFyZSIpICg1IGJpdHMpICgic3BhcmUiKSkKLSAoY29uZCAicHRyLT50eXBlPT1FRF9UWVBFX0VOVFJZIHx8IHB0ci0+dHlwZT09RURfVFlQRV9EQVRBIgotICAgICAgICgoInN5bWJvbCBhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkpCi0gKGNvbmQgInB0ci0+dHlwZT09RURfVFlQRV9DT05TVCIKLSAgICAgICAoKCJjb25zdGFudCB2YWx1ZSIpIChhZGRyc2l6ZSBieXRlcykgKCJjb25zdGFudCIpKSkKLSAoKCJzeW1ib2wgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoIm5hbWUiKSkpCi0KLQotKCJzaCIgMHgxYQotICgoInVuaXQgYXBwZWFyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJ1bml0IikpCi0gKCgic2VjdGlvbiBhcHBlYXJhbmNlIG51bWJlciIpICgyIGJ5dGVzKSAoInNlY3Rpb24iKSkpCi0KLQotKCJvYiIgMHgxYwotICgoInN0YXJ0aW5nIGFkZHJlc3MgZmxhZyIpICgxIGJpdCkgKCJzYWYiKSkKLSAoKCJjb21wcmVzc2lvbiBmbGFnIikgKDEgYml0KSAoImNwZiIpKQotICgoInNwYXJlIikgKDYgYml0cykgKCJzcGFyZSIpKQotIChjb25kICJwdHItPnNhZiIKLSAgICAgICAoICgic3RhcnRpbmcgYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJhZGRyZXNzIikpKQotIChjb25kICJwdHItPmNwZiIKLSAgICAgICAoKCJjb21wIHJlcHMiKSAoYWRkcnNpemUgYnl0ZXMpICgiY29tcHJlcHMiKSkpCi0gKCgiZGF0YSIpIChiYXJyYXkgY291bnRlZCBieXRlKSAoImRhdGEiKSkpCi0JCi0KLSgicmwiIDB4MjAKLSAoKCJib3VuZGFyeSBvZiByZWxvY2F0ZWFibGUgYXJlYSIpICg0IGJpdHMpICgiYm91bmRhcnkiKSkKLSAoKCJhZGRyZXNzIHBvbGFyaXR5IikgKDEgYml0KSAoImFwb2wiKSkKLSAoKCJzZWdtZW50IG51bWJlciIpICgxIGJpdCkgKCJzZWdtZW50IikpCi0gKCgic2lnbiBvZiByZWxvY2F0aW9uIikgKDEgYml0KSAoInNpZ24iKSkKLSAoKCJjaGVjayByYW5nZSIpICgxIGJpdCkgKCJjaGVjayIpKQotICgoInJlbG9jIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWRkciIpKQotCi0gKCgiYml0IGxvYyIpICgxIGJ5dGUpICgiYml0bG9jIikpCi0gKCgiZmllbGQgbGVuZ3RoIikgKDEgYnl0ZSkgKCJmbGVuIikpCi0gKCgiYmNvdW50IikgKDEgYnl0ZSkgKCJiY291bnQiKSkKLSAoKCJvcGVyYXRvciIpICgxIGJ5dGUpICgib3AiKQotICAoKCJPUF9SRUxPQ19BRERSIiAiMSIpCi0gICAoIk9QX1NFQ19SRUYiICIwIikKLSAgICgiT1BfRVhUX1JFRiIgIjIiKSkpCi0gKGNvbmQgInB0ci0+b3AgPT0gT1BfRVhUX1JFRiIKLSAgICAgICAoKCJzeW1ib2wgbnVtYmVyIikgKDIgYnl0ZXMpICgic3ltbiIpKQkpCi0JCi0gKGNvbmQgInB0ci0+b3AgPT0gT1BfU0VDX1JFRiIKLSAgICAgICAoKCJzZWN0aW9uIG51bWJlciIpICgyIGJ5dGVzKSAoInNlY24iKSkKLSAgICAgICAoKCJjb25zdCBvcGNvZGUiKSAoMSBieXRlKSAoImNvcGNvZGVfaXNfMyIpKQotICAgICAgICgoImFkZGVuZCBsZW5ndGgiKSAoMSBieXRlKSAoImFsZW5ndGhfaXNfNCIpKQotICAgICAgICgoImFkZGVuZCIpICg0IGJ5dGUpICgiYWRkZW5kIikpCi0gICAgICAgKCgicGx1cyBvcGNvZGUiKSAoMSBieXRlKSAoImFvcGNvZGVfaXNfMHgyMCIpKSkKLQotIChjb25kICJwdHItPm9wID09IE9QX1JFTE9DX0FERFIiCi0gICAgICAgKCgiZHVubm8iKSAoMiBieXRlcykgKCJkdW5ubyIpKSkKLQotICgoImVuZCIpICAoMSBieXRlKSAoImVuZCIpKSkKLQkKLQotKCJkdSIgMHgzMAotICgoImZvcm1hdCIpICgyIGJpdHMpICgiZm9ybWF0IikpCi0gKCgib3B0aW1pemVkIikgKDEgYml0KSAoIm9wdGltaXplZCIpKQotICgoInN0YWNrZnJtdCIpICgyIGJpdHMpICgic3RhY2tmcm10IikpCi0gKCgic3BhcmUiKSAoMyBiaXRzKSAoInNwYXJlIikpCi0gKCgidW5pdCBudW1iZXIiKSAoMiBieXRlcykgKCJ1bml0IikpCi0gKCgic2VjdGlvbnMiKSAoMiBieXRlcykgKCJzZWN0aW9ucyIpKQotIChyZXBlYXQgInB0ci0+c2VjdGlvbnMiCi0JICgoInNlY3Rpb24gYXBwZWFyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJzYW4iKSkKLQkgKCgiYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJhZGRyZXNzIikpCi0JICgoInNlY3Rpb24gbGVuZ3RoIikgKGFkZHJzaXplIGJ5dGVzKSAoImxlbmd0aCIpKSkKLSAoKCJ0b29sIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJ0b29sIikpCi0gKCgiY3JlYXRpb24gZGF0ZSIpIChjaGFycyAxMiBieXRlcykgKCJkYXRlIikpKQotCi0KLSgiZHN5IiAweDM0Ci0gKCgic3ltYm9sIHR5cGUiKSAoNyBiaXRzKSAoInR5cGUiKQotICAoKCJTVFlQRV9WQVIiICIwIikKLSAgICgiU1RZUEVfTEFCIiAiMSIpCi0gICAoIlNUWVBFX1BST0MiICIyIikKLSAgICgiU1RZUEVfRlVOQyIgIjMiKQotICAgKCJTVFlQRV9UWVBFIiAiNCIpCi0gICAoIlNUWVBFX0NPTlNUIiAiNSIpCi0gICAoIlNUWVBFX0VOVFJZIiAiNiIpCi0gICAoIlNUWVBFX01FTUJFUiIgIjciKQotICAgKCJTVFlQRV9FTlVNIiAiOCIpCi0gICAoIlNUWVBFX1RBRyIgIjkiKQotICAgKCJTVFlQRV9QQUNLQUdFIiAiMTAiKQotICAgKCJTVFlQRV9HRU5FUklDIiAiMTEiKQotICAgKCJTVFlQRV9UQVNLIiAiMTIiKQotICAgKCJTVFlQRV9FWENFUFRJT04iICIxMyIpCi0gICAoIlNUWVBFX1BBUkFNRVRFUiIgIjE0IikKLSAgICgiU1RZUEVfRVFVQVRFIiAiMTUiKQotICAgKCJTVFlQRV9VTlNQRUMiICIweDdmIikpKQotICgoImFzc2lnbm1lbnQgaW5mbyIpICgxIGJpdCkgKCJhc3NpZ24iKSkKLSAoKCJzeW1ib2wgaWQiKSAoMiBieXRlcykgKCJzbnVtYmVyIikpCi0gKCgic3ltYm9sIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgic25hbWUiKSkKLSAoKCJuZXN0aW5nIGxldmVsIikgKDIgYnl0ZXMpICgibmVzdGluZyIpKQotIChjb25kICJwdHItPmFzc2lnbiIKLSAgICAgICAoKCJhc3NpZ25tZW50IHR5cGUiKSAoMSBieXRlKSAgKCJhaW5mbyIpCi0JKCgiQUlORk9fUkVHIiAiMSIpCi0JICgiQUlORk9fU1RBVElDX0VYVF9ERUYiICIyIikKLQkgKCJBSU5GT19TVEFUSUNfRVhUX1JFRiIgIjMiKQotCSAoIkFJTkZPX1NUQVRJQ19JTlQiICI0IikKLQkgKCJBSU5GT19TVEFUSUNfQ09NIiAiNSIpCi0JICgiQUlORk9fQVVUTyIgIjYiKQotCSAoIkFJTkZPX0NPTlNUIiAiNyIpCi0JICgiQUlORk9fVU5TUEVDIiAiMHhmZiIpKSkKLSAgICAgICAoKCJkYXRhIGxlbmd0aCIpIChhZGRyc2l6ZSBieXRlcykgKCJkbGVuZ3RoIikpCi0gICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0VYVF9ERUYKLSAgICAgICAgICAgIHx8IHB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0lOVAotICAgICAgICAgICAgfHwgcHRyLT5haW5mbyA9PSBBSU5GT19TVEFUSUNfQ09NIgotCSAgICAgKCgic2VjdGlvbiBudW1iZXIiKSAgKDIgYnl0ZXMpICgic2VjdGlvbiIpKSkKLSAgICAgICAoY29uZCAicHRyLT5haW5mbyA9PSBBSU5GT19TVEFUSUNfRVhUX0RFRgotICAgICAgICAgICAgfHwgcHRyLT5haW5mbyA9PSBBSU5GT19TVEFUSUNfSU5UCi0gICAgICAgICAgICB8fCBwdHItPmFpbmZvID09IEFJTkZPX1NUQVRJQ19DT00KLSAgICAgICAgICAgIHx8IHB0ci0+YWluZm8gPT0gQUlORk9fQVVUTyIKLQkgICAgICgoImFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWRkcmVzcyIpKSkKLSAgICAgICAoY29uZCAicHRyLT5haW5mbyA9PSBBSU5GT19SRUciCi0JICAgICAoKCJyZWdpc3RlciBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoInJlZyIpKSkKLSAgICAgICAoY29uZCAicHRyLT5haW5mbyA9PSBBSU5GT19TVEFUSUNfRVhUX0RFRgotCSAgICB8fCBwdHItPmFpbmZvID09IEFJTkZPX1NUQVRJQ19FWFRfUkVGIgotCSAgICAgKCgiZXh0ZXJuYWwgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJlbmFtZSIpKSkKLSAgICAgICAoY29uZCAicHRyLT5haW5mbyA9PSBBSU5GT19DT05TVCIKLQkgICAgICgoImNvbnN0YW50IikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoImNvbnN0YW50IikpKSkKLSAoY29uZCAicHRyLT50eXBlID09IFNUWVBFX01FTUJFUiIKLSAgICAgICAoKCJhc3NpZ25tZW50IHVuaXQiKSAoMSBiaXQpICgiYml0dW5pdCIpKQotICAgICAgICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZTIiKSkKLSAgICAgICAoKCJmaWVsZCBsZW5ndGgiKSAoYWRkcnNpemUgYnl0ZXMpICgiZmllbGRfbGVuIikpCi0gICAgICAgKCgiZmllbGQgb2Zmc2V0IikgKGFkZHJzaXplIGJ5dGVzKSAoImZpZWxkX29mZiIpKQotICAgICAgIChjb25kICJwdHItPmJpdHVuaXQiCi0JICAgICAoKCJiaXQgb2Zmc2V0IikgKGFkZHJzaXplIGJ5dGVzKSAoImZpZWxkX2JpdG9mZiIpKSkpCi0gKGNvbmQgInB0ci0+dHlwZT09IFNUWVBFX0VOVU0iCi0gICAgICAgKCgidmFsdWUgbGVuZ3RoIikgKDEgYnl0ZSkgKCJldmFsbGVuIikpCi0gICAgICAgKCgidmFsdWUiKSAoNCBieXRlcykgKCJldmFsdWUiKSkpCi0gKGNvbmQgInB0ci0+dHlwZSA9PSBTVFlQRV9DT05TVCIKLSAgICAgICAoKCJ2YWx1ZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJjdmFsdWUiKSkpCi0gKGNvbmQgInB0ci0+dHlwZSA9PSBTVFlQRV9FUVVBVEUiCi0gICAgICAgKCgidmFsdWUgbGVuZ3RoIikgKDEgYnl0ZSkgKCJxdmFsbGVuIikpCi0gICAgICAgKCgidmFsdWUiKSAoNCBieXRlcykgKCJxdmFsdWUiKSkKLSAgICAgICAoKCJiYXNpYyB0eXBlIikgKDEgYnl0ZSkgKCJidHlwZSIpKQotICAgICAgICgoInNpemUgaW5mb3JtYXRpb24iKSAoYWRkcnNpemUgYnl0ZXMpICgic2l6ZWluZm8iKSkKLSAgICAgICAoKCJzaWduIikgKDIgYml0cykgKCJzaWduIikpCi0gICAgICAgKCgiZmxvYXRpbmcgcG9pbnQgdHlwZSIpICg2IGJpdHMpICgiZmx0X3R5cGUiKSkpCi0gKCgic291cmNlIGZpbGUgbnVtYmVyIikgKDIgYnl0ZXMpICgic2ZuIikpCi0gKCgic291cmNlIGxpbmUgbnVtYmVyIikgKDIgYnl0ZXMpICgic2xuIikpCi0gKCgibmVnb3RpYXRpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpCi0gKGNvbmQgInB0ci0+dHlwZSA9PSBTVFlQRV9UQUciCi0gICAgICAgKCgibWFnaWMiKSAoMSBieXRlKSAoIm1hZ2ljIikpKSkKLQotIAotCi0oImR1bCIgMHg1MgotICgoIm1heCBkZWNsYXJhdGlvbiB0eXBlIGZsYWciKSAoMSBiaXQpICgibWF4X3ZhcmlhYmxlIikpCi0gKCgibWF4IHNwYXJlIikgKDcgYml0cykgKCJtYXhzcGFyZSIpKQotIChjb25kICJwdHItPm1heF92YXJpYWJsZSA9PSAwIgotICAgICAgICgoIm1heGltdW0iKSAoYWRkcnNpemUgYnl0ZXMpICgibWF4IikpCi0gICAgICAgKCgibWF4IG1vZGUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgibWF4bW9kZSIpKSkKLQotICgoIm1pbiBkZWNsYXJhdGlvbiB0eXBlIGZsYWciKSAoMSBiaXQpICgibWluX3ZhcmlhYmxlIikpCi0gKCgibWluIHNwYXJlIikgKDcgYml0cykgKCJtaW5zcGFyZSIpKQotIChjb25kICJwdHItPm1pbl92YXJpYWJsZSA9PSAwIgotICAgICAgICgoIm1pbmltdW0iKSAoYWRkcnNpemUgYnl0ZXMpICgibWluIikpCi0gICAgICAgKCgibWluIG1vZGUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgibWlubW9kZSIpKSkpCi0KLQotKCJkdHkiIDB4MzYKLSAoKCJlbmQgZmxhZyIpICgxIGJpdCkgKCJlbmQiKSkKLSAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUiKSkKLSAoY29uZCAiIXB0ci0+ZW5kIgotICAgICAgICgoIm5lZ290aWF0aW9uIikgKDIgYnl0ZXMpICgibmVnIikpKSkKLQotCi0oImRidCIgMHg0NAotICgoImJhc2ljIHR5cGUiKSAoMSBieXRlKSAoImJ0eXBlIikKLSAgKCgiQlRZUEVfVk9JRCIgIjAiKQotICAgKCJCVFlQRV9VTkRFRiIgIjEiKQotICAgKCJCVFlQRV9DSEFSIiAiMiIpCi0gICAoIkJUWVBFX0lOVCIgIjMiKQotICAgKCJCVFlQRV9GTE9BVCIgIjQiKQotICAgKCJCVFlQRV9CSVQiICI1IikKLSAgICgiQlRZUEVfU1RSSU5HIiAiNiIpCi0gICAoIkJUWVBFX0RFQ0lNQUwiICI3IikKLSAgICgiQlRZUEVfRU5VTSIgIjgiKQotICAgKCJCVFlQRV9TVFJVQ1QiICI5IikKLSAgICgiQlRZUEVfVFlQRSIgIjEwIikKLSAgICgiQlRZUEVfVEFHIiAiMTEiKQotICAgKCJCVFlQRV9VTlNQRUMiICIweGZmIikpKQotICgoInNpemUgaW5mbyIpIChhZGRyc2l6ZSBieXRlcykgKCJiaXRzaXplIikpCi0gKCgic2lnbiIpICgyIGJpdHMpICgic2lnbiIpCi0gICgoIlNJR05fU0lHTkVEIiAiMCIpCi0gICAoIlNJR05fVU5TSUdORUQiICIxIikKLSAgICgiU0lHTl9VTlNQRUMiICIzIikpKQotICgoImZsb2F0aW5nIHBvaW50IHR5cGUiKSAoNiBiaXRzKSAoImZwdHlwZSIpCi0gICgoIkZQVFlQRV9TSU5HTEUiICIwIikKLSAgICgiRlBUWVBFX0RPVUJMRSIgIjEiKQotICAgKCJGUFRZUEVfRVhURU5ERUQiICIyIikKLSAgICgiRlBUWVBFX05PVFNQRUMiICIweDNmIikpKQotIChjb25kICJwdHItPmJ0eXBlPT1CVFlQRV9UQUcgfHwgcHRyLT5idHlwZSA9PSBCVFlQRV9UWVBFIgotICAgICAgICgoInN5bWJvbCBpZCIpICgyIGJ5dGVzKSAoInNpZCIpKSkKLSAoKCJuZWdvdGlhdGlvbiIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKLQotKCJkYXIiIDB4NGUKLSAoKCJlbGVtZW50IGxlbmd0aCIgKSAoYWRkcnNpemUgYnl0ZXMpICgibGVuZ3RoIikpCi0gKCgiZGltcyIpICgxIGJ5dGUpICgiZGltcyIpKQotIChyZXBlYXQgInB0ci0+ZGltcyIKLQkgKCgidmFyaWFibGUgZmxhZyIpICgxIGJpdCkgKCJ2YXJpYWJsZSIpCi0JICAoKCJWQVJJQUJMRV9GSVhFRCIgIjAiKQotCSAgICgiVkFSSUFCTEVfVkFSSUFCTEUiICIxIikpKQotCi0JICgoInN1YnNjcmlwdCB0eXBlIikgKDEgYml0KSAoInN1YnR5cGUiKQotCSAgKCgiU1VCX0lOVEVHRVIiICIwIikKLQkgICAoIlNVQl9UWVBFIiAgICAiMSIpKSkKLQotCSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUiKSkKLQotCSAoY29uZCAicHRyLT5zdWJ0eXBlW25dID09IFNVQl9UWVBFIgotCSAgICAgICAoKCJzdWIgc3ltYm9sIGlkIikgKDIgYnl0ZXMpICgic2lkIikpKQotCi0JIChjb25kICJwdHItPnN1YnR5cGVbbl0gPT0gU1VCX0lOVEVHRVIiCi0JICAgICAgICgoIm1heCBkZWNsYXJhdGlvbiB0eXBlIGZsYWciKSAoMSBiaXQpICgibWF4X3ZhcmlhYmxlIikpCi0JICAgICAgICgoIm1heCBzcGFyZSIpICg3IGJpdHMpICgibWF4c3BhcmUiKSkKLQkgICAgICAgOzsgRklYTUU6IG5leHQgZmllbGQgc2hvdWxkIGJlIGNvbmRpdGlvbmFsIG9uIG1heF92YXJpYWJsZSwKLQkgICAgICAgKCgibWF4aW11bSIpIChhZGRyc2l6ZSBieXRlcykgKCJtYXgiKSkKLQotCSAgICAgICAoKCJtaW4gZGVjbGFyYXRpb24gdHlwZSBmbGFnIikgKDEgYml0KSAoIm1pbl92YXJpYWJsZSIpKQotCSAgICAgICAoKCJtaW4gc3BhcmUiKSAoNyBiaXRzKSAoIm1pbnNwYXJlIikpCi0JICAgICAgIDs7IEZJWE1FOiBuZXh0IGZpZWxkIHNob3VsZCBiZSBjb25kaXRpb25hbCBvbiBtaW5fdmFyaWFibGUKLQkgICAgICAgKCgibWluaW11bSIpIChhZGRyc2l6ZSBieXRlcykgKCJtaW4iKSkpKQotICgoIm5lZ290aWF0aW9uIikgKDIgYnl0ZXMpICgibmVnIikpKQotCi0JICAgICAgIAotKCJkc28iIDB4M2EKLSAoKCJmdW5jdGlvbiBuYW1lIikgKDIgYnl0ZXMpICgic2lkIikpCi0gKCgic3AgdXBkYXRlIGNvdW50IikgKDQgYnl0ZXMpICgic3B1cGRhdGVzIikpCi0gKHJlcGVhdCAicHRyLT5zcHVwZGF0ZXMiCi0JICgoInVwZGF0ZSBhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkKLQkgKCgib2Zmc2V0IikgKGFkZHJzaXplIGJ5dGVzKSAoIm9mZnNldCIpKSkpCi0KLSgiZGxuIiAweDM4Ci0gKCgibnVtYmVyIG9mIGxpbmVzIikgKDIgYnl0ZXMpICgibmxuIikpCi0gKHJlcGVhdCAicHRyLT5ubG4iCi0JICgoInNvdXJjZSBmaWxlIG51bWJlciIpICgyIGJ5dGVzKSAoInNmbiIpKQotCSAoKCJzb3VyY2UgbGluZSBudW1iZXIiKSAoMiBieXRlcykgKCJzbG4iKSkKLQkgKCgic2VjdGlvbiBudW1iZXIiKSAoMiBieXRlcykgKCJzZWN0aW9uIikpCi0JICgoImZyb20gYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJmcm9tX2FkZHJlc3MiKSkKLQkgKCgidG8gYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJ0b19hZGRyZXNzIikpCi0JICgoImNhbGwgY291bnQiKSAoMiBieXRlcykgKCJjYyIpKQotCSApCi0gKCgibmVnIikgKDIgYnl0ZXMpICgibmVnIikpKQotIAotKCJkcHAiIDB4NDYKLSAoKCJzdGFydC9lbmQiKSAoMSBiaXQpICgiZW5kIikpCi0gKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgIiFwdHItPmVuZCIKLSAgICAgICAoKCJwYXJhbXMiKSAoMSBieXRlKSAoInBhcmFtcyIpKQotICAgICAgICgoIm5lZyBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkpKQotCi0oImRlbiIgMHg0YQotICgoInN0YXJ0L2VuZCIpICgxIGJpdCkgKCJlbmQiKSkKLSAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUiKSkKLSAoY29uZCAiIXB0ci0+ZW5kIgotICAgICAgICgoIm5lZyBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkpKQotCi0oImRmcCIgMHg0OAotICgoInN0YXJ0L2VuZCBmbGFnIikgKDEgYml0KSAoImVuZCIpKQotICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQotIChjb25kICIhcHRyLT5lbmQiCi0gICAgICAgKCgibnVtYmVyIG9mIHBhcmFtZXRlcnMiKSAoMSBieXRlKSAoIm5wYXJhbXMiKSkKLSAgICAgICAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKSkKLQotKCJkZHMiIDB4NGMKLSAoKCJzdGFydC9lbmQiKSAoMSBiaXQpICgiZW5kIikpCi0gKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgIiFwdHItPmVuZCIKLSAgICAgICAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKSkKLQotKCJkcHQiIDB4NTAKLSAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpCi0gKCgiZHVubm8iKSAoMSBieXRlKSAoImR1bm5vIikpKQotCi0oImRzZSIgMHg1NAotICgoIm5lZyBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkKLSAoKCJkdW5ubyIpICgxIGJ5dGUpICgiZHVubm8iKSkpCi0KLSgiZG90IiAweDU2Ci0gKCgidW5rbm93biIpICgxIGJ5dGUpICgidW5rbm93biIpKSkKLTsgRklYTUU6IHVua25vd24gZmllbGQgc2hvdWxkIGJlIHJlcGVhdGVkIHN5bWJvbCBudW1iZXI/Ci0KLQotKCJkc3MiIDB4NDIKLSAoKCJ0eXBlIikgKDEgYnl0ZSkgKCJ0eXBlIikpCi0gKCgiZXh0ZXJuYWwvaW50ZXJuYWwiKSAoMSBiaXQpICgiaW50ZXJuYWwiKSkKLSAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUiKSkKLSAoY29uZCAiIXB0ci0+aW50ZXJuYWwiCi0gICAgICAgKCAgKCJwYWNrYWdlIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJwYWNrYWdlIikpKQotIChjb25kICJwdHItPmludGVybmFsIgotICAgICAgICgoInN5bWJvbCBpZCIpICgyIGJ5dGVzKSAoImlkIikpKQotICgoInJlY29yZCB0eXBlIikgKDIgYnl0ZXMpICgicmVjb3JkIikpCi0gKCgicnVsZXMiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJydWxlcyIpKQotICgoIm51bWJlciBvZiBzeW1ib2xzIikgKDIgYnl0ZXMpICgibnN5bWJvbHMiKSkKLSAoKCJ1bmtub3duIiApICgyIGJ5dGVzKSAoImZpeG1lIikpKQotICAgICAKLSgicHNzIiAweDQwCi0gKCgibmVnb3RpYXRpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgiZWZuIikpCi0gKCgibnVtYmVyIG9mIHNvdXJjZSBmaWxlcyIpICgyIGJ5dGVzKSAoIm5zIikpCi0gKHJlcGVhdCAicHRyLT5ucyIKLQkgKCgiZGlyZWN0b3J5IHJlZmVyZW5jZSBiaXQiKSAoMSBiaXQpICgiZHJiIikpCi0JICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQotCSAoKCJjb21wbGV0ZWQgZmlsZSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgiZm5hbWUiKSkKLQkgKGNvbmQgInB0ci0+ZHJiW25dIiAKLQkgICAgICAgKCgiZGlyZWN0b3J5IGFwcGVyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJkYW4iKSkpKQotIAotICgoIm51bWJlciBvZiBkaXJlY3RvcmllcyIpICgyIGJ5dGVzKSAoIm5kaXIiKSkKLSAocmVwZWF0ICJwdHItPm5kaXIiCi0JICgoImRpcmVjdG9yeSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoImRuYW1lIikpKSkKLQotCi07IEZJWE1FOiB0aGUgdHIgYmxvY2sgaGFzIG5vIGNvbnRlbnRzLiBzeXNpbmZvLCBldGMuIGFyZW4ndCBwcmVwYXJlZCAKLTsgdG8gZGVhbCB3aXRoIHRoYXQuCi07ICgidHIiIDB4N2YpCi0KLQotKCJkdXMiIDB4NDAKLSAoKCJuZWdvdGlhdGlvbiBudW1iZXIiKSAoMiBieXRlcykgKCJlZm4iKSkKLSAoKCJudW1iZXIgb2Ygc291cmNlIGZpbGVzIikgKDIgYnl0ZXMpICgibnMiKSkKLSAocmVwZWF0ICJwdHItPm5zIgotCSAoKCJkaXJlY3RvcnkgcmVmZXJlbmNlIGJpdCIpICgxIGJpdCkgKCJkcmIiKSkKLQkgKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCi0JICgoImNvbXBsZXRlZCBmaWxlIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJmbmFtZSIpKQotCSAoY29uZCAicHRyLT5kcmJbbl0iIAotCSAgICAgICAoKCJkaXJlY3RvcnkgYXBwZXJhbmNlIG51bWJlciIpICgyIGJ5dGVzKSAoImRhbiIpKSkpCi0gKCgibnVtYmVyIG9mIGRpcmVjdG9yaWVzIikgKDIgYnl0ZXMpICgibmRpciIpKQotIChyZXBlYXQgInB0ci0+bmRpciIKLQkgKCgiZGlyZWN0b3J5IG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgiZG5hbWUiKSkpKQotCi0KLSgiZHBzIiAweDMyCi0gKCgic3RhcnQvZW5kIGZsYWciKSAoMSBiaXQpICgiZW5kIikpCi0gKCgiYmxvY2sgdHlwZSIpICg3IGJpdHMpICgidHlwZSIpCi0gICgoIkJMT0NLX1RZUEVfQ09NUFVOSVQiICIwIikKLSAgICgiQkxPQ0tfVFlQRV9QUk9DRURVUkUiICIyIikKLSAgICgiQkxPQ0tfVFlQRV9GVU5DVElPTiIgIjMiKQotICAgKCJCTE9DS19UWVBFX0JMT0NLIiAiNCIpCi0gICAoIkJMT0NLX1RZUEVfQkFTSUMiICI5IikpKQotIChjb25kICIhcHRyLT5lbmQiCi0gICAgICAgKCgib3B0aW1pemF0aW9uIikgKDEgYnl0ZSkgKCJvcHQiKSkKLSAgICAgICAoKCJzZWN0aW9uIG51bWJlciIpICgyIGJ5dGVzKSAoInNhbiIpKQotICAgICAgICgoImFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWRkcmVzcyIpKQotICAgICAgICgoImJsb2NrIHNpemUiKSAoYWRkcnNpemUgYnl0ZXMpICgiYmxvY2tfc2l6ZSIpKQotICAgICAgICgoIm5lc3RpbmciKSAoMSBieXRlKSAoIm5lc3RpbmciKSkKLSAgICAgICAoY29uZCAicHRyLT50eXBlID09IEJMT0NLX1RZUEVfUFJPQ0VEVVJFIAotCSAgICB8fCBwdHItPnR5cGUgPT0gQkxPQ0tfVFlQRV9GVU5DVElPTiIKLQkgICAgICgoInJldHVybiBhZGRyZXNzIikgKDEgYml0KSAoInJldGFkZHIiKSkKLQkgICAgICgoImludGVycnVwdCBmdW5jdGlvbiBmbGFnIikgKDEgYml0KSAoImludHJmbGFnIikpCi0JICAgICAoKCJzdGFjayB1cGRhdGUgZmxhZyIpICgxIGJpdCkgKCJzdGFja2ZsYWciKSkKLQkgICAgICgoImludHJhIHBhZ2UgSk1QIikgKDEgYml0KSAoImludHJwYWdlam1wIikpCi0JICAgICAoKCJzcGFyZSIpICg0IGJpdHMpICgic3BhcmUiKSkpCi0gICAgICAgKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCi0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cgYi9iaW51dGlscy90ZXN0c3VpdGUvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWEwNTc3Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw1ODUgKzAsMCBAQAotMTk5OS0wMy0xMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL3JlYWRlbGYud2k6IFJlbW92ZSBGUjMwIHNwZWNpZmljIGNvbXBvbm50cy4KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnM6IFJlbW92ZSBSRUxBIHNwZWNpZmljIGNvbXBvbmVudHMuCi0KLTE5OTktMDItMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+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+Ci0KLWlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBpZiB7W3doaWNoICRBUl0gPT0gMH0gdGhlbiB7Ci0gICAgICAgIHBlcnJvciAiJEFSIGRvZXMgbm90IGV4aXN0IgotICAgICAgICByZXR1cm4KLSAgICB9Ci19Ci0KLSMgc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJEFSXSIKLQotIyBUZXN0IGxvbmcgZmlsZSBuYW1lIHN1cHBvcnQKLQotcHJvYyBsb25nX2ZpbGVuYW1lcyB7IH0gewotICAgIGdsb2JhbCBBUgotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIHNldCB0ZXN0bmFtZSAiYXIgbG9uZyBmaWxlIG5hbWVzIgotCi0gICAgc2V0IG4xICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejEiCi0gICAgc2V0IG4yICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejIiCi0gICAgc2V0IGZpbGUxIHRtcGRpci8kbjEKLSAgICBzZXQgZmlsZTIgdG1wZGlyLyRuMgotCi0gICAgcmVtb3RlX2ZpbGUgYnVpbGQgZGVsZXRlICRmaWxlMQotCi0gICAgIyBTb21lIGZpbGUgc3lzdGVtcyB0cnVuY2F0ZSBmaWxlIG5hbWVzIGF0IDE0IGNoYXJhY3RlcnMsIHdoaWNoCi0gICAgIyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHJ1biB0aGlzIHRlc3QuICBDaGVjayBmb3IgdGhhdCBub3cuCi0gICAgc2V0IHN0YXR1cyBbY2F0Y2ggInNldCBmIFtvcGVuIHRtcGRpci8kbjEgd10iIGVycnNdCi0gICAgaWYgeyAkc3RhdHVzICE9IDAgfSB7Ci0JdmVyYm9zZSAtbG9nICJvcGVuIHRtcGRpci8kbjEgcmV0dXJuZWQgJGVycnMiCi0JdW5zdXBwb3J0ZWQgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotICAgIHB1dHMgJGYgImZpcnN0IgotICAgIGNsb3NlICRmCi0KLQotICAgIHJlbW90ZV9maWxlIGJ1aWxkIGRlbGV0ZSAkZmlsZTIKLQotICAgIHNldCBzdGF0dXMgW2NhdGNoICJzZXQgZiBbb3BlbiB0bXBkaXIvJG4yIHddIiBlcnJzXQotICAgIGlmIHsgJHN0YXR1cyAhPSAwIH0gewotCXZlcmJvc2UgLWxvZyAib3BlbiB0bXBkaXIvJG4yIHJldHVybmVkICRlcnJzIgotCXVuc3VwcG9ydGVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLSAgICBwdXRzICRmICJzZWNvbmQiCi0gICAgY2xvc2UgJGYKLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXNldCBmaWxlMSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgJGZpbGUxXTsKLQlzZXQgZmlsZTIgW3JlbW90ZV9kb3dubG9hZCBob3N0ICRmaWxlMl07Ci0Jc2V0IGRlc3QgYXJ0ZXN0LmEKLSAgICB9IGVsc2UgewotCXNldCBkZXN0IHRtcGRpci9hcnRlc3QuYQotICAgIH0KLQotICAgIHJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRkZXN0OwotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRBUiAicmMgJGRlc3QgJGZpbGUxICRmaWxlMiJdCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICRmaWxlMSB0bXBkaXIvJG4xCi0gICAgfQotCi0gICAgc2V0IGYgW29wZW4gdG1wZGlyLyRuMSByXQotICAgIGdldHMgJGYgc3RyaW5nCi0gICAgY2xvc2UgJGYKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiZmlyc3QiICRzdHJpbmddIHsKLQl2ZXJib3NlIC1sb2cgInJlYWRpbmcgdG1wZGlyLyRuMSByZXR1cm5lZCAkc3RyaW5nIgotCXVuc3VwcG9ydGVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRkZXN0OwotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkQVIgInJjICRkZXN0ICRmaWxlMSAkZmlsZTIiXQotCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gewotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgcmVtb3RlX2ZpbGUgYnVpbGQgZGVsZXRlIHRtcGRpci8kbjEKLSAgICByZW1vdGVfZmlsZSBidWlsZCBkZWxldGUgdG1wZGlyLyRuMgotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRBUiAidCAkZGVzdCJdCi0gICAgcmVnc3ViICJcW1xyXG4gXHRcXSokIiAiJGdvdCIgIiIgZ290OwotICAgIGlmICFbc3RyaW5nIG1hdGNoICIkbjEqJG4yIiAkZ290XSB7Ci0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX2ZpbGUgaG9zdCBkZWxldGUgJGZpbGUxOwotCXJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRmaWxlMjsKLSAgICB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRBUiB4ICRkZXN0IgotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICRBUiAieCAkZGVzdCJdCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JdmVyYm9zZSAtbG9nICRleGVjX291dHB1dAotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICRuMSB0bXBkaXIvJG4xOwotCXJlbW90ZV91cGxvYWQgaG9zdCAkbjIgdG1wZGlyLyRuMjsKLQlzZXQgZmlsZTEgdG1wZGlyLyRuMQotCXNldCBmaWxlMiB0bXBkaXIvJG4yCi0gICAgfSBlbHNlIHsKLQlzZXQgZmlsZTEgJG4xCi0Jc2V0IGZpbGUyICRuMgotICAgIH0KLQotICAgIGlmICFbZmlsZSBleGlzdHMgJGZpbGUxXSB7Ci0JdmVyYm9zZSAtbG9nICIkZmlsZTEgZG9lcyBub3QgZXhpc3QiCi0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgaWYgIVtmaWxlIGV4aXN0cyAkZmlsZTJdIHsKLQl2ZXJib3NlIC1sb2cgIiRmaWxlMiBkb2VzIG5vdCBleGlzdCIKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHNldCBmIFtvcGVuICRmaWxlMSByXQotICAgIGlmIHsgW2dldHMgJGYgbGluZV0gPT0gLTEgfHwgJGxpbmUgIT0gImZpcnN0IiB9IHsKLQl2ZXJib3NlIC1sb2cgIiRmaWxlMSBjb250ZW50czoiCi0JdmVyYm9zZSAtbG9nICIkbGluZSIKLQljbG9zZSAkZgotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotICAgIGNsb3NlICRmCi0KLSAgICBzZXQgZiBbb3BlbiAkZmlsZTIgcl0KLSAgICBpZiB7IFtnZXRzICRmIGxpbmVdID09IC0xIHx8ICRsaW5lICE9ICJzZWNvbmQiIH0gewotCXZlcmJvc2UgLWxvZyAiJGZpbGUyIGNvbnRlbnRzOiIKLQl2ZXJib3NlIC1sb2cgIiRsaW5lIgotCWNsb3NlICRmCi0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgY2xvc2UgJGYKLQotICAgIHBhc3MgJHRlc3RuYW1lCi19Ci0KLSMgVGVzdCBidWlsZGluZyB0aGUgc3ltYm9sIHRhYmxlLgotCi1wcm9jIHN5bWJvbF90YWJsZSB7IH0gewotICAgIGdsb2JhbCBBUgotICAgIGdsb2JhbCBBUwotICAgIGdsb2JhbCBOTQotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0KLSAgICBzZXQgdGVzdG5hbWUgImFyIHN5bWJvbCB0YWJsZSIKLQotICAgIGlmICFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2JpbnRlc3QucyB0bXBkaXIvYmludGVzdC5vXSB7Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgYXJjaGl2ZSBhcnRlc3QuYQotCXNldCBvYmpmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYmludGVzdC5vXQotCXJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRhcmNoaXZlCi0gICAgfSBlbHNlIHsKLQlzZXQgYXJjaGl2ZSB0bXBkaXIvYXJ0ZXN0LmEKLQlzZXQgb2JqZmlsZSB0bXBkaXIvYmludGVzdC5vCi0gICAgfQotCi0gICAgcmVtb3RlX2ZpbGUgYnVpbGQgZGVsZXRlIHRtcGRpci9hcnRlc3QuYQotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRBUiAicmMgJGFyY2hpdmUgJHtvYmpmaWxlfSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gewotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICROTSAiLS1wcmludC1hcm1hcCAkYXJjaGl2ZSJdCi0gICAgaWYgeyAhW3N0cmluZyBtYXRjaCAiKnRleHRfc3ltYm9sIGluIGJpbnRlc3QubyoiICRnb3RdIFwKLQkgfHwgIVtzdHJpbmcgbWF0Y2ggIipkYXRhX3N5bWJvbCBpbiBiaW50ZXN0Lm8qIiAkZ290XSBcCi0JIHx8ICFbc3RyaW5nIG1hdGNoICIqY29tbW9uX3N5bWJvbCBpbiBiaW50ZXN0Lm8qIiAkZ290XSBcCi0JIHx8IFtzdHJpbmcgbWF0Y2ggIipzdGF0aWNfdGV4dF9zeW1ib2wgaW4gYmludGVzdC5vKiIgJGdvdF0gXAotCSB8fCBbc3RyaW5nIG1hdGNoICIqc3RhdGljX2RhdGFfc3ltYm9sIGluIGJpbnRlc3QubyoiICRnb3RdIFwKLQkgfHwgW3N0cmluZyBtYXRjaCAiKmV4dGVybmFsX3N5bWJvbCBpbiBiaW50ZXN0Lm8qIiAkZ290XSB9IHsKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHBhc3MgJHRlc3RuYW1lCi19Ci0KLSMgUnVuIHRoZSB0ZXN0cy4KLQotbG9uZ19maWxlbmFtZXMKLXN5bWJvbF90YWJsZQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9iaW50ZXN0LnMgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2JpbnRlc3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwMDY1MC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2JpbnRlc3QucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkuZ2xvYmwgdGV4dF9zeW1ib2wKLQkudGV4dAotdGV4dF9zeW1ib2w6CQotc3RhdGljX3RleHRfc3ltYm9sOgotCS5sb25nCTEKLQkubG9uZwlleHRlcm5hbF9zeW1ib2wKLQkuZ2xvYmwgZGF0YV9zeW1ib2wKLQkuZGF0YQotZGF0YV9zeW1ib2w6Ci1zdGF0aWNfZGF0YV9zeW1ib2w6Ci0JLmxvbmcJMgotCS5jb21tIGNvbW1vbl9zeW1ib2wsNApkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL2FkZGVuZGJ1Zy5zIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL2FkZGVuZGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTkzMDZmLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvaHBwYS9hZGRlbmRidWcucworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGluaXRpYWxpemVfY2hhcl9zeW50YXgsQ09ERQotCS5FWFBPUlQgaW5pdGlhbGl6ZV9jaGFyX3N5bnRheCxFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotaW5pdGlhbGl6ZV9jaGFyX3N5bnRheAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTY0LE5PX0NBTExTLFNBVkVfU1AsRU5UUllfR1I9MwotCS5FTlRSWQotCWFkZGlsIEwnaXNfaWRjaGFyLSRnbG9iYWwkLTMyLCVyMjcKLQkuRVhJVAotCS5QUk9DRU5ECi1pc19pZGNoYXIJLmNvbW0gMjU2CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NmIyODkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL29iamR1bXAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4KLSMgYW5kIHJld3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotaWYgIVtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4gewotICByZXR1cm4KLX0KLQotaWYge1t3aGljaCAkT0JKRFVNUF0gPT0gMH0gdGhlbiB7Ci0gICAgcGVycm9yICIkT0JKRFVNUCBkb2VzIG5vdCBleGlzdCIKLSAgICByZXR1cm4KLX0KLQotc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJE9CSkRVTVBdIgotCi1pZiB7IVtiaW51dGlsc19hc3NlbWJsZSAkc3JjZGlyLyRzdWJkaXIvYWRkZW5kYnVnLnMgdG1wZGlyL2FkZGVuZGJ1Zy5vXX0gdGhlbiB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIFtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCBvYmpmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYWRkZW5kYnVnLm9dCi19IGVsc2UgewotICAgIHNldCBvYmpmaWxlIHRtcGRpci9hZGRlbmRidWcubwotfQotCi0jIE1ha2Ugc3VyZSB0aGUgU09NIEJGRCBjb2RlIHNpZ24gZXh0ZW5kcyBjb25zdGFudHMgaW4gUl9EQVRBX09WRVJSSURFIGZpeHVwcy4KLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1yICRvYmpmaWxlIl0KLQotaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotICBzZXQgd2FudCAiMDAwMDAwMDAgUl9QQVJJU0NfRFBSRUwyMUxcWyAJXF0raXNfaWRjaGFyXFwrMHhmZmZmZmZlMC4qIgotfSBlbHNlIHsKLSAgc2V0IHdhbnQgIjAwMDAwMDAwIFJfRFBfUkVMQVRJVkVcWyAJXF0raXNfaWRjaGFyXFwrMHhmZmZmZmZlMC4qIgotfQotCi0KLWlmIFtyZWdleHAgJHdhbnQgJGdvdF0gdGhlbiB7Ci0gICAgcGFzcyAiYWRkZW5kYnVnIHRlc3QiCi19IGVsc2UgewotICAgIGZhaWwgImFkZGVuZGJ1ZyB0ZXN0IgotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ubS5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL25tLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjN2M1Zi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL25tLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUgPHJvYkBjeWdudXMuY29tPgotIyBhbmQgcmV3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1pZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgaWYge1t3aGljaCAkTk1dID09IDB9IHRoZW4gewotICAgICAgICBwZXJyb3IgIiROTSBkb2VzIG5vdCBleGlzdCIKLSAgICAgICAgcmV0dXJuCi0gICAgfQotfQotCi1zZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkTk1dIgotCi0KLWlmIHshW2JpbnV0aWxzX2Fzc2VtYmxlICRzcmNkaXIvJHN1YmRpci9iaW50ZXN0LnMgdG1wZGlyL2JpbnRlc3Qub119IHRoZW4gewotICAgIHJldHVybgotfQotCi1pZiBbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBzZXQgdGVtcGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9iaW50ZXN0Lm9dCi19IGVsc2UgewotICAgIHNldCB0ZW1wZmlsZSB0bXBkaXIvYmludGVzdC5vCi19Ci0KLSMgVGVzdCBubSB3aXRoIG5vIGFyZ3VtZW50cy4KLQotIyBUaGlzIHRlc3QgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgb24gRUNPRkYgdGFyZ2V0cywgYmVjYXVzZSBFQ09GRgotIyBzdG9yZXMgbW9zdCBzeW1ib2xzIHR3aWNlLCB3aGljaCBtZXNzZXMgdXAgdGhlIG5tIG91dHB1dC4KLXNldHVwX3hmYWlsICJhbHBoYSotKi1vc2YqIiAiYWxwaGEqLSotbmV0d2FyZSoiCi1zZXR1cF94ZmFpbCAibWlwcyotKi11bHRyaXgqIiAibWlwcyotKi1lY29mZioiICJtaXBzKi0qLWlyaXg0KiIKLXNldHVwX3hmYWlsICJtaXBzKi0qLXJpc2NvcyoiICJtaXBzKi0qLXN5c3YzKiIgIm1pcHMqLXNvbnktYnNkKiIKLQotIyBUaGlzIHRlc3QgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgb24gWENPRkYgdGFyZ2V0cywgYmVjYXVzZSBYQ09GRgotIyBkb2VzIG5vdCBlbnRlciBzdGF0aWMgc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlLgotc2V0dXBfeGZhaWwgIiotKi1haXgqIgotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAkdGVtcGZpbGUiXQotCi1pZiBbaW5mbyBleGlzdHMgdmFyc10gdGhlbiB7IHVuc2V0IHZhcnMgfQotd2hpbGUge1tyZWdleHAgIihcW2EtekEtWlxdKSAoXFthLXpfXF0qX3N5bWJvbCkoLiopIiAkZ290IGFsbCB0eXBlIHN5bWJvbCByZXN0XX0gewotICAgIHNldCB2YXJzKCRzeW1ib2wpICR0eXBlCi0gICAgc2V0IGdvdCAkcmVzdAotfQotCi1pZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHRleHRfc3ltYm9sKV0gXAotICAgICB8fCAkdmFycyh0ZXh0X3N5bWJvbCkgIT0gIlQiIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGRhdGFfc3ltYm9sKV0gXAotICAgICB8fCAkdmFycyhkYXRhX3N5bWJvbCkgIT0gIkQiIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGNvbW1vbl9zeW1ib2wpXSBcCi0gICAgIHx8ICR2YXJzKGNvbW1vbl9zeW1ib2wpICE9ICJDIiBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhleHRlcm5hbF9zeW1ib2wpXSBcCi0gICAgIHx8ICR2YXJzKGV4dGVybmFsX3N5bWJvbCkgIT0gIlUiIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKHN0YXRpY190ZXh0X3N5bWJvbCldIFwKLSAgICAgfHwgJHZhcnMoc3RhdGljX3RleHRfc3ltYm9sKSAhPSAidCIgXAotICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoc3RhdGljX2RhdGFfc3ltYm9sKV0gXAotICAgICB8fCAkdmFycyhzdGF0aWNfZGF0YV9zeW1ib2wpICE9ICJkIn0gewotICAgIGZhaWwgIm5tIChubyBhcmd1bWVudHMpIgotfSBlbHNlIHsKLSAgICBwYXNzICJubSAobm8gYXJndW1lbnRzKSIKLX0KLQotIyBUZXN0IG5tIC1nCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkTk0gIiROTUZMQUdTIC1nICR0ZW1wZmlsZSJdCi0KLWlmIFtpbmZvIGV4aXN0cyB2YXJzXSB0aGVuIHsgdW5zZXQgdmFycyB9Ci13aGlsZSB7W3JlZ2V4cCAiKFxbYS16X1xdKl9zeW1ib2wpKC4qKSIgJGdvdCBhbGwgc3ltYm9sIHJlc3RdfSB7Ci0gICAgc2V0IHZhcnMoJHN5bWJvbCkgMQotICAgIHNldCBnb3QgJHJlc3QKLX0KLQotaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0ZXh0X3N5bWJvbCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGRhdGFfc3ltYm9sKV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoY29tbW9uX3N5bWJvbCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGV4dGVybmFsX3N5bWJvbCldIFwKLSAgICAgfHwgW2luZm8gZXhpc3RzIHZhcnMoc3RhdGljX3RleHRfc3ltYm9sKV0gXAotICAgICB8fCBbaW5mbyBleGlzdHMgdmFycyhzdGF0aWNfZGF0YV9zeW1ib2wpXX0gewotICAgIGZhaWwgIm5tIC1nIgotfSBlbHNlIHsKLSAgICBwYXNzICJubSAtZyIKLX0KLQotIyBUZXN0IG5tIC1QCi0KLSMgVGhpcyB0ZXN0IGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IG9uIEVDT0ZGIHRhcmdldHMsIGJlY2F1c2UgRUNPRkYKLSMgc3RvcmVzIG1vc3Qgc3ltYm9scyB0d2ljZSwgd2hpY2ggbWVzc2VzIHVwIHRoZSBubSBvdXRwdXQuCi1zZXR1cF94ZmFpbCAiYWxwaGEqLSotb3NmKiIgImFscGhhKi0qLW5ldHdhcmUqIgotc2V0dXBfeGZhaWwgIm1pcHMqLSotdWx0cml4KiIgIm1pcHMqLSotZWNvZmYqIiAibWlwcyotKi1pcml4NCoiCi1zZXR1cF94ZmFpbCAibWlwcyotKi1yaXNjb3MqIiAibWlwcyotKi1zeXN2MyoiICJtaXBzKi1zb255LWJzZCoiCi0KLSMgVGhpcyB0ZXN0IGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IG9uIFhDT0ZGIHRhcmdldHMsIGJlY2F1c2UgWENPRkYKLSMgZG9lcyBub3QgZW50ZXIgc3RhdGljIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZS4KLXNldHVwX3hmYWlsICIqLSotYWl4KiIKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICROTSAiJE5NRkxBR1MgLVAgJHRlbXBmaWxlIl0KLQotc2V0IHdhbnQgImNvbW1vbl9zeW1ib2wgQyBcWzBcXSo0LipkYXRhX3N5bWJvbCBEIFxbMC05YS1mQS1GXF0qLipleHRlcm5hbF9zeW1ib2wgVS4qc3RhdGljX2RhdGFfc3ltYm9sIGQgXFswLTlhLWZBLUZcXSouKnN0YXRpY190ZXh0X3N5bWJvbCB0IFxbMC05YS1mQS1GXF0qLip0ZXh0X3N5bWJvbCBUIFxbMC05YS1mQS1GXF0qIgotCi1pZiBbcmVnZXhwICR3YW50ICRnb3RdIHRoZW4gewotICAgIHBhc3MgIm5tIC1QIgotfSBlbHNlIHsKLSAgICBmYWlsICJubSAtUCIKLX0KLQotIyBUaGVyZSBhcmUgY2VydGFpbmx5IG90aGVyIHRlc3RzIHRoYXQgY291bGQgYmUgcnVuLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvb2JqY29weS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTcyZjEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDU5MSArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIGlmIHtbd2hpY2ggJE9CSkNPUFldID09IDB9IHRoZW4gewotICAgICAgICBwZXJyb3IgIiRPQkpDT1BZIGRvZXMgbm90IGV4aXN0IgotICAgICAgICByZXR1cm4KLSAgICB9Ci19Ci0KLXNlbmRfdXNlciAiVmVyc2lvbiBbYmludXRpbF92ZXJzaW9uICRPQkpDT1BZXSIKLQotaWYgeyFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2JpbnRlc3QucyB0bXBkaXIvYmludGVzdC5vXX0gdGhlbiB7Ci0gICAgcGVycm9yICJ1bnJlc29sdmVkIDEiCi0gICAgdW5yZXNvbHZlZCAib2JqY29weSAoc2ltcGxlIGNvcHkpIgotICAgIHJldHVybgotfQotCi1pZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IHRlbXBmaWxlIHRtcGRpci9iaW50ZXN0Lm87Ci0gICAgc2V0IGNvcHlmaWxlIHRtcGRpci9jb3B5OwotfSBlbHNlIHsKLSAgICBzZXQgdGVtcGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9iaW50ZXN0Lm9dCi0gICAgc2V0IGNvcHlmaWxlIGNvcHkKLX0KLQotIyBUZXN0IHRoYXQgb2JqY29weSBkb2VzIG5vdCBtb2RpZnkgYSBmaWxlIHdoZW4gY29weWluZyBpdC4KLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5vIl0KLQotaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7Ci0gICAgZmFpbCAib2JqY29weSAoc2ltcGxlIGNvcHkpIgotfSBlbHNlIHsKLSAgICBzZW5kX2xvZyAiY21wICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5vXG4iCi0gICAgdmVyYm9zZSAiY21wICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5vIgotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXNldCBzcmMxIHRtcGRpci9iaW50ZXN0Lm8KLQlzZXQgc3JjMiB0bXBkaXIvY29weS5vCi0JcmVtb3RlX3VwbG9hZCBob3N0ICR0ZW1wZmlsZSAkc3JjMTsKLQlyZW1vdGVfdXBsb2FkIGhvc3QgJHtjb3B5ZmlsZX0ubyAkc3JjMjsKLSAgICB9IGVsc2UgewotCXNldCBzcmMxICR7dGVtcGZpbGV9Ci0Jc2V0IHNyYzIgJHtjb3B5ZmlsZX0ubwotICAgIH0KLSAgICBzZXQgc3RhdHVzIFtyZW1vdGVfZXhlYyBidWlsZCBjbXAgIiR7c3JjMX0gJHtzcmMyfSJdOwotICAgIHNldCBleGVjX291dHB1dCBbbGluZGV4ICRzdGF0dXMgMV07Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLSAgICAjIE9uIHNvbWUgc3lzdGVtcyB0aGUgcmVzdWx0IG9mIG9iamNvcHkgd2lsbCBub3QgYmUgaWRlbnRpY2FsLgotICAgICMgVXN1YWxseSB0aGlzIGlzIGp1c3QgYmVjYXVzZSBnYXMgaXNuJ3QgdXNpbmcgYmZkIHRvIHdyaXRlIHRoZSBmaWxlcwotICAgICMgaW4gdGhlIGZpcnN0IHBsYWNlLCBhbmQgbWF5IG9yZGVyIHRoaW5ncyBhIGxpdHRsZSBkaWZmZXJlbnRseS4KLSAgICAjIFRob3NlIHN5c3RlbXMgc2hvdWxkIHVzZSBzZXR1cF94ZmFpbCBoZXJlLgotCi0gICAgc2V0dXBfeGZhaWwgInNoLSotY29mZiIgInNoLSotaG1zIiAKLSAgICBzZXR1cF94ZmFpbCAibTY4Ki0qLWhwdXgqIiAibTY4Ki0qLXN1bm9zKiIgIm02OCotKi1jb2ZmIiAibTY4Ki0qLXZ4d29ya3MqIgotICAgIHNldHVwX3hmYWlsICJtNjgqLWVyaWNzc29uLW9zZSIgIm02OGsqLW1vdG9yb2xhLXN5c3YqIgotICAgIHNldHVwX3hmYWlsICJpKjg2LSotbGludXhhb3V0KiIgImkqODYtKi1hb3V0KiIKLSAgICBzZXR1cF94ZmFpbCAiaSo4Ni0qLXN5c3YzIiAiaSo4Ni0qLWlzYyoiICJpKjg2LSotc2NvKiIgImkqODYtKi1jb2ZmIgotICAgIHNldHVwX3hmYWlsICJpKjg2LSotYWl4KiIgImkqODYtKi1nbzMyKiIKLSAgICBzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIgImEyOWstKi1jb2ZmIiAiYTI5ay0qLXZ4d29ya3MqIgotICAgIHNldHVwX3hmYWlsICJpOTYwLSotY29mZiIKLSAgICBzZXR1cF94ZmFpbCAiaDgzMDAtKi1obXMiICJoODMwMC0qLWNvZmYiCi0gICAgc2V0dXBfeGZhaWwgImg4NTAwLSotaG1zIiAiaDg1MDAtKi1jb2ZmIgotICAgIHNldHVwX3hmYWlsICJocHBhKi0qLSoiCi0gICAgY2xlYXJfeGZhaWwgImhwcGEqLSotKmVsZioiCi0gICAgc2V0dXBfeGZhaWwgIm04OCotKi1jb2ZmIiAibTg4Ki1tb3Rvcm9sYS1zeXN2KiIKLSAgICBzZXR1cF94ZmFpbCAiejgqLSotY29mZiIKLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlwYXNzICJvYmpjb3B5IChzaW1wbGUgY29weSkiCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IiAxCi0KLQkjIE9uIE9TRi8xLCB0aGlzIHN1Y2NlZWRzIHdpdGggZ2FzIGFuZCBmYWlscyB3aXRoIC9iaW4vYXMuCi0Jc2V0dXBfeGZhaWwgImFscGhhKi0qLW9zZioiCi0KLQkjIFRoaXMgZmFpbHMgZm9yIENPRkYgaTk2MC12eHdvcmtzIHRhcmdldHMuCi0Jc2V0dXBfeGZhaWwgImk5NjAtKi12eHdvcmtzKiIKLQotCWZhaWwgIm9iamNvcHkgKHNpbXBsZSBjb3B5KSIKLSAgICB9Ci19Ci0KLSMgVGVzdCBnZW5lcmF0aW5nIFMgcmVjb3Jkcy4KLQotIyBXZSBtYWtlIHRoZSBzcmVjIGZpbGVuYW1lIDguMyBjb21wYXRpYmxlLiBOb3RlIHRoYXQgdGhlIGhlYWRlciBzdHJpbmcKLSMgbWF0Y2hlZCBhZ2FpbnN0IGRlcGVuZHMgb24gdGhlIG5hbWUgb2YgdGhlIGZpbGUuIFVnaC4KLQotaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IHNyZWNmaWxlIGNvcHkuc3JlCi0gICAgc2V0IGhlYWRlcl9zdHJpbmcgUzAwQjAwMDA2MzZGNzA3OTJFNzM3MjY1QzEKLX0gZWxzZSB7Ci0gICAgc2V0IHNyZWNmaWxlICR7Y29weWZpbGV9LnNyZWMKLSAgICBzZXQgaGVhZGVyX3N0cmluZyBTMDEzMDAwMDc0NkQ3MDY0Njk3MjJGNjM2RjcwNzkyRTczNzI2NTYzOTcKLX0KLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTIC1PIHNyZWMgJHRlbXBmaWxlICR7c3JlY2ZpbGV9Il0KLQotaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7Ci0gICAgZmFpbCAib2JqY29weSAtTyBzcmVjIgotfSBlbHNlIHsKLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlyZW1vdGVfdXBsb2FkIGhvc3QgJHtzcmVjZmlsZX0gdG1wZGlyL2NvcHkuc3JlYzsKLQlzZXQgc3JlY2ZpbGUgdG1wZGlyL2NvcHkuc3JlYzsKLSAgICB9Ci0gICAgc2V0IGZpbGUgW29wZW4gJHtzcmVjZmlsZX0gcl0KLQotICAgICMgVGhlIGZpcnN0IFMgcmVjb3JkIGlzIGZpeGVkIGJ5IHRoZSBmaWxlIG5hbWUgd2UgYXJlIHVzaW5nLgotICAgIGdldHMgJGZpbGUgbGluZQotICAgIHNlbmRfbG9nICIkbGluZVxuIgotICAgIHZlcmJvc2UgJGxpbmUKLSAgICBpZiAhW3JlZ2V4cCAiJGhlYWRlcl9zdHJpbmcuKiIgJGxpbmVdIHsKLQlzZW5kX2xvZyAiYmFkIGhlYWRlclxuIgotCWZhaWwgIm9iamNvcHkgLU8gc3JlYyIKLSAgICB9IGVsc2UgewotCXdoaWxlIHtbZ2V0cyAkZmlsZSBsaW5lXSAhPSAtMSBcCi0JICAgICAgICYmIFtyZWdleHAgIl5TXFsxMjNcXVxbMC05YS1mQS1GXF0rXFtcclxuXF0qJCIgJGxpbmVdfSB7Ci0JICAgIHNlbmRfbG9nICIkbGluZVxuIgotCSAgICB2ZXJib3NlICRsaW5lCi0JICAgIHNldCBsaW5lICIqKkVPRioqIgotCX0KLQlzZW5kX2xvZyAiJGxpbmVcbiIKLQl2ZXJib3NlICRsaW5lCi0JaWYgIVtyZWdleHAgIl5TXFs3ODlcXVxbMC05YS1mQS1GXF0rXFtcclxuXF0qJCIgJGxpbmVdIHRoZW4gewotCSAgICBzZW5kX2xvZyAiYmFkIHRyYWlsZXJcbiIKLQkgICAgZmFpbCAib2JqY29weSAtTyBzcmVjIgotCX0gZWxzZSB7Ci0JICAgIGlmIHtbZ2V0cyAkZmlsZSBsaW5lXSAhPSAtMX0gdGhlbiB7Ci0JCXNlbmRfbG9nICJnYXJiYWdlIGF0IGVuZFxuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJdmVyYm9zZSAkbGluZQotCQlmYWlsICJvYmpjb3B5IC1PIHNyZWMiCi0JICAgIH0gZWxzZSB7Ci0JCXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtZiAke2NvcHlmaWxlfS5zcmVjIl0KLQkJaWYgIVtyZWdleHAgImZpbGUgZm9ybWF0IHNyZWMiICRnb3RdIHRoZW4gewotCQkgICAgc2VuZF9sb2cgIm9iamR1bXAgZmFpbGVkXG4iCi0JCSAgICBmYWlsICJvYmpjb3B5IC1PIHNyZWMiCi0JCX0gZWxzZSB7Ci0JCSAgICBwYXNzICJvYmpjb3B5IC1PIHNyZWMiCi0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBjbG9zZSAkZmlsZQotfQotCi0jIFRlc3Qgc2V0dGluZyBhbmQgYWRqdXN0aW5nIHRoZSBzdGFydCBhZGRyZXNzLiAgV2Ugb25seSB0ZXN0IHRoaXMKLSMgd2hpbGUgZ2VuZXJhdGluZyBTIHJlY29yZHMsIGJlY2F1c2Ugd2UgbWF5IG5vdCBiZSBhYmxlIHRvIHNldCB0aGUKLSMgc3RhcnQgYWRkcmVzcyBmb3Igb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cywgYW5kIHRoZSBTIHJlY29yZCBjYXNlCi0jIGlzIHRoZSBvbmx5IHVzZWZ1bCBvbmUgYW55aG93LgotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWYgJHRlbXBmaWxlIl0KLWlmICFbcmVnZXhwICJzdGFydCBhZGRyZXNzIChcWzAtOWEtZkEtRnhYXF0rKSIgJGdvdCBhbGwgb3JpZ3N0YXJ0XSB0aGVuIHsKLSAgICBwZXJyb3IgIm9iamR1bXAgY2FuIG5vdCByZWNvZ25pemUgYmludGVzdC5vIgotICAgIHNldCBvcmlnc3RhcnQgIiIKLX0gZWxzZSB7Ci0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTIC1PIHNyZWMgJHRlbXBmaWxlICR7Y29weWZpbGV9LnNyZWMgLS1zZXQtc3RhcnQgMHg3NjU0Il0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKLQlmYWlsICJvYmpjb3B5IC0tc2V0LXN0YXJ0IgotICAgIH0gZWxzZSB7Ci0Jc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1mICR7Y29weWZpbGV9LnNyZWMiXQotCWlmICFbcmVnZXhwICJmaWxlIGZvcm1hdCBzcmVjLipzdGFydCBhZGRyZXNzIChcWzAtOWEtZkEtRnhYXF0rKSIgJGdvdCBhbGwgc3JlY3N0YXJ0XSB0aGVuIHsKLQkgICAgZmFpbCAib2JqY29weSAtLXNldC1zdGFydCIKLQl9IGVsc2UgewotCSAgICBpZiB7JHNyZWNzdGFydCAhPSAweDc2NTR9IHRoZW4gewotCQlzZW5kX2xvZyAiJHNyZWNzdGFydCAhPSAweDc2NTRcbiIKLQkJZmFpbCAib2JqY29weSAtLXNldC1zdGFydCIKLQkgICAgfSBlbHNlIHsKLQkJcGFzcyAib2JqY29weSAtLXNldC1zdGFydCIKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkNPUFkgIiRPQkpDT1BZRkxBR1MgLU8gc3JlYyAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0uc3JlYyAtLWFkanVzdC1zdGFydCAweDEyMyJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7Ci0JZmFpbCAib2JqY29weSAtLWFkanVzdC1zdGFydCIKLSAgICB9IGVsc2UgewotCXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtZiAke2NvcHlmaWxlfS5zcmVjIl0KLQlpZiAhW3JlZ2V4cCAiZmlsZSBmb3JtYXQgc3JlYy4qc3RhcnQgYWRkcmVzcyAoXFswLTlhLWZBLUZ4WFxdKykiICRnb3QgYWxsIHNyZWNzdGFydF0gdGhlbiB7Ci0JICAgIGZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc3RhcnQiCi0JfSBlbHNlIHsKLQkgICAgaWYgeyRzcmVjc3RhcnQgIT0gJG9yaWdzdGFydCArIDB4MTIzfSB0aGVuIHsKLQkJc2VuZF9sb2cgIiRzcmVjc3RhcnQgIT0gJG9yaWdzdGFydCArIDB4MTIzXG4iCi0JCWZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc3RhcnQiCi0JICAgIH0gZWxzZSB7Ci0JCXBhc3MgIm9iamNvcHkgLS1hZGp1c3Qtc3RhcnQiCi0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0jIFRlc3QgYWRqdXN0aW5nIHRoZSBvdmVyYWxsIFZNQSwgYW5kIGFkanVzdGluZyB0aGUgVk1BIG9mIGEKLSMgcGFydGljdWxhciBzZWN0aW9uLiAgV2UgYWdhaW4gb25seSB0ZXN0IHRoaXMgd2hlbiBnZW5lcmF0aW5nIFMKLSMgcmVjb3Jkcy4KLQotc2V0IGxvdyAiIgotc2V0IGxvd25hbWUgIiIKLQotc2V0IGhlYWRlcnMgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtaCAkdGVtcGZpbGUiXQotCi1zZXQgaGVhZGVyc19yZWdleHAgIlxbIAkwLTlcXSsoXFteIAlcXSspXFsgCVxdKihcWzAtOWEtZkEtRlxdKylcWyAJXF0rXFswLTlhLWZBLUZcXStcWyAJXF0rKFxbMC05YS1mQS1GXF0rKVxbIAlcXStcWzAtOWEtZkEtRlxdK1xbIAlcXSsyXFsqXF1cWypcXVxbMC05XF0rKC4qKSIKLQotc2V0IGdvdCAkaGVhZGVycwotd2hpbGUge1tyZWdleHAgJGhlYWRlcnNfcmVnZXhwICRnb3QgYWxsIG5hbWUgc2l6ZSB2bWEgcmVzdF19IHsKLSAgICBzZXQgdm1hIDB4JHZtYQotICAgIHNldCBzaXplIDB4JHNpemUKLSAgICBpZiB7JHNpemUgIT0gMH0gewotCWlmIHskbG93ID09ICIiIHx8ICR2bWEgPCAkbG93fSB7Ci0gICAgICAgICAgICBzZXQgbG93ICR2bWEKLQkgICAgc2V0IGxvd25hbWUgJG5hbWUKLQl9Ci0gICAgfQotICAgIHNldCBnb3QgJHJlc3QKLX0KLQotaWYgeyRsb3cgPT0gIiIgfHwgJG9yaWdzdGFydCA9PSAiIn0gdGhlbiB7Ci0gICAgcGVycm9yICJvYmpkdW1wIGNhbiBub3QgcmVjb2duaXplIGJpbnRlc3QubyIKLX0gZWxzZSB7Ci0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTIC1PIHNyZWMgJHRlbXBmaWxlICR7Y29weWZpbGV9LnNyZWMgLS1hZGp1c3Qtdm1hIDB4MTIzIl0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKLSAgICAgICAgZmFpbCAib2JqY29weSAtLWFkanVzdC12bWEiCi0gICAgfSBlbHNlIHsKLQlzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWZoICR7Y29weWZpbGV9LnNyZWMiXQotCXNldCB3YW50ICJmaWxlIGZvcm1hdCBzcmVjLipzdGFydCBhZGRyZXNzXFsgCVxdKihcWzAtOWEtZkEtRnhYXF0rKS4qc2VjMVxbIAlcXStcWzAtOWEtZkEtRlxdK1xbIAlcXSsoXFswLTlhLWZBLUZcXSspIgotCWlmICFbcmVnZXhwICR3YW50ICRnb3QgYWxsIHN0YXJ0IHZtYV0gdGhlbiB7Ci0JICAgIGZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtdm1hIgotCX0gZWxzZSB7Ci0JICAgIHNldCB2bWEgMHgkdm1hCi0JICAgIGlmIHskdm1hICE9ICRsb3cgKyAweDEyM30gdGhlbiB7Ci0JCXNlbmRfbG9nICIkdm1hICE9ICRsb3cgKyAweDEyM1xuIgotCQlmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXZtYSIKLQkgICAgfSBlbHNlIHsKLQkJaWYgeyRzdGFydCAhPSAkb3JpZ3N0YXJ0ICsgMHgxMjN9IHRoZW4gewotCQkgICAgc2VuZF9sb2cgIiRzdGFydCAhPSAkb3JpZ3N0YXJ0ICsgMHgxMjNcbiIKLQkJICAgIGZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtdm1hIgotCQl9IGVsc2UgewotCQkgICAgcGFzcyAib2JqY29weSAtLWFkanVzdC12bWEiCi0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBzZXQgYXJnICIiCi0gICAgc2V0IGdvdCAkaGVhZGVycwotICAgIHdoaWxlIHtbcmVnZXhwICRoZWFkZXJzX3JlZ2V4cCAkZ290IGFsbCBuYW1lIHNpemUgdm1hIHJlc3RdfSB7Ci0Jc2V0IHZtYSAweCR2bWEKLQlpZiB7JHZtYSA9PSAkbG93fSB0aGVuIHsKLQkgICAgc2V0IGFyZyAiJGFyZyAtLWFkanVzdC1zZWN0aW9uLXZtYSAkbmFtZSs0IgotCX0KLQlzZXQgZ290ICRyZXN0Ci0gICAgfQotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTIC1PIHNyZWMgJHRlbXBmaWxlICR7Y29weWZpbGV9LnNyZWMgJGFyZyJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7Ci0JZmFpbCAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSArIgotICAgIH0gZWxzZSB7Ci0Jc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1oICR7Y29weWZpbGV9LnNyZWMiXQotCXNldCB3YW50ICJmaWxlIGZvcm1hdCBzcmVjLipzZWMxXFsgCVxdK1xbMC05YS1mQS1GXF0rXFsgCVxdKyhcWzAtOWEtZkEtRlxdKykiCi0JaWYgIVtyZWdleHAgJHdhbnQgJGdvdCBhbGwgdm1hXSB0aGVuIHsKLQkgICAgZmFpbCAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSArIgotCX0gZWxzZSB7Ci0JICAgIHNldCB2bWEgMHgkdm1hCi0JICAgIGlmIHskdm1hICE9ICRsb3cgKyA0fSB0aGVuIHsKLQkJc2VuZF9sb2cgIiR2bWEgIT0gJGxvdyArIDRcbiIKLQkJZmFpbCAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSArIgotCSAgICB9IGVsc2UgewotCQlwYXNzICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hICsiCi0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgcmVnc3ViIC1hbGwgIlxcKzQiICRhcmcgIj1bZXhwciAkbG93ICsgNF0iIGFyZ2VxCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTIC1PIHNyZWMgJHRlbXBmaWxlICR7Y29weWZpbGV9LnNyZWMgJGFyZ2VxIl0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKLQlmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hID0iCi0gICAgfSBlbHNlIHsKLQlzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWggJHtjb3B5ZmlsZX0uc3JlYyJdCi0Jc2V0IHdhbnQgImZpbGUgZm9ybWF0IHNyZWMuKnNlYzFcWyAJXF0rXFswLTlhLWZBLUZcXStcWyAJXF0rKFxbMC05YS1mQS1GXF0rKSIKLQlpZiAhW3JlZ2V4cCAkd2FudCAkZ290IGFsbCB2bWFdIHRoZW4gewotCSAgICBmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hID0iCi0JfSBlbHNlIHsKLQkgICAgc2V0IHZtYSAweCR2bWEKLQkgICAgaWYgeyR2bWEgIT0gJGxvdyArIDR9IHRoZW4gewotCQlzZW5kX2xvZyAiJHZtYSAhPSAkbG93ICsgNFxuIgotCQlmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hID0iCi0JICAgIH0gZWxzZSB7Ci0JCXBhc3MgIm9iamNvcHkgLS1hZGp1c3Qtc2VjdGlvbi12bWEgPSIKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLSMgVGVzdCBzdHJpcHBpbmcgYW4gb2JqZWN0LgotCi1wcm9jIHN0cmlwX3Rlc3QgeyB9IHsKLSAgICBnbG9iYWwgQ0MKLSAgICBnbG9iYWwgU1RSSVAKLSAgICBnbG9iYWwgU1RSSVBGTEFHUwotICAgIGdsb2JhbCBOTQotICAgIGdsb2JhbCBOTUZMQUdTCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLQotICAgIHNldCB0ZXN0ICJzdHJpcCIKLQotICAgIGlmIHsgW3RhcmdldF9jb21waWxlICRzcmNkaXIvJHN1YmRpci90ZXN0cHJvZy5jIHRtcGRpci90ZXN0cHJvZy5vIG9iamVjdCBkZWJ1Z10gIT0gIiIgfSB7Ci0JdW50ZXN0ZWQgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgb2JqZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL3Rlc3Rwcm9nLm9dOwotICAgIH0gZWxzZSB7Ci0Jc2V0IG9iamZpbGUgdG1wZGlyL3Rlc3Rwcm9nLm8KLSAgICB9Ci0KLSAgICBzZXQgZXhlY19vdXRwdXQgW2JpbnV0aWxzX3J1biAkU1RSSVAgIiRTVFJJUEZMQUdTICRvYmpmaWxlIl0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlmYWlsICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJE5NICItYSAkTk1GTEFHUyAkb2JqZmlsZSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIio6IG5vIHN5bWJvbHMqIiAkZXhlY19vdXRwdXRdIHsKLQlmYWlsICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgcGFzcyAkdGVzdAotfQotCi1zdHJpcF90ZXN0Ci0KLSMgVGVzdCBzdHJpcHBpbmcgYW4gb2JqZWN0IGZpbGUgd2l0aCBzYXZpbmcgYSBzeW1ib2wKLQotcHJvYyBzdHJpcF90ZXN0X3dpdGhfc2F2aW5nX2Ffc3ltYm9sIHsgfSB7Ci0gICAgZ2xvYmFsIENDCi0gICAgZ2xvYmFsIFNUUklQCi0gICAgZ2xvYmFsIFNUUklQRkxBR1MKLSAgICBnbG9iYWwgTk0KLSAgICBnbG9iYWwgTk1GTEFHUwotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0KLSAgICBzZXQgdGVzdCAic3RyaXAgd2l0aCBzYXZpbmcgYSBzeW1ib2wiCi0KLSAgICBpZiB7IFt0YXJnZXRfY29tcGlsZSAkc3JjZGlyLyRzdWJkaXIvdGVzdHByb2cuYyB0bXBkaXIvdGVzdHByb2cubyBvYmplY3QgZGVidWddICE9ICIiIH0gewotCXVudGVzdGVkICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0Jc2V0IG9iamZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci90ZXN0cHJvZy5vXTsKLSAgICB9IGVsc2UgewotCXNldCBvYmpmaWxlIHRtcGRpci90ZXN0cHJvZy5vCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJFNUUklQICIkU1RSSVBGTEFHUyAtSyBtYWluIC1LIF9tYWluICRvYmpmaWxlIl0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlmYWlsICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAkb2JqZmlsZSJdCi0gICAgaWYgeyFbcmVnZXhwIHteKFswLTlhLWZBLUZdKyk/WyBdK1QgbWFpbn0gJGV4ZWNfb3V0cHV0XSBcCi0gICAgICAgICAmJiAhW3JlZ2V4cCB7XihbMC05YS1mQS1GXSspP1sgXStUIF9tYWlufSAkZXhlY19vdXRwdXRdfSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIHBhc3MgJHRlc3QKLX0KLQotc3RyaXBfdGVzdF93aXRoX3NhdmluZ19hX3N5bWJvbAotCi0jIEJ1aWxkIGEgZmluYWwgZXhlY3V0YWJsZS4KLQotcHJvYyBjb3B5X3NldHVwIHsgfSB7Ci0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICAKLSAgICBzZXQgcmVzIFtidWlsZF93cmFwcGVyIHRlc3RnbHVlLm9dOwotICAgIHNldCBmbGFncyB7IGRlYnVnIH07Ci0gICAgCi0gICAgaWYgeyAkcmVzICE9ICIiIH0gewotCWxhcHBlbmQgZmxhZ3MgImFkZGl0aW9uYWxfZmxhZ3M9W2xpbmRleCAkcmVzIDFdIjsKLQlzZXQgYWRkX2xpYnMgInRlc3RnbHVlLm8iOwotICAgIH0gZWxzZSB7Ci0Jc2V0IGFkZF9saWJzICIiOwotICAgIH0KLQotICAgIGlmIHsgW3RhcmdldF9jb21waWxlICIkc3JjZGlyLyRzdWJkaXIvdGVzdHByb2cuYyAkYWRkX2xpYnMiIHRtcGRpci90ZXN0cHJvZyBleGVjdXRhYmxlICRmbGFnc10gICE9ICIiIH0gewotCXJldHVybiAyCi0gICAgfQotCi0gICAgc2V0IHJlc3VsdCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci90ZXN0cHJvZ107Ci0gICAgc2V0IHN0YXR1cyBbbGluZGV4ICRyZXN1bHQgMF07Ci0KLSAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiICB9IHsKLQlwZXJyb3IgInVucmVzb2x2ZWQgc2V0dXAsIHN0YXR1cyA9ICRzdGF0dXMiCi0JcmV0dXJuIDMKLSAgICB9Ci0KLSAgICByZXR1cm4gMAotfQotCi0jIFRlc3QgY29weWluZyBhbiBleGVjdXRhYmxlLgotCi1wcm9jIGNvcHlfZXhlY3V0YWJsZSB7IHByb2cgZmxhZ3MgdGVzdDEgdGVzdDIgfSB7Ci0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgdGVzdGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci90ZXN0cHJvZ107Ci0Jc2V0IHRlc3Rjb3B5IGNvcHlwcm9nCi0gICAgfSBlbHNlIHsKLQlzZXQgdGVzdGZpbGUgdG1wZGlyL3Rlc3Rwcm9nCi0Jc2V0IHRlc3Rjb3B5IHRtcGRpci9jb3B5cHJvZwotICAgIH0KLSAgICByZW1vdGVfZmlsZSBob3N0IGRlbGV0ZSAkdGVzdGNvcHk7Ci0KLSAgICBzZXQgZXhlY19vdXRwdXQgW2JpbnV0aWxzX3J1biAkcHJvZyAiJGZsYWdzICR0ZXN0ZmlsZSAkdGVzdGNvcHkiXQotCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JZmFpbCAkdGVzdDEKLQlmYWlsICR0ZXN0MgotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXJlbW90ZV91cGxvYWQgaG9zdCAkdGVzdGNvcHkgdG1wZGlyL2NvcHlwcm9nCi0gICAgfQotCi0gICAgc2V0IHN0YXR1cyBbcmVtb3RlX2V4ZWMgYnVpbGQgImNtcCIgInRtcGRpci90ZXN0cHJvZyB0bXBkaXIvY29weXByb2ciXQotICAgIHNldCBleGVjX291dHB1dCBbbGluZGV4ICRzdGF0dXMgMV07Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcGFzcyAkdGVzdDEKLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0KLQkjIFRoaXMgd2lsbCBmYWlsIGZvciBtYW55IHJlYXNvbnMuICBGb3IgZXhhbXBsZSwgaXQgd2lsbCBtb3N0Ci0JIyBsaWtlbHkgZmFpbCBpZiBhIG5vbi1HTlUgbGlua2VyIGlzIHVzZWQuICBUaGVyZWZvcmUsIHdlIGRvCi0JIyBub3QgaW5zaXN0IHRoYXQgaXQgcGFzcy4gIElmIHlvdSBhcmUgdXNpbmcgYW4gYXNzZW1ibGVyIGFuZAotCSMgbGlua2VyIGJhc2VkIG9uIHRoZSBzYW1lIEJGRCBhcyBvYmpjb3B5LCBpdCBpcyB3b3J0aAotCSMgaW52ZXN0aWdhdGluZyB0byBzZWUgd2h5IHRoaXMgZmFpbHVyZSBvY2N1cnMuICBJZiB3ZSBhcmUKLQkjIGNyb3NzIGNvbXBpbGluZywgd2UgYXNzdW1lIHRoYXQgYSBHTlUgbGlua2VyIGlzIGJlaW5nIHVzZWQsCi0JIyBhbmQgZXhwZWN0IGl0IHRvIHN1Y2NlZWQuCi0JaWYge1tpc25hdGl2ZV19IHRoZW4gewotCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCi0JfQotCi0JIyBUaGlzIGFsc28gZmFpbHMgZm9yIG1pcHMqLSotZWxmIHRhcmdldHMuICBTZWUgZWxmMzItbWlwcy5jCi0JIyBtaXBzX2VsZl9zeW1faXNfZ2xvYmFsLgotCXNldHVwX3hmYWlsICJtaXBzKi0qLWVsZiIKLQotCWZhaWwgJHRlc3QxCi0gICAgfQotCi0gICAgc2V0IG91dHB1dCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci9jb3B5cHJvZ10KLSAgICBzZXQgc3RhdHVzIFtsaW5kZXggJG91dHB1dCAwXTsKLSAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiIH0gewotCWZhaWwgJHRlc3QyCi0gICAgfSBlbHNlIHsKLQlwYXNzICR0ZXN0MgotICAgIH0KLX0KLQotIyBUZXN0IHN0cmlwcGluZyBhbiBleGVjdXRhYmxlCi0KLXByb2Mgc3RyaXBfZXhlY3V0YWJsZSB7IHByb2cgZmxhZ3MgdGVzdCB9IHsKLSAgICBnbG9iYWwgTk0KLSAgICBnbG9iYWwgTk1GTEFHUwotCi0gICAgcmVtb3RlX2Rvd25sb2FkIGJ1aWxkIHRtcGRpci9jb3B5cHJvZyB0bXBkaXIvc3RyaXByb2cKLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgY29weWZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9zdHJpcHJvZ107Ci0gICAgfSBlbHNlIHsKLQlzZXQgY29weWZpbGUgdG1wZGlyL3N0cmlwcm9nCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJHByb2cgIiRmbGFncyAke2NvcHlmaWxlfSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXJlbW90ZV91cGxvYWQgaG9zdCAke2NvcHlmaWxlfSB0bXBkaXIvc3RyaXByb2c7Ci0gICAgfQotCi0gICAgc2V0IHJlc3VsdCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci9zdHJpcHJvZ10KLSAgICBzZXQgc3RhdHVzIFtsaW5kZXggJHJlc3VsdCAwXTsKLSAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiIH0gewotCWZhaWwgJHRlc3QKLSAgICAgICAgcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAke2NvcHlmaWxlfSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIio6IG5vIHN5bWJvbHMqIiAkZXhlY19vdXRwdXRdIHsKLQlmYWlsICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotICAgIHBhc3MgJHRlc3QKLX0KLQotIyBUZXN0IHN0cmlwcGluZyBhbiBleGVjdXRhYmxlIHdpdGggc2F2aW5nIGEgc3ltYm9sCi0KLXByb2Mgc3RyaXBfZXhlY3V0YWJsZV93aXRoX3NhdmluZ19hX3N5bWJvbCB7IHByb2cgZmxhZ3MgdGVzdCB9IHsKLSAgICBnbG9iYWwgTk0KLSAgICBnbG9iYWwgTk1GTEFHUwotCi0gICAgcmVtb3RlX2Rvd25sb2FkIGJ1aWxkIHRtcGRpci9jb3B5cHJvZyB0bXBkaXIvc3RyaXByb2cKLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgY29weWZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9zdHJpcHJvZ107Ci0gICAgfSBlbHNlIHsKLQlzZXQgY29weWZpbGUgdG1wZGlyL3N0cmlwcm9nCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJHByb2cgIiRmbGFncyAke2NvcHlmaWxlfSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXJlbW90ZV91cGxvYWQgaG9zdCAke2NvcHlmaWxlfSB0bXBkaXIvc3RyaXByb2c7Ci0gICAgfQotCi0gICAgc2V0IHJlc3VsdCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci9zdHJpcHJvZ10KLSAgICBzZXQgc3RhdHVzIFtsaW5kZXggJHJlc3VsdCAwXTsKLSAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiIH0gewotCWZhaWwgJHRlc3QKLSAgICAgICAgcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAke2NvcHlmaWxlfSJdCi0gICAgaWYgeyFbcmVnZXhwIHteWzAtOWEtZkEtRl0rIFQgbWFpbn0gJGV4ZWNfb3V0cHV0XSBcCi0gICAgICAgICAmJiAhW3JlZ2V4cCB7XlswLTlhLWZBLUZdKyBUIF9tYWlufSAkZXhlY19vdXRwdXRdfSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLSAgICBwYXNzICR0ZXN0Ci19Ci0KLXNldCB0ZXN0MSAic2ltcGxlIG9iamNvcHkgb2YgZXhlY3V0YWJsZSIKLXNldCB0ZXN0MiAicnVuIG9iamNvcHkgb2YgZXhlY3V0YWJsZSIKLXNldCB0ZXN0MyAicnVuIHN0cmlwcGVkIGV4ZWN1dGFibGUiCi1zZXQgdGVzdDQgInJ1biBzdHJpcHBlZCBleGVjdXRhYmxlIHdpdGggc2F2aW5nIGEgc3ltYm9sIgotCi1zd2l0Y2ggW2NvcHlfc2V0dXBdIHsKLSAgICAiMSIgewotCSMgZG8gbm90aGluZwotICAgIH0KLSAgICAiMiIgewotCXVudGVzdGVkICR0ZXN0MQotCXVudGVzdGVkICR0ZXN0MgotCXVudGVzdGVkICR0ZXN0MwotCXVudGVzdGVkICR0ZXN0NAotICAgIH0KLSAgICAiMyIgewotCXVucmVzb2x2ZWQgJHRlc3QxCi0JdW5yZXNvbHZlZCAkdGVzdDIKLQl1bnJlc29sdmVkICR0ZXN0MwotCXVucmVzb2x2ZWQgJHRlc3Q0Ci0gICAgfQotICAgICIwIiB7Ci0JY29weV9leGVjdXRhYmxlICIkT0JKQ09QWSIgIiRPQkpDT1BZRkxBR1MiICIkdGVzdDEiICIkdGVzdDIiCi0Jc3RyaXBfZXhlY3V0YWJsZSAiJFNUUklQIiAiJFNUUklQRkxBR1MiICIkdGVzdDMiCi0Jc3RyaXBfZXhlY3V0YWJsZV93aXRoX3NhdmluZ19hX3N5bWJvbCAiJFNUUklQIiAiLUsgbWFpbiAtSyBfbWFpbiAkU1RSSVBGTEFHUyIgIiR0ZXN0NCIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL29iamR1bXAuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1MGYwMi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL29iamR1bXAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBidWctZGVqYWdudUBwcmVwLmFpLm1pdC5lZHUKLQotIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUm9iIFNhdm95ZSA8cm9iQGN5Z251cy5jb20+Ci0jIGFuZCByZXdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLWlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBpZiB7W3doaWNoICRPQkpEVU1QXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRPQkpEVU1QIGRvZXMgbm90IGV4aXN0IgotCXJldHVybgotICAgIH0KLX0KLQotc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJE9CSkRVTVBdIgotCi0jIFNpbXBsZSB0ZXN0IG9mIG9iamR1bXAgLWkKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1pIl0KLQotc2V0IGNwdXNfZXhwZWN0ZWQgIihhMjlrfGFsbGlhbnR8YWxwaGF8YXJjfGFybXxjb252ZXh8ZDEwdnxkMzB2fGg4fGhwcGF8aTM4NnxpODYwfGk5NjB8bTMycnxtNjhrfG04OGt8bWlwc3xtbjEwMjAwfG1uMTAzMDB8bnMzMmt8cG93ZXJwY3xweXJhbWlkfHJvbXB8cnM2MDAwfHNofHNwYXJjfHRhaG9lfHY4NTB8dmF4fHdlMzJrfHo4a3x6ODAwMXx6ODAwMikiCi0KLSMgTWFrZSBzdXJlIHRoZSB0YXJnZXQgQ1BVIHNob3dzIHVwIGluIHRoZSBsaXN0LgotaWYgIVtyZWdleHAgJGNwdXNfZXhwZWN0ZWQgJHRhcmdldF9jcHVdIHsKLSAgICByZWdzdWIgIl5cWyhcXSIgIiRjcHVzX2V4cGVjdGVkIiAiKCR7dGFyZ2V0X2NwdX18IiBjcHVzX2V4cGVjdGVkOwotfQotCi1zZXQgd2FudCAiQkZEIGhlYWRlciBmaWxlIHZlcnNpb24uKnNyZWMuKmhlYWRlciAuKiBlbmRpYW4uKiwgZGF0YSAuKiBlbmRpYW4uKiRjcHVzX2V4cGVjdGVkIgotCi1pZiBbcmVnZXhwICR3YW50ICRnb3RdIHRoZW4gewotICAgIHBhc3MgIm9iamR1bXAgLWkiCi19IGVsc2UgewotICAgIGZhaWwgIm9iamR1bXAgLWkiCi19Ci0KLSMgVGhlIHJlbWFpbmluZyB0ZXN0cyByZXF1aXJlIGEgdGVzdCBmaWxlLgotCi0KLWlmIHshW2JpbnV0aWxzX2Fzc2VtYmxlICRzcmNkaXIvJHN1YmRpci9iaW50ZXN0LnMgdG1wZGlyL2JpbnRlc3Qub119IHRoZW4gewotICAgIHJldHVybgotfQotaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IHRlc3RmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYmludGVzdC5vXQotfSBlbHNlIHsKLSAgICBzZXQgdGVzdGZpbGUgdG1wZGlyL2JpbnRlc3QubwotfQotCi0jIFRlc3Qgb2JqZHVtcCAtZgotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWYgJHRlc3RmaWxlIl0KLQotc2V0IHdhbnQgIiR0ZXN0ZmlsZTpcWyAJXF0qZmlsZSBmb3JtYXQuKmFyY2hpdGVjdHVyZTpcWyAJXF0qJHtjcHVzX2V4cGVjdGVkfS4qSEFTX1JFTE9DLipIQVNfU1lNUyIKLQotaWYgIVtyZWdleHAgJHdhbnQgJGdvdF0gdGhlbiB7Ci0gICAgZmFpbCAib2JqZHVtcCAtZiIKLX0gZWxzZSB7Ci0gICAgcGFzcyAib2JqZHVtcCAtZiIKLX0KLQotIyBUZXN0IG9iamR1bXAgLWgKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1oICR0ZXN0ZmlsZSJdCi0KLXNldCB3YW50ICIkdGVzdGZpbGU6XFsgCVxdKmZpbGUgZm9ybWF0LipTZWN0aW9ucy4qXFswLTlcXStcWyAJXF0rXFteIAlcXSoodGV4dHxURVhUfFxcXCRDT0RFXFxcJClcW14gCVxdKlxbIAlcXSooXFswLTlhLWZBLUZcXSspLipcWzAtOVxdK1xbIAlcXStcW14gCVxdKihcXC5kYXRhfERBVEEpXFteIAlcXSpcWyAJXF0qKFxbMC05YS1mQS1GXF0rKSIKLQotaWYgIVtyZWdleHAgJHdhbnQgJGdvdCBhbGwgdGV4dF9uYW1lIHRleHRfc2l6ZSBkYXRhX25hbWUgZGF0YV9zaXplXSB0aGVuIHsKLSAgICBmYWlsICJvYmpkdW1wIC1oIgotfSBlbHNlIHsKLSAgICB2ZXJib3NlICJ0ZXh0IG5hbWUgaXMgJHRleHRfbmFtZSBzaXplIGlzICR0ZXh0X3NpemUiCi0gICAgdmVyYm9zZSAiZGF0YSBuYW1lIGlzICRkYXRhX25hbWUgc2l6ZSBpcyAkZGF0YV9zaXplIgotICAgIGlmIHtbZXhwciAiMHgkdGV4dF9zaXplIl0gPCA4IHx8IFtleHByICIweCRkYXRhX3NpemUiXSA8IDR9IHRoZW4gewotCXNlbmRfbG9nICJzaXplcyB0b28gc21hbGxcbiIKLQlmYWlsICJvYmpkdW1wIC1oIgotICAgIH0gZWxzZSB7Ci0JcGFzcyAib2JqZHVtcCAtaCIKLSAgICB9Ci19Ci0KLSMgVGVzdCBvYmpkdW1wIC10Ci0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtdCAkdGVzdGZpbGUiXQotCi1pZiBbaW5mbyBleGlzdHMgdmFyc10gdGhlbiB7IHVuc2V0IHZhcnMgfQotd2hpbGUge1tyZWdleHAgIihcW2EtelxdKl9zeW1ib2wpKC4qKSIgJGdvdCBhbGwgc3ltYm9sIHJlc3RdfSB7Ci0gICAgc2V0IHZhcnMoJHN5bWJvbCkgMQotICAgIHNldCBnb3QgJHJlc3QKLX0KLQotaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0ZXh0X3N5bWJvbCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGRhdGFfc3ltYm9sKV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoY29tbW9uX3N5bWJvbCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGV4dGVybmFsX3N5bWJvbCldfSB0aGVuIHsKLSAgICBmYWlsICJvYmpkdW1wIC10IgotfSBlbHNlIHsKLSAgICBwYXNzICJvYmpkdW1wIC10IgotfQotCi0jIFRlc3Qgb2JqZHVtcCAtcgotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLXIgJHRlc3RmaWxlIl0KLQotc2V0IHdhbnQgIiR0ZXN0ZmlsZTpcWyAJXF0qZmlsZSBmb3JtYXQuKlJFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFxcW1xbXlxdXF0qKHRleHR8VEVYVHxcXFwkQ09ERVxcXCQpXFteXF1cXSpcXFxdLipleHRlcm5hbF9zeW1ib2wiCi0KLWlmIFtyZWdleHAgJHdhbnQgJGdvdF0gdGhlbiB7Ci0gICAgcGFzcyAib2JqZHVtcCAtciIKLX0gZWxzZSB7Ci0gICAgZmFpbCAib2JqZHVtcCAtciIKLX0KLQotIyBUZXN0IG9iamR1bXAgLXMKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1zICR0ZXN0ZmlsZSJdCi0KLXNldCB3YW50ICIkdGVzdGZpbGU6XFsgCVxdKmZpbGUgZm9ybWF0LipDb250ZW50cy4qKHRleHR8VEVYVHxcXFwkQ09ERVxcXCQpXFteMC05XF0qXFsgCVxdKlxbMC05YS1mQS1GXF0qXFsgCVxdKigwMDAwMDAwMXwwMTAwMDAwMCkuKkNvbnRlbnRzLiooZGF0YXxEQVRBKVxbXjAtOVxdKlxbIAlcXSpcWzAtOWEtZkEtRlxdKlxbIAlcXSooMDAwMDAwMDJ8MDIwMDAwMDApIgotCi1pZiBbcmVnZXhwICR3YW50ICRnb3RdIHRoZW4gewotICAgIHBhc3MgIm9iamR1bXAgLXMiCi19IGVsc2UgewotICAgIGZhaWwgIm9iamR1bXAgLXMiCi19Ci0KLSMgT3B0aW9ucyB3aGljaCBhcmUgbm90IHRlc3RlZDogLWEgLWQgLUQgLVIgLVQgLXggLWwgLS1zdGFicwotIyBJIGRvbid0IHNlZSBhbnkgZ2VuZXJpYyB3YXkgdG8gdGVzdCBhbnkgb2YgdGhlc2Ugb3RoZXIgdGhhbiAtYS4KLSMgVGVzdHMgY291bGQgYmUgd3JpdHRlbiBmb3Igc3BlY2lmaWMgdGFyZ2V0cywgYW5kIHRoYXQgc2hvdWxkIGJlIGRvbmUKLSMgaWYgc3BlY2lmaWMgcHJvYmxlbXMgYXJlIGZvdW5kLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLmV4cCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZjc0NGMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgV3JpdHRlbiBieSBOaWNrIENsaWZ0byAgPG5pY2tjQGN5Z251cy5jb20+Ci0jIEJhc2VkIG9uIHNjcmlwdHMgd3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLSMgYW5kIEtlbiBSYWVidXJuIDxyYWVidXJuQGN5Z251cy5jb20+LgotCi0jIEZpcnN0IHNvbWUgaGVscGZ1bCBwcm9jZWR1cmVzLCB0aGVuIHRoZSB0ZXN0cyB0aGVtc2VsdmVzCi0KLSMgUmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZW5hbWUgZ2l2ZW4KLXByb2MgZmlsZV9jb250ZW50cyB7IGZpbGVuYW1lIH0gewotICAgIHNldCBmaWxlIFtvcGVuICRmaWxlbmFtZSByXQotICAgIHNldCBjb250ZW50cyBbcmVhZCAkZmlsZV0KLSAgICBjbG9zZSAkZmlsZQotICAgIHJldHVybiAkY29udGVudHMKLX0KLQotIyByZWdleHBfZGlmZiwgYmFzZWQgb24gc2ltcGxlX2RpZmYgdGFrZW4gZnJvbSBsZCB0ZXN0IHN1aXRlCi0jCWNvbXBhcmVzIHR3byBmaWxlcyBsaW5lLWJ5LWxpbmUKLSMJZmlsZTEgY29udGFpbnMgc3RyaW5ncywgZmlsZTIgY29udGFpbnMgcmVnZXhwcyBhbmQgIy1jb21tZW50cwotIwlibGFuayBsaW5lcyBhcmUgaWdub3JlZCBpbiBlaXRoZXIgZmlsZQotIwlyZXR1cm5zIG5vbi16ZXJvIGlmIGRpZmZlcmVuY2VzIGV4aXN0Ci0jCi1wcm9jIHJlZ2V4cF9kaWZmIHsgZmlsZV8xIGZpbGVfMiB9IHsKLQotICAgIHNldCBlb2YgLTEKLSAgICBzZXQgZW5kXzEgMAotICAgIHNldCBlbmRfMiAwCi0gICAgc2V0IGRpZmZlcmVuY2VzIDAKLSAgICBzZXQgZGlmZl9wYXNzIDAKLQotICAgIGlmIFtmaWxlIGV4aXN0cyAkZmlsZV8xXSB0aGVuIHsKLQlzZXQgZmlsZV9hIFtvcGVuICRmaWxlXzEgcl0KLSAgICB9IGVsc2UgewotCXdhcm5pbmcgIiRmaWxlXzEgZG9lc24ndCBleGlzdCIKLQlyZXR1cm4gMQotICAgIH0KLQotICAgIGlmIFtmaWxlIGV4aXN0cyAkZmlsZV8yXSB0aGVuIHsKLQlzZXQgZmlsZV9iIFtvcGVuICRmaWxlXzIgcl0KLSAgICB9IGVsc2UgewotCWZhaWwgIiRmaWxlXzIgZG9lc24ndCBleGlzdCIKLQljbG9zZSAkZmlsZV9hCi0JcmV0dXJuIDEKLSAgICB9Ci0KLSAgICB2ZXJib3NlICIgUmVnZXhwLWRpZmYnaW5nOiAkZmlsZV8xICRmaWxlXzIiIDIKLQotICAgIHdoaWxlIHsgMSB9IHsKLQlzZXQgbGluZV9hICIiCi0Jc2V0IGxpbmVfYiAiIgotCXdoaWxlIHsgW3N0cmluZyBsZW5ndGggJGxpbmVfYV0gPT0gMCB9IHsKLQkgICAgaWYgeyBbZ2V0cyAkZmlsZV9hIGxpbmVfYV0gPT0gJGVvZiB9IHsKLQkJc2V0IGVuZF8xIDEKLQkJYnJlYWsKLQkgICAgfQotCX0KLQl3aGlsZSB7IFtzdHJpbmcgbGVuZ3RoICRsaW5lX2JdID09IDAgfHwgW3N0cmluZyBtYXRjaCAiIyoiICRsaW5lX2JdIH0gewotCSAgICBpZiBbIHN0cmluZyBtYXRjaCAiI3Bhc3MiICRsaW5lX2IgXSB7Ci0JCXNldCBlbmRfMiAxCi0JCXNldCBkaWZmX3Bhc3MgMQotCQlicmVhawotCSAgICB9Ci0JICAgIGlmIHsgW2dldHMgJGZpbGVfYiBsaW5lX2JdID09ICRlb2YgfSB7Ci0JCXNldCBlbmRfMiAxCi0JCWJyZWFrCi0JICAgIH0KLQl9Ci0KLSAgICAgICAgaWYgeyAkZGlmZl9wYXNzIH0geyAKLSAgICAgICAgICAgIGJyZWFrIAotICAgICAgICB9IGVsc2VpZiB7ICRlbmRfMSAmJiAkZW5kXzIgfSB7IAotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgfSBlbHNlaWYgeyAkZW5kXzEgfSB7Ci0gICAgICAgICAgICBzZW5kX2xvZyAiZXh0cmEgcmVnZXhwcyBpbiAkZmlsZV8yIHN0YXJ0aW5nIHdpdGggXCJeJGxpbmVfYiRcIlxuRU9GIGZyb20gJGZpbGVfMVxuIgotICAgICAgICAgICAgdmVyYm9zZSAiZXh0cmEgcmVnZXhwcyBpbiAkZmlsZV8yIHN0YXJ0aW5nIHdpdGggXCJeJGxpbmVfYiRcIlxuRU9GIGZyb20gJGZpbGVfMSIgMwotICAgICAgICAgICAgc2V0IGRpZmZlcmVuY2VzIDEKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIH0gZWxzZWlmIHsgJGVuZF8yIH0gewotICAgICAgICAgICAgc2VuZF9sb2cgImV4dHJhIGxpbmVzIGluICRmaWxlXzEgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9hJFwiXG5FT0YgZnJvbSAkZmlsZV8yXG4iCi0gICAgICAgICAgICB2ZXJib3NlICJleHRyYSBsaW5lcyBpbiAkZmlsZV8xIHN0YXJ0aW5nIHdpdGggXCJeJGxpbmVfYSRcIlxuRU9GIGZyb20gJGZpbGVfMlxuIiAzCi0gICAgICAgICAgICBzZXQgZGlmZmVyZW5jZXMgMQotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZlcmJvc2UgInJlZ2V4cCBcIl4kbGluZV9iJFwiXG5saW5lICAgXCIkbGluZV9hXCIiIDMKLSAgICAgICAgICAgIGlmICFbcmVnZXhwICJeJGxpbmVfYiQiICIkbGluZV9hIl0gewotCQlzZW5kX2xvZyAicmVnZXhwX2RpZmYgbWF0Y2ggZmFpbHVyZVxuIgotCQlzZW5kX2xvZyAicmVnZXhwIFwiXiRsaW5lX2IkXCJcbmxpbmUgICBcIiRsaW5lX2FcIlxuIgotCQlzZXQgZGlmZmVyZW5jZXMgMQotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiB7ICRkaWZmZXJlbmNlcyA9PSAwICYmICEkZGlmZl9wYXNzICYmIFtlb2YgJGZpbGVfYV0gIT0gW2VvZiAkZmlsZV9iXSB9IHsKLQlzZW5kX2xvZyAiJGZpbGVfMSBhbmQgJGZpbGVfMiBhcmUgZGlmZmVyZW50IGxlbmd0aHNcbiIKLQl2ZXJib3NlICIkZmlsZV8xIGFuZCAkZmlsZV8yIGFyZSBkaWZmZXJlbnQgbGVuZ3RocyIgMwotCXNldCBkaWZmZXJlbmNlcyAxCi0gICAgfQotCi0gICAgY2xvc2UgJGZpbGVfYQotICAgIGNsb3NlICRmaWxlX2IKLQotICAgIHJldHVybiAkZGlmZmVyZW5jZXMKLX0KLQotIyBSdW4gYW4gaW5kaXZpZHVhbCByZWFkZWxmIHRlc3QuCi0jIEJhc2ljYWxseSByZWFkZWxmIGlzIHJ1biBvbiB0aGUgYmluYXJ5X2ZpbGUgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucy4KLSMgUmVhZGVsZidzIG91dHB1dCBpcyBjYXB0dXJlZCBhbmQgdGhlbiBjb21wYXJlZCBhZ2FpbnN0IHRoZSBjb250ZW50cwotIyBvZiB0aGUgcmVnZXhwX2ZpbGUuCi0KLXByb2MgcmVhZGVsZl90ZXN0IHsgb3B0aW9ucyBiaW5hcnlfZmlsZSByZWdleHBfZmlsZSB4ZmFpbHMgfSB7Ci0KLSAgICBnbG9iYWwgUkVBREVMRgotICAgIGdsb2JhbCBSRUFERUxGRkxBR1MKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIAotICAgIHNlbmRfbG9nICJleGVjICRSRUFERUxGICRSRUFERUxGRkxBR1MgJG9wdGlvbnMgJGJpbmFyeV9maWxlID4gcmVhZGVsZi5vdXQiCi0gICAgY2F0Y2ggImV4ZWMgJFJFQURFTEYgJFJFQURFTEZGTEFHUyAkb3B0aW9ucyAkYmluYXJ5X2ZpbGUgPiByZWFkZWxmLm91dCIgZ290Ci0KLSAgICBpZiB7IFtsbGVuZ3RoICR4ZmFpbHNdICE9IDAgfSB0aGVuIHsKLQlzZXR1cF94ZmFpbCAkeGZhaWxzCi0gICAgfQotICAgIAotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHRoZW4gewotCXNlbmRfbG9nICRnb3QKLQlmYWlsICJyZWFkZWxmICRvcHRpb25zIgotCXJldHVybgotICAgIH0KLQotICAgIGlmIHsgW3JlZ2V4cF9kaWZmIHJlYWRlbGYub3V0ICRzcmNkaXIvJHN1YmRpci8kcmVnZXhwX2ZpbGVdIH0gdGhlbiB7Ci0JZmFpbCAicmVhZGVsZiAkb3B0aW9ucyIKLQl2ZXJib3NlICJvdXRwdXQgaXMgXG5bZmlsZV9jb250ZW50cyByZWFkZWxmLm91dF0iIDIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBwYXNzICJyZWFkZWxmICRvcHRpb25zIgotfQotCi0KLQotIyBPbmx5IEVMRiBiYXNlZCB0b29sY2hhaW5zIG5lZWQgcmVhZGVsZi4KLSMgRm9yIG5vdyBiZSBwYXJhbm9pZCBhbmQgYXNzdW1lIHRoYXQgaWYgRUxGIGlzIG5vdCBtZW50aW9uZWQKLSMgaW4gdGhlIHRhcmdldCBzdHJpbmcsIHRoZW4gdGhlIHRhcmdldCBpcyBub3QgYW4gRUxGIGJhc2VkIHBvcnQuCi0KLWlmICFbaXN0YXJnZXQgIiotKmVsZiJdIHRoZW4gewotICAgIHZlcmJvc2UgIiRSRUFERUxGIGlzIG9ubHkgaW50ZW50ZWRlZCBmb3IgRUxGIHRhcmdldHMiIDIKLSAgICByZXR1cm4KLX0KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIGlmIHtbd2hpY2ggJFJFQURFTEZdID09IDB9IHRoZW4gewotICAgICAgICBwZXJyb3IgIiRSRUFERUxGIGRvZXMgbm90IGV4aXN0IgotICAgICAgICByZXR1cm4KLSAgICB9Ci19Ci0KLXNlbmRfdXNlciAiVmVyc2lvbiBbYmludXRpbF92ZXJzaW9uICRSRUFERUxGXSIKLQotIyBBc3NlbWxlIHRoZSB0ZXN0IGZpbGUuCi1pZiB7IVtiaW51dGlsc19hc3NlbWJsZSAkc3JjZGlyLyRzdWJkaXIvYmludGVzdC5zIHRtcGRpci9iaW50ZXN0Lm9dfSB0aGVuIHsKLSAgICBwZXJyb3IgInVucmVzb2x2ZWQgMSIKLSAgICB1bnJlc29sdmVkICJyZWFkZWxmIC0gZmFpbGVkIHRvIGFzc2VtYmxlIgotICAgIHJldHVybgotfQotCi1pZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IHRlbXBmaWxlIHRtcGRpci9iaW50ZXN0Lm87Ci19IGVsc2UgewotICAgIHNldCB0ZW1wZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL2JpbnRlc3Qub10KLX0KLQotIyBSdW4gdGhlIHRlc3RzCi1yZWFkZWxmX3Rlc3QgLWggJHRlbXBmaWxlIHJlYWRlbGYuaCAge30KLQotIyBUaGUgdjg1MCBmYWlscyB0aGUgbmV4dCB0d28gdGVzdHMgYmVjYXVzZSBpdCBjcmVhdGVzIHR3byBzcGVjaWFsCi0jIHNlY3Rpb25zIG9mIGl0cyBvd246IC5jYWxsX3RhYmxlX2RhdGEgYW5kIC5jYWxsX3RhYmxlX3RleHQKLSMgVGhlIHJlZ2V4cCBzY3JpcHRzIGFyZSBub3QgZXhwZWN0aW5nIHRoZXNlIHNlY3Rpb25zLi4uCi0KLXJlYWRlbGZfdGVzdCAtUyAkdGVtcGZpbGUgcmVhZGVsZi5zICB7djg1MCotKi0qfQotcmVhZGVsZl90ZXN0IC1zICR0ZW1wZmlsZSByZWFkZWxmLnNzIHt2ODUwKi0qLSp9Ci1yZWFkZWxmX3Rlc3QgLXIgJHRlbXBmaWxlIHJlYWRlbGYuciAge30KLQotCi0jIENvbXBpbGUgdGhlIHNlY29uZCB0ZXN0IGZpbGUuCi1pZiB7IFt0YXJnZXRfY29tcGlsZSAkc3JjZGlyLyRzdWJkaXIvdGVzdHByb2cuYyB0bXBkaXIvdGVzdHByb2cubyBvYmplY3QgZGVidWddICE9ICIiIH0gewotICAgIHVudGVzdGVkICJyZWFkZWxmIC13IgotICAgIHJldHVybgotfQotCi1pZiBbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBzZXQgdGVtcGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci90ZXN0cHJvZy5vXTsKLX0gZWxzZSB7Ci0gICAgc2V0IHRlbXBmaWxlIHRtcGRpci90ZXN0cHJvZy5vCi19Ci0KLSMgVGhlIHhmYWlsIHRhcmdldHMgaGVyZSBkbyBub3QgZGVmYXVsdCB0byBEV0FSRjIgZm9ybWF0IGRlYnVnIGluZm9ybWF0aW9uCi0jIFRoZSBzeW1wdG9tIGlzIHRoYXQgdGhlIG91dHB1dCBvZiAncmVhZGVsZiAtd2knIGlzIGVtcHR5LgotCi1yZWFkZWxmX3Rlc3QgLXdpICR0ZW1wZmlsZSByZWFkZWxmLndpIHt2ODUwKi0qLSp9CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuaCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTVhZmU5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotRUxGIEhlYWRlcjoKLSAgTWFnaWM6ICAgN2YgNDUgNGMgNDYgMFsxMl0gMFsxMl0gMDEgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgCi0gIFR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVMIFwoUmVsb2NhdGFibGUgZmlsZVwpCi0gIE1hY2hpbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgLioKLSAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKLSAgRGF0YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEZEQVRBLiogZW5kaWFuXCkKLSAgRW50cnkgcG9pbnQgYWRkcmVzczogICAgICAgICAgICAgICAweDAKLSAgU3RhcnQgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAwIFwoYnl0ZXMgaW50byBmaWxlXCkKLSAgU3RhcnQgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICAuKiBcKGJ5dGVzIGludG8gZmlsZVwpCi0gIEZsYWdzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLioKLSAgU2l6ZSBvZiB0aGlzIGhlYWRlcjogICAgICAgICAgICAgICAuKiBcKGJ5dGVzXCkKLSAgU2l6ZSBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgICAwIFwoYnl0ZXNcKQotICBOdW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgIDAKLSAgU2l6ZSBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICAuKiBcKGJ5dGVzXCkKLSAgTnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAuKgotICBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6IC4qCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuciBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmVhNzIxLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5yCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0KLVJlbG9jYXRpb24gc2VjdGlvbiAnLnJlbC4qdGV4dCcgYXQgb2Zmc2V0IDB4LiogY29udGFpbnMgMSBlbnRyaWVzOgotICBPZmZzZXQgICAgSW5mbyAgVHlwZSAgICAgICAgICAgIFN5bWJvbCdzIFZhbHVlICBTeW1ib2wncyBOYW1lLioKLSAgMDAwMDAwMDQgIDAwLiogUl8uKiAgICAgICAgICAgMDAwMDAwMDAgIGV4dGVybmFsX3N5bWJvbC4qCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYucyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGIxMjQ1Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotVGhlcmUgYXJlIC4qIHNlY3Rpb24gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0IC4qOgotCi1TZWN0aW9uIEhlYWRlcnM6Ci0gIFxbTnJcXSBOYW1lICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGcgTGsgSW5mIEFsCi0gIFxbIDBcXSAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgICAgMDAwMDAwMDAgMDAwMDAwIDAwMDAwMCAwMCAgICAgIDAgICAwIDAKLSAgXFsgMVxdIC50ZXh0ICAgICAgICAgICAgIFBST0dCSVRTICAgICAgICAwMDAwMDAwMCAwMDAwMzQgMDAwMDA4IDAwICBBWCAgMCAgIDAgLgotICBcWyAyXF0gLnJlbC4rdGV4dCArUkVMLiArMCsgMCsuKiAwMDAwMC4gMC4gICAgICAuICAgMSA0Ci0gIFxbIDNcXSAuZGF0YSAgICAgICAgICAgICBQUk9HQklUUyAgICAgICAgMDAwMDAwMDAgMDAwMDNjIDAwMDAwNCAwMCBXQSAgIDAgICAwIC4KLSAgXFsgNFxdIC5ic3MgICAgICAgICAgICAgIE5PQklUUyAgICAgICAgICAwMDAwMDAwMCAwMDAwNDAgMDAwMDAwIDAwIFdBICAgMCAgIDAgLgotICBcWyA1XF0gLnNoc3RydGFiICAgICAgICAgU1RSVEFCICAgICAgICAgIDAwMDAwMDAwIDAwMDA0MCAwMDAwLiogMDAgICAgICAwICAgMCAuCi0gIFxbIDZcXSAuc3ltdGFiICAgICAgICAgICBTWU1UQUIgICAgICAgICAgMDAwMDAwMDAgMCsuKiAwKy4qIDEwICAgICAgNyAgIDYgNAotICBcWyA3XF0gLnN0cnRhYiAgICAgICAgICAgU1RSVEFCICAgICAgICAgIDAwMDAwMDAwIDArLiogMCsuKiAwMCAgICAgIDAgICAwIDEKLQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLnNzIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLnNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzYwYjM4Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotU3ltYm9sIHRhYmxlICcuc3ltdGFiJyBjb250YWlucyAuKiBlbnRyaWVzOgotICBOdW06ICAgIFZhbHVlICBTaXplIFR5cGUgICAgQmluZCAgIE90ICBOZHggTmFtZQotICAgIDA6ICAgICAgICAwICAgICAwIE5PVFlQRSAgTE9DQUwgICAwICBVTkQgCi0gICAgMTogICAgICAgIDAgICAgIDAgU0VDVElPTiBMT0NBTCAgIDAgICAgMSAKLSAgICAyOiAgICAgICAgMCAgICAgMCBTRUNUSU9OIExPQ0FMICAgMCAgICAzIAotICAgIDM6ICAgICAgICAwICAgICAwIFNFQ1RJT04gTE9DQUwgICAwICAgIDQgCi0gICAgNDogICAgICAgIDAgICAgIDAgTk9UWVBFICBMT0NBTCAgIDAgICAgMSBzdGF0aWNfdGV4dF9zeW1ib2wKLSAgICA1OiAgICAgICAgMCAgICAgMCBOT1RZUEUgIExPQ0FMICAgMCAgICAzIHN0YXRpY19kYXRhX3N5bWJvbAotICAgIC46ICAgICAgICAwICAgICAwIE5PVFlQRSAgR0xPQkFMICAwICAgIDEgdGV4dF9zeW1ib2wKLSAgICAuOiAgICAgICAgMCAgICAgMCBOT1RZUEUgIEdMT0JBTCAgMCAgVU5EIGV4dGVybmFsX3N5bWJvbAotICAgLio6ICAgICAgICAwICAgICAwIE5PVFlQRSAgR0xPQkFMICAwICAgIDMgZGF0YV9zeW1ib2wKLSAgIC4qOiAgICAgICAgNCAgICAgNCBPQkpFQ1QgIEdMT0JBTCAgMCAgQ09NIGNvbW1vbl9zeW1ib2wKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi53aSBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi53aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NiMmVjYy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYud2kKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi1UaGUgc2VjdGlvbiAuZGVidWdfaW5mbyBjb250YWluczoKLQotICBDb21waWxhdGlvbiBVbml0OgotICAgTGVuZ3RoOiAgICAgICAgLioKLSAgIFZlcnNpb246ICAgICAgIDIKLSAgIEFiYnJldiBPZmZzZXQ6IDAKLSAgIFBvaW50ZXIgU2l6ZTogIDQKLSAgICBBYmJyZXYgTnVtYmVyOiAxIFwoRFdfVEFHX2NvbXBpbGVfdW5pdFwpCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogLiovdGVzdHByb2cuYwkKLSAgICAgRFdfQVRfY29tcF9kaXIgICAgOiAuKi9iaW51dGlscwkKLSAgICAgRFdfQVRfcHJvZHVjZXIgICAgOiBHTlUgQyAuKgkKLSAgICAgRFdfQVRfbGFuZ3VhZ2UgICAgOiAxCVwoQU5TSSBDXCkKLSAgICAgRFdfQVRfbG93X3BjICAgICAgOiAwCQotICAgICBEV19BVF9oaWdoX3BjICAgICA6IC4qCQotICAgICBEV19BVF9zdG10X2xpc3QgICA6IDAJCi0gICAgQWJicmV2IE51bWJlcjogMiBcKERXX1RBR19zdWJwcm9ncmFtXCkKLSAgICAgRFdfQVRfZXh0ZXJuYWwgICAgOiAxCQotICAgICBEV19BVF9uYW1lICAgICAgICA6IGZuCQotICAgICBEV19BVF9kZWNsX2ZpbGUgICA6IDEJCi0gICAgIERXX0FUX2RlY2xfbGluZSAgIDogYQkKLSAgICAgRFdfQVRfdHlwZSAgICAgICAgOiAuKgkKLSAgICAgRFdfQVRfbG93X3BjICAgICAgOiAwCQotICAgICBEV19BVF9oaWdoX3BjICAgICA6IC4qCQotICAgICBEV19BVF9mcmFtZV9iYXNlICA6IDEgYnl0ZSBibG9jazogLioKLSAgICBBYmJyZXYgTnVtYmVyOiAzIFwoRFdfVEFHX2Jhc2VfdHlwZVwpCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogaW50CQotICAgICBEV19BVF9ieXRlX3NpemUgICA6IDQJCi0gICAgIERXX0FUX2VuY29kaW5nICAgIDogNQlcKHNpZ25lZFwpCi0gICAgQWJicmV2IE51bWJlcjogNCBcKERXX1RBR19zdWJwcm9ncmFtXCkKLSAgICAgRFdfQVRfc2libGluZyAgICAgOiAuKgkKLSAgICAgRFdfQVRfZXh0ZXJuYWwgICAgOiAxCQotICAgICBEV19BVF9uYW1lICAgICAgICA6IG1haW4JCi0gICAgIERXX0FUX2RlY2xfZmlsZSAgIDogMQkKLSAgICAgRFdfQVRfZGVjbF9saW5lICAgOiAxMAkKLSAgICAgRFdfQVRfdHlwZSAgICAgICAgOiAuKgkKLSAgICAgRFdfQVRfbG93X3BjICAgICAgOiAuKgkKLSAgICAgRFdfQVRfaGlnaF9wYyAgICAgOiAuKgkKLSAgICAgRFdfQVRfZnJhbWVfYmFzZSAgOiAxIGJ5dGUgYmxvY2s6IC4qCi0gICAgQWJicmV2IE51bWJlcjogNSBcKERXX1RBR19sZXhpY2FsX2Jsb2NrXCkKLSAgICAgRFdfQVRfbG93X3BjICAgICAgOiAuKgkKLSAgICAgRFdfQVRfaGlnaF9wYyAgICAgOiAuKgkKLQotICAgRXh0cmEgZGF0YSBhdCBlbmQgb2YgY29tcCB1bml0OgotIC4qOiBBYmJyZXYgTnVtYmVyOiA2IFwoRFdfVEFHX3ZhcmlhYmxlXCkKLSAgICAgRFdfQVRfbmFtZSAgICAgICAgOiBjb21tb24JCi0gICAgIERXX0FUX2RlY2xfZmlsZSAgIDogMQkKLSAgICAgRFdfQVRfZGVjbF9saW5lICAgOiAzCQotICAgICBEV19BVF90eXBlICAgICAgICA6IC4qCi0gICAgIERXX0FUX2V4dGVybmFsICAgIDogMQkKLSAgICAgRFdfQVRfbG9jYXRpb24gICAgOiA1IGJ5dGUgYmxvY2s6IDMgLiAwIDAgMCAJXChEV19PUF9hZGRyOiAwXCkKLSAuKjogQWJicmV2IE51bWJlcjogNiBcKERXX1RBR192YXJpYWJsZVwpCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogZ2xvYmFsCQotICAgICBEV19BVF9kZWNsX2ZpbGUgICA6IDEJCi0gICAgIERXX0FUX2RlY2xfbGluZSAgIDogNAkKLSAgICAgRFdfQVRfdHlwZSAgICAgICAgOiAuKgkKLSAgICAgRFdfQVRfZXh0ZXJuYWwgICAgOiAxCQotICAgICBEV19BVF9sb2NhdGlvbiAgICA6IDUgYnl0ZSBibG9jazogMyAuIDAgMCAwIAlcKERXX09QX2FkZHI6IDBcKQotIC4qOiBBYmJyZXYgTnVtYmVyOiA3IFwoRFdfVEFHX3ZhcmlhYmxlXCkKLSAgICAgRFdfQVRfbmFtZSAgICAgICAgOiBsb2NhbAkKLSAgICAgRFdfQVRfZGVjbF9maWxlICAgOiAxCQotICAgICBEV19BVF9kZWNsX2xpbmUgICA6IDUJCi0gICAgIERXX0FUX3R5cGUgICAgICAgIDogLioJCi0gICAgIERXX0FUX2xvY2F0aW9uICAgIDogNSBieXRlIGJsb2NrOiAzIC4gMCAwIC4gCVwoRFdfT1BfYWRkcjogLlwpCi0gLio6IEFiYnJldiBOdW1iZXI6IDggXChEV19UQUdfYXJyYXlfdHlwZVwpCi0gICAgIERXX0FUX3NpYmxpbmcgICAgIDogLioJCi0gICAgIERXX0FUX3R5cGUgICAgICAgIDogLioJCi0gLio6IEFiYnJldiBOdW1iZXI6IDkgXChEV19UQUdfc3VicmFuZ2VfdHlwZVwpCi0gICAgIERXX0FUX3VwcGVyX2JvdW5kIDogNgkKLSAuKjogQWJicmV2IE51bWJlcjogMyBcKERXX1RBR19iYXNlX3R5cGVcKQotICAgICBEV19BVF9uYW1lICAgICAgICA6IGNoYXIJCi0gICAgIERXX0FUX2J5dGVfc2l6ZSAgIDogMQkKLSAgICAgRFdfQVRfZW5jb2RpbmcgICAgOiAuCVwoLiogY2hhclwpCi0gLio6IEFiYnJldiBOdW1iZXI6IDcgXChEV19UQUdfdmFyaWFibGVcKQotICAgICBEV19BVF9uYW1lICAgICAgICA6IHN0cmluZwkKLSAgICAgRFdfQVRfZGVjbF9maWxlICAgOiAxCQotICAgICBEV19BVF9kZWNsX2xpbmUgICA6IDYJCi0gICAgIERXX0FUX3R5cGUgICAgICAgIDogLioJCi0gICAgIERXX0FUX2xvY2F0aW9uICAgIDogNSBieXRlIGJsb2NrOiAzIC4gMCAwIC4gCVwoRFdfT1BfYWRkcjogLlwpCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3NpemUuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9zaXplLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkwOGM5MS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3NpemUuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4KLSMgYW5kIHJld3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIGlmIHtbd2hpY2ggJFNJWkVdID09IDB9IHRoZW4gewotCXBlcnJvciAiJFNJWkUgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuCi0gICAgfQotfQotCi1zZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkU0laRV0iCi0KLQotaWYgeyFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2JpbnRlc3QucyB0bXBkaXIvYmludGVzdC5vXX0gdGhlbiB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIFtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCB0ZXN0ZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL2JpbnRlc3Qub10KLX0gZWxzZSB7Ci0gICAgc2V0IHRlc3RmaWxlIHRtcGRpci9iaW50ZXN0Lm8KLX0KLQotc2V0IGRlYyAiXFswLTlcXSsiCi1zZXQgaGV4ICJcWzAtOWEtZkEtRlxdKyIKLQotIyBUZXN0IHNpemUgd2l0aCBubyBhcmd1bWVudHMKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRTSVpFICIkU0laRUZMQUdTICR0ZXN0ZmlsZSJdCi0KLXNldCB3YW50ICIoJGRlYylcWyAJXF0rKCRkZWMpXFsgCVxdKygkZGVjKVxbIAlcXSsoJGRlYylcWyAJXF0rKCRoZXgpXFsgCVxdKyR7dGVzdGZpbGV9IgotCi1pZiAhW3JlZ2V4cCAkd2FudCAkZ290IGFsbCB0ZXh0IGRhdGEgYnNzIGR0b3QgaGV4dG90XSB0aGVuIHsKLSAgICBmYWlsICJzaXplIChubyBhcmd1bWVudHMpIgotfSBlbHNlIHsKLSAgICBpZiB7JHRleHQgPCA4IHx8ICRkYXRhIDwgNH0gdGhlbiB7Ci0JZmFpbCAic2l6ZSAobm8gYXJndW1lbnRzKSIKLSAgICB9IGVsc2UgewotCXBhc3MgInNpemUgKG5vIGFyZ3VtZW50cykiCi0gICAgfQotfQotCi0jIFRlc3Qgc2l6ZSAtQQotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJFNJWkUgIiRTSVpFRkxBR1MgLUEgJHt0ZXN0ZmlsZX0iXQotCi1zZXQgd2FudCAiJHt0ZXN0ZmlsZX0uKih0ZXh0fFRFWFQpXFteXG5cclxdKlxbIAlcXSgkZGVjKVxbIAlcXSskZGVjLiooXFwuZGF0YXxEQVRBKVxbXlxuXHJcXSpcWyAJXF0oJGRlYylcWyAJXF0rJGRlYyIKLQotaWYgIVtyZWdleHAgJHdhbnQgJGdvdCBhbGwgdGV4dG5hbWUgdGV4dHNpemUgZGF0YW5hbWUgZGF0YXNpemVdIHRoZW4gewotICAgIGZhaWwgInNpemUgLUEiCi19IGVsc2UgewotICAgIHZlcmJvc2UgInRleHQgc2l6ZTogJHRleHRzaXplIgotICAgIHZlcmJvc2UgImRhdGEgc2l6ZTogJGRhdGFzaXplIgotICAgIGlmIHskdGV4dHNpemUgPCA4IHx8ICRkYXRhc2l6ZSA8IDR9IHRoZW4gewotCWZhaWwgInNpemUgLUEiCi0gICAgfSBlbHNlIHsKLQlwYXNzICJzaXplIC1BIgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvdGVzdHByb2cuYyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvdGVzdHByb2cuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwNjU2Yi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3Rlc3Rwcm9nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKiBUaGlzIHByb2dyYW0gaXMgdXNlZCB0byB0ZXN0IG9iamNvcHkgYW5kIHN0cmlwLiAgKi8KLQotaW50IGNvbW1vbjsKLWludCBnbG9iYWwgPSAxOwotc3RhdGljIGludCBsb2NhbCA9IDI7Ci1zdGF0aWMgY2hhciBzdHJpbmdbXSA9ICJzdHJpbmciOwotCi1pbnQKLWZuICgpCi17Ci0gIHJldHVybiAzOwotfQotCi1pbnQKLW1haW4gKCkKLXsKLSAgaWYgKGNvbW1vbiAhPSAwCi0gICAgICB8fCBnbG9iYWwgIT0gMQotICAgICAgfHwgbG9jYWwgIT0gMgotICAgICAgfHwgc3RyY21wIChzdHJpbmcsICJzdHJpbmciKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWxlZFxuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgcHJpbnRmICgib2tcbiIpOwotICBleGl0ICgwKTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTI4MDJlLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUuIChyb2JAY3lnbnVzLmNvbSkKLQotbG9hZF9saWIgdXRpbC1kZWZzLmV4cAotbG9hZF9saWIgdXRpbHMtbGliLmV4cAotCi1pZiAhW2luZm8gZXhpc3RzIE5NXSB0aGVuIHsKLSAgICBzZXQgTk0gW2ZpbmRmaWxlICRiYXNlX2Rpci9ubS1uZXcgJGJhc2VfZGlyL25tLW5ldyBbdHJhbnNmb3JtIG5tXV0KLX0KLWlmICFbaW5mbyBleGlzdHMgTk1GTEFHU10gdGhlbiB7Ci0gICAgc2V0IE5NRkxBR1MgIiIKLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBTSVpFXSB0aGVuIHsKLSAgICBzZXQgU0laRSBbZmluZGZpbGUgJGJhc2VfZGlyL3NpemVdCi19Ci1pZiAhW2luZm8gZXhpc3RzIFNJWkVGTEFHU10gdGhlbiB7Ci0gICAgc2V0IFNJWkVGTEFHUyAiIgotfQotCi1pZiAhW2luZm8gZXhpc3RzIE9CSkRVTVBdIHRoZW4gewotICAgIHNldCBPQkpEVU1QIFtmaW5kZmlsZSAkYmFzZV9kaXIvb2JqZHVtcF0KLX0KLWlmICFbaW5mbyBleGlzdHMgT0JKRFVNUEZMQUdTXSB0aGVuIHsKLSAgICBzZXQgT0JKRFVNUEZMQUdTICIiCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgT0JKQ09QWV0gdGhlbiB7Ci0gICAgc2V0IE9CSkNPUFkgW2ZpbmRmaWxlICRiYXNlX2Rpci9vYmpjb3B5XQotfQotaWYgIVtpbmZvIGV4aXN0cyBPQkpDT1BZRkxBR1NdIHRoZW4gewotICAgIHNldCBPQkpDT1BZRkxBR1MgIiIKLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBBUl0gdGhlbiB7Ci0gICAgc2V0IEFSIFtmaW5kZmlsZSAkYmFzZV9kaXIvYXJdCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgU1RSSVBdIHRoZW4gewotICAgIHNldCBTVFJJUCBbZmluZGZpbGUgJGJhc2VfZGlyL3N0cmlwLW5ldyAkYmFzZV9kaXIvc3RyaXAtbmV3IFt0cmFuc2Zvcm0gc3RyaXBdXQotfQotaWYgIVtpbmZvIGV4aXN0cyBTVFJJUEZMQUdTXSB0aGVuIHsKLSAgICBzZXQgU1RSSVBGTEFHUyAiIgotfQotCi1pZiAhW2luZm8gZXhpc3RzIFJFQURFTEZdIHRoZW4gewotICAgIHNldCBSRUFERUxGIFtmaW5kZmlsZSAkYmFzZV9kaXIvcmVhZGVsZl0KLX0KLWlmICFbaW5mbyBleGlzdHMgUkVBREVMRkZMQUdTXSB0aGVuIHsKLSAgICBzZXQgUkVBREVMRkZMQUdTICIiCi19Ci0KLWlmICFbZmlsZSBpc2RpcmVjdG9yeSB0bXBkaXJdIHtjYXRjaCAiZXhlYyBta2RpciB0bXBkaXIiIHN0YXR1c30KLQotIwotIyBiaW51dGlsc19ydW4KLSMJcnVuIGEgcHJvZ3JhbSwgcmV0dXJuaW5nIHRoZSBvdXRwdXQKLSMJc2V0cyBiaW51dGlsc19ydW5fZmFpbGVkIGlmIHRoZSBwcm9ncmFtIGRvZXMgbm90IGV4aXN0Ci0jCi1wcm9jIGJpbnV0aWxzX3J1biB7IHByb2cgcHJvZ2FyZ3MgfSB7Ci0gICAgZGVmYXVsdF9iaW51dGlsc19ydW4gJHByb2cgJHByb2dhcmdzCi19Ci0KLSMKLSMgYmludXRpbHNfYXNzZW1ibGUKLSMJYXNzZW1ibGUgYSBmaWxlCi0jCi1wcm9jIGJpbnV0aWxzX2Fzc2VtYmxlIHsgc291cmNlIG9iamVjdCB9IHsKLSAgICBkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlICRzb3VyY2UgJG9iamVjdAotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2NvbmZpZy9ocHBhLnNlZCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9jb25maWcvaHBwYS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NjA3ZDguLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2NvbmZpZy9ocHBhLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcy8jIE9sZCBPU0Ygc2VkIGJsb3dzIHVwIGlmIHlvdSBoYXZlIGEgc2VkIGNvbW1hbmQgc3RhcnRpbmcgd2l0aCAiIyIvLwotcy8jIEF2b2lkIGl0IGJ5IHB1dHRpbmcgdGhlIGNvbW1lbnRzIHdpdGhpbiByZWFsIHNlZCBjb21tYW5kcy4vLwotcy8jIEZpeCB0aGUgZGVmaW5pdGlvbiBvZiBjb21tb25fc3ltYm9sIHRvIGJlIGNvcnJlY3QgZm9yIHRoZSBQQSBhc3NlYm1sZXJzLi8vCi1zLwlcLmNvbW0gY29tbW9uX3N5bWJvbCw0L2NvbW1vbl9zeW1ib2wJLmNvbW0gNC8KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9saWIvdXRpbHMtbGliLmV4cCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9saWIvdXRpbHMtbGliLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3ZjIxNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvbGliL3V0aWxzLWxpYi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4KLSMgYW5kIGV4dGVuZGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1wcm9jIGJpbnV0aWxfdmVyc2lvbiB7IHByb2cgfSB7Ci0gICAgaWYgIVtpc19yZW1vdGUgaG9zdF0gewotCXNldCBwYXRoIFt3aGljaCAkcHJvZ107Ci0JaWYgeyRwYXRoID09IDB9IHRoZW4gewotCSAgICBwZXJyb3IgIiRwcm9nIGNhbid0IGJlIHJ1biwgZmlsZSBub3QgZm91bmQuIgotCSAgICByZXR1cm4gIiIKLQl9Ci0gICAgfSBlbHNlIHsKLQlzZXQgcGF0aCAkcHJvZwotICAgIH0KLSAgICBzZXQgc3RhdGUgW3JlbW90ZV9leGVjIGhvc3QgJHByb2cgLS12ZXJzaW9uXTsKLSAgICBzZXQgdG1wICJbbGluZGV4ICRzdGF0ZSAxXVxuIjsKLSAgICAjIFNob3VsZCBmaW5kIGEgd2F5IHRvIGRpc2NhcmQgY29uc3RhbnQgcGFydHMsIGtlZXAgd2hhdGV2ZXIncwotICAgICMgbGVmdCwgc28gdGhlIHZlcnNpb24gc3RyaW5nIGNvdWxkIGJlIGFsbW9zdCBhbnl0aGluZyBhdCBhbGwuLi4KLSAgICByZWdleHAgIlxbXlxuXF0qIChjeWdudXMtfCkoXFstMC05LmEtekEtWi1cXSspXFtcclxuXF0uKiIgIiR0bXAiIHZlcnNpb24gY3lnIG51bWJlcgotICAgIGlmICFbaW5mbyBleGlzdHMgbnVtYmVyXSB0aGVuIHsKLSAgICAgICAgcmV0dXJuICIkcGF0aCAobm8gdmVyc2lvbiBudW1iZXIpXG4iCi0gICAgfQotICAgIHJldHVybiAiJHBhdGggJG51bWJlclxuIgotfQotCi0jCi0jIGRlZmF1bHRfYmludXRpbHNfcnVuCi0jCXJ1biBhIHByb2dyYW0sIHJldHVybmluZyB0aGUgb3V0cHV0Ci0jCXNldHMgYmludXRpbHNfcnVuX2ZhaWxlZCBpZiB0aGUgcHJvZ3JhbSBkb2VzIG5vdCBleGlzdAotIwotcHJvYyBkZWZhdWx0X2JpbnV0aWxzX3J1biB7IHByb2cgcHJvZ2FyZ3MgfSB7Ci0gICAgZ2xvYmFsIGJpbnV0aWxzX3J1bl9mYWlsZWQKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0KLSAgICBzZXQgYmludXRpbHNfcnVuX2ZhaWxlZCAwCi0KLSAgICBpZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0JaWYge1t3aGljaCAkcHJvZ10gPT0gMH0gdGhlbiB7Ci0JICAgIHBlcnJvciAiJHByb2cgZG9lcyBub3QgZXhpc3QiCi0JICAgIHNldCBiaW51dGlsc19ydW5fZmFpbGVkIDEKLQkgICAgcmV0dXJuICIiCi0JfQotICAgIH0KLQotICAgIHNlbmRfbG9nICIkcHJvZyAkcHJvZ2FyZ3NcbiIKLSAgICB2ZXJib3NlICIkcHJvZyAkcHJvZ2FyZ3MiCi0KLSAgICAjIEdvdHRhIHF1b3RlIGRvbGxhci1zaWducyBiZWNhdXNlIHRoZXkgZ2V0IG1hbmdsZWQgYnkgdGhlCi0gICAgIyBzaGVsbCBvdGhlcndpc2UuCi0gICAgcmVnc3ViIC1hbGwgIlxcJCIgIiRwcm9nYXJncyIgIlxcJCIgcHJvZ2FyZ3MKLQotICAgIHNldCBzdGF0ZSBbcmVtb3RlX2V4ZWMgaG9zdCAkcHJvZyAkcHJvZ2FyZ3NdCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyBbbGluZGV4ICRzdGF0ZSAxXV07Ci0gICAgaWYgeyFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF19IHRoZW4gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0gICAgfQotICAgIHJldHVybiAkZXhlY19vdXRwdXQKLX0KLQotIwotIyBkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlCi0jCWFzc2VtYmxlIGEgZmlsZQotIwotcHJvYyBkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlIHsgc291cmNlIG9iamVjdCB9IHsKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgIyBUaGUgSFBQQSBhc3NlbWJsZXIgc3ludGF4IGlzIGEgbGl0dGxlIGRpZmZlcmVudCB0aGFuIG1vc3QsIHRvIG1ha2UKLSAgICAjIHRoZSB0ZXN0IHNvdXJjZSBmaWxlIGFzc2VtYmxlIHdlIG5lZWQgdG8gcnVuIGl0IHRocm91Z2ggc2VkLgotICAgICMKLSAgICAjIFRoaXMgaXMgYSBoYWNrIGluIHRoYXQgaXQgd29uJ3Qgc2NhbGUgd2VsbCBpZiBvdGhlciB0YXJnZXRzIG5lZWQKLSAgICAjIHNpbWlsYXIgdHJhbnNmb3JtYXRpb25zIHRvIGFzc2VtYmxlLiAgV2UnbGwgZ2VuZXJhbGl6ZSB0aGUgaGFjawotICAgICMgaWYvd2hlbiBvdGhlciB0YXJnZXRzIG5lZWQgc2ltaWxhciBoYW5kbGluZy4KLSAgICBpZiBbaXN0YXJnZXQgImhwcGEqLSotKiIgXSB0aGVuIHsKLQlzZW5kX2xvZyAic2VkIC1mICRzcmNkaXIvY29uZmlnL2hwcGEuc2VkIDwgJHNvdXJjZSA+IGFzbS5zXG4iCi0JdmVyYm9zZSAic2VkIC1mICRzcmNkaXIvY29uZmlnL2hwcGEuc2VkIDwgJHNvdXJjZSA+IGFzbS5zIgotCWNhdGNoICJleGVjIHNlZCAtZiAkc3JjZGlyL2NvbmZpZy9ocHBhLnNlZCA8ICRzb3VyY2UgPiBhc20ucyI7Ci0Jc2V0IHNvdXJjZSBhc20ucwotICAgIH0KLQotICAgIHNldCBleGVjX291dHB1dCBbdGFyZ2V0X2Fzc2VtYmxlICRzb3VyY2UgJG9iamVjdCAiIl07Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCXBlcnJvciAiJHNvdXJjZTogYXNzZW1ibHkgZmFpbGVkIgotCXJldHVybiAwCi0gICAgfQotfQotCi1pZiAhW2luZm8gZXhpc3RzIHRhcmdldF9hc3NlbWJsZV0gewotIwotIyBTdG9sZW4gZnJvbSBkZWphZ251L2xpYi90YXJnZXQuZXhwLS1wbGVhc2UgcmVtb3ZlIGFmdGVyIDEvMS85OC4KLSMKLXVwbGV2ZWwgIzAgewotICAgIHByb2MgdGFyZ2V0X2Fzc2VtYmxlIHsgc291cmNlIGRlc3RmaWxlIGZsYWdzIH0gewotCXJldHVybiBbZGVmYXVsdF90YXJnZXRfYXNzZW1ibGUgJHNvdXJjZSAkZGVzdGZpbGUgJGZsYWdzXTsKLSAgICB9Ci0KLSAgICBwcm9jIGRlZmF1bHRfdGFyZ2V0X2Fzc2VtYmxlIHsgc291cmNlIGRlc3RmaWxlIGZsYWdzIH0gewotCWdsb2JhbCBBU19GT1JfVEFSR0VUOwotCWdsb2JhbCBBU0ZMQUdTX0ZPUl9UQVJHRVQ7Ci0KLQlpZiBbaW5mbyBleGlzdHMgQVNfRk9SX1RBUkdFVF0gewotCSAgICBzZXQgQVMgIiRBU19GT1JfVEFSR0VUIjsKLQl9IGVsc2UgewotCSAgICBpZiAhW2JvYXJkX2luZm8gdGFyZ2V0IGV4aXN0cyBhc3NlbWJsZXJdIHsKLQkJc2V0IEFTIFtmaW5kX2dhc107Ci0JICAgIH0gZWxzZSB7Ci0JCXNldCBBUyBbYm9hcmRfaW5mbyB0YXJnZXQgYXNzZW1ibGVyXTsKLQkgICAgfQotCX0KLQotCWlmIFtpbmZvIGV4aXN0cyBBU0ZMQUdTX0ZPUl9UQVJHRVRdIHsKLQkgICAgYXBwZW5kIGZsYWdzICIgJEFTRkxBR1NfRk9SX1RBUkdFVCI7Ci0JfQotCi0JaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JICAgIHNldCBzb3VyY2UgW3JlbW90ZV9kb3dubG9hZCBob3N0ICRzb3VyY2VdOwotCSAgICBzZXQgZGVzdCAiYS5vdXQiCi0JfSBlbHNlIHsKLQkgICAgc2V0IGRlc3QgJGRlc3RmaWxlCi0JfQotCXNldCBzdGF0dXMgW3JlbW90ZV9leGVjIGhvc3QgIiRBUyAkc291cmNlICRmbGFncyAtbyAkZGVzdCJdCi0JaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JICAgIHJlbW90ZV91cGxvYWQgaG9zdCAkZGVzdCAkZGVzdGZpbGUKLQl9Ci0KLQlzZXQgY29tcF9vdXRwdXQgW3BydW5lX3dhcm5pbmdzIFtsaW5kZXggJHN0YXR1cyAxXV07Ci0JaWYgeyBbbGluZGV4ICRzdGF0dXMgMF0gIT0gMCB9IHsKLQkgICAgdmVyYm9zZSAtbG9nICJhc3NlbWJsZXIgZXhpdGVkIHdpdGggc3RhdHVzIFtsaW5kZXggJHN0YXR1cyAwXSI7Ci0JfQotCWlmIHsgW2xpbmRleCAkc3RhdHVzIDFdICE9ICIiIH0gewotCSAgICB2ZXJib3NlIC1sb2cgImFzc2VtYmxlciBvdXRwdXQgaXM6XG5bbGluZGV4ICRzdGF0dXMgMV0iIDI7Ci0JfQotCXJldHVybiAke2NvbXBfb3V0cHV0fTsKLX0KLX0KLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3ZlcnNpb24uYyBiL2JpbnV0aWxzL3ZlcnNpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA1NTkzOS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy92ZXJzaW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiB2ZXJzaW9uLmMgLS0gYmludXRpbHMgdmVyc2lvbiBpbmZvcm1hdGlvbgotICAgQ29weXJpZ2h0IDE5OTEsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLS8qIFRoaXMgaXMgdGhlIHZlcnNpb24gbnVtYmVycyBmb3IgdGhlIGJpbnV0aWxzLiAgVGhleSBhbGwgY2hhbmdlIGluCi0gICBsb2Nrc3RlcCAtLSBpdCdzIGVhc2llciB0aGF0IHdheS4gKi8KLQotY29uc3QgY2hhciAqcHJvZ3JhbV92ZXJzaW9uID0gVkVSU0lPTjsKLQotLyogUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIGFuZCBjb3B5cmlnaHQgaW5mb3JtYXRpb24sIGFuZCBleGl0LiAgVGhpcwotICAgaW1wbGVtZW50cyB0aGUgLS12ZXJzaW9uIG9wdGlvbiBmb3IgdGhlIHZhcmlvdXMgcHJvZ3JhbXMuICAqLwotCi12b2lkCi1wcmludF92ZXJzaW9uIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICAvKiBUaGlzIG91dHB1dCBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIEdOVSBzdGFuZGFyZHMgZG9jdW1lbnQuICAqLwotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBwcmludGYgKCJHTlUgJXMgJXNcbiIsIG5hbWUsIHByb2dyYW1fdmVyc2lvbik7Ci0gIHByaW50ZiAoXygiQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iKSk7Ci0gIHByaW50ZiAoXygiXAotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuXAotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIikpOwotICBleGl0ICgwKTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3dpbmRyZXMuYyBiL2JpbnV0aWxzL3dpbmRyZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwZGI5MC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy93aW5kcmVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OTIgKzAsMCBAQAotLyogd2luZHJlcy5jIC0tIGEgcHJvZ3JhbSB0byBtYW5pcHVsYXRlIFdpbmRvd3MgcmVzb3VyY2VzCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgcHJvZ3JhbSBjYW4gcmVhZCBhbmQgd3JpdGUgV2luZG93cyByZXNvdXJjZXMgaW4gdmFyaW91cwotICAgZm9ybWF0cy4gIEluIHBhcnRpY3VsYXIsIGl0IGNhbiBhY3QgbGlrZSB0aGUgcmMgcmVzb3VyY2UgY29tcGlsZXIKLSAgIHByb2dyYW0sIGFuZCBpdCBjYW4gYWN0IGxpa2UgdGhlIGN2dHJlcyByZXMgdG8gQ09GRiBjb252ZXJzaW9uCi0gICBwcm9ncmFtLgotCi0gICBJdCBpcyBiYXNlZCBvbiBpbmZvcm1hdGlvbiB0YWtlbiBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlczoKLQotICAgKiBNaWNyb3NvZnQgZG9jdW1lbnRhdGlvbi4KLQotICAgKiBUaGUgcmNsIHByb2dyYW0sIHdyaXR0ZW4gYnkgR3VudGhlciBFYmVydAotICAgICA8Z3VudGhlci5lYmVydEBpeG9zLWxlaXB6aWcuZGU+LgotCi0gICAqIFRoZSByZXMyY29mZiBwcm9ncmFtLCB3cml0dGVuIGJ5IFBlZHJvIEEuIEFyYW5kYSA8cGFhZ0B0aWQuZXM+LgotCi0gICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotI2luY2x1ZGUgIndpbmRyZXMuaCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0vKiB1c2VkIGJ5IHJlc3JjLmMgYXQgbGVhc3QgKi8KLQotaW50IHZlcmJvc2UgPSAwOwotCi0vKiBBbiBlbnVtZXJhdGlvbiBvZiBmb3JtYXQgdHlwZXMuICAqLwotCi1lbnVtIHJlc19mb3JtYXQKLXsKLSAgLyogVW5rbm93biBmb3JtYXQuICAqLwotICBSRVNfRk9STUFUX1VOS05PV04sCi0gIC8qIFRleHR1YWwgUkMgZmlsZS4gICovCi0gIFJFU19GT1JNQVRfUkMsCi0gIC8qIEJpbmFyeSBSRVMgZmlsZS4gICovCi0gIFJFU19GT1JNQVRfUkVTLAotICAvKiBDT0ZGIGZpbGUuICAqLwotICBSRVNfRk9STUFUX0NPRkYKLX07Ci0KLS8qIEEgc3RydWN0dXJlIHVzZWQgdG8gbWFwIGJldHdlZW4gZm9ybWF0IHR5cGVzIGFuZCBzdHJpbmdzLiAgKi8KLQotc3RydWN0IGZvcm1hdF9tYXAKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgZW51bSByZXNfZm9ybWF0IGZvcm1hdDsKLX07Ci0KLS8qIEEgbWFwcGluZyBiZXR3ZWVuIG5hbWVzIGFuZCBmb3JtYXQgdHlwZXMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZvcm1hdF9tYXAgZm9ybWF0X25hbWVzW10gPQotewotICB7ICJyYyIsIFJFU19GT1JNQVRfUkMgfSwKLSAgeyAicmVzIiwgUkVTX0ZPUk1BVF9SRVMgfSwKLSAgeyAiY29mZiIsIFJFU19GT1JNQVRfQ09GRiB9LAotICB7IE5VTEwsIFJFU19GT1JNQVRfVU5LTk9XTiB9Ci19OwotCi0vKiBBIG1hcHBpbmcgZnJvbSBmaWxlIGV4dGVuc2lvbnMgdG8gZm9ybWF0IHR5cGVzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmb3JtYXRfbWFwIGZvcm1hdF9maWxlZXh0c1tdID0KLXsKLSAgeyAicmMiLCBSRVNfRk9STUFUX1JDIH0sCi0gIHsgInJlcyIsIFJFU19GT1JNQVRfUkVTIH0sCi0gIHsgImV4ZSIsIFJFU19GT1JNQVRfQ09GRiB9LAotICB7ICJvYmoiLCBSRVNfRk9STUFUX0NPRkYgfSwKLSAgeyAibyIsIFJFU19GT1JNQVRfQ09GRiB9LAotICB7IE5VTEwsIFJFU19GT1JNQVRfVU5LTk9XTiB9Ci19OwotCi0vKiBBIGxpc3Qgb2YgaW5jbHVkZSBkaXJlY3Rvcmllcy4gICovCi0KLXN0cnVjdCBpbmNsdWRlX2RpcgotewotICBzdHJ1Y3QgaW5jbHVkZV9kaXIgKm5leHQ7Ci0gIGNoYXIgKmRpcjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW5jbHVkZV9kaXIgKmluY2x1ZGVfZGlyczsKLQotLyogTG9uZyBvcHRpb25zLiAgKi8KLQotLyogMTUwIGlzbid0IHNwZWNpYWw7IGl0J3MganVzdCBhbiBhcmJpdHJhcnkgbm9uLUFTQ0lJIGNoYXIgdmFsdWUuICAqLwotCi0jZGVmaW5lIE9QVElPTl9ERUZJTkUgMTUwCi0jZGVmaW5lIE9QVElPTl9IRUxQIChPUFRJT05fREVGSU5FICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lOQ0xVREVfRElSIChPUFRJT05fSEVMUCArIDEpCi0jZGVmaW5lIE9QVElPTl9MQU5HVUFHRSAoT1BUSU9OX0lOQ0xVREVfRElSICsgMSkKLSNkZWZpbmUgT1BUSU9OX1BSRVBST0NFU1NPUiAoT1BUSU9OX0xBTkdVQUdFICsgMSkKLSNkZWZpbmUgT1BUSU9OX1ZFUlNJT04gKE9QVElPTl9QUkVQUk9DRVNTT1IgKyAxKQotI2RlZmluZSBPUFRJT05fWVlERUJVRyAoT1BUSU9OX1ZFUlNJT04gKyAxKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsiZGVmaW5lIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9ERUZJTkV9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX0hFTFB9LAotICB7ImluY2x1ZGUtZGlyIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9JTkNMVURFX0RJUn0sCi0gIHsiaW5wdXQtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sCi0gIHsibGFuZ3VhZ2UiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0xBTkdVQUdFfSwKLSAgeyJvdXRwdXQtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdPJ30sCi0gIHsicHJlcHJvY2Vzc29yIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9QUkVQUk9DRVNTT1J9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRid9LAotICB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgMCwgJ3YnfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9WRVJTSU9OfSwKLSAgeyJ5eWRlYnVnIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9ZWURFQlVHfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQotLyogU3RhdGljIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkIHJlc19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgZXh0ZW5kZWRfbWVudWl0ZW1zIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqKSk7Ci1zdGF0aWMgZW51bSByZXNfZm9ybWF0IGZvcm1hdF9mcm9tX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgZW51bSByZXNfZm9ybWF0IGZvcm1hdF9mcm9tX2ZpbGVuYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIGludCBjbXBfcmVzX2VudHJ5IFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKnNvcnRfcmVzb3VyY2VzIFBBUkFNUyAoKHN0cnVjdCByZXNfZGlyZWN0b3J5ICopKTsKLQwKLS8qIFdoZW4gd2UgYXJlIGJ1aWxkaW5nIGEgcmVzb3VyY2UgdHJlZSwgd2UgYWxsb2NhdGUgZXZlcnl0aGluZyBvbnRvCi0gICBhbiBvYnN0YWNrLCBzbyB0aGF0IHdlIGNhbiBmcmVlIGl0IGFsbCBhdCBvbmNlIGlmIHdlIHdhbnQuICAqLwotCi0jZGVmaW5lIG9ic3RhY2tfY2h1bmtfYWxsb2MgeG1hbGxvYwotI2RlZmluZSBvYnN0YWNrX2NodW5rX2ZyZWUgZnJlZQotCi0vKiBUaGUgcmVzb3VyY2UgYnVpbGRpbmcgb2JzdGFjay4gICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb2JzdGFjayByZXNfb2JzdGFjazsKLQotLyogSW5pdGlhbGl6ZSB0aGUgcmVzb3VyY2UgYnVpbGRpbmcgb2JzdGFjay4gICovCi0KLXN0YXRpYyB2b2lkCi1yZXNfaW5pdCAoKQotewotICBvYnN0YWNrX2luaXQgKCZyZXNfb2JzdGFjayk7Ci19Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIG9uIHRoZSByZXNvdXJjZSBidWlsZGluZyBvYnN0YWNrLiAgKi8KLQotUFRSCi1yZXNfYWxsb2MgKGJ5dGVzKQotICAgICBzaXplX3QgYnl0ZXM7Ci17Ci0gIHJldHVybiAoUFRSKSBvYnN0YWNrX2FsbG9jICgmcmVzX29ic3RhY2ssIGJ5dGVzKTsKLX0KLQotLyogV2UgYWxzbyB1c2UgYW4gb2JzdGFjayB0byBzYXZlIG1lbW9yeSB1c2VkIHdoaWxlIHdyaXRpbmcgb3V0IGEgc2V0Ci0gICBvZiByZXNvdXJjZXMuICAqLwotCi1zdGF0aWMgc3RydWN0IG9ic3RhY2sgcmVzd3Jfb2JzdGFjazsKLQotLyogSW5pdGlhbGl6ZSB0aGUgcmVzb3VyY2Ugd3JpdGluZyBvYnN0YWNrLiAgKi8KLQotc3RhdGljIHZvaWQKLXJlc3dyX2luaXQgKCkKLXsKLSAgb2JzdGFja19pbml0ICgmcmVzd3Jfb2JzdGFjayk7Ci19Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIG9uIHRoZSByZXNvdXJjZSB3cml0aW5nIG9ic3RhY2suICAqLwotCi1QVFIKLXJlc3dyX2FsbG9jIChieXRlcykKLSAgICAgc2l6ZV90IGJ5dGVzOwotewotICByZXR1cm4gKFBUUikgb2JzdGFja19hbGxvYyAoJnJlc3dyX29ic3RhY2ssIGJ5dGVzKTsKLX0KLQwKLS8qIE9wZW4gYSBmaWxlIHVzaW5nIHRoZSBpbmNsdWRlIGRpcmVjdG9yeSBzZWFyY2ggbGlzdC4gICovCi0KLUZJTEUgKgotb3Blbl9maWxlX3NlYXJjaCAoZmlsZW5hbWUsIG1vZGUsIGVycm1zZywgcmVhbF9maWxlbmFtZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1vZGU7Ci0gICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgICAgY2hhciAqKnJlYWxfZmlsZW5hbWU7Ci17Ci0gIEZJTEUgKmU7Ci0gIHN0cnVjdCBpbmNsdWRlX2RpciAqZDsKLQotICBlID0gZm9wZW4gKGZpbGVuYW1lLCBtb2RlKTsKLSAgaWYgKGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAqcmVhbF9maWxlbmFtZSA9IHhzdHJkdXAgKGZpbGVuYW1lKTsKLSAgICAgIHJldHVybiBlOwotICAgIH0KLQotICBpZiAoZXJybm8gPT0gRU5PRU5UKQotICAgIHsKLSAgICAgIGZvciAoZCA9IGluY2x1ZGVfZGlyczsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLQl7Ci0JICBjaGFyICpuOwotCi0JICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChkLT5kaXIpICsgc3RybGVuIChmaWxlbmFtZSkgKyAyKTsKLQkgIHNwcmludGYgKG4sICIlcy8lcyIsIGQtPmRpciwgZmlsZW5hbWUpOwotCSAgZSA9IGZvcGVuIChuLCBtb2RlKTsKLQkgIGlmIChlICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICAqcmVhbF9maWxlbmFtZSA9IG47Ci0JICAgICAgcmV0dXJuIGU7Ci0JICAgIH0KLQotCSAgaWYgKGVycm5vICE9IEVOT0VOVCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBmYXRhbCAoXygiY2FuJ3Qgb3BlbiAlcyBgJXMnOiAlcyIpLCBlcnJtc2csIGZpbGVuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLQotICAvKiBSZXR1cm4gYSB2YWx1ZSB0byBhdm9pZCBhIGNvbXBpbGVyIHdhcm5pbmcuICAqLwotICByZXR1cm4gTlVMTDsKLX0KLQwKLS8qIENvbXBhcmUgdHdvIHJlc291cmNlIElEJ3MuICBXZSBjb25zaWRlciBuYW1lIGVudHJpZXMgdG8gY29tZSBiZWZvcmUKLSAgIG51bWVyaWMgZW50cmllcywgYmVjYXVzZSB0aGF0IGlzIGhvdyB0aGV5IGFwcGVhciBpbiB0aGUgQ09GRiAucnNyYwotICAgc2VjdGlvbi4gICovCi0KLWludAotcmVzX2lkX2NtcCAoYSwgYikKLSAgICAgc3RydWN0IHJlc19pZCBhOwotICAgICBzdHJ1Y3QgcmVzX2lkIGI7Ci17Ci0gIGlmICghIGEubmFtZWQpCi0gICAgewotICAgICAgaWYgKGIubmFtZWQpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoYS51LmlkID4gYi51LmlkKQotCXJldHVybiAxOwotICAgICAgZWxzZSBpZiAoYS51LmlkIDwgYi51LmlkKQotCXJldHVybiAtMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bmljaGFyICphcywgKmFzZSwgKmJzLCAqYnNlOwotCi0gICAgICBpZiAoISBiLm5hbWVkKQotCXJldHVybiAtMTsKLQotICAgICAgYXMgPSBhLnUubi5uYW1lOwotICAgICAgYXNlID0gYXMgKyBhLnUubi5sZW5ndGg7Ci0gICAgICBicyA9IGIudS5uLm5hbWU7Ci0gICAgICBic2UgPSBicyArIGIudS5uLmxlbmd0aDsKLQotICAgICAgd2hpbGUgKGFzIDwgYXNlKQotCXsKLQkgIGludCBpOwotCi0JICBpZiAoYnMgPj0gYnNlKQotCSAgICByZXR1cm4gMTsKLQkgIGkgPSAoaW50KSAqYXMgLSAoaW50KSAqYnM7Ci0JICBpZiAoaSAhPSAwKQotCSAgICByZXR1cm4gaTsKLQkgICsrYXM7Ci0JICArK2JzOwotCX0KLQotICAgICAgaWYgKGJzIDwgYnNlKQotCXJldHVybiAtMTsKLQotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0vKiBQcmludCBhIHJlc291cmNlIElELiAgKi8KLQotdm9pZAotcmVzX2lkX3ByaW50IChzdHJlYW0sIGlkLCBxdW90ZSkKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBzdHJ1Y3QgcmVzX2lkIGlkOwotICAgICBpbnQgcXVvdGU7Ci17Ci0gIGlmICghIGlkLm5hbWVkKQotICAgIGZwcmludGYgKHN0cmVhbSwgIiVsdSIsIGlkLnUuaWQpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKHF1b3RlKQotCXB1dGMgKCciJywgc3RyZWFtKTsKLSAgICAgIHVuaWNvZGVfcHJpbnQgKHN0cmVhbSwgaWQudS5uLm5hbWUsIGlkLnUubi5sZW5ndGgpOwotICAgICAgaWYgKHF1b3RlKQotCXB1dGMgKCciJywgc3RyZWFtKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IGEgbGlzdCBvZiByZXNvdXJjZSBJRCdzLiAgKi8KLQotdm9pZAotcmVzX2lkc19wcmludCAoc3RyZWFtLCBjaWRzLCBpZHMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IGNpZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKmlkczsKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNpZHM7IGkrKykKLSAgICB7Ci0gICAgICByZXNfaWRfcHJpbnQgKHN0cmVhbSwgaWRzW2ldLCAxKTsKLSAgICAgIGlmIChpICsgMSA8IGNpZHMpCi0JZnByaW50ZiAoc3RyZWFtLCAiOiAiKTsKLSAgICB9Ci19Ci0KLS8qIENvbnZlcnQgYW4gQVNDSUkgc3RyaW5nIHRvIGEgcmVzb3VyY2UgSUQuICAqLwotCi12b2lkCi1yZXNfc3RyaW5nX3RvX2lkIChyZXNfaWQsIHN0cmluZykKLSAgICAgc3RydWN0IHJlc19pZCAqcmVzX2lkOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHJlc19pZC0+bmFtZWQgPSAxOwotICB1bmljb2RlX2Zyb21fYXNjaWkgKCZyZXNfaWQtPnUubi5sZW5ndGgsICZyZXNfaWQtPnUubi5uYW1lLCBzdHJpbmcpOwotfQotCi0vKiBEZWZpbmUgYSByZXNvdXJjZS4gIFRoZSBhcmd1bWVudHMgYXJlIHRoZSByZXNvdXJjZSB0cmVlLCBSRVNPVVJDRVMsCi0gICBhbmQgdGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRvIHB1dCBpdCBpbiB0aGUgdHJlZSwgQ0lEUyBhbmQgSURTLgotICAgVGhpcyByZXR1cm5zIGEgbmV3bHkgYWxsb2NhdGVkIHJlc19yZXNvdXJjZSBzdHJ1Y3R1cmUsIHdoaWNoIHRoZQotICAgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGluaXRpYWxpemUuICBJZiBEVVBPSyBpcyBub24temVybywgdGhlbiBpZiBhCi0gICByZXNvdXJjZSB3aXRoIHRoaXMgSUQgZXhpc3RzLCBpdCBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgYSB3YXJuaW5nCi0gICBpcyBpc3N1ZWQsIGFuZCBhIG5ldyByZXNvdXJjZSBpcyBjcmVhdGVkIHJlcGxhY2luZyB0aGUgZXhpc3RpbmcKLSAgIG9uZS4gICovCi0KLXN0cnVjdCByZXNfcmVzb3VyY2UgKgotZGVmaW5lX3Jlc291cmNlIChyZXNvdXJjZXMsIGNpZHMsIGlkcywgZHVwb2spCi0gICAgIHN0cnVjdCByZXNfZGlyZWN0b3J5ICoqcmVzb3VyY2VzOwotICAgICBpbnQgY2lkczsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqaWRzOwotICAgICBpbnQgZHVwb2s7Ci17Ci0gIHN0cnVjdCByZXNfZW50cnkgKnJlID0gTlVMTDsKLSAgaW50IGk7Ci0KLSAgYXNzZXJ0IChjaWRzID4gMCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjaWRzOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IHJlc19lbnRyeSAqKnBwOwotCi0gICAgICBpZiAoKnJlc291cmNlcyA9PSBOVUxMKQotCXsKLQkgIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWV2YWw7Ci0KLQkgIC8qIFVzZSB0aGUgc2FtZSB0aW1lc3RhbXAgZm9yIGV2ZXJ5IHJlc291cmNlIGNyZWF0ZWQgaW4gYQotICAgICAgICAgICAgIHNpbmdsZSBydW4uICAqLwotCSAgaWYgKHRpbWV2YWwgPT0gMCkKLQkgICAgdGltZXZhbCA9IHRpbWUgKE5VTEwpOwotCi0JICAqcmVzb3VyY2VzID0gKChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKQotCQkJcmVzX2FsbG9jIChzaXplb2YgKipyZXNvdXJjZXMpKTsKLQkgICgqcmVzb3VyY2VzKS0+Y2hhcmFjdGVyaXN0aWNzID0gMDsKLQkgICgqcmVzb3VyY2VzKS0+dGltZSA9IHRpbWV2YWw7Ci0JICAoKnJlc291cmNlcyktPm1ham9yID0gMDsKLQkgICgqcmVzb3VyY2VzKS0+bWlub3IgPSAwOwotCSAgKCpyZXNvdXJjZXMpLT5lbnRyaWVzID0gTlVMTDsKLQl9Ci0KLSAgICAgIGZvciAocHAgPSAmKCpyZXNvdXJjZXMpLT5lbnRyaWVzOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0JaWYgKHJlc19pZF9jbXAgKCgqcHApLT5pZCwgaWRzW2ldKSA9PSAwKQotCSAgYnJlYWs7Ci0KLSAgICAgIGlmICgqcHAgIT0gTlVMTCkKLQlyZSA9ICpwcDsKLSAgICAgIGVsc2UKLQl7Ci0JICByZSA9IChzdHJ1Y3QgcmVzX2VudHJ5ICopIHJlc19hbGxvYyAoc2l6ZW9mICpyZSk7Ci0JICByZS0+bmV4dCA9IE5VTEw7Ci0JICByZS0+aWQgPSBpZHNbaV07Ci0JICBpZiAoKGkgKyAxKSA8IGNpZHMpCi0JICAgIHsKLQkgICAgICByZS0+c3ViZGlyID0gMTsKLQkgICAgICByZS0+dS5kaXIgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZS0+c3ViZGlyID0gMDsKLQkgICAgICByZS0+dS5yZXMgPSBOVUxMOwotCSAgICB9Ci0KLQkgICpwcCA9IHJlOwotCX0KLQotICAgICAgaWYgKChpICsgMSkgPCBjaWRzKQotCXsKLQkgIGlmICghIHJlLT5zdWJkaXIpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLQkgICAgICByZXNfaWRzX3ByaW50IChzdGRlcnIsIGksIGlkcyk7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCI6IGV4cGVjdGVkIHRvIGJlIGEgZGlyZWN0b3J5XG4iKSk7Ci0JICAgICAgeGV4aXQgKDEpOwotCSAgICB9Ci0KLQkgIHJlc291cmNlcyA9ICZyZS0+dS5kaXI7Ci0JfQotICAgIH0KLQotICBpZiAocmUtPnN1YmRpcikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgY2lkcywgaWRzKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiOiBleHBlY3RlZCB0byBiZSBhIGxlYWZcbiIpKTsKLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKHJlLT51LnJlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChkdXBvaykKLQlyZXR1cm4gcmUtPnUucmVzOwotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB3YXJuaW5nOiAiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgY2lkcywgaWRzKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiOiBkdXBsaWNhdGUgdmFsdWVcbiIpKTsKLSAgICB9Ci0KLSAgcmUtPnUucmVzID0gKChzdHJ1Y3QgcmVzX3Jlc291cmNlICopCi0JICAgICAgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcmVzX3Jlc291cmNlKSkpOwotCi0gIHJlLT51LnJlcy0+dHlwZSA9IFJFU19UWVBFX1VOSU5JVElBTElaRUQ7Ci0gIG1lbXNldCAoJnJlLT51LnJlcy0+cmVzX2luZm8sIDAsIHNpemVvZiAoc3RydWN0IHJlc19yZXNfaW5mbykpOwotICBtZW1zZXQgKCZyZS0+dS5yZXMtPmNvZmZfaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVzX2NvZmZfaW5mbykpOwotCi0gIHJldHVybiByZS0+dS5yZXM7Ci19Ci0KLS8qIERlZmluZSBhIHN0YW5kYXJkIHJlc291cmNlLiAgVGhpcyBpcyBhIHZlcnNpb24gb2YgZGVmaW5lX3Jlc291cmNlCi0gICB0aGF0IGp1c3QgdGFrZXMgdHlwZSwgbmFtZSwgYW5kIGxhbmd1YWdlIGFyZ3VtZW50cy4gICovCi0KLXN0cnVjdCByZXNfcmVzb3VyY2UgKgotZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlIChyZXNvdXJjZXMsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBkdXBvaykKLSAgICAgc3RydWN0IHJlc19kaXJlY3RvcnkgKipyZXNvdXJjZXM7Ci0gICAgIGludCB0eXBlOwotICAgICBzdHJ1Y3QgcmVzX2lkIG5hbWU7Ci0gICAgIGludCBsYW5ndWFnZTsKLSAgICAgaW50IGR1cG9rOwotewotICBzdHJ1Y3QgcmVzX2lkIGFbM107Ci0KLSAgYVswXS5uYW1lZCA9IDA7Ci0gIGFbMF0udS5pZCA9IHR5cGU7Ci0gIGFbMV0gPSBuYW1lOwotICBhWzJdLm5hbWVkID0gMDsKLSAgYVsyXS51LmlkID0gbGFuZ3VhZ2U7Ci0gIHJldHVybiBkZWZpbmVfcmVzb3VyY2UgKHJlc291cmNlcywgMywgYSwgZHVwb2spOwotfQotCi0vKiBDb21wYXJpc29uIHJvdXRpbmUgZm9yIHJlc291cmNlIHNvcnRpbmcuICAqLwotCi1zdGF0aWMgaW50Ci1jbXBfcmVzX2VudHJ5IChwMSwgcDIpCi0gICAgIGNvbnN0IFBUUiBwMTsKLSAgICAgY29uc3QgUFRSIHAyOwotewotICBjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICoqcmUxLCAqKnJlMjsKLQotICByZTEgPSAoY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqKikgcDE7Ci0gIHJlMiA9IChjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICoqKSBwMjsKLSAgcmV0dXJuIHJlc19pZF9jbXAgKCgqcmUxKS0+aWQsICgqcmUyKS0+aWQpOwotfQotCi0vKiBTb3J0IHRoZSByZXNvdXJjZXMuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKgotc29ydF9yZXNvdXJjZXMgKHJlc2RpcikKLSAgICAgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc2RpcjsKLXsKLSAgaW50IGMsIGk7Ci0gIHN0cnVjdCByZXNfZW50cnkgKnJlOwotICBzdHJ1Y3QgcmVzX2VudHJ5ICoqYTsKLQotICBpZiAocmVzZGlyLT5lbnRyaWVzID09IE5VTEwpCi0gICAgcmV0dXJuIHJlc2RpcjsKLQotICBjID0gMDsKLSAgZm9yIChyZSA9IHJlc2Rpci0+ZW50cmllczsgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCkKLSAgICArK2M7Ci0KLSAgLyogVGhpcyBpcyBhIHJlY3Vyc2l2ZSByb3V0aW5lLCBzbyB1c2luZyB4bWFsbG9jIGlzIHByb2JhYmx5IGJldHRlcgotICAgICB0aGFuIGFsbG9jYS4gICovCi0gIGEgPSAoc3RydWN0IHJlc19lbnRyeSAqKikgeG1hbGxvYyAoYyAqIHNpemVvZiAoc3RydWN0IHJlc19lbnRyeSAqKSk7Ci0KLSAgZm9yIChpID0gMCwgcmUgPSByZXNkaXItPmVudHJpZXM7IHJlICE9IE5VTEw7IHJlID0gcmUtPm5leHQsIGkrKykKLSAgICBhW2ldID0gcmU7Ci0KLSAgcXNvcnQgKGEsIGMsIHNpemVvZiAoc3RydWN0IHJlc19lbnRyeSAqKSwgY21wX3Jlc19lbnRyeSk7Ci0KLSAgcmVzZGlyLT5lbnRyaWVzID0gYVswXTsKLSAgZm9yIChpID0gMDsgaSA8IGMgLSAxOyBpKyspCi0gICAgYVtpXS0+bmV4dCA9IGFbaSArIDFdOwotICBhW2ldLT5uZXh0ID0gTlVMTDsKLQotICBmcmVlIChhKTsKLQotICAvKiBOb3cgc29ydCB0aGUgc3ViZGlyZWN0b3JpZXMuICAqLwotCi0gIGZvciAocmUgPSByZXNkaXItPmVudHJpZXM7IHJlICE9IE5VTEw7IHJlID0gcmUtPm5leHQpCi0gICAgaWYgKHJlLT5zdWJkaXIpCi0gICAgICByZS0+dS5kaXIgPSBzb3J0X3Jlc291cmNlcyAocmUtPnUuZGlyKTsKLQotICByZXR1cm4gcmVzZGlyOwotfQotDAotLyogUmV0dXJuIHdoZXRoZXIgdGhlIGRpYWxvZyByZXNvdXJjZSBESUFMT0cgaXMgYSBESUFMT0cgb3IgYQotICAgRElBTE9HRVguICAqLwotCi1pbnQKLWV4dGVuZGVkX2RpYWxvZyAoZGlhbG9nKQotICAgICBjb25zdCBzdHJ1Y3QgZGlhbG9nICpkaWFsb2c7Ci17Ci0gIGNvbnN0IHN0cnVjdCBkaWFsb2dfY29udHJvbCAqYzsKLQotICBpZiAoZGlhbG9nLT5leCAhPSBOVUxMKQotICAgIHJldHVybiAxOwotCi0gIGZvciAoYyA9IGRpYWxvZy0+Y29udHJvbHM7IGMgIT0gTlVMTDsgYyA9IGMtPm5leHQpCi0gICAgaWYgKGMtPmRhdGEgIT0gTlVMTCB8fCBjLT5oZWxwICE9IDApCi0gICAgICByZXR1cm4gMTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgTUVOVUlURU1TIGFyZSBhIE1FTlUgb3IgYSBNRU5VRVguICAqLwotCi1pbnQKLWV4dGVuZGVkX21lbnUgKG1lbnUpCi0gICAgIGNvbnN0IHN0cnVjdCBtZW51ICptZW51OwotewotICByZXR1cm4gZXh0ZW5kZWRfbWVudWl0ZW1zIChtZW51LT5pdGVtcyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dGVuZGVkX21lbnVpdGVtcyAobWVudWl0ZW1zKQotICAgICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKm1lbnVpdGVtczsKLXsKLSAgY29uc3Qgc3RydWN0IG1lbnVpdGVtICptaTsKLQotICBmb3IgKG1pID0gbWVudWl0ZW1zOyBtaSAhPSBOVUxMOyBtaSA9IG1pLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChtaS0+aGVscCAhPSAwIHx8IG1pLT5zdGF0ZSAhPSAwKQotCXJldHVybiAxOwotICAgICAgaWYgKG1pLT5wb3B1cCAhPSBOVUxMICYmIG1pLT5pZCAhPSAwKQotCXJldHVybiAxOwotICAgICAgaWYgKChtaS0+dHlwZQotCSAgICYgfiAoTUVOVUlURU1fQ0hFQ0tFRAotCQl8IE1FTlVJVEVNX0dSQVlFRAotCQl8IE1FTlVJVEVNX0hFTFAKLQkJfCBNRU5VSVRFTV9JTkFDVElWRQotCQl8IE1FTlVJVEVNX01FTlVCQVJCUkVBSwotCQl8IE1FTlVJVEVNX01FTlVCUkVBSykpCi0JICAhPSAwKQotCXJldHVybiAxOwotICAgICAgaWYgKG1pLT5wb3B1cCAhPSBOVUxMKQotCXsKLQkgIGlmIChleHRlbmRlZF9tZW51aXRlbXMgKG1pLT5wb3B1cCkpCi0JICAgIHJldHVybiAxOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgZm9ybWF0IHR5cGUsIG9yIGV4aXQgaWYgaXQgY2FuJ3QgYmUgZG9uZS4gICovCi0KLXN0YXRpYyBlbnVtIHJlc19mb3JtYXQKLWZvcm1hdF9mcm9tX25hbWUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IHN0cnVjdCBmb3JtYXRfbWFwICptOwotCi0gIGZvciAobSA9IGZvcm1hdF9uYW1lczsgbS0+bmFtZSAhPSBOVUxMOyBtKyspCi0gICAgaWYgKHN0cmNhc2VjbXAgKG0tPm5hbWUsIG5hbWUpID09IDApCi0gICAgICBicmVhazsKLQotICBpZiAobS0+bmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVua25vd24gZm9ybWF0IHR5cGUgYCVzJ1xuIiksIHByb2dyYW1fbmFtZSwgbmFtZSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBzdXBwb3J0ZWQgZm9ybWF0czoiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIGZvciAobSA9IGZvcm1hdF9uYW1lczsgbS0+bmFtZSAhPSBOVUxMOyBtKyspCi0JZnByaW50ZiAoc3RkZXJyLCAiICVzIiwgbS0+bmFtZSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICByZXR1cm4gbS0+Zm9ybWF0OwotfQotCi0vKiBXb3JrIG91dCBhIGZvcm1hdCB0eXBlIGdpdmVuIGEgZmlsZSBuYW1lLiAgSWYgSU5QVVQgaXMgbm9uLXplcm8sCi0gICBpdCdzIE9LIHRvIGxvb2sgYXQgdGhlIGZpbGUgaXRzZWxmLiAgKi8KLQotc3RhdGljIGVudW0gcmVzX2Zvcm1hdAotZm9ybWF0X2Zyb21fZmlsZW5hbWUgKGZpbGVuYW1lLCBpbnB1dCkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGludCBpbnB1dDsKLXsKLSAgY29uc3QgY2hhciAqZXh0OwotICBGSUxFICplOwotICB1bnNpZ25lZCBjaGFyIGIxLCBiMiwgYjMsIGI0LCBiNTsKLSAgaW50IG1hZ2ljOwotCi0gIC8qIElmIHdlIGhhdmUgYW4gZXh0ZW5zaW9uLCBzZWUgaWYgd2UgcmVjb2duaXplIGl0IGFzIGltcGx5aW5nIGEKLSAgICAgcGFydGljdWxhciBmb3JtYXQuICAqLwotICBleHQgPSBzdHJyY2hyIChmaWxlbmFtZSwgJy4nKTsKLSAgaWYgKGV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBmb3JtYXRfbWFwICptOwotCi0gICAgICArK2V4dDsKLSAgICAgIGZvciAobSA9IGZvcm1hdF9maWxlZXh0czsgbS0+bmFtZSAhPSBOVUxMOyBtKyspCi0JaWYgKHN0cmNhc2VjbXAgKG0tPm5hbWUsIGV4dCkgPT0gMCkKLQkgIHJldHVybiBtLT5mb3JtYXQ7Ci0gICAgfQotCi0gIC8qIElmIHdlIGRvbid0IHJlY29nbml6ZSB0aGUgbmFtZSBvZiBhbiBvdXRwdXQgZmlsZSwgYXNzdW1lIGl0J3MgYQotICAgICBDT0ZGIGZpbGUuICAqLwotCi0gIGlmICghIGlucHV0KQotICAgIHJldHVybiBSRVNfRk9STUFUX0NPRkY7Ci0KLSAgLyogUmVhZCB0aGUgZmlyc3QgZmV3IGJ5dGVzIG9mIHRoZSBmaWxlIHRvIHNlZSBpZiB3ZSBjYW4gZ3Vlc3Mgd2hhdAotICAgICBpdCBpcy4gICovCi0KLSAgZSA9IGZvcGVuIChmaWxlbmFtZSwgRk9QRU5fUkIpOwotICBpZiAoZSA9PSBOVUxMKQotICAgIGZhdGFsICgiJXM6ICVzIiwgZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOwotCi0gIGIxID0gZ2V0YyAoZSk7Ci0gIGIyID0gZ2V0YyAoZSk7Ci0gIGIzID0gZ2V0YyAoZSk7Ci0gIGI0ID0gZ2V0YyAoZSk7Ci0gIGI1ID0gZ2V0YyAoZSk7Ci0KLSAgZmNsb3NlIChlKTsKLQotICAvKiBBIFBFIGV4ZWN1dGFibGUgc3RhcnRzIHdpdGggMHg0ZCAweDVhLiAgKi8KLSAgaWYgKGIxID09IDB4NGQgJiYgYjIgPT0gMHg1YSkKLSAgICByZXR1cm4gUkVTX0ZPUk1BVF9DT0ZGOwotCi0gIC8qIEEgQ09GRiAubyBmaWxlIHN0YXJ0cyB3aXRoIGEgQ09GRiBtYWdpYyBudW1iZXIuICAqLwotICBtYWdpYyA9IChiMiA8PCA4KSB8IGIxOwotICBzd2l0Y2ggKG1hZ2ljKQotICAgIHsKLSAgICBjYXNlIDB4MTRjOiAvKiBpMzg2ICovCi0gICAgY2FzZSAweDE2NjogLyogTUlQUyAqLwotICAgIGNhc2UgMHgxODQ6IC8qIEFscGhhICovCi0gICAgY2FzZSAweDI2ODogLyogNjhrICovCi0gICAgY2FzZSAweDFmMDogLyogUG93ZXJQQyAqLwotICAgIGNhc2UgMHgyOTA6IC8qIFBBICovCi0gICAgICByZXR1cm4gUkVTX0ZPUk1BVF9DT0ZGOwotICAgIH0KLQotICAvKiBBIFJFUyBmaWxlIHN0YXJ0cyB3aXRoIDB4MCAweDAgMHgwIDB4MCAweDIwIDB4MCAweDAgMHgwLiAgKi8KLSAgaWYgKGIxID09IDAgJiYgYjIgPT0gMCAmJiBiMyA9PSAwICYmIGI0ID09IDAgJiYgYjUgPT0gMHgyMCkKLSAgICByZXR1cm4gUkVTX0ZPUk1BVF9SRVM7Ci0KLSAgLyogSWYgZXZlcnkgY2hhcmFjdGVyIGlzIHByaW50YWJsZSBvciBzcGFjZSwgYXNzdW1lIGl0J3MgYW4gUkMgZmlsZS4gICovCi0gIGlmICgoaXNwcmludCAoYjEpIHx8IGlzc3BhY2UgKGIxKSkKLSAgICAgICYmIChpc3ByaW50IChiMikgfHwgaXNzcGFjZSAoYjIpKQotICAgICAgJiYgKGlzcHJpbnQgKGIzKSB8fCBpc3NwYWNlIChiMykpCi0gICAgICAmJiAoaXNwcmludCAoYjQpIHx8IGlzc3BhY2UgKGI0KSkKLSAgICAgICYmIChpc3ByaW50IChiNSkgfHwgaXNzcGFjZSAoYjUpKSkKLSAgICByZXR1cm4gUkVTX0ZPUk1BVF9SQzsKLQotICAvKiBPdGhlcndpc2UsIHdlIGdpdmUgdXAuICAqLwotICBmYXRhbCAoXygiY2FuIG5vdCBkZXRlcm1pbmUgdHlwZSBvZiBmaWxlIGAlcyc7IHVzZSB0aGUgLUkgb3B0aW9uIiksCi0JIGZpbGVuYW1lKTsKLQotICAvKiBSZXR1cm4gc29tZXRoaW5nIHRvIHNpbGVuY2UgdGhlIGNvbXBpbGVyIHdhcm5pbmcuICAqLwotICByZXR1cm4gUkVTX0ZPUk1BVF9VTktOT1dOOwotfQotCi0vKiBQcmludCBhIHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuICAqLwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiVXNhZ2U6ICVzIFtvcHRpb25zXSBbaW5wdXQtZmlsZV0gW291dHB1dC1maWxlXVxuIiksCi0JICAgcHJvZ3JhbV9uYW1lKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1PcHRpb25zOlxuXAotICAtaSBGSUxFLCAtLWlucHV0IEZJTEUgICAgICAgTmFtZSBpbnB1dCBmaWxlXG5cCi0gIC1vIEZJTEUsIC0tb3V0cHV0IEZJTEUgICAgICBOYW1lIG91dHB1dCBmaWxlXG5cCi0gIC1JIEZPUk1BVCwgLS1pbnB1dC1mb3JtYXQgRk9STUFUXG5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IGlucHV0IGZvcm1hdFxuXAotICAtTyBGT1JNQVQsIC0tb3V0cHV0LWZvcm1hdCBGT1JNQVRcblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZnkgb3V0cHV0IGZvcm1hdFxuXAotICAtRiBUQVJHRVQsIC0tdGFyZ2V0IFRBUkdFVCAgU3BlY2lmeSBDT0ZGIHRhcmdldFxuXAotICAtLXByZXByb2Nlc3NvciBQUk9HUkFNICAgICAgUHJvZ3JhbSB0byB1c2UgdG8gcHJlcHJvY2VzcyByYyBmaWxlXG5cCi0gIC0taW5jbHVkZS1kaXIgRElSICAgICAgICAgICBJbmNsdWRlIGRpcmVjdG9yeSB3aGVuIHByZXByb2Nlc3NpbmcgcmMgZmlsZVxuXAotICAtRFNZTVs9VkFMXSwgLS1kZWZpbmUgU1lNWz1WQUxdXG5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgU1lNIHdoZW4gcHJlcHJvY2Vzc2luZyByYyBmaWxlXG5cCi0gIC12ICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJib3NlIC0gdGVsbHMgeW91IHdoYXQgaXQncyBkb2luZ1xuXG4KLSAgLS1sYW5ndWFnZSBWQUwgICAgICAgICAgICAgIFNldCBsYW5ndWFnZSB3aGVuIHJlYWRpbmcgcmMgZmlsZVxuIikpOwotI2lmZGVmIFlZREVCVUcKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC0teXlkZWJ1ZyAgICAgICAgICAgICAgICAgICBUdXJuIG9uIHBhcnNlciBkZWJ1Z2dpbmdcbiIpKTsKLSNlbmRpZgotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgICAgIFByaW50IHRoaXMgaGVscCBtZXNzYWdlXG5cCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgICAgICBQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotRk9STUFUIGlzIG9uZSBvZiByYywgcmVzLCBvciBjb2ZmLCBhbmQgaXMgZGVkdWNlZCBmcm9tIHRoZSBmaWxlIG5hbWVcblwKLWV4dGVuc2lvbiBpZiBub3Qgc3BlY2lmaWVkLiAgQSBzaW5nbGUgZmlsZSBuYW1lIGlzIGFuIGlucHV0IGZpbGUuXG5cCi1ObyBpbnB1dC1maWxlIGlzIHN0ZGluLCBkZWZhdWx0IHJjLiAgTm8gb3V0cHV0LWZpbGUgaXMgc3Rkb3V0LCBkZWZhdWx0IHJjLlxuIikpOwotICBsaXN0X3N1cHBvcnRlZF90YXJnZXRzIChwcm9ncmFtX25hbWUsIHN0cmVhbSk7Ci0gIGlmIChzdGF0dXMgPT0gMCkKLSAgICBmcHJpbnRmIChzdHJlYW0sIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotICBleGl0IChzdGF0dXMpOwotfQotCi0vKiBRdW90ZSBjaGFyYWN0ZXJzIHRoYXQgd2lsbCBjb25mdXNlIHRoZSBzaGVsbCB3aGVuIHdlIHJ1biB0aGUgcHJlcHJvY2Vzc29yICovCi1zdGF0aWMgY29uc3QgY2hhciAqcXVvdCAoc3RyaW5nKQotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0YXRpYyBjaGFyICpidWYgPSAwOwotICBzdGF0aWMgaW50IGJ1ZmxlbiA9IDA7Ci0gIGludCBzbGVuID0gc3RybGVuIChzdHJpbmcpOwotICBjb25zdCBjaGFyICpzcmM7Ci0gIGNoYXIgKmRlc3Q7Ci0KLSAgaWYgKChidWZsZW4gPCBzbGVuICogMiArIDIpIHx8ICFidWYpCi0gICAgewotICAgICAgYnVmbGVuID0gc2xlbiAqIDIgKyAyOwotICAgICAgaWYgKGJ1ZikKLQlmcmVlIChidWYpOwotICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoYnVmbGVuKTsKLSAgICB9Ci0KLSAgZm9yIChzcmM9c3RyaW5nLCBkZXN0PWJ1ZjsgKnNyYzsgc3JjKyssIGRlc3QrKykKLSAgICB7Ci0gICAgICBpZiAoKnNyYyA9PSAnKCcgfHwgKnNyYyA9PSAnKScgfHwgKnNyYyA9PSAnICcpCi0JKmRlc3QrKyA9ICdcXCc7Ci0gICAgICAqZGVzdCA9ICpzcmM7Ci0gICAgfQotICAqZGVzdCA9IDA7Ci0gIHJldHVybiBidWY7Ci19Ci0KLS8qIFRoZSBtYWluIGZ1bmN0aW9uLiAgKi8KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBjOwotICBjaGFyICppbnB1dF9maWxlbmFtZTsKLSAgY2hhciAqb3V0cHV0X2ZpbGVuYW1lOwotICBlbnVtIHJlc19mb3JtYXQgaW5wdXRfZm9ybWF0OwotICBlbnVtIHJlc19mb3JtYXQgb3V0cHV0X2Zvcm1hdDsKLSAgY2hhciAqdGFyZ2V0OwotICBjaGFyICpwcmVwcm9jZXNzb3I7Ci0gIGNoYXIgKnByZXByb2NhcmdzOwotICBjb25zdCBjaGFyICpxdW90ZWRhcmc7Ci0gIGludCBsYW5ndWFnZTsKLSAgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc291cmNlczsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICByZXNfaW5pdCAoKTsKLQotICBpbnB1dF9maWxlbmFtZSA9IE5VTEw7Ci0gIG91dHB1dF9maWxlbmFtZSA9IE5VTEw7Ci0gIGlucHV0X2Zvcm1hdCA9IFJFU19GT1JNQVRfVU5LTk9XTjsKLSAgb3V0cHV0X2Zvcm1hdCA9IFJFU19GT1JNQVRfVU5LTk9XTjsKLSAgdGFyZ2V0ID0gTlVMTDsKLSAgcHJlcHJvY2Vzc29yID0gTlVMTDsKLSAgcHJlcHJvY2FyZ3MgPSBOVUxMOwotICBsYW5ndWFnZSA9IC0xOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiaTpvOkk6TzpGOkQ6diIsIGxvbmdfb3B0aW9ucywKLQkJCSAgIChpbnQgKikgMCkpICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJ2knOgotCSAgaW5wdXRfZmlsZW5hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQotCWNhc2UgJ28nOgotCSAgb3V0cHV0X2ZpbGVuYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQljYXNlICdJJzoKLQkgIGlucHV0X2Zvcm1hdCA9IGZvcm1hdF9mcm9tX25hbWUgKG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ08nOgotCSAgb3V0cHV0X2Zvcm1hdCA9IGZvcm1hdF9mcm9tX25hbWUgKG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ0YnOgotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9QUkVQUk9DRVNTT1I6Ci0JICBwcmVwcm9jZXNzb3IgPSBvcHRhcmc7Ci0JICBicmVhazsKLQotCWNhc2UgJ0QnOgotCWNhc2UgT1BUSU9OX0RFRklORToKLQkgIGlmIChwcmVwcm9jYXJncyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgcXVvdGVkYXJnID0gcXVvdCAob3B0YXJnKTsKLQkgICAgICBwcmVwcm9jYXJncyA9IHhtYWxsb2MgKHN0cmxlbiAocXVvdGVkYXJnKSArIDMpOwotCSAgICAgIHNwcmludGYgKHByZXByb2NhcmdzLCAiLUQlcyIsIHF1b3RlZGFyZyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKm47Ci0KLQkgICAgICBxdW90ZWRhcmcgPSBxdW90IChvcHRhcmcpOwotCSAgICAgIG4gPSB4bWFsbG9jIChzdHJsZW4gKHByZXByb2NhcmdzKSArIHN0cmxlbiAocXVvdGVkYXJnKSArIDQpOwotCSAgICAgIHNwcmludGYgKG4sICIlcyAtRCVzIiwgcHJlcHJvY2FyZ3MsIHF1b3RlZGFyZyk7Ci0JICAgICAgZnJlZSAocHJlcHJvY2FyZ3MpOwotCSAgICAgIHByZXByb2NhcmdzID0gbjsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICd2JzoKLQkgIHZlcmJvc2UgKys7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0lOQ0xVREVfRElSOgotCSAgaWYgKHByZXByb2NhcmdzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBxdW90ZWRhcmcgPSBxdW90IChvcHRhcmcpOwotCSAgICAgIHByZXByb2NhcmdzID0geG1hbGxvYyAoc3RybGVuIChxdW90ZWRhcmcpICsgMyk7Ci0JICAgICAgc3ByaW50ZiAocHJlcHJvY2FyZ3MsICItSSVzIiwgcXVvdGVkYXJnKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqbjsKLQotCSAgICAgIHF1b3RlZGFyZyA9IHF1b3QgKG9wdGFyZyk7Ci0JICAgICAgbiA9IHhtYWxsb2MgKHN0cmxlbiAocHJlcHJvY2FyZ3MpICsgc3RybGVuIChxdW90ZWRhcmcpICsgNCk7Ci0JICAgICAgc3ByaW50ZiAobiwgIiVzIC1JJXMiLCBwcmVwcm9jYXJncywgcXVvdGVkYXJnKTsKLQkgICAgICBmcmVlIChwcmVwcm9jYXJncyk7Ci0JICAgICAgcHJlcHJvY2FyZ3MgPSBuOwotCSAgICB9Ci0KLQkgIHsKLQkgICAgc3RydWN0IGluY2x1ZGVfZGlyICpuLCAqKnBwOwotCi0JICAgIG4gPSAoc3RydWN0IGluY2x1ZGVfZGlyICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0JICAgIG4tPm5leHQgPSBOVUxMOwotCSAgICBuLT5kaXIgPSBvcHRhcmc7Ci0KLQkgICAgZm9yIChwcCA9ICZpbmNsdWRlX2RpcnM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLQkgICAgICA7Ci0JICAgICpwcCA9IG47Ci0JICB9Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fTEFOR1VBR0U6Ci0JICBsYW5ndWFnZSA9IHN0cnRvbCAob3B0YXJnLCAoY2hhciAqKikgTlVMTCwgMTYpOwotCSAgYnJlYWs7Ci0KLSNpZmRlZiBZWURFQlVHCi0JY2FzZSBPUFRJT05fWVlERUJVRzoKLQkgIHl5ZGVidWcgPSAxOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWNhc2UgT1BUSU9OX0hFTFA6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fVkVSU0lPTjoKLQkgIHByaW50X3ZlcnNpb24gKCJ3aW5kcmVzIik7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICB1c2FnZSAoc3RkZXJyLCAxKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGlucHV0X2ZpbGVuYW1lID09IE5VTEwgJiYgb3B0aW5kIDwgYXJnYykKLSAgICB7Ci0gICAgICBpbnB1dF9maWxlbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKLSAgICAgICsrb3B0aW5kOwotICAgIH0KLQotICBpZiAob3V0cHV0X2ZpbGVuYW1lID09IE5VTEwgJiYgb3B0aW5kIDwgYXJnYykKLSAgICB7Ci0gICAgICBvdXRwdXRfZmlsZW5hbWUgPSBhcmd2W29wdGluZF07Ci0gICAgICArK29wdGluZDsKLSAgICB9Ci0KLSAgaWYgKGFyZ2MgIT0gb3B0aW5kKQotICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCi0gIGlmIChpbnB1dF9mb3JtYXQgPT0gUkVTX0ZPUk1BVF9VTktOT1dOKQotICAgIHsKLSAgICAgIGlmIChpbnB1dF9maWxlbmFtZSA9PSBOVUxMKQotCWlucHV0X2Zvcm1hdCA9IFJFU19GT1JNQVRfUkM7Ci0gICAgICBlbHNlCi0JaW5wdXRfZm9ybWF0ID0gZm9ybWF0X2Zyb21fZmlsZW5hbWUgKGlucHV0X2ZpbGVuYW1lLCAxKTsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9mb3JtYXQgPT0gUkVTX0ZPUk1BVF9VTktOT1dOKQotICAgIHsKLSAgICAgIGlmIChvdXRwdXRfZmlsZW5hbWUgPT0gTlVMTCkKLQlvdXRwdXRfZm9ybWF0ID0gUkVTX0ZPUk1BVF9SQzsKLSAgICAgIGVsc2UKLQlvdXRwdXRfZm9ybWF0ID0gZm9ybWF0X2Zyb21fZmlsZW5hbWUgKG91dHB1dF9maWxlbmFtZSwgMCk7Ci0gICAgfQotCi0gIC8qIFJlYWQgdGhlIGlucHV0IGZpbGUuICAqLwotCi0gIHN3aXRjaCAoaW5wdXRfZm9ybWF0KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBSRVNfRk9STUFUX1JDOgotICAgICAgcmVzb3VyY2VzID0gcmVhZF9yY19maWxlIChpbnB1dF9maWxlbmFtZSwgcHJlcHJvY2Vzc29yLCBwcmVwcm9jYXJncywKLQkJCQlsYW5ndWFnZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJFU19GT1JNQVRfUkVTOgotICAgICAgcmVzb3VyY2VzID0gcmVhZF9yZXNfZmlsZSAoaW5wdXRfZmlsZW5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSRVNfRk9STUFUX0NPRkY6Ci0gICAgICByZXNvdXJjZXMgPSByZWFkX2NvZmZfcnNyYyAoaW5wdXRfZmlsZW5hbWUsIHRhcmdldCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKHJlc291cmNlcyA9PSBOVUxMKQotICAgIGZhdGFsIChfKCJubyByZXNvdXJjZXMiKSk7Ci0KLSAgLyogU29ydCB0aGUgcmVzb3VyY2VzLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgQ09GRiwgY29udmVuaWVudCBmb3IKLSAgICAgcmMsIGFuZCB1bmltcG9ydGFudCBmb3IgcmVzLiAgKi8KLQotICByZXNvdXJjZXMgPSBzb3J0X3Jlc291cmNlcyAocmVzb3VyY2VzKTsKLQotICAvKiBXcml0ZSB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi0gIHJlc3dyX2luaXQgKCk7Ci0KLSAgc3dpdGNoIChvdXRwdXRfZm9ybWF0KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBSRVNfRk9STUFUX1JDOgotICAgICAgd3JpdGVfcmNfZmlsZSAob3V0cHV0X2ZpbGVuYW1lLCByZXNvdXJjZXMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSRVNfRk9STUFUX1JFUzoKLSAgICAgIHdyaXRlX3Jlc19maWxlIChvdXRwdXRfZmlsZW5hbWUsIHJlc291cmNlcyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJFU19GT1JNQVRfQ09GRjoKLSAgICAgIHdyaXRlX2NvZmZfZmlsZSAob3V0cHV0X2ZpbGVuYW1lLCB0YXJnZXQsIHJlc291cmNlcyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgeGV4aXQgKDApOwotICByZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvd2luZHJlcy5oIGIvYmludXRpbHMvd2luZHJlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjQzZGQ1Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3dpbmRyZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0OSArMCwwIEBACi0vKiB3aW5kcmVzLmggLS0gaGVhZGVyIGZpbGUgZm9yIHdpbmRyZXMgcHJvZ3JhbS4KLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLS8qIFRoaXMgaXMgdGhlIGhlYWRlciBmaWxlIGZvciB0aGUgd2luZHJlcyBwcm9ncmFtLiAgSXQgZGVmaW5lcwotICAgc3RydWN0dXJlcyBhbmQgZGVjbGFyZXMgZnVuY3Rpb25zIHVzZWQgd2l0aGluIHRoZSBwcm9ncmFtLiAgKi8KLQotI2luY2x1ZGUgIndpbmR1bmkuaCIKLQotLyogV2UgcmVwcmVzZW50IHJlc291cmNlcyBpbnRlcm5hbGx5IGFzIGEgdHJlZSwgc2ltaWxhciB0byB0aGUgdHJlZQotICAgdXNlZCBpbiB0aGUgLnJzcmMgc2VjdGlvbiBvZiBhIENPRkYgZmlsZS4gIFRoZSByb290IGlzIGEKLSAgIHJlc19kaXJlY3Rvcnkgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IHJlc19kaXJlY3RvcnkKLXsKLSAgLyogUmVzb3VyY2UgZmxhZ3MuICBBY2NvcmRpbmcgdG8gdGhlIE1TIGRvY3MsIHRoaXMgaXMgY3VycmVudGx5Ci0gICAgIGFsd2F5cyB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBjaGFyYWN0ZXJpc3RpY3M7Ci0gIC8qIFRpbWUvZGF0ZSBzdGFtcC4gICovCi0gIHVuc2lnbmVkIGxvbmcgdGltZTsKLSAgLyogTWFqb3IgdmVyc2lvbiBudW1iZXIuICAqLwotICB1bnNpZ25lZCBzaG9ydCBtYWpvcjsKLSAgLyogTWlub3IgdmVyc2lvbiBudW1iZXIuICAqLwotICB1bnNpZ25lZCBzaG9ydCBtaW5vcjsKLSAgLyogRGlyZWN0b3J5IGVudHJpZXMuICAqLwotICBzdHJ1Y3QgcmVzX2VudHJ5ICplbnRyaWVzOwotfTsKLQotLyogQSByZXNvdXJjZSBJRCBpcyBzdG9yZWQgaW4gYSByZXNfaWQgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IHJlc19pZAotewotICAvKiBOb24temVybyBpZiB0aGlzIGVudHJ5IGhhcyBhIG5hbWUgcmF0aGVyIHRoYW4gYW4gSUQuICAqLwotICB1bnNpZ25lZCBpbnQgbmFtZWQgOiAxOwotICB1bmlvbgotICB7Ci0gICAgLyogSWYgdGhlIG5hbWVkIGZpZWxkIGlzIG5vbi16ZXJvLCB0aGlzIGlzIHRoZSBuYW1lLiAgKi8KLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICAvKiBMZW5ndGggb2YgdGhlIG5hbWUuICAqLwotICAgICAgaW50IGxlbmd0aDsKLSAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG5hbWUsIHdoaWNoIGlzIGEgVW5pY29kZSBzdHJpbmcuICAqLwotICAgICAgdW5pY2hhciAqbmFtZTsKLSAgICB9IG47Ci0gICAgLyogSWYgdGhlIG5hbWVkIGZpZWxkIGlzIHplcm8sIHRoaXMgaXMgdGhlIElELiAgKi8KLSAgICB1bnNpZ25lZCBsb25nIGlkOwotICB9IHU7Ci19OwotCi0vKiBFYWNoIGVudHJ5IGluIHRoZSB0cmVlIGlzIGEgcmVzX2VudHJ5IHN0cnVjdHVyZS4gIFdlIG1peAotICAgZGlyZWN0b3JpZXMgYW5kIHJlc291cmNlcyBiZWNhdXNlIGluIGEgQ09GRiBmaWxlIGFsbCBlbnRyaWVzIGluIGEKLSAgIGRpcmVjdG9yeSBhcmUgc29ydGVkIHRvZ2V0aGVyLCB3aGV0aGVyIHRoZSBlbnRyaWVzIGFyZQotICAgc3ViZGlyZWN0b3JpZXMgb3IgcmVzb3VyY2VzLiAgKi8KLQotc3RydWN0IHJlc19lbnRyeQotewotICAvKiBOZXh0IGVudHJ5LiAgKi8KLSAgc3RydWN0IHJlc19lbnRyeSAqbmV4dDsKLSAgLyogUmVzb3VyY2UgSUQuICAqLwotICBzdHJ1Y3QgcmVzX2lkIGlkOwotICAvKiBOb24temVybyBpZiB0aGlzIGVudHJ5IGlzIGEgc3ViZGlyZWN0b3J5IHJhdGhlciB0aGFuIGEgbGVhZi4gICovCi0gIHVuc2lnbmVkIGludCBzdWJkaXIgOiAxOwotICB1bmlvbgotICB7Ci0gICAgLyogSWYgdGhlIHN1YmRpciBmaWVsZCBpcyBub24temVybywgdGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlCi0gICAgICAgc3ViZGlyZWN0b3J5LiAgKi8KLSAgICBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqZGlyOwotICAgIC8qIElmIHRoZSBzdWJkaXIgZmllbGQgaXMgemVybywgdGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlIHJlc291cmNlCi0gICAgICAgZGF0YS4gICovCi0gICAgc3RydWN0IHJlc19yZXNvdXJjZSAqcmVzOwotICB9IHU7Ci19OwotCi0vKiBUeXBlcyBvZiByZXNvdXJjZXMuICAqLwotCi1lbnVtIHJlc190eXBlCi17Ci0gIFJFU19UWVBFX1VOSU5JVElBTElaRUQsCi0gIFJFU19UWVBFX0FDQ0VMRVJBVE9SLAotICBSRVNfVFlQRV9CSVRNQVAsCi0gIFJFU19UWVBFX0NVUlNPUiwKLSAgUkVTX1RZUEVfR1JPVVBfQ1VSU09SLAotICBSRVNfVFlQRV9ESUFMT0csCi0gIFJFU19UWVBFX0ZPTlQsCi0gIFJFU19UWVBFX0ZPTlRESVIsCi0gIFJFU19UWVBFX0lDT04sCi0gIFJFU19UWVBFX0dST1VQX0lDT04sCi0gIFJFU19UWVBFX01FTlUsCi0gIFJFU19UWVBFX01FU1NBR0VUQUJMRSwKLSAgUkVTX1RZUEVfUkNEQVRBLAotICBSRVNfVFlQRV9TVFJJTkdUQUJMRSwKLSAgUkVTX1RZUEVfVVNFUkRBVEEsCi0gIFJFU19UWVBFX1ZFUlNJT05JTkZPCi19OwotCi0vKiBBIHJlcyBmaWxlIGFuZCBhIENPRkYgZmlsZSBzdG9yZSBpbmZvcm1hdGlvbiBkaWZmZXJlbnRseS4gIFRoZQotICAgcmVzX2luZm8gc3RydWN0dXJlcyBob2xkcyBkYXRhIHdoaWNoIGluIGEgcmVzIGZpbGUgaXMgc3RvcmVkIHdpdGgKLSAgIGVhY2ggcmVzb3VyY2UsIGJ1dCBpbiBhIENPRkYgZmlsZSBpcyBzdG9yZWQgZWxzZXdoZXJlLiAgKi8KLQotc3RydWN0IHJlc19yZXNfaW5mbwotewotICAvKiBMYW5ndWFnZS4gIEluIGEgQ09GRiBmaWxlLCB0aGUgdGhpcmQgbGV2ZWwgb2YgdGhlIGRpcmVjdG9yeSBpcwotICAgICBrZXllZCBieSB0aGUgbGFuZ3VhZ2UsIHNvIHRoZSBsYW5ndWFnZSBvZiBhIHJlc291cmNlIGlzIGRlZmluZWQKLSAgICAgYnkgaXRzIGxvY2F0aW9uIGluIHRoZSByZXNvdXJjZSB0cmVlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgbGFuZ3VhZ2U7Ci0gIC8qIENoYXJhY3RlcmlzdGljcyBvZiB0aGUgcmVzb3VyY2UuICBFbnRpcmVseSB1c2VyIGRlZmluZWQuICBJbiBhCi0gICAgIENPRkYgZmlsZSwgdGhlIHJlc19kaXJlY3Rvcnkgc3RydWN0dXJlIGhhcyBhIGNoYXJhY3RlcmlzdGljcwotICAgICBmaWVsZCwgYnV0IEkgZG9uJ3Qga25vdyBpZiBpdCdzIHJlbGF0ZWQgdG8gdGhlIG9uZSBpbiB0aGUgcmVzCi0gICAgIGZpbGUuICAqLwotICB1bnNpZ25lZCBsb25nIGNoYXJhY3RlcmlzdGljczsKLSAgLyogVmVyc2lvbiBvZiB0aGUgcmVzb3VyY2UuICBFbnRpcmVseSB1c2VyIGRlZmluZWQuICBJbiBhIENPRkYgZmlsZSwKLSAgICAgdGhlIHJlc19kaXJlY3Rvcnkgc3RydWN0dXJlIGhhcyBhIGNoYXJhY3RlcmlzdGljcyBmaWVsZCwgYnV0IEkKLSAgICAgZG9uJ3Qga25vdyBpZiBpdCdzIHJlbGF0ZWQgdG8gdGhlIG9uZSBpbiB0aGUgcmVzIGZpbGUuICAqLwotICB1bnNpZ25lZCBsb25nIHZlcnNpb247Ci0gIC8qIE1lbW9yeSBmbGFncy4gIFRoaXMgaXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgTUVNRkxBRyB2YWx1ZXMKLSAgICAgZGVmaW5lZCBiZWxvdy4gIE1vc3Qgb2YgdGhlc2UgdmFsdWVzIGFyZSBoaXN0b3JpY2FsLCBhbmQgYXJlIG5vdAotICAgICBtZWFuaW5nZnVsIGZvciB3aW4zMi4gIEkgZG9uJ3QgdGhpbmsgdGhlcmUgaXMgYW55IHdheSB0byBzdG9yZQotICAgICB0aGlzIGluZm9ybWF0aW9uIGluIGEgQ09GRiBmaWxlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgbWVtZmxhZ3M7Ci19OwotCi0vKiBFYWNoIHJlc291cmNlIGluIGEgQ09GRiBmaWxlIGhhcyBzb21lIGluZm9ybWF0aW9uIHdoaWNoIGNhbiBkb2VzCi0gICBub3QgYXBwZWFyIGluIGEgcmVzIGZpbGUuICAqLwotCi1zdHJ1Y3QgcmVzX2NvZmZfaW5mbwotewotICAvKiBUaGUgY29kZSBwYWdlIHVzZWQgZm9yIHRoZSBkYXRhLiAgSSBkb24ndCByZWFsbHkga25vdyB3aGF0IHRoaXMKLSAgICAgc2hvdWxkIGJlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBjb2RlcGFnZTsKLSAgLyogQSByZXNvdXJjZSBlbnRyeSBpbiBhIENPRkYgZmlsZSBoYXMgYSByZXNlcnZlZCBmaWVsZCwgd2hpY2ggd2UKLSAgICAgcmVjb3JkIGhlcmUgd2hlbiByZWFkaW5nIGEgQ09GRiBmaWxlLiAgV2hlbiB3cml0aW5nIGEgQ09GRiBmaWxlLAotICAgICB3ZSBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByZXNlcnZlZDsKLX07Ci0KLS8qIFJlc291cmNlIGRhdGEgaXMgc3RvcmVkIGluIGEgcmVzX3Jlc291cmNlIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCByZXNfcmVzb3VyY2UKLXsKLSAgLyogVGhlIHR5cGUgb2YgcmVzb3VyY2UuICAqLwotICBlbnVtIHJlc190eXBlIHR5cGU7Ci0gIC8qIFRoZSBkYXRhIGZvciB0aGUgcmVzb3VyY2UuICAqLwotICB1bmlvbgotICB7Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgIH0gZGF0YTsKLSAgICBzdHJ1Y3QgYWNjZWxlcmF0b3IgKmFjYzsKLSAgICBzdHJ1Y3QgY3Vyc29yICpjdXJzb3I7Ci0gICAgc3RydWN0IGdyb3VwX2N1cnNvciAqZ3JvdXBfY3Vyc29yOwotICAgIHN0cnVjdCBkaWFsb2cgKmRpYWxvZzsKLSAgICBzdHJ1Y3QgZm9udGRpciAqZm9udGRpcjsKLSAgICBzdHJ1Y3QgZ3JvdXBfaWNvbiAqZ3JvdXBfaWNvbjsKLSAgICBzdHJ1Y3QgbWVudSAqbWVudTsKLSAgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnJjZGF0YTsKLSAgICBzdHJ1Y3Qgc3RyaW5ndGFibGUgKnN0cmluZ3RhYmxlOwotICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqdXNlcmRhdGE7Ci0gICAgc3RydWN0IHZlcnNpb25pbmZvICp2ZXJzaW9uaW5mbzsKLSAgfSB1OwotICAvKiBJbmZvcm1hdGlvbiBmcm9tIGEgcmVzIGZpbGUuICAqLwotICBzdHJ1Y3QgcmVzX3Jlc19pbmZvIHJlc19pbmZvOwotICAvKiBJbmZvcm1hdGlvbiBmcm9tIGEgQ09GRiBmaWxlLiAgKi8KLSAgc3RydWN0IHJlc19jb2ZmX2luZm8gY29mZl9pbmZvOwotfTsKLQotLyogTWVtb3J5IGZsYWdzIGluIHRoZSBtZW1mbGFncyBmaWVsZCBvZiBhIHN0cnVjdCByZXNfcmVzb3VyY2UuICAqLwotCi0jZGVmaW5lIE1FTUZMQUdfTU9WRUFCTEUJMHgxMAotI2RlZmluZSBNRU1GTEFHX1BVUkUJCTB4MjAKLSNkZWZpbmUgTUVNRkxBR19QUkVMT0FECQkweDQwCi0jZGVmaW5lIE1FTUZMQUdfRElTQ0FSREFCTEUJMHgxMDAwCi0KLS8qIFN0YW5kYXJkIHJlc291cmNlIHR5cGUgY29kZXMuICBUaGVzZSBhcmUgdXNlZCBpbiB0aGUgSUQgZmllbGQgb2YgYQotICAgcmVzX2VudHJ5IHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgUlRfQ1VSU09SCQkgMQotI2RlZmluZSBSVF9CSVRNQVAJCSAyCi0jZGVmaW5lIFJUX0lDT04JCQkgMwotI2RlZmluZSBSVF9NRU5VCQkJIDQKLSNkZWZpbmUgUlRfRElBTE9HCQkgNQotI2RlZmluZSBSVF9TVFJJTkcJCSA2Ci0jZGVmaW5lIFJUX0ZPTlRESVIJCSA3Ci0jZGVmaW5lIFJUX0ZPTlQJCQkgOAotI2RlZmluZSBSVF9BQ0NFTEVSQVRPUgkJIDkKLSNkZWZpbmUgUlRfUkNEQVRBCQkxMAotI2RlZmluZSBSVF9NRVNTQUdFVEFCTEUJCTExCi0jZGVmaW5lIFJUX0dST1VQX0NVUlNPUgkJMTIKLSNkZWZpbmUgUlRfR1JPVVBfSUNPTgkJMTQKLSNkZWZpbmUgUlRfVkVSU0lPTgkJMTYKLSNkZWZpbmUgUlRfRExHSU5DTFVERQkJMTcKLSNkZWZpbmUgUlRfUExVR1BMQVkJCTE5Ci0jZGVmaW5lIFJUX1ZYRAkJCTIwCi0jZGVmaW5lIFJUX0FOSUNVUlNPUgkJMjEKLSNkZWZpbmUgUlRfQU5JSUNPTgkJMjIKLQotLyogQW4gYWNjZWxlcmF0b3IgcmVzb3VyY2UgaXMgYSBsaW5rZWQgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RydWN0IGFjY2VsZXJhdG9yCi17Ci0gIC8qIE5leHQgYWNjZWxlcmF0b3IuICAqLwotICBzdHJ1Y3QgYWNjZWxlcmF0b3IgKm5leHQ7Ci0gIC8qIEZsYWdzLiAgQSBjb21iaW5hdGlvbiBvZiB0aGUgQUNDIHZhbHVlcyBkZWZpbmVkIGJlbG93LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZmxhZ3M7Ci0gIC8qIEtleSB2YWx1ZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IGtleTsKLSAgLyogUmVzb3VyY2UgSUQuICAqLwotICB1bnNpZ25lZCBzaG9ydCBpZDsKLX07Ci0KLS8qIEFjY2VsZXJhdG9yIGZsYWdzIGluIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBhY2NlbGVyYXRvci4KLSAgIFRoZXNlIGFyZSB0aGUgc2FtZSB2YWx1ZXMgdGhhdCBhcHBlYXIgaW4gYSByZXMgZmlsZS4gIEkgaG9wZS4gICovCi0KLSNkZWZpbmUgQUNDX1ZJUlRLRVkJMHgwMQotI2RlZmluZSBBQ0NfTk9JTlZFUlQJMHgwMgotI2RlZmluZSBBQ0NfU0hJRlQJMHgwNAotI2RlZmluZSBBQ0NfQ09OVFJPTAkweDA4Ci0jZGVmaW5lIEFDQ19BTFQJCTB4MTAKLSNkZWZpbmUgQUNDX0xBU1QJMHg4MAotCi0vKiBBIGN1cnNvciByZXNvdXJjZS4gICovCi0KLXN0cnVjdCBjdXJzb3IKLXsKLSAgLyogWCBjb29yZGluYXRlIG9mIGhvdHNwb3QuICAqLwotICBzaG9ydCB4aG90c3BvdDsKLSAgLyogWSBjb29yZGluYXRlIG9mIGhvdHNwb3QuICAqLwotICBzaG9ydCB5aG90c3BvdDsKLSAgLyogTGVuZ3RoIG9mIGJpdG1hcCBkYXRhLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIC8qIERhdGEuICAqLwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotfTsKLQotLyogQSBncm91cF9jdXJzb3IgcmVzb3VyY2UgaXMgYSBsaXN0IG9mIGdyb3VwX2N1cnNvciBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RydWN0IGdyb3VwX2N1cnNvcgotewotICAvKiBOZXh0IGN1cnNvciBpbiBncm91cC4gICovCi0gIHN0cnVjdCBncm91cF9jdXJzb3IgKm5leHQ7Ci0gIC8qIFdpZHRoLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgd2lkdGg7Ci0gIC8qIEhlaWdodC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGhlaWdodDsKLSAgLyogUGxhbmVzLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgcGxhbmVzOwotICAvKiBCaXRzIHBlciBwaXhlbC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGJpdHM7Ci0gIC8qIE51bWJlciBvZiBieXRlcyBpbiBjdXJzb3IgcmVzb3VyY2UuICAqLwotICB1bnNpZ25lZCBsb25nIGJ5dGVzOwotICAvKiBJbmRleCBvZiBjdXJzb3IgcmVzb3VyY2UuICAqLwotICB1bnNpZ25lZCBzaG9ydCBpbmRleDsKLX07Ci0KLS8qIEEgZGlhbG9nIHJlc291cmNlLiAgKi8KLQotc3RydWN0IGRpYWxvZwotewotICAvKiBCYXNpYyB3aW5kb3cgc3R5bGUuICAqLwotICB1bnNpZ25lZCBsb25nIHN0eWxlOwotICAvKiBFeHRlbmRlZCB3aW5kb3cgc3R5bGUuICAqLwotICB1bnNpZ25lZCBsb25nIGV4c3R5bGU7Ci0gIC8qIFggY29vcmRpbmF0ZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHg7Ci0gIC8qIFkgY29vcmRpbmF0ZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHk7Ci0gIC8qIFdpZHRoLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgd2lkdGg7Ci0gIC8qIEhlaWdodC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGhlaWdodDsKLSAgLyogTWVudSBuYW1lLiAgKi8KLSAgc3RydWN0IHJlc19pZCBtZW51OwotICAvKiBDbGFzcyBuYW1lLiAgKi8KLSAgc3RydWN0IHJlc19pZCBjbGFzczsKLSAgLyogQ2FwdGlvbi4gICovCi0gIHVuaWNoYXIgKmNhcHRpb247Ci0gIC8qIEZvbnQgcG9pbnQgc2l6ZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHBvaW50c2l6ZTsKLSAgLyogRm9udCBuYW1lLiAgKi8KLSAgdW5pY2hhciAqZm9udDsKLSAgLyogRXh0ZW5kZWQgaW5mb3JtYXRpb24gZm9yIGEgZGlhbG9nZXguICAqLwotICBzdHJ1Y3QgZGlhbG9nX2V4ICpleDsKLSAgLyogQ29udHJvbHMuICAqLwotICBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKmNvbnRyb2xzOwotfTsKLQotLyogQW4gZXh0ZW5kZWQgZGlhbG9nIGhhcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IGRpYWxvZ19leAotewotICAvKiBIZWxwIElELiAgKi8KLSAgdW5zaWduZWQgbG9uZyBoZWxwOwotICAvKiBGb250IHdlaWdodC4gICovCi0gIHVuc2lnbmVkIHNob3J0IHdlaWdodDsKLSAgLyogV2hldGhlciB0aGUgZm9udCBpcyBpdGFsaWMuICAqLwotICB1bnNpZ25lZCBzaG9ydCBpdGFsaWM7Ci19OwotCi0vKiBXaW5kb3cgc3R5bGUgZmxhZ3MsIGZyb20gdGhlIHdpbnN1cCBEZWZpbmVzLmggaGVhZGVyIGZpbGUuICBUaGVzZQotICAgY2FuIGFwcGVhciBpbiB0aGUgc3R5bGUgZmllbGQgb2YgYSBzdHJ1Y3QgZGlhbG9nIG9yIGEgc3RydWN0Ci0gICBkaWFsb2dfY29udHJvbC4gICovCi0KLSNkZWZpbmUgQ1dfVVNFREVGQVVMVAkoMHg4MDAwMDAwMCkKLSNkZWZpbmUgV1NfQk9SREVSCSgweDgwMDAwMEwpCi0jZGVmaW5lIFdTX0NBUFRJT04JKDB4YzAwMDAwTCkKLSNkZWZpbmUgV1NfQ0hJTEQJKDB4NDAwMDAwMDBMKQotI2RlZmluZSBXU19DSElMRFdJTkRPVwkoMHg0MDAwMDAwMEwpCi0jZGVmaW5lIFdTX0NMSVBDSElMRFJFTgkoMHgyMDAwMDAwTCkKLSNkZWZpbmUgV1NfQ0xJUFNJQkxJTkdTCSgweDQwMDAwMDBMKQotI2RlZmluZSBXU19ESVNBQkxFRAkoMHg4MDAwMDAwTCkKLSNkZWZpbmUgV1NfRExHRlJBTUUJKDB4NDAwMDAwTCkKLSNkZWZpbmUgV1NfR1JPVVAJKDB4MjAwMDBMKQotI2RlZmluZSBXU19IU0NST0xMCSgweDEwMDAwMEwpCi0jZGVmaW5lIFdTX0lDT05JQwkoMHgyMDAwMDAwMEwpCi0jZGVmaW5lIFdTX01BWElNSVpFCSgweDEwMDAwMDBMKQotI2RlZmluZSBXU19NQVhJTUlaRUJPWAkoMHgxMDAwMEwpCi0jZGVmaW5lIFdTX01JTklNSVpFCSgweDIwMDAwMDAwTCkKLSNkZWZpbmUgV1NfTUlOSU1JWkVCT1gJKDB4MjAwMDBMKQotI2RlZmluZSBXU19PVkVSTEFQUEVECSgwTCkKLSNkZWZpbmUgV1NfT1ZFUkxBUFBFRFdJTkRPVwkoMHhjZjAwMDBMKQotI2RlZmluZSBXU19QT1BVUAkoMHg4MDAwMDAwMEwpCi0jZGVmaW5lIFdTX1BPUFVQV0lORE9XCSgweDgwODgwMDAwTCkKLSNkZWZpbmUgV1NfU0laRUJPWAkoMHg0MDAwMEwpCi0jZGVmaW5lIFdTX1NZU01FTlUJKDB4ODAwMDBMKQotI2RlZmluZSBXU19UQUJTVE9QCSgweDEwMDAwTCkKLSNkZWZpbmUgV1NfVEhJQ0tGUkFNRQkoMHg0MDAwMEwpCi0jZGVmaW5lIFdTX1RJTEVECSgwTCkKLSNkZWZpbmUgV1NfVElMRURXSU5ET1cJKDB4Y2YwMDAwTCkKLSNkZWZpbmUgV1NfVklTSUJMRQkoMHgxMDAwMDAwMEwpCi0jZGVmaW5lIFdTX1ZTQ1JPTEwJKDB4MjAwMDAwTCkKLSNkZWZpbmUgTURJU19BTExDSElMRFNUWUxFUwkoMHgxKQotI2RlZmluZSBCU18zU1RBVEUJKDB4NUwpCi0jZGVmaW5lIEJTX0FVVE8zU1RBVEUJKDB4NkwpCi0jZGVmaW5lIEJTX0FVVE9DSEVDS0JPWAkoMHgzTCkKLSNkZWZpbmUgQlNfQVVUT1JBRElPQlVUVE9OCSgweDlMKQotI2RlZmluZSBCU19CSVRNQVAJKDB4ODBMKQotI2RlZmluZSBCU19CT1RUT00JKDB4ODAwTCkKLSNkZWZpbmUgQlNfQ0VOVEVSCSgweDMwMEwpCi0jZGVmaW5lIEJTX0NIRUNLQk9YCSgweDJMKQotI2RlZmluZSBCU19ERUZQVVNIQlVUVE9OCSgweDFMKQotI2RlZmluZSBCU19HUk9VUEJPWAkoMHg3TCkKLSNkZWZpbmUgQlNfSUNPTgkoMHg0MEwpCi0jZGVmaW5lIEJTX0xFRlQJKDB4MTAwTCkKLSNkZWZpbmUgQlNfTEVGVFRFWFQJKDB4MjBMKQotI2RlZmluZSBCU19NVUxUSUxJTkUJKDB4MjAwMEwpCi0jZGVmaW5lIEJTX05PVElGWQkoMHg0MDAwTCkKLSNkZWZpbmUgQlNfT1dORVJEUkFXCSgweGJMKQotI2RlZmluZSBCU19QVVNIQk9YCSgweGNMKQkJLyogRklYTUUhICBXaGF0IHNob3VsZCB0aGlzIGJlPyAgKi8KLSNkZWZpbmUgQlNfUFVTSEJVVFRPTgkoMEwpCi0jZGVmaW5lIEJTX1BVU0hMSUtFCSgweDEwMDBMKQotI2RlZmluZSBCU19SQURJT0JVVFRPTgkoMHg0TCkKLSNkZWZpbmUgQlNfUklHSFQJKDB4MjAwTCkKLSNkZWZpbmUgQlNfUklHSFRCVVRUT04JKDB4MjBMKQotI2RlZmluZSBCU19URVhUCSgwTCkKLSNkZWZpbmUgQlNfVE9QCSgweDQwMEwpCi0jZGVmaW5lIEJTX1VTRVJCVVRUT04JKDB4OEwpCi0jZGVmaW5lIEJTX1ZDRU5URVIJKDB4YzAwTCkKLSNkZWZpbmUgQ0JTX0FVVE9IU0NST0xMCSgweDQwTCkKLSNkZWZpbmUgQ0JTX0RJU0FCTEVOT1NDUk9MTAkoMHg4MDBMKQotI2RlZmluZSBDQlNfRFJPUERPV04JKDB4MkwpCi0jZGVmaW5lIENCU19EUk9QRE9XTkxJU1QJKDB4M0wpCi0jZGVmaW5lIENCU19IQVNTVFJJTkdTCSgweDIwMEwpCi0jZGVmaW5lIENCU19MT1dFUkNBU0UJKDB4NDAwMEwpCi0jZGVmaW5lIENCU19OT0lOVEVHUkFMSEVJR0hUCSgweDQwMEwpCi0jZGVmaW5lIENCU19PRU1DT05WRVJUCSgweDgwTCkKLSNkZWZpbmUgQ0JTX09XTkVSRFJBV0ZJWEVECSgweDEwTCkKLSNkZWZpbmUgQ0JTX09XTkVSRFJBV1ZBUklBQkxFCSgweDIwTCkKLSNkZWZpbmUgQ0JTX1NJTVBMRQkoMHgxTCkKLSNkZWZpbmUgQ0JTX1NPUlQJKDB4MTAwTCkKLSNkZWZpbmUgQ0JTX1VQUEVSQ0FTRQkoMHgyMDAwTCkKLSNkZWZpbmUgRVNfQVVUT0hTQ1JPTEwJKDB4ODBMKQotI2RlZmluZSBFU19BVVRPVlNDUk9MTAkoMHg0MEwpCi0jZGVmaW5lIEVTX0NFTlRFUgkoMHgxTCkKLSNkZWZpbmUgRVNfTEVGVAkoMEwpCi0jZGVmaW5lIEVTX0xPV0VSQ0FTRQkoMHgxMEwpCi0jZGVmaW5lIEVTX01VTFRJTElORQkoMHg0TCkKLSNkZWZpbmUgRVNfTk9ISURFU0VMCSgweDEwMEwpCi0jZGVmaW5lIEVTX05VTUJFUgkoMHgyMDAwTCkKLSNkZWZpbmUgRVNfT0VNQ09OVkVSVAkoMHg0MDBMKQotI2RlZmluZSBFU19QQVNTV09SRAkoMHgyMEwpCi0jZGVmaW5lIEVTX1JFQURPTkxZCSgweDgwMEwpCi0jZGVmaW5lIEVTX1JJR0hUCSgweDJMKQotI2RlZmluZSBFU19VUFBFUkNBU0UJKDB4OEwpCi0jZGVmaW5lIEVTX1dBTlRSRVRVUk4JKDB4MTAwMEwpCi0jZGVmaW5lIExCU19ESVNBQkxFTk9TQ1JPTEwJKDB4MTAwMEwpCi0jZGVmaW5lIExCU19FWFRFTkRFRFNFTAkoMHg4MDBMKQotI2RlZmluZSBMQlNfSEFTU1RSSU5HUwkoMHg0MEwpCi0jZGVmaW5lIExCU19NVUxUSUNPTFVNTgkoMHgyMDBMKQotI2RlZmluZSBMQlNfTVVMVElQTEVTRUwJKDB4OEwpCi0jZGVmaW5lIExCU19OT0RBVEEJKDB4MjAwMEwpCi0jZGVmaW5lIExCU19OT0lOVEVHUkFMSEVJR0hUCSgweDEwMEwpCi0jZGVmaW5lIExCU19OT1JFRFJBVwkoMHg0TCkKLSNkZWZpbmUgTEJTX05PU0VMCSgweDQwMDBMKQotI2RlZmluZSBMQlNfTk9USUZZCSgweDFMKQotI2RlZmluZSBMQlNfT1dORVJEUkFXRklYRUQJKDB4MTBMKQotI2RlZmluZSBMQlNfT1dORVJEUkFXVkFSSUFCTEUJKDB4MjBMKQotI2RlZmluZSBMQlNfU09SVAkoMHgyTCkKLSNkZWZpbmUgTEJTX1NUQU5EQVJECSgweGEwMDAwM0wpCi0jZGVmaW5lIExCU19VU0VUQUJTVE9QUwkoMHg4MEwpCi0jZGVmaW5lIExCU19XQU5US0VZQk9BUkRJTlBVVAkoMHg0MDBMKQotI2RlZmluZSBTQlNfQk9UVE9NQUxJR04JKDB4NEwpCi0jZGVmaW5lIFNCU19IT1JaCSgwTCkKLSNkZWZpbmUgU0JTX0xFRlRBTElHTgkoMHgyTCkKLSNkZWZpbmUgU0JTX1JJR0hUQUxJR04JKDB4NEwpCi0jZGVmaW5lIFNCU19TSVpFQk9YCSgweDhMKQotI2RlZmluZSBTQlNfU0laRUJPWEJPVFRPTVJJR0hUQUxJR04JKDB4NEwpCi0jZGVmaW5lIFNCU19TSVpFQk9YVE9QTEVGVEFMSUdOCSgweDJMKQotI2RlZmluZSBTQlNfU0laRUdSSVAJKDB4MTBMKQotI2RlZmluZSBTQlNfVE9QQUxJR04JKDB4MkwpCi0jZGVmaW5lIFNCU19WRVJUCSgweDFMKQotI2RlZmluZSBTU19CSVRNQVAJKDB4ZUwpCi0jZGVmaW5lIFNTX0JMQUNLRlJBTUUJKDB4N0wpCi0jZGVmaW5lIFNTX0JMQUNLUkVDVAkoMHg0TCkKLSNkZWZpbmUgU1NfQ0VOVEVSCSgweDFMKQotI2RlZmluZSBTU19DRU5URVJJTUFHRQkoMHgyMDBMKQotI2RlZmluZSBTU19FTkhNRVRBRklMRQkoMHhmTCkKLSNkZWZpbmUgU1NfRVRDSEVERlJBTUUJKDB4MTJMKQotI2RlZmluZSBTU19FVENIRURIT1JaCSgweDEwTCkKLSNkZWZpbmUgU1NfRVRDSEVEVkVSVAkoMHgxMUwpCi0jZGVmaW5lIFNTX0dSQVlGUkFNRQkoMHg4TCkKLSNkZWZpbmUgU1NfR1JBWVJFQ1QJKDB4NUwpCi0jZGVmaW5lIFNTX0lDT04JKDB4M0wpCi0jZGVmaW5lIFNTX0xFRlQJKDBMKQotI2RlZmluZSBTU19MRUZUTk9XT1JEV1JBUAkoMHhjTCkKLSNkZWZpbmUgU1NfTk9QUkVGSVgJKDB4ODBMKQotI2RlZmluZSBTU19OT1RJRlkJKDB4MTAwTCkKLSNkZWZpbmUgU1NfT1dORVJEUkFXCSgweGRMKQotI2RlZmluZSBTU19SRUFMU0laRUlNQUdFCSgweDgwMEwpCi0jZGVmaW5lIFNTX1JJR0hUCSgweDJMKQotI2RlZmluZSBTU19SSUdIVEpVU1QJKDB4NDAwTCkKLSNkZWZpbmUgU1NfU0lNUExFCSgweGJMKQotI2RlZmluZSBTU19TVU5LRU4JKDB4MTAwMEwpCi0jZGVmaW5lIFNTX1VTRVJJVEVNICAgICAoMHhhTCkKLSNkZWZpbmUgU1NfV0hJVEVGUkFNRQkoMHg5TCkKLSNkZWZpbmUgU1NfV0hJVEVSRUNUCSgweDZMKQotI2RlZmluZSBEU18zRExPT0sJKDB4NEwpCi0jZGVmaW5lIERTX0FCU0FMSUdOCSgweDFMKQotI2RlZmluZSBEU19DRU5URVIJKDB4ODAwTCkKLSNkZWZpbmUgRFNfQ0VOVEVSTU9VU0UJKDB4MTAwMEwpCi0jZGVmaW5lIERTX0NPTlRFWFRIRUxQCSgweDIwMDBMKQotI2RlZmluZSBEU19DT05UUk9MCSgweDQwMEwpCi0jZGVmaW5lIERTX0ZJWEVEU1lTCSgweDhMKQotI2RlZmluZSBEU19MT0NBTEVESVQJKDB4MjBMKQotI2RlZmluZSBEU19NT0RBTEZSQU1FCSgweDgwTCkKLSNkZWZpbmUgRFNfTk9GQUlMQ1JFQVRFCSgweDEwTCkKLSNkZWZpbmUgRFNfTk9JRExFTVNHCSgweDEwMEwpCi0jZGVmaW5lIERTX1NFVEZPTlQJKDB4NDBMKQotI2RlZmluZSBEU19TRVRGT1JFR1JPVU5ECSgweDIwMEwpCi0jZGVmaW5lIERTX1NZU01PREFMCSgweDJMKQotCi0vKiBBIGRpYWxvZyBjb250cm9sLiAgKi8KLQotc3RydWN0IGRpYWxvZ19jb250cm9sCi17Ci0gIC8qIE5leHQgY29udHJvbC4gICovCi0gIHN0cnVjdCBkaWFsb2dfY29udHJvbCAqbmV4dDsKLSAgLyogSUQuICAqLwotICB1bnNpZ25lZCBzaG9ydCBpZDsKLSAgLyogU3R5bGUuICAqLwotICB1bnNpZ25lZCBsb25nIHN0eWxlOwotICAvKiBFeHRlbmRlZCBzdHlsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgZXhzdHlsZTsKLSAgLyogWCBjb29yZGluYXRlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgeDsKLSAgLyogWSBjb29yZGluYXRlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgeTsKLSAgLyogV2lkdGguICAqLwotICB1bnNpZ25lZCBzaG9ydCB3aWR0aDsKLSAgLyogSGVpZ2h0LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaGVpZ2h0OwotICAvKiBDbGFzcyBuYW1lLiAgKi8KLSAgc3RydWN0IHJlc19pZCBjbGFzczsKLSAgLyogQXNzb2NpYXRlZCB0ZXh0LiAgKi8KLSAgc3RydWN0IHJlc19pZCB0ZXh0OwotICAvKiBFeHRyYSBkYXRhIGZvciB0aGUgd2luZG93IHByb2NlZHVyZS4gICovCi0gIHN0cnVjdCByY2RhdGFfaXRlbSAqZGF0YTsKLSAgLyogSGVscCBJRC4gIE9ubHkgdXNlZCBpbiBhbiBleHRlbmRlZCBkaWFsb2cuICAqLwotICB1bnNpZ25lZCBsb25nIGhlbHA7Ci19OwotCi0vKiBDb250cm9sIGNsYXNzZXMuICBUaGVzZSBjYW4gYmUgdXNlZCBhcyB0aGUgSUQgZmllbGQgaW4gYSBzdHJ1Y3QKLSAgIGRpYWxvZ19jb250cm9sLiAgKi8KLQotI2RlZmluZSBDVExfQlVUVE9OCTB4ODAKLSNkZWZpbmUgQ1RMX0VESVQJMHg4MQotI2RlZmluZSBDVExfU1RBVElDCTB4ODIKLSNkZWZpbmUgQ1RMX0xJU1RCT1gJMHg4MwotI2RlZmluZSBDVExfU0NST0xMQkFSCTB4ODQKLSNkZWZpbmUgQ1RMX0NPTUJPQk9YCTB4ODUKLQotLyogQSBmb250ZGlyIHJlc291cmNlIGlzIGEgbGlzdCBvZiBmb250ZGlyIHN0cnVjdHVyZXMuICAqLwotCi1zdHJ1Y3QgZm9udGRpcgotewotICBzdHJ1Y3QgZm9udGRpciAqbmV4dDsKLSAgLyogSW5kZXggb2YgZm9udCBlbnRyeS4gICovCi0gIHNob3J0IGluZGV4OwotICAvKiBMZW5ndGggb2YgZm9udCBpbmZvcm1hdGlvbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAvKiBGb250IGluZm9ybWF0aW9uLiAqLwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotfTsKLQotLyogQSBncm91cF9pY29uIHJlc291cmNlIGlzIGEgbGlzdCBvZiBncm91cF9pY29uIHN0cnVjdHVyZXMuICAqLwotCi1zdHJ1Y3QgZ3JvdXBfaWNvbgotewotICAvKiBOZXh0IGljb24gaW4gZ3JvdXAuICAqLwotICBzdHJ1Y3QgZ3JvdXBfaWNvbiAqbmV4dDsKLSAgLyogV2lkdGguICAqLwotICB1bnNpZ25lZCBjaGFyIHdpZHRoOwotICAvKiBIZWlnaHQuICAqLwotICB1bnNpZ25lZCBjaGFyIGhlaWdodDsKLSAgLyogQ29sb3IgY291bnQuICAqLwotICB1bnNpZ25lZCBjaGFyIGNvbG9yczsKLSAgLyogUGxhbmVzLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgcGxhbmVzOwotICAvKiBCaXRzIHBlciBwaXhlbC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGJpdHM7Ci0gIC8qIE51bWJlciBvZiBieXRlcyBpbiBjdXJzb3IgcmVzb3VyY2UuICAqLwotICB1bnNpZ25lZCBsb25nIGJ5dGVzOwotICAvKiBJbmRleCBvZiBjdXJzb3IgcmVzb3VyY2UuICAqLwotICB1bnNpZ25lZCBzaG9ydCBpbmRleDsKLX07Ci0KLS8qIEEgbWVudSByZXNvdXJjZS4gICovCi0KLXN0cnVjdCBtZW51Ci17Ci0gIC8qIExpc3Qgb2YgbWVudWl0ZW1zLiAgKi8KLSAgc3RydWN0IG1lbnVpdGVtICppdGVtczsKLSAgLyogSGVscCBJRC4gIEkgZG9uJ3QgdGhpbmsgdGhlcmUgaXMgYW55IHdheSB0byBzZXQgdGhpcyBpbiBhbiByYwotICAgICBmaWxlLCBidXQgaXQgY2FuIGFwcGVhciBpbiB0aGUgYmluYXJ5IGZvcm1hdC4gICovCi0gIHVuc2lnbmVkIGxvbmcgaGVscDsKLX07Ci0KLS8qIEEgbWVudSByZXNvdXJjZSBpcyBhIGxpc3Qgb2YgbWVudWl0ZW0gc3RydWN0dXJlcy4gICovCi0KLXN0cnVjdCBtZW51aXRlbQotewotICAvKiBOZXh0IG1lbnVpdGVtLiAgKi8KLSAgc3RydWN0IG1lbnVpdGVtICpuZXh0OwotICAvKiBUeXBlLiAgSW4gYSBub3JtYWwgbWVudSwgcmF0aGVyIHRoYW4gYSBtZW51ZXgsIHRoaXMgaXMgdGhlIGZsYWdzCi0gICAgIGZpZWxkLiAgKi8KLSAgdW5zaWduZWQgbG9uZyB0eXBlOwotICAvKiBTdGF0ZS4gIFRoaXMgaXMgb25seSB1c2VkIGluIGEgbWVudWV4LiAgKi8KLSAgdW5zaWduZWQgbG9uZyBzdGF0ZTsKLSAgLyogSWQuICAqLwotICB1bnNpZ25lZCBzaG9ydCBpZDsKLSAgLyogVW5pY29kZSB0ZXh0LiAgKi8KLSAgdW5pY2hhciAqdGV4dDsKLSAgLyogUG9wdXAgbWVudSBpdGVtcyBmb3IgYSBwb3B1cC4gICovCi0gIHN0cnVjdCBtZW51aXRlbSAqcG9wdXA7Ci0gIC8qIEhlbHAgSUQuICBUaGlzIGlzIG9ubHkgdXNlZCBpbiBhIG1lbnVleC4gICovCi0gIHVuc2lnbmVkIGxvbmcgaGVscDsKLX07Ci0KLS8qIE1lbnUgaXRlbSBmbGFncy4gIFRoZXNlIGNhbiBhcHBlYXIgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0Ci0gICBtZW51aXRlbS4gICovCi0KLSNkZWZpbmUgTUVOVUlURU1fR1JBWUVECQkweDAwMQotI2RlZmluZSBNRU5VSVRFTV9JTkFDVElWRQkweDAwMgotI2RlZmluZSBNRU5VSVRFTV9CSVRNQVAJCTB4MDA0Ci0jZGVmaW5lIE1FTlVJVEVNX09XTkVSRFJBVwkweDEwMAotI2RlZmluZSBNRU5VSVRFTV9DSEVDS0VECTB4MDA4Ci0jZGVmaW5lIE1FTlVJVEVNX1BPUFVQCQkweDAxMAotI2RlZmluZSBNRU5VSVRFTV9NRU5VQkFSQlJFQUsJMHgwMjAKLSNkZWZpbmUgTUVOVUlURU1fTUVOVUJSRUFLCTB4MDQwCi0jZGVmaW5lIE1FTlVJVEVNX0VORE1FTlUJMHgwODAKLSNkZWZpbmUgTUVOVUlURU1fSEVMUAkgICAgICAgMHg0MDAwCi0KLS8qIEFuIHJjZGF0YSByZXNvdXJjZSBpcyBhIHBvaW50ZXIgdG8gYSBsaXN0IG9mIHJjZGF0YV9pdGVtCi0gICBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RydWN0IHJjZGF0YV9pdGVtCi17Ci0gIC8qIE5leHQgZGF0YSBpdGVtLiAgKi8KLSAgc3RydWN0IHJjZGF0YV9pdGVtICpuZXh0OwotICAvKiBUeXBlIG9mIGRhdGEuICAqLwotICBlbnVtCi0gIHsKLSAgICBSQ0RBVEFfV09SRCwKLSAgICBSQ0RBVEFfRFdPUkQsCi0gICAgUkNEQVRBX1NUUklORywKLSAgICBSQ0RBVEFfV1NUUklORywKLSAgICBSQ0RBVEFfQlVGRkVSCi0gIH0gdHlwZTsKLSAgdW5pb24KLSAgewotICAgIHVuc2lnbmVkIGludCB3b3JkOwotICAgIHVuc2lnbmVkIGxvbmcgZHdvcmQ7Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgICBjb25zdCBjaGFyICpzOwotICAgIH0gc3RyaW5nOwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICAgY29uc3QgdW5pY2hhciAqdzsKLSAgICB9IHdzdHJpbmc7Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgIH0gYnVmZmVyOwotICB9IHU7Ci19OwotCi0vKiBBIHN0cmluZ3RhYmxlIHJlc291cmNlIGlzIGEgcG9pbnRlciB0byBhIHN0cmluZ3RhYmxlIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBzdHJpbmd0YWJsZQotewotICAvKiBFYWNoIHN0cmluZ3RhYmxlIHJlc291cmNlIGlzIGEgbGlzdCBvZiAxNiB1bmljb2RlIHN0cmluZ3MuICAqLwotICBzdHJ1Y3QKLSAgewotICAgIC8qIExlbmd0aCBvZiBzdHJpbmcuICAqLwotICAgIGludCBsZW5ndGg7Ci0gICAgLyogU3RyaW5nIGRhdGEgaWYgbGVuZ3RoID4gMC4gICovCi0gICAgdW5pY2hhciAqc3RyaW5nOwotICB9IHN0cmluZ3NbMTZdOwotfTsKLQotLyogQSB2ZXJzaW9uaW5mbyByZXNvdXJjZSBwb2ludHMgdG8gYSB2ZXJzaW9uaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgdmVyc2lvbmluZm8KLXsKLSAgLyogRml4ZWQgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbyAqZml4ZWQ7Ci0gIC8qIFZhcmlhYmxlIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgdmVyX2luZm8gKnZhcjsKLX07Ci0KLS8qIFRoZSBmaXhlZCBwb3J0aW9uIG9mIGEgdmVyc2lvbmluZm8gcmVzb3VyY2UuICAqLwotCi1zdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8KLXsKLSAgLyogVGhlIGZpbGUgdmVyc2lvbiwgd2hpY2ggaXMgdHdvIDMyIGJpdCBpbnRlZ2Vycy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmlsZV92ZXJzaW9uX21zOwotICB1bnNpZ25lZCBsb25nIGZpbGVfdmVyc2lvbl9sczsKLSAgLyogVGhlIHByb2R1Y3QgdmVyc2lvbiwgd2hpY2ggaXMgdHdvIDMyIGJpdCBpbnRlZ2Vycy4gICovCi0gIHVuc2lnbmVkIGxvbmcgcHJvZHVjdF92ZXJzaW9uX21zOwotICB1bnNpZ25lZCBsb25nIHByb2R1Y3RfdmVyc2lvbl9sczsKLSAgLyogVGhlIGZpbGUgZmxhZ3MgbWFzay4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmlsZV9mbGFnc19tYXNrOwotICAvKiBUaGUgZmlsZSBmbGFncy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmlsZV9mbGFnczsKLSAgLyogVGhlIE9TIHR5cGUuICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfb3M7Ci0gIC8qIFRoZSBmaWxlIHR5cGUuICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfdHlwZTsKLSAgLyogVGhlIGZpbGUgc3VidHlwZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmlsZV9zdWJ0eXBlOwotICAvKiBUaGUgZGF0ZSwgd2hpY2ggaW4gV2luZG93cyBpcyB0d28gMzIgYml0IGludGVnZXJzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX2RhdGVfbXM7Ci0gIHVuc2lnbmVkIGxvbmcgZmlsZV9kYXRlX2xzOwotfTsKLQotLyogQSBsaXN0IG9mIHZhcmlhYmxlIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgdmVyX2luZm8KLXsKLSAgLyogTmV4dCBpdGVtLiAgKi8KLSAgc3RydWN0IHZlcl9pbmZvICpuZXh0OwotICAvKiBUeXBlIG9mIGRhdGEuICAqLwotICBlbnVtIHsgVkVSSU5GT19TVFJJTkcsIFZFUklORk9fVkFSIH0gdHlwZTsKLSAgdW5pb24KLSAgewotICAgIC8qIFN0cmluZ0ZpbGVJbmZvIGRhdGEuICAqLwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIC8qIExhbmd1YWdlLiAgKi8KLSAgICAgIHVuaWNoYXIgKmxhbmd1YWdlOwotICAgICAgLyogU3RyaW5ncy4gICovCi0gICAgICBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKnN0cmluZ3M7Ci0gICAgfSBzdHJpbmc7Ci0gICAgLyogVmFyRmlsZUluZm8gZGF0YS4gICovCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgLyogS2V5LiAgKi8KLSAgICAgIHVuaWNoYXIgKmtleTsKLSAgICAgIC8qIFZhbHVlcy4gICovCi0gICAgICBzdHJ1Y3QgdmVyX3ZhcmluZm8gKnZhcjsKLSAgICB9IHZhcjsKLSAgfSB1OwotfTsKLQotLyogQSBsaXN0IG9mIHN0cmluZyB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IHZlcl9zdHJpbmdpbmZvCi17Ci0gIC8qIE5leHQgc3RyaW5nLiAgKi8KLSAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICpuZXh0OwotICAvKiBLZXkuICAqLwotICB1bmljaGFyICprZXk7Ci0gIC8qIFZhbHVlLiAgKi8KLSAgdW5pY2hhciAqdmFsdWU7Ci19OwotCi0vKiBBIGxpc3Qgb2YgdmFyaWFibGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCB2ZXJfdmFyaW5mbwotewotICAvKiBOZXh0IGl0ZW0uICAqLwotICBzdHJ1Y3QgdmVyX3ZhcmluZm8gKm5leHQ7Ci0gIC8qIExhbmd1YWdlIElELiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgbGFuZ3VhZ2U7Ci0gIC8qIENoYXJhY3RlciBzZXQgSUQuICAqLwotICB1bnNpZ25lZCBzaG9ydCBjaGFyc2V0OwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB3aGVuIGNvbnZlcnRpbmcgcmVzb3VyY2UgaW5mb3JtYXRpb24gdG8KLSAgIGJpbmFyeS4gICovCi0KLXN0cnVjdCBiaW5kYXRhCi17Ci0gIC8qIE5leHQgZGF0YS4gICovCi0gIHN0cnVjdCBiaW5kYXRhICpuZXh0OwotICAvKiBMZW5ndGggb2YgZGF0YS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAvKiBEYXRhLiAgKi8KLSAgdW5zaWduZWQgY2hhciAqZGF0YTsKLX07Ci0KLWV4dGVybiBpbnQgdmVyYm9zZTsKLQotLyogRnVuY3Rpb24gZGVjbGFyYXRpb25zLiAgKi8KLQotZXh0ZXJuIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZWFkX3JjX2ZpbGUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1leHRlcm4gc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlYWRfcmVzX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlYWRfY29mZl9yc3JjCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCB3cml0ZV9yY19maWxlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKikpOwotZXh0ZXJuIHZvaWQgd3JpdGVfcmVzX2ZpbGUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKSk7Ci1leHRlcm4gdm9pZCB3cml0ZV9jb2ZmX2ZpbGUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICopKTsKLQotZXh0ZXJuIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXMKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLWV4dGVybiBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2JpbiBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICosIGludCkpOwotCi1leHRlcm4gRklMRSAqb3Blbl9maWxlX3NlYXJjaAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjaGFyICoqKSk7Ci0KLWV4dGVybiBQVFIgcmVzX2FsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotZXh0ZXJuIFBUUiByZXN3cl9hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLQotLyogUmVzb3VyY2UgSUQgaGFuZGxpbmcuICAqLwotCi1leHRlcm4gaW50IHJlc19pZF9jbXAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgc3RydWN0IHJlc19pZCkpOwotZXh0ZXJuIHZvaWQgcmVzX2lkX3ByaW50IFBBUkFNUyAoKEZJTEUgKiwgc3RydWN0IHJlc19pZCwgaW50KSk7Ci1leHRlcm4gdm9pZCByZXNfaWRzX3ByaW50IFBBUkFNUyAoKEZJTEUgKiwgaW50LCBjb25zdCBzdHJ1Y3QgcmVzX2lkICopKTsKLWV4dGVybiB2b2lkIHJlc19zdHJpbmdfdG9faWQgUEFSQU1TICgoc3RydWN0IHJlc19pZCAqLCBjb25zdCBjaGFyICopKTsKLQotLyogTWFuaXB1bGF0aW9uIG9mIHRoZSByZXNvdXJjZSB0cmVlLiAgKi8KLQotZXh0ZXJuIHN0cnVjdCByZXNfcmVzb3VyY2UgKmRlZmluZV9yZXNvdXJjZQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKiwgaW50LCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGludCkpOwotZXh0ZXJuIHN0cnVjdCByZXNfcmVzb3VyY2UgKmRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKiwgaW50LCBzdHJ1Y3QgcmVzX2lkLCBpbnQsIGludCkpOwotCi1leHRlcm4gaW50IGV4dGVuZGVkX2RpYWxvZyBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZGlhbG9nICopKTsKLWV4dGVybiBpbnQgZXh0ZW5kZWRfbWVudSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgbWVudSAqKSk7Ci0KLS8qIENvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgcmMgZmlsZSBzdXBwb3J0IGFuZCB0aGUgcGFyc2VyIGFuZCBsZXhlci4gICovCi0KLWV4dGVybiBpbnQgeXlkZWJ1ZzsKLWV4dGVybiBGSUxFICp5eWluOwotZXh0ZXJuIGNoYXIgKnJjX2ZpbGVuYW1lOwotZXh0ZXJuIGludCByY19saW5lbm87Ci1leHRlcm4gaW50IHl5cGFyc2UgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIGludCB5eWxleCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgcmNwYXJzZV93YXJuaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgcmNwYXJzZV9zZXRfbGFuZ3VhZ2UgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCByY3BhcnNlX2Rpc2NhcmRfc3RyaW5ncyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCByY3BhcnNlX3JjZGF0YSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCByY3BhcnNlX25vcm1hbCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiB2b2lkIGRlZmluZV9hY2NlbGVyYXRvcgotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIHN0cnVjdCBhY2NlbGVyYXRvciAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfYml0bWFwCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfY3Vyc29yCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfZGlhbG9nCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgY29uc3Qgc3RydWN0IGRpYWxvZyAqKSk7Ci1leHRlcm4gc3RydWN0IGRpYWxvZ19jb250cm9sICpkZWZpbmVfY29udHJvbAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCi0JICAgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKLQkgICB1bnNpZ25lZCBsb25nKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfZm9udAotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX2ljb24KLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV9tZW51Ci0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgc3RydWN0IG1lbnVpdGVtICopKTsKLWV4dGVybiBzdHJ1Y3QgbWVudWl0ZW0gKmRlZmluZV9tZW51aXRlbQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKLQkgICBzdHJ1Y3QgbWVudWl0ZW0gKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX21lc3NhZ2V0YWJsZQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX3JjZGF0YQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIHN0cnVjdCByY2RhdGFfaXRlbSAqKSk7Ci1leHRlcm4gc3RydWN0IHJjZGF0YV9pdGVtICpkZWZpbmVfcmNkYXRhX3N0cmluZwotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLWV4dGVybiBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKmRlZmluZV9yY2RhdGFfbnVtYmVyIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCkpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX3N0cmluZ3RhYmxlCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgdW5zaWduZWQgbG9uZywgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfdXNlcl9kYXRhCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwKLQkgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX3VzZXJfZmlsZQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosCi0JICAgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfdmVyc2lvbmluZm8KLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgaW50LCBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKiwKLQkgICBzdHJ1Y3QgdmVyX2luZm8gKikpOwotZXh0ZXJuIHN0cnVjdCB2ZXJfaW5mbyAqYXBwZW5kX3Zlcl9zdHJpbmdmaWxlaW5mbwotICBQQVJBTVMgKChzdHJ1Y3QgdmVyX2luZm8gKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKikpOwotZXh0ZXJuIHN0cnVjdCB2ZXJfaW5mbyAqYXBwZW5kX3Zlcl92YXJmaWxlaW5mbwotICBQQVJBTVMgKChzdHJ1Y3QgdmVyX2luZm8gKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgdmVyX3ZhcmluZm8gKikpOwotZXh0ZXJuIHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqYXBwZW5kX3ZlcnZhbAotICBQQVJBTVMgKChzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBzdHJ1Y3QgdmVyX3ZhcmluZm8gKmFwcGVuZF92ZXJ0cmFucwotICBQQVJBTVMgKChzdHJ1Y3QgdmVyX3ZhcmluZm8gKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZykpOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvd2luZHVuaS5jIGIvYmludXRpbHMvd2luZHVuaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzlmNDdhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3dpbmR1bmkuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKiB3aW5kdW5pLmMgLS0gdW5pY29kZSBzdXBwb3J0IGZvciB0aGUgd2luZHJlcyBwcm9ncmFtLgotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgdW5pY29kZSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgd2luZHJlcwotICAgcHJvZ3JhbS4gIElkZWFsbHksIHdlIHdvdWxkIGhhdmUgZ2VuZXJpYyB1bmljb2RlIHN1cHBvcnQgd2hpY2gKLSAgIHdvdWxkIHdvcmsgb24gYWxsIHN5c3RlbXMuICBIb3dldmVyLCB3ZSBkb24ndC4gIEluc3RlYWQsIG9uIGEKLSAgIFdpbmRvd3MgaG9zdCwgd2UgYXJlIHByZXBhcmVkIHRvIGNhbGwgc29tZSBXaW5kb3dzIHJvdXRpbmVzLiAgVGhpcwotICAgbWVhbnMgdGhhdCB3ZSB3aWxsIGdlbmVyYXRlIGRpZmZlcmVudCBvdXRwdXQgb24gV2luZG93cyBhbmQgVW5peAotICAgaG9zdHMsIGJ1dCB0aGF0IHNlZW1zIGJldHRlciB0aGFuIG5vdCByZWFsbHkgc3VwcG9ydGluZyB1bmljb2RlIGF0Ci0gICBhbGwuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAid2luZHVuaS5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2lmZGVmIF9XSU4zMgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotCi0vKiBDb252ZXJ0IGFuIEFTQ0lJIHN0cmluZyB0byBhIHVuaWNvZGUgc3RyaW5nLiAgV2UganVzdCBjb3B5IGl0LAotICAgZXhwYW5kaW5nIGNoYXJzIHRvIHNob3J0cywgcmF0aGVyIHRoYW4gZG9pbmcgc29tZXRoaW5nIGludGVsbGlnZW50LiAgKi8KLQotdm9pZAotdW5pY29kZV9mcm9tX2FzY2lpIChsZW5ndGgsIHVuaWNvZGUsIGFzY2lpKQotICAgICBpbnQgKmxlbmd0aDsKLSAgICAgdW5pY2hhciAqKnVuaWNvZGU7Ci0gICAgIGNvbnN0IGNoYXIgKmFzY2lpOwotewotICBpbnQgbGVuOwotICBjb25zdCBjaGFyICpzOwotICB1bnNpZ25lZCBzaG9ydCAqdzsKLQotICBsZW4gPSBzdHJsZW4gKGFzY2lpKTsKLQotICBpZiAobGVuZ3RoICE9IE5VTEwpCi0gICAgKmxlbmd0aCA9IGxlbjsKLQotICAqdW5pY29kZSA9ICgodW5pY2hhciAqKSByZXNfYWxsb2MgKChsZW4gKyAxKSAqIHNpemVvZiAodW5pY2hhcikpKTsKLQotI2lmZGVmIF9XSU4zMgotICAvKiBGSVhNRTogT24gV2luZG93cywgd2Ugc2hvdWxkIGJlIHVzaW5nIE11bHRpQnl0ZVRvV2lkZUNoYXIgdG8gc2V0Ci0gICAgIHRoZSBsZW5ndGguICAqLwotICBNdWx0aUJ5dGVUb1dpZGVDaGFyIChDUF9BQ1AsIDAsIGFzY2lpLCBsZW4gKyAxLCAqdW5pY29kZSwgbGVuICsgMSk7Ci0jZWxzZQotICBmb3IgKHMgPSBhc2NpaSwgdyA9ICp1bmljb2RlOyAqcyAhPSAnXDAnOyBzKyssIHcrKykKLSAgICAqdyA9ICpzICYgMHhmZjsKLSAgKncgPSAwOwotI2VuZGlmCi19Ci0KLS8qIFByaW50IHRoZSB1bmljb2RlIHN0cmluZyBVTklDT0RFIHRvIHRoZSBmaWxlIEUuICBMRU5HVEggaXMgdGhlCi0gICBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBwcmludCwgb3IgLTEgaWYgd2Ugc2hvdWxkIHByaW50IHVudGlsIHRoZQotICAgZW5kIG9mIHRoZSBzdHJpbmcuICBGSVhNRTogT24gYSBXaW5kb3dzIGhvc3QsIHdlIHNob3VsZCBiZSBjYWxsaW5nCi0gICBzb21lIFdpbmRvd3MgZnVuY3Rpb24sIHByb2JhYmx5IFdpZGVDaGFyVG9NdWx0aUJ5dGUuICAqLwotCi12b2lkCi11bmljb2RlX3ByaW50IChlLCB1bmljb2RlLCBsZW5ndGgpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHVuaWNoYXIgKnVuaWNvZGU7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIHVuaWNoYXIgY2g7Ci0KLSAgICAgIGlmIChsZW5ndGggPT0gMCkKLQlyZXR1cm47Ci0gICAgICBpZiAobGVuZ3RoID4gMCkKLQktLWxlbmd0aDsKLQotICAgICAgY2ggPSAqdW5pY29kZTsKLQotICAgICAgaWYgKGNoID09IDAgJiYgbGVuZ3RoIDwgMCkKLQlyZXR1cm47Ci0KLSAgICAgICsrdW5pY29kZTsKLQotICAgICAgaWYgKChjaCAmIDB4N2YpID09IGNoKQotCXsKLQkgIGlmIChjaCA9PSAnXFwnKQotCSAgICBmcHV0cyAoIlxcIiwgZSk7Ci0JICBlbHNlIGlmIChpc3ByaW50IChjaCkpCi0JICAgIHB1dGMgKGNoLCBlKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN3aXRjaCAoY2gpCi0JCXsKLQkJY2FzZSBFU0NBUEVfQToKLQkJICBmcHV0cyAoIlxcYSIsIGUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRVNDQVBFX0I6Ci0JCSAgZnB1dHMgKCJcXGIiLCBlKTsKLQkJICBicmVhazsKLQotCQljYXNlIEVTQ0FQRV9GOgotCQkgIGZwdXRzICgiXFxmIiwgZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBFU0NBUEVfTjoKLQkJICBmcHV0cyAoIlxcbiIsIGUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRVNDQVBFX1I6Ci0JCSAgZnB1dHMgKCJcXHIiLCBlKTsKLQkJICBicmVhazsKLQotCQljYXNlIEVTQ0FQRV9UOgotCQkgIGZwdXRzICgiXFx0IiwgZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBFU0NBUEVfVjoKLQkJICBmcHV0cyAoIlxcdiIsIGUpOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgZnByaW50ZiAoZSwgIlxcJTAzbyIsICh1bnNpZ25lZCBpbnQpIGNoKTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoKGNoICYgMHhmZikgPT0gY2gpCi0JZnByaW50ZiAoZSwgIlxcJTAzbyIsICh1bnNpZ25lZCBpbnQpIGNoKTsKLSAgICAgIGVsc2UKLQlmcHJpbnRmIChlLCAiXFx4JXgiLCAodW5zaWduZWQgaW50KSBjaCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvd2luZHVuaS5oIGIvYmludXRpbHMvd2luZHVuaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2E5YWYyLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3dpbmR1bmkuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qIHdpbmR1bmkuaCAtLSBoZWFkZXIgZmlsZSBmb3IgdW5pY29kZSBzdXBwb3J0IGZvciB3aW5kcmVzIHByb2dyYW0uCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0vKiBUaGlzIGhlYWRlciBmaWxlIGRlY2xhcmVzIHRoZSB0eXBlcyBhbmQgZnVuY3Rpb25zIHdlIHVzZSBmb3IKLSAgIHVuaWNvZGUgc3VwcG9ydCBpbiB3aW5kcmVzLiAgT3VyIHVuaWNvZGUgc3VwcG9ydCBpcyB2ZXJ5IGxpbWl0ZWQgYXQKLSAgIHByZXNlbnQuCi0KLSAgIFdlIGRvbid0IHB1dCB0aGlzIHN0dWZmIGluIHdpbmRyZXMuaCBzbyB0aGF0IHdpbmR1bmkuYyBkb2Vzbid0IGhhdmUKLSAgIHRvIGluY2x1ZGUgd2luZHJlcy5oLiAgd2luZHVuaS5jIG5lZWRzIHRvIGluY2x1ZGVzIHdpbmRvd3MuaCwgYW5kCi0gICB0aGF0IHdvdWxkIGNvbmZsaWN0IHdpdGggdGhlIGRlZmluaXRpb25zIG9mIFdpbmRvd3MgbWFjcm9zIHdlCi0gICBhbHJlYWR5IGhhdmUgaW4gd2luZHJlcy5oLiAgKi8KLQotLyogV2UgdXNlIHRoaXMgdHlwZSB0byBob2xkIGEgdW5pY29kZSBjaGFyYWN0ZXIuICAqLwotCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVuaWNoYXI7Ci0KLS8qIEVzY2FwZSBjaGFyYWN0ZXIgdHJhbnNsYXRpb25zLiAgKi8KLQotI2RlZmluZSBFU0NBUEVfQSAoMDA3KQotI2RlZmluZSBFU0NBUEVfQiAoMDEwKQotI2RlZmluZSBFU0NBUEVfRiAoMDE0KQotI2RlZmluZSBFU0NBUEVfTiAoMDEyKQotI2RlZmluZSBFU0NBUEVfUiAoMDE1KQotI2RlZmluZSBFU0NBUEVfVCAoMDExKQotI2RlZmluZSBFU0NBUEVfViAoMDEzKQotCi0vKiBDb252ZXJ0IGFuIEFTQ0lJIHN0cmluZyB0byBhIHVuaWNvZGUgc3RyaW5nLiAgKi8KLQotZXh0ZXJuIHZvaWQgdW5pY29kZV9mcm9tX2FzY2lpCi0gIFBBUkFNUyAoKGludCAqLCB1bmljaGFyICoqLCBjb25zdCBjaGFyICopKTsKLQotLyogUHJpbnQgYSB1bmljb2RlIHN0cmluZyB0byBhIGZpbGUuICAqLwotCi1leHRlcm4gdm9pZCB1bmljb2RlX3ByaW50IFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgdW5pY2hhciAqLCBpbnQpKTsKLQotLyogV2luZHJlcyBzdXBwb3J0IHJvdXRpbmUgY2FsbGVkIGJ5IHVuaWNvZGVfZnJvbV9hc2NpaS4gIFRoaXMgaXMgYm90aAotICAgaGVyZSBhbmQgaW4gd2luZHJlcy5oLiAgSXQgc2hvdWxkIHByb2JhYmx5IGJlIGluIGEgc2VwYXJhdGUgaGVhZGVyCi0gICBmaWxlLCBidXQgaXQgaGFyZGx5IHNlZW1zIHdvcnRoIGl0IGZvciBvbmUgZnVuY3Rpb24uICAqLwotCi1leHRlcm4gUFRSIHJlc19hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3dyc3RhYnMuYyBiL2JpbnV0aWxzL3dyc3RhYnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyODE3NC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy93cnN0YWJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDE2ICswLDAgQEAKLS8qIHdyc3RhYnMuYyAtLSBPdXRwdXQgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgd2hpY2ggd3JpdGVzIG91dCBzdGFicyBkZWJ1Z2dpbmcKLSAgIGluZm9ybWF0aW9uLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+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+dHlwZV9jYWNoZS5wb2ludGVyX3R5cGVzLAotCQkJICAgJmluZm8tPnR5cGVfY2FjaGUucG9pbnRlcl90eXBlc19hbGxvYyk7Ci19Ci0KLS8qIFB1c2ggYSBmdW5jdGlvbiB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZnVuY3Rpb25fdHlwZSAocCwgYXJnY291bnQsIHZhcmFyZ3MpCi0gICAgIFBUUiBwOwotICAgICBpbnQgYXJnY291bnQ7Ci0gICAgIGJvb2xlYW4gdmFyYXJnczsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBpbnQgaTsKLQotICAvKiBXZSBoYXZlIG5vIHdheSB0byByZXByZXNlbnQgdGhlIGFyZ3VtZW50IHR5cGVzLCBzbyB3ZSBqdXN0Ci0gICAgIGRpc2NhcmQgdGhlbS4gIEhvd2V2ZXIsIGlmIHRoZXkgZGVmaW5lIG5ldyB0eXBlcywgd2UgbXVzdCBvdXRwdXQKLSAgICAgdGhlbS4gIFdlIGRvIHRoaXMgYnkgcHJvZHVjaW5nIGVtcHR5IHR5cGVkZWZzLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGFyZ2NvdW50OyBpKyspCi0gICAgewotICAgICAgaWYgKCEgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbikKLQlmcmVlIChzdGFiX3BvcF90eXBlIChpbmZvKSk7Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqcywgKmJ1ZjsKLQotCSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0JICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHMpICsgMyk7Ci0JICBzcHJpbnRmIChidWYsICI6dCVzIiwgcyk7Ci0JICBmcmVlIChzKTsKLQotCSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fTFNZTSwgMCwgMCwgYnVmKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBmcmVlIChidWYpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHN0YWJfbW9kaWZ5X3R5cGUgKGluZm8sICdmJywgMCwgJmluZm8tPnR5cGVfY2FjaGUuZnVuY3Rpb25fdHlwZXMsCi0JCQkgICAmaW5mby0+dHlwZV9jYWNoZS5mdW5jdGlvbl90eXBlc19hbGxvYyk7Ci19Ci0KLS8qIFB1c2ggYSByZWZlcmVuY2UgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3JlZmVyZW5jZV90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIC8qIEZJWE1FOiBUaGUgc2l6ZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlIGFyY2hpdGVjdHVyZS4gICovCi0gIHJldHVybiBzdGFiX21vZGlmeV90eXBlIChpbmZvLCAnJicsIDQsICZpbmZvLT50eXBlX2NhY2hlLnJlZmVyZW5jZV90eXBlcywKLQkJCSAgICZpbmZvLT50eXBlX2NhY2hlLnJlZmVyZW5jZV90eXBlc19hbGxvYyk7Ci19Ci0KLS8qIFB1c2ggYSByYW5nZSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfcmFuZ2VfdHlwZSAocCwgbG93LCBoaWdoKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3NpZ25lZF92bWEgbG93OwotICAgICBiZmRfc2lnbmVkX3ZtYSBoaWdoOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIGNoYXIgKnMsICpidWY7Ci0KLSAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT5zaXplOwotCi0gIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzKSArIDEwMCk7Ci0gIHNwcmludGYgKGJ1ZiwgInIlczslbGQ7JWxkOyIsIHMsIChsb25nKSBsb3csIChsb25nKSBoaWdoKTsKLSAgZnJlZSAocyk7Ci0KLSAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCAwLCBkZWZpbml0aW9uLCBzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhbiBhcnJheSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfYXJyYXlfdHlwZSAocCwgbG93LCBoaWdoLCBzdHJpbmdwKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3NpZ25lZF92bWEgbG93OwotICAgICBiZmRfc2lnbmVkX3ZtYSBoaWdoOwotICAgICBib29sZWFuIHN0cmluZ3A7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICB1bnNpZ25lZCBpbnQgZWxlbWVudF9zaXplOwotICBjaGFyICpyYW5nZSwgKmVsZW1lbnQsICpidWY7Ci0gIGxvbmcgaW5kZXg7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotCi0gIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICByYW5nZSA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIGRlZmluaXRpb24gPSBkZWZpbml0aW9uIHx8IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gIGVsZW1lbnRfc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnNpemU7Ci0gIGVsZW1lbnQgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHJhbmdlKSArIHN0cmxlbiAoZWxlbWVudCkgKyAxMDApOwotCi0gIGlmICghIHN0cmluZ3ApCi0gICAgewotICAgICAgaW5kZXggPSAwOwotICAgICAgKmJ1ZiA9ICdcMCc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbmVlZCB0byBkZWZpbmUgYSB0eXBlIGluIG9yZGVyIHRvIGluY2x1ZGUgdGhlIHN0cmluZwotICAgICAgICAgYXR0cmlidXRlLiAgKi8KLSAgICAgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKLSAgICAgICsraW5mby0+dHlwZV9pbmRleDsKLSAgICAgIGRlZmluaXRpb24gPSB0cnVlOwotICAgICAgc3ByaW50ZiAoYnVmLCAiJWxkPUBTOyIsIGluZGV4KTsKLSAgICB9Ci0KLSAgc3ByaW50ZiAoYnVmICsgc3RybGVuIChidWYpLCAiYXIlczslbGQ7JWxkOyVzIiwKLQkgICByYW5nZSwgKGxvbmcpIGxvdywgKGxvbmcpIGhpZ2gsIGVsZW1lbnQpOwotICBmcmVlIChyYW5nZSk7Ci0gIGZyZWUgKGVsZW1lbnQpOwotCi0gIGlmIChoaWdoIDwgbG93KQotICAgIHNpemUgPSAwOwotICBlbHNlCi0gICAgc2l6ZSA9IGVsZW1lbnRfc2l6ZSAqICgoaGlnaCAtIGxvdykgKyAxKTsKLSAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgZGVmaW5pdGlvbiwgc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1c2ggYSBzZXQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3NldF90eXBlIChwLCBiaXRzdHJpbmdwKQotICAgICBQVFIgcDsKLSAgICAgYm9vbGVhbiBiaXRzdHJpbmdwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgY2hhciAqcywgKmJ1ZjsKLSAgbG9uZyBpbmRleDsKLQotICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLQotICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocykgKyAzMCk7Ci0KLSAgaWYgKCEgYml0c3RyaW5ncCkKLSAgICB7Ci0gICAgICAqYnVmID0gJ1wwJzsKLSAgICAgIGluZGV4ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHRvIGRlZmluZSBhIHR5cGUgaW4gb3JkZXIgdG8gaW5jbHVkZSB0aGUgc3RyaW5nCi0gICAgICAgICBhdHRyaWJ1dGUuICAqLwotICAgICAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotICAgICAgKytpbmZvLT50eXBlX2luZGV4OwotICAgICAgZGVmaW5pdGlvbiA9IHRydWU7Ci0gICAgICBzcHJpbnRmIChidWYsICIlbGQ9QFM7IiwgaW5kZXgpOwotICAgIH0KLQotICBzcHJpbnRmIChidWYgKyBzdHJsZW4gKGJ1ZiksICJTJXMiLCBzKTsKLSAgZnJlZSAocyk7Ci0KLSAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgZGVmaW5pdGlvbiwgMCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1c2ggYW4gb2Zmc2V0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9vZmZzZXRfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICBjaGFyICp0YXJnZXQsICpiYXNlLCAqYnVmOwotCi0gIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICB0YXJnZXQgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICBkZWZpbml0aW9uID0gZGVmaW5pdGlvbiB8fCBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICBiYXNlID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuICh0YXJnZXQpICsgc3RybGVuIChiYXNlKSArIDMpOwotICBzcHJpbnRmIChidWYsICJAJXMsJXMiLCBiYXNlLCB0YXJnZXQpOwotICBmcmVlIChiYXNlKTsKLSAgZnJlZSAodGFyZ2V0KTsKLQotICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIDAsIGRlZmluaXRpb24sIDApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQdXNoIGEgbWV0aG9kIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9tZXRob2RfdHlwZSAocCwgZG9tYWlucCwgYXJnY291bnQsIHZhcmFyZ3MpCi0gICAgIFBUUiBwOwotICAgICBib29sZWFuIGRvbWFpbnA7Ci0gICAgIGludCBhcmdjb3VudDsKLSAgICAgYm9vbGVhbiB2YXJhcmdzOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgY2hhciAqZG9tYWluLCAqcmV0dXJuX3R5cGUsICpidWY7Ci0gIGNoYXIgKiphcmdzOwotICBpbnQgaTsKLSAgc2l6ZV90IGxlbjsKLQotICAvKiBXZSBkb24ndCBib3RoZXIgd2l0aCBzdHViIG1ldGhvZCB0eXBlcywgYmVjYXVzZSB0aGF0IHdvdWxkCi0gICAgIHJlcXVpcmUgYSBtYW5nbGVyIGZvciBDKysgYXJndW1lbnQgdHlwZXMuICBUaGlzIHdpbGwgd2FzdGUgc3BhY2UKLSAgICAgaW4gdGhlIGRlYnVnZ2luZyBvdXRwdXQuICAqLwotCi0gIC8qIFdlIG5lZWQgYSBkb21haW4uICBJJ20gbm90IHN1cmUgRE9NQUlOUCBjYW4gZXZlciBiZSBmYWxzZSwKLSAgICAgYW55aG93LiAgKi8KLSAgaWYgKCEgZG9tYWlucCkKLSAgICB7Ci0gICAgICBpZiAoISBzdGFiX2VtcHR5X3R5cGUgKHApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gIGRvbWFpbiA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIC8qIEEgbm9uLXZhcmFyZ3MgZnVuY3Rpb24gaXMgaW5kaWNhdGVkIGJ5IG1ha2luZyB0aGUgbGFzdCBwYXJhbWV0ZXIKLSAgICAgdHlwZSBiZSB2b2lkLiAgKi8KLQotICBpZiAoYXJnY291bnQgPCAwKQotICAgIHsKLSAgICAgIGFyZ3MgPSBOVUxMOwotICAgICAgYXJnY291bnQgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoYXJnY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAodmFyYXJncykKLQlhcmdzID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBhcmdzID0gKGNoYXIgKiopIHhtYWxsb2MgKDEgKiBzaXplb2YgKCphcmdzKSk7Ci0JICBpZiAoISBzdGFiX2VtcHR5X3R5cGUgKHApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBkZWZpbml0aW9uID0gZGVmaW5pdGlvbiB8fCBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotCSAgYXJnc1swXSA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCSAgYXJnY291bnQgPSAxOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhcmdzID0gKGNoYXIgKiopIHhtYWxsb2MgKChhcmdjb3VudCArIDEpICogc2l6ZW9mICgqYXJncykpOwotICAgICAgZm9yIChpID0gYXJnY291bnQgLSAxOyBpID49IDA7IGktLSkKLQl7Ci0JICBkZWZpbml0aW9uID0gZGVmaW5pdGlvbiB8fCBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotCSAgYXJnc1tpXSA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCX0KLSAgICAgIGlmICghIHZhcmFyZ3MpCi0JewotCSAgaWYgKCEgc3RhYl9lbXB0eV90eXBlIChwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZGVmaW5pdGlvbiA9IGRlZmluaXRpb24gfHwgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLQkgIGFyZ3NbYXJnY291bnRdID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0JICArK2FyZ2NvdW50OwotCX0KLSAgICB9Ci0KLSAgZGVmaW5pdGlvbiA9IGRlZmluaXRpb24gfHwgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgcmV0dXJuX3R5cGUgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICBsZW4gPSBzdHJsZW4gKGRvbWFpbikgKyBzdHJsZW4gKHJldHVybl90eXBlKSArIDEwOwotICBmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykKLSAgICBsZW4gKz0gc3RybGVuIChhcmdzW2ldKTsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOwotCi0gIHNwcmludGYgKGJ1ZiwgIiMlcywlcyIsIGRvbWFpbiwgcmV0dXJuX3R5cGUpOwotICBmcmVlIChkb21haW4pOwotICBmcmVlIChyZXR1cm5fdHlwZSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHN0cmNhdCAoYnVmLCAiLCIpOwotICAgICAgc3RyY2F0IChidWYsIGFyZ3NbaV0pOwotICAgICAgZnJlZSAoYXJnc1tpXSk7Ci0gICAgfQotICBzdHJjYXQgKGJ1ZiwgIjsiKTsKLQotICBpZiAoYXJncyAhPSBOVUxMKQotICAgIGZyZWUgKGFyZ3MpOwotCi0gIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgMCwgZGVmaW5pdGlvbiwgMCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1c2ggYSBjb25zdCB2ZXJzaW9uIG9mIGEgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2NvbnN0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgcmV0dXJuIHN0YWJfbW9kaWZ5X3R5cGUgKGluZm8sICdrJywgaW5mby0+dHlwZV9zdGFjay0+c2l6ZSwKLQkJCSAgIChsb25nICoqKSBOVUxMLCAoc2l6ZV90ICopIE5VTEwpOwotfQotCi0vKiBQdXNoIGEgdm9sYXRpbGUgdmVyc2lvbiBvZiBhIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl92b2xhdGlsZV90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBzdGFiX21vZGlmeV90eXBlIChpbmZvLCAnQicsIGluZm8tPnR5cGVfc3RhY2stPnNpemUsCi0JCQkgICAobG9uZyAqKikgTlVMTCwgKHNpemVfdCAqKSBOVUxMKTsKLX0KLQotLyogR2V0IHRoZSB0eXBlIGluZGV4IHRvIHVzZSBmb3IgYSBzdHJ1Y3QvdW5pb24vY2xhc3MgSUQuICBUaGlzIHNob3VsZAotICAgcmV0dXJuIC0xIGlmIGl0IGZhaWxzLiAgKi8KLQotc3RhdGljIGxvbmcKLXN0YWJfZ2V0X3N0cnVjdF9pbmRleCAoaW5mbywgdGFnLCBpZCwga2luZCwgcHNpemUpCi0gICAgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci0gICAgIHVuc2lnbmVkIGludCAqcHNpemU7Ci17Ci0gIGlmIChpZCA+PSBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc19hbGxvYykKLSAgICB7Ci0gICAgICBzaXplX3QgYWxsb2M7Ci0KLSAgICAgIGFsbG9jID0gaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNfYWxsb2M7Ci0gICAgICBpZiAoYWxsb2MgPT0gMCkKLQlhbGxvYyA9IDEwOwotICAgICAgd2hpbGUgKGlkID49IGFsbG9jKQotCWFsbG9jICo9IDI7Ci0gICAgICBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlcyA9Ci0JKHN0cnVjdCBzdGFiX3RhZyAqKSB4cmVhbGxvYyAoaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXMsCi0JCQkJICAgICAgYWxsb2MgKiBzaXplb2YgKHN0cnVjdCBzdGFiX3RhZykpOwotICAgICAgbWVtc2V0ICgoaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXMKLQkgICAgICAgKyBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc19hbGxvYyksCi0JICAgICAgMCwKLQkgICAgICAoKGFsbG9jIC0gaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNfYWxsb2MpCi0JICAgICAgICogc2l6ZW9mIChzdHJ1Y3Qgc3RhYl90YWcpKSk7Ci0gICAgICBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc19hbGxvYyA9IGFsbG9jOwotICAgIH0KLQotICBpZiAoaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNbaWRdLmluZGV4ID09IDApCi0gICAgewotICAgICAgaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNbaWRdLmluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKLSAgICAgICsraW5mby0+dHlwZV9pbmRleDsKLSAgICAgIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzW2lkXS50YWcgPSB0YWc7Ci0gICAgICBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc1tpZF0ua2luZCA9IGtpbmQ7Ci0gICAgfQotCi0gIGlmIChraW5kID09IERFQlVHX0tJTkRfSUxMRUdBTCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgZGVmaW5pdGlvbiBvZiB0aGUgc3RydWN0LiAgKi8KLSAgICAgIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzW2lkXS5raW5kID0ga2luZDsKLSAgICAgIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzW2lkXS5zaXplID0gKnBzaXplOwotICAgIH0KLSAgZWxzZQotICAgICpwc2l6ZSA9IGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzW2lkXS5zaXplOwotCi0gIHJldHVybiBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc1tpZF0uaW5kZXg7Ci19Ci0KLS8qIFN0YXJ0IG91dHB1dHRpbmcgYSBzdHJ1Y3QuICBXZSBpZ25vcmUgdGhlIHRhZywgYW5kIGhhbmRsZSBpdCBpbgotICAgc3RhYl90YWcuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1zdGFiX3N0YXJ0X3N0cnVjdF90eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgbG9uZyBpbmRleDsKLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICBjaGFyICpidWY7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoNDApOwotCi0gIGlmIChpZCA9PSAwKQotICAgIHsKLSAgICAgIGluZGV4ID0gMDsKLSAgICAgICpidWYgPSAnXDAnOwotICAgICAgZGVmaW5pdGlvbiA9IGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGluZGV4ID0gc3RhYl9nZXRfc3RydWN0X2luZGV4IChpbmZvLCB0YWcsIGlkLCBERUJVR19LSU5EX0lMTEVHQUwsCi0JCQkJICAgICAmc2l6ZSk7Ci0gICAgICBpZiAoaW5kZXggPCAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVsZD0iLCBpbmRleCk7Ci0gICAgICBkZWZpbml0aW9uID0gdHJ1ZTsKLSAgICB9Ci0KLSAgc3ByaW50ZiAoYnVmICsgc3RybGVuIChidWYpLCAiJWMldSIsCi0JICAgc3RydWN0cCA/ICdzJyA6ICd1JywKLQkgICBzaXplKTsKLQotICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCBkZWZpbml0aW9uLCBzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzID0gKGNoYXIgKikgeG1hbGxvYyAoMSk7Ci0gIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkc1swXSA9ICdcMCc7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIGZpZWxkIHRvIGEgc3RydWN0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfc3RydWN0X2ZpZWxkIChwLCBuYW1lLCBiaXRwb3MsIGJpdHNpemUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgYmZkX3ZtYSBiaXRzaXplOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGRlZmluaXRpb247Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBjaGFyICpzLCAqbjsKLSAgY29uc3QgY2hhciAqdmlzOwotCi0gIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+c2l6ZTsKLSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIC8qIEFkZCB0aGlzIGZpZWxkIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc3RydWN0IGZpZWxkcywgd2hpY2ggaXMKLSAgICAgY3VycmVudGx5IG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyAhPSBOVUxMKTsKLSAgbiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzKQotCQkJKyBzdHJsZW4gKG5hbWUpCi0JCQkrIHN0cmxlbiAocykKLQkJCSsgNTApOwotCi0gIHN3aXRjaCAodmlzaWJpbGl0eSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzoKLSAgICAgIHZpcyA9ICIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURToKLSAgICAgIHZpcyA9ICIvMCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ6Ci0gICAgICB2aXMgPSAiLzEiOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChiaXRzaXplID09IDApCi0gICAgewotICAgICAgYml0c2l6ZSA9IHNpemUgKiA4OwotICAgICAgaWYgKGJpdHNpemUgPT0gMCkKLQlmcHJpbnRmIChzdGRlcnIsCi0JCSBfKCIlczogd2FybmluZzogdW5rbm93biBzaXplIGZvciBmaWVsZCBgJXMnIGluIHN0cnVjdFxuIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbmZvLT5hYmZkKSwgbmFtZSk7Ci0gICAgfQotCi0gIHNwcmludGYgKG4sICIlcyVzOiVzJXMsJWxkLCVsZDsiLCBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMsIG5hbWUsIHZpcywgcywKLQkgICAobG9uZykgYml0cG9zLCAobG9uZykgYml0c2l6ZSk7Ci0KLSAgZnJlZSAoaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzKTsKLSAgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzID0gbjsKLQotICBpZiAoZGVmaW5pdGlvbikKLSAgICBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGEgc3RydWN0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZW5kX3N0cnVjdF90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGRlZmluaXRpb247Ci0gIGxvbmcgaW5kZXg7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBjaGFyICpmaWVsZHMsICpmaXJzdCwgKmJ1ZjsKLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTCAmJiBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMgIT0gTlVMTCk7Ci0KLSAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gIGluZGV4ID0gaW5mby0+dHlwZV9zdGFjay0+aW5kZXg7Ci0gIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT5zaXplOwotICBmaWVsZHMgPSBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHM7Ci0gIGZpcnN0ID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaXJzdCkgKyBzdHJsZW4gKGZpZWxkcykgKyAyKTsKLSAgc3ByaW50ZiAoYnVmLCAiJXMlczsiLCBmaXJzdCwgZmllbGRzKTsKLSAgZnJlZSAoZmlyc3QpOwotICBmcmVlIChmaWVsZHMpOwotCi0gIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIGRlZmluaXRpb24sIHNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBvdXRwdXR0aW5nIGEgY2xhc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9zdGFydF9jbGFzc190eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplLCB2cHRyLCBvd252cHRyKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdnB0cjsKLSAgICAgYm9vbGVhbiBvd252cHRyOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgY2hhciAqdnN0cmluZzsKLQotICBpZiAoISB2cHRyIHx8IG93bnZwdHIpCi0gICAgewotICAgICAgZGVmaW5pdGlvbiA9IGZhbHNlOwotICAgICAgdnN0cmluZyA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gICAgICB2c3RyaW5nID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0gICAgfQotCi0gIGlmICghIHN0YWJfc3RhcnRfc3RydWN0X3R5cGUgKHAsIHRhZywgaWQsIHN0cnVjdHAsIHNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodnB0cikKLSAgICB7Ci0gICAgICBjaGFyICp2dGFibGU7Ci0KLSAgICAgIGlmIChvd252cHRyKQotCXsKLQkgIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjay0+aW5kZXggPiAwKTsKLQkgIHZ0YWJsZSA9IChjaGFyICopIHhtYWxsb2MgKDIwKTsKLQkgIHNwcmludGYgKHZ0YWJsZSwgIn4lJSVsZCIsIGluZm8tPnR5cGVfc3RhY2stPmluZGV4KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdnRhYmxlID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuICh2c3RyaW5nKSArIDMpOwotCSAgc3ByaW50ZiAodnRhYmxlLCAifiUlJXMiLCB2c3RyaW5nKTsKLQkgIGZyZWUgKHZzdHJpbmcpOwotCX0KLQotICAgICAgaW5mby0+dHlwZV9zdGFjay0+dnRhYmxlID0gdnRhYmxlOwotICAgIH0KLQotICBpZiAoZGVmaW5pdGlvbikKLSAgICBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgc3RhdGljIG1lbWJlciB0byB0aGUgY2xhc3Mgb24gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9jbGFzc19zdGF0aWNfbWVtYmVyIChwLCBuYW1lLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGRlZmluaXRpb247Ci0gIGNoYXIgKnMsICpuOwotICBjb25zdCBjaGFyICp2aXM7Ci0KLSAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICAvKiBBZGQgdGhpcyBmaWVsZCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHN0cnVjdCBmaWVsZHMsIHdoaWNoIGlzCi0gICAgIGN1cnJlbnRseSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4gICovCi0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMgIT0gTlVMTCk7Ci0gIG4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcykKLQkJCSsgc3RybGVuIChuYW1lKQotCQkJKyBzdHJsZW4gKHMpCi0JCQkrIHN0cmxlbiAocGh5c25hbWUpCi0JCQkrIDEwKTsKLQotICBzd2l0Y2ggKHZpc2liaWxpdHkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QVUJMSUM6Ci0gICAgICB2aXMgPSAiIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU6Ci0gICAgICB2aXMgPSAiLzAiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOgotICAgICAgdmlzID0gIi8xIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBzcHJpbnRmIChuLCAiJXMlczolcyVzOiVzOyIsIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcywgbmFtZSwgdmlzLCBzLAotCSAgIHBoeXNuYW1lKTsKLQotICBmcmVlIChpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMpOwotICBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMgPSBuOwotCi0gIGlmIChkZWZpbml0aW9uKQotICAgIGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb24gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSBiYXNlIGNsYXNzIHRvIHRoZSBjbGFzcyBvbiB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2NsYXNzX2Jhc2VjbGFzcyAocCwgYml0cG9zLCB2aXJ0dWFsLCB2aXNpYmlsaXR5KQotICAgICBQVFIgcDsKLSAgICAgYmZkX3ZtYSBiaXRwb3M7Ci0gICAgIGJvb2xlYW4gdmlydHVhbDsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICBjaGFyICpzOwotICBjaGFyICpidWY7Ci0gIHVuc2lnbmVkIGludCBjOwotICBjaGFyICoqYmFzZWNsYXNzZXM7Ci0KLSAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICAvKiBCdWlsZCB0aGUgYmFzZSBjbGFzcyBzcGVjaWZpZXIuICAqLwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocykgKyAyNSk7Ci0gIGJ1ZlswXSA9IHZpcnR1YWwgPyAnMScgOiAnMCc7Ci0gIHN3aXRjaCAodmlzaWJpbGl0eSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU6Ci0gICAgICBidWZbMV0gPSAnMCc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ6Ci0gICAgICBidWZbMV0gPSAnMSc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QVUJMSUM6Ci0gICAgICBidWZbMV0gPSAnMic7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgc3ByaW50ZiAoYnVmICsgMiwgIiVsZCwlczsiLCAobG9uZykgYml0cG9zLCBzKTsKLSAgZnJlZSAocyk7Ci0KLSAgLyogQWRkIHRoZSBuZXcgYmFzZWNsYXNzIHRvIHRoZSBleGlzdGluZyBvbmVzLiAgKi8KLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTCAmJiBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMgIT0gTlVMTCk7Ci0KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzID09IE5VTEwpCi0gICAgYyA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjID0gMDsKLSAgICAgIHdoaWxlIChpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3Nlc1tjXSAhPSBOVUxMKQotCSsrYzsKLSAgICB9Ci0KLSAgYmFzZWNsYXNzZXMgPSAoY2hhciAqKikgeHJlYWxsb2MgKGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzLAotCQkJCSAgICAoYyArIDIpICogc2l6ZW9mICgqYmFzZWNsYXNzZXMpKTsKLSAgYmFzZWNsYXNzZXNbY10gPSBidWY7Ci0gIGJhc2VjbGFzc2VzW2MgKyAxXSA9IE5VTEw7Ci0KLSAgaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXMgPSBiYXNlY2xhc3NlczsKLQotICBpZiAoZGVmaW5pdGlvbikKLSAgICBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgYWRkaW5nIGEgbWV0aG9kIHRvIHRoZSBjbGFzcyBvbiB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2NsYXNzX3N0YXJ0X21ldGhvZCAocCwgbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgY2hhciAqbTsKLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTCAmJiBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMgIT0gTlVMTCk7Ci0KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBtID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDMpOwotICAgICAgKm0gPSAnXDAnOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG0gPSAoY2hhciAqKSB4cmVhbGxvYyAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcywKLQkJCSAgICAgKHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcykKLQkJCSAgICAgICsgc3RybGVuIChuYW1lKQotCQkJICAgICAgKyA0KSk7Ci0gICAgfQotCi0gIHNwcmludGYgKG0gKyBzdHJsZW4gKG0pLCAiJXM6OiIsIG5hbWUpOwotCi0gIGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgPSBtOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSB2YXJpYW50LCBlaXRoZXIgc3RhdGljIG9yIG5vdCwgdG8gdGhlIGN1cnJlbnQgbWV0aG9kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfY2xhc3NfbWV0aG9kX3ZhciAoaW5mbywgcGh5c25hbWUsIHZpc2liaWxpdHksIHN0YXRpY3AsIGNvbnN0cCwgdm9sYXRpbGVwLAotCQkgICAgICAgdm9mZnNldCwgY29udGV4dHApCi0gICAgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIHN0YXRpY3A7Ci0gICAgIGJvb2xlYW4gY29uc3RwOwotICAgICBib29sZWFuIHZvbGF0aWxlcDsKLSAgICAgYmZkX3ZtYSB2b2Zmc2V0OwotICAgICBib29sZWFuIGNvbnRleHRwOwotewotICBib29sZWFuIGRlZmluaXRpb247Ci0gIGNoYXIgKnR5cGU7Ci0gIGNoYXIgKmNvbnRleHQgPSBOVUxMOwotICBjaGFyIHZpc2MsIHF1YWxjLCB0eXBlYzsKLQotICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgdHlwZSA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIGlmIChjb250ZXh0cCkKLSAgICB7Ci0gICAgICBkZWZpbml0aW9uID0gZGVmaW5pdGlvbiB8fCBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICAgICAgY29udGV4dCA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotICAgIH0KLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTCAmJiBpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzICE9IE5VTEwpOwotCi0gIHN3aXRjaCAodmlzaWJpbGl0eSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU6Ci0gICAgICB2aXNjID0gJzAnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOgotICAgICAgdmlzYyA9ICcxJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzoKLSAgICAgIHZpc2MgPSAnMic7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGNvbnN0cCkKLSAgICB7Ci0gICAgICBpZiAodm9sYXRpbGVwKQotCXF1YWxjID0gJ0QnOwotICAgICAgZWxzZQotCXF1YWxjID0gJ0InOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICh2b2xhdGlsZXApCi0JcXVhbGMgPSAnQyc7Ci0gICAgICBlbHNlCi0JcXVhbGMgPSAnQSc7Ci0gICAgfQotCi0gIGlmIChzdGF0aWNwKQotICAgIHR5cGVjID0gJz8nOwotICBlbHNlIGlmICghIGNvbnRleHRwKQotICAgIHR5cGVjID0gJy4nOwotICBlbHNlCi0gICAgdHlwZWMgPSAnKic7Ci0KLSAgaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyA9Ci0gICAgKGNoYXIgKikgeHJlYWxsb2MgKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMsCi0JCSAgICAgICAoc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzKQotCQkJKyBzdHJsZW4gKHR5cGUpCi0JCQkrIHN0cmxlbiAocGh5c25hbWUpCi0JCQkrIChjb250ZXh0cCA/IHN0cmxlbiAoY29udGV4dCkgOiAwKQotCQkJKyA0MCkpOwotCi0gIHNwcmludGYgKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgKyBzdHJsZW4gKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMpLAotCSAgICIlczolczslYyVjJWMiLCB0eXBlLCBwaHlzbmFtZSwgdmlzYywgcXVhbGMsIHR5cGVjKTsKLSAgZnJlZSAodHlwZSk7Ci0KLSAgaWYgKGNvbnRleHRwKQotICAgIHsKLSAgICAgIHNwcmludGYgKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgKyBzdHJsZW4gKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMpLAotCSAgICAgICAiJWxkOyVzOyIsIChsb25nKSB2b2Zmc2V0LCBjb250ZXh0KTsKLSAgICAgIGZyZWUgKGNvbnRleHQpOwotICAgIH0KLQotICBpZiAoZGVmaW5pdGlvbikKLSAgICBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgdmFyaWFudCB0byB0aGUgY3VycmVudCBtZXRob2QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9jbGFzc19tZXRob2RfdmFyaWFudCAocCwgcGh5c25hbWUsIHZpc2liaWxpdHksIGNvbnN0cCwgdm9sYXRpbGVwLAotCQkJICAgdm9mZnNldCwgY29udGV4dHApCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgIGJvb2xlYW4gY29uc3RwOwotICAgICBib29sZWFuIHZvbGF0aWxlcDsKLSAgICAgYmZkX3ZtYSB2b2Zmc2V0OwotICAgICBib29sZWFuIGNvbnRleHRwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgcmV0dXJuIHN0YWJfY2xhc3NfbWV0aG9kX3ZhciAoaW5mbywgcGh5c25hbWUsIHZpc2liaWxpdHksIGZhbHNlLCBjb25zdHAsCi0JCQkJdm9sYXRpbGVwLCB2b2Zmc2V0LCBjb250ZXh0cCk7Ci19Ci0KLS8qIEFkZCBhIHN0YXRpYyB2YXJpYW50IHRvIHRoZSBjdXJyZW50IG1ldGhvZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCAocCwgcGh5c25hbWUsIHZpc2liaWxpdHksIGNvbnN0cCwgdm9sYXRpbGVwKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gc3RhYl9jbGFzc19tZXRob2RfdmFyIChpbmZvLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgdHJ1ZSwgY29uc3RwLAotCQkJCXZvbGF0aWxlcCwgMCwgZmFsc2UpOwotfQotCi0vKiBGaW5pc2ggdXAgYSBtZXRob2QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9jbGFzc19lbmRfbWV0aG9kIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMICYmIGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgIT0gTlVMTCk7Ci0KLSAgLyogV2UgYWxsb2NhdGVkIGVub3VnaCByb29tIG9uIGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgdG8gYWRkIHRoZQotICAgICB0cmFpbGluZyBzZW1pY29sb24uICAqLwotICBzdHJjYXQgKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMsICI7Iik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCBhIGNsYXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZW5kX2NsYXNzX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIHNpemVfdCBsZW47Ci0gIHVuc2lnbmVkIGludCBpID0gMDsKLSAgY2hhciAqYnVmOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMICYmIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyAhPSBOVUxMKTsKLQotICAvKiBXb3JrIG91dCB0aGUgc2l6ZSB3ZSBuZWVkIHRvIGFsbG9jYXRlIGZvciB0aGUgY2xhc3MgZGVmaW5pdGlvbi4gICovCi0KLSAgbGVuID0gKHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+c3RyaW5nKQotCSArIHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzKQotCSArIDEwKTsKLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzICE9IE5VTEwpCi0gICAgewotICAgICAgbGVuICs9IDIwOwotICAgICAgZm9yIChpID0gMDsgaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXNbaV0gIT0gTlVMTDsgaSsrKQotCWxlbiArPSBzdHJsZW4gKGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzW2ldKTsKLSAgICB9Ci0gIGlmIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzICE9IE5VTEwpCi0gICAgbGVuICs9IHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyk7Ci0gIGlmIChpbmZvLT50eXBlX3N0YWNrLT52dGFibGUgIT0gTlVMTCkKLSAgICBsZW4gKz0gc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT52dGFibGUpOwotCi0gIC8qIEJ1aWxkIHRoZSBjbGFzcyBkZWZpbml0aW9uLiAgKi8KLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOwotCi0gIHN0cmNweSAoYnVmLCBpbmZvLT50eXBlX3N0YWNrLT5zdHJpbmcpOwotCi0gIGlmIChpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3NlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNwcmludGYgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgIiEldSwiLCBpKTsKLSAgICAgIGZvciAoaSA9IDA7IGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzW2ldICE9IE5VTEw7IGkrKykKLQl7Ci0JICBzdHJjYXQgKGJ1ZiwgaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXNbaV0pOwotCSAgZnJlZSAoaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXNbaV0pOwotCX0KLSAgICAgIGZyZWUgKGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzKTsKLSAgICAgIGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzID0gTlVMTDsKLSAgICB9Ci0KLSAgc3RyY2F0IChidWYsIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyk7Ci0gIGZyZWUgKGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyk7Ci0gIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyA9IE5VTEw7Ci0KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJjYXQgKGJ1ZiwgaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyk7Ci0gICAgICBmcmVlIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzKTsKLSAgICAgIGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgPSBOVUxMOwotICAgIH0KLQotICBzdHJjYXQgKGJ1ZiwgIjsiKTsKLQotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+dnRhYmxlICE9IE5VTEwpCi0gICAgewotICAgICAgc3RyY2F0IChidWYsIGluZm8tPnR5cGVfc3RhY2stPnZ0YWJsZSk7Ci0gICAgICBmcmVlIChpbmZvLT50eXBlX3N0YWNrLT52dGFibGUpOwotICAgICAgaW5mby0+dHlwZV9zdGFjay0+dnRhYmxlID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogUmVwbGFjZSB0aGUgc3RyaW5nIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdpdGggdGhlIGNvbXBsZXRlCi0gICAgIGNsYXNzIGRlZmluaXRpb24uICAqLwotICBmcmVlIChpbmZvLT50eXBlX3N0YWNrLT5zdHJpbmcpOwotICBpbmZvLT50eXBlX3N0YWNrLT5zdHJpbmcgPSBidWY7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1c2ggYSB0eXBlZGVmIHdoaWNoIHdhcyBwcmV2aW91c2x5IGRlZmluZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl90eXBlZGVmX3R5cGUgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqaDsKLQotICBoID0gc3RyaW5nX2hhc2hfbG9va3VwICgmaW5mby0+dHlwZWRlZl9oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotICBhc3NlcnQgKGggIT0gTlVMTCAmJiBoLT5pbmRleCA+IDApOwotCi0gIHJldHVybiBzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLCBoLT5pbmRleCwgaC0+c2l6ZSk7Ci19Ci0KLS8qIFB1c2ggYSBzdHJ1Y3QsIHVuaW9uIG9yIGNsYXNzIHRhZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3RhZ190eXBlIChwLCBuYW1lLCBpZCwga2luZCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHVuc2lnbmVkIGludCBpZDsKLSAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBsb25nIGluZGV4OwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLQotICBpbmRleCA9IHN0YWJfZ2V0X3N0cnVjdF9pbmRleCAoaW5mbywgbmFtZSwgaWQsIGtpbmQsICZzaXplKTsKLSAgaWYgKGluZGV4IDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGluZGV4LCBzaXplKTsKLX0KLQotLyogRGVmaW5lIGEgdHlwZWRlZi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3R5cGRlZiAocCwgbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgbG9uZyBpbmRleDsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIGNoYXIgKnMsICpidWY7Ci0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqaDsKLQotICBpbmRleCA9IGluZm8tPnR5cGVfc3RhY2stPmluZGV4OwotICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+c2l6ZTsKLSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKHMpICsgMjApOwotCi0gIGlmIChpbmRleCA+IDApCi0gICAgc3ByaW50ZiAoYnVmLCAiJXM6dCVzIiwgbmFtZSwgcyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0gICAgICArK2luZm8tPnR5cGVfaW5kZXg7Ci0gICAgICBzcHJpbnRmIChidWYsICIlczp0JWxkPSVzIiwgbmFtZSwgaW5kZXgsIHMpOwotICAgIH0KLQotICBmcmVlIChzKTsKLQotICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9MU1lNLCAwLCAwLCBidWYpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChidWYpOwotCi0gIGggPSBzdHJpbmdfaGFzaF9sb29rdXAgKCZpbmZvLT50eXBlZGVmX2hhc2gsIG5hbWUsIHRydWUsIGZhbHNlKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oInN0cmluZ19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVzXG4iKSwKLQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJIGRvbid0IHRoaW5rIHdlIGNhcmUgYWJvdXQgcmVkZWZpbml0aW9ucy4gICovCi0KLSAgaC0+aW5kZXggPSBpbmRleDsKLSAgaC0+c2l6ZSA9IHNpemU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlZmluZSBhIHRhZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3RhZyAocCwgdGFnKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnMsICpidWY7Ci0KLSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAodGFnKSArIHN0cmxlbiAocykgKyAzKTsKLQotICBzcHJpbnRmIChidWYsICIlczpUJXMiLCB0YWcsIHMpOwotICBmcmVlIChzKTsKLQotICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9MU1lNLCAwLCAwLCBidWYpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZWZpbmUgYW4gaW50ZWdlciBjb25zdGFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2ludF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgY2hhciAqYnVmOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAyMCk7Ci0gIHNwcmludGYgKGJ1ZiwgIiVzOmM9aSVsZCIsIG5hbWUsIChsb25nKSB2YWwpOwotCi0gIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xTWU0sIDAsIDAsIGJ1ZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlZmluZSBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZmxvYXRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRvdWJsZSB2YWw7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgY2hhciAqYnVmOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAyMCk7Ci0gIHNwcmludGYgKGJ1ZiwgIiVzOmM9ZiVnIiwgbmFtZSwgdmFsKTsKLQotICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9MU1lNLCAwLCAwLCBidWYpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZWZpbmUgYSB0eXBlZCBjb25zdGFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3R5cGVkX2NvbnN0YW50IChwLCBuYW1lLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBjaGFyICpzLCAqYnVmOwotCi0gIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChzKSArIDIwKTsKLSAgc3ByaW50ZiAoYnVmLCAiJXM6Yz1lJXMsJWxkIiwgbmFtZSwgcywgKGxvbmcpIHZhbCk7Ci0gIGZyZWUgKHMpOwotCi0gIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xTWU0sIDAsIDAsIGJ1ZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlY29yZCBhIHZhcmlhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfdmFyaWFibGUgKHAsIG5hbWUsIGtpbmQsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgY2hhciAqcywgKmJ1ZjsKLSAgaW50IHN0YWJfdHlwZTsKLSAgY29uc3QgY2hhciAqa2luZHN0cjsKLQotICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgc3dpdGNoIChraW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICBjYXNlIERFQlVHX0dMT0JBTDoKLSAgICAgIHN0YWJfdHlwZSA9IE5fR1NZTTsKLSAgICAgIGtpbmRzdHIgPSAiRyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfU1RBVElDOgotICAgICAgc3RhYl90eXBlID0gTl9TVFNZTTsKLSAgICAgIGtpbmRzdHIgPSAiUyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfTE9DQUxfU1RBVElDOgotICAgICAgc3RhYl90eXBlID0gTl9TVFNZTTsKLSAgICAgIGtpbmRzdHIgPSAiViI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfTE9DQUw6Ci0gICAgICBzdGFiX3R5cGUgPSBOX0xTWU07Ci0gICAgICBraW5kc3RyID0gIiI7Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgYSB0eXBlIHJlZmVyZW5jZSBvciBkZWZpbml0aW9uLiAgKi8KLSAgICAgIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JewotCSAgY2hhciAqbjsKLQkgIGxvbmcgaW5kZXg7Ci0KLQkgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKLQkgICsraW5mby0+dHlwZV9pbmRleDsKLQkgIG4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHMpICsgMjApOwotCSAgc3ByaW50ZiAobiwgIiVsZD0lcyIsIGluZGV4LCBzKTsKLQkgIGZyZWUgKHMpOwotCSAgcyA9IG47Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX1JFR0lTVEVSOgotICAgICAgc3RhYl90eXBlID0gTl9SU1lNOwotICAgICAga2luZHN0ciA9ICJyIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChzKSArIDMpOwotICBzcHJpbnRmIChidWYsICIlczolcyVzIiwgbmFtZSwga2luZHN0ciwgcyk7Ci0gIGZyZWUgKHMpOwotCi0gIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBzdGFiX3R5cGUsIDAsIHZhbCwgYnVmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgb3V0cHV0dGluZyBhIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfc3RhcnRfZnVuY3Rpb24gKHAsIG5hbWUsIGdsb2JhbHApCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBib29sZWFuIGdsb2JhbHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgY2hhciAqcmV0dHlwZSwgKmJ1ZjsKLQotICBhc3NlcnQgKGluZm8tPm5lc3RpbmcgPT0gMCAmJiBpbmZvLT5mdW5fb2Zmc2V0ID09IC0xKTsKLQotICByZXR0eXBlID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAocmV0dHlwZSkgKyAzKTsKLSAgc3ByaW50ZiAoYnVmLCAiJXM6JWMlcyIsIG5hbWUsCi0JICAgZ2xvYmFscCA/ICdGJyA6ICdmJywKLQkgICByZXR0eXBlKTsKLQotICAvKiBXZSBkb24ndCBrbm93IHRoZSB2YWx1ZSBub3csIHNvIHdlIHNldCBpdCBpbiBzdGFydF9ibG9jay4gICovCi0gIGluZm8tPmZ1bl9vZmZzZXQgPSBpbmZvLT5zeW1ib2xzX3NpemU7Ci0KLSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fRlVOLCAwLCAwLCBidWYpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSBmdW5jdGlvbiBwYXJhbWV0ZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9mdW5jdGlvbl9wYXJhbWV0ZXIgKHAsIG5hbWUsIGtpbmQsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGVudW0gZGVidWdfcGFybV9raW5kIGtpbmQ7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnMsICpidWY7Ci0gIGludCBzdGFiX3R5cGU7Ci0gIGNoYXIga2luZGM7Ci0KLSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIHN3aXRjaCAoa2luZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgY2FzZSBERUJVR19QQVJNX1NUQUNLOgotICAgICAgc3RhYl90eXBlID0gTl9QU1lNOwotICAgICAga2luZGMgPSAncCc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfUEFSTV9SRUc6Ci0gICAgICBzdGFiX3R5cGUgPSBOX1JTWU07Ci0gICAgICBraW5kYyA9ICdQJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19QQVJNX1JFRkVSRU5DRToKLSAgICAgIHN0YWJfdHlwZSA9IE5fUFNZTTsKLSAgICAgIGtpbmRjID0gJ3YnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX1BBUk1fUkVGX1JFRzoKLSAgICAgIHN0YWJfdHlwZSA9IE5fUlNZTTsKLSAgICAgIGtpbmRjID0gJ2EnOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKHMpICsgMyk7Ci0gIHNwcmludGYgKGJ1ZiwgIiVzOiVjJXMiLCBuYW1lLCBraW5kYywgcyk7Ci0gIGZyZWUgKHMpOwotCi0gIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBzdGFiX3R5cGUsIDAsIHZhbCwgYnVmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgYSBibG9jay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3N0YXJ0X2Jsb2NrIChwLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgLyogRmlsbCBpbiBhbnkgc2xvdHMgd2hpY2ggaGF2ZSBiZWVuIHdhaXRpbmcgZm9yIHRoZSBmaXJzdCBrbm93bgotICAgICB0ZXh0IGFkZHJlc3MuICAqLwotCi0gIGlmIChpbmZvLT5zb19vZmZzZXQgIT0gLTEpCi0gICAgewotICAgICAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgYWRkciwgaW5mby0+c3ltYm9scyArIGluZm8tPnNvX29mZnNldCArIDgpOwotICAgICAgaW5mby0+c29fb2Zmc2V0ID0gLTE7Ci0gICAgfQotCi0gIGlmIChpbmZvLT5mdW5fb2Zmc2V0ICE9IC0xKQotICAgIHsKLSAgICAgIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIGFkZHIsIGluZm8tPnN5bWJvbHMgKyBpbmZvLT5mdW5fb2Zmc2V0ICsgOCk7Ci0gICAgICBpbmZvLT5mdW5fb2Zmc2V0ID0gLTE7Ci0gICAgfQotCi0gICsraW5mby0+bmVzdGluZzsKLQotICAvKiBXZSB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgdG9wIGxldmVsIGJsb2NrIHN1cnJvdW5kaW5nIHRoZQotICAgICBmdW5jdGlvbiwgYnV0IHN0YWJzIGluZm9ybWF0aW9uIGRvZXMgbm90IG91dHB1dCB0aGF0IGJsb2NrLCBzbyB3ZQotICAgICBpZ25vcmUgaXQuICAqLwotCi0gIGlmIChpbmZvLT5uZXN0aW5nID09IDEpCi0gICAgewotICAgICAgaW5mby0+Zm5hZGRyID0gYWRkcjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBXZSBoYXZlIHRvIG91dHB1dCB0aGUgTEJSQUMgc3ltYm9sIGFmdGVyIGFueSB2YXJpYWJsZXMgd2hpY2ggYXJlCi0gICAgIGRlY2xhcmVkIGluc2lkZSB0aGUgYmxvY2suICBXZSBwb3N0cG9uZSB0aGUgTEJSQUMgdW50aWwgdGhlIG5leHQKLSAgICAgc3RhcnRfYmxvY2sgb3IgZW5kX2Jsb2NrLiAgKi8KLQotICAvKiBJZiB3ZSBoYXZlIHBvc3Rwb25lZCBhbiBMQlJBQywgb3V0cHV0IGl0IG5vdy4gICovCi0gIGlmIChpbmZvLT5wZW5kaW5nX2xicmFjICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9MQlJBQywgMCwgaW5mby0+cGVuZGluZ19sYnJhYywKLQkJCSAgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFJlbWVtYmVyIHRoZSBhZGRyZXNzIGFuZCBvdXRwdXQgaXQgbGF0ZXIuICAqLwotCi0gIGluZm8tPnBlbmRpbmdfbGJyYWMgPSBhZGRyIC0gaW5mby0+Zm5hZGRyOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBFbmQgYSBibG9jay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2VuZF9ibG9jayAocCwgYWRkcikKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIGlmIChhZGRyID4gaW5mby0+bGFzdF90ZXh0X2FkZHJlc3MpCi0gICAgaW5mby0+bGFzdF90ZXh0X2FkZHJlc3MgPSBhZGRyOwotCi0gIC8qIElmIHdlIGhhdmUgcG9zdHBvbmVkIGFuIExCUkFDLCBvdXRwdXQgaXQgbm93LiAgKi8KLSAgaWYgKGluZm8tPnBlbmRpbmdfbGJyYWMgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xCUkFDLCAwLCBpbmZvLT5wZW5kaW5nX2xicmFjLAotCQkJICAgICAgIChjb25zdCBjaGFyICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZm8tPnBlbmRpbmdfbGJyYWMgPSAoYmZkX3ZtYSkgLTE7Ci0gICAgfQotCi0gIGFzc2VydCAoaW5mby0+bmVzdGluZyA+IDApOwotCi0gIC0taW5mby0+bmVzdGluZzsKLQotICAvKiBXZSBpZ25vcmUgdGhlIG91dGVybW9zdCBibG9jay4gICovCi0gIGlmIChpbmZvLT5uZXN0aW5nID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX1JCUkFDLCAwLCBhZGRyIC0gaW5mby0+Zm5hZGRyLAotCQkJICAgIChjb25zdCBjaGFyICopIE5VTEwpOwotfQotCi0vKiBFbmQgYSBmdW5jdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXN0YWJfZW5kX2Z1bmN0aW9uIChwKQotICAgICBQVFIgcDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIGxpbmUgbnVtYmVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfbGluZW5vIChwLCBmaWxlLCBsaW5lbm8sIGFkZHIpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBsb25nIGxpbmVubzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT5saW5lbm9fZmlsZW5hbWUgIT0gTlVMTCk7Ci0KLSAgaWYgKGFkZHIgPiBpbmZvLT5sYXN0X3RleHRfYWRkcmVzcykKLSAgICBpbmZvLT5sYXN0X3RleHRfYWRkcmVzcyA9IGFkZHI7Ci0KLSAgaWYgKHN0cmNtcCAoZmlsZSwgaW5mby0+bGluZW5vX2ZpbGVuYW1lKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX1NPTCwgMCwgYWRkciwgZmlsZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5mby0+bGluZW5vX2ZpbGVuYW1lID0gZmlsZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX1NMSU5FLCBsaW5lbm8sIGFkZHIgLSBpbmZvLT5mbmFkZHIsCi0JCQkgICAgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci19CmRpZmYgLS1naXQgYS9jb25maWctbWwuaW4gYi9jb25maWctbWwuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwM2Y3Y2YuLjAwMDAwMDAKLS0tIGEvY29uZmlnLW1sLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjg3ICswLDAgQEAKLSMgQ29uZmlndXJlIGZyYWdtZW50IGludm9rZWQgaW4gdGhlIHBvc3QtdGFyZ2V0IHNlY3Rpb24gZm9yIHN1YmRpcnMKLSMgd2FudGluZyBtdWx0aWxpYiBzdXBwb3J0LgotIwotIyBJdCBpcyBhZHZpc2FibGUgdG8gc3VwcG9ydCBhIGZldyAtLWVuYWJsZS8tLWRpc2FibGUgb3B0aW9ucyB0byBsZXQgdGhlCi0jIHVzZXIgc2VsZWN0IHdoaWNoIGxpYnJhcmllcyBzL2hlIHJlYWxseSB3YW50cy4KLSMKLSMgU3ViZGlyZWN0b3JpZXMgd2lzaGluZyB0byB1c2UgbXVsdGlsaWIgc2hvdWxkIHB1dCB0aGUgZm9sbG93aW5nIGxpbmVzCi0jIGluIHRoZSAicG9zdC10YXJnZXQiIHNlY3Rpb24gb2YgY29uZmlndXJlLmluLgotIwotIyBpZiBbICIke3NyY2Rpcn0iID0gIi4iIF0gOyB0aGVuCi0jICAgaWYgWyAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiAhPSAiLiIgXSA7IHRoZW4KLSMgICAgIC4gJHt3aXRoX211bHRpc3JjdG9wfS4uLy4uL2NvbmZpZy1tbC5pbgotIyAgIGVsc2UKLSMgICAgIC4gJHt3aXRoX211bHRpc3JjdG9wfS4uL2NvbmZpZy1tbC5pbgotIyAgIGZpCi0jIGVsc2UKLSMgICAuICR7c3JjZGlyfS8uLi9jb25maWctbWwuaW4KLSMgZmkKLSMKLSMgU2VlIGxpYnJ4L2NvbmZpZ3VyZS5pbiBpbiB0aGUgbGliZysrIGRpc3RyaWJ1dGlvbiBmb3IgYW4gZXhhbXBsZSBvZiBob3cKLSMgdG8gaGFuZGxlIGF1dG9jb25mJ2QgbGlicmFyaWVzLgotIwotIyBUaGluZ3MgYXJlIGNvbXBsaWNhdGVkIGJlY2F1c2UgNiBzZXBhcmF0ZSBjYXNlcyBtdXN0IGJlIGhhbmRsZWQ6Ci0jIDIgKG5hdGl2ZSwgY3Jvc3MpIHggMyAoYWJzb2x1dGUtcGF0aCwgcmVsYXRpdmUtbm90LWRvdCwgZG90KSA9IDYuCi0jCi0jIHNyY2Rpcj0uIGlzIHNwZWNpYWwuICBJdCBtdXN0IGhhbmRsZSBtYWtlIHByb2dyYW1zIHRoYXQgZG9uJ3QgaGFuZGxlIFZQQVRILgotIyBUbyBpbXBsZW1lbnQgdGhpcywgYSBzeW1saW5rIHRyZWUgaXMgYnVpbHQgZm9yIGVhY2ggbGlicmFyeSBhbmQgZm9yIGVhY2gKLSMgbXVsdGlsaWIgc3ViZGlyLgotIwotIyBUaGUgYnVpbGQgdHJlZSBpcyBsYXllZCBvdXQgYXMKLSMKLSMgLi8KLSMgICBsaWJnKysKLSMgICBuZXdsaWIKLSMgICBtNjgwMjAvCi0jICAgICAgICAgIGxpYmcrKwotIyAgICAgICAgICBuZXdsaWIKLSMgICAgICAgICAgbTY4ODgxLwotIyAgICAgICAgICAgICAgICAgbGliZysrCi0jICAgICAgICAgICAgICAgICBuZXdsaWIKLSMKLSMgVGhlIG5pY2UgZmVhdHVyZSBhYm91dCB0aGlzIGFycmFuZ2VtZW50IGlzIHRoYXQgaW50ZXItbGlicmFyeSByZWZlcmVuY2VzCi0jIGluIHRoZSBidWlsZCB0cmVlIHdvcmsgd2l0aG91dCBoYXZpbmcgdG8gY2FyZSB3aGVyZSB5b3UgYXJlLiAgTm90ZSB0aGF0Ci0jIGludGVyLWxpYnJhcnkgcmVmZXJlbmNlcyBhbHNvIHdvcmsgaW4gdGhlIHNvdXJjZSB0cmVlIGJlY2F1c2Ugc3ltbGluayB0cmVlcwotIyBhcmUgYnVpbHQgd2hlbiBzcmNkaXI9LgotIwotIyBVbmZvcnR1bmF0ZWx5LCB0cnlpbmcgdG8gYWNjZXNzIHRoZSBsaWJyYXJpZXMgaW4gdGhlIGJ1aWxkIHRyZWUgcmVxdWlyZXMKLSMgdGhlIHVzZXIgdG8gbWFudWFsbHkgY2hvb3NlIHdoaWNoIGxpYnJhcnkgdG8gdXNlIGFzIEdDQyB3b24ndCBiZSBhYmxlIHRvCi0jIGZpbmQgdGhlIHJpZ2h0IG9uZS4gIFRoaXMgaXMgdmlld2VkIGFzIHRoZSBsZXNzZXIgb2YgdHdvIGV2aWxzLgotIwotIyBDb25maWd1cmUgdmFyaWFibGVzOgotIyAke3dpdGhfdGFyZ2V0X3N1YmRpcn0gPSAiLiIgZm9yIG5hdGl2ZSwgb3IgJHt0YXJnZXRfYWxpYXN9IGZvciBjcm9zcy4KLSMgU2V0IGJ5IHRvcCBsZXZlbCBNYWtlZmlsZS4KLSMgJHt3aXRoX211bHRpc3JjdG9wfSA9IGhvdyBtYW55IGxldmVscyBvZiBtdWx0aWxpYnMgdGhlcmUgYXJlIGluIHRoZSBzb3VyY2UKLSMgdHJlZS4gIEl0IGV4aXN0cyB0byBoYW5kbGUgdGhlIGNhc2Ugb2YgY29uZmlndXJpbmcgaW4gdGhlIHNvdXJjZSB0cmVlOgotIyAke3NyY2Rpcn0gaXMgbm90IGNvbnN0YW50LgotIyAke3dpdGhfbXVsdGlzdWJkaXJ9ID0gbmFtZSBvZiBtdWx0aWxpYiBzdWJkaXJlY3RvcnkgKGVnOiBtNjgwMjAvbTY4ODgxKS4KLSMKLSMgTWFrZWZpbGUgdmFyaWFibGVzOgotIyBNVUxUSVNSQ1RPUCA9IG51bWJlciBvZiBtdWx0aWxpYiBsZXZlbHMgaW4gc291cmNlIHRyZWUgKCsxIGlmIGNyb3NzKQotIyAoRklYTUU6IG5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCB0aGFuICR7d2l0aF9tdWx0aXNyY3RvcH0uICBDaGVjayBvdXQuKS4KLSMgTVVMVElCVUlMRFRPUCA9IG51bWJlciBvZiBtdWx0aWxpYiBsZXZlbHMgaW4gYnVpbGQgdHJlZQotIyBNVUxUSURJUlMgPSBsaXN0IG9mIG11bHRpbGliIHN1YmRpcnMgKGVnOiBtNjgwMDAgbTY4MDIwIC4uLikKLSMgKG9ubHkgZGVmaW5lZCBpbiBlYWNoIGxpYnJhcnkncyBtYWluIE1ha2VmaWxlKS4KLSMgTVVMVElTVUJESVIgPSBpbnN0YWxsZWQgc3ViZGlyZWN0b3J5IG5hbWUgd2l0aCBsZWFkaW5nICcvJyAoZWc6IC9tNjgwMDApCi0jIChvbmx5IGRlZmluZWQgaW4gZWFjaCBtdWx0aWxpYiBzdWJkaXIpLgotCi0jIEZJWE1FOiBNdWx0aWxpYiBpcyBjdXJyZW50bHkgZGlzYWJsZWQgYnkgZGVmYXVsdCBmb3IgZXZlcnl0aGluZyBvdGhlciB0aGFuCi0jIG5ld2xpYi4gIEl0IGlzIHVwIHRvIGVhY2ggdGFyZ2V0IHRvIHR1cm4gb24gbXVsdGlsaWIgc3VwcG9ydCBmb3IgdGhlIG90aGVyCi0jIGxpYnJhcmllcyBhcyBkZXNpcmVkLgotCi0jIFdlIGhhdmUgdG8gaGFuZGxlIGJlaW5nIGludm9rZWQgYnkgYm90aCBDeWdudXMgY29uZmlndXJlIGFuZCBBdXRvY29uZi4KLSMKLSMgQ3lnbnVzIGNvbmZpZ3VyZSBpbmNvbWluZyB2YXJpYWJsZXM6Ci0jIHNyY2Rpciwgc3ViZGlyLCBob3N0LCBhcmd1bWVudHMKLSMKLSMgQXV0b2NvbmYgaW5jb21pbmcgdmFyaWFibGVzOgotIyBzcmNkaXIsIGhvc3QsIGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIFdlICpjb3VsZCogZmlndXJlIHNyY2RpciBhbmQgaG9zdCBvdXQsIGJ1dCB3ZSdkIGhhdmUgdG8gZG8gd29yayB0aGF0Ci0jIG91ciBjYWxsZXIgaGFzIGFscmVhZHkgZG9uZSB0byBmaWd1cmUgdGhlbSBvdXQgYW5kIHJlcXVpcmluZyB0aGVzZSB0d28KLSMgc2VlbXMgcmVhc29uYWJsZS4KLSMgTm90ZSB0aGF0IGBob3N0JyBpbiB0aGlzIGNhc2UgaXMgR0NDJ3MgYHRhcmdldCcuICBUYXJnZXQgbGlicmFyaWVzIGFyZQotIyBjb25maWd1cmVkIGZvciBhIHBhcnRpY3VsYXIgaG9zdC4KLQotaWYgWyAtbiAiJHthY19jb25maWd1cmVfYXJnc30iIF07IHRoZW4KLSAgTWFrZWZpbGU9JHthY19maWxlLU1ha2VmaWxlfQotICBtbF9jb25maWdfc2hlbGw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSAgbWxfYXJndW1lbnRzPSIke2FjX2NvbmZpZ3VyZV9hcmdzfSIKLSAgbWxfcmVhbHNyY2Rpcj0ke3NyY2Rpcn0KLWVsc2UKLSAgTWFrZWZpbGU9JHtNYWtlZmlsZS1NYWtlZmlsZX0KLSAgbWxfY29uZmlnX3NoZWxsPSR7Y29uZmlnX3NoZWxsLS9iaW4vc2h9Ci0gIG1sX2FyZ3VtZW50cz0iJHthcmd1bWVudHN9IgotICBpZiBbIC1uICIke3N1YmRpcn0iIC1hICIke3N1YmRpcn0iICE9ICIuIiBdIDsgdGhlbgotICAgIG1sX3JlYWxzcmNkaXI9JHtzcmNkaXJ9LyR7c3ViZGlyfQotICBlbHNlCi0gICAgbWxfcmVhbHNyY2Rpcj0ke3NyY2Rpcn0KLSAgZmkKLWZpCi0KLSMgU2NhbiBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgc2V0IGFsbCB0aGUgb25lcyB3ZSBuZWVkLgotCi1tbF92ZXJib3NlPS0tdmVyYm9zZQotZm9yIG9wdGlvbiBpbiAke21sX2FyZ3VtZW50c30KLWRvCi0gIGNhc2UgJG9wdGlvbiBpbgotICAtLSopIDs7Ci0gIC0qKSBvcHRpb249LSRvcHRpb24gOzsKLSAgZXNhYwotCi0gIGNhc2UgJG9wdGlvbiBpbgotICAtLSo9KikKLQlvcHRhcmc9YGVjaG8gJG9wdGlvbiB8IHNlZCAtZSAncy9eW149XSo9Ly8nYAotCTs7Ci0gIGVzYWMKLQotICBjYXNlICRvcHRpb24gaW4KLSAgLS1kaXNhYmxlLSopCi0JZW5hYmxlb3B0PWBlY2hvICR7b3B0aW9ufSB8IHNlZCAnczpeLS1kaXNhYmxlLTplbmFibGVfOjtzOi06XzpnJ2AKLQlldmFsICRlbmFibGVvcHQ9bm8KLQk7OwotICAtLWVuYWJsZS0qKQotCWNhc2UgIiRvcHRpb24iIGluCi0JKj0qKQk7OwotCSopCW9wdGFyZz15ZXMgOzsKLQllc2FjCi0JZW5hYmxlb3B0PWBlY2hvICR7b3B0aW9ufSB8IHNlZCAnczpeLS06OjtzOj0uKiQ6OjtzOi06XzpnJ2AKLQlldmFsICRlbmFibGVvcHQ9IiRvcHRhcmciCi0JOzsKLSAgLS1ub3JlY3Vyc2lvbiB8IC0tbm8qKQotCW1sX25vcmVjdXJzaW9uPXllcwotCTs7Ci0gIC0tc2lsZW50IHwgLS1zaWwqIHwgLS1xdWlldCB8IC0tcSopCi0JbWxfdmVyYm9zZT0tLXNpbGVudAotCTs7Ci0gIC0tdmVyYm9zZSB8IC0tdiB8IC0tdmVyYiopCi0JbWxfdmVyYm9zZT0tLXZlcmJvc2UKLQk7OwotICAtLXdpdGgtKikKLQljYXNlICIkb3B0aW9uIiBpbgotCSo9KikJOzsKLQkqKQlvcHRhcmc9eWVzIDs7Ci0JZXNhYwotCXdpdGhvcHQ9YGVjaG8gJHtvcHRpb259IHwgc2VkICdzOl4tLTo6O3M6PS4qJDo6O3M6LTpfOmcnYAotCWV2YWwgJHdpdGhvcHQ9IiRvcHRhcmciCi0JOzsKLSAgLS13aXRob3V0LSopCi0Jd2l0aG9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czpvdXQ6OjtzOi06XzpnJ2AKLQlldmFsICR3aXRob3B0PW5vCi0JOzsKLSAgZXNhYwotZG9uZQotCi0jIE9ubHkgZG8gdGhpcyBpZiAtLWVuYWJsZS1tdWx0aWxpYi4KLWlmIFsgIiR7ZW5hYmxlX211bHRpbGlifSIgPSB5ZXMgXTsgdGhlbgotCi0jIENvbXB1dGUgd2hldGhlciB0aGlzIGlzIHRoZSBsaWJyYXJ5J3MgdG9wIGxldmVsIGRpcmVjdG9yeQotIyAoaWU6IG5vdCBhIG11bHRpbGliIHN1YmRpcmVjdG9yeSwgYW5kIG5vdCBhIHN1YmRpcmVjdG9yeSBsaWtlIGxpYmcrKy9zcmMpLgotIyAke3dpdGhfbXVsdGlzdWJkaXJ9IHRlbGxzIHVzIHdlJ3JlIGluIHRoZSByaWdodCBicmFuY2gsIGJ1dCB3ZSBjb3VsZCBiZQotIyBpbiBhIHN1YmRpciBvZiB0aGF0LgotIyA/Pz8gVGhlIHByZXZpb3VzIHZlcnNpb24gY291bGQgdm9pZCB0aGlzIHRlc3QgYnkgc2VwYXJhdGluZyB0aGUgcHJvY2VzcyBpbnRvCi0jIHR3byBmaWxlczogb25lIHRoYXQgb25seSB0aGUgbGlicmFyeSdzIHRvcGxldmVsIGNvbmZpZ3VyZS5pbiByYW4gKHRvCi0jIGNvbmZpZ3VyZSB0aGUgbXVsdGlsaWIgc3ViZGlycyksIGFuZCBhbm90aGVyIHRoYXQgYWxsIGNvbmZpZ3VyZS5pbidzIHJhbiB0bwotIyB1cGRhdGUgdGhlIE1ha2VmaWxlLiAgSXQgc2VlbWVkIHJlYXNvbmFibGUgdG8gY29sbGFwc2UgYWxsIG11bHRpbGliIHN1cHBvcnQKLSMgaW50byBvbmUgZmlsZSwgYnV0IGl0IGRvZXMgbGVhdmUgdXMgd2l0aCBoYXZpbmcgdG8gcGVyZm9ybSB0aGlzIHRlc3QuCi1tbF90b3BsZXZlbF9wPW5vCi1pZiBbIC16ICIke3dpdGhfbXVsdGlzdWJkaXJ9IiBdOyB0aGVuCi0gIGlmIFsgIiR7c3JjZGlyfSIgPSAiLiIgXTsgdGhlbgotICAgICMgVXNlICR7bWxfcmVhbHNyY2Rpcn0gaW5zdGVhZCBvZiAke3NyY2Rpcn0gaGVyZSB0byBhY2NvdW50IGZvciAke3N1YmRpcn0uCi0gICAgIyAke3dpdGhfdGFyZ2V0X3N1YmRpcn0gPSAiLiIgZm9yIG5hdGl2ZSwgb3RoZXJ3aXNlIHRhcmdldCBhbGlhcy4KLSAgICBpZiBbICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iID0gIi4iIF07IHRoZW4KLSAgICAgIGlmIFsgLWYgJHttbF9yZWFsc3JjZGlyfS8uLi9jb25maWctbWwuaW4gXTsgdGhlbgotCW1sX3RvcGxldmVsX3A9eWVzCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGlmIFsgLWYgJHttbF9yZWFsc3JjZGlyfS8uLi8uLi9jb25maWctbWwuaW4gXTsgdGhlbgotCW1sX3RvcGxldmVsX3A9eWVzCi0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICAjIFVzZSAke21sX3JlYWxzcmNkaXJ9IGluc3RlYWQgb2YgJHtzcmNkaXJ9IGhlcmUgdG8gYWNjb3VudCBmb3IgJHtzdWJkaXJ9LgotICAgIGlmIFsgLWYgJHttbF9yZWFsc3JjZGlyfS8uLi9jb25maWctbWwuaW4gXTsgdGhlbgotICAgICAgbWxfdG9wbGV2ZWxfcD15ZXMKLSAgICBmaQotICBmaQotZmkKLQotIyBJZiB0aGlzIGlzIHRoZSBsaWJyYXJ5J3MgdG9wIGxldmVsIGRpcmVjdG9yeSwgc2V0IG11bHRpZGlycyB0byB0aGUKLSMgbXVsdGlsaWIgc3ViZGlycyB0byBzdXBwb3J0LiAgVGhpcyBsaXZlcyBhdCB0aGUgdG9wIGJlY2F1c2Ugd2UgbmVlZAotIyBgbXVsdGlkaXJzJyBzZXQgcmlnaHQgYXdheS4KLQotaWYgWyAiJHttbF90b3BsZXZlbF9wfSIgPSB5ZXMgXTsgdGhlbgotCi1tdWx0aWRpcnM9Ci1mb3IgaSBpbiBgJHtDQy1nY2N9IC0tcHJpbnQtbXVsdGktbGliIDI+L2Rldi9udWxsYDsgZG8KLSAgZGlyPWBlY2hvICRpIHwgc2VkIC1lICdzLzsuKiQvLydgCi0gIGlmIFsgIiR7ZGlyfSIgPSAiLiIgXTsgdGhlbgotICAgIHRydWUKLSAgZWxzZQotICAgIGlmIFsgLXogIiR7bXVsdGlkaXJzfSIgXTsgdGhlbgotICAgICAgbXVsdGlkaXJzPSIke2Rpcn0iCi0gICAgZWxzZQotICAgICAgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHtkaXJ9IgotICAgIGZpCi0gIGZpCi1kb25lCi0KLSMgVGFyZ2V0IGxpYnJhcmllcyBhcmUgY29uZmlndXJlZCBmb3IgdGhlIGhvc3QgdGhleSBydW4gb24sIHNvIHdlIGNoZWNrCi0jICRob3N0IGhlcmUsIG5vdCAkdGFyZ2V0LgotCi1jYXNlICIke2hvc3R9IiBpbgotYXJjLSotZWxmKikKLQlpZiBbIHgkZW5hYmxlX2JpZW5kaWFuICE9IHh5ZXMgXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9JHttdWx0aWRpcnN9Ci0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR7eH0iIGluCi0JICAgICAgKmJlKikgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCTs7Ci1hcm0tKi0qKQotCWlmIFsgeCIkZW5hYmxlX2ZwdSIgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9JHttdWx0aWRpcnN9Ci0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR7eH0iIGluCi0JICAgICAgKmZwdSopIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgiJGVuYWJsZV8yNmJpdCIgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9JHttdWx0aWRpcnN9Ci0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR7eH0iIGluCi0JICAgICAgKjI2Yml0KikgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCIkZW5hYmxlX3VuZGVyc2NvcmUiID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSR7bXVsdGlkaXJzfQotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIke3h9IiBpbgotCSAgICAgICp1bmRlciopIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgiJGVuYWJsZV9pbnRlcndvcmsiID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSR7bXVsdGlkaXJzfQotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIke3h9IiBpbgotCSAgICAgICppbnRlcndvcmsqKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9iaWVuZGlhbiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbGUqICkgOiA7OwotCSAgICAgICpiZSogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JOzsKLW02OCotKi0qKQotCWlmIFsgeCRlbmFibGVfc29mdGZsb2F0ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICpzb2Z0LWZsb2F0KiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX202ODg4MSA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbTY4ODgxKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX202ODAwMCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbTY4MDAwKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX202ODAyMCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbTY4MDIwKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQk7OwotbWlwcyotKi0qKQotCWlmIFsgeCRlbmFibGVfc2luZ2xlX2Zsb2F0ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICpzaW5nbGUqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfYmllbmRpYW4gPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKmVsKiApIDogOzsKLQkgICAgICAqZWIqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfc29mdGZsb2F0ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICpzb2Z0LWZsb2F0KiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQk7OwotcG93ZXJwYyotKi0qIHwgcnM2MDAwKi0qLSopCi0JaWYgWyB4JGVuYWJsZV9zb2Z0ZmxvYXQgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKnNvZnQtZmxvYXQqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfcG93ZXJjcHUgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgcG93ZXIgfCAqL3Bvd2VyIHwgKi9wb3dlci8qICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfcG93ZXJwY2NwdSA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqcG93ZXJwYyogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9wb3dlcnBjb3MgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKm1jYWxsLWxpbnV4KiB8ICptY2FsbC1zb2xhcmlzKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX2JpZW5kaWFuID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICptbGl0dGxlKiB8ICptYmlnKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX3N5c3YgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKm1jYWxsLXN5c3YqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfYWl4ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICptY2FsbC1haXgqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCTs7Ci1lc2FjCi0KLSMgUmVtb3ZlIGV4dHJhbmVvdXMgYmxhbmtzIGZyb20gbXVsdGlkaXJzLgotIyBUZXN0cyBsaWtlIGBpZiBbIC1uICIkbXVsdGlkaXJzIiBdJyByZXF1aXJlIGl0LgotbXVsdGlkaXJzPWBlY2hvICIkbXVsdGlkaXJzIiB8IHNlZCAtZSAncy9eWyBdWyBdKi8vJyAtZSAncy9bIF1bIF0qJC8vJyAtZSAncy9bIF1bIF0qLyAvZydgCi0KLSMgQWRkIGNvZGUgdG8gbGlicmFyeSdzIHRvcCBsZXZlbCBtYWtlZmlsZSB0byBoYW5kbGUgYnVpbGRpbmcgdGhlIG11bHRpbGliCi0jIHN1YmRpcnMuCi0KLWNhdCA+IE11bHRpLnRlbSA8PFxFT0YKLQotIyBGSVhNRTogVGhlcmUgc2hvdWxkIGJlIGFuIEAtc2lnbiBpbiBmcm9udCBvZiB0aGUgYGlmJy4KLSMgTGVhdmUgb3V0IHVudGlsIHRoaXMgaXMgdGVzdGVkIGEgYml0IG1vcmUuCi1tdWx0aS1kbzoKLQlpZiBbIC16ICIkKE1VTFRJRElSUykiIF07IHRoZW4gXAotCSAgdHJ1ZTsgXAotCWVsc2UgXAotCSAgcm9vdHByZT1gcHdkYC87IGV4cG9ydCByb290cHJlOyBcCi0JICBzcmNyb290cHJlPWBjZCAkKHNyY2Rpcik7IHB3ZGAvOyBleHBvcnQgc3Jjcm9vdHByZTsgXAotCSAgbGliPWBlY2hvICQke3Jvb3RwcmV9IHwgc2VkIC1lICdzLF4uKi9cKFteL11bXi9dKlwpLyQkLFwxLCdgOyBcCi0JICBjb21waWxlcj0iJChDQykiOyBcCi0JICBmb3IgaSBpbiBgJCR7Y29tcGlsZXJ9IC0tcHJpbnQtbXVsdGktbGliIDI+L2Rldi9udWxsYDsgZG8gXAotCSAgICBkaXI9YGVjaG8gJCRpIHwgc2VkIC1lICdzLzsuKiQkLy8nYDsgXAotCSAgICBpZiBbICIkJHtkaXJ9IiA9ICIuIiBdOyB0aGVuIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGlmIFsgLWQgLi4vJCR7ZGlyfS8kJHtsaWJ9IF07IHRoZW4gXAotCQlmbGFncz1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXlteO10qOy8vJyAtZSAncy9ALyAtL2cnYDsgXAotCQlpZiAoY2QgLi4vJCR7ZGlyfS8kJHtsaWJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgXAotCQkJCUNGTEFHUz0iJChDRkxBR1MpICQke2ZsYWdzfSIgXAotCQkJCUNYWEZMQUdTPSIkKENYWEZMQUdTKSAkJHtmbGFnc30iIFwKLQkJCQlMSUJDRkxBR1M9IiQoTElCQ0ZMQUdTKSAkJHtmbGFnc30iIFwKLQkJCQlMSUJDWFhGTEFHUz0iJChMSUJDWFhGTEFHUykgJCR7ZmxhZ3N9IiBcCi0JCQkJTERGTEFHUz0iJChMREZMQUdTKSAkJHtmbGFnc30iIFwKLQkJCQkkKERPKSk7IHRoZW4gXAotCQkgIHRydWU7IFwKLQkJZWxzZSBcCi0JCSAgZXhpdCAxOyBcCi0JCWZpOyBcCi0JICAgICAgZWxzZSB0cnVlOyBcCi0JICAgICAgZmk7IFwKLQkgICAgZmk7IFwKLQkgIGRvbmU7IFwKLQlmaQotCi0jIEZJWE1FOiBUaGVyZSBzaG91bGQgYmUgYW4gQC1zaWduIGluIGZyb250IG9mIHRoZSBgaWYnLgotIyBMZWF2ZSBvdXQgdW50aWwgdGhpcyBpcyB0ZXN0ZWQgYSBiaXQgbW9yZS4KLW11bHRpLWNsZWFuOgotCWlmIFsgLXogIiQoTVVMVElESVJTKSIgXTsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxzZSBcCi0JICBsaWI9YHB3ZCB8IHNlZCAtZSAncyxeLiovXChbXi9dW14vXSpcKSQkLFwxLCdgOyBcCi0JICBmb3IgZGlyIGluIE1ha2VmaWxlICQoTVVMVElESVJTKTsgZG8gXAotCSAgICBpZiBbIC1mIC4uLyQke2Rpcn0vJCR7bGlifS9NYWtlZmlsZSBdOyB0aGVuIFwKLQkgICAgICBpZiAoY2QgLi4vJCR7ZGlyfS8kJHtsaWJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgJChETykpOyBcCi0JICAgICAgdGhlbiB0cnVlOyBcCi0JICAgICAgZWxzZSBleGl0IDE7IFwKLQkgICAgICBmaTsgXAotCSAgICBlbHNlIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGRvbmU7IFwKLQlmaQotRU9GCi0KLWNhdCAke01ha2VmaWxlfSBNdWx0aS50ZW0gPiBNYWtlZmlsZS50ZW0KLXJtIC1mICR7TWFrZWZpbGV9IE11bHRpLnRlbQotbXYgTWFrZWZpbGUudGVtICR7TWFrZWZpbGV9Ci0KLWZpICMgJHttbF90b3BsZXZlbF9wfSA9IHllcwotCi1pZiBbICIke21sX3ZlcmJvc2V9IiA9IC0tdmVyYm9zZSBdOyB0aGVuCi0gIGVjaG8gIkFkZGluZyBtdWx0aWxpYiBzdXBwb3J0IHRvIE1ha2VmaWxlIGluICR7bWxfcmVhbHNyY2Rpcn0iCi0gIGlmIFsgIiR7bWxfdG9wbGV2ZWxfcH0iID0geWVzIF07IHRoZW4KLSAgICBlY2hvICJtdWx0aWRpcnM9JHttdWx0aWRpcnN9IgotICBmaQotICBlY2hvICJ3aXRoX211bHRpc3ViZGlyPSR7d2l0aF9tdWx0aXN1YmRpcn0iCi1maQotCi1pZiBbICIke3NyY2Rpcn0iID0gIi4iIF07IHRoZW4KLSAgaWYgWyAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiAhPSAiLiIgXTsgdGhlbgotICAgIG1sX3NyY2RvdGRvdD0iLi4vIgotICBlbHNlCi0gICAgbWxfc3JjZG90ZG90PSIiCi0gIGZpCi1lbHNlCi0gIG1sX3NyY2RvdGRvdD0iIgotZmkKLQotaWYgWyAteiAiJHt3aXRoX211bHRpc3ViZGlyfSIgXTsgdGhlbgotICBtbF9zdWJkaXI9Ci0gIG1sX2J1aWxkZG90ZG90PQotICA6ICMgbWxfc3JjZG90ZG90PSAjIGFscmVhZHkgc2V0Ci1lbHNlCi0gIG1sX3N1YmRpcj0iLyR7d2l0aF9tdWx0aXN1YmRpcn0iCi0gICMgVGhlICdbXi9dW14vXSonIGFwcGVhcnMgdGhhdCB3YXkgdG8gd29yayBhcm91bmQgYSBTdW5PUyBzZWQgYnVnLgotICBtbF9idWlsZGRvdGRvdD1gZWNobyAke3dpdGhfbXVsdGlzdWJkaXJ9IHwgc2VkIC1lICdzOlteL11bXi9dKjouLjpnJ2AvCi0gIGlmIFsgIiRzcmNkaXIiID0gIi4iIF07IHRoZW4KLSAgICBtbF9zcmNkb3Rkb3Q9JHttbF9zcmNkb3Rkb3R9JHttbF9idWlsZGRvdGRvdH0KLSAgZWxzZQotICAgIDogIyBtbF9zcmNkb3Rkb3Q9ICMgYWxyZWFkeSBzZXQKLSAgZmkKLWZpCi0KLWlmIFsgIiR7bWxfdG9wbGV2ZWxfcH0iID0geWVzIF07IHRoZW4KLSAgbWxfZG89JyQoTUFLRSknCi0gIG1sX2NsZWFuPSckKE1BS0UpJwotZWxzZQotICBtbF9kbz10cnVlCi0gIG1sX2NsZWFuPXRydWUKLWZpCi0KLSMgVE9QIGlzIHVzZWQgYnkgbmV3bGliIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZWxzZXdoZXJlIGZvciB0aGlzIHB1cnBvc2UuCi0jIE1VTFRJe1NSQyxCVUlMRH1UT1AgYXJlIHRoZSBwcm9wZXIgb25lcyB0byB1c2UuICBNVUxUSVNSQ1RPUCBpcyBlbXB0eQotIyB3aGVuIHNyY2RpciAhPSBidWlsZGRpci4gIE1VTFRJQlVJTERUT1AgaXMgYWx3YXlzIHNvbWUgbnVtYmVyIG9mIC4uLydzLgotIyBGSVhNRTogbmV3bGliIG5lZWRzIHRvIGJlIHVwZGF0ZWQgdG8gdXNlIE1VTFRJe1NSQyxCVUlMRH1UT1Agc28gd2UgY2FuCi0jIGRlbGV0ZSBUT1AuICBOZXdsaWIgbWF5IHdpc2ggdG8gY29udGludWUgdG8gdXNlIFRPUCBmb3IgaXRzIG93biBwdXJwb3NlcwotIyBvZiBjb3Vyc2UuCi0jIE1VTFRJRElSUyBpcyBub24tZW1wdHkgZm9yIHRoZSBjcHUgdG9wIGxldmVsIE1ha2VmaWxlIChlZzogbmV3bGliL01ha2VmaWxlKQotIyBhbmQgbGlzdHMgdGhlIHN1YmRpcmVjdG9yaWVzIHRvIHJlY3Vyc2UgaW50by4KLSMgTVVMVElTVUJESVIgaXMgbm9uLWVtcHR5IGluIGVhY2ggY3B1IHN1YmRpcmVjdG9yeSdzIE1ha2VmaWxlCi0jIChlZzogbmV3bGliL2g4MzAwaC9NYWtlZmlsZSkgYW5kIGlzIHRoZSBpbnN0YWxsZWQgc3ViZGlyZWN0b3J5IG5hbWUgd2l0aAotIyBhIGxlYWRpbmcgJy8nLgotIyBNVUxUSURPIGlzIHVzZWQgZm9yIHRhcmdldHMgbGlrZSBhbGwsIGluc3RhbGwsIGFuZCBjaGVjayB3aGVyZQotIyAkKEZMQUdTX1RPX1BBU1MpIGF1Z21lbnRlZCB3aXRoIHRoZSBzdWJkaXIncyBjb21waWxlciBvcHRpb24gaXMgbmVlZGVkLgotIyBNVUxUSUNMRUFOIGlzIHVzZWQgZm9yIHRoZSAqY2xlYW4gdGFyZ2V0cy4KLSMKLSMgPz8/IEl0IGlzIHBvc3NpYmxlIHRvIG1lcmdlIE1VTFRJRE8gYW5kIE1VTFRJQ0xFQU4gaW50byBvbmUuICBUaGV5IGFyZQotIyBjdXJyZW50bHkga2VwdCBzZXBhcmF0ZSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdGhlICpjbGVhbiB0YXJnZXRzIHRvIHJlcXVpcmUKLSMgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgY29tcGlsZXIgKHdoaWNoIE1VTFRJRE8gY3VycmVudGx5IHJlcXVpcmVzKSBhbmQKLSMgdGhlcmVmb3JlIHdlJ2QgaGF2ZSB0byByZWNvcmQgdGhlIGRpcmVjdG9yeSBvcHRpb25zIGFzIHdlbGwgYXMgbmFtZXMKLSMgKGN1cnJlbnRseSB3ZSBqdXN0IHJlY29yZCB0aGUgbmFtZXMgYW5kIHVzZSAtLXByaW50LW11bHRpLWxpYiB0byBnZXQgdGhlCi0jIG9wdGlvbnMpLgotCi1zZWQgLWUgInM6XlRPUFsgCV0qPVsgCV0qXChbLi9dKlwpWyAJXSokOlRPUCA9ICR7bWxfYnVpbGRkb3Rkb3R9XDE6IiBcCi0gICAgLWUgInM6Xk1VTFRJU1JDVE9QWyAJXSo9LiokOk1VTFRJU1JDVE9QID0gJHttbF9zcmNkb3Rkb3R9OiIgXAotICAgIC1lICJzOl5NVUxUSUJVSUxEVE9QWyAJXSo9LiokOk1VTFRJQlVJTERUT1AgPSAke21sX2J1aWxkZG90ZG90fToiIFwKLSAgICAtZSAiczpeTVVMVElESVJTWyAJXSo9LiokOk1VTFRJRElSUyA9ICR7bXVsdGlkaXJzfToiIFwKLSAgICAtZSAiczpeTVVMVElTVUJESVJbIAldKj0uKiQ6TVVMVElTVUJESVIgPSAke21sX3N1YmRpcn06IiBcCi0gICAgLWUgInM6Xk1VTFRJRE9bIAldKj0uKiQ6TVVMVElETyA9ICRtbF9kbzoiIFwKLSAgICAtZSAiczpeTVVMVElDTEVBTlsgCV0qPS4qJDpNVUxUSUNMRUFOID0gJG1sX2NsZWFuOiIgXAotCSR7TWFrZWZpbGV9ID4gTWFrZWZpbGUudGVtCi1ybSAtZiAke01ha2VmaWxlfQotbXYgTWFrZWZpbGUudGVtICR7TWFrZWZpbGV9Ci0KLSMgSWYgdGhpcyBpcyB0aGUgbGlicmFyeSdzIHRvcCBsZXZlbCwgY29uZmlndXJlIGVhY2ggbXVsdGlsaWIgc3ViZGlyLgotIyBUaGlzIGlzIGRvbmUgYXQgdGhlIGVuZCBiZWNhdXNlIHRoaXMgaXMgdGhlIGxvb3AgdGhhdCBydW5zIGNvbmZpZ3VyZQotIyBpbiBlYWNoIG11bHRpbGliIHN1YmRpciBhbmQgaXQgc2VlbWVkIHJlYXNvbmFibGUgdG8gZmluaXNoIHVwZGF0aW5nIHRoZQotIyBNYWtlZmlsZSBiZWZvcmUgZ29pbmcgb24gdG8gY29uZmlndXJlIHRoZSBzdWJkaXJzLgotCi1pZiBbICIke21sX3RvcGxldmVsX3B9IiA9IHllcyBdOyB0aGVuCi0KLSMgV2UgbXVzdCBmcmVzaGx5IGNvbmZpZ3VyZSBlYWNoIHN1YmRpcmVjdG9yeS4gIFRoaXMgYml0IG9mIGNvZGUgaXMKLSMgYWN0dWFsbHkgcGFydGlhbGx5IHN0b2xlbiBmcm9tIHRoZSBtYWluIGNvbmZpZ3VyZSBzY3JpcHQuICBGSVhNRS4KLQotaWYgWyAtbiAiJHttdWx0aWRpcnN9IiBdICYmIFsgLXogIiR7bWxfbm9yZWN1cnNpb259IiBdOyB0aGVuCi0KLSAgaWYgWyAiJHttbF92ZXJib3NlfSIgPSAtLXZlcmJvc2UgXTsgdGhlbgotICAgIGVjaG8gIlJ1bm5pbmcgY29uZmlndXJlIGluIG11bHRpbGliIHN1YmRpcnMgJHttdWx0aWRpcnN9IgotICAgIGVjaG8gInB3ZDogYHB3ZGAiCi0gIGZpCi0KLSAgbWxfb3JpZ2Rpcj1gcHdkYAotICBtbF9saWJkaXI9YGVjaG8gJG1sX29yaWdkaXIgfCBzZWQgLWUgJ3MsXi4qLywsJ2AKLSAgIyBjZCB0byB0b3AtbGV2ZWwtYnVpbGQtZGlyLyR7d2l0aF90YXJnZXRfc3ViZGlyfQotICBjZCAuLgotCi0gIGZvciBtbF9kaXIgaW4gJHttdWx0aWRpcnN9OyBkbwotCi0gICAgaWYgWyAiJHttbF92ZXJib3NlfSIgPSAtLXZlcmJvc2UgXTsgdGhlbgotICAgICAgZWNobyAiUnVubmluZyBjb25maWd1cmUgaW4gbXVsdGlsaWIgc3ViZGlyICR7bWxfZGlyfSIKLSAgICAgIGVjaG8gInB3ZDogYHB3ZGAiCi0gICAgZmkKLQotICAgIGlmIFsgLWQgJHttbF9kaXJ9IF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciAke21sX2Rpcn07IGZpCi0gICAgaWYgWyAtZCAke21sX2Rpcn0vJHttbF9saWJkaXJ9IF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciAke21sX2Rpcn0vJHttbF9saWJkaXJ9OyBmaQotCi0gICAgIyBFZzogaWYgJHttbF9kaXJ9ID0gbTY4MDAwL202ODg4MSwgZG90ZG90ID0gLi4vLi4vCi0gICAgZG90ZG90PS4uL2BlY2hvICR7bWxfZGlyfSB8IHNlZCAtZSAnc3xbXi9dfHxnJyAtZSAnc3wvfC4uL3xnJ2AKLQotICAgIGNhc2UgJHtzcmNkaXJ9IGluCi0gICAgIi4iKQotICAgICAgZWNobyBCdWlsZGluZyBzeW1saW5rIHRyZWUgaW4gYHB3ZGAvJHttbF9kaXJ9LyR7bWxfbGliZGlyfQotICAgICAgaWYgWyAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiAhPSAiLiIgXTsgdGhlbgotCW1sX3Vuc3ViZGlyPSIuLi8iCi0gICAgICBlbHNlCi0JbWxfdW5zdWJkaXI9IiIKLSAgICAgIGZpCi0gICAgICAoY2QgJHttbF9kaXJ9LyR7bWxfbGliZGlyfTsKLSAgICAgICAuLi8ke2RvdGRvdH0ke21sX3Vuc3ViZGlyfXN5bWxpbmstdHJlZSAuLi8ke2RvdGRvdH0ke21sX3Vuc3ViZGlyfSR7bWxfbGliZGlyfSAiIikKLSAgICAgIGlmIFsgLWYgJHttbF9kaXJ9LyR7bWxfbGliZGlyfS9NYWtlZmlsZSBdOyB0aGVuCi0JaWYgWyB4IiR7TUFLRX0iID0geCBdOyB0aGVuCi0JICAoY2QgJHttbF9kaXJ9LyR7bWxfbGliZGlyfTsgbWFrZSBkaXN0Y2xlYW4pCi0JZWxzZQotCSAgKGNkICR7bWxfZGlyfS8ke21sX2xpYmRpcn07ICR7TUFLRX0gZGlzdGNsZWFuKQotCWZpCi0gICAgICBmaQotICAgICAgbWxfbmV3c3JjZGlyPSIuIgotICAgICAgbWxfc3JjZGlyb3B0aW9uPQotICAgICAgbXVsdGlzcmN0b3A9JHtkb3Rkb3R9Ci0gICAgICA7OwotICAgICopCi0gICAgICBjYXNlICIke3NyY2Rpcn0iIGluCi0gICAgICAvKikgIyBhYnNvbHV0ZSBwYXRoCi0gICAgICAgIG1sX25ld3NyY2Rpcj0ke3NyY2Rpcn0KLSAgICAgICAgOzsKLSAgICAgICopICMgb3RoZXJ3aXNlIHJlbGF0aXZlCi0gICAgICAgIG1sX25ld3NyY2Rpcj0ke2RvdGRvdH0ke3NyY2Rpcn0KLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIG1sX3NyY2Rpcm9wdGlvbj0iLXNyY2Rpcj0ke21sX25ld3NyY2Rpcn0iCi0gICAgICBtdWx0aXNyY3RvcD0KLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgY2FzZSAiJHtwcm9nbmFtZX0iIGluCi0gICAgLyopICAgICBtbF9yZWNwcm9nPSR7cHJvZ25hbWV9IDs7Ci0gICAgKikgICAgICBtbF9yZWNwcm9nPSR7ZG90ZG90fSR7cHJvZ25hbWV9IDs7Ci0gICAgZXNhYwotCi0gICAgIyBGSVhNRTogUE9QRElSPSR7UFdEPWBwd2RgfSBkb2Vzbid0IHdvcmsgaGVyZS4KLSAgICBNTF9QT1BESVI9YHB3ZGAKLSAgICBjZCAke21sX2Rpcn0vJHttbF9saWJkaXJ9Ci0KLSAgICBpZiBbIC1mICR7bWxfbmV3c3JjZGlyfS9jb25maWd1cmUgXTsgdGhlbgotICAgICAgbWxfcmVjcHJvZz0ke21sX25ld3NyY2Rpcn0vY29uZmlndXJlCi0gICAgZmkKLSAgICBpZiBldmFsICR7bWxfY29uZmlnX3NoZWxsfSAke21sX3JlY3Byb2d9IFwKLQktLXdpdGgtbXVsdGlzdWJkaXI9JHttbF9kaXJ9IC0td2l0aC1tdWx0aXNyY3RvcD0ke211bHRpc3JjdG9wfSBcCi0JJHttbF9hcmd1bWVudHN9ICR7bWxfc3JjZGlyb3B0aW9ufSA7IHRoZW4KLSAgICAgIHRydWUKLSAgICBlbHNlCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgY2QgJHtNTF9QT1BESVJ9Ci0KLSAgZG9uZQotCi0gIGNkICR7bWxfb3JpZ2Rpcn0KLWZpCi0KLWZpICMgJHttbF90b3BsZXZlbF9wfSA9IHllcwotZmkgIyAke2VuYWJsZV9tdWx0aWxpYn0gPSB5ZXMKZGlmZiAtLWdpdCBhL2NvbmZpZy5ndWVzcyBiL2NvbmZpZy5ndWVzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2M3NWE4MC4uMDAwMDAwMAotLS0gYS9jb25maWcuZ3Vlc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDA4ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIFdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIgPGJvdGhuZXJAY3lnbnVzLmNvbT4uCi0jIFRoZSBtYXN0ZXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaXMgYXQgdGhlIEZTRiBpbiAvaG9tZS9nZC9nbnUvbGliLgotIwotIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCi0jIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAotIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KLSMKLSMgVGhlIHBsYW4gaXMgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgYnkgY29uZmlndXJlIHNjcmlwdHMgaWYgeW91Ci0jIGRvbid0IHNwZWNpZnkgYW4gZXhwbGljaXQgc3lzdGVtIHR5cGUgKGhvc3QvdGFyZ2V0IG5hbWUpLgotIwotIyBPbmx5IGEgZmV3IHN5c3RlbXMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoaXMgbGlzdDsgcGxlYXNlIGFkZCBvdGhlcnMKLSMgKGJ1dCB0cnkgdG8ga2VlcCB0aGUgc3RydWN0dXJlIGNsZWFuKS4KLSMKLQotIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KLSMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSA4LzI0Lzk0LikKLWlmICh0ZXN0IC1mIC8uYXR0YmluL3VuYW1lKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0JUEFUSD0kUEFUSDovLmF0dGJpbiA7IGV4cG9ydCBQQVRICi1maQotCi1VTkFNRV9NQUNISU5FPWAodW5hbWUgLW0pIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9NQUNISU5FPXVua25vd24KLVVOQU1FX1JFTEVBU0U9YCh1bmFtZSAtcikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1JFTEVBU0U9dW5rbm93bgotVU5BTUVfU1lTVEVNPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9TWVNURU09dW5rbm93bgotVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCi0KLXRyYXAgJ3JtIC1mIGR1bW15LmMgZHVtbXkubyBkdW1teTsgZXhpdCAxJyAxIDIgMTUKLQotIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgotCi1jYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCi0gICAgYWxwaGE6T1NGMToqOiopCi0JaWYgdGVzdCAkVU5BTUVfUkVMRUFTRSA9ICJWNC4wIjsgdGhlbgotCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkM30nYAotCWZpCi0JIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCi0JIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KLQkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KLQkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KLQljYXQgPDxFT0YgPmR1bW15LnMKLQkuZ2xvYmwgbWFpbgotCS5lbnQgbWFpbgotbWFpbjoKLQkuZnJhbWUgXCQzMCwwLFwkMjYsMAotCS5wcm9sb2d1ZSAwCi0JLmxvbmcgMHg0N2UwM2Q4MCAjIGltcGx2ZXIgJDAKLQlsZGEgXCQyLDI1OQotCS5sb25nIDB4NDdlMjBjMjEgIyBhbWFzayAkMiwkMQotCXNybCBcJDEsOCxcJDIKLQlzbGwgXCQyLDIsXCQyCi0Jc2xsIFwkMCwzLFwkMAotCWFkZGwgXCQxLFwkMCxcJDAKLQlhZGRsIFwkMixcJDAsXCQwCi0JcmV0IFwkMzEsKFwkMjYpLDEKLQkuZW5kIG1haW4KLUVPRgotCSR7Q0MtY2N9IGR1bW15LnMgLW8gZHVtbXkgMj4vZGV2L251bGwKLQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgotCQkuL2R1bW15Ci0JCWNhc2UgIiQ/IiBpbgotCQkJNykKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIKLQkJCQk7OwotCQkJMTUpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiCi0JCQkJOzsKLQkJCTE0KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIKLQkJCQk7OwotCQkJMTApCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIKLQkJCQk7OwotCQkJMTYpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiCi0JCQkJOzsKLQkJZXNhYwotCWZpCi0Jcm0gLWYgZHVtbXkucyBkdW1teQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1ZUWF0vLycgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCi0JZXhpdCAwIDs7Ci0gICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQotCWVjaG8gYWxwaGEtZGVjLXdpbm50My41Ci0JZXhpdCAwIDs7Ci0gICAgQW1pZ2EqOlVOSVhfU3lzdGVtX1Y6NC4wOiopCi0JZWNobyBtNjhrLWNibS1zeXN2NAotCWV4aXQgMDs7Ci0gICAgYW1pZ2E6TmV0QlNEOio6KikKLSAgICAgIGVjaG8gbTY4ay1jYm0tbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotICAgICAgZXhpdCAwIDs7Ci0gICAgYW1pZ2E6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOltBYV1taWdhW09vXVtTc106KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWFtaWdhb3MKLQlleGl0IDAgOzsKLSAgICBhcmM2NDpPcGVuQlNEOio6KikKLQllY2hvIG1pcHM2NGVsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhcmM6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGhrbWlwczpPcGVuQlNEOio6KikKLQllY2hvIG1pcHMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHBtYXg6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHNnaTpPcGVuQlNEOio6KikKLQllY2hvIG1pcHMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHdncmlzYzpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQotCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDA7OwotICAgIGFybTMyOk5ldEJTRDoqOiopCi0JZWNobyBhcm0tdW5rbm93bi1uZXRic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKLQlleGl0IDAgOzsKLSAgICBTUjI/MDE6SEktVVgvTVBQOio6KikKLQllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCi0JZXhpdCAwOzsKLSAgICBQeXJhbWlkKjpPU3gqOio6KnxNSVMqOk9TeCo6KjoqKQotCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCi0JaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgotCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MwotCWVsc2UKLQkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCi0JZmkKLQlleGl0IDAgOzsKLSAgICBOSUxFOio6KjpkY29zeCkKLQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0Ci0JZXhpdCAwIDs7Ci0gICAgc3VuNEg6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1oYWwtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQotCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgaTg2cGM6U3VuT1M6NS4qOiopCi0JZWNobyBpMzg2LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuNCo6U3VuT1M6Nio6KikKLQkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQotCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0Ci0JIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KLQllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjQqOlN1bk9TOio6KikKLQljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCi0JICAgIFNlcmllcyp8UzQqKQotCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKLQkJOzsKLQllc2FjCi0JIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgotCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuMyo6U3VuT1M6KjoqKQotCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3VuKjoqOjQuMkJTRDoqKQotCVVOQU1FX1JFTEVBU0U9YChoZWFkIC0xIC9ldGMvbW90ZCB8IGF3ayAne3ByaW50IHN1YnN0cigkNSwxLDMpfScpIDI+L2Rldi9udWxsYAotCXRlc3QgIngke1VOQU1FX1JFTEVBU0V9IiA9ICJ4IiAmJiBVTkFNRV9SRUxFQVNFPTMKLQljYXNlICJgL2Jpbi9hcmNoYCIgaW4KLQkgICAgc3VuMykKLQkJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQkJOzsKLQkgICAgc3VuNCkKLQkJZWNobyBzcGFyYy1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JZXNhYwotCWV4aXQgMCA7OwotICAgIGF1c2hwOlN1bk9TOio6KikKLQllY2hvIHNwYXJjLWF1c3BleC1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhdGFyaSo6TmV0QlNEOio6KikKLQllY2hvIG02OGstYXRhcmktbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGF0YXJpKjpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHN1bjMqOk5ldEJTRDoqOiopCi0JZWNobyBtNjhrLXN1bi1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3VuMyo6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtYWM2OGs6TmV0QlNEOio6KikKLQllY2hvIG02OGstYXBwbGUtbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1hYzY4azpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG12bWU2OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtdm1lODhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTg4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgcG93ZXJwYzptYWNodGVuOio6KikKLQllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBSSVNDKjpNYWNoOio6KikKLQllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCi0JZXhpdCAwIDs7Ci0gICAgUklTQyo6VUxUUklYOio6KikKLQllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBWQVgqOlVMVFJJWCo6KjoqKQotCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgMjAyMDpDTElYOio6KikKLQllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQotCXNlZCAncy9eCS8vJyA8PCBFT0YgPmR1bW15LmMKLQlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKiphcmd2OyB7Ci0JI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNlbmRpZgotCSAgZXhpdCAoLTEpOwotCX0KLUVPRgotCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgXAotCSAgJiYgLi9kdW1teSBgZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCBcCi0JICAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCXJtIC1mIGR1bW15LmMgZHVtbXkKLQllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgTmlnaHRfSGF3azpQb3dlcl9VTklYOio6KikKLQllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VydW5peAotCWV4aXQgMCA7OwotICAgIG04OGs6Q1gvVVg6Nyo6KikKLQllY2hvIG04OGstaGFycmlzLWN4dXg3Ci0JZXhpdCAwIDs7Ci0gICAgbTg4azoqOjQqOlI0KikKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjQKLQlleGl0IDAgOzsKLSAgICBtODhrOio6Myo6UjMqKQotCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MwotCWV4aXQgMCA7OwotICAgIEFWaWlPTjpkZ3V4Oio6KikKLSAgICAgICAgIyBERy9VWCByZXR1cm5zIEFWaWlPTiBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKLSAgICAgICAgVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKLSAgICAgICAgaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCAtbyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdIDsgdGhlbgotCWlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IFwKLQkgICAgIC1vICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXSA7IHRoZW4KLQkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JZWxzZQotCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KLQlmaQotICAgICAgICBlbHNlIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBmaQotIAlleGl0IDAgOzsKLSAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQotCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgTTg4KjoqOlIzKjoqKQotCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKLQlleGl0IDAgOzsKLSAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKLQllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKLQllY2hvIG02OGstdGVrdHJvbml4LWJzZAotCWV4aXQgMCA7OwotICAgICo6SVJJWCo6KjoqKQotCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKLQlleGl0IDAgOzsKLSAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCi0JZWNobyByb21wLWlibS1haXggICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKLSAgICBpPzg2OkFJWDoqOiopCi0JZWNobyBpMzg2LWlibS1haXgKLQlleGl0IDAgOzsKLSAgICAqOkFJWDoyOjMpCi0JaWYgZ3JlcCBib3MzMjUgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCXNlZCAncy9eCQkvLycgPDwgRU9GID5kdW1teS5jCi0JCSNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+Ci0KLQkJbWFpbigpCi0JCQl7Ci0JCQlpZiAoIV9fcG93ZXJfcGMoKSkKLQkJCQlleGl0KDEpOwotCQkJcHV0cygicG93ZXJwYy1pYm0tYWl4My4yLjUiKTsKLQkJCWV4aXQoMCk7Ci0JCQl9Ci1FT0YKLQkJJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAmJiAuL2R1bW15ICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCi0JCXJtIC1mIGR1bW15LmMgZHVtbXkKLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMi41Ci0JZWxpZiBncmVwIGJvczMyNCAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMi40Ci0JZWxzZQotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yCi0JZmkKLQlleGl0IDAgOzsKLSAgICAqOkFJWDoqOjQpCi0JaWYgL3Vzci9zYmluL2xzYXR0ciAtRUhsIHByb2MwIHwgZ3JlcCBQT1dFUiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJSUJNX0FSQ0g9cnM2MDAwCi0JZWxzZQotCQlJQk1fQVJDSD1wb3dlcnBjCi0JZmkKLQlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KLQkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKLQllbHNlCi0JCUlCTV9SRVY9NC4ke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLQllY2hvICR7SUJNX0FSQ0h9LWlibS1haXgke0lCTV9SRVZ9Ci0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6KjoqKQotCWVjaG8gcnM2MDAwLWlibS1haXgKLQlleGl0IDAgOzsKLSAgICBpYm1ydDo0LjRCU0Q6Knxyb21wLWlibTpCU0Q6KikKLQllY2hvIHJvbXAtaWJtLWJzZDQuNAotCWV4aXQgMCA7OwotICAgIGlibXJ0OipCU0Q6Knxyb21wLWlibTpCU0Q6KikgICAgICAgICAgICAjIGNvdmVycyBSVC9QQyBOZXRCU0QgYW5kCi0JZWNobyByb21wLWlibS1ic2Qke1VOQU1FX1JFTEVBU0V9ICAgIyA0LjMgd2l0aCB1bmFtZSBhZGRlZCB0bwotCWV4aXQgMCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwb3J0OiByb21wLWlibSBCU0QgNC4zCi0gICAgKjpCT1NYOio6KikKLQllY2hvIHJzNjAwMC1idWxsLWJvc3gKLQlleGl0IDAgOzsKLSAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQotCWVjaG8gbTY4ay1idWxsLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC9bMzRdPz86NC4zYnNkOjEuKjoqKQotCWVjaG8gbTY4ay1ocC1ic2QKLQlleGl0IDAgOzsKLSAgICBocDMwMDo0LjRCU0Q6KjoqIHwgOTAwMC9bMzRdPz86NC4zYnNkOjIuKjoqKQotCWVjaG8gbTY4ay1ocC1ic2Q0LjQKLQlleGl0IDAgOzsKLSAgICAqOT8/KjpNUEUvaVg6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAotCWV4aXQgMCA7OwotICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKLQkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OwotCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSApCi0KLSAgICAgICAgICAgICAgc2VkICdzL14gICAgICAgICAgICAgIC8vJyA8PCBFT0YgPmR1bW15LmMKLSAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgotICAgICAgICAgICAgICAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBpbnQgbWFpbiAoKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKLSAgICAgICAgICAgICAgICAgIGxvbmcgYml0cyA9IHN5c2NvbmYoX1NDX0tFUk5FTF9CSVRTKTsKLSAgICAgICAgICAgICAgI2VuZGlmIAotICAgICAgICAgICAgICAgICAgbG9uZyBjcHUgID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNwdSkgCi0gICAgICAgICAgICAgIAl7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xIik7IGJyZWFrOwotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzJfMDogCi0gICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKLSAgICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGJpdHMpIAotICAgICAgICAgICAgICAJCXsKLSAgICAgICAgICAgICAgCQljYXNlIDY0OiBwdXRzICgiaHBwYTIuMHciKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJY2FzZSAzMjogcHV0cyAoImhwcGEyLjBuIik7IGJyZWFrOwotICAgICAgICAgICAgICAJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAJCX0gYnJlYWs7Ci0gICAgICAgICAgICAgICNlbHNlICAvKiAhZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpICovCi0gICAgICAgICAgICAgIAkgICAgcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICNlbmRpZiAKLSAgICAgICAgICAgICAgCWRlZmF1bHQ6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgZXhpdCAoMCk7Ci0gICAgICAgICAgICAgIH0KLUVPRgotCSgke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+L2Rldi9udWxsICkgJiYgSFBfQVJDSD1gLi9kdW1teWAKLQlybSAtZiBkdW1teS5jIGR1bW15Ci0JZXNhYwotCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAotCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDAgOzsKLSAgICAzMDUwKjpISS1VWDoqOiopCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+ZHVtbXkuYwotCSNpbmNsdWRlIDx1bmlzdGQuaD4KLQlpbnQKLQltYWluICgpCi0JewotCSAgbG9uZyBjcHUgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOwotCSAgLyogVGhlIG9yZGVyIG1hdHRlcnMsIGJlY2F1c2UgQ1BVX0lTX0hQX01DNjhLIGVycm9uZW91c2x5IHJldHVybnMKLQkgICAgIHRydWUgZm9yIENQVV9QQV9SSVNDMV8wLiAgQ1BVX0lTX1BBX1JJU0MgcmV0dXJucyBjb3JyZWN0Ci0JICAgICByZXN1bHRzLCBob3dldmVyLiAgKi8KLQkgIGlmIChDUFVfSVNfUEFfUklTQyAoY3B1KSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoY3B1KQotCQl7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBjYXNlIENQVV9QQV9SSVNDMl8wOiBwdXRzICgiaHBwYTIuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgZGVmYXVsdDogcHV0cyAoImhwcGEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKENQVV9JU19IUF9NQzY4SyAoY3B1KSkKLQkgICAgcHV0cyAoIm02OGstaGl0YWNoaS1oaXV4d2UyIik7Ci0JICBlbHNlIHB1dHMgKCJ1bmtub3duLWhpdGFjaGktaGl1eHdlMiIpOwotCSAgZXhpdCAoMCk7Ci0JfQotRU9GCi0JJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAmJiAuL2R1bW15ICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCi0Jcm0gLWYgZHVtbXkuYyBkdW1teQotCWVjaG8gdW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIKLQlleGl0IDAgOzsKLSAgICA5MDAwLzc/Pzo0LjNic2Q6KjoqIHwgOTAwMC84P1s3OV06NC4zYnNkOio6KiApCi0JZWNobyBocHBhMS4xLWhwLWJzZAotCWV4aXQgMCA7OwotICAgIDkwMDAvOD8/OjQuM2JzZDoqOiopCi0JZWNobyBocHBhMS4wLWhwLWJzZAotCWV4aXQgMCA7OwotICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1vc2YKLQlleGl0IDAgOzsKLSAgICBocDg/PzpPU0YxOio6KikKLQllY2hvIGhwcGExLjAtaHAtb3NmCi0JZXhpdCAwIDs7Ci0gICAgaT84NjpPU0YxOio6KikKLQlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtawotCWVsc2UKLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQotCWZpCi0JZXhpdCAwIDs7Ci0gICAgcGFyaXNjKjpMaXRlcyo6KjoqKQotCWVjaG8gaHBwYTEuMS1ocC1saXRlcwotCWV4aXQgMCA7OwotICAgIGhwcGEqOk9wZW5CU0Q6KjoqKQotCWVjaG8gaHBwYS11bmtub3duLW9wZW5ic2QKLQlleGl0IDAgOzsKLSAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQotCWVjaG8gYzEtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQotCWVjaG8gYzM4LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKLQllY2hvIGM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQ1JBWSpYLU1QOio6KjoqKQotCWVjaG8geG1wLWNyYXktdW5pY29zCi0gICAgICAgIGV4aXQgMCA7OwotICAgIENSQVkqWS1NUDoqOio6KikKLQllY2hvIHltcC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBDUkFZKltBLVpdOTA6KjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCi0JfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCi0JICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8KLQlleGl0IDAgOzsKLSAgICBDUkFZKlRTOio6KjoqKQotCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIENSQVktMjoqOio6KikKLQllY2hvIGNyYXkyLWNyYXktdW5pY29zCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEYzMDA6VU5JWF9TeXN0ZW1fVjoqOiopCi0gICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKLSAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy8gL18vJ2AKLSAgICAgICAgZWNobyAiZjMwMC1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEYzMDE6VU5JWF9TeXN0ZW1fVjoqOiopCi0gICAgICAgZWNobyBmMzAxLWZ1aml0c3UtdXhwdmBlY2hvICRVTkFNRV9SRUxFQVNFIHwgc2VkICdzLyAuKi8vJ2AKLSAgICAgICBleGl0IDAgOzsKLSAgICBocDNbMC05XVswNV06TmV0QlNEOio6KikKLQllY2hvIG02OGstaHAtbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGhwMzAwOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaT84NjpCU0QvMzg2Oio6KiB8ICo6QlNEL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOkZyZWVCU0Q6KjoqKQotCWlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCi0JICAgIGlmIHRlc3QgImVsZiIgPSAiYC91c3IvYmluL29iamZvcm1hdGAiOyB0aGVuCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RlbGZgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovLydgCi0JCWV4aXQgMAotCSAgICBmaQotCWZpCi0gIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYAotCWV4aXQgMCA7OwotICAgICo6TmV0QlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1uZXRic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKLQlleGl0IDAgOzsKLSAgICAqOk9wZW5CU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9wZW5ic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKLQlleGl0IDAgOzsKLSAgICBpKjpbQ2NdW1l5XVtHZ11bV3ddW0lpXVtObl0qOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWN5Z3dpbjMyCi0JZXhpdCAwIDs7Ci0gICAgaSo6TUlOR1cqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbmd3MzIKLQlleGl0IDAgOzsKLSAgICBpKjpXaW5kb3dzX05UKjoqIHwgUGVudGl1bSo6V2luZG93c19OVCo6KikKLSAgICAgICAgIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gZ2VuZXJpYyBwb3NpeCBzdWJzeXN0ZW0/Ci0JIyBJdCBhbHNvIGNvbmZsaWN0cyB3aXRoIHByZS0yLjAgdmVyc2lvbnMgb2YgQVQmVCBVV0lOLiBTaG91bGQgd2UKLQkjIGNoYW5nZSBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZgotCSMgaTM4Nj8KLQllY2hvIGkzODYtcGMtaW50ZXJpeAotCWV4aXQgMCA7OwotICAgIGkqOlVXSU4qOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KLQlleGl0IDAgOzsKLSAgICBwKjpDWUdXSU4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4zMgotCWV4aXQgMCA7OwotICAgIHByZXAqOlN1bk9TOjUuKjoqKQotCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICAqOkdOVToqOiopCi0JZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCi0JZXhpdCAwIDs7Ci0gICAgKjpMaW51eDoqOiopCi0JIyB1bmFtZSBvbiB0aGUgQVJNIHByb2R1Y2VzIGFsbCBzb3J0cyBvZiBzdHJhbmdlbmVzcywgYW5kIHdlIG5lZWQgdG8KLQkjIGZpbHRlciBpdCBvdXQuCi0JY2FzZSAiJFVOQU1FX01BQ0hJTkUiIGluCi0JICBhcm12KikJCSAgICAgIFVOQU1FX01BQ0hJTkU9JFVOQU1FX01BQ0hJTkUgOzsKLQkgIGFybSogfCBzYTExMCopCSAgICAgIFVOQU1FX01BQ0hJTkU9ImFybSIgOzsKLQllc2FjCi0KLQkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbwotCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4KLQlsZF9oZWxwX3N0cmluZz1gbGQgLS1oZWxwIDI+JjFgCi0JbGRfc3VwcG9ydGVkX2VtdWxhdGlvbnM9YGVjaG8gJGxkX2hlbHBfc3RyaW5nIFwKLQkJCSB8IHNlZCAtbmUgJy9zdXBwb3J0ZWQgZW11bGF0aW9uczovIWQKLQkJCQkgICAgcy9bIAldWyAJXSovIC9nCi0JCQkJICAgIHMvLipzdXBwb3J0ZWQgZW11bGF0aW9uczogKi8vCi0JCQkJICAgIHMvIC4qLy8KLQkJCQkgICAgcCdgCi0gICAgICAgIGNhc2UgIiRsZF9zdXBwb3J0ZWRfZW11bGF0aW9ucyIgaW4KLQkgIGk/ODZsaW51eCkgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIgICAgICA7IGV4aXQgMCA7OwotCSAgaT84NmNvZmYpICAgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVjb2ZmIiAgICAgIDsgZXhpdCAwIDs7Ci0JICBzcGFyY2xpbnV4KSBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251YW91dCIgOyBleGl0IDAgOzsKLQkgIGFybWxpbnV4KSAgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVhb3V0IiA7IGV4aXQgMCA7OwotCSAgbTY4a2xpbnV4KSAgZWNobyAiJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWFvdXQiIDsgZXhpdCAwIDs7Ci0JICBlbGYzMnBwYykKLQkJIyBEZXRlcm1pbmUgTGliIFZlcnNpb24KLQkJY2F0ID5kdW1teS5jIDw8RU9GCi0jaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLSNpZiBkZWZpbmVkKF9fR0xJQkNfXykKLWV4dGVybiBjaGFyIF9fbGliY192ZXJzaW9uW107Ci1leHRlcm4gY2hhciBfX2xpYmNfcmVsZWFzZVtdOwotI2VuZGlmCi1tYWluKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0jaWYgZGVmaW5lZChfX0dMSUJDX18pCi0gIHByaW50ZigiJXMgJXNcbiIsIF9fbGliY192ZXJzaW9uLCBfX2xpYmNfcmVsZWFzZSk7Ci0jZWxzZQotICBwcmludGYoInVua293blxuIik7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci1FT0YKLQkJTElCQz0iIgotCQkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+L2Rldi9udWxsCi0JCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCQkuL2R1bW15IHwgZ3JlcCAxXC45OSA+IC9kZXYvbnVsbAotCQkJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4KLQkJCQlMSUJDPSJsaWJjMSIKLQkJCWZpCi0JCWZpCQotCQlybSAtZiBkdW1teS5jIGR1bW15Ci0JCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudSR7TElCQ30gOyBleGl0IDAgOzsKLQllc2FjCi0KLQlpZiB0ZXN0ICIke1VOQU1FX01BQ0hJTkV9IiA9ICJhbHBoYSIgOyB0aGVuCi0JCXNlZCAncy9eCS8vJyAgPDxFT0YgPmR1bW15LnMKLQkJLmdsb2JsIG1haW4KLQkJLmVudCBtYWluCi0JbWFpbjoKLQkJLmZyYW1lIFwkMzAsMCxcJDI2LDAKLQkJLnByb2xvZ3VlIDAKLQkJLmxvbmcgMHg0N2UwM2Q4MCAjIGltcGx2ZXIgJDAKLQkJbGRhIFwkMiwyNTkKLQkJLmxvbmcgMHg0N2UyMGMyMSAjIGFtYXNrICQyLCQxCi0JCXNybCBcJDEsOCxcJDIKLQkJc2xsIFwkMiwyLFwkMgotCQlzbGwgXCQwLDMsXCQwCi0JCWFkZGwgXCQxLFwkMCxcJDAKLQkJYWRkbCBcJDIsXCQwLFwkMAotCQlyZXQgXCQzMSwoXCQyNiksMQotCQkuZW5kIG1haW4KLUVPRgotCQlMSUJDPSIiCi0JCSR7Q0MtY2N9IGR1bW15LnMgLW8gZHVtbXkgMj4vZGV2L251bGwKLQkJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4KLQkJCS4vZHVtbXkKLQkJCWNhc2UgIiQ/IiBpbgotCQkJNykKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIKLQkJCQk7OwotCQkJMTUpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiCi0JCQkJOzsKLQkJCTE0KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIKLQkJCQk7OwotCQkJMTApCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIKLQkJCQk7OwotCQkJMTYpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiCi0JCQkJOzsKLQkJCWVzYWMJCi0KLQkJCW9iamR1bXAgLS1wcml2YXRlLWhlYWRlcnMgZHVtbXkgfCBcCi0JCQkgIGdyZXAgbGQuc28uMSA+IC9kZXYvbnVsbAotCQkJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4KLQkJCQlMSUJDPSJsaWJjMSIKLQkJCWZpCi0JCWZpCQotCQlybSAtZiBkdW1teS5zIGR1bW15Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30gOyBleGl0IDAKLQllbGlmIHRlc3QgIiR7VU5BTUVfTUFDSElORX0iID0gIm1pcHMiIDsgdGhlbgotCSAgY2F0ID5kdW1teS5jIDw8RU9GCi1tYWluKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0jaWZkZWYgX19NSVBTRUJfXwotICBwcmludGYgKCIlcy11bmtub3duLWxpbnV4LWdudVxuIiwgYXJndlsxXSk7Ci0jZW5kaWYKLSNpZmRlZiBfX01JUFNFTF9fCi0gIHByaW50ZiAoIiVzZWwtdW5rbm93bi1saW51eC1nbnVcbiIsIGFyZ3ZbMV0pOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotRU9GCi0JICAke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+L2Rldi9udWxsICYmIC4vZHVtbXkgIiR7VU5BTUVfTUFDSElORX0iICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCi0JICBybSAtZiBkdW1teS5jIGR1bW15Ci0JZWxzZQotCSAgIyBFaXRoZXIgYSBwcmUtQkZEIGEub3V0IGxpbmtlciAobGludXgtZ251b2xkbGQpCi0JICAjIG9yIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KLQkgICMgR0NDIHdhbnRzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbGludXgtZ251b2xkbGQgYW5kIGxpbnV4LWdudWFvdXQuCi0JICAjIElmIGxkIGRvZXMgbm90IHByb3ZpZGUgKmFueSogInN1cHBvcnRlZCBlbXVsYXRpb25zOiIKLQkgICMgdGhhdCBtZWFucyBpdCBpcyBnbnVvbGRsZC4KLQkgIGVjaG8gIiRsZF9oZWxwX3N0cmluZyIgfCBncmVwID4vZGV2L251bGwgMj4mMSAic3VwcG9ydGVkIGVtdWxhdGlvbnM6IgotCSAgdGVzdCAkPyAhPSAwICYmIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251b2xkbGQiICYmIGV4aXQgMAotCi0JICBjYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgaT84NikKLQkgICAgVkVORE9SPXBjOwotCSAgICA7OwotCSAgKikKLQkgICAgVkVORE9SPXVua25vd247Ci0JICAgIDs7Ci0JICBlc2FjCi0JICAjIERldGVybWluZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGlzIGEub3V0IG9yIGVsZgotCSAgY2F0ID5kdW1teS5jIDw8RU9GCi0jaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLW1haW4oYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSNpZmRlZiBfX0VMRl9fCi0jIGlmZGVmIF9fR0xJQkNfXwotIyAgaWYgX19HTElCQ19fID49IDIKLSAgICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251XG4iLCBhcmd2WzFdKTsKLSMgIGVsc2UKLSAgICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251bGliYzFcbiIsIGFyZ3ZbMV0pOwotIyAgZW5kaWYKLSMgZWxzZQotICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudWxpYmMxXG4iLCBhcmd2WzFdKTsKLSMgZW5kaWYKLSNlbHNlCi0gIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVhb3V0XG4iLCBhcmd2WzFdKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLUVPRgotCSAgJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbCAmJiAuL2R1bW15ICIke1VOQU1FX01BQ0hJTkV9IiAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCSAgcm0gLWYgZHVtbXkuYyBkdW1teQotCWZpIDs7Ci0jIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLiAgZWFybGllciB2ZXJzaW9ucwotIyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGggc3lzbmFtZSBhbmQgbm9kZW5hbWUuCi0gICAgaT84NjpEWU5JWC9wdHg6NCo6KikKLQllY2hvIGkzODYtc2VxdWVudC1zeXN2NAotCWV4aXQgMCA7OwotICAgIGk/ODY6VU5JWF9TVjo0LjJNUDoyLiopCi0gICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KLSAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgotICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCi0JIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgotICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQotCWV4aXQgMCA7OwotICAgIGk/ODY6Kjo0Lio6KiB8IGk/ODY6U1lTVEVNX1Y6NC4qOiopCi0JaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQllbHNlCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWZpCi0JZXhpdCAwIDs7Ci0gICAgaT84NjoqOjU6NykKLSAgICAgICBVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGVncmVwIFJlbGVhc2V8c2VkIC1lICdzLy4qPSAvLycpYAotICAgICAgICgvYmluL3VuYW1lIC1YfGVncmVwIGk4MDQ4NiA+L2Rldi9udWxsKSAmJiBVTkFNRV9NQUNISU5FPWk0ODYKLSAgICAgICAoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKLSAgICAgICAgICAgICAgICYmIFVOQU1FX01BQ0hJTkU9aTU4NgotIyA1LjAuNGMgcmV0dXJucyAiUGVudCBJSSIuICA1LjAuNSByZXR1cm5zIFBlbnRJSQotICAgICAgICgvYmluL3VuYW1lIC1YfGVncmVwICdeTWFjaGluZS4qUGVudC4qSUknID4vZGV2L251bGwpIFwKLSAgICAgICAgICAgICAgICYmIFVOQU1FX01BQ0hJTkU9aTY4NgotICAgICAgICgvYmluL3VuYW1lIC1YfGVncmVwICdeTWFjaGluZS4qUGVudGl1bSBQcm8nID4vZGV2L251bGwpIFwKLSAgICAgICAgICAgICAgICYmIFVOQU1FX01BQ0hJTkU9aTY4NgotICAgICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1VOQU1FX1NZU1RFTX0ke1VOQU1FX1ZFUlNJT059LXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgZXhpdCAwIDs7Ci0gICAgaT84NjoqOjMuMjoqKQotCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KLQkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAotCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGVncmVwIFJlbGVhc2V8c2VkIC1lICdzLy4qPSAvLycpYAotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2Ci0JCSgvYmluL3VuYW1lIC1YfGVncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2Ci0JCSgvYmluL3VuYW1lIC1YfGVncmVwICdeTWFjaGluZS4qUGVudElJJyA+L2Rldi9udWxsKSBcCi0JCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50IElJJyA+L2Rldi9udWxsKSBcCi0JCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKLSAgICAgICAgICAgICAgICAoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0gUHJvJyA+L2Rldi9udWxsKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBVTkFNRV9NQUNISU5FPWk2ODYKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNjbyRVTkFNRV9SRUwKLQllbHNlCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2MzIKLQlmaQotCWV4aXQgMCA7OwotICAgIHBjOio6KjoqKQotICAgICAgICAjIHVuYW1lIC1tIHByaW50cyBmb3IgREpHUFAgYWx3YXlzICdwYycsIGJ1dCBpdCBwcmludHMgbm90aGluZyBhYm91dAotICAgICAgICAjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpMzg2LgotCWVjaG8gaTM4Ni1wYy1tc2Rvc2RqZ3BwCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEludGVsOk1hY2g6Myo6KikKLQllY2hvIGkzODYtcGMtbWFjaDMKLQlleGl0IDAgOzsKLSAgICBwYXJhZ29uOio6KjoqKQotCWVjaG8gaTg2MC1pbnRlbC1vc2YxCi0JZXhpdCAwIDs7Ci0gICAgaTg2MDoqOjQuKjoqKSAjIGk4NjAtU1ZSNAotCWlmIGdyZXAgU3RhcmRlbnQgL3Vzci9pbmNsdWRlL3N5cy91YWRtaW4uaCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0JICBlY2hvIGk4NjAtc3RhcmRlbnQtc3lzdiR7VU5BTUVfUkVMRUFTRX0gIyBTdGFyZGVudCBWaXN0cmEgaTg2MC1TVlI0Ci0JZWxzZSAjIEFkZCBvdGhlciBpODYwLVNWUjQgdmVuZG9ycyBiZWxvdyBhcyB0aGV5IGFyZSBkaXNjb3ZlcmVkLgotCSAgZWNobyBpODYwLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0gICMgVW5rbm93biBpODYwLVNWUjQKLQlmaQotCWV4aXQgMCA7OwotICAgIG1pbmkqOkNUSVg6U1lTKjU6KikKLQkjICJtaW5pZnJhbWUiCi0JZWNobyBtNjgwMTAtY29udmVyZ2VudC1zeXN2Ci0JZXhpdCAwIDs7Ci0gICAgTTY4KjoqOlIzVls1NjddKjoqKQotCXRlc3QgLXIgL3N5c1Y2OCAmJiBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnICYmIGV4aXQgMCA7OwotICAgIDNbMzRdPz86Kjo0LjA6My4wIHwgM1szNF0/PywqOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wKQotCU9TX1JFTD0nJwotCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAotCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCi0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0JICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwCi0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCi0JICAmJiBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwIDs7Ci0gICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCi0gICAgICAgIC9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotICAgICAgICAgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQgJiYgZXhpdCAwIDs7Ci0gICAgbTY4KjpMeW54T1M6Mi4qOiopCi0JZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKLQllY2hvIG02OGstYXRhcmktc3lzdjQKLQlleGl0IDAgOzsKLSAgICBpPzg2Okx5bnhPUzoyLio6KikKLQllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgVFNVTkFNSTpMeW54T1M6Mi4qOiopCi0JZWNobyBzcGFyYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICByczYwMDA6THlueE9TOjIuKjoqIHwgUG93ZXJQQzpMeW54T1M6Mi4qOiopCi0JZWNobyByczYwMDAtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgU01bQkVdUzpVTklYX1NWOio6KikKLQllY2hvIG1pcHMtZGRlLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgUk0qOlNJTklYLSo6KjoqKQotCWVjaG8gbWlwcy1zbmktc3lzdjQKLQlleGl0IDAgOzsKLSAgICAqOlNJTklYLSo6KjoqKQotCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCi0JCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKLQllbHNlCi0JCWVjaG8gbnMzMmstc25pLXN5c3YKLQlmaQotCWV4aXQgMCA7OwotICAgIFBFTlRJVU06Q1B1bml4OjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2F5cyA8UmljaGFyZC5NLkJhcnRlbEBjY01haWwuQ2Vuc3VzLkdPVj4KLSAgICAgICAgZWNobyBpNTg2LXVuaXN5cy1zeXN2NAotICAgICAgICBleGl0IDAgOzsKLSAgICAqOlVOSVhfU3lzdGVtX1Y6NCo6RlRYKikKLQkjIEZyb20gR2VyYWxkIEhld2VzIDxoZXdlc0BvcGVubWFya2V0LmNvbT4uCi0JIyBIb3cgYWJvdXQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gc3RyYXR1cyBhcmNoaXRlY3R1cmVzPyAtZGptCi0JZWNobyBocHBhMS4xLXN0cmF0dXMtc3lzdjQKLQlleGl0IDAgOzsKLSAgICAqOio6KjpGVFgqKQotCSMgRnJvbSBzZWFuZkBzd2RjLnN0cmF0dXMuY29tLgotCWVjaG8gaTg2MC1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgbWM2OCo6QS9VWDoqOiopCi0JZWNobyBtNjhrLWFwcGxlLWF1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBuZXdzKjpORVdTLU9TOio6NiopCi0JZWNobyBtaXBzLXNvbnktbmV3c29zNgotCWV4aXQgMCA7OwotICAgIFIzMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFI0MDAwOlVOSVhfU1Y6KjoqKQotCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgotCSAgICAgICAgZWNobyBtaXBzLW5lYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWVsc2UKLQkgICAgICAgIGVjaG8gbWlwcy11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQmVCb3g6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIGhhcmR3YXJlIG1hZGUgYnkgQmUsIFBQQyBvbmx5LgotCWVjaG8gcG93ZXJwYy1iZS1iZW9zCi0JZXhpdCAwIDs7Ci0gICAgQmVNYWM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIE1hYyBvciBNYWMgY2xvbmUsIFBQQyBvbmx5LgotCWVjaG8gcG93ZXJwYy1hcHBsZS1iZW9zCi0JZXhpdCAwIDs7Ci0gICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KLQllY2hvIGk1ODYtcGMtYmVvcwotCWV4aXQgMCA7OwotZXNhYwotCi0jZWNobyAnKE5vIHVuYW1lIGNvbW1hbmQgb3IgdW5hbWUgb3V0cHV0IG5vdCByZWNvZ25pemVkLiknIDE+JjIKLSNlY2hvICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIDE+JjIKLQotY2F0ID5kdW1teS5jIDw8RU9GCi0jaWZkZWYgX1NFUVVFTlRfCi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgotI2VuZGlmCi1tYWluICgpCi17Ci0jaWYgZGVmaW5lZCAoc29ueSkKLSNpZiBkZWZpbmVkIChNSVBTRUIpCi0gIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCi0gICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCi0gIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0gIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKLSNpZmRlZiBORVdTT1M0Ci0gICAgICAgICAgIjQiCi0jZWxzZQotCSAgIiIKLSNlbmRpZgotICAgICAgICAgKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKLSAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeCIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQotICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChOZVhUKQotI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQotI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgotI2VuZGlmCi0gIGludCB2ZXJzaW9uOwotICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7Ci0gIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7Ci0gIGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChNVUxUSU1BWCkgfHwgZGVmaW5lZCAobjE2KQotI2lmIGRlZmluZWQgKFVNQVhWKQotICBwcmludGYgKCJuczMyay1lbmNvcmUtc3lzdlxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSNpZiBkZWZpbmVkIChDTVUpCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1tYWNoXG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotICBwcmludGYgKCJuczMyay1lbmNvcmUtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfXzM4NkJTRF9fKQotICBwcmludGYgKCJpMzg2LXBjLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChzZXF1ZW50KQotI2lmIGRlZmluZWQgKGkzODYpCi0gIHByaW50ZiAoImkzODYtc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jaWYgZGVmaW5lZCAobnMzMjAwMCkKLSAgcHJpbnRmICgibnMzMmstc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TRVFVRU5UXykKLSAgICBzdHJ1Y3QgdXRzbmFtZSB1bjsKLQotICAgIHVuYW1lKCZ1bik7Ci0KLSAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjIiLCAyKSA9PSAwKSB7Ci0JcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDJcbiIpOyBleGl0ICgwKTsKLSAgICB9Ci0gICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYxIiwgMikgPT0gMCkgeyAvKiBYWFggaXMgVjEgY29ycmVjdD8gKi8KLQlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MVxuIik7IGV4aXQgKDApOwotICAgIH0KLSAgICBwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4XG4iKTsgZXhpdCAoMCk7Ci0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAodmF4KQotI2lmICFkZWZpbmVkICh1bHRyaXgpCi0gIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKGFsbGlhbnQpICYmIGRlZmluZWQgKGk4NjApCi0gIHByaW50ZiAoImk4NjAtYWxsaWFudC1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0gIGV4aXQgKDEpOwotfQotRU9GCi0KLSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgMj4vZGV2L251bGwgJiYgLi9kdW1teSAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotcm0gLWYgZHVtbXkuYyBkdW1teQotCi0jIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCi0KLXRlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdCAwOyB9Ci0KLSMgQ29udmV4IHZlcnNpb25zIHRoYXQgcHJlZGF0ZSB1bmFtZSBjYW4gdXNlIGdldHN5c2luZm8oMSkKLQotaWYgWyAteCAvdXNyL2NvbnZleC9nZXRzeXNpbmZvIF0KLXRoZW4KLSAgICBjYXNlIGBnZXRzeXNpbmZvIC1mIGNwdV90eXBlYCBpbgotICAgIGMxKikKLQllY2hvIGMxLWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjMiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotCWV4aXQgMCA7OwotICAgIGMzNCopCi0JZWNobyBjMzQtY29udmV4LWJzZAotCWV4aXQgMCA7OwotICAgIGMzOCopCi0JZWNobyBjMzgtY29udmV4LWJzZAotCWV4aXQgMCA7OwotICAgIGM0KikKLQllY2hvIGM0LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBlc2FjCi1maQotCi0jZWNobyAnKFVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZSknIDE+JjIKLQotZXhpdCAxCmRpZmYgLS1naXQgYS9jb25maWcuaWYgYi9jb25maWcuaWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYzAyNjkuLjAwMDAwMDAKLS0tIGEvY29uZmlnLmlmCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotIyEgL2Rldi9udWxsCi0jIERvbid0IGNhbGwgaXQgZGlyZWN0bHkuIFRoaXMgc2hlbGwgc2NyaXB0IGZyYWdtZW50IGlzIGNhbGxlZCB0bwotIyBkZXRlcm1pbmU6Ci0jCi0jCTEuIGxpYnN0Y3h4X2ludGVyZmFjZTogdGhlIGludGVyZmFjZSBuYW1lIGZvciBsaWJzdGRjKysuCi0jCTIuIGN4eF9pbnRlcmZhY2U6IHRoZSBpbnRlcmZhY2UgbmFtZSBmb3IgYysrLgotIwkzLiBsaWJjX2ludGVyZmFjZTogdGhlIGludGVyZmFjZSBuYW1lIGZvciBsaWJjLgotIwotCi0jIEdldCB0aGUgdG9wIGxldmVsIHNyYyBkaXIuCi1pZiBbIC16ICIke3RvcHNyY2Rpcn0iIC1hIC16ICIke3RvcF9zcmNkaXJ9IiBdCi10aGVuCi0gIGVjaG8gIlVuZGVmaW5lZCB0b3AgbGV2ZWwgc3JjIGRpcjogdG9wc3JjZGlyIGFuZCB0b3Bfc3JjZGlyIGFyZSBlbXB0eSIgPiYyCi0gIGV4aXQgMQotZmkKLQotaWYgWyAtbiAiJHt0b3BzcmNkaXJ9IiBdCi10aGVuCi0gIGlmX3RvcHNyY2Rpcj0ke3RvcHNyY2Rpcn0KLWVsc2UKLSAgaWZfdG9wc3JjZGlyPSR7dG9wX3NyY2Rpcn0KLWZpCi0KLWlmIFsgLWYgJHtpZl90b3BzcmNkaXJ9L2xpYnN0ZGMrKy9NYWtlZmlsZS5pbiBdOyB0aGVuCi0jIFdlIGNoZWNrIGxpYnN0ZGMrKyBmb3IgbGlic3RkY3h4X2ludGVyZmFjZS4KLWxpYnN0ZGN4eF9pbnRlcmZhY2U9YGdyZXAgIl5JTlRFUkZBQ0UiICR7aWZfdG9wc3JjZGlyfS9saWJzdGRjKysvTWFrZWZpbGUuaW4gfCBzZWQgJ3MvSU5URVJGQUNFWyAJXSo9WyAJXSpcKC4qXCkvXDEvJ2AKLWVsc2UKLWxpYnN0ZGN4eF9pbnRlcmZhY2U9Ci1maQotCi1pZiBbIC1mICR7aWZfdG9wc3JjZGlyfS9nY2MvY3AvTWFrZWZpbGUuaW4gXTsgdGhlbgotIyBXZSBjaGVjayBnY2MvY3AgZm9yIGN4eF9pbnRlcmZhY2UuCi1jeHhfaW50ZXJmYWNlPWBncmVwICJeSU5URVJGQUNFIiAke2lmX3RvcHNyY2Rpcn0vZ2NjL2NwL01ha2VmaWxlLmluIHwgc2VkICdzL0lOVEVSRkFDRVsgCV0qPVsgCV0qXCguKlwpL1wxLydgCi1lbHNlCi1jeHhfaW50ZXJmYWNlPQotZmkKLQotIyBUaGUgdHJpY2tpZXN0IHBhcnQgaXMgbGliY19pbnRlcmZhY2UuCi1pZiBbIC16ICIke2xpYmNfaW50ZXJmYWNlfSIgXQotdGhlbgotICBjYXNlICR7dGFyZ2V0X29zfSBpbgotICAqbGludXgqbGliYzEqfCpsaW51eCpsaWJjNSopCi0gICAgY2FzZSAke3RhcmdldF9hbGlhc30gaW4KLSAgICAqYWxwaGEqfCpwb3dlcnBjKikKLSAgICAgIGxpYmNfaW50ZXJmYWNlPS1saWJjNS45LQotICAgICAgOzsKLSAgICAqKQotICAgICAgbGliY19pbnRlcmZhY2U9LWxpYmM1LQotICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgKmxpbnV4KmdudSopCi0gICAgIyBXZSBoYXZlIHRvIHdvcmsgaGFyZGVyIHRvIGZpZ3VyZSBpdCBvdXQuCi0gICAgaWYgWyAke3RhcmdldF9hbGlhc30gPSAke2J1aWxkX2FsaWFzfSBdCi0gICAgdGhlbgotICAgICAgZHVtbXk9aWYkJAotICAgICAgY2F0ID4kZHVtbXkuYyA8PEVPRgotI2luY2x1ZGUgPGZlYXR1cmVzLmg+ICAgICAgICAgICAgICAgICAgICAgIAotbWFpbihhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsgICAgICAgICAgCi0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSAgcHJpbnRmKCIlZFxuIiwgX19HTElCQ19NSU5PUl9fKTsKLSAgcmV0dXJuIDA7Ci19Ci1FT0YKLSAgICAgICR7Q0MtY2N9ICRkdW1teS5jIC1vICRkdW1teSAyPi9kZXYvbnVsbAotICAgICAgaWYgWyAiJD8iID0gMCBdCi0gICAgICB0aGVuCi0JbGliY19pbnRlcmZhY2U9LWxpYmM2LmAuLyRkdW1teWAtCi0Jcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0gICAgICBlbHNlCi0JIyBJdCBzaG91bGQgbmV2ZXIgaGFwcGVuLgotCWVjaG8gIkNhbm5vdCBmaW5kIHRoZSBHTlUgQyBsaWJyYXJ5IG1pbm9yIHZlcnNpb24gbnVtYmVyLiIgPiYyCi0Jcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JZXhpdCAxCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgICMgQ3Jvc3MgY29tcGlsaW5nLiBBc3N1bWUgZ2xpYmMgMi4xLgotICAgICAgbGliY19pbnRlcmZhY2U9LWxpYmM2LjEtCi0gICAgZmkKLSAgICA7OwotICAqKQotICAgIGxpYmNfaW50ZXJmYWNlPS0KLSAgICA7OwotICBlc2FjCi1maQpkaWZmIC0tZ2l0IGEvY29uZmlnLnN1YiBiL2NvbmZpZy5zdWIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5OTZmZTEuLjAwMDAwMDAKLS0tIGEvY29uZmlnLnN1YgorKysgL2Rldi9udWxsCkBAIC0xLDEyMTMgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gc3Vicm91dGluZSBzY3JpcHQsIHZlcnNpb24gMS4xLgotIyAgIENvcHlyaWdodCAoQykgMTk5MSwgOTItOTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KLSMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQotIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0jIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KLSMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgotIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KLSMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KLQotIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKLSMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCi0jIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCi0jIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCi0jIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAotIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCi0jIGNvbmZpZ3VyYXRpb24uCi0KLSMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCi0jIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06Ci0jCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCi0jIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCi0jIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KLQotaWYgWyB4JDEgPSB4IF0KLXRoZW4KLQllY2hvIENvbmZpZ3VyYXRpb24gbmFtZSBtaXNzaW5nLiAxPiYyCi0JZWNobyAiVXNhZ2U6ICQwIENQVS1NRlItT1BTWVMiIDE+JjIKLQllY2hvICJvciAgICAgJDAgQUxJQVMiIDE+JjIKLQllY2hvIHdoZXJlIEFMSUFTIGlzIGEgcmVjb2duaXplZCBjb25maWd1cmF0aW9uIHR5cGUuIDE+JjIKLQlleGl0IDEKLWZpCi0KLSMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgotY2FzZSAkMSBpbgotCSpsb2NhbCopCi0JCWVjaG8gJDEKLQkJZXhpdCAwCi0JCTs7Ci0JKikKLQk7OwotZXNhYwotCi0jIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCi0jIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgotbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCi1jYXNlICRtYXliZV9vcyBpbgotICBsaW51eC1nbnUqKQotICAgIG9zPS0kbWF5YmVfb3MKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYAotICAgIDs7Ci0gICopCi0gICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAotICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQotICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKLSAgICBlbHNlIG9zPTsgZmkKLSAgICA7OwotZXNhYwotCi0jIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KLSMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCi0jIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCi0jIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KLWNhc2UgJG9zIGluCi0JLXN1bipvcyopCi0JCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgotCQk7OwotCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCi0JLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCi0JLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKLQktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAotCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCi0JLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCi0JLWFwcGxlKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zY291dCkKLQkJOzsKLQktd3JzKQotCQlvcz12eHdvcmtzCi0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktaGl1eCopCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JLXNjbzUpCi0JCW9zPS1zY28zLjJ2NQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzQpCi0JCW9zPS1zY28zLjJ2NAotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzMuMi5bNC05XSopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjJ2WzQtOV0qKQotCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbyopCi0JCW9zPS1zY28zLjJ2MgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXVkayopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktaXNjKQotCQlvcz0taXNjMi4yCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktY2xpeCopCi0JCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCi0JCTs7Ci0JLWlzYyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktbHlueCopCi0JCW9zPS1seW54b3MKLQkJOzsKLQktcHR4KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1zZXF1ZW50LydgCi0JCTs7Ci0JLXdpbmRvd3NudCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy93aW5kb3dzbnQvd2lubnQvJ2AKLQkJOzsKLQktcHNvcyopCi0JCW9zPS1wc29zCi0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIGFsaWFzZXMgZm9yIGNlcnRhaW4gQ1BVLUNPTVBBTlkgY29tYmluYXRpb25zLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUuCi0JIyBTb21lIGFyZSBvbWl0dGVkIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBiZWxvdy4KLQl0YWhvZSB8IGk4NjAgfCBtMzJyIHwgbTY4ayB8IG02ODAwMCB8IG04OGsgfCBuczMyayB8IGFyYyB8IGFybSBcCi0JCXwgYXJtZVtsYl0gfCBweXJhbWlkIHwgbW4xMDIwMCB8IG1uMTAzMDAgfCB0cm9uIHwgYTI5ayBcCi0JCXwgNTgwIHwgaTk2MCB8IGg4MzAwIFwKLQkJfCBocHBhIHwgaHBwYTEuMCB8IGhwcGExLjEgfCBocHBhMi4wIHwgaHBwYTIuMHcgfCBocHBhMi4wbiBcCi0JCXwgYWxwaGEgfCBhbHBoYWV2WzQtOF0gfCBhbHBoYWV2NTYgfCBhbHBoYXBjYTVbNjddIFwKLQkJfCB3ZTMyayB8IG5zMTZrIHwgY2xpcHBlciB8IGkzNzAgfCBzaCB8IHBvd2VycGMgfCBwb3dlcnBjbGUgXAotCQl8IDE3NTBhIHwgZHNwMTZ4eCB8IHBkcDExIHwgbWlwczE2IHwgbWlwczY0IHwgbWlwc2VsIHwgbWlwczY0ZWwgXAotCQl8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCB8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCi0JCXwgbWlwczY0dnI0MzAwIHwgbWlwczY0dnI0MzAwZWwgfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCBcCi0JCXwgbWlwczY0dnI1MDAwIHwgbWlwcnM2NHZyNTAwMGVsIFwKLQkgICAgICAgIHwgbTg4MTEwIHwgbTY4MFswMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgejhrIHwgdjcwIFwKLQkJfCBzcGFyYyB8IHNwYXJjbGV0IHwgc3BhcmNsaXRlIHwgc3BhcmM2NCB8IHNwYXJjODZ4IHwgc3BhcmN2OSBcCi0JCXwgdGh1bWIgfCB2ODUwIHwgYzR4IHwgZDEwdiB8IGg4NTAwIHwgdzY1KQotCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KLQkJOzsKLQkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJwotCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAotCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KLQlpWzM0NTY3XTg2KQotCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYwotCSAgOzsKLQkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgotCSotKi0qKQotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KLQl2YXgtKiB8IHRhaG9lLSogfCBpWzM0NTY3XTg2LSogfCBpODYwLSogfCBtMzJyLSogfCBtNjhrLSogfCBtNjgwMDAtKiBcCi0JICAgICAgfCBtODhrLSogfCBzcGFyYy0qIHwgbnMzMmstKiB8IGZ4ODAtKiB8IGFyYy0qIHwgYXJtLSogfCBjWzEyM10qIFwKLQkgICAgICB8IG1pcHMtKiB8IHB5cmFtaWQtKiB8IHRyb24tKiB8IGEyOWstKiB8IHJvbXAtKiB8IHJzNjAwMC0qIFwKLQkgICAgICB8IHBvd2VyLSogfCBub25lLSogfCA1ODAtKiB8IGNyYXkyLSogfCBoODMwMC0qIHwgaDg1MDAtKiB8IGk5NjAtKiBcCi0JICAgICAgfCB4bXAtKiB8IHltcC0qIFwKLQkgICAgICB8IGhwcGEtKiB8IGhwcGExLjAtKiB8IGhwcGExLjEtKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjB3LSogfCBocHBhMi4wbi0qIFwKLQkgICAgICB8IGFscGhhLSogfCBhbHBoYWV2WzQtOF0tKiB8IGFscGhhZXY1Ni0qIHwgYWxwaGFwY2E1WzY3XS0qIFwKLQkgICAgICB8IHdlMzJrLSogfCBjeWRyYS0qIHwgbnMxNmstKiB8IHBuLSogfCBucDEtKiB8IHhwczEwMC0qIFwKLQkgICAgICB8IGNsaXBwZXItKiB8IG9yaW9uLSogXAotCSAgICAgIHwgc3BhcmNsaXRlLSogfCBwZHAxMS0qIHwgc2gtKiB8IHBvd2VycGMtKiB8IHBvd2VycGNsZS0qIFwKLQkgICAgICB8IHNwYXJjNjQtKiB8IHNwYXJjdjktKiB8IHNwYXJjODZ4LSogfCBtaXBzMTYtKiB8IG1pcHM2NC0qIHwgbWlwc2VsLSogXAotCSAgICAgIHwgbWlwczY0ZWwtKiB8IG1pcHM2NG9yaW9uLSogfCBtaXBzNjRvcmlvbmVsLSogXAotCSAgICAgIHwgbWlwczY0dnI0MTAwLSogfCBtaXBzNjR2cjQxMDBlbC0qIHwgbWlwczY0dnI0MzAwLSogfCBtaXBzNjR2cjQzMDBlbC0qIFwKLQkgICAgICB8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAotCSAgICAgIHwgZjMwMS0qIHwgYXJtKi0qIHwgdDNlLSogXAotCSAgICAgIHwgbTg4MTEwLSogfCBtNjgwWzAxMjM0XTAtKiB8IG02ODM/Mi0qIHwgbTY4MzYwLSogfCB6OGstKiB8IGQxMHYtKiBcCi0JICAgICAgfCB0aHVtYi0qIHwgdjg1MC0qIHwgZDMwdi0qIHwgdGljMzAtKiB8IGMzMC0qICkKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCi0JIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KLQkzODZic2QpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1ic2QKLQkJOzsKLQkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0Ci0JCTs7Ci0JM2IqKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCWEyOWtoaWYpCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCWFkb2JlNjhrKQotCQliYXNpY19tYWNoaW5lPW02ODAxMC1hZG9iZQotCQlvcz0tc2NvdXQKLQkJOzsKLQlhbGxpYW50IHwgZng4MCkKLQkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKLQkJOzsKLQlhbHRvcyB8IGFsdG9zMzA2OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCi0JCTs7Ci0JYW0yOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCi0JCW9zPS1ic2QKLQkJOzsKLQlhbWRhaGwpCi0JCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAotCQlvcz0tc3lzdgotCQk7OwotCWFtaWdhIHwgYW1pZ2EtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQotCQk7OwotCWFtaWdhb3MgfCBhbWlnYWRvcykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQotCQlvcz0tYW1pZ2FvcwotCQk7OwotCWFtaWdhdW5peCB8IGFtaXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jYm0KLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JYXBvbGxvNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KLQkJb3M9LXN5c3YKLQkJOzsKLQlhcG9sbG82OGJzZCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbwotCQlvcz0tYnNkCi0JCTs7Ci0JYXV4KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKLQkJb3M9LWF1eAotCQk7OwotCWJhbGFuY2UpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQljb252ZXgtYzEpCi0JCWJhc2ljX21hY2hpbmU9YzEtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzIpCi0JCWJhc2ljX21hY2hpbmU9YzItY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzMyKQotCQliYXNpY19tYWNoaW5lPWMzMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzQpCi0JCWJhc2ljX21hY2hpbmU9YzM0LWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzOCkKLQkJYmFzaWNfbWFjaGluZT1jMzgtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljcmF5IHwgeW1wKQotCQliYXNpY19tYWNoaW5lPXltcC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQljcmF5MikKLQkJYmFzaWNfbWFjaGluZT1jcmF5Mi1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQlbY3RqXTkwLWNyYXkpCi0JCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNyZHMgfCB1bm9zKQotCQliYXNpY19tYWNoaW5lPW02OGstY3JkcwotCQk7OwotCWRhMzAgfCBkYTMwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCi0JCTs7Ci0JZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQotCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCi0JCTs7Ci0JZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKLQkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCi0JCTs7Ci0JZGVsdGE4OCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCi0JCW9zPS1zeXN2MwotCQk7OwotCWRweDIwIHwgZHB4MjAtKikKLQkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAotCQlvcz0tYm9zeAotCQk7OwotCWRweDIqIHwgZHB4MiotYnVsbCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JZWJtb24yOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LWVibW9uCi0JCTs7Ci0JZWx4c2kpCi0JCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKLQkJb3M9LWJzZAotCQk7OwotCWVuY29yZSB8IHVtYXggfCBtbWF4KQotCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQotCQk7OwotCWVzMTgwMCB8IE9TRTY4ayB8IG9zZTY4ayB8IG9zZSB8IE9TRSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWVyaWNzc29uCi0JCW9zPS1vc2UKLQkJOzsKLQlmeDI4MDApCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50Ci0JCTs7Ci0JZ2VuaXgpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKLQkJOzsKLQlnbWljcm8pCi0JCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KLQkJb3M9LXN5c3YKLQkJOzsKLQloMzA1MHIqIHwgaGl1eCopCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JaDgzMDBobXMpCi0JCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0JaDgzMDB4cmF5KQotCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKLQkJb3M9LXhyYXkKLQkJOzsKLQloODUwMGhtcykKLQkJYmFzaWNfbWFjaGluZT1oODUwMC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQloYXJyaXMpCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JaHAzMDAtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCTs7Ci0JaHAzMDBic2QpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQlvcz0tYnNkCi0JCTs7Ci0JaHAzMDBocHV4KQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJb3M9LWhwdXgKLQkJOzsKLQlocDNrOVswLTldWzAtOV0gfCBocDlbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKLQkJOzsKLQlocDlrM1syLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQk7OwotCWhwOWs2WzAtOV1bMC05XSB8IGhwNlswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwOWs3WzAtNzldWzAtOV0gfCBocDdbMC03OV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azc4WzAtOV0gfCBocDc4WzAtOV0pCi0JCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzY3XTEgfCBocDhbNjddMSB8IGhwOWs4MFsyNF0gfCBocDgwWzI0XSB8IGhwOWs4Wzc4XTkgfCBocDhbNzhdOSB8IGhwOWs4OTMgfCBocDg5MykKLQkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwcGEtbmV4dCkKLQkJb3M9LW5leHRzdGVwMwotCQk7OwotCWhwcGFvc2YpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQlvcz0tb3NmCi0JCTs7Ci0JaHBwcm8pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JaTM3MC1pYm0qIHwgaWJtKikKLQkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQotCQlvcz0tbXZzCi0JCTs7Ci0jIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KLQlpWzM0NTY3XTg2djMyKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YzMgotCQk7OwotCWlbMzQ1NjddODZ2NCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjQKLQkJOzsKLQlpWzM0NTY3XTg2dikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JaVszNDU2N104NnNvbDIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc29sYXJpczIKLQkJOzsKLQlpMzg2bWFjaCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LW1hY2gKLQkJb3M9LW1hY2gKLQkJOzsKLQlpMzg2LXZzdGEgfCB2c3RhKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tdnN0YQotCQk7OwotCWkzODYtZ28zMiB8IGdvMzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1nbzMyCi0JCTs7Ci0JaTM4Ni1taW5ndzMyIHwgbWluZ3czMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW1pbmd3MzIKLQkJOzsKLQlpcmlzIHwgaXJpczRkKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCi0JCWNhc2UgJG9zIGluCi0JCSAgICAtaXJpeCopCi0JCQk7OwotCQkgICAgKikKLQkJCW9zPS1pcml4NAotCQkJOzsKLQkJZXNhYwotCQk7OwotCWlzaTY4IHwgaXNpKQotCQliYXNpY19tYWNoaW5lPW02OGstaXNpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgotCQk7OwotCW1hZ251bSB8IG0zMjMwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcwotCQlvcz0tc3lzdgotCQk7OwotCW1lcmxpbikKLQkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbWluaWZyYW1lKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50Ci0JCTs7Ci0JKm1pbnQgfCAqTWlOVCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCi0JCW9zPS1taW50Ci0JCTs7Ci0JbWlwc2VsKi1saW51eCopCi0JCWJhc2ljX21hY2hpbmU9bWlwc2VsLXVua25vd24KLQkJb3M9LWxpbnV4LWdudQotCQk7OwotCW1pcHMqLWxpbnV4KikKLQkJYmFzaWNfbWFjaGluZT1taXBzLXVua25vd24KLQkJb3M9LWxpbnV4LWdudQotCQk7OwotCW1pcHMzKi0qKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAotCQk7OwotCW1pcHMzKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgotCQk7OwotCW1vbml0b3IpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKLQkJb3M9LWNvZmYKLQkJOzsKLQltc2RvcykKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW1zZG9zCi0JCTs7Ci0JbmNyMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1pNDg2LW5jcgotCQlvcz0tc3lzdjQKLQkJOzsKLQluZXRic2QzODYpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1uZXRic2QKLQkJOzsKLQluZXR3aW5kZXIpCi0JCWJhc2ljX21hY2hpbmU9YXJtdjRsLWNvcmVsCi0JCW9zPS1saW51eAotCQk7OwotCW5ld3MgfCBuZXdzNzAwIHwgbmV3czgwMCB8IG5ld3M5MDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzMTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMzAtc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmV3cy0zNjAwIHwgcmlzYy1uZXdzKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmVjdjcwKQotCQliYXNpY19tYWNoaW5lPXY3MC1uZWMKLQkJb3M9LXN5c3YKLQkJOzsKLQluZXh0IHwgbSotbmV4dCApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uZXh0Ci0JCWNhc2UgJG9zIGluCi0JCSAgICAtbmV4dHN0ZXAqICkKLQkJCTs7Ci0JCSAgICAtbnMyKikKLQkJICAgICAgb3M9LW5leHRzdGVwMgotCQkJOzsKLQkJICAgICopCi0JCSAgICAgIG9zPS1uZXh0c3RlcDMKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQluaDMwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaFs0NV0wMDApCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaW5keTk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1uaW5keQotCQk7OwotCW1vbjk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1tb245NjAKLQkJOzsKLQlucDEpCi0JCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCi0JCTs7Ci0Jb3A1MG4tKiB8IG9wNjBjLSopCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJb3M9LXByb2VsZgotCQk7OwotCU9TRTY4MDAwIHwgb3NlNjgwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCi0JCW9zPS1vc2UKLQkJOzsKLQlvczY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKLQkJb3M9LW9zNjhrCi0JCTs7Ci0JcGEtaGl0YWNoaSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQlwYXJhZ29uKQotCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKLQkJb3M9LW9zZgotCQk7OwotCXBiZCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKLQkJOzsKLQlwYmIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKLQkJOzsKLSAgICAgICAgcGM1MzIgfCBwYzUzMi0qKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCi0JCTs7Ci0JcGVudGl1bSB8IHA1IHwgazUgfCBuZXhlbikKLQkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCi0JCTs7Ci0JcGVudGl1bXBybyB8IHA2IHwgazYgfCA2eDg2KQotCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKLQkJOzsKLQlwZW50aXVtaWkgfCBwZW50aXVtMikKLQkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCi0JCTs7Ci0JcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4ZW4tKikKLQkJYmFzaWNfbWFjaGluZT1pNTg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bXByby0qIHwgcDYtKiB8IDZ4ODYtKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bWlpLSogfCBwZW50aXVtMi0qKQotCQliYXNpY19tYWNoaW5lPWk3ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwbikKLQkJYmFzaWNfbWFjaGluZT1wbi1nb3VsZAotCQk7OwotCXBvd2VyKQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KLQkJOzsKLQlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCi0JICAgICAgICA7OwotCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgotCSAgICAgICAgOzsKLQlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBzMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQotCQk7OwotCXJvbTY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4awotCQlvcz0tY29mZgotCQk7OwotCXJtWzQ2XTAwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucwotCQk7OwotCXJ0cGMgfCBydHBjLSopCi0JCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KLQkJOzsKLQlzYTI5MjAwKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLQlzZXF1ZW50KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQk7OwotCXNoKQotCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCXNwYXJjbGl0ZS13cnMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmNsaXRlLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXNwczcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MgotCQk7OwotCXNwdXIpCi0JCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCi0JCTs7Ci0Jc3QyMDAwKQotCQliYXNpY19tYWNoaW5lPW02OGstdGFuZGVtCi0JCTs7Ci0Jc3RyYXR1cykKLQkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0Jc3VuMikKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCTs7Ci0Jc3VuMm9zMykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW4yb3M0KQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjNvczMpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjNvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjRvczMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW40b3M0KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNHNvbDIpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCXN1bjMgfCBzdW4zLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJOzsKLQlzdW40KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQk7OwotCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQotCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCi0JCTs7Ci0Jc3ltbWV0cnkpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCW9zPS1keW5peAotCQk7OwotCXQzZSkKLQkJYmFzaWNfbWFjaGluZT10M2UtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JdHgzOSkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOS11bmtub3duCi0JCTs7Ci0JdHgzOWVsKQotCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5ZWwtdW5rbm93bgotCQk7OwotCXRvd2VyIHwgdG93ZXItMzIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKLQkJOzsKLQl1ZGkyOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXVsdHJhMykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQotCQlvcz0tc3ltMQotCQk7OwotCXY4MTAgfCBuZWN2ODEwKQotCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCi0JCW9zPS1ub25lCi0JCTs7Ci0JdmF4dikKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCW9zPS1zeXN2Ci0JCTs7Ci0Jdm1zKQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJb3M9LXZtcwotCQk7OwotCXZwcCp8dnh8dngtKikKLSAgICAgICAgICAgICAgIGJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1Ci0gICAgICAgICAgICAgICA7OwotCXZ4d29ya3M5NjApCi0JCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0JdzY1KikKLQkJYmFzaWNfbWFjaGluZT13NjUtd2RjCi0JCW9zPS1ub25lCi0JCTs7Ci0Jdzg5ay0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JeG1wKQotCQliYXNpY19tYWNoaW5lPXhtcC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLSAgICAgICAgeHBzIHwgeHBzMTAwKQotCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKLQkJOzsKLQl6OGstKi1jb2ZmKQotCQliYXNpY19tYWNoaW5lPXo4ay11bmtub3duCi0JCW9zPS1zaW0KLQkJOzsKLQlub25lKQotCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQotCQlvcz0tbm9uZQotCQk7OwotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCi0jIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCi0Jdzg5aykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKLQkJOzsKLQlvcDUwbikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQk7OwotCW9wNjBjKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCTs7Ci0JbWlwcykKLQkJaWYgWyB4JG9zID0geC1saW51eC1nbnUgXTsgdGhlbgotCQkJYmFzaWNfbWFjaGluZT1taXBzLXVua25vd24KLQkJZWxzZQotCQkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKLQkJZmkKLQkJOzsKLQlyb21wKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0JcnM2MDAwKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KLQkJOzsKLQl2YXgpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQk7OwotCXBkcDExKQotCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYwotCQk7OwotCXdlMzJrKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCXNwYXJjIHwgc3BhcmN2OSkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJOzsKLSAgICAgICAgY3lkcmEpCi0JCWJhc2ljX21hY2hpbmU9Y3lkcmEtY3lkcm9tZQotCQk7OwotCW9yaW9uKQotCQliYXNpY19tYWNoaW5lPW9yaW9uLWhpZ2hsZXZlbAotCQk7OwotCW9yaW9uMTA1KQotCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaGlnaGxldmVsCi0JCTs7Ci0JbWFjIHwgbXB3IHwgbWFjLW1wdykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCi0JCTs7Ci0JcG1hYyB8IHBtYWMtbXB3KQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYXBwbGUKLQkJOzsKLQljNHgqKQotCQliYXNpY19tYWNoaW5lPWM0eC1ub25lCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotZXNhYwotCi0jIEhlcmUgd2UgY2Fub25pY2FsaXplIGNlcnRhaW4gYWxpYXNlcyBmb3IgbWFudWZhY3R1cmVycy4KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLWRpZ2l0YWwqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2RpZ2l0YWwuKi9kZWMvJ2AKLQkJOzsKLQkqLWNvbW1vZG9yZSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvY29tbW9kb3JlLiovY2JtLydgCi0JCTs7Ci0JKikKLQkJOzsKLWVzYWMKLQotIyBEZWNvZGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIGFsaWFzZXMgZm9yIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCi0KLWlmIFsgeCIkb3MiICE9IHgiIiBdCi10aGVuCi1jYXNlICRvcyBpbgotICAgICAgICAjIEZpcnN0IG1hdGNoIHNvbWUgc3lzdGVtIHR5cGUgYWxpYXNlcwotICAgICAgICAjIHRoYXQgbWlnaHQgZ2V0IGNvbmZ1c2VkIHdpdGggdmFsaWQgc3lzdGVtIHR5cGVzLgotCSMgLXNvbGFyaXMqIGlzIGEgYmFzaWMgc3lzdGVtIHR5cGUsIHdpdGggdGhpcyBvbmUgZXhjZXB0aW9uLgotCS1zb2xhcmlzMSB8IC1zb2xhcmlzMS4qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c29sYXJpczF8c3Vub3M0fCdgCi0JCTs7Ci0JLXNvbGFyaXMpCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCS1zdnI0KikKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JLXVuaXh3YXJlKikKLQkJb3M9LXN5c3Y0LjJ1dwotCQk7OwotCS1nbnUvbGludXgqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8Z251L2xpbnV4fGxpbnV4LWdudXwnYAotCQk7OwotCSMgRmlyc3QgYWNjZXB0IHRoZSBiYXNpYyBzeXN0ZW0gdHlwZXMuCi0JIyBUaGUgcG9ydGFibGUgc3lzdGVtcyBjb21lcyBmaXJzdC4KLQkjIEVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gQSAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCSMgLXN5c3YqIGlzIG5vdCBoZXJlIGJlY2F1c2UgaXQgY29tZXMgbGF0ZXIsIGFmdGVyIHN5c3ZyNC4KLQktZ251KiB8IC1ic2QqIHwgLW1hY2gqIHwgLW1pbml4KiB8IC1nZW5peCogfCAtdWx0cml4KiB8IC1pcml4KiBcCi0JICAgICAgfCAtKnZtcyogfCAtc2NvKiB8IC1lc2l4KiB8IC1pc2MqIHwgLWFpeCogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKLQkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLXNvbGFyaXMqIHwgLXN5bSogXAotCSAgICAgIHwgLWFtaWdhb3MqIHwgLWFtaWdhZG9zKiB8IC1tc2RvcyogfCAtbmV3c29zKiB8IC11bmljb3MqIHwgLWFvZiogXAotCSAgICAgIHwgLWFvcyogXAotCSAgICAgIHwgLW5pbmR5KiB8IC12eHNpbSogfCAtdnh3b3JrcyogfCAtZWJtb24qIHwgLWhtcyogfCAtbXZzKiBcCi0JICAgICAgfCAtY2xpeCogfCAtcmlzY29zKiB8IC11bmlwbHVzKiB8IC1pcmlzKiB8IC1ydHUqIHwgLXhlbml4KiBcCi0JICAgICAgfCAtaGl1eCogfCAtMzg2YnNkKiB8IC1uZXRic2QqIHwgLW9wZW5ic2QqIHwgLWZyZWVic2QqIHwgLXJpc2NpeCogXAotCSAgICAgIHwgLWx5bnhvcyogfCAtYm9zeCogfCAtbmV4dHN0ZXAqIHwgLWN4dXgqIHwgLWFvdXQqIHwgLWVsZiogfCAtb2FiaSogXAotCSAgICAgIHwgLXB0eCogfCAtY29mZiogfCAtZWNvZmYqIHwgLXdpbm50KiB8IC1kb21haW4qIHwgLXZzdGEqIFwKLQkgICAgICB8IC11ZGkqIHwgLWVhYmkqIHwgLWxpdGVzKiB8IC1pZWVlKiB8IC1nbzMyKiB8IC1hdXgqIFwKLQkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCi0JICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC11eHB2KiB8IC1iZW9zKiB8IC1tcGVpeCogfCAtdWRrKiBcCi0JICAgICAgfCAtaW50ZXJpeCogfCAtdXdpbiogfCAtcmhhcHNvZHkqIHwgLW9wZW5zdGVwKiB8IC1vc2tpdCopCi0JIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCQk7OwotCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKLQkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8IC1uZXR3YXJlKiB8IC1vczkqIHwgLWJlb3MqIFwKLQkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW9uOTYwKiB8IC1sbmV3cyopCi0JCTs7Ci0JLW1hYyopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xtYWN8bWFjb3N8J2AKLQkJOzsKLQktbGludXgqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCi0JCTs7Ci0JLXN1bm9zNSopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKLQkJOzsKLQktc3Vub3M2KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAotCQk7OwotCS1vc2Zyb3NlKikKLQkJb3M9LW9zZnJvc2UKLQkJOzsKLQktb3NmKikKLQkJb3M9LW9zZgotCQk7OwotCS11dGVrKikKLQkJb3M9LWJzZAotCQk7OwotCS1keW5peCopCi0JCW9zPS1ic2QKLQkJOzsKLQktYWNpcyopCi0JCW9zPS1hb3MKLQkJOzsKLQktMzg2YnNkKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWN0aXgqIHwgLXV0cyopCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JLW5zMiApCi0JICAgICAgICBvcz0tbmV4dHN0ZXAyCi0JCTs7Ci0JIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgotCS1zaW5peDUuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKLQkJOzsKLQktc2luaXgqKQotCQlvcz0tc3lzdjQKLQkJOzsKLQktdHJpdG9uKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLW9zcyopCi0JCW9zPS1zeXN2MwotCQk7OwotCS1zdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQktc3ZyMykKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN5c3ZyNCkKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgotCS1zeXN2KikKLQkJOzsKLQktb3NlKikKLQkJb3M9LW9zZQotCQk7OwotCS1lczE4MDAqKQotCQlvcz0tb3NlCi0JCTs7Ci0JLXhlbml4KQotCQlvcz0teGVuaXgKLQkJOzsKLSAgICAgICAgLSptaW50IHwgLSpNaU5UKQotCSAgICAgICAgb3M9LW1pbnQKLQkJOzsKLQktbm9uZSkKLQkJOzsKLQkqKQotCQkjIEdldCByaWQgb2YgdGhlIGAtJyBhdCB0aGUgYmVnaW5uaW5nIG9mICRvcy4KLQkJb3M9YGVjaG8gJG9zIHwgc2VkICdzL1teLV0qLS8vJ2AKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBzeXN0ZW0gXGAkb3NcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotZXNhYwotZWxzZQotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgbWFjaGluZXMuCi0jIFRoZSB2YWx1ZSBzaG91bGQgYmUgd2hhdCB0aGUgdmVuZG9yIGN1cnJlbnRseSBzaGlwcyBvdXQgdGhlIGRvb3Igd2l0aCB0aGVpcgotIyBtYWNoaW5lIG9yIHB1dCBhbm90aGVyIHdheSwgdGhlIG1vc3QgcG9wdWxhciBvcyBwcm92aWRlZCB3aXRoIHRoZSBtYWNoaW5lLgotCi0jIE5vdGUgdGhhdCBpZiB5b3UncmUgZ29pbmcgdG8gdHJ5IHRvIG1hdGNoICItTUFOVUZBQ1RVUkVSIiBoZXJlIChzYXksCi0jICItc3VuIiksIHRoZW4geW91IGhhdmUgdG8gdGVsbCB0aGUgY2FzZSBzdGF0ZW1lbnQgdXAgdG93YXJkcyB0aGUgdG9wCi0jIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBPdGhlcndpc2UsIGNvZGUgYWJvdmUKLSMgd2lsbCBzaWduYWwgYW4gZXJyb3Igc2F5aW5nIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZwotIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KLQotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotYWNvcm4pCi0JCW9zPS1yaXNjaXgxLjIKLQkJOzsKLQlhcm0qLWNvcmVsKQotCQlvcz0tbGludXgKLQkJOzsKLQlhcm0qLXNlbWkpCi0JCW9zPS1hb3V0Ci0JCTs7Ci0gICAgICAgIHBkcDExLSopCi0JCW9zPS1ub25lCi0JCTs7Ci0JKi1kZWMgfCB2YXgtKikKLQkJb3M9LXVsdHJpeDQuMgotCQk7OwotCW02OCotYXBvbGxvKQotCQlvcz0tZG9tYWluCi0JCTs7Ci0JaTM4Ni1zdW4pCi0JCW9zPS1zdW5vczQuMC4yCi0JCTs7Ci0JbTY4MDAwLXN1bikKLQkJb3M9LXN1bm9zMwotCQkjIFRoaXMgYWxzbyBleGlzdHMgaW4gdGhlIGNvbmZpZ3VyZSBwcm9ncmFtLCBidXQgd2FzIG5vdCB0aGUKLQkJIyBkZWZhdWx0LgotCQkjIG9zPS1zdW5vczQKLQkJOzsKLQltNjgqLWNpc2NvKQotCQlvcz0tYW91dAotCQk7OwotCW1pcHMqLWNpc2NvKQotCQlvcz0tZWxmCi0JCTs7Ci0JbWlwcyotKikKLQkJb3M9LWVsZgotCQk7OwotCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCi0JCW9zPS1zeXN2MwotCQk7OwotCXNwYXJjLSogfCAqLXN1bikKLQkJb3M9LXN1bm9zNC4xLjEKLQkJOzsKLQkqLWJlKQotCQlvcz0tYmVvcwotCQk7OwotCSotaWJtKQotCQlvcz0tYWl4Ci0JCTs7Ci0JKi13ZWMpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLXdpbmJvbmQpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLW9raSkKLQkJb3M9LXByb2VsZgotCQk7OwotCSotaHApCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JKi1oaXRhY2hpKQotCQlvcz0taGl1eAotCQk7OwotCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKLQkJb3M9LXN5c3YKLQkJOzsKLQkqLWNibSkKLQkJb3M9LWFtaWdhb3MKLQkJOzsKLQkqLWRnKQotCQlvcz0tZGd1eAotCQk7OwotCSotZG9scGhpbikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JbTY4ay1jY3VyKQotCQlvcz0tcnR1Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCW9zPS1sdW5hCi0JCTs7Ci0JKi1uZXh0ICkKLQkJb3M9LW5leHRzdGVwCi0JCTs7Ci0JKi1zZXF1ZW50KQotCQlvcz0tcHR4Ci0JCTs7Ci0JKi1jcmRzKQotCQlvcz0tdW5vcwotCQk7OwotCSotbnMpCi0JCW9zPS1nZW5peAotCQk7OwotCWkzNzAtKikKLQkJb3M9LW12cwotCQk7OwotCSotbmV4dCkKLQkJb3M9LW5leHRzdGVwMwotCQk7OwotICAgICAgICAqLWdvdWxkKQotCQlvcz0tc3lzdgotCQk7OwotICAgICAgICAqLWhpZ2hsZXZlbCkKLQkJb3M9LWJzZAotCQk7OwotCSotZW5jb3JlKQotCQlvcz0tYnNkCi0JCTs7Ci0gICAgICAgICotc2dpKQotCQlvcz0taXJpeAotCQk7OwotICAgICAgICAqLXNpZW1lbnMpCi0JCW9zPS1zeXN2NAotCQk7OwotCSotbWFzc2NvbXApCi0JCW9zPS1ydHUKLQkJOzsKLQlmMzAxLWZ1aml0c3UpCi0JCW9zPS11eHB2Ci0JCTs7Ci0JKi1yb202OGspCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi0qYnVnKQotCQlvcz0tY29mZgotCQk7OwotCSotYXBwbGUpCi0JCW9zPS1tYWNvcwotCQk7OwotCSotYXRhcmkqKQotCQlvcz0tbWludAotCQk7OwotCSopCi0JCW9zPS1ub25lCi0JCTs7Ci1lc2FjCi1maQotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQotIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KLXZlbmRvcj11bmtub3duCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi11bmtub3duKQotCQljYXNlICRvcyBpbgotCQkJLXJpc2NpeCopCi0JCQkJdmVuZG9yPWFjb3JuCi0JCQkJOzsKLQkJCS1zdW5vcyopCi0JCQkJdmVuZG9yPXN1bgotCQkJCTs7Ci0JCQktYWl4KikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1iZW9zKikKLQkJCQl2ZW5kb3I9YmUKLQkJCQk7OwotCQkJLWhwdXgqKQotCQkJCXZlbmRvcj1ocAotCQkJCTs7Ci0JCQktbXBlaXgqKQotCQkJCXZlbmRvcj1ocAotCQkJCTs7Ci0JCQktaGl1eCopCi0JCQkJdmVuZG9yPWhpdGFjaGkKLQkJCQk7OwotCQkJLXVub3MqKQotCQkJCXZlbmRvcj1jcmRzCi0JCQkJOzsKLQkJCS1kZ3V4KikKLQkJCQl2ZW5kb3I9ZGcKLQkJCQk7OwotCQkJLWx1bmEqKQotCQkJCXZlbmRvcj1vbXJvbgotCQkJCTs7Ci0JCQktZ2VuaXgqKQotCQkJCXZlbmRvcj1ucwotCQkJCTs7Ci0JCQktbXZzKikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1wdHgqKQotCQkJCXZlbmRvcj1zZXF1ZW50Ci0JCQkJOzsKLQkJCS12eHNpbSogfCAtdnh3b3JrcyopCi0JCQkJdmVuZG9yPXdycwotCQkJCTs7Ci0JCQktYXV4KikKLQkJCQl2ZW5kb3I9YXBwbGUKLQkJCQk7OwotCQkJLWhtcyopCi0JCQkJdmVuZG9yPWhpdGFjaGkKLQkJCQk7OwotCQkJLW1wdyogfCAtbWFjb3MqKQotCQkJCXZlbmRvcj1hcHBsZQotCQkJCTs7Ci0JCQktKm1pbnQgfCAtKk1pTlQpCi0JCQkJdmVuZG9yPWF0YXJpCi0JCQkJOzsKLQkJZXNhYwotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAotCQk7OwotZXNhYwotCi1lY2hvICRiYXNpY19tYWNoaW5lJG9zCmRpZmYgLS1naXQgYS9jb25maWcvQ2hhbmdlTG9nIGIvY29uZmlnL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2ZmM2MC4uMDAwMDAwMAotLS0gYS9jb25maWcvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLTE5OTktMDQtMDcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBtdC1kMzB2OiBOZXcgZmlsZSwgcGFzcyAtZyAtT3MgLVdhLC1DIGFzIGRlZmF1bHQgb3B0aW9ucy4KLQotMTk5OS0wMi0wOCAgU3lkIFBvbGsgIDxzcG9sa0BjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQ6IEFkZGVkIG1hY3JvcyB0byBmaW5kIGl0Y2wgZmlsZXMuCi0JRXhwb3J0IFRDTF9DRkxBR1MgZnJvbSB0Y2xDb25maWcuc2guCi0JRXhwb3J0IFRDTF9MSUJfRlVMTF9QQVRILCBUS19MSUJfRlVMTF9QQVRILCBJVENMX0xJQl9GVUxMX1BBVEgsCi0JSVRLX0xJQl9GVUxMX1BBVEgsIGFuZCBUSVhfTElCX0ZVTExfUEFUSAotCVJlcGxhY2UgVElYIG1hY3JvcyB3aXRoIGJldHRlciBvbmVzIGZyb20gc25hdmlnYXRvci4KLQotVHVlIEZlYiAgMiAyMjo1MToyMSAxOTk5IFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+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+L2Rldi9udWxsYCA7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS9pdGNsL2l0a0NvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfaXRrY29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICAjIGNoZWNrIGluIGEgZmV3IG90aGVyIHByaXZhdGUgbG9jYXRpb25zCi0gIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRrY29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIFwKLQkJJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRrIFwKLQkJYGxzIC1kciAke3NyY2Rpcn0vLi4vaXRjbC9pdGtbWzNdXSogMj4vZGV2L251bGxgIDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2l0a0NvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfaXRrY29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICBdKQotICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0a2NvbmZpZ30iID0geCA7IHRoZW4KLSAgICBJVENMQ09ORklHPSIjIG5vIGl0ayBjb25maWdzIGZvdW5kIgotICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgaXRrIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMpCi0gIGVsc2UKLSAgICBub19pdGs9Ci0gICAgSVRLQ09ORklHPSR7YWNfY3ZfY19pdGtjb25maWd9L2l0a0NvbmZpZy5zaAotICAgIEFDX01TR19SRVNVTFQoZm91bmQgJElUS0NPTkZJRykKLSAgZmkKLWZpCi0KLV0pCi0KLSMgRGVmaW5lZCBhcyBhIHNlcGFyYXRlIG1hY3JvIHNvIHdlIGRvbid0IGhhdmUgdG8gY2FjaGUgdGhlIHZhbHVlcwotIyBmcm9tIFBBVEhfSVRLQ09ORklHIChiZWNhdXNlIHRoaXMgY2FuIGFsc28gYmUgY2FjaGVkKS4KLUFDX0RFRlVOKENZR19BQ19MT0FEX0lUS0NPTkZJRywgWwotICAgIGlmIHRlc3QgLWYgIiRJVEtDT05GSUciIDsgdGhlbgotICAgICAgLiAkSVRLQ09ORklHCi0gICAgZmkKLQotICAgIEFDX1NVQlNUKElUS19CVUlMRF9MSUJfU1BFQykKLSAgICBBQ19TVUJTVChJVEtfTElCX0ZJTEUpCi0gICAgQUNfU1VCU1QoSVRLX0xJQl9GVUxMX1BBVEgpCi1dKQotCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIE9rLCBsZXRzIGZpbmQgdGhlIGxpYmd1aSBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaGVhZGVycwotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC1saWJndWlpbmNsdWRlCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJHVUksIFsKLSAgICBDWUdfQUNfUEFUSF9MSUJHVUlICi0gICAgQ1lHX0FDX1BBVEhfTElCR1VJTElCCi1dKQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfTElCR1VJSCwgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotbm9fbGliZ3VpPXRydWUKLUFDX01TR19DSEVDS0lORyhmb3IgTGliZ3VpIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotQUNfQVJHX1dJVEgobGliZ3VpaW5jbHVkZSwgWyAgLS13aXRoLWxpYmd1aWluY2x1ZGUgICAgICAgZGlyZWN0b3J5IHdoZXJlIGxpYmd1aSBoZWFkZXJzIGFyZV0sIHdpdGhfbGliZ3VpaW5jbHVkZT0ke3dpdGh2YWx9KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfbGliZ3VpaCxbCi1kbmwgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1saWJndWlpbmNsdWRlIHdhcyBzcGVjaWZpZWQKLWlmIHRlc3QgeCIke3dpdGhfbGliZ3VpaW5jbHVkZX0iICE9IHggOyB0aGVuCi0gIGlmIHRlc3QgLWYgJHt3aXRoX2xpYmd1aWluY2x1ZGV9L2d1aXRjbC5oIDsgdGhlbgotICAgIGFjX2N2X2NfbGliZ3VpaD1gKGNkICR7d2l0aF9saWJndWlpbmNsdWRlfTsgcHdkKWAKLSAgZWxpZiB0ZXN0IC1mICR7d2l0aF9saWJndWlpbmNsdWRlfS9zcmMvZ3VpdGNsLmggOyB0aGVuCi0gICAgYWNfY3ZfY19saWJndWloPWAoY2QgJHt3aXRoX2xpYmd1aWluY2x1ZGV9L3NyYzsgcHdkKWAKLSAgZWxzZQotICAgIEFDX01TR19FUlJPUihbJHt3aXRoX2xpYmd1aWluY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaGVhZGVyc10pCi0gIGZpCi1maQotCi1kbmwgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggTGliZ3VpIGNvbmZpZ3VyYXRpb24gZmlsZQotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWljb25maWd9IiAhPSB4IDsgdGhlbgotICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICRhY19jdl9jX2xpYmd1aWNvbmZpZy8kaS9zcmMvZ3VpdGNsLmggOyB0aGVuCi0gICAgICBhY19jdl9jX2xpYmd1aWg9YChjZCAkYWNfY3ZfY19saWJndWljb25maWcvJGkvc3JjOyBwd2QpYAotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWlofSIgPSB4IDsgdGhlbgotICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgTGliZ3VpIHNvdXJjZSBkaXJlY3RvcnkKLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkc3JjZGlyLyRpL2xpYmd1aSogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgbGliZ3VpcGF0aD0kc3JjZGlyLyRpCi0JICAgIGJyZWFrCi0JZmkKLSAgICBkb25lCi0KLSAgICBkbmwgZmluZCB0aGUgZXhhY3QgTGliZ3VpIHNvdXJjZSBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIExpYmd1aSwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICRsaWJndWlwYXRoL2xpYmd1aSogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGkvc3JjL2d1aXRjbC5oIDsgdGhlbgotICAgICAgICAgIGFjX2N2X2NfbGliZ3VpaD1gKGNkICRpL3NyYzsgcHdkKWAKLSAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgIGRvbmUKLWZpCi0KLWRubCBzZWUgaWYgb25lIGlzIGluc3RhbGxlZAotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWlofSIgPSB4IDsgdGhlbgotICAgQUNfTVNHX1JFU1VMVChub25lKQotICAgQUNfQ0hFQ0tfSEVBREVSKGd1aXRjbC5oLCBhY19jdl9jX2xpYmd1aWg9aW5zdGFsbGVkLCBhY19jdl9jX2xpYmd1aWg9IiIpCi1maQotXSkKLUxJQkdVSUhESVI9IiIKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpaH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfV0FSTihbQ2FuJ3QgZmluZCBhbnkgTGliZ3VpIGhlYWRlcnNdKQotZmkKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpaH0iICE9IHggOyB0aGVuCi0gICAgbm9fbGliZ3VpPSIiCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWlofSIgIT0geCJpbnN0YWxsZWQiIDsgdGhlbgotICAgICAgICBMSUJHVUlIRElSPSItSSR7YWNfY3ZfY19saWJndWlofSIKLSAgICBmaQotZmkKLUFDX01TR19SRVNVTFQoJHthY19jdl9jX2xpYmd1aWh9KQotQUNfU1VCU1QoTElCR1VJSERJUikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIGZpbmQgdGhlIEdVSSBsaWJyYXJ5Ci1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJHVUlMSUIsIFsKLUFDX01TR19DSEVDS0lORyhmb3IgR1VJIGxpYnJhcnkgIGluIHRoZSBidWlsZCB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLWRubCBsb29rIGZvciB0aGUgbGlicmFyeQotQUNfTVNHX0NIRUNLSU5HKGZvciBHVUkgbGlicmFyeSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2xpYmd1aWxpYixbCi1pZiB0ZXN0IHgiJHthY19jdl9jX2xpYmd1aWxpYn0iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2xpYmd1aS9zcmMvTWFrZWZpbGUiIDsgdGhlbgotICAgICAgICBhY19jdl9jX2xpYmd1aWxpYj1gKGNkICRpL2xpYmd1aS9zcmM7IHB3ZClgCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLWZpCi1dKSAKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpbGlifSIgIT0geCA7IHRoZW4KLSAgICAgR1VJTElCPSIke0dVSUxJQn0gLUwke2FjX2N2X2NfbGliZ3VpbGlifSIKLSAgICAgTElCR1VJTElCPSItbGd1aSIKLSAgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfbGliZ3VpbGlifSkKLWVsc2UKLSAgICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfU1VCU1QoR1VJTElCKQotQUNfU1VCU1QoTElCR1VJTElCKQotXSkKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1hNjhic2QgYi9jb25maWcvbWgtYTY4YnNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTkxMjg5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1hNjhic2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1SQU5MSUI9dHJ1ZQotCi0jTm9uZSBvZiB0aGUgQXBvbGxvIGNvbXBpbGVycyBjYW4gY29tcGlsZSBnYXMgb3IgYmludXRpbHMuICBUaGUgcHJlcHJvY2Vzc29yCi0jIGNob2tlcyBvbiBiZmQsIHRoZSBjb21waWxlciB3b24ndCBsZXQgeW91IGFzc2lnbiBpbnRlZ2VycyB0byBlbnVtcywgYW5kCi0jIG90aGVyIHByb2JsZW1zLiAgRGVmaW5pbmcgQ0MgdG8gZ2NjIGlzIGEgcXVlc3Rpb25hYmxlIHdheSB0byBzYXkgImRvbid0IHVzZQotIyB0aGUgYXBvbGxvIGNvbXBpbGVyIiAodGhlIHByZWZlcnJlZCB2ZXJzaW9uIG9mIEdDQyBjb3VsZCBiZSBjYWxsZWQgY2MsCi0jIG9yIHdoYXRldmVyKSwgYnV0IEknbSBub3Qgc3VyZSBsZWF2aW5nIENDIGFzIGNjIGlzIGFueSBiZXR0ZXIuLi4KLQotI0NDPWNjIC1BIGFuc2kgLUEgcnVudHlwZSxhbnkgLUEgc3lzdHlwZSxhbnkgLVVfX1NURENfXyAtRE5PX1NUREFSRwotQ0M9Z2NjCi0KLUJJU09OPXlhY2MKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1haXgzODYgYi9jb25maWcvbWgtYWl4Mzg2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWNjZDFjLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1haXgzODYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1SQU5MSUIgPSBAOgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWFpeDQzIGIvY29uZmlnL21oLWFpeDQzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWI3NTBjLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1haXg0MworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBBSVggNC4zIGFuZCBhYm92ZSByZXF1aXJlcyAtWDMyXzY0IGZsYWcgdG8gYWxsIGFyIGFuZCBubSBjb21tYW5kcwotIyB0byBoYW5kbGUgYm90aCAzMi1iaXQgYW5kIDY0LWJpdCBvYmplY3RzLgotQVJfRk9SX1RBUkdFVD1hciAtWDMyXzY0Ci1OTV9GT1JfVEFSR0VUPW5tIC1YMzJfNjQKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1hcG9sbG82OCBiL2NvbmZpZy9taC1hcG9sbG82OApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5N2VkOS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtYXBvbGxvNjgKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUhERUZJTkVTID0gLURVU0cKLVJBTkxJQj10cnVlCi1DQz0gY2MgLUEgYW5zaSAtQSBydW50eXBlLGFueSAtQSBzeXN0eXBlLGFueSAtVV9fU1REQ19fIC1EVVNHCmRpZmYgLS1naXQgYS9jb25maWcvbWgtYXJtcGljIGIvY29uZmlnL21oLWFybXBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjZjJjOC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtYXJtcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBRz0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWN4dXggYi9jb25maWcvbWgtY3h1eApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRiMmExNi4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtY3h1eAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBmb3IgSGFycmlzIENYL1VYIDcgKGFuZCBtYXliZSA2KSwgYmFzZWQgb24gc3lzdjQgY29uZmlndXJhdGlvbi4KLQotIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCi1TWVNWID0gLURTWVNWIC1EU1ZSNAotUkFOTElCID0gdHJ1ZQotCi0jIEMrKyBkZWJ1Z2dpbmcgaXMgbm90IHlldCBzdXBwb3J0ZWQgdW5kZXIgU1ZSNCAoRFdBUkYpCi1DWFhGTEFHUz0tTwotCi0jIFRoZSBsIGZsYWcgZ2VuZXJhdGVzIGEgd2FybmluZyBmcm9tIHRoZSBTVlI0IGFyY2hpdmVyLCByZW1vdmUgaXQuCi1BUl9GTEFHUyA9IGNxCi0KLSMgVW5kZXIgQ1gvVVgsIHdlIHdhbnQgdG8gdGVsbCB0aGUgY29tcGlsZXIgdG8gdXNlIEFOU0kgbW9kZS4KLUNDPWNjIC1YYQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWN5Z3dpbiBiL2NvbmZpZy9taC1jeWd3aW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MTAyN2YuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWN5Z3dpbgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotRVhUUkFfVEFSR0VUX0hPU1RfQUxMX01PRFVMRVM9YWxsLWxpYnRlcm1jYXAKLUVYVFJBX1RBUkdFVF9IT1NUX0lOU1RBTExfTU9EVUxFUz1pbnN0YWxsLWxpYnRlcm1jYXAKLQotYWxsLWdkYjogYWxsLWxpYnRlcm1jYXAKLQotaW5zdGFsbC1nZGI6IGFsbC1saWJ0ZXJtY2FwCmRpZmYgLS1naXQgYS9jb25maWcvbWgtZGVjc3RhdGlvbiBiL2NvbmZpZy9taC1kZWNzdGF0aW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzIwMTkyLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1kZWNzdGF0aW9uCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1DQyA9IGNjIC1XZiwtWE5nMTAwMAotCi0jIGZvciBYMTEsIHNpbmNlIHRoZSBuYXRpdmUgREVDd2luZG93cyBpbmNsdWRlIGZpbGVzIGFyZSByZWFsbHkgYnJva2VuIHdoZW4KLSMgaXQgY29tZXMgdG8gZnVuY3Rpb24gcHJvdG90eXBlcy4gIAotWDExX0VYVFJBX0NGTEFHUyA9ICItRE5lZWRGdW5jdGlvblByb3RvdHlwZXM9MCIKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1kZWx0YTg4IGIvY29uZmlnL21oLWRlbHRhODgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOWM0NTMuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWRlbHRhODgKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVJBTkxJQiA9IHRydWUKLQotCi0KZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1kZ3V4IGIvY29uZmlnL21oLWRndXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZDg1ZDYuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWRndXgKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLUhERUZJTkVTPS1ESE9TVF9TWVM9REdVWF9TWVMKLUNDPWdjYyAtV2FsbCAtYW5zaSAtRF9fdXNpbmdfREdVWAotUkFOTElCPXRydWUKLQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWRndXgzODYgYi9jb25maWcvbWgtZGd1eDM4NgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU4ODVjMy4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtZGd1eDM4NgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgZnJvbSBtaC1kZ3V4Ci1IREVGSU5FUz0tREhPU1RfU1lTPURHVVhfU1lTCi1DQz1nY2MgLVdhbGwgLWFuc2kgLURfX3VzaW5nX0RHVVgKLVJBTkxJQiA9IHRydWUKLQotIyBmcm9tIG1oLXN5c3Y0Ci0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCi0KLSMgQysrIGRlYnVnZ2luZyBpcyBub3QgeWV0IHN1cHBvcnRlZCB1bmRlciBTVlI0IChEV0FSRikKLUNYWEZMQUdTPS1PCi0KLSMgVGhlIGwgZmxhZyBnZW5lcmF0ZXMgYSB3YXJuaW5nIGZyb20gdGhlIFNWUjQgYXJjaGl2ZXIsIHJlbW92ZSBpdC4KLUFSX0ZMQUdTID0gY3IKLQotWDExX0VYVFJBX0xJQlMgPSAtbG5zbAotCi0jIGZyb20gYW5nZWxhCi0jIG5vIGRlYnVnZ2luZyBkdWUgdG8gYnJva2VuIGNvbXBpbGVyLCB1c2UgQlNEIHN0eWxlIHRpbWVvZmRheQotQ0ZMQUdTPS1PIC1EX0JTRF9USU1FT0ZEQVlfRkxBVk9SCi0KZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1kamdwcCBiL2NvbmZpZy9taC1kamdwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyMDA3Yi4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtZGpncHAKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgV2UgZG9uJ3Qgd2FudCB0byB1c2UgZGVidWdnaW5nIGluZm9ybWF0aW9uIG9uIERPUy4gIFVuZm9ydHVuYXRlbHksCi0jIHRoaXMgcmVxdWlyZXMgdGhhdCB3ZSBzZXQgQ0ZMQUdTLgotIyBUaGlzIHVzZWQgdG8gc2V0IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyLgotQ0ZMQUdTPS1PMgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWVsZmFscGhhcGljIGIvY29uZmlnL21oLWVsZmFscGhhcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWNmMmM4Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1lbGZhbHBoYXBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUc9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1ocDMwMCBiL2NvbmZpZy9taC1ocDMwMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxNzI0ZC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtaHAzMDAKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YKLSMgQXZvaWQgInRvbyBtdWNoIGRlZmluaW5nIiBlcnJvcnMgZnJvbSBIUFVYIGNvbXBpbGVyLgotQ0MgPSBjYyAtV3AsLUgyNTYwMDAKLSMgSWYgImFyIiBpbiAkUEFUSCBpcyBHTlUgYXIsIHRoZSBzeW1ib2wgdGFibGUgbWF5IG5lZWQgcmVidWlsZGluZy4KLSMgSWYgaXQncyBIUC9VWCBhciwgdGhpcyBzaG91bGQgYmUgaGFybWxlc3MuCi1SQU5MSUIgPSBhciB0cwotCi0jIE5hdGl2ZSBjYyBjYW4ndCBib290c3RyYXAgZ2NjIHdpdGggLWcuICBEZWZpbmluZyBDRkxBR1MgaGVyZSBsb3NlcyAoYSkKLSMgZm9yIG5vbi1nY2MgZGlyZWN0b3JpZXMsIChiKSBpZiB3ZSBhcmUgY29tcGlsaW5nIHdpdGggZ2NjLCBub3QKLSMgbmF0aXZlIGNjLiAgTmVpdGhlciAoYSkgbm9yIChiKSBoYXMgYSB0cml2aWFsIGZpeCB0aG91Z2guCi0KLUNGTEFHUyA9CmRpZmYgLS1naXQgYS9jb25maWcvbWgtaHB1eCBiL2NvbmZpZy9taC1ocHV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDcxYzlkLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1ocHV4CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLUNDID0gY2MgLVdwLC1IMjU2MDAwCi1TWVNWID0gLURTWVNWCi1SQU5MSUIgPSB0cnVlCmRpZmYgLS1naXQgYS9jb25maWcvbWgtaHB1eDggYi9jb25maWcvbWgtaHB1eDgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNzFjOWQuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWhwdXg4CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLUNDID0gY2MgLVdwLC1IMjU2MDAwCi1TWVNWID0gLURTWVNWCi1SQU5MSUIgPSB0cnVlCmRpZmYgLS1naXQgYS9jb25maWcvbWgtaW50ZXJpeCBiL2NvbmZpZy9taC1pbnRlcml4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWI4ZWNmLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1pbnRlcml4CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyBUaGUgc2hlbGwgbWF5IG5vdCBiZSBpbiAvYmluLiAKLVNIRUxMID0gc2gKLVJBTkxJQiA9IHRydWUKLQotIyBXZSBkb24ndCB3YW50IGRlYnVnZ2luZyBpbmZvIGluIEludGVyaXgtaG9zdGVkIHRvb2xjaGFpbnMuCi0jIEFjY29tcGxpc2ggdGhpcyBieSBvdmVycmlkaW5nIENGTEFHUy4gVGhpcyBpcyBhbHNvIGEgd29ya2Fyb3VuZAotIyBmb3IgTEQgY3Jhc2ggd2hlbiBidWlsZGluZyBzaGFyZWQgbGlic3RkYysrLgotQ0ZMQUdTPS1PMgotQ1hYRkxBR1M9LU8yCi0KLSMgV2UgYWxzbyBuZWVkIHRvIG92ZXJyaWRlIExJQkdDQzJfREVCVUdfQ0ZMQUdTIHNvIGxpYmdjYzIgd2lsbCBiZQotIyBidWlsdCB3aXRob3V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotCi1MSUJHQ0MyX0RFQlVHX0NGTEFHUz0KZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1pcml4NCBiL2NvbmZpZy9taC1pcml4NApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg3MjE0NS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtaXJpeDQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgTWFrZWZpbGUgY2hhbmdlcyBmb3IgU0dJJ3MgcnVubmluZyBJUklYLTQueC4KLSMgVGVsbCBjb21waWxlciB0byB1c2UgSyZSIEMuICBXZSBjYW4ndCBjb21waWxlIHVuZGVyIHRoZSBTR0kgQW5zaQotIyBlbnZpcm9ubWVudC4gIEFsc28gYnVtcCBzd2l0Y2ggdGFibGUgc2l6ZSBzbyB0aGF0IGNwLXBhcnNlIHdpbGwKLSMgY29tcGlsZS4gIEJ1bXAgc3RyaW5nIGxlbmd0aCBsaW1pdCBzbyBsaW5rZXIgYnVpbGRzLgotCi1DQyA9IGNjIC1jY2tyIC1XZiwtWE5nMTUwMCAtV2YsLVhOazEwMDAgLVdmLC1YTmgyMDAwIC1XZiwtWE5sODE5MgotU1lTViA9IC1EU1lTVgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWlyaXg1IGIvY29uZmlnL21oLWlyaXg1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmQ3Yzk5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1pcml4NQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBNYWtlZmlsZSBjaGFuZ2VzIGZvciBTR0kncyBydW5uaW5nIElSSVgtNS54LgotU1lTViA9IC1EU1lTVgotUkFOTElCID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWlyaXg2IGIvY29uZmlnL21oLWlyaXg2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDI1YzE2Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1pcml4NgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBNYWtlZmlsZSBjaGFuZ2VzIGZvciBTR0kncyBydW5uaW5nIElSSVgtNi54LgotU1lTViA9IC1EU1lTVgotUkFOTElCID0gdHJ1ZQotIyBTcGVjaWZ5IHRoZSBBQkksIHRvIGVuc3VyZSB0aGF0IGFsbCBJcml4IDYgc3lzdGVtcyB3aWxsIGJlaGF2ZSB0aGUgc2FtZS4KLSMgQWxzbywgdXNpbmcgLTMyIGF2b2lkcyBidWdzIHRoYXQgZXhpc3QgaW4gdGhlIG4zMi9uNjQgc3VwcG9ydCBpbiBzb21lCi0jIHZlcnNpb25zIG9mIHRoZSBTR0kgY29tcGlsZXIuCi1DQyA9IGNjIC0zMgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWx5bnhvcyBiL2NvbmZpZy9taC1seW54b3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZmNiNzkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWx5bnhvcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyAvYmluL2NjIGlzIGxlc3MgdGhhbiB1c2VmdWwgZm9yIG91ciBwdXJwb3Nlcy4gIEFsd2F5cyB1c2UgR0NDCi1DQyA9IC9iaW4vZ2NjCmRpZmYgLS1naXQgYS9jb25maWcvbWgtbHlueHJzNmsgYi9jb25maWcvbWgtbHlueHJzNmsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNzkzOTkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWx5bnhyczZrCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIEx5bnhPUyBydW5uaW5nIG9uIHRoZSByczYwMDAgZG9lc24ndCBoYXZlIHJhbmxpYgotUkFOTElCID0gdHJ1ZQotCi0jIC9iaW4vY2MgaXMgbGVzcyB0aGFuIHVzZWZ1bCBmb3Igb3VyIHB1cnBvc2VzLiAgQWx3YXlzIHVzZSBHQ0MKLUNDID0gL3Vzci9jeWdudXMvcHJvZ3Jlc3NpdmUvYmluL2djYwotCi0jIC9iaW4vc2ggaXMgdG9vIGJ1Z2d5LCBzbyB1c2UgL2Jpbi9iYXNoIGluc3RlYWQuCi1TSEVMTCA9IC9iaW4vYmFzaApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLW02OGtwaWMgYi9jb25maWcvbWgtbTY4a3BpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlNDhkOS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtbTY4a3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUc9LWZwaWMKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1taW5ndzMyIGIvY29uZmlnL21oLW1pbmd3MzIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDgzOWQuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLW1pbmd3MzIKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIFdlIGRvbid0IHdhbnQgZGVidWdnaW5nIGluZm8gaW4gV2luMzItaG9zdGVkIHRvb2xjaGFpbnMuCi0jIEFjY29tcGxpc2ggdGhpcyBieSBvdmVycmlkaW5nIENGTEFHUy4KLUNGTEFHUz0tTzIKLUNYWEZMQUdTPS1PMgotCi0jIFdlIGFsc28gbmVlZCB0byBvdmVycmlkZSBMSUJHQ0MyX0RFQlVHX0NGTEFHUyBzbyBsaWJnY2MyIHdpbGwgYmUKLSMgYnVpbHQgd2l0aG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLQotTElCR0NDMl9ERUJVR19DRkxBR1M9Ci0KLSMgY3VzdG9tIGluc3RhbGxhdGlvbiBydWxlcyBmb3IgbWluZ3czMiAoYXBwZW5kIC5leGUgdG8gYmluYXJpZXMsIGV0Yy4pCi0jIElOU1RBTExfRE9TUkVMPWluc3RhbGwtZG9zcmVsCmRpZmYgLS1naXQgYS9jb25maWcvbWgtbmNyMzAwMCBiL2NvbmZpZy9taC1uY3IzMDAwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmJkODAzLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1uY3IzMDAwCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBIb3N0IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgYW4gTkNSIDMwMDAgKGk0ODYvU1ZSNCkgc3lzdGVtLgotCi0jIFRoZSBOQ1IgMzAwMCBzaGlwcyB3aXRoIGEgTWV0YVdhcmUgY29tcGlsZXIgaW5zdGFsbGVkIGFzIC9iaW4vY2MuCi0jIFRoaXMgY29tcGlsZXIgbm90IG9ubHkgZW1pdHMgb2Jub3hpb3VzIGNvcHlyaWdodCBtZXNzYWdlcyBldmVyeSB0aW1lCi0jIHlvdSBydW4gaXQsIGJ1dCBpdCBjaG9rZXMgYW5kIGRpZXMgb24gYSB3aG9sZSBidW5jaCBvZiBHTlUgc291cmNlCi0jIGZpbGVzLiAgRGVmYXVsdCB0byB1c2luZyB0aGUgQVQmVCBjb21waWxlciBpbnN0YWxsZWQgaW4gL3Vzci9jY3MvQVRUL2NjLgotIyBVbmZvcnR1bmF0ZWx5IHRob3VnaCwgdGhlIEFUJlQgY29tcGlsZXIgc29tZXRpbWVzIGdlbmVyYXRlcyBjb2RlIHRoYXQKLSMgdGhlIGFzc2VtYmxlciBiYXJmcyBvbiBpZiAtZyBpcyB1c2VkLCBzbyBkaXNhYmxlIGl0IGJ5IGRlZmF1bHQgYXMgd2VsbC4KLUNDID0gL3Vzci9jY3MvQVRUL2NjCi1DRkxBR1MgPQotCi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCi0KLSMgVGhlIGwgZmxhZyBnZW5lcmF0ZXMgYSB3YXJuaW5nIGZyb20gdGhlIFNWUjQgYXJjaGl2ZXIsIHJlbW92ZSBpdC4KLUFSX0ZMQUdTID0gY3EKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1uY3JzdnI0MyBiL2NvbmZpZy9taC1uY3JzdnI0MwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiMDk5MS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtbmNyc3ZyNDMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSMgSG9zdCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIGFuIE5DUiAzMDAwIChpNDg2L1NWUjQzKSBzeXN0ZW0uCi0KLSMgVGhlIE1ldGFXYXJlIGNvbXBpbGVyIHdpbGwgZ2VuZXJhdGUgYSBjb3B5cmlnaHQgbWVzc2FnZSB1bmxlc3MgeW91Ci0jIHR1cm4gaXQgb2ZmIGJ5IGFkZGluZyB0aGUgLUhub2NvcHlyIGZsYWcuCi1DQyA9IGNjIC1Ibm9jb3B5cgotCi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCmRpZmYgLS1naXQgYS9jb25maWcvbWgtbmVjdjQgYi9jb25maWcvbWgtbmVjdjQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ODc3MzYuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLW5lY3Y0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyBIb3N0IE1ha2VmaWxlIGZyYWdtZW50IGZvciBORUMgTUlQUyBTVlI0LgotCi0jIFRoZSBDIGNvbXBpbGVyIG9uIE5FQyBNSVBTIFNWUjQgbmVlZHMgYmlnZ2VyIHRhYmxlcy4KLUNDID0gY2MgLVpYTmQ9NTAwMCAtWlhOZz0xMDAwCi0KLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTViAtRFNWUjQKLVJBTkxJQiA9IHRydWUKLQotIyBORUMgLWxYMTEgbmVlZHMgc29tZSBvdGhlciBsaWJyYXJpZXMuCi1YMTFfRVhUUkFfTElCUyA9IC1sc29ja2V0IC1sbnNsCmRpZmYgLS1naXQgYS9jb25maWcvbWgtcGFwaWMgYi9jb25maWcvbWgtcGFwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2YyYzguLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXBhcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBRz0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXBwY3BpYyBiL2NvbmZpZy9taC1wcGNwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2YyYzguLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXBwY3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUc9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1yaXNjb3MgYi9jb25maWcvbWgtcmlzY29zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTg2YjMwLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1yaXNjb3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIFRoaXMgaXMgZm9yIGEgTUlQUyBydW5uaW5nIFJJU0Mvb3MgNC41MkMuCi0KLSMgVGhpcyBpcyBuZWVkZWQgZm9yIEdEQiwgYnV0IG5lZWRzIHRvIGJlIGluIHRoZSB0b3AtbGV2ZWwgbWFrZSBiZWNhdXNlCi0jIGlmIGEgbGlicmFyeSBpcyBjb21waWxlZCB3aXRoIHRoZSBic2QgaGVhZGVycyBhbmQgZ2V0cyBsaW5rZWQgd2l0aCB0aGUKLSMgc3lzdiBzeXN0ZW0gbGlicmFyaWVzIGFsbCBoZWxsIGNhbiBicmVhayBsb29zZSAoZS5nLiBhIGptcF9idWYgbWlnaHQgYmUKLSMgYSBkaWZmZXJlbnQgc2l6ZSkuCi0jIHB0cmFjZSgyKSBhcHBhcmVudGx5IGhhcyBwcm9ibGVtcyBpbiB0aGUgQlNEIGVudmlyb25tZW50LiAgTm8gd29ya2Fyb3VuZCBpcwotIyBrbm93biBleGNlcHQgdG8gc2VsZWN0IHRoZSBzeXN2IGVudmlyb25tZW50LiAgQ291bGQgd2UgdXNlIC9wcm9jIGluc3RlYWQ/Ci0jIFRoZXNlICJzeXN2IGVudmlyb25tZW50cyIgYW5kICJic2QgZW52aXJvbm1lbnRzIiBvZnRlbiBlbmQgdXAgYmVpbmcgYSBwYWluLgotIwotIyBUaGlzIGlzIG5vdCBwYXJ0IG9mIENGTEFHUyBiZWNhdXNlIHBlcmhhcHMgbm90IGFsbCBDIGNvbXBpbGVycyBoYXZlIHRoaXMKLSMgb3B0aW9uLgotQ0M9IGNjIC1zeXN0eXBlIHN5c3YKLQotUkFOTElCID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXNjbyBiL2NvbmZpZy9taC1zY28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMzM3YzkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXNjbworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTVgotUkFOTElCID0gdHJ1ZQotIyBZb3UgbWF5IG5lZWQgdGhpcyBpZiB5b3UgZG9uJ3QgaGF2ZSBiaXNvbi4KLSMgQklTT04gPSB5YWNjIC1TbTEwNDAwCi0jIFRoZSBuYXRpdmUgQyBjb21waWxlciBib3RjaGVzIHNvbWUgc2ltcGxlIHVzZXMgb2YgY29uc3QuICBVbmZvcnR1bmF0ZWx5LAotIyBpdCBkb2Vzbid0IGRlZmluZWQgYW55dGhpbmcgbGlrZSAiX19zY29fXyIgZm9yIHVzIHRvIHRlc3QgZm9yIGluIGFuc2lkZWNsLmguCi1DQyA9IGNjIC1EY29uc3Q9Ci0KLVgxMV9FWFRSQV9MSUJTID0gLWxzb2NrZXQgLWxtIC1saW50bCAtbG1hbGxvYwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXNvbGFyaXMgYi9jb25maWcvbWgtc29sYXJpcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRiZWE1NC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtc29sYXJpcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBNYWtlZmlsZSBjaGFuZ2VzIGZvciBTdW5zIHJ1bm5pbmcgU29sYXJpcyAyCi0KLVNZU1YgPSAtRFNZU1YKLVJBTkxJQiA9IHRydWUKLQotWDExX0VYVFJBX0xJQlMgPSAtbG5zbCAtbHNvY2tldApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXNwYXJjcGljIGIvY29uZmlnL21oLXNwYXJjcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmRiYzIyLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1zcGFyY3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUc9YGNhc2UgIiR7TElCQ0ZMQUdTfSAke0xJQkNYWEZMQUdTfSIgaW4gKi1mcGljKiApIGVjaG8gLWZwaWMgOzsgKiApIGVjaG8gLWZQSUMgOzsgZXNhY2AKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1zdW4zIGIvY29uZmlnL21oLXN1bjMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZDUxNTUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXN1bjMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgU3VuJ3MgQyBjb21waWxlciBuZWVkcyB0aGUgLUogZmxhZyB0byBiZSBhYmxlIHRvIGNvbXBpbGUgY3AtcGFyc2UuYwotIyB3aXRob3V0IG92ZXJmbG93aW5nIHRoZSBqdW1wIHRhYmxlcyAoLUogc2F5cyB0byB1c2UgYSAzMiBiaXQgdGFibGUpCi1DQyA9IGNjIC1KCmRpZmYgLS1naXQgYS9jb25maWcvbWgtc3lzdiBiL2NvbmZpZy9taC1zeXN2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmIxMTg3Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1zeXN2CisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YKLVJBTkxJQiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1zeXN2NCBiL2NvbmZpZy9taC1zeXN2NApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwNjY1MS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtc3lzdjQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCi0KLSMgQysrIGRlYnVnZ2luZyBpcyBub3QgeWV0IHN1cHBvcnRlZCB1bmRlciBTVlI0IChEV0FSRikKLUNYWEZMQUdTPS1PCi0KLSMgVGhlIGwgZmxhZyBnZW5lcmF0ZXMgYSB3YXJuaW5nIGZyb20gdGhlIFNWUjQgYXJjaGl2ZXIsIHJlbW92ZSBpdC4KLUFSX0ZMQUdTID0gY3IKLQotWDExX0VYVFJBX0xJQlMgPSAtbG5zbApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXN5c3Y1IGIvY29uZmlnL21oLXN5c3Y1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmEzOGU1Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1zeXN2NQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCi1TWVNWID0gLURTWVNWIC1EU1ZSNCAtRFNWUjUKLVJBTkxJQiA9IHRydWUKLQotIyBUaGUgbCBmbGFnIGdlbmVyYXRlcyBhIHdhcm5pbmcgZnJvbSB0aGUgU1ZSNCBhcmNoaXZlciwgcmVtb3ZlIGl0LgotQVJfRkxBR1MgPSBjcgotCi1YMTFfRVhUUkFfTElCUyA9IC1sbnNsCmRpZmYgLS1naXQgYS9jb25maWcvbWgtdmF4dWx0MiBiL2NvbmZpZy9taC12YXh1bHQyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGUyZGM4Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC12YXh1bHQyCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFRoZSBvbGQgQlNEIHBjYyBpc24ndCB1cCB0byBjb21waWxpbmcgcGFydHMgb2YgZ2RiIHNvIHVzZSBnY2MKLUNDID0gZ2NjCmRpZmYgLS1naXQgYS9jb25maWcvbWgteDg2cGljIGIvY29uZmlnL21oLXg4NnBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlNDhkOS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgteDg2cGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBRz0tZnBpYwpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy1taC1tcHcgYi9jb25maWcvbXB3LW1oLW1wdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQzZWY0Zi4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3LW1oLW1wdworKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0jIFRoaXMgaXMgYW4gTVBXIG1ha2VmaWxlIGZyYWdtZW50LgotCi0jIFNpbmNlIHRoZXJlIGFyZSBhIG11bHRpcGxpY2l0eSBvZiBNYWMgY29tcGlsZXJzIGFuZCB0d28gZGlmZmVyZW50Ci0jIHByb2Nlc3NvcnMsIHRoaXMgZmlsZSBpcyBwcmltYXJpbHkgYSBsaWJyYXJ5IG9mIG9wdGlvbnMgZm9yIGVhY2gKLSMgY29tcGlsZXIuICBTb21lYm9keSBlbHNlIChzdWNoIGFzIGEgY29uZmlndXJlIG9yIGJ1aWxkIHNjcmlwdCkgd2lsbAotIyBtYWtlIHRoZSBhY3R1YWwgY2hvaWNlLgotCi0jIENvbXBpbGVyIHRvIHVzZSBmb3IgY29tcGlsaW5nLgotCi1DQ19NUFdfQyA9IEMgLWQgTVBXX0MgLWQgQUxNT1NUX1NUREMgLWQgQU5TSV9QUk9UT1RZUEVTIC1kIE1QVyAtbWM2ODAyMCAtbW9kZWwgZmFyIC1iIC13Ci0KLUNDX1NDID0gU0MgLWQgQUxNT1NUX1NUREMgLWQgQU5TSV9QUk9UT1RZUEVTIC1kIE1QVyAtbWM2ODAyMCAtbW9kZWwgZmFyIC1iIC1pICcnIC1pIDoKLQotQ0NfTVdDNjhLID0gTVdDNjhLIC1kIE1QVyAtZW51bSBpbnQgLW1wd19jaGFycyAtc3ltIG9uIC13IG9mZiAtbWM2ODAyMCAtbW9kZWwgZmFyCi0KLUNDX1BQQ0MgPSBQUENDIC1kIHBvd2VyYz0xIC1kIHBhc2NhbD0gLWQgQUxNT1NUX1NUREMgLWQgQU5TSV9QUk9UT1RZUEVTIC1kIE1QVyAtdwotCi1DQ19NUkMgPSBNckMgLWQgcG93ZXJjPTEgLWQgcGFzY2FsPSAtZCBBTE1PU1RfU1REQyAtZCBBTlNJX1BST1RPVFlQRVMgLWQgTVBXIC1pICcnIC1pIDogLWptCi0KLUNDX1NNckMgPSBTTXJDIC1kIE1QVwotCi0jICItbXB3X2NoYXJzIiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBHTlUgc291cmNlcyBvZnRlbiBtaXggc2lnbmVkIGFuZAotIyB1bnNpZ25lZCBjYXN1YWxseS4KLSMgIi13IG9mZiIgaXMgbm90IGEgZ3JlYXQgaWRlYSwgYnV0IENXNyBpcyBjb21wbGFpbmluZyBhYm91dCBlbnVtCi0jIGFzc2lnbm1lbnRzLgotIyAiLW9wdCBnbG9iYWwscGVlcCxsNCxzcGVlZCIgaXMgc29tZXRpbWVzIGdvb2QsIGFuZCBzb21ldGltZXMgYmFkLgotIyBXZSBtdXN0IHVzZSB7Q0luY2x1ZGVzfSBzbyB0aGF0IE1QVyB0b29scyB3aWxsIHdvcms7IHtNV0NJbmNsdWRlc30KLSMgZGVmaW5lcyBzdGRvdXQsIGlzbG93ZXIsIGV0YywgaW4gd2F5cyB0aGF0IGFyZSBpbmNvbXBhdGlibGUgd2l0aCBNUFcncwotIyBydW50aW1lLiAgSG93ZXZlciwgdGhpcyBjYW5ub3QgYmUgZG9uZSB2aWEgIC1pICJ7Q0luY2x1ZGVzfSIsIHNpbmNlCi0jIHRoYXQgZG9lcyBub3QgYWZmZWN0IGhvdyA8Pi10eXBlIGluY2x1ZGVzIGhhcHBlbjsgaW5zdGVhZCwgdGhlIHZhcmlhYmxlCi0jIE1XQ0luY2x1ZGVzIG11c3QgYmUgc2V0IHRvIHBvaW50IGF0IHtDSW5jbHVkZXN9LgotCi1DQ19NV0NQUEMgPSBNV0NQUEMgLWQgTVBXIC1lbnVtIGludCAtbXB3X2NoYXJzIC1zeW0gb24gLXcgb2ZmCi0KLSMgTm90ZSB0aGF0IEdDQyBkb2VzICpub3QqIHdpcmUgaW4gYSBkZWZpbml0aW9uIG9mICJwYXNjYWwiLCBzbyB0aGF0Ci0jIGl0IGNhbiBiZSBoYW5kbGVkIGluIGFub3RoZXIgd2F5IGlmIGRlc2lyZWQuCi0KLUNDXzY4S19HQ0MgPSBnQyAtRHBhc2NhbD0gLURBTlNJX1BST1RPVFlQRVMgLURNUFcKLQotQ0NfUFBDX0dDQyA9IGdDIC1EcG93ZXJjPTEgLURwYXNjYWw9IC1EQU5TSV9QUk9UT1RZUEVTIC1ETVBXCi0KLSMgTm90aGluZyBmb3IgdGhlIGRlZmF1bHQgQ0ZMQUdTLgotCi1DRkxBR1MgPSAKLQotIyBUb29sIHRvIHVzZSBmb3IgbWFraW5nIGxpYnJhcmllcy9hcmNoaXZlcy4KLQotQVJfTElCID0gTGliCi0KLUFSX01XTElOSzY4SyA9IE1XTGluazY4SyAteG0gbGlicmFyeQotCi1BUl9QUENMSU5LID0gUFBDTGluayAteG0gbGlicmFyeQotCi1BUl9NV0xJTktQUEMgPSBNV0xpbmtQUEMgLXhtIGxpYnJhcnkKLQotQVJfQVIgPSBhcgotCi1BUl9GTEFHUyA9IC1vCi0KLVJBTkxJQl9OVUxMID0gbnVsbC1jb21tYW5kCi0KLVJBTkxJQl9SQU5MSUIgPSByYW5saWIKLQotIyBDb21waWxlciBhbmQvb3IgbGlua2VyIHRvIHVzZSBmb3IgbGlua2luZy4KLQotQ0NfTERfTElOSyA9IExpbmsgLXcgLWQgLW1vZGVsIGZhciB7Q0NfTERfVE9PTF9GTEFHU30KLQotQ0NfTERfTVdMSU5LNjhLID0gTVdMaW5rNjhLIC13IHtDQ19MRF9UT09MX0ZMQUdTfSAtc3ltIG9uIC1tb2RlbCBmYXIKLQotQ0NfTERfUFBDTElOSyA9IFBQQ0xpbmsgLW1haW4gX19zdGFydCAtb3V0cHV0Zm9ybWF0IHhjb2ZmCi0KLUNDX0xEX01XTElOS1BQQyA9IE1XTGlua1BQQyAtdyB7Q0NfTERfVE9PTF9GTEFHU30gLXN5bSBvbgotCi1DQ19MRF9HTEQgPSBnQwotCi0jIEV4dGVuc2lvbiBmb3IgbGlua2VyIG91dHB1dC4KLQotUFJPR19FWFRfNjhLID0KLQotUFJPR19FWFRfWENPRkYgPSAueGNvZmYKLQotIyBOb3RoaW5nIGZvciB0aGUgZGVmYXVsdCBMREZMQUdTLgotCi1MREZMQUdTID0gLXcKLQotQ0NfTERfVE9PTF9GTEFHUyA9IC1jICdNUFMgJyAtdCBNUFNUCi0KLSMgTGlicmFyaWVzIHRvIGxpbmsgYWdhaW5zdC4KLQotIyBJdCB3b3VsZCBhcHBlYXIgdGhhdCB0aGUgbWF0aCBsaWJyYXJpZXMgYXJlIG5vdAotIyBuZWVkZWQgZXhjZXB0IHRvIHByb3ZpZGUgYSBkZWZpbml0aW9uIGZvciBzY2FsYiwKLSMgd2hpY2ggaXMgY2FsbGVkIGZyb20gbGRleHAsIHdoaWNoIGlzIHJlZmVyZW5jZWQKLSMgaW4gdGhlIG02OGsgb3Bjb2RlcyBsaWJyYXJ5LgotCi1FWFRSQUxJQlNfQyA9IFxPcHRpb24tZAotCSJ7Q0xpYnJhcmllc30iU3RkQ2xpYi5vIFxPcHRpb24tZAotCSJ7Q0xpYnJhcmllc30iTWF0aC5vIFxPcHRpb24tZAotCSJ7Q0xpYnJhcmllc30iQ1NBTkVMaWIubyBcT3B0aW9uLWQKLQkie0xpYnJhcmllc30iU3R1YnMubyBcT3B0aW9uLWQKLQkie0xpYnJhcmllc30iUnVudGltZS5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJJbnRlcmZhY2UubyBcT3B0aW9uLWQKLQkie0xpYnJhcmllc30iVG9vbExpYnMubwotCi1FWFRSQUxJQlNfTVdDNjhLID0gXE9wdGlvbi1kCi0JIntDTGlicmFyaWVzfSJTdGRDbGliLm8gXE9wdGlvbi1kCi0JIntDTGlicmFyaWVzfSJNYXRoLm8gXE9wdGlvbi1kCi0JIntDTGlicmFyaWVzfSJDU0FORUxpYi5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJTdHVicy5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJSdW50aW1lLm8gXE9wdGlvbi1kCi0JIntMaWJyYXJpZXN9IkludGVyZmFjZS5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJUb29sTGlicy5vIFxPcHRpb24tZAotCSJ7TVc2OEtMaWJyYXJpZXN9TVBXIEFOU0kgKDRpKSBDLjY4Sy5MaWIiCi0KLUVYVFJBTElCU19QUENfWENPRkYgPSBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iU3RkQ1J1bnRpbWUubyBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iSW50ZXJmYWNlTGliLnhjb2ZmIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJNYXRoTGliLnhjb2ZmIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJTdGRDTGliLnhjb2ZmIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJQUENUb29sTGlicy5vIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJQUENDUnVudGltZS5vIFxPcHRpb24tZAotCSJ7R0NDUFBDTGlicmFyaWVzfSJsaWJnY2MueGNvZmYKLQotRVhUUkFMSUJTX1BQQyA9IFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJTdGRDUnVudGltZS5vIFxPcHRpb24tZAotCSJ7U2hhcmVkTGlicmFyaWVzfSJJbnRlcmZhY2VMaWIgXE9wdGlvbi1kCi0JIntTaGFyZWRMaWJyYXJpZXN9Ik1hdGhMaWIgXE9wdGlvbi1kCi0JIntTaGFyZWRMaWJyYXJpZXN9IlN0ZENMaWIgXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlBQQ1Rvb2xMaWJzLm8gXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlBQQ0NSdW50aW1lLm8gXE9wdGlvbi1kCi0JIntHQ0NQUENMaWJyYXJpZXN9ImxpYmdjYy54Y29mZgotCi1FWFRSQUxJQlNfTVdDUFBDID0gXE9wdGlvbi1kCi0JIntNV1BQQ0xpYnJhcmllc30iTVdTdGRDUnVudGltZS5MaWIgXE9wdGlvbi1kCi0JIntNV1BQQ0xpYnJhcmllc30iSW50ZXJmYWNlTGliIFxPcHRpb24tZAotCSJ7TVdQUENMaWJyYXJpZXN9IlN0ZENMaWIgXE9wdGlvbi1kCi0JIntNV1BQQ0xpYnJhcmllc30iTWF0aExpYiBcT3B0aW9uLWQKLQkie01XUFBDTGlicmFyaWVzfSJQUENUb29sTGlicy5vCi0KLSMgVG9vbCB0byBtYWtlIFBFRiB3aXRoLCBpZiBuZWVkZWQuCi0KLU1BS0VQRUZfTlVMTCA9IG51bGwtY29tbWFuZAotCi1NQUtFUEVGX1BQQyA9IE1ha2VQRUYKLQotTUFLRVBFRl9GTEFHUyA9IFxPcHRpb24tZAotCS1sIEludGVyZmFjZUxpYi54Y29mZj1JbnRlcmZhY2VMaWIgXE9wdGlvbi1kCi0JLWwgTWF0aExpYi54Y29mZj1NYXRoTGliIFxPcHRpb24tZAotCS1sIFN0ZENMaWIueGNvZmY9U3RkQ0xpYgotCi1NQUtFUEVGX1RPT0xfRkxBR1MgPSAtZnQgTVBTVCAtZmMgJ01QUyAnCi0KLSMgUmVzb3VyY2UgY29tcGlsZXIgdG8gdXNlLgotCi1SRVpfNjhLID0gUmV6Ci0KLVJFWl9QUEMgPSBSZXogLWQgV0FOVF9DRlJHCi0KZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvQ2hhbmdlTG9nIGIvY29uZmlnL21wdy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZGVmYmYuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1UdWUgTm92IDI2IDEyOjM0OjEyIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZy1tcHctbWFrZS5zZWQ6IEZpeCBzb21lIGNvbW1lbnRzLgotCi1Nb24gU2VwIDE2IDE0OjQyOjUyIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZy1tcHctbWFrZS5zZWQgKEhMREVOVik6IEVkaXQgb3V0IGFsbCByZWZlcmVuY2VzLgotCi1UaHUgQXVnIDE1IDE5OjQ5OjIzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogdHJ1ZTogTmV3IHNjcmlwdCwgaWRlbnRpY2FsIHRvIG1wdy10cnVlLgotCSogZy1tcHctbWFrZS5zZWQ6IEFkZCBAREFTSF9DX0ZMQUdAIGFuZCBAU0VHTUVOVF9GTEFHKClACi0JdG8gdGhlIGVkaXRvcnMgZm9yIGNvbXBpbGUgY29tbWFuZHMuCi0KLVRodSBBdWcgIDEgMTU6MDE6NDIgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctdHJ1ZSwgbXB3LXRvdWNoLCBudWxsLWNvbW1hbmQ6IE5ldyBzY3JpcHRzLgotCSogUkVBRE1FOiBEZXNjcmliZSB1c2FnZSBpbiBtb3JlIGRldGFpbC4KLQotVHVlIERlYyAxMiAxNDo1MTo1MSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGctbXB3LW1ha2Uuc2VkOiBEb24ndCBlZGl0IG91dCAidmVyc2lvbj0iIG9jY3VycmVuY2VzLgotCi1GcmkgRGVjICAxIDExOjQ2OjE4IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZy1tcHctbWFrZS5zZWQgKGJpbmRpciwgbGliZGlyKTogRWRpdCB0aGUgcG9zaXRpb25zIG9mCi0JcGF0aG5hbWUgc2VwYXJhdG9ycyB0byB3b3JrIHdpdGggb3RoZXIgcGF0aG5hbWVzIGJldHRlci4KLQotVHVlIE5vdiAgNyAxNTowODowNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGctbXB3LW1ha2Uuc2VkOiBBZGQgY29tbWVudCBhYm91dCBEdXBsaWNhdGUgdnMgQ2F0ZW5hdGUsCi0JYWRkIGFkZGl0aW9uYWwgcGF0dGVybiBmb3IgZWRpdGluZyBsaW5rLWNvbXBpbGUgY29tbWFuZHMuCi0KLVR1ZSBPY3QgMjQgMTQ6Mjg6NTEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBnLW1wdy1tYWtlLnNlZDogQWRkIGhhbmRsaW5nIGZvciAqLnRhYi5baGNdIGZpbGVzLgotCShDSElMTF9GT1JfVEFSR0VULCBDSElMTF9MSUIpOiBFZGl0IG91dCB0cmlja3kgZGVmaW5pdGlvbnMKLQlvZiB0aGVzZS4KLQotVGh1IFNlcCAyOCAyMTowNToxMCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGctbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgZ2VuZXJpYyBzZWQgY29tbWFuZHMgdG8gdHJhbnNsYXRlCi0JVW5peCBtYWtlZmlsZXMgaW50byBNUFcgbWFrZWZpbGUgc3ludGF4LgotCi1GcmkgTWFyIDE3IDExOjUxOjIwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogUkVBRE1FOiBDbGFyaWZ5IGluc3RydWN0aW9ucy4KLQkqIGZpOiBSZW1vdmUuCi0KLVdlZCBEZWMgMjEgMTU6NDU6NTMgMTk5NCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBNb3ZlSWZDaGFuZ2UsIFJFQURNRSwgZmksIGZvcndhcmQtaW5jbHVkZSwgb3Blbi1icmFjZSwKLSAgICAgICAgdHItN3RvOC1zcmM6IE5ldyBmaWxlcy4KZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvTW92ZUlmQ2hhbmdlIGIvY29uZmlnL21wdy9Nb3ZlSWZDaGFuZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYmMxMjUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9Nb3ZlSWZDaGFuZ2UKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIFJlbmFtZSBhIGZpbGUgb25seSBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSBhIHByZXZpb3VzbHkgZXhpc3RpbmcKLSMgZmlsZSBvZiB0aGUgc2FtZSBuYW1lLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGtlZXBpbmcgbWFrZSBmcm9tIGRvaW5nCi0jIHRvbyBtdWNoIHdvcmsgaWYgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBoYXZlbid0IGNoYW5nZWQuCi0KLSMgVGhpcyBpcyBhbiBNUFcgdHJhbnNsYXRpb24gb2YgdGhlIHN0YW5kYXJkIEdOVSBzaCBzY3JpcHQgbW92ZS1pZi1jaGFuZ2UuCi0KLVNldCBleGl0IDAKLQotSWYgImBleGlzdHMgLWYgInsyfSJgIgotICBDb21wYXJlICJ7MX0iICJ7Mn0iID5kZXY6bnVsbAotICBJZiB7c3RhdHVzfSAhPSAwCi0gICAgUmVuYW1lIC15ICJ7MX0iICJ7Mn0iCi0gIEVsc2UKLSAgICBFY2hvICJ7Mn0iIGlzIHVuY2hhbmdlZAotICAgIERlbGV0ZSAtaSAteSAiezF9IgotICBFbmQKLUVsc2UKLSAgUmVuYW1lIC15ICJ7MX0iICJ7Mn0iCi1FbmQKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvUkVBRE1FIGIvY29uZmlnL21wdy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NDcwMGEuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyBNUFcgc2NyaXB0cyBhbmQgcmVsYXRlZCBmaWxlcyB0aGF0IGFyZSBuZWVkZWQgdG8KLWJ1aWxkIEN5Z251cyBHTlUgdG9vbHMgZm9yIE1QVy4gIFRoZSBzY3JpcHRzIHNob3VsZCBiZSBzb21ld2hlcmUgb24gdGhlCi1jb21tYW5kIHBhdGg7IG91ciB1c3VhbCBwcmFjdGljZSBoYXMgYmVlbiB0byBoYXZlIGEgc2VwYXJhdGUgZGlyZWN0b3J5Ci1mb3IgdGhlIHNjcmlwdHMsIGFuZCBwdXQgdGhlIHRvb2xzIChieWFjYywgZmxleCwgYW5kIHNlZCBhdCBsZWFzdCkgdGhlcmUKLWFsc287IHRoZW4gaXQncyBlYXNpZXIgdG8gZHJhZyB0aGUgc3VwcG9ydCBiaXRzIGFyb3VuZCBhcyBhIGdyb3VwLCBvciB0bwotdXBncmFkZSBNUFcgdmVyc2lvbnMuICBUaGUgY29tcGxldGUgcGFja2FnZSBvZiBzY3JpcHRzIGFuZCB0b29sIGJpbmFyaWVzCi1pcyB1c3VhbGx5IGF2YWlsYWJsZSBhcyBwdWIvbWFjL2J1aWxkdG9vbHMuY3B0LmhxeCBvbiBmdHAuY3lnbnVzLmNvbS4KLQotInRyLTd0bzgtc3JjIiBpcyBhY3R1YWxseSB0aGUgc291cmNlIHRvIGFuIE1QVyBzY3JpcHQgdGhhdCB0cmFuc2Zvcm1zCi1zZXF1ZW5jZXMgbGlrZSAiXE9wdGlvbi1kIiBpbnRvIHRoZSBhY3R1YWwgOC1iaXQgY2hhcnMgdGhhdCBNUFcgbmVlZHMuCi1JdCdzIG9ubHkgdGhlIHNvdXJjZSBiZWNhdXNlIGl0IGNhbid0IGl0c2VsZiBpbmNsdWRlIGFueSA4LWJpdCBjaGFycy4KLUl0ICpjYW4qIGJlIHByb2Nlc3NlZCBpbnRvIGEgZ2VudWluZSAidHItN3RvOCIgYnkgdXNpbmcgaXRzZWxmOgotCi0JdHItN3RvOCB0ci03dG84LXNyYyB8IHNlZCAtZSAncy9TcmMvLycgPm5ldy10ci03dG84Ci0KLVVzZSB0aGlzIHRvIHZlcmlmeToKLQotCWNvbXBhcmUgdHItN3RvOCBuZXctdHItN3RvOAotCi1JZiB5b3UgZG9uJ3QgaGF2ZSBhIHdvcmtpbmcgdHItN3RvOCwgdGhlbiB5b3Ugd2lsbCBoYXZlIHRvIG1hbnVhbGx5Ci1yZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiAiXE9wdGlvbi1kIiB3aXRoIHJlYWwgT3B0aW9uLWQgKHdoaWNoIGxvb2tzCi1saWtlIGEgZGVsdGEpLCB0aGVuIGRvIHNpbWlsYXJseSB3aXRoIGFsbCB0aGUgb3RoZXIgIlxPcHRpb24tLi4uIgotc3RyaW5ncywgYW5kIHRoZW4gY2hhbmdlICJcU3JjT3B0aW9uLWQiIGludG8gdGhlIHN0cmluZyAiXE9wdGlvbi1kIi4KZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvZm9yd2FyZC1pbmNsdWRlIGIvY29uZmlnL21wdy9mb3J3YXJkLWluY2x1ZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZDZiZDcuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9mb3J3YXJkLWluY2x1ZGUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUVjaG8gJyNpbmNsdWRlJyC2IiJ7MX0itiIgPiJ7Mn0iLnRlbQotTW92ZUlmQ2hhbmdlICJ7Mn0iLnRlbSAiezJ9IgotCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L2ctbXB3LW1ha2Uuc2VkIGIvY29uZmlnL21wdy9nLW1wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkM2M3Ny4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L2ctbXB3LW1ha2Uuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLSMgU2VkIGNvbW1hbmRzIHRvIHRyYW5zbGF0ZSBVbml4IG1ha2VmaWxlcyBpbnRvIE1QVyBtYWtlZmlsZXMuCi0jIFRoZXNlIGFyZSBub21pbmFsbHkgZ2VuZXJpYywgYnV0IHdvcmsgYmVzdCBvbiB0aGUgbWFrZWZpbGVzIHVzZWQKLSMgZm9yIEdOVSBwcm9ncmFtcy4KLQotIyBXaGFjayBvdXQgYW55IGNvbW1lbnRlZC1vdXQgbGluZXMgdGhhdCBhcmUgcHJvYmFibHkgY29tbWFuZHM7Ci0jIHRoZXkgY2FuIG9ubHkgY2F1c2UgdHJvdWJsZSBsYXRlciBvbi4KLS9eIwkvZAotCi0jIENoYW5nZSBkZXBlbmRlbmN5IGNoYXIuCi0vOiQvcy86LyBcXE9wdGlvbi1mL2cKLS9eW14gCTojXVteOl0qOi9zL1woWyAJXSpcKTpcKFsgCV0qXCkvIFxcT3B0aW9uLWYgL2cKLQotIyBDaGFuZ2Ugc3ludGF4IG9mIE1ha2VmaWxlIHZhcnMuCi0vXCQvcy9cJHtcKFthLXpBLVowLTlfLV0qXCl9L3tcMX0vZwotL1wkL3MvXCQoXChbYS16QS1aMC05Xy1dKlwpKS97XDF9L2cKLS8gJEAvcy8gJEAvIHtUYXJnfS8KLQotIyBEb3VibGUtJCBhcmUgbGl0ZXJhbHMgdG8gVW5peCBidXQgbm90IHRvIE1QVyBtYWtlLgotL1wkXCQvcy9cJFwkLyQvZwotCi0jIENoYW5nZSBwYXRobmFtZSBzeW50YXguCi0vXC8vcyxcLlwuL1wvXC5cLi8sOjo6LGcKLS9cLy9zLFwuXC4vLDo6LGcKLS9cLlwvL3MsXC4vLDosZwotL1wvL3MsLyw6LGcKLSMgVW5kbyBleGNlc3MgY2hhbmdlcy4KLS9hbmQvcyxhbmQ6b3IkLGFuZC9vciwKLS9hbmQvcyxhbmQ6b3IgLGFuZC9vciAsCi0vd2FudC9zLHdhbnQ6bmVlZCx3YW50L25lZWQsCi0jIEZpeGluZyB1cCBzZWQgY29tbWFuZHMuCi0vLWUvc18iOlwoW146XSpcKTpkIl8iL1wxL2QiX2cKLS8tZS9zXyI6XChbXjpdKlwpOiw6XChbXjpdKlwpOmQiXyIvXDEvLC9cMi9kIl9nCi0KLS89L3MvID0gXC4kLyA9IDovCi0KLSMgTWFrZSB0aGVzZSBnbyBhd2F5IHNvIHRoYXQgbGF0ZXIgZWRpdHMgbm90IGNvbmZ1c2VkLgotL0hMREVOVi9zL3tITERFTlZ9Ly8KLQotIyBDb21tZW50IG91dCBhbnkgZXhwbGljaXQgc3JjZGlyIHNldHRpbmcuCi0vc3JjZGlyL3MvXnNyY2Rpci8jIHNyY2Rpci8KLQotL0JBU0VESVIvcy9eQkFTRURJUiA9LiokL0JBU0VESVIgPSAie3NyY3Jvb3R9Ii8KLS97QkFTRURJUn06L3Mve0JBU0VESVJ9Oi97QkFTRURJUn0vZwotL3tzcmNkaXJ9Oi9zL3tzcmNkaXJ9Oi8ie3NyY2Rpcn0iL2cKLS8ie3NyY2Rpcn0iOi9zLyJ7c3JjZGlyfSI6LyJ7c3JjZGlyfSIvZwotCi0jIFR3ZWFrIHNvbWUgY29udmVudGlvbnMgdGhhdCBhcmUgYmFja3dhcmRzIGZvciB0aGUgTWFjLgotL2JpbmRpci9zL3tleGVjX3ByZWZpeH06YmluL3tleGVjX3ByZWZpeH1iaW46LwotL2xpYmRpci9zL3tleGVjX3ByZWZpeH06bGliL3tleGVjX3ByZWZpeH1saWI6LwotCi0jIENvbW1lbnQgb3V0IHNldHRpbmdzIG9mIGFueXRoaW5nIHNldCBieSBtcHcgaG9zdCBjb25maWcuCi0vQ0Mvcy9eQ0MgKj0vI0NDID0vCi0vQ0ZMQUdTL3MvXkNGTEFHUyAqPS8jQ0ZMQUdTID0vCi0vQVIvcy9eQVIgKj0vI0FSID0vCi0vQVJfRkxBR1Mvcy9eQVJfRkxBR1MgKj0vI0FSX0ZMQUdTID0vCi0vUkFOTElCL3MvXlJBTkxJQiAqPS8jUkFOTElCID0vCi0vQ0NfTEQvcy9eQ0NfTEQgKj0vI0NDX0xEID0vCi0vTERGTEFHUy9zL15MREZMQUdTICo9LyNMREZMQUdTID0vCi0KLSMgQ2hhbmdlIC1JIHVzYWdlcy4KLS8tSS9zLy1JXC4vLWkgOi9nCi0vLUkvcy8tSTo6YmZkLy1pIDo6YmZkOi9nCi0vLUkvcy8tSTo6aW5jbHVkZS8taSA6OmluY2x1ZGU6L2cKLS8tSS9zLy1JLy1pIC9nCi0KLSMgQ2hhbmdlIC1EIHVzYWdlLgotLy1EL3MvXChbID1dXCktRFwoW14gXSpcKS9cMS1kIFwyL2cKLQotIyBDaGFuZ2UgY29udGludWF0aW9uIGNoYXIuCi0vXFwkL3MvXFwkL1xcT3B0aW9uLWQvCi0KLSMgQ2hhbmdlIHdpbGRjYXJkIGNoYXIuCi0vXCovcy9cKi9cXE9wdGlvbi14L2cKLQotIyBDaGFuZ2UgcGF0aCBvZiB2YXJpb3VzIHR5cGVzIG9mIHNvdXJjZSBmaWxlcy4gIFRoaXMgcnVsZSBkb2VzIG5vdCBhbGxvdwotIyBmb3IgZmlsZSBuYW1lcyB3aXRoIG11bHRpcGxlIGRvdHMgaW4gdGhlIG5hbWUuCi0vXC5bY2hseV0vcy9cKFsgCT48PV1cKVwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC5cKFtjaGx5XVwpL1wxIntzfSJcMi5cMy9nCi0vXC5bY2hseV0vcy9eXChbLWEtekEtWjAtOV8ke306Il0qXClcLlwoW2NobHldXCkvIntzfSJcMS5cMi8KLSMgQWxsb3cgZmlsZXMgbmFtZWQgKi50YWIuW2NoXSBhcyBhIHNwZWNpYWwgY2FzZS4KLS9cLnRhYlwuW2NoXS9zL1woWyAJPjw9XVwpXChbLWEtekEtWjAtOV8ke306Il0qXC50YWJcKVwuXChbY2hdXCkvXDEie3N9IlwyLlwzL2cKLS9cLnRhYlwuW2NoXS9zL15cKFstYS16QS1aMC05XyR7fToiXSpcLnRhYlwpXC5cKFtjaF1cKS8ie3N9IlwxLlwyLwotIyBGaXggc29tZSBvdmVyZW50aHVzaWFzbXMuCi0ve3N9L3MvIntzfSIie3NyY2Rpcn0iLyJ7c3JjZGlyfSIvZwotL3tzfS9zLyJ7c30ie1woW2EtekEtWjAtOV9dKlwpZGlyfS8ie1wxZGlyfSIvZwotL3tzfS9zLyJ7c30ie1woW2EtekEtWjAtOV9dKlwpRElSfS8ie1wxRElSfSIvZwotL3tzfS9zLyJ7c30iIntcKFthLXpBLVowLTlfXSpcKWRpcn0iLyJ7XDFkaXJ9Ii9nCi0ve3N9L3MvIntzfSIie1woW2EtekEtWjAtOV9dKlwpRElSfSIvIntcMURJUn0iL2cKLS97c30vcy8ie3N9IjovOi9nCi0ve3N9L3MvXiJ7c30iLy9nCi0ve3N9L3MvIntzfSIie3N9Ii8ie3N9Ii9nCi0ve3N9L3MvIntzfSIie3NyY2Rpcn0iLyJ7c30iL2cKLS97c30vcy8ie3NyY2Rpcn0iIntzfSIvIntzfSIvZwotCi0jIFRoZSAuZGVmIGZpbGVzIGFyZSBhbHNvIHR5cGljYWxseSBzb3VyY2UgZmlsZXMuCi0vXC5kZWYvcy9cKFsgCT48XVwpXChbLWEtekEtWjAtOV8ke306Il0qXClcLmRlZi9cMSJ7c30iXDIuZGVmL2cKLS9cLmRlZi9zL15cKFstYS16QS1aMC05XyR7fToiXSpcKVwuZGVmLyJ7c30iXDEuZGVmL2cKLQotIyBDaGFuZ2UgZXh0ZW5zaW9uIGFuZCBwYXRoIG9mIG9iamVjdHMuCi0vXC5vL3MvXChbIAk9XVwpXChbLWEtekEtWjAtOV8ke306Il0qXClcLm8vXDEie299IlwyLmMuby9nCi0vXC5vL3MvXlwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC5vLyJ7b30iXDEuYy5vLwotIyBBbGxvdyAqLnRhYi5vIGZpbGVzIGFzIGEgc3BlY2lhbCBjYXNlIG9mIGEgMi1kb3QtbmFtZSBmaWxlLgotL1wuby9zL1woWyAJPV1cKVwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC50YWJcLm8vXDEie299IlwyLnRhYi5jLm8vZwotL1wuby9zL15cKFstYS16QS1aMC05XyR7fToiXSpcKVwudGFiXC5vLyJ7b30iXDEudGFiLmMuby8KLSMgQ2xlYW4gdXAuCi0vIntvfSIvcy8ie299IiJ7b30iLyJ7b30iL2cKLS8ie299Ii9zL14ie299IlwoW2EtekEtWjAtOV9dKlwpPS9cMT0vCi0KLSMgQ2hhbmdlIGV4dGVuc2lvbiBvZiBsaWJzLgotL1wuYS9zL2xpYlwoW2Etel0qXClcLmEvbGliXDEuby9nCi0KLSMgUmVtb3ZlIG5vbi1mYWlsIG9wdGlvbi4KLS8tL3MvXlwoWyAJXSpcKS0vXDEvCi0jIEZpeCBvdmVyZWFnZXJuZXNzZXMgLSBhc3N1bWVzIG5vIG9uZS1sZXR0ZXIgY29tbWFuZHMuCi0vXlsgCV0qW2Etel0gL3MvXlwoWyAJXSpcKVwoW2Etel1cKSAvXDEtXDIgLwotCi0jIFJlbW92ZSBub24tZWNobyBvcHRpb24uICh3YXRjaCBvdXQgZm9yIGF1dG9jb25mIHRoaW5ncykKLS9AL3MvXlwoWyAJXSpcKUAvXDEvCi0KLSMgQ2hhbmdlIGNwIHRvIER1cGxpY2F0ZS4KLSMgQ2F0ZW5hdGUgaXMgcGVyaGFwcyBtb3JlIGFjY3VyYXRlLCBidXQgdGhlIHBhdHRlcm4gd291bGQgaGF2ZSB0bwotIyBpZGVudGlmeSB0aGUgb3V0cHV0IGZpbGUgYW5kIGFkZCBhICc+JyByZWRpcmVjdGlvbiBpbnRvIGl0LgotL2NwL3MvXlwoWyAJXSpcKWNwIC9cMUR1cGxpY2F0ZSAtZCAteSAvCi0jIENoYW5nZSBtdiB0byBSZW5hbWUuCi0vbXYvcy9eXChbIAldKlwpbXYgL1wxUmVuYW1lIC15IC8KLS9SZW5hbWUvcy9eXChbIAldKlwpUmVuYW1lIC15IC1mL1wxUmVuYW1lIC15LwotIyBDaGFuZ2Ugcm0gdG8gRGVsZXRlLgotL3JtIC1yZi9zL15cKFsgCV0qXClybSAtcmYgL1wxRGVsZXRlIC1pIC15IC8KLS9ybSAtZi9zL15cKFsgCV0qXClybSAtZiAvXDFEZWxldGUgLWkgLXkgLwotL3JtL3MvXlwoWyAJXSpcKXJtIC9cMURlbGV0ZSAtaSAteSAvCi0jIE5vdGUgdGhhdCB3ZSBkb24ndCBtZXNzIHdpdGggbG4gLSBkaXJlY3Rvcnktc3BlY2lmaWMgc2NyaXB0cwotIyBtdXN0IGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggc3ltbGlua3MuCi0jIENoYW5nZSBjYXQgdG8gQ2F0ZW5hdGUuCi0vY2F0L3MvXlwoWyAJXSpcKWNhdCAvXDFDYXRlbmF0ZSAvCi0jIENoYW5nZSB0b3VjaCB0byBtcHctdG91Y2guCi0vdG91Y2gvcy9eXChbIAldKlwpdG91Y2ggL1wxbXB3LXRvdWNoIC8KLSMgQ2hhbmdlIG1rZGlyIHRvIE5ld0ZvbGRlci4KLS9ta2Rpci9zL15cKFsgCV0qXClta2RpciAvXDFOZXdGb2xkZXIgLwotIyBDaGFuZ2UgdmFyIHNldHRpbmcgdG8gU2V0LgotLz0vcy9eXChbIAldKlwpXChbLWEtekEtWjAtOV9dKlwpPVwoW147XSpcKTsgXFxPcHRpb24tZC9cMVNldCBcMiBcMy8KLQotIyBDaGFuZ2UgdGVzdHMuCi0vaWYgL3MvaWYgXFsgKi1mIFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiAhPSAiIi8KLS9pZiAvcy9pZiBcWyAqLWYgXChbXiBdKlwpIF0gKjsgKnRoZW4gKlxcT3B0aW9uLWQvSWYgImBFeGlzdHMgIlwxImAiICE9ICIiLwotL2lmIC9zL2lmIFxbICEgKi1mIFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiA9PSAiIi8KLS9pZiAvcy9pZiBcWyAhICotZiBcKFteIF0qXCkgXSAqOyAqdGhlbiBcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiA9PSAiIi8KLQotL2lmIC9zL2lmIFxbICotZCBcKFteIF0qXCkgXSAqOyAqXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgIT0gIiIvCi0vaWYgL3MvaWYgXFsgKi1kIFwoW14gXSpcKSBdICo7ICp0aGVuICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiAhPSAiIi8KLS9pZiAvcy9pZiBcWyAhICotZCBcKFteIF0qXCkgXSAqOyAqXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgPT0gIiIvCi0vaWYgL3MvaWYgXFsgISAqLWQgXChbXiBdKlwpIF0gKjsgKnRoZW4gKlxcT3B0aW9uLWQvSWYgImBFeGlzdHMgIlwxImAiID09ICIiLwotCi0vaWYgL3MvaWYgXFsgLWQgXChbXiBdKlwpIF0gKjsgdGhlbiB0cnVlICo7IGVsc2UgbWtkaXIgXChbXiA7XSpcKSAqOyBmaS9JZiAiYEV4aXN0cyAiXDEiYCIgIT0gIiIgTmV3Rm9sZGVyIFwyIEVuZCBJZi8KLQotL2lmIC9zL2lmIFxbIFwoW14gXSpcKSA9IFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJcMSIgPT0gIlwyIi8KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgPSBcKFteIF0qXCkgXSAqOyAqdGhlbiAqXFxPcHRpb24tZC9JZiAiXDEiID09ICJcMiIvCi0KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgIT0gXChbXiBdKlwpIF0gKjsgKlxcT3B0aW9uLWQvSWYgIlwxIiAhPSAiXDIiLwotL2lmIC9zL2lmIFxbIFwoW14gXSpcKSAhPSBcKFteIF0qXCkgXSAqOyAqdGhlbiAqXFxPcHRpb24tZC9JZiAiXDEiICE9ICJcMiIvCi0KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgLWVxIFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJcMSIgIT0gIlwyIi8KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgLWVxIFwoW14gXSpcKSBdICo7ICp0aGVuICpcXE9wdGlvbi1kL0lmICJcMSIgIT0gIlwyIi8KLQotL15bIAldKmVsc2UgdHJ1ZSQvY1wKLQlFbHNlXAotCQltcHctdHJ1ZVwKLQotCi0vZWxzZS9zL15cKFsgCV0qXCllbHNlWyAJXSokL1wxRWxzZS8KLS9lbHNlL3MvXlwoWyAJXSpcKWVsc2VbOyAJXSpcXE9wdGlvbi1kJC9cMUVsc2UvCi0KLS9eWyAJXSplbHNlWyAJXSp0cnVlWyAJXSokL2NcCi0JRWxzZVwKLQkJbXB3LXRydWUKLQotL15bIAldKmVsc2VbIAldKnRydWVbOyAJXSpmaSQvY1wKLQlFbHNlXAotCQltcHctdHJ1ZVwKLQlFbmQgSWYKLQotL2ZpL3MvXlwoWyAJXSpcKWZpICokL1wxRW5kLwotL2ZpL3MvXlwoWyAJXSpcKWZpICo7ICpcXE9wdGlvbi1kL1wxRW5kLwotCi0jIENoYW5nZSBsb29waW5nLgotL2Zvci9zL15cKFsgCV0qXClmb3IgXChbLWEtekEtWjAtOV9dKlwpIGluIFwoW147XSpcKTsgKmRvICpcXE9wdGlvbi1kL1wxRm9yIFwyIEluIFwzLwotL15cKFsgCV0qXClkbyAqXFxPcHRpb24tZC9kCi0vZG9uZS9zL15cKFsgCV0qXClkb25lICo7ICpcXE9wdGlvbi1kL1wxRW5kLwotL2RvbmUvcy9eXChbIAldKlwpZG9uZSQvXDFFbmQvCi0KLSMgVHJhaWxpbmcgc2VtaWNvbG9ucyBhbmQgY29udGludWVkIGxpbmVzIGFyZSB1bm5lZWRlZCBzaCBzeW50YXguCi0vOyBcXE9wdGlvbi1kL3MvOyBcXE9wdGlvbi1kLy8KLQotIyBDaGFuZ2UgbW92ZS1pZi1jaGFuZ2UgdG8gTW92ZUlmQ2hhbmdlLgotL21vdmUtaWYtY2hhbmdlL3MvXChbXiAJXSpcKW1vdmUtaWYtY2hhbmdlL01vdmVJZkNoYW5nZS9nCi0KLSMgQ2hhbmdlICQoU0hFTEwpIHRvIHRoZSBzY3JpcHQgbmFtZSBieSBpdHNlbGYuCi0vU0hFTEwvcy9eXChbIAldKlwpe1NIRUxMfSAvXDEvCi0KLSMgQ2hhbmdlIHN5bnRheCBvZiBkZWZhdWx0IHJ1bGUgZGVwZW5kZW5jeS4KLS9eXC5jXC5vL3MvXlwuY1wubyBcXE9wdGlvbi1mJC8uYy5vIFxcT3B0aW9uLWYgLmMvCi0KLSMgQ2hhbmdlIGRlZmF1bHQgcnVsZSdzIGFjdGlvbi4KLS97Q0N9IC1jL3Mve0NDfSAtYyBcKC4qXCkgXCQ8JC97Q0N9IEBEQVNIX0NfRkxBR0Age0RlcERpcn17RGVmYXVsdH0uYyBcMSBAU0VHTUVOVF9GTEFHKHtEZWZhdWx0fSlAIC1vIHtUYXJnRGlyfXtEZWZhdWx0fS5jLm8vCi0KLSMgVGhpcyBpcyBwcmV0dHkgZGlzZ3VzdGluZywgYnV0IEkgY2FuJ3Qgc2VlbSB0byBkZXRlY3QgZW1wdHkgcnVsZXMuCi0vT3B0aW9uLWYkL3MvT3B0aW9uLWYkL09wdGlvbi1mIF9vbGRlc3QvZwotCi0jIFJlbW92ZSAtYyBmcm9tIGV4cGxpY2l0IGNvbXBpbGVyIGNhbGxzLiAoYnV0IHNob3VsZCBub3QgaWYgR0NDKQotIyBIYW5kbGUgdGhlIGNhc2Ugb2YgYSBzb3VyY2UgZmlsZSB0aGF0IGlzICJ7eHh4fSJmaWxlLmMuCi0vIC1jIC9zL3tcKFtBLVpfXSpcKUNDfVwoLipcKSAtYyBcKC4qXCkiXChbXiJdKlwpIlwoWy1hLXpfXSpcKVwuYy97XDFDQ31cMiBAREFTSF9DX0ZMQUdAIFwzIlw0Ilw1LmMgLW8gIntvfSJcNS5jLm8vCi0jIEhhbmRsZSB0aGUgY2FzZSBvZiBhIHNvdXJjZSBmaWxlIHRoYXQgaXMgInt4eHh9ImRpcjpmaWxlLmMuCi0vIC1jIC9zL3tcKFtBLVpfXSpcKUNDfVwoLipcKSAtYyBcKC4qXCkiXChbXiJdKlwpIlwoWy1hLXpfXSpcKTpcKFstYS16X10qXClcLmMve1wxQ0N9XDIgQERBU0hfQ19GTEFHQCBcMyJcNCJcNTpcNi5jIC1vICJ7b30iXDYuYy5vLwotCi0jIENoYW5nZSBsaW5raW5nIGNjIHRvIGxpbmtpbmcgc2VxdWVuY2UuCi0vLW8vcy9eXChbIAldKlwpe0NDfSBcKC4qXCl7XChbQS1aX10qXClDRkxBR1N9IFwoLipcKXtMREZMQUdTfSBcKC4qXCktbyBcKFteIF0qXCkgXCguKlwpJC9cMXtDQ19MRH0gXDIge1wzQ0ZMQUdTfSBcNCB7TERGTEFHU30gXDUgLW8gXDZ7UFJPR19FWFR9IFw3XAotXDF7TUFLRVBFRn0gXDZ7UFJPR19FWFR9IC1vIFw2IHtNQUtFUEVGX1RPT0xfRkxBR1N9IHtNQUtFUEVGX0ZMQUdTfVwKLVwxe1JFWn0gIntzfSJcNi5yIC1vIFw2IC1hcHBlbmQgLWQgUFJPR19OQU1FPSciJ1w2JyInIC1kIFZFUlNJT05fU1RSSU5HPSciJ3t2ZXJzaW9ufSciJy8KLS8tby9zL15cKFsgCV0qXCl7Q0N9IFwoLipcKXtcKFtBLVpfXSpcKUNGTEFHU30gXCguKlwpLW8gXChbXiBdKlwpIFwoLipcKXtMREZMQUdTfSBcKC4qXCkkL1wxe0NDX0xEfSBcMiB7XDNDRkxBR1N9IFw0IHtMREZMQUdTfSBcNiAtbyBcNXtQUk9HX0VYVH0gXDdcCi1cMXtNQUtFUEVGfSBcNXtQUk9HX0VYVH0gLW8gXDUge01BS0VQRUZfVE9PTF9GTEFHU30ge01BS0VQRUZfRkxBR1N9XAotXDF7UkVafSAie3N9Ilw1LnIgLW8gXDUgLWFwcGVuZCAtZCBQUk9HX05BTUU9JyInXDUnIicgLWQgVkVSU0lPTl9TVFJJTkc9JyIne3ZlcnNpb259JyInLwotLy1vL3MvXlwoWyAJXSpcKXtIT1NUX0NDfSBcKC4qXCktbyBcKFteIF0qXCkgXCguKlwpJC9cMXtIT1NUX0NDX0xEfSBcMiAtbyBcM3tQUk9HX0VYVH0gXDRcCi1cMXtNQUtFUEVGfSBcM3tQUk9HX0VYVH0gLW8gXDMge01BS0VQRUZfVE9PTF9GTEFHU30ge01BS0VQRUZfRkxBR1N9XAotXDF7UkVafSAie3N9IlwzLnIgLW8gXDMgLWFwcGVuZCAtZCBQUk9HX05BTUU9JyInXDMnIicgLWQgVkVSU0lPTl9TVFJJTkc9JyIne3ZlcnNpb259JyInLwotCi0jIENvbW1lbnQgb3V0IC5OT0VYUE9SVCBydWxlcy4KLS9cLk5PRVhQT1JUL3MvXlwuTk9FWFBPUlQvI1wuTk9FWFBPUlQvCi0jIENvbW1lbnQgb3V0IC5QSE9OWSBydWxlcy4KLS9cLlBIT05ZL3MvXlwuUEhPTlkvI1wuUEhPTlkvCi0jIENvbW1lbnQgb3V0IC5QUkVDSU9VUyBydWxlcy4KLS9cLlBSRUNJT1VTL3MvXlwuUFJFQ0lPVVMvI1wuUFJFQ0lPVVMvCi0jIENvbW1lbnQgb3V0IC5TVUZGSVhFUyBydWxlcy4KLS9cLlNVRkZJWEVTL3MvXlwuU1VGRklYRVMvI1wuU1VGRklYRVMvCi0KLSMgU2V0IHRoZSBpbnN0YWxsIHByb2dyYW0gYXBwcm9wcmlhdGVseS4KLS9JTlNUQUxML3MvXklOU1RBTEwgKj0gKmAuKmA6aW5zdGFsbC5zaCAtYy9JTlNUQUxMID0gRHVwbGljYXRlIC15LwotCi0jIERvbid0IHRyeSB0byBkZWNpZGUgd2hldGhlciB0byB1c2UgdGhlIHRyZWUncyBvd24gdG9vbHMuCi0vYmlzb24vcy9gLipiaXNvbjpiaXNvbi4qYC9iaXNvbiAteS8KLS9ieWFjYy9zL2AuKmJ5YWNjOmJ5YWNjLipgL2J5YWNjLwotL2ZsZXgvcy9gLipmbGV4OmZsZXguKmAvZmxleC8KLQotIyBUdXJuIHRyYW5zZm9ybWVkIEMgY29tbWVudHMgaW4gZWNobyBjb21tYW5kcyBiYWNrIGludG8gY29tbWVudHMuCi0vZWNoby9zLGVjaG8gJ1woLipcKTpcXE9wdGlvbi14XCguKlwpXFxPcHRpb24teDpcKC4qXCknLGVjaG8gJ1wxLypcMiovXDMnLAotCi0jIFdoYWNrIG91dCB2YXJpb3VzIGNsZXZlciBleHByZXNzaW9ucyB0aGF0IHNlYXJjaCBmb3IgdG9vbHMsIHNpbmNlCi0jIHRoZSBjbGV2ZXIgY29kZSBpcyB0b28gL2Jpbi9zaCBzcGVjaWZpYy4KLQotL15BUl9GT1JfVEFSR0VUID0gYC8sL2AkL2NcCi1BUl9GT1JfVEFSR0VUID0gOjpiaW51dGlsczphclwKLQotCi0vXlJBTkxJQl9GT1JfVEFSR0VUID0gYC8sL2AkL2NcCi1SQU5MSUJfRk9SX1RBUkdFVCA9IDo6YmludXRpbHM6cmFubGliXAotCi0KLS9eUkFOTElCX1RFU1RfRk9SX1RBUkdFVCA9IC8sL3JhbmxpYiBdICkkL2NcCi1SQU5MSUJfVEVTVF9GT1JfVEFSR0VUID0gXAotCi0KLS9eRVhQRUNUID0gYC8sL2AkL2NcCi1FWFBFQ1QgPSBcCi0KLQotL15SVU5URVNUID0gYC8sL2AkL2NcCi1SVU5URVNUID0gXAotCi0KLS9eQ0NfRk9SX1RBUkdFVCA9IGAvLC9gJC9jXAotQ0NfRk9SX1RBUkdFVCA9IFwKLQotCi0vXkNYWF9GT1JfVEFSR0VUID0gYC8sL2AkL2NcCi1DWFhfRk9SX1RBUkdFVCA9IFwKLQotCi0vXkNISUxMX0ZPUl9UQVJHRVQgPSBgLywvYCQvY1wKLUNISUxMX0ZPUl9UQVJHRVQgPSBcCi0KLQotL15DSElMTF9MSUIgPSBgLywvYCQvY1wKLUNISUxMX0xJQiA9IFwKLQotL3Nhbml0L3Mve3N0YXJ0LXNhbml0Li4uLVthLXowLTldKn0vLwotL3Nhbml0L3Mve2VuZC1zYW5pdC4uLi1bYS16MC05XSp9Ly8KLQotIyBBZGQgc3RhbmRhcmQgZGVmaW5lcyBhbmQgZGVmYXVsdCBydWxlcy4KLS9eIyBzcmNkaXIvYVwKLVwKLXMgPSAie3NyY2Rpcn0iXAotXAotbyA9IDpcCi1cCi0ie299IiBcXE9wdGlvbi1mIDogIntzfSIKLQpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy9tcHctdG91Y2ggYi9jb25maWcvbXB3L21wdy10b3VjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0M2E1MS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L21wdy10b3VjaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyAiVG91Y2giIGNvbW1hbmQuCi0KLUlmICJgRXhpc3RzICJ7MX0iYCIgIT0gIiIKLQlTZXRGaWxlIC1tIC4gInsxfSIKLUVsc2UKLQlFY2hvICcgJyA+ICJ7MX0iCi1FbmQgSWYKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvbXB3LXRydWUgYi9jb25maWcvbXB3L21wdy10cnVlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTA2NTMwLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tcHcvbXB3LXRydWUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FeGl0IDAKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvbnVsbC1jb21tYW5kIGIvY29uZmlnL21wdy9udWxsLWNvbW1hbmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDRjOGUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9udWxsLWNvbW1hbmQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIFRoaXMgY29tbWFuZCBkb2VzIG5vdGhpbmcuCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L29wZW4tYnJhY2UgYi9jb25maWcvbXB3L29wZW4tYnJhY2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NDY1ZGMuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9vcGVuLWJyYWNlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIE1QVyBtYWtlZmlsZXMgc2VlbSBub3QgdG8gaGF2ZSBhbnkgd2F5IHRvIGdldCBhIGxpdGVyYWwgb3BlbgotIyBicmFjZSBpbnRvIGEgcnVsZSBhbnl3aGVyZSwgc28gdGhpcyBkb2VzIHRoZSBqb2IuCi0KLUVjaG8gJ3snCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L3RyLTd0bzgtc3JjIGIvY29uZmlnL21wdy90ci03dG84LXNyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwYjY0OS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L3RyLTd0bzgtc3JjCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1TdHJlYW1FZGl0IC1lIFxPcHRpb24tZAotICAnL1xPcHRpb24teC8gXE9wdGlvbi1kCi0gICAgUmVwbGFjZSAvXE9wdGlvbi1kXFNyY09wdGlvbi1kLyAiXE9wdGlvbi1kXE9wdGlvbi1kIiAtYyBcT3B0aW9uLTUgOyBcT3B0aW9uLWQKLSAgICBSZXBsYWNlIC9cT3B0aW9uLWRcU3JjT3B0aW9uLWYvICJcT3B0aW9uLWRcT3B0aW9uLWYiIC1jIFxPcHRpb24tNSA7IFxPcHRpb24tZAotCVJlcGxhY2UgL1xPcHRpb24tZFxTcmNPcHRpb24tOC8gIlxPcHRpb24tZFxPcHRpb24tOCIgLWMgXE9wdGlvbi01IDsgXE9wdGlvbi1kCi0JUmVwbGFjZSAvXE9wdGlvbi1kXFNyY09wdGlvbi01LyAiXE9wdGlvbi1kXE9wdGlvbi01IiAtYyBcT3B0aW9uLTUgOyBcT3B0aW9uLWQKLQlSZXBsYWNlIC9cT3B0aW9uLWRcU3JjT3B0aW9uLXgvICJcT3B0aW9uLWRcT3B0aW9uLXgiIC1jIFxPcHRpb24tNSA7IFxPcHRpb24tZAotCVJlcGxhY2UgL1xPcHRpb24tZFxTcmNPcHRpb24tci8gIlxPcHRpb24tZFxPcHRpb24tciIgLWMgXE9wdGlvbi01JyAgXE9wdGlvbi1kCi0gICJ7MX0iCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L3RydWUgYi9jb25maWcvbXB3L3RydWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDY1MzAuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy90cnVlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRXhpdCAwCmRpZmYgLS1naXQgYS9jb25maWcvbXQtYXJtcGljIGIvY29uZmlnL210LWFybXBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViOGM5ZS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtYXJtcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBR19GT1JfVEFSR0VUPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbXQtZDMwdiBiL2NvbmZpZy9tdC1kMzB2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzRiNzc0Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1kMzB2CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIEJ1aWxkIGxpYnJhcmllcyBvcHRpbWl6aW5nIGZvciBzcGFjZSwgbm90IHNwZWVkLgotIyBUdXJuIG9mZiB3YXJuaW5ncyBhYm91dCBzeW1ib2xzIG5hbWVkIHRoZSBzYW1lIGFzIHJlZ2lzdGVycwotIENGTEFHU19GT1JfVEFSR0VUID0gLWcgLU9zIC1XYSwtQwotIENYWEZMQUdTX0ZPUl9UQVJHRVQgPSAtZyAtT3MgLVdhLC1DCmRpZmYgLS1naXQgYS9jb25maWcvbXQtZWxmYWxwaGFwaWMgYi9jb25maWcvbXQtZWxmYWxwaGFwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjhjOWUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LWVsZmFscGhhcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBR19GT1JfVEFSR0VUPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbXQtbGludXggYi9jb25maWcvbXQtbGludXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOWU2ZjEuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LWxpbnV4CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFdoZW4gdXNpbmcgZ2xpYmMgMiBvbiBMaW51eCB3ZSBtdXN0IGFsd2F5cyB1c2UgdnRhYmxlIHRodW5rcy4KLUNYWEZMQUdTX0ZPUl9UQVJHRVQgPSAkKENYWEZMQUdTKSAtZnZ0YWJsZS10aHVua3MgLURfR05VX1NPVVJDRQpkaWZmIC0tZ2l0IGEvY29uZmlnL210LW02OGtwaWMgYi9jb25maWcvbXQtbTY4a3BpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY5ODcyNy4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtbTY4a3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZnBpYwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LW5ldHdhcmUgYi9jb25maWcvbXQtbmV0d2FyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ4MmY5Yi4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtbmV0d2FyZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUdEQl9OTE1fREVQUyA9IGFsbC1nY2MgYWxsLWxkCmRpZmYgLS1naXQgYS9jb25maWcvbXQtb3NwYWNlIGIvY29uZmlnL210LW9zcGFjZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwOTEwNC4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtb3NwYWNlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIEJ1aWxkIGxpYnJhcmllcyBvcHRpbWl6aW5nIGZvciBzcGFjZSwgbm90IHNwZWVkLgotIENGTEFHU19GT1JfVEFSR0VUID0gLWcgLU9zCi0gQ1hYRkxBR1NfRk9SX1RBUkdFVCA9IC1nIC1PcwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LXBhcGljIGIvY29uZmlnL210LXBhcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWI4YzllLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1wYXBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LXBwY3BpYyBiL2NvbmZpZy9tdC1wcGNwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjhjOWUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LXBwY3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LXNwYXJjcGljIGIvY29uZmlnL210LXNwYXJjcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDBlYzI3Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1zcGFyY3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD1gY2FzZSAiJHtMSUJDRkxBR1N9ICR7TElCQ1hYRkxBR1N9IiBpbiAqLWZwaWMqICkgZWNobyAtZnBpYyA7OyAqICkgZWNobyAtZlBJQyA7OyBlc2FjYApkaWZmIC0tZ2l0IGEvY29uZmlnL210LXY4MTAgYi9jb25maWcvbXQtdjgxMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdkYTZjMi4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtdjgxMAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotQ0NfRk9SX1RBUkdFVCA9IGNhNzMyIC1hbnNpCi1BU19GT1JfVEFSR0VUID0gYXM3MzIKLUFSX0ZPUl9UQVJHRVQgPSBhcjczMgotUkFOTElCX0ZPUl9UQVJHRVQgPSB0cnVlCmRpZmYgLS1naXQgYS9jb25maWcvbXQteDg2cGljIGIvY29uZmlnL210LXg4NnBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY5ODcyNy4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQteDg2cGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBR19GT1JfVEFSR0VUPS1mcGljCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhZDYwYjcuLjAwMDAwMDAKLS0tIGEvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsMTU5NSArMCwwIEBACi0jIS9iaW4vc2gKLQotIyMjIFdBUk5JTkc6IHRoaXMgZmlsZSBjb250YWlucyBlbWJlZGRlZCB0YWJzLiAgRG8gbm90IHJ1biB1bnRhYmlmeSBvbiB0aGlzIGZpbGUuCi0KLSMgQ29uZmlndXJhdGlvbiBzY3JpcHQKLSMgQ29weXJpZ2h0IChDKSAxOTg4LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NwotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgSy4gUmljaGFyZCBQaXhsZXkuCi0KLSMKLSMgU2hlbGwgc2NyaXB0IHRvIGNyZWF0ZSBwcm9wZXIgbGlua3MgdG8gbWFjaGluZS1kZXBlbmRlbnQgZmlsZXMgaW4KLSMgcHJlcGFyYXRpb24gZm9yIGNvbXBpbGF0aW9uLgotIwotIyBJZiBjb25maWd1cmUgc3VjY2VlZHMsIGl0IGxlYXZlcyBpdHMgc3RhdHVzIGluIGNvbmZpZy5zdGF0dXMuCi0jIElmIGNvbmZpZ3VyZSBmYWlscyBhZnRlciBkaXN0dXJiaW5nIHRoZSBzdGF0dXMgcXVvLCAKLSMgICAgICAgY29uZmlnLnN0YXR1cyBpcyByZW1vdmVkLgotIwotCi1leHBvcnQgUEFUSCB8fCAoZWNobyAiT09QUywgdGhpcyBpc24ndCBzaC4gIERlc3BlcmF0aW9uIHRpbWUuICBJIHdpbGwgZmVlZCBteXNlbGYgdG8gc2guIjsgc2ggJDAgJGFyZ3Y7IGtpbGwgJCQpCi0KLXJlbW92ZT1ybQotaGFyZF9saW5rPWxuCi1zeW1ib2xpY19saW5rPSdsbiAtcycKLQotI2ZvciBUZXN0Ci0jcmVtb3ZlPSJlY2hvIHJtIgotI2hhcmRfbGluaz0iZWNobyBsbiIKLSNzeW1ib2xpY19saW5rPSJlY2hvIGxuIC1zIgotCi0jIGNsZWFyIHNvbWUgdGhpbmdzIHBvdGVudGlhbGx5IGluaGVyaXRlZCBmcm9tIGVudmlyb25tZW50LgotCi1NYWtlZmlsZT1NYWtlZmlsZQotTWFrZWZpbGVfaW49TWFrZWZpbGUuaW4KLWFyZ3VtZW50cz0KLWJ1aWxkX2FsaWFzPQotY2FjaGVfZmlsZT1jb25maWcuY2FjaGUKLWNhY2hlX2ZpbGVfb3B0aW9uPQotY29uZmlnZGlycz0KLWV4dHJhY29uZmlnZGlycz0KLWRpcm9wdGlvbnM9Ci1leGVjX3ByZWZpeD0KLWV4ZWNfcHJlZml4b3B0aW9uPQotZmF0YWw9Ci1mbG9hdGluZ19wb2ludD1kZWZhdWx0Ci1nYXM9ZGVmYXVsdAotZ2NjX3ZlcnNpb249Ci1nY2NfdmVyc2lvbl90cmlnZ2VyPQotaG9zdF9hbGlhcz1OT0hPU1QKLWhvc3RfbWFrZWZpbGVfZnJhZz0KLW1vdmVpZmNoYW5nZT0KLW5vcmVjdXJzaW9uPQotb3RoZXJfb3B0aW9ucz0KLXBhY2thZ2VfbWFrZWZpbGVfZnJhZz0KLXBhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZz0KLXByZWZpeD0vdXNyL2xvY2FsCi1wcm9nbmFtZT0KLXByb2dyYW1fcHJlZml4PQotcHJvZ3JhbV9wcmVmaXhvcHRpb249Ci1wcm9ncmFtX3N1ZmZpeD0KLXByb2dyYW1fc3VmZml4b3B0aW9uPQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLXByb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb249Ci1yZWRpcmVjdD0KLXJlbW92aW5nPQotc2l0ZT0KLXNpdGVfbWFrZWZpbGVfZnJhZz0KLXNpdGVfb3B0aW9uPQotc3JjZGlyPQotc3JjdHJpZ2dlcj0KLXN1YmRpcnM9Ci10YXJnZXRfYWxpYXM9Tk9UQVJHRVQKLXRhcmdldF9tYWtlZmlsZV9mcmFnPQotdW5kZWZzPU5PVU5ERUZTCi12ZXJzaW9uPSIkUmV2aXNpb24kIgoteDExPWRlZmF1bHQKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIyMgd2UgbWlnaHQgbmVlZCB0byB1c2Ugc29tZSBvdGhlciBzaGVsbCB0aGFuIC9iaW4vc2ggZm9yIHJ1bm5pbmcgc3Vic2hlbGxzCi0KLSMjIyBJZiB3ZSBhcmUgb24gV2luZG93cywgc2VhcmNoIGZvciB0aGUgc2hlbGwuICBUaGlzIHdpbGwgcGVybWl0IHBlb3BsZQotIyMjIHRvIG5vdCBoYXZlIC9iaW4vc2gsIGJ1dCB0byBiZSBhYmxlIHRvIHNlZSAvU09NRS9QQVRIL3NoIGNvbmZpZ3VyZQotIyMjIHdpdGhvdXQgYWxzbyBoYXZpbmcgdG8gc2V0IENPTkZJR19TSEVMTC4gIFRoaXMgY29kZSB3aWxsIHdvcmsgd2hlbgotIyMjIHVzaW5nIGJhc2gsIHdoaWNoIHNldHMgT1NUWVBFLgotY2FzZSAiJHtPU1RZUEV9IiBpbgotKndpbjMyKikKLSAgaWYgWyB4JHtDT05GSUdfU0hFTEx9ID0geCBdOyB0aGVuCi0gICAgaWYgWyAhIC1mIC9iaW4vc2ggXTsgdGhlbgotICAgICAgaWYgWyB4JHtTSEVMTH0gIT0geCBdICYmIFsgLWYgJHtTSEVMTH0gXTsgdGhlbgotCUNPTkZJR19TSEVMTD0ke1NIRUxMfQotCWV4cG9ydCBDT05GSUdfU0hFTEwKLSAgICAgIGVsc2UKLQlmb3IgcHJvZyBpbiBzaCBzaC5leGUgYmFzaCBiYXNoLmV4ZTsgZG8KLQkgIElGUz0iJHtJRlM9CX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLQkgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0JICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0JICAgIGlmIHRlc3QgLWYgJGRpci8kcHJvZzsgdGhlbgotCSAgICAgIENPTkZJR19TSEVMTD0kZGlyLyRwcm9nCi0JICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotCSAgICAgIGJyZWFrCi0JICAgIGZpCi0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgIHRlc3QgLW4gIiR7Q09ORklHX1NIRUxMfSIgJiYgYnJlYWsKLQlkb25lCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLWNvbmZpZ19zaGVsbD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotCi1OT19FRElUPSJUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gIERvIG5vdCBlZGl0LiIKLQotIyMgdGhpcyBpcyBhIGxpdHRsZSB0b3VjaHkgYW5kIHdvbid0IGFsd2F5cyB3b3JrLCBidXQuLi4KLSMjCi0jIyBpZiB0aGUgYXJndlswXSBzdGFydHMgd2l0aCBhIHNsYXNoIHRoZW4gaXQgaXMgYW4gYWJzb2x1dGUgbmFtZSB0aGF0IGNhbiAoYW5kCi0jIyBtdXN0KSBiZSB1c2VkIGFzIGlzLgotIyMKLSMjIG90aGVyd2lzZSwgaWYgYXJndlswXSBoYXMgbm8gc2xhc2ggaW4gaXQsIHdlIGNhbiBhc3N1bWUgdGhhdCBpdCBpcyBvbiB0aGUKLSMjIHBhdGguICBTaW5jZSBQQVRIIG1pZ2h0IGluY2x1ZGUgIi4iIHdlIGFsc28gYWRkIGBwd2RgIHRvIHRoZSBlbmQgb2YgUEFUSC4KLSMjCi0KLXByb2duYW1lPSQwCi0jIGlmIFBXRCBhbHJlYWR5IGhhcyBhIHZhbHVlLCBpdCBpcyBwcm9iYWJseSB3cm9uZy4KLWlmIFsgLW4gIiRQV0QiIF07IHRoZW4gUFdEPWBwd2RgOyBmaQotCi1jYXNlICIke3Byb2duYW1lfSIgaW4KLS8qKSA7OwotKi8qKSA7OwotKikKLSAgICAgICAgUEFUSD0kUEFUSDoke1BXRD1gcHdkYH0gOyBleHBvcnQgUEFUSAotICAgICAgICA7OwotZXNhYwotCi0jIExvb3Agb3ZlciBhbGwgYXJncwotCi13aGlsZSA6Ci1kbwotCi0jIEJyZWFrIG91dCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBhcmdzCi0JY2FzZSAkIyBpbgotCTApCi0JCWJyZWFrCi0JCTs7Ci0JZXNhYwotCi0jIEdldCB0aGUgZmlyc3QgYXJnLCBhbmQgc2h1ZmZsZQotCW9wdGlvbj0kMQotCXNoaWZ0Ci0KLSMgTWFrZSBhbGwgb3B0aW9ucyBoYXZlIHR3byBoeXBoZW5zCi0Jb3JpZ19vcHRpb249JG9wdGlvbgkjIFNhdmUgb3JpZ2luYWwgZm9yIGVycm9yIG1lc3NhZ2VzCi0JY2FzZSAkb3B0aW9uIGluCi0JLS0qKSA7OwotCS0qKSBvcHRpb249LSRvcHRpb24gOzsKLQllc2FjCi0JCQotIyBTcGxpdCBvdXQgdGhlIGFyZ3VtZW50IGZvciBvcHRpb25zIHRoYXQgdGFrZSB0aGVtCi0JY2FzZSAkb3B0aW9uIGluCi0JLS0qPSopCi0JCW9wdGFyZz1gZWNobyAkb3B0aW9uIHwgc2VkIC1lICdzL15bXj1dKj0vLydgCi0JCWFyZ3VtZW50cz0iJGFyZ3VtZW50cyAkb3B0aW9uIgotCQk7OwotIyBUaGVzZSBvcHRpb25zIGhhdmUgbWFuZGF0b3J5IHZhbHVlcy4gIFNpbmNlIHdlIGRpZG4ndCBmaW5kIGFuID0gc2lnbiwKLSMgdGhlIHZhbHVlIG11c3QgYmUgaW4gdGhlIG5leHQgYXJndW1lbnQKLQktLWJ1KiB8IC0tY2FjaGUqIHwgLS1leCogfCAtLWhvKiB8IC0tcHJlKiB8IC0tcHJvZ3JhbS1wKiB8IC0tcHJvZ3JhbS1zKiB8IC0tcHJvZ3JhbS10KiB8IC0tc2kqIHwgLS1zciogfCAtLXRhKiB8IC0tdG0qIHwgLS14LSogfCAtLWJpKiB8IC0tc2IqIHwgLS1saSogfCAtLWRhKiB8IC0tc3kqIHwgLS1zaCogfCAtLWxvKiB8IC0taW4qIHwgLS1vbCogfCAtLW1hKikKLQkJb3B0YXJnPSQxCi0JCXNoaWZ0Ci0JCWFyZ3VtZW50cz0iJGFyZ3VtZW50cyAkb3B0aW9uPSRvcHRhcmciCi0JCTs7Ci0JLS12KQotCQlhcmd1bWVudHM9IiRhcmd1bWVudHMgLXYiCi0JCTs7Ci0JLS0qKQotCQlhcmd1bWVudHM9IiRhcmd1bWVudHMgJG9wdGlvbiIKLQkJOzsKLQllc2FjCi0KLSMgTm93LCBwcm9jZXNzIHRoZSBvcHRpb25zCi0JY2FzZSAkb3B0aW9uIGluCi0KLQktLWJpKikKLQkJYmluZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1iaW5kaXI9JG9wdGFyZyIKLQkJOzsKLQktLWJ1aWxkKiB8IC0tYnUqKQotCQljYXNlICIkYnVpbGRfYWxpYXMiIGluCi0JCSIiKSBidWlsZF9hbGlhcz0kb3B0YXJnIDs7Ci0JCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgYnVpbGQgbWFjaGluZSBhdCBhIHRpbWUuICAxPiYyCi0JCSAgIGZhdGFsPXllcwotCQkgICA7OwotCQllc2FjCi0JCTs7Ci0JLS1jYWNoZSopCi0JCWNhY2hlX2ZpbGU9JG9wdGFyZwotCQk7OwotCS0tZGEqKQotCQlkYXRhZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1kYXRhZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1kaXNhYmxlLSopCi0JCWVuYWJsZW9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tZGlzYWJsZS06ZW5hYmxlXzo7czotOl86ZydgCi0JCWV2YWwgJGVuYWJsZW9wdD1ubwotCQlkaXNhYmxlb3B0aW9ucz0iJGRpc2FibGVvcHRpb25zICRvcHRpb24iCi0JCTs7Ci0JLS1lbmFibGUtKikKLQkJY2FzZSAiJG9wdGlvbiIgaW4KLQkJKj0qKQk7OwotCQkqKQlvcHRhcmc9eWVzIDs7Ci0JCWVzYWMKLQotCQllbmFibGVvcHQ9YGVjaG8gJHtvcHRpb259IHwgc2VkICdzOl4tLTo6O3M6PS4qJDo6O3M6LTpfOmcnYAotCQlldmFsICIkZW5hYmxlb3B0PSckb3B0YXJnJyIKLQkJZW5hYmxlb3B0aW9ucz0iJGVuYWJsZW9wdGlvbnMgJyRvcHRpb24nIgotCQk7OwotCS0tZXhlYy1wcmVmaXgqIHwgLS1leCopCi0JCWV4ZWNfcHJlZml4PSRvcHRhcmcKLQkJZXhlY19wcmVmaXhvcHRpb249Ii0tZXhlYy1wcmVmaXg9JG9wdGFyZyIKLQkJOzsKLQktLWdhcyB8IC0tZyopCi0JCWdhcz15ZXMKLQkJOzsKLQktLWhlbHAgfCAtLWhlKikKLQkJZmF0YWw9eWVzCi0JCTs7Ci0JLS1ob3N0KiB8IC0taG8qKQotCQljYXNlICRob3N0X2FsaWFzIGluCi0JCU5PSE9TVCkgaG9zdF9hbGlhcz0kb3B0YXJnIDs7Ci0JCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhdCBhIHRpbWUuICAxPiYyCi0JCSAgIGZhdGFsPXllcwotCQkgICA7OwotCQllc2FjCi0JCTs7Ci0JLS1pbmMqKQotCQlpbmNsdWRlZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1pbmNsdWRlZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1pbmYqKQotCQlpbmZvZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1pbmZvZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1saWJkKikKLQkJbGliZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1saWJkaXI9JG9wdGFyZyIKLQkJOzsKLQktLWxpYmUqKQotCQlsaWJleGVjZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1saWJleGVjZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1sbyopCi0JCWxvY2Fsc3RhdGVkaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWxvY2Fsc3RhdGVkaXI9JG9wdGFyZyIKLQkJOzsKLQktLW1hKikKLQkJbWFuZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1tYW5kaXI9JG9wdGFyZyIKLQkJOzsKLQktLW5mcCB8IC0tbmYqKQotCQlmbG9hdGluZ19wb2ludD1ubwotCQlmbG9hdGluZ19wb2ludG9wdGlvbj0iLS1uZnAiCi0JCTs7Ci0JLS1ub3JlY3Vyc2lvbiB8IC0tbm8qKQotCQlub3JlY3Vyc2lvbj15ZXMKLQkJOzsKLQktLW9sKikKLQkJb2xkaW5jbHVkZWRpcj0kb3B0YXJnCi0JCWRpcm9wdGlvbnM9IiRkaXJvcHRpb25zIC0tb2xkaW5jbHVkZWRpcj0kb3B0YXJnIgotCQk7OwotCS0tcHJlZml4KiB8IC0tcHJlKikKLQkJcHJlZml4PSRvcHRhcmcKLQkJcHJlZml4b3B0aW9uPSItLXByZWZpeD0kb3B0YXJnIgotCQk7OwotCS0tcHJvZ3JhbS1wcmVmaXgqIHwgLS1wcm9ncmFtLXAqKQotCQlwcm9ncmFtX3ByZWZpeD0kb3B0YXJnCi0JCXByb2dyYW1fcHJlZml4b3B0aW9uPSItLXByb2dyYW0tcHJlZml4PSRvcHRhcmciCi0JCTs7Ci0JLS1wcm9ncmFtLXN1ZmZpeCogfCAtLXByb2dyYW0tcyopCi0JCXByb2dyYW1fc3VmZml4PSRvcHRhcmcKLQkJcHJvZ3JhbV9zdWZmaXhvcHRpb249Ii0tcHJvZ3JhbS1zdWZmaXg9JG9wdGFyZyIKLQkJOzsKLQktLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUqIHwgLS1wcm9ncmFtLXQqKQotCQkjIERvdWJsZSBhbnkgYmFja3NsYXNoZXMgb3IgZG9sbGFyIHNpZ25zIGluIHRoZSBhcmd1bWVudAotCQlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWV9IC1lIGBlY2hvICR7b3B0YXJnfSB8IHNlZCAtZSAncy9cXFxcL1xcXFxcXFxcL2cnIC1lICdzL1xcXCQvJCQvZydgIgotCQlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lb3B0aW9uPSIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb259IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0nJG9wdGFyZyciCi0JCTs7Ci0JLS1ybSkKLQkJcmVtb3Zpbmc9LS1ybQotCQk7OwotCS0tc2IqKQotCQlzYmluZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1zYmluZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1zaCopCi0JCXNoYXJlZHN0YXRlZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1zaGFyZWRzdGF0ZWRpcj0kb3B0YXJnIgotCQk7OwotCS0tc2lsZW50IHwgLS1zaWwqIHwgLS1xdWlldCB8IC0tcSopCi0JCXJlZGlyZWN0PSI+L2Rldi9udWxsIgotCQl2ZXJib3NlPS0tc2lsZW50Ci0JCTs7Ci0JLS1zaXRlKiB8IC0tc2l0KikKLQkJc2l0ZT0kb3B0YXJnCi0JCXNpdGVfb3B0aW9uPSItLXNpdGU9JG9wdGFyZyIKLQkJOzsKLQktLXNyY2RpciovIHwgLS1zciovKQotICAgICAgICAgICAgICAgICMgUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMuICBPdGhlcndpc2UsIHdoZW4gdGhlIGZpbGUgbmFtZSBnZXRzCi0gICAgICAgICAgICAgICAgIyBib2x0ZWQgaW50byBhbiBvYmplY3QgZmlsZSBhcyBkZWJ1ZyBpbmZvLCBpdCBoYXMgdHdvIHNsYXNoZXMKLSAgICAgICAgICAgICAgICAjIGluIGl0LiAgT3JkaW5hcmlseSB0aGlzIGlzIG9rLCBidXQgZW1hY3MgdGFrZXMgZG91YmxlIHNsYXNoCi0gICAgICAgICAgICAgICAgIyB0byBtZWFuICJmb3JnZXQgdGhlIGZpcnN0IHBhcnQiLgotCQlzcmNkaXI9YGVjaG8gJG9wdGFyZyB8IHNlZCAtZSAnczovJDo6J2AKLQkJOzsKLQktLXNyY2RpciogfCAtLXNyKikKLQkJc3JjZGlyPSRvcHRhcmcKLQkJOzsKLQktLXN5KikKLQkJc3lzY29uZmRpcj0kb3B0YXJnCi0JCWRpcm9wdGlvbnM9IiRkaXJvcHRpb25zIC0tc3lzY29uZmRpcj0kb3B0YXJnIgotCQk7OwotCS0tdGFyZ2V0KiB8IC0tdGEqKQotCQljYXNlICR0YXJnZXRfYWxpYXMgaW4KLQkJTk9UQVJHRVQpIHRhcmdldF9hbGlhcz0kb3B0YXJnIDs7Ci0JCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgdGFyZ2V0IGF0IGEgdGltZS4gIDE+JjIKLQkJICAgZmF0YWw9eWVzCi0JCSAgIDs7Ci0JCWVzYWMKLQkJOzsKLQktLXRtcGRpciogfCAtLXRtKikKLQkJVE1QRElSPSRvcHRhcmcKLQkJdG1wZGlyb3B0aW9uPSItLXRtcGRpcj0kb3B0YXJnIgotCQk7OwotCS0tdmVyYm9zZSB8IC0tdiB8IC0tdmVyYiopCi0JCXJlZGlyZWN0PQotCQl2ZXJib3NlPS0tdmVyYm9zZQotCQk7OwotCS0tdmVyc2lvbiB8IC0tViB8IC0tdmVycyopCi0JCWVjaG8gIlRoaXMgaXMgQ3lnbnVzIENvbmZpZ3VyZSB2ZXJzaW9uIiBgZWNobyAke3ZlcnNpb259IHwgc2VkICdzL1sgJDpdLy9nJ2AKLQkJZXhpdCAwCi0JCTs7Ci0JLS13aXRoLSopCi0JCWNhc2UgIiRvcHRpb24iIGluCi0JCSo9KikJOzsKLQkJKikJb3B0YXJnPXllcyA7OwotCQllc2FjCi0KLQkJd2l0aG9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czo9LiokOjo7czotOl86ZydgCi0JCWV2YWwgJHdpdGhvcHQ9IiRvcHRhcmciCi0JCXdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgJG9wdGlvbiIKLQkJOzsKLQktLXdpdGhvdXQtKikKLQkJd2l0aG9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czpvdXQ6OjtzOi06XzpnJ2AKLQkJZXZhbCAkd2l0aG9wdD1ubwotCQl3aXRob3V0b3B0aW9ucz0iJHdpdGhvdXRvcHRpb25zICRvcHRpb24iCi0JCTs7Ci0JLS14KQl3aXRoX3g9eWVzCi0JCXdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgLS13aXRoLXgiCi0JCTs7Ci0JLS14LWkqIHwgLS14LWwqKSBvdGhlcl9vcHRpb25zPSIkb3RoZXJfb3B0aW9ucyAkb3JpZ19vcHRpb24iCi0JCTs7Ci0JLS0qKQotCQllY2hvICJjb25maWd1cmU6IFVucmVjb2duaXplZCBvcHRpb246IFwiJG9yaWdfb3B0aW9uXCI7IHVzZSAtLWhlbHAgZm9yIHVzYWdlLiIgPiYyCi0JCWV4aXQgMQotCQk7OwotCSopCi0JCWNhc2UgJHVuZGVmcyBpbgotCQlOT1VOREVGUykgdW5kZWZzPSRvcHRpb24gOzsKLQkJKikgZWNobyAnKioqJyBDYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZS4gIDE+JjIKLQkJICAgZmF0YWw9eWVzCi0JCSAgIDs7Ci0JCWVzYWMKLQkJOzsKLQllc2FjCi1kb25lCi0KLSMgcHJvY2VzcyBob3N0IGFuZCB0YXJnZXQKLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIFVOREVGUwotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlbid0IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgdW5kZWZzIGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gdW5kZWZzLgotIyAzLiBJZiB1bmRlZnMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgZGVmYXVsdHMgdG8gdW5kZWZzLgotIyA1LiBJZiB1bmRlZnMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgZGVmYXVsdHMgdG8gaG9zdC4KLQotY2FzZSAiJHtmYXRhbH0iIGluCi0iIikKLQkjIE1ha2Ugc3VyZSB0aGF0IGhvc3QsIHRhcmdldCAmIHVuZGVmcyBhcmVuJ3QgYWxsIHNwZWNpZmllZCBhdCB0aGUKLQkjIHNhbWUgdGltZS4KLQljYXNlICRob3N0X2FsaWFzLS0tJHRhcmdldF9hbGlhcy0tLSR1bmRlZnMgaW4KLQlOT0hPU1QtLS0qLS0tKiB8ICotLS1OT1RBUkdFVC0tLSogfCAqLS0tKi0tLU5PVU5ERUZTKQotCQk7OwotCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUuICAxPiYyCi0JICAgZmF0YWw9eWVzCi0JICAgYnJlYWsgMgotCQk7OwotCWVzYWMKLQotCSMgTm93LCBkbyBkZWZhdWx0aW5nIGZvciBob3N0LgotCWNhc2UgJGhvc3RfYWxpYXMgaW4KLQlOT0hPU1QpCi0JCWNhc2UgJHVuZGVmcyBpbgotCQlOT1VOREVGUykKLQkJCSMgTmVpdGhlciAtLWhvc3Qgb3B0aW9uIG5vciB1bmRlZnMgd2VyZSBwcmVzZW50LgotCQkJIyBDYWxsIGNvbmZpZy5ndWVzcy4KLQkJCWd1ZXNzc3lzPWBlY2hvICR7cHJvZ25hbWV9IHwgc2VkICdzL2NvbmZpZ3VyZSQvY29uZmlnLmd1ZXNzLydgCi0JCQlpZiBob3N0X2FsaWFzPWAke2NvbmZpZ19zaGVsbH0gJHtndWVzc3N5c31gCi0JCQl0aGVuCi0JCQkJIyBJZiB0aGUgc3RyaW5nIHdlIGFyZSBnb2luZyB0byB1c2UgZm9yCi0JCQkJIyB0aGUgdGFyZ2V0IGlzIGEgcHJlZml4IG9mIHRoZSBzdHJpbmcKLQkJCQkjIHdlIGp1c3QgZ3Vlc3NlZCBmb3IgdGhlIGhvc3QsIHRoZW4KLQkJCQkjIGFzc3VtZSB3ZSBhcmUgcnVubmluZyBuYXRpdmUsIGFuZCBmb3JjZQotCQkJCSMgdGhlIHNhbWUgc3RyaW5nIGZvciBib3RoIHRhcmdldCBhbmQgaG9zdC4KLQkJCQljYXNlICR0YXJnZXRfYWxpYXMgaW4KLQkJCQlOT1RBUkdFVCkgOzsKLQkJCQkqKQotCQkJCQlpZiBleHByICRob3N0X2FsaWFzIDogJHRhcmdldF9hbGlhcyA+L2Rldi9udWxsCi0JCQkJCXRoZW4KLQkJCQkJCWhvc3RfYWxpYXM9JHRhcmdldF9hbGlhcwotCQkJCQlmaQotCQkJCQk7OwotCQkJCWVzYWMKLQkJCQllY2hvICJDb25maWd1cmluZyBmb3IgYSAke2hvc3RfYWxpYXN9IGhvc3QuIiAxPiYyCi0JCQkJYXJndW1lbnRzPSItLWhvc3Q9JGhvc3RfYWxpYXMgJGFyZ3VtZW50cyIKLQkJCWVsc2UKLQkJCQllY2hvICdDb25maWcuZ3Vlc3MgZmFpbGVkIHRvIGRldGVybWluZSB0aGUgaG9zdCB0eXBlLiAgWW91IG5lZWQgdG8gc3BlY2lmeSBvbmUuJyAxPiYyCi0JCQkJZmF0YWw9eWVzCi0JCQlmaQotCQkJOzsKLQkJKikKLQkJCWhvc3RfYWxpYXM9JHVuZGVmcwotCQkJYXJndW1lbnRzPSItLWhvc3Q9JGhvc3RfYWxpYXMgJGFyZ3VtZW50cyIKLQkJCXVuZGVmcz1OT1VOREVGUwotCQkJOzsKLQkJZXNhYwotCWVzYWMKLQotCSMgRG8gZGVmYXVsdGluZyBmb3IgdGFyZ2V0LiAgSWYgLS10YXJnZXQgb3B0aW9uIGlzbid0IHByZXNlbnQsIGRlZmF1bHQKLQkjIHRvIHVuZGVmcy4gIElmIHVuZGVmcyBpc24ndCBwcmVzZW50LCBkZWZhdWx0IHRvIGhvc3QuCi0JY2FzZSAkdGFyZ2V0X2FsaWFzIGluCi0JTk9UQVJHRVQpCi0JCWNhc2UgJHVuZGVmcyBpbgotCQlOT1VOREVGUykKLQkJCXRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcwotCQkJOzsKLQkJKikKLQkJCXRhcmdldF9hbGlhcz0kdW5kZWZzCi0JCQlhcmd1bWVudHM9Ii0tdGFyZ2V0PSR0YXJnZXRfYWxpYXMgJGFyZ3VtZW50cyIKLQkJCTs7Ci0JCWVzYWMKLQllc2FjCi0JOzsKLSopIDs7Ci1lc2FjCi0KLWlmIFsgLW4gIiR7ZmF0YWx9IiAtbyAiJHtob3N0X2FsaWFzfSIgPSAiaGVscCIgXSA7IHRoZW4KLQlleGVjIDE+JjIKLQllY2hvIFVzYWdlOiBjb25maWd1cmUgW09QVElPTlNdIFtIT1NUXQotCWVjaG8KLQllY2hvIE9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0c10KLQllY2hvICcgLS1wcmVmaXg9TVlESVIJCSBpbnN0YWxsIGludG8gTVlESVIgWy91c3IvbG9jYWxdJwotCWVjaG8gJyAtLWV4ZWMtcHJlZml4PU1ZRElSCSBpbnN0YWxsIGhvc3QtZGVwZW5kZW50IGZpbGVzIGludG8gTVlESVIgWy91c3IvbG9jYWxdJwotCWVjaG8gJyAtLWhlbHAJCQkgcHJpbnQgdGhpcyBtZXNzYWdlIFtub3JtYWwgY29uZmlnXScKLQllY2hvICcgLS1idWlsZD1CVUlMRAkJIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdJwotCWVjaG8gJyAtLWhvc3Q9SE9TVAkJIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZGV0ZXJtaW5lZCB2aWEgY29uZmlnLmd1ZXNzXScKLQllY2hvICcgLS1ub3JlY3Vyc2lvbgkJIGNvbmZpZ3VyZSB0aGlzIGRpcmVjdG9yeSBvbmx5IFtyZWN1cnNlXScKLQllY2hvICcgLS1wcm9ncmFtLXByZWZpeD1GT08JIHByZXBlbmQgRk9PIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzIFsiIl0nCi0JZWNobyAnIC0tcHJvZ3JhbS1zdWZmaXg9Rk9PCSBhcHBlbmQgRk9PIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzIFsiIl0nCi0JZWNobyAnIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QIHRyYW5zZm9ybSBpbnN0YWxsZWQgbmFtZXMgYnkgc2VkIHBhdHRlcm4gUCBbIiJdJwotCWVjaG8gJyAtLXNpdGU9U0lURQkJIGNvbmZpZ3VyZSB3aXRoIHNpdGUtc3BlY2lmaWMgbWFrZWZpbGUgZm9yIFNJVEUnCi0JZWNobyAnIC0tc3JjZGlyPURJUgkJIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFsuIG9yIC4uXScKLQllY2hvICcgLS10YXJnZXQ9VEFSR0VUCSBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdJwotCWVjaG8gJyAtLXRtcGRpcj1UTVBESVIJIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZXMgaW4gVE1QRElSIFsvdG1wXScKLQllY2hvICcgLS1uZnAJCQkgY29uZmlndXJlIGZvciBzb2Z0d2FyZSBmbG9hdGluZyBwb2ludCBbaGFyZCBmbG9hdF0nCi0JZWNobyAnIC0td2l0aC1GT08sIC0td2l0aC1GT089QkFSIHBhY2thZ2UgRk9PIGlzIGF2YWlsYWJsZSAocGFyYW1ldGVyIEJBUiknCi0JZWNobyAnIC0td2l0aG91dC1GT08JCSBwYWNrYWdlIEZPTyBpcyBOT1QgYXZhaWxhYmxlJwotCWVjaG8gJyAtLWVuYWJsZS1GT08sIC0tZW5hYmxlLUZPTz1CQVIgaW5jbHVkZSBmZWF0dXJlIEZPTyAocGFyYW1ldGVyIEJBUiknCi0JZWNobyAnIC0tZGlzYWJsZS1GT08JCSBkbyBub3QgaW5jbHVkZSBmZWF0dXJlIEZPTycKLQllY2hvCi0JZWNobyAnV2hlcmUgSE9TVCBhbmQgVEFSR0VUIGFyZSBzb21ldGhpbmcgbGlrZSAic3BhcmMtc3Vub3MiLCAibWlwcy1zZ2ktaXJpeDUiLCBldGMuJwotCWVjaG8KLQlpZiBbIC1yIGNvbmZpZy5zdGF0dXMgXSA7IHRoZW4KLQkJY2F0IGNvbmZpZy5zdGF0dXMKLQlmaQotCi0JZXhpdCAxCi1maQotCi1jb25maWdzdWI9YGVjaG8gJHtwcm9nbmFtZX0gfCBzZWQgJ3MvY29uZmlndXJlJC9jb25maWcuc3ViLydgCi1tb3ZlaWZjaGFuZ2U9YGVjaG8gJHtwcm9nbmFtZX0gfCBzZWQgJ3MvY29uZmlndXJlJC9tb3ZlLWlmLWNoYW5nZS8nYAotdG9wc3JjZGlyPWBjZCBcYGRpcm5hbWUgJHtwcm9nbmFtZX1cYDsgcHdkYAotCi0KLSMgdGhpcyBpcyBhIGhhY2suICBzdW40IG11c3QgYWx3YXlzIGJlIGEgdmFsaWQgaG9zdCBhbGlhcyBvciB0aGlzIHdpbGwgZmFpbC4KLWlmICR7Y29uZmlnX3NoZWxsfSAke2NvbmZpZ3N1Yn0gc3VuNCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0gICAgICAgIHRydWUKLWVsc2UKLSAgICAgICAgZWNobyAnKioqJyBjYW5ub3QgZmluZCBjb25maWcuc3ViLiAgMT4mMgotICAgICAgICBleGl0IDEKLWZpCi0KLXRvdWNoIGNvbmZpZy5qdW5rCi1pZiAke2NvbmZpZ19zaGVsbH0gJHttb3ZlaWZjaGFuZ2V9IGNvbmZpZy5qdW5rIGNvbmZpZy50cmFzaCA7IHRoZW4KLSAgICAgICAgdHJ1ZQotZWxzZQotICAgICAgICBlY2hvICcqKionIGNhbm5vdCBmaW5kIG1vdmUtaWYtY2hhbmdlLiAgMT4mMgotICAgICAgICBleGl0IDEKLWZpCi1ybSAtZiBjb25maWcuanVuayBjb25maWcudHJhc2gKLQotY2FzZSAiJHtzcmNkaXJ9IiBpbgotIiIpCi0gICAgICAgIGlmIFsgLXIgY29uZmlndXJlLmluIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgc3JjZGlyPS4KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGlmIFsgLXIgJHtwcm9nbmFtZX0uaW4gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY2Rpcj1gZWNobyAke3Byb2duYW1lfSB8IHNlZCAnczovY29uZmlndXJlJDo6J2AKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICJDYW4ndCBmaW5kIGNvbmZpZ3VyZS5pbi4gIFRyeSB1c2luZyAtLXNyY2Rpcj1zb21lX2RpciIgIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0qKQotCSMgU2V0IHNyY2RpciB0byAiLiIgaWYgdGhhdCdzIHdoYXQgaXQgaXMuCi0JIyBUaGlzIGlzIGltcG9ydGFudCBmb3IgbXVsdGlsaWIgc3VwcG9ydC4KLQlpZiBbICEgLWQgJHtzcmNkaXJ9IF0gOyB0aGVuCi0JCWVjaG8gIkludmFsaWQgc291cmNlIGRpcmVjdG9yeSAke3NyY2Rpcn0iID4mMgotCQlleGl0IDEKLQlmaQotCXB3ZD1gcHdkYAotCXNyY3B3ZD1gY2QgJHtzcmNkaXJ9IDsgcHdkYAotCWlmIFsgIiR7cHdkfSIgPSAiJHtzcmNwd2R9IiBdIDsgdGhlbgotCQlzcmNkaXI9LgotCWZpCi1lc2FjCi0KLSMjIyB3YXJuIGFib3V0IHNvbWUgY29uZmxpY3RpbmcgY29uZmlndXJhdGlvbnMuCi0KLWNhc2UgIiR7c3JjZGlyfSIgaW4KLSIuIikgOzsKLSopCi0gICAgICAgIGlmIFsgLWYgJHtzcmNkaXJ9L2NvbmZpZy5zdGF0dXMgXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBlY2hvICcqKionIENhbm5vdCBjb25maWd1cmUgaGVyZSBpbiBcIiR7UFdEPWBwd2RgfVwiIHdoZW4gXCIke3NyY2Rpcn1cIiBpcyBjdXJyZW50bHkgY29uZmlndXJlZC4gMT4mMgotICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICBmaQotZXNhYwotCi0KLSMgZGVmYXVsdCBleGVjX3ByZWZpeAotY2FzZSAiJHtleGVjX3ByZWZpeG9wdGlvbn0iIGluCi0iIikgZXhlY19wcmVmaXg9IlwkKHByZWZpeCkiIDs7Ci0qKSA7OwotZXNhYwotCi0jIERlZmluZSB0aGUgdHJpZ2dlciBmaWxlIHRvIG1ha2Ugc3VyZSBjb25maWd1cmUgd2lsbCByZS1ydW4gd2hlbmV2ZXIKLSMgdGhlIGdjYyB2ZXJzaW9uIG51bWJlciBjaGFuZ2VzLgotaWYgWyAiJHt3aXRoX2djY192ZXJzaW9uX3RyaWdnZXIrc2V0fSIgPSBzZXQgXTsgdGhlbgotICAgIGdjY192ZXJzaW9uX3RyaWdnZXI9IiR3aXRoX2djY192ZXJzaW9uX3RyaWdnZXIiCi0gICAgZ2NjX3ZlcnNpb249YHNlZCAtZSAncy8uKlwiXChbXiBcIl0qXClbIFwiXS4qL1wxLycgPCAke3dpdGhfZ2NjX3ZlcnNpb25fdHJpZ2dlcn1gCi1lbHNlCi0gICAgIyBJZiBnY2MncyBzb3VyY2VzIGFyZSBhdmFpbGFibGUsIGRlZmluZSB0aGUgdHJpZ2dlciBmaWxlLgotICAgIGlmIFsgLWYgJHt0b3BzcmNkaXJ9L2djYy92ZXJzaW9uLmMgXSA7IHRoZW4KLQlnY2NfdmVyc2lvbl90cmlnZ2VyPSR7dG9wc3JjZGlyfS9nY2MvdmVyc2lvbi5jCi0JZ2NjX3ZlcnNpb249YHNlZCAtZSAncy8uKlwiXChbXiBcIl0qXClbIFwiXS4qL1wxLycgPCAke2djY192ZXJzaW9uX3RyaWdnZXJ9YAotCWNhc2UgIiRhcmd1bWVudHMiIGluCi0JICAqLS13aXRoLWdjYy12ZXJzaW9uLXRyaWdnZXI9JGdjY192ZXJzaW9uX3RyaWdnZXIqICkKLQkgICAgOzsKLQkgICogKQotCSAgICAjIE1ha2Ugc3VyZSBjb25maWd1cmUuaW4ga25vd3MgYWJvdXQgdGhpcy4KLQkgICAgYXJndW1lbnRzPSItLXdpdGgtZ2NjLXZlcnNpb24tdHJpZ2dlcj0kZ2NjX3ZlcnNpb25fdHJpZ2dlciAkYXJndW1lbnRzIgotCSAgICA7OwotCWVzYWMKLQl3aXRob3B0aW9ucz0iLS13aXRoLWdjYy12ZXJzaW9uLXRyaWdnZXI9JGdjY192ZXJzaW9uX3RyaWdnZXIgJHdpdGhvcHRpb25zIgotICAgIGZpCi1maQotCi0jIyMgYnJlYWsgdXAgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbi4KLWNhc2UgImBncmVwICdeIyBwZXJcLWhvc3Q6JyAke3NyY2Rpcn0vY29uZmlndXJlLmluYCIgaW4KLSIiKQotICAgICAgICBlY2hvICcqKionICR7c3JjZGlyfS9jb25maWd1cmUuaW4gaGFzIG5vIFwicGVyLWhvc3Q6XCIgbGluZS4gMT4mMgotCSMgQ2hlY2sgZm9yIGEgZGlyZWN0b3J5IHRoYXQncyBiZWVuIGNvbnZlcnRlZCB0byB1c2UgYXV0b2NvbmYgc2luY2UKLQkjIGl0IHdhcyBsYXN0IGNvbmZpZ3VyZWQuCi0JaWYgZ3JlcCBBQ19PVVRQVVQgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+L2Rldi9udWxsIDsgdGhlbgotCSAgZWNobyAnKioqJyBIbW0sIGxvb2tzIGxpa2UgdGhpcyBkaXJlY3RvcnkgaGFzIGJlZW4gYXV0b2NvbmZpc2NhdGVkLiAxPiYyCi0JICBpZiBbIC1yICR7c3JjZGlyfS9jb25maWd1cmUgXSA7IHRoZW4KLQkgICAgZWNobyAnKioqJyBSdW5uaW5nIHRoZSBsb2NhbCBjb25maWd1cmUgc2NyaXB0LiAxPiYyCi0JICAgIGNhc2UgIiR7Y2FjaGVfZmlsZX0iIGluCi0JICAgICIiKSBjYWNoZV9maWxlX29wdGlvbj0gOzsKLQkgICAgKikgIGNhY2hlX2ZpbGVfb3B0aW9uPSItLWNhY2hlLWZpbGU9JHtjYWNoZV9maWxlfSIgOzsKLQkgICAgZXNhYwotCSAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPSR7c3JjZGlyfSIKLQkgICAgY2FzZSAiJHtidWlsZF9hbGlhc30iIGluCi0JICAgICIiKSBidWlsZG9wdD0gOzsKLQkgICAgKikgIGJ1aWxkb3B0PSItLWJ1aWxkPSR7YnVpbGRfYWxpYXN9IiA7OwotCSAgICBlc2FjCi0JICAgIGV2YWwgZXhlYyAke2NvbmZpZ19zaGVsbH0gJHtzcmNkaXJ9L2NvbmZpZ3VyZSAke3ZlcmJvc2V9IFwKLQkJJHtidWlsZG9wdH0gLS1ob3N0PSR7aG9zdF9hbGlhc30gLS10YXJnZXQ9JHt0YXJnZXRfYWxpYXN9IFwKLQkJJHtwcmVmaXhvcHRpb259ICR7dG1wZGlyb3B0aW9ufSAke2V4ZWNfcHJlZml4b3B0aW9ufSBcCi0JCSR7c3JjZGlyb3B0aW9ufSAke2Rpcm9wdGlvbnN9IFwKLQkJJHtwcm9ncmFtX3ByZWZpeG9wdGlvbn0gJHtwcm9ncmFtX3N1ZmZpeG9wdGlvbn0gXAotCQkke3Byb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb259ICR7c2l0ZV9vcHRpb259IFwKLQkJJHt3aXRob3B0aW9uc30gJHt3aXRob3V0b3B0aW9uc30gXAotCQkke2VuYWJsZW9wdGlvbnN9ICR7ZGlzYWJsZW9wdGlvbnN9ICR7ZmxvYXRpbmdfcG9pbnRvcHRpb259IFwKLQkJJHtjYWNoZV9maWxlX29wdGlvbn0gJHtyZW1vdmluZ30gJHtvdGhlcl9vcHRpb25zfSAke3JlZGlyZWN0fQotCSAgZWxzZQotCSAgICBlY2hvICcqKionIFRoZXJlIGlzIG5vIGNvbmZpZ3VyZSBzY3JpcHQgcHJlc2VudCB0aG91Z2guIDE+JjIKLQkgIGZpCi0JZmkKLSAgICAgICAgZXhpdCAxCi0gICAgICAgIDs7Ci0qKSA7OwotZXNhYwotCi1jYXNlICJgZ3JlcCAnXiMgcGVyXC10YXJnZXQ6JyAke3NyY2Rpcn0vY29uZmlndXJlLmluYCIgaW4KLSIiKQotICAgICAgICBlY2hvICcqKionICR7c3JjZGlyfS9jb25maWd1cmUuaW4gaGFzIG5vIFwicGVyLXRhcmdldDpcIiBsaW5lLiAxPiYyCi0gICAgICAgIGV4aXQgMQotICAgICAgICA7OwotKikgOzsKLWVzYWMKLQotY2FzZSAiJHtUTVBESVJ9IiBpbgotIiIpIFRNUERJUj0vdG1wIDsgZXhwb3J0IFRNUERJUiA7OwotKikgOzsKLWVzYWMKLQotIyBrZWVwIHRoaXMgZmlsZW5hbWUgc2hvcnQgZm9yICYlKiUkKiMgMTQgY2hhciBmaWxlIG5hbWVzCi10bXBmaWxlPSR7VE1QRElSfS9jT05mJCQKLSMgTm90ZSB0aGF0IHVuZGVyIG1hbnkgdmVyc2lvbnMgb2Ygc2ggYSB0cmFwIGhhbmRsZXIgZm9yIDAgd2lsbCAqb3ZlcnJpZGUqIGFueQotIyBleGl0IHN0YXR1cyB5b3UgZXhwbGljaXRseSBzcGVjaWZ5ISAgQXQgdGhpcyBwb2ludCwgdGhlIG9ubHkgbm9uLWVycm9yIGV4aXQKLSMgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc2NyaXB0OyB0aGVzZSBhY3Rpb25zIGFyZSBkdXBsaWNhdGVkIHRoZXJlLCBtaW51cwotIyB0aGUgImV4aXQgMSIuICBEb24ndCB1c2UgImV4aXQgMCIgYW55d2hlcmUgYWZ0ZXIgdGhpcyB3aXRob3V0IHJlc2V0dGluZyB0aGUKLSMgdHJhcCBoYW5kbGVyLCBvciB5b3UnbGwgbG9zZS4KLXRyYXAgInJtIC1mIE1ha2VmaWxlLnRlbSAke3RtcGZpbGV9LmNvbSAke3RtcGZpbGV9LnRndCAke3RtcGZpbGV9LmhzdCAke3RtcGZpbGV9LnBvczsgZXhpdCAxIiAwIDEgMiAxNQotCi0jIHNwbGl0ICR7c3JjZGlyfS9jb25maWd1cmUuaW4gaW50byBjb21tb24sIHBlci1ob3N0LCBwZXItdGFyZ2V0LAotIyBhbmQgcG9zdC10YXJnZXQgcGFydHMuICBQb3N0LXRhcmdldCBpcyBvcHRpb25hbC4KLXNlZCAtZSAnL14jIHBlclwtaG9zdDovLCRkJyAke3NyY2Rpcn0vY29uZmlndXJlLmluID4gJHt0bXBmaWxlfS5jb20KLXNlZCAtZSAnMSwvXiMgcGVyXC1ob3N0Oi9kJyAtZSAnL14jIHBlclwtdGFyZ2V0Oi8sJGQnICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPiAke3RtcGZpbGV9LmhzdAotaWYgZ3JlcCAnXiMgcG9zdC10YXJnZXQ6JyAke3NyY2Rpcn0vY29uZmlndXJlLmluID4vZGV2L251bGwgOyB0aGVuCi0gIHNlZCAtZSAnMSwvXiMgcGVyXC10YXJnZXQ6L2QnIC1lICcvXiMgcG9zdFwtdGFyZ2V0Oi8sJGQnICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPiAke3RtcGZpbGV9LnRndAotICBzZWQgLWUgJzEsL14jIHBvc3RcLXRhcmdldDovZCcgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+ICR7dG1wZmlsZX0ucG9zCi1lbHNlCi0gIHNlZCAtZSAnMSwvXiMgcGVyXC10YXJnZXQ6L2QnICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPiAke3RtcGZpbGV9LnRndAotICBlY2hvID4ke3RtcGZpbGV9LnBvcwotZmkKLQotIyMjIGRvIGNvbW1vbiBwYXJ0IG9mIGNvbmZpZ3VyZS5pbgotCi0jIElmIHRoZSBsYW5ndWFnZSBzcGVjaWZpYyBjb21waWxlciBkb2VzIG5vdCBleGlzdCwgYnV0IHRoZSAiZ2NjIiBkaXJlY3RvcnkgZG9lcywKLSMgd2Ugd2lsbCBza2lwIHRoaXMgZGlyZWN0b3J5OyBpbiB0aGlzIGNhc2UgdGhlIHN1Yi1kaXJlY3RvcnkncyBjb21tb24gcGFydAotIyBvZiBjb25maWd1cmUuaW4gd2lsbCBjcmVhdGUgYSBzbWFsbCBzaGVsbCBzY3JpcHQgInNraXAtdGhpcy1kaXIiIGNvbnRhaW5pbmcKLSMgY29tbWFuZHMgdG8gY29tcGxldGVseSBjbGVhbiB1cCBhbnkgdGVtcG9yYXJ5IG9yIGNyZWF0ZWQgZmlsZXMuCi0KLS4gJHt0bXBmaWxlfS5jb20KLQotaWYgdGVzdCAtZiBza2lwLXRoaXMtZGlyOyB0aGVuCi0JIyBQZXJmb3JtIHRoZSBzYW1lIGNsZWFudXAgYXMgdGhlIHRyYXAgaGFuZGxlciwgbWludXMgdGhlICJleGl0IDEiIG9mIGNvdXJzZSwKLQkjIGFuZCByZXNldCB0aGUgdHJhcCBoYW5kbGVyLgotCXRyYXAgMAotCXJtIC1mIE1ha2VmaWxlKiAke3RtcGZpbGV9LmNvbSAke3RtcGZpbGV9LnRndCAke3RtcGZpbGV9LmhzdCAke3RtcGZpbGV9LnBvcwotCSMgRXhlY3V0ZSB0aGUgZmluYWwgY2xlYW4tdXAgYWN0aW9ucwotCSR7Y29uZmlnX3NoZWxsfSBza2lwLXRoaXMtZGlyCi0JIyBhbmQgc3RvcCBjb25maWd1cmluZyB0aGlzIGRpcmVjdG9yeS4KLQlleGl0IDAKLWZpCi0KLSMgc29tZSBzYW5pdHkgY2hlY2tzIG9uIGNvbmZpZ3VyZS5pbgotY2FzZSAiJHtzcmN0cmlnZ2VyfSIgaW4KLSIiKQotICAgICAgICBlY2hvICcqKionIHNyY3RyaWdnZXIgbm90IHNldCBpbiAke1BXRD1gcHdkYH0vY29uZmlndXJlLmluLiAgMT4mMgotICAgICAgICBleGl0IDEKLSAgICAgICAgOzsKLSopIDs7Ci1lc2FjCi0KLWNhc2UgIiR7YnVpbGRfYWxpYXN9IiBpbgotIiIpCi0JaWYgcmVzdWx0PWAke2NvbmZpZ19zaGVsbH0gJHtjb25maWdzdWJ9ICR7aG9zdF9hbGlhc31gIDsgdGhlbgotCSAgICBidWlsZF9jcHU9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi0JICAgIGJ1aWxkX3ZlbmRvcj1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLQkgICAgYnVpbGRfb3M9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi0JICAgIGJ1aWxkPSR7YnVpbGRfY3B1fS0ke2J1aWxkX3ZlbmRvcn0tJHtidWlsZF9vc30KLQkgICAgYnVpbGRfYWxpYXM9JHtob3N0X2FsaWFzfQotCWZpCi0JOzsKLSopCi0JaWYgcmVzdWx0PWAke2NvbmZpZ19zaGVsbH0gJHtjb25maWdzdWJ9ICR7YnVpbGRfYWxpYXN9YCA7IHRoZW4KLQkgICAgYnVpbGRvcHQ9Ii0tYnVpbGQ9JHtidWlsZF9hbGlhc30iCi0JICAgIGJ1aWxkX2NwdT1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLQkgICAgYnVpbGRfdmVuZG9yPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotCSAgICBidWlsZF9vcz1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLQkgICAgYnVpbGQ9JHtidWlsZF9jcHV9LSR7YnVpbGRfdmVuZG9yfS0ke2J1aWxkX29zfQotCWVsc2UKLQkgICAgZWNobyAiVW5yZWNvZ25pemVkIGJ1aWxkIHN5c3RlbSBuYW1lICR7YnVpbGRfYWxpYXN9LiIgMT4mMgotCSAgICBleGl0IDEKLQlmaQotCTs7Ci1lc2FjCi0KLWlmIHJlc3VsdD1gJHtjb25maWdfc2hlbGx9ICR7Y29uZmlnc3VifSAke2hvc3RfYWxpYXN9YCA7IHRoZW4KLSAgICB0cnVlCi1lbHNlCi0gICAgZWNobyAiVW5yZWNvZ25pemVkIGhvc3Qgc3lzdGVtIG5hbWUgJHtob3N0X2FsaWFzfS4iIDE+JjIKLSAgICBleGl0IDEKLWZpCi1ob3N0X2NwdT1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWhvc3Q9JHtob3N0X2NwdX0tJHtob3N0X3ZlbmRvcn0tJHtob3N0X29zfQotCi0uICR7dG1wZmlsZX0uaHN0Ci0KLWlmIHJlc3VsdD1gJHtjb25maWdfc2hlbGx9ICR7Y29uZmlnc3VifSAke3RhcmdldF9hbGlhc31gIDsgdGhlbgotICAgIHRydWUKLWVsc2UKLSAgICBlY2hvICJVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSBuYW1lICR7dGFyZ2V0X2FsaWFzfS4iIDE+JjIKLSAgICBleGl0IDEKLWZpCi10YXJnZXRfY3B1PWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLXRhcmdldD0ke3RhcmdldF9jcHV9LSR7dGFyZ2V0X3ZlbmRvcn0tJHt0YXJnZXRfb3N9Ci0KLS4gJHt0bXBmaWxlfS50Z3QKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotY2FzZSAiJHtzcmNkaXJ9IiBpbgotIiIpCi0gICAgICAgIHNyY2RpcmRlZmF1bHRlZD0xCi0gICAgICAgIHNyY2Rpcj0uCi0gICAgICAgIGlmIFsgISAtciAke3NyY3RyaWdnZXJ9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgc3JjZGlyPS4uCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0qKSA7OwotZXNhYwotCi1pZiBbICEgLXIgJHtzcmNkaXJ9LyR7c3JjdHJpZ2dlcn0gXSA7IHRoZW4KLSAgICAgICAgY2FzZSAiJHtzcmNkaXJkZWZhdWx0ZWR9IiBpbgotICAgICAgICAiIikgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IENhbid0IGZpbmQgJHtzcmNuYW1lfSBzb3VyY2VzIGluICR7UFdEPWBwd2RgfS8ke3NyY2Rpcn0iIDE+JjIgOzsKLSAgICAgICAgKikgIGVjaG8gJyoqKicgIiR7cHJvZ25hbWV9OiBDYW4ndCBmaW5kICR7c3JjbmFtZX0gc291cmNlcyBpbiAke1BXRD1gcHdkYH0vLiBvciAke1BXRD1gcHdkYH0vLi4iIDE+JjIgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIGVjaG8gJyoqKicgXChBdCBsZWFzdCAke3NyY3RyaWdnZXJ9IGlzIG1pc3NpbmcuXCkgMT4mMgotICAgICAgICBleGl0IDEKLWZpCi0KLSMgU29tZSBzeXN0ZW1zIChlLmcuLCBvbmUgb2YgdGhlIGkzODYtYWl4IHN5c3RlbXMgdGhlIGdhcyB0ZXN0ZXJzIGFyZQotIyB1c2luZykgZG9uJ3QgaGFuZGxlICJcJCIgY29ycmVjdGx5LCBzbyBkb24ndCB1c2UgaXQgaGVyZS4KLXRvb2xkaXI9JyQoZXhlY19wcmVmaXgpJy8ke3RhcmdldF9hbGlhc30KLQotaWYgWyAiJHtob3N0X2FsaWFzfSIgIT0gIiR7dGFyZ2V0X2FsaWFzfSIgXSA7IHRoZW4KLSAgICBpZiBbICIke3Byb2dyYW1fcHJlZml4b3B0aW9ufSIgPSAiIiBdIDsgdGhlbgotICAgICAgICBpZiBbICIke3Byb2dyYW1fc3VmZml4b3B0aW9ufSIgPSAiIiBdIDsgdGhlbiAKLSAgICAgICAgICAgIGlmIFsgIiR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZW9wdGlvbn0iID0gIiIgXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tIDsKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgZmkKLWZpCi0KLSMgTWVyZ2UgcHJvZ3JhbV9wcmVmaXggYW5kIHByb2dyYW1fc3VmZml4IG9udG8gcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZS4KLSMgKHByb2dyYW1fc3VmZml4IHVzZWQgdG8gdXNlICQsIGJ1dCBpdCdzIGhhcmQgdG8gcHJlc2VydmUgJCB0aHJvdWdoIGJvdGgKLSMgbWFrZSBhbmQgc2guKQotaWYgWyAiJHtwcm9ncmFtX3N1ZmZpeH0iICE9ICIiIF0gOyB0aGVuCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iLWUgcyxcXFxcKC4qXFxcXCksXFxcXDEke3Byb2dyYW1fc3VmZml4fSwgJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfSIKLWZpCi0KLWlmIFsgIiR7cHJvZ3JhbV9wcmVmaXh9IiAhPSAiIiBdIDsgdGhlbgotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ii1lIHMsXiwke3Byb2dyYW1fcHJlZml4fSwgJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfSIKLWZpCi0KLSMgSWYgQ0MgYW5kIENYWCBhcmUgbm90IHNldCBpbiB0aGUgZW52aXJvbm1lbnQsIGFuZCB0aGUgTWFrZWZpbGUKLSMgZXhpc3RzLCB0cnkgdG8gZXh0cmFjdCB0aGVtIGZyb20gaXQuICBUaGlzIGlzIHRvIGhhbmRsZSBydW5uaW5nCi0jIC4vY29uZmlnLnN0YXR1cyBieSBoYW5kLgotaWYgWyAteiAiJHtDQ30iIF0gJiYgWyAtciBNYWtlZmlsZSBdOyB0aGVuCi0gIHNlZCAtbiAtZSAnOmxvb3AKLS9cXCQvIE4KLXMvXFxcbi8vZwotdCBsb29wCi0vXkNDWyAJXSo9LyBzL0NDWyAJXSo9WyAJXSpcKC4qXCkvXDEvcCcgPCBNYWtlZmlsZSA+IE1ha2VmaWxlLmNjCi0gIENDPWB0YWlsIC0xIE1ha2VmaWxlLmNjYAotICBybSAtZiBNYWtlZmlsZS5jYwotZmkKLQotaWYgWyAteiAiJHtDRkxBR1N9IiBdICYmIFsgLXIgTWFrZWZpbGUgXTsgdGhlbgotICBzZWQgLW4gLWUgJzpsb29wCi0vXFwkLyBOCi1zL1xcXG4vL2cKLXQgbG9vcAotL15DRkxBR1NbIAldKj0vIHMvQ0ZMQUdTWyAJXSo9WyAJXSpcKC4qXCkvXDEvcCcgPCBNYWtlZmlsZSA+IE1ha2VmaWxlLmNjCi0gIENGTEFHUz1gdGFpbCAtMSBNYWtlZmlsZS5jY2AKLSAgcm0gLWYgTWFrZWZpbGUuY2MKLWZpCi0KLWlmIFsgLXogIiR7Q1hYfSIgXSAmJiBbIC1yIE1ha2VmaWxlIF07IHRoZW4KLSAgc2VkIC1uIC1lICc6bG9vcAotL1xcJC8gTgotcy9cXFxuLy9nCi10IGxvb3AKLS9eQ1hYWyAJXSo9LyBzL0NYWFsgCV0qPVsgCV0qXCguKlwpL1wxL3AnIDwgTWFrZWZpbGUgPiBNYWtlZmlsZS5jYwotICBDWFg9YHRhaWwgLTEgTWFrZWZpbGUuY2NgCi0gIHJtIC1mIE1ha2VmaWxlLmNjCi1maQotCi1pZiBbIC16ICIke0NYWEZMQUdTfSIgXSAmJiBbIC1yIE1ha2VmaWxlIF07IHRoZW4KLSAgc2VkIC1uIC1lICc6bG9vcAotL1xcJC8gTgotcy9cXFxuLy9nCi10IGxvb3AKLS9eQ1hYRkxBR1NbIAldKj0vIHMvQ1hYRkxBR1NbIAldKj1bIAldKlwoLipcKS9cMS9wJyA8IE1ha2VmaWxlID4gTWFrZWZpbGUuY2MKLSAgQ1hYRkxBR1M9YHRhaWwgLTEgTWFrZWZpbGUuY2NgCi0gIHJtIC1mIE1ha2VmaWxlLmNjCi1maQotCi0jIEdlbmVyYXRlIGEgZGVmYXVsdCBkZWZpbml0aW9uIGZvciBZQUNDLiAgVGhpcyBpcyB1c2VkIGlmIHRoZSBtYWtlZmlsZSBjYW4ndAotIyBsb2NhdGUgYmlzb24gb3IgYnlhY2MgaW4gb2JqZGlyLgotCi1mb3IgcHJvZyBpbiAnYmlzb24gLXknIGJ5YWNjIHlhY2MKLWRvCi0gIHNldCBkdW1teSAkcHJvZzsgdG1wPSQyCi0gIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRkaXIvJHRtcDsgdGhlbgotICAgICAgREVGQVVMVF9ZQUNDPSIkcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLQotICB0ZXN0IC1uICIkREVGQVVMVF9ZQUNDIiAmJiBicmVhawotZG9uZQotCi0jIEdlbmVyYXRlIGEgZGVmYXVsdCBkZWZpbml0aW9uIGZvciBNNC4gIFRoaXMgaXMgdXNlZCBpZiB0aGUgbWFrZWZpbGUgY2FuJ3QKLSMgbG9jYXRlIG00IGluIG9iamRpci4KLQotZm9yIHByb2cgaW4gZ200IGdudW00IG00Ci1kbwotICBzZXQgZHVtbXkgJHByb2c7IHRtcD0kMgotICBJRlM9IiR7SUZTPSAgIH0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgIGlmIHRlc3QgLWYgJGRpci8kdG1wOyB0aGVuCi0gICAgICBERUZBVUxUX000PSIkcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLQotICB0ZXN0IC1uICIkREVGQVVMVF9NNCIgJiYgYnJlYWsKLWRvbmUKLQotIyBHZW5lcmF0ZSBhIGRlZmF1bHQgZGVmaW5pdGlvbiBmb3IgTEVYLiAgVGhpcyBpcyB1c2VkIGlmIHRoZSBtYWtlZmlsZSBjYW4ndAotIyBsb2NhdGUgZmxleCBpbiBvYmpkaXIuCi0KLWZvciBwcm9nIGluIGZsZXggbGV4Ci1kbwotICBzZXQgZHVtbXkgJHByb2c7IHRtcD0kMgotICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgaWYgdGVzdCAtZiAkZGlyLyR0bXA7IHRoZW4KLSAgICAgIERFRkFVTFRfTEVYPSIkcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLQotICB0ZXN0IC1uICIkREVGQVVMVF9MRVgiICYmIGJyZWFrCi1kb25lCi0KLWlmIFsgIiR7YnVpbGR9IiAhPSAiJHtob3N0fSIgXTsgdGhlbgotICAjIElmIHdlIGFyZSBkb2luZyBhIENhbmFkaWFuIENyb3NzLCBpbiB3aGljaCB0aGUgaG9zdCBhbmQgYnVpbGQgc3lzdGVtcwotICAjIGFyZSBub3QgdGhlIHNhbWUsIHdlIHNldCByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgdG9vbHMuCi0KLSAgdG9vbHM9IkFSIEFSX0ZPUl9UQVJHRVQgQVMgQVNfRk9SX1RBUkdFVCBCSVNPTiBDQ19GT1JfQlVJTEQiCi0gIHRvb2xzPSIke3Rvb2xzfSBDQ19GT1JfVEFSR0VUIENYWF9GT1JfVEFSR0VUIgotICB0b29scz0iJHt0b29sc30gRExMVE9PTCBETExUT09MX0ZPUl9UQVJHRVQgR0NDX0ZPUl9UQVJHRVQgSE9TVF9QUkVGSVgiCi0gIHRvb2xzPSIke3Rvb2xzfSBIT1NUX1BSRUZJWF8xIExEIExEX0ZPUl9UQVJHRVQgTEVYIE1BS0VJTkZPIE5NIgotICB0b29scz0iJHt0b29sc30gTk1fRk9SX1RBUkdFVCBSQU5MSUIgUkFOTElCX0ZPUl9UQVJHRVQiCi0gIHRvb2xzPSIke3Rvb2xzfSBXSU5EUkVTIFdJTkRSRVNfRk9SX1RBUkdFVCBZQUNDIgotCi0gIGZvciB2YXIgaW4gJHt0b29sc307IGRvCi0gICAgaWYgWyAteiAiYGV2YWwgJ2VjaG8gJCciJHt2YXJ9ImAiIF0gJiYgWyAtciBNYWtlZmlsZSBdOyB0aGVuCi0gICAgICBzZWQgLW4gLWUgJzpsb29wCi0vXFwkLyBOCi1zL1xcXG4vL2cKLXQgbG9vcAotL14nIiR7dmFyfSInWyAJXSo9LyBzLyciJHt2YXJ9IidbIAldKj1bIAldKlwoLipcKS9cMS9wJyBcCi0JPCBNYWtlZmlsZSA+IE1ha2VmaWxlLnYKLSAgICAgIHQ9YHRhaWwgLTEgTWFrZWZpbGUudmAKLSAgICAgIGlmIFsgLW4gIiR7dH0iIF07IHRoZW4KLQlldmFsICIke3Zhcn09JyR7dH0nIgotICAgICAgZmkKLSAgICAgIHJtIC1mIE1ha2VmaWxlLnYKLSAgICBmaQotICBkb25lCi0KLSAgQVI9JHtBUi0ke2hvc3RfYWxpYXN9LWFyfQotICBBUl9GT1JfVEFSR0VUPSR7QVJfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tYXJ9Ci0gIEFTPSR7QVMtJHtob3N0X2FsaWFzfS1hc30KLSAgQVNfRk9SX1RBUkdFVD0ke0FTX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWFzfQotICBCSVNPTj0ke0JJU09OLWJpc29ufQotICBDQz0ke0NDLSR7aG9zdF9hbGlhc30tZ2NjfQotICBDRkxBR1M9JHtDRkxBR1MtIi1nIC1PMiJ9Ci0gIENYWD0ke0NYWC0ke2hvc3RfYWxpYXN9LWMrK30KLSAgQ1hYRkxBR1M9JHtDWFhGTEFHUy0iLWcgLU8yIn0KLSAgQ0NfRk9SX0JVSUxEPSR7Q0NfRk9SX0JVSUxELWdjY30KLSAgQ0NfRk9SX1RBUkdFVD0ke0NDX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWdjY30KLSAgQ1hYX0ZPUl9UQVJHRVQ9JHtDWFhfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tYysrfQotICBETExUT09MPSR7RExMVE9PTC0ke2hvc3RfYWxpYXN9LWRsbHRvb2x9Ci0gIERMTFRPT0xfRk9SX1RBUkdFVD0ke0RMTFRPT0xfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tZGxsdG9vbH0KLSAgR0NDX0ZPUl9UQVJHRVQ9JHtHQ0NfRk9SX1RBUkdFVC0ke0NDX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWdjY319Ci0gIEhPU1RfUFJFRklYPSR7YnVpbGRfYWxpYXN9LQotICBIT1NUX1BSRUZJWF8xPSR7YnVpbGRfYWxpYXN9LQotICBMRD0ke0xELSR7aG9zdF9hbGlhc30tbGR9Ci0gIExEX0ZPUl9UQVJHRVQ9JHtMRF9GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1sZH0KLSAgTUFLRUlORk89JHtNQUtFSU5GTy1tYWtlaW5mb30KLSAgTk09JHtOTS0ke2hvc3RfYWxpYXN9LW5tfQotICBOTV9GT1JfVEFSR0VUPSR7Tk1fRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tbm19Ci0gIFJBTkxJQj0ke1JBTkxJQi0ke2hvc3RfYWxpYXN9LXJhbmxpYn0KLSAgUkFOTElCX0ZPUl9UQVJHRVQ9JHtSQU5MSUJfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tcmFubGlifQotICBXSU5EUkVTPSR7V0lORFJFUy0ke2hvc3RfYWxpYXN9LXdpbmRyZXN9Ci0gIFdJTkRSRVNfRk9SX1RBUkdFVD0ke1dJTkRSRVNfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30td2luZHJlc30KLQotICBpZiBbIC16ICIke1lBQ0N9IiBdOyB0aGVuCi0gICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGRpci9iaXNvbjsgdGhlbgotCVlBQ0M9ImJpc29uIC15IgotCWJyZWFrCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAtZiAkZGlyL2J5YWNjOyB0aGVuCi0JWUFDQz1ieWFjYwotCWJyZWFrCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAtZiAkZGlyL3lhY2M7IHRoZW4KLQlZQUNDPXlhY2MKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgaWYgWyAteiAiJHtZQUNDfSIgXTsgdGhlbgotICAgICAgWUFDQz0iYmlzb24gLXkiCi0gICAgZmkKLSAgZmkKLQotICBpZiBbIC16ICIke0xFWH0iIF07IHRoZW4KLSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgICAgaWYgdGVzdCAtZiAkZGlyL2ZsZXg7IHRoZW4KLQlMRVg9ZmxleAotCWJyZWFrCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAtZiAkZGlyL2xleDsgdGhlbgotCUxFWD1sZXgKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgTEVYPSR7TEVYLWZsZXh9Ci0gIGZpCi0KLSAgIyBFeHBvcnQgdmFyaWFibGVzIHdoaWNoIGF1dG9jb25mIG1pZ2h0IHRyeSB0byBzZXQuCi0gIGV4cG9ydCBBUwotICBleHBvcnQgQVIKLSAgZXhwb3J0IENDX0ZPUl9CVUlMRAotICBleHBvcnQgRExMVE9PTAotICBleHBvcnQgTEQKLSAgZXhwb3J0IE5NCi0gIGV4cG9ydCBSQU5MSUIKLSAgZXhwb3J0IFdJTkRSRVMKLWVsc2UKLSAgIyBJZiBDQyBpcyBzdGlsbCBub3Qgc2V0LCB0cnkgdG8gZ2V0IGdjYy4KLSAgaWYgWyAteiAiJHtDQ30iIF07IHRoZW4KLSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgICAgaWYgdGVzdCAtZiAkZGlyL2djYzsgdGhlbgotCUNDPSJnY2MiCi0JZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi0JaWYgdGVzdCAteiAiYCR7Q0N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0JICBDRkxBR1M9JHtDRkxBR1MtIi1nIC1PMiJ9Ci0JICBDWFhGTEFHUz0ke0NYWEZMQUdTLSItZyAtTzIifQotCWVsc2UKLQkgIENGTEFHUz0ke0NGTEFHUy0iLU8yIn0KLQkgIENYWEZMQUdTPSR7Q1hYRkxBR1MtIi1PMiJ9Ci0JZmkKLQlybSAtZiBjb25mdGVzdCoKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgQ0M9JHtDQy1jY30KLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiR7Q0ZMQUdTfSI7IHRoZW4KLSAgICAgICMgSGVyZSBDQyBpcyBzZXQgYnV0IENGTEFHUyBpcyBub3QuICBVc2UgYSBxdWljayBoYWNrIHRvIHVzZSAtTzIgaWYgQ0MKLSAgICAgICMgaXMgc2V0IHRvIGEgdmVyc2lvbiBvZiBnY2MuCi0gICAgICBjYXNlICIke0NDfSIgaW4KLSAgICAgICpnY2MpCi0JZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi0JaWYgdGVzdCAteiAiYCR7Q0N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0JICBDRkxBR1M9JHtDRkxBR1MtIi1nIC1PMiJ9Ci0JICBDWFhGTEFHUz0ke0NYWEZMQUdTLSItZyAtTzIifQotCWVsc2UKLQkgIENGTEFHUz0ke0NGTEFHUy0iLU8yIn0KLQkgIENYWEZMQUdTPSR7Q1hYRkxBR1MtIi1PMiJ9Ci0JZmkKLQlybSAtZiBjb25mdGVzdCoKLQk7OwotICAgICAgZXNhYwotICAgIGZpCi0gIGZpCi0KLSAgQ1hYPSR7Q1hYLSJjKysifQotICBDRkxBR1M9JHtDRkxBR1MtIi1nIn0KLSAgQ1hYRkxBR1M9JHtDWFhGTEFHUy0iLWcgLU8yIn0KLWZpCi0KLWV4cG9ydCBDQwotZXhwb3J0IENYWAotZXhwb3J0IENGTEFHUwotZXhwb3J0IENYWEZMQUdTCi0KLQotZm9yIHN1YmRpciBpbiAuICR7c3ViZGlyc30gOyBkbwotCi0gICAgIyAke3N1YmRpcn0gaXMgcmVsYXRpdmUgcGF0aCBmcm9tIC4gdG8gdGhlIGRpcmVjdG9yeSB3ZSdyZSBjdXJyZW50bHkKLSAgICAjIGNvbmZpZ3VyaW5nLgotICAgICMgJHtpbnZzdWJkaXJ9IGlzIGludmVyc2Ugb2YgJHtzdWJkaXIpLCAqd2l0aCogdHJhaWxpbmcgLywgaWYgbmVlZGVkLgotICAgIGludnN1YmRpcj1gZWNobyAke3N1YmRpcn0vIHwgc2VkIC1lICdzfFwuL3x8ZycgLWUgJ3N8W14vXSovfC4uL3xnJ2AKLQotICAgICMjIyBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCBzcmNkaXIKLSAgICBjYXNlICIke3NyY2Rpcn0iIGluCi0gICAgICAgICIuIikgICMgbm8gLXNyY2RpciBvcHRpb24uICBXZSdyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICAgICAgICAgICAgICBtYWtlc3JjZGlyPS4gOzsKLSAgICAgICAgLyopICMgYWJzb2x1dGUgcGF0aAotICAgICAgICAgICAgICAgIG1ha2VzcmNkaXI9YGVjaG8gJHtzcmNkaXJ9LyR7c3ViZGlyfSB8IHNlZCAtZSAnc3wvXC4kfHwnYAotICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICopICMgb3RoZXJ3aXNlIHJlbGF0aXZlCi0gICAgICAgICAgICAgICAgY2FzZSAiJHtzdWJkaXJ9IiBpbgotICAgICAgICAgICAgICAgIC4pIG1ha2VzcmNkaXI9JHtzcmNkaXJ9IDs7Ci0gICAgICAgICAgICAgICAgKikgbWFrZXNyY2Rpcj0ke2ludnN1YmRpcn0ke3NyY2Rpcn0vJHtzdWJkaXJ9IDs7Ci0gICAgICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgWyAiJHtzdWJkaXJ9LyIgIT0gIi4vIiBdIDsgdGhlbgotICAgICAgICBNYWtlZmlsZT0ke3N1YmRpcn0vTWFrZWZpbGUKLSAgICBmaQotCi0gICAgaWYgWyAhIC1kICR7c3ViZGlyfSBdIDsgdGhlbgotICAgICAgICBpZiBta2RpciAke3N1YmRpcn0gOyB0aGVuCi0gICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IGNvdWxkIG5vdCBtYWtlICR7UFdEPWBwd2RgfS8ke3N1YmRpcn0iIDE+JjIKLSAgICAgICAgICAgICAgICBleGl0IDEKLSAgICAgICAgZmkKLSAgICBmaQotCi0gICAgY2FzZSAiJHtyZW1vdmluZ30iIGluCi0gICAgIiIpCi0gICAgICAgIGNhc2UgIiR7c3ViZGlyfSIgaW4KLSAgICAgICAgLikgOzsKLSAgICAgICAgKikgZXZhbCBlY2hvIEJ1aWxkaW5nIGluICR7c3ViZGlyfSAke3JlZGlyZWN0fSA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgIyBGSVhNRSBTaG91bGQgdGhpcyBiZSBkb25lIHJlY3Vyc2l2ZWx5ID8/PyAoVXNlZnVsIGZvciBlLmcuIGdkYnRlc3QpCi0gICAgICAgICMgU2V0IHVwIHRoZSBsaXN0IG9mIGxpbmtzIHRvIGJlIG1hZGUuCi0gICAgICAgICMgJHtsaW5rc30gaXMgdGhlIGxpc3Qgb2YgbGluayBuYW1lcywgYW5kICR7ZmlsZXN9IGlzIHRoZSBsaXN0IG9mIG5hbWVzIHRvIGxpbmsgdG8uCi0KLSAgICAgICAgIyBNYWtlIHRoZSBsaW5rcy4KLSAgICAgICAgY29uZmlnbGlua3M9IiR7bGlua3N9IgotICAgICAgICBpZiBbIC1yICR7c3ViZGlyfS9jb25maWcuc3RhdHVzIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgbXYgLWYgJHtzdWJkaXJ9L2NvbmZpZy5zdGF0dXMgJHtzdWJkaXJ9L2NvbmZpZy5iYWNrCi0gICAgICAgIGZpCi0gICAgICAgIHdoaWxlIFsgLW4gIiR7ZmlsZXN9IiBdIDsgZG8KLSAgICAgICAgICAgICAgICAjIHNldCBmaWxlIHRvIGNhciBvZiBmaWxlcywgZmlsZXMgdG8gY2RyIG9mIGZpbGVzCi0gICAgICAgICAgICAgICAgc2V0ICR7ZmlsZXN9OyBmaWxlPSQxOyBzaGlmdDsgZmlsZXM9JCoKLSAgICAgICAgICAgICAgICBzZXQgJHtsaW5rc307IGxpbms9JDE7IHNoaWZ0OyBsaW5rcz0kKgotCi0gICAgICAgICAgICAgICAgaWYgWyAhIC1yICR7c3JjZGlyfS8ke2ZpbGV9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICBpZiBbICEgLXIgJHtmaWxlfSBdIDsgdGhlbgotCQkgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICIke3Byb2duYW1lfTogY2Fubm90IGNyZWF0ZSBhIGxpbmsgXCIke2xpbmt9XCIsIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICJzaW5jZSB0aGUgZmlsZSBcIiR7c3JjZGlyfS8ke2ZpbGV9XCIgZG9lcyBub3QgZXhpc3QuIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICBleGl0IDEKLQkJICBlbHNlCi0JCQlzcmNmaWxlPSR7ZmlsZX0KLQkJICBmaQotCQllbHNlCi0JCQlzcmNmaWxlPSR7c3JjZGlyfS8ke2ZpbGV9Ci0gICAgICAgICAgICAgICAgZmkKLQotICAgICAgICAgICAgICAgICR7cmVtb3ZlfSAtZiAke2xpbmt9Ci0JCSMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGUsIG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsKLQkJaWYgJHtzeW1ib2xpY19saW5rfSAke3NyY2ZpbGV9ICR7bGlua30gPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCQkJdHJ1ZQotCQllbHNlCi0JCQkjIFdlIG5lZWQgdG8gcmUtcmVtb3ZlIHRoZSBmaWxlIGJlY2F1c2UgTHlueCBsZWF2ZXMgYSAKLQkJCSMgdmVyeSBzdHJhbmdlIGRpcmVjdG9yeSB0aGVyZSB3aGVuIGl0IGZhaWxzIGFuIE5GUyBzeW1saW5rLgotCQkJJHtyZW1vdmV9IC1yIC1mICR7bGlua30KLQkJCSR7aGFyZF9saW5rfSAke3NyY2ZpbGV9ICR7bGlua30KLQkJZmkKLSAgICAgICAgICAgICAgICBpZiBbICEgLXIgJHtsaW5rfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IHVuYWJsZSB0byBsaW5rIFwiJHtsaW5rfVwiIHRvIFwiJHtzcmNmaWxlfVwiLiIgMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgICAgICAgICAgZmkKLQotICAgICAgICAgICAgICAgIGVjaG8gIkxpbmtlZCBcIiR7bGlua31cIiB0byBcIiR7c3JjZmlsZX1cIi4iCi0gICAgICAgIGRvbmUKLQotICAgICAgICAjIENyZWF0ZSBhIC5nZGJpbml0IGZpbGUgd2hpY2ggcnVucyB0aGUgb25lIGluIHNyY2RpcgotICAgICAgICAjIGFuZCB0ZWxscyBHREIgdG8gbG9vayB0aGVyZSBmb3Igc291cmNlIGZpbGVzLgotCi0gICAgICAgIGlmIFsgLXIgJHtzcmNkaXJ9LyR7c3ViZGlyfS8uZ2RiaW5pdCBdIDsgdGhlbgotICAgICAgICAgICAgICAgIGNhc2UgJHtzcmNkaXJ9IGluCi0gICAgICAgICAgICAgICAgLikgOzsKLSAgICAgICAgICAgICAgICAqKSBjYXQgPiAke3N1YmRpcn0vLmdkYmluaXQgPDxFT0YKLSMgJHtOT19FRElUfQotZGlyICR7bWFrZXNyY2Rpcn0KLWRpciAuCi1zb3VyY2UgJHttYWtlc3JjZGlyfS8uZ2RiaW5pdAotRU9GCi0gICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgIGVzYWMKLSAgICAgICAgZmkKLQotICAgICAgICAjIEluc3RhbGwgYSBtYWtlZmlsZSwgYW5kIG1ha2UgaXQgc2V0IFZQQVRICi0gICAgICAgICMgaWYgbmVjZXNzYXJ5IHNvIHRoYXQgdGhlIHNvdXJjZXMgYXJlIGZvdW5kLgotICAgICAgICAjIEFsc28gY2hhbmdlIGl0cyB2YWx1ZSBvZiBzcmNkaXIuCi0gICAgICAgICMgTk9URTogTWFrZWZpbGUgZ2VuZXJhdGlvbiBjb25zdGl0dXRlcyB0aGUgbWFqb3JpdHkgb2YgdGhlIHRpbWUgaW4gY29uZmlndXJlLiAgSGVuY2UsIHRoaXMgc2VjdGlvbiBoYXMKLSAgICAgICAgIyBiZWVuIHNvbWV3aGF0IG9wdGltaXplZCBhbmQgaXMgcGVyaGFwcyBhIGJpdCB0d2lzdHkuCi0KLSAgICAgICAgIyBjb2RlIGlzIG9yZGVyIHNvIGFzIHRvIHRyeSB0byBzZWQgdGhlIHNtYWxsZXN0IGlucHV0IGZpbGVzIHdlIGtub3cuCi0gICAgICAgICMgc28gZG8gdGhlc2Ugc2VwYXJhdGVseSBiZWNhdXNlIEkgZG9uJ3QgdHJ1c3QgdGhlIG9yZGVyIG9mIHNlZCAtZSBleHByZXNzaW9ucy4KLQotICAgICAgICAjIHRoZSBmaXZlIG1ha2VmaWxlIGZyYWdtZW50cyBNVVNUIGVuZCB1cCBpbiB0aGUgcmVzdWx0aW5nIE1ha2VmaWxlIGluIHRoaXMgb3JkZXI6IAotICAgICAgICAjIHBhY2thZ2UgbWFjcm9zLCB0YXJnZXQsIGhvc3QsIHNpdGUsIGFuZCBwYWNrYWdlIHJ1bGVzLgotCi0gICAgICAgIGlmIFsgLWYgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke01ha2VmaWxlX2lufSBdIDsgdGhlbgotCi0gICAgICAgICAgICAjIENvbmRpdGlvbmFsaXplIHRoZSBtYWtlZmlsZSBmb3IgdGhpcyBwYWNrYWdlIGZyb20gIk1ha2VmaWxlLmluIiAob3Igd2hhdGV2ZXIgaXQncyBjYWxsZWQpIGludG8gTWFrZWZpbGUudGVtLgotICAgICAgICAgICAgcm0gLWYgJHtzdWJkaXJ9LyR7TWFrZWZpbGV9LnRlbQotICAgICAgICAgICAgY2FzZSAiJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9IiBpbgotICAgICAgICAgICAgICAiIikgY3AgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke01ha2VmaWxlX2lufSAke3N1YmRpcn0vTWFrZWZpbGUudGVtIDs7Ci0gICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1mICR7cGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnPSR7c3JjZGlyfS8ke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ30KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9IiAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7TWFrZWZpbGVfaW59ID4gJHtNYWtlZmlsZX0udGVtCi0gICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyBFeHBlY3RlZCBwYWNrYWdlIG1ha2VmaWxlIHJ1bGVzIGZyYWdtZW50IFwiJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9XCIgMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyBpcyBtaXNzaW5nIGluICR7UFdEPWBwd2RgfS4gMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke01ha2VmaWxlX2lufSAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgICMgd29ya2luZyBjb3B5IG5vdyBpbiAke01ha2VmaWxlfS50ZW0KLQotICAgICAgICAgICAgIyBDb25kaXRpb25hbGl6ZSBmb3IgdGhpcyBzaXRlLgotICAgICAgICAgICAgcm0gLWYgJHtNYWtlZmlsZX0KLSAgICAgICAgICAgICAgY2FzZSAiJHtzaXRlfSIgaW4KLSAgICAgICAgICAgICAgIiIpIG12ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0gOzsKLSAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICBzaXRlX21ha2VmaWxlX2ZyYWc9JHtzcmNkaXJ9L2NvbmZpZy9tcy0ke3NpdGV9Ci0KLSAgICAgICAgICAgICAgICAgICAgICBpZiBbIC1mICR7c2l0ZV9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VkIC1lICIvXiMjIyMvICByICR7c2l0ZV9tYWtlZmlsZV9mcmFnfSIgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gJHtNYWtlZmlsZX0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke3N1YmRpcn0vTWFrZWZpbGUudGVtICR7TWFrZWZpbGV9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlX21ha2VmaWxlX2ZyYWc9Ci0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgIyB3b3JraW5nIGNvcHkgbm93IGluICR7TWFrZWZpbGV9Ci0KLSAgICAgICAgICAgICMgQ29uZGl0aW9uYWxpemUgdGhlIG1ha2VmaWxlIGZvciB0aGlzIGhvc3QuCi0gICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICBjYXNlICIke2hvc3RfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtIDs7Ci0gICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1mICR7aG9zdF9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS8ke2hvc3RfbWFrZWZpbGVfZnJhZ30KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtob3N0X21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHtob3N0X21ha2VmaWxlX2ZyYWd9IiAke01ha2VmaWxlfSA+ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIEV4cGVjdGVkIGhvc3QgbWFrZWZpbGUgZnJhZ21lbnQgXCIke2hvc3RfbWFrZWZpbGVfZnJhZ31cIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIGlzIG1pc3NpbmcgaW4gJHtQV0Q9YHB3ZGB9LiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgICMgd29ya2luZyBjb3B5IG5vdyBpbiAke3N1YmRpcikvTWFrZWZpbGUudGVtCi0KLSAgICAgICAgICAgICMgQ29uZGl0aW9uYWxpemUgdGhlIG1ha2VmaWxlIGZvciB0aGlzIHRhcmdldC4KLSAgICAgICAgICAgIHJtIC1mICR7TWFrZWZpbGV9Ci0gICAgICAgICAgICBjYXNlICIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgICAgICAgIiIpIG12ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0gOzsKLSAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICBpZiBbICEgLWYgJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS8ke3RhcmdldF9tYWtlZmlsZV9mcmFnfQotICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAtZiAke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VkIC1lICIvXiMjIyMvICByICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiAke3N1YmRpcn0vTWFrZWZpbGUudGVtID4gJHtNYWtlZmlsZX0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke3N1YmRpcn0vTWFrZWZpbGUudGVtICR7TWFrZWZpbGV9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICBlc2FjCi0gICAgICAgICAgICAjIHdvcmtpbmcgY29weSBub3cgaW4gJHtNYWtlZmlsZX0KLQotICAgICAgICAgICAgIyBFbWl0IHRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGlzIHBhY2thZ2UncyBtYWNyb3MuCi0gICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICBjYXNlICIke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtIDs7Ci0gICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1mICR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZV9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS8ke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IiAke01ha2VmaWxlfSA+ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIEV4cGVjdGVkIHBhY2thZ2UgbWFrZWZpbGUgZnJhZ21lbnQgXCIke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ31cIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIGlzIG1pc3NpbmcgaW4gJHtQV0Q9YHB3ZGB9LiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgICMgcmVhbCBjb3B5IG5vdyBpbiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0KLSAgICAgICAgICAgICMgcHJlcGVuZCB3YXJuaW5nIGFib3V0IGVkaXR0aW5nLCBhbmQgYSBidW5jaCBvZiB2YXJpYWJsZXMuCi0gICAgICAgICAgICBybSAtZiAke01ha2VmaWxlfQotICAgICAgICAgICAgY2F0ID4gJHtNYWtlZmlsZX0gPDxFT0YKLSMgJHtOT19FRElUfQotVlBBVEggPSAke21ha2VzcmNkaXJ9Ci1saW5rcyA9ICR7Y29uZmlnbGlua3N9Ci1ob3N0X2FsaWFzID0gJHtob3N0X2FsaWFzfQotaG9zdF9jcHUgPSAke2hvc3RfY3B1fQotaG9zdF92ZW5kb3IgPSAke2hvc3RfdmVuZG9yfQotaG9zdF9vcyA9ICR7aG9zdF9vc30KLWhvc3RfY2Fub25pY2FsID0gJHtob3N0X2NwdX0tJHtob3N0X3ZlbmRvcn0tJHtob3N0X29zfQotdGFyZ2V0X2FsaWFzID0gJHt0YXJnZXRfYWxpYXN9Ci10YXJnZXRfY3B1ID0gJHt0YXJnZXRfY3B1fQotdGFyZ2V0X3ZlbmRvciA9ICR7dGFyZ2V0X3ZlbmRvcn0KLXRhcmdldF9vcyA9ICR7dGFyZ2V0X29zfQotdGFyZ2V0X2Nhbm9uaWNhbCA9ICR7dGFyZ2V0X2NwdX0tJHt0YXJnZXRfdmVuZG9yfS0ke3RhcmdldF9vc30KLUVPRgotCSAgICBjYXNlICIke2J1aWxkfSIgaW4KLQkgICAgICAiIikgOzsKLQkgICAgICAqKSAgY2F0ID4+ICR7TWFrZWZpbGV9IDw8IEVPRgotYnVpbGRfYWxpYXMgPSAke2J1aWxkX2FsaWFzfQotYnVpbGRfY3B1ID0gJHtidWlsZF9jcHV9Ci1idWlsZF92ZW5kb3IgPSAke2J1aWxkX3ZlbmRvcn0KLWJ1aWxkX29zID0gJHtidWlsZF9vc30KLWJ1aWxkX2Nhbm9uaWNhbCA9ICR7YnVpbGRfY3B1fS0ke2J1aWxkX3ZlbmRvcn0tJHtidWlsZF9vc30KLUVPRgotCSAgICBlc2FjCi0KLSAgICAgICAgICAgIGNhc2UgIiR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgICAgICAgIiIpIDs7Ci0gICAgICAgICAgICAgIC8qKSBlY2hvIHBhY2thZ2VfbWFrZWZpbGVfZnJhZyA9ICR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICAgICopICBlY2hvIHBhY2thZ2VfbWFrZWZpbGVfZnJhZyA9ICR7aW52c3ViZGlyfSR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICBlc2FjCi0KLSAgICAgICAgICAgIGNhc2UgIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAgICAgICAiIikgOzsKLSAgICAgICAgICAgICAgLyopIGVjaG8gdGFyZ2V0X21ha2VmaWxlX2ZyYWcgPSAke3RhcmdldF9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICAgICopICBlY2hvIHRhcmdldF9tYWtlZmlsZV9mcmFnID0gJHtpbnZzdWJkaXJ9JHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgZXNhYwotCi0gICAgICAgICAgICBjYXNlICIke2hvc3RfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSA7OwotICAgICAgICAgICAgICAvKikgZWNobyBob3N0X21ha2VmaWxlX2ZyYWcgPSAke2hvc3RfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgICAqKSAgZWNobyBob3N0X21ha2VmaWxlX2ZyYWcgPSAke2ludnN1YmRpcn0ke2hvc3RfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgZXNhYwotCi0gICAgICAgICAgICBpZiBbICIke3NpdGVfbWFrZWZpbGVfZnJhZ30iICE9ICIiIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgZWNobyBzaXRlX21ha2VmaWxlX2ZyYWcgPSAke2ludnN1YmRpcn0ke3NpdGVfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfQotICAgICAgICAgICAgZmkgCi0KLQkgICAgIyByZWNvcmQgaWYgd2Ugd2FudCB0byBidWlsZCBzaGFyZWQgbGlicy4KLQkgICAgaWYgdGVzdCAteiAiJHtlbmFibGVfc2hhcmVkfSI7IHRoZW4KLQkgICAgICAgIGVjaG8gZW5hYmxlX3NoYXJlZCA9IG5vID4+ICR7TWFrZWZpbGV9Ci0JICAgIGVsc2UKLQkgICAgICAgIGVjaG8gZW5hYmxlX3NoYXJlZCA9ICR7ZW5hYmxlX3NoYXJlZH0gPj4gJHtNYWtlZmlsZX0KLQkgICAgZmkKLQkgICAgIyByZWNvcmQgaWYgd2Ugd2FudCB0byBydW10aW1lIGxpYnJhcnkgc3R1ZmYgaW5zdGFsbGVkIGluIGxpYnN1YmRpci4KLQkgICAgaWYgdGVzdCAteiAiJHtlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnN9IjsgdGhlbgotCSAgICAgICAgZWNobyBlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnMgPSBubyA+PiAke01ha2VmaWxlfQotCSAgICBlbHNlCi0JICAgICAgICBlY2hvIGVuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlicyA9ICR7ZW5hYmxlX3ZlcnNpb25fc3BlY2lmaWNfcnVudGltZV9saWJzfSA+PiAke01ha2VmaWxlfQotCSAgICBmaQotCi0JICAgICMgRW1pdCBhIG1hY3JvIHdoaWNoIGRlc2NyaWJlcyB0aGUgZmlsZSBjb250YWluaW5nIGdjYydzCi0JICAgICMgdmVyc2lvbiBudW1iZXIuCi0JICAgIGVjaG8gZ2NjX3ZlcnNpb25fdHJpZ2dlciA9ICR7Z2NjX3ZlcnNpb25fdHJpZ2dlcn0gPj4gJHtNYWtlZmlsZX0KLQkgICAgIyBBbmQgZW1pdCBhIG1hY3JvIGRlZmluaW5nIGdjYydzIHZlcnNpb24gbnVtYmVyLgotCSAgICBlY2hvIGdjY192ZXJzaW9uID0gJHtnY2NfdmVyc2lvbn0gPj4gJHtNYWtlZmlsZX0KLQotICAgICAgICAgICAgIyByZXNldCBwcmVmaXgsIGV4ZWNfcHJlZml4LCBzcmNkaXIsIFNVQkRJUlMsIE5PTlNVQkRJUlMsCi0gICAgICAgICAgICAjIHJlbW92ZSBhbnkgZm9ybSBmZWVkcy4KLSAgICAgICAgICAgIGlmIFsgLXogIiR7c3ViZGlyc30iIF07IHRoZW4KLSAgICAgICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudG0yCi0gICAgICAgICAgICAgICAgc2VkIC1lICJzOl5TVUJESVJTWyAJXSo9LiokOlNVQkRJUlMgPSAke2NvbmZpZ2RpcnN9OiIgXAotICAgICAgICAgICAgICAgICAgICAtZSAiczpeTk9OU1VCRElSU1sgCV0qPS4qJDpOT05TVUJESVJTID0gJHtub2NvbmZpZ2RpcnN9OiIgXAotICAgICAgICAgICAgICAgICAgICAke3N1YmRpcn0vTWFrZWZpbGUudGVtID4gJHtzdWJkaXJ9L01ha2VmaWxlLnRtMgotICAgICAgICAgICAgICAgIHJtIC1mICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICBtdiAke3N1YmRpcn0vTWFrZWZpbGUudG0yICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLQkgICAgZmkKLQkgICAgc2VkICAgICAtZSAic3xecHJlZml4WyAJXSo9LiokfHByZWZpeCA9ICR7cHJlZml4fXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmV4ZWNfcHJlZml4WyAJXSo9LiokfGV4ZWNfcHJlZml4ID0gJHtleGVjX3ByZWZpeH18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5iaW5kaXJbIAldKj0uKiR8YmluZGlyID0gJHtiaW5kaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xec2JpbmRpclsgCV0qPS4qJHxzYmluZGlyID0gJHtzYmluZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmxpYmV4ZWNkaXJbIAldKj0uKiR8bGliZXhlY2RpciA9ICR7bGliZXhlY2Rpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5kYXRhZGlyWyAJXSo9LiokfGRhdGFkaXIgPSAke2RhdGFkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xec3lzY29uZmRpclsgCV0qPS4qJHxzeXNjb25mZGlyID0gJHtzeXNjb25mZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XnNoYXJlZHN0YXRlZGlyWyAJXSo9LiokfHNoYXJlZHN0YXRlZGlyID0gJHtzaGFyZWRzdGF0ZWRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5sb2NhbHN0YXRlZGlyWyAJXSo9LiokfGxvY2Fsc3RhdGVkaXIgPSAke2xvY2Fsc3RhdGVkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xebGliZGlyWyAJXSo9LiokfGxpYmRpciA9ICR7bGliZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmluY2x1ZGVkaXJbIAldKj0uKiR8aW5jbHVkZWRpciA9ICR7aW5jbHVkZWRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5vbGRpbmNsdWRlZGlyWyAJXSo9LiokfG9sZGluY2x1ZGVkaXIgPSAke29sZGluY2x1ZGVkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xeaW5mb2RpclsgCV0qPS4qJHxpbmZvZGlyID0gJHtpbmZvZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8Xm1hbmRpclsgCV0qPS4qJHxtYW5kaXIgPSAke21hbmRpcn18IiBcCi0JCSAgICAtZSAiL15DQ1sgCV0qPS97Ci0JCQk6bG9vcDEKLQkJCS9cXFxcJC8gTgotCQkJcy9cXFxcXFxuLy9nCi0JCQl0IGxvb3AxCi0JCQlzJV5DQ1sgCV0qPS4qJCVDQyA9ICR7Q0N9JQotCQkJfSIgXAotCQkgICAgLWUgIi9eQ1hYWyAJXSo9L3sKLQkJCTpsb29wMgotCQkJL1xcXFwkLyBOCi0JCQlzL1xcXFxcXG4vL2cKLQkJCXQgbG9vcDIKLQkJCXMlXkNYWFsgCV0qPS4qJCVDWFggPSAke0NYWH0lCi0JCQl9IiBcCi0JCSAgICAtZSAiL15DRkxBR1NbIAldKj0vewotCQkJOmxvb3AzCi0JCQkvXFxcXCQvIE4KLQkJCXMvXFxcXFxcbi8vZwotCQkJdCBsb29wMwotCQkJcyVeQ0ZMQUdTWyAJXSo9LiokJUNGTEFHUyA9ICR7Q0ZMQUdTfSUKLQkJCX0iIFwKLQkJICAgIC1lICIvXkNYWEZMQUdTWyAJXSo9L3sKLQkJCTpsb29wNAotCQkJL1xcXFwkLyBOCi0JCQlzL1xcXFxcXG4vL2cKLQkJCXQgbG9vcDQKLQkJCXMlXkNYWEZMQUdTWyAJXSo9LiokJUNYWEZMQUdTID0gJHtDWFhGTEFHU30lCi0JCQl9IiBcCi0JCSAgICAtZSAic3xeU0hFTExbCSBdKj0uKiR8U0hFTEwgPSAke2NvbmZpZ19zaGVsbH18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5zcmNkaXJbIAldKj0uKiR8c3JjZGlyID0gJHttYWtlc3JjZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInMvDC8vIiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzOl5wcm9ncmFtX3ByZWZpeFsgCV0qPS4qJDpwcm9ncmFtX3ByZWZpeCA9ICR7cHJvZ3JhbV9wcmVmaXh9OiIgXAotICAgICAgICAgICAgICAgICAgICAtZSAiczpecHJvZ3JhbV9zdWZmaXhbIAldKj0uKiQ6cHJvZ3JhbV9zdWZmaXggPSAke3Byb2dyYW1fc3VmZml4fToiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInM6XnByb2dyYW1fdHJhbnNmb3JtX25hbWVbIAldKj0uKiQ6cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9ICR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZX06IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF50b29sZGlyWyAJXSo9LiokfHRvb2xkaXIgPSAke3Rvb2xkaXJ9fCIgXAotCQkgICAgLWUgInM6XkRFRkFVTFRfWUFDQ1sJIF0qPS4qJDpERUZBVUxUX1lBQ0MgPSAke0RFRkFVTFRfWUFDQ306IiBcCi0JCSAgICAtZSAiczpeREVGQVVMVF9MRVhbCSBdKj0uKiQ6REVGQVVMVF9MRVggPSAke0RFRkFVTFRfTEVYfToiIFwKLQkJICAgIC1lICJzOl5ERUZBVUxUX000WyAgXSo9LiokOkRFRkFVTFRfTTQgPSAke0RFRkFVTFRfTTR9OiIgXAotICAgICAgICAgICAgICAgICAgICAke3N1YmRpcn0vTWFrZWZpbGUudGVtID4+ICR7TWFrZWZpbGV9Ci0gIAotCi0JICAgICMgSWYgdGhpcyBpcyBhIENhbmFkaWFuIENyb3NzLCBwcmVzZXQgdGhlIHZhbHVlcyBvZiBtYW55IG1vcmUKLQkgICAgIyB0b29scy4KLQkgICAgaWYgWyAiJHtidWlsZH0iICE9ICIke2hvc3R9IiBdOyB0aGVuCi0JCWZvciB2YXIgaW4gJHt0b29sc307IGRvCi0JCSAgICB2YWw9YGV2YWwgJ2VjaG8gJCciJHt2YXJ9ImAKLQkJICAgIHNlZCAtZSAiL14ke3Zhcn1bIAldKj0vewotCQkJICAgOmxvb3AxCi0JCQkgICAvXFxcXCQvIE4KLQkJCSAgIC9cXFxcJC8gYiBsb29wMQotCQkJICAgcy9cXFxcXFxuLy9nCi0JCQkgICBzJV4ke3Zhcn1bIAldKj0uKiQlJHt2YXJ9ID0gJHt2YWx9JQotCQkJICAgfSIgJHtNYWtlZmlsZX0gPiAke01ha2VmaWxlfS50ZW0KLQkJICAgIG12IC1mICR7TWFrZWZpbGV9LnRlbSAke01ha2VmaWxlfQotCQlkb25lCi0JICAgIGZpCi0KLSAgICAgICAgICAgICMgZmluYWwgY29weSBub3cgaW4gJHtNYWtlZmlsZX0KLQotICAgICAgICBlbHNlCi0gICAgICAgICAgIGVjaG8gIk5vIE1ha2VmaWxlLmluIGZvdW5kIGluICR7c3JjZGlyfS8ke3N1YmRpcn0sIHVuYWJsZSB0byBjb25maWd1cmUiIDE+JjIKLSAgICAgICAgZmkKLQotICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0KLSAgICAgICAgY2FzZSAiJHtob3N0X21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAiIikgdXNpbmc9IDs7Ci0gICAgICAgICopIHVzaW5nPSJhbmQgXCIke2hvc3RfbWFrZWZpbGVfZnJhZ31cIiIgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIGNhc2UgIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAiIikgOzsKLSAgICAgICAgKikgdXNpbmc9IiR7dXNpbmd9IGFuZCBcIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9XCIiIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICBjYXNlICIke3NpdGVfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICIiKSA7OwotICAgICAgICAqKSB1c2luZz0iJHt1c2luZ30gYW5kIFwiJHtzaXRlX21ha2VmaWxlX2ZyYWd9XCIiIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICBuZXd1c2luZz1gZWNobyAiJHt1c2luZ30iIHwgc2VkICdzL2FuZC91c2luZy8nYAotICAgICAgICB1c2luZz0ke25ld3VzaW5nfQotICAgICAgICBlY2hvICJDcmVhdGVkIFwiJHtNYWtlZmlsZX1cIiBpbiIgJHtQV0Q9YHB3ZGB9ICR7dXNpbmd9Ci0KLSAgICAgICAgLiAke3RtcGZpbGV9LnBvcwotCi0gICAgICAgICMgZGVzY3JpYmUgdGhlIGNob3NlbiBjb25maWd1cmF0aW9uIGluIGNvbmZpZy5zdGF0dXMuCi0gICAgICAgICMgTWFrZSB0aGF0IGZpbGUgYSBzaGVsbHNjcmlwdCB3aGljaCB3aWxsIHJlZXN0YWJsaXNoCi0gICAgICAgICMgdGhlIHNhbWUgY29uZmlndXJhdGlvbi4gIFVzZWQgaW4gTWFrZWZpbGVzIHRvIHJlYnVpbGQKLSAgICAgICAgIyBNYWtlZmlsZXMuCi0KLSAgICAgICAgY2FzZSAiJHtub3JlY3Vyc2lvbn0iIGluCi0gICAgICAgICIiKSBhcmd1bWVudHM9IiR7YXJndW1lbnRzfSAtLW5vcmVjdXJzaW9uIiA7OwotICAgICAgICAqKSA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgaWYgWyAke3N1YmRpcn0gPSAuIF0gOyB0aGVuCi0gICAgICAgICAgICBlY2hvICIjIS9iaW4vc2gKLSMgJHtOT19FRElUfQotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzOgotJHtwcm9nbmFtZX0iICR7YXJndW1lbnRzfSAgIgotIyAke3VzaW5nfSIgPiAke3N1YmRpcn0vY29uZmlnLm5ldwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlY2hvICIjIS9iaW4vc2gKLSMgJHtOT19FRElUfQotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzOgotY2QgJHtpbnZzdWJkaXJ9Ci0ke3Byb2duYW1lfSIgJHthcmd1bWVudHN9ICAiCi0jICR7dXNpbmd9IiA+ICR7c3ViZGlyfS9jb25maWcubmV3Ci0gICAgICAgIGZpCi0gICAgICAgIGNobW9kIGEreCAke3N1YmRpcn0vY29uZmlnLm5ldwotICAgICAgICBpZiBbIC1yICR7c3ViZGlyfS9jb25maWcuYmFjayBdIDsgdGhlbgotICAgICAgICAgICAgICAgIG12IC1mICR7c3ViZGlyfS9jb25maWcuYmFjayAke3N1YmRpcn0vY29uZmlnLnN0YXR1cwotICAgICAgICBmaQotCSR7Y29uZmlnX3NoZWxsfSAke21vdmVpZmNoYW5nZX0gJHtzdWJkaXJ9L2NvbmZpZy5uZXcgJHtzdWJkaXJ9L2NvbmZpZy5zdGF0dXMKLSAgICAgICAgOzsKLQotICAgICopICBybSAtZiAke01ha2VmaWxlfSAke3N1YmRpcn0vY29uZmlnLnN0YXR1cyAke2xpbmtzfSA7OwotICAgIGVzYWMKLWRvbmUKLQotIyBJZiB0aGVyZSBhcmUgc3ViZGlyZWN0b3JpZXMsIHRoZW4gcmVjdXIuCi1pZiBbIC16ICIke25vcmVjdXJzaW9ufSIgXSAmJiBbIC1uICIke2NvbmZpZ2RpcnN9IiBdIDsgdGhlbiAKLSAgICAgICAgZm9yIGNvbmZpZ2RpciBpbiAke2NvbmZpZ2RpcnN9ICR7ZXh0cmFjb25maWdkaXJzfSA7IGRvCi0KLQkJIyBJZiBjb25maWdkaXIgY29udGFpbnMgJywnIGl0IGlzCi0JCSMgc3JjZGlyLGJ1aWxkZGlyLHRhcmdldF9hbGlhcwotCQkjIFRoZXNlIGNvbWUgZnJvbSBleHRyYWNvbmZpZ2RpcnMuCi0JCWNhc2UgJHtjb25maWdkaXJ9IGluCi0JCSosKikKLQkJICAgIGV2YWwgYGVjaG8gJHtjb25maWdkaXJ9IHwgc2VkIC1lICdzL1woW14sXSpcKSxcKFteLF0qXCksXCguKlwpL2NmZ19kaXI9XDEgYmxkX2Rpcj1cMiB0Z3RfYWxpYXM9XDMvJ2AKLQkJICAgIDs7Ci0JCSopCi0JCSAgICBjZmdfZGlyPSR7Y29uZmlnZGlyfQotCQkgICAgYmxkX2Rpcj0ke2NvbmZpZ2Rpcn0KLQkJICAgIHRndF9hbGlhcz0ke3RhcmdldF9hbGlhc30KLQkJICAgIDs7Ci0JCWVzYWMKLQotICAgICAgICAgICAgICAgIGlmIFsgLWQgJHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwgZWNobyBDb25maWd1cmluZyAke2NvbmZpZ2Rpcn0uLi4gJHtyZWRpcmVjdH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c3JjZGlyfSIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICIuIikgOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIFsgISAtZCAuLyR7YmxkX2Rpcn0gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBta2RpciAuLyR7YmxkX2Rpcn0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IGNvdWxkIG5vdCBtYWtlICR7UFdEPWBwd2RgfS8ke2JsZF9kaXJ9IiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgICAgICAgICAgZXNhYwotCi0gICAgICAgICAgICAgICAgICAgICAgICBQT1BESVI9JHtQV0Q9YHB3ZGB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjZCAke2JsZF9kaXJ9IAotCi0jIyMgZmlndXJlIG91dCB3aGF0IHRvIGRvIHdpdGggc3JjZGlyCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NyY2Rpcn0iIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAiLiIpIG5ld3NyY2Rpcj0ke3NyY2Rpcn0gOzsgIyBubyAtc3JjZGlyIG9wdGlvbi4gIFdlJ3JlIGJ1aWxkaW5nIGluIHBsYWNlLgotICAgICAgICAgICAgICAgICAgICAgICAgLyopICMgYWJzb2x1dGUgcGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzcmNkaXI9JHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0ke25ld3NyY2Rpcn0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICA/OiopICMgYWJzb2x1dGUgcGF0aCBvbiB3aW4zMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzcmNkaXI9JHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0ke25ld3NyY2Rpcn0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKSAjIG90aGVyd2lzZSByZWxhdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzcmNkaXI9Li4vJHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0ke25ld3NyY2Rpcn0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlc2FjCi0KLQkJCSMgSGFuZGxlIC0tY2FjaGUtZmlsZT0uLi9YWFgKLQkJCWNhc2UgIiR7Y2FjaGVfZmlsZX0iIGluCi0JCQkiIikgIyBlbXB0eQotCQkJCTs7Ci0JCQkvKikgIyBhYnNvbHV0ZSBwYXRoCi0JCQkJY2FjaGVfZmlsZV9vcHRpb249Ii0tY2FjaGUtZmlsZT0ke2NhY2hlX2ZpbGV9IgotCQkJCTs7Ci0JCQk/OiopICMgYWJzb2x1dGUgcGF0aCBvbiB3aW4zMgotCQkJCWNhY2hlX2ZpbGVfb3B0aW9uPSItLWNhY2hlLWZpbGU9JHtjYWNoZV9maWxlfSIKLQkJCQk7OwotCQkJKikgIyByZWxhdGl2ZSBwYXRoCi0JCQkJY2FjaGVfZmlsZV9vcHRpb249Ii0tY2FjaGUtZmlsZT0uLi8ke2NhY2hlX2ZpbGV9IgotCQkJCTs7Ci0JCQllc2FjCi0KLSMjIyBjaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUsIG90aGVyd2lzZSBmaXggcG9zc2libHkgcmVsYXRpdmUgcHJvZ25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtuZXdzcmNkaXJ9L2NvbmZpZ3VyZSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNwcm9nPSR7bmV3c3JjZGlyfS9jb25maWd1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgWyAtZiAke25ld3NyY2Rpcn0vY29uZmlndXJlLmluIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7cHJvZ25hbWV9IiBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKikgICAgIHJlY3Byb2c9JHtwcm9nbmFtZX0gOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPzoqKSAgICByZWNwcm9nPSR7cHJvZ25hbWV9IDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopICAgICAgcmVjcHJvZz0uLi8ke3Byb2duYW1lfSA7OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2FjCi0JCQllbHNlCi0JCQkJZXZhbCBlY2hvIE5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaW4gJHtjZmdfZGlyfSAke3JlZGlyZWN0fQotCQkJCXJlY3Byb2c9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaQotCi0jIyMgVGhlIHJlY3Vyc2lvbiBsaW5lIGlzIGhlcmUuCi0JCQlpZiBbICEgLXogIiR7cmVjcHJvZ30iIF0gOyB0aGVuCi0JICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXZhbCAke2NvbmZpZ19zaGVsbH0gJHtyZWNwcm9nfSAke3ZlcmJvc2V9ICR7YnVpbGRvcHR9IC0taG9zdD0ke2hvc3RfYWxpYXN9IC0tdGFyZ2V0PSR7dGd0X2FsaWFzfSBcCi0gICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAke3ByZWZpeG9wdGlvbn0gJHt0bXBkaXJvcHRpb259ICR7ZXhlY19wcmVmaXhvcHRpb259IFwKLSAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICR7c3JjZGlyb3B0aW9ufSAke2Rpcm9wdGlvbnN9ICR7cHJvZ3JhbV9wcmVmaXhvcHRpb259ICR7cHJvZ3JhbV9zdWZmaXhvcHRpb259ICR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZW9wdGlvbn0gJHtzaXRlX29wdGlvbn0gJHt3aXRob3B0aW9uc30gJHt3aXRob3V0b3B0aW9uc30gJHtlbmFibGVvcHRpb25zfSAke2Rpc2FibGVvcHRpb25zfSAke2Zsb2F0aW5nX3BvaW50b3B0aW9ufSAke2NhY2hlX2ZpbGVfb3B0aW9ufSAke3JlbW92aW5nfSAke290aGVyX29wdGlvbnN9ICR7cmVkaXJlY3R9IDsgdGhlbgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UKLQkJCQkJZWNobyBDb25maWd1cmUgaW4gYHB3ZGAgZmFpbGVkLCBleGl0aW5nLiAxPiYyCi0gICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBleGl0IDEKLSAgICAgICAgICAgICAgICAgICAgICAgIAlmaQotCQkJZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2QgJHtQT1BESVJ9Ci0gICAgICAgICAgICAgICAgZmkKLSAgICAgICAgZG9uZQotZmkKLQotIyBQZXJmb3JtIHRoZSBzYW1lIGNsZWFudXAgYXMgdGhlIHRyYXAgaGFuZGxlciwgbWludXMgdGhlICJleGl0IDEiIG9mIGNvdXJzZSwKLSMgYW5kIHJlc2V0IHRoZSB0cmFwIGhhbmRsZXIuCi1ybSAtZiAke3RtcGZpbGV9LmNvbSAke3RtcGZpbGV9LnRndCAke3RtcGZpbGV9LmhzdCAke3RtcGZpbGV9LnBvcwotdHJhcCAwCi0KLWV4aXQgMAotCi0jCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgZmlsbC1jb2x1bW46IDEzMQotIyBFbmQ6Ci0jCi0KLSMgZW5kIG9mIGNvbmZpZ3VyZQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmJhdCBiL2NvbmZpZ3VyZS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NmEzN2UuLjAwMDAwMDAKLS0tIGEvY29uZmlndXJlLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLUBlY2hvIG9mZg0KLQ0KLWNoZGlyIGxpYmliZXJ0eQ0KLWNhbGwgY29uZmlndXJlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQotY2hkaXIgLi5cYmZkDQotY2FsbCBjb25maWd1cmUgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCi1jaGRpciAuLlxvcGNvZGVzDQotY2FsbCBjb25maWd1cmUgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCi1jaGRpciAuLlxncHJvZg0KLWNhbGwgY29uZmlndXJlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQotY2hkaXIgLi5cYmludXRpbHMNCi1jYWxsIGNvbmZpZ3VyZSAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQ0KLWNoZGlyIC4uXGdhcw0KLWNhbGwgY29uZmlndXJlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQotY2hkaXIgLi5cbGQNCi1jYWxsIGNvbmZpZ3VyZSAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQ0KLWNoZGlyIC4uDQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmluIGIvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGU1YzQzLi4wMDAwMDAwCi0tLSBhL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDExODQgKzAsMCBAQAotIyEgL2Jpbi9iYXNoCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IGZyYWdtZW50IHRoYXQgc3VwcGxpZXMgdGhlIGluZm9ybWF0aW9uCi0jIyBuZWNlc3NhcnkgdG8gdGFpbG9yIGEgdGVtcGxhdGUgY29uZmlndXJlIHNjcmlwdCBpbnRvIHRoZSBjb25maWd1cmUKLSMjIHNjcmlwdCBhcHByb3ByaWF0ZSBmb3IgdGhpcyBkaXJlY3RvcnkuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sKLSMjIGFueSBleGlzdGluZyBjb25maWd1cmUgc2NyaXB0LiAgCi0KLSMjIEJlIHdhcm5lZCwgdGhlcmUgYXJlIHR3byB0eXBlcyBvZiBjb25maWd1cmUuaW4gZmlsZXMuICBUaGVyZSBhcmUgdGhvc2UKLSMjIHVzZWQgYnkgQXV0b2NvbmYsIHdoaWNoIGFyZSBtYWNyb3Mgd2hpY2ggYXJlIGV4cGFuZGVkIGludG8gYSBjb25maWd1cmUKLSMjIHNjcmlwdCBieSBhdXRvY29uZi4gIFRoZSBvdGhlciBzb3J0LCBvZiB3aGljaCB0aGlzIGlzIG9uZSwgaXMgZXhlY3V0ZWQKLSMjIGJ5IEN5Z251cyBjb25maWd1cmUuICAKLQotIyMgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UgdHdvIHN5c3RlbXMsIGNoZWNrIG91dCB0aGUgZG9jdW1lbnRhdGlvbgotIyMgZm9yICdBdXRvY29uZicgKGF1dG9jb25mLnRleGkpIGFuZCAnQ29uZmlndXJlJyAoY29uZmlndXJlLnRleGkpLiAgCi0KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyBUbyBhZGQgYSBuZXcgZGlyZWN0b3J5IHRvIHRoZSB0cmVlLCBmaXJzdCBjaG9vc2Ugd2hldGhlciBpdCBpcyBhIHRhcmdldAotIyMjIG9yIGEgaG9zdCBkZXBlbmRlbnQgdG9vbC4gIFRoZW4gcHV0IGl0IGludG8gdGhlIGFwcHJvcHJpYXRlIGxpc3QKLSMjIyAobGlicmFyeSBvciB0b29scywgaG9zdCBvciB0YXJnZXQpLCBkb2luZyBhIGRlcGVuZGVuY3kgc29ydC4gIEZvcgotIyMjIGV4YW1wbGUsIGdkYiByZXF1aXJlcyB0aGF0IGJ5YWNjIChvciBiaXNvbikgYmUgYnVpbHQgZmlyc3QsIHNvIGl0IGlzIGluCi0jIyMgdGhlICR7aG9zdF90b29sc30gbGlzdCBhZnRlciBieWFjYyBhbmQgYmlzb24uICAKLQotCi0jIHRoZXNlIGxpYnJhcmllcyBhcmUgdXNlZCBieSB2YXJpb3VzIHByb2dyYW1zIGJ1aWx0IGZvciB0aGUgaG9zdCBlbnZpcm9ubWVudAotIwotaG9zdF9saWJzPSJpbnRsIG1tYWxsb2MgbGliaWJlcnR5IG9wY29kZXMgYmZkIHJlYWRsaW5lIGdhc2ggZGIgdGNsIHRrIHRjbDguMSB0azguMSB0Y2xYIGl0Y2wgdGl4IGxpYmd1aSIKLQotaWYgWyAiJHtlbmFibGVfZ2RiZ3VpfSIgPSAieWVzIiBdIDsgdGhlbgotCWhvc3RfbGlicz0iJHtob3N0X2xpYnN9IGxpYmd1aSIKLWZpCi0KLSMgdGhlc2UgdG9vbHMgYXJlIGJ1aWx0IGZvciB0aGUgaG9zdCBlbnZpcm9ubWVudAotIyBOb3RlLCB0aGUgcG93ZXJwYy1lYWJpIGJ1aWxkIGRlcGVuZHMgb24gc2ltIG9jY3VycmluZyBiZWZvcmUgZ2RiIGluIG9yZGVyIHRvCi0jIGtub3cgdGhhdCB3ZSBhcmUgYnVpbGRpbmcgdGhlIHNpbXVsYXRvci4KLWhvc3RfdG9vbHM9InRleGluZm8gYnlhY2MgZmxleCBiaXNvbiBiaW51dGlscyBsZCBnYXMgZ2NjIHNpbSBnZGIgbWFrZSBwYXRjaCBwcm1zIHNlbmQtcHIgZ3Byb2YgZ2RidGVzdCB0Z2FzIGV0YyBleHBlY3QgZGVqYWdudSBhc2ggYmFzaCBiemlwMiBtNCBhdXRvY29uZiBhdXRvbWFrZSBsaWJ0b29sIGlzcGVsbCBncmVwIGRpZmYgcmNzIGN2c3NyYyBmaWxldXRpbHMgc2hlbGx1dGlscyB0aW1lIHRleHR1dGlscyB3ZGlmZiBmaW5kIGVtYWNzIGVtYWNzMTkgdXVkZWNvZGUgaGVsbG8gdGFyIGd6aXAgaW5kZW50IHJlY29kZSByZWxlYXNlIHNlZCB1dGlscyBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IGdhd2sgZmluZHV0aWxzIHNuYXZpZ2F0b3IgbGlidG9vbCBnZXR0ZXh0IHppcCIKLQotIyB0aGVzZSBsaWJyYXJpZXMgYXJlIGJ1aWx0IGZvciB0aGUgdGFyZ2V0IGVudmlyb25tZW50LCBhbmQgYXJlIGJ1aWx0IGFmdGVyCi0jIHRoZSBob3N0IGxpYnJhcmllcyBhbmQgdGhlIGhvc3QgdG9vbHMgKHdoaWNoIG1heSBiZSBhIGNyb3NzIGNvbXBpbGVyKQotIwotdGFyZ2V0X2xpYnM9InRhcmdldC1saWJpYmVydHkgXAotCQl0YXJnZXQtbGliZ2xvc3MgXAotCQl0YXJnZXQtbmV3bGliIFwKLQkJdGFyZ2V0LWxpYmlvIFwKLQkJdGFyZ2V0LWxpYnJ4IFwKLQkJdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JCXRhcmdldC1saWJnKysiCi0KLSMgdGhlc2UgdG9vbHMgYXJlIGJ1aWx0IHVzaW5nIHRoZSB0YXJnZXQgbGlicywgYW5kIGFyZSBpbnRlbmRlZCB0byBydW4gb25seQotIyBpbiB0aGUgdGFyZ2V0IGVudmlyb25tZW50Ci0jCi0jIG5vdGU6IGFueSBwcm9ncmFtIHRoYXQgKnVzZXMqIGxpYnJhcmllcyB0aGF0IGFyZSBpbiB0aGUgInRhcmdldF9saWJzIgotIyBsaXN0IGJlbG9uZ3MgaW4gdGhpcyBsaXN0LiAgdGhvc2UgcHJvZ3JhbXMgYXJlIGFsc28gdmVyeSBsaWtlbHkKLSMgY2FuZGlkYXRlcyBmb3IgdGhlICJuYXRpdmVfb25seSIgbGlzdCB3aGljaCBmb2xsb3dzCi0jCi10YXJnZXRfdG9vbHM9InRhcmdldC1leGFtcGxlcyB0YXJnZXQtZ3JvZmYgdGFyZ2V0LWdwZXJmIgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyBUaGVzZSB0d28gbGlzdHMgYXJlIG9mIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUKLSMjICR7Y29uZmlnZGlyc30gbGlzdCBmb3IgZWl0aGVyIGNyb3NzLWNvbXBpbGF0aW9ucyBvciBmb3IgbmF0aXZlLQotIyMgY29tcGlsYXRpb25zLiAgRm9yIGV4YW1wbGUsIGl0IGRvZXNuJ3QgbWFrZSB0aGF0IG11Y2ggc2Vuc2UgdG8KLSMjIGNyb3NzLWNvbXBpbGUgRW1hY3MsIG5vciBpcyBpdCB0ZXJyaWJseSB1c2VmdWwgdG8gY29tcGlsZSB0YXJnZXQtbGliaWJlcnR5IGluCi0jIyBhIG5hdGl2ZSBlbnZpcm9ubWVudC4gIAotCi0jIGRpcmVjdG9yaWVzIHRvIGJlIGJ1aWx0IGluIHRoZSBuYXRpdmUgZW52aXJvbm1lbnQgb25seQotIwotIyBUaGlzIG11c3QgYmUgYSBzaW5nbGUgbGluZSBiZWNhdXNlIG9mIHRoZSB3YXkgaXQgaXMgc2VhcmNoZWQgYnkgZ3JlcCBpbgotIyB0aGUgY29kZSBiZWxvdy4KLW5hdGl2ZV9vbmx5PSJhdXRvY29uZiBhdXRvbWFrZSBsaWJ0b29sIGN2c3NyYyBlbWFjcyBlbWFjczE5IGZpbGV1dGlscyBmaW5kIGdhd2sgZ2V0dGV4dCBncmVwIGd6aXAgaGVsbG8gaW5kZW50IGlzcGVsbCBtNCByY3MgcmVjb2RlIHNlZCBzaGVsbHV0aWxzIHRhciB0ZXh0dXRpbHMgZ2FzaCB1dWRlY29kZSB3ZGlmZiBncHJvZiB0YXJnZXQtZ3JvZmYgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCB0aW1lIGFzaCBiYXNoIGJ6aXAyIHBybXMgc25hdmlnYXRvciBnbnVzZXJ2IHRhcmdldC1ncGVyZiIKLQotIyBkaXJlY3RvcmllcyB0byBiZSBidWlsdCBpbiBhIGNyb3NzIGVudmlyb25tZW50IG9ubHkKLSMKLWNyb3NzX29ubHk9InRhcmdldC1saWJnbG9zcyB0YXJnZXQtbmV3bGliIHRhcmdldC1jeWdtb24gdGFyZ2V0LW9wY29kZXMgdGFyZ2V0LWxpYnN0dWIiCi0KLSMjIEFsbCB0b29scyBiZWxvbmcgaW4gb25lIG9mIHRoZSBmb3VyIGNhdGVnb3JpZXMsIGFuZCBhcmUgYXNzaWduZWQgYWJvdmUKLSMjIFdlIGFzc2lnbiAke2NvbmZpZ2RpcnN9IHRoaXMgd2F5IHRvIHJlbW92ZSBhbGwgZW1iZWRkZWQgbmV3bGluZXMuICBUaGlzCi0jIyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBjb25maWd1cmUgd2lsbCBjaG9rZSBpZiB0aGV5IGV2ZXIgZ2V0IHRocm91Z2guCi0jIyAke2NvbmZpZ2RpcnN9IGlzIGRpcmVjdG9yaWVzIHdlIGJ1aWxkIHVzaW5nIHRoZSBob3N0IHRvb2xzLgotIyMgJHt0YXJnZXRfY29uZmlnZGlyc30gaXMgZGlyZWN0b3JpZXMgd2UgYnVpbGQgdXNpbmcgdGhlIHRhcmdldCB0b29scy4KLSMKLWNvbmZpZ2RpcnM9YGVjaG8gJHtob3N0X2xpYnN9ICR7aG9zdF90b29sc31gCi10YXJnZXRfY29uZmlnZGlycz1gZWNobyAke3RhcmdldF9saWJzfSAke3RhcmdldF90b29sc31gCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXNyY3RyaWdnZXI9bW92ZS1pZi1jaGFuZ2UKLXNyY25hbWU9ImdudSBkZXZlbG9wbWVudCBwYWNrYWdlIgotCi0jIFRoaXMgZ2V0cyBzZXQgbm9uLWVtcHR5IGZvciBzb21lIG5ldCByZWxlYXNlcyBvZiBwYWNrYWdlcy4KLWFwcGRpcnM9IiIKLQotIyBwZXItaG9zdDoKLQotIyBXb3JrIGluIGRpc3RyaWJ1dGlvbnMgdGhhdCBjb250YWluIG5vIGNvbXBpbGVyIHRvb2xzLCBsaWtlIEF1dG9jb25mLgotaWYgWyAtZCAke3NyY2Rpcn0vY29uZmlnIF07IHRoZW4KLWNhc2UgIiR7aG9zdH0iIGluCi0gIG02OGstaHAtaHB1eCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWhwMzAwIgotICAgIDs7Ci0gIG02OGstYXBvbGxvLXN5c3YqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1hcG9sbG82OCIKLSAgICA7OwotICBtNjhrLWFwb2xsby1ic2QqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1hNjhic2QiCi0gICAgOzsKLSAgbTg4ay1kZy1kZ3V4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZGd1eCIKLSAgICA7OwotICBtODhrLWhhcnJpcy1jeHV4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtY3h1eCIKLSAgICA7OwotICBtODhrLW1vdG9yb2xhLXN5c3YqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1kZWx0YTg4IgotICAgIDs7Ci0gIG1pcHMqLWRlYy11bHRyaXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1kZWNzdGF0aW9uIgotICAgIDs7Ci0gIG1pcHMqLW5lYy1zeXN2NCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLW5lY3Y0IgotICAgIDs7Ci0gIG1pcHMqLXNnaS1pcml4NiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWlyaXg2IgotICAgIDs7Ci0gIG1pcHMqLXNnaS1pcml4NSopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWlyaXg1IgotICAgIDs7Ci0gIG1pcHMqLXNnaS1pcml4NCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWlyaXg0IgotICAgIDs7Ci0gIG1pcHMqLXNnaS1pcml4MyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3YiCi0gICAgOzsKLSAgbWlwcyotKi1zeXN2NCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y0IgotICAgIDs7Ci0gIG1pcHMqLSotc3lzdiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXJpc2NvcyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zeXN2NSopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y1IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWRndXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1kZ3V4Mzg2IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni1uY3Itc3lzdjQuMyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLW5jcnN2cjQzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni1uY3Itc3lzdjQqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1uY3IzMDAwIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXNjbzMuMnY1KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdiIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zY28qKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zY28iCi0gICAgOzsKLSAgaVszNDU2XTg2LSotdWRrKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdjUiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotaXNjKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdiIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zb2xhcmlzMiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y0IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWFpeCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWFpeDM4NiIKLSAgICA7OwotICBpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZGpncHAiCi0gICAgOzsKLSAgKi1jeWd3aW4qKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1jeWd3aW4iCi0gICAgOzsKLSAgKi1taW5ndzMyKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtbWluZ3czMiIKLSAgICA7OwotICAqLWludGVyaXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1pbnRlcml4IgotICAgIDs7Ci0gICotd2luZG93cyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXdpbmRvd3MiCi0gICAgOzsKLSAgdmF4LSotdWx0cml4MiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXZheHVsdDIiCi0gICAgOzsKLSAgKi0qLXNvbGFyaXMyKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc29sYXJpcyIKLSAgICA7OwotICBtNjhrLXN1bi1zdW5vcyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN1bjMiCi0gICAgOzsKLSAgKi1ocC1ocHV4Wzc4XSopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWhwdXg4IgotICAgIDs7Ci0gICotaHAtaHB1eCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWhwdXgiCi0gICAgOzsKLSAgKi0qLWhpdXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1ocHV4IgotICAgIDs7Ci0gIHJzNjAwMC0qLWx5bnhvcyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWx5bnhyczZrIgotICAgIDs7Ci0gICotKi1seW54b3MqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1seW54b3MiCi0gICAgOzsKLSAgKi0qLWFpeDQuWzM0NTY3ODldKiB8ICotKi1haXhbNTY3ODldLiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWFpeDQzIgotICAgIDs7Ci0gICotKi1zeXN2NCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y0IgotICAgIDs7Ci0gICotKi1zeXN2KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdiIKLSAgICA7OwotZXNhYwotZmkKLQotIyBJZiB3ZSBhcmVuJ3QgZ29pbmcgdG8gYmUgdXNpbmcgZ2NjLCBzZWUgaWYgd2UgY2FuIGV4dHJhY3QgYSBkZWZpbml0aW9uCi0jIG9mIENDIGZyb20gdGhlIGZyYWdtZW50LgotaWYgWyAteiAiJHtDQ30iIF0gJiYgWyAiJHtidWlsZH0iID0gIiR7aG9zdH0iIF07IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm91bmQ9Ci0gIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRkaXIvZ2NjOyB0aGVuCi0gICAgICBmb3VuZD15ZXMKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLSAgaWYgWyAteiAiJHtmb3VuZH0iIF0gJiYgWyAtbiAiJHtob3N0X21ha2VmaWxlX2ZyYWd9IiBdICYmIFsgLWYgIiR7c3JjZGlyfS8ke2hvc3RfbWFrZWZpbGVfZnJhZ30iIF07IHRoZW4KLSAgICB4eD1gc2VkIC1uIC1lICdzL15bIAldKkNDWyAJXSo9WyAJXSpcKC4qXCkkL1wxL3AnIDwgJHtzcmNkaXJ9LyR7aG9zdF9tYWtlZmlsZV9mcmFnfWAKLSAgICBpZiBbIC1uICIke3h4fSIgXSA7IHRoZW4KLSAgICAgIENDPSR4eAotICAgIGZpCi0gIGZpCi1maQotCi0jIFdlIGRlZmF1bHQgdG8gLS13aXRoLXNoYXJlZCBvbiBwbGF0Zm9ybXMgd2hlcmUgLWZwaWMgaXMgbWVhbmluZ2xlc3MuCi0jIFdlbGwsIHdlIGRvbid0IHlldCwgYnV0IHdlIHdpbGwuCi1pZiBmYWxzZSAmJiBbICIke2hvc3R9IiA9ICIke3RhcmdldH0iIF0gJiYgWyB4JHtlbmFibGVfc2hhcmVkfSA9IHggXTsgdGhlbgotICBjYXNlICIke3RhcmdldH0iIGluCi0gICAgYWxwaGEqLWRlYy1vc2YqKQllbmFibGVfc2hhcmVkPXllcyA7OwotICAgIGFscGhhKi0qLWxpbnV4KikJZW5hYmxlX3NoYXJlZD15ZXMgOzsKLSAgICBtaXBzLXNnaS1pcml4NSopCWVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci0gICAgKikJCQllbmFibGVfc2hhcmVkPW5vIDs7Ci0gIGVzYWMKLWZpCi0KLWNhc2UgIiR7ZW5hYmxlX3NoYXJlZH0iIGluCi0gIHllcykgc2hhcmVkPXllcyA7OwotICBubykgc2hhcmVkPW5vIDs7Ci0gICIiKSBzaGFyZWQ9bm8gOzsKLSAgKikgc2hhcmVkPXllcyA7OwotZXNhYwotCi1pZiBbIHgke3NoYXJlZH0gPSB4eWVzIF07IHRoZW4KLSAgY2FzZSAiJHtob3N0fSIgaW4KLSAgICBhbHBoYSotKi1saW51eCopCi0gICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZWxmYWxwaGFwaWMiCi0gICAgICA7OwotICAgIGFybSotKi0qKQotICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWFybXBpYyIKLSAgICAgIDs7Ci0gICAgaHBwYSotKi0qKQotICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXBhcGljIgotICAgICAgOzsKLSAgICBpWzM0NTZdODYtKi1jeWd3aW4qKQotICAgICAgIyBXZSBkb24ndCB3YW50IC1mUElDIG9uIEN5Z3dpbi4KLSAgICAgIDs7Ci0gICAgaVszNDU2XTg2LSotKikKLSAgICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC14ODZwaWMiCi0gICAgICA7OwotICAgIHNwYXJjNjQtKi0qKQotICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXNwYXJjcGljIgotICAgICAgOzsKLSAgICBwb3dlcnBjKi0qLWFpeCopCi0gICAgICAjIFdlIGRvbid0IHdhbnQgLWZQSUMgb24gQUlYLgotICAgICAgOzsKLSAgICBwb3dlcnBjKi0qLSopCi0gICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtcHBjcGljIgotICAgICAgOzsKLSAgICAqLSotKikKLSAgICAgIGlmIHRlc3QgLWYgJHtzcmNkaXJ9L2NvbmZpZy9taC0ke2hvc3RfY3B1fXBpYzsgdGhlbgotICAgICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtJHtob3N0X2NwdX1waWMiCi0gICAgICBmaQotICAgICAgOzsKLSAgZXNhYwotZmkKLQotcm0gLWYgbWgtZnJhZwotaWYgWyAtbiAiJHtob3N0X21ha2VmaWxlX2ZyYWd9IiBdIDsgdGhlbgotICBmb3IgZiBpbiAke2hvc3RfbWFrZWZpbGVfZnJhZ30KLSAgZG8KLSAgICBjYXQgJHtzcmNkaXJ9LyRmID4+IG1oLWZyYWcKLSAgZG9uZQotICBob3N0X21ha2VmaWxlX2ZyYWc9bWgtZnJhZwotZmkKLQotIyBwZXItdGFyZ2V0OgotCi1jYXNlICIke3RhcmdldH0iIGluCi0gIHY4MTAqKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtdjgxMCIKLSAgICA7OwotICBpWzM0NTZdODYtKi1uZXR3YXJlKikKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LW5ldHdhcmUiCi0gICAgOzsKLSAgcG93ZXJwYy0qLW5ldHdhcmUqKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtbmV0d2FyZSIKLSAgICA7OwotICAqLSotbGludXgtZ251KQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtbGludXgiCi0gICAgOzsKLWVzYWMKLQotIyBJZiAtLWVuYWJsZS10YXJnZXQtb3B0c3BhY2UgYWx3YXlzIHVzZSAtT3MgaW5zdGVhZCBvZiAtTzIgdG8gYnVpbGQKLSMgdGhlIHRhcmdldCBsaWJyYXJpZXMsIHNpbWlsYXJseSBpZiBpdCBpcyBub3Qgc3BlY2lmaWVkLCB1c2UgLU9zCi0jIG9uIHNlbGVjdGVkIHBsYXRmb3Jtcy4KLWNhc2UgIiR7ZW5hYmxlX3RhcmdldF9vcHRzcGFjZX06JHt0YXJnZXR9IiBpbgotICB5ZXM6KikKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LW9zcGFjZSIKLSAgICA7OwotICAjIENZR05VUyBMT0NBTCBkMTB2LCBkMzB2LCBmcjMwCi0gIDpkMzB2LSopCi0gICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1kMzB2IgotICAgIDs7Ci0gIDptMzJyLSogfCA6ZDEwdi0qIHwgOmZyMzAtKikKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LW9zcGFjZSIKLSAgICA7OwotICBubzoqIHwgOiopCi0gICAgOzsKLSAgKikKLSAgICBlY2hvICIqKiogYmFkIHZhbHVlIFwiJHtlbmFibGVfdGFyZ2V0X29wdHNwYWNlfVwiIGZvciAtLWVuYWJsZS10YXJnZXQtb3B0c3BhY2UgZmxhZzsgaWdub3JlZCIgMT4mMgotICAgIDs7Ci1lc2FjCi0KLXNraXBkaXJzPQotZ2FzZGlyPWdhcwotdXNlX2dudV9sZD0KLXVzZV9nbnVfYXM9Ci0KLSMgc29tZSB0b29scyBhcmUgc28gZGVwZW5kZW50IHVwb24gWDExIHRoYXQgaWYgd2UncmUgbm90IGJ1aWxkaW5nIHdpdGggWCwgCi0jIGl0J3Mgbm90IGV2ZW4gd29ydGggdHJ5aW5nIHRvIGNvbmZpZ3VyZSwgbXVjaCBsZXNzIGJ1aWxkLCB0aGF0IHRvb2wuCi0KLWNhc2UgJHt3aXRoX3h9IGluCi0gIHllcyB8ICIiKSAgIyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyB0cmVlIGlzIHRoYXQgWDExIGlzIGF2YWlsYWJsZQotCTs7Ci0gIG5vKQotCXNraXBkaXJzPSIke3NraXBkaXJzfSB0ayBsaWJndWkgZ2FzaCIKLQk7OwotICAqKQotICAgIAllY2hvICIqKiogYmFkIHZhbHVlIFwiJHt3aXRoX3h9XCIgZm9yIC13aXRoLXggZmxhZzsgaWdub3JlZCIgMT4mMgotICAgIAk7OwotZXNhYwotCi0jIFNvbWUgdG9vbHMgYXJlIG9ubHkgc3VpdGFibGUgZm9yIGJ1aWxkaW5nIGluIGEgIm5hdGl2ZSIgc2l0dWF0aW9uLgotIyBUaG9zZSBhcmUgYWRkZWQgd2hlbiB3ZSBoYXZlIGEgaG9zdD09dGFyZ2V0IGNvbmZpZ3VyYXRpb24uICBGb3IgY3Jvc3MKLSMgdG9vbGNoYWlucywgd2UgYWRkIHNvbWUgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgb25seSBiZSB1c2VmdWwgaW4gYQotIyBjcm9zcy1jb21waWxlci4KLQotaXNfY3Jvc3NfY29tcGlsZXI9Ci0KLWlmIFsgeCIke2hvc3R9IiA9IHgiJHt0YXJnZXR9IiBdIDsgdGhlbgotCSMgd2hlbiBkb2luZyBhIG5hdGl2ZSB0b29sY2hhaW4sIGRvbid0IGJ1aWxkIHRoZSB0YXJnZXRzCi0JIyB0aGF0IGFyZSBpbiB0aGUgJ2Nyb3NzIG9ubHknIGxpc3QKLQlza2lwZGlycz0iJHtza2lwZGlyc30gJHtjcm9zc19vbmx5fSIKLQlpc19jcm9zc19jb21waWxlcj1ubwotZWxzZQotCSMgc2ltaWxhcmx5LCBkb24ndCBidWlsZCB0aGUgdGFyZ2V0cyBpbiB0aGUgJ25hdGl2ZSBvbmx5JyAKLQkjIGxpc3Qgd2hlbiBidWlsZGluZyBhIGNyb3NzIGNvbXBpbGVyCi0Jc2tpcGRpcnM9IiR7c2tpcGRpcnN9ICR7bmF0aXZlX29ubHl9IgotCWlzX2Nyb3NzX2NvbXBpbGVyPXllcwotZmkJCi0KLSMgV2UgYWx3YXlzIHdhbnQgdG8gdXNlIHRoZSBzYW1lIG5hbWUgZm9yIHRoaXMgZGlyZWN0b3J5LCBzbyB0aGF0IGRlamFnbnUKLSMgY2FuIHJlbGlhYmx5IGZpbmQgaXQuCi10YXJnZXRfc3ViZGlyPSR7dGFyZ2V0X2FsaWFzfQotCi1pZiBbICEgLWQgJHt0YXJnZXRfc3ViZGlyfSBdIDsgdGhlbgotICBpZiBta2RpciAke3RhcmdldF9zdWJkaXJ9IDsgdGhlbiB0cnVlCi0gIGVsc2UKLSAgICBlY2hvICInKioqIGNvdWxkIG5vdCBtYWtlICR7UFdEPWBwd2RgfS8ke3RhcmdldF9zdWJkaXJ9IiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi1maQotCi1jb3B5X2RpcnM9Ci0KLSMgSGFuZGxlIC0td2l0aC1oZWFkZXJzPVhYWC4gIFRoZSBjb250ZW50cyBvZiB0aGUgbmFtZWQgZGlyZWN0b3J5IGFyZQotIyBjb3BpZWQgdG8gJCh0b29sZGlyKS9zeXMtaW5jbHVkZS4KLWlmIFsgeCIke3dpdGhfaGVhZGVyc30iICE9IHggXTsgdGhlbgotICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSA9IHhubyBdOyB0aGVuCi0gICAgZWNobyAxPiYyICcqKionIC0td2l0aC1oZWFkZXJzIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gY3Jvc3MgY29tcGlsaW5nCi0gICAgZXhpdCAxCi0gIGZpCi0gIGNhc2UgIiR7ZXhlY19wcmVmaXhvcHRpb259IiBpbgotICAiIikgeD0ke3ByZWZpeH0gOzsKLSAgKikgeD0ke2V4ZWNfcHJlZml4fSA7OwotICBlc2FjCi0gIGNvcHlfZGlycz0iJHtjb3B5X2RpcnN9ICR7d2l0aF9oZWFkZXJzfSAkeC8ke3RhcmdldF9hbGlhc30vc3lzLWluY2x1ZGUiCi1maQotCi0jIEhhbmRsZSAtLXdpdGgtbGlicz1YWFguICBNdWx0aXBsZSBkaXJlY3RvcmllcyBhcmUgcGVybWl0dGVkLiAgVGhlCi0jIGNvbnRlbnRzIGFyZSBjb3BpZWQgdG8gJCh0b29sZGlyKS9saWIuCi1pZiBbIHgiJHt3aXRoX2xpYnN9IiAhPSB4IF07IHRoZW4KLSAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gPSB4bm8gXTsgdGhlbgotICAgIGVjaG8gMT4mMiAnKioqJyAtLXdpdGgtbGlicyBpcyBvbmx5IHN1cHBvcnRlZCB3aGVuIGNyb3NzIGNvbXBpbGluZwotICAgIGV4aXQgMQotICBmaQotICAjIENvcHkgdGhlIGxpYnJhcmllcyBpbiByZXZlcnNlIG9yZGVyLCBzbyB0aGF0IGZpbGVzIGluIHRoZSBmaXJzdCBuYW1lZAotICAjIGxpYnJhcnkgb3ZlcnJpZGUgZmlsZXMgaW4gc3Vic2VxdWVudCBsaWJyYXJpZXMuCi0gIGNhc2UgIiR7ZXhlY19wcmVmaXhvcHRpb259IiBpbgotICAiIikgeD0ke3ByZWZpeH0gOzsKLSAgKikgeD0ke2V4ZWNfcHJlZml4fSA7OwotICBlc2FjCi0gIGZvciBsIGluICR7d2l0aF9saWJzfTsgZG8KLSAgICBjb3B5X2RpcnM9IiRsICR4LyR7dGFyZ2V0X2FsaWFzfS9saWIgJHtjb3B5X2RpcnN9IgotICBkb25lCi1maQotCi0jIElmIGJvdGggLS13aXRoLWhlYWRlcnMgYW5kIC0td2l0aC1saWJzIGFyZSBzcGVjaWZpZWQsIGRlZmF1bHQgdG8KLSMgLS13aXRob3V0LW5ld2xpYi4KLWlmIFsgeCIke3dpdGhfaGVhZGVyc30iICE9IHggXSAmJiBbIHgiJHt3aXRoX2xpYnN9IiAhPSB4IF07IHRoZW4KLSAgaWYgWyB4IiR7d2l0aF9uZXdsaWJ9IiA9IHggXTsgdGhlbgotICAgIHdpdGhfbmV3bGliPW5vCi0gIGZpCi1maQotCi0jIFJlY29nbml6ZSAtLXdpdGgtbmV3bGliLy0td2l0aG91dC1uZXdsaWIuCi1pZiBbIHgke3dpdGhfbmV3bGlifSA9IHhubyBdOyB0aGVuCi0gIHNraXBkaXJzPSIke3NraXBkaXJzfSB0YXJnZXQtbmV3bGliIgotZWxpZiBbIHgke3dpdGhfbmV3bGlifSA9IHh5ZXMgXTsgdGhlbgotICBza2lwZGlycz1gZWNobyAiICR7c2tpcGRpcnN9ICIgfCBzZWQgLWUgJ3MvIHRhcmdldC1uZXdsaWIgLyAvJ2AKLWZpCi0KLSMgRGVmYXVsdCB0byB1c2luZyAtLXdpdGgtc3RhYnMgZm9yIGNlcnRhaW4gdGFyZ2V0cy4KLWlmIFsgeCR7d2l0aF9zdGFic30gPSB4IF07IHRoZW4KLSAgY2FzZSAiJHt0YXJnZXR9IiBpbgotICBtaXBzKi0qLWlyaXg2KikKLSAgICA7OwotICBtaXBzKi0qLSogfCBhbHBoYSotKi1vc2YqKQotICAgIHdpdGhfc3RhYnM9eWVzOwotICAgIHdpdGhvcHRpb25zPSIke3dpdGhvcHRpb25zfSAtLXdpdGgtc3RhYnMiCi0gICAgOzsKLSAgZXNhYwotZmkKLQotIyBIYW5kbGUgJHtjb3B5X2RpcnN9Ci1zZXQgZm5vcmQgJHtjb3B5X2RpcnN9Ci1zaGlmdAotd2hpbGUgWyAkIyAhPSAwIF07IGRvCi0gIGlmIFsgLWYgJDIvQ09QSUVEIF0gJiYgWyB4ImBjYXQgJDIvQ09QSUVEYCIgPSB4IiQxIiBdOyB0aGVuCi0gICAgOgotICBlbHNlCi0gICAgZWNobyBDb3B5aW5nICQxIHRvICQyCi0KLSAgICAjIFVzZSB0aGUgaW5zdGFsbCBzY3JpcHQgdG8gY3JlYXRlIHRoZSBkaXJlY3RvcnkgYW5kIGFsbCByZXF1aXJlZAotICAgICMgcGFyZW50IGRpcmVjdG9yaWVzLgotICAgIGlmIFsgLWQgJDIgXTsgdGhlbgotICAgICAgOgotICAgIGVsc2UKLSAgICAgIGVjaG8gPmNvbmZpZy50ZW1wCi0gICAgICAke3NyY2Rpcn0vaW5zdGFsbC1zaCAtYyAtbSA2NDQgY29uZmlnLnRlbXAgJDIvQ09QSUVECi0gICAgZmkKLQotICAgICMgQ29weSB0aGUgZGlyZWN0b3J5LCBhc3N1bWluZyB3ZSBoYXZlIHRhci4KLSAgICAjIEZJWE1FOiBTaG91bGQgd2UgdXNlIEIgaW4gdGhlIHNlY29uZCB0YXI/ICBOb3QgYWxsIHN5c3RlbXMgc3VwcG9ydCBpdC4KLSAgICAoY2QgJDE7IHRhciAtY2YgLSAuKSB8IChjZCAkMjsgdGFyIC14cGYgLSkKLQotICAgICMgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyIHRvIGNvcnJlY3RseSBhZGp1c3QgYWxsCi0gICAgIyBzeW1saW5rcy4gIElmIHNvbWVib2R5IGNhbiBmaWd1cmUgb3V0IGhvdyB0byBoYW5kbGUgdGhlbSBjb3JyZWN0bHkKLSAgICAjIGhlcmUsIGZlZWwgZnJlZSB0byBhZGQgdGhlIGNvZGUuCi0KLSAgICBlY2hvICQxID4gJDIvQ09QSUVECi0gIGZpCi0gIHNoaWZ0OyBzaGlmdAotZG9uZQotCi0jIENvbmZpZ3VyZSBleHRyYSBkaXJlY3RvcmllcyB3aGljaCBhcmUgaG9zdCBzcGVjaWZpYwotCi1jYXNlICIke2hvc3R9IiBpbgotCWlbMzQ1Nl04Ni0qLWdvMzIqKQotCSAgY29uZmlnZGlycz0iJGNvbmZpZ2RpcnMgZG9zcmVsIiA7OwotCWlbMzQ1Nl04Ni0qLW1pbmd3MzIqKQotCSAgY29uZmlnZGlycz0iJGNvbmZpZ2RpcnMgZG9zcmVsIiA7OwotCSotY3lnd2luKikKLQkgIGNvbmZpZ2RpcnM9IiRjb25maWdkaXJzIGxpYnRlcm1jYXAgZG9zcmVsIiA7OwotZXNhYwotCi0jIFJlbW92ZSBtb3JlIHByb2dyYW1zIGZyb20gY29uc2lkZXJhdGlvbiwgYmFzZWQgb24gdGhlIGhvc3Qgb3IgCi0jIHRhcmdldCB0aGlzIHVzdWFsbHkgbWVhbnMgdGhhdCBhIHBvcnQgb2YgdGhlIHByb2dyYW0gZG9lc24ndAotIyBleGlzdCB5ZXQuCi0KLW5vY29uZmlnZGlycz0iIgotCi1jYXNlICIke2hvc3R9IiBpbgotICBpWzM0NTZdODYtKi12c3RhKQotICAgIG5vY29uZmlnZGlycz0idGNsIGV4cGVjdCBkZWphZ251IG1ha2UgdGV4aW5mbyBiaXNvbiBwYXRjaCBmbGV4IGJ5YWNjIHNlbmQtcHIgZ3Byb2YgdXVkZWNvZGUgZGVqYWdudSBkaWZmIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IGdldHRleHQiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotZ28zMiogfCBpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKikKLSAgICBub2NvbmZpZ2RpcnM9InRjbCB0ayBleHBlY3QgZGVqYWdudSBtYWtlIHRleGluZm8gYmlzb24gcGF0Y2ggZmxleCBieWFjYyBzZW5kLXByIHV1ZGVjb2RlIGRlamFnbnUgZGlmZiBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiBnZXR0ZXh0IgotCTs7Ci0gIGlbMzQ1Nl04Ni0qLW1pbmd3MzIqKQotICAgICMgbm9jb25maWdkaXJzPSJ0Y2wgdGsgZXhwZWN0IGRlamFnbnUgbWFrZSB0ZXhpbmZvIGJpc29uIHBhdGNoIGZsZXggYnlhY2Mgc2VuZC1wciB1dWRlY29kZSBkZWphZ251IGRpZmYgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYiCi0gICAgIG5vY29uZmlnZGlycz0iZXhwZWN0IGRlamFnbnUgY3ZzIGF1dG9jb25mIGF1dG9tYWtlIHNlbmQtcHIgZ3Byb2YgcmNzIGd1aWxlIHBlcmwgdGV4aW5mbyBhcGFjaGUgaW5ldCBsaWJ0b29sIgotCTs7Ci0gIGlbMzQ1Nl04Ni0qLWJlb3MqKQotICAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGsgaXRjbCB0aXggbGliZ3VpIGdkYiIKLSAgICAgOzsKLSAgKi0qLWN5Z3dpbiopCi0gICAgIG5vY29uZmlnZGlycz0iYXV0b2NvbmYgYXV0b21ha2Ugc2VuZC1wciBncHJvZiByY3MgZ3VpbGUgcGVybCB0ZXhpbmZvIGFwYWNoZSBpbmV0IgotICAgIDs7Ci0gICotKi1uZXRic2QqKQotICAgIG5vY29uZmlnZGlycz0icmNzIgotICAgIDs7Ci0gIHBwYyotKi1wZSkKLSAgICAgbm9jb25maWdkaXJzPSJwYXRjaCBkaWZmIG1ha2UgdGsgdGNsIGV4cGVjdCBkZWphZ251IGN2c3NyYyBhdXRvY29uZiBhdXRvbWFrZSB0ZXhpbmZvIGJpc29uIHNlbmQtcHIgZ3Byb2YgcmNzIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IgotICAgIDs7Ci1lc2FjCi0KLQotY2FzZSAiJHt0YXJnZXR9IiBpbgotICAqLSotbmV0d2FyZSkKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmcrKyB0YXJnZXQtbGlic3RkYysrIHRhcmdldC1saWJyeCB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJpYmVydHkgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gICotKi1ydGVtcyopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICAqLSotdnh3b3JrcyopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFscGhhKi1kZWMtb3NmKikKLSAgICAjIGxkIHdvcmtzLCBidXQgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLiAgZW1hY3MgZG9lc24ndAotICAgICMgd29yay4gIG5ld2xpYiBpcyBub3QgNjQgYml0IHJlYWR5LiAgSSdtIG5vdCBzdXJlIGFib3V0IGZpbGV1dGlscy4KLSAgICAjIGdhcyBkb2Vzbid0IGdlbmVyYXRlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbi4KLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2FzIGxkIGVtYWNzIGZpbGV1dGlscyB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBhbHBoYSotKi0qdm1zKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIGxkIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFscGhhKi0qLWxpbnV4KikKLSAgICAjIG5ld2xpYiBpcyBub3QgNjQgYml0IHJlYWR5Ci0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgICMgbGludXggaGFzIHJ4IGluIGxpYmMKLSAgICBza2lwZGlycz0iJHNraXBkaXJzIHRhcmdldC1saWJyeCIKLSAgICA7OwotICBhbHBoYSotKi0qKQotICAgICMgbmV3bGliIGlzIG5vdCA2NCBiaXQgcmVhZHkKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgYXJjLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFybS0qLXBlKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFybS0qLWNvZmYqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIGFybS0qLWVsZiopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgYXJtLSotb2FiaSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBjNHgtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJyeCB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgdGh1bWItKi1jb2ZmKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSMgQ1lHTlVTIExPQ0FMIGNsbS9hcm0tZWxmCi0gIHRodW1iLSotZWxmKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgdGh1bWItKi1vYWJpKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSMgRU5EIENZR05VUyBMT0NBTAotIyBDWUdOVVMgTE9DQUwgbmlja2Mvc3Ryb25nYXJtCi0gIHN0cm9uZ2FybS0qLWVsZikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBzdHJvbmdhcm0tKi1jb2ZmKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0jIEVORCBDWUdOVVMgTE9DQUwKLSAgdGh1bWItKi1wZSkgIyBDWUdOVVMgTE9DQUwgbmlja2MvdGh1bWIKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFybS0qLXJpc2NpeCopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGxkIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBkMTB2LSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYnJ4IHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGliaW8iCi0gICAgOzsKLSMgQ1lHTlVTIExPQ0FMIGQzMHYKLSAgZDMwdi0qLSopCi0gICAgOzsKLSMgRU5EIENZR05VUyBMT0NBTAotIyBDWUdOVVMgTE9DQUwgZnIzMAotICBmcjMwLSotZWxmKikKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSMgRU5EIENZR05VUyBMT0NBTAotICBoODMwMCotKi0qIHwgXAotICBoODUwMC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGliaW8gdGFyZ2V0LWxpYnJ4IHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBocHBhKi0qLSplbGYqIHwgXAotICBocHBhKi0qLWxpdGVzKikKLSAgICAjIERvIGNvbmZpZ3VyZSBsZC9iaW51dGlscy9nYXMgZm9yIHRoaXMgY2FzZS4KLSAgICA7OwotICBocHBhKi0qLSopCi0gICAgIyBIUCdzIEMgY29tcGlsZXIgZG9lc24ndCBoYW5kbGUgRW1hY3MgY29ycmVjdGx5IChidXQgb24gQlNEIGFuZCBNYWNoCi0gICAgIyBjYyBpcyBnY2MsIGFuZCBvbiBhbnkgc3lzdGVtIGEgdXNlciBzaG91bGQgYmUgYWJsZSB0byBsaW5rIGNjIHRvCi0gICAgIyB3aGF0ZXZlciB0aGV5IHdhbnQuICBGSVhNRSwgZW1hY3MgZW1hY3MxOSkuCi0gICAgY2FzZSAiJHtDQ30iIGluCi0JIiIgfCBjYyopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBlbWFjcyBlbWFjczE5IiA7OwotICAgICAgICAqKSA7OwotICAgIGVzYWMKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgbGQgc2hlbGx1dGlscyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1jb2ZmIHwgaVszNDU2XTg2LSotZWxmKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotICAgICAgICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBpWzM0NTZdODYtKi1nbzMyKiB8IGlbMzQ1Nl0tKi1tc2Rvc2RqZ3BwKikKLSAgICAjIGJ1dCBkb24ndCBidWlsZCBnZGIKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGliaW8gdGFyZ2V0LWxpYnJ4IgotICAgIDs7Ci0gICotKi1saW51eCopCi0gICAgIyBsaW51eCBoYXMgcnggaW4gbGliYwotICAgIHNraXBkaXJzPSIkc2tpcGRpcnMgdGFyZ2V0LWxpYnJ4IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW1pbmd3MzIqKQotICAgIHRhcmdldF9jb25maWdkaXJzPSIkdGFyZ2V0X2NvbmZpZ2RpcnMgdGFyZ2V0LW1pbmd3IgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBleHBlY3QgdGFyZ2V0LWxpYmdsb3NzIgotCi0gICAgIyBDYW4ndCBidWlsZCBnZGIgZm9yIG1pbmd3MzIgaWYgbm90IG5hdGl2ZS4KLSAgICBjYXNlICIke2hvc3R9IiBpbgotICAgICAgaVszNDU2XTg2LSotbWluZ3czMikgOzsgIyBrZWVwIGdkYiB0Y2wgdGsgZXhwZWN0IGV0Yy4KLSAgICAgICopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgdGNsIHRrIGV4cGVjdCBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYiCi0gICAgICAgICA7OwotICAgIGVzYWMKLSAgICA7OyAgICAKLSAgKi0qLWN5Z3dpbiopCi0gICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR0YXJnZXRfY29uZmlnZGlycyB0YXJnZXQtbGlidGVybWNhcCB0YXJnZXQtd2luc3VwIgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgIyBhbHdheXMgYnVpbGQgbmV3bGliLgotICAgIHNraXBkaXJzPWBlY2hvICIgJHtza2lwZGlyc30gIiB8IHNlZCAtZSAncy8gdGFyZ2V0LW5ld2xpYiAvIC8nYAotCi0gICAgIyBDYW4ndCBidWlsZCBnZGIgZm9yIEN5Z3dpbiBpZiBub3QgbmF0aXZlLgotICAgIGNhc2UgIiR7aG9zdH0iIGluCi0gICAgICAqLSotY3lnd2luKikgOzsgIyBrZWVwIGdkYiB0Y2wgdGsgZXhwZWN0IGV0Yy4KLSAgICAgICopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgdGNsIHRrIGV4cGVjdCBpdGNsIHRpeCBsaWJndWkgZGIgc25hdmlnYXRvciBnbnVzZXJ2IgotICAgICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsgICAgCi0gIGlbMzQ1Nl04Ni0qLXBlKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJyeCB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc2NvMy4ydjUqKQotICAgICMgVGhlIGxpbmtlciBkb2VzIG5vdCB5ZXQga25vdyBhYm91dCB3ZWFrIHN5bWJvbHMgaW4gQ09GRiwKLSAgICAjIGFuZCBpcyBub3QgY29uZmlndXJlZCB0byBoYW5kbGUgbWl4ZWQgRUxGIGFuZCBDT0ZGLgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc2NvKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXNvbGFyaXMyKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXN5c3Y0KikKLSAgICAjIFRoZSBTWVNWNCBDIGNvbXBpbGVyIGRvZXNuJ3QgaGFuZGxlIEVtYWNzIGNvcnJlY3RseQotICAgIGNhc2UgIiR7Q0N9IiBpbgotCSIiIHwgY2MqKSBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZW1hY3MgZW1hY3MxOSIgOzsKLSAgICAgICAgKikgOzsKLSAgICBlc2FjCi0gICAgIyBidXQgdGhhdCdzIG9rYXkgc2luY2UgZW1hY3MgZG9lc24ndCB3b3JrIGFueXdheQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBlbWFjcyBlbWFjczE5IHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1iZW9zKikKLSAgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICAgOzsKLSAgbTY4ay0qLWVsZiopCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIG02OGstKi1jb2ZmKikKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgbW4xMDIwMC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIgotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgbW4xMDMwMC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIgotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBwb3dlcnBjLSotYWl4KikKLSAgICAjIGNvcGllZCBmcm9tIHJzNjAwMC0qLSogZW50cnkKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YgY3Zzc3JjIHRhcmdldC1saWJnbG9zcyIKLSAgICAjIFRoaXMgaXMgbmVlZGVkIHVudGlsIGdjYyBhbmQgbGQgYXJlIGZpeGVkIHRvIHdvcmsgdG9nZXRoZXIuCi0gICAgdXNlX2dudV9sZD1ubwotICAgIDs7Ci0gIHBvd2VycGMqLSotd2lubnQqIHwgcG93ZXJwYyotKi1wZSogfCBwcGMqLSotcGUpCi0gICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR0YXJnZXRfY29uZmlnZGlycyB0YXJnZXQtd2luc3VwIgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgdGNsIHRrIG1ha2UgZXhwZWN0IHRhcmdldC1saWJnbG9zcyBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYiCi0gICAgIyBhbHdheXMgYnVpbGQgbmV3bGliLgotICAgIHNraXBkaXJzPWBlY2hvICIgJHtza2lwZGlyc30gIiB8IHNlZCAtZSAncy8gdGFyZ2V0LW5ld2xpYiAvIC8nYAotICAgIDs7Ci0gICAgIyBUaGlzIGlzIHRlbXBvcmFyeSB1bnRpbCB3ZSBjYW4gbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMKLSAgcG93ZXJwY2xlLSotc29sYXJpcyopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiBzaW0gbWFrZSB0Y2wgdGsgZXhwZWN0IGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiIKLSAgICA7OwotICBwb3dlcnBjLSotZWFiaSkKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgcnM2MDAwLSotbHlueG9zKikKLSAgICAjIFRoZSBDVlMgc2VydmVyIGNvZGUgZG9lc24ndCB3b3JrIG9uIHRoZSBSUy82MDAwCi0gICAgIyBOZXdsaWIgbWFrZXMgcHJvYmxlbXMgZm9yIGxpYmcrKyBpbiBjcm9zc2VzLgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbmV3bGliIGdwcm9mIGN2c3NyYyIKLSAgICA7OwotICByczYwMDAtKi1haXgqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBncHJvZiIKLSAgICAjIFRoaXMgaXMgbmVlZGVkIHVudGlsIGdjYyBhbmQgbGQgYXJlIGZpeGVkIHRvIHdvcmsgdG9nZXRoZXIuCi0gICAgdXNlX2dudV9sZD1ubwotICAgIDs7Ci0gIHJzNjAwMC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIgotICAgIDs7Ci0gIG02OGstYXBvbGxvLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGxkIGJpbnV0aWxzIGdwcm9mIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBtaXBzKi0qLWlyaXg1KikKLSAgICAjIFRoZSBHTlUgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcy4KLSAgICAjIGVtYWNzIGlzIGVtYWNzIDE4LCB3aGljaCBkb2VzIG5vdCB3b3JrIG9uIElyaXggNSAoZW1hY3MxOSBkb2VzIHdvcmspCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGxkIGdwcm9mIGVtYWNzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBtaXBzKi0qLWlyaXg2KikKLSAgICAjIFRoZSBHTlUgYXNzZW1ibGVyIGFuZCBsaW5rZXIgZG8gbm90IHN1cHBvcnQgSVJJWCA2LgotICAgICMgZW1hY3MgaXMgZW1hY3MgMTgsIHdoaWNoIGRvZXMgbm90IHdvcmsgb24gSXJpeCA1IChlbWFjczE5IGRvZXMgd29yaykKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgbGQgZ2FzIGdwcm9mIGVtYWNzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBtaXBzKi1kZWMtYnNkKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIG1pcHMqLSotYnNkKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIG1pcHN0eDM5LSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YiICAgIyBzYW1lIGFzIGdlbmVyaWMgbWlwcwotICAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICA7OwotICBtaXBzKi0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIgotICAgIDs7Ci0gIHJvbXAtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBiZmQgYmludXRpbHMgbGQgZ2FzIG9wY29kZXMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHNoLSotKikKLSAgICBjYXNlICIke2hvc3R9IiBpbgotICAgICAgaVszNDU2XTg2LSotdnN0YSkgOzsgIyBkb24ndCBhZGQgZ3Byb2YgYmFjayBpbgotICAgICAgaVszNDU2XTg2LSotZ28zMiopIDs7ICMgZG9uJ3QgYWRkIGdwcm9mIGJhY2sgaW4KLSAgICAgIGlbMzQ1Nl04Ni0qLW1zZG9zZGpncHAqKSA7OyAjIGRvbid0IGFkZCBncHJvZiBiYWNrIGluCi0gICAgICAqKSBza2lwZGlycz1gZWNobyAiICR7c2tpcGRpcnN9ICIgfCBzZWQgLWUgJ3MvIGdwcm9mIC8gLydgIDs7Ci0gICAgZXNhYwotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgc3BhcmMtKi1lbGYqKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgc3BhcmM2NC0qLWVsZiopCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBzcGFyY2xpdGUtKi0qKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBzcGFyYy0qLXN1bm9zNCopCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0gICAgICAgICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgZ2RidGVzdCB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICBlbHNlCi0gICAgICAgICAgIHVzZV9nbnVfbGQ9bm8KLSAgICBmaQotICAgIDs7Ci0gIHY4MTAtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBiZmQgYmludXRpbHMgZ2FzIGdjYyBnZGIgbGQgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyBvcGNvZGVzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICB2ODUwLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHY4NTBlLSotKikgIyBDWUdOVVMgTE9DQUwgdjg1MGUKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHY4NTBlYS0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OyAgICAgICAjIEVORCBDWUdOVVMgTE9DQUwKLSAgdmF4LSotdm1zKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBiZmQgYmludXRpbHMgZ2RiIGxkIHRhcmdldC1uZXdsaWIgb3Bjb2RlcyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgdmF4LSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgKi0qLWx5bnhvcyopCi0gICAgIyBOZXdsaWIgbWFrZXMgcHJvYmxlbXMgZm9yIGxpYmcrKyBpbiBjcm9zc2VzLgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OyAKLSAgKi0qLW1hY29zKiB8IFwKLSAgKi0qLW1wdyopCi0gICAgIyBNYWNzIHdhbnQgYSByZXNvdXJjZSBjb21waWxlci4KLSAgICBjb25maWdkaXJzPSIkY29uZmlnZGlycyBncmV6IgotICAgIDs7ICAgIAotZXNhYwotCi0jIElmIHdlIGFyZW4ndCBidWlsZGluZyBuZXdsaWIsIHRoZW4gZG9uJ3QgYnVpbGQgbGliZ2xvc3MsIHNpbmNlIGxpYmdsb3NzCi0jIGRlcGVuZHMgdXBvbiBzb21lIG5ld2xpYiBoZWFkZXIgZmlsZXMuCi1jYXNlICIke25vY29uZmlnZGlyc30iIGluCi0gICp0YXJnZXQtbGliZ2xvc3MqKSA7OwotICAqdGFyZ2V0LW5ld2xpYiopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiIDs7Ci1lc2FjCi0KLSMgTWFrZSBzdXJlIHdlIGRvbid0IGxldCBHTlUgbGQgYmUgYWRkZWQgaWYgd2UgZGlkbid0IHdhbnQgaXQuCi1pZiBbIHgkd2l0aF9nbnVfbGQgPSB4bm8gXTsgdGhlbgotICB1c2VfZ251X2xkPW5vCi0gIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCIKLWZpCi0KLSMgTWFrZSBzdXJlIHdlIGRvbid0IGxldCBHTlUgYXMgYmUgYWRkZWQgaWYgd2UgZGlkbid0IHdhbnQgaXQuCi1pZiBbIHgkd2l0aF9nbnVfYXMgPSB4bm8gXTsgdGhlbgotICB1c2VfZ251X2FzPW5vCi0gIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnYXMiCi1maQotCi0jIFJlbW92ZSB0aGUgZW50cmllcyBpbiAkc2tpcGRpcnMgYW5kICRub2NvbmZpZ2RpcnMgZnJvbSAkY29uZmlnZGlycyBhbmQKLSMgJHRhcmdldF9jb25maWdkaXJzLgotIyBJZiB3ZSBoYXZlIHRoZSBzb3VyY2UgZm9yICRub2NvbmZpZ2RpcnMgZW50cmllcywgYWRkIHRoZW0gdG8gJG5vdHN1cHAuCi0KLW5vdHN1cHA9IiIKLWZvciBkaXIgaW4gLiAkc2tpcGRpcnMgJG5vY29uZmlnZGlycyA7IGRvCi0gIGRpcm5hbWU9YGVjaG8gJGRpciB8IHNlZCAtZSBzL3RhcmdldC0vL2dgCi0gIGlmIFsgJGRpciAhPSAuIF0gICYmIGVjaG8gIiAke2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgY29uZmlnZGlycz1gZWNobyAiICR7Y29uZmlnZGlyc30gIiB8IHNlZCAtZSAicy8gJHtkaXJ9IC8gLyJgCi0gICAgaWYgWyAtciAkc3JjZGlyLyRkaXJuYW1lL2NvbmZpZ3VyZSBdIFwKLQl8fCBbIC1yICRzcmNkaXIvJGRpcm5hbWUvY29uZmlndXJlLmluIF07IHRoZW4KLSAgICAgIGlmIGVjaG8gIiAke3NraXBkaXJzfSAiIHwgZ3JlcCAiICR7ZGlyfSAiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCXRydWUKLSAgICAgIGVsc2UKLQlub3RzdXBwPSIkbm90c3VwcCAkZGlyIgotICAgICAgZmkKLSAgICBmaQotICBmaQotICBpZiBbICRkaXIgIT0gLiBdICAmJiBlY2hvICIgJHt0YXJnZXRfY29uZmlnZGlyc30gIiB8IGdyZXAgIiAke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICB0YXJnZXRfY29uZmlnZGlycz1gZWNobyAiICR7dGFyZ2V0X2NvbmZpZ2RpcnN9ICIgfCBzZWQgLWUgInMvICR7ZGlyfSAvIC8iYAotICAgIGlmIFsgLXIgJHNyY2Rpci8kZGlybmFtZS9jb25maWd1cmUgXSBcCi0JfHwgWyAtciAkc3JjZGlyLyRkaXJuYW1lL2NvbmZpZ3VyZS5pbiBdOyB0aGVuCi0gICAgICBpZiBlY2hvICIgJHtza2lwZGlyc30gIiB8IGdyZXAgIiAke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQl0cnVlCi0gICAgICBlbHNlCi0Jbm90c3VwcD0iJG5vdHN1cHAgJGRpciIKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLWRvbmUKLQotIyBTb21ldGltZXMgdGhlIHRvb2xzIGFyZSBkaXN0cmlidXRlZCB3aXRoIGxpYmliZXJ0eSBidXQgd2l0aCBubyBvdGhlcgotIyBsaWJyYXJpZXMuICBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gYnVpbGQgdGFyZ2V0LWxpYmliZXJ0eS4KLWlmIFsgLW4gIiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IiBdOyB0aGVuCi0gIG90aGVycz0KLSAgZm9yIGkgaW4gYGVjaG8gJHt0YXJnZXRfY29uZmlnZGlyc30gfCBzZWQgLWUgcy90YXJnZXQtLy9nYCA7IGRvCi0gICAgaWYgWyAiJGkiICE9ICJsaWJpYmVydHkiIF07IHRoZW4KLSAgICAgIGlmIFsgLXIgJHNyY2Rpci8kaS9jb25maWd1cmUgXSB8fCBbIC1yICRzcmNkaXIvJGkvY29uZmlndXJlLmluIF07IHRoZW4KLQlvdGhlcnM9eWVzOwotCWJyZWFrOwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIGlmIFsgLXogIiR7b3RoZXJzfSIgXTsgdGhlbgotICAgIHRhcmdldF9jb25maWdkaXJzPQotICBmaQotZmkKLQotIyBEZWNvbmZpZ3VyZSBhbGwgc3ViZGlyZWN0b3JpZXMsIGluIGNhc2Ugd2UgYXJlIGNoYW5naW5nIHRoZQotIyBjb25maWd1cmF0aW9uIGZyb20gb25lIHdoZXJlIGEgc3ViZGlyZWN0b3J5IGlzIHN1cHBvcnRlZCB0byBvbmUgd2hlcmUgaXQKLSMgaXMgbm90LgotaWYgWyAteiAiJHtub3JlY3Vyc2lvbn0iIF0gJiYgWyAtbiAiJHtjb25maWdkaXJzfSIgXTsgdGhlbgotICBmb3IgaSBpbiBgZWNobyAke2NvbmZpZ2RpcnN9IHwgc2VkIC1lIHMvdGFyZ2V0LS8vZ2AgOyBkbwotICAgIHJtIC1mICRpL01ha2VmaWxlCi0gIGRvbmUKLWZpCi1pZiBbIC16ICIke25vcmVjdXJzaW9ufSIgXSAmJiBbIC1uICIke3RhcmdldF9jb25maWdkaXJzfSIgXTsgdGhlbgotICBmb3IgaSBpbiBgZWNobyAke3RhcmdldF9jb25maWdkaXJzfSB8IHNlZCAtZSBzL3RhcmdldC0vL2dgIDsgZG8KLSAgICBybSAtZiAke3RhcmdldF9zdWJkaXJ9LyRpL01ha2VmaWxlCi0gIGRvbmUKLWZpCi0KLSMgUHJvZHVjZSBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhlIHN1YmRpcnMgd2UgY2FuJ3QgY29uZmlndXJlLgotIyBUaGlzIGlzbid0IGVzcGVjaWFsbHkgaW50ZXJlc3RpbmcgaW4gdGhlIEN5Z251cyB0cmVlLCBidXQgaW4gdGhlIGluZGl2aWR1YWwKLSMgRlNGIHJlbGVhc2VzLCBpdCdzIGltcG9ydGFudCB0byBsZXQgcGVvcGxlIGtub3cgd2hlbiB0aGVpciBtYWNoaW5lIGlzbid0Ci0jIHN1cHBvcnRlZCBieSB0aGUgb25lIG9yIHR3byBwcm9ncmFtcyBpbiBhIHBhY2thZ2UuCi0KLWlmIFsgLW4gIiR7bm90c3VwcH0iIF0gJiYgWyAteiAiJHtub3JlY3Vyc2lvbn0iIF07IHRoZW4KLSAgIyBJZiAkYXBwZGlycyBpcyBub24tZW1wdHksIGF0IGxlYXN0IG9uZSBvZiB0aG9zZSBkaXJlY3RvcmllcyBtdXN0IHN0aWxsCi0gICMgYmUgY29uZmlndXJlZCwgb3Igd2UgZXJyb3Igb3V0LiAgKEUuZy4sIGlmIHRoZSBnYXMgcmVsZWFzZSBzdXBwb3J0cyBhCi0gICMgc3BlY2lmaWVkIHRhcmdldCBpbiBzb21lIHN1YmRpcnMgYnV0IG5vdCB0aGUgZ2FzIHN1YmRpciwgd2Ugc2hvdWxkbid0Ci0gICMgcHJldGVuZCB0aGF0IGFsbCBpcyB3ZWxsLikKLSAgaWYgWyAtbiAiJGFwcGRpcnMiIF07IHRoZW4KLSAgICBmb3IgZGlyIGluICRhcHBkaXJzIDsgZG8KLSAgICAgIGlmIFsgLXIgJGRpci9NYWtlZmlsZS5pbiBdOyB0aGVuCi0JaWYgZWNobyAiICR7Y29uZmlnZGlyc30gIiB8IGdyZXAgIiAke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIGFwcGRpcnM9IiIKLQkgIGJyZWFrCi0JZmkKLQlpZiBlY2hvICIgJHt0YXJnZXRfY29uZmlnZGlyc30gIiB8IGdyZXAgIiAke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIGFwcGRpcnM9IiIKLQkgIGJyZWFrCi0JZmkKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIGlmIFsgLW4gIiRhcHBkaXJzIiBdOyB0aGVuCi0gICAgICBlY2hvICIqKiogVGhpcyBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwYWNrYWdlLiIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLSAgZmkKLSAgIyBPa2F5LCBzb21lIGFwcGxpY2F0aW9uIHdpbGwgYnVpbGQsIG9yIHdlIGRvbid0IGNhcmUgdG8gY2hlY2suICBTdGlsbAotICAjIG5vdGlmeSBvZiBzdWJkaXJzIG5vdCBnZXR0aW5nIGJ1aWx0LgotICBlY2hvICIqKiogVGhpcyBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGZvbGxvd2luZyBzdWJkaXJlY3RvcmllczoiIDE+JjIKLSAgZWNobyAiICAgICR7bm90c3VwcH0iIDE+JjIKLSAgZWNobyAiICAgIChBbnkgb3RoZXIgZGlyZWN0b3JpZXMgc2hvdWxkIHN0aWxsIHdvcmsgZmluZS4pIiAxPiYyCi1maQotCi0jIFNldCB3aXRoX2dudV9hcyBhbmQgd2l0aF9nbnVfbGQgYXMgYXBwcm9wcmlhdGUuCi0jCi0jIFRoaXMgaXMgZG9uZSBieSBkZXRlcm1pbmluZyB3aGV0aGVyIG9yIG5vdCB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5Ci0jIGlzIGF2YWlsYWJsZSwgYW5kIGJ5IGNoZWNraW5nIHdoZXRoZXIgb3Igbm90IHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zCi0jIGhhdmUgcmVxdWVzdGVkIHRoYXQgdGhpcyBtYWdpYyBub3QgaGFwcGVuLgotIyAKLSMgVGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIGFsd2F5cyBvdmVycmlkZSB0aGUgZXhwbGljaXQgc2V0dGluZ3MgaW4gCi0jIGNvbmZpZ3VyZS5pbiwgYW5kIHRoZSBzZXR0aW5ncyBpbiBjb25maWd1cmUuaW4gb3ZlcnJpZGUgdGhpcyBtYWdpYy4KLSMKLSMgSWYgdGhlIGRlZmF1bHQgZm9yIGEgdG9vbGNoYWluIGlzIHRvIHVzZSBHTlUgYXMgYW5kIGxkLCBhbmQgeW91IGRvbid0IAotIyB3YW50IHRvIGRvIHRoYXQsIHRoZW4geW91IHNob3VsZCB1c2UgdGhlIC0td2l0aG91dC1nbnUtYXMgYW5kCi0jIC0td2l0aG91dC1nbnUtbGQgb3B0aW9ucyBmb3IgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLWlmIFsgeCR7dXNlX2dudV9hc30gPSB4IF0gOyB0aGVuCi0gIGlmIFsgeCR7d2l0aF9nbnVfYXN9ICE9IHhubyBdICYmIGVjaG8gIiAke2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgJHtnYXNkaXJ9ICIgPiAvZGV2L251bGwgMj4mMSAmJiBbIC1kICR7c3JjZGlyfS8ke2dhc2Rpcn0gXSA7IHRoZW4KLSAgICB3aXRoX2dudV9hcz15ZXMKLSAgICB3aXRob3B0aW9ucz0iJHdpdGhvcHRpb25zIC0td2l0aC1nbnUtYXMiCi0gIGZpCi1maQotCi1pZiBbIHgke3VzZV9nbnVfbGR9ID0geCBdIDsgdGhlbgotICBpZiBbIHgke3dpdGhfZ251X2xkfSAhPSB4bm8gXSAmJiBlY2hvICIgJHtjb25maWdkaXJzfSAiIHwgZ3JlcCAiIGxkICIgPiAvZGV2L251bGwgMj4mMSAmJiBbIC1kICR7c3JjZGlyfS9sZCBdIDsgdGhlbgotICAgIHdpdGhfZ251X2xkPXllcwotICAgIHdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgLS13aXRoLWdudS1sZCIKLSAgZmkKLWZpCi0KLSMgSWYgdXNpbmcgbmV3bGliLCBhZGQgLS13aXRoLW5ld2xpYiB0byB0aGUgd2l0aG9wdGlvbnMgc28gdGhhdCBnY2MvY29uZmlndXJlCi0jIGNhbiBkZXRlY3QgdGhpcyBjYXNlLgotCi1pZiBbIHgke3dpdGhfbmV3bGlifSAhPSB4bm8gXSAmJiBlY2hvICIgJHt0YXJnZXRfY29uZmlnZGlyc30gIiB8IGdyZXAgIiB0YXJnZXQtbmV3bGliICIgPiAvZGV2L251bGwgMj4mMSAmJiBbIC1kICR7c3JjZGlyfS9uZXdsaWIgXSA7IHRoZW4KLSAgd2l0aF9uZXdsaWI9eWVzCi0gIHdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgLS13aXRoLW5ld2xpYiIKLWZpCi0KLWlmIFsgeCR7c2hhcmVkfSA9IHh5ZXMgXTsgdGhlbgotICBjYXNlICIke3RhcmdldH0iIGluCi0gICAgaHBwYSopCi0gICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LXBhcGljIgotICAgICAgOzsKLSAgICBpWzM0NTZdODYtKikKLSAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQteDg2cGljIgotICAgICAgOzsKLSAgICBwb3dlcnBjKi0qKQotICAgICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1wcGNwaWMiCi0gICAgICA7OwotICAgIGFscGhhKi0qLWxpbnV4KikKLSAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtZWxmYWxwaGFwaWMiCi0gICAgICA7OwotICAgICopCi0gICAgICBpZiB0ZXN0IC1mICR7c3JjZGlyfS9jb25maWcvbXQtJHt0YXJnZXRfY3B1fXBpYzsgdGhlbgotICAgICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LSR7dGFyZ2V0X2NwdX1waWMiCi0gICAgICBmaQotICAgICAgOzsKLSAgZXNhYwotZmkKLQotcm0gLWYgbXQtZnJhZwotaWYgWyAtbiAiJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30iIF0gOyB0aGVuCi0gIGZvciBmIGluICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9Ci0gIGRvCi0gICAgY2F0ICR7c3JjZGlyfS8kZiA+PiBtdC1mcmFnCi0gIGRvbmUKLSAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9bXQtZnJhZwotZmkKLQotIyBwb3N0LXRhcmdldDoKLQotIyBNYWtlIHN1cmUgdGhhdCB0aGUgY29tcGlsZXIgaXMgYWJsZSB0byBnZW5lcmF0ZSBhbiBleGVjdXRhYmxlLiAgSWYgaXQKLSMgY2FuJ3QsIHdlIGFyZSBwcm9iYWJseSBpbiB0cm91YmxlLiAgV2UgZG9uJ3QgY2FyZSB3aGV0aGVyIHdlIGNhbiBydW4gdGhlCi0jIGV4ZWN1dGFibGUtLXdlIG1pZ2h0IGJlIHVzaW5nIGEgY3Jvc3MgY29tcGlsZXItLXdlIG9ubHkgY2FyZSB3aGV0aGVyIGl0Ci0jIGNhbiBiZSBjcmVhdGVkLiAgQXQgdGhpcyBwb2ludCB0aGUgbWFpbiBjb25maWd1cmUgc2NyaXB0IGhhcyBzZXQgQ0MuCi1lY2hvICJpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9IiA+IGNvbmZ0ZXN0LmMKLSR7Q0N9IC1vIGNvbmZ0ZXN0ICR7Q0ZMQUdTfSAke0NQUEZMQUdTfSAke0xERkxBR1N9IGNvbmZ0ZXN0LmMKLWlmIFsgJD8gPSAwIF0gJiYgWyAtcyBjb25mdGVzdCAtbyAtcyBjb25mdGVzdC5leGUgXTsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gMT4mMiAiKioqIFRoZSBjb21tYW5kICcke0NDfSAtbyBjb25mdGVzdCAke0NGTEFHU30gJHtDUFBGTEFHU30gJHtMREZMQUdTfSBjb25mdGVzdC5jJyBmYWlsZWQuIgotICBlY2hvIDE+JjIgIioqKiBZb3UgbXVzdCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIENDIHRvIGEgd29ya2luZyBjb21waWxlci4iCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBleGl0IDEKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotIyBUaGUgU29sYXJpcyAvdXNyL3VjYi9jYyBjb21waWxlciBkb2VzIG5vdCBhcHBlYXIgdG8gd29yay4KLWNhc2UgIiR7aG9zdH0iIGluCi0gIHNwYXJjLXN1bi1zb2xhcmlzMiopCi0gICAgICBDQ0JBU0U9ImBlY2hvICR7Q0MtY2N9IHwgc2VkICdzLyAuKiQvLydgIgotICAgICAgaWYgWyAiYC91c3IvYmluL3doaWNoICRDQ0JBU0VgIiA9ICIvdXNyL3VjYi9jYyIgXSA7IHRoZW4KLSAgICAgICAgICBjb3VsZF91c2U9Ci0gICAgICAgICAgWyAtZCAvb3B0L1NVTldzcHJvL2JpbiBdICYmIGNvdWxkX3VzZT0iL29wdC9TVU5Xc3Byby9iaW4iCi0gICAgICAgICAgaWYgWyAtZCAvb3B0L2N5Z251cy9iaW4gXSA7IHRoZW4KLSAgICAgICAgICAgICAgaWYgWyAiJGNvdWxkX3VzZSIgPSAiIiBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgY291bGRfdXNlPSIvb3B0L2N5Z251cy9iaW4iCi0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIGNvdWxkX3VzZT0iJGNvdWxkX3VzZSBvciAvb3B0L2N5Z251cy9iaW4iCi0gICAgICAgICAgICAgIGZpCi0gICAgICAgICAgZmkKLSAgICAgICAgaWYgWyAiJGNvdWxkX3VzZSIgPSAiIiBdIDsgdGhlbgotICAgICAgICAgICAgZWNobyAiV2FybmluZzogY29tcGlsYXRpb24gbWF5IGZhaWwgYmVjYXVzZSB5b3UncmUgdXNpbmciCi0gICAgICAgICAgICBlY2hvICIvdXNyL3VjYi9jYy4gIFlvdSBzaG91bGQgY2hhbmdlIHlvdXIgUEFUSCBvciBDQyAiCi0gICAgICAgICAgICBlY2hvICJ2YXJpYWJsZSBhbmQgcmVydW4gY29uZmlndXJlLiIKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZWNobyAiV2FybmluZzogY29tcGlsYXRpb24gbWF5IGZhaWwgYmVjYXVzZSB5b3UncmUgdXNpbmciCi0gICAgICAgICAgICBlY2hvICIvdXNyL3VjYi9jYywgd2hlbiB5b3Ugc2hvdWxkIHVzZSB0aGUgQyBjb21waWxlciBmcm9tIgotICAgICAgICAgICAgZWNobyAiJGNvdWxkX3VzZS4gIFlvdSBzaG91bGQgY2hhbmdlIHlvdXIiCi0gICAgICAgICAgICBlY2hvICJQQVRIIG9yIENDIHZhcmlhYmxlIGFuZCByZXJ1biBjb25maWd1cmUuIgotICAgICAgICBmaQotICAgICAgZmkKLSAgOzsKLWVzYWMKLQotIyBJZiAtLWVuYWJsZS1zaGFyZWQgd2FzIHNldCwgd2UgbXVzdCBzZXQgTERfTElCUkFSWV9QQVRIIHNvIHRoYXQgdGhlCi0jIGJpbnV0aWxzIHRvb2xzIHdpbGwgZmluZCBsaWJiZmQuc28uCi1pZiBbICIke3NoYXJlZH0iID0gInllcyIgXTsgdGhlbgotICBzZWQgLWUgJ3MvXlNFVF9MSUJfUEFUSFsgCV0qPS4qJC9TRVRfTElCX1BBVEggPSAkKFJFQUxMWV9TRVRfTElCX1BBVEgpLycgXAotICAgICAgTWFrZWZpbGUgPiBNYWtlZmlsZS50ZW0KLSAgcm0gLWYgTWFrZWZpbGUKLSAgbXYgLWYgTWFrZWZpbGUudGVtIE1ha2VmaWxlCi0KLSAgY2FzZSAiJHtob3N0fSIgaW4KLSAgKi0qLWhwdXgqKQotICAgIHNlZCAtZSAncy9eUlBBVEhfRU5WVkFSWyAJXSo9LiokL1JQQVRIX0VOVlZBUiA9IFNITElCX1BBVEgvJyBcCi0JTWFrZWZpbGUgPiBNYWtlZmlsZS50ZW0KLSAgICBybSAtZiBNYWtlZmlsZQotICAgIG12IC1mIE1ha2VmaWxlLnRlbSBNYWtlZmlsZQotICAgIDs7Ci0gIGVzYWMKLWZpCi0KLSMgUmVjb3JkIHRhcmdldF9jb25maWdkaXJzIGFuZCB0aGUgY29uZmlndXJlIGFyZ3VtZW50cyBpbiBNYWtlZmlsZS4KLXRhcmdldF9jb25maWdkaXJzPWBlY2hvICIke3RhcmdldF9jb25maWdkaXJzfSIgfCBzZWQgLWUgJ3MvdGFyZ2V0LS8vZydgCi10YXJnYXJncz1gZWNobyAiJHthcmd1bWVudHN9IiB8IFwKLQlzZWQgLWUgJ3MvLS1ub1teIAldKi8vJyBcCi0JICAgIC1lICdzLy0tY2FjaGVbYS16LV0qPVteIAldKi8vJyBcCi0JICAgIC1lICdzLy0taG9bYS16LV0qPVteIAldKi8vJyBcCi0JICAgIC1lICdzLy0tYnVbYS16LV0qPVteIAldKi8vJyBcCi0JICAgIC1lICdzLy0tdGFbYS16LV0qPVteIAldKi8vJ2AKLQotIyBQYXNzaW5nIGEgLS13aXRoLWNyb3NzLWhvc3QgYXJndW1lbnQgbGV0cyB0aGUgdGFyZ2V0IGxpYnJhcmllcyBrbm93Ci0jIHdoZXRoZXIgdGhleSBhcmUgYmVpbmcgYnVpbHQgd2l0aCBhIGNyb3NzLWNvbXBpbGVyIG9yIGJlaW5nIGJ1aWx0Ci0jIG5hdGl2ZS4gIEhvd2V2ZXIsIGl0IHdvdWxkIGJlIGJldHRlciB0byB1c2Ugb3RoZXIgbWVjaGFuaXNtcyB0byBtYWtlIHRoZQotIyBzb3J0cyBvZiBkZWNpc2lvbnMgdGhleSB3YW50IHRvIG1ha2Ugb24gdGhpcyBiYXNpcy4gIFBsZWFzZSBjb25zaWRlcgotIyB0aGlzIG9wdGlvbiB0byBiZSBkZXByZWNhdGVkLiAgRklYTUUuCi1pZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSA9IHh5ZXMgXTsgdGhlbgotICB0YXJnYXJncz0iLS13aXRoLWNyb3NzLWhvc3Q9JHtob3N0X2FsaWFzfSAke3RhcmdhcmdzfSIKLWZpCi0KLSMgRGVmYXVsdCB0byAtLWVuYWJsZS1tdWx0aWxpYi4KLWlmIFsgeCR7ZW5hYmxlX211bHRpbGlifSA9IHggXTsgdGhlbgotICB0YXJnYXJncz0iLS1lbmFibGUtbXVsdGlsaWIgJHt0YXJnYXJnc30iCi1maQotCi0jIFBhc3MgLS13aXRoLW5ld2xpYiBpZiBhcHByb3ByaWF0ZS4gIE5vdGUgdGhhdCB0YXJnZXRfY29uZmlnZGlycyBoYXMKLSMgY2hhbmdlZCBmcm9tIHRoZSBlYXJsaWVyIHNldHRpbmcgb2Ygd2l0aF9uZXdsaWIuCi1pZiBbIHgke3dpdGhfbmV3bGlifSAhPSB4bm8gXSAmJiBlY2hvICIgJHt0YXJnZXRfY29uZmlnZGlyc30gIiB8IGdyZXAgIiBuZXdsaWIgIiA+IC9kZXYvbnVsbCAyPiYxICYmIFsgLWQgJHtzcmNkaXJ9L25ld2xpYiBdIDsgdGhlbgotICB0YXJnYXJncz0iLS13aXRoLW5ld2xpYiAke3RhcmdhcmdzfSIKLWZpCi0KLSMgcHJvdmlkZSBhIHByb3BlciBneHhfaW5jbHVkZV9kaXIuCi0jIE5vdGUsIGlmIHlvdSBjaGFuZ2UgdGhlIGRlZmF1bHQsIG1ha2Ugc3VyZSB0byBmaXggYm90aCBoZXJlIGFuZCBpbgotIyB0aGUgZ2NjLCBsaWJpbywgbGlic3RkYysrIGFuZCBsaWJnKysgc3ViZGlyZWN0b3JpZXMuCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWd4eC1pbmNsdWRlLWRpciBvciAtLXdpdGhvdXQtZ3h4LWluY2x1ZGUtZGlyIHdhcyBnaXZlbi4KLWd4eF9pbmNsdWRlX2Rpcj0KLWlmIHRlc3QgLW4gIiR7d2l0aF9neHhfaW5jbHVkZV9kaXJ9IjsgdGhlbgotICBjYXNlICIke3dpdGhfZ3h4X2luY2x1ZGVfZGlyfSIgaW4KLSAgICB5ZXMgKQotICAgICAgZWNobyAiY29uZmlndXJlLmluOiBlcnJvcjogYmFkIHZhbHVlICR7d2l0aHZhbH0gZ2l2ZW4gZm9yIGcrKyBpbmNsdWRlIGRpcmVjdG9yeSIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgICA7OwotICAgIG5vICkKLSAgICAgIDs7Ci0gICAgKiApCi0gICAgICBneHhfaW5jbHVkZV9kaXI9JHt3aXRoX2d4eF9pbmNsdWRlX2Rpcn0KLSAgICAgIDs7Ci0gIGVzYWMKLWZpCi1pZiB0ZXN0IHgke2d4eF9pbmNsdWRlX2Rpcn0gPSB4OyB0aGVuCi0gIGlmIHRlc3QgeCR7ZW5hYmxlX3ZlcnNpb25fc3BlY2lmaWNfcnVudGltZV9saWJzfSA9IHh5ZXM7IHRoZW4KLSAgICBneHhfaW5jbHVkZV9kaXI9JyR7bGlic3ViZGlyfS9pbmNsdWRlL2crKycKLSAgZWxzZQotICAgIC4gJHt0b3BzcmNkaXJ9L2NvbmZpZy5pZgotICAgIGd4eF9pbmNsdWRlX2Rpcj0nJHtwcmVmaXh9L2luY2x1ZGUvZysrJy0ke2xpYnN0ZGN4eF9pbnRlcmZhY2V9Ci0gIGZpCi1lbHNlCi0gIGd4eF9pbmNsdWRlX2Rpcj0ke2d4eF9pbmNsdWRlX2Rpcn0KLWZpCi0KLXRhcmdhcmdzPSItLWhvc3Q9JHt0YXJnZXRfYWxpYXN9IC0tYnVpbGQ9JHtidWlsZF9hbGlhc30gJHt0YXJnYXJnc30iCi1zZWQgLWUgInM6XlRBUkdFVF9DT05GSUdESVJTWyAJXSo9LiokOlRBUkdFVF9DT05GSUdESVJTID0gJHt0YXJnZXRfY29uZmlnZGlyc306IiBcCi0gICAgLWUgInMlXkNPTkZJR19BUkdVTUVOVFNbIAldKj0uKiQlQ09ORklHX0FSR1VNRU5UUyA9ICR7dGFyZ2FyZ3N9JSIgXAotICAgIC1lICJzJV5UQVJHRVRfU1VCRElSWyAJXSo9LiokJVRBUkdFVF9TVUJESVIgPSAke3RhcmdldF9zdWJkaXJ9JSIgXAotICAgIC1lICJzJV5neHhfaW5jbHVkZV9kaXJbIAldKj0uKiQlZ3h4X2luY2x1ZGVfZGlyPSR7Z3h4X2luY2x1ZGVfZGlyfSUiIFwKLSAgICAgICBNYWtlZmlsZSA+IE1ha2VmaWxlLnRlbQotcm0gLWYgTWFrZWZpbGUKLW12IC1mIE1ha2VmaWxlLnRlbSBNYWtlZmlsZQotCi0jCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgZmlsbC1jb2x1bW46IDEzMQotIyBFbmQ6Ci0jCmRpZmYgLS1naXQgYS9ldGMvQ2hhbmdlTG9nIGIvZXRjL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1M2EzZS4uMDAwMDAwMAotLS0gYS9ldGMvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNTA3ICswLDAgQEAKLTE5OTktMDQtMDEgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogYWRkLWxvZy5lbCwgYWRkLWxvZy52aTogTmV3IGZpbGVzLgotCi1XZWQgSmFuIDIwIDAxOjMzOjUwIDE5OTkgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBjb21wLXRvb2xzLXZlcmlmeTogUmVtb3ZlIHNvbWUgY2hlY2tzIHRoYXQgYXJlIG5vIGxvbmdlciB2YWxpZC4KLQotMTk5OC0xMi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0ZG9jL2ZyMzAudGV4aTogTmV3IGRvY3VtZW50LgotCQotVGh1IE9jdCAgMSAyMToxNTo1OSAxOTk4ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogY29tcC10b29scy1maXgsIGNyb3NzLXRvb2xzLWZpeDogUmVwbGFjZSAvdXNyL2luY2x1ZGUKLQl3aXRoICR7RklYSU5DRElSfS4KLQotVHVlIEF1ZyAxMSAxOToyMjoxMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtYWtlLXJlbC1zeW0tdHJlZSAodmVyc2lvbik6IFVwZGF0ZSBjYWxjdWxhdGlvbi4KLQotRnJpIEp1biAxMiAyMTozNDowMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50ZXhpOiBWYXJpb3VzIGFkZGl0aW9ucy4KLQkqIE1ha2VmaWxlLmluIChURVhJMkhUTUwsIERWSVBTKTogTmV3IHZhcmlhYmxlcy4KLQkoc3RhbmRhcmRzLnBzKTogTmV3IHRhcmdldC4KLQkoY29uZmlndXJlLmR2aSk6IENvcHkgLnRpbiBmaWxlcyBpbiBhcyB3ZWxsLgotCShjb25maWd1cmUucHMsIGNvbmZpZ3VyZS5odG1sKTogTmV3IHRhcmdldHMuCi0JKGNsZWFuKTogUmVtb3ZlIGNvbmZpZ2Rldi5qcGcgYW5kIGNvbmZpZ2J1aWxkLmpwZy4KLQkqIGNvbmZpZ2Rldi5maWc6IE5ldyBmaWxlLgotCSogY29uZmlnZGV2LmVpbjogTmV3IGZpbGUgKEVQUyB2ZXJzaW9uIG9mIGNvbmZpZ2Rldi5maWcpLgotCSogY29uZmlnZGV2LmppbjogTmV3IGZpbGUgKEpQRUcgdmVyc2lvbiBvZiBjb25maWdkZXYuZmlnKS4KLQkqIGNvbmZpZ2J1aWxkLmZpZzogTmV3IGZpbGUuCi0JKiBjb25maWdidWlsZC5laW46IE5ldyBmaWxlIChFUFMgdmVyc2lvbiBvZiBjb25maWdidWlsZC5maWcpLgotCSogY29uZmlnYnVpbGQuamluOiBOZXcgZmlsZSAoSlBFRyB2ZXJzaW9uIG9mIGNvbmZpZ2J1aWxkLmZpZykuCi0KLVdlZCBKdW4gMTAgMTQ6NDE6MjUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGV4aTogTmV3IGZpbGUuCi0JKiBjb25maWdkZXYudGluOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ2J1aWxkLnRpbjogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoTUFLRUlORk8pOiBVc2UgbWFrZWluZm8gZnJvbSB0ZXhpbmZvIGRpcmVjdG9yeSBpZgotCWl0IGV4aXN0cy4KLQkoVEVYSTJEVkkpOiBMaWtld2lzZSBmb3IgdGV4aTJkdmkuCi0JKElORk9GSUxFUyk6IEFkZCBjb25maWd1cmUuaW5mby4KLQkoRFZJRklMRVMpOiBBZGQgY29uZmlndXJlLmR2aS4KLQkoaW5mbyk6IE9ubHkgYnVpbGQgaW5mbyBmaWxlcyBpZiB0aGUgc291cmNlIGZpbGVzIGV4aXN0LgotCShpbnN0YWxsLWluZm8pOiBPbmx5IGluc3RhbGwgaW5mbyBmaWxlcyBpZiB0aGV5IGV4aXN0LgotCShkdmkpOiBPbmx5IGJ1aWxkIERWSSBmaWxlcyBpZiB0aGUgc291cmNlcyBmaWxlcyBleGlzdC4KLQkoY29uZmlndXJlLmluZm8pOiBOZXcgdGFyZ2V0LgotCShjb25maWd1cmUuZHZpKTogTmV3IHRhcmdldC4KLQkoY2xlYW4pOiBSZW1vdmUgY29uZmlnZGV2IGFuZCBjb25maWdidWlsZCBkZXJpdmVkIGZpbGVzLgotCi0JUmVtb3ZlIG9ic29sZXRlIGRvY3VtZW50YXRpb24uCi0JKiBpbnRyby50ZXhpOiBSZW1vdmUuCi0JKiBpbnN0YWxsLnRleGk6IFJlbW92ZS4KLQkqIGNvbmZpZy1uYW1lcy50ZXhpOiBSZW1vdmUuCi0JKiBzY3JlZW4xLmVwczogUmVtb3ZlLgotCSogc2NyZWVuMS5vYmo6IFJlbW92ZS4KLQkqIHNjcmVlbjIuZXBzOiBSZW1vdmUuCi0JKiBzY3JlZW4yLm9iajogUmVtb3ZlLgotCSogTWFrZWZpbGUuaW46IFJlbW92ZSByZWZlcmVuY2VzIHRvIHRoZSBhYm92ZS4KLQotVGh1IE1heSAyMSAxNDozNDo1MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB0YXJnZXRkb2MvYXJtLWludGVyd29yay50ZXhpOiBBZGQgbm90ZSBhYm91dCBpZ25vcmluZyBsaW5rZXIKLQl3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB1c2luZyAtLXN1cHBvcnQtb2xkLWNvZGUuCi0KLU1vbiBNYXkgMTggMTQ6Mjc6MzcgMTk5OCAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW4sIGNvbXAtdG9vbHMtZml4LCBjb21wLXRvb2xzLXZlcmlmeSwgY3Jvc3MtdG9vbHMtZml4OgotCVVzZSAkR0NDdm4gcmF0aGVyIHRoYW4gc3Vic3RpdHV0ZSBldmVyeXdoZXJlLgotCi1UaHUgTWF5IDE0IDE0OjQzOjEwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldGRvYy9hcm0taW50ZXJ3b3JrLnRleGk6IERvY3VtZW50IGRsbHRvb2wgc3VwcG9ydCBvZgotCWludGVyd29ya2luZy4gCi0KLVRodSBNYXkgIDcgMTY6NDk6MzggMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IFJlbW92ZSByZWZlcmVuY2VzIHRvIFRDTF9MSUJSQVJZLCBUS19MSUJSQVJZLAotCWFuZCBHREJUS19GSUxFTkFNRS4KLQotV2VkIEFwciAgMSAxNzoxMTo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB0YXJnZXRkb2MvYXJtLWludGVyd29yay50ZXhpOiBEb2N1bWVudCBBUk0vdGh1bWIgaW50ZXJ3b3JraW5nLiAKLQotVHVlIE1hciAzMSAxNToyODoyMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YW5kYXJkcy50ZXhpLCBtYWtlLXN0ZHMudGV4aTogVXBkYXRlIHRvIGN1cnJlbnQgRlNGIHZlcnNpb25zLgotCSogTWFrZWZpbGUuaW4gKHN0YW5kYXJkcy5pbmZvKTogRGVwZW5kIHVwb24gbWFrZS1zdGQudGV4aS4KLQotVHVlIE1hciAyNCAxNjoxMzoyNiAxOTk4ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBiaHVuYS5jeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZ3VyZTogIFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjEyLjEgdG8gZml4IHNoZWxsIGlzc3VlcwotCWZvciBOVCBuYXRpdmUgYnVpbGRzLiAKLQotTW9uIE1hciAgOSAxNjo0MTowNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtYWtlLXJlbC1zeW0tdHJlZSAoYmlucHJvZ3MpOiBBZGQgb2JqY29weS4KLQotVHVlIEZlYiAyNCAxODoxMTo1OCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtYWtlLXJlbC1zeW0tdHJlZTogYXMubmV3IC0+IGFzLW5ldywgbGQubmV3IC0+IGxkLW5ldwotCW5tLm5ldyAtPiBubS1uZXcuICBNYWtlIHN5bWxpbmtzIHRvIGNydCouby4KLQotRnJpIE5vdiAyMSAxMjo1NDo1OCAxOTk3ICBNYW5mcmVkIEhvbGxzdGVpbiA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCAtLW5vLXNwbGl0IGFyZ3VtZW50IHRvIGF2b2lkIGNyZWF0aW5nIGZpbGVzCi0Jd2l0aCBuYW1lcyBsb25nZXIgdGhhbiAxNCBjaGFyYWN0ZXJzLgotCi1UaHUgU2VwIDI1IDEzOjEzOjExIDE5OTcgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwZXJuLmN5Z251cy5jb20pCi0KLQkqIGludHJvLnRleGk6IEFkZCBjbG9zaW5nIGlmc2V0LgotCi1Nb24gU2VwICAxIDEwOjMxOjMyIDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiBNb3ZlIHNldHRpbmcgSE9TVCBhbmQgVEFSR0VUIHRvIHRoZSBiZWdpbm5pbmcKLQlvZiB0aGUgZmlsZSBmb3IgZWRpdGluZyBjb252ZW5pZW5jZS4KLQotTW9uIFNlcCAgMSAxMDoyODozNyAxOTk3ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbi46IE1vcmUgZnJpZW5kbHkgb3B0aW9ucy9tZXNzYWdlcyB3aGVuIGV4dHJhY3RpbmcKLQlmcm9tIGEgZmlsZSBpbnN0ZWFkIG9mIGEgdGFwZSBkZXZpY2UuCi0KLVR1ZSBKdW4gMTcgMTU6NTA6MjMgMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IEFkZCAvdXNyL2JzZCB0byBQQVRIIGZvciBJcml4IChob21lIG9mIGNvbXByZXNzKQotCi1UaHUgSnVuIDEyIDEzOjQ3OjAwIDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0gICAgICAgICogSW5zdGFsbC5pbiAoc2hvd19leGVjX3ByZWZpeF9tc2cpOiBmaXggcXVvdGluZwotCi1XZWQgSnVuICA0IDE1OjMxOjQzIDE5OTcgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIHJlYnVpbGRpbmcudGV4aTogUmVtb3ZlZC4KLQotU2F0IE1heSAyNCAxODowMjoyMCAxOTk3ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogY3Jvc3MtdG9vbHMtZml4OiAgUmVtb3ZlIGhvc3QgY2hlY2sgc2luY2UgaXQgZG9lc24ndCBtYXR0ZXIKLQlmb3IgdGhpcyBjYXNlLgotCSogSW5zdGFsbC5pbiAoZ3Vlc3Nfc3lzdGVtKTogY2xlYW4gdXAgbW9yZSB1bnVzZWQgaG9zdHMuCi0JKiBJbnN0YWxsLmluLCBjcm9zcy10b29scy1maXgsIGNvbXAtdG9vbHMtZml4LCBjb21wLXRvb2xzLXZlcmlmeToKLQlIYWNrIGZvciBob3N0IGNoZWNrIHRvIG5vdCB3YXJuIHRoZSB1c2VyIGZvciBjZXJ0YWluIGNhc2VzLgotCi1GcmkgTWF5IDIzIDIzOjQ2OjEwIDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBzdWJzdC1zdHJpbmdzOiBSZW1vdmUgYSBsb3Qgb2YgdW51c2VkIGNvZGUKLQkqIEluc3RhbGwuaW46IFJlbW92ZSByZWZlcmVuY2UgdG8gVEFQRWRmbHQsIHVzZSB2YXJpYWJsZXMgaW5zdGVhZCBvZgotCXN0cmluZyBzdWJzdGl0dXRpb24gd2hlbiBhYmxlLgotCi1GcmkgQXByIDExIDE3OjI1OjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgZmlsZSBuYW1lZCBpbiBBQ19JTklUIHRvIE1ha2VmaWxlLmluLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgQXByIDExIDE4OjEyOjQyIDE5OTcgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIEluc3RhbGwuaW4gKGd1ZXNzX3N5c3RlbSk6IEJhY2sgb3V0IGNoYW5nZSB0byBJTlNUQUxMSE9TVCB0bwotCWNhbGwgYWxsIElSSVggc3lzdGVtcyAibWlwcy1zZ2ktaXJpeDQiCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgcmVmZXJlbmNlcyB0byBjb25maWd1cmUudGV4aSBhbmQgY2ZnLXBhcGVyLnRleGkuCi0KLVRodSBBcHIgMTAgMjM6MjY6NDUgMTk5NyAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogc3JjdHJlZS50ZXhpLCBlbWFjcy1yZWxub3Rlcy50ZXhpLCBjZmctcGFwZXIudGV4aTogUmVtb3ZlLgotCSogSW5zdGFsbC5pbjogUmVtb3ZlIFVsdHJpeC1zcGVjaWZpYyBoYWNrcy4KLQlVcGRhdGUgQ3lnbnVzIHBob25lIG51bWJlcnMuCi0JKGd1ZXNzX3N5c3RlbSk6IFJlbW92ZSBzb21lIG9sZCBzeXN0ZW1zIChVbHRyaXgsIE9TRjEgdjEgJiAyLAotCW02OGstSFBVWCwgbTY4ayBTdW5PUywgZXRjLikKLQkoc2hvd19nbnVfcm9vdF9tc2cpOiBSZW1vdmUuCi0JUmVtb3ZlZCBhbGwgdGhlIHJlbW92ZSBvcHRpb24gY29kZS4KLQotVGh1IEFwciAxMCAyMzoyMzozMyAxOTk3ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBjb25maWd1cmUubWFuLCBjb25maWd1cmUudGV4aTogUmVtb3RlLgotCi1Nb24gQXByICA3IDE4OjE1OjAwIDE5OTcgIEJyZW5kYW4gS2Vob2UgPGJyZW5kYW5AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIEZpeCB0aGUgdmVyc2lvbiBzdHJpbmcgZm9yIE9TRjEgNC4wIHRvIHJlY29nbml6ZSBlaXRoZXIKLSAgICAgICAgVjQuKiBvciBYNC4qCi0KLU1vbiBBcHIgIDcgMTU6MzQ6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFuZGFyZHMudGV4aSwgbWFrZS1zdGRzLnRleGk6IFVwZGF0ZSB0byBjdXJyZW50IEZTRiB2ZXJzaW9ucy4KLQotVHVlIE5vdiAxOSAxNTozNjoxNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtYWtlLXJlbC1zeW0tdHJlZTogTmV3IGZpbGUuCi0KLVdlZCBPY3QgMjMgMDA6MzQ6MDcgMTk5NiAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIExvdHMgb2YgcGF0Y2hlcyBmcm9tIHByb2dyZXNzaXZlLi4uCi0gCSogSW5zdGFsbC5pbjogcmVzdG9yZSBERE9QVFMgZm9yIEFJWCA0LngKLSAJKiBJbnN0YWxsLmluLCBzdWJzdC1zdHJpbmdzOiBhZGQgY2FzZSBmb3IgREcgQXZpaW9uCi0gCSogc3Vic3Qtc3RyaW5nczogZml4IHR5cG8gaW4gSU5TVEFMTGRpciB2YXIgc2V0dGluZwotIAkqIGNvbXAtdG9vbHMtdmVyaWZ5OiBzZXQgU0hMSUJfUEFUSCBmb3Igc2hhcmVkIGxpYnMKLSAJKiBJbnN0YWxsLmluLCBzdWJzdC1zdHJpbmdzOiAgYWRkIGNhc2UgZm9yIHNvbGFyaXMyLjUKLSAJKiBJbnN0YWxsLmluOiBmaXggcmVncmVzc2lvbiBmb3IgaHBwYTEuMSBjaGVjawotIAkqIGNvbXAtdG9vbHMtZml4OiBzZXQgTERfTElCUkFSWV9QQVRICi0gCSogY29tcC10b29scy1maXg6IElmIGZpeGluY2x1ZGVzIGZpeGVzIC91c3IvaW5jbHVkZS9saW1pdHMuaCwKLSAJaW5zdGFsbCBpdCBhcyBzeXNsaW1pdHMuaC4KLQotV2VkIE9jdCAxNiAxOToyMDo0MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIEluc3RhbGwuaW4gKGd1ZXNzX3N5c3RlbSk6IFRyZWF0IHBvd2VycGMtaWJtLWFpeDQuMSB0aGUgc2FtZSBhcwotCXJzNjAwMC1pYm0tYWl4NC4xLCBzaW5jZSB0aGUgY29tcGlsZXIgbm93IHVzZXMgY29tbW9uIG1vZGUgYnkKLQlkZWZhdWx0LgotCi1XZWQgT2N0ICAyIDE1OjM5OjA3IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJPR19JTlNUQUxMKTogQWRkZWQuCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5jYWNoZS4KLQotV2VkIE9jdCAgMiAxNDozMzo1OCAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBjb25maWd1cmUuaW46IFN3aXRjaCB0byBhdXRvY29uZiBjb25maWd1cmUuaW4uCi0JKiBjb25maWd1cmU6IE5ldy4KLQkqIE1ha2VmaWxlLmluOiBVc2UgYXV0b2NvbmYtc3Vic3RpdHV0ZWQgdmFsdWVzLgotCi1UdWUgSnVuIDI1IDE4OjU2OjA4IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChkYXRhZGlyKTogQ2hhbmdlZCB0byAkKHByZWZpeCkvc2hhcmUuCi0KLUZyaSBNYXIgMjkgMTE6Mzg6MDEgMTk5NiAgSi5ULiBDb25rbGluICAoanRjQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLm1hbjogQ2hhbmdlZCB0byBiZSByZWNvZ25pemVkIGJ5IGNhdG1hbiAtdyBvbiBTb2xhcmlzLgotCi1XZWQgRGVjICA2IDE1OjQwOjI4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbXAtdG9vbHMtZml4IChmaXhpbmNsdWRlcyk6IERlZmluZSBGSVhQUk9UT19ERUZJTkVTIGZyb20KLQkuLi4vaW5zdGFsbC10b29scy9maXhwcm90by1kZWZpbmVzLgotCi1TdW4gTm92IDEyIDE5OjMxOjI3IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb21wLXRvb2xzLXZlcmlmeSAodmVyaWZ5X2N4eF9pbml0aWFsaXplcnMpOiBkZWxldGUgYXJndiwKLQlhcmdjIGRlY2xhcmF0aW9ucywgYWRkIC1zdGF0aWMgdG8gY29tcGlsZSBsaW5lLgotCSh2ZXJpZnlfY3h4X2hlbGxvX3dvcmxkKTogZGVsZXRlIGFyZ3YsIGFyZ2MgZGVjbGFyYXRpb25zLCBhZGQKLQktc3RhdGljIHRvIGNvbXBpbGUgbGluZS4KLQotV2VkIFNlcCAyMCAxMzoyMTo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldCwgc3lub255bSBmb3IKLQlyZWFsY2xlYW4uCi0KLU1vbiBBdWcgMjggMTc6MjU6NDkgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW4gKFBBVEgpOiAgYWRkIC91c3IvdWNiIHRvICRQQVRIIChmb3IgU3VuT1MgNC4xLngpLgotCi1UdWUgQXVnIDE1IDIxOjUxOjU4IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluIChndWVzc19zeXN0ZW0pOiBNYXRjaCBPU0YvMSB2My54IGFzIHRoZSBzYW1lIGFzIAotICAgICAgICB2Mi54LS12Mi54IGJpbmFyaWVzIGFyZSB1cHdhcmQgY29tcGF0aWJsZS4KLQotVHVlIEF1ZyAxNSAyMTo0Njo1NCAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbiAoZ3Vlc3Nfc3lzdGVtKTogcmVjb2duaXplIEhQIDkwMDAvODAwIHN5c3RlbXMgYXMgdGhlCi0Jc2FtZSBhcyBIUCA5MDAwLzcwMCBzeXN0ZW1zLgotCi1UdWUgQXVnICA4IDEzOjExOjU2IDE5OTUgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogSW5zdGFsbC5pbjogRm9yIGVtYWNzLCBydW4gc2hvd19lbWFjc19hbHRlcm5hdGVfbXNnIGFuZCBleGl0LgotCShzaG93X2VtYWNzX2FsdGVybmF0ZV9tc2cpOiBOZXcgbWVzc2FnZSBzYXlpbmcgaG93IGVtYWNzIGNhbid0IGJlCi0JaW5zdGFsbGVkIGluIGFuIGFsdGVybmF0ZSBwcmVmaXguCi0KLVRodSBKdW4gIDggMDA6NDI6NTYgMTk5NSAgQW5nZWxhIE1hcmllIFRob21hcyAgPGFuZ2VsYUBjaXJkYW4uY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHN1YnN0LXN0cmluZ3M6IGNoYW5nZSBkdSBjb21tYW5kcyB0byAkQklORElSLy4gJiAkU1JDRElSLy4ganVzdAotICAgICAgICBpbiBjYXNlIHRoZXkgYXJlIHN5bWxpbmtzLgotCi1UdWUgQXByIDE4IDE0OjIzOjEwIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY2RrLWZpeDogRXh0cmFjdGVkIHRhYmxlIG9mIHRhcmdldHMgdGhhdCBkb24ndCBuZWVkIHRoZWlyCi0JICBoZWFkZXJzIGZpeGVkIGZyb20gZ2NjJ3MgY29uZmlndXJlIHNjcmlwdC4KLQotCSogY2RrLWZpeCwgY2RrLXZlcmlmeTogVXNlICR7SE9TVH0gaW5zdGVhZCBvZiB8fEhPU1RzdHJ8fAotCi0JKiBjZGstZml4LCBjZGstdmVyaWZ5OiBOZXcgZmlsZXMsIGluc3RhbGwgc2NyaXB0IGZyYWdtZW50cyB1c2VkCi0JICBmb3IgQ3lnbnVzIERldmVsb3BlcidzIEtpdC4KLQotCSogSW5zdGFsbC5pbiAoZG9fbWtkaXIpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIEluc3RhbGwuaW46IEFkZGVkIHN1cHBvcnQgZm9yIC0td2l0aCBhbmQgLS13aXRob3V0IG9wdGlvbnMuCi0JICBDaGFuZ2VkIHNvIHRoYXQgdGFwZSBjb21tYW5kcyBhcmUgbm90IHJ1biB3aGVuIGV4dHJhY3RpbmcgCi0JICBmcm9tIGEgZmlsZS4KLQkgIChkb19tdCk6IENoYW5nZWQgdG8gdGFrZSBvbmx5IG9uZSBhcmd1bWVudC4KLQotV2VkIE1hciAyOSAxMToxNjozOCAxOTk1ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiBjYXRjaCBVTkFNRT09YWxwaGEtZGVjLW9zZjIueCBhbmQgY29ycmVjdCBlbnRyeSBmb3IKLQlhbHBoYS1kZWMtb3NmMS54Ci0JCi1GcmkgSmFuIDI3IDEyOjA0OjI5IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc3Vic3Qtc3RyaW5ncyAobWlwcy1zZ2ktaXJpeDUpOiBOZXcgZW50cnkgaW4gdGFibGUuCi0KLVRodSBKYW4gMTkgMTI6MTU6NDQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBJbnN0YWxsLmluOiBNYWpvciByZXdyaXRlLCBidW5kbGUgZGVwZW5kZW50IGNvZGUgKGZvciBleGFtcGxlLAotCSAgZml4aW5jbHVkZXMgZm9yIGNvbXAtdG9vbHMpIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgSW5zdGFsbAotCSAgc2NyaXB0IHdoZW4gaXQgaXMgZ2VuZXJhdGVkLgotCi1UdWUgSmFuIDE3IDE2OjUxOjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogUmVidWlsZCB1c2luZyAkKFNIRUxMKS4KLQotVGh1IE5vdiAgMyAxOTozMDozMyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogRGVwZW5kIG9uIGluZm8uCi0KLUZyaSBBdWcgMTkgMTY6MTY6MzggMTk5NCAgSmFzb24gTW9sZW5kYSAgICAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IHNldCAkRklYX0hFQURFUiBzbyBmaXhwcm90byBjYW4gZmluZCBmaXgtaGVhZGVyLgotCi1GcmkgTWF5ICA2IDE2OjE4OjU4IDE5OTQgIEphc29uIE1vbGVuZGEgICAgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IGFkZCBhIHNlbWljb2xvbiBpbiB0aGUgaWYgc3RhdGVtZW50LgotCi1GcmkgQXByIDI5IDE2OjU2OjA3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY2ZnLXBhcGVyLnRleGk6IFVwZGF0ZSBzb21lIG91dGRhdGVkIGluZm9ybWF0aW9uLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogUGFzcyBmaWxlLCBub3QgZGlyZWN0b3J5LCBhcyBsYXN0Ci0JYXJnIHRvIElOU1RBTExfREFUQS4KLQkodW5pbnN0YWxsKTogTmV3IHRhcmdldC4KLQotVGh1IEFwciAyOCAxNDo0MjoyMiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS50ZXhpOiBDb21tZW50IG91dCBAc21hbGxib29rLgotCi0JKiBNYWtlZmlsZS5pbjogRGVmaW5lIFRFWEkyRFZJIGFuZCBURVhJRElSLCBhbmQgdXNlIHRoZSBsYXR0ZXIuCi0JUmVtb3ZlIGluZm8gZmlsZXMgaW4gcmVhbGNsZWFuLCBub3QgY2xlYW4sIHBlciBjb2Rpbmcgc3RhbmRhcmRzLgotCVJlbW92ZSBUZVggb3V0cHV0IGluIGNsZWFuLgotCi1UdWUgQXByIDI2IDE3OjE4OjAzIDE5OTQgIEphc29uIE1vbGVuZGEgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0gICAgICAgICogSW5zdGFsbC5pbjogIGZpeGluY2x1ZGVzIG91dHB1dCBpcyBhY3R1YWxseSBwdXQgaW4gZml4aW5jbHVkZXMubG9nLAotICAgICAgICBidXQgZWNobydlZCBtZXNzYWdlcyBjbGFpbSBpdCBpcyBmaXhpbmMubG9nLiAgVGhpcyBpcyB0aGUgc2FtZQotCW1lc3NhZ2VzIGFzIEkgbG9nZ2VkIGluIE1hcmNoIDQgMTk5NCwgYnV0IGZvciBzb21lIHJlYXNvbiB3ZSBmb3VuZAotCXRoZSBjaGFuZ2UgaGFkbid0IGJlZW4gZG9uZS4gIEknbGwgaGF2ZSB0byBkaWcgdGhyb3VnaCB0aGUgbG9ncwotCWFuZCBmaW5kIG91dCB3aGF0IEkgcmVhbGx5IGRpZCBkbyB0aGF0IGRheS4gOikKLQotTW9uIEFwciAyNSAyMDoyODoxOSAxOTk0ICBKYXNvbiBNb2xlbmRhICAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiAgdXNlIGV2YWwgdG8gY2FsbCBkb19tdCgpIGZvciBVbHRyaXggYnJva2VubmVzcy4KLQotTW9uIEFwciAyNSAyMDowMDowMCAxOTk0ICBKYXNvbiBNb2xlbmRhICAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluKGRvX210KTogZXhpdCB3aXRoIGVycm9yIHN0YXR1cyAxIGlmICMgb2YgcGFyYW1ldGVycwotCSE9IDMuCi0KLU1vbiBBcHIgMjUgMTk6NDI6MzYgMTk5NCAgSmFzb24gTW9sZW5kYSAgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogIGxvc2UgVEFQRV9GT1JXQVJEIGFuZCBUQVBFX1JFV0lORCwgYWRkIGRvX210KCkKLQl0byBkbyBhbGwgdGFwZSBtb3ZlbWVudCBvcGVyYXRpb25zLiAgQ3VycmVudGx5IHVudGVzdGVkLiAgQWRkcmVzc2VzCi0JUFIgIyA0ODg2IGZyb20gYnVsbC4KLQotCSogSW5zdGFsbC5pbjogYWRkIDE5OTQgdG8gdGhlIGNvcHlyaWdodCB0aGluZy4KLQotRnJpIEFwciAyMiAxOTowNToxMyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIHN0YW5kYXJkcy50ZXhpOiBVcGRhdGUgZnJvbSBGU0YuCi0KLUZyaSBBcHIgMjIgMTU6NDY6MTAgMTk5NCAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogQWRkICRERE9QVFMsIGhhcyBgYGJzPTEyNGInJyBmb3IgYWxsIHN5c3RlbXMgZXhjZXB0Ci0JQUlYIChzb21lIHZlcnNpb25zIG9mIEFJWCBkb24ndCB1bmRlcnN0YW5kIGJzPTEyNGIuICBTaWxseSBPUykuCi0KLU1vbiBBcHIgIDQgMjI6NTU6MDUgMTk5NCAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IG51bGwgb3V0ICRUT09MUyBiZWZvcmUgYWRkaW5nIHN0dWZmIHRvIGl0Ci0Jbm9uLWRlc3RydWN0aXZlbHkuCi0KLVdlZCBNYXIgMzAgMjE6NDU6MzUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzdGFuZGFyZHMudGV4aTogRml4IHR5cG8uCi0KLQkqIGNvbmZpZ3VyZS50ZXhpLCBjb25maWd1cmUubWFuOiBEb2N1bWVudCAtLWRpc2FibGUtLgotCi1Nb24gTWFyIDI4IDEzOjIyOjE1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogc3RhbmRhcmRzLnRleGk6IFVwZGF0ZSBmcm9tIEZTRi4KLQotU2F0IE1hciAyNiAwOToyMTo0NCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIHN0YW5kYXJkcy50ZXhpLCBtYWtlLXN0ZHMudGV4aTogVXBkYXRlIGZyb20gRlNGLgotCi1GcmkgTWFyIDI1IDIyOjU5OjQ1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLnRleGksIGNvbmZpZ3VyZS5tYW46IERvY3VtZW50IC0tZW5hYmxlLSogb3B0aW9ucy4KLQotV2VkIE1hciAyMyAyMzozODoyNCAxOTk0ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IHNldCBDUFAgdG8gYmUgZ2NjIC1FIGZvciBmaXhpbmNsdWRlcy4KLQotV2VkIE1hciAyMyAxMzo0Mjo0OCAxOTk0ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBJbnN0YWxsLmluOiBzZXQgUEFUSCB0byAkUEFUSDovYmluOi91c3IvYmluIHNvIHdlIGNhbiBwaWNrCi0gICAgICAgIHVwIG5hdGl2ZSB0b29scyBldmVuIGlmIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSB0aGVtIGluIGhpcwotICAgICAgICBwYXRoLgotCi0gICAgICAgICogSW5zdGFsbC5pbjogYGBocHBhLTEuMS1ocC1ocHV4JycgLT4gYGBocHBhMS4xLWhwLWhwdXgnJy4KLQotVHVlIE1hciAxNSAyMjowOToyMCAxOTk0ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0gICAgICAgIAotICAgICAgICAqIEluc3RhbGwuaW46IFRBUEVfUkVXSU5EIGFuZCBUQVBFX0ZPUldBUkQgdmFyaWFibGVzIGZvciBVbml4dW5hd2FyZSwKLSAgICAgICAgYWRkZWQgc3dpdGNoIHN0YXRlbWVudCB0byBkZXRlY3QgaWYgc3lzdGVtIGlzIFVuaXh1bmF3YXJlLgotCi1GcmkgTWFyICA0IDEyOjEwOjMwIDE5OTQgIEphc29uIE1vbGVuZGEgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0gICAgICAgICogSW5zdGFsbC5pbjogIGZpeGluY2x1ZGVzIG91dHB1dCBpcyBhY3R1YWxseSBwdXQgaW4gZml4aW5jbHVkZXMubG9nLAotICAgICAgICBidXQgZWNobydlZCBtZXNzYWdlcyBjbGFpbSBpdCBpcyBmaXhpbmMubG9nLgotCi1XZWQgTm92ICAzIDAyOjU4OjAyIDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzdWJzdC1zdHJpbmdzOiAgb3V0cHV0IFRFWEJVTkRMRSBmb3IgbW9yZSBpbnN0YWxsIG5vdGVzIG1hdGNoaW5nCi0JKiBpbnN0YWxsLXRleGkuaW46ICBQUk1TIGluZm8gbm93IGV4aXN0cwotCi1UdWUgT2N0IDI2IDE2OjU3OjEyIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogc3Vic3Qtc3RyaW5nczogbWF0Y2ggc29sYXJpcyouICBBbHNvLCBhZGQgZGVmYXVsdCBjYXNlIHRvIGNhdGNoCi0JICBhbmQgZXJyb3Igb3V0IGZvciB1bnJlY29nbml6ZWQgc3lzdGVtcy4KLQotVGh1IEF1ZyAxOSAxODoyMTozMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IGhhbmRsZSB0aGUgbmV3IGZpeHByb3RvIHdvcmsKLQotTW9uIEp1bCAxOSAxMjowNTo0MSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IHJlbW92ZSAiTVQ9dGN0bCIgZm9yIEFJWCAobm90IG5lZWRlZCwgYW5kIGJhcmVseQotCXdvcmtlZCBhbnl3YXkpCi0KLU1vbiBKdW4gMTQgMTk6MDk6MjIgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKLQotCSogc3Vic3Qtc3RyaW5nczogY2hhbmdlZCBIT1NUIHRvIHJlY29nbml6ZSBTb2xhcmlzIGZvciBpbnN0YWxsIG5vdGVzCi0KLVRodSBKdW4gMTAgMTY6MDE6MjUgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKLQotCSogZG9zLWluc3QudGV4aTogIG5ldyBmaWxlLgotCi1XZWQgSnVuICA5IDE5OjIzOjU5IDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QHJ0bC5jeWdudXMuY29tKQotCi0gICAgICAgICogaW5zdGFsbC10ZXhpLmluOiAgICAgICAgYWRkZWQgY29uZGl0aW9uYWxzIChuZWFybHkgY29tcGxldGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5lZCB1cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIHN1cHBvcnQgZm9yIG90aGVyIHJlbGVhc2VzIChub3QgZG9uZSkKLQotV2VkIEp1biAgOSAxNTo1Mzo1OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IFVzZSBJTlNUQUxMX0RBVEEuCi0JKHtkaXN0LHJlYWx9Y2xlYW4pOiBBbHNvIGRlbGV0ZSBNYWtlZmlsZSBhbmQgY29uZmlnLnN0YXR1cy4KLQotRnJpIEp1biAgNCAxNzowOTo1NiAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQotCi0JKiBzdWJzdC1zdHJpbmdzOiAgYWRkZWQgZGF0YSBmb3IgT1NfU1RSSU5HCi0KLQkqIHN1YnN0LXN0cmluZ3M6ICBhZGRlZCBzdXBwb3J0IGZvciBPU19TVFJJTkcKLQotVGh1IEp1biAgMyAwMDozNzowMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IHB1bGwgQ09QWUlORyBhbmQgQ09QWUlORy5MSUIgb2ZmIG9mIHRoZSB0YXBlIAotCi1UdWUgSnVuICAxIDE2OjUyOjA4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogc3Vic3Qtc3RyaW5nczogcmVwbGFjZSBSRUxFQVNFX0RJUiB0b28KLQotTW9uIE1hciAyMiAyMzo1NToyNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgaW5zdGFsbGNoZWNrIHRhcmdldAotCi1XZWQgTWFyIDE3IDAyOjIxOjE1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogZml4ICdzb3VyY2Ugb25seScgZXh0cmFjdGlvbiBidWcgd2hlcmUgaXQgbG9va2VkIGZvcgotCXRoZSBzcmMgZGlyIHVuZGVyIEgtPGhvc3Q+L3NyYyBpbnN0ZWFkIG9mIHNyYzsgYWxzbyByZW1vdmUgc3RyYXkKLQlyZWZlcmVuY2UgdG8gRU1BQ1NISUJJTgotCi1Nb24gTWFyIDE1IDAxOjI1OjQ1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogbWFrZS1zdGRzLnRleGk6IGFkZGVkICdpbnN0YWxsY2hlY2snIHRvIHRoZSBzdGFuZGFyZCB0YXJnZXRzCi0KLVR1ZSBNYXIgIDkgMTk6NDg6MjggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBzdGFuZGFyZHMudGV4aTogYWRkZWQgSU5GTy1ESVItRU5UUlksIHVwZGF0ZWQgdmVyc2lvbiBmcm9tIHRoZSBGU0YKLQotVHVlIEZlYiAgOSAxMjo0MDoyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzdGFuZGFyZHMuaW5mbyk6IEFkZGVkIC1JJChzcmNkaXIpIHRvIGZpbmQKLQltYWtlLXN0ZHMudGV4aS4KLQotTW9uIEZlYiAgMSAxNjozMjo1NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIHN0YW5kYXJkcy50ZXhpOiB1cGRhdGVkIHRvIGxhdGVzdCBGU0YgdmVyc2lvbiwgd2hpY2ggaW5jbHVkZXM6Ci0KLQkqIG1ha2Utc3Rkcy50ZXhpOiBuZXcgZmlsZQotCi1Nb24gTm92IDMwIDAxOjMxOjQwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogaW5zdGFsbC10ZXhpLmluLCByZWxub3Rlcy50ZXhpLCBpbnRyby50ZXhpOiBjaGFuZ2VkIEN5Z251cyBwaG9uZQotCW51bWJlcnMgZnJvbSB0aGUgb2xkIFBhbG8gQWx0byBvbmVzIHRvIHRoZSBuZXcgTXRuLiBWaWV3IG51bWJlcnMKLQotTW9uIE5vdiAxNiAxNjo1MDo0MyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmUgJChSTSkgdG8gInJtIC1mIgotCi1TdW4gT2N0IDExIDE2OjA1OjQ4IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogaW50cm8udGV4aTogYWRkZWQgSU5GTy1ESVItRU5UUlkKLQpkaWZmIC0tZ2l0IGEvZXRjL01ha2VmaWxlLmluIGIvZXRjL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWRjOGM5Li4wMDAwMDAwCi0tLSBhL2V0Yy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0jIAotIyBNYWtlZmlsZS5pbiBmb3IgZXRjCi0jCi0KLXByZWZpeCAJCT0gQHByZWZpeEAKLWV4ZWNfcHJlZml4IAk9IEBleGVjX3ByZWZpeEAKLQotc3JjZGlyICA9IEBzcmNkaXJACi1WUEFUSAk9IEBzcmNkaXJACi0KLWJpbmRpciAgPSBAYmluZGlyQAotbGliZGlyICA9IEBsaWJkaXJACi10b29sZGlyID0gJChsaWJkaXIpCi1kYXRhZGlyID0gQGRhdGFkaXJACi0KLW1hbmRpciAgPSBAbWFuZGlyQAotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1tYW4yZGlyID0gJChtYW5kaXIpL21hbjIKLW1hbjNkaXIgPSAkKG1hbmRpcikvbWFuMwotbWFuNGRpciA9ICQobWFuZGlyKS9tYW40Ci1tYW41ZGlyID0gJChtYW5kaXIpL21hbjUKLW1hbjZkaXIgPSAkKG1hbmRpcikvbWFuNgotbWFuN2RpciA9ICQobWFuZGlyKS9tYW43Ci1tYW44ZGlyID0gJChtYW5kaXIpL21hbjgKLW1hbjlkaXIgPSAkKG1hbmRpcikvbWFuOQotaW5mb2RpciA9IEBpbmZvZGlyQAotCi1TSEVMTCA9IC9iaW4vc2gKLQotSU5TVEFMTCAJPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACi1JTlNUQUxMX0RBVEEgICAgPSBASU5TVEFMTF9EQVRBQAotCi1NQUtFSU5GTyA9IGBpZiBbIC1mIC4uL3RleGluZm8vbWFrZWluZm8vbWFrZWluZm8gXTsgXAotCXRoZW4gZWNobyAuLi90ZXhpbmZvL21ha2VpbmZvL21ha2VpbmZvOyBcCi0JZWxzZSBlY2hvIG1ha2VpbmZvOyBmaWAKLVRFWEkyRFZJID0gYGlmIFsgLWYgLi4vdGV4aW5mby91dGlsL3RleGkyZHZpIF07IFwKLQl0aGVuIGVjaG8gLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyBcCi0JZWxzZSBlY2hvIHRleGkyZHZpOyBmaWAKLVRFWEkySFRNTCA9IHRleGkyaHRtbAotRFZJUFMgPSBkdmlwcwotCi0jIFdoZXJlIHRvIGZpbmQgdGV4aW5mby50ZXggdG8gZm9ybWF0IGRvY3VtZW50YXRpb24gd2l0aCBUZVguCi1URVhJRElSID0gJChzcmNkaXIpLy4uL3RleGluZm8KLQotIyMjIyBIb3N0LCB0YXJnZXQsIGFuZCBzaXRlIHNwZWNpZmljIE1ha2VmaWxlIGZyYWdtZW50cyBjb21lIGluIGhlcmUuCi0jIyMKLQotSU5GT0ZJTEVTID0gc3RhbmRhcmRzLmluZm8gY29uZmlndXJlLmluZm8KLURWSUZJTEVTID0gc3RhbmRhcmRzLmR2aSBjb25maWd1cmUuZHZpCi0KLWFsbDoKLQotaW5zdGFsbDoKLQotdW5pbnN0YWxsOgotCi1pbmZvOgotCWZvciBmIGluICQoSU5GT0ZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvYGVjaG8gJCRmIHwgc2VkIC1lICdzLy5pbmZvJCQvLnRleGkvJ2A7IHRoZW4gXAotCSAgICBpZiAkKE1BS0UpICJNQUtFSU5GTz0kKE1BS0VJTkZPKSIgJCRmOyB0aGVuIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGV4aXQgMTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlkb25lCi0KLWluc3RhbGwtaW5mbzogaW5mbwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9ta2luc3RhbGxkaXJzICQoaW5mb2RpcikKLQlpZiB0ZXN0ICEgLWYgc3RhbmRhcmRzLmluZm87IHRoZW4gY2QgJChzcmNkaXIpOyBmaTsgXAotCWlmIHRlc3QgLWYgc3RhbmRhcmRzLmluZm87IHRoZW4gXAotCSAgZm9yIGkgaW4gc3RhbmRhcmRzLmluZm8qOyBkbyBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGkgJChpbmZvZGlyKS8kJGk7IFwKLQkgIGRvbmU7IFwKLQlmaQotCWlmIHRlc3QgISAtZiBjb25maWd1cmUuaW5mbzsgdGhlbiBjZCAkKHNyY2Rpcik7IGZpOyBcCi0JaWYgdGVzdCAtZiBjb25maWd1cmUuaW5mbzsgdGhlbiBcCi0JICBmb3IgaSBpbiBjb25maWd1cmUuaW5mbyo7IGRvIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkaSAkKGluZm9kaXIpLyQkaTsgXAotCSAgZG9uZTsgXAotCWZpCi0KLWR2aToKLQlmb3IgZiBpbiAkKERWSUZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvYGVjaG8gJCRmIHwgc2VkIC1lICdzLy5kdmkkJC8udGV4aS8nYDsgdGhlbiBcCi0JICAgIGlmICQoTUFLRSkgIlRFWEkyRFZJPSQoVEVYSTJEVkkpIiAkJGY7IHRoZW4gXAotCSAgICAgIHRydWU7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgZXhpdCAxOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWRvbmUKLQotc3RhbmRhcmRzLmluZm86ICQoc3JjZGlyKS9zdGFuZGFyZHMudGV4aSAkKHNyY2RpcikvbWFrZS1zdGRzLnRleGkKLQkkKE1BS0VJTkZPKSAtLW5vLXNwbGl0IC1JJChzcmNkaXIpIC1vIHN0YW5kYXJkcy5pbmZvICQoc3JjZGlyKS9zdGFuZGFyZHMudGV4aQotCi1zdGFuZGFyZHMuZHZpOiAkKHNyY2Rpcikvc3RhbmRhcmRzLnRleGkKLQlURVhJTlBVVFM9JChURVhJRElSKTokJFRFWElOUFVUUyAkKFRFWEkyRFZJKSAkKHNyY2Rpcikvc3RhbmRhcmRzLnRleGkKLQotc3RhbmRhcmRzLnBzOiBzdGFuZGFyZHMuZHZpCi0JJChEVklQUykgc3RhbmRhcmRzLmR2aSAtbyBzdGFuZGFyZHMucHMKLQotIyBtYWtlaW5mbyByZXF1aXJlcyBpbWFnZXMgdG8gYmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotY29uZmlndXJlLmluZm86ICQoc3JjZGlyKS9jb25maWd1cmUudGV4aSAkKHNyY2RpcikvY29uZmlnZGV2LnRpbiAkKHNyY2RpcikvY29uZmlnYnVpbGQudGluCi0Jcm0gLWYgY29uZmlnZGV2LnR4dCBjb25maWdidWlsZC50eHQKLQljcCAkKHNyY2RpcikvY29uZmlnZGV2LnRpbiBjb25maWdkZXYudHh0Ci0JY3AgJChzcmNkaXIpL2NvbmZpZ2J1aWxkLnRpbiBjb25maWdidWlsZC50eHQKLQkkKE1BS0VJTkZPKSAtSSQoc3JjZGlyKSAtbyBjb25maWd1cmUuaW5mbyAkKHNyY2RpcikvY29uZmlndXJlLnRleGkKLQlybSAtZiBjb25maWdkZXYudHh0IGNvbmZpZ2J1aWxkLnR4dAotCi0jIHRleGkyZHZpIHdhbnRzIGJvdGggdGhlIC50eHQgYW5kIHRoZSAuZXBzIGZpbGVzLgotY29uZmlndXJlLmR2aTogJChzcmNkaXIpL2NvbmZpZ3VyZS50ZXhpICQoc3JjZGlyKS9jb25maWdkZXYudGluICQoc3JjZGlyKS9jb25maWdidWlsZC50aW4gJChzcmNkaXIpL2NvbmZpZ2Rldi5laW4gJChzcmNkaXIpL2NvbmZpZ2J1aWxkLmVpbgotCXJtIC1mIGNvbmZpZ2Rldi50eHQgY29uZmlnYnVpbGQudHh0Ci0JY3AgJChzcmNkaXIpL2NvbmZpZ2Rldi50aW4gY29uZmlnZGV2LnR4dAotCWNwICQoc3JjZGlyKS9jb25maWdidWlsZC50aW4gY29uZmlnYnVpbGQudHh0Ci0Jcm0gLWYgY29uZmlnZGV2LmVwcyBjb25maWdidWlsZC5lcHMKLQljcCAkKHNyY2RpcikvY29uZmlnZGV2LmVpbiBjb25maWdkZXYuZXBzCi0JY3AgJChzcmNkaXIpL2NvbmZpZ2J1aWxkLmVpbiBjb25maWdidWlsZC5lcHMKLQlURVhJTlBVVFM9JChURVhJRElSKTokJFRFWElOUFVUUyAkKFRFWEkyRFZJKSAkKHNyY2RpcikvY29uZmlndXJlLnRleGkKLQlybSAtZiBjb25maWdkZXYudHh0IGNvbmZpZ2J1aWxkLnR4dAotCXJtIC1mIGNvbmZpZ2Rldi5lcHMgY29uZmlnYnVpbGQuZXBzCi0KLSMgZHZpcHMgcmVxdWlyZXMgaW1hZ2VzIHRvIGJlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeQotY29uZmlndXJlLnBzOiBjb25maWd1cmUuZHZpICQoc3JjZGlyKS9jb25maWdkZXYuZWluICQoc3JjZGlyKS9jb25maWdidWlsZC5laW4KLQlybSAtZiBjb25maWdkZXYuZXBzIGNvbmZpZ2J1aWxkLmVwcwotCWNwICQoc3JjZGlyKS9jb25maWdkZXYuZWluIGNvbmZpZ2Rldi5lcHMKLQljcCAkKHNyY2RpcikvY29uZmlnYnVpbGQuZWluIGNvbmZpZ2J1aWxkLmVwcwotCSQoRFZJUFMpIGNvbmZpZ3VyZS5kdmkgLW8gY29uZmlndXJlLnBzCi0Jcm0gLWYgY29uZmlnZGV2LmVwcyBjb25maWdidWlsZC5lcHMKLQotY29uZmlndXJlLmh0bWw6ICQoc3JjZGlyKS9jb25maWd1cmUudGV4aQotCSQoVEVYSTJIVE1MKSAtc3BsaXRfY2hhcHRlciAkKHNyY2RpcikvY29uZmlndXJlLnRleGkKLQotY2xlYW46Ci0Jcm0gLWYgKi5hdXggKi5jcCAqLmNwcyAqLmR2aSAqLmZuICouZm5zICoua3kgKi5reXMgKi5sb2cKLQlybSAtZiAqLnBnICoucGdzICoudG9jICoudHAgKi50cHMgKi52ciAqLnZycwotCXJtIC1mIGNvbmZpZ2Rldi50eHQgY29uZmlnYnVpbGQudHh0IGNvbmZpZ2Rldi5lcHMgY29uZmlnYnVpbGQuZXBzCi0Jcm0gLWYgY29uZmlnZGV2LmpwZyBjb25maWdidWlsZC5qcGcKLQotbW9zdGx5Y2xlYW46IGNsZWFuCi0KLWRpc3RjbGVhbjogICBjbGVhbgotCXJtIC1mIE1ha2VmaWxlIGNvbmZpZy5zdGF0dXMgY29uZmlnLmNhY2hlCi0KLW1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuOiAgIGRpc3RjbGVhbgotCXJtIC1mICouaW5mbyoKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKGhvc3RfbWFrZWZpbGVfZnJhZykgJCh0YXJnZXRfbWFrZWZpbGVfZnJhZykKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIyMgdGhlc2UgbGFzdCB0YXJnZXRzIGFyZSBmb3Igc3RhbmRhcmRzLnRleGkgY29uZm9ybWFuY2UKLWRpc3Q6Ci1jaGVjazoKLWluc3RhbGxjaGVjazoKLVRBR1M6CmRpZmYgLS1naXQgYS9ldGMvYWRkLWxvZy5lbCBiL2V0Yy9hZGQtbG9nLmVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGM4OGU4Li4wMDAwMDAwCi0tLSBhL2V0Yy9hZGQtbG9nLmVsCisrKyAvZGV2L251bGwKQEAgLTEsNTczICswLDAgQEAKLTs7OyA9PT09PT09PT09PT0gTk9URSBXRUxMISA9PT09PT09PT09PT09Ci07OzsKLTs7OyBZb3Ugb25seSBuZWVkIHRvIHVzZSB0aGlzIGZpbGUgaWYgeW91J3JlIHVzaW5nIGEgdmVyc2lvbiBvZiBFbWFjcwotOzs7IHByaW9yIHRvIDIwLjEgdG8gd29yayBvbiBHREIuICBUaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcwotOzs7IGFuZCB0aGUgc3RhbmRhcmQgYWRkLWxvZy5lbCBwcm92aWRlZCB3aXRoIDE5LjM0IGlzIHRoYXQgaXQKLTs7OyBnZW5lcmF0ZXMgZGF0ZXMgdXNpbmcgdGhlIHRlcnNlciBmb3JtYXQgdXNlZCBieSBFbWFjcyAyMC4gIFRoaXMgaXMKLTs7OyB0aGUgZm9ybWF0IHJlY29tbWVuZGVkIGZvciB1c2UgaW4gR0RCIENoYW5nZUxvZ3MuCi07OzsKLTs7OyBUbyB1c2UgdGhpcyBjb2RlLCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIGRpcmVjdG9yeSBgfi9lbGlzcCcsIHNhdmUgdGhlIGNvZGUKLTs7OyBiZWxvdyBpbiBgfi9lbGlzcC9hZGQtbG9nLmVsJywgYW5kIHRoZW4gcHV0IHNvbWV0aGluZyBsaWtlIHRoaXMgaW4KLTs7OyB5b3VyIGB+Ly5lbWFjcycgZmlsZSwgdG8gdGVsbCBFbWFjcyB3aGVyZSB0byBmaW5kIGl0OgotOzs7IAotOzs7IChzZXRxIGxvYWQtcGF0aAotOzs7ICAgICAgIChjb25zIChleHBhbmQtZmlsZS1uYW1lICJ+L2VsaXNwIikKLTs7OyAgICAgICAgICAgICBsb2FkLXBhdGgpKQotOzs7IAotOzs7IElmIHlvdSB3YW50LCB5b3UgY2FuIGFsc28gYnl0ZS1jb21waWxlIGl0IC0tLSBpdCdsbCBydW4gYSBsaXR0bGUKLTs7OyBmYXN0ZXIsIGFuZCB1c2UgYSBsaXR0bGUgbGVzcyBtZW1vcnkuICAoTm90IHRoYXQgdGhvc2UgbWF0dGVyIG11Y2ggZm9yCi07OzsgdGhpcyBmaWxlLikgIFRvIGRvIHRoYXQsIGFmdGVyIHlvdSd2ZSBzYXZlZCB0aGUgdGV4dCBhcwotOzs7IH4vZWxpc3AvYWRkLWxvZy5lbCwgYnJpbmcgaXQgdXAgaW4gRW1hY3MsIGFuZCB0eXBlCi07OzsgCi07OzsgICAgIEMtdSBNLXggYnl0ZS1jb21waWxlLWZpbGUKLTs7OwotOzs7IC0tLSBKaW0gQmxhbmR5Ci0KLTs7OyBhZGQtbG9nLmVsIC0tLSBjaGFuZ2UgbG9nIG1haW50ZW5hbmNlIGNvbW1hbmRzIGZvciBFbWFjcwotCi07OyBDb3B5cmlnaHQgKEMpIDE5ODUsIDE5ODYsIDE5ODgsIDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLTs7IEtleXdvcmRzOiBtYWludAotCi07OyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgRW1hY3MuCi0KLTs7IEdOVSBFbWFjcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci07OyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotOzsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotOzsgYW55IGxhdGVyIHZlcnNpb24uCi0KLTs7IEdOVSBFbWFjcyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotOzsgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLTs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLTs7IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLTs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi07OyBhbG9uZyB3aXRoIEdOVSBFbWFjczsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQotOzsgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi07OyBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotOzs7IENvbW1lbnRhcnk6Ci0KLTs7IFRoaXMgZmFjaWxpdHkgaXMgZG9jdW1lbnRlZCBpbiB0aGUgRW1hY3MgTWFudWFsLgotCi07OzsgQ29kZToKLQotKGRlZnZhciBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZSBuaWwKLSAgIipOYW1lIG9mIGEgY2hhbmdlIGxvZyBmaWxlIGZvciBcXFthZGQtY2hhbmdlLWxvZy1lbnRyeV0uIikKLQotKGRlZnZhciBhZGQtbG9nLWN1cnJlbnQtZGVmdW4tZnVuY3Rpb24gbmlsCi0gICJcCi0qSWYgbm9uLW5pbCwgZnVuY3Rpb24gdG8gZ3Vlc3MgbmFtZSBvZiBjdXJyZW50IGZ1bmN0aW9uIGZyb20gc3Vycm91bmRpbmcgdGV4dC4KLVxcW2FkZC1jaGFuZ2UtbG9nLWVudHJ5XSBjYWxscyB0aGlzIGZ1bmN0aW9uIChpZiBuaWwsIGBhZGQtbG9nLWN1cnJlbnQtZGVmdW4nCi1pbnN0ZWFkKSB3aXRoIG5vIGFyZ3VtZW50cy4gIEl0IHJldHVybnMgYSBzdHJpbmcgb3IgbmlsIGlmIGl0IGNhbm5vdCBndWVzcy4iKQotCi07OzsjIyNhdXRvbG9hZAotKGRlZnZhciBhZGQtbG9nLWZ1bGwtbmFtZSBuaWwKLSAgIipGdWxsIG5hbWUgb2YgdXNlciwgZm9yIGluY2x1c2lvbiBpbiBDaGFuZ2VMb2cgZGFpbHkgaGVhZGVycy4KLVRoaXMgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBgdXNlci1mdWxsLW5hbWUnIGZ1bmN0aW9uLiIpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdmFyIGFkZC1sb2ctbWFpbGluZy1hZGRyZXNzIG5pbAotICAiKkVsZWN0cm9uaWMgbWFpbCBhZGRyZXNzIG9mIHVzZXIsIGZvciBpbmNsdXNpb24gaW4gQ2hhbmdlTG9nIGRhaWx5IGhlYWRlcnMuCi1UaGlzIGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiBgdXNlci1tYWlsLWFkZHJlc3MnLiIpCi0KLShkZWZ2YXIgY2hhbmdlLWxvZy1mb250LWxvY2sta2V5d29yZHMKLSAgJygoIl5bU01UV0ZdLisiIC4gZm9udC1sb2NrLWZ1bmN0aW9uLW5hbWUtZmFjZSkJOyBEYXRlIGxpbmUuCi0gICAgKCJeXHRcXCogXFwoW14gOlxuXStcXCkiIDEgZm9udC1sb2NrLWNvbW1lbnQtZmFjZSkJOyBGaWxlIG5hbWUuCi0gICAgKCIoXFwoW14pXG5dK1xcKSk6IiAxIGZvbnQtbG9jay1rZXl3b3JkLWZhY2UpKQk7IEZ1bmN0aW9uIG5hbWUuCi0gICJBZGRpdGlvbmFsIGV4cHJlc3Npb25zIHRvIGhpZ2hsaWdodCBpbiBDaGFuZ2UgTG9nIG1vZGUuIikKLQotKGRlZnZhciBjaGFuZ2UtbG9nLW1vZGUtbWFwIG5pbAotICAiS2V5bWFwIGZvciBDaGFuZ2UgTG9nIG1ham9yIG1vZGUuIikKLShpZiBjaGFuZ2UtbG9nLW1vZGUtbWFwCi0gICAgbmlsCi0gIChzZXRxIGNoYW5nZS1sb2ctbW9kZS1tYXAgKG1ha2Utc3BhcnNlLWtleW1hcCkpCi0gIChkZWZpbmUta2V5IGNoYW5nZS1sb2ctbW9kZS1tYXAgIlxNLXEiICdjaGFuZ2UtbG9nLWZpbGwtcGFyYWdyYXBoKSkKLQotKGRlZnVuIGNoYW5nZS1sb2ctbmFtZSAoKQotICAob3IgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUKLSAgICAgIChpZiAoZXEgc3lzdGVtLXR5cGUgJ3ZheC12bXMpIAotCSAgIiRDSEFOR0VfTE9HJC5UWFQiIAotCShpZiAob3IgKGVxIHN5c3RlbS10eXBlICdtcy1kb3MpIChlcSBzeXN0ZW0tdHlwZSAnd2luZG93cy1udCkpCi0JICAgICJjaGFuZ2VsbyIKLQkgICJDaGFuZ2VMb2ciKSkpKQotCi07OzsjIyNhdXRvbG9hZAotKGRlZnVuIHByb21wdC1mb3ItY2hhbmdlLWxvZy1uYW1lICgpCi0gICJQcm9tcHQgZm9yIGEgY2hhbmdlIGxvZyBuYW1lLiIKLSAgKGxldCogKChkZWZhdWx0IChjaGFuZ2UtbG9nLW5hbWUpKQotCSAobmFtZSAoZXhwYW5kLWZpbGUtbmFtZQotCQkocmVhZC1maWxlLW5hbWUgKGZvcm1hdCAiTG9nIGZpbGUgKGRlZmF1bHQgJXMpOiAiIGRlZmF1bHQpCi0JCQkJbmlsIGRlZmF1bHQpKSkpCi0gICAgOzsgSGFuZGxlIHNvbWV0aGluZyB0aGF0IGlzIHN5bnRhY3RpY2FsbHkgYSBkaXJlY3RvcnkgbmFtZS4KLSAgICA7OyBMb29rIGZvciBDaGFuZ2VMb2cgb3Igd2hhdGV2ZXIgaW4gdGhhdCBkaXJlY3RvcnkuCi0gICAgKGlmIChzdHJpbmc9IChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IG5hbWUpICIiKQotCShleHBhbmQtZmlsZS1uYW1lIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IGRlZmF1bHQpCi0JCQkgIG5hbWUpCi0gICAgICA7OyBIYW5kbGUgc3BlY2lmeWluZyBhIGZpbGUgdGhhdCBpcyBhIGRpcmVjdG9yeS4KLSAgICAgIChpZiAoZmlsZS1kaXJlY3RvcnktcCBuYW1lKQotCSAgKGV4cGFuZC1maWxlLW5hbWUgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgZGVmYXVsdCkKLQkJCSAgICAoZmlsZS1uYW1lLWFzLWRpcmVjdG9yeSBuYW1lKSkKLQluYW1lKSkpKQotCi07OzsjIyNhdXRvbG9hZAotKGRlZnVuIGZpbmQtY2hhbmdlLWxvZyAoJm9wdGlvbmFsIGZpbGUtbmFtZSkKLSAgIkZpbmQgYSBjaGFuZ2UgbG9nIGZpbGUgZm9yIFxcW2FkZC1jaGFuZ2UtbG9nLWVudHJ5XSBhbmQgcmV0dXJuIHRoZSBuYW1lLgotCi1PcHRpb25hbCBhcmcgRklMRS1OQU1FIHNwZWNpZmllcyB0aGUgZmlsZSB0byB1c2UuCi1JZiBGSUxFLU5BTUUgaXMgbmlsLCB1c2UgdGhlIHZhbHVlIG9mIGBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZScuCi1JZiAnY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUnIGlzIG5pbCwgYmVoYXZlIGFzIHRob3VnaCBpdCB3ZXJlICdDaGFuZ2VMb2cnCi1cKG9yIHdoYXRldmVyIHdlIHVzZSBvbiB0aGlzIG9wZXJhdGluZyBzeXN0ZW0pLgotCi1JZiAnY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUnIGNvbnRhaW5zIGEgbGVhZGluZyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuCi1zaW1wbHkgZmluZCBpdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBPdGhlcndpc2UsIHNlYXJjaCBpbiB0aGUgY3VycmVudCAKLWRpcmVjdG9yeSBhbmQgaXRzIHN1Y2Nlc3NpdmUgcGFyZW50cyBmb3IgYSBmaWxlIHNvIG5hbWVkLgotCi1PbmNlIGEgZmlsZSBpcyBmb3VuZCwgYGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lJyBpcyBzZXQgbG9jYWxseSBpbiB0aGUKLWN1cnJlbnQgYnVmZmVyIHRvIHRoZSBjb21wbGV0ZSBmaWxlIG5hbWUuIgotICA7OyBJZiB1c2VyIHNwZWNpZmllZCBhIGZpbGUgbmFtZSBvciBpZiB0aGlzIGJ1ZmZlciBrbm93cyB3aGljaCBvbmUgdG8gdXNlLAotICA7OyBqdXN0IHVzZSB0aGF0LgotICAob3IgZmlsZS1uYW1lCi0gICAgICAoc2V0cSBmaWxlLW5hbWUgKGFuZCBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZQotCQkJICAgKGZpbGUtbmFtZS1kaXJlY3RvcnkgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUpCi0JCQkgICBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZSkpCi0gICAgICAocHJvZ24KLQk7OyBDaGFzZSBsaW5rcyBpbiB0aGUgc291cmNlIGZpbGUKLQk7OyBhbmQgdXNlIHRoZSBjaGFuZ2UgbG9nIGluIHRoZSBkaXIgd2hlcmUgaXQgcG9pbnRzLgotCShzZXRxIGZpbGUtbmFtZSAob3IgKGFuZCBidWZmZXItZmlsZS1uYW1lCi0JCQkJIChmaWxlLW5hbWUtZGlyZWN0b3J5Ci0JCQkJICAoZmlsZS1jaGFzZS1saW5rcyBidWZmZXItZmlsZS1uYW1lKSkpCi0JCQkgICAgZGVmYXVsdC1kaXJlY3RvcnkpKQotCShpZiAoZmlsZS1kaXJlY3RvcnktcCBmaWxlLW5hbWUpCi0JICAgIChzZXRxIGZpbGUtbmFtZSAoZXhwYW5kLWZpbGUtbmFtZSAoY2hhbmdlLWxvZy1uYW1lKSBmaWxlLW5hbWUpKSkKLQk7OyBDaGFzZSBsaW5rcyBiZWZvcmUgdmlzaXRpbmcgdGhlIGZpbGUuCi0JOzsgVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8gdXNlIGEgc2luZ2xlIGNoYW5nZSBsb2cgZmlsZQotCTs7IGZvciBzZXZlcmFsIHJlbGF0ZWQgZGlyZWN0b3JpZXMuCi0JKHNldHEgZmlsZS1uYW1lIChmaWxlLWNoYXNlLWxpbmtzIGZpbGUtbmFtZSkpCi0JKHNldHEgZmlsZS1uYW1lIChleHBhbmQtZmlsZS1uYW1lIGZpbGUtbmFtZSkpCi0JOzsgTW92ZSB1cCBpbiB0aGUgZGlyIGhpZXJhcmNoeSB0aWxsIHdlIGZpbmQgYSBjaGFuZ2UgbG9nIGZpbGUuCi0JKGxldCAoKGZpbGUxIGZpbGUtbmFtZSkKLQkgICAgICBwYXJlbnQtZGlyKQotCSAgKHdoaWxlIChhbmQgKG5vdCAob3IgKGdldC1maWxlLWJ1ZmZlciBmaWxlMSkgKGZpbGUtZXhpc3RzLXAgZmlsZTEpKSkKLQkJICAgICAgKHByb2duIChzZXRxIHBhcmVudC1kaXIKLQkJCQkgICAoZmlsZS1uYW1lLWRpcmVjdG9yeQotCQkJCSAgICAoZGlyZWN0b3J5LWZpbGUtbmFtZQotCQkJCSAgICAgKGZpbGUtbmFtZS1kaXJlY3RvcnkgZmlsZTEpKSkpCi0JCQkgICAgIDs7IEdpdmUgdXAgaWYgd2UgYXJlIGFscmVhZHkgYXQgdGhlIHJvb3QgZGlyLgotCQkJICAgICAobm90IChzdHJpbmc9IChmaWxlLW5hbWUtZGlyZWN0b3J5IGZpbGUxKQotCQkJCQkgICBwYXJlbnQtZGlyKSkpKQotCSAgICA7OyBNb3ZlIHVwIHRvIHRoZSBwYXJlbnQgZGlyIGFuZCB0cnkgYWdhaW4uCi0JICAgIChzZXRxIGZpbGUxIChleHBhbmQtZmlsZS1uYW1lIAotCQkJIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IChjaGFuZ2UtbG9nLW5hbWUpKQotCQkJIHBhcmVudC1kaXIpKSkKLQkgIDs7IElmIHdlIGZvdW5kIGEgY2hhbmdlIGxvZyBpbiBhIHBhcmVudCwgdXNlIHRoYXQuCi0JICAoaWYgKG9yIChnZXQtZmlsZS1idWZmZXIgZmlsZTEpIChmaWxlLWV4aXN0cy1wIGZpbGUxKSkKLQkgICAgICAoc2V0cSBmaWxlLW5hbWUgZmlsZTEpKSkpKQotICA7OyBNYWtlIGEgbG9jYWwgdmFyaWFibGUgaW4gdGhpcyBidWZmZXIgc28gd2UgbmVlZG4ndCBzZWFyY2ggYWdhaW4uCi0gIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2NoYW5nZS1sb2ctZGVmYXVsdC1uYW1lKSBmaWxlLW5hbWUpCi0gIGZpbGUtbmFtZSkKLQotOzs7IyMjYXV0b2xvYWQKLShkZWZ1biBhZGQtY2hhbmdlLWxvZy1lbnRyeSAoJm9wdGlvbmFsIHdob2FtaSBmaWxlLW5hbWUgb3RoZXItd2luZG93IG5ldy1lbnRyeSkKLSAgIkZpbmQgY2hhbmdlIGxvZyBmaWxlIGFuZCBhZGQgYW4gZW50cnkgZm9yIHRvZGF5LgotT3B0aW9uYWwgYXJnIChpbnRlcmFjdGl2ZSBwcmVmaXgpIG5vbi1uaWwgbWVhbnMgcHJvbXB0IGZvciB1c2VyIG5hbWUgYW5kIHNpdGUuCi1TZWNvbmQgYXJnIGlzIGZpbGUgbmFtZSBvZiBjaGFuZ2UgbG9nLiAgSWYgbmlsLCB1c2VzIGBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZScuCi1UaGlyZCBhcmcgT1RIRVItV0lORE9XIG5vbi1uaWwgbWVhbnMgdmlzaXQgaW4gb3RoZXIgd2luZG93LgotRm91cnRoIGFyZyBORVctRU5UUlkgbm9uLW5pbCBtZWFucyBhbHdheXMgY3JlYXRlIGEgbmV3IGVudHJ5IGF0IHRoZSBmcm9udDsKLW5ldmVyIGFwcGVuZCB0byBhbiBleGlzdGluZyBlbnRyeS4iCi0gIChpbnRlcmFjdGl2ZSAobGlzdCBjdXJyZW50LXByZWZpeC1hcmcKLQkJICAgICAocHJvbXB0LWZvci1jaGFuZ2UtbG9nLW5hbWUpKSkKLSAgKG9yIGFkZC1sb2ctZnVsbC1uYW1lCi0gICAgICAoc2V0cSBhZGQtbG9nLWZ1bGwtbmFtZSAodXNlci1mdWxsLW5hbWUpKSkKLSAgKG9yIGFkZC1sb2ctbWFpbGluZy1hZGRyZXNzCi0gICAgICAoc2V0cSBhZGQtbG9nLW1haWxpbmctYWRkcmVzcyB1c2VyLW1haWwtYWRkcmVzcykpCi0gIChpZiB3aG9hbWkKLSAgICAgIChwcm9nbgotCShzZXRxIGFkZC1sb2ctZnVsbC1uYW1lIChyZWFkLWlucHV0ICJGdWxsIG5hbWU6ICIgYWRkLWxvZy1mdWxsLW5hbWUpKQotCSA7OyBOb3RlIHRoYXQgc29tZSBzaXRlcyBoYXZlIHJvb20gYW5kIHBob25lIG51bWJlciBmaWVsZHMgaW4KLQkgOzsgZnVsbCBuYW1lIHdoaWNoIGxvb2sgc2lsbHkgd2hlbiBpbnNlcnRlZC4gIFJhdGhlciB0aGFuIGRvCi0JIDs7IGFueXRoaW5nIGFib3V0IHRoYXQgaGVyZSwgbGV0IHVzZXIgZ2l2ZSBwcmVmaXggYXJndW1lbnQgc28gdGhhdAotCSA7OyBzL2hlIGNhbiBlZGl0IHRoZSBmdWxsIG5hbWUgZmllbGQgaW4gcHJvbXB0ZXIgaWYgcy9oZSB3YW50cy4KLQkoc2V0cSBhZGQtbG9nLW1haWxpbmctYWRkcmVzcwotCSAgICAgIChyZWFkLWlucHV0ICJNYWlsaW5nIGFkZHJlc3M6ICIgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MpKSkpCi0gIChsZXQgKChkZWZ1biAoZnVuY2FsbCAob3IgYWRkLWxvZy1jdXJyZW50LWRlZnVuLWZ1bmN0aW9uCi0JCQkgICAgJ2FkZC1sb2ctY3VycmVudC1kZWZ1bikpKQotCXBhcmFncmFwaC1lbmQgZW50cnkpCi0KLSAgICAoc2V0cSBmaWxlLW5hbWUgKGV4cGFuZC1maWxlLW5hbWUgKGZpbmQtY2hhbmdlLWxvZyBmaWxlLW5hbWUpKSkKLQotICAgIDs7IFNldCBFTlRSWSB0byB0aGUgZmlsZSBuYW1lIHRvIHVzZSBpbiB0aGUgbmV3IGVudHJ5LgotICAgIChhbmQgYnVmZmVyLWZpbGUtbmFtZQotCSA7OyBOZXZlciB3YW50IHRvIGFkZCBhIGNoYW5nZSBsb2cgZW50cnkgZm9yIHRoZSBDaGFuZ2VMb2cgZmlsZSBpdHNlbGYuCi0JIChub3QgKHN0cmluZz0gYnVmZmVyLWZpbGUtbmFtZSBmaWxlLW5hbWUpKQotCSAoc2V0cSBlbnRyeSAoaWYgKHN0cmluZy1tYXRjaAotCQkJICAoY29uY2F0ICJeIiAocmVnZXhwLXF1b3RlIChmaWxlLW5hbWUtZGlyZWN0b3J5Ci0JCQkJCQkgICAgIGZpbGUtbmFtZSkpKQotCQkJICBidWZmZXItZmlsZS1uYW1lKQotCQkJIChzdWJzdHJpbmcgYnVmZmVyLWZpbGUtbmFtZSAobWF0Y2gtZW5kIDApKQotCQkgICAgICAgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgYnVmZmVyLWZpbGUtbmFtZSkpKSkKLQotICAgIChpZiAoYW5kIG90aGVyLXdpbmRvdyAobm90IChlcXVhbCBmaWxlLW5hbWUgYnVmZmVyLWZpbGUtbmFtZSkpKQotCShmaW5kLWZpbGUtb3RoZXItd2luZG93IGZpbGUtbmFtZSkKLSAgICAgIChmaW5kLWZpbGUgZmlsZS1uYW1lKSkKLSAgICAob3IgKGVxIG1ham9yLW1vZGUgJ2NoYW5nZS1sb2ctbW9kZSkKLQkoY2hhbmdlLWxvZy1tb2RlKSkKLSAgICAodW5kby1ib3VuZGFyeSkKLSAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQotICAgIChsZXQgKChoZWFkaW5nIChmb3JtYXQgIiVzICAlcyAgPCVzPiIKLQkJCSAgIChmb3JtYXQtdGltZS1zdHJpbmcgIiVZLSVtLSVkIikKLQkJCSAgIGFkZC1sb2ctZnVsbC1uYW1lCi0JCQkgICBhZGQtbG9nLW1haWxpbmctYWRkcmVzcykpKQotICAgICAgKGlmIChsb29raW5nLWF0IChyZWdleHAtcXVvdGUgaGVhZGluZykpCi0JICAoZm9yd2FyZC1saW5lIDEpCi0JKGluc2VydCBoZWFkaW5nICJcblxuIikpKQotCi0gICAgOzsgU2VhcmNoIG9ubHkgd2l0aGluIHRoZSBmaXJzdCBwYXJhZ3JhcGguCi0gICAgKGlmIChsb29raW5nLWF0ICJcbipbXlxuKiBcdF0iKQotCShza2lwLWNoYXJzLWZvcndhcmQgIlxuIikKLSAgICAgIChmb3J3YXJkLXBhcmFncmFwaCAxKSkKLSAgICAoc2V0cSBwYXJhZ3JhcGgtZW5kIChwb2ludCkpCi0gICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKLQotICAgIDs7IE5vdyBpbnNlcnQgdGhlIG5ldyBsaW5lIGZvciB0aGlzIGVudHJ5LgotICAgIChjb25kICgocmUtc2VhcmNoLWZvcndhcmQgIl5cXHMgKlxcKlxccyAqJCIgcGFyYWdyYXBoLWVuZCB0KQotCSAgIDs7IFB1dCB0aGlzIGZpbGUgbmFtZSBpbnRvIHRoZSBleGlzdGluZyBlbXB0eSBlbnRyeS4KLQkgICAoaWYgZW50cnkKLQkgICAgICAgKGluc2VydCBlbnRyeSkpKQotCSAgKChhbmQgKG5vdCBuZXctZW50cnkpCi0JCShsZXQgKGNhc2UtZm9sZC1zZWFyY2gpCi0JCSAgKHJlLXNlYXJjaC1mb3J3YXJkCi0JCSAgIChjb25jYXQgKHJlZ2V4cC1xdW90ZSAoY29uY2F0ICIqICIgZW50cnkpKQotCQkJICAgOzsgRG9uJ3QgYWNjZXB0IGBmb28uYmFyJyB3aGVuCi0JCQkgICA7OyBsb29raW5nIGZvciBgZm9vJzoKLQkJCSAgICJcXChcXHMgXFx8WygpLDpdXFwpIikKLQkJICAgcGFyYWdyYXBoLWVuZCB0KSkpCi0JICAgOzsgQWRkIHRvIHRoZSBleGlzdGluZyBlbnRyeSBmb3IgdGhlIHNhbWUgZmlsZS4KLQkgICAocmUtc2VhcmNoLWZvcndhcmQgIl5cXHMgKiRcXHxeXFxzIFxcKiIpCi0JICAgKGdvdG8tY2hhciAobWF0Y2gtYmVnaW5uaW5nIDApKQotCSAgIDs7IERlbGV0ZSBleGNlc3MgZW1wdHkgbGluZXM7IG1ha2UganVzdCAyLgotCSAgICh3aGlsZSAoYW5kIChub3QgKGVvYnApKSAobG9va2luZy1hdCAiXlxccyAqJCIpKQotCSAgICAgKGRlbGV0ZS1yZWdpb24gKHBvaW50KSAoc2F2ZS1leGN1cnNpb24gKGZvcndhcmQtbGluZSAxKSAocG9pbnQpKSkpCi0JICAgKGluc2VydCAiXG5cbiIpCi0JICAgKGZvcndhcmQtbGluZSAtMikKLQkgICAoaW5kZW50LXJlbGF0aXZlLW1heWJlKSkKLQkgICh0Ci0JICAgOzsgTWFrZSBhIG5ldyBlbnRyeS4KLQkgICAoZm9yd2FyZC1saW5lIDEpCi0JICAgKHdoaWxlIChsb29raW5nLWF0ICJcXHNXIikKLQkgICAgIChmb3J3YXJkLWxpbmUgMSkpCi0JICAgKHdoaWxlIChhbmQgKG5vdCAoZW9icCkpIChsb29raW5nLWF0ICJeXFxzICokIikpCi0JICAgICAoZGVsZXRlLXJlZ2lvbiAocG9pbnQpIChzYXZlLWV4Y3Vyc2lvbiAoZm9yd2FyZC1saW5lIDEpIChwb2ludCkpKSkKLQkgICAoaW5zZXJ0ICJcblxuXG4iKQotCSAgIChmb3J3YXJkLWxpbmUgLTIpCi0JICAgKGluZGVudC10byBsZWZ0LW1hcmdpbikKLQkgICAoaW5zZXJ0ICIqICIgKG9yIGVudHJ5ICIiKSkpKQotICAgIDs7IE5vdyBpbnNlcnQgdGhlIGZ1bmN0aW9uIG5hbWUsIGlmIHdlIGhhdmUgb25lLgotICAgIDs7IFBvaW50IGlzIGF0IHRoZSBlbnRyeSBmb3IgdGhpcyBmaWxlLAotICAgIDs7IGVpdGhlciBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIG9yIGF0IHRoZSBmaXJzdCBibGFuayBsaW5lLgotICAgIChpZiBkZWZ1bgotCShwcm9nbgotCSAgOzsgTWFrZSBpdCBlYXN5IHRvIGdldCByaWQgb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0JICAodW5kby1ib3VuZGFyeSkKLQkgIChpbnNlcnQgKGlmIChzYXZlLWV4Y3Vyc2lvbgotCQkJKGJlZ2lubmluZy1vZi1saW5lIDEpCi0JCQkobG9va2luZy1hdCAiXFxzICokIikpIAotCQkgICAgICAiIgotCQkgICAgIiAiKQotCQkgICIoIiBkZWZ1biAiKTogIikpCi0gICAgICA7OyBObyBmdW5jdGlvbiBuYW1lLCBzbyBwdXQgaW4gYSBjb2xvbiB1bmxlc3Mgd2UgaGF2ZSBqdXN0IGEgc3Rhci4KLSAgICAgIChpZiAobm90IChzYXZlLWV4Y3Vyc2lvbgotCQkgKGJlZ2lubmluZy1vZi1saW5lIDEpCi0JCSAobG9va2luZy1hdCAiXFxzICpcXChcXCpcXHMgKlxcKT8kIikpKQotCSAgKGluc2VydCAiOiAiKSkpKSkKLQotOzs7IyMjYXV0b2xvYWQKLShkZWZ1biBhZGQtY2hhbmdlLWxvZy1lbnRyeS1vdGhlci13aW5kb3cgKCZvcHRpb25hbCB3aG9hbWkgZmlsZS1uYW1lKQotICAiRmluZCBjaGFuZ2UgbG9nIGZpbGUgaW4gb3RoZXIgd2luZG93IGFuZCBhZGQgYW4gZW50cnkgZm9yIHRvZGF5LgotT3B0aW9uYWwgYXJnIChpbnRlcmFjdGl2ZSBwcmVmaXgpIG5vbi1uaWwgbWVhbnMgcHJvbXB0IGZvciB1c2VyIG5hbWUgYW5kIHNpdGUuCi1TZWNvbmQgYXJnIGlzIGZpbGUgbmFtZSBvZiBjaGFuZ2UgbG9nLiAgXAotSWYgbmlsLCB1c2VzIGBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZScuIgotICAoaW50ZXJhY3RpdmUgKGlmIGN1cnJlbnQtcHJlZml4LWFyZwotCQkgICAobGlzdCBjdXJyZW50LXByZWZpeC1hcmcKLQkJCSAocHJvbXB0LWZvci1jaGFuZ2UtbG9nLW5hbWUpKSkpCi0gIChhZGQtY2hhbmdlLWxvZy1lbnRyeSB3aG9hbWkgZmlsZS1uYW1lIHQpKQotOzs7IyMjYXV0b2xvYWQgKGRlZmluZS1rZXkgY3RsLXgtNC1tYXAgImEiICdhZGQtY2hhbmdlLWxvZy1lbnRyeS1vdGhlci13aW5kb3cpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdW4gY2hhbmdlLWxvZy1tb2RlICgpCi0gICJNYWpvciBtb2RlIGZvciBlZGl0aW5nIGNoYW5nZSBsb2dzOyBsaWtlIEluZGVudGVkIFRleHQgTW9kZS4KLVByZXZlbnRzIG51bWVyaWMgYmFja3VwcyBhbmQgc2V0cyBgbGVmdC1tYXJnaW4nIHRvIDggYW5kIGBmaWxsLWNvbHVtbicgdG8gNzQuCi1OZXcgbG9nIGVudHJpZXMgYXJlIHVzdWFsbHkgbWFkZSB3aXRoIFxcW2FkZC1jaGFuZ2UtbG9nLWVudHJ5XSBvciBcXFthZGQtY2hhbmdlLWxvZy1lbnRyeS1vdGhlci13aW5kb3ddLgotRWFjaCBlbnRyeSBiZWhhdmVzIGFzIGEgcGFyYWdyYXBoLCBhbmQgdGhlIGVudHJpZXMgZm9yIG9uZSBkYXkgYXMgYSBwYWdlLgotUnVucyBgY2hhbmdlLWxvZy1tb2RlLWhvb2snLiIKLSAgKGludGVyYWN0aXZlKQotICAoa2lsbC1hbGwtbG9jYWwtdmFyaWFibGVzKQotICAoaW5kZW50ZWQtdGV4dC1tb2RlKQotICAoc2V0cSBtYWpvci1tb2RlICdjaGFuZ2UtbG9nLW1vZGUKLQltb2RlLW5hbWUgIkNoYW5nZSBMb2ciCi0JbGVmdC1tYXJnaW4gOAotCWZpbGwtY29sdW1uIDc0Ci0gICAgaW5kZW50LXRhYnMtbW9kZSB0Ci0gICAgdGFiLXdpZHRoIDgpCi0gICh1c2UtbG9jYWwtbWFwIGNoYW5nZS1sb2ctbW9kZS1tYXApCi0gIDs7IExldCBlYWNoIGVudHJ5IGJlaGF2ZSBhcyBvbmUgcGFyYWdyYXBoOgotICA7OyBXZSByZWFsbHkgZG8gd2FudCAiXiIgaW4gcGFyYWdyYXBoLXN0YXJ0IGJlbG93OiBpdCBpcyBvbmx5IHRoZSBsaW5lcyB0aGF0Ci0gIDs7IGJlZ2luIGF0IGNvbHVtbiAwIChkZXNwaXRlIHRoZSBsZWZ0LW1hcmdpbiBvZiA4KSB0aGF0IHdlIGFyZSBsb29raW5nIGZvci4KLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAncGFyYWdyYXBoLXN0YXJ0KSAiXFxzICokXFx8XGZcXHxeXFxzdyIpCi0gIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3BhcmFncmFwaC1zZXBhcmF0ZSkgIlxccyAqJFxcfFxmXFx8Xlxcc3ciKQotICA7OyBMZXQgYWxsIGVudHJpZXMgZm9yIG9uZSBkYXkgYmVoYXZlIGFzIG9uZSBwYWdlLgotICA7OyBNYXRjaCBudWxsIHN0cmluZyBvbiB0aGUgZGF0ZS1saW5lIHNvIHRoYXQgdGhlIGRhdGUtbGluZQotICA7OyBpcyBncm91cGVkIHdpdGggd2hhdCBmb2xsb3dzLgotICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdwYWdlLWRlbGltaXRlcikgIl5cXDxcXHxeXGYiKQotICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICd2ZXJzaW9uLWNvbnRyb2wpICduZXZlcikKLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnYWRhcHRpdmUtZmlsbC1yZWdleHApICJcXHMgKiIpCi0gIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2ZvbnQtbG9jay1kZWZhdWx0cykKLSAgICAgICAnKGNoYW5nZS1sb2ctZm9udC1sb2NrLWtleXdvcmRzIHQpKQotICAocnVuLWhvb2tzICdjaGFuZ2UtbG9nLW1vZGUtaG9vaykpCi0KLTs7IEl0IG1pZ2h0IGJlIG5pY2UgdG8gaGF2ZSBhIGdlbmVyYWwgZmVhdHVyZSB0byByZXBsYWNlIHRoaXMuICBUaGUgaWRlYSBJCi07OyBoYXZlIGlzIGEgdmFyaWFibGUgZ2l2aW5nIGEgcmVnZXhwIG1hdGNoaW5nIHRleHQgd2hpY2ggc2hvdWxkIG5vdCBiZQotOzsgbW92ZWQgZnJvbSBib2wgYnkgZmlsbGluZy4gIGNoYW5nZS1sb2ctbW9kZSB3b3VsZCBzZXQgdGhpcyB0byAiXlxccyAqXFxzKCIuCi07OyBCdXQgSSBkb24ndCBmZWVsIHVwIHRvIGltcGxlbWVudGluZyB0aGF0IHRvZGF5LgotKGRlZnVuIGNoYW5nZS1sb2ctZmlsbC1wYXJhZ3JhcGggKCZvcHRpb25hbCBqdXN0aWZ5KQotICAiRmlsbCB0aGUgcGFyYWdyYXBoLCBidXQgcHJlc2VydmUgb3BlbiBwYXJlbnRoZXNlcyBhdCBiZWdpbm5pbmcgb2YgbGluZXMuCi1QcmVmaXggYXJnIG1lYW5zIGp1c3RpZnkgYXMgd2VsbC4iCi0gIChpbnRlcmFjdGl2ZSAiUCIpCi0gIChsZXQgKChlbmQgKHNhdmUtZXhjdXJzaW9uIChmb3J3YXJkLXBhcmFncmFwaCkgKHBvaW50KSkpCi0JKGJlZyAoc2F2ZS1leGN1cnNpb24gKGJhY2t3YXJkLXBhcmFncmFwaCkocG9pbnQpKSkKLQkocGFyYWdyYXBoLXN0YXJ0IChjb25jYXQgcGFyYWdyYXBoLXN0YXJ0ICJcXHxcXHMgKlxccygiKSkpCi0gICAgKGZpbGwtcmVnaW9uIGJlZyBlbmQganVzdGlmeSkpKQotDAotKGRlZnZhciBhZGQtbG9nLWN1cnJlbnQtZGVmdW4taGVhZGVyLXJlZ2V4cAotICAiXlxcKFtBLVpdW0EtWl8gXSpbQS1aX11cXHxbLV9hLXpBLVpdK1xcKVsgXHRdKls6PV0iCi0gICIqSGV1cmlzdGljIHJlZ2V4cCB1c2VkIGJ5IGBhZGQtbG9nLWN1cnJlbnQtZGVmdW4nIGZvciB1bmtub3duIG1ham9yIG1vZGVzLiIpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdW4gYWRkLWxvZy1jdXJyZW50LWRlZnVuICgpCi0gICJSZXR1cm4gbmFtZSBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIHBvaW50IGlzIGluLCBvciBuaWwuCi0KLVVuZGVyc3RhbmRzIEMsIExpc3AsIExhVGVYIChcImZ1bmN0aW9uc1wiIGFyZSBjaGFwdGVycywgc2VjdGlvbnMsIC4uLiksCi1UZXhpbmZvIChAbm9kZSB0aXRsZXMpLCBQZXJsLCBhbmQgRm9ydHJhbi4KLQotT3RoZXIgbW9kZXMgYXJlIGhhbmRsZWQgYnkgYSBoZXVyaXN0aWMgdGhhdCBsb29rcyBpbiB0aGUgMTBLIGJlZm9yZQotcG9pbnQgZm9yIHVwcGVyY2FzZSBoZWFkaW5ncyBzdGFydGluZyBpbiB0aGUgZmlyc3QgY29sdW1uIG9yCi1pZGVudGlmaWVycyBmb2xsb3dlZCBieSBgOicgb3IgYD0nLCBzZWUgdmFyaWFibGUKLWBhZGQtbG9nLWN1cnJlbnQtZGVmdW4taGVhZGVyLXJlZ2V4cCcuCi0KLUhhcyBhIHByZWZlcmVuY2Ugb2YgbG9va2luZyBiYWNrd2FyZHMuIgotICAoY29uZGl0aW9uLWNhc2UgbmlsCi0gICAgICAoc2F2ZS1leGN1cnNpb24KLQkobGV0ICgobG9jYXRpb24gKHBvaW50KSkpCi0JICAoY29uZCAoKG1lbXEgbWFqb3ItbW9kZSAnKGVtYWNzLWxpc3AtbW9kZSBsaXNwLW1vZGUgc2NoZW1lLW1vZGUKLQkJCQkJCSAgICBsaXNwLWludGVyYWN0aW9uLW1vZGUpKQotCQkgOzsgSWYgd2UgYXJlIG5vdyBwcmVjaXNlbHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGRlZnVuLAotCQkgOzsgbWFrZSBzdXJlIGJlZ2lubmluZy1vZi1kZWZ1biBmaW5kcyB0aGF0IG9uZQotCQkgOzsgcmF0aGVyIHRoYW4gdGhlIHByZXZpb3VzIG9uZS4KLQkJIChvciAoZW9icCkgKGZvcndhcmQtY2hhciAxKSkKLQkJIChiZWdpbm5pbmctb2YtZGVmdW4pCi0JCSA7OyBNYWtlIHN1cmUgd2UgYXJlIHJlYWxseSBpbnNpZGUgdGhlIGRlZnVuIGZvdW5kLCBub3QgYWZ0ZXIgaXQuCi0JCSAoaWYgKGFuZCAobG9va2luZy1hdCAiXFxzKCIpCi0JCQkgIChwcm9nbiAoZW5kLW9mLWRlZnVuKQotCQkJCSAoPCBsb2NhdGlvbiAocG9pbnQpKSkKLQkJCSAgKHByb2duIChmb3J3YXJkLXNleHAgLTEpCi0JCQkJICg+PSBsb2NhdGlvbiAocG9pbnQpKSkpCi0JCSAgICAgKHByb2duCi0JCSAgICAgICAoaWYgKGxvb2tpbmctYXQgIlxccygiKQotCQkJICAgKGZvcndhcmQtY2hhciAxKSkKLQkJICAgICAgIChmb3J3YXJkLXNleHAgMSkKLQkJICAgICAgIChza2lwLWNoYXJzLWZvcndhcmQgIiAnIikKLQkJICAgICAgIChidWZmZXItc3Vic3RyaW5nIChwb2ludCkKLQkJCQkJIChwcm9nbiAoZm9yd2FyZC1zZXhwIDEpIChwb2ludCkpKSkpKQotCQkoKGFuZCAobWVtcSBtYWpvci1tb2RlICcoYy1tb2RlIGMrKy1tb2RlIGMrKy1jLW1vZGUgb2JqYy1tb2RlKSkKLQkJICAgICAgKHNhdmUtZXhjdXJzaW9uIChiZWdpbm5pbmctb2YtbGluZSkKLQkJCQkgICAgICA7OyBVc2UgZXEgaW5zdGVhZCBvZiA9IGhlcmUgdG8gYXZvaWQKLQkJCQkgICAgICA7OyBlcnJvciB3aGVuIGF0IGJvYiBhbmQgY2hhci1hZnRlcgotCQkJCSAgICAgIDs7IHJldHVybnMgbmlsLgotCQkJCSAgICAgICh3aGlsZSAoZXEgKGNoYXItYWZ0ZXIgKC0gKHBvaW50KSAyKSkgP1xcKQotCQkJCQkoZm9yd2FyZC1saW5lIC0xKSkKLQkJCQkgICAgICAobG9va2luZy1hdCAiWyBcdF0qI1sgXHRdKmRlZmluZVsgXHRdIikpKQotCQkgOzsgSGFuZGxlIGEgQyBtYWNybyBkZWZpbml0aW9uLgotCQkgKGJlZ2lubmluZy1vZi1saW5lKQotCQkgKHdoaWxlIChlcSAoY2hhci1hZnRlciAoLSAocG9pbnQpIDIpKSA/XFwpIDtub3QgPTsgbm90ZSBhYm92ZQotCQkgICAoZm9yd2FyZC1saW5lIC0xKSkKLQkJIChzZWFyY2gtZm9yd2FyZCAiZGVmaW5lIikKLQkJIChza2lwLWNoYXJzLWZvcndhcmQgIiBcdCIpCi0JCSAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQpCi0JCQkJICAgKHByb2duIChmb3J3YXJkLXNleHAgMSkgKHBvaW50KSkpKQotCQkoKG1lbXEgbWFqb3ItbW9kZSAnKGMtbW9kZSBjKystbW9kZSBjKystYy1tb2RlIG9iamMtbW9kZSkpCi0JCSAoYmVnaW5uaW5nLW9mLWxpbmUpCi0JCSA7OyBTZWUgaWYgd2UgYXJlIGluIHRoZSBiZWdpbm5pbmcgcGFydCBvZiBhIGZ1bmN0aW9uLAotCQkgOzsgYmVmb3JlIHRoZSBvcGVuIGJyYWNlLiAgSWYgc28sIGFkdmFuY2UgZm9yd2FyZC4KLQkJICh3aGlsZSAobm90IChsb29raW5nLWF0ICJ7XFx8XFwoXFxzICokXFwpIikpCi0JCSAgIChmb3J3YXJkLWxpbmUgMSkpCi0JCSAob3IgKGVvYnApCi0JCSAgICAgKGZvcndhcmQtY2hhciAxKSkKLQkJIChiZWdpbm5pbmctb2YtZGVmdW4pCi0JCSAoaWYgKHByb2duIChlbmQtb2YtZGVmdW4pCi0JCQkgICAgKDwgbG9jYXRpb24gKHBvaW50KSkpCi0JCSAgICAgKHByb2duCi0JCSAgICAgICAoYmFja3dhcmQtc2V4cCAxKQotCQkgICAgICAgKGxldCAoYmVnIHRlbSkKLQotCQkJIChmb3J3YXJkLWxpbmUgLTEpCi0JCQkgOzsgU2tpcCBiYWNrIG92ZXIgdHlwZWRlZnMgb2YgYXJnbGlzdC4KLQkJCSAod2hpbGUgKGFuZCAobm90IChib2JwKSkKLQkJCQkgICAgIChsb29raW5nLWF0ICJbIFx0XG5dIikpCi0JCQkgICAoZm9yd2FyZC1saW5lIC0xKSkKLQkJCSA7OyBTZWUgaWYgdGhpcyBpcyB1c2luZyB0aGUgREVGVU4gbWFjcm8gdXNlZCBpbiBFbWFjcywKLQkJCSA7OyBvciB0aGUgREVGVU4gbWFjcm8gdXNlZCBieSB0aGUgQyBsaWJyYXJ5LgotCQkJIChpZiAoY29uZGl0aW9uLWNhc2UgbmlsCi0JCQkJIChhbmQgKHNhdmUtZXhjdXJzaW9uCi0JCQkJCShlbmQtb2YtbGluZSkKLQkJCQkJKHdoaWxlICg9IChwcmVjZWRpbmctY2hhcikgP1xcKQotCQkJCQkgIChlbmQtb2YtbGluZSAyKSkKLQkJCQkJKGJhY2t3YXJkLXNleHAgMSkKLQkJCQkJKGJlZ2lubmluZy1vZi1saW5lKQotCQkJCQkoc2V0cSB0ZW0gKHBvaW50KSkKLQkJCQkJKGxvb2tpbmctYXQgIkRFRlVOXFxiIikpCi0JCQkJICAgICAgKD49IGxvY2F0aW9uIHRlbSkpCi0JCQkgICAgICAgKGVycm9yIG5pbCkpCi0JCQkgICAgIChwcm9nbgotCQkJICAgICAgIChnb3RvLWNoYXIgdGVtKQotCQkJICAgICAgIChkb3duLWxpc3QgMSkKLQkJCSAgICAgICAoaWYgKD0gKGNoYXItYWZ0ZXIgKHBvaW50KSkgP1wiKQotCQkJCSAgIChwcm9nbgotCQkJCSAgICAgKGZvcndhcmQtc2V4cCAxKQotCQkJCSAgICAgKHNraXAtY2hhcnMtZm9yd2FyZCAiICwiKSkpCi0JCQkgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50KQotCQkJCQkJIChwcm9nbiAoZm9yd2FyZC1zZXhwIDEpIChwb2ludCkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAobG9va2luZy1hdCAiXlsrLV0iKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQtbWV0aG9kLWRlZmluaXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IE9yZGluYXJ5IEMgZnVuY3Rpb24gc3ludGF4LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0cSBiZWcgKHBvaW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChhbmQgKGNvbmRpdGlvbi1jYXNlIG5pbAotCQkJCQkgIDs7IFByb3RlY3QgYWdhaW5zdCAiVW5iYWxhbmNlZCBwYXJlbnMiIGVycm9yLgotCQkJCQkgIChwcm9nbgotCQkJCQkgICAgKGRvd24tbGlzdCAxKSA7IGludG8gYXJnbGlzdAotCQkJCQkgICAgKGJhY2t3YXJkLXVwLWxpc3QgMSkKLQkJCQkJICAgIChza2lwLWNoYXJzLWJhY2t3YXJkICIgXHQiKQotCQkJCQkgICAgdCkKLQkJCQkJKGVycm9yIG5pbCkpCi0JCQkJICAgICAgOzsgVmVyaWZ5IGluaXRpYWwgcG9zIHdhcyBhZnRlcgotCQkJCSAgICAgIDs7IHJlYWwgc3RhcnQgb2YgZnVuY3Rpb24uCi0JCQkJICAgICAgKHNhdmUtZXhjdXJzaW9uCi0JCQkJCShnb3RvLWNoYXIgYmVnKQotCQkJCQk7OyBGb3IgdGhpcyBwdXJwb3NlLCBpbmNsdWRlIHRoZSBsaW5lCi0JCQkJCTs7IHRoYXQgaGFzIHRoZSBkZWNsIGtleXdvcmRzLiAgVGhpcwotCQkJCQk7OyBtYXkgYWxzbyBpbmNsdWRlIHNvbWUgb2YgdGhlCi0JCQkJCTs7IGNvbW1lbnRzIGJlZm9yZSB0aGUgZnVuY3Rpb24uCi0JCQkJCSh3aGlsZSAoYW5kIChub3QgKGJvYnApKQotCQkJCQkJICAgIChzYXZlLWV4Y3Vyc2lvbgotCQkJCQkJICAgICAgKGZvcndhcmQtbGluZSAtMSkKLQkJCQkJCSAgICAgIChsb29raW5nLWF0ICJbXlxuXGZdIikpKQotCQkJCQkgIChmb3J3YXJkLWxpbmUgLTEpKQotCQkJCQkoPj0gbG9jYXRpb24gKHBvaW50KSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBDb25zaXN0ZW5jeSBjaGVjazogZ29pbmcgZG93biBhbmQgdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IHNob3VsZG4ndCB0YWtlIHVzIGJhY2sgYmVmb3JlIEJFRy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg+IChwb2ludCkgYmVnKSkKLQkJCQkgKGxldCAoZW5kIG1pZGRsZSkKLQkJCQkgICA7OyBEb24ndCBpbmNsdWRlIGFueSBmaW5hbCBuZXdsaW5lCi0JCQkJICAgOzsgaW4gdGhlIG5hbWUgd2UgdXNlLgotCQkJCSAgIChpZiAoPSAocHJlY2VkaW5nLWNoYXIpID9cbikKLQkJCQkgICAgICAgKGZvcndhcmQtY2hhciAtMSkpCi0JCQkJICAgKHNldHEgZW5kIChwb2ludCkpCi0JCQkJICAgKGJhY2t3YXJkLXNleHAgMSkKLQkJCQkgICA7OyBOb3cgZmluZCB0aGUgcmlnaHQgYmVnaW5uaW5nIG9mIHRoZSBuYW1lLgotCQkJCSAgIDs7IEluY2x1ZGUgY2VydGFpbiBrZXl3b3JkcyBpZiB0aGV5Ci0JCQkJICAgOzsgcHJlY2VkZSB0aGUgbmFtZS4KLQkJCQkgICAoc2V0cSBtaWRkbGUgKHBvaW50KSkKLQkJCQkgICAoZm9yd2FyZC13b3JkIC0xKQotCQkJCSAgIDs7IElnbm9yZSB0aGVzZSBzdWJwYXJ0cyBvZiBhIGNsYXNzIGRlY2wKLQkJCQkgICA7OyBhbmQgbW92ZSBiYWNrIHRvIHRoZSBjbGFzcyBuYW1lIGl0c2VsZi4KLQkJCQkgICAod2hpbGUgKGxvb2tpbmctYXQgInB1YmxpYyBcXHxwcml2YXRlICIpCi0JCQkJICAgICAoc2tpcC1jaGFycy1iYWNrd2FyZCAiIFx0OiIpCi0JCQkJICAgICAoc2V0cSBlbmQgKHBvaW50KSkKLQkJCQkgICAgIChiYWNrd2FyZC1zZXhwIDEpCi0JCQkJICAgICAoc2V0cSBtaWRkbGUgKHBvaW50KSkKLQkJCQkgICAgIChmb3J3YXJkLXdvcmQgLTEpKQotCQkJCSAgIChhbmQgKGJvbHApCi0JCQkJCShsb29raW5nLWF0ICJzdHJ1Y3QgXFx8dW5pb24gXFx8Y2xhc3MgIikKLQkJCQkJKHNldHEgbWlkZGxlIChwb2ludCkpKQotCQkJCSAgIChidWZmZXItc3Vic3RyaW5nIG1pZGRsZSBlbmQpKSkpKSkpKSkKLQkJKChtZW1xIG1ham9yLW1vZGUKLQkJICAgICAgICcoVGVYLW1vZGUgcGxhaW4tVGVYLW1vZGUgTGFUZVgtbW9kZTs7IHRleC1tb2RlLmVsCi0JCQkJICBwbGFpbi10ZXgtbW9kZSBsYXRleC1tb2RlOzsgY211dGV4LmVsCi0JCQkJICApKQotCQkgKGlmIChyZS1zZWFyY2gtYmFja3dhcmQKLQkJICAgICAgIlxcXFxcXChzdWJcXCkqXFwoc2VjdGlvblxcfHBhcmFncmFwaFxcfGNoYXB0ZXJcXCkiIG5pbCB0KQotCQkgICAgIChwcm9nbgotCQkgICAgICAgKGdvdG8tY2hhciAobWF0Y2gtYmVnaW5uaW5nIDApKQotCQkgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKDErIChwb2ludCkpOzsgd2l0aG91dCBpbml0aWFsIGJhY2tzbGFzaAotCQkJCQkgKHByb2duCi0JCQkJCSAgIChlbmQtb2YtbGluZSkKLQkJCQkJICAgKHBvaW50KSkpKSkpCi0JCSgoZXEgbWFqb3ItbW9kZSAndGV4aW5mby1tb2RlKQotCQkgKGlmIChyZS1zZWFyY2gtYmFja3dhcmQgIl5Abm9kZVsgXHRdK1xcKFteLFxuXStcXCkiIG5pbCB0KQotCQkgICAgIChidWZmZXItc3Vic3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMSkKLQkJCQkgICAgICAgKG1hdGNoLWVuZCAxKSkpKQotCQkoKGVxIG1ham9yLW1vZGUgJ3BlcmwtbW9kZSkKLQkJIChpZiAocmUtc2VhcmNoLWJhY2t3YXJkICJec3ViWyBcdF0rXFwoW14gXHRcbl0rXFwpIiBuaWwgdCkKLQkJICAgICAoYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDEpCi0JCQkJICAgICAgIChtYXRjaC1lbmQgMSkpKSkKLSAgICAgICAgICAgICAgICAoKGVxIG1ham9yLW1vZGUgJ2ZvcnRyYW4tbW9kZSkKLSAgICAgICAgICAgICAgICAgOzsgbXVzdCBiZSBpbnNpZGUgZnVuY3Rpb24gYm9keSBmb3IgdGhpcyB0byB3b3JrCi0gICAgICAgICAgICAgICAgIChiZWdpbm5pbmctb2YtZm9ydHJhbi1zdWJwcm9ncmFtKQotICAgICAgICAgICAgICAgICAobGV0ICgoY2FzZS1mb2xkLXNlYXJjaCB0KSkgOyBjYXNlLWluc2Vuc2l0aXZlCi0gICAgICAgICAgICAgICAgICAgOzsgc2VhcmNoIGZvciBmb3J0cmFuIHN1YnByb2dyYW0gc3RhcnQKLSAgICAgICAgICAgICAgICAgICAoaWYgKHJlLXNlYXJjaC1mb3J3YXJkCi0JCQkgIl5bIFx0XSpcXChwcm9ncmFtXFx8c3Vicm91dGluZVxcfGZ1bmN0aW9uXAotXFx8WyBcdGEtejAtOSpdKlsgXHRdK2Z1bmN0aW9uXFwpIgotCQkJIG5pbCB0KQotICAgICAgICAgICAgICAgICAgICAgICAocHJvZ24KLSAgICAgICAgICAgICAgICAgICAgICAgICA7OyBtb3ZlIHRvIEVPTCBvciBiZWZvcmUgZmlyc3QgbGVmdCBwYXJlbgotICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAocmUtc2VhcmNoLWZvcndhcmQgIlsoXG5dIiBuaWwgdCkKLQkJCSAgICAgKHByb2duIChmb3J3YXJkLWNoYXIgLTEpCi0JCQkJICAgIChza2lwLWNoYXJzLWJhY2t3YXJkICIgXHQiKSkKLQkJCSAgIChlbmQtb2YtbGluZSkpCi0JCQkgOzsgVXNlIHRoZSBuYW1lIHByZWNlZGluZyB0aGF0LgotICAgICAgICAgICAgICAgICAgICAgICAgIChidWZmZXItc3Vic3RyaW5nIChwb2ludCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZ24gKGZvcndhcmQtc2V4cCAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50KSkpKSkpKQotCQkodAotCQkgOzsgSWYgYWxsIGVsc2UgZmFpbHMsIHRyeSBoZXVyaXN0aWNzCi0JCSAobGV0IChjYXNlLWZvbGQtc2VhcmNoKQotCQkgICAoZW5kLW9mLWxpbmUpCi0JCSAgIChpZiAocmUtc2VhcmNoLWJhY2t3YXJkIGFkZC1sb2ctY3VycmVudC1kZWZ1bi1oZWFkZXItcmVnZXhwCi0JCQkJCSAgICgtIChwb2ludCkgMTAwMDApCi0JCQkJCSAgIHQpCi0JCSAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDEpCi0JCQkJCSAobWF0Y2gtZW5kIDEpKSkpKSkpKQotICAgIChlcnJvciBuaWwpKSkKLQotKGRlZnZhciBnZXQtbWV0aG9kLWRlZmluaXRpb24tbWQpCi0KLTs7IFN1YnJvdXRpbmUgdXNlZCB3aXRoaW4gZ2V0LW1ldGhvZC1kZWZpbml0aW9uLgotOzsgQWRkIHRoZSBsYXN0IG1hdGNoIGluIHRoZSBidWZmZXIgdG8gdGhlIGVuZCBvZiBgbWQnLAotOzsgZm9sbG93ZWQgYnkgdGhlIHN0cmluZyBFTkQ7IG1vdmUgdG8gdGhlIGVuZCBvZiB0aGF0IG1hdGNoLgotKGRlZnVuIGdldC1tZXRob2QtZGVmaW5pdGlvbi0xIChlbmQpCi0gIChzZXRxIGdldC1tZXRob2QtZGVmaW5pdGlvbi1tZAotCShjb25jYXQgZ2V0LW1ldGhvZC1kZWZpbml0aW9uLW1kIAotCQkoYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDEpIChtYXRjaC1lbmQgMSkpCi0JCWVuZCkpCi0gIChnb3RvLWNoYXIgKG1hdGNoLWVuZCAwKSkpCi0KLTs7IEZvciBvYmplY3RpdmUgQywgcmV0dXJuIHRoZSBtZXRob2QgbmFtZSBpZiB3ZSBhcmUgaW4gYSBtZXRob2QuCi0oZGVmdW4gZ2V0LW1ldGhvZC1kZWZpbml0aW9uICgpCi0gIChsZXQgKChnZXQtbWV0aG9kLWRlZmluaXRpb24tbWQgIlsiKSkKLSAgICAoc2F2ZS1leGN1cnNpb24KLSAgICAgIChpZiAocmUtc2VhcmNoLWJhY2t3YXJkICJeQGltcGxlbWVudGF0aW9uXFxzLSpcXChbQS1aYS16X10qXFwpIiBuaWwgdCkKLQkgIChnZXQtbWV0aG9kLWRlZmluaXRpb24tMSAiICIpKSkKLSAgICAoc2F2ZS1leGN1cnNpb24KLSAgICAgIChjb25kCi0gICAgICAgKChyZS1zZWFyY2gtZm9yd2FyZCAiXlxcKFstK11cXClbIFx0XG5cZlxyXSpcXCgoW14pXSopXFwpP1xccy0qIiBuaWwgdCkKLQkoZ2V0LW1ldGhvZC1kZWZpbml0aW9uLTEgIiIpCi0JKHdoaWxlIChub3QgKGxvb2tpbmctYXQgIlt7O10iKSkKLQkgIChsb29raW5nLWF0Ci0JICAgIlxcKFtBLVphLXpfXSo6P1xcKVxccy0qXFwoKFteKV0qKVxcKT9bQS1aYS16X10qWyBcdFxuXGZccl0qIikKLQkgIChnZXQtbWV0aG9kLWRlZmluaXRpb24tMSAiIikpCi0JKGNvbmNhdCBnZXQtbWV0aG9kLWRlZmluaXRpb24tbWQgIl0iKSkpKSkpCi0KLQotKHByb3ZpZGUgJ2FkZC1sb2cpCi0KLTs7OyBhZGQtbG9nLmVsIGVuZHMgaGVyZQpkaWZmIC0tZ2l0IGEvZXRjL2FkZC1sb2cudmkgYi9ldGMvYWRkLWxvZy52aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiOGM3Ny4uMDAwMDAwMAotLS0gYS9ldGMvYWRkLWxvZy52aQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWdidWlsZC5laW4gYi9ldGMvY29uZmlnYnVpbGQuZWluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTBlMjE0Li4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdidWlsZC5laW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotJSFQUy1BZG9iZS0yLjAgRVBTRi0yLjAKLSUlVGl0bGU6IGNvbmZpZ2J1aWxkLmZpZwotJSVDcmVhdG9yOiBmaWcyZGV2IFZlcnNpb24gMy4xIFBhdGNobGV2ZWwgMQotJSVDcmVhdGlvbkRhdGU6IEZyaSBKdW4gMTIgMjA6MTM6MTYgMTk5OAotJSVGb3I6IGlhbkB0aXRvLmN5Z251cy5jb20gKElhbiBMYW5jZSBUYXlsb3IpCi0lJU9yaWVudGF0aW9uOiBQb3J0cmFpdAotJSVCb3VuZGluZ0JveDogMCAwIDMyMiAxNzMKLSUlUGFnZXM6IDAKLSUlQmVnaW5TZXR1cAotJSVJbmNsdWRlRmVhdHVyZTogKlBhZ2VTaXplIExldHRlcgotJSVFbmRTZXR1cAotJSVFbmRDb21tZW50cwotLyRGMnBzRGljdCAyMDAgZGljdCBkZWYKLSRGMnBzRGljdCBiZWdpbgotJEYycHNEaWN0IC9tdHJ4IG1hdHJpeCBwdXQKLS9jb2wtMSB7fSBkZWYKLS9jb2wwIHswLjAwMCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDEgezAuMDAwIDAuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMiB7MC4wMDAgMS4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wzIHswLjAwMCAxLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDQgezEuMDAwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNSB7MS4wMDAgMC4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w2IHsxLjAwMCAxLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDcgezEuMDAwIDEuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sOCB7MC4wMDAgMC4wMDAgMC41NjAgc3JnYn0gYmluZCBkZWYKLS9jb2w5IHswLjAwMCAwLjAwMCAwLjY5MCBzcmdifSBiaW5kIGRlZgotL2NvbDEwIHswLjAwMCAwLjAwMCAwLjgyMCBzcmdifSBiaW5kIGRlZgotL2NvbDExIHswLjUzMCAwLjgxMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDEyIHswLjAwMCAwLjU2MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDEzIHswLjAwMCAwLjY5MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDE0IHswLjAwMCAwLjgyMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDE1IHswLjAwMCAwLjU2MCAwLjU2MCBzcmdifSBiaW5kIGRlZgotL2NvbDE2IHswLjAwMCAwLjY5MCAwLjY5MCBzcmdifSBiaW5kIGRlZgotL2NvbDE3IHswLjAwMCAwLjgyMCAwLjgyMCBzcmdifSBiaW5kIGRlZgotL2NvbDE4IHswLjU2MCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDE5IHswLjY5MCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDIwIHswLjgyMCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDIxIHswLjU2MCAwLjAwMCAwLjU2MCBzcmdifSBiaW5kIGRlZgotL2NvbDIyIHswLjY5MCAwLjAwMCAwLjY5MCBzcmdifSBiaW5kIGRlZgotL2NvbDIzIHswLjgyMCAwLjAwMCAwLjgyMCBzcmdifSBiaW5kIGRlZgotL2NvbDI0IHswLjUwMCAwLjE5MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI1IHswLjYzMCAwLjI1MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI2IHswLjc1MCAwLjM4MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI3IHsxLjAwMCAwLjUwMCAwLjUwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI4IHsxLjAwMCAwLjYzMCAwLjYzMCBzcmdifSBiaW5kIGRlZgotL2NvbDI5IHsxLjAwMCAwLjc1MCAwLjc1MCBzcmdifSBiaW5kIGRlZgotL2NvbDMwIHsxLjAwMCAwLjg4MCAwLjg4MCBzcmdifSBiaW5kIGRlZgotL2NvbDMxIHsxLjAwMCAwLjg0MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotCi1lbmQKLXNhdmUKLS02Mi4wIDIyNi4wIHRyYW5zbGF0ZQotMSAtMSBzY2FsZQotCi0vY2xwIHtjbG9zZXBhdGh9IGJpbmQgZGVmCi0vZWYge2VvZmlsbH0gYmluZCBkZWYKLS9nciB7Z3Jlc3RvcmV9IGJpbmQgZGVmCi0vZ3Mge2dzYXZlfSBiaW5kIGRlZgotL2wge2xpbmV0b30gYmluZCBkZWYKLS9tIHttb3ZldG99IGJpbmQgZGVmCi0vbiB7bmV3cGF0aH0gYmluZCBkZWYKLS9zIHtzdHJva2V9IGJpbmQgZGVmCi0vc2xjIHtzZXRsaW5lY2FwfSBiaW5kIGRlZgotL3NsaiB7c2V0bGluZWpvaW59IGJpbmQgZGVmCi0vc2x3IHtzZXRsaW5ld2lkdGh9IGJpbmQgZGVmCi0vc3JnYiB7c2V0cmdiY29sb3J9IGJpbmQgZGVmCi0vcm90IHtyb3RhdGV9IGJpbmQgZGVmCi0vc2Mge3NjYWxlfSBiaW5kIGRlZgotL3RyIHt0cmFuc2xhdGV9IGJpbmQgZGVmCi0vdG50IHtkdXAgZHVwIGN1cnJlbnRyZ2Jjb2xvcgotICA0IC0yIHJvbGwgZHVwIDEgZXhjaCBzdWIgMyAtMSByb2xsIG11bCBhZGQKLSAgNCAtMiByb2xsIGR1cCAxIGV4Y2ggc3ViIDMgLTEgcm9sbCBtdWwgYWRkCi0gIDQgLTIgcm9sbCBkdXAgMSBleGNoIHN1YiAzIC0xIHJvbGwgbXVsIGFkZCBzcmdifQotICBiaW5kIGRlZgotL3NoZCB7ZHVwIGR1cCBjdXJyZW50cmdiY29sb3IgNCAtMiByb2xsIG11bCA0IC0yIHJvbGwgbXVsCi0gIDQgLTIgcm9sbCBtdWwgc3JnYn0gYmluZCBkZWYKLS8kRjJwc0JlZ2luIHskRjJwc0RpY3QgYmVnaW4gLyRGMnBzRW50ZXJlZFN0YXRlIHNhdmUgZGVmfSBkZWYKLS8kRjJwc0VuZCB7JEYycHNFbnRlcmVkU3RhdGUgcmVzdG9yZSBlbmR9IGRlZgotJSVFbmRQcm9sb2cKLQotJEYycHNCZWdpbgotMTAgc2V0bWl0ZXJsaW1pdAotIDAuMDYwMDAgMC4wNjAwMCBzYwotNy41MDAgc2x3Ci0lIFBvbHlsaW5lCi1uIDEwNTAgOTAwIG0gMjEwMCA5MDAgbCAgMjEwMCAxNDI1IGwgIDEwNTAgMTQyNSBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDE1MDAgMTQyNSBtIDE1MDAgMjEwMCBsICBncyBjb2wtMSBzIGdyIAotbiAxNTMwLjAwIDE5ODAuMDAgbSAxNTAwLjAwIDIxMDAuMDAgbCAxNDcwLjAwIDE5ODAuMDAgbCAgMTUwMC41MCAxOTgwLjUwIGwgMTUzMC4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDE1MDAgMjYyNSBtIDE1MDAgMzMwMCBsICBncyBjb2wtMSBzIGdyIAotbiAxNTMwLjAwIDMxODAuMDAgbSAxNTAwLjAwIDMzMDAuMDAgbCAxNDcwLjAwIDMxODAuMDAgbCAgMTUwMC41MCAzMTgwLjUwIGwgMTUzMC4wMCAzMTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDI5MjUgOTAwIG0gMzgyNSA5MDAgbCAgMzgyNSAxNDI1IGwgIDI5MjUgMTQyNSBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDExNTUgMjEwMCBtIDEwNTAgMjEwMCAxMDUwIDI1MjAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDEwNTAgMjYyNSAyMjIwIDI2MjUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDIzMjUgMjYyNSAyMzI1IDIyMDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDIzMjUgMjEwMCAxMTU1IDIxMDAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMjg1MCAyMTAwIG0gNDEyNSAyMTAwIGwgIDQxMjUgMjYyNSBsICAyODUwIDI2MjUgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAzMzc1IDE0MjUgbSAzMzc1IDIxMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMzQwNS4wMCAxOTgwLjAwIG0gMzM3NS4wMCAyMTAwLjAwIGwgMzM0NS4wMCAxOTgwLjAwIGwgIDMzNzUuNTAgMTk4MC41MCBsIDM0MDUuMDAgMTk4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiA1MTAwIDkwMCBtIDYzMDAgOTAwIGwgIDYzMDAgMTM1MCBsICA1MTAwIDEzNTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiA1NjI1IDEzNTAgbSA1NjI1IDIxMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gNTY1NS4wMCAxOTgwLjAwIG0gNTYyNS4wMCAyMTAwLjAwIGwgNTU5NS4wMCAxOTgwLjAwIGwgIDU2MjUuNTAgMTk4MC41MCBsIDU2NTUuMDAgMTk4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiA1MjA1IDIxMDAgbSA1MTAwIDIxMDAgNTEwMCAyNTIwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCA1MTAwIDI2MjUgNjI3MCAyNjI1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCA2Mzc1IDI2MjUgNjM3NSAyMjA1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCA2Mzc1IDIxMDAgNTIwNSAyMTAwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDU2MjUgMjYyNSBtIDU2MjUgMzMwMCBsICBncyBjb2wtMSBzIGdyIAotbiA1NjU1LjAwIDMxODAuMDAgbSA1NjI1LjAwIDMzMDAuMDAgbCA1NTk1LjAwIDMxODAuMDAgbCAgNTYyNS41MCAzMTgwLjUwIGwgNTY1NS4wMCAzMTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDUxMDAgMzMwMCBtIDYyMjUgMzMwMCBsICA2MjI1IDM3NTAgbCAgNTEwMCAzNzUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLQlbMSA1MC4wXSA1MC4wMDAwMDAgc2V0ZGFzaAotbiAyODUwIDI0MDAgbSAyMzI1IDI0MDAgbCAgZ3MgY29sLTEgcyBnciAJW10gMCBzZXRkYXNoCi1uIDI0NDUuMDAgMjQzMC4wMCBtIDIzMjUuMDAgMjQwMC4wMCBsIDI0NDUuMDAgMjM3MC4wMCBsICAyNDQ1LjUwIDI0MDAuNTAgbCAyNDQ1LjAwIDI0MzAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLQlbMSA1MC4wXSA1MC4wMDAwMDAgc2V0ZGFzaAotbiA0MTI1IDI0MDAgbSA1MTAwIDI0MDAgbCAgZ3MgY29sLTEgcyBnciAJW10gMCBzZXRkYXNoCi1uIDQ5ODAuMDAgMjM3MC4wMCBtIDUxMDAuMDAgMjQwMC4wMCBsIDQ5ODAuMDAgMjQzMC4wMCBsICA0OTgwLjUwIDI0MDAuNTAgbCA0OTgwLjAwIDIzNzAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMTA1MCAzMzAwIG0gMTk1MCAzMzAwIGwgIDE5NTAgMzc1MCBsICAxMDUwIDM3NTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMTIwMCAxMjAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZy5pbikgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMzAwMCAxMjAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZ3VyZSkgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMzAwMCAyNDAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZy5zdGF0dXMpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTEyMDAgMjQwMCBtCi1ncyAxIC0xIHNjIChjb25maWcuc3RhdHVzKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0xMjAwIDM2MDAgbQotZ3MgMSAtMSBzYyAoY29uZmlnLmgpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTUyNTAgMTIwMCBtCi1ncyAxIC0xIHNjIChNYWtlZmlsZS5pbikgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotNTI1MCAyNDAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZy5zdGF0dXMpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTUyNTAgMzYwMCBtCi1ncyAxIC0xIHNjIChNYWtlZmlsZSkgY29sLTEgc2hvdyBncgotJEYycHNFbmQKLXJlc3RvcmUKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWdidWlsZC5maWcgYi9ldGMvY29uZmlnYnVpbGQuZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDc1OTJkLi4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdidWlsZC5maWcKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0jRklHIDMuMQotUG9ydHJhaXQKLUNlbnRlcgotSW5jaGVzCi0xMjAwIDIKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMTA1MCA5MDAgMjEwMCA5MDAgMjEwMCAxNDI1IDEwNTAgMTQyNSAxMDUwIDkwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMTUwMCAxNDI1IDE1MDAgMjEwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMTUwMCAyNjI1IDE1MDAgMzMwMAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAyOTI1IDkwMCAzODI1IDkwMCAzODI1IDE0MjUgMjkyNSAxNDI1IDI5MjUgOTAwCi0yIDQgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCA3IDAgMCA1Ci0JIDIzMjUgMjYyNSAyMzI1IDIxMDAgMTA1MCAyMTAwIDEwNTAgMjYyNSAyMzI1IDI2MjUKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMjg1MCAyMTAwIDQxMjUgMjEwMCA0MTI1IDI2MjUgMjg1MCAyNjI1IDI4NTAgMjEwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMzM3NSAxNDI1IDMzNzUgMjEwMAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSA1MTAwIDkwMCA2MzAwIDkwMCA2MzAwIDEzNTAgNTEwMCAxMzUwIDUxMDAgOTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA1NjI1IDEzNTAgNTYyNSAyMTAwCi0yIDQgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCA3IDAgMCA1Ci0JIDYzNzUgMjYyNSA2Mzc1IDIxMDAgNTEwMCAyMTAwIDUxMDAgMjYyNSA2Mzc1IDI2MjUKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDU2MjUgMjYyNSA1NjI1IDMzMDAKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgNTEwMCAzMzAwIDYyMjUgMzMwMCA2MjI1IDM3NTAgNTEwMCAzNzUwIDUxMDAgMzMwMAotMiAxIDIgMSAtMSA3IDAgMCAtMSAzLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMjg1MCAyNDAwIDIzMjUgMjQwMAotMiAxIDIgMSAtMSA3IDAgMCAtMSAzLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNDEyNSAyNDAwIDUxMDAgMjQwMAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAxMDUwIDMzMDAgMTk1MCAzMzAwIDE5NTAgMzc1MCAxMDUwIDM3NTAgMTA1MCAzMzAwCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDY0NSAxMjAwIDEyMDAgY29uZmlnLmluXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA3MDUgMzAwMCAxMjAwIGNvbmZpZ3VyZVwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgOTkwIDMwMDAgMjQwMCBjb25maWcuc3RhdHVzXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA5OTAgMTIwMCAyNDAwIGNvbmZpZy5zdGF0dXNcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDYwMCAxMjAwIDM2MDAgY29uZmlnLmhcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDg1NSA1MjUwIDEyMDAgTWFrZWZpbGUuaW5cMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDk5MCA1MjUwIDI0MDAgY29uZmlnLnN0YXR1c1wwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgNjc1IDUyNTAgMzYwMCBNYWtlZmlsZVwwMDEKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWdidWlsZC5qaW4gYi9ldGMvY29uZmlnYnVpbGQuamluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGNkOTM5Li4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdidWlsZC5qaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnYnVpbGQudGluIGIvZXRjL2NvbmZpZ2J1aWxkLnRpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkZDZmZS4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlnYnVpbGQudGluCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0gICBjb25maWcuaW4gICAgICAgICpjb25maWd1cmUqICAgICAgTWFrZWZpbGUuaW4KLSAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgIHYgICAgICAgICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgICAgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotICAgKmNvbmZpZy5zdGF0dXMqPD09PT09PSs9PT09PT09PT09Pipjb25maWcuc3RhdHVzKgotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYKLSAgIGNvbmZpZy5oICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlZmlsZQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2Rldi5laW4gYi9ldGMvY29uZmlnZGV2LmVpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4Mzc4NS4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlnZGV2LmVpbgorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0lIVBTLUFkb2JlLTIuMCBFUFNGLTIuMAotJSVUaXRsZTogY29uZmlnZGV2LmZpZwotJSVDcmVhdG9yOiBmaWcyZGV2IFZlcnNpb24gMy4xIFBhdGNobGV2ZWwgMQotJSVDcmVhdGlvbkRhdGU6IE1vbiBKdW4gMTUgMTc6MzU6MTkgMTk5OAotJSVGb3I6IGlhbkB0aXRvLmN5Z251cy5jb20gKElhbiBMYW5jZSBUYXlsb3IpCi0lJU9yaWVudGF0aW9uOiBQb3J0cmFpdAotJSVCb3VuZGluZ0JveDogMCAwIDM0NCAzMTcKLSUlUGFnZXM6IDAKLSUlQmVnaW5TZXR1cAotJSVJbmNsdWRlRmVhdHVyZTogKlBhZ2VTaXplIExldHRlcgotJSVFbmRTZXR1cAotJSVFbmRDb21tZW50cwotLyRGMnBzRGljdCAyMDAgZGljdCBkZWYKLSRGMnBzRGljdCBiZWdpbgotJEYycHNEaWN0IC9tdHJ4IG1hdHJpeCBwdXQKLS9jb2wtMSB7fSBkZWYKLS9jb2wwIHswLjAwMCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDEgezAuMDAwIDAuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMiB7MC4wMDAgMS4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wzIHswLjAwMCAxLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDQgezEuMDAwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNSB7MS4wMDAgMC4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w2IHsxLjAwMCAxLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDcgezEuMDAwIDEuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sOCB7MC4wMDAgMC4wMDAgMC41NjAgc3JnYn0gYmluZCBkZWYKLS9jb2w5IHswLjAwMCAwLjAwMCAwLjY5MCBzcmdifSBiaW5kIGRlZgotL2NvbDEwIHswLjAwMCAwLjAwMCAwLjgyMCBzcmdifSBiaW5kIGRlZgotL2NvbDExIHswLjUzMCAwLjgxMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDEyIHswLjAwMCAwLjU2MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDEzIHswLjAwMCAwLjY5MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDE0IHswLjAwMCAwLjgyMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDE1IHswLjAwMCAwLjU2MCAwLjU2MCBzcmdifSBiaW5kIGRlZgotL2NvbDE2IHswLjAwMCAwLjY5MCAwLjY5MCBzcmdifSBiaW5kIGRlZgotL2NvbDE3IHswLjAwMCAwLjgyMCAwLjgyMCBzcmdifSBiaW5kIGRlZgotL2NvbDE4IHswLjU2MCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDE5IHswLjY5MCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDIwIHswLjgyMCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDIxIHswLjU2MCAwLjAwMCAwLjU2MCBzcmdifSBiaW5kIGRlZgotL2NvbDIyIHswLjY5MCAwLjAwMCAwLjY5MCBzcmdifSBiaW5kIGRlZgotL2NvbDIzIHswLjgyMCAwLjAwMCAwLjgyMCBzcmdifSBiaW5kIGRlZgotL2NvbDI0IHswLjUwMCAwLjE5MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI1IHswLjYzMCAwLjI1MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI2IHswLjc1MCAwLjM4MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI3IHsxLjAwMCAwLjUwMCAwLjUwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI4IHsxLjAwMCAwLjYzMCAwLjYzMCBzcmdifSBiaW5kIGRlZgotL2NvbDI5IHsxLjAwMCAwLjc1MCAwLjc1MCBzcmdifSBiaW5kIGRlZgotL2NvbDMwIHsxLjAwMCAwLjg4MCAwLjg4MCBzcmdifSBiaW5kIGRlZgotL2NvbDMxIHsxLjAwMCAwLjg0MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotCi1lbmQKLXNhdmUKLS02Mi4wIDM3MC4wIHRyYW5zbGF0ZQotMSAtMSBzY2FsZQotCi0vY2xwIHtjbG9zZXBhdGh9IGJpbmQgZGVmCi0vZWYge2VvZmlsbH0gYmluZCBkZWYKLS9nciB7Z3Jlc3RvcmV9IGJpbmQgZGVmCi0vZ3Mge2dzYXZlfSBiaW5kIGRlZgotL2wge2xpbmV0b30gYmluZCBkZWYKLS9tIHttb3ZldG99IGJpbmQgZGVmCi0vbiB7bmV3cGF0aH0gYmluZCBkZWYKLS9zIHtzdHJva2V9IGJpbmQgZGVmCi0vc2xjIHtzZXRsaW5lY2FwfSBiaW5kIGRlZgotL3NsaiB7c2V0bGluZWpvaW59IGJpbmQgZGVmCi0vc2x3IHtzZXRsaW5ld2lkdGh9IGJpbmQgZGVmCi0vc3JnYiB7c2V0cmdiY29sb3J9IGJpbmQgZGVmCi0vcm90IHtyb3RhdGV9IGJpbmQgZGVmCi0vc2Mge3NjYWxlfSBiaW5kIGRlZgotL3RyIHt0cmFuc2xhdGV9IGJpbmQgZGVmCi0vdG50IHtkdXAgZHVwIGN1cnJlbnRyZ2Jjb2xvcgotICA0IC0yIHJvbGwgZHVwIDEgZXhjaCBzdWIgMyAtMSByb2xsIG11bCBhZGQKLSAgNCAtMiByb2xsIGR1cCAxIGV4Y2ggc3ViIDMgLTEgcm9sbCBtdWwgYWRkCi0gIDQgLTIgcm9sbCBkdXAgMSBleGNoIHN1YiAzIC0xIHJvbGwgbXVsIGFkZCBzcmdifQotICBiaW5kIGRlZgotL3NoZCB7ZHVwIGR1cCBjdXJyZW50cmdiY29sb3IgNCAtMiByb2xsIG11bCA0IC0yIHJvbGwgbXVsCi0gIDQgLTIgcm9sbCBtdWwgc3JnYn0gYmluZCBkZWYKLS8kRjJwc0JlZ2luIHskRjJwc0RpY3QgYmVnaW4gLyRGMnBzRW50ZXJlZFN0YXRlIHNhdmUgZGVmfSBkZWYKLS8kRjJwc0VuZCB7JEYycHNFbnRlcmVkU3RhdGUgcmVzdG9yZSBlbmR9IGRlZgotJSVFbmRQcm9sb2cKLQotJEYycHNCZWdpbgotMTAgc2V0bWl0ZXJsaW1pdAotIDAuMDYwMDAgMC4wNjAwMCBzYwotNy41MDAgc2x3Ci0lIFBvbHlsaW5lCi1uIDEwNTAgOTAwIG0gMjEwMCA5MDAgbCAgMjEwMCAxNDI1IGwgIDEwNTAgMTQyNSBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDI5MjUgOTAwIG0gMzk3NSA5MDAgbCAgMzk3NSAxNDI1IGwgIDI5MjUgMTQyNSBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDU1NTAgOTAwIG0gNjc1MCA5MDAgbCAgNjc1MCAxMzUwIGwgIDU1NTAgMTM1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDM3NTAgMTgwMCBtIDUwMjUgMTgwMCBsICA1MDI1IDIyNTAgbCAgMzc1MCAyMjUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMTE1NSAyMTAwIG0gMTA1MCAyMTAwIDEwNTAgMjUyMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMTA1MCAyNjI1IDIwNzAgMjYyNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMjE3NSAyNjI1IDIxNzUgMjIwNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMjE3NSAyMTAwIDExNTUgMjEwMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiA1NTUwIDMzMDAgbSA2Njc1IDMzMDAgbCAgNjY3NSAzNzUwIGwgIDU1NTAgMzc1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDU2NTUgMjEwMCBtIDU1NTAgMjEwMCA1NTUwIDI1MjAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDU1NTAgMjYyNSA2NDk1IDI2MjUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDY2MDAgMjYyNSA2NjAwIDIyMDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDY2MDAgMjEwMCA1NjU1IDIxMDAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMzc1MCAzNjAwIG0gNDg3NSAzNjAwIGwgIDQ4NzUgNDA1MCBsICAzNzUwIDQwNTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAzODU1IDI3MDAgbSAzNzUwIDI3MDAgMzc1MCAzMDQ1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAzNzUwIDMxNTAgNDU0NSAzMTUwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCA0NjUwIDMxNTAgNDY1MCAyODA1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCA0NjUwIDI3MDAgMzg1NSAyNzAwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDI4NTAgNTcwMCBtIDM3NTAgNTcwMCBsICAzNzUwIDYxNTAgbCAgMjg1MCA2MTUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMzAzMCA0ODAwIG0gMjkyNSA0ODAwIDI5MjUgNTE0NSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMjkyNSA1MjUwIDM2NDUgNTI1MCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMzc1MCA1MjUwIDM3NTAgNDkwNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMzc1MCA0ODAwIDMwMzAgNDgwMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAxNTAwIDE0MjUgbSAxNTAwIDIxMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMTUzMC4wMCAxOTgwLjAwIG0gMTUwMC4wMCAyMTAwLjAwIGwgMTQ3MC4wMCAxOTgwLjAwIGwgIDE1MDAuNTAgMTk4MC41MCBsIDE1MzAuMDAgMTk4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAzMzAwIDE0MjUgbSAzMzAwIDQ4MDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMzMzMC4wMCA0NjgwLjAwIG0gMzMwMC4wMCA0ODAwLjAwIGwgMzI3MC4wMCA0NjgwLjAwIGwgIDMzMDAuNTAgNDY4MC41MCBsIDMzMzAuMDAgNDY4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAzMzAwIDE1NzUgbSAxODc1IDE1NzUgbCAgMTg3NSAyMTAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDE5MDUuMDAgMTk4MC4wMCBtIDE4NzUuMDAgMjEwMC4wMCBsIDE4NDUuMDAgMTk4MC4wMCBsICAxODc1LjUwIDE5ODAuNTAgbCAxOTA1LjAwIDE5ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMzMwMCAxNTc1IG0gNTcwMCAxNTc1IGwgIDU3MDAgMjEwMCBsICBncyBjb2wtMSBzIGdyIAotbiA1NzMwLjAwIDE5ODAuMDAgbSA1NzAwLjAwIDIxMDAuMDAgbCA1NjcwLjAwIDE5ODAuMDAgbCAgNTcwMC41MCAxOTgwLjUwIGwgNTczMC4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDYyMjUgMTM1MCBtIDYyMjUgMjEwMCBsICBncyBjb2wtMSBzIGdyIAotbiA2MjU1LjAwIDE5ODAuMDAgbSA2MjI1LjAwIDIxMDAuMDAgbCA2MTk1LjAwIDE5ODAuMDAgbCAgNjIyNS41MCAxOTgwLjUwIGwgNjI1NS4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDYwNzUgMjYyNSBtIDYwNzUgMzMwMCBsICBncyBjb2wtMSBzIGdyIAotbiA2MTA1LjAwIDMxODAuMDAgbSA2MDc1LjAwIDMzMDAuMDAgbCA2MDQ1LjAwIDMxODAuMDAgbCAgNjA3NS41MCAzMTgwLjUwIGwgNjEwNS4wMCAzMTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDQyMDAgMjI1MCBtIDQyMDAgMjcwMCBsICBncyBjb2wtMSBzIGdyIAotbiA0MjMwLjAwIDI1ODAuMDAgbSA0MjAwLjAwIDI3MDAuMDAgbCA0MTcwLjAwIDI1ODAuMDAgbCAgNDIwMC41MCAyNTgwLjUwIGwgNDIzMC4wMCAyNTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDQyMDAgMzE1MCBtIDQyMDAgMzYwMCBsICBncyBjb2wtMSBzIGdyIAotbiA0MjMwLjAwIDM0ODAuMDAgbSA0MjAwLjAwIDM2MDAuMDAgbCA0MTcwLjAwIDM0ODAuMDAgbCAgNDIwMC41MCAzNDgwLjUwIGwgNDIzMC4wMCAzNDgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDQyMDAgNDA1MCBtIDQyMDAgNDUwMCBsICAzNjc1IDQ1MDAgbCAgMzY3NSA0ODAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDM3MDUuMDAgNDY4MC4wMCBtIDM2NzUuMDAgNDgwMC4wMCBsIDM2NDUuMDAgNDY4MC4wMCBsICAzNjc1LjUwIDQ2ODAuNTAgbCAzNzA1LjAwIDQ2ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMzM3NSA1MjUwIG0gMzM3NSA1NzAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDM0MDUuMDAgNTU4MC4wMCBtIDMzNzUuMDAgNTcwMC4wMCBsIDMzNDUuMDAgNTU4MC4wMCBsICAzMzc1LjUwIDU1ODAuNTAgbCAzNDA1LjAwIDU1ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMzMwMCAyOTI1IG0gMzc1MCAyOTI1IGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDM2MzAuMDAgMjg5NS4wMCBtIDM3NTAuMDAgMjkyNS4wMCBsIDM2MzAuMDAgMjk1NS4wMCBsICAzNjMwLjUwIDI5MjUuNTAgbCAzNjMwLjAwIDI4OTUuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMTUwMCAyNjI1IG0gMTUwMCAzMzAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDE1MzAuMDAgMzE4MC4wMCBtIDE1MDAuMDAgMzMwMC4wMCBsIDE0NzAuMDAgMzE4MC4wMCBsICAxNTAwLjUwIDMxODAuNTAgbCAxNTMwLjAwIDMxODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMTA1MCAzMzAwIG0gMjEwMCAzMzAwIGwgIDIxMDAgMzc1MCBsICAxMDUwIDM3NTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiA0ODc1IDM4MjUgbSA1MjUwIDM4MjUgbCAgNTI1MCAyNDAwIGwgIDU1NTAgMjQwMCBsICBncyBjb2wtMSBzIGdyIAotbiA1NDMwLjAwIDIzNzAuMDAgbSA1NTUwLjAwIDI0MDAuMDAgbCA1NDMwLjAwIDI0MzAuMDAgbCAgNTQzMC41MCAyNDAwLjUwIGwgNTQzMC4wMCAyMzcwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0xMjAwIDEyMDAgbQotZ3MgMSAtMSBzYyAoYWNjb25maWcuaCkgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMzAwMCAxMjAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZ3VyZS5pbikgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotNTcwMCAxMjAwIG0KLWdzIDEgLTEgc2MgKE1ha2VmaWxlLmFtKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zOTAwIDIxMDAgbQotZ3MgMSAtMSBzYyAoYWNpbmNsdWRlLm00KSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0xMjAwIDI0MDAgbQotZ3MgMSAtMSBzYyAoYXV0b2hlYWRlcikgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMTIwMCAzNjAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZy5pbikgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotNTcwMCAzNjAwIG0KLWdzIDEgLTEgc2MgKE1ha2VmaWxlLmluKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci01NzAwIDI0MDAgbQotZ3MgMSAtMSBzYyAoYXV0b21ha2UpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTM5MDAgMzkwMCBtCi1ncyAxIC0xIHNjIChhY2xvY2FsLm00KSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zOTAwIDMwMDAgbQotZ3MgMSAtMSBzYyAoYWNsb2NhbCkgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMzAwMCA2MDAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZ3VyZSkgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMzAwMCA1MTAwIG0KLWdzIDEgLTEgc2MgKGF1dG9jb25mKSBjb2wtMSBzaG93IGdyCi0kRjJwc0VuZAotcmVzdG9yZQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2Rldi5maWcgYi9ldGMvY29uZmlnZGV2LmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQzODZlYy4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlnZGV2LmZpZworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNGSUcgMy4xCi1Qb3J0cmFpdAotQ2VudGVyCi1JbmNoZXMKLTEyMDAgMgotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAxMDUwIDkwMCAyMTAwIDkwMCAyMTAwIDE0MjUgMTA1MCAxNDI1IDEwNTAgOTAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDI5MjUgOTAwIDM5NzUgOTAwIDM5NzUgMTQyNSAyOTI1IDE0MjUgMjkyNSA5MDAKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgNTU1MCA5MDAgNjc1MCA5MDAgNjc1MCAxMzUwIDU1NTAgMTM1MCA1NTUwIDkwMAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAzNzUwIDE4MDAgNTAyNSAxODAwIDUwMjUgMjI1MCAzNzUwIDIyNTAgMzc1MCAxODAwCi0yIDQgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCA3IDAgMCA1Ci0JIDIxNzUgMjYyNSAyMTc1IDIxMDAgMTA1MCAyMTAwIDEwNTAgMjYyNSAyMTc1IDI2MjUKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgNTU1MCAzMzAwIDY2NzUgMzMwMCA2Njc1IDM3NTAgNTU1MCAzNzUwIDU1NTAgMzMwMAotMiA0IDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgNyAwIDAgNQotCSA2NjAwIDI2MjUgNjYwMCAyMTAwIDU1NTAgMjEwMCA1NTUwIDI2MjUgNjYwMCAyNjI1Ci0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDM3NTAgMzYwMCA0ODc1IDM2MDAgNDg3NSA0MDUwIDM3NTAgNDA1MCAzNzUwIDM2MDAKLTIgNCAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDcgMCAwIDUKLQkgNDY1MCAzMTUwIDQ2NTAgMjcwMCAzNzUwIDI3MDAgMzc1MCAzMTUwIDQ2NTAgMzE1MAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAyODUwIDU3MDAgMzc1MCA1NzAwIDM3NTAgNjE1MCAyODUwIDYxNTAgMjg1MCA1NzAwCi0yIDQgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCA3IDAgMCA1Ci0JIDM3NTAgNTI1MCAzNzUwIDQ4MDAgMjkyNSA0ODAwIDI5MjUgNTI1MCAzNzUwIDUyNTAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDE1MDAgMTQyNSAxNTAwIDIxMDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDMzMDAgMTQyNSAzMzAwIDQ4MDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAzCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDMzMDAgMTU3NSAxODc1IDE1NzUgMTg3NSAyMTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMwotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAzMzAwIDE1NzUgNTcwMCAxNTc1IDU3MDAgMjEwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNjIyNSAxMzUwIDYyMjUgMjEwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNjA3NSAyNjI1IDYwNzUgMzMwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNDIwMCAyMjUwIDQyMDAgMjcwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNDIwMCAzMTUwIDQyMDAgMzYwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDQKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNDIwMCA0MDUwIDQyMDAgNDUwMCAzNjc1IDQ1MDAgMzY3NSA0ODAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAzMzc1IDUyNTAgMzM3NSA1NzAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAzMzAwIDI5MjUgMzc1MCAyOTI1Ci0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAxNTAwIDI2MjUgMTUwMCAzMzAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDEwNTAgMzMwMCAyMTAwIDMzMDAgMjEwMCAzNzUwIDEwNTAgMzc1MCAxMDUwIDMzMDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCA0Ci0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDQ4NzUgMzgyNSA1MjUwIDM4MjUgNTI1MCAyNDAwIDU1NTAgMjQwMAotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA3ODAgMTIwMCAxMjAwIGFjY29uZmlnLmhcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDg4NSAzMDAwIDEyMDAgY29uZmlndXJlLmluXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA5NDUgNTcwMCAxMjAwIE1ha2VmaWxlLmFtXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA5OTAgMzkwMCAyMTAwIGFjaW5jbHVkZS5tNFwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgODQwIDEyMDAgMjQwMCBhdXRvaGVhZGVyXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA2NDUgMTIwMCAzNjAwIGNvbmZpZy5pblwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgODU1IDU3MDAgMzYwMCBNYWtlZmlsZS5pblwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgNzM1IDU3MDAgMjQwMCBhdXRvbWFrZVwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgODEwIDM5MDAgMzkwMCBhY2xvY2FsLm00XDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA1NDAgMzkwMCAzMDAwIGFjbG9jYWxcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDcwNSAzMDAwIDYwMDAgY29uZmlndXJlXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA2NjAgMzAwMCA1MTAwIGF1dG9jb25mXDAwMQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2Rldi5qaW4gYi9ldGMvY29uZmlnZGV2LmppbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxMWE3MS4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlnZGV2LmppbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWdkZXYudGluIGIvZXRjL2NvbmZpZ2Rldi50aW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YjZmMzQuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ2Rldi50aW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0gICBhY2NvbmZpZy5oICAgICAgIGNvbmZpZ3VyZS5pbiAgICAgICAgICAgICAgICAgTWFrZWZpbGUuYW0KLSAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgfCAgLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgfAotICAgICAgIHwgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwKLSAgICAgICB2ICB2ICAgICAgICAgICAgIHwgICAgYWNpbmNsdWRlLm00ICAgICB8ICAgICB8Ci0gICAqYXV0b2hlYWRlciogICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgdiAgICAgdgotICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgIHYgICAgICAtLS0+KmF1dG9tYWtlKiAKLSAgICAgICB2ICAgICAgICAgICAgICAgIHwtLS0+KmFjbG9jYWwqICAgfCAgICAgICB8ICAgICAgCi0gICBjb25maWcuaW4gICAgICAgICAgICB8ICAgICAgICAgfCAgICAgIHwgICAgICAgdiAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHYgICAgICB8ICAgTWFrZWZpbGUuaW4KLSAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgYWNsb2NhbC5tNC0tLQotICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgdiAgICAgdgotICAgICAgICAgICAgICAgICAgICAgICAqYXV0b2NvbmYqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB2Ci0gICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ3VyZSBiL2V0Yy9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwMWZjZWYuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDg2MiArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGVsc2UKLSAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGZpCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NTU6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxIHwgZ3JlcCBhY19zcGFjZWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gREVGUy4KLSMgUHJvdGVjdCBhZ2FpbnN0IHNoZWxsIGV4cGFuc2lvbiB3aGlsZSBleGVjdXRpbmcgTWFrZWZpbGUgcnVsZXMuCi0jIFByb3RlY3QgYWdhaW5zdCBNYWtlZmlsZSBtYWNybyBleHBhbnNpb24uCi1jYXQgPiBjb25mdGVzdC5kZWZzIDw8XEVPRgotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklLURcMT1cMiVnCi1zJVsgCWB+IyReJiooKXt9XFx8OyciPD4/XSVcXCYlZwotcyVcWyVcXCYlZwotcyVcXSVcXCYlZwotcyVcJCUkJCVnCi1FT0YKLURFRlM9YHNlZCAtZiBjb25mdGVzdC5kZWZzIGNvbmZkZWZzLmggfCB0ciAnXDAxMicgJyAnYAotcm0gLWYgY29uZnRlc3QuZGVmcwotCi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUiIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9ldGMvY29uZmlndXJlLmluIGIvZXRjL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc4NTA2OC4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLUFDX1BSRVJFUSgyLjUpCi1BQ19JTklUKE1ha2VmaWxlLmluKQotCi1BQ19QUk9HX0lOU1RBTEwKLQotQUNfT1VUUFVUKE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ3VyZS50ZXhpIGIvZXRjL2NvbmZpZ3VyZS50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTQwMTY3Li4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWd1cmUudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI2NDQgKzAsMCBAQAotXGlucHV0IHRleGluZm8KLUBjICUqKnN0YXJ0IG9mIGhlYWRlcgotQHNldGZpbGVuYW1lIGNvbmZpZ3VyZS5pbmZvCi1Ac2V0dGl0bGUgVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbQotQHNldGNoYXB0ZXJuZXdwYWdlIG9mZgotQGMgJSoqZW5kIG9mIGhlYWRlcgotCi1AZGlyY2F0ZWdvcnkgR05VIGFkbWluCi1AZGlyZW50cnkKLSogY29uZmlndXJlOiAoY29uZmlndXJlKS4JVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbQotQGVuZCBkaXJlbnRyeQotCi1AaWZpbmZvCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0uCi0KLUNvcHlyaWdodCAoQykgMTk5OCBDeWdudXMgU29sdXRpb25zLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRlWCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0KLQotQGVuZCBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCi1yZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMsCi1leGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBzdGF0ZWQgaW4gYSB0cmFuc2xhdGlvbiBhcHByb3ZlZAotYnkgdGhlIEZvdW5kYXRpb24uCi1AZW5kIGlmaW5mbwotCi1AdGl0bGVwYWdlCi1AdGl0bGUgVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbQotQGF1dGhvciBJYW4gTGFuY2UgVGF5bG9yCi0KLUBwYWdlCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTggQ3lnbnVzIFNvbHV0aW9ucwotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCi1yZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMsCi1leGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBzdGF0ZWQgaW4gYSB0cmFuc2xhdGlvbgotYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLUBlbmQgdGl0bGVwYWdlCi0KLUBpZmluZm8KLUBub2RlIFRvcAotQHRvcCBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0KLQotVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbS4KLQotQG1lbnUKLSogSW50cm9kdWN0aW9uOjoJCUludHJvZHVjdGlvbi4KLSogR2V0dGluZyBTdGFydGVkOjoJCUdldHRpbmcgU3RhcnRlZC4KLSogRmlsZXM6OgkJCUZpbGVzLgotKiBDb25maWd1cmF0aW9uIE5hbWVzOjoJCUNvbmZpZ3VyYXRpb24gTmFtZXMuCi0qIENyb3NzIENvbXBpbGF0aW9uIFRvb2xzOjoJQ3Jvc3MgQ29tcGlsYXRpb24gVG9vbHMuCi0qIENhbmFkaWFuIENyb3NzOjoJCUNhbmFkaWFuIENyb3NzLgotKiBDeWdudXMgQ29uZmlndXJlOjoJCUN5Z251cyBDb25maWd1cmUuCi0qIE11bHRpbGliczo6CQkJTXVsdGlsaWJzLgotKiBGQVE6OgkJCQlGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucy4KLSogSW5kZXg6OgkJCUluZGV4LgotQGVuZCBtZW51Ci0KLUBlbmQgaWZpbmZvCi0KLUBub2RlIEludHJvZHVjdGlvbgotQGNoYXB0ZXIgSW50cm9kdWN0aW9uCi0KLVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW1zLiAgSXQKLWRlc2NyaWJlcyBob3cgYXV0b2NvbmYsIGF1dG9tYWtlLCBsaWJ0b29sLCBhbmQgbWFrZSBmaXQgdG9nZXRoZXIuICBJdAotYWxzbyBpbmNsdWRlcyBhIGRpc2N1c3Npb24gb2YgdGhlIG9sZGVyIEN5Z251cyBjb25maWd1cmUgc3lzdGVtLgotCi1UaGlzIGRvY3VtZW50IGRvZXMgbm90IGRlc2NyaWJlIGluIGRldGFpbCBob3cgdG8gdXNlIGVhY2ggb2YgdGhlIHRvb2xzOwotc2VlIHRoZSByZXNwZWN0aXZlIG1hbnVhbHMgZm9yIHRoYXQuICBJbnN0ZWFkLCBpdCBkZXNjcmliZXMgd2hpY2ggZmlsZXMKLXRoZSBkZXZlbG9wZXIgbXVzdCB3cml0ZSwgd2hpY2ggZmlsZXMgYXJlIG1hY2hpbmUgZ2VuZXJhdGVkIGFuZCBob3cgdGhleQotYXJlIGdlbmVyYXRlZCwgYW5kIHdoZXJlIGNlcnRhaW4gY29tbW9uIHByb2JsZW1zIHNob3VsZCBiZSBhZGRyZXNzZWQuCi0KLUBpZm5vdGh0bWwKLVRoaXMgZG9jdW1lbnQgZHJhd3Mgb24gc2V2ZXJhbCBzb3VyY2VzLCBpbmNsdWRpbmcgdGhlIGF1dG9jb25mIG1hbnVhbCBieQotRGF2aWQgTWFjS2VuemllIChAcHhyZWZ7VG9wLCAsIGF1dG9jb25mIG92ZXJ2aWV3LCBhdXRvY29uZiwgQXV0b2NvbmZ9KSwKLXRoZSBhdXRvbWFrZSBtYW51YWwgYnkgRGF2aWQgTWFjS2VuemllIGFuZCBUb20gVHJvbWV5IChAcHhyZWZ7VG9wLCAsCi1hdXRvbWFrZSBvdmVydmlldywgYXV0b21ha2UsIEdOVSBBdXRvbWFrZX0pLCB0aGUgbGlidG9vbCBtYW51YWwgYnkKLUdvcmRvbiBNYXR6aWdrZWl0IChAcHhyZWZ7VG9wLCAsIGxpYnRvb2wgb3ZlcnZpZXcsIGxpYnRvb2wsIEdOVQotbGlidG9vbH0pLCBhbmQgdGhlIEN5Z251cyBjb25maWd1cmUgbWFudWFsIGJ5IEsuIFJpY2hhcmQgUGl4bGV5LgotQGVuZCBpZm5vdGh0bWwKLUBpZmh0bWwKLVRoaXMgZG9jdW1lbnQgZHJhd3Mgb24gc2V2ZXJhbCBzb3VyY2VzLCBpbmNsdWRpbmcKLUB1cmVme2h0dHA6Ly93d3cuZGVsb3JpZS5jb20vZ251L2RvY3MvYXV0b2NvbmYvYXV0b2NvbmZfdG9jLmh0bWwsIHRoZQotYXV0b2NvbmYgbWFudWFsfSBieSBEYXZpZCBNYWNLZW56aWUsCi1AdXJlZntodHRwOi8vd3d3LmRlbG9yaWUuY29tL2dudS9kb2NzL2F1dG9tYWtlL2F1dG9tYWtlX3RvYy5odG1sLCB0aGUKLWF1dG9tYWtlIG1hbnVhbH0gYnkgRGF2aWQgTWFjS2VuemllIGFuZCBUb20gVHJvbWV5LAotQHVyZWZ7aHR0cDovL3d3dy5kZWxvcmllLmNvbS9nbnUvZG9jcy9saWJ0b29sL2xpYnRvb2xfdG9jLmh0bWwsIHRoZQotbGlidG9vbCBtYW51YWx9IGJ5IEdvcmRvbiBNYXR6aWdrZWl0LCBhbmQgdGhlIEN5Z251cyBjb25maWd1cmUgbWFudWFsIGJ5Ci1LLiBSaWNoYXJkIFBpeGxleS4KLUBlbmQgaWZodG1sCi0KLUBtZW51Ci0qIEdvYWxzOjoJCQlHb2Fscy4KLSogVG9vbHM6OgkJCVRoZSB0b29scy4KLSogSGlzdG9yeTo6CQkJSGlzdG9yeS4KLSogQnVpbGRpbmc6OgkJCUJ1aWxkaW5nLgotQGVuZCBtZW51Ci0KLUBub2RlIEdvYWxzCi1Ac2VjdGlvbiBHb2FscwotQGNpbmRleCBnb2FscwotCi1UaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtIGhhcyB0d28gbWFpbiBnb2Fscy4KLQotVGhlIGZpcnN0IGlzIHRvIHNpbXBsaWZ5IHRoZSBkZXZlbG9wbWVudCBvZiBwb3J0YWJsZSBwcm9ncmFtcy4gIFRoZQotc3lzdGVtIHBlcm1pdHMgdGhlIGRldmVsb3BlciB0byBjb25jZW50cmF0ZSBvbiB3cml0aW5nIHRoZSBwcm9ncmFtLAotc2ltcGxpZnlpbmcgbWFueSBkZXRhaWxzIG9mIHBvcnRhYmlsaXR5IGFjcm9zcyBVbml4IGFuZCBldmVuIFdpbmRvd3MKLXN5c3RlbXMsIGFuZCBwZXJtaXR0aW5nIHRoZSBkZXZlbG9wZXIgdG8gZGVzY3JpYmUgaG93IHRvIGJ1aWxkIHRoZQotcHJvZ3JhbSB1c2luZyBzaW1wbGUgcnVsZXMgcmF0aGVyIHRoYW4gY29tcGxleCBNYWtlZmlsZXMuCi0KLVRoZSBzZWNvbmQgaXMgdG8gc2ltcGxpZnkgdGhlIGJ1aWxkaW5nIG9mIHByb2dyYW1zIGRpc3RyaWJ1dGVkIGFzIHNvdXJjZQotY29kZS4gIEFsbCBwcm9ncmFtcyBhcmUgYnVpbHQgdXNpbmcgYSBzaW1wbGUsIHN0YW5kYXJkaXplZCwgdHdvIHN0ZXAKLXByb2Nlc3MuICBUaGUgcHJvZ3JhbSBidWlsZGVyIG5lZWQgbm90IGluc3RhbGwgYW55IHNwZWNpYWwgdG9vbHMgaW4KLW9yZGVyIHRvIGJ1aWxkIHRoZSBwcm9ncmFtLgotCi1Abm9kZSBUb29scwotQHNlY3Rpb24gVG9vbHMKLQotVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbSBpcyBjb21wcmlzZWQgb2Ygc2V2ZXJhbCBkaWZmZXJlbnQKLXRvb2xzLiAgUHJvZ3JhbSBkZXZlbG9wZXJzIG11c3QgYnVpbGQgYW5kIGluc3RhbGwgYWxsIG9mIHRoZXNlIHRvb2xzLgotCi1QZW9wbGUgd2hvIGp1c3Qgd2FudCB0byBidWlsZCBwcm9ncmFtcyBmcm9tIGRpc3RyaWJ1dGVkIHNvdXJjZXMgbm9ybWFsbHkKLWRvIG5vdCBuZWVkIGFueSBzcGVjaWFsIHRvb2xzIGJleW9uZCBhIFVuaXggc2hlbGwsIGEgbWFrZSBwcm9ncmFtLCBhbmQgYQotQyBjb21waWxlci4KLQotQHRhYmxlIEBhc2lzCi1AaXRlbSBhdXRvY29uZgotcHJvdmlkZXMgYSBnZW5lcmFsIHBvcnRhYmlsaXR5IGZyYW1ld29yaywgYmFzZWQgb24gdGVzdGluZyB0aGUgZmVhdHVyZXMKLW9mIHRoZSBob3N0IHN5c3RlbSBhdCBidWlsZCB0aW1lLgotQGl0ZW0gYXV0b21ha2UKLWEgc3lzdGVtIGZvciBkZXNjcmliaW5nIGhvdyB0byBidWlsZCBhIHByb2dyYW0sIHBlcm1pdHRpbmcgdGhlIGRldmVsb3BlcgotdG8gd3JpdGUgYSBzaW1wbGlmaWVkIEBmaWxle01ha2VmaWxlfS4KLUBpdGVtIGxpYnRvb2wKLWEgc3RhbmRhcmRpemVkIGFwcHJvYWNoIHRvIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi1AaXRlbSBnZXR0ZXh0Ci1wcm92aWRlcyBhIGZyYW1ld29yayBmb3IgdHJhbnNsYXRpb24gb2YgdGV4dCBtZXNzYWdlcyBpbnRvIG90aGVyCi1sYW5ndWFnZXM7IG5vdCByZWFsbHkgZGlzY3Vzc2VkIGluIHRoaXMgZG9jdW1lbnQuCi1AaXRlbSBtNAotYXV0b2NvbmYgcmVxdWlyZXMgdGhlIEdOVSB2ZXJzaW9uIG9mIG00OyB0aGUgc3RhbmRhcmQgVW5peCBtNCBkb2VzIG5vdAotc3VmZmljZS4KLUBpdGVtIHBlcmwKLWF1dG9tYWtlIHJlcXVpcmVzIHBlcmwuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEhpc3RvcnkKLUBzZWN0aW9uIEhpc3RvcnkKLUBjaW5kZXggaGlzdG9yeQotCi1UaGlzIGlzIGEgdmVyeSBicmllZiBhbmQgcHJvYmFibHkgaW5hY2N1cmF0ZSBoaXN0b3J5LgotCi1BcyB0aGUgbnVtYmVyIG9mIFVuaXggdmFyaWFudHMgaW5jcmVhc2VkIGR1cmluZyB0aGUgMTk4MHMsIGl0IGJlY2FtZQotaGFyZGVyIHRvIHdyaXRlIHByb2dyYW1zIHdoaWNoIGNvdWxkIHJ1biBvbiBhbGwgdmFyaWFudHMuICBXaGlsZSBpdCB3YXMKLW9mdGVuIHBvc3NpYmxlIHRvIHVzZSBAY29kZXsjaWZkZWZ9IHRvIGlkZW50aWZ5IHBhcnRpY3VsYXIgc3lzdGVtcywKLWRldmVsb3BlcnMgZnJlcXVlbnRseSBkaWQgbm90IGhhdmUgYWNjZXNzIHRvIGV2ZXJ5IHN5c3RlbSwgYW5kIHRoZQotY2hhcmFjdGVyaXN0aWNzIG9mIHNvbWUgc3lzdGVtcyBjaGFuZ2VkIGZyb20gdmVyc2lvbiB0byB2ZXJzaW9uLgotCi1CeSAxOTkyLCBhdCBsZWFzdCB0aHJlZSBkaWZmZXJlbnQgYXBwcm9hY2hlcyBoYWQgYmVlbiBkZXZlbG9wZWQ6Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotVGhlIE1ldGFjb25maWcgcHJvZ3JhbSwgYnkgTGFycnkgV2FsbCwgSGFybGFuIFN0ZW5uLCBhbmQgUmFwaGFlbAotTWFuZnJlZGkuCi1AaXRlbQotVGhlIEN5Z251cyBjb25maWd1cmUgc2NyaXB0LCBieSBLLiBSaWNoYXJkIFBpeGxleSwgYW5kIHRoZSBnY2MgY29uZmlndXJlCi1zY3JpcHQsIGJ5IFJpY2hhcmQgU3RhbGxtYW4uICBUaGVzZSB1c2UgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXBwcm9hY2gsCi1hbmQgdGhlIGRldmVsb3BlcnMgY29tbXVuaWNhdGVkIHJlZ3VsYXJseS4KLUBpdGVtCi1UaGUgYXV0b2NvbmYgcHJvZ3JhbSwgYnkgRGF2aWQgTWFjS2VuemllLgotQGVuZCBpdGVtaXplCi0KLVRoZSBNZXRhY29uZmlnIHByb2dyYW0gaXMgc3RpbGwgdXNlZCBmb3IgUGVybCBhbmQgYSBmZXcgb3RoZXIgcHJvZ3JhbXMuCi1JdCBpcyBwYXJ0IG9mIHRoZSBEaXN0IHBhY2thZ2UuICBJIGRvIG5vdCBrbm93IGlmIGl0IGlzIGJlaW5nIGRldmVsb3BlZC4KLQotSW4gMTk5NCwgRGF2aWQgTWFjS2VuemllIGFuZCBvdGhlcnMgbW9kaWZpZWQgYXV0b2NvbmYgdG8gaW5jb3Jwb3JhdGUgYWxsCi10aGUgZmVhdHVyZXMgb2YgQ3lnbnVzIGNvbmZpZ3VyZS4gIFNpbmNlIHRoZW4sIHRoZXJlIGhhcyBiZWVuIGEgc2xvdyBidXQKLXN0ZWFkeSBjb252ZXJzaW9uIG9mIEdOVSBwcm9ncmFtcyBmcm9tIEN5Z251cyBjb25maWd1cmUgdG8gYXV0b2NvbmYuIGdjYwotaGFzIGJlZW4gY29udmVydGVkLCBlbGltaW5hdGluZyB0aGUgZ2NjIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLUdOVSBhdXRvY29uZiB3YXMgcmVndWxhcmx5IG1haW50YWluZWQgdW50aWwgbGF0ZSAxOTk2LiAgQXMgb2YgdGhpcwotd3JpdGluZyBpbiBKdW5lLCAxOTk4LCBpdCBoYXMgbm8gcHVibGljIG1haW50YWluZXIuCi0KLU1vc3QgcHJvZ3JhbXMgYXJlIGJ1aWx0IHVzaW5nIHRoZSBtYWtlIHByb2dyYW0sIHdoaWNoIHJlcXVpcmVzIHRoZQotZGV2ZWxvcGVyIHRvIHdyaXRlIE1ha2VmaWxlcyBkZXNjcmliaW5nIGhvdyB0byBidWlsZCB0aGUgcHJvZ3JhbXMuCi1TaW5jZSBtb3N0IHByb2dyYW1zIGFyZSBidWlsdCBpbiBwcmV0dHkgbXVjaCB0aGUgc2FtZSB3YXksIHRoaXMgbGVkIHRvIGEKLWxvdCBvZiBkdXBsaWNhdGlvbi4KLQotVGhlIFggV2luZG93IHN5c3RlbSBpcyBidWlsdCB1c2luZyB0aGUgaW1ha2UgdG9vbCwgd2hpY2ggdXNlcyBhIGRhdGFiYXNlCi1vZiBydWxlcyB0byBlbGltaW5hdGUgdGhlIGR1cGxpY2F0aW9uLiAgSG93ZXZlciwgYnVpbGRpbmcgYSB0b29sIHdoaWNoCi13YXMgZGV2ZWxvcGVkIHVzaW5nIGltYWtlIHJlcXVpcmVzIHRoYXQgdGhlIGJ1aWxkZXIgaGF2ZSBpbWFrZQotaW5zdGFsbGVkLCB2aW9sYXRpbmcgb25lIG9mIHRoZSBnb2FscyBvZiB0aGUgR05VIHN5c3RlbS4KLQotVGhlIG5ldyBCU0QgbWFrZSBwcm92aWRlcyBhIHN0YW5kYXJkIGxpYnJhcnkgb2YgTWFrZWZpbGUgZnJhZ21lbnRzLAotd2hpY2ggcGVybWl0cyBkZXZlbG9wZXJzIHRvIHdyaXRlIHZlcnkgc2ltcGxlIE1ha2VmaWxlcy4gIEhvd2V2ZXIsIHRoaXMKLXJlcXVpcmVzIHRoYXQgdGhlIGJ1aWxkZXIgaW5zdGFsbCB0aGUgbmV3IEJTRCBtYWtlIHByb2dyYW0uCi0KLUluIDE5OTQsIERhdmlkIE1hY0tlbnppZSB3cm90ZSB0aGUgZmlyc3QgdmVyc2lvbiBvZiBhdXRvbWFrZSwgd2hpY2gKLXBlcm1pdHRlZCB3cml0aW5nIGEgc2ltcGxlIGJ1aWxkIGRlc2NyaXB0aW9uIHdoaWNoIHdhcyBjb252ZXJ0ZWQgaW50byBhCi1NYWtlZmlsZSB3aGljaCBjb3VsZCBiZSB1c2VkIGJ5IHRoZSBzdGFuZGFyZCBtYWtlIHByb2dyYW0uICBJbiAxOTk1LCBUb20KLVRyb21leSBjb21wbGV0ZWx5IHJld3JvdGUgYXV0b21ha2UgaW4gUGVybCwgYW5kIGhlIGNvbnRpbnVlcyB0byBlbmhhbmNlCi1pdC4KLQotVmFyaW91cyBmcmVlIHBhY2thZ2VzIGJ1aWx0IGxpYnJhcmllcywgYW5kIGJ5IGFyb3VuZCAxOTk1IHNldmVyYWwKLWluY2x1ZGVkIHN1cHBvcnQgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBvbiB2YXJpb3VzIHBsYXRmb3Jtcy4KLUhvd2V2ZXIsIHRoZXJlIHdhcyBubyBjb25zaXN0ZW50IGFwcHJvYWNoLiAgSW4gZWFybHkgMTk5NiwgR29yZG9uCi1NYXR6aWdrZWl0IGJlZ2FuIHdvcmtpbmcgb24gbGlidG9vbCwgd2hpY2ggcHJvdmlkZWQgYSBzdGFuZGFyZGl6ZWQKLWFwcHJvYWNoIHRvIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuICBUaGlzIHdhcyBpbnRlZ3JhdGVkIGludG8KLWF1dG9tYWtlIGZyb20gdGhlIHN0YXJ0LgotCi1UaGUgZGV2ZWxvcG1lbnQgb2YgYXV0b21ha2UgYW5kIGxpYnRvb2wgd2FzIGRyaXZlbiBieSB0aGUgR05JVFMgcHJvamVjdCwKLWEgZ3JvdXAgb2YgR05VIG1haW50YWluZXJzIHdobyBkZXNpZ25lZCBzdGFuZGFyZGl6ZWQgdG9vbHMgdG8gaGVscCBtZWV0Ci10aGUgR05VIGNvZGluZyBzdGFuZGFyZHMuCi0KLUBub2RlIEJ1aWxkaW5nCi1Ac2VjdGlvbiBCdWlsZGluZwotCi1Nb3N0IHJlYWRlcnMgb2YgdGhpcyBkb2N1bWVudCBzaG91bGQgYWxyZWFkeSBrbm93IGhvdyB0byBidWlsZCBhIHRvb2wgYnkKLXJ1bm5pbmcgQHNhbXB7Y29uZmlndXJlfSBhbmQgQHNhbXB7bWFrZX0uICBUaGlzIHNlY3Rpb24gbWF5IHNlcnZlIGFzIGEKLXF1aWNrIGludHJvZHVjdGlvbiBvciByZW1pbmRlci4KLQotQnVpbGRpbmcgYSB0b29sIGlzIG5vcm1hbGx5IGFzIHNpbXBsZSBhcyBydW5uaW5nIEBzYW1we2NvbmZpZ3VyZX0KLWZvbGxvd2VkIGJ5IEBzYW1we21ha2V9LiAgWW91IHNob3VsZCBub3JtYWxseSBydW4gQHNhbXB7Y29uZmlndXJlfSBmcm9tCi1hbiBlbXB0eSBkaXJlY3RvcnksIHVzaW5nIHNvbWUgcGF0aCB0byByZWZlciB0byB0aGUgQHNhbXB7Y29uZmlndXJlfQotc2NyaXB0IGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgVGhlIGRpcmVjdG9yeSBpbiB3aGljaCB5b3UgcnVuCi1Ac2FtcHtjb25maWd1cmV9IGlzIGNhbGxlZCB0aGUgQGRmbntvYmplY3QgZGlyZWN0b3J5fS4KLQotSW4gb3JkZXIgdG8gdXNlIGEgb2JqZWN0IGRpcmVjdG9yeSB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc291cmNlCi1kaXJlY3RvcnksIHlvdSBtdXN0IGJlIHVzaW5nIHRoZSBHTlUgdmVyc2lvbiBvZiBAc2FtcHttYWtlfSwgd2hpY2ggaGFzCi10aGUgcmVxdWlyZWQgQHNhbXB7VlBBVEh9IHN1cHBvcnQuICBEZXNwaXRlIHRoaXMgcmVzdHJpY3Rpb24sIHVzaW5nIGEKLWRpZmZlcmVudCBvYmplY3QgZGlyZWN0b3J5IGlzIGhpZ2hseSByZWNvbW1lbmRlZDoKLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1JdCBrZWVwcyB0aGUgZmlsZXMgZ2VuZXJhdGVkIGR1cmluZyB0aGUgYnVpbGQgZnJvbSBjbHV0dGVyaW5nIHVwIHlvdXIKLXNvdXJjZXMuCi1AaXRlbSAKLUl0IHBlcm1pdHMgeW91IHRvIHJlbW92ZSB0aGUgYnVpbHQgZmlsZXMgYnkgc2ltcGx5IHJlbW92aW5nIHRoZSBlbnRpcmUKLWJ1aWxkIGRpcmVjdG9yeS4KLUBpdGVtCi1JdCBwZXJtaXRzIHlvdSB0byBidWlsZCBmcm9tIHRoZSBzYW1lIHNvdXJjZXMgd2l0aCBzZXZlcmFsIHNldHMgb2YKLWNvbmZpZ3VyZSBvcHRpb25zIHNpbXVsdGFuZW91c2x5LgotQGVuZCBpdGVtaXplCi0KLUlmIHlvdSBkb24ndCBoYXZlIEdOVSBAc2FtcHttYWtlfSwgeW91IHdpbGwgaGF2ZSB0byBydW4gQHNhbXB7Y29uZmlndXJlfQotaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBBbGwgR05VIHBhY2thZ2VzIHNob3VsZCBzdXBwb3J0IHRoaXM7IGluCi1wYXJ0aWN1bGFyLCBHTlUgcGFja2FnZXMgc2hvdWxkIG5vdCBhc3N1bWUgdGhlIHByZXNlbmNlIG9mIEdOVQotQHNhbXB7bWFrZX0uCi0KLUFmdGVyIHJ1bm5pbmcgQHNhbXB7Y29uZmlndXJlfSwgeW91IGNhbiBidWlsZCB0aGUgdG9vbHMgYnkgcnVubmluZwotQHNhbXB7bWFrZX0uCi0KLVRvIGluc3RhbGwgdGhlIHRvb2xzLCBydW4gQHNhbXB7bWFrZSBpbnN0YWxsfS4gIEluc3RhbGxpbmcgdGhlIHRvb2xzCi13aWxsIGNvcHkgdGhlIHByb2dyYW1zIGFuZCBhbnkgcmVxdWlyZWQgc3VwcG9ydCBmaWxlcyB0byB0aGUKLUBkZm57aW5zdGFsbGF0aW9uIGRpcmVjdG9yeX0uICBUaGUgbG9jYXRpb24gb2YgdGhlIGluc3RhbGxhdGlvbgotZGlyZWN0b3J5IGlzIGNvbnRyb2xsZWQgYnkgQHNhbXB7Y29uZmlndXJlfSBvcHRpb25zLCBhcyBkZXNjcmliZWQgYmVsb3cuCi0KLUluIHRoZSBDeWdudXMgdHJlZSBhdCBwcmVzZW50LCB0aGUgaW5mbyBmaWxlcyBhcmUgYnVpbHQgYW5kIGluc3RhbGxlZCBhcwotYSBzZXBhcmF0ZSBzdGVwLiAgVG8gYnVpbGQgdGhlbSwgcnVuIEBzYW1we21ha2UgaW5mb30uICBUbyBpbnN0YWxsIHRoZW0sCi1ydW4gQHNhbXB7bWFrZSBpbnN0YWxsLWluZm99LgotCi1BbGwgQHNhbXB7Y29uZmlndXJlfSBzY3JpcHRzIHN1cHBvcnQgYSB3aWRlIHZhcmlldHkgb2Ygb3B0aW9ucy4gIFRoZQotbW9zdCBpbnRlcmVzdGluZyBvbmVzIGFyZSBAc2FtcHstLXdpdGh9IGFuZCBAc2FtcHstLWVuYWJsZX0gb3B0aW9ucwotd2hpY2ggYXJlIGdlbmVyYWxseSBzcGVjaWZpYyB0byBwYXJ0aWN1bGFyIHRvb2xzLiAgWW91IGNhbiB1c3VhbGx5IHVzZQotdGhlIEBzYW1wey0taGVscH0gb3B0aW9uIHRvIGdldCBhIGxpc3Qgb2YgaW50ZXJlc3Rpbmcgb3B0aW9ucyBmb3IgYQotcGFydGljdWxhciBjb25maWd1cmUgc2NyaXB0LgotCi1UaGUgb25seSBnZW5lcmljIG9wdGlvbnMgeW91IGFyZSBsaWtlbHkgdG8gdXNlIGFyZSB0aGUgQHNhbXB7LS1wcmVmaXh9Ci1hbmQgQHNhbXB7LS1leGVjLXByZWZpeH0gb3B0aW9ucy4gIFRoZXNlIG9wdGlvbnMgYXJlIHVzZWQgdG8gc3BlY2lmeSB0aGUKLWluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCi0KLVRoZSBkaXJlY3RvcnkgbmFtZWQgYnkgdGhlIEBzYW1wey0tcHJlZml4fSBvcHRpb24gd2lsbCBob2xkIG1hY2hpbmUKLWluZGVwZW5kZW50IGZpbGVzIHN1Y2ggYXMgaW5mbyBmaWxlcy4KLQotVGhlIGRpcmVjdG9yeSBuYW1lZCBieSB0aGUgQHNhbXB7LS1leGVjLXByZWZpeH0gb3B0aW9uLCB3aGljaCBpcwotbm9ybWFsbHkgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIEBzYW1wey0tcHJlZml4fSBkaXJlY3RvcnksIHdpbGwgaG9sZAotbWFjaGluZSBkZXBlbmRlbnQgZmlsZXMgc3VjaCBhcyBleGVjdXRhYmxlcy4KLQotVGhlIGRlZmF1bHQgZm9yIEBzYW1wey0tcHJlZml4fSBpcyBAZmlsZXsvdXNyL2xvY2FsfS4gIFRoZSBkZWZhdWx0IGZvcgotQHNhbXB7LS1leGVjLXByZWZpeH0gaXMgdGhlIHZhbHVlIHVzZWQgZm9yIEBzYW1wey0tcHJlZml4fS4KLQotVGhlIGNvbnZlbnRpb24gdXNlZCBpbiBDeWdudXMgcmVsZWFzZXMgaXMgdG8gdXNlIGEgQHNhbXB7LS1wcmVmaXh9Ci1vcHRpb24gb2YgQGZpbGV7L3Vzci9jeWdudXMvQHZhcntyZWxlYXNlfX0sIHdoZXJlIEB2YXJ7cmVsZWFzZX0gaXMgdGhlCi1uYW1lIG9mIHRoZSByZWxlYXNlLCBhbmQgdG8gdXNlIGEgQHNhbXB7LS1leGVjLXByZWZpeH0gb3B0aW9uIG9mCi1AZmlsZXsvdXNyL2N5Z251cy9AdmFye3JlbGVhc2V9L0gtQHZhcntob3N0fX0sIHdoZXJlIEB2YXJ7aG9zdH0gaXMgdGhlCi1jb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIGhvc3Qgc3lzdGVtIChAcHhyZWZ7Q29uZmlndXJhdGlvbiBOYW1lc30pLgotCi1EbyBub3QgdXNlIGVpdGhlciB0aGUgc291cmNlIG9yIHRoZSBvYmplY3QgZGlyZWN0b3J5IGFzIHRoZSBpbnN0YWxsYXRpb24KLWRpcmVjdG9yeS4gIFRoYXQgd2lsbCBqdXN0IGxlYWQgdG8gY29uZnVzaW9uLgotCi1Abm9kZSBHZXR0aW5nIFN0YXJ0ZWQKLUBjaGFwdGVyIEdldHRpbmcgU3RhcnRlZAotCi1UbyBzdGFydCB1c2luZyB0aGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtIHdpdGggeW91ciBzb2Z0d2FyZQotcGFja2FnZSwgeW91IG11c3Qgd3JpdGUgdGhyZWUgZmlsZXMsIGFuZCB5b3UgbXVzdCBydW4gc29tZSB0b29scyB0bwotbWFudWFsbHkgZ2VuZXJhdGUgYWRkaXRpb25hbCBmaWxlcy4KLQotQG1lbnUKLSogV3JpdGUgY29uZmlndXJlLmluOjoJCVdyaXRlIGNvbmZpZ3VyZS5pbi4KLSogV3JpdGUgTWFrZWZpbGUuYW06OgkJV3JpdGUgTWFrZWZpbGUuYW0uCi0qIFdyaXRlIGFjY29uZmlnLmg6OgkJV3JpdGUgYWNjb25maWcuaC4KLSogR2VuZXJhdGUgZmlsZXM6OgkJR2VuZXJhdGUgZmlsZXMuCi0qIEdldHRpbmcgU3RhcnRlZCBFeGFtcGxlOjoJRXhhbXBsZS4KLUBlbmQgbWVudQotCi1Abm9kZSBXcml0ZSBjb25maWd1cmUuaW4KLUBzZWN0aW9uIFdyaXRlIGNvbmZpZ3VyZS5pbgotQGNpbmRleCBAZmlsZXtjb25maWd1cmUuaW59LCB3cml0aW5nCi0KLVlvdSBtdXN0IGZpcnN0IHdyaXRlIHRoZSBmaWxlIEBmaWxle2NvbmZpZ3VyZS5pbn0uICBUaGlzIGlzIGFuIGF1dG9jb25mCi1pbnB1dCBmaWxlLCBhbmQgdGhlIGF1dG9jb25mIG1hbnVhbCBkZXNjcmliZXMgaW4gZGV0YWlsIHdoYXQgdGhpcyBmaWxlCi1zaG91bGQgbG9vayBsaWtlLgotCi1Zb3Ugd2lsbCB3cml0ZSB0ZXN0cyBpbiB5b3VyIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSB0byBjaGVjayBmb3IKLWNvbmRpdGlvbnMgdGhhdCBtYXkgY2hhbmdlIGZyb20gb25lIHN5c3RlbSB0byBhbm90aGVyLCBzdWNoIGFzIHRoZQotcHJlc2VuY2Ugb2YgcGFydGljdWxhciBoZWFkZXIgZmlsZXMgb3IgZnVuY3Rpb25zLgotCi1Gb3IgZXhhbXBsZSwgbm90IGFsbCBzeXN0ZW1zIHN1cHBvcnQgdGhlIEBzYW1we2dldHRpbWVvZmRheX0gZnVuY3Rpb24uCi1JZiB5b3Ugd2FudCB0byB1c2UgdGhlIEBzYW1we2dldHRpbWVvZmRheX0gZnVuY3Rpb24gd2hlbiBpdCBpcwotYXZhaWxhYmxlLCBhbmQgdG8gdXNlIHNvbWUgb3RoZXIgZnVuY3Rpb24gd2hlbiBpdCBpcyBub3QsIHlvdSB3b3VsZAotY2hlY2sgZm9yIHRoaXMgYnkgcHV0dGluZyBAc2FtcHtBQ19DSEVDS19GVU5DUyhnZXR0aW1lb2ZkYXkpfSBpbgotQGZpbGV7Y29uZmlndXJlLmlufS4KLQotV2hlbiB0aGUgY29uZmlndXJlIHNjcmlwdCBpcyBydW4gYXQgYnVpbGQgdGltZSwgdGhpcyB3aWxsIGFycmFuZ2UgdG8KLWRlZmluZSB0aGUgcHJlcHJvY2Vzc29yIG1hY3JvIEBzYW1we0hBVkVfR0VUVElNRU9GREFZfSB0byB0aGUgdmFsdWUgMSBpZgotdGhlIEBzYW1we2dldHRpbWVvZmRheX0gZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCBhbmQgdG8gbm90IGRlZmluZSB0aGUKLW1hY3JvIGF0IGFsbCBpZiB0aGUgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZS4gIFlvdXIgY29kZSBjYW4gdGhlbiB1c2UKLUBzYW1weyNpZmRlZn0gdG8gdGVzdCB3aGV0aGVyIGl0IGlzIHNhZmUgdG8gY2FsbCBAc2FtcHtnZXR0aW1lb2ZkYXl9LgotCi1JZiB5b3UgaGF2ZSBhbiBleGlzdGluZyBib2R5IG9mIGNvZGUsIHRoZSBAc2FtcHthdXRvc2Nhbn0gcHJvZ3JhbSBtYXkKLWhlbHAgaWRlbnRpZnkgcG90ZW50aWFsIHBvcnRhYmlsaXR5IHByb2JsZW1zLCBhbmQgaGVuY2UgY29uZmlndXJlIHRlc3RzCi10aGF0IHlvdSB3aWxsIHdhbnQgdG8gdXNlLgotQGlmbm90aHRtbAotQHhyZWZ7SW52b2tpbmcgYXV0b3NjYW4sICwgLCBhdXRvY29uZiwgdGhlIGF1dG9jb25mIG1hbnVhbH0uCi1AZW5kIGlmbm90aHRtbAotQGlmaHRtbAotU2VlIEB1cmVme2h0dHA6Ly93d3cuZGVsb3JpZS5jb20vZ251L2RvY3MvYXV0b2NvbmYvYXV0b2NvbmZfNC5odG1sLCB0aGUKLWF1dG9zY2FuIGRvY3VtZW50YXRpb259LgotQGVuZCBpZmh0bWwKLQotQW5vdGhlciBoYW5keSB0b29sIGZvciBhbiBleGlzdGluZyBib2R5IG9mIGNvZGUgaXMgQHNhbXB7aWZuYW1lc30uICBUaGlzCi13aWxsIHNob3cgeW91IGFsbCB0aGUgcHJlcHJvY2Vzc29yIGNvbmRpdGlvbmFscyB0aGF0IHRoZSBjb2RlIGFscmVhZHkKLXVzZXMuCi1AaWZub3RodG1sCi1AeHJlZntJbnZva2luZyBpZm5hbWVzLCAsICwgYXV0b2NvbmYsIHRoZSBhdXRvY29uZiBtYW51YWx9LgotQGVuZCBpZm5vdGh0bWwKLUBpZmh0bWwKLVNlZSBAdXJlZntodHRwOi8vd3d3LmRlbG9yaWUuY29tL2dudS9kb2NzL2F1dG9jb25mL2F1dG9jb25mXzUuaHRtbCwgdGhlCi1pZm5hbWVzIGRvY3VtZW50YXRpb259LgotQGVuZCBpZmh0bWwKLQotQmVzaWRlcyB0aGUgcG9ydGFiaWxpdHkgdGVzdHMgd2hpY2ggYXJlIHNwZWNpZmljIHRvIHlvdXIgcGFydGljdWxhcgotcGFja2FnZSwgZXZlcnkgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlIHNob3VsZCBjb250YWluIHRoZSBmb2xsb3dpbmcKLW1hY3Jvcy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBBQ19JTklUCi1AY2luZGV4IEBzYW1we0FDX0lOSVR9Ci1UaGlzIG1hY3JvIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50LCB3aGljaCBpcyB0aGUgbmFtZSBvZiBhIGZpbGUgaW4geW91cgotcGFja2FnZS4gIEZvciBleGFtcGxlLCBAc2FtcHtBQ19JTklUKGZvby5jKX0uCi0KLUBpdGVtIEFDX1BSRVJFUShAdmFye1ZFUlNJT059KQotQGNpbmRleCBAc2FtcHtBQ19QUkVSRVF9Ci1UaGlzIG1hY3JvIGlzIG9wdGlvbmFsLiAgSXQgbWF5IGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YKLUBzYW1we2F1dG9jb25mfSB0aGF0IHlvdSBhcmUgdXNpbmcuICBUaGlzIHdpbGwgcHJldmVudCB1c2VycyBmcm9tCi1ydW5uaW5nIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiBAc2FtcHthdXRvY29uZn0gYW5kIHBlcmhhcHMgZ2V0dGluZyBhbgotaW52YWxpZCBAZmlsZXtjb25maWd1cmV9IHNjcmlwdC4gIEZvciBleGFtcGxlLCBAc2FtcHtBQ19QUkVSRVEoMi4xMil9LgotCi1AaXRlbSBBTV9JTklUX0FVVE9NQUtFCi1AY2luZGV4IEBzYW1we0FNX0lOSVRfQVVUT01BS0V9Ci1UaGlzIG1hY3JvIHRha2VzIHR3byBhcmd1bWVudHM6IHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlLCBhbmQgYSB2ZXJzaW9uCi1udW1iZXIuICBGb3IgZXhhbXBsZSwgQHNhbXB7QU1fSU5JVF9BVVRPTUFLRShmb28sIDEuMCl9LiAgKFRoaXMgbWFjcm8gaXMKLW5vdCBuZWVkZWQgaWYgeW91IGFyZSBub3QgdXNpbmcgYXV0b21ha2UpLgotCi1AaXRlbSBBTV9DT05GSUdfSEVBREVSCi1AY2luZGV4IEBzYW1we0FNX0NPTkZJR19IRUFERVJ9Ci1UaGlzIG1hY3JvIG5hbWVzIHRoZSBoZWFkZXIgZmlsZSB3aGljaCB3aWxsIGhvbGQgdGhlIHByZXByb2Nlc3NvciBtYWNybwotZGVmaW5pdGlvbnMgYXQgcnVuIHRpbWUuICBOb3JtYWxseSB0aGlzIHNob3VsZCBiZSBAZmlsZXtjb25maWcuaH0uICBZb3VyCi1zb3VyY2VzIHdvdWxkIHRoZW4gdXNlIEBzYW1weyNpbmNsdWRlICJjb25maWcuaCJ9IHRvIGluY2x1ZGUgaXQuCi0KLVRoaXMgbWFjcm8gbWF5IG9wdGlvbmFsbHkgbmFtZSB0aGUgaW5wdXQgZmlsZSBmb3IgdGhhdCBoZWFkZXIgZmlsZTsgYnkKLWRlZmF1bHQsIHRoaXMgaXMgQGZpbGV7Y29uZmlnLmguaW59LCBidXQgdGhhdCBmaWxlIG5hbWUgd29ya3MgcG9vcmx5IG9uCi1ET1MgZmlsZXN5c3RlbXMuICBUaGVyZWZvcmUsIGl0IGlzIG9mdGVuIGJldHRlciB0byBuYW1lIGl0IGV4cGxpY2l0bHkgYXMKLUBmaWxle2NvbmZpZy5pbn0uCi0KLVRoaXMgaXMgd2hhdCB5b3Ugc2hvdWxkIG5vcm1hbGx5IHB1dCBpbiBAZmlsZXtjb25maWd1cmUuaW59OgotQGV4YW1wbGUKLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotQGVuZCBleGFtcGxlCi0KLUBjaW5kZXggQHNhbXB7QUNfQ09ORklHX0hFQURFUn0KLShJZiB5b3UgYXJlIG5vdCB1c2luZyBhdXRvbWFrZSwgdXNlIEBzYW1we0FDX0NPTkZJR19IRUFERVJ9IHJhdGhlciB0aGFuCi1Ac2FtcHtBTV9DT05GSUdfSEVBREVSfSkuCi0KLUBpdGVtIEFNX01BSU5UQUlORVJfTU9ERQotQGNpbmRleCBAc2FtcHtBTV9NQUlOVEFJTkVSX01PREV9Ci1UaGlzIG1hY3JvIGFsd2F5cyBhcHBlYXJzIGluIEN5Z251cyBjb25maWd1cmUgc2NyaXB0cy4gIE90aGVyIHByb2dyYW1zCi1tYXkgb3IgbWF5IG5vdCB1c2UgaXQuCi0KLUlmIHRoaXMgbWFjcm8gaXMgdXNlZCwgdGhlIEBzYW1wey0tZW5hYmxlLW1haW50YWluZXItbW9kZX0gb3B0aW9uIGlzCi1yZXF1aXJlZCB0byBlbmFibGUgYXV0b21hdGljIHJlYnVpbGRpbmcgb2YgZ2VuZXJhdGVkIGZpbGVzIHVzZWQgYnkgdGhlCi1jb25maWd1cmUgc3lzdGVtLiAgVGhpcyBvZiBjb3Vyc2UgcmVxdWlyZXMgdGhhdCBkZXZlbG9wZXJzIGJlIGF3YXJlIG9mLAotYW5kIHVzZSwgdGhhdCBvcHRpb24uCi0KLUlmIHRoaXMgbWFjcm8gaXMgbm90IHVzZWQsIHRoZW4gdGhlIGdlbmVyYXRlZCBmaWxlcyB3aWxsIGFsd2F5cyBiZQotcmVidWlsdCBhdXRvbWF0aWNhbGx5LiAgVGhpcyB3aWxsIGNhdXNlIHByb2JsZW1zIGlmIHRoZSB3cm9uZyB2ZXJzaW9ucwotb2YgYXV0b2NvbmYsIGF1dG9tYWtlLCBvciBvdGhlcnMgYXJlIGluIHRoZSBidWlsZGVyJ3MgQHNhbXB7UEFUSH0uCi0KLShJZiB5b3UgYXJlIG5vdCB1c2luZyBhdXRvbWFrZSwgeW91IGRvIG5vdCBuZWVkIHRvIHVzZSB0aGlzIG1hY3JvKS4KLQotQGl0ZW0gQUNfRVhFRVhUCi1AY2luZGV4IEBzYW1we0FDX0VYRUVYVH0KLUBjaW5kZXggQHNhbXB7QU1fRVhFRVhUfQotRWl0aGVyIHRoaXMgbWFjcm8gb3IgQHNhbXB7QU1fRVhFRVhUfSBhbHdheXMgYXBwZWFycyBpbiBDeWdudXMgY29uZmlndXJlCi1maWxlcy4gIE90aGVyIHByb2dyYW1zIG1heSBvciBtYXkgbm90IHVzZSBvbmUgb2YgdGhlbS4KLQotVGhpcyBtYWNybyBsb29rcyBmb3IgdGhlIGV4ZWN1dGFibGUgc3VmZml4IHVzZWQgb24gdGhlIGhvc3Qgc3lzdGVtLiAgT24KLVVuaXggc3lzdGVtcywgdGhpcyBpcyB0aGUgZW1wdHkgc3RyaW5nLiAgT24gV2luZG93cyBzeXN0ZW1zLCB0aGlzIGlzCi1Ac2FtcHsuZXhlfS4gIFRoaXMgbWFjcm8gZGlyZWN0cyBhdXRvbWFrZSB0byB1c2UgdGhlIGV4ZWN1dGFibGUgc3VmZml4Ci1hcyBhcHByb3ByaWF0ZSB3aGVuIGNyZWF0aW5nIHByb2dyYW1zLiAgVGhpcyBtYWNybyBkb2VzIG5vdCB0YWtlIGFueQotYXJndW1lbnRzLgotCi1UaGUgQHNhbXB7QUNfRVhFRVhUfSBmb3JtIGlzIG5ldywgYW5kIGlzIHBhcnQgb2YgYSBDeWdudXMgcGF0Y2ggdG8KLWF1dG9jb25mIHRvIHN1cHBvcnQgY29tcGlsaW5nIHdpdGggVmlzdWFsIEMrKy4gIE9sZGVyIHByb2dyYW1zIHVzZQotQHNhbXB7QU1fRVhFRVhUfSBpbnN0ZWFkLgotCi0oUHJvZ3JhbXMgd2hpY2ggZG8gbm90IHVzZSBhdXRvbWFrZSB1c2UgbmVpdGhlciBAc2FtcHtBQ19FWEVFWFR9IG5vcgotQHNhbXB7QU1fRVhFRVhUfSkuCi0KLUBpdGVtIEFDX1BST0dfQ0MKLUBjaW5kZXggQHNhbXB7QUNfUFJPR19DQ30KLUlmIHlvdSBhcmUgd3JpdGluZyBDIGNvZGUsIHlvdSB3aWxsIG5vcm1hbGx5IHdhbnQgdG8gdXNlIHRoaXMgbWFjcm8uICBJdAotbG9jYXRlcyB0aGUgQyBjb21waWxlciB0byB1c2UuICBJdCBkb2VzIG5vdCB0YWtlIGFueSBhcmd1bWVudHMuCi0KLUhvd2V2ZXIsIGlmIHRoaXMgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlIGlzIGZvciBhIGxpYnJhcnkgd2hpY2ggaXMgdG8KLWJlIGNvbXBpbGVkIGJ5IGEgY3Jvc3MgY29tcGlsZXIgd2hpY2ggbWF5IG5vdCBmdWxseSB3b3JrLCB0aGVuIHlvdSB3aWxsCi1ub3Qgd2FudCB0byB1c2UgQHNhbXB7QUNfUFJPR19DQ30uICBJbnN0ZWFkLCB5b3Ugd2lsbCB3YW50IHRvIHVzZSBhCi12YXJpYW50IHdoaWNoIGRvZXMgbm90IGNhbGwgdGhlIG1hY3JvIEBzYW1we0FDX1BST0dfQ0NfV09SS1N9LiAgRXhhbXBsZXMKLWNhbiBiZSBmb3VuZCBpbiB2YXJpb3VzIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZXMgZm9yIGxpYnJhcmllcyB0aGF0IGFyZQotY29tcGlsZWQgd2l0aCBjcm9zcyBjb21waWxlcnMsIHN1Y2ggYXMgbGliaWJlcnR5IG9yIGxpYmdsb3NzLiAgVGhpcyBpcwotZXNzZW50aWFsbHkgYSBidWcgaW4gYXV0b2NvbmYsIGFuZCB0aGVyZSB3aWxsIHByb2JhYmx5IGJlIGEgYmV0dGVyCi13b3JrYXJvdW5kIGF0IHNvbWUgcG9pbnQuCi0KLUBpdGVtIEFDX1BST0dfQ1hYCi1AY2luZGV4IEBzYW1we0FDX1BST0dfQ1hYfQotSWYgeW91IGFyZSB3cml0aW5nIEMrKyBjb2RlLCB5b3Ugd2lsbCB3YW50IHRvIHVzZSB0aGlzIG1hY3JvLiAgSXQKLWxvY2F0ZXMgdGhlIEMrKyBjb21waWxlciB0byB1c2UuICBJdCBkb2VzIG5vdCB0YWtlIGFueSBhcmd1bWVudHMuICBUaGUKLXNhbWUgY3Jvc3MgY29tcGlsZXIgY29tbWVudHMgYXBwbHkgYXMgZm9yIEBzYW1we0FDX1BST0dfQ0N9LgotCi1AaXRlbSBBTV9QUk9HX0xJQlRPT0wKLUBjaW5kZXggQHNhbXB7QU1fUFJPR19MSUJUT09MfQotSWYgeW91IHdhbnQgdG8gYnVpbGQgbGlicmFyaWVzLCBhbmQgeW91IHdhbnQgdG8gcGVybWl0IHRoZW0gdG8gYmUKLXNoYXJlZCwgb3IgeW91IHdhbnQgdG8gbGluayBhZ2FpbnN0IGxpYnJhcmllcyB3aGljaCB3ZXJlIGJ1aWx0IHVzaW5nCi1saWJ0b29sLCB0aGVuIHlvdSB3aWxsIG5lZWQgdGhpcyBtYWNyby4gIFRoaXMgbWFjcm8gaXMgcmVxdWlyZWQgaW4gb3JkZXIKLXRvIHVzZSBsaWJ0b29sLgotCi1AY2luZGV4IEBzYW1we0FNX0RJU0FCTEVfU0hBUkVEfQotQnkgZGVmYXVsdCwgdGhpcyB3aWxsIGNhdXNlIGFsbCBsaWJyYXJpZXMgdG8gYmUgYnVpbHQgYXMgc2hhcmVkCi1saWJyYXJpZXMuICBUbyBwcmV2ZW50IHRoaXMtLXRvIGNoYW5nZSB0aGUgZGVmYXVsdC0tdXNlCi1Ac2FtcHtBTV9ESVNBQkxFX1NIQVJFRH0gYmVmb3JlIEBzYW1we0FNX1BST0dfTElCVE9PTH0uICBUaGUgY29uZmlndXJlCi1vcHRpb25zIEBzYW1wey0tZW5hYmxlLXNoYXJlZH0gYW5kIEBzYW1wey0tZGlzYWJsZS1zaGFyZWR9IG1heSBiZSB1c2VkCi10byBvdmVycmlkZSB0aGUgZGVmYXVsdCBhdCBidWlsZCB0aW1lLgotCi1AaXRlbSBBQ19ERUZJTkUoX0dOVV9TT1VSQ0UpCi1AY2luZGV4IEBzYW1we19HTlVfU09VUkNFfQotR05VIHBhY2thZ2VzIHNob3VsZCBub3JtYWxseSBpbmNsdWRlIHRoaXMgbGluZSBiZWZvcmUgYW55IG90aGVyIGZlYXR1cmUKLXRlc3RzLiAgVGhpcyBkZWZpbmVzIHRoZSBtYWNybyBAc2FtcHtfR05VX1NPVVJDRX0gd2hlbiBjb21waWxpbmcsIHdoaWNoCi1kaXJlY3RzIHRoZSBsaWJjIGhlYWRlciBmaWxlcyB0byBwcm92aWRlIHRoZSBzdGFuZGFyZCBHTlUgc3lzdGVtCi1pbnRlcmZhY2VzIGluY2x1ZGluZyBhbGwgR05VIGV4dGVuc2lvbnMuICBJZiB0aGlzIG1hY3JvIGlzIG5vdCBkZWZpbmVkLAotY2VydGFpbiBHTlUgZXh0ZW5zaW9ucyBtYXkgbm90IGJlIGF2YWlsYWJsZS4KLQotQGl0ZW0gQUNfT1VUUFVUCi1AY2luZGV4IEBzYW1we0FDX09VVFBVVH0KLVRoaXMgbWFjcm8gdGFrZXMgYSBsaXN0IG9mIGZpbGUgbmFtZXMgd2hpY2ggdGhlIGNvbmZpZ3VyZSBwcm9jZXNzIHNob3VsZAotcHJvZHVjZS4gIFRoaXMgaXMgbm9ybWFsbHkgYSBsaXN0IG9mIG9uZSBvciBtb3JlIEBmaWxle01ha2VmaWxlfSBmaWxlcwotaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzLiAgSWYgeW91ciBwYWNrYWdlIGxpdmVzIGVudGlyZWx5IGluIGEgc2luZ2xlCi1kaXJlY3RvcnksIHlvdSB3b3VsZCB1c2Ugc2ltcGx5IEBzYW1we0FDX09VVFBVVChNYWtlZmlsZSl9LiAgSWYgeW91IGFsc28KLWhhdmUsIGZvciBleGFtcGxlLCBhIEBmaWxle2xpYn0gc3ViZGlyZWN0b3J5LCB5b3Ugd291bGQgdXNlCi1Ac2FtcHtBQ19PVVRQVVQoTWFrZWZpbGUgbGliL01ha2VmaWxlKX0uCi1AZW5kIHRhYmxlCi0KLUlmIHlvdSB3YW50IHRvIHVzZSBsb2NhbGx5IGRlZmluZWQgbWFjcm9zIGluIHlvdXIgQGZpbGV7Y29uZmlndXJlLmlufQotZmlsZSwgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvIHdyaXRlIGEgQGZpbGV7YWNpbmNsdWRlLm00fSBmaWxlIHdoaWNoCi1kZWZpbmVzIHRoZW0gKGlmIG5vdCB1c2luZyBhdXRvbWFrZSwgdGhpcyBmaWxlIGlzIGNhbGxlZAotQGZpbGV7YWNsb2NhbC5tNH0pLiAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBwdXQgc2VwYXJhdGUgbWFjcm9zIGluIGFuCi1AZmlsZXttNH0gc3ViZGlyZWN0b3J5LCBhbmQgcHV0IEBzYW1we0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00fSBpbiB5b3VyCi1AZmlsZXtNYWtlZmlsZS5hbX0gZmlsZSBzbyB0aGF0IHRoZSBAc2FtcHthY2xvY2FsfSBwcm9ncmFtIHdpbGwgYmUgYWJsZQotdG8gZmluZCB0aGVtLgotCi1UaGUgZGlmZmVyZW50IG1hY3JvIHByZWZpeGVzIGluZGljYXRlIHdoaWNoIHRvb2wgZGVmaW5lcyB0aGUgbWFjcm8uCi1NYWNyb3Mgd2hpY2ggc3RhcnQgd2l0aCBAc2FtcHtBQ199IGFyZSBwYXJ0IG9mIGF1dG9jb25mLiAgTWFjcm9zIHdoaWNoCi1zdGFydCB3aXRoIEBzYW1we0FNX30gYXJlIHByb3ZpZGVkIGJ5IGF1dG9tYWtlIG9yIGxpYnRvb2wuCi0KLUBub2RlIFdyaXRlIE1ha2VmaWxlLmFtCi1Ac2VjdGlvbiBXcml0ZSBNYWtlZmlsZS5hbQotQGNpbmRleCBAZmlsZXtNYWtlZmlsZS5hbX0sIHdyaXRpbmcKLQotWW91IG11c3Qgd3JpdGUgdGhlIGZpbGUgQGZpbGV7TWFrZWZpbGUuYW19LiAgVGhpcyBpcyBhbiBhdXRvbWFrZSBpbnB1dAotZmlsZSwgYW5kIHRoZSBhdXRvbWFrZSBtYW51YWwgZGVzY3JpYmVzIGluIGRldGFpbCB3aGF0IHRoaXMgZmlsZSBzaG91bGQKLWxvb2sgbGlrZS4KLQotVGhlIGF1dG9tYWtlIGNvbW1hbmRzIGluIEBmaWxle01ha2VmaWxlLmFtfSBtb3N0bHkgbG9vayBsaWtlIHZhcmlhYmxlCi1hc3NpZ25tZW50cyBpbiBhIEBmaWxle01ha2VmaWxlfS4gIGF1dG9tYWtlIHJlY29nbml6ZXMgc3BlY2lhbCB2YXJpYWJsZQotbmFtZXMsIGFuZCBhdXRvbWF0aWNhbGx5IGFkZCBtYWtlIHJ1bGVzIHRvIHRoZSBvdXRwdXQgYXMgbmVlZGVkLgotCi1UaGVyZSB3aWxsIGJlIG9uZSBAZmlsZXtNYWtlZmlsZS5hbX0gZmlsZSBmb3IgZWFjaCBkaXJlY3RvcnkgaW4geW91cgotcGFja2FnZS4gIEZvciBlYWNoIGRpcmVjdG9yeSB3aXRoIHN1YmRpcmVjdG9yaWVzLCB0aGUgQGZpbGV7TWFrZWZpbGUuYW19Ci1maWxlIHNob3VsZCBjb250YWluIHRoZSBsaW5lCi1Ac21hbGxleGFtcGxlCi1TVUJESVJTID0gQHZhcntkaXJ9IEB2YXJ7ZGlyfSBAZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci13aGVyZSBlYWNoIEB2YXJ7ZGlyfSBpcyB0aGUgbmFtZSBvZiBhIHN1YmRpcmVjdG9yeS4KLQotRm9yIGVhY2ggQGZpbGV7TWFrZWZpbGUuYW19LCB0aGVyZSBzaG91bGQgYmUgYSBjb3JyZXNwb25kaW5nCi1AZmlsZXtNYWtlZmlsZX0gaW4gdGhlIEBzYW1we0FDX09VVFBVVH0gbWFjcm8gaW4gQGZpbGV7Y29uZmlndXJlLmlufS4KLQotRXZlcnkgQGZpbGV7TWFrZWZpbGUuYW19IHdyaXR0ZW4gYXQgQ3lnbnVzIHNob3VsZCBjb250YWluIHRoZSBsaW5lCi1Ac21hbGxleGFtcGxlCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGlzIHB1dHMgYXV0b21ha2UgaW50byBDeWdudXMgbW9kZS4gIFNlZSB0aGUgYXV0b21ha2UgbWFudWFsIGZvcgotZGV0YWlscy4KLQotWW91IG1heSB0byBpbmNsdWRlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAc2FtcHthdXRvbWFrZX0gdGhhdCB5b3UgYXJlCi11c2luZyBvbiB0aGUgQHNhbXB7QVVUT01BS0VfT1BUSU9OU30gbGluZS4gIEZvciBleGFtcGxlLAotQHNtYWxsZXhhbXBsZQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyAxLjMKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLVRoaXMgd2lsbCBwcmV2ZW50IHVzZXJzIGZyb20gcnVubmluZyBhbiBlYXJsaWVyIHZlcnNpb24gb2YKLUBzYW1we2F1dG9tYWtlfSBhbmQgcGVyaGFwcyBnZXR0aW5nIGFuIGludmFsaWQgQGZpbGV7TWFrZWZpbGUuaW59LgotCi1JZiB5b3VyIHBhY2thZ2UgYnVpbGRzIGEgcHJvZ3JhbSwgdGhlbiBpbiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoYXQKLXByb2dyYW0gaXMgYnVpbHQgeW91IHdpbGwgbm9ybWFsbHkgd2FudCBhIGxpbmUgbGlrZQotQHNtYWxsZXhhbXBsZQotYmluX1BST0dSQU1TID0gQHZhcntwcm9ncmFtfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotd2hlcmUgQHZhcntwcm9ncmFtfSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbS4gIFlvdSB3aWxsIHRoZW4gd2FudCBhCi1saW5lIGxpa2UKLUBzbWFsbGV4YW1wbGUKLUB2YXJ7cHJvZ3JhbX1fU09VUkNFUyA9IEB2YXJ7ZmlsZX0gQHZhcntmaWxlfSBAZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci13aGVyZSBlYWNoIEB2YXJ7ZmlsZX0gaXMgdGhlIG5hbWUgb2YgYSBzb3VyY2UgZmlsZSB0byBsaW5rIGludG8gdGhlCi1wcm9ncmFtIChlLmcuLCBAc2FtcHtmb28uY30pLgotCi1JZiB5b3VyIHBhY2thZ2UgYnVpbGRzIGEgbGlicmFyeSwgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgbGlicmFyeSB0bwotZXZlciBiZSBidWlsdCBhcyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIGluIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhhdAotbGlicmFyeSBpcyBidWlsdCB5b3Ugd2lsbCBub3JtYWxseSB3YW50IGEgbGluZSBsaWtlCi1Ac21hbGxleGFtcGxlCi1saWJfTElCUkFSSUVTID0gbGliQHZhcntuYW1lfS5hCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci13aGVyZSBAc2FtcHtsaWJAdmFye25hbWV9LmF9IGlzIHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5LiAgWW91IHdpbGwgdGhlbgotd2FudCBhIGxpbmUgbGlrZQotQHNtYWxsZXhhbXBsZQotbGliQHZhcntuYW1lfV9hX1NPVVJDRVMgPSBAdmFye2ZpbGV9IEB2YXJ7ZmlsZX0gQGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotd2hlcmUgZWFjaCBAdmFye2ZpbGV9IGlzIHRoZSBuYW1lIG9mIGEgc291cmNlIGZpbGUgdG8gYWRkIHRvIHRoZQotbGlicmFyeS4KLQotSWYgeW91ciBwYWNrYWdlIGJ1aWxkcyBhIGxpYnJhcnksIGFuZCB5b3Ugd2FudCB0byBwZXJtaXQgYnVpbGRpbmcgdGhlCi1saWJyYXJ5IGFzIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGF0IGxpYnJhcnkgaXMKLWJ1aWx0IHlvdSB3aWxsIG5vcm1hbGx5IHdhbnQgYSBsaW5lIGxpa2UKLUBzbWFsbGV4YW1wbGUKLWxpYl9MVExJQlJBUklFUyA9IGxpYkB2YXJ7bmFtZX0ubGEKLUBlbmQgc21hbGxleGFtcGxlCi1UaGUgdXNlIG9mIEBzYW1we0xUTElCUkFSSUVTfSwgYW5kIHRoZSBAc2FtcHsubGF9IGV4dGVuc2lvbiwgaW5kaWNhdGUgYQotbGlicmFyeSB0byBiZSBidWlsdCB1c2luZyBsaWJ0b29sLiAgQXMgdXN1YWwsIHlvdSB3aWxsIHRoZW4gd2FudCBhIGxpbmUKLWxpa2UKLUBzbWFsbGV4YW1wbGUKLWxpYkB2YXJ7bmFtZX1fbGFfU09VUkNFUyA9IEB2YXJ7ZmlsZX0gQHZhcntmaWxlfSBAZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgc3RyaW5ncyBAc2FtcHtiaW59IGFuZCBAc2FtcHtsaWJ9IHRoYXQgYXBwZWFyIGFib3ZlIGluCi1Ac2FtcHtiaW5fUFJPR1JBTVN9IGFuZCBAc2FtcHtsaWJfTElCUkFSSUVTfSBhcmUgbm90IGFyYml0cmFyeS4gIFRoZXkKLXJlZmVyIHRvIHBhcnRpY3VsYXIgZGlyZWN0b3JpZXMsIHdoaWNoIG1heSBiZSBzZXQgYnkgdGhlIEBzYW1wey0tYmluZGlyfQotYW5kIEBzYW1wey0tbGliZGlyfSBvcHRpb25zIHRvIEBmaWxle2NvbmZpZ3VyZX0uICBJZiB0aG9zZSBvcHRpb25zIGFyZQotbm90IHVzZWQsIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgYmFzZWQgb24gdGhlIEBzYW1wey0tcHJlZml4fSBvcgotQHNhbXB7LS1leGVjLXByZWZpeH0gb3B0aW9ucyB0byBAZmlsZXtjb25maWd1cmV9LiAgSXQgaXMgcG9zc2libGUgdG8gdXNlCi1vdGhlciBuYW1lcyBpZiB0aGUgcHJvZ3JhbSBvciBsaWJyYXJ5IHNob3VsZCBiZSBpbnN0YWxsZWQgaW4gc29tZSBvdGhlcgotZGlyZWN0b3J5LgotCi1UaGUgQGZpbGV7TWFrZWZpbGUuYW19IGZpbGUgbWF5IGFsc28gY29udGFpbiBhbG1vc3QgYW55dGhpbmcgdGhhdCBtYXkKLWFwcGVhciBpbiBhIG5vcm1hbCBAZmlsZXtNYWtlZmlsZX0uICBhdXRvbWFrZSBhbHNvIHN1cHBvcnRzIG1hbnkgb3RoZXIKLXNwZWNpYWwgdmFyaWFibGVzLCBhcyB3ZWxsIGFzIGNvbmRpdGlvbmFscy4KLQotU2VlIHRoZSBhdXRvbWFrZSBtYW51YWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBub2RlIFdyaXRlIGFjY29uZmlnLmgKLUBzZWN0aW9uIFdyaXRlIGFjY29uZmlnLmgKLUBjaW5kZXggQGZpbGV7YWNjb25maWcuaH0sIHdyaXRpbmcKLQotSWYgeW91IGFyZSBnZW5lcmF0aW5nIGEgcG9ydGFiaWxpdHkgaGVhZGVyIGZpbGUsIChpLmUuLCB5b3UgYXJlIHVzaW5nCi1Ac2FtcHtBTV9DT05GSUdfSEVBREVSfSBpbiBAZmlsZXtjb25maWd1cmUuaW59KSwgdGhlbiB5b3Ugd2lsbCBoYXZlIHRvCi13cml0ZSBhIEBmaWxle2FjY29uZmlnLmh9IGZpbGUuICBJdCB3aWxsIGhhdmUgdG8gY29udGFpbiB0aGUgZm9sbG93aW5nCi1saW5lcy4KLQotQHNtYWxsZXhhbXBsZQotLyogTmFtZSBvZiBwYWNrYWdlLiAgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gb2YgcGFja2FnZS4gICovCi0jdW5kZWYgVkVSU0lPTgotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhpcyByZXF1aXJlbWVudCBpcyByZWFsbHkgYSBidWcgaW4gdGhlIHN5c3RlbSwgYW5kIHRoZSByZXF1aXJlbWVudCBtYXkKLWJlIGVsaW1pbmF0ZWQgYXQgc29tZSBsYXRlciBkYXRlLgotCi1UaGUgQGZpbGV7YWNjb25maWcuaH0gZmlsZSB3aWxsIGFsc28gc2ltaWxhciBjb21tZW50IGFuZCBAc2FtcHsjdW5kZWZ9Ci1saW5lcyBmb3IgYW55IHVudXN1YWwgbWFjcm9zIGluIHRoZSBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUsIGluY2x1ZGluZwotYW55IG1hY3JvIHdoaWNoIGFwcGVhcnMgaW4gYSBAc2FtcHtBQ19ERUZJTkV9IG1hY3JvLgotCi1JbiBwYXJ0aWN1bGFyLCBpZiB5b3UgYXJlIHdyaXRpbmcgYSBHTlUgcGFja2FnZSBhbmQgdGhlcmVmb3JlIGluY2x1ZGUKLUBzYW1we0FDX0RFRklORShfR05VX1NPVVJDRSl9IGluIEBmaWxle2NvbmZpZ3VyZS5pbn0gYXMgc3VnZ2VzdGVkIGFib3ZlLAoteW91IHdpbGwgbmVlZCBsaW5lcyBsaWtlIHRoaXMgaW4gQGZpbGV7YWNjb25maWcuaH06Ci1Ac21hbGxleGFtcGxlCi0vKiBFbmFibGUgR05VIGV4dGVuc2lvbnMuICAqLwotI3VuZGVmIF9HTlVfU09VUkNFCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Ob3JtYWxseSB0aGUgQHNhbXB7YXV0b2hlYWRlcn0gcHJvZ3JhbSB3aWxsIGluZm9ybSB5b3Ugb2YgYW55IHN1Y2gKLXJlcXVpcmVtZW50cyBieSBwcmludGluZyBhbiBlcnJvciBtZXNzYWdlIHdoZW4gaXQgaXMgcnVuLiAgSG93ZXZlciwgaWYKLXlvdSBkbyBhbnl0aGluZyBwYXJ0aWN1bGFyIG9kZCBpbiB5b3VyIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSwgeW91Ci13aWxsIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHJpZ2h0IGVudHJpZXMgYXBwZWFyIGluCi1AZmlsZXthY2NvbmZpZy5ofSwgc2luY2Ugb3RoZXJ3aXNlIHRoZSByZXN1bHRzIG9mIHRoZSB0ZXN0cyBtYXkgbm90IGJlCi1hdmFpbGFibGUgaW4gdGhlIEBmaWxle2NvbmZpZy5ofSBmaWxlIHdoaWNoIHlvdXIgY29kZSB3aWxsIHVzZS4KLQotKFRoZWUgQHNhbXB7UEFDS0FHRX0gYW5kIEBzYW1we1ZFUlNJT059IGxpbmVzIGFyZSBub3QgcmVxdWlyZWQgaWYgeW91Ci1hcmUgbm90IHVzaW5nIGF1dG9tYWtlLCBhbmQgaW4gdGhhdCBjYXNlIHlvdSBtYXkgbm90IG5lZWQgYQotQGZpbGV7YWNjb25maWcuaH0gZmlsZSBhdCBhbGwpLgotCi1Abm9kZSBHZW5lcmF0ZSBmaWxlcwotQHNlY3Rpb24gR2VuZXJhdGUgZmlsZXMKLQotT25jZSB5b3UgaGF2ZSB3cml0dGVuIEBmaWxle2NvbmZpZ3VyZS5pbn0sIEBmaWxle01ha2VmaWxlLmFtfSwKLUBmaWxle2FjY29uZmlnLmh9LCBhbmQgcG9zc2libHkgQGZpbGV7YWNpbmNsdWRlLm00fSwgeW91IG11c3QgdXNlCi1hdXRvY29uZiBhbmQgYXV0b21ha2UgcHJvZ3JhbXMgdG8gcHJvZHVjZSB0aGUgZmlyc3QgdmVyc2lvbnMgb2YgdGhlCi1nZW5lcmF0ZWQgZmlsZXMuICBUaGlzIGlzIGRvbmUgYnkgZXhlY3V0aW5nIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2Ugb2YKLWNvbW1hbmRzLgotCi1Ac21hbGxleGFtcGxlCi1hY2xvY2FsCi1hdXRvY29uZgotYXV0b2hlYWRlcgotYXV0b21ha2UKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAc2FtcHthY2xvY2FsfSBhbmQgQHNhbXB7YXV0b21ha2V9IGNvbW1hbmRzIGFyZSBwYXJ0IG9mIHRoZSBhdXRvbWFrZQotcGFja2FnZSwgYW5kIHRoZSBAc2FtcHthdXRvY29uZn0gYW5kIEBzYW1we2F1dG9oZWFkZXJ9IGNvbW1hbmRzIGFyZSBwYXJ0Ci1vZiB0aGUgYXV0b2NvbmYgcGFja2FnZS4KLQotSWYgeW91IGFyZSB1c2luZyBhIEBmaWxle200fSBzdWJkaXJlY3RvcnkgZm9yIHlvdXIgbWFjcm9zLCB5b3Ugd2lsbCBuZWVkCi10byB1c2UgdGhlIEBzYW1wey1JIG00fSBvcHRpb24gd2hlbiB5b3UgcnVuIEBzYW1we2FjbG9jYWx9LgotCi1JZiB5b3UgYXJlIG5vdCB1c2luZyB0aGUgQ3lnbnVzIHRyZWUsIHVzZSB0aGUgQHNhbXB7LWF9IG9wdGlvbiB3aGVuCi1ydW5uaW5nIEBzYW1we2F1dG9tYWtlfSBjb21tYW5kIGluIG9yZGVyIHRvIGNvcHkgdGhlIHJlcXVpcmVkIHN1cHBvcnQKLWZpbGVzIGludG8geW91ciBzb3VyY2UgZGlyZWN0b3J5LgotCi1JZiB5b3UgYXJlIHVzaW5nIGxpYnRvb2wsIHlvdSBtdXN0IGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBsaWJ0b29sIHBhY2thZ2UKLXdpdGggdGhlIHNhbWUgQHNhbXB7LS1wcmVmaXh9IGFuZCBAc2FtcHstLWV4ZWMtcHJlZml4fSBvcHRpb25zIGFzIHlvdQotdXNlZCB3aXRoIHRoZSBhdXRvY29uZiBhbmQgYXV0b21ha2UgcGFja2FnZXMuICBZb3UgbXVzdCBkbyB0aGlzIGJlZm9yZQotcnVubmluZyBhbnkgb2YgdGhlIGFib3ZlIGNvbW1hbmRzLiAgSWYgeW91IGFyZSBub3QgdXNpbmcgdGhlIEN5Z251cwotdHJlZSwgeW91IHdpbGwgbmVlZCB0byBydW4gdGhlIEBzYW1we2xpYnRvb2xpemV9IHByb2dyYW0gdG8gY29weSB0aGUKLWxpYnRvb2wgc3VwcG9ydCBmaWxlcyBpbnRvIHlvdXIgZGlyZWN0b3J5LgotCi1PbmNlIHlvdSBoYXZlIG1hbmFnZWQgdG8gcnVuIHRoZXNlIGNvbW1hbmRzIHdpdGhvdXQgZ2V0dGluZyBhbnkgZXJyb3JzLAoteW91IHNob3VsZCBjcmVhdGUgYSBuZXcgZW1wdHkgZGlyZWN0b3J5LCBhbmQgcnVuIHRoZSBAc2FtcHtjb25maWd1cmV9Ci1zY3JpcHQgd2hpY2ggd2lsbCBoYXZlIGJlZW4gY3JlYXRlZCBieSBAc2FtcHthdXRvY29uZn0gd2l0aCB0aGUKLUBzYW1wey0tZW5hYmxlLW1haW50YWluZXItbW9kZX0gb3B0aW9uLiAgVGhpcyB3aWxsIGdpdmUgeW91IGEgc2V0IG9mCi1NYWtlZmlsZXMgd2hpY2ggd2lsbCBpbmNsdWRlIHJ1bGVzIHRvIGF1dG9tYXRpY2FsbHkgcmVidWlsZCBhbGwgdGhlCi1nZW5lcmF0ZWQgZmlsZXMuCi0KLUFmdGVyIGRvaW5nIHRoYXQsIHdoZW5ldmVyIHlvdSBoYXZlIGNoYW5nZWQgc29tZSBvZiB0aGUgaW5wdXQgZmlsZXMgYW5kCi13YW50IHRvIHJlZ2VuZXJhdGVkIHRoZSBvdGhlciBmaWxlcywgZ28gdG8geW91ciBvYmplY3QgZGlyZWN0b3J5IGFuZCBydW4KLUBzYW1we21ha2V9LiAgRG9pbmcgdGhpcyBpcyBtb3JlIHJlbGlhYmxlIHRoYW4gdHJ5aW5nIHRvIHJlYnVpbGQgdGhlCi1maWxlcyBtYW51YWxseSwgYmVjYXVzZSB0aGVyZSBhcmUgY29tcGxleCBvcmRlciBkZXBlbmRlbmNpZXMgYW5kIGl0IGlzCi1lYXN5IHRvIGZvcmdldCBzb21ldGhpbmcuCi0KLUBub2RlIEdldHRpbmcgU3RhcnRlZCBFeGFtcGxlCi1Ac2VjdGlvbiBFeGFtcGxlCi0KLUxldCdzIGNvbnNpZGVyIGEgdHJpdmlhbCBleGFtcGxlLgotCi1TdXBwb3NlIHdlIHdhbnQgdG8gd3JpdGUgYSBzaW1wbGUgdmVyc2lvbiBvZiBAc2FtcHt0b3VjaH0uICBPdXIgcHJvZ3JhbSwKLXdoaWNoIHdlIHdpbGwgY2FsbCBAc2FtcHtwb2tlfSwgd2lsbCB0YWtlIGEgc2luZ2xlIGZpbGUgbmFtZSBhcmd1bWVudCwKLWFuZCB1c2UgdGhlIEBzYW1we3V0aW1lfSBzeXN0ZW0gY2FsbCB0byBzZXQgdGhlIG1vZGlmaWNhdGlvbiBhbmQgYWNjZXNzCi10aW1lcyBvZiB0aGUgZmlsZSB0byB0aGUgY3VycmVudCB0aW1lLiAgV2Ugd2FudCB0aGlzIHByb2dyYW0gdG8gYmUKLWhpZ2hseSBwb3J0YWJsZS4KLQotV2UnbGwgZmlyc3Qgc2VlIHdoYXQgdGhpcyBsb29rcyBsaWtlIHdpdGhvdXQgdXNpbmcgYXV0b2NvbmYgYW5kCi1hdXRvbWFrZSwgYW5kIHRoZW4gc2VlIHdoYXQgaXQgbG9va3MgbGlrZSB3aXRoIHRoZW0uCi0KLUBtZW51Ci0qIEdldHRpbmcgU3RhcnRlZCBFeGFtcGxlIDE6OgkJRmlyc3QgVHJ5LgotKiBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZSAyOjoJCVNlY29uZCBUcnkuCi0qIEdldHRpbmcgU3RhcnRlZCBFeGFtcGxlIDM6OgkJVGhpcmQgVHJ5LgotKiBHZW5lcmF0ZSBGaWxlcyBpbiBFeGFtcGxlOjoJCUdlbmVyYXRlIEZpbGVzLgotQGVuZCBtZW51Ci0KLUBub2RlIEdldHRpbmcgU3RhcnRlZCBFeGFtcGxlIDEKLUBzdWJzZWN0aW9uIEZpcnN0IFRyeQotCi1IZXJlIGlzIG91ciBmaXJzdCB0cnkgYXQgQHNhbXB7cG9rZS5jfS4gIE5vdGUgdGhhdCB3ZSd2ZSB3cml0dGVuIGl0Ci13aXRob3V0IEFOU0kvSVNPIEMgcHJvdG90eXBlcywgc2luY2Ugd2Ugd2FudCBpdCB0byBiZSBoaWdobHkgcG9ydGFibGUuCi0KLUBleGFtcGxlCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1dGltZS5oPgotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLUB7Ci0gIGlmIChhcmdjICE9IDIpCi0gICAgQHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOiBwb2tlIGZpbGVcbiIpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgQH0KLQotICBpZiAodXRpbWUgKGFyZ3ZbMV0sIE5VTEwpIDwgMCkKLSAgICBAewotICAgICAgcGVycm9yICgidXRpbWUiKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIEB9Ci0KLSAgZXhpdCAoMCk7Ci1AfQotQGVuZCBleGFtcGxlCi0KLVdlIGFsc28gd3JpdGUgYSBzaW1wbGUgQGZpbGV7TWFrZWZpbGV9LgotCi1AZXhhbXBsZQotQ0MgPSBnY2MKLUNGTEFHUyA9IC1nIC1PMgotCi1hbGw6IHBva2UKLQotcG9rZTogcG9rZS5vCi0JJChDQykgLW8gcG9rZSAkKENGTEFHUykgJChMREZMQUdTKSBwb2tlLm8KLUBlbmQgZXhhbXBsZQotCi1TbyBmYXIsIHNvIGdvb2QuCi0KLVVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSBhIGZldyBwcm9ibGVtcy4KLQotT24gb2xkZXIgVW5peCBzeXN0ZW1zIGRlcml2ZWQgZnJvbSBCU0QgNC4zLCB0aGUgQHNhbXB7dXRpbWV9IHN5c3RlbSBjYWxsCi1kb2VzIG5vdCBhY2NlcHQgYSBzZWNvbmQgYXJndW1lbnQgb2YgQHNhbXB7TlVMTH0uICBPbiB0aG9zZSBzeXN0ZW1zLCB3ZQotbmVlZCB0byBwYXNzIGEgcG9pbnRlciB0byBAc2FtcHtzdHJ1Y3QgdXRpbWJ1Zn0gc3RydWN0dXJlLgotVW5mb3J0dW5hdGVseSwgZXZlbiBvbGRlciBzeXN0ZW1zIGRvbid0IGRlZmluZSB0aGF0IHN0cnVjdHVyZTsgb24gdGhvc2UKLXN5c3RlbXMsIHdlIG5lZWQgdG8gcGFzcyBhbiBhcnJheSBvZiB0d28gQHNhbXB7bG9uZ30gdmFsdWVzLgotCi1UaGUgaGVhZGVyIGZpbGUgQGZpbGV7c3RkbGliLmh9IHdhcyBpbnZlbnRlZCBieSBBTlNJIEMsIGFuZCBvbGRlcgotc3lzdGVtcyBkb24ndCBoYXZlIGEgY29weS4gIFdlIGluY2x1ZGVkIGl0IGFib3ZlIHRvIGdldCBhIGRlY2xhcmF0aW9uIG9mCi1Ac2FtcHtleGl0fS4KLQotV2UgY2FuIGZpbmQgc29tZSBvZiB0aGVzZSBwb3J0YWJpbGl0eSBwcm9ibGVtcyBieSBydW5uaW5nCi1Ac2FtcHthdXRvc2Nhbn0sIHdoaWNoIHdpbGwgY3JlYXRlIGEgQGZpbGV7Y29uZmlndXJlLnNjYW59IGZpbGUgd2hpY2ggd2UKLWNhbiB1c2UgYXMgYSBwcm90b3R5cGUgZm9yIG91ciBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUuICBJIHdvbid0IHNob3cKLXRoZSBvdXRwdXQsIGJ1dCBpdCB3aWxsIG5vdGljZSB0aGUgcG90ZW50aWFsIHByb2JsZW1zIHdpdGggQHNhbXB7dXRpbWV9Ci1hbmQgQGZpbGV7c3RkbGliLmh9LgotCi1JbiBvdXIgQGZpbGV7TWFrZWZpbGV9LCB3ZSBkb24ndCBwcm92aWRlIGFueSB3YXkgdG8gaW5zdGFsbCB0aGUgcHJvZ3JhbS4KLVRoaXMgZG9lc24ndCBtYXR0ZXIgbXVjaCBmb3Igc3VjaCBhIHNpbXBsZSBleGFtcGxlLCBidXQgYSByZWFsIHByb2dyYW0KLXdpbGwgbmVlZCBhbiBAc2FtcHtpbnN0YWxsfSB0YXJnZXQuICBGb3IgdGhhdCBtYXR0ZXIsIHdlIHdpbGwgYWxzbyB3YW50Ci1hIEBzYW1we2NsZWFufSB0YXJnZXQuCi0KLUBub2RlIEdldHRpbmcgU3RhcnRlZCBFeGFtcGxlIDIKLUBzdWJzZWN0aW9uIFNlY29uZCBUcnkKLQotSGVyZSBpcyBvdXIgc2Vjb25kIHRyeSBhdCB0aGlzIHByb2dyYW0uCi0KLVdlIG1vZGlmeSBAZmlsZXtwb2tlLmN9IHRvIHVzZSBwcmVwcm9jZXNzb3IgbWFjcm9zIHRvIGNvbnRyb2wgd2hhdAotZmVhdHVyZXMgYXJlIGF2YWlsYWJsZS4gIChJJ3ZlIGNoZWF0ZWQgYSBiaXQgYnkgdXNpbmcgdGhlIHNhbWUgbWFjcm8KLW5hbWVzIHdoaWNoIGF1dG9jb25mIHdpbGwgdXNlKS4KLQotQGV4YW1wbGUKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWZkZWYgSEFWRV9VVElNRV9ICi0jaW5jbHVkZSA8dXRpbWUuaD4KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfVVRJTUVfTlVMTAotCi0jaW5jbHVkZSA8dGltZS5oPgotCi0jaWZuZGVmIEhBVkVfU1RSVUNUX1VUSU1CVUYKLQotc3RydWN0IHV0aW1idWYKLUB7Ci0gIGxvbmcgYWN0aW1lOwotICBsb25nIG1vZHRpbWU7Ci1AfTsKLQotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLXV0aW1lX25vdyAoZmlsZSkKLSAgICAgY2hhciAqZmlsZTsKLUB7Ci0gIHN0cnVjdCB1dGltYnVmIG5vdzsKLQotICBub3cuYWN0aW1lID0gbm93Lm1vZHRpbWUgPSB0aW1lIChOVUxMKTsKLSAgcmV0dXJuIHV0aW1lIChmaWxlLCAmbm93KTsKLUB9Ci0KLSNkZWZpbmUgdXRpbWUoZiwgcCkgdXRpbWVfbm93IChmKQotCi0jZW5kaWYgLyogSEFWRV9VVElNRV9OVUxMICAqLwotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLUB7Ci0gIGlmIChhcmdjICE9IDIpCi0gICAgQHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOiBwb2tlIGZpbGVcbiIpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgQH0KLQotICBpZiAodXRpbWUgKGFyZ3ZbMV0sIE5VTEwpIDwgMCkKLSAgICBAewotICAgICAgcGVycm9yICgidXRpbWUiKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIEB9Ci0KLSAgZXhpdCAoMCk7Ci1AfQotQGVuZCBleGFtcGxlCi0KLUhlcmUgaXMgdGhlIGFzc29jaWF0ZWQgQGZpbGV7TWFrZWZpbGV9LiAgV2UndmUgYWRkZWQgc3VwcG9ydCBmb3IgdGhlCi1wcmVwcm9jZXNzb3IgZmxhZ3Mgd2UgdXNlLiAgV2UndmUgYWxzbyBhZGRlZCBAc2FtcHtpbnN0YWxsfSBhbmQKLUBzYW1we2NsZWFufSB0YXJnZXRzLgotCi1AZXhhbXBsZQotIyBTZXQgdGhpcyB0byB5b3VyIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCi1iaW5kaXIgPSAvdXNyL2xvY2FsL2JpbgotCi0jIFVuY29tbWVudCB0aGlzIGlmIHlvdSBoYXZlIHRoZSBzdGFuZGFyZCBBTlNJL0lTTyBDIGhlYWRlciBmaWxlcy4KLSMgU1REQ19IRFJTID0gLURTVERDX0hFQURFUlMKLQotIyBVbmNvbW1lbnQgdGhpcyBpZiB5b3UgaGF2ZSB1dGltZS5oLgotIyBVVElNRV9IID0gLURIQVZFX1VUSU1FX0gKLQotIyBVbmNvbW1lbnQgdGhpcyBpZiB1dGltZSAoRklMRSwgTlVMTCkgd29ya3Mgb24geW91ciBzeXN0ZW0uCi0jIFVUSU1FX05VTEwgPSAtREhBVkVfVVRJTUVfTlVMTAotCi0jIFVuY29tbWVudCB0aGlzIGlmIHN0cnVjdCB1dGltYnVmIGlzIGRlZmluZWQgaW4gdXRpbWUuaC4KLSMgVVRJTUJVRiA9IC1ESEFWRV9TVFJVQ1RfVVRJTUJVRgotCi1DQyA9IGdjYwotQ0ZMQUdTID0gLWcgLU8yCi0KLUFMTF9DRkxBR1MgPSAkKFNURENfSERSUykgJChVVElNRV9IKSAkKFVUSU1FX05VTEwpICQoVVRJTUJVRikgJChDRkxBR1MpCi0KLWFsbDogcG9rZQotCi1wb2tlOiBwb2tlLm8KLQkkKENDKSAtbyBwb2tlICQoQUxMX0NGTEFHUykgJChMREZMQUdTKSBwb2tlLm8KLQotLmMubzoKLQkkKENDKSAtYyAkKEFMTF9DRkxBR1MpIHBva2UuYwotCi1pbnN0YWxsOiBwb2tlCi0JY3AgcG9rZSAkKGJpbmRpcikvcG9rZQotCi1jbGVhbjoKLQlybSBwb2tlIHBva2UubwotQGVuZCBleGFtcGxlCi0KLVNvbWUgcHJvYmxlbXMgd2l0aCB0aGlzIGFwcHJvYWNoIHNob3VsZCBiZSBjbGVhci4KLQotVXNlcnMgd2hvIHdhbnQgdG8gY29tcGlsZSBwb2tlIHdpbGwgaGF2ZSB0byBrbm93IGhvdyBAc2FtcHt1dGltZX0gd29ya3MKLW9uIHRoZWlyIHN5c3RlbXMsIHNvIHRoYXQgdGhleSBjYW4gdW5jb21tZW50IHRoZSBAZmlsZXtNYWtlZmlsZX0KLWNvcnJlY3RseS4KLQotVGhlIGluc3RhbGxhdGlvbiBpcyBkb25lIHVzaW5nIEBzYW1we2NwfSwgYnV0IG1hbnkgc3lzdGVtcyBoYXZlIGFuCi1Ac2FtcHtpbnN0YWxsfSBwcm9ncmFtIHdoaWNoIG1heSBiZSB1c2VkLCBhbmQgd2hpY2ggc3VwcG9ydHMgb3B0aW9uYWwKLWZlYXR1cmVzIHN1Y2ggYXMgc3RyaXBwaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBvdXQgb2YgdGhlIGluc3RhbGxlZAotYmluYXJ5LgotCi1UaGUgdXNlIG9mIEBmaWxle01ha2VmaWxlfSB2YXJpYWJsZXMgbGlrZSBAc2FtcHtDQ30sIEBzYW1we0NGTEFHU30gYW5kCi1Ac2FtcHtMREZMQUdTfSBmb2xsb3dzIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIEdOVSBzdGFuZGFyZHMuICBUaGlzIGlzCi1jb252ZW5pZW50IGZvciBhbGwgcGFja2FnZXMsIHNpbmNlIGl0IHJlZHVjZXMgc3VycHJpc2VzIGZvciB1c2Vycy4KLUhvd2V2ZXIsIGl0IGlzIGVhc3kgdG8gZ2V0IHRoZSBkZXRhaWxzIHdyb25nLCBhbmQgd2luZCB1cCB3aXRoIGEKLXNsaWdodGx5IG5vbnN0YW5kYXJkIGRpc3RyaWJ1dGlvbi4KLQotQG5vZGUgR2V0dGluZyBTdGFydGVkIEV4YW1wbGUgMwotQHN1YnNlY3Rpb24gVGhpcmQgVHJ5Ci0KLUZvciBvdXIgdGhpcmQgdHJ5IGF0IHRoaXMgcHJvZ3JhbSwgd2Ugd2lsbCB3cml0ZSBhIEBmaWxle2NvbmZpZ3VyZS5pbn0KLXNjcmlwdCB0byBkaXNjb3ZlciB0aGUgY29uZmlndXJhdGlvbiBmZWF0dXJlcyBvbiB0aGUgaG9zdCBzeXN0ZW0sIHJhdGhlcgotdGhhbiByZXF1aXJpbmcgdGhlIHVzZXIgdG8gZWRpdCB0aGUgQGZpbGV7TWFrZWZpbGV9LiAgV2Ugd2lsbCBhbHNvIHdyaXRlCi1hIEBmaWxle01ha2VmaWxlLmFtfSByYXRoZXIgdGhhbiBhIEBmaWxle01ha2VmaWxlfS4KLQotVGhlIG9ubHkgY2hhbmdlIHRvIEBmaWxle3Bva2UuY30gaXMgdG8gYWRkIGEgbGluZSBhdCB0aGUgc3RhcnQgb2YgdGhlCi1maWxlOgotQHNtYWxsZXhhbXBsZQotI2luY2x1ZGUgImNvbmZpZy5oIgotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIG5ldyBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgaXMgYXMgZm9sbG93cy4KLQotQGV4YW1wbGUKLUFDX0lOSVQocG9rZS5jKQotQU1fSU5JVF9BVVRPTUFLRShwb2tlLCAxLjApCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLUFDX1BST0dfQ0MKLUFDX0hFQURFUl9TVERDCi1BQ19DSEVDS19IRUFERVJTKHV0aW1lLmgpCi1BQ19FR1JFUF9IRUFERVIodXRpbWJ1ZiwgdXRpbWUuaCwgQUNfREVGSU5FKEhBVkVfU1RSVUNUX1VUSU1CVUYpKQotQUNfRlVOQ19VVElNRV9OVUxMCi1BQ19PVVRQVVQoTWFrZWZpbGUpCi1AZW5kIGV4YW1wbGUKLQotVGhlIGZpcnN0IGZvdXIgbWFjcm9zIGluIHRoaXMgZmlsZSwgYW5kIHRoZSBsYXN0IG9uZSwgd2VyZSBkZXNjcmliZWQKLWFib3ZlOyBzZWUgQHJlZntXcml0ZSBjb25maWd1cmUuaW59LiAgSWYgd2Ugb21pdCB0aGVzZSBtYWNyb3MsIHRoZW4gd2hlbgotd2UgcnVuIEBzYW1we2F1dG9tYWtlfSB3ZSB3aWxsIGdldCBhIHJlbWluZGVyIHRoYXQgd2UgbmVlZCB0aGVtLgotCi1UaGUgb3RoZXIgbWFjcm9zIGFyZSBzdGFuZGFyZCBhdXRvY29uZiBtYWNyb3MuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gQUNfSEVBREVSX1NUREMKLUNoZWNrIGZvciBzdGFuZGFyZCBDIGhlYWRlcnMuCi1AaXRlbSBBQ19DSEVDS19IRUFERVJTCi1DaGVjayB3aGV0aGVyIGEgcGFydGljdWxhciBoZWFkZXIgZmlsZSBleGlzdHMuCi1AaXRlbSBBQ19FR1JFUF9IRUFERVIKLUNoZWNrIGZvciBhIHBhcnRpY3VsYXIgc3RyaW5nIGluIGEgcGFydGljdWxhciBoZWFkZXIgZmlsZSwgaW4gdGhpcyBjYXNlCi1jaGVja2luZyBmb3IgQHNhbXB7dXRpbWJ1Zn0gaW4gQGZpbGV7dXRpbWUuaH0uCi1AaXRlbSBBQ19GVU5DX1VUSU1FX05VTEwKLUNoZWNrIHdoZXRoZXIgQHNhbXB7dXRpbWV9IGFjY2VwdHMgYSBOVUxMIHNlY29uZCBhcmd1bWVudCB0byBzZXQgdGhlCi1maWxlIGNoYW5nZSB0aW1lIHRvIHRoZSBjdXJyZW50IHRpbWUuCi1AZW5kIHRhYmxlCi0KLVNlZSB0aGUgYXV0b2NvbmYgbWFudWFsIGZvciBhIG1vcmUgY29tcGxldGUgZGVzY3JpcHRpb24uCi0KLVRoZSBuZXcgQGZpbGV7TWFrZWZpbGUuYW19IGZpbGUgaXMgYXMgZm9sbG93cy4gIE5vdGUgaG93IHNpbXBsZSB0aGlzIGlzCi1jb21wYXJlZCB0byBvdXIgZWFybGllciBAZmlsZXtNYWtlZmlsZX0uCi0KLUBleGFtcGxlCi1iaW5fUFJPR1JBTVMgPSBwb2tlCi0KLXBva2VfU09VUkNFUyA9IHBva2UuYwotQGVuZCBleGFtcGxlCi0KLVRoaXMgbWVhbnMgdGhhdCB3ZSBzaG91bGQgYnVpbGQgYSBzaW5nbGUgcHJvZ3JhbSBuYW1lIEBzYW1we3Bva2V9LiAgSXQKLXNob3VsZCBiZSBpbnN0YWxsZWQgaW4gdGhlIGJpbmFyeSBkaXJlY3RvcnksIHdoaWNoIHdlIGNhbGxlZAotQHNhbXB7YmluZGlyfSBlYXJsaWVyLiAgVGhlIHByb2dyYW0gQHNhbXB7cG9rZX0gaXMgYnVpbHQgZnJvbSB0aGUgc291cmNlCi1maWxlIEBmaWxle3Bva2UuY30uCi0KLVdlIG11c3QgYWxzbyB3cml0ZSBhIEBmaWxle2FjY29uZmlnLmh9IGZpbGUuICBCZXNpZGVzIEBzYW1we1BBQ0tBR0V9IGFuZAotQHNhbXB7VkVSU0lPTn0sIHdoaWNoIG11c3QgYmUgbWVudGlvbmVkIGZvciBhbGwgcGFja2FnZXMgd2hpY2ggdXNlCi1hdXRvbWFrZSwgd2UgbXVzdCBpbmNsdWRlIEBzYW1we0hBVkVfU1RSVUNUX1VUSU1CVUZ9LCBzaW5jZSB3ZSBtZW50aW9uZWQKLWl0IGluIGFuIEBzYW1we0FDX0RFRklORX0uCi0KLUBleGFtcGxlCi0vKiBOYW1lIG9mIHBhY2thZ2UuICAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBvZiBwYWNrYWdlLiAgKi8KLSN1bmRlZiBWRVJTSU9OCi0KLS8qIFdoZXRoZXIgdXRpbWUuaCBkZWZpbmVzIHN0cnVjdCB1dGltYnVmLiAgKi8KLSN1bmRlZiBIQVZFX1NUUlVDVF9VVElNQlVGCi1AZW5kIGV4YW1wbGUKLQotQG5vZGUgR2VuZXJhdGUgRmlsZXMgaW4gRXhhbXBsZQotQHN1YnNlY3Rpb24gR2VuZXJhdGUgRmlsZXMKLQotV2UgbXVzdCBub3cgZ2VuZXJhdGUgdGhlIG90aGVyIGZpbGVzLCB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzLgotCi1Ac21hbGxleGFtcGxlCi1hY2xvY2FsCi1hdXRvY29uZgotYXV0b2hlYWRlcgotYXV0b21ha2UKLUBlbmQgc21hbGxleGFtcGxlCi0KLVdoZW4gd2UgcnVuIEBzYW1we2F1dG9oZWFkZXJ9LCBpdCB3aWxsIHJlbWluZCB1cyBvZiBhbnkgbWFjcm9zIHdlIGZvcmdvdAotdG8gYWRkIHRvIEBmaWxle2FjY29uZmlnLmh9LgotCi1XaGVuIHdlIHJ1biBAc2FtcHthdXRvbWFrZX0sIGl0IHdpbGwgd2FudCB0byBhZGQgc29tZSBmaWxlcyB0byBvdXIKLWRpc3RyaWJ1dGlvbi4gIEl0IHdpbGwgYWRkIHRoZW0gYXV0b21hdGljYWxseSBpZiB3ZSB1c2UgdGhlCi1Ac2FtcHstLWFkZC1taXNzaW5nfSBvcHRpb24uCi0KLUJ5IGRlZmF1bHQsIEBzYW1we2F1dG9tYWtlfSB3aWxsIHJ1biBpbiBHTlUgbW9kZSwgd2hpY2ggbWVhbnMgdGhhdCBpdAotd2lsbCB3YW50IHVzIHRvIGNyZWF0ZSBjZXJ0YWluIGFkZGl0aW9uYWwgZmlsZXM7IGFzIG9mIHRoaXMgd3JpdGluZywgaXQKLXdpbGwgd2FudCBAZmlsZXtORVdTfSwgQGZpbGV7UkVBRE1FfSwgQGZpbGV7QVVUSE9SU30sIGFuZAotQGZpbGV7Q2hhbmdlTG9nfSwgYWxsIG9mIHdoaWNoIGFyZSBmaWxlcyB3aGljaCBzaG91bGQgYXBwZWFyIGluIGEKLXN0YW5kYXJkIEdOVSBkaXN0cmlidXRpb24uICBXZSBjYW4gZWl0aGVyIGFkZCB0aG9zZSBmaWxlcywgb3IgcnVuCi1Ac2FtcHthdXRvbWFrZX0gd2l0aCB0aGUgQHNhbXB7LS1mb3JlaWdufSBvcHRpb24uCi0KLVJ1bm5pbmcgdGhlc2UgdG9vbHMgd2lsbCBnZW5lcmF0ZSB0aGUgZm9sbG93aW5nIGZpbGVzLCBhbGwgb2Ygd2hpY2ggYXJlCi1kZXNjcmliZWQgaW4gdGhlIG5leHQgY2hhcHRlci4KLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUBmaWxle2FjbG9jYWwubTR9Ci1AaXRlbQotQGZpbGV7Y29uZmlndXJlfQotQGl0ZW0KLUBmaWxle2NvbmZpZy5pbn0KLUBpdGVtCi1AZmlsZXtNYWtlZmlsZS5pbn0KLUBpdGVtCi1AZmlsZXtzdGFtcC1oLmlufQotQGVuZCBpdGVtaXplCi0KLUBub2RlIEZpbGVzCi1AY2hhcHRlciBGaWxlcwotCi1BcyB3YXMgc2VlbiBpbiB0aGUgcHJldmlvdXMgY2hhcHRlciwgdGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbQotdXNlcyBhIG51bWJlciBvZiBkaWZmZXJlbnQgZmlsZXMuICBUaGUgZGV2ZWxvcGVyIG11c3Qgd3JpdGUgYSBmZXcgZmlsZXMuCi1UaGUgb3RoZXJzIGFyZSBnZW5lcmF0ZWQgYnkgdmFyaW91cyB0b29scy4KLQotVGhlIHN5c3RlbSBpcyByYXRoZXIgZmxleGlibGUsIGFuZCBjYW4gYmUgdXNlZCBpbiBtYW55IGRpZmZlcmVudCB3YXlzLgotSW4gZGVzY3JpYmluZyB0aGUgZmlsZXMgdGhhdCBpdCB1c2VzLCBJIHdpbGwgZGVzY3JpYmUgdGhlIGNvbW1vbiBjYXNlLAotYW5kIG1lbnRpb24gc29tZSBvdGhlciBjYXNlcyB0aGF0IG1heSBhcmlzZS4KLQotQG1lbnUKLSogRGV2ZWxvcGVyIEZpbGVzOjoJCURldmVsb3BlciBGaWxlcy4KLSogQnVpbGQgRmlsZXM6OgkJCUJ1aWxkIEZpbGVzLgotKiBTdXBwb3J0IEZpbGVzOjoJCVN1cHBvcnQgRmlsZXMuCi1AZW5kIG1lbnUKLQotQG5vZGUgRGV2ZWxvcGVyIEZpbGVzCi1Ac2VjdGlvbiBEZXZlbG9wZXIgRmlsZXMKLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZmlsZXMgd3JpdHRlbiBvciBnZW5lcmF0ZWQgYnkgdGhlIGRldmVsb3Blcgotb2YgYSBwYWNrYWdlLgotCi1AbWVudQotKiBEZXZlbG9wZXIgRmlsZXMgUGljdHVyZTo6CURldmVsb3BlciBGaWxlcyBQaWN0dXJlLgotKiBXcml0dGVuIERldmVsb3BlciBGaWxlczo6CVdyaXR0ZW4gRGV2ZWxvcGVyIEZpbGVzLgotKiBHZW5lcmF0ZWQgRGV2ZWxvcGVyIEZpbGVzOjoJR2VuZXJhdGVkIERldmVsb3BlciBGaWxlcy4KLUBlbmQgbWVudQotCi1Abm9kZSBEZXZlbG9wZXIgRmlsZXMgUGljdHVyZQotQHN1YnNlY3Rpb24gRGV2ZWxvcGVyIEZpbGVzIFBpY3R1cmUKLQotSGVyZSBpcyBhIHBpY3R1cmUgb2YgdGhlIGZpbGVzIHdoaWNoIGFyZSB3cml0dGVuIGJ5IHRoZSBkZXZlbG9wZXIsIHRoZQotZ2VuZXJhdGVkIGZpbGVzIHdoaWNoIHdvdWxkIGJlIGluY2x1ZGVkIHdpdGggYSBjb21wbGV0ZSBzb3VyY2UKLWRpc3RyaWJ1dGlvbiwgYW5kIHRoZSB0b29scyB3aGljaCBjcmVhdGUgdGhvc2UgZmlsZXMuCi1AaWZpbmZvCi1UaGUgZmlsZSBuYW1lcyBhcmUgcGxhaW4gdGV4dCBhbmQgdGhlIHRvb2wgbmFtZXMgYXJlIGVuY2xvc2VkIGJ5Ci1Ac2FtcHsqfSBjaGFyYWN0ZXJzCi1AZW5kIGlmaW5mbwotQGlmbm90aW5mbwotVGhlIGZpbGUgbmFtZXMgYXJlIGluIHJlY3RhbmdsZXMgd2l0aCBzcXVhcmUgY29ybmVycyBhbmQgdGhlIHRvb2wgbmFtZXMKLWFyZSBpbiByZWN0YW5nbGVzIHdpdGggcm91bmRlZCBjb3JuZXJzCi1AZW5kIGlmbm90aW5mbwotKGUuZy4sIEBzYW1we2F1dG9oZWFkZXJ9IGlzIHRoZSBuYW1lIG9mIGEgdG9vbCwgbm90IHRoZSBuYW1lIG9mIGEgZmlsZSkuCi0KLUBpbWFnZXtjb25maWdkZXZ9Ci0KLUBub2RlIFdyaXR0ZW4gRGV2ZWxvcGVyIEZpbGVzCi1Ac3Vic2VjdGlvbiBXcml0dGVuIERldmVsb3BlciBGaWxlcwotCi1UaGUgZm9sbG93aW5nIGZpbGVzIHdvdWxkIGJlIHdyaXR0ZW4gYnkgdGhlIGRldmVsb3Blci4KLQotQHRhYmxlIEBmaWxlCi1AaXRlbSBjb25maWd1cmUuaW4KLUBjaW5kZXggQGZpbGV7Y29uZmlndXJlLmlufQotVGhpcyBpcyB0aGUgY29uZmlndXJhdGlvbiBzY3JpcHQuICBUaGlzIHNjcmlwdCBjb250YWlucyBpbnZvY2F0aW9ucyBvZgotYXV0b2NvbmYgbWFjcm9zLiAgSXQgbWF5IGFsc28gY29udGFpbiBvcmRpbmFyeSBzaGVsbCBzY3JpcHQgY29kZS4gIFRoaXMKLWZpbGUgd2lsbCBjb250YWluIGZlYXR1cmUgdGVzdHMgZm9yIHBvcnRhYmlsaXR5IGlzc3Vlcy4gIFRoZSBsYXN0IHRoaW5nCi1pbiB0aGUgZmlsZSB3aWxsIG5vcm1hbGx5IGJlIGFuIEBzYW1we0FDX09VVFBVVH0gbWFjcm8gbGlzdGluZyB3aGljaAotZmlsZXMgdG8gY3JlYXRlIHdoZW4gdGhlIGJ1aWxkZXIgcnVucyB0aGUgY29uZmlndXJlIHNjcmlwdC4gIFRoaXMgZmlsZQotaXMgYWx3YXlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgdGhlIEdOVSBjb25maWd1cmUgc3lzdGVtLiAgQHhyZWZ7V3JpdGUKLWNvbmZpZ3VyZS5pbn0uCi0KLUBpdGVtIE1ha2VmaWxlLmFtCi1AY2luZGV4IEBmaWxle01ha2VmaWxlLmFtfQotVGhpcyBpcyB0aGUgYXV0b21ha2UgaW5wdXQgZmlsZS4gIEl0IGRlc2NyaWJlcyBob3cgdGhlIGNvZGUgc2hvdWxkIGJlCi1idWlsdC4gIEl0IGNvbnNpc3RzIG9mIGRlZmluaXRpb25zIG9mIGF1dG9tYWtlIHZhcmlhYmxlcy4gIEl0IG1heSBhbHNvCi1jb250YWluIG9yZGluYXJ5IE1ha2VmaWxlIHRhcmdldHMuICBUaGlzIGZpbGUgaXMgb25seSBuZWVkZWQgd2hlbiB1c2luZwotYXV0b21ha2UgKG5ld2VyIHRvb2xzIG5vcm1hbGx5IHVzZSBhdXRvbWFrZSwgYnV0IHRoZXJlIGFyZSBzdGlsbCBvbGRlcgotdG9vbHMgd2hpY2ggaGF2ZSBub3QgYmVlbiBjb252ZXJ0ZWQsIGluIHdoaWNoIHRoZSBkZXZlbG9wZXIgd3JpdGVzCi1AZmlsZXtNYWtlZmlsZS5pbn0gZGlyZWN0bHkpLiAgQHhyZWZ7V3JpdGUgTWFrZWZpbGUuYW19LgotCi1AaXRlbSBhY2NvbmZpZy5oCi1AY2luZGV4IEBmaWxle2FjY29uZmlnLmh9Ci1XaGVuIHRoZSBjb25maWd1cmUgc2NyaXB0IGNyZWF0ZXMgYSBwb3J0YWJpbGl0eSBoZWFkZXIgZmlsZSwgYnkgdXNpbmcKLUBzYW1we0FNX0NPTkZJR19IRUFERVJ9IChvciwgaWYgbm90IHVzaW5nIGF1dG9tYWtlLAotQHNhbXB7QUNfQ09ORklHX0hFQURFUn0pLCB0aGlzIGZpbGUgaXMgdXNlZCB0byBkZXNjcmliZSBtYWNyb3Mgd2hpY2ggYXJlCi1ub3QgcmVjb2duaXplZCBieSB0aGUgQHNhbXB7YXV0b2hlYWRlcn0gY29tbWFuZC4gIFRoaXMgaXMgbm9ybWFsbHkgYQotZmFpcmx5IHVuaW50ZXJlc3RpbmcgZmlsZSwgY29uc2lzdGluZyBvZiBhIGNvbGxlY3Rpb24gb2YgQHNhbXB7I3VuZGVmfQotbGluZXMgd2l0aCBjb21tZW50cy4gIE5vcm1hbGx5IGFueSBjYWxsIHRvIEBzYW1we0FDX0RFRklORX0gaW4KLUBmaWxle2NvbmZpZ3VyZS5pbn0gd2lsbCByZXF1aXJlIGEgbGluZSBpbiB0aGlzIGZpbGUuIEB4cmVme1dyaXRlCi1hY2NvbmZpZy5ofS4KLQotQGl0ZW0gYWNpbmNsdWRlLm00Ci1AY2luZGV4IEBmaWxle2FjaW5jbHVkZS5tNH0KLVRoaXMgZmlsZSBpcyBub3QgYWx3YXlzIHJlcXVpcmVkLiAgSXQgZGVmaW5lcyBsb2NhbCBhdXRvY29uZiBtYWNyb3MuCi1UaGVzZSBtYWNyb3MgbWF5IHRoZW4gYmUgdXNlZCBpbiBAZmlsZXtjb25maWd1cmUuaW59LiAgSWYgeW91IGRvbid0IG5lZWQKLWFueSBsb2NhbCBhdXRvY29uZiBtYWNyb3MsIHRoZW4geW91IGRvbid0IG5lZWQgdGhpcyBmaWxlIGF0IGFsbC4gIEluCi1mYWN0LCBpbiBnZW5lcmFsLCB5b3UgbmV2ZXIgbmVlZCBsb2NhbCBhdXRvY29uZiBtYWNyb3MsIHNpbmNlIHlvdSBjYW4KLXB1dCBldmVyeXRoaW5nIGluIEBmaWxle2NvbmZpZ3VyZS5pbn0sIGJ1dCBzb21ldGltZXMgYSBsb2NhbCBtYWNybyBpcwotY29udmVuaWVudC4KLQotTmV3ZXIgdG9vbHMgbWF5IG9taXQgQGZpbGV7YWNpbmNsdWRlLm00fSwgYW5kIGluc3RlYWQgdXNlIGEKLXN1YmRpcmVjdG9yeSwgdHlwaWNhbGx5IG5hbWVkIEBmaWxle200fSwgYW5kIGRlZmluZQotQHNhbXB7QUNMT0NBTF9BTUZMQUdTID0gLUkgbTR9IGluIEBmaWxle01ha2VmaWxlLmFtfSB0byBmb3JjZQotQHNhbXB7YWNsb2NhbH0gdG8gbG9vayB0aGVyZSBmb3IgbWFjcm8gZGVmaW5pdGlvbnMuICBUaGUgbWFjcm8KLWRlZmluaXRpb25zIGFyZSB0aGVuIHBsYWNlZCBpbiBzZXBhcmF0ZSBmaWxlcyBpbiB0aGF0IGRpcmVjdG9yeS4KLQotVGhlIEBmaWxle2FjaW5jbHVkZS5tNH0gZmlsZSBpcyBvbmx5IHVzZWQgd2hlbiB1c2luZyBhdXRvbWFrZTsgaW4gb2xkZXIKLXRvb2xzLCB0aGUgZGV2ZWxvcGVyIHdyaXRlcyBAZmlsZXthY2xvY2FsLm00fSBkaXJlY3RseSwgaWYgaXQgaXMgbmVlZGVkLgotQGVuZCB0YWJsZQotCi1Abm9kZSBHZW5lcmF0ZWQgRGV2ZWxvcGVyIEZpbGVzCi1Ac3Vic2VjdGlvbiBHZW5lcmF0ZWQgRGV2ZWxvcGVyIEZpbGVzCi0KLVRoZSBmb2xsb3dpbmcgZmlsZXMgd291bGQgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBkZXZlbG9wZXIuCi0KLVdoZW4gdXNpbmcgYXV0b21ha2UsIHRoZXNlIGZpbGVzIGFyZSBub3JtYWxseSBub3QgZ2VuZXJhdGVkIG1hbnVhbGx5Ci1hZnRlciB0aGUgZmlyc3QgdGltZS4gIEluc3RlYWQsIHRoZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9IGNvbnRhaW5zCi1ydWxlcyB0byBhdXRvbWF0aWNhbGx5IHJlYnVpbGQgdGhlIGZpbGVzIGFzIHJlcXVpcmVkLiAgV2hlbgotQHNhbXB7QU1fTUFJTlRBSU5FUl9NT0RFfSBpcyB1c2VkIGluIEBmaWxle2NvbmZpZ3VyZS5pbn0gKHRoZSBub3JtYWwKLWNhc2UgaW4gQ3lnbnVzIGNvZGUpLCB0aGUgYXV0b21hdGljIHJlYnVpbGRpbmcgcnVsZXMgd2lsbCBvbmx5IGJlCi1kZWZpbmVkIGlmIHlvdSBjb25maWd1cmUgdXNpbmcgdGhlIEBzYW1wey0tZW5hYmxlLW1haW50YWluZXItbW9kZX0KLW9wdGlvbi4KLQotV2hlbiB1c2luZyBhdXRvbWF0aWMgcmVidWlsZGluZywgaXQgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSB0aGF0IGFsbCB0aGUKLXZhcmlvdXMgdG9vbHMgaGF2ZSBiZWVuIGJ1aWx0IGFuZCBpbnN0YWxsZWQgb24geW91ciBAc2FtcHtQQVRIfS4gIFVzaW5nCi1hdXRvbWF0aWMgcmVidWlsZGluZyBpcyBoaWdobHkgcmVjb21tZW5kZWQsIHNvIG11Y2ggc28gdGhhdCBJJ20gbm90Ci1nb2luZyB0byBleHBsYWluIHdoYXQgeW91IGhhdmUgdG8gZG8gaWYgeW91IGRvbid0IHVzZSBpdC4KLQotQHRhYmxlIEBmaWxlCi1AaXRlbSBjb25maWd1cmUKLUBjaW5kZXggQGZpbGV7Y29uZmlndXJlfQotVGhpcyBpcyB0aGUgY29uZmlndXJlIHNjcmlwdCB3aGljaCB3aWxsIGJlIHJ1biB3aGVuIGJ1aWxkaW5nIHRoZQotcGFja2FnZS4gIFRoaXMgaXMgZ2VuZXJhdGVkIGJ5IEBzYW1we2F1dG9jb25mfSBmcm9tIEBmaWxle2NvbmZpZ3VyZS5pbn0KLWFuZCBAZmlsZXthY2xvY2FsLm00fS4gIFRoaXMgaXMgYSBzaGVsbCBzY3JpcHQuCi0KLUBpdGVtIE1ha2VmaWxlLmluCi1AY2luZGV4IEBmaWxle01ha2VmaWxlLmlufQotVGhpcyBpcyB0aGUgZmlsZSB3aGljaCB0aGUgY29uZmlndXJlIHNjcmlwdCB3aWxsIHR1cm4gaW50byB0aGUKLUBmaWxle01ha2VmaWxlfSBhdCBidWlsZCB0aW1lLiAgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieQotQHNhbXB7YXV0b21ha2V9IGZyb20gQGZpbGV7TWFrZWZpbGUuYW19LiAgSWYgeW91IGFyZW4ndCB1c2luZyBhdXRvbWFrZSwKLXlvdSBtdXN0IHdyaXRlIHRoaXMgZmlsZSB5b3Vyc2VsZi4gIFRoaXMgZmlsZSBpcyBwcmV0dHkgbXVjaCBhIG5vcm1hbAotQGZpbGV7TWFrZWZpbGV9LCB3aXRoIHNvbWUgY29uZmlndXJlIHN1YnN0aXR1dGlvbnMgZm9yIGNlcnRhaW4KLXZhcmlhYmxlcy4KLQotQGl0ZW0gYWNsb2NhbC5tNAotQGNpbmRleCBAZmlsZXthY2xvY2FsLm00fQotVGhpcyBmaWxlIGlzIGNyZWF0ZWQgYnkgdGhlIEBzYW1we2FjbG9jYWx9IHByb2dyYW0sIGJhc2VkIG9uIHRoZQotY29udGVudHMgb2YgQGZpbGV7Y29uZmlndXJlLmlufSBhbmQgQGZpbGV7YWNpbmNsdWRlLm00fSAob3IsIGFzIG5vdGVkIGluCi10aGUgZGVzY3JpcHRpb24gb2YgQGZpbGV7YWNpbmNsdWRlLm00fSBhYm92ZSwgb24gdGhlIGNvbnRlbnRzIG9mIGFuCi1AZmlsZXttNH0gc3ViZGlyZWN0b3J5KS4gIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBvZiBhdXRvY29uZgotbWFjcm9zIHdoaWNoIEBzYW1we2F1dG9jb25mfSB3aWxsIHVzZSB3aGVuIGdlbmVyYXRpbmcgdGhlIGZpbGUKLUBmaWxle2NvbmZpZ3VyZX0uICBUaGVzZSBhdXRvY29uZiBtYWNyb3MgbWF5IGJlIGRlZmluZWQgYnkgeW91IGluCi1AZmlsZXthY2luY2x1ZGUubTR9IG9yIHRoZXkgbWF5IGJlIGRlZmluZWQgYnkgb3RoZXIgcGFja2FnZXMgc3VjaCBhcwotYXV0b21ha2UsIGxpYnRvb2wgb3IgZ2V0dGV4dC4gIElmIHlvdSBhcmVuJ3QgdXNpbmcgYXV0b21ha2UsIHlvdSB3aWxsCi1ub3JtYWxseSB3cml0ZSB0aGlzIGZpbGUgeW91cnNlbGY7IGluIHRoYXQgY2FzZSwgaWYgQGZpbGV7Y29uZmlndXJlLmlufQotdXNlcyBvbmx5IHN0YW5kYXJkIGF1dG9jb25mIG1hY3JvcywgdGhpcyBmaWxlIHdpbGwgbm90IGJlIG5lZWRlZCBhdCBhbGwuCi0KLUBpdGVtIGNvbmZpZy5pbgotQGNpbmRleCBAZmlsZXtjb25maWcuaW59Ci1AY2luZGV4IEBmaWxle2NvbmZpZy5oLmlufQotVGhpcyBmaWxlIGlzIGNyZWF0ZWQgYnkgQHNhbXB7YXV0b2hlYWRlcn0gYmFzZWQgb24gQGZpbGV7YWNjb25maWcuaH0gYW5kCi1AZmlsZXtjb25maWd1cmUuaW59LiAgQXQgYnVpbGQgdGltZSwgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2lsbCBkZWZpbmUKLXNvbWUgb2YgdGhlIG1hY3JvcyBpbiBpdCB0byBjcmVhdGUgQGZpbGV7Y29uZmlnLmh9LCB3aGljaCBtYXkgdGhlbiBiZQotaW5jbHVkZWQgYnkgeW91ciBwcm9ncmFtLiAgVGhpcyBwZXJtaXRzIHlvdXIgQyBjb2RlIHRvIHVzZSBwcmVwcm9jZXNzb3IKLWNvbmRpdGlvbmFscyB0byBjaGFuZ2UgaXRzIGJlaGF2aW91ciBiYXNlZCBvbiB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZQotaG9zdCBzeXN0ZW0uICBUaGlzIGZpbGUgbWF5IGFsc28gYmUgY2FsbGVkIEBmaWxle2NvbmZpZy5oLmlufS4KLQotQGl0ZW0gc3RhbXAuaC1pbgotQGNpbmRleCBAZmlsZXtzdGFtcC1oLmlufQotVGhpcyByYXRoZXIgdW5pbnRlcmVzdGluZyBmaWxlLCB3aGljaCBJIG9taXR0ZWQgZnJvbSB0aGUgcGljdHVyZSwgaXMKLWdlbmVyYXRlZCBieSBAc2FtcHthdXRvbWFrZX0uICBJdCBhbHdheXMgY29udGFpbnMgdGhlIHN0cmluZwotQHNhbXB7dGltZXN0YW1wfS4gIEl0IGlzIHVzZWQgYXMgYSB0aW1lc3RhbXAgZmlsZSBpbmRpY2F0aW5nIHdoZXRoZXIKLUBmaWxle2NvbmZpZy5pbn0gaXMgdXAgdG8gZGF0ZS4gIFVzaW5nIGEgdGltZXN0YW1wIGZpbGUgbWVhbnMgdGhhdAotQGZpbGV7Y29uZmlnLmlufSBjYW4gYmUgbWFya2VkIGFzIHVwIHRvIGRhdGUgd2l0aG91dCBhY3R1YWxseSBjaGFuZ2luZwotaXRzIG1vZGlmaWNhdGlvbiB0aW1lLiAgVGhpcyBpcyB1c2VmdWwgc2luY2UgQGZpbGV7Y29uZmlnLmlufSBkZXBlbmRzCi11cG9uIEBmaWxle2NvbmZpZ3VyZS5pbn0sIGJ1dCBpdCBpcyBlYXN5IHRvIGNoYW5nZSBAZmlsZXtjb25maWd1cmUuaW59Ci1pbiBhIHdheSB3aGljaCBkb2VzIG5vdCBhZmZlY3QgQGZpbGV7Y29uZmlnLmlufS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQnVpbGQgRmlsZXMKLUBzZWN0aW9uIEJ1aWxkIEZpbGVzCi0KLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGZpbGVzIHdoaWNoIGFyZSBjcmVhdGVkIGF0IGNvbmZpZ3VyZSBhbmQKLWJ1aWxkIHRpbWUuICBUaGVzZSBhcmUgdGhlIGZpbGVzIHdoaWNoIHNvbWVib2R5IHdobyBidWlsZHMgdGhlIHBhY2thZ2UKLXdpbGwgc2VlLgotCi1PZiBjb3Vyc2UsIHRoZSBkZXZlbG9wZXIgd2lsbCBhbHNvIGJ1aWxkIHRoZSBwYWNrYWdlLiAgVGhlIGRpc3RpbmN0aW9uCi1iZXR3ZWVuIGRldmVsb3BlciBmaWxlcyBhbmQgYnVpbGQgZmlsZXMgaXMgbm90IHRoYXQgdGhlIGRldmVsb3BlciBkb2VzCi1ub3Qgc2VlIHRoZSBidWlsZCBmaWxlcywgYnV0IHRoYXQgc29tZWJvZHkgd2hvIG9ubHkgYnVpbGRzIHRoZSBwYWNrYWdlCi1kb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBkZXZlbG9wZXIgZmlsZXMuCi0KLUBtZW51Ci0qIEJ1aWxkIEZpbGVzIFBpY3R1cmU6OgkJQnVpbGQgRmlsZXMgUGljdHVyZS4KLSogQnVpbGQgRmlsZXMgRGVzY3JpcHRpb246OglCdWlsZCBGaWxlcyBEZXNjcmlwdGlvbi4KLUBlbmQgbWVudQotCi1Abm9kZSBCdWlsZCBGaWxlcyBQaWN0dXJlCi1Ac3Vic2VjdGlvbiBCdWlsZCBGaWxlcyBQaWN0dXJlCi0KLUhlcmUgaXMgYSBwaWN0dXJlIG9mIHRoZSBmaWxlcyB3aGljaCB3aWxsIGJlIGNyZWF0ZWQgYXQgYnVpbGQgdGltZS4KLUBmaWxle2NvbmZpZy5zdGF0dXN9IGlzIGJvdGggYSBjcmVhdGVkIGZpbGUgYW5kIGEgc2hlbGwgc2NyaXB0IHdoaWNoIGlzCi1ydW4gdG8gY3JlYXRlIG90aGVyIGZpbGVzLCBhbmQgdGhlIHBpY3R1cmUgYXR0ZW1wdHMgdG8gc2hvdyB0aGF0LgotCi1AaW1hZ2V7Y29uZmlnYnVpbGR9Ci0KLUBub2RlIEJ1aWxkIEZpbGVzIERlc2NyaXB0aW9uCi1Ac3Vic2VjdGlvbiBCdWlsZCBGaWxlcyBEZXNjcmlwdGlvbgotCi1UaGlzIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZpbGVzIHdoaWNoIGFyZSBjcmVhdGVkIGF0IGJ1aWxkIHRpbWUuCi0KLUB0YWJsZSBAZmlsZQotQGl0ZW0gY29uZmlnLnN0YXR1cwotQGNpbmRleCBAZmlsZXtjb25maWcuc3RhdHVzfQotVGhlIGZpcnN0IHN0ZXAgaW4gYnVpbGRpbmcgYSBwYWNrYWdlIGlzIHRvIHJ1biB0aGUgQGZpbGV7Y29uZmlndXJlfQotc2NyaXB0LiAgVGhlIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IHdpbGwgY3JlYXRlIHRoZSBmaWxlCi1AZmlsZXtjb25maWcuc3RhdHVzfSwgd2hpY2ggaXMgaXRzZWxmIGEgc2hlbGwgc2NyaXB0LiAgV2hlbiB5b3UgZmlyc3QKLXJ1biBAZmlsZXtjb25maWd1cmV9LCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgcnVuIEBmaWxle2NvbmZpZy5zdGF0dXN9LgotQW4gQGZpbGV7TWFrZWZpbGV9IGRlcml2ZWQgZnJvbSBhbiBhdXRvbWFrZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGUuaW59Ci13aWxsIGNvbnRhaW4gcnVsZXMgdG8gYXV0b21hdGljYWxseSBydW4gQGZpbGV7Y29uZmlnLnN0YXR1c30gYWdhaW4gd2hlbgotbmVjZXNzYXJ5IHRvIHJlY3JlYXRlIGNlcnRhaW4gZmlsZXMgaWYgdGhlaXIgaW5wdXRzIGNoYW5nZS4KLQotQGl0ZW0gTWFrZWZpbGUKLUBjaW5kZXggQGZpbGV7TWFrZWZpbGV9Ci1UaGlzIGlzIHRoZSBmaWxlIHdoaWNoIG1ha2Ugd2lsbCByZWFkIHRvIGJ1aWxkIHRoZSBwcm9ncmFtLiAgVGhlCi1AZmlsZXtjb25maWcuc3RhdHVzfSBzY3JpcHQgd2lsbCB0cmFuc2Zvcm0gQGZpbGV7TWFrZWZpbGUuaW59IGludG8KLUBmaWxle01ha2VmaWxlfS4KLQotQGl0ZW0gY29uZmlnLmgKLUBjaW5kZXggQGZpbGV7Y29uZmlnLmh9Ci1UaGlzIGZpbGUgZGVmaW5lcyBDIHByZXByb2Nlc3NvciBtYWNyb3Mgd2hpY2ggQyBjb2RlIGNhbiB1c2UgdG8gYWRqdXN0Ci1pdHMgYmVoYXZpb3VyIG9uIGRpZmZlcmVudCBzeXN0ZW1zLiAgVGhlIEBmaWxle2NvbmZpZy5zdGF0dXN9IHNjcmlwdAotd2lsbCB0cmFuc2Zvcm0gQGZpbGV7Y29uZmlnLmlufSBpbnRvIEBmaWxle2NvbmZpZy5ofS4KLQotQGl0ZW0gY29uZmlnLmNhY2hlCi1AY2luZGV4IEBmaWxle2NvbmZpZy5jYWNoZX0KLVRoaXMgZmlsZSBkaWQgbm90IGZpdCBuZWF0bHkgaW50byB0aGUgcGljdHVyZSwgYW5kIEkgb21pdHRlZCBpdC4gIEl0IGlzCi11c2VkIGJ5IHRoZSBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCB0byBjYWNoZSByZXN1bHRzIGJldHdlZW4gcnVucy4gIFRoaXMKLWNhbiBiZSBhbiBpbXBvcnRhbnQgc3BlZWR1cC4gIElmIHlvdSBtb2RpZnkgQGZpbGV7Y29uZmlndXJlLmlufSBpbiBzdWNoCi1hIHdheSB0aGF0IHRoZSByZXN1bHRzIG9mIG9sZCB0ZXN0cyBzaG91bGQgY2hhbmdlIChwZXJoYXBzIHlvdSBoYXZlCi1hZGRlZCBhIG5ldyBsaWJyYXJ5IHRvIEBzYW1we0xERkxBR1N9KSwgdGhlbiB5b3Ugd2lsbCBoYXZlIHRvIHJlbW92ZQotQGZpbGV7Y29uZmlnLmNhY2hlfSB0byBmb3JjZSB0aGUgdGVzdHMgdG8gYmUgcmVydW4uCi0KLVRoZSBhdXRvY29uZiBtYW51YWwgZXhwbGFpbnMgaG93IHRvIHNldCB1cCBhIHNpdGUgc3BlY2lmaWMgY2FjaGUgZmlsZS4KLVRoaXMgY2FuIHNwZWVkIHVwIHJ1bm5pbmcgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHRzIG9uIHlvdXIgc3lzdGVtLgotCi1AaXRlbSBzdGFtcC5oCi1AY2luZGV4IEBmaWxle3N0YW1wLWh9Ci1UaGlzIGZpbGUsIHdoaWNoIEkgb21pdHRlZCBmcm9tIHRoZSBwaWN0dXJlLCBpcyBzaW1pbGFyIHRvCi1AZmlsZXtzdGFtcC1oLmlufS4gIEl0IGlzIHVzZWQgYXMgYSB0aW1lc3RhbXAgZmlsZSBpbmRpY2F0aW5nIHdoZXRoZXIKLUBmaWxle2NvbmZpZy5ofSBpcyB1cCB0byBkYXRlLiAgVGhpcyBpcyB1c2VmdWwgc2luY2UgQGZpbGV7Y29uZmlnLmh9Ci1kZXBlbmRzIHVwb24gQGZpbGV7Y29uZmlnLnN0YXR1c30sIGJ1dCBpdCBpcyBlYXN5IGZvcgotQGZpbGV7Y29uZmlnLnN0YXR1c30gdG8gY2hhbmdlIGluIGEgd2F5IHdoaWNoIGRvZXMgbm90IGFmZmVjdAotQGZpbGV7Y29uZmlnLmh9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBTdXBwb3J0IEZpbGVzCi1Ac2VjdGlvbiBTdXBwb3J0IEZpbGVzCi0KLVRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0gcmVxdWlyZXMgc2V2ZXJhbCBzdXBwb3J0IGZpbGVzIHRvIGJlCi1pbmNsdWRlZCB3aXRoIHlvdXIgZGlzdHJpYnV0aW9uLiAgWW91IGRvIG5vdCBub3JtYWxseSBuZWVkIHRvIGNvbmNlcm4KLXlvdXJzZWxmIHdpdGggdGhlc2UuICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBDeWdudXMgdHJlZSwgbW9zdCBhcmUgYWxyZWFkeQotcHJlc2VudC4gIE90aGVyd2lzZSwgdGhleSB3aWxsIGJlIGluc3RhbGxlZCB3aXRoIHlvdXIgc291cmNlIGJ5Ci1Ac2FtcHthdXRvbWFrZX0gKHdpdGggdGhlIEBzYW1wey0tYWRkLW1pc3Npbmd9IG9wdGlvbikgYW5kCi1Ac2FtcHtsaWJ0b29saXplfS4KLQotWW91IGRvbid0IGhhdmUgdG8gcHV0IHRoZSBzdXBwb3J0IGZpbGVzIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5LiAgWW91Ci1jYW4gcHV0IHRoZW0gaW4gYSBzdWJkaXJlY3RvcnksIGFuZCB1c2UgdGhlIEBzYW1we0FDX0NPTkZJR19BVVhfRElSfQotbWFjcm8gaW4gQGZpbGV7Y29uZmlndXJlLmlufSB0byB0ZWxsIEBzYW1we2F1dG9tYWtlfSBhbmQgdGhlCi1AZmlsZXtjb25maWd1cmV9IHNjcmlwdCB3aGVyZSB0aGV5IGFyZS4KLQotSW4gdGhpcyBzZWN0aW9uLCBJIGRlc2NyaWJlIHRoZSBzdXBwb3J0IGZpbGVzLCBzbyB0aGF0IHlvdSBjYW4ga25vdyB3aGF0Ci10aGV5IGFyZSBhbmQgd2h5IHRoZXkgYXJlIHRoZXJlLgotCi1AdGFibGUgQGZpbGUKLUBpdGVtIEFCT1VULU5MUwotQWRkZWQgYnkgYXV0b21ha2UgaWYgeW91IGFyZSB1c2luZyBnZXR0ZXh0LiAgVGhpcyBpcyBhIGRvY3VtZW50YXRpb24KLWZpbGUgYWJvdXQgdGhlIGdldHRleHQgcHJvamVjdC4KLUBpdGVtIGFuc2kya25yLmMKLVVzZWQgYnkgYW4gYXV0b21ha2UgZ2VuZXJhdGVkIEBmaWxle01ha2VmaWxlfSBpZiB5b3UgcHV0IEBzYW1we2Fuc2kya25yfQotaW4gQHNhbXB7QVVUT01BS0VfT1BUSU9OU30gaW4gQGZpbGV7TWFrZWZpbGUuYW19LiAgVGhpcyBwZXJtaXRzCi1jb21waWxpbmcgQU5TSSBDIGNvZGUgd2l0aCBhIEsmUiBDIGNvbXBpbGVyLgotQGl0ZW0gYW5zaTJrbnIuMQotVGhlIG1hbiBwYWdlIHdoaWNoIGdvZXMgd2l0aCBAZmlsZXthbnNpMmtuci5jfS4KLUBpdGVtIGNvbmZpZy5ndWVzcwotQSBzaGVsbCBzY3JpcHQgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgY29uZmlndXJhdGlvbiBuYW1lIGZvciB0aGUgc3lzdGVtIG9uCi13aGljaCBpdCBpcyBydW4uCi1AaXRlbSBjb25maWcuc3ViCi1BIHNoZWxsIHNjcmlwdCB3aGljaCBjYW5vbmljYWxpemVzIGEgY29uZmlndXJhdGlvbiBuYW1lIGVudGVyZWQgYnkgYQotdXNlci4KLUBpdGVtIGVsaXNwLWNvbXAKLVVzZWQgdG8gY29tcGlsZSBFbWFjcyBMSVNQIGZpbGVzLgotQGl0ZW0gaW5zdGFsbC1zaAotQSBzaGVsbCBzY3JpcHQgd2hpY2ggaW5zdGFsbHMgYSBwcm9ncmFtLiAgVGhpcyBpcyB1c2VkIGlmIHRoZSBjb25maWd1cmUKLXNjcmlwdCBjYW4gbm90IGZpbmQgYW4gaW5zdGFsbCBiaW5hcnkuCi1AaXRlbSBsdGNvbmZpZwotVXNlZCBieSBsaWJ0b29sLiAgVGhpcyBpcyBhIHNoZWxsIHNjcmlwdCB3aGljaCBjb25maWd1cmVzIGxpYnRvb2wgZm9yCi10aGUgcGFydGljdWxhciBzeXN0ZW0gb24gd2hpY2ggaXQgaXMgdXNlZC4KLUBpdGVtIGx0bWFpbi5zaAotVXNlZCBieSBsaWJ0b29sLiAgVGhpcyBpcyB0aGUgYWN0dWFsIGxpYnRvb2wgc2NyaXB0IHdoaWNoIGlzIHVzZWQsIGFmdGVyCi1pdCBpcyBjb25maWd1cmVkIGJ5IEBmaWxle2x0Y29uZmlnfSB0byBidWlsZCBhIGxpYnJhcnkuCi1AaXRlbSBtZGF0ZS1zaAotQSBzaGVsbCBzY3JpcHQgdXNlZCBieSBhbiBhdXRvbWFrZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9IHRvIHByZXR0eQotcHJpbnQgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIGEgZmlsZS4gIFRoaXMgaXMgdXNlZCB0byBtYWludGFpbiB2ZXJzaW9uCi1udW1iZXJzIGZvciB0ZXhpbmZvIGZpbGVzLgotQGl0ZW0gbWlzc2luZwotQSBzaGVsbCBzY3JpcHQgdXNlZCBpZiBzb21lIHRvb2wgaXMgbWlzc2luZyBlbnRpcmVseS4gIFRoaXMgaXMgdXNlZCBieQotYW4gYXV0b21ha2UgZ2VuZXJhdGVkIEBmaWxle01ha2VmaWxlfSB0byBhdm9pZCBjZXJ0YWluIHNvcnRzIG9mCi10aW1lc3RhbXAgcHJvYmxlbXMuCi1AaXRlbSBta2luc3RhbGxkaXJzCi1BIHNoZWxsIHNjcmlwdCB3aGljaCBjcmVhdGVzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgYWxsIHBhcmVudAotZGlyZWN0b3JpZXMuICBUaGlzIGlzIHVzZWQgYnkgYW4gYXV0b21ha2UgZ2VuZXJhdGVkIEBmaWxle01ha2VmaWxlfQotZHVyaW5nIGluc3RhbGxhdGlvbi4KLUBpdGVtIHRleGluZm8udGV4Ci1SZXF1aXJlZCBpZiB5b3UgaGF2ZSBhbnkgdGV4aW5mbyBmaWxlcy4gIFRoaXMgaXMgdXNlZCB3aGVuIGNvbnZlcnRpbmcKLVRleGluZm8gZmlsZXMgaW50byBEVkkgdXNpbmcgQHNhbXB7dGV4aTJkdml9IGFuZCBAVGVYe30uCi1AaXRlbSB5bHdyYXAKLUEgc2hlbGwgc2NyaXB0IHVzZWQgYnkgYW4gYXV0b21ha2UgZ2VuZXJhdGVkIEBmaWxle01ha2VmaWxlfSB0byBydW4KLXByb2dyYW1zIGxpa2UgQHNhbXB7Ymlzb259LCBAc2FtcHt5YWNjfSwgQHNhbXB7ZmxleH0sIGFuZCBAc2FtcHtsZXh9LgotVGhlc2UgcHJvZ3JhbXMgZGVmYXVsdCB0byBwcm9kdWNpbmcgb3V0cHV0IGZpbGVzIHdpdGggYSBmaXhlZCBuYW1lLCBhbmQKLXRoZSBAZmlsZXt5bHdyYXB9IHNjcmlwdCBydW5zIHRoZW0gaW4gYSBzdWJkaXJlY3RvcnkgdG8gYXZvaWQgZmlsZSBuYW1lCi1jb25mbGljdHMgd2hlbiB1c2luZyBhIHBhcmFsbGVsIG1ha2UgcHJvZ3JhbS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQ29uZmlndXJhdGlvbiBOYW1lcwotQGNoYXB0ZXIgQ29uZmlndXJhdGlvbiBOYW1lcwotQGNpbmRleCBjb25maWd1cmF0aW9uIG5hbWVzCi1AY2luZGV4IGNvbmZpZ3VyYXRpb24gdHJpcGxldHMKLUBjaW5kZXggdHJpcGxldHMKLUBjaW5kZXggaG9zdCBuYW1lcwotQGNpbmRleCBob3N0IHRyaXBsZXRzCi1AY2luZGV4IGNhbm9uaWNhbCBzeXN0ZW0gbmFtZXMKLUBjaW5kZXggc3lzdGVtIG5hbWVzCi1AY2luZGV4IHN5c3RlbSB0eXBlcwotCi1UaGUgR05VIGNvbmZpZ3VyZSBzeXN0ZW0gbmFtZXMgYWxsIHN5c3RlbXMgdXNpbmcgYSBAZGZue2NvbmZpZ3VyYXRpb24KLW5hbWV9LiAgQWxsIHN1Y2ggbmFtZXMgdXNlZCB0byBiZSB0cmlwbGV0cyAodGhleSBtYXkgbm93IGNvbnRhaW4gZm91cgotcGFydHMgaW4gY2VydGFpbiBjYXNlcyksIGFuZCB0aGUgdGVybSBAZGZue2NvbmZpZ3VyYXRpb24gdHJpcGxldH0gaXMKLXN0aWxsIHNlZW4uCi0KLUBtZW51Ci0qIENvbmZpZ3VyYXRpb24gTmFtZSBEZWZpbml0aW9uOjoJQ29uZmlndXJhdGlvbiBOYW1lIERlZmluaXRpb24uCi0qIFVzaW5nIENvbmZpZ3VyYXRpb24gTmFtZXM6OgkJVXNpbmcgQ29uZmlndXJhdGlvbiBOYW1lcy4KLUBlbmQgbWVudQotCi1Abm9kZSBDb25maWd1cmF0aW9uIE5hbWUgRGVmaW5pdGlvbgotQHNlY3Rpb24gQ29uZmlndXJhdGlvbiBOYW1lIERlZmluaXRpb24KLQotVGhpcyBpcyBhIHN0cmluZyBvZiB0aGUgZm9ybQotQHZhcntjcHV9LUB2YXJ7bWFudWZhY3R1cmVyfS1AdmFye29wZXJhdGluZ19zeXN0ZW19LiAgSW4gc29tZSBjYXNlcywKLXRoaXMgaXMgZXh0ZW5kZWQgdG8gYSBmb3VyIHBhcnQgZm9ybToKLUB2YXJ7Y3B1fS1AdmFye21hbnVmYWN0dXJlcn0tQHZhcntrZXJuZWx9LUB2YXJ7b3BlcmF0aW5nX3N5c3RlbX0uCi0KLVdoZW4gdXNpbmcgYSBjb25maWd1cmF0aW9uIG5hbWUgaW4gYSBjb25maWd1cmUgb3B0aW9uLCBpdCBpcyBub3JtYWxseQotbm90IG5lY2Vzc2FyeSB0byBzcGVjaWZ5IGFuIGVudGlyZSBuYW1lLiAgSW4gcGFydGljdWxhciwgdGhlCi1AdmFye21hbnVmYWN0dXJlcn0gZmllbGQgaXMgb2Z0ZW4gb21pdHRlZCwgbGVhZGluZyB0byBzdHJpbmdzIHN1Y2ggYXMKLUBzYW1we2kzODYtbGludXh9IG9yIEBzYW1we3NwYXJjLXN1bm9zfS4gIFRoZSBzaGVsbCBzY3JpcHQKLUBmaWxle2NvbmZpZy5zdWJ9IHdpbGwgdHJhbnNsYXRlIHRoZXNlIHNob3J0ZW5lZCBzdHJpbmdzIGludG8gdGhlCi1jYW5vbmljYWwgZm9ybS4gIGF1dG9jb25mIHdpbGwgYXJyYW5nZSBmb3IgQGZpbGV7Y29uZmlnLnN1Yn0gdG8gYmUgcnVuCi1hdXRvbWF0aWNhbGx5IHdoZW4gaXQgaXMgbmVlZGVkLgotCi1UaGUgZmllbGRzIG9mIGEgY29uZmlndXJhdGlvbiBuYW1lIGFyZSBhcyBmb2xsb3dzOgotCi1AdGFibGUgQHZhcgotQGl0ZW0gY3B1Ci1UaGUgdHlwZSBvZiBwcm9jZXNzb3IuICBUaGlzIGlzIHR5cGljYWxseSBzb21ldGhpbmcgbGlrZSBAc2FtcHtpMzg2fSBvcgotQHNhbXB7c3BhcmN9LiAgTW9yZSBzcGVjaWZpYyB2YXJpYW50cyBhcmUgdXNlZCBhcyB3ZWxsLCBzdWNoIGFzCi1Ac2FtcHttaXBzZWx9IHRvIGluZGljYXRlIGEgbGl0dGxlIGVuZGlhbiBNSVBTIHByb2Nlc3Nvci4KLUBpdGVtIG1hbnVmYWN0dXJlcgotQSBzb21ld2hhdCBmcmVlZm9ybSBmaWVsZCB3aGljaCBpbmRpY2F0ZXMgdGhlIG1hbnVmYWN0dXJlciBvZiB0aGUKLXN5c3RlbS4gIFRoaXMgaXMgb2Z0ZW4gc2ltcGx5IEBzYW1we3Vua25vd259LiAgT3RoZXIgY29tbW9uIHN0cmluZ3MgYXJlCi1Ac2FtcHtwY30gZm9yIGFuIElCTSBQQyBjb21wYXRpYmxlIHN5c3RlbSwgb3IgdGhlIG5hbWUgb2YgYSB3b3Jrc3RhdGlvbgotdmVuZG9yLCBzdWNoIGFzIEBzYW1we3N1bn0uCi1AaXRlbSBvcGVyYXRpbmdfc3lzdGVtCi1UaGUgbmFtZSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3aGljaCBpcyBydW4gb24gdGhlIHN5c3RlbS4gIFRoaXMgd2lsbAotYmUgc29tZXRoaW5nIGxpa2UgQHNhbXB7c29sYXJpczIuNX0gb3IgQHNhbXB7aXJpeDYuM30uICBUaGVyZSBpcyBubwotcGFydGljdWxhciByZXN0cmljdGlvbiBvbiB0aGUgdmVyc2lvbiBudW1iZXIsIGFuZCBzdHJpbmdzIGxpa2UKLUBzYW1we2FpeDQuMS40LjB9IGFyZSBzZWVuLiAgRm9yIGFuIGVtYmVkZGVkIHN5c3RlbSwgd2hpY2ggaGFzIG5vCi1vcGVyYXRpbmcgc3lzdGVtLCB0aGlzIGZpZWxkIG5vcm1hbGx5IGluZGljYXRlcyB0aGUgdHlwZSBvZiBvYmplY3QgZmlsZQotZm9ybWF0LCBzdWNoIGFzIEBzYW1we2VsZn0gb3IgQHNhbXB7Y29mZn0uCi1AaXRlbSBrZXJuZWwKLVRoaXMgaXMgdXNlZCBtYWlubHkgZm9yIEdOVS9MaW51eC4gIEEgdHlwaWNhbCBHTlUvTGludXggY29uZmlndXJhdGlvbgotbmFtZSBpcyBAc2FtcHtpNTg2LXBjLWxpbnV4LWdudWxpYmMxfS4gIEluIHRoaXMgY2FzZSB0aGUga2VybmVsLAotQHNhbXB7bGludXh9LCBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbSwgQHNhbXB7Z251bGliYzF9LgotQGVuZCB0YWJsZQotCi1UaGUgc2hlbGwgc2NyaXB0IEBmaWxle2NvbmZpZy5ndWVzc30gd2lsbCBub3JtYWxseSBwcmludCB0aGUgY29ycmVjdAotY29uZmlndXJhdGlvbiBuYW1lIGZvciB0aGUgc3lzdGVtIG9uIHdoaWNoIGl0IGlzIHJ1bi4gIEl0IGRvZXMgYnkKLXJ1bm5pbmcgQHNhbXB7dW5hbWV9IGFuZCBieSBleGFtaW5pbmcgb3RoZXIgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZQotc3lzdGVtLgotCi1CZWNhdXNlIEBmaWxle2NvbmZpZy5ndWVzc30gY2FuIG5vcm1hbGx5IGRldGVybWluZSB0aGUgY29uZmlndXJhdGlvbgotbmFtZSBmb3IgYSBtYWNoaW5lLCBpdCBpcyBub3JtYWxseSBvbmx5IG5lY2Vzc2FyeSB0byBzcGVjaWZ5IGEKLWNvbmZpZ3VyYXRpb24gbmFtZSB3aGVuIGJ1aWxkaW5nIGEgY3Jvc3MtY29tcGlsZXIgb3Igd2hlbiBidWlsZGluZyB1c2luZwotYSBjcm9zcy1jb21waWxlci4KLQotQG5vZGUgVXNpbmcgQ29uZmlndXJhdGlvbiBOYW1lcwotQHNlY3Rpb24gVXNpbmcgQ29uZmlndXJhdGlvbiBOYW1lcwotCi1BIGNvbmZpZ3VyZSBzY3JpcHQgd2lsbCBzb21ldGltZXMgaGF2ZSB0byBtYWtlIGEgZGVjaXNpb24gYmFzZWQgb24gYQotY29uZmlndXJhdGlvbiBuYW1lLiAgWW91IHdpbGwgbmVlZCB0byBkbyB0aGlzIGlmIHlvdSBoYXZlIHRvIGNvbXBpbGUKLWNvZGUgZGlmZmVyZW50bHkgYmFzZWQgb24gc29tZXRoaW5nIHdoaWNoIGNhbiBub3QgYmUgdGVzdGVkIHVzaW5nIGEKLXN0YW5kYXJkIGF1dG9jb25mIGZlYXR1cmUgdGVzdC4KLQotSXQgaXMgbm9ybWFsbHkgYmV0dGVyIHRvIHRlc3QgZm9yIHBhcnRpY3VsYXIgZmVhdHVyZXMsIHJhdGhlciB0aGFuIHRvCi10ZXN0IGZvciBhIHBhcnRpY3VsYXIgc3lzdGVtLiAgVGhpcyBpcyBiZWNhdXNlIGFzIFVuaXggZXZvbHZlcywKLWRpZmZlcmVudCBzeXN0ZW1zIGNvcHkgZmVhdHVyZXMgZnJvbSBvbmUgYW5vdGhlci4gIEV2ZW4gaWYgeW91IG5lZWQgdG8KLWRldGVybWluZSB3aGV0aGVyIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBiYXNlZCBvbiBhIGNvbmZpZ3VyYXRpb24KLW5hbWUsIHlvdSBzaG91bGQgZGVmaW5lIGEgbWFjcm8gd2hpY2ggZGVzY3JpYmVzIHRoZSBmZWF0dXJlLCByYXRoZXIgdGhhbgotZGVmaW5pbmcgYSBtYWNybyB3aGljaCBkZXNjcmliZXMgdGhlIHBhcnRpY3VsYXIgc3lzdGVtIHlvdSBhcmUgb24uCi0KLVRlc3RpbmcgZm9yIGEgcGFydGljdWxhciBzeXN0ZW0gaXMgbm9ybWFsbHkgZG9uZSB1c2luZyBhIGNhc2Ugc3RhdGVtZW50Ci1pbiBAZmlsZXtjb25maWd1cmUuaW59LiAgVGhlIGNhc2Ugc3RhdGVtZW50IG1pZ2h0IGxvb2sgc29tZXRoaW5nIGxpa2UKLXRoZSBmb2xsb3dpbmcsIGFzc3VtaW5nIHRoYXQgQHNhbXB7aG9zdH0gaXMgYSBzaGVsbCB2YXJpYWJsZSBob2xkaW5nIGEKLWNhbm9uaWNhbCBjb25maWd1cmF0aW9uIG5hbWUgKHdoaWNoIHdpbGwgYmUgdGhlIGNhc2UgaWYKLUBmaWxle2NvbmZpZ3VyZS5pbn0gdXNlcyB0aGUgQHNhbXB7QUNfQ0FOT05JQ0FMX0hPU1R9IG9yCi1Ac2FtcHtBQ19DQU5PTklDQUxfU1lTVEVNfSBtYWNybykuCi0KLUBzbWFsbGV4YW1wbGUKLWNhc2UgIiRAe2hvc3RAfSIgaW4KLWlbMzQ1Nl04Ni0qLWxpbnV4LWdudSopIGRvIHNvbWV0aGluZyA7Owotc3BhcmMqLXN1bi1zb2xhcmlzMi5bNTY3ODldKikgZG8gc29tZXRoaW5nIDs7Ci1zcGFyYyotc3VuLXNvbGFyaXMqKSBkbyBzb21ldGhpbmcgOzsKLW1pcHMqLSotZWxmKikgZG8gc29tZXRoaW5nIDs7Ci1lc2FjCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1JdCBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IHRvIHVzZSBAc2FtcHsqfSBhZnRlciB0aGUgb3BlcmF0aW5nIHN5c3RlbQotZmllbGQsIGluIG9yZGVyIHRvIG1hdGNoIHRoZSB2ZXJzaW9uIG51bWJlciB3aGljaCB3aWxsIGJlIGdlbmVyYXRlZCBieQotQGZpbGV7Y29uZmlnLmd1ZXNzfS4KLQotSW4gbW9zdCBjYXNlcyB5b3UgbXVzdCBiZSBjYXJlZnVsIHRvIG1hdGNoIGEgcmFuZ2Ugb2YgcHJvY2Vzc29yIHR5cGVzLgotRm9yIG1vc3QgcHJvY2Vzc29yIGZhbWlsaWVzLCBhIHRyYWlsaW5nIEBzYW1weyp9IHN1ZmZpY2VzLCBhcyBpbgotQHNhbXB7bWlwcyp9IGFib3ZlLiAgRm9yIHRoZSBpMzg2IGZhbWlseSwgc29tZXRoaW5nIGFsb25nIHRoZSBsaW5lcyBvZgotQHNhbXB7aVszNDU2XTg2fSBzdWZmaWNlcyBhdCBwcmVzZW50LiAgRm9yIHRoZSBtNjhrIGZhbWlseSwgeW91IHdpbGwKLW5lZWQgc29tZXRoaW5nIGxpa2UgQHNhbXB7bTY4Kn0uICBPZiBjb3Vyc2UsIGlmIHlvdSBkbyBub3QgbmVlZCB0byBtYXRjaAotb24gdGhlIHByb2Nlc3NvciwgaXQgaXMgc2ltcGxlciB0byBqdXN0IHJlcGxhY2UgdGhlIGVudGlyZSBmaWVsZCBieSBhCi1Ac2FtcHsqfSwgYXMgaW4gQHNhbXB7Ki0qLWlyaXgqfS4KLQotQG5vZGUgQ3Jvc3MgQ29tcGlsYXRpb24gVG9vbHMKLUBjaGFwdGVyIENyb3NzIENvbXBpbGF0aW9uIFRvb2xzCi1AY2luZGV4IGNyb3NzIHRvb2xzCi0KLVRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0gY2FuIGJlIHVzZWQgdG8gYnVpbGQgQGRmbntjcm9zcwotY29tcGlsYXRpb259IHRvb2xzLiAgQSBjcm9zcyBjb21waWxhdGlvbiB0b29sIGlzIGEgdG9vbCB3aGljaCBydW5zIG9uCi1vbmUgc3lzdGVtIGFuZCBwcm9kdWNlcyBjb2RlIHdoaWNoIHJ1bnMgb24gYW5vdGhlciBzeXN0ZW0uCi0KLUBtZW51Ci0qIENyb3NzIENvbXBpbGF0aW9uIENvbmNlcHRzOjoJCUNyb3NzIENvbXBpbGF0aW9uIENvbmNlcHRzLgotKiBIb3N0IGFuZCBUYXJnZXQ6OgkJCUhvc3QgYW5kIFRhcmdldC4KLSogVXNpbmcgdGhlIEhvc3QgVHlwZTo6CQkJVXNpbmcgdGhlIEhvc3QgVHlwZS4KLSogU3BlY2lmeWluZyB0aGUgVGFyZ2V0OjogICAgICAgCVNwZWNpZnlpbmcgdGhlIFRhcmdldC4KLSogVXNpbmcgdGhlIFRhcmdldCBUeXBlOjoJCVVzaW5nIHRoZSBUYXJnZXQgVHlwZS4KLSogQ3Jvc3MgVG9vbHMgaW4gdGhlIEN5Z251cyBUcmVlOjoJQ3Jvc3MgVG9vbHMgaW4gdGhlIEN5Z251cyBUcmVlCi1AZW5kIG1lbnUKLQotQG5vZGUgQ3Jvc3MgQ29tcGlsYXRpb24gQ29uY2VwdHMKLUBzZWN0aW9uIENyb3NzIENvbXBpbGF0aW9uIENvbmNlcHRzCi0KLUBjaW5kZXggY3Jvc3MgY29tcGlsZXIKLUEgY29tcGlsZXIgd2hpY2ggcHJvZHVjZXMgcHJvZ3JhbXMgd2hpY2ggcnVuIG9uIGEgZGlmZmVyZW50IHN5c3RlbSBpcyBhCi1jcm9zcyBjb21waWxhdGlvbiBjb21waWxlciwgb3Igc2ltcGx5IGEgQGRmbntjcm9zcyBjb21waWxlcn0uCi1TaW1pbGFybHksIHdlIHNwZWFrIG9mIGNyb3NzIGFzc2VtYmxlcnMsIGNyb3NzIGxpbmtlcnMsIGV0Yy4KLQotSW4gdGhlIG5vcm1hbCBjYXNlLCBhIGNvbXBpbGVyIHByb2R1Y2VzIGNvZGUgd2hpY2ggcnVucyBvbiB0aGUgc2FtZQotc3lzdGVtIGFzIHRoZSBvbmUgb24gd2hpY2ggdGhlIGNvbXBpbGVyIHJ1bnMuICBXaGVuIGl0IGlzIG5lY2Vzc2FyeSB0bwotZGlzdGluZ3Vpc2ggdGhpcyBjYXNlIGZyb20gdGhlIGNyb3NzIGNvbXBpbGF0aW9uIGNhc2UsIHN1Y2ggYSBjb21waWxlcgotaXMgY2FsbGVkIGEgQGRmbntuYXRpdmUgY29tcGlsZXJ9LiAgU2ltaWxhcmx5LCB3ZSBzcGVhayBvZiBuYXRpdmUKLWFzc2VtYmxlcnMsIGV0Yy4KLQotQWx0aG91Z2ggdGhlIGRlYnVnZ2VyIGlzIG5vdCBzdHJpY3RseSBzcGVha2luZyBhIGNvbXBpbGF0aW9uIHRvb2wsIGl0IGlzCi1uZXZlcnRoZWxlc3MgbWVhbmluZ2Z1bCB0byBzcGVhayBvZiBhIGNyb3NzIGRlYnVnZ2VyOiBhIGRlYnVnZ2VyIHdoaWNoCi1pcyB1c2VkIHRvIGRlYnVnIGNvZGUgd2hpY2ggcnVucyBvbiBhbm90aGVyIHN5c3RlbS4gIEV2ZXJ5dGhpbmcgdGhhdCBpcwotc2FpZCBiZWxvdyBhYm91dCBjb25maWd1cmluZyBjcm9zcyBjb21waWxhdGlvbiB0b29scyBhcHBsaWVzIHRvIHRoZQotZGVidWdnZXIgYXMgd2VsbC4KLQotQG5vZGUgSG9zdCBhbmQgVGFyZ2V0Ci1Ac2VjdGlvbiBIb3N0IGFuZCBUYXJnZXQKLUBjaW5kZXggaG9zdCBzeXN0ZW0KLUBjaW5kZXggdGFyZ2V0IHN5c3RlbQotCi1XaGVuIGJ1aWxkaW5nIGNyb3NzIGNvbXBpbGF0aW9uIHRvb2xzLCB0aGVyZSBhcmUgdHdvIGRpZmZlcmVudCBzeXN0ZW1zCi1pbnZvbHZlZDogdGhlIHN5c3RlbSBvbiB3aGljaCB0aGUgdG9vbHMgd2lsbCBydW4sIGFuZCB0aGUgc3lzdGVtIGZvcgotd2hpY2ggdGhlIHRvb2xzIGdlbmVyYXRlIGNvZGUuCi0KLVRoZSBzeXN0ZW0gb24gd2hpY2ggdGhlIHRvb2xzIHdpbGwgcnVuIGlzIGNhbGxlZCB0aGUgQGRmbntob3N0fSBzeXN0ZW0uCi0KLVRoZSBzeXN0ZW0gZm9yIHdoaWNoIHRoZSB0b29scyBnZW5lcmF0ZSBjb2RlIGlzIGNhbGxlZCB0aGUgQGRmbnt0YXJnZXR9Ci1zeXN0ZW0uCi0KLUZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYXZlIGEgY29tcGlsZXIgd2hpY2ggcnVucyBvbiBhIEdOVS9MaW51eAotc3lzdGVtIGFuZCBnZW5lcmF0ZXMgRUxGIHByb2dyYW1zIGZvciBhIE1JUFMgZW1iZWRkZWQgc3lzdGVtLiAgSW4gdGhpcwotY2FzZSB0aGUgR05VL0xpbnV4IHN5c3RlbSBpcyB0aGUgaG9zdCwgYW5kIHRoZSBNSVBTIEVMRiBzeXN0ZW0gaXMgdGhlCi10YXJnZXQuICBTdWNoIGEgY29tcGlsZXIgY291bGQgYmUgY2FsbGVkIGEgR05VL0xpbnV4IGNyb3NzIE1JUFMgRUxGCi1jb21waWxlciwgb3IsIGVxdWl2YWxlbnRseSwgYSBAc2FtcHtpMzg2LWxpbnV4LWdudX0gY3Jvc3MKLUBzYW1we21pcHMtZWxmfSBjb21waWxlci4KLQotTmF0dXJhbGx5LCBtb3N0IHByb2dyYW1zIGFyZSBub3QgY3Jvc3MgY29tcGlsYXRpb24gdG9vbHMuICBGb3IgdGhvc2UKLXByb2dyYW1zLCBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIHNwZWFrIG9mIGEgdGFyZ2V0LiAgSXQgb25seSBtYWtlcwotc2Vuc2UgdG8gc3BlYWsgb2YgYSB0YXJnZXQgZm9yIHRvb2xzIGxpa2UgQHNhbXB7Z2NjfSBvciB0aGUKLUBzYW1we2JpbnV0aWxzfSB3aGljaCBhY3R1YWxseSBwcm9kdWNlIHJ1bm5pbmcgY29kZS4gIEZvciBleGFtcGxlLCBpdAotZG9lcyBub3QgbWFrZSBzZW5zZSB0byBzcGVhayBvZiB0aGUgdGFyZ2V0IG9mIGEgdG9vbCBsaWtlIEBzYW1we2Jpc29ufQotb3IgQHNhbXB7bWFrZX0uCi0KLU1vc3QgY3Jvc3MgY29tcGlsYXRpb24gdG9vbHMgY2FuIGFsc28gc2VydmUgYXMgbmF0aXZlIHRvb2xzLiAgRm9yIGEKLW5hdGl2ZSBjb21waWxhdGlvbiB0b29sLCBpdCBpcyBzdGlsbCBtZWFuaW5nZnVsIHRvIHNwZWFrIG9mIGEgdGFyZ2V0LgotRm9yIGEgbmF0aXZlIHRvb2wsIHRoZSB0YXJnZXQgaXMgdGhlIHNhbWUgYXMgdGhlIGhvc3QuICBGb3IgZXhhbXBsZSwgZm9yCi1hIEdOVS9MaW51eCBuYXRpdmUgY29tcGlsZXIsIHRoZSBob3N0IGlzIEdOVS9MaW51eCwgYW5kIHRoZSB0YXJnZXQgaXMKLWFsc28gR05VL0xpbnV4LgotCi1Abm9kZSBVc2luZyB0aGUgSG9zdCBUeXBlCi1Ac2VjdGlvbiBVc2luZyB0aGUgSG9zdCBUeXBlCi0KLUluIGFsbW9zdCBhbGwgY2FzZXMgdGhlIGhvc3Qgc3lzdGVtIGlzIHRoZSBzeXN0ZW0gb24gd2hpY2ggeW91IHJ1biB0aGUKLUBzYW1we2NvbmZpZ3VyZX0gc2NyaXB0LCBhbmQgb24gd2hpY2ggeW91IGJ1aWxkIHRoZSB0b29scyAoZm9yIHRoZSBjYXNlCi13aGVuIHRoZXkgZGlmZmVyLCBAcHhyZWZ7Q2FuYWRpYW4gQ3Jvc3N9KS4KLQotQGNpbmRleCBAc2FtcHtBQ19DQU5PTklDQUxfSE9TVH0KLUlmIHlvdXIgY29uZmlndXJlIHNjcmlwdCBuZWVkcyB0byBrbm93IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlCi1ob3N0IHN5c3RlbSwgYW5kIHRoZSBwYWNrYWdlIGlzIG5vdCBhIGNyb3NzIGNvbXBpbGF0aW9uIHRvb2wgYW5kCi10aGVyZWZvcmUgZG9lcyBub3QgaGF2ZSBhIHRhcmdldCwgcHV0IEBzYW1we0FDX0NBTk9OSUNBTF9IT1NUfSBpbgotQGZpbGV7Y29uZmlndXJlLmlufS4gIFRoaXMgbWFjcm8gd2lsbCBhcnJhbmdlIHRvIGRlZmluZSBhIGZldyBzaGVsbAotdmFyaWFibGVzIHdoZW4gdGhlIEBzYW1we2NvbmZpZ3VyZX0gc2NyaXB0IGlzIHJ1bi4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBob3N0Ci1UaGUgY2Fub25pY2FsIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgaG9zdC4gIFRoaXMgd2lsbCBub3JtYWxseSBiZQotZGV0ZXJtaW5lZCBieSBydW5uaW5nIHRoZSBAZmlsZXtjb25maWcuZ3Vlc3N9IHNoZWxsIHNjcmlwdCwgYWx0aG91Z2ggdGhlCi11c2VyIGlzIHBlcm1pdHRlZCB0byBvdmVycmlkZSB0aGlzIGJ5IHVzaW5nIGFuIGV4cGxpY2l0IEBzYW1wey0taG9zdH0KLW9wdGlvbi4KLUBpdGVtIGhvc3RfYWxpYXMKLUluIHRoZSB1bnVzdWFsIGNhc2UgdGhhdCB0aGUgdXNlciB1c2VkIGFuIGV4cGxpY2l0IEBzYW1wey0taG9zdH0gb3B0aW9uLAotdGhpcyB3aWxsIGJlIHRoZSBhcmd1bWVudCB0byBAc2FtcHstLWhvc3R9LiAgSW4gdGhlIG5vcm1hbCBjYXNlLCB0aGlzCi13aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBAc2FtcHtob3N0fSB2YXJpYWJsZS4KLUBpdGVtIGhvc3RfY3B1Ci1AaXRlbXggaG9zdF92ZW5kb3IKLUBpdGVteCBob3N0X29zCi1UaGUgZmlyc3QgdGhyZWUgcGFydHMgb2YgdGhlIGNhbm9uaWNhbCBjb25maWd1cmF0aW9uIG5hbWUuCi1AZW5kIHRhYmxlCi0KLVRoZSBzaGVsbCB2YXJpYWJsZXMgbWF5IGJlIHVzZWQgYnkgcHV0dGluZyBzaGVsbCBjb2RlIGluCi1AZmlsZXtjb25maWd1cmUuaW59LiAgRm9yIGFuIGV4YW1wbGUsIHNlZSBAcmVme1VzaW5nIENvbmZpZ3VyYXRpb24KLU5hbWVzfS4KLQotQG5vZGUgU3BlY2lmeWluZyB0aGUgVGFyZ2V0Ci1Ac2VjdGlvbiBTcGVjaWZ5aW5nIHRoZSBUYXJnZXQKLQotQnkgZGVmYXVsdCwgdGhlIEBzYW1we2NvbmZpZ3VyZX0gc2NyaXB0IHdpbGwgYXNzdW1lIHRoYXQgdGhlIHRhcmdldCBpcwotdGhlIHNhbWUgYXMgdGhlIGhvc3QuICBUaGlzIGlzIHRoZSBtb3JlIGNvbW1vbiBjYXNlOyBmb3IgZXhhbXBsZSwgaXQKLWxlYWRzIHRvIGEgbmF0aXZlIGNvbXBpbGVyIHJhdGhlciB0aGFuIGEgY3Jvc3MgY29tcGlsZXIuCi0KLUBjaW5kZXggQHNhbXB7LS10YXJnZXR9IG9wdGlvbgotQGNpbmRleCB0YXJnZXQgb3B0aW9uCi1AY2luZGV4IGNvbmZpZ3VyZSB0YXJnZXQKLUlmIHlvdSB3YW50IHRvIGJ1aWxkIGEgY3Jvc3MgY29tcGlsYXRpb24gdG9vbCwgeW91IG11c3Qgc3BlY2lmeSB0aGUKLXRhcmdldCBleHBsaWNpdGx5IGJ5IHVzaW5nIHRoZSBAc2FtcHstLXRhcmdldH0gb3B0aW9uIHdoZW4geW91IHJ1bgotQHNhbXB7Y29uZmlndXJlfS4gIFRoZSBhcmd1bWVudCB0byBAc2FtcHstLXRhcmdldH0gaXMgdGhlIGNvbmZpZ3VyYXRpb24KLW5hbWUgb2YgdGhlIHN5c3RlbSBmb3Igd2hpY2ggeW91IHdpc2ggdG8gZ2VuZXJhdGUgY29kZS4KLUB4cmVme0NvbmZpZ3VyYXRpb24gTmFtZXN9LgotCi1Gb3IgZXhhbXBsZSwgdG8gYnVpbGQgdG9vbHMgd2hpY2ggZ2VuZXJhdGUgY29kZSBmb3IgYSBNSVBTIEVMRiBlbWJlZGRlZAotc3lzdGVtLCB5b3Ugd291bGQgdXNlIEBzYW1wey0tdGFyZ2V0IG1pcHMtZWxmfS4KLQotQG5vZGUgVXNpbmcgdGhlIFRhcmdldCBUeXBlCi1Ac2VjdGlvbiBVc2luZyB0aGUgVGFyZ2V0IFR5cGUKLQotQGNpbmRleCBAc2FtcHtBQ19DQU5PTklDQUxfU1lTVEVNfQotV2hlbiB3cml0aW5nIEBmaWxle2NvbmZpZ3VyZS5pbn0gZm9yIGEgY3Jvc3MgY29tcGlsYXRpb24gdG9vbCwgeW91IHdpbGwKLW5lZWQgdG8gdXNlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXJnZXQuICBUbyBkbyB0aGlzLCBwdXQKLUBzYW1we0FDX0NBTk9OSUNBTF9TWVNURU19IGluIEBmaWxle2NvbmZpZ3VyZS5pbn0uCi0KLUBzYW1we0FDX0NBTk9OSUNBTF9TWVNURU19IHdpbGwgbG9vayBmb3IgYSBAc2FtcHstLXRhcmdldH0gb3B0aW9uIGFuZAotY2Fub25pY2FsaXplIGl0IHVzaW5nIHRoZSBAZmlsZXtjb25maWcuc3VifSBzaGVsbCBzY3JpcHQuICBJdCB3aWxsIGFsc28KLXJ1biBAc2FtcHtBQ19DQU5PTklDQUxfSE9TVH0gKEBweHJlZntVc2luZyB0aGUgSG9zdCBUeXBlfSkuCi0KLVRoZSB0YXJnZXQgdHlwZSB3aWxsIGJlIHJlY29yZGVkIGluIHRoZSBmb2xsb3dpbmcgc2hlbGwgdmFyaWFibGVzLiAgTm90ZQotdGhhdCB0aGUgaG9zdCB2ZXJzaW9ucyBvZiB0aGVzZSB2YXJpYWJsZXMgd2lsbCBhbHNvIGJlIGRlZmluZWQgYnkKLUBzYW1we0FDX0NBTk9OSUNBTF9IT1NUfS4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSB0YXJnZXQKLVRoZSBjYW5vbmljYWwgY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZSB0YXJnZXQuCi1AaXRlbSB0YXJnZXRfYWxpYXMKLVRoZSBhcmd1bWVudCB0byB0aGUgQHNhbXB7LS10YXJnZXR9IG9wdGlvbi4gIElmIHRoZSB1c2VyIGRpZCBub3Qgc3BlY2lmeQotYSBAc2FtcHstLXRhcmdldH0gb3B0aW9uLCB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMgQHNhbXB7aG9zdF9hbGlhc30uCi1AaXRlbSB0YXJnZXRfY3B1Ci1AaXRlbXggdGFyZ2V0X3ZlbmRvcgotQGl0ZW14IHRhcmdldF9vcwotVGhlIGZpcnN0IHRocmVlIHBhcnRzIG9mIHRoZSBjYW5vbmljYWwgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gbmFtZS4KLUBlbmQgdGFibGUKLQotTm90ZSB0aGF0IGlmIEBzYW1we2hvc3R9IGFuZCBAc2FtcHt0YXJnZXR9IGFyZSB0aGUgc2FtZSBzdHJpbmcsIHlvdSBjYW4KLWFzc3VtZSBhIG5hdGl2ZSBjb25maWd1cmF0aW9uLiAgSWYgdGhleSBhcmUgZGlmZmVyZW50LCB5b3UgY2FuIGFzc3VtZSBhCi1jcm9zcyBjb25maWd1cmF0aW9uLgotCi1JdCBpcyBhcmd1YWJseSBwb3NzaWJsZSBmb3IgQHNhbXB7aG9zdH0gYW5kIEBzYW1we3RhcmdldH0gdG8gcmVwcmVzZW50Ci10aGUgc2FtZSBzeXN0ZW0sIGJ1dCBmb3IgdGhlIHN0cmluZ3MgdG8gbm90IGJlIGlkZW50aWNhbC4gIEZvciBleGFtcGxlLAotaWYgQHNhbXB7Y29uZmlnLmd1ZXNzfSByZXR1cm5zIEBzYW1we3NwYXJjLXN1bi1zdW5vczQuMS40fSwgYW5kIHNvbWVib2R5Ci1jb25maWd1cmVzIHdpdGggQHNhbXB7LS10YXJnZXQgc3BhcmMtc3VuLXN1bm9zNC4xfSwgdGhlbiB0aGUgc2xpZ2h0Ci1kaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMgb2YgU3VuT1MgbWF5IGJlIHVuaW1wb3J0YW50IGZvcgoteW91ciB0b29sLiAgSG93ZXZlciwgaW4gdGhlIGdlbmVyYWwgY2FzZSBpdCBjYW4gYmUgcXVpdGUgZGlmZmljdWx0IHRvCi1kZXRlcm1pbmUgd2hldGhlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gY29uZmlndXJhdGlvbiBuYW1lcyBhcmUKLXNpZ25pZmljYW50IG9yIG5vdC4gIFRoZXJlZm9yZSwgYnkgY29udmVudGlvbiwgaWYgdGhlIHVzZXIgc3BlY2lmaWVzIGEKLUBzYW1wey0tdGFyZ2V0fSBvcHRpb24gd2l0aG91dCBzcGVjaWZ5aW5nIGEgQHNhbXB7LS1ob3N0fSBvcHRpb24sIGl0IGlzCi1hc3N1bWVkIHRoYXQgdGhlIHVzZXIgd2FudHMgdG8gY29uZmlndXJlIGEgY3Jvc3MgY29tcGlsYXRpb24gdG9vbC4KLQotVGhlIHZhcmlhYmxlcyBAc2FtcHt0YXJnZXR9IGFuZCBAc2FtcHt0YXJnZXRfYWxpYXN9IHNob3VsZCBiZSBoYW5kbGVkCi1kaWZmZXJlbnRseS4KLQotSW4gZ2VuZXJhbCwgd2hlbmV2ZXIgdGhlIHVzZXIgbWF5IGFjdHVhbGx5IHNlZSBhIHN0cmluZywKLUBzYW1we3RhcmdldF9hbGlhc30gc2hvdWxkIGJlIHVzZWQuICBUaGlzIGluY2x1ZGVzIGFueXRoaW5nIHdoaWNoIG1heQotYXBwZWFyIGluIHRoZSBmaWxlIHN5c3RlbSwgc3VjaCBhcyBhIGRpcmVjdG9yeSBuYW1lIG9yIHBhcnQgb2YgYSB0b29sCi1uYW1lLiAgSXQgYWxzbyBpbmNsdWRlcyBhbnkgdG9vbCBvdXRwdXQsIHVubGVzcyBpdCBpcyBjbGVhcmx5IGxhYmVsbGVkCi1hcyB0aGUgY2Fub25pY2FsIHRhcmdldCBjb25maWd1cmF0aW9uIG5hbWUuICBUaGlzIHBlcm1pdHMgdGhlIHVzZXIgdG8KLXVzZSB0aGUgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiB0byBzcGVjaWZ5IGhvdyB0aGUgdG9vbCB3aWxsIGFwcGVhciB0bwotdGhlIG91dHNpZGUgd29ybGQuCi0KLU9uIHRoZSBvdGhlciBoYW5kLCB3aGVuIGNoZWNraW5nIGZvciBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHRhcmdldAotc3lzdGVtLCBAc2FtcHt0YXJnZXR9IHNob3VsZCBiZSB1c2VkLiAgVGhpcyBpcyBiZWNhdXNlIGEgd2lkZSB2YXJpZXR5IG9mCi1Ac2FtcHstLXRhcmdldH0gb3B0aW9ucyBtYXkgbWFwIGludG8gdGhlIHNhbWUgY2Fub25pY2FsIGNvbmZpZ3VyYXRpb24KLW5hbWUuICBZb3Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGR1cGxpY2F0ZSB0aGUgY2Fub25pY2FsaXphdGlvbiBkb25lIGJ5Ci1Ac2FtcHtjb25maWcuc3VifSBpbiB5b3VyIG93biBjb2RlLgotCi1CeSBjb252ZW50aW9uLCBjcm9zcyB0b29scyBhcmUgaW5zdGFsbGVkIHdpdGggYSBwcmVmaXggb2YgdGhlIGFyZ3VtZW50Ci11c2VkIHdpdGggdGhlIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24sIGFsc28ga25vd24gYXMgQHNhbXB7dGFyZ2V0X2FsaWFzfQotKEBweHJlZntVc2luZyB0aGUgVGFyZ2V0IFR5cGV9KS4gIElmIHRoZSB1c2VyIGRvZXMgbm90IHVzZSB0aGUKLUBzYW1wey0tdGFyZ2V0fSBvcHRpb24sIGFuZCB0aHVzIGlzIGJ1aWxkaW5nIGEgbmF0aXZlIHRvb2wsIG5vIHByZWZpeCBpcwotdXNlZC4KLQotRm9yIGV4YW1wbGUsIGlmIGdjYyBpcyBjb25maWd1cmVkIHdpdGggQHNhbXB7LS10YXJnZXQgbWlwcy1lbGZ9LCB0aGVuCi10aGUgaW5zdGFsbGVkIGJpbmFyeSB3aWxsIGJlIG5hbWVkIEBzYW1we21pcHMtZWxmLWdjY30uICBJZiBnY2MgaXMKLWNvbmZpZ3VyZWQgd2l0aG91dCBhIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24sIHRoZW4gdGhlIGluc3RhbGxlZCBiaW5hcnkKLXdpbGwgYmUgbmFtZWQgQHNhbXB7Z2NjfS4KLQotVGhlIGF1dG9jb25mIG1hY3JvIEBzYW1we0FDX0FSR19QUk9HUkFNfSB3aWxsIGhhbmRsZSB0aGlzIGZvciB5b3UuICBJZgoteW91IGFyZSB1c2luZyBhdXRvbWFrZSwgbm8gbW9yZSBuZWVkIGJlIGRvbmU7IHRoZSBwcm9ncmFtcyB3aWxsCi1hdXRvbWF0aWNhbGx5IGJlIGluc3RhbGxlZCB3aXRoIHRoZSBjb3JyZWN0IHByZWZpeGVzLiAgT3RoZXJ3aXNlLCBzZWUKLXRoZSBhdXRvY29uZiBkb2N1bWVudGF0aW9uIGZvciBAc2FtcHtBQ19BUkdfUFJPR1JBTX0uCi0KLUBub2RlIENyb3NzIFRvb2xzIGluIHRoZSBDeWdudXMgVHJlZQotQHNlY3Rpb24gQ3Jvc3MgVG9vbHMgaW4gdGhlIEN5Z251cyBUcmVlCi0KLVRoZSBDeWdudXMgdHJlZSBpcyB1c2VkIGZvciB2YXJpb3VzIHBhY2thZ2VzIGluY2x1ZGluZyBnZGIsIHRoZSBHTlUKLWJpbnV0aWxzLCBhbmQgZWdjcy4gIEl0IGlzIGFsc28sIG9mIGNvdXJzZSwgdXNlZCBmb3IgQ3lnbnVzIHJlbGVhc2VzLgotCi1JbiB0aGUgQ3lnbnVzIHRyZWUsIHRoZSB0b3AgbGV2ZWwgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgdXNlcyB0aGUgb2xkCi1DeWdudXMgY29uZmlndXJlIHN5c3RlbSwgbm90IGF1dG9jb25mLiAgVGhlIHRvcCBsZXZlbCBAZmlsZXtNYWtlZmlsZS5pbn0KLWlzIHdyaXR0ZW4gdG8gYnVpbGQgcGFja2FnZXMgYmFzZWQgb24gd2hhdCBpcyBpbiB0aGUgc291cmNlIHRyZWUsIGFuZAotc3VwcG9ydHMgYnVpbGRpbmcgYSBsYXJnZSBudW1iZXIgb2YgdG9vbHMgaW4gYSBzaW5nbGUKLUBzYW1we2NvbmZpZ3VyZX0vQHNhbXB7bWFrZX0gc3RlcC4KLQotVGhlIEN5Z251cyB0cmVlIG1heSBiZSBjb25maWd1cmVkIHdpdGggYSBAc2FtcHstLXRhcmdldH0gb3B0aW9uLiAgVGhlCi1Ac2FtcHstLXRhcmdldH0gb3B0aW9uIGFwcGxpZXMgcmVjdXJzaXZlbHkgdG8gZXZlcnkgc3ViZGlyZWN0b3J5LCBhbmQKLXBlcm1pdHMgYnVpbGRpbmcgYW4gZW50aXJlIHNldCBvZiBjcm9zcyB0b29scyBhdCBvbmNlLgotCi1AbWVudQotKiBIb3N0IGFuZCBUYXJnZXQgTGlicmFyaWVzOjoJCUhvc3QgYW5kIFRhcmdldCBMaWJyYXJpZXMuCi0qIFRhcmdldCBMaWJyYXJ5IENvbmZpZ3VyZSBTY3JpcHRzOjoJVGFyZ2V0IExpYnJhcnkgQ29uZmlndXJlIFNjcmlwdHMuCi0qIE1ha2UgVGFyZ2V0cyBpbiBDeWdudXMgVHJlZTo6ICAgICAgICAgTWFrZSBUYXJnZXRzIGluIEN5Z251cyBUcmVlLgotKiBUYXJnZXQgbGliaWJlcnR5OjoJCQlUYXJnZXQgbGliaWJlcnR5Ci1AZW5kIG1lbnUKLQotQG5vZGUgSG9zdCBhbmQgVGFyZ2V0IExpYnJhcmllcwotQHN1YnNlY3Rpb24gSG9zdCBhbmQgVGFyZ2V0IExpYnJhcmllcwotCi1UaGUgQ3lnbnVzIHRyZWUgZGlzdGluZ3Vpc2hlcyBob3N0IGxpYnJhcmllcyBmcm9tIHRhcmdldCBsaWJyYXJpZXMuCi0KLUhvc3QgbGlicmFyaWVzIGFyZSBidWlsdCB3aXRoIHRoZSBjb21waWxlciB1c2VkIHRvIGJ1aWxkIHRoZSBwcm9ncmFtcwotd2hpY2ggcnVuIG9uIHRoZSBob3N0LCB3aGljaCBpcyBjYWxsZWQgdGhlIGhvc3QgY29tcGlsZXIuICBUaGlzIGluY2x1ZGVzCi1saWJyYXJpZXMgc3VjaCBhcyBAc2FtcHtiZmR9IGFuZCBAc2FtcHt0Y2x9LiAgVGhlc2UgbGlicmFyaWVzIGFyZSBidWlsdAotd2l0aCB0aGUgaG9zdCBjb21waWxlciwgYW5kIGFyZSBsaW5rZWQgaW50byBwcm9ncmFtcyBsaWtlIHRoZSBiaW51dGlscwotb3IgZ2NjIHdoaWNoIHJ1biBvbiB0aGUgaG9zdC4KLQotVGFyZ2V0IGxpYnJhcmllcyBhcmUgYnVpbHQgd2l0aCB0aGUgdGFyZ2V0IGNvbXBpbGVyLiAgSWYgZ2NjIGlzIHByZXNlbnQKLWluIHRoZSBzb3VyY2UgdHJlZSwgdGhlbiB0aGUgdGFyZ2V0IGNvbXBpbGVyIGlzIHRoZSBnY2MgdGhhdCBpcyBidWlsdAotdXNpbmcgdGhlIGhvc3QgY29tcGlsZXIuICBUYXJnZXQgbGlicmFyaWVzIGFyZSBsaWJyYXJpZXMgc3VjaCBhcwotQHNhbXB7bmV3bGlifSBhbmQgQHNhbXB7bGlic3RkYysrfS4gIFRoZXNlIGxpYnJhcmllcyBhcmUgbm90IGxpbmtlZCBpbnRvCi10aGUgaG9zdCBwcm9ncmFtcywgYnV0IGFyZSBpbnN0ZWFkIG1hZGUgYXZhaWxhYmxlIGZvciB1c2Ugd2l0aCBwcm9ncmFtcwotYnVpbHQgd2l0aCB0aGUgdGFyZ2V0IGNvbXBpbGVyLgotCi1Gb3IgdGhlIHJlc3Qgb2YgdGhpcyBzZWN0aW9uLCBhc3N1bWUgdGhhdCBnY2MgaXMgcHJlc2VudCBpbiB0aGUgc291cmNlCi10cmVlLCBzbyB0aGF0IGl0IHdpbGwgYmUgdXNlZCB0byBidWlsZCB0aGUgdGFyZ2V0IGxpYnJhcmllcy4KLQotVGhlcmUgaXMgYSBjb21wbGljYXRpb24gaGVyZS4gIFRoZSBjb25maWd1cmUgcHJvY2VzcyBuZWVkcyB0byBrbm93IHdoaWNoCi1jb21waWxlciB5b3UgYXJlIGdvaW5nIHRvIHVzZSB0byBidWlsZCBhIHRvb2w7IG90aGVyd2lzZSwgdGhlIGZlYXR1cmUKLXRlc3RzIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5LiAgVGhlIEN5Z251cyB0cmVlIGhhbmRsZXMgdGhpcyBieSBub3QKLWNvbmZpZ3VyaW5nIHRoZSB0YXJnZXQgbGlicmFyaWVzIHVudGlsIHRoZSB0YXJnZXQgY29tcGlsZXIgaXMgYnVpbHQuICBJbgotb3JkZXIgdG8gcGVybWl0IGV2ZXJ5dGhpbmcgdG8gYnVpbGQgdXNpbmcgYSBzaW5nbGUKLUBzYW1we2NvbmZpZ3VyZX0vQHNhbXB7bWFrZX0sIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSB0YXJnZXQgbGlicmFyaWVzCi1pcyBhY3R1YWxseSB0cmlnZ2VyZWQgZHVyaW5nIHRoZSBtYWtlIHN0ZXAuCi0KLVdoZW4gdGhlIHRhcmdldCBsaWJyYXJpZXMgYXJlIGNvbmZpZ3VyZWQsIHRoZSBAc2FtcHstLXRhcmdldH0gb3B0aW9uIGlzCi1ub3QgdXNlZC4gIEluc3RlYWQsIHRoZSBAc2FtcHstLWhvc3R9IG9wdGlvbiBpcyB1c2VkIHdpdGggdGhlIGFyZ3VtZW50Ci1vZiB0aGUgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiBmb3IgdGhlIG92ZXJhbGwgY29uZmlndXJhdGlvbi4gIElmIG5vCi1Ac2FtcHstLXRhcmdldH0gb3B0aW9uIHdhcyB1c2VkIGZvciB0aGUgb3ZlcmFsbCBjb25maWd1cmF0aW9uLCB0aGUKLUBzYW1wey0taG9zdH0gb3B0aW9uIHdpbGwgYmUgcGFzc2VkIHdpdGggdGhlIG91dHB1dCBvZiB0aGUKLUBmaWxle2NvbmZpZy5ndWVzc30gc2hlbGwgc2NyaXB0LiAgQW55IEBzYW1wey0tYnVpbGR9IG9wdGlvbiBpcyBwYXNzZWQKLWRvd24gdW5jaGFuZ2VkLgotCi1UaGlzIHRyYW5zbGF0aW9uIG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpcyBkb25lIGJlY2F1c2Ugc2luY2UgdGhlCi10YXJnZXQgbGlicmFyaWVzIGFyZSBjb21waWxlZCB3aXRoIHRoZSB0YXJnZXQgY29tcGlsZXIsIHRoZXkgYXJlIGJlaW5nCi1idWlsdCBpbiBvcmRlciB0byBydW4gb24gdGhlIHRhcmdldCBvZiB0aGUgb3ZlcmFsbCBjb25maWd1cmF0aW9uLiAgQnkKLXRoZSBkZWZpbml0aW9uIG9mIGhvc3QsIHRoaXMgbWVhbnMgdGhhdCB0aGVpciBob3N0IHN5c3RlbSBpcyB0aGUgc2FtZSBhcwotdGhlIHRhcmdldCBzeXN0ZW0gb2YgdGhlIG92ZXJhbGwgY29uZmlndXJhdGlvbi4KLQotVGhlIHNhbWUgcHJvY2VzcyBpcyB1c2VkIGZvciBib3RoIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24gYW5kIGEgY3Jvc3MKLWNvbmZpZ3VyYXRpb24uICBFdmVuIHdoZW4gdXNpbmcgYSBuYXRpdmUgY29uZmlndXJhdGlvbiwgdGhlIHRhcmdldAotbGlicmFyaWVzIHdpbGwgYmUgY29uZmlndXJlZCBhbmQgYnVpbHQgdXNpbmcgdGhlIG5ld2x5IGJ1aWx0IGNvbXBpbGVyLgotVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGZvciB0aGUgQysrIGxpYnJhcmllcywgc2luY2UgdGhlcmUgaXMgbm8KLXJlYXNvbiB0byBhc3N1bWUgdGhhdCB0aGUgQysrIGNvbXBpbGVyIHVzZWQgdG8gYnVpbGQgdGhlIGhvc3QgdG9vbHMgKGlmCi10aGVyZSBldmVuIGlzIG9uZSkgdXNlcyB0aGUgc2FtZSBBQkkgYXMgdGhlIGcrKyBjb21waWxlciB3aGljaCB3aWxsIGJlCi11c2VkIHRvIGJ1aWxkIHRoZSB0YXJnZXQgbGlicmFyaWVzLgotCi1UaGVyZSBpcyBvbmUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24gYW5kIGEgY3Jvc3MKLWNvbmZpZ3VyYXRpb24uICBJbiBhIG5hdGl2ZSBjb25maWd1cmF0aW9uLCB0aGUgdGFyZ2V0IGxpYnJhcmllcyBhcmUKLW5vcm1hbGx5IGNvbmZpZ3VyZWQgYW5kIGJ1aWx0IGFzIHNpYmxpbmdzIG9mIHRoZSBob3N0IHRvb2xzLiAgSW4gYSBjcm9zcwotY29uZmlndXJhdGlvbiwgdGhlIHRhcmdldCBsaWJyYXJpZXMgYXJlIG5vcm1hbGx5IGJ1aWx0IGluIGEgc3ViZGlyZWN0b3J5Ci13aG9zZSBuYW1lIGlzIHRoZSBhcmd1bWVudCB0byBAc2FtcHstLXRhcmdldH0uICBUaGlzIGlzIG1haW5seSBmb3IKLWhpc3RvcmljYWwgcmVhc29ucy4KLQotVG8gc3VtbWFyaXplLCBydW5uaW5nIEBzYW1we2NvbmZpZ3VyZX0gaW4gdGhlIEN5Z251cyB0cmVlIGNvbmZpZ3VyZXMgYWxsCi10aGUgaG9zdCBsaWJyYXJpZXMgYW5kIHRvb2xzLCBidXQgZG9lcyBub3QgY29uZmlndXJlIGFueSBvZiB0aGUgdGFyZ2V0Ci1saWJyYXJpZXMuICBSdW5uaW5nIEBzYW1we21ha2V9IHRoZW4gZG9lcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQnVpbGQgdGhlIGhvc3QgbGlicmFyaWVzLgotQGl0ZW0KLUJ1aWxkIHRoZSBob3N0IHByb2dyYW1zLCBpbmNsdWRpbmcgZ2NjLiAgTm90ZSB0aGF0IHdlIGNhbGwgZ2NjIGJvdGggYQotaG9zdCBwcm9ncmFtIChzaW5jZSBpdCBydW5zIG9uIHRoZSBob3N0KSBhbmQgYSB0YXJnZXQgY29tcGlsZXIgKHNpbmNlIGl0Ci1nZW5lcmF0ZXMgY29kZSBmb3IgdGhlIHRhcmdldCkuCi1AaXRlbQotVXNpbmcgdGhlIG5ld2x5IGJ1aWx0IHRhcmdldCBjb21waWxlciwgY29uZmlndXJlIHRoZSB0YXJnZXQgbGlicmFyaWVzLgotQGl0ZW0KLUJ1aWxkIHRoZSB0YXJnZXQgbGlicmFyaWVzLgotQGVuZCBpdGVtaXplCi0KLVRoZSBzdGVwcyBuZWVkIG5vdCBiZSBkb25lIGluIHByZWNpc2VseSB0aGlzIG9yZGVyLCBzaW5jZSB0aGV5IGFyZQotYWN0dWFsbHkgY29udHJvbGxlZCBieSBAZmlsZXtNYWtlZmlsZX0gdGFyZ2V0cy4KLQotQG5vZGUgVGFyZ2V0IExpYnJhcnkgQ29uZmlndXJlIFNjcmlwdHMKLUBzdWJzZWN0aW9uIFRhcmdldCBMaWJyYXJ5IENvbmZpZ3VyZSBTY3JpcHRzCi0KLVRoZXJlIGFyZSBhIGZldyB0aGluZ3MgeW91IG11c3Qga25vdyBpbiBvcmRlciB0byB3cml0ZSBhIGNvbmZpZ3VyZQotc2NyaXB0IGZvciBhIHRhcmdldCBsaWJyYXJ5LiAgVGhpcyBpcyBqdXN0IGEgcXVpY2sgc2tldGNoLCBhbmQgYmVnaW5uZXJzCi1zaG91bGRuJ3Qgd29ycnkgaWYgdGhleSBkb24ndCBmb2xsb3cgZXZlcnl0aGluZyBoZXJlLgotCi1UaGUgdGFyZ2V0IGxpYnJhcmllcyBhcmUgY29uZmlndXJlZCBhbmQgYnVpbHQgdXNpbmcgYSBuZXdseSBidWlsdCB0YXJnZXQKLWNvbXBpbGVyLiAgVGhlcmUgbWF5IG5vdCBiZSBhbnkgc3RhcnR1cCBmaWxlcyBvciBsaWJyYXJpZXMgZm9yIHRoaXMKLXRhcmdldCBjb21waWxlci4gIEluIGZhY3QsIHRob3NlIGZpbGVzIHdpbGwgcHJvYmFibHkgYmUgYnVpbHQgYXMgcGFydCBvZgotc29tZSB0YXJnZXQgbGlicmFyeSwgd2hpY2ggbmF0dXJhbGx5IG1lYW5zIHRoYXQgdGhleSB3aWxsIG5vdCBleGlzdCB3aGVuCi15b3VyIHRhcmdldCBsaWJyYXJ5IGlzIGNvbmZpZ3VyZWQuCi0KLVRoaXMgbWVhbnMgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBmb3IgYSB0YXJnZXQgbGlicmFyeSBtYXkgbm90IHVzZQotYW55IHRlc3Qgd2hpY2ggcmVxdWlyZXMgZG9pbmcgYSBsaW5rLiAgVGhpcyB1bmZvcnR1bmF0ZWx5IGluY2x1ZGVzIG1hbnkKLXVzZWZ1bCBhdXRvY29uZiBtYWNyb3MsIHN1Y2ggYXMgQHNhbXB7QUNfQ0hFQ0tfRlVOQ1N9LiAgYXV0b2NvbmYgbWFjcm9zCi13aGljaCBkbyBhIGNvbXBpbGUgYnV0IG5vdCBhIGxpbmssIHN1Y2ggYXMgQHNhbXB7QUNfQ0hFQ0tfSEVBREVSU30sIG1heQotYmUgdXNlZC4KLQotVGhpcyBpcyBhIHNldmVyZSByZXN0cmljdGlvbiwgYnV0IG5vcm1hbGx5IG5vdCBhIGZhdGFsIG9uZSwgYXMgdGFyZ2V0Ci1saWJyYXJpZXMgY2FuIG9mdGVuIGFzc3VtZSB0aGUgcHJlc2VuY2Ugb2Ygb3RoZXIgdGFyZ2V0IGxpYnJhcmllcywgYW5kCi10aHVzIGtub3cgd2hpY2ggZnVuY3Rpb25zIHdpbGwgYmUgYXZhaWxhYmxlLgotCi1BcyBvZiB0aGlzIHdyaXRpbmcsIHRoZSBhdXRvY29uZiBtYWNybyBAc2FtcHtBQ19QUk9HX0NDfSBkb2VzIGEgbGluayB0bwotbWFrZSBzdXJlIHRoYXQgdGhlIGNvbXBpbGVyIHdvcmtzLiAgVGhpcyBtYXkgZmFpbCBpbiBhIHRhcmdldCBsaWJyYXJ5LAotc28gdGFyZ2V0IGxpYnJhcmllcyBtdXN0IHVzZSBhIGRpZmZlcmVudCBzZXQgb2YgbWFjcm9zIHRvIGxvY2F0ZSB0aGUKLWNvbXBpbGVyLiAgU2VlIHRoZSBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgaW4gYSBkaXJlY3RvcnkgbGlrZQotQGZpbGV7bGliaWJlcnR5fSBvciBAZmlsZXtsaWJnbG9zc30gZm9yIGFuIGV4YW1wbGUuCi0KLUFzIG5vdGVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCB0YXJnZXQgbGlicmFyaWVzIGFyZSBzb21ldGltZXMgYnVpbHQKLWluIGRpcmVjdG9yaWVzIHdoaWNoIGFyZSBzaWJsaW5ncyB0byB0aGUgaG9zdCB0b29scywgYW5kIGFyZSBzb21ldGltZXMKLWJ1aWx0IGluIGEgc3ViZGlyZWN0b3J5LiAgVGhlIEBzYW1wey0td2l0aC10YXJnZXQtc3ViZGlyfSBjb25maWd1cmUKLW9wdGlvbiB3aWxsIGJlIHBhc3NlZCB3aGVuIHRoZSBsaWJyYXJ5IGlzIGNvbmZpZ3VyZWQuICBJdHMgdmFsdWUgd2lsbCBiZQotYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSB0YXJnZXQgbGlicmFyeSBpcyBhIHNpYmxpbmcuICBJdHMgdmFsdWUgd2lsbCBiZQotdGhlIG5hbWUgb2YgdGhlIHN1YmRpcmVjdG9yeSBpZiB0aGUgdGFyZ2V0IGxpYnJhcnkgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0KLUlmIHRoZSBvdmVyYWxsIGJ1aWxkIGlzIG5vdCBhIG5hdGl2ZSBidWlsZCAoaS5lLiwgdGhlIG92ZXJhbGwgY29uZmlndXJlCi11c2VkIHRoZSBAc2FtcHstLXRhcmdldH0gb3B0aW9uKSwgdGhlbiB0aGUgbGlicmFyeSB3aWxsIGJlIGNvbmZpZ3VyZWQKLXdpdGggdGhlIEBzYW1wey0td2l0aC1jcm9zcy1ob3N0fSBvcHRpb24uICBUaGUgdmFsdWUgb2YgdGhpcyBvcHRpb24gd2lsbAotYmUgdGhlIGhvc3Qgc3lzdGVtIG9mIHRoZSBvdmVyYWxsIGJ1aWxkLiAgUmVjYWxsIHRoYXQgdGhlIGhvc3Qgc3lzdGVtIG9mCi10aGUgbGlicmFyeSB3aWxsIGJlIHRoZSB0YXJnZXQgb2YgdGhlIG92ZXJhbGwgYnVpbGQuICBJZiB0aGUgb3ZlcmFsbAotYnVpbGQgaXMgYSBuYXRpdmUgYnVpbGQsIHRoZSBAc2FtcHstLXdpdGgtY3Jvc3MtaG9zdH0gb3B0aW9uIHdpbGwgbm90IGJlCi11c2VkLgotCi1BIGxpYnJhcnkgd2hpY2ggY2FuIGJlIGJ1aWx0IGJvdGggc3RhbmRhbG9uZSBhbmQgYXMgYSB0YXJnZXQgbGlicmFyeSBtYXkKLXdhbnQgdG8gaW5zdGFsbCBpdHNlbGYgaW50byBkaWZmZXJlbnQgZGlyZWN0b3JpZXMgZGVwZW5kaW5nIHVwb24gdGhlCi1jYXNlLiAgV2hlbiBidWlsdCBzdGFuZGFsb25lLCBvciB3aGVuIGJ1aWx0IG5hdGl2ZSwgdGhlIGxpYnJhcnkgc2hvdWxkCi1iZSBpbnN0YWxsZWQgaW4gQHNhbXB7JChsaWJkaXIpfS4gIFdoZW4gYnVpbHQgYXMgYSB0YXJnZXQgbGlicmFyeSB3aGljaAotaXMgbm90IG5hdGl2ZSwgdGhlIGxpYnJhcnkgc2hvdWxkIGJlIGluc3RhbGxlZCBpbiBAc2FtcHskKHRvb2xkaXIpL2xpYn0uCi1UaGUgQHNhbXB7LS13aXRoLWNyb3NzLWhvc3R9IG9wdGlvbiBtYXkgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGVzZQotY2FzZXMuCi0KLVRoaXMgc2FtZSB0ZXN0IG9mIEBzYW1wey0td2l0aC1jcm9zcy1ob3N0fSBtYXkgYmUgdXNlZCB0byBzZWUgd2hldGhlciBpdAotaXMgT0sgdG8gdXNlIGxpbmsgdGVzdHMgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuICBJZiB0aGUKLUBzYW1wey0td2l0aC1jcm9zcy1ob3N0fSBvcHRpb24gaXMgbm90IHVzZWQsIHRoZW4gdGhlIGxpYnJhcnkgaXMgYmVpbmcKLWJ1aWx0IGVpdGhlciBzdGFuZGFsb25lIG9yIG5hdGl2ZSwgYW5kIGEgbGluayBzaG91bGQgd29yay4KLQotQG5vZGUgTWFrZSBUYXJnZXRzIGluIEN5Z251cyBUcmVlCi1Ac3Vic2VjdGlvbiBNYWtlIFRhcmdldHMgaW4gQ3lnbnVzIFRyZWUKLQotVGhlIHRvcCBsZXZlbCBAZmlsZXtNYWtlZmlsZX0gaW4gdGhlIEN5Z251cyB0cmVlIGRlZmluZXMgdGFyZ2V0cyBmb3IKLWV2ZXJ5IGtub3duIHN1YmRpcmVjdG9yeS4KLQotRm9yIGV2ZXJ5IHN1YmRpcmVjdG9yeSBAdmFye2Rpcn0gd2hpY2ggaG9sZHMgYSBob3N0IGxpYnJhcnkgb3IgcHJvZ3JhbSwKLXRoZSBAZmlsZXtNYWtlZmlsZX0gdGFyZ2V0IEBzYW1we2FsbC1AdmFye2Rpcn19IHdpbGwgYnVpbGQgdGhhdCBsaWJyYXJ5Ci1vciBwcm9ncmFtLgotCi1UaGVyZSBhcmUgZGVwZW5kZW5jaWVzIGFtb25nIGhvc3QgdG9vbHMuICBGb3IgZXhhbXBsZSwgYnVpbGRpbmcgZ2NjCi1yZXF1aXJlcyBmaXJzdCBidWlsZGluZyBnYXMsIGJlY2F1c2UgdGhlIGdjYyBidWlsZCBwcm9jZXNzIGludm9rZXMgdGhlCi10YXJnZXQgYXNzZW1ibGVyLiAgVGhlc2UgZGVwZW5kZW5jaWVzIGFyZSByZWZsZWN0ZWQgaW4gdGhlIHRvcCBsZXZlbAotQGZpbGV7TWFrZWZpbGV9LgotCi1Gb3IgZXZlcnkgc3ViZGlyZWN0b3J5IEB2YXJ7ZGlyfSB3aGljaCBob2xkcyBhIHRhcmdldCBsaWJyYXJ5LCB0aGUKLUBmaWxle01ha2VmaWxlfSB0YXJnZXQgQHNhbXB7Y29uZmlndXJlLXRhcmdldC1AdmFye2Rpcn19IHdpbGwgY29uZmlndXJlCi10aGF0IGxpYnJhcnkuICBUaGUgQGZpbGV7TWFrZWZpbGV9IHRhcmdldCBAc2FtcHthbGwtdGFyZ2V0LUB2YXJ7ZGlyfX0KLXdpbGwgYnVpbGQgdGhhdCBsaWJyYXJ5LgotCi1FdmVyeSBAc2FtcHtjb25maWd1cmUtdGFyZ2V0LUB2YXJ7ZGlyfX0gdGFyZ2V0IGRlcGVuZHMgdXBvbgotQHNhbXB7YWxsLWdjY30sIHNpbmNlIGdjYywgdGhlIHRhcmdldCBjb21waWxlciwgaXMgcmVxdWlyZWQgdG8gY29uZmlndXJlCi10aGUgdG9vbC4gIEV2ZXJ5IEBzYW1we2FsbC10YXJnZXQtQHZhcntkaXJ9fSB0YXJnZXQgZGVwZW5kcyB1cG9uIHRoZQotY29ycmVzcG9uZGluZyBAc2FtcHtjb25maWd1cmUtdGFyZ2V0LUB2YXJ7ZGlyfX0gdGFyZ2V0LgotCi1UaGVyZSBhcmUgc2V2ZXJhbCBvdGhlciB0YXJnZXRzIHdoaWNoIG1heSBiZSBvZiBpbnRlcmVzdCBmb3IgZWFjaAotZGlyZWN0b3J5OiBAc2FtcHtpbnN0YWxsLUB2YXJ7ZGlyfX0sIEBzYW1we2NsZWFuLUB2YXJ7ZGlyfX0sIGFuZAotQHNhbXB7Y2hlY2stQHZhcntkaXJ9fS4gIFRoZXJlIGFyZSBhbHNvIGNvcnJlc3BvbmRpbmcgQHNhbXB7dGFyZ2V0fQotdmVyc2lvbnMgb2YgdGhlc2UgZm9yIHRoZSB0YXJnZXQgbGlicmFyaWVzICwgc3VjaCBhcwotQHNhbXB7aW5zdGFsbC10YXJnZXQtQHZhcntkaXJ9fS4KLQotQG5vZGUgVGFyZ2V0IGxpYmliZXJ0eQotQHN1YnNlY3Rpb24gVGFyZ2V0IGxpYmliZXJ0eQotCi1UaGUgQGZpbGV7bGliaWJlcnR5fSBzdWJkaXJlY3RvcnkgaXMgY3VycmVudGx5IGEgc3BlY2lhbCBjYXNlLCBpbiB0aGF0Ci1pdCBpcyB0aGUgb25seSBkaXJlY3Rvcnkgd2hpY2ggaXMgYnVpbHQgYm90aCB1c2luZyB0aGUgaG9zdCBjb21waWxlciBhbmQKLXVzaW5nIHRoZSB0YXJnZXQgY29tcGlsZXIuCi0KLVRoaXMgaXMgYmVjYXVzZSB0aGUgZmlsZXMgaW4gQGZpbGV7bGliaWJlcnR5fSBhcmUgdXNlZCB3aGVuIGJ1aWxkaW5nIHRoZQotaG9zdCB0b29scywgYW5kIHRoZXkgYXJlIGFsc28gaW5jb3Jwb3JhdGVkIGludG8gdGhlIEBmaWxle2xpYnN0ZGMrK30KLXRhcmdldCBsaWJyYXJ5IGFzIHN1cHBvcnQgY29kZS4KLQotVGhpcyBkdWFsaXR5IGRvZXMgbm90IHBvc2UgYW55IHBhcnRpY3VsYXIgZGlmZmljdWx0aWVzLiAgSXQgbWVhbnMgdGhhdAotdGhlcmUgYXJlIHRhcmdldHMgZm9yIGJvdGggQHNhbXB7YWxsLWxpYmliZXJ0eX0gYW5kCi1Ac2FtcHthbGwtdGFyZ2V0LWxpYmliZXJ0eX0uCi0KLUluIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24sIHdoZW4gdGFyZ2V0IGxpYnJhcmllcyBhcmUgbm90IGJ1aWx0IGluIGEKLXN1YmRpcmVjdG9yeSwgdGhlIHNhbWUgb2JqZWN0cyBhcmUgbm9ybWFsbHkgdXNlZCBhcyBib3RoIHRoZSBob3N0IGJ1aWxkCi1hbmQgdGhlIHRhcmdldCBidWlsZC4gIFRoaXMgaXMgbm9ybWFsbHkgT0ssIHNpbmNlIGxpYmliZXJ0eSBjb250YWlucwotb25seSBDIGNvZGUsIGFuZCBpbiBhIG5hdGl2ZSBjb25maWd1cmF0aW9uIHRoZSByZXN1bHRzIG9mIHRoZSBob3N0Ci1jb21waWxlciBhbmQgdGhlIHRhcmdldCBjb21waWxlciBhcmUgbm9ybWFsbHkgaW50ZXJvcGVyYWJsZS4KLQotSXJpeCA2IGlzIGFnYWluIGFuIGV4Y2VwdGlvbiBoZXJlLCBzaW5jZSB0aGUgU0dJIG5hdGl2ZSBjb21waWxlcgotZGVmYXVsdHMgdG8gdXNpbmcgdGhlIEBzYW1we08zMn0gQUJJLCBhbmQgZ2NjIGRlZmF1bHRzIHRvIHVzaW5nIHRoZQotQHNhbXB7TjMyfSBBQkkuICBPbiBJcml4IDYsIHRoZSB0YXJnZXQgbGlicmFyaWVzIGFyZSBidWlsdCBpbiBhCi1zdWJkaXJlY3RvcnkgZXZlbiBmb3IgYSBuYXRpdmUgY29uZmlndXJhdGlvbiwgYXZvaWRpbmcgdGhpcyBwcm9ibGVtLgotCi1UaGVyZSBhcmUgY3VycmVudGx5IG5vIG90aGVyIGxpYnJhcmllcyBidWlsdCBmb3IgYm90aCB0aGUgaG9zdCBhbmQgdGhlCi10YXJnZXQsIGJ1dCB0aGVyZSBpcyBubyBjb25jZXB0dWFsIHByb2JsZW0gd2l0aCBhZGRpbmcgbW9yZS4KLQotQG5vZGUgQ2FuYWRpYW4gQ3Jvc3MKLUBjaGFwdGVyIENhbmFkaWFuIENyb3NzCi1AY2luZGV4IGNhbmFkaWFuIGNyb3NzCi1AY2luZGV4IGJ1aWxkaW5nIHdpdGggYSBjcm9zcyBjb21waWxlcgotQGNpbmRleCBjcm9zcyBjb21waWxlciwgYnVpbGRpbmcgd2l0aAotCi1JdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbSB0byBidWlsZCBhCi1wcm9ncmFtIHdoaWNoIHdpbGwgcnVuIG9uIGEgc3lzdGVtIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzeXN0ZW0gb24KLXdoaWNoIHRoZSB0b29scyBhcmUgYnVpbHQuICBJbiBvdGhlciB3b3JkcywgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQKLXByb2dyYW1zIHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0KLVRoaXMgaXMgcmVmZXJyZWQgdG8gYXMgYSBAZGZue0NhbmFkaWFuIENyb3NzfS4KLQotQG1lbnUKLSogQ2FuYWRpYW4gQ3Jvc3MgRXhhbXBsZTo6CQlDYW5hZGlhbiBDcm9zcyBFeGFtcGxlLgotKiBDYW5hZGlhbiBDcm9zcyBDb25jZXB0czo6CQlDYW5hZGlhbiBDcm9zcyBDb25jZXB0cy4KLSogQnVpbGQgQ3Jvc3MgSG9zdCBUb29sczo6CQlCdWlsZCBDcm9zcyBIb3N0IFRvb2xzLgotKiBCdWlsZCBhbmQgSG9zdCBPcHRpb25zOjoJCUJ1aWxkIGFuZCBIb3N0IE9wdGlvbnMuCi0qIENDcm9zcyBub3QgaW4gQ3lnbnVzIFRyZWU6OgkJQ2FuYWRpYW4gQ3Jvc3Mgbm90IGluIEN5Z251cyBUcmVlLgotKiBDQ3Jvc3MgaW4gQ3lnbnVzIFRyZWU6OgkJQ2FuYWRpYW4gQ3Jvc3MgaW4gQ3lnbnVzIFRyZWUuCi0qIFN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3M6OgkJU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zcy4KLUBlbmQgbWVudQotCi1Abm9kZSBDYW5hZGlhbiBDcm9zcyBFeGFtcGxlCi1Ac2VjdGlvbiBDYW5hZGlhbiBDcm9zcyBFeGFtcGxlCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIENhbmFkaWFuIENyb3NzLgotCi1XaGlsZSBydW5uaW5nIG9uIGEgR05VL0xpbnV4LCB5b3UgY2FuIGJ1aWxkIGEgcHJvZ3JhbSB3aGljaCB3aWxsIHJ1biBvbgotYSBTb2xhcmlzIHN5c3RlbS4gIFlvdSB3b3VsZCB1c2UgYSBHTlUvTGludXggY3Jvc3MgU29sYXJpcyBjb21waWxlciB0bwotYnVpbGQgdGhlIHByb2dyYW0uCi0KLU9mIGNvdXJzZSwgeW91IGNvdWxkIG5vdCBydW4gdGhlIHJlc3VsdGluZyBwcm9ncmFtIG9uIHlvdXIgR05VL0xpbnV4Ci1zeXN0ZW0uICBZb3Ugd291bGQgaGF2ZSB0byBjb3B5IGl0IG92ZXIgdG8gYSBTb2xhcmlzIHN5c3RlbSBiZWZvcmUgeW91Ci13b3VsZCBydW4gaXQuCi0KLU9mIGNvdXJzZSwgeW91IGNvdWxkIGFsc28gc2ltcGx5IGJ1aWxkIHRoZSBwcm9ncmFtcyBvbiB0aGUgU29sYXJpcwotc3lzdGVtIGluIHRoZSBmaXJzdCBwbGFjZS4gIEhvd2V2ZXIsIHBlcmhhcHMgdGhlIFNvbGFyaXMgc3lzdGVtIGlzIG5vdAotYXZhaWxhYmxlIGZvciBzb21lIHJlYXNvbjsgcGVyaGFwcyB5b3UgYWN0dWFsbHkgZG9uJ3QgaGF2ZSBvbmUsIGJ1dCB5b3UKLXdhbnQgdG8gYnVpbGQgdGhlIHRvb2xzIGZvciBzb21lYm9keSBlbHNlIHRvIHVzZS4gIE9yIHBlcmhhcHMgeW91cgotR05VL0xpbnV4IHN5c3RlbSBpcyBtdWNoIGZhc3RlciB0aGFuIHlvdXIgU29sYXJpcyBzeXN0ZW0uCi0KLUEgQ2FuYWRpYW4gQ3Jvc3MgYnVpbGQgaXMgbW9zdCBmcmVxdWVudGx5IHVzZWQgd2hlbiBidWlsZGluZyBwcm9ncmFtcyB0bwotcnVuIG9uIGEgbm9uLVVuaXggc3lzdGVtLCBzdWNoIGFzIERPUyBvciBXaW5kb3dzLiAgSXQgbWF5IGJlIHNpbXBsZXIgdG8KLWNvbmZpZ3VyZSBhbmQgYnVpbGQgb24gYSBVbml4IHN5c3RlbSB0aGFuIHRvIHN1cHBvcnQgdGhlIGNvbmZpZ3VyYXRpb24KLW1hY2hpbmVyeSBvbiBhIG5vbi1Vbml4IHN5c3RlbS4KLQotQG5vZGUgQ2FuYWRpYW4gQ3Jvc3MgQ29uY2VwdHMKLUBzZWN0aW9uIENhbmFkaWFuIENyb3NzIENvbmNlcHRzCi0KLVdoZW4gYnVpbGRpbmcgYSBDYW5hZGlhbiBDcm9zcywgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byBkaWZmZXJlbnQgc3lzdGVtcwotaW52b2x2ZWQ6IHRoZSBzeXN0ZW0gb24gd2hpY2ggdGhlIHRvb2xzIGFyZSBiZWluZyBidWlsdCwgYW5kIHRoZSBzeXN0ZW0KLW9uIHdoaWNoIHRoZSB0b29scyB3aWxsIHJ1bi4KLQotVGhlIHN5c3RlbSBvbiB3aGljaCB0aGUgdG9vbHMgYXJlIGJlaW5nIGJ1aWx0IGlzIGNhbGxlZCB0aGUgQGRmbntidWlsZH0KLXN5c3RlbS4KLQotVGhlIHN5c3RlbSBvbiB3aGljaCB0aGUgdG9vbHMgd2lsbCBydW4gaXMgY2FsbGVkIHRoZSBob3N0IHN5c3RlbS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBTb2xhcmlzIHByb2dyYW0gb24gYSBHTlUvTGludXgKLXN5c3RlbSwgYXMgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIHRoZSBidWlsZCBzeXN0ZW0gd291bGQgYmUgR05VL0xpbnV4LAotYW5kIHRoZSBob3N0IHN5c3RlbSB3b3VsZCBiZSBTb2xhcmlzLgotCi1JdCBpcywgb2YgY291cnNlLCBwb3NzaWJsZSB0byBidWlsZCBhIGNyb3NzIGNvbXBpbGVyIHVzaW5nIGEgQ2FuYWRpYW4KLUNyb3NzIChpLmUuLCBidWlsZCBhIGNyb3NzIGNvbXBpbGVyIHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIpLiAgSW4gdGhpcwotY2FzZSwgdGhlIHN5c3RlbSBmb3Igd2hpY2ggdGhlIHJlc3VsdGluZyBjcm9zcyBjb21waWxlciBnZW5lcmF0ZXMgY29kZQotaXMgY2FsbGVkIHRoZSB0YXJnZXQgc3lzdGVtLiAgKEZvciBhIG1vcmUgY29tcGxldGUgZGlzY3Vzc2lvbiBvZiBob3N0Ci1hbmQgdGFyZ2V0IHN5c3RlbXMsIEBweHJlZntIb3N0IGFuZCBUYXJnZXR9KS4KLQotQW4gZXhhbXBsZSBvZiBidWlsZGluZyBhIGNyb3NzIGNvbXBpbGVyIHVzaW5nIGEgQ2FuYWRpYW4gQ3Jvc3Mgd291bGQgYmUKLWJ1aWxkaW5nIGEgV2luZG93cyBjcm9zcyBNSVBTIEVMRiBjb21waWxlciBvbiBhIEdOVS9MaW51eCBzeXN0ZW0uICBJbgotdGhpcyBjYXNlIHRoZSBidWlsZCBzeXN0ZW0gd291bGQgYmUgR05VL0xpbnV4LCB0aGUgaG9zdCBzeXN0ZW0gd291bGQgYmUKLVdpbmRvd3MsIGFuZCB0aGUgdGFyZ2V0IHN5c3RlbSB3b3VsZCBiZSBNSVBTIEVMRi4KLQotVGhlIG5hbWUgQ2FuYWRpYW4gQ3Jvc3MgY29tZXMgZnJvbSB0aGUgY2FzZSB3aGVuIHRoZSBidWlsZCwgaG9zdCwgYW5kCi10YXJnZXQgc3lzdGVtcyBhcmUgYWxsIGRpZmZlcmVudC4gIEF0IHRoZSB0aW1lIHRoYXQgdGhlc2UgaXNzdWVzIHdlcmUKLWFsbCBiZWluZyBoYXNoZWQgb3V0LCBDYW5hZGEgaGFkIHRocmVlIG5hdGlvbmFsIHBvbGl0aWNhbCBwYXJ0aWVzLgotCi1Abm9kZSBCdWlsZCBDcm9zcyBIb3N0IFRvb2xzCi1Ac2VjdGlvbiBCdWlsZCBDcm9zcyBIb3N0IFRvb2xzCi0KLUluIG9yZGVyIHRvIGNvbmZpZ3VyZSBhIHByb2dyYW0gZm9yIGEgQ2FuYWRpYW4gQ3Jvc3MgYnVpbGQsIHlvdSBtdXN0Ci1maXJzdCBidWlsZCBhbmQgaW5zdGFsbCB0aGUgc2V0IG9mIGNyb3NzIHRvb2xzIHlvdSB3aWxsIHVzZSB0byBidWlsZCB0aGUKLXByb2dyYW0uCi0KLVRoZXNlIHRvb2xzIHdpbGwgYmUgYnVpbGQgY3Jvc3MgaG9zdCB0b29scy4gIFRoYXQgaXMsIHRoZXkgd2lsbCBydW4gb24KLXRoZSBidWlsZCBzeXN0ZW0sIGFuZCB3aWxsIHByb2R1Y2UgY29kZSB0aGF0IHJ1bnMgb24gdGhlIGhvc3Qgc3lzdGVtLgotCi1JdCBpcyBlYXN5IHRvIGNvbmZ1c2UgdGhlIG1lYW5pbmcgb2YgYnVpbGQgYW5kIGhvc3QgaGVyZS4gIEFsd2F5cwotcmVtZW1iZXIgdGhhdCB0aGUgYnVpbGQgc3lzdGVtIGlzIHdoZXJlIHlvdSBhcmUgZG9pbmcgdGhlIGJ1aWxkLCBhbmQgdGhlCi1ob3N0IHN5c3RlbSBpcyB3aGVyZSB0aGUgcmVzdWx0aW5nIHByb2dyYW0gd2lsbCBydW4uICBUaGVyZWZvcmUsIHlvdQotbmVlZCBhIGJ1aWxkIGNyb3NzIGhvc3QgY29tcGlsZXIuCi0KLUluIGdlbmVyYWwsIHlvdSBtdXN0IGhhdmUgYSBjb21wbGV0ZSBjcm9zcyBlbnZpcm9ubWVudCBpbiBvcmRlciB0byBkbwotdGhlIGJ1aWxkLiAgVGhpcyBub3JtYWxseSBtZWFucyBhIGNyb3NzIGNvbXBpbGVyLCBjcm9zcyBhc3NlbWJsZXIsIGFuZAotc28gZm9ydGgsIGFzIHdlbGwgYXMgbGlicmFyaWVzIGFuZCBpbmNsdWRlIGZpbGVzIGZvciB0aGUgaG9zdCBzeXN0ZW0uCi0KLUBub2RlIEJ1aWxkIGFuZCBIb3N0IE9wdGlvbnMKLUBzZWN0aW9uIEJ1aWxkIGFuZCBIb3N0IE9wdGlvbnMKLUBjaW5kZXggY29uZmlndXJpbmcgYSBjYW5hZGlhbiBjcm9zcwotQGNpbmRleCBjYW5hZGlhbiBjcm9zcywgY29uZmlndXJpbmcKLQotV2hlbiB5b3UgcnVuIEBmaWxle2NvbmZpZ3VyZX0sIHlvdSBtdXN0IHVzZSBib3RoIHRoZSBAc2FtcHstLWJ1aWxkfSBhbmQKLUBzYW1wey0taG9zdH0gb3B0aW9ucy4KLQotQGNpbmRleCBAc2FtcHstLWJ1aWxkfSBvcHRpb24KLUBjaW5kZXggYnVpbGQgb3B0aW9uCi1AY2luZGV4IGNvbmZpZ3VyZSBidWlsZCBzeXN0ZW0KLVRoZSBAc2FtcHstLWJ1aWxkfSBvcHRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YKLXRoZSBidWlsZCBzeXN0ZW0uICBUaGlzIGNhbiBub3JtYWxseSBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlCi1AZmlsZXtjb25maWcuZ3Vlc3N9IHNoZWxsIHNjcmlwdCwgYW5kIGl0IGlzIHJlYXNvbmFibGUgdG8gdXNlCi1Ac2FtcHstLWJ1aWxkPWBjb25maWcuZ3Vlc3NgfS4KLQotQGNpbmRleCBAc2FtcHstLWhvc3R9IG9wdGlvbgotQGNpbmRleCBob3N0IG9wdGlvbgotQGNpbmRleCBjb25maWd1cmUgaG9zdAotVGhlIEBzYW1wey0taG9zdH0gb3B0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29uZmlndXJhdGlvbiBuYW1lIG9mCi10aGUgaG9zdCBzeXN0ZW0uCi0KLUFzIHdlIGV4cGxhaW5lZCBlYXJsaWVyLCBAZmlsZXtjb25maWcuZ3Vlc3N9IGlzIHVzZWQgdG8gc2V0IHRoZSBkZWZhdWx0Ci12YWx1ZSBmb3IgdGhlIEBzYW1wey0taG9zdH0gb3B0aW9uIChAcHhyZWZ7VXNpbmcgdGhlIEhvc3QgVHlwZX0pLiAgV2UKLWNhbiBub3cgc2VlIHRoYXQgc2luY2UgQGZpbGV7Y29uZmlnLmd1ZXNzfSByZXR1cm5zIHRoZSB0eXBlIG9mIHN5c3RlbSBvbgotd2hpY2ggaXQgaXMgcnVuLCBpdCByZWFsbHkgaWRlbnRpZmllcyB0aGUgYnVpbGQgc3lzdGVtLiAgU2luY2UgdGhlIGhvc3QKLXN5c3RlbSBpcyBub3JtYWxseSB0aGUgc2FtZSBhcyB0aGUgYnVpbGQgc3lzdGVtIChpLmUuLCBwZW9wbGUgZG8gbm90Ci1ub3JtYWxseSBidWlsZCB1c2luZyBhIGNyb3NzIGNvbXBpbGVyKSwgaXQgaXMgcmVhc29uYWJsZSB0byB1c2UgdGhlCi1yZXN1bHQgb2YgQGZpbGV7Y29uZmlnLmd1ZXNzfSBhcyB0aGUgZGVmYXVsdCBmb3IgdGhlIGhvc3Qgc3lzdGVtIHdoZW4KLXRoZSBAc2FtcHstLWhvc3R9IG9wdGlvbiBpcyBub3QgdXNlZC4KLQotSXQgbWlnaHQgc2VlbSB0aGF0IGlmIHRoZSBAc2FtcHstLWhvc3R9IG9wdGlvbiB3ZXJlIHVzZWQgd2l0aG91dCB0aGUKLUBzYW1wey0tYnVpbGR9IG9wdGlvbiB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGNvdWxkIHJ1bgotQGZpbGV7Y29uZmlnLmd1ZXNzfSB0byBkZXRlcm1pbmUgdGhlIGJ1aWxkIHN5c3RlbSwgYW5kIHByZXN1bWUgYQotQ2FuYWRpYW4gQ3Jvc3MgaWYgdGhlIHJlc3VsdCBvZiBAZmlsZXtjb25maWcuZ3Vlc3N9IGRpZmZlcmVkIGZyb20gdGhlCi1Ac2FtcHstLWhvc3R9IG9wdGlvbi4gIEhvd2V2ZXIsIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHNvbWUgY29uZmlndXJlCi1zY3JpcHRzIGFyZSByb3V0aW5lbHkgcnVuIHVzaW5nIGFuIGV4cGxpY2l0IEBzYW1wey0taG9zdH0gb3B0aW9uLCByYXRoZXIKLXRoYW4gdXNpbmcgdGhlIGRlZmF1bHQgZnJvbSBAZmlsZXtjb25maWcuZ3Vlc3N9LiAgQXMgbm90ZWQgZWFybGllciwgaXQKLWlzIGRpZmZpY3VsdCBvciBpbXBvc3NpYmxlIHRvIHJlbGlhYmx5IGNvbXBhcmUgY29uZmlndXJhdGlvbiBuYW1lcwotKEBweHJlZntVc2luZyB0aGUgVGFyZ2V0IFR5cGV9KS4gIFRoZXJlZm9yZSwgYnkgY29udmVudGlvbiwgaWYgdGhlCi1Ac2FtcHstLWhvc3R9IG9wdGlvbiBpcyB1c2VkLCBidXQgdGhlIEBzYW1wey0tYnVpbGR9IG9wdGlvbiBpcyBub3QgdXNlZCwKLXRoZW4gdGhlIGJ1aWxkIHN5c3RlbSBkZWZhdWx0cyB0byB0aGUgaG9zdCBzeXN0ZW0uCi0KLUBub2RlIENDcm9zcyBub3QgaW4gQ3lnbnVzIFRyZWUKLUBzZWN0aW9uIENhbmFkaWFuIENyb3NzIG5vdCBpbiBDeWdudXMgVHJlZS4KLQotSWYgeW91IGFyZSBub3QgdXNpbmcgdGhlIEN5Z251cyB0cmVlLCB5b3UgbXVzdCBleHBsaWNpdGx5IHNwZWNpZnkgdGhlCi1jcm9zcyB0b29scyB3aGljaCB5b3Ugd2FudCB0byB1c2UgdG8gYnVpbGQgdGhlIHByb2dyYW0uICBUaGlzIGlzIGRvbmUgYnkKLXNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlZm9yZSBydW5uaW5nIHRoZSBAZmlsZXtjb25maWd1cmV9Ci1zY3JpcHQuCi0KLVlvdSBtdXN0IG5vcm1hbGx5IHNldCBhdCBsZWFzdCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIEBzYW1we0NDfSwKLUBzYW1we0FSfSwgYW5kIEBzYW1we1JBTkxJQn0gdG8gdGhlIGNyb3NzIHRvb2xzIHdoaWNoIHlvdSB3YW50IHRvIHVzZSB0bwotYnVpbGQuCi0KLUZvciBzb21lIHByb2dyYW1zLCB5b3UgbXVzdCBzZXQgYWRkaXRpb25hbCBjcm9zcyB0b29scyBhcyB3ZWxsLCBzdWNoIGFzCi1Ac2FtcHtBU30sIEBzYW1we0xEfSwgb3IgQHNhbXB7Tk19LgotCi1Zb3Ugd291bGQgc2V0IHRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byB0aGUgYnVpbGQgY3Jvc3MgdG9vbHMgd2hpY2gKLXlvdSBhcmUgZ29pbmcgdG8gdXNlLgotCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBidWlsZGluZyBhIFNvbGFyaXMgcHJvZ3JhbSBvbiBhIEdOVS9MaW51eAotc3lzdGVtLCBhbmQgeW91ciBHTlUvTGludXggY3Jvc3MgU29sYXJpcyBjb21waWxlciB3ZXJlIG5hbWVkCi1Ac2FtcHtzb2xhcmlzLWdjY30sIHRoZW4geW91IHdvdWxkIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLUBzYW1we0NDfSB0byBAc2FtcHtzb2xhcmlzLWdjY30uCi0KLUBub2RlIENDcm9zcyBpbiBDeWdudXMgVHJlZQotQHNlY3Rpb24gQ2FuYWRpYW4gQ3Jvc3MgaW4gQ3lnbnVzIFRyZWUKLUBjaW5kZXggY2FuYWRpYW4gY3Jvc3MgaW4gY3lnbnVzIHRyZWUKLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBjb25maWd1cmluZyBhbmQgYnVpbGRpbmcgYSBDYW5hZGlhbiBDcm9zcyB3aGVuCi11c2luZyB0aGUgQ3lnbnVzIHRyZWUuCi0KLUBtZW51Ci0qIFN0YW5kYXJkIEN5Z251cyBDQ3Jvc3M6OglCdWlsZGluZyBhIE5vcm1hbCBQcm9ncmFtLgotKiBDcm9zcyBDeWdudXMgQ0Nyb3NzOjoJCUJ1aWxkaW5nIGEgQ3Jvc3MgUHJvZ3JhbS4KLUBlbmQgbWVudQotCi1Abm9kZSBTdGFuZGFyZCBDeWdudXMgQ0Nyb3NzCi1Ac3Vic2VjdGlvbiBCdWlsZGluZyBhIE5vcm1hbCBQcm9ncmFtCi0KLVdoZW4gY29uZmlndXJpbmcgYSBDYW5hZGlhbiBDcm9zcyBpbiB0aGUgQ3lnbnVzIHRyZWUsIGFsbCB0aGUKLWFwcHJvcHJpYXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBzZXQgdG8KLUBzYW1we0B2YXJ7aG9zdH0tQHZhcnt0b29sfX0sIHdoZXJlIEB2YXJ7aG9zdH0gaXMgdGhlIHZhbHVlIHVzZWQgZm9yIHRoZQotQHNhbXB7LS1ob3N0fSBvcHRpb24sIGFuZCBAdmFye3Rvb2x9IGlzIHRoZSBuYW1lIG9mIHRoZSB0b29sIChlLmcuLAotQHNhbXB7Z2NjfSwgQHNhbXB7YXN9LCBldGMuKS4gIFRoZXNlIHRvb2xzIG11c3QgYmUgb24geW91ciBAc2FtcHtQQVRIfS4KLQotQWRkaW5nIGEgcHJlZml4IG9mIEB2YXJ7aG9zdH0gd2lsbCBnaXZlIHRoZSB1c3VhbCBuYW1lIGZvciB0aGUgYnVpbGQKLWNyb3NzIGhvc3QgdG9vbHMuICBUbyBzZWUgdGhpcywgY29uc2lkZXIgdGhhdCB3aGVuIHRoZXNlIGNyb3NzIHRvb2xzCi13ZXJlIGJ1aWx0LCB0aGV5IHdlcmUgY29uZmlndXJlZCB0byBydW4gb24gdGhlIGJ1aWxkIHN5c3RlbSBhbmQgdG8KLXByb2R1Y2UgY29kZSBmb3IgdGhlIGhvc3Qgc3lzdGVtLiAgVGhhdCBpcywgdGhleSB3ZXJlIGNvbmZpZ3VyZWQgd2l0aCBhCi1Ac2FtcHstLXRhcmdldH0gb3B0aW9uIHRoYXQgaXMgdGhlIHNhbWUgYXMgdGhlIHN5c3RlbSB3aGljaCB3ZSBhcmUgbm93Ci1jYWxsaW5nIHRoZSBob3N0LiAgUmVjYWxsIHRoYXQgdGhlIGRlZmF1bHQgbmFtZSBmb3IgaW5zdGFsbGVkIGNyb3NzCi10b29scyB1c2VzIHRoZSB0YXJnZXQgc3lzdGVtIGFzIGEgcHJlZml4IChAcHhyZWZ7VXNpbmcgdGhlIFRhcmdldAotVHlwZX0pLiAgU2luY2UgdGhhdCBpcyB0aGUgc3lzdGVtIHdoaWNoIHdlIGFyZSBub3cgY2FsbGluZyB0aGUgaG9zdCwKLUB2YXJ7aG9zdH0gaXMgdGhlIHJpZ2h0IHByZWZpeCB0byB1c2UuCi0KLUZvciBleGFtcGxlLCBpZiB5b3UgY29uZmlndXJlIHdpdGggQHNhbXB7LS1idWlsZD1pMzg2LWxpbnV4LWdudX0gYW5kCi1Ac2FtcHstLWhvc3Q9c29sYXJpc30sIHRoZW4gdGhlIEN5Z251cyB0cmVlIHdpbGwgYXV0b21hdGljYWxseSBkZWZhdWx0Ci10byB1c2luZyB0aGUgY29tcGlsZXIgQHNhbXB7c29sYXJpcy1nY2N9LiAgWW91IG11c3QgaGF2ZSBwcmV2aW91c2x5Ci1idWlsdCBhbmQgaW5zdGFsbGVkIHRoaXMgY29tcGlsZXIsIHByb2JhYmx5IGJ5IGRvaW5nIGEgYnVpbGQgd2l0aCBubwotQHNhbXB7LS1ob3N0fSBvcHRpb24gYW5kIHdpdGggYSBAc2FtcHstLXRhcmdldH0gb3B0aW9uIG9mCi1Ac2FtcHtzb2xhcmlzfS4KLQotQG5vZGUgQ3Jvc3MgQ3lnbnVzIENDcm9zcwotQHN1YnNlY3Rpb24gQnVpbGRpbmcgYSBDcm9zcyBQcm9ncmFtCi0KLVRoZXJlIGFyZSBhZGRpdGlvbmFsIGNvbnNpZGVyYXRpb25zIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGEgY3Jvc3MKLWNvbXBpbGVyLCByYXRoZXIgdGhhbiBhIG5hdGl2ZSBjb21waWxlciwgaW4gdGhlIEN5Z251cyB0cmVlIHVzaW5nIGEKLUNhbmFkaWFuIENyb3NzLgotCi1XaGVuIHlvdSBidWlsZCBhIGNyb3NzIGNvbXBpbGVyIHVzaW5nIHRoZSBDeWdudXMgdHJlZSwgdGhlbiB0aGUgdGFyZ2V0Ci1saWJyYXJpZXMgd2lsbCBub3JtYWxseSBiZSBidWlsdCB3aXRoIHRoZSBuZXdseSBidWlsdCB0YXJnZXQgY29tcGlsZXIKLShAcHhyZWZ7SG9zdCBhbmQgVGFyZ2V0IExpYnJhcmllc30pLiAgSG93ZXZlciwgdGhpcyB3aWxsIG5vdCB3b3JrIHdoZW4KLWJ1aWxkaW5nIHdpdGggYSBDYW5hZGlhbiBDcm9zcy4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgbmV3bHkgYnVpbHQgdGFyZ2V0Ci1jb21waWxlciB3aWxsIGJlIGEgcHJvZ3JhbSB3aGljaCBydW5zIG9uIHRoZSBob3N0IHN5c3RlbSwgYW5kIHRoZXJlZm9yZQotd2lsbCBub3QgYmUgYWJsZSB0byBydW4gb24gdGhlIGJ1aWxkIHN5c3RlbS4KLQotVGhlcmVmb3JlLCB3aGVuIGJ1aWxkaW5nIGEgY3Jvc3MgY29tcGlsZXIgd2l0aCB0aGUgQ3lnbnVzIHRyZWUsIHlvdSBtdXN0Ci1maXJzdCBpbnN0YWxsIGEgc2V0IG9mIGJ1aWxkIGNyb3NzIHRhcmdldCB0b29scy4gIFRoZXNlIHRvb2xzIHdpbGwgYmUKLXVzZWQgd2hlbiBidWlsZGluZyB0aGUgdGFyZ2V0IGxpYnJhcmllcy4KLQotTm90ZSB0aGF0IHRoaXMgaXMgbm90IGEgcmVxdWlyZW1lbnQgb2YgYSBDYW5hZGlhbiBDcm9zcyBpbiBnZW5lcmFsLiAgRm9yCi1leGFtcGxlLCBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBidWlsZCBqdXN0IHRoZSBob3N0IGNyb3NzIHRhcmdldCB0b29scwotb24gdGhlIGJ1aWxkIHN5c3RlbSwgdG8gY29weSB0aGUgdG9vbHMgdG8gdGhlIGhvc3Qgc3lzdGVtLCBhbmQgdG8gYnVpbGQKLXRoZSB0YXJnZXQgbGlicmFyaWVzIG9uIHRoZSBob3N0IHN5c3RlbS4gIFRoZSByZXF1aXJlbWVudCBmb3IgYnVpbGQKLWNyb3NzIHRhcmdldCB0b29scyBpcyBpbXBvc2VkIGJ5IHRoZSBDeWdudXMgdHJlZSwgd2hpY2ggZXhwZWN0cyB0byBiZQotYWJsZSB0byBidWlsZCBib3RoIGhvc3QgcHJvZ3JhbXMgYW5kIHRhcmdldCBsaWJyYXJpZXMgaW4gYSBzaW5nbGUKLUBzYW1we2NvbmZpZ3VyZX0vQHNhbXB7bWFrZX0gc3RlcC4gIEJlY2F1c2UgaXQgYnVpbGRzIHRoZXNlIGluIGEgc2luZ2xlCi1zdGVwLCBpdCBleHBlY3RzIHRvIGJlIGFibGUgdG8gYnVpbGQgdGhlIHRhcmdldCBsaWJyYXJpZXMgb24gdGhlIGJ1aWxkCi1zeXN0ZW0sIHdoaWNoIG1lYW5zIHRoYXQgaXQgbXVzdCB1c2UgYSBidWlsZCBjcm9zcyB0YXJnZXQgdG9vbGNoYWluLgotCi1Gb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3Ugd2FudCB0byBidWlsZCBhIFdpbmRvd3MgY3Jvc3MgTUlQUyBFTEYgY29tcGlsZXIKLW9uIGEgR05VL0xpbnV4IHN5c3RlbS4gIFlvdSBtdXN0IGhhdmUgcHJldmlvdXNseSBpbnN0YWxsZWQgYm90aCBhCi1HTlUvTGludXggY3Jvc3MgV2luZG93cyBjb21waWxlciBhbmQgYSBHTlUvTGludXggY3Jvc3MgTUlQUyBFTEYKLWNvbXBpbGVyLgotCi1JbiBvcmRlciB0byBidWlsZCB0aGUgV2luZG93cyAoY29uZmlndXJhdGlvbiBuYW1lIEBzYW1we2kzODYtY3lnd2luMzJ9KQotY3Jvc3MgTUlQUyBFTEYgKGNvbmZpZ3VyZSBuYW1lIEBzYW1we21pcHMtZWxmfSkgY29tcGlsZXIsIHlvdSBtaWdodAotZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIChsb25nIGNvbW1hbmQgbGluZXMgYXJlIGJyb2tlbiBhY3Jvc3MKLWxpbmVzIHdpdGggYSB0cmFpbGluZyBiYWNrc2xhc2ggYXMgYSBjb250aW51YXRpb24gY2hhcmFjdGVyKS4KLQotQGV4YW1wbGUKLW1rZGlyIGxpbnV4LXgtY3lnd2luMzIKLWNkIGxpbnV4LXgtY3lnd2luMzIKLUB2YXJ7c3JjZGlyfS9jb25maWd1cmUgLS10YXJnZXQgaTM4Ni1jeWd3aW4zMiAtLXByZWZpeD1AdmFye2luc3RhbGxkaXJ9IFwKLSAgLS1leGVjLXByZWZpeD1AdmFye2luc3RhbGxkaXJ9L0gtaTM4Ni1saW51eAotbWFrZQotbWFrZSBpbnN0YWxsCi1jZCAuLgotbWtkaXIgbGludXgteC1taXBzLWVsZgotY2QgbGludXgteC1taXBzLWVsZgotQHZhcntzcmNkaXJ9L2NvbmZpZ3VyZSAtLXRhcmdldCBtaXBzLWVsZiAtLXByZWZpeD1AdmFye2luc3RhbGxkaXJ9IFwKLSAgLS1leGVjLXByZWZpeD1AdmFye2luc3RhbGxkaXJ9L0gtaTM4Ni1saW51eAotbWFrZQotbWFrZSBpbnN0YWxsCi1jZCAuLgotbWtkaXIgY3lnd2luMzIteC1taXBzLWVsZgotY2QgY3lnd2luMzIteC1taXBzLWVsZgotQHZhcntzcmNkaXJ9L2NvbmZpZ3VyZSAtLWJ1aWxkPWkzODYtbGludXgtZ251IC0taG9zdD1pMzg2LWN5Z3dpbjMyIFwKLSAgLS10YXJnZXQ9bWlwcy1lbGYgLS1wcmVmaXg9QHZhcnt3aW5pbnN0YWxsZGlyfSBcCi0gIC0tZXhlYy1wcmVmaXg9QHZhcnt3aW5pbnN0YWxsZGlyfS9ILWkzODYtY3lnd2luMzIKLW1ha2UKLW1ha2UgaW5zdGFsbAotQGVuZCBleGFtcGxlCi0KLVlvdSB3b3VsZCB0aGVuIGNvcHkgdGhlIGNvbnRlbnRzIG9mIEB2YXJ7d2luaW5zdGFsbGRpcn0gb3ZlciB0byB0aGUKLVdpbmRvd3MgbWFjaGluZSwgYW5kIHJ1biB0aGUgcmVzdWx0aW5nIHByb2dyYW1zLgotCi1Abm9kZSBTdXBwb3J0aW5nIENhbmFkaWFuIENyb3NzCi1Ac2VjdGlvbiBTdXBwb3J0aW5nIENhbmFkaWFuIENyb3NzCi0KLUlmIHlvdSB3YW50IHRvIG1ha2UgaXQgcG9zc2libGUgdG8gYnVpbGQgYSBwcm9ncmFtIHlvdSBhcmUgZGV2ZWxvcGluZwotdXNpbmcgYSBDYW5hZGlhbiBDcm9zcywgeW91IG11c3QgdGFrZSBzb21lIGNhcmUgd2hlbiB3cml0aW5nIHlvdXIKLWNvbmZpZ3VyZSBhbmQgbWFrZSBydWxlcy4gIFNpbXBsZSBjYXNlcyB3aWxsIG5vcm1hbGx5IHdvcmsgY29ycmVjdGx5LgotSG93ZXZlciwgaXQgaXMgbm90IGhhcmQgdG8gd3JpdGUgY29uZmlndXJlIGFuZCBtYWtlIHRlc3RzIHdoaWNoIHdpbGwKLWZhaWwgaW4gYSBDYW5hZGlhbiBDcm9zcy4KLQotQG1lbnUKLSogQ0Nyb3NzIGluIENvbmZpZ3VyZTo6CQlTdXBwb3J0aW5nIENhbmFkaWFuIENyb3NzIGluIENvbmZpZ3VyZSBTY3JpcHRzLgotKiBDQ3Jvc3MgaW4gTWFrZTo6CQlTdXBwb3J0aW5nIENhbmFkaWFuIENyb3NzIGluIE1ha2VmaWxlcy4KLUBlbmQgbWVudQotCi1Abm9kZSBDQ3Jvc3MgaW4gQ29uZmlndXJlCi1Ac3Vic2VjdGlvbiBTdXBwb3J0aW5nIENhbmFkaWFuIENyb3NzIGluIENvbmZpZ3VyZSBTY3JpcHRzCi1AY2luZGV4IGNhbmFkaWFuIGNyb3NzIGluIGNvbmZpZ3VyZQotCi1JbiBhIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSwgYWZ0ZXIgY2FsbGluZyBAc2FtcHtBQ19QUk9HX0NDfSwgeW91IGNhbgotZmluZCBvdXQgd2hldGhlciB0aGlzIGlzIGEgQ2FuYWRpYW4gQ3Jvc3MgY29uZmlndXJlIGJ5IGV4YW1pbmluZyB0aGUKLXNoZWxsIHZhcmlhYmxlIEBzYW1we2Nyb3NzX2NvbXBpbGluZ30uICBJbiBhIENhbmFkaWFuIENyb3NzLCB3aGljaCBtZWFucwotdGhhdCB0aGUgY29tcGlsZXIgaXMgYSBjcm9zcyBjb21waWxlciwgQHNhbXB7Y3Jvc3NfY29tcGlsaW5nfSB3aWxsIGJlCi1Ac2FtcHt5ZXN9LiAgSW4gYSBub3JtYWwgY29uZmlndXJhdGlvbiwgQHNhbXB7Y3Jvc3NfY29tcGlsaW5nfSB3aWxsIGJlCi1Ac2FtcHtub30uCi0KLVlvdSBvcmRpbmFyaWx5IGRvIG5vdCBuZWVkIHRvIGtub3cgdGhlIHR5cGUgb2YgdGhlIGJ1aWxkIHN5c3RlbSBpbiBhCi1jb25maWd1cmUgc2NyaXB0LiAgSG93ZXZlciwgaWYgeW91IGRvIG5lZWQgdGhhdCBpbmZvcm1hdGlvbiwgeW91IGNhbiBnZXQKLWl0IGJ5IHVzaW5nIHRoZSBtYWNybyBAc2FtcHtBQ19DQU5PTklDQUxfU1lTVEVNfSwgdGhlIHNhbWUgbWFjcm8gdGhhdCBpcwotdXNlZCB0byBkZXRlcm1pbmUgdGhlIHRhcmdldCBzeXN0ZW0uICBUaGlzIG1hY3JvIHdpbGwgc2V0IHRoZSB2YXJpYWJsZXMKLUBzYW1we2J1aWxkfSwgQHNhbXB7YnVpbGRfYWxpYXN9LCBAc2FtcHtidWlsZF9jcHV9LCBAc2FtcHtidWlsZF92ZW5kb3J9LAotYW5kIEBzYW1we2J1aWxkX29zfSwgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUgc2ltaWxhciBAc2FtcHt0YXJnZXR9IGFuZAotQHNhbXB7aG9zdH0gdmFyaWFibGVzLCBleGNlcHQgdGhhdCB0aGV5IGRlc2NyaWJlIHRoZSBidWlsZCBzeXN0ZW0uCi0KLVdoZW4gd3JpdGluZyB0ZXN0cyBpbiBAZmlsZXtjb25maWd1cmUuaW59LCB5b3UgbXVzdCByZW1lbWJlciB0aGF0IHlvdQotd2FudCB0byB0ZXN0IHRoZSBob3N0IGVudmlyb25tZW50LCBub3QgdGhlIGJ1aWxkIGVudmlyb25tZW50LgotCi1NYWNyb3MgbGlrZSBAc2FtcHtBQ19DSEVDS19GVU5DU30gd2hpY2ggdXNlIHRoZSBjb21waWxlciB3aWxsIHRlc3QgdGhlCi1ob3N0IGVudmlyb25tZW50LiAgVGhhdCBpcyBiZWNhdXNlIHRoZSB0ZXN0cyB3aWxsIGJlIGRvbmUgYnkgcnVubmluZyB0aGUKLWNvbXBpbGVyLCB3aGljaCBpcyBhY3R1YWxseSBhIGJ1aWxkIGNyb3NzIGhvc3QgY29tcGlsZXIuICBJZiB0aGUKLWNvbXBpbGVyIGNhbiBmaW5kIHRoZSBmdW5jdGlvbiwgdGhhdCBtZWFucyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBwcmVzZW50Ci1pbiB0aGUgaG9zdCBlbnZpcm9ubWVudC4KLQotVGVzdHMgbGlrZSBAc2FtcHt0ZXN0IC1mIC9kZXYvcHR5cDB9LCBvbiB0aGUgb3RoZXIgaGFuZCwgd2lsbCB0ZXN0IHRoZQotYnVpbGQgZW52aXJvbm1lbnQuICBSZW1lbWJlciB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGlzIHJ1bm5pbmcgb24gdGhlCi1idWlsZCBzeXN0ZW0sIG5vdCB0aGUgaG9zdCBzeXN0ZW0uICBJZiB5b3VyIGNvbmZpZ3VyZSBzY3JpcHRzIGV4YW1pbmVzCi1maWxlcywgdGhvc2UgZmlsZXMgd2lsbCBiZSBvbiB0aGUgYnVpbGQgc3lzdGVtLiAgV2hhdGV2ZXIgeW91IGRldGVybWluZQotYmFzZWQgb24gdGhvc2UgZmlsZXMgbWF5IG9yIG1heSBub3QgYmUgdGhlIGNhc2Ugb24gdGhlIGhvc3Qgc3lzdGVtLgotCi1Nb3N0IGF1dG9jb25mIG1hY3JvcyB3aWxsIHdvcmsgY29ycmVjdGx5IGZvciBhIENhbmFkaWFuIENyb3NzLiAgVGhlIG1haW4KLWV4Y2VwdGlvbiBpcyBAc2FtcHtBQ19UUllfUlVOfS4gIFRoaXMgbWFjcm8gdHJpZXMgdG8gY29tcGlsZSBhbmQgcnVuIGEKLXRlc3QgcHJvZ3JhbS4gIFRoaXMgd2lsbCBmYWlsIGluIGEgQ2FuYWRpYW4gQ3Jvc3MsIGJlY2F1c2UgdGhlIHByb2dyYW0KLXdpbGwgYmUgY29tcGlsZWQgZm9yIHRoZSBob3N0IHN5c3RlbSwgd2hpY2ggbWVhbnMgdGhhdCBpdCB3aWxsIG5vdCBydW4KLW9uIHRoZSBidWlsZCBzeXN0ZW0uCi0KLVRoZSBAc2FtcHtBQ19UUllfUlVOfSBtYWNybyBwcm92aWRlcyBhbiBvcHRpb25hbCBhcmd1bWVudCB0byB0ZWxsIHRoZQotY29uZmlndXJlIHNjcmlwdCB3aGF0IHRvIGRvIGluIGEgQ2FuYWRpYW4gQ3Jvc3MuICBJZiB0aGF0IGFyZ3VtZW50IGlzCi1ub3QgcHJlc2VudCwgeW91IHdpbGwgZ2V0IGEgd2FybmluZyB3aGVuIHlvdSBydW4gQHNhbXB7YXV0b2NvbmZ9OgotQHNtYWxsZXhhbXBsZQotd2FybmluZzogQUNfVFJZX1JVTiBjYWxsZWQgd2l0aG91dCBkZWZhdWx0IHRvIGFsbG93IGNyb3NzIGNvbXBpbGluZwotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhpcyB0ZWxscyB5b3UgdGhhdCB0aGUgcmVzdWx0aW5nIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IHdpbGwgbm90IHdvcmsKLXdpdGggYSBDYW5hZGlhbiBDcm9zcy4KLQotSW4gc29tZSBjYXNlcyB3aGlsZSBpdCBtYXkgYmV0dGVyIHRvIHBlcmZvcm0gYSB0ZXN0IGF0IGNvbmZpZ3VyZSB0aW1lLAotaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBwZXJmb3JtIHRoZSB0ZXN0IGF0IHJ1biB0aW1lLiAgSW4gc3VjaCBhIGNhc2UgeW91Ci1jYW4gdXNlIHRoZSBjcm9zcyBjb21waWxpbmcgYXJndW1lbnQgdG8gQHNhbXB7QUNfVFJZX1JVTn0gdG8gdGVsbCB5b3VyCi1wcm9ncmFtIHRoYXQgdGhlIHRlc3QgY291bGQgbm90IGJlIHBlcmZvcm1lZCBhdCBjb25maWd1cmUgdGltZS4KLQotVGhlcmUgYXJlIGEgZmV3IG90aGVyIGF1dG9jb25mIG1hY3JvcyB3aGljaCB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSB3aXRoCi1hIENhbmFkaWFuIENyb3NzOiBhIHBhcnRpYWwgbGlzdCBpcyBAc2FtcHtBQ19GVU5DX0dFVFBHUlB9LAotQHNhbXB7QUNfRlVOQ19TRVRQR1JQfSwgQHNhbXB7QUNfRlVOQ19TRVRWQlVGX1JFVkVSU0VEfSwgYW5kCi1Ac2FtcHtBQ19TWVNfUkVTVEFSVEFCTEVfU1lTQ0FMTFN9LiAgVGhlIEBzYW1we0FDX0NIRUNLX1NJWkVPRn0gbWFjcm8gaXMKLWdlbmVyYWxseSBub3QgdmVyeSB1c2VmdWwgd2l0aCBhIENhbmFkaWFuIENyb3NzOyBpdCBwZXJtaXRzIGFuIG9wdGlvbmFsCi1hcmd1bWVudCBpbmRpY2F0aW5nIHRoZSBkZWZhdWx0IHNpemUsIGJ1dCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB3aGF0Ci10aGUgY29ycmVjdCBkZWZhdWx0IHNob3VsZCBiZS4KLQotQG5vZGUgQ0Nyb3NzIGluIE1ha2UKLUBzdWJzZWN0aW9uIFN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MgaW4gTWFrZWZpbGVzLgotQGNpbmRleCBjYW5hZGlhbiBjcm9zcyBpbiBtYWtlZmlsZQotCi1UaGUgbWFpbiBDYW5hZGlhbiBDcm9zcyBpc3N1ZSBpbiBhIEBmaWxle01ha2VmaWxlfSBhcmlzZXMgd2hlbiB5b3Ugd2FudAotdG8gdXNlIGEgc3Vic2lkaWFyeSBwcm9ncmFtIHRvIGdlbmVyYXRlIGNvZGUgb3IgZGF0YSB3aGljaCB5b3Ugd2lsbCB0aGVuCi1pbmNsdWRlIGluIHlvdXIgcmVhbCBwcm9ncmFtLgotCi1JZiB5b3UgY29tcGlsZSB0aGlzIHN1YnNpZGlhcnkgcHJvZ3JhbSB1c2luZyBAc2FtcHskKENDKX0gaW4gdGhlIHVzdWFsCi13YXksIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIHJ1biBpdC4gIFRoaXMgaXMgYmVjYXVzZSBAc2FtcHskKENDKX0gd2lsbAotYnVpbGQgYSBwcm9ncmFtIGZvciB0aGUgaG9zdCBzeXN0ZW0sIGJ1dCB0aGUgcHJvZ3JhbSBpcyBiZWluZyBidWlsdCBvbgotdGhlIGJ1aWxkIHN5c3RlbS4KLQotWW91IG11c3QgaW5zdGVhZCB1c2UgYSBjb21waWxlciBmb3IgdGhlIGJ1aWxkIHN5c3RlbSwgcmF0aGVyIHRoYW4gdGhlCi1ob3N0IHN5c3RlbS4gIEluIHRoZSBDeWdudXMgdHJlZSwgdGhpcyBtYWtlIHZhcmlhYmxlCi1Ac2FtcHskKENDX0ZPUl9CVUlMRCl9IHdpbGwgaG9sZCBhIGNvbXBpbGVyIGZvciB0aGUgYnVpbGQgc3lzdGVtLgotCi1Ob3RlIHRoYXQgeW91IHNob3VsZCBub3QgaW5jbHVkZSBAZmlsZXtjb25maWcuaH0gaW4gYSBmaWxlIHlvdSBhcmUKLWNvbXBpbGluZyB3aXRoIEBzYW1weyQoQ0NfRk9SX0JVSUxEKX0uICBUaGUgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgd2lsbAotYnVpbGQgQGZpbGV7Y29uZmlnLmh9IHdpdGggaW5mb3JtYXRpb24gZm9yIHRoZSBob3N0IHN5c3RlbS4gIEhvd2V2ZXIsCi15b3UgYXJlIGNvbXBpbGluZyB0aGUgZmlsZSB1c2luZyBhIGNvbXBpbGVyIGZvciB0aGUgYnVpbGQgc3lzdGVtIChhCi1uYXRpdmUgY29tcGlsZXIpLiAgU3Vic2lkaWFyeSBwcm9ncmFtcyBhcmUgbm9ybWFsbHkgc2ltcGxlIGZpbHRlcnMgd2hpY2gKLWRvIG5vIHVzZXIgaW50ZXJhY3Rpb24sIGFuZCBpdCBpcyBub3JtYWxseSBwb3NzaWJsZSB0byB3cml0ZSB0aGVtIGluIGEKLWhpZ2hseSBwb3J0YWJsZSBmYXNoaW9uIHNvIHRoYXQgdGhlIGFic2VuY2Ugb2YgQGZpbGV7Y29uZmlnLmh9IGlzIG5vdAotY3J1Y2lhbC4KLQotQGNpbmRleCBAc2FtcHtIT1NUX0NDfQotVGhlIGdjYyBAZmlsZXtNYWtlZmlsZS5pbn0gc2hvd3MgYSBjb21wbGV4IHNpdHVhdGlvbiBpbiB3aGljaCBjZXJ0YWluCi1maWxlcywgc3VjaCBhcyBAZmlsZXtydGwuY30sIG11c3QgYmUgY29tcGlsZWQgaW50byBib3RoIHN1YnNpZGlhcnkKLXByb2dyYW1zIHJ1biBvbiB0aGUgYnVpbGQgc3lzdGVtIGFuZCBpbnRvIHRoZSBmaW5hbCBwcm9ncmFtLiAgVGhpcwotYXBwcm9hY2ggbWF5IGJlIG9mIGludGVyZXN0IGZvciBhZHZhbmNlZCBidWlsZCBzeXN0ZW0gaGFja2Vycy4gIE5vdGUKLXRoYXQgdGhlIGJ1aWxkIHN5c3RlbSBjb21waWxlciBpcyByYXRoZXIgY29uZnVzaW5nbHkgY2FsbGVkCi1Ac2FtcHtIT1NUX0NDfS4KLQotQG5vZGUgQ3lnbnVzIENvbmZpZ3VyZQotQGNoYXB0ZXIgQ3lnbnVzIENvbmZpZ3VyZQotQGNpbmRleCBjeWdudXMgY29uZmlndXJlCi0KLVRoZSBDeWdudXMgY29uZmlndXJlIHNjcmlwdCBwcmVkYXRlcyBhdXRvY29uZi4gIEFsbCBvZiBpdHMgaW50ZXJlc3RpbmcKLWZlYXR1cmVzIGhhdmUgYmVlbiBpbmNvcnBvcmF0ZWQgaW50byBhdXRvY29uZi4gIE5vIG5ldyBwcm9ncmFtcyBzaG91bGQKLWJlIHdyaXR0ZW4gdG8gdXNlIHRoZSBDeWdudXMgY29uZmlndXJlIHNjcmlwdC4KLQotSG93ZXZlciwgdGhlIEN5Z251cyBjb25maWd1cmUgc2NyaXB0IGlzIHN0aWxsIHVzZWQgaW4gYSBmZXcgcGxhY2VzOiBhdAotdGhlIHRvcCBvZiB0aGUgQ3lnbnVzIHRyZWUgYW5kIGluIGEgZmV3IHRhcmdldCBsaWJyYXJpZXMgaW4gdGhlIEN5Z251cwotdHJlZS4gIFVudGlsIHRob3NlIHVzZXMgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggYXV0b2NvbmYsIHNvbWUgYnJpZWYKLW5vdGVzIGFyZSBhcHByb3ByaWF0ZSBoZXJlLiAgVGhpcyBpcyBub3QgY29tcGxldGUgZG9jdW1lbnRhdGlvbiwgYnV0IGl0Ci1zaG91bGQgYmUgcG9zc2libGUgdG8gdXNlIHRoaXMgYXMgYSBndWlkZSB3aGlsZSBleGFtaW5pbmcgdGhlIHNjcmlwdHMKLXRoZW1zZWx2ZXMuCi0KLUBtZW51Ci0qIEN5Z251cyBDb25maWd1cmUgQmFzaWNzOjoJCUN5Z251cyBDb25maWd1cmUgQmFzaWNzLgotKiBDeWdudXMgQ29uZmlndXJlIGluIEMrKyBMaWJyYXJpZXM6OglDeWdudXMgQ29uZmlndXJlIGluIEMrKyBMaWJyYXJpZXMuCi1AZW5kIG1lbnUKLQotQG5vZGUgQ3lnbnVzIENvbmZpZ3VyZSBCYXNpY3MKLUBzZWN0aW9uIEN5Z251cyBDb25maWd1cmUgQmFzaWNzCi0KLUN5Z251cyBjb25maWd1cmUgZG9lcyBub3QgdXNlIGFueSBnZW5lcmF0ZWQgZmlsZXM7IHRoZXJlIGlzIG5vIHByb2dyYW0KLWNvcnJlc3BvbmRpbmcgdG8gQHNhbXB7YXV0b2NvbmZ9LiAgSW5zdGVhZCwgdGhlcmUgaXMgYSBzaW5nbGUgc2hlbGwKLXNjcmlwdCBuYW1lZCBAc2FtcHtjb25maWd1cmV9IHdoaWNoIG1heSBiZSBmb3VuZCBhdCB0aGUgdG9wIG9mIHRoZQotQ3lnbnVzIHRyZWUuICBUaGlzIHNoZWxsIHNjcmlwdCB3YXMgd3JpdHRlbiBieSBoYW5kOyBpdCB3YXMgbm90Ci1nZW5lcmF0ZWQgYnkgYXV0b2NvbmYsIGFuZCBpdCBpcyBpbmNvcnJlY3QsIGFuZCBpbmRlZWQgaGFybWZ1bCwgdG8gcnVuCi1Ac2FtcHthdXRvY29uZn0gaW4gdGhlIHRvcCBsZXZlbCBvZiBhIEN5Z251cyB0cmVlLgotCi1DeWdudXMgY29uZmlndXJlIHdvcmtzIGluIGEgcGFydGljdWxhciBkaXJlY3RvcnkgYnkgZXhhbWluaW5nIHRoZSBmaWxlCi1AZmlsZXtjb25maWd1cmUuaW59IGluIHRoYXQgZGlyZWN0b3J5LiAgVGhhdCBmaWxlIGlzIGJyb2tlbiBpbnRvIGZvdXIKLXNlcGFyYXRlIHNoZWxsIHNjcmlwdHMuCi0KLVRoZSBmaXJzdCBpcyB0aGUgY29udGVudHMgb2YgQGZpbGV7Y29uZmlndXJlLmlufSB1cCB0byBhIGxpbmUgdGhhdAotc3RhcnRzIHdpdGggQHNhbXB7IyBwZXItaG9zdDp9LiAgVGhpcyBpcyB0aGUgY29tbW9uIHBhcnQuCi0KLVRoZSBzZWNvbmQgaXMgdGhlIHJlc3Qgb2YgQGZpbGV7Y29uZmlndXJlLmlufSB1cCB0byBhIGxpbmUgdGhhdCBzdGFydHMKLXdpdGggQHNhbXB7IyBwZXItdGFyZ2V0On0uICBUaGlzIGlzIHRoZSBwZXIgaG9zdCBwYXJ0LgotCi1UaGUgdGhpcmQgaXMgdGhlIHJlc3Qgb2YgQGZpbGV7Y29uZmlndXJlLmlufSB1cCB0byBhIGxpbmUgdGhhdCBzdGFydHMKLXdpdGggQHNhbXB7IyBwb3N0LXRhcmdldDp9LiAgVGhpcyBpcyB0aGUgcGVyIHRhcmdldCBwYXJ0LgotCi1UaGUgZm91cnRoIGlzIHRoZSByZW1haW5kZXIgb2YgQGZpbGV7Y29uZmlndXJlLmlufS4gIFRoaXMgaXMgdGhlIHBvc3QKLXRhcmdldCBwYXJ0LgotCi1JZiBhbnkgb2YgdGhlc2UgY29tbWVudCBsaW5lcyBhcmUgbWlzc2luZywgdGhlIGNvcnJlc3BvbmRpbmcgc2hlbGwKLXNjcmlwdCBpcyBlbXB0eS4KLQotQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIGZpcnN0IGV4ZWN1dGUgdGhlIGNvbW1vbiBwYXJ0LiAgVGhpcyBtdXN0IHNldCB0aGUKLXNoZWxsIHZhcmlhYmxlIEBzYW1we3NyY3RyaWdnZXJ9IHRvIHRoZSBuYW1lIG9mIGEgc291cmNlIGZpbGUsIHRvCi1jb25maXJtIHRoYXQgQ3lnbnVzIGNvbmZpZ3VyZSBpcyBsb29raW5nIGF0IHRoZSByaWdodCBkaXJlY3RvcnkuICBUaGlzCi1tYXkgc2V0IHRoZSBzaGVsbCB2YXJpYWJsZXMgQHNhbXB7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSBhbmQKLUBzYW1we3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ30uCi0KLUN5Z251cyBjb25maWd1cmUgd2lsbCBuZXh0IHNldCB0aGUgQHNhbXB7YnVpbGR9IGFuZCBAc2FtcHtob3N0fSBzaGVsbAotdmFyaWFibGVzLCBhbmQgZXhlY3V0ZSB0aGUgcGVyIGhvc3QgcGFydC4gIFRoaXMgbWF5IHNldCB0aGUgc2hlbGwKLXZhcmlhYmxlIEBzYW1we2hvc3RfbWFrZWZpbGVfZnJhZ30uCi0KLUN5Z251cyBjb25maWd1cmUgd2lsbCBuZXh0IHNldCB0aGUgQHNhbXB7dGFyZ2V0fSB2YXJpYWJsZSwgYW5kIGV4ZWN1dGUKLXRoZSBwZXIgdGFyZ2V0IHBhcnQuICBUaGlzIG1heSBzZXQgdGhlIHNoZWxsIHZhcmlhYmxlCi1Ac2FtcHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30uCi0KLUFueSBvZiB0aGVzZSBzY3JpcHRzIG1heSBzZXQgdGhlIEBzYW1we3N1YmRpcnN9IHNoZWxsIHZhcmlhYmxlLiAgVGhpcwotdmFyaWFibGUgaXMgYSBsaXN0IG9mIHN1YmRpcmVjdG9yaWVzIHdoZXJlIGEgQGZpbGV7TWFrZWZpbGUuaW59IGZpbGUgbWF5Ci1iZSBmb3VuZC4gIEN5Z251cyBjb25maWd1cmUgd2lsbCBhdXRvbWF0aWNhbGx5IGxvb2sgZm9yIGEKLUBmaWxle01ha2VmaWxlLmlufSBmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIFRoZSBAc2FtcHtzdWJkaXJzfQotc2hlbGwgdmFyaWFibGUgaXMgbm90IG5vcm1hbGx5IHVzZWQsIGFuZCBJIGJlbGlldmUgdGhhdCB0aGUgb25seQotZGlyZWN0b3J5IHdoaWNoIHVzZXMgaXQgYXQgcHJlc2VudCBpcyBAZmlsZXtuZXdsaWJ9LgotCi1Gb3IgZWFjaCBAZmlsZXtNYWtlZmlsZS5pbn0sIEN5Z251cyBjb25maWd1cmUgd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZQotYSBAZmlsZXtNYWtlZmlsZX0gYnkgYWRkaW5nIGRlZmluaXRpb25zIGZvciBAc2FtcHttYWtlfSB2YXJpYWJsZXMgc3VjaAotYXMgQHNhbXB7aG9zdH0gYW5kIEBzYW1we3RhcmdldH0sIGFuZCBhdXRvbWF0aWNhbGx5IGVkaXRpbmcgdGhlIHZhbHVlcwotb2YgQHNhbXB7bWFrZX0gdmFyaWFibGVzIHN1Y2ggYXMgQHNhbXB7cHJlZml4fSBpZiB0aGV5IGFyZSBwcmVzZW50LgotCi1BbHNvLCBpZiBhbnkgb2YgdGhlIEBzYW1we21ha2VmaWxlX2ZyYWd9IHNoZWxsIHZhcmlhYmxlcyBhcmUgc2V0LCBDeWdudXMKLWNvbmZpZ3VyZSB3aWxsIGludGVycHJldCB0aGVtIGFzIGZpbGUgbmFtZXMgcmVsYXRpdmUgdG8gZWl0aGVyIHRoZQotd29ya2luZyBkaXJlY3Rvcnkgb3IgdGhlIHNvdXJjZSBkaXJlY3RvcnksIGFuZCB3aWxsIHJlYWQgdGhlIGNvbnRlbnRzIG9mCi10aGUgZmlsZSBpbnRvIHRoZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9LiAgVGhlIGZpbGUgY29udGVudHMgd2lsbCBiZQotcmVhZCBpbiBhZnRlciB0aGUgZmlyc3QgbGluZSBpbiBAZmlsZXtNYWtlZmlsZS5pbn0gd2hpY2ggc3RhcnRzIHdpdGgKLUBzYW1weyMjIyN9LgotCi1UaGVzZSBAZmlsZXtNYWtlZmlsZX0gZnJhZ21lbnRzIGFyZSB1c2VkIHRvIGN1c3RvbWl6ZSBiZWhhdmlvdXIgZm9yIGEKLXBhcnRpY3VsYXIgaG9zdCBvciB0YXJnZXQuICBUaGV5IHNlcnZlIHRvIHNlbGVjdCBwYXJ0aWN1bGFyIGZpbGVzIHRvCi1jb21waWxlLCBhbmQgdG8gZGVmaW5lIHBhcnRpY3VsYXIgcHJlcHJvY2Vzc29yIG1hY3JvcyBieSBwcm92aWRpbmcKLXZhbHVlcyBmb3IgQHNhbXB7bWFrZX0gdmFyaWFibGVzIHdoaWNoIGFyZSB0aGVuIHVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uLgotQ3lnbnVzIGNvbmZpZ3VyZSwgdW5saWtlIGF1dG9jb25mLCBub3JtYWxseSBkb2VzIG5vdCBkbyBmZWF0dXJlIHRlc3RzLAotYW5kIG5vcm1hbGx5IHJlcXVpcmVzIHN1cHBvcnQgdG8gYmUgYWRkZWQgbWFudWFsbHkgZm9yIGVhY2ggbmV3IGhvc3QuCi0KLVRoZSBAZmlsZXtNYWtlZmlsZX0gZnJhZ21lbnQgc3VwcG9ydCBpcyBzaW1pbGFyIHRvIHRoZSBhdXRvY29uZgotQHNhbXB7QUNfU1VCU1RfRklMRX0gbWFjcm8uCi0KLUFmdGVyIGNyZWF0aW5nIGVhY2ggQGZpbGV7TWFrZWZpbGV9LCB0aGUgcG9zdCB0YXJnZXQgc2NyaXB0IHdpbGwgYmUgcnVuCi0oaS5lLiwgaXQgbWF5IGJlIHJ1biBzZXZlcmFsIHRpbWVzKS4gIFRoaXMgc2NyaXB0IG1heSBmdXJ0aGVyIGN1c3RvbWl6ZQotdGhlIEBmaWxle01ha2VmaWxlfS4gIFdoZW4gaXQgaXMgcnVuLCB0aGUgc2hlbGwgdmFyaWFibGUgQHNhbXB7TWFrZWZpbGV9Ci13aWxsIGhvbGQgdGhlIG5hbWUgb2YgdGhlIEBmaWxle01ha2VmaWxlfSwgaW5jbHVkaW5nIHRoZSBhcHByb3ByaWF0ZQotZGlyZWN0b3J5IGNvbXBvbmVudC4KLQotTGlrZSBhbiBhdXRvY29uZiBnZW5lcmF0ZWQgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQsIEN5Z251cyBjb25maWd1cmUKLXdpbGwgY3JlYXRlIGEgZmlsZSBuYW1lZCBAZmlsZXtjb25maWcuc3RhdHVzfSB3aGljaCwgd2hlbiBydW4sIHdpbGwKLWF1dG9tYXRpY2FsbHkgcmVjcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uICBUaGUgQGZpbGV7Y29uZmlnLnN0YXR1c30gZmlsZQotd2lsbCBzaW1wbHkgZXhlY3V0ZSB0aGUgQ3lnbnVzIGNvbmZpZ3VyZSBzY3JpcHQgYWdhaW4gd2l0aCB0aGUKLWFwcHJvcHJpYXRlIGFyZ3VtZW50cy4KLQotQW55IG9mIHRoZSBwYXJ0cyBvZiBAZmlsZXtjb25maWd1cmUuaW59IG1heSBzZXQgdGhlIHNoZWxsIHZhcmlhYmxlcwotQHNhbXB7ZmlsZXN9IGFuZCBAc2FtcHtsaW5rc30uICBDeWdudXMgY29uZmlndXJlIHdpbGwgc2V0IHVwIHN5bWxpbmtzCi1mcm9tIHRoZSBuYW1lcyBpbiBAc2FtcHtsaW5rc30gdG8gdGhlIGZpbGVzIG5hbWVkIGluIEBzYW1we2ZpbGVzfS4gIFRoaXMKLWlzIHNpbWlsYXIgdG8gdGhlIGF1dG9jb25mIEBzYW1we0FDX0xJTktfRklMRVN9IG1hY3JvLgotCi1GaW5hbGx5LCBhbnkgb2YgdGhlIHBhcnRzIG9mIEBmaWxle2NvbmZpZ3VyZS5pbn0gbWF5IHNldCB0aGUgc2hlbGwKLXZhcmlhYmxlIEBzYW1we2NvbmZpZ2RpcnN9IHRvIGEgc2V0IG9mIHN1YmRpcmVjdG9yaWVzLiAgSWYgaXQgaXMgc2V0LAotQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIHJlY3Vyc2l2ZWx5IHJ1biB0aGUgY29uZmlndXJlIHByb2Nlc3MgaW4gZWFjaAotc3ViZGlyZWN0b3J5LiAgSWYgdGhlIHN1YmRpcmVjdG9yeSB1c2VzIEN5Z251cyBjb25maWd1cmUsIGl0IHdpbGwKLWNvbnRhaW4gYSBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgYnV0IG5vIEBmaWxle2NvbmZpZ3VyZX0gZmlsZSwgaW4KLXdoaWNoIGNhc2UgQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIGludm9rZSBpdHNlbGYgcmVjdXJzaXZlbHkuICBJZiB0aGUKLXN1YmRpcmVjdG9yeSBoYXMgYSBAZmlsZXtjb25maWd1cmV9IGZpbGUsIEN5Z251cyBjb25maWd1cmUgYXNzdW1lcyB0aGF0Ci1pdCBpcyBhbiBhdXRvY29uZiBnZW5lcmF0ZWQgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQsIGFuZCBzaW1wbHkgaW52b2tlcwotaXQgZGlyZWN0bHkuCi0KLUBub2RlIEN5Z251cyBDb25maWd1cmUgaW4gQysrIExpYnJhcmllcwotQHNlY3Rpb24gQ3lnbnVzIENvbmZpZ3VyZSBpbiBDKysgTGlicmFyaWVzCi1AY2luZGV4IEBmaWxle2xpYnN0ZGMrK30gY29uZmlndXJlCi1AY2luZGV4IEBmaWxle2xpYmlvfSBjb25maWd1cmUKLUBjaW5kZXggQGZpbGV7bGliZysrfSBjb25maWd1cmUKLQotVGhlIEMrKyBsaWJyYXJ5IGNvbmZpZ3VyZSBzeXN0ZW0sIHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIsIGRlc2VydmVzCi1zcGVjaWFsIG1lbnRpb24uICBJdCB1c2VzIEN5Z251cyBjb25maWd1cmUsIGJ1dCBpdCBkb2VzIGZlYXR1cmUgdGVzdGluZwotbGlrZSB0aGF0IGRvbmUgYnkgYXV0b2NvbmYgZ2VuZXJhdGVkIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0cy4gIFRoaXMKLWFwcHJvYWNoIGlzIHVzZWQgaW4gdGhlIGxpYnJhcmllcyBAZmlsZXtsaWJpb30sIEBmaWxle2xpYnN0ZGMrK30sIGFuZAotQGZpbGV7bGliZysrfS4KLQotTW9zdCBvZiB0aGUgQGZpbGV7TWFrZWZpbGV9IGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4gb3V0IGJ5IHRoZSBzaGVsbAotc2NyaXB0IEBmaWxle2xpYmlvL2NvbmZpZy5zaGFyZWR9LiAgRWFjaCBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgc2V0cwotY2VydGFpbiBzaGVsbCB2YXJpYWJsZXMsIGFuZCB0aGVuIGludm9rZXMgQGZpbGV7Y29uZmlnLnNoYXJlZH0gdG8gY3JlYXRlCi10d28gcGFja2FnZSBAZmlsZXtNYWtlZmlsZX0gZnJhZ21lbnRzLiAgVGhlc2UgZnJhZ21lbnRzIGFyZSB0aGVuCi1pbmNvcnBvcmF0ZWQgaW50byB0aGUgcmVzdWx0aW5nIEBmaWxle01ha2VmaWxlfSBieSB0aGUgQ3lnbnVzIGNvbmZpZ3VyZQotc2NyaXB0LgotCi1UaGUgZmlsZSBAZmlsZXtfR19jb25maWcuaH0gaXMgY3JlYXRlZCBpbiB0aGUgQGZpbGV7bGliaW99IG9iamVjdAotZGlyZWN0b3J5IGJ5IHJ1bm5pbmcgdGhlIHNoZWxsIHNjcmlwdCBAZmlsZXtsaWJpby9nZW4tcGFyYW1zfS4gIFRoaXMKLXNoZWxsIHNjcmlwdCB1c2VzIGZlYXR1cmUgdGVzdHMgdG8gZGVmaW5lIG1hY3JvcyBhbmQgdHlwZWRlZnMgaW4KLUBmaWxle19HX2NvbmZpZy5ofS4KLQotQG5vZGUgTXVsdGlsaWJzCi1AY2hhcHRlciBNdWx0aWxpYnMKLUBjaW5kZXggbXVsdGlsaWJzCi0KLUZvciBzb21lIHRhcmdldHMgZ2NjIG1heSBoYXZlIGRpZmZlcmVudCBwcm9jZXNzb3IgcmVxdWlyZW1lbnRzIGRlcGVuZGluZwotdXBvbiBjb21tYW5kIGxpbmUgb3B0aW9ucy4gIEFuIG9idmlvdXMgZXhhbXBsZSBpcyB0aGUKLUBzYW1wey1tc29mdC1mbG9hdH0gb3B0aW9uIHN1cHBvcnRlZCBvbiBzZXZlcmFsIHByb2Nlc3NvcnMuICBUaGlzIG9wdGlvbgotbWVhbnMgdGhhdCB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGFyZSBub3QgYXZhaWxhYmxlLCB3aGljaCBtZWFucwotdGhhdCBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zIG11c3QgYmUgZG9uZSBieSBjYWxsaW5nIGFuIGVtdWxhdGlvbgotc3Vicm91dGluZSByYXRoZXIgdGhhbiBieSB1c2luZyBtYWNoaW5lIGluc3RydWN0aW9ucy4KLQotRm9yIHN1Y2ggb3B0aW9ucywgZ2NjIGlzIG9mdGVuIGNvbmZpZ3VyZWQgdG8gY29tcGlsZSB0YXJnZXQgbGlicmFyaWVzCi10d2ljZTogb25jZSB3aXRoIEBzYW1wey1tc29mdC1mbG9hdH0gYW5kIG9uY2Ugd2l0aG91dC4gIFdoZW4gZ2NjCi1jb21waWxlcyB0YXJnZXQgbGlicmFyaWVzIG1vcmUgdGhhbiBvbmNlLCB0aGUgcmVzdWx0aW5nIGxpYnJhcmllcyBhcmUKLWNhbGxlZCBAZGZue211bHRpbGlic30uCi0KLU11bHRpbGlicyBhcmUgbm90IHJlYWxseSBwYXJ0IG9mIHRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0sIGJ1dAotd2UgZGlzY3VzcyB0aGVtIGhlcmUgc2luY2UgdGhleSByZXF1aXJlIHN1cHBvcnQgaW4gdGhlIEBmaWxle2NvbmZpZ3VyZX0KLXNjcmlwdHMgYW5kIEBmaWxle01ha2VmaWxlfXMgdXNlZCBmb3IgdGFyZ2V0IGxpYnJhcmllcy4KLQotQG1lbnUKLSogTXVsdGlsaWJzIGluIGdjYzo6CQkgICAgICAgIE11bHRpbGlicyBpbiBnY2MuCi0qIE11bHRpbGlicyBpbiBUYXJnZXQgTGlicmFyaWVzOjoJTXVsdGlsaWJzIGluIFRhcmdldCBMaWJyYXJpZXMuCi1AZW5kIG1lbnUKLQotQG5vZGUgTXVsdGlsaWJzIGluIGdjYwotQHNlY3Rpb24gTXVsdGlsaWJzIGluIGdjYwotCi1JbiBnY2MsIG11bHRpbGlicyBhcmUgZGVmaW5lZCBieSBzZXR0aW5nIHRoZSB2YXJpYWJsZQotQHNhbXB7TVVMVElMSUJfT1BUSU9OU30gaW4gdGhlIHRhcmdldCBAZmlsZXtNYWtlZmlsZX0gZnJhZ21lbnQuICBTZXZlcmFsCi1vdGhlciBAc2FtcHtNVUxUSUxJQn0gdmFyaWFibGVzIG1heSBhbHNvIGJlIGRlZmluZWQgdGhlcmUuICBAeHJlZntUYXJnZXQKLUZyYWdtZW50LCAsIFRoZSBUYXJnZXQgTWFrZWZpbGUgRnJhZ21lbnQsIGdjYywgVXNpbmcgYW5kIFBvcnRpbmcgR05VCi1DQ30uCi0KLUlmIHlvdSBoYXZlIGJ1aWx0IGdjYywgeW91IGNhbiBzZWUgd2hhdCBtdWx0aWxpYnMgaXQgdXNlcyBieSBydW5uaW5nIGl0Ci13aXRoIHRoZSBAc2FtcHstcHJpbnQtbXVsdGktbGlifSBvcHRpb24uICBUaGUgb3V0cHV0IEBzYW1wey47fSBtZWFucwotdGhhdCBubyBtdWx0aWxpYnMgYXJlIHVzZWQuICBJbiBnZW5lcmFsLCB0aGUgb3V0cHV0IGlzIGEgc2VxdWVuY2Ugb2YKLWxpbmVzLCBvbmUgcGVyIG11bHRpbGliLiAgVGhlIGZpcnN0IHBhcnQgb2YgZWFjaCBsaW5lLCB1cCB0byB0aGUKLUBzYW1wezt9LCBpcyB0aGUgbmFtZSBvZiB0aGUgbXVsdGlsaWIgZGlyZWN0b3J5LiAgVGhlIHNlY29uZCBwYXJ0IGlzIGEKLWxpc3Qgb2YgY29tcGlsZXIgb3B0aW9ucyBzZXBhcmF0ZWQgYnkgQHNhbXB7QEB9IGNoYXJhY3RlcnMuCi0KLU11bHRpbGlicyBhcmUgYnVpbHQgaW4gYSB0cmVlIG9mIGRpcmVjdG9yaWVzLiAgVGhlIHRvcCBvZiB0aGUgdHJlZSwKLXJlcHJlc2VudGVkIGJ5IEBzYW1wey59IGluIHRoZSBsaXN0IG9mIG11bHRpbGliIGRpcmVjdG9yaWVzLCBpcyB0aGUKLWRlZmF1bHQgbGlicmFyeSB0byB1c2Ugd2hlbiBubyBzcGVjaWFsIGNvbXBpbGVyIG9wdGlvbnMgYXJlIHVzZWQuICBUaGUKLXN1YmRpcmVjdG9yaWVzIG9mIHRoZSB0cmVlIGhvbGQgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgdG8gdXNlIHdoZW4KLXBhcnRpY3VsYXIgY29tcGlsZXIgb3B0aW9ucyBhcmUgdXNlZC4KLQotQG5vZGUgTXVsdGlsaWJzIGluIFRhcmdldCBMaWJyYXJpZXMKLUBzZWN0aW9uIE11bHRpbGlicyBpbiBUYXJnZXQgTGlicmFyaWVzCi0KLVRoZSB0YXJnZXQgbGlicmFyaWVzIGluIHRoZSBDeWdudXMgdHJlZSBhcmUgYXV0b21hdGljYWxseSBidWlsdCB3aXRoCi1tdWx0aWxpYnMuICBUaGF0IG1lYW5zIHRoYXQgZWFjaCBsaWJyYXJ5IGlzIGJ1aWx0IG11bHRpcGxlIHRpbWVzLgotCi1UaGlzIGRlZmF1bHQgaXMgc2V0IGluIHRoZSB0b3AgbGV2ZWwgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlLCBieSBhZGRpbmcKLUBzYW1wey0tZW5hYmxlLW11bHRpbGlifSB0byB0aGUgbGlzdCBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIGNvbmZpZ3VyZQotd2hlbiBpdCBpcyBydW4gZm9yIHRoZSB0YXJnZXQgbGlicmFyaWVzIChAcHhyZWZ7SG9zdCBhbmQgVGFyZ2V0Ci1MaWJyYXJpZXN9KS4KLQotRWFjaCB0YXJnZXQgbGlicmFyeSB1c2VzIHRoZSBzaGVsbCBzY3JpcHQgQGZpbGV7Y29uZmlnLW1sLmlufSwgd3JpdHRlbgotYnkgRG91ZyBFdmFucywgdG8gcHJlcGFyZSB0byBidWlsZCB0YXJnZXQgbGlicmFyaWVzLiAgVGhpcyBzaGVsbCBzY3JpcHQKLWlzIGludm9rZWQgYWZ0ZXIgdGhlIEBmaWxle01ha2VmaWxlfSBoYXMgYmVlbiBjcmVhdGVkIGJ5IHRoZQotQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQuICBJZiBtdWx0aWxpYnMgYXJlIG5vdCBlbmFibGVkLCBpdCBkb2VzIG5vdGhpbmcsCi1vdGhlcndpc2UgaXQgbW9kaWZpZXMgdGhlIEBmaWxle01ha2VmaWxlfSB0byBzdXBwb3J0IG11bHRpbGlicy4KLQotVGhlIEBmaWxle2NvbmZpZy1tbC5pbn0gc2NyaXB0IG1ha2VzIG9uZSBjb3B5IG9mIHRoZSBAZmlsZXtNYWtlZmlsZX0gZm9yCi1lYWNoIG11bHRpbGliIGluIHRoZSBhcHByb3ByaWF0ZSBzdWJkaXJlY3RvcnkuICBXaGVuIGNvbmZpZ3VyaW5nIGluIHRoZQotc291cmNlIGRpcmVjdG9yeSAod2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKSwgaXQgd2lsbCBidWlsZCBhIHN5bWxpbmsKLXRyZWUgb2YgdGhlIHNvdXJjZXMgaW4gZWFjaCBzdWJkaXJlY3RvcnkuCi0KLVRoZSBAZmlsZXtjb25maWctbWwuaW59IHNjcmlwdCBzZXRzIHNldmVyYWwgdmFyaWFibGVzIGluIHRoZSB2YXJpb3VzCi1AZmlsZXtNYWtlZmlsZX1zLiAgVGhlIEBmaWxle01ha2VmaWxlLmlufSBtdXN0IGhhdmUgZGVmaW5pdGlvbnMgZm9yCi10aGVzZSB2YXJpYWJsZXMgYWxyZWFkeTsgQGZpbGV7Y29uZmlnLW1sLmlufSBzaW1wbHkgY2hhbmdlcyB0aGUgZXhpc3RpbmcKLXZhbHVlcy4gIFRoZSBAZmlsZXtNYWtlZmlsZX0gc2hvdWxkIHVzZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlc2UKLXZhcmlhYmxlcyB3aGljaCB3aWxsIGRvIHRoZSByaWdodCB0aGluZyBpbiB0aGUgc3ViZGlyZWN0b3JpZXMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gTVVMVElTUkNUT1AKLUBmaWxle2NvbmZpZy1tbC5pbn0gd2lsbCBzZXQgdGhpcyB0byBhIHNlcXVlbmNlIG9mIEBzYW1wey4uL30gc3RyaW5ncywKLXdoZXJlIHRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpcyB0aGUgbnVtYmVyIG9mIG11bHRpbGliIGxldmVscyBpbiB0aGUKLXNvdXJjZSB0cmVlLiAgVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIHRoZSBlbXB0eSBzdHJpbmcuCi1AaXRlbSBNVUxUSUJVSUxEVE9QCi1AZmlsZXtjb25maWctbWwuaW59IHdpbGwgc2V0IHRoaXMgdG8gYSBzZXF1ZW5jZSBvZiBAc2FtcHsuLi99IHN0cmluZ3MsCi13aGVyZSB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgaXMgbnVtYmVyIG9mIG11bHRpbGliIGxldmVscyBpbiB0aGUgb2JqZWN0Ci1kaXJlY3RvcnkuICBUaGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgdGhlIGVtcHR5IHN0cmluZy4gIFRoaXMgd2lsbAotZGlmZmVyIGZyb20gQHNhbXB7TVVMVElTUkNUT1B9IHdoZW4gY29uZmlndXJpbmcgaW4gdGhlIHNvdXJjZSB0cmVlCi0od2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4KLUBpdGVtIE1VTFRJRElSUwotSW4gdGhlIHRvcCBsZXZlbCBAZmlsZXtNYWtlZmlsZX0gb25seSwgQGZpbGV7Y29uZmlnLW1sLmlufSB3aWxsIHNldCB0aGlzCi10byB0aGUgbGlzdCBvZiBtdWx0aWxpYiBzdWJkaXJlY3Rvcmllcy4gIFRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSB0aGUKLWVtcHR5IHN0cmluZy4KLUBpdGVtIE1VTFRJU1VCRElSCi1AZmlsZXtjb25maWctbWwuaW59IHdpbGwgc2V0IHRoaXMgdG8gdGhlIGluc3RhbGxlZCBzdWJkaXJlY3RvcnkgbmFtZSB0bwotdXNlIGZvciB0aGlzIHN1YmRpcmVjdG9yeSwgd2l0aCBhIGxlYWRpbmcgQHNhbXB7L30uICBUaGUgZGVmYXVsdCB2YWx1ZQotc2hvbGQgYmUgdGhlIGVtcHR5IHN0cmluZy4KLUBpdGVtIE1VTFRJRE8KLUBpdGVteCBNVUxUSUNMRUFOCi1JbiB0aGUgdG9wIGxldmVsIEBmaWxle01ha2VmaWxlfSBvbmx5LCBAZmlsZXtjb25maWctbWwuaW59IHdpbGwgc2V0Ci10aGVzZSB2YXJpYWJsZXMgdG8gY29tbWFuZHMgdG8gdXNlIHdoZW4gZG9pbmcgYSByZWN1cnNpdmUgbWFrZS4gIFRoZXNlCi12YXJpYWJsZXMgc2hvdWxkIGJvdGggZGVmYXVsdCB0byB0aGUgc3RyaW5nIEBzYW1we3RydWV9LCBzbyB0aGF0IGJ5Ci1kZWZhdWx0IG5vdGhpbmcgaGFwcGVucy4KLUBlbmQgdGFibGUKLQotQWxsIHJlZmVyZW5jZXMgdG8gdGhlIHBhcmVudCBvZiB0aGUgc291cmNlIGRpcmVjdG9yeSBzaG91bGQgdXNlIHRoZQotdmFyaWFibGUgQHNhbXB7TVVMVElTUkNUT1B9LiAgSW5zdGVhZCBvZiB3cml0aW5nIEBzYW1weyQoc3JjZGlyKS8uLn0sCi15b3UgbXVzdCB3cml0ZSBAc2FtcHskKHNyY2RpcikvJChNVUxUSVNSQ1RPUCkuLn0uCi0KLVNpbWlsYXJseSwgcmVmZXJlbmNlcyB0byB0aGUgcGFyZW50IG9mIHRoZSBvYmplY3QgZGlyZWN0b3J5IHNob3VsZCB1c2UKLXRoZSB2YXJpYWJsZSBAc2FtcHtNVUxUSUJVSUxEVE9QfS4KLQotSW4gdGhlIGluc3RhbGxhdGlvbiB0YXJnZXQsIHRoZSBsaWJyYXJpZXMgc2hvdWxkIGJlIGluc3RhbGxlZCBpbiB0aGUKLXN1YmRpcmVjdG9yeSBAc2FtcHtNVUxUSVNVQkRJUn0uICBJbnN0ZWFkIG9mIGluc3RhbGxpbmcKLUBzYW1weyQobGliZGlyKS9saWJmb28uYX0sIGluc3RhbGwKLUBzYW1weyQobGliZGlyKSQoTVVMVElTVUJESVIpL2xpYmZvby5hfS4KLQotVGhlIEBmaWxle2NvbmZpZy1tbC5pbn0gc2NyaXB0IGFsc28gbW9kaWZpZXMgdGhlIHRvcCBsZXZlbAotQGZpbGV7TWFrZWZpbGV9IHRvIGFkZCBAc2FtcHttdWx0aS1kb30gYW5kIEBzYW1we211bHRpLWNsZWFufSB0YXJnZXRzCi13aGljaCBhcmUgdXNlZCB3aGVuIGJ1aWxkaW5nIG11bHRpbGlicy4KLQotVGhlIGRlZmF1bHQgdGFyZ2V0IG9mIHRoZSBAZmlsZXtNYWtlZmlsZX0gc2hvdWxkIGluY2x1ZGUgdGhlIGZvbGxvd2luZwotY29tbWFuZDoKLUBzbWFsbGV4YW1wbGUKLUBAJChNVUxUSURPKSAkKEZMQUdTX1RPX1BBU1MpIERPPWFsbCBtdWx0aS1kbwotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhpcyBhc3N1bWVzIHRoYXQgQHNhbXB7JChGTEFHU19UT19QQVNTKX0gaXMgZGVmaW5lZCBhcyBhIHNldCBvZgotdmFyaWFibGVzIHRvIHBhc3MgdG8gYSByZWN1cnNpdmUgaW52b2NhdGlvbiBvZiBAc2FtcHttYWtlfS4gIFRoaXMgd2lsbAotYnVpbGQgYWxsIHRoZSBtdWx0aWxpYnMuICBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgQHNhbXB7TVVMVElET30KLWlzIEBzYW1we3RydWV9LCBzbyBieSBkZWZhdWx0IHRoaXMgY29tbWFuZCB3aWxsIGRvIG5vdGhpbmcuICBJdCB3aWxsCi1vbmx5IGRvIHNvbWV0aGluZyBpbiB0aGUgdG9wIGxldmVsIEBmaWxle01ha2VmaWxlfSBpZiBtdWx0aWxpYnMgd2VyZQotZW5hYmxlZC4KLQotVGhlIEBzYW1we2luc3RhbGx9IHRhcmdldCBvZiB0aGUgQGZpbGV7TWFrZWZpbGV9IHNob3VsZCBpbmNsdWRlIHRoZQotZm9sbG93aW5nIGNvbW1hbmQ6Ci1Ac21hbGxleGFtcGxlCi1AQCQoTVVMVElETykgJChGTEFHU19UT19QQVNTKSBETz1pbnN0YWxsIG11bHRpLWRvCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1JbiBnZW5lcmFsLCBhbnkgb3BlcmF0aW9uLCBvdGhlciB0aGFuIGNsZWFuLCB3aGljaCBzaG91bGQgYmUgcGVyZm9ybWVkCi1vbiBhbGwgdGhlIG11bHRpbGlicyBzaG91bGQgdXNlIGEgQHNhbXB7JChNVUxUSURPKX0gbGluZSwgc2V0dGluZyB0aGUKLXZhcmlhYmxlIEBzYW1we0RPfSB0byB0aGUgdGFyZ2V0IG9mIGVhY2ggcmVjdXJzaXZlIGNhbGwgdG8gQHNhbXB7bWFrZX0uCi0KLVRoZSBAc2FtcHtjbGVhbn0gdGFyZ2V0cyAoQHNhbXB7Y2xlYW59LCBAc2FtcHttb3N0bHljbGVhbn0sIGV0Yy4pIHNob3VsZAotdXNlIEBzYW1weyQoTVVMVElDTEVBTil9LiAgRm9yIGV4YW1wbGUsIHRoZSBAc2FtcHtjbGVhbn0gdGFyZ2V0IHNob3VsZAotZG8gdGhpczoKLUBzbWFsbGV4YW1wbGUKLUBAJChNVUxUSUNMRUFOKSBETz1jbGVhbiBtdWx0aS1jbGVhbgotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgRkFRCi1AY2hhcHRlciBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucwotCi1AdGFibGUgQGFzaXMKLUBpdGVtIFdoaWNoIGRvIEkgcnVuIGZpcnN0LCBAc2FtcHthdXRvY29uZn0gb3IgQHNhbXB7YXV0b21ha2V9PwotRXhjZXB0IHdoZW4geW91IGZpcnN0IGFkZCBhdXRvY29uZiBvciBhdXRvbWFrZSBzdXBwb3J0IHRvIGEgcGFja2FnZSwgeW91Ci1zaG91bGRuJ3QgcnVuIGVpdGhlciBieSBoYW5kLiAgSW5zdGVhZCwgY29uZmlndXJlIHdpdGggdGhlCi1Ac2FtcHstLWVuYWJsZS1tYWludGFpbmVyLW1vZGV9IG9wdGlvbiwgYW5kIGxldCBAc2FtcHttYWtlfSB0YWtlIGNhcmUgb2YKLWl0LgotCi1AY2luZGV4IHVuZGVmaW5lZCBtYWNyb3MKLUBpdGVtIEBzYW1we2F1dG9jb25mfSBzYXlzIHNvbWV0aGluZyBhYm91dCB1bmRlZmluZWQgbWFjcm9zLgotVGhpcyBtZWFucyB0aGF0IHlvdSBoYXZlIG1hY3JvcyBpbiB5b3VyIEBmaWxle2NvbmZpZ3VyZS5pbn0gd2hpY2ggYXJlCi1ub3QgZGVmaW5lZCBieSBAc2FtcHthdXRvY29uZn0uICBZb3UgbWF5IGJlIHVzaW5nIGFuIG9sZCB2ZXJzaW9uIG9mCi1Ac2FtcHthdXRvY29uZn07IHRyeSBidWlsZGluZyBhbmQgaW5zdGFsbGluZyBhIG5ld2VyIG9uZS4gIE1ha2Ugc3VyZSB0aGUKLW5ld2x5IGluc3RhbGxsZWQgQHNhbXB7YXV0b2NvbmZ9IGlzIGZpcnN0IG9uIHlvdXIgQHNhbXB7UEFUSH0uICBBbHNvLAotc2VlIHRoZSBuZXh0IHF1ZXN0aW9uLgotCi1AY2luZGV4IEBzYW1we0NZX0dOVV9HRVRURVhUfSBpbiBAZmlsZXtjb25maWd1cmV9Ci1AY2luZGV4IEBzYW1we0FNX1BST0dfTElCVE9PTH0gaW4gQGZpbGV7Y29uZmlndXJlfQotQGl0ZW0gTXkgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgaGFzIHN0dWZmIGxpa2UgQHNhbXB7Q1lfR05VX0dFVFRFWFR9IGluIGl0LgotVGhpcyBtZWFucyB0aGF0IHlvdSBoYXZlIG1hY3JvcyBpbiB5b3VyIEBmaWxle2NvbmZpZ3VyZS5pbn0gd2hpY2ggc2hvdWxkCi1iZSBkZWZpbmVkIGluIHlvdXIgQGZpbGV7YWNsb2NhbC5tNH0gZmlsZSwgYnV0IGFyZW4ndC4gIFRoaXMgdXN1YWxseQotbWVhbnMgdGhhdCBAc2FtcHthY2xvY2FsfSB3YXMgbm90IGFibGUgdG8gYXBwcm9wcmlhdGUgZGVmaW5pdGlvbnMgb2YgdGhlCi1tYWNyb3MuICBNYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBpbnN0YWxsZWQgYWxsIHRoZSBwYWNrYWdlcyB5b3UgbmVlZC4KLUluIHBhcnRpY3VsYXIsIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGluc3RhbGxlZCBsaWJ0b29sICh0aGlzIGlzIHdoZXJlCi1Ac2FtcHtBTV9QUk9HX0xJQlRPT0x9IGlzIGRlZmluZWQpIGFuZCBnZXR0ZXh0ICh0aGlzIGlzIHdoZXJlCi1Ac2FtcHtDWV9HTlVfR0VUVEVYVH0gaXMgZGVmaW5lZCwgYXQgbGVhc3QgaW4gdGhlIEN5Z251cyB2ZXJzaW9uIG9mCi1nZXR0ZXh0KS4KLQotQGNpbmRleCBAZmlsZXtNYWtlZmlsZX0sIGdhcmJhZ2UgY2hhcmFjdGVycwotQGl0ZW0gTXkgQGZpbGV7TWFrZWZpbGV9IGhhcyBAc2FtcHtAQH0gY2hhcmFjdGVycyBpbiBpdC4KLVRoaXMgbWF5IG1lYW4gdGhhdCB5b3UgdHJpZWQgdG8gdXNlIGFuIGF1dG9jb25mIHN1YnN0aXR1dGlvbiBpbiB5b3VyCi1AZmlsZXtNYWtlZmlsZS5pbn0gd2l0aG91dCBhZGRpbmcgdGhlIGFwcHJvcHJpYXRlIEBzYW1we0FDX1NVQlNUfSBjYWxsCi10byB5b3VyIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0LiAgT3IgaXQgbWF5IGp1c3QgbWVhbiB0aGF0IHlvdSBuZWVkIHRvCi1yZWJ1aWxkIEBmaWxle01ha2VmaWxlfSBpbiB5b3VyIGJ1aWxkIGRpcmVjdG9yeS4gIFRvIHJlYnVpbGQKLUBmaWxle01ha2VmaWxlfSBmcm9tIEBmaWxle01ha2VmaWxlLmlufSwgcnVuIHRoZSBzaGVsbCBzY3JpcHQKLUBmaWxle2NvbmZpZy5zdGF0dXN9IHdpdGggbm8gYXJndW1lbnRzLiAgSWYgeW91IG5lZWQgdG8gZm9yY2UKLUBmaWxle2NvbmZpZ3VyZX0gdG8gcnVuIGFnYWluLCBmaXJzdCBydW4gQHNhbXB7Y29uZmlnLnN0YXR1cyAtLXJlY2hlY2t9LgotVGhlc2UgcnVucyBhcmUgbm9ybWFsbHkgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IEBmaWxle01ha2VmaWxlfSB0YXJnZXRzLAotYnV0IGlmIHlvdXIgQGZpbGV7TWFrZWZpbGV9IGhhcyBnb3R0ZW4gbWVzc2VkIHVwIHlvdSdsbCBuZWVkIHRvIGhlbHAKLXRoZW0gYWxvbmcuCi0KLUBjaW5kZXggQHNhbXB7Y29uZmlnLnN0YXR1cyAtLXJlY2hlY2t9Ci1AaXRlbSBXaHkgZG8gSSBoYXZlIHRvIHJ1biBib3RoIEBzYW1we2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrfSBhbmQgQHNhbXB7Y29uZmlnLnN0YXR1c30/Ci1Ob3JtYWxseSwgeW91IGRvbid0OyB0aGV5IHdpbGwgYmUgcnVuIGF1dG9tYXRpY2FsbHkgYnkgQGZpbGV7TWFrZWZpbGV9Ci10YXJnZXRzLiAgSWYgeW91IGRvIG5lZWQgdG8gcnVuIHRoZW0sIHVzZSBAc2FtcHtjb25maWcuc3RhdHVzIC0tcmVjaGVja30KLXRvIHJ1biB0aGUgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgYWdhaW4gd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgYXMgdGhlCi1maXJzdCB0aW1lIHlvdSByYW4gaXQuICBVc2UgQHNhbXB7Y29uZmlnLnN0YXR1c30gKHdpdGggbm8gYXJndW1lbnRzKSB0bwotcmVnZW5lcmF0ZSBhbGwgZmlsZXMgKEBmaWxle01ha2VmaWxlfSwgQGZpbGV7Y29uZmlnLmh9LCBldGMuKSBiYXNlZCBvbgotdGhlIHJlc3VsdHMgb2YgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuICBUaGUgdHdvIGNhc2VzIGFyZSBzZXBhcmF0ZSBiZWNhdXNlCi1pdCBpc24ndCBhbHdheXMgbmVjZXNzYXJ5IHRvIHJlZ2VuZXJhdGUgYWxsIHRoZSBmaWxlcyBhZnRlciBydW5uaW5nCi1Ac2FtcHtjb25maWcuc3RhdHVzIC0tcmVjaGVja30uICBUaGUgQGZpbGV7TWFrZWZpbGV9IHRhcmdldHMgZ2VuZXJhdGVkCi1ieSBhdXRvbWFrZSB3aWxsIHVzZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIEBzYW1we0NPTkZJR19GSUxFU30gYW5kCi1Ac2FtcHtDT05GSUdfSEVBREVSU30gdG8gb25seSByZWdlbmVyYXRlIGZpbGVzIGFzIHRoZXkgYXJlIG5lZWRlZC4KLQotQGl0ZW0gV2hhdCBpcyB0aGUgQ3lnbnVzIHRyZWU/Ci1UaGUgQ3lnbnVzIHRyZWUgaXMgdXNlZCBmb3IgdmFyaW91cyBwYWNrYWdlcyBpbmNsdWRpbmcgZ2RiLCB0aGUgR05VCi1iaW51dGlscywgYW5kIGVnY3MuICBJdCBpcyBhbHNvLCBvZiBjb3Vyc2UsIHVzZWQgZm9yIEN5Z251cyByZWxlYXNlcy4KLUl0IGlzIHRoZSBidWlsZCBzeXN0ZW0gd2hpY2ggd2FzIGRldmVsb3BlZCBhdCBDeWdudXMsIHVzaW5nIHRoZSBDeWdudXMKLWNvbmZpZ3VyZSBzY3JpcHQuICBJdCBwZXJtaXRzIGJ1aWxkaW5nIG1hbnkgZGlmZmVyZW50IHBhY2thZ2VzIHdpdGggYQotc2luZ2xlIGNvbmZpZ3VyZSBhbmQgbWFrZS4gIFRoZSBjb25maWd1cmUgc2NyaXB0cyBpbiB0aGUgdHJlZSBhcmUgYmVpbmcKLWNvbnZlcnRlZCB0byBhdXRvY29uZiwgYnV0IHRoZSBnZW5lcmFsIGJ1aWxkIHN0cnVjdHVyZSByZW1haW5zIGludGFjdC4KLQotQGl0ZW0gV2h5IGRvIEkgaGF2ZSB0byBrZWVwIHJlYnVpbGRpbmcgYW5kIHJlaW5zdGFsbGluZyB0aGUgdG9vbHM/Ci1JIGtub3csIGl0J3MgYSBwYWluLiAgVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIGJ1Z3MgaW4gdGhlIHRvb2xzCi10aGVtc2VsdmVzIHdoaWNoIG5lZWQgdG8gYmUgZml4ZWQsIGFuZCBlYWNoIHRpbWUgdGhhdCBoYXBwZW5zIGV2ZXJ5Ym9keQotd2hvIHVzZXMgdGhlIHRvb2xzIG5lZWQgdG8gcmVpbnN0YWxsIG5ldyB2ZXJzaW9ucyBvZiB0aGVtLiAgSSBkb24ndCBrbm93Ci1pZiB0aGVyZSBpcyBnb2luZyB0byBiZSBhIGNsZXZlciBmaXggdW50aWwgdGhlIHRvb2xzIHN0YWJpbGl6ZS4KLQotQGl0ZW0gV2h5IG5vdCBqdXN0IGhhdmUgYSBDeWdudXMgdHJlZSBAc2FtcHttYWtlfSB0YXJnZXQgdG8gdXBkYXRlIHRoZSB0b29scz8KLVRoZSB0b29scyB1bmZvcnR1bmF0ZWx5IG5lZWQgdG8gYmUgaW5zdGFsbGVkIGJlZm9yZSB0aGV5IGNhbiBiZSB1c2VkLgotVGhhdCBtZWFucyB0aGF0IHRoZXkgbXVzdCBiZSBidWlsdCB1c2luZyBhbiBhcHByb3ByaWF0ZSBwcmVmaXgsIGFuZCBpdAotc2VlbXMgdW53aXNlIHRvIGFzc3VtZSB0aGF0IGV2ZXJ5IGNvbmZpZ3VyYXRpb24gdXNlcyBhbiBhcHByb3ByaWF0ZQotcHJlZml4LiAgSXQgbWlnaHQgYmUgcG9zc2libGUgdG8gbWFrZSB0aGVtIHdvcmsgaW4gcGxhY2UsIG9yIGl0IG1pZ2h0IGJlCi1wb3NzaWJsZSB0byBpbnN0YWxsIHRoZW0gaW4gc29tZSBzdWJkaXJlY3Rvcnk7IHNvIGZhciB0aGVzZSBhcHByb2FjaGVzCi1oYXZlIG5vdCBiZWVuIGltcGxlbWVudGVkLgotQGVuZCB0YWJsZQotCi1Abm9kZSBJbmRleAotQHVubnVtYmVyZWQgSW5kZXgKLQotQHByaW50aW5kZXggY3AKLQotQGNvbnRlbnRzCi1AYnllCmRpZmYgLS1naXQgYS9ldGMvbWFrZS1zdGRzLnRleGkgYi9ldGMvbWFrZS1zdGRzLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDk3NjQuLjAwMDAwMDAKLS0tIGEvZXRjL21ha2Utc3Rkcy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsOTE0ICswLDAgQEAKLUBjb21tZW50IFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSBib3RoIHN0YW5kYXJkcy50ZXhpIGFuZCBtYWtlLnRleGluZm8uCi1AY29tbWVudCBJdCB3YXMgYnJva2VuIG91dCBvZiBzdGFuZGFyZHMudGV4aSBvbiAxLzYvOTMgYnkgcm9sYW5kLgotCi1Abm9kZSBNYWtlZmlsZSBDb252ZW50aW9ucwotQGNoYXB0ZXIgTWFrZWZpbGUgQ29udmVudGlvbnMKLUBjb21tZW50IHN0YW5kYXJkcy50ZXhpIGRvZXMgbm90IHByaW50IGFuIGluZGV4LCBidXQgbWFrZS50ZXhpbmZvIGRvZXMuCi1AY2luZGV4IG1ha2VmaWxlLCBjb252ZW50aW9ucyBmb3IKLUBjaW5kZXggY29udmVudGlvbnMgZm9yIG1ha2VmaWxlcwotQGNpbmRleCBzdGFuZGFyZHMgZm9yIG1ha2VmaWxlcwotCi1UaGlzCi1AaWZpbmZvCi1ub2RlCi1AZW5kIGlmaW5mbwotQGlmdGV4Ci1AaWZzZXQgQ09ERVNURAotc2VjdGlvbgotQGVuZCBpZnNldAotQGlmY2xlYXIgQ09ERVNURAotY2hhcHRlcgotQGVuZCBpZmNsZWFyCi1AZW5kIGlmdGV4Ci1kZXNjcmliZXMgY29udmVudGlvbnMgZm9yIHdyaXRpbmcgdGhlIE1ha2VmaWxlcyBmb3IgR05VIHByb2dyYW1zLgotCi1AbWVudQotKiBNYWtlZmlsZSBCYXNpY3M6OgkJR2VuZXJhbCBDb252ZW50aW9ucyBmb3IgTWFrZWZpbGVzCi0qIFV0aWxpdGllcyBpbiBNYWtlZmlsZXM6OglVdGlsaXRpZXMgaW4gTWFrZWZpbGVzCi0qIENvbW1hbmQgVmFyaWFibGVzOjoJCVZhcmlhYmxlcyBmb3IgU3BlY2lmeWluZyBDb21tYW5kcwotKiBEaXJlY3RvcnkgVmFyaWFibGVzOjoJCVZhcmlhYmxlcyBmb3IgSW5zdGFsbGF0aW9uIERpcmVjdG9yaWVzCi0qIFN0YW5kYXJkIFRhcmdldHM6OgkJU3RhbmRhcmQgVGFyZ2V0cyBmb3IgVXNlcnMKLSogSW5zdGFsbCBDb21tYW5kIENhdGVnb3JpZXM6OiAgVGhyZWUgY2F0ZWdvcmllcyBvZiBjb21tYW5kcyBpbiB0aGUgYGluc3RhbGwnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZTogbm9ybWFsLCBwcmUtaW5zdGFsbCBhbmQgcG9zdC1pbnN0YWxsLgotQGVuZCBtZW51Ci0KLUBub2RlIE1ha2VmaWxlIEJhc2ljcwotQHNlY3Rpb24gR2VuZXJhbCBDb252ZW50aW9ucyBmb3IgTWFrZWZpbGVzCi0KLUV2ZXJ5IE1ha2VmaWxlIHNob3VsZCBjb250YWluIHRoaXMgbGluZToKLQotQGV4YW1wbGUKLVNIRUxMID0gL2Jpbi9zaAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotdG8gYXZvaWQgdHJvdWJsZSBvbiBzeXN0ZW1zIHdoZXJlIHRoZSBAY29kZXtTSEVMTH0gdmFyaWFibGUgbWlnaHQgYmUKLWluaGVyaXRlZCBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIChUaGlzIGlzIG5ldmVyIGEgcHJvYmxlbSB3aXRoIEdOVQotQGNvZGV7bWFrZX0uKQotCi1EaWZmZXJlbnQgQGNvZGV7bWFrZX0gcHJvZ3JhbXMgaGF2ZSBpbmNvbXBhdGlibGUgc3VmZml4IGxpc3RzIGFuZAotaW1wbGljaXQgcnVsZXMsIGFuZCB0aGlzIHNvbWV0aW1lcyBjcmVhdGVzIGNvbmZ1c2lvbiBvciBtaXNiZWhhdmlvci4gIFNvCi1pdCBpcyBhIGdvb2QgaWRlYSB0byBzZXQgdGhlIHN1ZmZpeCBsaXN0IGV4cGxpY2l0bHkgdXNpbmcgb25seSB0aGUKLXN1ZmZpeGVzIHlvdSBuZWVkIGluIHRoZSBwYXJ0aWN1bGFyIE1ha2VmaWxlLCBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGUgZmlyc3QgbGluZSBjbGVhcnMgb3V0IHRoZSBzdWZmaXggbGlzdCwgdGhlIHNlY29uZCBpbnRyb2R1Y2VzIGFsbAotc3VmZml4ZXMgd2hpY2ggbWF5IGJlIHN1YmplY3QgdG8gaW1wbGljaXQgcnVsZXMgaW4gdGhpcyBNYWtlZmlsZS4KLQotRG9uJ3QgYXNzdW1lIHRoYXQgQGZpbGV7Ln0gaXMgaW4gdGhlIHBhdGggZm9yIGNvbW1hbmQgZXhlY3V0aW9uLiAgV2hlbgoteW91IG5lZWQgdG8gcnVuIHByb2dyYW1zIHRoYXQgYXJlIGEgcGFydCBvZiB5b3VyIHBhY2thZ2UgZHVyaW5nIHRoZQotbWFrZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IGl0IHVzZXMgQGZpbGV7Li99IGlmIHRoZSBwcm9ncmFtIGlzIGJ1aWx0IGFzCi1wYXJ0IG9mIHRoZSBtYWtlIG9yIEBmaWxleyQoc3JjZGlyKS99IGlmIHRoZSBmaWxlIGlzIGFuIHVuY2hhbmdpbmcgcGFydAotb2YgdGhlIHNvdXJjZSBjb2RlLiAgV2l0aG91dCBvbmUgb2YgdGhlc2UgcHJlZml4ZXMsIHRoZSBjdXJyZW50IHNlYXJjaAotcGF0aCBpcyB1c2VkLgotCi1UaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBAZmlsZXsuL30gKHRoZSBAZGZue2J1aWxkIGRpcmVjdG9yeX0pIGFuZAotQGZpbGV7JChzcmNkaXIpL30gKHRoZSBAZGZue3NvdXJjZSBkaXJlY3Rvcnl9KSBpcyBpbXBvcnRhbnQgYmVjYXVzZQotdXNlcnMgY2FuIGJ1aWxkIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5IHVzaW5nIHRoZSBAc2FtcHstLXNyY2Rpcn0gb3B0aW9uCi10byBAZmlsZXtjb25maWd1cmV9LiAgQSBydWxlIG9mIHRoZSBmb3JtOgotCi1Ac21hbGxleGFtcGxlCi1mb28uMSA6IGZvby5tYW4gc2Vkc2NyaXB0Ci0gICAgICAgIHNlZCAtZSBzZWRzY3JpcHQgZm9vLm1hbiA+IGZvby4xCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdpbGwgZmFpbCB3aGVuIHRoZSBidWlsZCBkaXJlY3RvcnkgaXMgbm90IHRoZSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlCi1AZmlsZXtmb28ubWFufSBhbmQgQGZpbGV7c2Vkc2NyaXB0fSBhcmUgaW4gdGhlIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgotCi1XaGVuIHVzaW5nIEdOVSBAY29kZXttYWtlfSwgcmVseWluZyBvbiBAc2FtcHtWUEFUSH0gdG8gZmluZCB0aGUgc291cmNlCi1maWxlIHdpbGwgd29yayBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBhIHNpbmdsZSBkZXBlbmRlbmN5IGZpbGUsCi1zaW5jZSB0aGUgQGNvZGV7bWFrZX0gYXV0b21hdGljIHZhcmlhYmxlIEBzYW1weyQ8fSB3aWxsIHJlcHJlc2VudCB0aGUKLXNvdXJjZSBmaWxlIHdoZXJldmVyIGl0IGlzLiAgKE1hbnkgdmVyc2lvbnMgb2YgQGNvZGV7bWFrZX0gc2V0IEBzYW1weyQ8fQotb25seSBpbiBpbXBsaWNpdCBydWxlcy4pICBBIE1ha2VmaWxlIHRhcmdldCBsaWtlCi0KLUBzbWFsbGV4YW1wbGUKLWZvby5vIDogYmFyLmMKLSAgICAgICAgJChDQykgLUkuIC1JJChzcmNkaXIpICQoQ0ZMQUdTKSAtYyBiYXIuYyAtbyBmb28ubwotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1zaG91bGQgaW5zdGVhZCBiZSB3cml0dGVuIGFzCi0KLUBzbWFsbGV4YW1wbGUKLWZvby5vIDogYmFyLmMKLSAgICAgICAgJChDQykgLUkuIC1JJChzcmNkaXIpICQoQ0ZMQUdTKSAtYyAkPCAtbyAkQEAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotaW4gb3JkZXIgdG8gYWxsb3cgQHNhbXB7VlBBVEh9IHRvIHdvcmsgY29ycmVjdGx5LiAgV2hlbiB0aGUgdGFyZ2V0IGhhcwotbXVsdGlwbGUgZGVwZW5kZW5jaWVzLCB1c2luZyBhbiBleHBsaWNpdCBAc2FtcHskKHNyY2Rpcil9IGlzIHRoZSBlYXNpZXN0Ci13YXkgdG8gbWFrZSB0aGUgcnVsZSB3b3JrIHdlbGwuICBGb3IgZXhhbXBsZSwgdGhlIHRhcmdldCBhYm92ZSBmb3IKLUBmaWxle2Zvby4xfSBpcyBiZXN0IHdyaXR0ZW4gYXM6Ci0KLUBzbWFsbGV4YW1wbGUKLWZvby4xIDogZm9vLm1hbiBzZWRzY3JpcHQKLSAgICAgICAgc2VkIC1lICQoc3JjZGlyKS9zZWRzY3JpcHQgJChzcmNkaXIpL2Zvby5tYW4gPiAkQEAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUdOVSBkaXN0cmlidXRpb25zIHVzdWFsbHkgY29udGFpbiBzb21lIGZpbGVzIHdoaWNoIGFyZSBub3Qgc291cmNlCi1maWxlcy0tLWZvciBleGFtcGxlLCBJbmZvIGZpbGVzLCBhbmQgdGhlIG91dHB1dCBmcm9tIEF1dG9jb25mLCBBdXRvbWFrZSwKLUJpc29uIG9yIEZsZXguICBTaW5jZSB0aGVzZSBmaWxlcyBub3JtYWxseSBhcHBlYXIgaW4gdGhlIHNvdXJjZQotZGlyZWN0b3J5LCB0aGV5IHNob3VsZCBhbHdheXMgYXBwZWFyIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LCBub3QgaW4gdGhlCi1idWlsZCBkaXJlY3RvcnkuICBTbyBNYWtlZmlsZSBydWxlcyB0byB1cGRhdGUgdGhlbSBzaG91bGQgcHV0IHRoZQotdXBkYXRlZCBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4KLQotSG93ZXZlciwgaWYgYSBmaWxlIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgZGlzdHJpYnV0aW9uLCB0aGVuIHRoZQotTWFrZWZpbGUgc2hvdWxkIG5vdCBwdXQgaXQgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgYnVpbGRpbmcgYQotcHJvZ3JhbSBpbiBvcmRpbmFyeSBjaXJjdW1zdGFuY2VzIHNob3VsZCBub3QgbW9kaWZ5IHRoZSBzb3VyY2UgZGlyZWN0b3J5Ci1pbiBhbnkgd2F5LgotCi1UcnkgdG8gbWFrZSB0aGUgYnVpbGQgYW5kIGluc3RhbGxhdGlvbiB0YXJnZXRzLCBhdCBsZWFzdCAoYW5kIGFsbCB0aGVpcgotc3VidGFyZ2V0cykgd29yayBjb3JyZWN0bHkgd2l0aCBhIHBhcmFsbGVsIEBjb2Rle21ha2V9LgotCi1Abm9kZSBVdGlsaXRpZXMgaW4gTWFrZWZpbGVzCi1Ac2VjdGlvbiBVdGlsaXRpZXMgaW4gTWFrZWZpbGVzCi0KLVdyaXRlIHRoZSBNYWtlZmlsZSBjb21tYW5kcyAoYW5kIGFueSBzaGVsbCBzY3JpcHRzLCBzdWNoIGFzCi1AY29kZXtjb25maWd1cmV9KSB0byBydW4gaW4gQGNvZGV7c2h9LCBub3QgaW4gQGNvZGV7Y3NofS4gIERvbid0IHVzZSBhbnkKLXNwZWNpYWwgZmVhdHVyZXMgb2YgQGNvZGV7a3NofSBvciBAY29kZXtiYXNofS4KLQotVGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IGFuZCB0aGUgTWFrZWZpbGUgcnVsZXMgZm9yIGJ1aWxkaW5nIGFuZAotaW5zdGFsbGF0aW9uIHNob3VsZCBub3QgdXNlIGFueSB1dGlsaXRpZXMgZGlyZWN0bHkgZXhjZXB0IHRoZXNlOgotCi1AYyBkZCBmaW5kCi1AYyBndW56aXAgZ3ppcCBtZDVzdW0KLUBjIG1rZmlmbyBta25vZCB0ZWUgdW5hbWUgCi0KLUBleGFtcGxlCi1jYXQgY21wIGNwIGRpZmYgZWNobyBlZ3JlcCBleHByIGZhbHNlIGdyZXAgaW5zdGFsbC1pbmZvCi1sbiBscyBta2RpciBtdiBwd2Qgcm0gcm1kaXIgc2VkIHNsZWVwIHNvcnQgdGFyIHRlc3QgdG91Y2ggdHJ1ZQotQGVuZCBleGFtcGxlCi0KLVRoZSBjb21wcmVzc2lvbiBwcm9ncmFtIEBjb2Rle2d6aXB9IGNhbiBiZSB1c2VkIGluIHRoZSBAY29kZXtkaXN0fSBydWxlLgotCi1TdGljayB0byB0aGUgZ2VuZXJhbGx5IHN1cHBvcnRlZCBvcHRpb25zIGZvciB0aGVzZSBwcm9ncmFtcy4gIEZvcgotZXhhbXBsZSwgZG9uJ3QgdXNlIEBzYW1we21rZGlyIC1wfSwgY29udmVuaWVudCBhcyBpdCBtYXkgYmUsIGJlY2F1c2UKLW1vc3Qgc3lzdGVtcyBkb24ndCBzdXBwb3J0IGl0LgotCi1JdCBpcyBhIGdvb2QgaWRlYSB0byBhdm9pZCBjcmVhdGluZyBzeW1ib2xpYyBsaW5rcyBpbiBtYWtlZmlsZXMsIHNpbmNlIGEKLWZldyBzeXN0ZW1zIGRvbid0IHN1cHBvcnQgdGhlbS4KLQotVGhlIE1ha2VmaWxlIHJ1bGVzIGZvciBidWlsZGluZyBhbmQgaW5zdGFsbGF0aW9uIGNhbiBhbHNvIHVzZSBjb21waWxlcnMKLWFuZCByZWxhdGVkIHByb2dyYW1zLCBidXQgc2hvdWxkIGRvIHNvIHZpYSBAY29kZXttYWtlfSB2YXJpYWJsZXMgc28gdGhhdCB0aGUKLXVzZXIgY2FuIHN1YnN0aXR1dGUgYWx0ZXJuYXRpdmVzLiAgSGVyZSBhcmUgc29tZSBvZiB0aGUgcHJvZ3JhbXMgd2UKLW1lYW46Ci0KLUBleGFtcGxlCi1hciBiaXNvbiBjYyBmbGV4IGluc3RhbGwgbGQgbGRjb25maWcgbGV4Ci1tYWtlIG1ha2VpbmZvIHJhbmxpYiB0ZXhpMmR2aSB5YWNjCi1AZW5kIGV4YW1wbGUKLQotVXNlIHRoZSBmb2xsb3dpbmcgQGNvZGV7bWFrZX0gdmFyaWFibGVzIHRvIHJ1biB0aG9zZSBwcm9ncmFtczoKLQotQGV4YW1wbGUKLSQoQVIpICQoQklTT04pICQoQ0MpICQoRkxFWCkgJChJTlNUQUxMKSAkKExEKSAkKExEQ09ORklHKSAkKExFWCkKLSQoTUFLRSkgJChNQUtFSU5GTykgJChSQU5MSUIpICQoVEVYSTJEVkkpICQoWUFDQykKLUBlbmQgZXhhbXBsZQotCi1XaGVuIHlvdSB1c2UgQGNvZGV7cmFubGlifSBvciBAY29kZXtsZGNvbmZpZ30sIHlvdSBzaG91bGQgbWFrZSBzdXJlCi1ub3RoaW5nIGJhZCBoYXBwZW5zIGlmIHRoZSBzeXN0ZW0gZG9lcyBub3QgaGF2ZSB0aGUgcHJvZ3JhbSBpbiBxdWVzdGlvbi4KLUFycmFuZ2UgdG8gaWdub3JlIGFuIGVycm9yIGZyb20gdGhhdCBjb21tYW5kLCBhbmQgcHJpbnQgYSBtZXNzYWdlIGJlZm9yZQotdGhlIGNvbW1hbmQgdG8gdGVsbCB0aGUgdXNlciB0aGF0IGZhaWx1cmUgb2YgdGhpcyBjb21tYW5kIGRvZXMgbm90IG1lYW4KLWEgcHJvYmxlbS4gIChUaGUgQXV0b2NvbmYgQHNhbXB7QUNfUFJPR19SQU5MSUJ9IG1hY3JvIGNhbiBoZWxwIHdpdGgKLXRoaXMuKQotCi1JZiB5b3UgdXNlIHN5bWJvbGljIGxpbmtzLCB5b3Ugc2hvdWxkIGltcGxlbWVudCBhIGZhbGxiYWNrIGZvciBzeXN0ZW1zCi10aGF0IGRvbid0IGhhdmUgc3ltYm9saWMgbGlua3MuCi0KLUFkZGl0aW9uYWwgdXRpbGl0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdmlhIE1ha2UgdmFyaWFibGVzIGFyZToKLQotQGV4YW1wbGUKLWNoZ3JwIGNobW9kIGNob3duIG1rbm9kCi1AZW5kIGV4YW1wbGUKLQotSXQgaXMgb2sgdG8gdXNlIG90aGVyIHV0aWxpdGllcyBpbiBNYWtlZmlsZSBwb3J0aW9ucyAob3Igc2NyaXB0cykKLWludGVuZGVkIG9ubHkgZm9yIHBhcnRpY3VsYXIgc3lzdGVtcyB3aGVyZSB5b3Uga25vdyB0aG9zZSB1dGlsaXRpZXMKLWV4aXN0LgotCi1Abm9kZSBDb21tYW5kIFZhcmlhYmxlcwotQHNlY3Rpb24gVmFyaWFibGVzIGZvciBTcGVjaWZ5aW5nIENvbW1hbmRzCi0KLU1ha2VmaWxlcyBzaG91bGQgcHJvdmlkZSB2YXJpYWJsZXMgZm9yIG92ZXJyaWRpbmcgY2VydGFpbiBjb21tYW5kcywgb3B0aW9ucywKLWFuZCBzbyBvbi4KLQotSW4gcGFydGljdWxhciwgeW91IHNob3VsZCBydW4gbW9zdCB1dGlsaXR5IHByb2dyYW1zIHZpYSB2YXJpYWJsZXMuCi1UaHVzLCBpZiB5b3UgdXNlIEJpc29uLCBoYXZlIGEgdmFyaWFibGUgbmFtZWQgQGNvZGV7QklTT059IHdob3NlIGRlZmF1bHQKLXZhbHVlIGlzIHNldCB3aXRoIEBzYW1we0JJU09OID0gYmlzb259LCBhbmQgcmVmZXIgdG8gaXQgd2l0aAotQGNvZGV7JChCSVNPTil9IHdoZW5ldmVyIHlvdSBuZWVkIHRvIHVzZSBCaXNvbi4KLQotRmlsZSBtYW5hZ2VtZW50IHV0aWxpdGllcyBzdWNoIGFzIEBjb2Rle2xufSwgQGNvZGV7cm19LCBAY29kZXttdn0sIGFuZAotc28gb24sIG5lZWQgbm90IGJlIHJlZmVycmVkIHRvIHRocm91Z2ggdmFyaWFibGVzIGluIHRoaXMgd2F5LCBzaW5jZSB1c2VycwotZG9uJ3QgbmVlZCB0byByZXBsYWNlIHRoZW0gd2l0aCBvdGhlciBwcm9ncmFtcy4KLQotRWFjaCBwcm9ncmFtLW5hbWUgdmFyaWFibGUgc2hvdWxkIGNvbWUgd2l0aCBhbiBvcHRpb25zIHZhcmlhYmxlIHRoYXQgaXMKLXVzZWQgdG8gc3VwcGx5IG9wdGlvbnMgdG8gdGhlIHByb2dyYW0uICBBcHBlbmQgQHNhbXB7RkxBR1N9IHRvIHRoZQotcHJvZ3JhbS1uYW1lIHZhcmlhYmxlIG5hbWUgdG8gZ2V0IHRoZSBvcHRpb25zIHZhcmlhYmxlIG5hbWUtLS1mb3IKLWV4YW1wbGUsIEBjb2Rle0JJU09ORkxBR1N9LiAgKFRoZSBuYW1lcyBAY29kZXtDRkxBR1N9IGZvciB0aGUgQwotY29tcGlsZXIsIEBjb2Rle1lGTEFHU30gZm9yIHlhY2MsIGFuZCBAY29kZXtMRkxBR1N9IGZvciBsZXgsIGFyZQotZXhjZXB0aW9ucyB0byB0aGlzIHJ1bGUsIGJ1dCB3ZSBrZWVwIHRoZW0gYmVjYXVzZSB0aGV5IGFyZSBzdGFuZGFyZC4pCi1Vc2UgQGNvZGV7Q1BQRkxBR1N9IGluIGFueSBjb21waWxhdGlvbiBjb21tYW5kIHRoYXQgcnVucyB0aGUKLXByZXByb2Nlc3NvciwgYW5kIHVzZSBAY29kZXtMREZMQUdTfSBpbiBhbnkgY29tcGlsYXRpb24gY29tbWFuZCB0aGF0Ci1kb2VzIGxpbmtpbmcgYXMgd2VsbCBhcyBpbiBhbnkgZGlyZWN0IHVzZSBvZiBAY29kZXtsZH0uCi0KLUlmIHRoZXJlIGFyZSBDIGNvbXBpbGVyIG9wdGlvbnMgdGhhdCBAZW1waHttdXN0fSBiZSB1c2VkIGZvciBwcm9wZXIKLWNvbXBpbGF0aW9uIG9mIGNlcnRhaW4gZmlsZXMsIGRvIG5vdCBpbmNsdWRlIHRoZW0gaW4gQGNvZGV7Q0ZMQUdTfS4KLVVzZXJzIGV4cGVjdCB0byBiZSBhYmxlIHRvIHNwZWNpZnkgQGNvZGV7Q0ZMQUdTfSBmcmVlbHkgdGhlbXNlbHZlcy4KLUluc3RlYWQsIGFycmFuZ2UgdG8gcGFzcyB0aGUgbmVjZXNzYXJ5IG9wdGlvbnMgdG8gdGhlIEMgY29tcGlsZXIKLWluZGVwZW5kZW50bHkgb2YgQGNvZGV7Q0ZMQUdTfSwgYnkgd3JpdGluZyB0aGVtIGV4cGxpY2l0bHkgaW4gdGhlCi1jb21waWxhdGlvbiBjb21tYW5kcyBvciBieSBkZWZpbmluZyBhbiBpbXBsaWNpdCBydWxlLCBsaWtlIHRoaXM6Ci0KLUBzbWFsbGV4YW1wbGUKLUNGTEFHUyA9IC1nCi1BTExfQ0ZMQUdTID0gLUkuICQoQ0ZMQUdTKQotLmMubzoKLSAgICAgICAgJChDQykgLWMgJChDUFBGTEFHUykgJChBTExfQ0ZMQUdTKSAkPAotQGVuZCBzbWFsbGV4YW1wbGUKLQotRG8gaW5jbHVkZSB0aGUgQHNhbXB7LWd9IG9wdGlvbiBpbiBAY29kZXtDRkxBR1N9LCBiZWNhdXNlIHRoYXQgaXMgbm90Ci1AZW1waHtyZXF1aXJlZH0gZm9yIHByb3BlciBjb21waWxhdGlvbi4gIFlvdSBjYW4gY29uc2lkZXIgaXQgYSBkZWZhdWx0Ci10aGF0IGlzIG9ubHkgcmVjb21tZW5kZWQuICBJZiB0aGUgcGFja2FnZSBpcyBzZXQgdXAgc28gdGhhdCBpdCBpcwotY29tcGlsZWQgd2l0aCBHQ0MgYnkgZGVmYXVsdCwgdGhlbiB5b3UgbWlnaHQgYXMgd2VsbCBpbmNsdWRlIEBzYW1wey1PfQotaW4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgQGNvZGV7Q0ZMQUdTfSBhcyB3ZWxsLgotCi1QdXQgQGNvZGV7Q0ZMQUdTfSBsYXN0IGluIHRoZSBjb21waWxhdGlvbiBjb21tYW5kLCBhZnRlciBvdGhlciB2YXJpYWJsZXMKLWNvbnRhaW5pbmcgY29tcGlsZXIgb3B0aW9ucywgc28gdGhlIHVzZXIgY2FuIHVzZSBAY29kZXtDRkxBR1N9IHRvCi1vdmVycmlkZSB0aGUgb3RoZXJzLgotCi1AY29kZXtDRkxBR1N9IHNob3VsZCBiZSB1c2VkIGluIGV2ZXJ5IGludm9jYXRpb24gb2YgdGhlIEMgY29tcGlsZXIsCi1ib3RoIHRob3NlIHdoaWNoIGRvIGNvbXBpbGF0aW9uIGFuZCB0aG9zZSB3aGljaCBkbyBsaW5raW5nLgotCi1FdmVyeSBNYWtlZmlsZSBzaG91bGQgZGVmaW5lIHRoZSB2YXJpYWJsZSBAY29kZXtJTlNUQUxMfSwgd2hpY2ggaXMgdGhlCi1iYXNpYyBjb21tYW5kIGZvciBpbnN0YWxsaW5nIGEgZmlsZSBpbnRvIHRoZSBzeXN0ZW0uCi0KLUV2ZXJ5IE1ha2VmaWxlIHNob3VsZCBhbHNvIGRlZmluZSB0aGUgdmFyaWFibGVzIEBjb2Rle0lOU1RBTExfUFJPR1JBTX0KLWFuZCBAY29kZXtJTlNUQUxMX0RBVEF9LiAgKFRoZSBkZWZhdWx0IGZvciBlYWNoIG9mIHRoZXNlIHNob3VsZCBiZQotQGNvZGV7JChJTlNUQUxMKX0uKSAgVGhlbiBpdCBzaG91bGQgdXNlIHRob3NlIHZhcmlhYmxlcyBhcyB0aGUgY29tbWFuZHMKLWZvciBhY3R1YWwgaW5zdGFsbGF0aW9uLCBmb3IgZXhlY3V0YWJsZXMgYW5kIG5vbmV4ZWN1dGFibGVzCi1yZXNwZWN0aXZlbHkuICBVc2UgdGhlc2UgdmFyaWFibGVzIGFzIGZvbGxvd3M6Ci0KLUBleGFtcGxlCi0kKElOU1RBTExfUFJPR1JBTSkgZm9vICQoYmluZGlyKS9mb28KLSQoSU5TVEFMTF9EQVRBKSBsaWJmb28uYSAkKGxpYmRpcikvbGliZm9vLmEKLUBlbmQgZXhhbXBsZQotCi1PcHRpb25hbGx5LCB5b3UgbWF5IHByZXBlbmQgdGhlIHZhbHVlIG9mIEBjb2Rle0RFU1RESVJ9IHRvIHRoZSB0YXJnZXQKLWZpbGVuYW1lLiAgRG9pbmcgdGhpcyBhbGxvd3MgdGhlIGluc3RhbGxlciB0byBjcmVhdGUgYSBzbmFwc2hvdCBvZiB0aGUKLWluc3RhbGxhdGlvbiB0byBiZSBjb3BpZWQgb250byB0aGUgcmVhbCB0YXJnZXQgZmlsZXN5c3RlbSBsYXRlci4gIERvIG5vdAotc2V0IHRoZSB2YWx1ZSBvZiBAY29kZXtERVNURElSfSBpbiB5b3VyIE1ha2VmaWxlLCBhbmQgZG8gbm90IGluY2x1ZGUgaXQKLWluIGFueSBpbnN0YWxsZWQgZmlsZXMuICBXaXRoIHN1cHBvcnQgZm9yIEBjb2Rle0RFU1RESVJ9LCB0aGUgYWJvdmUKLWV4YW1wbGVzIGJlY29tZToKLQotQGV4YW1wbGUKLSQoSU5TVEFMTF9QUk9HUkFNKSBmb28gJChERVNURElSKSQoYmluZGlyKS9mb28KLSQoSU5TVEFMTF9EQVRBKSBsaWJmb28uYSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmZvby5hCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1BbHdheXMgdXNlIGEgZmlsZSBuYW1lLCBub3QgYSBkaXJlY3RvcnkgbmFtZSwgYXMgdGhlIHNlY29uZCBhcmd1bWVudCBvZgotdGhlIGluc3RhbGxhdGlvbiBjb21tYW5kcy4gIFVzZSBhIHNlcGFyYXRlIGNvbW1hbmQgZm9yIGVhY2ggZmlsZSB0byBiZQotaW5zdGFsbGVkLgotCi1Abm9kZSBEaXJlY3RvcnkgVmFyaWFibGVzCi1Ac2VjdGlvbiBWYXJpYWJsZXMgZm9yIEluc3RhbGxhdGlvbiBEaXJlY3RvcmllcwotCi1JbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgc2hvdWxkIGFsd2F5cyBiZSBuYW1lZCBieSB2YXJpYWJsZXMsIHNvIGl0IGlzCi1lYXN5IHRvIGluc3RhbGwgaW4gYSBub25zdGFuZGFyZCBwbGFjZS4gIFRoZSBzdGFuZGFyZCBuYW1lcyBmb3IgdGhlc2UKLXZhcmlhYmxlcyBhcmUgZGVzY3JpYmVkIGJlbG93LiAgVGhleSBhcmUgYmFzZWQgb24gYSBzdGFuZGFyZCBmaWxlc3lzdGVtCi1sYXlvdXQ7IHZhcmlhbnRzIG9mIGl0IGFyZSB1c2VkIGluIFNWUjQsIDQuNEJTRCwgTGludXgsIFVsdHJpeCB2NCwgYW5kCi1vdGhlciBtb2Rlcm4gb3BlcmF0aW5nIHN5c3RlbXMuCi0KLVRoZXNlIHR3byB2YXJpYWJsZXMgc2V0IHRoZSByb290IGZvciB0aGUgaW5zdGFsbGF0aW9uLiAgQWxsIHRoZSBvdGhlcgotaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIHNob3VsZCBiZSBzdWJkaXJlY3RvcmllcyBvZiBvbmUgb2YgdGhlc2UgdHdvLAotYW5kIG5vdGhpbmcgc2hvdWxkIGJlIGRpcmVjdGx5IGluc3RhbGxlZCBpbnRvIHRoZXNlIHR3byBkaXJlY3Rvcmllcy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBwcmVmaXgKLUEgcHJlZml4IHVzZWQgaW4gY29uc3RydWN0aW5nIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGUgdmFyaWFibGVzIGxpc3RlZAotYmVsb3cuICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBAY29kZXtwcmVmaXh9IHNob3VsZCBiZSBAZmlsZXsvdXNyL2xvY2FsfS4KLVdoZW4gYnVpbGRpbmcgdGhlIGNvbXBsZXRlIEdOVSBzeXN0ZW0sIHRoZSBwcmVmaXggd2lsbCBiZSBlbXB0eSBhbmQKLUBmaWxley91c3J9IHdpbGwgYmUgYSBzeW1ib2xpYyBsaW5rIHRvIEBmaWxley99LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAcHJlZml4QEB9LikKLQotUnVubmluZyBAc2FtcHttYWtlIGluc3RhbGx9IHdpdGggYSBkaWZmZXJlbnQgdmFsdWUgb2YgQGNvZGV7cHJlZml4fQotZnJvbSB0aGUgb25lIHVzZWQgdG8gYnVpbGQgdGhlIHByb2dyYW0gc2hvdWxkIEB2YXJ7bm90fSByZWNvbXBpbGUKLXRoZSBwcm9ncmFtLgotCi1AaXRlbSBleGVjX3ByZWZpeAotQSBwcmVmaXggdXNlZCBpbiBjb25zdHJ1Y3RpbmcgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHNvbWUgb2YgdGhlCi12YXJpYWJsZXMgbGlzdGVkIGJlbG93LiAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgQGNvZGV7ZXhlY19wcmVmaXh9IHNob3VsZAotYmUgQGNvZGV7JChwcmVmaXgpfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGV4ZWNfcHJlZml4QEB9LikKLQotR2VuZXJhbGx5LCBAY29kZXskKGV4ZWNfcHJlZml4KX0gaXMgdXNlZCBmb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluCi1tYWNoaW5lLXNwZWNpZmljIGZpbGVzIChzdWNoIGFzIGV4ZWN1dGFibGVzIGFuZCBzdWJyb3V0aW5lIGxpYnJhcmllcyksCi13aGlsZSBAY29kZXskKHByZWZpeCl9IGlzIHVzZWQgZGlyZWN0bHkgZm9yIG90aGVyIGRpcmVjdG9yaWVzLgotCi1SdW5uaW5nIEBzYW1we21ha2UgaW5zdGFsbH0gd2l0aCBhIGRpZmZlcmVudCB2YWx1ZSBvZiBAY29kZXtleGVjX3ByZWZpeH0KLWZyb20gdGhlIG9uZSB1c2VkIHRvIGJ1aWxkIHRoZSBwcm9ncmFtIHNob3VsZCBAdmFye25vdH0gcmVjb21waWxlIHRoZQotcHJvZ3JhbS4KLUBlbmQgdGFibGUKLQotRXhlY3V0YWJsZSBwcm9ncmFtcyBhcmUgaW5zdGFsbGVkIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGJpbmRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBleGVjdXRhYmxlIHByb2dyYW1zIHRoYXQgdXNlcnMgY2FuIHJ1bi4KLVRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvYmlufSwgYnV0IHdyaXRlIGl0IGFzCi1AZmlsZXskKGV4ZWNfcHJlZml4KS9iaW59LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAYmluZGlyQEB9LikKLQotQGl0ZW0gc2JpbmRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBleGVjdXRhYmxlIHByb2dyYW1zIHRoYXQgY2FuIGJlIHJ1biBmcm9tCi10aGUgc2hlbGwsIGJ1dCBhcmUgb25seSBnZW5lcmFsbHkgdXNlZnVsIHRvIHN5c3RlbSBhZG1pbmlzdHJhdG9ycy4gIFRoaXMKLXNob3VsZCBub3JtYWxseSBiZSBAZmlsZXsvdXNyL2xvY2FsL3NiaW59LCBidXQgd3JpdGUgaXQgYXMKLUBmaWxleyQoZXhlY19wcmVmaXgpL3NiaW59LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAc2JpbmRpckBAfS4pCi0KLUBpdGVtIGxpYmV4ZWNkaXIKLUBjb21tZW50IFRoaXMgcGFyYWdyYXBoIGFkanVzdGVkIHRvIGF2b2lkIG92ZXJmdWxsIGhib3ggLS1yb2xhbmQgNWp1bDk0Ci1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGV4ZWN1dGFibGUgcHJvZ3JhbXMgdG8gYmUgcnVuIGJ5IG90aGVyCi1wcm9ncmFtcyByYXRoZXIgdGhhbiBieSB1c2Vycy4gIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBub3JtYWxseSBiZQotQGZpbGV7L3Vzci9sb2NhbC9saWJleGVjfSwgYnV0IHdyaXRlIGl0IGFzIEBmaWxleyQoZXhlY19wcmVmaXgpL2xpYmV4ZWN9LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAbGliZXhlY2RpckBAfS4pCi1AZW5kIHRhYmxlCi0KLURhdGEgZmlsZXMgdXNlZCBieSB0aGUgcHJvZ3JhbSBkdXJpbmcgaXRzIGV4ZWN1dGlvbiBhcmUgZGl2aWRlZCBpbnRvCi1jYXRlZ29yaWVzIGluIHR3byB3YXlzLgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotU29tZSBmaWxlcyBhcmUgbm9ybWFsbHkgbW9kaWZpZWQgYnkgcHJvZ3JhbXM7IG90aGVycyBhcmUgbmV2ZXIgbm9ybWFsbHkKLW1vZGlmaWVkICh0aG91Z2ggdXNlcnMgbWF5IGVkaXQgc29tZSBvZiB0aGVzZSkuCi0KLUBpdGVtCi1Tb21lIGZpbGVzIGFyZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgYW5kIGNhbiBiZSBzaGFyZWQgYnkgYWxsCi1tYWNoaW5lcyBhdCBhIHNpdGU7IHNvbWUgYXJlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgYW5kIGNhbiBiZSBzaGFyZWQKLW9ubHkgYnkgbWFjaGluZXMgb2YgdGhlIHNhbWUga2luZCBhbmQgb3BlcmF0aW5nIHN5c3RlbTsgb3RoZXJzIG1heSBuZXZlcgotYmUgc2hhcmVkIGJldHdlZW4gdHdvIG1hY2hpbmVzLgotQGVuZCBpdGVtaXplCi0KLVRoaXMgbWFrZXMgZm9yIHNpeCBkaWZmZXJlbnQgcG9zc2liaWxpdGllcy4gIEhvd2V2ZXIsIHdlIHdhbnQgdG8KLWRpc2NvdXJhZ2UgdGhlIHVzZSBvZiBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzLCBhc2lkZSBmcm9tIG9iamVjdAotZmlsZXMgYW5kIGxpYnJhcmllcy4gIEl0IGlzIG11Y2ggY2xlYW5lciB0byBtYWtlIG90aGVyIGRhdGEgZmlsZXMKLWFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCwgYW5kIGl0IGlzIGdlbmVyYWxseSBub3QgaGFyZC4KLQotVGhlcmVmb3JlLCBoZXJlIGFyZSB0aGUgdmFyaWFibGVzIE1ha2VmaWxlcyBzaG91bGQgdXNlIHRvIHNwZWNpZnkKLWRpcmVjdG9yaWVzOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGRhdGFkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudCBkYXRhCi1maWxlcy4gIFRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvc2hhcmV9LCBidXQgd3JpdGUgaXQgYXMKLUBmaWxleyQocHJlZml4KS9zaGFyZX0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBkYXRhZGlyQEB9LikKLUFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHNlZSBAZmlsZXskKGluZm9kaXIpfQotYW5kIEBmaWxleyQoaW5jbHVkZWRpcil9IGJlbG93LgotCi1AaXRlbSBzeXNjb25mZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHJlYWQtb25seSBkYXRhIGZpbGVzIHRoYXQgcGVydGFpbiB0byBhCi1zaW5nbGUgbWFjaGluZS0tdGhhdCBpcyB0byBzYXksIGZpbGVzIGZvciBjb25maWd1cmluZyBhIGhvc3QuICBNYWlsZXIKLWFuZCBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gZmlsZXMsIEBmaWxley9ldGMvcGFzc3dkfSwgYW5kIHNvIGZvcnRoIGJlbG9uZwotaGVyZS4gIEFsbCB0aGUgZmlsZXMgaW4gdGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGJlIG9yZGluYXJ5IEFTQ0lJIHRleHQKLWZpbGVzLiAgVGhpcyBkaXJlY3Rvcnkgc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvZXRjfSwgYnV0Ci13cml0ZSBpdCBhcyBAZmlsZXskKHByZWZpeCkvZXRjfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQHN5c2NvbmZkaXJAQH0uKQotCi1EbyBub3QgaW5zdGFsbCBleGVjdXRhYmxlcyBoZXJlIGluIHRoaXMgZGlyZWN0b3J5ICh0aGV5IHByb2JhYmx5IGJlbG9uZwotaW4gQGZpbGV7JChsaWJleGVjZGlyKX0gb3IgQGZpbGV7JChzYmluZGlyKX0pLiAgQWxzbyBkbyBub3QgaW5zdGFsbAotZmlsZXMgdGhhdCBhcmUgbW9kaWZpZWQgaW4gdGhlIG5vcm1hbCBjb3Vyc2Ugb2YgdGhlaXIgdXNlIChwcm9ncmFtcwotd2hvc2UgcHVycG9zZSBpcyB0byBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHN5c3RlbSBleGNsdWRlZCkuCi1UaG9zZSBwcm9iYWJseSBiZWxvbmcgaW4gQGZpbGV7JChsb2NhbHN0YXRlZGlyKX0uCi0KLUBpdGVtIHNoYXJlZHN0YXRlZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGZpbGVzIHdoaWNoCi10aGUgcHJvZ3JhbXMgbW9kaWZ5IHdoaWxlIHRoZXkgcnVuLiAgVGhpcyBzaG91bGQgbm9ybWFsbHkgYmUKLUBmaWxley91c3IvbG9jYWwvY29tfSwgYnV0IHdyaXRlIGl0IGFzIEBmaWxleyQocHJlZml4KS9jb219LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAc2hhcmVkc3RhdGVkaXJAQH0uKQotCi1AaXRlbSBsb2NhbHN0YXRlZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGRhdGEgZmlsZXMgd2hpY2ggdGhlIHByb2dyYW1zIG1vZGlmeSB3aGlsZQotdGhleSBydW4sIGFuZCB0aGF0IHBlcnRhaW4gdG8gb25lIHNwZWNpZmljIG1hY2hpbmUuICBVc2VycyBzaG91bGQgbmV2ZXIKLW5lZWQgdG8gbW9kaWZ5IGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IHRvIGNvbmZpZ3VyZSB0aGUgcGFja2FnZSdzCi1vcGVyYXRpb247IHB1dCBzdWNoIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaW4gc2VwYXJhdGUgZmlsZXMgdGhhdCBnbwotaW4gQGZpbGV7JChkYXRhZGlyKX0gb3IgQGZpbGV7JChzeXNjb25mZGlyKX0uICBAZmlsZXskKGxvY2Fsc3RhdGVkaXIpfQotc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvdmFyfSwgYnV0IHdyaXRlIGl0IGFzCi1AZmlsZXskKHByZWZpeCkvdmFyfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGxvY2Fsc3RhdGVkaXJAQH0uKQotCi1AaXRlbSBsaWJkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIG9iamVjdCBmaWxlcyBhbmQgbGlicmFyaWVzIG9mIG9iamVjdCBjb2RlLiAgRG8gbm90Ci1pbnN0YWxsIGV4ZWN1dGFibGVzIGhlcmUsIHRoZXkgcHJvYmFibHkgb3VnaHQgdG8gZ28gaW4gQGZpbGV7JChsaWJleGVjZGlyKX0KLWluc3RlYWQuICBUaGUgdmFsdWUgb2YgQGNvZGV7bGliZGlyfSBzaG91bGQgbm9ybWFsbHkgYmUKLUBmaWxley91c3IvbG9jYWwvbGlifSwgYnV0IHdyaXRlIGl0IGFzIEBmaWxleyQoZXhlY19wcmVmaXgpL2xpYn0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBsaWJkaXJAQH0uKQotCi1AaXRlbSBpbmZvZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBJbmZvIGZpbGVzIGZvciB0aGlzIHBhY2thZ2UuICBCeQotZGVmYXVsdCwgaXQgc2hvdWxkIGJlIEBmaWxley91c3IvbG9jYWwvaW5mb30sIGJ1dCBpdCBzaG91bGQgYmUgd3JpdHRlbgotYXMgQGZpbGV7JChwcmVmaXgpL2luZm99LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAaW5mb2RpckBAfS4pCi0KLUBpdGVtIGxpc3BkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgYW55IEVtYWNzIExpc3AgZmlsZXMgaW4gdGhpcyBwYWNrYWdlLiAgQnkKLWRlZmF1bHQsIGl0IHNob3VsZCBiZSBAZmlsZXsvdXNyL2xvY2FsL3NoYXJlL2VtYWNzL3NpdGUtbGlzcH0sIGJ1dCBpdAotc2hvdWxkIGJlIHdyaXR0ZW4gYXMgQGZpbGV7JChwcmVmaXgpL3NoYXJlL2VtYWNzL3NpdGUtbGlzcH0uCi0KLUlmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIHRoZSBkZWZhdWx0IGFzIEBzYW1we0BAbGlzcGRpckBAfS4KLUluIG9yZGVyIHRvIG1ha2UgQHNhbXB7QEBsaXNwZGlyQEB9IHdvcmssIHlvdSBuZWVkIHRoZSBmb2xsb3dpbmcgbGluZXMKLWluIHlvdXIgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlOgotCi1AZXhhbXBsZQotbGlzcGRpcj0nJEB7ZGF0YWRpckB9L2VtYWNzL3NpdGUtbGlzcCcKLUFDX1NVQlNUKGxpc3BkaXIpCi1AZW5kIGV4YW1wbGUKLQotQGl0ZW0gaW5jbHVkZWRpcgotQGMgcmV3cml0dGVuIHRvIGF2b2lkIG92ZXJmdWxsIGhib3ggLS1yb2xhbmQKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgaGVhZGVyIGZpbGVzIHRvIGJlIGluY2x1ZGVkIGJ5IHVzZXIKLXByb2dyYW1zIHdpdGggdGhlIEMgQHNhbXB7I2luY2x1ZGV9IHByZXByb2Nlc3NvciBkaXJlY3RpdmUuICBUaGlzCi1zaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9sb2NhbC9pbmNsdWRlfSwgYnV0IHdyaXRlIGl0IGFzCi1AZmlsZXskKHByZWZpeCkvaW5jbHVkZX0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBpbmNsdWRlZGlyQEB9LikKLQotTW9zdCBjb21waWxlcnMgb3RoZXIgdGhhbiBHQ0MgZG8gbm90IGxvb2sgZm9yIGhlYWRlciBmaWxlcyBpbiBkaXJlY3RvcnkKLUBmaWxley91c3IvbG9jYWwvaW5jbHVkZX0uICBTbyBpbnN0YWxsaW5nIHRoZSBoZWFkZXIgZmlsZXMgdGhpcyB3YXkgaXMKLW9ubHkgdXNlZnVsIHdpdGggR0NDLiAgU29tZXRpbWVzIHRoaXMgaXMgbm90IGEgcHJvYmxlbSBiZWNhdXNlIHNvbWUKLWxpYnJhcmllcyBhcmUgb25seSByZWFsbHkgaW50ZW5kZWQgdG8gd29yayB3aXRoIEdDQy4gIEJ1dCBzb21lIGxpYnJhcmllcwotYXJlIGludGVuZGVkIHRvIHdvcmsgd2l0aCBvdGhlciBjb21waWxlcnMuICBUaGV5IHNob3VsZCBpbnN0YWxsIHRoZWlyCi1oZWFkZXIgZmlsZXMgaW4gdHdvIHBsYWNlcywgb25lIHNwZWNpZmllZCBieSBAY29kZXtpbmNsdWRlZGlyfSBhbmQgb25lCi1zcGVjaWZpZWQgYnkgQGNvZGV7b2xkaW5jbHVkZWRpcn0uCi0KLUBpdGVtIG9sZGluY2x1ZGVkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgQHNhbXB7I2luY2x1ZGV9IGhlYWRlciBmaWxlcyBmb3IgdXNlIHdpdGgKLWNvbXBpbGVycyBvdGhlciB0aGFuIEdDQy4gIFRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvaW5jbHVkZX0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgeW91IGNhbiB3cml0ZSBpdCBhcyBAc2FtcHtAQG9sZGluY2x1ZGVkaXJAQH0uKQotCi1UaGUgTWFrZWZpbGUgY29tbWFuZHMgc2hvdWxkIGNoZWNrIHdoZXRoZXIgdGhlIHZhbHVlIG9mCi1AY29kZXtvbGRpbmNsdWRlZGlyfSBpcyBlbXB0eS4gIElmIGl0IGlzLCB0aGV5IHNob3VsZCBub3QgdHJ5IHRvIHVzZQotaXQ7IHRoZXkgc2hvdWxkIGNhbmNlbCB0aGUgc2Vjb25kIGluc3RhbGxhdGlvbiBvZiB0aGUgaGVhZGVyIGZpbGVzLgotCi1BIHBhY2thZ2Ugc2hvdWxkIG5vdCByZXBsYWNlIGFuIGV4aXN0aW5nIGhlYWRlciBpbiB0aGlzIGRpcmVjdG9yeSB1bmxlc3MKLXRoZSBoZWFkZXIgY2FtZSBmcm9tIHRoZSBzYW1lIHBhY2thZ2UuICBUaHVzLCBpZiB5b3VyIEZvbyBwYWNrYWdlCi1wcm92aWRlcyBhIGhlYWRlciBmaWxlIEBmaWxle2Zvby5ofSwgdGhlbiBpdCBzaG91bGQgaW5zdGFsbCB0aGUgaGVhZGVyCi1maWxlIGluIHRoZSBAY29kZXtvbGRpbmNsdWRlZGlyfSBkaXJlY3RvcnkgaWYgZWl0aGVyICgxKSB0aGVyZSBpcyBubwotQGZpbGV7Zm9vLmh9IHRoZXJlIG9yICgyKSB0aGUgQGZpbGV7Zm9vLmh9IHRoYXQgZXhpc3RzIGNhbWUgZnJvbSB0aGUgRm9vCi1wYWNrYWdlLgotCi1UbyB0ZWxsIHdoZXRoZXIgQGZpbGV7Zm9vLmh9IGNhbWUgZnJvbSB0aGUgRm9vIHBhY2thZ2UsIHB1dCBhIG1hZ2ljCi1zdHJpbmcgaW4gdGhlIGZpbGUtLS1wYXJ0IG9mIGEgY29tbWVudC0tLWFuZCBAY29kZXtncmVwfSBmb3IgdGhhdCBzdHJpbmcuCi1AZW5kIHRhYmxlCi0KLVVuaXgtc3R5bGUgbWFuIHBhZ2VzIGFyZSBpbnN0YWxsZWQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gbWFuZGlyCi1UaGUgdG9wLWxldmVsIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyB0aGUgbWFuIHBhZ2VzIChpZiBhbnkpIGZvciB0aGlzCi1wYWNrYWdlLiAgSXQgd2lsbCBub3JtYWxseSBiZSBAZmlsZXsvdXNyL2xvY2FsL21hbn0sIGJ1dCB5b3Ugc2hvdWxkCi13cml0ZSBpdCBhcyBAZmlsZXskKHByZWZpeCkvbWFufS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQG1hbmRpckBAfS4pCi0KLUBpdGVtIG1hbjFkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgc2VjdGlvbiAxIG1hbiBwYWdlcy4gIFdyaXRlIGl0IGFzCi1AZmlsZXskKG1hbmRpcikvbWFuMX0uCi1AaXRlbSBtYW4yZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHNlY3Rpb24gMiBtYW4gcGFnZXMuICBXcml0ZSBpdCBhcwotQGZpbGV7JChtYW5kaXIpL21hbjJ9Ci1AaXRlbSBAZG90c3t9Ci0KLUBzdHJvbmd7RG9uJ3QgbWFrZSB0aGUgcHJpbWFyeSBkb2N1bWVudGF0aW9uIGZvciBhbnkgR05VIHNvZnR3YXJlIGJlIGEKLW1hbiBwYWdlLiAgV3JpdGUgYSBtYW51YWwgaW4gVGV4aW5mbyBpbnN0ZWFkLiAgTWFuIHBhZ2VzIGFyZSBqdXN0IGZvcgotdGhlIHNha2Ugb2YgcGVvcGxlIHJ1bm5pbmcgR05VIHNvZnR3YXJlIG9uIFVuaXgsIHdoaWNoIGlzIGEgc2Vjb25kYXJ5Ci1hcHBsaWNhdGlvbiBvbmx5Ln0KLQotQGl0ZW0gbWFuZXh0Ci1UaGUgZmlsZSBuYW1lIGV4dGVuc2lvbiBmb3IgdGhlIGluc3RhbGxlZCBtYW4gcGFnZS4gIFRoaXMgc2hvdWxkIGNvbnRhaW4KLWEgcGVyaW9kIGZvbGxvd2VkIGJ5IHRoZSBhcHByb3ByaWF0ZSBkaWdpdDsgaXQgc2hvdWxkIG5vcm1hbGx5IGJlIEBzYW1wey4xfS4KLQotQGl0ZW0gbWFuMWV4dAotVGhlIGZpbGUgbmFtZSBleHRlbnNpb24gZm9yIGluc3RhbGxlZCBzZWN0aW9uIDEgbWFuIHBhZ2VzLgotQGl0ZW0gbWFuMmV4dAotVGhlIGZpbGUgbmFtZSBleHRlbnNpb24gZm9yIGluc3RhbGxlZCBzZWN0aW9uIDIgbWFuIHBhZ2VzLgotQGl0ZW0gQGRvdHN7fQotVXNlIHRoZXNlIG5hbWVzIGluc3RlYWQgb2YgQHNhbXB7bWFuZXh0fSBpZiB0aGUgcGFja2FnZSBuZWVkcyB0byBpbnN0YWxsIG1hbgotcGFnZXMgaW4gbW9yZSB0aGFuIG9uZSBzZWN0aW9uIG9mIHRoZSBtYW51YWwuCi1AZW5kIHRhYmxlCi0KLUFuZCBmaW5hbGx5LCB5b3Ugc2hvdWxkIHNldCB0aGUgZm9sbG93aW5nIHZhcmlhYmxlOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIHNyY2RpcgotVGhlIGRpcmVjdG9yeSBmb3IgdGhlIHNvdXJjZXMgYmVpbmcgY29tcGlsZWQuICBUaGUgdmFsdWUgb2YgdGhpcwotdmFyaWFibGUgaXMgbm9ybWFsbHkgaW5zZXJ0ZWQgYnkgdGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2hlbGwgc2NyaXB0LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0Y29uZiwgdXNlIEBzYW1we3NyY2RpciA9IEBAc3JjZGlyQEB9LikKLUBlbmQgdGFibGUKLQotRm9yIGV4YW1wbGU6Ci0KLUBzbWFsbGV4YW1wbGUKLUBjIEkgaGF2ZSBjaGFuZ2VkIHNvbWUgb2YgdGhlIGNvbW1lbnRzIGhlcmUgc2xpZ2h0bHkgdG8gZml4IGFuIG92ZXJmdWxsCi1AYyBoYm94LCBzbyB0aGUgbWFrZSBtYW51YWwgY2FuIGZvcm1hdCBjb3JyZWN0bHkuIC0tcm9sYW5kCi0jIENvbW1vbiBwcmVmaXggZm9yIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KLSMgTk9URTogVGhpcyBkaXJlY3RvcnkgbXVzdCBleGlzdCB3aGVuIHlvdSBzdGFydCB0aGUgaW5zdGFsbC4KLXByZWZpeCA9IC91c3IvbG9jYWwKLWV4ZWNfcHJlZml4ID0gJChwcmVmaXgpCi0jIFdoZXJlIHRvIHB1dCB0aGUgZXhlY3V0YWJsZSBmb3IgdGhlIGNvbW1hbmQgYGdjYycuCi1iaW5kaXIgPSAkKGV4ZWNfcHJlZml4KS9iaW4KLSMgV2hlcmUgdG8gcHV0IHRoZSBkaXJlY3RvcmllcyB1c2VkIGJ5IHRoZSBjb21waWxlci4KLWxpYmV4ZWNkaXIgPSAkKGV4ZWNfcHJlZml4KS9saWJleGVjCi0jIFdoZXJlIHRvIHB1dCB0aGUgSW5mbyBmaWxlcy4KLWluZm9kaXIgPSAkKHByZWZpeCkvaW5mbwotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgeW91ciBwcm9ncmFtIGluc3RhbGxzIGEgbGFyZ2UgbnVtYmVyIG9mIGZpbGVzIGludG8gb25lIG9mIHRoZQotc3RhbmRhcmQgdXNlci1zcGVjaWZpZWQgZGlyZWN0b3JpZXMsIGl0IG1pZ2h0IGJlIHVzZWZ1bCB0byBncm91cCB0aGVtCi1pbnRvIGEgc3ViZGlyZWN0b3J5IHBhcnRpY3VsYXIgdG8gdGhhdCBwcm9ncmFtLiAgSWYgeW91IGRvIHRoaXMsIHlvdQotc2hvdWxkIHdyaXRlIHRoZSBAY29kZXtpbnN0YWxsfSBydWxlIHRvIGNyZWF0ZSB0aGVzZSBzdWJkaXJlY3Rvcmllcy4KLQotRG8gbm90IGV4cGVjdCB0aGUgdXNlciB0byBpbmNsdWRlIHRoZSBzdWJkaXJlY3RvcnkgbmFtZSBpbiB0aGUgdmFsdWUgb2YKLWFueSBvZiB0aGUgdmFyaWFibGVzIGxpc3RlZCBhYm92ZS4gIFRoZSBpZGVhIG9mIGhhdmluZyBhIHVuaWZvcm0gc2V0IG9mCi12YXJpYWJsZSBuYW1lcyBmb3IgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIGlzIHRvIGVuYWJsZSB0aGUgdXNlciB0bwotc3BlY2lmeSB0aGUgZXhhY3Qgc2FtZSB2YWx1ZXMgZm9yIHNldmVyYWwgZGlmZmVyZW50IEdOVSBwYWNrYWdlcy4gIEluCi1vcmRlciBmb3IgdGhpcyB0byBiZSB1c2VmdWwsIGFsbCB0aGUgcGFja2FnZXMgbXVzdCBiZSBkZXNpZ25lZCBzbyB0aGF0Ci10aGV5IHdpbGwgd29yayBzZW5zaWJseSB3aGVuIHRoZSB1c2VyIGRvZXMgc28uCi0KLUBub2RlIFN0YW5kYXJkIFRhcmdldHMKLUBzZWN0aW9uIFN0YW5kYXJkIFRhcmdldHMgZm9yIFVzZXJzCi0KLUFsbCBHTlUgcHJvZ3JhbXMgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyB0YXJnZXRzIGluIHRoZWlyIE1ha2VmaWxlczoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBhbGwKLUNvbXBpbGUgdGhlIGVudGlyZSBwcm9ncmFtLiAgVGhpcyBzaG91bGQgYmUgdGhlIGRlZmF1bHQgdGFyZ2V0LiAgVGhpcwotdGFyZ2V0IG5lZWQgbm90IHJlYnVpbGQgYW55IGRvY3VtZW50YXRpb24gZmlsZXM7IEluZm8gZmlsZXMgc2hvdWxkCi1ub3JtYWxseSBiZSBpbmNsdWRlZCBpbiB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgRFZJIGZpbGVzIHNob3VsZCBiZSBtYWRlCi1vbmx5IHdoZW4gZXhwbGljaXRseSBhc2tlZCBmb3IuCi0KLUJ5IGRlZmF1bHQsIHRoZSBNYWtlIHJ1bGVzIHNob3VsZCBjb21waWxlIGFuZCBsaW5rIHdpdGggQHNhbXB7LWd9LCBzbwotdGhhdCBleGVjdXRhYmxlIHByb2dyYW1zIGhhdmUgZGVidWdnaW5nIHN5bWJvbHMuICBVc2VycyB3aG8gZG9uJ3QgbWluZAotYmVpbmcgaGVscGxlc3MgY2FuIHN0cmlwIHRoZSBleGVjdXRhYmxlcyBsYXRlciBpZiB0aGV5IHdpc2guCi0KLUBpdGVtIGluc3RhbGwKLUNvbXBpbGUgdGhlIHByb2dyYW0gYW5kIGNvcHkgdGhlIGV4ZWN1dGFibGVzLCBsaWJyYXJpZXMsIGFuZCBzbyBvbiB0bwotdGhlIGZpbGUgbmFtZXMgd2hlcmUgdGhleSBzaG91bGQgcmVzaWRlIGZvciBhY3R1YWwgdXNlLiAgSWYgdGhlcmUgaXMgYQotc2ltcGxlIHRlc3QgdG8gdmVyaWZ5IHRoYXQgYSBwcm9ncmFtIGlzIHByb3Blcmx5IGluc3RhbGxlZCwgdGhpcyB0YXJnZXQKLXNob3VsZCBydW4gdGhhdCB0ZXN0LgotCi1EbyBub3Qgc3RyaXAgZXhlY3V0YWJsZXMgd2hlbiBpbnN0YWxsaW5nIHRoZW0uICBEZXZpbC1tYXktY2FyZSB1c2VycyBjYW4KLXVzZSB0aGUgQGNvZGV7aW5zdGFsbC1zdHJpcH0gdGFyZ2V0IHRvIGRvIHRoYXQuCi0KLUlmIHBvc3NpYmxlLCB3cml0ZSB0aGUgQGNvZGV7aW5zdGFsbH0gdGFyZ2V0IHJ1bGUgc28gdGhhdCBpdCBkb2VzIG5vdAotbW9kaWZ5IGFueXRoaW5nIGluIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHByb2dyYW0gd2FzIGJ1aWx0LCBwcm92aWRlZAotQHNhbXB7bWFrZSBhbGx9IGhhcyBqdXN0IGJlZW4gZG9uZS4gIFRoaXMgaXMgY29udmVuaWVudCBmb3IgYnVpbGRpbmcgdGhlCi1wcm9ncmFtIHVuZGVyIG9uZSB1c2VyIG5hbWUgYW5kIGluc3RhbGxpbmcgaXQgdW5kZXIgYW5vdGhlci4KLQotVGhlIGNvbW1hbmRzIHNob3VsZCBjcmVhdGUgYWxsIHRoZSBkaXJlY3RvcmllcyBpbiB3aGljaCBmaWxlcyBhcmUgdG8gYmUKLWluc3RhbGxlZCwgaWYgdGhleSBkb24ndCBhbHJlYWR5IGV4aXN0LiAgVGhpcyBpbmNsdWRlcyB0aGUgZGlyZWN0b3JpZXMKLXNwZWNpZmllZCBhcyB0aGUgdmFsdWVzIG9mIHRoZSB2YXJpYWJsZXMgQGNvZGV7cHJlZml4fSBhbmQKLUBjb2Rle2V4ZWNfcHJlZml4fSwgYXMgd2VsbCBhcyBhbGwgc3ViZGlyZWN0b3JpZXMgdGhhdCBhcmUgbmVlZGVkLgotT25lIHdheSB0byBkbyB0aGlzIGlzIGJ5IG1lYW5zIG9mIGFuIEBjb2Rle2luc3RhbGxkaXJzfSB0YXJnZXQKLWFzIGRlc2NyaWJlZCBiZWxvdy4KLQotVXNlIEBzYW1wey19IGJlZm9yZSBhbnkgY29tbWFuZCBmb3IgaW5zdGFsbGluZyBhIG1hbiBwYWdlLCBzbyB0aGF0Ci1AY29kZXttYWtlfSB3aWxsIGlnbm9yZSBhbnkgZXJyb3JzLiAgVGhpcyBpcyBpbiBjYXNlIHRoZXJlIGFyZSBzeXN0ZW1zCi10aGF0IGRvbid0IGhhdmUgdGhlIFVuaXggbWFuIHBhZ2UgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaW5zdGFsbGVkLgotCi1UaGUgd2F5IHRvIGluc3RhbGwgSW5mbyBmaWxlcyBpcyB0byBjb3B5IHRoZW0gaW50byBAZmlsZXskKGluZm9kaXIpfQotd2l0aCBAY29kZXskKElOU1RBTExfREFUQSl9IChAcHhyZWZ7Q29tbWFuZCBWYXJpYWJsZXN9KSwgYW5kIHRoZW4gcnVuCi10aGUgQGNvZGV7aW5zdGFsbC1pbmZvfSBwcm9ncmFtIGlmIGl0IGlzIHByZXNlbnQuICBAY29kZXtpbnN0YWxsLWluZm99Ci1pcyBhIHByb2dyYW0gdGhhdCBlZGl0cyB0aGUgSW5mbyBAZmlsZXtkaXJ9IGZpbGUgdG8gYWRkIG9yIHVwZGF0ZSB0aGUKLW1lbnUgZW50cnkgZm9yIHRoZSBnaXZlbiBJbmZvIGZpbGU7IGl0IGlzIHBhcnQgb2YgdGhlIFRleGluZm8gcGFja2FnZS4KLUhlcmUgaXMgYSBzYW1wbGUgcnVsZSB0byBpbnN0YWxsIGFuIEluZm8gZmlsZToKLQotQGNvbW1lbnQgVGhpcyBleGFtcGxlIGhhcyBiZWVuIGNhcmVmdWxseSBmb3JtYXR0ZWQgZm9yIHRoZSBNYWtlIG1hbnVhbC4KLUBjb21tZW50IFBsZWFzZSBkbyBub3QgcmVmb3JtYXQgaXQgd2l0aG91dCB0YWxraW5nIHRvIHJvbGFuZEBnbnUuYWkubWl0LmVkdS4KLUBzbWFsbGV4YW1wbGUKLSQoREVTVERJUikkKGluZm9kaXIpL2Zvby5pbmZvOiBmb28uaW5mbwotICAgICAgICAkKFBPU1RfSU5TVEFMTCkKLSMgVGhlcmUgbWF5IGJlIGEgbmV3ZXIgaW5mbyBmaWxlIGluIC4gdGhhbiBpbiBzcmNkaXIuCi0gICAgICAgIC1pZiB0ZXN0IC1mIGZvby5pbmZvOyB0aGVuIGQ9LjsgXAotICAgICAgICAgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLSAgICAgICAgJChJTlNUQUxMX0RBVEEpICQkZC9mb28uaW5mbyAkKERFU1RESVIpJEBAOyBcCi0jIFJ1biBpbnN0YWxsLWluZm8gb25seSBpZiBpdCBleGlzdHMuCi0jIFVzZSBgaWYnIGluc3RlYWQgb2YganVzdCBwcmVwZW5kaW5nIGAtJyB0byB0aGUKLSMgbGluZSBzbyB3ZSBub3RpY2UgcmVhbCBlcnJvcnMgZnJvbSBpbnN0YWxsLWluZm8uCi0jIFdlIHVzZSBgJChTSEVMTCkgLWMnIGJlY2F1c2Ugc29tZSBzaGVsbHMgZG8gbm90Ci0jIGZhaWwgZ3JhY2VmdWxseSB3aGVuIHRoZXJlIGlzIGFuIHVua25vd24gY29tbWFuZC4KLSAgICAgICAgaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24nIFwKLSAgICAgICAgICAgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLSAgICAgICAgICBpbnN0YWxsLWluZm8gLS1kaXItZmlsZT0kKERFU1RESVIpJChpbmZvZGlyKS9kaXIgXAotICAgICAgICAgICAgICAgICAgICAgICAkKERFU1RESVIpJChpbmZvZGlyKS9mb28uaW5mbzsgXAotICAgICAgICBlbHNlIHRydWU7IGZpCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1XaGVuIHdyaXRpbmcgdGhlIEBjb2Rle2luc3RhbGx9IHRhcmdldCwgeW91IG11c3QgY2xhc3NpZnkgYWxsIHRoZQotY29tbWFuZHMgaW50byB0aHJlZSBjYXRlZ29yaWVzOiBub3JtYWwgb25lcywgQGRmbntwcmUtaW5zdGFsbGF0aW9ufQotY29tbWFuZHMgYW5kIEBkZm57cG9zdC1pbnN0YWxsYXRpb259IGNvbW1hbmRzLiAgQHhyZWZ7SW5zdGFsbCBDb21tYW5kCi1DYXRlZ29yaWVzfS4KLQotQGl0ZW0gdW5pbnN0YWxsCi1EZWxldGUgYWxsIHRoZSBpbnN0YWxsZWQgZmlsZXMtLS10aGUgY29waWVzIHRoYXQgdGhlIEBzYW1we2luc3RhbGx9Ci10YXJnZXQgY3JlYXRlcy4KLQotVGhpcyBydWxlIHNob3VsZCBub3QgbW9kaWZ5IHRoZSBkaXJlY3RvcmllcyB3aGVyZSBjb21waWxhdGlvbiBpcyBkb25lLAotb25seSB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgZmlsZXMgYXJlIGluc3RhbGxlZC4KLQotVGhlIHVuaW5zdGFsbGF0aW9uIGNvbW1hbmRzIGFyZSBkaXZpZGVkIGludG8gdGhyZWUgY2F0ZWdvcmllcywganVzdCBsaWtlCi10aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmRzLiAgQHhyZWZ7SW5zdGFsbCBDb21tYW5kIENhdGVnb3JpZXN9LgotCi1AaXRlbSBpbnN0YWxsLXN0cmlwCi1MaWtlIEBjb2Rle2luc3RhbGx9LCBidXQgc3RyaXAgdGhlIGV4ZWN1dGFibGUgZmlsZXMgd2hpbGUgaW5zdGFsbGluZwotdGhlbS4gIEluIG1hbnkgY2FzZXMsIHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgdGFyZ2V0IGNhbiBiZSB2ZXJ5IHNpbXBsZToKLQotQHNtYWxsZXhhbXBsZQotaW5zdGFsbC1zdHJpcDoKLSAgICAgICAgJChNQUtFKSBJTlNUQUxMX1BST0dSQU09JyQoSU5TVEFMTF9QUk9HUkFNKSAtcycgXAotICAgICAgICAgICAgICAgIGluc3RhbGwKLUBlbmQgc21hbGxleGFtcGxlCi0KLU5vcm1hbGx5IHdlIGRvIG5vdCByZWNvbW1lbmQgc3RyaXBwaW5nIGFuIGV4ZWN1dGFibGUgdW5sZXNzIHlvdSBhcmUgc3VyZQotdGhlIHByb2dyYW0gaGFzIG5vIGJ1Z3MuICBIb3dldmVyLCBpdCBjYW4gYmUgcmVhc29uYWJsZSB0byBpbnN0YWxsIGEKLXN0cmlwcGVkIGV4ZWN1dGFibGUgZm9yIGFjdHVhbCBleGVjdXRpb24gd2hpbGUgc2F2aW5nIHRoZSB1bnN0cmlwcGVkCi1leGVjdXRhYmxlIGVsc2V3aGVyZSBpbiBjYXNlIHRoZXJlIGlzIGEgYnVnLgotCi1AY29tbWVudCBUaGUgZ3JhdHVpdG91cyBibGFuayBsaW5lIGhlcmUgaXMgdG8gbWFrZSB0aGUgdGFibGUgbG9vayBiZXR0ZXIKLUBjb21tZW50IGluIHRoZSBwcmludGVkIE1ha2UgbWFudWFsLiAgUGxlYXNlIGxlYXZlIGl0IGluLgotQGl0ZW0gY2xlYW4KLQotRGVsZXRlIGFsbCBmaWxlcyBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IGFyZSBub3JtYWxseSBjcmVhdGVkIGJ5Ci1idWlsZGluZyB0aGUgcHJvZ3JhbS4gIERvbid0IGRlbGV0ZSB0aGUgZmlsZXMgdGhhdCByZWNvcmQgdGhlCi1jb25maWd1cmF0aW9uLiAgQWxzbyBwcmVzZXJ2ZSBmaWxlcyB0aGF0IGNvdWxkIGJlIG1hZGUgYnkgYnVpbGRpbmcsIGJ1dAotbm9ybWFsbHkgYXJlbid0IGJlY2F1c2UgdGhlIGRpc3RyaWJ1dGlvbiBjb21lcyB3aXRoIHRoZW0uCi0KLURlbGV0ZSBAZmlsZXsuZHZpfSBmaWxlcyBoZXJlIGlmIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBkaXN0cmlidXRpb24uCi0KLUBpdGVtIGRpc3RjbGVhbgotRGVsZXRlIGFsbCBmaWxlcyBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IGFyZSBjcmVhdGVkIGJ5Ci1jb25maWd1cmluZyBvciBidWlsZGluZyB0aGUgcHJvZ3JhbS4gIElmIHlvdSBoYXZlIHVucGFja2VkIHRoZSBzb3VyY2UKLWFuZCBidWlsdCB0aGUgcHJvZ3JhbSB3aXRob3V0IGNyZWF0aW5nIGFueSBvdGhlciBmaWxlcywgQHNhbXB7bWFrZQotZGlzdGNsZWFufSBzaG91bGQgbGVhdmUgb25seSB0aGUgZmlsZXMgdGhhdCB3ZXJlIGluIHRoZSBkaXN0cmlidXRpb24uCi0KLUBpdGVtIG1vc3RseWNsZWFuCi1MaWtlIEBzYW1we2NsZWFufSwgYnV0IG1heSByZWZyYWluIGZyb20gZGVsZXRpbmcgYSBmZXcgZmlsZXMgdGhhdCBwZW9wbGUKLW5vcm1hbGx5IGRvbid0IHdhbnQgdG8gcmVjb21waWxlLiAgRm9yIGV4YW1wbGUsIHRoZSBAc2FtcHttb3N0bHljbGVhbn0KLXRhcmdldCBmb3IgR0NDIGRvZXMgbm90IGRlbGV0ZSBAZmlsZXtsaWJnY2MuYX0sIGJlY2F1c2UgcmVjb21waWxpbmcgaXQKLWlzIHJhcmVseSBuZWNlc3NhcnkgYW5kIHRha2VzIGEgbG90IG9mIHRpbWUuCi0KLUBpdGVtIG1haW50YWluZXItY2xlYW4KLURlbGV0ZSBhbG1vc3QgZXZlcnl0aGluZyBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IGNhbiBiZQotcmVjb25zdHJ1Y3RlZCB3aXRoIHRoaXMgTWFrZWZpbGUuICBUaGlzIHR5cGljYWxseSBpbmNsdWRlcyBldmVyeXRoaW5nCi1kZWxldGVkIGJ5IEBjb2Rle2Rpc3RjbGVhbn0sIHBsdXMgbW9yZTogQyBzb3VyY2UgZmlsZXMgcHJvZHVjZWQgYnkKLUJpc29uLCB0YWdzIHRhYmxlcywgSW5mbyBmaWxlcywgYW5kIHNvIG9uLgotCi1UaGUgcmVhc29uIHdlIHNheSBgYGFsbW9zdCBldmVyeXRoaW5nJycgaXMgdGhhdCBydW5uaW5nIHRoZSBjb21tYW5kCi1Ac2FtcHttYWtlIG1haW50YWluZXItY2xlYW59IHNob3VsZCBub3QgZGVsZXRlIEBmaWxle2NvbmZpZ3VyZX0gZXZlbiBpZgotQGZpbGV7Y29uZmlndXJlfSBjYW4gYmUgcmVtYWRlIHVzaW5nIGEgcnVsZSBpbiB0aGUgTWFrZWZpbGUuICBNb3JlIGdlbmVyYWxseSwKLUBzYW1we21ha2UgbWFpbnRhaW5lci1jbGVhbn0gc2hvdWxkIG5vdCBkZWxldGUgYW55dGhpbmcgdGhhdCBuZWVkcyB0bwotZXhpc3QgaW4gb3JkZXIgdG8gcnVuIEBmaWxle2NvbmZpZ3VyZX0gYW5kIHRoZW4gYmVnaW4gdG8gYnVpbGQgdGhlCi1wcm9ncmFtLiAgVGhpcyBpcyB0aGUgb25seSBleGNlcHRpb247IEBjb2Rle21haW50YWluZXItY2xlYW59IHNob3VsZAotZGVsZXRlIGV2ZXJ5dGhpbmcgZWxzZSB0aGF0IGNhbiBiZSByZWJ1aWx0LgotCi1UaGUgQHNhbXB7bWFpbnRhaW5lci1jbGVhbn0gdGFyZ2V0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgYSBtYWludGFpbmVyIG9mCi10aGUgcGFja2FnZSwgbm90IGJ5IG9yZGluYXJ5IHVzZXJzLiAgWW91IG1heSBuZWVkIHNwZWNpYWwgdG9vbHMgdG8KLXJlY29uc3RydWN0IHNvbWUgb2YgdGhlIGZpbGVzIHRoYXQgQHNhbXB7bWFrZSBtYWludGFpbmVyLWNsZWFufSBkZWxldGVzLgotU2luY2UgdGhlc2UgZmlsZXMgYXJlIG5vcm1hbGx5IGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24sIHdlIGRvbid0Ci10YWtlIGNhcmUgdG8gbWFrZSB0aGVtIGVhc3kgdG8gcmVjb25zdHJ1Y3QuICBJZiB5b3UgZmluZCB5b3UgbmVlZCB0bwotdW5wYWNrIHRoZSBmdWxsIGRpc3RyaWJ1dGlvbiBhZ2FpbiwgZG9uJ3QgYmxhbWUgdXMuCi0KLVRvIGhlbHAgbWFrZSB1c2VycyBhd2FyZSBvZiB0aGlzLCB0aGUgY29tbWFuZHMgZm9yIHRoZSBzcGVjaWFsCi1AY29kZXttYWludGFpbmVyLWNsZWFufSB0YXJnZXQgc2hvdWxkIHN0YXJ0IHdpdGggdGhlc2UgdHdvOgotCi1Ac21hbGxleGFtcGxlCi1AQGVjaG8gJ1RoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyBpdCcKLUBAZWNobyAnZGVsZXRlcyBmaWxlcyB0aGF0IG1heSBuZWVkIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4nCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbSBUQUdTCi1VcGRhdGUgYSB0YWdzIHRhYmxlIGZvciB0aGlzIHByb2dyYW0uCi1AYyBBRFI6IGhvdz8KLQotQGl0ZW0gaW5mbwotR2VuZXJhdGUgYW55IEluZm8gZmlsZXMgbmVlZGVkLiAgVGhlIGJlc3Qgd2F5IHRvIHdyaXRlIHRoZSBydWxlcyBpcyBhcwotZm9sbG93czoKLQotQHNtYWxsZXhhbXBsZQotaW5mbzogZm9vLmluZm8KLQotZm9vLmluZm86IGZvby50ZXhpIGNoYXAxLnRleGkgY2hhcDIudGV4aQotICAgICAgICAkKE1BS0VJTkZPKSAkKHNyY2RpcikvZm9vLnRleGkKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotWW91IG11c3QgZGVmaW5lIHRoZSB2YXJpYWJsZSBAY29kZXtNQUtFSU5GT30gaW4gdGhlIE1ha2VmaWxlLiAgSXQgc2hvdWxkCi1ydW4gdGhlIEBjb2Rle21ha2VpbmZvfSBwcm9ncmFtLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBUZXhpbmZvCi1kaXN0cmlidXRpb24uCi0KLU5vcm1hbGx5IGEgR05VIGRpc3RyaWJ1dGlvbiBjb21lcyB3aXRoIEluZm8gZmlsZXMsIGFuZCB0aGF0IG1lYW5zIHRoZQotSW5mbyBmaWxlcyBhcmUgcHJlc2VudCBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4gIFRoZXJlZm9yZSwgdGhlIE1ha2UKLXJ1bGUgZm9yIGFuIGluZm8gZmlsZSBzaG91bGQgdXBkYXRlIGl0IGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgV2hlbgotdXNlcnMgYnVpbGQgdGhlIHBhY2thZ2UsIG9yZGluYXJpbHkgTWFrZSB3aWxsIG5vdCB1cGRhdGUgdGhlIEluZm8gZmlsZXMKLWJlY2F1c2UgdGhleSB3aWxsIGFscmVhZHkgYmUgdXAgdG8gZGF0ZS4KLQotQGl0ZW0gZHZpCi1HZW5lcmF0ZSBEVkkgZmlsZXMgZm9yIGFsbCBUZXhpbmZvIGRvY3VtZW50YXRpb24uCi1Gb3IgZXhhbXBsZToKLQotQHNtYWxsZXhhbXBsZQotZHZpOiBmb28uZHZpCi0KLWZvby5kdmk6IGZvby50ZXhpIGNoYXAxLnRleGkgY2hhcDIudGV4aQotICAgICAgICAkKFRFWEkyRFZJKSAkKHNyY2RpcikvZm9vLnRleGkKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotWW91IG11c3QgZGVmaW5lIHRoZSB2YXJpYWJsZSBAY29kZXtURVhJMkRWSX0gaW4gdGhlIE1ha2VmaWxlLiAgSXQgc2hvdWxkCi1ydW4gdGhlIHByb2dyYW0gQGNvZGV7dGV4aTJkdml9LCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBUZXhpbmZvCi1kaXN0cmlidXRpb24uQGZvb3Rub3Rle0Bjb2Rle3RleGkyZHZpfSB1c2VzIEBUZVh7fSB0byBkbyB0aGUgcmVhbCB3b3JrCi1vZiBmb3JtYXR0aW5nLiBAVGVYe30gaXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggVGV4aW5mby59ICBBbHRlcm5hdGl2ZWx5LAotd3JpdGUganVzdCB0aGUgZGVwZW5kZW5jaWVzLCBhbmQgYWxsb3cgR05VIEBjb2Rle21ha2V9IHRvIHByb3ZpZGUgdGhlIGNvbW1hbmQuCi0KLUBpdGVtIGRpc3QKLUNyZWF0ZSBhIGRpc3RyaWJ1dGlvbiB0YXIgZmlsZSBmb3IgdGhpcyBwcm9ncmFtLiAgVGhlIHRhciBmaWxlIHNob3VsZCBiZQotc2V0IHVwIHNvIHRoYXQgdGhlIGZpbGUgbmFtZXMgaW4gdGhlIHRhciBmaWxlIHN0YXJ0IHdpdGggYSBzdWJkaXJlY3RvcnkKLW5hbWUgd2hpY2ggaXMgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgaXQgaXMgYSBkaXN0cmlidXRpb24gZm9yLiAgVGhpcwotbmFtZSBjYW4gaW5jbHVkZSB0aGUgdmVyc2lvbiBudW1iZXIuCi0KLUZvciBleGFtcGxlLCB0aGUgZGlzdHJpYnV0aW9uIHRhciBmaWxlIG9mIEdDQyB2ZXJzaW9uIDEuNDAgdW5wYWNrcyBpbnRvCi1hIHN1YmRpcmVjdG9yeSBuYW1lZCBAZmlsZXtnY2MtMS40MH0uCi0KLVRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGlzIGlzIHRvIGNyZWF0ZSBhIHN1YmRpcmVjdG9yeSBhcHByb3ByaWF0ZWx5Ci1uYW1lZCwgdXNlIEBjb2Rle2xufSBvciBAY29kZXtjcH0gdG8gaW5zdGFsbCB0aGUgcHJvcGVyIGZpbGVzIGluIGl0LCBhbmQKLXRoZW4gQGNvZGV7dGFyfSB0aGF0IHN1YmRpcmVjdG9yeS4KLQotQ29tcHJlc3MgdGhlIHRhciBmaWxlIGZpbGUgd2l0aCBAY29kZXtnemlwfS4gIEZvciBleGFtcGxlLCB0aGUgYWN0dWFsCi1kaXN0cmlidXRpb24gZmlsZSBmb3IgR0NDIHZlcnNpb24gMS40MCBpcyBjYWxsZWQgQGZpbGV7Z2NjLTEuNDAudGFyLmd6fS4KLQotVGhlIEBjb2Rle2Rpc3R9IHRhcmdldCBzaG91bGQgZXhwbGljaXRseSBkZXBlbmQgb24gYWxsIG5vbi1zb3VyY2UgZmlsZXMKLXRoYXQgYXJlIGluIHRoZSBkaXN0cmlidXRpb24sIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSB1cCB0byBkYXRlIGluIHRoZQotZGlzdHJpYnV0aW9uLgotQGlmc2V0IENPREVTVEQKLUB4cmVme1JlbGVhc2VzLCAsIE1ha2luZyBSZWxlYXNlc30uCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBDT0RFU1RECi1AeHJlZntSZWxlYXNlcywgLCBNYWtpbmcgUmVsZWFzZXMsIHN0YW5kYXJkcywgR05VIENvZGluZyBTdGFuZGFyZHN9LgotQGVuZCBpZmNsZWFyCi0KLUBpdGVtIGNoZWNrCi1QZXJmb3JtIHNlbGYtdGVzdHMgKGlmIGFueSkuICBUaGUgdXNlciBtdXN0IGJ1aWxkIHRoZSBwcm9ncmFtIGJlZm9yZQotcnVubmluZyB0aGUgdGVzdHMsIGJ1dCBuZWVkIG5vdCBpbnN0YWxsIHRoZSBwcm9ncmFtOyB5b3Ugc2hvdWxkIHdyaXRlCi10aGUgc2VsZi10ZXN0cyBzbyB0aGF0IHRoZXkgd29yayB3aGVuIHRoZSBwcm9ncmFtIGlzIGJ1aWx0IGJ1dCBub3QKLWluc3RhbGxlZC4KLUBlbmQgdGFibGUKLQotVGhlIGZvbGxvd2luZyB0YXJnZXRzIGFyZSBzdWdnZXN0ZWQgYXMgY29udmVudGlvbmFsIG5hbWVzLCBmb3IgcHJvZ3JhbXMKLWluIHdoaWNoIHRoZXkgYXJlIHVzZWZ1bC4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBpbnN0YWxsY2hlY2sKLVBlcmZvcm0gaW5zdGFsbGF0aW9uIHRlc3RzIChpZiBhbnkpLiAgVGhlIHVzZXIgbXVzdCBidWlsZCBhbmQgaW5zdGFsbAotdGhlIHByb2dyYW0gYmVmb3JlIHJ1bm5pbmcgdGhlIHRlc3RzLiAgWW91IHNob3VsZCBub3QgYXNzdW1lIHRoYXQKLUBmaWxleyQoYmluZGlyKX0gaXMgaW4gdGhlIHNlYXJjaCBwYXRoLgotCi1AaXRlbSBpbnN0YWxsZGlycwotSXQncyB1c2VmdWwgdG8gYWRkIGEgdGFyZ2V0IG5hbWVkIEBzYW1we2luc3RhbGxkaXJzfSB0byBjcmVhdGUgdGhlCi1kaXJlY3RvcmllcyB3aGVyZSBmaWxlcyBhcmUgaW5zdGFsbGVkLCBhbmQgdGhlaXIgcGFyZW50IGRpcmVjdG9yaWVzLgotVGhlcmUgaXMgYSBzY3JpcHQgY2FsbGVkIEBmaWxle21raW5zdGFsbGRpcnN9IHdoaWNoIGlzIGNvbnZlbmllbnQgZm9yCi10aGlzOyB5b3UgY2FuIGZpbmQgaXQgaW4gdGhlIFRleGluZm8gcGFja2FnZS4KLUBjIEl0J3MgaW4gL2dkL2dudS9saWIvbWtpbnN0YWxsZGlycy4KLVlvdSBjYW4gdXNlIGEgcnVsZSBsaWtlIHRoaXM6Ci0KLUBjb21tZW50IFRoaXMgaGFzIGJlZW4gY2FyZWZ1bGx5IGZvcm1hdHRlZCB0byBsb29rIGRlY2VudCBpbiB0aGUgTWFrZSBtYW51YWwuCi1AY29tbWVudCBQbGVhc2UgYmUgc3VyZSBub3QgdG8gbWFrZSBpdCBleHRlbmQgYW55IGZ1cnRoZXIgdG8gdGhlIHJpZ2h0Li0tcm9sYW5kCi1Ac21hbGxleGFtcGxlCi0jIE1ha2Ugc3VyZSBhbGwgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIChlLmcuICQoYmluZGlyKSkKLSMgYWN0dWFsbHkgZXhpc3QgYnkgbWFraW5nIHRoZW0gaWYgbmVjZXNzYXJ5LgotaW5zdGFsbGRpcnM6IG1raW5zdGFsbGRpcnMKLSAgICAgICAgJChzcmNkaXIpL21raW5zdGFsbGRpcnMgJChiaW5kaXIpICQoZGF0YWRpcikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGxpYmRpcikgJChpbmZvZGlyKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobWFuZGlyKQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhpcyBydWxlIHNob3VsZCBub3QgbW9kaWZ5IHRoZSBkaXJlY3RvcmllcyB3aGVyZSBjb21waWxhdGlvbiBpcyBkb25lLgotSXQgc2hvdWxkIGRvIG5vdGhpbmcgYnV0IGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEluc3RhbGwgQ29tbWFuZCBDYXRlZ29yaWVzCi1Ac2VjdGlvbiBJbnN0YWxsIENvbW1hbmQgQ2F0ZWdvcmllcwotCi1AY2luZGV4IHByZS1pbnN0YWxsYXRpb24gY29tbWFuZHMKLUBjaW5kZXggcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZHMKLVdoZW4gd3JpdGluZyB0aGUgQGNvZGV7aW5zdGFsbH0gdGFyZ2V0LCB5b3UgbXVzdCBjbGFzc2lmeSBhbGwgdGhlCi1jb21tYW5kcyBpbnRvIHRocmVlIGNhdGVnb3JpZXM6IG5vcm1hbCBvbmVzLCBAZGZue3ByZS1pbnN0YWxsYXRpb259Ci1jb21tYW5kcyBhbmQgQGRmbntwb3N0LWluc3RhbGxhdGlvbn0gY29tbWFuZHMuCi0KLU5vcm1hbCBjb21tYW5kcyBtb3ZlIGZpbGVzIGludG8gdGhlaXIgcHJvcGVyIHBsYWNlcywgYW5kIHNldCB0aGVpcgotbW9kZXMuICBUaGV5IG1heSBub3QgYWx0ZXIgYW55IGZpbGVzIGV4Y2VwdCB0aGUgb25lcyB0aGF0IGNvbWUgZW50aXJlbHkKLWZyb20gdGhlIHBhY2thZ2UgdGhleSBiZWxvbmcgdG8uCi0KLVByZS1pbnN0YWxsYXRpb24gYW5kIHBvc3QtaW5zdGFsbGF0aW9uIGNvbW1hbmRzIG1heSBhbHRlciBvdGhlciBmaWxlczsKLWluIHBhcnRpY3VsYXIsIHRoZXkgY2FuIGVkaXQgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZmlsZXMgb3IgZGF0YSBiYXNlcy4KLQotUHJlLWluc3RhbGxhdGlvbiBjb21tYW5kcyBhcmUgdHlwaWNhbGx5IGV4ZWN1dGVkIGJlZm9yZSB0aGUgbm9ybWFsCi1jb21tYW5kcywgYW5kIHBvc3QtaW5zdGFsbGF0aW9uIGNvbW1hbmRzIGFyZSB0eXBpY2FsbHkgcnVuIGFmdGVyIHRoZQotbm9ybWFsIGNvbW1hbmRzLgotCi1UaGUgbW9zdCBjb21tb24gdXNlIGZvciBhIHBvc3QtaW5zdGFsbGF0aW9uIGNvbW1hbmQgaXMgdG8gcnVuCi1AY29kZXtpbnN0YWxsLWluZm99LiAgVGhpcyBjYW5ub3QgYmUgZG9uZSB3aXRoIGEgbm9ybWFsIGNvbW1hbmQsIHNpbmNlCi1pdCBhbHRlcnMgYSBmaWxlICh0aGUgSW5mbyBkaXJlY3RvcnkpIHdoaWNoIGRvZXMgbm90IGNvbWUgZW50aXJlbHkgYW5kCi1zb2xlbHkgZnJvbSB0aGUgcGFja2FnZSBiZWluZyBpbnN0YWxsZWQuICBJdCBpcyBhIHBvc3QtaW5zdGFsbGF0aW9uCi1jb21tYW5kIGJlY2F1c2UgaXQgbmVlZHMgdG8gYmUgZG9uZSBhZnRlciB0aGUgbm9ybWFsIGNvbW1hbmQgd2hpY2gKLWluc3RhbGxzIHRoZSBwYWNrYWdlJ3MgSW5mbyBmaWxlcy4KLQotTW9zdCBwcm9ncmFtcyBkb24ndCBuZWVkIGFueSBwcmUtaW5zdGFsbGF0aW9uIGNvbW1hbmRzLCBidXQgd2UgaGF2ZSB0aGUKLWZlYXR1cmUganVzdCBpbiBjYXNlIGl0IGlzIG5lZWRlZC4KLQotVG8gY2xhc3NpZnkgdGhlIGNvbW1hbmRzIGluIHRoZSBAY29kZXtpbnN0YWxsfSBydWxlIGludG8gdGhlc2UgdGhyZWUKLWNhdGVnb3JpZXMsIGluc2VydCBAZGZue2NhdGVnb3J5IGxpbmVzfSBhbW9uZyB0aGVtLiAgQSBjYXRlZ29yeSBsaW5lCi1zcGVjaWZpZXMgdGhlIGNhdGVnb3J5IGZvciB0aGUgY29tbWFuZHMgdGhhdCBmb2xsb3cuCi0KLUEgY2F0ZWdvcnkgbGluZSBjb25zaXN0cyBvZiBhIHRhYiBhbmQgYSByZWZlcmVuY2UgdG8gYSBzcGVjaWFsIE1ha2UKLXZhcmlhYmxlLCBwbHVzIGFuIG9wdGlvbmFsIGNvbW1lbnQgYXQgdGhlIGVuZC4gIFRoZXJlIGFyZSB0aHJlZQotdmFyaWFibGVzIHlvdSBjYW4gdXNlLCBvbmUgZm9yIGVhY2ggY2F0ZWdvcnk7IHRoZSB2YXJpYWJsZSBuYW1lCi1zcGVjaWZpZXMgdGhlIGNhdGVnb3J5LiAgQ2F0ZWdvcnkgbGluZXMgYXJlIG5vLW9wcyBpbiBvcmRpbmFyeSBleGVjdXRpb24KLWJlY2F1c2UgdGhlc2UgdGhyZWUgTWFrZSB2YXJpYWJsZXMgYXJlIG5vcm1hbGx5IHVuZGVmaW5lZCAoYW5kIHlvdQotQGVtcGh7c2hvdWxkIG5vdH0gZGVmaW5lIHRoZW0gaW4gdGhlIG1ha2VmaWxlKS4KLQotSGVyZSBhcmUgdGhlIHRocmVlIHBvc3NpYmxlIGNhdGVnb3J5IGxpbmVzLCBlYWNoIHdpdGggYSBjb21tZW50IHRoYXQKLWV4cGxhaW5zIHdoYXQgaXQgbWVhbnM6Ci0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgJChQUkVfSU5TVEFMTCkgICAgICMgQHJ7UHJlLWluc3RhbGwgY29tbWFuZHMgZm9sbG93Ln0KLSAgICAgICAgJChQT1NUX0lOU1RBTEwpICAgICMgQHJ7UG9zdC1pbnN0YWxsIGNvbW1hbmRzIGZvbGxvdy59Ci0gICAgICAgICQoTk9STUFMX0lOU1RBTEwpICAjIEBye05vcm1hbCBjb21tYW5kcyBmb2xsb3cufQotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgeW91IGRvbid0IHVzZSBhIGNhdGVnb3J5IGxpbmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgQGNvZGV7aW5zdGFsbH0KLXJ1bGUsIGFsbCB0aGUgY29tbWFuZHMgYXJlIGNsYXNzaWZpZWQgYXMgbm9ybWFsIHVudGlsIHRoZSBmaXJzdCBjYXRlZ29yeQotbGluZS4gIElmIHlvdSBkb24ndCB1c2UgYW55IGNhdGVnb3J5IGxpbmVzLCBhbGwgdGhlIGNvbW1hbmRzIGFyZQotY2xhc3NpZmllZCBhcyBub3JtYWwuCi0KLVRoZXNlIGFyZSB0aGUgY2F0ZWdvcnkgbGluZXMgZm9yIEBjb2Rle3VuaW5zdGFsbH06Ci0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgJChQUkVfVU5JTlNUQUxMKSAgICAgIyBAcntQcmUtdW5pbnN0YWxsIGNvbW1hbmRzIGZvbGxvdy59Ci0gICAgICAgICQoUE9TVF9VTklOU1RBTEwpICAgICMgQHJ7UG9zdC11bmluc3RhbGwgY29tbWFuZHMgZm9sbG93Ln0KLSAgICAgICAgJChOT1JNQUxfVU5JTlNUQUxMKSAgIyBAcntOb3JtYWwgY29tbWFuZHMgZm9sbG93Ln0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVR5cGljYWxseSwgYSBwcmUtdW5pbnN0YWxsIGNvbW1hbmQgd291bGQgYmUgdXNlZCBmb3IgZGVsZXRpbmcgZW50cmllcwotZnJvbSB0aGUgSW5mbyBkaXJlY3RvcnkuCi0KLUlmIHRoZSBAY29kZXtpbnN0YWxsfSBvciBAY29kZXt1bmluc3RhbGx9IHRhcmdldCBoYXMgYW55IGRlcGVuZGVuY2llcwotd2hpY2ggYWN0IGFzIHN1YnJvdXRpbmVzIG9mIGluc3RhbGxhdGlvbiwgdGhlbiB5b3Ugc2hvdWxkIHN0YXJ0Ci1AZW1waHtlYWNofSBkZXBlbmRlbmN5J3MgY29tbWFuZHMgd2l0aCBhIGNhdGVnb3J5IGxpbmUsIGFuZCBzdGFydCB0aGUKLW1haW4gdGFyZ2V0J3MgY29tbWFuZHMgd2l0aCBhIGNhdGVnb3J5IGxpbmUgYWxzby4gIFRoaXMgd2F5LCB5b3UgY2FuCi1lbnN1cmUgdGhhdCBlYWNoIGNvbW1hbmQgaXMgcGxhY2VkIGluIHRoZSByaWdodCBjYXRlZ29yeSByZWdhcmRsZXNzIG9mCi13aGljaCBvZiB0aGUgZGVwZW5kZW5jaWVzIGFjdHVhbGx5IHJ1bi4KLQotUHJlLWluc3RhbGxhdGlvbiBhbmQgcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZHMgc2hvdWxkIG5vdCBydW4gYW55Ci1wcm9ncmFtcyBleGNlcHQgZm9yIHRoZXNlOgotCi1AZXhhbXBsZQotWyBiYXNlbmFtZSBiYXNoIGNhdCBjaGdycCBjaG1vZCBjaG93biBjbXAgY3AgZGQgZGlmZiBlY2hvCi1lZ3JlcCBleHBhbmQgZXhwciBmYWxzZSBmZ3JlcCBmaW5kIGdldG9wdCBncmVwIGd1bnppcCBnemlwCi1ob3N0bmFtZSBpbnN0YWxsIGluc3RhbGwtaW5mbyBraWxsIGxkY29uZmlnIGxuIGxzIG1kNXN1bQotbWtkaXIgbWtmaWZvIG1rbm9kIG12IHByaW50ZW52IHB3ZCBybSBybWRpciBzZWQgc29ydCB0ZWUKLXRlc3QgdG91Y2ggdHJ1ZSB1bmFtZSB4YXJncyB5ZXMKLUBlbmQgZXhhbXBsZQotCi1AY2luZGV4IGJpbmFyeSBwYWNrYWdlcwotVGhlIHJlYXNvbiBmb3IgZGlzdGluZ3Vpc2hpbmcgdGhlIGNvbW1hbmRzIGluIHRoaXMgd2F5IGlzIGZvciB0aGUgc2FrZQotb2YgbWFraW5nIGJpbmFyeSBwYWNrYWdlcy4gIFR5cGljYWxseSBhIGJpbmFyeSBwYWNrYWdlIGNvbnRhaW5zIGFsbCB0aGUKLWV4ZWN1dGFibGVzIGFuZCBvdGhlciBmaWxlcyB0aGF0IG5lZWQgdG8gYmUgaW5zdGFsbGVkLCBhbmQgaGFzIGl0cyBvd24KLW1ldGhvZCBvZiBpbnN0YWxsaW5nIHRoZW0tLS1zbyBpdCBkb2VzIG5vdCBuZWVkIHRvIHJ1biB0aGUgbm9ybWFsCi1pbnN0YWxsYXRpb24gY29tbWFuZHMuICBCdXQgaW5zdGFsbGluZyB0aGUgYmluYXJ5IHBhY2thZ2UgZG9lcyBuZWVkIHRvCi1leGVjdXRlIHRoZSBwcmUtaW5zdGFsbGF0aW9uIGFuZCBwb3N0LWluc3RhbGxhdGlvbiBjb21tYW5kcy4KLQotUHJvZ3JhbXMgdG8gYnVpbGQgYmluYXJ5IHBhY2thZ2VzIHdvcmsgYnkgZXh0cmFjdGluZyB0aGUKLXByZS1pbnN0YWxsYXRpb24gYW5kIHBvc3QtaW5zdGFsbGF0aW9uIGNvbW1hbmRzLiAgSGVyZSBpcyBvbmUgd2F5IG9mCi1leHRyYWN0aW5nIHRoZSBwcmUtaW5zdGFsbGF0aW9uIGNvbW1hbmRzOgotCi1Ac21hbGxleGFtcGxlCi1tYWtlIC1uIGluc3RhbGwgLW8gYWxsIFwKLSAgICAgIFBSRV9JTlNUQUxMPXByZS1pbnN0YWxsIFwKLSAgICAgIFBPU1RfSU5TVEFMTD1wb3N0LWluc3RhbGwgXAotICAgICAgTk9STUFMX0lOU1RBTEw9bm9ybWFsLWluc3RhbGwgXAotICB8IGdhd2sgLWYgcHJlLWluc3RhbGwuYXdrCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdoZXJlIHRoZSBmaWxlIEBmaWxle3ByZS1pbnN0YWxsLmF3a30gY291bGQgY29udGFpbiB0aGlzOgotCi1Ac21hbGxleGFtcGxlCi0kMCB+IC9eXHRbIFx0XSoobm9ybWFsX2luc3RhbGx8cG9zdF9pbnN0YWxsKVsgXHRdKiQvIEB7b24gPSAwQH0KLW9uIEB7cHJpbnQgJDBAfQotJDAgfiAvXlx0WyBcdF0qcHJlX2luc3RhbGxbIFx0XSokLyBAe29uID0gMUB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgcmVzdWx0aW5nIGZpbGUgb2YgcHJlLWluc3RhbGxhdGlvbiBjb21tYW5kcyBpcyBleGVjdXRlZCBhcyBhIHNoZWxsCi1zY3JpcHQgYXMgcGFydCBvZiBpbnN0YWxsaW5nIHRoZSBiaW5hcnkgcGFja2FnZS4KZGlmZiAtLWdpdCBhL2V0Yy9zdGFuZGFyZHMudGV4aSBiL2V0Yy9zdGFuZGFyZHMudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwYmY4Yi4uMDAwMDAwMAotLS0gYS9ldGMvc3RhbmRhcmRzLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkzICswLDAgQEAKLVxpbnB1dCB0ZXhpbmZvIEBjIC0qLXRleGluZm8tKi0KLUBjICUqKnN0YXJ0IG9mIGhlYWRlcgotQHNldGZpbGVuYW1lIHN0YW5kYXJkcy5pbmZvCi1Ac2V0dGl0bGUgR05VIENvZGluZyBTdGFuZGFyZHMKLUBjIFRoaXMgZGF0ZSBpcyBhdXRvbWFnaWNhbGx5IHVwZGF0ZWQgd2hlbiB5b3Ugc2F2ZSB0aGlzIGZpbGU6Ci1Ac2V0IGxhc3R1cGRhdGUgTWFyY2ggMTMsIDE5OTgKLUBjICUqKmVuZCBvZiBoZWFkZXIKLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogU3RhbmRhcmRzOiAoc3RhbmRhcmRzKS4gICAgICAgIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLgotRU5ELUlORk8tRElSLUVOVFJZCi1AZW5kIGZvcm1hdAotQGVuZCBpZmluZm8KLQotQGMgQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQHNldGNoYXB0ZXJuZXdwYWdlIG9mZgotCi1AYyBUaGlzIGlzIHVzZWQgYnkgYSBjcm9zcyByZWYgaW4gbWFrZS1zdGRzLnRleGkKLUBzZXQgQ09ERVNURCAgMQotQGlmdGV4Ci1Ac2V0IENIQVBURVIgY2hhcHRlcgotQGVuZCBpZnRleAotQGlmaW5mbwotQHNldCBDSEFQVEVSIG5vZGUKLUBlbmQgaWZpbmZvCi0KLUBpZmluZm8KLUdOVSBDb2RpbmcgU3RhbmRhcmRzCi1Db3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGVYIGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLUBlbmQgaWdub3JlCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCi1yZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMsCi1leGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBzdGF0ZWQgaW4gYSB0cmFuc2xhdGlvbiBhcHByb3ZlZAotYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLUBlbmQgaWZpbmZvCi0KLUB0aXRsZXBhZ2UKLUB0aXRsZSBHTlUgQ29kaW5nIFN0YW5kYXJkcwotQGF1dGhvciBSaWNoYXJkIFN0YWxsbWFuCi1AYXV0aG9yIGxhc3QgdXBkYXRlZCBAdmFsdWV7bGFzdHVwZGF0ZX0KLUBwYWdlCi0KLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZQotcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLAotZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgc3RhdGVkIGluIGEgdHJhbnNsYXRpb24gYXBwcm92ZWQKLWJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi1AZW5kIHRpdGxlcGFnZQotCi1AaWZpbmZvCi1Abm9kZSBUb3AsIFByZWZhY2UsIChkaXIpLCAoZGlyKQotQHRvcCBWZXJzaW9uCi0KLUxhc3QgdXBkYXRlZCBAdmFsdWV7bGFzdHVwZGF0ZX0uCi1AZW5kIGlmaW5mbwotCi1AbWVudQotKiBQcmVmYWNlOjogICAgICAgICAgICAgICAgICAgICBBYm91dCB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMKLSogSW50ZWxsZWN0dWFsIFByb3BlcnR5OjogICAgICAgS2VlcGluZyBGcmVlIFNvZnR3YXJlIEZyZWUKLSogRGVzaWduIEFkdmljZTo6ICAgICAgICAgICAgICAgR2VuZXJhbCBQcm9ncmFtIERlc2lnbgotKiBQcm9ncmFtIEJlaGF2aW9yOjogICAgICAgICAgICBQcm9ncmFtIEJlaGF2aW9yIGZvciBBbGwgUHJvZ3JhbXMKLSogV3JpdGluZyBDOjogICAgICAgICAgICAgICAgICAgTWFraW5nIFRoZSBCZXN0IFVzZSBvZiBDCi0qIERvY3VtZW50YXRpb246OiAgICAgICAgICAgICAgIERvY3VtZW50aW5nIFByb2dyYW1zCi0qIE1hbmFnaW5nIFJlbGVhc2VzOjogICAgICAgICAgIFRoZSBSZWxlYXNlIFByb2Nlc3MKLUBlbmQgbWVudQotCi1Abm9kZSBQcmVmYWNlCi1AY2hhcHRlciBBYm91dCB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMKLQotVGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzIHdlcmUgd3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuIGFuZCBvdGhlciBHTlUKLVByb2plY3Qgdm9sdW50ZWVycy4gIFRoZWlyIHB1cnBvc2UgaXMgdG8gbWFrZSB0aGUgR05VIHN5c3RlbSBjbGVhbiwKLWNvbnNpc3RlbnQsIGFuZCBlYXN5IHRvIGluc3RhbGwuICBUaGlzIGRvY3VtZW50IGNhbiBhbHNvIGJlIHJlYWQgYXMgYQotZ3VpZGUgdG8gd3JpdGluZyBwb3J0YWJsZSwgcm9idXN0IGFuZCByZWxpYWJsZSBwcm9ncmFtcy4gIEl0IGZvY3VzZXMgb24KLXByb2dyYW1zIHdyaXR0ZW4gaW4gQywgYnV0IG1hbnkgb2YgdGhlIHJ1bGVzIGFuZCBwcmluY2lwbGVzIGFyZSB1c2VmdWwKLWV2ZW4gaWYgeW91IHdyaXRlIGluIGFub3RoZXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuICBUaGUgcnVsZXMgb2Z0ZW4KLXN0YXRlIHJlYXNvbnMgZm9yIHdyaXRpbmcgaW4gYSBjZXJ0YWluIHdheS4KLQotQ29ycmVjdGlvbnMgb3Igc3VnZ2VzdGlvbnMgZm9yIHRoaXMgZG9jdW1lbnQgc2hvdWxkIGJlIHNlbnQgdG8KLUBlbWFpbHtnbnVAQGdudS5vcmd9LiAgSWYgeW91IG1ha2UgYSBzdWdnZXN0aW9uLCBwbGVhc2UgaW5jbHVkZSBhCi1zdWdnZXN0ZWQgbmV3IHdvcmRpbmcgZm9yIGl0OyBvdXIgdGltZSBpcyBsaW1pdGVkLiAgV2UgcHJlZmVyIGEgY29udGV4dAotZGlmZiB0byB0aGUgQGZpbGV7c3RhbmRhcmRzLnRleGl9IG9yIEBmaWxle21ha2Utc3Rkcy50ZXhpfSBmaWxlcywgYnV0IGlmCi15b3UgZG9uJ3QgaGF2ZSB0aG9zZSBmaWxlcywgcGxlYXNlIG1haWwgeW91ciBzdWdnZXN0aW9uIGFueXdheS4KLQotVGhpcyByZWxlYXNlIG9mIHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcyB3YXMgbGFzdCB1cGRhdGVkCi1AdmFsdWV7bGFzdHVwZGF0ZX0uCi0KLUBub2RlIEludGVsbGVjdHVhbCBQcm9wZXJ0eQotQGNoYXB0ZXIgS2VlcGluZyBGcmVlIFNvZnR3YXJlIEZyZWUKLQotVGhpcyBAdmFsdWV7Q0hBUFRFUn0gZGlzY3Vzc2VzIGhvdyB5b3UgY2FuIG1ha2Ugc3VyZSB0aGF0IEdOVSBzb2Z0d2FyZQotcmVtYWlucyB1bmVuY3VtYmVyZWQuCi0KLUBtZW51Ci0qIFJlYWRpbmcgTm9uLUZyZWUgQ29kZTo6ICAgICAgIFJlZmVycmluZyB0byBQcm9wcmlldGFyeSBQcm9ncmFtcwotKiBDb250cmlidXRpb25zOjogICAgICAgICAgICAgICBBY2NlcHRpbmcgQ29udHJpYnV0aW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIFJlYWRpbmcgTm9uLUZyZWUgQ29kZQotQHNlY3Rpb24gUmVmZXJyaW5nIHRvIFByb3ByaWV0YXJ5IFByb2dyYW1zCi0KLURvbid0IGluIGFueSBjaXJjdW1zdGFuY2VzIHJlZmVyIHRvIFVuaXggc291cmNlIGNvZGUgZm9yIG9yIGR1cmluZwoteW91ciB3b3JrIG9uIEdOVSEgIChPciB0byBhbnkgb3RoZXIgcHJvcHJpZXRhcnkgcHJvZ3JhbXMuKQotCi1JZiB5b3UgaGF2ZSBhIHZhZ3VlIHJlY29sbGVjdGlvbiBvZiB0aGUgaW50ZXJuYWxzIG9mIGEgVW5peCBwcm9ncmFtLAotdGhpcyBkb2VzIG5vdCBhYnNvbHV0ZWx5IG1lYW4geW91IGNhbid0IHdyaXRlIGFuIGltaXRhdGlvbiBvZiBpdCwgYnV0Ci1kbyB0cnkgdG8gb3JnYW5pemUgdGhlIGltaXRhdGlvbiBpbnRlcm5hbGx5IGFsb25nIGRpZmZlcmVudCBsaW5lcywKLWJlY2F1c2UgdGhpcyBpcyBsaWtlbHkgdG8gbWFrZSB0aGUgZGV0YWlscyBvZiB0aGUgVW5peCB2ZXJzaW9uCi1pcnJlbGV2YW50IGFuZCBkaXNzaW1pbGFyIHRvIHlvdXIgcmVzdWx0cy4KLQotRm9yIGV4YW1wbGUsIFVuaXggdXRpbGl0aWVzIHdlcmUgZ2VuZXJhbGx5IG9wdGltaXplZCB0byBtaW5pbWl6ZQotbWVtb3J5IHVzZTsgaWYgeW91IGdvIGZvciBzcGVlZCBpbnN0ZWFkLCB5b3VyIHByb2dyYW0gd2lsbCBiZSB2ZXJ5Ci1kaWZmZXJlbnQuICBZb3UgY291bGQga2VlcCB0aGUgZW50aXJlIGlucHV0IGZpbGUgaW4gY29yZSBhbmQgc2NhbiBpdAotdGhlcmUgaW5zdGVhZCBvZiB1c2luZyBzdGRpby4gIFVzZSBhIHNtYXJ0ZXIgYWxnb3JpdGhtIGRpc2NvdmVyZWQgbW9yZQotcmVjZW50bHkgdGhhbiB0aGUgVW5peCBwcm9ncmFtLiAgRWxpbWluYXRlIHVzZSBvZiB0ZW1wb3JhcnkgZmlsZXMuICBEbwotaXQgaW4gb25lIHBhc3MgaW5zdGVhZCBvZiB0d28gKHdlIGRpZCB0aGlzIGluIHRoZSBhc3NlbWJsZXIpLgotCi1Pciwgb24gdGhlIGNvbnRyYXJ5LCBlbXBoYXNpemUgc2ltcGxpY2l0eSBpbnN0ZWFkIG9mIHNwZWVkLiAgRm9yIHNvbWUKLWFwcGxpY2F0aW9ucywgdGhlIHNwZWVkIG9mIHRvZGF5J3MgY29tcHV0ZXJzIG1ha2VzIHNpbXBsZXIgYWxnb3JpdGhtcwotYWRlcXVhdGUuCi0KLU9yIGdvIGZvciBnZW5lcmFsaXR5LiAgRm9yIGV4YW1wbGUsIFVuaXggcHJvZ3JhbXMgb2Z0ZW4gaGF2ZSBzdGF0aWMKLXRhYmxlcyBvciBmaXhlZC1zaXplIHN0cmluZ3MsIHdoaWNoIG1ha2UgZm9yIGFyYml0cmFyeSBsaW1pdHM7IHVzZQotZHluYW1pYyBhbGxvY2F0aW9uIGluc3RlYWQuICBNYWtlIHN1cmUgeW91ciBwcm9ncmFtIGhhbmRsZXMgTlVMcyBhbmQKLW90aGVyIGZ1bm55IGNoYXJhY3RlcnMgaW4gdGhlIGlucHV0IGZpbGVzLiAgQWRkIGEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UKLWZvciBleHRlbnNpYmlsaXR5IGFuZCB3cml0ZSBwYXJ0IG9mIHRoZSBwcm9ncmFtIGluIHRoYXQgbGFuZ3VhZ2UuCi0KLU9yIHR1cm4gc29tZSBwYXJ0cyBvZiB0aGUgcHJvZ3JhbSBpbnRvIGluZGVwZW5kZW50bHkgdXNhYmxlIGxpYnJhcmllcy4KLU9yIHVzZSBhIHNpbXBsZSBnYXJiYWdlIGNvbGxlY3RvciBpbnN0ZWFkIG9mIHRyYWNraW5nIHByZWNpc2VseSB3aGVuCi10byBmcmVlIG1lbW9yeSwgb3IgdXNlIGEgbmV3IEdOVSBmYWNpbGl0eSBzdWNoIGFzIG9ic3RhY2tzLgotCi0KLUBub2RlIENvbnRyaWJ1dGlvbnMKLUBzZWN0aW9uIEFjY2VwdGluZyBDb250cmlidXRpb25zCi0KLUlmIHNvbWVvbmUgZWxzZSBzZW5kcyB5b3UgYSBwaWVjZSBvZiBjb2RlIHRvIGFkZCB0byB0aGUgcHJvZ3JhbSB5b3UgYXJlCi13b3JraW5nIG9uLCB3ZSBuZWVkIGxlZ2FsIHBhcGVycyB0byB1c2UgaXQtLS10aGUgc2FtZSBzb3J0IG9mIGxlZ2FsCi1wYXBlcnMgd2Ugd2lsbCBuZWVkIHRvIGdldCBmcm9tIHlvdS4gIEBlbXBoe0VhY2h9IHNpZ25pZmljYW50Ci1jb250cmlidXRvciB0byBhIHByb2dyYW0gbXVzdCBzaWduIHNvbWUgc29ydCBvZiBsZWdhbCBwYXBlcnMgaW4gb3JkZXIKLWZvciB1cyB0byBoYXZlIGNsZWFyIHRpdGxlIHRvIHRoZSBwcm9ncmFtLiAgVGhlIG1haW4gYXV0aG9yIGFsb25lIGlzIG5vdAotZW5vdWdoLgotCi1TbywgYmVmb3JlIGFkZGluZyBpbiBhbnkgY29udHJpYnV0aW9ucyBmcm9tIG90aGVyIHBlb3BsZSwgcGxlYXNlIHRlbGwKLXVzLCBzbyB3ZSBjYW4gYXJyYW5nZSB0byBnZXQgdGhlIHBhcGVycy4gIFRoZW4gd2FpdCB1bnRpbCB3ZSB0ZWxsIHlvdQotdGhhdCB3ZSBoYXZlIHJlY2VpdmVkIHRoZSBzaWduZWQgcGFwZXJzLCBiZWZvcmUgeW91IGFjdHVhbGx5IHVzZSB0aGUKLWNvbnRyaWJ1dGlvbi4KLQotVGhpcyBhcHBsaWVzIGJvdGggYmVmb3JlIHlvdSByZWxlYXNlIHRoZSBwcm9ncmFtIGFuZCBhZnRlcndhcmQuICBJZgoteW91IHJlY2VpdmUgZGlmZnMgdG8gZml4IGEgYnVnLCBhbmQgdGhleSBtYWtlIHNpZ25pZmljYW50IGNoYW5nZXMsIHdlCi1uZWVkIGxlZ2FsIHBhcGVycyBmb3IgdGhhdCBjaGFuZ2UuCi0KLVRoaXMgYWxzbyBhcHBsaWVzIHRvIGNvbW1lbnRzIGFuZCBkb2N1bWVudGF0aW9uIGZpbGVzLiAgRm9yIGNvcHlyaWdodAotbGF3LCBjb21tZW50cyBhbmQgY29kZSBhcmUganVzdCB0ZXh0LiAgQ29weXJpZ2h0IGFwcGxpZXMgdG8gYWxsIGtpbmRzIG9mCi10ZXh0LCBzbyB3ZSBuZWVkIGxlZ2FsIHBhcGVycyBmb3IgYWxsIGtpbmRzLgotCi1Zb3UgZG9uJ3QgbmVlZCBwYXBlcnMgZm9yIGNoYW5nZXMgb2YgYSBmZXcgbGluZXMgaGVyZSBvciB0aGVyZSwgc2luY2UKLXRoZXkgYXJlIG5vdCBzaWduaWZpY2FudCBmb3IgY29weXJpZ2h0IHB1cnBvc2VzLiAgQWxzbywgeW91IGRvbid0IG5lZWQKLXBhcGVycyBpZiBhbGwgeW91IGdldCBmcm9tIHRoZSBzdWdnZXN0aW9uIGlzIHNvbWUgaWRlYXMsIG5vdCBhY3R1YWwgY29kZQotd2hpY2ggeW91IHVzZS4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd3JpdGUgYSBkaWZmZXJlbnQgc29sdXRpb24gdG8gdGhlCi1wcm9ibGVtLCB5b3UgZG9uJ3QgbmVlZCB0byBnZXQgcGFwZXJzLgotCi1XZSBrbm93IHRoaXMgaXMgZnJ1c3RyYXRpbmc7IGl0J3MgZnJ1c3RyYXRpbmcgZm9yIHVzIGFzIHdlbGwuICBCdXQgaWYKLXlvdSBkb24ndCB3YWl0LCB5b3UgYXJlIGdvaW5nIG91dCBvbiBhIGxpbWItLS1mb3IgZXhhbXBsZSwgd2hhdCBpZiB0aGUKLWNvbnRyaWJ1dG9yJ3MgZW1wbG95ZXIgd29uJ3Qgc2lnbiBhIGRpc2NsYWltZXI/ICBZb3UgbWlnaHQgaGF2ZSB0byB0YWtlCi10aGF0IGNvZGUgb3V0IGFnYWluIQotCi1UaGUgdmVyeSB3b3JzdCB0aGluZyBpcyBpZiB5b3UgZm9yZ2V0IHRvIHRlbGwgdXMgYWJvdXQgdGhlIG90aGVyCi1jb250cmlidXRvci4gIFdlIGNvdWxkIGJlIHZlcnkgZW1iYXJyYXNzZWQgaW4gY291cnQgc29tZSBkYXkgYXMgYQotcmVzdWx0LgotCi1XZSBoYXZlIG1vcmUgZGV0YWlsZWQgYWR2aWNlIGZvciBtYWludGFpbmVycyBvZiBwcm9ncmFtczsgaWYgeW91IGhhdmUKLXJlYWNoZWQgdGhlIHN0YWdlIG9mIGFjdHVhbGx5IG1haW50YWluaW5nIGEgcHJvZ3JhbSBmb3IgR05VICh3aGV0aGVyCi1yZWxlYXNlZCBvciBub3QpLCBwbGVhc2UgYXNrIHVzIGZvciBhIGNvcHkuCi0KLUBub2RlIERlc2lnbiBBZHZpY2UKLUBjaGFwdGVyIEdlbmVyYWwgUHJvZ3JhbSBEZXNpZ24KLQotVGhpcyBAdmFsdWV7Q0hBUFRFUn0gZGlzY3Vzc2VzIHNvbWUgb2YgdGhlIGlzc3VlcyB5b3Ugc2hvdWxkIHRha2UgaW50bwotYWNjb3VudCB3aGVuIGRlc2lnbmluZyB5b3VyIHByb2dyYW0uCi0KLUBtZW51Ci0qIENvbXBhdGliaWxpdHk6OiAgICAgICAgICAgICAgIENvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBpbXBsZW1lbnRhdGlvbnMKLSogVXNpbmcgRXh0ZW5zaW9uczo6ICAgICAgICAgICAgVXNpbmcgbm9uLXN0YW5kYXJkIGZlYXR1cmVzCi0qIEFOU0kgQzo6ICAgICAgICAgICAgICAgICAgICAgIFVzaW5nIEFOU0kgQyBmZWF0dXJlcwotKiBTb3VyY2UgTGFuZ3VhZ2U6OiAgICAgICAgICAgICBVc2luZyBsYW5ndWFnZXMgb3RoZXIgdGhhbiBDCi1AZW5kIG1lbnUKLQotQG5vZGUgQ29tcGF0aWJpbGl0eQotQHNlY3Rpb24gQ29tcGF0aWJpbGl0eSB3aXRoIE90aGVyIEltcGxlbWVudGF0aW9ucwotCi1XaXRoIG9jY2FzaW9uYWwgZXhjZXB0aW9ucywgdXRpbGl0eSBwcm9ncmFtcyBhbmQgbGlicmFyaWVzIGZvciBHTlUKLXNob3VsZCBiZSB1cHdhcmQgY29tcGF0aWJsZSB3aXRoIHRob3NlIGluIEJlcmtlbGV5IFVuaXgsIGFuZCB1cHdhcmQKLWNvbXBhdGlibGUgd2l0aCBAc2N7YW5zaX0gQyBpZiBAc2N7YW5zaX0gQyBzcGVjaWZpZXMgdGhlaXIgYmVoYXZpb3IsIGFuZAotdXB3YXJkIGNvbXBhdGlibGUgd2l0aCBAc2N7UE9TSVh9IGlmIEBzY3tQT1NJWH0gc3BlY2lmaWVzIHRoZWlyCi1iZWhhdmlvci4KLQotV2hlbiB0aGVzZSBzdGFuZGFyZHMgY29uZmxpY3QsIGl0IGlzIHVzZWZ1bCB0byBvZmZlciBjb21wYXRpYmlsaXR5Ci1tb2RlcyBmb3IgZWFjaCBvZiB0aGVtLgotCi1Ac2N7YW5zaX0gQyBhbmQgQHNje1BPU0lYfSBwcm9oaWJpdCBtYW55IGtpbmRzIG9mIGV4dGVuc2lvbnMuICBGZWVsIGZyZWUKLXRvIG1ha2UgdGhlIGV4dGVuc2lvbnMgYW55d2F5LCBhbmQgaW5jbHVkZSBhIEBzYW1wey0tYW5zaX0sCi1Ac2FtcHstLXBvc2l4fSwgb3IgQHNhbXB7LS1jb21wYXRpYmxlfSBvcHRpb24gdG8gdHVybiB0aGVtIG9mZi4KLUhvd2V2ZXIsIGlmIHRoZSBleHRlbnNpb24gaGFzIGEgc2lnbmlmaWNhbnQgY2hhbmNlIG9mIGJyZWFraW5nIGFueSByZWFsCi1wcm9ncmFtcyBvciBzY3JpcHRzLCB0aGVuIGl0IGlzIG5vdCByZWFsbHkgdXB3YXJkIGNvbXBhdGlibGUuICBUcnkgdG8KLXJlZGVzaWduIGl0cyBpbnRlcmZhY2UuCi0KLU1hbnkgR05VIHByb2dyYW1zIHN1cHByZXNzIGV4dGVuc2lvbnMgdGhhdCBjb25mbGljdCB3aXRoIFBPU0lYIGlmIHRoZQotZW52aXJvbm1lbnQgdmFyaWFibGUgQGNvZGV7UE9TSVhMWV9DT1JSRUNUfSBpcyBkZWZpbmVkIChldmVuIGlmIGl0IGlzCi1kZWZpbmVkIHdpdGggYSBudWxsIHZhbHVlKS4gIFBsZWFzZSBtYWtlIHlvdXIgcHJvZ3JhbSByZWNvZ25pemUgdGhpcwotdmFyaWFibGUgaWYgYXBwcm9wcmlhdGUuCi0KLVdoZW4gYSBmZWF0dXJlIGlzIHVzZWQgb25seSBieSB1c2VycyAobm90IGJ5IHByb2dyYW1zIG9yIGNvbW1hbmQKLWZpbGVzKSwgYW5kIGl0IGlzIGRvbmUgcG9vcmx5IGluIFVuaXgsIGZlZWwgZnJlZSB0byByZXBsYWNlIGl0Ci1jb21wbGV0ZWx5IHdpdGggc29tZXRoaW5nIHRvdGFsbHkgZGlmZmVyZW50IGFuZCBiZXR0ZXIuICAoRm9yIGV4YW1wbGUsCi1AY29kZXt2aX0gaXMgcmVwbGFjZWQgd2l0aCBFbWFjcy4pICBCdXQgaXQgaXMgbmljZSB0byBvZmZlciBhIGNvbXBhdGlibGUKLWZlYXR1cmUgYXMgd2VsbC4gIChUaGVyZSBpcyBhIGZyZWUgQGNvZGV7dml9IGNsb25lLCBzbyB3ZSBvZmZlciBpdC4pCi0KLUFkZGl0aW9uYWwgdXNlZnVsIGZlYXR1cmVzIG5vdCBpbiBCZXJrZWxleSBVbml4IGFyZSB3ZWxjb21lLgotCi1Abm9kZSBVc2luZyBFeHRlbnNpb25zCi1Ac2VjdGlvbiBVc2luZyBOb24tc3RhbmRhcmQgRmVhdHVyZXMKLQotTWFueSBHTlUgZmFjaWxpdGllcyB0aGF0IGFscmVhZHkgZXhpc3Qgc3VwcG9ydCBhIG51bWJlciBvZiBjb252ZW5pZW50Ci1leHRlbnNpb25zIG92ZXIgdGhlIGNvbXBhcmFibGUgVW5peCBmYWNpbGl0aWVzLiAgV2hldGhlciB0byB1c2UgdGhlc2UKLWV4dGVuc2lvbnMgaW4gaW1wbGVtZW50aW5nIHlvdXIgcHJvZ3JhbSBpcyBhIGRpZmZpY3VsdCBxdWVzdGlvbi4KLQotT24gdGhlIG9uZSBoYW5kLCB1c2luZyB0aGUgZXh0ZW5zaW9ucyBjYW4gbWFrZSBhIGNsZWFuZXIgcHJvZ3JhbS4KLU9uIHRoZSBvdGhlciBoYW5kLCBwZW9wbGUgd2lsbCBub3QgYmUgYWJsZSB0byBidWlsZCB0aGUgcHJvZ3JhbQotdW5sZXNzIHRoZSBvdGhlciBHTlUgdG9vbHMgYXJlIGF2YWlsYWJsZS4gIFRoaXMgbWlnaHQgY2F1c2UgdGhlCi1wcm9ncmFtIHRvIHdvcmsgb24gZmV3ZXIga2luZHMgb2YgbWFjaGluZXMuCi0KLVdpdGggc29tZSBleHRlbnNpb25zLCBpdCBtaWdodCBiZSBlYXN5IHRvIHByb3ZpZGUgYm90aCBhbHRlcm5hdGl2ZXMuCi1Gb3IgZXhhbXBsZSwgeW91IGNhbiBkZWZpbmUgZnVuY3Rpb25zIHdpdGggYSBgYGtleXdvcmQnJyBAY29kZXtJTkxJTkV9Ci1hbmQgZGVmaW5lIHRoYXQgYXMgYSBtYWNybyB0byBleHBhbmQgaW50byBlaXRoZXIgQGNvZGV7aW5saW5lfSBvcgotbm90aGluZywgZGVwZW5kaW5nIG9uIHRoZSBjb21waWxlci4KLQotSW4gZ2VuZXJhbCwgcGVyaGFwcyBpdCBpcyBiZXN0IG5vdCB0byB1c2UgdGhlIGV4dGVuc2lvbnMgaWYgeW91IGNhbgotc3RyYWlnaHRmb3J3YXJkbHkgZG8gd2l0aG91dCB0aGVtLCBidXQgdG8gdXNlIHRoZSBleHRlbnNpb25zIGlmIHRoZXkKLWFyZSBhIGJpZyBpbXByb3ZlbWVudC4KLQotQW4gZXhjZXB0aW9uIHRvIHRoaXMgcnVsZSBhcmUgdGhlIGxhcmdlLCBlc3RhYmxpc2hlZCBwcm9ncmFtcyAoc3VjaCBhcwotRW1hY3MpIHdoaWNoIHJ1biBvbiBhIGdyZWF0IHZhcmlldHkgb2Ygc3lzdGVtcy4gIFN1Y2ggcHJvZ3JhbXMgd291bGQKLWJlIGJyb2tlbiBieSB1c2Ugb2YgR05VIGV4dGVuc2lvbnMuCi0KLUFub3RoZXIgZXhjZXB0aW9uIGlzIGZvciBwcm9ncmFtcyB0aGF0IGFyZSB1c2VkIGFzIHBhcnQgb2YKLWNvbXBpbGF0aW9uOiBhbnl0aGluZyB0aGF0IG11c3QgYmUgY29tcGlsZWQgd2l0aCBvdGhlciBjb21waWxlcnMgaW4KLW9yZGVyIHRvIGJvb3RzdHJhcCB0aGUgR05VIGNvbXBpbGF0aW9uIGZhY2lsaXRpZXMuICBJZiB0aGVzZSByZXF1aXJlCi10aGUgR05VIGNvbXBpbGVyLCB0aGVuIG5vIG9uZSBjYW4gY29tcGlsZSB0aGVtIHdpdGhvdXQgaGF2aW5nIHRoZW0KLWluc3RhbGxlZCBhbHJlYWR5LiAgVGhhdCB3b3VsZCBiZSBubyBnb29kLgotCi1Abm9kZSBBTlNJIEMKLUBzZWN0aW9uIEBzY3thbnNpfSBDIGFuZCBwcmUtQHNje2Fuc2l9IEMKLQotRG8gbm90IGV2ZXIgdXNlIHRoZSBgYHRyaWdyYXBoJycgZmVhdHVyZSBvZiBAc2N7YW5zaX0gQy4KLQotQHNje2Fuc2l9IEMgaXMgd2lkZXNwcmVhZCBlbm91Z2ggbm93IHRoYXQgaXQgaXMgb2sgdG8gd3JpdGUgbmV3IHByb2dyYW1zCi10aGF0IHVzZSBAc2N7YW5zaX0gQyBmZWF0dXJlcyAoYW5kIHRoZXJlZm9yZSB3aWxsIG5vdCB3b3JrIGluCi1ub24tQHNje2Fuc2l9IGNvbXBpbGVycykuICBBbmQgaWYgYSBwcm9ncmFtIGlzIGFscmVhZHkgd3JpdHRlbiBpbgotQHNje2Fuc2l9IEMsIHRoZXJlJ3Mgbm8gbmVlZCB0byBjb252ZXJ0IGl0IHRvIHN1cHBvcnQgbm9uLUBzY3thbnNpfQotY29tcGlsZXJzLgotCi1Ib3dldmVyLCBpdCBpcyBlYXN5IHRvIHN1cHBvcnQgbm9uLUBzY3thbnNpfSBjb21waWxlcnMgaW4gbW9zdCBwcm9ncmFtcywKLXNvIHlvdSBtaWdodCBzdGlsbCBjb25zaWRlciBkb2luZyBzbyB3aGVuIHlvdSB3cml0ZSBhIHByb2dyYW0uICBJbnN0ZWFkCi1vZiB3cml0aW5nIGZ1bmN0aW9uIGRlZmluaXRpb25zIGluIEBzY3thbnNpfSBwcm90b3R5cGUgZm9ybSwKLQotQGV4YW1wbGUKLWludAotZm9vIChpbnQgeCwgaW50IHkpCi1AZG90c3t9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci13cml0ZSB0aGUgZGVmaW5pdGlvbiBpbiBwcmUtQHNje2Fuc2l9IHN0eWxlIGxpa2UgdGhpcywKLQotQGV4YW1wbGUKLWludAotZm9vICh4LCB5KQotICAgICBpbnQgeCwgeTsKLUBkb3Rze30KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLWFuZCB1c2UgYSBzZXBhcmF0ZSBkZWNsYXJhdGlvbiB0byBzcGVjaWZ5IHRoZSBhcmd1bWVudCBwcm90b3R5cGU6Ci0KLUBleGFtcGxlCi1pbnQgZm9vIChpbnQsIGludCk7Ci1AZW5kIGV4YW1wbGUKLQotWW91IG5lZWQgc3VjaCBhIGRlY2xhcmF0aW9uIGFueXdheSwgaW4gYSBoZWFkZXIgZmlsZSwgdG8gZ2V0IHRoZSBiZW5lZml0Ci1vZiBAc2N7YW5zaX0gQyBwcm90b3R5cGVzIGluIGFsbCB0aGUgZmlsZXMgd2hlcmUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4KLUFuZCBvbmNlIHlvdSBoYXZlIGl0LCB5b3UgbG9zZSBub3RoaW5nIGJ5IHdyaXRpbmcgdGhlIGZ1bmN0aW9uCi1kZWZpbml0aW9uIGluIHRoZSBwcmUtQHNje2Fuc2l9IHN0eWxlLgotCi1JZiB5b3UgZG9uJ3Qga25vdyBub24tQHNje2Fuc2l9IEMsIHRoZXJlJ3Mgbm8gbmVlZCB0byBsZWFybiBpdDsganVzdAotd3JpdGUgaW4gQHNje2Fuc2l9IEMuCi0KLUBub2RlIFNvdXJjZSBMYW5ndWFnZQotQHNlY3Rpb24gVXNpbmcgTGFuZ3VhZ2VzIE90aGVyIFRoYW4gQwotCi1Vc2luZyBhIGxhbmd1YWdlIG90aGVyIHRoYW4gQyBpcyBsaWtlIHVzaW5nIGEgbm9uLXN0YW5kYXJkIGZlYXR1cmU6IGl0Ci13aWxsIGNhdXNlIHRyb3VibGUgZm9yIHVzZXJzLiAgRXZlbiBpZiBHQ0Mgc3VwcG9ydHMgdGhlIG90aGVyIGxhbmd1YWdlLAotdXNlcnMgbWF5IGZpbmQgaXQgaW5jb252ZW5pZW50IHRvIGhhdmUgdG8gaW5zdGFsbCB0aGUgY29tcGlsZXIgZm9yIHRoYXQKLW90aGVyIGxhbmd1YWdlIGluIG9yZGVyIHRvIGJ1aWxkIHlvdXIgcHJvZ3JhbS4gIEZvciBleGFtcGxlLCBpZiB5b3UKLXdyaXRlIHlvdXIgcHJvZ3JhbSBpbiBDKyssIHBlb3BsZSB3aWxsIGhhdmUgdG8gaW5zdGFsbCB0aGUgQysrIGNvbXBpbGVyCi1pbiBvcmRlciB0byBjb21waWxlIHlvdXIgcHJvZ3JhbS4gIFRodXMsIGl0IGlzIGJldHRlciBpZiB5b3Ugd3JpdGUgaW4gQy4KLQotQnV0IHRoZXJlIGFyZSB0aHJlZSBzaXR1YXRpb25zIHdoZW4gdGhlcmUgaXMgbm8gZGlzYWR2YW50YWdlIGluIHVzaW5nCi1zb21lIG90aGVyIGxhbmd1YWdlOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotSXQgaXMgb2theSB0byB1c2UgYW5vdGhlciBsYW5ndWFnZSBpZiB5b3VyIHByb2dyYW0gY29udGFpbnMgYW4KLWludGVycHJldGVyIGZvciB0aGF0IGxhbmd1YWdlLgotCi1Gb3IgZXhhbXBsZSwgaWYgeW91ciBwcm9ncmFtIGxpbmtzIHdpdGggR1VJTEUsIGl0IGlzIG9rIHRvIHdyaXRlIHBhcnQgb2YKLXRoZSBwcm9ncmFtIGluIFNjaGVtZSBvciBhbm90aGVyIGxhbmd1YWdlIHN1cHBvcnRlZCBieSBHVUlMRS4KLQotQGl0ZW0KLUl0IGlzIG9rYXkgdG8gdXNlIGFub3RoZXIgbGFuZ3VhZ2UgaW4gYSB0b29sIHNwZWNpZmljYWxseSBpbnRlbmRlZCBmb3IKLXVzZSB3aXRoIHRoYXQgbGFuZ3VhZ2UuCi0KLVRoaXMgaXMgb2theSBiZWNhdXNlIHRoZSBvbmx5IHBlb3BsZSB3aG8gd2FudCB0byBidWlsZCB0aGUgdG9vbCB3aWxsIGJlCi10aG9zZSB3aG8gaGF2ZSBpbnN0YWxsZWQgdGhlIG90aGVyIGxhbmd1YWdlIGFueXdheS4KLQotQGl0ZW0KLUlmIGFuIGFwcGxpY2F0aW9uIGlzIG9mIGludGVyZXN0IHRvIGEgbmFycm93IGNvbW11bml0eSwgdGhlbiBwZXJoYXBzCi1pdCdzIG5vdCBpbXBvcnRhbnQgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIGluY29udmVuaWVudCB0byBpbnN0YWxsLgotQGVuZCBpdGVtaXplCi0KLUMgaGFzIG9uZSBvdGhlciBhZHZhbnRhZ2Ugb3ZlciBDKysgYW5kIG90aGVyIGNvbXBpbGVkIGxhbmd1YWdlczogbW9yZQotcGVvcGxlIGtub3cgQywgc28gbW9yZSBwZW9wbGUgd2lsbCBmaW5kIGl0IGVhc3kgdG8gcmVhZCBhbmQgbW9kaWZ5IHRoZQotcHJvZ3JhbSBpZiBpdCBpcyB3cml0dGVuIGluIEMuCi0KLUBub2RlIFByb2dyYW0gQmVoYXZpb3IKLUBjaGFwdGVyIFByb2dyYW0gQmVoYXZpb3IgZm9yIEFsbCBQcm9ncmFtcwotCi1UaGlzIEB2YWx1ZXtDSEFQVEVSfSBkZXNjcmliZXMgaG93IHRvIHdyaXRlIHJvYnVzdCBzb2Z0d2FyZS4gSXQgYWxzbwotZGVzY3JpYmVzIGdlbmVyYWwgc3RhbmRhcmRzIGZvciBlcnJvciBtZXNzYWdlcywgdGhlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UsCi1hbmQgaG93IGxpYnJhcmllcyBzaG91bGQgYmVoYXZlLgotCi1AbWVudQotKiBTZW1hbnRpY3M6OiAgICAgICAgICAgICAgICAgICBXcml0aW5nIHJvYnVzdCBwcm9ncmFtcwotKiBMaWJyYXJpZXM6OiAgICAgICAgICAgICAgICAgICBMaWJyYXJ5IGJlaGF2aW9yCi0qIEVycm9yczo6ICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdHRpbmcgZXJyb3IgbWVzc2FnZXMKLSogVXNlciBJbnRlcmZhY2VzOjogICAgICAgICAgICAgU3RhbmRhcmRzIGZvciBjb21tYW5kIGxpbmUgaW50ZXJmYWNlcwotKiBPcHRpb24gVGFibGU6OiAgICAgICAgICAgICAgICBUYWJsZSBvZiBsb25nIG9wdGlvbnMuCi0qIE1lbW9yeSBVc2FnZTo6ICAgICAgICAgICAgICAgIFdoZW4gYW5kIGhvdyB0byBjYXJlIGFib3V0IG1lbW9yeSBuZWVkcwotQGVuZCBtZW51Ci0KLUBub2RlIFNlbWFudGljcwotQHNlY3Rpb24gV3JpdGluZyBSb2J1c3QgUHJvZ3JhbXMKLQotQXZvaWQgYXJiaXRyYXJ5IGxpbWl0cyBvbiB0aGUgbGVuZ3RoIG9yIG51bWJlciBvZiBAZW1waHthbnl9IGRhdGEKLXN0cnVjdHVyZSwgaW5jbHVkaW5nIGZpbGUgbmFtZXMsIGxpbmVzLCBmaWxlcywgYW5kIHN5bWJvbHMsIGJ5IGFsbG9jYXRpbmcKLWFsbCBkYXRhIHN0cnVjdHVyZXMgZHluYW1pY2FsbHkuICBJbiBtb3N0IFVuaXggdXRpbGl0aWVzLCBgYGxvbmcgbGluZXMKLWFyZSBzaWxlbnRseSB0cnVuY2F0ZWQnJy4gIFRoaXMgaXMgbm90IGFjY2VwdGFibGUgaW4gYSBHTlUgdXRpbGl0eS4KLQotVXRpbGl0aWVzIHJlYWRpbmcgZmlsZXMgc2hvdWxkIG5vdCBkcm9wIE5VTCBjaGFyYWN0ZXJzLCBvciBhbnkgb3RoZXIKLW5vbnByaW50aW5nIGNoYXJhY3RlcnMgQGVtcGh7aW5jbHVkaW5nIHRob3NlIHdpdGggY29kZXMgYWJvdmUgMDE3N30uICBUaGUKLW9ubHkgc2Vuc2libGUgZXhjZXB0aW9ucyB3b3VsZCBiZSB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGludGVuZGVkIGZvcgotaW50ZXJmYWNlIHRvIGNlcnRhaW4gdHlwZXMgb2YgcHJpbnRlcnMgdGhhdCBjYW4ndCBoYW5kbGUgdGhvc2UgY2hhcmFjdGVycy4KLQotQ2hlY2sgZXZlcnkgc3lzdGVtIGNhbGwgZm9yIGFuIGVycm9yIHJldHVybiwgdW5sZXNzIHlvdSBrbm93IHlvdSB3aXNoIHRvCi1pZ25vcmUgZXJyb3JzLiAgSW5jbHVkZSB0aGUgc3lzdGVtIGVycm9yIHRleHQgKGZyb20gQGNvZGV7cGVycm9yfSBvcgotZXF1aXZhbGVudCkgaW4gQGVtcGh7ZXZlcnl9IGVycm9yIG1lc3NhZ2UgcmVzdWx0aW5nIGZyb20gYSBmYWlsaW5nCi1zeXN0ZW0gY2FsbCwgYXMgd2VsbCBhcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBpZiBhbnkgYW5kIHRoZSBuYW1lIG9mIHRoZQotdXRpbGl0eS4gIEp1c3QgYGBjYW5ub3Qgb3BlbiBmb28uYycnIG9yIGBgc3RhdCBmYWlsZWQnJyBpcyBub3QKLXN1ZmZpY2llbnQuCi0KLUNoZWNrIGV2ZXJ5IGNhbGwgdG8gQGNvZGV7bWFsbG9jfSBvciBAY29kZXtyZWFsbG9jfSB0byBzZWUgaWYgaXQKLXJldHVybmVkIHplcm8uICBDaGVjayBAY29kZXtyZWFsbG9jfSBldmVuIGlmIHlvdSBhcmUgbWFraW5nIHRoZSBibG9jawotc21hbGxlcjsgaW4gYSBzeXN0ZW0gdGhhdCByb3VuZHMgYmxvY2sgc2l6ZXMgdG8gYSBwb3dlciBvZiAyLAotQGNvZGV7cmVhbGxvY30gbWF5IGdldCBhIGRpZmZlcmVudCBibG9jayBpZiB5b3UgYXNrIGZvciBsZXNzIHNwYWNlLgotCi1JbiBVbml4LCBAY29kZXtyZWFsbG9jfSBjYW4gZGVzdHJveSB0aGUgc3RvcmFnZSBibG9jayBpZiBpdCByZXR1cm5zCi16ZXJvLiAgR05VIEBjb2Rle3JlYWxsb2N9IGRvZXMgbm90IGhhdmUgdGhpcyBidWc6IGlmIGl0IGZhaWxzLCB0aGUKLW9yaWdpbmFsIGJsb2NrIGlzIHVuY2hhbmdlZC4gIEZlZWwgZnJlZSB0byBhc3N1bWUgdGhlIGJ1ZyBpcyBmaXhlZC4gIElmCi15b3Ugd2lzaCB0byBydW4geW91ciBwcm9ncmFtIG9uIFVuaXgsIGFuZCB3aXNoIHRvIGF2b2lkIGxvc3NhZ2UgaW4gdGhpcwotY2FzZSwgeW91IGNhbiB1c2UgdGhlIEdOVSBAY29kZXttYWxsb2N9LgotCi1Zb3UgbXVzdCBleHBlY3QgQGNvZGV7ZnJlZX0gdG8gYWx0ZXIgdGhlIGNvbnRlbnRzIG9mIHRoZSBibG9jayB0aGF0IHdhcwotZnJlZWQuICBBbnl0aGluZyB5b3Ugd2FudCB0byBmZXRjaCBmcm9tIHRoZSBibG9jaywgeW91IG11c3QgZmV0Y2ggYmVmb3JlCi1jYWxsaW5nIEBjb2Rle2ZyZWV9LgotCi1JZiBAY29kZXttYWxsb2N9IGZhaWxzIGluIGEgbm9uaW50ZXJhY3RpdmUgcHJvZ3JhbSwgbWFrZSB0aGF0IGEgZmF0YWwKLWVycm9yLiAgSW4gYW4gaW50ZXJhY3RpdmUgcHJvZ3JhbSAob25lIHRoYXQgcmVhZHMgY29tbWFuZHMgZnJvbSB0aGUKLXVzZXIpLCBpdCBpcyBiZXR0ZXIgdG8gYWJvcnQgdGhlIGNvbW1hbmQgYW5kIHJldHVybiB0byB0aGUgY29tbWFuZAotcmVhZGVyIGxvb3AuICBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBraWxsIG90aGVyIHByb2Nlc3NlcyB0byBmcmVlIHVwCi12aXJ0dWFsIG1lbW9yeSwgYW5kIHRoZW4gdHJ5IHRoZSBjb21tYW5kIGFnYWluLgotCi1Vc2UgQGNvZGV7Z2V0b3B0X2xvbmd9IHRvIGRlY29kZSBhcmd1bWVudHMsIHVubGVzcyB0aGUgYXJndW1lbnQgc3ludGF4Ci1tYWtlcyB0aGlzIHVucmVhc29uYWJsZS4KLQotV2hlbiBzdGF0aWMgc3RvcmFnZSBpcyB0byBiZSB3cml0dGVuIGluIGR1cmluZyBwcm9ncmFtIGV4ZWN1dGlvbiwgdXNlCi1leHBsaWNpdCBDIGNvZGUgdG8gaW5pdGlhbGl6ZSBpdC4gIFJlc2VydmUgQyBpbml0aWFsaXplZCBkZWNsYXJhdGlvbnMKLWZvciBkYXRhIHRoYXQgd2lsbCBub3QgYmUgY2hhbmdlZC4KLUBjIEFEUjogd2h5PwotCi1UcnkgdG8gYXZvaWQgbG93LWxldmVsIGludGVyZmFjZXMgdG8gb2JzY3VyZSBVbml4IGRhdGEgc3RydWN0dXJlcyAoc3VjaAotYXMgZmlsZSBkaXJlY3RvcmllcywgdXRtcCwgb3IgdGhlIGxheW91dCBvZiBrZXJuZWwgbWVtb3J5KSwgc2luY2UgdGhlc2UKLWFyZSBsZXNzIGxpa2VseSB0byB3b3JrIGNvbXBhdGlibHkuICBJZiB5b3UgbmVlZCB0byBmaW5kIGFsbCB0aGUgZmlsZXMKLWluIGEgZGlyZWN0b3J5LCB1c2UgQGNvZGV7cmVhZGRpcn0gb3Igc29tZSBvdGhlciBoaWdoLWxldmVsIGludGVyZmFjZS4KLVRoZXNlIHdpbGwgYmUgc3VwcG9ydGVkIGNvbXBhdGlibHkgYnkgR05VLgotCi1CeSBkZWZhdWx0LCB0aGUgR05VIHN5c3RlbSB3aWxsIHByb3ZpZGUgdGhlIHNpZ25hbCBoYW5kbGluZyBmdW5jdGlvbnMgb2YKLUBzY3tCU0R9IGFuZCBvZiBAc2N7UE9TSVh9LiAgU28gR05VIHNvZnR3YXJlIHNob3VsZCBiZSB3cml0dGVuIHRvIHVzZQotdGhlc2UuCi0KLUluIGVycm9yIGNoZWNrcyB0aGF0IGRldGVjdCBgYGltcG9zc2libGUnJyBjb25kaXRpb25zLCBqdXN0IGFib3J0LgotVGhlcmUgaXMgdXN1YWxseSBubyBwb2ludCBpbiBwcmludGluZyBhbnkgbWVzc2FnZS4gIFRoZXNlIGNoZWNrcwotaW5kaWNhdGUgdGhlIGV4aXN0ZW5jZSBvZiBidWdzLiAgV2hvZXZlciB3YW50cyB0byBmaXggdGhlIGJ1Z3Mgd2lsbCBoYXZlCi10byByZWFkIHRoZSBzb3VyY2UgY29kZSBhbmQgcnVuIGEgZGVidWdnZXIuICBTbyBleHBsYWluIHRoZSBwcm9ibGVtIHdpdGgKLWNvbW1lbnRzIGluIHRoZSBzb3VyY2UuICBUaGUgcmVsZXZhbnQgZGF0YSB3aWxsIGJlIGluIHZhcmlhYmxlcywgd2hpY2gKLWFyZSBlYXN5IHRvIGV4YW1pbmUgd2l0aCB0aGUgZGVidWdnZXIsIHNvIHRoZXJlIGlzIG5vIHBvaW50IG1vdmluZyB0aGVtCi1lbHNld2hlcmUuCi0KLURvIG5vdCB1c2UgYSBjb3VudCBvZiBlcnJvcnMgYXMgdGhlIGV4aXQgc3RhdHVzIGZvciBhIHByb2dyYW0uCi1AZW1waHtUaGF0IGRvZXMgbm90IHdvcmt9LCBiZWNhdXNlIGV4aXQgc3RhdHVzIHZhbHVlcyBhcmUgbGltaXRlZCB0byA4Ci1iaXRzICgwIHRocm91Z2ggMjU1KS4gIEEgc2luZ2xlIHJ1biBvZiB0aGUgcHJvZ3JhbSBtaWdodCBoYXZlIDI1NgotZXJyb3JzOyBpZiB5b3UgdHJ5IHRvIHJldHVybiAyNTYgYXMgdGhlIGV4aXQgc3RhdHVzLCB0aGUgcGFyZW50IHByb2Nlc3MKLXdpbGwgc2VlIDAgYXMgdGhlIHN0YXR1cywgYW5kIGl0IHdpbGwgYXBwZWFyIHRoYXQgdGhlIHByb2dyYW0gc3VjY2VlZGVkLgotCi1JZiB5b3UgbWFrZSB0ZW1wb3JhcnkgZmlsZXMsIGNoZWNrIHRoZSBAY29kZXtUTVBESVJ9IGVudmlyb25tZW50Ci12YXJpYWJsZTsgaWYgdGhhdCB2YXJpYWJsZSBpcyBkZWZpbmVkLCB1c2UgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkKLWluc3RlYWQgb2YgQGZpbGV7L3RtcH0uCi0KLUBub2RlIExpYnJhcmllcwotQHNlY3Rpb24gTGlicmFyeSBCZWhhdmlvcgotCi1UcnkgdG8gbWFrZSBsaWJyYXJ5IGZ1bmN0aW9ucyByZWVudHJhbnQuICBJZiB0aGV5IG5lZWQgdG8gZG8gZHluYW1pYwotc3RvcmFnZSBhbGxvY2F0aW9uLCBhdCBsZWFzdCB0cnkgdG8gYXZvaWQgYW55IG5vbnJlZW50cmFuY3kgYXNpZGUgZnJvbQotdGhhdCBvZiBAY29kZXttYWxsb2N9IGl0c2VsZi4KLQotSGVyZSBhcmUgY2VydGFpbiBuYW1lIGNvbnZlbnRpb25zIGZvciBsaWJyYXJpZXMsIHRvIGF2b2lkIG5hbWUKLWNvbmZsaWN0cy4KLQotQ2hvb3NlIGEgbmFtZSBwcmVmaXggZm9yIHRoZSBsaWJyYXJ5LCBtb3JlIHRoYW4gdHdvIGNoYXJhY3RlcnMgbG9uZy4KLUFsbCBleHRlcm5hbCBmdW5jdGlvbiBhbmQgdmFyaWFibGUgbmFtZXMgc2hvdWxkIHN0YXJ0IHdpdGggdGhpcwotcHJlZml4LiAgSW4gYWRkaXRpb24sIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBvZiB0aGVzZSBpbiBhbnkgZ2l2ZW4KLWxpYnJhcnkgbWVtYmVyLiAgVGhpcyB1c3VhbGx5IG1lYW5zIHB1dHRpbmcgZWFjaCBvbmUgaW4gYSBzZXBhcmF0ZQotc291cmNlIGZpbGUuCi0KLUFuIGV4Y2VwdGlvbiBjYW4gYmUgbWFkZSB3aGVuIHR3byBleHRlcm5hbCBzeW1ib2xzIGFyZSBhbHdheXMgdXNlZAotdG9nZXRoZXIsIHNvIHRoYXQgbm8gcmVhc29uYWJsZSBwcm9ncmFtIGNvdWxkIHVzZSBvbmUgd2l0aG91dCB0aGUKLW90aGVyOyB0aGVuIHRoZXkgY2FuIGJvdGggZ28gaW4gdGhlIHNhbWUgZmlsZS4KLQotRXh0ZXJuYWwgc3ltYm9scyB0aGF0IGFyZSBub3QgZG9jdW1lbnRlZCBlbnRyeSBwb2ludHMgZm9yIHRoZSB1c2VyCi1zaG91bGQgaGF2ZSBuYW1lcyBiZWdpbm5pbmcgd2l0aCBAc2FtcHtffS4gIFRoZXkgc2hvdWxkIGFsc28gY29udGFpbgotdGhlIGNob3NlbiBuYW1lIHByZWZpeCBmb3IgdGhlIGxpYnJhcnksIHRvIHByZXZlbnQgY29sbGlzaW9ucyB3aXRoCi1vdGhlciBsaWJyYXJpZXMuICBUaGVzZSBjYW4gZ28gaW4gdGhlIHNhbWUgZmlsZXMgd2l0aCB1c2VyIGVudHJ5Ci1wb2ludHMgaWYgeW91IGxpa2UuCi0KLVN0YXRpYyBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBjYW4gYmUgdXNlZCBhcyB5b3UgbGlrZSBhbmQgbmVlZCBub3QKLWZpdCBhbnkgbmFtaW5nIGNvbnZlbnRpb24uCi0KLUBub2RlIEVycm9ycwotQHNlY3Rpb24gRm9ybWF0dGluZyBFcnJvciBNZXNzYWdlcwotCi1FcnJvciBtZXNzYWdlcyBmcm9tIGNvbXBpbGVycyBzaG91bGQgbG9vayBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1AdmFye3NvdXJjZS1maWxlLW5hbWV9OkB2YXJ7bGluZW5vfTogQHZhcnttZXNzYWdlfQotQGVuZCBleGFtcGxlCi0KLUVycm9yIG1lc3NhZ2VzIGZyb20gb3RoZXIgbm9uaW50ZXJhY3RpdmUgcHJvZ3JhbXMgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotQHZhcntwcm9ncmFtfTpAdmFye3NvdXJjZS1maWxlLW5hbWV9OkB2YXJ7bGluZW5vfTogQHZhcnttZXNzYWdlfQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotd2hlbiB0aGVyZSBpcyBhbiBhcHByb3ByaWF0ZSBzb3VyY2UgZmlsZSwgb3IgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotQHZhcntwcm9ncmFtfTogQHZhcnttZXNzYWdlfQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotd2hlbiB0aGVyZSBpcyBubyByZWxldmFudCBzb3VyY2UgZmlsZS4KLQotSW4gYW4gaW50ZXJhY3RpdmUgcHJvZ3JhbSAob25lIHRoYXQgaXMgcmVhZGluZyBjb21tYW5kcyBmcm9tIGEKLXRlcm1pbmFsKSwgaXQgaXMgYmV0dGVyIG5vdCB0byBpbmNsdWRlIHRoZSBwcm9ncmFtIG5hbWUgaW4gYW4gZXJyb3IKLW1lc3NhZ2UuICBUaGUgcGxhY2UgdG8gaW5kaWNhdGUgd2hpY2ggcHJvZ3JhbSBpcyBydW5uaW5nIGlzIGluIHRoZQotcHJvbXB0IG9yIHdpdGggdGhlIHNjcmVlbiBsYXlvdXQuICAoV2hlbiB0aGUgc2FtZSBwcm9ncmFtIHJ1bnMgd2l0aAotaW5wdXQgZnJvbSBhIHNvdXJjZSBvdGhlciB0aGFuIGEgdGVybWluYWwsIGl0IGlzIG5vdCBpbnRlcmFjdGl2ZSBhbmQKLXdvdWxkIGRvIGJlc3QgdG8gcHJpbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgdGhlIG5vbmludGVyYWN0aXZlIHN0eWxlLikKLQotVGhlIHN0cmluZyBAdmFye21lc3NhZ2V9IHNob3VsZCBub3QgYmVnaW4gd2l0aCBhIGNhcGl0YWwgbGV0dGVyIHdoZW4KLWl0IGZvbGxvd3MgYSBwcm9ncmFtIG5hbWUgYW5kL29yIGZpbGUgbmFtZS4gIEFsc28sIGl0IHNob3VsZCBub3QgZW5kCi13aXRoIGEgcGVyaW9kLgotCi1FcnJvciBtZXNzYWdlcyBmcm9tIGludGVyYWN0aXZlIHByb2dyYW1zLCBhbmQgb3RoZXIgbWVzc2FnZXMgc3VjaCBhcwotdXNhZ2UgbWVzc2FnZXMsIHNob3VsZCBzdGFydCB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIuICBCdXQgdGhleSBzaG91bGQgbm90Ci1lbmQgd2l0aCBhIHBlcmlvZC4KLQotQG5vZGUgVXNlciBJbnRlcmZhY2VzCi1Ac2VjdGlvbiBTdGFuZGFyZHMgZm9yIENvbW1hbmQgTGluZSBJbnRlcmZhY2VzCi0KLVBsZWFzZSBkb24ndCBtYWtlIHRoZSBiZWhhdmlvciBvZiBhIHV0aWxpdHkgZGVwZW5kIG9uIHRoZSBuYW1lIHVzZWQKLXRvIGludm9rZSBpdC4gIEl0IGlzIHVzZWZ1bCBzb21ldGltZXMgdG8gbWFrZSBhIGxpbmsgdG8gYSB1dGlsaXR5Ci13aXRoIGEgZGlmZmVyZW50IG5hbWUsIGFuZCB0aGF0IHNob3VsZCBub3QgY2hhbmdlIHdoYXQgaXQgZG9lcy4KLQotSW5zdGVhZCwgdXNlIGEgcnVuIHRpbWUgb3B0aW9uIG9yIGEgY29tcGlsYXRpb24gc3dpdGNoIG9yIGJvdGgKLXRvIHNlbGVjdCBhbW9uZyB0aGUgYWx0ZXJuYXRlIGJlaGF2aW9ycy4KLQotTGlrZXdpc2UsIHBsZWFzZSBkb24ndCBtYWtlIHRoZSBiZWhhdmlvciBvZiB0aGUgcHJvZ3JhbSBkZXBlbmQgb24gdGhlCi10eXBlIG9mIG91dHB1dCBkZXZpY2UgaXQgaXMgdXNlZCB3aXRoLiAgRGV2aWNlIGluZGVwZW5kZW5jZSBpcyBhbgotaW1wb3J0YW50IHByaW5jaXBsZSBvZiB0aGUgc3lzdGVtJ3MgZGVzaWduOyBkbyBub3QgY29tcHJvbWlzZSBpdAotbWVyZWx5IHRvIHNhdmUgc29tZW9uZSBmcm9tIHR5cGluZyBhbiBvcHRpb24gbm93IGFuZCB0aGVuLgotCi1JZiB5b3UgdGhpbmsgb25lIGJlaGF2aW9yIGlzIG1vc3QgdXNlZnVsIHdoZW4gdGhlIG91dHB1dCBpcyB0byBhCi10ZXJtaW5hbCwgYW5kIGFub3RoZXIgaXMgbW9zdCB1c2VmdWwgd2hlbiB0aGUgb3V0cHV0IGlzIGEgZmlsZSBvciBhCi1waXBlLCB0aGVuIGl0IGlzIHVzdWFsbHkgYmVzdCB0byBtYWtlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHRoZSBvbmUgdGhhdAotaXMgdXNlZnVsIHdpdGggb3V0cHV0IHRvIGEgdGVybWluYWwsIGFuZCBoYXZlIGFuIG9wdGlvbiBmb3IgdGhlIG90aGVyCi1iZWhhdmlvci4KLQotQ29tcGF0aWJpbGl0eSByZXF1aXJlcyBjZXJ0YWluIHByb2dyYW1zIHRvIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiBvdXRwdXQKLWRldmljZS4gIEl0IHdvdWxkIGJlIGRpc2FzdHJvdXMgaWYgQGNvZGV7bHN9IG9yIEBjb2Rle3NofSBkaWQgbm90IGRvIHNvCi1pbiB0aGUgd2F5IGFsbCB1c2VycyBleHBlY3QuICBJbiBzb21lIG9mIHRoZXNlIGNhc2VzLCB3ZSBzdXBwbGVtZW50IHRoZQotcHJvZ3JhbSB3aXRoIGEgcHJlZmVycmVkIGFsdGVybmF0ZSB2ZXJzaW9uIHRoYXQgZG9lcyBub3QgZGVwZW5kIG9uIHRoZQotb3V0cHV0IGRldmljZSB0eXBlLiAgRm9yIGV4YW1wbGUsIHdlIHByb3ZpZGUgYSBAY29kZXtkaXJ9IHByb2dyYW0gbXVjaAotbGlrZSBAY29kZXtsc30gZXhjZXB0IHRoYXQgaXRzIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCBpcyBhbHdheXMKLW11bHRpLWNvbHVtbiBmb3JtYXQuCi0KLUl0IGlzIGEgZ29vZCBpZGVhIHRvIGZvbGxvdyB0aGUgQHNje1BPU0lYfSBndWlkZWxpbmVzIGZvciB0aGUKLWNvbW1hbmQtbGluZSBvcHRpb25zIG9mIGEgcHJvZ3JhbS4gIFRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGlzIGlzIHRvIHVzZQotQGNvZGV7Z2V0b3B0fSB0byBwYXJzZSB0aGVtLiAgTm90ZSB0aGF0IHRoZSBHTlUgdmVyc2lvbiBvZiBAY29kZXtnZXRvcHR9Ci13aWxsIG5vcm1hbGx5IHBlcm1pdCBvcHRpb25zIGFueXdoZXJlIGFtb25nIHRoZSBhcmd1bWVudHMgdW5sZXNzIHRoZQotc3BlY2lhbCBhcmd1bWVudCBAc2FtcHstLX0gaXMgdXNlZC4gIFRoaXMgaXMgbm90IHdoYXQgQHNje1BPU0lYfQotc3BlY2lmaWVzOyBpdCBpcyBhIEdOVSBleHRlbnNpb24uCi0KLVBsZWFzZSBkZWZpbmUgbG9uZy1uYW1lZCBvcHRpb25zIHRoYXQgYXJlIGVxdWl2YWxlbnQgdG8gdGhlCi1zaW5nbGUtbGV0dGVyIFVuaXgtc3R5bGUgb3B0aW9ucy4gIFdlIGhvcGUgdG8gbWFrZSBHTlUgbW9yZSB1c2VyCi1mcmllbmRseSB0aGlzIHdheS4gIFRoaXMgaXMgZWFzeSB0byBkbyB3aXRoIHRoZSBHTlUgZnVuY3Rpb24KLUBjb2Rle2dldG9wdF9sb25nfS4KLQotT25lIG9mIHRoZSBhZHZhbnRhZ2VzIG9mIGxvbmctbmFtZWQgb3B0aW9ucyBpcyB0aGF0IHRoZXkgY2FuIGJlCi1jb25zaXN0ZW50IGZyb20gcHJvZ3JhbSB0byBwcm9ncmFtLiAgRm9yIGV4YW1wbGUsIHVzZXJzIHNob3VsZCBiZSBhYmxlCi10byBleHBlY3QgdGhlIGBgdmVyYm9zZScnIG9wdGlvbiBvZiBhbnkgR05VIHByb2dyYW0gd2hpY2ggaGFzIG9uZSwgdG8gYmUKLXNwZWxsZWQgcHJlY2lzZWx5IEBzYW1wey0tdmVyYm9zZX0uICBUbyBhY2hpZXZlIHRoaXMgdW5pZm9ybWl0eSwgbG9vayBhdAotdGhlIHRhYmxlIG9mIGNvbW1vbiBsb25nLW9wdGlvbiBuYW1lcyB3aGVuIHlvdSBjaG9vc2UgdGhlIG9wdGlvbiBuYW1lcwotZm9yIHlvdXIgcHJvZ3JhbSAoQHB4cmVme09wdGlvbiBUYWJsZX0pLgotCi1JdCBpcyB1c3VhbGx5IGEgZ29vZCBpZGVhIGZvciBmaWxlIG5hbWVzIGdpdmVuIGFzIG9yZGluYXJ5IGFyZ3VtZW50cyB0bwotYmUgaW5wdXQgZmlsZXMgb25seTsgYW55IG91dHB1dCBmaWxlcyB3b3VsZCBiZSBzcGVjaWZpZWQgdXNpbmcgb3B0aW9ucwotKHByZWZlcmFibHkgQHNhbXB7LW99IG9yIEBzYW1wey0tb3V0cHV0fSkuICBFdmVuIGlmIHlvdSBhbGxvdyBhbiBvdXRwdXQKLWZpbGUgbmFtZSBhcyBhbiBvcmRpbmFyeSBhcmd1bWVudCBmb3IgY29tcGF0aWJpbGl0eSwgdHJ5IHRvIHByb3ZpZGUgYW4KLW9wdGlvbiBhcyBhbm90aGVyIHdheSB0byBzcGVjaWZ5IGl0LiAgVGhpcyB3aWxsIGxlYWQgdG8gbW9yZSBjb25zaXN0ZW5jeQotYW1vbmcgR05VIHV0aWxpdGllcywgYW5kIGZld2VyIGlkaW9zeW5jcmFjaWVzIGZvciB1c2VycyB0byByZW1lbWJlci4KLQotQWxsIHByb2dyYW1zIHNob3VsZCBzdXBwb3J0IHR3byBzdGFuZGFyZCBvcHRpb25zOiBAc2FtcHstLXZlcnNpb259Ci1hbmQgQHNhbXB7LS1oZWxwfS4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtLXZlcnNpb24KLVRoaXMgb3B0aW9uIHNob3VsZCBkaXJlY3QgdGhlIHByb2dyYW0gdG8gaW5mb3JtYXRpb24gYWJvdXQgaXRzIG5hbWUsCi12ZXJzaW9uLCBvcmlnaW4gYW5kIGxlZ2FsIHN0YXR1cywgYWxsIG9uIHN0YW5kYXJkIG91dHB1dCwgYW5kIHRoZW4gZXhpdAotc3VjY2Vzc2Z1bGx5LiAgT3RoZXIgb3B0aW9ucyBhbmQgYXJndW1lbnRzIHNob3VsZCBiZSBpZ25vcmVkIG9uY2UgdGhpcwotaXMgc2VlbiwgYW5kIHRoZSBwcm9ncmFtIHNob3VsZCBub3QgcGVyZm9ybSBpdHMgbm9ybWFsIGZ1bmN0aW9uLgotCi1UaGUgZmlyc3QgbGluZSBpcyBtZWFudCB0byBiZSBlYXN5IGZvciBhIHByb2dyYW0gdG8gcGFyc2U7IHRoZSB2ZXJzaW9uCi1udW1iZXIgcHJvcGVyIHN0YXJ0cyBhZnRlciB0aGUgbGFzdCBzcGFjZS4gIEluIGFkZGl0aW9uLCBpdCBjb250YWlucwotdGhlIGNhbm9uaWNhbCBuYW1lIGZvciB0aGlzIHByb2dyYW0sIGluIHRoaXMgZm9ybWF0OgotCi1AZXhhbXBsZQotR05VIEVtYWNzIDE5LjMwCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGUgcHJvZ3JhbSdzIG5hbWUgc2hvdWxkIGJlIGEgY29uc3RhbnQgc3RyaW5nOyBAZW1waHtkb24ndH0gY29tcHV0ZSBpdAotZnJvbSBAY29kZXthcmd2WzBdfS4gIFRoZSBpZGVhIGlzIHRvIHN0YXRlIHRoZSBzdGFuZGFyZCBvciBjYW5vbmljYWwKLW5hbWUgZm9yIHRoZSBwcm9ncmFtLCBub3QgaXRzIGZpbGUgbmFtZS4gIFRoZXJlIGFyZSBvdGhlciB3YXlzIHRvIGZpbmQKLW91dCB0aGUgcHJlY2lzZSBmaWxlIG5hbWUgd2hlcmUgYSBjb21tYW5kIGlzIGZvdW5kIGluIEBjb2Rle1BBVEh9LgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBhIHN1YnNpZGlhcnkgcGFydCBvZiBhIGxhcmdlciBwYWNrYWdlLCBtZW50aW9uIHRoZQotcGFja2FnZSBuYW1lIGluIHBhcmVudGhlc2VzLCBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1lbWFjc3NlcnZlciAoR05VIEVtYWNzKSAxOS4zMAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotSWYgdGhlIHBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgd2hpY2ggaXMgZGlmZmVyZW50IGZyb20gdGhpcwotcHJvZ3JhbSdzIHZlcnNpb24gbnVtYmVyLCB5b3UgY2FuIG1lbnRpb24gdGhlIHBhY2thZ2UgdmVyc2lvbiBudW1iZXIKLWp1c3QgYmVmb3JlIHRoZSBjbG9zZS1wYXJlbnRoZXNpcy4KLQotSWYgeW91IEBzdHJvbmd7bmVlZH0gdG8gbWVudGlvbiB0aGUgdmVyc2lvbiBudW1iZXJzIG9mIGxpYnJhcmllcyB3aGljaAotYXJlIGRpc3RyaWJ1dGVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgcGFja2FnZSB3aGljaCBjb250YWlucyB0aGlzIHByb2dyYW0sCi15b3UgY2FuIGRvIHNvIGJ5IHByaW50aW5nIGFuIGFkZGl0aW9uYWwgbGluZSBvZiB2ZXJzaW9uIGluZm8gZm9yIGVhY2gKLWxpYnJhcnkgeW91IHdhbnQgdG8gbWVudGlvbi4gIFVzZSB0aGUgc2FtZSBmb3JtYXQgZm9yIHRoZXNlIGxpbmVzIGFzIGZvcgotdGhlIGZpcnN0IGxpbmUuCi0KLVBsZWFzZSBkbyBub3QgbWVudGlvbiBhbGwgb2YgdGhlIGxpYnJhcmllcyB0aGF0IHRoZSBwcm9ncmFtIHVzZXMgYGBqdXN0Ci1mb3IgY29tcGxldGVuZXNzJyctLS10aGF0IHdvdWxkIHByb2R1Y2UgYSBsb3Qgb2YgdW5oZWxwZnVsIGNsdXR0ZXIuCi1QbGVhc2UgbWVudGlvbiBsaWJyYXJ5IHZlcnNpb24gbnVtYmVycyBvbmx5IGlmIHlvdSBmaW5kIGluIHByYWN0aWNlIHRoYXQKLXRoZXkgYXJlIHZlcnkgaW1wb3J0YW50IHRvIHlvdSBpbiBkZWJ1Z2dpbmcuCi0KLVRoZSBmb2xsb3dpbmcgbGluZSwgYWZ0ZXIgdGhlIHZlcnNpb24gbnVtYmVyIGxpbmUgb3IgbGluZXMsIHNob3VsZCBiZSBhCi1jb3B5cmlnaHQgbm90aWNlLiAgSWYgbW9yZSB0aGFuIG9uZSBjb3B5cmlnaHQgbm90aWNlIGlzIGNhbGxlZCBmb3IsIHB1dAotZWFjaCBvbiBhIHNlcGFyYXRlIGxpbmUuCi0KLU5leHQgc2hvdWxkIGZvbGxvdyBhIGJyaWVmIHN0YXRlbWVudCB0aGF0IHRoZSBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmUsCi1hbmQgdGhhdCB1c2VycyBhcmUgZnJlZSB0byBjb3B5IGFuZCBjaGFuZ2UgaXQgb24gY2VydGFpbiBjb25kaXRpb25zLiAgSWYKLXRoZSBwcm9ncmFtIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBHUEwsIHNheSBzbyBoZXJlLiAgQWxzbyBtZW50aW9uIHRoYXQKLXRoZXJlIGlzIG5vIHdhcnJhbnR5LCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuCi0KLUl0IGlzIG9rIHRvIGZpbmlzaCB0aGUgb3V0cHV0IHdpdGggYSBsaXN0IG9mIHRoZSBtYWpvciBhdXRob3JzIG9mIHRoZQotcHJvZ3JhbSwgYXMgYSB3YXkgb2YgZ2l2aW5nIGNyZWRpdC4KLQotSGVyZSdzIGFuIGV4YW1wbGUgb2Ygb3V0cHV0IHRoYXQgZm9sbG93cyB0aGVzZSBydWxlczoKLQotQHNtYWxsZXhhbXBsZQotR05VIEVtYWNzIDE5LjM0LjUKLUNvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUdOVSBFbWFjcyBjb21lcyB3aXRoIE5PIFdBUlJBTlRZLAotdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3LgotWW91IG1heSByZWRpc3RyaWJ1dGUgY29waWVzIG9mIEdOVSBFbWFjcwotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLUZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZXNlIG1hdHRlcnMsCi1zZWUgdGhlIGZpbGVzIG5hbWVkIENPUFlJTkcuCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Zb3Ugc2hvdWxkIGFkYXB0IHRoaXMgdG8geW91ciBwcm9ncmFtLCBvZiBjb3Vyc2UsIGZpbGxpbmcgaW4gdGhlIHByb3BlcgoteWVhciwgY29weXJpZ2h0IGhvbGRlciwgbmFtZSBvZiBwcm9ncmFtLCBhbmQgdGhlIHJlZmVyZW5jZXMgdG8KLWRpc3RyaWJ1dGlvbiB0ZXJtcywgYW5kIGNoYW5naW5nIHRoZSByZXN0IG9mIHRoZSB3b3JkaW5nIGFzIG5lY2Vzc2FyeS4KLQotVGhpcyBjb3B5cmlnaHQgbm90aWNlIG9ubHkgbmVlZHMgdG8gbWVudGlvbiB0aGUgbW9zdCByZWNlbnQgeWVhciBpbgotd2hpY2ggY2hhbmdlcyB3ZXJlIG1hZGUtLS10aGVyZSdzIG5vIG5lZWQgdG8gbGlzdCB0aGUgeWVhcnMgZm9yIHByZXZpb3VzCi12ZXJzaW9ucycgY2hhbmdlcy4gIFlvdSBkb24ndCBoYXZlIHRvIG1lbnRpb24gdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gaW4KLXRoZXNlIG5vdGljZXMsIGlmIHRoYXQgaXMgaW5jb252ZW5pZW50LCBzaW5jZSBpdCBhcHBlYXJlZCBpbiB0aGUgZmlyc3QKLWxpbmUuCi0KLUBpdGVtIC0taGVscAotVGhpcyBvcHRpb24gc2hvdWxkIG91dHB1dCBicmllZiBkb2N1bWVudGF0aW9uIGZvciBob3cgdG8gaW52b2tlIHRoZQotcHJvZ3JhbSwgb24gc3RhbmRhcmQgb3V0cHV0LCB0aGVuIGV4aXQgc3VjY2Vzc2Z1bGx5LiAgT3RoZXIgb3B0aW9ucyBhbmQKLWFyZ3VtZW50cyBzaG91bGQgYmUgaWdub3JlZCBvbmNlIHRoaXMgaXMgc2VlbiwgYW5kIHRoZSBwcm9ncmFtIHNob3VsZAotbm90IHBlcmZvcm0gaXRzIG5vcm1hbCBmdW5jdGlvbi4KLQotTmVhciB0aGUgZW5kIG9mIHRoZSBAc2FtcHstLWhlbHB9IG9wdGlvbidzIG91dHB1dCB0aGVyZSBzaG91bGQgYmUgYSBsaW5lCi10aGF0IHNheXMgd2hlcmUgdG8gbWFpbCBidWcgcmVwb3J0cy4gIEl0IHNob3VsZCBoYXZlIHRoaXMgZm9ybWF0OgotCi1AZXhhbXBsZQotUmVwb3J0IGJ1Z3MgdG8gQHZhcnttYWlsaW5nLWFkZHJlc3N9LgotQGVuZCBleGFtcGxlCi1AZW5kIHRhYmxlCi0KLUBub2RlIE9wdGlvbiBUYWJsZQotQHNlY3Rpb24gVGFibGUgb2YgTG9uZyBPcHRpb25zCi0KLUhlcmUgaXMgYSB0YWJsZSBvZiBsb25nIG9wdGlvbnMgdXNlZCBieSBHTlUgcHJvZ3JhbXMuICBJdCBpcyBzdXJlbHkKLWluY29tcGxldGUsIGJ1dCB3ZSBhaW0gdG8gbGlzdCBhbGwgdGhlIG9wdGlvbnMgdGhhdCBhIG5ldyBwcm9ncmFtIG1pZ2h0Ci13YW50IHRvIGJlIGNvbXBhdGlibGUgd2l0aC4gIElmIHlvdSB1c2UgbmFtZXMgbm90IGFscmVhZHkgaW4gdGhlIHRhYmxlLAotcGxlYXNlIHNlbmQgQGVtYWlse2dudUBAZ251Lm9yZ30gYSBsaXN0IG9mIHRoZW0sIHdpdGggdGhlaXIKLW1lYW5pbmdzLCBzbyB3ZSBjYW4gdXBkYXRlIHRoZSB0YWJsZS4KLQotQGMgUGxlYXNlIGxlYXZlIG5ld2xpbmVzIGJldHdlZW4gaXRlbXMgaW4gdGhpcyB0YWJsZTsgaXQncyBtdWNoIGVhc2llcgotQGMgdG8gdXBkYXRlIHdoZW4gaXQgaXNuJ3QgY29tcGxldGVseSBzcXVhc2hlZCB0b2dldGhlciBhbmQgdW5yZWFkYWJsZS4KLUBjIFdoZW4gdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBzaG9ydCBvcHRpb24gZm9yIGEgbG9uZyBvcHRpb24gbmFtZSwgcHV0Ci1AYyBhIHNlbWljb2xvbiBiZXR3ZWVuIHRoZSBsaXN0cyBvZiB0aGUgcHJvZ3JhbXMgdGhhdCB1c2UgdGhlbSwgbm90IGEKLUBjIHBlcmlvZC4gICAtLWZyaWVkbWFuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gYWZ0ZXItZGF0ZQotQHNhbXB7LU59IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGFsbAotQHNhbXB7LWF9IGluIEBjb2Rle2R1fSwgQGNvZGV7bHN9LCBAY29kZXtubX0sIEBjb2Rle3N0dHl9LCBAY29kZXt1bmFtZX0sCi1hbmQgQGNvZGV7dW5leHBhbmR9LgotCi1AaXRlbSBhbGwtdGV4dAotQHNhbXB7LWF9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBhbG1vc3QtYWxsCi1Ac2FtcHstQX0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBhcHBlbmQKLUBzYW1wey1hfSBpbiBAY29kZXtldGFnc30sIEBjb2Rle3RlZX0sIEBjb2Rle3RpbWV9OwotQHNhbXB7LXJ9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGFyY2hpdmUKLUBzYW1wey1hfSBpbiBAY29kZXtjcH0uCi0KLUBpdGVtIGFyY2hpdmUtbmFtZQotQHNhbXB7LW59IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBhcmdsZW5ndGgKLUBzYW1wey1sfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIGFzY2lpCi1Ac2FtcHstYX0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGFzc2lnbgotQHNhbXB7LXZ9IGluIEBjb2Rle2dhd2t9LgotCi1AaXRlbSBhc3N1bWUtbmV3Ci1Ac2FtcHstV30gaW4gTWFrZS4KLQotQGl0ZW0gYXNzdW1lLW9sZAotQHNhbXB7LW99IGluIE1ha2UuCi0KLUBpdGVtIGF1dG8tY2hlY2sKLUBzYW1wey1hfSBpbiBAY29kZXtyZWNvZGV9LgotCi1AaXRlbSBhdXRvLXBhZ2VyCi1Ac2FtcHstYX0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBhdXRvLXJlZmVyZW5jZQotQHNhbXB7LUF9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIGF2b2lkLXdyYXBzCi1Ac2FtcHstbn0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBiYWNrd2FyZC1zZWFyY2gKLUBzYW1wey1CfSBpbiBAY29kZXtjdGFnc30uCi0KLUBpdGVtIGJhc2VuYW1lCi1Ac2FtcHstZn0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGJhdGNoCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gYmF1ZAotVXNlZCBpbiBHREIuCi0KLUBpdGVtIGJlZm9yZQotQHNhbXB7LWJ9IGluIEBjb2Rle3RhY30uCi0KLUBpdGVtIGJpbmFyeQotQHNhbXB7LWJ9IGluIEBjb2Rle2NwaW99IGFuZCBAY29kZXtkaWZmfS4KLQotQGl0ZW0gYml0cy1wZXItY29kZQotQHNhbXB7LWJ9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBibG9jay1zaXplCi1Vc2VkIGluIEBjb2Rle2NwaW99IGFuZCBAY29kZXt0YXJ9LgotCi1AaXRlbSBibG9ja3MKLUBzYW1wey1ifSBpbiBAY29kZXtoZWFkfSBhbmQgQGNvZGV7dGFpbH0uCi0KLUBpdGVtIGJyZWFrLWZpbGUKLUBzYW1wey1ifSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSBicmllZgotVXNlZCBpbiB2YXJpb3VzIHByb2dyYW1zIHRvIG1ha2Ugb3V0cHV0IHNob3J0ZXIuCi0KLUBpdGVtIGJ5dGVzCi1Ac2FtcHstY30gaW4gQGNvZGV7aGVhZH0sIEBjb2Rle3NwbGl0fSwgYW5kIEBjb2Rle3RhaWx9LgotCi1AaXRlbSBjQHR7Kyt9Ci1Ac2FtcHstQ30gaW4gQGNvZGV7ZXRhZ3N9LgotCi1AaXRlbSBjYXRlbmF0ZQotQHNhbXB7LUF9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGNkCi1Vc2VkIGluIHZhcmlvdXMgcHJvZ3JhbXMgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHRvIHVzZS4KLQotQGl0ZW0gY2hhbmdlcwotQHNhbXB7LWN9IGluIEBjb2Rle2NoZ3JwfSBhbmQgQGNvZGV7Y2hvd259LgotCi1AaXRlbSBjbGFzc2lmeQotQHNhbXB7LUZ9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gY29sb25zCi1Ac2FtcHstY30gaW4gQGNvZGV7cmVjb2RlfS4KLQotQGl0ZW0gY29tbWFuZAotQHNhbXB7LWN9IGluIEBjb2Rle3N1fTsKLUBzYW1wey14fSBpbiBHREIuCi0KLUBpdGVtIGNvbXBhcmUKLUBzYW1wey1kfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBjb21wYXQKLVVzZWQgaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIGNvbXByZXNzCi1Ac2FtcHstWn0gaW4gQGNvZGV7dGFyfSBhbmQgQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGNvbmNhdGVuYXRlCi1Ac2FtcHstQX0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gY29uZmlybWF0aW9uCi1Ac2FtcHstd30gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gY29udGV4dAotVXNlZCBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gY29weWxlZnQKLUBzYW1wey1XIGNvcHlsZWZ0fSBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gY29weXJpZ2h0Ci1Ac2FtcHstQ30gaW4gQGNvZGV7cHR4fSwgQGNvZGV7cmVjb2RlfSwgYW5kIEBjb2Rle3dkaWZmfTsKLUBzYW1wey1XIGNvcHlyaWdodH0gaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIGNvcmUKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSBjb3VudAotQHNhbXB7LXF9IGluIEBjb2Rle3dob30uCi0KLUBpdGVtIGNvdW50LWxpbmtzCi1Ac2FtcHstbH0gaW4gQGNvZGV7ZHV9LgotCi1AaXRlbSBjcmVhdGUKLVVzZWQgaW4gQGNvZGV7dGFyfSBhbmQgQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIGN1dC1tYXJrCi1Ac2FtcHstY30gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGN4cmVmCi1Ac2FtcHsteH0gaW4gQGNvZGV7Y3RhZ3N9LgotCi1AaXRlbSBkYXRlCi1Ac2FtcHstZH0gaW4gQGNvZGV7dG91Y2h9LgotCi1AaXRlbSBkZWJ1ZwotQHNhbXB7LWR9IGluIE1ha2UgYW5kIEBjb2Rle200fTsKLUBzYW1wey10fSBpbiBCaXNvbi4KLQotQGl0ZW0gZGVmaW5lCi1Ac2FtcHstRH0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBkZWZpbmVzCi1Ac2FtcHstZH0gaW4gQmlzb24gYW5kIEBjb2Rle2N0YWdzfS4KLQotQGl0ZW0gZGVsZXRlCi1Ac2FtcHstRH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gZGVyZWZlcmVuY2UKLUBzYW1wey1MfSBpbiBAY29kZXtjaGdycH0sIEBjb2Rle2Nob3dufSwgQGNvZGV7Y3Bpb30sIEBjb2Rle2R1fSwKLUBjb2Rle2xzfSwgYW5kIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGRlcmVmZXJlbmNlLWFyZ3MKLUBzYW1wey1EfSBpbiBAY29kZXtkdX0uCi0KLUBpdGVtIGRpYWNyaXRpY3MKLUBzYW1wey1kfSBpbiBAY29kZXtyZWNvZGV9LgotCi1AaXRlbSBkaWN0aW9uYXJ5LW9yZGVyCi1Ac2FtcHstZH0gaW4gQGNvZGV7bG9va30uCi0KLUBpdGVtIGRpZmYKLUBzYW1wey1kfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBkaWdpdHMKLUBzYW1wey1ufSBpbiBAY29kZXtjc3BsaXR9LgotCi1AaXRlbSBkaXJlY3RvcnkKLVNwZWNpZnkgdGhlIGRpcmVjdG9yeSB0byB1c2UsIGluIHZhcmlvdXMgcHJvZ3JhbXMuICBJbiBAY29kZXtsc30sIGl0Ci1tZWFucyB0byBzaG93IGRpcmVjdG9yaWVzIHRoZW1zZWx2ZXMgcmF0aGVyIHRoYW4gdGhlaXIgY29udGVudHMuICBJbgotQGNvZGV7cm19IGFuZCBAY29kZXtsbn0sIGl0IG1lYW5zIHRvIG5vdCB0cmVhdCBsaW5rcyB0byBkaXJlY3Rvcmllcwotc3BlY2lhbGx5LgotCi1AaXRlbSBkaXNjYXJkLWFsbAotQHNhbXB7LXh9IGluIEBjb2Rle3N0cmlwfS4KLQotQGl0ZW0gZGlzY2FyZC1sb2NhbHMKLUBzYW1wey1YfSBpbiBAY29kZXtzdHJpcH0uCi0KLUBpdGVtIGRyeS1ydW4KLUBzYW1wey1ufSBpbiBNYWtlLgotCi1AaXRlbSBlZAotQHNhbXB7LWV9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBlbGlkZS1lbXB0eS1maWxlcwotQHNhbXB7LXp9IGluIEBjb2Rle2NzcGxpdH0uCi0KLUBpdGVtIGVuZC1kZWxldGUKLUBzYW1wey14fSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIGVuZC1pbnNlcnQKLUBzYW1wey16fSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIGVudGlyZS1uZXctZmlsZQotQHNhbXB7LU59IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBlbnZpcm9ubWVudC1vdmVycmlkZXMKLUBzYW1wey1lfSBpbiBNYWtlLgotCi1AaXRlbSBlb2YKLUBzYW1wey1lfSBpbiBAY29kZXt4YXJnc30uCi0KLUBpdGVtIGVwb2NoCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gZXJyb3ItbGltaXQKLVVzZWQgaW4gQGNvZGV7bWFrZWluZm99LgotCi1AaXRlbSBlcnJvci1vdXRwdXQKLUBzYW1wey1vfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIGVzY2FwZQotQHNhbXB7LWJ9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gZXhjbHVkZS1mcm9tCi1Ac2FtcHstWH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gZXhlYwotVXNlZCBpbiBHREIuCi0KLUBpdGVtIGV4aXQKLUBzYW1wey14fSBpbiBAY29kZXt4YXJnc30uCi0KLUBpdGVtIGV4aXQtMAotQHNhbXB7LWV9IGluIEBjb2Rle3Vuc2hhcn0uCi0KLUBpdGVtIGV4cGFuZC10YWJzCi1Ac2FtcHstdH0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGV4cHJlc3Npb24KLUBzYW1wey1lfSBpbiBAY29kZXtzZWR9LgotCi1AaXRlbSBleHRlcm4tb25seQotQHNhbXB7LWd9IGluIEBjb2Rle25tfS4KLQotQGl0ZW0gZXh0cmFjdAotQHNhbXB7LWl9IGluIEBjb2Rle2NwaW99OwotQHNhbXB7LXh9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGZhY2VzCi1Ac2FtcHstZn0gaW4gQGNvZGV7ZmluZ2VyfS4KLQotQGl0ZW0gZmFzdAotQHNhbXB7LWZ9IGluIEBjb2Rle3N1fS4KLQotQGl0ZW0gZmF0YWwtd2FybmluZ3MKLUBzYW1wey1FfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIGZpbGUKLUBzYW1wey1mfSBpbiBAY29kZXtpbmZvfSwgQGNvZGV7Z2F3a30sIE1ha2UsIEBjb2Rle210fSwgYW5kIEBjb2Rle3Rhcn07Ci1Ac2FtcHstbn0gaW4gQGNvZGV7c2VkfTsKLUBzYW1wey1yfSBpbiBAY29kZXt0b3VjaH0uCi0KLUBpdGVtIGZpZWxkLXNlcGFyYXRvcgotQHNhbXB7LUZ9IGluIEBjb2Rle2dhd2t9LgotCi1AaXRlbSBmaWxlLXByZWZpeAotQHNhbXB7LWJ9IGluIEJpc29uLgotCi1AaXRlbSBmaWxlLXR5cGUKLUBzYW1wey1GfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIGZpbGVzLWZyb20KLUBzYW1wey1UfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBmaWxsLWNvbHVtbgotVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCi0KLUBpdGVtIGZsYWctdHJ1bmNhdGlvbgotQHNhbXB7LUZ9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIGZpeGVkLW91dHB1dC1maWxlcwotQHNhbXB7LXl9IGluIEJpc29uLgotCi1AaXRlbSBmb2xsb3cKLUBzYW1wey1mfSBpbiBAY29kZXt0YWlsfS4KLQotQGl0ZW0gZm9vdG5vdGUtc3R5bGUKLVVzZWQgaW4gQGNvZGV7bWFrZWluZm99LgotCi1AaXRlbSBmb3JjZQotQHNhbXB7LWZ9IGluIEBjb2Rle2NwfSwgQGNvZGV7bG59LCBAY29kZXttdn0sIGFuZCBAY29kZXtybX0uCi0KLUBpdGVtIGZvcmNlLXByZWZpeAotQHNhbXB7LUZ9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBmb3JtYXQKLVVzZWQgaW4gQGNvZGV7bHN9LCBAY29kZXt0aW1lfSwgYW5kIEBjb2Rle3B0eH0uCi0KLUBpdGVtIGZyZWV6ZS1zdGF0ZQotQHNhbXB7LUZ9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gZnVsbG5hbWUKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSBnYXAtc2l6ZQotQHNhbXB7LWd9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIGdldAotQHNhbXB7LXh9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGdyYXBoaWMKLUBzYW1wey1pfSBpbiBAY29kZXt1bH0uCi0KLUBpdGVtIGdyYXBoaWNzCi1Ac2FtcHstZ30gaW4gQGNvZGV7cmVjb2RlfS4KLQotQGl0ZW0gZ3JvdXAKLUBzYW1wey1nfSBpbiBAY29kZXtpbnN0YWxsfS4KLQotQGl0ZW0gZ3ppcAotQHNhbXB7LXp9IGluIEBjb2Rle3Rhcn0gYW5kIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBoYXNoc2l6ZQotQHNhbXB7LUh9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gaGVhZGVyCi1Ac2FtcHstaH0gaW4gQGNvZGV7b2JqZHVtcH0gYW5kIEBjb2Rle3JlY29kZX0KLQotQGl0ZW0gaGVhZGluZwotQHNhbXB7LUh9IGluIEBjb2Rle3dob30uCi0KLUBpdGVtIGhlbHAKLVVzZWQgdG8gYXNrIGZvciBicmllZiB1c2FnZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gaGVyZS1kZWxpbWl0ZXIKLUBzYW1wey1kfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gaGlkZS1jb250cm9sLWNoYXJzCi1Ac2FtcHstcX0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBpZGxlCi1Ac2FtcHstdX0gaW4gQGNvZGV7d2hvfS4KLQotQGl0ZW0gaWZkZWYKLUBzYW1wey1EfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gaWdub3JlCi1Ac2FtcHstSX0gaW4gQGNvZGV7bHN9OwotQHNhbXB7LXh9IGluIEBjb2Rle3JlY29kZX0uCi0KLUBpdGVtIGlnbm9yZS1hbGwtc3BhY2UKLUBzYW1wey13fSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gaWdub3JlLWJhY2t1cHMKLUBzYW1wey1CfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIGlnbm9yZS1ibGFuay1saW5lcwotQHNhbXB7LUJ9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBpZ25vcmUtY2FzZQotQHNhbXB7LWZ9IGluIEBjb2Rle2xvb2t9IGFuZCBAY29kZXtwdHh9OwotQHNhbXB7LWl9IGluIEBjb2Rle2RpZmZ9IGFuZCBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIGlnbm9yZS1lcnJvcnMKLUBzYW1wey1pfSBpbiBNYWtlLgotCi1AaXRlbSBpZ25vcmUtZmlsZQotQHNhbXB7LWl9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIGlnbm9yZS1pbmRlbnRhdGlvbgotQHNhbXB7LUl9IGluIEBjb2Rle2V0YWdzfS4KLQotQGl0ZW0gaWdub3JlLWluaXQtZmlsZQotQHNhbXB7LWZ9IGluIE9sZW8uCi0KLUBpdGVtIGlnbm9yZS1pbnRlcnJ1cHRzCi1Ac2FtcHstaX0gaW4gQGNvZGV7dGVlfS4KLQotQGl0ZW0gaWdub3JlLW1hdGNoaW5nLWxpbmVzCi1Ac2FtcHstSX0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGlnbm9yZS1zcGFjZS1jaGFuZ2UKLUBzYW1wey1ifSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gaWdub3JlLXplcm9zCi1Ac2FtcHstaX0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gaW5jbHVkZQotQHNhbXB7LWl9IGluIEBjb2Rle2V0YWdzfTsKLUBzYW1wey1JfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIGluY2x1ZGUtZGlyCi1Ac2FtcHstSX0gaW4gTWFrZS4KLQotQGl0ZW0gaW5jcmVtZW50YWwKLUBzYW1wey1HfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBpbmZvCi1Ac2FtcHstaX0sIEBzYW1wey1sfSwgYW5kIEBzYW1wey1tfSBpbiBGaW5nZXIuCi0KLUBpdGVtIGluaXRpYWwKLUBzYW1wey1pfSBpbiBAY29kZXtleHBhbmR9LgotCi1AaXRlbSBpbml0aWFsLXRhYgotQHNhbXB7LVR9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBpbm9kZQotQHNhbXB7LWl9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gaW50ZXJhY3RpdmUKLUBzYW1wey1pfSBpbiBAY29kZXtjcH0sIEBjb2Rle2xufSwgQGNvZGV7bXZ9LCBAY29kZXtybX07Ci1Ac2FtcHstZX0gaW4gQGNvZGV7bTR9OwotQHNhbXB7LXB9IGluIEBjb2Rle3hhcmdzfTsKLUBzYW1wey13fSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBpbnRlcm1peC10eXBlCi1Ac2FtcHstcH0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGpvYnMKLUBzYW1wey1qfSBpbiBNYWtlLgotCi1AaXRlbSBqdXN0LXByaW50Ci1Ac2FtcHstbn0gaW4gTWFrZS4KLQotQGl0ZW0ga2VlcC1nb2luZwotQHNhbXB7LWt9IGluIE1ha2UuCi0KLUBpdGVtIGtlZXAtZmlsZXMKLUBzYW1wey1rfSBpbiBAY29kZXtjc3BsaXR9LgotCi1AaXRlbSBraWxvYnl0ZXMKLUBzYW1wey1rfSBpbiBAY29kZXtkdX0gYW5kIEBjb2Rle2xzfS4KLQotQGl0ZW0gbGFuZ3VhZ2UKLUBzYW1wey1sfSBpbiBAY29kZXtldGFnc30uCi0KLUBpdGVtIGxlc3MtbW9kZQotQHNhbXB7LWx9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gbGV2ZWwtZm9yLWd6aXAKLUBzYW1wey1nfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gbGluZS1ieXRlcwotQHNhbXB7LUN9IGluIEBjb2Rle3NwbGl0fS4KLQotQGl0ZW0gbGluZXMKLVVzZWQgaW4gQGNvZGV7c3BsaXR9LCBAY29kZXtoZWFkfSwgYW5kIEBjb2Rle3RhaWx9LgotCi1AaXRlbSBsaW5rCi1Ac2FtcHstbH0gaW4gQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIGxpbnQKLUBpdGVteCBsaW50LW9sZAotVXNlZCBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gbGlzdAotQHNhbXB7LXR9IGluIEBjb2Rle2NwaW99OwotQHNhbXB7LWx9IGluIEBjb2Rle3JlY29kZX0uCi0KLUBpdGVtIGxpc3QKLUBzYW1wey10fSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBsaXRlcmFsCi1Ac2FtcHstTn0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBsb2FkLWF2ZXJhZ2UKLUBzYW1wey1sfSBpbiBNYWtlLgotCi1AaXRlbSBsb2dpbgotVXNlZCBpbiBAY29kZXtzdX0uCi0KLUBpdGVtIG1hY2hpbmUKLU5vIGxpc3Rpbmcgb2Ygd2hpY2ggcHJvZ3JhbXMgYWxyZWFkeSB1c2UgdGhpczsKLXNvbWVvbmUgc2hvdWxkIGNoZWNrIHRvCi1zZWUgaWYgYW55IGFjdHVhbGx5IGRvLCBhbmQgdGVsbCBAZW1haWx7Z251QEBnbnUub3JnfS4KLQotQGl0ZW0gbWFjcm8tbmFtZQotQHNhbXB7LU19IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIG1haWwKLUBzYW1wey1tfSBpbiBAY29kZXtoZWxsb30gYW5kIEBjb2Rle3VuYW1lfS4KLQotQGl0ZW0gbWFrZS1kaXJlY3RvcmllcwotQHNhbXB7LWR9IGluIEBjb2Rle2NwaW99LgotCi1AaXRlbSBtYWtlZmlsZQotQHNhbXB7LWZ9IGluIE1ha2UuCi0KLUBpdGVtIG1hcHBlZAotVXNlZCBpbiBHREIuCi0KLUBpdGVtIG1heC1hcmdzCi1Ac2FtcHstbn0gaW4gQGNvZGV7eGFyZ3N9LgotCi1AaXRlbSBtYXgtY2hhcnMKLUBzYW1wey1ufSBpbiBAY29kZXt4YXJnc30uCi0KLUBpdGVtIG1heC1saW5lcwotQHNhbXB7LWx9IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gbWF4LWxvYWQKLUBzYW1wey1sfSBpbiBNYWtlLgotCi1AaXRlbSBtYXgtcHJvY3MKLUBzYW1wey1QfSBpbiBAY29kZXt4YXJnc30uCi0KLUBpdGVtIG1lc2cKLUBzYW1wey1UfSBpbiBAY29kZXt3aG99LgotCi1AaXRlbSBtZXNzYWdlCi1Ac2FtcHstVH0gaW4gQGNvZGV7d2hvfS4KLQotQGl0ZW0gbWluaW1hbAotQHNhbXB7LWR9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBtaXhlZC11dWVuY29kZQotQHNhbXB7LU19IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBtb2RlCi1Ac2FtcHstbX0gaW4gQGNvZGV7aW5zdGFsbH0sIEBjb2Rle21rZGlyfSwgYW5kIEBjb2Rle21rZmlmb30uCi0KLUBpdGVtIG1vZGlmaWNhdGlvbi10aW1lCi1Ac2FtcHstbX0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gbXVsdGktdm9sdW1lCi1Ac2FtcHstTX0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gbmFtZS1wcmVmaXgKLUBzYW1wey1hfSBpbiBCaXNvbi4KLQotQGl0ZW0gbmVzdGluZy1saW1pdAotQHNhbXB7LUx9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gbmV0LWhlYWRlcnMKLUBzYW1wey1hfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gbmV3LWZpbGUKLUBzYW1wey1XfSBpbiBNYWtlLgotCi1AaXRlbSBuby1idWlsdGluLXJ1bGVzCi1Ac2FtcHstcn0gaW4gTWFrZS4KLQotQGl0ZW0gbm8tY2hhcmFjdGVyLWNvdW50Ci1Ac2FtcHstd30gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIG5vLWNoZWNrLWV4aXN0aW5nCi1Ac2FtcHsteH0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIG5vLWNvbW1vbgotQHNhbXB7LTN9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gbm8tY3JlYXRlCi1Ac2FtcHstY30gaW4gQGNvZGV7dG91Y2h9LgotCi1AaXRlbSBuby1kZWZpbmVzCi1Ac2FtcHstRH0gaW4gQGNvZGV7ZXRhZ3N9LgotCi1AaXRlbSBuby1kZWxldGVkCi1Ac2FtcHstMX0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBuby1kZXJlZmVyZW5jZQotQHNhbXB7LWR9IGluIEBjb2Rle2NwfS4KLQotQGl0ZW0gbm8taW5zZXJ0ZWQKLUBzYW1wey0yfSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIG5vLWtlZXAtZ29pbmcKLUBzYW1wey1TfSBpbiBNYWtlLgotCi1AaXRlbSBuby1saW5lcwotQHNhbXB7LWx9IGluIEJpc29uLgotCi1AaXRlbSBuby1waXBpbmcKLUBzYW1wey1QfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gbm8tcHJvZgotQHNhbXB7LWV9IGluIEBjb2Rle2dwcm9mfS4KLQotQGl0ZW0gbm8tcmVnZXgKLUBzYW1wey1SfSBpbiBAY29kZXtldGFnc30uCi0KLUBpdGVtIG5vLXNvcnQKLUBzYW1wey1wfSBpbiBAY29kZXtubX0uCi0KLUBpdGVtIG5vLXNwbGl0Ci1Vc2VkIGluIEBjb2Rle21ha2VpbmZvfS4KLQotQGl0ZW0gbm8tc3RhdGljCi1Ac2FtcHstYX0gaW4gQGNvZGV7Z3Byb2Z9LgotCi1AaXRlbSBuby10aW1lCi1Ac2FtcHstRX0gaW4gQGNvZGV7Z3Byb2Z9LgotCi1AaXRlbSBuby10aW1lc3RhbXAKLUBzYW1wey1tfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gbm8tdmFsaWRhdGUKLVVzZWQgaW4gQGNvZGV7bWFrZWluZm99LgotCi1AaXRlbSBuby13YWl0Ci1Vc2VkIGluIEBjb2Rle2VtYWNzY2xpZW50fS4KLQotQGl0ZW0gbm8td2FybgotVXNlZCBpbiB2YXJpb3VzIHByb2dyYW1zIHRvIGluaGliaXQgd2FybmluZ3MuCi0KLUBpdGVtIG5vZGUKLUBzYW1wey1ufSBpbiBAY29kZXtpbmZvfS4KLQotQGl0ZW0gbm9kZW5hbWUKLUBzYW1wey1ufSBpbiBAY29kZXt1bmFtZX0uCi0KLUBpdGVtIG5vbm1hdGNoaW5nCi1Ac2FtcHstZn0gaW4gQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIG5zdHVmZgotQHNhbXB7LW59IGluIEBjb2Rle29iamR1bXB9LgotCi1AaXRlbSBudWxsCi1Ac2FtcHstMH0gaW4gQGNvZGV7eGFyZ3N9LgotCi1AaXRlbSBudW1iZXIKLUBzYW1wey1ufSBpbiBAY29kZXtjYXR9LgotCi1AaXRlbSBudW1iZXItbm9uYmxhbmsKLUBzYW1wey1ifSBpbiBAY29kZXtjYXR9LgotCi1AaXRlbSBudW1lcmljLXNvcnQKLUBzYW1wey1ufSBpbiBAY29kZXtubX0uCi0KLUBpdGVtIG51bWVyaWMtdWlkLWdpZAotQHNhbXB7LW59IGluIEBjb2Rle2NwaW99IGFuZCBAY29kZXtsc30uCi0KLUBpdGVtIG54Ci1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gb2xkLWFyY2hpdmUKLUBzYW1wey1vfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBvbGQtZmlsZQotQHNhbXB7LW99IGluIE1ha2UuCi0KLUBpdGVtIG9uZS1maWxlLXN5c3RlbQotQHNhbXB7LWx9IGluIEBjb2Rle3Rhcn0sIEBjb2Rle2NwfSwgYW5kIEBjb2Rle2R1fS4KLQotQGl0ZW0gb25seS1maWxlCi1Ac2FtcHstb30gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gb25seS1wcm9mCi1Ac2FtcHstZn0gaW4gQGNvZGV7Z3Byb2Z9LgotCi1AaXRlbSBvbmx5LXRpbWUKLUBzYW1wey1GfSBpbiBAY29kZXtncHJvZn0uCi0KLUBpdGVtIG91dHB1dAotSW4gdmFyaW91cyBwcm9ncmFtcywgc3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KLQotQGl0ZW0gb3V0cHV0LXByZWZpeAotQHNhbXB7LW99IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBvdmVycmlkZQotQHNhbXB7LW99IGluIEBjb2Rle3JtfS4KLQotQGl0ZW0gb3ZlcndyaXRlCi1Ac2FtcHstY30gaW4gQGNvZGV7dW5zaGFyfS4KLQotQGl0ZW0gb3duZXIKLUBzYW1wey1vfSBpbiBAY29kZXtpbnN0YWxsfS4KLQotQGl0ZW0gcGFnaW5hdGUKLUBzYW1wey1sfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gcGFyYWdyYXBoLWluZGVudAotVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCi0KLUBpdGVtIHBhcmVudHMKLUBzYW1wey1wfSBpbiBAY29kZXtta2Rpcn0gYW5kIEBjb2Rle3JtZGlyfS4KLQotQGl0ZW0gcGFzcy1hbGwKLUBzYW1wey1wfSBpbiBAY29kZXt1bH0uCi0KLUBpdGVtIHBhc3MtdGhyb3VnaAotQHNhbXB7LXB9IGluIEBjb2Rle2NwaW99LgotCi1AaXRlbSBwb3J0Ci1Ac2FtcHstUH0gaW4gQGNvZGV7ZmluZ2VyfS4KLQotQGl0ZW0gcG9ydGFiaWxpdHkKLUBzYW1wey1jfSBpbiBAY29kZXtjcGlvfSBhbmQgQGNvZGV7dGFyfS4KLQotQGl0ZW0gcG9zaXgKLVVzZWQgaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIHByZWZpeC1idWlsdGlucwotQHNhbXB7LVB9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gcHJlZml4Ci1Ac2FtcHstZn0gaW4gQGNvZGV7Y3NwbGl0fS4KLQotQGl0ZW0gcHJlc2VydmUKLVVzZWQgaW4gQGNvZGV7dGFyfSBhbmQgQGNvZGV7Y3B9LgotCi1AaXRlbSBwcmVzZXJ2ZS1lbnZpcm9ubWVudAotQHNhbXB7LXB9IGluIEBjb2Rle3N1fS4KLQotQGl0ZW0gcHJlc2VydmUtbW9kaWZpY2F0aW9uLXRpbWUKLUBzYW1wey1tfSBpbiBAY29kZXtjcGlvfS4KLQotQGl0ZW0gcHJlc2VydmUtb3JkZXIKLUBzYW1wey1zfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBwcmVzZXJ2ZS1wZXJtaXNzaW9ucwotQHNhbXB7LXB9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHByaW50Ci1Ac2FtcHstbH0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIHByaW50LWNoYXJzCi1Ac2FtcHstTH0gaW4gQGNvZGV7Y21wfS4KLQotQGl0ZW0gcHJpbnQtZGF0YS1iYXNlCi1Ac2FtcHstcH0gaW4gTWFrZS4KLQotQGl0ZW0gcHJpbnQtZGlyZWN0b3J5Ci1Ac2FtcHstd30gaW4gTWFrZS4KLQotQGl0ZW0gcHJpbnQtZmlsZS1uYW1lCi1Ac2FtcHstb30gaW4gQGNvZGV7bm19LgotCi1AaXRlbSBwcmludC1zeW1kZWZzCi1Ac2FtcHstc30gaW4gQGNvZGV7bm19LgotCi1AaXRlbSBwcmludGVyCi1Ac2FtcHstcH0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBwcm9tcHQKLUBzYW1wey1wfSBpbiBAY29kZXtlZH0uCi0KLUBpdGVtIHF1ZXJ5LXVzZXIKLUBzYW1wey1YfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gcXVlc3Rpb24KLUBzYW1wey1xfSBpbiBNYWtlLgotCi1AaXRlbSBxdWlldAotVXNlZCBpbiBtYW55IHByb2dyYW1zIHRvIGluaGliaXQgdGhlIHVzdWFsIG91dHB1dC4gIEBzdHJvbmd7Tm90ZTp9IGV2ZXJ5Ci1wcm9ncmFtIGFjY2VwdGluZyBAc2FtcHstLXF1aWV0fSBzaG91bGQgYWNjZXB0IEBzYW1wey0tc2lsZW50fSBhcyBhCi1zeW5vbnltLgotCi1AaXRlbSBxdWlldC11bnNoYXIKLUBzYW1wey1RfSBpbiBAY29kZXtzaGFyfQotCi1AaXRlbSBxdW90ZS1uYW1lCi1Ac2FtcHstUX0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSByY3MKLUBzYW1wey1ufSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gcmUtaW50ZXJ2YWwKLVVzZWQgaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIHJlYWQtZnVsbC1ibG9ja3MKLUBzYW1wey1CfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSByZWFkbm93Ci1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gcmVjb24KLUBzYW1wey1ufSBpbiBNYWtlLgotCi1AaXRlbSByZWNvcmQtbnVtYmVyCi1Ac2FtcHstUn0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gcmVjdXJzaXZlCi1Vc2VkIGluIEBjb2Rle2NoZ3JwfSwgQGNvZGV7Y2hvd259LCBAY29kZXtjcH0sIEBjb2Rle2xzfSwgQGNvZGV7ZGlmZn0sCi1hbmQgQGNvZGV7cm19LgotCi1AaXRlbSByZWZlcmVuY2UtbGltaXQKLVVzZWQgaW4gQGNvZGV7bWFrZWluZm99LgotCi1AaXRlbSByZWZlcmVuY2VzCi1Ac2FtcHstcn0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gcmVnZXgKLUBzYW1wey1yfSBpbiBAY29kZXt0YWN9IGFuZCBAY29kZXtldGFnc30uCi0KLUBpdGVtIHJlbGVhc2UKLUBzYW1wey1yfSBpbiBAY29kZXt1bmFtZX0uCi0KLUBpdGVtIHJlbG9hZC1zdGF0ZQotQHNhbXB7LVJ9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gcmVsb2NhdGlvbgotQHNhbXB7LXJ9IGluIEBjb2Rle29iamR1bXB9LgotCi1AaXRlbSByZW5hbWUKLUBzYW1wey1yfSBpbiBAY29kZXtjcGlvfS4KLQotQGl0ZW0gcmVwbGFjZQotQHNhbXB7LWl9IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gcmVwb3J0LWlkZW50aWNhbC1maWxlcwotQHNhbXB7LXN9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSByZXNldC1hY2Nlc3MtdGltZQotQHNhbXB7LWF9IGluIEBjb2Rle2NwaW99LgotCi1AaXRlbSByZXZlcnNlCi1Ac2FtcHstcn0gaW4gQGNvZGV7bHN9IGFuZCBAY29kZXtubX0uCi0KLUBpdGVtIHJldmVyc2VkLWVkCi1Ac2FtcHstZn0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIHJpZ2h0LXNpZGUtZGVmcwotQHNhbXB7LVJ9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIHNhbWUtb3JkZXIKLUBzYW1wey1zfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBzYW1lLXBlcm1pc3Npb25zCi1Ac2FtcHstcH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gc2F2ZQotQHNhbXB7LWd9IGluIEBjb2Rle3N0dHl9LgotCi1AaXRlbSBzZQotVXNlZCBpbiBHREIuCi0KLUBpdGVtIHNlbnRlbmNlLXJlZ2V4cAotQHNhbXB7LVN9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIHNlcGFyYXRlLWRpcnMKLUBzYW1wey1TfSBpbiBAY29kZXtkdX0uCi0KLUBpdGVtIHNlcGFyYXRvcgotQHNhbXB7LXN9IGluIEBjb2Rle3RhY30uCi0KLUBpdGVtIHNlcXVlbmNlCi1Vc2VkIGJ5IEBjb2Rle3JlY29kZX0gdG8gY2hvc2UgZmlsZXMgb3IgcGlwZXMgZm9yIHNlcXVlbmNpbmcgcGFzc2VzLgotCi1AaXRlbSBzaGVsbAotQHNhbXB7LXN9IGluIEBjb2Rle3N1fS4KLQotQGl0ZW0gc2hvdy1hbGwKLUBzYW1wey1BfSBpbiBAY29kZXtjYXR9LgotCi1AaXRlbSBzaG93LWMtZnVuY3Rpb24KLUBzYW1wey1wfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gc2hvdy1lbmRzCi1Ac2FtcHstRX0gaW4gQGNvZGV7Y2F0fS4KLQotQGl0ZW0gc2hvdy1mdW5jdGlvbi1saW5lCi1Ac2FtcHstRn0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIHNob3ctdGFicwotQHNhbXB7LVR9IGluIEBjb2Rle2NhdH0uCi0KLUBpdGVtIHNpbGVudAotVXNlZCBpbiBtYW55IHByb2dyYW1zIHRvIGluaGliaXQgdGhlIHVzdWFsIG91dHB1dC4KLUBzdHJvbmd7Tm90ZTp9IGV2ZXJ5IHByb2dyYW0gYWNjZXB0aW5nCi1Ac2FtcHstLXNpbGVudH0gc2hvdWxkIGFjY2VwdCBAc2FtcHstLXF1aWV0fSBhcyBhIHN5bm9ueW0uCi0KLUBpdGVtIHNpemUKLUBzYW1wey1zfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIHNvcnQKLVVzZWQgaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBzb3VyY2UKLUBzYW1wey1XIHNvdXJjZX0gaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIHNwYXJzZQotQHNhbXB7LVN9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHNwZWVkLWxhcmdlLWZpbGVzCi1Ac2FtcHstSH0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIHNwbGl0LWF0Ci1Ac2FtcHstRX0gaW4gQGNvZGV7dW5zaGFyfS4KLQotQGl0ZW0gc3BsaXQtc2l6ZS1saW1pdAotQHNhbXB7LUx9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBzcXVlZXplLWJsYW5rCi1Ac2FtcHstc30gaW4gQGNvZGV7Y2F0fS4KLQotQGl0ZW0gc3RhcnQtZGVsZXRlCi1Ac2FtcHstd30gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBzdGFydC1pbnNlcnQKLUBzYW1wey15fSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIHN0YXJ0aW5nLWZpbGUKLVVzZWQgaW4gQGNvZGV7dGFyfSBhbmQgQGNvZGV7ZGlmZn0gdG8gc3BlY2lmeSB3aGljaCBmaWxlIHdpdGhpbgotYSBkaXJlY3RvcnkgdG8gc3RhcnQgcHJvY2Vzc2luZyB3aXRoLgotCi1AaXRlbSBzdGF0aXN0aWNzCi1Ac2FtcHstc30gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBzdGRpbi1maWxlLWxpc3QKLUBzYW1wey1TfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gc3RvcAotQHNhbXB7LVN9IGluIE1ha2UuCi0KLUBpdGVtIHN0cmljdAotQHNhbXB7LXN9IGluIEBjb2Rle3JlY29kZX0uCi0KLUBpdGVtIHN0cmlwCi1Ac2FtcHstc30gaW4gQGNvZGV7aW5zdGFsbH0uCi0KLUBpdGVtIHN0cmlwLWFsbAotQHNhbXB7LXN9IGluIEBjb2Rle3N0cmlwfS4KLQotQGl0ZW0gc3RyaXAtZGVidWcKLUBzYW1wey1TfSBpbiBAY29kZXtzdHJpcH0uCi0KLUBpdGVtIHN1Ym1pdHRlcgotQHNhbXB7LXN9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBzdWZmaXgKLUBzYW1wey1TfSBpbiBAY29kZXtjcH0sIEBjb2Rle2xufSwgQGNvZGV7bXZ9LgotCi1AaXRlbSBzdWZmaXgtZm9ybWF0Ci1Ac2FtcHstYn0gaW4gQGNvZGV7Y3NwbGl0fS4KLQotQGl0ZW0gc3VtCi1Ac2FtcHstc30gaW4gQGNvZGV7Z3Byb2Z9LgotCi1AaXRlbSBzdW1tYXJpemUKLUBzYW1wey1zfSBpbiBAY29kZXtkdX0uCi0KLUBpdGVtIHN5bWJvbGljCi1Ac2FtcHstc30gaW4gQGNvZGV7bG59LgotCi1AaXRlbSBzeW1ib2xzCi1Vc2VkIGluIEdEQiBhbmQgQGNvZGV7b2JqZHVtcH0uCi0KLUBpdGVtIHN5bmNsaW5lcwotQHNhbXB7LXN9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gc3lzbmFtZQotQHNhbXB7LXN9IGluIEBjb2Rle3VuYW1lfS4KLQotQGl0ZW0gdGFicwotQHNhbXB7LXR9IGluIEBjb2Rle2V4cGFuZH0gYW5kIEBjb2Rle3VuZXhwYW5kfS4KLQotQGl0ZW0gdGFic2l6ZQotQHNhbXB7LVR9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gdGVybWluYWwKLUBzYW1wey1UfSBpbiBAY29kZXt0cHV0fSBhbmQgQGNvZGV7dWx9LgotQHNhbXB7LXR9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gdGV4dAotQHNhbXB7LWF9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSB0ZXh0LWZpbGVzCi1Ac2FtcHstVH0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHRpbWUKLVVzZWQgaW4gQGNvZGV7bHN9IGFuZCBAY29kZXt0b3VjaH0uCi0KLUBpdGVtIHRvLXN0ZG91dAotQHNhbXB7LU99IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHRvdGFsCi1Ac2FtcHstY30gaW4gQGNvZGV7ZHV9LgotCi1AaXRlbSB0b3VjaAotQHNhbXB7LXR9IGluIE1ha2UsIEBjb2Rle3JhbmxpYn0sIGFuZCBAY29kZXtyZWNvZGV9LgotCi1AaXRlbSB0cmFjZQotQHNhbXB7LXR9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gdHJhZGl0aW9uYWwKLUBzYW1wey10fSBpbiBAY29kZXtoZWxsb307Ci1Ac2FtcHstVyB0cmFkaXRpb25hbH0gaW4gQGNvZGV7Z2F3a307Ci1Ac2FtcHstR30gaW4gQGNvZGV7ZWR9LCBAY29kZXttNH0sIGFuZCBAY29kZXtwdHh9LgotCi1AaXRlbSB0dHkKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSB0eXBlZGVmcwotQHNhbXB7LXR9IGluIEBjb2Rle2N0YWdzfS4KLQotQGl0ZW0gdHlwZWRlZnMtYW5kLWMrKwotQHNhbXB7LVR9IGluIEBjb2Rle2N0YWdzfS4KLQotQGl0ZW0gdHlwZXNldC1tb2RlCi1Ac2FtcHstdH0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gdW5jb21wcmVzcwotQHNhbXB7LXp9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHVuY29uZGl0aW9uYWwKLUBzYW1wey11fSBpbiBAY29kZXtjcGlvfS4KLQotQGl0ZW0gdW5kZWZpbmUKLUBzYW1wey1VfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIHVuZGVmaW5lZC1vbmx5Ci1Ac2FtcHstdX0gaW4gQGNvZGV7bm19LgotCi1AaXRlbSB1cGRhdGUKLUBzYW1wey11fSBpbiBAY29kZXtjcH0sIEBjb2Rle2N0YWdzfSwgQGNvZGV7bXZ9LCBAY29kZXt0YXJ9LgotCi1AaXRlbSB1c2FnZQotVXNlZCBpbiBAY29kZXtnYXdrfTsgc2FtZSBhcyBAc2FtcHstLWhlbHB9LgotCi1AaXRlbSB1dWVuY29kZQotQHNhbXB7LUJ9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSB2YW5pbGxhLW9wZXJhdGlvbgotQHNhbXB7LVZ9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSB2ZXJib3NlCi1QcmludCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHByb2dyZXNzLiAgTWFueSBwcm9ncmFtcyBzdXBwb3J0IHRoaXMuCi0KLUBpdGVtIHZlcmlmeQotQHNhbXB7LVd9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHZlcnNpb24KLVByaW50IHRoZSB2ZXJzaW9uIG51bWJlci4KLQotQGl0ZW0gdmVyc2lvbi1jb250cm9sCi1Ac2FtcHstVn0gaW4gQGNvZGV7Y3B9LCBAY29kZXtsbn0sIEBjb2Rle212fS4KLQotQGl0ZW0gdmdyaW5kCi1Ac2FtcHstdn0gaW4gQGNvZGV7Y3RhZ3N9LgotCi1AaXRlbSB2b2x1bWUKLUBzYW1wey1WfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSB3aGF0LWlmCi1Ac2FtcHstV30gaW4gTWFrZS4KLQotQGl0ZW0gd2hvbGUtc2l6ZS1saW1pdAotQHNhbXB7LWx9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSB3aWR0aAotQHNhbXB7LXd9IGluIEBjb2Rle2xzfSBhbmQgQGNvZGV7cHR4fS4KLQotQGl0ZW0gd29yZC1yZWdleHAKLUBzYW1wey1XfSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSB3cml0YWJsZQotQHNhbXB7LVR9IGluIEBjb2Rle3dob30uCi0KLUBpdGVtIHplcm9zCi1Ac2FtcHsten0gaW4gQGNvZGV7Z3Byb2Z9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBNZW1vcnkgVXNhZ2UKLUBzZWN0aW9uIE1lbW9yeSBVc2FnZQotCi1JZiBpdCB0eXBpY2FsbHkgdXNlcyBqdXN0IGEgZmV3IG1lZyBvZiBtZW1vcnksIGRvbid0IGJvdGhlciBtYWtpbmcgYW55Ci1lZmZvcnQgdG8gcmVkdWNlIG1lbW9yeSB1c2FnZS4gIEZvciBleGFtcGxlLCBpZiBpdCBpcyBpbXByYWN0aWNhbCBmb3IKLW90aGVyIHJlYXNvbnMgdG8gb3BlcmF0ZSBvbiBmaWxlcyBtb3JlIHRoYW4gYSBmZXcgbWVnIGxvbmcsIGl0IGlzCi1yZWFzb25hYmxlIHRvIHJlYWQgZW50aXJlIGlucHV0IGZpbGVzIGludG8gY29yZSB0byBvcGVyYXRlIG9uIHRoZW0uCi0KLUhvd2V2ZXIsIGZvciBwcm9ncmFtcyBzdWNoIGFzIEBjb2Rle2NhdH0gb3IgQGNvZGV7dGFpbH0sIHRoYXQgY2FuCi11c2VmdWxseSBvcGVyYXRlIG9uIHZlcnkgbGFyZ2UgZmlsZXMsIGl0IGlzIGltcG9ydGFudCB0byBhdm9pZCB1c2luZyBhCi10ZWNobmlxdWUgdGhhdCB3b3VsZCBhcnRpZmljaWFsbHkgbGltaXQgdGhlIHNpemUgb2YgZmlsZXMgaXQgY2FuIGhhbmRsZS4KLUlmIGEgcHJvZ3JhbSB3b3JrcyBieSBsaW5lcyBhbmQgY291bGQgYmUgYXBwbGllZCB0byBhcmJpdHJhcnkKLXVzZXItc3VwcGxpZWQgaW5wdXQgZmlsZXMsIGl0IHNob3VsZCBrZWVwIG9ubHkgYSBsaW5lIGluIG1lbW9yeSwgYmVjYXVzZQotdGhpcyBpcyBub3QgdmVyeSBoYXJkIGFuZCB1c2VycyB3aWxsIHdhbnQgdG8gYmUgYWJsZSB0byBvcGVyYXRlIG9uIGlucHV0Ci1maWxlcyB0aGF0IGFyZSBiaWdnZXIgdGhhbiB3aWxsIGZpdCBpbiBjb3JlIGFsbCBhdCBvbmNlLgotCi1JZiB5b3VyIHByb2dyYW0gY3JlYXRlcyBjb21wbGljYXRlZCBkYXRhIHN0cnVjdHVyZXMsIGp1c3QgbWFrZSB0aGVtIGluCi1jb3JlIGFuZCBnaXZlIGEgZmF0YWwgZXJyb3IgaWYgQGNvZGV7bWFsbG9jfSByZXR1cm5zIHplcm8uCi0KLUBub2RlIFdyaXRpbmcgQwotQGNoYXB0ZXIgTWFraW5nIFRoZSBCZXN0IFVzZSBvZiBDCi0KLVRoaXMgQHZhbHVle0NIQVBURVJ9IHByb3ZpZGVzIGFkdmljZSBvbiBob3cgYmVzdCB0byB1c2UgdGhlIEMgbGFuZ3VhZ2UKLXdoZW4gd3JpdGluZyBHTlUgc29mdHdhcmUuCi0KLUBtZW51Ci0qIEZvcm1hdHRpbmc6OiAgICAgICAgICAgICAgICAgIEZvcm1hdHRpbmcgWW91ciBTb3VyY2UgQ29kZQotKiBDb21tZW50czo6ICAgICAgICAgICAgICAgICAgICBDb21tZW50aW5nIFlvdXIgV29yawotKiBTeW50YWN0aWMgQ29udmVudGlvbnM6OiAgICAgICBDbGVhbiBVc2Ugb2YgQyBDb25zdHJ1Y3RzCi0qIE5hbWVzOjogICAgICAgICAgICAgICAgICAgICAgIE5hbWluZyBWYXJpYWJsZXMgYW5kIEZ1bmN0aW9ucwotKiBTeXN0ZW0gUG9ydGFiaWxpdHk6OiAgICAgICAgICBQb3J0YWJpbGl0eSBiZXR3ZWVuIGRpZmZlcmVudCBvcGVyYXRpbmcgc3lzdGVtcwotKiBDUFUgUG9ydGFiaWxpdHk6OiAgICAgICAgICAgICBTdXBwb3J0aW5nIHRoZSByYW5nZSBvZiBDUFUgdHlwZXMKLSogU3lzdGVtIEZ1bmN0aW9uczo6ICAgICAgICAgICAgUG9ydGFiaWxpdHkgYW5kIGBgc3RhbmRhcmQnJyBsaWJyYXJ5IGZ1bmN0aW9ucwotKiBJbnRlcm5hdGlvbmFsaXphdGlvbjo6ICAgICAgICBUZWNobmlxdWVzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbgotKiBNbWFwOjogICAgICAgICAgICAgICAgICAgICAgICBIb3cgeW91IGNhbiBzYWZlbHkgdXNlIEBjb2Rle21tYXB9LgotQGVuZCBtZW51Ci0KLUBub2RlIEZvcm1hdHRpbmcKLUBzZWN0aW9uIEZvcm1hdHRpbmcgWW91ciBTb3VyY2UgQ29kZQotCi1JdCBpcyBpbXBvcnRhbnQgdG8gcHV0IHRoZSBvcGVuLWJyYWNlIHRoYXQgc3RhcnRzIHRoZSBib2R5IG9mIGEgQwotZnVuY3Rpb24gaW4gY29sdW1uIHplcm8sIGFuZCBhdm9pZCBwdXR0aW5nIGFueSBvdGhlciBvcGVuLWJyYWNlIG9yCi1vcGVuLXBhcmVudGhlc2lzIG9yIG9wZW4tYnJhY2tldCBpbiBjb2x1bW4gemVyby4gIFNldmVyYWwgdG9vbHMgbG9vawotZm9yIG9wZW4tYnJhY2VzIGluIGNvbHVtbiB6ZXJvIHRvIGZpbmQgdGhlIGJlZ2lubmluZ3Mgb2YgQyBmdW5jdGlvbnMuCi1UaGVzZSB0b29scyB3aWxsIG5vdCB3b3JrIG9uIGNvZGUgbm90IGZvcm1hdHRlZCB0aGF0IHdheS4KLQotSXQgaXMgYWxzbyBpbXBvcnRhbnQgZm9yIGZ1bmN0aW9uIGRlZmluaXRpb25zIHRvIHN0YXJ0IHRoZSBuYW1lIG9mIHRoZQotZnVuY3Rpb24gaW4gY29sdW1uIHplcm8uICBUaGlzIGhlbHBzIHBlb3BsZSB0byBzZWFyY2ggZm9yIGZ1bmN0aW9uCi1kZWZpbml0aW9ucywgYW5kIG1heSBhbHNvIGhlbHAgY2VydGFpbiB0b29scyByZWNvZ25pemUgdGhlbS4gIFRodXMsCi10aGUgcHJvcGVyIGZvcm1hdCBpcyB0aGlzOgotCi1AZXhhbXBsZQotc3RhdGljIGNoYXIgKgotY29uY2F0IChzMSwgczIpICAgICAgICAvKiBOYW1lIHN0YXJ0cyBpbiBjb2x1bW4gemVybyBoZXJlICovCi0gICAgIGNoYXIgKnMxLCAqczI7Ci1AeyAgICAgICAgICAgICAgICAgICAgIC8qIE9wZW4gYnJhY2UgaW4gY29sdW1uIHplcm8gaGVyZSAqLwotICBAZG90c3t9Ci1AfQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotb3IsIGlmIHlvdSB3YW50IHRvIHVzZSBAc2N7YW5zaX0gQywgZm9ybWF0IHRoZSBkZWZpbml0aW9uIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLXN0YXRpYyBjaGFyICoKLWNvbmNhdCAoY2hhciAqczEsIGNoYXIgKnMyKQotQHsKLSAgQGRvdHN7fQotQH0KLUBlbmQgZXhhbXBsZQotCi1JbiBAc2N7YW5zaX0gQywgaWYgdGhlIGFyZ3VtZW50cyBkb24ndCBmaXQgbmljZWx5IG9uIG9uZSBsaW5lLAotc3BsaXQgaXQgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotaW50Ci1sb3RzX29mX2FyZ3MgKGludCBhbl9pbnRlZ2VyLCBsb25nIGFfbG9uZywgc2hvcnQgYV9zaG9ydCwKLSAgICAgICAgICAgICAgZG91YmxlIGFfZG91YmxlLCBmbG9hdCBhX2Zsb2F0KQotQGRvdHN7fQotQGVuZCBleGFtcGxlCi0KLUZvciB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24sIHdlIHByZWZlciBjb2RlIGZvcm1hdHRlZCBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1pZiAoeCA8IGZvbyAoeSwgeikpCi0gIGhhaGEgPSBiYXJbNF0gKyA1OwotZWxzZQotICBAewotICAgIHdoaWxlICh6KQotICAgICAgQHsKLSAgICAgICAgaGFoYSArPSBmb28gKHosIHopOwotICAgICAgICB6LS07Ci0gICAgICBAfQotICAgIHJldHVybiArK3ggKyBiYXIgKCk7Ci0gIEB9Ci1AZW5kIGV4YW1wbGUKLQotV2UgZmluZCBpdCBlYXNpZXIgdG8gcmVhZCBhIHByb2dyYW0gd2hlbiBpdCBoYXMgc3BhY2VzIGJlZm9yZSB0aGUKLW9wZW4tcGFyZW50aGVzZXMgYW5kIGFmdGVyIHRoZSBjb21tYXMuICBFc3BlY2lhbGx5IGFmdGVyIHRoZSBjb21tYXMuCi0KLVdoZW4geW91IHNwbGl0IGFuIGV4cHJlc3Npb24gaW50byBtdWx0aXBsZSBsaW5lcywgc3BsaXQgaXQKLWJlZm9yZSBhbiBvcGVyYXRvciwgbm90IGFmdGVyIG9uZS4gIEhlcmUgaXMgdGhlIHJpZ2h0IHdheToKLQotQGV4YW1wbGUKLWlmIChmb29fdGhpc19pc19sb25nICYmIGJhciA+IHdpbiAoeCwgeSwgeikKLSAgICAmJiByZW1haW5pbmdfY29uZGl0aW9uKQotQGVuZCBleGFtcGxlCi0KLVRyeSB0byBhdm9pZCBoYXZpbmcgdHdvIG9wZXJhdG9ycyBvZiBkaWZmZXJlbnQgcHJlY2VkZW5jZSBhdCB0aGUgc2FtZQotbGV2ZWwgb2YgaW5kZW50YXRpb24uICBGb3IgZXhhbXBsZSwgZG9uJ3Qgd3JpdGUgdGhpczoKLQotQGV4YW1wbGUKLW1vZGUgPSAoaW5tb2RlW2pdID09IFZPSURtb2RlCi0gICAgICAgIHx8IEdFVF9NT0RFX1NJWkUgKG91dG1vZGVbal0pID4gR0VUX01PREVfU0laRSAoaW5tb2RlW2pdKQotICAgICAgICA/IG91dG1vZGVbal0gOiBpbm1vZGVbal0pOwotQGVuZCBleGFtcGxlCi0KLUluc3RlYWQsIHVzZSBleHRyYSBwYXJlbnRoZXNlcyBzbyB0aGF0IHRoZSBpbmRlbnRhdGlvbiBzaG93cyB0aGUgbmVzdGluZzoKLQotQGV4YW1wbGUKLW1vZGUgPSAoKGlubW9kZVtqXSA9PSBWT0lEbW9kZQotICAgICAgICAgfHwgKEdFVF9NT0RFX1NJWkUgKG91dG1vZGVbal0pID4gR0VUX01PREVfU0laRSAoaW5tb2RlW2pdKSkpCi0gICAgICAgID8gb3V0bW9kZVtqXSA6IGlubW9kZVtqXSk7Ci1AZW5kIGV4YW1wbGUKLQotSW5zZXJ0IGV4dHJhIHBhcmVudGhlc2VzIHNvIHRoYXQgRW1hY3Mgd2lsbCBpbmRlbnQgdGhlIGNvZGUgcHJvcGVybHkuCi1Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBpbmRlbnRhdGlvbiBsb29rcyBuaWNlIGlmIHlvdSBkbyBpdCBieSBoYW5kLAotYnV0IEVtYWNzIHdvdWxkIG1lc3MgaXQgdXA6Ci0KLUBleGFtcGxlCi12ID0gcnVwLT5ydV91dGltZS50dl9zZWMqMTAwMCArIHJ1cC0+cnVfdXRpbWUudHZfdXNlYy8xMDAwCi0gICAgKyBydXAtPnJ1X3N0aW1lLnR2X3NlYyoxMDAwICsgcnVwLT5ydV9zdGltZS50dl91c2VjLzEwMDA7Ci1AZW5kIGV4YW1wbGUKLQotQnV0IGFkZGluZyBhIHNldCBvZiBwYXJlbnRoZXNlcyBzb2x2ZXMgdGhlIHByb2JsZW06Ci0KLUBleGFtcGxlCi12ID0gKHJ1cC0+cnVfdXRpbWUudHZfc2VjKjEwMDAgKyBydXAtPnJ1X3V0aW1lLnR2X3VzZWMvMTAwMAotICAgICArIHJ1cC0+cnVfc3RpbWUudHZfc2VjKjEwMDAgKyBydXAtPnJ1X3N0aW1lLnR2X3VzZWMvMTAwMCk7Ci1AZW5kIGV4YW1wbGUKLQotRm9ybWF0IGRvLXdoaWxlIHN0YXRlbWVudHMgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotZG8KLSAgQHsKLSAgICBhID0gZm9vIChhKTsKLSAgQH0KLXdoaWxlIChhID4gMCk7Ci1AZW5kIGV4YW1wbGUKLQotUGxlYXNlIHVzZSBmb3JtZmVlZCBjaGFyYWN0ZXJzIChjb250cm9sLUwpIHRvIGRpdmlkZSB0aGUgcHJvZ3JhbSBpbnRvCi1wYWdlcyBhdCBsb2dpY2FsIHBsYWNlcyAoYnV0IG5vdCB3aXRoaW4gYSBmdW5jdGlvbikuICBJdCBkb2VzIG5vdCBtYXR0ZXIKLWp1c3QgaG93IGxvbmcgdGhlIHBhZ2VzIGFyZSwgc2luY2UgdGhleSBkbyBub3QgaGF2ZSB0byBmaXQgb24gYSBwcmludGVkCi1wYWdlLiAgVGhlIGZvcm1mZWVkcyBzaG91bGQgYXBwZWFyIGFsb25lIG9uIGxpbmVzIGJ5IHRoZW1zZWx2ZXMuCi0KLQotQG5vZGUgQ29tbWVudHMKLUBzZWN0aW9uIENvbW1lbnRpbmcgWW91ciBXb3JrCi0KLUV2ZXJ5IHByb2dyYW0gc2hvdWxkIHN0YXJ0IHdpdGggYSBjb21tZW50IHNheWluZyBicmllZmx5IHdoYXQgaXQgaXMgZm9yLgotRXhhbXBsZTogQHNhbXB7Zm10IC0gZmlsdGVyIGZvciBzaW1wbGUgZmlsbGluZyBvZiB0ZXh0fS4KLQotUGxlYXNlIHdyaXRlIHRoZSBjb21tZW50cyBpbiBhIEdOVSBwcm9ncmFtIGluIEVuZ2xpc2gsIGJlY2F1c2UgRW5nbGlzaAotaXMgdGhlIG9uZSBsYW5ndWFnZSB0aGF0IG5lYXJseSBhbGwgcHJvZ3JhbW1lcnMgaW4gYWxsIGNvdW50cmllcyBjYW4KLXJlYWQuICBJZiB5b3UgZG8gbm90IHdyaXRlIEVuZ2xpc2ggd2VsbCwgcGxlYXNlIHdyaXRlIGNvbW1lbnRzIGluCi1FbmdsaXNoIGFzIHdlbGwgYXMgeW91IGNhbiwgdGhlbiBhc2sgb3RoZXIgcGVvcGxlIHRvIGhlbHAgcmV3cml0ZSB0aGVtLgotSWYgeW91IGNhbid0IHdyaXRlIGNvbW1lbnRzIGluIEVuZ2xpc2gsIHBsZWFzZSBmaW5kIHNvbWVvbmUgdG8gd29yayB3aXRoCi15b3UgYW5kIHRyYW5zbGF0ZSB5b3VyIGNvbW1lbnRzIGludG8gRW5nbGlzaC4KLQotUGxlYXNlIHB1dCBhIGNvbW1lbnQgb24gZWFjaCBmdW5jdGlvbiBzYXlpbmcgd2hhdCB0aGUgZnVuY3Rpb24gZG9lcywKLXdoYXQgc29ydHMgb2YgYXJndW1lbnRzIGl0IGdldHMsIGFuZCB3aGF0IHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YKLWFyZ3VtZW50cyBtZWFuIGFuZCBhcmUgdXNlZCBmb3IuICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGR1cGxpY2F0ZSBpbgotd29yZHMgdGhlIG1lYW5pbmcgb2YgdGhlIEMgYXJndW1lbnQgZGVjbGFyYXRpb25zLCBpZiBhIEMgdHlwZSBpcyBiZWluZwotdXNlZCBpbiBpdHMgY3VzdG9tYXJ5IGZhc2hpb24uICBJZiB0aGVyZSBpcyBhbnl0aGluZyBub25zdGFuZGFyZCBhYm91dAotaXRzIHVzZSAoc3VjaCBhcyBhbiBhcmd1bWVudCBvZiB0eXBlIEBjb2Rle2NoYXIgKn0gd2hpY2ggaXMgcmVhbGx5IHRoZQotYWRkcmVzcyBvZiB0aGUgc2Vjb25kIGNoYXJhY3RlciBvZiBhIHN0cmluZywgbm90IHRoZSBmaXJzdCksIG9yIGFueQotcG9zc2libGUgdmFsdWVzIHRoYXQgd291bGQgbm90IHdvcmsgdGhlIHdheSBvbmUgd291bGQgZXhwZWN0IChzdWNoIGFzLAotdGhhdCBzdHJpbmdzIGNvbnRhaW5pbmcgbmV3bGluZXMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIHdvcmspLCBiZSBzdXJlCi10byBzYXkgc28uCi0KLUFsc28gZXhwbGFpbiB0aGUgc2lnbmlmaWNhbmNlIG9mIHRoZSByZXR1cm4gdmFsdWUsIGlmIHRoZXJlIGlzIG9uZS4KLQotUGxlYXNlIHB1dCB0d28gc3BhY2VzIGFmdGVyIHRoZSBlbmQgb2YgYSBzZW50ZW5jZSBpbiB5b3VyIGNvbW1lbnRzLCBzbwotdGhhdCB0aGUgRW1hY3Mgc2VudGVuY2UgY29tbWFuZHMgd2lsbCB3b3JrLiAgQWxzbywgcGxlYXNlIHdyaXRlCi1jb21wbGV0ZSBzZW50ZW5jZXMgYW5kIGNhcGl0YWxpemUgdGhlIGZpcnN0IHdvcmQuICBJZiBhIGxvd2VyLWNhc2UKLWlkZW50aWZpZXIgY29tZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHNlbnRlbmNlLCBkb24ndCBjYXBpdGFsaXplIGl0IQotQ2hhbmdpbmcgdGhlIHNwZWxsaW5nIG1ha2VzIGl0IGEgZGlmZmVyZW50IGlkZW50aWZpZXIuICBJZiB5b3UgZG9uJ3QKLWxpa2Ugc3RhcnRpbmcgYSBzZW50ZW5jZSB3aXRoIGEgbG93ZXIgY2FzZSBsZXR0ZXIsIHdyaXRlIHRoZSBzZW50ZW5jZQotZGlmZmVyZW50bHkgKGUuZy4sIGBgVGhlIGlkZW50aWZpZXIgbG93ZXItY2FzZSBpcyBAZG90c3t9JycpLgotCi1UaGUgY29tbWVudCBvbiBhIGZ1bmN0aW9uIGlzIG11Y2ggY2xlYXJlciBpZiB5b3UgdXNlIHRoZSBhcmd1bWVudAotbmFtZXMgdG8gc3BlYWsgYWJvdXQgdGhlIGFyZ3VtZW50IHZhbHVlcy4gIFRoZSB2YXJpYWJsZSBuYW1lIGl0c2VsZgotc2hvdWxkIGJlIGxvd2VyIGNhc2UsIGJ1dCB3cml0ZSBpdCBpbiB1cHBlciBjYXNlIHdoZW4geW91IGFyZSBzcGVha2luZwotYWJvdXQgdGhlIHZhbHVlIHJhdGhlciB0aGFuIHRoZSB2YXJpYWJsZSBpdHNlbGYuICBUaHVzLCBgYHRoZSBpbm9kZQotbnVtYmVyIE5PREVfTlVNJycgcmF0aGVyIHRoYW4gYGBhbiBpbm9kZScnLgotCi1UaGVyZSBpcyB1c3VhbGx5IG5vIHB1cnBvc2UgaW4gcmVzdGF0aW5nIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBpbgotdGhlIGNvbW1lbnQgYmVmb3JlIGl0LCBiZWNhdXNlIHRoZSByZWFkZXIgY2FuIHNlZSB0aGF0IGZvciBoaW1zZWxmLgotVGhlcmUgbWlnaHQgYmUgYW4gZXhjZXB0aW9uIHdoZW4gdGhlIGNvbW1lbnQgaXMgc28gbG9uZyB0aGF0IHRoZSBmdW5jdGlvbgotaXRzZWxmIHdvdWxkIGJlIG9mZiB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uCi0KLVRoZXJlIHNob3VsZCBiZSBhIGNvbW1lbnQgb24gZWFjaCBzdGF0aWMgdmFyaWFibGUgYXMgd2VsbCwgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotLyogTm9uemVybyBtZWFucyB0cnVuY2F0ZSBsaW5lcyBpbiB0aGUgZGlzcGxheTsKLSAgIHplcm8gbWVhbnMgY29udGludWUgdGhlbS4gICovCi1pbnQgdHJ1bmNhdGVfbGluZXM7Ci1AZW5kIGV4YW1wbGUKLQotRXZlcnkgQHNhbXB7I2VuZGlmfSBzaG91bGQgaGF2ZSBhIGNvbW1lbnQsIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBzaG9ydAotY29uZGl0aW9uYWxzIChqdXN0IGEgZmV3IGxpbmVzKSB0aGF0IGFyZSBub3QgbmVzdGVkLiAgVGhlIGNvbW1lbnQgc2hvdWxkCi1zdGF0ZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBjb25kaXRpb25hbCB0aGF0IGlzIGVuZGluZywgQGVtcGh7aW5jbHVkaW5nCi1pdHMgc2Vuc2V9LiAgQHNhbXB7I2Vsc2V9IHNob3VsZCBoYXZlIGEgY29tbWVudCBkZXNjcmliaW5nIHRoZSBjb25kaXRpb24KLUBlbXBoe2FuZCBzZW5zZX0gb2YgdGhlIGNvZGUgdGhhdCBmb2xsb3dzLiAgRm9yIGV4YW1wbGU6Ci0KLUBleGFtcGxlCi1AZ3JvdXAKLSNpZmRlZiBmb28KLSAgQGRvdHN7fQotI2Vsc2UgLyogbm90IGZvbyAqLwotICBAZG90c3t9Ci0jZW5kaWYgLyogbm90IGZvbyAqLwotQGVuZCBncm91cAotQGdyb3VwCi0jaWZkZWYgZm9vCi0gIEBkb3Rze30KLSNlbmRpZiAvKiBmb28gKi8KLUBlbmQgZ3JvdXAKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLWJ1dCwgYnkgY29udHJhc3QsIHdyaXRlIHRoZSBjb21tZW50cyB0aGlzIHdheSBmb3IgYSBAc2FtcHsjaWZuZGVmfToKLQotQGV4YW1wbGUKLUBncm91cAotI2lmbmRlZiBmb28KLSAgQGRvdHN7fQotI2Vsc2UgLyogZm9vICovCi0gIEBkb3Rze30KLSNlbmRpZiAvKiBmb28gKi8KLUBlbmQgZ3JvdXAKLUBncm91cAotI2lmbmRlZiBmb28KLSAgQGRvdHN7fQotI2VuZGlmIC8qIG5vdCBmb28gKi8KLUBlbmQgZ3JvdXAKLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBTeW50YWN0aWMgQ29udmVudGlvbnMKLUBzZWN0aW9uIENsZWFuIFVzZSBvZiBDIENvbnN0cnVjdHMKLQotUGxlYXNlIGV4cGxpY2l0bHkgZGVjbGFyZSBhbGwgYXJndW1lbnRzIHRvIGZ1bmN0aW9ucy4KLURvbid0IG9taXQgdGhlbSBqdXN0IGJlY2F1c2UgdGhleSBhcmUgQGNvZGV7aW50fXMuCi0KLURlY2xhcmF0aW9ucyBvZiBleHRlcm5hbCBmdW5jdGlvbnMgYW5kIGZ1bmN0aW9ucyB0byBhcHBlYXIgbGF0ZXIgaW4gdGhlCi1zb3VyY2UgZmlsZSBzaG91bGQgYWxsIGdvIGluIG9uZSBwbGFjZSBuZWFyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUKLShzb21ld2hlcmUgYmVmb3JlIHRoZSBmaXJzdCBmdW5jdGlvbiBkZWZpbml0aW9uIGluIHRoZSBmaWxlKSwgb3IgZWxzZQotc2hvdWxkIGdvIGluIGEgaGVhZGVyIGZpbGUuICBEb24ndCBwdXQgQGNvZGV7ZXh0ZXJufSBkZWNsYXJhdGlvbnMgaW5zaWRlCi1mdW5jdGlvbnMuCi0KLUl0IHVzZWQgdG8gYmUgY29tbW9uIHByYWN0aWNlIHRvIHVzZSB0aGUgc2FtZSBsb2NhbCB2YXJpYWJsZXMgKHdpdGgKLW5hbWVzIGxpa2UgQGNvZGV7dGVtfSkgb3ZlciBhbmQgb3ZlciBmb3IgZGlmZmVyZW50IHZhbHVlcyB3aXRoaW4gb25lCi1mdW5jdGlvbi4gIEluc3RlYWQgb2YgZG9pbmcgdGhpcywgaXQgaXMgYmV0dGVyIGRlY2xhcmUgYSBzZXBhcmF0ZSBsb2NhbAotdmFyaWFibGUgZm9yIGVhY2ggZGlzdGluY3QgcHVycG9zZSwgYW5kIGdpdmUgaXQgYSBuYW1lIHdoaWNoIGlzCi1tZWFuaW5nZnVsLiAgVGhpcyBub3Qgb25seSBtYWtlcyBwcm9ncmFtcyBlYXNpZXIgdG8gdW5kZXJzdGFuZCwgaXQgYWxzbwotZmFjaWxpdGF0ZXMgb3B0aW1pemF0aW9uIGJ5IGdvb2QgY29tcGlsZXJzLiAgWW91IGNhbiBhbHNvIG1vdmUgdGhlCi1kZWNsYXJhdGlvbiBvZiBlYWNoIGxvY2FsIHZhcmlhYmxlIGludG8gdGhlIHNtYWxsZXN0IHNjb3BlIHRoYXQgaW5jbHVkZXMKLWFsbCBpdHMgdXNlcy4gIFRoaXMgbWFrZXMgdGhlIHByb2dyYW0gZXZlbiBjbGVhbmVyLgotCi1Eb24ndCB1c2UgbG9jYWwgdmFyaWFibGVzIG9yIHBhcmFtZXRlcnMgdGhhdCBzaGFkb3cgZ2xvYmFsIGlkZW50aWZpZXJzLgotCi1Eb24ndCBkZWNsYXJlIG11bHRpcGxlIHZhcmlhYmxlcyBpbiBvbmUgZGVjbGFyYXRpb24gdGhhdCBzcGFucyBsaW5lcy4KLVN0YXJ0IGEgbmV3IGRlY2xhcmF0aW9uIG9uIGVhY2ggbGluZSwgaW5zdGVhZC4gIEZvciBleGFtcGxlLCBpbnN0ZWFkCi1vZiB0aGlzOgotCi1AZXhhbXBsZQotQGdyb3VwCi1pbnQgICAgZm9vLAotICAgICAgIGJhcjsKLUBlbmQgZ3JvdXAKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdyaXRlIGVpdGhlciB0aGlzOgotCi1AZXhhbXBsZQotaW50IGZvbywgYmFyOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotb3IgdGhpczoKLQotQGV4YW1wbGUKLWludCBmb287Ci1pbnQgYmFyOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotKElmIHRoZXkgYXJlIGdsb2JhbCB2YXJpYWJsZXMsIGVhY2ggc2hvdWxkIGhhdmUgYSBjb21tZW50IHByZWNlZGluZyBpdAotYW55d2F5LikKLQotV2hlbiB5b3UgaGF2ZSBhbiBAY29kZXtpZn0tQGNvZGV7ZWxzZX0gc3RhdGVtZW50IG5lc3RlZCBpbiBhbm90aGVyCi1AY29kZXtpZn0gc3RhdGVtZW50LCBhbHdheXMgcHV0IGJyYWNlcyBhcm91bmQgdGhlIEBjb2Rle2lmfS1AY29kZXtlbHNlfS4KLVRodXMsIG5ldmVyIHdyaXRlIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLWlmIChmb28pCi0gIGlmIChiYXIpCi0gICAgd2luICgpOwotICBlbHNlCi0gICAgbG9zZSAoKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLWFsd2F5cyBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1pZiAoZm9vKQotICBAewotICAgIGlmIChiYXIpCi0gICAgICB3aW4gKCk7Ci0gICAgZWxzZQotICAgICAgbG9zZSAoKTsKLSAgQH0KLUBlbmQgZXhhbXBsZQotCi1JZiB5b3UgaGF2ZSBhbiBAY29kZXtpZn0gc3RhdGVtZW50IG5lc3RlZCBpbnNpZGUgb2YgYW4gQGNvZGV7ZWxzZX0KLXN0YXRlbWVudCwgZWl0aGVyIHdyaXRlIEBjb2Rle2Vsc2UgaWZ9IG9uIG9uZSBsaW5lLCBsaWtlIHRoaXMsCi0KLUBleGFtcGxlCi1pZiAoZm9vKQotICBAZG90c3t9Ci1lbHNlIGlmIChiYXIpCi0gIEBkb3Rze30KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdpdGggaXRzIEBjb2Rle3RoZW59LXBhcnQgaW5kZW50ZWQgbGlrZSB0aGUgcHJlY2VkaW5nIEBjb2Rle3RoZW59LXBhcnQsCi1vciB3cml0ZSB0aGUgbmVzdGVkIEBjb2Rle2lmfSB3aXRoaW4gYnJhY2VzIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLWlmIChmb28pCi0gIEBkb3Rze30KLWVsc2UKLSAgQHsKLSAgICBpZiAoYmFyKQotICAgICAgQGRvdHN7fQotICBAfQotQGVuZCBleGFtcGxlCi0KLURvbid0IGRlY2xhcmUgYm90aCBhIHN0cnVjdHVyZSB0YWcgYW5kIHZhcmlhYmxlcyBvciB0eXBlZGVmcyBpbiB0aGUKLXNhbWUgZGVjbGFyYXRpb24uICBJbnN0ZWFkLCBkZWNsYXJlIHRoZSBzdHJ1Y3R1cmUgdGFnIHNlcGFyYXRlbHkKLWFuZCB0aGVuIHVzZSBpdCB0byBkZWNsYXJlIHRoZSB2YXJpYWJsZXMgb3IgdHlwZWRlZnMuCi0KLVRyeSB0byBhdm9pZCBhc3NpZ25tZW50cyBpbnNpZGUgQGNvZGV7aWZ9LWNvbmRpdGlvbnMuICBGb3IgZXhhbXBsZSwKLWRvbid0IHdyaXRlIHRoaXM6Ci0KLUBleGFtcGxlCi1pZiAoKGZvbyA9IChjaGFyICopIG1hbGxvYyAoc2l6ZW9mICpmb28pKSA9PSAwKQotICBmYXRhbCAoInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotaW5zdGVhZCwgd3JpdGUgdGhpczoKLQotQGV4YW1wbGUKLWZvbyA9IChjaGFyICopIG1hbGxvYyAoc2l6ZW9mICpmb28pOwotaWYgKGZvbyA9PSAwKQotICBmYXRhbCAoInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpOwotQGVuZCBleGFtcGxlCi0KLURvbid0IG1ha2UgdGhlIHByb2dyYW0gdWdseSB0byBwbGFjYXRlIEBjb2Rle2xpbnR9LiAgUGxlYXNlIGRvbid0IGluc2VydCBhbnkKLWNhc3RzIHRvIEBjb2Rle3ZvaWR9LiAgWmVybyB3aXRob3V0IGEgY2FzdCBpcyBwZXJmZWN0bHkgZmluZSBhcyBhIG51bGwKLXBvaW50ZXIgY29uc3RhbnQsIGV4Y2VwdCB3aGVuIGNhbGxpbmcgYSB2YXJhcmdzIGZ1bmN0aW9uLgotCi1Abm9kZSAgTmFtZXMKLUBzZWN0aW9uIE5hbWluZyBWYXJpYWJsZXMgYW5kIEZ1bmN0aW9ucwotCi1UaGUgbmFtZXMgb2YgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGluIGEgcHJvZ3JhbSBzZXJ2ZSBhcwotY29tbWVudHMgb2YgYSBzb3J0LiAgU28gZG9uJ3QgY2hvb3NlIHRlcnNlIG5hbWVzLS0taW5zdGVhZCwgbG9vayBmb3IKLW5hbWVzIHRoYXQgZ2l2ZSB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlhYmxlIG9yCi1mdW5jdGlvbi4gIEluIGEgR05VIHByb2dyYW0sIG5hbWVzIHNob3VsZCBiZSBFbmdsaXNoLCBsaWtlIG90aGVyCi1jb21tZW50cy4KLQotTG9jYWwgdmFyaWFibGUgbmFtZXMgY2FuIGJlIHNob3J0ZXIsIGJlY2F1c2UgdGhleSBhcmUgdXNlZCBvbmx5IHdpdGhpbgotb25lIGNvbnRleHQsIHdoZXJlIChwcmVzdW1hYmx5KSBjb21tZW50cyBleHBsYWluIHRoZWlyIHB1cnBvc2UuCi0KLVBsZWFzZSB1c2UgdW5kZXJzY29yZXMgdG8gc2VwYXJhdGUgd29yZHMgaW4gYSBuYW1lLCBzbyB0aGF0IHRoZSBFbWFjcwotd29yZCBjb21tYW5kcyBjYW4gYmUgdXNlZnVsIHdpdGhpbiB0aGVtLiAgU3RpY2sgdG8gbG93ZXIgY2FzZTsgcmVzZXJ2ZQotdXBwZXIgY2FzZSBmb3IgbWFjcm9zIGFuZCBAY29kZXtlbnVtfSBjb25zdGFudHMsIGFuZCBmb3IgbmFtZS1wcmVmaXhlcwotdGhhdCBmb2xsb3cgYSB1bmlmb3JtIGNvbnZlbnRpb24uCi0KLUZvciBleGFtcGxlLCB5b3Ugc2hvdWxkIHVzZSBuYW1lcyBsaWtlIEBjb2Rle2lnbm9yZV9zcGFjZV9jaGFuZ2VfZmxhZ307Ci1kb24ndCB1c2UgbmFtZXMgbGlrZSBAY29kZXtpQ2FudFJlYWRUaGlzfS4KLQotVmFyaWFibGVzIHRoYXQgaW5kaWNhdGUgd2hldGhlciBjb21tYW5kLWxpbmUgb3B0aW9ucyBoYXZlIGJlZW4KLXNwZWNpZmllZCBzaG91bGQgYmUgbmFtZWQgYWZ0ZXIgdGhlIG1lYW5pbmcgb2YgdGhlIG9wdGlvbiwgbm90IGFmdGVyCi10aGUgb3B0aW9uLWxldHRlci4gIEEgY29tbWVudCBzaG91bGQgc3RhdGUgYm90aCB0aGUgZXhhY3QgbWVhbmluZyBvZgotdGhlIG9wdGlvbiBhbmQgaXRzIGxldHRlci4gIEZvciBleGFtcGxlLAotCi1AZXhhbXBsZQotQGdyb3VwCi0vKiBJZ25vcmUgY2hhbmdlcyBpbiBob3Jpem9udGFsIHdoaXRlc3BhY2UgKC1iKS4gICovCi1pbnQgaWdub3JlX3NwYWNlX2NoYW5nZV9mbGFnOwotQGVuZCBncm91cAotQGVuZCBleGFtcGxlCi0KLVdoZW4geW91IHdhbnQgdG8gZGVmaW5lIG5hbWVzIHdpdGggY29uc3RhbnQgaW50ZWdlciB2YWx1ZXMsIHVzZQotQGNvZGV7ZW51bX0gcmF0aGVyIHRoYW4gQHNhbXB7I2RlZmluZX0uICBHREIga25vd3MgYWJvdXQgZW51bWVyYXRpb24KLWNvbnN0YW50cy4KLQotVXNlIGZpbGUgbmFtZXMgb2YgMTQgY2hhcmFjdGVycyBvciBsZXNzLCB0byBhdm9pZCBjcmVhdGluZyBncmF0dWl0b3VzCi1wcm9ibGVtcyBvbiBvbGRlciBTeXN0ZW0gViBzeXN0ZW1zLiAgWW91IGNhbiB1c2UgdGhlIHByb2dyYW0KLUBjb2Rle2Rvc2Noa30gdG8gdGVzdCBmb3IgdGhpcy4gIEBjb2Rle2Rvc2Noa30gYWxzbyB0ZXN0cyBmb3IgcG90ZW50aWFsCi1uYW1lIGNvbmZsaWN0cyBpZiB0aGUgZmlsZXMgd2VyZSBsb2FkZWQgb250byBhbiBNUy1ET1MgZmlsZQotc3lzdGVtLS0tc29tZXRoaW5nIHlvdSBtYXkgb3IgbWF5IG5vdCBjYXJlIGFib3V0LgotCi1Abm9kZSBTeXN0ZW0gUG9ydGFiaWxpdHkKLUBzZWN0aW9uIFBvcnRhYmlsaXR5IGJldHdlZW4gU3lzdGVtIFR5cGVzCi0KLUluIHRoZSBVbml4IHdvcmxkLCBgYHBvcnRhYmlsaXR5JycgcmVmZXJzIHRvIHBvcnRpbmcgdG8gZGlmZmVyZW50IFVuaXgKLXZlcnNpb25zLiAgRm9yIGEgR05VIHByb2dyYW0sIHRoaXMga2luZCBvZiBwb3J0YWJpbGl0eSBpcyBkZXNpcmFibGUsIGJ1dAotbm90IHBhcmFtb3VudC4KLQotVGhlIHByaW1hcnkgcHVycG9zZSBvZiBHTlUgc29mdHdhcmUgaXMgdG8gcnVuIG9uIHRvcCBvZiB0aGUgR05VIGtlcm5lbCwKLWNvbXBpbGVkIHdpdGggdGhlIEdOVSBDIGNvbXBpbGVyLCBvbiB2YXJpb3VzIHR5cGVzIG9mIEBzY3tjcHV9LiAgVGhlCi1hbW91bnQgYW5kIGtpbmRzIG9mIHZhcmlhdGlvbiBhbW9uZyBHTlUgc3lzdGVtcyBvbiBkaWZmZXJlbnQgQHNje2NwdX1zCi13aWxsIGJlIGNvbXBhcmFibGUgdG8gdGhlIHZhcmlhdGlvbiBhbW9uZyBMaW51eC1iYXNlZCBHTlUgc3lzdGVtcyBvcgotYW1vbmcgQlNEIHN5c3RlbXMgdG9kYXkuICBTbyB0aGUga2luZHMgb2YgcG9ydGFiaWxpdHkgdGhhdCBhcmUgYWJzb2x1dGVseQotbmVjZXNzYXJ5IGFyZSBxdWl0ZSBsaW1pdGVkLgotCi1CdXQgbWFueSB1c2VycyBkbyBydW4gR05VIHNvZnR3YXJlIG9uIG5vbi1HTlUgVW5peCBvciBVbml4LWxpa2Ugc3lzdGVtcy4KLVNvIHN1cHBvcnRpbmcgYSB2YXJpZXR5IG9mIFVuaXgtbGlrZSBzeXN0ZW1zIGlzIGRlc2lyYWJsZSwgYWx0aG91Z2ggbm90Ci1wYXJhbW91bnQuCi0KLVRoZSBlYXNpZXN0IHdheSB0byBhY2hpZXZlIHBvcnRhYmlsaXR5IHRvIG1vc3QgVW5peC1saWtlIHN5c3RlbXMgaXMgdG8KLXVzZSBBdXRvY29uZi4gIEl0J3MgdW5saWtlbHkgdGhhdCB5b3VyIHByb2dyYW0gbmVlZHMgdG8ga25vdyBtb3JlCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgaG9zdCBwbGF0Zm9ybSB0aGFuIEF1dG9jb25mIGNhbiBwcm92aWRlLCBzaW1wbHkKLWJlY2F1c2UgbW9zdCBvZiB0aGUgcHJvZ3JhbXMgdGhhdCBuZWVkIHN1Y2gga25vd2xlZGdlIGhhdmUgYWxyZWFkeSBiZWVuCi13cml0dGVuLgotCi1Bdm9pZCB1c2luZyB0aGUgZm9ybWF0IG9mIHNlbWktaW50ZXJuYWwgZGF0YSBiYXNlcyAoZS5nLiwgZGlyZWN0b3JpZXMpCi13aGVuIHRoZXJlIGlzIGEgaGlnaGVyLWxldmVsIGFsdGVybmF0aXZlIChAY29kZXtyZWFkZGlyfSkuCi0KLUFzIGZvciBzeXN0ZW1zIHRoYXQgYXJlIG5vdCBsaWtlIFVuaXgsIHN1Y2ggYXMgTVNET1MsIFdpbmRvd3MsIHRoZQotTWFjaW50b3NoLCBWTVMsIGFuZCBNVlMsIHN1cHBvcnRpbmcgdGhlbSBpcyB1c3VhbGx5IHNvIG11Y2ggd29yayB0aGF0IGl0Ci1pcyBiZXR0ZXIgaWYgeW91IGRvbid0LgotCi1UaGUgcGxhbm5lZCBHTlUga2VybmVsIGlzIG5vdCBmaW5pc2hlZCB5ZXQsIGJ1dCB5b3UgY2FuIHRlbGwgd2hpY2gKLWZhY2lsaXRpZXMgaXQgd2lsbCBwcm92aWRlIGJ5IGxvb2tpbmcgYXQgdGhlIEdOVSBDIExpYnJhcnkgTWFudWFsLiAgVGhlCi1HTlUga2VybmVsIGlzIGJhc2VkIG9uIE1hY2gsIHNvIHRoZSBmZWF0dXJlcyBvZiBNYWNoIHdpbGwgYWxzbyBiZQotYXZhaWxhYmxlLiAgSG93ZXZlciwgaWYgeW91IHVzZSBNYWNoIGZlYXR1cmVzLCB5b3UnbGwgcHJvYmFibHkgaGF2ZQotdHJvdWJsZSBkZWJ1Z2dpbmcgeW91ciBwcm9ncmFtIHRvZGF5LgotCi1Abm9kZSBDUFUgUG9ydGFiaWxpdHkKLUBzZWN0aW9uIFBvcnRhYmlsaXR5IGJldHdlZW4gQHNje2NwdX1zCi0KLUV2ZW4gR05VIHN5c3RlbXMgd2lsbCBkaWZmZXIgYmVjYXVzZSBvZiBkaWZmZXJlbmNlcyBhbW9uZyBAc2N7Y3B1fQotdHlwZXMtLS1mb3IgZXhhbXBsZSwgZGlmZmVyZW5jZSBpbiBieXRlIG9yZGVyaW5nIGFuZCBhbGlnbm1lbnQKLXJlcXVpcmVtZW50cy4gIEl0IGlzIGFic29sdXRlbHkgZXNzZW50aWFsIHRvIGhhbmRsZSB0aGVzZSBkaWZmZXJlbmNlcy4KLUhvd2V2ZXIsIGRvbid0IG1ha2UgYW55IGVmZm9ydCB0byBjYXRlciB0byB0aGUgcG9zc2liaWxpdHkgdGhhdCBhbgotQGNvZGV7aW50fSB3aWxsIGJlIGxlc3MgdGhhbiAzMiBiaXRzLiAgV2UgZG9uJ3Qgc3VwcG9ydCAxNi1iaXQgbWFjaGluZXMKLWluIEdOVS4KLQotRG9uJ3QgYXNzdW1lIHRoYXQgdGhlIGFkZHJlc3Mgb2YgYW4gQGNvZGV7aW50fSBvYmplY3QgaXMgYWxzbyB0aGUKLWFkZHJlc3Mgb2YgaXRzIGxlYXN0LXNpZ25pZmljYW50IGJ5dGUuICBUaGlzIGlzIGZhbHNlIG9uIGJpZy1lbmRpYW4KLW1hY2hpbmVzLiAgVGh1cywgZG9uJ3QgbWFrZSB0aGUgZm9sbG93aW5nIG1pc3Rha2U6Ci0KLUBleGFtcGxlCi1pbnQgYzsKLUBkb3Rze30KLXdoaWxlICgoYyA9IGdldGNoYXIoKSkgIT0gRU9GKQotICB3cml0ZShmaWxlX2Rlc2NyaXB0b3IsICZjLCAxKTsKLUBlbmQgZXhhbXBsZQotCi1XaGVuIGNhbGxpbmcgZnVuY3Rpb25zLCB5b3UgbmVlZCBub3Qgd29ycnkgYWJvdXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotcG9pbnRlcnMgb2YgdmFyaW91cyB0eXBlcywgb3IgYmV0d2VlbiBwb2ludGVycyBhbmQgaW50ZWdlcnMuICBPbiBtb3N0Ci1tYWNoaW5lcywgdGhlcmUncyBubyBkaWZmZXJlbmNlIGFueXdheS4gIEFzIGZvciB0aGUgZmV3IG1hY2hpbmVzIHdoZXJlCi10aGVyZSBpcyBhIGRpZmZlcmVuY2UsIGFsbCBvZiB0aGVtIHN1cHBvcnQgQHNje2Fuc2l9IEMsIHNvIHlvdSBjYW4gdXNlCi1wcm90b3R5cGVzIChjb25kaXRpb25hbGl6ZWQgdG8gYmUgYWN0aXZlIG9ubHkgaW4gQHNje2Fuc2l9IEMpIHRvIG1ha2UKLXRoZSBjb2RlIHdvcmsgb24gdGhvc2Ugc3lzdGVtcy4KLQotSW4gY2VydGFpbiBjYXNlcywgaXQgaXMgb2sgdG8gcGFzcyBpbnRlZ2VyIGFuZCBwb2ludGVyIGFyZ3VtZW50cwotaW5kaXNjcmltaW5hdGVseSB0byB0aGUgc2FtZSBmdW5jdGlvbiwgYW5kIHVzZSBubyBwcm90b3R5cGUgb24gYW55Ci1zeXN0ZW0uICBGb3IgZXhhbXBsZSwgbWFueSBHTlUgcHJvZ3JhbXMgaGF2ZSBlcnJvci1yZXBvcnRpbmcgZnVuY3Rpb25zCi10aGF0IHBhc3MgdGhlaXIgYXJndW1lbnRzIGFsb25nIHRvIEBjb2Rle3ByaW50Zn0gYW5kIGZyaWVuZHM6Ci0KLUBleGFtcGxlCi1lcnJvciAocywgYTEsIGEyLCBhMykKLSAgICAgY2hhciAqczsKLSAgICAgaW50IGExLCBhMiwgYTM7Ci1AewotICBmcHJpbnRmIChzdGRlcnIsICJlcnJvcjogIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgcywgYTEsIGEyLCBhMyk7Ci1AfQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotSW4gcHJhY3RpY2UsIHRoaXMgd29ya3Mgb24gYWxsIG1hY2hpbmVzLCBhbmQgaXQgaXMgbXVjaCBzaW1wbGVyIHRoYW4gYW55Ci1gYGNvcnJlY3QnJyBhbHRlcm5hdGl2ZS4gIEJlIHN1cmUgQGVtcGh7bm90fSB0byB1c2UgYSBwcm90b3R5cGUKLWZvciBzdWNoIGZ1bmN0aW9ucy4KLQotSG93ZXZlciwgYXZvaWQgY2FzdGluZyBwb2ludGVycyB0byBpbnRlZ2VycyB1bmxlc3MgeW91IHJlYWxseSBuZWVkIHRvLgotVGhlc2UgYXNzdW1wdGlvbnMgcmVhbGx5IHJlZHVjZSBwb3J0YWJpbGl0eSwgYW5kIGluIG1vc3QgcHJvZ3JhbXMgdGhleQotYXJlIGVhc3kgdG8gYXZvaWQuICBJbiB0aGUgY2FzZXMgd2hlcmUgY2FzdGluZyBwb2ludGVycyB0byBpbnRlZ2VycyBpcwotZXNzZW50aWFsLS0tc3VjaCBhcywgYSBMaXNwIGludGVycHJldGVyIHdoaWNoIHN0b3JlcyB0eXBlIGluZm9ybWF0aW9uIGFzCi13ZWxsIGFzIGFuIGFkZHJlc3MgaW4gb25lIHdvcmQtLS1pdCBpcyBvayB0byBkbyBzbywgYnV0IHlvdSdsbCBoYXZlIHRvCi1tYWtlIGV4cGxpY2l0IHByb3Zpc2lvbnMgdG8gaGFuZGxlIGRpZmZlcmVudCB3b3JkIHNpemVzLgotCi1Abm9kZSBTeXN0ZW0gRnVuY3Rpb25zCi1Ac2VjdGlvbiBDYWxsaW5nIFN5c3RlbSBGdW5jdGlvbnMKLQotQyBpbXBsZW1lbnRhdGlvbnMgZGlmZmVyIHN1YnN0YW50aWFsbHkuICBAc2N7YW5zaX0gQyByZWR1Y2VzIGJ1dCBkb2VzIG5vdAotZWxpbWluYXRlIHRoZSBpbmNvbXBhdGliaWxpdGllczsgbWVhbndoaWxlLCBtYW55IHVzZXJzIHdpc2ggdG8gY29tcGlsZQotR05VIHNvZnR3YXJlIHdpdGggcHJlLUBzY3thbnNpfSBjb21waWxlcnMuICBUaGlzIGNoYXB0ZXIgZ2l2ZXMKLXJlY29tbWVuZGF0aW9ucyBmb3IgaG93IHRvIHVzZSB0aGUgbW9yZSBvciBsZXNzIHN0YW5kYXJkIEMgbGlicmFyeQotZnVuY3Rpb25zIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGxvc3Mgb2YgcG9ydGFiaWxpdHkuCi0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1Eb24ndCB1c2UgdGhlIHZhbHVlIG9mIEBjb2Rle3NwcmludGZ9LiAgSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mCi1jaGFyYWN0ZXJzIHdyaXR0ZW4gb24gc29tZSBzeXN0ZW1zLCBidXQgbm90IG9uIGFsbCBzeXN0ZW1zLgotCi1AaXRlbQotQGNvZGV7bWFpbn0gc2hvdWxkIGJlIGRlY2xhcmVkIHRvIHJldHVybiB0eXBlIEBjb2Rle2ludH0uICBJdCBzaG91bGQKLXRlcm1pbmF0ZSBlaXRoZXIgYnkgY2FsbGluZyBAY29kZXtleGl0fSBvciBieSByZXR1cm5pbmcgdGhlIGludGVnZXIKLXN0YXR1cyBjb2RlOyBtYWtlIHN1cmUgaXQgY2Fubm90IGV2ZXIgcmV0dXJuIGFuIHVuZGVmaW5lZCB2YWx1ZS4KLQotQGl0ZW0KLURvbid0IGRlY2xhcmUgc3lzdGVtIGZ1bmN0aW9ucyBleHBsaWNpdGx5LgotCi1BbG1vc3QgYW55IGRlY2xhcmF0aW9uIGZvciBhIHN5c3RlbSBmdW5jdGlvbiBpcyB3cm9uZyBvbiBzb21lIHN5c3RlbS4KLVRvIG1pbmltaXplIGNvbmZsaWN0cywgbGVhdmUgaXQgdG8gdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgdG8gZGVjbGFyZQotc3lzdGVtIGZ1bmN0aW9ucy4gIElmIHRoZSBoZWFkZXJzIGRvbid0IGRlY2xhcmUgYSBmdW5jdGlvbiwgbGV0IGl0Ci1yZW1haW4gdW5kZWNsYXJlZC4KLQotV2hpbGUgaXQgbWF5IHNlZW0gdW5jbGVhbiB0byB1c2UgYSBmdW5jdGlvbiB3aXRob3V0IGRlY2xhcmluZyBpdCwgaW4KLXByYWN0aWNlIHRoaXMgd29ya3MgZmluZSBmb3IgbW9zdCBzeXN0ZW0gbGlicmFyeSBmdW5jdGlvbnMgb24gdGhlCi1zeXN0ZW1zIHdoZXJlIHRoaXMgcmVhbGx5IGhhcHBlbnM7IHRodXMsIHRoZSBkaXNhZHZhbnRhZ2UgaXMgb25seQotdGhlb3JldGljYWwuICBCeSBjb250cmFzdCwgYWN0dWFsIGRlY2xhcmF0aW9ucyBoYXZlIGZyZXF1ZW50bHkgY2F1c2VkCi1hY3R1YWwgY29uZmxpY3RzLgotCi1AaXRlbQotSWYgeW91IG11c3QgZGVjbGFyZSBhIHN5c3RlbSBmdW5jdGlvbiwgZG9uJ3Qgc3BlY2lmeSB0aGUgYXJndW1lbnQgdHlwZXMuCi1Vc2UgYW4gb2xkLXN0eWxlIGRlY2xhcmF0aW9uLCBub3QgYW4gQHNje2Fuc2l9IHByb3RvdHlwZS4gIFRoZSBtb3JlIHlvdQotc3BlY2lmeSBhYm91dCB0aGUgZnVuY3Rpb24sIHRoZSBtb3JlIGxpa2VseSBhIGNvbmZsaWN0LgotCi1AaXRlbQotSW4gcGFydGljdWxhciwgZG9uJ3QgdW5jb25kaXRpb25hbGx5IGRlY2xhcmUgQGNvZGV7bWFsbG9jfSBvcgotQGNvZGV7cmVhbGxvY30uCi0KLU1vc3QgR05VIHByb2dyYW1zIHVzZSB0aG9zZSBmdW5jdGlvbnMganVzdCBvbmNlLCBpbiBmdW5jdGlvbnMKLWNvbnZlbnRpb25hbGx5IG5hbWVkIEBjb2Rle3htYWxsb2N9IGFuZCBAY29kZXt4cmVhbGxvY30uICBUaGVzZQotZnVuY3Rpb25zIGNhbGwgQGNvZGV7bWFsbG9jfSBhbmQgQGNvZGV7cmVhbGxvY30sIHJlc3BlY3RpdmVseSwgYW5kCi1jaGVjayB0aGUgcmVzdWx0cy4KLQotQmVjYXVzZSBAY29kZXt4bWFsbG9jfSBhbmQgQGNvZGV7eHJlYWxsb2N9IGFyZSBkZWZpbmVkIGluIHlvdXIgcHJvZ3JhbSwKLXlvdSBjYW4gZGVjbGFyZSB0aGVtIGluIG90aGVyIGZpbGVzIHdpdGhvdXQgYW55IHJpc2sgb2YgdHlwZSBjb25mbGljdC4KLQotT24gbW9zdCBzeXN0ZW1zLCBAY29kZXtpbnR9IGlzIHRoZSBzYW1lIGxlbmd0aCBhcyBhIHBvaW50ZXI7IHRodXMsIHRoZQotY2FsbHMgdG8gQGNvZGV7bWFsbG9jfSBhbmQgQGNvZGV7cmVhbGxvY30gd29yayBmaW5lLiAgRm9yIHRoZSBmZXcKLWV4Y2VwdGlvbmFsIHN5c3RlbXMgKG1vc3RseSA2NC1iaXQgbWFjaGluZXMpLCB5b3UgY2FuIHVzZQotQHN0cm9uZ3tjb25kaXRpb25hbGl6ZWR9IGRlY2xhcmF0aW9ucyBvZiBAY29kZXttYWxsb2N9IGFuZAotQGNvZGV7cmVhbGxvY30tLS1vciBwdXQgdGhlc2UgZGVjbGFyYXRpb25zIGluIGNvbmZpZ3VyYXRpb24gZmlsZXMKLXNwZWNpZmljIHRvIHRob3NlIHN5c3RlbXMuCi0KLUBpdGVtCi1UaGUgc3RyaW5nIGZ1bmN0aW9ucyByZXF1aXJlIHNwZWNpYWwgdHJlYXRtZW50LiAgU29tZSBVbml4IHN5c3RlbXMgaGF2ZQotYSBoZWFkZXIgZmlsZSBAZmlsZXtzdHJpbmcuaH07IG90aGVycyBoYXZlIEBmaWxle3N0cmluZ3MuaH0uICBOZWl0aGVyCi1maWxlIG5hbWUgaXMgcG9ydGFibGUuICBUaGVyZSBhcmUgdHdvIHRoaW5ncyB5b3UgY2FuIGRvOiB1c2UgQXV0b2NvbmYgdG8KLWZpZ3VyZSBvdXQgd2hpY2ggZmlsZSB0byBpbmNsdWRlLCBvciBkb24ndCBpbmNsdWRlIGVpdGhlciBmaWxlLgotCi1AaXRlbQotSWYgeW91IGRvbid0IGluY2x1ZGUgZWl0aGVyIHN0cmluZ3MgZmlsZSwgeW91IGNhbid0IGdldCBkZWNsYXJhdGlvbnMgZm9yCi10aGUgc3RyaW5nIGZ1bmN0aW9ucyBmcm9tIHRoZSBoZWFkZXIgZmlsZSBpbiB0aGUgdXN1YWwgd2F5LgotCi1UaGF0IGNhdXNlcyBsZXNzIG9mIGEgcHJvYmxlbSB0aGFuIHlvdSBtaWdodCB0aGluay4gIFRoZSBuZXdlciBAc2N7YW5zaX0KLXN0cmluZyBmdW5jdGlvbnMgc2hvdWxkIGJlIGF2b2lkZWQgYW55d2F5IGJlY2F1c2UgbWFueSBzeXN0ZW1zIHN0aWxsCi1kb24ndCBzdXBwb3J0IHRoZW0uICBUaGUgc3RyaW5nIGZ1bmN0aW9ucyB5b3UgY2FuIHVzZSBhcmUgdGhlc2U6Ci0KLUBleGFtcGxlCi1zdHJjcHkgICBzdHJuY3B5ICAgc3RyY2F0ICAgc3RybmNhdAotc3RybGVuICAgc3RyY21wICAgIHN0cm5jbXAKLXN0cmNociAgIHN0cnJjaHIKLUBlbmQgZXhhbXBsZQotCi1UaGUgY29weSBhbmQgY29uY2F0ZW5hdGUgZnVuY3Rpb25zIHdvcmsgZmluZSB3aXRob3V0IGEgZGVjbGFyYXRpb24gYXMKLWxvbmcgYXMgeW91IGRvbid0IHVzZSB0aGVpciB2YWx1ZXMuICBVc2luZyB0aGVpciB2YWx1ZXMgd2l0aG91dCBhCi1kZWNsYXJhdGlvbiBmYWlscyBvbiBzeXN0ZW1zIHdoZXJlIHRoZSB3aWR0aCBvZiBhIHBvaW50ZXIgZGlmZmVycyBmcm9tCi10aGUgd2lkdGggb2YgQGNvZGV7aW50fSwgYW5kIHBlcmhhcHMgaW4gb3RoZXIgY2FzZXMuICBJdCBpcyB0cml2aWFsIHRvCi1hdm9pZCB1c2luZyB0aGVpciB2YWx1ZXMsIHNvIGRvIHRoYXQuCi0KLVRoZSBjb21wYXJlIGZ1bmN0aW9ucyBhbmQgQGNvZGV7c3RybGVufSB3b3JrIGZpbmUgd2l0aG91dCBhIGRlY2xhcmF0aW9uCi1vbiBtb3N0IHN5c3RlbXMsIHBvc3NpYmx5IGFsbCB0aGUgb25lcyB0aGF0IEdOVSBzb2Z0d2FyZSBydW5zIG9uLgotWW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBkZWNsYXJlIHRoZW0gQHN0cm9uZ3tjb25kaXRpb25hbGx5fSBvbiBhCi1mZXcgc3lzdGVtcy4KLQotVGhlIHNlYXJjaCBmdW5jdGlvbnMgbXVzdCBiZSBkZWNsYXJlZCB0byByZXR1cm4gQGNvZGV7Y2hhciAqfS4gIEx1Y2tpbHksCi10aGVyZSBpcyBubyB2YXJpYXRpb24gaW4gdGhlIGRhdGEgdHlwZSB0aGV5IHJldHVybi4gIEJ1dCB0aGVyZSBpcwotdmFyaWF0aW9uIGluIHRoZWlyIG5hbWVzLiAgU29tZSBzeXN0ZW1zIGdpdmUgdGhlc2UgZnVuY3Rpb25zIHRoZSBuYW1lcwotQGNvZGV7aW5kZXh9IGFuZCBAY29kZXtyaW5kZXh9OyBvdGhlciBzeXN0ZW1zIHVzZSB0aGUgbmFtZXMKLUBjb2Rle3N0cmNocn0gYW5kIEBjb2Rle3N0cnJjaHJ9LiAgU29tZSBzeXN0ZW1zIHN1cHBvcnQgYm90aCBwYWlycyBvZgotbmFtZXMsIGJ1dCBuZWl0aGVyIHBhaXIgd29ya3Mgb24gYWxsIHN5c3RlbXMuCi0KLVlvdSBzaG91bGQgcGljayBhIHNpbmdsZSBwYWlyIG9mIG5hbWVzIGFuZCB1c2UgaXQgdGhyb3VnaG91dCB5b3VyCi1wcm9ncmFtLiAgKE5vd2FkYXlzLCBpdCBpcyBiZXR0ZXIgdG8gY2hvb3NlIEBjb2Rle3N0cmNocn0gYW5kCi1AY29kZXtzdHJyY2hyfSBmb3IgbmV3IHByb2dyYW1zLCBzaW5jZSB0aG9zZSBhcmUgdGhlIHN0YW5kYXJkIEBzY3thbnNpfQotbmFtZXMuKSAgRGVjbGFyZSBib3RoIG9mIHRob3NlIG5hbWVzIGFzIGZ1bmN0aW9ucyByZXR1cm5pbmcgQGNvZGV7Y2hhcgotKn0uICBPbiBzeXN0ZW1zIHdoaWNoIGRvbid0IHN1cHBvcnQgdGhvc2UgbmFtZXMsIGRlZmluZSB0aGVtIGFzIG1hY3JvcwotaW4gdGVybXMgb2YgdGhlIG90aGVyIHBhaXIuICBGb3IgZXhhbXBsZSwgaGVyZSBpcyB3aGF0IHRvIHB1dCBhdCB0aGUKLWJlZ2lubmluZyBvZiB5b3VyIGZpbGUgKG9yIGluIGEgaGVhZGVyKSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIG5hbWVzCi1AY29kZXtzdHJjaHJ9IGFuZCBAY29kZXtzdHJyY2hyfSB0aHJvdWdob3V0OgotCi1AZXhhbXBsZQotI2lmbmRlZiBIQVZFX1NUUkNIUgotI2RlZmluZSBzdHJjaHIgaW5kZXgKLSNlbmRpZgotI2lmbmRlZiBIQVZFX1NUUlJDSFIKLSNkZWZpbmUgc3RycmNociByaW5kZXgKLSNlbmRpZgotCi1jaGFyICpzdHJjaHIgKCk7Ci1jaGFyICpzdHJyY2hyICgpOwotQGVuZCBleGFtcGxlCi1AZW5kIGl0ZW1pemUKLQotSGVyZSB3ZSBhc3N1bWUgdGhhdCBAY29kZXtIQVZFX1NUUkNIUn0gYW5kIEBjb2Rle0hBVkVfU1RSUkNIUn0gYXJlCi1tYWNyb3MgZGVmaW5lZCBpbiBzeXN0ZW1zIHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9ucyBleGlzdC4KLU9uZSB3YXkgdG8gZ2V0IHRoZW0gcHJvcGVybHkgZGVmaW5lZCBpcyB0byB1c2UgQXV0b2NvbmYuCi0KLUBub2RlIEludGVybmF0aW9uYWxpemF0aW9uCi1Ac2VjdGlvbiBJbnRlcm5hdGlvbmFsaXphdGlvbgotCi1HTlUgaGFzIGEgbGlicmFyeSBjYWxsZWQgR05VIGdldHRleHQgdGhhdCBtYWtlcyBpdCBlYXN5IHRvIHRyYW5zbGF0ZSB0aGUKLW1lc3NhZ2VzIGluIGEgcHJvZ3JhbSBpbnRvIHZhcmlvdXMgbGFuZ3VhZ2VzLiAgWW91IHNob3VsZCB1c2UgdGhpcwotbGlicmFyeSBpbiBldmVyeSBwcm9ncmFtLiAgVXNlIEVuZ2xpc2ggZm9yIHRoZSBtZXNzYWdlcyBhcyB0aGV5IGFwcGVhcgotaW4gdGhlIHByb2dyYW0sIGFuZCBsZXQgZ2V0dGV4dCBwcm92aWRlIHRoZSB3YXkgdG8gdHJhbnNsYXRlIHRoZW0gaW50bwotb3RoZXIgbGFuZ3VhZ2VzLgotCi1Vc2luZyBHTlUgZ2V0dGV4dCBpbnZvbHZlcyBwdXR0aW5nIGEgY2FsbCB0byB0aGUgQGNvZGV7Z2V0dGV4dH0gbWFjcm8KLWFyb3VuZCBlYWNoIHN0cmluZyB0aGF0IG1pZ2h0IG5lZWQgdHJhbnNsYXRpb24tLS1saWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1wcmludGYgKGdldHRleHQgKCJQcm9jZXNzaW5nIGZpbGUgYCVzJy4uLiIpKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoaXMgcGVybWl0cyBHTlUgZ2V0dGV4dCB0byByZXBsYWNlIHRoZSBzdHJpbmcgQGNvZGV7IlByb2Nlc3NpbmcgZmlsZQotYCVzJy4uLiJ9IHdpdGggYSB0cmFuc2xhdGVkIHZlcnNpb24uCi0KLU9uY2UgYSBwcm9ncmFtIHVzZXMgZ2V0dGV4dCwgcGxlYXNlIG1ha2UgYSBwb2ludCBvZiB3cml0aW5nIGNhbGxzIHRvCi1AY29kZXtnZXR0ZXh0fSB3aGVuIHlvdSBhZGQgbmV3IHN0cmluZ3MgdGhhdCBjYWxsIGZvciB0cmFuc2xhdGlvbi4KLQotVXNpbmcgR05VIGdldHRleHQgaW4gYSBwYWNrYWdlIGludm9sdmVzIHNwZWNpZnlpbmcgYSBAZGZue3RleHQgZG9tYWluCi1uYW1lfSBmb3IgdGhlIHBhY2thZ2UuICBUaGUgdGV4dCBkb21haW4gbmFtZSBpcyB1c2VkIHRvIHNlcGFyYXRlIHRoZQotdHJhbnNsYXRpb25zIGZvciB0aGlzIHBhY2thZ2UgZnJvbSB0aGUgdHJhbnNsYXRpb25zIGZvciBvdGhlciBwYWNrYWdlcy4KLU5vcm1hbGx5LCB0aGUgdGV4dCBkb21haW4gbmFtZSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlCi1wYWNrYWdlLS0tZm9yIGV4YW1wbGUsIEBzYW1we2ZpbGV1dGlsc30gZm9yIHRoZSBHTlUgZmlsZSB1dGlsaXRpZXMuCi0KLVRvIGVuYWJsZSBnZXR0ZXh0IHRvIHdvcmsgd2VsbCwgYXZvaWQgd3JpdGluZyBjb2RlIHRoYXQgbWFrZXMKLWFzc3VtcHRpb25zIGFib3V0IHRoZSBzdHJ1Y3R1cmUgb2Ygd29yZHMgb3Igc2VudGVuY2VzLiAgV2hlbiB5b3Ugd2FudAotdGhlIHByZWNpc2UgdGV4dCBvZiBhIHNlbnRlbmNlIHRvIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBkYXRhLCB1c2UgdHdvIG9yCi1tb3JlIGFsdGVybmF0aXZlIHN0cmluZyBjb25zdGFudHMgZWFjaCBjb250YWluaW5nIGEgY29tcGxldGUgc2VudGVuY2VzLAotcmF0aGVyIHRoYW4gaW5zZXJ0aW5nIGNvbmRpdGlvbmFsaXplZCB3b3JkcyBvciBwaHJhc2VzIGludG8gYSBzaW5nbGUKLXNlbnRlbmNlIGZyYW1ld29yay4KLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIHdoYXQgbm90IHRvIGRvOgotCi1AZXhhbXBsZQotcHJpbnRmICgiJWQgZmlsZSVzIHByb2Nlc3NlZCIsIG5maWxlcywKLSAgICAgICAgbmZpbGVzICE9IDEgPyAicyIgOiAiIik7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGUgcHJvYmxlbSB3aXRoIHRoYXQgZXhhbXBsZSBpcyB0aGF0IGl0IGFzc3VtZXMgdGhhdCBwbHVyYWxzIGFyZSBtYWRlCi1ieSBhZGRpbmcgYHMnLiAgSWYgeW91IGFwcGx5IGdldHRleHQgdG8gdGhlIGZvcm1hdCBzdHJpbmcsIGxpa2UgdGhpcywKLQotQGV4YW1wbGUKLXByaW50ZiAoZ2V0dGV4dCAoIiVkIGZpbGUlcyBwcm9jZXNzZWQiKSwgbmZpbGVzLAotICAgICAgICBuZmlsZXMgIT0gMSA/ICJzIiA6ICIiKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLXRoZSBtZXNzYWdlIGNhbiB1c2UgZGlmZmVyZW50IHdvcmRzLCBidXQgaXQgd2lsbCBzdGlsbCBiZSBmb3JjZWQgdG8gdXNlCi1gcycgZm9yIHRoZSBwbHVyYWwuICBIZXJlIGlzIGEgYmV0dGVyIHdheToKLQotQGV4YW1wbGUKLXByaW50ZiAoKG5maWxlcyAhPSAxID8gIiVkIGZpbGVzIHByb2Nlc3NlZCIKLSAgICAgICAgIDogIiVkIGZpbGUgcHJvY2Vzc2VkIiksCi0gICAgICAgIG5maWxlcyk7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGlzIHdheSwgeW91IGNhbiBhcHBseSBnZXR0ZXh0IHRvIGVhY2ggb2YgdGhlIHR3byBzdHJpbmdzCi1pbmRlcGVuZGVudGx5OgotCi1AZXhhbXBsZQotcHJpbnRmICgobmZpbGVzICE9IDEgPyBnZXR0ZXh0ICgiJWQgZmlsZXMgcHJvY2Vzc2VkIikKLSAgICAgICAgIDogZ2V0dGV4dCAoIiVkIGZpbGUgcHJvY2Vzc2VkIikpLAotICAgICAgICBuZmlsZXMpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotVGhpcyBjYW4gYmUgYW55IG1ldGhvZCBvZiBmb3JtaW5nIHRoZSBwbHVyYWwgb2YgdGhlIHdvcmQgZm9yIGBgZmlsZScnLCBhbmQKLWFsc28gaGFuZGxlcyBsYW5ndWFnZXMgdGhhdCByZXF1aXJlIGFncmVlbWVudCBpbiB0aGUgd29yZCBmb3IKLWBgcHJvY2Vzc2VkJycuCi0KLUEgc2ltaWxhciBwcm9ibGVtIGFwcGVhcnMgYXQgdGhlIGxldmVsIG9mIHNlbnRlbmNlIHN0cnVjdHVyZSB3aXRoIHRoaXMKLWNvZGU6Ci0KLUBleGFtcGxlCi1wcmludGYgKCIjICBJbXBsaWNpdCBydWxlIHNlYXJjaCBoYXMlcyBiZWVuIGRvbmUuXG4iLAotICAgICAgICBmLT50cmllZF9pbXBsaWNpdCA/ICIiIDogIiBub3QiKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLUFkZGluZyBAY29kZXtnZXR0ZXh0fSBjYWxscyB0byB0aGlzIGNvZGUgY2Fubm90IGdpdmUgY29ycmVjdCByZXN1bHRzIGZvcgotYWxsIGxhbmd1YWdlcywgYmVjYXVzZSBuZWdhdGlvbiBpbiBzb21lIGxhbmd1YWdlcyByZXF1aXJlcyBhZGRpbmcgd29yZHMKLWF0IG1vcmUgdGhhbiBvbmUgcGxhY2UgaW4gdGhlIHNlbnRlbmNlLiAgQnkgY29udHJhc3QsIGFkZGluZwotQGNvZGV7Z2V0dGV4dH0gY2FsbHMgZG9lcyB0aGUgam9iIHN0cmFpZ2h0Zm93YXJkbHkgaWYgdGhlIGNvZGUgc3RhcnRzCi1vdXQgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotcHJpbnRmIChmLT50cmllZF9pbXBsaWNpdAotICAgICAgICA/ICIjICBJbXBsaWNpdCBydWxlIHNlYXJjaCBoYXMgYmVlbiBkb25lLlxuIiwKLSAgICAgICAgOiAiIyAgSW1wbGljaXQgcnVsZSBzZWFyY2ggaGFzIG5vdCBiZWVuIGRvbmUuXG4iKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBNbWFwCi1Ac2VjdGlvbiBNbWFwCi0KLURvbid0IGFzc3VtZSB0aGF0IEBjb2Rle21tYXB9IGVpdGhlciB3b3JrcyBvbiBhbGwgZmlsZXMgb3IgZmFpbHMKLWZvciBhbGwgZmlsZXMuICBJdCBtYXkgd29yayBvbiBzb21lIGZpbGVzIGFuZCBmYWlsIG9uIG90aGVycy4KLQotVGhlIHByb3BlciB3YXkgdG8gdXNlIEBjb2Rle21tYXB9IGlzIHRvIHRyeSBpdCBvbiB0aGUgc3BlY2lmaWMgZmlsZSBmb3IKLXdoaWNoIHlvdSB3YW50IHRvIHVzZSBpdC0tLWFuZCBpZiBAY29kZXttbWFwfSBkb2Vzbid0IHdvcmssIGZhbGwgYmFjayBvbgotZG9pbmcgdGhlIGpvYiBpbiBhbm90aGVyIHdheSB1c2luZyBAY29kZXtyZWFkfSBhbmQgQGNvZGV7d3JpdGV9LgotCi1UaGUgcmVhc29uIHRoaXMgcHJlY2F1dGlvbiBpcyBuZWVkZWQgaXMgdGhhdCB0aGUgR05VIGtlcm5lbCAodGhlIEhVUkQpCi1wcm92aWRlcyBhIHVzZXItZXh0ZW5zaWJsZSBmaWxlIHN5c3RlbSwgaW4gd2hpY2ggdGhlcmUgY2FuIGJlIG1hbnkKLWRpZmZlcmVudCBraW5kcyBvZiBgYG9yZGluYXJ5IGZpbGVzLicnICBNYW55IG9mIHRoZW0gc3VwcG9ydAotQGNvZGV7bW1hcH0sIGJ1dCBzb21lIGRvIG5vdC4gIEl0IGlzIGltcG9ydGFudCB0byBtYWtlIHByb2dyYW1zIGhhbmRsZQotYWxsIHRoZXNlIGtpbmRzIG9mIGZpbGVzLgotCi1Abm9kZSBEb2N1bWVudGF0aW9uCi1AY2hhcHRlciBEb2N1bWVudGluZyBQcm9ncmFtcwotCi1AbWVudQotKiBHTlUgTWFudWFsczo6ICAgICAgICAgICAgICAgICBXcml0aW5nIHByb3BlciBtYW51YWxzLgotKiBNYW51YWwgU3RydWN0dXJlIERldGFpbHM6OiAgICBTcGVjaWZpYyBzdHJ1Y3R1cmUgY29udmVudGlvbnMuCi0qIE5FV1MgRmlsZTo6ICAgICAgICAgICAgICAgICAgIE5FV1MgZmlsZXMgc3VwcGxlbWVudCBtYW51YWxzLgotKiBDaGFuZ2UgTG9nczo6ICAgICAgICAgICAgICAgICBSZWNvcmRpbmcgQ2hhbmdlcwotKiBNYW4gUGFnZXM6OiAgICAgICAgICAgICAgICAgICBNYW4gcGFnZXMgYXJlIHNlY29uZGFyeS4KLSogUmVhZGluZyBvdGhlciBNYW51YWxzOjogICAgICAgSG93IGZhciB5b3UgY2FuIGdvIGluIGxlYXJuaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gb3RoZXIgbWFudWFscy4KLUBlbmQgbWVudQotCi1Abm9kZSBHTlUgTWFudWFscwotQHNlY3Rpb24gR05VIE1hbnVhbHMKLQotVGhlIHByZWZlcnJlZCB3YXkgdG8gZG9jdW1lbnQgcGFydCBvZiB0aGUgR05VIHN5c3RlbSBpcyB0byB3cml0ZSBhCi1tYW51YWwgaW4gdGhlIFRleGluZm8gZm9ybWF0dGluZyBsYW5ndWFnZS4gIFNlZSB0aGUgVGV4aW5mbyBtYW51YWwsCi1laXRoZXIgdGhlIGhhcmRjb3B5LCBvciB0aGUgb24tbGluZSB2ZXJzaW9uIGF2YWlsYWJsZSB0aHJvdWdoCi1AY29kZXtpbmZvfSBvciB0aGUgRW1hY3MgSW5mbyBzdWJzeXN0ZW0gKEBrYmR7Qy1oIGl9KS4KLQotUHJvZ3JhbW1lcnMgb2Z0ZW4gZmluZCBpdCBtb3N0IG5hdHVyYWwgdG8gc3RydWN0dXJlIHRoZSBkb2N1bWVudGF0aW9uCi1mb2xsb3dpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHdoaWNoIHRoZXkga25vdy4gIEJ1dAotdGhpcyBzdHJ1Y3R1cmUgaXMgbm90IG5lY2Vzc2FyaWx5IGdvb2QgZm9yIGV4cGxhaW5pbmcgaG93IHRvIHVzZSB0aGUKLXByb2dyYW07IGl0IG1heSBiZSBpcnJlbGV2YW50IGFuZCBjb25mdXNpbmcgZm9yIGEgdXNlci4KLQotQXQgZXZlcnkgbGV2ZWwsIGZyb20gdGhlIHNlbnRlbmNlcyBpbiBhIHBhcmFncmFwaCB0byB0aGUgZ3JvdXBpbmcgb2YKLXRvcGljcyBpbnRvIHNlcGFyYXRlIG1hbnVhbHMsIHRoZSByaWdodCB3YXkgdG8gc3RydWN0dXJlIGRvY3VtZW50YXRpb24KLWlzIGFjY29yZGluZyB0byB0aGUgY29uY2VwdHMgYW5kIHF1ZXN0aW9ucyB0aGF0IGEgdXNlciB3aWxsIGhhdmUgaW4gbWluZAotd2hlbiByZWFkaW5nIGl0LiAgU29tZXRpbWVzIHRoaXMgc3RydWN0dXJlIG9mIGlkZWFzIG1hdGNoZXMgdGhlCi1zdHJ1Y3R1cmUgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzb2Z0d2FyZSBiZWluZyBkb2N1bWVudGVkLS0tYnV0Ci1vZnRlbiB0aGV5IGFyZSBkaWZmZXJlbnQuICBPZnRlbiB0aGUgbW9zdCBpbXBvcnRhbnQgcGFydCBvZiBsZWFybmluZyB0bwotd3JpdGUgZ29vZCBkb2N1bWVudGF0aW9uIGlzIGxlYXJuaW5nIHRvIG5vdGljZSB3aGVuIHlvdSBhcmUgc3RydWN0dXJpbmcKLXRoZSBkb2N1bWVudGF0aW9uIGxpa2UgdGhlIGltcGxlbWVudGF0aW9uLCBhbmQgdGhpbmsgYWJvdXQgYmV0dGVyCi1hbHRlcm5hdGl2ZXMuCi0KLUZvciBleGFtcGxlLCBlYWNoIHByb2dyYW0gaW4gdGhlIEdOVSBzeXN0ZW0gcHJvYmFibHkgb3VnaHQgdG8gYmUKLWRvY3VtZW50ZWQgaW4gb25lIG1hbnVhbDsgYnV0IHRoaXMgZG9lcyBub3QgbWVhbiBlYWNoIHByb2dyYW0gc2hvdWxkCi1oYXZlIGl0cyBvd24gbWFudWFsLiAgVGhhdCB3b3VsZCBiZSBmb2xsb3dpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUKLWltcGxlbWVudGF0aW9uLCByYXRoZXIgdGhhbiB0aGUgc3RydWN0dXJlIHRoYXQgaGVscHMgdGhlIHVzZXIKLXVuZGVyc3RhbmQuCi0KLUluc3RlYWQsIGVhY2ggbWFudWFsIHNob3VsZCBjb3ZlciBhIGNvaGVyZW50IEBlbXBoe3RvcGljfS4gIEZvciBleGFtcGxlLAotaW5zdGVhZCBvZiBhIG1hbnVhbCBmb3IgQGNvZGV7ZGlmZn0gYW5kIGEgbWFudWFsIGZvciBAY29kZXtkaWZmM30sIHdlCi1oYXZlIG9uZSBtYW51YWwgZm9yIGBgY29tcGFyaXNvbiBvZiBmaWxlcycnIHdoaWNoIGNvdmVycyBib3RoIG9mIHRob3NlCi1wcm9ncmFtcywgYXMgd2VsbCBhcyBAY29kZXtjbXB9LiAgQnkgZG9jdW1lbnRpbmcgdGhlc2UgcHJvZ3JhbXMKLXRvZ2V0aGVyLCB3ZSBjYW4gbWFrZSB0aGUgd2hvbGUgc3ViamVjdCBjbGVhcmVyLgotCi1UaGUgbWFudWFsIHdoaWNoIGRpc2N1c3NlcyBhIHByb2dyYW0gc2hvdWxkIGRvY3VtZW50IGFsbCBvZiB0aGUKLXByb2dyYW0ncyBjb21tYW5kLWxpbmUgb3B0aW9ucyBhbmQgYWxsIG9mIGl0cyBjb21tYW5kcy4gIEl0IHNob3VsZCBnaXZlCi1leGFtcGxlcyBvZiB0aGVpciB1c2UuICBCdXQgZG9uJ3Qgb3JnYW5pemUgdGhlIG1hbnVhbCBhcyBhIGxpc3Qgb2YKLWZlYXR1cmVzLiAgSW5zdGVhZCwgb3JnYW5pemUgaXQgbG9naWNhbGx5LCBieSBzdWJ0b3BpY3MuICBBZGRyZXNzIHRoZQotcXVlc3Rpb25zIHRoYXQgYSB1c2VyIHdpbGwgYXNrIHdoZW4gdGhpbmtpbmcgYWJvdXQgdGhlIGpvYiB0aGF0IHRoZQotcHJvZ3JhbSBkb2VzLgotCi1JbiBnZW5lcmFsLCBhIEdOVSBtYW51YWwgc2hvdWxkIHNlcnZlIGJvdGggYXMgdHV0b3JpYWwgYW5kIHJlZmVyZW5jZS4KLUl0IHNob3VsZCBiZSBzZXQgdXAgZm9yIGNvbnZlbmllbnQgYWNjZXNzIHRvIGVhY2ggdG9waWMgdGhyb3VnaCBJbmZvLAotYW5kIGZvciByZWFkaW5nIHN0cmFpZ2h0IHRocm91Z2ggKGFwcGVuZGl4ZXMgYXNpZGUpLiAgQSBHTlUgbWFudWFsCi1zaG91bGQgZ2l2ZSBhIGdvb2QgaW50cm9kdWN0aW9uIHRvIGEgYmVnaW5uZXIgcmVhZGluZyB0aHJvdWdoIGZyb20gdGhlCi1zdGFydCwgYW5kIHNob3VsZCBhbHNvIHByb3ZpZGUgYWxsIHRoZSBkZXRhaWxzIHRoYXQgaGFja2VycyB3YW50LgotCi1UaGF0IGlzIG5vdCBhcyBoYXJkIGFzIGl0IGZpcnN0IHNvdW5kcy4gIEFycmFuZ2UgZWFjaCBjaGFwdGVyIGFzIGEKLWxvZ2ljYWwgYnJlYWtkb3duIG9mIGl0cyB0b3BpYywgYnV0IG9yZGVyIHRoZSBzZWN0aW9ucywgYW5kIHdyaXRlIHRoZWlyCi10ZXh0LCBzbyB0aGF0IHJlYWRpbmcgdGhlIGNoYXB0ZXIgc3RyYWlnaHQgdGhyb3VnaCBtYWtlcyBzZW5zZS4gIERvCi1saWtld2lzZSB3aGVuIHN0cnVjdHVyaW5nIHRoZSBib29rIGludG8gY2hhcHRlcnMsIGFuZCB3aGVuIHN0cnVjdHVyaW5nIGEKLXNlY3Rpb24gaW50byBwYXJhZ3JhcGhzLiAgVGhlIHdhdGNod29yZCBpcywgQGVtcGh7YXQgZWFjaCBwb2ludCwgYWRkcmVzcwotdGhlIG1vc3QgZnVuZGFtZW50YWwgYW5kIGltcG9ydGFudCBpc3N1ZSByYWlzZWQgYnkgdGhlIHByZWNlZGluZyB0ZXh0Ln0KLQotSWYgbmVjZXNzYXJ5LCBhZGQgZXh0cmEgY2hhcHRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWFudWFsIHdoaWNoCi1hcmUgcHVyZWx5IHR1dG9yaWFsIGFuZCBjb3ZlciB0aGUgYmFzaWNzIG9mIHRoZSBzdWJqZWN0LiAgVGhlc2UgcHJvdmlkZQotdGhlIGZyYW1ld29yayBmb3IgYSBiZWdpbm5lciB0byB1bmRlcnN0YW5kIHRoZSByZXN0IG9mIHRoZSBtYW51YWwuICBUaGUKLUJpc29uIG1hbnVhbCBwcm92aWRlcyBhIGdvb2QgZXhhbXBsZSBvZiBob3cgdG8gZG8gdGhpcy4KLQotRG9uJ3QgdXNlIFVuaXggbWFuIHBhZ2VzIGFzIGEgbW9kZWwgZm9yIGhvdyB0byB3cml0ZSBHTlUgZG9jdW1lbnRhdGlvbjsKLW1vc3Qgb2YgdGhlbSBhcmUgdGVyc2UsIGJhZGx5IHN0cnVjdHVyZWQsIGFuZCBnaXZlIGluYWRlcXVhdGUKLWV4cGxhbmF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIGNvbmNlcHRzLiAgKFRoZXJlIGFyZSwgb2YgY291cnNlCi1leGNlcHRpb25zLikgIEFsc28gVW5peCBtYW4gcGFnZXMgdXNlIGEgcGFydGljdWxhciBmb3JtYXQgd2hpY2ggaXMKLWRpZmZlcmVudCBmcm9tIHdoYXQgd2UgdXNlIGluIEdOVSBtYW51YWxzLgotCi1QbGVhc2UgZG8gbm90IHVzZSB0aGUgdGVybSBgYHBhdGhuYW1lJycgdGhhdCBpcyB1c2VkIGluIFVuaXgKLWRvY3VtZW50YXRpb247IHVzZSBgYGZpbGUgbmFtZScnICh0d28gd29yZHMpIGluc3RlYWQuICBXZSB1c2UgdGhlIHRlcm0KLWBgcGF0aCcnIG9ubHkgZm9yIHNlYXJjaCBwYXRocywgd2hpY2ggYXJlIGxpc3RzIG9mIGZpbGUgbmFtZXMuCi0KLVBsZWFzZSBkbyBub3QgdXNlIHRoZSB0ZXJtIGBgaWxsZWdhbCcnIHRvIHJlZmVyIHRvIGVycm9uZW91cyBpbnB1dCB0byBhCi1jb21wdXRlciBwcm9ncmFtLiAgUGxlYXNlIHVzZSBgYGludmFsaWQnJyBmb3IgdGhpcywgYW5kIHJlc2VydmUgdGhlIHRlcm0KLWBgaWxsZWdhbCcnIGZvciB2aW9sYXRpb25zIG9mIGxhdy4KLQotQG5vZGUgTWFudWFsIFN0cnVjdHVyZSBEZXRhaWxzCi1Ac2VjdGlvbiBNYW51YWwgU3RydWN0dXJlIERldGFpbHMKLQotVGhlIHRpdGxlIHBhZ2Ugb2YgdGhlIG1hbnVhbCBzaG91bGQgc3RhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHByb2dyYW1zIG9yCi1wYWNrYWdlcyBkb2N1bWVudGVkIGluIHRoZSBtYW51YWwuICBUaGUgVG9wIG5vZGUgb2YgdGhlIG1hbnVhbCBzaG91bGQKLWFsc28gY29udGFpbiB0aGlzIGluZm9ybWF0aW9uLiAgSWYgdGhlIG1hbnVhbCBpcyBjaGFuZ2luZyBtb3JlCi1mcmVxdWVudGx5IHRoYW4gb3IgaW5kZXBlbmRlbnQgb2YgdGhlIHByb2dyYW0sIGFsc28gc3RhdGUgYSB2ZXJzaW9uCi1udW1iZXIgZm9yIHRoZSBtYW51YWwgaW4gYm90aCBvZiB0aGVzZSBwbGFjZXMuCi0KLUVhY2ggcHJvZ3JhbSBkb2N1bWVudGVkIGluIHRoZSBtYW51YWwgc2hvdWxkIHNob3VsZCBoYXZlIGEgbm9kZSBuYW1lZAotQHNhbXB7QHZhcntwcm9ncmFtfSBJbnZvY2F0aW9ufSBvciBAc2FtcHtJbnZva2luZyBAdmFye3Byb2dyYW19fS4gIFRoaXMKLW5vZGUgKHRvZ2V0aGVyIHdpdGggaXRzIHN1Ym5vZGVzLCBpZiBhbnkpIHNob3VsZCBkZXNjcmliZSB0aGUgcHJvZ3JhbSdzCi1jb21tYW5kIGxpbmUgYXJndW1lbnRzIGFuZCBob3cgdG8gcnVuIGl0ICh0aGUgc29ydCBvZiBpbmZvcm1hdGlvbiBwZW9wbGUKLXdvdWxkIGxvb2sgaW4gYSBtYW4gcGFnZSBmb3IpLiAgU3RhcnQgd2l0aCBhbiBAc2FtcHtAQGV4YW1wbGV9Ci1jb250YWluaW5nIGEgdGVtcGxhdGUgZm9yIGFsbCB0aGUgb3B0aW9ucyBhbmQgYXJndW1lbnRzIHRoYXQgdGhlIHByb2dyYW0KLXVzZXMuCi0KLUFsdGVybmF0aXZlbHksIHB1dCBhIG1lbnUgaXRlbSBpbiBzb21lIG1lbnUgd2hvc2UgaXRlbSBuYW1lIGZpdHMgb25lIG9mCi10aGUgYWJvdmUgcGF0dGVybnMuICBUaGlzIGlkZW50aWZpZXMgdGhlIG5vZGUgd2hpY2ggdGhhdCBpdGVtIHBvaW50cyB0bwotYXMgdGhlIG5vZGUgZm9yIHRoaXMgcHVycG9zZSwgcmVnYXJkbGVzcyBvZiB0aGUgbm9kZSdzIGFjdHVhbCBuYW1lLgotCi1UaGVyZSB3aWxsIGJlIGF1dG9tYXRpYyBmZWF0dXJlcyBmb3Igc3BlY2lmeWluZyBhIHByb2dyYW0gbmFtZSBhbmQKLXF1aWNrbHkgcmVhZGluZyBqdXN0IHRoaXMgcGFydCBvZiBpdHMgbWFudWFsLgotCi1JZiBvbmUgbWFudWFsIGRlc2NyaWJlcyBzZXZlcmFsIHByb2dyYW1zLCBpdCBzaG91bGQgaGF2ZSBzdWNoIGEgbm9kZSBmb3IKLWVhY2ggcHJvZ3JhbSBkZXNjcmliZWQuCi0KLUBub2RlIE5FV1MgRmlsZQotQHNlY3Rpb24gVGhlIE5FV1MgRmlsZQotCi1JbiBhZGRpdGlvbiB0byBpdHMgbWFudWFsLCB0aGUgcGFja2FnZSBzaG91bGQgaGF2ZSBhIGZpbGUgbmFtZWQKLUBmaWxle05FV1N9IHdoaWNoIGNvbnRhaW5zIGEgbGlzdCBvZiB1c2VyLXZpc2libGUgY2hhbmdlcyB3b3J0aAotbWVudGlvbmluZy4gIEluIGVhY2ggbmV3IHJlbGVhc2UsIGFkZCBpdGVtcyB0byB0aGUgZnJvbnQgb2YgdGhlIGZpbGUgYW5kCi1pZGVudGlmeSB0aGUgdmVyc2lvbiB0aGV5IHBlcnRhaW4gdG8uICBEb24ndCBkaXNjYXJkIG9sZCBpdGVtczsgbGVhdmUKLXRoZW0gaW4gdGhlIGZpbGUgYWZ0ZXIgdGhlIG5ld2VyIGl0ZW1zLiAgVGhpcyB3YXksIGEgdXNlciB1cGdyYWRpbmcgZnJvbQotYW55IHByZXZpb3VzIHZlcnNpb24gY2FuIHNlZSB3aGF0IGlzIG5ldy4KLQotSWYgdGhlIEBmaWxle05FV1N9IGZpbGUgZ2V0cyB2ZXJ5IGxvbmcsIG1vdmUgc29tZSBvZiB0aGUgb2xkZXIgaXRlbXMKLWludG8gYSBmaWxlIG5hbWVkIEBmaWxle09ORVdTfSBhbmQgcHV0IGEgbm90ZSBhdCB0aGUgZW5kIHJlZmVycmluZyB0aGUKLXVzZXIgdG8gdGhhdCBmaWxlLgotCi1Abm9kZSBDaGFuZ2UgTG9ncwotQHNlY3Rpb24gQ2hhbmdlIExvZ3MKLQotS2VlcCBhIGNoYW5nZSBsb2cgdG8gZGVzY3JpYmUgYWxsIHRoZSBjaGFuZ2VzIG1hZGUgdG8gcHJvZ3JhbSBzb3VyY2UKLWZpbGVzLiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyBzbyB0aGF0IHBlb3BsZSBpbnZlc3RpZ2F0aW5nIGJ1Z3MgaW4gdGhlCi1mdXR1cmUgd2lsbCBrbm93IGFib3V0IHRoZSBjaGFuZ2VzIHRoYXQgbWlnaHQgaGF2ZSBpbnRyb2R1Y2VkIHRoZSBidWcuCi1PZnRlbiBhIG5ldyBidWcgY2FuIGJlIGZvdW5kIGJ5IGxvb2tpbmcgYXQgd2hhdCB3YXMgcmVjZW50bHkgY2hhbmdlZC4KLU1vcmUgaW1wb3J0YW50bHksIGNoYW5nZSBsb2dzIGNhbiBoZWxwIHlvdSBlbGltaW5hdGUgY29uY2VwdHVhbAotaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gZGlmZmVyZW50IHBhcnRzIG9mIGEgcHJvZ3JhbSwgYnkgZ2l2aW5nIHlvdSBhCi1oaXN0b3J5IG9mIGhvdyB0aGUgY29uZmxpY3RpbmcgY29uY2VwdHMgYXJvc2UgYW5kIHdobyB0aGV5IGNhbWUgZnJvbS4KLQotQG1lbnUKLSogQ2hhbmdlIExvZyBDb25jZXB0czo6ICAgICAgICAgCi0qIFN0eWxlIG9mIENoYW5nZSBMb2dzOjogICAgICAgIAotKiBTaW1wbGUgQ2hhbmdlczo6ICAgICAgICAgICAgICAKLSogQ29uZGl0aW9uYWwgQ2hhbmdlczo6ICAgICAgICAgCi1AZW5kIG1lbnUKLQotQG5vZGUgQ2hhbmdlIExvZyBDb25jZXB0cwotQHN1YnNlY3Rpb24gQ2hhbmdlIExvZyBDb25jZXB0cwotCi1Zb3UgY2FuIHRoaW5rIG9mIHRoZSBjaGFuZ2UgbG9nIGFzIGEgY29uY2VwdHVhbCBgYHVuZG8gbGlzdCcnIHdoaWNoCi1leHBsYWlucyBob3cgZWFybGllciB2ZXJzaW9ucyB3ZXJlIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHZlcnNpb24uCi1QZW9wbGUgY2FuIHNlZSB0aGUgY3VycmVudCB2ZXJzaW9uOyB0aGV5IGRvbid0IG5lZWQgdGhlIGNoYW5nZSBsb2cKLXRvIHRlbGwgdGhlbSB3aGF0IGlzIGluIGl0LiAgV2hhdCB0aGV5IHdhbnQgZnJvbSBhIGNoYW5nZSBsb2cgaXMgYQotY2xlYXIgZXhwbGFuYXRpb24gb2YgaG93IHRoZSBlYXJsaWVyIHZlcnNpb24gZGlmZmVyZWQuCi0KLVRoZSBjaGFuZ2UgbG9nIGZpbGUgaXMgbm9ybWFsbHkgY2FsbGVkIEBmaWxle0NoYW5nZUxvZ30gYW5kIGNvdmVycyBhbgotZW50aXJlIGRpcmVjdG9yeS4gIEVhY2ggZGlyZWN0b3J5IGNhbiBoYXZlIGl0cyBvd24gY2hhbmdlIGxvZywgb3IgYQotZGlyZWN0b3J5IGNhbiB1c2UgdGhlIGNoYW5nZSBsb2cgb2YgaXRzIHBhcmVudCBkaXJlY3RvcnktLWl0J3MgdXAgdG8KLXlvdS4KLQotQW5vdGhlciBhbHRlcm5hdGl2ZSBpcyB0byByZWNvcmQgY2hhbmdlIGxvZyBpbmZvcm1hdGlvbiB3aXRoIGEgdmVyc2lvbgotY29udHJvbCBzeXN0ZW0gc3VjaCBhcyBSQ1Mgb3IgQ1ZTLiAgVGhpcyBjYW4gYmUgY29udmVydGVkIGF1dG9tYXRpY2FsbHkKLXRvIGEgQGZpbGV7Q2hhbmdlTG9nfSBmaWxlLgotCi1UaGVyZSdzIG5vIG5lZWQgdG8gZGVzY3JpYmUgdGhlIGZ1bGwgcHVycG9zZSBvZiB0aGUgY2hhbmdlcyBvciBob3cgdGhleQotd29yayB0b2dldGhlci4gIElmIHlvdSB0aGluayB0aGF0IGEgY2hhbmdlIGNhbGxzIGZvciBleHBsYW5hdGlvbiwgeW91J3JlCi1wcm9iYWJseSByaWdodC4gIFBsZWFzZSBkbyBleHBsYWluIGl0LS0tYnV0IHBsZWFzZSBwdXQgdGhlIGV4cGxhbmF0aW9uCi1pbiBjb21tZW50cyBpbiB0aGUgY29kZSwgd2hlcmUgcGVvcGxlIHdpbGwgc2VlIGl0IHdoZW5ldmVyIHRoZXkgc2VlIHRoZQotY29kZS4gIEZvciBleGFtcGxlLCBgYE5ldyBmdW5jdGlvbicnIGlzIGVub3VnaCBmb3IgdGhlIGNoYW5nZSBsb2cgd2hlbgoteW91IGFkZCBhIGZ1bmN0aW9uLCBiZWNhdXNlIHRoZXJlIHNob3VsZCBiZSBhIGNvbW1lbnQgYmVmb3JlIHRoZQotZnVuY3Rpb24gZGVmaW5pdGlvbiB0byBleHBsYWluIHdoYXQgaXQgZG9lcy4KLQotSG93ZXZlciwgc29tZXRpbWVzIGl0IGlzIHVzZWZ1bCB0byB3cml0ZSBvbmUgbGluZSB0byBkZXNjcmliZSB0aGUKLW92ZXJhbGwgcHVycG9zZSBvZiBhIGJhdGNoIG9mIGNoYW5nZXMuCi0KLVRoZSBlYXNpZXN0IHdheSB0byBhZGQgYW4gZW50cnkgdG8gQGZpbGV7Q2hhbmdlTG9nfSBpcyB3aXRoIHRoZSBFbWFjcwotY29tbWFuZCBAa2Jke00teCBhZGQtY2hhbmdlLWxvZy1lbnRyeX0uICBBbiBlbnRyeSBzaG91bGQgaGF2ZSBhbgotYXN0ZXJpc2ssIHRoZSBuYW1lIG9mIHRoZSBjaGFuZ2VkIGZpbGUsIGFuZCB0aGVuIGluIHBhcmVudGhlc2VzIHRoZSBuYW1lCi1vZiB0aGUgY2hhbmdlZCBmdW5jdGlvbnMsIHZhcmlhYmxlcyBvciB3aGF0ZXZlciwgZm9sbG93ZWQgYnkgYSBjb2xvbi4KLVRoZW4gZGVzY3JpYmUgdGhlIGNoYW5nZXMgeW91IG1hZGUgdG8gdGhhdCBmdW5jdGlvbiBvciB2YXJpYWJsZS4KLQotQG5vZGUgU3R5bGUgb2YgQ2hhbmdlIExvZ3MKLUBzdWJzZWN0aW9uIFN0eWxlIG9mIENoYW5nZSBMb2dzCi0KLUhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgY2hhbmdlIGxvZyBlbnRyaWVzOgotCi1AZXhhbXBsZQotKiByZWdpc3Rlci5lbCAoaW5zZXJ0LXJlZ2lzdGVyKTogUmV0dXJuIG5pbC4KLShqdW1wLXRvLXJlZ2lzdGVyKTogTGlrZXdpc2UuCi0KLSogc29ydC5lbCAoc29ydC1zdWJyKTogUmV0dXJuIG5pbC4KLQotKiB0ZXgtbW9kZS5lbCAodGV4LWJpYnRleC1maWxlLCB0ZXgtZmlsZSwgdGV4LXJlZ2lvbik6Ci1SZXN0YXJ0IHRoZSB0ZXggc2hlbGwgaWYgcHJvY2VzcyBpcyBnb25lIG9yIHN0b3BwZWQuCi0odGV4LXNoZWxsLXJ1bm5pbmcpOiBOZXcgZnVuY3Rpb24uCi0KLSogZXhwci5jIChzdG9yZV9vbmVfYXJnKTogUm91bmQgc2l6ZSB1cCBmb3IgbW92ZV9ibG9ja190b19yZWcuCi0oZXhwYW5kX2NhbGwpOiBSb3VuZCB1cCB3aGVuIGVtaXR0aW5nIFVTRSBpbnNucy4KLSogc3RtdC5jIChhc3NpZ25fcGFybXMpOiBSb3VuZCBzaXplIHVwIGZvciBtb3ZlX2Jsb2NrX2Zyb21fcmVnLgotQGVuZCBleGFtcGxlCi0KLUl0J3MgaW1wb3J0YW50IHRvIG5hbWUgdGhlIGNoYW5nZWQgZnVuY3Rpb24gb3IgdmFyaWFibGUgaW4gZnVsbC4gIERvbid0Ci1hYmJyZXZpYXRlIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIG5hbWVzLCBhbmQgZG9uJ3QgY29tYmluZSB0aGVtLgotU3Vic2VxdWVudCBtYWludGFpbmVycyB3aWxsIG9mdGVuIHNlYXJjaCBmb3IgYSBmdW5jdGlvbiBuYW1lIHRvIGZpbmQgYWxsCi10aGUgY2hhbmdlIGxvZyBlbnRyaWVzIHRoYXQgcGVydGFpbiB0byBpdDsgaWYgeW91IGFiYnJldmlhdGUgdGhlIG5hbWUsCi10aGV5IHdvbid0IGZpbmQgaXQgd2hlbiB0aGV5IHNlYXJjaC4KLQotRm9yIGV4YW1wbGUsIHNvbWUgcGVvcGxlIGFyZSB0ZW1wdGVkIHRvIGFiYnJldmlhdGUgZ3JvdXBzIG9mIGZ1bmN0aW9uCi1uYW1lcyBieSB3cml0aW5nIEBzYW1weyogcmVnaXN0ZXIuZWwgKEB7aW5zZXJ0LGp1bXAtdG9AfS1yZWdpc3Rlcil9OwotdGhpcyBpcyBub3QgYSBnb29kIGlkZWEsIHNpbmNlIHNlYXJjaGluZyBmb3IgQGNvZGV7anVtcC10by1yZWdpc3Rlcn0gb3IKLUBjb2Rle2luc2VydC1yZWdpc3Rlcn0gd291bGQgbm90IGZpbmQgdGhhdCBlbnRyeS4KLQotU2VwYXJhdGUgdW5yZWxhdGVkIGNoYW5nZSBsb2cgZW50cmllcyB3aXRoIGJsYW5rIGxpbmVzLiAgV2hlbiB0d28KLWVudHJpZXMgcmVwcmVzZW50IHBhcnRzIG9mIHRoZSBzYW1lIGNoYW5nZSwgc28gdGhhdCB0aGV5IHdvcmsgdG9nZXRoZXIsCi10aGVuIGRvbid0IHB1dCBibGFuayBsaW5lcyBiZXR3ZWVuIHRoZW0uICBUaGVuIHlvdSBjYW4gb21pdCB0aGUgZmlsZQotbmFtZSBhbmQgdGhlIGFzdGVyaXNrIHdoZW4gc3VjY2Vzc2l2ZSBlbnRyaWVzIGFyZSBpbiB0aGUgc2FtZSBmaWxlLgotCi1Abm9kZSBTaW1wbGUgQ2hhbmdlcwotQHN1YnNlY3Rpb24gU2ltcGxlIENoYW5nZXMKLQotQ2VydGFpbiBzaW1wbGUga2luZHMgb2YgY2hhbmdlcyBkb24ndCBuZWVkIG11Y2ggZGV0YWlsIGluIHRoZSBjaGFuZ2UKLWxvZy4KLQotV2hlbiB5b3UgY2hhbmdlIHRoZSBjYWxsaW5nIHNlcXVlbmNlIG9mIGEgZnVuY3Rpb24gaW4gYSBzaW1wbGUgZmFzaGlvbiwKLWFuZCB5b3UgY2hhbmdlIGFsbCB0aGUgY2FsbGVycyBvZiB0aGUgZnVuY3Rpb24sIHRoZXJlIGlzIG5vIG5lZWQgdG8gbWFrZQotaW5kaXZpZHVhbCBlbnRyaWVzIGZvciBhbGwgdGhlIGNhbGxlcnMgdGhhdCB5b3UgY2hhbmdlZC4gIEp1c3Qgd3JpdGUgaW4KLXRoZSBlbnRyeSBmb3IgdGhlIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZCwgYGBBbGwgY2FsbGVycyBjaGFuZ2VkLicnCi0KLUBleGFtcGxlCi0qIGtleWJvYXJkLmMgKEZjb21tYW5kX2V4ZWN1dGUpOiBOZXcgYXJnIFNQRUNJQUwuCi1BbGwgY2FsbGVycyBjaGFuZ2VkLgotQGVuZCBleGFtcGxlCi0KLVdoZW4geW91IGNoYW5nZSBqdXN0IGNvbW1lbnRzIG9yIGRvYyBzdHJpbmdzLCBpdCBpcyBlbm91Z2ggdG8gd3JpdGUgYW4KLWVudHJ5IGZvciB0aGUgZmlsZSwgd2l0aG91dCBtZW50aW9uaW5nIHRoZSBmdW5jdGlvbnMuICBKdXN0IGBgRG9jCi1maXhlcycnIGlzIGVub3VnaCBmb3IgdGhlIGNoYW5nZSBsb2cuCi0KLVRoZXJlJ3Mgbm8gbmVlZCB0byBtYWtlIGNoYW5nZSBsb2cgZW50cmllcyBmb3IgZG9jdW1lbnRhdGlvbiBmaWxlcy4KLVRoaXMgaXMgYmVjYXVzZSBkb2N1bWVudGF0aW9uIGlzIG5vdCBzdXNjZXB0aWJsZSB0byBidWdzIHRoYXQgYXJlIGhhcmQKLXRvIGZpeC4gIERvY3VtZW50YXRpb24gZG9lcyBub3QgY29uc2lzdCBvZiBwYXJ0cyB0aGF0IG11c3QgaW50ZXJhY3QgaW4gYQotcHJlY2lzZWx5IGVuZ2luZWVyZWQgZmFzaGlvbi4gIFRvIGNvcnJlY3QgYW4gZXJyb3IsIHlvdSBuZWVkIG5vdCBrbm93Ci10aGUgaGlzdG9yeSBvZiB0aGUgZXJyb25lb3VzIHBhc3NhZ2U7IGl0IGlzIGVub3VnaCB0byBjb21wYXJlIHdoYXQgdGhlCi1kb2N1bWVudGF0aW9uIHNheXMgd2l0aCB0aGUgd2F5IHRoZSBwcm9ncmFtIGFjdHVhbGx5IHdvcmtzLgotCi1Abm9kZSBDb25kaXRpb25hbCBDaGFuZ2VzCi1Ac3Vic2VjdGlvbiBDb25kaXRpb25hbCBDaGFuZ2VzCi0KLUMgcHJvZ3JhbXMgb2Z0ZW4gY29udGFpbiBjb21waWxlLXRpbWUgQGNvZGV7I2lmfSBjb25kaXRpb25hbHMuICBNYW55Ci1jaGFuZ2VzIGFyZSBjb25kaXRpb25hbDsgc29tZXRpbWVzIHlvdSBhZGQgYSBuZXcgZGVmaW5pdGlvbiB3aGljaCBpcwotZW50aXJlbHkgY29udGFpbmVkIGluIGEgY29uZGl0aW9uYWwuICBJdCBpcyB2ZXJ5IHVzZWZ1bCB0byBpbmRpY2F0ZSBpbgotdGhlIGNoYW5nZSBsb2cgdGhlIGNvbmRpdGlvbnMgZm9yIHdoaWNoIHRoZSBjaGFuZ2UgYXBwbGllcy4KLQotT3VyIGNvbnZlbnRpb24gZm9yIGluZGljYXRpbmcgY29uZGl0aW9uYWwgY2hhbmdlcyBpcyB0byB1c2Ugc3F1YXJlCi1icmFja2V0cyBhcm91bmQgdGhlIG5hbWUgb2YgdGhlIGNvbmRpdGlvbi4KLQotSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlLCBkZXNjcmliaW5nIGEgY2hhbmdlIHdoaWNoIGlzIGNvbmRpdGlvbmFsIGJ1dAotZG9lcyBub3QgaGF2ZSBhIGZ1bmN0aW9uIG9yIGVudGl0eSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdDoKLQotQGV4YW1wbGUKLSogeHRlcm0uYyBbU09MQVJJUzJdOiBJbmNsdWRlIHN0cmluZy5oLgotQGVuZCBleGFtcGxlCi0KLUhlcmUgaXMgYW4gZW50cnkgZGVzY3JpYmluZyBhIG5ldyBkZWZpbml0aW9uIHdoaWNoIGlzIGVudGlyZWx5Ci1jb25kaXRpb25hbC4gIFRoaXMgbmV3IGRlZmluaXRpb24gZm9yIHRoZSBtYWNybyBAY29kZXtGUkFNRV9XSU5ET1dfUH0gaXMKLXVzZWQgb25seSB3aGVuIEBjb2Rle0hBVkVfWF9XSU5ET1dTfSBpcyBkZWZpbmVkOgotCi1AZXhhbXBsZQotKiBmcmFtZS5oIFtIQVZFX1hfV0lORE9XU10gKEZSQU1FX1dJTkRPV19QKTogTWFjcm8gZGVmaW5lZC4KLUBlbmQgZXhhbXBsZQotCi1IZXJlIGlzIGFuIGVudHJ5IGZvciBhIGNoYW5nZSB3aXRoaW4gdGhlIGZ1bmN0aW9uIEBjb2Rle2luaXRfZGlzcGxheX0sCi13aG9zZSBkZWZpbml0aW9uIGFzIGEgd2hvbGUgaXMgdW5jb25kaXRpb25hbCwgYnV0IHRoZSBjaGFuZ2VzIHRoZW1zZWx2ZXMKLWFyZSBjb250YWluZWQgaW4gYSBAc2FtcHsjaWZkZWYgSEFWRV9MSUJOQ1VSU0VTfSBjb25kaXRpb25hbDoKLQotQGV4YW1wbGUKLSogZGlzcG5ldy5jIChpbml0X2Rpc3BsYXkpIFtIQVZFX0xJQk5DVVJTRVNdOiBJZiBYLCBjYWxsIHRnZXRlbnQuCi1AZW5kIGV4YW1wbGUKLQotSGVyZSBpcyBhbiBlbnRyeSBmb3IgYSBjaGFuZ2UgdGhhdCB0YWtlcyBhZmZlY3Qgb25seSB3aGVuCi1hIGNlcnRhaW4gbWFjcm8gaXMgQGVtcGh7bm90fSBkZWZpbmVkOgotCi1AZXhhbXBsZQotKGdldGhvc3RuYW1lKSBbIUhBVkVfU09DS0VUU106IFJlcGxhY2Ugd2l0aCB3aW5zb2NrIHZlcnNpb24uCi1AZW5kIGV4YW1wbGUKLQotQG5vZGUgTWFuIFBhZ2VzCi1Ac2VjdGlvbiBNYW4gUGFnZXMKLQotSW4gdGhlIEdOVSBwcm9qZWN0LCBtYW4gcGFnZXMgYXJlIHNlY29uZGFyeS4gIEl0IGlzIG5vdCBuZWNlc3Nhcnkgb3IKLWV4cGVjdGVkIGZvciBldmVyeSBHTlUgcHJvZ3JhbSB0byBoYXZlIGEgbWFuIHBhZ2UsIGJ1dCBzb21lIG9mIHRoZW0gZG8uCi1JdCdzIHlvdXIgY2hvaWNlIHdoZXRoZXIgdG8gaW5jbHVkZSBhIG1hbiBwYWdlIGluIHlvdXIgcHJvZ3JhbS4KLQotV2hlbiB5b3UgbWFrZSB0aGlzIGRlY2lzaW9uLCBjb25zaWRlciB0aGF0IHN1cHBvcnRpbmcgYSBtYW4gcGFnZQotcmVxdWlyZXMgY29udGludWFsIGVmZm9ydCBlYWNoIHRpbWUgdGhlIHByb2dyYW0gaXMgY2hhbmdlZC4gIFRoZSB0aW1lCi15b3Ugc3BlbmQgb24gdGhlIG1hbiBwYWdlIGlzIHRpbWUgdGFrZW4gYXdheSBmcm9tIG1vcmUgdXNlZnVsIHdvcmsuCi0KLUZvciBhIHNpbXBsZSBwcm9ncmFtIHdoaWNoIGNoYW5nZXMgbGl0dGxlLCB1cGRhdGluZyB0aGUgbWFuIHBhZ2UgbWF5IGJlCi1hIHNtYWxsIGpvYi4gIFRoZW4gdGhlcmUgaXMgbGl0dGxlIHJlYXNvbiBub3QgdG8gaW5jbHVkZSBhIG1hbiBwYWdlLCBpZgoteW91IGhhdmUgb25lLgotCi1Gb3IgYSBsYXJnZSBwcm9ncmFtIHRoYXQgY2hhbmdlcyBhIGdyZWF0IGRlYWwsIHVwZGF0aW5nIGEgbWFuIHBhZ2UgbWF5Ci1iZSBhIHN1YnN0YW50aWFsIGJ1cmRlbi4gIElmIGEgdXNlciBvZmZlcnMgdG8gZG9uYXRlIGEgbWFuIHBhZ2UsIHlvdSBtYXkKLWZpbmQgdGhpcyBnaWZ0IGNvc3RseSB0byBhY2NlcHQuICBJdCBtYXkgYmUgYmV0dGVyIHRvIHJlZnVzZSB0aGUgbWFuCi1wYWdlIHVubGVzcyB0aGUgc2FtZSBwZXJzb24gYWdyZWVzIHRvIHRha2UgZnVsbCByZXNwb25zaWJpbGl0eSBmb3IKLW1haW50YWluaW5nIGl0LS0tc28gdGhhdCB5b3UgY2FuIHdhc2ggeW91ciBoYW5kcyBvZiBpdCBlbnRpcmVseS4gIElmCi10aGlzIHZvbHVudGVlciBsYXRlciBjZWFzZXMgdG8gZG8gdGhlIGpvYiwgdGhlbiBkb24ndCBmZWVsIG9ibGlnZWQgdG8KLXBpY2sgaXQgdXAgeW91cnNlbGY7IGl0IG1heSBiZSBiZXR0ZXIgdG8gd2l0aGRyYXcgdGhlIG1hbiBwYWdlIGZyb20gdGhlCi1kaXN0cmlidXRpb24gdW50aWwgc29tZW9uZSBlbHNlIGFncmVlcyB0byB1cGRhdGUgaXQuCi0KLVdoZW4gYSBwcm9ncmFtIGNoYW5nZXMgb25seSBhIGxpdHRsZSwgeW91IG1heSBmZWVsIHRoYXQgdGhlCi1kaXNjcmVwYW5jaWVzIGFyZSBzbWFsbCBlbm91Z2ggdGhhdCB0aGUgbWFuIHBhZ2UgcmVtYWlucyB1c2VmdWwgd2l0aG91dAotdXBkYXRpbmcuICBJZiBzbywgcHV0IGEgcHJvbWluZW50IG5vdGUgbmVhciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYW4KLXBhZ2UgZXhwbGFpbmluZyB0aGF0IHlvdSBkb24ndCBtYWludGFpbiBpdCBhbmQgdGhhdCB0aGUgVGV4aW5mbyBtYW51YWwKLWlzIG1vcmUgYXV0aG9yaXRhdGl2ZS4gIFRoZSBub3RlIHNob3VsZCBzYXkgaG93IHRvIGFjY2VzcyB0aGUgVGV4aW5mbwotZG9jdW1lbnRhdGlvbi4KLQotQG5vZGUgUmVhZGluZyBvdGhlciBNYW51YWxzCi1Ac2VjdGlvbiBSZWFkaW5nIG90aGVyIE1hbnVhbHMKLQotVGhlcmUgbWF5IGJlIG5vbi1mcmVlIGJvb2tzIG9yIGRvY3VtZW50YXRpb24gZmlsZXMgdGhhdCBkZXNjcmliZSB0aGUKLXByb2dyYW0geW91IGFyZSBkb2N1bWVudGluZy4KLQotSXQgaXMgb2sgdG8gdXNlIHRoZXNlIGRvY3VtZW50cyBmb3IgcmVmZXJlbmNlLCBqdXN0IGFzIHRoZSBhdXRob3Igb2YgYQotbmV3IGFsZ2VicmEgdGV4dGJvb2sgY2FuIHJlYWQgb3RoZXIgYm9va3Mgb24gYWxnZWJyYS4gIEEgbGFyZ2UgcG9ydGlvbgotb2YgYW55IG5vbi1maWN0aW9uIGJvb2sgY29uc2lzdHMgb2YgZmFjdHMsIGluIHRoaXMgY2FzZSBmYWN0cyBhYm91dCBob3cKLWEgY2VydGFpbiBwcm9ncmFtIHdvcmtzLCBhbmQgdGhlc2UgZmFjdHMgYXJlIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGZvcgotZXZlcnlvbmUgd2hvIHdyaXRlcyBhYm91dCB0aGUgc3ViamVjdC4gIEJ1dCBiZSBjYXJlZnVsIG5vdCB0byBjb3B5IHlvdXIKLW91dGxpbmUgc3RydWN0dXJlLCB3b3JkaW5nLCB0YWJsZXMgb3IgZXhhbXBsZXMgZnJvbSBwcmVleGlzdGluZyBub24tZnJlZQotZG9jdW1lbnRhdGlvbi4gIENvcHlpbmcgZnJvbSBmcmVlIGRvY3VtZW50YXRpb24gbWF5IGJlIG9rOyBwbGVhc2UgY2hlY2sKLXdpdGggdGhlIEZTRiBhYm91dCB0aGUgaW5kaXZpZHVhbCBjYXNlLgotCi1Abm9kZSBNYW5hZ2luZyBSZWxlYXNlcwotQGNoYXB0ZXIgVGhlIFJlbGVhc2UgUHJvY2VzcwotCi1NYWtpbmcgYSByZWxlYXNlIGlzIG1vcmUgdGhhbiBqdXN0IGJ1bmRsaW5nIHVwIHlvdXIgc291cmNlIGZpbGVzIGluIGEKLXRhciBmaWxlIGFuZCBwdXR0aW5nIGl0IHVwIGZvciBGVFAuICBZb3Ugc2hvdWxkIHNldCB1cCB5b3VyIHNvZnR3YXJlIHNvCi10aGF0IGl0IGNhbiBiZSBjb25maWd1cmVkIHRvIHJ1biBvbiBhIHZhcmlldHkgb2Ygc3lzdGVtcy4gIFlvdXIgTWFrZWZpbGUKLXNob3VsZCBjb25mb3JtIHRvIHRoZSBHTlUgc3RhbmRhcmRzIGRlc2NyaWJlZCBiZWxvdywgYW5kIHlvdXIgZGlyZWN0b3J5Ci1sYXlvdXQgc2hvdWxkIGFsc28gY29uZm9ybSB0byB0aGUgc3RhbmRhcmRzIGRpc2N1c3NlZCBiZWxvdy4gIERvaW5nIHNvCi1tYWtlcyBpdCBlYXN5IHRvIGluY2x1ZGUgeW91ciBwYWNrYWdlIGludG8gdGhlIGxhcmdlciBmcmFtZXdvcmsgb2YKLWFsbCBHTlUgc29mdHdhcmUuCi0KLUBtZW51Ci0qIENvbmZpZ3VyYXRpb246OiAgICAgICAgICAgICAgIEhvdyBDb25maWd1cmF0aW9uIFNob3VsZCBXb3JrCi0qIE1ha2VmaWxlIENvbnZlbnRpb25zOjoJTWFrZWZpbGUgQ29udmVudGlvbnMKLSogUmVsZWFzZXM6OiAgICAgICAgICAgICAgICAgICAgTWFraW5nIFJlbGVhc2VzCi1AZW5kIG1lbnUKLQotQG5vZGUgQ29uZmlndXJhdGlvbgotQHNlY3Rpb24gSG93IENvbmZpZ3VyYXRpb24gU2hvdWxkIFdvcmsKLQotRWFjaCBHTlUgZGlzdHJpYnV0aW9uIHNob3VsZCBjb21lIHdpdGggYSBzaGVsbCBzY3JpcHQgbmFtZWQKLUBjb2Rle2NvbmZpZ3VyZX0uICBUaGlzIHNjcmlwdCBpcyBnaXZlbiBhcmd1bWVudHMgd2hpY2ggZGVzY3JpYmUgdGhlCi1raW5kIG9mIG1hY2hpbmUgYW5kIHN5c3RlbSB5b3Ugd2FudCB0byBjb21waWxlIHRoZSBwcm9ncmFtIGZvci4KLQotVGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IG11c3QgcmVjb3JkIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgc28KLXRoYXQgdGhleSBhZmZlY3QgY29tcGlsYXRpb24uCi0KLU9uZSB3YXkgdG8gZG8gdGhpcyBpcyB0byBtYWtlIGEgbGluayBmcm9tIGEgc3RhbmRhcmQgbmFtZSBzdWNoIGFzCi1AZmlsZXtjb25maWcuaH0gdG8gdGhlIHByb3BlciBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBjaG9zZW4gc3lzdGVtLgotSWYgeW91IHVzZSB0aGlzIHRlY2huaXF1ZSwgdGhlIGRpc3RyaWJ1dGlvbiBzaG91bGQgQGVtcGh7bm90fSBjb250YWluIGEKLWZpbGUgbmFtZWQgQGZpbGV7Y29uZmlnLmh9LiAgVGhpcyBpcyBzbyB0aGF0IHBlb3BsZSB3b24ndCBiZSBhYmxlIHRvCi1idWlsZCB0aGUgcHJvZ3JhbSB3aXRob3V0IGNvbmZpZ3VyaW5nIGl0IGZpcnN0LgotCi1Bbm90aGVyIHRoaW5nIHRoYXQgQGNvZGV7Y29uZmlndXJlfSBjYW4gZG8gaXMgdG8gZWRpdCB0aGUgTWFrZWZpbGUuICBJZgoteW91IGRvIHRoaXMsIHRoZSBkaXN0cmlidXRpb24gc2hvdWxkIEBlbXBoe25vdH0gY29udGFpbiBhIGZpbGUgbmFtZWQKLUBmaWxle01ha2VmaWxlfS4gIEluc3RlYWQsIGl0IHNob3VsZCBpbmNsdWRlIGEgZmlsZSBAZmlsZXtNYWtlZmlsZS5pbn0gd2hpY2gKLWNvbnRhaW5zIHRoZSBpbnB1dCB1c2VkIGZvciBlZGl0aW5nLiAgT25jZSBhZ2FpbiwgdGhpcyBpcyBzbyB0aGF0IHBlb3BsZQotd29uJ3QgYmUgYWJsZSB0byBidWlsZCB0aGUgcHJvZ3JhbSB3aXRob3V0IGNvbmZpZ3VyaW5nIGl0IGZpcnN0LgotCi1JZiBAY29kZXtjb25maWd1cmV9IGRvZXMgd3JpdGUgdGhlIEBmaWxle01ha2VmaWxlfSwgdGhlbiBAZmlsZXtNYWtlZmlsZX0KLXNob3VsZCBoYXZlIGEgdGFyZ2V0IG5hbWVkIEBmaWxle01ha2VmaWxlfSB3aGljaCBjYXVzZXMgQGNvZGV7Y29uZmlndXJlfQotdG8gYmUgcmVydW4sIHNldHRpbmcgdXAgdGhlIHNhbWUgY29uZmlndXJhdGlvbiB0aGF0IHdhcyBzZXQgdXAgbGFzdAotdGltZS4gIFRoZSBmaWxlcyB0aGF0IEBjb2Rle2NvbmZpZ3VyZX0gcmVhZHMgc2hvdWxkIGJlIGxpc3RlZCBhcwotZGVwZW5kZW5jaWVzIG9mIEBmaWxle01ha2VmaWxlfS4KLQotQWxsIHRoZSBmaWxlcyB3aGljaCBhcmUgb3V0cHV0IGZyb20gdGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IHNob3VsZAotaGF2ZSBjb21tZW50cyBhdCB0aGUgYmVnaW5uaW5nIGV4cGxhaW5pbmcgdGhhdCB0aGV5IHdlcmUgZ2VuZXJhdGVkCi1hdXRvbWF0aWNhbGx5IHVzaW5nIEBjb2Rle2NvbmZpZ3VyZX0uICBUaGlzIGlzIHNvIHRoYXQgdXNlcnMgd29uJ3QgdGhpbmsKLW9mIHRyeWluZyB0byBlZGl0IHRoZW0gYnkgaGFuZC4KLQotVGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IHNob3VsZCB3cml0ZSBhIGZpbGUgbmFtZWQgQGZpbGV7Y29uZmlnLnN0YXR1c30KLXdoaWNoIGRlc2NyaWJlcyB3aGljaCBjb25maWd1cmF0aW9uIG9wdGlvbnMgd2VyZSBzcGVjaWZpZWQgd2hlbiB0aGUKLXByb2dyYW0gd2FzIGxhc3QgY29uZmlndXJlZC4gIFRoaXMgZmlsZSBzaG91bGQgYmUgYSBzaGVsbCBzY3JpcHQgd2hpY2gsCi1pZiBydW4sIHdpbGwgcmVjcmVhdGUgdGhlIHNhbWUgY29uZmlndXJhdGlvbi4KLQotVGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IHNob3VsZCBhY2NlcHQgYW4gb3B0aW9uIG9mIHRoZSBmb3JtCi1Ac2FtcHstLXNyY2Rpcj1AdmFye2Rpcm5hbWV9fSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUgc291cmNlcyBhcmUgZm91bmQKLShpZiBpdCBpcyBub3QgdGhlIGN1cnJlbnQgZGlyZWN0b3J5KS4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gYnVpbGQKLXRoZSBwcm9ncmFtIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5LCBzbyB0aGF0IHRoZSBhY3R1YWwgc291cmNlIGRpcmVjdG9yeQotaXMgbm90IG1vZGlmaWVkLgotCi1JZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IEBzYW1wey0tc3JjZGlyfSwgdGhlbiBAY29kZXtjb25maWd1cmV9IHNob3VsZAotY2hlY2sgYm90aCBAZmlsZXsufSBhbmQgQGZpbGV7Li59IHRvIHNlZSBpZiBpdCBjYW4gZmluZCB0aGUgc291cmNlcy4gIElmCi1pdCBmaW5kcyB0aGUgc291cmNlcyBpbiBvbmUgb2YgdGhlc2UgcGxhY2VzLCBpdCBzaG91bGQgdXNlIHRoZW0gZnJvbQotdGhlcmUuICBPdGhlcndpc2UsIGl0IHNob3VsZCByZXBvcnQgdGhhdCBpdCBjYW5ub3QgZmluZCB0aGUgc291cmNlcywgYW5kCi1zaG91bGQgZXhpdCB3aXRoIG5vbnplcm8gc3RhdHVzLgotCi1Vc3VhbGx5IHRoZSBlYXN5IHdheSB0byBzdXBwb3J0IEBzYW1wey0tc3JjZGlyfSBpcyBieSBlZGl0aW5nIGEKLWRlZmluaXRpb24gb2YgQGNvZGV7VlBBVEh9IGludG8gdGhlIE1ha2VmaWxlLiAgU29tZSBydWxlcyBtYXkgbmVlZCB0bwotcmVmZXIgZXhwbGljaXRseSB0byB0aGUgc3BlY2lmaWVkIHNvdXJjZSBkaXJlY3RvcnkuICBUbyBtYWtlIHRoaXMKLXBvc3NpYmxlLCBAY29kZXtjb25maWd1cmV9IGNhbiBhZGQgdG8gdGhlIE1ha2VmaWxlIGEgdmFyaWFibGUgbmFtZWQKLUBjb2Rle3NyY2Rpcn0gd2hvc2UgdmFsdWUgaXMgcHJlY2lzZWx5IHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCi1UaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkIGFsc28gdGFrZSBhbiBhcmd1bWVudCB3aGljaCBzcGVjaWZpZXMgdGhlCi10eXBlIG9mIHN5c3RlbSB0byBidWlsZCB0aGUgcHJvZ3JhbSBmb3IuICBUaGlzIGFyZ3VtZW50IHNob3VsZCBsb29rIGxpa2UKLXRoaXM6Ci0KLUBleGFtcGxlCi1AdmFye2NwdX0tQHZhcntjb21wYW55fS1AdmFye3N5c3RlbX0KLUBlbmQgZXhhbXBsZQotCi1Gb3IgZXhhbXBsZSwgYSBTdW4gMyBtaWdodCBiZSBAc2FtcHttNjhrLXN1bi1zdW5vczQuMX0uCi0KLVRoZSBAY29kZXtjb25maWd1cmV9IHNjcmlwdCBuZWVkcyB0byBiZSBhYmxlIHRvIGRlY29kZSBhbGwgcGxhdXNpYmxlCi1hbHRlcm5hdGl2ZXMgZm9yIGhvdyB0byBkZXNjcmliZSBhIG1hY2hpbmUuICBUaHVzLCBAc2FtcHtzdW4zLXN1bm9zNC4xfQotd291bGQgYmUgYSB2YWxpZCBhbGlhcy4gIEZvciBtYW55IHByb2dyYW1zLCBAc2FtcHt2YXgtZGVjLXVsdHJpeH0gd291bGQKLWJlIGFuIGFsaWFzIGZvciBAc2FtcHt2YXgtZGVjLWJzZH0sIHNpbXBseSBiZWNhdXNlIHRoZSBkaWZmZXJlbmNlcwotYmV0d2VlbiBVbHRyaXggYW5kIEBzY3tCU0R9IGFyZSByYXJlbHkgbm90aWNlYWJsZSwgYnV0IGEgZmV3IHByb2dyYW1zCi1taWdodCBuZWVkIHRvIGRpc3Rpbmd1aXNoIHRoZW0uCi1AYyBSZWFsIDQuNEJTRCBub3cgcnVucyBvbiBzb21lIFN1bnMuCi0KLVRoZXJlIGlzIGEgc2hlbGwgc2NyaXB0IGNhbGxlZCBAZmlsZXtjb25maWcuc3VifSB0aGF0IHlvdSBjYW4gdXNlCi1hcyBhIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgc3lzdGVtIHR5cGVzIGFuZCBjYW5vbmljYWxpemUgYWxpYXNlcy4KLQotT3RoZXIgb3B0aW9ucyBhcmUgcGVybWl0dGVkIHRvIHNwZWNpZnkgaW4gbW9yZSBkZXRhaWwgdGhlIHNvZnR3YXJlCi1vciBoYXJkd2FyZSBwcmVzZW50IG9uIHRoZSBtYWNoaW5lLCBhbmQgaW5jbHVkZSBvciBleGNsdWRlIG9wdGlvbmFsCi1wYXJ0cyBvZiB0aGUgcGFja2FnZToKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSAtLWVuYWJsZS1AdmFye2ZlYXR1cmV9QHJ7W309QHZhcntwYXJhbWV0ZXJ9QHJ7XX0KLUNvbmZpZ3VyZSB0aGUgcGFja2FnZSB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvcHRpb25hbCB1c2VyLWxldmVsCi1mYWNpbGl0eSBjYWxsZWQgQHZhcntmZWF0dXJlfS4gIFRoaXMgYWxsb3dzIHVzZXJzIHRvIGNob29zZSB3aGljaAotb3B0aW9uYWwgZmVhdHVyZXMgdG8gaW5jbHVkZS4gIEdpdmluZyBhbiBvcHRpb25hbCBAdmFye3BhcmFtZXRlcn0gb2YKLUBzYW1we25vfSBzaG91bGQgb21pdCBAdmFye2ZlYXR1cmV9LCBpZiBpdCBpcyBidWlsdCBieSBkZWZhdWx0LgotCi1ObyBAc2FtcHstLWVuYWJsZX0gb3B0aW9uIHNob3VsZCBAc3Ryb25ne2V2ZXJ9IGNhdXNlIG9uZSBmZWF0dXJlIHRvCi1yZXBsYWNlIGFub3RoZXIuICBObyBAc2FtcHstLWVuYWJsZX0gb3B0aW9uIHNob3VsZCBldmVyIHN1YnN0aXR1dGUgb25lCi11c2VmdWwgYmVoYXZpb3IgZm9yIGFub3RoZXIgdXNlZnVsIGJlaGF2aW9yLiAgVGhlIG9ubHkgcHJvcGVyIHVzZSBmb3IKLUBzYW1wey0tZW5hYmxlfSBpcyBmb3IgcXVlc3Rpb25zIG9mIHdoZXRoZXIgdG8gYnVpbGQgcGFydCBvZiB0aGUgcHJvZ3JhbQotb3IgZXhjbHVkZSBpdC4KLQotQGl0ZW0gLS13aXRoLUB2YXJ7cGFja2FnZX0KLUBjIEBye1t9PUB2YXJ7cGFyYW1ldGVyfUBye119Ci1UaGUgcGFja2FnZSBAdmFye3BhY2thZ2V9IHdpbGwgYmUgaW5zdGFsbGVkLCBzbyBjb25maWd1cmUgdGhpcyBwYWNrYWdlCi10byB3b3JrIHdpdGggQHZhcntwYWNrYWdlfS4KLQotQGMgIEdpdmluZyBhbiBvcHRpb25hbCBAdmFye3BhcmFtZXRlcn0gb2YKLUBjIEBzYW1we25vfSBzaG91bGQgb21pdCBAdmFye3BhY2thZ2V9LCBpZiBpdCBpcyB1c2VkIGJ5IGRlZmF1bHQuCi0KLVBvc3NpYmxlIHZhbHVlcyBvZiBAdmFye3BhY2thZ2V9IGluY2x1ZGUgCi1Ac2FtcHtnbnUtYXN9IChvciBAc2FtcHtnYXN9KSwgQHNhbXB7Z251LWxkfSwgQHNhbXB7Z251LWxpYmN9LAotQHNhbXB7Z2RifSwKLUBzYW1we3h9LCAKLWFuZAotQHNhbXB7eC10b29sa2l0fS4KLQotRG8gbm90IHVzZSBhIEBzYW1wey0td2l0aH0gb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSB0byB1c2UgdG8KLWZpbmQgY2VydGFpbiBmaWxlcy4gIFRoYXQgaXMgb3V0c2lkZSB0aGUgc2NvcGUgb2Ygd2hhdCBAc2FtcHstLXdpdGh9Ci1vcHRpb25zIGFyZSBmb3IuCi0KLUBpdGVtIC0tbmZwCi1UaGUgdGFyZ2V0IG1hY2hpbmUgaGFzIG5vIGZsb2F0aW5nIHBvaW50IHByb2Nlc3Nvci4KLQotQGl0ZW0gLS1nYXMKLVRoZSB0YXJnZXQgbWFjaGluZSBhc3NlbWJsZXIgaXMgR0FTLCB0aGUgR05VIGFzc2VtYmxlci4KLVRoaXMgaXMgb2Jzb2xldGU7IHVzZXJzIHNob3VsZCB1c2UgQHNhbXB7LS13aXRoLWdudS1hc30gaW5zdGVhZC4KLQotQGl0ZW0gLS14Ci1UaGUgdGFyZ2V0IG1hY2hpbmUgaGFzIHRoZSBYIFdpbmRvdyBTeXN0ZW0gaW5zdGFsbGVkLgotVGhpcyBpcyBvYnNvbGV0ZTsgdXNlcnMgc2hvdWxkIHVzZSBAc2FtcHstLXdpdGgteH0gaW5zdGVhZC4KLUBlbmQgdGFibGUKLQotQWxsIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0cyBzaG91bGQgYWNjZXB0IGFsbCBvZiB0aGVzZSBgYGRldGFpbCcnCi1vcHRpb25zLCB3aGV0aGVyIG9yIG5vdCB0aGV5IG1ha2UgYW55IGRpZmZlcmVuY2UgdG8gdGhlIHBhcnRpY3VsYXIKLXBhY2thZ2UgYXQgaGFuZC4gIEluIHBhcnRpY3VsYXIsIHRoZXkgc2hvdWxkIGFjY2VwdCBhbnkgb3B0aW9uIHRoYXQKLXN0YXJ0cyB3aXRoIEBzYW1wey0td2l0aC19IG9yIEBzYW1wey0tZW5hYmxlLX0uICBUaGlzIGlzIHNvIHVzZXJzIHdpbGwKLWJlIGFibGUgdG8gY29uZmlndXJlIGFuIGVudGlyZSBHTlUgc291cmNlIHRyZWUgYXQgb25jZSB3aXRoIGEgc2luZ2xlIHNldAotb2Ygb3B0aW9ucy4KLQotWW91IHdpbGwgbm90ZSB0aGF0IHRoZSBjYXRlZ29yaWVzIEBzYW1wey0td2l0aC19IGFuZCBAc2FtcHstLWVuYWJsZS19Ci1hcmUgbmFycm93OiB0aGV5IEBzdHJvbmd7ZG8gbm90fSBwcm92aWRlIGEgcGxhY2UgZm9yIGFueSBzb3J0IG9mIG9wdGlvbgoteW91IG1pZ2h0IHRoaW5rIG9mLiAgVGhhdCBpcyBkZWxpYmVyYXRlLiAgV2Ugd2FudCB0byBsaW1pdCB0aGUgcG9zc2libGUKLWNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbiBHTlUgc29mdHdhcmUuICBXZSBkbyBub3Qgd2FudCBHTlUgcHJvZ3JhbXMgdG8KLWhhdmUgaWRpb3N5bmNyYXRpYyBjb25maWd1cmF0aW9uIG9wdGlvbnMuCi0KLVBhY2thZ2VzIHRoYXQgcGVyZm9ybSBwYXJ0IG9mIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzIG1heSBzdXBwb3J0IGNyb3NzLWNvbXBpbGF0aW9uLgotSW4gc3VjaCBhIGNhc2UsIHRoZSBob3N0IGFuZCB0YXJnZXQgbWFjaGluZXMgZm9yIHRoZSBwcm9ncmFtIG1heSBiZQotZGlmZmVyZW50LiAgVGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IHNob3VsZCBub3JtYWxseSB0cmVhdCB0aGUKLXNwZWNpZmllZCB0eXBlIG9mIHN5c3RlbSBhcyBib3RoIHRoZSBob3N0IGFuZCB0aGUgdGFyZ2V0LCB0aHVzIHByb2R1Y2luZwotYSBwcm9ncmFtIHdoaWNoIHdvcmtzIGZvciB0aGUgc2FtZSB0eXBlIG9mIG1hY2hpbmUgdGhhdCBpdCBydW5zIG9uLgotCi1UaGUgd2F5IHRvIGJ1aWxkIGEgY3Jvc3MtY29tcGlsZXIsIGNyb3NzLWFzc2VtYmxlciwgb3Igd2hhdCBoYXZlIHlvdSwgaXMKLXRvIHNwZWNpZnkgdGhlIG9wdGlvbiBAc2FtcHstLWhvc3Q9QHZhcntob3N0dHlwZX19IHdoZW4gcnVubmluZwotQGNvZGV7Y29uZmlndXJlfS4gIFRoaXMgc3BlY2lmaWVzIHRoZSBob3N0IHN5c3RlbSB3aXRob3V0IGNoYW5naW5nIHRoZQotdHlwZSBvZiB0YXJnZXQgc3lzdGVtLiAgVGhlIHN5bnRheCBmb3IgQHZhcntob3N0dHlwZX0gaXMgdGhlIHNhbWUgYXMKLWRlc2NyaWJlZCBhYm92ZS4KLQotQm9vdHN0cmFwcGluZyBhIGNyb3NzLWNvbXBpbGVyIHJlcXVpcmVzIGNvbXBpbGluZyBpdCBvbiBhIG1hY2hpbmUgb3RoZXIKLXRoYW4gdGhlIGhvc3QgaXQgd2lsbCBydW4gb24uICBDb21waWxhdGlvbiBwYWNrYWdlcyBhY2NlcHQgYQotY29uZmlndXJhdGlvbiBvcHRpb24gQHNhbXB7LS1idWlsZD1AdmFye2hvc3R0eXBlfX0gZm9yIHNwZWNpZnlpbmcgdGhlCi1jb25maWd1cmF0aW9uIG9uIHdoaWNoIHlvdSB3aWxsIGNvbXBpbGUgdGhlbSwgaW4gY2FzZSB0aGF0IGlzIGRpZmZlcmVudAotZnJvbSB0aGUgaG9zdC4KLQotUHJvZ3JhbXMgZm9yIHdoaWNoIGNyb3NzLW9wZXJhdGlvbiBpcyBub3QgbWVhbmluZ2Z1bCBuZWVkIG5vdCBhY2NlcHQgdGhlCi1Ac2FtcHstLWhvc3R9IG9wdGlvbiwgYmVjYXVzZSBjb25maWd1cmluZyBhbiBlbnRpcmUgb3BlcmF0aW5nIHN5c3RlbSBmb3IKLWNyb3NzLW9wZXJhdGlvbiBpcyBub3QgYSBtZWFuaW5nZnVsIHRoaW5nLgotCi1Tb21lIHByb2dyYW1zIGhhdmUgd2F5cyBvZiBjb25maWd1cmluZyB0aGVtc2VsdmVzIGF1dG9tYXRpY2FsbHkuICBJZgoteW91ciBwcm9ncmFtIGlzIHNldCB1cCB0byBkbyB0aGlzLCB5b3VyIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IGNhbiBzaW1wbHkKLWlnbm9yZSBtb3N0IG9mIGl0cyBhcmd1bWVudHMuCi0KLUBjb21tZW50IFRoZSBtYWtlZmlsZSBzdGFuZGFyZHMgYXJlIGluIGEgc2VwYXJhdGUgZmlsZSB0aGF0IGlzIGFsc28KLUBjb21tZW50IGluY2x1ZGVkIGJ5IG1ha2UudGV4aW5mby4gIERvbmUgYnkgcm9sYW5kQGdudS5haS5taXQuZWR1IG9uIDEvNi85My4KLUBjb21tZW50IEZvciB0aGlzIGRvY3VtZW50LCB0dXJuIGNoYXB0ZXJzIGludG8gc2VjdGlvbnMsIGV0Yy4KLUBsb3dlcnNlY3Rpb25zCi1AaW5jbHVkZSBtYWtlLXN0ZHMudGV4aQotQHJhaXNlc2VjdGlvbnMKLQotQG5vZGUgUmVsZWFzZXMKLUBzZWN0aW9uIE1ha2luZyBSZWxlYXNlcwotCi1QYWNrYWdlIHRoZSBkaXN0cmlidXRpb24gb2YgQGNvZGV7Rm9vIHZlcnNpb24gNjkuOTZ9IHVwIGluIGEgZ3ppcHBlZCB0YXIKLWZpbGUgd2l0aCB0aGUgbmFtZSBAZmlsZXtmb28tNjkuOTYudGFyLmd6fS4gIEl0IHNob3VsZCB1bnBhY2sgaW50byBhCi1zdWJkaXJlY3RvcnkgbmFtZWQgQGZpbGV7Zm9vLTY5Ljk2fS4KLQotQnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgdGhlIHByb2dyYW0gc2hvdWxkIG5ldmVyIG1vZGlmeSBhbnkgb2YgdGhlIGZpbGVzCi1jb250YWluZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbi4gIFRoaXMgbWVhbnMgdGhhdCBhbGwgdGhlIGZpbGVzIHRoYXQgZm9ybQotcGFydCBvZiB0aGUgcHJvZ3JhbSBpbiBhbnkgd2F5IG11c3QgYmUgY2xhc3NpZmllZCBpbnRvIEBkZm57c291cmNlCi1maWxlc30gYW5kIEBkZm57bm9uLXNvdXJjZSBmaWxlc30uICBTb3VyY2UgZmlsZXMgYXJlIHdyaXR0ZW4gYnkgaHVtYW5zCi1hbmQgbmV2ZXIgY2hhbmdlZCBhdXRvbWF0aWNhbGx5OyBub24tc291cmNlIGZpbGVzIGFyZSBwcm9kdWNlZCBmcm9tCi1zb3VyY2UgZmlsZXMgYnkgcHJvZ3JhbXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIE1ha2VmaWxlLgotCi1OYXR1cmFsbHksIGFsbCB0aGUgc291cmNlIGZpbGVzIG11c3QgYmUgaW4gdGhlIGRpc3RyaWJ1dGlvbi4gIEl0IGlzIG9rYXkKLXRvIGluY2x1ZGUgbm9uLXNvdXJjZSBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uLCBwcm92aWRlZCB0aGV5IGFyZQotdXAtdG8tZGF0ZSBhbmQgbWFjaGluZS1pbmRlcGVuZGVudCwgc28gdGhhdCBidWlsZGluZyB0aGUgZGlzdHJpYnV0aW9uCi1ub3JtYWxseSB3aWxsIG5ldmVyIG1vZGlmeSB0aGVtLiAgV2UgY29tbW9ubHkgaW5jbHVkZSBub24tc291cmNlIGZpbGVzCi1wcm9kdWNlZCBieSBCaXNvbiwgQGNvZGV7bGV4fSwgQFRlWHt9LCBhbmQgQGNvZGV7bWFrZWluZm99OyB0aGlzIGhlbHBzIGF2b2lkCi11bm5lY2Vzc2FyeSBkZXBlbmRlbmNpZXMgYmV0d2VlbiBvdXIgZGlzdHJpYnV0aW9ucywgc28gdGhhdCB1c2VycyBjYW4KLWluc3RhbGwgd2hpY2hldmVyIHBhY2thZ2VzIHRoZXkgd2FudCB0byBpbnN0YWxsLgotCi1Ob24tc291cmNlIGZpbGVzIHRoYXQgbWlnaHQgYWN0dWFsbHkgYmUgbW9kaWZpZWQgYnkgYnVpbGRpbmcgYW5kCi1pbnN0YWxsaW5nIHRoZSBwcm9ncmFtIHNob3VsZCBAc3Ryb25ne25ldmVyfSBiZSBpbmNsdWRlZCBpbiB0aGUKLWRpc3RyaWJ1dGlvbi4gIFNvIGlmIHlvdSBkbyBkaXN0cmlidXRlIG5vbi1zb3VyY2UgZmlsZXMsIGFsd2F5cyBtYWtlCi1zdXJlIHRoZXkgYXJlIHVwIHRvIGRhdGUgd2hlbiB5b3UgbWFrZSBhIG5ldyBkaXN0cmlidXRpb24uCi0KLU1ha2Ugc3VyZSB0aGF0IHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgZGlzdHJpYnV0aW9uIHVucGFja3MgKGFzCi13ZWxsIGFzIGFueSBzdWJkaXJlY3RvcmllcykgYXJlIGFsbCB3b3JsZC13cml0YWJsZSAob2N0YWwgbW9kZSA3NzcpLgotVGhpcyBpcyBzbyB0aGF0IG9sZCB2ZXJzaW9ucyBvZiBAY29kZXt0YXJ9IHdoaWNoIHByZXNlcnZlIHRoZQotb3duZXJzaGlwIGFuZCBwZXJtaXNzaW9ucyBvZiB0aGUgZmlsZXMgZnJvbSB0aGUgdGFyIGFyY2hpdmUgd2lsbCBiZQotYWJsZSB0byBleHRyYWN0IGFsbCB0aGUgZmlsZXMgZXZlbiBpZiB0aGUgdXNlciBpcyB1bnByaXZpbGVnZWQuCi0KLU1ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgZmlsZXMgaW4gdGhlIGRpc3RyaWJ1dGlvbiBhcmUgd29ybGQtcmVhZGFibGUuCi0KLU1ha2Ugc3VyZSB0aGF0IG5vIGZpbGUgbmFtZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGlzIG1vcmUgdGhhbiAxNAotY2hhcmFjdGVycyBsb25nLiAgTGlrZXdpc2UsIG5vIGZpbGUgY3JlYXRlZCBieSBidWlsZGluZyB0aGUgcHJvZ3JhbQotc2hvdWxkIGhhdmUgYSBuYW1lIGxvbmdlciB0aGFuIDE0IGNoYXJhY3RlcnMuICBUaGUgcmVhc29uIGZvciB0aGlzIGlzCi10aGF0IHNvbWUgc3lzdGVtcyBhZGhlcmUgdG8gYSBmb29saXNoIGludGVycHJldGF0aW9uIG9mIHRoZSBQT1NJWAotc3RhbmRhcmQsIGFuZCByZWZ1c2UgdG8gb3BlbiBhIGxvbmdlciBuYW1lLCByYXRoZXIgdGhhbiB0cnVuY2F0aW5nIGFzCi10aGV5IGRpZCBpbiB0aGUgcGFzdC4KLQotRG9uJ3QgaW5jbHVkZSBhbnkgc3ltYm9saWMgbGlua3MgaW4gdGhlIGRpc3RyaWJ1dGlvbiBpdHNlbGYuICBJZiB0aGUgdGFyCi1maWxlIGNvbnRhaW5zIHN5bWJvbGljIGxpbmtzLCB0aGVuIHBlb3BsZSBjYW5ub3QgZXZlbiB1bnBhY2sgaXQgb24KLXN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHN5bWJvbGljIGxpbmtzLiAgQWxzbywgZG9uJ3QgdXNlIG11bHRpcGxlCi1uYW1lcyBmb3Igb25lIGZpbGUgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzLCBiZWNhdXNlIGNlcnRhaW4gZmlsZQotc3lzdGVtcyBjYW5ub3QgaGFuZGxlIHRoaXMgYW5kIHRoYXQgcHJldmVudHMgdW5wYWNraW5nIHRoZQotZGlzdHJpYnV0aW9uLgotCi1UcnkgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBmaWxlIG5hbWVzIHdpbGwgYmUgdW5pcXVlIG9uIE1TLURPUy4gIEEKLW5hbWUgb24gTVMtRE9TIGNvbnNpc3RzIG9mIHVwIHRvIDggY2hhcmFjdGVycywgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhCi1wZXJpb2QgYW5kIHVwIHRvIHRocmVlIGNoYXJhY3RlcnMuICBNUy1ET1Mgd2lsbCB0cnVuY2F0ZSBleHRyYQotY2hhcmFjdGVycyBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHBlcmlvZC4gIFRodXMsCi1AZmlsZXtmb29iYXJoYWNrZXIuY30gYW5kIEBmaWxle2Zvb2JhcmhhY2tlci5vfSBhcmUgbm90IGFtYmlndW91czsgdGhleQotYXJlIHRydW5jYXRlZCB0byBAZmlsZXtmb29iYXJoYS5jfSBhbmQgQGZpbGV7Zm9vYmFyaGEub30sIHdoaWNoIGFyZQotZGlzdGluY3QuCi0KLUluY2x1ZGUgaW4geW91ciBkaXN0cmlidXRpb24gYSBjb3B5IG9mIHRoZSBAZmlsZXt0ZXhpbmZvLnRleH0geW91IHVzZWQKLXRvIHRlc3QgcHJpbnQgYW55IEBmaWxleyoudGV4aW5mb30gb3IgQGZpbGV7Ki50ZXhpfSBmaWxlcy4KLQotTGlrZXdpc2UsIGlmIHlvdXIgcHJvZ3JhbSB1c2VzIHNtYWxsIEdOVSBzb2Z0d2FyZSBwYWNrYWdlcyBsaWtlIHJlZ2V4LAotZ2V0b3B0LCBvYnN0YWNrLCBvciB0ZXJtY2FwLCBpbmNsdWRlIHRoZW0gaW4gdGhlIGRpc3RyaWJ1dGlvbiBmaWxlLgotTGVhdmluZyB0aGVtIG91dCB3b3VsZCBtYWtlIHRoZSBkaXN0cmlidXRpb24gZmlsZSBhIGxpdHRsZSBzbWFsbGVyIGF0Ci10aGUgZXhwZW5zZSBvZiBwb3NzaWJsZSBpbmNvbnZlbmllbmNlIHRvIGEgdXNlciB3aG8gZG9lc24ndCBrbm93IHdoYXQKLW90aGVyIGZpbGVzIHRvIGdldC4KLQotQGNvbnRlbnRzCi0KLUBieWUKLUxvY2FsIHZhcmlhYmxlczoKLXVwZGF0ZS1kYXRlLWxlYWRpbmctcmVnZXhwOiAiQGMgVGhpcyBkYXRlIGlzIGF1dG9tYWdpY2FsbHkgdXBkYXRlZCB3aGVuIHlvdSBzYXZlIHRoaXMgZmlsZTpcbkBzZXQgbGFzdHVwZGF0ZSAiCi11cGRhdGUtZGF0ZS10cmFpbGluZy1yZWdleHA6ICIiCi1ldmFsOiAobG9hZCAiL2dkL2dudW9yZy91cGRhdGUtZGF0ZS5lbCIpCi1ldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3VwZGF0ZS1kYXRlKQotRW5kOgpkaWZmIC0tZ2l0IGEvZ2FzL0NPTlRSSUJVVE9SUyBiL2dhcy9DT05UUklCVVRPUlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZmQwM2UuLjAwMDAwMDAKLS0tIGEvZ2FzL0NPTlRSSUJVVE9SUworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0oVGhpcyBmaWxlIGlzIHVuZGVyIGNvbnN0cnVjdGlvbi4pCQkJLSotIHRleHQgLSotCi0KLUlmIHlvdSd2ZSBjb250cmlidXRlZCB0byBnYXMgYW5kIHlvdXIgbmFtZSBpc24ndCBsaXN0ZWQgaGVyZSwgaXQgaXMKLW5vdCBtZWFudCBhcyBhIHNsaWdodC4gIEkganVzdCBkb24ndCBrbm93IGFib3V0IGl0LiAgRW1haWwgbWUsCi1yYWVidXJuQGN5Z251cy5jb20gYW5kIEknbGwgY29ycmVjdCB0aGUgc2l0dWF0aW9uLgotCi1UaGlzIGZpbGUgd2lsbCBldmVudHVhbGx5IGJlIGRlbGV0ZWQ6IFRoZSBnZW5lcmFsIGluZm8gd2lsbCBnbyBpbnRvCi10aGUgZG9jdW1lbnRhdGlvbiwgYW5kIGluZm8gb24gc3BlY2lmaWMgZmlsZXMgd2lsbCBnbyBpbnRvIGFuIEFVVEhPUlMKLWZpbGUsIGFzIHJlcXVlc3RlZCBieSB0aGUgRlNGLgotCi0rKysrKysrKysrKysrKysrCi0KLURlYW4gRWxzbmVyIHdyb3RlIHRoZSBvcmlnaW5hbCBnYXMgZm9yIHZheC4gIFttb3JlIGRldGFpbHM/XQotCi1KYXkgRmVubGFzb24gbWFpbnRhaW5lZCBnYXMgZm9yIGEgd2hpbGUsIGFkZGluZyBzdXBwb3J0IGZvcgotZ2RiLXNwZWNpZmljIGRlYnVnIGluZm9ybWF0aW9uIGFuZCB0aGUgNjhrIHNlcmllcyBtYWNoaW5lcywgbW9zdCBvZgotdGhlIHByZXByb2Nlc3NpbmcgcGFzcywgYW5kIGV4dGVuc2l2ZSBjaGFuZ2VzIGluIG1lc3NhZ2VzLmMsCi1pbnB1dC1maWxlLmMsIHdyaXRlLmMuCi0KLUsuIFJpY2hhcmQgUGl4bGV5IG1haW50YWluZWQgZ2FzIGZvciBhIHdoaWxlLCBhZGRpbmcgdmFyaW91cwotZW5oYW5jZW1lbnRzIGFuZCBtYW55IGJ1ZyBmaXhlcywgaW5jbHVkaW5nIG1lcmdpbmcgc3VwcG9ydCBmb3Igc2V2ZXJhbAotcHJvY2Vzc29ycywgYnJlYWtpbmcgZ2FzIHVwIHRvIGhhbmRsZSBtdWx0aXBsZSBvYmplY3QgZmlsZSBmb3JtYXQKLWJhY2tlbmRzIChpbmNsdWRpbmcgaGVhdnkgcmV3cml0ZSwgdGVzdGluZywgYW4gaW50ZWdyYXRpb24gb2YgdGhlIGNvZmYKLWFuZCBiLm91dCBiYWNrZW5kcyksIGFkZGluZyBjb25maWd1cmF0aW9uIGluY2x1ZGluZyBoZWF2eSB0ZXN0aW5nIGFuZAotdmVyaWZpY2F0aW9uIG9mIGNyb3NzIGFzc2VtYmxlcnMgYW5kIGZpbGUgc3BsaXRzIGFuZCByZW5hbWluZywKLWNvbnZlcnRlZCBnYXMgdG8gc3RyaWN0bHkgYW5zaSBDIGluY2x1ZGluZyBmdWxsIHByb3RvdHlwZXMsIGFkZGVkCi1zdXBwb3J0IGZvciBtNjgwWzM0XTAgJiBjcHUzMiwgY29uc2lkZXJhYmxlIHdvcmsgb24gaTk2MCBpbmNsdWRpbmcgYQotY29mZiBwb3J0IChpbmNsdWRpbmcgY29uc2lkZXJhYmxlIGFtb3VudHMgb2YgcmV2ZXJzZSBlbmdpbmVlcmluZyksIGEKLXNwYXJjIG9wY29kZSBmaWxlIHJld3JpdGUsIGRlY3N0YXRpb24sIHJzNjAwMCwgYW5kIGhwMzAwaHB1eCBob3N0Ci1wb3J0cywgdXBkYXRlZCAia25vdyIgYXNzZXJ0aW9ucyBhbmQgbWFkZSB0aGVtIHdvcmssIG11Y2ggb3RoZXIKLXJlb3JnYW5pemF0aW9uLCBjbGVhbnVwLCBhbmQgbGludC4KLQotS2VuIFJhZWJ1cm4gY3VycmVudGx5IG1haW50YWlucyBnYXMsIGFuZCB3cm90ZSB0aGUgaGlnaC1sZXZlbCBCRkQKLWludGVyZmFjZSBjb2RlIHRvIHJlcGxhY2UgbW9zdCBvZiB0aGUgY29kZSBpbiBmb3JtYXQtc3BlY2lmaWMgSS9PCi1tb2R1bGVzLgotCi1UaGUgb3JpZ2luYWwgVmF4LVZNUyBzdXBwb3J0IHdhcyBjb250cmlidXRlZCBieSBEYXZpZCBMLiBLYXNodGFuLgotRXJpYyBZb3VuZ2RhbGUgYW5kIFBhdCBSYW5raW4gaGF2ZSBkb25lIG11Y2ggd29yayB3aXRoIGl0IHNpbmNlLgotCi1UaGUgSW50ZWwgODAzODYgbWFjaGluZSBkZXNjcmlwdGlvbiB3YXMgd3JpdHRlbiBieSBFbGlvdCBEcmVzc2VsaGF1cy4KLQotTWluaCBUcmFuLUxlIGF0IEludGVsbGlDb3JwIGNvbnRyaWJ1dGVkIHNvbWUgQUlYIDM4NiBzdXBwb3J0LgotCi1UaGUgTW90b3JvbGEgODhrIG1hY2hpbmUgZGVzY3JpcHRpb24gd2FzIGNvbnRyaWJ1dGVkIGJ5IERldm9uIEJvd2VuIG9mCi1CdWZmYWxvIFVuaXZlcnNpdHkgYW5kIFRvcmJqb3JuIEdyYW5sdW5kIG9mIHRoZSBTd2VkaXNoIEluc3RpdHV0ZSBvZgotQ29tcHV0ZXIgU2NpZW5jZS4KLQotS2VpdGggS25vd2xlcyBhdCB0aGUgT3BlbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHdyb3RlIHRoZSBvcmlnaW5hbCBNSVBTCi1iYWNrIGVuZCAodGMtbWlwcy5jLCB0Yy1taXBzLmgpLCBhbmQgY29udHJpYnV0ZWQgUm9zZSBmb3JtYXQgc3VwcG9ydAotdGhhdCBoYXNuJ3QgYmVlbiBtZXJnZWQgaW4geWV0LiAgUmFscGggQ2FtcGJlbGwgd29ya2VkIHdpdGggdGhlIE1JUFMKLWNvZGUgdG8gc3VwcG9ydCBhLm91dCBmb3JtYXQuCi0KLVN1cHBvcnQgZm9yIHRoZSBaaWxvZyBaOGsgYW5kIEhpdGFjaGkgSDgvMzAwLCBIOC81MDAgYW5kIFNIIHByb2Nlc3NvcnMKLSh0Yy16OGssIHRjLWg4MzAwLCB0Yy1oODUwMCwgdGMtc2gpLCBhbmQgSUVFRSA2OTUgb2JqZWN0IGZpbGUgZm9ybWF0Ci0ob2JqLWllZWUpLCB3YXMgd3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU29sdXRpb25zLgotU3RldmUgYWxzbyBtb2RpZmllZCB0aGUgQ09GRiBiYWNrIGVuZCAob2JqLWNvZmZiZmQpIHRvIHVzZSBCRkQgZm9yCi1zb21lIGxvdy1sZXZlbCBvcGVyYXRpb25zLCBmb3IgdXNlIHdpdGggdGhlIEhpdGFjaGksIDI5ayBhbmQgWmlsb2cKLXRhcmdldHMuCi0KLUpvaG4gR2lsbW9yZSBidWlsdCB0aGUgQU1EIDI5MDAwIHN1cHBvcnQsIGFkZGVkIC5pbmNsdWRlIHN1cHBvcnQsIGFuZAotc2ltcGxpZmllZCB0aGUgY29uZmlndXJhdGlvbiBvZiB3aGljaCB2ZXJzaW9ucyBhY2NlcHQgd2hpY2gKLXBzZXVkby1vcHMuICBIZSB1cGRhdGVkIHRoZSA2OGsgbWFjaGluZSBkZXNjcmlwdGlvbiBzbyB0aGF0IE1vdG9yb2xhJ3MKLW9wY29kZXMgYWx3YXlzIHByb2R1Y2VkIGZpeGVkLXNpemUgaW5zdHJ1Y3Rpb25zIChlLmcuIGpzciksIHdoaWxlCi1zeW50aGV0aWMgaW5zdHJ1Y3Rpb25zIHJlbWFpbmVkIHNocmlua2FibGUgKGpic3IpLiAgSm9obiBmaXhlZCBtYW55Ci1idWdzLCBpbmNsdWRpbmcgdHJ1ZSB0ZXN0ZWQgY3Jvc3MtY29tcGlsYXRpb24gc3VwcG9ydCwgYW5kIG9uZSBidWcgaW4KLXJlbGF4YXRpb24gdGhhdCB0b29rIGEgd2VlayBhbmQgcmVxdWlyZWQgdGhlIHByb3ZlcmJpYWwgb25lLWJpdCBmaXguCi0KLUlhbiBMYW5jZSBUYXlsb3Igb2YgQ3lnbnVzIFNvbHV0aW9ucyBtZXJnZWQgdGhlIE1vdG9yb2xhIGFuZCBNSVQKLXN5bnRheGVzIGZvciB0aGUgNjhrLCBjb21wbGV0ZWQgc3VwcG9ydCBmb3Igc29tZSBDT0ZGIHRhcmdldHMgKDY4aywKLWkzODYgU1ZSMywgYW5kIFNDTyBVbml4KSwgd3JvdGUgdGhlIEVDT0ZGIHN1cHBvcnQgYmFzZWQgb24gTWljaGFlbAotTWVpc3NuZXIncyBtaXBzLXRmaWxlIHByb2dyYW0sIHdyb3RlIHRoZSBQb3dlclBDIGFuZCBSUy82MDAwIHN1cHBvcnQsCi1hbmQgbWFkZSBhIGZldyBvdGhlciBtaW5vciBwYXRjaGVzLiAgSGUgaGFuZGxlZCB0aGUgYmludXRpbHMgcmVsZWFzZXMKLWZvciB2ZXJzaW9ucyAyLjcgdGhyb3VnaCAyLjkuCi0KLURhdmlkIEVkZWxzb2huIGNvbnRyaWJ1dGVkIGZpeGVzIGZvciB0aGUgUG93ZXJQQyBhbmQgQUlYIHN1cHBvcnQuCi0KLVN0ZXZlIENoYW1iZXJsYWluIG1hZGUgZ2FzIGFibGUgdG8gZ2VuZXJhdGUgbGlzdGluZ3MuCi0KLVN1cHBvcnQgZm9yIHRoZSBIUDkwMDAvMzAwIHdhcyBjb250cmlidXRlZCBieSBHbGVubiBFbmdlbCBvZiBIUC4KLQotU3VwcG9ydCBmb3IgRUxGIGZvcm1hdCBmaWxlcyBoYXMgYmVlbiB3b3JrZWQgb24gYnkgTWFyayBFaWNoaW4gb2YKLUN5Z251cyBTb2x1dGlvbnMgKG9yaWdpbmFsLCBpbmNvbXBsZXRlIGltcGxlbWVudGF0aW9uKSwgUGV0ZQotSG9vZ2VuYm9vbSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoIChIUFBBIG1haW5seSksIE1pY2hhZWwgTWVpc3NuZXIKLW9mIHRoZSBPcGVuIFNvZnR3YXJlIEZvdW5kYXRpb24gKGkzODYgbWFpbmx5KSwgYW5kIEtlbiBSYWVidXJuIG9mCi1DeWdudXMgU29sdXRpb25zIChzcGFyYywgaW5pdGlhbCA2NC1iaXQgc3VwcG9ydCkuCi0KLVNldmVyYWwgZW5naW5lZXJzIGF0IEN5Z251cyBTb2x1dGlvbnMgaGF2ZSBhbHNvIHByb3ZpZGVkIG1hbnkgc21hbGwKLWJ1ZyBmaXhlcyBhbmQgY29uZmlndXJhdGlvbiBlbmhhbmNlbWVudHMuCi0KLVRoZSBpbml0aWFsIEFscGhhIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IENhcm5lZ2llLU1lbGxvbgotVW5pdmVyc2l0eS4gIEFkZGl0aW9uYWwgd29yayB3YXMgZG9uZSBieSBLZW4gUmFlYnVybiBvZiBDeWdudXMKLVNvbHV0aW9ucy4gIFJpY2hhcmQgSGVuZGVyc29uIHRoZW4gcmV3cm90ZSBtdWNoIG9mIHRoZSBBbHBoYSBzdXBwb3J0LgotCi1JYW4gRGFsbCB1cGRhdGVkIHRoZSBzdXBwb3J0IGNvZGUgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIDMyMDAwCi1zZXJpZXMsIGFuZCBhZGRlZCBzdXBwb3J0IGZvciBNYWNoIDMgYW5kIE5ldEJTRCBydW5uaW5nIG9uIHRoZSBQQzUzMi4KLQotS2xhdXMgS2FlbXBmIHBvcnRlZCB0aGUgYXNzZW1ibGVyIGFuZCB0aGUgYmludXRpbHMgdG8gb3BlblZNUy9BbHBoYS4KLQotU3RldmUgSGF3b3J0aCBjb250cmlidXRlZCB0aGUgc3VwcG9ydCBmb3IgdGhlIFRleGFzIEluc3RydWN0aW9uIGMzMAotKHRtczMyMGMzMCkuCi0KLUguSi4gTHUgaGFzIGNvbnRyaWJ1dGVkIG1hbnkgcGF0Y2hlcyBhbmQgbXVjaCB0ZXN0aW5nLgotCi1BbGFuIE1vZHJhIHJld29ya2VkIG11Y2ggb2YgdGhlIGkzODYgYmFja2VuZCwgaW1wcm92aW5nIHRoZSBlcnJvcgotY2hlY2tpbmcsIHVwZGF0aW5nIHRoZSBjb2RlLCBhbmQgaW1wcm92aW5nIHRoZSAxNiBiaXQgc3VwcG9ydCwgdXNpbmcKLXBhdGNoZXMgZnJvbSB0aGUgd29yayBvZiBNYXJ0eW5hcyBLdW5pZ2VsaXMgYW5kIEguSi4gTHUuCi0KLU1hbnkgb3RoZXJzIGhhdmUgY29udHJpYnV0ZWQgbGFyZ2Ugb3Igc21hbGwgYnVnZml4ZXMgYW5kIGVuaGFuY2VtZW50cy4gIElmCi15b3UndmUgY29udHJpYnV0ZWQgc2lnbmlmaWNhbnQgd29yayBhbmQgYXJlIG5vdCBtZW50aW9uZWQgb24gdGhpcyBsaXN0LCBhbmQKLXdhbnQgdG8gYmUsIGxldCB1cyBrbm93LiAgU29tZSBvZiB0aGUgaGlzdG9yeSBoYXMgYmVlbiBsb3N0OyB3ZSBhcmVuJ3QKLWludGVudGlvbmFsbHkgbGVhdmluZyBhbnlvbmUgb3V0LgpkaWZmIC0tZ2l0IGEvZ2FzL0NPUFlJTkcgYi9nYXMvQ09QWUlORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1NDliZS4uMDAwMDAwMAotLS0gYS9nYXMvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQwKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCi1hIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCi1tZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgotdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCi1sYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCi10aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KLWlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCi1zb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKLWNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKLW5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKLWFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCi0gICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55Ci0gICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKLSAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5Ci0gICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAotICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KLSAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKLSAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKLSAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCi0gICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKLSAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAotICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KLSAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQwKLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotDAotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotDAotICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKLXRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKLWxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0gIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKLXRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCi1tYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwotb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLVBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAotUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLQkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2dhcy9DaGFuZ2VMb2cgYi9nYXMvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWUwOWVjLi4wMDAwMDAwCi0tLSBhL2dhcy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwzMjU3ICswLDAgQEAKLTE5OTktMDUtMjUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4Myk6IE9ubHkgZG8gMTk5OS0wNS0xNyBmeF9wY3JlbAotCXJlbG9jIGNoYW5nZXMgd2hlbiBkZWZpbmVkKEJGRF9BU1NFTUJMRVIpLgotCi0xOTk5LTA1LTE3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2dlbl9yZWxvYyk6IFJlbW92ZSBGIGFuZCBNQVAgbWFjcm9zLgotCi0JKiB3cml0ZS5jICh3cml0ZV9wcmludF9zdGF0aXN0aWNzKTogT3V0cHV0IHRvIGZpbGUsIG5vdCBzdGRlcnIuCi0KLQkqIGV4cHIuYyAoZ2VuZXJpY19iaWdudW1fdG9faW50MzIsNjQpOiBQcm90b3R5cGUuCi0KLQkqIHJlYWQuYyAoc19sY29tbV9pbnRlcm5hbCwgc2l6ZW9mX3NsZWIxMjgsIHNpemVvZl91bGViMTI4LAotCW91dHB1dF9zbGViMTI4LCBvdXRwdXRfdWxlYjEyOCwgb3V0cHV0X2JpZ19zbGViMTI4LAotCW91dHB1dF9iaWdfdWxlYjEyOCwgb3V0cHV0X2JpZ19sZWIxMjgpOiBQcm90b3R5cGUuCi0JKG91dHB1dF9iaWdfc2xlYjEyOCwgb3V0cHV0X2JpZ191bGViMTI4KTogTWFrZSBpbmxpbmUuCi0JKG91dHB1dF9iaWdfbGViMTI4KTogUmVtb3ZlIGlubGluZQotCi0JRnJvbSBNYWNpZWogVy4gUm96eWNraSA8bWFjcm9AZHMyLnBnLmdkYS5wbD4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBDb252ZXJ0IEJGRF9SRUxPQ18xNiB3aXRoCi0JZnhfcGNyZWwgc2V0IHRvIEJGRF9SRUxPQ18xNl9QQ1JFTC4gIFNpbWlsYXJseSBmb3IgQkZEX1JFTE9DXzguCi0JSGFuZGxlIEJGRF9SRUxPQ18xNl9QQ1JFTCBhbmQgQkZEX1JFTE9DXzhfUENSRUwuICBSZXR1cm4gY2hhbmdlZAotCXZhbHVlIGZvciBjb3JyZWN0IG92ZXJmbG93IGNoZWNrIGluIHdyaXRlLmM6Zml4dXBfc2VnbWVudC4KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBNb3ZlIGJpdGZpZWxkIG92ZXJmbG93IGNoZWNrcyB0byBhZnRlcgotCXRoZSBtZF9hcHBseV9maXggY2FsbC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogTGlrZXdpc2UuCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKENQVSBiYWNrZW5kKTogTWVudGlvbiBtZF9hcHBseV9maXggbW9kaWZ5aW5nCi0JdmFsdWVUICp2YWwgYXJndW1lbnQuCi0KLUZyaSBNYXkgMTQgMTA6NTI6MTMgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKGdlbl90b193b3Jkcyk6IENvcnJlY3RseSByb3VuZCBhCi0JZGVub3JtYWxpemVkIG51bWJlci4gIEZpeCBvZmYtYnktb25lIGluIHJhbmdlIGNoZWNraW5nIGZvcgotCWV4cG9uZW50IGluIGEgZGVub3JtYWwuIAotCi0xOTk5LTA1LTEwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAocGFyc2VfcmVnKTogQWNjZXB0ICdzcCcgYXMgYSB2YWxpZCByZWdpc3RlcgotCW5hbWUuIAotCi1UaHUgTWF5IDEzIDA5OjQ2OjU5IDE5OTkgIEpvZWwgU2hlcnJpbGwgKGpvZWxAT0FSY29ycC5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLXJ0ZW1zZWxmKiwgc2gtKi1ydGVtc2VsZiopOiBOZXcgdGFyZ2V0cy4KLQotMTk5OS0wNS0xMiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChJbnZNZW0pOiBOZXcgZmxhZy4gIEFkZCB0byBBbnlNZW0uCi0JKFJldmVyc2VSZWdSZWdtZW0pOiBSZW1vdmUuCi0JKEltbUV4dCk6IE5ldyBmbGFnLiAgUmVudW1iZXIgc29tZSBvZiB0aGUgb3Bjb2RlX21vZGlmaWVyIGJpdHMuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IFRlc3QgZm9yIFBJSUkgU0lNRCBhbmQgQU1ECi0JM0ROb3chIHZpYSBJbW1FeHQgb3Bjb2RlX21vZGlmaWVyLiAgUmVtb3ZlIFJldmVyc2VSZWdSZWdtZW0KLQlrbHVkZ2UuCi0KLQlGcm9tICBEb3VnIExlZGZvcmQgPGRsZWRmb3JkQHJlZGhhdC5jb20+Ci0JKiBjb25maWcvdGMtaTM4Ni5oIChSZWdYTU0pOiBOZXcgZm9yIFAvSUlJLgotCSogY29uZmlnL3RjLWkzODYuYzogQWRkIHN1cHBvcnQgZm9yIFAvSUlJLgotCi1TYXQgTWF5ICA4IDIzOjI4OjUwIDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGFyc2Vfb3B0aW9uKTogUmVjb2duaXplIC1tcHBjNjRicmlkZ2UuCi0JKG1kX2JlZ2luKTogQWxsb3cgcHBjMzIgaW5zbnMgaW4gcHBjNjRicmlkZ2UgbW9kZS4KLQkocHBjX2luc2VydF9vcGVyYW5kKTogQWNjZXB0IFNJR05PUFQgaW4gcHBjNjQgbW9kZS4KLQotVGh1IE1heSAgNiAyMzoxMzozOSAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2ltbWVkaWF0ZSk6IFNraXAgd2hpdGVzcGFjZSBiZWZvcmUKLQljb21wbGFpbmluZyBhYm91dCBqdW5rIGFmdGVyIGV4cHJlc3Npb24uCi0JKGkzODZfZGlzcGxhY2VtZW50KTogTGlrZXdpc2UuCi0KLVRodSBNYXkgIDYgMTk6NTA6MTQgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfZmluZF9iYXNlKTogVXNlIG1lbWNweSBpbnN0ZWFkIG9mIHN0cmNweS4KLQlEb24ndCBjb3B5IGJlZm9yZSBkb3duY2FzZWluZy4KLQotMTk5OS0wNS0wNSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0gCi0gICAgICAgICogdGMtbTY4ay5jOiBJbmNsdWRlIGVsZi9tNjhrLmguCi0gICAgICAgIChtNjhrX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogTmV3IHJvdXRpbmUuCi0gICAgICAgICogdGMtbTY4ay5oIChlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyBtNjhrX2VsZl9maW5hbF9wcm9jZXNzaW5nKToKLSAgICAgICAgRGVmaW5lLgotIAotTW9uIE1heSAgMyAxMDoyNjowMyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSAyMiBiaXQgZm10IGluc24gbGlrZSBhCi0JMTcgYml0IGZtdCBpbnNuLgotCi0xOTk5LTA0LTMwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAobWNvcmVfc19zZWN0aW9uKTogRHVtcCBsaXRlcmFscyBiZWZvcmUKLQljaGFuZ2luZyBzZWN0aW9uLgotCi0xOTk5LTA0LTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAobWRfYXBwbHlfZml4Myk6IEluc2VydCByZWxvYyBhZGRlbmQgaW50byBpbnNuCi0JZm9yIENPRkYvUEUgcG9ydC4KLQotTW9uIEFwciAyNiAxMjozNDozNyAxOTk5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5oIChUQ19GSVhfVFlQRSk6IERlbGV0ZSwgY2dlbiBmaWVsZHMgbW92ZWQgdG8gd3JpdGUuaC4KLQkoVENfSU5JVF9GSVhfREFUQSk6IERlbGV0ZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmggKFRDX0ZJWF9UWVBFKTogRGVsZXRlLCBjZ2VuIGZpZWxkcyBtb3ZlZCB0byB3cml0ZS5oLgotCShUQ19JTklUX0ZJWF9EQVRBKTogRGVsZXRlLgotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IE5ldyBtZW1iZXIgZnhfY2dlbiwgaWZkZWYgVVNJTkdfQ0dFTi4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBJbml0aWFsaXplIGZ4X2NnZW4gbWVtYmVyLgotCSogY2dlbi5jIChnYXNfY2dlbl9yZWNvcmRfZml4dXAsZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IFVwZGF0ZS4KLQkoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6IFVwZGF0ZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogVXBkYXRlLgotCShtZF9jZ2VuX3JlY29yZF9maXh1cF9leHApOiBVcGRhdGUuCi0JKEZYX09QSU5GT19SX1RZUEUpOiBVcGRhdGUuCi0KLQkqIGZyYWdzLmMgKGZyYWdfdmFyLGZyYWdfdmFyaWFudCk6IEluaXRpYWxpemUgZnJfY2dlbiBoZXJlLgotCSogY29uZmlnL3RjLWZyMzAuaCAoVENfRlJBR19JTklUKTogRGVsZXRlLgotCSogY29uZmlnL3RjLW0zMnIuaCAoVENfRlJBR19JTklUKTogRGVsZXRlLgotCSogZnJhZ3MuaCAoc3RydWN0IGZyYWcpOiBNYWtlIG9waW5kZXgsIG9waW5mbyBpbnRzLgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChGWF9PUElORk9fUl9UWVBFKTogRGVsZXRlLCB1bnVzZWQuCi0KLTE5OTktMDQtMjYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBVcGRhdGVkIGZvciBuZXcgdmVyc2lvbiBvZiBsaWJ0b29sLgotCi0xOTk5LTA0LTIyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAobWRfYXBwbHlfZml4Myk6IFJlbmFtZWQgZnVuY3Rpb24gZnJvbQotCW1kX2FwcGx5X2ZpeC4gCi0JKG1kX2FwcGx5X2ZpeDMpOiBEbyBub3QgZml4IHVwIGFic29sdXRlIHJlbG9jYXRpb25zIGFnYWluc3QKLQlzeW1ib2xpYyB2YWx1ZXMuCi0KLQkqIGNvbmZpZy90Yy1tY29yZS5oIChNRF9BUFBMWV9GSVgzKTogRGVmaW5lLgotCi0xOTk5LTA0LTIwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIGludGVyY2VwdHMgZm9yIHNlY3Rpb24KLQljaGFuZ2VzIGFuZCBkYXRhLWluLXRleHQgZGlyZWN0aXZlcy4KLQkobWNvcmVfY29ucyk6IE5ldyBmdW5jdGlvbjogaW50ZXJjZXB0IGNvbnMoKSBvcGVyYXRpb25zLgotCShtY29yZV9mbG9hdF9jb25zKTogTmV3IGZ1bmN0aW9uOiBpbnRlcmNlcHQgZmxvYXRfY29ucygpCi0Jb3BlcmF0aW9ucy4gCi0JKG1jb3JlX3N0cmluZ2VyKTogTmV3IGZ1bmN0aW9uOiBpbnRlcmNlcHQgc3RyaW5nZXIoKSBvcGVyYXRpb25zLgotCi0xOTk5LTA0LTE4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogb2JqLmggKHN0cnVjdCBmb3JtYXRfb3BzKTogQ2hhbmdlIGdlbmVyYXRlX2FzbV9saW5lbm8gZmllbGQgdG8KLQl0YWtlIG5vIHBhcmFtZXRlcnMuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKE9CSl9HRU5FUkFURV9BU01fTElORU5PKTogRG9uJ3QgZGVmaW5lLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoZmluZF9vcGNvZGVfbWF0Y2gpOiBBZGQgZGVmYXVsdCBjYXNlIHRvCi0Jc3dpdGNoLgotCShmaW5kX21hY3JvX21hdGNoKTogTGlrZXdpc2UuCi0JKGxvYWRfZXhwcmVzc2lvbik6IFBhcmVudGhlc2l6ZSAmJiB3aXRoaW4gfHwuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBEZWZpbmUuCi0KLTE5OTktMDQtMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgb3ZlcnJpZGVzIGZvciAuYnNzCi0JLnRleHQgLmRhdGEgLnNlY3Rpb24gcHNldWRvIG9wcy4KLQkobWNvcmVfc19zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLiAgRHVtcCBsaXRzIGJlZm9yZSBjaGFuZ2luZyBzZWNzLiAKLQkobWNvcmVfc190ZXh0KTogTmV3IGZ1bmN0aW9uLiAgRHVtcCBsaXRzIGJlZm9yZSBjaGFuZ2luZyBzZWNzLiAKLQkobWNvcmVfc19kYXRhKTogTmV3IGZ1bmN0aW9uLiAgRHVtcCBsaXRzIGJlZm9yZSBjaGFuZ2luZyBzZWNzLiAKLQotMTk5OS0wNC0xNiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfMzJiaXRtb2RlKTogTmV3LgotCShtZF9iZWdpbik6IFNldCBtaXBzXzMyYml0bW9kZSBpZiBuZWVkZWQuCi0JKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBEb24ndCBzZXQgRUZfTUlQU19BUkNILgotCVNldCBFRl9NSVBTXzMyQklUTU9ERS4KLQotRnJpIEFwciAxNiAxMjoyNjozOSAxOTk5ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfc2VjdGlvbl9zeW1ib2wpOiBGaXggdHlwbyBpbiBwcmV2aW91cwotCWNoYW5nZS4KLQotMTk5OS0wNC0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmggKExPQ0FMX0xBQkVMU19GQik6IERlZmluZSB0byAxLgotCi1UaHUgQXByIDE1IDE2OjUyOjA5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChwYV9nZXRfYWJzb2x1dGVfZXhyZXNzaW9uKTogVHJ5IHRvIGhhbmRsZSAiNSAlcjMiIAotCWV4cHJlc3Npb25zIGNvcnJlY3RseS4KLQotCi0xOTk5LTA0LTE1ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IFNldCBFRl9NSVBTX0FSQ0guCi0KLU1vbiBBcHIgMTIgMjM6NDU6MDcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICczJyk6IE5ldyBjYXNlIGZvciBQQTIuMCBmbXB5ZmFkZAotCWFuZCBmbXB5bmZhZGQgaW5zdHJ1Y3Rpb25zLgotCi0xOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcy5oIChlbnZpcm9uKTogRGVjbGFyZSBpdCwgaWYgbmVlZGVkLgotCSogYXMuYyAoZHVtcF9zdGF0aXN0aWNzKTogRG9uJ3QgZGVjbGFyZSBlbnZpcm9uLgotCSogY29uZmlndXJlLmluIChlbnZpcm9uKTogRGV0ZWN0IGRlY2xhcmF0aW9uLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQKLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9pbW1lZGlhdGUpOiBBY2NlcHQgQEdPVCByZWxvY2F0aW9ucy4KLQkoaTM4Nl9kaXNwbGFjZW1lbnQpOiBBbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIHJlcGxhY2VtZW50IGJ1ZmZlci4KLQlDbGVhbiB1cCByZXBsYWNlbWVudCBidWZmZXIgaW5pdGlhbGl6YXRpb24uCi0KLTE5OTktMDQtMTEgIEJvYiBNYW5zb24gPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+OgotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogRG9uJ3QgY3JlYXRlIGEgbmV3IHN5bWJvbCBpZiBvbmUKLQlhbHJlYWR5IGV4aXN0czsgaW5zdGVhZCwgdXNlIHRoZSBleGlzdGluZyBvbmUsIGJ1dCBzZXQgaXRzIHNlZ21lbnQKLQlhbmQgZnJhZyBkYXRhIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gZGVmaW5lZC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX3NlY3Rpb25fc3ltYm9sKTogTGlrZXdpc2UuCi0KLVNhdCBBcHIgMTAgMjA6MTA6MDIgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGMtYWxwaGEuYyAobG9hZF9leHByZXNzaW9uKTogQ2FsbCBhc19iYWQgaW5zdGVhZCBvZiBhYm9ydC4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmM6IE5ldyBGaWxlOiBTdXBwb3J0IHJvdXRpbmVzIGZvciBNQ29yZQotCWFzc2VtYmxlci4KLQkqIGNvbmZpZy90Yy1tY29yZS5oOiBOZXcgRmlsZTogRGVmaW5pdGlvbnMgZm9yIE1Db3JlIGFzc2VtYmxlci4gCi0JKiBjb25maWcvb2JqLWNvZmYuYzogQWRkIHN1cHBvcnQgZm9yIG1jb3JlLXBlIHRhcmdldC4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBzdXBwb3J0IGZvciBNQ29yZSB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBNQ29yZSB0YXJnZXRzLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBkb2MvYWxsLnRleGk6IFNldCBNQ09SRS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBNQ29yZSBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLQkKLQkqIHdyaXRlLmg6IFByZXZlbnQgbXVsdGlwbGUgaW5jbHVzaW9uLgotCi0xOTk5LTA0LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogYXNpbnRsLmggKExDX01FU1NBR0VTKTogTmV2ZXIgZGVmaW5lLgotCSogYXMuYyAobWFpbik6IERvbid0IHBhc3MgTENfTUVTU0FHRVMgdG8gc2V0bG9jYWxlIGlmIHRoZSBzeXN0ZW0KLQlkb2VzIG5vdCBkZWZpbmUgaXQuCi0JKiBnYXNwLmMgKG1haW4pOiBEb24ndCBwYXNzIExDX01FU1NBR0VTIHRvIHNldGxvY2FsZSBpZiB0aGUgc3lzdGVtCi0JZG9lcyBub3QgZGVmaW5lIGl0LgotCi0JKiBNYWtlZmlsZS5hbSAobTY4ay1wYXJzZS5jKTogSWYgY29uZmlndXJpbmcgaW4gdGhlIHNvdXJjZQotCWRpcmVjdG9yeSwgY29weSBtNjhrLXBhcnNlLnkgaW50byB0aGUgbG9jYWwgZGlyZWN0b3J5IGJlZm9yZQotCXJ1bm5pbmcgeWx3cmFwLCB0byByZW1vdmUgc3B1cmlvdXMgZGlmZmVyZW5jZXMgd2hlbiBnZW5lcmF0aW5nCi0Jc25hcHNob3RzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChtZF9kb19hbGlnbik6IEp1c3QgYWxsb2NhdGUgdGhlIG51bWJlciBvZgotCWJ5dGVzIG5lY2Vzc2FyeSwgcmF0aGVyIHRoYW4gYWx3YXlzIGFsbG9jYXRpbmcgMTAyNC4KLQotMTk5OS0wNC0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19uZXdsaW5lKTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkqIHJlYWQuYyAoZ2VuZXJhdGVfbGluZW5vX2RlYnVnKTogQWRkIGNhc2VzIHRvIHN3aXRjaC4gIFJlaW5kZW50LgotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9zY2FsZSk6IEFkZCByZXR1cm4gdmFsdWUuCi0JKGJ1aWxkX2Rpc3BsYWNlbWVudF9zdHJpbmcpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHRlbXBfZGlzcDIuCi0JKGkzODZfaW50ZWxfbWVtb3J5X29wZXJhbmQpOiBBZGQgcGFyZW50aGVzZXMgdG8gYXZvaWQgd2FybmluZy4KLQkoaTM4Nl9pbnRlbF9vcGVyYW5kKTogUmVtb3ZlIHVudXNlZCBsb2NhbCBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcuCi0JKGkzODZfb3BlcmFuZCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgb3BlcmFuZF9tb2RpZmllci4KLQkoaTM4Nl9vcGVyYW5kKTogQWRkIHBhcmVucyB0byBhdm9pZCB3YXJuaW5nLgotCi0xOTk5LTA0LTA0ICBEb24gQm93bWFuIDxkb25AcGl4c2NpLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbWlwcyotKi12eHdvcmtzKiB0YXJnZXQ7IGhhdmUgaXQgZGVmaW5lCi0JTUlQU19TVEFCU19FTEYuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotMTk5OS0wMy0zMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChlbXVsYXRpb25zKTogQWRkIHN1cHBvcnQgZm9yIGFybS1lcG9jLXBlLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogY29uZmlnL3RlLWVwb2MtcGUuaDogTmV3IGZpbGUuICBEZWZpbmUgbWFjcm9zIHNwZWNpZmljIHRvCi0JYXJtLWVwb2MtcGUgdGFyZ2V0LgotCSogY29uZmlnL3RjLWFybS5oOiBTZWxlY3QgZXBvYy1wZS1hcm0gdGFyZ2V0IGZvcm1hdCBpZiBjb25maWd1cmVkCi0JZm9yIGFybS1lcG9jLXBlIHRhcmdldC4KLQotTW9uIE1hciAyOSAxMDoxNTo0MCBDU1QgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIHRjLW1pcHMuYyAobWRfYXBwbHlfZml4KTogIEFkanVzdCB2YWx1ZSBmb3IgbGlua29uY2Ugc2VjdGlvbnMuCi0KLVdlZCBNYXIgMjQgMTQ6MTE6MTAgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKHBhX3BhcnNlX25vbm5lZ19jbXBzdWJfY21wbHRyKTogQ2xlYW4gdXAgY29kZSB0bwotCWRldGVjdCAiLG4iIHdpdGhvdXQgYSBjb25kaXRpb24uCi0JKHBhX3BhcnNlX25lZ19jbXBzdWJfY21wbHRyKTogTGlrZXdpc2UuCi0KLQotVHVlIE1hciAyMyAxMToyODoyMyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAocGFfaXAsIGNhc2UgJ34nKTogVGhlIGNvbmRpdGlvbiBmb3IgYSBicmFuY2ggb24gYml0Ci0JaW5zdHJ1Y3Rpb24gaXMgZW5jb2RlZCB3aXRoIG9uZSBiaXQuCi0KLQotMTk5OS0wMy0yMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoQ1BVIGJhY2tlbmQpOiBNZW50aW9uIHRoYXQKLQlsaW5lX3NlcGFyYXRvcl9jaGFycyBzaG91bGQgbm90IGluY2x1ZGUgbmV3bGluZS4gIEZyb20gdGhpCi0JPHR0bkBtaW5nbGUuZ2x1Zy5vcmc+LgotCi0xOTk5LTAzLTIyICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2JlZ2luKTogVXBkYXRlIGNhbGwgdG8gZnIzMF9jZ2VuX2NwdV9vcGVuLgotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfYmVnaW4pOiBVcGRhdGUgY2FsbCB0byBtMzJyX2NnZW5fY3B1X29wZW4uCi0KLVN1biBNYXIgMjEgMTg6MDg6MTggMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGMtYWxwaGEuYyAobWRfYXNzZW1ibGUpOiBBbGxvdyAnNicgaW4gYW4gb3Bjb2RlLgotCi1UaHUgTWFyIDE4IDEwOjU1OjMwIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChwYV9pcCwgY2FzZSAnYScpOiBEbyBub3QgY2FsbCBwYV9wYXJzZV8uLi5fY21wc3ViX2NtcGx0ci4KLQotCi1UaHUgTWFyIDE4IDAyOjMwOjA3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChwYV9pcCwgY2FzZSAnZCcpOiBEbyBub3QgYWxsb3cgIixuIi4KLQkKLTE5OTktMDMtMTUgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBDaGFuZ2UgJy0nIGJhY2sgdG8gYSBzeW1ib2wgY2hhcgotCXNvIHdlIGNhbiB1c2UgbXVsdGlwbGUgb3Bjb2RlcyBvbiBhIGxpbmUgYWdhaW4uCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmM6IEJ5IGRlZmF1bHQsIHdhcm4gaWYgYSBzeW1ib2wgaGFzCi0JdGhlIHNhbWUgbmFtZSBhcyBhIHJlZ2lzdGVyLiAgUGx1cyBzb21lIG1pbm9yCi0JdXBkYXRlcyBmcm9tIHRoZSBicmFuY2guCi0KLTE5OTktMDMtMTMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBIYW5kbGUgQkZEX1JFTE9DXzgsCi0JQkZEX1JFTE9DXzE2IGFuZCBCRkRfUkVMT0NfNjQuCi0KLTE5OTktMDMtMTIgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZXhwci5jIChleHByKTogQWRkIG1pc3NpbmcgZWxzZS4KLQotMTk5OS0wMy0xMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogSW1wcm92ZSBlcnJvciBtZXNzYWdlLgotCi0xOTk5LTAzLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChDUFVfVFlQRVMpOiBBZGQgZnIzMC4KLQkoY2dlbi5vKTogQWRkICQoQ0dFTl9DUFVfUFJFRklYKS1kZXNjLmggZGVwZW5kZW5jeS4KLQkoZnIzMCxtMzJyIGRlcGVuZGVuY2llcyk6IFVwZGF0ZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjZ2VuLmMgKGdhc19jZ2VuX3JlY29yZF9maXh1cCk6IFVwZGF0ZSB1c2Ugb2Ygb3BlcmFuZC0+dHlwZS4KLQkoZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IERpdHRvLgotCShnYXNfY2dlbl9maW5pc2hfaW5zbik6IENhbGwgY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9udW0uCi0JKGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMpOiBEaXR0by4gIFVwZGF0ZSBjYWxsIHRvIHNldF92bWFfb3BlcmFuZC4KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2JlZ2luKTogVXBkYXRlIGNhbGwgdG8gZnIzMF9jZ2VuX2NwdV9vcGVuLgotCShtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IFVwZGF0ZSB1c2Ugb2Ygb3BlcmFuZC0+dHlwZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2JlZ2luKTogVXBkYXRlIGNhbGwgdG8gZnIzMF9jZ2VuX2NwdV9vcGVuLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBDYWxsIGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtLgotCShtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IFVwZGF0ZSB1c2Ugb2Ygb3BlcmFuZC0+dHlwZS4KLQkobTMycl9jZ2VuX3JlY29yZF9maXh1cF9leHApOiBEaXR0by4KLQotMTk5OS0wMy0wOSAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9zaG93X3VzYWdlKTogRml4IG1lc3NhZ2UuCi0KLTE5OTktMDMtMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLWFybS50ZXhpIChBUk0gU3ludGF4KTogRG9jdW1lbnQgbmV3IGNvbW1hbmQgbGluZSBzd2l0Y2hlcwotCWFuZCBMRFIgcmVnLD08ZXhwcj4gaW5zdHJ1Y3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1hcm0uYzogQWRkIHN1cHBvcnQgZm9yIC1tY3B1PWFybTgxMCwgLW1jcHU9YXJtOSBhbmQKLQktbWNwdT1hcm05dGRtaS4KLQotRnJpIEZlYiAxOSAwOTozNjozMCAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLWFybS50ZXhpIChBUk0tQ2hhcnMpOiBGaXggdHlwbyBpbiB1c2Ugb2YgJ0AnLgotCi0xOTk5LTAyLTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JVGhpcyBwYXRjaCB3YXMgY3JlYXRlZCBieTogU2NvdHQgQmFtYnJvdWdoCi0JPHNjb3R0YkBjb3JlbGNvbXB1dGVyLmNvbT4KLQkKLQkqIGFwcC5jOiAKLQkgIFNwZWNpYWwgY2FzZWQgJ0AnIGNoYXJhY3Rlci4gIFRoZSAnQCcgY2hhcmFjdGVyIGlzIHVzZWQgYXMgdGhlCi0JICBBUk0gYXNzZW1ibGVyIGNvbW1lbnQgY2hhcmFjdGVyLCBhcyBhIHNwZWNpYWwgY2hhcmFjdGVyIAotCSAgYW5kIGluIEVMRiAuc3ltdmVyIHBzZXVkby1vcCdzLCBhbmQgYXMgYSBzcGVjaWFsIGNoYXJhY3RlciBpbgotCSAgLnR5cGUgYW5kIC5zZWN0aW9uIHBzZXVkby1vcHMuCi0JKHN5bXZlcl9wc2V1ZG8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzeW12ZXJfc3RhdGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzdHJ1Y3QgYXBwX3NhdmUpOiBBZGQgZmllbGQgJ3N5bXZlcl9zdGF0ZScuCi0JKGFwcF9wdXNoKTogU2F2ZSBnbG9iYWwgc3ltdmVyX3N0YXRlIGludCBzdHJ1Y3QgYXBwX3NhdmUuCi0JKGFwcF9wb3ApOiBSZXN0b3JlIGdsb2JhbCBzeW12ZXJfc3RhdGUgZnJvbSBzdHJ1Y3QgYXBwX3NhdmUuCi0gIAkoZG9fc2NydWJfY2hhcnMpOiBTcGVjaWFsIGNhc2UgaGFuZGxpbmcgb2YgJ0AnIGNoYXJhY3RlciBpbgotCS5zeW12ZXIgcHNldWRvLW9wcy4gCi0KLQkqIGNvbmZpZ3VyZS5pbjogTW9kaWZpZWQgdG8gcmVjb2duaXplIGFybXYqIHVuYW1lIHN5bnRheCBmcm9tIEFSTQotCUxpbnV4IGtlcm5lbC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBBbGxvdyAnJScgYXMgd2VsbCBhcyAnQCcgYXMKLQlhIHByZWZpeCB0byB0aGUgc2VjdGlvbidzIHR5cGUuCi0JKG9ial9lbGZfdHlwZSk6IEFsbG93ICclJyBhcyB3ZWxsIGFzICdAJyBhbmQgJyMnIGFzIHByZWZpeGVzIHRvCi0JdGhlIHR5cGUncyB0eXBlbmFtZS4KLQotCSogY29uZmlnL3RjLWFybS5oOiBBZGQgc3VwcG9ydCBmb3IgUElDIGdlbmVyYXRpb246Ci0JKHBpY19jb2RlKTogTmV3IGJvb2xlYW4uCi0JKG9ial9yZWxvY2F0ZV9leHRlcm4pOiBEZWZpbmUuCi0JKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IERlZmluZQotCShUQ19DT05TX0ZJWF9ORVcpOiBEZWZpbmUuCi0JKHRjX2ZpeF9hZGp1c3RhYmxlKTogRGVmaW5lLgotCShHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpOiBEZWZpbmUuCi0JCi0JKiBjb25maWcvdGMtYXJtLmM6IEFkZCBzdXBwb3J0IGZvciBQSUMgZ2VuZXJhdGlvbjoKLQkobGluZV9zZXBlcmF0b3JfY2hhcnMpOiBBbGxvdyAnOycgYXMgYSBzZXBlcmF0b3IgZm9yIExpbnV4LgotCShpc19pbW1lZGlhdGVfcHJlZml4KTogTmV3IG1hY3JvLgotCShhcm1fcGFyc2VfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKHNfYXJtX2VsZl9jb25zKTogTmV3IGZ1bmN0aW9uLgotCShkb19icmFuY2gpOiBTcGVjaWFsIGNhc2UgZm9yIEJGRF9SRUxPQ19BUk1fUExUMzIuCi0JKG1kX3VuZGVmaW5lZF9zeW1ib2wpOiBTcGVjaWFsIGNhc2UgaGFuZGxpbmcgZm9yIHRoZSBHbG9iYWwgT2Zmc2V0Ci0JICBUYWJsZSdzIHN5bWJvbC4KLQkobWRfYXBwbHlfZml4Myk6IEhhbmRsZSBQSUMgcmVsb2NzLgotCSh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgUElDIHJlbG9jcy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWRkIHN1cHBvcnQgZm9yICctaycgY29tbWFuZCBsaW5lIHN3aXRjaCB0bwotCSAgZW5hYmxlIFBJQyBnZW5lcmF0aW9uLgotCShjb25zX2ZpeF9uZXdfYXJtKTogTmV3IGZ1bmN0aW9uLgotCShzX2FybV9lbGZfY29ucyk6IE5ldyBmdW5jdGlvbi4KLQotVHVlIEZlYiAxNiAxNjozMTo1MyAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGNvbW1lbnRzIGZvciB1c2VzIG9mIEFDX0RFRklORS4KLQkqIGFjaW5jbHVkZS5tNDogTGlrZXdpc2UuCi0JKiBhY2NvbmZpZy5oOiBSZW1vdmUuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBjb25maWcuaW46IFJlYnVpbGQuCi0KLTE5OTktMDItMTUgIEppbSBMZW1rZSAgPGpsZW1rZUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwOiBjYXNlICdvJyk6IEZpeCBhc3NlcnRpb24gZmFpbHVyZSBmb3IKLQlub24tY29uc3RhbnQgb2Zmc2V0IGZyb20gYSBiYXNlIHJlZ2lzdGVyLgotCi0xOTk5LTAyLTE0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AcmFlYnVybi5vcmc+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zaG93X3VzYWdlKTogUHV0IFwgYmVmb3JlIG5ld2xpbmUgaW4KLQlzdHJpbmdzIGFsd2F5cy4KLQotU2F0IEZlYiAxMyAxNDoxMDoxMCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoY3B1X3R5cGVzKTogRW5hYmxlIEVWNiBQQUxjb2RlIHdpdGggLW0yMTI2NC4KLQkoZW1pdF9pbnNuKTogTG9vayBmb3IgcGMtcmVsYXRpdmUgYW5kIG5vLW92ZXJmbG93IHNwZWNpZmllcnMgb24KLQlpbnRlcm5hbCByZWxvY2F0aW9uIHR5cGVzLgotCi0xOTk5LTAyLTEzICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLW1pcHMudGV4aSAoTUlQUyBPcHRzKTogVXBkYXRlZCBsaXN0IG9mIC1tTk5OTiBhbmQKLQktbWNwdT1OTk5OIGZsYWdzLgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBSZW1vdmUgYWxsIHRoZSBtaXBzX05OTk4gdmFyaWFibGVzOyBqdXN0IHVzZQotCW1pcHNfY3B1IGluc3RlYWQuCi0JKG1pcHNfNDY1MCwgbWlwc180MDEwLCBtaXBzXzQxMDApOiBWYXJpYWJsZXMgcmVtb3ZlZC4KLQkoaGlsb19pbnRlcmxvY2tzLCBncHJfaW50ZXJsb2NrcywgYXBwZW5kX2luc24sIG1hY3JvX2J1aWxkLCBtYWNybywKLQltYWNybzIsIG1pcHMxNl9tYWNybywgbWlwc19pcCk6IFRlc3QgbWlwc19jcHUsIG5vdCB0aGUgbWlwc19OTk5OCi0JdmFyaWFibGVzLgotCShtZF9iZWdpbik6IERvbid0IGJvdGhlciBpbml0aWFsaXppbmcgdGhlIG1pcHNfTk5OTiB2YXJpYWJsZXM7Ci0JbWlwc19jcHUgaXMgc2V0LCBhbmQgdGhhdCdzIGdvb2QgZW5vdWdoIG5vdy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGF2ZSB0aGUgLW1OTk5OIG9wdGlvbnMgc2V0IG1pcHNfY3B1IGluc3RlYWQgb2YKLQl0aGUgbWlwc19OTk5OIHZhcmlhYmxlLiAgVGhlIC1uby1tTk5OTiBmbGFncyBhcmUgbm93IG5vLW9wcy4KLQkoc2hvdyk6IE5ldyBmdW5jdGlvbiwgdG8gaGFuZGxlIHdyYXBwaW5nIGluIHRoZSBDUFUgbGlzdHMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBVcGRhdGUgbGlzdHMgb2YgLW1jcHUgYW5kIC1tTk5OTiBzd2l0Y2hlcy4KLQotU2F0IEZlYiAxMyAwMDoxNzoyNiAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2ludGVsX29wZXJhbmQpOiBJZ25vcmUgYFNIT1JUJyByYXRoZXIKLQl0aGFuIHRyZWF0IGFzIGFuIGltbWVkaWF0ZSBzcGVjaWZpZXIuCi0KLVRodSBGZWIgMTEgMTY6MTg6MzEgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYzogUHJvdG90eXBlIG1hbnkgZnVuY3Rpb25zLgotCShzZXRfaW50ZWxfc3ludGF4KTogQWNjZXB0IGBwcmVmaXgnL2Bub3ByZWZpeCcgc3BlY2lmaWVycy4KLQkoaTM4Nl9pbW1lZGlhdGUpOiBSZW1vdmUgdW51c2VkIHNlY29uZCBhcmd1bWVudC4KLQkoaTM4Nl9pbnRlbF9vcGVyYW5kKTogRml4IGkzODZfaXNfcmVnIHR5cG8uCi0JKGkzODZfb3BlcmFuZCk6IFVzZSBhbGxvd19uYWtlZF9yZWcuCi0JKG91dHB1dF9pbnZhbGlkKTogTWFrZSBvcGVyYW5kIGludCBmb3IgSyZSLgotCi1UaHUgRmViIDExIDExOjIxOjAyIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEVYVFJBX2FzX25ld19TT1VSQ0VTKTogVW5jb21tZW50LS1maXhlZCBieSBhdXRvbWFrZQotCXBhdGNoLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDItMDkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKERJU1RDTEVBTkZJTEVTKTogQ2hhbmdlIGNnZW4tb3BjLmggdG8gY2dlbi1kZXNjLmguCi0JKGNnZW4ubyk6IERpdHRvLgotCShFWFRSQV9hc19uZXdfU09VUkNFUyk6IENvbW1lbnQgb3V0LgotCSgudGNkZXApOiA8YXJjaD4tb3BjLmggcmVuYW1lZCB0byA8YXJjaD4tZGVzYy5oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaW46IFJlcXVpcmUgYXV0b2NvbmYgMi4xMy4gIFJlZG8gdXNpbmdfY2dlbiBoYW5kbGluZy4KLQlEZWxldGUgY2FsbCB0byBBTV9DWUdXSU4zMi4gIFJlcGxhY2UgQU1fRVhFRVhUIHdpdGggQUNfRVhFRVhULgotCShBQ19PVVRQVVQpOiA8YXJjaD4tb3BjLmggcmVuYW1lZCB0byA8YXJjaD4tZGVzYy5oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogYWNsb2NhbC5tNDogUmVidWlsZC4KLQkqIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIGNnZW4uYzogSW5jbHVkZSBjZ2VuLWRlc2MuaCwgbm90IGNnZW4tb3BjLmguCi0JKCopOiBDR0VOX09QQ09ERV9ERVNDIHJlbmFtZWQgdG8gQ0dFTl9DUFVfREVTQy4KLQkoZ2FzX2NnZW5fY3B1X2Rlc2MpOiBSZW5hbWVkIGZyb20gZ2FzX2NnZW5fb3Bjb2RlX2Rlc2MuCi0JQ0dFTl9JTlNOX0FUVFIgcmVuYW1lZCB0byBDR0VOX0lOU05fQVRUUl9WQUxVRS4KLQlDR0VOX09QRVJBTkRfQVRUUiByZW5hbWVkIHRvIENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFLgotCShnYXNfY2dlbl9yZWNvcmRfZml4dXApOiBSZW1vdmUgdW5uZWNlc3NhcnkgIT0gMCB0ZXN0LgotCShnYXNfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogRGl0dG8uCi0JKGdhc19jZ2VuX2ZpbmlzaF9pbnNuKTogRGl0dG8uICBSZWZlciB0byBvcGVyYW5kIHRhYmxlIHZpYSBjcHUKLQlkZXNjcmlwdG9yLCBub3QgZ2xvYmFsIHZhcmlhYmxlLgotCShnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogUmVmZXIgdG8gb3BlcmFuZF90YWJsZSB2aWEgY3B1Ci0JZGVzY3JpcHRvciwgbm90IGdsb2JhbCB2YXJpYWJsZS4gIFJlZmVyIHRvIGluc2VydF9vcGVyYW5kIGhhbmRsZXIKLQl2aWEgY3B1IGRlc2NyaXB0b3IsIG5vdCBnbG9iYWwgZnVuY3Rpb24uCi0JKiBjZ2VuLmggKCopOiBDR0VOX09QQ09ERV9ERVNDIHJlbmFtZWQgdG8gQ0dFTl9DUFVfREVTQy4KLQkqIGNvbmZpZy90Yy1mcjMwLmM6IEluY2x1ZGUgb3Bjb2Rlcy9mcjMwLWRlc2MuaC4KLQkoKik6IGdhc19jZ2VuX29wY29kZV9kZXNjIHJlbmFtZWQgdG8gZ2FzX2NnZW5fY3B1X2Rlc2MuCi0JQ0dFTl9JTlNOX0FUVFIgcmVuYW1lZCB0byBDR0VOX0lOU05fQVRUUl9WQUxVRS4KLQlVcGRhdGUgY2FsbCB0byBDR0VOX09QRVJBTkRfVFlQRSxDR0VOX0lOU05fT1BFUkFORFMuCi0JKiBjb25maWcvdGMtbTMyci5jOiBEaXR0by4KLQkoYXNzZW1ibGVfdHdvX2luc25zKTogVXBkYXRlIGNhbGxzIHRvIGNnZW5fbG9va3VwX2dldF9pbnNuX29wZXJhbmRzLgotCShtZF9hc3NlbWJsZSk6IERpdHRvLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBVcGRhdGUgY2FsbCB0byBDR0VOX09QRVJBTkRfRU5UUlkuCi0KLTE5OTktMDItMDkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEZpeCBoYW5kbGluZyBvZiBsYWJlbDEgLSBsYWJlbDIKLQlyZWxvY2F0aW9ucyBmb3IgRUxGIHRhcmdldHMuCi0KLTE5OTktMDItMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIFN0cm9uZ0FSTSB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDItMDUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uaDogVGlkeSBPQkpfRUxGIGFuZCBPQkpfQ09GRiBkZWZpbml0aW9ucy4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogRml4IEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNICi0JZm9yIENPRkYgcG9ydHMuCi0KLVdlZCBGZWIgIDMgMTE6MzU6NDcgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX3Nob3dfdXNhZ2UpOiBEb2N1bWVudCBwY2E1NiBhbmQgZXY2IG9wdGlvbnMuCi0KLU1vbiBGZWIgIDEgMjA6Mzc6MzAgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtaTM4Ni5oIChMT05HX0RPVUJMRV9NTkVNX1NVRkZJWCk6ICBEZWZpbmUuCi0gICAgICAgIChJTlRFTF9EV09SRF9NTkVNX1NVRkZJWCk6ICBEZWZpbmUuCi0gICAgICAgIChCWVRFX1BUUik6ICBEZWZpbmUuCi0gICAgICAgIChXT1JEX1BUUik6ICBEZWZpbmUuCi0gICAgICAgIChEV09SRF9QVFIpOiAgRGVmaW5lLgotICAgICAgICAoWFdPUkRfUFRSKTogIERlZmluZS4KLSAgICAgICAgKFNIT1JUKTogIERlZmluZS4KLSAgICAgICAgKE9GRlNFVF9GTEFUKTogIERlZmluZS4KLSAgICAgICAgKEZMQVQpOiAgRGVmaW5lLgotICAgICAgICAoTk9ORV9GT1VORCk6ICBEZWZpbmUuCi0gICAgICAgIChOb19kU3VmKTogIERlZmluZS4KLSAgICAgICAgKE5vX3hTdWYpOiAgRGVmaW5lLgotICAgICAgICAqIGNvbmZpZy90Yy1pMzg2LmMgIChzZXRfaW50ZWxfc3ludGF4KTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaW50ZWxfc3ludGF4KTogIERlY2xhcmUuCi0gICAgICAgIChhbGxvd19uYWtlZF9yZWcpOiAgRGVjbGFyZS4KLSAgICAgICAgKG1kX3BzZXVkb190YWJsZSk6ICBTdXBwb3J0IC5pbnRlbF9zeW50YXggYW5kIC5hdHRfc3ludGF4LgotICAgICAgICAoaW50ZWxfZmxvYXRfb3BlcmFuZCk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKG1kX2Fzc2VtYmxlKTogIEhhbmRsZSBJTlRFTF9EV09SRF9NTkVNX1NVRkZJWC4KLSAgICAgICAgSGFuZGxlIGJyYWNrZXRzIGFzIHdlbGwgYXMgcGFyZW5zLiAgQ2FsbCBpMzg2X2ludGVsX29wZXJhbmQgZm9yCi0gICAgICAgIGludGVsIHN5bnRheC4gIFJldmVyc2Ugb3BlcmFuZHMgaWYgYXBwcm9wcmlhdGUuICBIYW5kbGUgbmV3Ci0gICAgICAgIHN1ZmZpeGVzLiAgSGFuZGxlIG1vdnp4IGFuZCBtb3ZzeC4KLSAgICAgICAgKGkzODZfaXNfcmVnKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9pbW1lZGlhdGUpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChpMzg2X3NjYWxlKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9kaXNwbGFjZW1lbnQpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChpMzg2X29wZXJhbmRfbW9kaWZpZXIpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChidWlsZF9kaXNwbGFjZW1lbnRfc3RyaW5nKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9wYXJzZV9zZWcpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9pbnRlbF9vcGVyYW5kKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9vcGVyYW5kKTogIENhbGwgaTM4Nl9kaXNwbGFjZW1lbnQsIGkzODZfaW1tZWRpYXRlLAotICAgICAgICBpMzg2X3NjYWxlLCBldGMuICBpbnN0ZWFkIG9mIGhhbmRsaW5nIGlubGluZS4KLSAgICAgICAgKHBhcnNlX3JlZ2lzdGVyKTogIEhhbmRsZSByZWdpc3RlcnMgd2l0aG91dCBwcmVmaXguCi0KLU1vbiBGZWIgIDEgMTI6MjQ6NTggMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoYXJtLSotb2FiaSk6ICBOZXcuCi0gICAgICAgICh0aHVtYi0qLW9hYmkpOiAgTmV3LgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYyAodGFyZ2V0X29hYmkpOiAgRGVjbGFyZS4KLSAgICAgICAgKG1kX2FwcGx5X2ZpeDMpOiBTdXBwb3J0IFJFTCByZWxvY3MuCi0gICAgICAgIChtZF9wYXJzZV9vcHRpb24pOiAgSGFuZGxlIC1vYWJpLgotICAgICAgICAoZWxmMzJfYXJtX3RhcmdldF9mb3JtYXQpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChtZF9sb25nb3B0cyk6ICBBZGQgT1BUSU9OX09BQkkuCi0gICAgICAgICogY29uZmlnL3RjLWFybS5oOiAgUmVkZWZpbmUgVEFSR0VUX0ZPUk1BVC4KLQotCi0xOTk5LTAxLTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBIYW5kbGUgb3V0IG9mIHJhbmdlIGVycm9yLgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChmcjMwX2ZpeF9hZGp1c3RhYmxlKTogTmV3IGZ1bmN0aW9uLgotCShmcjMwX2ZvcmNlX3JlbG9jYXRpb24pOiBEZWZhdWx0IHRvIDAuCi0KLQkqIGNvbmZpZy90Yy1mcjMwLmggKG9ial9maXhfYWRqdXN0YWJsZSk6IERlZmluZS4KLQkoVENfRk9SQ0VfUkVMT0NBVElPTik6IERlZmluZS4KLQotCSogY2dlbi5jIChnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogRG8gbm90IGFwcGx5IGZpeGVzIHRvIFZUQUJMRQotCXJlbG9jcy4gCi0KLTE5OTktMDEtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHdyaXRlXzJfc2hvcnQpOiBEbyBub3QgZ2VuZXJhdGUgYSBzZXF1ZW50aWFsCi0JbWVyZ2Ugb2YgdHdvIGluc3RydWN0aW9ucyBpZiB0aGUgbGVmdCBpbnN0cnVjaXRvbiBraWxscyB0aGUgcmlnaHQuCi0KLTE5OTktMDEtMTEgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JKiBjb25maWd1cmUuaW46IFJlZG8gdGVzdCBmb3IgdXNpbmcgY2dlbi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotMTk5OS0wMS0wOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKG9ial9hZGp1c3Rfc3ltdGFiKTogUHJldmVudCBhY2NpZGVudGFsCi0JcmVkZWZpbml0aW9uIG9mIHRoaXMgbWFjcm8uCi0KLVR1ZSBKYW4gIDUgMjE6NTg6MDMgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19mcm9iX2ZpbGUpOiBEaXNhYmxlICJVbm1hdGNoZWQgJWhpIHJlbG9jIgotCXdhcm5pbmcuCi0KLTE5OTgtMTItMjkgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IEZvciBtaXBzMTYsIGluc2VydCBhIG5vcCBiZXR3ZWVuCi0JYSByZWFkIG9mIEhJIG9yIExPIGFuZCBhbiBpbW1lZGlhdGx5IGZvbGxvd2luZyBicmFuY2guCi0KLTE5OTgtMTItMjkgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IEFub3RoZXIgY29ycmVjdGlvbiB0byB0aGUgc2V0dGluZyBvZgotCW1pcHNfZWFiaTY0LgotCi0xOTk4LTEyLTIzICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBDb3JyZWN0IHR5cGUtbyBpbiBzZXR0aW5nIG9mIG1pcHNfZWFiaTY0LgotCi0xOTk4LTEyLTIxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9hc3NlbWJsZSk6IEVtaXQgYSBOT1AgYWZ0ZXIgYSByZWxheGFibGUgMTYKLQliaXQgaW5zbiB3aGVuIG9wdGltaXppbmcsIHNvIHRoYXQgcGFyYWxsZWxpc2VkIGluc3RydWN0aW9ucyB3aWxsCi0Jc3RhcnQgb24gYSAzMiBiaXQgYm91bmRhcnkuCi0KLTE5OTgtMTItMTkgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2VhYmk2NCk6IE5ldy4KLQkobWRfYmVnaW4pOiBTZXQgbWlwc19lYWJpNjQuCi0JKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBVc2UgaXQuCi0KLTE5OTgtMTItMTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogCi0JQ29ycmVjdCBzZXR0aW5nIG9mIEFCSSBpbiBlX2ZsYWdzLgotCi1XZWQgRGVjIDE2IDE2OjE3OjIyIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAobWRfYXNzZW1ibGUpOiBXYXJuIGFib3V0IGludmFsaWQgaW5zdHJ1Y3Rpb25zIGluIGRlbGF5IHNsb3RzLgotCi0xOTk4LTEyLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4sbWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIHZyNDExMS4KLQkKLTE5OTgtMTItMTUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jIChnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogTWFyayBhcyBhbiBlcnJvciwgcmF0aGVyIHRoYW4gYQotCXdhcm5pbmcsIHZhbHVlcyB0aGF0IGRvbid0IGZpdCBpbiB0aGUgZmllbGQuCi0KLTE5OTgtMTItMTUgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2FiaV9zdHJpbmcpOiBOZXcuCi0JKG1kX3BhcnNlX29wdGlvbixtZF9sb25nb3B0cyk6IEFkZCBtYWJpLgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogU2V0IGVfZmxhZ3MgYmFzZWQgb24gbWFiaSBmbGFnLgotCi0xOTk4LTEyLTE1ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIHZyNDExMS4gCi0KLTk4LTEyLTExICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGJ1aWxkX2J5dGVzKTogQ2hhbmdlIG1lc3NhZ2UgZ2l2ZW4gaWYgdGhlCi0JaW5zdHJ1Y3Rpb24gcmVxdWlyZXMgSDgvMzAwSCBtb2RlIGFuZCB3ZSdyZSBub3QgaW4gSG1vZGUsIHRvCi0Jc3VnZ2VzdCB0aGF0IGl0IG1heSBiZSB0aGUgb3BlcmFuZCBtb2RlcyB0aGF0IGFyZSB0aGUgcHJvYmxlbSwgbm90Ci0JbmVjZXNzYXJpbHkgdGhlIG9wY29kZS4KLQotMTk5OC0xMi0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYzogQWRkIGxpbmUgc2VwYXJhdG9yIGNoYXJhY3Rlci4KLQotVHVlIERlYyAgOCAxOTo1MTo1MCAxOTk4ICBNYXJrIEtsZWluICA8bWtsZWluQGRpcy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYS0qLW1wZWl4Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWcvb2JqLXNvbS5oIChvYmpfc29tX2NvbXBpbGVyKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotc29tLmMgKGNvbXBpbGVyX3NlZW4pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShvYmpfc29tX2NvbXBpbGVyKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLWhwcGEuYzogVXBkYXRlIHRjX2RhdGEgdXNlcyBmb3IgY2hhbmdlIHRvIGJmZC9zb20uaC4KLSAJKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiY29tcGlsZXIiIGlmIE9CSl9TT00uCi0JKHBhX3R5cGVfYXJncyk6IFNldCBocHBhX3ByaXZfbGV2ZWwuCi0JKHBhX2NvbXBpbGVyKTogTmV3IHN0YXRpYyBmdW5jdGlvbiBpZiBPQkpfU09NLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgRGVjICA4IDE1OjAwOjUwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChvdXRwdXRfbGViMTI4KTogRG9uJ3QgbWFyayBhcyBpbmxpbmUuCi0KLTE5OTgtMTItMDggIEFuZHJldyBNYWNMZW9kICA8YW1hY2xlb2RAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfdmJ5dGUpOiBQcm90b3R5cGUgYW5kIG5ldyBmdW5jdGlvbiBmb3IgCi0JQUlYIC52Ynl0ZSB1bmFsaWduZWQgZGF0YSBzdXBwb3J0LgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgJ3ZieXRlJyB0byBsaXN0IG9mIHZhbGlkIHBzZXVkb3MuCi0JKHBwY19lbGZfdmFsaWRhdGVfZml4KTogQWRkIGVoX2ZyYW1lIHRvIGxpc3Qgb2YgRUxGIHJlbG9jYXRhYmxlIAotCXNlY3Rpb25zLgotCi0xOTk4LTEyLTA3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hc3NlbWJsZSwgZG9fYXNzZW1ibGUpOiBJbXByb3ZlIGVycm9uZW91cwotCWlucHV0IGhhbmRsaW5nLiAKLQotTW9uIERlYyAgNyAwOTo0ODozNCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYyAoZWxmMzJfYXJtX2ZvcmNlX3JlbG9jYXRpb24pOiAgQ2hlY2sgZm9yCi0gICAgICAgIEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILgotCi1TdW4gRGVjICA2IDEyOjQ2OjM2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEZWZpbmUgVEFSR0VUX0JZVEVTX3tCSUcsTElUVExFfV9FTkRJQU4gYWZ0ZXIKLQljaGVja2luZyB0aGUgdGFyZ2V0IHR5cGUuCi0JKG1pcHMtZGVjLWJzZCopOiBTZXQgZW5kaWFuIHRvIGxpdHRsZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCUNPRkYgd2VhayBzeW1ib2wgc3VwcG9ydCwgYmFzZWQgb24gcGF0Y2hlcyBmcm9tIE1hcmsgRWxicmVjaHQKLQk8c25vd2JhbGwzQHVzYS5uZXQ+OgotCSogY29uZmlnL29iai1jb2ZmLmggKFNfSVNfV0VBSyk6IERlZmluZSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl93ZWFrKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob2JqX2NvZmZfZW5kZWYpIFtib3RoIHZlcnNpb25zXTogSGFuZGxlIHdlYWsgc3ltYm9scy4KLQkoY29mZl9mcm9iX3N5bWJvbCk6IExpa2V3aXNlLgotCSh5YW5rX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkob2JqX3BzZXVkb190YWJsZSk6IEFkZCAid2VhayIuCi0KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay0qLWdudSopOiBOZXcgdGFyZ2V0LiAgRnJvbSBBeW1lcmljIFZpbmNlbnQKLQk8YXltZXJpYy52aW5jZW50QGVtaS51LWJvcmRlYXV4LmZyPi4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBjdXJyZW50IHRvb2xzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoZW1pdF9sZGdwKTogR2l2ZSBhbiBlcnJvciBtZXNzYWdlIHJhdGhlciB0aGFuCi0JYW4gYXNzZXJ0aW9uIGZhaWx1cmUgZm9yIGEgY2FzZSB3ZSBjYW4ndCBoYW5kbGUgd2hlbiBPQkpfRUNPRkYuCi0KLQkqIGV4cHIuYyAob3BlcmF0b3IpOiBBbmQgd2l0aCAweGZmIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggc2lnbmVkCi0JY2hhci4KLQotMTk5OC0xMi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAobWRfY2dlbl9sb29rdXBfcmVsb2MpOiBHZW5lcmF0ZQotCUJGRF9SRUxPQ19GUjMwXzQ4IGluc3RlYWQgb2YgQkZEX1JFTE9DX0ZSMzBfMzIuCi0KLTE5OTgtMTItMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogRW5hYmxlIHJlbG9jcyBmb3IKLQlMREk6MjAgaW5zbi4KLQotVGh1IE5vdiAyNiAxMToyMzo0OCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IFJlc3RvcmUgcHJldmlvdXMgY2FsY3VsYXRpb24KLQlvZiBwY3JlbCBwb2ludC4KLQotVHVlIE5vdiAyNCAxNzoyMTo1MiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBGaXggY2FsY3VsYXRpb24gb2YKLQlwY3JlbCBwb2ludC4KLQotVHVlIE5vdiAyNCAxNDo1NDozOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9hc3NlbWJsZSk6IE1ha2Ugc3RhdGljICdldHlwZScgaGF2ZSBmaWxlCi0Jc2NvcGUuCi0JKGQxMHZfY2xlYW51cCk6IE9ubHkgZ2VuZXJhdGUgcHJldmlvdXMgaW5zbiBpZiBhIG11bHRpbGluZSBpbnNuIGlzCi0Jbm90IHBlbmRpbmcuCi0KLUZyaSBOb3YgMjAgMTE6NDE6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAobWRfY2dlbl9sb29rdXBfcmVsb2MpOiBBZGQgc3VwcG9ydCBmb3IKLQlGUjMwX09QRVJBTkRfSTMyLiAKLQotVGh1IE5vdiAxOSAxNTowMToyOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciAtbWFybTd4eHggYW5kCi0JLW1hcm02eHh4IGNvbW1hbmQgbGluZSBzd2l0Y2hlcy4KLQotMTk5OC0xMS0xOCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoREVQKTogVXNlICQoc3JjZGlyKS8uLi9ta2RlcC4KLQkoaXRibC1vcHMubyk6IERlbGV0ZSBkdXBsaWNhdGUgZGVwZW5kZW5jaWVzLgotCVJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCUFkZCBmcjMwIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgTm92IDE3IDEzOjQyOjQyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogVXBkYXRlZCB0byBtYXRjaCBsYXRlc3QKLQlvcGNvZGUgbGlzdC4KLQkqIGxpc3RpbmcuYzogSWdub3JlIGxpbmUgdGVybWluYXRvciBjaGFyYWN0ZXJzIGZvdW5kIGluc2lkZQotCXN0cmluZ3MuIAotCi1UaHUgTm92IDEyIDE5OjIxOjI0IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vZ2FzLnBvdDogUmVnZW5lcmF0ZWQuCi0KLVRodSBOb3YgMTIgMTA6NTQ6MTYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAoZnIzMF9pc19jb2xvbl9pbnNuKTogTmV3IG5hbWUgZm9yCi0JZnIzMF9pc19sYWJlbF9zdGFydCgpLiAgQWxzbyBjaGVja3MgZm9yIGRlbGF5IHNsb3QgaW5zbnMuCi0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKGZyMzBfaXNfbGFiZWxfc3RhcnQpOiBOZXcgZnVuY3Rpb246IEhhbmRsZQotCUZSMzAgaW5zdHJ1Y3Rpb25zIHdoaWNoIGNvbnRhaW4gYSBjb2xvbiBpbiB0aGUgbW5lbW9uaWMuCi0KLQkqIGNvbmZpZy90Yy1mcjMwLmggKFRDX1NUQVJUX0xBQkVMKTogRGVmaW5lIHRoaXMgbWFjcm8uCi0KLVdlZCBOb3YgMTEgMDk6NTg6MjEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYzogUmVtb3ZlZCBjdXJyZW50bHkgc3VwZXJmbG91cyBjb2RlLgotCi1UdWUgTm92IDEwIDEzOjEzOjA1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLWZyMzAuYzogVHdlYWtpbmcgc28gdGhhdCBpdCB3aWxsIGNvbXBpbGUuCi0KLVR1ZSBOb3YgMTAgMTQ6NDE6MzMgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtZDEwdi5oIChvYmpfZml4X2FkanVzdGFibGUpOiAgRGVmaW5lLgotICAgICAgICAoVENfRk9SQ0VfUkVMT0NBVElPTik6ICBEZWZpbmUuCi0gICAgICAgIChkMTB2X2ZvcmNlX3JlbG9jYXRpb24pOiAgRGVjbGFyZS4KLSAgICAgICAgKiBjb25maWcvdGMtZDEwdi5jICh0Y19nZW5fcmVsb2MpOiAgSGFuZGxlIFZ0YWJsZSByZWxvY3MuCi0gICAgICAgIChtZF9hcHBseV9maXgzKTogIEhhbmRsZSBWdGFibGUgcmVsb2NzLgotICAgICAgICAoZDEwdl9maXhfYWRqdXN0YWJsZSk6ICBOZXcuCi0gICAgICAgIChkMTB2X2ZvcmNlX3JlbG9jYXRpb24pOiAgTmV3LgotCi1Nb24gTm92ICA5IDE0OjI1OjA2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmM6IENoYW5nZSBkZWZhdWx0IGJlaGF2aW91ciB0byBpZ25vcmUgcG90ZW50aWFsCi0JY29uZmxpY3RzIGJldHdlZW4gcmVnaXN0ZXIgbmFtZSBhbmQgc3ltYm9sIG5hbWVzLgotCi1XZWQgTm92ICA0IDE4OjQyOjAwIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgZnIzMC0qLSouCi0JKiBjb25maWcvdGMtZnIzMC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZy5pbjogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogZG9jL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KLQkqIHBvL2dhcy5wb3Q6IFJlZ2VuZXJhdGVkLgotCi1Nb24gTm92ICAyIDIwOjU0OjE2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKGFzc2VtYmxlX3R3b19pbnNucyk6IEVuc3VyZSBib3RoIGluc25zCi0JYXJlIDE2IGJpdCBpbnNucy4KLQotTW9uIE5vdiAgMiAyMDoxMDoxOCAxOTk4ICBNYXJ0aW4gdm9uIExvZXdpcyAgPGxvZXdpc0BpbmZvcm1hdGlrLmh1LWJlcmxpbi5kZT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKTogU2V0IGNoYXJhY3RlcnMgYWJvdmUgMTI3IHRvIGJlIHN5bWJvbAotCWNoYXJhY3RlcnMuCi0JKGRvX3NjcnViX2NoYXJzKTogQWRkIHNvbWUgY2FzdHMgdG8gdW5zaWduZWQgY2hhciB0byBhdm9pZAotCXVud2FudGVkIHNpZ24gZXh0ZW5zaW9uLgotCSogcmVhZC5jIChsZXhfdHlwZSk6IFNldCBjaGFyYWN0ZXJzIGFib3V0IDEyNyB0byBiZSBzeW1ib2wKLQljaGFyYWN0ZXJzLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYmVnaW4pOiBTZXQgaWRlbnRpZmllcl9jaGFycyBhbmQKLQlvcGVyYW5kX2NoYXJzIGZvciB2YWx1ZXMgYWJvdmUgMTI3LgotCi1Nb24gTm92ICAyIDE1OjA1OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IGRldGVjdCBjeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqCi0gICAgICAgICogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLVR1ZSBPY3QgMjcgMTM6MTg6NDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jOiBBZGQgc3VwcG9ydCBmb3IgcHJvZHVjaW5nIGEgbGlzdGluZyBmcm9tIHBpcGVkCi0JaW5wdXQuIAotCi1UdWUgT2N0IDI3IDA4OjU2OjQ0IDE5OTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChoaWxvX2ludGVybG9ja3MpOiBSZW1vdmUgbWlwc18zOTAwLgotCShhcHBlbmRfaW5zbik6IEFjY291bnQgZm9yIHRoZSB0eDM5J3MgbXVsdGlwbHkgYmVoYXZpb3IuCi0KLTE5OTgtMTAtMjYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChhc3NlbWJsZV90d29faW5zbnMpOiBSZW5hbWUgYXNzZW1ibGVfdHdvX2luc25zCi0JZnJvbSBhc3NlbWJsZV9wYXJhbGxlbF9pbnNucy4gIEFkZCBzdXBwb3J0IGZvciAnLT4nIHRvIGluZGljYXRlCi0JZXhwbGljaXRseSBzZXJpYWxpemluZyB0aGUgaW5zdHJ1Y3Rpb25zLgotCShtZF9hc3NlbWJsZSk6IERpdHRvLgotCi1TYXQgT2N0IDI0IDE1OjEyOjE5IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLXNoLmMgKHNoX2ZpeF9hZGp1c3RhYmxlKTogIEFkanVzdCBFWFRFUk4gYW5kCi0gICAgICAgIFdFQUsgaGFuZGxpbmcuCi0KLVRodSBPY3QgMjIgMTI6NDE6MzMgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjZ2VuLmMgKGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMpOiAgUmV2ZXJ0IGxhc3QgY2hhbmdlLgotCi1UaHUgT2N0IDIyIDEwOjAzOjE1IDE5OTggIFJvbiBVbnJhdSAgPHJ1bnJhdUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIDogc3VwcG9ydCBmcmFtZSBhbmQgcmVnbWFzay9mcmVnbWFzayB3aGVuCi0JICBNSVBTX1NUQUJTX0VMRiBpcyBzcGVjaWZpZWQuCi0KLVdlZCBPY3QgMjEgMTE7MzQ6NTEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtc2guYyAoc2hfZml4X2FkanVzdGFibGUpOiAgT25seSBpbmNsdWRlIGlmIE9CSl9FTEYuCi0gICAgICAgIChtZF9hcHBseV9maXgpOiAgRG9uJ3QgcmV0dXJuIDEgZm9yIFZUQUJMRSByZWxvY3MuCi0gICAgICAgICogY29uZmlnL3RjLXNoLmggKG9ial9maXhfYWRqdXN0YWJsZSk6ICBEZWZpbmUgb25seSBpZiBPQkpfRUxGLgotCi1UdWUgT2N0IDIwIDExOjE4OjI4IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZG9jL2MtaTM4Ni50ZXhpOiBSZXBsYWNlIG9jY3VyZW5jZXMgb2YgIm9wY29kZSIgd2l0aAotCSJpbnN0cnVjdGlvbiBtbmVtb25pYyIsICJpbnN0cnVjdGlvbiIsIG9yICJtbmVtb25pYyIgd2hlbgotCXJlZmVycmluZyB0byB0aGUgbmFtZSBvZiBhbiBpbnN0cnVjdGlvbi4gIFVzZSAib3Bjb2RlIiB3aGVuCi0JcmVmZXJyaW5nIHRvIHRoZSBzZXF1ZW5jZSBvZiBtYWNoaW5lIGJ5dGVzLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChvcGNvZGVfY2hhcnMpOiBSZW5hbWUgdG8gbW5lbW9uaWNfY2hhcnMuCi0JKGlzX29wY29kZV9jaGFyKTogUmVuYW1lIHRvIGlzX21uZW1vbmljX2NoYXIuCi0JKG1kX2Fzc2VtYmxlIGFuZCBpMzg2X29wZXJhbmQpOiBDb3JyZWN0IGVycm9yIG1lc3NhZ2VzIGZyb20KLSAgICAgICAgIm9wY29kZSIgdG8gImluc3RydWN0aW9uIG1uZW1vbmljIgotCVJlbmFtZSB0aHJvdWdob3V0IG9wY29kZVtdIC0+IG1uZW1vbmljW10sIG9wcCAtPiBtbmVtX3AsCi0JTUFYX09QQ09ERV9TSVpFIC0+IE1BWF9NTkVNX1NJWkUsCi0JRFdPUkRfT1BDT0RFX1NVRkZJWCAtPiBEV09SRF9NTkVNX1NVRkZJWCwKLQlXT1JEX09QQ09ERV9TVUZGSVggLT4gV09SRF9NTkVNX1NVRkZJWCwKLQlCWVRFX09QQ09ERV9TVUZGSVggLT4gQllURV9NTkVNX1NVRkZJWCwKLQlTSE9SVF9PUENPREVfU1VGRklYIC0+IFNIT1JUX01ORU1fU1VGRklYCi0JTE9OR19PUENPREVfU1VGRklYIC0+IExPTkdfTU5FTV9TVUZGSVgKLQotCSogY29uZmlnL3RjLWkzODYuaCAoKl9NTkVNX1NVRkZJWCk6IFJlbmFtZSBmcm9tICpfT1BDT0RFX1NVRkZJWC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogQ2hlY2sgZm9yIGdhcmJhZ2UgYWZ0ZXIKLQlyZWdpc3RlciBuYW1lLgotCi1UdWUgT2N0IDIwIDEwOjQ5OjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4Myk6IENoYW5nZSBoYW5kbGluZyBvZiBQQ1JFTCByZWxvYwotIAlmb3IgQkZEX0FTU0VNQkxFUiB0byBvbmx5IGNoYW5nZSB2YWx1ZSB3aGVuIENPRkYgaWYgVEVfUEUuCi0KLU1vbiBPY3QgMTkgMjA6MjA6NDIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtc2guaCAob2JqX2ZpeF9hZGp1c3RhYmxlKTogIERlZmluZS4KLSAgICAgICAgKiBjb25maWcvdGMtc2guYyAoc2hfZm9yY2VfcmVsb2NhdGlvbik6ICBIYW5kbGUgVlQgcmVsb2NzLgotICAgICAgICAobWRfYXBwbHlfZml4KTogIExpa2V3aXNlLgotICAgICAgICAodGNfZ2VuX3JlbG9jKTogIExpa2V3aXNlLgotICAgICAgICAoc2hfZml4X2FkanVzdGFibGUpOiAgTmV3LgotCi1Nb24gT2N0IDE5IDEyOjM1OjQzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmMgKGdhc19jZ2VuX2ZpbmlzaF9pbnNuKTogVXBkYXRlIGhhbmRsaW5nIG9mIENHRU5fSU5UX0lOU05fUC4KLQkqIGNnZW4uaCAoZ2FzX2NnZW5fZmluaXNoX2luc24pOiBVcGRhdGUgcHJvdG90eXBlLgotCSogY29uZmlnL3RjLW0zMnIuYyAobTMycl9pbnNuKTogQ0dFTl9JTlRfSU5TTiAtPiBDR0VOX0lOVF9JTlNOX1AuCi0JY2dlbl9pbnNuX3QgLT4gQ0dFTl9JTlNOX0lOVC4KLQkobWFrZV9wYXJhbGxlbCk6IFVwZGF0ZSBoYW5kbGluZyBvZiBDR0VOX0lOVF9JTlNOX1AuCi0JKGFzc2VtYmxlX3BhcmFsbGVsX2luc24pOiBEaXR0by4KLQkodGFyZ2V0X21ha2VfcGFyYWxsZWwpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2Fzc2VtYmxlKTogVXNlIGl0LgotCi1Nb24gT2N0IDE5IDEzOjE2OjEyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLW0zMnIuYyAobTMycl9mb3JjZV9yZWxvY2F0aW9uKTogIEZpeCB0eXBvLgotCi1TdW4gT2N0IDE4IDE4OjQ4OjU3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2Fzc2VtYmxlKTogTWFrZSBzdXJlIHRoZSBlbnRpcmUgb3Bjb2RlIGlzCi0JY29udmVydGVkIGludG8gbG93ZXIgY2FzZS4KLQotRnJpIE9jdCAxNiAxMzozNjozNCBDRFQgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjZ2VuLmMgKGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMpOiAgSGFuZGxlIFZUQUJMRSByZWxvY3MuCi0gICAgICAgIChnYXNfY2dlbl90Y19nZW5fcmVsb2MpOiAgTGlrZXdpc2UuCi0gICAgICAgICogY29uZmlnL3RjLW0zMnIuaCAob2JqX2ZpeF9hZGp1c3RhYmxlKTogIERlZmluZS4KLSAgICAgICAgKiBjb25maWcvdGMtbTMyci5jIChtMzJyX2ZpeF9hZGp1c3RhYmxlKTogIE5ldy4KLSAgICAgICAgKG0zMnJfZm9yY2VfcmVsb2NhdGlvbik6ICBIYW5kbGUgVlRBQkxFIHJlbG9jcy4KLQotV2VkIE9jdCAxNCAxMTozMzozOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy1hcm0udGV4aSAoQVJNIERpcmVjdGl2ZXMpOiBEb2N1bWVudCAubHRvcm4gZGlyZWN0aXZlLgotCi1Nb24gT2N0IDEyIDExOjA3OjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKGFzc2VtYmxlX3BhcmFsbGVsX2luc24pOiBDb252ZXJ0IHNlY29uZCBvcGNvZGUKLQl0byBsb3dlciBjYXNlIGJlZm9yZSBwYXJzaW5nLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChwYXJhbGxlbF9vayk6IElnbm9yZSBjb25mbGljdHMgd2hlbiBleHBsaWNpdGx5Ci0JcGFyYWxsZWwgaW5zbnMgbW9kaWZ0IGJ1dHMgaW4gdGhlIFBTVyBhcyBhIHNpZGUgZWZmZWN0LgotCi1UaHUgT2N0ICA4IDEwOjE4OjMzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGZpbmRfZm9ybWF0KTogVGVzdCBmb3IgbWlzc2luZyBmbGFnIGFuZAotCWNvbnRyb2wgcmVnaXN0ZXJzLgotCQotCShtZF9hcHBseV9maXgzKTogRml4IGVycm9yIG1lc3NhZ2VzIHRvIGF2b2lkCi0JYXNzdW1wdGlvbiBhYm91dCBwcmVzZW5jZSBvZiBhIHN5bWJvbC4KLQotCShwYXJhbGxlbF9vayk6IERpc2FsbG93IHBhcmFsbGVsIGluc3RydWN0aW9ucyB0aGF0IGJvdGggbW9kaWZ5IHRoZQotCXNhbWUgZmxhZyByZWdpc3Rlci4KLQotCShmaW5kX2Zvcm1hdCk6IEdlbmVyYXRlIGEgd2FybmluZyBpZiBhbiBvZGQgbnVtYmVyZWQgcmVnaXN0ZXIgaXMKLQl1c2VkIGFzIHRoZSBmaXJzdCByZWdpc3RlciBpbiBhIG11dGxpLXJlZ2lzdGVyIGluc3RydWN0aW9uLgotCi1XZWQgT2N0ICA3IDE0OjA5OjE0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBEbyBub3QgYXNzdW1lIHRoYXQgYmFkCi0JcmVsb2NhdGlvbnMgYXJlIGFsd2F5cyBhc3NvY2lhdGVkIHdpdGggYSBzeW1ib2wuCi0KLVR1ZSBPY3QgIDYgMDk6MzE6MTUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiB0Yy1zcGFyYy5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogIERlZmluZS4KLSAgICAgICAgKGVsZjMyX3NwYXJjX2ZvcmNlX3JlbG9jYXRpb24pOiAgRGVjbGFyZS4KLSAgICAgICAgKiB0Yy1zcGFyYy5jIChtZF9hcHBseV9maXgzKTogIEhhbmRsZSB2dGFibGUgcmVsb2NzLgotICAgICAgICAodGNfZ2VuX3JlbG9jKTogIEhhbmRsZSB2dGFibGUgcmVsb2NzLgotICAgICAgICAoZWxmMzJfc3BhcmNfZm9yY2VfcmVsb2NhdGlvbik6ICBOZXcuCi0KLU1vbiBPY3QgIDUgMDk6MjU6MzIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z25zdS5jb20+Ci0KLSAgICAgICAgKiBzeW1ib2xzLmMgKFNfSVNfRlVOQ1RJT04pOiAgTmV3LgotICAgICAgICAqIGNvbmZpZy90Yy12ODUwLmggKG9ial9maXhfYWRqdXN0YWJsZSk6ICBEZWZpbmUuCi0gICAgICAgIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogIERlZmluZS4KLSAgICAgICAgKHY4NTBfZm9yY2VfcmVsb2NhdGlvbik6ICBEZWNsYXJlLgotICAgICAgICAqIGNvbmZpZy90Yy12ODUwLmMgKHRjX2dlbl9yZWxvYyk6ICBVc2Ugb2Zmc2V0IGluc3RlYWQKLSAgICAgICAgb2YgZnhfYWRkbnVtYmVyIGZvciBWVEFCTEUgcmVsb2MgYWRkZW5kcy4KLSAgICAgICAgKG1kX2FwcGx5X2ZpeDMpOiAgSGFuZGxlIFZUQUJMRSByZWxvY3MuCi0gICAgICAgICh2ODUwX2ZpeF9hZGp1c3RhYmxlKTogIE5ldy4KLSAgICAgICAgKHY4NTBfZm9yY2VfcmVsb2NhdGlvbik6ICBOZXcuCi0KLU1vbiBPY3QgIDUgMDA6NDg6NTIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKGZwX29wZXJhbmRfZm9ybWF0KTogQWRkIHNvbWUgYWRkaXRpb25hbCBmb3JtYXRzLgotCShwYV9pcCk6IERvIG5vdCBhdXRvbWF0aWNhbGx5IHByb21vdGUgaW50byBwYTIuMCBtb2RlLgotCShwYV9sZXZlbCk6IEhhbmRsZSAiLmxldmVsIDIuMCIuCi0KLVN1biBPY3QgIDQgMjA6NTc6NDMgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBBTURfM0ROT1dfT1BDT0RFLgotCSogY29uZmlnL3RjLWkzODYuaCAodGVtcGxhdGUuZXh0ZW5zaW9uX29wY29kZSk6IENoYW5nZSB0bwotICAgICAgICB1bnNpZ25lZCBpbnQgdG8gYWxsb3cgZnVsbCByYW5nZSBvZiA4LWJpdCBvcGNvZGUgc3VmZml4ZXMuCi0JKE5vbmUpOiBSZWRlZmluZSBhcyAweGZmZmYuCi0KLQlGcm9tIEplZmYgQiBFcGxlciA8amVwbGVyQHVzZ3MuZ292PgotCSogZG9jL2MtaTM4Ni50ZXhpIChpMzg2LVNJTUQpOiBOZXcgc2VjdGlvbi4KLQotVGh1IE9jdCAgMSAxNTozNzo1NCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKGRpc2NhcmRfcmVzdF9vZl9saW5lKTogTmV3IGZ1bmN0aW9uLgotCSogcmVhZC5oOiBEZWNsYXJlIGl0LgotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfbWFzaywgc19hbHBoYV9mcmFtZSk6IFVzZSBpdC4KLQotVGh1IE9jdCAgMSAxMDozMzo1MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChmaW5kX3N5bWJvbF9tYXRjaGluZ19yZWdpc3Rlcik6IE5ldyBmdW5jdGlvbi4KLQkoZmluZF9vcGNvZGUpOiBDb3BlIHdpdGggdGhlIGNhc2Ugd2hlcmUgYSByZWdpc3RlciBuYW1lIG1hdGNoZXMKLQlhIHN5bWJvbCBuYW1lLgotCi1XZWQgU2VwIDMwIDEwOjUyOjMyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX3BjcmVsX2Zyb20pOiBSZW5hbWUgdG8KLQl2ODUwX3BjcmVsX2Zyb21fc2VjdGlvbi4KLQkodjg1MF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBEbyBub3QgcmVzb2x2ZXMgc3ltYm9scyBpbiBvdGhlcgotCXNlY3Rpb25zLiAKLQotCSogY29uZmlnL3RjLXY4NTAuaCAoTURfUENSRUxfRlJPTV9TRUNUSU9OKTogRGVmaW5lLgotCi1Nb24gU2VwIDI4IDExOjAxOjIwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZpbmRfb3Bjb2RlKTogR2VuZXJhdGUgYW4gZXJyb3IgaWYgYSByZWdpc3RlcgotCWlzIHN1cHBsaWVkIGZvciBhbiBvcGVyYW5kIHRoYXQgc2hvdWxkIG5vdCBiZSBhIHJlZ2lzdGVyLgotCi1GcmkgU2VwIDI1IDEwOjA0OjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHdyaXRlXzJfc2hvcnQpOiBCdXQgZG8gYWxsb3cgZGVsYXllZCBicmFuY2gKLQlpbnN0cnVjdGlvbnMgdG8gaGF2ZSBhbm90aGVyIGluc3RydWN0aW9uIGluIHRoZSByaWdodCBiaW4uCi0KLVRodSBTZXAgMjQgMDk6Mjg6MzQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAod3JpdGVfMl9zaG9ydCk6IERvIG5vdCBhbGxvdyBpbnN0cnVjdGlvbnMgaW4KLQl0aGUgcmlnaHQgY29udGFpbmVyIGlmIHRoZSBsZWZ0IGNvbnRhaW5lciBob2xkcyBhIGJyYW5jaAotCWluc3RydWN0aW9uLiAKLQotV2VkIFNlcCAyMyAxMDo1NDoyOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChyZWdfbmFtZV9zZWFyY2gpOiBPbmx5IHdhcm4gaWYgYSBuYW1lIG1hdGNoZXMKLQlib3RoIGEgcmVnaXN0ZXIgbmFtZSBhbmQgc3ltYm9sIG5hbWUuCi0JKGZpbmRfZm9ybWF0KTogQWxsb3cgY29ycmVjdCBwYXJzaW5nIG9mIE1WVFNZUyBhbmQgTVZGU1lTIGluc25zLgotCi1UdWUgU2VwIDIyIDE3OjQ5OjE2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHdyaXRlXzJfc2hvcnQpOiBJbXBsZW1lbnQgRUlUSEVSX0JVVF9QUkVGRVJfTVUKLQlleGVjdXRpb24gdW5pdCBjbGFzcy4KLQotCShyZWdfbmFtZV9zZWFyY2gpOiBJZiBhIG5hbWUgbWF0Y2hlcyBhIHJlZ2lzdGVyIGFuZCBhIHN5bWJvbCwKLQlwcmVmZXIgdGhlIHJlZ2lzdGVyLgotCShmaW5kX2Zvcm1hdCk6IERpc2FsbG93IGZsYWcgcmVnaXN0ZXJzIHdoZW4gYSBnZW5lcmFsIHB1cnBvc2UKLQlyZWdpc3RlciBpcyByZXF1aXJlZC4KLQlJZiBhIG51bWJlciBpcyByZXF1aXJlZCwgYnV0IGEgcmVnaXN0ZXIgaGFzIGJlZW4gZ2l2ZW4sIGNoZWNrIHRvCi0Jc2VlIGlmIGEgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgcmVnaXN0ZXIgZXhpc3RzLCBhbmQgaWYKLQlzbywgdXNlIHRoYXQgc3ltYm9sLgotCi1UdWUgU2VwIDIyIDE2OjQwOjUyIDE5OTggIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuaCAoRUNPRkZfREVCVUdHSU5HKTogQWRkIG1pc3NpbmcgcGFyZW5zLgotCi1UdWUgU2VwIDIyIDE1OjQ0OjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGZpbmRfZm9ybWF0KTogRG8gbm90IGFjY2VwdCBmbGFnIHJlZ2lzdGVycyBhcwotCWdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMuCi0JKGZpbmRfZm9ybWF0KTogSWYgYW4gaW1tZWRpYXRlIHZhbHVlIGlzIGV4cGVjdGVkIGF0IGEgZ2l2ZW4gcGxhY2UKLQlpbiBhIGZvcm1hdCwgYnV0IGEgcmVnaXN0ZXIgbmFtZSBoYXMgYmVlbiBwcm92aWRlZCBpbnN0ZWFkLCBjaGVjawotCXRvIHNlZSBpZiB0aGF0IHJlZ2lzdGVyIG5hbWUgbWF0Y2hlcyB0aGUgbmFtZSBvZiBhIHByZWRlZmluZWQKLQlzeW1ib2wgYW5kIGlmIGl0IGRvZXMsIHRoZW4gdXNlIHRoZSBzeW1ib2wgaW5zdGVhZC4KLQkocmVnX25hbWVfc2VhcmNoKTogSWYgYSByZWdpc3RlciBuYW1lIG1hdGNoZXMgYSBzeW1ib2wgbmFtZSwKLQlwcmVmZXIgdGhlIHJlZ2lzdGVyIG5hbWUgdG8gdGhlIHN5bWJvbCBuYW1lLgotCi1Nb24gU2VwIDIxIDEwOjQyOjU3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZG9fYWxpZ24pOiBBZnRlciBpbnNlcnRpbmcgTk9QcywgcmVzZXQKLQl0aGUgcHJldmlvdXMgaW5zbiB0byBlbXB0eS4KLQotMTk5OC0wOS0yMCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IERvIG5vdCBicmVhayBzdHJpbmcgaW50byB0d28KLQlwaWVjZXMsIGZvcmNpbmcgdGhlIHVzZSBvZiBhbiBBTlNJIGNvbXBpbGVyLgotCi1TdW4gU2VwIDIwIDAwOjU4OjEyIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogTmV3IG1hY3JvLiAgRm9yY2UgdnRhYmxlCi0JcmVsb2NzLgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBEbyBub3RoaW5nIGZvciB2dGFibGUgcmVsb2NzLgotCi1UdWUgU2VwIDE1IDA4OjUxOjA3IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotIAotICAgICAgICAqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdnRhYmxlX2luaGVyaXQpOiAgSGFuZGxlIGFybQotICAgICAgICBhc3NlbWJsZXIgc3ludGF4LgotICAgICAgICAob2JqX2VsZl92dGFibGVfZW50cnkpOiAgTGlrZXdpc2UuCi0gICAgICAgICogY29uZmlnL3RjLWFybS5oOiAgRGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04gZm9yIE9CSl9FTEYuCi0gICAgICAgICogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogSGFuZGxlIFZUQUJMRSByZWxvY2F0aW9ucy4KLSAgICAgICAgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotICAgICAgICAoYXJtX2ZpeF9hZGp1c3RhYmxlKTogTGlrZXdpc2UuCi0gICAgICAgIChlbGYzMl9hcm1fZm9yY2VfcmVsb2NhdGlvbik6IE5ldy4KLSAgICAgICAgKGFybWVsZl9mcm9iX3N5bWJvbCk6ICBSZW1vdmUgY29mZi1zdHlsZSBzeW1ib2wgc3VwcG9ydC4KLQotV2VkIFNlcCAgOSAxMToyNzoxNiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBGaXggdHlwbyBpbiBsYXN0IHBhdGNoLgotCi1UdWUgU2VwICA4IDE4OjEwOjAxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotIAotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYyAoYXJtX2FkanVzdF9zeW10YWIpOiAgTW92ZSAjaWZkZWYKLSAgICAgICAgT0JKX0NPRkYgc28gdGhhdCByb3V0aW5lIGlzIGRlZmluZWQgZm9yIGEub3V0IGZvcm1hdC4KLQotVHVlIFNlcCAgOCAxNTo1NjoxOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBEZXRlY3Qgbm9uLXNlZ21lbnQgcmVnaXN0ZXJzCi0JdXNlZCBhcyBzZWdtZW50IHByZWZpeGVzLgotCi1TYXQgU2VwICA1IDE5OjAwOjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWhvcHQuYyAoY2hlY2tfZWhfZnJhbWUpOiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUgRkRFLCBhbmQgZG9uJ3QKLQlvcHRpbWl6ZSBhY3Jvc3MgRkRFIGJvdW5kYXJpZXMuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKTogUHJlc2VydmUgYW55IGxpbmsgb25jZQotCWZsYWdzIHdoZW4gc2V0dGluZyB0aGUgc2VjdGlvbiBmbGFncy4KLQotRnJpIFNlcCAgNCAxNzowNzoxNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmggKG9ial9hZGp1c3Rfc3ltdGFiKTogRml4ZWQgdHlwby4KLQkqIGNvbmZpZy90Yy1hcm0uYyAoYXJtZWxmX2FkanVzdF9zeW10YWIpOiBSZWZvcm1hdHRlZC4KLQotRnJpIFNlcCAgNCAxMzo1Nzo0MyAxOTk4ICBKYWt1YiBKZWxpbmVrIDxqakBzdW5zaXRlLm1zLm1mZi5jdW5pLmN6PgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoaW5fc2lnbmVkX3JhbmdlKTogU2lnbiBleHRlbmQgMzItYml0IHdvcmRzCi0JdG8gdGhlIGhvc3Qgd2lkdGguCi0KLVdlZCBTZXAgIDIgMTE6MzE6MTQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZnJhZ3MuYyAoZnJhZ19ncm93KTogSW5jbHVkZSB0aGUgc2l6ZSBvZiB0aGUgZnJhZyBzdHJ1Y3QgaW4gdGhlCi0Jb2JzdGFjayBjaHVuayBzaXplLgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IEFkanVzdCB0aGUgc2VnaW5mbyBmcmNoYWluIHN0YXJ0Ci0JaWYgdGhlIG5ldyBzdWJzZWcgY29tZXMgYmVmb3JlIHRoZSBvbGQuCi0KLVR1ZSBTZXAgIDEgMTU6MDE6MzMgMTk5OCAgSmFrdWIgSmVsaW5layA8ampAc3Vuc2l0ZS5tcy5tZmYuY3VuaS5jej4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogQWxsb3cgYWxsIGRpZ2l0cyBpbiBhbiBpbnN0cnVjdGlvbgotCXRvIGhhbmRsZSBlZGdlOCBhbmQgZWRnZTE2LgotCi1Nb24gQXVnIDMxIDA5OjUxOjE0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdnRhYmxlX2luaGVyaXQpOiBQcmludCBlcnJvciBtZXNzYWdlCi0JYmVmb3JlIHdlIGNsb2JiZXIgdGhlIHN5bWJvbCBpbnZvbHZlZC4KLQotTW9uIEF1ZyAzMSAxMDo1ODowNiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYzogIFJlbW92ZSBPQkpfRUxGIGRlZmluaXRpb25zIGZvciAKLSAgICAgICAgU19HRVRfU1RPUkFHRV9DTEFTUyBhbmQgU19TRVRfU1RPUkFHRV9DTEFTUy4gIE9ubHkKLSAgICAgICAgdXNlIGFybV9hZGp1c3Rfc3ltdGFiIGZvciBPQkpfQ09GRi4KLSAgICAgICAgKGFybWVsZl9hZGp1c3Rfc3ltdGFiKTogIE5ldyBSb3V0aW5lLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uaDogIERlZmluZSBvYmpfYWRqdXN0X3N5bXRhYiB0bwotICAgICAgICBhcm1lbGZfYWRqdXN0X3N5bXRhYiBmb3IgT0JKX0VMRi4KLSAgICAgICAgCi1TYXQgQXVnIDI5IDIyOjE4OjUxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogTWFrZSBhbGwgaTM4Ni1lbGYgdGFyZ2V0cyB1c2UgYmZkX2dhcy4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZm9yY2VfcmVsb2NhdGlvbik6IE5ldy4KLQkodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IERvbid0IGZpeCB2dGFibGUgcmVsb2NzLgotCShtZF9hcHBseV9maXgzKTogTGlrZXdpc2UuCi0JKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSB0aGVtLgotCSogY29uZmlnL3RjLWkzODYuaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6IEFsd2F5cyBkZWZpbmUsIGNhbGxpbmcKLQl0Y19pMzg2X2ZvcmNlX3JlbG9jYXRpb24uCi0KLU1vbiBBdWcgMjQgMTM6NDA6MjEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9zaG93X3VzYWdlKTogSW1wcm92ZSBmb3JtYXR0aW5nIG9mIC0taGVscCBvdXRwdXQuCi0KLUZyaSBBdWcgMjEgMTg6NDM6NDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXNzZW1ibGUpOiBDb3B5IHByZXZpb3VzIG9wY29kZSBvdmVyCi0JY3VycmVudCBvcGNvZGUgYWZ0ZXIgd3JpdGluZyB0aGUgZmlyc3QgaW5zdHVyY3Rpb24gb2YgYSByZXZlcnNlCi0Jc2VxdWVudGlhbCBwYWlyLiAKLQkKLUZyaSBBdWcgMjEgMDc6MzA6MzUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogcmVhZC5oIChnZW5lcmF0ZV9saW5lbm9fZGVidWcpOiBBZGQgcHJvdG90eXBlLgotCSogcmVhZC5jIChnZW5lcmF0ZV9saW5lbm9fZGVidWcpOiBNYWtlIG5vbi1zdGF0aWMuCi0KLVRodSBBdWcgMjAgMjM6MTc6MDQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IE9ubHkgd2FybiBmb3IgYWRkcmVzcy9kYXRhIHNpemUKLQlwcmVmaXhlcy4KLQotVGh1IEF1ZyAyMCAxNDo0NTowOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGFybV9maXhfYWRqdXN0YWJsZSk6IERvIG5vdCBhZGp1c3QgcmVsb2NhdGlvbnMKLQlhZ2FpbnN0IFRodW1iIGZ1bmN0aW9uIG5hbWVzLCBhcyB0aGUgbGlua2VyIG5lZWRzIHRoaXMgaW5mb3JtYXRpb24uCi0KLTE5OTgtMDgtMjAgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBDaGVjayBhbHNvIHRoYXQgdGhlcmUgaXMgbm8gYWR2YW5jZSBpbiBvcGVyYW5kCi0JYWZ0ZXIgYXRvZl9nZW5lcmljIGluIG9yZGVyIHRvIGRlY2lkZSAiaXMgaXQgbGFiZWwgMGYgb3IgZmxvYXRpbmcKLQlwb2ludCBudW1iZXI/Ii4KLQotV2VkIEF1ZyAxOSAwOTozMDoxNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jOiBSZXBsYWNlIGRvdWJsZSBkYXNoIHByZWZpeCB0byBNMzJSIHNwZWNpZmljCi0JY29tbWFuZCBsaW5lIG9wdGlvbnMgd2l0aCBhIHNpbmdsZSBkYXNoLgotCSogZG9jL2MtbTMyci50ZXhpOiBSZXBsYWNlIGRvdWJsZSBkYXNoIHByZWZpeCB3aXRoIGEgc2luZ2xlIGRhc2guCi0KLVR1ZSBBdWcgMTggMTE6NTk6NDMgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIHRjLWFybS5oOiBEZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlIGZvciBPQkpfRUxGLgotICAgICAgICogdGMtYXJtLmMgKGFybV9maXhfYWRqdXN0YWJsZSk6IE5ldyByb3V0aW5lLgotCi0xOTk4LTA4LTEzICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2FsaWduLCBzX2NvbW0sIHNfbXJpX2NvbW1vbiwgc19mYWlsLCBzX2dsb2JsLCBzX3NwYWNlLAotCXNfZmxvYXRfc3BhY2UsIHNfc3RydWN0LCBjb25zX3dvcmtlcik6IE1vdmUgaWdub3JlX3Jlc3Rfb2ZfbGluZSBvcgotCWRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgYmVmb3JlIG1yaV9jb21tZW50X2VuZC4KLQkoZXF1YWxzKTogQ2hlY2sgZ2FyYmFnZSBhZnRlciBleHByZXNzaW9uIGJlZm9yZQotCW1yaV9jb21tZW50X2VuZCBpbiBNUkkgbW9kZS4KLQotVGh1IEF1ZyAxMyAxNTowODo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogQ29ycmVjdCBNX1NHRV9JL01fU0dFVUlfSSBjYXNlIGZvciBhCi0Jc21hbGwgaW1tZWRpYXRlIGNvbnN0YW50IHRvIHVzZSB0aGUgY29uc3RhbnQgaXRzZWxmIHJhdGhlciB0aGFuCi0JYWx3YXlzIHVzaW5nIDEuCi0KLVdlZCBBdWcgMTIgMTg6NDc6MzggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9lbnRlcik6IENhbGwgYXNfYmFkIHJhdGhlciB0aGFuIGFib3J0LgotCShwYV9sZWF2ZSk6IExpa2V3aXNlLgotCi1XZWQgQXVnIDEyIDEzOjI1OjAzIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBFbWl0IGEgd2FybmluZyBmb3Igc3RhbmQtYWxvbmUKLQlwcmVmaXhlcy4KLQkoaTM4Nl9vcGVyYW5kKTogRml4IGFuIGVycm9yIG1lc3NhZ2UuCi0KLVR1ZSBBdWcgMTEgMTQ6NDQ6MzIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtYXJtLnRleGkgKEFSTSBEaXJlY3RpdmVzKTogRG9jdW1lbnQgLnJlcSBkaXJlY3RpdmUuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAocmVnX3JlcXVpcmVkX2hlcmUpOiBEaXNwbGF5IGVycm9uZW91cyBzdHJpbmcgaWYKLQl0aGUgcmVnaXN0ZXIgbmFtZSBjb3VsZCBub3QgYmUgZGVjb2RlZC4KLQlEbyBub3Qgc2V0IGluc3QuaW5zdHJ1Y3Rpb24gaWYgdGhlIHNpZnQgaXMgLTEuCi0KLU1vbiBBdWcgMTAgMTU6Mzk6NTYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHRjX2dlbl9yZWxvYyk6IEJpYXMgV0VBSyBzeW1ib2xzIGp1c3QgYXMKLQl3ZSBkbyBmb3IgRVhURVJOLgotCi1Nb24gQXVnIDEwIDE1OjA2OjE4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGQzMHZfYWxpZ24pOiBBbHdheXMgcGVyZm9ybSBhbGlnbm1lbnQgcmVxdWVzdCwKLQlldmVuIGlmIGl0IGlzIGJlbGl2ZWQgdG8gYmUgdW5uZWNlc3NhcnkuCi0KLU1vbiBBdWcgMTAgMTc6NDg6MDkgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogU2l6ZSBpbW1lZGlhdGUgY29uc3RhbnRzIGJ5Ci0Jc3VmZml4IChlcnJvbmVvdXNseSByZW1vdmVkIGFzIHBhcnQgb2YgSnVseSA3IGNoYW5nZSkuCi0KLVN1biBBdWcgIDkgMjA6NDU6MzIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvb2JqLWVsZi5oOiAgQ2hlY2sgZm9yIHJlZGVmaW5pdGlvbiBvZiBvYmpfZnJvYl9zeW1ib2wuCi0gICAgICAgICogY29uZmlnL3RjLWFybS5jOiAgRGVmaW5lIFNfR0VUX1NUT1JBR0VfQ0xBU1MgYW5kIFNfU0VUX1NUT1JBR0VfQ0xBU1MuCi0gICAgICAgIChhcm1lbGZfZnJvYl9zeW1ib2wpOiAgTmV3IFJvdXRpbmUuCi0gICAgICAgICogY29uZmlnL3RjLWFybS5oOiAgRGVmaW5lIG9ial9mcm9iX3N5bWJvbCBpZiBPQkpfRUxGLgotCi1TYXQgQXVnICA4IDE1OjIxOjI4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCB3ZWFrIHN5bXMuCi0KLVdlZCBBdWcgIDUgMTU6NTQ6MTQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9iZWdpbik6IFNldCBCRkQgcHJpdmF0ZSBmbGFncyBkZXBlbmRpbmcgdXBvbgotCWNvbW1hbmQgbGluZSBzd2l0Y2hlcyBwYXNzZWQgdG8gYXNzZW1ibGVyLgotCi1Nb24gQXVnICAzIDE0OjAyOjUyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKEdBU19DR0VOX01BWF9GSVhVUFMpOiBHQVNfIHByZXBlbmRlZCwgYWxsIHVzZXMgdXBkYXRlZC4KLQkoZ2FzX2NnZW5fb3Bjb2RlX2Rlc2MpOiBEZWNsYXJlLgotCShnYXNfY2dlbl9wYXJzZV9vcGVyYW5kKTogRGVjbGFyZS4KLQkoKik6IFByZXBlbmQgZ2FzXyB0byBnYXMgc3BlY2lmaWMgZm5zIHRvIGRlbm90ZSB0aGVtIGFzIHN1Y2guCi0JQWxsIHVzZXMgdXBkYXRlZC4KLQkqIGNnZW4uYyAoZ2FzX2NnZW5fb3Bjb2RlX2Rlc2MpOiBOZXcgZ2xvYmFsCi0JKGdhc19jZ2VuX2luaXRfcGFyc2UpOiBSZW5hbWVkIGZyb20gY2dlbl9hc21faW5pdF9wYXJzZS4KLQkocXVldWVfZml4dXApOiBSZW5hbWVkIGZyb20gY2dlbl9xdWV1ZV9maXh1cC4KLQkoKik6IFByZXBlbmQgZ2FzXyB0byBnYXMgc3BlY2lmaWMgZm5zIHRvIGRlbm90ZSB0aGVtIGFzIHN1Y2guCi0JQWxsIHVzZXMgdXBkYXRlZC4KLQkoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6IFVwZGF0ZSBjYWxsIHRvIGluc2VydF9vcGVyYW5kLgotCShnYXNfY2dlbl9maW5pc2hfaW5zbik6IFJlbmFtZWQgZnJvbSBjZ2VuX2FzbV9maW5pc2hfaW5zbi4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2JlZ2luKTogUmVtb3ZlIHVzZSBvZiBDR0VOX1NZTS4KLQlPcGVuIG9wY29kZSB0YWJsZSBhbmQgaW5pdGlhbGl6ZSBpdC4KLQkobWFrZV9wYXJhbGxlbCk6IFVzZSBnYXNfY2dlbl9vcGNvZGVfZGVzYy4KLQkoYXNzZW1ibGVfcGFyYWxsZWxfaW5zbik6IERpdHRvLiAgUmVtb3ZlIHVzZSBvZiBDR0VOX1NZTS4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQotU2F0IEF1ZyAgMSAxOToyNzozMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcy5oIChkZWJ1Z19pbmZvX3R5cGUpOiBBZGQgZW50cmllcyBmb3IgdW5zcGVjaWZpZWQgYW5kIGR3YXJmKi4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBUYWtlIG5vIGFyZ3VtZW50czsgY2FsbAotCWFzX3doZXJlIG91cnNlbHZlcy4gIFByb3ZpZGUgYSBzdHViIGZvciAhRUNPRkZfREVCVUdHSU5HLgotCSogZWNvZmYuaDogTW92ZSBFQ09GRl9ERUJVR0dJTkcgcHJvdGVjdGlvbiBpbnNpZGUgR0FTX0VDT0ZGX0guCi0JTW92ZSBlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vIG91dHNpZGUgRUNPRkZfREVCVUdHSU5HIHByb3RlY3Rpb24uCi0JKiByZWFkLmMgKGdlbmVyYXRlX2xpbmVub19kZWJ1Zyk6IFRpZHkgRUNPRkYgYml0cy4gIFVzZQotCURFQlVHX1VOU1BFQ0lGSUVEIHJhdGhlciB0aGFuIERFQlVHX05PTkUgZm9yIGluaXRpYWwgdGVzdC4KLQkqIGNvbmZpZy9vYmotZWxmLmggKEVDT0ZGX0RFQlVHR0lORykgW1RDX0FMUEhBXTogRGVmaW5lIHRvIGEgdmFyaWFibGUuCi0JKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBDb25kaXRpb25hbGl6ZSBvbiB2YWx1ZSBvZiBFQ09GRl9ERUJVR0dJTkcuCi0JKElOSVRfU1RBQl9TRUNUSU9OKTogTGlrZXdpc2UuCi0JKE9CSl9QUk9DRVNTX1NUQUIpOiBMaWtld2lzZS4KLQkKLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9sb25nb3B0cyk6IE5ldyBvcHRpb25zIC1tZGVidWcvLW5vLW1kZWJ1Zy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogV2F0Y2ggZm9yIHRoZW0uCi0JKGFscGhhX2N1cl9lbnRfc3ltLCBhbHBoYV9mbGFnX21kZWJ1Zyk6IE5ldyB2YXJpYWJsZXMuCi0JKG1kX2JlZ2luKTogS2lsbCBuZXZlcmRlZiBjb2RlLgotCShzX2FscGhhX2VudCwgc19hbHBoYV9lbmQsIHNfYWxwaGFfbWFzaywgc19hbHBoYV9mcmFtZSk6IE5ldy4KLQkoc19hbHBoYV9wcm9sb2d1ZSk6IFdhdGNoIGFscGhhX2N1cl9lbnRfc3ltLgotCShzX2FscGhhX2NvZmZfd3JhcHBlcik6IE5ldy4KLQkobWRfcHNldWRvX3RhYmxlKTogVHJhcCBhbGwgRUNPRkYgcHNldWRvcy4KLQkKLUZyaSBKdWwgMzEgMTY6NDU6NTQgMTk5OCAgUm9uIFVucmF1IDxydW5yYXVAY3lnbnVzLmNvbT4KLQotCVN0YXJ0IG9mIGNoYW5nZXMgdG8gcmVtb3ZlIG1kZWJ1ZyBzZWN0aW9uIGZyb20gbWlwcyotZWxmCi0JQmFzZWQgb24gTUlQU19TVEFCX0VMRiBkZWZpbml0aW9uCi0JKiBhY2NvbmZpZy5oOiB1bmRlZiBpZiBub3QgY29uZmlndXJlZAotCSogY29uZmlnLmluOiB1bmRlZiBpZiBub3QgY29uZmlndXJlZAotCSogY29uZmlnL21pcHMtZWxmLmg6IG9ubHkgc2V0IEVDT0ZGIGRlYnVnZ2luZyBpZiBub3Qgc3RhYnMtaW4tZWxmCi0JKiBjb25maWcvdGMtbWlwcy5jIChzX2VudCk6IHNldCBCU0ZfRlVOQ1RJT04KLQkqIHN0YWJzLmMgKHNfc3RhYl9nZW5lcmljKTogZmx1c2ggZnJhZwotCi1GcmkgSnVsIDMxIDE2OjE0OjQ1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiAoYXJtLSotZWxmKTogIEhhbmRsZS4KLSAgICAgICAgKHRodW1iLSotZWxmKTogSGFuZGxlLgotICAgICAgICAqIGNvbmZpZ3VyZTogIFJlZ2VuZXJhdGUuCi0gICAgICAgICogcmVhZC5jIChzdHJpbmdlcik6IEZpeCB0eXBvIGluIGNvbW1lbnQuCi0gICAgICAgICogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IGFkZCBzeW1ib2wgdmFsdWUgdG8gYWRkZW5kIGlmCi0gICAgICAgIFRDX0FSTSBhbmQgT0JKX0VMRi4KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiAgRG9uJ3QgYWxpZ24gZHdhcmYgZGVidWcKLSAgICAgICAgc2VjdGlvbnMuCi0gICAgICAgICh0Y19nZW5fcmVsb2MpOiAgQWx3YXlzIHNldCB0aGUgcmVsb2MgYWRkZW5kIHRvIGZpeHAtPmZ4X29mZnNldAotICAgICAgICBmb3IgT0JKX0VMRi4KLQotVGh1IEp1bCAzMCAyMTozODo0MyAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jICh7Y3VyLHByZXZ9X2xlZnRfa2lsbHNfcmlnaHRfcCk6IE5ldyB2YXJpYWJsZXMuCi0JKHdyaXRlXzJfc2hvcnQpOiBFbWl0IHdhcm5pbmcgaWYgbmV3IGZsYWcgaXMgc2V0LgotCShkb19hc3NlbWJsZSk6IFNldCBmbGFncyBpZiBsZWZ0IGluc3RydWN0aW9uIGlzIG9uZSBvZiBzcGVjaWFsCi0JInJpZ2h0LWluc3RydWN0aW9uLWtpbGxlciIgdHlwZS4KLQotVHVlIEp1biAyOCAxODoxMjoyOCAxOTk4ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQkKLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9udW1iZXJfdG9fY2hhcnMsIGNvbnNfZml4X25ld19zcGFyYyk6Ci0JQWx3YXlzIG91dHB1dCB3b3JkcyBpbiBkZWJ1Z19pbmZvIHNlY3Rpb24gYXMgYmlnIGVuZGlhbi4KLQkoc3BhcmNfdGFyZ2V0X2Zvcm1hdCk6IENob29zZSBjb3JyZWN0IGJmZCB0YXJnZXQuCi0JKG1kX2FwcGx5X2ZpeDMpOiBSZW5hbWUgQkZEX1JFTE9DX1NQQVJDXzMyTEUgdG8gQkZEX1JFTE9DX1NQQVJDX1JFVjMyLgotCQotVHVlIEp1bCAyOCAxMTowMToyMSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogRml4ICJlcnJtc2ciIGluaXRpYWxpemF0aW9uCi0JdG8gd29yayB3aXRoIGludGVybmF0aW9uYWxpemF0aW9uIGNvZGUuICBJc3N1ZSBhbiBlcnJvciB3aGVuIHR3bwotCW9wZXJhbmRzIG1hdGNoIHRoYXQgYXJlIG5vdCBhbGxvd2VkIHRvIG1hdGNoLgotCi1Nb24gSnVsIDI3IDE2OjI1OjU4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaW5zdGFsbF90b29sZGlyKTogQWxsb3cgdGFyZ2V0IHRvIHNwZWNpZnkgd2hldGhlcgotCWl0IHdhbnRzIHRvIGJlIGluc3RhbGxlZCBpbiAkKHRvb2xkaXIpL2Jpbi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBTZXQgaW5zdGFsbC1leGVjLXRvb2xkaXIKLQlkZXBlbmRlbmN5IHZpYSBjb25maWd1cmUuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotRnJpIEp1bCAyNCAxOTo1ODo1OSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogU3BsaXQgaW50byB0d28gLi4uCi0JKGluc3RhbGwtZXhlYy1iaW5kaXIsaW5zdGFsbC1leGVjLXRvb2xkaXIpOiBOZXcgcnVsZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotRnJpIEp1bCAyNCAxNjozMTo0OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBEb24ndCByZW1vdmUgdGhlIGZpbGUgYmVmb3JlCi0JY2hlY2tpbmcgd2hldGhlciAkKGJpbmRpcikgPT0gJCh0b29sZGlyKS9iaW4uICBGcm9tIE1hY2llagotCVcuIFJvenlja2kgPG1hY3JvQGRzMi5wZy5nZGEucGw+LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBKdWwgMjQgMDk6MTM6NDYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShjZ2VuX21kX2FwcGx5X2ZpeDMpOiBVcGRhdGUgY2FsbCB0byBtZF9jZ2VuX2xvb2t1cF9yZWxvYy4KLQkoY2dlbl90Y19nZW5fcmVsb2MpOiBVc2UgeG1hbGxvYywgbm90IGJmZF9hbGxvYy4KLQkqIGNnZW4uaCAoY2dlbl9tZF9hcHBseV9maXgzLGNnZW5fdGNfZ2VuX3JlbG9jKTogRGVjbGFyZS4KLQkobWRfY2dlbl9sb29rdXBfcmVsb2MpKTogRGVjbGFyZS4KLQkobWRfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmggKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IERlY2xhcmUuCi0JKG0zMnJfcmVsYXhfZnJhZyk6IERlY2xhcmUuCi0JKGNnZW5fbWRfYXBwbHlfZml4Myk6IERlY2xzIG1vdmVkIHRvIGNnZW4uaC4KLQkoY2dlbl9yZWNvcmRfZml4dXBfZXhwLGNnZW5fdGNfZ2VuX3JlbG9jKTogRGl0dG8uCi0JKG0zMnJfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogRGVsZXRlIGRlY2wuCi0JKiBjb25maWcvdGMtbTMyci5jIChtMzJyX2NwdV9kZXNjKTogI2lmIDAgb3V0LgotCShhc3NlbWJsZV9ub3ApOiBEZWxldGUuCi0JKGV4cGFuZF9kZWJ1Z19zeW1zKTogRGVsZXRlIHVudXNlZCBgZXhwJy4KLQkobWRfY2dlbl9sb29rdXBfcmVsb2MpOiBSZW5hbWVkIGZyb20gQ0dFTl9TWU0gKGxvb2t1cF9yZWxvYykuCi0JQWRkIGRlZmF1bHQgY2FzZSBmb3IgLVdhbGwuCi0JKG0zMnJfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogQWRkIGRlZmF1bHQgY2FzZSBmb3IgLVdhbGwuCi0JKG1kX2F0b2YpOiBEZWxldGUgdW51c2VkIHdvcmRQLgotCi1UaHUgSnVsIDIzIDEzOjE5OjUwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBNYWtlIHN1cmUgImVycm1zZyIgaGFzIGEgbm9uLU5VTEwKLQl2YWx1ZS4KLQotV2VkIEp1bCAyMiAxNDozNjo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgLmVuZCwgLmV4aXRtLCAuZmFpbCwKLQkuaWZjLCAuaWZlcXMsIC5pZmdlLCAuaWZndCwgLmlmbGUsIC5pZmx0LCAuaWZuYywgLmlmbmUsIC5pZm5lcywKLQkucHJpbnQsIC5wdXJnZW0sIGFuZCAuc3RydWN0LiAgUmVtb3ZlIGRvY3VtZW50YXRpb24gZm9yCi0JLmFwcC1maWxlLgotCi1UdWUgSnVsIDIxIDE2OjUwOjUyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmMgKGNnZW5fbWRfYXBwbHlfZml4Myk6IHNldF9vcGVyYW5kIHJlbmFtZWQgdG8gc2V0X3ZtYV9vcGVyYW5kLgotCVVwZGF0ZSBjYWxsIHRvIGluc2VydF9vcGVyYW5kLgotCi1GcmkgSnVsIDE3IDExOjQyOjIwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1zX3Nob3dfdXNhZ2UpOiBGb3JtYXR0aW5nIGNoYW5nZXMuCi0KLVdlZCBKdWwgMTUgMTU6Mzg6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IERvbid0IGdldCBjb25mdXNlZCBieSB0cmFpbGluZwotCXdoaXRlc3BhY2UgYWZ0ZXIgYSBwcmVmaXggb3BlcmF0b3IuCi0KLVR1ZSBKdWwgMTQgMTU6MzI6NTYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotYmVvc3twZSxlbGYsfSopOiBSZWNvZ25pemUuCi0KLVR1ZSBKdWwgMTQgMTI6MzM6NDQgMTk5OCAgQ2hyaXMgVG9yZWsgIDx0b3Jla0Bic2RpLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGxvZzIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzX3Jlc2VydmUpOiBVc2UgbG9nMiB0byBjb252ZXJ0IGFsaWdubWVudCBiZWZvcmUgY2FsbGluZwotCXJlY29yZF9hbGlnbm1lbnQuCi0JKHNfY29tbW9uKTogVXNlIGxvZzIgdG8gY29udmVydCBhbGlnbm1lbnQgYmVmb3JlIGNhbGxpbmcKLQlyZWNvcmRfYWxpZ25tZW50IGFuZCBmcmFnX2FsaWduLgotCShzcGFyY19jb25zX2FsaWduKTogVXNlIGxvZzIuCi0KLVR1ZSBKdWwgMTQgMTE6NTg6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19yZXNlcnZlKTogU2V0IHN5bWJvbCBzaXplIGlmIE9CSl9FTEYuCi0JKHNfY29tbW9uKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19oYW5kbGVfYWxpZ24pOiBSZWluZGVudCBhIGJpdC4gIENvcnJlY3QKLQlpbml0aWFsaXphdGlvbiBvZiB3YWRkci4KLQkoc3BhcmNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBBZGQgZGVmYXVsdCBjYXNlIHRvIHN3aXRjaC4KLQotVHVlIEp1bCAxNCAxMTowMDoxNiAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGRvYy9jLWkzODYudGV4aTogRml4IGEgdHlwby4gIFVzZSB0aGUgdGVybSA4MC1iaXQgcmVhbCByYXRoZXIKLQl0aGFuIHRlbXBvcmFyeSByZWFsLgotCi1Nb24gSnVsIDEzIDEzOjU1OjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoc3Vic2Vnc19maW5pc2gpOiBEb24ndCBhbGlnbiB0aGUgc2VnbWVudHMgaWYgdGhlcmUgd2VyZQotCWFueSBlcnJvcnMuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX3N5bWJvbF9tZXJnZSk6IENvcnJlY3QgbnVtYmVyIG9mIGJ5dGVzIHdoZW4KLQljb3B5aW5nIGF1eCBpbmZvcm1hdGlvbi4KLQotCSogZXhwci5jIChtYWtlX2V4cHJfc3ltYm9sKTogQ2F0Y2ggYXR0ZW1wdHMgdG8gdHVybiBhbiBPX2JpZwotCWV4cHJlc3Npb24gaW50byBhIHN5bWJvbC4KLQotTW9uIEp1bCAxMyAxMzoyOTowNCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1vZGVfZnJvbV9kaXNwX3NpemUpOiBDaGFuZ2UgYXJnIGFuZCByZXR1cm4KLQl0eXBlIHRvIHVuc2lnbmVkIGludC4KLQkobWRfYXNzZW1ibGUpOiBDaGFuZ2UgdHlwZSB1c2VkIHRvIHN0b3JlIG9mZnNldHMgZnJvbSB1bnNpZ25lZAotCWxvbmcgdG8gbG9uZy4KLQkoaTM4Nl9vcGVyYW5kKTogU3dpdGNoIGVycm9yIGNoZWNrIHRvIG9ubHkgY2FsbCBSRVNUT1JFX0VORF9TVFJJTkcKLQlvbmNlIGFmdGVyIHBhcnNlX3JlZ2lzdGVyLgotCi1GcmkgSnVsIDEwIDE2OjAwOjA0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX3Nob3dfdXNhZ2UpOiBDaGFuZ2VkIGZvcm1hdCB0byBtYXRjaCB0aGF0Ci0Jb2YgZ2NjLCBsZCwgZXRjLgotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogQ2hhbmdlZCBmb3JtYXQgdG8gbWF0Y2ggdGhhdCBvZiBnY2MsIGxkLCBldGMuCi0KLVRodSBKdWwgIDkgMTI6MDk6NTcgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHRjX202OGtfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgdnRhYmxlCi0JcmVsb2NzLgotCShtZF9hcHBseV9maXhfMik6IEZvcmNlIHRoZSBzeW1ib2wgb2YgdGhlIHZ0YWJsZSByZWxvYyB0byBiZQotCXdlYWsuCi0KLVRodSBKdWwgIDkgMTE6MzE6NTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvTWFrZWZpbGUuYW0gKE1BSU5UQUlORVJDTEVBTkZJTEVTKTogRGVmaW5lLgotCSogZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1XZWQgSnVsICA4IDEyOjE4OjU2IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXAsIGNhc2UgJ2knIGFuZCAnaicpOiBNYXNrIG9mZiBoaWdoIGJpdHMKLSAgICAgICAgZm9yICVsbyBleHByZXNzaW9ucy4KLSAgICAgICAgKG1pcHNfaXAsIGNhc2UgJ3UnKTogTW92ZSByYW5nZSBjaGVjayBhZnRlciBjb2RlIHRvIG1hc2sKLSAgICAgICAgb2ZmIGJpdHMgaW4gJWhpLyVsbyBleHByZXNzaW9ucy4gIE1hc2sgb2ZmIGhpZ2ggYml0cyBmb3IKLSAgICAgICAgJWxvIGV4cHJlc3Npb25zLgotCi1UdWUgSnVsICA3IDE3OjU3OjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL01ha2VmaWxlLmFtIChnYXN2ZXIudGV4aSk6IE5ldyB0YXJnZXQuCi0JKGFzLmluZm8sIGFzLmR2aSk6IERlcGVuZHMgdXBvbiBnYXN2ZXIudGV4aS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBJbmNsdWRlIGdhc3Zlci50ZXhpLiAgTWVudGlvbiB2ZXJzaW9uIG51bWJlciBvbgotCXRpdGxlIHBhZ2UgYW5kIGluIHRvcCBub2RlLgotCSogZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgSnVsICA3IDExOjQyOjE2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19saXN0aW5nKTogRm9yIEVESUNUX0xJU1QsIHNraXAgYWxsIGxpbmVzIHVwIHRvCi0JYnV0IG5vdCBpbmNsdWRpbmcgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgZWRpY3QuCi0JKiBsaXN0aW5nLmggKExJU1RJTkdfRU9GKTogTmV3LgotCSogaW5wdXQtc2NydWIuYyAoaW5wdXRfc2NydWJfbmV4dF9idWZmZXIpOiBDYWxsIGl0LgotCi1UdWUgSnVsICA3IDEzOjAwOjM3IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogRG9uJ3Qgc2V0IHRoZSBzaXplIG9mIGFuCi0gCWltbWVkaWF0ZSBhZGRyZXNzIGJhc2VkIHNvbGVseSBvbiB0aGUgc3VmZml4IGFuZCB0aGUgbW9kZS4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBBZGQgYXNzZXJ0aW9uIHRvIG1ha2Ugc3VyZQotCW92ZXJsYXAyIGRvZXMgbm90IHNldCBJbW0uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHNwYWNlX2NoYXJzKTogUmVtb3ZlLiBUaGUgc2NydWJiZXIgY29udmVydHMKLQlzZXF1ZW5jZXMgb2Ygd2hpdGVzcGFjZSB0byBhIHNpbmdsZSBzcGFjZS4KLQkoaXNfc3BhY2VfY2hhcnMpOiBKdXN0IGNvbXBhcmUgd2l0aCBzcGFjZS4KLQkobWRfYmVnaW4pOiBEb24ndCBpbml0aWFsaXplIHNwYWNlX2NoYXJzLgotCShtZF9hc3NlbWJsZSk6IEp1c3Qgc2tpcCBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4KLQkoaTM4Nl9vcGVyYW5kKTogUmV3cml0ZSBiYXNlLWluZGV4IHBhcnNpbmcgdG8gdXNlIG5ldwotCXBhcnNlX3JlZ2lzdGVyLCBhbmQgdG8gc2tpcCB3aGl0ZSBzcGFjZS4gIFNraXAgd2hpdGUgc3BhY2UgaW4gYQotCW51bWJlciBvZiBvdGhlciBwbGFjZXMgdG9vLiAgRG9uJ3QgZ2l2ZSBlcnJvciBtZXNzYWdlIGlmCi0JcGFyc2VfcmVnaXN0ZXIgZmFpbHMuCi0JKHBhcnNlX3JlZ2lzdGVyKTogQ2hhbmdlIHJlZ19zdHJpbmcgcGFyYW1ldGVyIHRvIGJlIG5vbi1jb25zdC4KLQlBZGQgZW5kX29wIHBhcmFtZXRlci4gIFNraXAgd2hpdGUgc3BhY2UgYWZ0ZXIgdGhlIGAlJywgYW5kIHJldHVybgotCWVuZCBvZiByZWdpc3RlciBzdHJpbmcuICBHaXZlIGVycm9yIG1lc3NhZ2UgaGVyZSByYXRoZXIgdGhhbgotCWNhbGxlci4KLQotRnJpIEp1bCAgMyAxNTozNDozNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIE1hdHQgU2VtZXJza3kgPG1hdHRzQHNjZC5ocC5jb20+OgotCSogZXhwci5jIChvcF9lbmNvZGluZyk6IE1ha2UgY29uc3QuCi0JKGV4cHJfc2V0X3ByZWNlZGVuY2UpOiBOZXcgZnVuY3Rpb24uCi0JKGV4cHJfYmVnaW4pOiBEb24ndCBzZXQgb3BlcmF0b3IgcmFua2luZ3MsIGp1c3QgY2FsbAotCWV4cHJfc2V0X3ByZWNlZGVuY2UuCi0JKiBleHByLmggKGV4cHJfc2V0X3ByZWNlZGVuY2UpOiBEZWNsYXJlLgotCSogcmVhZC5jIChzX21yaSk6IENhbGwgZXhwcl9zZXRfcHJlY2VkZW5jZS4KLQotVGh1IEp1bCAgMiAxNjoyNDo1OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvIChTdGF0ZW1lbnRzKTogUmVtb3ZlIHBhcmFncmFwaCBkaXNjdXNzaW5nCi0JY29udGludWluZyBsaW5lcyB3aXRoIGEgYmFja3NsYXNoLiAgVGhpcyBoYXNuJ3Qgd29ya2VkIGZvciB5ZWFycywKLQlpZiBpdCBldmVyIGRpZC4KLQotVGh1IEp1bCAgMiAxNDowNjoyMiAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHJtaS5kZT4KLQotICAgICAgICAqIG9iai12bXMuYzogQWRkIEMrKyBzdXBwb3J0IHdpdGggY3RvcnMvZHRvcnMgc2VjdGlvbnMuICBBZGQgd2VhawotCXN5bWJvbCBkZWZpbml0aW9ucy4KLQkoQ3RvcnNfU3ltYm9scywgRHRvcnNfU3ltYm9scyk6IE5ldyBzeW1ib2wgY2hhaW5zLgotCShwc19DVE9SUywgcHNfRFRPUlMpOiBOZXcgc2VjdGlvbiB0eXBlcy4KLQkodm1zX2ZpeHVwX3h0b3JzX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24KLQkoQ3RvcnNfUHNlY3QsIER0b3JzX1BzZWN0KTogRGVmaW5lLgotCShJU19HWFhfWFRPUik6IERlZmluZQotCShnbG9iYWxfc3ltYm9sX2RpcmVjdG9yeSk6IENoYW5nZSBjaGVjayBvZiBneHhfYnVnX2ZpeGVkIHRvIDAuCi0JRmlsdGVyIHN0YXRpYyBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMgYW5kIGFkZCB0bwotCUN0b3JzX1N5bWJvbHMvRHRvcnNfU3ltYm9scyBjaGFpbi4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlKTogV3JpdGUgQ3RvcnNfU3ltYm9scy9EdG9yc19TeW1ib2xzIHRvCi0JYXBwcm9wcmlhdGUgc2VjdGlvbi4KLQotICAgICAgICAqIHRjLWFscGhhLmggKFRBUkdFVF9GT1JNQVQpOiBSZW5hbWUgImV2YXgtYWxwaGEiIHRvICJ2bXMtYWxwaGEiLgotCSogbWFrZWZpbGUudm1zOiBNZXJnZSB2YXgvdm1zIHN1cHBvcnQuCi0KLVdlZCBKdWwgIDEgMjA6MDY6MjAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl92dGFibGVfaW5oZXJpdCwgb2JqX2VsZl92dGFibGVfZW50cnkpOiBOZXcuCi0JKGVsZl9wc2V1ZG9fdGFibGUpOiBBZGQgdGhlbS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIHZ0YWJsZSByZWxvY3MuCi0JKG1kX2FwcGx5X2ZpeCk6IEFjY2VwdCB0aGVtLgotCShtaXBzX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHRoZW0uCi0JKHRjX2dlbl9yZWxvYyk6IE11bmcgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSBmb3IgUmVsLgotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogQWNjZXB0IHZ0YWJsZSByZWxvY3MuCi0JKiBjb25maWcvdGMtcHBjLmggKFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTik6IEZvcmNlIHZ0YWJsZSByZWxvY3MuCi0JKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHRoZW0uCi0KLVdlZCBKdWwgIDEgMTY6MzU6MzIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChDR0VOX0NQVV9QUkVGSVgpOiBOZXcgdmFyaWFibGUuCi0JKGNnZW4ubyk6IFVzZSBpdC4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlLmluOiBBQ19TVUJTVCBjZ2VuX2NwdV9wcmVmaXguCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVdlZCBKdWwgIDEgMjE6Mzg6NTYgMTk5OCAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLXNoIChDT05EX0pVTVBfREVMQVksIENPTkQxMl9ERUxBWV9MRU5HVEgpOiBEZWZpbmUuCi0JQ2hhbmdlZCBhbGwgdXNlcnMgb2YgQ09ORDEyX0RFTEFZLgotCi1GcmkgSnVuIDI2IDExOjIxOjExIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAoc2V0X2FyY2hfbWFjaCk6IE5ldyBmdW5jdGlvbi4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkIHBzZXVkby1vcHMgdG8gc2V0IHRoZSBjdXJyZW50IG1hY2hpbmUgdHlwZS4KLQkobWRfYmVnaW4pOiBEZWZhdWx0IHRvIG1uMTAzMDAgbW9kZS4KLQkobWRfYXNzZW1ibGUpOiBPbmx5IGFjY2VwdCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBjb3JlIG1uMTAzMDAKLQljaGlwIGFuZCB0aGUgYWN0aXZlIG1hY2hpbmUgdHlwZS4KLQotV2VkIEp1biAyNCAxOTowNjowNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBHaXZlIHRoZSBzdHJ1Y3QgYSBuYW1lLgotCSogY29uZmlnL3RjLWg4MzAwLmggKHRjX3JlbG9jX21hbmdsZSk6IEFkZCBwcm90b3R5cGUuCi0JKiBjb25maWcvdGMtaDg1MDAuaCAodGNfcmVsb2NfbWFuZ2xlKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1zaC5oIChzaF9jb2ZmX3JlbG9jX21hbmdsZSk6IEFkZCBwcm90b3R5cGUuCi0JKiBjb25maWcvdGMtdzY1LmggKHRjX3JlbG9jX21hbmdsZSk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtejhrLmggKHRjX3JlbG9jX21hbmdsZSk6IERlY2xhcmUuCi0KLVdlZCBKdW4gMjQgMTM6NDU6MDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX2NvbW0pOiAgUmVzdG9yZSBvbGQgc2VjdGlvbgotICAgICAgICBhZnRlciBjb21tb24gcHJvY2Vzc2luZy4KLQotV2VkIEp1biAyNCAxMTo1MDo1NCAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlnL29iai12bXMuYyAoQ3JlYXRlX1ZNU19PYmplY3RfRmlsZSk6IEZvcmNlIGJpbmFyeSBmaWxlLgotCi1UdWUgSnVuIDIzIDE3OjQ3OjMxIDE5OTggIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGRvX2FfZml4X2ltbSwgYnVpbGRfYnl0ZXMpOiBSZXBsYWNlIGNhc3QgdG8KLQljaGFyIHdpdGggY29kZSB0aGF0IGV4cGxpY2l0bHkgc2lnbi1leHRlbmRzLgotCi1UdWUgSnVuIDIzIDEzOjU0OjU3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0JCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9iZWdpbik6IFJlc3RvcmUgdGV4dCBzZWN0aW9uIGFzIHRoZSBjdXJyZW50Ci0Jc2VjdGlvbiBhZnRlciBjcmVhdGluZyBjYWxsIHRhYmxlIHNlY3Rpb25zLgotCSogY29uZmlnL29iai1jb2ZmLmggKFNZTV9BVVhJTkZPKTogTmV3IG1hY3JvIHRvIGNvbmNlYWwgdWdseQotCWNvZGUuIAotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19zeW1ib2xfbWVyZ2UpOiBSZXBsYWNlIGNvbXBsZXggZXhwcmVzaW9uCi0Jd2l0aCBjYWxsIHRvIG1hY3JvIFNZTV9BVVhJTkZPLgotCi1UdWUgSnVuIDIzIDE1OjA5OjI3IDE5OTggIE1pa2UgU3R1bXAgIDxtcnNAd3JzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IERvbid0IGxldCBFWEVFWFQgaW50ZXJmZXJlCi0Jd2l0aCB0aGUgcHJvZ3JhbSB0cmFuc2Zvcm0gbmFtZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gSnVuIDIyIDE5OjUyOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfc3ltYm9sX21lcmdlKTogRml4IGNvcHlpbmcgb2YgYXV4aWxpYXJ5Ci0JaW5mb3JtYXRpb24uCi0KLU1vbiBKdW4gMjIgMTU6MTg6NTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBCZSBwcmVwYXJlZCBmb3IgYSBzcGFjZSBiZXR3ZWVuCi0JdGhlIG9wZW4gcGFyZW50aGVzaXMgYW5kIHRoZSBzdGFydCBvZiB0aGUgcmVnaXN0ZXIgb3BlcmFuZCwKLQliZWNhdXNlIG9mIHRoZSBKdW5lIDE2IGNoYW5nZS4KLQotU3VuIEp1biAyMSAyMToyNzowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9hcHBseV9maXgpOiBIYW5kbGUgd2VhayBzeW1ib2xzIGNvcnJlY3RseSBpZgotCUJGRF9BU1NFTUJMRVIuCi0KLVN1biBKdW4gMjEgMTI6MjY6MzYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZDMwdl9hbGlnbik6IEFsd2F5cyBwZXJmb3JtIGFsaWdubWVudCByZXF1ZXN0LAotCWV2ZW4gaWYgaXQgaXMgYmVsaXZlZCB0byBiZSB1bm5lY2Vzc2FyeS4KLQotRnJpIEp1biAxOSAxMzo1NzowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogTmV2ZXIgYWRqdXN0IHJlbG9jcyBhZ2FpbnN0IHdlYWsKLQlzeW1ib2xzLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXBwbHlfZml4KTogQWRqdXN0IGFjY29yZGluZ2x5LgotCi1GcmkgSnVuIDE5IDA5OjUwOjE3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IERvIG5vdCBoYXJkY29kZSB0aGUKLQlzaGlmdCBhbW91bnQgZm9yIGEgcmVwZWF0ZWQgb3BlcmFuZC4gIFRoZSBzaGlmdCBhbW91bnQgZm9yIHRoZQotCXJlcGVhdGVkIGNvcHkgY29tZXMgZnJvbSB0aGUgc2l6ZSBvZiB0aGUgb3BlcmFuZC4KLQotRnJpIEp1biAxOSAwMDo0NDoxOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChnZXRfb3BlcmFuZCk6IEZpeCB0eXBvcyBpbiBsZG0vc3RtIHN1cHBvcnQuCi0KLVdlZCBKdW4gMTcgMTM6MDc6MDUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9zaG93X3VzYWdlKTogRml4IC1taXBzTiB1c2FnZS4KLQotVHVlIEp1biAxNiAxMzowNjoyMSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IElmIHRjX3N5bWJvbF9jaGFycyBpcyBkZWZpbmVkLCB0cmVhdCBhbGwKLQljaGFyYWN0ZXJzIGluIGl0IGFzIExFWF9JU19TWU1CT0xfQ09NUE9ORU5ULgotCSogY29uZmlnL3RjLWkzODYuaCAodGNfc3ltYm9sX2NoYXJzKTogRGVmaW5lLgotCShleHRyYV9zeW1ib2xfY2hhcnMpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLWkzODYuYyAoZXh0cmFfc3ltYm9sX2NoYXJzKTogRGVmaW5lLgotCShjb21tZW50X2NoYXJzKTogRG9uJ3QgdXNlICcvJyBhcyBjb21tZW50IHN0YXJ0IGlmIFRFX0xJTlVYLgotCShsaW5lX2NvbW1lbnRfY2hhcnMpOiBTZXQgdG8gJy8nIGlmIFRFX0xJTlVYLgotCSogZG9jL2MtaTM4Ni50ZXhpIChpMzg2LXByZWZpeGVzKTogVXBkYXRlLgotCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IERvY3VtZW50IHRjX3N5bWJvbF9jaGFycy4KLQotRnJpIEp1biAxMiAxMzozNjo1NCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKGFsbC15ZXMpOiBJZiBtYWludGFpbmVyIG1vZGUsIGRlcGVuZCBvbiAucG90IGZpbGUuCi0JKCQoUEFDS0FHRSkucG90KTogVW5jb25kaXRpb25hbGx5IGRlcGVuZCBvbiBQT1RGSUxFUy4KLQotMTk5OC0wNi0xMiAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBDaGVja2luZyBkaXNwbGFjZW1lbnQKLQljb25zdHJhaW50IGluIGluc3RydWN0aW9ucyBSRVAgJiBSRVBJLgotCi1UaHUgSnVuIDExIDA4OjU2OjQ2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBDYXRjaCBCRkRfUkVMT0NfOCwKLQlCRkRfUkVMT0NfMTYsIEJGRF9SRUxPQ182NCBhbmQgaXNzdWUgYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZXMuICAKLQotCShjaGVja19yYW5nZSk6IElmIHRoZSBvcGVyYW5kIGlzIHNoaWZ0ZWQsIHRoZW4gc2hpZnQgdGhlIG51bWJlcgotCWJlZm9yZSBjaGVja2luZyBpdHMgcmFuZ2UuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogQWRkIG1vcmUgY2hlY2tzIGZvciBOVUxMIHBvaW50ZXJzLiAKLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9jb21tKTogU2V0IFNFQ19DT01NT04gYml0IG9uIHNwZWNpYWwKLQljb21tb24gc2VjdGlvbnMuCi0KLVdlZCBKdW4gMTAgMTc6MjY6MzUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9jb21tKTogQ3JlYXRlIHNwZWNpYWwgc2VjdGlvbnMgYXMgbmVlZGVkLgotCi0xOTk4LTA2LTEwICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAod3JpdGVfMl9zaG9ydCk6IEFkZGl0aW9uIG9mIHN3YXBwaW5nCi0JaW5zdHJ1Y3Rpb25zIGZvciBzZXF1ZW50aWFsIGFuZCByZXZlcnNlIHNlcXVlbnRpYWwgb3JkZXIgd2hlbgotCWdpdmVuIG9yZGVyIGlzIG5vdCBwb3NzaWJsZS4KLQotVHVlIEp1biAgOSAxMzo1Mjo1MyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKERFUF9JTkNMVURFUyk6IEZpeCByZWZlcmVuY2UgdG8gaW50bCBidWlsZCBkaXJlY3RvcnkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEp1biAgOSAxMjoyMDowNSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGRvYy9jLWkzODYudGV4aTogVXBkYXRlIDE2IGJpdCBkb2N1bWVudGF0aW9uLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oOiBDaGFuZ2UgRGF0YTE2IHRvIFNpemUxNiwgRGF0YTMyIHRvIFNpemUzMiwKLQlJZ25vcmVEYXRhU2l6ZSB0byBJZ25vcmVTaXplIGFzIHRoZXkgYXJlIHVzZWQgZm9yIGFkZHJlc3Mgc2l6ZSBhcwotCXdlbGwgYXMgZGF0YSBzaXplLgotCSogY29uZmlnL3RjLWkzODYuYzogTGlrZXdpc2UuICBBZGQgY29kZSB0byByZWplY3QgYWRkcjMyL2RhdGEzMiBpbgotCTMyLWJpdCBtb2RlLCBzaW1pbGFybHkgYWRkcjE2L2RhdGExNiBhbmQgdmFyaWFudHMuCi0KLU1vbiBKdW4gIDggMTg6MzI6MDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXNzZW1ibGUpOiBGaXggaGFuZGxpbmcgb2YgcmV2ZXJzZQotCXNlcXVlbnRpYWwgd29yZCBtdWx0aXBseSBpbnN0cnVjdGlvbnMuCi0JCi0JKGRvX2Fzc2VtYmxlKTogQWRkIGV4dHJhIGNvbW1hbmQgbGluZSBhcmd1bWVudCwgdG8gYWxsb3cgbXVsMzIKLQlhdHRyaWJ1dGUgdG8gYmUgcHJlc2VydmVkIGFjcm9zcyBwYXJhbGxlbCBpbnNucy4KLQkobWRfYXNzZW1ibGUpOiBJbnNlcnQgTk9QcyBiZXR3ZWVuIGV4cGxpY2l0bHkgcGFyYWxsZWwgaW5zbnMgd2hpY2gKLQljb250YWluIGFuIDMyIGJpdCBtdWx0aXBseSBhbmQgYSAxNiBtdWx0aXBseS4KLQotTW9uIEp1biAgOCAxMjoyMDozMCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IFJFUE5FIHJlbmFtZWQgdG8gUkVQTkVfUFJFRklYX09QQ09ERSwgYW5kCi0JbGlrZXdpc2UgZm9yIFJFUEUuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHJlbG9jKTogQWRkIGJyYWNlcy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoc3RydWN0IF9pMzg2X2luc24pOiBSZW5hbWUgYmkgdG8gc2liIHRvIGJlCi0JY29uc2lzdGVudCB3aXRoIEludGVsIG5hbWluZy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKGJhc2VfaW5kZXhfYnl0ZSk6IFJlbmFtZSB0byBzaWJfYnl0ZS4gIERvbid0Ci0JdXNlIGJpdGZpZWxkcyBpbiBzaWJfYnl0ZS4KLQkobW9kcm1fYnl0ZSk6IERvbid0IHVzZSBiaXRmaWVsZHMgaGVyZSBlaXRoZXIuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGN1cnJlbnRfdGVtcGxhdGVzKTogQWRkIGNvbnN0LgotCShwYXJzZV9yZWdpc3Rlcik6IEFkZCBjb25zdCB0byByZXR1cm4sIHBhcmFtLCBhbmQgY2hhciAqcy4KLQkoaTM4Nl9vcGVyYW5kKTogQWRkIGNvbnN0IHRvIHJlZ19lbnRyeSAqci4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKHRlbXBsYXRlcyk6IEFkZCBjb25zdCB0byBzdGFydCwgZW5kLgotCi0JSW5zcGlyZWQgYnkgY29kZSBmb3IgMTYgYml0IGdhcyBzdXBwb3J0IGZyb20gTWFydHluYXMgS3VuaWdlbGlzCi0JPG1hcnR5bmFzQG5tMy5rdHUubHQ+OgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBBZGQgZnVsbCBzdXBwb3J0IGZvciAxNiBiaXQKLQltb2RybSwgYW5kIEp1bXAsIEp1bXBCeXRlLCBKdW1wRHdvcmQsIEp1bXBJbnRlclNlZ21lbnQgaW5zbnMuCi0JKHVzZXNfbWVtX2FkZHJtb2RlKTogUmVtb3ZlLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IEFkZCBzdXBwb3J0IGhlcmUgdG9vLgotCShtZF9yZWxheF90YWJsZSk6IFJld3JpdGUgaW50ZXJmYWNlIHRvIG1kX3JlbGF4IGZvciAxNiBiaXQKLQlzdXBwb3J0LgotCShCWVRFLCBXT1JELCBEV09SRCwgVU5LTk9XTl9TSVpFKTogUmVtb3ZlLgotCShvcGNvZGVfc3VmZml4X3RvX3R5cGUpOiBSZW1vdmUuCi0JKENPREUxNiwgU01BTEwsIFNNQUxMMTYsIEJJRywgQklHMTYpOiBEZWZpbmUuCi0JKFNJWkVfRlJPTV9SRUxBWF9TVEFURSk6IE1vZGlmeSB0byBzdWl0IGFib3ZlLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkoaTM4Nl9vcGVyYW5kKTogQWRkIHN1cHBvcnQgZm9yIDE2IGJpdCBiYXNlL2luZGV4IHJlZ3MsCi0JaW1tZWRpYXRlcywgYW5kIGRpc3BsYWNlbWVudHMuICBSZW1vdmUgc29tZSB1bm5lY2Vzc2FyeSBjYXN0cywgYW5kCi0JbG9jYWxpc2UgZW5kX29mX29wZXJhbmRfc3RyaW5nLCBkaXNwbGFjZW1lbnRfc3RyaW5nX3N0YXJ0LAotCWRpc3BsYWNlbWVudF9zdHJpbmdfZW5kIHZhcmlhYmxlcy4gIEFkZCBHQ0NfQVNNX09fSEFDSy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKE5PX0JBU0VfUkVHSVNURVJfMTYpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHByZWZpeF9oYXNoKTogUmVtb3ZlLgotCShtZF9iZWdpbik6IFJld3JpdGUgd2l0aG91dCBvYnN0YWNrcy4gIFJlbW92ZSBwcmVmaXggaGFzaCB0YWJsZQotCWhhbmRsaW5nLiAgUmV3cml0ZSBsZXhpY2FsIHRhYmxlIGhhbmRsaW5nLgotCShpMzg2X3ByaW50X3N0YXRpc3RpY3MpOiBEb24ndCBwcmludCBwcmVmaXggc3RhdGlzdGljcy4KLQkobWRfYXNzZW1ibGUpOiBSZXdyaXRlIGluc3RydWN0aW9uIHBhcnNlciBzbyB0aGF0IGxpbmUgaXMgbm90Ci0JY29udmVydGVkIHRvIGxvd2VyIGNhc2UuICBEb24ndCBkbyBhIGhhc2hfZmluZCBmb3IgcHJlZml4ZXMsCi0JaW5zdGVhZCByZWNvZ25pc2UgdGhlbSB2aWEgb3Bjb2RlIG1vZGlmaWVyLgotCShleHBlY3Rpbmdfb3BlcmFuZCwgcGFyZW5fbm90X2JhbGFuY2VkKTogTG9jYWxpc2UgdmFyaWFibGVzLgotCSogY29uZmlnL3RjLWkzODYuaCAoSXNQcmVmaXgpOiBEZWZpbmUuCi0JKHByZWZpeF9lbnRyeSk6IFJlbW92ZS4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoUFJFRklYX1NFUEVSQVRPUik6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKFBSRUZJWF9TRVBBUkFUT1IpOiBEZWZpbmUgaGVyZSBpbnN0ZWFkLCB1c2luZwotCSdcXCcgaW4gY2FzZSB3aGVyZSBjb21tZW50X2NoYXJzIGNvbnRhaW5zICcvJy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoTUFUQ0gpOiBFbnN1cmUgZ2l2ZW4gb3BlcmFuZCBhbmQgdGVtcGxhdGUKLQltYXRjaCBmb3IgSnVtcEFic29sdXRlLiAgTWFrZXMgZS5nLiBgbGptcCB0YWJsZSglZWJ4KScgaW52YWxpZDsKLQl5b3UgbXVzdCB3cml0ZSBgbGptcCAqdGFibGUoJWVieCknLgotCi0JRnJvbSBILkouIEx1IDxoamxAZ251Lm9yZz46Ci0JKiBjb25maWcvdGMtaTM4Ni5jIChCRkRfUkVMT0NfMTYsIEJGRF9SRUxPQ18xNl9QQ1JFTCk6IERlZmluZQotCWFzIDAgaWZuZGVmIEJGRF9BU1NFTUJMRVIuCi0JKG1kX2Fzc2VtYmxlKTogQWxsb3cgaW1tZWRpYXRlIG9wZXJhbmRzIHdpdGhvdXQgc3VmZml4IG9yCi0Jb3RoZXIgcmVnIG9wZXJhbmQgdG8gZGVmYXVsdCBpbiBzaXplIHRvIHRoZSBjdXJyZW50IGNvZGUgc2l6ZS4KLQotTW9uIEp1biAgOCAwOTo0NTowMCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb25maWcvdGMtdjg1MC5jIChtZF9iZWdpbik6ICBSZXN0b3JlIGNyZWF0aW9uIG9mCi0gICAgICAgIC5jYWxsX3RhYmxlX3RleHQgYW5kIC5jYWxsX3RhYmxlX2RhdGEgc2VjdGlvbnMuCi0KLVNhdCBKdW4gIDYgMDA6MDI6NDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXNzZW1ibGUpOiBTZXQgZXhlY3V0aW9uIHR5cGUgdG8gdW5rbm93bgotCWFmdGVyIGVtaXR0aW5nIGEgd29yZCBvZiBub29wcy4KLQotRnJpIEp1biAgNSAyMzoyNzowNCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1vZGVfZnJvbV9kaXNwX3NpemUpOiBEaXNwMTYgaXMgbW9kZSAyLgotCShpMzg2X29wZXJhbmQpOiBTaW1wbGlmeSBjaGVja3MgZm9yIHZhbGlkIGJhc2UvaW5kZXggY29tYmluYXRpb25zLgotCURpc2FsbG93IGBpbiA0KCVkeCksJWFsJy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoc3RydWN0IF9pMzg2X2luc24pOiBNYWtlIHJlZ3MsIGJhc2VfcmVnLCBhbmQKLQlpbmRleF9yZWcgY29uc3QuCi0JKGFkZF9wcmVmaXgpOiBDaGFuZ2UgcGFyYW1ldGVyIGZyb20gY2hhciB0byBpbnQuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFVnaCk6IERlZmluZSBvcGNvZGUgbW9kaWZpZXIuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IFByaW50IHdhcm5pbmdzIGZvciBVZ2ggaW5zbnMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogUmV3cml0ZSBNQVRDSCBhbmQKLQlDT05TSVNURU5UX1JFR0lTVEVSX01BVENIIG1hY3JvcyB0byBjaGVjayByZWdpc3RlciB0eXBlcyBtb3JlCi0JdGhvcm91Z2hseS4gIENoZWNrIGZvciBpbGxlZ2FsIHN1ZmZpeC9vcGVyYW5kIGNvbWJpbmF0aW9ucwotCXdoZW4gbWF0Y2hpbmcgaW5zbnMgd2l0aCBvcGVyYW5kcy4gIEhhbmRsZSBuZXcgYHMnIHN1ZmZpeCwgYW5kCi0JYXNzb2NpYXRlZCBGbG9hdE1GIG9wY29kZSBtb2RpZmllciBmb3IgZmxvYXQgaW5zbnMgd2l0aCBtZW1vcnkKLQlvcGVyYW5kcy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKEZsb2F0TUYpOiBEZWZpbmUgbmV3IG9wY29kZSBtb2RpZmllci4KLQkoTm9fc1N1ZiwgTm9fYlN1ZiwgTm9fd1N1ZiwgTm9fbFN1Zik6IExpa2V3aXNlLgotCShTSE9SVF9PUENPREVfU1VGRklYLCBMT05HX09QQ09ERV9TVUZGSVgpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBSZW5hbWUgV09SRF9QUkVGSVhfT1BDT0RFIHRvCi0JREFUQV9QUkVGSVhfT1BDT0RFIHRocm91Z2hvdXQuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKFJFR0lTVEVSX1dBUk5JTkdTKTogRGVmaW5lLgotCShtZF9hc3NlbWJsZSk6IFJld3JpdGUgc3VmZml4L3JlZ2lzdGVyIG9wZXJhbmQgY2hlY2tpbmcgY29kZSB0byBiZQotCW1vcmUgdGhvcm91Z2guICBSZW1vdmUgQWJzOCwxNiwzMi4gIENoYW5nZSBvY2N1cnJlbmNlcyBvZiBNZW0gdG8KLQlBbnlNZW0sIHRoZSBiZXR0ZXIgdG8gZ3JlcC4KLQkocGkpOiBSZW1vdmUgQWJzLgotCShpMzg2X29wZXJhbmQpOiBEb24ndCBzZXQgTWVtIGJpdHMgaW4gaS50eXBlc1t0aGlzX29wZXJhbmRdIHdoZW4KLQlnaXZlbiBhIG1lbW9yeSBvcGVyYW5kLiAgRG9uJ3Qgc2V0IEFicyBiaXRzIGVpdGhlci4KLQkodHlwZV9uYW1lcyk6IFJlbW92ZSBNZW0qLCBBYnMqLgotCSogY29uZmlnL3RjLWkzODYuaCAoTWVtOCwgTWVtMTYsIE1lbTMyLCBBYnM4LCBBYnMxNiwgQWJzMzIpOiBEb24ndAotCWRlZmluZSBvcGNvZGVfbW9kaWZpZXJzIGFzIHRoZXNlIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IERpc3A4LAotCURpc3AxNiwgRGlzcDMyIGFuZCBzdWZmaXggY2hlY2tzLgotCShDT01FU19JTl9CT1RIX0RJUkVDVElPTlMpOiBSZW1vdmUuCi0JKEZsb2F0Uik6IERlZmluZS4gSXQncyBPSyB0byBzaGFyZSB0aGUgYml0IHdpdGggUmV2ZXJzZVJlZ1JlZ21lbS4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBEb24ndCBlbWl0IG9wZXJhbmQgc2l6ZSBwcmVmaXgKLQlpZiBJZ25vcmVEYXRhU2l6ZSBtb2RpZmllciBnaXZlbi4gIFJlbW92ZSBTaG9ydGZvcm1XIG1vZGlmaWVyCi0JdGVzdC4gIEFkZCB0ZXN0IGZvciBTaG9ydEZvcm0gaW4gVyBiYXNlX29wY29kZSBtb2RpZmljYXRpb24uCi0JTWVyZ2UgU2VnMlNob3J0Rm9ybSBhbmQgU2VnM1Nob3J0Rm9ybSBjb2RlLgotCSogY29uZmlnL3RjLWkzODYuaCAoU2hvcnRGb3JtVyk6IFJlbW92ZS4KLQkoSWdub3JlRGF0YVNpemUpOiBEZWZpbmUuCi0KLUZyaSBKdW4gIDUgMTA6NTA6NTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXNzZW1ibGUpOiBTdG9yZSBwcmV2aW91cyBzZWdtZW50IHN0YXRlCi0Jd2l0aCBwcmV2aW91cyBpbnN0cnVjdGlvbi4KLQotV2VkIEp1bgkgMyAxODoyMTo1NiAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKFNDQUxFMV9XSEVOX05PX0lOREVYKTogRGVmaW5lLgotCShlYnAsIGVzcCk6IFJlbW92ZSBzdGF0aWMgdmFyaWFibGVzLgotCShNQVRDSCk6IFJlbW92ZSB0ZXN0IGZvciBJbk91dFBvcnRSZWcuCi0JKGkzODZfb3BlcmFuZCk6IFByb3Blcmx5IGhhbmRsZSBJbk91dFBvcnRSZWcgaGVyZSBpbnN0ZWFkLgotCURpc2FsbG93cyBgaW5iICglZHgsMiknLCBgaW5iICVlczooJWR4KScgYW5kIGBtb3YgKCVkeCksJWF4JwotCShtZF9hc3NlbWJsZSk6IFNpbXBsaWZ5IGFuZCBjb3JyZWN0IG1vZHJtIGFuZCBzaWIgZ2VuZXJhdGlvbi4KLQkoaTM4Nl9vcGVyYW5kKTogQWRkIHdhcm5pbmcgZm9yIHNjYWxlIHdpdGhvdXQgaW5kZXguCi0JUmV3cml0ZSBjaGVja3MgZm9yIHZhbGlkIGJhc2UvaW5kZXggY29tYmluYXRpb25zLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChFTkRfU1RSSU5HX0FORF9TQVZFKTogUHJvdGVjdCBhcmd1bWVudHMgb2YKLQltYWNyb3MgYW5kIGVuY2xvc2UgaW4gZG8gd2hpbGUoMCkuCi0JKFJFU1RPUkVfRU5EX1NUUklORyk6IExpa2V3aXNlLgotCShtZF9hc3NlbWJsZSk6IEFkZCBvbmUgdG8gcHJpbnRlZCBvcGVyYW5kIG51bWJlciBzbyB3ZSBzdGFydAotCWZyb20gMSBub3QgMC4gIEFkZCBzb21lIG1vcmUgZ2V0dGV4dCBpbnZvY2F0aW9ucy4KLQkoaTM4Nl9vcGVyYW5kKTogRml4IGAlJXMnIC0+IGAlJSVzJy4gSW5jIHByaW50ZWQgb3BlcmFuZAotCW51bWJlciBoZXJlIHRvby4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoV0FJVF9QUkVGSVgsIExPQ0tSRVBfUFJFRklYLCBBRERSX1BSRUZJWCwKLQlEQVRBX1BSRUZJWCwgU0VHX1BSRUZJWCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHN0cnVjdCBfaTM4Nl9pbnNuKTogUmVtb3ZlIHdhaXRfcHJlZml4IGZpZWxkLgotCShjaGVja19wcmVmaXgpOiBSZW1vdmUgZnVuY3Rpb24uCi0JKGFkZF9wcmVmaXgpOiBOZXcgZnVuY3Rpb24uICBBZGQgcHJlZml4IHRvIGkucHJlZml4IGFzIHdlbGwgYXMKLQlkb2luZyBjaGVja3MuCi0JKG1kX2Fzc2VtYmxlKTogQ2hhbmdlcyBmb3IgYWRkX3ByZWZpeC4JUmVtb3ZlIGhhY2sgZm9yIHdhaXQKLQlwcmVmaXgsIGluc3RlYWQgYWx3YXlzIG91dHB1dCBwcmVmaXhlcyBpbiBmaXhlZCBvcmRlci4JVGVzdAotCWZvciBqY3h6L2xvb3Agd2hlbiBzZWxlY3RpbmcgYmV0d2VlbiB3b3JkICYgZHdvcmQgb3BlcmF0aW9ucywKLQlhbmQgYWRkIGFkZHJlc3Mgc2l6ZSBwcmVmaXggcmF0aGVyIHRoYW4gb3BlcmFuZCBzaXplIHByZWZpeC4KLQlSZW1vdmUgb3BlcmFuZCAtPiBhZGRyZXNzIHNpemUgaGFjayB3aGVuIGVtaXR0aW5nIGpjeHovbG9vcC4KLQkoaTM4Nl9vcGVyYW5kKTogUmVtb3ZlIE9fQWJzZW50IGNoZWNrIGFzIGl0J3MgZG9uZSBpbiBleHByLgotCi1XZWQgSnVuICAzIDE1OjA5OjEwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgbTUyMDAgYXMgYSBjcHVfdHlwZSBvZiBtNjhrLgotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGN1cnJlbnQgbGlidG9vbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEp1biAgMyAxNDoxMTo1OSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBBZGQgbW9yZSBjYWxscwotCXRvIHJlbGF4YWJsZV9zeW1ib2wgdG8gcHJldmVudCByZWZlcmVuY2VzIHRvIGV4dGVybmFsIHN5bWJvbCBmcm9tCi0JYmVpbmcgcmVsYXhlZC4KLQotV2VkIEp1biAgMyAxNDoxMDozNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHJlbGF4YWJsZV9zeW1ib2wpOiBJZiBUQVJHRVRfT1MgaXMgImVsZiIsIGFsbAotCXN5bWJvbHMgYXJlIHJlbGF4YWJsZS4KLQotV2VkIEp1biAgMyAwOToxNjowMCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb25maWcvdGMtdjg1MC5jIChtZF9iZWdpbik6ICBEb24ndCBjcmVhdGUgc3BlY2lhbAotICAgICAgICBzZWN0aW9ucyBieSBkZWZhdWx0LgotIAotVHVlIEp1biAgMiAxNDo1Mjo1NiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogRm9yIGRpdiBhbmQgdWRpdiwgY2xvc2UgdGhlCi0JcmVvcmRlciBibG9jayBhcyBzb29uIGFzIHBvc3NpYmxlLgotCi1UdWUgSnVuICAyIDE1OjM2OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gTWF0dCBTZW1lcnNreSA8bWF0dHNAc2NkLmhwLmNvbT46Ci0JKiBtYWNyby5jIChtYWNyb19tcmlfbW9kZSk6IE5ldyBmdW5jdGlvbi4KLQkqIG1hY3JvLmggKG1hY3JvX21yaV9tb2RlKTogRGVjbGFyZS4KLQkqIHJlYWQuYyAoc19tcmkpOiBDYWxsIG1hY3JvX21yaV9tb2RlIHdoZW4gc3dpdGNoaW5nIGluIGFuZCBvdXQgb2YKLQlNUkkgbW9kZS4KLQotVHVlIEp1biAgMiAxMzozMjoyMiAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfY29tbSk6IEFsbG93IGFsaWdubWVudCBwYXJhbWV0ZXIgaW4KLQlPQkpfRVZBWCBjYXNlLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoc19hbHBoYV9jb21tKTogRGVmZXIgcmVzdG9yaW5nIGNoYXJhY3RlcgotCXVudGlsIGFmdGVyIHhzdHJkdXAgaW4gT0JKX0VWQVggY2FzZS4KLQotVHVlIEp1biAgMiAxMzoxMToxMyAxOTk4ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL3RjLXZheC5jIChtZF9jcmVhdGVfc2hvcnRfanVtcCk6IEZpeCBvZmYgYnkgdHdvIGJ1ZyBpbgotCW9mZnNldCBjYWxjdWxhdGlvbi4gIEFsc28sIHVzZSBWQVhfQlJXIGZyb20gdmF4LWluc3QuaCBpbnN0ZWFkCi0Jb2YgaGFyZGNvZGVkIG1hZ2ljIG51bWJlci4KLQkobWRfY3JlYXRlX2xvbmdfanVtcCk6IFVzZSBWQVhfSk1QIGFuZCBWQVhfQUJTT0xVVEVfTU9ERSBtYWNyb3MuCi0KLVR1ZSBKdW4gIDIgMDk6MjU6MzQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChkb19zX2Z1bmMpOiBOZXcgZnVuY3Rpb24uCi0JKHNfZnVuYyk6IENhbGwgaXQuCi0JKiByZWFkLmggKGRvX3NfZnVuYyk6IEFkZCBwcm90b3R5cGUuCi0KLU1vbiBKdW4gIDEgMTI6NDc6MzAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAobTMycl9kb19hbGlnbik6IE9ubHkgZmlsbCBjb2RlIHNlY3Rpb25zIHdpdGgKLQlub3BzIGlmIGZpbGwgcGF0dGVybiBub3Qgc3BlY2lmaWVkLgotCi1Nb24gSnVuICAxIDE0OjA4OjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gQW5kcmV3IENyYWJ0cmVlIDxhbmRyZXdjQHR5cGhvb24ucm9zZS5ocC5jb20+OgotCSogY29uZmlnL3RlLWdvMzIuaCAoVEVfR08zMik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKExPQ0FMX0xBQkVMKTogRG9uJ3QgZGVmaW5lIGlmIFRFX0dPMzIuCi0KLVN1biBNYXkgMzEgMTU6NDM6MDYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCUltcGxlbWVudCAuZnVuYy8uZW5kZnVuYyBwc2V1ZG8tb3BzLgotCSogcmVhZC5oIChzdGFic19nZW5lcmF0ZV9hc21fZnVuYyxzdGFic19nZW5lcmF0ZV9hc21fZW5kZnVuYyk6IERlY2xhcmUuCi0JKHNfZnVuYyk6IERlY2xhcmUuCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgLmZ1bmMsLmVuZGZ1bmMuCi0JKHNfZnVuYyk6IE5ldyBmdW5jdGlvbi4KLQkqIHN0YWJzLmMgKHN0YWJzX2dlbmVyYXRlX2FzbV9mdW5jLHN0YWJzX2dlbmVyYXRlX2FzbV9lbmRmdW5jKTogTmV3Ci0JZnVuY3Rpb25zLgotCShpbl9kb2NfZnVuY19wLGN1cnJlbnRfZnVuY3Rpb25fbGFiZWwpOiBOZXcgc3RhdGljIGdsb2JhbHMuCi0JKHN0YWJzX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBFbWl0IGZ1bmN0aW9uIHJlbGF0aXZlIHN0YWJzIGlmIGluIC5mdW5jLgotCi1GcmkgTWF5IDI5IDE4OjEzOjEyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWEyOWsuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWFybS5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWg4MzAwLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaDg1MDAuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTg2MC5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWk5NjAuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy10aWMzMC5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLXc2NS5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLXo4ay5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWEyOWsuYzogRG9uJ3QgZGVmaW5lIG1kX3Nob3J0X2p1bXBfc2l6ZSwKLSAJbWRfbG9uZ19qdW1wX3NpemUsIG1kX2NyZWF0ZV9zaG9ydF9qdW1wIG9yIG1kX2NyZWF0ZV9sb25nX2p1bXAuCi0JKiBjb25maWcvdGMtYWxwaGEuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtYWxwaGEuaDogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtYXJtLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWg4MzAwLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWg4NTAwLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWhwcGEuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTg2MC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXBwYy5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zaC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy10aWMzMC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy13NjUuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtejhrLmM6IExpa2V3aXNlLgotCi1GcmkgTWF5IDI5IDE2OjAzOjI2IDE5OTggIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvdGMtdmF4LmMgKF8pOiBEZWxldGUgdGhpcyBtYWNybyB1c2VkIGZvciBwbGFjZWhvbGRlcgotCXZhbHVlcyBpbiB2YXhfb3BlcmFuZF93aWR0aF9zaXplOyBpdCBjb25mbGljdHMgd2l0aCB0aGUgXygpIG1hY3JvCi0JdXNlZCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCi0KLUZyaSBNYXkgMjkgMTM6NDY6MDcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9maW5kX2Jhc2UpOiBGaXggY2FzZSBpbnNlbnNpdGl2ZSBzeW1ib2wgbmFtZQotCWNvZGUuICBGcm9tIENocmlzIE1vbGxlciA8bW9sbGVyQGJvcHMuY29tPi4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gS2xhdXMgS2FlbXBmIDxra2FlbXBmQHByb2dpcy5kZT46Ci0JKiBzdHJ1Yy1zeW1ib2wuaCAoc3RydWN0IGJyb2tlbl93b3JkKTogQWRkIHNlZyBhbmQgc3Vic2VnIGZpZWxkcy4KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogSW5pdGlhbGl6ZSBzZWcgYW5kIHN1YnNlZyBmaWVsZHMgb2YgYSBuZXcKLQlicm9rZW4gd29yZC4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogU3dpdGNoIHRvIHRoZSBhcHByb3ByaWF0ZSBzZWdtZW50Ci0JYW5kIHN1YnNlZ21lbnQgd2hlbiBwcm9jZXNzaW5nIGEgYnJva2VuIHdvcmQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1yaV9hc3NlbWJsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQpOiBDYWxsIG1yaV9hc3NlbWJsZSByYXRoZXIgdGhhbgotCW1kX2Fzc2VtYmxlLgotCShzX21yaV9lbHNlLCBzX21yaV9icmVhaywgc19tcmlfbmV4dCwgc19tcmlfZm9yKTogTGlrZXdpc2UuCi0JKHNfbXJpX2VuZGYsIHNfbXJpX2VuZHcpOiBMaWtld2lzZS4KLQotV2VkIE1heSAyNyAxMToxNjoyNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19vcmcpOiBDYWxsIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IGlmIGl0IGlzIGRlZmluZWQuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zaG93X3VzYWdlKTogQWRkIFxuXCB0byBuZXcgc3RyaW5nLgotCi1UdWUgTWF5IDI2IDE5OjI3OjUyIDE5OTggIFN0YW4gQ294ICA8c2NveEBlcXVpbm94LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChPUFRJT05fTElUVExFX0VORElBTl9EQVRBKTogTmV3LgotCShtZF9wYXJzZV9vcHRpb24pOiBBZGQgZm9yIHNhbWUuCi0JKHNwYXJjX21kX2VuZCk6IFNldCBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUuCi0JKG1kX2FwcGx5X2ZpeDMsIHRjX2dlbl9yZWxvYyk6IEFsbG93IEJGRF9SRUxPQ19TUEFSQ18zMkxFLgotCShjb25zX2ZpeF9uZXdfc3BhcmMpOiBBZGRlZCB0byBjcmVhdGUgQkZEX1JFTE9DX1NQQVJDXzMyTEUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChjb25zX2ZpeF9uZXdfc3BhcmMpOiBBZGRlZC4KLQkKLVRodSBNYXkgMjEgMTU6MDI6NDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChmaW5kX3JlYWxfc3RhcnQpOiBSZWxheCBkZWZpbml0aW9uIG9mIGxvY2FsCi0JbGFiZWxzLgotCi1UdWUgTWF5IDE5IDE2OjU5OjQ0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGQzMHZfYWxpZ24pOiBBcHBseSBhZGRyZXNzIGFkanVzdG1lbnQgdG8gYWxsCi0Jc3ltYm9scyBhdCB0aGUgZ2l2ZW4gYWRkcmVzcywgbm90IGp1c3QgdGhlIGxhc3Qgb25lIHNwZWNpZmllZC4KLQotVHVlIE1heSAxOSAwODoyNToxOSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2hhbmRsZV9hbGlnbik6IFVzZSBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuCi0gICAgICAgIG9yIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gdG8gd3JpdGUgZGF0YS4KLQotTW9uIE1heSAxOCAxNzowOTozMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IFJlbW92ZSBhcnRpZmljaWFsbHkgY3JlYXRlZAotCXJlZ2lzdGVyIG5hbWUgc3ltYm9scy4KLQotTW9uIE1heSAxOCAxMzo0NzowNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogQ2hhbmdlICJzZWdtZW50IiB0byAic2VjdGlvbiIgaW4KLQllcnJvciBtZXNzYWdlLgotCi1Nb24gTWF5IDE4IDE2OjU1OjQwIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogQ2hhbmdlIHN5bTEtc3ltMiBtZXNzYWdlIGFnYWluLgotCi1Nb24gTWF5IDE4IDA5OjMxOjQzIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogSW1wcm92ZSBlcnJvciBtZXNzYWdlIGZvciBzeW0xLXN5bTIKLQllcnJvcnMgd2hlbiBzeW0xIGlzIGluIGEgZGlmZmVyZW50IHNlZ21lbnQgZnJvbSBzeW0yLgotCi1XZWQgTWF5IDEzIDEwOjE2OjM3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKHdhcm5fdW5tYXRjaGVkX2hpZ2gpOiBOZXcgc3RhdGljIGxvY2FsLgotCShPUFRJT05fV0FSTl9QQVJBTExFTCk6IFJlbmFtZSBmcm9tIE9QVElPTl9XQVJOLgotCShPUFRJT05fTk9fV0FSTl9QQVJBTExFTCk6IFJlbmFtZSBmcm9tIE9QVElPTl9OT19XQVJOLgotCShtZF9sb25nb3B0cyk6IFJlY29nbml6ZSAtLXtuby0sfXdhcm4tdW5tYXRjaGVkLWhpZ2guCi0JKG1kX3BhcnNlX29wdGlvbik6IExpa2V3aXNlLgotCShtZF9zaG93X3VzYWdlKTogTGlrZXdpc2UuCi0JKG0zMnJfZnJvYl9maWxlKTogTGlrZXdpc2UuCi0KLQkqIHJlYWQuYyAoZ2VuZXJhdGVfZmlsZV9kZWJ1ZyxnZW5lcmF0ZV9saW5lbm9fZGVidWcpOiBOZXcgZnVuY3Rpb25zLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBDYWxsIHRoZW0uCi0JKiByZWFkLmggKHN0YWJzX2dlbmVyYXRlX2FzbV9maWxlKTogRGVjbGFyZS4KLQkqIHN0YWJzLmMgKHN0YWJzX2dlbmVyYXRlX2FzbV9maWxlKTogTmV3IGZ1bmN0aW9uLgotCShnZW5lcmF0ZV9hc21fZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkoc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IE1vdmUgZmlsZSBuYW1lIGhhbmRsaW5nIGludG8KLQlnZW5lcmF0ZV9hc21fZmlsZS4KLQotVHVlIE1heSAxMiAxMjowMzo0NCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChjdXJfbXVsMzJfcCwgcHJldl9tdWwzMl9wKTogTWFrZSBzdGF0aWMuCi0gICAgICAgIChkMzB2X2N1cnJlbnRfYWxpZ24sIGQzMHZfY3VycmVudF9hbGlnbl9zZWcpOiBOZXcgdmFyaWFibGVzLgotICAgICAgICAoZDMwdl9sYXN0X2xhYmVsKTogTmV3IHZhcmlhYmxlLgotICAgICAgICAoZDMwdl9hbGlnbiwgc19kMzB2X2FsaWduLCBzX2QzMHZfdGV4dCk6IE5ldyBmdW5jdGlvbnMuCi0gICAgICAgIChzX2QzMHZfZGF0YSwgc19kMzB2X3NlY3Rpb24pOiBMaWtld2lzZS4KLSAgICAgICAgKG1kX3BzZXVkb190YWJsZSk6IENhbGwgdGhlbS4KLSAgICAgICAgKG1kX2JlZ2luKTogSW5pdGlhbGl6ZSBkMzB2X2N1cnJlbnRfYWxpZ25fc2VnLgotICAgICAgICAobWRfYXNzZW1ibGUpOiBDYWxsIGQzMHZfYWxpZ24gd2hlbiBuZWVkZWQgYnkga25vd24gY3VycmVudCBhbGlnbm1lbnQuCi0gICAgICAgIChkMzB2X2Zyb2JfbGFiZWwsIGQzMHZfY29uc19hbGlnbik6IE5ldyBmdW5jdGlvbnMuCi0gICAgICAgICogY29uZmlnL3RjLWQzMHYuaCAobWRfZG9fYWxpZ24pOiBSZW1vdmUuCi0gICAgICAgICh0Y19mcm9iX2xhYmVsKTogQ2FsbCBkMzB2X2Zyb2JfbGFiZWwuCi0gICAgICAgIChtZF9jb25zX2FsaWduKTogTmV3LgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChmaW5kX2Zvcm1hdCk6IENvbnZlcnQgY29tcGxleCBleHByZXNzaW9ucyB0byAKLQlleHByZXNzaW9uIHN5bWJvbHMgYmVmb3JlIHByb2Nlc3NpbmcuICBDbGVhbiB1cCBjb2RlIGZvcm1hdHRpbmcuCi0KLVN1biBNYXkgMTAgMjI6MzU6MDIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBwby9NYWtlLWluIChpbnN0YWxsLWluZm8pOiBOZXcgdGFyZ2V0LgotCi1UaHUgTWF5ICA3IDE1OjQ5OjA3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgImJyYSIganVzdCBsaWtlICJqbXAiCi0JaW5zdHJ1Y3Rpb25zLgotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBMaWtld2lzZS4KLQotVGh1IE1heSAgNyAxMTo0NzoyMiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogVXBkYXRlIHdpdGggYG1ha2UgZGVwLWFtJy4KLQkoSEZJTEVTKTogQWRkIGNnZW4uaC4KLQkoY2dlbi5vKTogRGVwZW5kIG9uIGNnZW4uaC4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCi0JKiBjZ2VuLmMgKGNnZW5fbWRfYXBwbHlfZml4Myk6IERvbid0IHBhc3MgbmV3bGluZSB0byBhc193YXJuX3doZXJlLgotCi1UaHUgTWF5ICA3IDEzOjIwOjU2IDE5OTggIEFuZGVycyBCbG9tZGVsbCAgPGFuZGVycy5ibG9tZGVsbEBjb250cm9sLmx0aC5zZT4KLQotCSogZ2FzcC5jIChncmFiX2xhYmVsKTogUGVybWl0IGEgbGFiZWwgdG8gYmUgYSBwcmVwcm9jZXNzb3IKLQl2YXJpYWJsZSBieSBwZXJtaXR0aW5nIGEgbGFiZWwgdG8gc3RhcnQgd2l0aCBhIGJhY2tzbGFzaC4KLQotVGh1IE1heSAgNyAxMjo1MDozMyAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jICh2YWxpZGF0ZV9taXBzX2luc24pOiBSZW1vdmVkIGhhY2sKLQlmb3IgcHJldmlvdXNseSBpbmFjY2Vzc2libGUgYml0ZmllbGRzIGluIHNvbWUgSU5TTl9UUkFQCi0JaW5zdHJ1Y3Rpb25zLgotCi1UaHUgTWF5ICA3IDExOjEzOjAwIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGRvX2Fzc2VtYmxlKTogQWJvcnQgd2l0aCBlcnJvciBtZXNzYWdlCi0JaWYgb3Bjb2RlIG9wZXJhbmRzIGRvIG5vdCBtYXRjaC4KLQkKLVRodSBNYXkgIDcgMDk6MzY6MDYgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQsIHZhbGlkYXRlX21pcHNfaW5zbik6IEltcGxlbWVudAotCSdxJyBvcGVyYW5kIGZvcm1hdCBmb3IgMjAtYml0ICJicmVhayIvInNkYmJwIiBpbnN0cnVjdGlvbnMuCi0JKG1pcHNfaXApOiBUcnVuY2F0ZSBvdmVyZmxvd2VkICJicmVhayIgJ2MnIG9wZXJhbmQuICBJbXBsZW1lbnQKLQlzaW1pbGFyIG5ldyAncScgb3BlcmFuZC4KLQotVGh1IE1heSAgNyAwNzo0NzoxNCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jIChjZ2VuX2FzbV9maW5pc2hfaW5zbik6IEZpeCB0eXBvLgotCi1UaHUgTWF5ICA3IDAyOjE5OjE0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmg6IE5ldyBmaWxlLgotCSogY2dlbi5jOiBJbmNsdWRlIGl0LgotCShNQVhfRklYVVBTKTogUmVuYW1lZCB0byBDR0VOX01BWF9GSVhVUFMuCi0JKGNnZW5fYXNtX2ZpbmlzaF9pbnNuKTogUmVzdWx0IGlzIG5vdyB2b2lkLiAgTmV3IGFyZyBgcmVzdWx0Jy4KLQlBbGwgY2FsbGVycyB1cGRhdGVkLgotCSogY29uZmlnL3RjLW0zMnIuYzogSW5jbHVkZSBjZ2VuLmguCi0JKG0yM3JfaW5zbik6IE5ldyBtZW1iZXJzIG51bV9maXh1cHMsZml4dXBzLgotCi1XZWQgTWF5ICA2IDE2OjI5OjE5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogU2xpZ2h0bHkgcmV3b3JrIHNvbWUgY29kZQotCXRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuCi0KLVdlZCBNYXkgIDYgMTU6MjY6MzQgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogUnVuIGRlYyBjIHdpdGggL25vZGVidWcuICBQYXNzIENDIHZhbHVlIHdoZW4KLQljYWxsaW5nIG1ha2UuCi0KLSAgICAgICAgKiBtYWtlZmlsZS52bXMgKE9CSlMpOiBBZGQgZWhvcHQub2JqCi0KLVdlZCBNYXkgIDYgMTU6MTE6MTIgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGRvYy9jLXZheC50ZXhpOiBDb3JyZWN0IGFuZCBleHRlbmQgdmF4L3ZtcyBkb2N1bWVudGF0aW9uLgotCi1XZWQgTWF5ICA2IDExOjUxOjUxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGRvX2Fzc2VtYmxlKTogQWNjZXB0IGEgbmV3IHBhcmFtZXRlciByZXF1ZXN0aW5nCi0JYSBzaG9ydCBmb3JtYXQgaW5zbi4KLQkobWRfYXNzZW1ibGUpOiBTZXQgaXQgZm9yIGV4cGxpY2l0bHkgcGFja2VkIGluc25zLgotCQotVHVlIE1heSAgNSAxMzoyMzoxMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19zeW1ib2xfbWVyZ2UpOiBEbyBub3QgdGFrZSBhZGRyZXNzIG9mCi0JbmF0aXZlIGZpZWxkcyB3aGVuIHBlcmZvcm1pbmcgdGhlIG1lbWNweS4KLQotVHVlIE1heSAgNSAxMzoxMDo0MSAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8sbWFjcm8yKTogSW1wbGVtZW50IAotCU1fRE1VTE9fSSwgTV9NVUxPX0ksIE1fRE1VTE9VX0ksIGFuZCBNX01VTE9VX0kuCi0KLU1vbiBNYXkgIDQgMTc6NDk6MTQgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IENoYW5nZWQgdG8ga2VlcAotCXJlbG9jYXRpb25zIGFnYWluc3QgZ2xvYmFsbHkgdmlzaWJsZSBzeW1ib2xzLgotCSogY29uZmlnL3RjLW02OGsuYyAocmVsYXhhYmxlX3N5bWJvbCk6IE5ldyBtYWNyby4KLQkobTY4a19pcCwgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBVc2UgaXQuCi0JKHRjX202OGtfZml4X2FkanVzdGFibGUpOiBBbHNvIGhhbmRsZSB3ZWFrIHN5bWJvbHMuCi0KLU1vbiBNYXkgIDQgMTY6MTI6MjMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBLZWVwIHJlbG9jcyBmb3IgYWxsCi0JcmVmZXJlbmNlcyB0byBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scy4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBXaGVuIE9CSl9FTEYsIGRvbid0IGFkZCB0aGUKLSAJdmFsdWVzIGluIHR3aWNlIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jIGlmIHRoZSBzeW1ib2wgaXMKLSAJZXh0ZXJuYWxseSBkZWZpbmVkLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAodGNfZml4X2FkanVzdGFibGUpIFtPQkpfQU9VVF06IFdoZW4gUElDLAotCWRvbid0IGFkanVzdCBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYW4gZXh0ZXJuYWxseSB2aXNpYmxlCi0Jc3ltYm9sLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeDMpOiBXaGVuIGdlbmVyYXRpbmcgYS5vdXQgUElDLAotCWZvciBhIFBDIHJlbGF0aXZlIGZpeHVwIGFnYWluc3QgYW4gZXh0ZXJuYWxseSB2aXNpYmxlIGRlZmluZWQKLQlzeW1ib2wsIGFycmFuZ2UgdG8gc3RvcmUgb2JqZWN0IGZpbGUgYW5kIGFkZGVuZCB2YWx1ZXMgYXMgdGhvdWdoCi0JdGhlIHN5bWJvbCB3ZXJlIG5vdCBkZWZpbmVkLgotCSh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQotVGh1IEFwciAzMCAxMzowOTozOSAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAbmluZW1vb25zLmNvbT4KLQotCSogcmVhZC5jIChzaXplb2ZfbGViMTI4KTogUmVmZXJlbmNlZCBleHRlcm5hbGx5IGJ5IHdyaXRlLmMgc28KLQlkb24ndCBpbmxpbmUuCi0KLVdlZCBBcHIgMjkgMTU6NDU6NTcgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKHssZXhwYW5kX31kZWJ1Z19zeW0pOiBOZXcgZnVuY3Rpb25zIHRvIHJlY29yZAotCWFuZCBleHBhbmQgYSAnZGVidWcnIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggdGhlIG5leHQgaW5zdHJ1Y3Rpb24KLQl0aGF0IGRvZXMgbm90IGNhdXNlIGEgc2hvcnQgaW5zdHJ1Y3Rpb24gdG8gYmUgZmlsbGVkIHdpdGggYSBOT1AuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBzdXBwb3J0IGZvciAuZGVidWdzeW0uCi0JKGFzc2VtYmxlX3BhcmFsbGVsX2luc24pOiBBZGQgY2FsbHMgdG8gZXhwYW5kX2RlYnVnX3N5bSBhcwotCWFwcHJvcHJpYXRlLgotCShtZF9hc3NlbWJsZSk6IERpdHRvLgotCi1UdWUgQXByIDI4IDE5OjE2OjI2IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYXMuYyAobWFpbik6IENvbmRpdGlvbmFsbHkgY2FsbCBzZXRsb2NhbGUuCi0JKiBnYXNwLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGFzaW50bC5oOiBJbmNsdWRlIDxsb2NhbGUuaD4gaWYgSEFWRV9MT0NBTEVfSC4KLQkoTENfTUVTU0FHRVMpOiBOb3cgY2FuIGJlIGRlZmluZWQgZXZlbiB3aGVuIEVOQUJMRV9OTFMuCi0KLVR1ZSBBcHIgMjggMTg6MzM6MjMgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfc2hvd191c2FnZSk6IENvcnJlY3QgZ2V0dGV4dCB0eXBvLgotCQotVHVlIEFwciAyOCAxMjoxNjozMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IENoYW5nZSBhbGwgY2FsbHMgdG8gYnplcm8gdG8gdXNlIG1lbXNldC4KLQkocGFfaXApOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgotCSh0Y19nZW5fcmVsb2MsIG1kX2FwcGx5X2ZpeCk6IExpa2V3aXNlLgotCShwYV9maW5kX3NwYWNlX2J5X251bWJlcik6IExpa2V3aXNlLgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQkocGFfYmxvY2spOiBDaGFuZ2UgaSB0byB1bnNpZ25lZCBpbnQuCi0JKiBjb25maWcvb2JqLXNvbS5oIChvYmpfc29tX2NvcHlyaWdodCk6IERlY2xhcmUuCi0KLVR1ZSBBcHIgMjggMTE6MzU6NTYgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfbGluZW5vKTogRG8gbm90IHVzZSBkdW1teSBmaXJzdF9saW5lbm8KLQlmb3IgbGluZSBudW1iZXJzIGZvciBhc3NlbWJseSBzb3VyY2UuCi0KLU1vbiBBcHIgMjcgMTU6NTg6NDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSB2ZXJzaW9uIG51bWJlciB0byAyLjkuNAotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gQXByIDI3IDEyOjA3OjMzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmMgKGNnZW5fYXNtX2ZpbmlzaF9pbnNuKTogTmV3IGFyZyByZWxheF9wLiAgQWxsIGNhbGxlcnMgdXBkYXRlZC4KLQotTW9uIEFwciAyNyAxNToxNjoxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmg6IENoYW5nZSBzeW1ib2xTIGluIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHRvIHN0cnVjdAotCXN5bWJvbC4KLQotU3VuIEFwciAyNiAxMzo0NDoyMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChwYXJzZV9yZWcpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IEZpeCBpMThuIHR5cG8uCi0KLVNhdCBBcHIgMjUgMjA6MTI6MDIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfZ2V0X2N1cl9wcm9jX3N5bSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVjb2ZmLmg6IFByb3RveXBlIGl0LgotCSogY29uZmlnL3RjLWFscGhhLmMgW0VMRl0gKHNfYWxwaGFfcHJvbG9ndWUpOiBOZXcgZnVuY3Rpb24uCi0JW0VWQVhdIChzX2FscGhhX3Byb2xvZ3VlKTogRGVsZXRlLgotCShtZF9wc2V1ZG9fdGFibGUpOiBVcGRhdGUuCi0KLVNhdCBBcHIgMjUgMTQ6MDA6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChtZF9hc3NlbWJsZSk6IENoYW5nZSBicF9lcnJvcl9tc2cgZnJvbSBzdGF0aWMKLQlhcnJheSB0byBsb2NhbCBwb2ludGVyLgotCShnZXRfYXJncywgcGFyc2VfZXhwcik6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQotRnJpIEFwciAyNCAxMjo0Nzo0MiAxOTk4ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQG1hY3FlbC5iZT4KLQotCSogcmVhZC5jIChzX3NldCk6IENhc3QgeG1hbGxvYyByZXR1cm4gdmFsdWUgdG8gZnJhZ1MgKi4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBGdW5jdGlvbiBtYWRlIHN0YXRpYyB0byBtYXRjaAotCXByZXZpb3VzIGZvcndhcmQgZGVjbGFyYXRpb24uCi0JKGluc2VydF9yZWcsIGluaXRfcmVndGFibGUsIG1kX2NvbnZlcnRfZnJhZ18xKTogTGlrZXdpc2UuCi0KLUZyaSBBcHIgMjQgMDk6MjY6NDYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogQWRkIGludGVybmF0aW9uYWxpc2F0aW9uIG1hY3JvcyB0byBlcnJvcgotCXN0cmluZ3MuICAKLQotCSogY29uZmlnL3RjLW0zMnIuYyAoY2FuX21ha2VfcGFyYWxsZWwpOiBBZGQgaW50ZXJuYXRpb25hbGlzYXRpb24KLQltYWNyb3MgdG8gZXJyb3Igc3RyaW5ncy4KLQotVGh1IEFwciAyMyAxOToyMzoyMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2ZpeF9hZGp1c3RhYmxlKTogQ29ycmVjdCB0ZXN0IG9mIHdoZXRoZXIgYQotCXJlbG9jIGlzIGluIHRoZSBUT0MgY3NlY3QuCi0JKG1kX2FwcGx5X2ZpeDMpOiBDb3JyZWN0IGdldHRleHQgdHlwby4KLQotVGh1IEFwciAyMyAxNDo1ODozMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGZpbmRfcmVhbF9zdGFydCk6IElnbm9yZSBzeW1ib2xzIHN0YXJ0aW5nIHdpdGgKLQkuTCAtIHRoZXkgYXJlIGxvY2FsIGxhYmVscyBhbmQgdGhlIGJyYW5jaGVzIGFyZSBub3QgcmVhbGx5Ci0JZnVuY3Rpb24gY2FsbHMgYnV0IHJhdGhlciBmYXIganVtcHMuCi0KLVdlZCBBcHIgMjIgMTU6NTc6MjEgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChNS0lOU1RBTExESVJTKTogRG9uJ3QgbG9vayBpbiAkKHRvcF9zcmNkaXIpLgotCi1XZWQgQXByIDIyIDE0OjUyOjM2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBQcmludCBvcGVyYW5kIG51bWJlciByYXRoZXIgdGhhbgotCXVzaW5nIG9yZGluYWxfbmFtZXMuCi0JKGkzODZfb3BlcmFuZCk6IExpa2V3aXNlLgotCi1UdWUgQXByIDIxIDIyOjM0OjI1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAc2NyaWJibGVzLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChJTlRMTElCUyk6IERlZmluZSB0byB3b3JrIGFyb3VuZCBhcHBhcmVudCBhdXRvbWFrZQotCWJ1Zy4KLQlBbGwgTWFrZWZpbGVzOiBSZWdlbmVyYXRlZC4KLQotCSogTWFueSBmaWxlczogQWRkZWQgZ2V0dGV4dCBpbnZvY2F0aW9ucyBhcm91bmQgdXNlci12aXNpYmxlCi0Jc3RyaW5ncy4KLQkqIGFjY29uZmlnLmggKEVOQUJMRV9OTFMsIEhBVkVfQ0FUR0VUUywgSEFWRV9HRVRURVhULCBIQVZFX1NUUENQWSwKLQlIQVZFX0xDX01FU1NBR0VTKTogRGVmaW5lLgotCSogZGVwLWluLnNlZDogQWRkZWQgYXNpbnRsLmguCi0JKiBwby9NYWtlLWluOiBOZXcgZmlsZS4KLQkqIGdhc3AuYyAobWFpbik6IENhbGwgc2V0bG9jYWxlLCBiaW5kdGV4dGRvbWFpbiwgYW5kIHRleHRkb21haW4uCi0JSW5jbHVkZSAiYXNpbnRsLmgiLgotCSogcmVhZC5jIChaXyk6IFJlbmFtZWQgZnJvbSBgXycuCi0JKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IEFkZGVkIHBvLgotCShQT1RGSUxFUyk6IG5ldyBtYWNyby4KLQkocG8vUE9URklMRVMuaW4pOiBOZXcgdGFyZ2V0LgotCSgkKE9CSlMpKTogQWRkZWQgYXNpbnRsLmguCi0JKEhGSUxFUyk6IExpa2V3aXNlLgotCShJTkNMVURFUyk6IEFkZGVkIC1ETE9DQUxFRElSLCAtSSQodG9wX3NyY2RpcikvLi4vaW50bC4KLQkoYXNfbmV3X0xEQUREKTogQWRkZWQgJChJTlRMTElCUykuCi0JKGFzX25ld19ERVBFTkRFTkNJRVMpOiBBZGRlZCAkKElOVExERVBTKS4KLQkoZ2FzcF9uZXdfTERBREQpOiBBZGRlZCAkKElOVExMSUJTKS4KLQkoZ2FzcF9uZXdfREVQRU5ERU5DSUVTKTogTmV3IG1hY3JvLgotCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWx0LgotCSogY29uZmlndXJlLmluOiBDYWxsIENZX0dOVV9HRVRURVhULiAgR2VuZXJhdGUgcG8vTWFrZWZpbGUuaW4gYW5kCi0JcG8vTWFrZWZpbGUuCi0JKEFMTF9MSU5HVUFTKTogRGVmaW5lLgotCSogbWFjcm8uYzogSW5jbHVkZSAiYXNpbnRsLmgiLgotCSogYXMuYyAobWFpbik6IENhbGwgc2V0bG9jYWxlLCBiaW5kdGV4dGRvbWFpbiwgYW5kIHRleHRkb21haW4uCi0JKiBhcy5oOiBJbmNsdWRlICJhc2ludGwuaCIuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChvcmRpbmFsX25hbWVzKTogUmVtb3ZlZC4KLQkobWRfYXNzZW1ibGUpOiBDaGFuZ2VkIGVycm9yIHRleHQgdG8gYXZvaWQgb3JkaW5hbF9uYW1lcy4KLQkoaTM4Nl9vcGVyYW5kKTogTGlrZXdpc2UuCi0JKHJlbG9jKTogQWRkZWQgYXNfYmFkIHRvIGF2b2lkIGkxOG4gcHJvYmxlbXMuCi0JKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWFybS5jIChiYWRfYXJncyk6IE5vdyBhICNkZWZpbmUuCi0JKGJhZF9wYyk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai12bXMuYyAoVk1TX3N0YWJfcGFyc2UpOiBDaGFuZ2VkIHR5cGUgb2YKLQlgbG9uZ19jb25zdF9tc2cnLgotCShnbG9iYWxfc3ltYm9sX2RpcmVjdG9yeSk6IFVuaWZpZWQgc3RyaW5ncyB0byBhdm9pZCBpMThuCi0JcHJvYmxlbXMuCi0JKiBjb25maWcvdGMtbTY4ay5jIChnZXRfcmVsb2NfY29kZSk6IEFkZGVkIHNvbWUgYXNfYmFkIGNhbGxzIHRvCi0JYXZvaWQgaTE4biBwcm9ibGVtcy4KLQkqIGNvbmZpZy90Yy1uczMyay5jIChyZWxvYyk6IEFkZGVkIGFzX2JhZCB0byBhdm9pZCBpMThuIHByb2JsZW1zLgotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogQWRkZWQgYXNfYmFkX3doZXJlIHRvIGF2b2lkCi0JaTE4biBwcm9ibGVtcy4KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBBZGRlZCBhc19iYWQgdG8gYXZvaWQgaTE4bgotCXByb2JsZW1zLgotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBDaGFuZ2VkIEMrKyBjb21tZW50IGludG8gQwotCWNvbW1lbnQuCi0JKiBjb25maWcvdGMtdmF4LmMgKG1kX2Fzc2VtYmxlKTogQWRkZWQgYXNfd2FybiB0byBhdm9pZCBpMThuCi0JcHJvYmxlbXMuCi0JKiBhcy5jIChwcmludF92ZXJzaW9uX2lkKTogQWRkZWQgYW4gZnByaW50ZiB0byBhdm9pZCBpMThuCi0JcHJvYmxlbXMuCi0JKiBjb25kLmMgKGNvbmRfZmluaXNoX2NoZWNrKTogQWRkZWQgYXNfYmFkIGNhbGwgdG8gYXZvaWQgaTE4bgotCXByb2JsZW1zLgotCSogZXhwci5jIChleHByKTogQWRkZWQgYXNfd2FybiBjYWxsIHRvIGF2b2lkIGkxOG4gcHJvYmxlbXMuCi0JKiBtZXNzYWdlcy5jIChhc19hc3NlcnQpOiBDaGFuZ2VkIGNvZGUgdG8gYXZvaWQgaTE4biBwcm9ibGVtcy4KLQkoYXNfYWJvcnQpOiBMaWtld2lzZS4KLQkqIHJlYWQuYyAocHNldWRvX3NldCk6IEFkZGVkIGFzX2JhZCBjYWxsIHRvIGF2b2lkIGkxOG4gcHJvYmxlbXMuCi0JKHNfc3BhY2UpOiBMaWtld2lzZS4KLQkqIHBvL01ha2UtaW4sIHBvL1BPVEZJTEVTLmluLCBwby9nYXMucG90OiBOZXcgZmlsZXMuCi0KLVR1ZSBBcHIgMjEgMTc6MDE6MjIgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChjaGVja19wcmVmaXgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBzcGxpdCBvdXQKLQlmcm9tIG1kX2Fzc2VtYmxlLgotCShzdHJ1Y3QgX2kzODZfaW5zbik6IEFkZCB3YWl0X3ByZWZpeCBmaWVsZC4KLQkobWRfYXNzZW1ibGUpOiBSZW1vdmUgd2FpdF9wcmVmaXggbG9jYWwgdmFyaWFibGUuICBVc2UKLQljaGVja19wcmVmaXggd2hlbiBhZGRpbmcgYSBwcmVmaXguCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGN1cnJlbnRfdGVtcGxhdGVzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYXNzZW1ibGUpOiBSZW1vdmUgY3VycmVudF90ZW1wbGF0ZXMgbG9jYWwgdmFyaWFibGUuCi0JKG1kX2Fzc2VtYmxlLCBpMzg2X29wZXJhbmQpOiBJbXByb3ZlIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIGluCi0JbWFueSBwbGFjZXMuICBBZGQgUkVTVE9SRV9FTkRfU1RSSU5HIGluIG1hbnkgcGxhY2VzIGJlZm9yZSBlcnJvcgotCXJldHVybi4gIENsYXJpZnkgc29tZSBjb21tZW50cy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoc3RydWN0IF9pMzg2X2luc24pOiBDaGFuZ2Ugc2VnIGZpZWxkIHRvIGEgdHdvCi0JZWxlbWVudCBhcnJheS4KLQkobWRfYXNzZW1ibGUpOiBQYXJzZSBzdHJpbmcgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMsIGxvb2tpbmcgZm9yCi0Jc2VnbWVudCBvdmVycmlkZSBwcmVmaXhlcy4gIENoZWNrIGZvciBpbnZhbGlkIHNlZ21lbnQgcHJlZml4ZXMgb24KLQlzdHJpbmcgaW5zdHJ1Y3Rpb24uCi0JKGkzODZfb3BlcmFuZCk6IGkuc2VnW10gYW5kIG1heCBtZW1fb3BlcmFuZCBjaGFuZ2VzIGZvciBzdHJpbmcKLQlpbnNucy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKEVzU2VnKTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChyZWdLbHVkZ2UpOiBEZWZpbmUuCi0JKGljbHJLbHVkZ2UsIGltdWxLbHVkZ2UpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IE1lcmdlIGltdWxLbHVkZ2UgYW5kIGljbHJLbHVkZ2UKLQljb2RlLiAgTW92ZSBSZXZlcnNlUmVnUmVnbWVtIGZ1ZGdlcyBpbnRvIE1vZHJtIGNhc2UuICBSZW9yZGVyCi0Jb3Bjb2RlX21vZGlmaWVyIGNoZWNrcyB0byBsb29rIGZvciBtb3JlIGNvbW1vbiBjYXNlcyBmaXJzdC4gIEFkZAotCWRlZmF1bHRfc2VnIGZvciBJc1N0cmluZyBjYXNlLgotCi1UdWUgQXByIDIxIDE2OjE4OjEyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFNX1BST0dfTEVYIHJhdGhlciB0aGFuIEFDX1BST0dfTEVYIGFuZAotCUFDX0RFQ0xfWVlURVhULgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbmV3IGF1dG9tYWtlIGFuZCBsaWJ0b29sLgotCSogYWNsb2NhbC5tNCwgTWFrZWZpbGUuaW46IExpa2V3aXNlLgotCi0JKiBkb2MvTWFrZWZpbGUuYW0gKGFzLmR2aSk6IE5ldyB0YXJnZXQuCi0JKiBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVNhdCBBcHIgMTggMDE6MjE6MDQgMTk5OCAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgc3BhcmM4Nnggc3VwcG9ydC4KLQkKLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkKLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChsb29rdXBfYXJjaCk6IEFkZGVkIGFyY2hfdHlwZSB0byBzdHJ1Y3QKLQlzcGFyY19hcmNoLgotCShtZF9wYXJzZV9vcHRpb24pOiBXYXJuIGlmIC1FTCBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKFNQQVJDX0JJRU5ESUFOKSBBbHdheXMgZGVmaW5lLgotCQotU2F0IEFwciAxOCAwMToxOTowMSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogTm90ZSB3aGVuIHdlIHVzZSBnZXQgbWF0Y2ggb24KLSAgICAgICAgdGhlIGZ1bGwgaW5zdHJ1Y3Rpb24gbmFtZS4KLQotV2VkIEFwciAxNSAxNToxNzoyNyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKSBbT19zeW1ib2xdOiBBbHNvIHN0b3JlIHRoZSBzeW1ib2wKLQliYWNrIGludG8gdGhlIGV4cHJlc3Npb24gdG8gaGFuZGxlIGFkZC9zdWIgc2ltcGxpZmljYXRpb24gY29ycmVjdGx5LgotCi1XZWQgQXByIDE1IDA3OjA2OjA0IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAoaGlsb19pbnRlcmxvY2tzKTogUmVtb3ZlIDQzMDAuCi0KLU1vbiBBcHIgMTMgMTY6NTE6MDQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChkb19tc3IpOiBTdXBwb3J0IHVuZG9jdW1lbnRlZCAnbXNyIGNwc3JfZmxnLAotCSM8bj4nIGluc3RydWN0aW9uLgotCi1UaHUgQXByICA5IDEwOjI5OjQyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAobWF4X2luZGVudF9sZXZlbCk6IE5ldyBnbG9iYWwuCi0JKHByaW50X3N5bWJvbF92YWx1ZV8xKTogVXNlIGl0LgotCSogZXhwci5oIChleHByX2J1aWxkX2RvdCk6IERlY2xhcmUuCi0JKiBleHByLmMgKGV4cHJfYnVpbGRfZG90KTogTmV3IGZ1bmN0aW9uLgotCi1XZWQgQXByICA4IDE2OjE2OjExIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocHJpbnRfYmluYXJ5KTogTmV3IGZ1bmN0aW9uLgotCShwcmludF9leHByXzEpOiBDYWxsIGl0LgotCi1Nb24gQXByICA2IDEyOjA2OjM5IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwLCBjYXNlICIjQiIpOiBJbnN0YWxsIHRoZSBvZmZzZXQgb2YgdGhlCi0Jb3BlcmFuZCBpbiB0aGUgb3Bjb2RlLgotCi1GcmkgQXByICAzIDExOjU4OjE5IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuaDogUmVvcmRlciBvcGVyYW5kIGZsYWdzIGFuZCBvcGNvZGUgbW9kaWZpZXIKLQlmbGFncyBmb3IgY2xhcml0eS4gIFJlbW92ZSB1bnVzZWQgZGVmaW5pdGlvbnM6IFVua25vd24sCi0JSW1tVW5rbm93biwgRGlzcFVua25vd24sIE5vTW9kcm0uCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0eXBlX25hbWVzKTogQWRkIG1pc3NpbmcgRGVidWcgdHlwZS4KLQkobWRfYXNzZW1ibGUpOiBCZXR0ZXIgZHVwbGljYXRlIHByZWZpeCBjaGVja2luZy4gIFF1aWNrZXIgc3RyaW5nCi0JaW5zdHJ1Y3Rpb24gY2hlY2sgdmlhIG5ldyBvcGNvZGVfbW9kaWZpZXIgZmxhZy4KLQotRnJpIEFwciAgMyAxMTo0NDozNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvIChJbnZva2luZyk6IENsYXJpZnkgLVdhIGV4YW1wbGUuCi0KLUZyaSBBcHIgIDMgMDk6MTI6MjMgMTk5OCAgR2F2aW4gS29jaCAgPGdhdmluQGNldHVzLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfcHNldWRvX3RhYmxlKTogQWRkIHdlYWtleHQgZW50cnkuIAotCShzX21pcHNfd2Vha2V4dCk6IERlZmluZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0KTogRG9uJ3QgZGVmaW5lIGlmIGRlZmluZWQoVENfTUlQUykuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBEb24ndCBhZGQgd2Vha2V4dCBpZiAKLQlkZWZpbmVkKFRDX01JUFMpLgkKLQkKLVRodSBBcHIgIDIgMjI6NDI6MDIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jICh0Y19nZW5fcmVsb2MpOiBUaGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scwotCWlzIGFuIGVycm9yIGlmIHRoZSB2YWx1ZSBjYW4gbm90IGJlIGNvbXB1dGVkIGF0IGFzc2VtYmx5IHRpbWUuCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jICh0Y19nZW4tcmVsb2MpOiBMaWtld2lzZS4KLQotVGh1IEFwciAgMiAxNjozNjo0NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhc3AuYyAobWFpbik6IFNldCBuZXh0IGZpZWxkIG9mIG5ldyBpbmNsdWRlX3BhdGggc3RydWN0dXJlIHRvCi0JTlVMTC4gIEZyb20gQXZlcnkgUGVubmFydW4gPGF2ZXJ5cEBnZGMuY2E+LgotCi0JKiByZWFkLmMgKHNfbXJpX3NlY3QpOiBDYWxsIGFzX2JhZCByYXRoZXIgdGhhbiBhYm9ydCBmb3IgYW4KLQl1bnN1cHBvcnRlZCBNUkkgdGFyZ2V0LgotCi1XZWQgQXByICAxIDExOjA4OjI3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoYXJtX3ZhbGlkYXRlX2ZpeCk6IE5ldyBmdW5jdGlvbi4gIERldGVybWluZSBpZgotCXRoZSBkZXN0aW5hdGlvbiBvZiBhIGJyYW5jaCBpbnN0cnVjdGlvbiBzaG91bGQgYmUgYWx0ZXJlZC4KLQkoZmluZF9yZWFsX3N0YXJ0KTogTmV3IGZ1bmN0aW9uOiAgTG9jYXRlIHRoZSByZWFsLCBUaHVtYiBjb2RlZAotCXN0YXJ0IG9mIGEgVGh1bWIgZnVuY3Rpb24uCi0JKGRvX3RfYnJhbmNoMjMpOiBBbHRlciB0aGUgZGVzdGluYXRpb24gb2YgYnJhbmNoZXMgdG8gVGh1bWIKLQlmdW5jdGlvbnMuIAotCi0JKiBjb25maWcvdGMtYXJtLmg6IERlZmluZSBUQ19WQUxJREFURV9GSVguCi0KLVR1ZSBNYXIgMzEgMTM6Mjc6MzMgMTk5OCAgRGVhbiBNLiBEZWF2ZXIgIDxkZWF2ZXJAYW10LnRheTEuZGVjLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChkZWNvZGVfc2hpZnQpOiBIYW5kbGUgYWRkcmVzc2luZyBtb2RlIDIgdy9ycngKLQlhbHNvLgotCi1XZWQgQXByICAxIDEzOjEzOjIwIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBkb2MvYXMudGV4aW5mbzogVXNlIEBpdGVteCBmb3IgYSBzZWNvbmRhcnkgaXRlbSBpbiBhIHRhYmxlLgotCSogZG9jL2MtaHBwYS50ZXhpOiBMaWtld2lzZS4KLQotVHVlIE1hciAzMSAxNzo1Mjo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5hbSAoREVQX0lOQ0xVREVTKTogTmV3IHZhcmlhYmxlLgotCSguZGVwMSk6IENoYW5nZSB0byB3b3JrIHdoZW4gc3JjZGlyIGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoLgotCSgudGNkZXAsIC5vYmpkZXAsIC5kZXAyLCBkZXAuc2VkKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIE1hciAzMCAxMjo0Njo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmgsIGNvbmZpZy90Yy1pMzg2LmM6IFJldmVydCBNYXJjaCAyNAotCUxpbmVhckFkZHJlc3MgcGF0Y2guCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IHZlcnNpb24gdG8gMi45LjEuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOS4KLQotTW9uIE1hciAzMCAxMToyMjowOCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKEZXYWl0KTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBFbWl0IGZ3YWl0IHByZWZpeCBiZWZvcmUgYW55Ci0Jb3RoZXIgcHJlZml4ZXMuICBDaGVjayBGV2FpdCBmbGFnIGluIG9wY29kZSB0YWJsZSB0byBzZWUgd2hpY2gKLQlpbnN0cnVjdGlvbnMgcmVxdWlyZSBhbiBmd2FpdCBwcmVmaXguCi0KLU1vbiBNYXIgMzAgMTA6MTI6MDAgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHN0YWJzLmMgKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBBbHdheXMgY3JlYXRlIGEgc3RhYiBzdHJpbmcKLQlzZWN0aW9uLgotCi1TYXQgTWFyIDI4IDIyOjI4OjAyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZpeCBzb21lIGdjYyAtV2FsbCB3YXJuaW5nczoKLQkqIGF0b2YtZ2VuZXJpYy5jIChhdG9mX2dlbmVyaWMpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKiBlaG9wdC5jIChlaF9mcmFtZV9jb2RlX2FsaWdubWVudCk6IExpa2V3aXNlLgotCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50LCBvcGVyYW5kKTogTGlrZXdpc2UuCi0JKiBmcmFncy5jIChmcmFnX2FsaWduKTogTGlrZXdpc2UuCi0JKiBnYXNwLmMgKGxldmVsXzAsIGNoYW5nZV9iYXNlLCBkb2luc3RyKTogTGlrZXdpc2UuCi0JKiBoYXNoLmMgKGhhc2hfYXNrKTogTGlrZXdpc2UuCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfcGFnZSwgY2FsY19oZXgsIHByaW50X2xpbmVzKTogTGlrZXdpc2UuCi0JKGRlYnVnZ2luZ19wc2V1ZG8pOiBMaWtld2lzZS4KLQkqIG1hY3JvLmMgKGRlZmluZV9tYWNybywgY2hlY2tfbWFjcm8pOiBMaWtld2lzZS4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlLCBzX2FsaWduLCBzX2Zsb2F0X3NwYWNlKTogTGlrZXdpc2UuCi0JKGlnbm9yZV9yZXN0X29mX2xpbmUsIGZsb2F0X2NvbnMpOiBMaWtld2lzZS4KLQkqIHN5bWJvbHMuYyAoZGVjb2RlX2xvY2FsX2xhYmVsX25hbWUpOiBMaWtld2lzZS4KLQkqIHdyaXRlLmMgKHJlY29yZF9hbGlnbm1lbnQsIGN2c19mcmFnX3RvX2ZpbGwpOiBMaWtld2lzZS4KLQkoZml4dXBfc2VnbWVudCwgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbik6IExpa2V3aXNlLgotCShudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuKTogTGlrZXdpc2UuCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKGdlbl90b193b3Jkcyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2JlZ2luLCBtZF9hc3NlbWJsZSk6IExpa2V3aXNlLgotCShzcGFyY19pcCwgcGFyc2Vfa2V5d29yZF9hcmcsIHNfY29tbW9uKTogTGlrZXdpc2UuCi0JKiByZWFkLmMgKG91dHB1dF9iaWdfc2xlYjEyOCk6IEluaXRpYWxpemUgbG9jYWxzIHRvIGF2b2lkCi0Jd2FybmluZ3MuCi0JKG91dHB1dF9iaWdfdWxlYjEyOCwgZXF1YWxzKTogTGlrZXdpc2UuCi0JKiBhdG9mLWdlbmVyaWMuYyAoYXRvZl9nZW5lcmljKTogQ2hhbmdlIG51bWJlcl9vZl9kaWdpdHNfKiBsb2NhbHMKLQl0byB1bnNpZ25lZCBpbnQuICBDaGFuZ2UgemVyb3MgdG8gdW5zaWduZWQgaW50LgotCSogY29uZC5jIChzX2lmKTogQWRkIHJldHVybiB0byBkZWZhdWx0IGNhc2UuCi0JKiBmcmFncy5jIChmcmFnX25vd19maXgpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYWRkcmVzc1QuCi0JKiBmcmFncy5oIChmcmFnX25vd19maXgpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBsaXN0aW5nLmMgKGZpbGVfaW5mb19zdHJ1Y3QpOiBDaGFuZ2UgbGluZW51bSB0byB1bnNpZ25lZCBpbnQuCi0JKHN0cnVjdCBsaXN0X2luZm9fc3RydWN0KTogQ2hhbmdlIGhsbF9saW5lIHRvIHVuc2lnbmVkIGludC4KLQkocHJpbnRfc291cmNlKTogVXBkYXRlIGZvcm1hdCBzdHJpbmcuCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IENoYW5nZSBzY2FuIHRvIHVuc2lnbmVkIGludCwgYW5kIGRvbid0Ci0JYm90aGVyIHRvIGluaXRpYWxpemUgaXQuCi0JKiBzeW1ib2xzLmMgKGRvbGxhcl9sYWJlbF9jb3VudCk6IENoYW5nZSB0byB1bnNpZ25lZCBsb25nLgotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBSZW1vdmUgdW51c2VkIGxhYmVsIHJlZHVjZV9maXh1cC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19tZW1vcnlfbW9kZWwpOiBPbmx5IGRlZmluZSBpZiBPQkpfRUxGLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEFkZCByZXR1cm4gdG8gZGVmYXVsdCBjYXNlLgotCi1GcmkgTWFyIDI3IDEyOjQ2OjQ3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IENoZWNrIGxlZ2FsIGFkZHJlc3NpbmcgbW9kZXMgZm9yCi0gCW1jZjUyMDAganVzdCBhcyB3ZSBkbyBmb3IgbTY4MDAwLgotCShtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IExpa2V3aXNlLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IExpa2V3aXNlLgotCi1GcmkgTWFyIDI3IDEwOjMwOjAxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6ICBTdG9yZSByZWxvY2F0aW9uIGFkZGVuZCBpbgotCWZpeHVwIGluc3RlYWQgb2YgaW5zdHJ1Y3Rpb24uCi0KLVRodSBNYXIgMjYgMjM6MDc6MTggMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IFN3YXAgdGVtcGxhdGUgYXJndW1lbnRzIHRvCi0JQ09OU0lTVEVOVF9SRUdJU1RFUl9NQVRDSCBtYWNybyBpbiByZXZlcnNlIGRpcmVjdGlvbiB0ZXN0LgotCVRoaXMgbWFjcm8gaXMgY3VycmVudGx5IHN5bW1ldHJpYywgc28gcGFzc2luZyB0aGVtIHRoZSB3cm9uZwotCXdheSBkaWRuJ3QgY2F1c2UgYW55IHByb2JsZW0sIGJ1dCBtYXkgaWYgdGhlIG1hY3JvIGlzIGNoYW5nZWQKLQlpbiB0aGUgZnV0dXJlLgotCUFmdGVyIGNvcHlpbmcgdGVtcGxhdGUgdG8gaS50bSwgdXNlIGkudG0uIHJhdGhlciB0aGFuIHQtPiB0bwotCWFjY2VzcyBmaWVsZHMsIGFuZCBtYWtlIHQgYSBjb25zdCoKLQlNb3ZlIGkudG0ub3BlcmFuZF90eXBlc1tdIHN3YXAgdG8gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNvcHkuCi0KLVdlZCBNYXIgMjUgMTM6NDQ6MTggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZXhwci5oIChleHByX2J1aWxkX3Vjb25zdGFudCk6IEFkZCBwcm90b3R5cGUuCi0JKGV4cHJfYnVpbGRfdW5hcnksZXhwcl9idWlsZF9iaW5hcnkpOiBBZGQgcHJvdG90eXBlcy4KLQkqIGV4cHIuYyAoZXhwcl9idWlsZF91Y29uc3RhbnQpOiBOZXcgZnVuY3Rpb24uCi0JKGV4cHJfYnVpbGRfdW5hcnksZXhwcl9idWlsZF9iaW5hcnkpOiBOZXcgZnVuY3Rpb25zLgotCi1XZWQgTWFyIDI1IDEzOjEwOjQyIDE5OTggIEJydW5vIEhhaWJsZSAgPGJydW5vQGxpbnVpeC5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+Ci0KLSAgICAgICAgKiBnYXNwLmMgKElTKik6IENhc3QgYXJndW1lbnQgdG8gdW5zaWduZWQgY2hhciwgbm90IHVuc2lnbmVkIGludC4KLSAgICAgICAgKiBtYWNyby5jIChtYWNyb19leHBhbmRfYm9keSk6IEluY3JlYXNlIGJ1ZmZlciBzaXplLgotICAgICAgICAqIG1lc3NhZ2VzLmMgKGFzX3dhcm4pOiBMaWtld2lzZS4KLQkoYXNfd2Fybl93aGVyZSwgYXNfYmFkLCBhc19iYWRfd2hlcmUpOiBMaWtld2lzZS4KLQotV2VkIE1hciAyNSAxMjo1OTowNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIEguSi4gTHUgIDxoamxAZ251Lm9yZz46Ci0JKiBNYWtlZmlsZS5hbSAoRElTVFNUVUZGKTogTmV3IHZhcmlhYmxlLgotCShkaXN0c3R1ZmYpOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBNYXIgMjQgMTY6NTE6MjkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuaCAobWRfY2xlYW51cCwgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2spOiBDYWxsCi0JbTMycl9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vay4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAobTMycl9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayk6IE5ldyBmdW5jdGlvbiB0bwotCWVtaXQgYSBub3AgaWYgYSBzZWN0aW9uIGVuZHMgd2l0aCBhIDE2IGJpdCBpbnN0cnVjdGlvbi4KLQotVHVlIE1hciAyNCAxOTo0ODowOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9ic3MpOiBDb21waWxlIHVuY29uZGl0aW9uYWxseS4gIENhbGwKLQlzX2xjb21tIHJhdGhlciB0aGFuIG9ial9jb2ZmX2xjb21tLgotCShvYmpfcHNldWRvX3RhYmxlKTogQ29tcGlsZSAuYnNzIHBzZXVkby1vcCB1bmNvbmRpdGlvbmFsbHkuCi0KLVR1ZSBNYXIgMjQgMTg6MzA6NTggMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChMaW5lYXJBZGRyZXNzKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBJZiBMaW5lYXJBZGRyZXNzIGlzIHNldCBmb3IgdGhlCi0JaW5zdHJ1Y3Rpb24sIGRvbid0IHVzZSBhIGRlZmF1bHQgc2VnbWVudC4KLQotTW9uIE1hciAyMyAxODo1Mzo0MCAxOTk4ICBKb2VsIFNoZXJyaWxsICA8am9lbEBPQVJjb3JwLmNvbT4KLQotCSogY29uZmlndXJlLmluOiAoc2gqLSotcnRlbXMqKTogU3dpdGNoZWQgZnJvbSBFTEYgdG8gQ09GRi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE1hciAyMCAxOToxNTo0NCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGxpYnRvb2wgMS4yLgotCi1UaHUgTWFyIDE5IDE2OjAzOjEyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IGZpeCBjb2RlIHRvIHRlc3QgdGhlIHJhbmdlIG9mCi0JUEMgcmVsYXRpdmUgYnJhbmNoZXMuICBQYXRjaCBjb3VydGVzeSBvZiBKb25hdGhhbiBXYWx0b24uIAotCi0JCi1XZWQgTWFyIDE4IDA5OjI5OjUxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IEFkZCB0aHVtYi1wZSB0YXJnZXQuCi0KLQkqIGNvbmZpZ3VyZSAoZW11bGF0aW9ucyk6IEFkZCB0aHVtYi1wZSB0YXJnZXQuCi0KLTE5OTgtMDMtMTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBpdGJsLWxleC5sICh5eXdyYXApOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkIGFzIGEKLQltYWNyby4KLQotRnJpIE1hciAxMyAxNjozMTozOCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGRlcGVuZC5jIChxdW90ZV9zdHJpbmdfZm9yX21ha2UpOiBOZXcgZnVuY3Rpb24uCi0JKHdyYXBfb3V0cHV0KTogVXNlIGl0LgotCi1UaHUgTWFyIDEyIDE4OjI4OjIyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IFNldCBic3MgZmxhZyBpbiBzZWdfaW5mbwotCXN0cnVjdHVyZSBpZiB0eXBlIGlzIFNIVF9OT0JJVFMuICBbQnVnIGZpeCBjb3VydGVzeSBvZiBydGhdCi0KLVNhdCBGZWIgMjggMTc6Mjg6NTUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX3Nob3J0b3B0cywgbWRfbG9uZ29wdHMsIG1kX3BhcnNlX29wdGlvbik6Ci0JUmVjb2duaXplIC1HTiBhbmQgLXJlbGF4LgotCShtZF9iZWdpbik6IEluaXRpYWxpemUgZ3Agc2l6ZSBmcm9tIC1HIHN3aXRjaC4KLQkoYWxwaGFfZm9yY2VfcmVsb2NhdGlvbik6IEFsd2F5cyBmb3JjZSBpZiAtcmVsYXguCi0JKGFscGhhX2FsaWduKTogVGFrZSBhIG5ldyBhcmd1bWVudCB0aGF0IHdpbGwgc3BlY2lmeSB3aGVuIHRvIAotCWVtaXQgYW4gUl9BTFBIQV9BTElHTiByZWxvY2F0aW9uICh0aG91Z2ggd2UgZG9uJ3QgZG8gdGhhdCBub3cpLgotCUNoYW5nZSBhbGwgY2FsbGVycy4gIEVtaXQgbm9wIGFsaWdubWVudCBwYWRkaW5nIGFzIG5vcCt1bm9wIHBhaXIuCi0KLVNhdCBGZWIgMjggMTc6MDY6MjIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyBbVENfQUxQSEFdOiBJbmNsdWRlIDxlbGYvYWxwaGEuaD4uCi0JKiBjb25maWcvdGMtYWxwaGEuaCAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBOZXcuCi0KLVRodSBGZWIgMjYgMTU6NDk6MDQgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHdyaXRlXzJfc2hvcnQpOiBEZWxheWVkIGpzciBpbnN0cnVjdGlvbnMgZG9uJ3QKLQlyZXF1aXJlIHBhZGRpbmcgdG8gdGhlIG5leHQgbG9uZyB3b3JkIGJvdW5kYXJ5LgotCi1Nb24gRmViIDIzIDExOjI5OjA2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmM6ICNpbmNsdWRlIHN5bWNhdC5oLgotCSogY29uZmlnL3RjLW0zMnIuYzogTGlrZXdpc2UuCi0KLU1vbiBGZWIgMjMgMTA6Mjc6NDAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwLCBjYXNlICdQJyk6IE1ha2UgJ1AnIGFyZ3VtZW50cyBiZQotCWFic29sdXRlIGV4cHJlc3Npb25zIGluc3RlYWQgb2YgJyQnIHByZWZpeGVkIHJlZ2lzdGVyIG5hbWVzLgotCi1TYXQgRmViIDIxIDIyOjM2OjUyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19zZXQpOiBSZWNvcmQgZmlsZSBhbmQgbGluZSBpbmZvIGZvciBzeW1ib2xzIHdoZW4gLWFzLgotCShwc2V1ZG9fc2V0KTogRG9uJ3Qgb3ZlcndyaXRlIHRoYXQgZHVtbXkgZnJhZ21lbnQuCi0KLUZyaSBGZWIgMjAgMTU6MDM6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAic2VjdGlvbiIuCi0JKHBwY19uYW1lZF9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotVGh1IEZlYiAxOSAyMjoyNTo0MiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0Yy1wcGMuYyAocHBjX2JpZWkpOiBDYWNoZSB0aGUgbGFzdCBzeW1ib2wgd2UgaW5zZXJ0ZWQKLQlzbyB3ZSBkb24ndCBoYXZlIHRvIHNjYW4gdGhlIGVudGlyZSBsaXN0LgotCi1UdWUgRmViIDE3IDE3OjAyOjE1IDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChwYXJhbGxlbF9vayk6IEZvciB0aGUgZXhwbGljaXRseSBwYXJhbGxlbAotIAljYXNlLCBhbGxvdyB0aGUgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zIHRvIG1vZGlmeSB0aGUgc2FtZSBmbGFnCi0gCWJpdHMuCi0KLVRodSBGZWIgMTkgMTY6MDg6MTUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IENhdGVnb3JpemUgc3ltYm9scyBieQotCXVuZGVmaW5lZF9zZWN0aW9uIHJhdGhlciB0aGFuIHN5X2ZyYWctPmxpbmUgPT0gTlVMTC4KLQotV2VkIEZlYiAxOCAyMzozOTo0NiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogSW5zdGFsbCBwcm9wZXJseSB3aGVuIGxuCi0JZmFpbHMgb3IgdG9vbGRpciA9PSBwcmVmaXguCi0KLVR1ZSBGZWIgMTcgMTg6NTg6NTEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYyAoY2dlbl9tZF9hcHBseV9maXgzKTogRGVsZXRlIGNhbGwgdG8gdmFsaWRhdGVfb3BlcmFuZC4KLQlUZXN0IHJlc3VsdCBvZiBpbnNlcnRfb3BlcmFuZCBmb3IgZXJyb3IuCi0KLUZyaSBGZWIgMTMgMTY6NDE6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQVVUT01BS0VfT1BUSU9OUyk6IEFkZCBjeWdudXMuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggYXV0b21ha2UgMS4yZS4KLQkqIGRvYy9NYWtlZmlsZS5hbSAoQVVUT01BS0VfT1BUSU9OUyk6IERlZmluZS4KLQkqIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEZlYiAxMyAwMDo0Nzo0NCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogSGFuZGxlIG9wZXJhbmQgdHlwZSAnQycuCi0JKG1hY3JvKTogRml4IGhhbmRsaW5nIG9mIE1fQ09QWzAtM10uCi0KLVRodSBGZWIgMTIgMTQ6MDY6NTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIFJvc3MgSGFydmV5IDxyb3NzQHRlcmFmbG9wLmNvbT46Ci0JKiBtYWNyby5jIChJU1NFUCk6IE9ubHkgdHJlYXQgJzwnIGFuZCAnPicgYXMgc2VwYXJhdG9yIGNoYXJhY3RlcnMKLQlpZiBtYWNyb19hbHRlcm5hdGUgb3IgbWFjcm9fbXJpLgotCShnZXRzdHJpbmcpOiBSZW1vdmUgc3VwcG9ydCBmb3IgYnl0ZSBjb25zdGFudHMgYmV0d2VlbiA8IGFuZCA+LgotCShnZXRfYW55X3N0cmluZyk6ICc8JyBvbmx5IHN0YXJ0cyBhIHN0cmluZyBpZiBtYWNyb19hbHRlcm5hdGUgb3IKLQltYWNyb19tcmkuCi0JKG1hY3JvX2V4cGFuZF9ib2R5KTogUGVybWl0IGtleXdvcmQgcGFyYW1ldGVycyBmb2xsb3dpbmcKLQlwb3NpdGlvbmFsIHBhcmFtZXRlcnMuCi0KLQlOZXRCU0QgcGF0Y2hlcyBmcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPjoKLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEqLSotbmV0YnNkKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWcvdGUtbmJzZC5oIChMT0NBTF9MQUJFTFNfRkIpOiBEZWZpbmUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGFzLmggKGZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApOiBNb3ZlIGZyb20gaGVyZS4uLgotCSogY29uZmlnL3RjLWQxMHYuYyAoZmxhZ193YXJuX3N1cHByZXNzX2luc3RydWN0aW9uc3dhcCk6IC4uLnRvCi0JaGVyZSwgYW5kIG1ha2Ugc3RhdGljLgotCi0JKiBlaG9wdC5jIChlaF9mcmFtZV9jb2RlX2FsaWdubWVudCk6IE9ubHkgdXNlIHNlZ19pbmZvIGlmCi0JQkZEX0FTU0VNQkxFUiBvciBNQU5ZX1NFR01FTlRTLgotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogVXBkYXRlIGJ1Zy1nbnUtdXRpbHMgYWRkcmVzcy4KLQkqIGdhc3AuYyAoc2hvd191c2FnZSk6IExpa2V3aXNlLgotCSogZG9jL2FzLnRleGluZm8gKEJ1ZyBSZXBvcnRpbmcpOiBMaWtld2lzZS4KLQotV2VkIEZlYiAxMSAyMzoyNjoyOCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX2FkZHJlc3MpOiBEb24ndCB1c2UgbWlwcyBJSUkgb3IgbWlwcyBJVgotCWluc25zIHJlZ2FyZGxlc3Mgb2YgdGhlIHNpemUgb2YgYSBwb2ludGVyIGlmIHdlJ3JlIGluIG1pcHMgSSBvcgotCU1JUFMgSUkgbW9kZS4KLSAgICAgICAgKG1hY3JvLCBtYWNybzIsIHNfY3ByZXN0b3JlLCBzX2NwYWRkKTogTGlrZXdpc2UuCi0KLVRodSBGZWIgMTIgMDM6NDE6MDAgMTk5OCAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotRml4IHJhYyB0byBhY2NlcHQgb25seSBhMDoKLQkqIHRjLWQxMHYuYyAocGFyYWxsZWxfb2ssIGZpbmRfb3Bjb2RlKToKLQlTcGxpdCBPUEVSQU5EX0FDQyBpbnRvIE9QRVJBTkRfQUNDMCBhbmQgT1BFUkFORF9BQ0MxLgotCUludHJvZHVjZSBPUEVSQU5EX0dQUi4KLQotV2VkIEZlYiAxMSAxNjoyODoxMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfZmlsbCk6IEhhbmRsZSBub24tY29uc3RhbnQgcmVwZWF0IGNvdW50cyBieSBjcmVhdGluZwotCWFuIHJzX3NwYWNlIGZyYWdtZW50LgotCi1UdWUgRmViIDEwIDE4OjMxOjMxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogQ2hhbmdlIGVycm9yIGFkZGVkIEphbiAyIDE5OTgKLQlmcm9tIGFzX2JhZCB0byBhc193YXJuLgotCi1UdWUgRmViIDEwIDE4OjA0OjAwIDE5OTggIEppbSBMZW1rZSAgPGpsZW1rZUBjeWdudXMuY29tPgotCi0JKiBhcy5jOiAocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogVXNlIFtURVhUfERBVEF8QlNTXV9TRUNUSU9OX05BTUUKLQkqIGFzLmg6IERlZmluZSBkZWZhdWx0IHZhbHVlcyBvZiBbVEVYVHxEQVRBfEJTU11fU0VDVElPTl9OQU1FCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfYmVnaW4pOiBVc2UgW1RFWFR8REFUQXxCU1NdX1NFQ1RJT05fTkFNRQotCi1UdWUgRmViIDEwIDE3OjU4OjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWhvcHQuYyAoZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQpOiBJZiBub3QgQkZEX0FTU0VNQkxFUiwgdXNlCi0Jc2VnX2ZpeF9yb3RQIHJhdGhlciB0aGFuIGZpeF9yb290IGZyb20gc2VnX2luZm8uCi0KLVR1ZSBGZWIgMTAgMTU6MzI6MjIgMTk5OCAgSWFuIENhcm1pY2hhZWwgIDxpYW5jYXJtQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYzogQWRkIHN1cHBvcnQgZm9yIDB4MV8yXzNfNCBiaWdudW1zLgotCi1UdWUgRmViIDEwIDE0OjQzOjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgLWxpbnV4KiB0byAtbGludXgtZ251Ki4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKTogVHJlYXQgXHIgYXMgd2hpdGVzcGFjZS4KLQotTW9uIEZlYiAgOSAxNDoxNjoxMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVNhdCBGZWIgIDcgMTU6MzM6NTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotRnJpIEZlYiAgNiAxNjowODozMCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IElmIG1pcHNfY3B1IGlzIHNldCwgdGhlbiB1c2UgaXQgYXMKLSAgICAgICAgdGhlIGFyZ3VtZW50IHRvIGJmZF9zZXRfYXJjaF9tYWNoLgotICAgICAgICAobG9hZF9hZGRyZXNzKTogVXNlIGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgdG8gZGV0ZXJtaW5lIHRoZQotICAgICAgICBiaXQgc2l6ZSBvZiBhbiBhZGRyZXNzIGluc3RlYWQgb2YgbG9va2luZyBhdCB0aGUgaXNhIGxldmVsLgotICAgICAgICAobWFjcm8sIG1hY3JvMiwgc19jcHJlc3RvcmUsIHNfY3BhZGQpOiBMaWtld2lzZS4KLQotRnJpIEZlYiAgNiAxNDo0NDozNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9wYXJzZV9vcHRpb24pOiBBZGQgLW12ODUwYW55IGNvbW1hbmQgbGluZSBvcHRpb24uCi0KLVRodSBGZWIgIDUgMTI6Mzk6MDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlaG9wdC5jOiBOZXcgZmlsZS4KLQkqIGFzLmggKGVudW0gX3JlbGF4X3N0YXRlKTogQWRkIHJzX2NmYS4KLQkoY2hlY2tfZWhfZnJhbWUsIGVoX2ZyYW1lX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogRGVjbGFyZS4KLQkoZWhfZnJhbWVfcmVsYXhfZnJhZywgZWhfZnJhbWVfY29udmVydF9mcmFnKTogRGVjbGFyZS4KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogQ2FsbCBjaGVja19laF9mcmFtZS4KLQkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBIYW5kbGUgcnNfY2ZhLgotCShyZWxheF9zZWdtZW50KTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShHQVNfQ0ZJTEVTKTogQWRkIGVob3B0LmMuCi0JKEdFTkVSSUNfT0JKUyk6IEFkZCBlaG9wdC5vLgotCSogZG9jL2ludGVybmFscy50ZXhpIChGcmFncyk6IERvY3VtZW50IHJzX2NmYS4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IE1lbnRpb24gLS10cmFkaXRpb25hbC1mb3JtYXQuCi0JKHBhcnNlX2FyZ3MpOiBBY2NlcHQgLS10cmFkaXRpb25hbC1mb3JtYXQuCi0JKiBhcy5oIChmbGFnX3RyYWRpdGlvbmFsX2Zvcm1hdCk6IERlY2xhcmUuCi0JKiBvdXRwdXQtZmlsZS5jIChvdXRwdXRfZmlsZV9jcmVhdGUpOiBJZiBmbGFnX3RyYWRpdGlvbmFsX2Zvcm1hdCwKLQlzZXQgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCBvbiBzdGRvdXRwdXQuCi0JKiBkb2MvYXMudGV4aW5mbywgZG9jL2FzLjE6IERvY3VtZW50IC0tdHJhZGl0aW9uYWwtZm9ybWF0LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IE1ha2Ugc3VyZSB0aGF0IGlmIHdlIGhhdmUgYQotCWZpeHVwIGZvciBhbiB1bm1hdGNoZWQgJWhpIHJlbG9jLCBpdCBkb2VzIG5vdCBhc3NvY2lhdGVkIHdpdGggYQotCXZhcmlhbnQgZnJhZy4KLQotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogZG9jL01ha2VmaWxlLmluOiBMaWtld2lzZS4KLQotV2VkIEZlYiAgNCAxNTo0MTo1NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChjaGVja19mb3Jfc2lkZV9lZmZlY3RzKTogTmV3IGZ1bmN0aW9uLgotCShjYW5fbWFrZV9wYXJhbGxlbCk6IEFkZCBjaGVja3MgZm9yIGluc3RydWN0aW9uIHNpZGUgZWZmZWN0cwotCWNsYXNoaW5nIHdpdGggdGhlIG90aGVyIGluc3RydWN0aW9uLgotCShhc3NlbWJsZV9wYXJhbGxlbF9pbnNuKTogSW1wcm92ZSB3YXJuaW5nIG1lc3NhZ2VzLiAgUmV0dXJuIGVycm9yCi0JbWVzc2FnZSBmcm9tIG5vbi1zd2FwcGVkIGluc3RydWN0aW9uIG9yZGVyLgotCi1XZWQgRmViICA0IDIwOjAwOjI2IDE5OTggIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQHRla25lbWEuZGVtb24uY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYzogUmVuYW1lIGFybV9hZnRlcl9wYXNzX2hvb2soKSB0byBhcm1fY2xlYW51cCgpLgotCi0JKiBjb25maWcvdGMtYXJtLmg6IFJlcGxhY2UgbWRfYWZ0ZXJfcGFzc19ob29rIGRlZmluaXRpb24gd2l0aCBhCi0gCW1kX2NsZWFudXAgZGVmaW5pdGlvbi4gIFRoaXMgbW92ZXMgdGhlIGZvcmNlZCBsaXRlcmFsIG91dHB1dCB0bwotIAl0aGUgZW5kIG9mIHRoZSBzb3VyY2UgcGFzcywgYW5kIGF2b2lkcyBtYWNybydzIGluc2VydGluZyBsaXRlcmFscwotIAlpbnRvIHRoZSBjb2RlIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBtYWNybyBleHBhbnNpb24uCi0KLVdlZCBGZWIgIDQgMTM6MTc6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAodGNfZml4X2FkanVzdGFibGUpIFtPQkpfRUxGXTogQSByZWxvYyBhZ2FpbnN0Ci0JYSBnYXMgaW50ZXJuYWwgc3ltYm9sIGlzIGFkanVzdGFibGUuCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogTGlrZXdpc2UuCi0KLQkqIGFzLmg6IElmIGdjYyB2ZXJzaW9uIGdyZWF0ZXIgdGhhbiAyLjYsIHVzZSBgX19mb3JtYXRfXycgYW5kCi0JYF9fcHJpbnRmX18nIGluIGZ1bmN0aW9uIGF0dHJpYnV0ZXMsIHJhdGhlciB0aGFuIGBmb3JtYXQnIGFuZAotCWBwcmludGYnLgotCi1Nb24gRmViICAyIDE4OjM4OjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmM6IE9ubHkgaW5jbHVkZSBlbGYvc3BhcmMuaCBpZiBPQkpfRUxGLgotCi1Nb24gRmViICAyIDE4OjMwOjM0IDE5OTggIFN0ZXZlIEhhd29ydGggIDxzdGV2ZUBwbS5jc2Uucm1pdC5FRFUuQVU+Ci0KLQlBZGQgdG1zMzIwYzMwIHN1cHBvcnQ6Ci0JKiBjb25maWcvdGMtdGljMzAuaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtdGljMzAuYzogTmV3IGZpbGUuCi0JKiBjb25maWcvb2JqLWNvZmYuaDogSWYgVENfVElDMzAsIGluY2x1ZGUgY29mZi90aWMzMC5oIGFuZCBkZWZpbmUKLQlUQVJHRVRfRk9STUFUIGFzICJjb2ZmLXRpYzMwIi4KLQkqIGNvbmZpZ3VyZS5pbiAodGljMzAtKi0qYW91dCosIHRpYzMwLSotKmNvZmYqKTogTmV3IHRhcmdldHMuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENQVV9UWVBFUyk6IEFkZCB0aWMzMC4KLQkoQ1BVX09CSl9WQUxJRCk6IHRpYzMwLWFvdXQgaXMgdmFsaWQuCi0JKFRBUkdFVF9DUFVfQ0ZJTEVTKTogQWRkIGNvbmZpZy90Yy10aWMzMC5jLgotCShUQVJHRVRfQ1BVX0hGSUxFUyk6IEFkZCBjb25maWcvdGMtdGljMzAuaC4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBGZWIgIDIgMTA6MjA6MzcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBJbXByb3ZlbWVudHMgdG8gZXJyb3IgbWVzc2FnZXMuCi0KLU1vbiBGZWIgIDIgMTI6Mzk6MDUgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogQ2hhbmdlIEJGRF9SRUxPQ19ISTE2IGFuZAotIAlCRkRfUkVMT0NfSEkxNl9TIHRvIHN0b3JlIHRoZSBoaWdoIGJpdHMgb2YgYW55IHZhbHVlLgotCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogVW5kbyBjaGFuZ2Ugb2YgRnJpIEp1biAyNy4KLQkoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogRG9uJ3QgbGV0IHRoZQotCWFzc2VtYmxlciBjYWxjdWxhdGUgcmVsb2NhdGlvbnMgdG8gYW55IGV4dGVybmFsIHN5bWJvbCBhdCBhbGwuCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpIFtPQkpfRUxGXTogQ29ycmVjdCBidWdzCi0JaW52b2x2aW5nIGdlbmVyYXRpb24gb2YgcGMtcmVsYXRpdmUgcmVsb2NzLgotCShtZF9wY3JlbF9mcm9tX3NlY3Rpb24pIFtPQkpfRUxGXTogVGhlIGpvYiB0aGlzIGNvZGUgdXNlZCB0byBkbwotCWhhcyBiZWVuIG1vdmVkIHRvIG1kX2FwcGx5X2ZpeDMuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEZpeCB0ZXN0IGZvciB0b28tZmFyIGJyYW5jaC4KLQkocHBjX2VsZl9zdWZmaXgpOiBXYXJuIGFib3V0ICdpZGVudGlmaWVyK2NvbnN0YW50QGdvdCcgc3ludGF4LAotCXdoaWNoIGFjdHVhbGx5IG1lYW5zICh0aGUgYWRkcmVzcyBvZiBpZGVudGlmaWVyJ3MgR09UIGVudHJ5KSArCi0JY29uc3RhbnQsIHdoaWNoIGlzIG5vdCBwYXJ0aWN1bGFybHkgdXNlZnVsLgotCi1GcmkgSmFuIDMwIDExOjAyOjM1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuaCAoaW5jbHVkZV9kaXJzKTogRGVjbGFyZS4KLQkoaW5jbHVkZV9kaXJfY291bnQsaW5jbHVkZV9kaXJfbWF4bGVuKTogRGVjbGFyZS4KLQotRnJpIEphbiAzMCAxMTo0NzowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ29ycmVjdCBjaGVjayBmb3Igc2hhcmVkIG9wY29kZXMgbGlicmFyeS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogbGlzdGluZy5jIChidWZmZXJfbGluZSk6IElmIHdlIGNhbid0IG9wZW4gdGhlIGZpbGUsIHNldCBhdF9lbmQuCi0JKGxpc3RpbmdfcHJpbnQpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGZpLgotCi0JKiBjb25maWcvbTY4ay1wYXJzZS55IChyZWdsaXN0cGFpcik6IEhhbmRsZSByZWdpc3RlciBsaXN0IGluCi0JZWl0aGVyIG9yZGVyLgotCi0JKiBjb25maWcvdm1zLWNvbmYuaDogRG9uJ3QgdW5kZWYgVkVSU0lPTi4KLQotVGh1IEphbiAyOSAxNDo0Mjo0NCAxOTk4ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogTWFrZWZpbGUuYW0gKENPTkZJR19PQkpTKTogTmV3IHZhcmlhYmxlLCBjb250YWluaW5nIHBhcnQgb2Ygb2xkCi0JT0JKUyB2YXJpYWJsZS4KLQkoR0VORVJJQ19PQkpTKTogTmV3IHZhcmlhYmxlLCB3aXRoIHRoZSByZXN0IG9mIHRoZSBvbGQgT0JKUwotCXZhcmlhYmxlLgotCShPQkpTKTogTm93IGp1c3QgJChDT05GSUdfT0JKUykgYW5kICQoR0VORVJJQ19PQkpTKS4KLQkoJChzcmNkaXIpL21ha2UtZ2FzLmNvbSk6IFJlbmFtZSBmcm9tIG1ha2UtZ2FzLmNvbS4KLQkoc3RhbXAtbWsuY29tKTogUmVwbGFjZSAkKE9CSlMpIHdpdGggJChHRU5FUklDX09CSlMpLgotCShFWFRSQV9ESVNUKTogRGVmaW5lLgotCSogdm1zY29uZi5zaDogSGFuZGxlIHt0YXJnLWNwdSwgb2JqLWZvcm1hdCwgYXRvZi10YXJnfSBtb2R1bGVzCi0JZXhwbGljaXRseSByYXRoZXIgdGhhbiB2aWEgdGhlIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzLgotCShnY2MtYXMub3B0KTogTmV3IGZpbGUgY3JlYXRlZCB3aGVuIG1ha2UtZ2FzLmNvbSBpcyBydW4uCi0JKiBjb25maWctZ2FzLmNvbTogQ3JlYXRlIHt0YXJnLWNwdS5oLCBvYmotZm9ybWF0LmgsIHRhcmctZW52LmgsCi0JaXRibC1jcHUuaH0gdG8gI2luY2x1ZGUgYXBwcm9wcmlhdGUgZmlsZSByYXRoZXIgdGhhbiBjb3B5aW5nIHRoYXQKLQlmaWxlLgotCSogY29uZmlnL3Ztcy1jb25mLmg6IFN5bmNocm9uaXplIHdpdGggY3VycmVudCBjb25maWcuaW4uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IEphbiAyOSAxODo0ODoxOSAxOTk4ICBCaWxsIE1veWVyICA8YmlsbG1AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZG9fYXNzZW1ibGUpOiBBZGRlZCBmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwuCi0JKHBhcmFsbGVsX29rKTogUmVsYXhlZCBwYXJhbGxlbCBzdWJpbnN0cnVjdGlvbiBkZXBlbmRlbmN5IGNoZWNrLgotCi1XZWQgSmFuIDI4IDE0OjM1OjAwIDE5OTggIEJpbGwgTW95ZXIgPGJpbGxtQGN5Z251cy5jb20+Ci0KLQkqIGFzLmggKGZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApOiBhZGRlZCBuZXcgZmxhZy4KLQkqIHRjLWQxMHYuYyAobWRfcGFyc2Vfb3B0aW9uLG1kX2xvbmdvcHRzKTogYWRkZWQgIi0tbm93YXJuc3dhcCIgCi0JY29tbWFuZCBsaW5lIGFyZ3VtZW50LgotCSogdGMtZDEwdi5jICh3cml0ZV8yX3Nob3J0KTogZW1pdCAiU3dhcHBpbmcgaW5zdHJ1Y3Rpb25zIgotCXdhcm5pbmcgb25seSBpZiBmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwIGlzIGZhbHNlLgotCi1XZWQgSmFuIDI4IDE2OjQxOjE5IDE5OTggIEouSi4gdmFuIGRlciBIZWlqZGVuICA8Si5KLnZhbmRlckhlaWpkZW5Ac3R1ZGVudC51dHdlbnRlLm5sPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1taW5ndzMyKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBKYW4gMjggMTQ6NTE6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogRG9uJ3Qgc2V0IHRoZSBzZWdtZW50IGlmIGl0Ci0JaGFzbid0IGNoYW5nZWQsIGFuZCB0aGlzIGlzIE9CSl9BT1VUIHdpdGhvdXQgQkZEX0FTU0VNQkxFUi4KLQotCSogY29uZmlnL29iai1hb3V0LmggKFNfSVNfTE9DQUwpOiBDb3JyZWN0IHR5cG8tLXBhc3MgYXJndW1lbnQgdG8KLQlTX0dFVF9TRUdNRU5ULgotCi1XZWQgSmFuIDI4IDEzOjU0OjUwIDE5OTggIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JYXMuaCAodW5saW5rKTogUmV2ZXJzZSAxMy1GZWItOTcgY2hhbmdlOyB1c2Ugb2YgdW5saW5rIHZzIHJlbW92ZQotCWRlcGVuZHMgdXBvbiBIQVZFX3tVTkxJTkssUkVNT1ZFfSB2YWx1ZXMgcmF0aGVyIHRoYW4gaG9zdAotCWNvbXBpbGVyLgotCi1XZWQgSmFuIDI4IDEzOjQ4OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKFJFU09MVkVfU1lNQk9MX1JFREVGSU5JVElPTik6IERlZmluZS4KLQotV2VkIEphbiAyOCAwOTo1MjowMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX2luc2VydF9vcGVyYW5kKTogRGlzcGxheSBpbnN0cnVjdGlvbiB3aGVuCi0JYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQuCi0KLVR1ZSBKYW4gMjcgMTM6MzI6MDEgMTk5OCAgUm9iZXJ0IExpcGUgIDxyb2JlcnRsQGRnaWkuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1zY28zLjJ2NSopOiBEZWZhdWx0cyB0byBFTEYgbm93LgotCShpMzg2LSotc2NvMy4ydjUqY29mZik6IE5ldyB0YXJnZXQuCi0JKGkzODYtKi1zY28zLjIqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEphbiAyNyAxMTowNjo1MiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jOiBUaWR5IGVycm9yIG1lc3NhZ2UgcHJvZHVjdGlvbi4KLQotVHVlIEphbiAyNyAxMjoyNDozMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEFkZCBuZXcgdmFyaWFibGUgbmV3aW1tIHRvIGhvbGQKLQl2YWxpZGF0ZV9pbW1lZGlhdGUgcmV0dXJuIHZhbHVlIGluIHRoZSByaWdodCB0eXBlIGZvciBjb21wYXJpc29ucwotCXRvIEZBSUwuCi0KLVR1ZSBKYW4gMjcgMDY6NTE6NTkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jIChNQVhfQllURVMpOiBVc2UgbGlzdGluZyB2YXJpYWJsZXMgbm90IGNvbnN0YW50cy4KLQkoZGF0YV9idWZmZXIpOiBObyBsb25nZXIgYW4gYXJyYXksIGJ1dCBhIHBvaW50ZXIuCi0JKGNhbGNfaGV4KTogc2l6ZW9mKGRhdGFfYnVmZmVyKSAtPiBNQVhfQllURVMuCi0JKGxpc3RpbmdfbGlzdGluZyk6IEFsbG9jYXRlIGRhdGFfYnVmZmVyLgotCi1UdWUgSmFuIDI3IDA2OjM4OjM1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBBZGQgLS1saXN0aW5nLWxocy13aWR0aCwgLS1saXN0aW5nLWxocy13aWR0aDIsCi0JLS1saXN0aW5nLXJocy13aWR0aCwgLS1saXN0aW5nLWNvbnQtbGluZXMuCi0JKHNob3dfdXNhZ2UpOiBVcGRhdGUuCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbGhzX3dpZHRoLCBsaXN0aW5nX2xoc193aWR0aF9zZWNvbmQpOiBOZXcgdmFycy4KLQkobGlzdGluZ19saHNfY29udF9saW5lcywgbGlzdGluZ19yaHNfd2lkdGgpOiBOZXcgdmFycy4KLQkocHJpbnRfbGluZXMpOiBVc2UgdGhlIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIHRoZSBjb25zdGFudHMuCi0JKGxpc3RpbmdfbGlzdGluZyk6IExpa2V3aXNlLgkKLQkqIGxpc3RpbmcuaDogRGVjbGFyZSB0aGUgbmV3IHZhcnMuCi0JCi1UdWUgSmFuIDI3IDA1OjMyOjA1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBBZGQgLS1rZWVwLWxvY2FscyBhbGlhcyBmb3IgLUwuCi0JQWRkIC0tc3RyaXAtbG9jYWwtYWJzb2x1dGUuCi0JKHNob3dfdXNhZ2UpOiBVcGRhdGUuCi0JKiBhcy5oIChmbGFnX3N0cmlwX2xvY2FsX2Fic29sdXRlKTogTmV3IGZsYWcuCi0JKiBzeW1ib2xzLmMgKFNfSVNfTE9DQUwpOiBVc2UgaXQuCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoU19JU19MT0NBTCk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1ib3V0LmggKFNfSVNfTE9DQUwpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTX0lTX0xPQ0FMKTogTGlrZXdpc2UuCi0KLU1vbiBKYW4gMjYgMTM6MDc6NDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYzogRGV0ZWN0IGlmIGV4cGxpY2l0bHkgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zCi0JbWlnaHQgaGF2ZSBhbiBpbyBjb25mbGljdCBhbmQgaXNzdWUgYSB3YXJuaW5nIG1lc3NhZ2UuIAotCi1UaHUgSmFuIDIyIDE3OjUxOjQ0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYyAoY2dlbl9zYXZlX2ZpeHVwcywgY2dlbl9yZXN0b3JlX2ZpeHVwcywKLQljZ2VuX3N3YXBfZml4dXBzKTogRnVuY3Rpb25zIHRvIHNhdmUsIHJlc3RvcmUgYW5kIHN3YXAgdGhlIGZpeHVwCi0JY2hhaW4gd2l0aCBhIGJhY2t1cCBjb3B5LgotCShjZ2VuX2FzbV9maW5pc2hfaW5zbik6IFJldHVybnMgYWRkcmVzcyBvZiBjb25zdHJ1Y3RlZCBpbnNuLgotCi1XZWQgSmFuIDIxIDE2OjQ5OjEwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAoZmlsZV9pbmZvX3N0cnVjdCk6IFJlbW92ZSBGSUxFLCBhZGQgUE9TLgotCShsYXN0X29wZW5fZmlsZV9pbmZvLCBsYXN0X29wZW5fZmlsZSk6IE5ldzsgYSBvbmUgZW50cnkgRklMRSogY2FjaGUuCi0JKGZpbGVfaW5mbyk6IERvbid0IG9wZW4gdGhlIGZpbGUuCi0JKGJ1ZmZlcl9saW5lKTogQ2hlY2sgZm9yIHRoZSBmaWxlIGluIHRoZSBsYXN0X29wZW4gY2FjaGUsIHVwZGF0aW5nCi0JYXMgbmVjZXNzYXJ5LgotCShwcmludF9zb3VyY2UpOiBEb24ndCByZWZlcmVuY2UgZmlsZV9pbmZvLT5maWxlLgotCShsaXN0aW5nX2xpc3RpbmcpOiBMaWtld2lzZS4KLQkobGlzdGluZ19wcmludCk6IENsb3NlIHRoZSBmaWxlIGluIHRoZSBjYWNoZSwgaWYgYW55LgotCi1GcmkgSmFuIDE2IDE0OjUxOjQ4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChkd2FyZl9maWxlX3N0cmluZyk6IE5ldyBmaWxlIHN0YXRpYyB2YXJpYWJsZS4KLQkoZW1pdF9leHByKTogTG9vayBmb3IgY29uc3RhbnQgc2VxdWVuY2UgdGhhdCBsZWFkcyB1cCB0byBhIGZpbGUKLQluYW1lIGluIERXQVJGIGRlYnVnZ2luZyBvdXRwdXQuCi0JKHN0cmluZ2VyKTogVXNlIGR3YXJmX2ZpbGVfc3RyaW5nIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGFjY2VwdCBhCi0Jc3RyaW5nIGFzIGEgZmlsZSBuYW1lLgotCi1GcmkgSmFuIDE2IDExOjMwOjM3IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRjLW02OGsuYyAobTY4a19pcCk6IFJlbW92ZSBhYnNsLT5yZWdsc3QgTVJJIGhhY2suCi0JKGNyYWNrX29wZXJhbmQpOiBBZGQgcmVnLT5yZWdsc3QgTVJJIGhhY2suCi0JKHJfc2VnKTogUHV0IHJlZ2xzdCBzeW1ib2xzIGluIHJlZ19zZWN0aW9uLgotCShtNjhrX2Zyb2Jfc3ltYm9sKTogRnJvYiByZWdsc3Qgc3ltYm9scyBpbnRvIGFic29sdXRlX3NlY3Rpb24uCi0KLVRodSBKYW4gMTUgMTQ6MTk6MDEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGMtc2guYyAoZ2V0X3NwZWNpZmljKTogSGFuZGxlIFNHUiAmIERCUi4KLQotVGh1IEphbiAxNSAxMzo0Njo0OCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0Yy1oODMwMC5jIChwYXJzZV9yZWcpOiBUYWtlIHRoZSBsZW5ndGggb2YgdGhlIHN5bWJvbCBpbnRvCi0JYWNjb3VudCB3aGVuIGF0dGVtcHRpbmcgdG8gbWF0Y2ggYSByZWdpc3RlciBuYW1lLgotCSogdGMtaDg1MDAuYyAocGFyc2VfcmVnKTogTGlrZXdpc2UuCi0KLVdlZCBKYW4gMTQgMTc6NTI6MzMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jOiBGb3JtYXR0aW5nIGNoYW5nZXMgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KLQotV2VkIEphbiAxNCAxNTo0MTo0MSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogUmV3b3JrIGRpdmlzaW9uIGNvZGUgdG8gYXZvaWQgdW5maWxsZWQKLQlkZWxheSBzbG90LgotCi1XZWQgSmFuIDE0IDE4OjA0OjIwIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gYSBwYXRjaCBmcm9tIEppbSBXaWxzb24KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGRvX2Fzc2VtYmxlKTogUmVtb3ZlIG5vbi1hbnNpIGRlZmF1bHQgY2FzZS4KLQkodGNfZ2VuX3JlbG9jKTogSGFuZGxlIGNyb3NzIHNlY3Rpb24gUEMgcmVsYXRpdmUgcmVsb2NzCi0JY29ycmVjdGx5LgotCi1XZWQgSmFuIDE0IDE1OjAyOjE5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRG9uJ3QgdGVzdCBwaW5mbyBmbGFncyBpZiBJTlNOX01BQ1JPLgotCi1Nb24gSmFuIDEyIDEzOjA0OjU3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmM6ICNpbmNsdWRlIHNldGptcC5oLiAgQ2xlYW4gdXAgcGFzcyBvdmVyIGBzdHJ1Y3QgZm9vJyB1c2FnZS4KLQkoZXhwcl9qbXBfYnVmKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkoY2dlbl9wYXJzZV9vcGVyYW5kKTogQWxsb3cgdXNlIG9mIGxvbmdqbXAgaW4gcGFyc2luZyB0byBoYW5kbGUgZXJyb3JzLgotCShjZ2VuX21kX29wZXJhbmQpOiBOZXcgZnVuY3Rpb24uCi0JKiB0Yy1tMzJyLmM6IENsZWFuIHVwIHBhc3Mgb3ZlciBgc3RydWN0IGZvbycgdXNhZ2UuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogVXNlIENHRU5fSU5TTl9NTkVNT05JQy4KLQotVHVlIEphbiAgNiAxNTozNjowMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKFNfU0VUX1NFR01FTlQpOiBEb24ndCBzZXQgdGhlIHNlZ21lbnQgZm9yIHNlY3Rpb24gc3ltcy4KLQkoU19JU19FWFRFUk5BTCwgU19JU19MT0NBTCk6IENvcnJlY3QgcGFyZW50aGV0aWNhdGlvbi4KLQotRnJpIEphbiAgMiAxNjowODo1NCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IEdpdmUgYW4gZXJyb3IgaWYgdGhlcmUgYXJlCi0JdW5yZWNvZ25pemVkIGNoYXJhY3RlcnMgYWZ0ZXIgYW4gZXhwcmVzc2lvbi4KLQotRm9yIG9sZGVyIGNoYW5nZXMgc2VlIENoYW5nZUxvZy05Njk3CmRpZmYgLS1naXQgYS9nYXMvQ2hhbmdlTG9nLTkyOTUgYi9nYXMvQ2hhbmdlTG9nLTkyOTUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYTQ4ZTYuLjAwMDAwMDAKLS0tIGEvZ2FzL0NoYW5nZUxvZy05Mjk1CisrKyAvZGV2L251bGwKQEAgLTEsMTMxMTAgKzAsMCBAQAotU2F0IERlYyAzMCAyMzo0Mjo1MSAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N0YWIpOiBTaW1wbGlmeS4gIENvcnJlY3RseSBoYW5kbGUgc3ltICsgb2Zmc2V0Ci0JYWRkcmVzc2VzIGZvciBzdGF0aWMgdmFyaWFibGVzLgotCi1UaHUgRGVjIDIxIDEyOjU0OjMyIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtYXBwaW5nKTogTWFrZSBAZ290IGdpdmUgYSByZWFsIEdPVCByZWxvY2F0aW9uLAotCWFuZCB4Z290IGdpdmUgdGhlIG9sZCB0b2MxNiByZWxvY2F0aW9uLgotCShtZF9hcHBseV9maXgzKTogU3VwcG9ydCBhbGwgR09UIHJlbG9jYXRpb25zLgotCi1XZWQgRGVjIDIwIDE0OjU3OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9hZGRyZXNzKTogQ29ycmVjdGx5IGhhbmRsZSBhIGNvbnN0YW50IGluCi0JU1ZSNF9QSUMgY2FzZS4gIEZyb20gUmljaGFyZCBLZW5uZXIgPGtlbm5lckB2bHNpMS51bHRyYS5ueXUuZWR1Pi4KLQotRnJpIERlYyAxNSAxNDoyNTowNyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChwYXJzZV9yZWcpOiBSZWNvZ25pemUgU0gzIHJlZ2lzdGVycy4KLQkoZ2V0X3NwZWNpZmljKTogSGFuZGxlIEFfU1NSLCBBX1NQQyBhbmQgQV9SRUdfQi4KLQkoYnVpbGRfTWJ5dGVzKTogSGFuZGxlIFJFR19CLgotCi1GcmkgRGVjIDE1IDE2OjA3OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfYXV4KTogVXNlIG5ldyBiZmRfYmlnX2VuZGlhbiBtYWNyby4KLQotRnJpIERlYyAxNSAxMjoxMTo0OCAxOTk1ICBSYXltb25kIEpvdSAgPHJqb3VAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IElmIGxpbmtpbmcsIGVkaXQgQUxMX0NGTEFHUyB0byBDRkxBR1MuCi0KLVRodSBEZWMgMTQgMTU6MDk6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBTZXQgdGhlIHNfYWxpZ24gZmllbGQgdG8KLQl0aGUgbnVtYmVyIG9mIGJ5dGVzLCByYXRoZXIgdGhhbiB0byB0aGUgcG93ZXIgb2YgMi4KLQotVHVlIERlYyAxMiAxMjoxOTozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNUQ0xFQU5fSEVSRSk6IE5ldyB2YXJpYWJsZS4KLQkoZGlzdGNsZWFuKTogVXNlIGl0LgotCShtYWludGFpbmVyLWNsZWFuKTogRGVwZW5kIHVwb24gY2xlYW4taGVyZSByYXRoZXIgdGhhbiBjbGVhbiwKLQlkaXN0Y2xlYW4sIGFuZCBjbGVhbi1pbmZvLiAgUnVuIG1ha2UgbWFpbnRhaW5lci1jbGVhbiBpbiBkb2MuCi0JUmVtb3ZlIGZpbGVzIGxpc3RlZCBpbiBESVNUQ0xFQU5fSEVSRS4KLQkqIGRvYy9NYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4pOiBTcGxpdCBvdXQgZnJvbQotCWRpc3RjbGVhbi4gIERlcGVuZCB1cG9uIGNsZWFuLWluZm8gYW5kIGRpc3RjbGVhbi4KLQotTW9uIERlYyAxMSAxNjoyMzo1MSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1hYy1hcy5yOiBGaXggY29weXJpZ2h0IGFuZCB2ZXJzaW9uIHN0cmluZ3MuCi0JKGNmcmcpOiBVc2UgUFJPR19OQU1FIGluc3RlYWQgb2YgbGl0ZXJhbCBuYW1lLgotCi1Nb24gRGVjIDExIDE0OjE0OjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBJZiB0Y191bnJlY29nbml6ZWRfbGluZSBpcyBkZWZpbmVkLAotCWNhbGwgaXQuCi0JKiBjb25maWcvdGMtYTI5ay5oICh0Y191bnJlY29nbml6ZWRfbGluZSk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKGEyOWtfdW5yZWNvZ25pemVkX2xpbmUpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX29wZXJhbmQpOiBIYW5kbGUgYTI5ayBzdHlsZSBsb2NhbCBkb2xsYXIgbGFiZWxzLgotCi1XZWQgRGVjICA2IDE3OjUyOjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1tdWx0aS5oOiBJZiBPQkpfTUFZQkVfRUxGLCBkZWZpbmUgT0JKX1NZTUZJRUxEX1RZUEUuCi0KLVR1ZSBEZWMgIDUgMTM6MjY6MzQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19maWxsKTogSWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgaXMgZGVmaW5lZCwgY2FsbAotCWl0LgotCi1Nb24gRGVjICA0IDE1OjEwOjUzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc2l6ZV9zZWN0aW9uLCBmaWxsX3NlY3Rpb24sIGZpeHVwX21kZXBzKToKLQlUcmVhdCByc19hbGlnbl9jb2RlIGxpa2UgcnNfYWxpZ24uCi0KLVN1biBEZWMgIDMgMTY6NDY6NTQgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBjb25maWcvdGMtYXJtLmMgKGNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZSk6IFNldCBwcmVfaW5jIHdoZW4KLQljb252ZXJ0aW5nIGFuIGFic29sdXRlIGFkZHJlc3MgaW50byBhIFBDLXJlbGF0aXZlIG9uZS4KLQotRnJpIERlYyAgMSAxMTo1Nzo1NiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IERvbid0IGFsd2F5cyB1c2UgdGUtZ2VuZXJpYy5oIGZvciBlbXVsYXRpb24uCi0JKHBvd2VycGMtYXBwbGUtbWFjb3MpOiBVc2UgZW11bGF0aW9uIHRlLW1hY29zLmguCi0JKiBtcHctbWFrZS5zZWQgKGluc3RhbGwsIGluc3RhbGwtb25seSk6IEVkaXQgaW4gTWFjLXNwZWNpZmljCi0JaW5zdGFsbCBwcm9jZWR1cmUuCi0KLUZyaSBEZWMgIDEgMTA6NTk6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEltcHJvdmUgbWVzc2FnZSBhYm91dCB1bnN1cHBvcnRlZCBFTEYgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLW04OGsuYyAobTg4a19kb19hbGlnbik6IENvcnJlY3QgY2hlY2sgZm9yIHdoZXRoZXIgZmlsbAotCXBhdHRlcm4gaXMgemVyby4gIEZyb20gTWFuZnJlZCBIb2xsc3RlaW4uCi0KLVRodSBOb3YgMzAgMTM6MjU6NDkgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3BlX3NlY3Rpb24pOiBUbyBnZXQgdGhlIGFsaWdubWVudCByaWdodCBmb3IKLQl0aGUgdmFyaW91cyBpZGF0YSBzZWN0aW9ucywgd2UgY2hlY2sgdGhlIG5hbWUgb24gdGhlIC5zZWN0aW9uIHBzZXVkby4KLQotVGh1IE5vdiAzMCAxMToyMzo0MiAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBJZiBUQ19NODhLIGlzIGRlZmluZWQsIGRvIG5vdAotCWFkZCBzZWN0aW9uJ3MgcGFkZHIgdG8gYWRkX251bWJlcjsgY29tcGF0aWJpbGl0eSB0byBuYXRpdmUgYXMgYW5kCi0JbGQgZm9yYmlkcy4KLQotV2VkIE5vdiAyOSAyMzoxNDoyNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBUcmVhdCBtNjhrLXN5c3Y0IGxpa2UgbTY4ay1lbGYsIG5vdCBtNjhrLXN5c3YzLgotCi0JKiBoYXNoLmMgKHN0cnVjdCBoYXNoX2VudHJ5KTogTW92ZWQgaGVyZS4uLgotCSogaGFzaC5oIChzdHJ1Y3QgaGFzaF9lbnRyeSk6IC4uLmZyb20gaGVyZS4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgZnJlZSBhbmQgY2xlYXIgc3lfb2JqCi0JaWYgaXQncyBhbHJlYWR5IGtub3duIHRvIGJlIG51bGwuCi0KLVdlZCBOb3YgMjkgMTM6MDA6MjAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBEb24ndCBhZGp1c3QgdGhlIHZhbHVlIGZvciAzMgotCWJpdCByZWxvY3MgY29udmVydGVkIHRvIFBDIHJlbGF0aXZlIHJlbG9jcy4gIFRoaXMgdHVybmVkIG91dCB0bwotCWFkZCB0aGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiAudGV4dCB0d2ljZS4KLQotVHVlIE5vdiAyOCAxMDo0MjozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoc19zdGFiX2dlbmVyaWMpOiBJbiAncycgY2FzZSwgZnJlZSBzdHJpbmcgZnJvbQotCW9ic3RhY2suCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IFJlbW92ZSB1bnVzZWQgZmllbGQKLQlzeV9uYW1lX29mZnNldC4KLQkqIGNvbmZpZy9vYmotbXVsdGkuaCAoRUxGX1RBUkdFVF9TWU1CT0xfRklFTERTKSBbT0JKX01BWUJFX0VMRl06Ci0JRGl0dG8uCi0KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBNYWtlIGJpdGZpZWxkcyB1bnNpZ25lZC4KLQotCSogZXhwci5oIChzdHJ1Y3QgZXhwcmVzc2lvblMpOiBNYWtlIFhfb3AgYW5kIFhfdW5zaWduZWQgYml0ZmllbGRzLAotCWFuZCBtb3ZlIHRoZW0gdG9nZXRoZXIuICBPbiBtb3N0IHN5c3RlbXMgdGhpcyB3aWxsIHJlZHVjZSB0aGUKLQlzdHJ1Y3R1cmUgc2l6ZSBieSBvbmUgd29yZC4KLQkob3BlcmF0b3JUKTogRGVmaW5lIE9fbWF4LgotCSogZXhwci5jIChleHByX2JlZ2luKTogVmVyaWZ5IHRoYXQgWF9vcCBpcyB3aWRlIGVub3VnaCB0byBob2xkCi0JT19tYXguCi0KLQkqIHJlYWQuYyAocG9wX2luc2VydCk6IFByaW50IGVycm9yIHJldHVybmVkIGJ5IGhhc2ggdGFibGUKLQlpbnNlcnRpb24gY29kZS4KLQotCSogYXMuYyAoZHVtcF9zdGF0aXN0aWNzKTogU3BsaXQgb3V0IGZyb20gbWFpbjsgZHVtcCBzb21lIGhhc2gKLQl0YWJsZSBzdGF0cyBhbmQgdGFyZ2V0LXNwZWNpZmljIHN0YXRzLgotCShzdGFydF90aW1lKTogTm8gbG9uZ2VyIGF1dG9tYXRpYyB0byBtYWluLgotCShtYWluKTogU2V0IGZpbGUtbGV2ZWwgc3RhcnRfdGltZSBhbmQgY2FsbCBkdW1wX3N0YXRpc3RpY3MgYXQKLQlleGl0LiAgRXhpdCBieSBjYWxsaW5nIHhleGl0LgotCShzaG93X3VzYWdlKTogTWFrZSAtLXN0YXRpc3RpY3MgZGVzY3JpcHRpb24gbGVzcyBzcGVjaWZpYy4KLQkqIHN1YnNlZ3MuYyAoc3Vic2Vnc19wcmludF9zdGF0aXN0aWNzKTogTmV3IGZ1bmN0aW9uLgotCSogd3JpdGUuYyAod3JpdGVfcHJpbnRfc3RhdGlzdGljcyk6IE5ldyBmdW5jdGlvbi4KLQkobl9maXh1cHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShmaXhfbmV3X2ludGVybmFsKTogSW5jcmVtZW50IGl0LgotCSogcmVhZC5jIChyZWFkX3ByaW50X3N0YXRpc3RpY3MpOiBOZXcgZnVuY3Rpb24uCi0JKiByZWFkLmggKHJlYWRfcHJpbnRfc3RhdGlzdGljcyk6IERlY2xhcmUuCi0JKiBzeW1ib2wuYyAoc3ltYm9sX3ByaW50X3N0YXRpc3RpY3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBzeW1ib2wuaCAoc3ltYm9sX3ByaW50X3N0YXRpc3RpY3MpOiBEZWNsYXJlLgotCSogaGFzaC5jIChoYXNoX3ByaW50X3N0YXRpc3RpY3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBoYXNoLmggKGhhc2hfcHJpbnRfc3RhdGlzdGljcyk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X3ByaW50X3N0YXRpc3RpY3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtaTM4Ni5oIChpMzg2X3ByaW50X3N0YXRpc3RpY3MpOiBEZWNsYXJlLgotCSh0Y19wcmludF9zdGF0aXN0aWNzKTogTmV3IG1hY3JvLgotCSogbWVzc2FnZXMuYyAoYXNfZmF0YWwsIGFzX2Fzc2VydCwgYXNfYWJvcnQpOiBVc2UgeGV4aXQsIG5vdAotCWV4aXQuCi0KLQkqIGhhc2guYyAoREVMRVRFRCk6IFJld3JpdGUgdG8gdXNlIGEgdmFsaWQgYnV0IHVuaXF1ZSBhZGRyZXNzLgotCShTVEFSVF9QT1dFUik6IFJlZHVjZSB0byAxMC4KLQkoZW51bSBzdGF0X2VudW0pOiBOZXcgZW51bWVyYXRvciwgcmVwbGFjaW5nIFNUQVRfKiBpbmRleCBtYWNyb3MuCi0JQWRkIG5ldyB2YWx1ZXMgZm9yIGNvdW50aW5nIHN0cmNtcCBjYWxscy4KLQkoR1JPV19GQUNUT1IpOiBOZXcgbWFjcm8uCi0JKGhhc2hfZ3Jvdyk6IFVzZSBHUk9XX0ZBQ1RPUi4gIFJld3JpdGUgZm9yIHF1aWNrIHJldHVybnMgaW5zdGVhZAotCW9mIG5lc3RpbmcgYmxvY2tzLgotCShGVUxMX1ZBTFVFKTogTmV3IG1hY3JvLiAgVXNlIDEvNCBvZiB0YWJsZSBzaXplIGluc3RlYWQgb2YgMS8yLgotCShoYXNoX25ldyk6IFVzZSBGVUxMX1ZBTFVFLgotCShzdHJ1Y3QgaGFzaF9jb250cm9sKTogRGVmaW5pdGlvbiBtb3ZlZCBoZXJlLgotCShoYXNoX2NvZGUpOiBEb24ndCBtYXNrIHRvIGxvdyBiaXRzLgotCShoYXNoX2Fzayk6IE1hc2sgcmV0dXJuZWQgaGFzaCBjb2RlIGhlcmUuICBDaGVjayBoYXNoIHZhbHVlIGJlZm9yZQotCWNhbGxpbmcgc3RyY21wOyBjb3VudCBzdHJjbXAgY2FsbHMuCi0JKiBoYXNoLmggKHN0cnVjdCBoYXNoX2NvbnRyb2wpOiBEZWNsYXJlLCBkb24ndCBkZWZpbmUsIGhlcmUuCi0JKEhBU0hfU1RBVExFTkdUSCk6IERlbGV0ZWQuCi0JKHN0cnVjdCBoYXNoX2VudHJ5KTogQWRkIGZpZWxkIGZvciBoYXNoIGNvZGUuCi0JKGhhc2hfc2F5LCBoYXNoX2FwcGx5KTogRG9uJ3QgZGVjbGFyZS4KLQotCSogaGFzaC5jIChkZXN0cm95KTogUmV0dXJuIHZvaWQuCi0JKGFwcGxpY2F0ZWUpOiBEaXR0by4KLQkobWFpbik6IEZpeCBkZWNsYXJhdGlvbnMuCi0JKGhhc2hfYXBwbHkpOiBSZXR1cm4gdm9pZC4gIEFyZ3VtZW50IGBmdW5jdGlvbicgcmV0dXJucyB2b2lkLiAgUHV0Ci0JaW5zaWRlICIjaWZkZWYgVEVTVCIuCi0JKGhhc2hfc2F5KTogRGVmaW5lIG9ubHkgaWYgVEVTVCBpcyBkZWZpbmVkLgotCSogaGFzaC5oIChoYXNoX2FwcGx5LCBoYXNoX3NheSk6IERlY2xhcmF0aW9ucyBkZWxldGVkLgotCi1Nb24gTm92IDI3IDEzOjE4OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi43LgotCi1UdWUgTm92IDIxIDE4OjM5OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCAoQUNfUFJPR19DQyk6IFJlbW92ZSBsb2NhbCBkZWZpbml0aW9uLgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi42LgotCi1Nb24gTm92IDIwIDE3OjI2OjAwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZGVidWdfbmFtZV9zZWN0aW9uX3NpemUpOiBSZW1vdmUuCi0JKHBwY19zdGFieCk6IERvbid0IGluY3JlbWVudCBwcGNfZGVidWdfbmFtZV9zZWN0aW9uX3NpemUuCi0JKHBwY19iYyk6IExpa2V3aXNlLgotCShwcGNfZnJvYl9maWxlKTogUmVtb3ZlLgotCSogY29uZmlnL3RjLXBwYy5oICh0Y19mcm9iX2ZpbGUpOiBEb24ndCBkZWZpbmUuCi0JKHBwY19mcm9iX2ZpbGUpOiBEb24ndCBkZWNsYXJlLgotCi1Nb24gTm92IDIwIDEzOjM3OjA1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVEFSR19DUFVfREVQX2FscGhhKTogTWVudGlvbiBhbHBoYS1vcGNvZGUuaC4KLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogSW5jbHVkZSBvbmUtb3BlcmFuZCB2YXJpYW50cyBvZiBqbXAgYW5kCi0JanNyLgotCi0JKiBjb25maWcvdGUtZGVsdDg4Lmg6IFJlbmFtZWQgZnJvbSB0ZS1kZWx0YTg4LmgsIHRvIGF2b2lkIGNvbmZsaWN0Ci0Jd2l0aCB0ZS1kZWx0YS5oIGluIDguMyBmaWxlIHN5c3RlbXMuCi0JKiBjb25maWd1cmUuaW46IEFkanVzdGVkLgotCi1UaHUgTm92IDE2IDEyOjQ5OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoc19lcnIpOiBSZW1vdmU7IGp1c3QgdXNlIHRoZSBvbmUgaW4gcmVhZC5jLgotCi0JKiBjb25maWcvbTY4ay1wYXJzZS55ICh5eWxleCk6IEluIE1SSSBtb2RlLCAnQCcgY2FuIHN0YXJ0IGFuIG9jdGFsCi0JbnVtYmVyLgotCSogZXhwci5jIChvcGVyYW5kKTogSGFuZGxlIE1SSSBzdWZmaXhlcyBhZnRlciB1bmFkb3JuZWQgMC4KLQotVGh1IE5vdiAxNiAwMDoyMTo0NCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCVZlcnNpb24gMi42IHJlbGVhc2VkLgotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGVkIHRvIDIuNi4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2hhbmdlIHVzZSBvZiBtZF9kb19hbGlnbgotCXRvIHBhc3MgYSBwb2ludGVyIHJhdGhlciB0aGFuIGEgZmlsbCB2YWx1ZSwgdG8gbWF0Y2ggb3RoZXIgdXNlcy4KLQotV2VkIE5vdiAxNSAwMzo1MjowMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW5zMzJrLmggKFRDX0ZJWF9UWVBFKTogQWRkIG1pc3Npbmcgc2VtaWNvbG9uLgotCi0JKiBhcy5jIChtYWluKTogTW92ZSBtZF9lbmQgY2FsbCB0byBqdXN0IGFmdGVyIGNhbGwgdG8KLQlwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MuICBEZWxldGUgY3B1LXNwZWNpZmljIGNvZGUgaGVyZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKG1kX2VuZCk6IE5ldyBtYWNybywgY2FsbHMgYnJ0YWJfZW1pdC4KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfZW5kKTogVW51c2VkIGZ1bmN0aW9uIGRlbGV0ZWQuCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfZW5kKTogRGl0dG8uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfYWxpZ25fY29kZSk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaGVyZQotCWZyb20gSEFORExFX0FMSUdOIG1hY3JvLgotCSogY29uZmlnL3RjLWkzODYuaCAoSEFORExFX0FMSUdOKTogQ2FsbCBpdC4KLQotCU1vbiBKdWwgMzEgMTQ6NTM6MTkgMTk5NSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChtZF9kb19hbGlnbik6IGNhc3QgZmlsbCBhbmQgMHg5MCB0byBjaGFyCi0gCWJlZm9yZSBjb21wYXJpbmcKLQotCU1vbiBNYXkgIDEgMTA6OTE6NDkgMTk5NSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChtZF9kb19hbGlnbik6ICBNYWtlICIuYWxpZ24gbiwweDkwIiBnZW5lcmF0ZQotCW11bHRpLWJ5dGUgbm9wcyB0byBhdm9pZCBjaGFuZ2luZyBnY2MuICBUaGUgbmVjZXNzYXJ5IGdjYyBjaGFuZ2UKLQltaWdodCBicmVhayBvbGQgYXNzZW1ibGVycy4KLQotCVNhdCBBcHIgMjIgMjA6NTM6MDUgMTk5NSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChtZF9kb19hbGlnbiwgSEFORExFX0FMSUdOKTogIEFkZCBtYWNyb3MgdG8KLQlnZW5lcmF0ZSBvcHRpbWFsIG11bHRpLWJ5dGUgbm9wIGluc3RydWN0aW9ucyBmb3IgIi5hbGlnbiBuIgotCSIuYWxpZ24gbiwweDkwIiwgYW5kIGFsaWducyByZXF1aXJpbmcgbW9yZSB0aGFuIDE1IGJ5dGVzIG9mCi0JcGFkZGluZyBzdGlsbCBnZW5lcmF0ZSBtdWx0aXBsZSAweDkwJ3MgYXMgYmVmb3JlLgotCi1Nb24gTm92IDEzIDE3OjQwOjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoc19tcmlfdW50aWwpOiBDYWxsIHBvcF9tcmlfY29udHJvbC4KLQotTW9uIE5vdiAxMyAyMDozOTowNiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocHBjLSotbWFjb3MqLCBwcGMtKi1tcHcqKTogTmV3IGNvbmZpZ3VyYXRpb25zLgotCSogY29uZmlndXJlOiBVcGRhdGUuCi0JKiBtcHctbWFrZS5zZWQ6IFJlb3JkZXIgY29tbWFuZHMgdG8gbWFrZSBzZWQgaGFwcGllci4KLQkqIGNvbmZpZy90ZS1tYWNvcy5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1wcGMuaCAoVEFSR0VUX0ZPUk1BVCk6IFNldCBjb3JyZWN0bHkgZm9yIFBvd2VyTWFjLgotCi1TdW4gTm92IDEyIDIxOjE0OjU2IDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBGaXggb2ZmLWJ5LTIgYnVnIGluIGxlbmd0aCBjaGVjayBmb3IKLQljb25kaXRpb25hbCBicmFuY2hlcy4KLQkobWRfYXBwbHlfZml4KTogTGlrZXdpc2UuCi0KLVRodSBOb3YgIDkgMTY6MTQ6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYTI5ay5jIChtZF9hcHBseV9maXgpOiBXYXJuIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0bwotCWdlbmVyYXRlIGEgcmVsb2Mgd2hpY2ggdGhlIGxpbmtlciB3aWxsIG5vdCBoYW5kbGUgY29ycmVjdGx5LiAgRml4Ci0Jb3ZlcmZsb3cgY2hlY2tpbmctLVJfSVJFTCBpcyAxOCBiaXRzLCBub3QgMTcuCi0KLVdlZCBOb3YgIDggMTk6NTk6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IHN1YnRyYWN0IG1kX3BjcmVsX2Zyb20KLQlmcm9tIGEgUEMgcmVsYXRpdmUgcmVsb2MgaWYgVENfQTI5Sy4KLQotCSogY29uZmlnL3RjLWEyOWsuYyAobGluZV9zZXBhcmF0b3JfY2hhcnMpOiBSZXN0b3JlICdAJy4gIEV4aXN0aW5nCi0JY29kZSBkZXBlbmRzIHVwb24gaXQuCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKG1kX29wZXJhbmQpOiBIYW5kbGUgJGZsb2F0LCAkZG91YmxlLCBhbmQKLQkkZXh0ZW5kLiAgQmFzZWQgb24gY29kZSBmcm9tIEVyaWMgRnJldWRlbnRoYWwKLQk8ZnJldWRlbnRoYWxAbnl1LmVkdT4uCi0JKiBjb25maWcvdGMtYTI5ay5oIChMRVhfRE9MTEFSKTogRGVmaW5lLgotCSogcmVhZC5jIChMRVhfRE9MTEFSKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShsZXhfdHlwZSk6IFVzZSBMRVhfRE9MTEFSLgotCi1XZWQgTm92ICA4IDE2OjM4OjE0IDE5OTUgIEVyaWMgRnJldWRlbnRoYWwgPGZyZXVkZW50aGFsQG55dS5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYTI5ay1ueXUtc3ltMSk6IE5ldyB0YXJnZXQsIGp1c3QgbGlrZSBvdGhlciBhMjlrCi0JdGFyZ2V0cy4KLQotV2VkIE5vdiAgOCAxMTozODo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX2RvdF9maWxlX3N5bWJvbCk6IENhc3QgeG1hbGxvYyByZXR1cm4uCi0KLVR1ZSBOb3YgIDcgMDk6MTQ6MzUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEFkZGVkIEJGRF9SRUxPQ19SVkEuIEN1cnJlbnRseQotCXVzZWQgb25seSBieSAiZGxsdG9vbC5jIi4KLQotTW9uIE5vdiAgNiAxODo1MToyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBVbmRlZmluZSBpbmxpbmUgaWYgbm90IF9fR05VQ19fLgotCShtZF9wc2V1ZG9fdGFibGUpOiBEb24ndCBkZWZpbmUgImV4dGVybiIuCi0KLVNhdCBOb3YgIDQgMDA6NTE6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19iaWVpKTogRm9yY2Ugc3ltYm9sIGludG8gdGV4dF9zZWN0aW9uLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3Nob3dfdXNhZ2UpOiBQdXQgYmFja3NsYXNoIGF0IGVuZCBvZiBsaW5lLgotCi1GcmkgTm92ICAzIDEzOjAyOjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWFjcm8uYyAobWFjcm9fZXhwYW5kX2JvZHkpOiBEb24ndCB3YXJuIGFib3V0ID09IHdpdGggYQotCW5vbmV4aXN0ZW50IHBhcmFtZXRlciwgaW4gY2FzZSBpdCBpcyBpbiBhIGNvbW1lbnQgZmllbGQuCi0KLQkqIGFzLmMgKG1haW4pOiBPbiBUQ19BMjlLLCBjYWxsIG1hY3JvX2luaXQgd2l0aCBtYWNyb19hbHRlcm5hdGUKLQlzZXQgdG8gMS4KLQkqIG1hY3JvLmMgKGdldF9hbnlfc3RyaW5nKTogRG9uJ3Qga2VlcCBxdW90ZXMgaWYgbWFjcm9fc3RyaXBfYXQgaXMKLQlzZXQsIGV2ZW4gaWYgbWFjcm9fYWx0ZXJuYXRlIGlzIHNldC4KLQkoZ2V0X2Fwb3N0X3Rva2VuKTogSWYgbWFjcm9fc3RyaXBfYXQsIG9ubHkgc2tpcCBraW5kIGlmIGl0IGlzICdAJy4KLQkoc3ViX2FjdHVhbCk6IElmIG1hY3JvX3N0cmlwX2F0LCBhbmQga2luZCBpcyAnQCcsIGRvbid0IGxvb2sgdXAKLQl0aGUgdG9rZW4gdW5sZXNzIGl0IGVuZGVkIGluICdAJy4KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKGxpbmVfc2VwYXJhdG9yX2NoYXJzKTogUmVtb3ZlICdAJy4KLQkqIGRvYy9jLWEyOWsudGV4aTogRG9jdW1lbnQgbWFjcm8gdXNhZ2Ugb24gQTI5Sy4KLQotVGh1IE5vdiAgMiAyMzowNzo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBIYW5kbGUgbmV3ICdXJyBwbGFjZSwgbWVhbmluZyBhCi0Jc2lnbmVkIHdvcmQuCi0JKGluc3RhbGxfb3BlcmFuZCk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlY29mZl9kZWJ1Z19wc2V1ZG9fdGFibGUpOiBBZGQgImV4dGVybiIuCi0KLVdlZCBOb3YgIDEgMTU6MTc6MDIgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobTg4ay1tb3Rvcm9sYS1zeXN2Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvdGUtZGVsdGE4OC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFVzZSBtZF9kb19hbGlnbiBpZiBpdCBpcwotCWRlZmluZWQuCi0JKiBjb25maWcvdGMtbTg4ay5oIChTVUJfU0VHTUVOVF9BTElHTik6IERlZmluZS4KLQkobWRfZG9fYWxpZ24pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbTg4ay5jOiBJbmNsdWRlICJzdWJzZWdzLmgiLgotCShtODhrX2RvX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBjb25maWcvdGUtZGVsdGEuaCAoU1RSSVBfVU5ERVJTQ09SRSk6IERvbid0IGRlZmluZS4KLQkoQ09GRl9OT0xPQURfUFJPQkxFTSk6IERlZmluZS4KLQkoTE9DQUxfTEFCRUxTX0RPTExBUiwgTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lLgotCi1XZWQgTm92ICAxIDE2OjA3OjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEZvciBhIGp1bXAgaW5zdHJ1Y3Rpb24gd2l0aAotCW5vbi1jb25zdGFudCB0YXJnZXQsIHJlcXVpcmUgNyBhdmFpbGFibGUgYnl0ZXMgaW4gdGhlIGN1cnJlbnQKLQlmcmFnLCBub3QgNi4KLQotVHVlIE9jdCAzMSAxNTozNzoxNiAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmg6IEluY2x1ZGUgYmZkL2VsZi1iZmQuaCByYXRoZXIgdGhhbgotCWJmZC9saWJlbGYuaC4KLQotVHVlIE9jdCAzMSAxNjozNDoyOCAxOTk1ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhLSotbGludXgqKTogVXNlIGVjb2ZmLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogZWNvZmYuYyAoZWNvZmZfZGlyZWN0aXZlX2V4dGVybik6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfZGlyZWN0aXZlX3dlYWtleHQpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBIYW5kbGUgd2VhayBzeW1ib2xzLgotCShlY29mZl9zZXR1cF9leHQpOiBMaWtld2lzZS4KLQkoZWNvZmZfZnJvYl9zeW1ib2wpOiBXYXJuIGFib3V0IHdlYWsgY29tbW9uIHN5bWJvbHMuCi0JKiBlY29mZi5oIChlY29mZl9kaXJlY3RpdmVfZXh0ZXJuKTogRGVjbGFyZS4KLQkoZWNvZmZfZGlyZWN0aXZlX3dlYWtleHQpOiBEZWNsYXJlLgotCSogc3ltYm9scy5jIChTX0lTX1dFQUspOiBOZXcgZnVuY3Rpb24uCi0JKiBzeW1ib2xzLmggKFNfSVNfV0VBSyk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgImV4dGVybiIgYW5kCi0JIndlYWtleHQiLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19wc2V1ZG9fdGFibGUpOiBSZW1vdmUgImV4dGVybiIuCi0JKHNfZXh0ZXJuKTogUmVtb3ZlLgotCi1UdWUgT2N0IDMxIDEzOjI5OjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfbGdsb2JsKTogRG8gdGhlIHJpZ2h0IHRoaW5nLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19iYik6IENhbGwgU0ZfU0VUX1BST0NFU1MuCi0JKHBwY19lYik6IExpa2V3aXNlLiAgU2V0IHRoZSBzdG9yYWdlIGNsYXNzIHRvIENfQkxPQ0ssIG5vdCBDX0ZDTi4KLQkocHBjX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgY2hhbmdlIENfQkxPQ0sgc3ltYm9scyB0byBDX0hJREVYVC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgY2FsbAotCVNBX1NFVF9TWU1fRU5ETkRYIHdpdGggdGhlIGN1cnJlbnQgc3ltYm9sOyBjYWxsIGl0IHdpdGggdGhlIG5leHQKLQlvbmUuICBJZiBPQkpfWENPRkYsIHRyeSB0byBmaWd1cmUgb3V0IHdoZXRoZXIgdGhlIHN5bWJvbCBpcyBnb2luZwotCXRvIGJlIGRyb3BwZWQuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICJiYyIgYW5kICJlYyIuCi0JKHBwY19zdGFiX3N5bWJvbCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHBwY19jaGFuZ2VfY3NlY3QpOiBDaGVjayB0aGF0IHBwY190b2NfY3NlY3QgaXMgbm90IE5VTEwuCi0JKHBwY19zdGFieCk6IFNldCBwcGNfc3RhYl9zeW1ib2wgYXJvdW5kIGNhbGwgdG8gc3ltYm9sX21ha2UuICBTZXQKLQlzeV90Yy5yZWFsX25hbWUgdG8gdGhlIHN0YWIgc3RyaW5nLgotCShwcGNfYmMsIHBwY19lYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShwcGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lKTogSWYgcHBjX3N0YWJfc3ltYm9sIGlzIHNldCwgZG9uJ3QKLQlkbyBhbnl0aGluZy4KLQkocHBjX3N5bWJvbF9uZXdfaG9vayk6IElmIHBwY19zdGFiX3N5bWJvbCBpcyBzZXQsIGRvbid0IGxvb2sgZm9yIGEKLQlzdWZmaXguCi0JKHBwY19mcm9iX3N5bWJvbCk6IFNldCBCU0ZfTk9UX0FUX0VORCBmb3Igc3ltYm9scyB3aXRoIGNzZWN0IGF1eAotCWVudHJpZXMuCi0KLQkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX3B1c2gpOiBSZXNldCBzYl9pbmRleC4KLQotTW9uIE9jdCAzMCAxNzo1Mjo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19uZXdsaW5lKTogRG9uJ3QgY3JlYXRlIGEgZnJhZyBpbiB0aGUgYWJzb2x1dGUKLQlzZWN0aW9uLgotCi1TYXQgT2N0IDI4IDAxOjAyOjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImRhdGEiIGFuZCAidGV4dCIuCi0JKHBwY19jc2VjdCk6IE1vdmUgbW9zdCBvZiB0aGUgY29kZSB0byBwcGNfY2hhbmdlX2NzZWN0LCBhbmQgY2FsbAotCWl0LgotCShwcGNfY2hhbmdlX2NzZWN0KTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgdGFrZW4gZnJvbSBwcGNfY3NlY3QuCi0JKHBwY19zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHBjX3Nhd19hYnMpOiBOZXcgc3RhdGljIHZhcmFibGUuCi0JKHBwY19mcm9iX3N5bWJvbCk6IENyZWF0ZSBhdXggZW50cnkgZm9yIGFic29sdXRlIHN5bWJvbHMuICBXYXJuIGlmCi0JYSBzeW1ib2wgaGFzIG5vIGNzZWN0LgotCShwcGNfYWRqdXN0X3N5bXRhYik6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGNfYWRqdXN0X3N5bXRhYik6IERlZmluZSBpZiBPQkpfWENPRkYuCi0JKHBwY19hZGp1c3Rfc3ltdGFiKTogRGVjbGFyZSBpZiBPQkpfWENPRkYuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgdGNfYWRqdXN0X3N5bXRhYiBpcyBkZWZpbmVkLAotCWNhbGwgaXQganVzdCBiZWZvcmUgdGhlIGNhbGwgdG8gb2JqX2FkanVzdF9zeW10YWIuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2ZpbmRfb3JfbWFrZSk6IENoYW5nZSBuYW1lIHRvIGJlIGNvbnN0LgotCSogc3ltYm9scy5oIChzeW1ib2xfZmluZF9vcl9tYWtlKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCi1UaHUgT2N0IDI2IDE5OjE4OjI3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbyAoQWxpZ24pOiBNZW50aW9uIFNILgotCSogZG9jL2MtbTY4ay50ZXhpIChNNjhLLURpcmVjdGl2ZXMsIC5ldmVuKTogRGVzY3JpYmUgYmVoYXZpb3IsIG5vdAotCS5hbGlnbiB2YWx1ZS4KLQkqIGRvYy9jLXo4ay50ZXhpIChaODAwMCBEaXJlY3RpdmVzLCBnbG9iYWwpOiBGaXggbWlub3IgdHlwby4KLQkoWjgwMDAgRGlyZWN0aXZlcywgZXZlbik6IERvbid0IGdpdmUgbnVtZXJpYyBhbGlnbiB2YWx1ZSwgaW5zdGVhZAotCWV4cGxhaW4gYmVoYXZpb3IuCi0KLVRodSBPY3QgMjYgMTE6NDU6MDMgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiB0Yy1hcm0uYyAoZG9fbGRzdCk6IEFzc2VtYmxlIGxkci9zdHIgcjAsIFtyMV0gYXMgYSBwcmUtaW5jcmVtZW50Ci0JaW5zdHJ1Y3Rpb24uCi0KLVdlZCBPY3QgMjUgMTE6NTk6MjQgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0c3R1ZmYpOiAgQWxzbyBtYWtlIGluZm8uCi0JKG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuKTogIEFsc28gbWFrZSBjbGVhbi1pbmZvLgotCi1UdWUgT2N0IDI0IDE1OjIxOjMzIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIG5ldyAiLm5zdWJzcGEiIG9wY29kZS4KLQkocGFfc3Vic3BhY2UpOiBGb3IgIi5uc3Vic3BhIiwgYWx3YXlzIGNyZWF0ZSBhIG5ldyBzdWJzcGFjZQotCXdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMsIGV2ZW4gaWYgb25lIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlCi0Jc2FtZSBuYW1lLgotCi1UdWUgT2N0IDI0IDE0OjUwOjM4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04pOiBSZW5hbWUgZnJvbQotCVRDX0ZPUkNFX1JFTE9DQVRJT04sIHRha2luZyBhbiBhZGRpdGlvbmFsIHNlY3Rpb24gYXJndW1lbnQuICBJZgotCXRoZSBzZWN0aW9uIG9mIHRoZSB0YXJnZXQgc3ltYm9sIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgY3VycmVudAotCXNlY3Rpb24sIGFsd2F5cyBmb3JjZSB0aGUgcmVsb2NhdGlvbiB0byBiZSB1c2VkLgotCShNRF9QQ1JFTF9GUk9NX1NFQ1RJT04pOiBOZXcgbWFjcm8gdG8gY2FsbCBtZF9wY3JlbF9mcm9tX3NlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogUmVuYW1lIGZyb20gdGhlCi0JbWRfcGNyZWxfZnJvbSBmdW5jdGlvbiwgdGFraW5nIGFuIGFkZGl0aW9uYWwgc2VjdGlvbiBhcmd1bWVudC4KLQlJbnZva2UgVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OIGluc3RlYWQgb2YgVENfRk9SQ0VfUkVMT0NBVElPTi4KLQotCSogd3JpdGUuYyAoVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OKTogRGVmaW5lIGluIHRlcm1zIG9mIHRoZQotCW9sZGVyIFRDX0ZPUkNFX1JFTE9DQVRJT04gaWYgbm90IGRlZmluZWQuCi0JKE1EX1BDUkVMX0ZST01fU0VDVElPTik6IElmIG5vdCBkZWZpbmVkLCBpbnZva2UgbWRfcGNyZWxfZnJvbS4KLQkoZml4dXBfc2VnbWVudCk6IFVzZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04gaW5zdGVhZCBvZgotCW1kX3BjcmVsX2Zyb20sIGFuZCBUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04gaW5zdGVhZCBvZgotCVRDX0ZPUkNFX1JFTE9DQVRJT04uCi0JCi1Nb24gT2N0IDIzIDE2OjIwOjA0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBpbnB1dC1zY3J1Yi5jIChhc193aGVyZSk6IFNldCBuYW1lIHRvIG51bGwgcG9pbnRlciBpZiB3ZSBkb24ndAotCWhhdmUgYSBmaWxlIG5hbWUuCi0JKiBtZXNzYWdlcy5jIChpZGVudGlmeSk6IE9ubHkgcHJpbnQgZmlsZW5hbWUgaWYgbm9uLW51bGwuCi0JKGFzX3Nob3dfd2hlcmUpOiBEaXR0bywgZm9yIGxpbmUgbnVtYmVyIHRvby4KLQkoYXNfd2Fybl9pbnRlcm5hbCwgYXNfYmFkX2ludGVybmFsKTogRGl0dG8uCi0KLQkqIGlucHV0LWZpbGUuYyAoaW5wdXRfZmlsZV9vcGVuKTogSWYgdGhlIGlucHV0IGZpbGUgY2FuJ3QgYmUKLQlvcGVuZWQsIGNvbnNpZGVyIGl0IGFuIGVycm9yLgotCi1Nb24gT2N0IDIzIDExOjE1OjQ0IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQHBhc2FuZGEuY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBBZGRlZCBtaXBzXzQxMDAgY29udHJvbCwgYW5kIHN1cHBvcnQgZm9yCi0gCWFjY2VwdGluZyB0aGUgNDEwMCBhcyBhIE1JUFMgYXJjaGl0ZWN0dXJlIHZhcmlhbnQgKG1kX2JlZ2luLAotIAltYWNyb19idWlsZCwgbWlwc19pcCwgbWRfcGFyc2Vfb3B0aW9uKS4gQWRkaW5nIHN1aXRhYmxlCi0gCWNvbW1hbmQtbGluZSBPUFRJT05zLCBhbmQgdXBkYXRpbmcgdGhlIGhlbHAgdGV4dCAobWRfc2hvd191c2FnZSkuCi0JCi1XZWQgT2N0IDE4IDEzOjIwOjMyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19iZWdpbik6IE9ubHkgc2V0IGFic29sdXRlX2ZyY2hhaW4uZml4Xyogd2hlbgotCUJGRF9BU1NFTUJMRVIgaXMgZGVmaW5lZC4KLQotCSogVXNlIG9uZSBhY3RpdmUgZnJhZyBhbmQgb25lIG9ic3RhY2sgcGVyIGZyYWcgY2hhaW46Ci0JKiBmcmFncy5jIChmcmFncyk6IFZhcmlhYmxlIGRlbGV0ZWQuCi0JKGZyYWdfYWxsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKGZyYWdfZ3JvdywgZnJhZ19tb3JlLCBmcmFnX3ZhcmlhbnQsIGZyYWdfbm93X2ZpeCwKLQlmcmFnX2FwcGVuZF8xX2NoYXIpOiBSZWZlciB0byBmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrIGluc3RlYWQgb2YKLQlmcmFncyB2YXJpYWJsZS4KLQkoZnJhZ19uZXcpOiBEaXR0by4gIFZlcmlmeSB0aGF0IGZyY2hfbGFzdCBhbmQgZnJhZ19ub3cgbWF0Y2ggb24KLQllbnRyeSBhbmQgZXhpdCwgYW5kIHRoYXQgb2xkIGZyYWdfbm93IGhhcyBub24temVybyB0eXBlLiAgUmVwbGFjZQotCSJrbm93IiB1c2VzIHdpdGggImFzc2VydCIuICBVc2UgZnJhZ19hbGxvYyBpbnN0ZWFkIG9mIG11Y2tpbmcgd2l0aAotCW9ic3RhY2sgYWxpZ25tZW50LgotCSogZnJhZ3MuaCAoZnJhZ3MpOiBEZWNsYXJhdGlvbiBkZWxldGVkLgotCSogc3Vic2Vncy5oIChzdHJ1Y3QgZnJjaGFpbik6IEFkZCBuZXcgZmllbGQgZnJjaF9mcmFnX25vdy4KLQkqIHN1YnNlZ3MuYyAoZnJjaGFpbnMsIGR1bW15X2ZyYWcsIGFic29sdXRlX2ZyY2hhaW4pOiBOZXcgc3RhdGljCi0JdmFyaWFibGVzLgotCShzdWJzZWdzX2JlZ2luKTogSW5pdGlhbGl6ZSBmcmNoYWlucyBvYnN0YWNrLiAgVW5kZXIgZ2NjLCBkb24ndAotCWdpdmUgaXQgYW55IHN0cmljdGVyIGFsaWdubWVudCB0aGFuIGZyY2hhaW5TIHN0cnVjdHVyZXMgbmVlZC4gIERvCi0Jbm90IGluaXRpYWxpemUgZnJhZ3Mgb2JzdGFjay4gIFNldCBmcmFnX25vdyB0byBwb2ludCB0bwotCWR1bW15X29ic3RhY2suICBJbml0aWFsaXplIGFic29sdXRlX2ZyY2hhaW4uCi0JKHN1YnNlZ19zZXRfcmVzdCk6IFNhdmUgYW5kIHJlc3RvcmUgZnJhZ19ub3cgaW4gZnJjaF9mcmFnX25vdwotCWZpZWxkIG9mIGZyY2hhaW5TLiAgRG9uJ3QgY3JlYXRlIG5ldyBmcmFncyBvbiBzZWN0aW9uIHN3aXRjaCwgYW5kCi0JdXNlIGZyYWdfYWxsb2Mgd2hlbiBjcmVhdGluZyBhIG5ldyBmcmFnIGNoYWluLiAgRm9yIGFic29sdXRlCi0Jc2VjdGlvbiwgc2V0IGZyY2hhaW5fbm93IHRvIGFic29sdXRlX2ZyY2hhaW4uICBWZXJpZnkgdGhhdAotCWZyY2hfbGFzdCBhbmQgZnJhZ19ub3cgbWF0Y2ggb24gZW50cnkgYW5kIGV4aXQuICBJbml0aWFsaXplCi0JcGVyLWNoYWluIG9ic3RhY2ssIGFuZCB1bmRlciBnY2MsIHNldCByZXF1aXJlZCBhbGlnbm1lbnQgdG8gdGhhdAotCW5lZWRlZCBieSBmcmFnUyBzdHJ1Y3R1cmUuCi0KLQkqIHdyaXRlLmMgKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEpOiBWZXJpZnkgZnJfdHlwZSBpcyBub256ZXJvLgotCi0JKiBzdGFicy5jIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogT25seSBjb3B5IGlucHV0IHN0cmluZyBpZiBhCi0JZnJlc2ggY29weSBpcyBuZWVkZWQsIG5vdCBpZiB0aGUgc2VjdGlvbiBhbHJlYWR5IGV4aXN0cy4KLQkoc19zdGFiX2dlbmVyaWMpOiBDYWNoZSBzdGFiIHNlY3Rpb24gbmFtZSB0byBieXBhc3MgbG9va3Vwcywgc2luY2UKLQl1c3VhbGx5IGl0IHdpbGwgbWF0Y2guICBDb3VsZCBiZSBtYWRlIGZhc3RlciBzdGlsbCBieSBjaGFuZ2luZyB0aGUKLQltZW1vcnkgYWxsb2NhdGlvbiBydWxlcy4KLQkoc194c3RhYik6IENhY2hlIHNlY3Rpb24gbmFtZSB0byBieXBhc3MgcmVwZWF0ZWQgc3RyaW5nCi0JYWxsb2NhdGlvbi4KLQotCSogZnJhZ3MuYyAoZnJhZ19uZXcpOiBEZWxldGVkIHJlZ2lzdGVyIGRlY2xhcmF0aW9ucy4KLQotCSogbGlzdGluZy5jIChmcmFnX25vdyk6IERvbid0IGRlY2xhcmUuCi0KLQkqIGFzLmMgKGNodW5rc2l6ZSk6IE5ldyB2YXJpYWJsZS4KLQkoZGVidWdfbWVtb3J5KTogTmV3IHZhcmlhYmxlLgotCShtYWluKTogSWYgZGVidWdfbWVtb3J5IGlzIHNldCwgcmVkdWNlIGNodW5rc2l6ZSBhbmQKLQlfYmZkX2NodW5rc2l6ZS4KLQkqIGFzLmggKGNodW5rc2l6ZSk6IERlY2xhcmUgaXQuCi0JKiByZWFkLmMgKHJlYWRfYmVnaW4pOiBVc2UgaXQuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zaG9ydG9wdHMpOiBJbmNsdWRlICdnJy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSWdub3JlIGl0LgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIE1ha2VmaWxlIGFuZCBjb25maWcuc3RhdHVzIGZyb20KLQl0ZXN0c3VpdGUgZGlyZWN0b3J5LgotCShjbGVhbi1oZXJlKTogRG9uJ3QgZGVsZXRlIHRlc3RzdWl0ZS4gIEluc3RlYWQsIGRlbGV0ZSBvbmx5IHRoZQotCWZpbGVzIHdpdGhpbiBpdCB0aGF0IHdvdWxkIGJlIGdlbmVyYXRlZCBieSBydW5uaW5nIHRlc3RzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbik6IENhbGwKLQlmcmFnX25vd19maXggaW5zdGVhZCBvZiBhY2Nlc3Npbmcgb2JzdGFjayBpbmZvIGRpcmVjdGx5LgotCSogY29uZmlnL3RjLWFybS5jIChzX2x0b3JnKTogRGl0dG8uCi0JKG1kX2Fzc2VtYmxlKTogRGl0dG8uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogQ2FsbCBmcmFnX2dyb3cgaW5zdGVhZCBvZgotCW9ic3RhY2tfcm9vbS4KLQotV2VkIE9jdCAxOCAxMjoyMjo1OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoYW91dF9wcm9jZXNzX3N0YWIpOiBJbnNlcnQgZGVidWcgc3ltYm9sIGludG8gc3ltYm9sCi0JY2hhaW4gYWZ0ZXIgcGFyc2luZyB2YWx1ZSBleHByZXNzaW9uLCBpZiBhbnksIHRvIGF2b2lkIHNlcGFyYXRpbmcKLQljb250aW51ZWQgLnN0YWJzIGxpbmVzLgotCi1Nb24gT2N0IDE2IDEwOjU2OjQxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19lbGZfcHNldWRvX3RhYmxlKTogUmVtb3ZlLgotCShtaXBzX3BvcF9pbnNlcnQpOiBEb24ndCBjYWxsIHBvcF9pbnNlcnQgb24gbWlwc19lbGZfcHNldWRvX3RhYmxlLgotCi1Nb24gT2N0IDE2IDA3OjA3OjM3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYmVnaW4pOiBVc2UgbmV3IGZsYWdzIFBQQ19PUENPREVfQ09NTU9OIGZvcgotCS1tY29tIHN1cHBvcnQgYW5kIFBQQ19PUENPREVfQU5ZIGZvciAtbWFueS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogRGl0dG8uCi0JKHBwY19hcmNoKTogRGl0dG8uCi0JKG1kX2JlZ2luKTogRm9yIGR1cGxpY2F0ZSBpbnN0cnVjdGlvbnMsIHByaW50IGFsbCBkdXBsaWNhdGVzCi0JYmVmb3JlIGFib3J0aW5nLgotCi1TdW4gT2N0IDE1IDIyOjA2OjE0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IFN1cHBvcnQgZm9yIC1tY29tIHRvIHR1cm4gb24KLQljb21tb24gbW9kZSBvcGVyYXRpb24uCi0JKG1kX3Nob3dfdXNhZ2UpOiBBZGQgLW1jb20gdG8gdXNhZ2UgbWVzc2FnZS4KLQotRnJpIE9jdCAxMyAxMzozMjo0NSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBleHByLmMgKG9wX3JhbmspOiBBZGQgT19zeW1ib2xfcnZhLgotCSogZXhwci5oIChvcGVyYXRvclQpOiBBZGQgT19zeW1ib2xfcnZhLgotCSogcmVhZC5jIChjb25zX3dvcmtlcik6IFNldCBPX3N5bWJvbF9ydmEgd2hlbiBuZWNlc3NhcnkuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2V4cCk6IFVuZGVyc3RhbmQgT19zeW1ib2xfcnZhLgotCi1UdWUgT2N0IDEwIDExOjM0OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogQ29ycmVjdCBzX2NvbnMgYXJndW1lbnRzLiAgRnJvbSBNaWNoYWVsCi0JSm9vc3RlbiA8am9vc3RAb3JpLmNhZGxhYi5kZT4uCi0KLU1vbiBPY3QgIDkgMTk6NTk6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19tYWNybyk6IE1ha2UgY291bnQgdW5zaWduZWQuCi0JKHBwY19iaWVpKTogU2V0IHNlZ21lbnQgdG8gbm93X3NlZyBhbmQgdmFsdWUgdG8gY29mZl9uX2xpbmVfbm9zLgotCShwcGNfZnJvYl9zeW1ib2wpOiBIYW5kbGUgQ19CSU5DTCBhbmQgQ19FSU5DTCBzeW1ib2xzIGJ5IHNldHRpbmcKLQl0aGUgZml4X2xpbmUgZmllbGQuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9uX2xpbmVfbm9zKTogUmVuYW1lIGZyb20gbl9saW5lX25vcywgYW5kCi0JbWFrZSBub24tc3RhdGljLiAgQ2hhbmdlIGFsbCB1c2Vycy4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChjb2ZmX25fbGluZV9ub3MpOiBEZWNsYXJlLgotCi1GcmkgT2N0ICA2IDE2OjI0OjI3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlndXJlLmluIChBQ19BUkdfV0lUSChiZmQtYXNzZW1ibGVyKSk6IEZpeCBoZWxwIG1lc3NhZ2UuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uKTogQ29udmVydCBzcGVjaWZpZWQgYnl0ZQotCWFsaWdubWVudCB0byBwb3dlciBvZiB0d28uICBTZXQgc2l6ZSBvZiBsb2NhbCBic3Mgc3ltYm9sLgotCi0JKiBjb25maWcvdGMtbTY4ay5jICh0Y19nZW5fcmVsb2MpOiBGaXggdHlwbyBpbiB2YXJpYWJsZSBuYW1lLgotCi1GcmkgT2N0ICA2IDE1OjIyOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2IuYywgbWFjcm8uYzogRGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSA8c3RyaW5nLmg+IG9yCi0JPHN0cmluZ3MuaD4ganVzdCBhcyBhcy5oIGRvZXMuCi0KLUZyaSBPY3QgIDYgMDk6NTU6MzMgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHNpdGUuZXhwKTogRml4IHNldHRpbmcgb2YgJHNyY2Rpci4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hdG9mKTogRml4IGxpdHRsZS1lbmRpYW4gb3V0cHV0LgotCSogY29uZmlnL3RjLWFybS5oIChBUk1fQklfRU5ESUFOKTogTW92ZSBkZWZpbml0aW9uIHNvIGRlZmluZWQgZm9yCi0JYWxsIGNvZmYgdGFyZ2V0cy4KLQotVGh1IE9jdCAgNSAyMDoxNzozMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IFNwbGl0IG91dCB0aGUgTlMzMmsgZmFtaWx5IGRvY3VtZW50YXRpb24sCi0JZGVzcGl0ZSBpdHMgYmVpbmcgY29tbWVudGVkIG91dCBmb3Igbm93LgotCSogZG9jL2MtbnMzMmsudGV4aTogTmV3IGZpbGUuCi0KLQkqIHNiLmMsIG1hY3JvLmM6IEluY2x1ZGUgc3RyaW5nLmguCi0KLQkqIE1ha2VmaWxlLmluIChjb21wYXJpc29uKTogT25seSBjaGVjayAqLm87IHdlIGRvbid0IGNhcmUgaWYKLQl0aW1lc3RhbXBzIGluc2VydGVkIGJ5IHRoZSBuYXRpdmUgbGlua2VyIGRpZmZlci4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2FsaWduKTogT25seSBmaWxsIHdpdGggYSBuby1vcCBwYXR0ZXJuCi0JaWYgYWxpZ25tZW50IHN0cmljdGVyIHRoYW4gNCBieXRlcyBpcyByZXF1ZXN0ZWQ7IGluIHRoYXQgY2FzZSwKLQlhbGlnbiB0byBhIDQtYnl0ZSBib3VuZGFyeSBmaXJzdC4KLQotCVRodSBTZXAgMjggMTk6MzU6MjcgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19SU1lNX1BhcnNlKTogZWxpbWluYXRlICJtaWdodCBiZSB1c2VkCi0JdW5pbml0aWFsaXplZCIgd2FybmluZyBmb3IgYE1heF9Tb3VyY2VfT2Zmc2V0Jy4KLQotV2VkIE9jdCAgNCAxNjoxNzowMiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwYXJzZV90b2NfZW50cnkpOiBOZXcgZnVuY3Rpb24gdG8gcGFyc2UgW3RvY10KLQlxdWFsaWZpZXJzIGFuZCBkZXRlY3QgZXJyb3JzIGlmIHByZXNlbnQuCi0JKG1kX2Fzc2VtYmxlKTogQWRkIGNhbGwgdG8gcGFyc2VfdG9jX2VudHJ5LiBBbHNvIGFkZGVkIHNvbWUgc3VwcG9ydAotCWZvciB0aGUgW3RvY3ZdIHF1YWxpZmllci4KLQkocHBjX3BlX3RvY2QpOiBOZXcgZnVuY3Rpb24gdG8gc3VwcG9ydCBkYXRhIGluIHRoZSB0b2Mgc2VjdGlvbi4KLQotV2VkIE9jdCAgNCAxNDowMzozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgY3JlYXRlIGFuIGF1eCBlbnRyeSBmb3IKLQlhbiBhYnNvbHV0ZSBzeW1ib2wuCi0KLVR1ZSBPY3QgIDMgMTI6MTg6MTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpc3dvcmQpOiBBY2NlcHQgYWxsIHZhbHVlcyBmcm9tIC02NTUzNiB0bwotCSs2NTUzNSwJc28gflZBTCB3aWxsIG5vdCBiZSByZWplY3RlZC4KLQotCSogY29uZC5jIChzX2VuZGlmKTogQ2FsbCBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lLiAgSW4gTVJJIG1vZGUsCi0Jc2tpcCBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBwc2V1ZG8tb3AuCi0JKHNfZWxzZSk6IExpa2V3aXNlLgotCSogcmVhZC5jIChnZXRfbGluZV9zYik6IERvbid0IGxvb2sgcGFzdCBidWZmZXJfbGltaXQuCi0JKHNfaW5jbHVkZSk6IEluIE1SSSBtb2RlLCBza2lwIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGZpbGUgbmFtZS4KLQotTW9uIE9jdCAgMiAxNjoxNToyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLnkgKG02OGtfcmVnX3BhcnNlKTogSW4gTVJJIG1vZGUsIHBlcm1pdAotCXBlcmlvZHMgaW4gcmVnaXN0ZXIgbmFtZXMuCi0KLVNhdCBTZXAgMzAgMjM6MDM6MzEgMTk5NSAgSmVmZiBMYXcgIChsYXdAaHVybC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9hZGp1c3RhYmxlKTogRFAgcmVsYXRpdmUgcmVsb2NzCi0JYXJlIG5vdCBhZGp1c3RhYmxlIGluIFNPTSB0byBhdm9pZCBjb25mdXNpbmcgdGhlIG9wdGltaXppbmcKLQlsaW5rZXIuCi0KLUZyaSBTZXAgMjkgMTU6MTg6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQWRkIHNvbWUgc3VwcG9ydCBmb3IgaTk2MCBNUkkgY29tcGF0aWJpbGl0eSBtb2RlLgotCSogY29uZmlnL3RjLWk5NjAuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIGVuZGlhbi4KLQkoZ2V0X2FyZ3MpOiBEb24ndCBkaXNjYXJkIGEgc3BhY2UgYmV0d2VlbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4KLQkoZ2V0X2NkaXNwKTogQ2hhbmdlIHRleHRfc2VjdGlvbiB0byBub3dfc2VnLgotCShzX2VuZGlhbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtaTk2MC5oIChNUklfTU9ERV9ORUVEU19QU0VVRE9fRE9UKTogRGVmaW5lLgotCSogZXhwci5oIChvcGVyYXRvclQpOiBBZGQgT19sb2dpY2FsX25vdCwgT19sb2dpY2FsX2FuZCwgYW5kCi0JT19sb2dpY2FsX29yLgotCSogZXhwci5jIChvcGVyYW5kKTogVHJlYXQgJyEnIGFzIGxvZ2ljYWwgbm90IG9wZXJhdG9yLiAgSWYKLQlUQ19JOTYwLCBpbiBNUkkgbW9kZSBwZXJtaXQgYHNpemVvZiBzZWNuYW1lJyBhbmQgYHN0YXJ0b2YKLQlzZWNuYW1lJy4KLQkob3BfcmFuayk6IEJ1bXAgdmFsdWVzIGJ5IDIgdG8gbWFrZSByb29tIGZvciAmJiBhbmQgfHwuICBBZGQKLQllbnRyaWVzIGZvciAhLCAmJiwgYW5kIHx8LgotCShleHByX2JlZ2luKTogT25seSBkbyBNUkkgY2hhbmdlcyBpZiBUQ19NNjhLLgotCShvcGVyYXRvcik6IFJlY29nbml6ZSB8fCBhbmQgJiYuCi0JKGV4cHIpOiBIYW5kbGUgbmV3IG9wZXJhdG9yVCB2YWx1ZXMuCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSGFuZGxlIG5ldyBvcGVyYXRvclQgdmFsdWVzLgotCShwcmludF9leHByXzEpOiBMaWtld2lzZS4KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBkZWJ1ZywgZXJyLCBpcmVwLCBpcmVwYywgcHJpbnQsIHB1cmdlbSwKLQlhbmQgcmVwLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBIYW5kbGUgTVJJX01PREVfTkVFRFNfUFNFVURPX0RPVC4KLQkobXJpX2NvbW1lbnRfZmllbGQpOiBPbmx5IGhhbmRsZSB3ZWlyZCBjb21tZW50cyBpZiBUQ19NNjhLLgotCShzX2Vycik6IE5ldyBmdW5jdGlvbi4KLQkoc19vcmcpOiBPbmx5IHB1bnQgaW4gTVJJIG1vZGUgaWYgVENfTTY4Sy4KLQkoc19tcmlfc2VjdCk6IFdyaXRlIFRDX0k5NjAgdmVyc2lvbi4KLQkoc19wcmludCwgc19wdXJnZW0pOiBOZXcgZnVuY3Rpb25zLgotCSogcmVhZC5oIChzX2Vyciwgc19wcmludCwgc19wdXJnZW0pOiBEZWNsYXJlLgotCSogY29uZC5jIChzX2lmZXFzKTogSW1wbGVtZW50LgotCShpZ25vcmVfaW5wdXQpOiBIYW5kbGUgTVJJX01PREVfTkVFRFNfUFNFVURPX0RPVC4KLQkqIG1hY3JvLmMgKG1hY3JvX3N0cmlwX2F0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWFjcm9faW5pdCk6IEFkZCBzdHJpcF9hdCBwYXJhbWV0ZXIuCi0JKGRvX2Zvcm1hbHMpOiBJZiBtYWNyb19zdHJpcF9hdCwgY2hhbmdlIE5BUkcgdG8gJE5BUkcuCi0JKGRlZmluZV9tYWNybyk6IFNraXAgYSBjb21tYSBhZnRlciB0aGUgbWFjcm8gbmFtZS4KLQkoZ2V0X2Fwb3N0X3Rva2VuKTogU2tpcCBjaGFyYWN0ZXIgaWYgbWFjcm9fc3RyaXBfYXQsIGV2ZW4gaWYKLQltYWNyb19tcmkuCi0JKG1hY3JvX2V4cGFuZF9ib2R5KTogSWYgbWFjcm9fc3RyaXBfYXQsIGRvbid0IHJlY29nbml6ZSBwYXJhbWV0ZXJzCi0JaW4gc3RyaW5ncyB1bmxlc3MgdGhleSBhcmUgcHJlY2VkZWQgYnkgYW4gJ0AnLiAgSWYgbWFjcm9fc3RyaXBfYXQsCi0JcGFzcyAnQCcgYXMgc3RyaXAgY2hhcmFjdGVyIHRvIHN1Yl9hY3R1YWwuICBJZiBtYWNyb19zdHJpcF9hdCwKLQlzdHJpcCAnQCcgY2hhcmFjdGVycy4KLQkobWFjcm9fZXhwYW5kKTogSWYgbWFjcm9fc3RyaXBfYXQsIGNoYW5nZSBOQVJHIHRvICROQVJHLgotCShkZWxldGVfbWFjcm8pOiBOZXcgZnVuY3Rpb24uCi0JKGV4cGFuZF9pcnApOiBTa2lwIGxlYWRpbmcgYW5kIHRyYWlsaW5nICciJyBjaGFyYWN0ZXJzIGlmIGlycGMuCi0JKiBtYWNyby5oIChtYWNyb19pbml0KTogTWVudGlvbiBuZXcgc3RyaXBfYXQgcGFyYW1ldGVyLgotCShkZWxldGVfbWFjcm8pOiBEZWNsYXJlLgotCSogYXMuYyAobWFpbik6IElmIFRDX0k5NjAsIHBhc3MgZmxhZ19tcmkgdG8gbWFjcm9faW5pdCBhcwotCXN0cmlwX2F0OyBvdGhlcndpc2UsIHBhc3MgMC4KLQkqIGdhc3AuYyAocHJvY2Vzc19wc2V1ZG9fb3ApOiBQYXNzIDAgdG8gbWFjcm9faW5pdCBhcyBzdHJpcF9hdC4KLQkobWFpbik6IExpa2V3aXNlLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IGk5NjAgTVJJIG1vZGUuCi0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBNZW50aW9uIC0tZGVmc3ltLgotCi1UaHUgU2VwIDI4IDE5OjI1OjA0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogVHJhbnNsYXRlICJwb3dlcnBjIiBpbnRvICJwcGMiLCByZW1vdmUgZ2VuIG9mCi0JVkVSU0lPTiwgbW92ZSBnZW4gb2YgImNvbmYiIGhlcmUgZnJvbSBtYWtlZmlsZS4KLQkqIG1wdy1tYWtlLnNlZDogTmV3IGZpbGUsIHNlZCBjb21tYW5kcyB0byB0cmFuc2xhdGUgVW5peCBtYWtlZmlsZQotCWludG8gTVBXIHN5bnRheC4KLQkqIG1wdy1tYWtlLmluOiBSZW1vdmUuCi0JKiBtYWMtYXMucjogTmV3IGZpbGUsIE1hYyByZXNvdXJjZSBmaWxlLgotCSogYXMuaCAoaW5saW5lKTogRG9uJ3QgZGVjaWRlIGFib3V0IGRlZmluaW5nIGlmIF9fTVdFUktTX18sCi0JcmVtb3ZlIHJlZHVuZGFudCBjb25kaXRpb25hbCBhbmQgZGVmaW5pdGlvbi4KLQotCSogc3RhYnMuYyAoc19zdGFiX2dlbmVyaWMpOiBGaXggc3ludGF4IGZvciBPQkpfUFJPQ0VTU19TVEFCLgotCi1UaHUgU2VwIDI4IDE1OjQzOjE1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BuZWxsaWU+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IFJlbW92ZWQgc29tZSBURV9QRSBzcGVjaWZpYyAKLQltYW5pcHVsYXRpb25zLCBzaW5jZSBJIGNhbid0IHByb3ZlIHRoZXkncmUgbmVlZGVkLgotCShtZF9iZWdpbik6IFJlbW92ZWQgaW5pdF9yZWd0YWJsZSwgaW5zZXJ0X3JlZywgYW5kIHRoZSBjYWxsIHBvaW50cy4KLQkocmVnaXN0ZXJfbmFtZSk6IE5ldyBmdW5jdGlvbi4gUGFyc2VzIGEgcmVnaXN0ZXIgbmFtZSwgaWYgYXBwcm9wcmlhdGUuCi0JKG1kX2Fzc2VtYmxlKTogQWRkZWQgY2FsbCB0byByZWdpc3Rlcl9uYW1lIHRvIGhhbmRsZSBzeW1ib2xpYyBuYW1lcy4KLQkocHBjX3BlX3NlY3Rpb24pOiBSZW1vdmVkIGFsbCBkdXBsaWNhdGUgSU1BR0UgZGVmaW5lcywgYW5kIGluY2x1ZGUKLQljb2ZmL3BlLmggaW5zdGVhZC4KLQotVGh1IFNlcCAyOCAxMjowOToxOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGNfZml4X2FkanVzdGFibGUpOiBEZWZpbmUuCi0JKHBwY19wZV9maXhfYWRqdXN0YWJsZSk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19wZV9maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbi4KLQotVGh1IFNlcCAyOCAwMToxMTo1OCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGRlbmViLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uaCAoVEFSR0VUX0ZPUk1BVCk6IERlZmluZSBmb3IgYXJtLWNvZmYuCi0KLVdlZCBTZXAgMjcgMTI6NTM6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKFNfSVNfTE9DQUwpOiBBbGwgc3ltYm9scyBpbiByZWdfc2VjdGlvbiBhcmUgbG9jYWwuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoT0JKX1hDT0ZGKTogRGVmaW5lIGlmIE9CSl9DT0ZGIGFuZCBub3QgVEVfUEUuCi0JQ2hhbmdlIE9CSl9DT0ZGIGNoZWNrcyB0byBjaGVjayBPQkpfWENPRkYgaW5zdGVhZC4KLQkoVEFSR0VUX0ZPUk1BVCk6IEZ1bGx5IHBhcmVudGhlc2l6ZS4KLQkoTEVYX1FNKTogRGVmaW5lIGlmIFRFX1BFLgotCSogY29uZmlnL3RjLXBwYy5jOiBSZXBsYWNlIE9CSl9DT0ZGIGJ5IE9CSl9YQ09GRiB0aHJvdWdob3V0LgotCVJlbW92ZSBjaGVja3Mgb2YgVEVfUEUgd2l0aGluICNpZmRlZiBPQkpfWENPRkYgc2VjdGlvbnMuCi0JKGluaXRfcmVndGFibGUpOiBNYWtlIGkgdW5zaWduZWQuCi0JKHBwY19zZXRfY3VycmVudF9zZWN0aW9uKTogUmVuYW1lIGZyb20gc2V0Q3VycmVudFNlY3Rpb24uICBDaGFuZ2UKLQlhbGwgY2FsbGVycy4KLQkocHBjX2FyY2gpOiBSZXR1cm4gYWZ0ZXIgYXNfZmF0YWwgdG8gYXZvaWQgZ2NjIHdhcm5pbmcuCi0JKG1kX2Fzc2VtYmxlKTogT25seSBkZWNsYXJlIHJlbG9jIGlmIE9CSl9FTEYuICBBZGQgZGVmYXVsdCB0bwotCXN3aXRjaCBvbiBmaXh1cHNbaV0ucmVsb2MgdG8gYXZvaWQgZ2NjIHdhcm5pbmcuCi0JKElNQUdFX1NHTl9MTktfT1RIRVIpOiBGaXggbmVzdGVkIGNvbW1lbnQuCi0JKHBwY19wZV9mdW5jdGlvbik6IERvbid0IGNhbGwgcHBjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZS4KLQkocHBjX2Zyb2Jfc3ltYm9sKTogUmVtb3ZlIFRFX1BFIHNlY3Rpb24gY2hlY2tzLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IFJldHVybiBhZnRlciBhYm9ydCB0byBhdm9pZCBnY2MKLQl3YXJuaW5nLgotCShtZF9hcHBseV9maXgzKTogQWRkIEJGRF9SRUxPQ18xNl9HT1RfUENSRUwgdG8gc3dpdGNoLgotCSogcmVhZC5jIChMRVhfUU0pOiBEZWZpbmUgYXMgMCBpZiBub3QgZGVmaW5lZC4KLQkobGV4X3R5cGUpOiBVc2UgTEVYX1FNIGZvciAnPycuCi0KLQkqIGNvbmZpZ3VyZS5pbjogTm8gbmVlZCB0byBjaGVjayB3aGV0aGVyICR7Y3B1X3R5cGV9IGlzIHBvd2VycGM7Ci0JaXQgbmV2ZXIgd2lsbCBiZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIFNlcCAyNyAxMTozMzozOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IFJlbW92ZSBTZXAgMjYgY2hhbmdlcyB0byB0aGlzCi0JZnVuY3Rpb24sIGtlZXBpbmcgb3RoZXIgU2VwLiAyNiBjaGFuZ2VzLgotCi1XZWQgU2VwIDI3IDEwOjI5OjEzIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BuZWxsaWU+Ci0KLQkqIGNvbmZpZ3VyZSAoZW11bGF0aW9ucyk6IEFkZGVkIHN1cHBvcnQgZm9yIHBwY2xlLSotW3BlfHdpbm50XQotCSh0YXJnZXRfZnJhZyk6IFJlbW92ZWQgYW4gZXh0cmFuZW91cyBQUEMgZGVmaW5pdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IFNhbWUKLQkqIGNvbmZpZy90Yy1wcGMuaDoKLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcHNldWRvX3RhYmxlKTogQmFzZSBzdXBwb3J0IGZvciBuZXcgb3IgYWx0ZXJlZAotCXBzZXVkbyBvcHMgLSA8cHJldmlvdXMsIHBkYXRhLCB5ZGF0YSwgcmVsZGF0YSwgcmRhdGEsIHVhbG9uZywgem5vcCwKLQlzZWN0aW9uLCBjb21tLCBmdW5jdGlvbj4gVGhlcmUgd2lsbCBiZSBtb3JlLgotCShwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBQcmVkZWZpbmVkIHJlZyB0YWJsZSB0byBuYW1lIHJlZ2lzdGVycywgZXRjCi0JKG1kX2JlZ2luKTogU2V0dXAgcmVnIHRhYmxlIGluaXRpYWxpemF0aW9uCi0JKG1kX2Fzc2VtYmxlKTogSW5pdGlhbCBbdG9jXXgocnRvYykgc3VwcG9ydAotCShwcGNfZnJvYl9sYWJlbCk6IFJlbW92ZWQgc29tZSB4Y29mZiBzcGVjaWZpYyBwcm9jZXNzaW5nIGZyb20gVEVfUEUKLQkocHBjX2Zyb2Jfc3ltYm9sKTogUmVtb3ZlZCBzb21lIHhjb2ZmIHNwZWNpZmljIHByb2Nlc3NpbmcgZnJvbSBURV9QRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgbW9yZSBwcmVkZWZpbmVkIHNlY3Rpb25zCi0gICAgICAgIChwcGNfZnJvYl9zZWN0aW9uKTogUmVtb3ZlZCBzb21lIHhjb2ZmIHNwZWNpZmljIHByb2Nlc3NpbmcgZnJvbSBURV9QRQotCShwcGNfZml4X2FkanVzdGFibGUpOiBSZW1vdmVkIGZyb20gVEVfUEUgbWFpbmxpbmUKLQkobWRfYXBwbHlfZml4Myk6IEZvciBURV9QRSB0b2MgZW50cmllcywgd2UgZG9uJ3QgbmVlZCB0byBtZXNzIAotICAgICAgICB3aXRoIGZ4X2FkZG51bWJlci4gUmVtb3ZlZCBmb3IgdGhlIHRpbWUgYmVpbmcuCi0JKGxvdHMpOiBQdXQgYmFjayBtaXNzaW5nIGFzc2lnbm1lbnRzIHRvIHBwY19jdXJyZW50X2NzZWN0LgotCi1UdWUgU2VwIDI2IDE0OjU3OjU5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IFN1cHBvcnQgYWxsIG9mIHRoZSBWLjQKLQlyZWxvY2F0aW9ucy4KLQkocHBjX2VsZl9jb25zKTogUmVtb3ZlIHJlc3RyaWN0aW9uIHRoYXQgQCBzdWZmaXhlcyBtdXN0IGJlIGRvbmUKLQl3aXRoIC5sb25nLiAgQWRkIGVycm9yIGlmIHJlbG9jYXRpb24gZG9lcyBub3QgZml0IGluIHRoZSBudW1iZXIgb2YKLQlieXRlcyBwcm92aWRlZC4KLQkobWRfYXNzZW1ibGUpOiBGb3IgYWJzb2x1dGUgYnJhbmNoZXMsIG1hcCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucwotCWJhY2sgaW50byBhbiBlcXVpdmFsZW50IGFic29sdXRlIHJlbG9jYXRpb24uCi0JKG1kX3BjcmVsX2Zyb20pOiBJZiBUQ19GT1JDRV9SRUxPQ0FUSU9OIGlzIHRydWUsIHJlbG9jYXRpb24gb2Zmc2V0Ci0JaXMgMCwgbm90IHNlZ21lbnQgc3RhcnQuCi0JKG1kX2FwcGx5X2ZpeDMpOiBEb24ndCBib3RoZXIgd3JpdGluZyBhZGRlbmQgaW50byB0aGUgaW5zdHJ1Y3Rpb24sCi0Jc2luY2UgaXQgaXMgaWdub3JlZCwgZ2l2ZW4gdGhhdCB3ZSB1c2UgUkVMQSByZWxvY2F0aW9ucyBmb3IgRUxGLgotCi0JKiBjb25maWcvdGMtcHBjLmggKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUgdG8gZm9yY2UgYWxsCi0JYnJhbmNoIHByZWRpY3Rpb24gcmVsb2NhdGlvbnMgdG8gYWx3YXlzIGJlIGVtaXR0ZWQuCi0KLU1vbiBTZXAgMjUgMTY6MDg6NDMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogTG93ZXIgY2FzZSByZWxvYyBiZWZvcmUKLQl0ZXN0aW5nLgotCShtZF9hc3NlbWJsZSk6IEJlIG1vcmUgcm9idXN0IGluIHRlcm1zIG9mIHJlbG9jYXRpb25zLgotCShtZF9hcHBseV9maXgzKTogQWxsb3cgMTQgYml0IHJlbG9jcyB0byBiZSBlbWl0dGVkIGZvciBleHRlcm5hbAotCXN5bWJvbHMgaW4gYWRkaXRpb24gdG8gMjYgYml0IHJlbG9jcy4gIFByb3Blcmx5IGluc2VydCAyNi8xNCBiaXQKLQlyZWxvYyB2YWx1ZSBmaWVsZHMgaW50byB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLgkKLQotTW9uIFNlcCAyNSAwMDoyMzoxNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXRvZik6IE91dHB1dCBsaXR0bGUgZW5kaWFuIGNvbnN0YW50cyBpbgotCWxpdHRsZSBlbmRpYW4gbW9kZS4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBQYXNzICZ0eXBlLCBub3QgdHlwZSwKLQlzX21yaV9zZWN0LgotCi0JKiBjb25maWd1cmUuaW46IEZpeCB0eXBvOiBmbXQtZWxmIHRvIGZtdD1lbGYuCi0KLUZyaSBTZXAgMjIgMTY6MzQ6NDYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogUmV3cml0ZSB0byB1c2UgYSB0YWJsZSBvZgotCXN0cmluZ3MgYW5kIHJlbG9jYXRpb25zIHRoZXkgcmVwcmVzZW50LiAgQWRkIEBicnssbn10YWtlbiBmb3IKLQlicmFuY2ggdGFrZW4vbm90IHRha2VuIHN1cHBvcnQuCi0JKG1kX2FwcGx5X2ZpeDMpOiBBZGQgQkZEX1JFTE9DX1BQQ19CMTZfQlJ7LE59VEFLRU4gc3VwcG9ydC4KLQotVGh1IFNlcCAyMSAyMToxMDoxNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wYXJzZV9vcHRpb24pOiAtbXJlbG9jYXRhYmxlLWxpYiBub3cgb25seQotCXNldHMgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQiBhbmQgbm90IGFsc28gRUZfUFBDX1JFTE9DQVRBQkxFLgotCi1UaHUgU2VwIDIxIDE2OjMwOjU2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0KTogUGVybWl0IFNFR19BQlNPTFVURSBpbiBrbm93IGV4cHJlc3Npb24uCi0JKiBleHByLmMgKGV4cHIpOiBBY2NvdW50IGZvciBuZXcgb3BlcmF0b3JUIHZhbHVlcyBpbiBrbm93Ci0JZXhwcmVzc2lvbi4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENsZWFyIGZpeHAtPmZ4X3N1YnN5IGlmIHRoZSByZWxvY2F0aW9uCi0JaXMgZnVsbHkgcmVzb2x2ZWQuCi0KLVRodSBTZXAgMjEgMTQ6MTE6NDkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2ZsYWdzKTogTmV3IHZhcmlhYmxlIHRvIGhvbGQgdGhlIGZsYWcgYml0cwotCXRvIHNldCBpbiB0aGUgRUxGIGhlYWRlci4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWRkIHN1cHBvcnQgZm9yIC1tcmVsb2NhdGFibGUtbGliLiAgTWFrZSBib3RoCi0JLW1yZWxvY2F0YWJsZSBhbmQgLW1yZWxvY2F0YWJsZS1saWIgc2V0IHBwY19mbGFncy4KLQkobWRfYmVnaW4pOiBTZXQgRUxGIGZsYWdzIHdpdGggcHBjX2ZsYWdzLgotCi1XZWQgU2VwIDIwIDEzOjAxOjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LCBzeW5vbnltIGZvcgotCXJlYWxjbGVhbi4gIEFkZCBHTlUgc3RhbmRhcmQgbWFpbnRhaW5lci1jbGVhbiBlY2hvcy4KLQkqIGRvYy9NYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQsIHN5bm9ueW0gZm9yCi0JcmVhbGNsZWFuLgotCi1UdWUgU2VwIDE5IDExOjMxOjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFJlamVjdCBpbW1lZGlhdGUgb3BlcmFuZHMgZm9yICclJy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFJlamVjdCBpbW1lZGlhdGUgb3BlcmFuZHMgZm9yICd8Jy4KLQlSZXBsYWNlICdQJyB3aXRoICcwJywgJzEnLCBhbmQgJzInLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kKTogQ2hhbmdlIGxlZnRzdG9wCi0JYW5kIHJpZ2h0c3RvcCB0byBub3QgYmUgY29uc3QuCi0JKHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24pOiBMaWtld2lzZS4KLQkoYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCk6IExpa2V3aXNlLiAgVXNlIG02OGtfaXBfb3AgdG8gZXhhbWluZQotCXRoZSBvcGVyYW5kLCBub3QgbTY4a19yZWdfcGFyc2UuCi0JKHNfbXJpX2lmKTogSW4gTVJJIG1vZGUsIHN0b3AgYXQgdGhlIGZpcnN0ICcqJy4KLQkoc19tcmlfd2hpbGUpOiBMaWtld2lzZS4KLQkoc19tcmlfZWxzZSk6IEluIE1SSSBtb2RlLCBpZ25vcmUgdHJhaWxpbmcgY2hhcmFjdGVycy4KLQkoc19tcmlfZW5kaSwgc19tcmlfYnJlYWssIHNfbXJpX25leHQsIHNfbXJpX2Zvcik6IExpa2V3aXNlLgotCShzX21yaV9lbmRmLCBzX21yaV9yZXBlYXQsIHNfbXJpX3VudGlsLCBzX21yaV9lbmR3KTogTGlrZXdpc2UuCi0JKiBjb25maWcvbTY4ay1wYXJzZS55OiBSZXZlcnQgeWVzdGVyZGF5J3MgY2hhbmdlLgotCSogY29uZmlnL202OGstcGFyc2UuaDogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZS4KLQotTW9uIFNlcCAxOCAxNToyMjoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQpOiBDaGFuZ2UgbGVmdHN0YXJ0Ci0JYW5kIHJpZ2h0c3RhcnQgdG8gbm90IGJlIGNvbnN0LgotCShwYXJzZV9tcmlfY29udHJvbF9leHByZXNzaW9uKTogTGlrZXdpc2UuCi0JKGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQpOiBMaWtld2lzZS4gIElmIHRoZSBsZWZ0IHNpZGUgb2YgdGhlCi0JY29tcGFyaXNvbiBpcyBhIHJlZ2lzdGVyLCBhbmQgdGhlIHJpZ2h0IHNpZGUgaXMgbm90LCBzd2FwIHRoZSB0d28KLQlzaWRlcy4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLnkgKG02OGtfcmVnX3BhcnNlKTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCSogY29uZmlnL202OGstcGFyc2UuaCAobTY4a19yZWdfcGFyc2UpOiBEZWNsYXJlLgotCi0JKiByZWFkLmMgKG1yaV9jb21tZW50X2ZpZWxkKTogTmV3IGZ1bmN0aW9uLgotCShtcmlfY29tbWVudF9lbmQpOiBOZXcgZnVuY3Rpb24uCi0JKHNfYWxpZ25fYnl0ZXMpOiBVc2UgbXJpX2NvbW1lbnRfZmllbGQuCi0JKHNfYWxpZ25fcHR3bywgc19jb21tLCBzX21yaV9jb21tb24sIHNfZmFpbCwgc19nbG9ibCk6IExpa2V3aXNlLgotCShzX2Zsb2F0X3NwYWNlLCBzX3N0cnVjdCk6IExpa2V3aXNlLgotCShzX3NwYWNlKTogVXNlIG1yaV9jb21tZW50X2ZpZWxkIHJhdGhlciB0aGFuIGRvaW5nIGl0IGJ5IGhhbmQuCi0JKGNvbnNfd29ya2VyLCBlcXVhbHMpOiBMaWtld2lzZS4KLQkoc19lbmQpOiBJZ25vcmUgY29tbWVudHMgc3RhcnRpbmcgd2l0aCAnKicgb3IgJyEnLgotCSogcmVhZC5oIChtcmlfY29tbWVudF9maWVsZCk6IERlY2xhcmUuCi0JKG1yaV9jb21tZW50X2VuZCk6IERlY2xhcmUuCi0JKiBjb25kLmMgKHNfaWYpOiBVc2UgbXJpX2NvbW1lbnRfZmllbGQuCi0JKiBjb25maWcvdGMtbTY4ay5jIChzX2NoaXAsIHNfcmVnKTogTGlrZXdpc2UuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBIYW5kbGUgQUJTLXN5bSBpbiAtc3ltIGNhc2UgcmF0aGVyIHRoYW4KLQlzeW0tc3ltIGNhc2UuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLiAgUGVybWl0IG5lZ2F0aXZlCi0Jc3ltYm9scyBpZiBUQ19NNjhLLgotCSogY29uZmlnL3RjLW02OGsuYyAodGNfY29mZl9maXgycnR5cGUpOiBJZiBmeF90Y2JpdCBpcyBzZXQsIHJldHVybgotCVJfUkVMTE9OR19ORUcuCi0JKHRjX2dlbl9yZWxvYyk6IElmIGZ4X3RjYml0IGlzIHNldCwgYWJvcnQuCi0JKG1kX2FwcGx5X2ZpeF8yKTogRm9yIGEgbmVnYXRpdmUgcmVsb2MsIG1vdmUgZnhfc3Vic3kgdG8gZnhfYWRkc3ksCi0JYW5kIHNldCBmeF90Y2JpdC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoc19yZWcpOiBJZ25vcmUgY29tbWVudCBmaWVsZCBpbiBNUkkgbW9kZS4KLQotTW9uIFNlcCAxOCAxNDo0NDowNCAxOTk1ICBBcm5lIEguIEp1dWwgIDxhcm5lakBwdnYudW5pdC5ubz4KLQotCSogY29uZmlndXJlLmluIChtaXBzLWRlYy1uZXRic2QqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotU3VuIFNlcCAxNyAyMjoxNzo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGVuZGlhbiB0byBsaXR0bGUgZm9yIG1pcHMtKi11bHRyaXgqLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgU2VwIDE1IDEzOjE2OjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChjdXJyZW50X2xvY2F0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4gIEhhbmRsZSBtYWdpYwotCXN5bWJvbCBgLic7IGluIGFic29sdXRlIHNlY3Rpb24sIHJldHVybiBhIGNvbnN0YW50LgotCShvcGVyYW5kKTogQ2FsbCBjdXJyZW50X2xvY2F0aW9uIGZvciAnLicgYW5kICckJywgaW5zdGVhZCBvZiBkb2luZwotCWl0IGlubGluZS4gIEluIE1SSSBtb2RlLCBjYWxsIGN1cnJlbnRfbG9jYXRpb24gZm9yICcqJy4KLQotRnJpIFNlcCAxNSAyMTozOToyOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLW02OGsuYzogQ2hhbmdlIHNvbWUgIkNPTlNUIiByZWZlcmVuY2VzIHRvICJjb25zdCIuCi0KLUZyaSBTZXAgMTUgMTc6Mjc6NDEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlUdWUgU2VwIDEyIDE3OjA4OjIzIDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfc3RhYl9wYXJzZSk6IHNpbXBsaWZ5IGZpcnN0IGxvb3A7Ci0JdXNlIFNfR0VUX05BTUUvbW9kaWZ5L1NfU0VUX05BTUUgc2VxdWVuY2UgaW5zdGVhZCBvZiBhYnVzaW5nCi0JU19HRVRfTkFNRSB3aGVuIHVwZGF0aW5nIHN5bWJvbCBuYW1lLgotCShsb2NhbF9zeW1ib2xzX0RTVCk6IGZpcnN0IHByZWZpeC9wb3N0Zml4IHR5cG8gZnJvbSBKdWx5IDIxc3QuCi0JW3BsdXMgY29tbWVudCByZWZvcm1hdHRpbmcgLS1rcl0KLQotV2VkIFNlcCAxMyAxMjozMzowMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChFWFBFQ1QpOiBOZXcgdmFyaWFibGUuCi0JKENIRUNLRkxBR1MpOiBSZW1vdmUuCi0JKHNpdGUuZXhwKTogTmV3IHRhcmdldC4KLQkoY2hlY2spOiBSZXdyaXRlIHRvIGludm9rZSBydW50ZXN0IGRpcmVjdGx5LCByYXRoZXIgdGhhbiByZWN1cnJpbmcKLQlkb3duIGludG8gdGVzdHN1aXRlLgotCShjbGVhbi1oZXJlKTogUmVtb3ZlIHRlc3RzdWl0ZSBkaXJlY3RvcnkuCi0JKGNsZWFuLCBkaXN0Y2xlYW4pOiBEb24ndCByZWN1ciBpbnRvIHRlc3RzdWl0ZS4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBBQ19DT05GSUdfU1VCRElSUyh0ZXN0c3VpdGUpLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpOiBDaGFuZ2UgdG8gdGhlIHNlZ21lbnQgd2UgYXJlCi0JcmVsYXhpbmcsIGluIGNhc2UgbWRfY29udmVydF9mcmFnLCBjYWxsZWQgYnkgY3Z0X2ZyYWdfdG9fZmlsbCwKLQl3YW50cyB0byBjYWxsIGZpeF9uZXcuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogUGVybWl0IFBDIHJlbGF0aXZlIGNvZGUgaWYgdGhlCi0Jc2VnbWVudCBvZiB0aGUgc3ltYm9sIGlzIHRoZSBjdXJyZW50IHNlZ21lbnQsIG5vdCBqdXN0IGluCi0JdGV4dF9zZWN0aW9uLgotCShtZF9jb252ZXJ0X2ZyYWdfMSk6IERvbid0IGNhbGwgc3Vic2VnX2NoYW5nZS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBMaWtld2lzZS4KLQotVHVlIFNlcCAxMiAxMDozNjo0MCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2F0b2YpOiBGaXggZGVidWdnaW5nIHByaW50ZiwgYW5kIGxlYXZlIGl0Ci0Jb3V0IGJ5IGRlZmF1bHQuCi0KLU1vbiBTZXAgMTEgMTE6Mzk6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvY29uZmlndXJlLmluOiBSZW1vdmUgdW51c2VkIGZpbGUuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IEdyYWIgYWxsIGF2YWlsYWJsZSBzcGFjZXMgYXQgc3RhcnQgb2YKLQlsaW5lIGJlZm9yZSBwcmVzZXJ2aW5nIGEgc2luZ2xlIHNwYWNlLiAgUmVtb3ZlIHN0YXRlID09IDAgdGVzdAotCXdoaWNoIHdpbGwgbmV2ZXIgc3VjY2VlZC4KLQkqIG1hY3JvLmMgKG1hY3JvX2V4cGFuZF9ib2R5KTogRGVsZXRlIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZQotCWZvcm1hbCBoYXNoIHRhYmxlLgotCShtYWNyb19leHBhbmQpOiBJbiBNUkkgbW9kZSwgc3RvcCB3aGVuIHdoaXRlc3BhY2UgaXMgc2VlbiBpbiB0aGUKLQlhcmd1bWVudCBsaXN0LgotCi0JKiBzYi5jOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuCi0JKiBtYWNyby5jOiBMaWtld2lzZS4gIEFsc28gaW5jbHVkZSA8c3RkbGliLmg+IGlmIGl0IGV4aXN0cy4KLQotRnJpIFNlcCAgOCAwMDoyNzo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IEluIE1SSSBtb2RlLCBrZWVwIGEgc3BhY2UgYmVmb3JlIGEKLQlwb3NzaWJsZSBjb21tZW50IGNoYXJhY3Rlci4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBJbiBNUkkgbW9kZSwgaWdub3JlIGFueXRoaW5nIGFmdGVyCi0JYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggdGFrZXMgbm8gb3BlcmFuZHMuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgaW5zdGFsbCBnYXNwIGluICQodG9vbGRpcikuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogSGFuZGxlIGEgbm9uIHplcm8gYmFzZSByZWdpc3RlciBmb3IKLQlNX1V7TCxTfXtELFcsSH1fQS4KLQotCSogZ2FzcC5jIChzaG93X3VzYWdlKTogUHV0IHByb2dyYW1fbmFtZSBhcmd1bWVudCBpbiBmaXJzdCBmcHJpbnRmLAotCW5vdCBzZWNvbmQuCi0KLVRodSBTZXAgIDcgMTI6MzM6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBIYW5kbGUgMDggYW5kIDA5IGluIE1SSSBtb2RlLgotCSogbWFjcm8uYyAoSVNTRVApOiBSZW1vdmUgZHVwbGljYXRlZCBgIicgY2hhcmFjdGVyLgotIAkoZ2V0X2FueV9zdHJpbmcpOiBDb3B5IHNvbWUgY2hhcmFjdGVycyBmb3Igd2hpY2ggSVNTRVAgaXMgdHJ1ZToKLQknOycsICc+JywgJygnLCAnKScuICBPdGhlcndpc2Ugd2UgY2FuIGdldCBpbiBhbiBpbmZpbml0ZSBsb29wLgotCSogcmVhZC5jIChzX3NwYWNlKTogSW4gTVJJIG1vZGUsIHRoZSBleHByZXNzaW9ucyBzdG9wIGF0IHRoZSBmaXJzdAotCXVucXVvdGVkIHNwYWNlLgotCShjb25zX3dvcmtlcik6IEluIE1SSSBtb2RlLCByZXN0b3JlIHRoZSB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIgYXQKLQl0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4KLQotCSogcmVhZC5jIChjb25zX3dvcmtlcik6IERvbid0IHVzZSAjZWxpZjsgb2xkIGNvbXBpbGVycyBkb24ndAotCXN1cHBvcnQgaXQuCi0KLVdlZCBTZXAgIDYgMjE6MTM6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBJbiBNUkkgbW9kZSwgc2lsZW50bHkgZW5kIHF1b3RlZCBzdHJpbmdzCi0JYXQgbmV3bGluZSBjaGFyYWN0ZXJzLiAgSW4gTVJJIG1vZGUsIGFsd2F5cyBrZWVwIHNwYWNlcyBpbiB0aGUKLQlvcGVyYW5kcyBmaWVsZC4gIEluIE1SSSBtb2RlLCB0cmVhdCBhIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIgYXMgYQotCXJlZ3VsYXIgY29tbWVudCBjaGFyYWN0ZXIgZm9sbG93aW5nIGEgc3BhY2UuCi0JKiBjb25kLmMgKGlnbm9yZV9pbnB1dCk6IFVzZSBzdHJuY2FzZWNtcCByYXRoZXIgdGhhbiBzdHJuY21wIHdoZW4KLQlsb29raW5nIGZvciBzcGVjaWFsIHBzZXVkby1vcHMuCi0JKiByZWFkLmMgKGNvbnNfd29ya2VyKTogSW4gTVJJIG1vZGUsIHRoZSBleHByZXNzaW9ucyBzdG9wIGF0IHRoZQotCWZpcnN0IHVucXVvdGVkIHNwYWNlLgotCShlcXVhbHMpOiBMaWtld2lzZS4KLQotV2VkIFNlcCAgNiAxNTowMzo1MyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChnZXRfb3BlcmFuZHMpOiBSZWFkIHRoaXJkIGFyZyBpZiBpdCBleGlzdHMuCi0JT3RoZXJ3aXNlLCBjbGVhciBpdC4KLQkoZ2V0X3NwZWNpZmljLCBjYXNlIEZfRlIwKTogQWRkLgotCi1XZWQgU2VwICA2IDE1OjAzOjUzIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKGdldF9zcGVjaWZpYyk6IERlbGV0ZSBhcmdfdG9fdGVzdC4KLQkobWRfYXNzZW1ibGUpOiBJbmNyZWFzZSBvcGVyYW5kIGFycmF5IGZyb20gMiB0byAzLgotCi1UdWUgU2VwICA1IDE2OjQ3OjM2IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogUmVtb3ZlIENZR05VUyBMT0NBTCBjb21tZW50cy4KLQkobWRfYmVnaW4pOiBVc2UgMC8xIGluc3RlYWQgb2YgVFJVRS9GQUxTRS4KLQkobWRfc2hvd191c2FnZSk6IEJyZWFrIHVwIGxvbmcgZm9ybWF0IHN0cmluZyBmb3IgdGhlIGJlbmVmaXQKLQlvZiBsYW1lIGNvbXBpbGVycy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX3Nob3dfdXNhZ2UpOiBEaXR0by4KLQkqIGdhc3AuYyAoc2hvd191c2FnZSk6IERpdHRvLgotCSogbWFjcm8uYyAoY2hlY2tfbWFjcm8pOiBDYXN0IHJlc3VsdCBvZiBoYXNoX2ZpbmQuCi0KLVR1ZSBTZXAgIDUgMTQ6NDY6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogV2hlbiB0ZXN0aW5nIGZvciBhIGZyZWUoKSBkZWNsYXJhdGlvbiBpbiBzeXN0ZW0KLQloZWFkZXIgZmlsZXMsIGNhc3QgdGhlIGFkZHJlc3MgdG8gYSBmdW5jdGlvbiBwb2ludGVyLCBub3QgdG8gYW4KLQlpbnRlZ2VyLgotCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogQ2FsbCBUQ19JTklUX0ZJWF9EQVRBIGlmIFRDX0ZJWF9UWVBFCi0JaXMgZGVmaW5lZC4gIERvbid0IGluaXRpYWxpemUgZnhfYnNyLiAgVmVyaWZ5IHRoYXQgZnhfc2l6ZSBmaWVsZAotCWlzIHdpZGUgZW5vdWdoIHRvIGhvbGQgc3RvcmVkIHZhbHVlLgotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IENoYW5nZSB0Y19maXhfZGF0YSB0byB0eXBlIFRDX0ZJWF9UWVBFIGlmCi0JdGhhdCBpcyBkZWZpbmVkLCBvdGhlcndpc2Ugb21pdCBpdC4gIERlbGV0ZSBmeF9ic3IuICBDaGFuZ2UKLQlmeF9zaXplIHRvIHVuc2lnbmVkIGNoYXIuCi0JKiBjb25maWcvdGMtaTk2MC5oIChUQ19GSVhfVFlQRSwgZnhfYnNyLCBUQ19JTklUX0ZJWF9EQVRBKTogTmV3Ci0JbWFjcm9zLgotCSogY29uZmlnL3RjLW5zMzJrLmggKFRDX0ZJWF9UWVBFLCBmeF9ic3IsIFRDX0lOSVRfRklYX0RBVEEpOiBOZXcKLQltYWNyb3MuCi0JKiBjb25maWcvdGMtaHBwYS5oIChUQ19GSVhfVFlQRSk6IERlZmluZSBhcyBQVFIuCi0KLQkqIGNvbmZpZy90Yy1pODYwLmMgKG1kX2FwcGx5X2ZpeCk6IERlbGV0ZSBjb2RlIGZvciBjaGVja2luZwotCWZ4X2ltX2Rpc3AsIGFuZCBmb3IgaGFuZGxpbmcgbm9uLXplcm8gdmFsdWVzLCBzaW5jZSBpdCBuZXZlciBnZXRzCi0Jc2V0IGFmdGVyIGJlaW5nIGluaXRpYWxpemVkIHRvIHplcm8uCi0KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBNYWtlIGZ4X2ltX2Rpc3AgYWx3YXlzIDIgYml0cywgc2luY2UgdGhlCi0Jb25seSB0Yy0qIGZpbGVzIGFjdHVhbGx5IHVzaW5nIGl0IG5lZWQgdGhhdCBtdWNoLgotCi0JTlMzMksgY2hhbmdlcyBmcm9tIElhbiBEYWxsOgotCSogY29uZmlndXJlLmluOiBUcmVhdCBuczMyay1wYzUzMi11eCogbGlrZSBuczMyay1wYzUzMi1tYWNoKiwgYW5kCi0JbnMzMmstcGM1MzItbGl0ZXMqIGxpa2UgbnMzMmstcGM1MzItbmV0YnNkKi4KLQkqIGNvbmZpZy90Yy1uczMyay5oIChMT0NBTF9MQUJFTFNfRkIpOiBEZWZpbmUgdG8gMS4KLQotRnJpIFNlcCAgMSAxNzowMjoxNSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogR2V0IFRDX0ZPUkNFX1JFTE9DQVRJT04gdXAgdGhlCi0JcmlnaHQgd2F5IQotCi1GcmkgU2VwICAxIDA4OjIwOjE5IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGJlYXV0eS5jeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAobWRfcGFyc2Vfb3B0aW9uLCBtZF9iZWdpbiwgbWRfc2hvd191c2FnZSk6Ci0JQWRkIHN1cHBvcnQgZm9yICItbWNwdT12cjQzMDAiIGFzIHByb2Nlc3NvciBpZGVudGlmaWVyLgotCi1UaHUgQXVnIDMxIDE2OjQxOjA2IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBSZW1vdmUgY2hhbmdlIG9mIDI5dGguCi0JKiBjb25maWcvdGMte2kzODYsYXJtfS5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogS2VlcCBSVkEgcmVsb2NzLgotCi1UdWUgQXVnIDI5IDE5OjQyOjU4IDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKSBbY2FzZSBQT1NUL1BSRS9CQVNFXTogRml4IHR5cG8gd2hlbgotIAlsb29raW5nIGF0IG91dGVyIGRpc3BsYWNlbWVudC4gIERvbid0IHNldCB0aGUgcG9zdGluZGV4IGJpdCBpZiB0aGUKLSAJaW5kZXggc3VwcHJlc3MgYml0IGlzIHNldCAoZm9yIG1lbW9yeSBpbmRpcmVjdCBhZGRyZXNzaW5nIG1vZGUpLgotCi1UaHUgQXVnIDMxIDA2OjQ5OjM3IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAodGNfZ2VuX3JlbG9jKTogRGVsZXRlIGR1cGxpY2F0ZWQgY29kZS4KLQotV2VkIEF1ZyAzMCAyMzo1MTo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IEZyZWUgc2F2ZWRfaW5wdXQgd2hlbiB0aGUgZnJvbSBidWZmZXIKLQlleGFjdGx5IGZpbGxzIHRoZSB0byBidWZmZXIuCi0KLVdlZCBBdWcgMzAgMTM6NDY6MzkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHBhcnNlX2tleXdvcmRfYXJnLCBwYXJzZV9jb25zdF9leHByX2FyZyk6IE5ldyBmbnMuCi0JKHNwYXJjX2lwKTogQ2FsbCB0aGVtIGZvciBhc2ksIG1lbWJhciwgYW5kIHByZWZldGNoIHBhcnNpbmcuCi0KLVR1ZSBBdWcgMjkgMTU6NDU6MzcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1lbWJhcl9tYXNrcyk6IERlbGV0ZWQuCi0JKHNwYXJjX2lwKTogQ2xlYW4gdXAgQVNJIGFuZCBtZW1iYXIgc3VwcG9ydC4KLQotVHVlIEF1ZyAyOSAxMzoyMDoyNyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBSdmEgaXMgbmV3IGVudHJ5LgotCShjb25zX3dvcmtlcik6IE5ldywgc3BsaXQgZnJvbSBjb25zLiAgSGFuZGxlcyBydmEuCi0JKGNvbnMsIHNfcnZhKTogQ2FsbCBjb25zX3dvcmtlci4KLQkqIHJlYWQuaCAoc19ydmEpOiBOZXcgZGVjbGFyYXRpb24uCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgdGhyb3cgYXdheSBydmEgcmVsb2NzLgotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgsIHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBSVkEuCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19jb2ZmX2ZpeDJ0eXBlKTogSGFuZGxlIFJWQS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX0NPVU5UX1JFTE9DKTogUmVtZW1iZXIgUlZBcy4KLQkoVENfUlZBX1JFTE9DKTogTmV3IGRlZmluaXRpb24uCi0KLVN1biBBdWcgMjcgMTc6NDE6MDUgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChkb19zd2kpOiBBbGxvdyBvcHRpb25hbCBsZWFkaW5nICcjJy4KLQotU2F0IEF1ZyAyNiAxNzoyNDoyMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGNvbW1lbnRfY2hhcnMpOiBJZiBURV9ERUxUQSBpcyBkZWZpbmVkLAotCWluY2x1ZGUgJyMnLgotCSogY29uZmlnL3RjLW02OGsuaCAoTk9fUFNFVURPX0RPVCk6IERlZmluZSBpZiBURV9ERUxUQSBpcwotCWRlZmluZWQuCi0KLQkqIGNvbmZpZy90ZS1kZWx0YS5oOiBJbmNsdWRlIG9iai1mb3JtYXQuaC4KLQkqIGNvbmZpZy90ZS1zY28zODYuaDogTGlrZXdpc2UuCi0JKiBjb25maWcvdGUtc3lzdjMyLmg6IExpa2V3aXNlLgotCi0JKiBhcHAuYyAoc2NydWJfZmlsZSk6IFJlbW92ZS4KLQkoc2NydWJfZnJvbV9maWxlLCBzY3J1Yl90b19maWxlKTogUmVtb3ZlLgotCShzY3J1Yl9zdHJpbmcsIHNjcnViX2xhc3Rfc3RyaW5nKTogUmVtb3ZlLgotCShzY3J1Yl9mcm9tX3N0cmluZywgc2NydWJfdG9fc3RyaW5nKTogUmVtb3ZlLgotCShzYXZlZF9pbnB1dCwgc2F2ZWRfaW5wdXRfbGVuKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKHN0cnVjdCBhcHBfc2F2ZWQpOiBSZW1vdmUgc2NydWJfc3RyaW5nLCBzY3J1Yl9sYXN0X3N0cmluZywgYW5kCi0Jc2NydWJfZmlsZSBmaWVsZHMuICBBZGQgc2F2ZWRfaW5wdXQgYW5kIHNhdmVkX2lucHV0X2xlbiBmaWVsZHMuCi0JKGFwcF9wdXNoKTogQWRqdXN0IHNhdmVkIGZpZWxkcyBmb3IgY2hhbmdlcyBpbiBzdHJ1Y3QgYXBwX3NhdmUuCi0JSW5pdGlhbGl6ZSBzdGF0ZSBhbmQgc2F2ZWRfaW5wdXQuCi0JKGFwcF9wb3ApOiBBZGp1c3Qgc2F2ZWQgZmllbGRzIGZvciBjaGFuZ2VzIGluIHN0cnVjdCBhcHBfc2F2ZS4KLQkoZG9fc2NydWJfY2hhcnMpOiBSZW5hbWUgZnJvbSBkb19zY3J1Yl9uZXh0X2NoYXIgYW5kIHJld3JpdGUgdG8KLQlwcm9jZXNzIGEgYnVmZmVyIGF0IGEgdGltZSByYXRoZXIgdGhhbiBhIGNoYXJhY3RlciBhdCBhIHRpbWUuCi0JKG1haW4sIGFzX3dhcm4pOiBSZW1vdmUgb2Jzb2xldGUgdGVzdGluZyBjb2RlLgotCSogYXMuaCAoZG9fc2NydWJfbmV4dF9jaGFyKTogRG9uJ3QgZGVjbGFyZS4KLQkoZG9fc2NydWJfY2hhcnMpOiBEZWNsYXJlLgotCShzY3J1Yl9mcm9tX2ZpbGUsIHNjcnViX2Zyb21fc3RyaW5nKTogRG9uJ3QgZGVjbGFyZS4KLQkoc2NydWJfdG9fZmlsZSwgc2NydWJfdG9fc3RyaW5nKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGlucHV0LWZpbGUuYyAoaW5wdXRfZmlsZV9nZXQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShpbnB1dF9maWxlX2dpdmVfbmV4dF9idWZmZXIpOiBDYWxsIGRvX3NjcnViX2NoYXJzIHJhdGhlciB0aGFuCi0JZG9fc2NydWJfbmV4dF9jaGFyLgotCSogcmVhZC5jIChzY3J1Yl9zdHJpbmcsIHNjcnViX3N0cmluZ19lbmQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoc2NydWJfZnJvbV9zdHJpbmcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBDYWxsIGRvX3NjcnViX2NoYXJzIHJhdGhlciB0aGFuCi0JZG9fc2NydWJfbmV4dF9jaGFyLgotCi1UaHUgQXVnIDI0IDE4OjUwOjE5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZ2FzcC5jIChhc19hYm9ydCk6IE5ldyBmdW5jdGlvbi4KLQkqIHNiLmMgKHNiX2J1aWxkKTogUmV2ZXJ0IHllc3RlcmRheSdzIHBhdGNoLgotCi0JKiBNYWtlZmlsZS5pbiAoZ2FzcC5uZXcpOiBEZXBlbmQgdXBvbiAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEuCi0JSnVzdCBsaW5rIGFnYWluc3QgbGliaWJlcnR5LCBub3QgYWdhaW5zdCAkKExJQlMpLgotCi1XZWQgQXVnIDIzIDE1OjE4OjIwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc2IuYyAoc2JfYnVpbGQpOiBVbmRlZmluZSBhYm9ydCBiZWZvcmUgY2FsbGluZyBpdCwgc2luY2UgZ2FzcAotCWRvZXMgbm90IHByb3ZpZGUgYXNfYWJvcnQuCi0KLVdlZCBBdWcgMjMgMTA6NDA6NDEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHNldF90YXJnZXRfZW5kaWFuKTogTmV3IHN0YXRpYyB0byBzYXkgd2hldGhlcgotCXdlJ3ZlIGluaXRpYWxpemVkIHRhcmdldF9iaWdfZW5kaWFuIG9yIG5vdC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogU2V0IHNldF90YXJnZXRfZW5kaWFuIGlmIHdlIHNldCB0aGUgdmFyaWFibGUKLQl0YXJnZXRfYmlnX2VuZGlhbi4KLQkobWRfYmVnaW4pOiBPbmx5IHNldCB0YXJnZXRfYmlnX2VuZGlhbiBpZiAhc2V0X3RhcmdldF9lbmRpYW4uCi0KLVR1ZSBBdWcgMjIgMDM6MDA6MzMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JU2F0IEF1ZyAxOSAxODowODoxNiAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuaCAoRFNUX1NfQ19TUkNfU0VUUkVDX1csIERTVF9TX0NfU1JDX0RFRkxJTkVTX0IpOgotCU5ldyBtYWNyb3MuCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24sCi0JVk1TX1RCVF9Tb3VyY2VfTGluZXMpOiBNYWtlIHRyYWNlYmFjayBpbmZvIGJlIHJvYnVzdCBlbm91Z2ggdG8KLQloYW5kbGUgaHVnZSBzb3VyY2UgZmlsZXMuCi0JKFZNU19UQlRfU291cmNlX0ZpbGUpOiBSZW9yZ2FuaXplIHRoZSBuYXRpdmUtIHZzIGNyb3NzLWFzc2VtYmx5Ci0Jc3VwcG9ydCBzbyB0aGF0IGFjdHVhbCBvYmplY3QgZmlsZSBvdXRwdXQgaXMgY2xlYXJlci4KLQkoVk1TX1RCVF9Tb3VyY2VfRmlsZTogRmFiLCBOYW0sIERhdGVfWGFiLCBGaWxlX0hlYWRlcl9YYWIpOgotCVJlcGxhY2Ugc3RhdGljIHZhcmlhYmxlcyB3aXRoIGF1dG9tYXRpYyBvbmVzLgotCi0JU2F0IEF1ZyAxMiAyMDoxODoxNSAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuYyAoTW9kdWxlX05hbWUpOiBuZXcgZmlsZSBzY29wZSB2YXJpYWJsZS4KLQkoVk1TX1RCVF9Nb2R1bGVfQmVnaW4pOiB1c2UgaXQgaW5zdGVhZCBvZiBsb2NhbCB2YXJpYWJsZS4KLQkoV3JpdGVfVk1TX01IRF9SZWNvcmRzKTogZGl0dG87IGFzc2lnbiBpdHMgdmFsdWUgaGVyZS4KLQkoV3JpdGVfVk1TX0VPTV9SZWNvcmQpOiBzZWNvbmQgYXJndW1lbnQgaGFzIHR5cGUgdmFsdWVULgotCShWTVNfSW5pdGlhbGl6ZWRfRGF0YV9TaXplKTogIHNpbXBsaWZ5IHNlYXJjaCBsb29wOyByZXR1cm4KLQl0eXBlIGlzIG9mZnNldFQ7IHNlY29uZCBhcmd1bWVudCBpcyB1bnNpZ25lZC4KLQotCVNhdCBKdW4gMTcgMTk6MDU6MjUgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX3BlcnJvcik6IFVzZSB4c3RyZXJyb3IgaW5zdGVhZCBvZiBzdHJlcnJvci4KLQotTW9uIEF1ZyAyMSAxMzo1NzoyMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBBY2NlcHQgLS1kZWZzeW0gU1lNPVZBTFVFLgotCSogZG9jL2FzLnRleGluZm8sIGRvYy9hcy4xOiBEb2N1bWVudCAtLWRlZnN5bS4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBJbiBNUkkgbW9kZSwgZG9uJ3QgZW5kIHRoZQotCXN0YXRlbWVudCBpbnNpZGUgYSBxdW90YXRpb24uCi0JKHNfc3BhY2UpOiBEb24ndCB3YXJuIGFib3V0IGEgemVybyByZXBlYXQgY291bnQgaW4gTVJJIG1vZGUuCi0JKiBjb25maWcvdGMtbTY4ay5jIChjcmFja19vcGVyYW5kKTogSW4gTVJJIG1vZGUsIGRvbid0IGNvdW50Ci0JcGFyZW50aGVzZXMgaW5zaWRlIHF1b3Rlcy4KLQkobWRfYXNzZW1ibGUpOiBJbiBNUkkgbW9kZSwgYW55dGhpbmcgYWZ0ZXIgdGhlIG9wZXJhbmRzIGZpZWxkIGlzIGEKLQljb21tZW50LgotCShwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kKTogQWRqdXN0IHN0YXJ0IGFuZCBzdG9wIHRvIHJlbW92ZQotCXNwYWNlcy4KLQkoc19tcmlfZm9yKTogTGlrZXdpc2UuCi0KLQkqIGNvbmQuYyAoc19pZmRlZik6IFJlc3RvcmUgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgc3ltYm9sIG5hbWUsCi0JaW4gY2FzZSBpdCBpcyBhIG5ld2xpbmUuCi0JKHNfaWYpOiBJZiBpZ25vcmluZyB0aGUgY3VycmVudCB0cmVlLCBkb24ndCB0cnkgdG8gcGFyc2UgdGhlCi0JZXhwcmVzc2lvbi4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IElmIExFWF9JU19TVFJJTkdRVU9URSBvcgotCUxFWF9JU19PTkVDSEFSX1FVT1RFIGlzIHNlZW4gaW4Jc3RhdGUgMTAsIHByZXNlcnZlIG9uZSBzcGFjZS4KLQotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IGlycCwgaXJwYywgbWFjcm8sIGFuZCByZXB0LiBNUkkgbW9kZQotCW5vdyBzdXBwb3J0cyBtYWNyb3MsIGlmYywgaWZuYywgaXJwLCBpcnBjLCByZXB0LCBhbmQgZW5kciwgd2l0aG91dAotCXVzaW5nIGdhc3AuCi0KLQlBZGQgc3VwcG9ydCBmb3IgbWFjcm9zLgotCSogYXMuYzogSW5jbHVkZSBzYi5oIGFuZCBtYWNyby5oLgotCShtYXhfbWFjcm9fbmV4dCk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKG1haW4pOiBDYWxsIG1hY3JvX2luaXQuCi0JKG1hY3JvX2V4cHIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogYXMuaCAobWF4X21hY3JvX25lc3QpOiBEZWNsYXJlLgotCSogcmVhZC5jIChsaW5lX2xhYmVsKTogUmVuYW1lIGZyb20gbXJpX2xpbmVfbGFiZWwuICBDaGFuZ2UgYWxsCi0JdXNlcy4KLQkocG90YWJsZSk6IEFkZCBleGl0bSwgaXJwLCBpcnBjLCBtYWNybywgbWV4aXQsIHJlcHQuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEFsd2F5cyBjbGVhciBsaW5lX2xhYmVsIGF0IHRoZSBzdGFydCBvZiBhCi0JbGluZSwgbm90IGp1c3Qgd2hlbiBmbGFnX21yaSBvciBMQUJFTFNfV0lUSE9VVF9DT0xPTlMuICBGaXgKLQlNUkkvTEFCRUxTX1dJVEhPVVRfQ09MT05TIGhhbmRsaW5nLiAgSW4gTVJJIG1vZGUsIHBlcm1pdCBsYWJlbDoKLQllcXUgdmFsLiAgU2V0IGxpbmVfbGFiZWwgd2hlbiBjYWxsaW5nIGNvbG9uLiAgSW4gTVJJIG1vZGUsIGEKLQlsZWFkaW5nICcuJyBkb2VzIG5vdCBpbXBseSBhIHBzZXVkby1vcC4gIENoZWNrIGZvciBtYWNybyBleHBhbnNpb24KLQliZWZvcmUgY2FsbGluZyBtZF9hc3NlbWJsZS4KLQkoc19pcnApOiBOZXcgZnVuY3Rpb24uCi0JKGdldF9saW5lX3NiKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc19tYWNybyk6IE5ldyBmdW5jdGlvbi4KLQkoc19tZXhpdCk6IE5ldyBmdW5jdGlvbi4KLQkoc19yZXB0KTogTmV3IGZ1bmN0aW9uLgotCSogcmVhZC5oIChsaW5lX2xhYmVsKTogUmVuYW1lIGZyb20gbXJpX2xpbmVfbGFiZWwuCi0JKHNfaXJwLCBzX3JlcHQpOiBEZWNsYXJlLgotCShzX21hY3JvLCBzX21leGl0KTogRGVjbGFyZS4KLQkqIGlucHV0LXNjcnViLmM6IEluY2x1ZGUgc2IuaC4KLQkoc2JfaW5kZXgsIGZyb21fc2IpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkobWFjcm9fbmVzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHN0cnVjdCBpbnB1dF9zYXZlKTogQWRkIHNiX2luZGV4IGFuZCBmcm9tX3NiIGZpZWxkcy4gIENoYW5nZQotCW5leHRfc2F2ZWRfZmlsZSBmaWVsZCB0byBiZSBzdHJ1Y3QgaW5wdXRfc2F2ZSAqLgotCShuZXh0X3NhdmVkX2ZpbGUpOiBDaGFuZ2VkIHRvIGJlIHN0cnVjdCBpbnB1dF9zYXZlICouCi0JKGlucHV0X3NjcnViX3B1c2gpOiBDaGFuZ2UgdG8gcmV0dXJuIHR5cGUgc3RydWN0IGlucHV0X3NhdmUgKi4KLQlTYXZlIHNiX2luZGV4IGFuZCBmcm9tX3NiLgotCShpbnB1dF9zY3J1Yl9wb3ApOiBDaGFuZ2UgcGFyYW1ldGVyIHR5cGUgdG8gc3RydWN0IGlucHV0X3NhdmUgKi4KLQlSZXN0b3JlIHNiX2luZGV4IGFuZCBmcm9tX3NiLgotCShpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiKTogTmV3IGZ1bmN0aW9uLgotCShpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlcik6IEhhbmRsZSByZWFkaW5nIGZyb20gZnJvbV9zYi4KLQkoYnVtcF9saW5lX2NvdW50ZXJzKTogT25seSBpbmNyZW1lbnQgbGluZXMgaWYgbm90IHVzaW5nIGZyb21fc2IuCi0JKiBjb25maWcvdGMtbTY4ay5jIChvcHRfdGFibGUpOiBBZGQgbmVzdC4KLQkob3B0X25lc3QpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogZ2FzcC5jOiBJbmNsdWRlIHNiLmggYW5kIG1hY3JvLmguICBNb3ZlIGFsbCBzYiByZWxhdGVkIGZ1bmN0aW9ucwotCWFuZCBkZWZpbml0aW9ucyB0byBzYi5oIGFuZCBzYi5jLiAgTW92ZSBhbGwgbWFjcm8gcmVsYXRlZAotCWZ1bmN0aW9ucyBhbmQgZGVmaW5pdGlvbnMgdG8gbWFjcm8uaCBhbmQgbWFjcm8uYy4KLQkqIHNiLmgsIHNiLmM6IE5ldyBmaWxlcywgZXh0cmFjdGVkIGZyb20gZ2FzcC5jLgotCSogbWFjcm8uaCwgbWFjcm8uYzogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbiAoT0JKUyk6IEFkZCBzYi5vIGFuZCBtYWNyby5vCi0JKEdBU1BPQkpTKTogRGVmaW5lLgotCShnYXNwLm5ldyk6IERlcGVuZCB1cG9uICQoR0FTUE9CSlMpLiAgVXNlICQoR0FTUE9CSlMpIHRvIGxpbmsuCi0JKFRBUkdfQ1BVX0RFUF9tNjhrKTogRGVwZW5kIHVwb24gc3Vic2Vncy5oLgotCShnYXNwLm8pOiBEZXBlbmQgdXBvbiBzYi5oIGFuZCBtYWNyby5oLgotCShzYi5vKTogTmV3IHRhcmdldC4KLQkobWFjcm8ubyk6IE5ldyB0YXJnZXQuCi0JKGFzLm8pOiBEZXBlbmQgdXBvbiBzYi5oIGFuZCBtYWNyby5oLgotCShpbnB1dC1zY3J1Yi5vKTogRGVwZW5kIHVwb24gc2IuaC4KLQkocmVhZC5vKTogRGVwZW5kIHVwb24gc2IuaCBhbmQgbWFjcm8uaC4KLQotCSogY29uZC5jIChnZXRfbXJpX3N0cmluZyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNfaWZjKTogTmV3IGZ1bmN0aW9uLgotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIGlmYyBhbmQgaWZuYy4KLQkqIHJlYWQuaCAoc19pZmMpOiBEZWNsYXJlLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBJbiBNUkkgbW9kZSwgc2V0IGxleCBvZiAnIHRvCi0JTEVYX0lTX1NUUklOR1FVT1RFLgotCi1Nb24gQXVnIDIxIDEzOjQxOjMzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2Fzc2VtYmxlKTogQWxsb3cgQEhBLCBATCwgYW5kIEBIIHN1ZmZpeGVzIG9uCi0JY29uc3RhbnQgZXhwcmVzc2lvbnMuCi0KLVN1biBBdWcgMjAgMTU6NTQ6MzcgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX3JlbG9jX3NpemUpOiBBZGQgY29uc3QgdG8gZGVjbGFyYXRpb24uCi0KLUZyaSBBdWcgMTggMTA6NTg6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfaW5jbHVkZSk6IEluIE1SSSBtb2RlLCBkb24ndCBleHBlY3QgcXVvdGVzIGFyb3VuZCB0aGUKLQlmaWxlIG5hbWUuCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfdGl0bGUpOiBEb24ndCByZXF1aXJlIHRoZSB0aXRsZSB0byBiZSBxdW90ZWQuCi0KLQkqIGdhc3AuYyAoaW5jbHVkZV9wcmludF93aGVyZV9saW5lKTogQWx3YXlzIHN1YnRyYWN0IDEgZnJvbQotCWxpbmVjb3VudCBiZWZvcmUgcHJpbnRpbmcgaXQuCi0JKHByb2Nlc3NfZmlsZSk6IEluIE1SSSBtb2RlLCBsaW5lcyBiZWdpbm5pbmcgd2l0aCAnKicgb3IgJyEnIGFyZQotCWNvbW1lbnRzLgotCShkb19yZWcpOiBJbiBNUkkgbW9kZSwgZG9uJ3QgcmVxdWlyZSBwYXJlbnRoZXNlcy4KLQkoZG9faW5jbHVkZSk6IEluIE1SSSBtb2RlLCBkb24ndCByZXF1aXJlcyBxdW90ZXMuICBJZiB0aGUgZmlsZSBjYW4KLQlub3QgYmUgZm91bmQgaW4gdGhlIGluY2x1ZGUgcGF0aCwgdHJ5IG9wZW5pbmcgaXQgaW4gdGhlIGN1cnJlbnQKLQlkaXJlY3RvcnkuICBQcmludCB0aGUgZmlsZSBuYW1lIGNvcnJlY3RseSBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkoY2hhcnR5cGVfaW5pdCk6IEluIE1SSSBtb2RlLCBzZXQgRklSU1RCSVQgZm9yICcuJy4KLQkobWFpbik6IFNldCBjb21tZW50X2NoYXIgdG8gJzsnIHdoZW4gZW50ZXJpbmcgTVJJIG1vZGUuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IEluY2x1ZGUgc3Vic2Vncy5oLgotCShtNjhrX2lwKTogUGFzcyA2NCByYXRoZXIgdGhhbiAtMSB0byBhZGRfRml4IGluICdCJyAnQicgY2FzZS4KLQkobWRfcGNyZWxfZnJvbSk6IElmIGZ4X3BjcmVsX2FkanVzdCBpcyA2NCwgdXNlIC0xIGluc3RlYWQuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IEZvciBPQkpfQU9VVCBjYXNlLCBhZGp1c3QKLQlCRkRfUkVMT0NfMTYgYW5kIEJGRF9SRUxPQ18zMiByZWxvY3MuCi0KLVdlZCBBdWcgMTYgMTQ6NDg6NDQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBhcy5oIChhbGxvY2EpOiBVc2Ugdm9pZCogZGVjbGFyYXRpb24gb24gSFAvVVguCi0KLVdlZCBBdWcgMTYgMTI6NDk6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogSWYgUElDLCBvbmx5IGNoYW5nZSBQQ1JFTF9TMgotCXRvIFdQTFQzMCBmb3IgYW4gdW5kZWZpbmVkIG9yIGV4dGVybmFsIHN5bWJvbC4gIERvbid0IGNvbnNpZGVyCi0JUEMxMCBvciBQQzIyIHRvIGJlIGEgUEMgcmVsYXRpdmUgcmVsb2Mgd2hlbiBjaG9vc2luZyBiZXR3ZWVuCi0JZnhfYWRkbnVtYmVyIGFuZCBmeF9vZmZzZXQuCi0KLQkqIGNvbmZpZy90Yy16OGsuYyAobWRfbnVtYmVyX3RvX2NoYXJzKTogRG9uJ3QgZG8gaXQgaGVyZSwgY2FsbAotCW51bWJlcl90b19jaGFyc19iaWdlbmRpYW4uCi0JKiBjb25maWcvdGMtejhrLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBBZGQgc3VwcG9ydCBmb3IgLnN0YXJ0b2YuIGFuZCAuc2l6ZW9mLiBieQotCXVzaW5nIG1hZ2ljIHN5bWJvbCBuYW1lcyB3aGljaCB0aGUgbGlua2VyIHdpbGwgcmVjb2duaXplCi0Jc3BlY2lhbGx5LgotCSogZG9jL2FzLnRleGluZm86IFRha2Ugb3V0IG5vdGUgdGhhdCAuc3RhcnRvZi4gYW5kIC5zaXplb2YuIGFyZQotCW5vdCBzdXBwb3J0ZWQuCi0KLVR1ZSBBdWcgMTUgMTU6MDg6NDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgTVJJIHN0cnVjdHVyZWQgY29udHJvbAotCWRpcmVjdGl2ZXM6IGlmLCBpZi5iLCBpZi53LCBpZi5sLCBlbHNlLCBlbHNlLnMsIGVsc2UubCwgZW5kaSwKLQlicmVhaywgYnJlYWsucywgYnJlYWsubCwgbmV4dCwgbmV4dC5zLCBuZXh0LmwsIGZvciwgZm9yLmIsIGZvci53LAotCWZvci5sLCBlbmRmLCByZXBlYXQsIHVudGlsLCB1bnRpbC5iLCB1bnRpbC53LCB1bnRpbC5sLCB3aGlsZSwKLQl3aGlsZS5iLCB3aGlsZS53LCB3aGlsZS5sLCBlbmR3LgotCShlbnVtIG1yaV9jb250cm9sX3R5cGUpOiBEZWZpbmUuCi0JKHN0cnVjdCBtcmlfY29udHJvbF9pbmZvKTogRGVmaW5lLgotCShtcmlfY29udHJvbF9zdGFjayk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1yaV9jb250cm9sX2luZGV4KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobXJpX2NvbnRyb2xfbGFiZWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwdXNoX21yaV9jb250cm9sLCBwb3BfbXJpX2NvbnRyb2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkocGFyc2VfbXJpX2NvbmRpdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzd2FwX21yaV9jb25kaXRpb24sIHJldmVyc2VfbXJpX2NvbmRpdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNfbXJpX2lmLCBzX21yaV9lbHNlLCBzX21yaV9lbmRpKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHNfbXJpX2JyZWFrLCBzX21yaV9uZXh0KTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHNfbXJpX2Zvciwgc19tcmlfZW5kZik6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShzX21yaV9yZXBlYXQsIHNfbXJpX3VudGlsKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHNfbXJpX3doaWxlLCBzX21yaV9lbmR3KTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKiBnYXNwLmMgKG1yaWtpbmZvKTogUmVtb3ZlIElGLgotCSogZXhwci5jIChnZXRfc3ltYm9sX2VuZCk6IEFjY2VwdCBcMDAxIGFzIHBhcnQgb2YgYSBuYW1lLgotCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogQ2hhbmdlIHBhcmFtZXRlciB0byBjb25zdCBjaGFyICouCi0JKiBzeW1ib2xzLmggKGNvbG9uKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCi1Nb24gQXVnIDE0IDIwOjUxOjU2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBBbHdheXMgZG8gaXQgdGhlIEJGRF9GQVNUX1NFQ1RJT05fRklMTAotCXdheS4gIFJlZm9ybWF0IGFuZCByZWluZGVudCB0aGF0IGNvZGUgdG8gR05VIHN0YW5kYXJkcy4KLQkoQkZEX0ZBU1RfU0VDVElPTl9GSUxMKTogRG9uJ3QgZGVmaW5lLgotCi1Nb24gQXVnIDE0IDE0OjA4OjA3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBEb24ndCB0cnkgdG8gYXBwbHkgQkVHSU5fQlJUQUIKLQlvciBFTkRfQlJUQUIgZml4dXBzLgotCi1Nb24gQXVnIDE0IDE1OjQ1OjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzcC5jIChkb19hbGlnbiwgZ2V0X2FueV9zdHJpbmcpOiBNYXJrIGFzIHN0YXRpYy4KLQkoZG9fYXNzaWduYSwgZG9fYXNzaWduYywgbmV3X2ZpbGUpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoc19yZWcpOiBSZW5hbWUgbG9jYWwgb3AgdG8gcm9wIHRvIGF2b2lkCi0JY29uZnVzaW9uIHdpdGggbWFjcm8gb3AuCi0KLQkqIGdhc3AuYyAoc3RyaXBfY29tbWVudHMpOiBDb21tZW50IG91dDsgaXQncyBub3QgdXNlZC4KLQkoZG9fZW5kKTogQWRkIHBhcmFtZXRlci4gIEluIE1SSSBtb2RlLCBwcmludCBpdCBvdXQuCi0JKGRvX2lycCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN1Yl9hY3R1YWwpOiBDaGFuZ2UgcGFyYW1ldGVyIG0gdG8gZm9ybWFsX2hhc2gsIGNoYW5naW5nIHR5cGUKLQlmcm9tIG1hY3JvX2VudHJ5aCAqIHRvIGhhc2hfdGFibGUgKi4KLQkobWFjcm9fZXhwYW5kX2JvZHkpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JbWFjcm9fZXhwYW5kLgotCShtYWNyb19leHBhbmQpOiBDYWxsIG1hY3JvX2V4cGFuZF9ib2R5LgotCShLXyopOiBGdWxseSBwYXJlbnRoZXNpemUuCi0JKEtfSVJQLCBLX0lSUEMpOiBEZWZpbmUuCi0JKG1yaWtpbmZvKTogQWRkIElSUCBhbmQgSVJQQy4KLQkocHJvY2Vzc19wc2V1ZG9fb3ApOiBJbiBNUkkgbW9kZSwgcHJpbnQgb3V0IEVORCBwc2V1ZG8tb3AuICBQYXNzCi0JbGluZSB0byBkb19lbmQuICBIYW5kbGUgS19JUlAgYW5kIEtfSVJQQy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoc19vcHQpOiBSZXNldCAqaW5wdXRfbGluZV9wb2ludGVyIGV2ZW4gaWYgd2UKLQlkb24ndCBkbyBhbnl0aGluZyB3aXRoIHRoZSBvcHRpb24uCi0KLVN1biBBdWcgMTMgMTc6MDM6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmcmFncy5jIChmcmFnX2FsaWduKTogSGFuZGxlIGFic29sdXRlX3NlY3Rpb24uCi0JKiB3cml0ZS5jIChyZWNvcmRfYWxpZ25tZW50KTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogU2tpcCBpbnNucyB3aXRoIGFuIGluYXBwcm9wcmlhdGUKLQlJU0EgbGV2ZWwuCi0KLVN1biBBdWcgMTMgMDA6MzU6MDIgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBlbnRyaWVzIGZvcgotCSJiZWdpbl9icnRhYiIgYW5kICJlbmRfYnJ0YWIiIHBzZXVkby1vcHMuCi0JKHBhX2JydGFiKTogTmV3IGZ1bmN0aW9uLgotCSh0Y19nZW5fcmVsb2MsIFNPTSB2ZXJzaW9uKTogSGFuZGxlIFJfQkVHSU5fQlJUQUIgYW5kIFJfRU5EX0JSVEFCLgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSByZWxvY2F0aW9ucyBmb3IgQlJUQUIgZml4dXBzCi0Jd2hlbiBPQkpfU09NIGlzIGRlZmluZWQuCi0KLUZyaSBBdWcgMTEgMjA6MzQ6MDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVEVfT0JKUyk6IEFkZCBlbXB0eSBkZWZpbml0aW9uLgotCi1GcmkgQXVnIDExIDE5OjE2OjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzcC5jIChjaGFuZ2VfYmFzZSk6IERvbid0IHRyZWF0ICcgc3BlY2lhbGx5IGluIE1SSSBtb2RlLgotCShwcm9jZXNzX2ZpbGUpOiBEb24ndCB3YXJuIGFib3V0IG1pc3NpbmcgRU5EIGluIE1SSSBtb2RlLgotCShkb19pZik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdldF9tcmlfc3RyaW5nLCBkb19pZmMpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoYnVmZmVyX2FuZF9uZXN0KTogVHJlYXQgTVJJIG1vZGUgbGlrZSBhbHRlcm5hdGUgc3ludGF4IG1vZGUuCi0JKGRvX2FlbmRyKTogQ2hhbmdlIGVycm9yIG1lc3NhZ2UgaW4gTVJJIG1vZGUuCi0JKGRvX2FyZXBlYXQpOiBVc2UgUkVQVC9FTkRSIGluIE1SSSBtb2RlLgotCShkb19mb3JtYWxzKTogSW4gTVJJIG1vZGUsIGFkZCBzcGVjaWFsIE5BUkcgZm9ybWFsLgotCShtYWNyb19leHBhbmQpOiBWYXJpb3VzIGNoYW5nZXMgZm9yIE1SSSBtb2RlOiBwZXJtaXQgYSBxdWFsaWZpZXIKLQlvbiB0aGUgbWFjcm8gbmFtZTsgc2V0IHNwZWNpYWwgTkFSRyBmb3JtYWw7IHBlcm1pdCB1bm5hbWVkCi0JcG9zaXRpb25hbCBhcmd1bWVudHM7IHVzZSAmJiB0byBjb25jYXRlbmF0ZSBuYW1lZCBwYXJhbWV0ZXJzOwotCXBlcm1pdCBcZCB0byBzcGVjaWZ5IGFuIHVubmFtZWQgcGFyYW1ldGVyOyBwZXJtaXQgbmFtZWQgcGFyYW1ldGVycwotCXRvIG5vdCBzdGFydCB3aXRoIFw7IHVzZSA9PSB0byBzZWUgaWYgYSBwYXJhbWV0ZXIgZXhpc3RzLgotCShnZXRzdHJpbmcpOiBJbiBNUkkgbW9kZSwgYWxsb3cgPD4gdG8gcXVvdGUgYSBzdHJpbmcuCi0JKEtfSUZFUSwgS19JRk5FLCBLX0lGTFQsIEtfSUZMRSwgS19JRkdFLCBLX0lGR1QpOiBEZWZpbmUuCi0JKEtfSUZDLCBLX0lGTkMpOiBEZWZpbmUuCi0JKHN0cnVjdCBrZXl3b3JkKTogTmFtZSBzdHJ1Y3R1cmUgdXNlZCBpbiBraW5mbyBhcnJheS4KLQkobXJpa2luZm8pOiBOZXcgc3RhdGljIGFycmF5LgotCShwcm9jZXNzX3BzZXVkb19vcCk6IERvbid0IHJlcXVpcmUgbGVhZGluZyAnLicgaW4gTVJJIG1vZGUuCi0JSGFuZGxlIG5ldyBNUkkgcHNldWRvLW9wIGRlZmluaXRpb25zLgotCShhZGRfa2V5d29yZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YgcHJvY2Vzc19pbml0LgotCShwcm9jZXNzX2luaXQpOiBVc2UgYWRkX2tleXdvcmQuICBJbiBNUkkgbW9kZSwgYWRkIG1yaWtpbmZvIHRhYmxlLgotCShsb25nX29wdGlvbnMpOiBBZGQgIm1yaSIuCi0JKHNob3dfdXNhZ2UpOiBNZW50aW9uIC1NLy0tbXJpLgotCShtYWluKTogQ2FsbCBwcm9jZXNzX2luaXQgYWZ0ZXIgcHJvY2Vzc2luZyBhcmd1bWVudHMuICBIYW5kbGUgLU0uCi0JKiBkb2MvZ2FzcC50ZXhpOiBEb2N1bWVudCAtTS8tLW1yaS4KLQotCSogZ2FzcC5jOiBJbmNsdWRlIGFuc2lkZWNsLmguICBNYWtlIGFsbCBsb2NhbCBmdW5jdGlvbnMgc3RhdGljLgotICAgICAgICBBZGQgcHJvdG90eXBlcyBmb3IgYWxsIHN0YXRpYyBmdW5jdGlvbnMuCi0JKG1yaSk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHNiX2FkZF9jaGFyKTogQ2hhbmdlIHBhcmFtZXRlciBjIGZyb20gY2hhciB0byBpbnQuCi0JKHNiX2FkZF9zdHJpbmcpOiBNYWtlIHBhcmFtZXRlciBzIGludG8gYSBjb25zdCBwb2ludGVyLgotCShzYl9hZGRfYnVmZmVyKTogTGlrZXdpc2UuCi0JKGNoZWNrY29uc3QpOiBDaGFuZ2UgcGFyYW1ldGVyIG9wIGZyb20gY2hhciB0byBpbnQuCi0JKGV4cF9nZXRfYWJzKTogTWFrZSBwYXJhbWV0ZXIgZW1zZyBpbnRvIGEgY29uc3QgcG9pbnRlci4KLQkoZG9fcmVzKTogQ2hhbmdlIHBhcmFtZXRlciB0eXBlIGZyb20gY2hhciB0byBpbnQuCi0JKGJ1ZmZlcl9hbmRfbmVzdCk6IE1ha2UgcGFyYW1ldGVycyBmcm9tIGFuZCB0byBpbnRvIGNvbnN0Ci0JcG9pbnRlcnMuCi0JKGRvX3NkYXRhKTogQ2hhbmdlIHBhcmFtZXRlciB0eXBlIGZyb20gY2hhciB0byBpbnQuCi0JKG5ld19maWxlKTogTWFrZSBwYXJhbWV0ZXIgbmFtZSBpbnRvIGEgY29uc3QgcG9pbnRlci4KLQkoZG9fZGVmaW5lKTogTWFrZSBwYXJhbWV0ZXIgc3RyaW5nIGludG8gYSBjb25zdCBwb2ludGVyLgotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAobWRfbnVtYmVyX3RvX2NoYXJzKTogRG9uJ3QgZG8gaXQgaGVyZSwgY2FsbAotCW51bWJlcl90b19jaGFyc19iaWdlbmRpYW4uCi0JKiBjb25maWcvdGMtaDgzMDAuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0KLUZyaSBBdWcgMTEgMTM6MjM6NTYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBBZGQgbmV3IGZpZWxkIGZ4X25vX292ZXJmbG93LgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogSWYgZnhfbm9fb3ZlcmZsb3cgaXMgbm9uLXplcm8sIGRvbid0Ci0JY29tcGxhaW4gaWYgdGhlIGFkZGVuZCBpcyB0b28gbGFyZ2UuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXNzZW1ibGUpOiBTZXQgZnhfbm9fb3ZlcmZsb3cgaWYgdGhlIGhhbGYKLQl3b3JkIHJlbG9jYXRpb25zIEJGRF9SRUxPQ197TE8xNixISTE2LEhJMTZfU30uCi0KLVRodSBBdWcgMTAgMjA6NTY6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19tcmlfc2VjdCkgW0JGRF9BU1NFTUJMRVJdOiBGaXggdHlwb3MgaW4gY2hvb3NpbmcgYW5kCi0Jc2V0dGluZyBzZWN0aW9uIGZsYWdzLgotCi1UaHUgQXVnIDEwIDAwOjM4OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IEFkZCBkb2N1bWVudGF0aW9uIGZvciBNUkkgY29tcGF0aWJpbGl0eSBtb2RlLgotCSogZG9jL2FzLjE6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogV2hlbiByZWNvZ25pemluZyAnIycsIHVzZSBpc2J5dGUgYW5kCi0JaXdvcmQgcmF0aGVyIHRoYW4gZXhwcjggYW5kIGV4cHIxNi4gIFdoZW4gcmVjb2duaXppbmcgJ00nLCB1c2UKLQlpc3NieXRlIHJhdGhlciB0aGFuIGV4cHI4LiAgV2hlbiByZWNvZ25pemluZyAnUScgYW5kICd0JywganVzdAotCWNoZWNrIGZvciBPX2NvbnN0YW50IHJhdGhlciB0aGFuIHVzaW5nIGV4cHI4LgotCSogY29uZmlnL202OGstcGFyc2UuaCAoZXhwcjgsIGV4cHIxNik6IERvbid0IGRlZmluZS4KLQkqIE1ha2VmaWxlLmluIChtNjhrLXBhcnNlLm8pOiBEZXBlbmQgdXBvbiBtNjhrLXBhcnNlLmgsIG5vdAotCW02OGstcGFyc2UueS4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIHNwYywgdHRsLCB4Y29tLCB4cmVmLgotCShzX21yaV9zZWN0KTogTmV3IGZ1bmN0aW9uLgotCSogcmVhZC5oIChzX21yaV9zZWN0KTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKSAoYm90aCB2ZXJzaW9ucyk6IEluIE1SSQotCW1vZGUsIGNhbGwgc19tcmlfc2VjdC4KLQkob2JqX3BzZXVkb190YWJsZSk6IEFkZCBzZWN0LnMgYW5kIHNlY3Rpb24ucy4gIE1vdmUgc2VjdCBvdXRzaWRlCi0Jb2YgaWZuZGVmIEJGRF9BU1NFTUJMRVIuCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfcHNldWRvX3RhYmxlKTogQWRkIHNlY3Rpb24ucywgc2VjdCwKLQlzZWN0LnMuCi0JKG9ial9lbGZfc2VjdGlvbik6IEluIE1SSSBtb2RlLCBjYWxsIHNfbXJpX3NlY3QuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgcmVzdG9yZSwgc2F2ZS4KLQkoc3RydWN0IHNhdmVfb3B0cyk6IERlZmluZS4KLQkoc2F2ZV9zdGFjayk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNfc2F2ZSwgc19yZXN0b3JlKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0KLQkqIHJlYWQuYyAoc19zZXQpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHB0ci4KLQkoaGV4X2Zsb2F0KTogQ2hlY2sgdGFyZ2V0X2JpZ19lbmRpYW4uCi0JKGVxdWFscyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgcC4KLQotCSogY29uZmlnL3RjLWEyOWsuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaDg1MDAuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaHBwYS5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pODYwLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbTg4ay5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy10YWhvZS5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1zaC5jIChsaXR0bGUpOiBTZXQgdGFyZ2V0X2JpZ19lbmRpYW4uCi0JKG1kX2JlZ2luKTogTGlrZXdpc2UuCi0JKG1kX3BhcnNlX29wdGlvbik6IExpa2V3aXNlLgotCShidWlsZF9yZWxheCk6IENoZWNrIHRhcmdldF9iaWdfZW5kaWFuIHJhdGhlciB0aGFuIHNobC4KLQkoYnVpbGRfTXl0ZXMsIG1kX2F0b2YpOiBMaWtld2lzZS4KLQkobWRfY29udmVydF9mcmFnLCBtZF9hcHBseV9maXgpOiBMaWtld2lzZS4KLQkobWRfbnVtYmVyX3RvX2NoYXJzKTogTGlrZXdpc2UuCi0JCi1XZWQgQXVnICA5IDEwOjUxOjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19hYnNwY2FkZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG02OGtfcXVpY2spOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtNjhrX3JlbDMyKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkIG9wdCBhbmQgcmVnLgotCShtNjhrX2lwKTogUGVybWl0IGFic29sdXRlIHN5bWJvbHMgaW4gJ2wnLydMJyByZWNvZ25pdGlvbi4gIENoZWNrCi0JbTY4a19xdWljayBpbiAnTScgYW5kICdRJyByZWNvZ25pdGlvbi4gIENoZWNrIG02OGtfYWJzcGNhZGQgaW4KLQlESVNQIGhhbmRsaW5nLiAgQ2hlY2sgbTY4a19yZWwzMiBpbiBCQVNFL1BPU1QvUFJFIGhhbmRsaW5nLgotCShtZF9iZWdpbik6IEluIE1SSSBtb2RlLCBpbml0aWFsaXplIG02OGtfYWJzcGNhZGQgYW5kIG02OGtfcmVsMzIuCi0JSW4gTVJJIG1vZGUsIGNoYW5nZSB1bnNpemVkIGJyYW5jaCBhbGlhc2VzIHRvIGJlIHZhcmlhYmxlIHNpemVkLgotCShzdHJ1Y3Qgb3B0X2FjdGlvbik6IERlZmluZS4KLQkob3B0X3RhYmxlKTogRGVmaW5lLgotCShzX29wdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNraXBfdG9fY29tbWEpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShvcHRfY2hpcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG9wdF9saXN0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob3B0X2xpc3Rfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNfcmVnKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGFzLmggKGZsYWdfa2VlcF9sb2NhbHMpOiBDaGFuZ2UgZnJvbSB1bnNpZ25lZCBjaGFyIHRvIGludC4KLQkoZmxhZ19ub193YXJuaW5ncyk6IExpa2V3aXNlLgotCi0JKiByZWFkLmMgKG1yaV9saW5lX2xhYmVsKTogTWFrZSBub24tc3RhdGljLgotCShwb3RhYmxlKTogQWRkIG5vcGFnZSwgcGFnZSwgcGxlbi4KLQkoc19vcmcpOiBFcnJvciBpZiBpbiBNUkkgbW9kZS4KLQkqIHJlYWQuaCAobXJpX2xpbmVfbGFiZWwpOiBEZWNsYXJlLgotCSogbGlzdGluZy5jIChsaXN0aW5nX25vcGFnZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpc3RpbmcuaCAobGlzdGluZ19ub3BhZ2UpOiBEZWNsYXJlLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9iZWdpbik6IFNldCBzeV9mcmFnIG9mIGFic19zeW1ib2wgdG8KLQkmemVyb19hZGRyZXNzX2ZyYWcuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogQ2hlY2sgdGhhdCBzeW1ib2wgaXMgbm90IE5VTEwKLQliZWZvcmUgY2hlY2tpbmcgc3lfbXJpX2NvbW1vbi4KLQkoZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4KLQotCSogcmVhZC5jIChhYnNfc2VjdGlvbl9vZmZzZXQpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShwb3RhYmxlKTogQWRkIG9mZnNldCwgc3RydWN0LgotCShkb19vcmcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uOyBoYW5kbGUgY2hhbmdpbmcgdGhlIG9yaWdpbiBpbiB0aGUKLQlhYnNvbHV0ZSBzZWN0aW9uLgotCShzX29yZyk6IFVzZSBkb19vcmcuCi0JKHNfc2V0KTogTGlrZXdpc2UuCi0JKGVxdWFscyk6IExpa2V3aXNlLgotCShzX3NwYWNlKTogSW4gYWJzb2x1dGVfc2VjdGlvbiwganVzdCBpbmNyZWFzZSBhYnNfc2VjdGlvbl9vZmZzZXQuCi0JKHNfc3RydWN0KTogTmV3IGZ1bmN0aW9uLgotCShlbWl0X2V4cHIpOiBIYW5kbGUgYWJzb2x1dGVfc2VjdGlvbiBzcGVjaWFsbHkuCi0JKiByZWFkLmggKGFic19zZWN0aW9uX29mZnNldCk6IERlY2xhcmUuCi0JKHNfc3RydWN0KTogRGVjbGFyZS4KLQkqIGZyYWdzLmMgKGZyYWdfbW9yZSk6IFdhcm4gaWYgaW4gYWJzb2x1dGVfc2VjdGlvbi4KLQkoZnJhZ19ub3dfZml4KTogSW4gYWJzb2x1dGVfc2VjdGlvbiwgcmV0dXJuIGFic19zZWN0aW9uX29mZnNldC4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2NoYW5nZSk6IElmIHN3aXRjaGluZyB0byBhYnNvbHV0ZV9zZWN0aW9uLAotCWp1c3Qgc2V0IG5vd19zZWcgYW5kIG5vd19zdWJzZWcuCi0JKHN1YnNlZ19zZXRfcmVzdCk6IFNwZWNpYWwgaGFuZGxpbmcgd2hlbiBzd2l0Y2hpbmcgdG8gb3IgZnJvbQotCWFic29sdXRlX3NlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfZmxvYXRfY29wbnVtKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkIGZvcHQgYW5kIG1hc2syLgotCShtNjhrX2lwKTogVXNlIG02OGtfZmxvYXRfY29wbnVtLCBub3QgQ09QTlVNLCB3aGVuIHNldHRpbmcKLQljb3Byb2Nlc3NvciByZWdpc3RlciB0byB1c2UuICBJbiBjYXNlICdJJyB3aGVuIGNoZWNraW5nIG9wZXJhbmRzLAotCWNvcnJlY3QgY29wcm9jZXNzb3IgcmVnaXN0ZXIgbnVtYmVycy4gIEluIGNhc2UgJ0knIHdoZW4gc2V0dGluZwotCW9wZXJhbmRzLCBkb24ndCBhZGQgMS4KLQkoc19mb3B0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmggKENPUE5VTSk6IERvbid0IGRlZmluZS4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIGlmZXEsIGlmZ2UsIGlmZ3QsIGlmbGUsIGlmbHQsIGlmbmUuCi0JQ2hhbmdlIGlmIHRvIHBhc3MgT19uZSB0byBzX2lmLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBEb24ndCBkZWZpbmUgYW4gbGFiZWwgd2l0aG91dCBhIGNvbG9uIGlmCi0JaWdub3JlX2lucHV0IHJldHVybnMgdHJ1ZS4KLQkqIGNvbmQuYyAoc19pZik6IFRyZWF0IGFyZ3VtZW50IGFzIGFuIG9wZXJhdG9yVCBkZXNjcmliaW5nIGhvdyB0bwotCWNvbXBhcmUgdGhlIGFyZ3VtZW50IGFnYWluc3QgemVyby4KLQkoaWdub3JlX2lucHV0KTogRG9uJ3QgcmVxdWlyZSBhbiBpbml0aWFsIGRvdCBpbiBNUkkgbW9kZSwgb3IgaWYKLQlOT19QU0VVRE9fRE9UIGlzIGRlZmluZWQuCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBkY2IsIGRjYi5iLCBkY2IuZCwgZGNiLmwsIGRjYi5zLCBkY2IudywKLQlkY2IueCwgZHMuZCwgZHMucCwgZHMucywgZHMueCwgZWxzZWMsIGVuZGMsIGZhaWwsIGZvcm1hdCwgbGxlbiwKLQlub2Zvcm1hdC4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogSWYgcHNldWRvLW9wIGhhbmRsZXIgaXMgc19lbmQsIHF1aXQKLQlpbW1lZGlhdGVseS4KLQkoc19lbmQpOiBOZXcgZnVuY3Rpb24uCi0JKHNfZmFpbCk6IE5ldyBmdW5jdGlvbi4KLQkoc19mbG9hdF9zcGFjZSk6IE5ldyBmdW5jdGlvbi4KLQkoaGV4X2Zsb2F0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZmxvYXRfY29ucyk6IFVzZSBoZXhfZmxvYXQuCi0JKiByZWFkLmggKHNfZmFpbCk6IERlY2xhcmUuCi0JKHNfZmxvYXRfc3BhY2UpOiBEZWNsYXJlLgotCSogY29uZC5jIChzX2VuZCk6IFJlbW92ZS4KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19wc2l6ZSk6IFRyZWF0IGFyZ3VtZW50IGFzIGluZGljYXRpbmcgd2hldGhlcgotCWEgaGVpZ2h0IGlzIGV4cGVjdGVkLgotCi0JKiByZWFkLmMgKG1yaV9wZW5kaW5nX2FsaWduKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogSGFuZGxlIG1yaV9wZW5kaW5nX2FsaWduLgotCShjb25zKTogU2V0IG1yaV9wZW5kaW5nX2FsaWduIGlmIGFwcHJvcHJpYXRlLgotCi0JKiBjb25maWd1cmUuaW46IE1vdmUgcmFuZG9tIHNwZWNpYWwgdGFyZ2V0IGhhbmRsaW5nIGJlZm9yZQotCXBvc3NpYmxlIGJyZWFrLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgQXVnICA4IDIzOjQxOjI1IDE5OTUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlndXJlLmluOiBDb25zaXN0ZW50bHkgdXNlICR7dGFyZ2V0X2NwdV90eXBlfSByYXRoZXIgdGhhbgotCSR7Y3B1X3R5cGV9IGFmdGVyIHRoZSBsb29wLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKHRhcmctY3B1Lm8pOiBVc2UgQHRhcmdldF9jcHVfdHlwZUAgcmF0aGVyIHRoYW4KLQlAY3B1X3R5cGVALgotCi1UdWUgQXVnICA4IDE3OjI3OjE3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBleHByLmggKG9wZXJhdG9yVCk6IFJlbW92ZSBjb21tYSBhZnRlciBsYXN0IGVudW1lcmF0b3IgdmFsdWUuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmM6IFNvbWUgd2hpdGVzcGFjZSBjbGVhbnVwIGZyb20gUGF0IFJhbmtpbi4KLQotCSogYXMuaCAoYWxsb2NhKTogSWYgX19TVERDX18sIGRlY2xhcmUgdm9pZCogaW5zdGVhZCBvZiBjaGFyKi4KLQotCVdlZCBBdWcgIDIgMTg6NTQ6MzcgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciwKLQlDbG9zZV9WTVNfT2JqZWN0X0ZpbGUpOiBSZW9yZ2FuaXplIHRoZSBgI2lmICFWTVMnIGNyb3NzLWFzc21lYmxlcgotCXN1cHBvcnQgY29kZS4KLQkoQ2xvc2VfVk1TX09iamVjdF9GaWxlKTogQ2FsbCBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCB0byBmbHVzaAotCW91dHB1dCBidWZmZXItLWp1c3QgaW4gY2FzZS0tYmVmb3JlIGNsb3NpbmcgdGhlIGZpbGUuCi0KLVR1ZSBBdWcgIDggMTM6MDc6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChhcmNocyk6IEFkZCA2OGVjMDAwLCA2OGhjMDAwLCA2OGhjMDAxLAotCTY4ZWMwMjAsIDY4ZWMwMzAsIDY4ZWMwNDAsIGFuZCA2ODMzMC4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkIGNoaXAgYW5kIGNvbWxpbmUuCi0JKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogVXNlIHN0cmNhc2VjbXAgd2hlbiBjb21wYXJpbmcgZGVmYXVsdF9jcHUKLQlhZ2FpbnN0IGFyY2hpdGVjdHVyZXMuCi0JKG1yaV9jaGlwLCBzX2NoaXApOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQotCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBzeW1ib2wpOiBBZGQgc3lfbXJpX2NvbW1vbiBiaXQuCi0JKiByZWFkLmggKG1yaV9jb21vbl9zeW1ib2wpOiBEZWNsYXJlLgotCShzX21yaV9jb21tb24pOiBEZWNsYXJlLgotCSogcmVhZC5jIChtcmlfbGluZV9sYWJlbCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1yaV9jb21tb25fc3ltYm9sKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkocG90YWJsZSk6IEFkZCAiY29tbW9uIiBhbmQgImNvbW1vbi5zIi4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogSW4gTVJJIG1vZGUsIHNldCBtcmlfbGluZV9sYWJlbCBmb3IgYSBsYWJlbAotCWF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCi0JKHNfbXJpX2NvbW1vbik6IE5ldyBmdW5jdGlvbi4KLQkoc19zcGFjZSk6IEhhbmRsZSBtcmlfY29tbW9uX3N5bWJvbC4KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBDaGFuZ2UgcmV0dXJuIHZhbHVlIGZyb20gdm9pZCB0byBzeW1ib2xTICosCi0JYW5kIHJldHVybiBuZXcgc3ltYm9sLiAgSWYgbXJpX2NvbW1vbl9zeW1ib2wgaXMgc2V0LCBhdHRhY2ggdGhlCi0JbmV3IHN5bWJvbCB0byBpdC4KLQkocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgYW4gc3lfbXJpX2NvbW1vbiBzeW1ib2wuCi0JKiBzeW1ib2xzLmggKGNvbG9uKTogQ2hhbmdlIHJldHVybiB2YWx1ZSBpbiBkZWNsYXJhdGlvbi4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogQ2xlYXIgbXJpX2NvbW1vbl9zeW1ib2wuCi0JKHN1YnNlZ19zZXQgKGJvdGggdmVyc2lvbnMpKTogTGlrZXdpc2UuCi0JKiBmcmFncy5jIChmcmFnX21vcmUpOiBXYXJuIGlmIG1yaV9jb21tb25fc3ltYm9sIGlzIG5vdCBOVUxMLgotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBTa2lwIHN5X21yaV9jb21tb24gc3ltYm9scy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBEaXNjYXJkIHN5X21yaV9jb21tb24gc3ltYm9scy4KLQkoZml4dXBfc2VnbWVudCk6IENoYW5nZSByZWxvY2F0aW9ucyBhZ2FpbnN0IHN5X21yaV9jb21tb24gc3ltYm9scwotCXRvIGJlIGFnYWluc3QgdGhlIGNvbW1vbiBzeW1ib2wgaXRzZWxmLgotCSogY29uZmlnL29iai1jb2ZmLmMgKHlhbmtfc3ltYm9scyk6IERpc2NhcmQgc3lfbXJpX2NvbW1vbiBzeW1ib2xzLgotCShmaXh1cF9zZWdtZW50KTogQ2hhbmdlIHJlbG9jYXRpb25zIGFnYWluc3Qgc3lfbXJpX2NvbW1vbiBzeW1ib2xzCi0JdG8gYmUgYWdhaW5zdCB0aGUgY29tbW9uIHN5bWJvbCBpdHNlbGYuCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IERpc2NhcmQKLQlzeV9tcmlfY29tbW9uIHN5bWJvbHMuCi0KLQkqIGRvYy9jLW02OGsudGV4aTogQWRkIGRvY3VtZW50YXRpb24gZm9yIENQVSBzcGVjaWZpYyBvcHRpb25zLCBhbmQKLQlmb3IgTW90b3JvbGEgc3ludGF4LgotCi0JKiBjb25maWcvbTY4ay1wYXJzZS55IChtb3Rvcm9sYV9vcGVyYW5kKTogRm9yICglcGMpLCBzZXQgbW9kZSB0bwotCURJU1AsIG5vdCBCQVNFLgotCi1UdWUgQXVnICA4IDAyOjMxOjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChyZWxheF9hbGlnbik6IEFkZCBleHRyYSBwYWRkaW5nIGZvciBsaW5rcmVsYXggb25seSBpZgotCUxJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkgaXMgZGVmaW5lZC4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkpOiBEZWZpbmUgaXQuCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKFJlbGF4YXRpb24pOiBXcml0ZSB1cCBzb21lIHN0dWZmIG9uIGxpbmtlcgotCXJlbGF4aW5nIGFuZCBMSU5LRVJfUkVMQVhJTkdfU0hSSU5LU19PTkxZLgotCi1Nb24gQXVnICA3IDE3OjE4OjEwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL202OGstcGFyc2UueTogTmV3IGZpbGU6IGJpc29uIGdyYW1tYXIgZm9yIG02OGsgb3BlcmFuZHMsCi0JaW5jbHVkaW5nIHN1cHBvcnQgZm9yIE1vdG9yb2xhIHN5bnRheC4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmg6IE5ldyBmaWxlOyBkZWZpbml0aW9ucyBzaGFyZWQgYmV0d2VlbgotCW02OGstcGFyc2UueSBhbmQgdGMtbTY4ay5jLgotCSogY29uZmlnL3RjLW02OGsuYzogSW5jbHVkZSBtNjhrLXBhcnNlLmguCi0JKGVudW0gb3BlcmFuZF90eXBlKTogTW92ZSB0byBtNjhrLXBhcnNlLmgsIHdoZXJlIGl0IGlzIG5hbWVkCi0JbTY4a19vcGVyYW5kX3R5cGUuICBSZW5hbWUgYWxsIHVzZXMuICBSZWFycmFuZ2Ugc29tZXdoYXQuICBBZGQKLQlGUFJFRy4gIFJlbmFtZSBBT0ZGIHRvIERJU1AuICBSZW5hbWUgQUlORFggdG8gQkFTRS4gIFJlbmFtZSBBUE9EWAotCXRvIFBPU1QuICBSZW5hbWUgQVBSRFggdG8gUFJFLiAgUmVtb3ZlIEFNSU5ELiAgUmVuYW1lIE1TQ1IgdG8KLQlDT05UUk9MLiAgUmVtb3ZlIERJTkRSLgotCShzdHJ1Y3QgbTY4a19leHApOiBNb3ZlIHRvIG02OGstcGFyc2UuaC4gIFJlbW92ZSBlX2JlZywgZV9lbmQgYW5kCi0JZV9zZWcgZmllbGRzLiAgUmVuYW1lIGVfZXhwIHRvIGV4cC4gIFJlbmFtZSBlX3NpeiB0byBzaXplLCBhbmQKLQljaGFuZ2UgdHlwZSB0byBlbnVtIG02OGtfc2l6ZS4gIENoYW5nZSBhbGwgdXNlcy4KLQkoZW51bSBfcmVnaXN0ZXIpOiBNb3ZlIHRvIG02OGstcGFyc2UuaCwgd2hlcmUgaXQgaXMgbmFtZWQKLQltNjhrX3JlZ2lzdGVyLiAgUmVuYW1lIGFsbCB1c2VzLiAgQWRkIFpEQVRBMC03IGFuZCBaQUREUjAtNy4KLQkoc3RydWN0IG02OGtfb3ApOiBNb3ZlIHRvIG02OGstcGFyc2UuaC4gIENoYW5nZSBhbGwgZmllbGRzLgotCShzZWcpOiBEb24ndCBkZWZpbmUuCi0JKGFkZF9leHApOiBSZW1vdmUuCi0JKEZBSUwsIE9LKTogUmVtb3ZlLgotCShtNjhrX3JlZ19wYXJzZSk6IE1vdmUgdG8gbTY4ay1wYXJzZS55LCBhbmQgcmV3cml0ZS4KLQkoU0tJUF9XSElURSwgU0tJUF9XKTogUmVtb3ZlLgotCSh0cnlfbW90b19pbmRleCwgdHJ5X2luZGV4KTogUmVtb3ZlLgotCShtNjhrX2lwX29wKTogTW92ZSB0byBtNjhrLXBhcnNlLnksIGFuZCByZXdyaXRlIHRvIHVzZSBncmFtbWFyLgotCShtYWluKTogUmVtb3ZlIG9ic29sZXRlIHRlc3QgZnVuY3Rpb24uCi0JKG02OGtfaXApOiBFeHRlbnNpdmUgY2hhbmdlcyB0byB1c2UgbmV3IGdyYW1tYXIuCi0JKGdldF9yZWdzKTogUmVtb3ZlLgotCShjcmFja19vcGVyYW5kKTogbTY4a19pcF9vcCBub3cgcmV0dXJucyAwIG9uIHN1Y2Nlc3MuCi0JKGluaXRfdGFibGUpOiBBZGQgc3NwLCB6ZDAtNyBhbmQgemEwLTcuCi0JKG1kX2Fzc2VtYmxlKTogTWFrZSBlciBjb25zdC4gIENvcnJlY3QgbG9vcCBvdmVyIG9wZXJhbmRzIHdoZW4KLQlsb29raW5nIGZvciBlcnJvciBtZXNzYWdlLgotCShtZF9iZWdpbik6IFNldCBhbHRfbm90ZW5kX3RhYmxlIGZvciAnKCcgYW5kICdAJy4KLQkoZ2V0X251bSk6IEV4cHJlc3Npb24gaXMgYWxyZWFkeSBwYXJzZWQuICBEb24ndCBzZXQgc2VnLgotCSogY29uZmlndXJlLmluOiBJZiBjcHVfdHlwZSBpcyBtNjhrLCBwdXQgbTY4ay1wYXJzZS5vIGluCi0JZXh0cmEtb2JqZWN0cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBBZGQgbTY4ay1wYXJzZS5jLgotCShCSVNPTik6IFVzZSAuLi9iaXNvbi9iaXNvbiBpZiBpdCBleGlzdHMuCi0JKEJJU09ORkxBR1MpOiBEZWZpbmUgYXMgZW1wdHkuCi0JKFRBUkdfQ1BVX0RFUF9tNjhrKTogRGVwZW5kIHVwb24gJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmguCi0JKG02OGstcGFyc2UuYywgbTY4ay1wYXJzZS5vKTogTmV3IHRhcmdldHMuCi0KLU1vbiBBdWcgIDcgMDI6NTQ6MjAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChwYXJzZV9yZWcpOiBIYW5kbGUgbmV3IEZQIHJlZ2lzdGVycy4KLQkoZ2V0X3NwZWNpZmljKTogSGFuZGxlIG5ldyBvcGVyYW5kIHR5cGVzLgotCi1GcmkgQXVnICA0IDEyOjI5OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChvcF9lbmNvZGluZyk6IE1ha2Ugbm9uLWNvbnN0LiAgRG9uJ3Qgc2V0ICciJyB0bwotICAgICAgICBPX2JpdF9ub3QuCi0JKGV4cHJfYmVnaW4pOiBTZXQgb3BfZW5jb2RpbmdbJyInXSBpbiBNUkkgbW9kZS4KLQotV2VkIEF1ZyAgMiAxODozOTo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IFJlbW92ZSBCUkVBS19VUF9CSUdfREVDTCBzdHVmZi4KLQkoc3RydWN0IG02OGtfaW5jYW50KTogQ2hhbmdlIG1fb3BlcmFuZHMgZmllbGQgdG8gYmUgY29uc3QuCi0JKHN0cnVjdCBtNjhrX2l0KTogQ2hhbmdlIGFyZ3MgZmllbGQgdG8gYmUgY29uc3QuCi0JKG02OGtfaXApOiBDaGFuZ2UgbG9jYWwgdmFyaWFibGUgcyB0byBiZSBjb25zdC4KLQkob3Bjb2RlX3B0cik6IFJlbW92ZS4KLQkobWRfYmVnaW4pOiBVc2UgbTY4a19udW1vcGNvZGVzLCBub3QgbnVtb3Bjb2Rlcy4gIFVzZQotCW02OGtfb3Bjb2Rlcywgbm90IHJlbW92ZWQgb3Bjb2RlX3B0ci4gIFVzZSBtNjhrX251bWFsaWFzZXMsIG5vdAotCW51bWFsaWFzZXMuCi0KLVR1ZSBBdWcgIDEgMTc6MzU6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpbml0X3RhYmxlKTogQWRkICJjb250cm9sIiwgInN0YXR1cyIsICJpYWRkciIsCi0JInNmY3IiLCBhbmQgImRmY3IiIGFzIHN5bm9ueW1zIGZvciBleGlzdGluZyBlbnRyaWVzLgotCShtZF9iZWdpbik6IEluIE1SSSBtb2RlLCBmb3JjZSBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgdG8gMS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogUmVtb3ZlZCB1bnVzZWQgbG9jYWxzIGkgYW5kIGFyY2guICBDaGFuZ2UgdHlwZQotCW9mIGFyY2ggKGFub3RoZXIgb25lKSB0byB1bnNpZ25lZCBsb25nLgotCSh0Y19jb2ZmX3NpemVtYWNoZGVwKTogQWRkIHJldHVybiBhZnRlciBhYm9ydCB0byBhdm9pZCB3YXJuaW5nLgotCi0JSW5pdGlhbCBzdXBwb3J0IGZvciBNUkkgc3R5bGUgbGFiZWxzIGFuZCBleHByZXNzaW9ucy4KLQkqIGFzLmggKGZsYWdfbXJpKTogRGVjbGFyZS9kZWZpbmUuCi0JKiBhcy5jIChzaG93X3VzYWdlKTogTWVudGlvbiAtTSBhbmQgaXRzIHN5bm9ueW0gLS1tcmkuCi0JKHBhcnNlX2FyZ3MpOiBBZGQgJ00nIHRvIHN0ZF9zaG9ydG9wdHMuICBBZGQgIm1yaSIgdG8KLQlzdGRfbG9uZ29wdHMuICBTZXQgZmxhZ19tcmkgaWYgLU0gaXMgc2Vlbi4KLQkobWFpbik6IENhbGwgcGFyc2VfYXJncyBiZWZvcmUgaW5wdXRfc2NydWJfYmVnaW4uICBDYWxsCi0JZXhwcl9iZWdpbi4KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IERvbid0IHNldCBsZXggZm9yICciJyBvciAnXCcnIGluIE1SSQotCW1vZGUuICBEbyBzZXQgbGV4IGZvciAnOycsICcqJywgYW5kICchJyBpbiBNUkkgbW9kZS4KLQkoZG9fc2NydWJfbmV4dF9jaGFyKTogUmVtb3ZlIE1SSSBpZmRlZiBpbiBMRVhfSVNfV0hJVEVTUEFDRSBjYXNlLgotCUluIE1SSSBtb2RlLCBrZWVwIHNwYWNlcyBiZXR3ZWVuIGxhYmVscyBhbmQgY29sb25zLiAgUmVtb3ZlIE1SSQotCWlmbmRlZiBhcm91bmQgTEVYX0lTX09ORUNIQVJfUVVPVEUgY2FzZS4gIEluIE1SSSBtb2RlLCBkb24ndCB1c2UKLQknIScgb3IgJyonIGFzIGNvbW1lbnQgY2hhcmFjdGVycyBldmVuIGlmIHRoZXkgYXJlIGluCi0JY29tbWVudF9jaGFycy4KLQkqIHJlYWQuaCAobGV4X3R5cGUpOiBObyBsb25nZXIgY29uc3QuCi0JKiByZWFkLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKGxleF90eXBlKTogTm8gbG9uZ2VyIGNvbnN0LgotCShyZWFkX2JlZ2luKTogSW4gTVJJIG1vZGUsIHNldCBsZXhfdHlwZSBvZiAnPycgdG8gMy4KLQkocG90YWJsZSk6IEFkZCBkYywgZGMuYiwgZGMuZCwgZGMubCwgZGMucywgZGMudywgZGMueCwgZHMsIGRzLmIsCi0JZHMubCwgZHMudywgYW5kIHhkZWYuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENoYW5nZSBMQUJFTFNfV0lUSE9VVF9DT0xPTiBpZmRlZiB0byBjaGVjawotCWZvciBNUkkgbW9kZSBhdCBydW50aW1lIHJhdGhlciB0aGFuIGNvbXBpbGUgdGltZS4gIEhhbmRsZSB0aGUgRVFVCi0JcHNldWRvLW9wIGluIE1SSSBtb2RlLiAgUmVtb3ZlIGJvZ3VzIE1SSSBpZmRlZiBhcm91bmQgZG9uZV9wc2V1ZG8uCi0JQ2hhbmdlIE5PX1BTRVVET19ET1QgaWZkZWYgdG8gYWxzbyB0YWtlIGVmZmVjdCBmb3IgTVJJIG1vZGUgYXQKLQlydW50aW1lLgotCShjb25zKTogSW4gTVJJIG1vZGUsIGFsd2F5cyBjYWxsIHBhcnNlX21yaV9jb25zIHJhdGhlciB0aGFuCi0JVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OLgotCShwYXJzZV9tcmlfY29ucyk6IEFsd2F5cyBjb21waWxlLCBub3QganVzdCB3aGVuIE1SSSBpcyBkZWZpbmVkLgotCUNhbGwgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OLCBub3QgZXhwcmVzc2lvbiwgd2hlbiB0aGUgaW5wdXQgaXMKLQlub3QgYSBzdHJpbmcgY29uc3RhbnQuICBIYW5kbGUgQSBhbmQgRSBtb2RpZmllcnMuCi0JKGZsb2F0X2NvbnMpOiBBY2NlcHQgOnh4eHgsIHdoZXJlIHRoZSB4J3MgYXJlIGhleCBkaWdpdHMuCi0JKiBleHByLmggKG9wZXJhdG9yVCk6IEFkZCBPX2VxLCBPX25lLCBPX2x0LCBPX2xlLCBPX2dlLCBPX2d0LgotCShleHByX2JlZ2luKTogRGVjbGFyZS4KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCk6IEluIE1SSSBtb2RlLCBpZiB0aGUgYmFzZSB3YXMgbm90Ci0Jc3BlY2lmaWVkLCBsb29rIGZvciBhIHN1ZmZpeCBvbiB0aGUgbnVtYmVyIHRvIHNldCB0aGUgYmFzZS4KLQkobXJpX2NoYXJfY29uc3RhbnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShvcGVyYW5kKTogUmVtb3ZlIE1SSSBpZmRlZi4gIEluIE1SSSBtb2RlLCBkbyB2YXJpb3VzIHRoaW5nczogUGFzcwotCTAgYXMgdGhlIGJhc2Ugd2hlbiBjYWxsaW5nIGludGVnZXJfY29uc3RhbnQgaWYgdGhlcmUgd2FzIG5vCi0JcHJlZml4LiAgQ2hlY2sgZm9yIGEgaGV4IGNvbnN0YW50IHN1ZmZpeCBpZiB3aGVuIGEgbGVhZGluZyAnMCcgaXMKLQlzZWVuLiAgRG9uJ3QgYWNjZXB0IDB4IG9yIDBiIGFzIGEgcHJlZml4LiAgQ2hlY2sgZm9yIEUnY2hhcnMnIGFuZAotCUEnY2hhcnMnLiAgSGFuZGxlIE1SSSBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgVHJlYXQgJyInIGFzIHRoZQotCXVuYXJ5IGJpdHdpc2Ugbm90IG9wZXJhdG9yLiAgVHJlYXQgJCBhcyB0aGUgcHJvZ3JhbSBjb3VudGVyLCBvciBhcwotCXRoZSBwcmVmaXggZm9yIGEgaGV4IGNvbnN0YW50LiAgVHJlYXQgJSBhcyB0aGUgcHJlZml4IGZvciBhIGJpbmFyeQotCWNvbnN0YW50IGFuZCBAIGFzIHRoZSBwcmVmaXggZm9yIGFuIG9jdGFsIGNvbnN0YW50LiAgVHJlYXQgOiBhcwotCXRoZSBwcmVmaXggZm9yIGEgaGV4IGNvbnN0YW50LgotCShvcF9lbmNvZGluZyk6IFNldCAnIicgdG8gT19iaXRfbm90LCAnPCcgdG8gT19sdCwgYW5kICc+JyB0byBPX2d0LgotCShvcF9yYW5rKTogTm8gbG9uZ2VyIGNvbnN0LiAgQ2hhbmdlIHJhbmsgdmFsdWVzLgotCShleHByX2JlZ2luKTogTmV3IGZ1bmN0aW9uLgotCShvcGVyYXRvcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGV4cHIpOiBVc2Ugb3BlcmF0b3IuICBEb24ndCBib3RoZXIgdG8gbWVudGlvbiB0aGUgb3BlcmF0b3IgaW4KLQl3YXJuaW5ncy4gIFJlbW92ZSBib2d1cyAjaWYgMCBjb2RlLiAgSGFuZGxlIG5ldyBvcGVyYXRvclQgdmFsdWVzLgotCSogYXRvZi1nZW5lcmljLmMgKGF0b2ZfZ2VuZXJpYyk6IEluIE1SSSBtb2RlLCBhY2NlcHQgdW5kZXJzY29yZXMKLQlhcm91bmQgdGhlIGV4cG9uZW50IGluIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCi0JKiBzeW1ib2xzLmggKHN5bWJvbHNfY2FzZV9zZW5zaXRpdmUpOiBEZWNsYXJlLgotCSogc3ltYm9scy5jIChzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkoc3ltYm9sX2NyZWF0ZSk6IENoZWNrIHN5bWJvbHNfY2FzZV9zZW5zaXRpdmUuCi0JKHN5bWJvbF9maW5kX2Jhc2UpOiBMaWtld2lzZS4KLQkocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgbmV3IG9wZXJhdG9yVCB2YWx1ZXMuCi0JKHByaW50X2V4cHJfMSk6IExpa2V3aXNlLgotCShTX0lTX0xPQ0FMKTogSW4gTVJJIG1vZGUsIG5hbWVzIGJlZ2lubmluZyB3aXRoIHR3byAnPycgY2hhcmFjdGVycwotCWFyZSBsb2NhbC4KLQotVHVlIEF1ZyAgMSAxMTozNToxOCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB0Yy1zaC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBNYWtlIHNvbWUgZXJyb3IgbWVzc2FnZXMgbW9yZQotCWV4cGxpY3QuCi0KLU1vbiBKdWwgMzEgMjE6NDA6NDcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlTYXQgSnVsIDI5IDE4OjU1OjIzIDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChDT1BZX1NIT1JULCBDT1BZX0xPTkcsIFBVVF9TSE9SVCwgUFVUX0xPTkcpOgotCU1ha2UgZXhwYW5zaW9uIGJlIHNhZmUgZm9yIHVzZSBpbiBleHByZXNzaW9ucy4KLQkoUFVUX0NPVU5URURfU1RSSU5HKTogQnJhY2tldCBleHBhbnNpb24gd2l0aCBgZG8gey4uLn0gd2hpbGUgKDApJwotCXJhdGhlciB0aGFuIGp1c3QgYHsuLi59Jy4KLQotTW9uIEp1bCAzMSAxODoxOToyNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBnYXNwLmMgKG1haW4pOiBQYXJzZSAtSSBvcHRpb24uCi0JKGRvX2luY2x1ZGUpOiBMb29rIHRocm91Z2ggaW5jbHVkZSBsaXN0LgotCSogZ2FzcC5jIChjaGFuZ2VfYmFzZSk6IERvbid0IG1vZGlmeSBudW1iZXJzIGluIHN0cmluZ3MuIAotCi1Nb24gSnVsIDMxIDEyOjE2OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5oIChTVUJfU0VHTUVOVF9BTElHTik6IERlZmluZS4gIEZyb20gTmljbGFzCi0JQW5kZXJzc29uIDxuaWNhbkBpZGEubGl1LnNlPi4KLQotVGh1IEp1bCAyNyAyMDo0NzoxMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBkbyBmdXJ0aGVyIHBjcmVsCi0JcHJvY2Vzc2luZyBhZnRlciBjb252ZXJ0aW5nIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaW4gdGhlCi0Jc2FtZSBzZWdtZW50LiAgRnJvbSBKaW0gV2lsc29uLgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1saW51eG9sZGxkKTogQWRkIGFzIHN5bm9ueW0gZm9yCi0JaTM4Ni0qLWxpbnV4KmFvdXQqLiAgRnJvbSBGcmVkIEZpc2guCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UaHUgSnVsIDI3IDE2OjE0OjU2IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChlbnVtIHBzX3R5cGUge3BzX1RFWFQscHNfREFUQSxwc19DT01NT04sCi0JcHNfQ09OU1R9KTogTmV3IGNvbnN0YW50cy4KLQkoVk1TX1BzZWN0X1NwZWMpOiBVc2UgdGhlbSBpbnN0ZWFkIG9mIGxpdGVyYWwgc3RyaW5ncy4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlLCBnbG9iYWxfc3ltYm9sX2RpcmVjdG9yeSk6IEFkanVzdCBjYWxsZXJzLgotCi1XZWQgSnVsIDI2IDE4OjMxOjM1IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChjb25zdF9mbGFnKTogQ2hhbmdlIGZyb20gY2hhciB0byB1bnNpZ25lZCBjaGFyLgotCSogY29uZmlnL29iai12bXMuaCAoY29uc3RfZmxhZyk6IERpdHRvLgotCShzdHJ1Y3Qgbmxpc3QpOiBSZXBsYWNlIHVuaW9uIG5fdW4gYW5kIG5fdW4ue25fbmFtZSxuX25leHQsbl9zdHJ4fQotCWZpZWxkcyB3aXRoIGp1c3Qgbl9uYW1lOyBkZWxldGUgZmllbGQgbl92YWx1ZTsgY2hhbmdlIG5fb3RoZXIgZnJvbQotCWNoYXIgdG8gdW5zaWduZWQgY2hhciBhbmQgbl9kZXNjIGZyb20gc2hvcnQgdG8gaW50OyBpbnNlcnQgZXhwbGljaXQKLQlwYWRkaW5nIGZvciBhbGlnbm1lbnQuCi0KLU1vbiBKdWwgMjQgMjA6MDY6MTcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuaCAoc3RydWN0IHNlZ19pbmZvX3RyYXNoKTogTWFrZSBiaXRmaWVsZCB0eXBlcyB2YWxpZC4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBMb2NhbCBhZGRfbnVtYmVyIHNob3VsZCBub3QKLQliZSBkZWNsYXJlZCByZWdpc3RlciBzaW5jZSBpdHMgYWRkcmVzcyBpcyB0YWtlbiBmb3IKLQlNRF9BUFBMWV9GSVgzLgotCi0JRnJpIEp1bCAyMSAxNToyODoxOCAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCVNwbGl0IGh1Z2Ugdm1zX3dyaXRlX29iamVjdF9maWxlIHJvdXRpbmUgaW50byBtYW5hZ2FibGUgcGllY2VzLgotCi0JKiBjb25maWcvb2JqLXZtcy5jICh2bXNfZml4dXBfdGV4dF9zZWN0aW9uLCBzeW50aGVzaXplX2RhdGFfc2VnbWVudCwKLQl2bXNfZml4dXBfZGF0YV9zZWN0aW9uLCBnbG9iYWxfc3ltYm9sX2RpcmVjdG9yeSwgbG9jYWxfc3ltYm9sc19EU1QsCi0Jdm1zX2J1aWxkX0RTVCk6IE5ldyByb3V0aW5lcy4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlKTogQ2FsbCB0aGVtLgotCShzdHJ1Y3Qgdm1zX29ial9zdGF0ZSk6IE5ldyBmaWxlIHNjb3BlIHZhcmlhYmxlIHVzZWQgYnkgdGhlIGFib3ZlLgotCi1Nb24gSnVsIDI0IDE0OjEwOjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAidXNlcyIuCi0JKHNfdXNlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNoX2NvZmZfZnJvYl9maWxlKTogTmV3IGZ1bmN0aW9uLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBDYWxsIHN1YnNlZ19jaGFuZ2UgYmVmb3JlIGNhbGxpbmcgZml4X25ldy4KLQkoc2hfaGFuZGxlX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotCShTV0lUQ0hfVEFCTEUpOiBEZWZpbmUuCi0JKHNoX2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBSX1NIX1VTRVMsIFJfU0hfQ09VTlQgYW5kIFJfU0hfQUxJR04uCi0JKHNoX2NvZmZfcmVsb2NfbWFuZ2xlKTogTGlrZXdpc2UuICBBbHNvIGhhbmRsZSBzd2l0Y2ggdGFibGUKLQllbnRyaWVzLgotCSogY29uZmlnL3RjLXNoLmggKEhBTkRMRV9BTElHTik6IERlZmluZS4KLQkoc2hfaGFuZGxlX2FsaWduKTogRGVjbGFyZS4KLQkoVENfRk9SQ0VfUkVMT0NBVElPTik6IERlZmluZS4KLQkoc2hfZm9yY2VfcmVsb2NhdGlvbik6IERlY2xhcmUuCi0JKFRDX0NPVU5UX1JFTE9DKTogU2ltcGxpZnk7IHJlbHkgb24gVENfRk9SQ0VfUkVMT0NBVElPTiBpbnN0ZWFkLgotCSh0Y19mcm9iX2ZpbGUpOiBEZWZpbmUuCi0JKHNoX2NvZmZfZnJvYl9maWxlKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENhbGwgdGNfZnJvYl9maWxlIGlmIGl0Ci0JaXMgZGVmaW5lZC4KLQkoZml4dXBfbWRlcHMpOiBDYWxsIEhBTkRMRV9BTElHTiBpZiBpdCBpcyBkZWZpbmVkLgotCShUQ19GT1JDRV9SRUxPQ0FUSU9OKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShmaXh1cF9zZWdtZW50KTogVXNlIFRDX0ZPUkNFX1JFTE9DQVRJT04gdG8gZGVjaWRlIHdoZXRoZXIgdG8KLQljbGVhciB0aGUgc3ltYm9sIGZpZWxkcyBvZiBmaXhQLgotCi1GcmkgSnVsIDIxIDIyOjM4OjAwIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogQWRkIHN1cHBvcnQgZm9yIFJfUFBDX1NEQVJFTAotCXJlbG9jYXRpb24uCi0JKG1kX2FwcGx5X2ZpeDMpOiBEaXR0by4KLQotVGh1IEp1bCAyMCAxMzowMDo1NiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfY29udmVydF9mcmFnKTogUmVuYW1lIGFyZ3VtZW50IHNlZyB0byBzZWMsCi0Jc2luY2Ugc2VnIGlzIGEgbWFjcm8gbmFtZSBpbiB0aGlzIGZpbGUuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYXJtLSotcmlzY2l4Kik6IERvbid0IHNldCBlbXVsYXRpb24uCi0KLVdlZCBKdWwgMTkgMTY6MDg6MjkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKFRFX1BFKTogRGVsZXRlLgotCSogY29uZmlnL3RjLWFybS5oIChCWVRFX09SREVSKTogRGVsZXRlLgotCShUQVJHRVRfRk9STUFUKTogUHJvdmlkZSB2YWx1ZSBmb3IgT0JKX0NPRkYgYW5kIFRFX1BFLgotCShBUk1fQklfRU5ESUFOKTogRGVmaW5lIGlmIE9CSl9DT0ZGIGFuZCBURV9QRS4KLQkqIGNvbmZpZy90Yy1hcm0uYyAoYnl0ZV9vcmRlcik6IERlbGV0ZS4KLQkobWRfbnVtYmVyX3RvX2NoYXJzKTogUmVmZXJlbmNlIHRhcmdldF9iaWdfZW5kaWFuLCBub3QgYnl0ZV9vcmRlci4KLQkobWRfY2hhcnNfdG9fbnVtYmVyKTogTGlrZXdpc2UuCi0JKG1kX2xvbmdvcHRzKTogQWRkIC1FQi8tRUwgaWYgQVJNX0JJX0VORElBTi4KLQkobWRfcGFyc2Vfb3B0aW9ucyk6IFJlY29nbml6ZSAtRUIvLUVMLgotCShtZF9zaG93X3VzYWdlKTogTGlzdCAtRUIvLUVMLgotCi1XZWQgSnVsIDE5IDExOjQ5OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzcC5jIChwcm9jZXNzX2Fzc2lnbnMpOiBVc2UgdG91cHBlciBiZWZvcmUgY29tcGFyaW5nIGFnYWluc3QKLQl1cHBlciBjYXNlIGxldHRlci4KLQkod2hhdGNvbmQpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLXNoLmMgKHNoX3JlbGF4KTogUmVuYW1lIGZyb20gcmVsYXgsIGFuZCBtYWtlIGdsb2JhbC4KLQlSZW5hbWVkIGFsbCB1c2VzLgotCShpbnNlcnQpOiBQYXNzIGEgc2l6ZSBvZiAyLCBub3QgNC4KLQkoYnVpbGRfcmVsYXgpOiBSZW1vdmUgdW51c2VkIGxlbiB2YXJpYWJsZS4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLWxpdHRsZSBvcHRpb24uCi0JKG1kX2NvbnZlcnRfZnJhZyk6IEFkZCBzZWdUIGFyZ3VtZW50LiAgUmV3cml0ZSB0byBnZW5lcmF0ZSByZWxvY3MKLQlyYXRoZXIgdGhhbiB0byBnZW5lcmF0ZSBjb21wbGV0ZSBpbnN0cnVjdGlvbnMgaGVyZS4KLQkobWRfYXBwbHlfZml4KTogQWRqdXN0IGFuZCBjbGFyaWZ5IFJfU0hfUENSRUxJTU04Qlk0IGNhc2UgZm9yCi0JY2hhbmdlcyBpbiBpbnNlcnQgYW5kIG1kX3BjcmVsX2Zyb20uICBBZGQgY2FzZXMgZm9yIFJfU0hfUENESVNQCi0JYW5kIFJfU0hfUENESVNQOEJZMi4KLQkobWRfcGNyZWxfZnJvbSk6IERvbid0IHN1YnRyYWN0IDEsIGFkZCAyLgotCSh0Y19jb2ZmX2ZpeDJydHlwZSk6IFJlbW92ZS4KLQkoc2hfY29mZl9yZWxvY19tYW5nbGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtc2guaCAoVENfQ09GRl9GSVgyUlRZUEUpOiBKdXN0IHJldHVybiBmeF9yX3R5cGUuCi0JKHNoX3JlbGF4KTogRGVjbGFyZS4KLQkoVENfQ09VTlRfUkVMT0MpOiBJZiByZWxheGluZywgY291bnQgUEMgcmVsYXRpdmUgcmVsb2NzLgotCShUQ19SRUxPQ19NQU5HTEUpOiBEZWZpbmUuCi0JKHNoX2NvZmZfcmVsb2NfbWFuZ2xlKTogRGVjbGFyZS4KLQkodGNfY29mZl9zaXplbWFjaGRlcCk6IERlY2xhcmUuCi0JKiB0Yy5oIChtZF9jb252ZXJ0X2ZyYWcpOiBBZGQgc2VnVCBwYXJhbWV0ZXIgdG8gbm9uIEJGRF9BU1NFTUJMRVIKLQlkZWNsYXJhdGlvbi4KLQkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBBZGQgc2VjIGFyZ3VtZW50IHRvIG5vbgotCUJGRF9BU1NFTUJMRVIgdmVyc2lvbi4gIFBhc3MgaXQgdG8gbWRfY29udmVydF9mcmFnLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IFBhc3MgU0VHX1RFWFQgdG8gY3ZzX2ZyYWdfdG9fZmlsbC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogUGFzcyBzZWdtZW50IGluZm8gdG8KLQlUQ19SRUxPQ19NQU5HTEUuCi0JKGZpeHVwX21kZXBzKTogUGFzcyBzZWdtZW50IHR5cGUgdG8gbWRfY29udmVydF9mcmFnLgotCSogY29uZmlnL3RjLWEyOWsuYyAobWRfY29udmVydF9mcmFnKTogQWRkIHNlZ1QgYXJndW1lbnQuCi0JKiBjb25maWcvdGMtaDgzMDAuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaDg1MDAuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1pODYwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWk5NjAuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1tODhrLmggKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXRhaG9lLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXZheC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy13NjUuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtejhrLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWg4MzAwLmggKFRDX1JFTE9DX01BTkdMRSk6IEFkZCBzZWdtZW50IGFyZ3VtZW50LgotCSogY29uZmlnL3RjLWg4NTAwLmggKFRDX1JFTE9DX01BTkdMRSk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXc2NS5oIChUQ19SRUxPQ19NQU5HTEUpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy16OGsuaCAoVENfUkVMT0NfTUFOR0xFKTogTGlrZXdpc2UuCi0KLU1vbiBKdWwgMTcgMTU6MDI6NTQgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk6IERlbGV0ZSBhcyBmaWxlCi0Jc2NvcGUgdmFyaWFibGVzLgotCShEZWZpbmVfUm91dGluZSwgRGVmaW5lX0xvY2FsX1N5bWJvbHMpOiBUYWtlIEN1cnJlbnRfUm91dGluZSBhbmQKLQlUZXh0X1BzZWN0IGFzIGFyZ3VtZW50cy4KLQkoVk1TX0RCR19EZWZpbmVfUm91dGluZSk6IERlbGV0ZS4KLQkoVk1TX1RCVF9CbG9ja19FbmQpOiBDaGFuZ2UgYFNpemUnIGFyZ3VtZW50IGZyb20gaW50IHRvIHZhbHVlVC4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlOiB0ZXh0IGFuZCBkYXRhIGZpeHVwIGxvb3BzKTogRGlmZmVyZW5jZQotCW9mIHR3byBzeW1ib2xzIGhhcyB0eXBlIG9mZnNldFQgcmF0aGVyIHRoYW4gaW50OyBjb252ZXJ0IHdpdGgKLQltZF9udW1iZXJfdG9fY2hhcnMgYmVmb3JlIHBhc3NpbmcgdG8gVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhLgotCSh2bXNfd3JpdGVfb2JqZWN0X2ZpbGU6IGRlYnVnIHN5bWJvbCBsb29wKTogQ2FsbCBEZWZpbmVfUm91dGluZQotCWluc3RlYWQgb2YgVk1TX0RCR19EZWZpbmVfUm91dGluZS4KLQotU2F0IEp1bCAxNSAwMDowMTozNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IEFkZCBAZml4dXAgc28gdGhhdCB0aGUKLQljb21waWxlciBjYW4gbWFyayB3aGljaCByZWxvY3Mgbm90IHRvIGNvbXBsYWluIGFib3V0IHdpdGgKLQktbXJlbG9jYXRhYmxlLgotCShwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IEFkZCAuZml4dXAgdG8gc2VjdGlvbnMgbm90IHRvIGNvbXBsYWluCi0JYWJvdXQsIGFuZCBhbHNvIGRvbid0IGNvbXBsYWluIGZvciBCRkRfUkVMT0NfQ1RPUiByZWxvY2F0aW9ucyBpbgotCXdyaXRhYmxlIG5vbi1jb2RlIHNlZ21lbnRzLgotCShtZF9hcHBseV9maXgpOiBUcmVhdCBCRkRfUkVMT0NfQ1RPUiBqdXN0IGxpa2UgQkZEX1JFTE9DXzMyLgotCi1GcmkgSnVsIDE0IDE5OjU0OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBTUEFSQyBTdW5PUyBQSUM6Ci0JKiBjb25maWcvdGMtc3BhcmMuaCAoc3BhcmNfcGljX2NvZGUpOiBBbHdheXMgZGVjbGFyZSwgbm90IGp1c3QKLQl3aGVuIE9CSl9FTEYuCi0JKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IERlZmluZSB3aGVuIE9CSl9BT1VULgotCSh0Y19maXhfYWRqdXN0YWJsZSk6IE5ldyBkZWZpbml0aW9uIGZvciBPQkpfQU9VVC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19waWNfY29kZSk6IEFsd2F5cyBkZWZpbmUsIG5vdCBqdXN0IHdoZW4KLQlPQkpfRUxGLgotCShtZF9hcHBseV9maXgpOiBBZGp1c3QgcmVsb2MgYWRkZW5kIGZvciBPQkpfQU9VVCBhbmQgUElDLiAgSW4KLQlCRkRfUkVMT0NfMzJfUENSRUxfUzIgY2FzZSwgZG9uJ3QgaW5jcmVtZW50IHZhbCBmb3IgYW4gZXh0ZXJuYWwKLQlzeW1ib2wgd2hlbiBQSUMuCi0JKHRjX2dlbl9yZWxvYyk6IEdlbmVyYXRlIGRpZmZlcmVudCBQSUMgcmVsb2NzIHdoZW4gT0JKX0FPVVQsIGFzCi0Jd2VsbCBhcyB3aGVuIE9CSl9FTEYuCi0JKG1kX3Nob3J0b3B0cyk6IElmIE9CSl9BT1VULCBpbmNsdWRlIGBrJy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSWYgT0JKX0FPVVQsIGhhbmRsZSAnaycuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC1rIGlmIE9CSl9BT1VULCBhbmQgLUtQSUMgaWYgT0JKX0VMRi4KLQkobWRfcGNyZWxfZnJvbSk6IERvbid0IGFkZCBpbiBzaXplIGZvciBhbiBleHRlcm5hbCBzeW1ib2wgd2hlbgotCVBJQy4KLQotVGh1IEp1bCAxMyAyMToxNjo0MyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuaCAoVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0spOiBEZWZpbmUgZm9yIFNPTS4KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogU2V0IHN5X3VzZWRfaW5fcmVsb2MgZm9yIGJvdGgKLQlzeW1ib2xzIGluIGEgZml4dXAgd2hlcmUgYSBkZWZpbmVkIHN5bWJvbCBpcyBzdWJ0cmFjdGVkIGZyb20gYW4KLQl1bmRlZmluZWQgc3ltYm9sICh3aGVuIFVOREVGSU5FRF9ESUZGRVJFTkNFX09LIGlzIGRlZmluZWQpLgotCShmaXh1cF9zZWdtZW50KTogRG8gbm90aGluZyBmb3IgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaWYKLQlVTkRFRklORURfRElGRkVSRU5DRV9PSyBpcyBkZWZpbmVkLgotCi1XZWQgSnVsIDEyIDIzOjMzOjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBTdXBwb3J0IE1EX0FQUExZX0ZJWDMuCi0KLVdlZCBKdWwgMTIgMDE6MTI6MTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLXBjLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeF9uZXcpOiBVc2UgaW50LCBub3Qgc2hvcnQgaW50LCBmb3IgYXJndW1lbnQgdHlwZS4KLQkoZml4X25ld19leHApOiBEaXR0by4KLQotCSogY29uZmlndXJlLmluIChhcm0tKi1yaXNjaXgqKTogRG9uJ3Qgc2V0IGVtdWxhdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKE5PX0VDT0ZGX0RFQlVHR0lORyk6IERlZmluZSBpZiBFQ09GRl9ERUJVR0dJTkcKLQl3YXNuJ3QgcHJldmlvdXNseSBkZWZpbmVkLgotCShzX2V4dGVybik6IERvbid0IHNldCBlY29mZl9leHRlcm5fc2l6ZSBpZiBOT19FQ09GRl9ERUJVR0dJTkcuCi0JKG5vcGljX25lZWRfcmVsYXgpOiBEb24ndCBjaGVjayBpdCBpZiBOT19FQ09GRl9ERUJVR0dJTkcuCi0JKG1hY3JvX2J1aWxkKSBbIVVTRV9TVERBUkddOiBEb24ndCB1c2UgdmFyaWFkaWMgcHJvdG90eXBlLgotCShtaXBzX2xvY2FsX2xhYmVsKSBbTk9fRUNPRkZfREVCVUdHSU5HXTogRG9uJ3QgcHJlc2VydmUgcG90ZW50aWFsCi0JRUNPRkYgZGVidWdnaW5nIHN5bWJvbHMuCi0KLQkqIGVtdWwuaCAoc3RydWN0IGVtdWxhdGlvbik6IFVzZSB1bnNpZ25lZCwgbm90IHVuc2lnbmVkIGNoYXIsIGZvcgotCWJpdGZpZWxkcy4KLQkqIG9iai5oIChzdHJ1Y3QgZm9ybWF0X29wcyk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHN5bWJvbF9tYWtlX2VtcHR5KSBbQkZEX0FTU0VNQkxFUl06IFNldAotCXVkYXRhLnAsIG5vdCB1ZGF0YS4KLQotVHVlIEp1bCAxMSAxNDozMDoxOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLW1pcHMudGV4aTogRG9jdW1lbnQgLW00MDEwIGFuZCAtbW5vLTQwMTAuCi0KLVR1ZSBKdWwgMTEgMTQ6Mjg6NTUgMTk5NSAgSmVmZiBTcGllZ2VsICA8amVmZnNAbHNpbC5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfNDAxMCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGludGVybG9ja3MpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9iZWdpbik6IENoZWNrIGZvciBhIGNwdSBvZiAicjQwMTAiLiAgU2V0IG1pcHNfNDAxMCBjb3JyZWN0bHkuCi0JSWYgbWlwc180NjUwIG9yIG1pcHNfNDAxMCwgc2V0IGludGVybG9ja3MuCi0JKGFwcGVuZF9pbnNuKTogQ2hlY2sgaW50ZXJsb2Nrcywgbm90IG1pcHNfNDY1MC4KLQkobWlwc19lbWl0X2RlbGF5cyk6IExpa2V3aXNlLgotCShtaXBzX2lwKTogT25seSBwZXJtaXQgSU5TTl80MDEwIGluc3RydWN0aW9ucyBpZiBtaXBzXzQwMTAuCi0JKG1kX2xvbmdvcHRzKTogQWRkICJtNDAxMCIgYW5kICJuby1tNDAxMCIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFjY2VwdCAtbWNwdT1yNDAxMC4gIEhhbmRsZSAtbTQwMTAgYW5kCi0JLW5vLW00MDEwLgotCShtZF9zaG93X3VzYWdlKTogRG9jdW1lbnQgLW00MDEwIGFuZCAtbm8tbTQwMTAuCi0KLVR1ZSBKdWwgMTEgMTM6MjI6NTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChzdHJ1Y3QgZWZkcik6IEFkZCBuZXcgZmllbGQgZmFrZS4KLQkoaW5pdF9maWxlKTogSW5pdGlhbGl6ZSBmYWtlLgotCShhZGRfZmlsZSk6IEFkZCBuZXcgcGFyYW1ldGVyIGZha2UuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGVjb2ZmX2J1aWxkX2RlYnVnKTogRG9uJ3Qgd2FybiBhYm91dCBhIG1pc3NpbmcgLmVuZCBmb3IgYSBmYWtlCi0JZmlsZS4KLQotTW9uIEp1bCAxMCAxNjowMTozMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IFNwbGl0IG91dCBtb3N0IGNwdSBjaGFwdGVycy4uLgotCSogZG9jL2MtKi50ZXhpOiAuLi50byBoZXJlLgotCi0JKiByZWFkLmMgKHBvX2hhc2gpOiBOb3cgc3RhdGljLgotCi1Nb24gSnVsIDEwIDEzOjQ3OjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBILkouIEx1IDxoamxAbnluZXhzdC5jb20+OgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4Myk6IFJlbmFtZSBmcm9tIG1kX2FwcGx5X2ZpeDEuCi0JQWNjZXB0IHBvaW50ZXIgdG8gdmFsdWUgYW5kIHNlZ21lbnQuICBGaXggT0JKX0VMRiBQQ1JFTCBjYXNlIHRvCi0JaGFuZGxlIGdsb2JhbCBkZWZpbmVkIHN5bWJvbHMgY29ycmVjdGx5LgotCShtZF9hcHBseV9maXgpOiBSZW1vdmUgYm90aCB2ZXJzaW9ucy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKE1EX0FQUExZX0ZJWDMpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogV2hlbiBzd2l0Y2hpbmcgb24gJHtjcHV9LCB1c2UgJHtjcHV9LCBub3QKLQkkW3RhcmdldF9jcHV9LCBpbiBkZWZhdWx0IGNhc2UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVNhdCBKdWwgIDggMTM6Mjc6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogQ2FsbCByZXNvbHZlX3N5bWJvbF92YWx1ZSBvbgotCXN1Yl9zeW1ib2xQLCBpbiBjYXNlIGl0IGlzbid0IGluIHRoZSBzeW1ib2wgdGFibGUuCi0KLUZyaSBKdWwgIDcgMTE6MTc6MjcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBGb3IgLmxjb21tIDEsIHNldCBhbGlnbiB0byAwLCBub3QgMS4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBJZiBTRl9HRVRfRlVOQ1RJT04sIHNldAotCUJTRl9GVU5DVElPTi4KLQkoc3ltYm9sX2dsb2JhbFAsIHN5bWJvbF9nbG9iYWxfbGFzdFApOiBOZXcgZ2xvYmFsIHZhcmlhYmxlcy4KLQkoeWFua19zeW1ib2xzKTogU29ydCBkZWZpbmVkIGdsb2JhbCBzeW1ib2xzIHRvIHRoZSBlbmQsIGp1c3QKLQliZWZvcmUgdGhlIHVuZGVmaW5lZCBzeW1ib2xzLgotCShnbHVlX3N5bWJvbHMpOiBBZGQgdHdvIGFyZ3VtZW50cywgYW5kIHVzZSB0aGVtIGluc3RlYWQgb2YKLQlyZWZlcnJpbmcgZGlyZWN0bHkgdG8gZ2xvYmFsIHZhcmlhYmxlcy4KLQkoY3Jhd2xfc3ltYm9scyk6IENhbGwgZ2x1ZV9zeW1ib2xzIHR3aWNlLCBvbmNlIGZvciBkZWZpbmVkIGdsb2JhbHMKLQlhbmQgb25jZSBmb3IgdW5kZWZpbmVkLiAgQWRkIGNvcnJlc3BvbmRpbmcga25vdyBjYWxscy4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEFsd2F5cyBhY2NlcHQgXHYuICBEb24ndCBtYWtlIGl0Ci0JY29uZGl0aW9uYWwgb24gQkFDS1NMQVNIX1YuCi0JKiByZWFkLmMgKG5leHRfY2hhcl9vZl9zdHJpbmcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotYm91dC5oIChCQUNLU0xBU0hfVik6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKEJBQ0tTTEFTSF9WKTogRG9uJ3QgZGVmaW5lLgotCi0JQWRkIFNQQVJDIEVMRiBQSUMgc3VwcG9ydC4KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBQYXNzIGZpeFAgdG8gVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQLAotCW5vdCBmaXhQLT5meF9yX3R5cGUuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfcGljX2NvZGUpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLiAKLQkobWRfYXBwbHlfZml4KTogSWYgZ2VuZXJhdGluZyBQSUMsIGFkanVzdCBmeF9hZGRudW1iZXIgZm9yIGFueSBub24KLQlQQyByZWxhdGl2ZSByZWxvYy4KLQkodGNfZ2VuX3JlbG9jKTogSWYgZ2VuZXJhdGluZyBQSUMsIGFkanVzdCB2YXJpb3VzIHJlbG9jIHR5cGVzLgotCVJlbW92ZSBmeF9wY3JlbCBhc3NlcnQsIHNpbmNlIGl0IGlzIG5vIGxvbmdlciB0cnVlLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgLUsgUElDLgotCSogY29uZmlnL3RjLXNwYXJjLmggKHNwYXJjX3BpY19jb2RlKTogRGVjbGFyZSBpZiBPQkpfRUxGLgotCShUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBEZWZpbmUgaWYgT0JKX0VMRi4KLQkodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgUEMgcmVsYXRpdmUgcmVsb2NzIGlmIFBJQy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IFRha2UgYSBmaXhwLCBub3QgYQotCXJlbG9jIHR5cGUuCi0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IEFkZCBkZXBlbmRlbmN5IG9uIGNvbmYuaW4sIHNvIHRoYXQgY29uZgotCWlzIHJlYnVpbHQgd2hlbiBjb25mLmluIGNoYW5nZXMuCi0KLVRodSBKdWwgIDYgMTY6NDk6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIEFsbCBmaWxlczogVXBkYXRlZCBGU0YgYWRkcmVzcy4KLQotVGh1IEp1bCAgNiAxNjozMDozNCAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGFkZF9maWxlKTogRG9uJ3QgY29sbGFwc2UgbXVsdGlwbGUgLmZpbGUgY29tbWFuZHMgaW50bwotCWEgc2luZ2xlIGZpbGUgc3RydWN0dXJlLgotCShlY29mZl9idWlsZF9saW5lbm8pOiBTZXQgaWxpbmVCYXNlIHRvIHN1bSBvZiBwcmV2aW91cyBmaWxlJ3MKLQlpbGluZUJhc2UgYW5kIGNsaW5lLgotCi1UaHUgSnVsICA2IDEyOjU0OjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVBhdGNoZXMgZnJvbSBKZXJyeSBCbGFrZWx5IDxnZXJyeV9ibGFrbGV5QHdlbGxmbGVldC5jb20+OgotCSogYXMuYyAobGlzdGluZ19maWxlbmFtZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNob3dfdXNhZ2UpOiBNZW50aW9uIC1hPWZpbGUuCi0JKHBhcnNlX2FyZ3MpOiBTdXBwb3J0ID0gb3B0aW9uIG9mIC1hIHRvIHNldCBuYW1lIG9mIGxpc3RpbmcgZmlsZS4KLQkobWFpbik6IFBhc3MgbGlzdGluZ19maWxlbmFtZSB0byBsaXN0aW5nX3ByaW50LgotCSogbGlzdGluZy5jIChsaXN0X2ZpbGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCSh2YXJpb3VzKTogUmVwbGFjZSBwcmludGYgd2l0aCBmcHJpbnRmIHRvIGxpc3RfZmlsZS4KLQkobGlzdGluZ19wcmludCk6IElmIG5hbWUgYXJndW1lbnQgaXMgbm90IE5VTEwsIG9wZW4gaXQgYXMKLQlsaXN0X2ZpbGUuCi0JKiBkb2MvYXMudGV4aW5mbywgZG9jL2FzLjE6IERvY3VtZW50IC1hPWZpbGUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX3Jlc2VydmUpOiBEb24ndCBwZXJtaXQgcmVkZWZpbml0aW9uLCBldmVuCi0JaWYgdGhlIHN5bWJvbCB3YXMgYWxyZWFkeSBpbiBic3Nfc2VjdGlvbi4gIEZpeCB3YXJuaW5nIG1lc3NhZ2UuCi0KLQkqIGxpc3RpbmcuYyAoc3RydWN0IGZpbGVfaW5mb19zdHJ1Y3QpOiBSZW5hbWUgZW5kX3BlbmRpbmcgZmllbGQgdG8KLQlhdF9lbmQuCi0JKGZpbGVfaW5mbyk6IEluaXRpYWxpemUgYXRfZW5kLCBub3QgZW5kX3BlbmRpbmcuCi0JKGJ1ZmZlcl9saW5lKTogSWYgYXRfZW5kIHNldCwganVzdCByZXR1cm4gaW1tZWRpYXRlbHkuICBEb24ndAotCXdvcnJ5IGFib3V0IGVuZF9wZW5kaW5nIGNhc2VzLiAgU2V0IGF0X2VuZCB3aGVuIEVPRiBpcyByZWFkLgotCShwcmludF9zb3VyY2UpOiBDaGVjayBhdF9lbmQsIG5vdCBlbmRfcGVuZGluZy4KLQkobGlzdGluZ19saXN0aW5nKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChhbHBoYV9kb19hbGlnbik6IERvbid0IGRlY2xhcmUuCi0JKG1kX2RvX2FsaWduKTogRG9uJ3QgZGVmaW5lLgotCSh0Y19mcm9iX2xhYmVsKTogRGVmaW5lLgotCShhbHBoYV9kZWZpbmVfbGFiZWwpOiBEZWNsYXJlLgotCShtZF9mbHVzaF9wZW5kaW5nX291dHB1dCk6IERlZmluZS4KLQkoYWxwaGFfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLWFscGhhLmMgKGluc25fbGFiZWwpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShhdXRvX2FsaWduKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkIGNhc2VzIGZvciAudGV4dCwgLmRhdGEsIC5hbGlnbiwgLmJ5dGUsCi0JLmh3b3JkLCAuaW50LCAubG9uZywgLm9jdGEsIC5xdWFkLCAuc2hvcnQsIC53b3JkLCAuZG91YmxlLCAuZmxvYXQsCi0JYW5kIC5zaW5nbGUuICBDaGFuZ2UgLnRfZmxvYXRpbmcsIC5zX2Zsb2F0aW5nLCAuZl9mbG9hdGluZywKLQkuZ19mbG9hdGluZywgYW5kIC5kX2Zsb2F0aW5nIHRvIHVzZSBzX2FscGhhX2Zsb2F0X2NvbnMgcmF0aGVyIHRoYW4KLQlmbG9hdF9jb25zLgotCShzX2FscGhhX3RleHQsIHNfYWxwaGFfZGF0YSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShzX3JkYXRhLCBzX3NkYXRhKTogQ2xlYXIgaW5zbl9sYWJlbCBhbmQgc2V0IGF1dG9fYWxpZ24uCi0JKHNfZ3ByZWwzMik6IElmIGF1dG9fYWxpZ24sIGFsaWduLiAgQ2xlYXIgaW5zbl9sYWJlbC4KLQkoZW1pdF9pbnNuKTogQ2xlYXIgaW5zbl9sYWJlbC4KLQkoc19hbHBoYV9hbGlnbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX2FsaWduKTogTWFrZSBzdGF0aWMuICBUYWtlIGxhYmVsIGFyZ3VtZW50LgotCShhbHBoYV9mbHVzaF9wZW5kaW5nX291dHB1dCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNfYWxwaGFfY29ucywgc19hbHBoYV9mbG9hdF9jb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKGFscGhhX2RlZmluZV9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQotV2VkIEp1bCAgNSAyMjo0OTozMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZi5pbjogUmVnZW5lcmF0ZSB3aXRoIGF1dG9yZWNvbmYuCi0KLQlNb24gSnVsICAzIDE5OjQ3OjUzIDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5oICh2bXNfcmVzb2x2ZV9zeW1ib2xfcmVkZWYpOiBVc2UgZnVsbCBwcm90b3R5cGUuCi0JKHZtc19jaGVja19mb3Jfc3BlY2lhbF9sYWJlbCwgdGNfZnJvYl9sYWJlbCk6IE1vdmUgdGhlbSB0byBncm91cAotCXdpdGggb3RoZXIgcHJvdG90eXBlcy4KLQlbV0FOVF9WTVNfT0JKX0RFRlNdOiBPbmx5IGRlZmluZSB0aGUgbWFueSBPQkpfeCwgREJHX3gsIGFuZCBEU1RfeAotCW1hY3JvcyB3aGVuIHRoaXMgaXMgZGVmaW5lZC4KLQkqIGNvbmZpZy9vYmotdm1zLmM6IEZ1bGx5IHByb3RvdHlwZSBhbGwgbG9jYWwgZnVuY3Rpb25zLgotCVtzeW1ib2xTLCBmcmFnU106IFVzZSBjb25zaXN0ZW50bHkgaW5zdGVhZCBvZiB0aGVpciBzdHJ1Y3QgdGFncy4KLQlbV0FOVF9WTVNfT0JKX0RFRlNdOiBEZWZpbmUgdGhpcy4KLQkoc19jb25zdCk6IE1ha2UgZGVmaW5pdGlvbiBjb3JyZWN0bHkgbWF0Y2ggYWN0dWFsIHVzYWdlLgotCShWTVNfc3RhYl9wYXJzZSk6IE1ha2UgYGV4cGVjdGVkX3R5cGUnIGFyZyBiZSBpbnQgcmF0aGVyIHRoYW4gY2hhci4KLQkoZ2V0X1ZNU190aW1lX29uX3VuaXgpOiBEZWZpbmUgYXMgYHN0YXRpYyB2b2lkJy4KLQkoaGFzaF9zdHJpbmcpOiBNYWtlIGRlZmluaXRpb24gbWF0Y2ggYWN0dWFsIHVzYWdlOyBhcmd1bWVudCBpcwotCWBjaGFyIGNvbnN0IConIHJhdGhlciB0aGFuIGB1bnNpZ25lZCBjaGFyIConLgotCShWTVNfQ2FzZV9IYWNrX1N5bWJvbCwgVk1TX01vZGlmeV9Qc2VjdF9BdHRyaWJ1dGVzLCBWTVNfUHNlY3RfU3BlYywKLQlWTVNfR2xvYmFsX1N5bWJvbF9TcGVjKTogRGVjbGFyZSBzdHJpbmcgYXJncyBhcyBgY29uc3QgY2hhciAqJy4KLQlbSVNfR1hYX1ZUQUJMRV06IE5ldyBtYWNyby4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlOiBHU0QgbG9vcCk6IFVzZSBpdC4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlOiBkYXRhIHNlZ21lbnQpOiBSZW9yZ2FuaXplIGBmaWxsJyBsb29wLgotCi1XZWQgSnVsICA1IDEyOjAxOjQ5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3Nob3J0b3B0cyk6IEFkZCAiSzoiIGlmIE9CSl9FTEYuCi0JKG1kX3BhcnNlX29wdGlvbik6IElmIE9CSl9FTEYsIGNoZWNrIGZvciAtSy4gIERpZSBpZiAtSyBQSUMsIHNpbmNlCi0JUElDIGNvZGUgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCi0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBDaGFuZ2Ugc3RkX3Nob3J0b3B0cyB0byBiZSBhbiBhcnJheSByYXRoZXIKLQl0aGFuIGEgY29uc3RhbnQgc3RyaW5nLiAgT25seSBpbmNsdWRlICdLJyBpZiBXT1JLSU5HX0RPVF9XT1JEIGlzCi0Jbm90IGRlZmluZWQuICBPbmx5IGNoZWNrIGZvciAnSycgaW4gdGhhdCBjYXNlIGFzIHdlbGwuCi0JKiBhcy5oIChmbGFnX3dhcm5fZGlzcGxhY2VtZW50KTogT25seSBkZWNsYXJlIGlmIFdPUktJTkdfRE9UX1dPUkQKLQlpcyBub3QgZGVmaW5lZC4KLQotCSogY29uZi5pbjogQWRkIHVuZGVmIG9mIEhBVkVfU0JSSy4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2xpbmUpOiBDYWxsIGxpc3Rpbmdfc291cmNlX2xpbmUsIGluCi0JYm90aCBCRkRfQVNTRU1CTEVSIGFuZCBub24gQkZEX0FTU0VNQkxFUiB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24uCi0KLQkqIHN5bWJvbHMuYyAoU19TRVRfRVhURVJOQUwpOiBXYXJuIGlmIHN5bWJvbCBpcyB3ZWFrLgotCShTX0NMRUFSX0VYVEVSTkFMKTogTGlrZXdpc2UuCi0JKFNfU0VUX1dFQUspOiBXYXJuIGlmIHN5bWJvbCBpcyBnbG9iYWwuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IFdhcm4gYWJvdXQgYW4gYXR0ZW1wdAotCXRvIHB1dCBhbiB1bmRlZmluZWQgc3ltYm9sIGludG8gYSBzZXQuCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgQGNvbmZpZ3VyZV9pbnB1dEA7IGl0J3Mgbm90IG5lZWRlZCBpbgotCWZpbGVzIG5hbWVkIE1ha2VmaWxlLgotCi0JKiBjb25maWcvdGMtbTg4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgIi5zZXQiIHNvIHRoYXQgdGhlCi0JZXhwbGljaXQgcHNldWRvLW9wIHdvcmtzLCB3aGlsZSBjb250aW51aW5nIHRvIHRyZWF0ICJzZXQiIGFzIGFuCi0JaW5zdHJ1Y3Rpb24uCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2RlYnVnZ2luZ19zZWVuKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkoZWNvZmZfZGlyZWN0aXZlX2RlZik6IFNldCBlY29mZl9kZWJ1Z2dpbmdfc2Vlbi4KLQkoZWNvZmZfc3RhYik6IExpa2V3aXNlLgotCSogZWNvZmYuaDogTWFrZSBpZGVtcG90ZW50LgotCShlY29mZl9kZWJ1Z2dpbmdfc2Vlbik6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbWlwcy5jOiBJbmNsdWRlIGVjb2ZmLmguCi0JKG1pcHNfZGVidWcpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzX3N0cmluZ2VyLCBzX21pcHNfc3BhY2UpOiBSZW1vdmUgdW5uZWVkZWQgZGVjbGFyYXRpb25zLgotCShtZF9wYXJzZV9vcHRpb24pOiBJbiBjYXNlICdnJywgc2V0IG1pcHNfZGVidWcgdG8gZGVidWdnaW5nIGxldmVsLgotCShtaXBzX2xvY2FsX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgotCSogdGMtbWlwcy5oIChMT0NBTF9MQUJFTCk6IENhbGwgbWlwc19sb2NhbF9sYWJlbC4KLQkobWlwc19sb2NhbF9sYWJlbCk6IERlY2xhcmUuCi0KLVdlZCBKdWwgIDUgMDA6NTk6MjIgMTk5NSAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGFzLmMgKG1haW4pOiAgT25seSB1c2Ugc2JyayB3aGVuIEhBVkVfU0JSSyBkZWZpbmVkLgotCSogY29uZmlndXJlLmluOiAgQWRkIHRlc3QgZm9yIHNicmsuCi0JKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlIHVzaW5nIGF1dG9jb25mIDIuNC4KLQotTW9uIEp1bCAgMyAxNTo1ODoxNiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuaCAoTUFYX1JFTE9DX0VYUEFOU0lPTik6IEJ1bXAgdG8gNi4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYywgU09NIHZlcnNpb24pOiBIYW5kbGUKLQlyZWxvY2F0aW9ucyBmb3IgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIChwb3NzaWJseSBleHRlcm5hbCkKLQlzeW1ib2xzLgotCShocHBhX2ZpeF9hZGp1c3RhYmxlKTogRm9yIFNPTSwgcmVqZWN0IHJlZHVjdGlvbnMgaW52b2x2aW5nCi0JdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMuCi0JKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIHJlbG9jYXRpb25zIGZvciBleHByZXNzaW9ucwotCWludm9sdmluZyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scy4KLQotTW9uIEp1bCAgMyAxNDoyMjo1OSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmVbLmluXSAoaTM4Ni0qLXdpbjMyKTogTmV3IGhvc3QgYW5kIHRhcmdldC4KLQotVGh1IEp1biAyOSAxNzoyNTo0MyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JU3VwcG9ydCBmb3IgbG9uZyBmaWxlbmFtZXMgbm9uLWJmZCBjb2ZmLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpbGVuYW1lX2xpc3RfaGVhZCwgZmlsZW5hbWVfbGlzdF90YWlsKTogTmV3LgotCSh5YW5rX3N5bWJvbHMpOiBOb3RpY2UgYW5kIHJlY29yZCBmaWxlbmFtZXMgd2hpY2ggYXJlIHRvbyBsb25nLgotCSh3X3N0cmluZ3MpOiBXcml0ZSBvdXQgZmlsZW5hbWUgc3RyaW5ncy4KLQkoY19kb3RfZmlsZV9zeW1ib2xzKTogUHV0IGxvbmcgZmlsZW5hbWVzIG9udG8gbGlzdC4KLQotV2VkIEp1biAyOCAxNzozMzoxMyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IFBFIGRvZXNuJ3QgdXNlCi0JdGhlIHN0cmFuZ2UgY29tbW9uIHN5bWJvbCBmb3JtYXQgdGhhdCBvdGhlciAzODZzIGZvcm1hdHMKLQlkby4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2JlZ2luKTogSWYgTEVYX0FUIGRlZmluZWQgdGhlbgotCSdAJyBpcyBpbiB0aGUgc2V0IG9mIGlkZW50aWZpZXJzLgotCShpMzg2X29wZXJhbmQpOiBJZiBMRVhfQVQsIHRoZW4gZG9uJ3QgbG9vayBmb3IgQGdvdG8gc3R1ZmYuCi0JKiBjb25maWcvdGUtcGUuaDogRGVmaW5lIExFWF9BVC4KLQotV2VkIEp1biAyOCAxNzo0OTo1OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm8gKEg4LzUwMCBGbG9hdGluZyBQb2ludCk6IEluZGljYXRlIHRoYXQgSUVFRSBGUAotCW51bWJlcnMgYXJlIGZvciB0aGUgc3RhbmRhcmQgZW11bGF0aW9uIGNvZGUuCi0JKFNIIEZsb2F0aW5nIFBvaW50KTogRGl0dG8uCi0JKE92ZXJ2aWV3KTogRGVzY3JpYmUgbmV3IC0tZW11bGF0aW9uIG9wdGlvbiBmb3IgTUlQUy4KLQkqIGRvYy8qLm00OiBEZWxldGVkLgotCi1UaHUgSnVuIDIyIDE5OjI2OjI1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlTdW4gTWF5ICA3IDExOjUzOjQxIE1EVCAxOTk1ICBCcnlhbiBGb3JkICA8YmFmb3JkQGNzLnV0YWguZWR1PgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIGkzODYtKi1tb3NzKiB0YXJnZXQuCi0KLVRodSBKdW4gMjIgMTQ6NDE6MjMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENhc3QgZGVjb2RlX2xvY2FsX2xhYmVsX25hbWUKLQlhcmd1bWVudCB0byBjaGFyICogdG8gYXZvaWQgd2FybmluZy4KLQotV2VkIEp1biAyMSAxODowNzo1OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JQ2hhbmdlcyBmcm9tIEFuZHJlYXMgU2Nod2FiIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+OgotCSogY29uZmlnL3RjLW02OGsuYyAoaW5zd29yZCk6IEluY3JlbWVudCB0aGUgZnJhZyBvZmZzZXRzLgotCShzdHJ1Y3QgbTY4a19pdCk6IEFkZCByZWxvY1tdLnBjcmVsX2ZpeCBmaWVsZCB0byBob2xkIHBjLXJlbAotCWZpeHVwLgotCShhZGRfZml4KTogQWNjZXB0IGFkZGl0aW9uYWwgcGFyYW1ldGVyLCB0aGUgcGMtcmVsIGZpeHVwLiBBbGwKLQljYWxsZXJzIGNoYW5nZWQuICBGaXggb2Zmc2V0IGFkZHJlc3MgaWYgd2lkdGggPT0gJ2InLgotCShtNjhrX2lwKSBbY2FzZSBBSU5EWF06IEFsbG93IGV4cGxpY2l0IHNpemUgc3BlYy4gIERvbid0IG1ha2UgdGhlCi0Jb3V0ZXIgZGlzcGxhY2VtZW50IHBjLXJlbGF0aXZlLgotCShtZF9wY3JlbF9mcm9tKTogTWFrZSBpdCByZWxhdGl2ZSB0byB0aGUgZmlyc3QgZXh0ZW5zaW9uIHdvcmQgb2YKLQl0aGUgb3BlcmFuZC4KLQkob3Bjb2RlX3B0cik6IE1ha2UgaXQgYSBtYWNybyBpZiBET19CUkVBS19VUF9CSUdfREVDTCBpcwotCXVuZGVmaW5lZC4KLQkobWRfY29udmVydF9mcmFnXzEpOiBEb24ndCByZWZlcmVuY2UgZnJhZ1AtPmZyX29wY29kZVsyLi5dLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCkgW2Nhc2UgVEFCIChGQlJBTkNILCBTWl9VTkRFRildOgotCVR1cm4gb24gbG9uZyBiaXQuCi0JKG02OGtfaXApIFtjYXNlICdDJ106IERvbid0IHNldCBzZXQgbG9uZyBiaXQsIHNldCBpdCBpbiB0aGUgb3Bjb2RlCi0gCXRhYmxlLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCkgW2Nhc2UgVEFCIChQQ0lOREVYLCBTWl9VTkRFRildOgotCVZhcmlhYmxlIHBhcnQgaW5jcmVhc2VzIGJ5IGZvdXIsIG5vdCBzaXguCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KSBbVENfTTY4S106IERvbid0IGRvIGZ1cnRoZXIgcGNyZWwKLQlwcm9jZXNzaW5nIGFmdGVyIGNvbnZlcnRpbmcgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpbiB0aGUKLQlzYW1lIHNlZ21lbnQuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBjb25kaXRpb25hbGl6ZSB0aGUgcGNyZWwgZml4IG9uCi0JVENfTTY4Sy4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwLCBjYXNlICdBJyk6IElmIEFTSSBpcyBub3QgYSAiIyIKLQl2YWx1ZSwgZG9uJ3Qgc2hpZnQgaXQgYW4gZXh0cmEgdGltZS4KLQotV2VkIEp1biAyMSAxNDoxODozNyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBnYXNwLmMgKGRvX3ByaW50LCBkb19mb3JtLCBidWZmZXJfYW5kX25lc3QpOiBVc2UgY2FzZSBpbnNlbnNpdGl2ZQotCXN0cmluZyBjb21wYXJlcy4KLQotVHVlIEp1biAyMCAxNDo1NTowMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYXN0IHRpbWUoKSBhcmd1bWVudCB0bwotCXRpbWVfdCAqLgotCi1UdWUgSnVuIDIwIDEyOjAwOjUzIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBGaXggdHlwbyBpbiBsYXN0Ci0JY2hhbmdlLgotCi1Nb24gSnVuIDE5IDE1OjI3OjE3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBaZXJvIG91dCBtZW1vcnkKLQlmcm9tIGZyYWdfbW9yZSBjYWxscy4KLQotVGh1IEp1biAxNSAxNjo1MzozNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBEb24ndCB1c2UgImJmZC8iIHdoZW4gaW5jbHVkaW5nIGxpYmJmZC5oCi0JYW5kIGxpYmNvZmYuaC4KLQkoZmlsbF9zZWN0aW9uKTogQ2FsbCBQUk9HUkVTUy4KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFUyk6IEFkZCBiZmQgc3JjZGlyLgotCi0JKiBtcHctY29uZmlnLmluOiBBZGQgYmZkX2dhcyBmbGFnIGFuZCBzZXQgZm9yIGVhY2ggY29uZmlnLgotCShpMzg2LXVua25vd24tZ28zMiwgbTY4ay11bmtub3duLWNvZmYpOiBSZWNvZ25pemUuCi0JKiBtcHctbWFrZS5pbiAoSEFDS19PX1JBTUEsIE9CSl9DT0ZGX09NSVRfVElNRVNUQU1QKTogQWRkIHRvCi0JY29uZmlnLmguCi0KLVRodSBKdW4gMTUgMTA6MDQ6MjYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5oIChMT0NBTF9MQUJFTCk6IFByZXBlbmQgJy4nIGlmIG5vdCBPQkpfQU9VVC4KLQkoRkFLRV9MQUJFTF9OQU1FKTogTGlrZXdpc2UuCi0KLU1vbiBKdW4gMTIgMjI6MjU6MzkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogQ2hlY2sgZm9yIGludmFsaWQgcmVnaXN0ZXIgaW4gc2luZ2xlCi0JcHJlY2lzaW9uIGZtcHlhZGQgYW5kIGZtcHlzdWIgaW5zdHJ1Y3Rpb25zLgotCi1UaHUgSnVuICA4IDE5OjMzOjAyIDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5jIChteW5hbWUpOiBEZWxldGUgYWxsIHJlZmVyZW5jZXMuCi0JKFZNU19zdGFiX3BhcnNlLCBXcml0ZV9WTVNfTUhEX1JlY29yZHMsIFZNU19DYXNlX0hhY2tfU3ltYm9sKToKLQlSZXBsYWNlIHByaW50ZiBjYWxscyB3aXRoIGFzX3Rza3Rzay4KLQkoUFVUX0xPTkcsIFBVVF9TSE9SVCk6IFVzZSBDT1BZX0xPTkcsIENPUFlfU0hPUlQuCi0JKFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSk6IE1vdmUgc2Vjb25kIGJ1ZmZlciBjYXBhY2l0eSBjaGVjawotCWJlbG93IGJvdHRvbSBvZiBsb29wOyBmaXJzdCBjaGVjayBhdCB0b3Agc3VmZmljZXMgZm9yIGxvb3AgaXRzZWxmLgotCShmaW5kX2ZpbGUpOiBSZW1vdmUgcmVkdW5kYW50IHBvaW50ZXIgY2hlY2tzIGluIGZpcnN0IHR3byBsb29wczsKLQlyZXBsYWNlIHRoaXJkIGxvb3Agd2l0aCBwb2ludGVyIHRvIGxhc3QgbGlzdCBlbGVtZW50IGRldGVybWluZWQKLQlpbiBmaXJzdCBsb29wLgotCi1UdWUgSnVuICA2IDEzOjUzOjA2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEhhbmRsZSBkZWZpbmVkIGFic29sdXRlIHN5bWJvbHMgYXMKLQlBU0kgdmFsdWVzLgotCi0JKiBjb25maWcvb2JqLXZtcy5jICh2bXNfd3JpdGVfb2JqZWN0X2ZpbGUsIGNhc2UgTl9EQVRBKTogVXNlCi0Jc3RyY21wIGFnYWluc3QgRkFLRV9MQUJFTF9OQU1FIGluc3RlYWQgb2YgY2hlY2tpbmcgdGhpcmQKLQljaGFyYWN0ZXIuICAoU3VnZ2VzdGVkIGJ5IFBhdCBSYW5raW4uKQotCi1Nb24gSnVuICA1IDIwOjEwOjQ2IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JQWRkIHN1cHBvcnQgZm9yIE5fQUJTIGFuZCBOX0FCU3xOX0VYVCB0eXBlIHN5bWJvbHMuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKExTWV9TX01fe0RFRixSRUx9LCBFTlZfU19NX3tERUYsTkVTVEVEfSk6Ci0JTmV3IG1hY3JvcyBmb3IgbG9jYWwgc3ltYm9scyAoZnJvbSA8bHN5ZGVmLmg+IGFuZCA8ZW52ZGVmLmg+KS4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKEN1cnJlbnRfRW52aXJvbm1lbnQpOiBOZXcgZmlsZS1zY29wZSB2YXJpYWJsZS4KLQkoVk1TX0xvY2FsX0Vudmlyb25tZW50X1NldHVwKTogTmV3IHJvdXRpbmUuCi0JKEdCTFNZTV9MQ0wpOiBOZXcgbWFjcm8uCi0JKFZNU19HbG9iYWxfU3ltYm9sX1NwZWMpOiBIYW5kbGUgbG9jYWwgc3ltYm9scyB0b28uCi0JKFZNU19Qc2VjdF9TcGVjKTogU2V0IEdMT0JBTFZBTFVFX0JJVCBmb3IgYWJzb2x1dGUgc3ltYm9scy4KLQkoVk1TX0VtaXRfR2xvYmFsdmFsdWVzKTogSGFuZGxlIGxvY2FsIGFuZCBnbG9iYWwgYWJzb2x1dGUgc3ltYm9scy4KLQkoVk1TX1N0b3JlX1BJQ19TeW1ib2xfUmVmZXJlbmNlKTogRGl0dG8uCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZTogR1NEIHN5bWJvbCBsb29wKTogRGl0dG8uCi0KLU1vbiBKdW4gIDUgMTY6MTA6NDAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5oIChMT0NBTF9MQUJFTFNfRkIpOiBEZWZpbmUuCi0KLU1vbiBKdW4gIDUgMDI6MTc6NTggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1nbnUqKTogQWx3YXlzIHVzZSBHTlUgRUxGIGNvbmZpZy4KLQotV2VkIE1heSAzMSAxNzo0OToxOCAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuYyAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IFVwZGF0ZSAqc3ltYm9sUFAKLQlpbiBgZWxzZScgY2xhdXNlIHdoZW4gcmVtb3ZpbmcgYSBzeW1ib2wuICBBbHNvLCByZXZpc2UgY29tbWVudHMKLQl0byBtYXRjaCB0aGUgY29kZS4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlIChHU0Qgc3ltYm9sIGxvb3AsIGNhc2UgTl9EQVRBKSk6IE5ldmVyCi0Jb3V0cHV0IHN5bWJvbCBkZWZpbml0aW9ucyBmb3IgbG9jYWwgbnVtZXJpYyBsYWJlbHMuCi0KLVR1ZSBNYXkgMzAgMTg6Mjk6MTAgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBjb25maWd1cmUuaW4gKGFyY2hpdGVjdHVyZSB2YXJpYW50cywgY2FzZXMgYXJtZWIgYW5kIGFybSopOiBSZW1vdmUKLQlzcGFjZXMgcm91bmQgYXNzaWdubWVudCB0byBlbmRpYW4uCi0KLVR1ZSBNYXkgMzAgMTI6MzE6MzEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDaGVjayBmb3IgdW5kZWZpbmVkIGxvY2FsIGRvbGxhcgotCWFuZCBmYiBsYWJlbHMuCi0KLQkqIHN5bWJvbHMuYyAoZGVjb2RlX2xvY2FsX2xhYmVsX25hbWUpOiBFeHRyYWN0IGluc3RhbmNlIG51bWJlcgotCWZyb20gdGhlIGNvcnJlY3QgbG9jYXRpb24uCi0KLVNhdCBNYXkgMjcgMjE6Mjg6NDkgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGUtZHB4Mi5oOiBJbmNsdWRlIG9iai1mb3JtYXQuaC4KLQkoQ09GRl9NQUdJQyk6IFJlbmFtZWQgZnJvbSBGSUxFX0hFQURFUl9NQUdJQy4KLQotV2VkIE1heSAyNCAxMzo0NTozMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbiwgY29uZmlnL29iai1jb2ZmLmMsIGNvbmZpZy9vYmotY29mZi5oOgotCUFkZCBzdXBwb3J0IGZvciBBUk0gcGUKLQotVHVlIE1heSAyMyAxNzowMDozMiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogSGFuZGxlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE2Ci0JYW5kIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5LgotCi1UdWUgTWF5IDIzIDE5OjE4OjMzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpIFshIFVTRV9FTVVMQVRJT05TXTogQWx3YXlzIHByaW50IGFuIGVycm9yCi0JbWVzc2FnZS4KLQotCSogZG9jL2ludGVybmFscy50ZXhpOiBEb2N1bWVudCBvYmpfYXBwX2ZpbGUgYW5kCi0JVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4uCi0KLU1vbiBNYXkgMjIgMjA6MDM6MjMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfc3RhYik6IEFkZCBleHRyYSBsZWFkaW5nIGFyZ3VtZW50LCBmb3IgNCBNYXkKLQljaGFuZ2UuCi0JKiBlY29mZi5oIChlY29mZl9zdGFiKTogRml4IGRlY2xhcmF0aW9uLgotCSogb2JqLmggKGZvcm1hdF9vcHMucHJvY2Vzc19zdGFiKTogSW5jbHVkZSBwcm90b3R5cGUuCi0JKiBjb25maWcvb2JqLWVsZi5oIChPQkpfUFJPQ0VTU19TVEFCKTogUGFzcyB0aHJvdWdoIHNlZyBhcmd1bWVudC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoT0JKX1BST0NFU1NfU1RBQik6IERpdHRvLgotCi0JKiBjb25maWcvZS1taXBzZWxmLmMgKG1pcHNlbGYpOiBOZXcgZW11bGF0aW9uIG1vZGUsIGRvZXNuJ3QgY2hhbmdlCi0JZW5kaWFubmVzcyBmcm9tIGNvbmZpZ3VyZWQgZGVmYXVsdC4KLQkqIGNvbmZpZy9lLW1pcHNlY29mZi5jIChtaXBzZWNvZmYpOiBEaXR0by4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyBlY29mZi9lbGYgdGFyZ2V0cyk6IEluY2x1ZGUgdGhlbS4KLQkqIGFzLmMgKG1pcHNlbGYsIG1pcHNlY29mZik6IERlY2xhcmUuCi0KLQkqIGFzLmMgKGVtdWxhdGlvbl9uYW1lKTogTmV3IHZhcmlhYmxlLgotCShzZWxlY3RfZW11bGF0aW9uX21vZGUpOiBTZXQgZW11bGF0aW9uX25hbWUuICBEb24ndCBjaGFuZ2UgYXJndi4KLQkocGFyc2VfYXJncyk6IEhhbmRsZSAtLWVtdWxhdGlvbjsgY29tcGxhaW4gaWYgdGhlIHN1cHBsaWVkIG5hbWUKLQlpc24ndCB3aGF0IHNlbGVjdF9lbXVsYXRpb25fbmFtZSBjYW1lIHVwIHdpdGguCi0KLVN1biBNYXkgMjEgMjE6MzY6MTcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IFJldmVyc2UgY2hhbmdlcyBmcm9tIERlYy4gMTl0aCB3aGljaAotCWNoYW5nZWQgdGhlIHdheSB1bndpbmRzIHdlcmUgYnVpbHQgZm9yIEVMRi4gIFJlbHkgb24gcmVsb2NhdGlvbgotCXN5bWJvbCByZWR1Y3Rpb25zIHRvIGF2b2lkIHBsYWNpbmcgdGhlIGVuZCBvZiBmdW5jdGlvbiBtYXJrZXIKLQlzeW1ib2xzIGludG8gdGhlIG9iamVjdCBmaWxlJ3Mgc3ltYm9sIHRhYmxlLgotCi1TYXQgTWF5IDIwIDEyOjMxOjM2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCUFkZGVkIGltcHJvdmVkIFZNUyBzdXBwb3J0IGZyb20gUGF0IFJhbmtpbjoKLQotCUZyaSAxOSBNYXkgMTY6NTE6NDAgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKEFPVVRfU1RBQlMpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKGZwdXNoLCBycHVzaCk6IE5ldyByb3V0aW5lcy4KLQkocHVzaCk6IFJlcGxhY2VkIGJ5IHRoZSBhYm92ZS4KLQkoZmluZF9zeW1ib2wpOiBTbGlnaHQgcmVvcmdhbml6YXRpb24gdG8gZXhwb3NlIHRhaWwgcmVjdXJzaW9uLgotCi0JRnJpIE1hciAxNyAxODo0MDozNiAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogTWFrZWZpbGUuaW4gKFZNU19PVEhFUl9PQkpTKTogIGRlbGV0ZSB0aGlzLgotCSogdm1zY29uZi5zaCAobWFrZS1nYXMuY29tKTogIGJ1aWxkIC4uL2xpYmliZXJ0eS9saWJlcnR5Lm9sYgotCWZpcnN0IGlmIG5lY2Vzc2FyeTsgbGluayBnYXMgYWdhaW5zdCBpdC4KLQotRnJpIE1heSAxOSAxNjozNzozOSAxOTk1ICBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIGdhc3AuYyAoaXN0cnVlKTogQ29ycmVjdGx5IHRlc3QgZm9yIHN0cmluZyBpbmVxdWFsaXR5LgotCi1UaHUgTWF5IDE4IDA0OjI1OjExIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCVdlZCBNYXkgMTAgMTQ6Mjg6MTYgMTk5NSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoQ1BfVF97UHJlLFVELFdCfSk6IERlZmluZSwgYml0cyBpbiBjby1wcm9jZXNzb3IKLQlpbnN0cnVjdGlvbnMuCi0JKFtsc11mbV9mbGFncyk6IENvcnJlY3QgZXJyb3IgaW4gYml0bWFza3MuCi0JKGNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZSk6IERlbGV0ZSBzZWNvbmQgcGFyYW1ldGVyLCBGTEFHUy4gIEFsbAotCWNhbGxlcnMgY2hhbmdlZC4gIFJlbW92ZSBhbGwgZGVhZCBjb2RlIHJlZmVycmluZyB0byBGTEFHUy4gIElmCi0JYWRkcmVzcyBpcyBqdXN0ICJbUmVnXSIgdGhlbiBjb252ZXJ0IGludG8gYSBQUkUtSU5DUkVNRU5UIFVQIGZvcm1hdC4KLQkoZG9fZnBfbGRtc3RtKTogSGFuZGxlIGZ1bGwtZGVzY2VuZGluZyBhbmQgZW1wdHktYXNjZW5kaW5nIHN0YWNrCi0JZm9ybWF0cyBleHBsaWNpdGx5LgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGludGVybmFsRXJyb3IpOiBEZWZpbmUuCi0JKEFSTV97MSwyLDI1MCwzLDYsNyw3RE0sQU5ZLDJVUCxBTEwsM1VQLDZVUCxMT05HTVVMfSk6IERlZmluZSBwcm9jZXNzb3IKLQl2YXJpYW50cy4KLQkoRlBVX3tDT1JFLEZQQTEwLEZQQTExLE5PTkUsQUxMLE1FTU1VTFRJfSk6IERlZmluZSBmbG9hdGluZyBwb2ludAotCXZhcmlhbnRzLgotCSh7Q1BVLEZQVX1fREVGQVVMVCk6IERlZmluZS4KLQkoY3B1X3ZhcmlhbnQpOiBOZXcgdmFyaWFibGUuCi0JKGFzbV9mbGcpOiBDaGFuZ2UgbW9yZV9mbGFncyB0byBmbGFnX2JpdHMuCi0JQWRkIHByb3RvdHlwZXMgZm9yIG5ldyBmdW5jdGlvbnMuCi0JKEZMQUdfe1MsUCxCLFQsRUQsRkQsRkEsRUEsSUIsSUEsREIsREEsTH0pOiBEZWxldGUuCi0JKHNfZmxhZ1tdLCBsZHN0X2ZsYWdzW10sIGJ5dGVfZmxhZ1tdLCBjbXBfZmxhZ3NbXSwgbGRtX2ZsYWdzW10sCi0JIHN0bV9mbGFnc1tdLCBsZm1fZmxhZ3NbXSwgc2ZtX2ZsYWdzW10sIHJvdW5kX2ZsYWdzW10sIGV4Y2VwdF9mbGFnc1tdLAotCSBjcGxvbmdfZmxhZ1tdKTogTmV3IHZhcmlhYmxlcy4KLQkoYXNtX29wY29kZSwgaW5zbnNbXSk6IE5ldyBmb3JtYXQsIGFkZCB2ZXJzaW9uIHN1cHBvcnQuCi0JKGFybV9mbGdfaHNoKTogRGVsZXRlLgotCShkb19tdWwsIGRvX21sYSk6IFJlbW92ZSAiV2FybmluZyIgZnJvbSB3YXJuaW5nIG1lc3NhZ2VzLgotCShkb19hcml0KTogU2ltcGxpZnkuCi0JKGRvX3N3YXApOiBNYWtlIGVycm9yIG1lc3NhZ2UgbW9yZSBhcHByb3ByaWF0ZS4KLQkobWRfYmVnaW4pOiBCdWlsZCBoYXNoIHRhYmxlcyBzdGFydGluZyBhdCBmaXJzdCBlbnRyeSBpbiB0YWJsZXMuCi0JKG1kX251bWJlcl90b19jaGFycyk6IENvcGUgd2l0aCBiaWcvbGl0dGxlLWVuZGlhbiBzZWxlY3Rpb24uCi0JKG1kX2NoYXJzX3RvX251bWJlcik6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXBwbHlfZml4KTogUmV3cml0ZSB0byBtYWtlIGVuZGlhbiBpbmRlcGVuZGVudC4KLQkodGNfZ2VuX3JlbG9jKTogQmV0dGVyIGVycm9yIG1lc3NhZ2VzLgotCShtZF9hc3NlbWJsZSk6IFJlamVjdCBvcGNvZGVzIGZvcmJpZGRlbiBieSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNwdQotCXZhcmlhbnQuICBSZXdyaXRlIGhhbmRsaW5nIGNvZGUgZm9yIGluc3RydWN0aW9uIGZsYWdzLgotCShtZF9zaG9ydG9wdHMpOiBBZGQgb3B0aW9uICJtOiIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEdldCB0aGUgZGVzaXJlZCBjcHUvZnB1IHZhcmlhbnQuCi0KLQlGcm9tOiBEYXZpZCBUYXlsb3IgKGR0YXlsb3JAYXJtbHRkLmNvLnVrKQotCSogY29uZmlndXJlLmluIChhcmNoaXRlY3R1cmUgdmFyaWFudHMpOiBDaGVjayBmb3IgImFybWViIiBhbmQgImFybSoiLAotCXNldCBlbmRpYW5uZXNzIGFjY29yZGluZ2x5LgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBOZXcgaG9va3MgbWRfc3RhcnRfbGluZV9ob29rIGFuZAotCW1kX2FmdGVyX3Bhc3NfaG9vay4KLQkqIGNvbmZpZy9hcm0te2JpZyxsaXR9Lm10OiBOZXcgZmlsZXMKLQkqIGNvbmZpZy90Yy1hcm0uaCAoe0xJVFRMRSxCSUd9X0VORElBTiwgQllURV9PUkRFUik6IERlZmluZS4KLQkoVEFSR0VUX0ZPUk1BVCk6IFNlbGVjdCBkZXBlbmRpbmcgb24gZW5kaWFubmVzcyBhbmQgZW11bGF0aW9uIGFuZAotCW9iamVjdCBmb3JtYXQuCi0JKG1kX2FmdGVyX3Bhc3NfaG9vaywgbWRfc3RhcnRfbGluZV9ob29rKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWFybS5jOiBJbmNsdWRlIHN1YnNlZ3MuaCwgc3ltYm9scy5oIGFuZCBsaXN0aW5nLmguCi0JKHNoaWZ0W10pOiBBZGQgdXBwcGVyIGNhc2UgZXF1aXZhbGVudHMuCi0JKENQX1RfW1hZXSwgVFJBTlNfQklUKTogRGVmaW5lLgotCShjb25kc1tdKTogRGVsZXRlIGluaXRpYWwgTlVMTCBlbnRyeSwgYWRkICJsbyIgZW50cnkgYXMgc3lub255bSBmb3IKLQkiY2MiLgotCShMT05HRVNUX0ZMQUcsIGZsYWdzW10pOiBEZWxldGUuCi0JKGFybV9wc3IpOiBOZXcgc3RydWN0dXJlLgotCShwc3JzW10pOiBOZXcgdmFyaWFibGUuCi0JKFBTUl9BTEwpOiBEZWZpbmUuCi0JKExPTkdFU1RfSU5TVCk6IEJ1bXAgdG8gNS4KLQkoTElURVJBTF9NQVNLLCBDT05EX01BU0ssIE9QQ09ERV9NQVNLLCBEQVRBX09QX1NISUZUKTogRGVmaW5lLgotCShPUENPREVfe0FORCxFT1IsU1VCLFJTQixBREQsQURDLFNCQyxSU0MsVFNULFRFUSxDTVAsQ01OLE9SUixNT1YsQklDLAotCSBNVk59KTogRGVmaW5lLgotCShpbnNuc1tdKTogQWRkIHNtdWxsLCB1bXVsbCwgc21sYWwsIHVtbGFsLCBsZGZtLCBzdGZtLCBtc3IgYW5kIG1ycwotCWluc3RydWN0aW9ucy4gIEFkZCBub3AgYW5kIGFkciBwc2V1ZG8gb3BzLgotCShyZWdfdGFibGUpOiBBZGQgQVBDUyByZWdpc3RlciBuYW1lIHZhcmlhbnRzLgotCShhcm1fcHNyX2hzaCk6IE5ldyBoYXNoIHRhYmxlLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImx0b3JnIiwgInBvb2wiLCAiZXh0ZW5kIiwgImxkb3VibGUiIGFuZAotCSJwYWNrZWQiLgotCShNQVhfTElURVJBTF9QT09MX1NJWkUpOiBEZWZpbmUuCi0JKHN0cnVjdCBsaXRlcmFsUyk6IE5ldyBzdHJ1Y3R1cmUuCi0JKGxpdGVyYWxzLCBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSwgbGl0X3Bvb2xfbnVtLCBjdXJyZW50X3Bvb2xQKTogTmV3Ci0JdmFyaWFibGVzLgotCShhZGRfdG9fbGl0X3Bvb2wsIHN5bWJvbF9sb2NhdGUsIHN5bWJvbF9tYWtlX2VtcHR5KTogTmV3IGZ1bmN0aW9ucy4KLQkodmFsaWRhdGVfaW1tZWRpYXRlKTogUmV0dXJuIEZBSUwgb24gZmFpbHVyZS4KLQkoc19sdG9yZyk6IE5ldyBmdW5jdGlvbi4KLQkocHNyX3JlcXVpcmVkX2hlcmUsIHBzcmZfcmVxdWlyZWRfaGVyZSk6IE5ldyBmdW5jdGlvbnMuCi0JKGNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZSk6IE5ldyBwYXJhbWV0ZXIsIGZsYWcsIGFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JSWYgZmxhZyBpcyBub24temVybywgcmVzdHJpY3QgdGhlIGxlZ2FsIGFkZHJlc3NpbmcgbW9kZXMuCi0JKGRvX25vcCwgZG9fbXJzLCBkb19tc3IsIGRvX211bGwpOiBOZXcgZnVuY3Rpb25zLgotCShuZWdhdGVfZGF0YV9vcCk6IE5ldyBmdW5jdGlvbi4KLQkoZGF0YV9vcDIpOiBhY2NlcHQgI3gseSBtZWFuaW5nIHggcm90YXRlZCByaWdodCBieSB5LCBidXQgb25seSB3aGVuCi0Jc3VpdGFibGUgY29uc3RhbnRzLiAgSWYgaW1tZWRpYXRlIGlzIG5vdCBsZWdhbCwgdHJ5IGNoYW5naW5nIHRoZQotCW9wY29kZS4KLQkoZG9fYWRyKTogTmV3IGZ1bmN0aW9uLgotCShkb19sZHN0KTogYWNjZXB0ICJsZHIgcmVnLCA9ZXhwciIuICBQdXQgZXhwciBpbiB0aGUgcG9vbCBpZiBpdCBjYW4ndAotCWJlIGRvbmUgYXMgYW4gaW1tZWRpYXRlLgotCShkb19mcF9sZHN0KTogVXNlIENQX1RfW1hZXSwgbm90IGltbWVkaWF0ZSB2YWx1ZXMuCi0JKGRvX2ZwX2xkbXN0bSk6IE5ldyBmdW5jdGlvbi4KLQkoYXJtX3Bzcl9wYXJzZSk6IE5ldyBmdW5jdGlvbi4KLQkob3V0cHV0X2luc3QpOiBVc2UgSU5TTl9TSVpFIGluIGNhbGwgdG8gbWRfbnVtYmVyX3RvX2NoYXJzLgotCShtZF9hc3NlbWJsZSk6IEFkZCBoYWNrIHNvIHRoYXQgIkxhYmVsIGluc3RydWN0aW9uIiBjYXVzZXMgYWxpZ25tZW50IG9mCi0JdGhlIGxhYmVsLgotCShhcm1fYWZ0ZXJfcGFzc19ob29rLCBhcm1fc3RhcnRfbGluZV9ob29rLCBhcm1fZnJvYl9zeW1ib2wpOiBOZXcKLQlmdW5jdGlvbnMuCi0KLVdlZCBNYXkgMTcgMDU6MjU6MTYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3Nob3dfdXNhZ2UpOiBBZGQgXCdzIGF0IGVuZCBvZiBsaW5lcyBpbgotCXN0cmluZ3MgZm9yIG5vbi1HQ0MgY29tcGlsZXJzLgotCi1UdWUgTWF5IDE2IDE5OjM2OjAwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfcG9wX2luc2VydCk6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfZm9ybWF0X29wcyk6IFVzZSBpdC4KLQkob2JqX2Vjb2ZmX2Zyb2Jfc3ltYm9sKTogTm93IHN0YXRpYy4KLQotV2VkIE1heSAxNyAwMDo1OToxMiAxOTk1ICBBbmRyZXcgQ2FnbmV5IC0gYWthIE5vaWQgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2JlZ2luKTogV2FzIGFzc3VtaW5nIHRoYXQgYW4gaW5zdHJ1Y3Rpb24gd2FzCi0JYmlnZW5kaWFuIGFuZCBoZW5jZSAxNmJpdCByZWxvY3Mgd2l0aGluZyBpbnN0cnVjdGlvbnMgd291bGQKLQlBTFdBWVMgYmUgYXQgYWRkcmVzc2VzIGkrMi1pKzMuICBJbiBMRSBtb2RlIGl0IGlzIGkrMC1pKzEuCi0KLVR1ZSBNYXkgMTYgMTY6Mjk6NTggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1tdWx0aS5oIChvYmpfZnJvYl9zeW1ib2wsIG9ial9mcm9iX2ZpbGUsIFNfR0VUX1NJWkUsCi0JU19TRVRfU0laRSwgU19HRVRfQUxJR04sIFNfU0VUX0FMSUdOLCBvYmpfY29weV9zeW1ib2xfYXR0cmlidXRlcywKLQlPQkpfUFJPQ0VTU19TVEFCKTogTmV3IG1hY3Jvcy4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFByb3RlY3QgYWdhaW5zdCByZWRlZmluaW5nIHRoZW0gYWxzbyB3aGVuCi0JaW5jbHVkaW5nIG9iai1lbGYuaC4gIFRlc3Qgb25seSBPQkpfRUxGIGZvciBpbmNsdWRpbmcgZWxmL21pcHMuaC4KLQkobWlwc19pbml0X2FmdGVyX2FyZ3MpOiBOZXcgZnVuY3Rpb24uICBTZXQgYnl0ZV9vcmRlciBoZXJlLgotCShtZF9wYXJzZV9vcHRpb24pOiBOb3QgaGVyZS4KLQkoYnl0ZV9vcmRlcik6IERvbid0IGJvdGhlciBpbml0aWFsaXppbmcuCi0JKiBjb25maWcvdGMtbWlwcy5oIChtaXBzX2luaXRfYWZ0ZXJfYXJncyk6IERlY2xhcmUuCi0JKHRjX2luaXRfYWZ0ZXJfYXJncyk6IE5ldyBtYWNyby4KLQotCSogcmVhZC5jIChzX2xjb21tKTogRG8gRUxGL0VDT0ZGIHRlc3QgYXQgcnVuIHRpbWUsIG5vdCBjb21waWxlCi0JdGltZS4KLQotRnJpIE1heSAxMiAxNDoxNzo0NyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JSW5pdGlhbCBzdXBwb3J0IGZvciBQRSBvYmplY3QgZmlsZXMuCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZSAoaTM4Ni0qLXBlLCBpMzg2LSotKm50KTogQWRkLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBDb3BlIHdpdGggUEUgd2llcmRuZXNzLgotCSogY29uZmlnL29iai1jb2ZmLmggKFRFX1BFKTogTmV3IHRhcmdldCBmb3JtYXQuCi0KLVRodSBNYXkgMTEgMTQ6NTg6MjEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoTkVFRF9FQ09GRl9ERUJVRyk6IERlZmluZSBpZiBFQ09GRl9ERUJVR0dJTkcKLQl3YXMgZGVmaW5lZCBieSBoZWFkZXIgZmlsZXMuICBUZXN0IGluIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMKLQlpbnN0ZWFkIG9mIEVDT0ZGX0RFQlVHR0lORy4KLQkoZWNvZmZfZGVidWdfcHNldWRvX3RhYmxlKTogTWFrZSBlbXB0eSBpZiBORUVEX0VDT0ZGX0RFQlVHIGlzIG5vdAotCWRlZmluZWQuCi0JKG9ial9yZWFkX2JlZ2luX2hvb2ssIG9ial9zeW1ib2xfbmV3X2hvb2ssIGVsZl9mcm9iX3N5bWJvbCwKLQllbGZfZnJvYl9maWxlKTogT25seSBjYWxsIGVjb2ZmIHJvdXRpbmVzIGlmIE5FRURfRUNPRkZfREVCVUcgaXMKLQlkZWZpbmVkLgotCShlbGZfZWNvZmZfc2V0X2V4dCwgZWxmX2dldF9leHRyLCBlbGZfc2V0X2luZGV4KTogRGVmaW5lIG9ubHkgaWYKLQlORUVEX0VDT0ZGX0RFQlVHIGlzIGRlZmluZWQuCi0JKGVsZl9mb3JtYXRfb3BzKTogUmVmZXJlbmNlIGVsZl9lY29mZl9zZXRfZXh0IG9ubHkgaWYKLQlORUVEX0VDT0ZGX0RFQlVHLgotCi1XZWQgTWF5IDEwIDE4OjA5OjEyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChPQkpTKTogSW5jbHVkZSBAZXh0cmFfb2JqZWN0c0AuCi0JKG9iai1lbGYubywgb2JqLWVjb2ZmLm8sIGUtbWlwc2VsZi5vLCBlLW1pcHNlY29mZi5vKTogTmV3IHJ1bGVzCi0JZm9yIGJ1aWxkaW5nIHRoZXNlIGluZGVwZW5kZW50bHkuCi0JKiBlbXVsLXRhcmdldC5oLCBjb25maWcvZS1taXBzZWxmLmMsIGNvbmZpZy9lLW1pcHNlY29mZi5jOiBOZXcKLQlmaWxlcy4KLQotCSogYWNjb25maWcuaCAoREVGQVVMVF9FTVVMQVRJT04sIEVNVUxBVElPTlMsIFVTRV9FTVVMQVRJT05TLAotCU9CSl9NQVlCRV8qLCBJMzg2Q09GRiwgTTY4S0NPRkYsIE04OEtDT0ZGKTogTmV3IG1hY3Jvcy4KLQkqIGFjbG9jYWwubTQgKEdBU19VTklRKTogTmV3IG1hY3JvLgotCi0JKiBhcy5jIChlbXVsYXRpb25zLCBuX2VtdWxhdGlvbnMpIFtVU0VfRU1VTEFUSU9OU106IE5ldyB2YXJpYWJsZS4KLQkoc2VsZWN0X2VtdWxhdGlvbl9tb2RlLCBkZWZhdWx0X2VtdWxfYmZkX25hbWUsIGNvbW1vbl9lbXVsX2luaXQpCi0JW1VTRV9FTVVMQVRJT05TXTogTmV3IGZ1bmN0aW9ucy4KLQkobWFpbikgW1VTRV9FTVVMQVRJT05TXTogQ2FsbCBzZWxlY3RfZW11bGF0aW9uX21vZGUgYmVmb3JlIG90aGVyCi0JaW5pdGlhbGl6YXRpb24uCi0JKiBlbXVsLmg6IE5ldyBmaWxlLgotCSogYXMuaCBbVVNFX0VNVUxBVElPTlNdOiBJbmNsdWRlIGl0LgotCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBlbmFibGUtdGFyZ2V0cyBvcHRpb24uICBJdGVyYXRlIG92ZXIgdGFyZ2V0Ci0JbGlzdCwgYnVpbGRpbmcgdXAgYSBsaXN0IG9mIG9iamVjdCBmaWxlIGZvcm1hdHMgYW5kIGVtdWxhdGlvbgotCWNvbmZpZ3VyYXRpb25zLiAgKE9ubHkgc3VwcG9ydHMgZW11bGF0aW9ucyBmb3IgTUlQUyBDUFUgc28gZmFyLikKLQlJZiBtdWx0aXBsZSBmb3JtYXRzIGFyZSBuZWVkZWQsIHNldCBvYmpfZm9ybWF0IHRvIG11bHRpIGFuZCBhZGQKLQlmb3JtYXQgY29uZmlnIGZpbGVzIHRvIGV4dHJhX2ZpbGVzLiAgSWYgZW11bGF0aW9uIG1vZGVzIGFyZQotCW5lZWRlZCwgYWRkIHRoZSByZWxldmFudCBmaWxlcyB0byBleHRyYV9maWxlcy4KLQotCSogY29uZmlndXJlLmluOiBEZWZpbmUgSTM4NkNPRkYsIE02OEtDT0ZGLCBNODhLQ09GRiBmb3IgdGhvc2UKLQljb25maWd1cmF0aW9ucy4KLQotCSogZWNvZmYuYyAoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IEZpbGVuYW1lIGFyZ3VtZW50IG5vdwotCXBvaW50cyB0byBjb25zdC4KLQkqIGVjb2ZmLmggKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBVcGRhdGVkIGRlY2xhcmF0aW9uLgotCi0JKiBvYmouaCAob2JqX3JlYWRfYmVnaW5faG9vayk6IERvbid0IGRlY2xhcmUgZnVuY3Rpb24gaWYgaXQncwotCWFscmVhZHkgYSBtYWNyby4KLQotCSogcmVhZC5jIChzX3NwYWNlLCBjb25zLCBzdHJpbmdlcik6IElmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IGlzCi0JZGVmaW5lZCwgY2FsbCBpdCBvbiBlbnRyeS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IElmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0JaXMgZGVmaW5lZCwgY2FsbCBpdCBvbiBlbnRyeS4gIElmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rIGlzCi0JZGVmaW5lZCwgY2FsbCBpdCBiZWZvcmUgcmV0dXJuaW5nIG5vcm1hbGx5LgotCi0JKiByZWFkLmggKHRhcmdldF9iaWdfZW5kaWFuKTogRGVjbGFyZS4KLQotCSogb2JqLmggKHN0cnVjdCBmb3JtYXRfb3BzKTogQWRkZWQgbmV3IGZ1bmN0aW9uIHBvaW50ZXIgZmllbGRzCi0JZWNvZmZfc2V0X2V4dCwgcmVhZF9iZWdpbl9ob29rLCBzeW1ib2xfbmV3X2hvb2suCi0JKGVjb2ZmX2Zvcm1hdF9vcHMsIGVsZl9mb3JtYXRfb3BzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9zX2dldF9zaXplLCBlbGZfc19zZXRfc2l6ZSwKLQllbGZfc19nZXRfYWxpZ24sIGVsZl9zX3NldF9hbGlnbiwgZWxmX2NvcHlfc3ltYm9sX2F0dHJpYnV0ZXMsCi0JZWxmX3NlY19zeW1fb2tfZm9yX3JlbG9jKTogTmV3IGZ1bmN0aW9ucy4KLQkoZWxmX2Zvcm1hdF9vcHMpOiBOZXcgdmFyaWFibGUuCi0JKGVsZl9mcm9iX3N5bWJvbCk6IE5vdyB0YWtlcyBhZGRpdGlvbmFsIGludCogYXJndW1lbnQuCi0JKiBjb25maWcvb2JqLWVsZi5oIChlbGZfZnJvYl9zeW1ib2wpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGVsZl9wb3BfaW5zZXJ0KTogRGVjbGFyZS4KLQkob2JqX3BvcF9pbnNlcnQpOiBEZWZpbmUgdG8gY2FsbCBlbGZfcG9wX2luc2VydC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MsCi0Jb2JqX2Vjb2ZmX2Zyb2Jfc3ltYm9sKTogTmV3IGZ1bmN0aW9ucy4KLQkoZWNvZmZfZm9ybWF0X29wcyk6IE5ldyB2YXJpYWJsZS4KLQotCSogY29uZmlnL3RlLWdlbmVyaWMuaDogSWYgT0JKX0hFQURFUiBpcyBkZWZpbmVkLCB1c2UgaXQgYXMgdGhlCi0JZmlsZW5hbWUgdG8gaW5jbHVkZSBpbiBwbGFjZSBvZiBvYmotZm9ybWF0LmguCi0JKiBjb25maWcvdGUtbXVsdGkuaDogTmV3IGZpbGUsIGNvcGllZCBmcm9tIHRlLWdlbmVyaWMuaC4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKE9CSl9IRUFERVIpOiBEZWZpbmUgaXQgdG8gIm9iai1lbGYuaCIuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKE9CSl9IRUFERVIpOiBEZWZpbmUgaXQgdG8gIm9iai1lY29mZi5oIi4KLQotCSogY29uZmlnL29iai1lbGYuYyAoRUNPRkZfREVCVUdHSU5HKTogRGVmYXVsdCB0byAwLgotCShvYmpfcmVhZF9iZWdpbl9ob29rLCBvYmpfc3ltYm9sX25ld19ob29rLCBlbGZfZnJvYl9zeW1ib2wsCi0JZWxmX2Zyb2JfZmlsZSk6IFRlc3QgaXQgYXQgcnVuIHRpbWUuCi0JKG9ial9lY29mZl9zZXRfZXh0LCBlbGZfZ2V0X2V4dHIsIGVsZl9zZXRfaW5kZXgpOiBEZWZpbmUKLQl1bmNvbmRpdGlvbmFsbHkuCi0JKGVsZl9wc2V1ZG9fdGFibGUpOiBSZW5hbWVkIGZyb20gb2JqX3BzZXVkb190YWJsZSwgbm93IHN0YXRpYy4KLQkoZWNvZmZfZGVidWdfcHNldWRvX3RhYmxlKTogU3BsaXQgb2ZmIGludG8gc2VwYXJhdGUgdGFibGUuICBEZWZpbmUKLQlpdCB1bmNvbmRpdGlvbmFsbHkuCi0JKGVsZl9wb3BfaW5zZXJ0KTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1lbGYuaCAoZWxmX3BvcF9pbnNlcnQpOiBEZWNsYXJlLgotCShvYmpfcG9wX2luc2VydCk6IE5ldyBtYWNyby4KLQkob2JqX2Vjb2ZmX3NldF9leHQpIFshT0JKX01BWUJFX0VMRl06IERlZmluZSB0byBlbGZfZWNvZmZfc2V0X2V4dC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAob2JqX2Vjb2ZmX3NldF9leHQpOiBEZWZpbmUgdG8gZWNvZmZfc2V0X2V4dC4KLQotCSogY29uZmlnL3RjLW1pcHMuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbnMuCi0JKG1pcHNfcG9wX2luc2VydCk6IERlY2xhcmUuCi0JKG1kX3BvcF9pbnNlcnQpOiBDYWxsIGl0LgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBJZiBPQkpfTUFZQkVfRUxGIGlzIGRlZmluZWQsIGluY2x1ZGUKLQlvYmotZWxmLmgsIGJ1dCBwcmVzZXJ2ZSBPVVRQVVRfRkxBVk9SIGFuZCBwcm90ZWN0IHNvbWUgb3RoZXIKLQltYWNyb3MgZnJvbSByZWRlZmluaXRpb24uCi0JKEVDT0ZGX0RFQlVHR0lORyk6IERlZmF1bHQgdG8gMC4gIEFsbCByZWZlcmVuY2VzIGNoYW5nZWQgdG8KLQlydW4tdGltZSB0ZXN0cyBvciBtYWRlIHVuY29uZGl0aW9uYWwuCi0JKHNfc3RyaW5nZXIsIHNfbWlwc19zcGFjZSwgc19lbGZfc2VjdGlvbik6IERlbGV0ZWQuCi0JKG1kX3BzZXVkb190YWJsZSk6IERvbid0IHJlZmVyIHRvIHRoZW0uICBTcGxpdCB0YWJsZSBpbnRvIHRocmVlCi0Jc2VjdGlvbnMsIGZvciBNSVBTLCBub24tRUNPRkZfREVCVUdHSU5HLCBhbmQgRUxGLgotCShtaXBzX3BvcF9pbnNlcnQpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZW5hYmxlX2F1dG9fYWxpZ24pOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtbWlwcy5oIChtaXBzX3BvcF9pbnNlcnQpOiBEZWNsYXJlLgotCShtZF9wb3BfaW5zZXJ0KTogTmV3IG1hY3JvLgotCShtaXBzX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogRGVjbGFyZS4KLQkobWRfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBOZXcgbWFjcm8uCi0JKG1pcHNfZW5hYmxlX2F1dG9fYWxpZ24pOiBEZWNsYXJlLgotCShtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayk6IE5ldyBtYWNybywgY2FsbHMKLQltaXBzX2VuYWJsZV9hdXRvX2FsaWduLgotCi1UdWUgTWF5ICA5IDE3OjA3OjQxIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbGl0dGxlIGVuZGlhbiBQb3dlclBDIHN1cHBvcnQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZi4KLQkqIGNvbmZpZy9wcGMtYmlnLm10OiBOZXcgZmlsZSBmb3IgYmlnIGVuZGlhbiBQb3dlclBDIHN5c3RlbXMuCi0JKiBjb25maWcvcHBjLWxpdC5tdDogTmV3IGZpbGUgZm9yIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBzeXN0ZW1zLgotCi0JKiBjb25maWcvdGMtcHBjLmggKHRhcmdldF9iaWdfZW5kaWFuKTogRGVjbGFyZS4KLQkoVEFSR0VUX0ZPUk1BVCk6IERlYWwgd2l0aCBsaXR0bGUgYW5kIGJpZyBlbmRpYW4gRUxGIHZhcmlhbnRzLgotCShUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZSBhcyAxLCBub3QgZW1wdHkuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2JpZ19lbmRpYW4pOiBEZWxldGUgdmFyaWFibGUsIHVzZQotCXRhcmdldF9iaWdfZW5kaWFuIGluc3RlYWQuCi0JKG1kX3BhcnNlX29wdGlvbik6IFBhcnNlIC1tbGl0dGxlIGFuZCAtbWxpdHRsZS1lbmRpYW4gdG8gdXNlCi0JbGl0dGxlIGVuZGlhbiBzdXBwb3J0LiAgUGFyc2UgLW1iaWcgYW5kIC1tYmlnLWVuZGlhbiB0byB1c2UgYmlnCi0JZW5kaWFuIHN1cHBvcnQuCi0JKG1kX3Nob3dfdXNhZ2UpOiBVcGRhdGUgdG8gcmVmbGVjdCBjdXJyZW50IHN3aXRjaGVzLgotCShwcGNfc2V0X2NwdSk6IFJlY29nbml6ZSBwb3dlcnBjbGUgYXMgbGl0dGxlIGVuZGlhbiBQb3dlclBDLiAgVXNlCi0JYXNfZmF0YWwsIG5vdCBhYm9ydCBpZiB1bmtub3duIG1hY2hpbmUuCi0KLVR1ZSBNYXkgIDkgMTA6NTg6NDEgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IENhc3QgKnZhbHAgdG8gYW4gaW50ZWdlciB3aGVuCi0JY29tcGFyaW5nIGFnYWluc3Qgc2lnbmVkIHZhbHVlcy4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogTWFrZSAiZGlzdGFuY2UiIGFuIGludGVnZXIuCi0KLVR1ZSBNYXkgIDkgMDA6NDc6MDMgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIG9iai5oIChzdHJ1Y3QgZm9ybWF0X29wcykgW0JGRF9BU1NFTUJMRVJdOiBOZXcgdHlwZS4KLQkodGhpc19mb3JtYXQpIFtCRkRfQVNTRU1CTEVSXTogRGVjbGFyZSBuZXcgdmFyaWFibGUsIGlmIG5vdAotCWFscmVhZHkgZGVmaW5lZCBhcyBhIG1hY3JvLgotCi1Nb24gTWF5ICA4IDIxOjQ0OjEzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuaCAoc2VnX2luZm8pOiBQcm92aWRlIGR1bW15IHZlcnNpb24gZm9yCi0Jbm9uLUJGRF9BU1NFTUJMRVIsIG5vbi1NQU5ZX1NFR01FTlRTIGNvbmZpZ3VyYXRpb24uICBJdCBzaG91bGQKLQluZXZlciBnZXQgaW52b2tlZCwgYnV0IHRoaXMgaXMgZWFzaWVyIHRoYW4gY29uZGl0aW9uYWxpemluZyBzb21lCi0Jb2YgdGhlIHVzZXMuCi0JKHN0cnVjdCBzZWdfaW5mb190cmFzaCk6IER1bW15IHR5cGUgdXNlZCBieSBhYm92ZSB0byBtYWtlIGNvZGUKLQljb21waWxlLgotCi1GcmkgTWF5ICA1IDE0OjQ3OjEzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogRGVmaW5lIHRvIDEsIG5vdAotCWVtcHR5LgotCSogY29uZmlnL29iai1lbGYuaCAoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyk6IERpdHRvLgotCSogY29uZmlnL29iai1zb20uaCAoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyk6IERpdHRvLgotCi1UaHUgTWF5ICA0IDE5OjI2OjU1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBBbHdheXMgZGVmaW5lLiAgSWYKLQlTRVBBUkFURV9TVEFCX1NFQ1RJT05TIGlzbid0IHNldCwgYWJvcnQuCi0JKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBEZWZhdWx0IHRvIHplcm8uCi0JKGFvdXRfcHJvY2Vzc19zdGFiKTogTmV3IGZ1bmN0aW9uLCBzcGxpdCBvdXQgZnJvbSBzX3N0YWJfZ2VuZXJpYy4KLQkoT0JKX1BST0NFU1NfU1RBQikgW0FPVVRfU1RBQlNdOiBEZWZpbmUgdG8gY2FsbCBhb3V0X3Byb2Nlc3Nfc3RhYiwKLQlpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCShzX3N0YWJfZ2VuZXJpYyk6IFRlc3QgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyBhdCBydW4gdGltZS4gIElmCi0JaXQncyBub3Qgc2V0LCBhbmQgT0JKX1BST0NFU1NfU1RBQiBpc24ndCBkZWZpbmVkLCBhYm9ydC4gIEFsd2F5cwotCXBhc3Mgc2l4IGFyZ3VtZW50cyB0byBPQkpfUFJPQ0VTU19TVEFCLgotCSogcmVhZC5oIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogRGVjbGFyZSB1bmNvbmRpdGlvbmFsbHkuCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoQU9VVF9TVEFCUyk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotYm91dC5oIChBT1VUX1NUQUJTKTogRGVmaW5lLgotCSogY29uZmlnL29iai1lY29mZi5oIChPQkpfUFJPQ0VTU19TVEFCKTogQWRkIG5ldyBmaXJzdCBhcmd1bWVudCwKLQlpZ25vcmVkLgotCSogY29uZmlnL29iai1lbGYuaCAoT0JKX1BST0NFU1NfU1RBQikgW0VDT0ZGX0RFQlVHR0lOR106IERpdHRvLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKEVDT0ZGX0RFQlVHR0lORyk6IERlZmluZSB0byAxLCBub3QgZW1wdHkuCi0JKiBjb25maWcvb2JqLWVsZi5oIChFQ09GRl9ERUJVR0dJTkcpOiBEaXR0by4gIFRlc3QgdmFsdWUsIG5vdAotCXdoZXRoZXIgaXQncyBkZWZpbmVkLgotCi1XZWQgTWF5ICAzIDIxOjM4OjIwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFzLmggKExPQ0FMX0xBQkVMU19ET0xMQVIsIExPQ0FMX0xBQkVMU19GQik6IElmIG5vdCBhbHJlYWR5Ci0JZGVmaW5lZCwgZGVmaW5lIHRoZW0gdG8gemVyby4KLQkqIGNvbmZpZy90Yy0qLmgsIGNvbmZpZy90ZS0qLmg6IElmIGRlZmluaW5nIHRoZW0sIGRlZmluZSB0aGVtIHRvCi0JYmUgMSBpbnN0ZWFkIG9mIGVtcHR5LgotCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50LCBvcGVyYW5kKTogVGVzdCB0aGVtIGF0IHJ1biB0aW1lCi0JaW5zdGVhZCBvZiBjb21waWxlIHRpbWUuCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IERpdHRvLgotCSogc3ltYm9scy5jIChjb2xvbik6IERpdHRvLgotCShkb2xsYXJfKiwgZGVmaW5lX2RvbGxhcl9sYWJlbCwgZmJfKik6IERlZmluZSB1bmNvbmRpdGlvbmFsbHkuCi0JKiBzeW1ib2xzLmggKGRvbGxhcl8qLCBkZWZpbmVfZG9sbGFyX2xhYmVsLCBmYl8qKTogRGVjbGFyZQotCXVuY29uZGl0aW9uYWxseS4KLQotV2VkIE1heSAgMyAxMzowODo1MyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogRG8gbm90aGluZyBmb3IgYW4gb3V0IG9mIHJhbmdlCi0JUEMgcmVsYXRpdmUgY2FsbCBzaW5jZSB0aG9zZSBvbmx5IG9jY3VyIGluIGNhc2VzIHdoZXJlIHRoZSBsaW5rZXIKLQljYW4gZml4IHRoZW0gdXAuCi0JKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIHJlbG9jYXRpb25zIGZvciBvdXQgb2YgcmFuZ2UgUEMKLQlyZWxhdGl2ZSBjYWxscy4KLQotVHVlIE1heSAgMiAxNjozNDo0NyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlIChocHBhKi0qLWxpdGVzKik6IEhhbmRsZSBqdXN0IGxpa2UgaHBwYSotKi0qZWxmKi4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0KLVR1ZSBNYXkgIDIgMTE6MjI6MDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChwb3BfaW5zZXJ0KTogTmV3IGZ1bmN0aW9uLgotCShwb3Bfb3ZlcnJpZGVfb2ssIHBvcF90YWJsZV9uYW1lKTogTmV3IHZhcmlhYmxlcy4KLQkobWRfcG9wX2luc2VydCwgb2JqX3BvcF9pbnNlcnQpOiBOZXcgbWFjcm9zLgotCShwb2JlZ2luKTogVXNlIHRoZW0uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFVzZSBVU0VfU1REQVJHIGFuZCBVU0VfVkFSQVJHUyBpbnN0ZWFkIG9mCi0JTk9fU1REQVJHICZjLgotCi0JKiByZWFkLmMgKHRhcmdldF9iaWdfZW5kaWFuKTogSWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gaXMKLQlkZWZpbmVkLCBpbml0aWFsaXplIHRvIDEuCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX3RhcmdldF9mb3JtYXQpOiBDaGFuZ2VkIHRvIGEgZnVuY3Rpb24sCi0JY2hlY2tpbmcgZmxhdm9yIGFuZCBieXRlIG9yZGVyIGF0IHJ1biB0aW1lLgotCShtZF9wYXJzZV9vcHRpb24sIGNhc2VzIE9QVElPTl9FQiBhbmQgT1BUSU9OX0VMKTogU2V0Ci0JdGFyZ2V0X2JpZ19lbmRpYW4gaGVyZS4KLQkobWRfYmVnaW4pOiBOb3QgaGVyZS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKG1pcHNfdGFyZ2V0X2Zvcm1hdCk6IEFkanVzdCBkZWNsYXJhdGlvbi4KLQkoVEFSR0VUX0ZPUk1BVCk6IENhbGwgbWlwc190YXJnZXRfZm9ybWF0LgotCi0JKiBjb25maWcvdGMtbWlwcy5oIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUKTogRGVmaW5lIGluIHRlcm1zIG9mCi0JT1VUUFVUX0ZMQVZPUi4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGdfc3dpdGNoX3ZhbHVlLCBnX3N3aXRjaF9zZWVuKTogRGVmaW5lCi0JdW5jb25kaXRpb25hbGx5LgotCShtZF9iZWdpbiwgbWlwc19pcCwgbWRfcGFyc2Vfb3B0aW9uLCBzX2NoYW5nZV9zZWMsIHNfb3B0aW9uLAotCXNfYWJpY2FsbHMsIG5vcGljX25lZWRfcmVsYXgpOiBDaGVjayBVU0VfR0xPQkFMX1BPSU5URVJfT1BUIGF0IHJ1bgotCXRpbWUsIGluc3RlYWQgb2YgY29tcGlsaW5nIGNvbmRpdGlvbmFsbHkgb24gR1BPUFQuCi0JKEdQT1BUKTogRG9uJ3QgZGVmaW5lLgotCShtZF9zaG9ydG9wdHMpOiBBbHdheXMgaW5jbHVkZSAtRy4KLQkoUkRBVEFfU0VDVElPTl9OQU1FKTogU2VsZWN0IGF0IHJ1biB0aW1lLgotCShtZF9iZWdpbik6IFRlc3QgZm9yIEVMRiBmb3JtYXQgYXQgcnVuIHRpbWUgaW5zdGVhZCBvZiBjb21waWxlIHRpbWUuCi0JKG1pcHNfaXAsIHNfY2hhbmdlX3NlYyk6IERpdHRvLgotCShtZF9wYXJzZV9vcHRpb24sIGNhc2VzIE9QVElPTl9DQUxMX1NIQVJFRCBhbmQgT1BUSU9OX05PTl9TSEFSRUQpOgotCURpdHRvLgotCShPUFRJT05fQ0FMTF9TSEFSRUQsIE9QVElPTl9OT05fU0hBUkVELCBtaXBzX3JlZ21hc2tfZnJhZyk6IERlZmluZQotCXVuY29uZGl0aW9uYWxseS4KLQotVHVlIE1heSAgMiAwMDoxNzowNCAxOTk1ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBUkdfQ1BVX0RFUF8qKTogTmV3IHZhcmlhYmxlcy4KLQkodGFyZy1jcHUubyk6IERlcGVuZCBvbiBvbmUsIHNlbGVjdGVkIGJ5IGF1dG9jb25mIHN1YnN0aXR1dGlvbiwKLQlpbnN0ZWFkIG9mIFRBUkdfQ1BVX0RFUEVOREVOVFMuCi0JKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgJGNwdV90eXBlLCAkb2JqX2Zvcm1hdCwgJGF0b2YsIGFuZAotCSRlbXVsYXRpb24gaW50byBNYWtlZmlsZS5pbi4KLQkqIGNvbmZpZy9oODMwMC5tdDogRGVsZXRlZC4KLQkqIGNvbmZpZy9oODUwMC5tdDogRGVsZXRlZC4KLQkqIGNvbmZpZy9pMzg2Y29mZi5tdCAoVEFSR19DUFVfREVQRU5ERU5UUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvbTY4ay5tdDogRGVsZXRlZC4KLQkqIGNvbmZpZy9tNjhrY29mZi5tdCAoVEFSR19DUFVfREVQRU5ERU5UUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvbTg4a2NvZmYubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBEZWxldGVkLgotCSogY29uZmlnL21pcHMtYmlnLm10IChUQVJHX0NQVV9ERVBFTkRFTlRTKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9taXBzLWxpdC5tdCAoVEFSR19DUFVfREVQRU5ERU5UUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvc2gubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvdzY1Lm10OiBEZWxldGVkLgotCSogY29uZmlnL3o4ay5tdDogRGVsZXRlZC4KLQotCSogY29uZmlnL3RlLWRweDIuaCAoZHB4Mik6IERlbGV0ZWQgdW51c2VkIG1hY3JvLgotCSogY29uZmlnL3RlLWdlbmVyaWMuaCAoVEVfR0VORVJJQyk6IERpdHRvLgotCSogY29uZmlnL3RlLWdvMzIuaCAoVEVfR08zMik6IERpdHRvLgotCSogY29uZmlnL3RlLWhwMzAwLmggKFRFX0hQMzAwKTogRGl0dG8uCi0JKiBjb25maWcvdGUtaHBwYS5oIChQQSwgX1RFX1BBX0gpOiBEaXR0by4KLQkqIGNvbmZpZy90ZS1pYzk2MC5oIChURV9JQzk2MCk6IERpdHRvLgotCSogY29uZmlnL3RlLW5ic2Q1MzIuaCAoVEVfTkVUQlNENTMyKTogRGl0dG8uCi0JKiBjb25maWcvdGUtcGM1MzJtYWNoLmggKFRFX1BDNTMyTUFDSCk6IERpdHRvLgotCSogY29uZmlnL3RlLXBwY253LmggKFRFX1BQQ05XKTogRGl0dG8uCi0JKiBjb25maWcvdGUtc2NvMzg2LmggKHNjb3VuaXgpOiBEaXR0by4KLQotTW9uIE1heSAgMSAxNTo1OTo1NiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfYXBwX2ZpbGUpOiBJZiBvYmpfYXBwX2ZpbGUgaXMgZGVmaW5lZCwgY2FsbCBpdCB3aXRoCi0Jc3RyaW5nIGFzIGFyZ3VtZW50LiAgRG9uJ3QgY2FsbCBjX2RvdF9maWxlX3N5bWJvbCBvcgotCWVsZl9maWxlX3N5bWJvbC4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChvYmpfYXBwX2ZpbGUpOiBEZWZpbmUgYXMgY19kb3RfZmlsZV9zeW1ib2wuCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfYXBwX2ZpbGUpOiBEZWZpbmUgYXMgZWxmX2ZpbGVfc3ltYm9sLgotCi0JKiBhcy5oIChPVVRQVVRfRkxBVk9SKTogRG9uJ3QgZGVmaW5lIGhlcmUuCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoT1VUUFVUX0ZMQVZPUikgW0JGRF9BU1NFTUJMRVJdOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoT1VUUFVUX0ZMQVZPUik6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChPVVRQVVRfRkxBVk9SKSBbQkZEX0FTU0VNQkxFUl06IERlZmluZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoT1VUUFVUX0ZMQVZPUik6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKE9VVFBVVF9GTEFWT1IpOiBEZWZpbmUuCi0KLVRodSBBcHIgMjcgMjA6MDc6MzMgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFJVTlRFU1QpOiBVc2Ugb25lIGluIHNyY2RpciBpZiBwcmVzZW50LgotCShSVU5URVNURkxBR1MpOiBEZWZpbmUuCi0KLVdlZCBBcHIgMjYgMTU6NTQ6MTAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCVN1cHBvcnQgZm9yIG1vcmUgcG9ydGFibGUgYWxpZ25tZW50IGhhbmRsaW5nIGluIGFzc2VtYmx5IGNvZGUsCi0JYmFzZWQgb24gcGF0Y2hlcyBmcm9tIEJyeWFuIEZvcmQgPGJhZm9yZEBzY2hpcmYuY3MudXRhaC5lZHU+OgotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkZWQgYmFsaWduIGFuZCBwMmFsaWduLCBmb3IgYWxpZ25pbmcgYnkKLQlieXRlcyBvciBwb3dlcnMgb2YgdHdvIGluZGVwZW5kZW50IG9mIHdoYXQgIi5hbGlnbiIgZG9lcyBmb3IgYQotCWdpdmVuIHRhcmdldC4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCB0aGVtLgotCi1UdWUgQXByIDI1IDExOjEyOjA0IDE5OTUgIFJvYiBTYXZveWUgIDxyb2JAdGhlcHViLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluOiBMb29rIGZvciBtNjhrLSotdnh3b3JrcyogcmF0aGVyIHRoYW4KLQlqdXN0IG02OGstd3JzLXZ4d29ya3Mgc28gZ2FzIGNhbiBiZSBjb25maWd1cmVkIGZvcgotCW02OGstdnh3b3JrczUuMS4KLQotRnJpIEFwciAyMSAxNToxOTowNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfYXBwbHlfZml4KTogSWYgZnhfcl90eXBlIGlzIHplcm8sIGhhbmRsZQotCWZ4X3NpemUgb2YgMSwgYW5kIGFib3J0IG9uIHVucmVjb2duaXplZCBzaXplcy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEZpeCBidWcgaW4gbGFzdCBjaGFuZ2UgcmVnYXJkaW5nCi0Jbm9uLWlzdmFyIGNhc2UuCi0KLVN1biBBcHIgMTYgMDE6NTI6NTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5oIChtZF9yZWxheF90YWJsZSwgVENfR0VORVJJQ19SRUxBWF9UQUJMRSk6Ci0JTWlzc2VkIHRoaXMgb25lIGluIDExIEFwciBjaGFuZ2VzLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQ19HRU5FUklDX1JFTEFYX1RBQkxFKTogRml4IHR5cG8uCi0KLVRodSBBcHIgMTMgMTg6MTg6MDggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2NvbnZlcnRfZnJhZyk6IEluc3RlYWQgb2YgYWJvcnRpbmcgb24gbGFyZ2UKLQlkaXNwbGFjZW1lbnRzLCBwcmludCBhbiBlcnJvciBtZXNzYWdlLiAgRG9uJ3QgaW52b2tlIHRoZSBjb2RlIHRoYXQKLQlmb2xsb3dlZCB0aGUgYWJvcnQgY2FsbCB1bnRpbCBpdCdzIGJlZW4gdmVyaWZpZWQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX3Nob3dfdXNhZ2UpOiBBZGQgNjgwNjAgdG8gbGlzdC4gIFNwbGl0IGNwdQotCWxpc3QgaW50byB0aHJlZSBsaW5lcy4KLQotVGh1IEFwciAxMyAxNDozNDozNiAxOTk1ICBUb3Jiam9ybiBHcmFubHVuZCAgPHRlZ2VAYWRkZXIuY3lnbnVzLmNvbT4KLQotCSogdGMtbTY4ay5jIChtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IFRlc3QgZm9yIG02ODM2MC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTGlrZXdpc2UuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIG02ODM2MC4KLQkqIHRjLW02OGsuaCAoVEFSR0VUX1dPUkRfU0laRSk6IERlZmluZS4KLQkoVEFSR0VUX0FSQ0gpOiBEZWZpbmUuCi0KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCk6IElmIFRBUkdFVF9XT1JEX1NJWkUgaXMgZGVmaW5lZCwKLQlzaWduLWV4dGVuZCBhcHByb3ByaWF0ZWx5LgotCi1UaHUgQXByIDEzIDExOjIwOjE3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IFByb3Blcmx5IHVzZSBQQVJBTVMgdG8KLQloaWRlIHByb3RvdHlwZSBmcm9tIG5vbi1BTlNJIGNvbXBpbGVycywgYW5kIGRvbid0IHVzZSBBTlNJIHN5bnRheAotCWZvciBhcmd1bWVudHMuCi0KLVdlZCBBcHIgMTIgMTI6MjA6MTkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluIChUREVGSU5FUyk6IFB1dCBlbXB0eSBkZWZpbml0aW9uIGludG8KLQltYWtlZmlsZSBmcmFnbWVudC4KLQkqIG1wdy1tYWtlLmluICh4bWFsbG9jLmMubyk6IFJlbW92ZS4KLQkoYXMubmV3KTogRGVwZW5kIG9uIFZlcnNpb24uci4KLQkoVmVyc2lvbi5yKTogR2VuZXJhdGUgZnJvbSB2ZXJzaW9uIGluZm8uCi0KLQkqIG1wdy1tYWtlLmluOiBEZWxldGUgcmVmZXJlbmNlcyB0byBoZXgtdmFsdWUuYy4KLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIG1hcHBpbmcgZnJvbSBjb25maWdzIHRvIG9iamVjdCBmaWxlIGZvcm1hdHMsCi0JZ2V0IFZFUlNJT04gZnJvbSBNYWtlZmlsZS5pbiBhbmQgYWRkIHRvIG1rLnRtcC4KLQkobWlwcy1pZHQtZWNvZmYpIFtUREVGSU5FU106IEFkZCBUQVJHRVRfQllURVNfQklHX0VORElBTi4KLQkqIG1wdy1tYWtlLmluIChWRVJTSU9OLCBnQyk6IERvbid0IGRlZmluZS4KLQkoQUxMX0NGTEFHUyk6IFJlbW92ZSAtZCBmbGFncy4KLQkoY29uZmlnLmgpOiBSZW1vdmUgZGVmaW5pdGlvbiBvZiBNUFcsIGFkZCBIQVZFX1NUREFSR19ILAotCUJGRF9BU1NFTUJMRVIuCi0KLQkqIG1wdy1tYWtlLmluIChBTExfQ0ZMQUdTKTogQWRkIGRlZmluaXRpb24gb2YgSEFWRV9TVERBUkdfSCwKLQlpbmNsdWRlIG9mIDo6bGliaWJlcnR5Oi4KLQkoY29uZmlnLmgpOiBJZmRlZiBjb250ZW50cyBvbiBHQVNfVkVSU0lPTi4KLQotCSogbXB3LW1ha2UuaW4gKGFzLmMpOiBDb21waWxlIHdpdGggQyBub3QgZ0MuCi0JKGNvbmZpZy1zdGFtcCk6IFRvdWNoIGNvcnJlY3RseS4KLQkoaW5zdGFsbC1vbmx5KTogTmV3IHRhcmdldC4KLQkoaW5zdGFsbCk6IERlcGVuZCBvbiBhbGwgYW5kIGluc3RhbGwtb25seS4KLQotCSogbXB3LWNvbmZpZy5pbjogUGFyc2UgdGFyZ2V0IGFuZCB1c2UgdG8gZ2VuZXJhdGUgZm9yd2FyZCBpbmNsdWRlcwotCXRvIHRjLSwgb2JqLSwgYW5kIGF0b2YtIGZpbGVzLCB1c2UgdGUtZ2VuZXJpYy5oIGZvciBlbXVsYXRpb24uCi0JKiBtcHctbWFrZS5pbiAoVkVSU0lPTik6IERlZmluZS4KLQkoYXMuYyk6IENvbXBpbGUgd2l0aCBHQ0MuCi0JKFRBUkdfT0JKRUNUUywgQ0xJQlMpOiBEZWZpbmUuCi0JKGFzLm5ldyk6IFVzZSBMREZMQUdTLCBUQVJHX09CSkVDVFMsIENMSUJTIGFuZCBFWFRSQUxJQlMgaW4gbGluawotCWNvbW1hbmQuCi0JKGNvbmZpZy5oLCBjb25maWctc3RhbXApOiBCdWlsZC4KLQotCSogbXB3LW1ha2UuaW4gKEMsIENGTEFHUyk6IFJlbW92ZWQgZGVmaW5pdGlvbnMuCi0JKEFMTF9DRkxBR1MpOiBEZWZpbmUuCi0JU2V0IGRlZmF1bHQgcnVsZSB0byB1c2Uge0NDfSBpbnN0ZWFkIG9mIHtDfS4KLQotCSogbXB3LW1ha2UuaW4gKGluc3RhbGwpOiBNb3ZlZCBoZXJlIGZyb20gbXB3LWJ1aWxkLmluLgotCSogbXB3LWJ1aWxkLmluOiBSZW1vdmVkLCBmdW5jdGlvbmFsaXR5IGluIG1wdy1tYWtlLmluCi0KLQkqIG1wdy1tYWtlLmluIChDRkxBR1MpOiBBZGQgbW9yZSBpbmNsdWRlIHBhdGhzLgotCi0JKiBtcHctY29uZmlnLmluICh2YXJhcmdzLmgsIHN5cy8qLmgpOiBEb24ndCBjcmVhdGUgd2hlbgotCWNvbmZpZ3VyaW5nLgotCSogbXB3LW1ha2UuaW4gKENGTEFHUyk6IEFkZCAtdyBmbGFnLgotCi0JKiBtcHctbWFrZS5pbjogUmVwbGFjZSA4LWJpdCBjaGFycyB3aXRoIHRoZWlyIG5hbWVzLgotCi0JKiBtcHctY29uZmlnLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgY29uZmlndXJlLmluLgotCSogbXB3LW1ha2UuaW46IE5ldyBmaWxlLCBNUFcgdmVyc2lvbiBvZiBNYWtlZmlsZS5pbi4KLQotVHVlIEFwciAxMSAwMTo0MjozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlcXVpcmUgYXQgbGVhc3QgYXV0b2NvbmYgMi4zLCBiZWNhdXNlIGVhcmxpZXIKLQl2ZXJzaW9ucyBsb3NlIG9uIHNvbWUgQUlYIHZlcnNpb25zLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbTY4ay0qLWVsZi4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGNvbW1lbnRfY2hhcnMpIFtPQkpfRUxGXTogSW5jbHVkZSAnIycuCi0JKG1kX3BzZXVkb190YWJsZSkgW09CSl9FTEZdOiBJZ25vcmUgInN3YmVnIi4KLQkobWRfYmVnaW4pOiBTZXQgYWx0X25vdGVuZF90YWJsZVsnJiddLCBzbyBzdnI0LXN0eWxlIGltbWVkaWF0ZQotCW9wZXJhbmRzIGFyZSBhY2NlcHRlZC4KLQkobWRfYXBwbHlfZml4KTogQXJndW1lbnQgVkFMUCBzaG91bGQgcG9pbnQgdG8gdmFsdWVULgotCShtZF9jb252ZXJ0X2ZyYWcpOiBBcmd1bWVudCBTRUMgc2hvdWxkIGJlIHR5cGUgc2VnVC4KLQkobWRfc2hvcnRvcHRzKSBbT0JKX0VMRl06IEFjY2VwdCAnUScgd2l0aCBhbiBhcmd1bWVudC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSWdub3JlIGl0LgotCShtZF9jb252ZXJ0X2ZyYWdfMSk6IEFkZCBpbiBmcmFnIGFkZHJlc3MgZm9yIHRoZSBzeW1ib2wgaW4gdGhlCi0JZGlzcGxhY2VtZW50IGNhbGN1bGF0aW9uLgotCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0ZPUk1BVCkgW09CSl9FTEZdOiBVc2UgImVsZjMyLW02OGsiLgotCShUQVJHRVRfQVJDSCk6IERlZmluZS4KLQkoUkVHSVNURVJfUFJFRklYX09QVElPTkFMKSBbT0JKX0VMRl06IERlZmF1bHQgdG8gMC4KLQkoTE9DQUxfTEFCRUwsIEZBS0VfTEFCRUxfTkFNRSwgUkVHSVNURVJfUFJFRklYX09QVElPTkFMKTogSGFuZGxlCi0JdGhlc2UgdGhlIHNhbWUgd2F5IGZvciBPQkpfRUxGIGFzIGZvciBNNjhLQ09GRi4KLQotCSogZ2RiaW5pdC5pbjogQWRkIGJyZWFrcG9pbnQgaW4gYXNfYWJvcnQuCi0KLQkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBJZiBvZmZzZXQgaXMgbGVzcyB0aGFuIHplcm8sCi0JY29tcGxhaW4gYWJvdXQgaXQgc3BlY2lmaWNhbGx5LCBpbnN0ZWFkIG9mIHJlcG9ydGluZyBhbiBhc3NlcnRpb24KLQlmYWlsdXJlLgotCShyZWxheF9zZWdtZW50KTogQ29tcGxhaW4gYWJvdXQgLm9yZyBiYWNrd2FyZHMsIHRoZW4gaWdub3JlIGl0LgotCURvIGdlbmVyaWMgcnNfbWFjaGluZV9kZXBlbmRlbnQgcmVsYXhhdGlvbiBvbmx5IGlmCi0JVENfR0VORVJJQ19SRUxBWF9UQUJMRSBpcyBkZWZpbmVkLCBhbmQgdXNlIGl0cyB2YWx1ZSBmb3IgdGhlIGJhc2UKLQlvZiB0aGUgdGFibGUuCi0JKiB0Yy5oIChtZF9yZWxheF90YWJsZSk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQkqIGFzLmggKHN0cnVjdCByZWxheF90eXBlKTogQWRkIGZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHR5cGUuCi0JKiBjb25maWcvdGMtYTI5ay5jOiBEZWxldGVkIG1kX3JlbGF4X3RhYmxlLgotCSogY29uZmlnL3RjLXthbHBoYSxhcm0saDgzMDAsaHBwYSxpODYwLG04OGssbWlwcyxwcGMsc3BhcmMsejhrfS5jOgotCURpdHRvLgotCSogY29uZmlnL3RjLXtoODUwMCxpMzg2LGk5NjAsbnMzMmssc2gsdGFob2UsdmF4LHc2NX0uaDogRGVjbGFyZQotCW1kX3JlbGF4X3RhYmxlIGhlcmUsIGFuZCBkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSB0byBleHBhbmQKLQl0byBtZF9yZWxheF90YWJsZS4KLQkqIGNvbmZpZy90Yy1oODUwMC5jIChtZF9yZWxheF90YWJsZSk6IE5vIGxvbmdlciBjb25zdC4KLQkqIGNvbmZpZy90Yy13NjUuYyAobWRfcmVsYXhfdGFibGUpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zaG9ydF9qdW1wX3NpemUsIG1kX2xvbmdfanVtcF9zaXplKToKLQlEZWxldGVkLgotCSogZG9jL2ludGVybmFscy50ZXhpOiBEZXNjcmliZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIGFuZAotCVdPUktJTkdfRE9UX1dPUkQuICBNZW50aW9uIG1kXypfanVtcF9zaXplIChidXQgZGVzY3JpcHRpb24gbmVlZHMKLQl0byBiZSBmbGVzaGVkIG91dCBsYXRlcikuICBOb3RlIG02OGsgUENJTkRFWCBtb2RlIGhhcyBiZWVuIGNoZWNrZWQKLQlpbi4KLQotTW9uIEFwciAxMCAxNTo1Nzo0MiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChub3BpY19uZWVkX3JlbGF4KTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgc3BsaXQKLQlvdXQgZnJvbSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheC4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBDYWxsIGl0LgotCShsb2FkX2FkZHJlc3MsIG1hY3JvKTogSW4gTk9fUElDIGJyYW5jaGVzLCBpZiBub3BpY19uZWVkX3JlbGF4Ci0JcmV0dXJucyBub256ZXJvLCBkb24ndCBhdHRlbXB0IEdQIG9wdGltaXphdGlvbi4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoUENJTkRFWCk6IE5ldyBtYWNyby4KLQkobWRfcmVsYXhfdGFibGUpOiBObyBsb25nZXIgY29uc3QuICBBZGQgUENJTkRFWCBlbnRyaWVzLgotCShtNjhrX2lwKTogRm9yIEFJTkRYIHdpdGggc2ltcGxlIHN5bWJvbCBvcGVyYW5kLCBnZW5lcmF0ZSBhCi0JUENJTkRFWCBmcmFnIGlmIFBDIGlzIHVzZWQsIG9yIGRvIG5vcm1hbCBub24tQUlORFggcHJvY2Vzc2luZyBmb3IKLQlhZGRyZXNzIHJlZ2lzdGVyLgotCShtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IElmIGNwdSBpcyA2ODAwMCBvciA2ODAxMCwgZml4Ci0JbWRfcmVsYXhfdGFibGUgdG8gcHJldmVudCByZWxheGF0aW9uIG9mIFBDSU5ERVgvQllURSBtb2RlIHRvCi0JU0hPUlQsIHNpbmNlIHRoZXkgZG9uJ3Qgc3VwcG9ydCB0aGF0IG1vZGUuCi0JKG1kX2NvbnZlcnRfZnJhZ18xLCBjYXNlIFBDTEVBL0xPTkcpOiBBZGQgNCB0byBvZmZzZXQsIG5vdCAyLiAgQWRkCi0Jc3VwcG9ydCBmb3IgbmV3IFBDSU5ERVggbW9kZXMuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogUHJvY2VzcyBQQ0lOREVYL1NaX1VOREVGIG1vZGUuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2NvbnZlcnRfZnJhZ18xLCBjYXNlIFBDTEVBL1NIT1JUKTogQWRkIDIgdG8KLQlvZmZzZXQuCi0JKG02OGtfaXAsIGNhc2UgbW9zdCBwdW5jdHVhdGlvbi9BT0ZGKTogSWYgdXNpbmcgUEMsIGNhbGwgYWRkX2ZyYWcKLQl1c2luZyBQQ0xFQS4KLQotCSogY29uZmlnL3RjLW02OGsuYzogRG9uJ3QgZXhwbGljaXRseSBpbmNsdWRlIGNvbmZpZy5oLiAgRGVsZXRlZCBhCi0JYnVuY2ggb2YgIiNpZiAwIiBjb2RlIGFuZCB1c2VsZXNzIGNvbW1lbnRzLgotCShzdHJ1Y3QgbTY4a19jcHUpOiBOZXcgdHlwZS4KLQkoYXJjaHMsIG5fYXJjaHMpOiBOZXcgdmFyaWFibGVzLCB3aXRoIHNpbmdsZSBsaXN0IG9mIG5hbWUvZW51bQotCW1hcHBpbmcgYW5kIGFsaWFzZXMuCi0JKG02OGtfaXApOiBEZWxldGUgdGhlIHRhYmxlIGhlcmUuCi0JKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogVXNlIHRoZSBuZXcgdGFibGUgaGVyZSBpbnN0ZWFkIG9mCi0Jb3Blbi1jb2RpbmcgaXQuCi0JKG1kX3BhcnNlX29wdGlvbiwgY2FzZSAnbScpOiBEaXR0by4KLQotCSogZG9jL01ha2VmaWxlLmluIChNYWtlZmlsZSk6IEZpeCBydWxlIGZvciBydW5uaW5nIGNvbmZpZy5zdGF0dXMuCi0JKGludGVybmFscy5kdmksIGludGVybmFscy5wcywgaW50ZXJuYWxzLnBzNCk6IE5ldyB0YXJnZXRzLCBub3QKLQlidWlsdCBieSBkZWZhdWx0LgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGk6IEFkZCBsb3VkIGRpc2NsYWltZXIuICBSZWZpbGwgdG8gNzkgY29sdW1ucywKLQlzcGVjaWZ5IGZpbGwtY29sdW1uIGluIGxvY2FsLXZhcmlhYmxlcyBzZWN0aW9uLiAgQ2hhbmdlCi0Jc3ViaGVhZGluZ3MgdG8gc3Vic2VjdGlvbnMgc28gdGhleSBjYW4gYmUgY3Jvc3MtcmVmZXJlbmNlZC4KLQlEZXNjcmliZSBicm9rZW4gd29yZHMsIGZyYWdzLCBmcmFnIGNoYWlucywgZ2VuZXJpYyByZWxheGF0aW9uLAotCXJlbGF4IHRhYmxlLCBtNjhrIHJlbGF4YXRpb24sIG02OGsgYWRkcmVzc2luZyBtb2RlcywgdGVzdCBzdWl0ZQotCWNvZGUuICBBZGQgYSBmZXcgd29yZHMgYWJvdXQgdmFyaW91cyBmaWxlIGZvcm1hdHMuCi0KLQkqIGRvYy9hcy50ZXhpbmZvIChtNjhrKTogUmVjb21tZW5kIHVzaW5nIGAlJyB3aXRoIHJlZ2lzdGVycyBhcyB0aGUKLQlub3JtYWwgY2FzZSwgaW5zdGVhZCBvZiB0aGUgZXhjZXB0aW9uYWwgY2FzZS4KLQotVGh1IE1hciAzMCAxNDozODo0NyAxOTk1ICBILkouIEx1IChoamxAbnluZXhzdC5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGxpbnV4IHRvIGRlZmF1bHQgdG8gZWxmLiAgVXNpbmcKLQlpWzM0NV04Ni0qLWxpbnV4YW91dCB3aWxsIGRlZmF1bHRzIHRvIGEub3V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgTWFyIDI5IDE3OjE2OjMwIDE5OTUgIFRvcmJqb3JuIEdyYW5sdW5kICA8dGVnZUBhZGRlci5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMik6IENhc3QgbmVnYXRpdmUgb2Zmc2V0cyB0byBvZmZzZXRUCi0JKGZvciBob3N0aW5nIG9uIDY0IGJpdCBtYWNoaW5lcykuCi0KLVR1ZSBNYXIgMjEgMTY6NTM6MjcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9zaG93X3VzYWdlKTogTWVudGlvbiAtbWlwczQgYW5kIC1tNDY1MC4KLQotRnJpIE1hciAxNyAxNjo0NzoxMyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQWRkIFBST0dSRVNTIG1hY3Jvcy4KLQotRnJpIE1hciAxNyAxMjo0MDozNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY29tbSk6IE1ha2Ugc3VyZSB0byBhbHdheXMgcmVzZXQgdGhlIGZyYWcKLQlhbmQgc2VjdGlvbiBmb3IgY29tbW9uIHN5bWJvbHMuCi0KLVRodSBNYXIgMTYgMTc6MjY6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBBbGxvdyBub24gUEMgcmVsYXRpdmUKLQlwb2ludGVycyBpbiB0aGUgLmN0b3JzIGFuZCAuZHRvcnMgc2VjdGlvbiBhbHNvIHdoZW4gdXNpbmcgdGhlCi0JLW1yZWxvY2F0YWJsZSBvcHRpb24uCi0JKG1kX3BhcnNlX29wdGlvbik6IFN1cHBvcnQgLW00MDMgYXMgYSBQb3dlclBDIGNvbXB1dGVyLgotCShtZF9zaG93X3VzYWdlKTogRGl0dG8uCi0KLVdlZCBNYXIgMTUgMTQ6NDU6NDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9kZWJ1Zyk6IFRoZSBjdXJfc2NvcGUgZmllbGQgb2YgYSBmaWxfcHRyCi0JbWF5IGJlIE5VTEwgd2hlbiBnaXZlbiBzdHJhbmdlIGlucHV0LiAgRG9uJ3QgY29yZSBkdW1wLgotCi1UdWUgTWFyIDE0IDIxOjM2OjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IERvbid0IHVzZSBhZGRpdSBmb3IgZGxpIG9mIGFuCi0JdW5zaWduZWQgc2VlbWluZ2x5IG5lZ2F0aXZlIG51bWJlci4gIERvbid0IGJvdGhlciBzaGlmdGluZyBhIHplcm8KLQl2YWx1ZS4KLQkobWlwc19pcCk6IEZvciBjYXNlICdqJywgaWYgdGhlcmUgYXJlIG1vcmUgYWx0ZXJuYXRpdmVzLCBhbmQgdGhlCi0JSVNBIGxldmVsIGlzIGF0IGxlYXN0IDMsIGRvbid0IGFjY2VwdCBhbiB1bnNpZ25lZCBzZWVtaW5nbHkKLQluZWdhdGl2ZSBudW1iZXIuCi0KLVR1ZSBNYXIgMTQgMTk6MTY6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2FwcF9saW5lKTogRml4IGxhc3QgcGF0Y2ggdG8gZGVhbCB3aXRoIGEgbGluZSBudW1iZXIKLQlvZiAxLgotCi1UdWUgTWFyIDE0IDE3OjAwOjU3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IFVzZSBhc193YXJuX3doZXJlLCBub3QKLQlhc19iYWRfd2hlcmUgdG8gZ2l2ZSBhIHdhcm5pbmcgaW5zdGVhZCBvZiBhbiBlcnJvci4KLQotTW9uIE1hciAxMyAxNzowMzo0NiAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL3RjLXZheC5jIChtZF9hc3NlbWJsZSk6ICBpc3N1ZSBhIHdhcm5pbmcgaWYgYSBjb25zdGFudAotCWlzIHVzZWQgYXMgYW4gb3BlcmFuZCB3aGVyZSBhbiBpbW1lZGlhdGUgdmFsdWUgaXMgbm90IGFsbG93ZWQuCi0KLUZyaSBNYXIgMTAgMTk6MjE6MTkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmM6IFJlZG8gbXkgMTAgSmFuIGNoYW5nZSwgYnV0IGdldCBpdCByaWdodCB0aGlzCi0JdGltZS4gOi0pCi0JKGZpeHVwX3NlZ21lbnQpOiBJZiBsaW5rcmVsYXggaXMgc2V0LCBqdXN0IHJldHVybi4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBEb24ndCB0cmVhdCBoODMwMCBhbmQgejhrIHNwZWNpYWxseSB3aXRoCi0JcmVnYXJkIHRvIGZpeHVwcy4KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChtZF9iZWdpbik6IFNldCBsaW5rcmVsYXguCi0JKiBjb25maWcvdGMtejhrLmMgKG1kX2JlZ2luKTogRGl0dG8uCi0KLVRodSBNYXIgIDkgMTg6MDE6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9oZWFkZXJfYXBwZW5kKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0LgotCi1UaHUgTWFyICA5IDEzOjUxOjMwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQlEZWxldGUgdGhpcyBwYXRjaCwgaXQgYnJlYWtzIHRoZSBoODMwMCBhc3NlbWJsZXIuCi0JVHVlIEphbiAxMCAxMzozNDoxNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogRG9uJ3QgdHJlYXQgaDgzMDAgYW5kIHo4awotCXNwZWNpYWxseSB3aXRoIHJlZ2FyZCB0byBmaXh1cHMuCi0KLVRodSBNYXIgIDkgMTI6Mjg6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1yZWxvY2F0YWJsZSk6IENoYW5nZSB0eXBlIHRvIGJvb2xlYW4uCi0JKG1kX2JlZ2luKTogU2V0IHRoZSBFRl9QUENfUkVMT0NBVEFCTEUgaWYgLW1yZWxvY2F0YWJsZS4KLQotV2VkIE1hciAgOCAxNTozOTozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogQ2hlY2sgZm9yIGEgY3B1IHN0cmluZyBvZiByODAwMCBvcgotCXIxMDAwMC4gIElmIG1pcHNfaXNhIGlzIDQsIHNldCB0aGUgbWFjaGluZSBudW1iZXIgdG8gODAwMC4KLQkoYXBwZW5kX2luc24pOiBJZiBtaXBzX2lzYSBpcyBhdCBsZWFzdCA0LCBkb24ndCBnZW5lcmF0ZSBub3BzIGZvcgotCWNvcHJvY2Vzc29yIGRlbGF5cy4gIENoZWNrIElOU05fUkVBRF9GUFJfUiB3aGVuIHNldHRpbmcKLQltaXBzX2Nwcm1hc2tbMV0uCi0JKG1pcHNfZW1pdF9kZWxheXMpOiBJZiBtaXBzX2lzYSBpcyBhdCBsZWFzdCA0LCBkb24ndCBnZW5lcmF0ZSBub3BzCi0JZm9yIGNvcHJvY2Vzc29yIGRlbGF5cy4KLQkobWlwc19pcCk6IENoZWNrIGZvciBJTlNOX0lTQTQgaW5zdHJ1Y3Rpb25zLiAgSGFuZGxlIG5ldyBhcmd1bWVudAotCXR5cGVzICdoJywgJ1InLCAnTicsIGFuZCAnTScuCi0JKG1kX2xvbmdvcHRzKTogQWNjZXB0ICJtaXBzNCIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAtbWlwczQsIGFuZCAtbWNwdT0xMDAwMCBhbmQgLW1jcHU9ODAwMC4KLQkoc19taXBzc2V0KTogUGVybWl0IC5zZXQgbWlwczQuCi0KLVdlZCBNYXIgIDggMDk6MzY6MDUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfdmFsaWRhdGVfZml4KTogQWxsb3cgLnN0YWIgc2VjdGlvbnMgdG8KLQloYXZlIG5vbiBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucyB3aXRoIC1tcmVsb2NhdGFibGUuCi0KLVdlZCBNYXIgIDggMDI6NTc6NTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAob3Bjb2RlX3B0cik6IFJldHVybiBwb2ludGVyIHRvIGNvbnN0LgotCShtZF9iZWdpbik6IE1ha2UgaGFzaCB0YWJsZSBlcnJvcnMgZmF0YWwuICBQcm9jZXNzIG9wY29kZSBhbGlhc2VzCi0JYWZ0ZXIgbWFpbiBvcGNvZGUgdGFibGUuCi0JKG1kX2FwcGx5X2ZpeF8yLCBjYXNlIDQpOiBSZWNvZGUgc2V0dGluZyBvZiBsb3dlcl9saW1pdCB0byBhdm9pZAotCWdjYyB3YXJuaW5nLgotCi1UdWUgTWFyICA3IDE2OjA3OjEwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IEFkZCBkb2N1bWVudGF0aW9uIGZvciBTUEFSQyBWOSwgZnJvbSBEb3VnIEV2YW5zCi0JPGRqZUBjeWdudXMuY29tPi4KLQotTW9uIE1hciAgNiAwOTo1ODozNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogQ2hhbmdlIGFsbCBvY2N1cmVuY2VzIG9mIHBhLTg5IHdpdGggcGEtMTEgdG8KLQliZSBjb25zaXN0ZW50IHdpdGggY3VycmVudCBuYW1pbmcgY29udmVudGlvbnMuCi0JKG1kX2JlZ2luKTogU2V0IGEgZGVmYXVsdCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZS4KLQkocGFfaXApOiBJZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBzcGVjaWZpZXMgYSBuZXdlciBtYWNoaW5lIHR5cGUKLQl0aGFuIHRoZSBjdXJyZW50IG1hY2hpbmUgdHlwZSwgdGhlbiB1cGRhdGUgdGhlIGN1cnJlbnQgbWFjaGluZQotCXR5cGUuCi0JKG5lZWRfcGExMV9vcGNvZGUpOiBMaWtld2lzZS4KLQotU3VuIE1hciAgNSAxOTozODowOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXAsIGNhc2UgJ3onKTogRG9uJ3QgbG9zZSBhcmd1bWVudAotCXJlbG9jYXRpb24gYml0cyBmb3IgYWJzb2x1dGUgY2FsbHMuCi0KLUZyaSBNYXIgIDMgMTc6NDE6NTAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLiogKG1kX29wZXJhbmQpOiBDaGFuZ2UgZW1wdHkgZnVuY3Rpb24gdG8gZW1wdHkKLQltYWNyby4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGJ1aWxkX2J5dGVzKTogTWFrZSBIOC8zMDAtSCB3YXJuaW5nIG1lc3NhZ2UKLQljbGVhcmVyLgotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IElmIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyBmYWlscywKLQlwcmludCBhIG1lc3NhZ2UgYW5kIGV4aXQsIGluc3RlYWQgb2YgYWJvcnRpbmcuCi0KLUZyaSBNYXIgIDMgMTY6MjY6MTkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB0Yy5oIChtZF9hcHBseV9maXgzKTogSWYgTURfQVBQTFlfRklYMyBpcyBkZWZpbmVkLCBkZWNsYXJlCi0JbWRfYXBwbHlfZml4My4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IElmIE1EX0FQUExZX0ZJWDMgaXMgZGVmaW5lZCwgY2FsbAotCW1kX2FwcGx5X2ZpeDMgd2l0aCB0aGUgbm9ybWFsIDIgYXJndW1lbnRzIGFuZCB0aGUgY3VycmVudCBzZWdtZW50Ci0JcG9pbnRlciBpbnN0ZWFkIG9mIG1kX2FwcGx5X2ZpeC4KLQotCSogY29uZmlnL3RjLXBwYy5oIChNRF9BUFBMWV9GSVgzKTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfdmFsaWRhdGVfZml4KTogV2FybiBpZiAtbXJlbG9jYXRhYmxlCi0JYW5kIGEgbm9uIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gdGhhdCBpc24ndCBpbiB0aGUgLmdvdDIgc2VnbWVudAotCXdhcyBwZXJmb3JtZWQuCi0JKG1kX2FwcGx5X2ZpeDMpOiBSZW5hbWUgZnJvbSBtZF9hcHBseV9maXggYW5kIHRha2Ugc2VnbWVudCBwb2ludGVyCi0JYXMgdGhpcmQgYXJndW1lbnQuICBJZiBFTEYgb2JqZWN0IGZvcm1hdCwgY2FsbCBwcGNfZWxmX3ZhbGlkYXRlX2ZpeAotCWZvciBub3JtYWwgcmVsb2NhdGlvbnMuCi0JKG1kX3BhcnNlX29wdGlvbik6IElmIEVMRiBvYmplY3QgZm9ybWF0LCByZWNvZ25pemUgdGhlCi0JLW1yZWxvY2F0YWJsZSBzd2l0Y2guCi0KLVRodSBNYXIgIDIgMTY6MzQ6NDQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChBT1VUX01BQ0hUWVBFKTogRGVmaW5lIGFzIDEwMCwgbm90IDAuCi0KLVR1ZSBGZWIgMjggMTg6Mjk6MjcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jLCBjb25maWcvdGMtYXJtLmggKG1kX29wZXJhbmQpOiBSZXBsYWNlZCBlbXB0eQotCWZ1bmN0aW9uIGluIC5jIGZpbGUgd2l0aCBlbXB0eSBtYWNybyBpbiAuaCBmaWxlLgotCSogY29uZmlnL3RjLWg4NTAwLiosIGNvbmZpZy90Yy1ocHBhLiosIGNvbmZpZy90Yy1pMzg2LiosCi0JY29uZmlnL3RjLWk4NjAuKiwgY29uZmlnL3RjLWk5NjAuKiwgY29uZmlnL3RjLW5zMzJrLiosCi0JY29uZmlnL3RjLXBwYy4qLCBjb25maWcvdGMtc2guKiwgY29uZmlnL3RjLXNwYXJjLiosCi0JY29uZmlnL3RjLXRhaG9lLiosIGNvbmZpZy90Yy12YXguKiwgY29uZmlnL3RjLXc2NS4qLAotCWNvbmZpZy90Yy16OGsuKjogRGl0dG8uCi0JKiBjb25maWcvdGMtbTY4ay4qOiBEaXR0by4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobW90ZV9wc2V1ZG9fdGFibGUpOiBSZW1vdmVkIGRvdHMgZnJvbSBvcGNvZGUKLQluYW1lcy4KLQotCSogcmVhZC5jIChzX2FwcF9saW5lKTogSWdub3JlIG5vbi1wb3NpdGl2ZSBsaW5lIG51bWJlcnMuCi0KLVR1ZSBGZWIgMjggMTU6MzQ6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IFBMVCBvcgotCUdPVCByZWxvY3MgZWl0aGVyLgotCi1Nb24gRmViIDI3IDEzOjAzOjQxIDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIGEyOWstKi12eHdvcmtzIGNvbmZpZ3VyYXRpb24uCi0KLUZyaSBGZWIgMjQgMTQ6NDE6MTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogVGFrZSBkYmwgYXJndW1lbnQgdG8gZGV0ZXJtaW5lCi0JaGFuZGxpbmcgb2Ygc2lnbmVkIDMyIGJpdCB2YWx1ZXMgaW4gNjQgYml0IG1vZGVzLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKG1hY3JvKTogSGFuZGxlIE1fRExJIGFuZCBNX0RMQV9BQi4KLQotV2VkIEZlYiAyMiAyMzoxMDo1NiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogRG9uJ3Qgc3VidHJhY3QgdGhlIHZhbHVlIG9mIHRoZQotCWFkZCBzeW1ib2wgaWYgaXQncyBhIGNvbW1vbiBzeW1ib2wgKHRoZSB2YWx1ZSBvZiBhIGNvbW1vbiBzeW1ib2wKLQlpcyBpdHMgc2l6ZSwgbm90IGEgdmFsdWUgaW4gdGhlIHRyYWRpdGlvbmFsIHNlbnNlKS4KLQotV2VkIEZlYiAyMiAyMToxMjoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogSWYgbGlzdGluZ19wcmV2X2xpbmUgaXMgY2FsbGVkLAotCWNhbGwgZnJhZ19ncm93IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBzdGlsbCByb29tIGZvciBhIHZhcmlhbnQuCi0KLUZyaSBGZWIgMTcgMTQ6NTA6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgMmJ5dGUsIDRieXRlIGFuZCA4Ynl0ZQotCWlmIE9CSl9FTEYuICBGcm9tIGdhcnlASW50cmVwaWQuQ09NIChHYXJ5IEZ1bmNrKS4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2Jfc3ltYm9sKTogV2FybiBpZiBhIHN5bWJvbCBpcyBib3RoCi0Jd2VhayBhbmQgY29tbW9uLgotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogTGlrZXdpc2UuCi0KLUZyaSBGZWIgMTcgMTI6NDM6NDcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BzZXVkb190YWJsZSk6IERvbid0IHJlZGVmaW5lIGJ5dGUgdW5kZXIKLQlFTEYuCi0JKHBwY19lbGZfY29ucyk6IERvbid0IHN1cHBvcnQgQHBjcmVsIGFueSBtb3JlLCBzaW5jZSBESUZGX0VYUFJfT0sKLQlhbGxvd3MgdGhlIG5vcm1hbCBleHByZXNzaW9ucyB0byBnZW5lcmF0ZSBpdC4KLQkobWRfYXBwbHlfZml4KTogQ29udmVydCBCRkRfUkVMT0NfMzIgd2l0aCBwY3JlbCBiaXQgc2V0IGludG8KLQlCRkRfUkVMT0NfMzJfUENSRUwuICBBYm9ydCBpZiBlaXRoZXIgQkZEX1JFTE9DXzE2IG9yIEJGRF9SRUxPQ184Ci0JbmVlZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucy4KLQotCSogY29uZmlnL3RjLXBwYy5oIChESUZGX0VYUFJfT0spOiBEZWZpbmUgdG8gYWxsb3cgUEMgcmVsYXRpdmUKLQlleHByZXNzaW9ucyB0byBiZSBoYW5kbGVkLgotCi1UaHUgRmViIDE2IDE0OjMwOjEzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChvcGVyYW5kKTogTW92ZSBtZF9vcGVyYW5kIGhhbmRsaW5nIHRvIGRlZmF1bHQgY2FzZQotCShzbyBpdCB3b3JrcykuCi0KLVdlZCBGZWIgMTUgMTY6MDg6NDcgMTk5NSAgSmFzb24gTW9sZW5kYSAgPGNyYXNoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODUwMC5jICh0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBBZGQgaWdub3JlZAotCXBhcmFtZXRlciwgdG8gbWF0Y2ggcHJvdG90eXBlLgotCi1XZWQgRmViIDE1IDE1OjA3OjAwIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBJZiBFTEYsIGdvIHRvIHBwY19lbGZfY29ucwotCWluc3RlYWQgb2YgY29ucy4KLQkobWRfc2hvd191c2FnZSk6IFNob3cgYWxsIG9mIHRoZSBQb3dlclBjIG9wdGlvbnMuCi0JKHBwY19lbGZfc3VmZml4KTogTmV3IGZ1bmN0aW9uIHRvIHJlY29nbml6ZSBFTEYgc3VmZml4ZXMgdGhhdAotCXNwZWNpZnkgYSByZWxvY2F0aW9uLCBzdWNoIGFzIEBHT1QuCi0JKHBwY19lbGZfY29ucyk6IFJlcGxhY2VtZW50IGZvciB0aGUgc3RhbmRhcmQgY29ucyBmdW5jdGlvbiB0aGF0Ci0Ja25vd3MgYWJvdXQgdGhlIEVMRiBzdWZmaXhlcy4KLQkocHBjX2ZpeHVwKTogQWRkIHJlbG9jIGZpZWxkIHRvIGhvbGQgbm9uLXN0YW5kYXJkIHJlbG9jYXRpb24uCi0JKG1kX2Fzc2VtYmxlKTogSGFuZGxlIEVMRiBzdWZmaXhlcyBsaWtlIEBHT1QuCi0JKG1kX2NyZWF0ZV9zaG9ydF9qdW1wKTogRHVtbXkgaW4gY2FzZSBXT1JLSU5HX0RPVF9XT1JEIGlzIG5vdAotCWRlZmluZWQuCi0JKG1kX2NyZWF0ZV9sb25nX2p1bXApOiBEaXR0by4KLQkobWRfc2hvcnRfanVtcF9zaXplKTogRGl0dG8uCi0JKG1kX2xvbmdfanVtcF9zaXplKTogRGl0dG8uCi0JKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBCRkRfUkVMT0NfMzJfUENSRUwsIEJGRF9SRUxPQ19MTzE2LAotCUJGRF9SRUxPQ19ISTE2LCBCRkRfUkVMT0NfSEkxNl9TLCBCRkRfUkVMT0NfUFBDX1RPQzE2LCBhbmQKLQlCRkRfUkVMT0NfMTYgcmVsb2NhdGlvbnMuICBJZiByZWxvY2F0aW9uIGNhbiBub3QgYmUgZm91bmQsIHByaW50Ci0JdGhlIGRlY2ltYWwgdmFsdWUgb2YgdGhlIHJlbG9jYXRpb24uCi0KLVdlZCBGZWIgMTUgMTE6NDY6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9hcHBseV9maXgpOiBBY2NlcHQgQkZEX1JFTE9DXzE2LCBmb3IKLQlEV0FSRi4gIEZyb20gZ2FyeUBJbnRyZXBpZC5DT00gKEdhcnkgRnVuY2spLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEhhbmRsZSBNX1V7TCxTfURbX0FdICh1bmFsaWduZWQgZG91YmxlCi0JbG9hZHMgYW5kIHN0b3JlcykuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEbyBhZGp1c3QgZ2xvYmFsCi0Jc3ltYm9scyBpZiBPQkpfQU9VVC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBEb24ndCB1c2UgdGhlIHRhcmdldCByZWdpc3RlciBhcyBhCi0JYmFzZSByZWdpc3RlciB3aGVuIGJ1aWxkaW5nIHRoZSBhZGRyZXNzIGZvciBNX0x7VyxEfXtMLFJ9X0FCLgotCi1Nb24gRmViIDEzIDE0OjQ0OjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoS1QwLCBLVDEpOiBEZWZpbmUuCi0JKG1pcHNfaXApOiBSZWNvZ25pemUgJGt0MCBhbmQgJGt0MSBhcyByZWdpc3RlciBuYW1lcy4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRGVmaW5lIGlmIE9CSl9FTEYuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4KTogSWYgT0JKX0VMRiwgc3VidHJhY3Qgb3V0IHRoZQotCXZhbHVlIG9mIGEgZGVmaW5lZCBzeW1ib2w7IHRoZSB2YWx1ZSB3YXMgYWRkZWQgaW4gYnkKLQlmaXh1cF9zZWdtZW50LiAgVGhpcyB3YXMgcHJldmlvdXNseSBjb3JyZWN0ZWQsIGlmIHRoZSByZWxvYyB3YXMKLQljaGFuZ2VkIHRvIGJlIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwgaW4gdGNfZ2VuX3JlbG9jLgotCi1GcmkgRmViIDEwIDE0OjA0OjA0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IFVzZSBTX0lTX0VYVEVSTgotCXJhdGhlciB0aGFuICFTX0lTX0xPQ0FMLgotCi1UaHUgRmViICA5IDE4OjE2OjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBBZGp1c3QgY29uZGl0aW9ucyBmb3IgY2hhbmdpbmcKLQlCRkRfUkVMT0NfMzIgdG8gQkZEX1JFTE9DXzM4Nl9HT1RQQyB0byBoYW5kbGUgYSBzd2l0Y2ggaW4gZnJhZ3MuCi0JUGF0Y2ggb3JpZ2luYWxseSBmcm9tIFJvYiBSeWFuIDxyb2JyQGNtdS5lZHU+LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBJbmNsdWRlIHN1YnNlZ3MuaC4KLQkodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IERlY2xhcmUgcmV0dXJuIHZhbHVlLgotCShpMzg2X29wZXJhbmQpOiBEb24ndCB1c2UgYW4gYXNzaWdubWVudCBkaXJlY3RseSBhcyBhIGNvbmRpdGlvbi4KLQotVGh1IEZlYiAgOSAxMDozNzoxMyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogSW4gc29tZSBjYXNlcyBzdWJ0cmFjdCB0aGUKLQl2YWx1ZSBvZiB0aGUgYWRkIHN5bWJvbCBmcm9tIHZhbHAuICBPZmZzZXRzIGJyYWluZGFtYWdlIGluIHRoZQotCSJtYWNoaW5lIGluZGVwZW5kZW50IiBmaXh1cF9zZWdtZW50LgotCi1XZWQgRmViICA4IDE4OjUxOjIzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG1lc3NhZ2VzLmMgKGFzX2Fib3J0KTogTmV3IGZ1bmN0aW9uLgotCSogYXMuaCAoYXNfYWJvcnQpOiBEZWNsYXJlIGl0LgotCShhYm9ydCk6IE5ldyBtYWNyby4KLQotCVRodSBKYW4gMTkgMTg6MTA6MDUgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy92bXMtY29uZi5oIChIQVZFX1VOSVNURF9IKTogIGRlZmluZSBpdCB1bmNvbmRpdGlvbmFsbHkuCi0JKiBjb25maWctZ2FzLmNvbTogIHRlc3QgZm9yIGF2YWlsYWJpbGl0eSBvZiA8dW5pc3RkLmg+OyBjcmVhdGUgYQotCXJ1ZGltZW50YXJ5IG9uZSBpZiBuZWNlc3NhcnkuCi0KLVR1ZSBGZWIgIDcgMTM6MzQ6NDYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBwb3dlcnBjLSotZWFiaSBzdXBwb3J0LCB3aGljaCBpcyB0aGUgc2FtZSBhcwotCXBvd2VycGMtKi1lbGYuCi0JKGNvbmZpZ3VyZSk6IFJlYnVpbGQgd2l0aCBhdXRvY29uZi4KLQotTW9uIEZlYiAgNiAwMzozNzowMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JQ2hhbmdlcyBmcm9tIEJyeWFuIEZvcmQgPGJhZm9yZEBzY2hpcmYuY3MudXRhaC5lZHU+IGZvciBpMzg2Ci0JMTYtYml0IGFuZCBtc2RvcyBzdXBwb3J0OgotCSogY29uZmlnL3RjLWkzODYuYyAoZmxhZ18xNmJpdF9jb2RlKTogTmV3IHZhcmlhYmxlLgotCShzZXRfMTZiaXRfY29kZV9mbGFnKTogTmV3IGZ1bmN0aW9uLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGRlZCBlbnRyaWVzICJjb2RlMTYiIGFuZCAiY29kZTMyIi4KLQkobWRfYXNzZW1ibGUpOiBFbnN1cmUgdGhhdCBjb3JyZWN0IGRhdGEtc2l6ZSBwcmVmaXhlcyBnZXQgZW1pdHRlZCwKLQliYXNlZCBvbiB0aGUgY3VycmVudCBtb2RlLiAgRW5zdXJlIHRoYXQgMzItYml0IGFkZHJlc3Npbmcgd2lsbAotCWFsd2F5cyBiZSBkb25lLiAgTW92ZSBzZWdtZW50LXByZWZpeCBoYW5kbGluZyBjb2RlLiAgKFdoeT8pICBVc2UKLQkxNi1iaXQganVtcHMgZm9yIDE2LWJpdCBjb2RlLCAzMi1iaXQganVtcHMgZm9yIDMyLWJpdCBjb2RlLgotCSogY29uZmlnL3RjLWkzODYuaCAoTUFYX1BSRUZJWEVTKTogQnVtcCB0byA1LgotCShEYXRhMTYsIERhdGEzMik6IERlZmluZS4KLQkqIGRvYy9hcy50ZXhpbmZvIChpMzg2LTE2Yml0KTogTmV3IG5vZGUuCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1tc2RvcyopOiBOZXcgdGFyZ2V0LCB1c2luZyBhLm91dCBmb3JtYXQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UaHUgRmViICAyIDE1OjIxOjI0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGNwdTMyX2NvbnRyb2xfcmVncyk6IE5ldyBtYWNyby4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBVc2UgaXQsIGZvciBjcHUzMiBwcm9jZXNzb3JzLgotCi0JVHVlIEphbiAzMSAxNzoyMDo0NSAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuYyAodm1zX3Rpcl9zdGFja19wc2VjdCk6ICBuZXcgcm91dGluZTsKLQkoVk1TX1NldF9EYXRhLCBWTVNfU2V0X1BzZWN0LCBWTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UsCi0JVk1TX1RCVF9Sb3V0aW5lX0JlZ2luLCBWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24pOiAgdXNlIGl0OwotCShWTVNfR2xvYmFsX1N5bWJvbF9TcGVjLCBWTVNfUHJvY2VkdXJlX0VudHJ5X1B0KTogIHRyZWF0Ci0JUHNlY3RfTnVtYmVyIGFzIGB1bnNpZ25lZCcuCi0KLQlUaHUgSmFuIDI2IDE3OjA2OjI4IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5jOiAgcGVyZm9ybWFuY2UgdHVuaW5nLgotCShWTVNfU3ltYm9sX3R5cGVfbGlzdCk6ICBjb252ZXJ0IGZyb20gc2luZ2xlIGxpc3QgaGVhZCB0byBzbWFsbAotCWFycmF5IG9mIGxpc3QgaGVhZHM7Ci0JKFNZTVRZUF9IQVNIKTogIG5ldyBtYWNybyBmb3IgYWNjZXNzaW5nIFZNU19TeW1ib2xfdHlwZV9saXN0W107Ci0JKGZpbmRfc3ltYm9sLCBzZXR1cF9iYXNpY190eXBlLCBWTVNfdHlwZWRlZl9wYXJzZSk6ICB1c2UgaXQ7Ci0JKFZNU19SU1lNX1BhcnNlKTogIG1vdmUgU19HRVRfVkFMVUUoKSBpbnNpZGUgc3dpdGNoIHRvIGF2b2lkCi0JY2FsbGluZyBpdCBmb3IgdW5pbnRlcmVzdGluZyBjYXNlcy4KLQotV2VkIEZlYiAgMSAyMzo1Mjo0NSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogR28gYWhlYWQgYW5kIGNhbGwKLQlocHBhX2ZpZWxkX2FkanVzdCB0byBnZXQgYSBuZXcgdmFsdWUgZm9yIFJfREFUQV9PTkVfU1lNQk9MCi0JcmVsb2NhdGlvbnMgaW4gU09NLgotCShocHBhX2ZpeF9hZGp1c3RhYmxlKTogUmVmaW5lIHNvbWV3aGF0LgotCi1GcmkgSmFuIDI3IDIxOjI5OjUzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5oIChOT19TVFJJTkdfRVNDQVBFUyk6IERvbid0IGRlZmluZSBpZiB3ZSBhcmUKLQl1c2luZyBFTEYuCi0KLVRodSBKYW4gMjYgMTk6MDM6NDIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGdldF9zcGVjaWZpYyk6IEFkZCBwYXJlbnMgYXJvdW5kIHwgaW5zaWRlICYuCi0JKHNraXBfY29sb250aGluZyk6IFNldCBMXzggaWYgIjo4IiBpcyBzcGVjaWZpZWQuCi0KLVRodSBKYW4gMjYgMTg6Mzg6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2JlZ2luKTogUGVybWl0IG1mZGVjIHRvIGJlIGR1cGxpY2F0ZWQgb24gdGhlCi0JNjAxLiAgQ2hlY2sgdGhhdCB0aGUgZXJyb3IgcmV0dXJuIGZyb20gaGFzaF9pbnNlcnQgaXMgImV4aXN0cyIuCi0KLVRodSBKYW4gMjYgMTE6MzU6MzMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQWRkIHN1cHBvcnQgZm9yIGNvbmZpZ3VyaW5nIHBvd2VycGMtKi1lYWJpLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKEdPVF9zeW1ib2wpOiBEZWZpbmUgaWYgb2JqZWN0IGZvcm1hdCBpcyBFTEYuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTogRGVmaW5lIGlmIG9iamVjdAotCWZvcm1hdCBpcyBFTEYgYW5kIG5vdCBkZWZpbmVkIHRvIGJlICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iLgotCi1XZWQgSmFuIDI1IDE2OjIzOjEzIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogdGMtc2guYyAobGl0dGxlKTogQWRkIGFyZ3VtZW50IElHTk9SRSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkIHNwYWNlIGZvciBjb25zaXN0ZW50IGZvcm1hdHRpbmcuCi0JKENPTkQ4X1JBTkdFLCBDT05EMTJfUkFOR0UpOiBEZWxldGUgdW51c2VkIG1hY3Jvcy4KLQkoQ09ORDhfRiwgQ09ORDhfTSwgQ09ORDEyX0YsIENPTkQxMl9NLCBVTkNPTkQxMl9GLCBVTkNPTkQxMl9NKToKLQlDb3JyZWN0IG1pbmltdW0gYW5kIG1heGltdW0gYnJhbmNoIG9mZnNldHMuICBBZGQgY29tbWVudHMgZXhwbGFpbmluZwotCXdoeSB0aGVzZSBudW1iZXJzIGFyZSBjb3JyZWN0LgotCi1XZWQgSmFuIDI1IDE1OjMyOjA5IDE5OTUgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IEFjY2VwdCBtcHdyMiBhcyBhIHN5bm9ueW0gZm9yCi0JbXB3cng7IG1wcGMzMiwgbTYwMywgYW5kIG02MDQgYXMgc3lub255bXMgZm9yIG1wcGM7IGFuZCBtcHBjNjQgYW5kCi0JbTYyMCBmb3IgUG93ZXJQQzY0IG1vZGUuCi0JKHBwY19zeW1ib2xfbmV3X2hvb2spOiBBZGQgVDAgYXMgc3lub255bSBmb3IgVEMwIHN1ZmZpeC4KLQotVHVlIEphbiAyNCAxNjo0NDoyMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdmF4LmMgKHZpcCk6IEludHJvZHVjZSBuZXcgcHRyLXRvLWNvbnN0IGxvY2FsIHZhcmlhYmxlCi0JZm9yIHNjYW5uaW5nIG9wZXJhbmQgc3RyaW5nLgotCi0JU2F0IEphbiAyMSAxNzo1MDozOCAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL3ZheC1pbnN0LmggKHN0cnVjdCB2b3AsIGZpZWxkcyBgdm9wX3dhcm4nLCBgdm9wX2Vycm9yJyk6Ci0JbWFrZSB0aGVtIHBvaW50ZXJzIHRvIGNvbnN0IGNoYXI7Ci0JKHN0cnVjdCB2aXQsIGZpZWxkIGB2aXRfZXJyb3InKTogIGRpdHRvLgotCSogY29uZmlnL2F0b2YtdmF4LmMgKG1kX2F0b2YpOiAgcmVuYW1lIGxvY2FsIGBsaXR0bGVudW1fcG9pbnRlcicKLQl0byBgbGl0dGxlbnVtUCcgdG8gYXZvaWQgc2hhZG93aW5nIGZpbGUgc2NvcGUgdmFyaWFibGUuCi0JKiBjb25maWcvdGMtdmF4LmMgKHZpcF9iZWdpbiwgdmlwX29wX2RlZmF1bHRzLCB2aXBfb3BfMSk6ICBtYWtlCi0Jc3RyaW5nIGFyZ3VtZW50cyBiZSBwb2ludGVycyB0byBjb25zdCBjaGFyOwotCSh2aXApOiAgbWFrZSBgYWxsb3BlcnInIGNvbnN0IGNoYXIgKjsKLQkodmlwX29wKTogbWFrZSBgZXJyJyBhbmQgYHdybicgY29uc3QgY2hhciAqOyByZW5hbWUgYGFjY2VzcycgdG8KLQlgYWNjZXNzX21vZGUnIHRvIGF2b2lkIHNoYWRvd2luZyBsaWJyYXJ5IGZ1bmN0aW9uLgotCSogY29uZmlnL29iai12bXMuYyAoYHN5bWJvbF9uYW1lJyk6ICBtYWtlIGl0IGNvbnN0IGNoYXIgKjsKLQkoZ2V0X3N0cnVjdF9uYW1lKTogIGNhc3Qgb25lIHVzZSBvZiBgc3ltYm9sX25hbWUnIHRvIGNoYXIgKgotCVtjYWxsZXIgZ3VhcmFudGVlcyB0aGF0IGl0IHdvbid0IG1vZGlmeSB0aGUgcG9pbnRlcidzIHRhcmdldF07Ci0JKFBVVF9DT1VOVEVEX1NUUklORyk6ICB1c2UgcG9pbnRlciB0byBjb25zdCBjaGFyOwotCShWTVNfdHlwZWRlZl9wYXJzZSk6ICBtYWtlIGBwbnQyJyBjb25zdCBjaGFyICo7Ci0JKFdyaXRlX1ZNU19NSERfUmVjb3Jkcyk6ICBtYWtlIGBjcCcgY29uc3QgY2hhciAqOwotCShWTVNfTW9kaWZ5X1BzZWN0X0F0dHJpYnV0ZXMsIGFycmF5IGBBdHRyaWJ1dGVzJyk6ICBtYWtlIGNvbnN0LAotCWFuZCBtYWtlIGZpZWxkIGBOYW1lJyBwb2ludGVyIHRvIGNvbnN0IGNoYXI7Ci0KLQkqIGFzLmggKGBzZWdfbmFtZVtdJyBkZWNsYXJhdGlvbik6ICBwb2ludGVycyB0byBjb25zdCBjaGFyOwotCShzdHJ1Y3QgX3BzZXVkb190eXBlLCBmaWVsZCBgcG9jX25hbWUnKTogIHBvaW50ZXIgdG8gY29uc3QgY2hhci4KLQkqIHN1YnNlZ3MuYyAoYHNlZ19uYW1lW10nIGRlZmluaXRpb24pOiAgZGl0dG87Ci0JKiBoYXNoLmMgKGhhc2hfYXNrKTogIHJlbmFtZSBhcmd1bWVudCBgYWNjZXNzJyB0byBgYWNjZXNzX3R5cGUnCi0JdG8gYXZvaWQgc2hhZG93aW5nIGxpYnJhcnkgZnVuY3Rpb24uCi0JKiB3cml0ZS5jICh2YXJpYWJsZSBgdGhlX29iamVjdF9maWxlJyk6ICBtb3ZlIGZyb20gZmlsZSBzY29wZQotCXRvIGJsb2NrIHNjb3BlIHdpdGhpbiB3cml0ZV9vYmplY3RfZmlsZSgpOyBmcmVlIGl0IGFmdGVyIHVzZTsKLQkoZml4dXBfc2VnbWVudCk6ICBjb25kaXRpb25hbGx5IGV4Y2x1ZGUgaXQgZm9yIE9CSl9WTVMuCi0JKGN2dF9mcmFnX3RvX2ZpbGwpOiAgcmVuYW1lIGFyZ3VtZW50IGBoZWFkZXJzJyB0byBgaGVhZGVyc1AnCi0JdG8gYXZvaWQgc2hhZG93aW5nIGZpbGUgc2NvcGUgdmFyaWFibGUuCi0KLU1vbiBKYW4gMjMgMjE6NDI6MzkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICdEJyk6IEZpeCB0eXBvIHdoaWNoIGNhdXNlZAotCW1pc2NvbXBpbGF0aW9uIG9mICJkaWFnIiBpbnN0cnVjdGlvbnMuCi0KLU1vbiBKYW4gMjMgMTU6NTE6NDEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQotTW9uIEphbiAyMyAxNDowNzo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5oICh0Y19pbml0X2FmdGVyX2FyZ3MpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtc2guYyAobWRfYmVnaW4pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHRhYmxlLgotCShtZF9hc3NlbWJsZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgcC4KLQkobWRfY29udmVydF9mcmFnKTogQ2FzdCBmcl9hZGRyZXNzIHRvIHVuc2lnbmVkIGxvbmcgZm9yIHByaW50Zi4KLQkobWRfYXBwbHlfZml4KTogVXNlIGFzX3dhcm5fd2hlcmUgcmF0aGVyIHRoYW4gYXNfd2Fybi4KLQkoc2hfaW5pdF9hZnRlcl9hcmdzKTogUmVtb3ZlIGVtcHR5IGZ1bmN0aW9uLgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1nbnUqZWxmKik6IE5ldyB0YXJnZXQuCi0KLVNhdCBKYW4gMjEgMTk6MDI6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tPgotCi0JKiBoYXNoLmMgKGhhc2hfYXNrKTogSWYgd2UgZmluZCB0aGUgc2xvdCBhZnRlciB3cmFwcGluZyBhcm91bmQsCi0JYnJlYWsgb3V0IG9mIHRoZSBsb29wLiAgRml4ZXMgYnVnIGluIEphbiAxOCBjaGFuZ2UuCi0KLUZyaSBKYW4gMjAgMTc6MDc6MzEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogaGFzaC5jIChoYXNoX2NvZGUpOiBVbmRvIGxhc3QgY2hhbmdlLgotCi1UaHUgSmFuIDE5IDE0OjQ5OjQ3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9pcCk6IEluaXRpYWxpemUgbG9jYWwgdmFyaWFibGVzIHRvIGtlZXAKLQlnY2MgcXVpZXQuCi0JKGdwZGlzcF9oaTE2X2hvd3RvKTogRG9uJ3QgdXNlICJjb25zdCIgd2l0aCByZWxvY19ob3d0b190eXBlLgotCShpbl9yYW5nZV9zaWduZWQpOiBBZGQgcGFyZW5zIGFyb3VuZCBzdWJ0cmFjdGlvbiBpbnNpZGUgc2hpZnQuCi0JKiBnYXNwLmMgKGRvX2RhdGEpOiBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlICJvcG5hbWUiLgotCShpc3RydWUpOiBQcm92aWRlIGEgZGVmYXVsdCBjYXNlIHRvIHNldCAicmVzIiBhbmQga2VlcCAiZ2NjIC1XYWxsIgotCXF1aWV0LgotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBEZWxldGVkIHVudXNlZCB2YXJpYWJsZS4KLQkocHJpbnRfc3ltYm9sX3ZhbHVlXzEpOiBEZWNsYXJlLgotCSogaGFzaC5jIChoYXNoX2Fzayk6IERlbGV0ZSBkaXNhYmxlZCBub24tc3RyY21wIHZlcnNpb24gb2YgdGhlCi0JY29kZSwgYW5kIGF1dG9tYXRpYyB2YXJpYWJsZXMgdXNlZCBvbmx5IGluIHRob3NlIHNlY3Rpb25zLgotCSogd3JpdGUuYyAoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSk6IE9ubHkgZGVmaW5lIGxvY2FsIHZhcmlhYmxlCi0JInByZXZfZml4IiBpZiBCRkRfQVNTRU1CTEVSLgotCSogZmxvbnVtLWtvbnN0LmMgKGR1bW15MSk6IFJldHVybiB2b2lkLgotCSogY29uZmlnL3RjLXZheC5jIChtZF9hc3NlbWJsZSk6IFJlbW92ZSB0d28gY29tcGFyaXNvbnMgb2YKLQl1bnNpZ25lZCBudW1iZXJzIHZlcnN1cyB6ZXJvLgotCSogYXMuaCAoYmNvcHkpOiBJZiBuZWl0aGVyIG1lbWNweSBub3IgYmNvcHkgaXMgZGVmaW5lZCBhcyBhIG1hY3JvLAotCWRlZmluZSB0byB1c2UgbWVtY3B5LgotCi0JKiBjb25maWcvdGMtYWxwaGEuYywgY29uZmlnL2FscGhhLW9wY29kZS5oOiBSZXZlcnQgMiBKdW5lIGNoYW5nZXMuCi0JVHVybnMgb3V0IHdlIG5ldmVyIGdvdCB0aGUgYXNzaWdubWVudCBkb25lIGFmdGVyIGFsbC4KLQotCUNsZWFudXAgb2YgVkFYIGFuZCBWTVMgY29kZSwgZnJvbSBQYXQgUmFua2luOgotCSogY29uZmlnL29iai12bXMuYzogQ2hhbmdlZCBleHBvcnRlZCBmdW5jdGlvbiBuYW1lcyB0byBsb3dlciBjYXNlLgotCShDaGFuZ2VkIGNhbGwgc2l0ZXMgaW4gd3JpdGUuYy4pICBEZWNsYXJlIFZNUyBzeXN0ZW0gZnVuY3Rpb24KLQluYW1lcyB1c2VkLCBjb25kaXRpb25hbCBvbiBhY3R1YWxseSBiZWluZyBvbiBWTVMuICBDaGFuZ2VkIG1hbnkKLQlmdW5jdGlvbnMgdGhhdCByZXR1cm5lZCBubyB1c2VmdWwgdmFsdWUgdG8gbm93IGJlIGRlY2xhcmVkIHRvCi0JcmV0dXJuIHZvaWQuICBSZW1vdmVkIG1hbnkgdW51c2VkIHZhcmlhYmxlcy4gIFN1cHBseSBtaXNzaW5nCi0JcmV0dXJuIHN0YXRlbWVudHMgb3IgdmFsdWVzLiAgU3VwcGx5IGBkZWZhdWx0JyBjYXNlIGluIHN3aXRjaAotCXN0YXRlbWVudHMuICBFbnN1cmUgbG9jYWwgdmFyaWFibGVzIGdldCBpbml0aWFsaXplZC4KLQkqIGNvbmZpZy90Yy12YXguYzogTWlub3IgY2hhbmdlcyB0byBzaWxlbmNlICJnY2MgLVdhbGwiLgotCSogY29uZmlnL29iai12bXMuaCwgY29uZmlnL3RjLXZheC5oOiBBZGRlZCBzb21lIG1pc3NpbmcKLQlkZWNsYXJhdGlvbnMuCi0KLVdlZCBKYW4gMTggMTM6NDk6MjYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYXRvZi1nZW5lcmljLmMgKGZsb251bV9wcmludCkgW1RSQUNFXTogTmV3IGZ1bmN0aW9uLgotCShhdG9mX2dlbmVyaWMpIFtUUkFDRV06IFByaW50IG11bHRpcGxpZXIgYmVmb3JlIG11bHRpcGxpY2F0aW9uLAotCWFuZCBwcmludCBtdWx0aXBsaWNhdGlvbiByZXN1bHQgYmVmb3JlIGFuZCBhZnRlciBjb3B5LgotCi0JKiBmbG9udW0tbXVsdC5jIChmbG9udW1fbXVsdGlwKTogQXZvaWQgc2lnbiBleHRlbnNpb24gcHJvYmxlbXMKLQlhcm91bmQgbXVsdGlwbGljYXRpb24gb3BlcmF0aW9uLgotCi0JKiBhdG9mLWdlbmVyaWMuYyAoQVNTVU1FX0RFQ0lNQUxfTUFSS19JU19ET1QpOiBEZWZpbmUuCi0JKGF0b2ZfZ2VuZXJpYykgW0FTU1VNRV9ERUNJTUFMX01BUktfSVNfRE9UXTogQ2hlY2sgZm9yICcuJwotCWV4cGxpY2l0bHkgaW5zdGVhZCBvZiBjYWxsaW5nIHN0cmNoci4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogV2hlbiBzY2FubmluZyBzdWNjZXNzaXZlIG9wY29kZQotCXRhYmxlIGVudHJpZXMsIGNoZWNrIG5hbWVzIGZvciBwb2ludGVyIGVxdWFsaXR5IGJlZm9yZSBkb2luZwotCXN0cmluZyBjb21wYXJpc29ucy4KLQotCSogaGFzaC5jIChoYXNoX2Fzayk6IENhbGwgc3RyY21wIGluc3RlYWQgb2YgZXhwYW5kaW5nIGl0IGlubGluZS4KLQkoaGFzaF9jb2RlKTogUmVwbGFjZWQgd2l0aCBhIHZlcnNpb24gZnJvbSBiZmQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIENPRkZfRkxBR1MgaXNuJ3QKLQlkZWZpbmVkLCBkZWZhdWx0IGl0IHRvIHplcm8uCi0KLVdlZCBKYW4gMTggMTI6MTY6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogQ2xlYXIgZnhfYnNyIG9uIHRob3NlIHRhcmdldHMgd2hpY2gKLQl1c2UgaXQuCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IFBhcmVudGhlc2l6ZSAmJiB3aXRoaW4gfHwuCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbmV3bGluZSk6IExpa2V3aXNlLgotCShsaXN0X3N5bWJvbF90YWJsZSk6IFVzZSAlbHUgdG8gcHJpbnQgc2l6ZW9mLgotCSogc3ltYm9scy5jOiBDb21tZW50IG91dCB1bnVzZWQgZnVuY3Rpb24gaW5kZW50LgotCShwcmludF9zeW1ib2xfdmFsdWVfMSk6IENhc3QgcG9pbnRlciB0byB1bnNpZ25lZCBsb25nIGZvciBwcmludGYuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IE9ubHkgZGVjbGFyZSBzeW1ib2xfcHRyIGlmIGl0Ci0Jd2lsbCBiZSB1c2VkLgotCSogY29uZmlnL3RjLWg4MzAwLmMgKG1kX2JlZ2luKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSByZWcuCi0JKGdldF9vcGVyYW5kKTogRGVjbGFyZSB0eXBlIG9mIHBhcmFtZXRlciBkaXJlY3Rpb24uICBSZW1vdmUgdW51c2VkCi0JdmFyaWFibGUgc2l6ZS4KLQkoZ2V0X3NwZWNpZmljKTogRml4IGNvbW1lbnQgdG8gYXZvaWQgbmVzdGVkIGNvbW1lbnRzLgotCShjaGVja19vcGVyYW5kKTogQ2FzdCBYX2FkZF9udW1iZXIgdG8gdW5zaWduZWQgbG9uZyBmb3IgcHJpbnRmLgotCShidWlsZF9ieXRlcyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGVzIG91dHB1dF9wdHIsIHBhcnQsIGFuZAotCWhpZ2guCi0JKGJ1aWxkX2J5dGVzKTogQ2FzdCBYX2FkZF9udW1iZXIgdG8gdW5zaWduZWQgbG9uZyBmb3IgcHJpbnRmLgotCShjbGV2ZXJfbWVzc2FnZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgc2Nhbi4KLQkobWRfYXNzZW1ibGUpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGkuCi0JKHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9uLgotCSogdGMtaDgzMDAuaCAodGNfcmVsb2NfbWFuZ2xlKTogRGVjbGFyZS4KLQotVHVlIEphbiAxNyAxMDo1ODowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfNDY1MCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2JlZ2luKTogSGFuZGxlIGEgY3B1IHN0cmluZyBvZiAiNDY1MCIuICBJZiBtaXBzXzQ2NTAgd2FzIG5vdAotCWluaXRpYWxpemVkLCBzZXQgaXQgdG8gMC4KLQkoYXBwZW5kX2luc24pOiBEb24ndCBpbnNlcnQgbm9wcyBhcm91bmQgSEkgYW5kIExPIG9uIGEgNDY1MC4KLQkobWlwc19lbWl0X2RlbGF5cyk6IExpa2V3aXNlLgotCShtaXBzX2lwKTogVXNlIElOU05fSVNBIG1hc2sgdG8gY2hlY2sgSVNBIG9mIGluc3RydWN0aW9uLiAgQ2hlY2sKLQlmb3IgSU5TTl80NjUwLgotCShtZF9sb25nb3B0cyk6IEFkZCBtNDY1MCBhbmQgbm8tbTQ2NTAuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSBtaXBzLWNwdT00NjUwLiAgSGFuZGxlIC1tNDY1MCBhbmQKLQktbm8tbTQ2NTAuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgbmV3IE1JUFMgb3B0aW9ucy4KLQotU2F0IEphbiAxNCAyMzo0ODoxMyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bqb25ueT4KLQotCSogY29uZmlnL3RjLXc2NS5jLCBjb25maWcvdGMtdzY1LmgsIGNvbmZpZy93NjUubXQ6IE5ld2ZpbGVzLgotCSogY29uZmlnL29iai1jb2ZmLmg6IENvcGUgd2l0aCB3NjUuCi0JKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIHc2NS4KLQotVGh1IEphbiAxMiAxNzo1NjoyNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKSBbX19HTlVDX18gJiYgX19PUFRJTUlaRV9fXTogSWYgYGdldCcKLQlmdW5jdGlvbiBpcyBzY3J1Yl9mcm9tX2ZpbGUsIGNhbGwgc2NydWJfZnJvbV9maWxlIGRpcmVjdGx5LCBhbmQKLQlnZXQgZ2NjJ3MgaW5saW5pbmcgY2FwYWJpbGl0eSBpbnRvIHRoZSBhY3QuCi0KLQkqIE1ha2VmaWxlLmluIChWTVNfT1RIRVJfT0JKUyk6IEFkZCAuLi9saWJpYmVydHkvaGV4Lm8uCi0JKE9CSlMpOiBEZWxldGUgaGV4LXZhbHVlLm8uCi0JKFJFQUxfU09VUkNFUyk6IERlbGV0ZSBoZXgtdmFsdWUuYy4KLQkoaGV4LXZhbHVlLm8pOiBEZWxldGUgZGVwZW5kZW5jaWVzLgotCSogaGV4LXZhbHVlLmM6IERlbGV0ZWQuCi0JKiBhcy5jIChtYWluKTogQ2FsbCBoZXhfaW5pdC4KLQkqIGV4cHIuYywgY29uZmlnL3RjLW1pcHMuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4gIFJlcGxhY2UKLQloZXhfdmFsdWUgYXJyYXkgcmVmZXJlbmNlcyB3aXRoIGhleF8qIG1hY3Jvcy4KLQotV2VkIEphbiAxMSAxNzo1MTozOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaDgzMDAuaCAoQ09GRl9GTEFHUyk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy90Yy1oODUwMC5oIChDT0ZGX0ZMQUdTKSwgY29uZmlnL3RjLXNoLmggKENPRkZfRkxBR1MpLAotCWNvbmZpZy90Yy16OGsuaCAoQ09GRl9GTEFHUyk6IERpdHRvLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoS0VFUF9SRUxPQ19JTkZPKTogTWFrZSBzdXJlIGl0J3MgYWx3YXlzCi0JZGVmaW5lZC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCwgY2FzZXMgQU9GRiBhbmQgQUlOREVYKTogRG9uJ3QKLQlnZW5lcmF0ZSA2ODAyMCBhZGRyZXNzaW5nIG1vZGVzIGZvciBhIDY4MDAwIHByb2Nlc3Nvci4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIGNhc2VzIFBDUkVMIGFuZCBQQ0xFQSk6IERpdHRvLgotCi1UdWUgSmFuIDEwIDEzOjM0OjE0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERvbid0IHRyZWF0IGg4MzAwIGFuZCB6OGsKLQlzcGVjaWFsbHkgd2l0aCByZWdhcmQgdG8gZml4dXBzLgotCi1Nb24gSmFuICA5IDE2OjIyOjI4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKFJFTEFYX1JFTE9DMSwgUkVMQVhfUkVMT0MyKTogQ2FzdCB2YWx1ZXMgdG8KLQliZmRfdm1hIGJlZm9yZSBzdWJ0cmFjdGluZy4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHNpemVfc2VjdGlvbik6IEhhbmRsZSByc19zcGFjZSBsaWtlIHJzX2ZpbGwsCi0JYnV0IG1ha2Ugc3VyZSBmcl9zeW1ib2wgaXMgbnVsbC4KLQkoZmlsbF9zZWN0aW9uKTogRGl0dG8uCi0KLVN1biBKYW4gIDggMTY6MTQ6MTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRml4IGhhbmRsaW5nIG9mIGZsb2F0aW5nIHBvaW50Ci0JdmFsdWVzIHdoZW4gR1BPUFQgaXMgbm90IGRlZmluZWQuCi0KLUZyaSBKYW4gIDYgMTY6NTk6NDEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2FzcC5jOiBJbmNsdWRlIHN0cmluZy5oLiAgUHV0IGNvbmZpZy5oIGJlZm9yZSBvdGhlciBpbmNsdWRlcy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2lwKTogRGVsYXkgY2FsbHMgdG8gZW1pdF9hZGQ2NCB1bnRpbAotCWFmdGVyIGFueSByZW1haW5pbmcgb3BlcmFuZHMgYXJlIGFsc28ga25vd24gdG8gbWF0Y2guCi0KLUZyaSBEZWMgMzAgMTg6MjE6NDEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IEJ1aWxkIGEgZm9ybWF0IHN0cmluZyBiYXNlZCBvbgotCXRoZSBzaXplIG9mIHRoZSB2YWx1ZSB0byBiZSBwcmludGVkLCBhcyBsb25nIGFzICJ1bnNpZ25lZCBsb25nIiBpcwotCWF0IGxlYXN0IGFzIHdpZGUsIGFmdGVyIGhhbmRsaW5nIHRoZSBzcGVjaWFsIGNhc2Ugb2YgNC1ieXRlCi0JdmFsdWVzLgotCi0JKiBNYWtlZmlsZS5pbiAoZGVwZW5kZW5jaWVzKTogTWFrZSAkKE9CSlMpIGRlcGVuZCBvbiBhcy5oIGFuZAotCWV2ZXJ5dGhpbmcgaXQgaW5jbHVkZXMuICBEZWxldGUgdGhvc2UgZmlsZXMgZnJvbSBwZXItZmlsZQotCWRlcGVuZGVuY2llcy4KLQotCSogYXMuaCAocmVsYXhfc3Vic3RhdGVUKTogTm93IGRlZmluZWQgdG8gYmUgdW5zaWduZWQgaW50LgotCShyZWxheF9zdGF0ZVQpOiBTZXBhcmF0ZSB0eXBlZGVmIGZyb20gZW51bSBkZWZpbml0aW9uLgotCShlbnVtIF9yZWxheF9zdGF0ZSk6IFJlb3JkZXJlZCBmb3IgYmV0dGVyIHB1bmN0dWF0aW9uLiAgQWRkZWQgbmV3Ci0JdmFsdWVzIHJzX2FsaWduX2NvZGUgYW5kIHJzX3NwYWNlLgotCShsaW5lbm8sIHN0cnVjdCBsaW5lbm9fc3RydWN0KTogVW51c2VkLCBkZWxldGVkLgotCi0JKiBhcy5oOiBObyBsb25nZXIgaW5jbHVkZSBhc3NlcnQuaC4KLQkoYXNfYXNzZXJ0KTogRGVjbGFyZS4KLQkoYXNzZXJ0KTogTmV3IGRlZmluaXRpb24sIGNhbGxzIGFzX2Fzc2VydCBsb25nZXIgbmVlZGVkLgotCShfX1BSRVRUWV9GVU5DVElPTl9fKTogUHJvdmlkZSBkZWZhdWx0IGZvciBvbGRlciB2ZXJzaW9ucyBvZiBnY2MuCi0JKiBtZXNzYWdlcy5jIChhc19hc3NlcnQpOiBOZXcgZnVuY3Rpb24uCi0JKiBnZGJpbml0LmluOiBQdXQgYSBicmVha3BvaW50IHRoZXJlLgotCi0JKiByZWFkLmMgKHNfc3BhY2UpOiBSZXdyaXRlIHRvIGhhbmRsZSBnZW5lcmFsIGV4cHJlc3Npb25zLgotCUdlbmVyYXRlIHJzX3NwYWNlIGZyYWdzIGZvciBub24tY29uc3RhbnQgdmFsdWVzLgotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCk6IFRyZWF0IHJzX2FsaWduX2NvZGUgYW5kIHJzX3NwYWNlCi0JbGlrZSByc19hbGlnbiBhbmQgcnNfb3JnLiAgVmVyaWZ5IHRoYXQgZnJfb2Zmc2V0IGlzIG5vbi1uZWdhdGl2ZSwKLQlhbmQgZm9yY2UgZnJhZyB0eXBlIHRvIHJzX2ZpbGwgb25seSBhZnRlciBhc3NlcnRpb24gY2hlY2tzLgotCShyZWxheF9zZWdtZW50KTogVHJlYXQgcnNfYWxpZ25fY29kZSBsaWtlIHJzX2FsaWduLiAgVHJlYXQKLQlyc19zcGFjZSBsaWtlIHJzX29yZyBpbiB0aGUgZmlyc3Qgc3dpdGNoOyBpbiB0aGUgc2Vjb25kLCBmb3JjZSB0aGUKLQlvcGVyYW5kIHRvIGEgY29uc3RhbnQsIGFuZCB1c2UgaXQgZm9yIHRoZSBncm93dGggc2l6ZS4KLQotV2VkIERlYyAyOCAyMDo1NzozNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3Vic3BhY2UpOiBGb3Igc2VjdGlvbnMgd2l0aCB0aGUgWkVSTwotCWF0dHJpYnV0ZSwgc2V0IHRoZSAiYnNzIiBmaWVsZCBpbiB0aGUgYXBwcm9wcmlhdGUgc2VnaW5mbyBzdHJ1Y3R1cmUuCi0KLVdlZCBEZWMgMjggMTU6MDE6MDEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogc3Vic2Vncy5oOiBJbmNsdWRlIG9ic3RhY2suaC4KLQotVHVlIERlYyAyNyAxODoxNjowNCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhcy5oIChzdHJ1Y3QgZnJhZyk6IEVuYWJsZSBhbGlnbiogY29tcG9uZW50cyBub3cuCi0KLVR1ZSBEZWMgMjAgMTQ6NTY6MzEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZnJhZ3MuYyAoZnJhZ19pbml0KTogQ2FsbCBvYnN0YWNrX2JlZ2luIG9uIGBmcmFncycuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ3NfYmVnaW4pOiBEb24ndCBkbyBpdCBoZXJlLgotCSogYXMuYyAobWFpbik6IENhbGwgZnJhZ19pbml0IGJlZm9yZSBzdWJzZWdzX2JlZ2luLgotCi0JKiBmcmFncy5jIChmcmFnX2FwcGVuZF8xX2NoYXIpOiBOZXcgZnVuY3Rpb24uCi0JKiBmcmFncy5oIChmcmFnX2FwcGVuZF8xX2NoYXIpOiBEZWNsYXJlIGl0LgotCShGUkFHX0FQUEVORF8xX0NIQVIpOiBDYWxsIGl0LiAgT2xkIGRlZmluaXRpb24gaXMgY29tbWVudGVkIG91dAotCWZvciBub3cuCi0KLQkqIGFzLmggKHN0cnVjdCBmcmFnKTogQWRkZWQgKGJ1dCBjb21tZW50ZWQgb3V0KSBuZXcgZmllbGRzIGZvcgotCXRyYWNraW5nIGN1cnJlbnQgYWxpZ25tZW50LgotCShmcmFnX25vd19maXgpOiBDaGFuZ2VkIG1hY3JvIHRvIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgotCSogZnJhZ3MuYyAoZnJhZ19ub3dfZml4KTogRGVmaW5lIGZ1bmN0aW9uIGhlcmUuCi0JKGZyYWdfbmV3KTogVXNlIGl0IGluc3RlYWQgb2YgYWNjZXNzaW5nIGBmcmFncycgZGlyZWN0bHkuCi0JKiBmcmFncy5oIChmcmFncyk6IENoYW5nZSBjb21tZW50IHRvIGluZGljYXRlIGl0IHNob3VsZG4ndCBiZQotCWFjY2Vzc2VkIGRpcmVjdGx5LgotCSogc3Vic2Vncy5oIChzdHJ1Y3QgZnJjaGFpbik6IE5ldyBmaWVsZCBmcmNoX29ic3RhY2ssIGludGVuZGVkIHRvCi0JZXZlbnR1YWxseSByZXBsYWNlIGdsb2JhbCBgZnJhZ3MnIG9ic3RhY2suCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IFVzZSBmcmFnX25vd19maXggaW5zdGVhZCBvZgotCWFjY2Vzc2luZyBgZnJhZ3MnIGRpcmVjdGx5LiAgSW5pdGlhbGl6ZSBmaWVsZHMgb2YgbmV3IGZyY2hhaW5TCi0JZXhwbGljaXRseSBpbnN0ZWFkIG9mIHdpdGggbWVtc2V0LgotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2xuKSBbIUJGRF9BU1NFTUJMRVJdOiBVc2UKLQlmcmFnX25vd19maXguCi0JKiBjb25maWcvdGMtbWlwcy5jIChzX2xvYyksIGNvbmZpZy9vYmotdm1zLmMKLQkodm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmKSwgc3ltYm9scy5jIChjb2xvbik6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMik6IFVzZSBvZmZzZXRUIGFuZCBhZGRyZXNzVAotCWluc3RlYWQgb2YgbG9uZyBhbmQgdW5zaWduZWQgbG9uZy4KLQkobWRfYXBwbHlfZml4KTogQ2FzdCB2YWx1ZSBiZWZvcmUgcGFzc2luZyBpdC4KLQotCSogY29uZmlnL29iai1hb3V0LmgsIGNvbmZpZy9vYmotY29mZi5jLCBjb25maWcvb2JqLWVsZi5oLAotCWNvbmZpZy9vYmotc29tLmgsIGNvbmZpZy90Yy1oODUwMC5jLCBjb25maWcvdGMtaHBwYS5jLAotCWNvbmZpZy90Yy1ocHBhLmgsIGNvbmZpZy90Yy1zaC5jLCBjb25maWcvdGMtejhrLmM6IERvbid0IHJlbHkgb24KLQl1c2Ugb2YgIi4uIiB3aGVuIGluY2x1ZGluZyBoZWFkZXIgZmlsZXMuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogUmVmb3JtYXQgY29uZGl0aW9uIGluIGFuIGBpZicKLQlzdGF0ZW1lbnQuCi0KLQkqIE1ha2VmaWxlLmluIChTVUJESVJfSU5DTFVERVMpOiBEZWxldGVkLgotCi1UdWUgRGVjIDIwIDEzOjQwOjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmg6IEluY2x1ZGUgYmZkL2xpYmNvZmYuaCwgbm90IGxpYmNvZmYuaC4KLQotTW9uIERlYyAxOSAxNjo1MzozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBSZXdyaXRlIHRvIGhhbmRsZSBPX2JpZyA2NCBiaXQKLQljb25zdGFudHMuCi0JKG1pcHNfaXApOiBBY2NlcHQgT19iaWcgY29uc3RhbnRzIGluIGNhc2UgJ0knLiAgQ2hhbmdlIGNhc2UKLQknaScvJ2onIHRvIHRyZWF0IGFuIE9fYmlnIGNvbnN0YW50IGFzIGFuIG91dCBvZiByYW5nZSB2YWx1ZS4KLQotTW9uIERlYyAxOSAxNDoxNTowNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3Vic3BhY2UpOiBNYWtlIHN1cmUgU0VDX0hBU19DT05URU5UUyBpcwotCWNsZWFyIGZvciBhIHNlY3Rpb24gd2l0aCB0aGUgIlpFUk8iIGF0dHJpYnV0ZS4KLQotCSogUmVkdWNlIHVzZWxlc3Mgc3ltYm9scyBmb3IgRUxGIGluIGFuIGF0dGVtcHQgdG8gbWFrZSBzbWFsbGVyCi0Jb2JqZWN0cyBhbmQgc3BlZWQgdXAgdGhlIGxpbmtlci4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHN0cnVjdCBjYWxsX2luZm8pOiBSZXBsYWNlIGVuZF9zeW1ib2wgZmllbGQKLQl3aXRoIGEgc2l6ZSBmaWVsZC4KLQkoaHBwYV9lbGZfbWFya19lbmRfZnVuY3Rpb24pOiBEZWxldGUgdW5uZWVkZWQgZnVuY3Rpb24uCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IEZvciB0aGUgMm5kIHVud2luZCByZWxvY2F0aW9uLCB1c2UKLQl0aGUgZnVuY3Rpb24gc3ltYm9sICsgZnVuY3Rpb24gc2l6ZSBpbnN0ZWFkIG9mIGEgc3BlY2lhbCBzeW1ib2wKLQlmb3IgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCi0JKHByb2Nlc3NfZXhpdCk6IENvbXB1dGUgdGhlIGZ1bmN0aW9uIHNpemUgaGVyZS4gIERvbid0IGNhbGwKLQlocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbiBhbnltb3JlLgotCShwYV9wcm9jZW5kKTogTGlrZXdpc2UuCi0JKGhwcGFfZml4X2FkanVzdGFibGUpOiBPbmx5IHJlamVjdCAzMmJpdCByZWxvY2F0aW9ucyBmb3IgU09NLgotCShlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogU2ltcGxpZnkuCi0KLU1vbiBEZWMgMTkgMTM6NDk6MDcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgbWlwcy1zb255LWJzZCBhbmQgbWlwcy1kZWMtYnNkLCBidXQKLQlyZWplY3Qgb3RoZXIgdmVuZG9ycyB1bnRpbCB3ZSBjYW4gYmUgc3VyZSB3ZSdyZSBjb25zaXN0ZW50IHdpdGgKLQliZmQuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKENyZWF0ZV9WTVNfT2JqZWN0X0ZpbGUpOiBJbnN0ZWFkIG9mIGZvcm1hdHRpbmcKLQlhIGJ1ZmZlciB0byBwYXNzIHRvIGBlcnJvcicsIGp1c3QgY2FsbCBgYXNfZmF0YWwnIGRpcmVjdGx5LgotCShWTVNfUHNlY3RfU3BlYyk6IERpdHRvLgotCShWTVNfVEJUX01vZHVsZV9CZWdpbiwgVk1TX1RCVF9Tb3VyY2VfRmlsZSwgZ2VuMSwKLQlWTVNfdHlwZWRlZl9wYXJzZSwgVk1TX0xTWU1fUGFyc2UsIFZNU19FbWl0X0dsb2JhbHZhbHVlcyk6IENhbGwKLQlhc190c2t0c2sgaW5zdGVhZCBvZiBwcmludGYuCi0JKFZNU19UQlRfTW9kdWxlX0JlZ2luLCBWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24sCi0JVk1TX1RCVF9Tb3VyY2VfRmlsZSwgVk1TX1RCVF9Tb3VyY2VfTGluZXMsCi0JVk1TX1N0b3JlX1JlcGVhdGVkX0RhdGEsIFZNU19DaGVja19Gb3JfTWFpbik6IFVzZSBleHBsaWNpdAotCWludGVnZXJzIHJhdGhlciB0aGFuIHNpemVvZiBleHByZXNzaW9ucyB1c2luZyBiYXNpYyBpbnRlZ2VyIHR5cGVzLAotCWluIGNhc2UgaG9zdCBhbmQgdGFyZ2V0IGFyZW4ndCB0aGUgc2FtZS4gIFVzZSBtZW1jcHkgb3IgQ09QWV8qCi0JbWFjcm9zIGluc3RlYWQgb2YgcG9zc2libHkgdW5hbGlnbmVkIHdvcmQgb3IgbG9uZ3dvcmQgYXNzaWdubWVudC4KLQotCSogY29uZmlnL29iai12bXMuaCAoT0JKX1NZTUZJRUxEX1RZUEUpOiBOZXcgbWFjcm8uCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UsCi0JVk1TX0NoZWNrX0Zvcl9NYWluLCBWTVNfd3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2Ugc3lfb2JqIGluc3RlYWQgb2YKLQlmb3JjaW5nIHN5X251bWJlciB0byBob2xkIGEgcG9pbnRlci4KLQotRnJpIERlYyAxNiAxNDo0MDoxNiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfYmVnaW4pOiBEb24ndCBmaWxsIGluIG1kX3JlbGF4X3RhYmxlIGhlcmUuCi0JKG1kX3JlbGF4X3RhYmxlKTogVXNlIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKHBhcnNlX2V4cCwgZ2V0X29wZXJhbmRzLCBjbGV2ZXJfbWVzc2FnZSwKLQltZF9hc3NlbWJsZSwgdGNfY3Jhd2xfc3ltYm9sX2NoYWluLCBtZF91bmRlZmluZWRfc3ltYm9sLAotCXRjX2hlYWRlcnNfaG9vaywgbWRfb3BlcmFuZCwgbWRfbnVtYmVyX3RvX2NoYXJzKTogRG9uJ3QgdXNlIERFRlVOLgotCi0JKiBNYWtlZmlsZS5pbiAoQ0hFQ0tGTEFHUyk6IERvbid0IHBhc3MgQVNfRk9SX1RBUkdFVCwKLQlDQ19GT1JfVEFSR0VULCBPQkpEVU1QX0ZPUl9UQVJHRVQsIE5NX0ZPUl9UQVJHRVQ7IHRoZXkncmUgbm90Ci0JdXNlZC4KLQkoQVNfRk9SX1RBUkdFVCwgQ0NfRk9SX1RBUkdFVCwgT0JKRFVNUCwgT0JKRFVNUF9GT1JfVEFSR0VULCBOTSwKLQlOTV9GT1JfVEFSR0VUKTogRG9uJ3QgZGVmaW5lLgotCShWTVNfT1RIRVJfT0JKUyk6IEFkZCB4bWFsbG9jLm8gYW5kIHhleGl0Lm8gZnJvbSBsaWJpYmVydHkuCi0JKHRvb2xkaXIpOiBVc2UgZXhlY19wcmVmaXgsIG5vdCBsaWJkaXIuCi0KLUZyaSBEZWMgMTYgMTE6MDc6MTAgMTk5NCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaDogSW5jbHVkZSBsaWJjb2ZmLmgsIG5vdCAuLi9iZmQvbGliY29mZi5oLgotCi0JKiBhcy5oOiBJbmNsdWRlIHByb2dyZXNzLmguCi0JKiBhcy5jIChtYWluKTogQ2FsbCBTVEFSVF9QUk9HUkVTUyBhbmQgRU5EX1BST0dSRVNTLgotCShtYWluLCBwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpOiBDYWxsIFBST0dSRVNTLgotCi1GcmkgRGVjIDE2IDAwOjQ2OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBVc2UgYmZkX2lzX3VuZF9zZWN0aW9uIGFuZAotCWJmZF9pc19hYnNfc2VjdGlvbiByYXRoZXIgdGhhbiBjb21wYXJpbmcgYWdhaW5zdCAmYmZkX3VuZF9zZWN0aW9uCi0JYW5kICZiZmRfYWJzX3NlY3Rpb24uCi0KLVRodSBEZWMgMTUgMTU6Mjc6MTQgMTk5NCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfYmVnaW4pOiBVc2UgYSBsb2NhbCB2YXJpYWJsZSB3aGVuCi0JaW5pdGlhbGl6aW5nIG1kX3JlbGF4X3RhYmxlIHRvIGF2b2lkIGVycm9ycyBhYm91dCBtb2RpZnlpbmcgYQotCWNvbnN0IGRhdGEgc3RydWN0dXJlLgotCi1UdWUgRGVjIDEzIDE1OjQyOjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jICh0Y19nZW5fcmVsb2MpOiBSZW1vdmUgT0JKX0VMRiBoYWNrIHdoaWNoCi0JYXBwZWFycyB0byBubyBsb25nZXIgYmUgbmVlZGVkLgotCi1UdWUgRGVjIDEzIDA4OjA0OjE1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBBY2NlcHQgQkZEX1JFTE9DX1BDUkVMKiB3aXRob3V0Ci0JcmVxdWlyaW5nIHRoYXQgdGhlIFhfb3Bfc3ltYm9sIGJlIGluIHRoZSB0ZXh0X3NlY3Rpb24uCi0JKG1hY3JvKTogQ2hhbmdlIHRoZSB0ZXN0IGZvciBhIGxlZ2VsIGV4cHJlc3Npb24gZGlmZmVyZW5jZSB0bwotCWNvcnJlc3BvbmQgdG8gY2hhbmdlcyBpbiBwc2V1ZG9fc2V0IGluIHJlYWQuYy4KLQotRnJpIERlYyAgOSAyMTowNDoxNyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpIFtSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEVdOiBVc2UKLQliZmRfaW5zdGFsbF9yZWxvY2F0aW9uLgotCi0JKiBlY29mZi5jIChlY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUpOiBJZiB0aGVyZSBpcyBubyBjdXJyZW50Ci0Jcm91dGluZSwganVzdCByZXR1cm4uCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9pcCwgY2FzZSAnQicsIHN1YmNhc2UgJ2MnKTogVXNlIG9wY29kZQotCXZhbHVlIGZyb20gcGF0dGVybiBpbnN0ZWFkIG9mIGFzc3VtaW5nIGpzci4KLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaCAoam1wKTogQWRkIGEgIjEsQmMiIGZvcm0uCi0KLVRodSBEZWMgIDggMTc6NDg6MjUgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE5NX0ZPUl9UQVJHRVQpOiBVc2UgLi4vYmludXRpbHMvbm0ubmV3LCBub3QganVzdAotCXBsYWluIG5tLgotCi0JKiBjb25maWd1cmUuaW4gKG5zMzJrLXBjNTMyLW1hY2gqKTogU2VsZWN0IGNvcnJlY3QgZW11bGF0aW9uLgotCShtaXBzLXNvbnktYnNkKik6IFVzZSBlY29mZi4KLQkobWlwcy0qLWdudSopOiBOZXcgdGFyZ2V0LCB1c2luZyBhb3V0IGZvcm1hdCwgZnJvbSBSb2xhbmQgTWNHcmF0aC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBOb3YgMjkgMTM6NTg6MTAgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCVVzZSBsaWJpYmVydHkgdmVyc2lvbiBvZiB4bWFsbG9jOgotCSogTWFrZWZpbGUuaW4gKFJFQUxfU09VUkNFUyk6IERlbGV0ZSB4bWFsbG9jLmMuCi0JKE9CSlMpOiBEZWxldGUgeG1hbGxvYy5vLgotCSh4bWFsbG9jLm8pOiBEZWxldGUgZGVwZW5kZW5jaWVzLgotCSogYXMuYyAobWFpbik6IENhbGwgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIG9uY2UgcHJvZ3JhbSBuYW1lIGlzCi0Ja25vd24uCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChpbl9yYW5nZV9zaWduZWQsIGluX3JhbmdlX3Vuc2lnbmVkKTogTmV3Ci0Jcm91dGluZXMsIHNwbGl0IGZyb20gaW5fcmFuZ2UuCi0JKGluX3JhbmdlKTogRGVsZXRlZC4gIEFsbCBjYWxscyBjaGFuZ2VkIHRvIGluX3JhbmdlXypzaWduZWQuCi0JKGNyZWF0ZV9saXRhX3NlY3Rpb24pOiBNYWNybyBkZWxldGVkLiAgU2luZ2xlIHVzZSBleHBhbmRlZCBpbgotCXBsYWNlLgotCShhbHBoYV9pcCk6IEhhbmRsZSBgdCcgYW5kIGA4JyBvcGVyYW5kIHR5cGVzLgotCShtZF9hcHBseV9maXgpOiBIYW5kbGUgQkZEX1JFTE9DXzEyX1BDUkVMLiAgUHJpbnQgbmFtZSBvZgotCXVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGVzLgotCSogY29uZmlnL2FscGhhLW9wY29kZS5oOiBBZGRlZCBIQUxUIGFuZCBEUkFJTkEuICBEaXNhYmxlZCBNT1ZJLAotCXNpbmNlIGl0IGRvZXNuJ3Qgd29yaywgYW5kIGlzbid0IHN1cHBvcnRlZCBieSB0aGUgbmF0aXZlCi0JYXNzZW1ibGVyLgotCi0JKiBpbnB1dC1zY3J1Yi5jOiBDaGFuZ2Ugd29yZGluZyBvZiBhIGNvbW1lbnQgdG8gYXZvaWQgaW50ZXJmZXJlbmNlCi0Jd2l0aCBDeWdudXMgc291cmNlLWNvbnRyb2wgdG9vbHMuCi0KLQkqIGFzLmggKGVycm5vKSBbTkVFRF9ERUNMQVJBVElPTl9FUlJOT106IERlY2xhcmUuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGluaXRfdGFibGUpOiBMaXN0IGJ1c2NyIGFuZCBwY3IgY29udHJvbAotCXJlZ2lzdGVycy4KLQkobTY4a19pcCwgY2FzZSAnSicpOiBIYW5kbGUgdGhlbS4KLQotCURlbGV0ZSBzaWduYWwgaGFuZGxlciBjb2RlLiAgSXQncyBiZWVuIGRpc2FibGVkIHNpbmNlIE1hcmNoIDE5OTMKLQl3aXRob3V0IGNvbXBsYWludHMuCi0JKiBhcy5jOiBEb24ndCBpbmNsdWRlIHNpZ25hbC5oLgotCShnb3Rfc2lnKTogVW51c2VkIGZ1bmN0aW9uIGRlbGV0ZWQsIGRlY2xhcmF0aW9uIGRlbGV0ZWQuCi0JKFNJR1RZKTogTWFjcm8gZGVsZXRlZC4KLQkobWFpbik6IERlbGV0ZWQgZGlzYWJsZWQgY29kZSBmb3IgZXN0YWJsaXNoaW5nIHNpZ25hbCBoYW5kbGVyLgotCi1Nb24gTm92IDI4IDExOjM3OjM1IDE5OTQgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBJbnNlcnQgbWlzc2luZyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCi0JbGlrZSB3YXJuaW5nIHNheXMgd2UgZG8uCi0KLU1vbiBOb3YgMjggMDA6MTE6MTUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKHBhX2NoZWNrX2VvZik6IERlY2xhcmUgbmV3IGV4dGVybiBmdW5jdGlvbi4KLQkodGNfZnJvYl9maWxlKTogRGVmaW5lIHRvIGNhbGwgcGFfY2hlY2tfZW9mLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSk6IE5ldwotCWZ1bmN0aW9uIHRvIHZlcmlmeSB0aGUgY3VycmVudCBzcGFjZSBhbmQgc3Vic3BhY2UgYXJlIHJlYXNvbmFibGUuCi0JQ2FsbCBmb3IgdGhlIGFwcHJvcHJpYXRlIHBzZXVkby1vcHMgYW5kIGJlZm9yZSBpbnN0cnVjdGlvbiBwYXJzaW5nLgotCShwYV9jaGVja19lb2YpOiBOZXcgZnVuY3Rpb24gdG8gdmVyaWZ5IGVudGVyL2V4aXQgYW5kIHByb2MvcHJvY2VuZAotCXBhaXJzIG1hdGNoIGF0IEVPRi4KLQkocGFfY29kZSk6IFNpbXBsaWZ5LgotCi0JKiBjb25maWcvb2JqLXNvbS5jOiBEZWxldGUgI2lmIDAgY29kZS4KLQotV2VkIE5vdiAyMyAxOTozNjowOSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoVEFSR0VUX0ZPUk1BVCk6IFNlbGVjdCBiZXR3ZWVuIGNvZmYtc2hsIGFuZAotCWNvZmYtc2guCi0JKiBjb25maWcvc2gubWggKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBHZXQgaXQgcmlnaHQuCi0JKiBjb25maWcvdGMtc2guYyAgKGxpdHRsZSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTm90aWNlIG5ldyBvcHRpb24uCi0JKGJ1aWxkX3JlbGF4LCBidWlsZF9NeXRlcywgbWRfYXRvZiwgbWRfY29udmVydF9mcmFnLCBtZF9hcHBseV9maXgpOgotCUNvcGUgd2l0aCBsaXR0bGUgZW5kaWFuIGRhdGEuCi0JKiBjb25maWcvdGMtc2guaCAoQ09GRl9NQUdJQywgTElTVElOR19IRUFERVIpOiBFbmRpYW4gZGVwZW5kZW50LgotCi1XZWQgTm92IDIzIDEwOjU0OjM4IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MsIEVMRiB2YXJpYW50KTogUmV2ZXJ0IGxhc3QKLQljaGFuZ2UuICBUaGUgcmVhbCBidWcgd2FzIGluIGJmZC9lbGZjb2RlLmggYW5kIGhhcyBiZWVuIGZpeGVkLgotCi1UdWUgTm92IDIyIDIzOjMxOjIwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MsIEVMRiB2YXJpYW50KTogQWRkIHNlY3Rpb24tPnZtYQotCXRvIHRoZSByZWxvY2F0aW9uJ3Mgb2Zmc2V0LgotCi1UdWUgTm92IDIyIDE0OjM3OjU4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1hGT1JNKTogRml4IHR5cG8uCi0KLVR1ZSBOb3YgMjIgMTA6MjM6MjUgMTk5NCAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoc19hbHBoYV9zZXQpOiBJZ25vcmUgdGhlIC5zZXQgKG5vKW1vdmUgYW5kCi0JICAuc2V0IChubyl2b2xhdGlsZSBkaXJlY3RpdmVzLgotCi1UdWUgTm92IDE1IDIxOjQ0OjEzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zdWJzcGFjZSk6IE1ha2Ugc3VyZSB0byBhbHdheXMgcmVzZXQKLQljdXJyZW50X3N1YnNwYWNlLgotCShwYV90ZXh0LCBwYV9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2FsaWduKTogTmV3IGZ1bmN0aW9uLiAgQWxpZ25zIHRoZSBjdXJyZW50Ci0Jb2Zmc2V0IHdpdGhpbiB0aGUgY3VycmVudCBzdWJzcGFjZSBhbG9uZyB3aXRoIHVwZGF0aW5nIHRoZQotCWFsaWdubWVudCBvZiB0aGUgc3Vic3BhY2UgaXRzZWxmLgotCShwYV9zdWJzcGFjZSk6IERlZmF1bHQgYWxpZ25tZW50IHRvIG9uZSBieXRlIHJhdGhlcm4gdGhhbiB6ZXJvCi0JYnl0ZXMgdG8gYXZvaWQgc2V0dGluZyBhbGlnbm1lbnQgdG8gbG9nMigwKS4KLQkobWRfcHNldWRvX3RhYmxlKTogVXNlIHBhX2FsaWdubWVudCBmb3IgLmFsaWduLgotCi1UdWUgTm92IDE1IDE1OjI0OjQ1IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG1lc3NhZ2VzLmMgKGFzX2ZhdGFsKTogQWx3YXlzIHB1dCBhIHNwYWNlIGFmdGVyICJmYXRhbCBlcnJvcjoiCi0Jd2hlbiBwcmludGluZyBtZXNzYWdlLgotCi1UdWUgTm92IDE1IDExOjEwOjQzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5oIChvYmpfZnJvYl9zeW1ib2wpOiBEZWxldGUuCi0JKHRjX2Zyb2Jfc3ltYm9sKTogTWFrZSBkZWZpbml0aW9uIGNvbmRpdGlvbmFsIG9uIE9CSl9TT00gb3IKLQlPQkpfRUxGLiAgRm9yIEVMRiBzdWJ0cmFjdCBvdXQgc3ltYm9sLT5zZWN0aW9uLT52bWEgZm9yIG5vbiBjb21tb24KLQlzeW1ib2xzLgotCi1XZWQgTm92ICA5IDE0OjUzOjAzIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90ZS1kZWx0YS5oOiBOZXcgZmlsZSwgZGVyaXZlZCBmcm9tIHRlLXN5c3YzMi5oLgotCi1XZWQgTm92ICA5IDExOjUyOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfYmYpOiBBbHdheXMgc2V0IGNvZmZfbGluZV9iYXNlLgotCi1Nb24gTm92ICA3IDAxOjU4OjQ5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogQnVtcCB0byAyLjUuMy4KLQotCSogY29uZmlndXJlLmluOiBDb21wYXJlIGdlbmVyaWMgY3B1IG5hbWUgYWdhaW5zdCAic3BhcmMiLCBub3QKLQkic3BhcmMqIiwgc2luY2Ugc3BhcmMgdmFyaWFudHMgc2hvdWxkIGJlIGNoYW5nZWQgdG8gInNwYXJjIi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgd2l0aCBhdXRvY29uZiAyLjEuCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKG9jdGFsLCB0b0hleCk6IFZhcmlhYmxlcyBkZWxldGVkLgotCShpc29jdGFsKTogTWFjcm8gZGVsZXRlZC4KLQkobWRfYmVnaW4pOiBEb24ndCBpbml0aWFsaXplIHRoZW0uCi0JKG1hY2hpbmVfaXAsIGNhc2UgJ1AnLydBJyk6IEZvciBhYnNvbHV0ZSBvcGVyYW5kLCBnZW5lcmF0ZSBhbgotCWVycm9yIG1lc3NhZ2UgaWYgaXQncyBvdXQgb2YgcmFuZ2UuCi0JKG1kX2FwcGx5X2ZpeCwgY2FzZSBSRUxPQ19KVU1QVEFSRyk6IENoZWNrIHJhbmdlIGZvciBQQy1yZWxhdGl2ZQotCWp1bXBzLgotCShtZF9hcHBseV9maXgpOiBEZWxldGUgY29kZSBpbnNpZGUgIiNpZiAwIi4KLQotVGh1IE5vdiAgMyAyMDoyMDo0MCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvZ28zMi5taDogVW51c2VkIGZpbGUgZGVsZXRlZC4KLQotCSogcmVhZC5jIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbik6IEluZGljYXRlIHRoYXQgdGhlIGVycm9yIG1heQotCW1lcmVseSBiZSB0aGF0IHRoZSBleHByZXNzaW9uIGNhbid0IGN1cnJlbnRseSBiZSByZWR1Y2VkLgotCi1UaHUgTm92ICAzIDE2OjA5OjU5IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0ZPUk1BVCk6IElmIFRFX05ldEJTRCBkZWZpbmUgYXMKLQkgICJhLm91dC1tNjhrLW5ldGJzZCIuCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0ZPUk1BVCk6IElmIFRFX05ldEJTRCBkZWZpbmUgYXMKLQkgICJhLm91dC1zcGFyYy1uZXRic2QiLgotCi0JKiBjb25maWcvdGUtbmJzZC5oOiBOZXcgZmlsZSwgTmV0QlNEIHRhcmdldCBlbXVsYXRpb24KLQkqIGNvbmZpZy90ZS1uZXRic2QuaDogUmVtb3ZlZC4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi1uZXRic2QqLG02OCotKi1uZXRic2QqLHNwYXJjKi0qLW5ldGJzZCopOgotCSAgU2V0IGJmZF9nYXMuICBVc2UgbmJzZCBlbXVsYXRpb24uCi0KLVRodSBOb3YgIDMgMTc6NDQ6NDcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCUNoYW5nZXMgZnJvbSBuZXQgMi41LjIgcmVsZWFzZSBicmFuY2g6Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUHV0IEFDX0RFRklORShzcGFyY3Y5KSBvbiBpdHMgb3duIGxpbmUsIHNvIHRoYXQKLQl0aGUgc2hlbGwgdmFyaWFibGUgc2V0dGluZ3MgYXNzb2NpYXRlZCB3aXRoIGl0IGFyZSBwZXJtYW5lbnQuICBGb3IKLQlDUFVzIHJlcXVpcmluZyBiZmRfZ2FzPXllcywgc2VsZWN0IGl0IGJhc2VkIG9uIENQVSBvbmx5LCBub3QKLQlpbmRpdmlkdWFsIHRhcmdldCBuYW1lcy4gIEhhbmRsZSBtNjhrLWhwLWhwdXgqLCBub3QganVzdCAtaHB1eC4KLQotCSogY29uZmlnL3RjLXo4ay5jICh0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBBZGQgZHVtbXkgYXJndW1lbnQKLQl0byBtYXRjaCBwcm90b3R5cGUgaW4gb2JqLWNvZmYuaC4KLQotCSogY29uZmlndXJlLmluOiBTa2lwIHRlc3RzIGZvciBkZWZpbmluZyBXQU5UX0ZPUEVOX0JJTiBhbmQKLQlJQk1fQ09NUElMRVJfU1VYLgotCSogYWNjb25maWcuaDogRGVsZXRlZCB0aGVtLgotCSogY29uZmlndXJlLCBjb25mLmluOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4wLgotCSogY29uZmlnL2dvMzIuY2ZnLCBjb25maWcvdm1zLWNvbmYuaDogVXBkYXRlZC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIsIG1kX2NvbnZlcnRfZnJhZ18xKTogQWx3YXlzIHVzZQotCUlCTV9DT01QSUxFUl9TVVggdmVyc2lvbiBvZiBjb2RlLCB3aXRoIGNvbW1lbnRzIGluZGljYXRpbmcgd2h5LgotCi0JKiBsaXN0aW5nLmMgKGZpbGVfaW5mbyk6IFVzZSB0ZXh0IG1vZGUgd2hlbiBvcGVuaW5nIGZpbGUgZm9yIHJlYWQuCi0JVXNlICJyIiBkaXJlY3RseSwgbm8gbWFjcm8uCi0JKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfb3Blbik6IERvbid0IHVzZSBGT1BFTl9SVCwganVzdCB1c2UKLQkiciIuCi0JKiByZWFkLmMgKHNfaW5jbHVkZSk6IERpdHRvLgotCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlKTogVHJ5IGJvdGggIndiIiBhbmQgInciLCBkb24ndAotCWJvdGhlciB3aXRoIEZPUEVOXyogbWFjcm9zLgotCSogYXMuaDogRG9uJ3QgaW5jbHVkZSBmb3Blbi0qLmguCi0KLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogTWFrZSAicmV0IiB3aXRoIG5vIG9wZXJhbmRzIGVxdWl2YWxlbnQgdG8KLQkicmV0IHplcm8sKHJhKSIsIHRvIG1hdGNoIE9TRjEgYW5kIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBib3RoCi0Jb25lLW9wZXJhbmQgZm9ybXMuCi0KLQlQYXRjaGVzIGZyb20gREogRGVsb3JpZToKLQkqIGFzLmggKGFsbG9jYSk6IHVuZGVmIGFsbG9jYSBiZWZvcmUgZGVmaW5pbmcgaXQganVzdCBpbiBjYXNlCi0JKiBjb25maWcvZ28zMi5jZmc6IG5ldyBmaWxlIGZvciBhdXRvY29uZiB2YWx1ZXMKLQkqIGNvbmZpZy90ZS1nbzMyLmg6IG5ldyBmaWxlCi0JKiBjb25maWd1cmUuYmF0OiBuZXcgZm9yIGF1dG9jb25mCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRml4IHR5cG8gaW4gR09UUEMgY2hlY2s7IGhhZCA9Ci0JZm9yID09LgotCi0JKiBjb25maWd1cmUuaW46IElmIHRhcmdldF9mcmFnIGRvZXNuJ3QgZXhpc3QsIHVzZSAvZGV2L251bGwuCi0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBGb3Igbm9uLVZNUyBzeXN0ZW1zLCByZS1hZGQgYHYnIHRvCi0Jc3RkX3Nob3J0b3B0cy4gIEFkZCAidmVyYm9zZSIgdG8gbGlzdCBvZiBsb25nIG9wdGlvbnMuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogV2hlbiBnZW5lcmF0aW5nIGFuIGFic29sdXRlIHNlY3Rpb24KLQlzeW1ib2wgYXMgYSBwbGFjZWhvbGRlciwgZG9uJ3QgbWFyayBpdCBhcyB1c2VkIGluIGEgcmVsb2NhdGlvbgotCWVudHJ5LCBoZXJlLgotCi0JKiBNYWtlZmlsZS5pbiAoY29tcGFyaXNvbik6IENvbXBhcmUgdXNpbmcgbWFrZWZpbGUgY29kZSBmcm9tIGdjYywKLQlzdHJpcHBlZCBkb3duIHRvIGRpc2NhcmQgc3ViZGlyIHN0dWZmIGFuZCBhZGFwdGVkIHRvIGdpdmUgYQotCW5vbi16ZXJvIGV4aXQgc3RhdHVzIGlmIGVpdGhlciBmaWxlIGRpZmZlcnMuCi0KLVRodSBOb3YgIDMgMTU6NDM6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX2FkZHJlc3MpOiBGaXggUkVMQVhfRU5DT0RFIGFyZ3VtZW50cyBmb3IKLQlOT19QSUMgY2FzZS4KLQotVHVlIE5vdiAgMSAxNjoxMDo1OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfY2hhbmdlX3NlYyk6IElmIG5vdCBHUE9QVCwgZG9uJ3QgcGVybWl0Ci0Jc3dpdGNoaW5nIHRvIHRoZSByZWFkb25seSBkYXRhIHNlY3Rpb24uCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV90eXBlKTogRml4IHdhcm5pbmcgbWVzc2FnZS4KLQotU3VuIE9jdCAzMCAwMDo1NzozNSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcHJvYyk6IERlbGV0ZSBkaXNhYmxlZCBjb2RlIHRvIHB1dCBlYWNoCi0JcHJvYyBpbiBpdHMgb3duIHN1YnNwYWNlLCB3ZSdyZSBub3QgZ29pbmcgdG8gdXNlIGl0LgotCi1UdWUgT2N0IDI1IDE0OjQ0OjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBFbnN1cmUgdGhhdCBtaXBzMiBjYXNlIG9mIE1fTElfREQgaW4KLQkucmRhdGEgZG9lcyBub3QgYmVjb21lIGEgdmFyaWFudCBmcmFnLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2NwdSk6IEluaXRpYWxpemUgdG8gLTEuCi0JKG1kX2JlZ2luKTogRG9uJ3QgbWlwc19jcHUgaWYgaXQgd2FzIGFscmVhZHkgc2V0LgotCShtZF9wYXJzZV9vcHRpb24pOiBGb3IgLW1pcHNOLCBkb24ndCBzZXQgbWlwc19jcHUgaWYgaXQgd2FzCi0JYWxyZWFkeSBzZXQuICBGb3IgLW1jcHU9LCBqdXN0IHNldCBtaXBzX2NwdSwgbm90IG1pcHNfaXNhLgotCi1GcmkgT2N0IDIxIDIwOjQyOjI5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcHNldWRvX3RhYmxlKTogSWYgT0JKX0VMRiwgaGFuZGxlIC5zZWN0aW9uLgotCShzX2VsZl9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBEb24ndCBhYm9ydCBpZiB3ZSBkb24ndCByZWNvZ25pemUKLQl0aGUgc2VjdGlvbiB3aGVuIHNldHRpbmcgdGhlIHN0b3JhZ2UgY2xhc3M7IGRlZmF1bHQgdG8gc2NfRGF0YS4KLQotVGh1IE9jdCAyMCAwMDo0MzozOCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogU2V0IG5ld192YWwgdG8gOCBmb3IgYWxsCi0JZml4dXBzIHRvIGJyYW5jaCBpbnN0cnVjdGlvbnMgKG5vdCBqdXN0IHBjLXJlbGF0aXZlIG9uZXMpIHdoaWNoCi0Jd2lsbCBnZW5lcmF0ZSBTT00gcmVsb2NhdGlvbnMuCi0KLVdlZCBPY3QgMTkgMTM6NDE6NTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYTI5ay5jOiBJbmNsdWRlIGN0eXBlLmggd2l0aCBhbmdsZSBicmFja2V0cy4KLQkoZGVmaW5lX3NvbWVfcmVncyk6IEFkZCBuZXcgc3BlY2lhbCByZWdpc3RlciBuYW1lcyBkZWZpbmVkIG9uIHRoZQotCTI5MDQwLgotCShwYXJzZV9vcGVyYW5kKTogQWRkIGFyZ3VtZW50IG9wdC4gIElmIG5vbi16ZXJvLCBkb24ndCB3YXJuIGFib3V0Ci0JYSBtaXNzaW5nIG9wZXJhbmQuCi0JKG1hY2hpbmVfaXApOiBJZiBoYW5kbGluZyBhcmd1bWVudCB0eXBlICdJJywgcGFzcyBvcHQgYXMgbm9uLXplcm8KLQl0byBwYXJzZV9vcGVyYW5kLiAgSGFuZGxlIG5ldyBvcHRpb25hbCBvcGVyYW5kIHR5cGUgJ0knLgotCShtZF91bmRlZmluZWRfc3ltYm9sKTogSGFuZGxlIHNwZWNpYWwgcmVnaXN0ZXIgbmFtZXMgKHNyTk4pLgotCi1UdWUgT2N0IDE4IDAwOjQ1OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAocmVudW1iZXJfc2VjdGlvbnMpOiBOZXcgc3RhdGljIEJGRF9BU1NFTUJMRVIgZnVuY3Rpb24uCi0JKHdyaXRlX29iamVjdF9maWxlKTogQ2FsbCBpdCBhZnRlciByZW1vdmluZyBnYXMgY3JlYXRlZCBzZWN0aW9ucy4KLQotTW9uIE9jdCAxNyAxODowNjowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2NyZWF0ZSk6IFVzZSB1ZGF0YS5wLCBub3QganVzdCB1ZGF0YS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lY29mZl9zZXRfZXh0KTogTGlrZXdpc2UuCi0JKGVsZl9nZXRfZXh0cik6IExpa2V3aXNlLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IFRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYXNfd2hlcmUgaXMKLQl1bnNpZ25lZCBpbnQgKiwgbm90IGludCAqLgotCi1Nb24gT2N0IDE3IDAyOjI2OjMyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBFbGltaW5hdGUgYWxsIHVzZXMgb2YgZnhfYWRkbnVtYmVyLgotCSh0Y19nZW5fcmVsb2MpOiBTaW1wbGlmeS4gIEl0J3Mgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byBzZXQgYQotCXJlbG9jJ3MgYWRkZW5kIGZpZWxkIHRvIHplcm8gZm9yIGZ1bmN0aW9uIHN5bWJvbHMuCi0JKG1kX2FwcGx5X2ZpeCk6IFNpbXBsaWZ5LiAgRm9yIGZpeHVwcyB3aGljaCB3aWxsIHJlcXVpcmUgYSBTT00KLQlyZWxvYywganVzdCBjbGVhciBvdXQgdGhlIG5lY2Vzc2FyeSBiaXRzIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotRnJpIE9jdCAxNCAxOTowNjo0NiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQklTT04pOiBVc2UgYmlzb24gLXksIG5vdCBiaXNvbi4KLQotVGh1IE9jdCAxMyAxOToyMjo1NCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZWQgdG8gMi41LgotCShjbGVhbi1oZXJlKTogRGVsZXRlIHN0YW1wLW1rLmNvbS4KLQkoZGlzdGNsZWFuKTogRGVsZXRlIC5nZGJpbml0LgotCSogVmVyc2lvbiAyLjUgcmVsZWFzZWQuCi0KLVdlZCBPY3QgMTIgMjA6MzA6NTEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RlLW5ic2Q1MzIuaDogUmVuYW1lZCBmcm9tIHRlLW5ldGJzZDUzMi5oLgotCSogY29uZmlndXJlLmluLCBjb25maWd1cmU6IEFkanVzdGVkLgotCi1XZWQgT2N0IDEyIDE2OjMzOjM4IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2NwbHVzLWRlbS5jOiBSZW1vdmVkLiAgSXQgaXNuJ3QgdXNlZC4gIEV2ZW4gaWYgaXQgd2FzLAotCSAgaXQncyBiZXR0ZXIgdG8gdXNlIHRoZSBvbmUgaW4gbGliaWJlcnR5LgotCi1XZWQgT2N0IDEyIDE4OjQ4OjM5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUsIGNhc2UgT19zeW1ib2wpOiBVbmRvIGxhc3QKLQljaGFuZ2U7IGl0IGJyZWFrcyB0aGUgcnM2MDAwIHN1cHBvcnQsIGFuZCBkb2Vzbid0IHNlZW0gdG8gYmUKLQluZWVkZWQuCi0KLVdlZCBPY3QgMTIgMTE6NTY6NTAgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaTM4Ni5oLHRlLW5ldGJzZDUzMi5oIChUQVJHRVRfRk9STUFUKTogQ2hhbmdlZCB0bwotCSAgYS5vdXQtPGFyY2g+LW5ldGJzZCB0byBtYXRjaCBjb3JyZXNwb25kaW5nIGNoYW5nZXMgaW4gQkZELgotCi1XZWQgT2N0IDEyIDExOjA2OjExIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZml4X2FkanVzdGFibGUpOiBSZXNvbHZlIHN5bWJvbCB2YWx1ZXMKLQlyYXRoZXIgdGhhbiBleHBsaWNpdGx5IGFkZGluZyB0aGUgZnJhZyBhZGRyZXNzLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBBZGQgYSB6ZXJvIGVudHJ5IHRvIG1hcmsKLQl0aGUgZW5kIG9mIHRoZSBsaW5lIG51bWJlcnM7IHRoaXMgcmVwbGFjZXMgdGhlIHplcm8gZW50cnkgd2hpY2gKLQl1c2VkIHRvIGJlIGFkZGVkIGJ5IGNvZmZfYWRkX2xpbmVzeW0sIHJlbW92ZWQgT2N0IDcuCi0JKGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyk6IElnbm9yZSBzZWN0aW9ucyB3aXRoIG5vIHNlZ2luZm8uCi0KLVdlZCBPY3QgMTIgMDE6NDE6MzcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcCwgYm9vdHN0cmFwMiwgYm9vdHN0cmFwMyk6IENyZWF0ZSBhCi0JInN0YWdlIiBzeW1saW5rIHRvIHRoZSBhcHByb3ByaWF0ZSBzdGFnZSogZGlyZWN0b3J5LCBhbmQgdXNlIGl0Ci0JaW5zdGVhZCBpbiB0aGUgLUIgb3B0aW9ucy4KLQkoY29tcGFyaXNvbik6IFJldmVydCB5ZXN0ZXJkYXkncyBjaGFuZ2UuCi0KLVR1ZSBPY3QgMTEgMTY6NDg6MTEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEZvciBub24tYS5vdXQgcmVsb2NhdGlvbnMsIGlmCi0JcGMtcmVsYXRpdmUsIHVzZSBmeF9vZmZzZXQgb25seSwgaWdub3JlIGFkZHJlc3Mgb2YgcmVsb2NhdGlvbi4KLQotVHVlIE9jdCAxMSAxNToyNDowMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBEb24ndCB1c2UgU19JU19MT0NBTCB3aGVuIGNoZWNraW5nCi0JZm9yIGFuIGVtYmVkZGVkIFBJQyBzd2l0Y2ggZXhwcmVzc2lvbiwgc2luY2UgdGhlIGRlZmluaXRpb24gb2YKLQlTX0lTX0xPQ0FMIHdhcyBjaGFuZ2VkLgotCi1UdWUgT2N0IDExIDE1OjA1OjExIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY29tcGFyaXNvbik6IFdoZW4gY29tcGFyaW5nIGFzLm5ldyBvciBnYXNwLm5ldywgdHJ5Ci0JcnVubmluZyB0aGUgYmluYXJ5IHRocm91Z2ggc2VkIHRvIGF2b2lkIGRpZmZlcmVuY2VzIGR1ZSB0bwotCSJzdGFnZTEiIG9yICJzdGFnZTIiIGhhdmluZyBiZWVuIHdyaXR0ZW4gaW50byB0aGUgYmluYXJ5LgotCi1TYXQgT2N0ICA4IDAxOjQ4OjA0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JRUxGIHN5bWJvbCBzaXplIGhhbmRsaW5nLCBiYXNlZCBvbiBjb2RlIGZyb20gRXJpYyBZb3VuZ2RhbGU6Ci0JKiBjb25maWcvb2JqLWVsZi5oIChPQkpfU1lNRklFTERfVFlQRSk6IE5ldyBtYWNyby4gIEFkZHMgYW4KLQlleHByZXNzaW9uIHBvaW50ZXIgdG8gdGhlIHN5bWJvbCBzdHJ1Y3R1cmUsIHVzZWQgZm9yIGBzaXplJwotCWV4cHJlc3Npb25zIHRoYXQgY291bGRuJ3QgYmUgcmVkdWNlZCB0byBjb25zdGFudHMgd2hlbiBpbml0aWFsbHkKLQlwcm9jZXNzZWQuCi0JKGVsZl9mcm9iX3N5bWJvbCk6IERlY2xhcmUuCi0JKG9ial9mcm9iX3N5bWJvbCk6IENhbGwgZWxmX2Zyb2Jfc3ltYm9sIGFsd2F5cywgcmF0aGVyIHRoYW4KLQllY29mZl9mcm9iX3N5bWJvbCBvbmx5IGlmIEVDT0ZGX0RFQlVHR0lORyBkZWZpbmVkLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX3N5bWJvbF9uZXdfaG9vayk6IERlbGV0ZWQgdW51c2VkIGNvZGUuCi0JQ2xlYXIgc3lfb2JqIGZpZWxkLgotCShvYmpfZWxmX3NpemUpOiBEZWxldGVkIHVudXNlZCBjb2RlLiAgSWYgc2l6ZSBpcyBub24tcmVkdWNpYmxlCi0JZXhwcmVzc2lvbiwgYWxsb2NhdGUgc29tZSBzdG9yYWdlIGZvciB0aGUgc3lfb2JqIGZpZWxkIGFuZCBjb3B5Ci0JdGhlIGV4cHJlc3Npb24uCi0JKGVsZl9mcm9iX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4gIENvbXB1dGVzIHNpemVzLCBjYWxscwotCWVjb2ZmX2Zyb2Jfc3ltYm9sIGlmIGFwcHJvcHJpYXRlLgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRm9yIGkzODYgZWxmIGFuZCBjb2ZmIChmb3Igbm93KSwgZG9uJ3QKLQlhZGQgaW4gdmFsdWUgb2Ygc3ltYm9sIGZyb20gYW5vdGhlciBkZWZpbmVkIHNlY3Rpb24gb2YgdGhlIGZpbGUuCi0KLUZyaSBPY3QgIDcgMTc6NTQ6MDIgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW04OGsuaCAoVENfS0VFUF9GWF9PRkZTRVQpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IFRlc3Qgb25seSBUQ19LRUVQX0ZYX09GRlNFVCwKLQlyYXRoZXIgdGhhbiBib3RoIGl0IGFuZCBUQ19NODhLLgotCShjb2ZmX2FkanVzdF9zZWN0aW9uX3N5bXMpOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfZnJvYl9zZWN0aW9uKTogRm9yIG5vbi1lbXB0eSBzZWN0aW9ucywgY3JlYXRlIGF1eCBlbnRyeSBmb3IKLQl0aGUgc2VjdGlvbiBzeW1ib2wsIGluZGljYXRpbmcgdGhlIHNpemUuCi0JKG5fbGluZV9ub3MpOiBOZXcgdmFyaWFibGUuCi0JKGFkZF9saW5lbm8pOiBJbmNyZW1lbnQgaXQuCi0JKGNvZmZfYWRkX2xpbmVzeW0pOiBJbmNyZW1lbnQgbl9saW5lX25vcywgZG9uJ3QgY2FsbCBhZGRfbGluZW5vLgotCShjb2ZmX2Zyb2JfZmlsZSk6IE5ldyBmdW5jdGlvbjsgbWFwIGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyBvdmVyCi0Jc2VjdGlvbnMuCi0JKG9ial9jb2ZmX2xpbmUpOiBPbmx5IHJlc2V0IGxpbmVfYmFzZSBmb3IgLmJmIHN5bWJvbHMuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zLCBjb2ZmX2Zyb2JfZmlsZSk6Ci0JRGVjbGFyZS4KLQkob2JqX2Zyb2JfZmlsZSk6IE5ldyBtYWNyby4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKTogUmVuYW1lZCBmcm9tCi0Jb2JqX2Zyb2JfZm9yd2FyZF9zeW1ib2wsIGFuZCByZXdyaXR0ZW4gZm9yIG5ldyBwYXJhbWV0ZXIgbGlzdC4KLQotCU1vbiBPY3QgIDMgMjE6MDI6MzggMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKFNfSVNfTE9DQUwpOiBmaXggb2Jzb2xldGUgZmxhZ3NlZW5bXSByZWZlcmVuY2UuCi0KLVdlZCBPY3QgIDUgMTE6NDk6MjYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBBY2NlcHQgLmVzaXplIGFuZCAuZXR5cGUKLQlhcyBzeW5vbnltcyBmb3IgLnNpemUgYW5kIC50eXBlLgotCi1XZWQgT2N0ICA1IDAwOjA4OjEwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zZWN0aW9uKTogUmVtb3ZlIGFzc2VydCBhYm91dAotCXNlY3Rpb24gYWxpZ25tZW50LgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBVc2Ugc2VjdGlvbiBhbGlnbm1lbnQsIG5vdAotCXh2ZWMgYWxpZ25fcG93ZXJfbWluIGZpZWxkLgotCi1GcmkgU2VwIDMwIDE5OjA1OjIwIDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiB2bXNjb25mLnNoIChtYWtlLWdhcy5jb20pOiBoYW5kbGUgRENMIHZlcmlmaWNhdGlvbiB0byBlbmFibGUKLQlzZW5zaWJsZSBmZWVkYmFjayB0byB0aGUgdXNlciB3aGlsZSBnYXMgaXMgYmVpbmcgYnVpbHQuCi0KLUZyaSBTZXAgMzAgMTY6MjM6MzEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IE5ldyB2YXJpYWJsZSwgbGlzdGluZyBvbmx5IG1ha2UtZ2FzLmNvbQotCWZvciBub3cuCi0JKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQ7IGJ1aWxkcyBESVNUU1RVRkYuCi0JKHJlYWxjbGVhbik6IFNlcGFyYXRlIHRhcmdldCwgZGVwZW5kIG9uIGNsZWFuIGFuZCBkaXN0Y2xlYW4sIHRoZW4KLQlkZWxldGUgRElTVFNUVUZGLgotCSogbWFrZS1nYXMuY29tOiBEZWxldGVkLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X3ZhbGlkYXRlX2ZpeCkgW0JGRF9BU1NFTUJMRVJdOiBOZXcKLQlmdW5jdGlvbi4gIENvbnZlcnRzIHJlbG9jIGZvciAiZm9vLUdPVCIgdG8gQkZEX1JFTE9DXzM4Nl9HT1RPRkYKLQlyZWxvYyBmb3IgImZvbyIuCi0JKGkzODZfb3BlcmFuZCk6IERvbid0IGxvb2sgdXAgc2VjdGlvbiBzeW1ib2wgZm9yCi0JdW5kZWZpbmVkX3NlY3Rpb24uCi0JKHJlbG9jKTogQWx3YXlzIHBlcm1pdCByZXR1cm4gb2YgOC0gYW5kIDE2LWJpdCByZWxvY2F0aW9uIHR5cGVzLgotCUFkZCBhIHNwYWNlIGFmdGVyICJwYy1yZWxhdGl2ZSIgaW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JKHRjX2kzODZfZml4X2FkanVzdGFibGUpIFtCRkRfQVNTRU1CTEVSXTogUmVqZWN0Ci0JQkZEX1JFTE9DXzM4Nl9HT1RPRkYgcmVsb2NzLgotCShpMzg2X29wZXJhbmQpOiBGb3IgYW55IEdPVE9GRiByZWxvYywgY29udmVydCBpdCB0byBhIEJGRF9SRUxPQ18zMgotCXdpdGggYSAiZm9vLUdPVCIgdmFsdWUuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChpMzg2X3ZhbGlkYXRlX2ZpeCk6IERlY2xhcmUgaXQuCi0JKFRDX1ZBTElEQVRFX0ZJWCk6IE5ldyBtYWNybyAtLSBjYWxsIGl0LgotCShOT1BfT1BDT0RFKTogQ2FzdCB0byBgY2hhcicgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCi0KLQkqIGFzLmg6IElmIF9fU1REQ19fIGlzIG5vdCBkZWZpbmVkIGFuZCB2YXJhcmdzLmggaXMgYXZhaWxhYmxlLCB1c2UKLQlpdCByYXRoZXIgdGhhbiBzdGRhcmcuaC4KLQotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IEFkZGVkIG5ldyBiaXRmaWVsZCBmeF9wbHQsIGZvciBmaXh1cHMKLQlyZWZlcnJpbmcgdG8gUExUIGVudHJpZXMuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogSW5pdGlhbGl6ZSBmeF9wbHQgdG8gemVyby4KLQkoYWRqdXN0X3JlbG9jX3N5bXMpOiBSZS1mZXRjaCBgc3ltJyBhZnRlciB0b3Agb2YgcmVkdWN0aW9uIGxvb3AuCi0JRG9uJ3QgYWRqdXN0IGZ4X29mZnNldCBieSBmcmFnIGFkZHJlc3MsIHNpbmNlIFNfR0VUX1ZBTFVFIG5vdwotCWluY2x1ZGVzIHRoZSBmcmFnIGFkZHJlc3MuCi0JKGZpeHVwX3NlZ21lbnQpOiBDaGFuZ2VkIGxvY2FsIHZhciBQQ1JFTCB0byB0eXBlIGludCwgYWRkZWQgUExULgotCUlmIFBDLXJlbGF0aXZlIGZpeHVwIHJlZmVycyB0byBhIFBMVCBlbnRyeSBmb3IgYSBzeW1ib2wgaW4gdGhlCi0JY3VycmVudCBzZWN0aW9uLCBkb24ndCByZWR1Y2UgaXQuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogIEV4aXQgbG9vcCB0aHJvdWdoIGEgbGFiZWwuICBJZgotCURFQlVHNSBpcyBkZWZpbmVkLCBwcmludCBvdXQgZWFjaCBmaXh1cCBiZWZvcmUgYW5kIGFmdGVyCi0JcHJvY2Vzc2luZy4KLQkoZml4dXBfc2VnbWVudCk6IElmIERFQlVHNSBpcyBkZWZpbmVkLCBwcmludCBvdXQgZWFjaCBmaXh1cCBiZWZvcmUKLQlhbmQgYWZ0ZXIgcHJvY2Vzc2luZy4KLQkocHJpbnRfZml4dXApOiBBZGRlZCBwcm90b3R5cGUuICBTaG93IGFkZHJlc3Mgb24gZmlyc3QgbGluZS4gIFNob3cKLQlmeF9vZmZzZXQgYW5kIGZ4X3N1YnN5LiAgWyFCRkRfQVNTRU1CTEVSXTogT25seSBzaG93IGZ4X3JfdHlwZSBpZgotCU5FRURfRlhfUl9UWVBFIGlzIGRlZmluZWQuCi0KLQkqIHN5bWJvbHMuYyAocHJpbnRfc3ltYm9sX3ZhbHVlXzEpOiBDaGVjayBTX0lTX0xPQ0FMLCBTX0lTX0VYVEVSTiwKLQlTX0lTX0RFQlVHLCBTX0lTX0RFRklORUQgYWxzby4KLQotVGh1IFNlcCAyOSAxODo1NzowNiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsKTogRGVwZW5kIG9uIC5nZGJpbml0LgotCSguZ2RiaW5pdCk6IFJlYnVpbGQgZnJvbSBnZGJpbml0LmluIGJ5IHJ1bm5pbmcgY29uZmlnLnN0YXR1cy4KLQotCSogZ2RiaW5pdC5pbjogRGVmaW5lIG5ldyBmdW5jdGlvbiAicGYiLiAgRml4IGRvYyBvbiAicGUiIGFuZCAicHMiLgotCi0JKiB3cml0ZS5jIChwcmludF9maXh1cCk6IFByaW50IHNvdXJjZSBsb2NhdGlvbiBvbiBmaXJzdCBsaW5lLgotCVNob3cgZnhfcl90eXBlIGFuZCBmeF9hZGRzeSBmaWVsZHMuCi0KLVdlZCBTZXAgMjggMTQ6NTY6MzkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgYmZkX2dhcyBmb3IgYWxsIHNwYXJjIHRhcmdldHMgaW4gb25lIHBsYWNlLAotCWluc3RlYWQgb2Ygc2VwYXJhdGVseSBmb3IgZWFjaC4gIENvcnJlY3RseSBoYW5kbGUgdXNlci1zdXBwbGllZAotCSItLWVuYWJsZS1iZmQtZ2FzIiBvcHRpb24uCi0KLQkqIGdkYmluaXQuaW46IE1vdmUgImJyZWFrIGFib3J0IiB0byBlbmQsIGluIGNhc2UgZ2RiIGNvbXBsYWlucy4KLQotCSogYXMuaCAoUFJJTlRGX1dIRVJFX0xJS0UsIFBSSU5UX0xJS0UpIFtVU0VfU1REQVJHLCAhX19HTlVDX19dOgotCVVzZSBQQVJBTVMgbWFjcm8uCi0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUsIGNhc2UgT19zeW1ib2wpOiBEb24ndCBkbyBhbnkKLQlwcm9jZXNzaW5nIGlmIGFkZF9zeW1ib2wgaXMgdW5kZWZpbmVkIG9yIGluIGV4cHJfc2VjdGlvbi4KLQkocmVzb2x2ZV9zeW1ib2xfdmFsdWUsIGNhc2UgT19hZGQpOiBGb3Igc3ltYm9sIHBsdXMKLQljb25zdGFudC12YWx1ZWQgc3ltYm9sLCBjb252ZXJ0IHRvIE9fc3ltYm9sIGFuZCByZS1yZWR1Y2UuCi0JKFNfR0VUX1ZBTFVFKTogSWYgc3ltYm9sIG5lZWRzIHJlc29sdmluZywgcmVzb2x2ZSBpdC4KLQkoaW5kZW50X2xldmVsKTogTm8gbG9uZ2VyIHN0YXRpYy4KLQkocHJpbnRfc3ltYm9sX3ZhbHVlXzEpOiBEb24ndCBwcmludCBmcmFnIGFkZHJlc3MgaWYgaXQgbWF0Y2hlcwotCXplcm9fYWRkcmVzc19mcmFnLiAgRG9uJ3QgcHJpbnQgInJlc29sdmluZyIgaWYgYWxyZWFkeSByZXNvbHZlZC4KLQlQcmludCBzZWdtZW50IG5hbWUuICBEb24ndCBjYWxsIHByaW50X2V4cHJfMSBvbiBhbiB1bmRlZmluZWQKLQlzeW1ib2wuCi0JKHByaW50X2V4cHJfMSk6IEZpeCB3aGl0ZXNwYWNlIGJlZm9yZSBwcmludGluZyBYX2FkZF9udW1iZXIuCi0KLQkqIGV4cHIuYyAobWFrZV9leHByX3N5bWJvbCk6IE5vIGxvbmdlciBzdGF0aWMuICBVc2Ugc3ltYm9sX2NyZWF0ZSwKLQlub3Qgc3ltYm9sX25ldywgZm9yIHN5bWJvbHMgaG9sZGluZyBleHByZXNzaW9uIHZhbHVlcy4KLQkqIGV4cHIuaCAobWFrZV9leHByX3N5bWJvbCk6IE1vdmUgZGVjbGFyYXRpb24gaGVyZS4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfZXhwKTogSGFuZGxlIE9fYWRkIGJ5IGNyZWF0aW5nIGFuCi0JZXhwcmVzc2lvbi12YWx1ZWQgc3ltYm9sLCBhbmQgY2FsbGluZyBmaXhfbmV3X2V4cCByZWN1cnNpdmVseS4KLQkoYWRqdXN0X3JlbG9jX3N5bXMpOiBJZiBhIGZpeHVwJ3Mgc3ltYm9sIHZhbHVlIGlzIGEgc3VtIG9mIGFuCi0JdW5kZWZpbmVkIHN5bWJvbCBhbmQgYSBjb25zdGFudCwgZm9sZCB0aGUgY29uc3RhbnQgaW50byB0aGUgZml4dXAsCi0JYW5kIHJlZmVyIHRvIHRoZSB1bmRlZmluZWQgc3ltYm9sIGRpcmVjdGx5LiAgVGhlbiBwcm9jZXNzIHRoZQotCWZpeHVwIGFnYWluIGZyb20gc2NyYXRjaC4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBCZWZvcmUgY2FsbGluZyBhZGp1c3RfcmVsb2Nfc3ltcywgbWFrZSBhIHBhc3MKLQl0aHJvdWdoIHRoZSBzeW1ib2wgbGlzdCB0cnlpbmcgdG8gcmVzb2x2ZSB2YWx1ZXMuCi0KLQkqIHdyaXRlLmMgKHByaW50X2ZpeHVwKTogTmV3IHJvdXRpbmUsIGZvciBkZWJ1Z2dpbmcuCi0JKHdyaXRlX3JlbG9jcyk6IENhbGwgYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4gIERlbGV0ZWQgdmFyaW91cwotCWhhY2tzIGZvciB3b3JraW5nIGFyb3VuZCBwcm9ibGVtcyB3aXRoIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uCi0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlIHRvIDIuNC45MC4KLQotV2VkIFNlcCAyOCAxMTo1MDo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChnYXNwLm8pOiBEZXBlbmRzIHVwb24gY29uZmlnLmguCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IEluY2x1ZGUgc3Vic2Vncy5oLgotCShtZF9hcHBseV9maXgpOiBJZiBhbiB1bmNvbmRpdGlvbmFsIGIgb3IgYmFsIG92ZXJmbG93cywgYW5kIHdlIGFyZQotCW5vdCBhc3NlbWJsaW5nIFBJQyBjb2RlLCByZXBsYWNlIGl0IHdpdGggYSBqIG9yIGphbC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXBwbHlfZml4KTogQ29ycmVjdCBicmFuY2ggb3ZlcmZsb3cgdGVzdC4KLQlVc2UgYXNfYmFkX3doZXJlIGFuZCBhc193YXJuX3doZXJlIHJhdGhlciB0aGFuIGFzX2JhZCBhbmQgYXNfd2Fybi4KLQotTW9uIFNlcCAyNiAxNzoxNTo1OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IEFkZCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIHRvCi0JYXNfZmF0YWwgY2FsbHMuICBIYW5kbGUgYmZkX3JlbG9jX292ZXJmbG93IGNhc2Ugc3BlY2lmaWNhbGx5IHdoZW4KLQlSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUuCi0KLUZyaSBTZXAgMjMgMTY6MTE6MjggMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoVVNFX1NUREFSRywgVVNFX1ZBUkFSR1MpOiBEZWZpbmUgb25lIG9yIG5laXRoZXIgb2YgdGhlc2UKLQloZXJlLiAgVXNlIHRoZW0gZm9yIGRlY2lkaW5nIHdoaWNoIFBSSU5URipMSUtFIG1hY3JvIGRlZmluaXRpb25zCi0JdG8gdXNlLgotCSogbWVzc2FnZXMuYzogVXNlIHRoZW0sIGluc3RlYWQgb2YgTk9fU1REQVJHLCBOT19WQVJBUkdTLgotCVshVVNFX1NUREFSRyAmJiAhVVNFX1ZBUkFSR1NdICh2YV9hbGlzdCwgdmFfZGNsLCAuLi4pOiBQcm92aWRlCi0JZGVmYXVsdCBkZWZpbml0aW9ucyBtYXRjaGluZyB3aGF0IHdlIHdlcmUgZG9pbmcgYmVmb3JlLgotCShhc190c2t0c2spOiBSZW1vdmUgdGhlIG5vbi1zdGRhcmcsIG5vbi12YXJhcmdzIHZlcnNpb24sIGFuZAotCWFsd2F5cyB1c2UgdGhlIHZhcmFyZ3MgZm9ybSBpZiBub3QgdXNpbmcgc3RkYXJnLiAgSXQncyBzYWZlIHRvCi0JYWx3YXlzIHVzZSB2ZnByaW50ZiwgYmVjYXVzZSBsaWJpYmVydHkgd2lsbCBwcm92aWRlIGl0IGlmIHRoZQotCW5hdGl2ZSBzeXN0ZW0gZG9lc24ndC4gIEFsc28sIGFsd2F5cyBtYWtlIGZvcm1hdCBiZSBjb25zdC4KLQkoYXNfd2FybiwgYXNfd2Fybl93aGVyZSwgYXNfYmFkLCBhc19iYWRfd2hlcmUsIGFzX2ZhdGFsKTogRGl0dG8uCi0KLUZyaSBTZXAgMjMgMTQ6NDI6MzQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogQWx3YXlzIHVzZSBhZGRpdSB3aGVuIGFkZGluZyBhCi0JY29uc3RhbnQgdG8gJHplcm8tLW5vIG5lZWQgdG8gdXNlIGRhZGRpdS4KLQkobWFjcm8pOiBIYWNrIHRoZSAtbWlwczMgb3ZlcmZsb3cgdGVzdHMgdG8gbm90IGZhaWwgd2hlbiBvZmZzZXRUCi0JaXMgb25seSAzMiBiaXRzLgotCi0JKiBzeW1ib2xzLmggKGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMpOiBEZWNsYXJlLgotCi1UaHUgU2VwIDIyIDIxOjU4OjI0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYzogQnVnZml4ZXMgYmFzZWQgaW4gcGFydCBvbiBwYXRjaGVzIGZyb20gUGF1bAotCUtyYW5lbmJ1cmcuCi0JKGxpc3RpbmdfbmV3bGluZSk6IENoZWNrIGZpbGVuYW1lIGFzIHdlbGwgYXMgbGluZSBudW1iZXIgd2hlbgotCWRlY2lkaW5nIHdoZXRoZXIgdG8gcmVjb3JkIGl0LgotCShsaXN0X3N5bWJvbF90YWJsZSkgW1NfSVNfUkVHSVNURVJdOiBDaGVjayB0aGF0IFNfSVNfUkVHSVNURVIgaXMKLQlmYWxzZSAoaWYgZGVmaW5lZCkgYXMgd2VsbCBhcyBjaGVja2luZyBmb3IgcmVnX3NlY3Rpb24uCi0JKGxpc3RpbmdfbGlzdGluZyk6IEl0ZXJhdGUgZmV0Y2hpbmcgbGluZXMgd2hpbGUgbGluZSBudW1iZXIgaXMgdG9vCi0JbG93LCBhbmQgd2UgaGF2ZW4ndCBydW4gb2ZmIHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuCi0KLQkqIGNvbmZpZy92bXMtY29uZi5oOiBDaGFuZ2VkIEhBVkVfREVMRVRFIHRvIEhBVkVfUkVNT1ZFLgotCi1UaHUgU2VwIDIyIDEzOjM5OjEwIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0B4MS5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogY2hlY2sgaWYKLQljdXJyZW50X3N0YWJzX2ZpbGVuYW1lIGlzIE5VTEwgYmVmb3JlIHN0cmNtcC4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogZml4IGEgYnVnIGluIGdlbmVyYXRlX2FzbV9saW5lbm8KLQljaGVja2luZy4KLQotV2VkIFNlcCAyMSAxODoxNzozNSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvaG8tKi5oOiBOb3ctdW51c2VkIGZpbGVzIGRlbGV0ZWQuCi0KLQkqIHN5bWJvbHMuYyAoY29weV9zeW1ib2xfYXR0cmlidXRlcyk6IE5ldyBmdW5jdGlvbi4gIENvcGllcyBCRkQKLQlzeW1ib2wgZmxhZ3MgYW5kIGNhbGxzIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTLgotCShyZXNvbHZlX3N5bWJvbF92YWx1ZSwgY2FzZSBPX3N5bWJvbCk6IENhbGwgaXQsIGlmIFhfYWRkX251bWJlciBpcwotCXplcm8uICBEb24ndCBjYWxsIG9ial9mcm9iX2ZvcndhcmRfc3ltYm9sLgotCSogcmVhZC5jIChwc2V1ZG9fc2V0KTogQ2FsbCBjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzLCBidXQgb25seSBpZgotCVhfYWRkX251bWJlciBpcyB6ZXJvLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2Zyb2JfZm9yd2FyZF9zeW1ib2wpOiBEZWxldGVkLgotCi0JKiBjb25maWcvdGMtaTk2MC5jOiBMb3RzIG9mIHdoaXRlc3BhY2UsIGNvbW1lbnQgcmVmb3JtYXR0aW5nLAotCXVzaW5nIEdOVSBpbmRlbnQuCi0JKHN0cmNocik6IERvbid0IGRlY2xhcmUuCi0JW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBjb21waWxlIG1kX2NvbnZlcnRfZnJhZywKLQltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgbWRfcmlfdG9fY2hhcnMsCi0JbWRfY3JlYXRlX3Nob3J0X2p1bXAsIG1kX2NyZWF0ZV9sb25nX2p1bXAuCi0JKGJydGFiX2VtaXQpOiBVc2UgZGF0YV9zZWN0aW9uLCBub3QgU0VHX0RBVEEuCi0KLQlNb24gU2VwIDE5IDE3OjE0OjQ0IDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvdm1zLWNvbmYuaDogbmV3IGZpbGUsIG1hbnVhbGx5IGRlcml2ZWQgZnJvbSBjb25mLmluLgotCSogY29uZmlnLWdhcy5jb206IHVzZSBpdCwgYW5kIGVsaW1pbmF0ZSBvYnNvbGV0ZSAiaG9zdC5oIi4KLQotV2VkIFNlcCAyMSAxMToxMTozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2N1cnJlbnRfYmxvY2spOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwcGNfc3RhYngpOiBTZXQgc3lfdGMud2l0aGluIG9mIGEgQ19TVFNZTSBzeW1ib2wgdG8KLQlwcGNfY3VycmVudF9ibG9jay4gIERvbid0IG1vdmUgYXJvdW5kIGFueSBzdGFiIHN5bWJvbCwganVzdCB0aG9zZQotCWZvciBjb21tb24gc3ltYm9scy4KLQkocHBjX2JzKTogU2V0IHBwY19jdXJyZW50X2Jsb2NrLgotCShwcGNfZXMpOiBDbGVhciBwcGNfY3VycmVudF9ibG9jay4KLQkocHBjX2Zyb2Jfc3ltYm9sKTogU2V0IHRoZSB2YWx1ZSBvZiBhIENfU1RTWU0gc3ltYm9sIHRvIHRoZSBvZmZzZXQKLQlmcm9tIHRoZSBjc2VjdCBvZiB0aGUgZW5jbG9zaW5nIGJsb2NrLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChpbnNuc19zaW5jZV9jYWNoZV9hY2Nlc3MpOiBSZW1vdmUuCi0JKGFwcGVuZF9pbnNuKTogUmVtb3ZlIHNldHRpbmcgb2YgaW5zbnNfc2luY2VfY2FjaGVfYWNjZXNzLCBhbmQKLQlzcGVjaWFsIDQ2MDAgaGFuZGxpbmc7IGl0IHR1cm5zIG91dCBub3QgdG8gYmUgcmVxdWlyZWQuCi0KLVR1ZSBTZXAgMjAgMTY6MTM6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9zaG9ydG9wdHMpOiBSZW1vdmUgRS4KLQkobWRfbG9uZ29wdHMpOiBBZGQgRUIgYW5kIEVMLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgLUVCIGFuZCAtRUwgYXMgc2VwYXJhdGUgb3B0aW9ucywgcmF0aGVyCi0JdGhhbiBhcyBhIHNpbmdsZSAtRSBvcHRpb24gd2l0aCBhbiBhcmd1bWVudC4KLQotTW9uIFNlcCAxOSAxMjo0MjowNSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfYWRqdXN0YWJsZSk6IFJlamVjdCByZWR1Y3Rpb25zCi0JaW52b2x2aW5nIGdsb2JhbCBzeW1ib2xzIHRvby4KLQotTW9uIFNlcCAxOSAxMjoxMjo0NiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBhcy5oOiBUZXN0IE5FRURfREVDTEFSQVRJT05fKiwgbm90IE5FRURfKl9ERUNMQVJBVElPTi4KLQotCSogY29uZmlndXJlLmluOiBUZXN0IGZvciByZW1vdmUsIG5vdCBkZWxldGUuICBGaXggY3Jvc3MtYXNzZW1ibGVyCi0JdGVzdC4KLQkqIGFzLmg6IFRlc3QgSEFWRV9SRU1PVkUsIG5vdCBIQVZFX0RFTEVURTsgZGVmaW5lIHVubGluayB0bwotCXJlbW92ZSwgbm90IGRlbGV0ZS4KLQotCSogcmVhZC5jIChwc2V1ZG9fc2V0LCBjYXNlIE9fc3ltYm9sKTogSWYKLQlPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyBpcyBkZWZpbmVkLCBpbnZva2UgaXQuCi0JW0JGRF9BU1NFTUJMRVJdOiBDb3B5IEJTRl9GVU5DVElPTiBzZXR0aW5nIHRvby4KLQkqIGNvbmZpZy9vYmotZWxmLmggKE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKTogRGVmaW5lLgotCi0JV2VkIEF1ZyAxMCAxOToxNTozMCAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuaCAoRFNHX1NfQ19VQklUVSwgRFNUX0tfVkZMQUdTX0RTQywgRFNUX0tfVFNfQVRPTSwKLQltYW55IG90aGVycyk6IG5ldyBtYWNyb3M7IHZhbHVlcyBvYnRhaW5lZCBmcm9tICJEU1RSRUNSRFMuU0RMIi4KLQkqIGNvbmZpZy9vYmotdm1zLmggKHZhcmlvdXMpOiB1c2UgdGhlbS4KLQkoVVNFX0JJVFNUUklOR19ERVNDUklQVE9SKTogbmV3IG1hY3JvLCBmb3Igc2VsZWN0aW5nIGJpdGZpZWxkCi0JcmVwcmVzZW50YXRpb24gKG9ubHkgZW51bSBiaXRmaWVsZHMgY2FuIGF2b2lkIGJlaW5nIGJpdHN0cmluZ3MpLgotCShiaXRmaWVsZF9zdWZmaXgsIHNldHVwX2Jhc2ljX3R5cGUpOiBuZXcgcm91dGluZXMuCi0JKFZNU190eXBlZGVmX3BhcnNlKTogdXNlIHRoZW0uICBOb3cgcmVjb2duaXplIGJpdGZpZWxkcyBvZiBhbGwKLQlpbnRlZ3JhbCB0eXBlcywgbm90IGp1c3QgdHlwZSBgaW50Jy4gIENhdmVhdDogIHRoZSByZXByZXNlbnRhdGlvbgotCXVzZWQgZm9yIGJpdGZpZWxkcyBzdGlsbCBkb2VzIG5vdCB3b3JrIGZvciBvYmplY3RzIHBsYWNlZCBpbgotCXJlZ2lzdGVycywgYW5kIGdjYydzIG9wdGltaXplciBzb21ldGltZXMgcHV0cyBzbWFsbCBzdHJ1Y3RzIHRoZXJlLgotCi0JVHVlIEp1biAxNCAxNzozMTo0NCAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogcmVhZC5jIChzX3RleHQpIFsjaWYgT0JKX1ZNU106IGNsZWFyIHRoZSBJTl9ERUZBVUxUX1NFQ1RJT04KLQliaXQgZnJvbSBjb25zdF9mbGFnLgotCSogY29uZmlnL29iai12bXMuaCAoSU5fREVGQVVMVF9TRUNUSU9OKTogZGVmaW5lIHRoaXMgbWFjcm8uCi0JKHRjX2Zyb2JfbGFiZWwpOiBkZWZpbmUgdGhpcyB0byBjYWxsIHZtc19jaGVja19mb3Jfc3BlY2lhbF9sYWJlbCwKLQlhbmQgZGVjbGFyZSB0aGUgbGF0dGVyLgotCSogY29uZmlnL29iai12bXMuYyAodmF4X2dfZG91Ymxlcyk6IGRlY2xhcmUgdGhpcyBmaWxlLXNjb3BlCi0JdmFyaWFibGUuCi0JKGNvbnN0X2ZsYWcpOiBpbml0aWFsaXplIHRvIElOX0RFRkFVTFRfU0VDVElPTiBpbnN0ZWFkIG9mIDAuCi0JKHZtc19jaGVja19mb3Jfc3BlY2lhbF9sYWJlbCk6IG5ldyByb3V0aW5lICh0Y19mcm9iX2xhYmVsKS4KLQkoVk1TX1RCVF9Sb3V0aW5lX0VuZCk6IGRvbid0IGJvdGhlciBjaGVja2luZyBmb3IgYGdjY19jb21waWxlZC4nCi0JYW5kIGBnY2MyX2NvbXBpbGVkLicgbGFiZWxzOyB0aGV5IHdvbid0IHJlYWNoIGhlcmUgYW55IG1vcmUuCi0JKFZNU190eXBlZGVmX3BhcnNlKSBbY2FzZSAnciddOiBmb3IgdHlwZXMgYGRvdWJsZScgYW5kIGBjb21wbGV4Ci0JZG91YmxlJywgdXNlIGB2YXhfZ19kb3VibGVzJyBmbGFnIHRvIHNlbGVjdCB0eXBlIG9mIGRvdWJsZS4KLQkoVk1TX3dyaXRlX29iamVjdF9maWxlKSBbdHJhY2ViYWNrIHNldHVwXTogZG9uJ3QgcGFzcyBzeW1ib2xzCi0Jd2l0aCB0aGUgSU5fREVGQVVMVF9TRUNUSU9OIGF0dHJpYnV0ZSB0byB0aGUgVEJUX1JvdXRpbmVfQmVnaW4KLQlhbmQgVEJUX1JvdXRpbmVfRW5kIGZ1bmN0aW9ucy4KLQotCU1vbiBKdW4gIDYgMjA6NTI6MjAgMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19UQlRfUm91dGluZV9FbmQpOiBjYWNoZSB0aGUgcmVzdWx0IG9mCi0JU19HRVRfVkFMVUUoKSB0byBhdm9pZCBtYW55IHJlcGVhdGVkIGZ1bmN0aW9uIGNhbGxzLgotCShWTVNfQ2hlY2tfRm9yX01haW4pIFsjaWYgSEFDS19ERUNfQ19TVEFSVFVQXTogY2FwaXRhbGl6ZQotCV9DJE1BSU5fQVJHUyBpbiBhZHZhbmNlLCBpbiBjYXNlIC1oMyAobGVhdmUgc3ltYm9sIG5hbWUgYXMtaXMpCi0JZ2V0cyByZXF1ZXN0ZWQuICBbQWxsIHRoZSBIQUNLX0RFQ19DX1NUQVJUVVAgY29kZSBhcHBlYXJzIHRvCi0JYmUgb2Jzb2xldGU7IGdjYyBkb2VzIGl0IGF1dG9tYXRpY2FsbHkgZm9yIHZtcyB0YXJnZXQuICBJdCdzCi0JYWxzbyBtaXNuYW1lZCwgYmVjYXVzZSBpdCBpcyBmb3IgdGhlICJWQVggQyIgcnVuLXRpbWUgbGlicmFyeSwKLQlub3QgdGhlIG5ld2VyICJERUMgQyIgb25lIHdoaWNoIGhhcyBtdWNoIGRpZmZlcmVudCBzdGFydHVwIGNvZGUuXQotCXt2YXJpb3VzfTogdXNlIGBTX1NFVF94eHgoc3ltYm9sLG5ld192YWx1ZSknIHJhdGhlciB0aGFuCi0JYFNfR0VUX3h4eChzeW1ib2wpID0gbmV3X3ZhbHVlJy4KLQotTW9uIFNlcCAxOSAxMjowNTowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX2RvdF9maWxlX3N5bWJvbCk6IFVzZSBiZmRfYWJzX3NlY3Rpb25fcHRyLAotCW5vdCAmYmZkX2Fic19zZWN0aW9uLgotCi1UaHUgU2VwIDE1IDE4OjM2OjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChjbGVhbl91cF9leHByZXNzaW9uKTogVXNlIGFkZHJlc3NULCBub3QgYmZkX3ZtYS4KLQotVHVlIFNlcCAxMyAyMDowNTo0NyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZXhwci5jIChleHByKTogRG9uJ3QgcmVkdWNlIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGluIHRoZQotCXNhbWUgZnJhZyBpZiB0aGUgc3ltYm9scyBhcmUgbm90IGluIG5vcm1hbCBzZWN0aW9ucy4KLQotCSogY29uZmlnL29iai1zb20uaCAoU19TRVRfT1RIRVIsIFNfU0VUX1RZUEUpOiBEZWxldGUgYS5vdXQgY3J1ZC4KLQkoU19TRVRfREVTQywgU19HRVRfT1RIRVIsIFNfR0VUX1RZUEUsIFNfR0VUX0RFU0MpOiBMaWtld2lzZS4KLQkob2JqX2F0dGFjaF91bndpbmRfaW5mbyk6IERvIG5vdCBkZWZpbmUuICBOb3QgbmVlZGVkIGFueW1vcmUuCi0JKiBjb25maWcvdGMtaHBwYS5jOiBEZWxldGUgd2hpdGVzcGFjZSBhdCBFT0wuCi0JKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QpOiBEZWxldGUgZnhfdW53aW5kIGZpZWxkIGFuZCBhbGwgcmVmZXJlbmNlcy4KLQkoZml4X25ld19ocHBhKTogTGFzdCBhcmcgaXMgbm93IGEgcG9pbnRlciB0byBhbiBpbnQuICBEbyBub3QKLQljYWxsIG9ial9hdHRhY2hfdW53aW5kX2luZm8gYW55bW9yZS4gIEZvciBTT00gUl9FTlRSWSBhbmQgUl9FWElUCi0JZml4dXBzLCBzdG9yZSAzMmJpdHMgb2YgdW53aW5kIGluZm9ybWF0aW9uIGluIHRoZSBmeF9hZGRudW1iZXIKLQlmaWVsZCBvZiB0aGUgZml4dXAuCi0JKG1kX2Fzc2VtYmxlLCBwYV9lbnRyeSwgcHJvY2Vzc19leGl0LCBwYV9wcm9jZW5kKTogRm9yIFNPTSBSX0VOVFJZCi0JYW5kIFJfRVhJVCBmaXh1cHMsIHBhc3MgYSBOVUxMIHBvaW50ZXIgdG8gZml4X25ld19ocHBhLCBhbmQgYQotCXBvaW50ZXIgdG8gMzIgYml0cyBvZiB1bndpbmQgaW5mby4KLQkodGNfZ2VuX3JlbG9jKTogRm9yIFNPTSBSX0VOVFJZIGFuZCBSX0VYSVQgZml4dXBzLCBzZXQgdGhlIHN5bWJvbAotCXBvaW50ZXIgdG8gdGhlIGR1bW15IHN5bWJvbDsgc2V0IHRoZSBhZGRlbmQgZmllbGQgdG8gZnhfYWRkbnVtYmVyLgotCShwYV9jb21tLCBwYV9lcXUsIHBhX3R5cGVfYXJncywgcGFfaW1wb3J0KTogVXNlIGJmZF9YWFhfc2VjdGlvbl9wdHIKLQlyYXRoZXIgdGhhbiAmYmZkX1hYWF9zZWN0aW9uLgotCi1UdWUgU2VwIDEzIDIxOjE1OjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeF8xKTogRm9yIEdPVFBDIHJlbG9jcywgZGVjcmVtZW50Ci0JdmFsdWUgYnkgb25lOyBkaXNjYXJkIGFkanVzdG1lbnRzIHByZXZpb3VzbHkgYmVpbmcgbWFkZS4gIEZyb20KLQlFcmljIFlvdW5nZGFsZS4KLQotCVZNUy0gYW5kIFZheC1yZWxhdGVkIGNoYW5nZXMgZnJvbSBQYXQgUmFua2luOgotCSogTWFrZWZpbGUuaW4gKFZNU19PVEhFUl9PQkpTKTogYWRkIGNvbmNhdCwgZ2V0b3B0LCBhbmQgZ2V0b3B0MS4KLQkqIHZtc2NvbmYuc2g6IG5vIGxvbmdlciBoYXZlIG1ha2UtZ2FzLmNvbSBlY2hvIHRleHQgYWJvdXQgbmVlZGluZwotCXRvIG1vZGlmeSB0aGUgZ2NjLXZtcyBkcml2ZXIgd2hlbiBpbnRlbmRpbmcgdG8gdXNlIHdpdGggZ2NjIDEueC4KLQkqIGFzLmMgKHBhcnNlX29wdGlvbnMpOiBzdXBwcmVzcyAndicgZnJvbSBzdGRfc2hvcnRfb3B0aW9ucyBhbmQKLQllbGltaW5hdGUgVk1TLXNwZWNpZmljIGNvbmRpdGlvbmFsIGluaXRpYWxpemF0aW9uOwotCVtkZWZhdWx0IGNhc2VdOiBjaGVjayBmb3IgJy12JyBpZiBtZF9wYXJzZV9vcHRpb25zIGRvZXNuJ3QgcmVjb2duaXplCi0JYW4gb3B0aW9uOwotCVtkZWZhdWx0IGNhc2UsICNpZiBWTVNdOiBjaGVjayBmb3IgZmlsZW5hbWUgYXJndW1lbnQgd2hlbiAnLXYnIHNlZW47Ci0JW2Nhc2UgJ3YnXTogZGVsZXRlLgotCSogY29uZmlnL3RjLXZheC5jIChtZF9hc3NlbWJsZSk6IGRvbid0IHJlbHkgb24gYHRoaXNfYWRkX251bWJlcicKLQlmb3IgT19iaWcgbGl0ZXJhbCBvcGVyYW5kcyAoZG91YmxlIGZsb2F0cyBhbmQgbG9uZyBsb25nIGludHMpOwotCVtWTVMsIG1kX3Nob3J0b3B0c106IGFkZCBzZWNvbmQgY29sb24gYWZ0ZXIgJ3YnOwotCShtZF9wYXJzZV9vcHRpb25zKSBbVk1TLCBjYXNlICd2J106ICBjaGVjayBmb3IgYXJndW1lbnQsIHNvCi0JY2FsbGVyIGNhbiBoYW5kbGUgYC12JyB3L28gYXJnLgotCi1UdWUgU2VwIDEzIDE2OjQ1OjA4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogIElmIFRDX0tFRVBfRlhfT0ZGU0VUCi0JaXMgZGVmaW5lZCwgcHV0IHRoZSB0eF9vZmZzZXQgaW50byB0aGUgcl9vZmZzZXQuCi0JKiBjb25maWcvdGMtc2guYyAobGluZV9jb21tZW50X2NoYXJzKTogQWRkICMKLQkodGNfcmVsb2NfbWFuZ2xlKTogRGVsZXRlZC4KLQkqIGNvbmZpZy90Yy1zaC5oIChUQ19LRUVQX0ZYX09GRlNFVCk6IERlZmluZS4KLQkoVENfUkVMT0NfTUFOR0xFKTogRGVsZXRlLgotCi1UdWUgU2VwIDEzIDE2OjIwOjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGZsb251bS1rb25zdC5jOiBDaGFuZ2UgcHJlcHJvY2Vzc29yIHRlc3RzIG9mIEhPX1ZNUyB0byBqdXN0IFZNUy4KLQkqIGhleC12YWx1ZS5jOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotdm1zLmM6IERpdHRvLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBSZXBsYWNlIGFzX2JhZC9leGl0IHNlcXVlbmNlIHdpdGgKLQlhIGNhbGwgdG8gYXNfZmF0YWwuCi0JKiBjb25maWcvdGMtaTg2MC5jIChpODYwX2lwKTogRGl0dG8uCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IERpdHRvLgotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2lwKTogRGl0dG8uCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogRGl0dG8uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBSZXBsYWNlIGFzX3dhcm4vZXhpdCBzZXF1ZW5jZSB3aXRoIGEKLQljYWxsIHRvIGFzX2ZhdGFsLgotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IFVzZSBFWElUX0ZBSUxVUkUuCi0JKiBvdXRwdXQtZmlsZS5jIChvdXRwdXRfZmlsZV9jcmVhdGUsIG91dHB1dF9maWxlX2Nsb3NlLAotCW91dHB1dF9maWxlX2NyZWF0ZSwgb3V0cHV0X2ZpbGVfY2xvc2UpOiBEaXR0by4KLQkqIG1lc3NhZ2VzLmMgKGFzX2ZhdGFsKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX3ZlcnNpb24sIG9ial9zb21fY29weXJpZ2h0KTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWllZWUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERpdHRvLgotCSogY29uZmlnL3RjLXZheC5jIChtYWluKTogVXNlIEVYSVRfU1VDQ0VTUy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1haW4pOiBEaXR0by4KLQotCSogaGFzaC5jIChtYWluKTogUGFzcyBhIHZhbHVlIHRvIGV4aXQoKS4KLQotCSogYXMuaCAoRVhJVF9TVUNDRVNTLCBFWElUX0ZBSUxVUkUpOiBNb3ZlZCBoZXJlLgotCSogYXMuYzogLi4uZnJvbSBoZXJlLgotCShwYXJzZV9hcmdzKTogVXNlIHRoZW0gYWx3YXlzLgotCShtYWluKTogVXNlIGV4aXQgcmF0aGVyIHRoYW4gcmV0dXJuLgotCi0JKiBNYWtlZmlsZS5pbiAoKl9GT1JfVEFSR0VULCBJTlNUQUxMX1hGT1JNLCBpbnN0YWxsLCB1bmluc3RhbGwpOgotCVJld3JpdGUgaGFuZGxpbmcgb2YgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZS4KLQotCSogY29uZmlndXJlLmluOiBUZXN0IGZvciBmdW5jdGlvbnMgdW5saW5rIGFuZCBkZWxldGUuCi0JKiBhcy5oOiBJZiB1bmxpbmsgaXNuJ3QgYXZhaWxhYmxlIGJ1dCBkZWxldGUgaXMsIGRlZmluZSB1bmxpbmsgdG8KLQliZSBkZWxldGUuCi0KLQlVcGRhdGUgZm9yIGF1dG9jb25mIDEuMTE4OgotCSogZ2RiaW5pdC5pbjogTmV3IGZpbGUsIGNyZWF0ZWQgZnJvbSBvbGQgLmdkYmluaXQuCi0JKiAuZ2RiaW5pdDogRGVsZXRlZC4KLQkqIGFjbG9jYWwubTQgKEdBU19HREJJTklUKTogRGVsZXRlZC4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdXNlIGl0LiAgSW5zdGVhZCwgZ2VuZXJhdGUgLmdkYmluaXQgZnJvbQotCWdkYmluaXQuaW4uICBEb24ndCBzdWJzdGl0dXRlIGNwdV90eXBlLCBvYmpfZm9ybWF0LCBlbXVsYXRpb24sCi0JYXRvZi4gIFN3aXRjaGVkIG9yZGVyIG9mIEFDX0xJTktfRklMRVMgYXJndW1lbnRzLiAgVXNlIEFDX1BSRVJFUQotCXRvIGVuc3VyZSB0aGF0IG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mIGFyZW4ndCB1c2VkLgotCSogTWFrZWZpbGUuaW46IEFkZGVkIEBjb25maWd1cmVfaW5wdXRAIGxpbmUuCi0JKGNvbmZpZ3VyZSk6IERlbGV0ZWQgcnVsZS4KLQotVHVlIFNlcCAxMyAxMjowODoyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogQWZ0ZXIgaGFuZGxpbmcgdGhlIGRpZmZlcmVuY2UKLQlvZiB0d28gc3ltYm9scyBmcm9tIHRoZSBzYW1lIHNlZ21lbnQsIHNldCBmeF9zdWJzeSB0byBOVUxMLCB0bwotCXNhdGlzZnkgZXhpc3RpbmcgVENfQ09VTlRfUkVMT0MgbWFjcm9zLgotCi1UdWUgU2VwIDEzIDAxOjQ3OjA4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGFjbG9jYWwubTQgKEdBU19HREJJTklUKTogTmV3IG1hY3JvLgotCSogY29uZmlndXJlLmluOiBVc2UgaXQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1Nb24gU2VwIDEyIDIwOjU2OjM4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbSkKLQotCSogLmdkYmluaXQgKHBlLCBwcyk6IERlZmluZSBuZXcgY29tbWFuZHMuCi0JKiBzeW1ib2xzLmMgKGluZGVudF9sZXZlbCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGluZGVudCwgcHJpbnRfZXhwcl8xLCBwcmludF9zeW1ib2xfdmFsdWVfMSwgcHJpbnRfc3ltYm9sX3ZhbHVlLAotCXByaW50X2V4cHIpOiBOZXcgZnVuY3Rpb25zLgotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLXN0YW1wKTogQWRkIGEgInRoaXMgZmlsZSBnZW5lcmF0ZWQgYnkgbWFrZSIKLQltZXNzYWdlIHRvIGNvbmZpZy5oLgotCi0JUElDIGltcGxlbWVudGF0aW9uIGZvciBpMzg2LWxpbnV4LCBiYXNlZCBvbiBjb2RlIGZyb20gRXJpYwotCVlvdW5nZGFsZSBhbmQgUGF1bCBLcmFuZW5idXJnLCB3aXRoIHNvbWUgd29yayBvZiBteSBvd246Ci0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBUZXN0IFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCBvbiBmaXh1cAotCWJlZm9yZSBwcm9jZXNzaW5nIHNhbWUtc2VjdGlvbiBwY3JlbCByZWxvY2F0aW9ucy4KLQkoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogRGVmYXVsdCB0byAxLgotCi0JKiBleHByLmMgKG1ha2VfZXhwcl9zeW1ib2wpOiBJZiBvcGVyYXRvciBpcyBPX3N5bWJvbCBhbmQKLQlYX2FkZF9udW1iZXIgaXMgemVybywganVzdCByZXR1cm4gdGhlIHN5bWJvbC4gIElmIG9wZXJhdG9yIGlzCi0JT19jb25zdGFudCwgcmVzb2x2ZSB0aGUgc3ltYm9sJ3MgdmFsdWUgYmVmb3JlIHJldHVybmluZy4KLQkob3BlcmFuZCk6IFBlcm1pdCB1c2Ugb2YgIltdIiBmb3IgZ3JvdXBpbmcuCi0JKGNsZWFuX3VwX2V4cHJlc3Npb24pOiBGb3IgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpbiB0aGUgc2FtZQotCWZyYWcsIGFkZCB0aGUgZGlmZmVyZW5jZSBvZiB0aGVpciBvZmZzZXRzIGludG8gWF9hZGRfbnVtYmVyLgotCShleHByKTogUmVkdWNlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaW4gc2FtZSBmcmFnIHRvIHRoZWlyCi0JZGlmZmVyZW5jZS4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoVENfUkVMT0MpOiBOZXcgbWFjcm8uCi0JKHN0cnVjdCBfaTM4Nl9pbnNuKTogTmV3IGZpZWxkIGRpc3BfcmVsb2MuCi0JKEdPVF9zeW1ib2wpOiBOZXcgdmFyaWFibGUuCi0JKG9wZXJhbmRfc3BlY2lhbF9jaGFycyk6IEFkZGVkIHNxdWFyZS1icmFja2V0cyBhbmQgYXQtc2lnbi4KLQkocmVsb2MpIFtCRkRfQVNTRU1CTEVSXTogQWRkZWQgbmV3IGFyZ3VtZW50IE9USEVSOyBpZiBpdCBpcyBub3QKLQlOT19SRUxPQywganVzdCByZXR1cm4gaXQuCi0JKHJlbG9jKSBbISBCRkRfQVNTRU1CTEVSXTogQWRkIHRoaXJkIGFyZ3VtZW50IHRvIGR1bW15IG1hY3JvLgotCShCRkRfUkVMT0NfMzg2X1BMVDMyLCBfR09UMzIsIF9HT1RPRkYpIFshIEJGRF9BU1NFTUJMRVJdOiBNb3JlCi0JZHVtbXkgbWFjcm9zLgotCSh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogTmV3IGZ1bmN0aW9uLiAgUmV0dXJucyB6ZXJvIGlmIHN5bWJvbCBpbgotCWZpeHVwIGlzIG5vdCBsb2NhbCwgdG8gcHJldmVudCByZWxvY2F0aW9ucyBhZ2FpbnN0IGV4dGVybmFscyBmcm9tCi0JYmVpbmcgZHJvcHBlZC4KLQkobWRfYXNzZW1ibGUpOiBJbml0aWFsaXplIGRpc3BfcmVsb2MgZmllbGQgdG8gTk9fUkVMT0MuICBQYXNzCi0JZGlzcF9yZWxvYyBmaWVsZCB0byByZWxvYygpIGZ1bmN0aW9uLCBhbmQgdXNlIFRDX1JFTE9DIHRvIGdlbmVyYXRlCi0JdmFsdWUgdG8gcGFzcyB0byBmaXhfbmV3X2V4cC4KLQkobWRfYXNzZW1ibGUpOiBDaGFuZ2UgMzItYml0IHJlbG9jIGFnYWluc3QgR09UX3N5bWJvbCBpbnRvIGEgR09UUEMKLQlyZWxvYy4KLQkoaTM4Nl9vcGVyYW5kKTogSW5pdGlhbGl6ZSBkaXNwX3JlbG9jIGZpZWxkIHRvIE5PX1JFTE9DLiAgSGFuZGxlCi0JQEdPVE9GRiwgQFBMVCwgQEdPVCBvcGVyYW5kcy4gIEZvciBHT1RPRkYgcmVsb2NhdGlvbnMgd2l0aCBsb2NhbAotCXN5bWJvbHMsIGZvcmNlIGdlbmVyYXRpb24gb2YgdGhlIHNlY3Rpb24gc3ltYm9sLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IElmIEdPVF9zeW1ib2wgZXhpc3RzLCBkZWNpZGUKLQl3ZSdyZSBnZW5lcmF0aW5nIFBJQyBjb2RlLCBhbmQgY29udmVydCByZWxvY2F0aW9ucyBhZ2FpbnN0Ci0JdW5kZWZpbmVkIHN5bWJvbHMgZnJvbSBQQ1JFTCB0byBQTFQzMi4KLQkobWRfYXBwbHlfZml4XzEpIFtPQkpfRUxGXTogRml4IHVwIHZhbHVlcyBmb3IgZHluYW1pYy1saW5raW5nCi0JcmVsb2NzLgotCShtZF91bmRlZmluZWRfc3ltYm9sKTogTm90aWNlIEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSBhbmQgc2V0Ci0JYW5kIHJldHVybiBHT1Rfc3ltYm9sIGlmIGl0IG1hdGNoZXMuCi0JKEYsIE1BUCk6IE1vdmUgbWFjcm8gZGVmaW5pdGlvbnMgb3V0c2lkZSBmdW5jdGlvbi4KLQkodGNfZ2VuX3JlbG9jKTogT25seSBzd2l0Y2ggb24gc2l6ZSBhbmQgcGNyZWwgaWYgY29kZSB3YXNuJ3QKLQlhbHJlYWR5IHN1cHBsaWVkIGFzIFBMVDMyLiBHT1QzMiwgR09UT0ZGLCBvciBHT1RQQy4gIENvbnZlcnQKLQlCRkRfUkVMT0NfMzIgdXNpbmcgR09UX3N5bWJvbCBpbnRvIEdPVFBDLgotCSogY29uZmlnL3RjLWkzODYuaCAoVENfUkVMT0MsIHRjX2ZpeF9hZGp1c3RhYmxlLAotCVRDX1JFTE9DX0dMT0JBTF9PRkZTRVRfVEFCTEUsIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IE5ldwotCW1hY3Jvcy4KLQkoTkVFRF9GWF9SX1RZUEUpOiBEZWZpbmUuCi0JKExPQ0FMX0xBQkVMKTogQWNjZXB0ICIuWCIgcHJlZml4IHRvby4KLQkoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTogRGVmYXVsdCB0byAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIi4KLQotTW9uIFNlcCAxMiAxNzo1MTozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdHlwZSk6IFJld3JpdGUgdG8gYWNjZXB0IHN5bnRheAotCXJlcG9ydGVkbHkgdG8gYmUgdXNlZCBvbiBJcml4IDYuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BzZXVkb190YWJsZSk6IEhhbmRsZSAuZ2xvYmwgYW5kIC5nbG9iYWwuCi0JKHNfbWlwc19nbG9ibCk6IE5ldyBzdGF0aWMgZnVuY3Rpb247IG5lZWRlZCBmb3IgSXJpeCA1IHN1cHBvcnQuCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogSWYgQlNGX0ZVTkNUSU9OIGlzIHNldCBmb3IgYW4KLQlleHRlcm5hbCBzeW1ib2wgd2l0aCBubyB0eXBlLCBzZXQgdGhlIHR5cGUgdG8gc3RfUHJvYyByYXRoZXIgdGhhbgotCXN0X0dsb2JhbC4gIERvbid0IHNldCB0aGUgaW5kZXggb2YgYW4gZXh0ZXJuYWwgc3RfUHJvYyBvcgotCXN0X1N0YXRpY1Byb2Mgc3ltYm9sIHVubGVzcyBpdCBpcyBhbHNvIGEgbG9jYWwgc3ltYm9sLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IFRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYXNfd2hlcmUgaXMKLQl1bnNpZ25lZCBpbnQgKiwgbm90IGludCAqLgotCi1UaHUgU2VwICA4IDE3OjE4OjI0IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCA6IENoYW5nZSBuYW1lcyB0byAgT0JKX0dFTkVSQVRFX0FTTV9MSU5FTk8sCi0JYW5kIGdlbmVyYXRlX2FzbV9saW5lbm8uCi0JKiBjb25maWcvb2JqLWVsZi5oIDogZGl0dG8uCi0JKiByZWFkLmggOiBkaXR0by4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogaWYgbm8gZmlsZSB3aGVuIGluc3QgaXMgcmVhZCwgc2V0Ci0JZ2VuZXJhdGVfYXNtX2xpbmVubyB0byB0cnVlLgotCSogZWNvZmYuaCA6IGNoYW5nZSBuYW1lIHRvIGdlbmVyYXRlX2FzbV9saW5lbm8gYW5kIGFkZCBmdW5jdGlvbgotCWVjb2ZmX25vX2N1cnJlbnRfZmlsZS4KLQkqIGVjb2ZmLmMgOiBjaGFuZ2UgbmFtZSB0byBnZW5lcmF0ZV9hc21fbGluZW5vLgotCSogZWNvZmYuYyAoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubykgOiBuZXcgZnVuY3Rpb24sIHRvIGdlbmVyYXRlCi0JZWNvZmYgc3R5bGUgbGluZSBmb3IgYXNtIGZpbGUuCi0KLVRodSBTZXAgIDggMTk6NDM6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc2l6ZV9zZWN0aW9uKTogRG8gYW4gZnByaW50ZiB0byBzdGRlcnIgcmF0aGVyCi0JdGhhbiBhIHByaW50Zi4KLQkoZml4dXBfc2VnbWVudCk6IFVzZSBhc19iYWRfd2hlcmUgcmF0aGVyIHRoYW4gYXNfYmFkLgotCi1XZWQgU2VwICA3IDE3OjIxOjEyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy17aDgzMDAsc2h9LltjaF0gKHRjX2NvZmZfc3ltYm9sX2VtaXQpOiBGdW5jdGlvbiBkb2luZwotCW5vdGhpbmcgYmVjb21lcyBtYWNybyBkb2luZyBub3RoaW5nLgotCi1XZWQgU2VwICA3IDE5OjEwOjA5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IERlcGVuZCBvbiBjb25maWcuc3RhdHVzLgotCShjb25maWcuc3RhdHVzKTogUnVuIGNvbmZpZy5zdGF0dXMgZnJvbSAuIGluc3RlYWQgb2Ygc3JjZGlyLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19nZW5fcmVsb2MpOiBVc2UgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgdG8KLQlkaXNwbGF5IHRoZSBuYW1lIG9mIHRoZSByZWxvY2F0aW9uIHR5cGUgdGhhdCBjb3VsZG4ndCBiZSBoYW5kbGVkLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWFscGhhLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLiAgRGVsZXRlZCBhYm9ydCBjYWxsCi0JYWZ0ZXIgY2FsbCB0byBhc19mYXRhbC4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotbGludXgqKTogRG9uJ3Qgc2V0IGJmZF9nYXMuCi0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VULCBOTV9GT1JfVEFSR0VULCBPQkpEVU1QX0ZPUl9UQVJHRVQsCi0JaW5zdGFsbCwgdW5pbnN0YWxsKTogRG9uJ3QgdXNlICJicm9rZW5zZWQiIGhhY2sgYW55IG1vcmUsIHRoZSBuZXcKLQlhdXRvY29uZiBjb2RlIHNob3VsZCBuZXZlciBsZXQgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSBiZSBlbXB0eS4KLQotCVVwZGF0ZSBmb3IgYXV0b2NvbmYgYmV0YSAxLjExMjoKLQkqIGFjbG9jYWwubTQgKEdBU19DSEVDS19ERUNMX05FRURFRCwgR0FTX1dPUktJTkdfQVNTRVJUKTogTmV3Ci0JbWFjcm9zLgotCSogY29uZmlndXJlLmluOiBVc2UgdGhlbS4gIFVzZSBBQ19BUkdfUFJPR1JBTSAobm93IHByb3ZpZGVkIGJ5Ci0JYXV0b2NvbmYpIGluc3RlYWQgb2YgbXkgaGFja2VkLXVwIEFDX1BST0dSQU1fVFJBTlNGT1JNX05BTUUuICBNb3ZlCi0JdGVzdCBmb3IgQ1JPU1NfQ09NUElMRSBqdXN0IGJlZm9yZSBBQ19GVU5DX0FMTE9DQSwgYW5kIGVtaXQgYQotCW1lc3NhZ2UgdG8gdHJ5IHRvIGVhc2UgY29uZnVzaW9uIGFib3V0IGF1dG9jb25mJ3MKLQkiY3Jvc3MtY29tcGlsaW5nIiBtZXNzYWdlLgotCSogYWNjb25maWcuaCAoTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MsIE5FRURfREVDTEFSQVRJT05fRlJFRSwKLQlORUVEX0RFQ0xBUkFUSU9OX0VSUk5PKTogUmVuYW1lZCBmcm9tIE5FRURfKl9ERUNMQVJBVElPTi4KLQkqIGNvbmZpZ3VyZSwgY29uZi5pbjogUmVnZW5lcmF0ZWQuCi0KLVdlZCBTZXAgIDcgMTI6NDk6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoZWNrICR7aG9zdH0gYW5kICR7dGFyZ2V0fSByYXRoZXIgdGhhbgotCSR7aG9zdF9jYW5vbn0gYW5kICR7dGFyZ2V0X2Nhbm9ufS4KLQkqIGNvbmZpZ3VyZTogTGlrZXdpc2UuCi0KLVR1ZSBTZXAgIDYgMTE6NDI6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2NwdSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGluc25zX3NpbmNlX2NhY2hlX2FjY2Vzcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2JlZ2luKTogU2V0IG1pcHNfY3B1IGFzIHdlbGwgYXMgbWlwc19pc2EuCi0JKGFwcGVuZF9pbnNuKTogSWYgbWlwc19jcHUgaXMgNDYwMCwgcmVxdWlyZSBmb3VyIG5vcCBpbnN0cnVjdGlvbnMKLQliZXR3ZWVuIGFuIGluc3RydWN0aW9uIHdoaWNoIGFjY2Vzc2VzIHRoZSBjYWNoZSBhbmQgY2VydGFpbiBDQUNIRQotCWluc3RydWN0aW9ucy4gIEtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgc2VlbiBzaW5jZQotCWFuIGluc3RydWN0aW9uIHdoaWNoIGFjY2Vzc2VzIHRoZSBjYWNoZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogU2V0IG1pcHNfY3B1IGFzIHdlbGwgYXMgbWlwc19pc2EuCi0KLU1vbiBTZXAgIDUgMDc6MDk6MDAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoVlBBVEgpOiBEZWZpbmUgdXNpbmcgQHNyY2RpckAuCi0JKHByZWZpeCwgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSwgZXhlY19wcmVmaXgpOiBVc2UgYXV0b2NvbmYgc3R5bGUKLQlALXN1YnN0aXR1dGlvbnMuCi0KLVN1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogY29uZmlnL2hvLXJpc2NpeC5oLCBjb25maWcvdGMtYXJtLmMsIGNvbmZpZy90Yy1hcm0uaDogTmV3IGZpbGVzCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSB0aGUgYXJtLgotCi1GcmkgU2VwICAyIDE2OjA1OjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoYWRkX2ZpbGUpOiBEb24ndCB0cnkgdG8gZ2VuZXJhdGUgbGluZSBudW1iZXJzIGlmIHRoZQotCXN5bWJvbCB0YWJsZSBoYXMgYmVlbiBmcm96ZW4uCi0KLVRodSBTZXAgIDEgMTk6NDg6MDEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogYWNsb2NhbC5tNCAoQUNfUFJPR19DQyk6IFVzZSBBQ19ERUZVTiwgYW5kIG9taXQgQUNfUFJPVklERS4KLQotCSogY29uZmlndXJlLmluOiBIYW5kbGUgdXNlci1zcGVjaWZpZWQgYmZkLWFzc2VtYmxlciBvcHRpb24gd2l0aAotCXNlcGFyYXRlIHZhcmlhYmxlIGZyb20gcHJlZmVycmVkIGNvbmZpZ3VyYXRpb24sIHVudGlsIHRoZSB0d28gYXJlCi0JcmVzb2x2ZWQuICBJbmRpY2F0ZSBiZmRfZ2FzPXByZWZlcnJlZCBmb3IgbGludXggYS5vdXQuICBVc2UKLQlBQ19QUk9HUkFNX1RSQU5TRk9STV9OQU1FLCBmb3Igd2hpY2ggYSBwYXRjaCBoYXMgYmVlbiBzZW50IHRvIGRqbS4KLQkqIE1ha2VmaWxlLmluICh0YXJnZXRfYWxpYXMsIHByb2dyYW1fdHJhbnNmb3JtX25hbWUpOiBEZWZpbmUsCi0JdXNpbmcgYXV0b2NvbmYgQC1zdWJzdGl0dXRpb25zLgotCi1XZWQgQXVnIDMxIDE3OjQzOjA2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGF0b2YtZ2VuZXJpYy5jOiBEZWxldGVkIGFsbG9jYSBoYW5kbGluZyBoZXJlLgotCi0JKiBNYWtlZmlsZS5pbiAocHJlZml4LCBleGVjX3ByZWZpeCk6IFVzZSBALXN1YnRpdHV0aW9ucy4KLQotCSogYWNsb2NhbC5tNCAoQUNfT1VUUFVUX0xJTktTKTogRGVsZXRlZCByZWRlZmluaXRpb24sIHNpbmNlCi0JYXV0b2NvbmYgMS4xMDkgaGFzIHRoaXMgZml4ZWQuCi0JKiBjb25maWd1cmUuaW46IERvbid0IGNoYW5nZSBxdW90ZSBjaGFyYWN0ZXJzIGFyb3VuZCBBQ19NU0dfRVJST1IKLQlpbnZvY2F0aW9uLiAgRG9uJ3QgdXNlIEFDX0hFQURFUl9TVERDLCBzaW5jZSBpdCByZXF1aXJlcyBydW5uaW5nIGEKLQlwcm9ncmFtLiAgQ2FjaGUgTkVFRF8qX0RFQ0xBUkFUSU9OIHZhbHVlcy4KLQkqIGNvbmZpZ3VyZSwgY29uZi5pbjogUmVnZW5lcmF0ZWQgd2l0aCBhIG1vZGlmaWVkIGF1dG9jb25mIDEuMTA5LgotCi0JKiBhcy5oICh2b2xhdGlsZSk6IERvbid0IHRlc3Qgb3IgZGVmaW5lIGhlcmU7IG5vdCBuZWVkZWQuCi0JKGFsbG9jYSk6IFJlcGxhY2UgYWxsb2NhLWNvbmYuaCBpbmNsdXNpb24gd2l0aCBjb2RlIHJlY29tbWVuZGVkIGluCi0JYXV0b2NvbmYgZG9jdW1lbnRhdGlvbi4gIEluY2x1ZGUgY29uZmlnLmggZmlyc3QuCi0KLVdlZCBBdWcgMzEgMTE6MjA6NDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU19JU19ERUZJTkVEKTogQWJzb2x1dGUgc3ltYm9scyBhcmUgZGVmaW5lZAotCWFsc28uCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlOiBJbml0aWFsaXplIGJmZF9nYXMgdG8gbm8uCi0KLVR1ZSBBdWcgMzAgMTk6MzE6MTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogYXMuaDogSW5jbHVkZSBhbGxvY2EtY29uZi5oIGZyb20gImxpYmliZXJ0eSIsIG5vdAotCSIuLi9saWJpYmVydHkiLgotCi1Nb24gQXVnIDI5IDE2OjExOjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgpOiBEb24ndCBnZW5lcmF0ZSBhIHJlbG9jIHdoZW4gYQotCXN5bWJvbCBpcyB1c2VkIGFzIGFuIG9mZnNldCBpbnRvIGEgQ1NFQ1QgdGhhdCBpcyBub3QgYSBUT0MuICBUaGVzZQotCXR5cGVzIG9mIGxvYWRzIGFyZSBnZW5lcmF0ZWQgYnkgZ2NjIC1tbWluaW1hbC10b2MuCi0KLVN1biBBdWcgMjggMTM6MjI6NTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhcy5oIChmbGFnXyopOiBBZGRlZCBjb21tZW50cyBkZXNjcmliaW5nIG1lYW5pbmdzIG9mIHNvbWUgb2YKLQl0aGVzZSB2YXJpYWJsZXMuCi0JKHN0cnVjdCBmcmFnKTogQWRkIHNvbWUgY29tbWVudHMgYWJvdXQgdGhlIG5zMzJrLXNwZWNpZmljIGZpZWxkcwotCWFuZCB3aHkgdGhleSdyZSBoZXJlLgotCShTSVpFT0ZfU1RSVUNUX0ZSQUcpOiBDYXN0IGFkZHJlc3NlcyB0byBjaGFyKiwgbm90IGludC4KLQkoZmxhZ19wcmludF9zdGF0aXN0aWNzKTogRGVjbGFyZS4KLQotCSogYXMuYyAocGFyc2VfYXJncyk6IFNldCBmbGFnX3ByaW50X3N0YXRpc3RpY3MgaW5zdGVhZCBvZgotCXN0YXRpc3RpY3NfZmxhZy4gIE9wdGlvbnMgYXJyYXkgaXMgbm93IGNvbnN0LiAgQWRkZWQgbmV3IG9wdGlvbgotCSJkdW1wLWNvbmZpZyI7IGlmIHNwZWNpZmllZCwgcHJpbnQgVEFSR0VUX0FMSUFTLCBUQVJHRVRfQ0FOT05JQ0FMLAotCVRBUkdFVF9DUFUsIFRBUkdFVF9PQkpfRk9STUFULCBhbmQgVEFSR0VUX0ZPUk1BVCwgaWYgZGVmaW5lZC4KLQkobWFpbik6IENoYW5nZSB0ZXN0IHRvIGNoZWNrIGZsYWdfcHJpbnRfc3RhdGlzdGljcy4KLQkoc3RhdGlzdGljc19mbGFnKTogRGVsZXRlZC4KLQotCSogZnJhZ3MuYyAoZnJhZ192YXJpYW50KTogUmVtb3ZlZCBQQ1JFTF9BREpVU1QgYW5kIEJTUiBhcmd1bWVudHMuCi0JQWx3YXlzIGluaXRpYWxpemUgdGhlbSB0byB6ZXJvLgotCSogZnJhZ3MuaCAoZnJhZ192YXJpYW50KTogRml4ZWQgcHJvdG90eXBlLgotCSogY29uZmlnL3RjLWk5NjAuYyAoZ2V0X2NkaXNwKTogRG9uJ3QgcGFzcyB0aGUgZXh0cmEgemVybyBhcmdzLgotCSogY29uZmlnL3RjLW5zMzJrLmMgKGNvbnZlcnRfaWlmKTogRG9uJ3QgcGFzcyB0aGUgYXJndW1lbnRzOyBjYWNoZQotCXRoZSB2YWx1ZSBvZiBmcmFnX25vdyBhbmQgZmlsbCBpbiB0aGUgZmllbGRzIGxhdGVyLgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuLCByZWFsY2xlYW4pOiBSZW1vdmUgbmV3Ci0JY29uZmlndXJlLWdlbmVyYXRlZCBmaWxlcy4KLQotU2F0IEF1ZyAyNyAyMDoyNjoxMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20pCi0KLQlDb252ZXJzaW9uIHRvIGF1dG9jb25mOgotCSogYWNjb25maWcuaCwgYWNsb2NhbC5tNDogTmV3IGZpbGVzLgotCSogY29uZmlndXJlLmluOiBSZXdyaXR0ZW4gKGV4Y2VwdCBmb3Igc29tZSB0YXJnZXQtc3BlY2lmaWMgY29kZSkKLQlmb3IgYXV0b2NvbmYuCi0JKiBjb25mLmluLCBjb25maWd1cmU6IE5ldyBmaWxlcywgZ2VuZXJhdGVkIGZyb20gdGhlIGFib3ZlLgotCSogTWFrZWZpbGUuaW46IENoYW5nZWQgbWFnaWMgc2VxdWVuY2UgaW5kaWNhdGluZyBpbnNlcnRpb24gb2YKLQltYWtlZmlsZSBmcmFnbWVudHMuCi0JKFZQQVRILCBzcmNkaXIsIENDLCBMSUJTLCBPQkpTIGRlcGVuZGVuY2llcyk6IFVzZSBALXN1YnN0aXR1dGlvbnMKLQlmcm9tIGNvbmZpZ3VyZS4KLQkoTElOS0VEX0hFQURFUlMpOiBEZWxldGVkIGEub3V0LmdudS5oLCBhLm91dC5oLCBhbmQgaG9zdC5oLgotCShjb25maWcuc3RhdHVzLCBjb25maWd1cmUpOiBSZXdyaXRlIHJ1bGVzLgotCShjb25maWctc3RhbXApOiBEZXBlbmQgb24gY29uZi4gIFNraXAgdmFyaWFibGVzIHRoYXQgY29uZmlndXJlIGlzCi0Jbm93IHN1YnN0aXR1dGluZyBpdHNlbGYuCi0JKCoubyBkZXBlbmRlbmNpZXMpOiBEZWxldGVkIGhvc3QuaC4KLQkoZGlzdGNsZWFuLCByZWFsY2xlYW4pOiBEb24ndCBkZWxldGUgaG9zdC5oLgotCSogYXMuYzogRG9uJ3QgaW5jbHVkZSBzdGRpby5oLCBzdHJpbmcuaCwgc3lzL3R5cGVzLmguICBJbmNsdWRlCi0Jc2lnbmFsLmggYWZ0ZXIgYXMuaC4KLQkqIGFzLmg6IEluY2x1ZGUgYWxsb2NhLWNvbmYuaCBmaXJzdC4gIEluY2x1ZGUgY3R5cGUuaCwgc3RyaW5nLmgsCi0Jc3RyaW5ncy5oLCBzdGRsaWIuaCwgdW5pc3RkLmgsIHN5cy90eXBlcy5oLCBmb3Blbi1iaW4uaCwKLQlmb3Blbi1zYW1lLmgsIGFzIHN1Z2dlc3RlZCBieSBhdXRvY29uZiB0ZXN0IHJlc3VsdHMuCi0JW0JST0tFTl9BU1NFUlRdOiBEb24ndCBpbmNsdWRlIGFzc2VydC5oLgotCShzdHJkdXApOiBEZWNsYXJlLgotCSh2b2xhdGlsZSwgY29uc3QpOiBEZWZpbmUgaWYgbm90IF9fU1REQ19fIGFuZCBub3QgYWxyZWFkeSBkZWZpbmVkLgotCShtYWxsb2MsIHJlYWxsb2MpIFtORUVEX01BTExPQ19ERUNMQVJBVElPTl06IERlY2xhcmUuCi0JKGZyZWUpIFtORUVEX0ZSRUVfREVDTEFSQVRJT05dOiBEZWNsYXJlLgotCSogZ2FzcC5jOiBJbmNsdWRlIGNvbmZpZy5oLCBzdGRsaWIuaCAoaWYgSEFWRV9TVERMSUJfSCkuICBEb24ndAotCWluY2x1ZGUgaG9zdC5oLgotCShtYWxsb2MpIFtORUVEX01BTExPQ19ERUNMQVJBVElPTl06IERlY2xhcmUuCi0JKiBtZXNzYWdlcy5jOiBJbmNsdWRlIGFzLmggZmlyc3QuICBJbmNsdWRlIGVycm5vLmggb25seSBpZgotCUhBVkVfRVJSTk9fSC4gIElmIEhBVkVfVkFSQVJHU19IIGFuZCBub3QgX19TVERDX18sIHVuZGVmaW5lCi0JSEFWRV9TVERBUkdfSC4gIFNldCBOT19TVERBUkcgYW5kIE5PX1ZBUkFSR1MgYXMgYXBwcm9wcmlhdGUuCi0JKiBkb2MvTWFrZWZpbGUuaW4gKHNyY2RpciwgSU5TVEFMTCwgSU5TVEFMTF9QUk9HUkFNLAotCUlOU1RBTExfREFUQSk6IFVzZSBhdXRvY29uZiBALXN1YnN0aXR1dGlvbnMuCi0KLQkqIGlucHV0LWZpbGUuYzogRG9uJ3QgaW5jbHVkZSBhc3NlcnQuaCBoZXJlLCAnY2F1c2UgYXMuaCBhbHJlYWR5Ci0JaW5jbHVkZXMgaXQuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBBZGRlZCB2YXJpb3VzIHByb3RvdHlwZXMgZm9yIHN0YXRpYwotCWZ1bmN0aW9ucy4KLQkoaW5fcmFuZ2UpOiBOZXcgZnVuY3Rpb24sIHRlc3RzIHdoZXRoZXIgYSB2YWx1ZSBjYW4gZml0IGluIGFuCi0JTi1iaXQgZmllbGQuCi0JKGJ1aWxkX21lbSwgYnVpbGRfb3BlcmF0ZV9uKTogTmV3IGZ1bmN0aW9ucyBmb3IgY29uc3RydWN0aW5nCi0Jb3Bjb2RlIHZhbHVlcy4KLQkoZW1pdF9zbGxfbiwgZW1pdF9sZGFoX251bSwgZW1pdF9hZGRxX3IsIGVtaXRfbGRhX24pOiBOZXcKLQlmdW5jdGlvbnMgZm9yIGVtaXR0aW5nIHNpbmdsZSBpbnN0cnVjdGlvbnMsIG5vIGxvbmdlciByZXF1aXJpbmcgYQotCXJlY3Vyc2l2ZSBjYWxsIHRvIG1kX2Fzc2VtYmxlLgotCShlbWl0X2FkZDY0KTogTmV3IGZ1bmN0aW9uIGZvciBleHBhbmRpbmcgYSBSRUc6PVJFRytDT05TVAotCW9wZXJhdGlvbiBpbnRvIG9uZSBvciBtb3JlIGluc3RydWN0aW9ucywgdG8gaGFuZGxlIHdpZGUgY29uc3RhbnRzLgotCShjbGVhcl9pbnNuKTogTmV3IHZhcmlhYmxlLgotCShtZF9iZWdpbik6IEZpbGwgaXQgaW4gd2l0aCB6ZXJvcyBhbmQgQkZEX1JFTE9DX05PTkUgdmFsdWVzLgotCShhbHBoYV9pcCk6IFVzZSBpdCB0byBpbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlIGluc25zLgotCShhbHBoYV9pcCwgbGFiZWwgImltbWVkaWF0ZSIgYW5kIGNhc2VzICdQJywgJ0cnKTogVXNlIGVtaXRfYWRkNjQKLQlmb3IgY2FsY3VsYXRpb25zLgotCi1GcmkgQXVnIDI2IDE0OjQ2OjE1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbSkKLQotCSogc3Vic2Vncy5jIChzZWN0aW9uX3N5bWJvbCk6IFJldmVyc2Ugc3RpbGwtd3JvbmcgdGVzdCBvZgotCUVNSVRfU0VDVElPTl9TWU1CT0xTLgotCi0JKiB3cml0ZS5jIChCRkRfRkFTVF9TRUNUSU9OX0ZJTEwpOiBBbHdheXMgZGVmaW5lLgotCSh3cml0ZV9jb250ZW50cyk6IElmIGZpbGxfc2l6ZSBpcyAxLCB1c2UgbWVtc2V0IGluc3RlYWQgb2YgbG9vcGluZwotCWNhbGxpbmcgbWVtY3B5LgotCi1XZWQgQXVnIDI0IDEyOjQ2OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuaCAoTE9DQUxfTEFCRUwpOiBEZWZpbmUgYXMgMCwgZm9yIGNvbXBhdGliaWxpdHkKLQl3aXRoIG5hdGl2ZSBNSVBTIGFzc2VtYmxlci4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWlyaXgqKTogRG9uJ3Qgc2V0IGVtdWxhdGlvbi4KLQkqIGNvbmZpZy90ZS1pcml4Lmg6IFJlbW92ZS4KLQotCSogZWNvZmYuYyAoZWNvZmZfc3ltYm9sX25ld19ob29rKTogRG9uJ3QgYWRkIGEgbmV3IGZpbGUgaWYgd2UKLQloYXZlbid0IHNlZW4gYW55IGlucHV0IGZpbGVzIHlldC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9iZWdpbik6IEp1c3QgY2FsbCBzeW1ib2xfY3JlYXRlLCByYXRoZXIKLQl0aGFuIGNhbGxpbmcgc3ltYm9sX25ldyBhbmQgdGhlbiByZW1vdmluZyB0aGUgc3ltYm9sIGZyb20gdGhlCi0JbGlzdC4KLQotCSogYXMuYyAobWFpbik6IE1vdmUgYSBpbnNpZGUgdGhlICNpZiAwIGJsb2NrIHdoaWNoIHVzZXMgaXQuCi0JKiBlY29mZi5jIChjdXJyZW50X3N0YWJzX2ZpbGVuYW1lKTogTWFrZSBjb25zdC4KLQkqIGZyYWdzLmggKGZyYWdfYWxpZ25fcGF0dGVybik6IERlY2xhcmUuCi0JKiBnYXNwLmMgKG5ld19maWxlKTogQ2FzdCBpc3AgdG8gbG9uZywgYW5kIHVzZSAlbGQgdG8gcHJpbnQgaXQuCi0JKiBjb25maWcvdGMtYWxwaGEuaCAobWRfb3BlcmFuZCk6IEFkZCBjYXN0IHRvIHZvaWQuCi0JKGFscGhhX2RvX2FsaWduKTogRGVjbGFyZSBhcmd1bWVudCB0eXBlcy4KLQkodGNfZ2V0X3JlZ2lzdGVyKTogRGVjbGFyZS4KLQkoYWxwaGFfZnJvYl9lY29mZl9kYXRhKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkoc19tYXNrKTogRG9uJ3QgZGVjbGFyZTsgZG9lcyBub3QgZXhpc3QuCi0JKGxpbmVfY29tbWVudF9jaGFycyk6IFJlbW92ZSAvKiBmcm9tIGRlc2NyaXB0aXZlIGNvbW1lbnQuCi0JKHRjX2dldF9yZWdpc3Rlcik6IFJlbW92ZSB1bnVzZWQgbG9jYWwgcmVnLgotCSh0Y19nZW5fcmVsb2MpOiBEb24ndCBib3RoZXIgdG8gY29tcGFyZSB1bnNpZ25lZCB0byB6ZXJvLgotCShzX2Jhc2UpOiBDb3JyZWN0IHdhcm5pbmcgdG8gYWN0dWFsbHkgcHJpbnQgcmVnaXN0ZXIgbnVtYmVyLgotCShtZF9iZWdpbik6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIHJldHZhbCwgbG9zZSwgYW5kIGkuCi0JKGFscGhhX2ZpeF9hZGp1c3RhYmxlKTogTW92ZSBkZWZhdWx0IGNhc2UgaW5zaWRlIHN3aXRjaCB0byBhdm9pZAotCXdhcm5pbmcuCi0JKGxvYWRfc3ltYm9sX2FkZHJlc3MpOiBSZW1vdmUgdW51c2VkIGxvY2FscyByZWxvY19hZGRyLCBwLCBzeW0sCi0JYW5kIGFkZGVuZC4KLQkoZW1pdF9ieXRlX21hbmlwX3IpOiBEZWNsYXJlIHR5cGVzIGZvciBhbGwgYXJndW1lbnRzLgotCShlbWl0X2V4dHJhY3RfciwgZW1pdF9pbnNlcnRfciwgZW1pdF9tYXNrX3IpOiBMaWtld2lzZS4KLQkoZW1pdF9zaWduX2V4dGVuZCwgZW1pdF9iaXNfciwgc19wcm9jKTogTGlrZXdpc2UuCi0JKGFscGhhX2lwKTogVXNlIHNwcmludF92YWx1ZSB0byBwcmludCBvZmZzZXRUIHZhbHVlLiAgUmVtb3ZlCi0JdW51c2VkIGxvY2FsIHNpemUuICBSZW1vdmUgdW51c2VkIGxhYmVsIGdldF9tYWNyby4KLQkoYWxwaGFfZG9fYWxpZ24pOiBNYWtlIGZpbGwgY29uc3QuCi0JKG1kX2FwcGx5X2ZpeCk6IFJlbW92ZSB1bnVzZWQgbGFiZWwgY2hlY2tfem92LgotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBpNTg2IGFzIGEgc3lub255bSBmb3IgaVszNF04Ni4KLQotVHVlIEF1ZyAyMyAxMjozMjoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX2xpbmVfbmV3KTogQ2hhbmdlIGxpbmVfbnVtYmVyIGFyZ3VtZW50IGZyb20KLQl1bnNpZ25lZCBzaG9ydCB0byBpbnQgc28gdGhhdCB0aGUgdHlwZSBpbiB0aGUgcHJvdG90eXBlIG1hdGNoZXMKLQl0aGUgcHJvbW90ZWQgdHlwZSBpbiB0aGUgZGVmaW5pdGlvbi4KLQkoc3RhY2tfZGVsZXRlKTogQ29tbWVudCBvdXQ7IG5vdCB1c2VkLgotCSogY29uZmlnL29iai1jb2ZmLmggKHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayk6IERlY2xhcmUgaWYgbm90Ci0JQkZEX0FTU0VNQkxFUiwgbm90IGlmIEJGRF9BU1NFTUJMRVIuICBEZWNsYXJlIGFyZ3VtZW50IHR5cGUuCi0JKiBjb25maWcvdGMtbTY4ay5oICh0Y19jb2ZmX3NpemVtYWNoZGVwKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayk6IEFkZCBpZ25vcmVkCi0JYXJndW1lbnQuCi0KLVR1ZSBBdWcgMTYgMDE6NDg6MjAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9jb25maWcvdGMtaHBwYS5jIChwYV9jb21tKTogVW5kbyBsYXN0IGNoYW5nZS4gIFNldCBzeV9mcmFnIGZvcgotCXRoZSBjb21tb24gc3ltYm9sIHRvIHRoZSB6ZXJvIGFkZHJlc3MgZnJhZyAodGhlIGNvcnJlY3QgZml4KS4KLQotVHVlIEF1ZyAxNiAwMTo0ODoyMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2NvbmZpZy90Yy1ocHBhLmMgKHBhX2NvbW0pOiBVbmRvIGxhc3QgY2hhbmdlLiAgU2V0IHN5X2ZyYWcgZm9yCi0JdGhlIGNvbW1vbiBzeW1ib2wgdG8gdGhlIHplcm8gYWRkcmVzcyBmcmFnICh0aGUgY29ycmVjdCBmaXgpLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9jb21tKTogU2V0IHN5X3Jlc29sdmVkIGZvciB0aGUgY29tbW9uCi0Jc3ltYm9sLgotCi1GcmkgQXVnIDEyIDE3OjUxOjQ4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBEcm9wICJlbCIgZnJvbSB0aGUgZW5kIG9mCi0JVEFSR0VUX0NQVS4gIENoZWNrIGZvciBtaXBzNjRvcmlvbi4KLQotVHVlIEF1ZyAgOSAxOTo0Mzo0NSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZWNvZ25pemUgcHBjLSotbmV0d2FyZS4KLQkqIGNvbmZpZy90ZS1wcGNudy5oOiAgTmV3IGZpbGUgdG8gc3VwcG9ydCBQb3dlci1QQy9OZXR3YXJlCi0JY29uZmlndXJhdGlvbnMuICBDdXJyZW50bHksIGl0IGp1c3QgZW5hYmxlcyB0aGUgdXNlIG9mIGJhY2tzbGFzaAotCWVzY2FwZXMgaW4gc3RyaW5nIGRpcmVjdGl2ZXMuCi0KLVR1ZSBBdWcgIDkgMTE6MTI6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19zdGFieCk6IENhbGwgZXhwcmVzc2lvbiBkaXJlY3RseSwgcmF0aGVyCi0JdGhhbiB2aWEgcHNldWRvX3NldC4gIElmIGV4cHJlc3Npb24gaXMgYSBzeW1ib2wsIG1vdmUgc3RhYiBzeW1ib2wKLQl0byBqdXN0IGFmdGVyIHN5bWJvbCBmcm9tIGV4cHJlc3Npb24uCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3Byb2NzKTogRG9uJ3QgZm9yY2UgYWRyIG9mIGZpcnN0IGZkciB0byBiZQotCXplcm8uICBVbmRvZXMgY2hhbmdlIG9mIEp1bmUgNCwgMTk5My4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWNjZXB0IC1tY3B1PTQ0MDAsIDQ2MDAsIGFuZAotCW9yaW9uLgotCi1Nb24gQXVnICA4IDE2OjI4OjA4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGFzLmg6IFJlbW92ZSBGT1BFTl9XQiBwYXRjaCBvZiBBdWcgNi4KLQkqIGNvbmZpZ3VyZS5pbjogQ29uZmlndXJlIGZvciBoby1nbzMyIGNvcnJlY3RseS4KLQkqIGNvbmZpZy9oby1nbzMyLmg6IEZpeCBjb3B5cmlnaHQuCi0KLU1vbiBBdWcgIDggMTE6NTk6NTEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9jb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBEZWxldGUgcmVkdW5kYW50Ci0JdXBwZXItY2FzZSB2ZXJzaW9ucyBvZiB0aGUgcHNldWRvLW9wcy4KLQotTW9uIEF1ZyAgOCAxMzo0MjoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgpOiBJZiB3ZSBhcmUgZ29pbmcgdG8gZ2VuZXJhdGUgYQotCW5vbiBQQyByZWxhdGl2ZSByZWxvYywgZG9uJ3QgcHV0IHRoZSBhZGRlbmQgaW4gdGhlIG9iamVjdCBmaWxlLgotCi1TYXQgQXVnICA2IDAxOjE1OjAyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGFzLmg6IElmIEZPUEVOX1dCIGlzIG5vdCBkZWZpbmVkLCBkbyB0aGUgcmlnaHQgdGhpbmcgaW4gYSBnbzMyCi0JZW52aXJvbm1lbnQuCi0KLU1vbiBKdWwgMTEgMTE6MzQ6NTIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKHBpbnQpOiBOZXcgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHZhcnlpbmcKLQlzaXplIG9mIGludCBwc2V1ZG8gb3AuCi0JKiBkb2MvYXMudGV4aW5mbzogRml4IHR5cG8gZGVzY3JpYmluZyAuaDgzMDBoIHBzZWR1b3AuCi0KLU1vbiBBdWcgIDEgMDI6NDA6NDMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGNyZWF0ZV9uZXdfc3BhY2UpOiBJbml0aWFsaXplIHNkX3N1YnNwYWNlcwotCWZpZWxkIGluIHRoZSBzcGFjZSBjaGFpbi4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbQotCWhwcGFfZ2VuX3JlbG9jX3R5cGUuCi0KLVRodSBKdWwgMjggMTU6NDU6MzcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogQ2hlY2sgbW9yZSBjYXJlZnVsbHkgZm9yCi0JY29uZmxpY3RpbmcgYXJjaGl0ZWN0dXJlcy4KLQkobWRfcGFyc2Vfb3B0aW9uKSBbTk9fVjldOiBDb21wbGFpbiBpZiB2OSB3YXMgc2VsZWN0ZWQuCi0JKG1kX3Nob3dfdXNhZ2UpOiBEZXJpdmUgYXJjaGl0ZWN0dXJlIGxpc3QgaW4gdXNhZ2UgbWVzc2FnZSBmcm9tCi0JYXJjaGl0ZWN0dXJlX3BuYW1lIGFycmF5LgotCShjeXByZXNzKTogTWFjcm8gZGVsZXRlZC4KLQkob3BfaGFzaCk6IERvbid0IGluaXRpYWxpemUuCi0JKHNfY29tbW9uKTogVXNlIGJmZF91bmRfc2VjdGlvbl9wdHIgaW5zdGVhZCBvZiBiZmRfdW5kX3NlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChCU1IpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX2lwKTogVXNlIGl0IGZvciByaWdodC1zaGlmdCBvcGVyYXRpb25zIG9mIDMyIGJpdHMgb3IgbW9yZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogSW1wbGVtZW50IG5ldyBvcGVyYW5kIHR5cGUgJ3gnLgotCi1UdWUgSnVsIDI2IDE4OjIxOjI0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBNb3ZlZCBjb21tb24gaW5jbHVkZXMgYW5kIFRBUkdFVF9GT1JNQVQKLQlkZWZpbml0aW9ucyB0b2dldGhlci4KLQkoV09SS0lOR19ET1RfV09SRCwgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRCwKLQlPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUiwgQkZEX0hFQURFUlMsIEJGRCkgWyFCRkRfQVNTRU1CTEVSXToKLQlNb3ZlZCB0aGVzZSBkZWZpbml0aW9ucyB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGUsIGJlZm9yZSB0aGUKLQlpbmNsdWRlcy4KLQkoU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUywgT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMpOiBBbHdheXMKLQlkZWZpbmUgdGhlc2UuCi0JKFNfR0VUX1pFUk9FUyk6IERlbGV0ZWQuCi0JKFNfU0VUX1pFUk9FUyk6IE1vdmVkIHRvIG9iai1jb2ZmLmMuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl8qIHBzdWVkby1vcCBmbnMpOiBEZWxldGVkCi0JZm9yd2FyZCBkZWNsYXJhdGlvbnMuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBNb3ZlZCB0byBvbmUgdmVyc2lvbiBlbmQgb2YgZmlsZSwKLQljb25kaXRpb25hbGl6ZWQgaW50ZXJuYWxseS4KLQkoc3RhY2sgdHlwZWRlZiwgc3RhY2tfaW5pdCwgc3RhY2tfZGVsZXRlLCBzdGFja19wdXNoLCBzdGFja19wb3AsCi0JdGFnX2hhc2gsIHRhZ19pbml0LCB0YWdfaW5zZXJ0LCB0YWdfZmluZCwgdGFnX2ZpbmRfb3JfbWFrZSk6IE1vdmVkCi0JdG8gb25lIGNvbWJpbmVkIHZlcnNpb24gYXQgdG9wIG9mIGZpbGUsIHVuY29uZGl0aW9uYWwuICBEZWxldGVkCi0JZm9yd2FyZCBkZWNsYXJhdGlvbnMuCi0JKHNfZ2V0X25hbWUpOiBNb3ZlZCBvbmUgY29weSBvZiBkZWNsYXJhdGlvbnMgdG8gc3RhcnQgb2YgZmlsZS4KLQkoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk6IERpdHRvLiAgRG9uJ3QgaW5pdGlhbGl6ZS4KLQkoU19TRVRfWkVST0VTKTogTW92ZWQgaGVyZSBmcm9tIG9iai1jb2ZmLmguCi0JKHdyaXRlX29iamVjdF9maWxlKTogSWYgVENfQ09GRl9TRVRfTUFDSElORSBpcyBkZWZpbmVkLCBjYWxsIGl0IG9uCi0JdGhlIGZpbGUgaGVhZGVycy4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHNlZ19pbmZvX29mZl9ieV80KTogTm93IGNvbnN0IGFuZCBzdGF0aWMuCi0JKFNFR19JTkZPX0ZST01fU0VHX05VTUJFUik6IFVudXNlZCBtYWNybyBkZWxldGVkLgotCShwcmV2aW91c19maWxlX3N5bWJvbCwgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sX2V4dGVyblAsCi0Jc3ltYm9sX2V4dGVybl9sYXN0UCwgbGFzdF9mdW5jdGlvblApIFshQkZEX0FTU0VNQkxFUl06IERvbid0Ci0JYm90aGVyIGV4cGxpY2l0bHkgaW5pdGlhbGl6aW5nIHRvIHplcm8gdmFsdWUuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KSBbVENfSTk2MF06IFVzZSBTRl9HRVRfQkFMTkFNRQotCWFuZCBTRl9HRVRfQ0FMTE5BTUUgaW5zdGVhZCBvZiB0aGUgVENfU19JU18gdmVyc2lvbnMuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmggKFRDX0NPRkZfU0VUX01BQ0hJTkUpOiBOZXcgbWFjcm8uICBDYWxscwotCXRjX2hlYWRlcnNfaG9vay4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAodGFyZ19oYXNfaWNsYXNzKTogVXNlIElfQ1ggfCBJX0NYMiB3aGVyZSBJX0NYCi0Jd2FzIHVzZWQgcHJldmlvdXNseS4KLQkodGNfaGVhZGVyc19ob29rKTogSWYgSV9DWDIgaXMgZm91bmQsIHNldCBmbGFncyB0byBGX0k5NjBDQS4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAocG9faGFzaCk6IERlY2xhcmF0aW9uIGRlbGV0ZWQuCi0JKG5leHRfb2JqZWN0X2ZpbGVfY2hhclApOiBEaXR0by4KLQkocmVnbmFtZXMsIGFyZWdzLCBjb2opOiBOb3cgY29uc3QuCi0JKHBhcnNlX21lbW9wKTogU3RhdGljIGFycmF5IGRlZl9zY2FsZSBub3cgY29uc3QuCi0JKG1kX2JlZ2luKTogQ2FzdCBhd2F5IGNvbnN0IHdoZW4gcGFzc2luZyBoYXNoIHJvdXRpbmVzIGFkZHJlc3NlcwotCW9mIHZhbHVlcyBpbiByZWduYW1lcyBvciBhcmVncy4KLQkobWRfbG9uZ29wdHMpOiBBZGRlZCAibGluay1yZWxheCIgYW5kICJuby1yZWxheCIgaHlwaGVuYXRlZCBmb3Jtcy4KLQlDb250aW51ZSB0byBhY2NlcHQgb25lLXdvcmQgZm9ybXMuCi0JKHN0cnVjdCB0YWJlbnRyeSwgYXJjaF90YWIpOiBNb3ZlZCB0byB0b3AgbGV2ZWwgZnJvbSBpbnNpZGUKLQltZF9wYXJzZV9vcHRpb24uICBOb3cgY29uc3QuCi0JKG1kX3Nob3dfdXNhZ2UpOiBVc2UgYXJjaF90YWIgdG8gZ2VuZXJhdGUgdXNhZ2UgbWVzc2FnZS4gIFByaW50Ci0JaHlwaGVuYXRlZCBmb3JtcyBvZiByZWxheCBvcHRpb25zLgotCi0JKiBjb25maWcvdGMtaTk2MC5oIChERUZJTkVfSTk2MF9BT1VULCBUQ19TX0lTXyosIFRDX1NfKl9TWVNQUk9DLAotCVRDX1NfRk9SQ0VfVE9fKik6IE1vdmVkIGZyb20gaGVyZS4uLgotCSogY29uZmlnL3RjLWk5NjAuYzogLi4uIHRvIGhlcmUuICBDaGFuZ2VkIERFRklORV9JOTYwX0FPVVQgc3R1ZmYKLQl0byB0ZXN0IE9CSl9BT1VUIGFuZCBPQkpfQk9VVCBkaXJlY3RseS4KLQotCSogY29uZmlnL3RjLWk5NjAuaCAoQ1RSTCwgQ09CUiwgQ09KLCBSRUcsIE1FTSosIEZCUkEsIENBTExKLAotCU0xLU0zLCBSRUdfT1BDLCBSXyosIFNGUiwgTElULCBGUCwgT1AsIFIsIFJTLCBSTCwgUlNMLCBGLAotCXtSLEZ9eyxMfXsyLDR9LCBNLCBTRlJfT0ssIExJVF9PSywgRlBfT0ssIFJFR19BTElHTiwgTUVNT1AsIElfKik6Ci0JTWFjcm9zIGRlbGV0ZWQuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKEFSQ0hfSlgpOiBEZWZpbmUuCi0JKGFyY2hfdGFiKTogSW5jbHVkZSBKWC4KLQkodGFyZ19oYXNfc2ZyLCB0YXJnX2hhc19pY2xhc3MpOiBIYW5kbGUgSlguCi0JKHRjX2hlYWRlcnNfaG9vayk6IFNldCBmbGFncyB0byBGX0k5NjBKWCBmb3IgaTk2MEpYLgotCi1GcmkgSnVsIDE1IDE1OjM2OjUxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBIYWQgbGFzdCBjaGFuZ2UgYmFja3dhcmRzLgotCi1UaHUgSnVsIDE0IDEzOjIxOjA2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9hdG9mLW5zMzJrLmM6IERlbGV0ZWQuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IFVzZQotCWJmZF9pbmRfc2VjdGlvbl9wdHIgYW5kIGJmZF91bmRfc2VjdGlvbl9wdHIuCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogQ29tcGFyZSBzZWdUIHZhbHVlcyBkaXJlY3RseSwKLQl3aXRob3V0IGNhc3RpbmcgdG8gaW50IGZpcnN0LgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfYmVnaW4pOiBSZXR1cm4gdmFsdWUgZnJvbSBoYXNoX2luc2VydAotCXNob3VsZCBiZSBwb2ludGVyIHRvIGNvbnN0LiAgRG9uJ3QgY2FsbCBleGl0IGV4cGxpY2l0bHkgYWZ0ZXIKLQljYWxsaW5nIGFzX2ZhdGFsOyBpdCB3b24ndCByZXR1cm4uCi0JKGNvbnZlcnRfaWlmKTogTWFrZSBsb2NhbCB2YXJpYWJsZSBqIGJlIHBvaW50ZXIgdG8gYml0X2ZpeFMsIHNpbmNlCi0JdGhhdCdzIGhvdyBpdCdzIHVzZWQuCi0JKGVuY29kZV9vcGVyYW5kLCBjYXNlICdiJyk6IElnbm9yZSBzcHJpbnRmIHJldHVybiB2YWx1ZS4gIERvbid0IHRyeQotCWNvbnZlcnRpbmcgZnJlZXB0ciB0byBpbnQgYW5kIGJhY2suCi0KLQlNZXJnZWQgaW4gTlMzMksgc3VwcG9ydCB1cGRhdGUgZnJvbSBJYW4gRGFsbCAoZGFsbEBoZnJkLmRzdG8uZ292LmF1KToKLQotCSogY29uZmlnL3RlLXBjNTMybWFjaC5oOiBOZXcgZmlsZS4gcGM1MzItbWFjaCB0YXJnZXQgZW11bGF0aW9uLgotCi0JKiBjb25maWcvdGUtbmV0YnNkNTMyLmg6IE5ldyBmaWxlLiBOZXRic2Q1MzIgdGFyZ2V0IGVtdWxhdGlvbi4KLQotCSogY29uZmlnL3RjLW5zMzJrLmg6IEFkZCBkZWZpbml0aW9uIG9mIE5PUF9PUENPREUuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5oOiBBZGQgcHJvdG90eXBlIGZvciBmaXhfbmV3X25zMzJrX2V4cC4KLQotCSogY29uZmlnL3RjLW5zMzJrLmg6IEFkZCBCRkRfQVNTRU1CTEVSIHN1cHBvcnQuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jICh0Y19nZW5fcmVsb2MpOiBOZXcgZnVuY3Rpb24gZm9yIEJGRF9BU1NFTUJMRVIuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChmaXhfbmV3X25zMzJrX2V4cCk6IEdldCByZWxvYyB0eXBlCi0JZGlmZmVyZW50bHkgZm9yIEJGRF9BU1NFTUJMRVIuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IEdldCByZWxvYwotCXR5cGUgZGlmZmVyZW50bHkgZm9yIEJGRF9BU1NFTUJMRVIuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9jcmVhdGVfbG9uZ19qdW1wKTogU2l6ZSBvZiBvcGNvZGUgaXMgb25lCi0Jbm90IDIuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9jb252ZXJ0X2ZyYWcpOiBDb2RlIGZvciB0aGUgQkZEX0FTU0VNQkxFUgotCWNhc2UuIEFsc28gdXNlIHNtYXJ0IG1kX3BjcmVsX2FkanVzdCBmdW5jdGlvbi4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2FwcGx5X2ZpeCk6IENvZGUgZm9yIHRoZSBCRkRfQVNTRU1CTEVSCi0JY2FzZS4gQWxzbyB1c2Ugc21hcnQgbWRfZml4X3BjcmVsX2FkanVzdCBmdW5jdGlvbi4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2ZpeF9wY3JlbF9hZGp1c3QpOiBOZXcgZnVuY3Rpb24gd2hpY2ggY2FuCi0JZmluZCBvZmZzZXQgZnJvbSBvcGNvZGUgdG8gb3BlcmFuZCBldmVuIGlmIGluIGFub3RoZXIgZnJhZwotCWFuZCBpbiB0aGUgcHJlc2VuY2Ugb2YgcmVsYXhpbmcuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9wY3JlbF9hZGp1c3QpOiBOZXcgZnVuY3Rpb24gd2hpY2ggY2FuCi0JZmluZCBvZmZzZXQgZnJvbSBvcGNvZGUgdG8gb3BlcmFuZCBldmVuIGlmIGluIGFub3RoZXIgZnJhZwotCWFuZCBpbiB0aGUgcHJlc2VuY2Ugb2YgcmVsYXhpbmcuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9udW1iZXJfdG9fZGlzcCk6IENoZWNrIHJhbmdlcyBwcm9wZXJseS4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2F0b2YpOiB1c2UgYXRvZl9pZWVlIGluc3RlYWQgb2Ygc3BlY2lhbAotCWF0b2ZfbnMzMmsuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChyZWxvYyk6IE5ldyAoc3RhdGljKSBmdW5jdGlvbiBmb3IKLQlCRkRfQVNTRU1CTEVSLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoY29udmVydF9paWYpOiBNb3JlIGNvcnJlY3QgcGMgcmVsYXRpdmUgY29kZS4KLQltZF9yZWxheCBtdXN0IGJlIGFibGUgdG8gZmluZCBvcGNvZGUgYWRkcmVzcyBldmVuIGlmIGluIGFub3RoZXIgZnJhZy4KLQotCSogY29uZmlnL3RjLW5zMzJrLmM6IE1vcmUgZXh0ZW5zaXZlIGNvbW1lbnRzLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoZW5jb2RlX29wZXJhbmQpOiBTdXBwb3J0IG5ldyBvcGVyYW5kIGNsYXNzZXMgSQotCWFuZCBaLiBEcm9wIFEuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChmaXhfbmV3X25zMzJrX2V4cCk6IG5ldyBmdW5jdGlvbiBhbmQKLQljb3JyZXNwb25kaW5nIHByb3RvdHlwZS4KLQotCSogY29uZmlnL3RjLW5zMzJrLmM6IG1ha2UgMzI1MzIgZGVmYXVsdCBtYWNoaW5lIGluc3RlYWQgb2YgMzIwMzIuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBpbmNsdWRlIG9wY29kZS9uczMyay5oIGFmdGVyIGFzLmgKLQotCSogYW91dF9nbnUuaDogcl9kaXNwIG5lZWRzIHRvIGJlIDIgYml0cyBmb3IgVENfTlMzMksKLQotCSogd3JpdGUuaDogZnhfaW1fZGlzcCBuZWVkcyB0byBiZSAyIGJpdHMgYmlnIGZvciBUQ19OUzMySwotCi0JKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogVXNlIFRDX1BDUkVMX0FESlVTVCBtYWNybyAoaWYgZGVmaW5lZCkKLQlpbnN0ZWFkIG9mIGFkZGluZyBwY3JlbF9hZGp1c3QuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQWRqdXN0IHRvX2FkZHIgZm9yIHRoZQotCUJST0tFTl9ET1RfV09SRCBmZWF0dXJlIGZvciB0aGUgQkZEX0FTU0VNQkxFUiBjYXNlLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFVzZSBUQ19DT05TX0ZJWF9ORVcgaWYgaXQgaXMgZGVmaW5lZC4KLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBBZGQgY29kZSAoY3VycmVudGx5IGlmCi0JQkZEX0ZBU1RfU0VDVElPTl9GSUxMIGlzIGRlZmluZWQpIHRvIG1ha2UgbGFyZ2UgZmlsbHMgYSBsb3QgZmFzdGVyLgotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBuczMyayBmcm9tIHNwZWNpYWwgRlAgbGlzdC4gQWxsIHRoZSBuczMyawotCXNlcmllcyB1c2UgaWVlZSBmbG9hdC4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbnMzMmstcGM1MzItbWFjaCBhbmQgbnMzMmstcGM1MzItbmV0YnNkIHRhcmdldHMKLQotCSogYXMuaDogaW5jbHVkZSBleHByLmggYmVmb3JlIHRhcmctZW52LmguIFNvbWUgdGFyZ2V0IGRlcGVuZGVudCBmaWxlCi0Jd2FudCB0byB1c2UgZXhwciBzdHJ1Y3R1cmVzLgotCi1XZWQgSnVsIDEzIDE0OjQ5OjA1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IENoYW5nZSBycCB0byBiZSBhIGNvbnN0IHBvaW50ZXIuCi0JKG1kX3BhcnNlX29wdGlvbik6IENsZWFyIGNwdSBmaWVsZCBvZiBjdXJyZW50X2FyY2hpdGVjdHVyZSBiZWZvcmUKLQlzZXR0aW5nIGEgbmV3IGNwdSB0eXBlLiAgQ2xlYXIgbm9fNjg4ODEgZm9yIG02ODg4MSBvciBtNjg4ODIuCi0JQ2xlYXIgbm9fNjg4NTEgZm9yIG02ODg1MS4KLQotVHVlIEp1bCAxMiAyMToyNzowNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tc3lzdi5oIChyZWFsbG9jKTogRGVjbGFyZS4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfY3JlYXRlKTogTmV3IGZ1bmN0aW9uLCBtb3N0IG9mIHRoZSBndXRzIG9mIHRoZQotCW9sZCBzeW1ib2xfbmV3IGZ1bmN0aW9uLgotCShzeW1ib2xfbmV3KTogTm93IGp1c3QgY2hlY2tzIHN5bWJvbF90YWJsZV9mcm96ZW4sIGNhbGxzCi0Jc3ltYm9sX2NyZWF0ZSwgYW5kIGVudGVycyB0aGUgc3ltYm9sIGludG8gdGhlIHN5bWJvbCB0YWJsZS4KLQkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBJZiBFTUlUX1NFQ1RJT05fU1lNQk9MUyBpcyBub3QgdHJ1ZSwKLQlhbmQgdGhlIHN5bWJvbCB0YWJsZSBpcyBmcm96ZW4sIGNhbGwgc3ltYm9sX2NyZWF0ZSBpbnN0ZWFkIG9mCi0Jc3ltYm9sX25ldy4KLQkqIHN5bWJvbHMuaCAoc3ltYm9sX2NyZWF0ZSwgc3ltYm9sX3RhYmxlX2Zyb3plbik6IERlY2xhcmUuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMpOiBBbHdheXMgYSBmdW5jdGlvbiBub3cuCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMpOiBEZWxldGVkIG1hY3JvCi0JdmVyc2lvbi4KLQotCSogc3ltYm9scy5jIChkZWJ1Z192ZXJpZnlfc3ltY2hhaW4pOiBOZXcgbWFjcm8sIGRlZmluZWQgdG8gYmUKLQl2ZXJpZnlfc3ltYm9sX2NoYWluIG9yIGEgY2FzdCB0byB2b2lkLCBkZXBlbmRpbmcgb24gREVCVUdfU1lNUy4KLQkobWFueSBmdW5jdGlvbnMpOiBJbnZva2UgZGVidWdfdmVyaWZ5X3N5bWNoYWluIHVuY29uZGl0aW9uYWxseS4KLQotVHVlIEp1bCAxMiAxMjowNjo0MiAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAeDEuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5oOiBjaGFuZ2UgY2FsbGluZyBpbnRlcmZhY2Ugb2YKLQlPQkpfR0VORVJBVEVfQVNNX0xJTkVfU1RBQi4KLQkqIGNvbmZpZy9vYmotZWxmLmg6IGRpdHRvLgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBkaXR0by4KLQkqIGVjb2ZmLmg6IGNoYW5nZSBjYWxsaW5nIGludGVyZmFjZSBvZgotCWVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lX3N0YWIuCi0JKiBlY29mZi5jIChhZGRfZmlsZSk6IHJlY29yZCBvZiBmaWxlbmFtZSB0byBoYW5kbGUgY2FzZSBvZiBpbmNsdWRlCi0JZmlsZXMsIGFsc28gY2hhbmdlIGRlZmF1bHQgYnVpbHQtaW4gdHlwZSBmcm9tIGludCB0byB2b2lkIGZvcgotCWFzbSBmaWxlLgotCSogZWNvZmYuYyAoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVfc3RhYik6IGhhbmRsZSBjYXNlIG9mIGluY2x1ZGUKLQlmaWxlcy4KLQotTW9uIEp1bCAxMSAxNzoyMDoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogSW4gY2FzZSBNX0xBX0FCLCBTVlI0X1BJQywgbGFyZ2UKLQljb25zdGFudCwgYW5kIGNhc2UgbGRkX3N0ZCwgc2V0IG1pcHNfb3B0aW1pemUgdG8gMiB0ZW1wb3JhcmlseSB0bwotCWF2b2lkIGluc2VydGluZyBhbiB1bmV4cGVjdGVkIG5vcCBpbnN0cnVjdGlvbi4KLQotU2F0IEp1bCAgOSAwMDowNToxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2xpbmVubyk6IEhhbmRsZSBjb3VudCBjb3JyZWN0bHkgZm9yIGxhc3QKLQlsaW5lIG51bWJlci4KLQotRnJpIEp1bCAgOCAxNToyMjowNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBnYXNwLmMgKHByb2Nlc3NfcHNldWRvX29wKTogUGFzcyByaWdodCBhcmdzIHRvIGRvIGRvX2FpZi4KLQkoZ2V0X2FueV9zdHJpbmcpOiBOZXcgYXJnICdwcmV0ZW5kX3F1b3RlJy4KLQkoZ2V0X2FuZF9wcm9jZXNzLCBkb19mb3JtYWxzLCBtYWNyb19leHBhbmQsIGRvX3NkYXRhLAotCXByb2Nlc3NfcHNldWRvX29wKTogVXNlIG5ldyBhcmcuCi0KLUZyaSBKdWwgIDggMTI6MjM6NDQgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5oOiBkZWZpbmUgbWFjcm8gT0JKX0dFTkVSQVRFX0FTTV9MSU5FX1NUQUIuCi0JKiBjb25maWcvb2JqLWVsZi5oOiBkaXR0by4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogZ2VuZXJhdGUgbGluZSBzdGFicyBmb3IgYXNtIGZpbGUuCi0JKiByZWFkLmg6IGFkZCBleHRlcm4gZ2VuZXJhdGVfYXNtX2xpbmVfc3RhYi4KLQkqIGVjb2ZmLmggOiBhZGQgcHJvdG90eXBlIGZvciBlY29mZl9nZW5lcmF0ZV9hc21fbGluZV9zdGFiKCkuCi0JKiBlY29mZi5jIChhZGRfZmlsZSk6IGlmIHRoZXJlJ3Mgbm8gZmlsZW5hbWUgcHJvdmlkZWQsIHNldCBzd2l0Y2gKLQl0byBnZW5lcmF0ZSBsaW5lIHN0YWJzIGZvciAucyBmaWxlLgotCSogZWNvZmYuYyAoYWRkX3Byb2NlZHVyZSk6IGFkZCBzdGFicyBzeW1ib2wgZm9yIC5lbnQgZGlyZWN0aXZlLgotCSogZWNvZmYuYyAoZ2VuZXJhdGVfZWNvZmZfc3RhYik6IGNyZWF0ZXMgYW4gYXJ0aWZpY2lhbCBzdGFicy4KLQkqIGVjb2ZmLmMgKGdlbmVyYXRlX2FzbV9saW5lX3N0YWIpOiBnZW5lcmF0ZSBhIGFydGlmaXRpYWwgbGFiZWwKLQlmb3IgZWFjaCBsaW5lIGFuZCBnZW5lcmF0ZSBhIHN0YWJuIGZvciB0aGUgbGluZS4KLQotVGh1IEp1bCAgNyAxNzowNDowMyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBnYXNwLmMgKGdldF9hbnlfc3RyaW5nKTogQ29wZSB3aXRoIGdldHRpbmcgYSBzdHJpbmcgd2l0aCBhbgotCWFsdGVybmF0ZSBiYXNlIHNwZWNpZmllci4KLQkoZG9fYWlmLCBkb19hZWxzZSk6IE9ubHkgZW5hYmxlIG91dHB1dCBpZiBleHByZXNzaW9uIGlzIHRydWUgYW5kIHByZXZpb3VzCi0JbGV2ZWwgd2FzIG9uLgotCShjaGFydHlwZV9pbml0KTogIEFkZCBCQVNFQklUIGNoYXJ0eXBlLgotCShwcm9jZXNzX3BzZXVkb19vcCk6ICBOb3RpY2UgbmVzdGVlZCBBSUZzLgotCi1UaHUgSnVsICA3IDEyOjMwOjIyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmMgKGRvX2FfZml4X2ltbSk6IENvZGUgZm9yIDIgYml0IHJlbG9jIHR5cGUgdXNpbmcgaW4gdHJhcGEKLQlpbnNuLiAgKGZpeCBwciA1MTY1LCA1MTc0KQotCi1UaHUgSnVsICA3IDExOjMxOjMyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChSX0RMVF9SRUwpOiBJZiBpdCBpc24ndCBkZWZpbmVkLCB0aGVuIGRlZmluZQotCXRvIGFuIGFwcHJvcHJpYXRlIHZhbHVlIHRvIGF2b2lkIGxvc2luZyBvbiBvbGQgaHB1eCBzeXN0ZW1zLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9hZGp1c3RhYmxlKTogUmVqZWN0IHJlZHVjdGlvbnMgZm9yCi0Jc3ltYm9scyBpbiBETFQgcmVsYXRpdmUgcmVsb2NzLgotCSh0Y19nZW5fcmVsb2MpOiBaZXJvIG91dCB0aGUgYWRkZW5kIGZpZWxkIGZvciBETFQgcmVsYXRpdmUgcmVsb2NzLgotCi1XZWQgSnVsICA2IDAxOjA3OjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfdGMpOiBJZiBub3QgT0JKX0NPRkYsIGZvcmNlIFRPQyBlbnRyeSB0bwotCWFsaWduIHRvIGEgZm91ciBieXRlIGJvdW5kYXJ5LgotCi1UdWUgSnVsICA1IDE1OjQyOjA5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChsb2FkX2V4cHJlc3Npb24pOiBIYW5kbGUgMzItYml0IGFkZGVuZHMuCi0JKGdwZGlzcF9oaTE2X2hvd3RvKTogTm93IHBvaW50cyB0byBjb25zdC4KLQkobG9hZF9pbnNuX3RhYmxlLCBhbHBoYV9pcCk6IEZpeCB1c2VzIG9mIGNvbnN0LgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGk6IFVwZGF0ZXMgdG8gQ09GRiBkZXNjcmlwdGlvbi4gIEFkZGVkICJAZW5kCi0JZGVmbWFjIiBhcyBuZWVkZWQsIGFuZCBzb21lIGV4dHJhIGhlYWRpbmcgYW5kICJAYnllIiBzbyBpdCdsbAotCWZvcm1hdCBhcyBhIHNlcGFyYXRlIGRvY3VtZW50LgotCi1UdWUgSnVsICA1IDEzOjU0OjAwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuaCAoU19HRVRfQUxJR04sIFNfU0VUX0FMSUdOKTogRGVmaW5lLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBTZXQgYWxpZ25tZW50IG9mIGNvbW1vbgotCXN5bWJvbC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX2NvbW1vbik6IElmIE9CSl9FTEYsIHNldCBhbGlnbm1lbnQgb2YKLQljb21tb24gc3ltYm9sLgotCi1Nb24gSnVsICA0IDE4OjI5OjQzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChpc19jb21wbGV4KTogTmV3IG1hY3JvLgotCShjb25zX2ZpeF9uZXdfaHBwYSk6ICJIYW5kbGUiIGNvbXBsZXggZXhwcmVzc2lvbnMuCi0KLUZyaSBKdWwgIDEgMDA6NDg6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBTZXQgc19hbGlnbiBmaWVsZCBmcm9tCi0Jc2VjdGlvbl9hbGlnbm1lbnQgYXJyYXkuCi0KLVRodSBKdW4gMzAgMTU6MDU6MjggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2UgYmZkX2NvbV9zZWN0aW9uX3B0ci4KLQkqIGFzLmggKGFic29sdXRlX3NlY3Rpb24sIHVuZGVmaW5lZF9zZWN0aW9uKTogVXNlIG5ldyBCRkQgbWFjcm9zCi0JYmZkX2Fic19zZWN0aW9uX3B0ciBhbmQgYmZkX3VuZF9zZWN0aW9uX3B0ci4KLQotVGh1IEp1biAzMCAxNDozNjozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogRm9yIE1fTElfU1MsIGRlY2lkZSBob3cgdG8gaGFuZGxlIGl0Ci0JYmFzZWQgb24gY29udGVudHMgb2YgaW1tX2V4cHIgYW5kIG9mZnNldF9leHByLCByYXRoZXIgdGhhbgotCW1pcHNfcGljLiAgRm9yIE1fTElfREQsIGRlY2lkZSBob3cgdG8gaGFuZGxlIGl0IGJhc2VkIG9uIHNlZ21lbnQKLQluYW1lIG9mIG9mZnNldF9leHByLCByYXRoZXIgdGhhbiBtaXBzX3BpYy4KLQkobWlwc19pcCk6IElmIGdfc3dpdGNoX3ZhbHVlIDwgNCwgdXNlIGltbWVkaWF0ZSB2YWx1ZXMgZm9yICdsJy4KLQlJZiBnX3N3aXRjaF92YWx1ZSA8IDgsIHVzZSAucmRhdGEgcmF0aGVyIHRoYW4gLmxpdCBmb3IgJ0wnLgotCi1XZWQgSnVuIDI5IDE3OjMwOjQ2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAoc2hvd191c2FnZSk6IEJyZWFrIGxvbmcgc3RyaW5nIGludG8gc2hvcnRlciBvbmVzLgotCShwYXJzZV9hcmdzKTogQWRkIC12LCBwcmludHMgdmVyc2lvbiBpZCBhbmQgY29udGludWVzLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvd191c2FnZSk6IEJyZWFrIGxvbmcgc3RyaW5nLgotCi1Nb24gSnVuIDI3IDA5OjQ3OjE2IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAiLVYiIGFuZCAiLVEiIGlmCi0JT0JKX0VMRiBpcyBkZWZpbmVkLgotCi1TdW4gSnVuIDI2IDE2OjMwOjQ4IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAobWFpbikgW0hPU1RfU1BFQ0lBTF9JTklUXTogTmV3IGhvb2ssIGZvciBob3N0LXNwZWNpZmljCi0JaW5pdGlhbGl6YXRpb24uCi0KLVdlZCBKdW4gMjIgMDA6MjQ6NTUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKG9ial9mcm9iX3N5bWJvbCk6IERlZmluZSBmb3IgT0JKX0VMRi4KLQlNb3JlIGdhcy9iZmQgbG9zc2FnZSBleHBvc2VkIGJ5IHRoZSBuZXcgbGlua2VyIGNvZGUuCi0KLVR1ZSBKdW4gMjEgMTE6MzI6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19jaGFuZ2UpOiBDbGVhciBzZWdpbmZvIGFmdGVyIGFsbG9jYXRpbmcgaXQuCi0JKHN1YnNlZ19nZXQpOiBQYXNzIGFjdHVhbCBzaXplIG9mIHNlZ2luZm8gdG8gbWVtc2V0LgotCi0JKiBzdWJzZWdzLmMgKGFic19zZWdfaW5mbywgdW5kX3NlZ19pbmZvKTogRGVmaW5lIGlmIEJGRF9BU1NFTUJMRVIuCi0JKHN1YnNlZ19jaGFuZ2UpOiBTdG9yZSBzZWdfaW5mbyBmb3IgYmZkX2Fic19zZWN0aW9uX3B0ciBpbgotCWFic19zZWdfaW5mbywgYW5kIHN0b3JlIHNlZ19pbmZvIGZvciBiZmRfdW5kX3NlY3Rpb25fcHRyIGluCi0JdW5kX3NlZ19pbmZvLgotCShzdWJzZWdfZ2V0KTogTGlrZXdpc2UuICBBbHNvLCBkb24ndCBzZXQgb3V0cHV0X3NlY3Rpb24gaWYgaXQgaXMKLQlhbHJlYWR5IHNldC4KLQkoc2VnX2luZm8pOiBEZWZpbmUgYXMgZnVuY3Rpb24uCi0JKiBzdWJzZWdzLmggKHNlZ19pbmZvKTogRGVjbGFyZSBhcyBmdW5jdGlvbiByYXRoZXIgdGhhbiBkZWZpbmluZwotCWFzIG1hY3JvLgotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogQ2FsbCBzZWdfaW5mbyByYXRoZXIgdGhhbgotCWJmZF9nZXRfc2VjdGlvbl91c2VyZGF0YS4KLQotTW9uIEp1biAyMCAxNjozMDo1NCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHBwYy0qLWVsZiopOiBOZXcgdGFyZ2V0LCBsaWtlIC1zeXN2NCouCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IElmICIwZiIgaXMgZm9sbG93ZWQgYnkgJ1wwJywgZG9uJ3QgZG8gZW9sCi0JY2hlY2tzLgotCi1Nb24gSnVuIDIwIDE1OjE3OjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfYXV4KTogQ2FsbCBzd2FwX3Rpcl9vdXQgYW5kIHN3YXBfcm5keF9vdXQKLQl2aWEgYmFja2VuZCBwb2ludGVyLCBub3QgZGlyZWN0bHkuCi0KLUZyaSBKdW4gMTcgMTg6MDU6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLXN0YW1wKTogTWFrZSBzdXJlIHRoZXJlIGlzIGF0IGxlYXN0IG9uZQotCWVsZW1lbnQgaW4gdGhlIGZvciBsb29wLgotCi1GcmkgSnVuIDE3IDExOjAxOjA0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBNaXNjIHRyaXZpYWwgY2hhbmdlcyB0byBtYWtlIGdjYyAtV2FsbCBoYXBweS4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IERlY2xhcmUuCi0KLVdlZCBKdW4gMTUgMjA6NDQ6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogYXMuYyAocGFyc2VfYXJncyk6IENhc3QgeG1hbGxvYyByZXR1cm4gdmFsdWUuCi0KLQkqIE1ha2VmaWxlLmluIChjb25maWctc3RhbXApOiBJZiAkKGRlZnMpIGNvbnRhaW5zIG11bHRpcGxlIHdvcmRzLAotCWVtaXQgYSAjZGVmaW5lIGxpbmUgZm9yIGVhY2guCi0JKiBjb25maWd1cmUuaW46IEZvciBzcGFyYzY0IHRhcmdldCwgdXNlIHNwYXJjIGNwdSBmaWxlcyBhbmQgYWRkCi0Jc3BhcmN2OSB0byBleHRyYV9kZWZzLiAgTm8gbG9uZ2VyIHRyZWF0IHNwYXJjNjQtKi1hb3V0KiBzcGVjaWFsbHkuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZW1iYXJfbWFza3MpOiBOb3cgc3RhdGljIGFuZCBjb25zdC4KLQkobWRfc2hvd191c2FnZSkgWyFOT19WOV06IEFkZCAtQXY5IHRvIHVzYWdlIG1lc3NhZ2UuCi0JKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSBbc3BhcmN2OV06IEluaXRpYWxpemUgdG8gdjkuCi0JKG1kX2JlZ2luKSBbc3BhcmN2OV06IERvbid0IGJvdGhlciBjaGFuZ2luZyBpdCB1bmNvbmRpdGlvbmFsbHkKLQloZXJlLgotCShzX3Jlc2VydmUpOiBEb24ndCBwYXNzIHVuZXhwZWN0ZWQgYXJndW1lbnQgdG8gYXNfYmFkIHdpdGgKLQliYWQtc2VnbWVudCBtZXNzYWdlLgotCi0JKiBhcy5oIChiZmRfYWxsb2NfYnlfc2l6ZV90KSBbQkZEX0FTU0VNQkxFUl06IERlY2xhcmUuCi0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAoaW50X3RvX2dlbik6IENvbW1lbnRlZCBvdXQgdW51c2VkIHJvdXRpbmUuCi0KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfYXNzZW1ibGUpOiBSZW1vdmVkIGNoZWNrIG9mIG9wZXJhbmQgc2VjdGlvbi4KLQotCUZyaSBKdW4gIDMgMTc6MjU6MDggMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKERCR19TX0NfQ09NUExYNCwgREJHX1NfQ19DT01QTFg4KTogZGVmaW5lCi0JdGhlc2UgbmV3IFZNUyBzeW1ib2wtdHlwZSBtYWNyb3MgZm9yIGBjb21wbGV4IGZsb2F0JyBhbmQKLQlgY29tcGxleCBkb3VibGUnIHN1cHBvcnQuICBUaGVpciB2YWx1ZXMgY29tZSBmcm9tIHRoZSBleGlzdGluZwotCURTQyRLX0RUWVBFX0ZDIGFuZCBEU0MkS19EVFlQRV9EQyBtYWNyb3MgaW4gPGRlc2NyaXAuaD4uCi0JKERCR19TX0NfUkVBTDhfRywgREJHX1NfQ19DT01QTFg4X0cpOiBHX2Zsb2F0IHZlcnNpb25zIG9mCi0JUkVBTDggYW5kIENPTVBMWDg7IG5vdCB1c2VkIHlldCwgYmVjYXVzZSBnY2Mgb3V0cHV0cyB0aGUgc2FtZQotCS5zdGFicyBmb3IgYGRvdWJsZScgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGAtbWcnIGlzIHVzZWQuCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfdHlwZWRlZl9wYXJzZSkgW2Nhc2UgJ3InXTogYWRkIGVudHJpZXMKLQlmb3IgZ2NjMidzIHByZWRlZmluZWQgdHlwZXMgImNvbXBsZXggZmxvYXQiLCAiY29tcGxleCBkb3VibGUiLAotCWFuZCAiY29tcGxleCBsb25nIGRvdWJsZSIgKGlkZW50aWNhbCB0byBjb21wbGV4IGRvdWJsZSkuCi0KLVdlZCBKdW4gMTUgMTI6MzI6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9mcm9iX3N5bWJvbCk6IFVzZSBDX1NUQVQgZm9yIHRoZSAudGV4dAotCXNlY3Rpb24gc3ltYm9sLCBub3QgQ19MQUJFTC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IFBlcm1pdCBhIG1vZGlmaWVyIGluICdvJyBjYXNlLCBhbmQKLQlwZXJtaXQgbm9uIGNvbnN0YW50IGV4cHJlc3Npb25zIGluICd1JyBjYXNlLiAgTGV0cyBgYGx1aQotCSQ4LCVoaShmb28pOyBsdyAkOCwlbG8oZm9vKSgkOCknJyB3b3JrIGNvcnJlY3RseS4KLQotTW9uIEp1biAxMyAxMjowODo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IFdhcm4gYWJvdXQgYW4gYXR0ZW1wdAotCXRvIHB1dCBhIGNvbW1vbiBzeW1ib2wgaW4gYSBzZXQuCi0KLVNhdCBKdW4gMTEgMTY6NDE6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkIHdlYWsgc3ltYm9scyBhcyBhbiBleHRlbnNpb24gdG8gYS5vdXQuCi0JKiByZWFkLmMgKHBzZXVkb19zZXQpOiBPbmx5IHByZXNlcnZlIGV4dGVybmFsIGJpdCBmb3IgT0JKX0FPVVQgYW5kCi0JT0JKX0JPVVQgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JKiBjb25maWcvYW91dF9nbnUuaCAoTl9XRUFLVSwgTl9XRUFLQSwgTl9XRUFLVCwgTl9XRUFLRCwgTl9XRUFLQik6Ci0JRGVmaW5lIGFzIGluIC4uL2luY2x1ZGUvYW91dC9hb3V0NjQuaC4KLQkqIGNvbmZpZy9vYmotYW91dC5oIChPQkpfU1lNRklFTERfVFlQRSk6IElmIG5vdCBCRkRfQVNTRU1CTEVSLAotCWRlZmluZSBhcyBjaGFyLgotCShTX0dFVF9XRUFLLCBTX1NFVF9XRUFLKTogRGVmaW5lIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgIndlYWsiLgotCShvYmpfZW1pdF9zeW1ib2xzKTogQWRqdXN0IHR5cGUgb2Ygd2VhayBzeW1ib2xzLgotCShvYmpfYW91dF93ZWFrKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotRnJpIEp1biAxMCAxMzo0ODo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IERvbid0IHNldCBhbnkgZmxhZ3MgYmFzZWQgb24KLQl0aGUgdHlwZSBvZiBhIHNwZWNpYWwgc2VjdGlvbi4KLQotCSogY29uZmlnL2hvLXN1bm9zLmg6IEluY2x1ZGUgPHN0ZGxpYi5oPi4gIERvbid0IGRlY2xhcmUgbWFsbG9jLAotCXJlYWxsb2MsIGZyZWUsIG9yIGF0b2wuCi0KLVdlZCBKdW4gIDggMDY6Mjg6MzcgMTk5NCAgQmlsbCBDb3ggIChiaWxsQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IERlbGV0ZSBhcy5uZXcgZGVwZW5kZW5jeSwgc28gdGhhdAotCXJlZ3Jlc3Npb24gdGVzdCBkb2Vzbid0IHRyaWdnZXIgYW4gYXNzZW1ibGVyIGJ1aWxkLgotCi1UdWUgSnVuICA3IDEzOjMzOjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuLCByZWFsY2xlYW4pOiBOZXcgdGFyZ2V0cy4KLQkqIGRvYy9NYWtlZmlsZS5pbiwgdGVzdHN1aXRlL01ha2VmaWxlLmluOiBMaWtld2lzZS4KLQotTW9uIEp1biAgNiAxMzoxMDo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKFJEQVRBX1NFQ1RJT05fTkFNRSk6IERlZmluZS4KLQkobWFjcm8pOiBDb3JyZWN0IE1fTElfU1MgU1ZSNF9QSUMvRU1CRURERURfUElDIGNhc2UuICBBZnRlciBNX0xJX0QKLQlvciBNX0xfRE9CIG9yIGxhYmVsIGRvYiwgZm9yY2UgYSBuZXcgZnJhZyB0byBhdm9pZCBnZXR0aW5nCi0JY29uZnVzZWQgaW4gdGNfZ2VuX3JlbG9jLgotCShtaXBzX2lwKTogVXNlIFJEQVRBX1NFQ1RJT05fTkFNRSwgbm90IC5yZGF0YS4KLQkoc19jaGFuZ2Vfc2VjKTogTGlrZXdpc2UuCi0KLUZyaSBKdW4gIDMgMjM6MzU6MzYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IFVzZSBtZW1zZXQgdG8gemVybyBvdXQgbWVtb3J5LCByYXRoZXIgdGhhbgotCWdvaW5nIHRocm91Z2ggbWRfbnVtYmVyX3RvX2NoYXJzLiAgVGhpcyBwZXJtaXRzIGhhbmRsaW5nIHN5bWJvbGljCi0JYXJndW1lbnRzIHdoZW4gdGhlIHNpemUgaXMgbGFyZ2VyIHRoYW4gc2l6ZW9mICh2YWx1ZVQpLCBpZgotCVRDX0NPTlNfRklYX05FVyBpcyBwcmVwYXJlZCB0byBoYW5kbGUgdGhlIGNhc2UgKGFzIGl0IGlzIG9uIE1JUFMpLgotCi1GcmkgSnVuICAzIDEyOjUwOjEzIDE5OTQgIERhdmlkIEouIE1hY0tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAoc2hvd191c2FnZSksIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zaG93X3VzYWdlKSwKLQljb25maWcvdGMtbWlwcy5jIChtZF9zaG93X3VzYWdlKTogRml4IHVwIG1lc3NhZ2VzLgotCi0JKiBhcy5oOiBSZXBsYWNlIGZsYWdzZWVuIHdpdGggc2VwYXJhdGUgdmFyaWFibGVzLgotCSogYXMuYyAocGFyc2VfYXJncyk6IFNldCB0aGVtLiAgRG9uJ3QgYWNjZXB0IC0xIG9wdGlvbiwgb3IgLXYKLQlleHBsaWNpdGx5IChpdCdzIGEgc3lub255bSBmb3IgLS12ZXJzaW9uKS4KLQkqIGFzLmMsIGlucHV0LXNjcnViLmMsIG1lc3NhZ2VzLmMsIHJlYWQuYywgc3ltYm9scy5jLCB3cml0ZS5jLAotCWNvbmZpZy9vYmotYW91dC5jLCBjb25maWcvb2JqLWFvdXQuaCwgY29uZmlnL29iai1ib3V0LmMsCi0JY29uZmlnL29iai1ib3V0LmgsIGNvbmZpZy9vYmotY29mZi5jLCBjb25maWcvb2JqLWNvZmYuaCwKLQljb25maWcvb2JqLXZtcy5jLCBjb25maWcvdGMtaHBwYS5jLCBjb25maWcvdGMtaTM4Ni5jLAotCWNvbmZpZy90Yy1pOTYwLmMsIGNvbmZpZy90Yy1tNjhrLmMsIGNvbmZpZy90Yy1taXBzLmMsCi0JY29uZmlnL3RjLXZheC5jOiBVc2UgdGhlIG5ldyBmbGFnIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIGZsYWdzZWVuLgotCSogY29uZmlnL3RjLXZheC5jIFtPQkpfVk1TXTogUmVjb2duaXplIC0rLCAtMSwgLXYsIGFuZCBkb2N1bWVudCBpbgotCXVzYWdlLgotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogUmVtb3ZlIHRhcmdldCBzcGVjaWZpYyBtZXNzYWdlczsKLQlpbnN0ZWFkLCBjYWxsIG1kX3Nob3dfdXNhZ2UuCi0JKHBhcnNlX2FyZ3MpOiBVc2UgZ2V0b3B0X2xvbmdfb25seS4gIFRha2UgcG9pbnRlcnMgdG8gYXJnYyBhbmQKLQlhcmd2LgotCShtYWluKTogUGFzcyBwYXJzZV9hcmdzIHBvaW50ZXJzLgotCSogYXMuaDogUmVtb3ZlIDMgdmFyaWFibGVzIHRoYXQgYXJlIHJlZHVuZGFudCB3aXRoIGZsYWdzZWVuLgotCSogYXMuYywgbWVzc2FnZXMuYzogQ2hhbmdlIHRoZWlyIHVzZXJzIHRvIHVzZSBmbGFnc2Vlbi4KLQlEZWZpbmUgZ2V0b3B0IHN0dWZmLgotCSogdGMuaDogVXBkYXRlIG1kX3BhcnNlX29wdGlvbiBkZWNsLiAgQWRkIG1kX3Nob3dfdXNhZ2UgZGVjbC4KLQkqIGNvbmZpZy90Yy0qLmM6IEFkZCBtZF9zaG9ydG9wdHMsIG1kX2xvbmdvcHRzLAotCW1kX2xvbmdvcHRzX3NpemUsIG1kX3Nob3dfdXNhZ2UuICBDaGFuZ2UgY2FsbGluZyBjb252ZW50aW9uIGZvcgotCW1kX3BhcnNlX29wdGlvbi4gIFJlbW92ZSBtZF9wYXJzZV9sb25nX29wdGlvbi4KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBSZW5hbWUgYHN0cnVjdCBvcHRpb24nIHRvIGBzdHJ1Y3QgbnMzMmtfb3B0aW9uJy4KLQkqIGNvbmZpZy90Yy1pMzg2Lmg6IERvbid0IGRlZmluZSBtZF9wYXJzZV9vcHRpb24uCi0KLVRodSBKdW4gIDIgMTM6NTQ6NDYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogTmV3IGZ1bmN0aW9uLgotCShwYXJzZV9hcmdzKTogQ29kZSBtb3ZlZCBmcm9tIG1haW4uCi0JUmVjb2duaXplIC0taGVscCBhbmQgLS12ZXJzaW9uLgotCSogY29uZmlnL3RjLW5zMzJrLmg6IERlZmluZSBUQ19OUzMySy4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBhbGwgb2YgdGhlIHRhcmdldC1pbmRlcGVuZGVudCBjb21tYW5kCi0JbGluZSBvcHRpb25zLgotCi1UaHUgSnVuICAyIDEyOjA3OjI1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGdhc3AuYyAoaGFzaF9uZXdfdGFibGUpOiBDbGVhciBuZXdseSBhbGxvY2F0ZWQgdGFibGUuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGVudW0gX3JlZ2lzdGVyKTogQWRkIDY4MDYwIGNvbnRyb2wgcmVnaXN0ZXJzCi0JQlVTQ1IgYW5kIFBDUi4KLQkobGFzdF9tb3ZlY19yZWcpOiBOZXcgbWFjcm8uCi0JKG02ODAwMF9jb250cm9sX3JlZ3MsIG02ODAxMF9jb250cm9sX3JlZ3MsIG02ODAyMF9jb250cm9sX3JlZ3MsCi0JbTY4MDQwX2NvbnRyb2xfcmVncywgbTY4MDYwX2NvbnRyb2xfcmVncyk6IE5ldyBhcnJheXMuCi0JKGNvbnRyb2xfcmVncyk6IE5ldyBwb2ludGVyLgotCShtNjhrX2lwKTogVXNlIGNvbnRyb2xfcmVncyBpbnN0ZWFkIG9mIHRlc3RpbmcgQ1BVIGV2ZXJ5IHRpbWUuCi0JVXNlIGxhc3RfbW92ZWNfcmVnIHRvby4gIEluIGVycm9yIG1lc3NhZ2VzLCBoYW5kbGUgNjgwNjAsIGFuZAotCXByaW50IDY4MDYwIGZvciBtZmxvYXQsIHRvby4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBIYW5kbGUgIjY4MDYwIi4gIFVzZSBtNjgwNDB1cCBmb3IgbWFraW5nCi0JbTY4ODUxIGNob2ljZS4gIFNldCBjb250cm9sX3JlZ3MuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAiNjgwNjAiLgotCSogY29uZmlndXJlLmluOiBTZXR0aW5nIGNwdV90eXBlLCByZWNvZ25pemUgbTY4MDYwIHRvby4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpIFshQkZEX0FTU0VNQkxFUl0KLQlbRElGRl9FWFBSX09LXTogRG8gY29udmVyc2lvbiB0byBwYy1yZWxhdGl2ZSBmb3IgZGlmZmVyZW5jZSwgZXZlbgotCWlmIHBjcmVsIGlzIGFscmVhZHkgc2V0LgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgdGhpc19nY2NfcmVxdWlyZXNfdGhlX2dudV9hc3NlbWJsZXIgaW4gYWxsCi0JbG93ZXItY2FzZSwgaW4gY2FzZSB3ZSdyZSBpZ25vcmluZyBjYXNlIG9mIG9wY29kZXMgaW4gdGhlIGlucHV0Ci0JZmlsZS4KLQotCSogZG9jL2FzLnRleGluZm8gKC5zZWN0aW9uKTogRG9jdW1lbnQgYXMgdW5hdmFpbGFibGUgZm9yIGEub3V0Ci0JdHlwZSBmb3JtYXRzLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWFjaGluZSk6IE5ldyB2YXJpYWJsZS4KLQkobG9hZF9pbnNuKTogTmV3IG1hY3JvLgotCShsb2FkX2luc25fdGFibGUpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2JlZ2luKTogQ2FsbCBsb2FkX2luc25fdGFibGUsIG9uY2UgZm9yIGJhc2ljIGluc3RydWN0aW9ucyBhbmQKLQlvbmNlIGZvciBhcHByb3ByaWF0ZSBQQUwgaW5zdHJ1Y3Rpb24gdGFibGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IFNldCBgbWFjaGluZScgYmFzZWQgb24gLW0jIyMjIyBhcmd1bWVudHMuCi0JKiBjb25maWcvYWxwaGEtb3Bjb2RlLmggKGFscGhhX3BhbDIxMDY0X29wY29kZXMpOiBTcGxpdCBvdXQgZnJvbQotCWFscGhhX29wY29kZXMuCi0JKGFscGhhX3BhbDIxMTY0X29wY29kZXMpOiBOZXcgdGFibGUuCi0JKE5VTTIxMDY0T1BDT0RFUywgTlVNMjExNjRPUENPREVTKTogTmV3IG1hY3Jvcy4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXQgaTM4Ni0qLW5ldGJzZDAuOCk6IFVzZSAzODZic2QgZW11bGF0aW9uLgotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mby1nYXNwKTogVXNlICQkZGlyIHdoZW4gaW5zdGFsbGluZwotCWZpbGUuCi0KLVdlZCBKdW4gIDEgMTA6NDg6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRm9yY2UgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIHRvIGJlCi0JYWxpZ25lZCBjb3JyZWN0bHkuCi0KLUZyaSBNYXkgMjcgMTA6MDU6NTMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQlNZXJnZWQgaW4gY2hhbmdlcyBmcm9tIGdhcy0yLjMgbmV0IHJlbGVhc2U6Ci0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlZCB0byBjeWdudXMtMi4zLjEuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmM6IFJlcGxhY2VkIHVuY2hlY2tlZCB1c2VzIG9mIG1hbGxvYyB3aXRoCi0JeG1hbGxvYy4KLQotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IE9ubHkgdGVzdCBCRkQ2NCwgbm90Ci0JQkZEX0FTU0VNQkxFUiB0b28uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KSBbQkZEX0FTU0VNQkxFUl0KLQlbRElGRl9FWFBSX09LXTogRG9uJ3QgY2hlY2sgcGNyZWwsIGp1c3QgY29udmVydCBpdC4KLQotCSogY29uZmlnL29iai12bXMuYzogUmVtb3ZlZCBsb3RzIG9mIGV4dHJhIHNlbWljb2xvbnMgYWZ0ZXIKLQljb21wb3VuZCBzdGF0ZW1lbnRzLgotCShzdHJjaHIpOiBEb24ndCBkZWNsYXJlIGhlcmUuCi0KLQkqIGNvbmZpZy9oby12YXguaCAocmVhbGxvYyk6IERlY2xhcmUuCi0KLQkqIGNvbmZpZy9oby12bXMuaCAoc3RyY2hyLCBzdHJkdXApOiBEZWNsYXJlLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcGFyc2Vfb3B0aW9uKSBbT0JKX0VMRl06IEFjY2VwdCBhbmQgaWdub3JlCi0Jb3B0aW9uIGAtcScuCi0KLQlXZWQgTWF5IDE4IDIwOjUwOjM1IDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5oIChEQkdfU19DX1NRVUFELCBEQkdfU19DX1VRVUFEKTogZGVmaW5lIHRoZXNlCi0JbmV3IFZNUyBzeW1ib2wtdHlwZSBtYWNyb3M7IHNpZ25lZCBhbmQgdW5zaWduZWQgcXVhZHdvcmQgaW50ZWdlcnMsCi0JZm9yIGBsb25nIGxvbmcnIHN1cHBvcnQuICBUaGVpciB2YWx1ZXMgY29tZSBmcm9tIHRoZSBleGlzdGluZwotCURTQyRLX0RUWVBFX1FVIGFuZCBEU0MkS19EVFlQRV9RIG1hY3JvcyBpbiA8ZGVzY3JpcC5oPi4gIFRoZQotCVZNUyBkZWJ1Z2dlciBub3cgcmVjb2duaXplcyBgbG9uZyBsb25nJyB2YXJpYWJsZXMgY29ycmVjdGx5LgotCSogY29uZmlnL29iai12bXMuYyAoVk1TX3R5cGVkZWZfcGFyc2UpIFtjYXNlICdyJ106IGFkZCBlbnRyaWVzCi0JZm9yIGdjYzIncyBwcmVkZWZpbmVkIHR5cGVzICJsb25nIGRvdWJsZSIgKHNhbWUgYXMgZG91YmxlLCBhcwotCXBlciBnY2MncyBjdXJyZW50IHN0YXRlKSwgImxvbmcgbG9uZyBpbnQiLCAibG9uZyBsb25nIHVuc2lnbmVkCi0JaW50IiwgYW5kIGZpbmFsIGBvdGhlcndpc2UnIGNhc2UgKHRvIGF2b2lkIHVuaW5pdGlhbGl6ZWQgdHlwZQotCWFuZCBzaXplIGZpZWxkcykuICBbY2F2ZWF0OiAgcHJlZGVmaW5lZCB0eXBlcyAiY29tcGxleCBpbnQiLAotCSJjb21wbGV4IGZsb2F0IiwgImNvbXBsZXggZG91YmxlIiwgYW5kICJjb21wbGV4IGxvbmcgZG91YmxlIiBhcmUKLQlzdGlsbCBtaXNzaW5nLl0KLQotCSogY29uZmlnL2hvLXZtcy5oIChFWElUX0ZBSUxVUkUpOiBkZWZpbmUgYXMgMHgxMDAwMDAwMiBpbnN0ZWFkCi0Jb2YgMCwgYmVjYXVzZSB0aGUgbGF0dGVyIGluZGljYXRlcyBzdWNjZXNzIHJhdGhlciB0aGFuIGZhaWx1cmUKLQl3aGVuIHBhc3NlZCB0byBgZXhpdCcgb3IgcmV0dXJuIGZyb20gYG1haW4nIGNvbXBpbGVkIGJ5IGdjYzIuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKGFycmF5X3N1ZmZpeCwgZ2VuZXJhdGVfc3VmZml4KTogcmVwbGFjZSB0d28KLQloYXJkY29kZWQgYDB4YTMncyB3aXRoIG1hY3JvIERCR19TX0NfQURWQU5DRURfVFlQRSBmcm9tIG9iai12bXMuaC4KLQkoVk1TX3R5cGVkZWZfcGFyc2UpOiBlbGltaW5hdGUgcmVkdW5kYW50IGlmLXRoZW4tZWxzZSB3aGVuCi0JYWxsb2NhdGluZyBuZXcgc3ltYm9sIGVudHJ5IGFuZCBsaW5raW5nIGl0IHRvIFZNU19TeW1ib2xfdHlwZV9saXN0LgotCi0JVHVlIE1heSAxNyAyMDo0NzozMSAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuYyAoV3JpdGVfVk1TX01IRF9SZWNvcmRzKTogZG9uJ3QgdHJ5IHRvIGludGVycHJldAotCXRoZSBjb250ZW50cyBvZiB0aGUgR0FTX1ZFUlNJT04gc3RyaW5nIHdoZW4gZmFsbGluZyBiYWNrIHRvIGl0IGZvcgotCWxhbmd1YWdlIHByb2Nlc3NvciBpZGVudGlmaWNhdGlvbi4KLQotCSogbWFrZS1nYXMuY29tLCB2bXNjb25mLnNoIChFTlZJUk9OKTogZml4IG1pc3NwZWxsaW5nIG9mCi0JYHBzZWN0X2F0dHInIGluIGxpbmtlciBvcHRpb25zLgotCi0JV2VkIE1heSAxMSAyMjozMjowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIGNvbmZpZ3VyZS5iYXQ6IHVwZGF0ZSB0byBsYXRlc3QgbWFrZWZpbGUuaW4KLQkqIGNvbmZpZy90ZS1nbzMyLmg6IFtuZXddIGdvMzIncyBlbnZpcm9ubWVudAotCi1GcmkgTWF5IDIwIDE3OjU5OjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXMuaDogRG9uJ3QgZGVjbGFyZSBwYXJhbWV0ZXJzIGZvciBzdHJzdHIuCi0KLVRodSBNYXkgMTkgMTU6NDA6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2VjdGlvbl9hbGlnbik6IERvbid0IGNoYW5nZSB0aGUgc2l6ZSBpZgotCU9CSl9FTEYuCi0KLVdlZCBNYXkgMTggMTM6MDg6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlZGlyZWN0IGxuIG91dHB1dCB0byAvZGV2L251bGwuICBJZiBsbgotCWZhaWxzIG9uIGdhc3AsIGluc3RhbGwgZ2FzcC5uZXcsIG5vdCBnYXNwLgotCi1XZWQgTWF5IDE4IDA5OjE2OjM2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IFVzZSBSX0hQUEFfQUJTX0NBTEwsIG5vdCBSX0hQUEEgZm9yCi0JYWJzb2x1dGUgY2FsbHMuCi0KLVR1ZSBNYXkgMTcgMTI6NTA6NDYgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3BhcnNlX2ZwX2NtcF9jb25kKTogUmVwb3J0IGFuIGVycm9yCi0Jb24gYSBwYXJ0aWFsIGNvbXBsZXRlciBtYXRjaC4KLQotTW9uIE1heSAxNiAxMjowMzo0OSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogQ2hhbmdlIC5ocHBhX3Vud2luZCB0byAuUEFSSVNDLnVud2luZAotCXRocm91Z2hvdXQgY29kZS4KLQkoaXNfY29tcGxleCk6IERlbGV0ZSBkZWZpbml0aW9uIGFuZCBzdXBwb3J0IGZvciBjb21wbGV4IHJlbG9jYXRpb24KLQl0eXBlcy4KLQkodGNfZ2VuX3JlbG9jKTogRGVsZXRlIHNwZWNpYWwgdW53aW5kIGNydWQgZm9yIEVMRi4gIFNpbXBsaWZ5IGFuZAotCXJld3JpdGUgRUxGIGNvZGUgYmFzZWQgb24gOTQtMDItMDIgUEEgRUxGIGRyYWZ0IHNwZWMuCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IFVzZSBzdGFuZGFyZCBQQVJJU0NfRElSMzIgcmVsb2NzIGZvcgotCXRoZSB1bndpbmQgZGVzY3JpcHRvcnMuCi0KLUZyaSBNYXkgIDYgMTQ6MTM6MTUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2dvMzIubWg6IE5ldyBtYWtlZmlsZSBmcmFnbWVudCBmb3IgZ28zMiBjcm9zc2luZy4KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdD09Z28zMik6IFVzZSBuZXcgZnJhZ21lbnQuCi0KLUZyaSBNYXkgIDYgMTQ6MzU6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBnYXNwLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKG1haW4pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGkuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYmVnaW4pOiBXaGVuIHVzaW5nIC1tYW55LCBwZXJtaXQgY29tcGFyaXNvbgotCWluc3RydWN0aW9ucyB0byBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaW4gdGhlIG9wY29kZSB0YWJsZS4KLQotVGh1IE1heSAgNSAxOToxNDo0MyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZSB0byAyLjIuOTAuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldykgW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBwZXJtaXQgYWRkaXRpb25zCi0JdG8gdGhlIHN5bWJvbCB0YWJsZSBpZiBpdCdzIGFscmVhZHkgYmVlbiBzZXQgaW4gdGhlIG91dHB1dCBiZmQuCi0JKHN5bWJvbF9iZWdpbikgWyEgRU1JVF9TRUNUSU9OX1NZTUJPTFNdIFtSRUxPQ19SRVFVSVJFU19TWU1CT0xdOgotCURvbid0IHVzZSBiZmRfYWJzX3NlY3Rpb24uc3ltYm9sIGZvciBnYXMgYWJzb2x1dGUgc3ltYm9sLgotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKGRpc3RjbGVhbiwgY2xlYW4tZHZpLCBjbGVhbi1pbmZvKTogRGVsZXRlIGdhc3AKLQlmaWxlcyB0b28uCi0KLVRodSBNYXkgIDUgMTg6MTI6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2VtaXRfZGVsYXlzKTogTWFrZSBjYWxsIHRvCi0JbWlwc19ub19wcmV2X2luc24gdW5jb25kaXRpb25hbC4KLQotVGh1IE1heSAgNSAxNzoyNTozOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYqLio6IE1lcmdlZCBjb2ZmYmZkIHZlcnNpb25zIGludG8gY29mZiB2ZXJzaW9ucywKLQl3aXRoIGEgc2luZ2xlICIjaWZkZWYgQkZEX0FTU0VNQkxFUiIgY29udHJvbGxpbmcgbW9zdCBvZiBpdCBmb3IKLQlub3cuICBEZWxldGVkIG9iai1jb2ZmYmZkLiogZmlsZXMuCi0JKiBjb25maWd1cmUuaW46IEFsd2F5cyB1c2Ugb2JqLWNvZmYuKiBmb3IgQ09GRiB0YXJnZXRzLgotCi1XZWQgTWF5ICA0IDEzOjM0OjExIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90ZS1kcHgyLmggKFRBUkdFVF9GT1JNQVQsIFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCk6Ci0JRGVmaW5lLgotCSogY29uZmlndXJlLmluIChtNjhrLWJ1bGwtc3lzdjMqKTogRW5hYmxlLgotCi0JKiBjb25maWcvY29mZl9nbnUuaDogRGVsZXRlZC4KLQotV2VkIE1heSAgNCAxMToyOToxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpOiBJZiBub3QgVEVfU1VOMywgZGVmaW5lIGFzCi0JImEub3V0LXplcm8uYmlnIi4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpeHVwX3NlZ21lbnQpOiBNYWtlIGNvbW1vbiBzeW1ib2wgYW5kIFBDCi0JcmVsYXRpdmUgYWRqdXN0bWVudHMgd2hlbiBURV9MWU5YIGlzIGRlZmluZWQgYXMgd2VsbCBhcyB3aGVuCi0JVENfSTM4NiBpcyBkZWZpbmVkLgotCi1XZWQgTWF5ICA0IDAyOjI5OjIxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBhcy5oIChzdHJzdHIpOiBSZXN0b3JlIGRlY2xhcmF0aW9uLgotCShzdWJzZWdfZ2V0KSBbQkZEX0FTU0VNQkxFUl06IERlY2xhcmUuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgb2JqX2FkanVzdF9zeW10YWIgaXMgZGVmaW5lZCwKLQlpbnZva2UgaXQuICBUaGVuIGNhbGwgc2V0X3N5bXRhYiwgYW5kIGZpbmFsbHkgaW52b2tlICpfZnJvYl9maWxlCi0JaG9va3MuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9hZGp1c3Rfc3ltdGFiKTogUmVuYW1lZCBmcm9tCi0JY29mZl9mcm9iX2ZpbGUuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZl9hZGp1c3Rfc3ltdGFiKTogQ2hhbmdlZCBkZWNsYXJhdGlvbgotCWFjY29yZGluZ2x5LgotCShvYmpfYWRqdXN0X3N5bXRhYik6IE1hY3JvIGFsc28gY2hhbmdlZC4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotZ251Kik6IE5ldyB0YXJnZXQsIGhhbmRsZWQgbGlrZSBpMzg2LW1hY2guCi0KLVR1ZSBNYXkgIDMgMjE6MDQ6MTYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmggKFRBUkdFVF9GT1JNQVQpIFtUQ19JOTYwXTogU2VsZWN0IGxpdHRsZQotCWVuZGlhbiB2ZXJzaW9uLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCAoVEFSR0VUX0ZPUk1BVCkgW1RDX0k5NjBdOiBEaXR0by4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zZWN0aW9uKTogUm91bmQgdXAgdGhlIHNpemUgb2YKLQlldmVyeSBzZWN0aW9uIHRvIGEgbXVsdGlwbGUgb2YgdGhlIGFsaWdubWVudCwgc28gdGhhdCBCRkQgZG9lc24ndAotCXN1cnByaXNlIHVzLgotCi0JRWxpbWluYXRlIG1hbnkgc2ltcGxlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBDT0ZGIGJhY2sgZW5kczoKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IFJlbW92ZWQgYWxsIHVzZXMgb2YgREVGVU4gYW5kIERFRlVOX1ZPSUQuCi0JTWFkZSBtaW5vciBzdHlsaXN0aWMgY2hhbmdlcywgZGVsZXRlZCBzb21lIHJlZ2lzdGVyIGRlY2xhcmF0aW9ucy4KLQkoc3RhY2tfdG9wKTogRGVsZXRlZC4KLQkoc3ltYm9sX3RvX2NoYXJzKTogVXNlIGFic29sdXRlX3NlY3Rpb24gYW5kIHJlZ19zZWN0aW9uIGluc3RlYWQgb2YKLQl0aGUgY29ycmVzcG9uZGluZyBTRUdfKiBzeW1ib2xzLgotCShvYmpfY29mZl9lbmRlZiwgdGFnX2ZpbmRfb3JfbWFrZSwgZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLgotCShzdGFjayB0eXBlZGVmLCBzdGFja19pbml0LCBzdGFja19kZWxldGUsIHN0YWNrX3B1c2gsIHN0YWNrX3BvcCk6Ci0JTW92ZWQgdG8ganVzdCBhZnRlciBwc2V1ZG8tb3AgdGFibGUuICBBbGwgZnVuY3Rpb25zIG5vdyBzdGF0aWMuCi0JKHN0YWNrX2RlbGV0ZSk6IFJlbW92ZWQgZGVjbGFyYXRpb24uCi0JKHRhZ19pbml0LCB0YWdfaW5zZXJ0LCB0YWdfZmluZF9vcl9tYWtlLCB0YWdfZmluZCk6IE1vdmVkIHRvIGp1c3QKLQlhZnRlciBzdGFjayBmdW5jdGlvbnMuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaDogUmVvcmRlcmVkIHNvbWUgZGVjbGFyYXRpb25zIGFuZCBtYWNyb3MuCi0JKHN0YWNrX2luaXQsIHN0YWNrX2RlbGV0ZSwgc3RhY2tfcHVzaCwgc3RhY2tfcG9wKTogRG9uJ3QgZGVjbGFyZS4KLQkoc3RhY2sgdHlwZWRlZik6IERlbGV0ZWQuCi0JKFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMpOiBBbHdheXMgdW5kZWYgdGhlbiBkZWZpbmU7IGRvbid0IHRlc3QuCi0JKFNZTV9BVVhFTlQpOiBOZXcgbWFjcm8uCi0JKFNBX0dFVF8qLCBTQV9TRVRfKik6IERlZmluZSBpbiB0ZXJtcyBvZiBTWU1fQVVYRU5UIHdoZW4gZmVhc2libGUuCi0JKFNGX0dFVF8qLCBTRl9TRVRfKik6IERlZmluZSBpbiB0ZXJtcyBvZiBTRl9HRVQgd2hlbiBmZWFzaWJsZS4KLQkoU0FfR0VUX1NZTV9UQUdORFgsIFNBX0dFVF9TWU1fRU5ETkRYLCBTQV9TRVRfU1lNX1RBR05EWCwKLQlTQV9TRVRfU1lNX0VORE5EWCwgb2JqZWN0X2hlYWRlcnMgdHlwZWRlZiwgZGF0YV9zZWN0aW9uX2hlYWRlciwKLQl0ZXh0X3NlY3Rpb25faGVhZGVyKTogRGVsZXRlIG5vbi1CRkRfSEVBREVSUyB2ZXJzaW9ucywgc2luY2Ugd2UKLQlhbHdheXMgZGVmaW5lIHRoYXQgc3ltYm9sIG5vdy4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHN0YWNrX3RvcCk6IERlbGV0ZWQuCi0JKG9ial9jb2ZmX2VuZGVmLCBvYmpfY29mZl9kaW0sIG9ial9jb2ZmX2xpbmUsIG9ial9jb2ZmX3NpemUsCi0Jb2JqX2NvZmZfc2NsLCBvYmpfY29mZl90YWcsIG9ial9jb2ZmX3R5cGUsIG9ial9jb2ZmX3ZhbCk6IENoYW5nZQotCWFyZ3VtZW50IG5hbWUgZnJvbSAiaWdub3JlZCIgdG8gImlnbm9yZSIuCi0JKG9ial9jb2ZmX3ZhbCk6IFVzZSBmcmFnX25vd19maXguCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBSZW1vdmVkIElHTk9SRV9ERUJVRyB2ZXJzaW9uLCBzaW5jZSBpdCBkb2Vzbid0Ci0JZ2V0IHVzZWQuCi0JKHN0YWNrIHR5cGVkZWYsIHN0YWNrX2luaXQsIHN0YWNrX2RlbGV0ZSwgc3RhY2tfcHVzaCwgc3RhY2tfcG9wKToKLQlNb3ZlZCB0byBqdXN0IGFmdGVyIHBzZXVkby1vcCB0YWJsZS4gIEFsbCBmdW5jdGlvbnMgbm93IHN0YXRpYy4KLQkodGFnX2luaXQsIHRhZ19pbnNlcnQsIHRhZ19maW5kX29yX21ha2UsIHRhZ19maW5kKTogTW92ZWQgdG8ganVzdAotCWFmdGVyIHN0YWNrIGZ1bmN0aW9ucy4KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBSZW9yZGVyZWQgc29tZSBkZWNsYXJhdGlvbnMgYW5kIG1hY3Jvcy4KLQlQcm90ZWN0ZWQgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgotCShzdGFja19pbml0LCBzdGFja19kZWxldGUsIHN0YWNrX3B1c2gsIHN0YWNrX3BvcCk6IERvbid0IGRlY2xhcmUuCi0JKHN0YWNrIHR5cGVkZWYpOiBEZWxldGVkLgotCShTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTKTogQWx3YXlzIHVuZGVmIHRoZW4gZGVmaW5lOyBkb24ndCB0ZXN0LgotCShzdGRvdXRwdXQpOiBEZWxldGVkIGRlY2xhcmF0aW9uLgotCShUQVJHRVRfRk9STUFUKSBbVENfSTM4Nl06IERvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuCi0KLU1vbiBNYXkgIDIgMTc6MDk6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogVXNlIGZpeF90YWlsIGZpZWxkIGV2ZW4gaWYKLQlCRkRfQVNTRU1CTEVSLgotCSogc3Vic2Vncy5jIChzdWJzZWdfY2hhbmdlKTogSW5pdGlhbGl6ZSBmaXhfdGFpbCBmaWVsZC4KLQkoc3Vic2VnX2dldCk6IExpa2V3aXNlLgotCSogd3JpdGUuYyAoZnJhZ3NfY2hhaW5lZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGZpeF9uZXdfaW50ZXJuYWwpOiBJZiBmcmFnc19jaGFpbmVkIGlzIHNldCwgdXNlIGZpeF9yb290IGFuZAotCWZpeF90YWlsIGZyb20gc2VnX2luZm8gKG5vd19zZWcpLCByYXRoZXIgdGhhbiBmcmNoYWluX25vdy4KLQkoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSk6IFNldCBmaXhfdGFpbCBmaWVsZC4KLQkoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXIpOiBTZXQgZnJhZ3NfY2hhaW5lZC4KLQotVGh1IEFwciAyOCAwMTozOToxNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoc19vcHRpb24pOiBPbmx5IHJlZmVyIHRvIGdfc3dpdGNoXyogdmFyaWFibGVzCi0JaWYgR1BPUFQgaXMgZGVmaW5lZC4KLQkoc19hYmljYWxscyk6IERpdHRvLgotCShtZF9hcHBseV9maXgpOiBDYXN0IGNoYXIqIHRvIHVuc2lnbmVkIGNoYXIqIHRvIGF2b2lkIHBvaW50ZXIKLQltaXNtYXRjaC4KLQotV2VkIEFwciAyNyAxMTowNjozMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1nbzMyKTogVXNlcyBjb2ZmIG5vdy4KLQkqIGdhc3AuYyAobWFpbik6IE5vdyB0YWtlcyAtRCBvbiBjb21tYW5kIGxpbmUuCi0JKHNob3dfdXNhZ2UpOiBEZXNjcmliZSBuZXcgb3B0aW9ucy4KLQotVHVlIEFwciAyNiAxNzoxMDozMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsaXN0aW5nLmMgKGxpc3Rfc3ltYm9sX3RhYmxlKTogUHJpbnQgIk5PIERFRklORUQgU1lNQk9MUyIgYW5kCi0JIk5PIFVOREVGSU5FRCBTWU1CT0xTIiBpZiB0aGVyZSBhcmVuJ3QgYW55LCBpbnN0ZWFkIG9mIGRpc3BsYXlpbmcKLQl0aGUgaGVhZGVyIHdpdGggYW4gZW1wdHkgbGlzdC4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpbGxfc2VjdGlvbik6IENoZWNrIENPRkZfTk9MT0FEX1BST0JMRU0KLQlhbHNvIGJlZm9yZSBzZXR0aW5nIFNUWVBfTk9MT0FEIGZvciAuYnNzIHNlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCk6IE5ldyB2YXJpYWJsZS4KLQlJbml0aWFsaXplZCB0byB2YWx1ZSBvZiBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwsIGlmIGRlZmluZWQsIG9yCi0JemVyby4KLQkobTY4a19yZWdfcGFyc2UpOiBJZiBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgaXMgc2V0LCBwZXJtaXQKLQlyZWdpc3RlciBwcmVmaXggdG8gYmUgYWJzZW50LgotCShtNjhrX2lwX29wKTogQWNjZXB0IGAmJyBhbHNvIGZvciBpbW1lZGlhdGUgY29uc3RhbnRzLgotCShpbnNlcnRfcmVnKTogRG9uJ3QgYm90aGVyIHdpdGggKHR3byE/KSBzYW5pdHkgY2hlY2tzIG9mIHRoZQotCXN5bWJvbCB0YWJsZSB3aGVuIGluc2VydGluZyBlYWNoIHJlZ2lzdGVyLgotCShtNjhrX3BhcnNlX2xvbmdfb3B0aW9uKTogTmV3IGZ1bmN0aW9uLiAgU2V0Ci0JZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsIGlmICJyZWdpc3Rlci1wcmVmaXgtb3B0aW9uYWwiIGlzIHBhc3NlZC4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFJFR0lTVEVSX1BSRUZJWCk6IEFsd2F5cyBkZWZpbmUgaWYgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCShPUFRJT05BTF9SRUdJU1RFUl9QUkVGSVgpOiBEb24ndCBkZWZpbmUuCi0JKFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCk6IElmIG5vdCBhbHJlYWR5IGRlZmluZWQsIGRlZmluZSBhcyB6ZXJvCi0Jb3Igb25lIGRlcGVuZGluZyBvbiBNNjhLQ09GRi4KLQotCVNvbWUgY2hhbmdlcyB0byBoZWxwIEFwb2xsbyBzdXBwb3J0LCBmcm9tIHRyb3lAY2JtZS51bnN3LmVkdS5hdToKLQkqIGNvbmZpZy90Yy1tNjhrLmMgKERBVEEsIEFERFIsIFNQLCBGUFJFRywgQ09QTlVNLCBCQUQsIEJBQyk6Ci0JRGVmaW5lIGFzIG1hY3JvcyBpbnN0ZWFkIG9mIGVudW1lcmF0b3JzLCBzaW5jZSB0aGUgQXBvbGxvIGNvbXBpbGVyCi0JY2FuJ3QgaGFuZGxlICJlbnVtVmFsMSwgZW51bVZhbDIgPSBlbnVtVmFsMSIgd2hlbiBkZWZpbmluZyBhbiBlbnVtCi0JdHlwZS4KLQkobWFrZV9wY3JlbF9hYnNvbHV0ZSkgW05PX1BDUkVMX1JFTE9DU106IE5ldyBmdW5jdGlvbi4KLQkodGNfY29mZl9maXgycnR5cGUpIFtOT19QQ1JFTF9SRUxPQ1NdOiBHZW5lcmF0ZSBvbmx5IFJfUkVMQllURSwKLQlSX0RJUjE2LCBhbmQgUl9ESVIzMiByZWxvY3MuCi0JKiBjb25maWcvdGMtbTY4ay5oIFtURV9BUE9MTE9dIChDT0ZGX01BR0lDLCBDT0ZGX0FPVVRIRFJfTUFHSUMpOgotCVVzZSBBcG9sbG8gdmVyc2lvbnMuCi0JW1RFX0FQT0xMT10gKE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSKTogVW5kZWZpbmUuICBUaGF0IGlzLAotCWRvIGluY2x1ZGUgdGhlIG9wdGlvbmFsIGhlYWRlciBmb3IgQXBvbGxvIHRhcmdldC4KLQkoQ09GRl9NQUdJQyk6IERvbid0IGRlZmluZSBhcyBNQzY4TUFHSUMgaWYgaXQncyBhbHJlYWR5IGRlZmluZWQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggW1RFX0RFTFRBXSAoTEVYX1BDVCk6IERlZmluZSBhcyAxLCBzbyB0aGF0IGAlJwotCWNhbiBiZSB1c2VkIHdpdGhpbiBhIGxhYmVsIG5hbWUuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogRGVjbGFyZS4KLQkodGNfaW5pdF9hZnRlcl9hcmdzKTogRGVmaW5lIGFzIG02OGtfaW5pdF9hZnRlcl9hcmdzLgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBOZXcgZnVuY3Rpb24sCi0JY29udGFpbmluZyBvbmUtc2hvdCBjb2RlIGZyb20gbWRfYXNzZW1ibGUuICBBZGRlZCB3YXJuaW5nIGZvcgotCWNvbWJpbmF0aW9uIG9mIDY4MDQwIGFuZCA2ODg1MS4KLQkobWRfYXNzZW1ibGUpOiBTdGFydHVwLXRpbWUgY29kZSBkZWxldGVkLgotCi1Nb24gQXByIDI1IDE2OjE5OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlLmluIChjbGVhbiwgZGlzdGNsZWFuKTogUmVtb3ZlIGFzY29uZmlnLnRleGkuCi0KLVN1biBBcHIgMjQgMDA6MTM6MDggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogMTMgYml0IGltbWVkaWF0ZSBjb25zdGFudCAoZm9yIGJyZWFrCi0JaW5zdHJ1Y3Rpb24pIGlzIHVuc2lnbmVkLgotCi1GcmkgQXByIDIyIDE3OjU4OjIyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBVc2UgYmZkX2Vjb2ZmX3NldF9ncF92YWx1ZQotCWFuZCBiZmRfZWNvZmZfc2V0X3JlZ21hc2tzIHRvIHNldCB0aGUgR1AgdmFsdWUgYW5kIHRoZSByZWdpc3RlcgotCW1hc2tzLCByYXRoZXIgdGhhbiB1c2luZyB0aGUgbm93IG9ic29sZXRlIGZha2UgLnJlZ2luZm8gc2VjdGlvbi4KLQotRnJpIEFwciAyMiAxNToxNzowNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsaXN0aW5nLmMgKGxpc3Rfc3ltYm9sX3RhYmxlKTogRG9uJ3QgcHJpbnQgcmVnaXN0ZXIgc3ltYm9scyBhcwotCXVuZGVmaW5lZC4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9zeW1ib2xfbmV3X2hvb2spOiBEb24ndCBuZWVkIHRvIHN0cmlwCi0JdW5kZXJzY29yZXMsIHNpbmNlIHN5bWJvbF9uZXcgd2lsbCBhbHJlYWR5IGhhdmUgZG9uZSBpdC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfc3ltYm9sX25ld19ob29rKTogRGl0dG8uCi0KLQkqIGFzLmMgKG1haW4pOiBJZiB0Y19pbml0X2FmdGVyX2FyZ3MgaXMgZGVmaW5lZCwgaW52b2tlIGl0IGFmdGVyCi0JYWxsIGFyZ3VtZW50cyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgotCi0JU29tZSBjaGFuZ2VzIHRvIGhlbHAgQXBvbGxvIHN1cHBvcnQsIGZyb20gdHJveUBjYm1lLnVuc3cuZWR1LmF1OgotCSogYXMuYyAocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKSBbVEVfQVBPTExPXTogQ3JlYXRlIC53dGV4dAotCXNlY3Rpb24gaW5zdGVhZCBvZiAudGV4dC4gIENhbGwgY3JlYXRlX3RhcmdldF9zZWdtZW50cy4KLQkqIHJlYWQuYyAoZGVtYW5kX2NvcHlfc3RyaW5nKTogTm8gbG9uZ2VyIHN0YXRpYy4KLQotVGh1IEFwciAyMSAxNTo1MDowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogUGVybWl0IGJyYW5jaGVzIHRvIGJlIHN3aXRjaGVkCi0Jd2l0aCB0aGUgcHJlY2VkaW5nIGluc3RydWN0aW9uIGV2ZW4gaWYgLnNldCBub2JvcHQgaGFzIGJlZW4gc2Vlbi4KLQkuc2V0IG5vYm9wdCBhY3R1YWxseSBjb250cm9scyB3aGV0aGVyIHRvIGJyaW5nIHVwIGFuIGluc3RydWN0aW9uCi0JZnJvbSB0aGUgYnJhbmNoIHRhcmdldCwgd2hpY2ggZ2FzIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0LgotCi1XZWQgQXByIDIwIDE4OjQ2OjE0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oLCBjb25maWcvb2JqLWNvZmYuYzogRGVsZXRlZCBhbGwgY29kZSB1c2VkIG9ubHkKLQl3aGVuIEJGRF9BU1NFTUJMRVIgaXMgbm90IGRlZmluZWQsIGFuZCBhbGwgY29uZGl0aW9uYWxzIHJlbGF0aW5nCi0JdG8gc3VjaCBjb2RlLiAgTm8gc3VjaCB0YXJnZXRzIHJlbWFpbi4KLQotCUZpeGVzIGZvciBzdGFicy1pbi1jb2ZmOgotCSogY29uZmlnL29iai1jb2ZmLmM6IEluY2x1ZGUgc3Vic2Vncy5oLgotCShjb2ZmX2Zyb2Jfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvb2JqLWNvZmYuaCAob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24sCi0JY29mZl9mcm9iX3NlY3Rpb24pOiBEZWNsYXJlLgotCShvYmpfZnJvYl9zZWN0aW9uKTogTmV3IG1hY3JvOyB1c2VzIGNvZmZfZnJvYl9zZWN0aW9uLgotCShJTklUX1NUQUJfU0VDVElPTik6IE5ldyBtYWNybzsgdXNlcyBvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbi4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBBbHdheXMgcm91bmQgdXAgdG8KLQltdWx0aXBsZSBvZiBhbGlnbm1lbnQgcG93ZXIgc3BlY2lmaWVkIGluIGJmZCB0YXJnZXQgdmVjdG9yLgotCi0JKiBnYXNwLmM6IEluY2x1ZGUgY3R5cGUuaC4KLQotTW9uIEFwciAxOCAyMTowODowMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW4sIGRvYy9hcy50ZXhpbmZvOiBSZW5hbWVkIGFzZG9jLWNvbmZpZy50ZXhpIHRvCi0JYXNjb25maWcudGV4aS4KLQotCSogZG9jL01ha2VmaWxlLmluIChpbnN0YWxsLWluZm8tYXMsIGluc3RhbGwtaW5mby1nYXNwKTogR2V0IGZpbGUKLQluYW1lcyBmcm9tIHNvdXJjZSBkaXJlY3Rvcnkgd2l0aG91dCBwYXRobmFtZS4KLQotCSogY29uZmlnL29iai12bXMuYyAoVk1TX3dyaXRlX29iamVjdF9maWxlKTogV2hpbGUgbG9va2luZyBmb3IKLQlyZWdpc3RlciBtYXNrLCBza2lwIGVtcHR5IGZpbGwgZnJhZ3MgY2F1c2VkIGJ5IGVuYWJsaW5nIGxpc3RpbmcKLQlvdXRwdXQuCi0KLQkqIGNvbmZpZy9oby1zeXN2Lmg6IEluY2x1ZGUgc3RyaW5nLmguCi0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aTogTmV3ICh3ZWxsLCByZWNlbnRseSBhZGRlZCkgZmlsZS4gIEp1c3QgYWRkZWQKLQlpbmZvIG9uIGFzX3dhcm4gYW5kIGZyaWVuZHMuCi0KLU1vbiBBcHIgMTggMTQ6Mjg6MjIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3BhcnNlX3NwYWNlX3N0bXQpOiBVc2UgdGhlIGJ1aWx0LWluCi0JZGVmYXVsdHMgZm9yIGRlZmluZWQsIHByaXZhdGUsIGFuZCBzcG51bSBmaWVsZHMgZm9yIHRoZQotCSRURVhUJCBhbmQgJFBSSVZBVEUkIHNwYWNlcy4gIERvIG5vdCBjbG9iYmVyIHNwbnVtLiAgRG8KLQlub3QgcmVzZXQgdGhlIHNlZ21lbnQgaWYganVzdCB1cGRhdGluZyBhIHNwYWNlLgotCShwYV9zcGFjZXNfYmVnaW4pOiBTZXQgQkZEIHNlY3Rpb24gZmxhZ3MgZm9yIGFsbCBidWlsdC1pbgotCXN1YnNwYWNlcy4KLQotRnJpIEFwciAxNSAxMDo1MTo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGZpcnN0X3Byb2NfcHRyKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYWRkX3Byb2NlZHVyZSk6IFNldCBmaXJzdF9wcm9jX3B0ciBpZiBpdCBoYXNuJ3QgYmVlbiBzZXQuCi0JKGVjb2ZmX2J1aWxkX2xpbmVubyk6IElmIHRoZSBmaXJzdCBwcm9jZWR1cmUgZG9lcyBub3Qgc3RhcnQgYXQKLQlhZGRyZXNzIHplcm8sIGluc2VydCBhIGR1bW15IGxpbmUgdG8gY29tcGVuc2F0ZS4KLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcCwgYm9vdHN0cmFwMiwgYm9vdHN0cmFwMyk6IE1ha2UgZ2FzcC5uZXcKLQlhcyB3ZWxsIGFzIGFzLm5ldy4KLQotVGh1IEFwciAxNCAxNToxMjozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBUcnkgdG8gcGFyc2UgIjBmIiBhbmQgIjBiIiBzZXF1ZW5jZXMgYXMKLQlmbG9hdGluZyBwb2ludCBhbmQgYmluYXJ5IG51bWJlcnMgcmVzcGVjdGl2ZWx5OyBpZiBpdCBkb2Vzbid0Ci0Jd29yaywgdHJlYXQgdGhlbSBhcyBsb2NhbCBsYWJlbHMuCi0KLQkqIE1ha2VmaWxlLmluOiBNYWtlICQoT0JKUykgZGVwZW5kIG9uICQoQUxMX09CSl9ERVBTKS4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEFMTF9PQkpfREVQUyBpbiBvdXRwdXQgTWFrZWZpbGUuCi0KLQlCYXNlZCBvbiBzdWdnZXN0aW9ucyBmcm9tIDxCQUlMRVlAaG1pdmF4Lmh1bWdlbi51cGVubi5lZHU+Ci0JKENoYXJsZXMgQmFpbGV5KToKLQkqIHZtc2NvbmYuc2g6IEluIGdlbmVyYXRlZCBmaWxlLCBnZXQgIi5vYmoiIHN1ZmZpeCByaWdodCwgYnVpbGQKLQlzb3VyY2UgZmlsZXMgZnJvbSBvdGhlciBkaXJlY3RvcmllcyBpbnRvIG9iamVjdHMgaW4gdGhlIGN1cnJlbnQKLQlkaXJlY3RvcnksIGFuZCBzcGVjaWZ5IFBTRUNUIGF0dHJpYnV0ZXMgZXhwbGljaXRseSB0byBsaW5rZXIuCi0JQWxzbyBhZGRlZCBtaXNzaW5nIGxhYmVsLgotCSogTWFrZWZpbGUuaW4gKHN0YW1wLW1rLmNvbSk6IFJlZmVyZW5jZSBuZXcgdmFyaWFibGUKLQlWTVNfT1RIRVJfT0JKUyBmb3IgbGlzdCBvZiBub24tbG9jYWwgb2JqZWN0IGZpbGVzLCBpbnN0ZWFkIG9mCi0JbGlzdGluZyB0aGVtIGhlcmUuCi0JKFZNU19PVEhFUl9PQkpTKTogTmV3IHZhcmlhYmxlLCBhZGRlZCBtb3JlIGxpYmliZXJ0eSBmaWxlcy4KLQkqIG1ha2UtZ2FzLmNvbTogUmVnZW5lcmF0ZWQuCi0KLQkqIGNvbmZpZy9oby12bXMuaCAodW5saW5rKTogRGVmaW5lIGFzIGRlbGV0ZS4KLQotCSogY29uZmlnLWdhcy5jb206IEZpeCBxdW90aW5nIG9uIFRBUkdFVF9DQU5PTklDQUwgZGVmaW5pdGlvbi4KLQlEZWxldGUgZmlsZXMgYmVmb3JlIGNyZWF0aW5nIHRoZW0uCi0KLVRodSBBcHIgMTQgMTM6MzQ6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGUtc3RhZ2UxLCBkZS1zdGFnZTIsIGRlLXN0YWdlMyk6IFVzZSBybSAtZi4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAoRElGRl9FWFBSX09LKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBQZXJtaXQgQkZEX1JFTE9DX1BDUkVMX0xPMTYgZm9yCi0JY2VydGFpbiBjYXNlcyBvZiAnaScsICdqJyBhbmQgJ28nLiAgQ2hhbmdlICd1JyB0byB0YWtlIGFuCi0JYXJndW1lbnQsIHRoZSByZWxvYyB0eXBlLgotCShsb2FkX3JlZ2lzdGVyKTogUGFzcyByZWxvYyB0eXBlIHRvIG1hY3JvX2J1aWxkIGZvciAndScuCi0JKG1hY3JvKTogTGlrZXdpc2UuICBGb3IgTV9MQV9BQiBwZXJtaXQgYSBkaWZmZXJlbmNlIGV4cHJlc3Npb24KLQl3aGVuIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUgYmV0d2VlbiBhbiBhcmJpdHJhcnkgc3ltYm9sIGFuZAotCWEgc3ltYm9sIGluIHRoZSAudGV4dCBzZWN0aW9uLgotCShtaXBzX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSBCRkRfUkVMT0NfUENSRUxfSEkxNl9TIGFuZAotCUJGRF9SRUxPQ19QQ1JFTF9MTzE2IHRvIGJlIGVtaXR0ZWQuCi0JKG1kX2FwcGx5X2ZpeCk6IENoZWNrIHRoYXQgbW9zdCByZWxvY3MgYXJlIG5vdCBQQyByZWxhdGl2ZS4KLQlIYW5kbGUgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUyBhbmQgQkZEX1JFTE9DX1BDUkVMX0xPMTYuCi0JKHRjX2dlbl9yZWxvYyk6IENoYW5nZSAjZXJyb3IgdG8gYXNfZmF0YWwuICBIYW5kbGUKLQlCRkRfUkVMT0NfUENSRUxfTE8xNiBhbmQgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUy4KLQotVHVlIEFwciAxMiAxODoyNToxMyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2Vnc19iZWdpbik6IENhbGwgbWVtc2V0IHdpdGggYXJncyBpbiB0aGUgY29ycmVjdAotCW9yZGVyLgotCShzdWJzZWdfZ2V0KTogQ2xlYXIgbmV3bHkgYWxsb2NhdGVkIHNlZ2luZm8sIHNldCBpdHMgcG9pbnRlciBzbG90cwotCXRvIE5VTEwgaW5zdGVhZCBvZiAwLgotCi1Nb24gQXByIDExIDA5OjAwOjU3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wcm9jZW5kKTogSGFuZGxlIGNhc2Ugd2hlcmUgbGFiZWwgd2FzCi0JZGVmaW5lZCBhZnRlciB0aGUgLnByb2MgZGlyZWN0aXZlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wcm9jZW5kKTogR2l2ZSBhbiBlcnJvciBpZiB3ZSBlbmNvdW50ZXIgYQotCXByb2NlbmQgZm9yIGEgcHJvY2VkdXJlIHdpdGhvdXQgYSBuYW1lLgotCi1UaHUgQXByICA3IDE0OjI4OjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBQYXNzIE5VTEwgZm9yIGV4cHJlc3Npb24gYXJndW1lbnQgdG8KLQltYWNyb19idWlsZCBmb3Igbm9yaSBjYXNlLgotCShTV0lUQ0hfVEFCTEUpOiBEZWZpbmUuCi0JKG1pcHNfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIGEgcmVsb2NhdGlvbiBmb3IgYSBzd2l0Y2ggdGFibGUKLQllbnRyeS4KLQkobWRfYXBwbHlfZml4KTogV3JpdGUgc3dpdGNoIHRhYmxlIGVudHJ5IHZhbHVlIGludG8gZmlsZS4KLQkodGNfZ2VuX3JlbG9jKTogVXNlIEJGRF9SRUxPQ19HUFJFTDMyIGZvciBhIHN3aXRjaCB0YWJsZSBlbnRyeSwKLQlhbmQgc2V0IHRoZSBhZGRlbmQgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQKLQl0aGUgc3VidHJhaGVuZC4KLQotVGh1IEFwciAgNyAxMDozODoxOCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuaCAoZWxmX3RjX3N5bWJvbCk6IERlbGV0ZS4gIE5vIGxvbmdlciB1c2VkLgotCShlbGZfdGNfbWFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCShocHBhX3RjX21ha2Vfc2VjdGlvbnMsIGhwcGFfdGNfc3ltYm9sKTogRGVsZXRlIGV4dGVybiBkZWNscy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogRGVsZXRlIGZ1bmN0aW9uLgotCShocHBhX3RjX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9maWxlKTogRGVsZXRlIGVsZl90Y19zeW1ib2wgYW5kCi0JZWxmX3RjX21ha2Vfc2VjdGlvbnMgc3R1ZmYuICBJdCB3YXMgdGhlcmUgdG8gc3VwcG9ydCBQQSBicmFpbmRhbWFnZQotCXdoaWNoIGhhcyBiZWVuIGZpeGVkLCBhbmQgaW4gdGhlIGNhc2Ugb2YgZWxmX3RjX21ha2Vfc2VjdGlvbnMgaXMKLQlyZWR1bmRhbnQgd2l0aCBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZy4KLQotV2VkIEFwciAgNiAyMDo0ODozMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qLSplbGYqKTogRG9uJ3QgcmVxdWlyZSAiLWhwLSIgZm9yIHRoZQotCW1hbnVmYWN0dXJlci4KLQotVHVlIEFwciAgNSAxNTo0ODowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBGb3IgY2FzZSAnbycsIHdoZW4gZ2VuZXJhdGluZwotCWVtYmVkZGVkIFBJQyBjb2RlLCBhY2NlcHQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gbG9jYWwgc3ltYm9scwotCWFzIGJlaW5nIGNvbnN0YW50LgotCShtaXBzX2ZvcmNlX3JlbG9jYXRpb24pOiBPbmx5IGZvcmNlIGEgcmVsb2MgdG8gYmUgZ2VuZXJhdGVkIGZvciBhCi0JUEMgcmVsYXRpdmUgZml4dXAuCi0JKG1kX2FwcGx5X2ZpeCk6IEZvciBCRkRfUkVMT0NfMzIgYW5kIEJGRF9SRUxPQ19MTzE2LCBwdXQgdGhlIGZpeHVwCi0JdmFsdWUgaW50byB0aGUgZmlsZSBpZiB0aGUgZml4dXAgd2lsbCBub3QgZ2VuZXJhdGUgYSByZWxvYy4KLQotVHVlIEFwciAgNSAxMToxNDoxNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX3Jlc2VydmUpOiBJZiBzZWN0aW9uIHBhc3NlZCBpc24ndCBic3MsCi0JZG9uJ3Qgc3BldyByZW1haW5kZXIgb2YgaW5wdXQgZmlsZSBpbiBlcnJvciBtZXNzYWdlLgotCSh0Y19nZW5fcmVsb2MpOiBJZiBiZmRfcmVsb2NfdHlwZV9sb29rdXAgcmV0dXJucyBudWxsLCBwcmludCBlcnJvcgotCW1lc3NhZ2Ugd2l0aCByZWxvYyB0eXBlIGFuZCB0cnkgdG8gcHJvY2VzcyByZW1haW5kZXIgb2YgZmlsZS4KLQotCSogZG9jL01ha2VmaWxlLmluIChpbnN0YWxsLWluZm8tYXMsIGluc3RhbGwtaW5mby1nYXNwKTogTmV3Ci0JdGFyZ2V0cywgbm93IGV4cGxpY2l0bHkgY2hlY2tpbmcgJChzcmNkaXIpIGZvciBpbmZvIGZpbGVzLgotCShpbnN0YWxsLWluZm8pOiBEZXBlbmQgb24gYm90aCBvZiB0aGVtOyBkbyBub3RoaW5nIG1vcmUuCi0KLU1vbiBBcHIgIDQgMTc6MDY6MDQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogRml4IHRoaW5rbyBpbiBFTEYgdmVyc2lvbi4KLQotTW9uIEFwciAgNCAxMjozOToyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2luc2VydF9vcGVyYW5kKTogQ2hlY2sgUFBDX09QRVJBTkRfU0lHTkVECi0JZmxhZyByYXRoZXIgdGhhbiBzaWduZWRwIGZpZWxkLiAgT25seSBwZXJtaXQgZXh0ZW5kZWQgcmFuZ2UgaWYKLQlQUENfT1BFUkFORF9TSUdOT1BUIGZsYWcgaXMgc2V0IGFuZCBhc3NlbWJsaW5nIGluIDMyIGJpdCBtb2RlLgotCUJhc2VkIG9uIHBhdGNoIGZyb20gRGF2aWQgRWRlbHNvaG4gKGVkZWxzb2huQG5wYWMuc3lyLmVkdSkuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3NpemUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwcGNfYXJjaCk6IENoZWNrIGZvciBQUENfT1BDT0RFX1BQQyBiZWZvcmUgUFBDX09QQ09ERV9QT1dFUi4KLQkobWRfYmVnaW4pOiBJZiBhbiBpbnN0cnVjdGlvbiBoYXMgYSBzaXplIHNwZWNpZmljIGZsYWcgc2V0LCBvbmx5Ci0JYWRkIGl0IGlmIHdlIGFyZSBhc3NlbWJsaW5nIHRoYXQgc2l6ZS4KLQotVGh1IE1hciAzMSAxNjo1MToxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBBZGQgYSBncnVlc29tZSBoYWNrIHRvIGdldAotCWNyb3NzIHNlY3Rpb24gUEMgcmVsYXRpdmUgcmVsb2NzIHJpZ2h0IGZvciBDT0ZGIGFuZCBFTEYuCi0KLU1vbiBNYXIgMjggMTQ6Mzg6MjMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmggKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBBbHdheXMgZGVmaW5lLgotCShPQkpfUFJPQ0VTU19TVEFCKTogRG9uJ3QgZGVmaW5lLgotCi1Nb24gTWFyIDI4IDEyOjQwOjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9scyk6IERvbid0IGxldCBCRkQgY2xvYmJlcgotCXRoZSB0eXBlIG9mIHN5bWJvbCBzZXQgc3ltYm9scyB3aGljaCBoYXBwZW4gdG8gYmUgaW4gdGhlIGFic29sdXRlCi0Jb3IgdW5kZWZpbmVkIHNlY3Rpb24uCi0KLU1vbiBNYXIgMjggMTI6MzU6MDAgMTk5NCAgRGF2aWQgRWRlbHNvaG4gIChlZGVsc29obkBucGFjLnN5ci5lZHUpCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWRkIC1tcHdyeCAoUE9XRVIvMiBha2EKLQlSSU9TMiksIC1tcHdyIChQT1dFUiBha2EgUklPUzEpLCAtbXBwYyAoUG93ZXJQQyBha2EgTVBDNjAzLzYwNCksCi0JYW5kIC1tYW55IChhbGwgYXJjaGl0ZWN0dXJlcykuCi0KLVN1biBNYXIgMjcgMTQ6MDQ6MTkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IFNldCBhZGRlbmQgZm9yIHJlbG9jYXRpb24KLQlpbnZvbHZpbmcgYSBmdW5jdGlvbiBzeW1ib2wgd2hpY2ggaXMgbm90IGEgcGxhYmVsIHRvIHplcm8uCi0JKG1kX2FwcGx5X2ZpeCk6IE5ldmVyIHBhc3MgYSBmdW5jdGlvbiBzeW1ib2wgdG8gZmllbGRfYWRqdXN0LgotCi1GcmkgTWFyIDI1IDE3OjM1OjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogSWYgTl9FWFQgaXMgc2V0IGZvciBhbgotCU5fSU5EUiBzeW1ib2wsIHNldCBCU0ZfRVhQT1JUIGFuZCBjbGVhciBCU0ZfTE9DQUwuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogSWYgRU1CRURERURfUElDLCBkb24ndCBzd2FwIGEKLQlicmFuY2ggd2l0aCBhbiBpbnN0cnVjdGlvbiB0aGF0IHVzZXMgJGF0LCBpbiBjYXNlIHRoZSBicmFuY2ggaXMKLQlsYXRlciBleHBhbmRlZC4KLQkobWFjcm8pOiBJZiBFTUJFRERFRF9QSUMsIGNhc2UgTV9KQUxfQSBtYXkgdXNlICRhdC4KLQkobWRfcGNyZWxfZnJvbSk6IElmIG5vdCBPQkpfQU9VVCwgcmV0dXJuIDQgZm9yIGFuIHVuZGVmaW5lZCBzeW1ib2wKLQl0byBtYWtlIGl0IHBjcmVsX29mZnNldC4KLQkodGNfZ2VuX3JlbG9jKTogSWYgbm90IE9CSl9BT1VULCBzZXQgdGhlIHJlbG9jIGFkZGVuZCB0bwotCXJlbG9jLT5hZGRyZXNzOyBhbm90aGVyIGdydWVzb21lIGhhY2sgdG8gZ2V0IGdhcyByZWxvYyBoYW5kbGluZyB0bwotCWRvIHRoZSByaWdodCB0aGluZy4KLQotVGh1IE1hciAyNCAyMToyOToyOSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfaXApOiBPbmx5IHNldCBHUCBwcm9sb2cgc2l6ZSBpZiB1c2luZwotCVBWIHJlZ2lzdGVyLgotCShUMTIpOiBOZXcgbWFjcm8uCi0JKGVtaXRfaW5zbik6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXNzZW1ibGUpOiBDYWxsIGl0LgotCShhbHBoYV9mb3JjZV9yZWxvY2F0aW9uKTogSGFuZGxlIEJGRF9SRUxPQ18yNiwgZm9yIGNhbGxfcGFsCi0JaW5zdHJ1Y3Rpb25zLgotCShsaXR1c2VfcGVuZGluZyk6IE5ldyB2YXJpYWJsZS4gIFNldCBieSBhbnl0aGluZyB0aGF0IGdlbmVyYXRlcyBhCi0JTElURVJBTCByZWxvYywgY2xlYXJlZCBieSBhbnl0aGluZyB0aGF0IGdlbmVyYXRlcyBhIExJVFVTRSByZWxvYywKLQl0ZXN0ZWQgYnkgY29kZSB0aGF0IG1pZ2h0IHdhbnQgdG8gZW1pdCBhIExJVFVTRSByZWxvYy4KLQkoZW1pdF91bmFsaWduZWRfaW8pOiBOZXcgZnVuY3Rpb24uICBDdXJyZW50bHkgY2FsbHMgbWRfYXNzZW1ibGUsCi0JYnV0IGl0IHNob3VsZCBldmVudHVhbGx5IGJlIGNvbnZlcnRlZCB0byBnZW5lcmF0ZSB0aGUgaW5zbiBpdHNlbGYKLQlhbmQgY2FsbCBlbWl0X2luc24gZGlyZWN0bHkuCi0JKGVtaXRfbG9hZF91bmFsLCBlbWl0X3N0b3JlX3VuYWwsIGVtaXRfYnl0ZV9tYW5pcF9yLAotCWVtaXRfZXh0cmFjdF9yLCBlbWl0X2luc2VydF9yLCBlbWl0X21hc2tfciwgZW1pdF9zaWduX2V4dGVuZCwKLQllbWl0X2Jpc19yKTogTGlrZXdpc2UuCi0JKGFscGhhX2lwLCBjYXNlICdJJyk6IEhhbmRsZSB3aXRoIEJGRF9SRUxPQ18yMy4KLQkoYWxwaGFfaXAsIGxhYmVsIGdldF9tYWNybyk6IERvbid0IGVtaXQgdGhlIGZpbmFsIGluc3RydWN0aW9uIGlmCi0JdGhlIG9wY29kZSBpcyB6ZXJvLgotCShhbHBoYV9pcCwgY2FzZSAnQicsIHN1YmNhc2UgJ2QnKTogTmV3IGNhc2UsIGZvciBzdWJ3b3JkIGFuZAotCXVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIG1hY3Jvcy4KLQkobWRfYXBwbHlfZml4KTogSGFuZGxlIEJGRF9SRUxPQ18yNi4gIEdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UgaWYKLQl0aGUgdmFsdWUgY2FuJ3QgYmUgcmVzb2x2ZWQuCi0KLVdlZCBNYXIgMjMgMTY6MDY6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wYXJzZV9vcHRpb24pOiBGb3IgLW1lbWJlZGRlZC1waWMsIGZvcmNlCi0JdGhlIC1HIHZhbHVlIHRvIDB4N2ZmZmZmZmYuICBGb3IgU1ZSNCBQSUMgb3B0aW9ucywgZG9uJ3QgY2FsbAotCWJmZF9zZXRfZ3Bfc2l6ZSBoZXJlLCBpdCdzIGRvbmUgaW4gbWRfYmVnaW4uICBEb24ndCBwZXJtaXQgLUcgd2l0aAotCS1tZW1iZWRkZWQtcGljLgotCShtaXBzX2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2FwcGx5X2ZpeCk6IFNldCBmaXhQLT5meF9kb25lIGFwcHJvcHJpYXRlbHkuCi0JKHNfY2hhbmdlX3NlYyk6IEZvciBFTUJFRERFRF9QSUMsIGNoYW5nZSAuZGF0YSBhbmQgLnJkYXRhIHRvCi0JLnNkYXRhLgotCSogY29uZmlnL3RjLW1pcHMuaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6IERlZmluZS4KLQkobWlwc19mb3JjZV9yZWxvY2F0aW9uKTogRGVjbGFyZS4KLQkoVENfSEFORExFX0ZYX0RPTkUpOiBEZWZpbmUuCi0KLVR1ZSBNYXIgMjIgMTM6NTg6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChlbnVtIG1pcHNfcGljX2xldmVsKTogTmV3IGVudW0uCi0JKG1pcHNfcGljKTogQ2hhbmdlIGZyb20gaW50IHRvIGVudW0gbWlwc19waWNfbGV2ZWwuICBDaGFuZ2UgYWxsCi0JdXNlcyAoMCBiZWNvbWVzIE5PX1BJQywgMiBiZWNvbWVzIFNWUjRfUElDKS4KLQkobG9hZF9hZGRyZXNzKTogSGFuZGxlIEVNQkVEREVEX1BJQy4KLQkobWFjcm8pOiBIYW5kbGUgRU1CRURERURfUElDIGluIGFsbCBQSUMgY2FzZXMuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFjY2VwdCAtbWVtYmVkZGVkLXBpYyB0byB1c2UgRU1CRURERURfUElDLiAgSWYKLQlPQkpfRUxGLCBhY2NlcHQgLUtQSUMgYW5kIC1jYWxsX3NoYXJlZCB0byB1c2UgU1ZSNF9QSUMgYW5kIGFjY2VwdAotCS1ub25fc2hhcmVkIHRvIHVzZSBOT19QSUMgKHRoaXMgaXMgaG93IHRoZSBJcml4IDUgYXNzZW1ibGVyCi0Jd29ya3MpLiAgRG8gbm90IHBlcm1pdCAtRyB3aXRoIFNWUjRfUElDLgotCShzX2FiaWNhbGxzKTogV2FybiBpZiAtRyB3YXMgdXNlZCwgYW5kIGZvcmNlIC1HIDAuCi0JKHRjX2dlbl9yZWxvYyk6IFNldCByZWxvYy0+YWRkZW5kIHRvIDAgZm9yIGEgUEMgcmVsYXRpdmUgcmVsb2MgZm9yCi0JYW55dGhpbmcgYnV0IGEub3V0LCBub3QganVzdCBmb3IgRUxGLiAgRm9yIEVDT0ZGLCBkb24ndCBnZW5lcmF0ZSBhCi0JQkZEX1JFTE9DXzE2X1BDUkVMX1MyIHJlbG9jIHVubGVzcyB1c2luZyBFTUJFRERFRF9QSUMuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAob2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKTogRGVmaW5lIHRvIGJlIDEuCi0KLVN1biBNYXIgMjAgMTY6MzE6NTUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGNyZWF0ZV9uZXdfc3BhY2UpOiBVc2UgaW50cywgbm90IGNoYXJzIGFzCi0JcGFyYW1ldGVycyB0byBhdm9pZCBsb3Npbmcgd2hlbiBjb21waWxpbmcgd2l0aCBIUCBDQy4KLQkoY3JlYXRlX25ld19zdWJzcGFjZSwgdXBkYXRlX3N1YnNwYWNlLCBmaXhfbmV3X2hwcGEpOiBMaWtld2lzZS4KLQotU3VuIE1hciAyMCAxNDo0MzoxNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLXN0YW1wKTogSWYgYGRlZnMnIGlzIGRlZmluZWQsIGVtaXQgYQotCXByZXByb2Nlc3NvciBkaXJlY3RpdmUgdG8gY3JlYXRlIGEgbWFjcm8gbmFtZWQgYnkgdGhpcyB2YWx1ZSBpbnRvCi0JY29uZmlnLm5ldzsgZG9uJ3QgZXhwbGljaXRseSBnbyBmb3IgQkZEX0FTU0VNQkxFUi4KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIGBkZWZzJywgbm90IGBCRkRERUYnLiAgU2V0IGl0IHRvCi0JTUFOWV9TRUdNRU5UUyBmb3IgYW55IG9iai1jb2ZmYmZkIHRhcmdldC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oIChCRkRfSEVBREVSUywgQkZEKTogRGVmaW5lLgotCSogY29uZmlnL2kzODZjb2ZmLm10IChUREVGSU5FUyk6IERvbid0IGRlZmluZSBCRkQsIE1BTllfU0VHTUVOVFMsCi0Jb3IgQkZEX0hFQURFUlMuCi0JKExPQ0FMX0xPQURMSUJFUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvbTY4a2NvZmYubXQgKFRERUZJTkVTKTogRG9uJ3QgZGVmaW5lIHRob3NlIG1hY3Jvcy4KLQkqIGNvbmZpZy9tODhrY29mZi5tdCAoVERFRklORVMpOiBEaXR0by4KLQkqIGNvbmZpZy9lYm1vbjI5ay5tdDogRGVsZXRlZC4KLQkqIGNvbmZpZy9oODMwMGhkcy5tdDogRGVsZXRlZC4KLQkqIGNvbmZpZy9pYzk2MGNvZmYubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvc3BhcmMubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvaDgzMDAubXQgKExPQ0FMX0xPQURMSUJFUywgVERFRklORVMpOiBEZWxldGVkLgotCSogY29uZmlnL2g4NTAwLm10IChMT0NBTF9MT0FETElCRVMsIFRERUZJTkVTKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9zaC5tdCAoTE9DQUxfTE9BRExJQkVTLCBUREVGSU5FUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvejhrLm10IChMT0NBTF9MT0FETElCRVMpOiBEZWxldGVkLgotCShUREVGSU5FUyk6IERvbid0IGRlZmluZSB0aGUgY29mZmJmZCBtYWNyb3MuCi0KLQkqIE1ha2VmaWxlLmluOiBJbnNlcnQgbWFrZWZpbGUgZnJhZ21lbnRzIGJlZm9yZSBPQkpTIGRlZmluaXRpb24uCi0JKE9CSlMpOiBBZGQgJChURV9PQkpTKS4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBTdXBwbHkgInNlY3Rpb24iCi0JdW5jb25kaXRpb25hbGx5LgotCi0JKiB3cml0ZS5jIChzZXRfc3ltdGFiKTogRGVmaW5lIG9ubHkgaWYgQkZEX0FTU0VNQkxFUi4KLQotU3VuIE1hciAyMCAxMjowNjowNSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUuaW4gKFNUQUdFU1RVRkYpOiBBZGQgZ2FzcC5uZXcuCi0KLUZyaSBNYXIgMTggMjA6MDk6MTYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAoc3ltYm9sX3RhYmxlX2Zyb3plbik6IE5ldyB2YXJpYWJsZSwgdG8gYmUgc2V0IGFmdGVyCi0JYmZkX3NldF9zeW10YWIgaXMgY2FsbGVkLgotCShkdW1wX3NlY3Rpb25fcmVsb2NzKTogTm90ZSB3aGV0aGVyIGEgc3ltYm9sIGlzIGEgc2VjdGlvbiBzeW1ib2wKLQlvciBub3QuCi0JKGFkanVzdF9yZWxvY19zeW1zKTogRm9yIG5vdywgYWx3YXlzIHN1cHBseSBhbiBhYnNvbHV0ZSBzeW1ib2wgZm9yCi0JZml4dXBzIHdpdGhvdXQgc3ltYm9scyBidXQgbm90IHlldCBgZG9uZScuICBVc2Ugc2VjdGlvbl9zeW1ib2wgdG8KLQlnZXQgdGhlIHN5bWJvbCwgaW5zdGVhZCBvZiBnb2luZyBkaXJlY3RseSBmb3IgYWJzX3N5bWJvbC4KLQkod3JpdGVfcmVsb2NzKSBbREVCVUc0XTogQWJvcnQgaWYgYW55IHN5bWJvbCByZWZlcnJlZCB0byBieSBhCi0JcmVsb2MgaXMgbm90IGEgc2VjdGlvbiBzeW1ib2wgYW5kIGlzIG5vdCBpbiB0aGUgc3ltYm9sIHRhYmxlLgotCShzZXRfc3ltdGFiKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IGZyb20gd3JpdGVfb2JqZWN0X2ZpbGUuCi0JQ291bnRzIHN5bWJvbCB0YWJsZSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gYW4gZWFybGllciBjb3VudC4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYWxsIHNldF9zeW10YWIsIGJ1dCBkbyBpdCBhZnRlciBwb3RlbnRpYWxseQotCWludm9raW5nIHRoZSAqX2Zyb2JfZmlsZSBtYWNyb3MuICBEb24ndCBib3RoZXIgY291bnRpbmcgc3ltYm9scy4KLQlDYWxsIHN5bWJvbF9yZW1vdmUsIGluc3RlYWQgb2YgZXhwYW5kaW5nIGl0IGluIHBsYWNlLiAgTW92ZWQgdGhlCi0JY29uZGl0aW9uYWxpemVkIGBvYmplY3RfZmlsZV9zaXplJyBkZWNsYXJhdGlvbiBkb3duIHRvCi0JY29uZGl0aW9uYWxpemVkIGJsb2NrIHdoZXJlIGl0J3MgdXNlZC4gIFdoZW4gdXNpbmcgdGhlIGFic29sdXRlCi0Jc3ltYm9sIGZvciBhIGZpeHVwIHdpdGhvdXQgYSBzeW1ib2wsIHNldCBzeV91c2VkX2luX3JlbG9jLgotCSh3cml0ZV9vYmplY3RfZmlsZSkgW0JGRF9BU1NFTUJMRVJdOiBDYWxsIHNlY3Rpb25fc3ltYm9sIHRvIGdldAotCXRoZSBjb3JyZWN0IHN5bWJvbCBmb3IgdGhlIGFic29sdXRlIHNlY3Rpb24uCi0KLQkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBVc2Ugc3ltYm9sX25ldyBpbnN0ZWFkIG9mCi0Jc3ltYm9sX21ha2UsIHNpbmNlIHdlIG1heSB3YW50IGl0IHRvIGdvIGludG8gdGhlIHN5bWJvbCB0YWJsZS4KLQlNYWtlIHRoZSBuZXcgc3ltYm9sIGhhdmUgaW50ZXJuYWwgbGlua2FnZS4gIElmCi0Jb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jIHNheXMgaXQncyBva2F5LCB1c2UgdGhlIEJGRCBzZWN0aW9uCi0Jc3ltYm9sIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgR0FTIHN5bWJvbC4KLQkob2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKTogRGVmYXVsdCB0byBhbHdheXMgcmV0dXJuaW5nIDAuCi0JKiBjb25maWcvb2JqLWFvdXQuaCAob2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKSBbQkZEX0FTU0VNQkxFUl06Ci0JTmV3IG1hY3JvLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKTogTmV3IG1hY3JvLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYzogSW5jbHVkZSBzdWJzZWdzLmguCi0JKGluX3NpZ25lZF9yYW5nZSk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfaXApOiBVc2UgaXQuCi0JKHNwYXJjX2lwLCBjYXNlICdpJyk6IFVzZSBCRkRfUkVMT0NfU1BBUkMxMywgbm90IF9CQVNFMTMuCi0JKHNwYXJjX2lwLCBsYWJlbCAiaW1tZWRpYXRlIik6IFJlamVjdCBjb25zdGFudHMgZm9yIHBjcmVsCi0JaW5zdHJ1Y3Rpb25zIG9ubHkgaWYgdGhlIHJlbG9jYXRpb24gdHlwZSBpbmRpY2F0ZXMgYSAiY2FsbCIKLQlpbnN0cnVjdGlvbiBhbmQgdGhlIG9mZnNldCBpcyB3aXRoaW4gcmFuZ2Ugb2YgYSAiam1wbCAlZzAiLiAgSWYKLQlpdCdzIG5vdCBpbiByYW5nZSwgdXNlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbCBwbHVzIGFuIG9mZnNldC4KLQkobWRfYXBwbHlfZml4KTogVXNlIGluX3NpZ25lZF9yYW5nZS4gIENvbWJpbmVkIF9TUEFSQzEzIGFuZAotCV9CQVNFMTMgY2FzZXMuCi0JKHRjX2dlbl9yZWxvYyk6IFBlcm1pdCBCRkRfUkVMT0NfU1BBUkMxMy4KLQotCSogY29uZmlnL2ljOTYwY29mZi5tdCAoVERFRklORVMpOiBGaXhlZCB0eXBvIChNQU5ZX1NFQ1RJT05TLCBub3QKLQlNQU5ZX1NFR01FTlRTKS4KLQotCSogY29uZmlndXJlLmluOiBFbGltaW5hdGVkIGFsbCB0YXJnZXRzIHVzaW5nIG9iai1jb2ZmIGJ1dCBub3QKLQlkZWZpbmluZyBCRkRfQVNTRU1CTEVSOyBJIHRoaW5rIGFsbCBzdWNoIHRhcmdldHMgdGhhdCBhcmUKLQlzdXBwb3J0ZWQgd2lsbCBiZSBtYXRjaGVkIGJ5IHJlYWwgQ1BVLU9TIGNvbWJpbmF0aW9ucyBlYXJsaWVyIGluCi0JdGhlIGNhc2Ugc3RhdGVtZW50LgotCSh0YXJnZXRzICotKi1jb2ZmKiwgKi1zeXN2KiwgKi0qLXNjbyosICotKi1zeXN2MzIpOiBEZWxldGVkLiAgTWFkZQotCXNvbWUgY29tbWVudHMgYWJvdXQgdGhlIGRweDIgY29uZmlndXJhdGlvbiwgYnV0IGxlZnQgaXQgZGlzYWJsZWQsCi0Jc2luY2UgaXQgY291bGRuJ3QgYmUgcmVhY2hlZCBiZWZvcmUuCi0JKHRhcmdldCBhMjlrLWFtZC1lYm1vbm9sZCk6IERlbGV0ZWQuCi0KLVRodSBNYXIgMTcgMTM6MzY6MDkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2ltcG9ydCk6IENvcnJlY3RseSBoYW5kbGUgaW1wb3J0aW5nIG9mIGFuCi0JYWxyZWFkeSBkZWZpbmVkIHN5bWJvbC4KLQotV2VkIE1hciAxNiAxNzoxMTozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBPbmx5IGFjY2VwdCBvdmVybHkgbGFyZ2UgdmFsdWVzIGZvcgotCXRoZSAnaicgb3BlcmFuZCBpZiB0aGVyZSBhcmUgbm8gZnVydGhlciBhbHRlcm5hdGl2ZXMgZm9yIHRoaXMKLQlpbnN0cnVjdGlvbi4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGFkanVzdF9zdGFiX3NlY3Rpb24pOiBJbml0aWFsaXplCi0Jc3RhYnN0cnNlZyB0byBTRUdfVU5LTk9XTiwgbm90IC0xLiAgQWZ0ZXIgbG9vcCwgY2hlY2sgd2hldGhlciBpdAotCWlzIG5vdCBTRUdfVU5LTk9XTiByYXRoZXIgdGhhbiBjaGVja2luZyB3aGV0aGVyIGl0IGlzID49IDAuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfYWxpZ24pOiBUYWtlIG5ldyBhcmd1bWVudCwgbGFiZWwsIGFuZCB1c2UKLQlpdCBpbnN0ZWFkIG9mIGdsb2JhbCBpbnNuX2xhYmVsLgotCShzX2FsaWduLCBzX2NvbnMsIHNfZmxvYXRfY29ucywgc19ncHdvcmQpOiBTYXZlIGluc25fbGFiZWwgYmVmb3JlCi0JY2FsbCB0byBtaXBzX2VtaXRfZGVsYXkgYW5kIHBhc3MgaXQgdG8gbWlwc19hbGlnbi4KLQotV2VkIE1hciAxNiAxMTo1NDoxMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZXF1KTogSGFuZGxlIGJvdGggLnJlZyBhbmQgLmVxdSBjb3JyZWN0bHkuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2NhbGxpbmZvKTogQWNjZXB0ICJtaWxsaWNvZGUiIGFzIGFuCi0JYXJndW1lbnQgdG8gYSAuY2FsbGluZm8gZGlyZWN0aXZlLiAgRG9uJ3QgbG9vcCBmb3JldmVyIG9uIGVycm9ycy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZXF1KTogVXNlIHBhX3BhcnNlX251bWJlciBzbyB0aGF0IHdlIGNhbgotCXVzZSBwcmUtZGVmaW5lZCByZWdpc3RlcnMgYXMgYXJndW1lbnRzLgotCi1Nb24gTWFyIDE0IDE0OjI5OjQ1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2hlY2sgYm90aCBTX0lTX0xPQ0FMIGFuZAotCVNfSVNfRVhURVJOQUwgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGRpc2NhcmQgYSBzeW1ib2wuCi0KLQkqIGNvbmZpZy1nYXMuY29tOiBTY2FuIE1ha2VmaWxlLmluLCBub3QgdmVyc2lvbi5jLCBmb3IgY3VycmVudAotCXZlcnNpb24gbnVtYmVyLiAgRGVsZXRlIGFsbCB2ZXJzaW9ucyBvZiB0ZW1wIGZpbGVzIHdoZW4gZmluaXNoZWQKLQl3aXRoIHRoZW0uICBDcmVhdGUgY29uZmlnLmguCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19Jbml0aWFsaXplZF9EYXRhX1NpemUpOiBDYWNoZSBzeW1ib2wKLQl2YWx1ZXMgdG8gcmVkdWNlIG51bWJlciBvZiBsb29rdXBzIHdpdGggU19HRVRfVkFMVUUuICBTa2lwIGRlYnVnCi0Jc3ltYm9scyB0byBhdm9pZCAiYSByZWFsbHkgbmFzdHkgYnVnIi4gIChGcm9tIEhvbGdlciBUZXV0c2NoLAotCWhvbGdlckBib3Ric28ucmhlaW4tbWFpbi5kZS4pCi0JKFZNU193cml0ZV9vYmplY3RfZmlsZSk6IEZvciAiX192dC4qIiBzeW1ib2xzLCBzZXQgU19HRVRfT1RIRVIKLQlmaWVsZC4gIChBbHNvIGZyb20gSG9sZ2VyIFRldXRzY2guKSAgV2F0Y2ggZm9yIGEgd291bGQtYmUgcmVnaXN0ZXIKLQltYXNrIHRoYXQgc3BhbnMgZnJhZ3MuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9saW5lKTogU2V0IHN5bWJvbCBsbm5vIGZpZWxkIHdpdGgKLQl0aGlzX2Jhc2UsIG5vdCBsaW5lX2Jhc2UuICAoUGF0Y2ggZnJvbSBBbmRyZWFzIEFyZW5zLAotCWFyaUBvYmVsaXguYXYucnd0aC1hYWNoZW4uZGUuKQotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IFJldGFpbiBzeW1ib2xzIHRoYXQKLQlsb29rIGxvY2FsIGlmIHRoZXkncmUgZXhwb3J0ZWQgb3IgdW5kZWZpbmVkLiAgVXNlZCB0byBiZSBkb25lIGZvcgotCWk5NjAgb25seS4KLQotCSogcmVhZC5jIChzX2xjb21tLCBzX2NvbW0pOiBQcmludCBzeW1ib2wgbmFtZSBiZWluZyByZWRlZmluZWQuCi0JR2V0IGl0IGZyb20gdGhlIGxvb2tlZC11cCBzeW1ib2wsIGluc3RlYWQgb2YgdXNpbmcgdGhlIHN0cmluZyBmcm9tCi0JdGhlIGlucHV0IHN0cmVhbSwgd2hpY2ggaXMgbm8gbG9uZ2VyIG51bGwtdGVybWluYXRlZC4KLQkoTEVYX1BDVCk6IE5ldyBtYWNybywgZGVmYXVsdHMgdG8gMC4KLQkobGV4X3R5cGUpOiBVc2UgaXQgZm9yIGAlJy4KLQotCSogY29uZmlnL3RjLXZheC5jIChtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgYC1oIycgb3B0aW9uIGZvciBWTVMuCi0JKHZpcF9vcCk6IE5vdyBzdGF0aWMsIGFuZCByZXR1cm5zIHZvaWQuICBDYWxsZXJzIGNoYW5nZWQuICBBZGRlZAotCWZvcndhcmQgZGVjbC4KLQkodmlwKTogRGl0dG8uICBDYWxsIGFzX2ZhdGFsIGRpcmVjdGx5IGlmIGEgcHJvZ3JhbSBidWcgaXMKLQlkZXRlY3RlZC4KLQkob3BfaGFzaCk6IExldCBkZWZhdWx0IGluaXRpYWxpemF0aW9uIHN1ZmZpY2UuCi0KLQkqIE1ha2VmaWxlLmluIChsaXRlcmFsLm8pOiBQcm92aWRlIGRlcGVuZGVuY2llcy4KLQotCSogY29uZmlndXJlLmluOiBTZXQgbmV3IG1ha2VmaWxlIHZhcmlhYmxlIE9QQ09ERVNfTElCLgotCSogTWFrZWZpbGUuaW4gKExJQlMpOiBVc2UgaXQuCi0KLQkqIE1ha2VmaWxlLmluIChtYWtlLWdhcy5jb20sIHN0YW1wLW1rLmNvbSk6IE5ldyB0YXJnZXRzLgotCSogdm1zY29uZi5zaDogTmV3IGZpbGUuCi0JKiBtYWtlLWdhcy5jb206IFJlZ2VuZXJhdGVkIGZyb20gbmV3IHNjcmlwdC4KLQotCSogY29uZmlndXJlLmluIChzcGFyYyotKi1seW54b3MqKTogSGFuZGxlIGFueSB2ZXJzaW9uIG51bWJlcgotCXN1ZmZpeCBhZnRlciAibHlueG9zIi4gIFNldCBlbXVsYXRpb24gdG8gbHlueC4KLQotTW9uIE1hciAxNCAxMTozMDo0OSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBEZWxldGUgZGVjbGFyYXRpb24uCi0KLUZyaSBNYXIgMTEgMjI6MjU6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BjcmVsX2Zyb20pOiBSZXR1cm4gMCBmb3IgdW5kZWZpbmVkIEVMRgotCXN5bWJvbHMuCi0JKHBwY19pc190b2Nfc3ltKTogQ2hhbmdlIC50b2MgdG8gLmdvdC4KLQkobWRfYXBwbHlfZml4KTogQ2hhbmdlIGhhbmRsaW5nIG9mIEVMRiByZWxvY3MuCi0JKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCi1GcmkgTWFyIDExIDE3OjQyOjIwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKENsb3NlX1ZNU19PYmplY3RfRmlsZSk6IEFkZCBjb21tZW50IHBvaW50aW5nCi0Jb3V0IHNvbWUgY29kZSB0aGF0IGRvZXNuJ3QgYmVsb25nIGluIHRoaXMgZmlsZS4KLQotCSogY29uZmlnL29iai12bXMuaDogSW5jbHVkZSBhb3V0L3N0YWJfZ251LmguCi0JKE5fR1NZTSwgLi4uLCBOX0xFTkcpOiBEZWxldGVkLgotCShOT19SRUxPQyk6IFVuZGVmaW5lIGJlZm9yZSBkZWZpbmluZyBhcyBwYXJ0IG9mIGVudW0gcmVsb2NfdHlwZS4KLQotCSogY29uZmlnL3RjLWFscGhhLmM6IEFkZCBjb21tZW50IHF1ZXN0aW9uaW5nIG5lZWQgZm9yIGFsbCB0aGUKLQljaGFyYWN0ZXJzIGluIEZMVF9DSEFSUy4KLQotCSogYXMuYyAobWFpbikgW09CSl9WTVNdOiBEb24ndCBjYWxsIG91dHB1dF9maWxlX2Nsb3NlLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zyb2JfZmlsZSk6IFNldCBzdHJpY3Qgb3JkZXIgZm9yCi0Jc2VjdGlvbnMgd2l0aCByZWNvZ25pemVkIG5hbWVzLCBiZWZvcmUgY29tcHV0aW5nIFZNQSB2YWx1ZXMuCi0KLUZyaSBNYXIgMTEgMTc6NTY6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogQWNjZXB0IG51bWJlcnMgYmV0d2VlbiAweDgwMDAgYW5kCi0JMHhmZmZmIGZvciAnaicgdG8gYmUgY29tcGF0aWJsZSB3aXRoIE1JUFMgYXNzZW1ibGVyLiAgVGhlc2UKLQludW1iZXJzIGFyZSBhY3R1YWxseSB0cmVhdGVkIGFzIG5lZ2F0aXZlLgotCi1UaHUgTWFyIDEwIDEzOjM2OjI5IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChMT0NBTF9MQUJFTCk6IExvY2FsIGxhYmVscyBhcmUgLkxmb28uCi0KLVR1ZSBNYXIgIDggMjE6MTc6MTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmM6IE1pbm9yIGZvcm1hdHRpbmcvc3R5bGlzdGljIGNoYW5nZXMsIHBsdXM6Ci0JKG9ial9jb2ZmX3NlY3Rpb24pOiBEZWNsYXJlLgotCShvYmpfcHNldWRvX3RhYmxlKTogTWFrZSBpdCBhdmFpbGFibGUgb25seSBpZiBNQU5ZX1NFQ1RJT05TLgotCShvYmpfc3ltYm9sX3RvX2NoYXJzKSBbQ1JPU1NfQ09NUElMRV06IFNvbWUgYXR0ZW1wcyB0byBtYWtlIHRoaXMKLQl3b3JrLiAgSXQgc3RpbGwgZG9lc24ndC4gIEl0IG5vdyBmYWlscyB0byBjb21waWxlLCBpbnN0ZWFkIG9mCi0Jc2lsZW50bHkgY29tcGlsaW5nIHRvIGRvIG5vdGhpbmcuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyk6IERlZmluZSBvbmx5IGlmCi0JTUFOWV9TRUNUSU9OUy4KLQkoT0JKX1BST0NFU1NfU1RBQikgWyEgTUFOWV9TRUNUSU9OU106IE5ldyBtYWNybywganVzdCBlbWl0cwotCXdhcm5pbmcuCi0KLQlIYW5kbGUgQWxwaGEgbG9hZC1pbW1lZGlhdGUtRlAgcHNldWRvLWluc3RydWN0aW9uczoKLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaCAobGRpZiwgbGRpZywgbGRpcywgbGRpdCk6IE5ldyBwYXR0ZXJucy4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChsaXQ4X3NlYywgbGl0NF9zZWMsIGxpdDhfc3ltLCBsaXQ0X3N5bSk6IE5ldwotCXZhcmlhYmxlcy4KLQkoY3JlYXRlX2xpdGVyYWxfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkoY3JlYXRlX2xpdGFfc2VjdGlvbik6IE5vdyBhIG1hY3JvLgotCShnZXRfbGl0OF9vZmZzZXQsIGdldF9saXQ0X29mZnNldCk6IE5ldyBmdW5jdGlvbnMuCi0JKG1heWJlX3NldF9ncCk6IE5ldyBmdW5jdGlvbi4KLQkoc2VsZWN0X2dwX3ZhbHVlKTogQ2FsbCBpdC4KLQkobG9hZF9leHByZXNzaW9uKTogUHJlc2VydmUgYWRkZW5kIGlmIHN5bWJvbCBpcyBhIHNlY3Rpb24gc3ltYm9sLgotCShhbHBoYV9pcCk6IEhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlIGBGJyBmb3IgZmxvYXRpbmctcG9pbnQKLQljb25zdGFudHM7IHN0b3JlIHRoZW0gaW4gLmxpdHs0LDh9IHNlY3Rpb25zLgotCShhbHBoYV9pcCwgY2FzZSAnRycpOiBFbWl0IExJVFVTRSByZWxvY2F0aW9ucyBmb3Igc3ltYm9sIGV4cHJzLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzbWFsbGVzdF9pbW1fdHlwZSk6IE5ldmVyIHJldHVybiBJbW0xLgotCi1UdWUgTWFyICA4IDE0OjE4OjE1IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jICh3X3N0cmluZ3MpOiBPbmx5IGNvcHkgc3RyaW5ncyBvdXQgaWYKLQl0aGVpciBzeW1ib2xzIGFyZSBnb2luZyB0byBiZSB3cml0dGVuLgotCi1UdWUgTWFyICA4IDExOjQ5OjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWVzc2FnZXMuYyAoYXNfcGVycm9yKTogRGVjbGFyZSBhcmd1bWVudHMgY29uc3QuCi0JKiBhcy5oIChhc19wZXJyb3IpOiBDaGFuZ2UgZGVjbGFyYXRpb24uCi0KLU1vbiBNYXIgIDcgMTY6MDg6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX2FkZHJlc3MpOiBXaGVuIGNhbGxpbmcgZnJhZ19ncm93LCBhbGxvdwotCWZvciB0aGUgKHVwIHRvKSB0d28gbm9wcyB3aGljaCBtYXkgYmUgaW5zZXJ0ZWQgYnkgYXBwZW5kX2luc24gaWYKLQltaXBzX29wdGltaXplIGlzIDAuCi0JKG1hY3JvKTogTGlrZXdpc2UuCi0KLVRodSBNYXIgIDMgMTE6Mzc6NTUgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKToKLQlBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nIGZyb20gZ2NjLgotCi1XZWQgTWFyICAyIDEwOjMxOjAxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBBZGQgYSBmZXcgY2FzdHMgdG8gbWFrZSBIUCBDIGNvbXBpbGVyIGhhcHB5LgotCi0JKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX3ZlcnNpb24sIG9ial9zb21fY29weXJpZ2h0KTogQmUKLQlwcmVwYXJlZAotCXRvIGhhbmRsZSBhbiBlcnJvciBmcm9tIGJmZF9zb21fYXR0YWNoX2F1eF9oZHIuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmg6IFdyYXAgRUxGIHNwZWNpZmljIGRlY2xzIGluc2lkZSBhbiBpZmRlZi4KLQotTW9uIEZlYiAyOCAxNTowMzoyNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfYXRvZik6IE9taXQgd2FybmluZyBhYm91dCBGUCB2YWx1ZXMuCi0JKGxpbmVfY29tbWVudF9jaGFycyk6IEFkZCAhIHRvIGxpc3QuCi0JKG1kX2FwcGx5X2ZpeCk6IERvIHByb2Nlc3MgMzItIGFuZCA2NC1iaXQgcmVsb2NhdGlvbnMuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9sY29tbSk6IFB1dCAiI2lmIDAiIGFyb3VuZCB0aGUKLQl1bnVzZWQgcGFydHMgKG1vc3Qgb2YgdGhlIGZ1bmN0aW9uKS4KLQkob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24pOiBDYXN0IGFsbG9jYSByZXN1bHQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTk2MC0qLWNvZmYsIGk5NjAtKi12eHdvcmtzNS4qKTogVXNlIGNvZmZiZmQsIGFuZAotCWdhc190YXJnZXQgaWM5NjBjb2ZmLgotCSogY29uZmlnL2ljOTYwY29mZi5tdDogTmV3IGZpbGUuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCBbVENfSTk2MF06IEluY2x1ZGUgY29mZi9pOTYwLmguCi0JKFRBUkdFVF9GT1JNQVQpIFtUQ19JOTYwXTogVXNlIGNvZmYtSW50ZWwtbGl0dGxlLgotCSogY29uZmlnL3RlLWljOTYwLmggKENST1NTX0NPTVBJTEUpOiBEb24ndCB1bmRlZiB0aGlzLiAgV2UnbGwKLQlhbHdheXMgYnVpbGQgbGl0dGxlLWVuZGlhbiBvYmplY3QgZmlsZXMuCi0JKiBjb25maWcvdGMtaTk2MC5jIChtZF9yZWxvY19zaXplKTogRG9uJ3QgZGVmaW5lIGF0IGFsbCBpZiBCRkQgb3IKLQlCRkRfQVNTRU1CTEVSIGlzIGRlZmluZWQuCi0JKG1lbV9mbXQpOiBTaW5jZSBDT0ZGIGRvZXNuJ3QgaGFuZGxlIGNhbGx4IHJlbG9jYXRpb25zIHlldCwgdHJlYXQKLQl0aGVtIGxpa2Ugbm9ybWFsIDMyLWJpdCByZWxvY2F0aW9ucy4KLQkobWRfYXBwbHlfZml4KTogRm9yIGNhbGx4IHJlbG9jYXRpb25zLCBzdG9yZSB6ZXJvLgotCSh0Y19ib3V0X2ZpeF90b19jaGFycyk6IFN0b3JlIHN5bWJvbCBpbmRleCBmb3IgYWxsIGNhbGx4Ci0JcmVsb2NhdGlvbnMsIHJlZ2FyZGxlc3Mgb2YgbGluay1yZWxheCBzZXR0aW5nLgotCSh0Y19jb2ZmX2ZpeDJydHlwZSwgdGNfY29mZl9zaXplbWFjaGRlcCk6IE5ldyBmdW5jdGlvbnMuCi0JKGk5NjBfaGFuZGxlX2FsaWduKSBbISBPQkpfQk9VVF06IElmIGxpbmstcmVsYXggb3B0aW9uIGlzCi0Jc2VsZWN0ZWQsIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGNsZWFyIGl0LgotCSogY29uZmlnL3RjLWk5NjAuaCAoQkZEX0FSQ0gsIENPRkZfRkxBR1MsIENPRkZfTUFHSUMsCi0JVENfQ09VTlRfUkVMT0MsIFRDX0NPRkZfRklYMlJUWVBFLCBUQ19DT0ZGX1NJWkVNQUNIREVQLAotCXRjX2ZpeF9hZGp1c3RhYmxlKTogTmV3IG1hY3Jvcy4KLQkodGNfY29mZl9maXgycnR5cGUsIHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBEZWNsYXJlLgotCi1GcmkgRmViIDI1IDIwOjU2OjU3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX3RjX3N5bWJvbCk6IENhbGwgUEEgRUxGIEJGRCB2ZXJzaW9uLgotCShocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkocGFfYnVpbGRfc3ltZXh0bl9zZWN0aW9uKTogRGVsZXRlIHVudXNlZCBmdW5jdGlvbi4KLQkoaHBwYV90Y19tYWtlX3N5bWV4dG5fc2VjdGlvbik6IExpa2V3aXNlLgotCShwYV9leHBvcnQpOiBEZWxldGUgY2FsbCB0byBwYV9idWlsZF9zeW1leHRuX3NlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKGhwcGFfdGNfc3ltYm9sKTogQWRkIGV4dGVybiBkZWNsLgotCShlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogRGVsZXRlIGV4dGVybiBkZWNsLgotCShocHBhX3RjX3N5bWJvbCk6IERlbGV0ZSBleHRlcm4gZGVjbC4KLQotRnJpIEZlYiAyNSAxMzoxNTozMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiBDb3JyZWN0IHRlc3QgZm9yIHdoZXRoZXIgdG8KLQlmaWxsIGEgc2VjdGlvbiAoZnJvbSBNaW5oIFRyYW4tTGUgPFRSQU5MRUBpbnRlbGxpY29ycC5jb20+KS4KLQotVGh1IEZlYiAyNCAxMTozMDoyNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHJlcXVpcmUgdmVyc2lvbiBudW1iZXIgZm9yIGkzODYtKi1tYWNoLgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGRlZCAiLnRoaXNfR0NDX3JlcXVpcmVzX3RoZV9HTlVfYXNzZW1ibGVyIiwKLQl3aGljaCBpcyBpZ25vcmVkIGJ5IGdhcywgYnV0IHdpbGwgY2F1c2Ugb3RoZXIgYXNzZW1ibGVycyB0byBjaG9rZS4KLQlJbnRlbmRlZCBmb3IgdXNlIGJ5IGdjYyBwb3J0cyB0aGF0IHJlcXVpcmUgZ2FzIGluc3RlYWQgb2YgbmF0aXZlCi0JYXNzZW1ibGVycy4KLQotVGh1IEZlYiAyNCAwNzoxMDozMSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL2hvLWhwcGFvc2YuaDogRml4IGJyYWlubyBpbiB0ZXN0IGZvciBBTlNJLUMuCi0KLVdlZCBGZWIgMjMgMTY6NTE6NDMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogR2l2ZSB0aGUgdXNlciBhIHJlYXNvbmFibGUgZXJyb3IKLQltZXNzYWdlIHJhdGhlciB0aGFuICJhc3NlcnRpb24gZmFpbGVkIiBpZiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMKLQlmYWlscy4KLQotVHVlIEZlYiAyMiAxMDowNzozMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9oby1tYWNoMy5oOiBOZXcgZmlsZS4KLQotTW9uIEZlYiAyMSAxMTo0MToxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2RlYnVnKTogRG9uJ3Qgc2V0IGhkci0+bWFnaWMgaGVyZS4gIEl0IGlzCi0Jbm93IHNldCBpbiBiZmQvZWNvZmZsaW5rLmM6ZWNvZmZfd3JpdGVfc3ltaGRyLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiB1c2UgYmZkX2dldF9lcnJvciAoKSwKLQlub3QgYmZkX2Vycm9yLgotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IExpa2V3aXNlLgotCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBVc2UgYW4gYWxpZ25tZW50IHBvd2VyIG9mIDMgZm9yIDggYnl0ZSAubGNvbW0KLQl2YXJpYWJsZXMuCi0KLQkqIGNvbmZpZy9oby1ocHV4LmggKEJST0tFTl9BU1NFUlQpOiBEZWZpbmUgaWYgbm90IF9fR05VQ19fLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IFVzZSBjb3JyZWN0IGFyZ3VtZW50cyB0byBtZW1jcHkKLQkoYnJva2VuIDE5IEp1bCAxOTkzKS4gIEZyb20ga2pkQHBlc2NhZGVyby5zdGFuZm9yZC5lZHUgKEtlbm5ldGgKLQlEdWRhKS4KLQotU3VuIEZlYiAyMCAxODowMTo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmggKG9ial9jb2ZmX3NlY3Rpb24pOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBGb3IgInNlY3Rpb24iLCB1c2UKLQlvYmpfY29mZl9zZWN0aW9uLgotCShvYmpfY29mZl9zZWN0aW9uKTogUmV3cml0ZS4KLQotRnJpIEZlYiAxOCAxNDoxNjozMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1tYWNoMyopOiBOZXcgdGFyZ2V0OyB1c2VzIEJGRC4KLQkqIGNvbmZpZy90ZS1tYWNoLmg6IE5ldyBmaWxlLgotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2JfZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotYW91dC5oIChvYmpfYW91dF9mcm9iX2ZpbGUpOiBEZWNsYXJlIGl0LgotCShmcm9iX2ZpbGUpOiBOZXcgbWFjcm8uCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXhfMSkgW1RFX01hY2hdOiBEb24ndCBhZGp1c3QKLQlwY3JlbDMyIHJlbG9jYXRpb25zLgotCSogY29uZmlnL3RjLWkzODYuaCAoVEFSR0VUX0ZPUk1BVCkgW1RFX01hY2hdOiBVc2UgYS5vdXQtbWFjaDMuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogUmVtb3ZlZCByZWdpc3RlciBkZWNsYXJhdGlvbnMuCi0KLVRodSBGZWIgMTcgMTY6MjU6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JU29tZSBzdXBwb3J0IGZvciBQb3dlclBDIEVMRi4KLQkqIGNvbmZpZ3VyZS5pbjogSWYgY3B1IGlzIHBvd2VycGMqLCB1c2UgcHBjLgotCShwcGMtKi1zeXN2NCopOiBVc2Ugb2JqZWN0IGZvcm1hdCBlbGYuCi0JKiBjb25maWcvdGMtcHBjLmg6IE9ubHkgZGVjbGFyZSBhIG51bWJlciBvZiB0aGluZ3MgaWYgT0JKX0NPRkYgaXMKLQlkZWZpbmVkLgotCShUQVJHRVRfQVJDSCk6IE1ha2UgaXQgY2FsbCBwcGNfYXJjaC4KLQkocHBjX2FyY2gpOiBEZWNsYXJlLgotCShUQVJHRVRfRk9STUFUKTogU2V0IGJhc2VkIG9uIE9CSl9DT0ZGIG9yIE9CSl9FTEYuCi0JKE5PX1NUUklOR19FU0NBUEVTKTogRGVmaW5lLgotCShMT0NBTF9MQUJFTCwgRkFLRV9MQUJFTF9OQU1FKTogRGVmaW5lIGZvciBPQkpfRUxGLgotCSogY29uZmlnL3RjLXBwYy5jOiBPbmx5IGRlZmluZSBhIG51bWJlciBvZiBmdW5jdGlvbnMgb2YgT0JKX0NPRkYKLQlpcyBkZWZpbmVkLgotCShtZF9wc2V1ZG9fdGFibGUpOiBNb3N0IHBzZXVkby1vcHMgYXJlIE9CSl9DT0ZGIHNwZWNpZmljLiAgQWRkZWQKLQlPQkpfQ09GRiBzcGVjaWZpYyAiYmkiIGFuZCAiZWkiLgotCShtZF9wYXJzZV9vcHRpb24pOiBGaXggaGFuZGxpbmcgb2YgLXUuICBNYWtlIC1tNjAxIHNldAotCVBQQ19PUENPREVfNjAxLiAgSWYgT0JKX0VMRiwgYWNjZXB0IC1WIGFuZCAtUS4KLQkocHBjX3NldF9jcHUpOiBOZXcgZnVuY3Rpb24uCi0JKHBwY19hcmNoKTogTmV3IGZ1bmN0aW9uLgotCShtZF9iZWdpbik6IENhbGwgcHBjX3NldF9jcHUuCi0JKHBwY19pbnNlcnRfb3BlcmFuZCk6IEZvciBhIHNpZ25lZCBvcGVyYW5kIGFjY2VwdCBhbiB1bnNpZ25lZAotCXZhbHVlLCBmb3IgSUJNIGNvbXBhdGliaWxpdHkuCi0JKHBwY19ieXRlKTogRG9uJ3QgY2FsbCBzdHJpbmdlciBmb3Igc3RyaW5nczsgaW5zdGVhZCwgdHJlYXQgdHdvCi0JZG91YmxlIHF1b3RlcyBhcyBhIHNpbmdsZSBkb3VibGUgcXVvdGUuCi0JKHBwY19jb21tKTogU2V0IHN5X3RjLm91dHB1dCBmb3IgYSAubGNvbW0gc3ltYm9sLgotCShwcGNfYmllaSk6IE5ldyBmdW5jdGlvbi4KLQkocHBjX3RjKTogSWYgbm90IE9CSl9DT0ZGLCBpZ25vcmUgZmlyc3QgYXJndW1lbnQuCi0JKHBwY19maXhfYWRqdXN0YWJsZSk6IENhbGwgYXNfYmFkX3doZXJlLCBub3QgYXNfYmFkLgotCShwcGNfaXNfdG9jX3N5bSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXBwbHlfZml4KTogVXNlIHBwY19pc190b2Nfc3ltLiAgSGFuZGxlIEJGRF9SRUxPQ18xNiBhbmQKLQlCRkRfUkVMT0NfOC4KLQotVGh1IEZlYiAxNyAwOToyOTozNyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX3BlcnJvcikgW0JGRF9BU1NFTUJMRVJdOiBVc2UgYmZkX2dldF9lcnJvciBhbmQKLQliZmRfc2V0X2Vycm9yIGFuZCBuZXcgZXJyb3IgbmFtZXMuCi0KLVR1ZSBGZWIgMTUgMjA6MjM6MjAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBTdXBwb3J0IGk5NjAtdnh3b3JrcyB2ZXJzaW9ucyA+IDUuMCBhcyBjb2ZmLgotCURlZmF1bHQgaXMgc3RpbGwgYm91dCBpZiBubyB2ZXJzaW9uIGlzIHNwZWNpZmllZC4KLQotCSogYXRvZi1nZW5lcmljLmMgKGF0b2ZfZ2VuZXJpYyk6IFVzZSBzd2l0Y2ggYW5kIHN0cmNhc2VjbXAgaW5zdGVhZAotCW9mIGxhcmdlIG51bWJlciBvZiBjb21wYXJlcyB3aGVuIGxvb2tpbmcgZm9yIGluZi9uYW4gdmFsdWVzLgotCi1GcmkgRmViIDExIDEzOjEzOjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBEbyB1bmFsaWduZWQgbG9hZHMgYW5kIHN0b3JlcwotCWNvcnJlY3RseSB3aGVuIGJpZyBlbmRpYW4sIGFuZCBnaXZlIGVycm9ycyBvbiBvdmVyZmxvdyByYXRoZXIgdGhhbgotCWdlbmVyYXRpbmcgaW5jb3JyZWN0IGNvZGUuCi0KLVRodSBGZWIgMTAgMTE6MjQ6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhcy5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCi0JKiByZWFkLmMgKGRvX2FsaWduKTogRG9uJ3QgZGVmaW5lIGxhYmVsIGp1c3RfcmVjb3JkX2FsaWdubWVudAotCXVubGVzcyBpdCBtaWdodCBiZSB1c2VkLgotCi0JKiBhcy5jIChtYWluKTogSWYgbWRfcGFyc2VfbG9uZ19vcHRpb24gaXMgZGVmaW5lZCwgY2FsbCBpdCB3aXRoIGEKLQlsb25nIG9wdGlvbi4KLQkqIGNvbmZpZy90Yy1taXBzLmggKG1kX3BhcnNlX2xvbmdfb3B0aW9uKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc190cmFwKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBSZXBvcnQgYW4gZXJyb3IgaWYgbWlwc190cmFwIGlzIHNldCBhdCBJU0EgbGV2ZWwgMS4KLQkobWFjcm8pOiBJZiBtaXBzX3RyYXAsIHVzZSB0cmFwIGluc3RydWN0aW9ucyBpbnN0ZWFkIG9mIGJyZWFrCi0JaW5zdHJ1Y3Rpb25zIGZvciBvdmVyZmxvdyBhbmQgZGl2aWRlIGJ5IHplcm8gZGV0ZWN0aW9uLgotCShtaXBzX3BhcnNlX2xvbmdfb3B0aW9uKTogTmV3IGZ1bmN0aW9uLiAgU3VwcG9ydCAtLXRyYXAsCi0JLS1uby1icmVhaywgLS1icmVhayBhbmQgLS1uby10cmFwLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IG5ldyBvcHRpb25zLgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgInplcm8iLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfcHNldWRvX3RhYmxlKTogUmVtb3ZlICJ6ZXJvIi4KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG1kX3BzZXVkb190YWJsZSk6IExpa2V3aXNlLgotCi1UaHUgRmViIDEwIDAxOjI0OjI3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFJlamVjdCBpbnRlZ2VyIHZhbHVlcyBmb3IKLQlwYy1yZWxhdGl2ZSBvcGVyYW5kIGZpZWxkcy4gIFRoaXMgZm9yY2VzICJjYWxsIDAiIHRvIGJlY29tZSAiam1wbAotCSVnMCwlbzciIHdpdGggbm8gcmVsb2NhdGlvbnMgbmVlZGVkLgotCi1XZWQgRmViICA5IDEzOjA4OjMyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXMuaCAoeG1hbGxvYywgeHJlYWxsb2MpOiBEZWNsYXJlIHVzaW5nIFBUUiByYXRoZXIgdGhhbiBjaGFyICouCi0JKiB4bWFsbG9jLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogVXNlIFBUUiByYXRoZXIgdGhhbiBjaGFyICouCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBJZiBOT19TVFJJTkdfRVNDQVBFUyBpcyBkZWZpbmVkLAotCWRvbid0IHRyZWF0IGJhY2tzbGFzaCBzcGVjaWFsbHkgaW5zaWRlIHN0cmluZ3MuCi0JKiByZWFkLmMgKG5leHRfY2hhcl9vZl9zdHJpbmcpOiBMaWtld2lzZS4KLQotV2VkIEZlYiAgOSAwOTo0Mjo0NSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IFVzZSBtZW1zZXQKLQlpbnN0ZWFkIG9mIG1lbWNweSB0byB6ZXJvIHRoZSBpbml0aWFsIHN0YWIgc3ltYm9sLCBkdWguCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX2luaXRfc3RhYl9zZWN0aW9uKTogRGl0dG8uCi0KLVR1ZSBGZWIgIDggMTc6MjU6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogVXNlIGFzX2JhZF93aGVyZSwgbm90IGFzX2JhZC4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBDYWxsIG1lbXNldCB3aXRoIHRoZSBhcmd1bWVudHMgaW4KLQl0aGUgcmlnaHQgb3JkZXIuICBFeHBsaWNpdGx5IGNsZWFyIGZpeF9yb290IGFuZCBmaXhfdGFpbCBmaWVsZHMuCi0KLVR1ZSBGZWIgIDggMTY6MDA6MjUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBGb3IgYWJzX3N5bWJvbCwgc2V0ICpwdW50Ci0JYW5kIGRvIG5vdGhpbmcgZWxzZS4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfYmVnaW4pOiBJbml0aWFsaXplIHZhbHVlIG9mIGFic19zeW1ib2wKLQlwcm9wZXJseS4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBVc2UgYWJzX3N5bWJvbCBpbnN0ZWFkIG9mIGNhbGxpbmcKLQlzZWN0aW9uX3N5bWJvbC4KLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfZGVidWcpOiBGaXggIi8qIiBpbiBjb21tZW50IHRvIHNpbGVuY2UKLQljb21wbGFpbnQgZnJvbSAiZ2NjIC1XYWxsIi4KLQotCSogY29uZmlndXJlLmluIChhbHBoYS0qLW5ldHdhcmUqKTogTmV3IHRhcmdldCwgbGlrZSBhbHBoYS0qLW9zZiouCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChHUF9BREpVU1RNRU5UKTogTW92ZSBkZWZpbml0aW9uIHRvIHN0YXJ0IG9mCi0JZmlsZS4KLQkodGNfZ2VuX3JlbG9jKTogUmVtb3ZlIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgYGNvZGUnLCBhbmQgY29kZQotCXRoYXQgdHJpZWQgdG8gdXNlIGl0IChpbmNvcnJlY3RseSkuICBGb3IgTElURVJBTCByZWxvYywgc2V0IGFkZGVuZAotCXRvIG5lZ2F0aXZlIG9mIEdQIHZhbHVlLgotCShsb2FkX3N5bWJvbF9hZGRyZXNzKTogRG9uJ3QgYWRqdXN0IHJldHVybiB2YWx1ZSBieSBHUF9BREpVU1RNRU5ULgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBQcmludCBzb21lIHNlbnNpYmxlIGVycm9yIG1lc3NhZ2UgaWYKLQliZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHJldHVybnMgYmZkX3JlbG9jX292ZXJmbG93LgotCi1Nb24gRmViICA3IDE1OjQ5OjI0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSplbGYqKTogTmV3IGNvbmZpZ3VyYXRpb24gZm9yIFBBIEVMRi4KLQkoaHBwYSotKi1vc2YqKTogRGVmYXVsdCBvYmplY3QgZm9ybWF0IGlzIFNPTS4KLQotTW9uIEZlYiAgNyAxNjowNzozNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfYXRvZik6IFdhcm4gdGhhdCBmbG9hdGluZy1wb2ludCB2YWx1ZXMKLQltaWdodCBub3QgYXNzZW1ibGUgcHJvcGVybHkuCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0IGFscGhhLSotb3NmKik6IERvbid0IHNldCAiZGV2PXllcyIgYW55Ci0JbW9yZS4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IFBhcmVudGhlc2l6ZSBvcGVyYXRpb25zIGluCi0JcmFuZ2UgY2hlY2tpbmcsIHRvIGF2b2lkIHByZWNlZGVuY2UgcXVlc3Rpb25zLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWRkcjMyKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogU2V0IGl0IGZvciAiLTMyYWRkciIuCi0JKGxvYWRfc3ltYm9sX2FkZHJlc3MpOiBJZiBhZGRyMzIgaXMgc2V0LCB1c2UgbGRsIGluc3RlYWQgb2YgbGRxLgotCi0JKiBhdG9mLWdlbmVyaWMuYyAoYXRvZl9nZW5lcmljKTogQ2FsY3VsYXRlIG1heGltdW1fdXNlZnVsX2RpZ2l0cwotCWFuZCBtb3JlX3RoYW5fZW5vdWdoX2JpdHNfZm9yX2RpZ2l0cyBpbiBpbnRlZ2VyIGFyaXRobWV0aWMsIHRvCi0JZWxpbWluYXRlIHRoZSBvbmx5IHNvdXJjZXMgb2YgZGVwZW5kZW5jZSBvbiBmbG9hdGluZyBwb2ludAotCXN1cHBvcnQsIHdoaWNoIGRvZXNuJ3Qgd29yayB5ZXQgb24gdGhlIEFscGhhLgotCi1Nb24gRmViICA3IDAzOjU2OjA1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfZGVidWcpIFtUQ19BTFBIQV06IFNwZWNpZnkgdmVyc2lvbiBzdGFtcCBhcwotCTB4MzBiIGZvciBBbHBoYSBmb3Igbm93LCB1bnRpbCAiLnZlcnN0YW1wIiBpcyBoYW5kbGVkLgotCi0JKiBsaXRlcmFsLmMgKGFkZF90b19saXRlcmFsX3Bvb2wpOiBVc2Ugc2VnaW5mby0+ZnJjaGFpblAsIHdoaWNoCi0JYWN0dWFsbHkgcmVmZXJzIHRvIHRoZSBsaXRlcmFsIHBvb2wgc2VjdGlvbiwgcmF0aGVyIHRoYW4KLQlmcmNoYWluX25vdywgd2hpY2ggcmVmZXJzIHRvIHdoYXRldmVyIHNlY3Rpb24gdGhlIGFzc2VtYmxlciB3YXMKLQlpbi4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IE9ubHkgZG8gcmFuZ2UgY2hlY2tpbmcgaWYgc2l6ZSBvZiBmaXh1cAotCWlzIHNtYWxsZXIgdGhhbiB3b3JkIHNpemUuICBPdGhlcndpc2UsIHdlIGFsd2F5cyB3aW5kIHVwIHdpdGgKLQl6ZXJvcy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBDaGFuZ2Ugc2Vjb25kIGFyZ3VtZW50IGFuZAotCXJldHVybiB0eXBlIHRvIHZhbHVlVCwgdG8gYWdyZWUgd2l0aCB0Yy5oLgotCShhbHBoYV9kb19hbGlnbik6IExvY2FsIHN0YXRpYyBhcnJheSBub3BfcGF0dGVybiBpcyBub3cgdW5zaWduZWQKLQljaGFyLCB0byBhdm9pZCBvdmVyZmxvdyB3YXJuaW5ncy4KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChtZF9zZWN0aW9uX2FsaWduKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zyb2JfZmlsZSk6IEVuc3VyZSB0aGF0IGVjb2ZmX2RhdGEgZm9yCi0Jb3V0cHV0IGJmZCBpcyBub24tbnVsbCBiZWZvcmUgaW5kaXJlY3RpbmcgdGhyb3VnaCBpdC4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2Zyb2JfZWNvZmZfZGF0YSk6IFJlbmFtZWQgZnJvbQotCWFscGhhX2Zyb2JfZmlsZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5oICh0Y19mcm9iX2ZpbGUpOiBNYWNybyBkZWxldGVkLgotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpIFtUQ19BTFBIQV06IENhbGwKLQlhbHBoYV9mcm9iX2Vjb2ZmX2RhdGEsIHRoZW4gZmlsbCBpbiBvcHRpb25hbC1oZWFkZXIgaW5mbyB3aXRoIGdwCi0JdmFsdWUgYW5kIHJlZ2lzdGVyIG1hc2tzLgotCi1TdW4gRmViICA2IDE2OjEzOjQ3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWd1cmUuaW4gKGhpdXgpOiBGaXhlcyBmcm9tIG0ta2FzYWhyQHNyYW1oYy5zcmEuY28uSlAuCi0KLQkqIGNvbmZpZy9vYmotc29tLmMgKG9ial9zb21faW5pdF9zdGFiX3NlY3Rpb24pOiBTYW1lIGNoYW5nZQotCWFzIGNvZmZiZmQgYW5kIGVsZiBiZWxvdy4gIFplcm8gdGhlIGluaXRpYWwgc3RhYiBzeW1ib2wgYWZ0ZXIKLQlhbGxvY2F0aW5nIGl0LgotCi1TYXQgRmViICA1IDEyOjMwOjMyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogWmVybyB0aGUKLQlpbml0aWFsIHN0YWIgc3ltYm9sIGFmdGVyIGFsbG9jYXRpbmcgaXQuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uKTogRGl0dG8uCi0KLVNhdCBGZWIgIDUgMTE6NTM6MzEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogYWRkYlt0Zl0gc2hvdWxkIG9ubHkgYWNjZXB0Ci0Jbm9uLW5lZ2F0ZWQgY29uZGl0aW9uIGNvbXBsZXRlcnMuICBBZGQgc3VwcG9ydCBmb3IgYWRkYiBwc2V1ZG8tb3AKLQl3aGljaCBhY2NlcHRzIGJvdGggbmVnYXRlZCBhbmQgbm9uLW5lZ2F0ZWQgY29tcGxldGVycy4KLQotU2F0IEZlYiAgNSAwMDoxNTo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAocnM2MDAwKik6IFVzZSBjcHVfdHlwZSBwcGMuCi0JKHBwYy0qLWFpeCopOiBOZXcgdGFyZ2V0OyB1c2UgY29mZiBhbmQgZm9yY2UgYmZkX2dhcy4KLQkqIGNvbmZpZy90Yy1wcGMuaCwgY29uZmlnL3RjLXBwYy5jOiBOZXcgZmlsZXMgZm9yIFBvd2VyUEMvUE9XRVIKLQkoUlMvNjAwMCkgc3VwcG9ydC4gIEF0IHRoZSBtb21lbnQsIG9ubHkgWENPRkYgaXMgc3VwcG9ydGVkLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoU0FfU0VUX1NZTV9FTkRORFgpOiBNYWRlIG5vbi1zdGF0aWMuCi0JKFNfU0VUX0RBVEFfVFlQRSk6IExpa2V3aXNlLgotCShjb2ZmX2xhc3RfZnVuY3Rpb24pOiBSZW5hbWVkIGZyb20gbG9jYWwgc3RhdGljIGxhc3RfZnVuY3Rpb25QIGluCi0JY29mZl9mcm9iX3N5bWJvbCBhbmQgbWFkZSBleHRlcm5hbGx5IHZpc2libGUuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBOZXcgbG9jYWwgc3RhdGljIHNldF9lbmQ7IHVzZSBpdCB0byB0cnkgdG8KLQlhdm9pZCBjYWxsaW5nIFNBX1NFVF9TWU1fRU5ETkRYIG9uIGEgc3ltYm9sIHRoYXQgd2lsbCBiZSBwdW50ZWQuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU19TRVRfREFUQV9UWVBFKTogRGVjbGFyZS4KLQkoU0FfU0VUX1NZTV9FTkRORFgpOiBEZWNsYXJlLgotCShjb2ZmX2xhc3RfZnVuY3Rpb24pOiBEZWNsYXJlLgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBJZiBET0xMQVJfRE9UIGlzIGRlZmluZWQsIGFjY2VwdCBgJCcgYXMKLQllcXVpdmFsZW50IHRvIGAuJyB0byBtZWFuIHRoZSBjdXJyZW50IGxvY2F0aW9uLgotCi0JKiByZWFkLmMgKExFWF9CUik6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgYXMgMC4KLQkobGV4X3R5cGUpOiBVc2UgTEVYX0JSIGFzIHRoZSB0eXBlIG9mIGB7JyxgfScsYFsnLGBdJy4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KTogSWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIGlzCi0JZGVmaW5lZCwgY2FsbCBpdCB3aXRoIHByZXNlcnZlZF9jb3B5X29mX25hbWUuICBJZgotCXRjX3N5bWJvbF9uZXdfaG9vayBpcyBkZWZpbmVkLCBjYWxsIGl0IG9uIHRoZSBuZXcgc3ltYm9sLgotCShzeW1ib2xfZmluZF9iYXNlKTogSWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIGlzIGRlZmluZWQsCi0JY2FsbCBpdCBvbiBhIGNvcHkgb2YgdGhlIG5hbWUgYXJndW1lbnQuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogU2ltcGxpZmllZCB1c2FnZSBvZiBvYmpfZnJvYl9zeW1ib2wKLQlhbmQgdGNfZnJvYl9zeW1ib2wuICBBbHdheXMgY2FsbCBib3RoIGlmIHRoZSBzeW1ib2wgaXMgZ29pbmcgdG8gYmUKLQlvdXRwdXQuCi0KLQkqIHdyaXRlLmMgKHJlbGF4X3NlZ21lbnQpOiBVc2UgJWxkIHJhdGhlciB0aGFuICVkIHdoZW4gcHJpbnRpbmcKLQlmcmFnUC0+ZnJfdmFyLCBhbmQgY2FzdCBpdCB0byBsb25nLgotCi0JQ2hhbmdlZCByZWxvY3MgdG8gYmUgYmFzZWQgb24gc3Vic2VnbWVudHMgKHdoZW4gQkZEX0FTU0VNQkxFUikuCi0JKiBzdWJzZWdzLmggKHN0cnVjdCBmcmNoYWluKTogSWYgQkZEX0FTU0VNQkxFUiwgYWRkZWQgbmV3IGZpZWxkcwotCWZpeF9yb290IGFuZCBmaXhfdGFpbC4KLQkoc2VnbWVudF9pbmZvX3R5cGUpOiBJZiBCRkRfQVNTRU1CTEVSLCBkb24ndCBkZWZpbmUgZml4X3RhaWwKLQlmaWVsZC4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBJZiBCRkRfQVNTRU1CTEVSLCBzZXQgZml4X3Jvb3RQIGFuZAotCWZpeF90YWlsUCBiYXNlZCBvbiBmcmNoYWluX25vdywgbm90IHNlZ19pbmZvIChub3dfc2VnKS4KLQkoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSk6IENoYWluIHRoZSBzdWJzZWdtZW50IHJlbG9jcyB0b2dldGhlci4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2NoYW5nZSk6IERvbid0IGNsZWFyIGZpeF90YWlsIGZpZWxkLgotCShzdWJzZWdfZ2V0KTogTGlrZXdpc2UuCi0JKiBsaXRlcmFsLmMgKGFkZF90b19saXRlcmFsX3Bvb2wpOiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyB2aWEKLQlmcmNoYWluX25vdywgbm90IHNlZ2luZm8uCi0KLVRodSBGZWIgIDMgMjM6MDc6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKFRBUkdFVF9TWU1CT0xfRklFTERTKTogQ2hhbmdlZAotCWVjb2ZmX3VuZGVmaW5lZCB0byBlY29mZl9leHRlcm5fc2l6ZS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1pcHMuYyAoc19leHRlcm4pOiBTZXQgZWNvZmZfZXh0ZXJuX3NpemUgdG8gdGhlCi0JZXh0ZXJuYWwgc3ltYm9sIHNpemUsIHJhdGhlcm4gdGhhbiBzZXR0aW5nIHRoZSBzeW1ib2wgdmFsdWUuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogQ2hlY2sgYm90aCBlY29mZl9leHRlcm5fc2l6ZSBhbmQKLQlzeW1ib2wgdmFsdWUgdG8gc2VlIGlmIEdQIHJlZmVyZW5jaW5nIGNhbiBiZSB1c2VkLgotCSogZWNvZmYuYyAoZWNvZmZfc3ltYm9sX25ld19ob29rKTogQ2xlYXIgZWNvZmZfZXh0ZXJuX3NpemUsIG5vdAotCWVjb2ZmX3VuZGVmaW5lZC4KLQkoZWNvZmZfZnJvYl9zeW1ib2wpOiBEb24ndCBjaGVjayBlY29mZl91bmRlZmluZWQuCi0JKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBHZXQgc2l6ZSBvZiBhbiB1bmRlZmluZWQgc3ltYm9sIGZyb20KLQlzeW0tPmVjb2ZmX2V4dGVybl9zaXplLCBub3QgU19HRVRfVkFMVUUgKHN5bSkuCi0KLVdlZCBGZWIgIDIgMTM6NTU6MDggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluOiAgQXZvaWQgYnVnIGluIGxvc2luZyBocHV4IHNlZC4KLQotV2VkIEZlYiAgMiAxMTo0MDoxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGZpbGVfbWlwc19pc2EpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9iZWdpbik6IFNldCBpdC4KLQkoc19taXBzc2V0KTogQWRkIHN1cHBvcnQgZm9yIC5zZXQgbWlwTiB0byBzZXQgdGhlIElTQSBsZXZlbC4KLQotCSogZ2FzcC5jIChraW5mbyk6IEZ1bGx5IGJyYWNrZXQgaW5pdGlhbGl6ZXIuCi0KLVR1ZSBGZWIgIDEgMTk6Mjg6MTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZ2FzcC5jIChtYWxsb2MpOiBEb24ndCBkZWNsYXJlLCBzaW5jZSBob3N0Lmggb3Igc3lzdGVtIGhlYWRlcgotCWZpbGVzIG1heSBkZWNsYXJlIGl0IGRpZmZlcmVudGx5LgotCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKGludF90b19nZW4pOiBOb3cgc3RhdGljLgotCi0JKiBjb25maWcvaG8taTM4NmFpeC5oOiBJbmNsdWRlIHN5cy90eXBlcy5oIGFuZCBzdGRsaWIuaCwgbm90Ci0JaG8tc3lzdi5oLiAgQmFzZWQgbG9vc2VseSBvbiBhIHBhdGNoIGZyb20gTWluaCBUcmFuLUxlLgotCi1UdWUgRmViICAxIDEwOjUwOjE3IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGdhc3AuYzogSW5jbHVkZSBob3N0LmguCi0KLVR1ZSBGZWIgIDEgMTI6MTM6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogTWFrZSBhbiB1bnN1cHBvcnRlZCBpbnN0cnVjdGlvbiBhCi0Jd2FybmluZywgbm90IGFuIGVycm9yLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG90X3RleHRfc3ltYm9sLCBkb3RfZGF0YV9zeW1ib2wsCi0JZG90X2Jzc19zeW1ib2wpOiBEb24ndCBkZWZpbmUgaWYgQkZEX0FTU0VNQkxFUi4KLQkob2JqX3N5bWJvbF90b19jaGFycyk6IGJmZF9jb2ZmX3N3YXBfYXV4X291dCBub3cgdGFrZXMgbW9yZQotCWFyZ3VtZW50cy4KLQkoY29mZl9saW5lX2Jhc2UpOiBSZW5hbWVkIGZyb20gbGluZV9iYXNlLiAgQ2hhbmdlZCBhbGwgdXNlcy4KLQkoY29mZl9hZGRfbGluZXN5bSk6IFJlbmFtZWQgZnJvbSBhZGRfbGluZV9zeW0uICBNYWRlIG5vbi1zdGF0aWMuCi0JQ2hhbmdlZCBhbGwgdXNlcy4KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBJZiBUQ19QUEMsIGluY2x1ZGUgY29mZi9yczYwMDAuaC4KLQkoU19TRVRfU1RPUkFHRV9DTEFTUywgU19HRVRfU1RPUkFHRV9DTEFTUyk6IERlY2xhcmUgaWYKLQlCRkRfQVNTRU1CTEVSLgotCShjb2ZmX2xpbmVfYmFzZSk6IERlY2xhcmUuCi0JKGNvZmZfYWRkX2xpbmVzeW0pOiBEZWNsYXJlIGlmIEJGRF9BU1NFTUJMRVIuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoc3ltYm9sX3RvX2NoYXJzKTogYmZkX2NvZmZfc3dhcF9hdXhfb3V0Ci0Jbm93IHRha2VzIG1vcmUgYXJndW1lbnRzLgotCi1Nb24gSmFuIDMxIDE3OjU1OjE0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAoc3RhdGlzdGljc19mbGFnKTogUmVuYW1lZCBmcm9tIHF1aWV0X2ZsYWcuCi0JKG1haW4pOiBHZXQgc3RhdGlzdGljcyB3aXRoIC0tc3RhdGlzdGljcyBpbnN0ZWFkIG9mIC1ub3F1aWV0LgotCi1Nb24gSmFuIDMxIDA3OjE5OjMwIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBTdXBwb3J0IGZvciBHbnUgQVNzZW1ibGVyIFByZXByb2Nlc3Nvci4KLQkqIGdhc3AuYzogTmV3IGZpbGUuCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBBbGlnbiBsY29tbSBkYXRhLgotCSogY29uZmlnL3RjLXo4ay5jICh0Y19yZWxvY19tYW5nbGUpOiBEb24ndCBhbGxvdyBzdWJ0cmFjdGlvbgotCWZyb20gZGlmZmVyZW50IHNlY3Rpb25zLgotCi1TdW4gSmFuIDMwIDE0OjU4OjI2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgdGNfZnJvYl9maWxlIGlzIGRlZmluZWQsIGNhbGwgaXQKLQlqdXN0IGJlZm9yZSBjYWxsaW5nIG9ial9mcm9iX2ZpbGUuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfZ3BfdmFsdWUpOiBSZW5hbWVkIGZyb20gZ3BfdmFsdWUKLQkocmVmZXJlbmNlcyBjaGFuZ2VkKSwgYW5kIG1hZGUgbm9uLXN0YXRpYy4KLQkoZ2V0RXhwcmVzc2lvbik6IFJldHVybiB2b2lkLgotCShzZWxlY3RfZ3BfdmFsdWUpOiBBYm9ydCBpZiBncF92YWx1ZSBpcyBub24temVyby4gIERlbGV0ZSBjYWxsIHRvCi0Jbm9uLWV4aXN0ZW50IGJmZF9zZXRfZ3BfdmFsdWUuCi0JKGFscGhhX3ZhbGlkYXRlX2ZpeCk6IEZ1bmN0aW9uIGRlbGV0ZWQuCi0JKGFscGhhX2Zyb2Jfc3ltYm9sKTogRnVuY3Rpb24gZGVsZXRlZC4KLQkoYWxwaGFfbG9jYWxfbGFiZWwpOiBGdW5jdGlvbiBkZWxldGVkLgotCShhbHBoYV9mcm9iX2ZpbGUpOiBSZW5hbWVkIGZyb20gYWxwaGFfZW5kLgotCSogY29uZmlnL3RjLWFscGhhLmggKGFscGhhX2Zyb2Jfc3ltYm9sLCBhbHBoYV92YWxpZGF0ZV9maXgsCi0JYWxwaGFfbG9jYWxfbGFiZWwsIGFscGhhX2VuZCk6IERlY2xhcmF0aW9ucyBkZWxldGVkLgotCShhbHBoYV9ncF92YWx1ZSwgYWxwaGFfZnJvYl9maWxlKTogRGVjbGFyZS4KLQkodGNfZnJvYl9zeW1ib2wsIFRDX1ZBTElEQVRFX0ZJWCwgbWRfZW5kKTogTWFjcm9zIGRlbGV0ZWQuCi0JKExPQ0FMX0xBQkVMKTogTW92ZSBjb2RlIGhlcmUgZnJvbSB0Yy1hbHBoYS5jOmFscGhhX2xvY2FsX2xhYmVsLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBTaW1wbGlmaWVkIHNsaWdodGx5LgotCSh0Y19mcm9iX2ZpbGUpOiBOZXcgbWFjcm8uCi0KLQkqIHJlYWQuYyAoZG9fYWxpZ24pOiBOZXcgZnVuY3Rpb24sIG1vc3Qgb2YgZ3V0cyBvZiBzX2FsaWduXyoKLQlmdW5jdGlvbnMuICBMb29rIGZvciBtZF9kb19hbGlnbiBtYWNybywgZ2l2ZSBpdCBhIGNoYW5jZSB0byBieXBhc3MKLQlhbGwgYnV0IHJlY29yZGluZyBvZiBzZWN0aW9uIGFsaWdubWVudC4KLQkoc19hbGlnbl9ieXRlcywgc19hbGlnbl9wdHdvKTogQ2FsbCBkb19hbGlnbi4KLQkoc19sY29tbSkgW1RDX0FMUEhBXTogQWxpZ24gb2JqZWN0IHRvIGxhcmdlc3QgcG93ZXIgb2YgdHdvIHRoYXQKLQlkaXZpZGVzIG9iamVjdCBzaXplLgotCi0JKiBmcmFncy5jIChmcmFnX2FsaWduX3BhdHRlcm4pOiBOZXcgZnVuY3Rpb24uCi0JKGZyYWdfYWxpZ24pOiBSZXdyaXRlIGZvciBjbGFyaXR5LgotCi0JKiBjb25maWcvdGMtdmF4LmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlIE9fY29uc3RhbnQgZXhwcmVzc2lvbi4KLQkodmlwX2JlZ2luKTogUmV0dXJucyBwb2ludGVyIHRvIGNvbnN0IGNoYXIuICBDYXN0IGhhc2hfaW5zZXJ0IGFyZwotCXRvIFBUUiB0byBhdm9pZCBjb21waWxlciBjb21wbGFpbnRzIGFib3V0IGNvbnN0LgotCShtZF9iZWdpbik6IExvY2FsIHZhcmlhYmxlIGVycnR4dCBtdXN0IHBvaW50IHRvIGNvbnN0LgotCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBob3N0IHZheC0qLXVsdHJpeCogbGlrZSB2YXgtKi1ic2QqLiAgRG9uJ3QKLQlib3RoZXIgd2l0aCAqLSotdWx0cml4IG9yICotKi1zeXN2KiwgZXhjZXB0ICotKi1zeXN2LCBzaW5jZSBvbmx5Ci0JdGhlIGxhc3QgaGFzIGFuIGV4aXN0aW5nIGhvc3Qgc3VwcG9ydCBmaWxlLiAgRG8gaGFuZGxlIHZheC1ic2QgYW5kCi0JdmF4LXVsdHJpeCB0YXJnZXRzLgotCi1GcmkgSmFuIDI4IDExOjI2OjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb25faGVhZGVyX2FwcGVuZCk6IERvIG5vdAotCWRlY2xhcmUgaWYgQkZEX0FTU0VNQkxFUi4KLQkoc3RhY2tfcG9wKTogQ29ycmVjdCB0ZXN0IGZvciBzdGFjayB1bmRlcmZsb3cuCi0JKG9ial9jb2ZmX2VuZGVmLCBvYmpfY29mZl9kaW0sIG9ial9jb2ZmX2xpbmUsIG9ial9jb2ZmX3NpemUsCi0Jb2JqX2NvZmZfc2NsLCBvYmpfY29mZl90YWcsIG9ial9jb2ZmX3R5cGUsIG9ial9jb2ZmX3ZhbCk6IERlY2xhcmUKLQl0eXBlIG9mIGlnbm9yZWQgYXJndW1lbnQgdG8gYXZvaWQgZ2NjIHdhcm5pbmcuCi0JKGFsaWduKTogUmVtb3ZlZCB1bnVzZWQgZnVuY3Rpb24uCi0KLVRodSBKYW4gMjcgMTg6MTQ6MTkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWFscGhhLmMsIGNvbmZpZy90Yy1hbHBoYS5oLCBjb25maWcvYWxwaGEtb3Bjb2RlLmg6IE5ldwotCWZpbGVzLCBiYXNlZCBvbiBwb3J0IG9mIGdhcy0xLjM4IGNvbnRyaWJ1dGVkIGJ5IENNVSwgdXNpbmcgYS5vdXQKLQl2YXJpYW50LiAgVXBkYXRlZCBmb3IgZ2FzLTIueCBhbmQgRUNPRkYuICBGbG9hdGluZy1wb2ludCBjb25zdGFudHMKLQlhcmUgc3RpbGwgYnJva2VuLCBib290c3RyYXAgdGVzdGluZyBpbmNvbXBsZXRlLgotCi0JKiBsaXRlcmFsLmM6IENvbW1lbnQgY2hhbmdlcy4KLQotCSogbGlzdGluZy5jIChsaXN0aW5nX3NvdXJjZV9maWxlKTogQ2hlY2sgZm9yIG51bGwgbGlzdGluZ190YWlsCi0JYmVmb3JlIGluZGlyZWN0aW5nIHRocm91Z2ggaXQuCi0KLQkqIGV4cHIuaCAoc3RydWN0IGV4cHJlc3Npb25TKTogQWRkZWQgc3RydWN0IHRhZy4KLQotCSogYXMuaDogSWYgX19HTlVDX18gYW5kIGlubGluZSBhcmUgYm90aCB1bmRlZmluZWQsIGRlZmluZSBpbmxpbmUKLQlhd2F5LgotCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogRG9uJ3QgYXNzdW1lIHRoYXQgZnJfdmFyIGZvcgotCXJzX2FsaWduIG9yIHJzX29yZyBmcmFncyB3aWxsIGJlIDEuCi0JKHJlbGF4X3NlZ21lbnQpOiBGb3IgcnNfYWxpZ24sIGlmIGZyX3ZhciBpcyBub3QgMSwgY29tcGxhaW4gaWYKLQlyZXF1aXJlZCBwYWRkaW5nIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBzaXplIG9mIHRoZSBwYWQgcGF0dGVybi4KLQkoZml4dXBfc2VnbWVudCk6IExlYXZlIGdwLXJlbGF0aXZlIHJlbG9jYXRpb25zIGFsb25lLiAgRm9yIHBjcmVsCi0JcmVsb2NhdGlvbnMgcmVmZXJyaW5nIHRvIHRoZSBzYW1lIHNlZ21lbnQsIGNsZWFyIGZ4X3BjcmVsIHdoZW4KLQljbGVhcmluZyBmeF9hZGRzeS4KLQkqIGFzLmg6IEFkanVzdCBjb21tZW50cyBvbiByc19hbGlnbi4KLQotCSogYXRvZi1nZW5lcmljLmM6IFNvbWUgcmVmb3JtYXR0aW5nLgotCShhdG9mX2dlbmVyaWMpOiBCZSBjYXJlZnVsIHdoZW4gbWl4aW5nIHNpZ25lZC91bnNpZ25lZCB2YWx1ZXMgb2YKLQlkaWZmZXJlbnQgc2l6ZXMuCi0KLQkqIHdyaXRlLmMsIGNvbmZpZy9vYmote2FvdXQsYm91dCxjb2ZmKn0uYywgY29uZmlnL3RjLXNwYXJjLmM6Ci0JUXVlcnkgdGhlIGZ4X2RvbmUgZmllbGQgaW5zdGVhZCBvZiBmeF9hZGRzeSB0byBzZWUgaWYgdGhlIGZpeHVwCi0Jc3RpbGwgbmVlZHMgdG8gYmUgYXBwbGllZC4gIFNldCBmeF9kb25lIGFuZCBjbGVhciBmeF9hZGRzeSBib3RoLAotCWZvciBub3cuICBJZiBUQ19IQU5ETEVTX0ZYX0RPTkUgaXNuJ3QgZGVmaW5lZCwgYXNzdW1lIG1kX2FwcGx5X2ZpeAotCXdpbGwgb25seSBjbGVhciBmeF9hZGRzeSwgYW5kIHNldCBmeF9kb25lIGFjY29yZGluZ2x5IGFmdGVyCi0JcmV0dXJuaW5nLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFRDX0hBTkRMRVNfRlhfRE9ORSk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgpOiBTZXQgZnhfZG9uZSBmb3Igbm9uLXBjcmVsIGZpeAotCXdpdGggbm8gZnhfYWRkc3kuCi0KLQkqIHN5bWJvbHMuYyAoZG90X3RleHRfc3ltYm9sLCBkb3RfZGF0YV9zeW1ib2wsIGRvdF9ic3Nfc3ltYm9sKToKLQlEZWxldGVkLgotCShzeW1ib2xfYmVnaW4pOiBNb3ZlZCB0byBlbmQgb2YgZmlsZSwgc28gZnVuY3Rpb24gaW5saW5pbmcgY2FuCi0Jd29yayBiZXR0ZXIuCi0JKGZiX2xhYmVsX2NvdW50LCBmYl9sYWJlbF9tYXgpOiBEZWZhdWx0IEMgc3RhdGljIGluaXRpYWxpemVycyBhcmUKLQlzdWZmaWNpZW50LgotCSogc3ltYm9scy5oIChkb3RfdGV4dF9zeW1ib2wsIGRvdF9kYXRhX3N5bWJvbCwgZG90X2Jzc19zeW1ib2wpOgotCURlY2xhcmF0aW9ucyBkZWxldGVkLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvdF90ZXh0X3N5bWJvbCwgZG90X2RhdGFfc3ltYm9sLAotCWRvdF9ic3Nfc3ltYm9sKTogRGVmaW5lZCBoZXJlLCBzdGF0aWMuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIFtCRkRfQVNTRU1CTEVSXTogVW5kZWYgTk9fUkVMT0MgYmVmb3JlCi0JaW5jbHVkaW5nIGFvdXQvYW91dDY0LmguCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgRU1JVF9TRUNUSU9OX1NZTUJPTFMgaXMgZmFsc2UsCi0JZG9uJ3Qgd3JpdGUgb3V0IGEgc2VjdGlvbiBzeW1ib2wgZXZlbiBpZiBpdCdzIHVzZWQgaW4gYQotCXJlbG9jYXRpb247IGFzc3VtZSByZWxvY2F0aW9ucyB3aWxsIGhhbmRsZSBzZWN0aW9uIG51bWJlcnMKLQlzb21laG93LiAgUmVuYW1lICJwdW50X2l0IiBsYWJlbCB0byAicHVudF9pdF9pZl91bnVzZWQiIHRvIHJlZmxlY3QKLQlpdCdzIHRydWUgdXNlLgotCShFTUlUX1NFQ1RJT05fU1lNQk9MUyk6IERlZmF1bHQgdG8gMS4KLQkoYWRqdXN0X3JlbG9jX3N5bXMpOiBEb24ndCBjcmVhdGUgYSBuZXcgc3ltYm9sIGZvciBhbiBhYnNvbHV0ZQotCXJlZmVyZW5jZTsganVzdCB1c2UgdGhlIGFic29sdXRlIHNlY3Rpb24gc3ltYm9sLgotCSh3cml0ZV9yZWxvY3MpOiBNYWtlIHByaW50b3V0IG9mIHJlbG9jIHZhbHVlcyBkZXBlbmRlbnQgb24gZmxhZwotCURFQlVHMywgbm90IERFQlVHMi4KLQkqIGNvbmZpZy9vYmotYW91dC5oIChFTUlUX1NFQ1RJT05fU1lNQk9MUyk6IERlZmluZSBhcyAwLgotCSogY29uZmlnL29iai1lY29mZi5oIChFTUlUX1NFQ1RJT05fU1lNQk9MUyk6IERpdHRvLgotCi1UaHUgSmFuIDI3IDE2OjQzOjUxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChsZXhfdHlwZSk6IE5vIGxvbmdlciBtYWtlICd7JyBhIHZhbGlkIGNoYXJhY3RlciBmb3IKLQlzeW1ib2wgbmFtZXMuCi0KLQkqIGFzLmMgKG1haW4pOiBQcmludCBsb25nIHZhbHVlcyB1c2luZyAlbGQuCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX3dhcm5faW50ZXJuYWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhc193YXJuLCAzIHZlcnNpb25zKTogVXNlIGFzX3dhcm5faW50ZXJuYWwuCi0JKGFzX3dhcm5fd2hlcmUsIDMgdmVyc2lvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKiBhcy5oIChhc193YXJuX3doZXJlKTogRGVjbGFyZS4KLQotVHVlIEphbiAyNSAxODozMDozNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKHF1aWV0X2ZsYWcpOiBOZXcgZmxhZy4KLQkobWFpbik6IElmIC1ub3F1aWV0IGdpdmVuLCBkaXNwbGF5IGV4ZWN1dGlvbiB0aW1lIGFuZCBtZW1vcnkgdXNlZC4KLQotVHVlIEphbiAyNSAxNTo1MzoxMSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZG9jL3thbGwudGV4aSxhcy50ZXhpbmZvfTogQWRkIGRvY3VtZW50YXRpb24gZm9yIEhQUEEgcG9ydC4KLQotTW9uIEphbiAyNCAxOToxODoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2Zyb2Jfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLiAgUHV0IHVuZGVmaW5lZAotCXN5bWJvbHMgb2Yga25vd24gc2l6ZSBpbiB0aGUgdW5kZWZpbmVkIHNlY3Rpb24uICBQdXQgc21hbGwgY29tbW9uCi0Jc3ltYm9scyBpbiBhIC5zY29tbW9uIHNlY3Rpb24uCi0JKiBlY29mZi5oIChlY29mZl9mcm9iX3N5bWJvbCk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKG9ial9mcm9iX3N5bWJvbCk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfd3JpdGVfc3ltYm9sX3AsIG9ial9lbGZfd3JpdGVfc3ltYm9sLAotCW9ial9lbGZfZnJvYl9zeW1ib2wpOiBSZW1vdmVkIHVudXNlZCBmdW5jdGlvbnMuCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZnJvYl9zeW1ib2wsIG9ial93cml0ZV9zeW1ib2wpOiBSZW1vdmVkCi0JdW51c2VkIG1hY3Jvcy4KLQkob2JqX2VsZl9mcm9iX3N5bWJvbCwgb2JqX2VsZl93cml0ZV9zeW1ib2wpOiBSZW1vdmVkIGRlY2xhcmF0aW9ucwotCW9mIHVudXNlZCBmdW5jdGlvbnMuCi0JKG9ial9mcm9iX3N5bWJvbCk6IERlZmluZSBpZiBFQ09GRl9ERUJVR0dJTkcuCi0KLQkqIHRjLW1pcHMuYyAoZ19zd2l0Y2hfc2Vlbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IFNldCBnX3N3aXRjaF9zZWVuIGZvciAtRyBvcHRpb24uCi0JKHNfb3B0aW9uKTogSWYgY3JlYXRpbmcgUElDIGNvZGUsIGZvcmNlIHRoZSBHUCBzaXplIHRvIGJlIDAuICBXYXJuCi0JaWYgLUcgc3dpdGNoIHVzZWQgd2l0aCBhIG5vbi16ZXJvIHZhbHVlLgotCi0JKiBzeW1ib2xzLmMgKFNfSVNfQ09NTU9OKTogVXNlIGJmZF9pc19jb21fc2VjdGlvbiByYXRoZXIgdGhhbgotCWNvbXBhcmluZyBhZ2FpbnN0IGJmZF9jb21fc2VjdGlvbi4KLQotTW9uIEphbiAyNCAxNDoxMjoyNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBUcmVhdCBBbHBoYSBsaWtlIE1JUFMgaW4gaGFuZGxpbmcgb2YgLnNic3MKLQlzZWN0aW9uLgotCi1UaHUgSmFuIDIwIDEzOjE3OjU4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IEZvciBmbG9hdGluZyBwb2ludCBvcGVyYW5kIHdpdGggdW51c3VhbCBmcAotCWNoYXIgZnJvbSBGTFRfQ0hBUlMsIHByZXNlcnZlIHRoZSBjaGFyYWN0ZXIuICBQYXRjaCBmcm9tIExpc2EKLQlSZXBrYS4KLQotV2VkIEphbiAxOSAyMzoxNToyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBhbGwgZGF0YSBhbGxvY2F0aW9uCi0JcHNldWRvLW9wczogLmh3b3JkLCAuaW50LCAubG9uZywgLm9jdGEsIC5xdWFkLCAuc2hvcnQsIC5zaW5nbGUuCi0KLVR1ZSBKYW4gMTggMTU6NTE6NTkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2VuZGVmKTogRm9yIENfRUZDTiwgQ19CTE9DSyBhbmQKLQlDX0ZDTiBhc3N1bWUgLnZhbCBoYXMgYmVlbiBzZXQgdG8gLgotCi1UdWUgSmFuIDE4IDE2OjE5OjU4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBEaXNhYmxlIG11bHRpcGxlICRDT0RFJCBzdWJzcGFjZSBjb2RlLiAgSXQKLQljb25mdXNlcyBHREIgZm9yIHNvbWUgdW5rbm93biByZWFzb24uCi0JKiBjb2ZuaWcvb2JqLXNvbS5jOiBMaWtld2lzZS4KLQotVHVlIEphbiAxOCAxOTowNTozMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsaXRlcmFsLmMgKGFkZF90b19saXRlcmFsX3Bvb2wpOiBIYW5kbGUgZHVwbGljYXRlcyBvZiB2YWx1ZXMKLQlhbHJlYWR5IHdyaXR0ZW4gdG8gbGl0ZXJhbCBwb29sLgotCi1UdWUgSmFuIDE4IDE3OjIzOjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogVHJ5IHRvIGdldCBzeW1ib2xzCi0Jd2l0aCBleHBsaWNpdGx5IG1hcmtlZCBzdGFicyB0aHJvdWdoIEJGRDogaWYgYSBzeW1ib2wgbWFya2VkCi0JTl9VTkRGIHwgTl9FWFQgaXMgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24sIG1vdmUgaXQgdG8gdGhlCi0JdW5kZWZpbmVkIHNlY3Rpb247IG1vdmUgYSBzeW1ib2wgbWFya2VkIE5fSU5EUiBpbnRvCi0JYmZkX2luZF9zZWN0aW9uIGFuZCBzZXQgdGhlIEJTRl9JTkRJUkVDVCBmbGFnOyBzZXQgdGhlCi0JQlNGX1dBUk5JTkcgZmxhZyBmb3IgYSBzeW1ib2wgbWFrcmVkIE5fV0FSTklORy4KLQotTW9uIEphbiAxNyAxNTo0MDoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKGVjb2ZmX3NldF9ncF9wcm9sb2dfc2l6ZSk6IERlY2xhcmUuCi0JKiBlY29mZi5jIChlY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUpOiBSZXR1cm4gdHlwZSBpcyB2b2lkLgotCi1Nb24gSmFuIDE3IDAwOjE4OjU1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEV4cGxpY2l0bHkgY2hlY2sgZm9yIGNvbW1hIGJlZm9yZSAndScKLQlhbmQgJ2YnIHRlbXBsYXRlIG9wZXJhbmQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogSGFuZGxlICdOJywgJ08nLCAnbycsICcwJywgJzEnLCAndScsCi0JYW5kICcyJyBpbiBjb3ByIGFuZCBzZnUgaW5zdHJ1Y3Rpb24gdGVtcGxhdGVzLgotCi1TdW4gSmFuIDE2IDE2OjQ0OjIzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBhcy5oIChzdWJzZWdfZm9yY2VfbmV3KTogQWRkIHByb3RvdHlwZS4KLQotU2F0IEphbiAxNSAwOToyMDo1NSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogQWxsb3cgbGluZXMgbGlrZSAiIGZvb2xhYiA6Ii4KLQotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBGaXggY29tcHV0YXRpb24gb2YgbWFzay4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IEZpeCBsb29wIHRlcm1pbmF0aW9uIHRlc3QuCi0KLVRodSBKYW4gMTMgMTY6MTU6MTUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0X2dwX3Byb2xvZ19zaXplKTogTmV3IGZ1bmN0aW9uLgotCShjdXJyZW50X2ZpbGVfaWR4KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYWRkX2ZpbGUpOiBVc2UgYW5kIGluY3JlbWVudCBjdXJyZW50X2ZpbGVfaWR4IGluc3RlYWQgb2YgaW5keAotCXBhcmFtZXRlci4KLQotCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBzeW1ib2wpOiBNYWtlIGFsbCBiaXRmaWVsZHMgdW5zaWduZWQuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKGk5NjBfdmFsaWRhdGVfZml4KTogQWRkZWQgYXJndW1lbnQKLQlhZGRfc3ltYm9sUFAuICBJbmRpcmVjdCB0aHJvdWdoIGl0IHRvIGdldCAiYWRkX3N5bWJvbFAiLgotCSogY29uZmlnL3RjLWk5NjAuaCAoaTk2MF92YWxpZGF0ZV9maXgpOiBTdXBwbHkgcHJvdG90eXBlLgotCShUQ19WQUxJREFURV9GSVgpOiBQYXNzIGFkZHJlc3Mgb2YgYWRkX3N5bWJvbFAuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLW5ldGJzZCopOiBOZXcgdGFyZ2V0LCB1c2luZyB0ZS1uZXRic2QuaC4KLQkoaTM4Ni0qLW5ldGJzZDAuOCk6IE5ldyB0YXJnZXQsIGxpa2UgMzg2YnNkLgotCi0JKiBjb25maWd1cmUuaW46IFNldCBCRkRERUYgaW4gTWFrZWZpbGUgdG8gImRlZmluZSIgb3IgInVuZGVmIi4KLQkqIE1ha2VmaWxlLmluIChjb25maWcuaCk6IFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgotCURlZmluZSBvciB1bmRlZiBCRkRfQVNTRU1CTEVSIGFzIHNwZWNpZmllZCBieSAkKEJGRERFRikuCi0JKEFMTF9DRkxBR1MpOiBPbWl0ICQoQkZEREVGKS4KLQkqIGFzLmg6IEluY2x1ZGUgY29uZmlnLmguCi0JKHN0cnVjdCBzeW1ib2wpOiBBZGRlZCBmb3J3YXJkIGRlY2xhcmF0aW9uLgotCShhZGRfdG9fbGl0ZXJhbF9wb29sKTogRml4IGRlY2xhcmF0aW9uLgotCSogYXMuYzogRG9uJ3QgaW5jbHVkZSBjb25maWcuaC4KLQotCSogbGl0ZXJhbC5jIChhZGRfdG9fbGl0ZXJhbF9wb29sKTogVGFrZSBzeW1ib2wgYW5kIGFkZGVuZCBhcwotCWFyZ3VtZW50cywgaW5zdGVhZCBvZiBleHByZXNzaW9uLCBmb3Igbm93LiAgRml4IGNhbGN1bGF0aW9uIG9mCi0Jb2Zmc2V0IHRvIHJldHVybi4KLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSkgW05FRURfTElURVJBTF9QT09MXTogQWRkIGZpZWxkCi0JbGl0ZXJhbF9wb29sX3NpemUuCi0KLVRodSBKYW4gMTMgMTI6MTQ6MjEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUKLQotCSogc3Vic2Vncy5jIChzdWJzZWdfZ2V0KTogQWNjZXB0IG5ldyBhcmd1bWVudCAiZm9yY2VfbmV3Ii4gIElmCi0Jc2V0IHRoZW4gYSBuZXcgc2VnbWVudCBpcyBhbHdheXMgY3JlYXRlZC4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JKHN1YnNlZ19mb3JjZV9uZXcpOiBOZXcgZnVuY3Rpb24uICBTaW1pbGFyIHRvIHN1YnNlZ19uZXcsIGJ1dAotCWFsd2F5cyBmb3JjZSBhIG5ldyBzZWdtZW50IHRvIGJlIGNyZWF0ZWQuCi0KLQkqIGNvbmZpZy9vYmotc29tLmMgKHNvbV9mcm9iX2ZpbGUpOiBDYWxsIGFkanVzdF9jb2RlX3NlY3Rpb25zCi0JZm9yIGVhY2ggc2VjdGlvbi4KLQkoYWRqdXN0X2NvZGVfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb24uICBBZGp1c3RzIHRoZSBWTUEgZm9yIGFsbCB0aGUKLQkkQ09ERSQgc3Vic3BhY2VzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hc3NlbWJsZSk6IEFsc28gaGFuZGxlIGNyZWF0aW5nIGEgZml4dXAKLQlmb3IgdGhlIHVud2luZCBkZXNjcmlwdG9ycyBpZiBhIGZ1bmN0aW9uJ3MgbGFiZWwgZm9sbG93cyB0aGUKLQkuUFJPQyBhbmQgLkVOVFJZIGRpcmVjdGl2ZXMuCi0JKHBhX2VudHJ5KTogRG9uJ3Qgc2V0IEJTRl9GVU5DVElPTiBmb3IgdGhlIGxhYmVsIHN5bWJvbCBoZXJlOyBpdAotCWlzIGRvbmUgZWxzZXdoZXJlLiAgRG9uJ3QgY3JlYXRlIGEgZml4dXAgZm9yIHRoZSB1bndpbmQKLQlkZXNjcmlwdG9ycyBpZiB0aGUgZnVuY3Rpb24ncyBsYWJlbCBoYXMgbm90IGJlZW4gZGVmaW5lZCB5ZXQuCi0JKHBhX3Byb2MpOiBGb3IgU09NLCBwbGFjZSBlYWNoIHByb2NlZHVyZSB3aXRoaW4gYSBuZXcgJENPREUkCi0Jc3Vic3BhY2UuICBBZGp1c3QgdGhlIHNlZ21lbnQgYW5kIGZyYWcgZm9yIHRoZSBhc3NvY2lhdGVkCi0JZnVuY3Rpb24gbGFiZWwgaWYgaXQgZXhpc3RzLgotCi1XZWQgSmFuIDEyIDIyOjA1OjMzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9zdHJ1Y3QpOiBBZGQgbmV3ICJzZWdtZW50IiBmaWVsZC4KLQkoaHBwYV9maXhfbmV3KTogSW5pdGlhbGl6ZSBzZWdtZW50IGZpZWxkLgotCShtZF9hcHBseV9maXgpOiBEbyBub3RoaW5nIGZvciBwYy1yZWxhdGl2ZSBmaXh1cCB3aGljaCBpbnZvbHZlcwotCWNyb3NzaW5nIGEgc2VnbWVudCBib3VuZGFyeS4KLQkocGFfcHJvY2VuZCk6IFVuZGVmaW5lIHRoZSBjdXJyZW50IGxhYmVsIGFmdGVyIGhhbmRsaW5nIC5QUk9DCi0JYW5kIC5QUk9DRU5EIGRpcmVjdGl2ZXMuCi0JKGR1bW15X3N5bWJvbCk6IE1ha2UgdHlwZSAic3ltYm9sUyAqIi4gIENoYW5nZSByZWZlcmVuY2VzIGFzCi0JYXBwcm9wcmlhdGUuCi0KLVdlZCBKYW4gMTIgMTM6Mjk6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENhc3QgYXJyYXkgYXJndW1lbnQgdG8gdW5zaWduZWQKLQljaGFyLgotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHN5bXNlZ2luZm8uCi0JKHdyaXRlX29iamVjdF9maWxlKTogRG9uJ3QgZGVmaW5lIHB1bnRfaXQgaWYgaXQgd29uJ3QgYmUgdXNlZC4KLQkoZml4dXBfc2VnbWVudCk6IERvbid0IGRlZmluZSBza2lwIGlmIGl0IHdvbid0IGJlIHVzZWQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgYXMgbWlwc190YXJnZXRfZm9ybWF0LgotCShtaXBzX3RhcmdldF9mb3JtYXQpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc190YXJnZXRfZm9ybWF0KTogRGVmaW5lIHdpdGggYXBwcm9wcmlhdGUKLQlkZWZhdWx0IGRlZmluaXRpb24uCi0JKG1kX3BhcnNlX29wdGlvbik6IElmIC1FTCBvciAtRUIgaXMgdXNlZCwgY2hhbmdlIGJ5dGVfb3JkZXIgYW5kCi0JbWlwc190YXJnZXRfZm9ybWF0IGFzIGFwcHJvcHJpYXRlLgotCi1UdWUgSmFuIDExIDIxOjUyOjM2IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogQW5vdGhlciBhdHRlbXB0IHRvIGZpeCBidWdzCi0JZGVhbGluZyB3aXRoIGxhYmVscyB3aXRob3V0IGNvbG9ucyAoZm9yIEhQUEEgYW5kIE1SSSkuCi0KLVR1ZSBKYW4gMTEgMTc6MDE6MDYgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogVHJ1bmNhdGUgYXJncyB0byAlaGkvJWxvIHRvIDMyIGJpdHMuCi0KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCk6IEZpeCBjb21wdXRhdGlvbiBvZiB0b29fbWFueV9kaWdpdHMuCi0JVmFyaWFibGUgZGlnaXRfMiByZW5hbWVkIHRvIHN0YXJ0LiAgRml4IGNoZWNrIGZvciB3aGV0aGVyIG51bWJlcgotCXdpbGwgZml0IGluIDMyIGJpdHMuCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IFVzZSB2YWx1ZVQgaW5zdGVhZCBvZiBsb25nLgotCi1UdWUgSmFuIDExIDEzOjAxOjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYzogSWYgVENfTUlQUywgaW5jbHVkZSBlbGYvbWlwcy5oLgotCShzcGVjaWFsX3NlY3Rpb25zKTogRGVmaW5lLgotCShvYmpfZWxmX3NwZWNpYWxfc2VjdGlvbik6IEdldCBkZWZhdWx0IHR5cGVzIGFuZCBhdHRyaWJ1dGVzIGZyb20KLQlsaXN0IG9mIHNwZWNpYWwgc2VjdGlvbnMuCi0JKiBjb25maWcvdGMtbWlwcy5jIChFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IERlZmluZS4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBGb3JjZSAuc2RhdGEgYW5kIC5zYnNzCi0Jc2VjdGlvbnMgdG8gYmUgY2xvc2UgdG9nZXRoZXIuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogQ29ycmVjdGVkICRhdCB3YXJuaW5ncyBpbiBhIGNvdXBsZSBvZgotCXNwb3RzLgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfcHJldl9saW5lKTogTmV3IGZ1bmN0aW9uLgotCSogbGlzdGluZy5jOiBJbmNsdWRlIHN1YnNlZ3MuaC4KLQkobGlzdGluZ19wcmV2X2xpbmUpOiBOZXcgZnVuY3Rpb24uCi0JKGNhbGNfaGV4KTogUmVzZXQgYnl0ZV9pbl9mcmFnIHRvIHplcm8gZm9yIGVhY2ggbmV3IGZyYWcuCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IENhbGwgbGlzdGluZ19wcmV2X2xpbmUgYWZ0ZXIKLQllbWl0dGluZyBub3AgaW5zdHJ1Y3Rpb25zLgotCSogTWFrZWZpbGUuaW4gKGxpc3Rpbmcubyk6IERlcGVuZHMgdXBvbiBzdWJzZWdzLmguCi0KLU1vbiBKYW4gMTAgMDk6NTI6MjMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogUHV0IGNoZWNrIGZvciBtaXNzaW5nIGxhYmVsIG9uIC5QUk9DCi0JaGVyZS4gIEhhbmRsZSBjYXNlIHdoZXJlIGxhYmVsIG1heSBiZSBkZWZpbmVkIGFmdGVyIHRoZSAuUFJPQy4KLQkocGFfcHJvYyk6IEl0IGlzIG5vdCBhbiBlcnJvciBpZiB0aGUgcHJvY2VkdXJlJ3MgbGFiZWwgaXNuJ3QKLQlkZWZpbmVkIGJlZm9yZSB0aGUgLlBST0MgZGlyZWN0aXZlLgotCi1TdW4gSmFuICA5IDA0OjQzOjMwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGUtbmV0YnNkLmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLWkzODYuaCAoVEFSR0VUX0ZPUk1BVCkgW1RFX05ldEJTRF06IFVzZSBiZmQgdGFyZ2V0Ci0JYS5vdXQtbmV0YnNkLTM4NiBmb3IgdGhpcyBjb25maWd1cmF0aW9uLgotCi1GcmkgSmFuICA3IDE3OjM4OjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc3RhYik6IERvbid0IGNsb2JiZXIgdGhlIEVDT0ZGIHN5bWJvbCBpbmZvcm1hdGlvbgotCXdpdGggdGhlIGFzc29jaWF0ZWQgc3RhYnMgaW5mb3JtYXRpb24uCi0JKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBOZXZlciBzZXQgdGhlIHR5cGUgb2Ygc3RhYnMgc3ltYm9scyB0bwotCXN0X0dsb2JhbC4gIERvbid0IHVwZGF0ZSB0aGUgc3ltYm9sIGluZGV4IG9yIGlmZCBpZiB0aGUgZ2FzIHN5bWJvbAotCWlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgRUNPRkYgc3ltYm9sICh3aGljaCBpcyBub3cgdGhlIGNhc2UgZm9yCi0Jc3RhYnMgc3ltYm9scykuCi0KLUZyaSBKYW4gIDcgMTE6MTQ6MDcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEFkZCBhIExPU0lOR19DT01QSUxFUiBpZmRlZiB0aGF0Ci0Jc3BsaXRzIHRoZSBmdW5jdGlvbi4KLQkobWFjcm8yKTogTmV3IGZ1bmN0aW9uLCBpZiBMT1NJTkdfQ09NUElMRVIgZGVmaW5lZC4KLQotRnJpIEphbiAgNyAwOTozODoyNSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogIERvbid0IGV2ZXIgZmlsbCBwYXN0IHRoZQotCWVuZCBvZiBhIHNlY3Rpb24uICh3cml0ZV9vYmplY3RfZmlsZSk6IFRlbXBvcmFyeSBmaXggLSBzZXR1cAotCXN0ZG91dHB1dC4KLQotVGh1IEphbiAgNiAxODowNToyMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogRml4IGhhbmRsaW5nIG9mIGFkZGVuZHMgaW4KLQlub24tcGNyZWxfb2Zmc2V0IHJlbG9jYXRpb25zLgotCi1UaHUgSmFuICA2IDAxOjA2OjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IFdhcm4gYWJvdXQgdXNpbmcgJDEgYXMgd2VsbCBhcyAkYXQKLQl3aXRob3V0IC5zZXQgbm9hdC4KLQotV2VkIEphbiAgNSAxNDoyMjoyMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsaXRlcmFsLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKFJFQUxfU09VUkNFUywgT0JKUyk6IExpc3QgaXQuCi0KLQkqIGFzLmggKERFQlVHKTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgZXhwcmVzc2lvblMsIHN0cnVjdCBmaXgpOiBEZWNsYXJlIGluIGNhc2UgdGhleSdyZSB1c2VkIGluCi0JcHJvdG90eXBlcy4KLQkoYWRkX3RvX2xpdGVyYWxfcG9vbCkgW0JGRF9BU1NFTUJMRVJdOiBEZWNsYXJlLgotCi0JKiBjb25maWcvdGMtbWlwcy5oIChUQVJHRVRfRk9STUFUKSBbT0JKX0FPVVRdOiBGaXggZm9yIG5ldyBuYW1lcwotCWluIGJmZC4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfZ2V0KTogTmV3IGZ1bmN0aW9uLiAgQ3JlYXRlcyBzZWdtZW50IGlmCi0JbmVlZGVkLCByZXR1cm5zIHBvaW50ZXIsIGJ1dCBkb2Vzbid0IGNoYW5nZSBjdXJyZW50IHNlZ21lbnQuCi0JKHN1YnNlZ19uZXcpOiBVc2UgaXQuCi0KLVR1ZSBKYW4gIDQgMTU6MTI6NDMgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiBBZGQgJChzcmNkaXIpLy4uIHRvIHBsYWNlcyB0byBzZWFyY2guCi0JKiBjb25maWcvb2JqLWVjb2ZmLmM6IEluY2x1ZGUgZmlsZXMgYXMgImJmZC8iIGluc3RlYWQgb2YgIi4uL2JmZC8iLgotCSogYXBwLmMsIGZsb251bS5oLCBoZXgtdmFsdWUuYyAoY29uc3QpOiBDaGFuZ2UgI2lmIHRvIGJlIG1vcmUKLQlwb3J0YWJsZS4KLQotVHVlIEphbiAgNCAyMjoxMTozNCAxOTk0ICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9oby12c3RhLmgsIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIFZTVGEKLQltaWNyby1rZXJuZWwuCi0KLVRodSBEZWMgMzAgMTU6Mjc6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIG5vdyB0YWtlcyBhbgotCWFkZGl0aW9uYWwgYXJndW1lbnQsIHRvIHJldHVybiBhbiBlcnJvciBzdHJpbmcgKHdoaWNoIHdlIGlnbm9yZSkuCi0KLVdlZCBEZWMgMjkgMTQ6Mzc6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IEZpZWxkIHRjX2ZpeF9kYXRhIHNob3VsZCBiZSB0eXBlIFBUUiwgbm90Ci0Jdm9pZCosIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLUFOU0kgY29tcGlsZXJzLiAgQWRkZWQKLQlzaW5nbGUtYml0IGZpZWxkICJmeF9kb25lIi4KLQotU3VuIERlYyAyNiAxNDozMTo0NyAxOTkzICBUb3Jiam9ybiBHcmFubHVuZCAgKHRlZ2VAYWRkZXIuY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBDb252ZXJ0IHRvIGxvd2VyIGNhc2UuCi0JRGVsZXRlIHNwdXJpb3VzIHJlZ2lzdGVyIG5hbWVzICIlcjRMIiwgZXRjLgotCShzZWxlY3Rvcl90YWJsZSk6IFNvcnQgYW5kIGNvbnZlcnQgdG8gbG93ZXIgY2FzZS4KLQkoY29uc19maXhfbmV3X2hwcGEpOiBgcmVsb2NfdHlwZScgPT4gYHJlbF90eXBlJy4KLQkocGFfaXApOiBBbHdheXMgdXNlIHN0cmNtcCBmb3Igbm9uLXRleHQgYW5kIHN0cmNhc2VjbXAgZm9yIHRleHQuCi0JKHJlZ19uYW1lX3NlYXJjaCk6IFJld3JpdGUgdG8gY2FsbCBzdHJjYXNlY21wIG9ubHkgb25jZSBwZXIKLQlpdGVyYXRpb24uCi0JKHBhX2Noa19maWVsZF9zZWxlY3Rvcik6IFJld3JpdGUgdG8gdXNlIGJpbmFyeSBzZWFyY2guCi0JKHBhX3BhcnNlX25lZ19hZGRfY21wbHRyKTogVXNlIHN0cmNhc2VjbXAgZm9yIGNvbXBsZXRlciBjb21wYXJpc29ucy4KLQkocGFfcGFyc2Vfc3BhY2Vfc3RtdCk6ICRURVhUJCBhbmQgJFBSSVZBVEUkIGFyZSBzeW1ib2xzOyB1c2UgY2FzZQotCXNlbnNpdGl2ZSBjb21wYXJpc29ucy4KLQkocGFfcGFyc2Vfc3BhY2Vfc3RtdCk6IENhbm9uaWNhbGl6ZSBzdHJuY2FzZWNtcCBhcmcgdG8gbG93ZXIgY2FzZS4KLQkocGFfc3BhY2UpOiAiJHRleHQkIiA9PiAiJFRFWFQkIjsgIiRwcml2YXRlJCIgPT4gIiRQUklWQVRFJCIuICBVc2UKLQljYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29uIGZvciBhbGwgc3ltYm9saWMgbmFtZXMuCi0JKHBhX3N1YnNwYWNlKTogQ2Fub25pY2FsaXplIHN0cm5jYXNlY21wIGFyZyB0byBsb3dlciBjYXNlLgotCShwYV9zdWJzcGFjZV9zdGFydCk6IFVzZSBjYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29uIGZvciBzeW1ib2xpYyBuYW1lcy4KLQotTW9uIERlYyAyMCAxMDozNzo0OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcykgW1JFTE9DX1JFUVVJUkVTX1NZTUJPTF06IElmIG5vCi0Jc3ltYm9sIGlzIHByZXNlbnQgKGkuZS4sIHJlbG9jYXRpb24gYWdhaW5zdCBhYnNvbHV0ZSksIGNyZWF0ZSBhCi0JcGhvbnkgbG9jYWwgc3ltYm9sLCBhbmQgdXNlIGl0IGluIHRoZSByZWxvYy4KLQkoZml4dXBfc2VnbWVudCk6IFdoZW4gYWRqdXN0aW5nIGEgcmVsb2Mgd2l0aCBhbiBhYnNvbHV0ZSBzeW1ib2wsCi0JaGF2ZSBUQ19GT1JDRV9SRUxPQ0FUSU9OIGNvbnRyb2wgY2xlYXJpbmcgYWRkX3N5bWJvbFAgdG9vLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFJFTE9DX1JFUVVJUkVTX1NZTUJPTCk6IERlZmluZSwgZm9yIE9CSl9DT0ZGLgotCi0JKiBzeW1ib2xzLmMgKFNfSVNfRVhURVJOQUwsIFNfSVNfTE9DQUwpOiBEb24ndCB1c2UgYm90aCBCU0ZfRVhQT1JUCi0JYW5kIEJTRl9HTE9CQUwsIHNpbmNlIHRoZXkncmUgdGhlIHNhbWUuCi0KLQkqIGFzLmMgKG1haW4pOiBPbmx5IGludm9rZSBtZF9lbmQgaWYgaXQncyBkZWZpbmVkIGFzIGEgbWFjcm8uCi0JKiB0Yy5oIChtZF9lbmQpOiBEb24ndCBkZWNsYXJlIGl0LgotCSogY29uZmlnL3RjLSouW2NoXSAobWRfZW5kKTogRGVsZXRlZCwgaW4gY2FzZXMgd2hlcmUgaXQgZG9lc24ndCBkbwotCWFueXRoaW5nLgotCSogY29uZmlnL3RjLXZheC5jICh2aXBfZW5kKTogRGVsZXRlZCBudWxsIGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfbWlwc19lbmQpOiBSZW5hbWVkIGZyb20gbWRfZW5kLgotCSogY29uZmlnL3RjLW1pcHMuaCAobWRfbWlwc19lbmQpOiBEZWNsYXJlLgotCShtZF9lbmQpOiBOZXcgbWFjcm8sIGNhbGxzIG1kX21pcHNfZW5kLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERvbid0IGNsb3NlIG91dHB1dCBmaWxlLgotCSogYXMuYyAobWFpbik6IENsb3NlIG91dHB1dCBmaWxlIChpZiBuZWVkZWQpIGFmdGVyIGNhbGxpbmcKLQlsaXN0aW5nX3ByaW50LCB3aGljaCBzaG91bGQgYmUgYWZ0ZXIgY2FsbGluZyB3cml0ZV9vYmplY3RfZmlsZSwKLQl3aGljaCBzZXRzIHRoZSBmcmFnIGFkZHJlc3Nlcy4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2RpbSwgb2JqX2NvZmZfZW5kZWYsIG9ial9jb2ZmX2xpbmUsCi0Jb2JqX2NvZmZfc2NsLCBvYmpfY29mZl9zaXplLCBvYmpfY29mZl90YWcsIG9ial9jb2ZmX3R5cGUsCi0Jb2JqX2NvZmZfdmFsKTogQWRkIHVudXNlZCBpbnQgYXJndW1lbnQgdG8gc2F0aXNmeSBwcm90b3R5cGVzOyBnb2VzCi0Jd2l0aCBJYW4ncyAxMCBTZXAgY2hhbmdlcy4KLQkoU19HRVRfREFUQV9UWVBFLCBTX1NFVF9EQVRBX1RZUEUsIFNfR0VUX1NUT1JBR0VfQ0xBU1MsCi0JU19TRVRfU1RPUkFHRV9DTEFTUyk6IE5vdyBmdW5jdGlvbiBpbnN0ZWFkIG9mIG1hY3Jvcy4KLQkob2JqX2VtaXRfbGluZW5vKSBbQkZEX0FTU0VNQkxFUl06IERlbGV0ZWQuCi0JKHRhZ19pbnNlcnQpOiBMb2NhbCB2YXIgRVJST1JfU1RSSU5HIGlzIGNvbnN0LiAgVXNlICJjb25zdCIgbm90Ci0JIkNPTlNUIiBmb3IgYXJndW1lbnQgTkFNRS4gIEZpeGVkIHByb3RvdHlwZS4KLQkoY29mZl9mcm9iX3N5bWJvbCk6IFJlbW92ZWQgZXhwbGljaXQgIiNpZiAxIiBkaXJlY3RpdmUuICBJZgotCVNfSVNfRVhURVJOQUwsIHNldCBzdG9yYWdlIGNsYXNzIHRvIENfRVhULgotCShzX2dldF9uYW1lKTogVXNlICJjb25zdCIgbm90ICJDT05TVCIuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU19HRVRfREFUQV9UWVBFLCBTX1NFVF9EQVRBX1RZUEUsCi0JU19HRVRfU1RPUkFHRV9DTEFTUywgU19TRVRfU1RPUkFHRV9DTEFTUyk6IERlbGV0ZWQuCi0JKG9ial9lbWl0X2xpbmVubyk6IERlY2xhcmUgb25seSBmb3Igbm9uLUJGRF9BU1NFTUJMRVIuICBGb3IKLQlCRkRfQVNTRU1CTEVSLCBkZWZpbmUgYXMgbWFjcm8gdGhhdCBhYm9ydHMuCi0JKG9ial9leHRyYV9zdHVmZiwgdGNfaGVhZGVyc19ob29rKTogRGVjbGFyZSBvbmx5IGZvcgotCW5vbi1CRkRfQVNTRU1CTEVSLgotCShjb2ZmX2Zyb2Jfc3ltYm9sKTogRml4IHByb3RvdHlwZS4KLQotU3VuIERlYyAxOSAwMDozNzoyMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBUZXN0IG9mIHBjcmVsX29mZnNldCBoYWQgc2Vuc2UKLQlyZXZlcnNlZC4KLQotVGh1IERlYyAxNiAyMToxMzoxMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYmVnaW4pOiBJbml0aWFsaXplICJkdW1teV9sYWJlbCIuCi0JKHRjX2dlbl9yZWxvYywgU09NIHZlcnNpb24pOiBGb3IgcmVsb2NhdGlvbnMgd2hpY2ggaGF2ZSBubyBzeW1ib2wsCi0Jc2V0IHN5bV9wdHJfcHRyIHRvIGR1bW15X2xhYmVsLiAgQXZvaWRzIGxvc3NhZ2UgaW4gZ2VuZXJpYyBCRkQgY29kZS4KLQotVGh1IERlYyAxNiAxNjowNzo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGxleF90eXBlKTogTm8gbG9uZ2VyIG1ha2UgJ1snIGEgdmFsaWQgY2hhcmFjdGVyIGZvcgotCXN5bWJvbCBuYW1lcy4KLQotCSogY29uZmlnL3RjLXZheC5jICh0Y19hb3V0X2ZpeF90b19jaGFycyk6IExvY2FsIHZhcmlhYmxlCi0JTkJZVEVTX1JfTEVOR1RIIG5vdyBjb25zdC4KLQotCSogY29uZmlnL29iai0qLmMsIGNvbmZpZy90Yy0qLmM6IE9taXQgc3VwZXJmbHVvdXMgInJldHVybiIKLQlzdGF0ZW1lbnRzIGF0IGVuZHMgb2YgZnVuY3Rpb25zLiAgRG9uJ3QgY2hlY2sgZm9yIG51bGwgcmV0dXJuIGZyb20KLQloYXNoX25ldywgc2luY2UgaXQgd29uJ3QgcmV0dXJuIGF0IGFsbCBpZiB0aGVyZSdzIG5vIG1lbW9yeQotCWF2YWlsYWJsZS4gIEFsc28sIGNoZWNrIGZvciBudWxsIHJldHVybiBmcm9tIGhhc2hfaW5zZXJ0LCByYXRoZXIKLQl0aGFuIHplcm8tbGVuZ3RoIHN0cmluZywgYXMgc3VjY2VzcyBpbmRpY2F0b3IuCi0KLQkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKiBzdWJzZWdzLmggKHNlY3Rpb25fc3ltYm9sKTogRGVjbGFyZS4KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogVXNlIGl0LgotCi1XZWQgRGVjIDE1IDE1OjM5OjUzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChSVU5URVNUKTogTmV3IHZhcmlhYmxlLgotCShDSEVDS0ZMQUdTKTogUGFzcyBpdCBkb3duLgotCi0JKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfZnJhbWUpOiBQZXJtaXQgZXh0cmEgdHJhaWxpbmcgb3BlcmFuZHM7Ci0JdW51c2VkIGZvciBub3csIGJ1dCBzdXBwbGllZCBieSBBbHBoYSBPU0YxIGNvbXBpbGVyLgotCi0JKiBhcy5oOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KLQkoaW50X3RvX2dlbik6IERvbid0IGRlY2xhcmUuCi0KLQkqIGNvbmZpZy9hdG9mLXZheC5jIChhdG9mX3ZheCk6IE5VTEwgaXMgbm90IGEgdmFsaWQgY2hhcmFjdGVyCi0JY29uc3RhbnQuCi0KLVR1ZSBEZWMgMTQgMjE6Mzg6MjUgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1vc2YqKTogRG8gbm90IGNvbnNpZGVyIHRoaXMgYSBkZXZlbG9wbWVudGFsCi0JY29uZmlndXJhdGlvbi4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogSGFuZGxlIGNhc2VzIHdoZXJlIG5vCi0JcmVsb2NhdGlvbiB3aWxsIGJlIGVtaXR0ZWQgZm9yIDMyYml0IGZvcm1hdHMuCi0KLU1vbiBEZWMgMTMgMjM6MzM6NDAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IERvIG5vdCBjYWxsIGhwcGFfZmllbGRfYWRqdXN0Ci0JZm9yIGFueSBvZiB0aGUgJ1QnIGZpZWxkIHNlbGVjdG9ycy4KLQotU2F0IERlYyAxMSAxMToyMzoxMiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4NTAwLmMgKGJ1aWxkX2J5dGVzKTogR2V0IHJlbG9jIHR5cGUgcmlnaHQgZm9yIGEKLQklcGFnZSBvcGVyYXRpb24uIChtZF9hc3NlbWJsZSk6IERvbid0IG1vZGlmeSBpbnB1dF9saW5lX3BvaW50ZXIuCi0JKG1kY29mZl9zaXplbWFjaGRlcCk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1oODUwMC5oIChUQ19DT0ZGX1NJWkVNQUNIREVQKTogTmV3IG1hY3JvLgotCSogY29uZmlnL3RjLXo4ay5jIChnZXRfb3BlcmFuZCk6IERlbGV0ZSBib2d1cyBjaGVjay4KLQotV2VkIERlYyAgOCAxNjozMTo1MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKG51bWJlcl90b19jaGFyc18qKTogRGVsZXRlIGJvZ3VzIHJhbmdlIGNoZWNrLgotCi0JKiBvdXRwdXQtZmlsZS5jIChUQVJHRVRfQVJDSCk6IE5vIGRlZmF1bHQuCi0KLVR1ZSBEZWMgIDcgMTY6MDI6NTMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2NvbnZlcnRfZnJhZyk6IFRydW5jYXRlIGRpc3BzIGJlZm9yZSBjYWxsaW5nCi0JbWRfbnVtYmVyX3RvX2NoYXJzLiAgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgbW9kaWZ5Ci0JaW5wdXRfbGluZV9wb2ludGVyLgotCi1Nb24gRGVjICA2IDExOjQ5OjAzIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChtZF9hc3NlbWJsZSk6IERvbid0IHVwZGF0ZSBpbnB1dF9saW5lX3BvaW50ZXIuCi0KLU1vbiBEZWMgIDYgMTE6MjA6MDIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotc29tLltjaF0gKG9ial9yZWFkX2JlZ2luX2hvb2spOiBSZW1vdmUgbGFzdCBjaGFuZ2UuCi0JQnJlYWtzIHdpdGggdGhlIEhQIGNvbXBpbGVycy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoc3RydWN0IGNhbGxfaW5mbyk6IFJlbW92ZSBmaWVsZHMgd2hpY2ggd2VyZQotCXNldCBidXQgbmV2ZXIgdXNlZC4gIFJlbW92ZSBhbGwgY29kZSB3aGljaCBzZXRzIHRob3NlIGZpZWxkcy4KLQkoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4pOiBMaWtld2lzZS4KLQkoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfY2hhaW4pOiBMaWtld2lzZS4KLQkocGFfZGVzYyk6IERlbGV0ZSB1c2VsZXNzIGZ1bmN0aW9uLiAgRGVsZXRlIGFsbCByZWZlcmVuY2VzLgotCShocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBObyBuZWVkIHRvIGNvdW50IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBmb3IKLQl0aGUgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uLgotCi1TdW4gRGVjICA1IDE3OjA1OjI5IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX3ZlcnNpb24pOiBQYXNzIHZlcnNpb24gc3RyaW5nIHRvCi0JU09NIEJGRCBiYWNrZW5kLgotCShvYmpfc29tX2NvcHlyaWdodCk6IE5ldyBmdW5jdGlvbi4gIE11Y2ggbGlrZSBvYmpfc29tX3ZlcnNpb24uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG9ial9jb3B5cmlnaHQpOiBEZWZpbmUgYXMgYXBwcm9wcmlhdGUgZm9yCi0JU09NIGFuZCBFTEYuCi0JKHBhX2NvcHlyaWdodCk6IEp1c3QgYSBzdHViIG5vdy4KLQotCSogY29uZmlnL29iai1zb20uYyAob2JqX3JlYWRfYmVnaW5faG9vayk6IERlbGV0ZSB1bnVzZWQgZnVuY3Rpb24uCi0JKiBjb25maWcvb2JqLXNvbS5oIChvYmpfcmVhZF9iZWdpbl9ob29rKTogUHJvdmlkZSBkdW1teSBkZWZpbml0aW9uLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IERlbGV0ZS4gIFNPTSBpc24ndCBtYWtpbmcgdXNlIG9mIHRoZW0uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYywgU09NIHZlcnNpb24pOiBIYW5kbGUgcmVsb2NhdGlvbgotCWV4cGFuc2lvbiBkdWUgdG8gcm91bmRpbmcgbW9kZSBzZWxlY3RvcnMuICBIYW5kbGUgUl9bUkRTTl1fTU9ERQotCXJlbG9jYXRpb25zIGZvciBzZWxlY3RpbmcgdGhlIGN1cnJlbnQgcm91bmRpbmcgbW9kZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoZXZhbHVhdGVfYWJzb2x1dGUpOiBTdXBwb3J0IGVfcnJzZWwgYW5kCi0JZV9ybHNlbCBmaWVsZCBzZWxlY3RvcnMuCi0KLUZyaSBEZWMgIDMgMTg6MzM6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5oOiBJZiBFQ09GRl9ERUJVR0dJTkcsIHVuZGVmCi0JU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyBhbmQgSU5JVF9TVEFCX1NFQ1RJT04sIGFuZCBkZWZpbmUKLQlPQkpfUFJPQ0VTU19TVEFCIHRvIGNhbGwgZWNvZmZfc3RhYi4KLQkqIGNvbmZpZy9vYmotZWxmLmM6IERvbid0IGNvbXBpbGUgb2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbiBpZgotCUlOSVRfU1RBQl9TRUNUSU9OIGlzIG5vdCBkZWZpbmVkLgotCi1GcmkgRGVjICAzIDEwOjU2OjQwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBEZWxldGUgb2xkIHdyYXBwZXIgZnVuY3Rpb24uCi0JKG1kX2FwcGx5X2ZpeF8xKTogUmVuYW1lIHRvIG1kX2FwcGx5X2ZpeC4gIEZpeCBhcmd1bWVudCBkZWNscy4KLQlGaXggY29tbWVudHMgaW4gdmFyaW91cyBwbGFjZXMuICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0JQXZvaWQgZGVyZWZlcmVuY2luZyBhIE5VTEwgZnhfYWRkc3kuCi0JKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IEF2b2lkIGRlcmVmZXJlbmNpbmcgYSBOVUxMIGZ4X2FkZHN5LgotCi0JRnJpIERlYyAgMyAwOTo0NzozMCAxOTkzICBQZXRlIEhvb2dlbmJvb20gIChob29nZW5AY3MudXRhaC5lZHUpCi0KLQkqIHRjLWhwcGEuYzogKHRjX2dlbl9yZWxvYyk6IEFkZGVuZCBmb3IgYSBwbGFiZWwgcmVsb2NhdGlvbiBzaG91bGQKLQliZSBlaXRoZXIgMCBvciAyIChubyBzdGF0aWMgbGluayBvciBzdGF0aWMgbGluayByZXF1aXJlZCkuICBBbHdheXMKLQlhc3N1bWUgbm8gc3RhdGljIGxpbmsuCi0KLVRodSBEZWMgIDIgMTE6NTI6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBNYWtlIGFkanVzdG1lbnQgdG8gYWRkZW5kIGJlCi0JZGVwZW5kZW50IG9uIGhvd3RvIGZpZWxkcywgbm90IG9uIGZvcm1hdCBmbGF2b3VyLgotCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoc3RydWN0IHN5bWJvbCk6IE5ldyBmaWVsZHMgc3lfb2JqIGFuZCBzeV90YywKLQlkZWZpbmVkIGFzIHR5cGVzIE9CSl9TWU1GSUVMRF9UWVBFIGFuZCBUQ19TWU1GSUVMRF9UWVBFLCBpZiB0aG9zZQotCW1hY3JvcyBhcmUgZGVmaW5lZC4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChUQ19TWU1GSUVMRF9UWVBFLCBPQkpfU1lNRklFTERfVFlQRSk6IERlZmluZS4KLQkoVEFSR0VUX1NZTUJPTF9GSUVMRFMsIEk5NjBfU1lNX0ZJRUxEUyk6IERvbid0IGRlZmluZS4KLQkoc3lfdGMsIHN5X29iaik6IERlZmluZSBzbyB0aGF0IHRoZSBmaWVsZHMgbG9vayBsaWtlIHRoZXkgdXNlZCB0bywKLQl1bnRpbCBhbGwgcmVmZXJlbmNlcyBnZXQgY2hhbmdlZC4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IExvdHMgb2YgdmFyaWFibGVzIG5vIGxvbmdlciByZWdpc3Rlci4KLQlSZW9yZGVyZWQgc29tZSBjb2RlIGZvciBlYXNpZXIgcmVhZGluZy4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9kaW0pOiBkaW1faW5kZXggbm8gbG9uZ2VyIHJlZ2lzdGVyLgotCURlbGV0ZWQgc3VwZXJmbHVvdXMgcmV0dXJuIHN0YXRlbWVudC4KLQkob2JqX2NvZmZfbGluZSwgb2JqX2NvZmZfc2l6ZSwgb2JqX2NvZmZfc2NsLCBvYmpfY29mZl90eXBlLAotCW9ial9jb2ZmX3ZhbCwgdGFnX2luaXQsIHRhZ19pbnNlcnQpOiBEZWxldGVkIHN1cGVyZmx1b3VzIHJldHVybgotCXN0YXRlbWVudC4KLQkoYWxpZ24sIG9ial9jb2ZmX3NlY3Rpb24pOiBEZWxldGVkIGRlYnVnZ2luZyBwcmludGZzLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBEaXNjYXJkIHNvbWUgcmVnaXN0ZXIgZGVjbHMuCi0JVXNlIGFzc2lnbm1lbnQgcmF0aGVyIHRoYW4gbWVtY3B5IHRvIGNvcHkgdGVtcGxhdGUuCi0JKG9wX2hhc2gsIHJlZ19oYXNoLCBwcmVmaXhfaGFzaCk6IERlZmF1bHQgQyBpbml0aWFsaXphdGlvbiBvZgotCXN0YXRpY3MgaXMgc3VmZmljaWVudC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChwcmludF9pbnNuKTogQXJyYXkgUmVsb2MgaXMgbm93IGNvbnN0LCBhbmQKLQlwb2ludHMgdG8gY29uc3QuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChUQVJHRVRfRk9STUFUKTogT25seSB1c2UgY29mZi1zcGFyYy1seW54IGlmCi0JVEVfTFlOWDsgdXNlIGNvZmYtc3BhcmMgb3RoZXJ3aXNlLgotCVtVU0VfTkFUSVZFX0hFQURFUlNdOiBEZWxldGUgdGhpcyBjb2RlOyBpdCBpc24ndCB1c2VkLgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogQ2FsbCBUQ19WQUxJREFURV9GSVgsIGlmIGRlZmluZWQsCi0JYmVmb3JlIHByb2Nlc3NpbmcgYSBmaXh1cC4gIENhbGwgVENfQURKVVNUX1JFTE9DX0NPVU5UIGp1c3QgYmVmb3JlCi0JcmV0dXJuaW5nLiAgUmVtb3ZlIHNvbWUgaTk2MC1jb2ZmLXNwZWNpZmljIGNvZGUuCi0JKFRDX0FESlVTVF9SRUxPQ19DT1VOVCk6IERlZmF1bHQgdG8gZG9pbmcgbm90aGluZy4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKFRDX0FESlVTVF9SRUxPQ19DT1VOVCkgW09CSl9DT0ZGXTogRGVmaW5lLgotCShpOTYwX3ZhbGlkYXRlX2ZpeCk6IERlY2xhcmUuCi0JKFRDX1ZBTElEQVRFX0ZJWCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKGk5NjBfdmFsaWRhdGVfZml4KTogTmV3IGZ1bmN0aW9uLgotCi0JKiB3cml0ZS5jIChudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuKTogTmV3IGZ1bmN0aW9uLiAgV3JpdGUgb3V0Ci0JYnl0ZXMgaW4gbGl0dGxlIGVuZGlhbiBvcmRlciwgZG9pbmcgc2l6ZSBhbmQgcmFuZ2UgY2hlY2tpbmcuCi0JKG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4pOiBOZXcgZnVuY3Rpb24sIHNpbWlsYXIuCi0JKiB3cml0ZS5oOiBEZWNsYXJlIHRoZW0uCi0JKiBjb25maWcvdGMtKi5jIChtZF9udW1iZXJfdG9fY2hhcnMpOiBVc2UgdGhlbS4KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfYXBwbHlfZml4KTogRGl0dG8uCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgpOiBEaXR0by4KLQotCSogY29uZmlnL29iai1jb2ZmLmM6IFJlYXJyYW5nZWQgY29kZSBmb3IgaGFuZGxpbmcgbGluZSBudW1iZXIKLQlkYXRhLgotCShsaW5lX2ZzeW0pOiBSZW5hbWVkIGZyb20gZnVuY3Rpb25fbGluZW9mZiBpbiBCRkRfQVNTRU1CTEVSIGNhc2UsCi0Jc2luY2UgdGhlIHVzYWdlIGlzIGRpZmZlcmVudCBmcm9tIG5vbi1CRkRfQVNTRU1CTEVSIGNhc2UuCi0JKGluX2Z1bmN0aW9uLCBjbGVhcl9mdW5jdGlvbiwgc2V0X2Z1bmN0aW9uKTogTmV3IG1hY3JvcywgdG8KLQljb21iaW5lIHNvbWUgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgaW1wbGVtZW50ZWQgaW4gZGlmZmVybmV0IHdheXMgaW4KLQlCRkRfQVNTRU1CTEVSIGFuZCBub24tLi4uIGNvZGUuICBVc2VkIGluIG90aGVyIGZ1bmN0aW9ucyB0aGF0IHVzZWQKLQl0byBjaGVjayBmdW5jdGlvbl9saW5lb2ZmICZjLgotCShvYmpfZW1pdF9saW5lbm8pOiBTcGxpdCBpbnRvIHR3byBjb3BpZXMsIG9uZSBmb3IgQkZEX0FTU0VNQkxFUiwKLQlvbmUgZm9yIG5vdC4gIE5vbi1CRkRfQVNTRU1CTEVSIHZlcnNpb24gbm93IGhhcyB0ZW1wb3JhcnkgdmFyaWFibGUKLQl0byBjb250YWluIGNoYXIqIHBvaW50ZXIgcG9pbnRlZCB0byBieSBjaGFyKiogYXJndW1lbnQuICBBbHdheXMKLQlmb2xsb3cgQ1JPU1NfQ09NUElMRSBjb2RlOyBlYXNpZXIgdG8gcmVhZCB0aGF0IHdheS4KLQkob2JqX2NvZmZfbG4pOiBEb24ndCBjYWxsIGFkZF9saW5lbm8gb3IgY19saW5lX25ldyBpZiBhcHBsaW5lIGlzCi0Jc2V0LgotCShvYmpfY29mZl9lbmRlZikgW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBkbyBhbnl0aGluZyBzcGVjaWFsIGZvcgotCSIuYmYiLCBpdCdzIGJlZW4gZG9uZSBlbHNld2hlcmUuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBJZiBpbG5lIG51bWJlciBkYXRhIGlzIHBlbmRpbmcsIGNhbGwKLQlhZGRfbGluZXN5bSB0byBmbHVzaCBpdC4KLQkoY29mZl9mcm9iX2ZpbGUpOiBEb24ndCBkbyB0aGF0IGhlcmUuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZl9mcm9iX2ZpbGUpOiBEZWNsYXJlLgotCShvYmpfZnJvYl9maWxlKTogRGVmaW5lLCB0byBjYWxsIGl0LgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAobWRfY3JlYXRlX3Nob3J0X2p1bXAsIG1kX2NyZWF0ZV9sb25nX2p1bXAsCi0JbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXg6IERlZmluZSB0aGVtIGFzIG1hY3JvcyBjYWxsaW5nCi0JYXNfZmF0YWwuCi0JKiBjb25maWcvdGMtc3BhcmMuYzogRG9uJ3QgZGVmaW5lIHRoZW0gYXMgZnVuY3Rpb25zLgotCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSB0YXJnZXQgYWxwaGEtKi1vc2YqLiAgKE5vIGNwdSBmaWxlcyB5ZXQuKQotCi1XZWQgRGVjICAxIDIzOjM3OjE0IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZSAoY2xlYW4pOiBEZXBlbmQgb24gY2xlYW4taGVyZS4KLQotV2VkIERlYyAgMSAxMTozNToyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tZ28zMi5oOiBJbmNsdWRlIGZvcGVuLWJpbi5oLgotCSogYXMuaDogSWYgRk9QRU5fV0IgaXNuJ3QgZGVmaW5lZCwgaW5jbHVkZSBmb3Blbi1zYW1lLmguCi0JKiBvdXRwdXQtZmlsZS5jIChvdXRwdXRfZmlsZV9jcmVhdGUpOiBVc2UgRk9QRU5fV0IgaW5zdGVhZCBvZiAidyIuCi0JKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfb3Blbik6IFVzZSBGT1BFTl9SVCBpbnN0ZWFkIG9mICJyIi4KLQkqIGxpc3RpbmcuYyAoZmlsZV9pbmZvKTogVXNlIEZPUEVOX1JCIGluc3RlYWQgb2YgInJiIi4KLQkqIHJlYWQuYyAoc19pbmNsdWRlKTogVXNlIEZPUEVOX1JUIGluc3RlYWQgb2YgInIiLgotCi0JKiBzdGFicy5jOiBJbmNsdWRlIG9ic3RhY2suaC4KLQotCSogdGMuaCAobWRfY3JlYXRlX2xvbmdfanVtcCk6IERvbid0IGRlY2xhcmUgaWYgaXQncyBhbHJlYWR5Ci0JZGVmaW5lZCBhcyBhIG1hY3JvLgotCShtZF9jcmVhdGVfc2hvcnRfanVtcCwgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBEaXR0by4KLQotCSogbWVzc2FnZXMuYyAoYXNfcGVycm9yKSBbQkZEX0FTU0VNQkxFUl06IFVzZSBiZmRfZXJybXNnIGluc3RlYWQKLQlvZiBzdHJlcnJvci4gIENsZWFyIGJmZF9lcnJvci4KLQotCSogY29uZmlnL3RlLWx5bnguaCAoTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lLCBpZiBub3QgYWxyZWFkeQotCWRlZmluZWQuCi0KLVdlZCBEZWMgIDEgMTA6NDE6NTYgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZWxmX21hcmtfZW5kX29mX2Z1bmN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShwYV9wcm9jZXNzX2V4aXQsIHBhX3Byb2NlbmQpOiBDYWxsIGl0IGZvciBFTEYgb2JqZWN0cy4KLQotV2VkIERlYyAgMSAxMjoxMDo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogU3VidHJhY3QgOCBmcm9tIG9mZnNldCBpbiBub24gUElDIGwuZAotCWNhc2UuICBTZWUgY29tbWVudC4gIEZyb20gd2lsc29uQGN5Z251cy5jb206IGZvciBNX0xfREFCLCBzZXQKLQljb3Byb2MgYmVmb3JlIGRvaW5nIGdvdG8gbGQuCi0KLVR1ZSBOb3YgMzAgMTM6NDA6MzAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHdyaXRlLmMgKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBQcm92aWRlIGEgZGVmYXVsdCBkZWZpbml0aW9uLgotCShmaXh1cF9zZWdtZW50KTogQWxsb3cgdGhlIHRhcmdldCBtYWNoaW5lIHRvIHNwZWNpZnkgdGhhdCBhCi0JcmVsb2NhdGlvbiBtdXN0IGJlIGdlbmVyYXRlZCBmb3IgYSBwYXJ0aWN1bGFyIGZpeHVwLiAgUmVtb3ZlCi0JI2lmbmRlZiBUQ19IUFBBIGhhY2suCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeF8xKTogTmV2ZXIgY2hhbmdlIGZ4X2FkZHN5IHRvCi0JYmUgTlVMTC4gIE9ubHkgZml4dXBfc2VnbWVudCBpcyBzdXBwb3NlZCB0byBkbyB0aGF0LgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcgZnVuY3Rpb24uCi0KLVR1ZSBOb3YgMzAgMTE6MjE6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc3RhYnMubyk6IEFkZGVkIGRlcGVuZGVuY2llcy4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBEb24ndCBjYWxsIGJmZF9zZXRfc3ltdGFiLgotCi1TdW4gTm92IDI4IDEyOjExOjQwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogT3V0cHV0IGEgVEFCIGJlZm9yZSBhbnkKLQkuYXBwKiBkaXJlY3RpdmUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGZpeF9uZXdfaHBwYSk6IE1ha2Ugc3VyZSBhIHN1Yl9zeW1ib2wKLQlleGlzdHMgYmVmb3JlIHRyeWluZyB0byBwZWVrIGF0IGl0cyBuYW1lLgotCShwYV9zcGFjZSk6IERvIG5vdCBjYWxsIHBhX2FsaWduX3N1YnNlZy4gIFNlZSBocHBhL3Vuc29ydGVkL2FsaWduMy5zCi0JZm9yIHRlc3RjYXNlLgotCShwYV9hbGlnbl9zdWJzZWcpOiBEZWxldGUgdW51c2VkL3Vud2FudGVkIGZ1bmN0aW9uLgotCi1TYXQgTm92IDI3IDIyOjQ5OjA3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEZpeCB0ZXN0IGZvciB3aGVuIHRvIHN0aWNrIGEgY29sb24KLQlvbiB0aGUgZW5kIG9mIGEgbGFiZWwuICBNYWtlIGNvZGUgY29uZGl0aW9uYWwgb24gZWl0aGVyIE1SSSBvcgotCUxBQkVMU19XSVRIT1VUX0NPTE9OUy4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IElmIGEgbGluZSBiZWdpbnMgd2l0aCB3aGl0ZXNwYWNlLCBsZWF2ZQotCXRoZSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgYWxvbmUuICBFYXQgYWxsIG90aGVycy4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAoTEFCRUxTX1dJVEhPVVRfQ09MT05TKTogRGVmaW5lLgotCi1XZWQgTm92IDI0IDAxOjIyOjU0IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wcm9jZW5kKTogRG8gbm90IGNhbGwgcHJvY2Vzc19leGl0LgotCShleGl0X3Byb2Nlc3NpbmdfY29tcGxldGUpOiBEZWxldGUgdW53YW50ZWQgdmFyaWFibGUgYW5kIGFsbAotCXJlZmVyZW5jZXMuCi0KLVdlZCBOb3YgMjQgMDI6MzE6MzggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9zZXR1cF9leHQpOiBSZW5hbWVkIGZyb20gZWNvZmZfYnVpbGRfZXh0LgotCUNoYW5nZWQgdG8gbm90IGFjdHVhbGx5IGJ1aWxkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24sIGFzCi0JdGhhdCBpcyBub3cgZG9uZSBieSB0aGUgRUNPRkYgYmFjayBlbmQuCi0JKGVjb2ZmX2J1aWxkX2RlYnVnKTogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQkqIGVjb2ZmLmggKG9ial9lY29mZl9zZXRfZXh0KTogRGVjbGFyZS4gICBvYmotZm9ybWF0LmMgZnVuY3Rpb24KLQljYWxsZWQgYnkgZWNvZmZfc2V0dXBfZXh0LgotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBJZiBkZWJ1Z19pbmZvIGNvdW50IGlzIDAsCi0Jc2V0IGNvcnJlc3BvbmRpbmcgcG9pbnRlciB0byBOVUxMLiAgRG9uJ3Qgc2V0IHJhd19zaXplIGFuZAotCXJhd19zeW1lbnRzLgotCShvYmpfZWNvZmZfc2V0X3N5bV9pbmRleCk6IFJlbW92ZWQuCi0JKG9ial9lY29mZl9zZXRfZXh0KTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1lY29mZi5oIChvYmpfc2V0X3N5bV9pbmRleCk6IERvbid0IGRlZmluZS4KLQkob2JqX2Vjb2ZmX3NldF9zeW1faW5kZXgpOiBEb24ndCBkZWNsYXJlLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2Vjb2ZmX3NldF9leHQsIGVsZl9nZXRfZXh0ciwKLQllbGZfc2V0X2luZGV4KTogTmV3IGZ1bmN0aW9ucyB1c2VkIGZvciBFQ09GRl9ERUJVR0dJTkcuCi0JKGVsZl9mcm9iX2ZpbGUpOiBSZXdvcmtlZCBFQ09GRiBkZWJ1ZyBnZW5lcmF0aW9uIHRvIHVzZQotCW5ldyBmdW5jdGlvbnMgaW4gYmZkL2Vjb2ZmbGluay5jLgotCi1TdW4gTm92IDIxIDIzOjU0OjUyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9kZWZfc3Vic3BhY2VzKTogT25seSBjcmVhdGUgdGhlIHVud2luZAotCXN1YnNwYWNlIGZvciBFTEYuICBJbiB0aGUgU09NIHdvcmxkLCB0aGUgbGlua2VyIGlzIHJlc3BvbnNpYmxlCi0JZm9yIGNyZWF0aW5nIHRoZSB1bndpbmQgc3Vic3BhY2VzLgotCi1GcmkgTm92IDE5IDE2OjI1OjA5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IFVzZSBQQVJBTVMgcmF0aGVyIHRoYW4gRVhGVU4uCi0JKHlhbmtfc3ltYm9scyk6IERvbid0IGNhbGwgU19TRVRfRVhURVJOQUwgaWYgdGhlIHN0b3JhZ2UgY2xhc3MgaXMKLQlhbHJlYWR5IHNldC4gIEZpeGVzIC5kZWYgdmFyOyAudmFsIGV4dGVybmFsX3ZhcjsgLnNjbCAzOyAuZW5kZWYuCi0JKGFkanVzdF9zdGFiX3NlY3Rpb24pOiBNYWtlIHN0YXRpYy4gIERlY2xhcmUgcmV0dXJuIHR5cGUuICBSZW1vdmUKLQl1bnVzZWQgdmFyaWFibGVzLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oOiBEZWNsYXJlIHRjX2NvZmZfZml4MnJ0eXBlIGFuZAotCXRjX2NvZmZfc2l6ZW1hY2hkZXAuCi0KLUZyaSBOb3YgMTkgMDQ6MzM6NTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERpc2FibGUgb2JqX2NoZWNrX2ZpbGVfc3ltYm9scwotCWhvb2s7IG9ubHkgYmFjayBlbmQgdXNpbmcgaXQgd2Fzbid0IHVzaW5nIGl0IGNvcnJlY3RseS4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBBbHdheXMgY2FsbCBvYmpfZnJvYl9zeW1ib2wgYW5kCi0JdGNfZnJvYl9zeW1ib2w7IGFsd2F5cyByZXRhaW4gc3ltYm9sIGlmIGl0J3MgdXNlZCBieSBhIHJlbG9jYXRpb24sCi0JcmVnYXJkbGVzcyBvZiB3aGF0IHRoZXNlIHJvdXRpbmVzIGluZGljYXRlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBSZW5hbWVkIGZyb20KLQljb2ZmX2NoZWNrX2ZpbGVfc3ltYm9scy4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChvYmpfY2hlY2tfZmlsZV9zeW1ib2xzKTogRGVsZXRlZC4KLQkoY29mZl9mcm9iX3N5bWJvbCk6IERlY2xhcmUuCi0JKG9ial9mcm9iX3N5bWJvbCk6IENhbGwgaXQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY3Jhd2xfc3ltYm9sX2NoYWluLCBvYmpfZW1pdF9zdHJpbmdzLAotCW9ial9wcmVfd3JpdGVfaG9vayk6IERvbid0IGRlZmluZSBmb3IgQkZEX0FTU0VNQkxFUi4KLQkoY19zZWN0aW9uX2hlYWRlcik6IERpdHRvLiAgRGVsZXRlIHN1cGVyZmx1b3VzIHJldHVybiBhdCBlbmQgb2YKLQlmdW5jdGlvbi4KLQotCSogY29uZmlnL29iai1jb2ZmLmggW1RDX1NQQVJDXTogSW5jbHVkZSBjb2ZmL3NwYXJjLmgsIGFuZCBzcGVjaWZ5Ci0JY29mZi1zcGFyYy1seW54LgotCShTQV9HRVRfU1lNX1RBR05EWCk6IFVzZSBCRkRfSEVBREVSUyB2ZXJzaW9uIGZvciBCRkRfQVNTRU1CTEVSCi0JdG9vLgotCShjX3NlY3Rpb25faGVhZGVyKTogUmV3cml0ZSBwcm90b3R5cGUgc28gdGhhdCBpdCBjb250YWlucyBubwotCXByZXByb2Nlc3NpbmcgZGlyZWN0aXZlcy4gIERvbid0IGRlY2xhcmUgaXQgYXQgYWxsIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQotCSogY29uZmlndXJlLmluIChzcGFyYyotKi1seW54b3MpOiBOZXcgdGFyZ2V0LCB1c2luZyBjb2ZmIGFuZAotCUJGRF9BU1NFTUJMRVIuCi0KLQkqIHN0YWJzLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKFJFQUxfU09VUkNFUywgT0JKUyk6IExpc3QgaXQuCi0JKiByZWFkLmMgKFNUQUJfU0VDVElPTl9OQU1FLCBTVEFCX1NUUklOR19TRUNUSU9OX05BTUUsCi0JZ2V0X3N0YWJfc3RyaW5nX29mZnNldCwgc19zdGFiX2dlbmVyaWMsIHNfc3RhYiwgc194c3RhYiwgc19kZXNjKToKLQlNb3ZlZCB0byBuZXcgZmlsZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBjb2ZmIGZpbGVzIGxpa2UgZWxmCi0JZmlsZXMuCi0KLVdlZCBOb3YgMTcgMTc6MjM6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1pcml4NSopOiBOZXcgdGFyZ2V0LiAgVXNlIGVsZiBhbmQgbWlwcy1iaWcuCi0JKiBjb25maWcvb2JqLWVsZi5jOiBJZiBFQ09GRl9ERUJVR0dJTkcsIGluY2x1ZGUgZWNvZmYuaC4KLQkob2JqX3BzZXVkb190YWJsZSk6IElmIEVDT0ZGX0RFQlVHR0lORywgZGVmaW5lIEVDT0ZGCi0JcHNldWRvLW9wcy4KLQkob2JqX3JlYWRfYmVnaW5faG9vayk6IElmIEVDT0ZGX0RFQlVHR0lORywgY2FsbAotCWVjb2ZmX3JlYWRfYmVnaW5faG9vay4KLQkob2JqX3N5bWJvbF9uZXdfaG9vayk6IElmIEVDT0ZGX0RFQlVHR0lORywgY2FsbAotCWVjb2ZmX3N5bWJvbF9uZXdfaG9vay4KLQkob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IENhc3QgYWxsb2NhIHJlc3VsdC4KLQkoZWxmX2Zyb2JfZmlsZSk6IElmIEVDT0ZGX0RFQlVHR0lORywgZmluaXNoIHVwIEVDT0ZGIGRlYnVnZ2luZwotCWluZm9ybWF0aW9uIGFuZCB3cml0ZSBpdCBvdXQgaW50byAubWRlYnVnIHNlY3Rpb24uCi0JKiBjb25maWcvb2JqLWVsZi5oIChFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBOZXcgbWFjcm8uCi0JKFRBUkdFVF9TWU1CT0xfRklFTERTKTogVXNlIEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUy4KLQkoRUNPRkZfREVCVUdHSU5HKTogRGVmaW5lIGlmIFRDX01JUFMuCi0JKFRBUkdFVF9TWU1CT0xfRklFTERTKTogSWYgRUNPRkZfREVCVUdHSU5HLCBvdmVycmlkZSB0byBhZGQKLQlmaWVsZHMgcmVxdWlyZWQgYnkgRUNPRkYuCi0JKiBjb25maWcvdGMtbWlwcy5jOiBDaGVjayBFQ09GRl9ERUJVR0dJTkcgcmF0aGVyIHRoYW4KLQlPQkpfRUNPRkYgaW4gbWFueSBjYXNlcy4KLQkobWlwc19hbnlfbm9yZW9yZGVyKTogTmV3IHZhcmlhYmxlLgotCShtaXBzX2NwcmVzdG9yZV9vZmZzZXQpOiBJbml0aWFsaXplIHRvIC0xLgotCShtaXBzX2ZyYW1lX3JlZyk6IE5ldyB2YXJpYWJsZS4KLQkoUkVMQVhfRU5DT0RFLCBSRUxBWF9PTEQsIFJFTEFYX05FVywgUkVMQVhfUkVMT0MxLAotCVJFTEFYX1JFTE9DMiwgUkVMQVhfUkVMT0MzLCBSRUxBWF9XQVJOKTogTmV3IG1hY3Jvcy4KLQkobWRfcHNldWRvX3RhYmxlKTogSGFuZGxlICJncHdvcmQiIGFuZCAiY3BhZGQiLgotCShtZF9iZWdpbik6IEluaXRpYWxpemUgb2sgdG8gZmFsc2UuICBJZiBPQkpfRUxGLCBzZXQgYWxpZ25tZW50Ci0Jb2YgdGV4dCwgZGF0YSBhbmQgYnNzIHNlY3Rpb25zIHRvIDQuICBTZXQgYWxpZ25tZW50IG9mCi0JLnJlZ2luZm8gc2VjdGlvbiB0byAyLiAgSWYgRUNPRkZfREVCVUdHSU5HLCBjcmVhdGUgLm1kZWJ1ZwotCXNlY3Rpb24uCi0JKEFMSUdOX0VSUiwgQUxJR05fRVJSMik6IFJlbW92ZWQgdW51c2VkIGFuZCB1c2VsZXNzIGFsaWdubWVudAotCWNoZWNrLgotCShhcHBlbmRfaW5zbiwgbWFjcm9fYnVpbGQsIG1hY3JvX2J1aWxkX2x1aSk6IFRha2UgcGxhY2UKLQlhcmd1bWVudC4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKGFwcGVuZF9pbnNuKTogSWYgYXBwZW5kaW5nIGEgbm9wLCBkb24ndCBlbWl0IG9uZS4KLQkobWFjcm9fYnVpbGQpOiBDaGFuZ2VkIGFzc2VydGlvbiBmb3IgJ2knLCAnaicsICdvJyBjYXNlLgotCShncF9yZWZlcmVuY2UpOiBSZW1vdmVkLgotCShsb2FkX2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24uCi0JKG1hY3JvKTogSWYgbWlwc19ub3Jlb3JkZXIgaXMgdXNlZCwgc2V0IG1pcHNfYW55X25vcmVvcmRlci4KLQlFeHRlbnNpdmUgY2hhbmdlcyB0byBoYW5kbGUgR1AgYW5kIFBJQyBzeW1ib2xzIGRpZmZlcmVudGx5LgotCUJ1aWxkIGJvdGggcG9zc2libGUgY29kZSBjaG9pY2VzIHVzaW5nIGEgdmFyaWFudCBmcmFnLCBhbmQKLQltYWtlIGEgZmluYWwgZGVjaXNpb24gYXQgdGhlIGVuZCBvZiBhc3NlbWJseSB3aGVuIGFsbAotCWluZm9ybWF0aW9uIGlzIGtub3duLiAgQWRkZWQgUElDIHN1cHBvcnQgZm9yIGFsbCBzeW1ib2wKLQlyZWZlcmVuY2VzLgotCShtaXBzX2lwKTogRG9uJ3QgcGVybWl0IGFueXRoaW5nIGJ1dCBhIG51bWJlciBhZnRlciAkIGZvciBhCi0JY29wcm9jZXNzb3IgcmVnaXN0ZXIuICBEb24ndCB1c2UgLmxpdDQgb3IgLmxpdDggc2VjdGlvbnMgd2hlbgotCWdlbmVyYXRpbmcgUElDIGNvZGUuICBJZiBPQkpfRUxGLCBzZXQgYWxpZ25tZW50IG9mIC5saXQ0IG9yCi0JLmxpdDggc2VjdGlvbiB0byA0LgotCShtZF9hcHBseV9maXgpOiBBY2NlcHQgYW5kIGlnbm9yZSBHT1QxNiBhbmQgR1BSRUwzMiByZWxvY3MuCi0JKHNfY2hhbmdlX3NlYyk6IFNldCBhbGlnbm1lbnQgb2YgRUxGIC5yb2RhdGEgb3IgLnNkYXRhIHNlY3Rpb24KLQl0byA0LgotCShzX21pcHNzZXQpOiBJZiAuc2V0IG5vcmVvcmRlciwgc2V0IG1pcHNfYW55X25vcmVvcmRlci4KLQkoc19jcGxvYWQpOiBJZ25vcmUgLmNwbG9hZCBpZiBub3QgZ2VuZXJhdGluZyBQSUMgY29kZS4gIFdhcm4KLQlpZiAuY3Bsb2FkIGlzIG5vdCBpbiBub3Jlb3JkZXIgc2VjdGlvbi4KLQkoc19jcHJlc3RvcmUpOiBJZ25vcmUgLmNwcmVzdG9yZSBpZiBub3QgZ2VuZXJhdGluZyBQSUMgY29kZS4KLQkoc19ncHdvcmQsIHNfY3BhZGQpOiBOZXcgZnVuY3Rpb25zLgotCSh0Y19nZXRfcmVnaXN0ZXIpOiBBZGRlZCBmcmFtZSBhcmd1bWVudDsgaWYgdHJ1ZSwgc2V0Ci0JbWlwc19mcmFtZV9yZWcgdG8gcmV0dXJuIHZhbHVlLiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBEb24ndCBlcnJvciBvdXQsIGJ1dCBpbnN0ZWFkCi0JZGV0ZXJtaW5lIGhvdyBtdWNoIGEgZnJhZyBzaG91bGQgZ3Jvdy4KLQkodGNfZ2VuX3JlbG9jKTogUmV0dXJuIG11bHRpcGxlIHJlbG9jcyBpZiBhcHByb3ByaWF0ZSwgYXMKLQlkZXRlcm1pbmVkIGJ5IG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LgotCShtZF9jb252ZXJ0X2ZyYWcpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBTZXQgRUxGIGhlYWRlciBmbGFncyBiYXNlZCBvbgotCW1pcHNfYW55X25vcmVvcmRlciBhbmQgbWlwc19waWMuCi0JKiBjb25maWcvdGMtbWlwcy5oIChSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUpOiBEZWZpbmUuCi0JKE1BWF9SRUxPQ19FWFBBTlNJT04pOiBEZWZpbmUgdG8gYmUgMy4KLQkobWRfcmVsYXhfZnJhZyk6IERlZmluZSB0byBiZSAwLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBEb24ndCBkZWZpbmUuCi0JKHRjX2dldF9yZWdpc3Rlcik6IENoYW5nZWQgZGVjbGFyYXRpb24uCi0KLQkqIGVjb2ZmLmgsIGVjb2ZmLmM6IE5ldyBmaWxlcyBwdWxsZWQgb3V0IG9mIGNvbmZpZy9vYmotZWNvZmYuYyB0bwotCXN1cHBvcnQgZ2VuZXJhdGluZyBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIE1JUFMgRUxGCi0JdGFyZ2V0cy4gIENvbXBpbGVkIG9ubHkgaWYgRUNPRkZfREVCVUdHSU5HIGlzIGRlZmluZWQuICBDaGFuZ2VkCi0JaGFuZGxpbmcgb2YgZXh0ZXJuYWwgc3ltYm9sczogaXQgbm93IGFsd2F5cyBnZW5lcmF0ZXMgZXhhY3RseQotCXRob3NlIGV4dGVybmFsIHN5bWJvbHMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIHN5bWJvbCBsaXN0LgotCSogTWFrZWZpbGUuaW4gKFJFQUxfU09VUkNFUyk6IEFkZGVkIGVjb2ZmLmMuCi0JKFJFQUxfSEVBREVSUyk6IEFkZGVkIGVjb2ZmLmguCi0JKE9CSlMpOiBBZGRlZCBlY29mZi5vLgotCShlY29mZi5vKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYzogQWxtb3N0IGVudGlyZWx5IG1vdmVkIGludG8gZWNvZmYuYy4KLQlSZW1haW5pbmcgY29kZSBtb3N0bHkganVzdCBjYWxscyBlY29mZi5jIGNvZGUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmg6IERlZmluZSBFQ09GRl9ERUJVR0dJTkcuCi0JKFRBUkdFVF9TWU1CT0xfRklFTERTKTogTWFrZSBlY29mZl9zeW1ib2wgYSBwb2ludGVyIHRvIGEKLQlzdHJ1Y3QgbG9jYWxzeW0uCi0JKG9ial9yZWFkX2JlZ2luX2hvb2ssIG9ial9zeW1ib2xfbmV3X2hvb2spOiBEZWZpbmUgdG8gY2FsbAotCWZ1bmN0aW9ucyBpbiBlY29mZi5jLgotCShlY29mZl9zdGFiKTogRG9uJ3QgZGVjbGFyZSAobm93IGRlY2xhcmVkIGluIGVjb2ZmLmgpLgotCShvYmpfc2V0X3N5bV9pbmRleCk6IERlZmluZS4KLQkob2JqX2Vjb2ZmX3NldF9zeW1faW5kZXgpOiBEZWNsYXJlLgotCi0JKiBmcmFncy5oIChmcmFnX2dyb3cpOiBEZWNsYXJlLgotCSogZnJhZ3MuYyAoZnJhZ19ncm93KTogTWFkZSBub24tc3RhdGljLgotCi0JKiB3cml0ZS5jIChpc19kbnJhbmdlKTogRG8gbm90IGRlZmluZSBpZiBtZF9yZWxheF9mcmFnIGlzIGRlZmluZWQuCi0JKHJlbGF4X3NlZ21lbnQpOiBJZiBtZF9yZWxheF9mcmFnIGlzIGRlZmluZWQsIHVzZSBpdCB0byBoYW5kbGUgYQotCWZyYWcgb2YgdHlwZSByc19tYWNoaW5lX2RlcGVuZGVudCByYXRoZXIgdGhhbiBsb29raW5nIHRocm91Z2gKLQltZF9yZWxheF90YWJsZS4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBJZiB3ZSBmaW5kIGEgYmFkIHBzZXVkby1vcCwKLQlkbyBhIGNvbnRpbnVlIHRvIGdvIG9uIHRvIHRoZSBuZXh0IGxpbmUgcmF0aGVyIHRoYW4gYSBicmVhay4KLQlSZW1vdmVkIGR1cGxpY2F0ZSBiYWQgcHNldWRvLW9wIGNvZGUgd2hpY2ggd2FzIG5ldmVyIGV4ZWN1dGVkLgotCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBEbyBub3QgcmVxdWlyZSBhIGNvbW1hIGFmdGVyIHRoZSBuYW1lLgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogQ2hhbmdlZCBoYWRvbmUgZmllbGQgdG8gYml0ZmllbGQuCi0JQWRkZWQgYnNzIGJpdGZpZWxkLgotCSogYXMuYyAocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogU2V0IGJzcyBmbGFnIGZvciBic3Nfc2VjdGlvbi4KLQkqIHJlYWQuYyAoc19sY29tbSk6IFNldCBic3MgZmxhZyBmb3IgLnNic3Mgc2VjdGlvbiBpZiB1c2VkLgotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogRG9uJ3Qgc2V0IFNFQ19IQVNfQ09OVEVOVFMgZm9yIGEKLQlic3Mgc2VjdGlvbi4gIFNldCBTRUNfUkVMT0MgaWYgdGhlcmUgYXJlIGFueSByZWxvY2F0aW9ucywgZXZlbiBmb3IKLQlhIHplcm8gc2l6ZSBzZWN0aW9uLgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBJbiBSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUgY2FzZSwgYmFzZQotCWRhdGEgb2Zmc2V0IG9uIHJlbG9jWzBdLT5hZGRyZXNzIHJhdGhlciB0aGFuIHJlbG9jW2pdLT5hZGRyZXNzLCBzbwotCXRoYXQgbXVsdGlwbGUgcmVsb2NzIGNhbiBhZmZlY3QgZGlmZmVyZW50IG1lbW9yeSBsb2NhdGlvbnMuCi0KLQkqIHdyaXRlLmMgKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyLCByZWxheF9hbmRfc2l6ZV9zZWcsCi0JYWRqdXN0X3JlbG9jX3N5bXMsIHdyaXRlX3JlbG9jcyk6IE1ha2UgdGhpcmQgYXJndW1lbnQgUFRSLCBub3QKLQljaGFyICosIHRvIG1hdGNoIGRlZmluaXRpb24gb2YgYmZkX21hcF9vdmVyX3NlY3Rpb25zLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogRG9uJ3QgaW50ZXJwcmV0IGEgY29tbWVudCBjaGFyYWN0ZXIKLQlhcyBzdGFydGluZyBhIENQUCBsaW5lIGRpcmVjdGl2ZSB1bmxlc3MgaXQgaXMgYSAnIycgYW5kIGlzIHRoZQotCXZlcnkgZmlyc3QgY2hhcmFjdGVycyBvbiB0aGUgbGluZSAoaS5lLiwgZG8gbm90IHBlcm1pdCBsZWFkaW5nCi0Jd2hpdGVzcGFjZSkuCi0KLQkqIG1lc3NhZ2VzLmMgKGlkZW50aWZ5KTogTWFrZSBmaWxlIGFyZ3VtZW50IG5vbi1jb25zdCwgdG8gbWF0Y2gKLQljYWxsZXJzLgotCi1UdWUgTm92IDE2IDIwOjM4OjIxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEZpeCB0aGlua28gaW4gMjFiaXQgcmFuZ2UgY2hlY2suCi0KLVNhdCBOb3YgMTMgMTg6MjI6NDggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2FwcGx5X2ZpeCk6IENvcGUgd2l0aCBJTU0xNiB0eXBlIHRvby4KLQkqIGNvbmZpZy90Yy16OGsuYyAoYnVpbGRfYnl0ZXMsIG1kX2FwcGx5X2ZpeCk6IFVuZGVyc3RhbmQgbkRJU1A3Ci0JcmVsb2NzLgotCi1GcmkgTm92IDEyIDE2OjUxOjQ3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5bY2hdOiBGaXggYXNzb3J0ZWQgdHJpdmlhbCBpbmRlbnRpb24gcHJvYmxlbXMuCi0JKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX3ZlcnNpb24pOiBBZGQgbWlzc2luZyAnOycuCi0JKHNvbV9mcm9iX2ZpbGUpOiBEZWxldGUgd2hpdGVzcGFjZSBhdCBFT0wuCi0KLUZyaSBOb3YgMTIgMTU6MjY6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlZCBmb2xsb3dpbmcgMi4yIHJlbGVhc2UuCi0KLUZyaSBOb3YgMTIgMTQ6NTI6MTcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X3N0cnVjdCk6IFVzZSBhIHJlYWwgdHlwZSBmb3IgdGhlCi0JZmllbGQgc2VsZWN0b3IsIHJhdGhlciB0aGFuIGFuIGludC4gIEFsbCB1c2VzIG9mIGZpZWxkIHNlbGVjdG9ycwotCWZpeGVkLgotCSh0Y19nZW5fcmVsb2MpOiBGb3IgU09NIFBMQUJFTHMsIGFsd2F5cyBzZXQgYWRkZW5kIHRvIHplcm8gZm9yIG5vdy4KLQkobWRfYXBwbHlfZml4XzEpOiBEbyBub3QgY2FsbCBocHBhX2ZpZWxkX2FkanVzdCBmb3IgYW55IFBMQUJFTAotCWZpZWxkLgotCi0JVGh1IE5vdiAxMSAxNTo0OTowOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfdHlwZV9hcmdzKTogRm9yIC5pbXBvcnQgc3RhdGVtZW50cywKLQlzaWxlbnRseSBpZ25vcmUgYXR0ZW1wdCB0byBjaGFuZ2UgdGhlIHN5bWJvbCB0eXBlIGZvciBhIGZ1bmN0aW9uCi0JZnJvbSBTVF9FTlRSWSB0byBTVF9DT0RFIG9uIC5pbXBvcnQuCi0KLVdlZCBOb3YgMTAgMTY6MTk6MTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5oIChmaXhTKTogUmVuYW1lIGZ4X2NhbGxqIGZpZWxkIHRvIGZ4X3RjYml0LgotCSogd3JpdGUuYywgY29uZmlnL29iai1jb2ZmLmMsIGNvbmZpZy9vYmotY29mZmJmZC5jLAotCWNvbmZpZy90Yy1pOTYwLmM6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotVHVlIE5vdiAgOSAwMDo0OTowMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERlbGV0ZSBjb25maWctc3RhbXAgYW5kIGNvbmZpZy5oCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGV2YWx1YXRlX2Fic29sdXRlKTogQXZvaWQgcmVseWluZyBvbgotCUFOU0ktQyBmZWF0dXJlcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfdHlwZV9hcmdzKTogUmVuYW1lZCBmcm9tIHBhX2V4cG9ydF9hcmdzLgotCUFjY2VwdCBuZXcgYXJndW1lbnQgImlzX2V4cG9ydCIuICBBbGwgY2FsbGVycyBjaGFuZ2VkLiAgV2hlbgotCXByb2Nlc3NpbmcgYSAuZXhwb3J0IGRpcmVjdGl2ZSBmb3IgYSBmdW5jdGlvbiwgZG8gbm90IGFsbG93Ci0JdGhlIHVzZXIgdG8gc2V0IHRoZSB0eXBlIHRvICJDT0RFIiwgaW5zdGVhZCB3YXJuIGFuZCBzZXQgdGhlCi0JdHlwZSB0byAiRU5UUlkiLgotCi1Nb24gTm92ICA4IDEyOjA1OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCwgcHJpbnRJbnNuKTogSGFuZGxlICdrJyAoZnJvbSBUZWQKLQlMZW1vbiA8bWVsbG9uQHBlcHBlci5uY2QuY29tPikuCi0JKG1pcHNfaXApOiBQZXJtaXQgb2RkIG51bWJlcmVkIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBpZiAtbWlwczMuCi0JKG1hY3JvKTogVXNlIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwgcmVsb2NhdGlvbiBmb3IgTV9MSV9TUy4KLQotTW9uIE5vdiAgOCAwNzo0NTowMSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBoODMwMGgsIHdlIGhhdmUgbXVsdGlsaWIgbm93LgotCi1Nb24gTm92ICA4IDA2OjA5OjE4IDE5OTMgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3VwcG9ydCBnZW5lcmljIG5ldHdhcmUgYXMgYmVpbmcgRUxGIGZvcm1hdC4KLQkJCVJlY29nbmlzZSB1bml4d2FyZSBpZiB0aGUgdXNlciBzdXBwbGllcyBpdC4KLQotU3VuIE5vdiAgNyAwMTowMjowOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogRmlyc3QgY3V0IGF0IGNsZWFuaW5nIHVwIFBBIGluc3RydWN0aW9uIHBhcnNpbmcuCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbik6IEFjY2VwdCBwb2ludGVyIHRvCi0JaW5zbiBzdHJ1Y3R1cmUgYXMgYW4gYXJndW1lbnQsIGFuZCBhIHBvaW50ZXIgdG8gYSBzdHJpbmcuICBBbGwKLQljYWxsZXJzIGNoYW5nZWQuICBBbHdheXMgcmVhZCBhbnkgZmllbGQgc2VsZWN0b3IgaGVyZS4gIENhbGwKLQlldmFsdWF0ZSBhYnNvbHV0ZSB0byBnZXQgYSByZXR1cm4gdmFsdWUuCi0JKGV2YWx1YXRlX2Fic29sdXRlKTogQWRkZXB0IHBvaW50ZXIgdG8gaW5zbiBzdHJ1Y3R1cmUgYXMgaXRzCi0JYXJndW1lbnQuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCShJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFKTogTmV3IG1hY3JvIGZvciBpbnNlcnRpbmcgYSBiaXRmaWVsZAotCWludG8gYW4gaW5zdHJ1Y3Rpb24gYW5kIGNvbnRpbnVpbmcgdGhlIG1haW4gcGFfaXAgbG9vcC4KLQkoQ0hFQ0tfRklFTEQpOiBOZXcgbWFjcm8gZm9yIHNpbXBsZSByYW5nZSBjaGVja2luZyBvZiBmaWVsZHMuCi0JKHBhX2lwKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZXMuICBVc2UgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRQotCWFuZCBDSEVDS19GSUVMRC4gIEFsbCBpbW1lZGlhdGUgZmllbGRzIG5vdyBwYXNzIHRocm91Z2gKLQlwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiB3aGljaCB3aWxsIGFsc28gaGFuZGxlIGZpZWxkIHNlbGVjdG9ycy4KLQlEZWxldGUgZGVhZCBjb2RlLiAgU2ltcGxpZnkuCi0JKG1kX2FwcGx5X2ZpeF8xKTogVXNlIENIRUNLX0ZJRUxEIHRvIHZlcmlmeSBhbnkgZml4ZXMgdGhhdCBhcmUKLQlhcHBsaWVkIGFyZSBpbiByYW5nZS4gIFVzZSBiZmRfcHV0XzMyIHJhdGhlciB0aGFuIGluc2VydGluZyBlYWNoCi0JYnl0ZSBvZiB0aGUgZml4ZWQgaW5zdHJ1dGlvbiBpbnRvIHRoZSBidWZmZXIgb3Vyc2VsdmVzLgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRGVsZXRlIHtTRUcsR0xPQkFMfV9ESUZGX0FMTE9XRUQgY29kZSwKLQlpdCB3YXMgUEEgc3BlY2lmaWMgYW5kIGlzIG5vIGxvbmdlciBuZWVkZWQgKGl0J3Mgbm93IGhhbmRsZWQKLQl3aXRoaW4gdGhlIFBBIGJhY2tlbmQpLgotCSogY29uZmlnL3RjLWhwcGEuaCAoU0VHX0RJRkZfQUxMT1dFRCk6IERlbGV0ZSBkZWZpbml0aW9uLgotCSogY29uZmlnL3RjLWhwcGEuYyAoZml4X25ld19ocHBhKTogSWYgdGhlIHN1YnRyYWN0IHN5bWJvbCBmb3IKLQlhIGZpeHVwIGlzICRnbG9iYWwkIGNoYW5nZSBpdCB0byBOVUxMIGFzICRnbG9iYWwkIGlzIHJlYWxseSBvbmx5Ci0JbmVlZGVkIGxvbmcgZW5vdWdoIHRvIGRldGVybWluZSB0aGUgYmFzZSB0eXBlIG9mIHJlbG9jYXRpb24gdG8gdXNlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChjcmVhdGVfbmV3X3N1YnNwYWNlKTogSW5pdGlhbGl6ZSBzdWJzcGFjZV9kZWZpbmVkLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYS1pcCwgY2FzZSAneicpOiBNYWtlIGZpZWxkIHNlbGVjdG9ycyB3b3JrCi0JZm9yICd6JyBvcGVyYW5kcyAodGFyZ2V0IG9mIGJsZSBicmFuY2gpLgotCi1TYXQgTm92ICA2IDIyOjQxOjU3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiAodXBkYXRlX3N1YnNwYWNlKTogRml4IHR5cGUgYW5kIG5hbWUgb2YgbGFzdAotCXBhcmFtZXRlci4gIEFsbCBjYWxsZXJzIGZpeGVkLgotCShtZF9iZWdpbiwgcGFfY2hrX2ZpZWxkX3NlbGVjdG9yLCBwYV9lbnRyeSk6IExpbnQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGNvbnNfZml4X25ld19ocHBhKTogUmVzZXQgZmllbGQgc2VsZWN0b3IKLQl0byBkZWZhdWx0IHN0YXRlIGFmdGVyIGl0J3MgYmVlbiB1c2VkLgotCi1GcmkgTm92ICA1IDEyOjA4OjIxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX2luaXRfc3RhYl9zZWN0aW9uKTogQ2hhbmdlCi0Jc3BhY2Uvc3Vic3BhY2Ugc29ydCBrZXlzIGZvciB0aGUgc3RhYiBzZWN0aW9ucyBzbyBhcyB0byBhdm9pZAotCWJ1Z3MgaW4gdGhlIGhwIGxpbmtlciBhbmQgcHhkYi4KLQotVGh1IE5vdiAgNCAxNzowMDowNSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogd3JpdGUuYyAoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXIpOiBVcGRhdGUgcG9pbnRlciB0byBsYXN0Ci0JZnJhZyBmb3IgYSBzZWdtZW50IGluIHRoZSBzZWdpbmZvIHN0cnVjdHVyZS4KLQotVGh1IE5vdiAwNCAwOTowOTozNSAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiAgTWFrZWZpbGUuaW46IENoYW5nZWQgUlVOVEVTVEZMQUdTIHRvIFJVTlRFU1RfRkxBR1MKLQotV2VkIE5vdiAgMyAxMjoxNjoyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEhhbmRsZSBjb252ZXJzaW9uIG9mIHN1YnRyYWN0aW9uIHRvCi0JcGMtcmVsYXRpdmUgYWRkcmVzc2luZyBldmVuIGlmIHBjLXJlbGF0aXZlIGZsYWcgaXMgYWxyZWFkeSBzZXQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXBfb3ApOiBVc2Ugc3RyY2hyLCBub3QgaW5kZXguICBEb24ndAotCWRlY2xhcmUgZWl0aGVyLgotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERlbGV0ZSBpbnRlcm1lZGlhdGUgZmlsZXMgZnJvbSBkdmkKLQlidWlsZCwgYnV0IG5vdCB0aGUgZHZpIG9yIGluZm8gZmlsZXMuCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4taGVyZSk6IE5ldyB0YXJnZXQ7IGNsZWFucyB1cCBjdXJyZW50Ci0JZGlyZWN0b3J5IG9ubHkuCi0JKGRpc3RjbGVhbik6IFVzZSBpdCBpbnN0ZWFkIG9mIGNsZWFuLgotCi0JKiByZWFkLmMgKHNfeHN0YWIpOiBEb24ndCB1c2UgYWxsb2NhLgotCi0JKiBtZXNzYWdlcy5jIChpZGVudGlmeSk6IE5ldyByb3V0aW5lOyBwcmludCBtZXNzYWdlIGlkZW50aWZ5aW5nCi0JZm9sbG93aW5nIG1lc3NhZ2VzIGFzIGNvbWluZyBmcm9tIGFzc2VtYmxlci4KLQkoYXNfc2hvd193aGVyZSwgYXNfYmFkX2ludGVybmFsLCBhc19iYWRfd2hlcmUpOiBDYWxsIGl0LgotCShhc19mYXRhbCk6IERvbid0IG5lZWQgdG8gaWRlbnRpZnkgcHJvZ3JhbSBhbnkgbW9yZS4KLQotVHVlIE5vdiAgMiAxODowNDoxMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEFkZCBkZWZhdWx0IGNhc2UgdG8gcmVsb2Mgc3dpdGNoLgotCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBQdXQgc21hbGwgb2JqZWN0cyBpbiAuc2JzcyBmb3IgTUlQUyBFTEYgYXMKLQl3ZWxsIGFzIE1JUFMgRUNPRkYuCi0JKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGFsaWduZWQuCi0KLVR1ZSBOb3YgIDIgMTU6MDc6MDcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHRjLWhwcGEuYzogQWRkICVkcCBhbmQgJXJwIGFzIHN5bm9ueW1zIGZvciAlcjI3IGFuZCAlcjIgaW4gdGhlCi0JcHJlZGVmaW5lZCByZWdpc3RlciB0YWJsZS4KLQkocGFfcGFyc2VfbnVtYmVyKTogSGFuZGxlICVycCBpbiBjb21tb24gcmVnaXN0ZXIgc2hvcnRjdXQgY29kZS4KLQlDb25zaXN0ZW50bHkgc2V0IHJldHVybiB2YWx1ZSB0byAtMSBmb3IgYW4gZXJyb3IuICBDbGVhbiB1cCBlcnJvcgotCW1lc3NhZ2VzIGFuZCBvbmx5IHByaW50IHRoZW0gd2hlbiAicHJpbnRfZXJyb3JzIiBpcyB0cnVlLiAgSGFuZGxlCi0JZW1wdHkgc3RyaW5nIGNhc2UgbGlrZSB0aGUgSFAgYXNzZW1ibGVyIC0tIGFzc3VtZSBhIHZhbHVlIG9mCi0JemVyby4KLQotCSogY29uZmlnL2hvLWhwdXguaDogRG8gbm90IGluY2x1ZGUgaG8tc3lzdi5oLiAgSW5zdGVhZCBpbmNsdWRlCi0Jc3RhbmRhcmQgaHB1eCBpbmNsdWRlIGZpbGVzIHRvIHBpY2sgdXAgdmFyaW91cyBmdW5jdGlvbiBkZWNscy4KLQotCSogY29uZmlnL2hvLWhwcGFvc2YuaDogRGVsZXRlIF9JTyogbWFjcm9zLiAgVGhleSBhcmUgZGVmaW5lZCBpbgotCXN0ZGlvLmguICBEZWxldGUgYm9ndXMgZGVjbGFyYXRpb24gb2YgZnJlZS4gIEdldCBwYXRoIHRvCi0JYWxsb2NhLWNvbmYuaCByaWdodC4KLQotVHVlIE5vdiAgMiAxMzo1NzozMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChvcGVyYW5kKTogRml4IGNoZWNrcyBmb3IgY2hhcmFjdGVycyBmb2xsb3dpbmcgIjBiIiBvcgotCSIwZiIuCi0KLU1vbiBOb3YgIDEgMjE6Mzc6MDQgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotc29tLmggKG9ial9hdHRhY2hfdW53aW5kX2luZm8pOiBEZWZpbmUgYXMgYSBob29rCi0Jc28gR0FTIGNhbiBhdHRhY2ggdW53aW5kIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24gdG8gYSBCRkQgc3ltYm9sLgotCSogY29uZmlnL3RjLWhwcGEuYyAoZml4X25ld19ocHBhKTogSWYgbmVjZXNzYXJ5IGF0dGFjaCB1bndpbmQKLQlkZXNjcmlwdG9yIGluZm9ybWF0aW9uIHRvIHRoZSBCRkQgc3ltYm9sLgotCShtZF9hcHBseV9maXgpOiBSX0hQUEFfRU5UUlkgYW5kIFJfSFBQQV9FWElUIGNhbiBuZXZlciBiZSAiYXBwbGllZCIsCi0JdGhleSBhcmUgc2ltcGx5IG1hcmtlcnMuICBNYWtlIFJfSFBQQV9VTldJTkRfKiBoYW5kbGluZyBPQkpfRUxGCi0JZGVwZW5kZW50LgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBXaG9sZSBmdW5jdGlvbiBpcyBPQkpfRUxGIGRlcGVuZGVudC4KLQkocGFfZW50cnkpOiBCdWlsZCBhIFJfSFBQQV9FTlRSWSByZWxvY2F0aW9uIHdoZW4gY29uZmlndXJlZCBmb3IgU09NLgotCShwYV9leGl0KTogTGlrZXdpc2UsIGJ1dCBidWlsdCBhIFJfSFBQQV9FWElUIHJlbG9jYXRpb24uICBEbyBub3QKLQlidWlsZCAiZW5kLW9mLWZ1bmN0aW9uIiBzeW1ib2xzIGZvciBTT00sIHRoZXkgYXJlIG5vdCBuZWVkZWQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHByb2Nlc3NfZXhpdCk6IENyZWF0ZSB0ZW1wb3Jhcnkgc3ltYm9scyB3aXRoCi0JY29ycmVjdCBwcmVmaXhlcyBzbyB0aGV5IGNhbiBiZSBlbGltaW5hdGVkIGxhdGVyLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChjYWxsX2luZm8gc3RydWN0KTogRGVsZXRlIHVudXNlZCAiZnJhbWUiIGZpZWxkLgotCShwYV9jYWxsaW5mbyk6IEluc2VydCBmcmFtZXNpemUgaW50byB0aGUgdW53aW5kIGluZm9ybWF0aW9uIGFzCi0Jc29vbiBhcyBpdCdzIGF2YWlsYWJsZS4KLQkocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogRG8gbm90IGluc2VydCBmcmFtZXNpemUgaW50byB0aGUgdW53aW5kCi0JaW5mb3JtYXRpb24gaGVyZS4KLQotCSogQWRkIHN1cHBvcnQgZm9yIG1hcmtlciB0eXBlIHJlbG9jYXRpb25zLiAgVGhlc2UgbWFyayBhcmVhcwotCW9mIGludGVyZXN0IHRvIHRoZSBsaW5rZXIuICBFTlRSWS9FWElUIHJlbG9jYXRpb25zIGZvciBTT00gYXJlCi0JYW4gZXhhbXBsZSBvZiBtYXJrZXIgcmVsb2NhdGlvbnMuCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBJbnN0ZWFkIG9mIGFzc3VtaW5nIHNpemUgb2YgYSByZWxvY2F0aW9uCi0JaXMgNCBieXRlcywgcGljayB1cCB0aGUgc2l6ZSBmcm9tIHJlbG9jYXRpb24gaXRzZWxmLgotCShmaXh1cF9zZWdtZW50KTogRG8gbm90IGNvbXBsYWluIHRoYXQgYSB2YWx1ZSBpcyB0b28gc21hbGwgZm9yCi0JbWFya2VyIHJlbG9jYXRpb25zLgotCi0JKiBzdHJ1Yy1zeW1ib2wuaDogQWRkIG5ldyAic3lfdXNlZCIgZmllbGQgdG8gdGhlIHN5bWJvbCBzdHJ1Y3R1cmUuCi0JKiBleHByLmMgKG9wZXJhbmQpOiBTZXQgc3lfdXNlZCBmb3IgYW55IHN5bWJvbCB1c2VkIGFzIGFuIG9wZXJhbmQuCi0JKGV4cHIpOiBMaWtld2lzZSBmb3IgYW55IHN5bWJvbCB1c2VkIGluIGFuIGV4cHJlc3Npb24uCi0JKiBjb25maWcvdGMtaHBwYS5oICh0Y19mcm9iX3N5bWJvbCk6IERlZmluZS4gIFB1bnQgaW1wb3J0ZWQKLQlzeW1ib2xzIHdoaWNoIGFyZSBuZXZlciB1c2VkIGFuZCBhYnNvbHV0ZSBzeW1ib2xzIHdoaWNoIGxvY2FsIHNjb3BlLgotCi0JKiBjb25maWcvb2JqLXNvbS5oIChvYmpfZnJvYl9maWxlKTogRGVmaW5lLgotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV9pbml0X3N0YWJfc2VjdGlvbik6IFNldCBhbGlnbm1lbnQKLQlvZiBzdGFiIHNlY3Rpb25zLiAgTWFrZSBzcGFjZSBmb3IgdGhlIHNwZWNpYWwgc3RhYiBlbnRyeS4KLQkoYWRqdXN0X3N0YWJfc2VjdGlvbnMpOiBBZGp1c3QgdGhlIHNwZWNpYWwgZW50cnkgaW4gdGhlCi0Jc3RhYnMgc2VjdGlvbi4KLQkoc29tX2Zyb2JfZmlsZSk6IE5ldyBmdW5jdGlvbi4gIFNpbXBseSBjYWxscyBhZGp1c3Rfc3RhYl9zZWN0aW9ucwotCWZvciBlYWNoIHNlY3Rpb24uCi0KLU1vbiBOb3YgIDEgMTc6NTQ6MjkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChQSUNfQ0FMTF9SRUcsIFNQLCBGUCk6IERlZmluZS4KLQkobWlwc19waWMsIG1pcHNfY3ByZXN0b3JlX29mZnNldCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShtZF9wc2V1ZG9fdGFibGUpOiBIYW5kbGUgLmFiaWNhbGxzLCAuY3Bsb2FkLCBhbmQgLmNwcmVzdG9yZS4KLQlJZ25vcmUgLmJnbmIgYW5kIC5lbmRiLgotCShncF9yZWZlcmVuY2UpOiBfZ3BfZGlzcCBpcyBuZXZlciBhZGRyZXNzZWQgb2ZmIEdQLgotCShtYWNyb19idWlsZCk6IElnbm9yZSBtYWNyb3Mgd2hpbGUgc2VhcmNoaW5nIGZvciBpbnNuLiAgRm9yIGNhc2VzCi0JaSwgaiwgYW5kIG8sIGFjY2VwdCB0aGUgcmVsb2MgdHlwZSBhcyBhbiBhcmd1bWVudCByYXRoZXIgdGhhbgotCWFzc3VtaW5nIEJGRF9SRUxPQ19MTzE2LiAgRG9uJ3QgdHJ5IHRvIGNvbnZlcnQgQkZEX1JFTE9DX0xPMTYgdG8KLQlCRkRfUkVMT0NfTUlQU19HUFJFTC4gIEFkZGVkIG5ldyBjYXNlIGEuCi0JKHNldF9hdCwgbG9hZF9yZWdpc3RlciwgbWFjcm8pOiBDaGFuZ2VkIGNhbGxzIHRvIG1hY3JvX2J1aWxkIHRvCi0JcGFzcyBuZXcgYXJndW1lbnQgZm9yIGksIGogYW5kIG8gY2FzZXMuCi0JKG1hY3JvKTogSGFuZGxlIE1fSkFMXzEsIE1fSkFMXzIgYW5kIE1fSkFMX0EuICBUaGVzZSByZXF1aXJlCi0Jc3BlY2lhbCBoYW5kbGluZyB3aGVuIGdlbmVyYXRpbmcgU1ZSNCBQSUMgY29kZS4KLQkobWlwc19pcCwgdGNfZ2V0X3JlZ2lzdGVyLCBzX2ZyYW1lKTogVXNlIG1hY3JvcyBGUCwgU1AsIEdQIGFuZCBBVAotCXJhdGhlciB0aGFuIGhhcmQgY29kZWQgY29uc3RhbnRzLgotCShtZF9hcHBseV9maXgpOiBIYW5kbGUgQkZEX1JFTE9DX01JUFNfTElURVJBTCBhbmQKLQlCRkRfUkVMT0NfTUlQU19DQUxMMTYuCi0JKHNfb3B0aW9uKTogU2V0IG1pcHNfcGljIGJhc2VkIG9uIC5vcHRpb24gcGljTi4KLQkoc19hYmljYWxscyk6IE5ldyBmdW5jdGlvbjsgc2V0IG1pcHNfcGljIHRvIDIuCi0JKHNfY3Bsb2FkKTogTmV3IGZ1bmN0aW9uOyBoYW5kbGUgLmNwbG9hZC4KLQkoc19jcHJlc3RvcmUpOiBOZXcgZnVuY3Rpb247IGhhbmRsZSAuY3ByZXN0b3JlLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgZW50cmllcyBmb3IgLmJnbmIsCi0JLmVuZGIgYW5kIC52ZXJzdGFtcCwgc2V0dGluZyB0aGVtIHRvIHNfaWdub3JlLgotCi1TdW4gT2N0IDMxIDAwOjM2OjQwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChzdWJzcGFjZV9kaWN0aW9uYXJ5X2NoYWluKTogQWRkIG5ldyBzc2RfZGVmaW5lZAotCWZpZWxkLiAgRGVmaW5lIFNVQlNQQUNFX0RFRklORUQgYWNjZXNzb3IgbWFjcm8uCi0JKHBhX3N1YnNwYWNlKTogQWxsb3cgdXNlciB0byBvdmVycmlkZSBzdWJzcGFjZSBhdHRyaWJ1dGVzIGZvcgotCWJ1aWx0LWluIHN1YnNwYWNlcy4gIFNldCBzc2RfZGVmaW5lZCBhdCB0aGUgZW5kIG9mIGZjbiAtLSB0aGF0Ci0Jd2F5IHRoZSBhdHRyaWJ1dGVzIGNhbiBvbmx5IGJlIGNoYW5nZWQgb25jZS4gIFBhc3MgbmV3bHkgYWxsb2NhdGVkCi0JbmFtZSB0byBpc19kZWZpbmVkX3N1YnNwYWNlLCBub3QgYSBwb2ludGVyIHRvIHRoZSBpbnB1dCBsaW5lLgotCUZpeCB0eXBvIGluIHNwYWNlL3N1YnNwYWNlIHJld29yay4KLQkoaXNfZGVmaW5lZF9zdWJzcGFjZSk6IERlbGV0ZSB1bnVzZWQgMm5kIGFyZy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2ltcG9ydCk6IElmIGN1cnJlbnRseSBpbiB0aGUgdGV4dCBzZWdtZW50Ci0JYW5kIGEgc3ltYm9sIGlzIGltcG9ydGVkIHdpdGhvdXQgdHlwZSBpbmZvcm1hdGlvbiwgc2V0IEJTRl9GVU5DVElPTgotCWZvciB0aGUgc3ltYm9sLgotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogQ29ycmVjdCB0ZXN0IHRvIGRldGVybWluZSBpZgotCXRoZSBzZWN0aW9uJ3Mgc2l6ZSB3YXMgcm91bmRlZCB1cC4KLQotCSogY29uZmlnL29iai1zb20uaCAob2JqX3NldF9zeW1ib2xfdHlwZSk6IERlZmluZSBhIGhvb2sgc28gR0FTCi0JY2FuIHByb3Blcmx5IHNldCBhbGwgdGhlIFNPTSBzeW1ib2wgdHlwZXMuCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zeW1ib2xfdHlwZSk6IE5ldyBlbnVtIHRvIHJlcHJlc2VudCB0aGUKLQlzeW1ib2wgdHlwZXMgd2hpY2ggY2FuIGJlIHNldCBmcm9tIGFuIElNUE9SVC9FWFBPUlQgc3RhdGVtZW50LgotCShwYV9leHBvcnRfYXJncyk6IFNldCB0aGUgcGFfc3ltYm9sX3R5cGUgdHlwZSBiYXNlZCBvbiBhcmd1bWVudHMuCi0JSWYgZGVmaW5lZCwgY2FsbCBvYmpfc2V0X3N5bWJvbF90eXBlIHRvIHBhc3MgdGhpcyBpbmZvcm1hdGlvbiBvbgotCXRvIHRoZSBCRkQgYmFja2VuZC4KLQotCSogcmVhZC5jIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogU2V0IFNFQ19ERUJVR0dJTkcgZm9yIGFueQotCXN0YWIgc2VjdGlvbiB3ZSBtYWtlLgotCShzX3N0YWJfZ2VuZXJpYyk6IExpa2V3aXNlLgotCi1TYXQgT2N0IDMwIDE0OjI2OjIwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBBbGxvdyBiYWNrZW5kcyB0byBvdmVycmlkZSB0aGUgdmFsdWUgb2YgdGhlIGZha2UgbGFiZWwuCi0JKiB3cml0ZS5oIChMT0NBTF9MQUJFTCk6IERlbGV0ZSBET1RfTEFCRUxfUFJFRklYIGNvZGUuICBJbnN0ZWFkCi0JYXNzdW1lIGJhY2tlbmRzIHdpbGwgZGVmaW5lIExPQ0FMX0xBQkVMIGlmIGFueXRoaW5nIG90aGVyIHRoYW4KLQknTCcgaXMgdXNlZCB0byBkZW5vdGUgYSBsb2NhbCBsYWJlbC4KLQkoRkFLRV9MQUJFTF9OQU1FKTogTmV3IG1hY3JvLiAgRGVmaW5lcyB0aGUgZGVmYXVsdCBuYW1lIHVzZWQgZm9yCi0JdGhlICJmYWtlIiBsYWJlbC4KLQkqIGV4cHIuYyAobWFrZV9leHByX3N5bWJvbCk6IERlbGV0ZSBET1RfTEFCRUxfUFJFRklYIGNvZGUKLQlhbmQgaW5zdGVhZCBzaW1wbHkgdXNlIHRoZSBzdHJpbmcgZGVmaW5lZCBieSBGQUtFX0xBQkVMX05BTUUuCi0JKG9wZXJhbmQpOiBMaWtld2lzZS4KLQkqIHJlYWQuYyAoc19zdGFiX2dlbmVyaWMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKEZBS0VfTEFCRUxfTkFNRSk6IERlZmluZSBhcyBMJDBcMDAxIHNvIGl0J3MKLQlrbm93biB0byBiZSBhIGxvY2FsIGxhYmVsLgotCSogY29uZmlnL3RjLWkzODYuaCAoRE9UX0xBQkVMX1BSRUZJWCk6IERlbGV0ZS4KLQkoTE9DQUxfTEFCRUwsIEZBS0VfTEFCRUxfTkFNRSk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKERPVF9MQUJFTF9QUkVGSVgpOiBEZWxldGUuCi0JKExPQ0FMX0xBQkVMLCBGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUuCi0JKiBjb25maWcvdGUtc2NvMzg2LmggKERPVF9MQUJFTF9QUkVGSVgpOiBEZWxldGUuCi0JKExPQ0FMX0xBQkVMLCBGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUuCi0KLQlSZXdvcmsgc3BhY2Uvc3Vic3BhY2UgaGFuZGxpbmcgaW4gUEEgY29kZSB0byBmdWxseSBzdXBwb3J0Ci0JU09NIHNwYWNlcy9zdWJzcGFjZXMuCi0JKiBjb25maWcvdGMtaHBwYS5jIChVU0VfQUxJQVNFUyk6IE5ldyBvYmplY3QtZm9ybWF0IGRlcGVuZGVudCBkZWZpbmUKLQl0byBjb250cm9sIHRoZSB1c2Ugb2Ygc3BhY2Uvc3Vic3BhY2UgbmFtZSBhbGlhc2VzLgotCSh1cGRhdGVfc3Vic3BhY2UpOiBBY2NlcHQgc3BhY2UgY2hhaW4gZW50cnkgZm9yIGNvbnRhaW5pbmcgc3BhY2UKLQlhcyBhIG5ldyBwYXJhbWV0ZXIuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCShwYV9nZXRfbGFiZWwpOiBVc2UgY3VycmVudF9zcGFjZSByYXRoZXIgdGhhbiBwYV9zZWdtZW50X3RvX3NwYWNlLgotCShwYV9kZWZpbmVfbGFiZWwpOiBMaWtld2lzZS4KLQkocGFfdW5kZWZpbmVfbGFiZWwpOiBMaWtld2lzZS4KLQkobWRfYmVnaW4pOiBDaGFuZ2UgaW50byB0aGUgKHBvc3NpYmx5IG1vZGlmaWVkKSB0ZXh0X3NlY3Rpb24uCi0JKHBhX3BhcnNlX3NwYWNlX3N0bXQpOiBDcmVhdGUgYSBuZXcgc2VnbWVudC9zcGFjZSBpZiBjcmVhdGVfZmxhZwotCWlzIHRydWUsIGFuZCB0aGUgc3BhY2UgbmFtZSBpcyBub3Qgb25lIG9mIHRoZSB0d28gcHJlZGVmaW5lZCBzcGFjZXMuCi0JKHBhX3N1YnNwYWNlKTogVXNlIGN1cnJlbnRfc3BhY2UgcmF0aGVyIHRoYW4gYSBsb29rdXAgdmlhCi0JcGFfc2VnbWVudF90b19zcGFjZS4gIFJlc2V0IEJGRCBzZWN0aW9uIGZsYWdzIGFzIHJlcXVpcmVkIGJ5Ci0JdGhlIC5zdWJzcGFjZSBkaXJlY3RpdmUuICBMaWtld2lzZSBmb3IgdGhlIHNlY3Rpb24gYWxpZ25tZW50LgotCVBhc3MgdGhlIGN1cnJlbnQgc3BhY2UgdG8gdXBkYXRlX3N1YnNwYWNlIGFuZCBjcmVhdGVfbmV3X3N1YnNwYWNlLgotCShwYV9zcGFjZXNfYmVnaW4pOiBPbmx5IHVzZSBzcGFjZS9zdWJzcGFjZSBhbGlhc2VzIGlmIFVTRV9BTElBU0VTCi0JaXMgdHJ1ZS4gIFdoZW4gbm90IHVzaW5nIGFsaWFzZXMsIGNyZWF0ZSBhIEJGRCBzZWN0aW9uIGZvciBlYWNoCi0Jc3Vic3BhY2UgZW5jb3VudGVyZWQuICBXaGVuIG5vdCB1c2luZyBhbGlhc2VzIHJlcGxhY2UgdGhlIGRlZmF1bHQKLQl0ZXh0LCBkYXRhLCBhbmQgYnNzIHNlZ21lbnRzIHdpdGggbmV3IG9uZXMuCi0JKGNyZWF0ZV9uZXdfc3Vic3BhY2UpOiBXaGVuIG5vdCB1c2luZyBhbGlhc2VzIGVhY2ggc3Vic3BhY2UgaGFzIGEKLQlzZWN0aW9uL3NlZ21lbnQgYW5kIHN1YnNlZ21lbnRzIGFyZSBub3QgbmVlZGVkLCBzbyBzZXQgdGhlIHN1YnNlZ21lbnQKLQl0byB6ZXJvLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9zcGFjZV9zdG10KTogSWYgbmVlZGVkLCBjYWxsCi0Jb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgdG8gcGFzcyBzcGFjZSBhdHRyaWJ1dGVzIHRvIHRoZQotCUJGRCBiYWNrZW5kLgotCShjcmVhdGVfbmV3X3NwYWNlKTogTGlrZXdpc2UuCi0JKGNyZWF0ZV9uZXdfc3Vic3BhY2UpOiBMaWtld2lzZSBmb3Igc3Vic3BhY2UgYXR0cmlidXRlcyB1c2luZwotCW9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzLgotCSh1cGRhdGVfc3Vic3BhY2UpOiBMaWtld2lzZSBmb3Igc3Vic3BhY2UgYXR0cmlidXRlcyB1c2luZwotCW9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9zcGFjZV9zdG10KTogR2V0IHNlZ21lbnQgYW5kIHNvcnQga2V5Ci0JZm9yICRURVhUJCBhbmQgJFBSSVZBVEUkIGZyb20gdGhlIGRlZmF1bHQgc3BhY2Ugc3RydWN0dXJlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9leHBvcnRfYXJncyk6IEFsd2F5cyBzZXQgQlNGX0ZVTkNUSU9OCi0JYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiB0eXBlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MpOiBQcmVsaW1pbmFyeSBzdGFiIGF0IGhhbmRsaW5nCi0JU09NIHJlbG9jYXRpb25zLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9jb21tKTogRGVsZXRlIGluY29ycmVjdCBjaGVjayBmb3Igc3ltYm9sCi0JcmVkZWZpbml0aW9uLgotCi0JKiBjb25maWcvb2JqLXNvbS5bY2hdOiBOZXcgZmlsZXMgZm9yIFNPTSBzdXBwb3J0LiAgTm90ZSBTT00KLQlzdXBwb3J0IGlzIG5vdCB5ZXQgY29tcGxldGUgaW4gR0FTIG9yIEJGRC4KLQotCSogY29uZmlnL2hvLWhwcGFic2QuaDogIERlbGV0ZSBJTyogbWFjcm9zLCB0aGV5IGFyZSBkZWZpbmVkIGluCi0Jc3RkaW8uaC4gIERlbGV0ZSBkZWNsYXJhdGlvbiBvZiBmcmVlLiAgSW5jbHVkZSBzdGRsaWIuaCwgdW5pc3RkLmgsCi0JYW5kIHN0cmluZy5oLgotCi1GcmkgT2N0IDI5IDEzOjI2OjEyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBBbGxvdyBiYWNrZW5kcyB0byBvdmVycmlkZSB0aGUgc2VjdGlvbiBuYW1lcyB1c2VkIGZvciBlbWJlZGRlZAotCXN0YWJzIHN1cHBvcnQuICBOZWVkZWQgZm9yIFNPTS4KLQkqIHJlYWQuYyAoU1RBQl9TRUNUSU9OX05BTUUpOiBEZWZhdWx0IHRoZSBuYW1lIG9mIHRoZSBzdGFiIHNlY3Rpb24KLQl0byAiLnN0YWIiLgotCShTVEFCX1NUUklOR19TRUNUSU9OX05BTUUpOiBMaWtld2lzZSBmb3IgdGhlIHN0YWIgc3RyaW5ncyBzZWN0aW9uLgotCShnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogSXMgbm93IHBhc3NlZCB0aGUgZnVsbCBuYW1lIGZvciB0aGUKLQlzdGFiIHN0cmluZyBzZWN0aW9uIHJhdGhlciB0aGFuIGEgbmFtZSBwcmVmaXguICBBbGwgcmVmZXJlbmNlcwotCWNoYW5nZWQuCi0JKHNfc3RhYl9nZW5lcmljKTogTmV3IGFyZ3VtZW50IGZvciB0aGUgc3RhYiBzdHJpbmcgc2VjdGlvbiBuYW1lLgotCWFsbCByZWZlcmVuY2VzIGNoYW5nZWQuCi0JKHNfeHN0YWIpOiBBcHBlbmQgInN0ciIgdG8gdGhlIHN0YWIgc2VjdGlvbiBuYW1lIHRvIGdldCB0aGUKLQlzdGFiIHN0cmluZyBzZWN0aW9uIG5hbWUuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24pOiBBcHBlbmQgInN0ciIKLQl0byBzdGFiIHNlY3Rpb24gbmFtZSB0byBnZXQgdGhlIHN0YWIgc3RyaW5nIHNlY3Rpb24gbmFtZS4gIFBhc3MKLQl0aGUgZnVsbCBuYW1lIG9mIHRoZSBzdGFiIHN0cmluZyBzZWN0aW9uIHRvIGdldF9zdGFiX3N0cmluZ19vZmZzZXQuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2JlZ2luKTogRGlzYWJsZSAiLVIiIG9wdGlvbiB0byBmb2xkCi0JdGV4dGFuZCBkYXRhIHNlZ21lbnRzLiAgV2FybiB1c2VyICItUiIgaXMgdW5zdXBwb3J0ZWQgb24gdGhlCi0JUEEuCi0KLVRodSBPY3QgMjggMTI6MzY6MTMgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IERlZmF1bHQgYWxpZ25tZW50IGlzIDggZm9yCi0JLmFsaWduIGFuZCAuQUxJR04gZGlyZWN0aXZlcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3BhY2UpOiBEbyBub3QgcmVwb3J0IGFuIGVycm9yIGZvciBhIC5zcGFjZQotCWRpcmVjdGl2ZSB3aGljaCBkb2VzIG5vdCBkZWZpbmUgYSAid2VsbC1rbm93biIgc3BhY2UgYW5kIGRvZXMKLQlub3QgaW5jbHVkZSBhIHNwYWNlIG51bWJlciBhcyBhbiBhcmd1bWVudC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZGVmX3N1YnNwYWNlcyk6IENvcnJlY3QgaW5pdGlhbGl6YXRpb24gb2YgdGhlCi0JImRlZmluZWQiLCAibG9hZGFibGUiLCAiY29kZV9vbmx5IiBhbmQgInNwYWNlX2luZGV4IiBmaWVsZHMuCi0JKHBhX2RlZl9zcGFjZXMpOiBDb3JyZWN0IGluaXRpYWxpemF0aW9uIG9mIHRoZSAic3BudW0iLCAiZGVmaW5lZCIsCi0JYW5kICJwcml2YXRlIiBmaWVsZHMuCi0KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBBZGQgbmV3IHRjX2ZpeF9kYXRhIGZpZWxkIGZvciB0aGUgdmFyaW91cwotCWJhY2tlbmRzIHRvIGF0dGFjaCBtYWNoaW5lIGRlcGVuZGVudCBmaXh1cCBpbmZvcm1hdGlvbiB0by4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBJbml0aWFsaXplIG5ldyB0Y19maXhfZGF0YSBmaWVsZC4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X3N0cnVjdCk6IERlbGV0ZSB1bm5lY2Vzc2FyeSBmaXhfZml4UCBhbmQKLQlmeF9uZXh0IGZpZWxkcy4KLQkoaHBwYV9maW5kX2hwcGFfZml4KTogRGVsZXRlIHVubmVjZXNzYXJ5IGZ1bmN0aW9uLiAgRml4IGFsbAotCWNhbGxlcnMgdG8gZ2V0IEhQUEEgZml4dXAgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGNfZml4X2RhdGEgZmllbGQKLQlpbiB0aGUgR0FTIGZpeHVwLgotCShocHBhX2ZpeF9yb290KTogRGVsZXRlIHVubmVjZXNzYXJ5IHZhcmlhYmxlLgotCShmaXhfbmV3X2hwcGEpOiBBdHRhY2ggSFBQQSBmaXh1cCBkYXRhIHRvIHRoZSBHQVMgZml4dXAuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3NldF9zdGFydF9zeW1ib2wpOyBEZWxldGUgdW53YW50ZWQKLQlmdW5jdGlvbi4gIEZpeCBhbGwgY2FsbGVycy4KLQkoc3Vic3BhY2VfZGljdGlvbmFyeV9jaGFpbik6IERlbGV0ZSB1bnVzZWQgc3NkX3N0YXJ0X3N5bSBmaWVsZC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbiB0byBkZXRlcm1pbmUKLQlpZiBhIHBhcnRpY3VsYXIgZml4dXAgaXMgYWRqdXN0YWJsZS4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogQ2FsbCBocHBhX2ZpeF9hZGp1c3RhYmxlIHRvCi0JcGVyZm9ybSB0aGUgcmVhbCB3b3JrLgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUpOiBNb3ZlIGRlZmluaXRpb24gb3V0Ci0Jb2YgT0JKX1hYWCBjb25kaXRpb25hbHMuCi0JKE1BWF9SRUxPQ19FWFBBTlNJT04pOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobG9nMik6IFJlbmFtZWQgZnJvbSBpc19wb3dlcl9vZl8yLiAgRml4IGFsbAotCWNhbGxlcnMuIE5vdyByZXR1cm5zIGxvZzIgKE4pIGZvciBwb3NpdGl2ZSBOIHdoaWNoIGFyZSBhbiBleGFjdAotCXBvd2VyIG9mIHR3byBvciAtMSBmb3IgYW4gZXJyb3IuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2NhbGxpbmZvKTogUmFuZ2UgY2hlY2sgdmFsdWVzIHByb3ZpZGVkIGZvcgotCUVOVFJZX0dSLCBFTlRSWV9GUiBhbmQgRU5UUllfU1IuICBQcm9wZXJseSBhZGp1c3QgdmF1ZXMgYmVmb3JlCi0JaW5zZXJ0aW5nIHRoZW0gaW50byB0aGUgdW53aW5kIHRhYmxlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChORUVEU19GSVhVUCk6IERlbGV0ZSBkZWZpbml0aW9uIGFuZCBhbGwgcmVmZXJlbmNlcy4KLQkoaHBwYV9nZW5fcmVsb2NfdHlwZSk6IE5ldyBvYmplY3QgZm9ybWF0IGRlcGVuZGVudCBtYWNyby4KLQkocGFfaXApOiBEZWxldGUgdG9ucyBvZiBjb2RlIHdoaWNoIHdhcyBlaXRoZXIgT0JKX1NPTSBvciBPQkpfRUxGCi0JY29uZGl0aW9uYWwuICBUaGUgY29kZSBjYW4gKGFuZCB3aWxsKSBiZSBzaGFyZWQgYmV0d2VlbiBTT00gJiBFTEYKLQlmb3JtYXRzIGluIHRoZSBuZWFyIGZ1dHVyZS4KLQkoY29uc19maXhfbmV3X2hwcGEsIG1kX2FwcGx5X2ZpeF8xKTogTGlrZXdpc2UuCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSwgcHJvY2Vzc19leGl0LCBwYV9leGl0KTogTGlrZXdpc2UuCi0JKHRjX2dlbl9yZWxvYyk6IFVzZSBocHBhX2dlbl9yZWxvYyByYXRoZXIgdGhhbiBhbiBvYmplY3QgZm9ybWF0Ci0Jc3BlY2lmaWMgY2FsbC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY29tbSk6IFNldCB0aGUgc2VnbWVudCBmb3IgYSBjb21tb24gc3ltYm9sCi0JdG8gYmZkX3VuZF9zZWN0aW9uLgotCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZWxmX3ZlcnNpb24pOiBBZGQgZXh0ZXJuIHByb3RvdHlwZS4KLQotCSogY29uZmlndXJlLmluIChocHBhLSotYnNkKik6IE5ldyBjb25maWd1cmF0aW9uLgotCUJGRCBpcyBhbHdheXMgdXNlZCBmb3IgR0FTIGdlbmVyYXRpbmcgU09NIG9iamVjdHMuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogU2V0IHN5X3VzZWRfaW5fcmVsb2MgaWYgYW4KLQlhZGp1c3RtZW50IGlzIHJlamVjdGVkIGJ5IHRoZSB0YXJnZXQgbWFjaGluZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYmlnX2NvbnMpOiBEZWxldGUgZnVuY3Rpb24gYW5kIGl0cwotCWRlY2xhcmF0aW9uLiAgQWxsIGNhbGxlcnMgY2hhbmdlZCB0byB1c2UgcGFfY29ucy4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEZpeCBpbmRlbnRpb24gYW5kIG9wZW4vY2xvc2UgYnJhY2UKLQlwcm9ibGVtLgotCi0JRnJvbSBQZXRlIEhvb2dlbmJvb206Ci0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hdG9mKTogUmV0dXJuIGEgTlVMTCBvbiBzdWNjZXNzIHJhdGhlciB0aGFuCi0JYW4gZW1wdHkgc3RyaW5nLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9zcGFjZV9zdG10KTogQWR2YW5jZQotCWlucHV0X2xpbmVfcG9pdG5lciB3aGVuIGFuIGludmFsaWQgYXJndW1lbnQgaXMgZW5jb3VudGVyZWQuCi0KLVRodSBPY3QgMjggMTM6MDk6MjYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtYTI5ay5jIChtZF9iZWdpbik6IFdoZW4gb3Bjb2RlcyBhcmUgbWFzaGVkIHRvZ2V0aGVyIGluCi0JdGhlIHRhYmxlLCByZXF1aXJlIHRoYXQgdGhlIG9uZSB3aXRob3V0IGJpdCAweDEwMDAwMDAgc2V0IGNvbWUKLQlmaXJzdC4gIFJlcXVpcmUgZnVydGhlciB0aGF0IGl0IGJlIGNhc2UgJ2InIG9yICdQJy4gIFRoZSBhMjlrCi0Jb3Bjb2RlIHRhYmxlIGFscmVhZHkgbWVldHMgdGhlc2UgY29uc3RyYWludHMuCi0JKG1hY2hpbmVfaXApOiBXaGVuIGhhbmRsaW5nIGNhc2UgJ2knIG9yICdBJywgbWFrZSBzdXJlIHRoYXQgdGhlCi0JYXBwcm9wcmlhdGUgb3Bjb2RlIHJlYWxseSBleGlzdHMgYnkgbG9va2luZyBhdCB0aGUgbmV4dCBlbnRyeSBpbgotCXRoZSBvcGNvZGUgdGFibGUuCi0KLVdlZCBPY3QgMjcgMTE6NDg6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQWRqdXN0IG9mZnNldHMgZm9yIFBDIHJlbGF0aXZlCi0JZml4dXBzLiAgQWRkIDYgZm9yIGxvbmcgNy4zIGNhc2UsIDIgZm9yIHNob3J0IDcuMiBjYXNlLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9lY29mZl9lbnQpOiBJZ25vcmUgYW4gb3B0aW9uYWwgbnVtYmVyCi0JYWZ0ZXIgYSAuZW50IGRpcmVjdGl2ZS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEhhbmRsZSAnPicgY2FzZSAoc2hpZnQgYW1vdW50Ci0JYmV0d2VlbiAzMiBhbmQgNjMgZm9yIGRvdWJsZSBzaGlmdCBpbnN0cnVjdGlvbikuICBEbyAmIDB4MWYgcmF0aGVyCi0JdGhhbiAlIDMyLgotCShwcmludEluc24pOiBIYW5kbGUgJz4nLgotCi1UdWUgT2N0IDI2IDE2OjU4OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKHRjX2FvdXRfZml4X3RvX2NoYXJzKTogT3V0cHV0IHRoZSBzeW1ib2wKLQludW1iZXIgaW4gdGhlIHJpZ2h0IHBsYWNlLiAgVW50ZXN0ZWQuICBQcm9iYWJseSBkb2VzIG5vdCB3b3JrIGZvcgotCWNyb3NzIGFzc2VtYmx5LiAgRnJvbSBjYWduZXlAY3MuYWRlbGFpZGUuZWR1LmF1IChBbmRyZXcgQ2FnbmV5KS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBFcnJvciBpZiBhIHNob3J0IGJyYW5jaCB1c2VzCi0JYW4gaWxsZWdhbCBvZmZzZXQgb2YgMCBvciAtMS4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IEFsaWduIC5zdGFiCi0Jc2VjdGlvbiB0byBhIGxvbmd3b3JkIGJvdW5kYXJ5LgotCi1UdWUgT2N0IDI2IDEwOjI0OjMxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ0hFQ0tGTEFHUyk6IFBhc3MgZG93biBSVU5URVNURkxBR1MuCi0KLQlGcm9tIEplZmYgTGF3OgotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogRUxGMzJfSFBQQV9SX0FEREVORCAtPgotCUhQUEFfUl9BRERFTkQuCi0KLU1vbiBPY3QgMjUgMTQ6MDY6MTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBGaXggdXAgbWVtYmFyIGFyZ3VtZW50IGhhbmRsaW5nLgotCi1Nb24gT2N0IDI1IDExOjE3OjU4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChidWlsZF9NYnl0ZXMpOiBXcml0ZSB0aGUgcmVsb2NzIHRvIHRoZSBjb3JyZWN0Ci0JYWRkcmVzcy4gKG1kX2Fzc2VtYmxlKTogTWFrZSBlcnJvciBoYW5kbGluZyBhIGJpdCBtb3JlIGdyYWNlZnVsLgotCShtZF9hcHBseV9maXgpOiAgRG9uJ3Qgd2FybiBvbiBub24gYWxpZ25lZCBkaXNwbGFjZW1lbnQuCi0KLQkqIGNvbmZpZy90Yy16OGsuYyAoZ2V0X3NwZWNpZmljLCBidWlsdF9ieXRlcyk6ICBVbmRlcnN0YW5kIGFsbCB0aGUKLQlhc3BlY3RzIG9mIGxkYS4KLQotTW9uIE9jdCAyNSAxMDoyMDozMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBVc2UgIiQ8KiIgc28gVlBBVEggd2lsbCBmaW5kCi0JYXMuaW5mbyogZXZlbiBpZiB0aGV5J3JlIGluICQoc3JjZGlyKSAoZS5nLiwgZm9yIEZTRgotCWRpc3RyaWJ1dGlvbnMpLgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBGb3IgcmVsb2NzIHRoYXQgYXJlIHBjX3JlbGF0aXZlIGFuZAotCXBjcmVsX29mZnNldCBhbmQgbm90IHBhcnRpYWxfaW5wbGFjZSwgYWRqdXN0IHJlbG9jLT5hZGRlbmQgdG8KLQljb21wZW5zYXRlIGZvciBhIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gYnVnLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaDogUmVtb3ZlZCByZW1haW5pbmcgbm9uLUJGRF9BU1NFTUJMRVIgY29kZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jOiBEaXR0by4KLQkodGNfZ2VuX3JlbG9jKTogSW5jbHVkZSBmeF9vZmZzZXQgZm9yIHBjcmVsIGZpeHVwcy4KLQotU3VuIE9jdCAyNCAxNjo0OTowMCAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHgxLmN5Z251cy5jb20pCi0KLQkqIHRjLW1pcHMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIGR3b3JkIHBzZXVkbyBvcC4KLQotRnJpIE9jdCAyMiAyMDo0MDo1NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIG1lc3NhZ2VzLmM6IHJlcGxhY2VkIGFsbCB2YXJpYWJsZXMgY2FsbGVkIEZvcm1hdCB3aXRoICdmb3JtYXQnLAotCSAgZm9yIGNvbnNpc3RlbmN5IHRocm91Z2hvdXQKLQotCSogY29uZmlndXJlLmluOiBoYW5kbGUgbWlwcyotIGluc3RlYWQgb2YgbWlwcywgbWlwcyplbCBmb3IgbGl0dGxlCi0JZW5kaWFuIGNvbmZpZ3VyYXRpb25zCi0KLUZyaSBPY3QgMjIgMTQ6NDU6NDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpbnB1dC1zY3J1Yi5jIChwaHlzaWNhbF9pbnB1dF9maWxlLCBsb2dpY2FsX2lucHV0X2ZpbGUsCi0JcGh5c2ljYWxfaW5wdXRfbGluZSwgbG9naWNhbF9pbnB1dF9saW5lKTogTWFkZSBzdGF0aWMuCi0JKGFzX3doZXJlKTogUmV0dXJuIGN1cnJlbnQgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciwgZG9uJ3QgcHJpbnQKLQl0aGVtIG91dC4KLQkqIG1lc3NhZ2VzLmMgKGFzX3Nob3dfd2hlcmUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLiAgT3RoZXIKLQlmdW5jdGlvbnMgdXNlIGl0IGluc3RlYWQgb2YgYXNfd2hlcmUuCi0JKGFzX2JhZF9pbnRlcm5hbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFzX2JhZCk6IFVzZSBhc19iYWRfaW50ZXJuYWwuCi0JKGFzX2JhZF93aGVyZSk6IE5ldyBmdW5jdGlvbiwgbGlrZSBhc19iYWQgYnV0IHRha2luZyBhIGZpbGUgbmFtZQotCWFuZCBsaW5lIG51bWJlci4KLQkqIGFzLmggKGFzX2JhZF93aGVyZSk6IERlY2xhcmUuCi0JKGFzX3doZXJlKTogQ2hhbmdlIHByb3RvdHlwZSBmb3IgbmV3IGFyZ3VtZW50cy4KLQkqIHdyaXRlLmggKGZpeFMpOiBBZGRlZCBmaWVsZHMgZnhfZmlsZSBhbmQgZnhfbGluZS4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBTYXZlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGluIGZpeC4KLQkoZml4dXBfc2VnbWVudCk6IFVzZSBhc19iYWRfd2hlcmUsIG5vdCBhc19iYWQuCi0JKiBpbnB1dC1maWxlLmMgKGZfaW4sIGZpbGVfbmFtZSk6IE1hZGUgc3RhdGljLgotCSogY29uZC5jIChzdHJ1Y3QgZmlsZV9saW5lKTogSnVzdCB1c2UgZmlsZSBhbmQgbGluZSBmaWVsZHMuCi0JKHNfZWxzZSk6IFVzZSBhc193aGVyZSBhbmQgYXNfYmFkX3doZXJlLCBub3QgZ2V0X2ZpbGVfbGluZSBhbmQKLQlzZXRfZmlsZV9saW5lLgotCShnZXRfZmlsZV9saW5lLCBzZXRfZmlsZV9saW5lKTogUmVtb3ZlZC4KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19uZXdsaW5lKTogVXNlIGFzX3doZXJlLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogVXNlIGFzX3doZXJlLgotCSogY29uZmlnL29iai1lY29mZi5jIChhZGRfZmlsZSk6IFVzZSBhc193aGVyZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24pOiBVc2UgYXNfd2hlcmUuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMik6IFVzZSBhc19iYWRfd2hlcmUuCi0JKiBjb25maWcvdGMtbWlwcy5jICh0Y19nZW5fcmVsb2MpOiBVc2UgYXNfYmFkX3doZXJlLCBub3QgYXNzZXJ0LgotCi1UaHUgT2N0IDIxIDEyOjUyOjAxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5oOiBEb24ndCBkZWZpbmUgUkVHSVNURVJfUFJFRklYIG9yCi0JT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYIGlmIGVpdGhlciBpcyBhbHJlYWR5IGRlZmluZWQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBEZWxldGUgc29tZSBjb2RlIGluICIjaWYgMCIuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGJmZF9nYXMgZm9yIGFsbCBzcGFyYyB0YXJnZXRzLiAgQWRkZWQgZmFjaWxpdHkKLQlmb3Iga2VlcGluZyBvciByZWplY3RpbmcgY29uZmlndXJhdGlvbnMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQ7Ci0JZGVmYXVsdCBpcyB0byBhc3N1bWUgcHJvZHVjdGlvbiBlbnZpcm9ubWVudCwgYW5kIHJlamVjdCBjb25maWdzCi0Jc3RpbGwgYmVpbmcgd29ya2VkIG9uLiAgTWFyayBFbGYgY29uZmlndXJhdGlvbnMgKGV4Y2VwdCBzcGFyYyBhbmQKLQlpMzg2KSBhcyBkZXZlbG9wbWVudGFsLiAgRGVsZXRlZCBjYXNlcyBtYXRjaGluZyBzb21lIGdlbmVyaWMgbmFtZXMKLQlpbiBmYXZvciBvZiBtb3JlIHNwZWNpZmljIG5hbWVzLiAgKEUuZy4sIHdoZW4gd2UgZ2V0IEFscGhhCi0Jc3VwcG9ydCwgd2UnbGwgc3RpbGwgb25seSBzdXBwb3J0IFZNUyBmb3IgVmF4LikKLQotCSogY29uZmlnL3RjLXNwYXJjLmggKG1kX2VuZCk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9lbmQpOiBGdW5jdGlvbiBkZWxldGVkLgotCShCRkRfUkVMT0NfKik6IERlbGV0ZSBtYWNyb3MgdGhhdCB1c2VkIHRvIGhlbHAga2VlcCB0aGUgbm9uLWJmZAotCXZlcnNpb24gY29tcGlsaW5nLiAgQWxsIHNwYXJjIHRhcmdldHMgd2lsbCB1c2UgYmZkIG5vdy4KLQkqIHRjLmggKG1kX2VuZCk6IERvbid0IGRlY2xhcmUgaWYgaXQncyBkZWZpbmVkIGFzIGEgbWFjcm8uCi0KLQlDaGFuZ2VzIGZyb20gSmVmZiBMYXcgYW5kIFBldGVyIEhvb2dlbmJvb206Ci0KLQkqIHJlYWQuYyAobmV4dF9jaGFyX29mX3N0cmluZyk6IExpbWl0IG9jdGFsIGNoYXJhY3RlciBjb25zdGFudHMgdG8KLQl0aHJlZSBkaWdpdHMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmg6IE1ham9yIGNsZWFudXAuICBVc2UgR05VLXN0eWxlIGNvbW1lbnRzLiAgV2FybgotCWFnYWluc3QgcGxhY2luZyBhZGRpdGlvbmFsIG9iamVjdC1maWxlIGRlcGVuZGVudCBjb2RlIGhlcmUuICBXYXJuCi0JYWdhaW5zdCBjb250YW1pbmF0aW5nIGFsbCBvZiBHQVMgd2l0aCB0aGUgaW50ZXJuYWxzIG9mIHRjLWhwcGEuYwotCXRocm91Z2ggaW5jbHVzaW9uIG9mIHRjLWhwcGEuaC4gIERlbGV0ZSBhbGwgZm9yd2FyZCBkZWNsYXJhdGlvbnMKLQlmb3IgZnVuY3Rpb25zIG9ubHkgdXNlZCB3aXRoaW4gdGMtaHBwYS5jLCBsaWtld2lzZSBmb3Igc3RydWN0dXJlcywKLQl2YXJpYWJsZXMsIGFuZCAjZGVmaW5lcy4gIFRyeSB0byBncm91cCBPQkpfRUxGIGFuZCBPQkpfU09NCi0JY29uZGl0aW9uYWwgY29kZSBpbiBhIGZldyBzbWFsbCBwbGFjZXMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IE1ham9yIGNsZWFudXAuICBVc2UgR05VLXN0eWxlIGNvbW1lbnRzLiAgR3JvdXAKLQlzdHJ1Y3R1cmVzLCBnbG9iYWwgdmFyaWFibGVzLCBmb3J3YXJkIGRlY2xhcmF0aW9ucyB0b2dldGhlci4KLQlSZWR1Y2UgKG9yIGluIHNvbWUgY2FzZXMgZWxpbWluYXRlKSBPQkpfRUxGIGFuZCBPQkpfU09NCi0JY29uZGl0aW9uYWwgY29kZSAtLSB0cnkgdG8gZ3JvdXAgY29uZGl0aW9uYWwgY29kZSB0b2dldGhlcgotCWludG8gYSBmZXcgcGxhY2VzLiAgIE1ha2UgYWxsIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIHdoaWNoCi0JYXJlIG9ubHkgdXNlZCB3aXRoaW4gdGMtaHBwYS5jIHN0YXRpYy4gIFBBUkFNaXplIGFsbCBmdW5jdGlvbnMuCi0JQWRkIGNvbW1lbnRzIHRvIGZ1bmN0aW9ucy4gIERlbGV0ZSB1bnVzZWQgZnVuY3Rpb25zLCB2YXJpYWJsZXMsCi0JI2RlZmluZXMsIGV0Yy4gIERlbGV0ZSB1bnVzZWQgbWVtYmVycyB3aXRoaW4gc3RydWN0dXJlcy4gIERlbGV0ZQotCWxkaWw7YmxlIGhhY2tzIC0tIGl0IGlzIGJlbGlldmVkIHRoZXkgd2VyZSBpbnN0YWxsZWQgdG8gd29yawotCWFyb3VuZCBvbGQgZ2FzIGJ1Z3MuICAgQXZvaWQgdXNpbmcgbWl4ZWQgY2FzZSBmb3IgbG9jYWwKLQlmdW5jdGlvbnMsIHZhcmlhYmxlcywgYW5kIHN0cnVjdHVyZXMuICBGaXggZm9ybWF0dGluZyBwcm9ibGVtcwotCW5vdCBmb3VuZCBieSBHTlUtaW5kZW50LiAgQWRkIEZJWE1FIG5vdGljZXMgZm9yIHRoaW5ncyB3aGljaAotCXNob3VsZCBiZSB3b3JrZWQgb24gdGhlIG5lYXIgZnV0dXJlLiAgRGVsZXRlIGxvdHMgb2Ygb2xkCi0JdXNlbGVzcyAoMS4zNiBQQS1TT00pIGNvZGUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IChmaXhfbmV3X2hwcGEpOiBJbml0aWFsaXplIHRoZSBmeF9yX3R5cGUKLQlmaWVsZCBvZiB0aGUgZml4UyBzdHJ1Y3R1cmUuICBOZWVkZWQgdG8gYnVpbGQgdW53aW5kCi0JZGVzY3JpcHRvcnMgY29ycmVjdGx5LgotCi0JKiB3cml0ZS5jOiAoZml4dXBfc2VnbWVudCk6IEFsbG93IGV4cHJlc3Npb25zIHN1Y2ggYXMKLQlzeW0xLXN5bTIrY29uc3QgYXMgbG9uZyBhcyBzeW0yIGlzICRnbG9iYWwkLgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFByb3ZpZGUgYSBob29rIHNvIHRoYXQgYSB0YXJnZXQKLQljcHUgY29uZmlndXJhdGlvbiBjYW4gcmVqZWN0IGNlcnRhaW4gcmVsb2NhdGlvbiByZWR1Y3Rpb25zLgotCSogdGMtaHBwYS5oICh0Y19maXhfYWRqdXN0YWJsZSk6IE5ldyBtYWNyby4gIE9ubHkgYWNjZXB0IHJlbG9jYXRpb25zCi0Jd2hpY2ggZG8gbm90IGludm9sdmUgZnVuY3Rpb24gc3ltYm9scy4KLQotCSogY29uZmlnL3RjLWhwcGEuaDogUmVpbmRlbnQgd2l0aCBHTlUtaW5kZW50LiAgRGVsZXRlIHJlZmVyZW5jZXMKLQl0byBPQkpfT1NGUk9TRS4gIEZpeCB0eXBvcyAoT0JKX1NPTUUgLT4gT0JKX1NPTSkuICBEZWxldGUgdW51c2VkCi0JU1RBQl9GSVhVUCBtYWNyby4KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXhfMSk6IFVzZSBlbGZfc3ltYm9sX3R5cGUsIGluc3RlYWQKLQlvZiBlbGYzMl9zeW1ib2xfdHlwZS4KLQkocGFfZXhwb3J0X2FyZ3MpOiBMaWtld2lzZS4KLQkoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCShwYV9kZXNjKTogRG8gbm90IGNhbGwgb2JqX2VsZl9kZXNjLiAgKElzIHBhX2Rlc2MgZXZlbiBuZWVkZWQKLQlhbnltb3JlPykKLQkoaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogRG8gbm90IGRlY2xhcmUgZWxmX2dldF9zeW10YWJfbWFwIGFueQotCW9yZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYzogKG1kX3NlY3Rpb25fYWxpZ24pOiBBbGlnbiBhbGwgc2VjdGlvbnMgdG8KLQlhIG11bHRpcGxlIG9mIHRoZSBzZWN0aW9uIGFsaWdubWVudCByYXRoZXIgdGhhbiBhbHdheXMgYQotCW11bHRpcGxlIG9mIDguCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfdGNfc3ltYm9sKTogSWYgdGhlIGFyZ3VtZW50IHJlbG9jYXRpb24KLQliaXRzIGFyZSB6ZXJvIChlZyB0aGV5IHNwZWNpZnkgbm8gcmVsb2NhdGlvbnMpLCB0aGVuIGRvIG5vdCBldmVuCi0JYm90aGVyIGFkZGluZyB0aGVpciBlbnRyaWVzIHRvIHRoZXN5bWV4dG4gc2VjdGlvbi4KLQotVGh1IE9jdCAyMSAxNTo0NDo1NSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wYXJzZV9vcHRpb24pOiBBY2NlcHQgYW5kIGlnbm9yZSAtc3BhcmMKLQlvcHRpb24sIHdoaWNoIGlzIHVzZWQgYnkgdGhlIFN1bk9TIG1ha2UgZGVmYXVsdCAucy5vIHJ1bGUuCi0KLVdlZCBPY3QgMjAgMTI6MjY6MzMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCwgbGFiZWwgImltbWVkaWF0ZSIpOiBDb252ZXJ0IHJlbG9jcwotCW9wZXJhdGluZyBvbiB1cHBlciAzMiBiaXRzIG9mIGltbWVkaWF0ZSBjb25zdGFudHMgdG8gbG93ZXItaGFsZgotCXJlbG9jcyB3aXRoIGFkanVzdGVkIGNvbnN0YW50cy4KLQotVHVlIE9jdCAxOSAxODoxMzoyNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKEFPVVRfTUFDSFRZUEUpOiBEZWZpbmUgdG8gYmUgZXh0ZXJuYWwgdmFyaWFibGUKLQltNjhrX2FvdXRfbWFjaHR5cGUuCi0JKiBjb25maWcvdGMtbTY4ay5jIChvbWFnaWMpOiBSZW1vdmUgb2Jzb2xldGUgYW5kIHVudXNlZCB2YXJpYWJsZS4KLQkobTY4a19hb3V0X21hY2h0eXBlKTogTmV3IHZhcmlhYmxlLCBpZiBPQkpfQU9VVC4KLQkobWRfYXNzZW1ibGUpOiBJbml0aWFsaXplIG02OGtfYW91dF9tYWNodHlwZSBiYXNlZCBvbgotCWN1cnJlbnRfYXJjaGl0ZWN0dXJlLCBpZiBPQkpfQU9VVC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZSB0byBvbWFnaWMuCi0KLVRodSBPY3QgMTQgMTY6NTE6MDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wc2V1ZG9fdGFibGUpOiBJZ25vcmUgLmxpdmVyZWcgcHNldWRvLW9wLgotCShzX29wdGlvbik6IElnbm9yZSAub3B0aW9uIE8qIGFuZCAub3B0aW9uIHBpYyouCi0JKHNfZW50KTogU2tpcCB3aGl0ZXNwYWNlIGJldHdlZW4gc3ltYm9sIGFuZCBvcHRpb25hbCBkaWdpdC4KLQkobXlfZ2V0U21hbGxFeHByZXNzaW9uKTogSGFuZGxlICgkeHgpIGNvcnJlY3RseTogYXNzdW1lIDAoJHh4KS4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEFsd2F5cyBhY2NlcHQgJ3gnIGFuZCAnWCcgYXMgZXNjYXBlCi0JY2hhcmFjdGVycyBpbiBzdGF0ZSA2LgotCSogcmVhZC5jIChuZXh0X2NoYXJfb2Zfc3RyaW5nKTogQWNjZXB0IFxYaCogYW5kIFx4aCogd2hlcmUgaCogYXJlCi0JaGV4aWRlY2ltYWwgZGlnaXRzLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXhfMSk6IE1ha2UgY3Jvc3Mgc2VnbWVudCBjYWxscyB3b3JrCi0JZm9yIEVMRiBieSBoYWNraW5nIGFyb3VuZCBiaXphcnJlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gYmVoYXZpb3VyCi0JdGhhdCBJIGRvbid0IGRhcmUgY2hhbmdlLgotCi1UaHUgT2N0IDE0IDExOjMzOjI1IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBjb25maWcvdGMtaTM4Ni5jOiAobWRfYmVnaW4pOiBEbyBub3QgemVybyBzdGF0aWMgYXJyYXlzLiAgRG9uJ3QKLQljYWxsIHN0cmNociBmb3IgZWFjaCBjaGFyYWN0ZXIgdG8gc2VlIGlmIGl0IGlzIGEgc3BlY2lhbCBjaGFyLAotCWluc3RlYWQgYWRkIGEgc2Vjb25kIGxvb3Agb3ZlciBzcGVjaWFsX2NoYXJzLiAgU2V0IGFsaWdubWVudAotCW9mIHRleHQsIGRhdGEgYW5kIGJzcyBzZWN0aW9ucyB0byA0LgotCShwaSwgdGUsIHB0LCBwZSwgcHMpOiBBZGQgZGVjbGFyYXRpb25zIHNvIHRoYXQgREVCVUczODYgY2FuIGJlCi0JdXNlZCBhZ2Fpbi4KLQkocmVsb2MpOiBEb24ndCByZXR1cm4gOCBhbmQgMTYgYml0IG5vbi1QQyByZWxhdGl2ZSByZWxvY2F0aW9ucyBvbgotCUVMRiwgc2luY2UgdGhlIEVMRiBvYmplY3QgZm9ybWF0IGRvZXMgbm90IGhhdmUgdGhlc2UgdHlwZSBvZgotCXJlbG9jYXRpb25zLiAgQ2hhbmdlIHRoZSBhYm9ydCBpbnRvIGFzIGFzX2JhZCBhbmQgcmV0dXJuCi0JQkZEX1JFTE9DX05PTkUgdG8gc2lsZW5jZSBjb21waWxlciB3YXJuaW5ncy4KLQkobWRfYXNzZW1ibGUpOiBLZWVwIHRyYWNrIG9mIHRoZSBpbnN0cnVjdGlvbiBzaXplLiAgQWxsb3cgd2hpdGUKLQlzcGFjZSBiZXR3ZWVuIHRoZSAkIGFuZCB0aGUgY29uc3RhbnQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlcgotCWdhc2VzIGFuZCBvdGhlciBhc3NlbWJsZXJzLgotCShpMzg2X29wZXJhbmQpOiBTa2lwIHNwYWNlcyBiZXR3ZWVuICQgYW5kIGV4cHJlc3Npb24uCi0JKHRjX2dlbl9yZWxvYyk6IERvbid0IGFsbG93IGFueXRoaW5nIGJ1dCAzMiBiaXQgcmVsb2NhdGlvbnMgb24KLQlFTEYuICBDb252ZXJ0IGFib3J0IGludG8gYW4gYXNfYmFkIGFuZCBhc3NlcnQgaW50byBhc19mYXRhbC4KLQotV2VkIE9jdCAxMyAxNjo1MDo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaXh1cF9zZWdtZW50KSBbRElGRl9FWFBSX09LXTogSWYKLQlzdWJfc3ltYm9sUCBpcyBpbiB0aGUgY3VycmVudCBzZWdtZW50LCBjb252ZXJ0IHRvIGEgUEMtcmVsYXRpdmUKLQlmaXh1cCBhbmQgZGlzY2FyZCB0aGUgc3ltYm9sLgotCi1XZWQgT2N0IDEzIDE0OjAwOjAyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogSGFuZGxlIHN0X0VuZCBzeW1ib2wKLQlmb3Igc3RfU3RhdGljUHJvYyBqdXN0IGxpa2Ugc3RfUHJvYy4KLQotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfYWxsX3NlZ21lbnRzKTogTW92ZWQgI2VuZGlmIGZvciBPQkpfQk9VVAotCXNvIHRoYXQgT0JKX0JPVVQgZG9lc24ndCBmb3JnZXQgdG8gYWRqdXN0IGFsbCB0aGUgZnJhZ21lbnRzIGluIHRoZQotCS5ic3Mgc2VjdGlvbi4KLQotVHVlIE9jdCAxMiAxNzoyNjoxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IElmIE9CSl9FTEYsIGluY2x1ZGUgZWxmL21pcHMuaC4KLQkobWlwc19yZWdtYXNrX2ZyYWcpOiBOZXcgc3RhdGljIHZhcmlhYmxlLCBpZiBPQkpfRUxGLgotCShtZF9iZWdpbik6IElmIE9CSl9FTEYsIGNyZWF0ZSAucmVnaW5mbyBzZWN0aW9uIGFuZCBzZXQKLQltaXBzX3JlZ21hc2tfZnJhZyB0byBhIGZyYWcuCi0JKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb24sIGlmIE9CSl9FTEYuICBTZXQKLQltaXBzX3JlZ21hc2tfZnJhZyB0byByZWdpc3RlciBtYXNrIGluZm9ybWF0aW9uLgotCSogY29uZmlnL3RjLW1pcHMuaCAoZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcpOiBOZXcgbWFjcm8sIGRlZmluZWQKLQlpZiBPQkpfRUxGLgotCi1UdWUgT2N0IDEyIDAzOjMzOjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbWVzc2FnZXMuYyAoYXNfZmF0YWwpOiBVc2UgbXluYW1lIHdoZW4gcHJpbnRpbmcgbWVzc2FnZXMuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKG1kX2JlZ2luKTogVXNlIG51bGwgcG9pbnRlciwgbm90IGVtcHR5IHN0cmluZywKLQlhcyBpbml0aWFsICJyZXR1cm4iIHZhbHVlIGluIGNhc2UgaGFzaGluZyBpc24ndCBuZWVkZWQuCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKG1kX2F0b2YpOiBSZXR1cm4gbnVsbCwgbm90IGVtcHR5IHN0cmluZywgb24KLQlzdWNjZXNzLgotCSogY29uZmlnL3RjLWg4MzAwLmMgKG1kX2F0b2YpLCBjb25maWcvdGMtaDg1MDAuYyAobWRfYXRvZiksCi0JY29uZmlnL3RjLWhwcGEuYyAobWRfYXRvZiksIGNvbmZpZy90Yy1pODYwLmMgKG1kX2F0b2YpLAotCWNvbmZpZy90Yy1pOTYwLmMgKG1kX2F0b2YpLCBjb25maWcvdGMtbTg4ay5jIChtZF9hdG9mKSwKLQljb25maWcvdGMtbnMzMmsuYyAobWRfYXRvZiksIGNvbmZpZy90Yy1zaC5jIChtZF9hdG9mKTogRGl0dG8uCi0KLU1vbiBPY3QgMTEgMTY6NDY6MzEgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCWZpeCBmb3IgcHIgMzU3MQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGdldF9zcGVjaWZpYyk6IFNwZWNpYWwgYWN0aW9uIGlmIDggYml0Ci0JYWRkcmVzcyBzZWVuLiAoY2hlY2tfb3BlcmFuZCk6IERvbid0IGNvbXBsYWluIGlmIHRydW5jYXRpbmcgdG9wCi0JYml0cyBvZiBhbiA4IGJpdCBhZGRyZXNzLiAgKGJ1aWxkX2J5dGVzKTogQWxsb3cgYW4gaW1tZWRpYXRlIGFuZAotCWFuIGFic29sdXRlIGluIHRoZSBzYW1lIGluc24uCi0KLU1vbiBPY3QgMTEgMTc6MTg6NTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IERvbid0IGNyYXNoIGlmIHNlZ2luZm8gaXMgTlVMTC4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBXcml0ZSBvdXQgcmVnaXN0ZXIgbWFza3MKLQlieSBtb2RpZnlpbmcgLnJlZ2luZm8gc2VjdGlvbiwgbm90IGJ5IGRpcmVjdGx5IG1vZGlmeWluZyBCRkQKLQliYWNrZW5kIGRhdGEuCi0KLU1vbiBPY3QgMTEgMTQ6MTE6MzIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tc3Vub3MuaDogcmVtb3ZlIGV4dGVybiB0aW1lIGRlY2xhcmF0aW9uCi0KLU1vbiBPY3QgMTEgMTY6MTQ6NDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBtZXNzYWdlcy5jIChhc19mYXRhbCk6IERvIG1lbnRpb24gdGhhdCBpdCdzIHRoZSBhc3NlbWJsZXIgdGhhdAotCWdvdCB0aGUgZmF0YWwgZXJyb3IuCi0KLUZyaSBPY3QgIDggMTQ6MDk6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2dwcm1hc2ssIG1pcHNfY3BybWFzayk6IE5ldyB2YXJpYWJsZXMgdG8KLQlob2xkIHJlZ2lzdGVyIG1hc2tzLgotCShtZF9iZWdpbik6IEluaXRpYWxpemUgdGhlbSB0byB6ZXJvLgotCShhcHBlbmRfaW5zbik6IFVwZGF0ZSBtaXBzX2dwcm1hc2sgYW5kIG1pcHNfY3BybWFzay4gIEFsc28gYWRkCi0JcmVnaXN0ZXIgdmFyaWFibGVzIHBpbmZvIGFuZCBwcmV2X3BpbmZvLgotCSogY29uZmlnL3RjLW1pcHMuaCAobWlwc19ncHJtYXNrLCBtaXBzX2Nwcm1hc2spOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBJZiBUQ19NSVBTLCBzZXQgZ3BybWFzawotCWFuZCBjcHJtYXNrIGZyb20gbWlwc19ncHJtYXNrIGFuZCBtaXBzX2Nwcm1hc2suCi0KLQkqIGNvbmZpZy90Yy1taXBzLmg6IERlZmluZSBUQVJHRVRfRk9STUFUIGlmIE9CSl9FTEYuCi0JKiBjb25maWcvdGMtbWlwcy5jIChHUE9QVCk6IERlZmluZSBpZiBPQkpfRUNPRkYgb3IgT0JKX0VMRi4KLQkodmFyaW91cyk6IENoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byBHUCByZWZlcmVuY2VzIHRvIGFwcGx5IGlmCi0JR1BPUFQsIG5vdCBpZiBPQkpfRUNPRkYuCi0JKHNfY2hhbmdlX3NlYyk6IFJlYXJyYW5nZSBzb21ld2hhdC4gIElmIE9CSl9FTEYsIHVzZSAucm9kYXRhCi0JaW5zdGVhZCBvZiAucmRhdGEuICBJZiBPQkpfRUxGLCBzZXQgc2VjdGlvbiBmbGFncyBmb3IgLnJvZGF0YSBhbmQKLQkuc2RhdGEgc2VjdGlvbnMuCi0JKHNfZnJhbWUsIHNfbG9jLCBzX21hc2spOiBDb21tZW50IG91dCBlbnRpcmUgZnVuY3Rpb25zLCByYXRoZXIKLQl0aGFuIGp1c3QgYm9keS4gIFRoZXkncmUgbm90IHVzZWQgYW55aG93LgotCSogY29uZmlndXJlLmluOiBTZXQgY3B1X3R5cGUgdG8gbWlwcyBmb3IgbWlwcyouICBBY2NlcHQKLQltaXBzLSotZWxmbCogYW5kIG1pcHMtKi1lbGYqLgotCi1UaHUgT2N0ICA3IDE4OjM2OjI5IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2NvbW1vbik6IEFsbG93IHRoZSBhbGlnbm1lbnQgZmllbGQgdG8KLQlub3QgYmUgc3BlY2lmaWVkLgotCi1XZWQgT2N0ICA2IDEzOjAxOjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoY29uc19maXhfbmV3X21pcHMpOiBOZXcgZnVuY3Rpb24uICBUdXJuCi0JQkZEX1JFTE9DXzY0IGludG8gQkZEX1JFTE9DXzMyLgotCSogY29uZmlnL3RjLW1pcHMuaCAoVENfQ09OU19GSVhfTkVXKTogRGVmaW5lLgotCShjb25zX2ZpeF9uZXdfbWlwcyk6IERlY2xhcmUuCi0KLQlDaGFuZ2VzIHRvIGxldCBjb25zIGhhbmRsZSBiaWdudW1zIGxpa2UgZ2VuZXJhbCBleHByZXNzaW9ucy4KLQkqIGV4cHIuaCAoZXhwcmVzc2lvblMpOiBOZXcgZmllbGQgWF91bnNpZ25lZC4KLQkqIGV4cHIuYyAob3BlcmFuZCk6IEluaXRpYWxpemUgWF91bnNpZ25lZCB0byAxLiAgU2V0IGl0IHRvIDAgZm9yCi0JdW5hcnkgbWludXMgY2FzZS4KLQkoZXhwcikgRml4IHR5cG8gcmVzdWx0UCB0byByaWdodCBpZiBtaXNzaW5nIG9wZXJhbmQuICBTZXQKLQlYX3Vuc2lnbmVkIHRvIDEgd2hlbiBidWlsZGluZyBuZXcgZXhwcmVzc2lvbi4KLQkqIHJlYWQuYyAocG90YWJsZSk6IE1ha2UgIm9jdGEiIGFuZCAicXVhZCIgY2FsbCBjb25zLCBub3QKLQliaWdfY29ucy4KLQkoY29ucyk6IEhhbmRsZSBiaWdudW1zLiAgSWYgZ2l2ZW4gYW4gT19jb25zdGFudCAoc21hbGwgaW50ZWdlcikgdG8KLQlmaWxsIGEgYmlnIHNwYWNlLCB0dXJuIGl0IGludG8gYSBiaWdudW0uCi0JKHBhcnNlX2JpdGZpZWxkX2NvbnMpOiBTZXQgWF91bnNpZ25lZCBmaWVsZC4KLQkoYmlnbnVtX2xvdywgYmlnbnVtX2xpbWl0LCBiaWdudW1faGlnaCwgZ3Jvd19iaWdudW0sIGJpZ19jb25zKToKLQlSZW1vdmVkLgotCSogcmVhZC5oIChiaWdfY29ucyk6IFJlbW92ZSBwcm90b3R5cGUuCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogRG9uJ3QgZ2l2ZSBhIHdhcm5pbmcgaWYgYQotCXN5bWJvbCBpbiBleHByX3NlY3Rpb24gY2FuIG5vdCBiZSByZXNvbHZlZC4KLQkoU19TRVRfVkFMVUUpOiBDbGVhciBYX3Vuc2lnbmVkLgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBJZiByZXNvbHZlX3N5bWJvbF92YWx1ZSBmYWlsZWQgb24gYQotCXN5bWJvbCB3ZSBhcmUgd3JpdGluZyBvdXQsIGdpdmUgYSB3YXJuaW5nLgotCSogY29uZmlnL3RjLWg4NTAwLmMgKHBhcnNlX3JlZ2xpc3QpOiBTZXQgWF91bnNpZ25lZC4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IENoYW5nZSAib2N0YSIgYW5kICJxdWFkIiB0bwotCWNhbGwgcGFfY29ucywgbm90IHBhX2JpZ19jb25zLgotCShwYV9iaWdfY29ucyk6IFJlbW92ZS4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKHBhX2JpZ19jb25zKTogUmVtb3ZlIGRlY2xhcmF0aW9uLgotCSogY29uZmlnL3RjLWk5NjAuYyAobWRfcHNldWRvX3RhYmxlKTogQ2hhbmdlICJxdWFkIiB0byBjYWxsIGNvbnMsCi0Jbm90IGJpZ19jb25zLgotCi1UdWUgT2N0ICA1IDEwOjUzOjM2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogZG9jL2FzLnRleGluZm8gKENvcHlpbmcpOiBuZXcgbm9kZSwgdG8gaGFuZGxlIHRoZSByZWNlbnQgY2hhbmdlcwotCWluIHRoZSB0ZXhpbmZvL2dwbC50ZXhpbmZvIGZpbGUKLQotTW9uIE9jdCAgNCAxNzoxMDoxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoYmlnX2NvbnMpOiBIYW5kbGUgIjAiIGNvcnJlY3RseS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBTZXQgdGFyZ2V0X2JpZ19lbmRpYW4gY29ycmVjdGx5LgotCi1Nb24gT2N0ICA0IDE1OjM3OjU3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IE1vZGUgNy4zIG9wZXJhbmQgdXNpbmcgUEMgc2hvdWxkCi0JaGF2ZSBwYy1yZWxhdGl2ZSBmaXh1cC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTW92ZSAiLWsiIGNhc2UgZG93biBuZWFyICItcGljIiBjYXNlLgotCi0JKiBjb25maWd1cmUuaW46IEFscGhhYmV0aXplIGxpc3Qgb2YgY3B1IHR5cGUgYWx0ZXJuYXRpdmVzLiAgRW5hYmxlCi0JT1MgdmFsdWVzIG9mICJsaW51eCplbGYqIiBhbmQgImxpbnV4KmNvZmYqIiB0byBzZWxlY3QgdGhvc2UKLQlmb3JtYXRzLCB3aXRoIGxpbnV4IGVtdWxhdGlvbi4gIERvbid0IGJvdGhlciBjaGVja2luZyBmb3IgdXBwZXItCi0Jb3IgbWl4ZWQtY2FzZSB2ZXJzaW9ucyBvZiAib3NlIi4KLQotVGh1IFNlcCAzMCAxMTowNTozNSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvejhrLmMgKG1kX3BzZXVkb190YWJsZSk6IGFkZCAidW5zZWciLgotCi1XZWQgU2VwIDI5IDE2OjE1OjExIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL204OGstb3Bjb2RlLmggKG04OGtfb3Bjb2Rlcyk6IGNvcnJlY3QgYSBmZXcgbWlzdGFrZXMKLQkgIGZvdW5kIHdoaWxlIGV4dGVuZGluZyB0aGUgZGlzc2Fzc2VtYmxlci4KLQotVHVlIFNlcCAyOCAxMjowMjowNCAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3BsaXQgaTM4NiBMeW54T1Mgb3V0IGZyb20gb3RoZXIgY29mZiB0YXJnZXRzLAotCWFkZCBhIHNwZWNpZmljIEx5bnggZW11bGF0aW9uLgotCUFkZCBtNjhrIEx5bnhPUyB0YXJnZXQuCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBEZWZpbmUgc3BlY2lmaWMgTHlueCB0YXJnZXQgZm9ybWF0LgotCSogY29uZmlnL3RjLW02OGsuYzogRGVmaW5lIHNwZWNpZmljIEx5bnggdGFyZ2V0IGZvcm1hdC4KLQkqIGNvbmZpZy90ZS1seW54Lmg6IE5ldyBmaWxlLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaDogRG9uJ3Qgc2V0IFRBUkdFVF9GT1JNQVQgdG8gYmUKLQkiY29mZi17aTM4NixtNjhrfSIgaWYgVEFSR0VUX0ZPUk1BVCBhbHJlYWR5IGRlZmluZWQuCi0JKElOSVRfU1RBQl9TRUNUSU9OKTogRGVmaW5lLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IEluY2x1ZGUgPHRpbWUuaD4uCi0JKHdyaXRlX29iamVjdF9maWxlKTogTG9vayBmb3IgLnN0YWIgc2VjdGlvbnMgYW5kIGNhbGwKLQlhZGp1c3Rfc3RhYl9zZWN0aW9uLgotCShhZGp1c3Rfc3RhYl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLCBmaWxscyBpbiB0aGUgZmlyc3Qgc3ltYm9sCi0Jb2YgYSBzdGFiIHNlY3Rpb24gd2l0aCBudW1iZXIgb2Ygc3ltYm9scyBhbmQgc3RyaW5nIHRhYmxlIHNpemUuCi0JKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLCBjcmVhdGVzIHRoZSBpbml0aWFsCi0Jc3ltYm9sIGZvciBhIHN0YWIgc2VjdGlvbi4KLQotTW9uIFNlcCAyNyAxNToyMTo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9hdG9mLXZheC5jIChtZF9hdG9mKTogUmV0dXJuIG51bGwgb24gc3VjY2VzcyBpbnN0ZWFkIG9mCi0JZW1wdHkgc3RyaW5nLgotCSogY29uZmlnL2F0b2YtdGFob2UuYyAobWRfYXRvZik6IERpdHRvLgotCSogcmVhZC5jIChmbG9hdF9jb25zKTogRXhwZWN0IGEgbnVsbCBwb2ludGVyIGZvciBzdWNjZXNzLCBub3QgYW4KLQllbXB0eSBzdHJpbmcuCi0KLQkqIGhhc2guYyAoaGFzaF9pbnNlcnQsIGhhc2hfamFtLCBoYXNoX2dyb3cpOiBSZXR1cm4gbnVsbCBwb2ludGVyCi0Jb24gc3VjY2VzcywgaW5zdGVhZCBvZiBlbXB0eSBzdHJpbmcuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCi0JKiBjb25maWcvdGMtdmF4LmM6IFVzZSBQQVJBTVMgaW4gZGVjbGFyYXRpb25zLgotCSh2aXBfb3ApOiBVc2UgTlVMTCBpbnN0ZWFkIG9mIGVtcHR5IHN0cmluZyBmb3Igc3VjY2VzcyBpbiBlcnJvcgotCWFuZCB3YXJuaW5nIGZpZWxkcy4KLQotU3VuIFNlcCAyNiAyMzo0NToyOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAoZXhwcikgW0RJRkZfRVhQUl9PS106IFBlcm1pdCBzdWJ0cmFjdGlvbiBvZiB0d28gc3ltYm9scwotCWluIGRpZmZlcmVudCBkZWZpbmVkIHNlZ21lbnRzLgotCi0JKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogTG9jYWxpemUgImFpbSIgdmFyaWFibGUuICBJZgotCURJRkZfRVhQUl9PSywgZG9uJ3QgaW1wb3NlIGNoZWNrcyBvbiBzeW1ib2wgc2VnbWVudCB0eXBlcy4KLQkoZml4dXBfc2VnbWVudCkgW0RJRkZfRVhQUl9PS106IElmIHN1Yl9zeW1ib2xQIGlzIGluIHRoZSBjdXJyZW50Ci0Jc2VnbWVudCwgY29udmVydCB0byBhIFBDLXJlbGF0aXZlIGZpeHVwIGFuZCBkaXNjYXJkIHRoZSBzeW1ib2wuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGZsYWdfd2FudF9waWMpOiBOZXcgdmFyaWFibGUsIG1vc3RseSBpZ25vcmVkLgotCShtZF9wYXJzZV9vcHRpb24pIFtURV9TVU4zXTogU2V0IGl0IGZvciAiLWsiLgotCShtNjhrX2lwKTogR2VuZXJhdGUgcHJvcGVyIGZpeHVwIGZvciBtb2RlIDcuMy4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKERJRkZfRVhQUl9PSyk6IERlZmluZS4KLQotU2F0IFNlcCAyNSAwNTowODoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHN0cnVjdCBtNjhrX2luY2FudCwgZ2V0b25lLCBnZXR0d28pOiBNb3ZlZAotCWVhcmxpZXIgaW4gdGhlIGZpbGUuCi0JKGluc29wLCBhZGRfZXhwKTogTm93IGRlZmluZWQgYXMgZnVuY3Rpb25zLCBmb3IgcmVhZGFiaWxpdHkuCi0JKGluc29wKTogTm93IHRha2VzIHR3byBhcmd1bWVudHM7IGNhbGxlcnMgY2hhbmdlZC4KLQotRnJpIFNlcCAyNCAxMjozNzo1OSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tODhrLmMgKGdldF9vNik6IG5ldyBmdW5jdGlvbi4KLQkgIChnZXRfYmYsIGdldF9jbXAsIGdldF9jbmQsIGdldF9jciwgZ2V0X2ZjciwgZ2V0X2ltbTE2LCBnZXRfcmVnLAotCSAgZ2V0X3ZlYzksIGdldHZhbCwgZ2V0X3BjciwgY2FsY29wLCBtYXRjaF9uYW1lKTogbWFrZSBzdGF0aWMgYW5kCi0JICBwcm90b3R5cGUuCi0JICAoc19maWxlKTogcmVtb3ZlIGV4dHJhbmVvdXMgZm9yd2FyZCBkZWNsLgotCSAgKG1kX2JlZ2luKTogYWRkIGNvbnN0IHRvIHJldHZhbCBkZWNsLgotCSAgKGNhbGNvcCk6IGNvcGUgd2l0aCBpbnN0cnVjdGlvbnMgd2l0aG91dCBhcmd1bWVudHMuICBIYW5kbGUgJ28nCi0JICB0eXBlIGFyZ3VtZW50LCB0aGUgbzYgZmllbGQgb2YgdGhlIHByb3QgaW5zbi4KLQkgIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IHJldHVybiBhIGR1bW15IHZhbHVlLgotCi0JKiBjb25maWcvbTg4ay1vcGNvZGUuaCAobTg4a19vcGNvZGVzKTogY29tbWVudCBjaGFuZ2U7IG82IGZpZWxkIGlzCi0JICBpbiBiaXRzIDEwIHRocm91Z2ggNy4gIGZsdC5bZHhzXXMgcmVxdWlyZXMgYW4gciByZWdpc3RlciBpbiB0aGUKLQkgIHNlY29uZCBhcmd1bWVudC4gIE5ldyBpbnN0cnVjdGlvbiBsZGEueC4gIE5ldyBpbnN0cnVjdGlvbiBtdWxzCi0JICAoYWxpYXMgZm9yIG11bCkuCi0KLUZyaSBTZXAgMjQgMTM6NDM6MzAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVjdXJzZSBsaWtlIGNsZWFuLgotCSogZG9jL01ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBOZXcgdGFyZ2V0LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IFNldCBCRkQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lCi0JYmFzZWQgb24gTUlQUyBJU0EgbGV2ZWwuCi0KLVRodSBTZXAgMjMgMTc6NTg6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhcy5jIChtYWluKTogImV4aGF1c3RlZCIsIG5vdCAiZXhodWFzdGVkIi4KLQotCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBzeW1ib2wpOiBBZGQgc3lfdXNlZF9pbl9yZWxvYyBmaWVsZC4KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogU2V0IHN5X3VzZWRfaW5fcmVsb2MuCi0JKHdyaXRlX29iamVjdF9maWxlKTogTmV2ZXIgc3RyaXAgc3ltYm9scyB3aXRoIHN5X3VzZWRfaW5fcmVsb2MKLQlzZXQuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IFJld3JvdGUgdG8gaGFuZGxlIGJvdGgKLQlTb2xhcmlzIGFuZCBTVlI0IHN0eWxlIC5zZWN0aW9uIHBzZXVkby1vcHMuCi0JKG9ial9lbGZfaWRlbnQpOiBTZXQgU0VDX1JFQURPTkxZIGZvciAuY29tbWVudCBzZWN0aW9uLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCk6IElmIHRoaXMgaXMgRUxGLCBhbmQgd2UncmUKLQlnZW5lcmF0aW5nIGEgcmVsb2MsIGRvbid0IGFwcGx5IGEgZml4LgotCi1UaHUgU2VwIDIzIDEzOjE2OjU4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHJlbGF4X2FsaWduKTogTm93IHN0YXRpYy4KLQotTW9uIFNlcCAyMCAxOToyMzozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IE1ha2Ugbm9uLXN0YXRpYy4gIE1ha2UKLQlhcmd1bWVudHMgY29uc3QuICBEb24ndCBhbGlnbiBzdHJpbmdzIHRvIDQgYnl0ZSBib3VuZGFyaWVzLgotCSogcmVhZC5oOiBEZWNsYXJlIGdldF9zdGFiX3N0cmluZ19vZmZzZXQuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBTZXQgU0VDX0FMTE9DIGFzIHdlbGwgYXMKLQlTRUNfTE9BRCBmb3IgcHJvZ2JpdHMgc2VjdGlvbi4KLQkob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkoYWRqdXN0X3N0YWJfc2VjdGlvbnMpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKiBjb25maWcvb2JqLWVsZi5oIChJTklUX1NUQUJfU0VDVElPTik6IENhbGwKLQlvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uLgotCShPQkpfUFJPQ0VTU19TVEFCKTogUmVtb3ZlZCBkZWZpbml0aW9uLgotCi1GcmkgU2VwIDE3IDE4OjEyOjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuaCAoU19HRVRfU0laRSk6IERlZmluZS4KLQkob2JqX2Zyb2JfZm9yd2FyZF9zeW1ib2wpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChsaW5lX2NvbW1lbnRfY2hhcnMpOiBJbml0aWFsaXplIGluIGFsbCBjYXNlcy4KLQotVGh1IFNlcCAxNiAxNDoyMzowOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHRjLmg6IERlY2xhcmUgdGNfZ2VuX3JlbG9jIGRpZmZlcmVudGx5IGRlcGVuZGluZyB1cG9uCi0JUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogT25seSBzZXQgZmxhZ3Mgd2hlbiBmaXJzdAotCWNyZWF0aW5nIHRoZSBzZWN0aW9uLgotCi1XZWQgU2VwIDE1IDEyOjE1OjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGEgdHJhcCBpbnN0cnVjdGlvbgotCXdpdGggYSBicmFuY2guCi0KLVR1ZSBTZXAgMTQgMTM6MzE6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2RhdGEsIG9ial9lbGZfdGV4dCk6IE5ldyBmdW5jdGlvbnM7Ci0Jc2V0IHByZXZpb3VzX3NlY3Rpb24gYW5kIHByZXZpb3VzX3N1YnNlY3Rpb24gYW5kIHRoZW4gY2FsbCBzX2RhdGEKLQlhbmQgc190ZXh0LCByZXNwZWN0aXZlbHkuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgZGF0YSBhbmQgdGV4dC4KLQkob2JqX2VsZl9zZWN0aW9uKTogQWRkIFNFQ19MT0FEIHRvIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gb2YKLQlmbGFncy4gIFRyZWF0IC5yb2RhdGExIGxpa2UgLnJvZGF0YS4gIFNldCBTRUNfTE9BRCBhcyB3ZWxsIGFzCi0JU0VDX0FMTE9DIGZvciAiYWxsb2MiIHN0cmluZy4gIERvbid0IGJvdGhlciB0cnlpbmcgdG8gZmluZCB0aGUKLQlzZWN0aW9uOyBqdXN0IHVzZSBzdWJzZWdfbmV3LgotCi0JKiByZWFkLmMgKGNoYW5nZV90b19zZWN0aW9uKTogUmVtb3ZlZC4gIFRoaXMgaXMgbm93IGRvbmUgYnkKLQlzdWJzZWdfbmV3LgotCShnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogUmVhcnJhbmdlZCBzb21ld2hhdC4gIENyZWF0ZSB0aGUgc2VjdGlvbgotCXVzaW5nIHN1YnNlZ19uZXcuICBTdG9yZSB0aGUgc3RyaW5nIGluZGV4IGluIHNlZ19pbmZvLCByYXRoZXIgdGhhbgotCWluIGEgc3RhdGljIHZhcmlhYmxlLiAgRm9yY2UgdGhlIGZpcnN0IHN0cmluZyB0byBiZSBlbXB0eS4gIFVzZQotCWZyYWdfbW9yZSByYXRoZXIgdGhhbiBGUkFHX0FQUEVORF8xX0NIQVIuCi0JKHNfc3RhYl9nZW5lcmljKTogUmV3cm90ZS4KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBBZGRlZCBzdGFidSB1bmlvbi4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ldyk6IEluaXRpYWxpemUgc3RhYl9zdHJpbmdfc2l6ZSB0byAwLgotCSogY29uZmlnL29iai1hb3V0LmM6IERvbid0IGluY2x1ZGUgYW91dC9zdGFiX2dudS5oLgotCShvYmpfYW91dF9zdGFiLCBvYmpfYW91dF9kZXNjKTogUmVtb3ZlZC4KLQkob2JqX3BzZXVkb190YWJsZSk6IFJlbW92ZWQgZGVzYyBhbmQgc3RhYlggZW50cmllcy4KLQkqIGNvbmZpZy9vYmotYm91dC5jOiBTYW1lIGNoYW5nZXMgYXMgY29uZmlnL29iai1hb3V0LmMuCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoU19TRVRfVFlQRSk6IERlZmluZS4KLQkodGNfYm91dF9maXhfdG9fY2hhcnMpOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3N0YWIpOiBSZW1vdmVkLgotCShvYmpfcHNldWRvX3RhYmxlKTogUmVtb3ZlZCBkZXNjIGFuZCBzdGFiWCBlbnRyaWVzLgotCSogY29uZmlnL29iai1jb2ZmLmggKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoY3VycmVudF9zdGFiX3N5bWJvbCk6IFJlbW92ZWQuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCAob2JqX3N5bWJvbF90eXBlKTogUmVtb3ZlZCBuX3N0cngsIG5fdHlwZSwKLQluX290aGVyLCBuX2Rlc2MgYW5kIG5fdmFsdWUgZmllbGRzLgotCShTX3tTLEd9RVRfe09GRlNFVCxPVEhFUixUWVBFLERFU0N9KTogUmVtb3ZlZC4KLQkoTUFLRV9TVEFCX1NZTUJPTCk6IFJlbW92ZWQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9lY29mZl9zdGFiKTogUmVuYW1lZCB0byBlY29mZl9zdGFiLgotCUNoYW5nZWQgYXJndW1lbnRzIGFuZCByZW1vdmVkIHBhcnNpbmcgY29kZS4KLQkob2JqX3BzZXVkb190YWJsZSk6IFJlbW92ZWQgc3RhYlggZW50cmllcy4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoZWNvZmZfc3RhYik6IERlY2xhcmUuCi0JKE9CSl9QUk9DRVNTX1NUQUIpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVsZi5jOiBEb24ndCBpbmNsdWRlIGFvdXQvc3RhYl9nbnUuaC4KLQkob2JqX2VsZl9zdGFiLCBvYmpfZWxmX3hzdGFiLCBvYmpfZWxmX2Rlc2MsCi0JZWxmX3N0YWJfc3ltYm9sX3N0cmluZywgZWxmX3N0YWJfc3ltYm9sLCBvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6Ci0JUmVtb3ZlZC4KLQkob2JqX3BzZXVkb190YWJsZSk6IFJlbW92ZWQgZGVzYywgc3RhYlggYW5kIHhzdGFicyBlbnRyaWVzLgotCShvYmpfZWxmX3ZlcnNpb24pOiBVc2Ugc3Vic2VnX25ldywgbm90IGJmZF9tYWtlX3NlY3Rpb24uICBEb24ndAotCXNldCBTRUNfTE9BRCBmb3IgLm5vdGUgc2VjdGlvbi4KLQkoYWRqdXN0X3N0YWJfc2VjdGlvbnMpOiBHZXQgZnJhZyBwb2ludGVyIGZyb20gc2VnX2luZm8sIHJhdGhlcgotCXRoYW4gbG9va2luZyB0aHJvdWdoIGZyYWdzLgotCSogY29uZmlnL29iai1lbGYuaCAoU197UyxHfUVUX3tPVEhFUixUWVBFLERFU0N9KTogUmVtb3ZlZC4KLQkoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUywgSU5JVF9TVEFCX1NFQ1RJT04sIE9CSl9QUk9DRVNTX1NUQUIpOgotCURlZmluZS4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKG9ial9hb3V0X3N0YWIpOiBSZW1vdmVkLgotCShvYmpfcHNldWRvX3RhYmxlKTogUmVtb3ZlZCBzdGFiWCBlbnRyaWVzLgotCSogY29uZmlnL29iai12bXMuaCAoU19TRVRfVFlQRSk6IERlZmluZS4KLQotCSogYXMuaDogRGVjbGFyZSBsaXN0aW5nLgotCSogcmVhZC5jOiBEb24ndCBkZWNsYXJlIGxpc3RpbmcuCi0JKGVtaXRfZXhwcik6IENhc3QgZml4X25ld19leHAgYXJndW1lbnQuCi0JKHBhcnNlX2JpdGZpZWxkX2NvbnMpOiBDb3JyZWN0IHByaW50ZiBmb3JtYXQuCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgotCSogd3JpdGUuaDogRGVjbGFyZSB0ZXh0X2xhc3RfZnJhZyBhbmQgZGF0YV9sYXN0X2ZyYWcuCi0JKiBjb25maWcvb2JqLWJvdXQuYyAob2JqX2JvdXRfbGluZSk6IEFkZGVkIGR1bW15IGFyZ3VtZW50LgotCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IEFkZCBzb21lIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogY29uZmlnL3RjLWEyOWsuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTk2MC5jOiBMaWtld2lzZS4gIEFsc28gZnVsbHkgYnJhY2tldCBzdHJ1Y3R1cmUKLQlpbml0aWFsaXphdGlvbnMsIGZpeCBwcmludGYgZm9ybWF0cywgYW5kIHJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCi1Nb24gU2VwIDEzIDE2OjQ4OjM4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChzX2Rlc2MpOiBPbmx5IGNvbXBpbGUgYW5kIHVzZSBpZiBTX1NFVF9ERVNDIGlzIGRlZmluZWQuCi0JKiBzdHJ1Yy1zeW1ib2wuaDogRGVjbGFyZSB2ZXJpZnlfc3ltYm9sX2NoYWluIGFuZAotCXZlcmlmeV9zeW1ib2xfY2hhaW5fMiBldmVuIGlmIG5vdCBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTLgotCSogc3ltYm9scy5jICh2ZXJpZnlfc3ltYm9sX2NoYWluKTogUmVtb3ZlZCB1c2VsZXNzIGV4cHJlc3Npb24uCi0JKiB3cml0ZS5jIChoZWFkZXJzLCB0aGVfb2JqZWN0X2ZpbGUpOiBPbmx5IHVzZSBpZiBub3QKLQlCRkRfQVNTRU1CTEVSIGFuZCBub3QgQkZELgotCShmaXh1cF9zZWdtZW50LCBjdnNfZnJhZ190b19maWxsKTogT25seSB1c2UgaWYgQkZEX0FTU0VNQkxFUiBvcgotCW5vdCBCRkQuCi0JKG1lcmdlX2RhdGFfaW50b190ZXh0KTogT25seSB1c2UgaWYgQkZEX0FTU0VNQkxFUiBvciAobm90IEJGRCBhbmQKLQlub3QgT0JKX0FPVVQpLgotCSogd3JpdGUuaDogRGVjbGFyZSByZWxheF9zZWdtZW50LgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHN0YWNrX3BvcCwgc3RhY2tfcHVzaCwgc3RhY2tfaW5pdCk6IE1hZGUKLQlzdGF0aWMuCi0JKHN0YWNrX3RvcCk6IENvbW1lbnRlZCBvdXQsIHNpbmNlIGl0J3Mgbm90IHVzZWQuCi0JRml4ZWQgdXAgcHNldWRvLW9wIGZ1bmN0aW9ucyB0byB0YWtlIGFuIGlnbm9yZWQgaW50IGFyZ3VtZW50LgotCShzaXplX3NlY3Rpb24pOiBBZGRlZCBkZWZhdWx0IEJBRF9DQVNFIHRvIHN3aXRjaC4KLQlDaGFuZ2VkIGJ6ZXJvIGNhbGxzIHRvIG1lbXNldC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oIChTX0lTX0xPQ0FMKTogQ2FsbCBzdHJjaHIgb24gU19HRVRfTkFNRQotCShzKSwgbm90IG9uIHMgaXRzZWxmLgotCSogY29uZmlnL3RjLWEyOWsuYyAoc191c2UpOiBUYWtlIGlnbm9yZWQgaW50IGFyZ3VtZW50LiAgT25seQotCWRlZmluZSBpZiBPQkpfQ09GRiBpcyBub3QgZGVmaW5lZC4KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IChmaXRzX2luX3NpZ25lZF9ieXRlLCBzbWFsbGVzdF9pbW1fdHlwZSk6IE1ha2UKLQlhcmd1bWVudCBzaWduZWQgYWdhaW4uCi0JKiBjb25maWcvdGMtbTY4ay5jIChzX2Jzcywgc19ldmVuLCBzX3Byb2MpOiBUYWtlIGlnbm9yZWQgaW50Ci0JYXJndW1lbnQuCi0JKG02OGtfaXApOiBGdWxseSBicmFja2V0IGluaXRpYWxpemF0aW9uIG9mIGFyY2hzLgotCUNvcnJlY3Qgc2V2ZXJhbCBmb3JtYXRzIGZvciBfX0xJTkVfXyB0byBiZSAlZCByYXRoZXIgdGhhbiAlcy4KLQkoaW5pdF90YWJsZSk6IEZ1bGx5IGJyYWNrZXQgaW5pdGlhbGl6YXRpb24uCi0JQ2FzdCB2YWx1ZXMgbGFyZ2VyIHRoYW4gMHg3ZiBhc3NpZ25lZCB0byBmcl9vcGNvZGUgdG8gY2hhci4KLQotCSogc3Vic2Vncy5jOiBSZW5hbWVkIG5vbi1CRkRfQVNTRU1CTEVSIHN1YnNlZ19uZXcgdG8gc3Vic2VnX3NldC4KLQlXcm90ZSBub24tQkZEX0FTU0VNQkxFUiBzdWJzZWdfbmV3LiAgTm93IHN1YnNlZ19uZXcgYWx3YXlzIHRha2VzIGEKLQlzZWN0aW9uIG5hbWUsIGFuZCBzdWJzZWdfc2V0IGFsd2F5cyB0YWtlcyBhIHNlZ1QuICBDaGFuZ2VkIGFsbAotCWNhbGxlcnMgYXMgYXBwcm9wcmlhdGUuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAgKGNoYW5nZV90b19zZWN0aW9uKTogUmVuYW1lZCB0bwotCW9ial9jb2ZmX2FkZF9zZWdtZW50LiAgQ29ycmVjdGVkLiAgTWFkZSBjYWxsZXJzIHVzZSBzdWJzZWdfbmV3LgotCSogY29uZmlnL29iai1jb2ZmYmZkLmggKG9ial9zZWdtZW50X25hbWUsIG9ial9hZGRfc2VnbWVudCk6Ci0JRGVmaW5lLgotCi1Nb24gU2VwIDEzIDEzOjE1OjAzIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChMT0NBTF9MQUJFTCk6IFJlbW92ZSB0ZXN0IGZvciBuYW1lWzBdID09ICdMJy4KLQotRnJpIFNlcCAxMCAxMToyMjowOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKFNfU0VUX1NJWkUpOiBBY3R1YWxseSBzZXQgdGhlIHNpemUuCi0KLQlHY2MgbGludC4KLQkqIEFkZGVkIGEgbnVtYmVyIG9mIGNhc3RzIHRvIGZ1bmN0aW9uIGNhbGxzLgotCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKSwgYXMuYyAobWFpbiksIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCwKLQlvcGVyYW5kLCBleHByKSwgcmVhZC5jIChyZWFkX2JlZ2luLCBIQU5ETEVfQ09ORElUSU9OQUxfQVNTRU1CTFksCi0JcmVhZF9hX3NvdXJjZV9maWxlLCBzX2FsaWduX2J5dGVzLCBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lLAotCWlnbm9yZV9yZXN0X29mX2xpbmUsIGJpZ19jb25zLCBpc19pdF9lbmRfb2Zfc3RhdGVtZW50LCBzX2lnbm9yZSksCi0JcmVhZC5oIChpc19uYW1lX2JlZ2lubmVyLCBpc19wYXJ0X29mX25hbWUpLCBjb25maWcvb2JqLWVsZi5jCi0JKG9ial9lbGZfc2VjdGlvbiksIGNvbmZpZy90Yy1pMzg2LmMgKHBhcnNlX3JlZ2lzdGVyKSwKLQljb25maWcvdGMtc3BhcmMuYyAoaXNvY3RhbCwgc19wcm9jKTogQ2FzdCBjaGFyCi0JYXJyYXkgaW5kaWNlcyB0byB1bnNpZ25lZCBjaGFyLgotCSogYXBwLmMgKHByb2Nlc3NfZXNjYXBlKTogTWFrZSBzdGF0aWMuICBBZGQgcHJvdG90eXBlLiAgQ2hhbmdlCi0JYXJndW1lbnQgZnJvbSBjaGFyIHRvIGludC4KLQkqIGFzLmM6IEluY2x1ZGUgb3V0cHV0LWZpbGUuaCBmb3IgcHJvdG90eXBlcy4gIENvbW1lbnQgb3V0IHVudXNlZAotCWZ1bmN0aW9uIGdvdF9zaWcuCi0JKiBNYWtlZmlsZS5pbiAoYXMubyk6IERlcGVuZCBvbiBvdXRwdXQtZmlsZS5oLgotCSogYXMuaCAoQkFEX0NBU0UpOiBDYXN0IHZhbCBhcmd1bWVudCB0byBsb25nLCBhbmQgdXNlICVsZC4KLQkocHNldWRvX3R5cGVTKTogQWRkIHByb3RvdHlwZSB0byBwb2NfaGFuZGxlciBmaWVsZC4KLQkocHJpbnRfdmVyc2lvbl9pZCk6IEFkZCBwcm90b3R5cGUuCi0JKHhtYWxsb2MsIHhyZWFsbG9jKTogQ2hhbmdlIHNpemUgYXJndW1lbnRzIHRvIHVuc2lnbmVkIGxvbmcuCi0JKGRvX3NjcnViX25leHRfY2hhcik6IEFkZCBwcm90b3R5cGVzIGZvciBmdW5jdGlvbiBhcmd1bWVudHMuCi0JKGhhZF9lcnJvcnMsIGhhZF93YXJuaW5ncywgc2NydWJfZnJvbV9maWxlKTogUmVtb3ZlIGR1cGxpY2F0ZQotCWRlY2xhcmF0aW9ucy4KLQkqIGF0b2YtZ2VuZXJpYy5jIChhdG9mX2dlbmVyaWMpOiBNYWtlIHNpemUgdmFyaWFibGVzIHVuc2lnbmVkLgotCSogY29uZC5jIChpZ25vcmVfaW5wdXQpOiBSZW1vdmVkIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBwdHIuCi0JKiBleHByLmMgKGZsb2F0aW5nX2NvbnN0YW50LCBpbnRlZ2VyX2NvbnN0YW50KTogTWFrZSBzdGF0aWMuICBBZGQKLQlwcm90b3R5cGVzLgotCSogZmxvbnVtLWNvcHkuYyAoZmxvbnVtX2NvcHkpOiBNYWtlIHNpemUgdmFyaWFibGVzIHVuc2lnbmVkLgotCSogZnJhZ3MuaDogQWRkIHByb3RvdHlwZSBmb3IgZnJhZ19pbml0LgotCSogaGFzaC5oLCBoYXNoLmM6IENoYW5nZSBoYXNoIHZhbHVlcyBmcm9tIGNoYXIgKiB0byBQVFIsIG1ha2UgaGFzaAotCXN0cmluZ3MgY29uc3QsIG1ha2UgcmV0dXJuZWQgZXJyb3Igc3RyaW5ncyBjb25zdCBjaGFyICouICBBZGRlZAotCXByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucy4KLQkqIGlucHV0LWZpbGUuaCwgaW5wdXQtZmlsZS5jIChpbnB1dF9maWxlX2J1ZmZlcl9zaXplKTogUmV0dXJuCi0JdW5zaWduZWQgaW50LgotCSogaW5wdXQtc2NydWIuYyAoYnVmZmVyX2xlbmd0aCk6IE1ha2UgdW5zaWduZWQuCi0JKGlucHV0X3NjcnViX3B1c2gsIGlucHV0X3NjcnViX3BvcCk6IE1ha2Ugc3RhdGljLgotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IENhc3Qgc3ByaW50ZiBhcmd1bWVudCB0byB1bnNpZ25lZAotCWxvbmcgYW5kIHVzZSAlbHguICBQcmludCBuYW1lIG9mIHNlZ21lbnQgcmF0aGVyIHRoYW4gYWRkcmVzcyBvZgotCXN0cnVjdHVyZS4KLQkobGlzdGluZ19saXN0LCBsaXN0aW5nX3RpdGxlKTogQ2hhbmdlIGFyZ3VtZW50IHRvIGludC4KLQkobGlzdGluZ19lamVjdCwgbGlzdGluZ19mbGFncywgbGlzdGluZ19wc2l6ZSk6IEFkZCBpbnQgYXJndW1lbnQuCi0JKiBsaXN0aW5nLmg6IENvcnJlc3BvbmRpbmcgZGVjbGFyYXRpb24gY2hhbmdlcy4KLQkqIG9iai5oIChvYmpfZW1pdF9zeW1ib2xzKTogUmVuYW1lIHByb3RvdHlwZSBhcmd1bWVudCB0byBhdm9pZAotCXNoYWRvd2luZy4KLQkqIHJlYWQuaDogQ2hhbmdlIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uIHByb3RvdHlwZSB0byByZXR1cm4KLQlvZmZzZXRULiAgQWRkIHByb3RvdHlwZSBmb3IgbmV4dF9jaGFyX29mX3N0cmluZy4gIFZhcmlvdXMKLQlwcm90b3R5cGUgY2hhbmdlcy4KLQkqIHJlYWQuYzogUmVtb3ZlIHByb3RvdHlwZSBmb3IgbmV4dF9jaGFyX29mX3N0cmluZy4KLQkocG9iZWdpbik6IE1ha2UgZXJydHh0IGNvbnN0LiAgTWFrZSBuZXdfbGVuZ3RoLCB0bXBfbGVuIGFuZCBudW0KLQl1bnNpZ25lZC4KLQkoc19hYm9ydCwgc19hbGlnbl9wdHdvLCBzX2NvbW0sIHNfZGF0YSwgc19hcHBfbGluZSwgc19maWxsLAotCXNfZ2xvYmwsIHNfbHN5bSwgc19vcmcsIHNfc2V0LCBzX3RleHQsIHNfZGVzYyk6IEFkZCBpbnQgYXJndW1lbnQuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShzX2NvbW0pOiBDaGFuZ2UgdGVtcCBmcm9tIHZhbHVlVCB0byBvZmZzZXRULiAgQ2FzdCB0byBsb25nIHdoZW4KLQlwcmludGluZyBhbmQgdXNlICVsZCAob25seSBmb3IgZXJyb3IgbWVzc2FnZXMgYW55aG93KS4KLQkoc19sb25nLCBzX2ludCk6IFJlbW92ZSB1bnVzZWQgZnVuY3Rpb25zLgotCShjb25zKTogQ2hhbmdlIGFyZ3VtZW50IHRvIGludC4KLQkoZW1pdF9leHByKTogVXNlICVseCB3aGVuIHByaW50aW5nIGxvbmdzLgotCShnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbik6IFJldHVybiBvZmZzZXRULCBub3QgbG9uZy4KLQkoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IENvbW1lbnQgb3V0IHVubGVzcwotCVNFUEFSQVRFX1NUQUJfU0VDVElPTlMuCi0JKHNfc3RhYl9nZW5lcmljKTogUmVtb3ZlIHVudXNlZCBvZmZzZXQuICBEZWZpbmUgc2VnX2lzX25ldyBvbmx5Ci0JaWYgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUy4gIFVzZSB0b1Agb25seSBpbiBsb2NhbCBibG9jay4KLQkqIHN0cnVjLXN5bWJvbC5oICh2ZXJpZnlfc3ltYm9sX2NoYWluXzIpOiBBZGQgcHJvdG90eXBlLgotCSogc3ltYm9scy5jOiBSZW1vdmUgbmVzdGVkIGNvbW1lbnQuCi0JKHN5bWJvbF9uZXcpOiBSZW5hbWUgdmFsdWUgdG8gdmFsdS4KLQkoY29sb24pOiBVc2UgJWxkIGFuZCBjYXN0IHRvIGxvbmcgaW4gZXJyb3IgbWVzc2FnZS4KLQkqIHN5bWJvbHMuaDogUmVtb3ZlIGR1cGxpY2F0ZSB2ZXJpZnlfc3ltYm9sX2NoYWluIGRlY2xhcmF0aW9uLgotCSogdGMuaDogUmVtb3ZlIHVudXNlZCBtZF9lbWl0X3JlbG9jYXRpb25zIGRlY2xhcmF0aW9uLgotCSh0Y19nZW5fcmVsb2MpOiBBZGQgZGVjbGFyYXRpb24uCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogQ2hhbmdlIGZpcnN0IGFyZ3VtZW50IG5hbWUgZGVwZW5kaW5nCi0Jb24gQkZEX0FTU0VNQkxFUi4KLQkod3JpdGVfcmVsb2NzKTogUmVtb3ZlIHVudXNlZCBvZmZzZXQsIGZyYWdzLiAgUmVtb3ZlIHRjX2dlbl9yZWxvYwotCWRlY2xhcmF0aW9ucy4gIE1ha2UgbiB1bnNpZ25lZC4KLQkod3JpdGVfY29udGVudHMpOiBSZW1vdmUgdW51c2VkIGksIG4sIHJlbG9jcywgZml4cC4gIFJlbmFtZSBmcmFncwotCXRvIGYgdG8gYXZvaWQgc2hhZG93aW5nLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IERlZmluZSBmcmFnUCBvbmx5IGlmIG5vdCBCRkRfQVNTRU1CTEVSIG9yIG5vdAotCVdPUktJTkdfRE9UX1dPUkQuICBSZW1vdmUgdW51c2VkIGtlZXAuICBPbmx5IGRlY2xhcmUgcHVudCBhbmQKLQlwdW50X2l0IGlmIHRoZXkgd2lsbCBiZSB1c2VkLiAgTWFrZSBpIGFuZCBuIHVuc2lnbmVkLgotCShmaXh1cF9zZWdtZW50KTogQ2FzdCB0byBsb25nIGFuZCB1c2UgJWxkIGluIGVycm9yIG1lc3NhZ2UuCi0JKiB4bWFsbG9jLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogTWFrZSBzaXplIGFyZ3VtZW50IHVuc2lnbmVkLgotCSogY29uZmlnL29iai1hb3V0Lmg6IFJlbW92ZSBuZXN0ZWQgY29tbWVudC4gIEFkZCBwcm90b3R5cGUgZm9yCi0Jb2JqX2FvdXRfZnJvYl9zeW1ib2wuCi0JKG9ial9hb3V0X2xpbmUsIG9ial9hb3V0X2Rlc2MpOiBBZGQgaW50IGFyZ3VtZW50LgotCSogY29uZmlnL29iai1lY29mZi5jOiBDaGFuZ2VkIGJ1aWxkIHJvdXRpbmVzIHRvIHVzZSBhbiB1bnNpZ25lZAotCW9mZnNldC4KLQkoYWRkX3N0cmluZyk6IE1ha2UgbGVuIHVuc2lnbmVkIGxvbmcuCi0JKG9ial9lY29mZl9zdGFiKTogVXNlICVsdSBpbiBlcnJvciBtZXNzYWdlLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBDb21tZW50IG91dCB1bnVzZWQgbGFiZWwKLQlhbGxvY2F0ZV9ic3MuCi0JKG9ial9lbGZfZnJvYl9zeW1ib2wpOiBSZXR1cm4gMCAoY3VycmVudGx5IGJyb2tlbikuCi0JKG9ial9lbGZfZGVzYywgb2JqX2VsZl92ZXJzaW9uLCBvYmpfZWxmX3NpemUsIG9ial9lbGZfdHlwZSwKLQlvYmpfZWxmX2lkZW50LCBvYmpfZWxmX3dlYWssIG9ial9lbGZfbG9jYWwsIG9ial9lbGZfY29tbW9uLAotCW9ial9lbGZfbGluZSwgb2JqX2VsZl9wcmV2aW91cyk6IEFkZCBpbnQgYXJndW1lbnQuCi0JKG9ial9lbGZfd3JpdGVfc3ltYm9sX3ApOiBNYWtlIHN0YXRpYy4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9lbGZfd3JpdGVfc3ltYm9sKTogQWRkIHByb3RvdHlwZS4KLQkqIGNvbmZpZy90Yy1ocHBhLmg6IFJlbW92ZSBkZWNsYXJhdGlvbnMgb2YgZnVuY3Rpb25zIGRlY2xhcmVkIGluCi0JcmVhZC5oLgotCSogY29uZmlnL3RjLWkzODYuYyAoRU5DT0RFX1JFTEFYX1NUQVRFKTogQ2FzdCB0byByZWxheF9zdWJzdGF0ZVQuCi0JKHNfYnNzKTogQWRkIGludCBhcmd1bWVudC4KLQkoZml0c19pbl9zaWduZWRfYnl0ZSwgc21hbGxlc3RfaW1tX3R5cGUpOiBNYWtlIGFyZ3VtZW50IHVuc2lnbmVkLgotCShkdW1teSk6IFJlbW92ZSB1bnVzZWQgZnVuY3Rpb24uCi0JKG1kX2Fzc2VtYmxlKTogUmVuYW1lIGxvY2FsIG8gdG8gb3AgdG8gYXZvaWQgc2hhZG93aW5nLgotCSh0Y19nZW5fcmVsb2MpOiBSZW5hbWUgbG9jYWwgcmVsb2MgdG8gcmVsIHRvIGF2b2lkIHNoYWRvd2luZy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfZGF0YTEsIHNfZGF0YTIpOiBBZGQgaW50IGFyZ3VtZW50LgotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCwgbWRfYXBwbHlfZml4KTogQ2FzdCB0byBsb25nIGFuZCB1c2UKLQklbGQgaW4gZXJyb3IgbWVzc2FnZXMuCi0JKiBjb25maWcvdGMtc3BhcmMuYzogUmVtb3ZlIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMuCi0JKGdldEV4cHJlc3Npb24pOiBSZXdyaXRlIGNvbmRpdGlvbiB0byBhdm9pZCBlbXB0eSBjb25kaXRpb25hbAotCWJvZHkuCi0JKHNfcmVnLCBzX3Byb2MsIHNfcmVzZXJ2ZSwgc19jb21tb24sIHNfc2VnLCBzX3h3b3JkKTogQWRkIGludAotCWFyZ3VtZW50LgotCi1UaHUgU2VwICA5IDE3OjEwOjAwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgZnJvbSBKZWZmIExhdzoKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXNzZW1ibGUpOiBGaXggdHlwby4KLQkocGFfaXApOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlcyBhbmQgbGFiZWxzLiAgRG8gbm90IGNoZWNrIGZvcgotCXVuc2lnbmVkIHZhbHVlcyBiZWluZyA8IDAsIGl0IGNhbid0IGhhcHBlbi4KLQkoaXNfc2FtZV9mcmFnKTogUmV0dXJuIGEgdmFsdWUgaW4gcmVjdXJzaXZlIGNhbGwgY2FzZS4KLQkocGFfY2FsbGluZm8pOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlcyBhbmQgbGFiZWxzLgotCShwYV9jb21tKTogTGlrZXdpc2UuCi0JKHBhX2NvcHlyaWdodCk6IExpa2V3aXNlLgotCShwYV9leHBvcnQpOiBMaWtld2lzZS4KLQkocGFfaW1wb3J0KTogTGlrZXdpc2UuCi0JKHBhX3BhcmFtKTogTGlrZXdpc2UuCi0JKHBhX3NwYWNlKTogTGlrZXdpc2UuCi0JKHBhX3N1YnNwYWNlKTogTGlrZXdpc2UuCi0KLVRodSBTZXAgIDkgMTU6MDU6MzQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGdldF9zdGFiX3N0cmluZ19vZmZzZXQsIHNfc3RhYl9nZW5lcmljKTogSWYKLQlCRkRfQVNTRU1CTEVSLCBjYWxsIHN1YnNlZ19zZXQgcmF0aGVyIHRoYW4gc3Vic2VnX25ldy4KLQotV2VkIFNlcCAgOCAxNTowOToxNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IFNldCBTRUNfTE9BRCB3aGVuIHVzaW5nCi0JZGVmYXVsdCBmbGFnIHZhbHVlcy4KLQotVHVlIFNlcCAgNyAxMDoyMjo1MiAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYzogKGNoYW5nZV90b19zZWN0aW9uKTogRG9uJ3QgaW5jbHVkZSBib2R5IGlmIG5vdCBNQU5ZX1NFQ1RJT05TLgotCi0JKiByZWFkLmM6IChzX3N0YWIsIHNfeHN0YWIsIHNfZGVzYyk6IE5ldyBmdW5jdGlvbnMgdG8gcGFyc2UKLQl2YXJpb3VzIHN0YWItcmVsYXRlZCBkaXJlY3RpdmVzLgotCSogcmVhZC5oOiAoc19zdGFiLCBzX3hzdGFiLCBzX2Rlc2MpOiBOZXcgZnVuY3Rpb24gcHJvdG90eXBlcy4KLQkqIHdyaXRlLmM6IChtZXJnZV9kYXRhX2ludG9fdGV4dCk6IEZpeCBpZmRlZiB0YW5nbGUuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoY3VycmVudF9zdGFiX3N5bWJvbCk6IEZha2Ugc3ltYm9sCi0JZm9yIHN0YWIgcmVhZGVyIHRvIHVzZS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZGguaCAob2JqX3N5bWJvbF90eXBlKTogQWRkZWQgZmllbGRzIGZvcgotCXN0YWIgcmVhZGVyLCBtYWNyb3MgdG8gYWNjZXNzLgotCi1GcmkgU2VwICAzIDE2OjQ0OjAzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuaCAoZWxmX3N5bWJvbCk6IE5vIGxvbmdlciBzcGVjaWFsLWNhc2VkIG9uCi0Jc3BhcmN2OSwgc2luY2UgZWxmX3N5bWJvbF90eXBlIGlzIG5vdyBpbmRlcGVuZGVudCBvZiBzaXplLgotCi0JKiBjb25maWcvb2JqLWVsZi5oIChlbGZfc3ltYm9sKTogRml4ZWQgbmFtZSBvZiBlbGZfc3ltYm9sX3R5cGUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKHN0cnVjdCBkZWZhdWx0X3N1YnNwYWNlX2RpY3QsIHN0cnVjdAotCWRlZmF1bHRfc3BhY2VfZGljdCk6IEZpZWxkICJzb3J0IiBpcyBub3cgdW5zaWduZWQgY2hhci4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZGVmX3N1YnNwYWNlcywgcGFfZGVmX3NwYWNlcyk6IEFsaWduCi0JY29sdW1ucyBmb3IgZWFzaWVyIHJlYWRpbmcuCi0JKGJjbXAsIGluZGV4KTogRGVsZXRlZCBVU0ctc3BlY2lmaWMgZGVmaW5pdGlvbnMuICBTaG91bGQgYmUgZGVhbHQKLQl3aXRoIGluIGhvLSouaCwgb3IgaW4gbGliaWJlcnR5LiAgQ2hhbmdlZCBtZW50aW9uIG9mIGluZGV4IHRvCi0Jc3RyY2hyLgotCShsYWJlbF9zeW1ib2xQLCBsYWJlbF9zeW1ib2xfZGVmaW5lZCwgY2FsbGluZm9fZm91bmQsCi0Jd2l0aGluX2VudHJ5X2V4aXQsIGV4aXRfcHJvY2Vzc2luZ19jb21wbGV0ZSwgd2l0aGluX3Byb2NlZHVyZSwKLQlwYV9kZWZfc3Vic3BhY2VzLCBwYV9kZWZfc3BhY2VzLCBwYV9wc2V1ZG9fb3BfbW92ZXNfcGMsCi0JbGFiZWxfc3ltYm9sc19yb290UCwgcGFfZ2V0X2xhYmVsLCBwYV9sYWJlbF9pc19kZWZpbmVkLAotCXBhX3VuZGVmaW5lX2xhYmVsKTogTm93IHN0YXRpYy4KLQkobW92ZXJzKTogTm93IGNvbnN0LCBpbiBhZGRpdGlvbiB0byBwb2ludGluZyB0byBjb25zdCBkYXRhLgotCSogY29uZmlnL3RjLWhwcGEuaCAobGFiZWxfc3ltYm9sU19yb290UCwgcGFfZ2V0X2xhYmVsLAotCXBhX2xhYmVsX2lzX2RlZmluZWQsIHBhX3VuZGVmaW5lX2xhYmVsLCBwYV9wc2V1ZG9fb3BfbW92ZXNfcGMpOgotCURlbGV0ZSBkZWNsYXJhdGlvbnMuCi0KLQlNZXJnZWQgbW9yZSBjaGFuZ2VzIGZyb20gSmVmZiBMYXcgYW5kIFBldGUgSG9vZ2VuYm9vbToKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZGVmX3N1YnNwYWNlcywgcGFfZGVmX3N1YnNwYWNlcyk6IFJlbW92ZQotCWVudHJpZXMgZm9yIC5zdGFiIGFuZCAuc3RhYnN0ci4KLQotCSogY29uZmlnL29iai1lbGYuYzogKGVsZl9zdGFiX3N5bWJvbF9zdHJpbmcpOiAgU2V0IHRoZQotCVNFQ19MT0FEIGF0dHJpYnV0ZSBmb3IgdGhlIC5zdGFic3RyIHNlY3Rpb24uCi0JKG9ial9lbGZfc3RhYl9nZW5lcmljKTogIFNldCB0aGUgU0VDX0xPQUQgYXR0cmlidXRlIGZvciB0aGUKLQkuc3RhYiBzZWN0aW9uLgotCShvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6ICBDaGFuZ2UgJyNpZiAxJyB0byAnI2lmIDAnLgotCShvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6ICBJbmNvcnJlY3QgYnl0ZSBjb3VudCBvbiBjYWxsIHRvCi0JbWRfbnVtYmVyX3RvX2NoYXJzIGZ1bmN0aW9uLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX3RjX3N5bWJvbCk6IFN0YXRpYyBmdW5jdGlvbnMgbmVlZAotCWFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyB0b28uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3N0cmluZ2VyKTogQ29ycmVjdGx5IGhhbmRsZSBlc2NhcGluZwotCWNoYXJhY3RlcnMgd2hpY2ggc2hvdWxkIGFwcGVhciB1bmFsdGVyZWQgaW4gdGhlIG91dHB1dCBzdHJpbmcgKGZvcgotCWV4YW1wbGUgYW4gZXNjYXBlZCBkb3VibGUtcXVvdGUpLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0cik6IEFsd2F5cwotCWluaXRpYWxpemUgbmFtZS4KLQkocGFfcGFyc2VfbmVnX2NtcHN1Yl9jbXBsdHIpOiBMaWtld2lzZS4KLQkocGFfcGFyc2Vfbm9ubmVnX2FkZF9jbXBsdHIpOiBMaWtld2lzZS4KLQkocGFfcGFyc2VfbmVnX2FkZF9jbXBsdHIpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAocGFyc2VfY29uc19leHByZXNzaW9uX2hwcGEpOiBSZW1vdmUgcHJvdG90eXBlCi0JZm9yIG5vdy4KLQkoY29uc19maXhfbmV3X2hwcGEpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IEZpeCB0eXBlIG9mIHZhbHAgdG8gbWF0Y2gKLQlwcm90b3R5cGUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IEluY2x1ZGUgbGliaHBwYS5oLgotCi0JKiBjb25maWcvdGMtaHBwYS5oOiBEZWxldGUgZXh0ZXJuIGRlY2xhcmF0aW9ucyBvZiBmdW5jdGlvbnMKLQlmb3VuZCBpbiBsaWJocHBhLmguCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3NwYWNlKTogUmV3b3JrIHRvIGF2b2lkIHVud2FudGVkICNpZmRlZgotCU9CSl9FTEYgY29uZGl0aW9uYWxzLgotCSogY29uZmlnL3RjLWhwcGEuaCAoTE9DQUxfTEFCRUwpOiBDb3JyZWN0bHkgaWRlbnRpZnkgbG9jYWwgbGFiZWxzCi0Jb24gdGhlIFBBLgotCi1UaHUgU2VwICAyIDEwOjQzOjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBBY2NlcHQgJ3onLCBhbmQgaWdub3JlIGl0LgotCShtYWNybyk6IFVzZSAieixzLHQiIGZvciBkaXYgaW5zdHJ1Y3Rpb25zIHRvIG1hdGNoIGNvcnJlc3BvbmRpbmcKLQljaGFuZ2UgaW4gb3Bjb2RlIHRhYmxlLgotCShtaXBzX2lwKTogQWRkZWQgJ3onLS1tdXN0IGJlIHplcm8gcmVnaXN0ZXIuCi0KLVdlZCBTZXAgIDEgMTU6NTY6NDIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpIFtSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEVdOiBEZWNsYXJlCi0JdGNfZ2VuX3JlbG9jIGNvcnJlY3RseS4KLQotCSogY29uZmlndXJlLmluOiBVc2UgImNhc2UiIGluc3RlYWQgb2YgImlmIiB3aGVuIHBvc3NpYmxlLiAgUmV3cm90ZQotCU1ha2VmaWxlIGVkaXRpbmcgdG8gcmVkdWNlIHdvcmsgZG9uZS4gIFRyZWF0ICJocHBhKiIgYXMgImhwcGEiLgotCi1XZWQgU2VwICAxIDEyOjE5OjA3IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBhZGQgJ2QnIGFzIGFuIGFsaWFzIGZvcgotCSAgc2VjdGlvbiB0eXBlIG9mIGRhdGEuICAnZCcgc2VlbXMgdG8gYmUgdXNlZCBmb3IgbTg4ay4KLQotV2VkIEF1ZyAyNSAyMjozMzoyMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfYWxpZ24sIHNfc3RyaW5nZXIsIHNfY29ucywgc19mbG9hdF9jb25zLAotCXNfbWlwc19zcGFjZSk6IFNldCBpbnNuX2xhYmVsIHRvIE5VTEwgdG8gYXZvaWQgY2hhbmdpbmcgaXQgYXQgdGhlCi0JbmV4dCAuYWxpZ24gc3RhdGVtZW50LgotCShhcHBlbmRfaW5zbik6IERvbid0IHN3YXAgamFsIHdpdGggaW5zdHJ1Y3Rpb24gdGhhdCBzZXRzIHRoZQotCXJlZ2lzdGVyIHRoYXQgamFsIHNldHMuCi0KLVdlZCBBdWcgMjUgMTY6MTU6NTcgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBtODgxMTAuCi0KLVdlZCBBdWcgMjUgMTM6Mzc6NDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JTWVyZ2VkIGNoYW5nZXMgZnJvbSBQZXRlIEhvb2dlbmJvb20gYW5kIEplZmYgTGF3IGF0IFV0YWg6Ci0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBTRUNfQUxMT0Mgc2hvdWxkCi0Jbm90IGJlIG9uIGZvciAuaHBwYV91bndpbmQuCi0JKG1kX3BzZXVkb190YWJsZSk6IC5QQVJBTSBhbmQgLnBhcmFtIGFyZSB2YWxpZCBwc2V1ZG8tb3BzIGZvciBHQVMuCi0JKHBhX3BhcmFtKTogTmV3IGZ1bmN0aW9uIHRvIGhhbmRsZSAuUEFSQU0gZGlyZWN0aXZlcy4KLQkocGFfaXApOiBQYXNzICJpc2JyYW5jaCIgYXJndW1lbnQgZG93biB0byBwYV9wYXJzZV8qX2NvbXBsdHIKLQlmdW5jdGlvbnMuICBIYW5kbGUgJ3wnIGZvciBtb3ZiOyBhbGxvdyBtb3ZiLG4uCi0JKHBhX3BhcnNlX25vbm5lZ19jbXBzdWJfY21wbHRyKTogRGVsZXRlIG9sZCB1c2VsZXNzCi0JdmVyc2lvbi4gIEhhbmRsZSBjYXNlcyB3aGVyZSBubyBjb21wbGV0ZXIgZXhpc3RzIGZvcgotCWNvbWIsbiBvciBhZGRiLG4uCi0JKHBhX3BhcnNlX25lZ19jbXBzdWJfY21wbHRyKTogSGFuZGxlIGNhc2VzIHdoZXJlIG5vCi0JY29tcGxldGVyIGV4aXN0cyBmb3IgY29tYixuIG9yIGFkZGIsbi4gIE1ha2UgbG9naWMKLQltaXJyb3IgdGhhdCBvZiBwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0ci4KLQkocGFfcGFyc2Vfbm9ubmVnX2FkZF9jbXBsdHIpOiBMaWtld2lzZS4KLQkocGFfcGFyc2VfbmVnX2FkZF9jbXBsdHIpOiBMaWtld2lzZS4KLQkqIHRjLWhwcGEuaCAocGFfcGFyYW0pOiBEZWNsYXJlLgotCi1UdWUgQXVnIDI0IDE1OjQxOjM1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV90Y19tYWtlX3N5bWV4dG5fc2VjdGlvbik6IE5vdyBzdGF0aWMuCi0JQWRkZWQgZm9yd2FyZCBkZWNsYXJhdGlvbi4KLQotCU1lcmdlZCBjaGFuZ2VzIGZyb20gUGV0ZSBIb29nZW5ib29tIGFuZCBKZWZmIExhdyBhdCBVdGFoOgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9maWxlKTogQXJndW1lbnRzIHdlcmUgaW5jb3JyZWN0IG9uCi0JY2FsbCB0byBlbGZfdGNfbWFrZV9zZWN0aW9ucy4KLQkob2JqX2VsZl92ZXJzaW9uKTogQSAubm90ZSBzZWN0aW9uIHNob3VsZG4ndCBoYXZlIHRoZSBTRUNfQUxMT0MKLQlhdHRyaWJ1dGUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IEFkZCBzb21lIHByb2Nlc3NpbmcgdG8KLQloYW5kbGUgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9ucy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYnVpbGRfc3ltZXh0bl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uIHRvCi0JY3JlYXRlIGEgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uLgotCShwYV9leHBvcnRfYXJncyk6IE1ha2UgY2FsbCB0byBwYV9idWlsZF9zeW1leHRuX3NlY3Rpb24uCi0JKGhwcGFfdGNfc3ltYm9sLCBocHBhX3RjX21ha2Vfc2VjdGlvbnMsCi0JaHBwYV90Y19tYWtlX3N5bWV4dG5fc2VjdGlvbik6IE5ldyBmdW5jdGlvbnMuCi0JKiBjb25maWcvdGMtaHBwYS5oOiBVcGRhdGUgZWxmX3RjX3N5bWJvbCBhbmQgZWxmX3RjX21ha2Vfc2VjdGlvbnMKLQltYWNyb3MuCi0KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogUGxhY2UgY2hlY2sgZm9yIFRDX0NPTlNfRklYX05FVyBpbiB0aGUKLQlCRkRfQVNTRU1CTEVSIGJyYW5jaCBhcyB3ZWxsLgotCi0JKiBjb25maWcvdGMtaHBwYS5oOiBJZiBFTEYgaXMgdGhlIHRhcmdldCBvYmplY3QgZm9ybWF0LCBkZWZpbmUKLQlzb21lIEVMRi0gYW5kIGhwcGEtc3BlY2lmaWMgdHlwZXMgYW5kIGNvbnN0YW50cy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoZ2V0RXhwcmVzc2lvbik6IEZpeCBhIHR5cG8uCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogVXNlIFRDX0VRVUFMX0lOX0lOU04gdG8gZGV0ZXJtaW5lCi0JaWYgYSBgPScgaXMgcGFydCBvZiBhbiBpbnN0cnVjdGlvbi4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogSGFuZGxlIGNhc2Ugd2hlcmUgZW5kLW9mLWxpbmUgbWFya2VycyBhcmUKLQlhbHNvIHVzZWQgd2l0aGluIGluc3RydWN0aW9ucy4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFRDX0VRVUFMX0lOX0lOU04sIFRDX0VPTF9JTl9JTlNOKTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXhfMSk6IEtlZXAgcmVsb2NhdGlvbnMgZm9yCi0Jb3V0LW9mLXJhbmdlIGJyYW5jaGVzLydjYWxscyB1c2luZyAiYmwiIG9yIGNhbGxzIHdoaWNoIG1heSBuZWVkCi0JYXJndW1lbnQgcmVsb2NhdGlvbiBzdHVicy4gIERvIG5vdCBuZWVkL2tlZXAgcmVsb2NhdGlvbnMgZm9yCi0JY29uZGl0aW9uYWwgYnJhbmNoZXMuCi0JKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcpOiBGaXggY2FsY3VsYXRpb24gb2YgZnVuY3Rpb24gc2l6ZS4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl92ZXJzaW9uKTogTWFyayAubm90ZSBzZWN0aW9uIGFzCi0JUkVBRE9OTFkuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhcnNlX2NvbnNfZXhwcmVzc2lvbl9ocHBhKTogUGFzcyBleHAsIG5vdCB0aGUKLQlhZGRyZXNzIG9mIGV4cCwgdG8gZXhwcmVzc2lvbi4KLQkocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogVHVybiBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgb24uCi0JKG1kX2FwcGx5X2ZpeF8xKTogRGVsZXRlIHVud2FudGVkIGNvbW1lbnRzLgotCShwcm9jZXNzX2V4aXQpOiBTeW1ib2xzIG1hcmtpbmcgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uIGFyZSBhbHdheXMKLQlCU0ZfTE9DQUwuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IEluY2x1ZGUgZWxmMzItaHBwYS5oIGZyb20gQkZEIHRyZWUuCi0JKHBhX3NwYWNlKTogRGVjbGFyZSBhbmQgaW5pdGlhbGl6ZSBnZGJfc2VjdGlvbi4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IENoYW5nZQotCWVsZl90Y19maW5hbF9wcm9jZXNzaW5nX2hvb2sgdG8gZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGZpeF9uZXdfaHBwYSk6IEZpeCBhcmd1bWVudCBsaXN0IHRvIG1hdGNoCi0JYXJndW1lbnQgdHlwZSBkZWNsYXJhdGlvbnMuCi0JKGdldEV4cHJlc3Npb24pOiBGaXggdHlwby4KLQkocGFfZXhwb3J0X2FyZ3MpOiBDaGFuZ2UgZWxmX3N5bWJvbF90eXBlIHRvIGVsZjMyX3N5bWJvbF90eXBlLgotCShlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogTGlrZXdpc2UuICBOYW1lIGNoYW5nZWQgZnJvbQotCWVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmdfaG9vay4KLQkoc3RhcnRfc3ltYm9sX3Jvb3QsIHN0YXJ0X3N5bWJvbF9sYXN0KTogRGVsZXRlZC4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAoVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKTogRml4IHR5cG8uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmg6IFJlcGxhY2UgInN5bWJvbFMiIHdpdGggInN0cnVjdCBzeW1ib2wiIHRvCi0JYXZvaWQgY2hhbmdpbmcgaW5jbHVkZSBvcmRlcmluZy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXAsIGNhc2UgJ3knKTogSGFuZGxlIGp1c3QgbGlrZSAndCcuCi0KLU1vbiBBdWcgMjMgMTI6NDc6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChzZXRfYXQpOiBBZGRlZCB1bnNpZ25lZHAgYXJndW1lbnQuICBVc2UKLQlsb2FkX3JlZ2lzdGVyLgotCShzZXRfYXRfdW5zaWduZWQpOiBSZW1vdmVkOyBjaGFuZ2VkIGNhbGxlcnMgdG8gdXNlIHNldF9hdC4KLQkobG9hZF9yZWdpc3Rlcik6IFJlbW92ZWQgdW51c2VkIGlwIGFyZ3VtZW50LiAgQ2hhbmdlZCBjYWxsZXJzLgotCShhcHBlbmRfaW5zbik6IERvbid0IHN3YXAgYnJhbmNoIGFuZCBicmFuY2ggbGlrZWx5LgotCShtYWNyb19idWlsZCk6IEhhbmRsZSAndScuCi0JKGxvYWRfcmVnaXN0ZXIpOiBIYW5kbGUgNjQgYml0IGNvbnN0YW50cy4KLQkobWFjcm8pOiBBZGRlZCBNX0RBQlMsIHJlbW92ZWQgTV9BQlNVLiAgTnVtZXJvdXMgY2hhbmdlcyB0bwotCXN1cHBvcnQgNjQgYml0IGNvbnN0YW50cy4KLQkobWlwc19pcCk6IFVzZSBoZXggY29uc3RhbnRzIGluIHJhbmdlIGNoZWNrcyBmb3IgY2xhcml0eS4KLQkobWRfbnVtYmVyX3RvX2NoYXJzKTogU3VwcG9ydCA4IGJ5dGUgdmFsdWVzLgotCi1GcmkgQXVnIDIwIDE2OjUwOjU5IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW04OGsuaDogdXBkYXRlZCBjb3B5cmlnaHRzLgotCSAgKFRDX0NPTlNfUkVMT0MpOiBkZWNsYXJlIHRvIGJlIFJFTE9DXzMyLgotCi1GcmkgQXVnIDIwIDExOjE2OjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pc2EpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9iZWdpbik6IEluaXRpYWxpemUgbWlwc19pc2EgYmFzZWQgb24gVEFSR0VUX0NQVS4gIERvbid0IHNhbml0eQotCWNoZWNrIG1hY3Jvcy4gIFNldCB0ZXh0IGFsaWdubWVudCBhbmQgR1Agc2l6ZSBoZXJlLgotCShtZF9hc3NlbWJsZSk6IERvbid0IHNldCB0ZXh0IGFsaWdubWVudCBhbmQgR1Agc2l6ZSBoZXJlLgotCShhcHBlbmRfaW5zbik6IERvbid0IGluc2VydCBOT1BzIGZvciBsb2FkIGRlbGF5cyBpZiBtaXBzX2lzYSA+PSAyLgotCVVzZSB0aGUgcmlnaHQgbWFzayBhbmQgc2hpZnQgZm9yIFdSSVRFX0ZQUl9UIGFuZCBXUklURV9GUFJfUy4gIEFkZAotCWEgTk9QIGFmdGVyIGEgYnJhbmNoIGxpa2VseS4KLQkobWlwc19lbWl0X2RlbGF5cyk6IERvbid0IGluc2VydCBOT1BTIGZvciBsb2FkIGRlbGF5cyBpZiBtaXBzX2lzYQotCT49IDIuCi0JKG1hY3JvKTogU3VwcG9ydCByNjAwMCBhbmQgcjQwMDAgbWFjcm9zLgotCShtaXBzX2lwKTogQ2hlY2sgaW5zbiBJU0EgbGV2ZWwgYWdhaW5zdCBtaXBzX2lzYSBiZWZvcmUgdXNpbmcgaXQuCi0JQWRkZWQgJ3gnIGNhc2UgZm9yIGlnbm9yZWQgcmVnaXN0ZXIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAtbWlwc04gYW5kIC1tY3B1PVhYLgotCi1GcmkgQXVnIDIwIDAxOjI2OjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfcHNldWRvX3RhYmxlKSBbT0JKX0VMRl06IEhhbmRsZSAiLnplcm8iLgotCi1UaHUgQXVnIDE5IDEyOjE1OjE4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfbG9jYWwpOiBGdW5jdGlvbiBtb3ZlZCBhbmQgcmVuYW1lZC4uLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9sb2NhbCk6IC4uLnRvIGhlcmUuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcHNldWRvX3RhYmxlKSwgY29uZmlnL29iai1lbGYuYwotCShvYmpfcHNldWRvX3RhYmxlKTogTW92ZSBoYW5kbGluZyBvZiAiLmxvY2FsIi4KLQotCSogdGMuaCAobWRfcGFyc2Vfb3B0aW9uKTogRG9uJ3QgZGVjbGFyZSBpZiBkZWZpbmVkIGFzIGEgbWFjcm8uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKE5PX1JFTE9DKSBbQkZEX0FTU0VNQkxFUl06IERlZmluZSBhcwotCUJGRF9SRUxPQ19OT05FLgotCShtZF9wYXJzZV9vcHRpb24pOiBOZXcgbWFjcm8sIGNvbnZlcnRlZCBmcm9tIGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfcGFyc2Vfb3B0aW9uKTogRnVuY3Rpb24gZGVsZXRlZC4KLQkoY29tbWVudF9jaGFycykgW09CSl9FTEZdOiBJbmNsdWRlICIvIi4KLQkobGluZV9jb21tZW50X2NoYXJzKSBbT0JKX0VMRiB8fCBURV9JMzg2QUlYXTogRG9uJ3QgaW5jbHVkZSAiLyIuCi0JKG1kX2Fzc2VtYmxlKTogQ2FzdCAweGU5IHRvIGNoYXIgZXhwbGljaXRseSwgdG8gYXZvaWQgY29tcGlsZXIKLQl3YXJuaW5nLgotCShtZF9hc3NlbWJsZSwgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIG1kX2NyZWF0ZV9sb25nX2p1bXApOgotCUNhbGwgcmVsb2MgZm9yIGZpeF9uZXcgdHlwZSwgb3IgdXNlIGNvcnJlY3QgZW51bWVyYXRvciwgaW5zdGVhZCBvZgotCWFsd2F5cyB1c2luZyBOT19SRUxPQy4KLQkoaTM4Nl9vcGVyYW5kKTogQ2hhbmdlICJpZm5kZWYgSTM4NkNPRkYiIHRvICJpZmRlZiBPQkpfQU9VVCIgZm9yCi0JdGVzdHMgZm9yIHZhbGlkIHNlY3Rpb24uCi0JKG1kX2NvbnZlcnRfZnJhZykgW0JGRF9BU1NFTUJMRVJdOiBDb21wZW5zYXRlIGZvciBmcmFnIHN0YXJ0Ci0JYWRkcmVzcy4KLQkobWRfYXBwbHlfZml4XzEpIFtCRkRfQVNTRU1CTEVSXTogRm9yIHBjLXJlbGF0aXZlIHJlbG9jIHdpdGgKLQlzeW1ib2wsIGNvbXBlbnNhdGUgZm9yIGxvY2F0aW9uIG9mIHJlbG9jLgotCShyZWxvYywgQkZEX1JFTE9DXzMyLCBCRkRfUkVMT0NfMzJfUENSRUwpIFshQkZEX0FTU0VNQkxFUl06IERlZmluZQotCXRvIHJldHVybiB6ZXJvLgotCi1XZWQgQXVnIDE4IDE2OjUxOjI5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYzogVW5kZWYgTk9fUkVMT0MgYmVmb3JlIGluY2x1ZGluZyBhb3V0L2FvdXQ2NC5oLgotCShvYmpfZWxmX3dlYWspOiBOZXcgZnVuY3Rpb24uCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBIYW5kbGUgIi53ZWFrIi4KLQkob2JqX2VsZl9zZWN0aW9uKTogSWYgc2VjdGlvbiBkaXJlY3RpdmUgaW5jbHVkZXMgYSBzdHJpbmcsIGlnbm9yZQotCWl0IGZvciBub3cuICBBY2NlcHQgInByb2diaXRzIiBmbGFnLgotCShvYmpfZWxmX3R5cGUpOiBBY2NlcHQgYEAnIGJlZm9yZSBmbGFnIG5hbWUuCi0KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZykgW0JGRF9BU1NFTUJMRVJdOiBHZXQgcmlkIG9mIGBpZigxKScKLQljb25kaXRpb24uCi0JKGZpeHVwX3NlZ21lbnQpIFtCRkRfQVNTRU1CTEVSXTogVXNlIGJmZF9pc19jb21fc2VjdGlvbiwgcmF0aGVyCi0JdGhhbiBjaGVja2luZyBmb3IgYmZkX2NvbV9zZWN0aW9uIGRpcmVjdGx5LgotCShmaXh1cF9zZWdtZW50KTogU2ltcGxpZnkgcmFuZ2UgY2hlY2suCi0JKGZpeHVwX3NlZ21lbnQpIFtPQkpfQ09GRiAmJiBUQ19JOTYwXTogU2ltcGxpZnkgY3BwIGNvbmRpdGlvbgotCXRlc3QuCi0KLQkqIHN5bWJvbHMuaCAoU19TRVRfV0VBSyk6IERlY2xhcmUuCi0JKiBzeW1ib2xzLmMgKFNfU0VUX1dFQUspOiBOZXcgZnVuY3Rpb24uCi0JKFNfU0VUX0VYVEVSTkFMLCBTX0NMRUFSX0VYVEVSTkFMKTogRG9uJ3QgYm90aGVyIHdpdGggQlNGX0VYUE9SVCwKLQlpdCdzIG5vdCBhIHNlcGFyYXRlIGZsYWcgYW55IG1vcmUuICBDbGVhciBCU0ZfV0VBSy4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogVHJlYXQgInN0cmluZyIgbGlrZSAiYXNjaXoiLgotCi1XZWQgQXVnIDE4IDE1OjMwOjI5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGJyYW5jaCBpbnN0cnVjdGlvbnMKLQlpZiAuc2V0IG5vYm9wdCBvciAuc2V0IHZvbGF0aWxlLgotCShncF9yZWZlcmVuY2UpOiAubGl0OCBhbmQgLmxpdDQgYXJlIGFjY2Vzc2VkIHZpYSB0aGUgR1AgcmVnaXN0ZXIuCi0JKG1hY3JvKTogQWRkZWQgY2FzZXMgTV9MSV9TLCBNX0xJX1NTLiAgRml4ZWQgTV9MSV9EIGFuZCBNX0xJX0RELgotCShtaXBzX2lwKTogQWRkZWQgY2FzZXMgJ0YnLCAnTCcsICdmJywgJ2wnIGZvciBmbG9hdGluZyBwb2ludC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYzogUmVuYW1lZCBzb21lIHZhcmlhYmxlcyB0byBhdm9pZCBzaGFkb3cKLQl3YXJuaW5ncy4KLQotTW9uIEF1ZyAxNiAxNDoxNjowMiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTX0lTX0NPTU1PTik6IGFkZCBtaXNzaW5nIGJhY2tzbGFzaAotCi0JKiBjb25maWd1cmUuaW4gKHo4ay0qLXtjb2ZmLHNpbX0pOiB1c2UgY29mZmJmZCBmb3IgdGhpcyB0YXJnZXQKLQotVGh1IEF1ZyAxMiAxMTo0Nzo1OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBTdWdnZXN0ZWQgYnkKLQlkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pOiBEb24ndCBhY2NlcHQgc3ltYm9saWMKLQluYW1lcyBmb3IgJ0UnIGFuZCAnRycgYXJndW1lbnQgdHlwZXMgKGNvcHJvY2Vzc29yIHJlZ2lzdGVycykgYW5kCi0JZG9uJ3Qgd2FybiBpZiAkMSBpcyB1c2VkIG9uIHRoZSBjb3Byb2Nlc3Nvci4KLQkobWFjcm8pOiBIYW5kbGUgTV97TCxTfVdDezAsMiwzfV9BQiBjb3JyZWN0bHkuCi0KLU1vbiBBdWcgIDkgMTI6MDk6MTQgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBVc2UgQkZEX1JFTE9DXzE2IGZvciAyLWJ5dGUgdmFsdWVzLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCwgdGNfZ2VuX3JlbG9jKTogSGFuZGxlCi0JQkZEX1JFTE9DXzE2LgotCSogY29uZmlnL3RjLXNwYXJjLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0KLU1vbiBBdWcgIDkgMTM6MzY6MjIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChtZXJnZV9kYXRhX2ludG9fdGV4dCk6IERlZmluZSBvbmx5IGlmIEJGRF9BU1NFTUJMRVIgaXMKLQlkZWZpbmVkIG9yIEJGRCBpcyBub3QuCi0JKHJlbGF4X2FuZF9zaXplX2FsbF9zZWdtZW50cyk6IERlY2xhcmUgbG9jYWwgdmFyaWFibGUgZnJhZ1AuCi0KLUZyaSBBdWcgIDYgMTU6MjI6NTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4LCBjYXNlIEJGRF9SRUxPQ18zMik6IEZpbGwgaW4KLQlieXRlcyB3aXRoIHJlYWwgdmFsdWVzLCBub3QgemVyb3MuCi0KLUZyaSBBdWcgIDYgMTA6NTc6NTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1yaXNjb3MqLCBtaXBzLSotc3lzdiopOiBOZXcgKHVudGVzdGVkKQotCXRhcmdldHMsIHVzaW5nIGVjb2ZmIGFuZCBtaXBzLWJpZy4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEZyb20gZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZAotCUpvaG5zb24pOiBBZGRlZCBjYXNlIGZvciAnQycgZm9yIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uIGNvZGVzLgotCi1UaHUgQXVnICA1IDEzOjA4OjU2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCwgY2FzZSBCRkRfUkVMT0NfNjQpOiBGaWxsIGluCi0JYnl0ZXMgd2l0aCByZWFsIHZhbHVlcywgbm90IHplcm9zLgotCShtZF9wc2V1ZG9fdGFibGUpOiBDYWxsIGNvbnMgZm9yIC51YXh3b3JkLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfcHNldWRvX3RhYmxlKTogSGFuZGxlICIuOGJ5dGUiLgotCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IFVzZSBCRkRfUkVMT0NfNjQgZm9yIDgtYnl0ZSBleHByZXNzaW9ucy4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBUZXN0IERFQlVHX1NZTVMgaW5zdGVhZCBvZiBERUJVRwotCWZvciB2ZXJpZnlpbmcgc3ltYm9sIGNoYWluLgotCShtZXJnZV9kYXRhX2ludG9fdGV4dCwgcmVsYXhfYW5kX3NpemVfYWxsX3NlZ21lbnRzKTogTmV3Ci0JZnVuY3Rpb25zLCBzcGxpdCBvdXQgZnJvbSB3cml0ZV9vYmplY3RfZmlsZS4KLQotVHVlIEF1ZyAgMyAxNTo0Mzo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc3RhYl9nZW5lcmljLCBpbiBkaXNhYmxlZCBjb2RlKTogSWYKLQlkZWJ1ZyBzZWN0aW9uIGlzIG5ldywgYWxsb2NhdGUgYW4gZXh0cmEgMTIgYnl0ZXMgYXQgaXRzIHN0YXJ0LiAgSWYKLQkiLnN0YWJzIiB0eXBlIGlzIE5fU08sIGZpbGwgaW4gZmlsZW5hbWUgc3ltYm9sIGZpZWxkIG9mIHRoYXQgZmlyc3QKLQllbnRyeS4gIFJldHVybiBlYXJseSBpZiAiZ29vZiIsIHRvIHNpbXBsaWZ5IGxhdGVyIGNvZGUgc2xpZ2h0bHkuCi0JKGFkanVzdF9zdGFiX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfZnJvYl9maWxlKTogQXBwbHkgYWRqdXN0X3N0YWJfc2VjdGlvbnMgdG8gZWFjaCBzZWN0aW9uLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24sIG9ial9lbGZfcHJldmlvdXMpOiBObyBsb25nZXIKLQlzdGF0aWMuCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZWxmX3NlY3Rpb24sIG9ial9lbGZfcHJldmlvdXMpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSk6IENhbGwgdGhlbSBmb3IgInB1c2hzZWN0aW9uIgotCWFuZCAicG9wc2VjdGlvbiIsIGFuZCBjYWxsIGNvbnMgZm9yICJ1YXdvcmQiIGFuZCAidWFoYWxmIi4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl92ZXJzaW9uKTogVXNlIEVuZ2xpc2ggaW4gZXJyb3IKLQltZXNzYWdlcy4KLQotVHVlIEF1ZyAgMyAxMToyOTowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYzogVXBkYXRlZCBmb3IgQkZEIEVDT0ZGIGNoYW5nZXMuICBOb3cgZ2V0cyB0aGUKLQlzd2FwcGluZyByb3V0aW5lcyBhbmQgZXh0ZXJuYWwgc3RydWN0dXJlIHNpemVzIHZpYSB0aGUKLQllY29mZl9iYWNrZW5kIGluZm9ybWF0aW9uLiAgTm8gbG9uZ2VyIGluY2x1ZGVzIGNvZmYvbWlwcy5oLgotCi1Nb24gQXVnICAyIDE3OjM1OjQ4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChnZXRfdGFnKTogU2F2ZSB0YWcgbmFtZSBpbiBwZXJtYW5lbnQgbWVtb3J5Ci0JYW5kIGluIGhhc2hfcHRyLT5zdHJpbmcuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBSZXNldCBzdGF0ZSB0byAwIGFmdGVyIC5hcHBsaW5lIGlmCi0JZmlsZSBuYW1lIGlzIG5vdCBzZWVuLgotCi1Nb24gQXVnICAyIDExOjUxOjQxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCwgY2FzZSBCRkRfUkVMT0NfNjQpOiBOZXcgY2FzZSwKLQlwYXJhbGxlbCB0byBCRkRfUkVMT0NfMzIuCi0JKHRjX2dlbl9yZWxvYyk6IEFjY2VwdCBCRkRfUkVMT0NfNjQuCi0KLVRodSBKdWwgMjkgMjI6MjE6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB3cml0ZS5jOiBEb24ndCB1c2Ugc2hvcnQgaW50IGluIGEgcHJvdG90eXBlLgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBNYWtlIHJldHVybiB2YWx1ZSBzaW1wbHkgZGVwZW5kIG9uIGNvbnRlbnRzIG9mCi0JcmV0dXJuZWQgZXhwcmVzc2lvbi4KLQotVGh1IEp1bCAyOSAxODozODozNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogc3BhcmMqLWFvdXQgYW5kIHNwYXJjKi12eHdvcmtzIGFyZSBCRkQgYXNzZW1ibGVycwotCi1UaHUgSnVsIDI5IDE4OjM4OjM3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hvLXN1bm9zLmg6IHJlbW92ZSBzb21lIG9sZCBmdW5jdGlvbiBkZWNscyB0aGF0IGNvbmZsaWN0Ci0Jdy8gQU5TSSwgYW5kIHdoaWNoIHdlcmVuJ3QgbmVlZGVkIGFueXdheQotCi1XZWQgSnVsIDI4IDE2OjM0OjU1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2Zyb2Jfc3ltYm9sKTogUmVuYW1lZCBmcm9tIHRjX2Zyb2Jfc3ltYm9sLAotCWFuZCBkaXNhYmxlZCBzaW5jZSBpdCBicmVha3MgSWFuJ3MgbmV3IHN5bWJvbC12YWx1ZSBjb2RlLgotCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBBY2NlcHQgbW9yZSBkaWdpdHMgaWYgQkZENjQuCi0KLVdlZCBKdWwgMjggMTE6MzA6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSWYgd2UgaGF2ZSBhIG5vcm1hbCBjb25zdGFudCB3aGVuIHdlCi0JZXhwZWN0IGEgYmlnbnVtLCB0dXJuIGl0IGludG8gYSBiaWdudW0uICBPdXRwdXQgZXh0cmEgemVyb2VzCi0JYmVmb3JlIGEgc2hvcnQgYmlnbnVtLCByYXRoZXIgdGhhbiBhZnRlci4KLQotVHVlIEp1bCAyNyAxNTo1NDoyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IENvbmRpdGlvbmFsaXplIHZlcmlmeV9zeW1ib2xfY2hhaW4gY2FsbAotCW9uIERFQlVHX1NZTVMsIG5vdCBERUJVRy4KLQkoc3ltYm9sX3JlbW92ZSk6IExpa2V3aXNlLgotCShzeW1ib2xfaW5zZXJ0KTogTGlrZXdpc2UuCi0KLVR1ZSBKdWwgMjcgMDg6NDU6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX29wdGltaXplKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYXBwZW5kX2luc24pOiBJZiBtaXBzX29wdGltaXplID09IDAsIGFsd2F5cyBpbnNlcnQgTk9QCi0JaW5zdHJ1Y3Rpb25zLiAgSWYgbWlwc19vcHRpbWl6ZSA8IDIsIGRvbid0IHN3YXAgYnJhbmNoZXMuCi0JKG1kX3BhcnNlX29wdGlvbik6IElmIC1PeCBvciAtZ3gsIHNldCBtaXBzX29wdGltaXplIGFjY29yZGluZ2x5LgotCi1Nb24gSnVsIDI2IDE4OjAyOjQzIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogaWYgdGVzdHN1aXRlIGRvZXMgbm90IGV4aXN0LCB0aGVuIHNraXAgaXQuCi0KLUZyaSBKdWwgMjMgMTQ6MTM6MjUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChwcmV2X2luc25fdW5yZW9yZGVyZWQsCi0JcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGJyYW5jaCBpbnN0cnVjdGlvbiBpZgotCXByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkIChzZWUgY29tbWVudCkuCi0JKG1pcHNfbm9fcHJldl9pbnNuKTogQ2xlYXIgdGhlIHVucmVvcmRlcmVkIHZhcmlhYmxlcy4KLQkoc19taXBzc2V0KTogV2hlbiB0dXJuaW5nIG9uIHJlb3JkZXJpbmcsIHNldCB0aGUgdW5yZW9yZGVyZWQKLQl2YXJpYWJsZXMuCi0KLUZyaSBKdWwgMjMgMTM6MDk6NDQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBTZWN0aW9ucyAiLmluaXQiIGFuZCAiLmZpbmkiCi0JYXJlIGFsc28gbWFnaWMsIGFuZCBoYXZlIHNwZWNpYWwgZGVmYXVsdCBmbGFnIHNldHRpbmdzLgotCShvYmpfZWxmX2Zyb2Jfc3ltYm9sKTogU2luY2UgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoaXMgZnVuY3Rpb24KLQlpc24ndCB1c2VkLCBkb24ndCBib3RoZXIgY2FsbGluZyBvYmpfZWxmX3dyaXRlX3N5bWJvbF9wLCBzaW5jZSBpdAotCWRvZXNuJ3QgYWNjb21wbGlzaCBhbnl0aGluZyBlbHNlLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2VjdGlvbl9hbGlnbik6IFJvdW5kIHVwIHNlY3Rpb24gc2l6ZSBvbmx5Ci0JZm9yIGEub3V0IGZvcm1hdC4KLQotCSogc3ltYm9scy5jOiBEb24ndCBkZWZpbmUgREVCVUcgYnkgZGVmYXVsdC4KLQotVGh1IEp1bCAyMiAxMjowOTo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKGZpeF9uZXdfZXhwKTogSGFuZGxlIGEgT191bWludXMgZXhwcmVzc2lvbi4KLQotCSogZXhwci5jIChleHByKTogRG9uJ3QgbGV0IGFic29sdXRlX3NlY3Rpb24gb3ZlcnJpZGUKLQl1bmRlZmluZWRfc2VjdGlvbiBmb3IgdGhlIHJldHVybiB2YWx1ZS4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBJbiBOT19QU0VVRE9fRE9UIGNhc2UsIGlmIHdlIGZpbmQgYQotCXBzZXVkby1vcCB3aXRoIGEgcG9jX2hhbmRsZXIgZmllbGQgb2YgTlVMTCwgaWdub3JlIGl0IGFuZCB0cmVhdCBpdAotCWFzIGFuIGluc3RydWN0aW9uIGluc3RlYWQuCi0JKiBjb25maWcvdGMtbTg4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgInNldCIgd2l0aCBhIE5VTEwKLQlwb2NfaGFuZGxlciBmaWVsZC4KLQotCSogY29uZmlnL3RjLWg4NTAwLmMgKG1kX2JlZ2luKTogVXNlIGEgbG9jYWwgdmFyaWFibGUgd2hlbgotCWluaXRpYWxpemluZyBtZF9yZWxheF90YWJsZSB0byBhdm9pZCB3YXJuaW5ncyBhYm91dCBtb2RpZnlpbmcgYQotCXN1cHBvc2VkbHkgY29uc3QgZGF0YSBzdHJ1Y3R1cmUuCi0KLVRodSBKdWwgMjIgMTA6NTg6NTEgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWFvdXQuYzogT25seSBpbmNsdWRlIGFvdXQvYW91dDY0LmggaWYgQkZEX0FTU0VNQkxFUgotCWlzIGRlZmluZWQuCi0KLVdlZCBKdWwgMjEgMTc6MzI6MDIgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoY2FzZSAke2hvc3R9KTogIE1hcCAqLSotc3lzdjQqIHRvIGdhc19ob3N0PXN5c3YuCi0JKiBjb25maWd1cmUuaW4gKGNhc2UgJHtnZW5lcmljX3RhcmdldH0pOiAgQWRkIGlbMzRdODYtKi1zeXN2NCoKLQljYXNlIHRvIHNldCBvYmpfZm9ybWF0PWVsZi4gIE11c3QgZ28gYmVmb3JlIGkzODYtKi1zeXN2KiBjYXNlIHRoYXQKLQlzZXRzIG9ial9mb3JtYXQ9Y29mZmJzZC4gIEFkZCAqLSotc3lzdjQqIHRvICotKi1lbGYgYW5kCi0JKi0qLXNvbGFyaXMgY2FzZSwgYW5kIG1vdmUgdG8gYmVmb3JlICotc3lzdiogY2FzZSB0aGF0IHdhbnRzIHRvCi0Jc2V0IG9ial9mb3JtYXQgdG8gY29mZi4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IENoYW5nZSBhbGwgJ2V4cC5YX29wJyB0bwotCSdleHAtPlhfb3AnLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4KTogIEZpeCB2YWxwIHRvIGJlICd2YWx1ZVQgKicgZm9yCi0JQkZEX0FTU0VNQkxFUiBjYXNlLgotCi1XZWQgSnVsIDIxIDEyOjQ3OjUxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1hb3V0LmM6IEluY2x1ZGUgYW91dC9hb3V0NjQuaC4KLQkob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBTZXQgQlNGX0RFQlVHR0lORyBmb3IgYSBjb25zdHJ1Y3RvcgotCXN5bWJvbCwgc28gdGhhdCBCRkQgZG9lc24ndCB0YW1wZXIgd2l0aCB0aGUgdHlwZS4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBJZiBOT19QU0VVRE9fRE9UIGlzIGRlZmluZWQsIGxvb2sKLQl1cCBvcGNvZGVzIGFzIHBzZXVkby1vcHMgZXZlbiBpZiB0aGV5IGRvbid0IHN0YXJ0IHdpdGggJy4nLgotCSogY29uZmlnL3RjLW04OGsuaCAoTk9fUFNFVURPX0RPVCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG1kX2Fzc2VtYmxlKTogUmVtb3ZlZCBzcGVjaWFsIHBzZXVkby1vcAotCWhhbmRsaW5nLgotCShtZF9hcHBseV9maXgpOiBTZXQgZnhfb2Zmc2V0IHRvIHRoZSB1cHBlciAxNiBiaXRzIG9mIHRoZSByZWxvYy4KLQlPdXRwdXQgdGhlIGxvdyAxNiBiaXRzIGZvciBSRUxPQ19ISTE2LCBub3QgdGhlIGhpZ2ggMTYgYml0cy4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChkb19yZWxvY3NfZm9yKTogSWYgVENfTTg4Sywgc2V0IHRoZQotCXJfb2Zmc2V0IGZpZWxkIG9mIHRoZSByZWxvYyB0byB0aGUgZml4dXAgb2Zmc2V0LgotCShmaXh1cF9zZWdtZW50cyk6IElmIFRDX004OEssIGRvbid0IHdhcm4gYWJvdXQgZml4dXAgb3ZlcmZsb3dzLgotCSogZG9jL2FzLnRleGluZm86IE1pbm9yIHVwZGF0ZXMuCi0KLVR1ZSBKdWwgMjAgMTk6Mjg6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBFeHRlbnNpdmUgY2hhbmdlcyB0byBwZXJtaXQgc3ltYm9scyB0byBjb250YWluIGFueSBleHByZXNzaW9uCi0JdHlwZSBhbmQgdG8gZGVsYXkgdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBleHByZXNzaW9uIHVudGlsIHRoZQotCXZhbHVlIGlzIGFjdHVhbGx5IG5lZWRlZC4gIFRoaXMgcGVybWl0cyBzZXR0aW5nIHN5bWJvbHMgdG8gdmFsdWVzCi0JY2FsY3VsYXRlZCBiYXNlZCBvbiBvYmplY3QgY29kZSBzaXplLiAgRXhwcmVzc2lvbnMgd2VyZSBjaGFuZ2VkIHRvCi0Jbm8gbG9uZ2VyIGJlIGluIGEgc2VjdGlvbiwgdG8gc3RvcCB0aGUgb3ZlcmxvYWRpbmcgb2Ygc2VnbWVudCBhbmQKLQlleHByZXNzaW9uIHR5cGUgdGhhdCBwcmV2aW91c2x5IG9jY3VycmVkLgotCi0JKiBhcy5jIChiaWdfc2VjdGlvbiwgcGFzczFfc2VjdGlvbiwgZGlmZl9zZWN0aW9uLCBhYnNlbnRfc2VjdGlvbik6Ci0JUmVtb3ZlZC4KLQkoZXhwcl9zZWN0aW9uKTogQWRkZWQgKHVzZWQgZm9yIGR1bW15IHN5bWJvbHMgd2hpY2ggaG9sZAotCWludGVybWVkaWF0ZSBleHByZXNzaW9uIHZhbHVlcykuCi0JKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IENyZWF0ZSBleHByX3NlY3Rpb24sIGRvIG5vdCBjcmVhdGUgdGhlCi0Jc2VjdGlvbnMgbm93IHJlbW92ZWQuCi0JKiBhcy5oIChzZWdUKTogUmVtb3ZlZCBTRUdfQUJTRU5ULCBTRUdfUEFTUzEsIFNFR19CSUcsIGFuZAotCVNFR19ESUZGRVJFTkNFLiAgQWRkZWQgU0VHX0VYUFIuCi0JKFNFR19OT1JNQUwpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKiBzdWJzZWdzLmMgKHNlZ19uYW1lLCBzdWJzZWdzX2JlZ2luKTogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWFvdXQuYyAoc2VnX05fVFlQRSk6IERpdHRvLgotCSogY29uZmlnL29iai1ib3V0LmMgKHNlZ19OX1RZUEUpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzZWdfTl9UWVBFKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoc2VnX05fVFlQRSk6IERpdHRvLgotCSogY29uZmlnL29iai12bXMuYyAoc2VnX05fVFlQRSk6IERpdHRvLgotCi0JKiBleHByLmggKG9wZXJhdG9yVCk6IE1vdmVkIGluIGZyb20gZXhwci5jLCBhZGRlZCBzb21lIHZhbHVlcy4KLQkoZXhwcmVzc2lvblMpOiBBZGRlZCBYX29wIGZpZWxkLCByZW1vdmVkIFhfc2VnIGZpZWxkOyByZW5hbWVkCi0JWF9zdWJ0cmFjdF9zeW1ib2wgdG8gWF9vcF9zeW1ib2wuCi0JKiBleHByLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIGFzc2lnbiBleHByZXNzaW9uIHR5cGVzIHJhdGhlciB0aGFuCi0Jc2VjdGlvbnMgYW5kIHRvIHNpbXBsaWZ5IHRoZSBwYXJzaW5nLgotCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGZpeF9uZXcpOiBSZW1vdmVkIHN1Yl9zeW1ib2wgYXJndW1lbnQuCi0JKGZpeF9uZXdfZXhwKTogTmV3IGZ1bmN0aW9uLCB0YWtlcyBleHByZXNzaW9uIGFyZ3VtZW50LgotCSogd3JpdGUuaDogUHJvdG90eXBlIGNoYW5nZXMgZm9yIGZpeF9uZXcgYW5kIGZpeF9uZXdfZXhwLgotCSogY29uZC5jIChzX2lmKTogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQkqIHJlYWQuYyAoc19sc3ltLCBwc2V1ZG9fc2V0LCBlbWl0X2V4cHIsIHBhcnNlX2JpdGZpZWxkX2NvbnMsCi0JcGFyc2VfcmVwZWF0X2NvbnMsIGdldF9zZWdtZW50ZWRfZXhwcmVzc2lvbiwKLQlnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24sIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uKTogRGl0dG8uCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlLCBTX0dFVF9WQUxVRSwgU19TRVRfVkFMVUUpOgotCURpdHRvLgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9kZWYsIG9ial9jb2ZmX3ZhbCk6IERpdHRvLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2RlZiwgb2JqX2NvZmZfdmFsLAotCW9ial9jb2ZmX2VuZGVmLCB5YW5rX3N5bWJvbHMpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc3RhYl9nZW5lcmljLCBvYmpfZWxmX3NpemUpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKG1kX2Fzc2VtYmxlLCBwYXJzZV9vcGVyYW5kLCBtYWNoaW5lX2lwLAotCXByaW50X2luc24sIG1kX29wZXJhbmQpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChwYXJzZV9leHAsIGNvbG9ubW9kMjQsIGNoZWNrX29wZXJhbmQsCi0JZG9fYV9maXhfaW1tLCBidWlsZF9ieXRlcyk6IERpdHRvLgotCSogY29uZmlnL3RjLWg4NTAwLmMgKHBhcnNlX2V4cCwgc2tpcF9jb2xvbnRoaW5nLCBwYXJzZV9yZWdsaXN0LAotCWdldF9zcGVjaWZpYywgY2hlY2ssIGluc2VydCwgbWRfY29udmVydF9mcmFnKTogRGl0dG8uCi0JKiBjb25maWcvdGMtaHBwYS5jICh0aGVfaW5zbiwgZml4X25ld19ocHBhLCBjb25zX2ZpeF9uZXdfaHBwYSwKLQltZF9hc3NlbWJsZSwgcGFfaXAsIGdldEV4cHJlc3Npb24sIGdldEFic29sdXRlRXhwcmVzc2lvbiwKLQlldmFsdWF0ZUFic29sdXRlLCBwYV9idWlsZF91bndpbmRfc3Vic3BhY2UsIHBhX2VudHJ5LAotCXByb2Nlc3NfZXhpdCk6IERpdHRvLgotCSogY29uZmlnL3RjLWhwcGEuaCAoU1RBQl9GSVhVUCwgaXNfRFBfcmVsYXRpdmUsIGlzX1BDX3JlbGF0aXZlLAotCWlzX2NvbXBsZXgpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHBlLCBtZF9hc3NlbWJsZSwgaTM4Nl9vcGVyYW5kLAotCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBtZF9jcmVhdGVfbG9uZ19qdW1wKTogRGl0dG8uCi0JKiBjb25maWcvdGMtaTg2MC5jIChtZF9hc3NlbWJsZSwgZ2V0RXhwcmVzc2lvbiwgcHJpbnRfaW5zbik6Ci0JRGl0dG8uCi0JKiBjb25maWcvdGMtaTk2MC5jIChwYXJzZV9leHByLCBzdWJzLCBzZWdzLCBtZF9jb252ZXJ0X2ZyYWcsCi0JZ2V0X2NkaXNwLCBtZW1fZm10LCBwYXJzZV9sZGNvbnN0LCByZWxheF9jb2JyLCBzX3N5c3Byb2MsCi0JaTk2MF9oYW5kbGVfYWxpZ24pOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHN0cnVjdCBtNjhrX2V4cCwgc3RydWN0IG02OGtfaXQsIHNlZywgb3AsCi0Jc3VicywgYWRkX2ZpeCwgaXN2YXIsIG02OGtfaXAsIG1kX2Fzc2VtYmxlLCBtZF9jb252ZXJ0X2ZyYWdfMSwKLQltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgbWRfY3JlYXRlX2xvbmdfanVtcCwgZ2V0X251bSk6Ci0JRGl0dG8uCi0JKiBjb25maWcvdGMtbTg4ay5jIChtZF9hc3NlbWJsZSwgZ2V0X2ltbTE2LCBnZXRfcGNyLAotCW1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wKTogRGl0dG8uCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9hc3NlbWJsZSwgYXBwZW5kX2luc24sIGdwX3JlZmVyZW5jZSwKLQltYWNyb19idWlsZCwgbWFjcm8sIG15X2dldEV4cHJlc3Npb24pOiBEaXR0by4gIEFsc28gcmVtb3ZlZAotCWdldF9vcHRpb25hbF9hYnNvbHV0ZV9leHByZXNzaW9uOyBqdXN0IHVzZSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbgotCWluc3RlYWQuCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoZ2V0X2FkZHJfbW9kZSwgZXZhbHVhdGVfZXhwciwgY29udmVydF9paWYsCi0JZml4X25ld19uczMyaywgZml4X25ld19uczMya19leHAsIGNvbnNfZml4X25ld19uczMyayk6IERpdHRvLgotCSogY29uZmlnL3RjLW5zMzJrLmggKGZpeF9uZXdfbnMzMmsgcHJvdG90eXBlKTogRGl0dG8uCi0JKiBjb25maWcvdGMtc2guYyAocGFyc2VfZXhwLCBjaGVjaywgaW5zZXJ0LCBtZF9jb252ZXJ0X2ZyYWcpOgotCURpdHRvLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2Fzc2VtYmxlLCBzcGFyY19pcCwgZ2V0RXhwcmVzc2lvbiwKLQlwcmludF9pbnNuKTogRGl0dG8uCi0JKiBjb25maWcvdGMtdGFob2UuYyAoc3RydWN0IHRvcCwgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsCi0JdGlwX29wLCBtZF9hc3NlbWJsZSk6IERpdHRvLgotCSogY29uZmlnL3RjLXZheC5jIChzZWdfb2Zfb3BlcmFuZCwgbWRfYXNzZW1ibGUsCi0JbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIG1kX2NyZWF0ZV9sb25nX2p1bXApOiBEaXR0by4KLQkqIGNvbmZpZy90Yy16OGsuYyAocGFyc2VfZXhwLCBjaGVja19vcGVyYW5kLCBuZXdmaXgpOiBEaXR0by4KLQotVHVlIEp1bCAyMCAxMjoxNzoxNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogaTM4Ni1seW54IGlzIHRoZSBzYW1lIGFzIGkzODYtY29mZgotCi1Nb24gSnVsIDE5IDE1OjIxOjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9wcmV2aW91cyk6IE5ldyBmdW5jdGlvbi4KLQkocHJldmlvdXNfc2VjdGlvbiwgcHJldmlvdXNfc3Vic2VjdGlvbik6IE5ldyB2YXJzLgotCShvYmpfZWxmX3NlY3Rpb24pOiBTYXZlIGN1cnJlbnQgcGxhY2UgaW4gY2FzZSBEV0FSRiBjb2RlIHdhbnRzIHVzCi0JdG8gcG9wIGJhY2sgdG8gaXQuICBIYW5kbGUgdW5xdW90ZWQgc2VjdGlvbiBuYW1lIGFzIHdlbGwgYXMgcXVvdGVkCi0Jc2VjdGlvbiBuYW1lLiAgRG9uJ3QgY3Jhc2ggb24gaW52YWxpZCBzdHJpbmdzLgotCShvYmpfcHNldWRvX3RhYmxlKTogSGFuZGxlIG5ldyBwc2V1ZG9zICJwcmV2aW91cyIsICIyYnl0ZSIsIGFuZAotCSI0Ynl0ZSIuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmg6IERvbid0IGluY2x1ZGUgc3RydWMtc3ltYm9sLmguCi0JKG9ial9lbGZfZnJvYl9zeW1ib2wpOiBEZWNsYXJlIGFyZyBhcyBzdHJ1Y3Qgc3ltYm9sICouCi0KLQkqIHRjLXNwYXJjLmggKExPQ0FMX0xBQkVMKSBbT0JKX0VMRl06IExvY2FsIGxhYmVscyBjYW4gc3RhcnQgd2l0aAotCSJMIiBvciAiXy5MXyIuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IE5ldyBmdW5jdGlvbiwgc3BsaXQgb2ZmIGZyb20KLQl3cml0ZV9jb250ZW50cy4gIFVzZSBtZW1zZXQgaW5zdGVhZCBvZiBiemVyby4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBBcHBseSB3cml0ZV9yZWxvY3MgdG8gZWFjaCBzZWN0aW9uIGJlZm9yZQotCWFwcGx5aW5nIHdyaXRlX2NvbnRlbnRzLgotCi0JKiByZWFkLmMgKHJlYWRfYmVnaW4pOiBDYWxsIG9ic3RhY2tfYmVnaW4gd2l0aCB2YWx1ZXMgY2xvc2VyIHRvIDFLCi0JbXVsdGlwbGVzLgotCShyZWFkX2Ffc291cmNlX2ZpbGUsIGJpZ19jb25zLCBmbG9hdF9jb25zKTogVXNlIG1lbWNweSBpbnN0ZWFkIG9mCi0JYmNvcHkuCi0KLU1vbiBKdWwgMTkgMTQ6MzA6MDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwX29wKTogRG9uJ3QgZGVjcmVtZW50IHN0cmVuZCB3aGVuCi0JY2FsY3VsYXRpbmcgb3BQLT5pc2l6OyB0aGlzIHBlcm1pdHMgdGhlIGV4cHJlc3Npb24gc2l6ZSB0byBiZQotCWRldGVybWluZWQgYXMgd2VsbCwgbGF0ZXIgb24uCi0KLQkqIGV4cHIuYyAoY2xlYW5fdXBfZXhwcmVzc2lvbik6IERvbid0IGNhbmNlbCB0aGUgc3VidHJhY3Rpb24gb2YKLQl1bmRlZmluZWQgc3ltYm9scy4KLQotCSogcmVhZC5jIChzX2RhdGEpLCBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfZGF0YSk6IElmIC1SLAotCXN3aXRjaCB0byB0ZXh0IHNlY3Rpb24gcmF0aGVyIHRoYW4gZGF0YSBzZWN0aW9uLgotCi1Nb24gSnVsIDE5IDEyOjM1OjM5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCwgY2FzZSBBSU5EWCk6IEFkZCA2IHRvIG9wZXJhbmQKLQlleHByZXNzaW9uICh0byB0YWtlIHRoZSBwYy1yZWwgaW5zdHJ1Y3Rpb24gaXRzZWxmIGludG8gYWNjb3VudCkKLQliZWZvcmUgdXNpbmcgdGhlIGV4cHJlc3Npb24sIGluc3RlYWQgb2YgYWZ0ZXIuCi0KLUZyaSBKdWwgMTYgMDg6NTY6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGZsb2F0X2NvbnMpOiBTaW1wbGlmaWVkIHBhcnNpbmcgbG9naWMuICBJZgotCVJFUEVBVF9DT05TX0VYUFJFU1NJT05TIGlzIGRlZmluZWQsIGFjY2VwdCBhIHJlcGVhdCBjb3VudC4KLQotCSogc3ltYm9scy5jIChjb2xvbik6IFJhdGhlciB0aGFuIGEgc3BlY2lhbCBjYXNlIGZvciBUQ19IUFBBLAotCXVzZSBuZXcgbWFjcm8gdGNfZnJvYl9sYWJlbC4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKHRjX2Zyb2JfbGFiZWwpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IE1hbnkgY2hhbmdlcyB0byBzdXBwb3J0IHNpbXBsZSBhc3NlbWJsZXIKLQlvcHRpbWl6YXRpb24uCi0JKGluc25fbGFiZWwsIHByZXZfaW5zbiwgcHJldl9wcmV2X2luc24sIGR1bW15X29wY29kZSwKLQlwcmV2X2luc25fdmFsaWQsIHByZXZfaW5zbl9mcmFnLCBwcmV2X2luc25fd2hlcmUsCi0JcHJldl9pbnNuX2ZpeHAsIHByZXZfaW5zbl9pc19kZWxheV9zbG90KTogTmV3IHN0YXRpYwotCXZhcmlhYmxlcy4KLQkoaW5zbl91c2VzX3JlZywgbWlwc19ub19wcmV2X2luc24sIG1pcHNfZW1pdF9kZWxheXMsCi0JbWlwc19hbGlnbiwgc19zdHJpbmdlciwgc19taXBzX3NwYWNlKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKG1pcHNfZGVmaW5lX2xhYmVsKTogTmV3IGdsb2JhbCBmdW5jdGlvbi4KLQkobWRfcHNldWRvX3RhYmxlKTogRm9yICJhc2NpaSIsICJhc2NpeiIsICJhc2NpaXoiLCBjYWxsCi0Jc19zdHJpbmdlci4gIENoYW5nZWQgYXJndW1lbnQgdG8gZmxvYXRfY29ucyBmcm9tIDAgb3IgMSB0byAnZicKLQlvciAnZCcuICBGb3IgInNwYWNlIiBjYWxsIHNfbWlwc19zcGFjZS4KLQkobWRfYmVnaW4pOiBDYWxsIG1pcHNfbm9fcHJldl9pbnNuLgotCShhcHBlbmRfaW5zbik6IE9ubHkgaW5zZXJ0IG5lY2Vzc2FyeSBOT1AgaW5zdHJ1Y3Rpb25zLgotCShtYWNybyk6IENhbGwgbWlwc19lbWl0X2RlbGF5cyBiZWZvcmUgc2V0dGluZyBtaXBzX25vcmVvcmRlci4KLQlJbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBtaXBzX25vcmVvcmRlciByYXRoZXIgdGhhbiB1c2luZwotCXNhdmVfcmVvcmRlcl9jb25kaXRpb24uICBEb24ndCBib3RoZXIgdG8gdXNlIG5vcmVvcmRlciBpbgotCU1fTF9ET0IgYW5kIE1fTF9EQUIsIHNpbmNlIGFwcGVuZF9pbnNuIHdpbGwgbm90IGluc2VydCBhIE5PUC4KLQkobWRfYXRvZik6IEhhbmRsZSBmbG9hdGluZyBwb2ludCBudW1iZXJzIGNvcnJlY3RseSBmb3IgYm90aAotCWJpZyBhbmQgbGl0dGxlIGVuZGlhbiB0YXJnZXRzLgotCShzX2FsaWduLCBzX2NvbnMpOiBDYWxsIG1pcHNfYWxpZ24gcmF0aGVyIHRoYW4gZnJhZ19hbGlnbi4KLQkoc19jaGFuZ2Vfc2VnLCBzX2NvbnMpOiBDYWxsIG1pcHNfZW1pdF9kZWxheXMuCi0JKHNfZmxvYXRfY29ucyk6IExldCBmbG9hdF9jb25zIGRvIHRoZSB3b3JrLgotCShzX21pcHNzZXQpOiBDYWxsIG1pcHNfZW1pdF9kZWxheXMgd2hlbiBzZXR0aW5nIG5vcmVvcmRlci4KLQkqIGNvbmZpZy90Yy1taXBzLmggKHRjX2Zyb2JfbGFiZWwpOiBEZWZpbmUgdG8gYmUKLQltaXBzX2RlZmluZV9sYWJlbC4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzLCBlY29mZl9idWlsZF9wcm9jcywKLQllY29mZl9mcm9iX2ZpbGVzKTogQ29uc2lzdGVudGx5IHVzZSBTX0dFVF9WQUxVRSByYXRoZXIgdGhhbgotCWJmZF9hc3ltYm9sX3ZhbHVlLiAgV2FybiBpZiB0YWtpbmcgZGlmZmVyZW5jZSBvZiBzeW1ib2xzIGluCi0JZGlmZmVyZW50IHNlZ21lbnRzLgotCi1UaHUgSnVsIDE1IDExOjUxOjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBEaXNjYXJkIGFsbCBvcGVuIHNjb3BlcywKLQl3aXRoIGEgd2FybmluZy4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpeHVwX3NlZ21lbnQpOiBJZiBUQ19NODhLLCBkb24ndCBhZGp1c3QKLQlieSBtZF9wY3JlbF9mcm9tIGlmIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QgYSBzeW1ib2wgKHdlIHN0aWxsCi0JbmVlZCBtZF9wY3JlbF9mcm9tIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gd2l0aGluIHRoZSBzYW1lCi0JZmlsZSkuCi0JKiBjb25maWcvdGMtbTg4ay5jIChtZF9wY3JlbF9mcm9tKTogQ29ycmVjdGVkIHJldHVybiB2YWx1ZS4KLQkob21hZ2ljKTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUuCi0KLQkqIFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIG04OGstY29mZi4KLQkqIGNvbmZpZ3VyZS5pbiAobTg4ay0qLWNvZmYqKTogTmV3IHRhcmdldC4gIFVzZSBjb2ZmYmZkIGFuZAotCW04OGtjb2ZmLgotCSogY29uZmlnL204OGtjb2ZmLm10OiBOZXcgZmlsZS4KLQkqIHJlYWQuYyAobGV4X3R5cGUpOiBOZXcgbWFjcm8gTEVYX0FUIHRvIHNldCBsZXggdHlwZSBvZiAnQCcuCi0JKHBzZXVkb19zZXQpOiBIYW5kbGUgZGlmZmVyZW5jZSBvZiBzeW1ib2xzIGluIGRpZmZlcmVudCBmcmFnbWVudHMKLQlieSBzYXZpbmcgdGhlIGVudGlyZSBleHByZXNzaW9uIGFzIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IFJlc29sdmUgZGlmZmVyZW5jZQotCWV4cHJlc3Npb25zLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBJZiBUQ19NODhLLCBhY2NlcHQKLQkic2RlZiIgYXMgYSBzeW5vbnltIGZvciAiZGVmIi4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oOiBJZiBUQ19NODhLLCBpbmNsdWRlIGNvZmYvbTg4ay5oIGFuZCBzZXQKLQlUQVJHRVRfRk9STUFULgotCShTX0lTX0xPQ0FMKTogQW55IHN5bWJvbCB3aGljaCBpbmNsdWRlcyBcMDAxIGluIHRoZSBuYW1lIGlzIGxvY2FsLgotCSogY29uZmlnL3RjLW04OGsuYywgY29uZmlnL3RjLW04OGsuaDogTnVtZXJvdXMgY2hhbmdlcyB0byBicmluZwotCW04OGsgcG9ydCB1cCB0byBkYXRlLCBhbmQgdG8gYWRkIENPRkYgc3VwcG9ydC4KLQotV2VkIEp1bCAxNCAxNTowOTozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIFJlbW92ZWQgc3lfZm9yd2FyZCBhbmQgcmVwbGFjZWQgaXQgd2l0aCBhbiB1bmRlZmluZWQgZXhwcmVzc2lvbgotCWFzIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4KLQkqIHN0cnVjLXN5bWJvbC5oIChzdHJ1Y3Qgc3ltYm9sKTogUmVtb3ZlZCBzeV9mb3J3YXJkIGZpZWxkLiAgQWRkZWQKLQlzeV9yZXNvbHZlZCBhbmQgc3lfcmVzb2x2aW5nIHNpbmdsZSBiaXQgZmllbGRzLgotCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KTogRG9uJ3QgaW5pdGlhbGl6ZSBzeV9mb3J3YXJkIGZpZWxkLgotCShyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IE5ldyBmdW5jdGlvbiB0byBhZGp1c3Qgc3ltYm9sIHZhbHVlIGJ5Ci0JZnJhZ21lbnQgYWRkcmVzcywgdXNpbmcgcmVjdXJzaW9uIHRvIHJlc29sdmUgZm9yd2FyZCBzeW1ib2xzLgotCSogc3ltYm9scy5oOiBBZGRlZCBwcm90b3R5cGUgZm9yIG5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuYyAocHNldWRvX3NldCk6IFNldCBzeW1ib2xQLT5zeV92YWx1ZSB0byBhbiB1bmRlZmluZWQKLQlleHByZXNzaW9uIHJhdGhlciB0aGFuIHNldHRpbmcgc3ltYm9sUC0+c3lfZm9yd2FyZC4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogVXNlIHJlc29sdmVfc3ltYm9sX3ZhbHVlIG9uCi0Jc3ltYm9scywga2VlcGluZyB0aGUgY29tbW9uIGNhc2UgKHRoZSBvbGQgYmVoYXZpb3VyKSBpbmxpbmUuCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBSZW1vdmVkIHN5X2ZvcndhcmQKLQloYW5kbGluZyAoc3Vic3VtZWQgYnkgd3JpdGUuYyBjaGFuZ2UpLgotCSogY29uZmlnL29iai1jb2ZmLmMsIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl92YWwpOiBTZXQKLQlzeV92YWx1ZSByYXRoZXIgdGhhbiBzeV9mb3J3YXJkLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2VuZGVmLCB5YW5rX3N5bWJvbHMpOiBDaGVjawotCWV4cHJlc3Npb24gc2VnbWVudCByYXRoZXIgdGhhbiBzeV9mb3J3YXJkLgotCSh5YW5rX3N5bWJvbHMpOiBVc2UgcmVzb2x2ZV9zeW1ib2xfdmFsdWUuCi0JKGNyYXdsX3N5bWJvbHMpOiBSZW1vdmVkIGV4dHJhIHBhc3Mgb3ZlciBzeW1ib2xzLgotCSogY29uZmlnL29iai1hb3V0LmMsIGNvbmZpZy9vYmotYm91dC5jLCBjb25maWcvb2JqLWNvZmYuYywKLQljb25maWcvb2JqLXZtcy5jIChvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKTogUmVtb3ZlZCBleHRyYSBwYXNzIG92ZXIKLQlzeW1ib2xzIHdoaWNoIGhhbmRsZWQgc3lfZm9yd2FyZDsgdXNlIHJlc29sdmVfc3ltYm9sX3ZhbHVlCi0JaW5zdGVhZC4KLQkqIGNvbmZpZy9vYmotY29mZi5oLCBjb25maWcvb2JqLWNvZmZiZmQuaCAob2JqX2Zyb2JfZm9yd2FyZF9zeW1ib2wpOgotCURlZmluZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc3RhYl9nZW5lcmljKTogQ2hlY2sgZXhwcmVzc2lvbgotCXNlZ21lbnQgcmF0aGVyIHRoYW4gc3lfZm9yd2FyZC4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19DaGVja19Gb3JfTWFpbik6IERvbid0IGluaXRpYWxpemUKLQlzeV9mb3J3YXJkOyBkbyBpbml0aWFsaXplIHN5X3Jlc29sdmVkIGFuZCBzeV9yZXNvbHZpbmcuCi0JKiBjb25maWcvdGMtaHBwYS5oIChTVEFCX0ZJWFVQKTogVXNlIHN5X3ZhbHVlLCBub3Qgc3lfZm9yd2FyZC4KLQotCSogQ2hhbmdlcyB0byBrZWVwIGEgZnVsbCBleHByZXNzaW9uIGFzIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCwgbm90Ci0JanVzdCBhIGxvbmd3b3JkOgotCSogc3RydWMtc3ltYm9sLmg6IE5ldyBmaWVsZCBzeV92YWx1ZS4KLQkqIGFzLmg6IEluY2x1ZGUgZXhwci5oIGJlZm9yZSBzdHJ1Yy1zeW1ib2wuaC4KLQkqIGV4cHIuaDogVXNlIHN0cnVjdCBzeW1ib2wgcmF0aGVyIHRoYW4gc3ltYm9sUy4KLQkqIHN5bWJvbHMuYyAoU19HRVRfVkFMVUUsIFNfU0VUX1ZBTFVFKTogUmV3cm90ZSB0byByZXRyaWV2ZSB2YWx1ZQotCW9mIHN5X3ZhbHVlIGZpZWxkOyBjb21waWxlIHVuY29uZGl0aW9uYWxseSwgbm90IGp1c3QgaWYKLQlCRkRfQVNTRU1CTEVSLgotCSogc3ltYm9scy5oOiBDb21waWxlIFNfe1NHfUVUX1ZBTFVFIHByb3RvdHlwZXMgdW5jb25kaXRpb25hbGx5LgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBTZXQgQkZEIHN5bWJvbCB2YWx1ZSB0byBnYXMgc3ltYm9sCi0JdmFsdWUuCi0JKiBjb25maWcvb2JqLWFvdXQuaCwgY29uZmlnL29iai1ib3V0LmgsIGNvbmZpZy9vYmotY29mZi5oLAotCWNvbmZpZy9vYmotY29mZmJmZC5oLCBjb25maWcvb2JqLWdlbmVyaWMuaCwgY29uZmlnL29iai12bXMuaAotCShTX0dFVF9WQUxVRSwgU19TRVRfVkFMVUUpOiBSZW1vdmVkIG1hY3JvIGRlZmluaXRpb25zLgotCSogY29uZmlnL29iai1pZWVlLmMgKFNfR0VUX1ZBTFVFLCBTX1NFVF9WQUxVRSk6IFJlbW92ZWQuCi0JKiBjb25maWcvb2JqLWNvZmYuaCwgb2JqLWNvZmZiZmQuaDogUmV3cm90ZSBzZXZlcmFsIG1hY3JvcyB0byB1c2UKLQlTX0dFVF9WQUxVRSByYXRoZXIgdGhhbiBvc3RfZW50cnkubl92YWx1ZS4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfc3ltYm9sX3RvX2NoYXJzKSwgY29uZmlnL29iai1ib3V0LmMKLQkob2JqX3N5bWJvbF90b19jaGFycyksIGNvbmZpZy9vYmotY29mZi5jIChvYmpfc3ltYm9sX3RvX2NoYXJzKSwKLQljb25maWcvb2JqLWNvZmZiZmQuYyAoc3ltYm9sX3RvX2NoYXJzKTogR2V0IHZhbHVlIHRvIHdyaXRlIG91dAotCXVzaW5nIFNfR0VUX1ZBTFVFLS1kb24ndCBhc3N1bWUgaXQgaXMgYWxyZWFkeSBzZXQuCi0JKiBjb25maWcvb2JqLWllZWUuYyAoZG9fc3ltYm9scyk6IFNldCBCRkQgc3ltYm9sIHZhbHVlIHRvIGdhcwotCXN5bWJvbCB2YWx1ZS4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKHZhcmlvdXMpOiBEb24ndCBhc3NpZ24gZGlyZWN0bHkgdG8KLQlTX0dFVF9WQUxVRTsgdXNlIFNfU0VUX1ZBTFVFIGluc3RlYWQuCi0KLVdlZCBKdWwgMTQgMDk6MzU6MjMgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBNYWtlIHNwYXJjNjQtKi1hb3V0KiB1c2UgYmZkIGdhcy4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgaDgzMDBoLgotCi1UdWUgSnVsIDEzIDEyOjA5OjQ0IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODUwMC5jIChsaW5lX2NvbW1lbnRfY2hhcnMpOiBBZGQgaGFzaC4KLQkocGFyc2VfZXhwLCBza2lwX2NvbG9udGhpbmcsIGJ1aWxkX2J5dGVzKTogQWRkIHN1cHBvcnQgZm9yCi0JUl9IODUwMF9ISUdIMTYgcmVsb2NhdGlvbiB0eXBlLgotCi1Nb24gSnVsIDEyIDExOjE1OjM0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBBbGxvdyBgQCcgdG8gaW50cm9kdWNlIGFuCi0JYXR0cmlidXRlIG5hbWUuICBIYW5kbGUgYGV4ZWNpbnN0cicgYXR0cmlidXRlLgotCi1Nb24gSnVsIDEyIDA3OjIyOjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IERvbid0IHdhcm4gb24gJ2knIG9yICdqJyBtaXNtYXRjaCBpZgotCXRoZXJlIGlzIGFub3RoZXIgYWx0ZXJuYXRpdmUgZm9yIHRoZSBpbnN0cnVjdGlvbi4KLQotRnJpIEp1bCAgOSAxNzozMTozNCAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBkb2MvYXMudGV4aW5mbzogdXBkYXRlcyBmb3IgSDgvMzAwSAotCi1UaHUgSnVsICA4IDE0OjQxOjQzIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKG1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wLAotCW1kX251bWJlcl90b19jaGFycywgbWRfc2VjdGlvbl9hbGlnbik6IEFkanVzdGVkIHRvIHVzZSB2YWx1ZVQsCi0JYWRkcmVzc1QsIHRvIG1hdGNoIHRjLmguCi0KLVRodSBKdWwgIDggMTQ6MTU6MDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19jb21tb24pOiBSZXZhbXAgdG8gaGFuZGxlIGJvdGggc3ludGF4ZXMsCi0JaW5kZXBlbmRlbnQgb2YgZm9ybWF0LgotCi1UaHUgSnVsICA4IDA3OjI1OjI1IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5oIChUQ19DT05TX1JFTE9DKTogVXNlIFJfUkVMTE9ORyBpZiBoOC8zMDBoLgotCi1XZWQgSnVsICA3IDE4OjExOjA3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBkZWZpbmUgQ1JPU1M9LURDUk9TU19DT01QSUxFIGlmIGl0IGlzIGEgY3Jvc3MKLQlidWlsZDsgYWxzbyByZWNvZ25pemUgaDgzMDAtKi1jb2ZmCi0KLVdlZCBKdWwgIDcgMTA6MjE6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzeW1ib2xzLmMgKGZiX2xhYmVsX2luc3RhbmNlLCBmYl9sYWJlbF9pbnN0YW5jZV9pbmMpOiBEb24ndCBkdW1wCi0JY29yZSBqdXN0IGJlY2F1c2Ugc29tZWJvZHkgdXNlcyBhIGxhYmVsIGJlZm9yZSBpdCBpcyBkZWZpbmVkLgotCi0JKiBjb25maWcvbWlwcy1vcGNvZGUuaDogTW92ZWQgdG8gb3Bjb2RlL21pcHMuaC4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IEluY2x1ZGUgb3Bjb2RlL21pcHMuaCByYXRoZXIgdGhhbgotCW1pcHMtb3Bjb2RlLmguCi0JKGFwcGVuZF9pbnNuKTogQW4gZXh0cmEgTk9QIGlzIG9ubHkgbmVlZGVkIGFmdGVyIGluc3RydWN0aW9ucwotCXdoaWNoIHNldCBISSBvciBMTywgbm90IGFmdGVyIGluc3RydWN0aW9ucyB3aGljaCByZWFkIGl0LgotCShtYWNyb19idWlsZCwgbWlwc19pcCk6IFN1cHBvcnQgbmV3ICdFJywgJ0cnIGFuZCAnQicgYXJndW1lbnRzLgotCShtYWNybyk6IGNmYzEgYW5kIGN0YzEgbm93IHRha2UgInQsRyIgcmF0aGVyIHRoYW4gInQsZCIuCi0JKiBjb25maWcvdGMtbWlwcy5oIChzdHJ1Y3QgbWlwc19vcGNvZGUpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvbWlwcy1iaWcubXQsIGNvbmZpZy9taXBzLWxpdC5tdCAoVEFSR19DUFVfREVQRU5ERU5UUyk6Ci0JU2V0IHRvICQoc3JjZGlyKS8uLi9pbmNsdWRlL29wY29kZS9taXBzLmguCi0KLQlHZXQgdGhlIE1JUFMgYXNzZW1ibGVyIHVwIHRvIHNwZWVkIHdpdGggb3RoZXIgZ2FzIGNoYW5nZXM6Ci0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfc2V0X3ZtYSwgZWNvZmZfZnJvYl9zeW1ib2wpOgotCVJlbW92ZWQ7IGRvbid0IGNoYW5nZSB0aGUgc3ltYm9sIHZhbHVlLgotCShlY29mZl9idWlsZF9zeW1ib2xzLCBlY29mZl9idWlsZF9wcm9jcywgZWNvZmZfZnJvYl9maWxlKTogVXNlCi0JYmZkX2FzeW1ib2xfdmFsdWUgcmF0aGVyIHRoYW4gU19HRVRfVkFMVUUgdG8gaW5jbHVkZSBzZWN0aW9uCi0Jdm1hIGluIHN5bWJvbCB2YWx1ZS4KLQkoZWNvZmZfZnJvYl9maWxlKTogSWdub3JlIEJTRl9TRUNUSU9OX1NZTSBzeW1ib2xzLCBzaW5jZSBFQ09GRgotCWRvZXNuJ3Qgb3V0cHV0IHRoZW0uICBTZXQgdGhlIHZtYSBvZiBzZWN0aW9ucy4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaDogRG9uJ3QgZGVmaW5lIG9ial9mcm9iX3N5bWJvbC4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHRjX2dlbl9yZWxvYyk6IEFkanVzdG1lbnQgYnkgc2VjdGlvbiB2bWEgaXMgbm8KLQlsb25nZXIgbmVjZXNzYXJ5LgotCSh2YXJpb3VzKTogdXNlIHZhbHVlVCByYXRoZXIgdGhhbiBsb25nLgotCi1XZWQgSnVsICA3IDA4OjMzOjMwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmggKEVOVjY0KTogRGVmaW5lIGZvciB2OS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfeHdvcmQpOiBGb3IgbnVtYmVycywgY2FsbCBiaWdfY29ucy4KLQkoc3BhcmNfaXAsIG1kX2FwcGx5X2ZpeCwgdGNfZ2VuX3JlbG9jKTogSGFuZGxlIHNvbWUgc3BhcmM2NAotCXJlbG9jYXRpb24gdHlwZXMuCi0JKG1kX251bWJlcl90b19jaGFycyk6IEhhbmRsZSA4LWJ5dGUgdmFsdWUuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKGVsZl9zeW1ib2wpOiBGb3IgdjksIHVzZSA2NC1iaXQgc3ltYm9sIHR5cGUuCi0KLQkqIGFzLmggKHZhbHVlVCk6IFR5cGVkZWYgbW92ZWQgaGVyZS4KLQkqIHN0cnVjLXN5bWJvbC5oICh2YWx1ZVQpOiAuLi5mcm9tIGhlcmUuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IExvY2FscyBmcm9tX2FkZHIsIHRvX2FkZHIsCi0JdGFibGVfYWRkciBhcmUgbm93IGFkZHJlc3NULiAgU3VwcGx5IHByb3RvdHlwZSBmb3IgYmZkX2FsbG9jIGZvcgotCW5vdy4KLQkoZml4dXBfc2VnbWVudCk6IExvY2FsIGFkZF9udW1iZXIgaXMgbm93IHZhbHVlVC4gIENvcnJlY3Qgc29tZQotCXJhbmdlLWNoZWNraW5nIGJ1Z3MuCi0JKHJlbGF4X2FsaWduKTogVHlwZSBgaW50JyBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgdGhlIGV4cG9uZW50LgotCShmaXhfbmV3KTogQXJndW1lbnQgb2Zmc2V0IGlzIHR5cGUgb2Zmc2V0VC4gIExvY2FscyBzaXplIGFuZAotCW5ld3NpemUgYXJlIHR5cGUgdmFsdWVULgotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IEZpZWxkcyBmeF9vZmZzZXQgYW5kIGZ4X2FkZG51bWJlciBhcmUgbm93Ci0JdHlwZSB2YWx1ZVQuCi0JKGZpeF9uZXcpOiBGaXggcHJvdG90eXBlLgotCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KTogU3ltYm9sIHZhbHVlIGlzIHR5cGUgdmFsdWVULgotCShTX1NFVF9WQUxVRSwgU19HRVRfVkFMVUUpOiBMaWtld2lzZS4KLQkoU19JU18qKTogU3BlY2lmeSBpbnQgcmV0dXJuIHR5cGUgZXhwbGljaXRseS4KLQkqIHN5bWJvbHMuaCAoc3ltYm9sX25ldywgU19HRVRfVkFMVUUsIFNfU0VUX1ZBTFVFKTogRml4ZWQKLQlwcm90b3R5cGVzLgotCSogcmVhZC5jIChzX2NvbW0pOiBWYWx1ZXMgcmVhZCBhcmUgdHlwZSB2YWx1ZVQuCi0JKiBleHByLmggKGV4cHJlc3Npb25TKTogRmllbGQgWF9hZGRfbnVtYmVyIGlzIGFuIG9mZnNldFQuCi0JKiB0Yy5oIChtZF9jcmVhdGVfbG9uZ19qdW1wLCBtZF9jcmVhdGVfc2hvcnRfanVtcCwKLQltZF9zZWN0aW9uX2FsaWduKTogQWRkcmVzc2VzIGFyZSBub3cgdHlwZSBhZGRyZXNzVC4KLQkobWRfbnVtYmVyX3RvX2NoYXJzLCBtZF9hcHBseV9maXgpOiBQYXNzIHZhbHVlIGFzIHZhbHVlVC4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wLAotCW1kX251bWJlcl90b19jaGFycywgbWRfc2VjdGlvbl9hbGlnbik6IEFkanVzdGVkLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogSW5pdGlhbGl6ZSBgbGVuJyB2YXJpYWJsZSB0byBtYWtlCi0JZ2NjIHNodXQgdXAuCi0JKG1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wLCBtZF9udW1iZXJfdG9fY2hhcnMsCi0JbWRfc2VjdGlvbl9hbGlnbik6IEFkanVzdGVkLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19yZXNlcnZlKTogUGVybWl0IHVzZSBmb3Igb3RoZXIgdGhhbiBhLm91dAotCWZvcm1hdC4KLQkoc19jb21tb24pOiBIYW5kbGUgU29sYXJpcy0yIHZlcnNpb24uCi0KLQkqIGNvbmZpZy9oby1nZW5lcmljLmggKGZyZWUpOiBSZXR1cm5zIHZvaWQgaWYgX19TVERDX18uCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9lbGZfZnJvYl9zeW1ib2wsIGVsZl9mcm9iX2ZpbGUsCi0JZWxmX2ZpbGVfc3ltYm9sKTogRGVjbGFyZS4KLQotCSogZXhwci5jIChmbG9hdGluZ19jb25zdGFudCwgaW50ZWdlcl9jb25zdGFudCk6IE5vdyByZXR1cm4gdm9pZC4KLQotVGh1IEp1bCAgMSAxMjoxMzo0MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogTWF0Y2ggb24gc3BhcmMqLWZ1aml0c3Utbm9uZSByYXRoZXIgdGhhbgotCXNwYXJjbGl0ZSotZnVqaXRzdS1ub25lLgotCi1XZWQgSnVuIDMwIDExOjEyOjAyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChjb25zKTogQ29uZGl0aW9uYWxpemUgcGFyc2luZyBvZiBleHByZXNzaW9uLiAgTW92ZQotCXB1dHRpbmcgdmFsdWUgaW50byBvYmplY3QgZmlsZSBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9uLiAgU2VwYXJhdGUKLQlvdXQgTVJJIGFuZCBXQU5UX0JJVEZJRUxEUyBjYXNlcyBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9ucy4KLQkoZW1pdF9leHByKTogTmV3IGZ1bmN0aW9uIHRvIHdyaXRlIGRhdGEgaW50byBvYmplY3QgZmlsZS4KLQlDb25kaXRpb25hbGl6ZSBvbiBUQ19DT05TX0ZJWF9ORVcgYW5kIFRDX0NPTlNfUkVMT0MgcmF0aGVyIHRoYW4gb24KLQlwcm9jZXNzb3IgdHlwZXMuCi0JKHBhcnNlX2JpdGZpZWxkX2NvbnMpOiBOZXcgZnVuY3Rpb24gdG8gcGFyc2UgYml0ZmllbGQgZXhwcmVzc2lvbnMKLQlhcyB1c2VkIGJ5IGk5NjAgYXNzZW1ibGVycy4gIE9ubHkgY29tcGlsZWQgaWYKLQlCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TIGlzIGRlZmluZWQuCi0JKHBhcnNlX21yaV9jb25zKTogTmV3IGZ1bmN0aW9uIHRvIHBhcnNlIE1SSSBzdHlsZSBzdHJpbmdzLiAgT25seQotCWNvbXBpbGVkIGlmIE1SSSBpcyBkZWZpbmVkLgotCShwYXJzZV9yZXBlYXRfY29ucyk6IE5ldyBmdW5jdGlvbiB0byBwYXJzZSByZXBlYXQgY291bnRzLiAgT25seQotCWNvbXBpbGVkIGlmIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TIGlzIGRlZmluZWQuCi0JKiByZWFkLmggKGVtaXRfZXhwcik6IEFkZGVkIGRlY2xhcmF0aW9uIG9mIG5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1hMjlrLmggKFRDX0NPTlNfUkVMT0MpOiBEZWZpbmUgdG8gYmUgUkVMT0NfMzIuCi0JKiBjb25maWcvdGMtaDgzMDAuaCAoVENfQ09OU19SRUxPQyk6IERlZmluZSB0byBiZSBSX1JFTFdPUkQuCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYSk6IE5ldyBmdW5jdGlvbiB0bwotCXBhcnNlIGEgSFBQQSBleHByZXNzaW9uLCByYXRoZXIgdGhhbiBzcGVjaWFsIGNhc2UgaW4gY29ucwotCWZ1bmN0aW9uLgotCShjb25zX2ZpeF9uZXdfaHBwYSk6IE5ldyBmdW5jdGlvbiB0byBlbWl0IGFuIEhQUEEgZml4dXAsIHJhdGhlcgotCXRoYW4gc3BlY2lhbCBjYXNlIGluIGVtaXRfZXhwciBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTiwgVENfQ09OU19GSVhfTkVXKToKLQlEZWZpbmUgdG8gdXNlIG5ldyBmdW5jdGlvbnMgZnJvbSB0Yy1ocHBhLmMuCi0JKiBjb25maWcvdGMtaTk2MC5oIChCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TKTogRGVmaW5lLgotCShXQU5UX0JJVEZJRUxEUyk6IFJlbW92ZWQ7IG5vdyBvYnNvbGV0ZS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKFJFUEVBVF9DT05TX0VYUFJFU1NJT05TKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW5zMzJrLmMgKGNvbnNfZml4X25ld19uczMyayk6IE5ldyBmdW5jdGlvbiB0byBlbWl0IGFuCi0JTlMzMksgZml4dXAsIHJhdGhlciB0aGFuIHNwZWNpYWwgY2FzZSBpbiBlbWl0X2V4cHIgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtbnMzMmsuaCAoVENfQ09OU19GSVhfTkVXKTogRGVmaW5lIHRvIGJlCi0JY29uc19maXhfbmV3X25zMzJrLiAgQWxzbyB1c2UgUEFSQU1TIHJhdGhlciB0aGFuIGNoZWNraW5nCi0JX19TVERDX18uCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVENfQ09OU19SRUxPQyk6IERlZmluZSB0byBSRUxPQ18zMi4KLQotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnLCBhZGp1c3RfcmVsb2Nfc3ltcywgd3JpdGVfY29udGVudHMpOgotCURvbid0IGNvcmUgZHVtcCBpZiBnYXMgaGFzIG5vIGluZm9ybWF0aW9uIGFib3V0IGEgc2VjdGlvbi4KLQotV2VkIEp1biAzMCAwNjoyMToyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9iZWdpbik6IElmIHNwYXJjdjkgaXMgZGVmaW5lZCwgcmVzZXQKLQljdXJyZW50X2FyY2hpdGVjdHVyZSB0byB2OSBhdXRvbWF0aWNhbGx5LgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0ZPUk1BVCk6IFVzZSBlbGY2NC1zcGFyYyBmb3IgdjkuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYzY0LmgsIGNvbmZpZy90Yy1zcGFyYzY0LmM6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIHNwYXJjNjQgY3B1IGZpbGVzIGZvciB2OSwgYW5kIGRlZmF1bHQgdG8gZWxmCi0JZm9ybWF0LgotCi0JKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpOiBBbHdheXMgZnVsbHkgcHJvY2VzcyBhIHNlY3Rpb24uCi0JU2VjdGlvbiBzaXplIGlzIGxhc3QgZnJhZydzICh2bSlhZGRyZXNzIHBsdXMgaXRzIHNpemUuICBJZiBubwotCXJlbG9jYXRpb25zIGFyZSBwcmVzZW50LCBmb3JjZSBTRUNfUkVMT0MgZmxhZyBjbGVhci4KLQkoZHVtcF9zZWN0aW9uX3JlbG9jcyk6IE5ldyBkZWJ1Z2dpbmcgcm91dGluZS4KLQkoYWRqdXN0X3JlbG9jX3N5bXMpOiBOZXcgcm91dGluZSwgYnJva2VuIG91dCBmcm9tIHdyaXRlX2NvbnRlbnRzLgotCURvbid0IGFkanVzdCByZWxvY3MgdGhhdCBhcmUgYWxyZWFkeSByZWxhdGl2ZSB0byBzZWN0aW9uIHN5bWJvbC4KLQlMb29rIGZvciBvYmpfZml4X2FkanVzdGFibGUgbWFjcm8gdG8ga25vdyB3aGF0IGVsc2UgdG8gc2tpcCwKLQlpbnN0ZWFkIG9mIG9ial93cml0ZV9zeW1ib2wuICBMb29rIGZvciBzZWN0aW9uIHN5bWJvbCBzdG9yZWQgaW4KLQlzZWN0aW9uIGluZm9ybWF0aW9uLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IE1hcCBhZGp1c3RfcmVsb2Nfc3ltcyBvdmVyIGFsbCBzZWN0aW9ucy4KLQkod3JpdGVfY29udGVudHMpOiBDbGVhciBTRUNfUkVMT0MgZmxhZyBpZiBubyByZWxvY2F0aW9ucyBhcmUKLQlmb3VuZC4KLQotCSogYXMuaCAoX19QVFJfVE9fSU5ULCBfX0lOVF9UT19QVFIpOiBOZXcgdmVyc2lvbnMgZm9yIFNhYmVyLCB0bwotCWtlZXAgaXQgcXVpZXQuCi0KLQkqIHdyaXRlLmMgKHJlbW92ZV9zdWJzZWdzKTogRG9uJ3QgZGVmaW5lIGZvciBCRkRfQVNTRU1CTEVSLgotCi1GcmkgSnVuIDI1IDE0OjQyOjUzIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbCwgZHZpLCBpbmZvLCBpbnN0YWxsLWluZm8sIGNsZWFuLWluZm8pOiBkbyBub3QKLQkgIGVjaG8gcmVjdXJzaW9uIGxpbmVzLgotCSAgKGluc3RhbGwtaW5mbywgY2xlYW4taW5mbyk6IGNvbGxhcHNlIGludG8gdGhlIGR2aSBhbmQgaW5mbyBydWxlLgotCi1GcmkgSnVuIDI1IDEwOjQ3OjI0IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFJlbW92ZSBzdXBwb3J0IGZvciAlZC8lcSBmcCByZWdzLgotCUFsbCBmcCByZWdzIGFyZSBub3cgc3BlY2lmaWVkIGFzICVmLgotCShwcml2X3JlZ190YWJsZSk6IGZwcSAtPiBmcS4KLQotRnJpIEp1biAyNSAwMzo0MzowNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogYXMuaCAoc3Ryc3RyKTogRGlzYWJsZSBkZWNsYXJhdGlvbiBmb3Igbm93LgotCShmcHJpbnRfdmFsdWUsIHNwcmludF92YWx1ZSk6IERlY2xhcmUuCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ld19yZXN0KTogVXNlIG1lbXNldCB0byBjbGVhciBuZXcgZnJhZy4KLQkoc3Vic2VnX25ldykgW0JGRF9BU1NFTUJMRVJdOiBJbml0aWFsaXplIGFsbCBzZWdpbmZvIGZpZWxkcy4KLQotCSogZXhwci5jIChleHByX3BhcnQpOiBNYWRlIHNhbml0eSBjaGVja3MgYS5vdXQtc3BlY2lmaWMuCi0JKGV4cHIpOiBEaXNhYmxlZCBzYW5pdHkgY2hlY2tzLgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKSBbQkZEX0FTU0VNQkxFUl06IEFkZCBmaWVsZCBmb3IKLQlzZWN0aW9uIHN5bWJvbC4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2NoYW5nZSk6IEluaXRpYWxpemUgc2VjdGlvbiBzeW1ib2wgcG9pbnRlcgotCXdoZW4gc2V0dGluZyB1cCBhIG5ldyBzZWN0aW9uLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpIFtCRkRfQVNTRU1CTEVSXTogUG9pbnQgQkZEIHN5bWJvbCdzIHVkYXRhCi0JZmllbGQgYmFjayBhdCBnYXMgc3ltYm9sIHN0cnVjdHVyZS4KLQotCSogc3ltYm9scy5jIChjb2xvbik6IENhc3Qgb2JzdGFja19uZXh0X2ZyZWUgdmFsdWUgdG8gY2hhciogYmVmb3JlCi0JZG9pbmcgYXJpdGhtZXRpYyBvbiBpdC4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ld19yZXN0KTogTGlrZXdpc2UuCi0JKiBhcy5oIChmcmFnX25vd19maXgpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2ZpbGVfc3ltYm9sKTogVXNlIHN1YnNlZ19uZXcgaW5zdGVhZCBvZgotCWNhbGxpbmcgYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IGRpcmVjdGx5LCBhbmQgY2FsbCBzdWJzZWdfc2V0Ci0JaW5zdGVhZCBvZiBzdWJzZWdfY2hhbmdlLiAgTm93IHJldHVybnMgdm9pZC4KLQkob2JqX2VsZl93cml0ZV9zeW1ib2wpOiBPbmx5IGNoZWNrIGxvY2FsIHN5bWJvbHMgZm9yIG5vdy4KLQkoZWxmX3N0YWJfc3ltYm9sKTogTm93IHN0YXRpYyBhbmQgdm9pZCwgYW5kIGRpc2FibGVkIHVudGlsIGl0Ci0Jd29ya3MgY29tcGxldGVseS4KLQkob2JqX2VsZl9zaXplKTogRm9yIGV4cHJlc3Npb24gdmFsdWVzLCBmYWlsIHNpbGVudGx5IGZvciBub3cuCi0JKG9ial9zeW1ib2xfbmV3X2hvb2spOiBEbyBub3RoaW5nLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogSGFuZGxlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyCi0JcmVsb2NhdGlvbi4KLQkoc19sb2NhbCkgW09CSl9FTEZdOiBOZXcgZnVuY3Rpb24uCi0JKG1kX3BzZXVkb190YWJsZSkgW09CSl9FTEZdOiBDYWxsIGl0IGZvciAibG9jYWwiLgotCShzX2NvbW1vbik6IFJlYXJyYW5nZSB0byBoYW5kbGUgU29sYXJpcyAuY29tbW9uIHBzZXVkbywgd2hpY2ggbWF5Ci0Jc29tZXRpbWVzIHVzZSBic3Mgc3BhY2UgaW5zdGVhZCBvZiBjb21tb24uCi0JKiBjb25maWcvb2JqLWVsZi5oIChUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IEFkZCBuZXcgYGxvY2FsJyBmaWVsZC4KLQotVGh1IEp1biAyNCAxNjozMzo1MyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogc2V0IGhvc3QgY29uZmlnIHRvIGhwdXggZm9yIGhwcGEqLWhwLWhwdXgKLQotVGh1IEp1biAyNCAxMzozNTowNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogYXBwLmMgKGFwcF9wb3AsIGFwcF9wdXNoKTogRml4IGJ1ZyByZXBvcnRlZCBieSBDaHJpcyBBcnRodXIuCi0KLVR1ZSBKdW4gMjIgMDE6MDQ6MjMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ldyk6IERvbid0IHNwZWNpYWwtY2FzZSBhLm91dCAtUiBmbGFnIGhlcmUuCi0JKiBjb25maWcvb2JqLWFvdXQuYyAoc19zZWN0KTogRG8gaXQgaGVyZS4KLQotCSogYXMuaCAoQkFEX0NBU0UpOiBEb24ndCBtYWtlIHNvbWUgbGFtZSBjb21waWxlcnMgdGhpbmsgd2Ugd2FudAotCXN1YnN0aXR1dGlvbiBpbnNpZGUgc3RyaW5ncy4KLQotCSogYXMuYyAocHJpbnRfdmVyc2lvbl9pZCk6IE5ldyBmdW5jdGlvbiwgc3BsaXQgb2ZmIGZyb20gbWFpbi4KLQkobWFpbik6IENhbGwgaXQuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcGFyc2Vfb3B0aW9uKSBbT0JKX0VMRl06IFByaW50IHZlcnNpb24gaWQKLQlmb3IgLVYuICBJZ25vcmUgLVEgYW5kIC1zIG9wdGlvbnMgZm9yIG5vdy4KLQotTW9uIEp1biAyMSAxNzozNzo1OSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtYWtlIGluc3RhbGxhdGlvbiAmIGJ1aWxkcyB3b3JrIGFnYWluIGZvciBjcm9zc2VzCi0KLVN1biBKdW4gMjAgMTg6MTg6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBSZXdyaXRlIHRvIHByaW50IHdpZGUgKD4zMiBiaXRzKQotCXN5bWJvbCB2YWx1ZXMgY29ycmVjdGx5LgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERlbGV0ZWQgdW51c2VkIHZhcmlhYmxlcy4KLQkoZml4dXBfc2VnbWVudCk6IFVzZSBzcHJpbnRfdmFsdWUuCi0KLQkqIG1lc3NhZ2VzLmMgKHNwcmludF92YWx1ZSwgZnByaW50X3ZhbHVlKTogTmV3IHJvdXRpbmVzLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfc3RhYl9zeW1ib2wpOiBOb3cgcmV0dXJucyB2b2lkLgotCShvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6IEZpeCB0eXBvIGluIGxvZ2ljLgotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiBMb29rIGluIC4uL2JmZCBmb3IgYmZkLmguCi0KLQkqIGFzLmggKGFkZHJlc3NULCBvZmZzZXRUKTogTmV3IHR5cGVzLCB1c2luZyBCRkQgdHlwZXMgaWYKLQlhdmFpbGFibGUuCi0JKHJlbGF4X2FkZHJlc3NULCBzdHJ1Y3QgZnJhZyk6IFVzZSB0aGVtLgotCSogc3RydWMtc3ltYm9sLmggKHZhbHVlVCwgc3RydWN0IGJyb2tlbl93b3JkKTogTGlrZXdpc2UuCi0KLQkqIGFzLmggKHN1YnNlZ19uZXcpIFtCRkRfQVNTRU1CTEVSXTogTmFtZSBhcmd1bWVudCBpcyBjb25zdC4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ldykgW0JGRF9BU1NFTUJMRVJdOiBOYW1lIGFyZ3VtZW50IGlzIGNvbnN0LgotCi1UaHUgSnVuIDE3IDE2OjUzOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjYW5vbmljYWxpemUgaW5zdGFsbC5zaDsgZm9yIHVzZSB3aXRoaW4KLQl0aGlzIGRpcmVjdG9yeSAoYW5kIHN1YmRpcnMpCi0KLVN1biBKdW4gMjAgMDI6MzQ6MDQgMTk5MyAgQXNobGV5IFNhdWxzYnVyeSAoYW5zQHNpY3Muc2UpCi0KLQkqIG04OGstb3Bjb2RlLmggOiBmaXhlZCB0aW55IHRpbnkgbWlzdGFrZSAtIHhjciB3YXMgaW5jb3JyZWN0bHkKLQlzcGVjaWZpZWQsIHNob3VsZCBoYXZlIGJvdGggUzEgYW5kIFMyIGZpZWxkcyBpZGVudGljYWwKLQlJZiBvbmx5IGZpbmRpbmcgdGhlIHByb2JsZW0gd2FzIGFzIGZhc3QgYXMgZml4aW5nIHRoZSBidWcgISEhIQotCi1UdWUgSnVuIDE1IDE2OjAxOjU3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBEbyB3cml0ZSBvdXQgbm9uLWxvYWRhYmxlIHNlY3Rpb25zLgotCURlYnVnIHNlY3Rpb25zIGNhbiBmYWxsIGluIHRoaXMgY2F0ZWdvcnkuCi0KLQkqIHJlYWQuYyAoc19hcHBfZmlsZSk6IENhbGwgZWxmX2ZpbGVfc3ltYm9sIGZvciBFTEYgZmlsZXMuCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZmlsZV9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9zdGFiX3N5bWJvbF9zdHJpbmcpOiBSZW5hbWVkIGZyb20gcGFfLi4uLAotCWFkZGVkIGFyZ3VtZW50IHRvIHNwZWNpZnkgc2VjdGlvbiBiYXNlIG5hbWUuCi0JKG9ial9lbGZfc3RhYl9nZW5lcmljKTogUmVuYW1lZCBmcm9tIC4uLl9zdGFiLiAgTmV3IGFyZ3VtZW50Ci0Jc3BlY2lmaWVzIHNlY3Rpb24gYmFzZSBuYW1lLgotCShvYmpfZWxmX3N0YWIpOiBOZXcgZnVuY3Rpb24sIGNhbGxzIG9ial9lbGZfc3RhYl9nZW5lcmljIHdpdGgKLQkiLnN0YWIiIGFzIHNlY3Rpb24gYmFzZSBuYW1lLgotCShvYmpfZWxmX3hzdGFiKTogTmV3IGZ1bmN0aW9uLCBjYWxscyBvYmpfZWxmX3N0YWJfZ2VuZXJpYy4KLQkob2JqX2VsZl90eXBlKTogSGFuZGxlICJvYmplY3QiLiAgVXNlIGJpdHdpc2Utb3IgdG8gbWVyZ2UgaW4KLQlzeW1ib2wgZmxhZ3MgcmF0aGVyIHRoYW4gc2ltcGx5IHJlcGxhY2luZywgc28gZ2xvYmFsL2xvY2FsIGZsYWdzCi0JYXJlIHByZXNlcnZlZC4KLQkob2JqX2VsZl9pZGVudCk6IFJld3JpdGUuCi0KLVR1ZSBKdW4gMTUgMTc6MDM6MjUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIHBhcmVudGRpciBzdXBwb3J0OyB1c2UgSU5TVEFMTF9YRk9STQotCi1XZWQgSnVuICA5IDExOjI2OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfcHNldWRvX3RhYmxlKTogLmFsaWduIHVzZXMgYSBwb3dlciBvZiB0d28KLQlmb3IgYW55IGEub3V0IHRhcmdldCwgbm90IGp1c3QgTGludXggYW5kIDM4NkJTRC4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKERPVF9MQUJFTF9QUkVGSVgpOiBEbyBub3QgZGVmaW5lIGZvciBhbnkgYS5vdXQKLQl0YXJnZXQuCi0KLU1vbiBKdW4gIDcgMTM6MzM6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTg4ay5jOiBEb24ndCBpbmNsdWRlIGZsb251bS5oLCBtZC5oLCBtODhrLmguICBUaGV5Ci0JZG9uJ3QgZXhpc3Qgb3IgZHVwbGljYXRlIG90aGVyIGluY2x1c2lvbnMuCi0KLQkqIGNvbmZpZy90Yy12YXguaCAoTk9fUkVMT0MpOiBEZWZpbmUuCi0KLU1vbiBKdW4gIDcgMDk6NTU6MDMgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogRml4IHBhcnNpbmcgb2YgYXNpIG51bWJlci4KLQlGaXggZXJyb3IgbWVzc2FnZS4KLQotU2F0IEp1biAgNSAxOTozMjo1MiAxOTkzICBUb3Jiam9ybiBHcmFubHVuZCAgKHRlZ2VAbmFkYS5rdGguc2UpCi0KLQkqIGdhcy9jb25maWcvbTg4ay1vcGNvZGUuaCAobTg4a19vcGNvZGVzKTogQWRkIDg4MTEwIGluc3RydWN0aW9ucy4KLQkqIGdhcy9jb25maWcvdGMtbTg4ay5jIChnZXRfcmVnKTogTmV3IGFyZyByZWdfcHJlZml4LiAgQ29tcGFyZSBmaXJzdAotCWNoYXIgdG8gcmVnX3ByZWZpeCBpbnN0ZWFkIG9mIHRvICdyJy4KLQkoY2FsY29wKTogQ2hhbmdlIGNhbGxzIHRvIGdldF9yZWcuCi0JKGNhbGNvcCk6IEhhbmRsZSBuZXcgY2FzZSAneCcgdG8gc2V0IHJlZ19wcmVmaXguCi0JKGNhbGNvcCk6IFNldCByZWdfcHJlZml4IHRvICdyJyBhZnRlciBlYWNoIGNhbGwgdG8gZ2V0X3JlZy4KLQkoY21wc2xvdCk6IEFkZCA4ODExMCBjb25kaXRpb25zLgotCi0JKiBnYXMvY29uZmlnL204OGstb3Bjb2RlLmg6IFN3YXAgY2FzZXMgZm9yICJyb3QiIGZvciBjb25zaXN0ZW5jeS4KLQotCSogZ2FzL2NvbmZpZy90Yy1tODhrLmMgKGdldF9iZik6IEFsd2F5cyByZXN0b3JlIGlucHV0X2xpbmVfcG9pbnRlcgotCWJlZm9yZSByZXR1cm5pbmcuCi0KLQkqIGdhcy9jb25maWcvbTg4ay1vcGNvZGUuaCAobTg4a19vcGNvZGVzKTogTWFrZSBlcXVhbCBtbmVtb25pY3MKLQlhZGphY2VudDsgbW92LnMgYW5kIG1vdi5kIHN3YXBwZWQuCi0JKG04OGtfb3Bjb2Rlcyk6IEZpeCB0eXBvIGByMicgLT4gYDInLgotCi1GcmkgSnVuICA0IDE1OjU5OjMxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9oODMwMC5jOiBTdXBwb3J0IGZvciBIOC8zMDAtSCBvcGNvZGVzLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAod19zdHJpbmdzKTogU3RyaW5nIHRhYmxlIGxlbmd0aCBpcyA0Ci0JYnl0ZXMsIG5vIG1hdHRlciB3aGF0IHRoZSBob3N0IGludCBzaXplIGlzLgotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhLSotb3NmKik6IE5ldy4KLQotRnJpIEp1biAgNCAwNzo1MToxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWVjb2ZmbCopOiBOZXcgdGFyZ2V0OyB1c2UgZWNvZmYgYW5kCi0JbWlwcy1saXQuCi0JKG1pcHMtKi1lY29mZiopOiBBZGRlZCB0cmFpbGluZyAnKicuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfYnVpbGRfcHJvY3MpOiBGb3JjZSB0aGUgYWRyIG9mIHRoZQotCWZpcnN0IEZEUiBpbiBhIGZpbGUgdG8gYmUgemVyby4KLQotVGh1IEp1biAgMyAxNDowOTo1OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogSnVtcCB0byAyLjEuNC4KLQotCSogY29uZmlnL2hvLWhwcGFic2QuaDogTmV3IGZpbGUsIGZyb20gUGV0ZXIgSG9vZ2VuYm9vbS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXNzZW1ibGUpOiBDYWxsIGJmZF9zZXRfZ3Bfc2l6ZSBvbmx5IGZvcgotCUVDT0ZGIGZvcm1hdC4KLQotVHVlIEp1biAgMSAxNToyMTo1NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2Fzc2VtYmxlKTogVGhlIDY4MDQwIGNwdSBkb2Vzbid0IHdhbnQgYQotCXNlcGFyYXRlICc4NTEgbW11LgotCi0JKiBjb25maWcvb2JqLWVsZi5jLCBjb25maWcvb2JqLWVsZi5oOiBVcGRhdGUgZm9yIG5ldyB0eXBlLCBtYWNybywKLQlhbmQgcm91dGluZSBuYW1lcy4gIEFzc3VtaW5nIDMyIGJpdHMgZm9yIG5vdy4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IExvb2sgZm9yIG1hY3JvCi0JZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmdfaG9vaywgaW5zdGVhZCBvZiBhc3N1bWluZyBhIGZ1bmN0aW9uCi0JYWx3YXlzIGV4aXN0cy4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmdfaG9vayk6IFJlbmFtZWQgZnJvbQotCXRjX2ZpbmFsX3Byb2Nlc3NpbmdfaG9vay4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKGVsZl90Y19maW5hbF9wcm9jZXNzaW5nX2hvb2spOiBVc2UgaXQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKGVsZl90Y19zeW1ib2wsIGVsZl90Y19tYWtlX3NlY3Rpb25zKTogTWFjcm9zCi0JbW92ZWQgaGVyZSBmcm9tIG9iai1lbGYuaC4KLQkqIGNvbmZpZy9vYmotZWxmLmg6IERvbid0IGluY2x1ZGUgQ1BVLXNwZWNpZmljIGhlYWRlciBmaWxlcy4KLQotU3VuIE1heSAzMCAxNjo0OTozNyAxOTkzICBQZXRlciBIb29nZW5ib29tICAoaG9vZ2VuQGZhc3QuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbjogY29uZmlndXJhdGlvbnMgc2hvdWxkIG1hdGNoIG9uICdocHBhKicgbm90ICdocHBhJy4KLQotCSogcmVhZC5jOiBBZGQgc3VwcG9ydCBmb3IgSFBQQSBhc3NlbWJseSBsYW5ndWFnZSBzeW50YXggKGRlbm90ZWQKLQl3aXRoICcjaWZkZWYgVENfSFBQQScpLgotCi0JKiBzeW1ib2xzLmM6IEFkZCBzdXBwb3J0IGZvciBIUFBBIGFzc2VtYmx5IGxhbmd1YWdlIHN5bnRheCAoZGVub3RlZAotCXdpdGggJyNpZmRlZiBUQ19IUFBBJykuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogIEFkZCBzdXBwb3J0IGZvciBIUFBBLXN0eWxlCi0JcmVsb2NhdGlvbnMuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmM6IFN0YWIgc3ltYm9scyB3ZXJlbid0IHdyaXR0ZW4gcHJvcGVybHkuCi0JKG9ial9lbGZfdmVyc2lvbik6Ci0JKG9ial9lbGZfZGVzYyk6Ci0JKG9ial9lbGZfd3JpdGVfc3ltYm9sKToKLQkob2JqX2VsZl93cml0ZV9zeW1ib2xfcCk6Ci0JKG9ial9lbGZfZnJvYl9zeW1ib2wpOgotCShlbGZfc3RhYl9zeW1ib2wpOgotCShlbGZfZnJvYl9maWxlKToKLQotCSogY29uZmlnL3RjLWhwcGEuYzogU3VwcG9ydCBmb3IgSFBQQSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb25zLgotCVJlbW92ZSBzb21lIHVudXNlZCBjb2RlLiAgU3VwcG9ydCBmb3IgSFBQQSBhc3NlbWJseSBsYW5ndWFnZQotCXN5bnRheC4KLQotCSogYXBwLmM6Ci0KLQkqIHN5bWJvbHMuYzoKLQotCSogY29uZmlnL29iai1lbGYuaDoKLQkob2JqX3dyaXRlX3N5bWJvbCk6Ci0JKG9ial9mcm9iX2ZpbGUpOgotCShlbGZfdGNfc3ltYm9sKToKLQkoZWxmX3RjX21ha2Vfc2VjdGlvbnMpOgotCi0JKiBjb25maWcvdGMtaHBwYS5oOgotCi1TdW4gTWF5IDMwIDIxOjQ0OjQ1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9yZWFkX2JlZ2luX2hvb2ssIGFkZF9maWxlKTogQXNzdW1lCi0JaGFzaF9uZXcgd2lsbCBoYXZlIHN1Y2NlZWRlZCBpZiBpdCByZXR1cm5zLgotCSogY29uZmlnL3RjLWEyOWsuYyAobWRfYmVnaW4pOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfYW91dF9maXhfdG9fY2hhcnMpOiBOb3cgbmJ5dGVzX3JfbGVuZ3RoIGlzCi0JY29uc3QuCi0JKG1vZGVfZnJvbV9kaXNwX3NpemUsIG9wY29kZV9zdWZmaWNfdG9fdHlwZSk6IE5vdyBpbmxpbmUgdW5kZXIKLQlnY2MuCi0JKGZpdHNfaW5fe3NpZ25lZCx1bnNpZ25lZH1fe2J5dGUsd29yZH0pOiBMaWtld2lzZS4KLQotCSogZXhwci5jOiBEZWxldGUgcmVnaXN0ZXIgZGVjbGFyYXRpb25zOyBnY2MgaWdub3JlcyB0aGVtIGFueXdheXMuCi0KLUZyaSBNYXkgMjggMTk6MDM6MzIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBoYXNoLmMgKGhhc2hfbmV3KTogVXNlIHhtYWxsb2MsIHNpbmNlIG1hbnkgY2FsbGVycyBkb24ndCBjaGVjawotCWZvciBmYWlsdXJlLgotCi1UaHUgTWF5IDI3IDEzOjAyOjE1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZnJhZ3MuYyAoemVyb19hZGRyZXNzX2ZyYWcsIGJzc19hZGRyZXNzX2ZyYWcpOiBUaGVzZSBhcmUKLQlleHRlcm5hbC4KLQotCSogdGMuaCAobWRfcmVsb2Nfc2l6ZSk6IFRoaXMgaXMgY29uc3QuCi0JKiBjb25maWcvdGMte2EyOWssaDgzMDAsaDg1MDAsaTM4NixpODYwLGk5NjAsbTY4ayxuczMyayx6OGt9LmMKLQkobWRfcmVsb2Nfc2l6ZSk6IE5vdyBjb25zdC4KLQotCSogY29uZmlnL2FvdXRfZ251LmggKGVudW0gbWFjaGluZV90eXBlLCBlbnVtIHJlbG9jX3R5cGUpOiBEZWxldGUKLQl0cmFpbGluZyBjb21tYXMuCi0JKiBhcy5oIChlbnVtIF9zZWdUKTogRGl0dG8uCi0KLQkqIHN0cnVjLXN5bWJvbC5oIChOX1RZUEVfc2VnKTogVGhpcyBzaG91bGQgYmUgY29uc3QuCi0KLVRodSBNYXkgMjcgMTE6NDM6NTkgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoYWRkX2ZpbGUpOiBDYXN0IGZpbGVfbmFtZSB0byBjaGFyICogaW4KLQlsaXN0aW5nX3NvdXJjZV9maWxlIGNhbGwuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9zdGFiX3N5bWJvbF9zdHJpbmcpOiBDYXN0IGZpcnN0IGFyZ3VtZW50Ci0Jb2Ygc3Vic2VnX25ldyBjYWxsIHRvIGVsaW1pbmF0ZSBjb25zdCBhdHRyaWJ1dGUuCi0JKG9ial9lbGZfc3RhYik6IERpdHRvLgotCShvYmpfc3ltYm9sX25ld19ob29rKTogQ2FzdCBmaXJzdCBhcmd1bWVudCBvZiBiemVybyBjYWxsIHRvIGNoYXIgKi4KLQotCSogcmVhZC5jIChzX2FsaWduX2J5dGVzKTogUHJvcGVybHkgcmVjb3JkIGFsaWdubWVudC4KLQotCSogZXhwci5jIChfXyk6IFVuZGVmaW5lIF9fIG1hY3JvIGJlZm9yZSB1c2UsIHNpbmNlIE9TRi8xIHVzZXMgaXQKLQlmb3IgdGhlIHByb3RvdHlwZS9ubyBwcm90b3R5cGUgbWFjcm8uCi0KLQkqIGFzLmMgKGdvdF9zaWcpOiBEb24ndCBkbyByZXR1cm4gKChTSUdUWSkgMCksIFNJR1RZIG1pZ2h0IHdlbGwgYmUKLQl2b2lkLgotCi0JKiBhcy5oIChyZWxheF9zdGF0ZVQgZW51bSk6IERlbGV0ZSB0cmFpbGluZyBjb21tYS4KLQotVGh1IE1heSAyNyAxMTowNzo1MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IExldCBsaW5lX2NvbW1lbnRfY2hhcnMgb3ZlcnJpZGUKLQljb21tZW50X2NoYXJzLgotCShkb19zY3J1Yl9uZXh0X2NoYXIpOiBJZiBhIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIgaXMgbm90IGF0IHRoZQotCXN0YXJ0IG9mIGEgbGluZSwgdHJlYXQgaXQgYXMgYSBjb21tZW50IGNoYXJhY3RlciBpZiBpdCBpcyBvbmUuCi0JRm9yIGEgQ1BQIGxpbmUgY29tbWVudCB1c2UgcHNldWRvLW9wIC5hcHBsaW5lIHJhdGhlciB0aGFuIC5saW5lLgotCSogaW5wdXQtc2NydWIuYyAobG9naWNhbF9pbnB1dF9saW5lKTogTWFrZSBpbnQgcmF0aGVyIHRoYW4KLQl1bnNpZ25lZC4KLQkoaW5wdXRfc2NydWJfcHVzaCwgaW5wdXRfc2NydWJfYmVnaW4pOiBJbml0aWFsaXplCi0JbG9naWNhbF9pbnB1dF9saW5lIHRvIC0xIHJhdGhlciB0aGFuIDAuCi0JKGJ1bXBfbGluZV9jb3VudGVycyk6IEluY3JlbWVudCBsb2dpY2FsX2lucHV0X2xpbmUuCi0JKG5ld19sb2dpY2FsX2xpbmUpOiBJZiBsaW5lX251bWJlciBpcyAtMiwgZGVjcmVtZW50Ci0JbG9naWNhbF9pbnB1dF9saW5lLgotCShhc193aGVyZSk6IFVzZSBsb2dpY2FsX2lucHV0X2xpbmUgZXZlbiBpZiBpdCBpcyAwLgotCSogcmVhZC5oIChzX2FwcF9maWxlIHByb3RvdHlwZSk6IE5vdyB0YWtlcyBhbiBpbnQgYXJndW1lbnQuCi0JKiByZWFkLmMgKHBvdGFibGUpOiBNYWtlIC5hcHBmaWxlIGNhbGwgc19hcHBfZmlsZSB3aXRoIDEuICBOZXcKLQkuYXBwbGluZSBwc2V1ZG8tb3AgY2FsbHMgc19hcHBfbGluZS4KLQkoc19hcHBfZmlsZSk6IElmIC5hcHBmaWxlLCBjYWxsIG5ld19sb2dpY2FsX2xpbmUgd2l0aCAtMiB0bwotCWFjY291bnQgZm9yIG5ld2xpbmUgaW5zZXJ0ZWQgYnkgZG9fc2NydWJfbmV4dF9jaGFyLiAgSWYgbGlzdGluZywKLQljYWxsIGxpc3Rpbmdfc291cmNlX2ZpbGUuCi0JKHNfYXBwX2xpbmUpOiBOZXcgZnVuY3Rpb24gdG8gaGFuZGxlIGZha2UgcHNldWRvLW9wIC5hcHBsaW5lLgotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBNYWtlIC5hcHBsaW5lIGNhbGwKLQlvYmpfY29mZl9sbi4KLQkob2JqX2NvZmZfbG4pOiBBZGRlZCBhcmd1bWVudCB0byBpbmRpY2F0ZSB3aGV0aGVyIC5hcHBsaW5lLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBNYWtlIC5hcHBsaW5lIGNhbGwKLQlvYmpfY29mZl9sbi4KLQkob2JqX2NvZmZfbG4pOiBBZGRlZCBhcmd1bWVudCB0byBpbmRpY2F0ZSB3aGV0aGVyIC5hcHBsaW5lLgotCSogY29uZmlnL3RjLW1pcHMuYyAoc19maWxlKTogUGFzcyBhcmd1bWVudCB0byBzX2FwcF9maWxlLgotCi1UdWUgTWF5IDI1IDExOjU5OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1ib3V0LmggKFNfR0VUX1ZBTFVFKTogUmVtb3ZlZCB1bm5lY2Vzc2FyeSBjYXN0LgotCi1UaHUgTWF5IDIwIDE5OjE0OjI0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBTdHJhaWdodGVuIG91dCBjaGVjayBmb3IKLQlpbnZhbGlkIHZhbHVlcy4KLQotV2VkIE1heSAxOSAwNzozMzoxNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDUwMDAuYyAoYnVpbGRfYnl0ZXMpOiBVbmRlcnN0YW5kIEByZCBtb2RlIGFuZCBidWlsZAotCXJlbG9jYXRpb25zIGNvcnJlY3RseS4KLQotTW9uIE1heSAxNyAxNTowNjoyNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBMZWF2ZSBvdXQgVEVYSTJEVkkgZm9yIG5vdywgYmVjYXVzZQotCWl0J3Mgd3JvbmcuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogQXBwbHkgcmFuZ2UgY2hlY2tzIGFuZCB3YXJuCi0JaWYgdmFsdWUgaXMgb3V0IG9mIHJhbmdlLgotCi0JUGF0Y2ggZnJvbSBNaW5oIFRyYW4tTGU6Ci0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBGb3IgaW4vb3V0IHBvcnQgcmVnaXN0ZXIgdXNlZAotCWFzIGJhc2UgcmVnLCBpbmNsdWRlIEluT3V0UG9ydFJlZyBpbiBvcGVyYW5kIHR5cGUuCi0JKE1BVENIKTogQWNjZXB0IG92ZXJsYXAgdmFsdWUgb2YgSW5PdXRQb3J0UmVnLgotCi1Nb24gTWF5IDE3IDA5OjI5OjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChhZGRfZmlsZSwgb2JqX2Vjb2ZmX2xvYywgb2JqX2Vjb2ZmX3N0YWIpOgotCUFkZCBjYWxscyB0byBsaXN0aW5nIHJvdXRpbmVzIHRvIHByb2R1Y2UgY29tYmluZWQgc291cmNlL2Fzc2VtYmxlcgotCWxpc3RpbmdzLgotCShvYmpfZWNvZmZfc3RhYik6IENyZWF0ZSBhIGZpbGUgcG9pbnRlciBpZiBub25lIHVzZWQgeWV0LgotCShlY29mZl9mcm9iX2ZpbGUpOiBTZXQgc3ltY291bnQgdG8gY29ycmVjdCB2YWx1ZS4KLQotRnJpIE1heSAxNCAwNjo1MzozMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBCdW1wIHRvIHZlcnNpb24gMi4xLCBpbiBwcmVwYXJhdGlvbiBmb3IKLQlyZWxlYXNlLgotCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoSF9HRVRfSEVBREVSX1NJWkUsIEhfU0VUX1NZTUJPTF9UQUJMRV9TSVpFKToKLQlEZWZpbmUgaW4gdGVybXMgb2YgY29uc3RhbnRzLCBub3QgQyBzdHJ1Y3R1cmUgc2l6ZXMuCi0KLQkqIGNvbmZpZy90Yy1yczYwMDAuYywgY29uZmlnL3RjLXJzNjAwMC5oOiBEZWxldGUgZW1wdHkgZmlsZXMuCi0KLVRodSBNYXkgMTMgMTc6MDE6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2hlYWRlcl9hcHBlbmQpOiBEb24ndCBkZWZpbmUgaWYgaXQncwotCWRlZmluZWQgYXMgYSBtYWNyby4KLQkqIGNvbmZpZy9vYmotaHAzMDAuaCAob2JqX2hlYWRlcl9hcHBlbmQpOiBEZWZpbmUgaXQgYXMgYSBtYWNyby4KLQkqIGNvbmZpZy9vYmotaHAzMDAuYyAoaHAzMDBfaGVhZGVyX2FwcGVuZCk6IE5ldyBmdW5jdGlvbi4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERvbid0IGJvdGhlciBjbGVhbmluZyB1cCBkb2MgZmlsZXM7Ci0JdGhleSBhcmVuJ3QgZ29pbmcgdG8gYmUgaW4gdGhpcyBkaXJlY3RvcnkuCi0KLVRodSBNYXkgMTMgMDc6NTE6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBIYW5kbGUgYWJzb2x1dGUKLQlzeW1ib2xzLgotCi0JKiB0Yy5oIChUQ19DT0ZGX1NJWkVNQUNIREVQKTogRG9uJ3QgZGVmaW5lIGhlcmUuCi0JKiBjb25maWcvdGMtc2guaCAoVENfQ09GRl9TSVpFTUFDSERFUCk6IERlZmluZSBoZXJlIGluc3RlYWQuCi0KLU1vbiBNYXkgMTAgMDY6MDE6MTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19TeW1ib2xfdHlwZV9saXN0KTogRG9uJ3QgYm90aGVyIHdpdGgKLQlpbml0aWFsaXphdGlvbi4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXRzKTogVHJlYXQgbTY4Ki0qLXN5c3YqIGxpa2UgbTY4ay0qLWNvZmYuCi0KLVdlZCBNYXkgIDUgMTQ6MDA6NDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IENvcnJlY3QgZmxvYXRpbmcgcG9pbnQgZG91YmxlIHdvcmQKLQlsb2FkcyBhbmQgc3RvcmVzIGZvciBiaWcgZW5kaWFuIHRhcmdldC4KLQotV2VkIE1heSAgNSAwODozOToyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWkzODYuYzogUmVwbGFjZSBTRUdfKiB3aXRoICpfc2VjdGlvbiwgZml4IHVwIHN1YnNlZ18qCi0JY2FsbHMuICBEZWxldGVkIHNvbWUgdW51c2VkIGNvZGUuCi0JKiBjb25maWcvb2JqLWNvZmYuYzogTGlrZXdpc2UuCi0KLQlFTEYgc3VwcG9ydCwgbW9zdGx5IGNvbnRyaWJ1dGVkIGJ5IFV0YWg6Ci0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24sIG9ial9lbGZfc3RhYiwgb2JqX2VsZl9saW5lLAotCW9ial9lbGZfdHlwZSk6IFJld3JpdGUuCi0JKG9ial9lbGZfZnJvYl9zeW1ib2wsIGVsZl9zdGFiX3N5bWJvbF9zdHJpbmcsIGVsZl9zdGFiX3N5bWJvbCwKLQlvYmpfZWxmX2Rlc2MsIG9ial9lbGZfdmVyc2lvbiwgb2JqX3N5bWJvbF9uZXdfaG9vaywgb2JqX2VsZl9zaXplKToKLQlOZXcgZnVuY3Rpb25zLgotCShvYmpfZWxmX2lkZW50KTogRHVtbXkuCi0JKiBjb25maWcvb2JqLWVsZi5oIChGQUxTRSwgVFJVRSwgU18qLCB0Y19mcm9iX3N5bWJvbCwKLQlUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IE5ldyBtYWNyb3MuCi0JKGdkYl9zZWN0aW9uKTogTmV3IHZhcmlhYmxlIGRlY2wuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2F0b2YpOiBSZXR1cm4gemVybywgbm90IGVtcHR5IHN0cmluZywgb24KLQlzdWNjZXNzLgotCi0JQkZEX0FTU0VNQkxFUiBjb25kaXRpb25hbCBjaGFuZ2VzOgotCSogY29uZmlnL29iai1jb2ZmLmMgKGxpbmVub19yb290UCwgc2VnX05fVFlQRSwgKl9zZWN0aW9uX2hlYWRlcik6Ci0JRG9uJ3QgZGVmaW5lIHRoZXNlLgotCShTQV9TRVRfU1lNX0VORE5EWCwgU0FfU0VUX1NZTV9UQUdORFgpOiBOZXcgZnVuY3Rpb25zLgotCShmZXRjaF9jb2ZmX2RlYnVnX3NlY3Rpb24pOiBEaXR0by4KLQkob2JqX2NvZmZfZW5kZWYpOiBDYWxsIGZldGNoX2NvZmZfZGVidWdfc2VjdGlvbi4KLQkoc3RydWN0IGxpbmVfbm8pOiBOZXcgdHlwZS4KLQkoY19zeW1ib2xfbWVyZ2UpOiBOZXcgd2F5IGZvciBjb3B5aW5nIGF1eCBmaWVsZHMuCi0JKGNfZG90X2ZpbGVfc3ltYm9sKTogUHV0IHN5bWJvbCBpbiBhYnNvbHV0ZSBzZWN0aW9uLCBhbmQgc2V0IGZsYWcKLQlCU0ZfREVCVUdHSU5HLgotCShmdW5jdGlvbl9saW5lb2ZmKTogTmV3IHN5bWJvbC4KLQkoZnVuY3Rpb25fbGluZW9mZiwgdGV4dF9saW5lbm9fbnVtYmVyLCBvdXJfbGluZW5vX251bWJlciwKLQlsaW5lbm9fbGFzdFApOiBEb24ndCBkZWZpbmUuCi0JKGNfbGluZV9uZXcpOiBEb24ndCBkZWZpbmUuCi0JKG9ial9lbWl0X2xpbmVubywgb2JqX2NvZmZfZW5kZWYpOiBVc2UgYWJvcnQgY2FsbHMgYXMsIHVoLAotCXBsYWNlaG9sZGVycywgdW50aWwKLQlsaW5lLW51bWJlciByZWNvcmRpbmcgZ2V0cyBpbXBsZW1lbnRlZC4KLQkob2JqX25ld19zeW1ib2xfaG9vayk6IE5ldyBjb2RlIGZvciBoYW5kbGluZyBhdXggZmllbGRzLgotCShhZGRfbGluZW5vLCBhZGRfbGluZXN5bSk6IE5ldyBmdW5jdGlvbnMuCi0JKG9ial9jb2ZmX2xuKTogQ2FsbCBhZGRfbGluZW5vLCBub3QgY19saW5lX25ldy4KLQkob2JqX2NvZmZfZW5kZWYpOiBOZXcgY29kZSBmb3IgaGFuZGxpbmcgc3ltYm9sIG5hbWVzLiAgTmV3IGxpbmVubwotCWNvZGUuICBMb29rIGZvciBzZWN0aW9uIG5hbWUgIipERUJVRyoiIGZvciBkZWJ1Z2dpbmcgc2VjdGlvbi4KLQkoYWxpZ24sIGNvZmZfY2hlY2tfZmlsZV9zeW1ib2xzLCBvYmpfY29mZl9zZWN0aW9uLAotCWNvZmZfZnJvYl9maWxlKTogTmV3IGZ1bmN0aW9ucy4KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBSZW9yZGVyZWQgc29tZSBpbmNsdWRlcy4KLQkoQllURV9PUkRFUklORywgRklMRV9IRUFERVJfTUFHSUMsIHNlZ19OX1RZUEUsIE5fVFlQRV9zZWcsCi0JREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFLCBBT1VUSERSLCBBT1VUSERSU0laRSk6IERvbid0Ci0JZGVmaW5lIHRoZXNlLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUywgSTk2MF9TWU1fRklFTERTKTogTmV3IG1hY3Jvcy4KLQkoU1lNX0FVWEVOVCk6IE5ldyBtYWNybyAoZm9yIG5vbi1CRkRfQVNTRU1CTEVSIHRvbykgZm9yIGFjY2Vzc2luZwotCWF1eCBlbnRyaWVzLiAgTW9zdCBTQV8qIG1hY3JvcyBub3cgdXNlIGl0IHVuY29uZGl0aW9uYWxseS4KLQkoU18qKTogVXNlIGBic3ltJyBmaWVsZCwgYW5kIGFjY2VzcyBCRkQgcHJpdmF0ZSBkYXRhLgotCShTRl8qKTogVXNlIGBzeV9mbGFncycgc3ltYm9sIGZpZWxkIGZvciBtb3N0IG9mIHRoZXNlLgotCShIXyosIG9iamVjdF9oZWFkZXJzLCBsaW5lbm8sIGxpbmVub18qUCwgT0JKX0VNSVRfTElORU5PKTogRG9uJ3QKLQlkZWZpbmUuCi0JKCpfc2VjdGlvbl9oZWFkZXIpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9jb252ZXJ0X2ZyYWcsIG1kX2FwcGx5X2ZpeCk6IENoYW5nZWQKLQlpbnRlcmZhY2UuCi0JKHRjX2dlbl9yZWxvYykgW0kzODZDT0ZGXTogTmV3IGZ1bmN0aW9uLgotCSh0Y19hb3V0X2ZpeF90b19jaGFycywgdGNfY29mZl9maXgycnR5cGUpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQVJHRVRfQVJDSCwgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBOZXcKLQltYWNyb3MuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzdGFja19pbml0KTogRG9uJ3QgZG8gYXNzaWdubWVudHMgaW5zaWRlCi0JY29uZGl0aW9ucy4KLQkob2JqX2NvZmZfZGVmKTogU2ltcGxpZmllZCBoYW5kbGluZyBvZiBzeW1ib2wgbmFtZSBhIGJpdC4KLQkodGFnX2luc2VydCk6IE5hbWUgYXJndW1lbnQgaXMgbm93IHBvaW50ZXIgdG8gQ09OU1QuCi0JKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBDb21tZW50ZWQgb3V0LgotCi0JKiBjb25maWcvb2JqLWNvZmYuaDogVXNlIFBBUkFNUyBtYWNybyBpbiBwcm90b3R5cGVzLgotCi0JKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgaW5kaXJlY3QKLQl0aHJvdWdoIGZyY2hhaW5QIHBvaW50ZXIgaWYgaXQgaXMgbnVsbC4KLQotCSogY29uZmlndXJlLmluOiBXYXJuIGlmIEJGRCBtb2RlIGlzIGV4cGxpY2l0bHkgdHVybmVkIG9mZiBidXQgaXMKLQlyZXF1aXJlZCBieSBzcGVjaWZpZWQgdGFyZ2V0LgotCShtaXBzIGVjb2ZmIHRhcmdldHMpOiBEb24ndCBuZWVkIHRvIHNldCBiZmRfZ2FzIGhlcmU7IGl0IGdldHMKLQl0YWtlbiBjYXJlIG9mIGxhdGVyLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoY3Jhd2xfc3ltYm9scyk6IERvbid0IGNsZWFyIHN5X2ZvcndhcmQKLQlmaWVsZC4KLQkoeWFua19zeW1ib2xzKTogTWVyZ2Ugc3ltYm9scyBvbmx5IGlmIHN5X2ZvcndhcmQgaXMgbnVsbC4KLQotCSogY29uZmlnL3RjLW02OGsuaCAoQU9VVF9NQUNIVFlQRSk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5Ci0JZGVmaW5lZC4KLQotCSogdGMuaCAobWRfY29udmVydF9mcmFnKSBbQkZEX0FTU0VNQkxFUl06IFNlY3Rpb24gYXJnIGlzIG5vdAotCXBvaW50ZXIuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9jb252ZXJ0X2ZyYWcpIFtCRkRfQVNTRU1CTEVSXTogRGl0dG8uCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChMT0NBTF9MQUJFTCkgW09CSl9FTEZdOiBBbnl0aGluZyBzdGFydGluZwotCXdpdGggIi4iIGlzIGEgbG9jYWwgbGFiZWwuCi0KLQkqIGNvbmZpZy90ZS1ocHBhLmgsIGNvbmZpZy90Yy1ocHBhLmgsIGNvbmZpZy90Yy1ocHBhLmM6IE5ldyBjb25maWcKLQlmaWxlcy4KLQotCSogY29uZmlnL3RlLWxpbnV4LmgsIGNvbmZpZy90ZS0zODZic2QuaDogTmV3IGNvbmZpZyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWxpbnV4LCBpMzg2LSotYnNkKTogVXNlIHRoZW0uCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQVJHRVRfRk9STUFUKTogU2VsZWN0IGZvcm1hdCBiYXNlZCBvbiB0YXJnZXQKLQllbnZpcm9ubWVudC4KLQkoRE9UX0xBQkVMX1BSRUZJWCk6IERvbid0IGRlZmluZSBmb3IgMzg2YnNkIG9yIExpbnV4LgotCi1XZWQgTWF5ICA1IDEzOjE0OjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChpbml0X2ZpbGUpOiBTZXQgZk1lcmdlIHRvIDAgc2luY2UgZGJ4IHNlZW1zCi0JdG8gd2FudCBpdCB0aGF0IHdheS4KLQkoZWNvZmZfYnVpbGRfc3ltYm9scyk6IFR1cm4gbG9jYWwgc3RfUHJvYyBzeW1ib2xzIGludG8KLQlzdF9TdGF0aWNQcm9jIHN5bWJvbHMuICBTZXQgaW5kZXggZmllbGQgb2YgZXh0ZXJuYWwgc3RfUHJvYyBhbmQKLQlzdF9zdGF0aWNQcm9jIHN5bWJvbHMgY29ycmVjdGx5LgotCSogY29uZmlnL3RjLW1pcHMuaCAoTk9fTElTVElORyk6IERvbid0IGRlZmluZS4gIFBlb3BsZSBtaWdodCB3YW50Ci0JbGlzdGluZ3MuCi0KLVR1ZSBNYXkgIDQgMjE6MjI6NTQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWhwMzAwLmgsIGNvbmZpZy9vYmotaHAzMDAuYywgY29uZmlnL3RlLWhwMzAwLmg6IE5ldwotCWZpbGVzLgotCSogY29uZmlndXJlLmluIChtNjhrLSotaHB1eCk6IFVzZSB0aGVtLgotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX3ByZV93cml0ZV9ob29rKTogVXNlIEFPVVRfVkVSU0lPTiBpZgotCWRlZmluZWQsIG90aGVyd2lzZSB6ZXJvLgotCi0JKiBjb25maWcvYW91dF9nbnUuaCAoT01BR0lDKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4KLQotTW9uIE1heSAgMyAxNTo1OTozMiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogQWxsb3cgYW55IGFicyBleHByZXNzaW9uIGFzIGFuCi0JYWRkcmVzcyBzcGFjZSBudW1iZXIuCi0KLVdlZCBBcHIgMjggMTk6MTE6MjIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oIChUQVJHRVRfREVGQVVMVCk6IERvbid0IGRlZmF1bHQgdGhpcyBhdCBhbGwuCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmM6IEluY2x1ZGUgY3R5cGUuaC4KLQkoZGVmaW5lX3NvbWVfcmVncyk6IEFkZGVkIHNwZWNpYWwtcHVycG9zZSByZWdpc3RlcnMgZm9yIDI5MDUwLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChjb21tZW50X2NoYXJzKSBbVEVfSTM4NkFJWF06IEluY2x1ZGUgIi8iLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogRG9uJ3Qgc2V0IFNUWVBfUkVHIGhlcmUuCi0JKGNoYW5nZV90b19zZWN0aW9uKTogU2V0IGl0IGhlcmUgaW5zdGVhZC4KLQotV2VkIEFwciAyOCAxMzo0MDoyOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9zeW1ib2xfbmV3X2hvb2spOiBNYWtlIHVwIGEgLmZpbGUgaWYgb25lCi0JaGFzbid0IGJlZW4gc2VlbiB5ZXQuCi0JKGFkZF9lY29mZl9zeW1ib2wpOiBEb24ndCByZWZlciB0byBjdXJfZmlsZV9wdHIgaWYgaXQgaXMgTlVMTC4KLQotTW9uIEFwciAyNiAxODoyOTowNSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNoLmNoLCBjb25maWcvdGMtc2guaDogTmV3IGZpbGVzIHN1cHBvcnRpbmcgSGl0YWNoaQotCVNILgotCi1Nb24gQXByIDI2IDEyOjI4OjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChvcGVyYW5kKTogRml4IHVuYXJ5IHBsdXMgb3BlcmF0b3IgKHByZXZpb3VzbHkgd2FzIHRoZQotCXNhbWUgYXMgJ34nIG9wZXJhdG9yISkuCi0KLVdlZCBBcHIgMjEgMDA6MjA6MTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogRGVmaW5lIGV2ZW4gaWYgQkZEIGlzIGRlZmluZWQuCi0JKHdyaXRlX29iamVjdF9maWxlKTogRG8gZGVmaW5lIGlmIEJGRF9BU1NFTUJMRVIuICBJbnZva2UKLQlvYmpfY2hlY2tfZmlsZV9zeW1ib2xzIGlmIGRlZmluZWQuICBDYWxsIHZlcmlmeV9zeW1ib2xfY2hhaW5fMgotCWluc3RlYWQgb2Ygb3Blbi1jb2RpbmcgaXQuICBGaXggc29tZSBidWdzIGluIHBhdGNoaW5nIHVwIHN5bWJvbAotCWNoYWluLgotCShyZWxheF9zZWdtZW50KTogTWFrZSBzb21lIGNvZGUgd2UgIm91Z2h0IHRvIGJlIGFibGUgdG8iIHVzZSBmb3IKLQlhbGwgdGFyZ2V0cyBubyBsb25nZXIgY29uZGl0aW9uYWxpemVkIG9uIG5zMzJrIHRhcmdldDsgaW5zdGVhZCwgZG8KLQlpdCBhbHdheXMsIGFuZCBpZiB0aGUgYXBwcm9wcmlhdGUgY29uZGl0aW9ucyBmYWlsLCBhYm9ydC4KLQotCSogc3ltYm9scy5jIChERUJVRyk6IEVuYWJsZWQuCi0JKHN5bWJvbF9uZXcpOiBNYWtlIHN1cmUgYmZkX21ha2VfZW1wdHlfc3ltYm9sIHdvcmtzLgotCSh2ZXJpZnlfc3ltYm9sX2NoYWluXzIpOiBOZXcgZnVuY3Rpb247IHRha2VzIG9uZSBzeW1ib2wgYXMKLQlhcmd1bWVudCwgYW55d2hlcmUgaW4gdGhlIGNoYWluLgotCShkb2xsYXJfbGFiZWwqKTogVXNlIGRlZmF1bHQgaW5pdGlhbGl6ZXJzLgotCi0JKiBhcy5jIChwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpOiBDYWxsIG1kX2JlZ2luIGhlcmUuLi4KLQkobWFpbik6IC4uLmFuZCBub3QgaGVyZS4KLQotCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0ZPUk1BVCk6IFVzZSBhLm91dC1zdW5vcy1iaWcgZm9yIGEub3V0LgotCSh0Y19mcm9iX3N5bWJvbCk6IE5ldyBtYWNybzogR2V0IHJpZCBvZiBzeW1ib2xzIGluIHJlZ19zZWN0aW9uLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChvbWFnaWMpOiBEb24ndCBkZWZpbmUgZm9yIEJGRF9BU1NFTUJMRVIuCi0JKGFkZF9maXgsIGFkZF9mcmFnKTogTm93IGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIG1hY3Jvcy4KLQkobTY4a19yZWdfcGFyc2UsIG02OGtfaXAsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBnZXRfbnVtLAotCXNfZGF0YTEsIHNfZGF0YTIsIHNfYnNzKTogVXNlIG5ldyAqX3NlY3Rpb24gbmFtZXMsIGZvcgotCWNvbXBhdGliaWxpdHkgd2l0aCBCRkRfQVNTRU1CTEVSIG1vZGU7IHJld3JpdGUgc3dpdGNoIHN0YXRlbWVudHMKLQl0byBoYW5kbGUgbm9uLWludGVncmFsIHNlZ1QuCi0JKHRjX2NvZmZfZml4MnJ0eXBlLCB0Y19hb3V0X2ZpeF90b19jaGFycywKLQl0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBEb24ndCBkZWZpbmUgZm9yIEJGRF9BU1NFTUJMRVIuCi0JKHRjX2dlbl9yZWxvYyk6IE5ldyByb3V0aW5lIGZvciBCRkRfQVNTRU1CTEVSLgotCShtZF9hcHBseV9maXgsIG1kX2FwcGx5X2ZpeF8yKTogUmVuYW1lZCBvbGQgbWRfYXBwbHlfZml4IHRvCi0JbWRfYXBwbHlfZml4XzI7IG5ldyBtZF9hcHBseV9maXggZGVmaW5pdGlvbiB2YXJpZXMgaW50ZXJmYWNlCi0JZGVwZW5kaW5nIG9uIEJGRF9BU1NFTUJMRVIuCi0JKG1kX2NvbnZlcnRfZnJhZywgbWRfY29udmVydF9mcmFnXzEpOiBMaWtld2lzZS4gIFVzZSBuZXcgKl9zZWN0aW9uCi0JbmFtZXMuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmM6IEluY2x1ZGUgY29uZmlnLmguCi0JKHZlcnNpb25fc3RyaW5nKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCShXcml0ZV9WTVNfTUhEX1JlY29yZHMpOiBVc2UgR0FTX1ZFUlNJT04gaW5zdGVhZC4KLQkodm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmKTogTmV3IGZ1bmN0aW9uLCB0YWtlbiBmcm9tIFZNUyBjb2RlIGluCi0Jc3ltYm9scy5jLgotCShfZG9wcm50KTogRGVsZXRlZC4KLQkoVk1TX1N0b3JlX1N0cnVjdCwgVk1TX0RlZl9TdHJ1Y3QsIFZNU19TZXRfU3RydWN0LAotCVZNU19UQlRfQmxvY2tfRW5kLCBnZXRfVk1TX3RpbWVfb25fdW5peCwgZ2VuZXJhdGVfc3VmZml4LAotCVZNU19Qc2VjdF9TcGVjKTogRml4ZWQgdG8gY29tcGlsZSB1bmRlciB0cmFkaXRpb25hbCBDLgotCSogY29uZmlnL29iai12bXMuaDogVXNlIFBBUkFNUyBtYWNyby4KLQkodm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmKTogRGVjbGFyZS4KLQkoUkVTT0xWRV9TWU1CT0xfUkVERUZJTklUSU9OKTogTmV3IG1hY3JvLgotCSogc3ltYm9scy5jIChjb2xvbik6IFJlbW92ZSBzb21lIFZNUy1zcGVjaWZpYyBjb2RlLCBsb29rIGZvcgotCVJFU09MVkVfU1lNQk9MX1JFREVGSU5JVElPTiBtYWNybyBpbnN0ZWFkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRG9uJ3QgdHJ5IGV4cGFuZGluZyBEQmNjCi0JaW5zdHJ1Y3Rpb25zLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBSZW9yZGVyZWQgc29tZSBmdW5jdGlvbnMgc28gaW5saW5pbmcgbWlnaHQKLQl3b3JrLiAgVXNlIFBBUkFNUyBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0JKHJlbG9jKTogTmV3IHJvdXRpbmUuCi0JKG1kX2Fzc2VtYmxlKTogUmVhcnJhbmdlIHN3aXRjaCBzdGF0ZW1lbnRzIHRvIHdvcmsgd2l0aAotCW5vbi1pbnRlZ3JhbCBzZWdULgotCi0JKiBzdHJ1Yy1zeW1ib2wuaCBbQkZEX0FTU0VNQkxFUl06IFVuZGVmaW5lCi0JU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyBiZWZvcmUgZGVmaW5pbmcgaXQuCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ld19yZXN0KTogTm93IHN0YXRpYy4KLQotCSogcmVhZC5jIChwc2V1ZG9fc2V0KTogQmV0dGVyIGVycm9yIG1lc3NhZ2UgZm9yIGRpZmZlcmVuY2Ugb2YKLQlzeW1ib2xzIGluIGRpZmZlcmVudCBmcmFncy4KLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogUGFzcyBkb3duIHNvbWUgbmV3IHZhcmlhYmxlcywgaW5kaWNhdGluZwotCXBhdGhuYW1lIG9yIHByb2dyYW0gbmFtZSBmb3IgY2MsIG5tLCBvYmpkdW1wLgotCi0JKiBhcy5oIChPVVRQVVRfRkxBVk9SKTogTmV3IG1hY3JvLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IFVzZSBPVVRQVVRfRkxBVk9SLgotCi0JKiBjb25maWd1cmUuaW46IEluaXRpYWxpemUgYmZkX2dhcyBwcm9wZXJseS4gIFdhcm4gdGhhdCBFTEYKLQlzdXBwb3J0IGlzIGluY29tcGxldGUuCi0KLVRodSBBcHIgMTUgMjI6Mzk6MDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGZsb2F0X2NvbnMpOiBBY2NlcHQgbnVsbCBwb2ludGVyIHJldHVybiBmcm9tIG1kX2F0b2YuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hdG9mKTogUmV0dXJuIG51bGwgZm9yIHN1Y2Nlc3MuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXRvZik6IERpdHRvLgotCi1UaHUgQXByIDE1IDE2OjA0OjM5IDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBmb3JtYXR0aW5nIGFuZCBjb21tZW50IGNsZWFudXBzOyBzaG93IFNQQVJDCi0JYWx0ZXJuYXRpdmUgb3B0aW9ucyBpbiBzYW1lIHN0eWxlIGFzIG90aGVyIG1hY2hpbmVzOyBzaW1wbGlmeSBzb21lCi0JY29uZGl0aW9uYWwgdXNlOyBpbmNsdWRlIEdQTCBhcyBzZXBhcmF0ZSBmaWxlIChmcm9tIHRleGluZm8gZGlyKQotCi0JKiBkb2MvTWFrZWZpbGUuaW46IChhcy5pbmZvKSBpbmNsdWRlIGRpcmVjdG9yeSBjb250YWluaW5nIEdQTCBpbgotCW1ha2VpbmZvIHNlYXJjaCBwYXRoCi0KLQkqIGRvYy9oOC50ZXhpOiBuZXcgZmlsZTsgY29uZGl0aW9uYWwgc2V0dGluZ3MgZm9yIEdBUyBtYW51YWwKLQlvbiBIaXRhY2hpIGNoaXBzCi0KLVR1ZSBBcHIgMTMgMTU6MzE6NDAgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogZG9jL2FzLnRleGluZm86IG1lbnRpb24gU1BBUkMgYXJjaGl0ZWN0dXJlIG9wdGlvbnMuCi0KLUZyaSBBcHIgIDkgMTc6NDM6MTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVhcnJhbmdlZCB3aGl0ZXNwYWNlIGluIHBlci1ob3N0L3Blci10YXJnZXQKLQlzZWN0aW9ucy4gIEFkZGVkIGhvb2tzIGZvciBkcm9wcGluZyBpbiBIUFBBIHN1cHBvcnQgKG5vdCBpbmNsdWRlZAotCXlldCkuICBTZXBhcmF0ZSBvdXQgb3ZlcnJpZGVzIG9mIHZhcmlhYmxlcyBiYXNlZCBvbiB0YXJnZXQgZm9ybWF0Ci0JYW5kIGJmZC1nYXMgc2VsZWN0aW9uIGZyb20gYWN0dWFsIHRhcmdldC1zcGVjaWZpYyBjb21tYW5kcy4gIEFkZAotCWVycm9yIG1lc3NhZ2UgZm9yIHJlY29nbml6ZWQgYnV0IHVuc3VwcG9ydGVkIGZvcm1hdCBuYW1lLgotCi1GcmkgQXByICA5IDA5OjA1OjQ3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5oIChlY29mZl9idWlsZF9saW5lbm8pOiBNYWtlIGlsaW5lTWF4IGluCi0Jc3ltYm9saWMgaGVhZGVyIG1hdGNoIGNsaW5lIGluIEZEUjsgdGhlIG5hdGl2ZSBsaW5rZXIgc2VlbXMgdG8KLQl3YW50IHRoYXQuCi0KLVRodSBBcHIgIDggMTU6NTE6MjggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW46IGFzLnRleGluZm8gaXMgaW4gJChzcmNkaXIpLiAgVXNlCi0JJChzcmNkaXIpL2FzLnRleGluZm8gZXhwbGljaXRseSBpbiBzZXZlcmFsIHBsYWNlcwotCi1UaHUgQXByICA4IDE1OjE1OjAyIDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogdXBkYXRlIGR2aSwgY2xlYW4gdGFyZ2V0cyBmb3IgbmV3IHNvdXJjZQotCQkJICAgZmlsZSBzdHJ1Y3R1cmUKLQotVGh1IEFwciAgOCAxMjo1Mjo0NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9oby1kZWNzdGF0bi5oOiBEZWZpbmUgQlJPS0VOX0FTU0VSVCBpZiBub3QgX19HTlVDX18sCi0JcmF0aGVyIHRoYW4gdW5kZWZpbmluZyBrbm93LgotCSogY29uZmlndXJlLmluOiBNYXRjaCB1bHRyaXgqLCBub3QganVzdCB1bHRyaXguCi0KLVdlZCBBcHIgIDcgMjA6MTg6MTAgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogZG9jL2FzLnRleGluZm86IGNvbnZlcnRlZCBjb25kaXRpb25hbCBtYXJrdXAgdG8gdXNlIG5ldwotCVRleGluZm8gZmFjaWxpdGllcywgYXZvaWRpbmcgbTQuCi0KLQkqIGRvYy9hcy1hbGwudGV4aW5mbywgYWxsLm00LCBwcmV0ZXgubTQ6IGRlbGV0ZWQuCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogcmVjYXN0IGRvYyBjb25maWd1cmF0aW9uIHRvIHVzZSBhIGxpbmsgdG8gYW4KLQlpbmNsdWRlZCB0ZXhpbmZvIGZpbGUuCi0KLQkqIGRvYy9hbGwudGV4aTogc2V0dGluZ3MgZm9yIGdlbmVyaWMgZm9ybSBvZiBkb2N1bWVudGF0aW9uLgotCi1UdWUgQXByICA2IDExOjU2OjIxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChjb25zKTogWmVybyBvdXQgZnJhZyB3aGVuIGNyZWF0aW5nIHJlbG9jLgotCi1Nb24gQXByICA1IDA5OjQxOjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoZ3BfcmVmZXJlbmNlKTogQ2VydGFpbiBtYWdpYyBzeW1ib2xzIGNhbiBuZXZlcgotCWJlIHJlZmVyZW5jZWQgb2ZmIHRoZSBHUCByZWdpc3Rlci4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEhhbmRsZSBzdGF0ZXMgOSBhbmQgMTAgY29ycmVjdGx5Ci0Jd2hlbiBkZWFsaW5nIHdpdGggY2hhcmFjdGVycyBvZiB0eXBlIExFWF9JU19UV09DSEFSX0NPTU1FTlRfMVNULAotCUxFWF9JU19TVFJJTkdRVU9URSwgYW5kIExFWF9JU19PTkVDSEFSX1FVT1RFLgotCi0JKiBjb25maWcvdGUtaXJpeC5oOiBOZXcgZmlsZTsgaXJpeCBuZWVkcyBhIGRpZmZlcmVudCBMT0NBTF9MQUJFTAotCWRlZmluaXRpb24gZnJvbSBvdGhlciBNSVBTIHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1pcml4KTogVXNlIGVtdWxhdGlvbiBpcml4LgotCi1TdW4gQXByICA0IDE1OjIxOjA5IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDg1MDAuYzogR2V0IHJlbGF4IHNpemUgb2YgYnJhbmNoIGluc3RydWN0aW9ucyByaWdodCwKLQkoZ2V0X29wZXJhbmQpOiBQYXJzZSBAc3ArIGNvcnJlY3RseS4KLQotRnJpIEFwciAgMiAxNTo1OTo0OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgaW5jbHVkZQotCUNPRkYgc2VjdGlvbiBoZWFkZXIgZmllbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUHJpbnQgZXJyb3IgbWVzc2FnZSBpZiBob3N0IG9yIHRhcmdldCBpcyBub3QKLQlzdXBwb3J0ZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogSWYgd2l0aC1iZmQtYXNzZW1ibGVyLCB1c2Ugb2JqLWNvZmYgaW5zdGVhZCBvZgotCW9iai1jb2ZmYmZkLgotCi0JKiBjb25maWcvaG8tZ2VuZXJpYy5oOiBJbmNsdWRlIHN0cmluZy5oLgotCi1GcmkgQXByICAyIDA4OjU0OjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuaCAoTE9DQUxfTEFCRUwpOiBUcmVhdCBhbnkgbGFiZWwgc3RhcnRpbmcgd2l0aAotCSckJyBhcyBsb2NhbCwgZm9yIGFueSBvYmplY3QgZmlsZSBmb3JtYXQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogT3B0aW1pemF0aW9ucyB0byBicmFuY2hpbmcgY29kZSBhbmQgYQotCWNvdXBsZSBvZiBidWcgZml4ZXMgZnJvbSByYWxwaGNAcHlycHM1LmVuZy5weXJhbWlkLmNvbSAoUmFscGgKLQlDYW1wYmVsbCkuCi0KLQkqIGNvbmZpZy9oby1pcml4Lmg6IE5ldyBmaWxlOyBpZiBub3QgZ2NjLCBkZWZpbmUgQlJPS0VOX0FTU0VSVC4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1zZ2ktaXJpeCopOiBTZXQgZ2FzX2hvc3QgdG8gaXJpeC4KLQotV2VkIE1hciAzMSAxNzo1Mzo1NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ldyk6IFNldCBvdXRwdXRfc2VjdGlvbiBvZiBuZXcgc2VjdGlvbi4KLQkqIGFzLmMgKHBlcmZvcm1fYW5fYXNzZW1seV9wYXNzKTogRG9uJ3Qgc2V0IG91dHB1dF9zZWN0aW9uIGhlcmUuCi0JKiBleHByLmMgKGV4cHJfcGFydCwgZXhwcik6IFR1cm4gb2ZmIHNlY3Rpb24gYXNzZXJ0aW9ucyBmb3IgRUNPRkYsCi0Jc2luY2UgaXQgaGFzIGFkZGl0aW9uYWwgc2VjdGlvbnMuCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBGb3IgTUlQUyBFQ09GRiwgcHV0IHNtYWxsIG9iamVjdHMgaW4gLnNic3MsCi0Jbm90IGJzc19zZWN0aW9uLgotCSogY29uZmlnL29iai1lY29mZi5oIChUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IEFkZGVkCi0JZWNvZmZfdW5kZWZpbmVkIGZpZWxkLgotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfc3ltYm9sX25ld19ob29rKTogSW5pdGlhbGl6ZQotCWVjb2ZmX3VuZGVmaW5lZCBmaWVsZC4KLQkoYWRkX2ZpbGUpOiBJZiB1c2luZyBzdGFicywganVzdCBvdXRwdXQgYSBzdGFicyBzeW1ib2wgcmF0aGVyIHRoYW4KLQljcmVhdGluZyBhIG5ldyBmZHIuCi0JKG9ial9lY29mZl9iZWdpbiwgb2JqX2Vjb2ZmX2JlbmQpOiBJZ25vcmUgbGluZSBudW1iZXIgYnkgcmVhZGluZwotCWl0IHdpdGggZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24sIHJhdGhlciB0aGFuIHNraXBwaW5nIGl0IGJ5IGhhbmQuCi0JKG9ial9lY29mZl9sb2MpOiBJZiB1c2luZyBzdGFicywganVzdCBvdXRwdXQgYSBzdGFicyBzeW1ib2wgcmF0aGVyCi0JdGhhbiBFQ09GRiBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4KLQkob2JqX2Vjb2ZmX3N0YWIpOiBBY2NlcHQgbm9uLXplcm8gdmFsdWVzIGZvciBzdGFicyBsaW5lIG51bWJlci4KLQkoZWNvZmZfYnVpbGRfc3ltYm9scyk6IFNldCBpZmlsZXN5bSBjb3JyZWN0bHkuICBTZXQgc3RvcmFnZSBjbGFzcwotCXRvIHNtYWxsLCB1bmRlZmluZWQgYW5kL29yIHJlYWRvbmx5IHNlY3Rpb25zIGlmIGFwcHJvcHJpYXRlLgotCURvbid0IG91dHB1dCBzeW1ib2wgbmFtZXMgY29udGFpbmluZyBcMDAxIGNoYXJhY3RlcnMuCi0JKGVjb2ZmX2Zyb2JfZmlsZSk6IE1ha2Ugc3VyZSBhdCBsZWFzdCBvbmUgZmRyIGlzIG91dHB1dC4KLQkqIGNvbmZpZy90Yy1taXBzLmg6IERlZmluZSBUQ19NSVBTLgotCSogY29uZmlnL3RjLW1pcHMuYyAoZ19zd2l0Y2hfdmFsdWUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9hc3NlbWJsZSk6IFNldCBncCBzaXplIG9mIG91dHB1dCBCRkQuCi0JKGdwX3JlZmVyZW5jZSk6IE5ldyBmdW5jdGlvbjsgcmV0dXJucyAxIGlmIGV4cHJlc3Npb24gY2FuIGJlCi0JYWNjZXNzc2VkIHZpYSBncC4gIEFsd2F5cyByZXR1cm5zIDAgaWYgbm90IHVzaW5nIEVDT0ZGLgotCShtYWNyb19idWlsZCk6IENvbnZlcnQgQkZEX1JFTE9DX0xPMTYgdG8gQkZEX1JFTE9DX01JUFNfR1BSRUwgaWYKLQlwb3NzaWJsZS4KLQkobWFjcm8pOiBHZW5lcmF0ZSBzZXF1ZW5jZXMgdXNpbmcgZ3AgaWYgcG9zc2libGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IElnbm9yZSAtRUwgYW5kIC1FQi4gIFBhcnNlIC1HLgotCShtZF9hcHBseV9maXgpOiBBZGRlZCBCRkRfUkVMT0NfTUlQU19HUFJFTCB0byBpZ25vcmVkIGNhc2UuCi0JKHNfY2hhbmdlX3NlYyk6IEhhbmRsZSAucmRhdGEgYW5kIC5zZGF0YSBmb3IgRUNPRkYuCi0JKHNfZXh0ZXJuKTogTWFyayBzeW1ib2wgYXMgZXh0ZXJuYWwuICBTZXQgZWNvZmZfdW5kZWZpbmVkIGZpZWxkLgotCi1UdWUgTWFyIDMwIDEwOjExOjQxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlKTogRG9uJ3QgY2FsbCBhc19wZXJyb3IgZm9yCi0JZmlsZW5hbWUgcmVqZWN0ZWQgYnkgYXBwbGljYXRpb24uCi0KLQkqIGFzLmMgKG1haW4pIFtCRkRfQVNTRU1CTEVSXTogSWYgZXJyb3JzIG9jY3VyLCBjbG9zZSBhbmQgdW5saW5rCi0JdGhlIG91dHB1dCBmaWxlLgotCi0JKiBkb2MvYXMudGV4aW5mbzogRG9uJ3QgdXNlIEB2YWx1ZSBpbiBub2RlIG5hbWVzIGZvciB0aGUgbW9tZW50OwotCXJlZmVyZW5jZXMgZG9uJ3QgYXBwZWFyIHRvIHdvcmsgcmlnaHQuCi0KLQkqIGFzLmggKGNvbnN0LCB2b2xhdGlsZSk6IFB1dCB0aGVzZSBkZWZpbml0aW9ucyBiYWNrLCBhbmQgdXNlCi0JdGhlbS4KLQotCSogZG9jL2FzLnRleGluZm86IEZpcnN0IHBhc3MgYXQgdXNpbmcgbmV3IHRleGluZm8gZmVhdHVyZXMgLS0KLQl2YXJpYWJsZXMsIGNvbmRpdGlvbmFsIHRlc3RzLiAgRmFyIGZyb20gY29tcGxldGUuCi0KLU1vbiBNYXIgMjkgMTY6MDU6NDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiByZWFkLmM6IFRlbXBvcmFyeSBoYWNrIHRvIGhhbmRsZSBzb21lIDY0LWJpdCBjb25zdGFudHMuICBUaGlzCi0Jc2hvdWxkIGJlIHJlZG9uZSBsYXRlci4KLQkodGFyZ2V0X2JpZ19lbmRpYW4pOiBEZWNsYXJlLgotCShiaWdfY29ucyk6IElmIGl0J3Mgc2V0LCByZXZlcnNlIG9yZGVyIG9mIGJ5dGVzIGJlaW5nIGNvcGllZC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9iZWdpbik6IFNldCB0YXJnZXRfYmlnX2VuZGlhbi4KLQotCSogcmVhZC5jIChzX2lnbm9yZSk6IERlbGV0ZSBkZWNsYXJhdGlvbiBvZiBpc19lbmRfb2ZfbGluZS4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHlhbmtfc3ltYm9scyk6IEJ1aWxkIGxpc3Qgb2YgZmlsZSBzeW1ib2wKLQlmb3J3YXJkIHBvaW50ZXJzIHByb3Blcmx5LgotCi1Nb24gTWFyIDI5IDEzOjQ3OjMzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZG9fcmVsb2NzX2Zvcik6IEZpeCBidWcgd2hlcmUgbnJlbG9jcwotCXdhc24ndCBiZWluZyBzdG9yZWQgaW50byBzY25oZHIuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaDogQWRkIHByb3RvdHlwZSBvZiBzX2dldF9zZWdtZW50LgotCSogcmVhZC5jIChUQ19TVEFSVF9MQUJFTCk6IERlZmF1bHQgZGVmaW5pdGlvbi4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogVXNlIFRDX1NUQVJUX0xBQkVMIG1hY3JvIHRvIHdvcmsgb3V0Ci0JaWYgYSBsYWJlbCBoYXMgYmVlbiBzZWVuLgotCi1Nb24gTWFyIDI5IDEyOjU2OjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBTZXQgQkZEREVGIGFuZCBCRkRMSUIgYXQgdGhlIHRvcCBvZiBNYWtlZmlsZSwgbm90Ci0JdGhlIGJvdHRvbSAobWFrZSBleHBhbmRzIHZhcmlhYmxlcyBpbiBkZXBlbmRlbmNpZXMgd2hlbiB0aGUKLQlkZXBlbmRlbmNpZXMgYXJlIHJlYWQsIG5vdCB3aGVuIHRoZXkgYXJlIHVzZWQpLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogRG9uJ3Qgc2V0IE5PTE9BRCBiaXQgZm9yCi0JYTI5ayAuYnNzIHNlY3Rpb247IHRoZSBtb25kZmUgcHJvZ3JhbSBkb2Vzbid0IGxpa2UgaXQuCi0KLVN1biBNYXIgMjggMDg6MTI6NTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IFVzZSBQQVJBTVMgbWFjcm8sIGFuZCB1c2UgQ09OU1QgaW5zdGVhZCBvZgotCWNvbnN0LgotCShjdXJyZW50X2FyY2hpdGVjdHVyZSk6IERvbid0IG5lZWQgaW5pdGlhbGl6ZXIuCi0KLUZyaSBNYXIgMjYgMDg6MTI6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBkb2Mvbm9uZS5tNDogRGVmaW5lIFo4MDAwLgotCSogZG9jL01ha2VmaWxlLmluIChhcy0qLnRleGluZm8pOiBSZWZlciB0byAkKHNyY2RpcikuICBSZW1vdmUgdGhlCi0JdGV4aW5mbyBmaWxlIGJlZm9yZSByZWNyZWF0aW5nIGl0LgotCShURVhJMkRWSSk6IE5lZWQgdG8gc2V0IFRFWElOUFVUUyBpZiAibWFrZSBhcy5kdmkiIGlzIHRvIHdvcmsgaW4KLQl0aGlzIGRpcmVjdG9yeS4KLQkoc3JjZGlyKTogRGVsZXRlIHNlY29uZCwgYm9ndXMgZGVmaW5pdGlvbi4KLQkoYXMuaW5mbyk6IExvb2sgZm9yIGFzLSoudGV4aW5mbyBpbiBjdXJyZW50IGRpcmVjdG9yeSByYXRoZXIgdGhhbgotCWluICQoc3JjZGlyKS4KLQkoYXMuZHZpKTogRGl0dG8uCi0JKGR2aSk6IE5ldyBydWxlLgotCSogZG9jL2NvbmZpZ3VyZS5pbjogQ3JlYXRlIGxpbmtzIHRvIGFsbCBhcy0qLnRleGluZm8gZmlsZXMgaW4gdGhlCi0Jc291cmNlIGRpcmVjdG9yeSwgaWYgdGhhdCdzIG5vdCB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi0KLQkqIGNvbmZpZ3VyZS5pbiAocGVyLWhvc3QpOiAgQWNjZXB0IE1JUFMgaG9zdCB3aXRoIEJTRCB2ZXJzaW9uCi0JbnVtYmVyLgotCShwZXItdGFyZ2V0KTogQ2xhc3NpZnkgaTQ4NiBhcyBpMzg2LiAgVXNlIGdlbmVyaWMgY3B1X3R5cGUgaW5zdGVhZAotCW9mIHRhcmdldF9jcHUgaW4gc2VsZWN0aW5nIGZvcm1hdCBldGMuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBVc2UgLmFwcGZpbGUsIG5vdCAuYXBwLWZpbGUuCi0JKiByZWFkLmMgKHBvdGFibGUpOiBDaGFuZ2UgLmFwcC1maWxlIHRvIC5hcHBmaWxlLgotCi0JKiBjb25maWcvaG8tZGVjc3RhdG4uaDogUmVuYW1lZCBmcm9tIGhvLWRlY3N0YXRpb24uaC4KLQkqIGNvbmZpZ3VyZS5pbjogQWRqdXN0ZWQuCi0KLQkqIGNvbmZpZy9vYmotYmZkLXN1bm9zLio6IFVudXNlZDsgZGVsZXRlZC4KLQotCSogTWFrZWZpbGUuaW4gKHZlcnNpb24uYywgdmVycy1zdGFtcCk6IERlbGV0ZWQuCi0JKGNvbmZpZy5oKTogRGVmaW5lIEdBU19WRVJTSU9OLgotCSogYXMuYyAodmVyc2lvbl9zdHJpbmcpOiBEZWxldGVkIGRlY2xhcmF0aW9uLgotCShtYWluKTogTG9vayBmb3IgR0FTX1ZFUlNJT04gaW5zdGVhZC4KLQotCSogZG9jL2FzLnRleGluZm86IFVwZGF0ZWQgZGVzY3JpcHRpb24gb2YgLWEqIChsaXN0aW5nKSBvcHRpb25zLAotCWFuZCBkZXNjcmliZSBob3cgdG8gcGFzcyB0aGVtIHRocm91Z2ggZnJvbSBnY2MuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChkb19yZWxvY3NfZm9yKTogRG9uJ3QgYWxsb2NhdGUgc3RvcmFnZSBvcgotCXByb2Nlc3MgcmVsb2NzIGlmIHRoZXJlIGFyZW4ndCBhbnkgcmVsb2NzIHRvIHByb2Nlc3MuICBBdm9pZHMKLQltYWxsb2MvZnJlZSBidWcgb24gU0NPIHRvby4KLQotCSogYXMuaDogTW92ZSBsb2NhbCBpbmNsdWRlIGZpbGVzIGJlbG93IHN5c3RlbSBpbmNsdWRlIGZpbGVzLCB0bwotCWF2b2lkIHNvbWUgcmVkZWZpbml0aW9uIGNvbXBsYWludHMgb24gc29tZSBzeXN0ZW1zLgotCShjb25zdCwgdm9sYXRpbGUpOiBEb24ndCBuZWVkIHRoZXNlIGNvbmRpdGlvbmFsbHkgZGVmaW5lZCBpZiB3ZQotCXVzZSBDT05TVCBhbmQgVk9MQVRJTEUgZnJvbSBhbnNpZGVjbC5oLgotCShzZWdfbmFtZSk6IFVzZSBDT05TVCwgbm90IGNvbnN0LgotCi1GcmkgTWFyIDI2IDEwOjIyOjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYzogUmVpbmRlbnRlZCB0byBHTlUgc3RhbmRhcmRzLgotCi1UaHUgTWFyIDI1IDA4OjU5OjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGRvX3JlbG9jc19mb3IpOiBSZW1vdmUgYTI5ayBzcGVjaWFsIGNhc2UuCi0JKGZpeHVwX3NlZ21lbnQpOiBBZGQgYTI5ayBzcGVjaWFsIGNhc2U7IHRoZSBsaW5rZXIgaXMgbm90IHByZXBhcmVkCi0JdG8gc2VlIGEgc2VnbWVudCBvZmZzZXQgaGVyZS4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEFkZGVkIG5ldyBzdGF0ZSwgMTAsIG1vZGlmeWluZyBzdGF0ZQotCTkgdG8gb25seSBrZWVwIGEgc3BhY2UgaW4gYmV0d2VlbiBpZGVudGlmaWVyIGNoYXJhY3RlcnMuCi0KLVdlZCBNYXIgMjQgMDI6MTY6MjIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgZHZpIHRhcmdldDsgYXMtJChjb25maWcpLnRleGluZm8gbWlnaHQgbGl2ZSBpbgotCXNyY2RpciwgbWlnaHQgYmUgaW4gb2JqZGlyLgotCi0JKiBkb2MvTWFrZWZpbGUuaW46IGR2aSBkZXBlbmRzIG9uIGFzLmR2aQotCi1Nb24gTWFyIDIyIDIzOjU5OjEzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsY2hlY2sgdGFyZ2V0Ci0KLU1vbiBNYXIgMjIgMTY6MjU6NTcgMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBBZGQgc3VwcG9ydCBmb3IgbWVtYmFyIG1hc2sgbmFtZXMuCi0JQWRkIG1pc3NpbmcgY29sb25zIGluIHByZWZldGNoIGVycm9yIG1lc3NhZ2VzLiAgQWRkIHN1cHBvcnQgZm9yCi0JQVNJIG5hbWVzLgotCi1Nb24gTWFyIDIyIDEwOjE5OjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBVc2UgJEFUIGZvciBhbnkgZmxvYXRpbmcgcG9pbnQgbG9hZC4KLQotU2F0IE1hciAyMCAxMjo1MDo1MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AdXJ0aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRm9yIG9wZXJhbmQgdHlwZSAnTScsIHJlamVjdAotCWJpZ251bXMsIGJ1dCBkb24ndCBlbWl0IGVycm9yIG1lc3NhZ2UuCi0KLUZyaSBNYXIgMTkgMjE6MDI6MTkgMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodGFyZy1jcHUubyk6IERlcGVuZCBvbiBjb25maWcuaC4KLQotV2VkIE1hciAxNyAxNjo0NDowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBBZGRlZCBuZXcgc3RhdGUsIDksIHRvIGF2b2lkCi0JZHJvcHBpbmcgYSBzcGFjZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYW4gaWRlbnRpZmllci4KLQkqIGV4cHIuYywgd3JpdGUuYzogUmV3cm90ZSBhc3NlcnQgZXhwcmVzc2lvbnMgdG8gbm90IHVzZSBtdWx0aXBsZQotCWxpbmVzOyBJIGRvbid0IHRoaW5rIHRoYXQgY2FuIGJlIGRvbmUgcG9ydGFibHkuCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IFVzZSAkQVQgaWYgdGFyZ2V0IHJlZ2lzdGVyIGlzIHplcm8gaW4KLQlsb2FkIGluc3RydWN0aW9uLCB3aGljaCBpdCBjYW4gYmUgZm9yIGEgZmxvYXRpbmcgcG9pbnQgbG9hZC4KLQotTW9uIE1hciAxNSAxMjoxNzoyOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogQ29tcHV0ZSB0aGUgcmVsb2NzIGJlZm9yZSB3cml0aW5nIG91dAotCXRoZSBzZWN0aW9uIGNvbnRlbnRzLgotCSogY29uZmlnL29iai1lY29mZi5oLCBjb25maWcvb2JqLWVjb2ZmLmM6IE51bWVyb3VzIGNoYW5nZXMgdG8gZ2V0Ci0Jc3ltYm9sIHRhYmxlIGFuZCB2YWx1ZXMgcmlnaHQuCi0JKiBjb25maWcvdGMtbWlwcy5oIChMT0NBTF9MQUJFTCk6IElmIE9CSl9FQ09GRiwgYW55IGxhYmVsIHN0YXJ0aW5nCi0Jd2l0aCAkTCBpcyBsb2NhbC4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHRjX2dlbl9yZWxvYyk6IElmIE9CSl9FQ09GRiwgYWRqdXN0IHRoZSBhZGRlbmQKLQlieSB0aGUgc2VjdGlvbiB2bWEuCi0KLQkqIGNvbmZpZy96OGsubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBUaGUgcmVsZXZhbnQgZmlsZSBpcwotCXo4ay1vcGMuaCwgbm90IHo4ay5oLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfZW5kZWYpOiBDb3JyZWN0IHRlc3QgZm9yIC5iZgotCXN5bWJvbC4KLQotRnJpIE1hciAxMiAxODozMzozNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIHNwYXJjLXN1bi1zb2xhcmlzMiogaW5zdGVhZCBvZiAtc29sYXJpczIKLQotRnJpIE1hciAxMiAxMjowMDowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGV4cHIuYywgd3JpdGUuYzogVWx0cml4IG5hdGl2ZSA0LjIgY2MgcmVxdWlyZXMgYXNzZXJ0IGNvbmRpdGlvbgotCXRvIGJlIG9uIGEgc2luZ2xlIGxpbmUuCi0KLVRodSBNYXIgMTEgMTc6NTY6MjIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLmgpOiBDcmVhdGUgZmlsZSwgd3JpdGluZyBvdXQgZGVmaW5pdGlvbnMgb2YKLQl0YXJnZXQgY3B1LCBhbGlhcywgYW5kIGNhbm9uaWNhbCBuYW1lLgotCShBTExfQ0ZMQUdTKTogTm8gbG9uZ2VyIGRlZmluZSBUQVJHRVRfQ1BVLgotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBQcmludCBhIG1lc3NhZ2UsIGluc3RlYWQgb2YgcXVpdHRpbmcKLQlzaWxlbnRseS4KLQotCSogYXMuYyAobWFpbik6IERvbid0IGNhdGNoIGFueSBzaWduYWxzLCBmb3Igbm93LgotCi0JKiB2ZXJzaW9uLmM6IERlbGV0ZWQuCi0JKiBNYWtlZmlsZS5pbjogR2VuZXJhdGUgaXQsIHB1dHRpbmcgaW4gb25seSB0aGUgdmVyc2lvbiBudW1iZXIKLQlpdHNlbGYuCi0JKFZFUlNJT04pOiBOZXcgdmFyaWFibGUuCi0JKiBhcy5jOiBJbmNsdWRlIGNvbmZpZy5oLgotCShtYWluKTogUmVmb3JtYXR0ZWQgdmVyc2lvbiBzdHJpbmcuICBJbmNsdWRlIHRhcmdldCBhbGlhcy4gIERvbid0Ci0JcHJpbnQgaWYgbm90IHJlcXVlc3RlZCAoaS5lLiwgdW5rbm93biAtdiBhcmd1bWVudCkuCi0KLQkqIGFzLmMgKHN0cmFsbG9jKTogRGVsZXRlZC4KLQkobWFpbik6IENhbGwgc3RyZHVwIGluc3RlYWQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIGFsbCA2ODMwMCBzZXJpZXMgY2hpcHMuCi0JKiBjb25maWcvdGMtbTY4ay5jOiBJbmNsdWRlIGNvbmZpZy5oLgotCShtZF9hc3NlbWJsZSk6IEFzc3VtZSBUQVJHRVRfQ1BVIGlzIGRlZmluZWQuICBBY2NlcHQgc29tZSA2ODMwMAotCXNlcmllcyBjcHVzIGFzIGRlZmF1bHRzLgotCShtZF9wYXJzZV9vcHRpb24pOiBBY2NlcHQgc29tZSBtNjgzMDAgc2VyaWVzIENQVXMgYXMgZGVmYXVsdHMuCi0KLVdlZCBNYXIgMTAgMTc6NDE6MTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBhcy5jIChFWElUX1NVQ0NFU1MsIEVYSVRfRkFJTFVSRSk6IERlZmluZSB0byBub3JtYWwgdmFsdWVzIGlmCi0Jbm90IGFscmVhZHkgZGVmaW5lZC4KLQkobWFpbiwgZ290X3NpZyk6IFVzZSB0aGVtLgotCSogY29uZmlnL2hvLXZtcy5oIChFWElUX1NVQ0NFU1MsIEVYSVRfRkFJTFVSRSk6IFJldmVyc2UgZGVmYXVsdAotCXZhbHVlcy4KLQotVHVlIE1hciAgOSAwNzo0MDowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYywgY29uZmlnL29iai1lY29mZi5oOiBQcmVsaW1pbmFyeSBFQ09GRgotCXN1cHBvcnQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgYmFzZWQgb24gT0JKX0FPVVQgdnMuCi0JT0JKX0VDT0ZGIGFzIHdlbGwgYXMgVEFSR0VUX0JZVEVTXypfRU5ESUFOLgotCShzdHJ1Y3QgbG9jLCBzdHJ1Y3QgcHJvYywgc3RydWN0IGZpbGUpOiBNb3ZlZCB0byB0Yy1taXBzLmMgd2l0aGluCi0JI2lmbmRlZiBPQkpfRUNPRkYgYmxvY2ssIHNpbmNlIEVDT0ZGIHVzZXMgZGlmZmVyZW50IHZlcnNpb25zLgotCSogY29uZmlnL3RjLW1pcHMuYzogUmVhcnJhbmdlZCBmb3IgRUNPRkYgc3VwcG9ydC4gIEFkZGVkCi0JcHJvdG90eXBlcyBmb3IgYWxsIHN0YXRpYyBmdW5jdGlvbnMuICBNb3ZlZCBleGlzdGluZyBtaW5pbWFsCi0JZGVidWdnaW5nIGZvcm1hdCBzdXBwb3J0IGluZm8gI2lmbmRlZiBPQkpfRUNPRkYgYmxvY2tzLgotCShtYWNyb19idWlsZF9sdWkpOiBFbGltaW5hdGVkIHNpZ25fZXh0ZW5kIGFyZ3VtZW50LCBiZWNhdXNlIEVDT0ZGCi0JZG9lcyBub3Qgc3VwcG9ydCBhIG5vbiBzaWduIGV4dGVuZGVkIGhpZ2ggMTYgYml0cyByZWxvYy4gIEFkanVzdGVkCi0JYWxsIGNhbGxlcnMgYWNjb3JkaW5nbHkuCi0JKHRjX2dldF9yZWdpc3Rlcik6IFJlbmFtZWQgZnJvbSBnZXRfcmVnaXN0ZXIsIGFuZCBtYWRlIG5vbi1zdGF0aWMuCi0KLQkqIGNvbmZpZy9taXBzLWJpZy5tdCwgY29uZmlnL21pcHMtbGl0Lm10OiBOZXcgZmlsZXMuICBEZWZpbmUKLQlUQVJHRVRfQllURVNfQklHX0VORElBTiBhbmQgVEFSR0VUX0JZVEVTX0xJVFRMRV9FTkRJQU4sCi0JcmVzcGVjdGl2ZWx5LgotCSogY29uZmlndXJlLmluIChtaXBzLSotYnNkKik6IFVzZSBnYXNfdGFyZ2V0IG1pcHMtbGl0LgotCShtaXBzLSotdWx0cml4KiwgbWlwcy0qLWlyaXgqLCBtaXBzLSotZWNvZmYpOiBOZXcgdGFyZ2V0cywgdXNpbmcKLQlvYmpfZm9ybWF0IGVjb2ZmIGFuZCBnYXNfdGFyZ2V0IG1pcHMtbGl0IG9yIG1pcHMtYmlnLgotCi1UdWUgTWFyICA5IDA3OjQzOjAxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiB2ZXJzaW9uLmM6IEJ1bXAgdG8gdmVyc2lvbiAyLjAuMS4KLQotVHVlIE1hciAgOSAwNzo0MDowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyKTogQ2hlY2sgdGhhdCBzZWdfaW5mbyAoc2VjdGlvbikKLQlpcyBub3QgTlVMTC4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYWxsIG9ial9mcm9iX2ZpbGUgYWZ0ZXIgc2V0dGluZyB0aGUgc3ltYm9scywKLQlub3QgYmVmb3JlLgotCi1UdWUgTWFyICA5IDAwOjAwOjAwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBWZXJzaW9uIDIuMCByZWxlYXNlZC4KLQotTW9uIE1hciAgOCAxNDo1NzoxMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX0NPVU5UX1JFTE9DKTogTG9vayBmb3IgZnhfYWRkc3kgb25seS4KLQotRnJpIE1hciAgNSAwOTowNTo1NSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlYWQuaDogRGVmaW5lIHN0cmluZ2VyIGhlcmUuCi0JcmVhZC5jLCBjb25maWcvb2JqLWllZWUuYywgY29uZmlnL29iai10Y204OGsuYzogTm90IGFueSBvZiB0aGVzZQotCXBsYWNlcy4KLQotVGh1IE1hciAgNCAxMTo1MjoyMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChzX3NwYWNlKTogTXVsdGlwbHkgcmVwZWF0IGNvdW50IGJ5IG11bHQsIG5vdCBmaWxsLgotCi1UaHUgTWFyICA0IDA1OjIwOjQyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiByZWFkLmM6IEluY2x1ZGUgY3R5cGUuaC4KLQotV2VkIE1hciAgMyAxMDo0MTo0NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQlQYXRjaGVzIGZyb20gRXJpYyBZb3VuZ2RhbGU6Ci0JKiBtYWtlLWdhcy5jb206IEZpbmQgb2JzdGFjay5vYmogaWYgaXQncyBub3QgaW4gdGhlIGN1cnJlbnQKLQlkaXJlY3RvcnkuCi0JKiByZWFkLmMgKHNfaWdub3JlKTogRG9uJ3QgZGVjbGFyZSBpc19lbmRfb2ZfbGluZS4gIEl0J3MKLQlyZWR1bmRhbnQsIGFuZCB0cmlnZ2VycyBhIFZNUyBnY2MgY29tcGlsZXIgYnVnLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IE1hY3JvIFNVQl9TRUdNRU5UX0FMSUdOIG5vdyB0YWtlcwotCWN1cnJlbnQgc2VnbWVudCBhcyBhbiBhcmd1bWVudC4gIChJZ25vcmVkIGluIGFsbCBjYXNlcyBidXQgVk1TLikKLQlBbGwgY2FsbGVycyBhbmQgZGVmaW5pdGlvbnMgY2hhbmdlZC4KLQotVHVlIE1hciAgMiAxMTo1NjoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxpc3RpbmcuYzogQ2xlYW5lZCB1cCBhIGJpdCwgYWRkZWQgcHJvdG90eXBlcywgbWFkZSBOT19MSVNUSU5HCi0JY2FzZSBjb21waWxlIGFnYWluLgotCi1UdWUgTWFyICAyIDA4OjUzOjM0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpc2J5dGUpOiBBY2NlcHQgYWxsIHZhbHVlcyBmcm9tIC0yNTUgdG8gKzI1NSwKLQlzbyAifjB4ODAiIHdvbid0IGJlIHJlamVjdGVkLgotCi0JKiBjb25maWcvb2JqLWVsZi5jOiBObyBsb25nZXIgaW5jbHVkZSBlbGYvcmVsb2MuaC4KLQkob2JqX2VsZl9zZWN0aW9uKTogU2V0IFNFQ19SRUFET05MWSBhbmQgU0VDX0NPREUgZm9yIHRleHQgc2VjdGlvbi4KLQkob2JqX2VsZl9zdGFiLCBvYmpfZWxmX2Rlc2MpOiBEZWxldGVkIGRvLW5vdGhpbmcgYW5kIGNvbW1lbnRlZC1vdXQKLQlyb3V0aW5lcy4KLQkob2JqX2VsZl94c3RhYik6IE5ldyByb3V0aW5lLgotCShvYmpfZWxmX3NldF9zaXplKTogQ2FsbCBhc193YXJuLCBub3QgZnByaW50Zi4gIFBhc3MgZGVzaXJlZAotCWFyZ3VtZW50IHRvIHNfaWdub3JlLiAgUHV0ICIjaWYgMCIgYXJvdW5kIHVudXNlZCBjb2RlLgotCShvYmpfcHNldWRvX3RhYmxlKTogVXNlIHNfaWdub3JlIGluc3RlYWQgb2YgZG8tbm90aGluZyByb3V0aW5lcy4KLQlDYWxsIGVsZl94c3RhYnMgZm9yIC5zdGFicyBhbmQgLnhzdGFicyBvcGVyYXRvcnMuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQVJHRVRfRk9STUFUKSBbT0JKX0VMRl06IE5vdyAiZWxmMzItc3BhcmMiLgotCi0JKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpOiBTZXQgU0VDX1JFTE9DIG9ubHkgaWYgZml4dXBzIGFyZQotCXByZXNlbnQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogbWlwcy1ic2QgY29uZmlndXJhdGlvbiB3YXMgbWlzc2luZyBmb3JtYXQgc3BlYy4KLQlTaG91bGQgdXNlIGFvdXQuCi0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IERlcGVuZHMgb24gY29uZmlndXJlLmluLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IERvbid0IGNoZWNrIGZvciBhbGlnbm1lbnQgb2YKLQlmcmFnIGluIG1lbW9yeTsgYWxpZ25tZW50IG9mIGluc3RydWN0aW9ucyBpbiBzZWN0aW9uIGlzIGEgc2VwYXJhdGUKLQltYXR0ZXIuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkX2x1aSk6IEZpeCBzb21lIGFzc3VtcHRpb25zIG9mIEFOU0kKLQlDIGF2YWlsYWJpbGl0eS4KLQotCSogbGlzdGluZy5oOiBBbHdheXMgcHJvdmlkZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMsIG5vdCBtYWNyb3MsIHNvCi0JcGNjIHdvbid0IGxvc2UuCi0KLVR1ZSBNYXIgIDIgMDA6NTA6NDMgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIENPTlRSSUJVVE9SUzogIFVwZGF0ZSBHaWxtb3JlIGVudHJ5LgotCi1Nb24gTWFyICAxIDEyOjAzOjE2IDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogIENvcnJlY3RseSBhc3NlbWJsZSBwcmVmZXRjaAotCWluc3RydWN0aW9ucy4gIEFjY2VwdCBpbnRlZ2VyIHByZWZldGNoIGZ1bmN0aW9uIG51bWJlcnMuCi0KLVdlZCBGZWIgMjQgMTQ6NTg6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc194d29yZCk6IE5vdyBjYWxsIGJpZ19jb25zLCBzbyBsYXJnZQotCWNvbnN0YW50cyBhcmUgYWNjZXB0ZWQsIGJ1dCBzeW1ib2xpYyB2YWx1ZXMgYXJlIG5vdC4gIEdDQyB3aWxsIG5vdAotCWdlbmVyYXRlIHRoZSBsYXR0ZXIgY3VycmVudGx5LgotCi0JKiBmcmFncy5jIChmcmFnX2luaXQpOiBOZXcgZnVuY3Rpb24uCi0JKHplcm9fYWRkcmVzc19mcmFnLCBic3NfYWRkcmVzc19mcmFnKTogTm93IGluaXRpYWxpemVkIGF0IHJ1bgotCXRpbWUuCi0JKiBhcy5jIChtYWluKTogQ2FsbCBmcmFnX2luaXQuCi0KLVdlZCBGZWIgMjQgMTA6MzI6NDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogSW4gTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVCBjYXNlOgotCURvbid0IHVuZ2V0IGNoMiBpZiB3ZSBkaWRuJ3QgZ2V0IGl0LgotCi1XZWQgRmViIDI0IDA0OjE0OjA3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKFRFWElESVIpOiBVcGRhdGVkIGZvciBuZXcgbGF5b3V0LgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19jb21tb24pOiBBZGQgc3VwcG9ydCBmb3IgRUxGIHZlcnNpb24uCi0JKHRjX2dlbl9yZWxvYykgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0FSQ0gsIFRBUkdFVF9GT1JNQVQpIFtCRkRfQVNTRU1CTEVSXToKLQlOZXcgbWFjcm9zLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBOZXcgbWFjcm8uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBGb3IgUEMtcmVsYXRpdmUgYWRkcmVzc2luZyBvZiBhCi0Jc3ltYm9sLCBmaXggdGhlIG9mZnNldCBzbyAiKzIiIGlzbid0IHJlcXVpcmVkLgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChsaW5lX2NvbW1lbnRfY2hhcnMsIGxpbmVfc2VwYXJhdG9yX2NoYXJzKToKLQlEZWZpbmUgYXMgY29tbW9uL2Jzcy4KLQkob3BfaGFzaCwgcmVnX2hhc2gsIGFyZWdfaGFzaCwgaWNsYXNzZXNfc2VlbiwgYnJfY250KTogRGVmYXVsdCBDCi0JaW5pdGlhbGl6ZXJzIGFyZSBzdWZmaWNpZW50LgotCi0JKiBjb25maWcvb2JqLWFvdXQuaCBbQkZEX0FTU0VNQkxFUl06IEluY2x1ZGUgbGliYW91dC5oIGZyb20gYmZkLgotCShUQVJHRVRfRk9STUFUKSBbQkZEX0FTU0VNQkxFUl06IERlZmF1bHQgdG8gImEub3V0Ii4KLQkoU19TRVRfKiwgU19HRVRfKiwgb2JqX2Zyb2Jfc3ltYm9sKSBbQkZEX0FTU0VNQkxFUl06IE5ldyBtYWNyb3MuCi0JKFNfU0VUX1RZUEUpIFshQkZEX0FTU0VNQkxFUl06IE5ldyBtYWNyby4KLQkqIGNvbmZpZy9vYmotYW91dC5jOiBVc2UgUEFSQU1TIG1hY3JvIGZvciBkZWNsYXJhdGlvbnMuICBSZW1vdmUKLQkiSUdOT1JFX0RFQlVHIiBjb25kaXRpb25hbCwgc2luY2UgYm90aCBicmFuY2hlcyBhcmUgaWRlbnRpY2FsLgotCVVzZSBTX1NFVF9UWVBFLCBTX0dFVF9UWVBFLCBhbmQgU19HRVRfREVTQyBpbnN0ZWFkIG9mIGRpcmVjdGx5Ci0JcmVmZXJlbmNpbmcgc3ltYm9sIHN0cnVjdHVyZSBtZW1iZXJzLgotCShvYmpfYW91dF9mcm9iX3N5bWJvbCkgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGFzLmggKHN0cnVjdCBmcmFnKTogUmVvcmRlcmVkIGEgY291cGxlIG9mIGZpZWxkcyBmb3IgYmV0dGVyCi0JcGFja2luZy4KLQotCSogd3JpdGUuYyAocmVjb3JkX2FsaWdubWVudCkgW0JGRF9BU1NFTUJMRVJdOiBSZWNvcmQgaXQgaW4gdGhlCi0Jc2VjdGlvbiBpbmZvLgotCSh3cml0ZV9jb250ZW50cykgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb24uCi0JKHdyaXRlX29iamVjdF9maWxlKSBbQkZEX0FTU0VNQkxFUl06IEFsd2F5cyBoYW5kbGUgLVIgaGVyZS4gIENhbGwKLQlmaXhfbmV3IHdpdGggQkZEX1JFTE9DX05PTkUgaW5zdGVhZCBvZiAwIG9yIE5PX1JFTE9DLiAgQ2FsbAotCW9ial9mcm9iX2ZpbGUsIG9ial9mcm9iX3N5bWJvbCwgdGNfZnJvYl9zeW1ib2wgaWYgZGVmaW5lZC4KLQkoZml4dXBfc2VnbWVudCk6IE1ha2Ugc3VyZSBjb21tb24tc2VjdGlvbiBzeW1ib2xzIGdldCB0cmVhdGVkIHRoZQotCXNhbWUgYXMgdW5kZWZpbmVkIHN5bWJvbHMuCi0JKGZpeF9uZXcpIFtCRkRfQVNTRU1CTEVSXTogQXJndW1lbnQgcl90eXBlIGlzIG9mIHR5cGUKLQliZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUuICBVc2Ugc2VnX2ZpeF97cm9vdCx0YWlsfVAgZGVyaXZlZCBmcm9tCi0Jc2VjdGlvbiBpbmZvLgotCSogd3JpdGUuaCAoZml4X25ldyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0KLQkqIHRjLmggKG1kX29wZXJhbmQsIG1kX2NvbnZlcnRfZnJhZywgdGNfaGVhZGVyc19ob29rLAotCW1kX3NlY3Rpb25fYWxpZ24sIG1kX3VuZGVmaW5lZF9zeW1ib2wpOiBEb24ndCBwcm92aWRlIHByb3RvdHlwZXMKLQlpZiB0aGVzZSBhcmUgZGVmaW5lZCBhcyBtYWNyb3MuCi0JKG1kX2NvbnZlcnRfZnJhZykgW0JGRF9BU1NFTUJMRVJdOiBCRkQgdmVyc2lvbiBuZWVkcyBiZmQgYW5kCi0Jc2VjdGlvbiBwYXNzZWQuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IEFyZ3VtZW50IE5BTUUgaXMgbm93IHBvaW50ZXIgdG8gY29uc3QuCi0JU2ltcGxpZmllZCBTVFJJUF9VTkRFUlNDT1JFIGNvZGUuICBSZW1vdmUgYXNzdW1wdGlvbnMgYWJvdXQgbnVsbAotCXBvaW50ZXJzIGluIGZyZXNobHkgYWxsb2NhdGVkIHN0b3JhZ2UuICBbQkZEX0FTU0VNQkxFUl06IEdldCBuZXcKLQlCRkQgc3ltYm9sLgotCShjb2xvbik6IERpc3BsYXkgb3RoZXIvZGVzYyBmaWVsZHMgb2YgcmVkZWZpbmVkIHN5bWJvbCBvbmx5IGlmCi0JU19HRVRfT1RIRVIgYW5kIFNfR0VUX0RFU0MgYXJlIGRlZmluZWQuCi0JKHN5bWJvbF9tYWtlKTogQXJndW1lbnQgTkFNRSBpcyBub3cgcG9pbnRlciB0byBjb25zdC4KLQkoc3ltYm9sX2ZpbmQsIHN5bWJvbF9maW5kX2Jhc2UpOiBMaWtld2lzZS4KLQkoU19JU18qLCBTX0dFVF8qLCBTX1NFVF8qKSBbQkZEX0FTU0VNQkxFUl06IE5ldyBmdW5jdGlvbnMuCi0JKiBzeW1ib2xzLmg6IEZpeCBwcm90b3R5cGVzIGZvciBuZXcgY29uc3QgYXJndW1lbnRzLiAgQWRkCi0JcHJvdG90eXBlcyBmb3IgQkZEX0FTU0VNQkxFUiBTXyogZnVuY3Rpb25zLgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19jaGFuZ2UpIFtCRkRfQVNTRU1CTEVSXTogQkZEIHZlcnNpb24gb2YgY29kZQotCWZvciBjaGFuZ2luZyB0byBhbiBleGlzdGluZyBzZWN0aW9uLgotCShzdWJzZWdfbmV3X3Jlc3QpIFtCRkRfQVNTRU1CTEVSXTogU3BsaXQgb2ZmIGZyb20gc3Vic2VnX25ldywKLQljYWxsZWQgYnkgc3Vic2VnX25ldyBhbmQgc3Vic2VnX3NldC4KLQkoc3Vic2VnX25ldykgW0JGRF9BU1NFTUJMRVJdOiBSZXdyaXR0ZW4gdG8gY2hhbmdlIHRvIG5ldyBzZWN0aW9uLAotCWdpdmVuIHNlY3Rpb24gbmFtZSBhbmQgc3Vic2VnIG51bWJlci4KLQkoc3Vic2VnX3NldCkgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb247IGNoYW5nZSB0byBhIHBvc3NpYmx5Ci0JbmV3IHNlY3Rpb24vc3Vic2VjdGlvbi4KLQotCSogcmVhZC5jOiBEb24ndCBpbmNsdWRlIGN0eXBlLmguCi0JKGNvbnMpIFtCRkRfQVNTRU1CTEVSXTogRm9yIHVuZGVmaW5lZCBzeW1ib2xzLCB1c2UgQkZEX1JFTE9DXzMyCi0JZm9yIG5vdzsgc2hvdWxkIGJlIG1hY2hpbmUtZGVwZW5kZW50LgotCi0JKiBjb25maWd1cmUuaW46IEFjY2VwdCAqLSotZWxmIGFuZCAqLSotc29sYXJpcyogYXMgRUxGIGZvcm1hdAotCXRhcmdldHMsIGZvcmNpbmcgQkZEIHVzZS4KLQotV2VkIEZlYiAxNyAxODo1OTowMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jOiBVc2UgUEFSQU1TIG1hY3JvIGZvciBzdGF0aWMgZnVuY3Rpb24KLQlkZWNsYXJhdGlvbnMuICBVc2UgQkZEX1JFTE9DXyBtYWNyb3MgZXZlcnl3aGVyZSwgd2l0aAotCWNvbXBhdGliaWxpdHkgbWFjcm9zIGRlY2xhcmVkIGZvciBub24tQkZEIG1vZGUuCi0JKHN0cnVjdCBzcGFyY19pdCkgW0JGRF9BU1NFTUJMRVJdOiBVc2UgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi0JaW5zdGVhZCBvZiBlbnVtIHJlbG9jX3R5cGUuCi0JKGVtaXRfc3BhcmNfcmVsb2MpOiBDb21tZW50ZWQtb3V0IGZ1bmN0aW9uIGRlbGV0ZWQuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IERlbGV0ZWQuCi0JKHRjX2FvdXRfcHJlX3dyaXRlX2hvb2spOiBEb24ndCBkZWZpbmUgZm9yIEJGRF9BU1NFTUJMRVIuCi0JKG1kX2FwcGx5X2ZpeCk6IENoYW5nZWQgY2FsbGluZyBzZXF1ZW5jZSAoY29uZGl0aW9uYWxseSkgZm9yIEJGRAotCXZlcnNpb24uCi0JKiBjb25maWcvdGMtc3BhcmMuaCAobWRfY29udmVydF9mcmFnKTogTmV3IG1hY3JvLgotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfc3RhYik6IFJlZmVyIHRvIHVuZGVmaW5lZF9zZWN0aW9uLAotCW5vdCBTRUdfVU5LTk9XTi4gIFVzZSBTX1NFVF9UWVBFLCBTX0dFVF9UWVBFLCBTX0dFVF9ERVNDIGluc3RlYWQKLQlvZiByZWZlcmVuY2luZyBmaWVsZHMgZGlyZWN0bHkuCi0KLQkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBOZXcgZnVuY3Rpb247IGV4dHJhY3RlZCBmcm9tCi0Jd3JpdGVfb2JqZWN0X2ZpbGUuCi0JKHdyaXRlX29iamVjdF9maWxlKSBbISBCRkRfQVNTRU1CTEVSXTogQ2FsbCBpdC4KLQkocmVsYXhfYW5kX3NpemVfc2VnKSBbQkZEX0FTU0VNQkxFUl06IE5ldyBmdW5jdGlvbjsgcmVsYXggc2VjdGlvbgotCWFuZCBzZXQgaXRzIHNpemUgYW5kIGZsYWdzLgotCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoc3RydWN0IHN5bWJvbCkgW0JGRF9BU1NFTUJMRVJdOiBSZXBsYWNlIHNvbWUKLQlmaWVsZHMgd2l0aCBCRkQgZXF1aXZhbGVudHMuICBUdXJuIG9uIGJhY2stcG9pbnRlcnMsIGFuZCBhZGQKLQl0YXJnZXQtc3BlY2lmaWMgZmllbGRzIGF0IGVuZC4KLQotVGh1IEZlYiAxMSAwOToyMDozNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiBEb24ndCBzZXQgdmFkZHIgaGVyZS4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBTZXQgaXQgaGVyZSBpbnN0ZWFkLCBzbyB0aGF0IGZpeHVwX3NlZ21lbnQKLQljYW4gc2VlIHRoZSBjb3JyZWN0IHZhbHVlLgotCi1Nb24gRmViICA4IDEzOjU2OjE3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDaGVjayBmb3IgZXJyb3JzIGFuZCB3YXJuaW5ncyBhbmQKLQliYWlsIG91dCBiZWZvcmUgcHJvY2Vzc2luZyBjb250ZW50cy4KLQkoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSk6IE5ldyBmdW5jdGlvbiwgZG9lcyBtb3N0IG9mIHRoZSB3b3JrCi0Jb2YgcmVtb3ZlX3N1YnNlZ3MuCi0JKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyKSBbQkZEX0FTU0VNQkxFUl06IE5ldyBmdW5jdGlvbi4KLQkocmVtb3ZlX3N1YnNlZ3MpIFshIEJGRF06IENhbGwgaXQuCi0JKHdyaXRlX29iamVjdF9maWxlKSBbQkZEX0FTU0VNQkxFUl06IENvbnZlcnRlZCB0byB1c2UgQkZECi0Jc3RydWN0dXJlcyBhbmQgcm91dGluZXMuCi0KLQkqIGNvbmZpZy9vYmotZWxmLio6IE5ldyBmaWxlcy4KLQotCSogY29uZmlnL21pcHMubXQsIGNvbmZpZy9yczYwMDAubXQ6IERlbGV0ZWQuCi0KLQkqIGNvbmZpZy9oODMwMC5tdDogRG9uJ3Qgc3BlY2lmeSBjb21waWxlciBoZXJlLgotCi0JKiBjb25maWcvejhrLm10OiBUaGUgejhrIGNvZGUgZGVwZW5kcyBvbiB0aGUgejhrIG9wY29kZSB0YWJsZSwKLQlub3QgdGhlIGg4MzAwIG9uZS4KLQkqIGNvbmZpZy90Yy16OGsuaDogQ29tbWVudCBmaXguCi0KLQkqIHdyaXRlLmM6IFJlb3JkZXJlZCBzb21lIGZ1bmN0aW9ucyBmb3IgYmV0dGVyIGlubGluaW5nLgotCShmaXh1cF9zZWdtZW50KTogTGlua3JlbGF4IGNvZGUgaXMgbm8gbG9uZ2VyIGNvbmRpdGlvbmFsIG9uCi0JVENfSTk2MC4KLQotVGh1IEZlYiAgNCAxMjo0NToxNiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3toODUwMC5tdCwgdGMtaDg1MDAuYywgdGMtaDg1MDAuaCwgb2JqLWNvZmZiZmQuYywKLQlvYmotY29mZmJmZC5ofTogc3VwcG9ydCBmb3IgdGhlIEg4LzUwMAotCi1XZWQgRmViICAzIDE5OjI4OjE4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai12bXMuaCAoU1VCX1NFR01FTlRfQUxJR04pOiBEZWZpbmUgVk1TIHZlcnNpb24gaGVyZS4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogTm90IGhlcmUuCi0JKGZpeF9uZXcpOiBJbml0aWFsaXplIGZ4X2FkZG51bWJlci4KLQotCSogbGlzdGluZy5jOiBEb24ndCBpbmNsdWRlIHRhcmdldC1jcHUuaCBleHBsaWNpdGx5LCBzaW5jZSBhcy5oCi0JaW5jbHVkZXMgaXQuCi0KLVRodSBKYW4gMjggMDA6MzU6NDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmggW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBkZWNsYXJlIG5leHRfb2JqZWN0X2ZpbGVfY2hhclAsCi0JKl9maXhfcm9vdCwgKl9maXhfdGFpbCwgc2VnX2ZpeF9yb290UCwgc2VnX2ZpeF90YWlsUC4KLQkoc3RydWN0IGZpeCk6IFJlb3JkZXJlZCBmaWVsZHMgZm9yIGNvbXBhY3RuZXNzIGFuZCBlZmZpY2llbmN5LgotCUNvbnZlcnRlZCBzb21lIGxvZ2ljYWwgZmllbGRzIHRvIDEtYml0IGZpZWxkcy4KLQotCSogY29uZmlnL29iai1hb3V0Lmg6IFVzZSBQQVJBTVMuCi0JW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBkZWZpbmUvZGVjbGFyZSBBT1VUX01BQ0hUWVBFLCBzZWdfTl9UWVBFLAotCU5fVFlQRV9zZWcsIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRS4KLQotCSogcmVhZC5jOiBEb24ndCBpbmNsdWRlIGxpc3RpbmcuaDsgYXMuaCBpbmNsdWRlcyBpdC4gIFJlbW92ZWQKLQlET05UREVGIGNvZGUuCi0JW0JGRF9BU1NFTUJMRVJdOiBJbmNsdWRlIHN1YnNlZ3MuaC4KLQkob2xkX2J1ZmZlciwgbmV3X2Jyb2tlbl93b3Jkcyk6IERlZmF1bHQgaW5pdGlhbGl6YXRpb24gaXMKLQlzdWZmaWNpZW50LgotCi0JKiBvdXRwdXQtZmlsZS5jIFtCRkRfQVNTRU1CTEVSXTogSW5jbHVkZSBiZmQuaCwgZGVmYXVsdCBUQVJHRVRfTUFDSAotCXRvIDAsIGRlZmluZSBzdGRvdXRwdXQuCi0JKG91dHB1dF9maWxlX2NyZWF0ZSkgW0JGRF9BU1NFTUJMRVJdOiBDYWxsIGJmZF9wZXJyb3Igb24gZmFpbHVyZS4KLQlDYWxsIGJmZF9zZXRfYXJjaF9tYWNoLgotCShvdXRwdXRfZmlsZV9jbG9zZSkgW0JGRF9BU1NFTUJMRVJdOiBDYWxsIGJmZF9jbG9zZSwgbm90Ci0JYmZkX2Nsb3NlX2FsbF9kb25lLiAgQ2FsbCBiZmRfcGVycm9yIG9uIGZhaWx1cmUuCi0JKG91dHB1dF9maWxlX2FwcGVuZCkgW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBkZWZpbmUuCi0KLQkqIGNvbmZpZy9tNjhrY29mZi5tdCAoTE9DQUxfTE9BRExJQkVTKTogRGVsZXRlIGRlZmluaXRpb24uCi0KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBBbHdheXMgZGVmaW5lLiAgT21pdCBmaWVsZCBzY25oZHIKLQlpZiBub3QgTUFOWV9TRUdNRU5UUy4gIERlZmluZSBuZXcgZmllbGQgYmZkX3NlY3Rpb24gaWYKLQlCRkRfQVNTRU1CTEVSLgotCShzZWdfaW5mbyk6IE5ldyBtYWNyby4KLQotCSogZXhwci5jLCBpbnB1dC1zY3J1Yi5jOiBVc2UgUEFSQU1TIG1hY3JvLiAgRGVsZXRlZCB1bnVzZWQKLQl2YXJpYWJsZXMsIGFuZCBzb21lIGlycmVsZXZhbnQgY29tbWVudHMuCi0KLQkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogSW5jbHVkZSAkKEJGRERFRikuCi0JKExJQlMpOiBJbmNsdWRlICQoQkZETElCKS4gIERvbid0IGJvdGhlciB3aXRoICQoQ0xJQikuCi0JKiBjb25maWd1cmUuaW46ICBQZXJtaXQgLS13aXRoLWJmZC1hc3NlbWJsZXIgbm93LCB3aXRoIGEgd2FybmluZy4KLQlWYXJpYWJsZSBuZWVkX2JmZCBpcyBub3cgYSBib29sZWFuLCBhcyBpcyBuZXcgdmFyaWFibGUgYmZkX2dhcy4KLQlTZXQgQkZEREVGIGFuZCBCRkRMSUIgaW4gTWFrZWZpbGUgd2hlbiBhcHByb3ByaWF0ZS4KLQotCSogYXMuYzogUmVtb3ZlZCAiI2lmZGVmIERPTlRERUYiIGFuZCAiI2lmZGVmIGNvbW1lbnQiIGNvZGUuCi0JKG1haW4pOiBSZWZlciB0byBmbGFnX2Fsd2F5c19nZW5lcmF0ZV9vdXRwdXQgaW5zdGVhZCBvZgotCWZsYWdzZWVuWydaJ10uCi0KLQkqIGFzLmMgKG1haW4pIFtCRkRfQVNTRU1CTEVSXTogT3BlbiBvdXRwdXQgYmZkLgotCSgqX3NlY3Rpb24pIFtCRkRfQVNTRU1CTEVSXTogRGVmaW5lIHRoZW0uCi0JKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcykgW0JGRF9BU1NFTUJMRVJdOiBJbml0aWFsaXplIHRoZW0sIGFuZAotCXNldCBzZWN0aW9uIGZsYWdzIHdoZW4gYXBwcm9wcmlhdGUuCi0JKiBhcy5oIChTRUdfTk9STUFMKSBbQkZEX0FTU0VNQkxFUl06IFJlcXVpcmUgdGhhdCB0aGUgc3BlY2lmaWVkCi0Jc2VjdGlvbiBpcyBub3QgYWJzb2x1dGUsIHVuZGVmaW5lZCwgb3IgYW4gYXNzZW1ibGVyIGludGVybmFsIG9uZS4KLQkoYWJzb2x1dGVfc2VjdGlvbiwgdW5kZWZpbmVkX3NlY3Rpb24pOiBBbHdheXMgZGVmaW5lLgotCSogZXhwci5jLCByZWFkLmMsIHN5bWJvbHMuYzogUmVmZXIgdG8gKl9zZWN0aW9uLCBub3QgU0VHXyo7IGJyZWFrCi0Jc3dpdGNoIHN0YXRlbWVudHMgaW50byBpZi1lbHNlIHRyZWVzLgotCSogc3ltYm9scy5jIFtNQU5ZX1NFR01FTlRTXTogRGVsZXRlZCByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YKLQlTRUdfQlNTIGFuZCBTRUdfREFUQS4KLQotCSogYXMuaCAoZnJhZ19ub3dfZml4KTogTmV3IG1hY3JvLgotCSogc3ltYm9scy5jIChjb2xvbik6IFVzZSBpdC4KLQotV2VkIEphbiAyNyAyMTo0Mzo1MyBQU1QgMTk5MyAgUmFscGggQ2FtcGJlbGwgIChyYWxwaGNAcHlyYW1pZC5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6ICBBZGRlZCBtaXBzIHN1cHBvcnQgZm9yIG1pcHMtZGVjLWJzZC4KLQkqIGNvbmZpZy90Yy1taXBzLmg6ICBBZGRlZCBtaXBzIHN1cHBvcnQgZm9yIG1pcHMtZGVjLWJzZC4KLQkqIGNvbmZpZy9oby1taXBzYnNkLmg6ICBBZGRlZCBtaXBzIHN1cHBvcnQgZm9yIG1pcHMtZGVjLWJzZC4KLQkqIGNvbmZpZy9taXBzLW9wY29kZS5oOiAgQWRkZWQgbWlwcyBzdXBwb3J0IGZvciBtaXBzLWRlYy1ic2QuCi0JKiBjb25maWd1cmUuaW46ICBBZGRlZCBtaXBzIHN1cHBvcnQgZm9yIG1pcHMtZGVjLWJzZC4KLQkqIGF0b2YtZ2VuZXJpYy5jOiAgRGVmaW5lIFRSVUUgYW5kIEZBTFNFIGlmIG5vdCBkZWZpbmVkLgotCi1UaHUgSmFuIDIxIDEyOjQ4OjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogdmVyc2lvbi5jOiBCdW1wZWQgdmVyc2lvbiBudW1iZXIgdG8gMS45My4wNS4KLQotV2VkIEphbiAyMCAxNzoxMTo1MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfZW1pdF9yZWxvY2F0aW9ucyk6IERvbid0IHVzZSAjZWxpZi4KLQkob2JqX2VtaXRfbGluZW5vKTogRG9uJ3QgbmVlZCByZXR1cm4gYXQgZW5kIG9mIHZvaWQgZnVuY3Rpb24uCi0JKG9ial9zeW1ib2xfbmV3X2hvb2spOiBEaXR0by4KLQotCSogY29uZmlnL3RjLW02OGsuYzogUmVtb3ZlZCBzb21lIHVudXNlZCBjb2RlLgotCSh0Y19hb3V0X2ZpeF90b19jaGFycyk6IEFycmF5IG5ieXRlc19yX2xlbmd0aCBpcyBub3cgY29uc3QuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRDX0NPVU5UX1JFTE9DKTogRG9uJ3QgZW1pdCByZWxvYyBpZiBvbmx5Ci0Jb2Zmc2V0IGZpZWxkIGlzIHNldC4KLQotRnJpIEphbiAgOCAwNTo0NDo0OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEZvciAldWhpIGFuZCAldWxvLCBpZiBub3QKLQlFTlY2NCwgZW1pdCBubyByZWxvYy4KLQkobWRfcHNldWRvX3RhYmxlKTogRm9yICIueHdvcmQiLCBjYWxsIHNfeHdvcmQuCi0JKHNfeHdvcmQpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChhcmNoaXRlY3R1cmVfcmVxdWVzdGVkLCB3YXJuX29uX2J1bXAsCi0JbWRfcmVsYXhfdGFibGUpOiBVc2UgZGVmYXVsdCB6ZXJvIGluaXRpYWxpemF0aW9uLgotCShzX3Jlc2VydmUpOiBTaW5jZSBTRUdfRTIgaXMgZXF1aXZhbGVudCB0byBTRUdfQlNTLCBqdXN0IHVzZSB0aGUKLQlsYXR0ZXIsIGluc3RlYWQgb2Ygc2VsZWN0aW5nIHdpdGggcHJlcHJvY2Vzc29yIGNvbmRpdGlvbmFscy4KLQotVGh1IEphbiAgNyAwODo1ODoyMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXNlIGFsbCBzcGFyY2xpdGUgdmFyaWFudHMKLQotVGh1IEphbiAgNyAwNToyNToyNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoc19kYXRhKSBbIUJGRF9BU1NFTUJMRVJdOiBGaXggdHlwbyBpbiA0IEphbiBjaGFuZ2UgLS0KLQlhY2NpZGVudGFsbHkgY2hhbmdlZCB0byB1c2Ugc3Vic2VnX2NoYW5nZSB3aGVyZSBpdCBzaG91bGQgaGF2ZQotCWJlZW4gc3Vic2VnX25ldy4KLQotVHVlIEphbiAgNSAwODo0MjoxNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IElmIGNoYXJhY3RlciBvdGhlciB0aGFuIGNvbW1hIG9yIG5ld2xpbmUgaXMgYQotCWxvZ2ljYWwgZW5kLW9mLWxpbmUgY2hhcmFjdGVyLCB1c2UgdGhlIG5ld2xpbmUgY2FzZS4KLQlGcm9tIEVyaWMgWW91bmdkYWxlOgotCShvcGVyYW5kKTogU2V0IFhfYWRkX251bWJlciBmaWVsZCBmb3IgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLQkob3BlcmFuZCk6IFRyZWF0IHplcm8gYnl0ZSBhcyBlbmQtb2Ytb3BlcmFuZC4KLQotCSogY29uZmlndXJlLmluIChwZXItdGFyZ2V0KTogTG9vayBmb3Igd2l0aF9iZmRfYXNzZW1ibGVyIG9wdGlvbi4KLQlGb3Igbm93LCBvbmx5IGFjY2VwdCAibm8iLCB1bnRpbCB0aGUgbWVyZ2UgaXMgZG9uZS4KLQotCU1lcmdlZCBjaGFuZ2VzIGZyb20gRXJpYyBZb3VuZ2RhbGUgKHlvdW5nZGFsZUB2NjU1MGMubnJsLm5hdnkubWlsKToKLQkqIGFzLmMsIGZsb251bS1rb25zdC5jLCBoZXgtdmFsdWUuYywgaW5wdXQtZmlsZS5jLCB2ZXJzaW9uLmMsCi0JICBjb25maWcvb2JqLWFvdXQuaCwgY29uZmlnL29iai12bXMuYzogVk1TIC0+IEhPX1ZNUy4KLQkqIHJlYWQuYzogRmluaXNoIGNvbnZlcnNpb24gdG8gU18qIG1hY3JvcyBpbiB0aGUgVk1TIG9ubHkKLQkgIHBhcnRzIG9mIHRoZSBwcm9ncmFtLiBBZGQgImNvbnN0IiBtb2RpZmllciB0byBoZXhfdmFsdWUuCi0JKiBhcy5jLCByZWFkLmMsIHN5bWJvbHMuYywgd3JpdGUuYzogQ2hhbmdlICJpZmRlZiBWTVMiIHRvCi0JICAiaWZkZWYgT0JKX1ZNUyIuCi0JKiBleHByLmM6IEFkZCAiY29uc3QiIG1vZGlmaWVyIHRvIGhleF92YWx1ZS4KLQkqIHN5bWJvbHMuYzogRmluaXNoIGNvbnZlcnNpb24gdG8gU18qIG1hY3JvcyBpbiB0aGUgVk1TIG9ubHkKLQkgIHBhcnRzIG9mIHRoZSBwcm9ncmFtLiAgQWRkICJjb25zdCIgbW9kaWZpZXIgdG8KLQkgIG1kX1tsb25nLHNob3J0XV9qdW1wX3NpemUuIFJlbW92ZSBkZWNsYXJhdGlvbiBvZiBjb25zdF9mbGFnCi0JICAod2hpY2ggd2lsbCBiZSBkZWNsYXJlZCBpbiBvYmotdm1zLmgpLgotCSogd3JpdGUuYzogQWRkICJjb25zdCIgbW9kaWZpZXIgdG8gbWRfW2xvbmcsc2hvcnRdX2p1bXBfc2l6ZS4KLQkgIEZpeCBhcmd1bWVudHMgdG8gVk1TX3dyaXRlX29iamVjdF9maWxlLgotCSogY29uZmlnLWdhcy5jb206IE5ldyBmaWxlLiAgU2NyaXB0IGZvciBWTVMgc3lzdGVtcyB0byBzZXQgdXAgdGhlCi0JICBjb25maWd1cmF0aW9uIHRvIGJ1aWxkIGdhcyBmb3IgVk1TLCBhbmQgY3JlYXRlIGNvbmZpZy5zdGF0dXMuCi0JKiBtYWtlLWdhcy5jb206IFJlZG9uZSB0byB3b3JrIHdpdGggbmV3IHNjaGVtZS4KLQkqIG9iai12bXMuYzogUGF0Y2ggdG8gZml4IGJ1ZyB3aGVyZSB3ZSB3ZXJlIG5vdCBjb3JyZWN0bHkgcGFyc2luZyB0aGUKLQkgIHN0YWJzIGRpcmVjdGl2ZXMuCi0JKiBvYmotdm1zLmM6ICBEZWZpbmUgbWFjcm9zIENPUFlfTE9ORyBhbmQgQ09QWV9TSE9SVCB3aGljaAotCSAgd2lsbCBzd2FwIGJ5dGVzIGlmIG5lZWRlZCBvbiBhIGJpZyBlbmRpYW4gc3lzdGVtLiAgVXNlIHRocm91Z2hvdXQKLQkgIGFzIG5lZWRlZC4KLQkqIG9iai12bXMuYyAob2JqX2FvdXRfc3RhYik6ICBBZGQgY29kZSB0byBnZW5lcmF0ZSBsaXN0aW5nIGZpbGUuCi0JKiBvYmotdm1zLmMgKFZNU190eXBlZGVmX3BhcnNlKTogQWRkIGFsaWFzIHRvIGNvcnJlY3RseSBoYW5kbGUgY2VydGFpbgotCSAgdHlwZXMgb2YgbWFsZm9ybWVkIHN0YWJzLiAgQ2hhbmdlIHBhcnNpbmcgYWxnb3JpdGhtIHNvIHRoYXQgd2UgYXJlCi0JICBtb3JlIGNlcnRhaW4gb2YgaGF2aW5nIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCB3ZSBuZWVkIG9uIGhhbmQuCi0JKiBvYmotdm1zLmMgKGZpbmFsX2ZvcndhcmRfcmVmZXJlbmNlKTogIE5ldyBmdW5jdGlvbiwgdXNlZCB0byBoZWxwCi0JICByZXNvbHZlIHRoZSBkYXRhIHR5cGVzIG9mIGFzIG1hbnkgc3RydWN0IGVsZW1lbnRzIGFzIHBvc3NpYmxlCi0JICB3aGVuIHNvbWUgcGFydCBvZiB0aGUgc3RydWN0IGlzIG5vdCBmdWxseSBkZWZpbmVkIGJ5IHRoZSBjb21waWxlci4KLQkqIG9iai12bXMuYyAoVk1TX0xTWU1fUGFyc2UpOiAgQ29ycmVjdGx5IGhhbmRsZSBjYXNlIG9mIGNvbnRpbnVhdGlvbgotCSAgc3RhYnMgZGlyZWN0aXZlcy4KLQkqIG9iai12bXMuYyAoVk1TX3dyaXRlX29iamVjdF9maWxlKTogRGVmaW5lIGFsbCB2dGFibGUgcHNlY3RzCi0JICBhcyBzeW1ib2xzIGFzIHdlbGwgaW4gdGhlIG9iamVjdCBmaWxlLiAgTG9vayBmb3IgZXh0ZXJuYWwgZnVuY3Rpb25zCi0JICB0aGF0IHN0YXJ0IHdpdGggIl9fdnQuIiwgYW5kIHR1cm4gdGhlbSBpbnRvIHZhcmlhYmxlcywgc2luY2UgdGhlCi0JICBnKysgY29tcGlsZXIgaXMgaW5jYXBhYmxlIG9mIGRvaW5nIHRoaXMuCi0JKiB0Yy12YXguYzogQWRkICcxJyBvcHRpb24gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBHQ0MKLQkgIHZlcnNpb25zLgotCSogYmlnbnVtLWNvcHkuYyAoYmlnbnVtX2NvcHkpOiBGaXggYnVnIHdoZXJlIHdlIHBhZCB3aXRoIHplcm9lcy4KLQkqIGlucHV0LXNjcnViLmMgKGFzX3doZXJlKTogRml4IGJ1ZyB3aGVyZSBhcyB3b3VsZCBjcmFzaCBpZiB3ZSBkaWQgbm90Ci0JICBoYXZlIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB5ZXQuCi0JKiBjb25maWcvaG8tdm1zLmg6IGRlZmluZSBIT19WTVMsIG5vdCBIT19WQVguCi0KLU1vbiBKYW4gIDQgMDU6MTc6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoc19kYXRhKTogQWx3YXlzIHVzZSAiZGF0YV9zZWN0aW9uIiwgc2luY2UgaXQnbGwgbWFwIHRvCi0JU0VHX0RBVEEgb3IgU0VHX0UxIGlmIG5lZWRlZC4KLQkoc19sY29tbSk6IExpa2V3aXNlIHdpdGggYnNzX3NlY3Rpb24uCi0JKHNfZmlsbCk6IFVzZSBtZW1zZXQsIG5vdCBiemVyby4KLQotVGh1IERlYyAzMSAwNDoyOToyNyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jOiBEZWxldGVkIHNvbWUgY29kZSB1bmRlciAiI2lmZGVmIERPTlRERUYiIHRoYXQgd2FzIGZvcgotCWhhbmRsaW5nIEdEQiBzeW1ib2wgdGFibGUgZGF0YS4KLQotCSogY29uZmlnL29iai1hb3V0LmggKHNlZ21lbnRfbmFtZSk6IERlbGV0ZSBkZWZpbml0aW9uLgotCShzZWdfbmFtZSk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQkqIGNvbmZpZy9vYmotYm91dC5oIChzZWdtZW50X25hbWUsIHNlZ19uYW1lKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLXZtcy5oIChzZWdtZW50X25hbWUsIHNlZ19uYW1lKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoc2VnbWVudF9uYW1lKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCAoc2VnbWVudF9uYW1lKTogRGl0dG8uCi0KLQkqIENoYW5nZXMgZm9yIEJGRF9BU1NFTUJMRVI6Ci0JKiBvYmouaCAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IERlY2xhcmUgb25seSBpZiBub3QKLQlCRkRfQVNTRU1CTEVSLgotCShvYmpfaGVhZGVyX2FwcGVuZCwgb2JqX3ByZV93cml0ZV9ob29rKTogRGl0dG8uCi0JKiBhcy5oIChzdGRvdXRwdXQpOiBOZXcgdmFyLCBkZWZpbmVkIG9ubHkgaWYgQkZEX0FTU0VNQkxFUi4KLQkoc2VnVCkgW0JGRF9BU1NFTUJMRVJdOiBOZXcgdHlwZWRlZiBmb3IgImFzZWN0aW9uICoiLgotCShzZWdtZW50X25hbWUpIElmIEJGRF9BU1NFTUJMRVIsIGxvb2sgdXAgQkZEIHNlY3Rpb24gbmFtZTsKLQlvdGhlcndpc2UsIHVzZSBzZWdfbmFtZSBhcnJheS4KLQkoc2VnX25hbWUpOiBEZWNsYXJlIG9ubHkgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JKHNlY3Rpb25fYWxpZ25tZW50KTogRGVjbGFyZSBvbmx5IGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCShiaWdfc2VjdGlvbiwgcmVnX3NlY3Rpb24sIHBhc3MxX3NlY3Rpb24sIGRpZmZfc2VjdGlvbiwKLQlhYnNlbnRfc2VjdGlvbiwgdGV4dF9zZWN0aW9uLCBkYXRhX3NlY3Rpb24sIGJzc19zZWN0aW9uKTogSWYKLQlCRkRfQVNTRU1CTEVSLCBkZWNsYXJlIGFzIHZhcmlhYmxlczsgb3RoZXJ3aXNlLCBkZWNsYXJlIGFzIG1hY3JvcywKLQltYXBwaW5nIHRvIHNlZ1QgZW51bSB2YWx1ZXMuCi0JKHRjX2FvdXRfZml4X3RvX2NoYXJzLCBuZXh0X29iamVjdF9maWxlX2NoYXJQKTogRm9yY2UgcGFyc2UgZXJyb3JzCi0JaWYgdGhlc2UgYXJlIHVzZWQgb3IgZGVmaW5lZCwgaWYgQkZEX0FTU0VNQkxFUi4KLQkoc3Vic2VnX3NldCwgc3Vic2VnX25ldykgW0JGRF9BU1NFTUJMRVJdOiBGdW5jdGlvbmFsaXR5IG9mIG9sZAotCXN1YnNlZ19uZXcgc3BsaXQgaW50byB0d28gZnVuY3Rpb25zLgotCShTRUdfTk9STUFMKTogRm9yIEJGRF9BU1NFTUJMRVIsIGFsd2F5cyByZXR1cm4gdHJ1ZSwgZm9yIG5vdy4KLQotCSogYXMuaCAodm9sYXRpbGUpOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkLgotCShoYWRfZXJyb3JzLCBoYWRfd2FybmluZ3MpOiBQcm92aWRlIHByb3RvdHlwZXMgZm9yIEFOU0kgQyBldmVuIGlmCi0JTk9fU1REQVJHLgotCShhc19iYWQsIGFzX2ZhdGFsLCBhc190c2t0c2ssIGFzX3dhcm4pOiBGb3IgR05VIEMgdmVyc2lvbiAyLAotCWRlY2xhcmUgd2l0aCBmb3JtYXQgYXR0cmlidXRlIGZvciAtV2Zvcm1hdCBjaGVja2luZy4KLQotV2VkIERlYyAzMCAxMDoxODo1NyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFwcC5jLCBjb25maWcvdGMtKi5jOiBEb24ndCBpbmNsdWRlIHJlYWQuaCwgc2luY2UgaXQgaXMgYWxyZWFkeQotCWluY2x1ZGVkIGJ5IGFzLmguCi0KLQkqIFRoZXNlIGFyZSBiYXNlZCBvbiBwYXRjaGVzIGZyb20gTWluaCBUcmFuLWxlCi0JPG10cmFubGVAcGFyaXMuaW50ZWxsaWNvcnAuY29tPi4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni1pYm0tYWl4Kik6IEFjY2VwdCBpNDg2IGZvciBob3N0LiAgVXNlCi0Jb2JqX2Zvcm1hdCBjb2ZmYmZkIGFuZCBnYXNfdGFyZ2V0IGkzODZjb2ZmIGZvciB0YXJnZXQuCi0JKGlbMzRdODYtKi1pc2MqKTogTmV3IGhvc3QgKHVzZXMgc3lzdikuCi0JKiBjb25maWcvaTM4NmFpeC5tdDogUmVtb3ZlZCAobm8gbG9uZ2VyIHVzZWQpLgotCSogY29uZmlnL21oLWkzODZhaXggKFJBTkxJQik6IFVzZSB0cnVlIHJhdGhlciB0aGFuIC9iaW4vdHJ1ZS4KLQkoTUlOVVNfRyk6IFJlbW92ZWQuCi0JKExERkxBR1MpOiBBZGRlZCwgZGVmaW5lZCBhcyAtc2hsaWIuCi0JKiBjb25maWcvdGUtaTM4NmFpeC5oIChSRVZFUlNFX1NPUlRfUkVMT0NTKTogVW5kZWZpbmUuCi0JKiBjb25maWcvdGUtc2NvMzg2LmggKExPQ0FMX0xBQkVMKTogRG9uJ3QgZGVmaW5lLgotCShET1RfTEFCRUxfUFJFRklYKTogRGVmaW5lLgotCSogZXhwci5jIChvcGVyYW5kKTogSWYgRE9UX0xBQkVMX1BSRUZJWCwgdXNlIC5MMFwwMDEgYXMgYSBsYWJlbAotCW5hbWUgcmF0aGVyIHRoYW4gTDBcMDAxLgotCSogcmVhZC5jIChzX2xjb21tKTogTWFrZSBhIGZyYWcgaW4gU0VHX0JTUyByYXRoZXIgdGhhbiB1c2luZwotCWxvY2FsX2Jzc19jb3VudGVyLgotCSogc3ltYm9scy5jLCBzeW1ib2xzLmggKGxvY2FsX2Jzc19jb3VudGVyKTogUmVtb3ZlZC4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogYnNzIG5vIGxvbmdlciB1c2VzCi0JbG9jYWxfYnNzX2NvdW50ZXIuICBQYXNzIGNvcnJlY3QgZGF0YSBhbmQgYnNzIHNpemUgdG8KLQlWTVNfd3JpdGVfb2JqZWN0X2ZpbGUuCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfd3JpdGVfb2JqZWN0X2ZpbGUpOiBBY2NlcHQgYnNzIHNpemUgYXMKLQlhcmd1bWVudCwgcmF0aGVyIHRoYW4gdXNpbmcgbG9jYWxfYnNzX2NvdW50ZXIuCi0JKiBjb25maWcvdGMtbTg4ay5jIChzX2Jzcyk6IERvbid0IHVzZSBsb2NhbF9ic3NfY291bnRlci4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX3Jlc2VydmUpOiBEb24ndCB1c2UgbG9jYWxfYnNzX2NvdW50ZXIuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoaGFkX2xpbmVubywgaGFkX3JlbG9jKTogUmVtb3ZlZC4KLQkoc2l6ZV9zZWN0aW9uKTogUmVzdG9yZWQgc2FuaXR5IGNoZWNrLgotCShkb19yZWxvY3NfZm9yKTogQmFzZSBzZWN0aW9uIGFkZHJlc3Mgb24gc19wYWRkciByYXRoZXIgdGhhbgotCWNvbXB1dGluZyBpdC4gIEFkanVzdCBhMjlrIFJfSUhJSEFMRiBzcGVjaWFsIGNhc2UgdG8gYWNjb3VudCBmb3IKLQlzZWN0aW9uIHBhZGRyICh1c2VkIHRvIHJlcXVpcmUgcGFkZHIgdG8gYmUgemVybykuICBJZiB0aGVyZSBhcmUgbm8KLQlyZWNsb3MsIHNldCBzX3JlbHB0ciB0byAwLiAgU2V0IHJlbG9jYXRpb24gc2l6ZSBpbiBvYmplY3RfaGVhZGVycy4KLQkoZmlsbF9zZWN0aW9uKTogQWx3YXlzIHNldCBzX3ZhZGRyIGhlcmUsIHJlbW92aW5nCi0JWkVST19CQVNFRF9TRUdNRU5UUyBjYXNlLiAgRm9yY2Ugc19zY25wdHIgZm9yIGJzcyB0byAwLiAgRG9uJ3Qgc2V0Ci0JTk9MT0FEIGZvciBpMzg2IC5ic3MsIGJlY2F1c2UgaXQgY29uZnVzZXMgdGhlIFNWUjMgbmF0aXZlIGxpbmtlci4KLQlTZXQgU1RZUF9JTkZPIGZvciAuY29tbWVudC4KLQkoY29mZl9oZWFkZXJfYXBwZW5kKTogVXNlIG9iamVjdCBoZWFkZXJzIGFuZCBIX3tTRVQsR0VUfV8qIG1hY3Jvcy4KLQlNYWtlIGFvdXRoZHIgd3JpdGluZyBkZXBlbmQgb24gT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIuCi0JKGNyYXdsX3N5bWJvbHMpOiBIYW5kbGUgOCBjaGFyYWN0ZXIgc2VjdGlvbiBuYW1lIGNvcnJlY3RseS4gIFVzZQotCUhfe1NFVCxHRVR9XyogbWFjcm9zLgotCShkb19saW5lbm9zX2Zvcik6IFNldCBsaW5lbm8gc2l6ZSBpbiBvYmplY3RfaGVhZGVycy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2UgSF97U0VULEdFVH1fKiBtYWNyb3MuICBEb24ndCBib3RoZXIgdG8KLQlzZXQgc192YWRkciBoZXJlLiAgSWYgc3RyaW5nX2J5dGVfY291bnQgcmVtYWlucyA0LCBzZXQgaXQgYmFjayB0bwotCTAsIGFuZCBvbmx5IHdyaXRlIHN0cmluZ3Mgb3V0IGlmIHRoZXJlIGFyZSBzb21lLiAgQ2FsbAotCWZpbGxfc2VjdGlvbiBiZWZvcmUgZG9fcmVsb2NzX2ZvciBhbmQgZG9fbGluZW5vc19mb3IuCi0JKG9ial9jb2ZmX3NlY3Rpb24pOiBIYW5kbGUgb3B0aW9uYWwgcXVvdGVkIHNlY29uZCBhcmd1bWVudCBnaXZpbmcKLQlzZWN0aW9uIGNoYXJhY3RlcmlzdGljcy4KLQkob2JqX2NvZmZfYnNzKTogQWRkZWQgdG8gaGFuZGxlIC5ic3MuCi0JKG9ial9jb2ZmX2lkZW50KTogQWRkZWQgdG8gaGFuZGxlIC5pZGVudCAocHV0cyBzdHJpbmcgaW4gLmNvbW1lbnQKLQlzZWN0aW9uKS4KLQkob2JqX2NvZmZfbGNvbW0pOiBQdXQgY29tbW9uIHN5bWJvbHMgaW4gLmJzcywgbm90IC5kYXRhLgotCShmaXh1cF9tZGVwcyk6IENoYW5nZSB0byBzZWdtZW50LiAgQ2FsbCBmcmFnX3dhbmUgYWZ0ZXIKLQltZF9jb252ZXJ0X2ZyYWcuCi0JKGZpeHVwX3NlZ21lbnQpOiBFeHBsaWNpdGx5IGNoZWNrIFNfSVNfQ09NTU9OIGJlZm9yZSBtYWtpbmcgMzg2Ci0JYWRqdXN0bWVudCAoYWxyZWFkeSBoYXBwZW5lZCBvbmx5IGZvciBjb21tb24gc3ltYm9scywgYnV0IHRoaXMgaXMKLQljbGVhcmVyKS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oIChPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHNfYnNzKTogRG9uJ3QgdXNlIGlmIEkzODZDT0ZGLgotCShtZF9wc2V1ZG9fdGFibGUpOiBJZ25vcmUgLm9wdGltIGFuZCAubm9vcHQuCi0JKHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtaTM4Ni5oIChSRVZFUlNFX1NPUlRfUkVMT0NTKTogVW5kZWYsIGZvciBTVlIzCi0JY29tcGF0aWJpbGl0eS4KLQkoTE9DQUxfTEFCRUwpOiBSZW1vdmVkIGRlZmluaXRpb24uCi0JKERPVF9MQUJFTF9QUkVGSVgpOiBEZWZpbmVkLgotCi1Nb24gRGVjIDI4IDEwOjMyOjA1IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBhcHAuYyAoYXBwX3B1c2gpOiBVc2UgbWVtY3B5LCBub3QgYmNvcHkuCi0JKGRvX3NjcnViX25leHRfY2hhcik6IEZvciBcIiwgcmV0dXJuICIgbm90ICcuCi0JKHN5bWJvbF9jaGFycyk6IE5vdyBjb25zdC4KLQotCSogZXhwci5jIChvcGVyYW5kKTogSWYgbm90IExPQ0FMX0xBQkVMU19GQiwgZG9uJ3QgbG9vayBmb3IgIjBmIgotCWFuZCAiMGIiLiAgSWYgTE9DQUxfTEFCRUxTX0RPTExBUiwgY2hlY2sgZm9yICIwJCIuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBEb24ndCB1c2UgI2VsaWYuCi0KLQkqIGNvbmZpZy9oby1zdW5vcy5oOiBEb24ndCBpbmNsdWRlIHN5cy9zdGR0eXBlcy5oOyA0LjAuMyBkb2Vzbid0Ci0JaGF2ZSBpdC4gIChSZXBvcnRlZCBieSBOb2FoIEZyaWVkbWFuLCBmcmllZG1hbkBnbnUuYWkubWl0LmVkdS4pCi0KLVdlZCBEZWMgMTYgMTI6MTI6MzMgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB3cml0ZS5jLCBvYmotaWVlZS5jOiBkb24ndCBkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04gaWYgaXQgaXMKLQlhbHJlYWR5IGRlZmluZWQuCi0KLVR1ZSBEZWMgMTUgMTI6NDA6MTEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IGFsbG93IHNpbmdsZSBxdW90ZSBzdHJpbmdzIGlmIHNvCi0JY29uZmlndXJlZC4KLQotCSogY29uZmlnLyp6OGsqOiBjaGVja3BvaW50Ci0KLVN1biBEZWMgMTMgMDA6MDQ6MzggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IGF2b2lkIGNhbGxpbmcgeG1hbGxvYyAoMCkuCi0KLVNhdCBEZWMgMTIgMTU6MjY6MzQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsaXN0aW5nLmM6IENhbGwgeG1hbGxvYywgbm90IG1hbGxvYzsgZG9uJ3QgZGVjbGFyZSBtYWxsb2MuCi0KLQkqIENoYW5nZXMgdG8gc3VwcG9ydCBTQ08gMy4ydjQ6Ci0JKiByZWFkLmMgKHNfYWxpZ25fYnl0ZXMsIHNfYWxpZ25fcHR3byk6IElmIG5vdCBTRUdfREFUQSBvcgotCVNFR19CU1MsIGZpbGwgd2l0aCBOT1BfT1BDT0RFLgotCSogY29uZmlnL2kzODZjb2ZmLm10OiBBZGQgb3Bjb2RlL2kzODYuaCB0byBUQVJHX0NQVV9ERVBFTkRFTlRTLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGRvX3JlbG9jc19mb3IpOiBJbmNyZW1lbnQgYWRkciBldmVuIGlmIG5vdAotCXVzaW5nIFpFUk9fQkFTRURfU0VHTUVOVFMuCi0JKGZpbGxfc2VjdGlvbik6IElmIFpFUk9fQkFTRURfU0VHTUVOVFMsIHNldCBzZWdtZW50IGFkZHJlc3NlcywgYnV0Ci0JbmV2ZXIgc2V0IHNlZ21lbnQgYWRkcmVzcyBmb3IgU0VHX0UyICguYnNzKSBhbmQgZG9uJ3Qgd3JpdGUgb3V0Ci0JU0VHX0UyIGNvbnRlbnRzLiAgU2V0IC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucyB0byBTVFlQX1RFWFQuCi0JKG9ial9jb2ZmX2VuZGVmKTogRG9uJ3QgbWVyZ2UgbGFiZWxzIG9yIHN5bWJvbHMgYXdhaXRpbmcgZm9yd2FyZAotCWRlZmluaXRpb25zLCBhbmQgZG9uJ3QgbWVyZ2UgdGFncyB3aXRoIG5vbi10YWdzLiAgQ2hlY2sgZm9yIC5iZgotCXJhdGhlciB0aGFuIGp1c3QgY2hlY2tpbmcgd2hldGhlciB0aGUgc2Vjb25kIGNoYXJhY3RlciBpcyBiIGFuZAotCXRoZSB0aGlyZCBjaGFyYWN0ZXIgaXMgZi4KLQkob2JqX2NvZmZfdmFsKTogZ2NjIGNhbiBnZW5lcmF0ZSB2YWx1ZXMgd2hpY2ggd2UgZG9uJ3QgaGFuZGxlCi0JY29ycmVjdGx5OyBkaXNjYXJkIGluZm9ybWF0aW9uIGZvciBub3csIHNpbmNlIGl0IG9ubHkgYWZmZWN0cyB0aGUKLQlkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0JKHRhZ19maW5kX29yX25hbWUpOiBEb24ndCBpbnNlcnQgdGFncyBpbiB0aGUgc3ltYm9sIHRhYmxlLgotCSh5YW5rX3N5bWJvbHMpOiBEb24ndCBtZXJnZSBsYWJlbHMuCi0JKHdyaXRlX29iamVjdF9maWxlKTogRG9uJ3QgZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOIGlmIGl0IGlzCi0JYWxyZWFkeSBkZWZpbmVkLiAgRmlsbCBzdWJzZWdtZW50cyB3aXRoIE5PUF9PUENPREUsIG5vdCAwLiAgRG9uJ3QKLQlzZXQgc2VnbWVudCBhZGRyZXNzIGlmIFpFUk9fQkFTRURfU0VHTUVOVFMuCi0JKG9ial9jb2ZmX3NlY3Rpb24pOiBBY2NlcHQgYW5kIGlnbm9yZSBhIHRyYWlsaW5nIHF1b3RlZCBzdHJpbmcsIGFzCi0JdXNlZCBpbiBBVCZUIGkzODYgc3ludGF4LgotCShmaXh1cF9zZWdtZW50KTogVGFrZSBzZWdtZW50IGFzIGFyZ3VtZW50LiAgT24gdGhlIGkzODYsIGFkanVzdCBQQwotCXJlbGF0aXZlIGFkZGVuZHMgYnkgdGhlIHNlZ21lbnQgdmFkZHIuCi0JKiB0Yy1pMzg2Lmg6IERlZmluZSBTVUJfU0VHTUVOVF9BTElHTi4KLQkqIHRjLWEyOWsuaDogRGVmaW5lIFpFUk9fQkFTRURfU0VHTUVOVFMuCi0JKiB0Yy1pMzg2LmM6IChpMzg2X29wZXJhbmQpOiBJZiBJMzg2Q09GRiwgYWNjZXB0IGFueSBzZWdtZW50IHR5cGUuCi0KLVR1ZSBEZWMgIDggMDA6MDY6NDggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYzogSW5jbHVkZSBsaWJjb2ZmLmguCi0KLQkqIHZlcnNpb24uYzogTm93IHZlcnNpb24gMS45My4KLQotTW9uIERlYyAgNyAwMDozOTowOSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfcHNldWRvX3RhYmxlKTogRm9yIDM4NmJzZCBhbmQgbGludXgsIGRvCi0JcG93ZXItb2YtdHdvIGFsaWdubWVudCBmb3IgLmFsaWduLgotCi0JKiBhcy5oOiBJZiBCUk9LRU5fQVNTRVJULCBqdXN0IHJlZGVmaW5lIGBhc3NlcnQnIHRvIGJlIHRyaXZpYWwsCi0JYW5kIGxlYXZlIGV2ZXJ5dGhpbmcgZWxzZSBhbG9uZS4KLQotRnJpIERlYyAgNCAxNjo1ODo0MiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhcy5uZXcpOiBEb24ndCBib3RoZXIgc2F2aW5nIGFzLm9sZC4KLQotCSogd3JpdGUuYzogQ29uZGl0aW9uYWxpemUgb24gT0JKX1ZNUywgbm90IFZNUy4KLQkobWFnaWNfbnVtYmVyX2Zvcl9vYmplY3RfZmlsZSk6IERvbid0IGRlZmluZSBpZiBPQkpfVk1TLgotCi0JKiBjb25maWcvb2JqLXZtcy5jOiBDaGFuZ2VzIGZvciB0cmFkaXRpb25hbCBDLgotCi1UaHUgRGVjICAzIDAxOjI0OjA3IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tZ2VuZXJpYy5oIChtYWxsb2MsIHJlYWxsb2MpOiBEZWNsYXJlLgotCi0JKiBMb3RzIG9mIGNvbW1lbnQvd2hpdGVzcGFjZSBjaGFuZ2VzLgotCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogU29tZSBmaWVsZHMgcmVvcmRlcmVkLCBuYXJyb3dlZC4KLQotCSogcmVhZC5jIChNQVNLX0NIQVIpOiBEZWZpbmUgdXNpbmcgQyB0eXBlcywgbm90IG1hZ2ljIG51bWJlci4KLQotCSogYXMuYywgaW5wdXQtZmlsZS5jOiBEZWxldGVkIHNvbWUgdW51c2VkIGNvZGUuCi0KLQkqIGFwcC5jLCBhcy5oOiBEb2MgZml4LgotCi0JKiBmbG9udW0ta29uc3QuYywgZmxvbnVtLW11bHQuYzogSW5jbHVkZSBhbnNpZGVjbC5oLgotCi0JKiBhcy5oICh4bWFsbG9jKTogQXJndW1lbnQgaXMgbG9uZy4KLQotCSogeG1hbGxvYy5jIChlcnJvcik6IFJlbW92ZSBkZWNsYXJhdGlvbjsgYXMuaCB0YWtlcyBjYXJlIG9mIGl0LgotCi0JKiBkb2MvYXMudGV4aW5mbzogUmVncm91cGVkIGRvY3VtZW50YXRpb24gb2Ygc29tZSBjb21tYW5kLWxpbmUKLQlvcHRpb25zLiAgVXBkYXRlZCBvcHRpb25zIGRvY3VtZW50YXRpb24gZm9yIG02OGsuICBTb21lIG1pbm9yCi0Jd29yZGluZy9wdW5jdHVhdGlvbiBjaGFuZ2VzLgotCi1Nb24gTm92IDMwIDExOjQyOjExIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBY2NlcHQgdGFyZ2V0IE9TICJ2bXMiLgotCi0JKiBzeW1ib2xzLmM6ICBNZXJnZWQgQU5TSSBhbmQgbm9uLUFOU0kgZnVuY3Rpb24gZGVjbHMsIHVzaW5nCi0JUEFSQU1TIG1hY3JvLgotCi0JKiB4bWFsbG9jLmM6IEp1c3QgaW5jbHVkZSBhcy5oLCBkb24ndCBib3RoZXIgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQKLQlvdGhlciBoZWFkZXIgZmlsZXMuCi0KLQkqIHN0cnN0ci5jLCBzdHJlcnJvci5jOiBEZWxldGVkLgotCSogTWFrZWZpbGUuaW46IERlbGV0ZWQgcmVmZXJlbmNlcy4KLQotCSogY29uZmlnL3RjLW5zMzJrLmM6IERvbid0IGluY2x1ZGUgaGVhZGVyIGZpbGUgZm9yIHN0cmluZwotCWRlY2xhcmF0aW9uczsgbGVhdmUgdGhhdCB0byBoby0qLmguCi0KLUZyaSBOb3YgMjcgMDQ6MTE6MzYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuIGF0IGNhbWJyaWRnZS1sYXB0b3AuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2NvZmZfZ251LmggW1RDX0k4NjBdOiBHdWVzc2VzIGZvciByZWxvYyB0eXBlIHZhbHVlcywKLQlpbXBvcnRlZCBmcm9tIEZTRiBzb3VyY2VzLgotCi0JKiBtZXNzYWdlcy5jIChzdHJlcnJvcik6IERlY2xhcmUgdW5jb25kaXRpb25hbGx5LgotCi0JKiBhcy5oOiBEZWxldGUgYWxsb2NhIGFuZCByZWdpc3RlciBkZWZpbml0aW9ucy4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChtYXNrKTogTm93IGNvbnN0LgotCi0JKiBvYnN0YWNrLmMsIG9ic3RhY2suaDogRGVsZXRlZC4KLQotCSogYXMuaCAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpOiBOZXcgZmxhZy4KLQkqIGFzLmMgKG1haW4pOiBTZXQgaXQgZm9yIC1SLgotCi0JKiBhcy5oIChmbGFnX3N1cHByZXNzX3dhcm5pbmdzKTogTmV3IGZsYWcuCi0JKiBhcy5jIChtYWluKTogU2V0IGl0IGZvciAtVy4KLQkqIG1lc3NhZ2VzLmMgKGFzX3dhcm4pOiBDaGVjayBpdCBpbnN0ZWFkIG9mIGZsYWdzZWVuWydXJ10uCi0KLQkqIGFzLmggKGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dCk6IE5ldyBmbGFnLgotCSogYXMuYyAobWFpbik6IFNldCBpdCBmb3IgLVouCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oOiBEZWZpbmUgTkVFRF9GWF9SX1RZUEUuCi0JKiBjb25maWcvdGMtYTI5ay5oOiBEaXR0by4KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBEb24ndCBjb25kaXRpb25hbGl6ZSBmeF9yX3R5cGUgZmllbGQgb24gVEMKLQltYWNyb3MuCi0KLQkqIGFzLmg6IE1lcmdlZCBBTlNJIGFuZCBub24tQU5TSSBmdW5jdGlvbiBkZWNscywgdXNpbmcgUEFSQU1TCi0JbWFjcm8uCi0JKiBiaWdudW0uaCwgZXhwci5oLCBmbG9udW0uaCwgZnJhZ3MuaCwgaW5wdXQtZmlsZS5oLCBsaXN0aW5nLmgsCi0Jb2JqLmgsIG91dHB1dC1maWxlLmgsIHJlYWQuaCwgc3RydWMtc3ltYm9sLmgsIHN5bWJvbHMuaCwgdGMuaCwKLQl3cml0ZS5oOiBMaWtld2lzZS4KLQkqIHJlYWQuYzogTGlrZXdpc2UuCi0KLQkqIHhtYWxsb2MuYzogQ29uZGl0aW9uYWxpemUgb24gSEFWRV9NQUxMT0NfSCwgbm90IFVTRy4gIEZvbGQgaW4KLQl4cmVhbGxvYyBmcm9tIHhyZWFsbG9jLmMuCi0JKiB4cmVhbGxvYy5jOiBEZWxldGVkLgotCSogTWFrZWZpbGUuaW4gKFJFQUxfU09VUkNFUywgT0JKUyk6IEFkanVzdGVkLgotCi0JKiBjb25maWd1cmUuaW46IEZvciBob3N0IENQVSBhMjlrLCByczYwMDAsIHZheCwgY29uc2lkZXIgdXNpbmcgYnNkCi0Jb3Igdm1zIGhvLSBmaWxlcy4KLQotCSogY29uZmlnL2hvLXN5c3YuaCAoc2V0YnVmZmVyLCBIT19VU0cpOiBEZWxldGVkLgotCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKGF0b2ZfaWVlZSk6IEV4cG9uZW50IGZpZWxkIGlzbid0IGEgcG9pbnRlcjsKLQlkb24ndCBpbml0aWFsaXplIGl0IHdpdGggTlVMTC4KLQotCSogY29uZmlnL2hvLXZheC5oIChNX1ZBWCk6IERlbGV0ZWQ7IHdhcyB1bnVzZWQuCi0KLQkqIFJFQURNRS12bXMsIGNvbmZpZy9oby12bXMuaCwgY29uZmlnL29iai12bXMuYywgY29uZmlnL29iai12bXMuaDoKLQlOZXcgZmlsZXMgaW1wb3J0ZWQgZnJvbSBGU0YgdmVyc2lvbiwgY29udHJpYnV0ZWQgYnkgRXJpYyBZb3VuZ2RhbGUuCi0JKiBSRUFETUUtdm1zLWRiZywgY29uZmlnL3ZtczogRGVsZXRlZC4KLQotCSogQ2hhbmdlTG9nLCBjb25maWcvQ2hhbmdlTG9nOiBNZXJnZWQuCi0KLQkqIGNvbmZpZy8qdGFob2UqLCBjb25maWd1cmUuaW46IFRhaG9lIHN1cHBvcnQgYnJvdWdodCBpbiBmcm9tIEZTRgotCXZlcnNpb24uCi0KLQkqIGlucHV0LWZpbGUuYyAoaW5wdXRfZmlsZV9vcGVuKTogRWxpbWluYXRlIGNhbGwgdG8gc2V0dmJ1Zi4KLQlbVVNHXSAoc2V0YnVmZmVyKTogRGVsZXRlZCBtYWNyby4KLQotTW9uIE5vdiAyMyAxMTowMDoxNiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYWxsIGZpbGVzOiBXaGl0ZXNwYWNlIGNoYW5nZXMgZm9yIEdOVSBpbmRlbnRhdGlvbiBzdHlsZSwgZG9uZSBieQotCUdOVSBgaW5kZW50Jy4gIFNvbWUgY2xlYW51cCBzdGlsbCBuZWVkZWQsIGVzcGVjaWFsbHkgb2YgY29tbWVudHMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogTm8gdGUtMzg2YnNkLmggZmlsZSBleGlzdHM7IGRvbid0IHRyeSB0byB1c2UgaXQuCi0KLQkqIG9iai1jb2ZmLmMgKG9ial9jb2ZmX2VuZGVmKTogVXNlIGFzX3dhcm4sIG5vdCBmcHJpbnRmLgotCi0JKiB0Yy1tNjhrLmMgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgY29tcGxhaW4gYWJvdXQgNjgwMDAgd2l0aCA2ODg4MTsKLQljb3VsZCBiZSBkb2luZyBlbXVsYXRpb24uCi0KLVRodSBOb3YgMTkgMTE6NDc6MTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQl6ODAwMCBkb2N1bWVudGF0aW9uCi0JKiBkb2MvTWFrZWZpbGUuaW4sIGRvYy9hbGwubTQsIGRvYy9hcy1hbGwudGV4aW5mbywgZG9jL2FzLnRleGluZm86Ci0JYWxsIG1vZGlmaWVkLgotCi1UdWUgTm92IDEwIDA5OjQ5OjI0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFzLm8sIG9iai1mb3JtYXQubyk6IGFkZGVkIGRlcGVuZGVuY3kgb24gc3Vic2Vncy5oLgotCi0JKiBzdWJzZWdzLmg6IGFkZCBleHRlcm4gdG8gc2VnbWVudF9pbmZvIGRlY2xhcmF0aW9uLgotCi0JKiByZWFkLmg6IGFkZGVkIGV4dGVybiBkZWNsYXJhdGlvbnMgZm9yIGNvbW1lbnRfY2hhcnMsCi0JbGluZV9jb21tZW50X2NoYXJzLCBhbmQgbGluZV9zZXBhcmF0b3JfY2hhcnMuCi0JcmVhZC5jLCBhcHAuYzogcmVtb3ZlZCBkZWZpbml0aW9ucyBvZiBjb21tZW50X2NoYXJzLAotCWxpbmVfY29tbWVudF9jaGFycywgYW5kIGxpbmVfc2VwYXJhdG9yX2NoYXJzLgotCi0JKiB0Yy1tNjhrLmMgKG02OGtfcmVnX3BhcnNlKTogSWYgUkVHSVNURVJfUFJFRklYIGlzbid0IGRlZmluZWQsCi0Jc3RpbGwgYWNjZXB0IChidXQgZG9uJ3QgcmVxdWlyZSkgT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYIGJlZm9yZQotCXRoZSByZWdpc3RlciBuYW1lLgotCShpbnNlcnRfcmVnKTogcHV0IFJFR0lTVEVSX1BSRUZJWCBiZWZvcmUgcmVnaXN0ZXIgbmFtZXMgYmVmb3JlCi0JcHV0dGluZyB0aGVtIGluIHRoZSBzeW1ib2wgdGFibGUuCi0JKiB0Yy1tNjhrLmggKE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCk6IERlZmluZSB0byBiZSAiJSIsIGlmIG5vdAotCU02OEtDT0ZGLgotCi0JKiBvYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiBzZXQgU1RZUF9OT0xPQUQgYml0IGZvciAuYnNzCi0Jc2VjdGlvbi4KLQotCSogYXRvZi1pZWVlLmMsIGF0b2YtbnMzMmsuYywgdGMtKi5jOiBtYWRlIEVYUF9DSEFSUywgRkxUX0NIQVJTLAotCWNvbW1lbnRfY2hhcnMsIGxpbmVfY29tbWVudF9jaGFycyBhbmQgbGluZV9zZXBlcmF0b3JfY2hhcnMKLQljb25zaXN0ZW50bHkgY29uc3QsIGFuZCBhbHdheXMgaW5pdGlhbGl6ZWQgdGhlbS4gIEluY2x1ZGVkIHJlYWQuaC4KLQotVGh1IE5vdiAgNSAxNzo1NTo0MSAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIHRjLXNwYXJjLmMgKHNwYXJjX2lwKTogQWRkIGNvZGUgdG8gZmxhZyBlcnJvciBpZiBhbiBhYnNvbHV0ZQotCWNvbnN0YW50IHdpbGwgbm90IGZpdCBpbiBhbiBpbW1lZGlhdGUgZmllbGQuCi0JKG1kX2FwcGx5X2ZpeCwgUkVMT0NfQkFTRTEzIGNhc2UpOiBDaGVjayBmb3IgcmVsb2NhdGlvbiBvdmVyZmxvdy4KLQotV2VkIE5vdiAgNCAwNzo1MDo0NiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogb2JqLWNvZmYuYyAoY2FsbGpfdGFibGUpOiBEZWxldGUgZ2xvYmFsIHZhcmlhYmxlLgotCShvYmpfZW1pdF9yZWxvY2F0aW9ucyk6IERlZmluZSBpdCBsb2NhbGx5IGhlcmUsIGFuZCBvbmx5IGlmCi0JVENfSTk2MCBpcyBkZWZpbmVkLgotCi0JKiB0Yy1tNjhrLmMgKG02OGtfcmVnX3BhcnNlKTogVW5kZXJzY29yZSBpcyBwYXJ0IG9mIGEgc3ltYm9sIG5hbWUuCi0JKG02OGtfaXApOiBEb24ndCB3YXJuIGFib3V0IGJpZ251bSB1c2VkIGFzIGZsb2F0IGJpdC1wYXR0ZXJuLgotCi0JKiBvYmotY29mZi5jOiBSZXBsYWNlZCBBTlNJIGFuZCBub24tQU5TSSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKLQl3aXRoIGEgc2luZ2xlIHNldCB1c2luZyBQQVJBTVMgbWFjcm8uCi0KLQkqIHRjLWk5NjAuYyAodGNfYm91dF9maXhfdG9fY2hhcnMpOiBCaXQtZmllbGQgZml4dXBzIHdhbnQgYSBsZW5ndGgKLQlvZiAyLgotCi0JKiB0Yy1pOTYwLmM6IE1pc3NlZCBhIGNvdXBsZSBvZiAwLT5OT19SRUxPQyBjb252ZXJzaW9ucy4KLQotCSogdGMtaTk2MC5oIChOX0JBTE5BTUUsIE5fQ0FMTE5BTUUpOiBEZWZpbmUgYXMgY2hhci10eXBlIHZhbHVlcywKLQlzbyB3aWRlbmluZyB3b3JrcyBjb25zaXN0ZW50bHkuCi0KLVdlZCBPY3QgMjggMDg6NTI6MzQgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIHZlcnNpb24uYzogUHV0IGNvbmRpdGlvbmFsICJjb25zdCIgYmVmb3JlIHZlcnNpb25fc3RyaW5nLCBub3QKLQliZWZvcmUgZHVtbXkgZnVuY3Rpb24gZm9yIFZNUy4gIE5vdyB2ZXJzaW9uIDEuOTEuMDMuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBOZWVkIGRvdWJsZS1cIGJlZm9yZSBgMDAwJyB0byBzaG93Ci0JcHJpbnRlZCByZXAgb2YgbnVsbCBjaGFyYWN0ZXIuCi0KLUZyaSBPY3QgMjMgMTQ6NDA6MzggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBvYmotY29mZmJmZC5jICh3cml0ZV9vYmplY3RfZmlsZSk6IGNoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9jbG9zZV9hbGxfZG9uZS4KLQotVHVlIE9jdCAyMCAxMjoxODowOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIFN1cHBvcnQgZm9yIGkzODYtc3lzdi4KLQlvYmotY29mZmJmZC5jIChkb19yZWxvY3NfZm9yLCB3cml0ZV9vYmplY3RfZmlsZSk6IHNldCBzZWdtZW50Ci0JYWRkcmVzc2VzIHRvIHJlYXNvbmFibGUgc2l6ZXMuICBOZXcgZGVmaW5lIFpFUk9fQkFTRURfU0VHTUVOVFMgY2FuCi0JYmUgdXNlZCB0byBzZXQgdGhlbSBhbGwgdG8gemVybyBhcyB3YXMgZG9uZSBiZWZvcmUuCi0JKGZpbGxfc2VjdGlvbik6IHNlZ21lbnQgYWRkcmVzc2VzIG5vdyBzZXQgaW4gd3JpdGVfb2JqZWN0X2ZpbGUuCi0JKGZpbGxfc2VjdGlvbik6IERvbid0IHNldCBTVFlQX05PTE9BRCBmb3IgLmJzcyBzZWN0aW9uLgotCShmaXh1cF9zZWdtZW50KTogMzg2IHVzZXMgc3RyYW5nZSBjb21tb24gc3ltYm9sIGZvcm1hdC4KLQl0Yy1pMzg2LmMgKHRjX2NvZmZfZml4MnJ0eXBlKTogdXNlIFJfRElSMzIsIG5vdCBSX1JFTExPTkcsIGZvcgotCWNvbXBhdGliaWxpdHkgd2l0aCBTVlIzLjIgbGlua2VyLgotCSogY29uZmlndXJlLmluOiBpMzg2LXN5c3YgYW5kIGkzODYtc2NvIHVzZSBjb2ZmYmZkLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogZGlzY2FyZCB3aGl0ZXNwYWNlIGFmdGVyIGEgbGFiZWwuCi0KLVNhdCBPY3QgMTAgMTI6MzM6NDUgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBTdW5PUyA0IGFuZCBTb2xhcmlzMiBmb3IgU3VuNAotCWhvc3RzLCB1c2UgdGhlIHN5c3YgY29uZmlndXJhdGlvbiBmb3Igc29sYXJpczIKLQotTW9uIE9jdCAgNSAwOToyODo1NyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSBmaXggaTk2MCtub24tYmZkIGNvZmYgYml0IHJvdC4KLQkqIG9iai1jb2ZmLmMgKGNfZG90X2ZpbGVfc3ltYm9sLCBvYmpfY29mZl9sbiwgb2JqX2NvZmZfbGluZSk6Ci0Jc3VwcG9ydCBmb3IgQyBzb3VyY2UgbGlzdGluZ3MuIChvYmpfY29mZl9lbmRlZik6IGxvb2sgaW4gdGhlIHJpZ2h0Ci0JcGFydCBvZiB0aGUgc3ltYm9sIGZvciB0aGUgc3ltYm9sIG5hbWUKLQotCSogdGMtbTY4ay5jIChnZXRfbnVtKTogbWFrZSBpdCB3b3JrIGZvciBhbGwgc2VnbWVudHMsIG5vdCBqdXN0IHRoZQotCWZpcnN0IHRocmVlLgotCi1Nb24gT2N0ICA1IDAzOjMwOjM2IDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IHR3ZWVkbGVkdW1iZXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgaTM4Ni0qLWJzZCBlbXVsYXRpb24uCi0KLVRodSBPY3QgIDEgMjM6MDU6MTIgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSB0aGUgY3B1LXZlbmRvci1vcyB0cmlwbGUgZm9yIGhvc3QgYW5kIHRhcmdldAotCi1UdWUgU2VwIDI5IDEyOjIyOjUyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmotY29mZmJmZC5jICh3cml0ZV9vYmplY3RfZmlsZSk6IGRvbid0IGZpeHVwIGZvciB0aGUgejhrCi0JKiB0Yy16OGsuYzogbG90cyBvZiBidWcgZml4ZXMKLQotVHVlIFNlcCAyOSAxMDo1MTo1NSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHRjLWk5NjAuaCwgdGMtaTk2MC5jOiBhdm9pZCB0aGUgQU5TSSBwcmVwcm9jZXNzb3IgYWRkaXRpb24KLQkjZWxpZiwgc2luY2UgaXQgaXMgbm90IHN1cHBvcnRlZCBieSBvbGQgY29tcGlsZXJzLgotCWhvLXJzNjAwMC5oLCB0Yy1tNjhrLmM6IHRoZSBuYXRpdmUgUlMvNjAwMCBjb21waWxlciBtaXNjb21waWxlcyBhCi0JY291cGxlIG9mIGV4cHJlc3Npb25zIGluIHRjLW02OGsuYy4KLQotTW9uIFNlcCAyOCAyMToxODoyNCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoY29ucyk6IElmIE5PX1JFTE9DIGlzIGRlZmluZWQsIHVzZSBpdC4KLQotCSogdGMtaTk2MC5jIChnZXRfY2Rpc3ApOiBVc2UgTk9fUkVMT0MsIG5vdCAwLCBpbiBjYWxsIHRvIGZpeF9uZXcuCi0KLUZyaSBTZXAgMjUgMTg6MTg6NTIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB0Yy1tNjhrLmg6IGlmIE02OEtDT0ZGLCBkZWZpbmUgRE9UX0xBQkVMX1BSRUZJWCAodG8gcmVxdWlyZQotCWxvY2FsIGxhYmVscyB0byBzdGFydCB3aXRoIGEgLikgYW5kIHNldCBSRUdJU1RFUl9QUkVGSVggdG8gJS4KLQl0Yy1tNjhrLmMgKG02OGtfcmVnX3BhcnNlKTogYWNjZXB0IFJFR0lTVEVSX1BSRUZJWCBpZiBkZWZpbmVkLgotCi1GcmkgU2VwIDI1IDE3OjUzOjQzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBtZXNzYWdlcy5jOiAgQ29tbWVudCBjaGFuZ2VzLgotCi1GcmkgU2VwIDI1IDE0OjEyOjU4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBreXJpYXRoLmN5Z251cy5jb20pCi0KLQkqIGFzLmg6IFRlc3QgaWYgX19TVERDX18gaXMgZGVmaW5lZCBvbmx5LCBkb24ndCB0ZXN0IGl0cyB2YWx1ZS4KLQkqIG1lc3NhZ2VzLmM6IElmIF9fU1REQ19fIGlzIG5vdCBkZWZpbmVkLCBkZWZpbmUgTk9fU1REQVJHLgotCi1UaHUgU2VwIDI0IDEyOjQyOjMyIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsaXN0aW5nLmMgKGRlYnVnZ2luZ19wc2V1ZG8pOiBBZGQgc3RhYnMgYW5kIHN0YWJuIGFzIHRoaW5ncyB0bwotCWlnbm9yZS4KLQotVHVlIFNlcCAyMiAxMzowMjowNyAxOTkyICBTZWFuIEVyaWMgRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogb2JqLWNvZmZiZmQuYyAoZG9fcmVsb2NzX2ZvcixmaWxsX3NlY3Rpb24pOiBub3cgYWxsb2NhdGUgYWxsCi0Jc2VjdGlvbnMgc3RhcnRpbmcgZnJvbSB6ZXJvLCByYXRoZXIgdGhhbiBtYWtpbmcgdGhlbSBjb25zZWN1dGl2ZS4KLQlUaGlzIG1ha2VzIHN1YnNlcXVlbnQgcmVsb2MgY2FsY3VsYXRpb25zIGVhc2llciwgZXNwIGlmIHRoZSBvYmplY3QKLQlmb3JtYXQgZG9lc24ndCB1bmRlcnN0YW5kIGFkZGVuZHMuIChvYmpfY29mZl9sY29tbSk6IChtYXliZSB0ZW1wb3JhcmlseSkKLQlhbGxvY2F0ZSBsY29tbSBpbiAuZGF0YSByYXRoZXIgdGhhbiBpbiAuYnNzLiAgSXQgc2VlbXMgdGhhdCBzb21lCi0JdG9vbHMgY2FuJ3QgY29wZSB3aXRoIGEgbm9uLXplcm8gc2l6ZWQgYnNzIGJlZm9yZSBsaW5rYWdlLgotCi1UdWUgU2VwIDIyIDE1OjEwOjUxIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5jOiBSZXBsYWNlICJlbnVtIG02OGtfYXJjaGl0ZWN0dXJlIiB3aXRoICJpbnQiCi0JdGhyb3VnaG91dC4gIFRoYXQgZW51bSBubyBsb25nZXIgbWVhbnMgd2hhdCB3ZSB0aG91Z2h0IGl0IG1lYW50LgotCi0JKiB0Yy1tNjhrLmMgKG1kX2Fzc2VtYmxlLCBtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgbmV3Ci0JIi1tbm8tNjg4WzU4XTEiIG9wdGlvbnMuCi0KLQkqIHRjLW02OGsuYzogQWRkZWQgQ1BVMzIgc3VwcG9ydC4KLQotRnJpIFNlcCAxOCAwODowMjoxOCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5jIChtNjhrX2lwKTogQW4oZGlzcCkgaXMgbm90IHBjIHJlbGF0aXZlLgotCi1UdWUgU2VwIDE1IDE3OjI1OjA1IDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFzLm5ldyk6IFJlbW92ZSBkZXBlbmRlbmNlIG9uIExPQ0FMX0xPQURMSUJFUy4KLQlDaGFuZ2UgTElCREVQUyBkZXBlbmRlbmNlIHRvIExJQlMuCi0KLVR1ZSBTZXAgMTUgMTU6MzI6MDIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IGlmICQodG9vbGRpcikgZXhpc3RzLCBpbnN0YWxsIGFzIGluCi0JJCh0b29sZGlyKS9iaW4uCi0KLVN1biBTZXAgMTMgMjA6MzA6MTAgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBBZGRlZCBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JEIGRlZmluZSB0byBnaXZlIGFuIGVycm9yIGlmIGFueQotCS53b3JkIGlzIDwgLTMyNzY4IG9yID4gMzI3NjcuICBUaGUgLUogZmxhZyBjYXVzZXMgdGhlIGVycm9yIHRvIGJlCi0JaWdub3JlZC4gIFRoaXMgaXMgdG8gY2F0Y2ggb3Zlci1zaXplZCBzd2l0Y2hlcyBnZW5lcmF0ZWQgYnkgZ2NjIG9uCi0Jc3lzdGVtcyB3aGljaCBkb24ndCBzdXBwb3J0IHRoZSBicm9rZW4gLndvcmQgaGFjay4KLQlhcy5jIChtYWluKTogcGVybWl0IC1KIGlmIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQuCi0Jd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IGNoZWNrIGZvciBzaWduZWQgLndvcmQgb3ZlcmZsb3cgaWYKLQlXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JELgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogZml4ZWQgbWlzc2luZyBwYXJlbnMgaW4gZXhwcmVzc2lvbgotCWNoZWNraW5nIGZvciBieXRlIG9yIHdvcmQgb3ZlcmZsb3cuCi0KLQkqIG9iai1jb2ZmYmZkLmg6IGRlZmluZSBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JELgotCW9iai1jb2ZmYmZkLmMgKGZpeHVwX3NlZ21lbnQpOiBjaGVjayBmb3Igc2lnbmVkIC53b3JkIG92ZXJmbG93IGlmCi0JV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRC4KLQotCSogb2JqLWNvZmZiZmQuYyAoZml4dXBfc2VnbWVudCk6IGZpeGVkIG1pc3NpbmcgcGFyZW5zIGluCi0JZXhwcmVzc2lvbiBjaGVja2luZyBmb3IgYnl0ZSBvciB3b3JkIG92ZXJmbG93LgotCi1GcmkgU2VwIDExIDEwOjIxOjA0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JU3VwcG9ydCBmb3IgaTM4NiBjb2ZmCi0JKiBvYmotY29mZmJmZC5oIDogYWRkZWQgc3R1ZmYKLQkqIHRjLWkzODYuYyAodGNfY29mZl9maXgycnR5cGUpOiBuZXcgZnVuY3Rpb24KLQkqIHRjLWkzODYuaCA6IG5ldyBjb2ZmIGRlZmluZXMKLQotVGh1IFNlcCAxMCAwOToyMzoxNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX3B1c2gpOiBjYWxsIGlucHV0X2ZpbGVfYmVnaW4sIG5vdAotCWlucHV0X3NjcnViX2JlZ2luLgotCW1lc3NhZ2VzLmMgKGFzX3BlcnJvcik6IHByaW50ICI6ICIgYmV0d2VlbiB0aGUgcGFzc2VkIGluIGVycm9yIGFuZAotCXRoZSBzdHJlcnJvciwgbGlrZSBwZXJyb3IgZG9lcy4KLQotV2VkIFNlcCAgOSAxMTowNjoyNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiB1c2UgZ2FzX3RhcmdldCBpbnN0ZWFkIG9mIG1vZGlmeWluZyB0YXJnZXRfY3B1LgotCUZyb20gU3RldmUgQ2hhbWJlcmxhaW46Ci0JTWFrZWZpbGUuaW46IEhhbmRsZSBtNjgqLSotY29mZiouCi0JcmVhZC5jLCByZWFkLmg6IGFkZCBtdWx0IGFyZ3VtZW50IHRvIHNfc3BhY2UKLQotCSogdGMtbTY4ay5jIChtNjhrX2lwLCBtNjhrX2lwX29wLCBnZXRfbnVtLCB0cnlfbW90b19pbmRleCk6IG1lcmdlCi0JIE1vdG9yb2xhIGFuZCBNSVQgc3ludGF4OyBnYXMgY2FuIG5vdyBhc3NlbWJsZSBlaXRoZXIgdHlwZSBvZgotCSBmaWxlLgotCXRjLW02OGttb3RlLmMsIHRjLW02OGttb3RlLmg6IHJlbW92ZWQgbm93IHN1cGVyZmx1b3VzIGZpbGVzLgotCUZyb20gU3RldmUgQ2hhbWJlcmxhaW46Ci0JbTY4a2NvZmYubXQ6IGZvciBtNjhrIENPRkYuCi0Jb2JqLWNvZmZiZmQuYzogKGZpeHVwX21kZXBzKSBhZGRlZAotCSAoc2l6ZV9zZWN0aW9uKSByZW1vdmVkIGJhZCBzYW5pdHkgY2hlY2sKLQkgKGZpbGxfc2VjdGlvbikgYWRkZWQgcnNfbWFjaGluZV9kZXBlbmRlbnQgY2FzZQotCSAod3JpdGVfb2JqZWN0X2ZpbGUpIGNhbGwgZml4dXBfbWRlcHMKLQkgKGZpeHVwX3NlZ21lbnQpIHNldCBmeF9zdWJzeSB0byAwLgotCW9iai1jb2ZmYmZkLmg6IGRlZmluZSBXT1JLSU5HX0RPVF9XT1JEICh0b28gaGFyZCB0byBzdXBwb3J0KSBhbmQKLQkgaGFuZGxlIG02OGsuCi0JdGMtbTY4ay5jLCBjb25maWcvdGMtbTY4ay5oOiBhZGRlZCBtNjhrIENPRkYgc3VwcG9ydCBhbmQgTW90b3JhbGEKLQkgcHNldWRvIG9wcy4KLQotVHVlIFNlcCAgOCAxNzoxMDo1OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChMSUJTKTogSW5jbHVkZSBvcGNvZGUgbGlicmFyeS4KLQotRnJpIFNlcCAgNCAxODoyMDo1NiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAoZ2V0X251bSwgY2FzZSBTRUdfQklHKTogSWYgb25seSBzbWFsbCBpbnRlZ2VycwotCWluY2x1ZGluZyB6ZXJvIGFyZSBhY2NlcHRlZCwgcGFzcyArMC4wLgotCi1TdW4gQXVnIDMwIDIxOjI0OjQ2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG1hcCAiYXMiIHRocm91Z2ggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSB3aGVuCi0JaW5zdGFsbGluZy4KLQotCSogZG9jL01ha2VmaWxlLmluOiBtYXAgImFzIiB0aHJvdWdoIHByb2dyYW1fdHJhbnNmb3JtX25hbWUgd2hlbgotCWluc3RhbGxpbmcuCi0KLVNhdCBBdWcgMjkgMTI6MTE6MTIgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYXMubmV3KTogRGVwZW5kIG9uIExPQ0FMX0xPQURMSUJFUy4KLQotRnJpIEF1ZyAyOCAxNjoyNToyMiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG9iai1ib3V0LmgsIG9iai1ib3V0LmMgKG9ial9oZWFkZXJfYXBwZW5kLCBvYmpfc3ltYm9sX3RvX2NoYXJzKSwKLQl0Yy1pOTYwLmMgKG1kX3JpX3RvX2NoYXJzKTogQWx3YXlzIG91dHB1dCBib3V0IG9iamVjdCBmaWxlIGluCi0JbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyICh1c2VkIHRvIHVzZSBlbmRpYW5uZXNzIG9mIGhvc3QpLgotCi1UdWUgQXVnIDI1IDE1OjUwOjQ4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAoaW5pdF90YWJsZSk6IE5vdyBjb25zdC4gIEFsd2F5cyBpbmNsdWRlIDY4ODUxCi0JZGF0YSwgc28gdGhhdCAiYmMiIGlzIGF2YWlsYWJsZSB0byA2ODA0MCBjYWNoZSBpbnN0cnVjdGlvbnMuCi0JQWRkZWQgInR0MCIsICJ0dDEiLCBhbmQgNjhlYzAzMCB2YXJpYW50cy4KLQkobWRfYXNzZW1ibGUpOiBDb21wbGFpbiBpZiA2ODAwMCAob25seSkgYW5kIDY4ODgxIGFyZSBzcGVjaWZpZWQuCi0JKGVudW0gX3JlZ2lzdGVyKTogQWRkZWQgVFQwLCBUVDEuCi0JKG02OGtfaXAsIGNhc2VzICczJyBhbmQgJ3QnKTogSGFuZGxlIG5ldyBvcGVyYW5kIHR5cGUgY29kZXMuICBQYXNzCi0JbGluZSBudW1iZXIgY29ycmVjdGx5IGluICJpbnRlcm5hbCBlcnJvciIgbWVzc2FnZXMuICBEb24ndCBwcmludAotCWFyY2hpdGVjdHVyZS1taXNtYXRjaCBtZXNzYWdlIGZvciBvcGVyYW5kIGVycm9ycy4KLQotCUZyb20gQ29saW4gU21pdGggKGNvbGluQHdycy5jb20pOgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCwgY2FzZSAnXycpOiBVc2UgYWRkd29yZCB0d2ljZSByYXRoZXIKLQl0aGFuIGluc3RhbGxfb3BlcmFuZC4KLQotVHVlIEF1ZyAyNSAxNToxMzo0OCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGlzdGluZy5jIChidWZmZXJfbGluZSk6IHJld2luZCB0byB0aGUgc3RhcnQgb2YgaW5jbHVkZQotCWZpbGVzLCB0aGV5IG1pZ2h0IGJlIGluY2x1ZGVkIHR3aWNlLgotCi0JKiB6OGsuYywgejhrLmgsIHo4ay5tdDogejgwMDAgc3VwcG9ydCBzdHVmZgotCi1Nb24gQXVnIDI0IDEyOjQ1OjQzIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRlZmluZWQgVEFSR0VUX0NQVSBmb3IgQyBjb2RlIHNvIHRoYXQgaXQgY2FuIGNob29zZQotCW9uZSBlbGVtZW50IG9mIGEgZmFtaWx5LgotCi0JKiB0Yy1tNjhrLmM6IHVzZSBUQVJHRVRfQ1BVIHRvIGNob29zZSBkZWZhdWx0IGNwdSB0eXBlLgotCi0JKiB0ZS1nZW5lcmljLmg6IGRlZmF1bHQgdG8gTE9DQUxfTEFCRUxTX0RPTExBUiBhbmQgTE9DQUxfTEFCRUxTX0ZCCi0Jc28gdGhhdCB3ZSBjYW4gYXNzZW1ibGUgaGFuZC13cml0dGVuIGxpYmdjYyBjb2RlLgotCi1GcmkgQXVnIDIxIDE0OjM4OjQ0IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbWVzc2FnZXMuYyAoYXNfd2Fybik6IFVzZSBmcHV0cywgbm90IGZwcmludGYsIHdpdGggYSBidWZmZXIgdGhhdAotCWhhcyBhbHJlYWR5IGJlZW4gZm9ybWF0dGVkIChidXQgbWF5IHN0aWxsIGNvbnRhaW4gJS1jaGFyYWN0ZXJzKS4KLQkoYXNfYmFkKTogTGlrZXdpc2UuCi0KLVdlZCBBdWcgMTkgMTE6MjA6NTkgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB0Yy1tNjhrLmMsIHRjLW02OGttb3RlLmM6IHRoZSBjYXMyIGluc3RydWN0aW9uIGlzIHN1cHBvc2VkIHRvIGJlCi0Jd3JpdHRlbiB3aXRoIGluZGlyZWN0aW9uIG9uIHRoZSBsYXN0IHR3byBvcGVyYW5kcywgd2hpY2ggY2FuIGJlCi0JZWl0aGVyIGRhdGEgb3IgYWRkcmVzcyByZWdpc3RlcnMuICBBZGRlZCBhIG5ldyBvcGVyYW5kIHR5cGUgJ3InCi0Jd2hpY2ggYWNjZXB0cyBlaXRoZXIgcmVnaXN0ZXIgdHlwZS4gIEFkZGVkICcoJyB0byBub3RlbmQgc3R1ZmYgaW4KLQl0Yy1tNjhrbW90ZS5jIHRvIGFjY2VwdCAoYTApOihhMikgaW4gY2FzMiBpbnN0cnVjdGlvbi4KLQotV2VkIEF1ZyAxOSAwOToyNTowOSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYXMuaCAoZW51bSBfcmVsYXhfc3RhdGUpOiBTdGFydCBvZmYgYXQgb25lLCBub3QgemVybywgdG8gYmV0dGVyCi0JY2F0Y2ggdW5pbml0aWFsaXplZC12YXJpYWJsZSBlcnJvcnMuCi0JKGxpbmtyZWxheCk6IERlY2xhcmUgbmV3IHZhcmlhYmxlLgotCi0JKiBtZXNzYWdlcy5jICh3YXJuaW5nX2NvdW50LCBlcnJvcl9jb3VudCk6IERlZmF1bHQgaW5pdGlhbGl6ZXIgaXMKLQlzdWZmaWNpZW50LgotCi0JKiB3cml0ZS5jOiBNZXJnZWQgc29tZSBkZWNsYXJhdGlvbnMsIHVzaW5nIFBBUk1TIG1hY3JvLgotCSh0ZXh0X2ZyYWdfcm9vdCwgZGF0YV9mcmFnX3Jvb3QsIGJzc19mcmFnX3Jvb3QsIHRleHRfbGFzdF9mcmFnLAotCWRhdGFfbGFzdF9mcmFnKTogTm8gbG9uZ2VyIHN0YXRpYy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUsIGNhc2UgcnNfYWxpZ24gb3IgcnNfb3JnKTogSWYgSEFORExFX0FMSUdOIGlzCi0JZGVmaW5lZCwgY2FsbCBpdC4gIENoYW5nZSBzZWdtZW50cyBiZWZvcmUgY2FsbGluZyBmaXh1cF9zZWdtZW50LgotCShyZWxheF9hbGlnbik6IElmIGxpbmtyZWxheCwgcHJvdmlkZSBleHRyYSBwYWRkaW5nLgotCi0JKiBvYmotYm91dC5jIChvYmpfZW1pdF9yZWxvY2F0aW9ucyk6IEVtaXQgYWxpZ25tZW50IHJlbG9jcyBkZXNwaXRlCi0JdGhlaXIgbm90IGhhdmluZyBzeW1ib2xzIGFzc29jaWF0ZWQuCi0KLQkqIHRjLWk5NjAuYyAobm9yZWxheCwgaW5zdHJ1bWVudF9icmFuY2hlcyk6IERlZmF1bHQgaW5pdGlhbGl6ZXIgaXMKLQlzdWZmaWNpZW50LgotCShsaW5rcmVsYXgpOiBEZWxldGUgdmFyaWFibGUgZGVmaW5pdGlvbi4KLQkobWVtX2ZtdCk6IENhbGwgZml4X25ldyB3aXRoIE5PX1JFTE9DLgotCSh0Y19ib3V0X2ZpeF90b19jaGFycyk6IEhhbmRsZSBhbGlnbm1lbnQgcmVsb2NzLgotCShpOTYwX2hhbmRsZV9hbGlnbik6IE5ldyBmdW5jdGlvbi4KLQkqIHRjLWk5NjAuaCAobGlua3JlbGF4KTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCShIQU5ETEVfQUxJR04pOiBOZXcgbWFjcm87IGNhbGxzIGk5NjBfaGFuZGxlX2FsaWduLgotCShORUVEX0ZYX1JfVFlQRSwgTk9fUkVMT0MpOiBOZXcgbWFjcm9zLgotCi1UdWUgQXVnIDE4IDE0OjU5OjIxIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvc3BhcmMubXQ6IE5ldyBmaWxlLiAgR3JhYiBzcGFyYyBvcGNvZGUgdGFibGUgZnJvbSBiZmQKLQlsaWJyYXJ5LgotCi1UdWUgQXVnIDE4IDE0OjE2OjM4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLiAgUmVtb3ZlZAotCU1JTlVTX0csIHNldCBDRkxBR1MgdG8gZGVmYXVsdCB0byAtZywgYWRkZWQgRkxBR1NfVE9fUEFTUywgcGFzc2VkCi0JRkxBR1NfVE9fUEFTUyB0byByZWN1cnNpdmUgbWFrZXMuCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCi0KLU1vbiBBdWcgMTcgMTU6MDk6NTYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX3BvcCwgaW5wdXRfc2NydWJfcHVzaCk6IG1lbWNweSB3YXMKLQliZWluZyB1c2VkIHdpdGggYXJncyBzd2FwcGVkLCBjYXVzaW5nIG9jY2FzaW9uYWwgbG9zc2FnZSB3aGVuCi0JcmVmaWxsaW5nIGJ1ZmZlcnMgYWZ0ZXIgYW4gaW5jbHVkZSBmaWxlLgotCi1Nb24gQXVnIDE3IDEzOjE4OjUxIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBtZXNzYWdlcy5jIChhc190c2t0c2spOiBVc2UgY29ycmVjdCBBTlNJIGZvcm0gZm9yIHN0ZGFyZwotCXZlcnNpb24uICBEaXNjYXJkIGJvZ3VzIERPTlRERUYgdmVyc2lvbi4KLQkoYXNfd2FybiwgYXNfYmFkLCBhc19mYXRhbCk6IExpa2V3aXNlLgotCi1GcmkgQXVnIDE0IDE4OjMxOjE0IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSWYgaW5zdHJ1Y3Rpb24gaXMgaW52YWxpZCBmb3IgdGhlCi0Jc2VsZWN0ZWQgYXJjaGl0ZWN0dXJlLCBwcmludCBhIG1lc3NhZ2Ugc2F5aW5nIHNvIGFuZCBsaXN0aW5nIHdoYXQKLQlwcm9jZXNzb3JzIHN1cHBvcnQgaXQsIHJhdGhlciB0aGFuIHNheWluZyAib3BlcmFuZHMgbWlzbWF0Y2giLgotCi1UaHUgQXVnIDEzIDEzOjUzOjE5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBhcy5oIFtCUk9LRU5fQVNTRVJUXTogSWYgZGVmaW5lZCwgdHVybiBvZmYgYWxsIGFzc2VydGlvbiBjaGVja3MuCi0KLQkqIGNvbmZpZy9oby1yczYwMDAuaCAoTV9SUzYwMDApOiBEb24ndCBkZWZpbmUgaXQuCi0JKGZyZWUpOiBEZWNsYXJlIGl0LgotCShCUk9LRU5fQVNTRVJUKTogRGVmaW5lIGl0IGlmIG5vdCBfX1NURENfXy4KLQotVHVlIEF1ZyAxMSAxMjo1ODoxNCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogc3BhcmMubXQ6IE5ldyBmaWxlLgotCi1Nb24gQXVnIDEwIDE0OjM3OjA4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiB0Yy1tNjhrLmM6ICIuYWxpZ24gTiIgbWVhbnMgYWxpZ24gdG8gTi1ieXRlIGJvdW5kYXJ5ICpvbmx5KgotCWlmIFROX1NVTjM7IG90aGVyd2lzZSBhbGlnbiB0byAyKipOLWJ5dGUgYm91bmFyeS4KLQotVGh1IEF1ZyAgNiAxMjoxMDozOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChzX2ZpbGwpOiBtYWtlIHRoZSAuZmlsbCBzaXplIGNsYW1wZWQgZXJyb3IgYSB3YXJuIGFuZAotCWZpeCBidWcgd2hlcmUgMCdzIHdlcmUgYWx3YXlzIHBsYWNlZC4KLQotCSogY29uZmlnL3RjLWg4MzAwLmM6IGlmIGEgOjggaXMgc2VlbiBhZnRlciBhbiBvcGVyYW5kLCBmaWxsIHRvcAotCXR3byBieXRlcyBvZiBhbnkgY29uc3RhbnQgd2l0aCAweGZmOgotCi1XZWQgQXVnICA1IDEyOjAyOjQwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBmaXggdGhlIC5hbGlnbiB0aGluZwotCXRoZSByaWdodCB3YXk7IGZvciBqdXN0IHRoZSA2OGsuIFN1biAzIC5hbGlnbiBpcyBuYnl0ZXMsIG5vdCBwdHdvLgotCi1XZWQgQXVnICA1IDAxOjU0OjM0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiB0Yy1tNjhrLmMgKHRyeV9pbmRleCk6ICBFcnJvciBpZiBpbmRleCBzY2FsaW5nIHNwZWNpZmllZCBhbmQKLQlhc3NlbWJsaW5nIGZvciBhbiBvbGRlciBDUFUgdGhhbiBhIDY4MDIwLgotCi1TYXQgQXVnICAxIDE5OjEwOjEzIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfYW91dF9maXhfdG9fY2hhcnMpOiBJZiBwYy1yZWxhdGl2ZSwgdGFrZQotCWZ4X29mZnNldCBpbnRvIGFjY291bnQuCi0KLUZyaSBKdWwgMzEgMjE6NTM6MjggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyBob3N0KTogQWNjZXB0ICJ1bHRyaXgiIHdpdGggdmVyc2lvbiBudW1iZXIuCi0KLQkqIGV4cHIuYyAoZmxvYXRpbmdfY29uc3RhbnQpOiBTZXBhcmF0ZSAiPS0iIHRvIGF2b2lkIGNvbmZ1c2luZwotCWFuY2llbnQgb3IgYnJva2VuIGNvbXBpbGVycy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IE1pc21hdGNoIGVycm9yIGNvdWxkIGFsc28gaW5kaWNhdGUKLQlwcm9jZXNzb3Ivb3Bjb2RlIG1pc21hdGNoLCBzbyByZXdvcmQgdGhlIGVycm9yIG1lc3NhZ2UuCi0JKG1kX2Fzc2VtYmxlKTogSWYgbm8gQ1BVIGhhcyBiZWVuIHNldCAoZXZlbiBpZiBGUFUvUE1NVQotCWNoYXJhY3RlcmlzdGljcyBoYXZlIGJlZW4pLCBkZWZhdWx0IHRvIDY4MDIwLiAgRG9uJ3QgbmVlZCBleHRyYQotCXF1b3RlcyBhcm91bmQgZXJyb3Igc3RyaW5nLgotCi1GcmkgSnVsIDMxIDEyOjI2OjM0IDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChwb3RhYmxlKTogUmV2ZXJ0IHNhYydzIGluY29ycmVjdCBjaGFuZ2UgbWFkZSBKdWwgMTMuCi0JQWxpZ24gcmVhbGx5IGlzIHN1cHBvc2VkIHRvIGJlIHB0d28gbm90IG5ieXRlcy4KLQotTW9uIEp1bCAyMCAwMjo1MTo1OSAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBfRG9fIGluY2x1ZGUgbGliaWJlcnR5LiAgKGZyb20gc2VmKQotCi1GcmkgSnVsIDE3IDE1OjE1OjI4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBIYW5kbGUgIjBmIiBhbmQgIjBiIiBsYWJlbCByZWZlcmVuY2VzCi0JcHJvcGVybHkuCi0KLVRodSBKdWwgMTYgMDg6MjA6MTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBpZiByZWxheGluZywgZG9uJ3QgZG8gYW55dGhpbmcuCi0JKiBjb25maWcvb2JqLWJvdXQuW2NoXSA6IG1haW50YWluIHRoZSBhX3JlbGF4YWJsZSBmaWxlIGhlYWRlciBpbmZvCi0JKiBjb25maWcvdGMtaTk2MC5jOiBuZXcgb3B0aW9uIC1saW5rcmVsYXgKLQotTW9uIEp1bCAxMyAxNDoxMTozNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChleHByKTogYWxsb3cgU0VHX0JTUyBpbiBleHByZXNzaW9ucwotCSogcmVhZC5jIChwb3RhYmxlKTogYWxpZ24gc2hvdWxkIGJlIG5ieXRlcywgbm90IHB0d28hCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IGV4dHJhIGdsdWUgZm9yIG5ldyBic3MgYXR0cmlidXRlcwotCShyZWxheF9zZWdtZW50KTogU0VHX0JTUyBpcyBvayBub3cKLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXBfb3ApOiBjYW4gbm93IHBhcnNlIG1vcmUgQCggbW9kZXMKLQotTW9uIEp1bCAgNiAxNzowOTozMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBvYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiBtYXJrIC5saXQgc2VjdGlvbnMgYXMgU1RZUF9MSVQKLQotTW9uIEp1biAgMSAxNjoyMDoyMiAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIG02ODB4MCBhcyBoYXZpbmcgc3VuMyBlbXVsYXRpb24gbW9kZSBmb3IKLQl2eHdvcmtzIGVudmlyb25tZW50LgotCi0KLVR1ZSBKdW4gMzAgMjA6MjU6NTQgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHByb2dyYW1fc3VmZml4IChwYXJhbGxlbCB0byBwcm9ncmFtX3ByZWZpeCkKLQotV2VkIEp1biAyNCAxMDo1Nzo1NCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXBwLmMgKHByb2Nlc3NfZXNjYXBlKTogbmV3IGZ1bmN0aW9uIHRvIGhhbmRsZSBlc2NhcGVzIHRoZSByaWdodAotCXdheSwgKGRvX3NjcnViX25leHRfY2hhcik6IHVzZSBuZXcgZnVuY3Rpb24KLQkqIGNvbmQuYyAoc19pZmRlZik6IGRvIGlmZGVmL2lmbmRlZiByaWdodAotCSogcmVhZC5jIChzX2ZpbGwpOiBtYWtlIHRoZSAsIGV4cHJlc3Npb25zIG9wdGlvbmFsIGxpa2UgdGhlIGRvYwotCXNheXMKLQkqIGNvbmZpZy90Yy1oODMwMC5bY2hdOiBiZXR0ZXIgd2FybmluZ3MKLQotVHVlIEp1biAgOSAwNzo1NDo1NCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3Vic2Vncy5jIChzdWJzZWdzX2JlZ2luKTogY3JlYXRlIGJzczBfZnJjaGFpblAgaW4gdGhlIHNhbWUgd2FzCi0JYXMgZGF0YTBfZnJjaGFpblAKLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiB2YXJpb3VzIGNoYW5nZXMgdG8gaGFuZGxlIGRhdGEgaW4KLQl0aGUgQlNTIHNlZ21lbnQgaW4gbXVjaCB0aGUgc2FtZSB3YXMgYXMgc3R1ZmYgaW4gdGhlIERBVEEgc2VnbWVudC4KLQotCSogdGMtbTY4ay5jIChtNjhraXApOiBGaXggdHlwbyBzbyB0aGF0IG9ubHkgYXJjaCdzID49NjgwMjAgZG8KLQlwY3JlbCBkYXRhIHN0dWZmLiAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiB3aGVuIHJlbGF4aW5nIGEKLQk2ODAxMCBieHggaW50byBhIGJyYSs2IGptcHh4LCBwdXQgdGhlIGJ5dGVzIG9mIHRoZSBqbXAgb3Bjb2RlIGludG8KLQl0aGUgcmlnaHQgcGxhY2UuIChzX2Jzcyk6IERvbid0IHB1dCAuYnNzIHN0dWZmIGludG8gU0VHX0RBVEEsIHB1dAotCWl0IGludG8gU0VHX0JTUwotCi1UaHUgSnVuICA0IDExOjU5OjEzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBleHByLmMoZXhwcik6IGFsbG93IFNFR19SRUdJU1RFUiBpbiBleHByZXNzaW9ucy4KLQkqIHJlYWQuYyhwc2V1ZG9fc2V0KTogcmVnaXN0ZXIgZXhwcmVzc2lvbnMgY2FuIGJlIHRoZSBzb3VyY2Ugb2YgYQotCXNldC4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ldyk6IE5vdyAtUiBmb3JjZXMgYWxsIGNoYW5nZXMgdG8gU0VHX0RBVEEgdG8KLQlnb3RvIFNFR19URVhUIChpZiBhLm91dCkKLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgYS5vdXQgZG9uJ3QgdXNlIHRoZSBvbGQgd2F5IGZvcgotCS1SLgotCSogY29uZmlnL29iai1hLm91dCAoc19zZWN0KTogY29tcGxhaW4gaWYgdGhlIHVzZXIgdHJpZXMgdG8gdXNlIGEKLQlzdWJzZWdtZW50IHdpdGggYSB2YWx1ZSB3aGljaCBtaWdodCBpbnRlcmZlcmUgd2l0aCBvdXQgLVIgaGFja2VyeS4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfcmVnX3BhcnNlKTogbG9va3VwIG5hbWVzIGluIHN5bWJvbCB0YWJsZQotCXJhdGhlciB0aGFuIHVzZSB1Z2x5IGlmIHRyZWUuIChpbml0X3JlZ3RhYmxlKTogaW5zZXJ0IHJlZ2lzdGVyCi0JbmFtZXMgaW50byBzeW1ib2wgdGFibGUuCi0KLVR1ZSBKdW4gIDIgMTY6NDc6MDkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gKHNhY0BjeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IGtlZXAgdGhlIGZpeF90YWlsIGNsZWFuLCB3aGljaAotCWZpeGVzIGEgYnVnIGluIC1SIHdoZXJlIHJlbG9jYXRpb25zIHdlcmUgYmVpbmcgbG9zdC4KLQotTW9uIEp1biAgMSAxNjoyMDoyMiAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIG02ODB4MCBhcyBoYXZpbmcgc3VuMyBlbXVsYXRpb24gbW9kZSBmb3IKLQl2eHdvcmtzIGVudmlyb25tZW50LgotCi1TdW4gTWF5IDMxIDA1OjMzOjAwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIG02ODB4MCBhcyBhbiBtNjhrCi0KLVRodSBNYXkgMjggMTE6MjI6MDIgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBzcGFyY2xpdGUgYXMgYSBzcGFyYyB2YXJpYW50LgotCi0JKiB0Yy1zcGFyYy5jOiBVc2UgbmV3IEFSQ0hJVEVDVFVSRVNfQ09ORkxJQ1RfUCBtYWNyby4gIE1lbnRpb24gbmV3Ci0JLUFzcGFyY2xpdGUgZmxhZy4KLQotVHVlIE1heSAyNiAxNjo0Nzo1NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWEyOWsuYzogbGludAotCSogbGlzdGluZy5jLCBleHByLmM6IHBhdGNoZXMgZnJvbSBBbmRyZXcgU21pdGgKLQotVGh1IE1heSAxNCAxNzoyMjo0OCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogdXNlIG00IHJhdGhlciB0aGFuIGdtNC4KLQotTW9uIE1heSAgNCAxODo1NjoxOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqLWNvZmZiZmQuYzogdXNlIGlzIGEgc3lub255bSBmb3Igc2VjdGlvbiwgKGRvX3JlbG9jc19mb3IpOgotCWNhbGMgdGhlIGJhc2Ugb2YgcmVsb2NzIGNvcnJlY3RseS4KLQkqIHRjLWEyOWsuYyAocGFyc2Vfb3BlcmFuZCk6IGFsbG93IGV4cHJlc3Npb25zIHRvIGJlIGluIGFueSBzZWN0aW9uLgotCi1Nb24gQXByIDI3IDEzOjEzOjMxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBhcy5jLCB3cml0ZS5jOiB1c2UgLUsgcmF0aGVyIHRoYW4gLWsgZm9yIHRoZSBicm9rZW4gd29yZCB3YXJuaW5nCi0JICBvcHRpb24uCi0KLVR1ZSBBcHIgMjEgMTM6MzU6MzAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkbyBub3QgcHJpbnQgcmVjdXJzaW9uIGxpbmVzLgotCi1XZWQgQXByIDE1IDIxOjE5OjMxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHRoZSB0b29sZGlyIGNvcHkgb2YgZ2FzIGdvZXMgZGlyZWN0bHkgaW4gdG9vbGRpci4KLQotVHVlIEFwciAxNCAxNDo1MDoyMiAxOTkyICBLZW4gUmFlYnVybiAgKFJhZWJ1cm5AQ3lnbnVzLkNPTSkKLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBGb3IgYi5vdXQgZm9ybWF0LCByb3VuZCB1cCBzZWN0aW9uCi0Jc3RhcnQgYWRkcmVzc2VzIHRvIG1hdGNoIHJlcXVpcmVkIGFsaWdubWVudC4KLQotVGh1IEFwciAgOSAwNTo0NToyOSAxOTkyICBLZW4gUmFlYnVybiAgKFJhZWJ1cm5AQ3lnbnVzLkNPTSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBJbnN0YWxsIGludG8gJCh0b29sZGlyKS9iaW4sIHNpbmNlIHRoYXQncwotCXdoZXJlIGdjYyBsb29rcyBmb3IgaXQuCi0KLVR1ZSBBcHIgIDcgMTU6MTI6MTUgMTk5MiAgU2VhbiBFcmljIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQ2hhbmdlZCBzb21lIGxpbmVzIHRvIGJlIGxlc3MgY29uZnVzaW5nIGZvciBzb21lCi0JbWFrZXMuCi0KLQkqIGlucHV0LWZpbGUuYzogIENvbmRpdGlvbmFsaXplIG9uIF9JT0ZCRiwgbm90IFZNUy4KLQotCSogcmVhZC5jLCB3cml0ZS5jOiAgQ2hhbmdlIGEgc2VyaWVzIG9mIGlmZGVmL2VsaWYgdG8KLQlpZmRlZi9lbHNlL2lmZGVmIGV0Yy4KLQotRnJpIE1hciAyNyAxMjoyMToxNiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogc3ltYm9scy5jIChmYl9sYWJlbF9pbml0KTogZml4IHNpemVvZiB0byBtZW1zZXQuCi0KLUZyaSBNYXIgMTMgMTU6NDU6NDQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbnN0YWxsIHRoZSBtYW4gcGFnZS4KLQotCSogTWFrZWZpbGUuaW46IHBhc3MgZG93biBNQUtFSU5GTyBleHBsaWNpdGx5IG9uIGluZm8uCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogdXNlICQoTUFLRUlORk8pIG5vdCBtYWtlaW5mby4KLQotRnJpIE1hciAxMyAwODowMzowMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZmxvbnVtLWNvbnN0LmM6IHJlbmFtZWQgZmxvbnVtLWtvbnN0LmMgdG8gc3RvcCBkb3MgbmFtZQotCWNvbmZsaWN0LgotCi1UaHUgTWFyIDEyIDA0OjQyOjM4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiB0Yy1tNjhrLmgsIHRlLXN1bjMuaDogbW92ZWQgTE9DQUxfTEFCRUxTX0ZCIGRlZmluaXRpb24gZnJvbQotCSAgdGMtbTY4ay5oIHRvIHRlLXN1bjMuaC4KLQotV2VkIE1hciAxMSAyMzozMjo0MiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB2eHdvcmtzNjggZ2V0cyB0ZS1zdW4zLmguCi0KLQkqIGV4cHIuYzogcmVtb3ZlIGxpbWl0YXRpb24gdGhhdCBsb2NhbF9sYWJlbHNfZG9sbGFyIG9yCi0JICBsb2NhbF9sYWJlbHNfZmIgbXVzdCBiZSA8IDEwLgotCi0JKiBzeW1ib2xzLmM6IHJlbW92ZSBsb2NhbF9sYWJlbHNfZG9sbGFyLCByZXBsYWNlIHdpdGggYSBmdW5jdGlvbgotCSAgaW50ZXJmYWNlIGZvciBhIHNwYXJzZSBhcnJheS4gIEFsbCB1c2VycyBhZGp1c3RlZC4KLQotCSogdGUtc3VuMy5oOiBhZGQgTE9DQUxfTEFCRUxTX0RPTExBUi4KLQotU2F0IE1hciAgNyAwMDowNjoyNSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogY29tbWVudGVkIG91dCBsaW5lIGZvciBidWlsZGluZyBhcy1hbGwudGV4aW5mby4KLQkgIFRoaXMgaXMgdGVtcG9yYXJ5LgotCi0JKiBkb2MvYXMudGV4aW5mbywgZG9jL2FzLWFsbC50ZXhpbmZvOiBhZGRlZCBtZW51IGl0ZW0gaG9va3MuCi0KLUZyaSBNYXIgIDYgMjE6NTc6MTggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjaGVjayB0YXJnZXQuCi0KLVR1ZSBNYXIgIDMgMTU6NDU6NTYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgdG9vbGRpciBhbmQgcHJvZ3JhbV9wcmVmaXguCi0KLVN1biBNYXIgIDEgMDQ6NDM6MTkgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBjeWdudXMuY29tKQotCi0JKiB3cml0ZS57YyxofSAoZml4X25ldyk6IE1ha2UgdGhlc2UgZGVjbGFyYXRpb25zIGNvbnNpc3RlbnQuCi0KLVNhdCBGZWIgMjkgMTM6NTk6MTAgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc3RyZXJyb3Iubyk6IEFkZCBydWxlIHNvIHRoYXQgYnJva2VuIFN1biBtYWtlIGNhbgotCXdvcmsgaW4gc3ViZGlycy4KLQotV2VkIEZlYiAyNiAxOToyNjoyOCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jLCBvYmotY29mZmJmZC5jIDogZml4IGg4MzAwIHNwZWNpZmljIGJpdCByb3QKLQotCSogZXhwci5jIChvcGVyYW5kKTogaWYgY2FuJ3Qgd29yayBvdXQgd2hhdCBzb3J0IG9mIG9wZXJhbmQgaXQgaXMsCi0JdGhlbiBsb29rIHRocm91Z2ggRkxUX0NIQVJTIGZvciBhIGhpbnQuCi0KLVdlZCBGZWIgMjYgMTg6MDQ6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi0JKiBkb2MvTWFrZWZpbGUuaW4sIGRvYy9jb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi1UdWUgRmViIDI1IDE0OjE3OjE1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBleHByLmM6IElmIGFuIGV4cHJlc3Npb24gaXMgc2luZ2xlIGNvbW1hLCB0aGVuIHJldHVybiB3aXRoCi0JU0VHX0FCU0VOVCByYXRoZXIgdGhhbiBhbiBlcnJvciAtIHNpbmNlIHRoZSBzcGFyYyBmcm9udCBlbmQgZG9lcwotCXJlYWxseSBzdHJhbmdlIHRoaW5ncyB3aXRoIHRoaW5ncyBsaWtlIGZiZ2UsYQotCi0JKiBhcy5oOiBpbmNsdWRlIGJmZC5oIGlmIHVzaW5nIG1hbnkgc2VjdGlvbnMKLQkqIGV4cHIuYzogTE9DQUxfTEFCRUxTX0ZCIGhhZCBiZWVuIGNoYW5nZWQgdG8gbG93ZXIgY2FzZSAtIHNvCi0JbG9jYWwgbGFiZWxzIGRpZG4ndCB3b3JrLgotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IGRvbid0IGNvcmUgZHVtcCB3aGVuIHRoZXJlJ3Mgbm8KLQlzeW1ib2wgdGhlcmUuCi0JKiB3cml0ZS5jLCB3cml0ZS5oOiBjYWxsIGZpeF9uZXcgd2l0aCB0aGUgcmlnaHQgbnVtYmVyIG9mIGFyZ3Mgb24KLQl0aGUgSDguCi0JKiBjb25maWcvdGMtaDgzMDAuW2NoXSA6IGZpeCBidWdzIHJlcG9ydGVkIGJ5IEhNU0ksIGFuZCBtYWtlCi0JZXJyb3JzIG5pY2VzCi0KLVNhdCBGZWIgMjIgMTI6MjY6MjggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGFwcC5jOiBNUkkgY29tcGF0aWJpbGl0eSAtIGFsbG93IHNpbmdsZSBxdW90ZSB0byBzdGFydCBhIHN0cmluZy4KLQkqIGFzLmM6IGZpeCB0eXBvIHJlY2VudGx5IGludHJvZHVjZWQuCi0JKiBhcy5oIDogRG9uJ3QgaW5jbHVkZSBhb3V0L3JlbG9jLmggLSBpdCdzIG5vdCByaWdodCBmb3IgQ09GRiEKLQkqIGV4cHIuYzogTXVjaCByZXdyaXRpbmcsIHRvIGFjY29tb2RhdGUgTVJJIHN5bnRheCBmb3IKLQlleHByZXNzaW9ucy4gQWxzbyBlYXNpZXIgdG8gcmVhZCBub3cuCi0JKiBsaXN0aW5nLmM6IFB1dCBiYWNrIGRlZnVucwotCSogcmVhZC5jOiBtb2RpZmllZCB0byBhY2NlcHQgTVJJIHN5bnRheCwgcHV0IGJhY2sgbGlzdGluZyBwc2V1ZG8KLQlvcHMgc28gdGhhdCBhbiBhc3NlbWJsZXIgYnVpbHQgd2l0aCBOT19MSVNUSU5HIGlnbm9yZXMgbGlzdCBvcHMKLQlyYXRoZXIgdGhhbiBwdWtlcy4KLQkqIHdyaXRlLmMsIHdyaXRlLmg6IGZpeHMgLSBvbmx5IGtlZXAgYSByZWxvYyB0eXBlIGluIGEgZml4IGlmIHRoZSB0YXJnZXQKLQltYWNoaW5lIGlzIGEgU1BBUkMgb3IgYSAyOUsuCi0JKiBjb25maWcvb2JqLWFvdXQuYzogYWRkZWQgc19zZWN0IHBzZXVkbyBvcAotCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IGxpbnRzLCBzZXQgdGhlIGZpbGVoZHIgZmxhZ3MgcmlnaHQgYW5kCi0JZmlsbCBpbiB0aGUgdGltZXN0YW1wLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmg6IFNpbmNlIHdlIGRvbid0IGluY2x1ZGUgYW91dC9yZWxvYy5oCi0JYW55bW9yZSwgZGVmaW5lIGFsbCB0aGUgcmVsb2NzIHdoaWNoIHRoZSB0Yy08eD4gYml0IHdpbGwgdXNlIHNvIHdlCi0JY2FuIHRyYW5zbGF0ZSBmcm9tIHRoZW0gdG8gdGhlIGNvZmYgdHlwZXMuCi0JKiBjb25maWcvdGMtYTI5ay5jOiByZWxvY190eXBlIGlzbid0IGFuZSBlbnVtIGFueSBtb3JlCi0JKiBjb25maWcvdGMtbTY4ay5jOiBBZGRlZCBOT19SRUxPQyBkZWZpbml0aW9uLgotCi1GcmkgRmViIDIxIDA2OjIxOjA3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHB1dCBoZWFkZXIgZmlsZXMgYmVmb3JlIEMgc291cmNlIGZvciBUQUdTOyByZW1vdmUKLQkgIHJlZmVyZW5jZXMgdG8gbm9uLWV4aXN0ZW50IHN5c2NhbGxzLmguCi0KLQkqIHJlYWQuYywgd3JpdGUuYyBzdWJzZWdzLmM6IGJhY2sgb3V0IHRoZSAuYnNzIGNoYW5nZXMuCi0KLQkqIG9iai1hb3V0LmM6IGRvIG5vdCBpbmNsdWRlIHN0YWIuZ251LmggaWYgTk9fTElTVElORy4KLQotCSogdGMtaTg2MC5jLCBhLm91dC5nbnUuaDogbW92ZSBpODYwIHJlbG9jcyB0byBhIHByb3BlciBwbGFjZS4KLQotCSogYS5vdXQuaDogcmVtb3ZlZC4KLQotRnJpIEZlYiAyMSAwMTowODo0OCAxOTkyICBNaW5oIFRyYW4tTGUgKFRSQU5MRUBJTlRFTExJQ09SUC5DT00pCi0KLQkqIHN5bWJvbHMuYyAobG9jYWxfbGFiZWxfbmFtZSk6IHN5bWJvbHMgbm93IHN0YXJ0IHdpdGggXkEuCi0KLQkqIHJlYWQuYywgc3Vic2Vncy5jLCB3cml0ZS5jIG9iai1jb2ZmLmM6IGFkZGVkIGhhbmRsaW5nIG9mCi0JICBgLmJzc2AgcHNldWRvIG9wIGZvciB1bml0aWFsaXplZCBkYXRhLiBUaGUgbmV3IGdjYyAoMS4zNy45eCkKLQkgIGdlbmVyYXRlIHRoZXNlIHNlY3Rpb25zLiAgLmFsaWduOiB3aWxsIHVzZSBOT1BfT1BDT0RFIG9yIDAKLQkgIGZvciBwYWRkaW5nLiBUaGlzIGlzIGp1c3QgZm9yIGJlaW5nIG5pY2UgdG8gdGhlCi0JICBkaXNhc3NlbWJsZXIuCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IGNoYW5nZWQgdG8gZ2VuZXJhdGUgbG9jYWwgbGFiZWwgIlwwMDFMMCIKLQkgIHN0YXJ0aW5nIHdpdGggYSBeQSBzbyB0aGF0IGl0IGlzIHJlY29nbml6ZWQgYXMgYSBsb2NhbCBsYWJlbC4KLQotCSogYXMuYyAocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogemVybyBic3NfZml4X3Jvb3QsIHRvby4KLQotCSogdGMtaTM4Ni5jOiB0Yy1pMzg2LmM6IGFkZGVkIGhhbmRsaW5nIG9mIHRoZSBmb2xsb3dpbmcgb3Bjb2RlczoKLQkgIGkvbyBvcGNvZGVzIC0gaW5iLCBpbncsIG91dGIgYW5kIG91dHcuICBzdHJpbmcgbWFuaXB1bGF0aW9uIHdpdGgKLQkgIGF0dCBzeW50YXggLSBzY21wLCBzbG9kLCBzbW92LCBzc2NhLCBzc3RvLgotCi0JKiBvYmotY29mZi5jOiAoZm9yIGFpeDM4NikgTW92ZWQgdGhlIHN5bWJvbHMgLnRleHQsIC5kYXRhIGFuZCAuYnNzCi0JICB0byBqdXN0IGFmdGVyIC5maWxlIC4KLQotCSAgSW4gb2JqX2NyYXdsX3N5bWJvbF9jaGFpbigpIHdoZXJlIGl0IHRyaWVzIHRvIHB1dCB0aGUgZXh0ZXJuYWwKLQkgIHN5bWJvbHMgYXBhcnQsIHdpdGggdGhlIGNvbmRpdGlvbjoKLQkgICAgKCFTX0lTX0RFRklORUQoc3ltYm9sUCkgJiYKLQkgICAgICFTX0lTX0RFQlVHKHN5bWJvbFApICYmCi0JICAgICAhU0ZfR0VUX1NUQVRJQ1Moc3ltYm9sUCkpCi0JICBpdCB3YXMgbW92aW5nIHRvbyBtYW55IHN5bWJvbHMgb3V0LiBTbyBJIHN3aXRjaCBpdCBiYWNrIHRvIHRoZQotCSAgY29uZGl0aW9uOgotCSAgICAoU19HRVRfU1RPUkFHRV9DTEFTUyhzeW1ib2xQKSA9PSBDX0VYVCAmJiAhU0ZfR0VUX0ZVTkNUSU9OKHN5bWJvbFApKQotCi0JICBJbiBvYmpfZW1pdF9yZWxvY2F0aW9ucygpIGFkZGVkIHRoZSBjb25kaXRpb25hbCBvbiBLRUVQX1JFTE9DX0lORk8KLQkgIHNvIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZSBGX1JFTEZMRyB3aGljaCBtYWtlIHRoZSBsaW5rZXIgY29tcGxhaW4KLQkgIHRoYXQgc29tZWJvZHkgaGFzIHN0cmlwcGVkIHRoZSByZWxvY2F0aW9uIGluZm8uCi0KLQkgIEFsc28sIHRoZSBBSVggbGQgcHJvZ3JhbSByZXF1aXJlIHRoYXQgdGhlIHJlbG9jYXRpb24gdGFibGUKLQkgIGlzIHNvcnRlZCBieSByX3ZhZGRyIGxpa2UgdGhlIHN0YW5kYXJkIEFUVCBhc3NlbWJsZXIgZG9lcy4KLQotCSAgW2hlIGFsc28gY2hhbmdlZCB0aGUgc2l6ZW9mKHN0cnVjdCAuLi4pJ3MgaW50byB0aGUgY29mZgotCSAgc3R5bGUgRk9PU1ogbWFjcm9zLiAgSSdtIG5vdCBzdXJlIHRoaXMgaXMgcmlnaHQsIGJ1dCBJIGNhbid0Ci0JICByZW1lbWJlciB3aHkuICB4b3hvcmljaC5dCi0KLUZyaSBGZWIgMjEgMDE6MDg6NDggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW4sIGRvYzogdXNlIHRoZSBkb2MuICBCdWlsZCBpdCwgaW5zdGFsbAotCSAgaXQsIGNsZWFuIGl0LCBldGMuCi0KLVR1ZSBGZWIgMTggMDI6MjE6MjUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWQuYzogd2hpdGUgc3BhY2UgYW5kIGNvbW1lbnRzIG9ubHkuCi0KLQkqIGNvbmZpZ3VyZS5pbjogdXNlIHRoZSBuZXcgYXRvZi1uczMyLmMgZm9yIG5zMzJrLgotCi0JKiB3cml0ZS5jOiBjb21tZW50IGNoYW5nZSBvbmx5LgotCi0JKiB0Yy1tODhrLltoY106IHB1bGxlZCBpbiBmcm9tIGhhY2sncyB1bmZpbmlzaGVkIHdvcmsuICBUaGVzZQotCSAgYXJlbid0IHlldCBpbnRlZ3JhdGVkLgotCi0JKiB0Yy1pODYwLltoY106IGJsZXcgb2ZmIHRoZSBkdXN0LiAgU29tZXRoaW5nIG11c3Qgc3RpbGwgYmUgZG9uZQotCSAgYWJvdXQgY29uZmxpY3RpbmcgcmVsb2NhdGlvbiB0eXBlcy4KLQotCSogdGMtbnMzMmsuYzogUmVwbGFjZWQgcHJldmlvdXMgdGNfYW91dF9maXhfdG9fY2hhcnMgc3R1YiB3aXRoIHRoZQotCSAgcmVhbCB0aGluZy4KLQotCSogdGMtaTk2MC5jLCB0Yy1zcGFyYy5jOiB3aGl0ZSBzcGFjZSBhbmQgY29tbWVudHMgb25seS4KLQotCSogdGMtYTI5ay5oOiBkZWxldGUgZHVwbGljYXRlIG1hY3JvIGRlZmluaXRpb24uCi0KLQkqIG5ldyBmaWxlIGF0b2YtbnMzMmsuYyBjb3BpZWQgZnJvbSBoYWNrJ3MgbGFzdCB1bnJlbGVhc2VkIGdhcy4KLQotTW9uIEZlYiAxNyAwNzo1MTowNiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW5zMzJrLmM6IGFjdHVhbGx5IG1ha2UgdGNfYW91dF9maXhfdG9fY2hhcnMgd29yawotCSAgcmF0aGVyIHRoYW4gYWJvcnQuCi0KLQkqIG5lYXJseSBldmVyeXRoaW5nLiAgZmx1c2ggQ2hhbmdlTG9nLCBwYWNrYWdlIGFzIGdhcy0xLjkyLjEuCi0JICBDaGFuZ2VMb2cncyBwcmlvciB0byB0aGlzIGFyZSBza2V0Y2h5IGF0IGJlc3QuICBJIGhhdmUgbG9ncy4KLQkgIFRoZXkganVzdCBhcmVuJ3QgQ2hhbmdlTG9ncy4KZGlmZiAtLWdpdCBhL2dhcy9DaGFuZ2VMb2ctOTY5NyBiL2dhcy9DaGFuZ2VMb2ctOTY5NwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQyYWY4Mi4uMDAwMDAwMAotLS0gYS9nYXMvQ2hhbmdlTG9nLTk2OTcKKysrIC9kZXYvbnVsbApAQCAtMSw1OTYwICswLDAgQEAKLVdlZCBEZWMgMzEgMTI6Mjk6NDcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9yZWxheF90YWJsZSk6IENvcnJlY3QgYnJhbmNoIHJhbmdlcy4KLQotTW9uIERlYyAyMiAxMzowNjowNSAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoaTM4NiotZ28zMi1ydGVtcyopOiBGaXggdG8gYmUgdGhlIHNhbWUgYXMKLQlpWzM0NTZdODYtZ28zMi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIERlYyAyMiAxMjo1NDowNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogVGhlIDQ2NTAgZG9lc24ndCBwZXJtaXQgTV9MREMxX0FCLAotCU1fU0RDMV9BQiwgTV9MX0RPQiwgTV9MX0RBQiwgTV9TX0RBQiwgb3IgTV9TX0RPQi4KLQkobWlwc19pcCk6IEFsd2F5cyBjaGVjayBmb3IgRlBfRCwgbm90IGp1c3QgZm9yIGluc3RydWN0aW9ucyB0aGF0Ci0JYXJlIG5vdCBwYXJ0IG9mIHRoZSByZWd1bGFyIElTQS4KLQotVGh1IERlYyAxOCAxNjo0OToyOCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChidWlsZF9pbnNuKTogTWFrZSBgbnVtYmVyJyBhIGxvbmcgZm9yIDY0LWJpdCBob3N0cy4KLQotVGh1IERlYyAxOCAxNjo0Mjo1NyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoY3B1X3R5cGVzKTogMjExNjRwYy9wY2E1NiBkb2VzIG5vdCBoYXZlIENJWC4KLQotV2VkIERlYyAxNyAyMToyMzowNyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCAzMmJpdCBiaWdudW0pOiBNYXNrIG9mZiBiaXRzIG91dHNpZGUKLQl0aGUgcmFuZ2Ugd2UgY2FyZSBhYm91dC4KLQotV2VkIERlYyAxNyAxNToyOTowMyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfc2hvcnRvcHRzKTogQWRkICduJyBhbmQgJ04nIG9wdGlvbnMuCi0JKGV4ZWNfdHlwZV9lbnVtKTogRW51bWVyYXRpb24gZ2l2aW5nIGFsbCBvZiB0aGUgZXhlYyB0eXBlcy4KLQkod2Fybl9ub3BzKTogTmV3IHN0YXRpYyB2YXJpYWJsZSB0byBnaXZlIG5vcCB3YXJuaW5nIGxldmVsLgotCSh7Y3VyLHByZXZ9X211bDMyX3ApOiBOZXcgc3RhdGljIHZhcmlhYmxlIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlcgotCXRoZSBjdXJyZW50L3ByZXZpb3VzIGluc3RydWN0aW9uIGlzIGEgMzItYml0IG11bHRpcGx5LgotCShPcHRpbWl6aW5nKTogTWFrZSBzdGF0aWMuCi0JKE5PUHsyLF9MRUZULF9SSUdIVH0pOiBNYWNyb3MgZm9yIHdvcmQgb2Ygbm9wcyBhbmQgbGVmdC9yaWdodAotCW5vcHMuCi0JKGQzMHZfaW5zZXJ0X29wZXJhbmQpOiBEZWxldGUgZGVjbGFyYXRpb24gb2YgdW51c2VkIGZ1bmN0aW9uLgotCSh3cml0ZV8yX3Nob3J0KTogTWFrZSBleGVjX3R5cGUgYXJndW1lbnQgZW51bSwgbm90IGludC4KLQkocGFyYWxsZWxfb2spOiBEaXR0by4KLQkoY2hlY2tfcmFuZ2UpOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlKHMpLgotCShidWlsZF9pbnNuKTogRGl0dG8uCi0JKGZpbmRfZm9ybWF0KTogRGl0dG8uCi0JKG1kX2FwcGx5X2ZpeDMpOiBEaXR0by4KLQkobWRfc2hvd191c2FnZSk6IERvY3VtZW50IC1uIGFuZCAtTi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogUGFyc2UgLW4gYW5kIC1OLgotCSh3cml0ZV8xX3Nob3J0KTogSWYgLW4sIHdhcm4gYWJvdXQgYWRkaW5nIGEgbm9wLiAgVXNlCi0JTk9QX3tMRUZULFJJR0hUfS4KLQkod3JpdGVfMl9zaG9ydCk6IFVzZSBlbnVtZXJhdGlvbiB2YWx1ZXMgaW5zdGVhZCBvZiBoYXJkIGNvZGVkCi0JaW50ZWdlcnMuICBSZXNldCBleGVjX3R5cGUgZm9yIGRlZmF1bHQgb3BlcmF0aW9ucy4gIEZvciBleHBsaWNpdAotCXBhcmFsbGVsIG9wZXJhdGlvbnMsIGNhbGwgcGFyYWxsZWxfb2sgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMKLQlvay4gIElmIHdyaXRpbmcgb3V0IGEgcGFyYWxsZWwgb3BlcmF0aW9uLCBhbmQgdGhlIHByZXZpb3VzCi0JaW5zdHJ1Y3Rpb24gd2FzIGEgMzItYml0IG11bHRpcGx5LCBpbmRpY2F0ZSBjdXJyZW50IGluc3RydWN0aW9uCi0JaXMuCi0JKHBhcmFsbGVsX29rKTogQWxsb3cgYWRkL3R4IC4uLiB0byBiZSBkb25lIGluIHBhcmFsbGVsIHdpdGgKLQlhbm90aGVyIGFkZC90eCAuLi4gYXNzdW1pbmcgdGhlIGdwciByZWdpc3RlcnMgZG9uJ3Qgb3ZlcmxhcC4KLQkobWRfYXNzZW1ibGUpOiBVc2UgZXhlYyB0eXBlIGVudW1lcmF0aW9uIHZhbHVlcywgbm90IGhhcmQgY29kZWQKLQlpbnRzLiAgQ2hlY2sgZm9yIGxvYWRzIG9yIDE2LWJpdCBtdWx0aXBsaWVzIGZvbGxvd2luZyBpbiB0aGUgbmV4dAotCWN5Y2xlIGFmdGVyIGEgMzItYml0IG11bHRpcGx5LiAgQWRkIG5vcHMgaWYgdGhhdCBpcyB0aGUgY2FzZS4KLQkoZG9fYXNzZW1ibGUpOiBDb3B5IHByZXZfbXVsMzJfcCB0byBjdXJfbXVsMzJfcCwgYW5kIHNldAotCWN1cl9tdWwzMl9wIGlmIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gaXMgYSAzMi1iaXQgbXVsdGlwbHkuCi0JKGZpbmRfZm9ybWF0KTogQ2hhbmdlIHNwYWNpbmcgYW5kIGxheW91dC4KLQotVHVlIERlYyAxNiAxNjo1NTo0NSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKHRpYzgwX3JlbGF4KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfbG9uZ29wdHMpOiBBZGQgbmV3IE9QVElPTl9SRUxBWCBhbmQgT1BUSU9OX05PX1JFTEFYIG9wdGlvbnMuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSBuZXcgcmVsYXggb3B0aW9ucy4KLQkobWRfc2hvd191c2FnZSk6IERvY3VtZW50IG5ldyByZWxheCBvcHRpb25zLgotCShmaW5kX29wY29kZSk6IERvbid0IHVzZSBzaG9ydCBmb3JtcyBvZiBQQyByZWxhdGl2ZSBicmFuY2hlcyBpZgotCXRpYzgwX3JlbGF4IGlzIHNldC4KLQotVHVlIERlYyAxNiAxNToyNjowMyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBSZW1vdmUgbm9uLXJlZ2lzdGVyIGJpdHMgZnJvbQotCXVzZWQvc2V0IGZsYWcgZmllbGRzLiAgTWFrZSBmbGFnIHZhcnMgdW5zaWduZWQgbG9uZy4gIFVzZQotCUZMQUdfQXswLDF9IGZvciBhY2N1bXVsYXRvcnMuICBBbGxvdyBhbnkgMiBpbnNucyB0byBiZSBkb25lIGluCi0JcGFyYWxsZWwgaWYgdGhleSB1c2UgdGhlIHNhbWUgY29uZGl0aW9uYWwgZmxhZyB3aXRoIHJldmVyc2VkCi0JbWVhbmluZy4gIEFsbG93IDIgYWRkL3N1YiBpbnNucyB0aGF0IHNldCB0aGUgY2Fycnkgb3Igb3ZlcmZsb3cKLQlmbGFncyBidXQgZG8gbm90IHF1ZXJ5IHRoZW0gdG8gYmUgZG9uZSBpbiBwYXJhbGxlbC4gIERvbid0IGFsbG93IDIKLQl3b3JkIHN0b3JlIG9wZXJhdGlvbnMgdG8gYmUgZG9uZSBpbiBwYXJhbGxlbCB3aXRoIEFERHBwcCBvcgotCVNVQnBwcC4gIERvbid0IGFsbG93IGxvYWRzIHRvIGJlIGRvbmUgaW4gcGFyYWxsZWwgd2l0aCAxNiBiaXQKLQltdWx0aXBsaWVzLgotCi1UdWUgRGVjIDE2IDA5OjIwOjQzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYzogUHJldmVudCB1c2Ugb2YgaW50ZXJ3b3JraW5nIHN1cHBvcnQgZm9yCi0Jbm9uLUNPRkYgdGFyZ2V0cy4KLQotTW9uIERlYyAxNSAxNToyMDozMiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYWxsLnRleGk6IEFkZCBNMzJSIGNwdS4KLQotCSogZG9jL2FzLnRleGluZm86IEFkZCBkb2N1bWVudGF0aW9uIG9mIG0zMnIgcHJvY2Vzc29yLgotCi0JKiBkb2MvYy1tMzJyLnRleGk6IE5ldyBmaWxlLCBkb2N1bWVudGluZyBtMzJyIHNwZWNpZmljIGZlYXR1cmVzLiAgCi0KLQotTW9uIERlYyAxNSAxMDozMjoyOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBDb3JyZWN0bHkgaW5zZXJ0ICdQJyBvcGVyYW5kcyBpbnRvCi0JdGhlIGluc3RydWN0aW9uLgotCi1GcmkgRGVjIDEyIDExOjQ0OjIwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAoYnVpbGRfaW5zbik6IEhhbmRsZSBpbnN0cnVjdGlvbnMgdGhhdCBoYXZlCi0JbG9uZyAoMzIgYml0KSBQQyByZWxhdGl2ZSBvZmZzZXRzLiAgRml4IHBsYWNlcyB0aGF0IHByZXZpb3VzbHkKLQltaXN1c2VkIFJfTVBQQ1IgZm9yIDE1IGJpdCBvZmZzZXRzIHRvIHVzZSB0aGUgbmV3IFJfTVBQQ1IxNVcgdHlwZS4KLQkobWRfYXBwbHlfZml4KTogQWRkIGNhc2UgdG8gaGFuZGxlIGxvbmcgUEMgcmVsYXRpdmUgb2Zmc2V0cy4KLQotRnJpIERlYyAxMiAxMDozNTowMSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy1hcm0udGV4aSAoQVJNIE9wdGlvbnMpOiBEb2N1bWVudCBzdXBwb3J0IGZvciBuZXcgQVJNCi0JcHJvY2Vzc29yIG5hbWVzLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciBuZXcgQVJNCi0JcHJvY2Vzc29yIG5hbWVzLgotCi1UaHUgRGVjIDExIDE3OjQ2OjUwIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBEb24ndCBvdmVyd3JpdGUgb3Bjb2RlIHRhYmxlIGRhdGEuCi0JKGluc29wLCBtNjhrX2lwKTogTWFrZSBgb3Bjb2RlJyBjb25zdCBzbyBpdCBkb2Vzbid0IGhhcHBlbiBhZ2Fpbi4KLQotRnJpIERlYyAgNSAxMToyMzo1OSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IEZpeCBCRkRfUkVMT0NfMzIgYWdhaW5zdCBhCi0Jc3ltYm9sICsgb2Zmc2V0LgotCi0JKiBjb25maWcvdGMtdjg1MC5oIChFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IFVzZQotCVNIVF9WODUwX3tTfFR8Wn1DT01NT04gdG8gbWFyayBzcGVjaWFsIGNvbW1vbiBzZWN0aW9ucy4KLQotVHVlIERlYyAgMiAxNzowNToxMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jOiBCcm91Z2h0IHVwIHRvIGRhdGUgd2l0aCB0aGUgYnJhbmNoLgotCi1Nb24gRGVjICAxIDIwOjI0OjE4IDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLXNoLmMgKFNXSVRDSF9UQUJMRV9DT05TKTogSGFuZGxlIChmaXgpLT5meF9zaXplID09IDEuCi0JKFNXSVRDSF9UQUJMRSk6IEhhbmRsZSBCRkRfUkVMT0NfOC4KLQkobWRfYXBwbHlfZml4KTogI2lmbmRlZiBCRkRfQVNTRU1CTEVSIGNvZGU6IEhhbmRsZSBmaXhQLT5meF9zaXplID09IDEuCi0JKGNvZmZfcmVsb2NfbWFwKTogQWRkIEJGRF9SRUxPQ184X1BDUkVMIGVudHJ5LgotCShzaF9jb2ZmX3JlbG9jX21hbmdsZSk6IFNXSVRDSF9UQUJMRSBjYXNlOiBIYW5kbGUgQkZEX1JFTE9DXzguCi0KLVNhdCBOb3YgMjIgMTY6MTk6MjIgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGMtYWxwaGEuYyAocmFuZ2Vfc2lnbmVkXzE2LCByYW5nZV9zaWduZWRfMzIpOiBXb3JrIGFyb3VuZCBhbgotCWFwcGFyZW50IGJ1ZyBpbiBnY2MncyBsb25nIGxvbmcgc3VwcG9ydCBjcm9zc2luZyBmcm9tIHg4Ni4KLQotU2F0IE5vdiAyMiAxNDoyNjowOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmM6IEJyb3VnaHQgdXAgdG8gZGF0ZSB3aXRoIGxhdGVzdCBjaGFuZ2VzIG9uIGFybQotCWJyYW5jaC4gCi0KLVNhdCBOb3YgMjIgMTU6NTA6MDkgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZy1nYXMuY29tOiBHZXQgdmVyc2lvbiBpbmZvIGZyb20gY29uZmlndXJlLmluLgotCi0JKiBtYWtlZmlsZS52bXM6IGluY2x1ZGUgZGVwZW5kLm9iaiBpbiBPQkpTLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoc19hbHBoYV9zZWN0aW9uKTogUmVtb3ZlICIubGNvbW0iIGhhbmRsaW5nLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfYmFzZXJlZ19jbG9iYmVyZWQpOiBSZW1vdmUgdmFyaWFibGUgYW5kCi0JYWxsIGNvcnJlc3BvbmRpbmcgY29kZS4KLQotVGh1IE5vdiAyMCAxNTowNjowOCAxOTk3ICBSaWNoYXJkIEVhcm5zaGF3IDxyZWFybnNoYUBhcm0uY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmggKFRBUkdFVF9GT1JNQVQgZm9yIGdlbmVyaWMgYS5vdXQgdGFyZ2V0cyk6IEFsbG93Ci0JcnVuLXRpbWUgZW5kaWFuIHNlbGVjdGlvbi4KLQotV2VkIE5vdiAxOSAxNzo0NDo0MiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0gICAgICAgICogdGMtc2guYyAocGFyc2VfcmVnKTogUHJvcGVybHkgcXVvdGUgZm9yIGZ2NC4KLQotV2VkIE5vdiAxOSAyMzo0NjoxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBBZGQgbWlzc2luZyBicmVha3MgaW4gY2FzZSBvbgotCXN5bWJvbCB2YWx1ZSBvcGVyYXRvci4KLQotVHVlIE5vdiAxOCAxODo0NToxNCAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChwYXJhbGxlbF9vaywgZmluZF9vcGNvZGUpOiAKLQlTcGxpdCBPUEVSQU5EX0ZMQUcgaW50byBPUEVSQU5EX0ZGTEFHIGFuZCBPUEVSQU5EX0NGTEFHLgotCi1TdW4gTm92IDE2IDEwOjA1OjA3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IENhc3Qgc2Vjb25kIGFyZyBvZgotCW1kX2FwcGx5X2ZpeDMgY2FsbCB0byB0eXBlICJ2YWx1ZVQgKiIuCi0KLVRodSBOb3YgMTMgMTM6NTM6MTAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBNYWtlIEZyZWVCU0QgYW4gYW91dCAvIGkzODZic2QKLSAJdmFyaWFudC4KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0JCi1UaHUgTm92IDEzIDExOjA3OjE0IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCk6IFVzZSB0aGUgbWVtYmVyc2hpcCBmaWVsZAotCWZvciBJTlNOX01BQ1JPJ3MuCi0JKG1pcHNfaXApOiBTYW1lLgotCi1UaHUgTm92IDEzIDAyOjA0OjU1IDE5OTcgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZpbmRfb3Bjb2RlKTogRm9yIE9QQ09ERV9GQUtFLCBhZGQgY2hlY2sgZm9yCi0JZmlyc3QgYXJndW1lbnQgaWYgaXQncyBzdXBwb3NlZCB0byBiZSBhIHJlZ2lzdGVyLgotCi1UdWUgTm92IDExIDE5OjI1OjA1IDE5OTcgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6ICBJZiBkMTB2LCByZS1pbnNlcnQgYSBzcGFjZSBiZWZvcmUKLQlhICcjJyB3aGVuIGluIHN0YXRlIDEwLgotCi1UdWUgTm92IDExIDEzOjMzOjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmM6IEluY2x1ZGUgInN1YnNlZ3MuaCIuCi0JKHRjX3JlbG9jX21hbmdsZSk6IEhhbmRsZSByZWZlcmVuY2VzIHRvIHN5bWJvbHMgd2hpY2ggYXJlIG5vdAotCWJlaW5nIG91dHB1dCwgc28gdGhhdCByZWZlcmVuY2VzIHRvIGAuJyB3b3JrLgotCi1Nb24gTm92IDEwIDEzOjQzOjMzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IENhbGwgYWRkX2ZpeCB3aGVuIG5lZWRlZCBmb3IgJ18nCi0JY2FzZS4KLQotCSogbWFjcm8uYyAoc3ViX2FjdHVhbCk6IElmIHdlIGRvbid0IGZpbmQgYSBwYXJhbWV0ZXIgZm9yIGFuICYsCi0JanVzdCBzdWJzdGl0dXRlICYuCi0KLUZyaSBOb3YgIDcgMjE6Mjk6MzIgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBJbiBkZWZhdWx0IGNhc2UsIGNhbGwgYXNfYmFkCi0JaW5zdGVhZCBvZiBmcHJpbnRmLCB0byBnZXQgImFzc2VtYmxlciBtZXNzYWdlczoiIG1lc3NhZ2Ugb3V0cHV0Ci0JYmVmb3JlIGluc3RlYWQgb2YgYWZ0ZXIuCi0KLUZyaSBOb3YgIDcgMTA6MzY6MjIgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZnJhZ3MuaDogSGFuZGxlIG11bHRpcGxlIGluY2x1c2lvbi4KLQotV2VkIE5vdiAgNSAxMDo1MTo0OSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JQmFzZWQgb24gYSBwYXRjaCBmcm9tIElhbi5EYWxsQGRzdG8uZGVmZW5jZS5nb3YuYXUuCi0JKiBhcy5oIChzdHJ1Y3QgZnJhZywgZnJhZyBzdXBwb3J0KTogTW92ZWQgZnJvbSBoZXJlLgotCSogZnJhZ3MuaDogVG8gaGVyZS4KLQkoc3RydWN0IGZyYWcsIG1lbWJlciB0Y19mcmFnX2RhdGEpOiBOZXcgbWVtYmVyIGlmIFRDX0ZSQUdfVFlQRQotCWlzIGRlZmluZWQuCi0JKHN0cnVjdCBmcmFnLCBtZW1iZXIgZnJfY2dlbik6IFJlbmFtZWQgZnJvbSBmcl90YXJnLmNnZW4uCi0JKiBjZ2VuLmMgKGNnZW5fYXNtX2ZpbmlzaF9pbnNuKTogVXBkYXRlLgotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBVcGRhdGUuCi0JKiBjb25maWcvdGMtbTMyci5oIChUQ19GUkFHX0lOSVQpOiBSZW5hbWVkIGZyb20gbWRfaW5pdF9mcmFnLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1uczMyay5oIChUQ19GUkFHX1RZUEUpOiBEZWZpbmUuCi0JKGZyYWdfb3Bjb2RlX2ZyYWcsZnJhZ19vcGNvZGVfb2Zmc2V0LGZyYWdfYnNyKTogVXBkYXRlLgotCShUQ19GUkFHX0lOSVQpOiBVcGRhdGUuCi0KLVR1ZSBOb3YgIDQgMTY6MzU6NTcgMTk5NyAgSWFuIERhbGwgIDxJYW4uRGFsbEBkc3RvLmRlZmVuY2UuZ292LmF1PgotCi0JKiB3cml0ZS5jIChwcmludF9maXh1cCk6IFVzZSBUQ19GSVhfREFUQV9QUklOVCAoaWYgZGVmaW5lZCkgdG8KLQlwcmludCBvdXQgTUQgZmllbGRzIG9mIGZpeC4KLQkqIGZyYWdzLmMgKGZyYWdfdmFyLCBmcmFnX3ZhcmlhbnQpOiBVc2UgVENfRlJBR19JTklUIG1hY3JvIChpZgotIAlkZWZpbmVkKSB0byBpbml0aWFsaXplIE1EIGZpZWxkcyBpbiBmcmFnLgotCSogYXMuaCAoc3RydWN0IGZyYWcsIG5zMzJrIHN1cHBvcnQpOiBSZW5hbWUgbnMzMmsgdG8gZnJfbnMzMmsuCi0JRGVsZXRlIHBjcmVsX2FkanVzdC4gIEFkZCBmcl9vcGNvZGVfZnJhZ1AsIGZyX29wY29kZV9vZmZzZXQuCi0JKiBjb25maWcvdGMtbnMzMmsuaDogQWRkIGNvbW1lbnRzLiBSZW1vdmUgb2Jzb2xldGUKLSAJQkZEX0ZBU1RfU0VDVElPTl9GSUxMIGRlZmluaXRpb24sIGNoYW5nZSBwcm90b3R5cGVzIGZvcgotIAlmaXhfbmV3X25zMzJrIGFuZCBmaXhfbmV3X25zMzJrX2V4cCB0byBhZGQgbmV3IGFyZ3VtZW50cwotIAlvcGNvZGVfZnJhZyBhbmQgb3Bjb2RlX29mZnNldCBhbmQgcmVtb3ZlIHBjcmVsX2FkanVzdC4KLQkoVENfRklYX1RZUEUpOiBhZGQgb3Bjb2RlX2ZyYWdQIGFuZCBvcGNvZGVfb2Zmc2V0IGZpZWxkcy4KLQkoVENfRklYX0RBVEFfUFJJTlQpOiBuZXcgbWFjcm8gdG8gcHJpbnQgb3V0IFRDX0ZJWF9UWVBFLgotCShUQ19GUkFHX0lOSVQpOiBuZXcgbWFjcm8gdG8gaW5pdGlhbGl6ZSBtYWNoaW5lIGRlcGVuZGVudCBmaWVsZCBpbgotIAlmcmFncy4KLQkoZnJhZ19vcGNvZGVfZnJhZywgZnJhZ19vcGNvZGVfb2Zmc2V0LCBmcmFnX2Jzcik6IG1hY3JvcyB0byBhY2Nlc3MKLSAJTUQgZmllbGRzIGluIGZyYWcgc3RydWN0dXJlLgotCShmaXhfaW1fZGlzcCwgZml4X2JpdF9maXhQLCBmaXhfb3Bjb2RlX2ZyYWcsIGZpeF9vcGNvZGVfb2Zmc2V0LAotIAlmaXhfYnNyKTogbWFjcm9zIHRvIGFjY2VzcyBNRCBmaWVsZHMgaW4gZml4IHN0cnVjdHVyZS4KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBBdm9pZCBvdmVybGVuZ3RoIGxpbmVzLiBBbGlnbiBjb21tZW50cy4gIERvbid0Ci0gCXVzZSBzdHJ1Y3Qgb3Bjb2RlX2xvY2F0aW9uIGFzIHRoZXNlIGZpZWxkcyBhcmUgbm93IGluIHRoZSBmcmFnCi0Jc3RydWN0dXJlLgotCShjb252ZXJ0X2lpZik6IENhbGwgZnJhZ19tb3JlIGFzIGl0IGlzIG5lZWRlZCBpbnN0ZWFkCi0gCW9mIHRyeWluZyB0byBhbGxvY2F0ZSBmb3IgdGhlIHdob2xlIGluc24uIEF2b2lkIGNhbGwgb2YgZnJhZ19tb3JlCi0gCXdpdGggbmVnYXRpdmUgYXJndW1lbnQuCi0JKG1kX3BjcmVsX2FkanVzdCwgbWRfZml4X3BjcmVsX2FkanVzdCwgbWRfYXBwbHlfZml4LAotCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBtZF9wY3JlbF9mcm9tLAotCXRjX2FvdXRfZml4X3RvX2NoYXJzKTogdXNlIGFjY2Vzc29yIG1hY3JvcyB0byBnZXQgbWQgZmllbGRzIGluIGZpeAotIAlhbmQgZnJhZyBzdHJ1Y3R1cmVzLgotCShmaXhfbmV3X25zMzJrLCBmaXhfbmV3X25zMzJrX2V4cCk6IGFkZCBuZXcgYXJndW1lbnRzIG9wY29kZV9mcmFnIGFuZAotCW9wY29kZV9vZmZzZXQgYW5kIHJlbW92ZSBwY3JlbF9hZGp1c3QuCi0JKGNvbnZlcnRfaWlmLCBjb25zX2ZpeF9uZXdfbnMzMmspOiBjYWxsIGZpeF9uZXdfbnMzMmssCi0gCWZpeF9uZXdfbnMzMmtfZXhwIHdpdGggY2hhbmdlZCBhcmd1bWVudHMuCi0KLU1vbiBOb3YgIDMgMTM6MzA6MTcgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIHRjLW1pcHMuYyAobWRfYmVnaW4pOiBSZW9yZ2FuaXplIHNldHRpbmcgb2YgZGVmYXVsdCB2YWx1ZXMgc28KLQl0aGF0IG1pcHNfY3B1IGRlcGVuZHMgb24gVEFSR0VUX0NQVSwgYW5kIG1pcHNfb3B0cy5pc2EgZGVwZW5kcyBvbgotCW1pcHNfY3B1LgotCShtZF9wYXJzZV9vcHRpb24pOiBSZW1vdmUgYWxsIGNvZGUgdGhhdCBzZXRzIGRlZmF1bHRzOyBtZF9iZWdpbgotCWhhbmRsZXMgYWxsIG9mIHRoaXMgbm93LgotCi1TdW4gTm92ICAyIDE0OjQ2OjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKFNUQUdFU1RVRkYpOiBDaGFuZ2UgYmluX1BST0dSQU1TIHRvCi0Jbm9pbnN0X1BST0dSQU1TLgotCShib290c3RyYXAsIGJvb3RzdHJhcDIsIGJvb3RzdHJhcDMpOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCByZWxvY3MgaW4gdGhlCi0JVE9DIHNlY3Rpb24gdG8gYmUgYWdhaW5zdCB0aGUgY3NlY3QuCi0KLUZyaSBPY3QgMzEgMTg6MTk6NTUgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHZhbGlkYXRlX21pcHNfaW5zbik6IE5ldyBmdW5jdGlvbiwgY2hlY2tzCi0JbWF0Y2ggdmVyc3VzIG1hc2sgYml0cywgYW5kIGFsc28gdmVyaWZpZXMgdGhhdCBhbGwgYml0cyB0byBiZQotCW91dHB1dCBhcmUgYWN0dWFsbHkgc3BlY2lmaWVkIHNvbWV3aGVyZS4KLQkobWRfYmVnaW4pOiBDYWxsIGl0IGZvciAzMi1iaXQgaW5zdHJ1Y3Rpb25zLCBpbnN0ZWFkIG9mIGRvaW5nCi0JbWF0Y2gvbWFzayBjaGVjayBoZXJlLiAgSW4gY2FzZSBvZiBmYWlsdXJlLCBwcmludCBhIG1lc3NhZ2UsIGJ1dAotCWNoZWNrIHRoZSByZXN0IG9mIHRoZSBvcGNvZGUgdGFibGUgYmVmb3JlIGV4aXRpbmcuCi0KLVRodSBPY3QgMzAgMTM6NDY6MjAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogRml4IHRodW1iIEFEUiBwc2V1ZG8gb3AuICBQYXRjaAotCWZyb20gVG9ueSBUaG9tcHNvbiBhdCBBUk06IGF0aG9tcHNvQGFybS5jb20KLQotVGh1IE9jdCAzMCAxMToxMToyNiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoYnVpbGRfaW5zbik6IEFsbG93IG9kZCByZWdpc3RlcnMgZm9yIGxkMncgYW5kCi0JZnJpZW5kcy4KLQotRnJpIE9jdCAyNCAxNTo1Njo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXNzZW1ibGUpOiBXaGVuIGhhbmRsaW5nIEBsLCBhbHdheXMgc2lnbgotCWV4dGVuZCBpZiB0aGUgb3BlcmFuZCBleHBlY3RzIGEgc2lnbmVkIHZhbHVlLgotCi0JKiBjb25maWcvdGMtbWlwcy5oIChMT0NBTF9MQUJFTFNfRE9MTEFSKTogRG9uJ3QgZGVmaW5lOyB1c2UKLQlkZWZhdWx0IHdoaWNoIGlzIHRvIHBlcm1pdCBkb2xsYXIgbGFiZWxzLgotCi1GcmkgT2N0IDI0IDExOjE5OjIyIDE5OTcgIEpha3ViIEplbGluZWsgIDxqakBzdW5zaXRlLm1mZi5jdW5pLmN6PgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfbWVtb3J5X21vZGVsKTogTmV3IHZhcmlhYmxlLgotCShtZF9sb25nb3B0cyk6IEFkZCAtVFNPLy1QU08vLVJNTyBvcHRpb25zLgotCShtZF9wYXJzZV9vcHRpb25zKTogSGFuZGxlIHRoZW0uCi0JKHNwYXJjX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogRm9yIDY0IEVMRiwgc2V0IHJlcXVpcmVkCi0JbWVtb3J5IG9yZGVyaW5nIGluIGVfZmxhZ3MuIERlZmF1bHQgdG8gUk1PIGFuZCBsZXQgdGhlIHVzZXIKLQlvdmVycmlkZSBpdCB0aHJvdWdoIGNvbW1hbmQgbGluZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKGVsZl90Y19maW5hbF9wcm9jZXNzaW5nKTogQWRkLgotCi1XZWQgT2N0IDIyIDE3OjQyOjEyIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh2OWFfYXNyX3RhYmxlKTogTmV3IHZhcmlhYmxlLgotCShzcGFyY19pcCk6IEhhbmRsZSB2OWEgYXNyJ3MuCi0JUGF0Y2ggZnJvbSBEYXZpZCBNaWxsZXIgPGRhdmVtQHZnZXIucnV0Z2Vycy5lZHU+LgotCi1XZWQgT2N0IDIyIDE3OjIyOjU5IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChtZF9kb19hbGlnbik6IE5ldyBtYWNyby4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19oYW5kbGVfYWxpZ24pOiBIYW5kbGUgcnNfYWxpZ25fY29kZS4KLQlQYXRjaCBmcm9tIEpha3ViIEplbGluZWsgPGpqQHN1bnNpdGUubWZmLmN1bmkuY3o+LgotCi1XZWQgT2N0IDIyIDEyOjUxOjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKHNoX3NtYWxsKTogTmV3IHZhcmlhYmxlLgotCShPUFRJT05fU01BTEwpOiBEZWZpbmUuCi0JKG1kX2xvbmdvcHRzKTogQWRkICJzbWFsbCIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSBPUFRJT05fU01BTEwuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC1zbWFsbC4KLQkqIGNvbmZpZy90Yy1zaC5oIChzaF9zbWFsbCk6IERlY2xhcmUuCi0JKFNVQl9TRUdNRU5UX0FMSUdOKTogSGFuZGxlIHNoX3NtYWxsLgotCSogY29uZmlnL29iai1jb2ZmLmggKFRBUkdFVF9GT1JNQVQpOiBDaGVjayBzaF9zbWFsbCBpbiBUQ19TSAotCWNhc2UuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogQ29ycmVjdCBoYW5kbGluZyBvZiBjb25zdGFudCBpbiBNX0xJX0QKLQljYXNlIGluIGxpdHRsZSBlbmRpYW4gbW9kZS4KLQotVHVlIE9jdCAyMSAxMDoyMDoxMSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4MywgY2FzZXMgLi4uX0g0NCwgLi4uX0hJWDIyKTogTGVhdmUKLQlvdmVyZmxvdyBzaWduYWxsaW5nIHRvIGxpbmtlci4KLQotTW9uIE9jdCAyMCAxNDo1NDowNiAxOTk3ICBLbGF1cyBLImFtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBGaXggZm9yIGRlYyBjLgotCi0JKiBjb25maWctZ2FzLmNvbTogR2l2ZSBleHBsYW5hdGlvbiBmb3IgZGVjIGMgc2V0dXAgaW4gZXJyb3IKLQltZXNzYWdlLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoc19hbHBoYV9jb21tKTogTWFrZSAuY29tbSBzeW1ib2xzIHNlcGFyYXRlCi0Jc2VjdGlvbnMgb24gb3BlbnZtcy9hbHBoYS4KLQotCSogY29uZmlnL29iai1ldmF4LmM6IHN1cHBvcnQgLndlYWsgcHNldWRvLW9wCi0KLU1vbiBPY3QgMjAgMTA6MTM6MzIgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGRlZmF1bHRfYXJjaF9zaXplKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkoc3RydWN0IHNwYXJjX2FyY2gpOiBSZW5hbWUgYXJjaF9zaXplIHRvIGRlZmF1bHRfYXJjaF9zaXplLgotCU5ldyBtZW1iZXIgdXNlcl9vcHRpb25fcC4KLQkoc3BhcmNfYXJjaF90YWJsZSk6IEFsd2F5cyBpbmNsdWRlIHY5LCB2OWEuICBOZXcgZW50cnkgdjktNjQuCi0JKGluaXRfZGVmYXVsdF9hcmNoKTogQ2hlY2sgd2hldGhlciBkZWZhdWx0IGFyY2ggaXMgdmFsaWQuCi0JU2V0IGRlZmF1bHRfYXJjaF9zaXplIGluIGFkZGl0aW9uIHRvIHNwYXJjX2FyY2hfc2l6ZS4KLQkoT1BUSU9OXzMyLE9QVElPTl82NCk6IERlZmluZS4KLQkobWRfbG9uZ29wdHMpOiBOZXcgZW50cmllcyBmb3IgLTMyLCAtNjQuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSB0aGVtLgotCShtZF9zaG93X3VzYWdlKTogUHJpbnQgdGhlbS4gIEVuc3VyZSBpbml0X2RlZmF1bHRfYXJjaCBjYWxsZWQuCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjNjQpOiBTZXQgYXJjaCB0byB2OS02NC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLVN1biBPY3QgMTkgMTM6NTA6NTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChzdWJzZWdzX2ZpbmlzaCk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCXdyaXRlX29iamVjdF9maWxlLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IFNvbWUgY29kZSBtb3ZlcyBpbnRvIHN1YnNlZ3NfZmluaXNoLgotCSogd3JpdGUuYyAoc3Vic2Vnc19maW5pc2gpOiBEZWNsYXJlLgotCSogYXMuYyAobWFpbik6IENhbGwgc3Vic2Vnc19maW5pc2guCi0KLQkqIHJlYWQuYyAoc19pbmNsdWRlKTogQ2hlY2sgZm9yIGVycm9yIHJldHVybiBmcm9tCi0JZGVtYW5kX2NvcHlfc3RyaW5nLgotCi1UdWUgT2N0IDE0IDIwOjUwOjU4IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZ2V0X2xpbmVfc2IpOiBBY2NlcHQgYW55IGVvbCBtYXJrZXIgd2hpbGUgc2Nhbm5pbmcgbWFjcm9zLgotCi1UdWUgT2N0IDE0IDE5OjEyOjQ1IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChESUZGX0VYUFJfT0spOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChESUZGX0VYUFJfT0spOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfYXBwbHlfZml4KTogTm90aWNlIGZ4X3BjcmVsIGFuZCBzdWJzdGl0dXRlCi0JdGhlIGNvcnJlY3QgcmVsb2NhdGlvbiB3aGVuIGl0IGV4aXN0cy4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLXBwYy5oOiBDb3JyZWN0IHR5cG8gaW4gY29tbWVudC4KLQkqIGNvbmZpZy90Yy12ODUwLmg6IExpa2V3aXNlLgotCi1GcmkgT2N0IDEwIDE2OjA5OjM1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2spOiBBbGxvdyBwYXJhbGxlbCBpbnN0cnVjdGlvbiBpc3N1ZQotIAl3aGVuIHNlY29uZCBpbnN0cnVjdGlvbiBpcyB3cml0aW5nIHRvIGZpcnN0IGluc3RydWN0aW9ucyBpbnB1dHMuCi0JCi1Nb24gT2N0IDEzIDE1OjI3OjE3IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKFBBR0VfU0laRSk6IERvdWJsZSB0byA4ayBhcyBhIGhhY2sgdG8gYWxsb3cgc29tZSBDKysKLQl0ZW1wbGF0ZWQgcHJvZ3JhbXMgdG8gYnVpbGQgd2l0aCAtZy4KLQotRnJpIE9jdCAxMCAxNzo0ODoyOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9yZWxheF90YWJsZSk6IEFkZCBzdXBwb3J0IGZvciByZWxheGluZwotCXVuY29uZGl0aW9uYWwgYnJhbmNoZXMuICBUaGlzIHBhdGNoIGlzIGNvdXJ0ZXN5IG9mIEppbSBXaWxzb24uIAotCShtZF9jb252ZXJ0X2ZyYWcpOiBGaXggcmVsYXhpbmcgb2YgYnJhbmNoZXMuICBUaGlzIHBhdGNoIGlzCi0JY291cnRlc3kgb2YgSmltIFdpbHNvbi4KLQkobWRfYXNzZW1ibGUpOiBDcmVhdGUgZGlmZmVyZW50IGZpeHVwcyBmb3IgY29uZGl0aW9uYWwgYW5kCi0JdW5jb25kaXRpb25hbCBicmFuY2hlcy4gIFRoaXMgcGF0Y2ggaXMgY291cnRlc3kgb2YgSmltIFdpbHNvbi4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBFc3RpbWF0ZSBzaXplIG9mIHZhcmlhYmxlIHBhcnQgb2YKLQlmaXh1cCBiYXNlZCBvbiB3aGV0aGVyIGl0IGlzIGZvciBhIGNvbmRpdGlvbmFsIG9yIGFuIHVuY29uZGl0aW9uYWwKLQlicmFuY2guICBUaGlzIHBhdGNoIGlzIGNvdXJ0ZXN5IG9mIEppbSBXaWxzb24uCi0JKHY4NTBfc2RhdGEsIHY4NTBfdGRhdGEsIHY4NTBfemRhdGEsIHY4NTBfc2Jzcywgdjg1MF90YnNzLAotCXY4NTBfemJzcywgdjg1MF9yb3NkYXRhLCB2ODUwX3JvemRhdGEsIHY4NTBfYnNzKTogQWRkIGNhbGwgdG8KLQlvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKS4gCi0JKHY4NTBfY29tbSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkIG5ldyBwc2V1ZG8gb3BzIC56Y29tbSwgLnNjb21tIGFuZCAudGNvbW0uCi0JKG1kX2JlZ2luKTogQWRkIGJzcyBmbGFnIHRvIHNlZ19pbmZvIG9mIGJzcyBzZWN0aW9ucy4KLQotCUFkZCBzdXBwb3J0IGZvciAuc2NvbW1vbiwgLnRjb21tb24gYW5kIC56Y29tbW9uIHNlY3Rpb25zLgotCi0JKiBjb25maWcvdGMtdjg1MC5oIChFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IEFkZCAuc2NvbW1vbiwKLQkuemNvbW1vbiwgLnRic3MsIC5jYWxsX3RhYmxlX2RhdGEgYW5kIC5jYWxsX3RhYmxlX3RleHQuCi0KLUZyaSBPY3QgMTAgMTU6MDE6MTQgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzcGFyYyk6IFNldCBERUZBVUxUX0FSQ0ggZnJvbSBjb3JyZWN0IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLUZyaSBPY3QgMTAgMTE6MjI6NDUgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEZpeGVzIHRvIG1ha2Ugc3VyZSB0aGUgQVRfV09SRAotCWV4cHJlc3Npb24gaXMgbm90IGNvbmZ1c2VkIHdpdGggLTEuCi0KLUZyaSBPY3QgMTAgMTE6NTQ6NTAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChwYXJhbGxlbF9vayk6IEZsYWcgU1AgYXMgbW9kaWZpZWQgZm9yIEAtc3AKLSAJb3BlcmFuZCAtIE9QRVJBTkRfQVRNSU5VUy4KLQotRnJpIE9jdCAxMCAwMDo0Nzo0NCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2spOiBOb3RlIHRoYXQgYXV0byBpbmNyZW1lbnQgYW5kCi0JZGVjcmVtZW50IG1vZGlmeSB0aGUgaW5kZXggcmVnaXN0ZXIuCi0KLVRodSBPY3QgIDkgMTU6MTc6NTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBSb2JpbiBLaXJraGFtIDxSb2Jpbi5LaXJraGFtQG1sYi5kbXQuY3Npcm8uYXU+OgotCSogY29uZmlnL3RjLW02OGsuYyAoYXJjaHMpOiBBZGQgNjgzMDYsIDY4MzA3LCA2ODMyMiwgNjgzNTYsIDY4MzM0LAotCTY4MzM2LCA2ODM0MSwgNjgzNDkuCi0JKiBkb2MvYy1tNjhrLnRleGkgKE02OEstT3B0cyk6IEFkZCAtbTY4ZWMwMDAgLW02OGhjMDAwIC1tNjhoYzAwMQotCS1tNjgzMDYsIC1tNjgzMDcsIC1tNjgzMjIsIC1tNjgzNTYsIC1tNjhlYzAyMCwgLW02OGVjMDMwLAotCS1tNjhlYzA0MCwgLW02OGVjMDYwLCAtbTY4MzMwLCAtbTY4MzM0LCAtbTY4MzM2LCAtbTY4MzQxLAotCS1tNjgzNDkuCi0KLQkqIGRvYy9NYWtlZmlsZS5hbSAoQ1BVX0RPQ1MpOiBEZWZpbmUuCi0JKGFzLmluZm8pOiBEZXBlbmQgdXBvbiAkKENQVV9ET0NTKS4KLQkqIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgQU1fUFJPR19JTlNUQUxMOyBpdCdzIGNhbGxlZCBieQotCUFNX0lOSVRfQVVUT01BS0UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBPY3QgIDkgMDE6NDQ6MzYgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogdGMtZDEwdi5oIChUQ19TVEFSVF9MQUJFTCk6IERvbid0IGRlZmluZS4KLQkodGNfZnJvYl9sYWJlbCk6IERlZmluZS4KLQotVGh1IE9jdCAgOSAwMDowNzoyMyAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtZDEwdi5jICh3cml0ZV8yX3Nob3J0KTogRml4IGJ1ZyB0aGF0IHdvdWxkbid0IGFsbG93Ci0JdG8gcGFpciBhIGJyYW5jaCBhbmQgbGluayB3aXRoIGFueXRoaW5nIGJ1dCBhbiBleGUgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBPY3QgIDggMTY6Mjg6NTMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IERpc2FibGUgdGhlIHN5bStjb25zdCAuZ290Ci0Jb3B0aW1pemF0aW9uIHRvIHJlZHVjZSB0aGUgYWxpZ25tZW50IHN1cnByaXNlcyBmb3IgZ2NjLgotCi1XZWQgT2N0ICA4IDE2OjExOjE1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChUQ19TUEFSQyk6IERvbid0IGRlZmluZSBUQVJHRVRfRk9STUFULgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX3RhcmdldF9mb3JtYXQpOiBIYW5kbGUgY29mZiBoZXJlLgotCShzcGFyY19pcCk6IEFkZCAlaGl4LCVsb3guCi0JKG1kX2FwcGx5X2ZpeDMpOiBDYWxsIGFzX2JhZF93aGVyZSwgbm90IGFzX2JhZC4KLQlBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DX1NQQVJDX3tISVgyMixMT1gxMH0uCi0JKHRjX2dlbl9yZWxvYyk6IEFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfU1BBUkNfe0hJWDIyLExPWDEwfS4KLQotV2VkIE9jdCAgOCAxMjozMzozMiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBhbHBoYS0qLSogdG8gYWxwaGEqLSotKjsgY29uZmlnLmd1ZXNzIG5vdwotCXJlY29nbml6ZXMgYWxwaGFldjUgZXRjLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgT2N0ICA4IDAwOjA0OjA1IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IFJlcGxhY2UgdGhlIFRBUkdFVF9DUFUgdmFsdWUKLQlvZiBtaXBzcjM5MDAgd2l0aCBtaXBzdHgzOS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IERvbid0IHByaW50IHRoZSAnb3Bjb2RlIHJlcXVpcmVzIAotCS1taXBzWFggbWVzc2FnZScgaWYgdGhlIGluc24gaXNuJ3QgYW4gSVNBIGluc24uCi0KLVR1ZSBPY3QgIDcgMTI6NDg6MzAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9GT1JNQVQgc3VwcG9ydCk6IE1vdmVkIHRvIHRjLXNwYXJjLmMuCi0JUmVkZWZpbmUgVEFSR0VUX0ZPUk1BVCB0byBjYWxsIHNwYXJjX3RhcmdldF9mb3JtYXQuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoaW5fdW5zaWduZWRfcmFuZ2UpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX2FyY2hfc2l6ZSk6IE1ha2Ugc3RhdGljLgotCShzcGFyY190YXJnZXRfZm9ybWF0KTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19pcCk6IERlbGV0ZSB2YXJpYWJsZSBpbW1lZGlhdGVfbWF4LiAgUmV3cml0ZSAlaGkvZXRjIHJlbG9jCi0JaGFuZGxpbmcuICBBZGQgc3VwcG9ydCBmb3IgJWhoLCVobSwlbG0sJWg0NCwlbTQ0LCVsNDQuCi0JKG91dHB1dF9pbnNuKTogU2V0IGBmeF9ub19vdmVyZmxvdycuCi0JKG1kX2FwcGx5X2ZpeDMpOiBIYW5kbGUgQkZEX1JFTE9DX1NQQVJDX3s3LEg0NCxNNDQsTDQ0fS4KLQkodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0KLU1vbiBPY3QgIDYgMTQ6MDQ6NTAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9zZWN0aW9uKTogUmVtb3ZlLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBFbmhhbmNlIGVycm9yIG1lc3NhZ2UuCi0KLUZyaSBPY3QgIDMgMTU6NDA6MzggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBVbmRlZiBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyBiZWZvcmUKLQlpbmNsdWRpbmcgb2JqLWVsZi5oIGluIE9CSl9NQVlCRV9FTEYgY2FzZS4KLQkobWlwc190YXJnZXRfZm9ybWF0KTogUmV0dXJuIE5VTEwgYWZ0ZXIgYWJvcnQgdG8gYXZvaWQgd2FybmluZy4KLQotCSogZWNvZmYuYyAoZ2VuZXJhdGVfZWNvZmZfc3RhYik6IFJlbW92ZSB1bnVzZWQgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBleHByLmMgKG9wZXJhdG9yKTogQWNjZXB0ID09LiAgRnJvbSBBbmRlcnMgQmxvbWRlbGwKLQk8YW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlPi4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChnZW5fdG9fd29yZHMpOiBXaGVuIGdlbmVyYXRpbmcgYSBkZW5vcm1hbAotCW51bWJlciwgaGFuZGxlIGFuIG92ZXJmbG93IGludG8gdGhlIHNtYWxsZXN0IG5vcm1hbGl6ZWQgbnVtYmVyLgotCi1Nb24gU2VwIDI5IDE1OjI0OjUyIDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogYXMuaCwgaW5wdXQtc2NydWIuYyAobmV3X2xvZ2ljYWxfbGluZSk6IE5ldyByZXR1cm4gdmFsdWUuCi0JKiByZWFkLmMgKHNfYXBwX2ZpbGUpOiBEb24ndCBub3RlIHRoZSBzYW1lIGZpbGUgc2V2ZXJhbCB0aW1lcwotCWluIGEgcm93LgotCi1UaHUgU2VwIDI1IDEzOjA4OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFJlbW92ZSBgIG9wZXJhbmQgc3BlY2lmaWVyLgotCi1XZWQgU2VwIDI0IDE2OjU0OjQwIDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluIChzaCotKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIHNoLSotZWxmKi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIFNlcCAyNCAxMTozMDoyNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBIYW5kbGUgcSBhbmQgdiBvcGVyYW5kIHNwZWNpZmllcnMuCi0KLQkqIGRvYy9jLWkzODYudGV4aSAoaTM4Ni1GbG9hdCk6IFJlbW92ZSBpbmNvcnJlY3QgYXNzZXJ0aW9uIHRoYXQKLQlmbiogaW5zdHJ1Y3Rpb25zIGRvIG5vdCBpbnNlcnQgaW1wbGljaXQgZndhaXQuICBUaGlzIHdhcyBjaGFuZ2VkCi0JSmFuIDI5LCAxOTk2LgotCi0JKiBjb25maWcvbTY4ay1wYXJzZS55ICh5eWxleCk6IFBlcm1pdCBhbiBleHByZXNzaW9uIHRvIGJlIHVzZWQgZm9yCi0JdGhlIHNjYWxlIGZhY3Rvci4KLQotCSogTWFrZWZpbGUuYW0gKEVYVFJBX2FzX25ld19TT1VSQ0VTKTogU2V0IHRvIGNvbmZpZy9tNjhrLXBhcnNlLnksCi0Jbm90IG02OGstcGFyc2UueS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBTZXAgMjMgMTc6NDg6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBDbGVhciBtcmlfc3RhdGUgYXQgZW5kIG9mIC5tcmkKLQlwc2V1ZG8tb3AuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGhpbG9faW50ZXJsb2Nrcyk6IENoYW5nZSBmcm9tIGEgc3RhdGljCi0JdmFyaWFibGUgdG8gYSBtYWNybywgc28gdGhhdCBpdCB2YXJpZXMgd2l0aCB0aGUgdmFyaWFibGVzIHVwb24KLQl3aGljaCBpdCBkZXBlbmRzLgotCShncHJfaW50ZXJsb2NrcywgY29wX2ludGVybG9ja3MpOiBMaWtld2lzZS4KLQkobWRfYmVnaW4pOiBEb24ndCBpbml0aWFsaXplIHRoZW0uCi0KLUZyaSBTZXAgMTkgMTc6MDg6NDEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IFVzZSBzdHJjYXNlY29tcCBpbnN0ZWFkCi0Jb2Ygc3RyY21wIHdoZXJlIGFwcHJvcHJpYXRlLgotCi1UaHUgU2VwIDE4IDE0OjExOjU2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogQ29wZSB3aXRoIGEgemVybyBkYXRhIGFyZWEKLQlyZWxvY2F0aW9uIHdpdGggYSBjb25zdGFudCBvZmZzZXQuCi0JKG1kX2Fzc2VtYmxlKTogUHJvZHVjZSBlcnJvciBtZXNzYWdlIHdoZW4gc3BlY2lhbCBkYXRhIGFyZWEKLQlyZWxvY2F0aW9ucyBhcmUgdXNlZCBvbiBpbnN0cnVjdGlvbnMgd2hpY2ggZG8gbm90IHN1cHBvcnQgdGhlbS4KLQkobWRfYXNzZW1ibGUpOiBSZXNldCBwcm9jZXNzb3IgbWFzayBpZiBkZWZpbmVkIGJ5IGNvbW1hbmQgbGluZQotCXN3aXRjaC4gCi0KLVRodSBTZXAgMTggMTE6MjQ6MDEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmM6IFJlb3JnYW5pemUgZmlsZS4KLQkocGFyc2Vfa2V5d29yZF9hcmcpOiBBbGxvdyBudW1iZXJzIGluIHJlZyBuYW1lcy4KLQkoU1BFQ0lBTF9DQVNFX05PTkUpOiBOZXcgbWFjcm8uCi0JKG1kX2Fzc2VtYmxlKTogVXNlIGl0LgotCShsb29rdXBfYXJjaCxpbml0X2RlZmF1bHRfYXJjaCk6IE5ldyBmdW5jdGlvbnMuCi0JKGRlZmF1bHRfYXJjaCxkZWZhdWx0X2luaXRfcCxzcGFyY19hcmNoX3RhYmxlKTogTmV3IHN0YXRpYyBsb2NhbHMuCi0JKHNwYXJjX2FyY2hfc2l6ZSk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKG1heF9hcmNoaXRlY3R1cmUpOiBJbml0aWFsaXplIGluIGluaXRfZGVmYXVsdF9hcmNoLgotCShtZF9wYXJzZV9vcHRpb25zKTogQ2FsbCBpbml0X2RlZmF1bHRfYXJjaCBpZiBuZWNlc3NhcnkuCi0JUmV3cml0ZSAteGFyY2gvLUEgcHJvY2Vzc2luZy4KLQkobWRfc2hvd191c2FnZSk6IFByaW50IC1BIHZhbHVlcyBmcm9tIHNwYXJjX2FyY2hfdGFibGUuCi0JKG1kX2JlZ2luKTogQ2FsbCBpbml0X2RlZmF1bHRfYXJjaCBpZiBuZWNlc3NhcnkuCi0JKHNwYXJjX21kX2VuZCk6IEhhbmRsZSBib3RoIDMyIGFuZCA2NCBiaXQgZW52aXJvbm1lbnRzLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9GT1JNQVQpOiBMaWtld2lzZS4KLQkqIGFjY29uZmlnLmggKFNQQVJDX1Y5LFNQQVJDX0FSQ0g2NCk6IERlbGV0ZS4KLQkoREVGQVVMVF9BUkNIKTogQWRkLgotCSogY29uZmlnLmluOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlLmluIChzcGFyYyk6IERlZmF1bHQgREVGQVVMVF9BUkNIIGJhc2VkIG9uIHRhcmdldCBjcHUuCi0JKFNQQVJDX1Y5LFNQQVJDX0FSQ0g2NCk6IERlbGV0ZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZy92bXMtY29uZi5oIChTUEFSQ19WOSxTUEFSQ19BUkNINjQpOiBEZWxldGUuCi0KLVdlZCBTZXAgMTcgMTY6NTQ6MjAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9yZWxvY19wcmVmaXgpOiBSZWNvZGVkIHRvIHVzZSBDSEVDS18gKCkKLQltYWNyby4gCi0JKGhhbmRsZV90ZGFvZmYsIGhhbmRsZV96ZGFvZmYsIGhhbmRsZV9zZGFvZmYpOiBOZXcgZnVuY3Rpb25zLgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IENvcnJlY3RlZCB0eXBvLgotCSogY29uZmlnL3RjLXY4NTAuYyBBZGQgbmV3IHNlY3Rpb25zOiBjYWxsX3RhYmxlX2RhdGEgYW5kCi0JY2FsbF90YWJsZV90ZXh0LgotCSh2ODUwX3JlbG9jX3ByZWZpeCk6IEFkZCBzdXBwb3J0IGZvciBjdG9mZigpIHJlbG9jYXRpb24gcHJlZml4LiAKLQkoaGFuZGxlX2N0b2ZmKTogTmV3IEZ1bmN0aW9uLgotCi0JKiBkb2MvYy12ODUwLnRleGkgKFY4NTAgT3Bjb2Rlcyk6IERvY3VtZW50IGNhbGwgdGFibGUgcmVsb2NhdGlvbnMuCi0KLVR1ZSBTZXAgMTYgMTQ6MTg6MjIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9yZWxvY19wcmVmaXgpOiBBZGQgc3VwcG9ydCBmb3IgYSAxNiBiaXQKLQlkaXNwbGFjZW1lbnQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4KLQotTW9uIFNlcCAxNSAyMToyODowOSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGZpeF9uZXdfaHBwYSk6IE1ha2UgZGVjbGFyYXRpb24gbWF0Y2gKLQlkZWZpbml0aW9uLgotCi1Nb24gU2VwIDE1IDE4OjMzOjA2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHByb2Nlc3Nvcl9tYXNrKTogTmV3IHZhcmlhYmxlLgotCShzZXRfbWFjaGluZSwgbWRfcGFyc2Vfb3B0aW9uKTogU2V0IHByb2Nlc3Nvcl9tYXNrLgotCShtZF9hc3NlbWJsZSk6IENoZWNrIHRoYXQgaW5zdHJ1Y3Rpb24gaXMgYXZhaWxhYmxlIHRvIHRhcmdldAotCXByb2Nlc3Nvci4gCi0KLQkqIGNvbmZpZy90Yy12ODUwLmggKFRBUkdFVF9QUk9DRVNTT1IpOiBOZXcgY29uc3RhbnQuCi0KLU1vbiBTZXAgMTUgMTE6Mjg6MDQgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNZXJnZSBpbiB3b3JrIGZyb20gTWFydGluIEh1bnQ6Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGJ1aWxkX2luc24pOiBGb3IgbXZmc3lzIGFuZCBtdnRzeXMsCi0JQ1IgaXMgMCBmb3IgUFNXTCBhbmQgUFNXSC4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZG9fYXNzZW1ibGUpOiBEb24ndCBhY2NlcHQKLQlpbGxlZ2FsIGNvbmRpdGlvbiBjb2RlcyBmb3IgY21wdSBpbnN0cnVjdGlvbi4KLQotCSogY29uZmlnL3RjLWQzMHYuYzogQWRkIHN1cHBvcnQgZm9yIEJGRF9SRUxPQ19EMzBWXzlfUENSRUwKLQl1c2VkIGluIGQqaSBpbnN0cnVjdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGNoZWNrX3NpemUpOiBOZXcgZnVuY3Rpb24uICBDaGVjawotCXJlbG9jYXRpb25zIGZvciBvdmVyZmxvd3MuCi0JKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IEZpeCByZWxvY2F0aW9ucyBiZXR3ZWVuIHNlY3Rpb25zLgotCShtZF9hcHBseV9maXgzKTogVXNlIG5ldyByZWxvY2F0aW9uIHR5cGVzIGZvciAxNSBhbmQgMjEKLQliaXQgcmVsb2NhdGlvbnMgaW4gdGhlIHJpZ2h0IGNvbnRhaW5lci4gTmVlZGVkIGJlY2F1c2UKLQl0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90IGVpZ2h0LWJ5dGUgYWxpZ25lZAotCWJ1dCB0aGUgcmVsb2NhdGlvbnMgbXVzdCBiZS4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXBwbHlfZml4Myk6IENoZWNrIGZvciBvdmVyZmxvdy4KLQkoZmluZF9mb3JtYXQpOiBJZiAiLnMiIG9yICIubCIgYXJlIHVzZWQsIGRvbid0IHRyeQotCXRvIGNvbXB1dGUgYnJhbmNoIHNpemVzLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChkb19hc3NlbWJsZSk6IENoZWNrIGZvciAiLnMiIG9yCi0JIi5sIiBleHRlbnNpb25zIHRvIG9wY29kZSBuYW1lcy4KLQkoZmluZF9mb3JtYXQpOiBHZW5lcmF0ZSB0aGUgY29ycmVjdCBpbnN0cnVjdGlvbnMgd2hlbgotCSIucyIgb3IgIi5sIiBhcmUgdXNlZC4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoYnVpbGRfaW5zbik6IENoZWNrIGZvciBvZGQgcmVnaXN0ZXJzCi0Jb24gaW5zdHJ1Y3Rpb25zIHRoYXQgcmVxdWlyZSBldmVuIHJlZ2lzdGVycy4KLQotCSogY29uZmlnL3RjLWQzMHYuaCAobWRfc3RhcnRfbGluZV9ob29rKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfc3RhcnRfbGluZV9ob29rKTogTmV3IGhvb2suCi0JQ2hlY2tzIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsaW5lIGZvciBhICIuIi4gIElmIGl0Ci0JZmluZHMgb25lLCBhc3N1bWUgYSBwc2V1ZG8tb3AgYW5kIGZsdXNoIGFueSB1bndyaXR0ZW4KLQlpbnN0cnVjdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBGaXggcHJvYmxlbQotCXdpdGggZGV0ZXJtaW5pbmcgd2hlbiBmaXh1cHMgd2VyZSBkb25lLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChidWlsZF9pbnNuKTogRml4IGJ1ZyB3aGVyZSB0aGUgbnVtZXJpYwotCXBhcnQgb2YgYSBzeW1ib2wgKGZvciBleGFtcGxlLCAiZm9vKzgiKSB3YXMgYmVpbmcgd3JpdHRlbgotCWludG8gdGhlIGluc3RydWN0aW9uLgotCShtZF9wc2V1ZG9fdGFibGUpOiBDaGFuZ2UgLndvcmQgdG8gYmUgMzIgYml0cyBhbmQgYWRkCi0JLmh3b3JkIGFzIDE2IGJpdHMuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHBhcmFsbGVsX29rKTogQ2hlY2sgdG8gc2VlIGlmIGZpcnN0Ci0JaW5zdHJ1Y3Rpb24gaXMgYSBqdW1wLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChwYXJhbGxlbF9vayk6IE1ham9yIGNvZGUgcmVvcmdhbml6YXRpb24uCi0KLVdlZCBTZXAgMTAgMTA6MDc6MDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBDb3JyZWN0ZWQgc3BlbGxpbmcgbWlzdGFrZS4KLQkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IEFkZCB2ODUwIGVtdWxhdGlvbi4KLQotVHVlIFNlcCAgOSAxNzoxNDozMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQ1BVX1RZUEVTKTogQWRkIGFyYy4KLQkoVEFSR0VUX0NQVV9DRklMRVMpOiBBZGQgdGMtYXJjLmMuCi0JKFRBUkdFVF9DUFVfSEZJTEVTKTogQWRkIHRjLWFyYy5oLgotCShkZXBlbmRlbmNpZXMpOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBhcmMtKi1lbGYqLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZy90Yy1hcmMuW2NoXTogTmV3IGZpbGVzLgotCi1UdWUgU2VwICA5IDEwOjE5OjM3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLXY4NTAudGV4aSAoVjg1MCBPcGNvZGVzKTogRG9jdW1lbnQgaGkwKCkgcmVsb2MgcHJlZml4LgotCUNvcnJlY3QgZGVzY3JpcHRpb24gb2YgaGkoKSByZWxvYyBwcmVmaXguCi0KLQkqIGRvYy9jLXY4NTAudGV4aSAoVjg1MCBPcGNvZGVzKTogRG9jdW1lbnQgbmV3IHJlbG9jIHByZWZpeC4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfcmVsb2NfcHJlZml4KTogQWRkIGhpbG8oKSByZWxvYyBwcmVmaXguCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IEFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfMzIuCi0KLQkqIGRvYy9jLXY4NTAudGV4aTogRG9jdW1lbnQgbmV3IHBzZXVkbyBvcHMgYW5kIGNvbW1hbmQgbGluZQotCW9wdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHNldF9tYWNoaW5lKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLXY4NTAuYyAoLnY4NTApOiBOZXcgcHNldWRvIG9wLgotCSogY29uZmlnL3RjLXY4NTAuYyAoLnY4NTBlKTogTmV3IHBzZXVkbyBvcC4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKC52ODUwZWEpOiBOZXcgcHNldWRvIG9wLgotCQotCi1Nb24gU2VwICA4IDIzOjA4OjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVN1cHBvcnQgLWFsaCBhbmQgLWFsZCBmb3IgRFdBUkYgMToKLQkqIGxpc3RpbmcuYyAoc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QpOiBBZGQgZGVidWdnaW5nIGZpZWxkLgotCShsaXN0aW5nX25ld2xpbmUpOiBJbml0aWFsaXplIHRoZSBkZWJ1Z2dpbmcgZmllbGQuICBJZiBFTEYsIGlmIHRoZQotCXNlY3Rpb24gc3RhcnRzIHdpdGggLmRlYnVnIG9yIC5saW5lLCBzZXQgdGhlIGRlYnVnZ2luZyBmaWVsZCBpbgotCXRoZSBsaXN0aW5nIHN0cnVjdHVyZS4KLQkoZGVidWdnaW5nX3BzZXVkbyk6IEFkZCBsaXN0IHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4gIElmCi0JdGhlIGRlYnVnZ2luZyBmaWVsZCBpcyBzZXQsIGNvbnNpZGVyIGl0IHRvIGJlIGEgZGVidWdnaW5nIHBzZXVkby4KLQlJZiBFTEYsIHNraXAgYmxhbmsgbGluZXMgYmV0d2VlbiBkZWJ1Z2dpbmcgbGluZXMuCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IElmIEVMRiwgbG9vayBmb3IgbGluZSBudW1iZXJzLgotCShzdHJpbmdlcik6IElmIEVMRiwgbG9vayBmb3IgZmlsZSBuYW1lcy4KLQotTW9uIFNlcCAgOCAxMjozMzo0MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX2luc2VydF9vcGVyYW5kKTogT25seSB0ZXN0IGZvciBvdmVyZmxvdwotCWlmIHRoZXJlIGlzIG5vIGluc2VydCBmdW5jdGlvbi4KLQotCSogY29uZmlnL3RjLXY4NTAuaCAoVEFSR0VUX01BQ0hJTkUpOiBOZXcgY29uc3RhbnQuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfaW5zZXJ0X29wZXJhbmQpOiBBZGQKLQktbXdhcm5fdW5zaWduZWRfb3ZlcmZsb3cuIAotCShtZF9iZWdpbik6IFNldCBCRkQgbWFjaGluZSBudW1iZXIgYmFzZWQgb24gbWFjaGluZSB2YXJpYWJsZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWRkIC1tdjg1MCwgLW12ODUwZSBhbmQgLW12ODUwZWEgb3B0aW9ucy4KLQotTW9uIFNlcCAgOCAxMToyMDo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmg6IERvbid0IGRlY2xhcmUgYWxsb2NhIGlmIGl0IGlzIGEgbWFjcm8uCi0JKiBtYWNyby5jOiBMaWtld2lzZS4KLQotU3VuIFNlcCAgNyAwMDozMDoxOSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLWFscGhhLmMgKG1kX3BhcnNlX29wdGlvbik6IE1vdmUgbVtdIG91dCB0byB0b3AgbGV2ZWwgYW5kCi0gICAgICAgIHJlbmFtZSB0byBjcHVfdHlwZXNbXS4KLSAgICAgICAgKHNfYWxwaGFfYXJjaCk6IE5ldyBmdW5jdGlvbi4KLSAgICAgICAgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiYXJjaCIuCi0KLSAgICAgICAgKiBjb25maWcvdGMtYWxwaGEuYyAobWRfYmVnaW4pOiBNZXJnZSB0aGUgdHdvIGxvb3BzIHRocm91Z2ggdGhlCi0gICAgICAgIG9wY29kZSB0YWJsZS4KLSAgICAgICAgKHNfYWxwaGFfcHJvYyk6IEFkZCBpbml0aWFsIFNLSVBfV0hJVEVTUEFDRS4KLSAgICAgICAgKHNfYWxwaGFfc2V0KTogTGlrZXdpc2UuICBVc2UgZ2V0X3N5bWJvbF9lbmQgaW5zdGVhZCBsb2NhbCB3aGlsZSBsb29wLgotCi1TYXQgU2VwICA2IDE5OjM4OjEyIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiByZWFkLmggKHNfbGNvbW1fYnl0ZXMpOiBBZGQgcHJvdG90eXBlIChmb3IgcmVhbCB0aGlzIHRpbWUpLgotCi1UaHUgU2VwICA0IDEyOjEwOjAxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2Jfc3ltYm9sKTogT25seSBzZXQgQlNGX09CSkVDVCBmb3IKLQlzeW1ib2xzIG9uIElyaXguCi0KLVdlZCBTZXAgIDMgMTE6MjE6MzMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogUmVtb3ZlIEJGRF9SRUxPQ19WODUwXzE2X1BDUkVMLgotCi1UdWUgU2VwICAyIDE4OjMyOjMwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IFBDIHJlbGF0aXZlIGluc3RydWN0aW9ucyBhcmV4Ci0JcmVsYXRpdmUgdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIG5vdCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4KLQkobWRfYXNzZW1ibGUpOiBTaW1pbGFybHkuCi0KLVR1ZSBTZXAgIDIgMTU6NTg6NTIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2Mtdjg1MC50ZXhpOiBFeHBsYW5hdGlvbnMgb2Ygb2Zmc2V0cyBpbiBTREEvWkRBIGFyZWFzCi0JY29ycmVjZXRkLiAKLQotCSogY29uZmlnL3RjLXY4NTAuYzogQWRkIHN1cHBvcnQgZm9yIFNEQS9UREEvWkRBIHNlY3Rpb25zLgotCSh2ODUwX3JlbG9jX3ByZWZpeCk6IER1cGxpY2F0ZSBjb2RlIGVsaW1pbmF0ZWQuICBBZGQgY29kZSB0bwotCXJlY29nbmlzZSBzcGVjaWFsIGluc3RydWN0aW9ucy4KLQkobWRfYXNzZW1ibGUpOiBDYWxjdWxhdGlvbiBvZiB0aGUgc2l6ZSBvZiBhIGZpeHVwcyBjb3JyZWN0ZWQuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmggKEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TKTogQWRkIFNEQS9UREEvWkRBCi0Jc2VjdGlvbnMuIAkKLQotVHVlIFNlcCAgMiAxNTo0MDo1NiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogVXNlIG9wY29kZS0+bmFtZSBpbnN0ZWFkIG9mCi0gCW9wY29kZS0+b3Bjb2RlIGFzIHRoZSBzZW50aW5hbC4gWmVybyBpcyBhIHZhbGlkIG9wY29kZS4KLQotVHVlIEF1ZyAyNiAxNjo1MToxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvIChNYWNoaW5lIERlcGVuZGVuY2llcyk6IEFkZCB2ODUwIHRvIG1lbnUuCi0JKiBkb2MvYy12ODUwLnRleGk6IENoYW5nZSBub2RlIG5hbWUgdG8gbWF0Y2ggb3RoZXIgY2hhcHRlciBub2Rlcy4KLQotVHVlIEF1ZyAyNiAwOTo0NjoyMiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy12ODUwLnRleGkgKFY4NTAgT3Bjb2Rlcyk6IENvcnJlY3QgbmFtZSBmb3IgdGlueSBkYXRhIGFyZWEKLQlwb2ludGVyLiAKLQotVHVlIEF1ZyAyNiAxMjoyMzoyNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCk6IElmIEJGRDY0LCBkb24ndCBtYWtlIGEgYmlnbnVtIGlmIHRoZQotCW51bWJlciB3aWxsIGZpdCBpbiA2NCBiaXRzLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobG9hZF9leHByZXNzaW9uKTogQ2hlY2sgZXhwbGljaXRseSBmb3IgT19iaWcsCi0JcmF0aGVyIHRoYW4gY2FsbGluZyBhYm9ydC4KLQotCSogYXMuaDogRG9uJ3QgZGVmaW5lIGFsbG9jYSBpZiBfX0dOVUNfXy4gIEp1c3QgZGVjbGFyZSBpdC4KLQkqIG1hY3JvLmM6IENvcHkgYWxsb2NhIGhhbmRsaW5nIGZyb20gYXMuaC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9hbGlnbl9jb2RlKTogQ29ycmVjdCAxNiBiaXQgbm9vcHMuICBGcm9tCi0JR2FicmllbCBQYXViZXJ0IDxwYXViZXJ0QGlyYW0uZXM+LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEluIEp1bXBCeXRlIGNhc2UsIHdoZW4gbG9va2luZwotCWZvciBhIFdPUkRfUFJFRklYX09QQ09ERSwgY2hhbmdlIGl0IHRvIEFERFJfUFJFRklYX09QQ09ERSBpZiB0aGlzCi0JaXMgamN4eiBvciBhIGxvb3AgaW5zdHJ1Y3Rpb24uCi0KLU1vbiBBdWcgMjUgMTY6MDQ6MTQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQWRkICdocCcgYXMgYWxpYXMgZm9yCi0JcjIuCi0JKG1kX2JlZ2luKTogU2V0IHVwIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIGFuZCB0eXBlLgotCi1Nb24gQXVnIDI1IDE0OjI1OjQ4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IFN0b3JlIHRoZSB2YWx1ZSBiYWNrIGludG8gdGhlCi0Jc3ltYm9sIGV4cHJlc3Npb24sIHRvIGhhbmRsZSBhZGQgb3Igc3VidHJhY3Qgc2ltcGxpZmljYXRpb24KLQljb3JyZWN0bHkuICBIYW5kbGUgT19zeW1ib2xfcnZhLiAgQWRkIGRlZmF1bHQgY2FzZS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfY2hhbmdlX2NzZWN0KTogVGVtcG9yYXJpbHkgbG93ZXIgdGhlCi0JY2h1bmtzaXplIHdoaWxlIGNyZWF0aW5nIHRoZSBuZXcgc3Vic2VjdGlvbi4KLQkqIGFzLmMgKGNodW5rc2l6ZSk6IEluaXRpYWxpemUgdG8gemVyby4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogQ2hhbmdlIDUwMDAgdG8gY2h1bmtzaXplIHdoZW4KLQljYWxsaW5nIG9ic3RhY2tfYmVnaW4uCi0KLU1vbiBBdWcgMjUgMTE6MjE6NDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBSZXN0b3JlIGlucHV0X2xpbmVfcG9pbnRlciB1cG9uCi0JZXhpdC4gCi0JCi0JKiBjb25maWcvdGMtdjg1MC5jIChwYXJzZV9yZWdpc3Rlcl9saXN0KTogU3VwcG9ydCBjb25zdGFudAotCWV4cHJlc3Npb25zIGFzIHJlZ2lzdGVyIGxpc3RzLgotCi1Nb24gQXVnIDI1IDEwOjE5OjM0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLXY4NTAudGV4aTogQ2hhbmdlIHRoZSBtYWpvciBub2RlIHRvIHY4NTAgTWFjaGluZQotCURlcGVuZGVuY2llcy4gCi0KLUZyaSBBdWcgMjIgMTE6MTY6MTQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IEFkZCBpbmNsdXNpb24gb2YgYy12ODUwLnRleGkKLQotCSogZG9jL2Mtdjg1MC50ZXhpOiBOZXcgZmlsZS4KLQotCSogcmVhZC5jIChpc19lbmRfb2ZfbGluZSk6IE1ha2UgTlVMIGNoYXJhY3RlciBiZSBjb25zaWRlcmVkIHRvIGJlCi0JYSBsaW5lIHRlcm1pbmF0b3IuCi0KLUZyaSBBdWcgMjIgMTA6NDU6MzMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAocGFyc2VfcmVnaXN0ZXJfbGlzdCk6IEFkZCBzdXBwb3J0IGZvciBjdXJseQotCWJyYWNlIHN5bnRheC4KLQkoY2NfbmFtZXMpOiBBZGQgImUiIGFuZCAibmUiIGNvbmRpdGlvbnMuCi0KLVRodSBBdWcgMjEgMTE6MDA6MzYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogU3VwcG9ydCBhIGRvdWJsZSBkYXNoIGFzIHN0YXJ0aW5nIGEKLQljb21tZW50IHRoYXQgZXh0ZW5kcyB0byBlbmQgb2YgbGluZS4KLQotVGh1IEF1ZyAyMSAxMDo1NDoyNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX3NlY3Rpb24sIHY4NTBfYnNzLCB2ODUwX29mZnNldCk6IE5ldwotCWZ1bmN0aW9ucy4KLQkobWRfcHNldWRvX3RhYmxlKTogTmV3IHBzZXVkbyBvcHM6IC5ic3MsIC5vZmZzZXQsIC5zZWN0aW9uCi0KLVRodSBBdWcgMjEgMDA6NTk6NTMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBVcGRhdGUgcmVjb3JkZWQKLQlpbnNuIHdoZW4gY2hhbmdpbmcgdG8gYSBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBBdWcgMjAgMDA6NDU6MjAgMTk5NyAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiB0Yy1zaC5jIChwYXJzZV9yZWcsIGdldF9zcGVjaWZpYywgYnVpbGRfTXl0ZXMpOiBBZGQgU0g0Ci0JZmxvYXRpbmcgcG9pbnQgZXh0ZW5zaW9ucy4KLQkocGFyc2VfcmVnKTogcGFyc2Ugc2dyIGFuZCBkYnIuCi0KLVR1ZSBBdWcgMTkgMTc6MDc6MzQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAoc3lzdGVtX3JlZ2lzdGVyX25hbWUpOiBTdXBwb3J0IG51bWJlcnMgZm9yCi0Jc3lzdGVtIHJlZ2lzdGVyIElEcy4KLQotVHVlIEF1ZyAxOSAwODo1OToxMiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2xjb21tX2ludGVybmFsKTogUmVuYW1lZCBmcm9tIHNfbGNvbW0sIGFkZGVkIGFyZyB0bwotCWZsYWcgd2hlbiBhbGlnbm1lbnQgaXMgaW4gYnl0ZXMgaW5zdGVhZCBvZiBwb3dlciBvZiAyLCBhbmQgY29kZSB0bwotCXVzZSB0aGF0IGZsYWcgdG8gY29udmVydCBhbGlnbm1lbnQgdG8gYnl0ZXMuCi0JKHNfbGNvbW0sIHNfbGNvbW1fYnl0ZXMpOiAgTmV3IGhlbHBlcnMgdGhhdCBjYWxsIHNfbGNvbW1faW50ZXJuYWwuCi0JKiByZWFkLmggKHNfbGNvbW1fYnl0ZXMpOiBBZGQgcHJvdG90eXBlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgQUxJR05NRU5UX0lOX1NfRkxBR1MgaXMKLQlkZWZpbmVkLCB3cml0ZSBhbGlnbm1lbnQgdG8gYWxpZ25tZW50IGJpdHMgaW4gc2VjdGlvbiBoZWFkZXIgc19mbGFncwotCXJhdGhlciB0aGFuIHRoZSBzX2FsaWduIGZpZWxkLgotCSogY29uZmlnL29iai1jb2ZmLmggKEFMSUdOTUVOVF9JTl9TX0ZMQUdTKTogRGVmaW5lIGZvciBUQ19USUM4MC4KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChtZF9wc2V1ZG9fdGFibGUpOiBVc2Ugc19sY29tbV9ieXRlcyBmb3IgYnNzCi0JcHNldWRvLCBpbnN0ZWFkIG9mIHNfbGNvbW0gd2hpY2ggd2FudHMgYSBwb3dlciBvZiB0d28gZm9yIGFsaWdubWVudC4KLQotTW9uIEF1ZyAxOCAyMDo0MjoyMyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBtYWNyby5jIChjaGVja19tYWNybyk6IHVzZSBhbGxvY2EgaW5zdGVhZCBvZiB4bWFsbG9jIHRvIHBsdWcgbGVhay4KLQotTW9uIEF1ZyAxOCAyMDozMzowNiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogQWRkIC1hbS4KLQkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX2luY2x1ZGVfc2IpOiBEb24ndCBhZGQgbGVhZGluZyBcbgotCWlmIHdlJ3ZlIGFscmVhZHkgZ290IG9uZS4KLQkqIGxpc3RpbmcuYyAoc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QpOiBBZGQgbGluZV9jb250ZW50cy4KLQkobGlzdGluZ19uZXdsaW5lKTogUHV0IHVudXNlZCBhcmd1bWVudCB0byB3b3JrOiBpZiBub24tbnVsbCwgc2F2ZSBpdC4uLgotCShsaXN0aW5nX2xpc3RpbmcpOiAuLi4gYW5kIHJlZ3VyZ2l0YXRlIGR1cmluZyBsaXN0aW5nIGluc3RlYWQgb2YgbGluZQotCWZyb20gZmlsZS4KLQkqIGxpc3RpbmcuaCAoTElTVElOR19NQUNFWFApOiBOZXcgZGVmaW5lLgotCShMSVNUSU5HX05FV0xJTkUpOiBBcmd1bWVudCBpcyBOVUxMLgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBJZiBleHBhbmRpbmcgbWFjcm9zLCBicmVhayB1cCBpbnB1dAotCWxpbmVzIGFuZCBwYXNzIHRoZW0gdG8gbGlzdGluZ19uZXdsaW5lLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IC1hYyBhbmQgLWFtLgotCi0JKiBjb25kLmMgKHNfaWZjKTogQWRkIG1pc3NpbmcgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZS4KLQotTW9uIEF1ZyAxOCAxMToyNjozNiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hcHBseV9maXgzKTogQWRkIHN1cHBvcnQgZm9yIG5ldyAxNiBiaXQgUEMKLQlyZWxhdGl2ZSByZWxvYy4KLQotTW9uIEF1ZyAxOCAxMToyNDoyMSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jOiBSZW1vdmUgc3VwcG9ydF92ODUwZSBmbGFnIGFuZCBjb21tYW5kIGxpbmUKLQlvcHRpb24uIAotCQotCSogY29uZmlndXJlLmluIChlbXVsYXRpb25zKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldAotCi0JKiBjb25maWd1cmUgKGVtdWxhdGlvbnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0Ci0KLU1vbiBBdWcgMTggMTE6MjQ6MjEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogUmVtb3ZlIHN1cHBvcnRfdjg1MGVhIGZsYWcgYW5kIGNvbW1hbmQgbGluZQotCW9wdGlvbi4gCi0JCi0JKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldAotCi0JKiBjb25maWd1cmUgKGVtdWxhdGlvbnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldAotCi1GcmkgQXVnIDE1IDE0OjAwOjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGNoZWNrLURFSkFHTlUpOiBEb24ndCBjZCBpbnRvIHRlc3RzdWl0ZSB1bnRpbCBhZnRlcgotCXNldHRpbmcgRVhQRUNUIGFuZCBUQ0xfTElCUkFSWS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBhcy5oIChlbnVtIGRlYnVnX2luZm9fdHlwZSk6IERlZmluZS4KLQkoZGVidWdfdHlwZSk6IERlY2xhcmUuCi0JKiBhcy5jIChkZWJ1Z190eXBlKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkoc2hvd191c2FnZSk6IEFkZCAtLWdzdGFicy4KLQkocGFyc2VfYXJncyk6IEhhbmRsZSAtLWdzdGFicy4KLQkqIHJlYWQuYyAoZ2VuZXJhdGVfYXNtX2xpbmVubyk6IFJlbW92ZS4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogT3V0cHV0IHN0YWJzIGRlYnVnZ2luZyBpZiBhcHByb3ByaWF0ZS4KLQlDaGFuZ2UgY2hlY2tzIG9mIGdlbmVyYXRlX2FzbV9saW5lbm8gdG8gY2hlY2sgZGVidWdfdHlwZS4gIE9ubHkKLQlnZW5lcmF0ZSBFQ09GRiBkZWJ1Z2dpbmcgaWYgRUNPRkZfREVCVUdHSU5HIGlzIGRlZmluZWQuCi0JKiByZWFkLmggKGdlbmVyYXRlX2FzbV9saW5lbm8pOiBEb24ndCBkZWNsYXJlLgotCShzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vKTogRGVjbGFyZS4KLQkqIHN0YWJzLmMgKHN0YWJzX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBOZXcgZnVuY3Rpb24uCi0JKiBlY29mZi5jIChhZGRfZmlsZSk6IFVzZSBkZWJ1Z190eXBlLCBub3QgZ2VuZXJhdGVfYXNtX2xpbmVuby4KLQlEb24ndCB0dXJuIG9mZiBkZWJ1Z2dpbmcuCi0JKGFkZF9maWxlKTogUmVtb3ZlIG9sZCAjaWYgMCBjb2RlLgotCShlY29mZl9uZXdfZmlsZSk6IFNldCBkZWJ1Z190eXBlLCBub3QgZ2VuZXJhdGVfYXNtX2xpbmVuby4KLQkoZWNvZmZfZGlyZWN0aXZlX2VuZCk6IERvbid0IGdlbmVyYXRlIHN0YWJzIGxpbmUgc3ltYm9scy4KLQkoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IERvbid0IGNoZWNrIHN0YWJzX3NlZW4uICBEb24ndCBzZXQKLQlnZW5lcmF0ZV9hc21fbGluZW5vLgotCShsaW5lX2xhYmVsX2NudCk6IFJlbW92ZS4KLQkoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVfc3RhYik6IFJlbW92ZS4KLQkqIGVjb2ZmLmggKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lX3N0YWIpOiBEb24ndCBkZWNsYXJlLgotCSogZG9jL2FzLnRleGluZm8sIGRvYy9hcy4xOiBEb2N1bWVudCAtLWdzdGFicy4KLQotV2VkIEF1ZyAxMyAxODo1ODo1NiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSwgbWRfc2hvd191c2FnZSwgbWRfcGFyc2Vfb3B0aW9uKToKLQlBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIGluc3RydWN0aW9ucy4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUsIG1kX3Nob3dfdXNhZ2UsIG1kX3BhcnNlX29wdGlvbik6Ci0JQWRkIHN1cHBvcnQgZm9yIHY4NTBlIGluc3RydWN0aW9ucy4KLQkKLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogRml4IGVycm9yIHJlY292ZXJ5IHRvIHJlbG9hZAotCXRleHQgb2YgZW50aXJlIG9wY29kZS4gCi0KLVR1ZSBBdWcgMTIgMTA6Mjc6MzQgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZG9jL2ludGVybmFscy50ZXhpOiBEb2N1bWVudCByc19sZWIxMjguCi0KLVR1ZSBBdWcgMTIgMTI6MTc6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogR2l2ZSBhbiBlcnJvciBtZXNzYWdlIGZvciBTSVpFX0JZVEUKLQlpbiBBQlNMIGNhc2UsIHJhdGhlciB0aGFuIGNhbGxpbmcgYWJvcnQuCi0KLU1vbiBBdWcgMTEgMjE6NDg6MDAgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoZW51bSBfcmVsYXhfc3RhdGUpOiBBZGQgcnNfbGViMTI4LgotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIHNsZWIxMjggYW5kIHVsZWIxMjguCi0JKHNpemVvZl8qbGViMTI4LCBvdXRwdXRfKmxlYjEyOCwgZW1pdF9sZWIxMjhfZXhwciwgc19sZWIxMjgpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKiByZWFkLmg6IFVwZGF0ZSBwcm90b3R5cGVzLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IFN0cmVhbWxpbmUgcXVpdGUgYSBiaXQuICBSZXR1cm4KLQl0aGUgc3ltYm9sIHZhbHVlLCBhZGQgYSBzZWNvbmQgRklOQUxJWkUgYXJndW1lbnQgdGhhdCBwcmV2ZW50cyAKLQljaGFuZ2VzIGZyb20gYmVpbmcgY29taXR0ZWQuICBVcGRhdGUgYWxsIGNhbGxlcnMuCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsLCByZWxheF9zZWdtZW50KTogSGFuZGxlIHJzX2xlYjEyOC4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCB0aGUgbmV3IHBzZXVkb3MuCi0KLVN1biBBdWcgMTAgMTQ6NTE6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoTU9TVExZQ0xFQU5GSUxFUyk6IEFkZCBzaXRlLmJhaywgc2l0ZS5leHAsIHN0YWdlLAotCXN0YWdlMSwgYW5kIHN0YWdlMi4KLQkoRElTVENMRUFORklMRVMpOiBEZWZpbmUuCi0JKiBkb2MvTWFrZWZpbGUuYW0gKERJU1RDTEVBTkZJTEVTKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW4sIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIEF1ZyAgNiAwMDozMDozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIGlmIGVuZGlhbiBpcyBzZXQuCi0JRG9uJ3Qgc2V0IHRhcmcgb3IgZ2FzX3RhcmdldC4gIERlZmluZSBTQ09fRUxGIGFuZAotCVRBUkdFVF9TT0xBUklTX0NPTU1FTlQgd2hlbiBhcHByb3ByaWF0ZS4gIERvbid0IHN1YnN0aXR1dGUgZm9yCi0JdGFyZ2V0X2ZyYWcuCi0JKiBNYWtlZmlsZS5hbTogUmVtb3ZlIEB0YXJnZXRfZnJhZ0AuCi0JKElOQ0xVREVTKTogUmVtb3ZlICQoSU5URVJOQUxfQ0ZMQUdTKSwgJChDUk9TUyksICQoSERFRklORVMpLCBhbmQKLQkkKFRERUZJTkVTKS4KLQkoZGVwLWFtKTogTWFyayBhcyBwaG9ueS4KLQkqIGFjY29uZmlnLmg6IEFkZCBUQVJHRVRfQllURVNfQklHX0VORElBTiwgVEFSR0VUX1NPTEFSSVNfQ09NTUVOVCwKLQlhbmQgU0NPX0VMRi4KLQkqIGNvbmZpZy9hcm0tYmlnLm10LCBjb25maWcvYXJtLWxpdC5tdDogUmVtb3ZlLgotCSogY29uZmlnL21pcHMtYmlnLm10LCBjb25maWcvbWlwcy1saXQubXQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9wcGMtYmlnLm10LCBjb25maWcvcHBjLWxpdC5tdDogUmVtb3ZlLgotCSogY29uZmlnL3BwYy1zb2wubXQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9pMzg2Y29mZi5tdCwgY29uZmlnL202OGtjb2ZmLm10OiBSZW1vdmUuCi0JKiBjb25maWcvbTg4a2NvZmYubXQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9zY281Lm10OiBSZW1vdmUuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbiwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIE1ha2VmaWxlLmFtICgkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaCk6IE5ldyB0YXJnZXQsIHRvCi0JZnVydGhlciB0cnkgdG8gY2lyY3VtdmVudCB0aGUgLnkuaCBydWxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBBdWcgIDUgMTI6MzI6MDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBNYWtlZmlsZS5pbi4KLQkqIGFjaW5jbHVkZS5tNDogTmV3IGZpbGUsIGZyb20gb2xkIGFjbG9jYWwubTQuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQU1fSU5JVF9BVVRPTUFLRSBhbmQgQU1fUFJPR19MSUJUT09MLiAgUmVtb3ZlCi0Jc2hhcmVkIGxpYnJhcnkgaGFuZGxpbmc7IG5vdyBoYW5kbGVkIGJ5IGxpYnRvb2wuICBSZXBsYWNlCi0JQUNfQ09ORklHX0hFQURFUiB3aXRoIEFNX0NPTkZJR19IRUFERVIuICBDYWxsIEFDX1BST0dfWUFDQywKLQlBQ19QUk9HX0xFWCwgYW5kIEFDX0RFQ0xfWVlURVhULiAgQ2FsbCBBTV9NQUlOVEFJTkVSX01PREUsCi0JQU1fQ1lHV0lOMzIsIGFuZCBBTV9FWEVFWFQuICBEb24ndCBjYWxsIENZX0NZR1dJTjMyIG9yIENZX0VYRUVYVC4KLQkqIGNvbmZpZy5pbjogTmV3IGZpbGUsIGNyZWF0ZWQgYnkgYXV0b2hlYWRlci4KLQkqIGNvbmYuaW46IFJlbW92ZS4KLQkqIGFjY29uZmlnLmg6IE1lbnRpb24gUEFDS0FHRSwgVkVSU0lPTiwgYW5kIFVTSU5HX0NHRU4uCi0JKiBzdGFtcC1oLmluOiBOZXcgZmlsZS4KLQkqIGFzLmMgKHByaW50X3ZlcnNpb25faWQpOiBDaGFuZ2UgR0FTX1ZFUlNJT04gdG8gVkVSU0lPTi4KLQkocGFyc2VfYXJncyk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai12bXMuYzogKFdyaXRlX1ZNU19NSERfUmVjb3Jkcyk6IExpa2V3aXNlLgotCSogZG9jL01ha2VmaWxlLmFtOiBOZXcgZmlsZSwgYmFzZWQgb24gb2xkIGRvYy9NYWtlZmlsZS5pbi4KLQkqIE1ha2VmaWxlLmluLCBkb2MvTWFrZWZpbGUuaW46IE5vdyBidWlsdCB3aXRoIGF1dG9tYWtlLgotCSogYWNsb2NhbC5tNDogTm93IGJ1aWx0IHdpdGggYWNsb2NhbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZC5jIChzX2Vsc2UpOiBJZiBub3QgbGlzdGluZyBmYWxzZSBjb25kaXRpb25hbHMsIHR1cm4gbGlzdGluZwotCW9mZiBpbiB0aGUgZmFsc2UgYnJhbmNoIG9mIHRoZSBlbHNlLgotCi1Nb24gQXVnICA0IDExOjI4OjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBGaXggaGFuZGxpbmcgb2YgYSBkb3VibGUgbG9hZCBmcm9tIGEKLQlzeW1ib2wgcGx1cyBhbiBvZmZzZXQuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBTZXQgZk1lcmdlIHRvIDAgZm9yIGFuIEZEUiB3aGljaAotCWhhcyBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIHN5bWJvbC4KLQotU3VuIEF1ZyAgMyAyMzoyMzo1OSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotIAotICAgICAgICAqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX3Vjb25zKTogTmV3IGZ1bmN0aW9uLgotICAgICAgICAobWRfcHNldWRvX3RhYmxlKTogQWRkIHVuYWxpZ25lZCBkYXRhIHBzZXVkb3MgZm9yIERXQVJGLgotCi1UaHUgSnVsIDMxIDE1OjEzOjQzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBJZ25vcmUgdGhlIHJlc3Qgb2YgdGhlIGN1cnJlbnQKLQlsaW5lIGlmIHdlIGVuY291bnRlciBhbiBlcnJvci4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBTaWduIGV4dGVuZCBjb25zdGFudHMgdmFsdWUKLQlmb3IgaGkgYW5kIGhpMCBleHByZXNzaW9ucy4KLQkodjg1MF9pbnNlcnRfb3BlcmFuZCk6IEVuYWJsZSByYW5nZSBjaGVja2luZyBmb3IgZ2VuZXJpYyAxNmJpdAotCW9wZXJhbmRzLgotCi1UdWUgSnVsIDI5IDE0OjIwOjQzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBUdXJuIG9uIGZ4X25vX292ZXJmbG93IGZvcgotCUxPMTYsIEhJMTYgYW5kIEhJMTZfUyByZWxvY3MuCi0KLU1vbiBKdWwgMjggMTg6NDE6NDEgMTk5NyAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogVXNlIENZR1dJTiBhbmQgRVhFRVhUIGF1dG9jb25mIG1hY3JvIHRvIGxvb2sgZm9yCi0gICAgICAgIHdpbjMyIGRlcGVuZGVuY2llcy4KLSAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYgMi4xMi4KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogQWRkICQoRVhFRVhUKSB0byBhbGwgZXhlY3V0YWJsZXMuCi0KLUZyaSBKdWwgMjUgMTA6NTQ6NDMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IEltcHJvdmUgd2FybmluZ3MgZm9yIG91dCBvZiByYW5nZQotCXVuY29uZGl0aW9uYWwgYnJhbmNoZXMuCi0JKGhwcGFfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgYW55dGhpbmcgd2l0aCBhIFJSJSBvciBMUiUKLQlmaWVsZCBzZWxlY3Rvci4KLQotVGh1IEp1bCAyNCAxNToyMTo0OSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiB0Yy1zcGFyYy5jIChtZF9iZWdpbik6IENhc3Qgc3BhcmNfb3Bjb2RlcyB0byBQVFIgZm9yIGhhc2hfaW5zZXJ0LgotCi1UaHUgSnVsIDI0IDE3OjUxOjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWFjcm8uYyAoZGVmaW5lX21hY3JvKTogTWFrZSBzdXJlIHRoZSBpbmRleCBpcyBpbiByYW5nZSBiZWZvcmUKLQljaGVja2luZyBmb3IgJygnLgotCi1UaHUgSnVsIDI0IDEyOjEzOjE5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAoYnVpbGRfaW5zbik6IFJlbW92ZSAiZXh0ZW5kZWQiIGFuZCByZXBsYWNlIHdpdGgKLSAJImZ4IiBhbmQgImZ4ZnJhZyIuICBBZGQgImZmcmFnIi4gIENoYW5nZSBjb2RlIHRvIGluaXRpYWxpemUgYW5kIHVzZQotCXRoZSByaWdodCBmL2ZmcmFnIGFuZCBmeC9meGZyYWcgcGFpcnMgc2luY2UgaW5zdHJ1Y3Rpb24gbWF5IGJlIHNwbGl0Ci0gCWFjcm9zcyBmcmFncy4KLQotVHVlIEp1bCAyMiAxODozODo1NiAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIGNvbmZpZy90ZS1nbzMyLmggKFVTRV9BTElHTl9QVFdPKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfcHNldWRvX3RhYmxlKTogSWYgVVNFX0FMSUdOX1BUV08gaXMKLQlkZWZpbmVkLCB1c2Ugc19hbGlnbl9wdHdvIGZvciAuYWxpZ24uCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1tc2Rvc2RqZ3BwKik6IE5ldyB0YXJnZXQuCi0JKGkzODYtKi1nbzMyKik6IFNldCBlbSB0byBnbzMyIGFuZCB0YXJnIHRvIGNvZmZnbzMyLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgSnVsIDIyIDEyOjQxOjQwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChsYXN0X29wY29kZSk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKG1kX2Fzc2VtYmxlKTogRG9uJ3QgaXNzdWUgIkZQIGJyYW5jaCBpbiBkZWxheSBzbG90IiB3YXJuaW5nIGlmCi0JdGhlIGRlbGF5IHNsb3QgaGFzIGJlZW4gYW5udWxsZWQuCi0KLVR1ZSBKdWwgMjIgMTM6MjU6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMik6IENoZWNrIGZvciBQQyByZWxhdGl2ZSByZWxvYwotCWNvZGUgaWYgQkZEX0FTU0VNQkxFUi4KLQotTW9uIEp1bCAyMSAwODo1NzoxNyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHN5c3RlbV9yZWdpc3RlcnMpOiBGaXggb3JkZXJpbmcgb2YgcmVnaXN0ZXJzLgotCi1UdWUgSnVsIDE1IDE2OjI5OjU0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAoYnVpbGRfaW5zbik6IEluaXRpYWxpemUgZXh0ZW5kZWQgd29yZCB0byB6ZXJvCi0Jd2hlbiBpdCB3aWxsIGJlIGZpbGxlZCBpbiBsYXRlciBieSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLgotCi1Nb24gSnVsIDE0IDIzOjEwOjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBSZXN0b3JlIGNoZWNrIG9mIGZtdCBhcmd1bWVudC4KLQkobWlwc19pcCk6IEZpeCBJU0EgY2hlY2tzLgotCi1Nb24gSnVsIDE0IDE5OjMwOjU1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAoYnVpbGRfaW5zbik6IEZpeCBlbmRpYW5uZXNzIHByb2JsZW0gd2l0aAotCU9fYmlnIG9wZXJhbmRzLgotCi1TdW4gSnVsIDEzIDIwOjQzOjQ2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoY2hlY2tfYWJzb2x1dGVfZXhwcik6IENoYW5nZSB3YXJuaW5nIHRvCi0JZXJyb3IuCi0KLUZyaSBKdWwgMTEgMTA6MTg6NDcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCk6IFJlZmluZSBjb2RlIHRvIGNoZWNrIGlmIGFuCi0JaW5zdHJ1Y3Rpb24gaXMgYXZhaWxhYmxlIG9uIGEgcGFydGljdWxhciBjcHUgdmFyaWFudC4KLQkobWlwc19pcCk6IExpa2V3aXNlLgotCi1Nb24gSnVsICA3IDIyOjUzOjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IENoYW5nZSBpZm5kZWYKLQlPQkpfQU9VVCB0byBpZmRlZiBPQkpfRUxGLgotCShtZF9hcHBseV9maXgzKTogV2hlbiBtYW5nbGluZyAzMiBiaXQgUEMgcmVsYXRpdmUgcmVsb2MgZm9yCi0JQkZEX0FTU0VNQkxFUiwgaGFuZGxlIG9uZSBFTEYgY2FzZSBmb3IgQ09GRiBhcyB3ZWxsLCBhbmQgYWRkIGEgUEUKLQljYXNlLgotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENoYW5nZSBzcGVjaWFsIGNhc2UgZm9yIGkzODYtY29mZiB0bwotIAlub3QgYXBwbHkgZm9yIGkzODYtcGUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zKTogT25seSBjb3VudCBmaXh1cHMKLQl3aGljaCB3ZXJlIG5vdCBkb25lLgotCShjb2ZmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiBSZW5hbWUgZnJvbSBjb2ZmX2Zyb2JfZmlsZS4KLQkoY29mZl9mb3JtYXRfb3BzKTogSW5pdGlhbGl6ZSBmcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIGZpZWxkIHJhdGhlcgotCXRoYW4gZnJvYl9maWxlIGZpZWxkLgotCSogY29uZmlnL29iai1jb2ZmLmggKGNvZmZfZnJvYl9maWxlKTogRG9uJ3QgZGVjbGFyZS4KLQkoY29mZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogRGVjbGFyZS4KLQkob2JqX2Zyb2JfZmlsZSk6IERvbid0IGRlZmluZS4KLQkob2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUuaW46IFNldCBiZmRfZ2FzIHRvIHllcyBmb3IgaTM4Ni0qLWN5Z3dpbjMyLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgSnVsICAyIDEyOjA1OjAwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBOZXZlciBzdWJ0cmFjdCBzZWN0aW9uCi0JYWRkcmVzcyBmcm9tIFBDIHJlbGF0aXZlIHJlbG9jIHdoaWNoIHdpbGwgYmUgZnVsbHkgcmVzb2x2ZWQuCi0KLVR1ZSBKdWwgIDEgMTU6MjM6MDcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChwYWdlX3R5cGUpOiBSZW5hbWVkIGZyb20gcGFnZV90IHRvIGF2b2lkIGNvbmZsaWN0Ci0Jd2l0aCBocHV4MTAgaGVhZGVyIGZpbGVzLgotCi1Nb24gSnVuIDMwIDEyOjI3OjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gSmFzb24gTWVycmlsbCA8amFzb25AY3lnbnVzLmNvbT46Ci0JKiByZWFkLmMgKGRvX2FsaWduKTogSWYgQkZEX0FTU0VNQkxFUiwgb25seSB1c2UgTk9QX09QQ09ERSBpZgotCVNFQ19DT0RFIGlzIHNldC4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKG1kX21heWJlX3RleHQpOiBEZWZpbmUuCi0JKG1kX2RvX2FsaWduKTogVXNlIG1kX21heWJlX3RleHQuCi0KLUZyaSBKdW4gMjcgMTk6MTU6MjcgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGNfZml4X2FkanVzdGFibGUpOiBPbmx5IGNoZWNrIGZvciBHT1QgdHlwZQotCXJlbG9jYXRpb25zLCBkb24ndCBjaGVjayBmb3Igc3ltYm9sIGJlaW5nIGV4dGVybmFsLCB3ZWFrLCBldGMuCi0KLU1vbiBKdW4gMTYgMTk6MTI6NTEgMTk5NyAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogY29uZmlnL3RjLXBwYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGxldCB0aGUgYXNzZW1ibGVyCi0JY2FsY3VsYXRlIHJlbG9jYXRpb25zIHRvIGFueSBleHRlcm5hbCBzeW1ib2wsIGJlY2F1c2Ugd2UgbWlnaHQgYmUKLQlsaW5raW5nIGEgc2hhcmVkIG9iamVjdCBhbmQgdGhlIHN5bWJvbCBtaWdodCBiZSBvdmVycmlkZW4gb3IgbW92ZWQKLQkoZm9yIGluc3RhbmNlLCBtb3ZlZCBpbnRvIGEgc3RhdGljIGV4ZWN1dGFibGUncyAuYnNzIHNlY3Rpb24pLgotCShHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpOiBEZWxldGUuIFRoaXMgaXMgYW4gaTM4NiB3aWVyZG5lc3MuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGNfZml4X2FkanVzdGFibGUpOiBHT1QtYmFzZWQgcmVsb2NhdGlvbnMgY2FuJ3QKLQliZSBjYWxjdWxhdGVkIGJ5IHRoZSBhc3NlbWJsZXIuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEhhbmRsZSBAcGx0IG9yIEBsb2NhbCBicmFuY2gKLQl3aG9zZSBkZXN0aW5hdGlvbiBsaWVzIGluIHRoZSBzYW1lIGZpbGUsIGJ5IGlnbm9yaW5nIHRoZSBAcGx0IG9yCi0JQGxvY2FsIGFuZCBhaW1pbmcgdGhlIGJyYW5jaCBhdCBpdHMgZGVzdGluYXRpb24uCi0KLU1vbiBKdW4gMTYgMTM6NTk6MTggMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogc3ltYm9scy5jIChjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzKTogQ29weSBCU0ZfT0JKRUNUIGZsYWcuCi0JKiBjb25maWcvb2JqLWVsZi5oIChPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyk6IENvcHkgc2l6ZQotCWV4cHJlc3Npb24uCi0KLQkqIGNvbmZpZy9vYmotbXVsdGkuaCAoT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMpOiBEZWZpbmUgaW5zdGVhZAotCW9mIG9ial9jb3B5X3N5bWJvbF9hdHRyaWJ1dGVzLgotCi1Nb24gSnVuIDE2IDEyOjQ1OjU2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfaW5zZXJ0X29wZXJhbmQpOiBJbiAzMiBiaXQgbW9kZSwgd2l0aCBhCi0Jc2lnbmVkIG9wZXJhbmQsIHNpZ24gZXh0ZW5kIGEgMzIgYml0IHZhbHVlIHRvIHRoZSBob3N0IHNpemUuCi0KLQkqIE1ha2VmaWxlLmluIChDRkxBR1MpOiBTdWJzaXR1dGUgZnJvbSBjb25maWd1cmUgc2NyaXB0LiAgRnJvbQotCUplZmYgTWFrZXkgPGplZmZAY3RzLmNvbT4uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IFVzZSBhbGxvY2EgcmF0aGVyIHRoYW4gYSBmaXhlZAotCWJ1ZmZlciBzaXplIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBzeW1ib2wuCi0KLQkqIE1ha2VmaWxlLmluIChPQkpTKTogUHV0IEBleHRyYV9vYmplY3RzQCBvbiB0aGUgc2FtZSBsaW5lIGFzCi0JbWFjcm8uby4KLQotVGh1IEp1biAxMiAxMjoxNjoyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSW4gbm9uIEJGRF9BU1NFTUJMRVIgY29kZSwgYXMgd2UKLQlzdGVwIHRocm91Z2ggdGhlIGZyYWdzIGNhbGxpbmcgY3Z0X2ZyYWdfdG9fZmlsbCwgc3dpdGNoIHRvCi0JU0VHX0RBVEEgd2hlbiB3ZSByZWFjaCBkYXRhX2ZyYWdfcm9vdC4KLQotVHVlIEp1biAxMCAxNzowODozNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogQWxsb3cgYW4gZW1wdHkgcmVnaXN0ZXIKLQlsaXN0IGZvciBpbnN0cnVjdGlvbnMgd2hpY2ggdXNlIHJlZ2lzdGVyIGxpc3RzLgotCi1UdWUgSnVuIDEwIDExOjE4OjA5IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IE1ha2UgdGVtcCB1bnNpZ25lZCBsb25nLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGFybV9hZGp1c3Rfc3ltdGFiKTogT25seSBzZXQgc3RvcmFnZSBjbGFzc2VzIGlmCi0JT0JKX0NPRkYuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYzogQWRkIHByb3RvdHlwZXMgZm9yIG1hbnkgc3RhdGljIGZ1bmN0aW9ucy4KLQkoc3RydWN0IGFzbV9vcGNvZGUgKTogQWRkIHByb3RvdHlwZXMgZm9yIHBhcm1zIGZpZWxkLgotCShzdHJ1Y3QgdGh1bWJfb3Bjb2RlICk6IExpa2V3aXNlLgotCShmcF9vcDIpOiBSZW1vdmUgdW51c2VkIGZsYWdzIHBhcmFtZXRlci4KLQkob3V0cHV0X2luc3QpOiBNYWtlIHN0YXRpYy4KLQkoYXJtX2FmdGVyX3Bhc3NfaG9vayk6IFJlbW92ZSB1bnVzZWQgaWdub3JlIHBhcmFtZXRlci4KLQkqIGNvbmZpZy90Yy1hcm0uaCAoYXJtX2FmdGVyX3Bhc3NfaG9vayk6IERlY2xhcmUuCi0JKGFybV9zdGFydF9saW5lX2hvb2spOiBEZWNsYXJlLgotCShhcm1fZnJvYl9sYWJlbCk6IERlY2xhcmUuCi0KLU1vbiBKdW4gIDkgMTI6NTU6NDUgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogZGVwZW5kLmMgKHdyYXBfb3V0cHV0KTogbmV3IHByb3RvdHlwZS4KLQotTW9uIEp1biAgOSAxMjo1Mjo0NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9hcHBseV9maXgpOiBDaGVjayBmb3Igb3ZlcmZsb3cuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBJZiBhLm91dCBhbmQgQkZELCBmb3JjZQotCXNlY3Rpb24gc2l6ZSB0byBiZSBhbGlnbmVkLgotCi1GcmkgSnVuICA2IDE3OjE1OjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmggKG1kX2NvbnNfYWxpZ24pOiBEZWZpbmUuCi0JKHNoX2NvbnNfYWxpZ24pOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLXNoLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAudWF3b3JkIGFuZCAudWFsb25nLgotCShzaF9ub19hbGlnbl9jb25zKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc191YWNvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzaF9jb25zX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotCShzaF9oYW5kbGVfYWxpZ24pOiBXYXJuIGFib3V0IG1pc2FsaWduZWQgZGF0YS4KLQkqIGRvYy9jLXNoLnRleGk6IERvY3VtZW50IC51YXdvcmQgYW5kIC51YWxvbmcuCi0KLVRodSBKdW4gIDUgMTU6Mzg6MTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtYWNyby5jIChtYWNyb19leHBhbmQpOiBJbiBNUkkgbW9kZSwgdHJlYXQgc2luZ2xlIHF1b3RlIGFzIGEKLQlzZXBhcmF0b3IgY2hhcmFjdGVyIHdoZW4gY2hlY2tpbmcgZm9yIGEgcG9zaXRpb25hbCBhcmd1bWVudC4KLQotVHVlIEp1biAgMyAxNjoxNToxMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX3BhcnNlX29wdGlvbik6IE1lcmdlIGluIGNoYW5nZXMgZnJvbQotCWFybVQtOTcwMzI4LWJyYW5jaC4KLQotCSogY29uZmlnL3RjLWFybS5oOiBNZXJnZSBpbiBjaGFuZ2VzIGZyb20gYXJtVC05NzAzMjgtYnJhbmNoLgotCi0JKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBBZGQgVGh1bWIgYXJjaGl0ZWN0dXJlIHN1cHBvcnQgZnJvbQotCWFybVQtOTcwMy0yOC1icmFuY2guCi0KLU1vbiBKdW4gIDIgMTY6MjU6MDcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2FsbC50ZXhpOiBBZGQgZW5hYmxpbmcgb2YgQVJNIGRvY3VtZW50YXRpb24uCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGQgQVJNIGRvY3VtZW50YXRpb24gZnJvbSBhcm1ULTk3MDMyOC1icmFuY2guCi0KLU1vbiBKdW4gIDIgMTE6NTU6MTIgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IEFkZGVkIHIzOTAwIHN1cHBvcnQuCi0KLVRodSBNYXkgMjkgMTI6NTg6MjYgMTk5NyAgQmVuIFBmYWZmICA8cGZhZmZiZW5AcGlsb3QubXN1LmVkdT4KLQotCSogYXMuYzogKHBhcnNlX2FyZ3MpIGAtdCcgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50LgotCi1XZWQgTWF5IDI4IDE1OjQ1OjA3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYmVnaW4pOiBDaGFuZ2UgY2FsbCB0bwotCWNvZmZfYXJtX2JmZF9zZXRfcHJpdmF0ZV9mbGFncygpIHRvIGEgY2FsbCB0bwotCWJmZF9zZXRfcHJpdmF0ZV9mbGFncygpLiAKLQotV2VkIE1heSAyOCAxNjoxNzozNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfZ2VuX3JlbG9jKTogRG9uJ3QgdHJ5IHRvIGNvbnZlcnQgdGhlIHR5cGUKLSAJb2YgYSBCRkRfUkVMT0NfUlZBIHJlbG9jLgotCi1XZWQgTWF5IDI4IDEwOjQ4OjE0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZml4X2FkanVzdGFibGUpOiBSZWplY3QgYWJzb2x1dGUgY2FsbHMvanVtcHMuCi0JKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIGEgcmVsb2NhdGlvbiBmb3IgYW4gYWJzb2x1dGUKLQljYWxsL2p1bXAuCi0KLU1vbiBNYXkgMjYgMTM6MjQ6MjUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbzogRG9uJ3QgdXNlIEB2YWx1ZSBpbiBzZWN0aW9uIG5hbWVzIG9yIGluZGV4Ci0JZW50cmllczsgaXQgY29uZnVzZXMgdGV4aW5mby50ZXguCi0KLUZyaSBNYXkgMjMgMDA6MDk6MzUgMTk5NyAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbzogVXBkYXRlZCBmb3IgLU1EIG9wdGlvbi4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGRlZCBkZXBlbmQuYy4KLQkoT0JKUyk6IEFkZGVkIGRlcGVuZC5vLgotCSogYXMuaCAoc3RhcnRfZGVwZW5kZW5jaWVzLCByZWdpc3Rlcl9kZXBlbmRlbmN5LAotCXByaW50X2RlcGVuZGVuY2llcyk6IE5ldyBkZWNsYXJhdGlvbnMuCi0JKiBkZXBlbmQuYzogTmV3IGZpbGUuCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQWRkZWQgLU1EIG9wdGlvbi4KLQkobWFpbik6IENhbGwgcHJpbnRfZGVwZW5kZW5jaWVzLgotCShzaG93X3VzYWdlKTogQWRkZWQgaGVscCBmb3IgLU1ELgotCSogcmVhZC5jIChzX2FwcF9maWxlKTogQ2FsbCByZWdpc3Rlcl9kZXBlbmRlbmN5LgotCShzX2luY2x1ZGUpOiBDYWxsIHJlZ2lzdGVyX2RlcGVuZGVuY3kgd2hlbiBmaWxlIGlzIGZvdW5kLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBDYWxsIHJlZ2lzdGVyX2RlcGVuZGVuY3kuCi0KLVdlZCBNYXkgMjEgMTc6Mzk6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc3ltYm9sX3RvX2NoYXJzKTogSWYgVEVfUEUsIGRvbid0IGFkZCB0aGUKLQlzZWN0aW9uIGFkZHJlc3MgdG8gdGhlIHN5bWJvbCB2YWx1ZS4KLQotVHVlIE1heSAyMCAxMToyMzozMSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQsbWlwc19pcCk6IE1vdmUgdGhlIElOU05fSVNBIGZpZWxkCi0JaW50byB0aGUgbmV3IG1lbWJlcnNoaXAgZmllbGQuCi0KLVRodSBNYXkgMTUgMTA6MDA6NTMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9iZWdpbik6IElmIG5vIGNwdSB0eXBlIGlzIHNwZWNpZmllZCBvbiB0aGUKLQljb21tYW5kIGxpbmUgdGhlbiB0aGUgQVJNNyBpcyBub3cgY2hvc2VuIGJ5IGRlZmF1bHQgd2hlbiBzZXR0aW5nCi0JdGhlIEJGRCBtYWNoaW5lIGFuZCBhcmNoaXRlY3R1cmUuCi0KLVdlZCBNYXkgMTQgMDk6NTQ6NTMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChnbG9iYWwgdmFyaWFibGVzKTogQWRkZWQgJ3VzZXNfYXBjc18yNicgZmxhZyB0bwotCWhvbGQgQVBDUyBzZWxlY3Rpb24uCi0gIAkobWRfYmVnaW4pOiBBZGRlZCBjb2RlIHRvIGdlbmVyYXRlIGZsYWdzIHRvIGJlIHNldCBpbnRvIHRoZSBDT0ZGCi0JaGVhZGVyIGFuZCB0aGUgY2FsbHMgdG8gdGhlIEJGRCBmdW5jdGlvbnMgdG8gZG8gdGhpcy4KLSAgCShtZF9wYXJzZV9vcHRpb24sIG1kX3Nob3dfdXNhZ2UpOiBBZGRlZCBuZXcgY29tbWFuZCBsaW5lCi0Jb3B0aW9ucyAtbWFwY3MtMzIsIC1tYXBjcy0yNiwgLW1hcm12MiwgLW1hcm12MmEsIC1tYXJtdjMsCi0JLW1hcm12M20sIC1tYXJtdjQsIC1tYXJtdjR0LiAKLQotCSogdGMtYXJtLmggKExPQ0FMX0xBQkVMKTogUmVtb3ZlZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIG1hY3JvCi0JYXMgaXQgaXMgbmV2ZXIgdXNlZC4KLQotVHVlIE1heSAxMyAyMjoyNjoxNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IFByZWZpeCB0ZW1wb3JhcnkKLQlsYWJlbCBuYW1lIHdpdGggIi4iLgotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0KLVR1ZSBNYXkgMTMgMTQ6NDQ6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChzZXRfYXQpOiBDaGVjayBmb3IgYmlnbnVtLgotCShjaGVja19hYnNvbHV0ZV9leHByLCBtYWNybywgbWlwczE2X21hY3JvKTogTGlrZXdpc2UuCi0KLVR1ZSBNYXkgMTMgMTA6NDU6NTYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChtZF9hcHBseV9maXgpOiBDaGVjayBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucwotCWZvciBvdmVyZmxvdy91bmRlcmZsb3csIG9ubHkgaW5zZXJ0IGxvd2VyIDE1IGJpdHMgaW50byBpbnN0cnVjdGlvbi4KLQotTW9uIE1heSAxMiAxMzozMzowOCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChwaSk6IENoZWNrIGZvciBSZWdNTVguCi0KLVRodSBNYXkgIDggMTE6MTA6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKGV4cHIpOiBXaGVuIHN1YnRyYWN0aW5nIHZhbHVlcyBpbiB0aGUgc2FtZSBmcmFnLAotCXN1YnRyYWN0IFhfYWRkX251bWJlciByYXRoZXIgdGhhbiBhZGRpbmcgaXQuCi0KLVdlZCBNYXkgIDcgMTU6Mzk6NDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBKdXN0IHBhc3MgTlVMTCB0bwotIAltZF9kb19hbGlnbiwgbm90IHRoZSBhZGRyZXNzIG9mIGEgY2hhciBob2xkaW5nIE5PUF9PUENPREUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogSGFuZGxlIGNvbnN0YW50cyBmb3IgTV9MSV9EIGFuZAotCU1fTElfREQuCi0JKG1pcHNfaXApOiBGb3IgJ0YnLCAnTCcsICdmJywgYW5kICdsJywgZ2VuZXJhdGUgYSBjb25zdGFudCByYXRoZXIKLQl0aGFuIGFuIGFkZHJlc3MgaWYgdGhlIGZsb2F0aW5nIHBvaW50IHZhbHVlIGxvb2tzIHN1ZmZpY2llbnRseQotCXNpbXBsZS4KLQotVHVlIE1heSAgNiAxMjoxODowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBJZiBhLm91dCBhbmQgQkZELCBmb3JjZQotCXNlY3Rpb24gc2l6ZSB0byBiZSBhbGlnbmVkLgotCi1Nb24gTWF5ICA1IDE3OjE2OjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZC5jOiBJbmNsdWRlICJtYWNyby5oIi4KLQkoc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lKTogQWRkIG1hY3JvX25lc3QgZmllbGQuCi0JKGluaXRpYWxpemVfY2ZyYW1lKTogSW5pdGlhbGl6ZSBtYWNyb19uZXN0LgotCShjb25kX2ZpbmlzaF9jaGVjayk6IEFkZCBuZXN0IHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoY29uZF9leGl0X21hY3JvKTogTmV3IGZ1bmN0aW9uLgotCSogYXMuaCAoY29uZF9maW5pc2hfY2hlY2spOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGNvbmRfZXhpdF9tYWNybyk6IERlY2xhcmUuCi0JKiBpbnB1dC1zY3J1Yi5jIChtYWNyb19uZXN0KTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlcik6IENhbGwgY29uZF9maW5pc2hfY2hlY2suCi0JKiBtYWNyby5oIChtYWNyb19uZXN0KTogRGVjbGFyZS4KLQkqIHJlYWQuYyAoc19tZXhpdCk6IENhbGwgY29uZF9leGl0X21hY3JvLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChSZWdNTVgpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChwaSk6IENoZWNrIGZvciBhbGwgcmVnaXN0ZXIgdHlwZXMuCi0JKHR5cGVfbmFtZXMpOiBBZGQgUmVnTU1YLgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSBSZWdNTVguCi0KLVdlZCBBcHIgMzAgMTI6NDc6MDAgMTk5NyAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19zZWN0aW9uX3N5bWJvbCk6IENsZWFyIHRoZSBMT0NBTCBiaXQgI2lmZGVmCi0JVEVfREVMVEEuCi0KLVR1ZSBBcHIgMjkgMjA6MjM6MTAgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChub3BpY19uZWVkX3JlbGF4KTogQWRkIG5ldyBwYXJhbWV0ZXIKLQliZWZvcmVfcmVsYXhpbmcuICBVc2UgaXQgd2hlbiB0ZXN0aW5nIGVjb2ZmX2V4dGVybl9zaXplLgotCShsb2FkX2FkZHJlc3MsIG1hY3JvLCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IEZpeCBhbGwKLQljYWxsZXJzLgotCi1UdWUgQXByIDI5IDE5OjU0OjM2IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfcHNldWRvX3RhYmxlKTogQWRkICJzdWJzZWN0aW9uIi4KLSAJKG9ial9lbGZfc3Vic2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLVR1ZSBBcHIgMjkgMTk6NTI6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9oZWFkZXJfYXBwZW5kKTogRG9uJ3QgcmVzZXQgc3RyaW5nX3NpemUKLQllYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcC4KLQotRnJpIEFwciAyNSAxNDoxNzo0NiAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogQWRkIGl0YmwtcGFyc2UuaC4KLQotRnJpIEFwciAyNSAxMjowMzoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoUG9ydGluZyBHQVMpOiBDb3JyZWN0IGRvY3VtZW50YXRpb24gZm9yCi0JY3VycmVudCBjb25maWd1cmUgaGFuZGxpbmcgb2YgdGFyZy1jcHUuaCwgZXQuIGFsLgotCShDUFUgYmFja2VuZCk6IERvY3VtZW50IGxpc3RpbmcgbWFjcm9zLgotCi0JKiBsaXN0aW5nLmMgKGRhdGFfYnVmZmVyKTogU2V0IHNpemUgYmFzZWQgb24gb3RoZXIgbGlzdGluZyBtYWNyb3MsCi0JcmF0aGVyIHRoYW4gYWx3YXlzIHVzaW5nIDEwMC4KLQkoZGF0YV9idWZmZXJfc2l6ZSk6IFJlbW92ZSBzdGF0aWMgdmFyaWFibGUuCi0JKGNhbGNfaGV4KTogTWFrZSBkYXRhX2J1ZmZlcl9zaXplIGEgbG9jYWwgdmFyaWFibGUuICBEb24ndCBsZWF2ZQotCWFueSBzbG9wIHdoZW4gZmlsbGluZyBkYXRhX2J1ZmZlci4KLQotTW9uIEFwciAyMSAxNTozMzoxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLW1pcHMudGV4aTogRG9jdW1lbnQgLnNldCBhdXRvZXh0ZW5kLgotCi1TYXQgQXByIDE5IDIzOjA5OjI1IDE5OTcgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAcGV0cmEuYXBwbGkuc2U+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLW9wZW5ic2QqLCBtNjhrLSotb3BlbmJzZCosCi0JbWlwcy1kZWMtb3BlbmJzZCosIHBwYy0qLSpic2QqLCBuczMyay1wYzUzMi1vcGVuYnNkKiwKLQlzcGFyYy0qLW9wZW5ic2QqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVNhdCBBcHIgMTkgMjI6NTI6MDMgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9zeW1ib2wpOiBJZiBUQ19NSVBTLCBzZXQgQlNGX09CSkVDVAotCWZvciBhbGwgdW5kZWZpbmVkIHN5bWJvbHMuCi0KLUZyaSBBcHIgMTggMTM6Mzc6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19maXhfYWRqdXN0YWJsZSk6IEhhbmRsZSB6ZXJvIGxlbmd0aCBjc2VjdHMKLQljb3JyZWN0bHkuCi0KLUZyaSBBcHIgMTggMTE6NTE6MzUgMTk5NyAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BhcHBsaS5zZT4KLQotCSogY29uZmlndXJlLmluIChhbHBoYSotKi1vcGVuYnNkKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBBcHIgMTcgMTM6NTk6NDcgMTk5NyAgUGVyIEZvZ2Vsc3Ryb20gIDxwZWZvQG9wZW5ic2Qub3JnPgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1vcGVuYnNkKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBBcHIgMTYgMTI6MzE6MjQgMTk5NyAgTWFydGluIEh1bnQgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBGaXggcGFyYWxsZWwgY2hlY2tpbmcKLQlmb3IgaW5zdHJ1Y3Rpb25zIHVzaW5nIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbi4KLQotVHVlIEFwciAxNSAxODoxMTo0NCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoaW5zbl91c2VzX3JlZyk6IENvcnJlY3QgdGVzdCBmb3IgZnByIHBhaXJzLgotCi1UdWUgQXByIDE1IDEzOjA0OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHNyY3Jvb3QpOiBSZW1vdmUuCi0gCShJTlNUQUxMKTogU2V0IHRvIEBJTlNUQUxMQC4KLQkoSU5TVEFMTF9YRk9STSwgSU5TVEFMTF9YRk9STTEpOiBSZW1vdmUuCi0JKGFsbCwgZHZpKTogRG9uJ3Qgc2V0IHNyY3Jvb3QuCi0JKGluc3RhbGwpOiBEZXBlbmQgdXBvbiBhcy5uZXcsIGdhc3AubmV3LCBhbmQgaW5zdGFsbGRpcnMuICBVc2UKLQkkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpIGRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZwotCSQoSU5TVEFMTF9YRk9STSkgYW5kICQoSU5TVEFMTF9YRk9STTEpLgotCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCi0JKiBkb2MvTWFrZWZpbGUuaW4gKElOU1RBTExfWEZPUk0xKTogUmVtb3ZlLgotCShpbnN0YWxsKTogRGVwZW5kIHVwb24gaW5zdGFsbGRpcnMuICBVc2UgJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQotCWRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZyAkKElOU1RBTExfWEZPUk0pIGFuZAotCSQoSU5TVEFMTF9YRk9STTEpLgotCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCi0JKGluc3RhbGwtaW5mby1hcyk6IFJ1biBta2luc3RhbGxkaXJzLgotCShpbnN0YWxsLWluZm8tZ2FzcCk6IExpa2V3aXNlLgotCi1Nb24gQXByIDE0IDExOjU5OjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBDaGFuZ2UgaW5zdGFsbC5zaCB0byBpbnN0YWxsLXNoLgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogQ2hlY2sgZm9yIGRpdmlzaW9uIGJ5IHplcm8uCi0KLQlGcm9tIFRob21hcyBHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT46Ci0JKiBNYWtlZmlsZS5pbjogQWx3YXlzIHVzZSAkKFNIRUxMKSB3aGVuIHJ1bm5pbmcgbW92ZS1pZi1jaGFuZ2UuCi0JKiBjb25maWd1cmUuaW46IFVzZSAke0NPTkZJR19TSEVMTH0gd2hlbiBydW5uaW5nICRhY19jb25maWdfc3ViLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgQXByIDEwIDE0OjQwOjAwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYyAoY2dlbl9wYXJzZV9vcGVyYW5kKTogUmVuYW1lZCBmcm9tIGNnZW5fYXNtX3BhcnNlX29wZXJhbmQuCi0JTmV3IGFyZ3VtZW50IGB3YW50Jy4gIFVwZGF0ZSBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgdmFsdWVzLgotCUluaXRpYWxpemUgaWYgQ0dFTl9QQVJTRV9PUEVSQU5EX0lOSVQuCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9iZWdpbik6IFNldCBjZ2VuX3BhcnNlX29wZXJhbmRfZm4uCi0JKG1kX2Fzc2VtYmxlKTogQ2FsbCBjZ2VuX2FzbV9pbml0X3BhcnNlLgotCVVwZGF0ZSBjYWxsIHRvIG0zMnJfY2dlbl9hc3NlbWJsZV9pbnNuLCBjYWxsIGFzX2JhZCBpZiBhc3NlbWJseSBmYWlsZWQuCi0KLVdlZCBBcHIgIDkgMTE6NDk6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSGFuZGxlICNqLgotCi1UdWUgQXByICA4IDE2OjM3OjU3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfY29udmVydF9mcmFnKTogQ3JlYXRlIGZpeHVwIGF0IHRoZQotCXJpZ2h0IGFkZHJlc3MgZm9yIGNhbGwgbGFiZWw6MzIscmVncyxpbW0uCi0KLU1vbiBBcHIgIDcgMTQ6NTg6MjIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zdWJzcGFjZV9zdGFydCk6IElmIE9CSl9FTEYsIHRoZW4gYWx3YXlzIHJldHVybgotCXplcm8uCi0JKiBjb25maWcvdGMtaHBwYS5oICh0Y19mcm9iX3N5bWJvbCk6IERvbid0IHJlc2V0IHRoZSB2YWx1ZSBvZiB0aGUKLQlzeW1ib2wgZm9yIE9CSl9FTEYgYW55bW9yZS4KLQotTW9uIEFwciAgNyAxMDo1NDo1OSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZSBkZXBlbmRlbmNpZXMuCi0gCShUQVJHX0NQVSk6IE5ldyB2YXJpYWJsZS4KLQkoY2dlbi5vKTogRGVwZW5kIG9uIGNnZW4uaCwgJChUQVJHX0NQVSktb3BjLmguCi0JKC5kZXAxKTogRGVsZXRlIGNyZWF0aW5nIG9mIGNnZW4tb3BjLmguCi0JKC50Y2RlcCk6IFB1dCBwcm9wZXIgY29udGVudHMgaW4gY2dlbi1vcGMuaC4KLQkqIGNvbmZpZ3VyZS5pbiAobTMycik6IERlbGV0ZSBzZXR0aW5nIG9mIGV4dHJhX2ZpbGVzLCBleHRyYV9saW5rcy4KLQkoQUNfT1VUUFVUKTogQ3JlYXRlIGNnZW4tb3BjLmguCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1TYXQgQXByICA1IDEzOjE5OjEyIDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSB0byBidWlsZCBnYXNwLmV4ZS4KLQotRnJpIEFwciAgNCAxNjoxMDowMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChyZWxheF9mcmFnKTogTWFrZSBub24tc3RhdGljLgotCSogd3JpdGUuaCAocmVsYXhfZnJhZyk6IEFkZCBwcm90b3R5cGUgZm9yLgotCSogY29uZmlnL3RjLW0zMnIuaCAobWRfZG9fYWxpZ24pOiBOZXcgYXJnIGBtYXgnLgotCSogY29uZmlnL3RjLW0zMnIuYyAobTMycl9kb19hbGlnbik6IExpa2V3aXNlLgotCVVwZGF0ZSBjYWxscyB0byBmcmFnX2FsaWduLCBmcmFnX2FsaWduX3BhdHRlcm4uCi0JKGZpbGxfaW5zbik6IFVwZGF0ZSBjYWxsIHRvIG0zMnJfZG9fYWxpZ24uCi0JKG0zMnJfc2NvbW0pOiBVcGRhdGUgY2FsbCB0byBmcmFnX2FsaWduLgotCi0JKiBjb25maWcvdGMtbTMyci5bY2hdOiBOZXcgZmlsZXMuCi0JKiBjZ2VuLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKENQVV9UWVBFUyk6IEFkZCBtMzJyLgotCShUQVJHRVRfQ1BVX0NGSUxFUyk6IEFkZCB0Yy1tMzJyLmMuCi0JKFRBUkdFVF9DUFVfSEZJTEVTKTogQWRkIHRjLW0zMnIuaC4KLQkoRElTVENMRUFOX0hFUkUpOiBBZGQgY2dlbi1vcGMuaC4KLQkoLmRlcDEsLnRjZGVwKTogQ3JlYXRlIGVtcHR5IGNnZW4tb3BjLmguCi0JKGNnZW4ubyk6IEFkZCBkZXBlbmRlbmNpZXMuCi0JKGRlcGVuZGVuY2llcyk6IFJlZ2VuZXJhdGUuCi0JKiBhcy5oIChzdHJ1Y3QgZnJhZyk6IE5ldyBtZW1iZXIgZnJfdGFyZy4KLQkoZnJfcGNyZWxfYWRqdXN0LGZyX2Jzcik6IE1vdmUgaW50byB1bmlvbiBmcl90YXJnLm5zMzJrLgotCSogY29uZi5pbiAoVVNJTkdfQ0dFTik6IE5ldyBtYWNyby4KLQkqIGNvbmZpZ3VyZS5pbiAobTMyci0qLSopOiBBZGQgZW50cnkgZm9yLgotCUFkZCBjZ2VuLm8gdG8gZXh0cmFfb2JqZWN0cy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGZyYWdzLmMgKGZyYWdfdmFyKTogZnJfcGNyZWxfYWRqdXN0IHJlbmFtZWQgdG8KLQlmcl90YXJnLm5zMzJrLnBjcmVsX2FkanVzdC4gIGZyX2JzciByZW5hbWVkIHRvIGZyX3RhcmcubnMzMmsuYnNyLgotCShmcmFnX3ZhcmlhbnQpOiBMaWtld2lzZS4KLQkqIHdyaXRlLmMgKHJlbGF4X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1uczMyay5jICgqKTogTGlrZXdpc2UuCi0KLUZyaSBBcHIgIDQgMTM6MjY6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChUQ19FT0xfSU5fSU5TTik6IENoZWNrIGV4cGxpY2l0bHkgZm9yICchJywKLQlyYXRoZXIgdGhhbiBmb3IgYW55IGVuZCBvZiBsaW5lIGNoYXJhY3Rlci4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogSWYgaHBwYV9yZW5fcmVsb2NfdHlwZSBmYWlscywKLQljYWxsIGFib3J0IChpLmUuLCBhc19hYm9ydCkgcmF0aGVyIHRoYW4gY3Jhc2hpbmcuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFByb3RlY3QgdXNlcyBvZiBTVE9fTUlQUzE2IHdpdGggYW4gaWZkZWYgb2YKLQlPQkpfRUxGLCByYXRoZXIgdGhhbiBvZiBTX0dFVF9PVEhFUi4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RDTEVBTl9IRVJFKTogQWRkIHNpdGUuZXhwIGFuZCBzaXRlLmJhay4KLQotVGh1IEFwciAgMyAxMzoxNjoxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogU2V0IHRvIDIuOC4xLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjguCi0KLVdlZCBBcHIgIDIgMTI6MjQ6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBDT1BZSU5HOiBVcGRhdGUgRlNGIGFkZHJlc3MuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9tYWNybyk6IEhhbmRsZSBNX0RNVUwgYW5kIE1fTVVMLgotCi1UdWUgQXByICAxIDE4OjI5OjQ3IDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBEb24ndCBzZXQgaW50ZXJsb2NrcyBmb3IgNDEwMC4KLQotVHVlIEFwciAgMSAxNjoyNDoyOCAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlnLWdhcy5jb206IFVwZGF0ZSB0byBoYW5kbGUgYm90aCB2YXggYW5kIGFscGhhLgotCSogbWFrZWZpbGUudm1zOiBVcGRhdGUgdG8gdXNlIGNvbmZpZy1nYXMuCi0JKiBjb25mLWEtZ2FzLmNvbTogUmVtb3ZlIGZpbGUuCi0KLVR1ZSBBcHIgIDEgMTY6MDg6MjEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHVubmVjZXNzYXJ5IGl0YmwtcGFyc2UuaCwgaWJ0bC1wYXJzZS5jLCBhbmQKLQlpdGJsLWxleC5jIGRlcGVuZGVuY2llcy4gIFJlbW92ZSBydWxlcyBmb3IgaXRibC1sZXgubywKLQlpdGJsLXBhcnNlLm8sIGFuZCBpdGJsLW9wcy5vOyBqdXN0IHVzZSB0aGUgbm9ybWFsIC5jLm8gcnVsZS4KLQotVHVlIEFwciAgMSAxMToyNTo1NiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKGxpbmVfY29tbWVudF9jaGFyKTogTWFrZSAnIycgc3RhcnQgY29tbWVudHMKLQlhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIC5TIGZpbGVzIHdoZXJlCi0JY3BwIGxlYXZlcyB0aGUgZmlsZW5hbWUgdHJhbnNpdGlvbnMgYmVnaW5uaW5nIHdpdGggJyMnLgotCi1UdWUgQXByICAxIDAwOjA3OjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYzogT25seSBjb21waWxlIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayBhbmQKLQl0Y19jb2ZmX3NpemVtYWNoZGVwIGlmIE9CSl9DT0ZGLgotCi1Nb24gTWFyIDMxIDIzOjUzOjQ0IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocmVnaXN0ZXJfbmFtZSk6IERlY2xhcmUuCi0KLU1vbiBNYXIgMzEgMTY6MzE6MDQgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKGhwcGEqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBocHBhLSotKmVsZiouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBNYXIgMzEgMTQ6MTU6MTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX3BzZXVkb190YWJsZSk6IEFkZCAic3RhYm4iLgotCShtaXBzMTZfbWFya19sYWJlbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhcHBlbmRfaW5zbik6IENhbGwgbWlwczE2X21hcmtfbGFiZWxzLgotCShtaXBzX2VtaXRfZGVsYXlzKTogTGlrZXdpc2UuCi0JKHNfaW5zbik6IExpa2V3aXNlLiAgRG9uJ3QgY2FsbCBtaXBzX2NsZWFyX2luc25fbGFiZWxzLgotCShzX21pcHNfc3RhYik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEVMRiBmb3IgbWlwcy0qLWdudSouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBNYXIgMzEgMTQ6MDE6NDAgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0ZPUk1BVCk6IFNldCB0byAiY29mZi1tNjhrLXN5c3YiIGlmCi0JVEVfREVMVEEuCi0KLUZyaSBNYXIgMjggMTg6MDM6MTkgMTk5NyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19BUkdfRU5BQkxFIGZvciBjb21tb25iZmRsaWIuICBJZiBpdCBpcyBzZXQsCi0Jc2V0IE9QQ09ERVNfTElCIHRvIGVtcHR5LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDI4IDE1OjI1OjI0IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMtKi1saW51eCphb3V0Kiwgc3BhcmMtKi1saW51eCopOiBOZXcKLQl0YXJnZXRzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDI4IDEzOjA4OjMzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaXRibC1wYXJzZS55ICh5eWVycm9yKTogTWFrZSBzdGF0aWMuICBEZWNsYXJlLgotCi0JRnJvbSBSYWxmIEJhZWNobGUgPHJhbGZAZ251LmFpLm1pdC5lZHU+OgotCSogY29uZmlndXJlLmluOiBTZXQgZW11bGF0aW9ucyBmb3IgbWlwcy0qLWxpbnV4Ki0qLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChzdHJ1Y3QgbWlwc19zZXRfb3B0aW9ucyk6IERlZmluZS4KLQkobWlwc19vcHRzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWlwc19pc2EpOiBSZW1vdmUuICBOb3cgYSBmaWVsZCBpbiBtaXBzX29wdHMuICBDaGFuZ2UgYWxsCi0JcmVmZXJlbmNlcy4KLQkobWlwczE2LCBtaXBzMTZfYXV0b2V4dGVuZCwgbWlwc193YXJuX2Fib3V0X21hY3Jvcyk6IExpa2V3aXNlLgotCShtaXBzX25vcmVvcmRlciwgbWlwc19ub21vdmUsIG1pcHNfbm9hdCwgbWlwc19ub2JvcHQpOiBMaWtld2lzZS4KLQkoc3RydWN0IG1pcHNfb3B0aW9uX3N0YWNrKTogRGVmaW5lLgotCShtaXBzX29wdHNfc3RhY2spOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzX21pcHNzZXQpOiBBZGQgc3VwcG9ydCBmb3IgLnNldCBwdXNoIGFuZCAuc2V0IHBvcC4KLQkqIGRvYy9jLW1pcHMudGV4aTogRG9jdW1lbnQgLnNldCBwdXNoIGFuZCAuc2V0IHBvcC4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKTogRGVjbGFyZSBpdC4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfY2hhbmdlX3NlYyk6IENhbGwgaXQgaWYgT0JKX0VMRi4KLQotVGh1IE1hciAyNyAxMjoyMzo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBVcGRhdGUgY29weXJpZ2h0IGRhdGUgaW4gdmVyc2lvbiBtZXNzYWdlLgotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4taGVyZSk6IFJlbW92ZSBkZXBlbmRlbmN5IGZpbGVzLgotCi0JKiByZWFkLmMgKHNfY29tbSk6IENoZWNrIFNfSVNfQ09NTU9OIGFzIHdlbGwgYXMgU19JU19ERUZJTkVELgotCShzX21yaV9jb21tb24pOiBDaGVjayBTX0lTX0NPTU1PTiB1bmNvbmRpdGlvbmFsbHkuCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogQ2hlY2sgU19JU19DT01NT04gYXMgd2VsbCBhcyBTX0lTX0RFRklORUQuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoc19hbHBoYV9jb21tKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbWlwcy5jIChub3BpY19uZWVkX3JlbGF4KTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfbGNvbW0pOiBMaWtld2lzZS4KLQkocHBjX3BlX2NvbW0pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uKTogTGlrZXdpc2UuICBTZXQgc2VnbWVudCBvZgotCWNvbW1vbiBzeW1ib2wgdG8gYmZkX2NvbV9zZWN0aW9uX3B0ci4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX2NvbW1vbik6IExpa2V3aXNlLgotCSh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQotVGh1IE1hciAyNyAwMDoyOTo0NiAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXBwbHlfZml4Myk6IEdldCB0aGUgcmVsb2NzIHJpZ2h0LgotCi1XZWQgTWFyIDI2IDEzOjM1OjE1IDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogT25seSBkZWZpbmUgaWYKLQlCRkRfQVNTRU1CTEVSLgotCi1XZWQgTWFyIDI2IDExOjMyOjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW5wdXQtc2NydWIuYyAoaW5wdXRfc2NydWJfbmV4dF9idWZmZXIpOiBIYW5kbGUgdmVyeSBsb25nIGlucHV0Ci0JbGluZXMgY29ycmVjdGx5LgotCi0JKiBsaXN0aW5nLmMgKHByaW50X2xpbmVzKTogQWRkIGxpbmVubyBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkobGlzdGluZ19saXN0aW5nKTogT25seSBjYWxsIGNhbGNfaGV4IGZvciB0aGUgcmlnaHQgbGluZS4KLQkobGlzdGluZ19saXN0KTogU2V0IHRoZSBuZXcgZWRpY3QgYmFzZWQgb24gdGhlIGN1cnJlbnQgZWRpY3QsIGluCi0Jb3JkZXIgdG8gaGFuZGxlIGxpc3RpbmcgY29tbWFuZHMgaW4gbWFjcm9zIGNvcnJlY3RseS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoaW5zbl91c2VzX3JlZyk6IE1hcCByZWdpc3RlciBudW1iZXJzIGluIG1pcHMxNgotCWluc3RydWN0aW9ucy4KLQotCSogY29uZC5jIChjb25kX2ZpbmlzaF9jaGVjayk6IE5ldyBmdW5jdGlvbi4KLQkqIGFzLmggKGNvbmRfZmluaXNoX2NoZWNrKTogRGVjbGFyZS4KLQkqIGFzLmMgKG1haW4pOiBDYWxsIGNvbmRfZmluaXNoX2NoZWNrLgotCi1UdWUgTWFyIDI1IDE0OjQ1OjU0IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hc3NlbWJsZSk6IElmIHR3byBpbnN0cnVjdGlvbnMKLQlhcmUgc3VwcG9zZWQgdG8gYmUgYXNzZW1ibGVkIGluIHBhcmFsbGVsIGFuZCB0aGUgZmlyc3Qgb25lIGlzCi0JbG9uZywgcHJpbnQgYW4gZXJyb3IgYW5kIHN0b3AuCi0JKG1kX2FwcGx5X2ZpeDMpOiBEb24ndCBjYWxjdWxhdGUgYWJzb2x1dGUgcmVsb2NzLiAgSnVzdCB3cml0ZQotCXRoZW0gb3V0LgotCi1Nb24gTWFyIDI0IDEyOjExOjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoaWNscktsdWRnZSk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlIGljbHJLbHVkZ2UuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5oICh0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCk6IERlZmluZSBpZgotCU9CSl9FQ09GRi4KLQkoYWxwaGFfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QpOiBEZWNsYXJlIGlmIE9CSl9FQ09GRi4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9kZWJ1Zyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IFNldCBhbHBoYV9kZWJ1ZyBpZiAtZyBpcyBzZWVuLgotIAkoYWxwaGFfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QpOiBOZXcgZnVuY3Rpb24gaWYgT0JKX0VDT0ZGLgotCi1TdW4gTWFyIDIzIDE4OjAzOjMxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChidWlsZF9pbnNuKTogRW5hYmxlIHJhbmdlLWNoZWNraW5nIGNvZGUuCi0JKHBvc3RmaXgpOiBTdG9wIGF0IHNwYWNlIG9yIGNvbW1hLgotCShtZF9hc3NlbWJsZSk6IENoYW5nZSBlcnJvciBtZXNzYWdlLgotCi1TYXQgTWFyIDIyIDEzOjQ0OjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZGVkIGF1dG9tYXRpYyBkZXBlbmRlbmN5IGJ1aWxkaW5nLgotCSogZGVwLWluLnNlZDogTmV3IGZpbGUuCi0KLUZyaSBNYXIgMjEgMTU6NDI6MzcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWllZWUuYyAoc2VnbWVudF9uYW1lKTogRG9uJ3QgZGVmaW5lIGZ1bmN0aW9uIGlmIHRoaXMKLQlpcyBhIG1hY3JvLgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoRE9fU1RSSVApOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtaDgzMDAuaCAoRE9fU1RSSVApOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtaDg1MDAuaCAoRE9fU1RSSVApOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtdzY1LmggKERPX1NUUklQKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLXo4ay5oIChET19TVFJJUCk6IERvbid0IGRlZmluZS4KLQotCSogc3ltYm9scy5jIChjb2xvbik6IENhbGwgb2JqX2Zyb2JfbGFiZWwgaWYgaXQgaXMgZGVmaW5lZC4KLQkqIGNvbmZpZy9vYmotdm1zLmggKG9ial9mcm9iX2xhYmVsKTogUmVuYW1lIGZyb20gdGNfZnJvYl9sYWJlbC4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBzZXQgZmlsZXMgYW5kIGxpbmtzLiAgRG9uJ3QgY2FsbAotCUFDX0xJTktfRklMRVMuICBTdWJzdGl0dXRlIHRlX2ZpbGUuICBDcmVhdGUgdGFyZy1jcHUuaCwKLQlvYmotZm9ybWF0LmgsIHRhcmctZW52LmgsIGFuZCBpdGJsLWNwdS5oIGluIEFDX09VVFBVVC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChUQVJHX0NQVV9DKTogTmV3IHZhcmlhYmxlLgotCShUQVJHX0NQVV9PLCBUQVJHX0NQVV9IKTogTmV3IHZhcmlhYmxlcy4KLQkoT0JKX0ZPUk1BVF9DLCBPQkpfRk9STUFUX08sIE9CSl9GT1JNQVRfSCk6IE5ldyB2YXJpYWJsZXMuCi0JKFRBUkdfRU5WX0gsIEFUT0ZfVEFSR19DLCBBVE9GX1RBUkdfTyk6IE5ldyB2YXJpYWJsZXMuCi0JKFNPVVJDRVMpOiBSZW5hbWUgZnJvbSBSRUFMX1NPVVJDRVMuICBEZWxldGUgb2xkIGRlZmluaXRpb24uCi0JKExJTktFRF9TT1VSQ0VTKTogUmVtb3ZlLgotCShIRUFERVJTKTogUmVuYW1lIGZyb20gUkVBTF9IRUFERVJTLiAgRGVsZXRlIG9sZCBkZWZpbml0aW9uLgotCShMSU5LRURfSEVBREVSUyk6IFJlbW92ZS4KLQkoT0JKUyk6IFVzZSAkKFRBUkdfQ1BVX08pLCBldGMuLCByYXRoZXIgdGhhbiB0YXJnLWNwdS5vLCBldGMuCi0JKCQoT0JKUykpOiBEZXBlbmQgdXBvbiAkKFRBUkdfRU5WX0gpLCBldGMuLCByYXRoZXIgdGhhbgotCXRhcmctY3B1LmgsIGV0Yy4KLQkoJChUQVJHX0NQVV9PKSwgJChPQkpfRk9STUFUX08pICQoQVRPRl9UQVJHX08pKTogTmV3IHRhcmdldHMuCi0JKHRhcmctY3B1Lm8sIG9iai1mb3JtYXQubywgYXRvZi10YXJnLm8pOiBSZW1vdmUgdGFyZ2V0cy4KLQkoaXRibC1jcHUuaCk6IFJlbW92ZSB0YXJnZXQuCi0JKERJU1RDTEVBTl9IRVJFKTogUmVtb3ZlIHRhcmctY3B1LmMsIG9iai1mb3JtYXQuYywgYXRvZi10YXJnLmMsCi0JYXRvZi10YXJnLmguCi0KLVRodSBNYXIgMjAgMTk6MTg6NTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbyAoU3ltYm9sIE5hbWVzKTogRG9uJ3QgdXNlIG9ic29sZXRlIEBjdHJsIG1hY3JvLgotCi1UaHUgTWFyIDIwIDE2OjQ5OjE0IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtcmlfY2hpcCk6IFJlcGxhY2UgY2FsbHMgdG8gZ2V0X3N5bWJvbF9lbmQgYnkKLQlvcGVuIGNvZGVkIGxvb3AgdGhhdCBkb2VzIG5vdCByZXF1aXJlIHRoZSBuYW1lIHRvIHN0YXJ0IHdpdGggYQotCW5hbWUgYmVnaW5uZXIuCi0KLVRodSBNYXIgMjAgMTM6NDI6MDEgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIGZyYWdzLmMgKGZyYWdfdmFyKTogQ2hhbmdlIG9mZnNldCBwYXJhbWV0ZXIgdG8gb2Zmc2V0VC4KLQkoZnJhZ192YXJpYW50KTogTGlrZXdpc2UuCi0JKiBmcmFncy5oIChmcmFnX3ZhcmlhbnQsIGZyYWdfdmFyKTogVXBkYXRlIGRlY2xhcmF0aW9ucy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHN0cnVjdCBtNjhrX2l0KTogQ2hhbmdlIGZvZmYgZmllbGQgdG8KLQlvZmZzZXRULgotCShhZGRfZnJhZyk6IENoYW5nZSBvZmYgcGFyYW1ldGVyIHRvIG9mZnNldFQuCi0JKiBTZXZlcmFsIGZpbGVzOiBBZGQgY2FzdHMgdG8gY2FsbHMgdG8gZnJhZ192YXIuCi0KLQkqIE1ha2VmaWxlLmluIChtNjhrLXBhcnNlLmMpOiBEZXBlbmQgdXBvbiBpdGJsLXBhcnNlLmMsIHRvCi0Jc2VyaWFsaXplIGEgcGFyYWxsZWwgbWFrZS4KLQkoaXRibC1wYXJzZS5oKTogU3BsaXQgdGFyZ2V0IG91dCBmcm9tIGl0YmwtcGFyc2UuYy4KLQotVGh1IE1hciAyMCAxMjo0ODo0NSAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWcvbTY4ay1wYXJzZS55IChtb3Rvcm9sYV9vcGVyYW5kKTogQWxsb3cgKHpkaXJlZyxFWFBSKS4KLQotCSogY29uZmlnL3RlLWRlbHRhLmggKENPRkZfQ09NTU9OX0FEREVORCk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogQ2hlY2sgQ09GRl9DT01NT05fQURERU5EIHdoZW4KLQlzdG9yaW5nIHRoZSB2YWx1ZSBvZiBhIGNvbW1vbiBzeW1ib2wuCi0KLVdlZCBNYXIgMTkgMTE6Mzc6NTcgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGdsdWVfc3ltYm9scyk6IFVudXNlZCB2YXJpYWJsZSBzeW1ib2xQCi0JcmVtb3ZlZC4KLQkoY3Jhd2xfc3ltYm9scyk6IERvIG5vdCBtb2RpZnkgc3ltYm9sX3Jvb3RQIGFuZCBzeW1ib2xfbGFzdFAgaGVyZTsKLQl0aGF0IGlzIGRvbmUgYnkgc3ltYm9sX3JlbW92ZSBhbmQgc3ltYm9sX2luc2VydC4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKFNfSVNfTE9DQUwpOiBSZXR1cm4gMCBmb3IgYSBkZWJ1Z2dpbmcKLQlzeW1ib2wuCi0KLVdlZCBNYXIgMTkgMTE6MDY6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogSW4gMzIgYml0IG1vZGUsIHdoZW4gbm90Ci0JZGVhbGluZyB3aXRoIGEgNjQgYml0IG51bWJlciwgcGVybWl0IHRoZSB1cHBlciAzMiBiaXRzIHRvIGJlIHNldAotCWV2ZW4gaWYgYml0IDMxIGlzIG5vdCBzZXQuCi0KLVR1ZSBNYXIgMTggMjM6MzA6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgImVxdWl2Ii4KLQkoc19zZXQpOiBIYW5kbGUgLmVxdWl2IGJhc2VkIG9uIGFyZ3VtZW50LgotCSogZG9jL2FzLnRleGluZm8gKEVxdWl2KTogTmV3IG5vZGUgdG8gZG9jdW1lbnQgLmVxdWl2LgotCShFcnIpOiBOZXcgbm9kZSB0byBkb2N1bWVudCAuZXJyLgotCi1UdWUgTWFyIDE4IDE1OjUwOjEzIDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBNYW55IGZpbGVzOiBBZGQgZnVuY3Rpb24gcHJvdG90eXBlcy4KLQkqIGFzLmMgKHNob3dfdXNhZ2UsIHBhcnNlX2FyZ3MpOiBNYWtlIHN0YXRpYy4KLQkqIGZyYWdzLmggKGZyYWdfYWxsb2MpOiBEZWNsYXJlLgotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBEb24ndCBkZWNsYXJlIGZyYWdfYWxsb2MuCi0JKiBzeW1ib2xzLmMgKGRvbGxhcl9sYWJlbF9pbnN0YW5jZSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBsb25nLgotCSogc3ltYm9scy5oIChwcmludF9zeW1ib2xfdmFsdWUpOiBEZWNsYXJlLgotCShwcmludF9leHByLCBwcmludF9leHByXzEsIHByaW50X3N5bWJvbF92YWx1ZV8xKTogRGVjbGFyZS4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfZXhwKTogRG9uJ3QgZGVjbGFyZSBtYWtlX2V4cHJfc3ltYm9sLgotCShyZW1vdmVfc3Vic2VncywgcmVsYXhfZnJhZyk6IE1ha2Ugc3RhdGljLgotCSogY29uZmlnL2F0b2YtdmF4LmMgKGF0b2ZfdmF4X3NpemVvZik6IENoYW5nZSBsZXR0ZXIgdG8gaW50LgotCSh3aGF0X2tpbmRfb2ZfZmxvYXQpOiBMaWtld2lzZS4KLQkoYXRvZl92YXgpOiBNYWtlIHN0YXRpYy4gIENoYW5nZSB3aGF0X2tpbmQgdG8gaW50LgotCShtZF9hdG9mKTogQ2hhbmdlIHdoYXRfc3RhdGVtZW50X3R5cGUgdG8gaW50LgotCSogY29uZmlnL29iai1lY29mZi5oIChvYmpfZWNvZmZfc2V0X2V4dCk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAodmF4X21kX2F0b2YpOiBEZWNsYXJlLgotCShtZF9hdG9mKTogRG9uJ3QgZGVjbGFyZSBhdG9mX2llZWUgYW5kIHZheF9tZF9hdG9mLgotCSogY29uZmlnL3RjLWkzODYuYyAoc2V0XzE2Yml0X2NvZGVfZmxhZyk6IE1ha2Ugc3RhdGljLgotCSogY29uZmlnL3RjLWkzODYuaCAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbTY4ay5jIChhZGRfZml4KTogQ2hhbmdlIHdpZHRoIHRvIGludC4KLQkoaW5zZXJ0X3JlZyk6IENoYW5nZSByZWduYW1lIHRvIGNvbnN0LgotCShtZF9hdG9mKTogRG9uJ3QgZGVjbGFyZSBhdG9mX2llZWUuCi0JKGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUpOiBEb24ndCBkZWNsYXJlLgotCSogY29uZmlnL3RjLW04OGsuYyAobWRfYXRvZik6IERvbid0IGRlY2xhcmUgYXRvZl9pZWVlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKGNtcF9yZWdfZW50cnkpOiBDaGFuZ2UgYXJncyB0byBjb25zdCBQVFIuCi0JKHBhcnNlX2tleXdvcmRfYXJnKTogQ2hhbmdlIGxvb2t1cF9mbiB0byB0YWtlIGNvbnN0IGFyZy4KLQkobWRfYXRvZik6IERvbid0IGRlY2xhcmUgYXRvZl9pZWVlLgotCSogY29uZmlnL3RjLXNwYXJjLmg6IEFkZCBpZmRlZiBmb3IgbXVsdGlwbGUgaW5jbHVzaW9uLgotCSh0Y19hb3V0X3ByZV93cml0ZV9ob29rKTogRG9uJ3QgZGVjbGFyZS4KLQotTW9uIE1hciAxNyAxMToyMTowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmggKGJmZF9hbGxvY19ieV9zaXplX3QpOiBEb24ndCBkZWNsYXJlLgotCSogTWFueSBmaWxlczogVXNlIHhtYWxsb2MgcmF0aGVyIHRoYW4gYmZkX2FsbG9jX2J5X3NpemVfdC4KLQotU3VuIE1hciAxNiAxMzo0OToyMSAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IERvbid0IGNhbGwgZGVidWdfdmVyaWZ5X3N5bWNoYWluLgotCShzeW1ib2xfYXBwZW5kKTogU2V0IHN5X25leHQgYW5kIHN5X3ByZXZpb3VzIHdoZW4gYWRkaW5nIGEgc2luZ2xlCi0Jc3ltYm9sIHRvIGFuIGVtcHR5IGxpc3QuICBDYWxsIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbi4KLQkodmVyaWZ5X3N5bWJvbF9jaGFpbik6IFVzZSBhc3NlcnQsIG5vdCBrbm93LgotCi1TYXQgTWFyIDE1IDIwOjI3OjEyIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBORVdTOiBOb3RlIEJlT1Mgc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZS5pbjogKHBwYy0qLWJlb3MpOiBOZXcgdGFyZ2V0LCB1c2UgY29mZiBhcyBvYmplY3QgZm9ybWF0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYuCi0JCi1TYXQgTWFyIDE1IDE5OjE0OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXBwbHlfZml4KTogSW1wcm92ZSBlcnJvciBtZXNzYWdlIGZvciBvdXQKLQlvZiByYW5nZSBicmFuY2guCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgZGVwZW5kZW5jaWVzIG9uIG9ic3RhY2suaCB3aGVyZSBuZWVkZWQuCi0KLUZyaSBNYXIgMTQgMTU6MzM6MzggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IEhhbmRsZSB0aGUKLQljYXNlIG9mIGEgc3ltYm9sIGVxdWF0ZWQgdG8gYW5vdGhlciBzeW1ib2wgd2hlbiB1c2luZyBTVlI0X1BJQy4KLQotCSogTWFrZWZpbGUuaW4gKFRBUkdfQ1BVX0RFUF9zcGFyYyk6IEFkZCBvcGNvZGUvc3BhcmMuaC4KLQotVGh1IE1hciAxMyAxMToyMDo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogQ2FsbCBMSVNUSU5HX05FV0xJTkUgYmVmb3JlCi0JSEFORExFX0NPTkRJVElPTkFMX0FTU0VNQkxZIHdoZW4gaGFuZGxpbmcgYW4gTVJJIGxpbmUgbGFiZWwuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfZGF0YSk6IENhbGwgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLQlhbmQgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgaWYgdGhleSBhcmUgZGVmaW5lZC4KLQkob2JqX2VsZl90ZXh0LCBvYmpfZWxmX3ByZXZpb3VzKTogTGlrZXdpc2UuCi0KLVdlZCBNYXIgMTIgMTE6NDA6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLW11bHRpLmggKHN0cnVjdCBlbGZfb2JqX3N5KTogRGVmaW5lIGlmCi0JT0JKX01BWUJFX0VMRi4KLQkoT0JKX1NZTUZJRUxEX1RZUEUpOiBEZWZpbmUgYXMgc3RydWN0IGVsZl9vYmpfc3kgaWYKLQlPQkpfTUFZQkVfRUxGLgotCSogY29uZmlnL29iai1lbGYuaCAoc3RydWN0IGVsZl9vYmpfc3kpOiBEb24ndCBkZWZpbmUgaWYKLQlPQkpfU1lNRklFTERfVFlQRSBpcyBkZWZpbmVkLgotCi0JKiBkb2MvYXMudGV4aW5mbyAoYnNzKTogSW1wcm92ZSBkZXNjcmlwdGlvbiBvZiAuYnNzIHNlY3Rpb24uICBJbgotCUVMRiBvciBDT0ZGLCB5b3UgYXJlIHBlcm1pdHRlZCB0byBzd2l0Y2ggaW50byB0aGUgc2VjdGlvbi4KLQkoQ29tbSk6IFJld3JpdGUgZGVzY3JpcHRpb24gb2YgY29tbW9uIHN5bWJvbHMuCi0JKExjb21tKTogTWVudGlvbiB0aGF0IHNvbWUgdGFyZ2V0cyBwZXJtaXQgYSB0aGlyZCBhcmd1bWVudC4KLQotVHVlIE1hciAxMSAwMToxMzozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9sY29tbSk6IERvbid0IGNhbGwgU19DTEVBUl9FWFRFUk5BTC4KLQotCSogc3ltYm9scy5jIChjb2xvbik6IENoYW5nZSB0eXBlIG9mIGxvY2FsIHRvIGludC4gIEZyb20gQWxhbiBNb2RyYQotCTxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4uCi0KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG04OGtfZG9fYWxpZ24pOiBEb24ndCB1c2UgYSBzcGVjaWFsIG5vcAotCWFsaWdubWVudCBpZiBhIHplcm8gZmlsbCBwYXR0ZXJuIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IExpa2V3aXNlLgotCi0JKiByZWFkLmMgKGVxdWFscyk6IEFsd2F5cyBwZXJtaXQgcmVnaXN0ZXIgbmFtZXMgdG8gYmUgcmVkZWZpbmVkLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2ZpeF9hZGp1c3RhYmxlKTogUGVybWl0IGEgcmVsb2MgYWdhaW5zdCBhCi0JbWlwczE2IHN5bWJvbCB0byBiZSBhZGp1c3RlZCBpZiBhIHN5bWJvbCBpcyBiZWluZyBzdWJ0cmFjdGVkIGZyb20KLQlpdC4KLQotCUZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYW5kYW50ZS5qaWMuY29tPjoKLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc3ltdmVyKTogQ2hlY2sgZm9yIGR1cGxpY2F0ZSBvcgotCWlsbGVnYWwgc3ltYm9sIHZlcnNpb24gbmFtZXMuCi0JKGVsZl9mcm9iX3N5bWJvbCk6IENoZWNrIGZvciBleHRlcm5hbCBkZWZhdWx0IHZlcnNpb25zLgotCi1TdW4gTWFyICA5IDIzOjQ5OjEyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYW5kYW50ZS5qaWMuY29tPjoKLQkqIGNvbmZpZy9vYmotZWxmLmggKHN0cnVjdCBlbGZfb2JqX3N5KTogRGVmaW5lLgotCShPQkpfU1lNRklFTERfVFlQRSk6IERlZmluZSB0byBlbGZfb2JqX3N5IHN0cnVjdC4gIENoYW5nZSBhbGwKLQl1c2Vycy4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc3ltdmVyKTogSnVzdCByZWNvcmQgdGhlIG5hbWUuCi0JKG9ial9zeW1ib2xfbmV3X2hvb2spOiBJbml0aWFsaXplZCB2ZXJzaW9uZWRfbmFtZSBmaWVsZC4KLQkoZWxmX2Zyb2Jfc3ltYm9sKTogSWYgdGhlcmUgaXMgYSB2ZXJzaW9uZWRfbmFtZSwgZWl0aGVyIHJlbmFtZSB0aGUKLQlzeW1ib2wsIG9yIGFkZCBhbiBhbGlhcyB3aXRoIHRoYXQgbmFtZS4KLQotVGh1IE1hciAgNiAxMzo1NTozMiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX3JlbGF4X3RhYmxlKTogRGVmaW5lLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBJbXBsZW1lbnQuCi0JKG1kX2Fzc2VtYmxlKTogSGFuZGxlIHJlbGF4YWJsZSBvcGVyYW5kcy9pbnN0cnVjdGlvbnMgY29ycmVjdGx5LgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IEltcGxlbWVudC4KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmggKFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX3JlbGF4X3RhYmxlKTogRml4IHR5cG9zLgotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IERvbid0IHVzZSBhbnkgTU4xMDMwMCBzcGVjaWZpYwotCXJlbG9jcyBhbnltb3JlLiAgVHdlYWsgZnhfb2Zmc2V0IGZvciBwYy1yZWxhdGl2ZSByZWxvY3MuCi0KLVdlZCBNYXIgIDUgMTU6NDY6MTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25kLmMgKHNfaWZjKTogQ2FsbCBtcmlfY29tbWVudF9maWVsZCBhbmQgbXJpX2NvbW1lbnRfZW5kIHdoZW4KLQlpbiBNUkkgbW9kZS4KLQotVHVlIE1hciAgNCAxOTozNDoyMSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAic2VjdCIgYW5kICJzZWN0aW9uIgotCXBzZXVkby1vcHMuCi0JKiBjb25maWcvdGMtdGljODAuYyAobWRfYmVnaW4pOiBEZWNsYXJlIGV4dGVybmFsIHZhcmlhYmxlCi0JY29mZl9mbGFncyBhbmQgaW5zZXJ0IGFuIEZfQVIzMldSIGJpdCBpbnRvIGl0LgotCi1UdWUgTWFyICA0IDEwOjAxOjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChlcXVhbHMpOiBBZGQgcmVhc3NpZ24gcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCSogcmVhZC5oIChlcXVhbHMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0KLVNhdCBNYXIgIDEgMDE6MDQ6MDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IERvbid0IGFzc3VtZSB0aGF0IHdlCi0JY2FuIHJlbHkgb24gdGhlIGZyYWcgYWRkcmVzcyB0byBkZXRlcm1pbmUgd2hldGhlciBhIGZyYWcgaXMKLQllYXJsaWVyIG9yIGxhdGVyLgotCi1GcmkgRmViIDI4IDE0OjQwOjAwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuaCAoTE9DQUxfTEFCRUwpOiBPbmx5IGRlZmluZSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQkoU19MT0NBTF9OQU1FKTogTGlrZXdpc2UuCi0JKEZBS0VfTEFCRUxfTkFNRSk6IERlZmluZSB1bmNvbmRpdGlvbmFsbHkuCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogQ2FsbCBiZmRfaXNfbG9jYWxfbGFiZWwsIG5vdCBMT0NBTF9MQUJFTCwgaWYKLQlCRkRfQVNTRU1CTEVSLgotCShTX0lTX0xPQ0FMKTogQ2FsbCBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSwgbm90IExPQ0FMX0xBQkVMLgotCSogY29uZmlnL3RjLSouaDogT25seSBkZWZpbmUgTE9DQUxfTEFCRUwgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JRG9uJ3QgZGVmaW5lIEZBS0VfTEFCRUxfTkFNRS4KLQkqIGNvbmZpZy90ZS1pYzk2MC5oOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KTogRGVmaW5lLgotCShtaXBzX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfbG9jYWxfbGFiZWwpOiBSZW1vdmUuCi0KLQkqIGNvbmZpZy90ZS1zY28zODYuaDogUmVtb3ZlOyBub3QgdXNlZC4KLQotVGh1IEZlYiAyNyAxNTozOToxNiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgYWxpZ24gcHNldWRvIG9wIHRvIGRvCi0JYnl0ZSBhbGlnbm1lbnQgcmF0aGVyIHRoYW4gcG93ZXItb2YtdHdvIGFsaWdubWVudCB0aGF0IGlzIHRoZQotCUdBUyBkZWZhdWx0LgotCi1UaHUgRmViIDI3IDEzOjI5OjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgYSByZWxvYyB3aWR0aCBvZiAnVycuCi0KLQkqIGdhc3AuYyAoaGFzaF9hZGRfdG9fc3RyaW5nX3RhYmxlKTogQ29ycmVjdCBtaXNzcGVsbGluZyBpbiBlcnJvcgotCW1lc3NhZ2UsIGFuZCBhZGQgbmV3bGluZS4KLQkocHJvY2Vzc19maWxlKTogRG9uJ3QgcHJvY2VzcyBhc3NpZ25tZW50cyBpbiB0aGUgbGFiZWwgaWYgdGhpcyBpcwotCWEgZXF1IG9yIGFzc2lnbiBwc2V1ZG8tb3AuCi0JKHByb2Nlc3NfcHNldWRvX29wKTogU3dhcCBmaXJzdCBhcmd1bWVudCB0byBkb19hc3NpZ24gZm9yIEtfQVNTSUdOCi0JYW5kIEtfRVFVLCB0byBtYXRjaCBkb2N1bWVudGF0aW9uLgotCi1UaHUgRmViIDI3IDEyOjAwOjAzIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc2VjdGlvbik6IEFkZCAncicgc2VjdGlvbiBhdHRyaWJ1dGUKLQl0byBkZW5vdGUgcmVhZC1vbmx5IGRhdGEgc2VjdGlvbnMuCi0KLVRodSBGZWIgMjcgMDA6MjY6MzMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2NvbW1vbik6IFNldCBCU0ZfT0JKRUNUIGluIGZsYWdzLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfY29tbW9uKTogTGlrZXdpc2UsIGlmIEJGRF9BU1NFTUJMRVIuCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IFNpbXBsaWZ5IDBiIGhhbmRsaW5nLiAgRG9uJ3QgdHJlYXQgMGIgYXMgYQotCWJpbmFyeSBudW1iZXIgaWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzICcrJyBvciAnLScuCi0KLVdlZCBGZWIgMjYgMjA6NDc6MTIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChGTFRfQ0hBUlMpOiBDaGFuZ2UgZnJvbSAiZEQiIHRvICJmRiIuCi0JKGZpbmRfb3Bjb2RlKTogTWF0Y2ggb3BlcmFuZHMgdGhhdCBjYW4gYmUgZmxvYXRzLgotCShidWlsZF9pbnNuKTogSGFuZGxlIE9fYmlnIChmbG9hdCkgZXhwcmVzc2lvbnMgYW5kIGJ1aWxkCi0JY29ycmVjdCBvcGNvZGUuCi0KLVdlZCBGZWIgMjYgMTg6MTk6MDAgMTk5NyAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMqLSotbG5ld3MqKTogTmV3IHRhcmdldCwgYWxzbyBtYWtlIGVtcHR5Ci0JZW11bGF0aW9uIGxpc3QgZm9yIHRoaXMgdGFyZ2V0LgotCSogY29uZmlndXJlOiBVcGRhdGUuCi0JKiB0Yy1taXBzLmMgKEVDT0ZGX0xJVFRMRV9GT1JNQVQpOiBEZWZpbmUuCi0JKG1pcHNfdGFyZ2V0X2Zvcm1hdCk6IFVzZS4KLQkqIHRlLWxuZXdzLmg6IE5ldyBmaWxlLgotCi1XZWQgRmViIDI2IDE1OjMzOjQ2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAoZmluZF9vcGNvZGUsIGJ1aWxkX2luc24pOiBDaGFuZ2VzIHRvIG1hdGNoCi0Jb3BlcmFuZHMgd2l0aCA6bSBvciA6cyBtb2RpZmllcnMgYW5kIGdlbmVyYXRlIHRoZSByaWdodCBvcGNvZGVzCi0JZm9yIHRoZW0uCi0KLVdlZCBGZWIgMjYgMTE6NTY6MTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaXRibC1wYXJzZS5jIGl0YmwtcGFyc2UuaCk6IFVzZSAkKEJJU09OKSBhbmQKLQkkKEJJU09ORkxBR1MpLCBub3QgJChZQUNDKSBhbmQgJChZQUNDRkxBR1MpLgotCi1UdWUgRmViIDI1IDIyOjAyOjIzIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGluc3RyaW5nKTogVXNlbGVzcyBsb2NhbCBkZWNsYXJhdGlvbiBvZgotCWNyYWNrX29wZXJhbmQgcmVtb3ZlZC4KLQkqIGV4cHIuaCAoZXhwcmVzc2lvblMpOiBDaGFuZ2VkIHR5cGUgb2YgWF9vcCBmaWVsZCB0byBvcGVyYXRvclQgaWYKLQlfX0dOVUNfXy4KLQotVHVlIEZlYiAyNSAxMzoxNzoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gUm9iZXJ0IExpcGUgPHJvYmVydGxAZGdpaS5jb20+OgotCSogY29uZmlndXJlLmluOiBBZGQgaTM4NmNvZmYgYW5kIGkzODZlbGYgdG8gZW11bGF0aW9uIGxpc3QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBhcy5jIChpMzg2Y29mZiwgaTM4NmVsZik6IERlY2xhcmUuCi0JKiBvYmouaCAoY29mZl9mb3JtYXRfb3BzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChPQkpfSEVBREVSKTogRGVmaW5lLgotCShjb2ZmX29ial9zeW1ib2xfbmV3X2hvb2spOiBSZW5hbWUgZnJvbSBvYmpfc3ltYm9sX25ld19ob29rLgotCShjb2ZmX29ial9yZWFkX2JlZ2luX2hvb2spOiBSZW5hbWUgZnJvbSBvYmpfcmVhZF9iZWdpbl9ob29rLgotCShvYmpfcHNldWRvX3RhYmxlKTogQWRkICJ2ZXJzaW9uIi4KLQkoY29mZl9wb3BfaW5zZXJ0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9zZWNfc3ltX29rX2Zvcl9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG5vX2Z1bmMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2Zvcm1hdF9vcHMpOiBOZXcgdmFyaWFibGUuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZl9vYmpfc3ltYm9sX25ld19ob29rKTogRGVjbGFyZS4KLQkob2JqX3N5bWJvbF9uZXdfaG9vayk6IERlZmluZS4KLQkoY29mZl9vYmpfcmVhZF9iZWdpbl9ob29rKTogRGVjbGFyZS4KLQkob2JqX3JlYWRfYmVnaW5faG9vayk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKGkzODZfdGFyZ2V0X2Zvcm1hdCk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBDaGVjayBPQkpfTUFZQkVfRUxGIGFzIHdlbGwgYXMgT0JKX0VMRjsgY2hlY2sKLQlPVVRQVVRfRkxBVk9SIHdoZW4gYXBwcm9wcmlhdGUuCi0JKGkzODZfdGFyZ2V0X2Zvcm1hdCk6IE5ldyBmdW5jdGlvbi4KLQkqIE1ha2VmaWxlLmluIChvYmotY29mZi5vKTogTmV3IHRhcmdldC4KLQkoZS1pMzg2Y29mZi5vLCBlLWkzODZlbGYubyk6IE5ldyB0YXJnZXRzLgotCi0JRnJvbSBTdGVwaGVuIFdpbGxpYW1zIDxzdGV2ZUBpY2FydXMuaWNhcnVzLmNvbT46Ci0JKiBjb25maWcvdGMtaTk2MC5oIChUQ19TWU1GSUVMRF9UWVBFKTogRGVmaW5lIGlmIE9CSl9DT0ZGLgotCShfdGNfZ2V0X2JhbF9vZl9jYWxsKTogRG9uJ3QgZGVjbGFyZS4KLQkodGNfZ2V0X2JhbF9vZl9jYWxsKTogRGVjbGFyZSBhcyBmdW5jdGlvbiwgZG9uJ3QgZGVmaW5lIGFzIG1hY3JvLgotCSogY29uZmlnL3RjLWk5NjAuYyAodGNfc2V0X2JhbF9vZl9jYWxsKTogSWYgT0JKX0NPRkYsIHN0b3JlIGJhbFAKLQlpbiBzeV90YyBmaWVsZCwgbm90IHhfYmFsbnRyeSBmaWVsZC4KLQkodGNfZ2V0X2JhbF9vZl9jYWxsKTogUmVuYW1lIGZyb20gX3RjX2dldF9iYWxfb2ZfY2FsbC4gIENoYW5nZQotCXJldHVybiB0eXBlIHRvIHN5bWJvbFMgKi4gIElmIE9CSl9DT0ZGLCByZXRyaWV2ZSB2YWx1ZSBmcm9tIHN5X3RjCi0JZmllbGQsIG5vdCB4X2JhbG50cnkgZmllbGQuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IFBlcm1pdCBhIC5ub3RlIHNlY3Rpb24gdG8KLQloYXZlIHRoZSBTSEZfQUxMT0MgYXR0cmlidXRlLgotCi0JKiBNYWtlZmlsZS5pbiAoJChPQkpTKSk6IERvbid0IGRlcGVuZCB1cG9uICQoSVRfSERSUykuCi0JKFRBUkdfQ1BVX0RFUF9taXBzKTogRGVwZW5kIHVwb24gJChzcmNkaXIpL2l0Ymwtb3BzLmguCi0JKGl0YmwtbGV4Lm8pOiBEZXBlbmQgdXBvbiBpdGJsLXBhcnNlLmguCi0KLQkqIGl0YmwtcGFyc2UueSAoeXllcnJvcik6IENoYW5nZSByZXR1cm4gdHlwZSB0byBpbnQuICBDaGFuZ2UgdG8KLQl1c2Ugb2xkIHN0eWxlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgotCi0JKiBNYWtlZmlsZS5pbiAoaXRibC1sZXgubyk6IFJlbW92ZSAtV2FsbC4KLQkoaXRibC1wYXJzZS5vKTogTGlrZXdpc2UuCi0KLQkqIGNvbmQuYyAoc19pZmRlZik6IElmIHdlIHNob3VsZCBvbWl0IGNvbmRpdGlvbmFscyBmcm9tIGxpc3RpbmdzLAotCWNhbGwgbGlzdGluZ19saXN0LgotCShzX2lmLCBzX2lmYywgc19lbmRpZiwgc19lbHNlLCBzX2lmZXFzKTogTGlrZXdpc2UuCi0JKiBsaXN0aW5nLmMgKGxpc3RfaW5mb19zdHJ1Y3QpOiBBZGQgRURJQ1RfTk9MSVNUX05FWFQuCi0JKGxpc3RpbmdfbGlzdGluZyk6IEhhbmRsZSBFRElDVF9OT0xJU1RfTkVYVC4KLQkobGlzdGluZ19saXN0KTogQW4gYXJndW1lbnQgb2YgMiBtZWFucyBFRElDVF9OT0xJU1RfTkVYVC4KLQkqIGxpc3RpbmcuaCAoTElTVElOR19OT0NPTkQpOiBEZWZpbmUuCi0JKExJU1RJTkdfU0tJUF9DT05EKTogRGVmaW5lLgotCSogYXMuYyAoc2hvd191c2FnZSk6IE1lbnRpb24gYyBhcyBhIHN1Ym9wdGlvbiBvZiAtYS4KLQkocGFyc2VfYXJncyk6IEhhbmRsZSBjIGFzIGEgc3Vib3B0aW9uIG9mIC1hLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IC1hbGMuCi0KLU1vbiBGZWIgMjQgMjM6MzQ6MTQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChtZF9hcHBseV9maXgpOiBIYW5kbGUgUl9BQlMgdHlwZSBmaXh1cHMuCi0KLU1vbiBGZWIgMjQgMTg6Mjc6NDMgMTk5NyAgRXJpYyBZb3VuZ2RhbGUgIDxlcmljQGFuZGFudGUuamljLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IC5zeW12ZXIuCi0KLU1vbiBGZWIgMjQgMTU6MTk6NTcgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IENoYW5nZSBwcmVfZGVmaW5lZF9yZWdpc3RlcnMgdG8gCi0JZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVycyBhbmQgcmVnX25hbWVfY250IHRvIGQxMHZfcmVnX25hbWVfY250LgotCi1Nb24gRmViIDI0IDEwOjQwOjQ1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYzogRml4IHR5cG8gaW4gY29tbWVudCBzZWN0aW9uLgotCSogY29uZmlnL3RjLXRpYzgwLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBlbnRyeSBmb3IgYnNzLCB3aGljaCB0YWtlcwotIAlhbiBhZGRpdGlvbmFsIGFsaWdubWVudCBhcmd1bWVudC4KLQkoZmluZF9vcGNvZGUpOiBBbGxvdyBPX3N5bWJvbCByZWxvY3MgZm9yIGFueSAzMiBiaXQgZmllbGQsIG5vdCBqdXN0Ci0gCWJhc2UgcmVsYXRpdmUgb25lcy4KLQkoYnVpbGRfaW5zbik6IEhhbmRsZSBPX3N5bWJvbCByZWxvY3MgZm9yIGFueSAzMiBiaXQgZmllbGQsIG5vdCBqdXN0Ci0gCWJhc2UgcmVsYXRpdmUgb25lcy4KLQotTW9uIEZlYiAyNCAwMjoyMzowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgZGVwZW5kYW5jaWVzIG9uIGl0YmwtY3B1LmguCi0JKiBhcy5jOiBEZWZpbmUgc3R1YnMgZm9yIGl0YmxfcGFyc2UgYW5kIGl0YmxfaW5pdCBpZiBIQVZFX0lUQkxfQ1BVIAotCWlzIG5vdCBkZWZpbmVkLgotCi1Nb24gRmViIDI0IDAyOjAzOjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogaXRibC1vcHMuaDogSW5jbHVkZSBhcy5oLgotCi1Nb24gRmViIDI0IDAxOjA0OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogYXMuYzogUmVtb3ZlIC10IG9wdGlvbi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluOiBNb3ZlIGl0YmwtY3B1LmggdG8gbWlwcyBzcGVjaWZpYyBjb25maWd1cmUuCi0JKiBpdGJsLW9wcy5oOiBJbmNsdWRlIGl0YmwtY3B1Lmggb25seSBpZiBIQVZFX0lUQkxfQ1BVIGlzIGRlZmluZWQuCi0JKiBjb25maWcvdGMtbWlwcy5oOiBEZWZpbmUgSEFWRV9JVEJMX0NQVS4KLQotU3VuIEZlYiAyMyAxODowMTowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGl0Ymwtb3BzLmM6IERvbid0IGRlZmluZSBERUJVRy4KLQotU3VuIEZlYiAyMyAxNzo0OTowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGUgaXRibC10ZXN0LmMgdG8gcmVmbGVjdCBpdHMgbmV3IGxvY2F0aW9uLgotCi1TdW4gRmViIDIzIDE1OjUwOjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogaXRibC1vcHMuYzogQWRkIHRlc3QgZm9yIGl0YmxfaGF2ZV9lbnRyaWVzLgotCSogY29uZmlnL3RjLW1pcHMuYzogUmVtb3ZlIHRlc3QgZm9yIGl0YmxfaGF2ZV9lbnRyaWVzLgotCSogY29uZmlnL3RjLW1pcHMuaDogRGVmaW5lIHRjX2luaXRfYWZ0ZXJfYXJncyB0byBtaXBzX2luaXRfYWZ0ZXJfYXJncy4KLQotU3VuIEZlYiAyMyAxODoxMzoxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBSZW1vdmUgaXRibC1wYXJzZS55LCBpdGJsLWxleC5sLCBhbmQKLQlpdGJsLW9wcy5jLiAgQWRkIGl0YmwtcGFyc2UuYyBhbmQgaXRibC1sZXguYy4KLQkoTEVYLCBMRVhGTEFHUyk6IERlZmluZS4KLQkqIGl0Ymwtb3BzLmMgKGFwcGVuZF9pbnNuc19hc19tYWNyb3MpOiBSZW1vdmUgYm9ndXMgQVNTRVJULgotCi1TYXQgRmViIDIyIDIxOjI1OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogaXRibC1wYXJzZS55OiBGaXggaW5kZW50YXRpb24gbWlzdGFrZXMgZnJvbSBpbmRlbnQgcHJvZ3JhbS4KLQkqIGl0YmwtbGV4Lmw6IEZpeCBpbmRlbnRhdGlvbiBtaXN0YWtlcyBmcm9tIGluZGVudCBwcm9ncmFtLgotCSogaXRibC1vcHMuaDogQWRkIGluY2x1ZGUgZm9yIGFuc2lkZWNsLmguCi0JQWRkIFBBUkFNUyBhcm91bmQgZnVuY3Rpb24gYXJndW1lbnRzLgotCUFkZCBkZWNsYXJhdGlvbiBmb3IgaXRibF9oYXZlX2VudHJpZXMuCi0JKiBpdGJsLW9wcy5jOiBBZGQgUEFSQU1TIGFyb3VuZCBmdW5jdGlvbiBhcmd1bWVudHMuCi0JKiBNYWtlZmlsZS5pbjogQWRkIGl0YmwgYnVpbGQgcnVsZXMuCi0JQWRkIGRlcGVuZGFuY2llcyBmb3IgaXRibCBmaWxlcyB0byBtaXBzIHRhcmdldC4KLQkqIGFzLmM6IEFkZCBpdGJsIHN1cHBvcnQuCi0JQWRkIG5ldyBvcHRpb24gIi0taW5zdHRibCIgZm9yIGR5bmFtaWNhbGx5IGV4dGVuZGluZyBpbnN0cnVjdGlvbiBzZXQuCi0JKiBhcy5oOiBEZWNsYXJlIGluc3R0YmxfZmlsZV9uYW1lOwotCXRoZSBuYW1lIG9mIGZpbGUgZGVmaW5pbmcgZXh0ZW5zaW9ucyB0byB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gc2V0IAotCSogY29uZmlndXJlLmluLCBjb25maWd1cmU6IEFkZCBpdGJsLXBhcnNlLm8sIGl0YmwtbGV4Lm8sIGFuZCAKLQlpdGJsLW9wcy5vIHRvIGV4dHJhX29iamVjdHMgZm9yIG1pcHMgY29uZmlndXJhdGlvbi4KLQlBZGQgaW5jbHVkZSBmaWxlIGxpbmsgZnJvbSBpdGJsLWNwdS5oIHRvIAotCWNvbmZpZy9pdGJsLSR7dGFyZ2V0X2NwdV90eXBlfS5oLgotCSogY29uZmlnL3RjLW1pcHMuYzogQWxsb3cgY29weiBpbnN0cnVjdGlvbnMuCi0JQWRkIG5vdGVzIGZvciBmdXR1cmUgYWRkaXRpb25zIHRvIHRoZSBpdGJsIHN1cHBvcnQuCi0JQWRkIGRlYnVnIG1hY3Jvcy4KLQkobWFjcm8pOiBDYWxsIGl0YmxfYXNzZW1ibGUgdG8gYXNzZW1ibGUgaXRibCBpbnN0cnVjdGlvbnMuCi0JU2VlIGlmIGFuIHVua25vd24gcmVnaXN0ZXIgaXMgc3BlY2lmaWVkIGluIGFuIGl0YmwgZW50cnkuCi0KLVNhdCBGZWIgMjIgMjA6NTM6MDEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKENQVSBiYWNrZW5kKTogRml4IHR5cG8gaW4gbWRfc2VjdGlvbl9hbGlnbgotCWRlc2NyaXB0aW9uLgotCSogY29uZmlnL3RjLXRpYzgwLmggKE5FRURfRlhfUl9UWVBFKTogRGVmaW5lLgotCSogY29uZmlnL3RjLXRpYzgwLmMgKGZpbmRfb3Bjb2RlKTogQWRkIGNvZGUgdG8gc3VwcG9ydCBPX3N5bWJvbAotCW9wZXJhbmRzLgotCShidWlsZF9pbnNuKTogR3JhYiBhIGZyYWcgZWFybHkgc28gd2UgY2FuIHVzZSB0aGUgYWRkcmVzcyBpbgotIAlmaXh1cHMuICBUYWtlIG9uZSdzIGNvbXBsZW1lbnQgb2YgQklUTlVNIHZhbHVlcyBiZWZvcmUgaW5zZXJ0aW9uCi0gCWluIG9wY29kZS4gIEFkZCBjb2RlIHRvIHN1cHBvcnQgT19zeW1ib2wgb3BlcmFuZHMuCi0JKG1kX2FwcGx5X2ZpeCk6IFJlcGxhY2UgdW5pbXBsZW1lbnRlZCB3YXJuaW5nIHdpdGggaW1wbGVtZW50YXRpb24uCi0JKG1kX3BjcmVsX2Zyb20pOiBEaXR0by4KLQkodGNfY29mZl9maXgycnR5cGUpOiBEaXR0by4KLQotRnJpIEZlYiAyMSAxNDozNDozMSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBOZXcgZnVuY3Rpb24uIAotCSogY29uZmlnL3RjLWQzMHYuaDogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLgotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogUmV0dXJuIDAgaWYKLSAgICAgICAgcmVsb2NhdGlvbiBpcyBpbiBkaWZmZXJlbnQgc2VjdGlvbi4KLQotRnJpIEZlYiAyMSAxMDowODoyNSAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIHRjLW1pcHMuYyAobWlwc19pcCk6IElmIGNvbmZpZ3VyZWQgZm9yIGFuIGVtYmVkZGVkIEVMRiBzeXN0ZW0sCi0JZG9uJ3Qgc2V0IHRoZSBzZWN0aW9uIGFsaWdubWVudCB0byAyKio0LgotCi1GcmkgRmViIDIxIDExOjU1OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobGluZV9jb21tZW50X2NoYXJzKTogQWRkICcqJy4KLQotCSogYXBwLmMgKExFWF9JU19UV09DSEFSX0NPTU1FTlRfMk5EKTogRG9uJ3QgZGVmaW5lLgotCShkb19zY3J1Yl9iZWdpbik6IERvbid0IHNldCBsZXhbJyonXS4KLQkoZG9fc2NydWJfY2hhcnMpOiBXaGVuIGhhbmRsaW5nIExFWF9JU19UV09DSEFSX0NPTU1FTlRfMVNULCBkb24ndAotIAljaGVjayBmb3IgTEVYX0lTX1RXT0NIQVJfQ09NTUVOVF8yTkQuICBJbnN0ZWFkLCBqdXN0IGNoZWNrIGZvcgotCWEgbGl0ZXJhbCAnKicuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGVtPXN2cjQgZm9yIG02OGstKi1zeXN2NCouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvdGUtc3ZyNC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfY29tbWVudF9jaGFycyk6IE9ubHkgaW5jbHVkZSBgIycgaWYKLQlURV9TVlI0IG9yIFRFX0RFTFRBLgotCi1UaHUgRmViIDIwIDIyOjI0OjM5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfY29udmVydF9mcmFnKTogQ3JlYXRlIGEgZml4dXAgZm9yIHRoZQotCXNob3J0IGNvbmRpdGlvbmFsIGJyYW5jaCBhcm91bmQgYSBsb25nIHVuY29uZGl0aW9uYWwgYnJhbmNoLgotCi1UaHUgRmViIDIwIDEzOjU2OjAwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2xuIFtib3RoIHZlcnNpb25zXSk6IENhbGwKLQluZXdfbG9naWNhbF9saW5lLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGZpeF9uZXdfYXJtKTogVXNlIG1ha2VfZXhwcl9zeW1ib2wgdG8gaGFuZGxlIGEKLQljb21wbGV4IGV4cHJlc3Npb24uCi0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBJZiBib3RoIGxlZnQgYW5kIHJpZ2h0Ci0Jb3BlcmFuZHMgYXJlIHVuZGVmaW5lZCwgd2FybiBhYm91dCBib3RoIG9mIHRoZW0uCi0KLVdlZCBGZWIgMTkgMDA6NTM6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfcHNldWRvX3RhYmxlKTogQWRkICJzeW12ZXIiLgotCShvYmpfZWxmX3N5bXZlcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBjb25maWcvb2JqLWVsZi5oIChPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyk6IENvcHkgdGhlIHN0X290aGVyCi0JZmllbGQuCi0KLQkqIHdyaXRlLmMgKHJlbGF4X3NlZ21lbnQpOiBNYWtlIHR5cGUgYW5kIHByaW50ZiBmb3JtYXQgYWdyZWUuCi0KLQkqIHJlYWQuYyAoZ2V0X2xpbmVfc2IpOiBEb24ndCBlbmQgdGhlIGxpbmUgb24gYSBzZW1pY29sb24gaW5zaWRlIGEKLQlzdHJpbmcuCi0KLVR1ZSBGZWIgMTggMTg6NDI6NTEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMsIGNvbmZpZy90Yy1kMzB2Lmg6IE5ldyBmaWxlcy4KLQotIAkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQkKLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGNhc2UgZm9yIGQzMHYuCi0KLVN1biBGZWIgMTYgMTc6NDc6MjkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChtZF9vcGVyYW5kKTogRGVmaW5lIHdpdGggYSBudWxsIGV4cGFuc2lvbiwKLQlsaWtlIGFsbCB0aGUgb3RoZXIgdGFyZ2V0cy4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoQ1BVIGJhY2tlbmQpOiBBZGQgbWlzc2luZyB3b3JkIGluIAotCW1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IGRlc2NyaXB0aW9uLiAgRml4IHR5cG8gaW4gbWRfY29udmVydF9mcmFnCi0JZGVzY3JpcHRpb24uCi0JKiBjb25maWcvdGMtdGljODA6IE1pbm9yIGNvbW1lbnQgYWRkaXRpb25zL2NoYW5nZXMuCi0JCi1GcmkgRmViIDE0IDE4OjA5OjU5IDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKExPQ0FMX0xBQkVMKTogTWFjcm8gcmVkZWZpbmVkIGlmIFRFX0RFTFRBLgotCSh0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUpOiBNYWNybyBkZWZpbmVkIGlmIFRFX0RFTFRBLgotIAkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9kZWYpOiBVc2UKLQl0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgaWYgZGVmaW5lZC4KLQkob2JqX2NvZmZfdGFnLCBvYmpfY29mZl92YWwpOiBMaWtld2lzZS4KLQkqIGV4cHIuYyAob3BlcmFuZCk6IFJlamVjdCAnficgYXMgb3BlcmF0b3IgaWYgaXNfbmFtZV9iZWdpbm5lci4KLQotRnJpIEZlYiAxNCAxNzoyNDo0OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBub3RlcyBmcm9tIFBldGVyIEVyaWtzc29uIDxwZXRlckBpZm0ubGl1LnNlPi4gIFRoZSB0YXJnZXQKLQlkb2VzIG5vdCBhY3R1YWxseSB3b3JrLCB0aG91Z2g6Ci0JKiBjb25maWd1cmUuaW4gKGkzODYtc2VxdWVudC1ic2QqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy90Yy1keW5peC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1pMzg2Lmg6IERlZmluZSBUQVJHRVRfRk9STUFUIGlmIFRFX0RZTklYLgotCi0JKiByZWFkLmMgKGRvX2FsaWduKTogQWRkIG1heCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JUmVtb3ZlIHVzZWxlc3Mgc3RhdGljIHZhcmlhYmxlcy4KLQkoc19hbGlnbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uICBEbyBjb21tb24gcG9ydGlvbiBvZgotCXNfYWxpZ25fYnl0ZXMgYW5kIHNfYWxpZ25fcHR3by4KLQkoc19hbGlnbl9ieXRlcywgc19hbGlnbl9wdHdvKTogSnVzdCBjYWxsIHNfYWxpZ24uCi0JKiBmcmFncy5jIChmcmFnX2FsaWduKTogQWRkIG1heCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGZyYWdfYWxpZ25fcGF0dGVybik6IExpa2V3aXNlLgotCSogZnJhZ3MuaCAoZnJhZ19hbGlnbiwgZnJhZ19hbGlnbl9wYXR0ZXJuKTogVXBkYXRlIGRlY2xhcmF0aW9ucy4KLQkqIHdyaXRlLmMgKHJlbGF4X3NlZ21lbnQpOiBMaW1pdCBhbGlnbm1lbnQgY2hhbmdlIHRvIGZyX3N1YnR5cGUuCi0JRml4IHNvbWUgdHlwZXMgdG8gYmUgYWRkcmVzc1QuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc2l6ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWllZWUuYyAoc2l6ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtZDEwdi5oIChtZF9kb19hbGlnbik6IEFkZCBtYXggcGFyYW1ldGVyLgotCSogY29uZmlnL3RjLWkzODYuaCAobWRfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1tODhrLmggKG1kX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbTg4ay5jIChtODhrX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc2guaCAobWRfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IExpa2V3aXNlLgotCSogYXMuaDogSW1wcm92ZSBjb21tZW50cyBvbiByc19hbGlnbiBhbmQgcnNfYWxpZ25fY29kZS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBuZXcgYWxpZ25tZW50IGFyZ3VtZW50cy4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoRnJhZ3MpOiBEb2N1bWVudCB1c2Ugb2YgZnJfc3VidHlwZSBmaWVsZCBmb3IKLQlyc19hbGlnbiBhbmQgcnNfYWxpZ25fY29kZS4KLQotRnJpIEZlYiAxNCAxNTo1NjowNiAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogQ2hhbmdlZCBvcGNvZGUgcGFyc2luZy4KLQotVGh1IEZlYiAxMyAyMDowMjoxNiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3t0Yy1hbHBoYS5oLCB0Yy1kMTB2LmgsIHRjLWdlbmVyaWMuaCwgdGMtaTk2MC5oLAotCXRjLW1uMTAyMDAuaCwgdGMtbW4xMDMwMC5oLCB0Yy1zaC5oLCB0Yy12YXguaCwgdGMtdzY1Lmh9OgotCUFkZCBkZWZhdWx0IGRlZmluaXRpb24gb2YgemVybyBmb3IgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4uCi0JKiBjb25maWcve3RjLWFybS5oLCB0Yy1ocHBhLmgsIHRjLWkzODYuaCwgdGMtbWlwcy5oLCB0Yy1uczMyay5oLAotIAl0Yy1wcGMuaCwgdGMtc3BhcmMuaH06IE1vdmUgZGVmaW5pdGlvbiBvZiBUQVJHRVRfQllURVNfQklHX0VORElBTgotCXRvIGEgbG9jYXRpb24gY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIHRoZSB0YXJnZXQgaW5jbHVkZSBmaWxlcy4KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IFJlbW92ZSBtaXNsZWFkaW5nIGNvbW1lbnQuCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKENQVSBiYWNrZW5kKTogQWRkIGRlc2NyaXB0aW9uIG9mIGZ1bmN0aW9uCi0JbWRfdW5kZWZpbmVkX3N5bWJvbC4KLQkqIGNvbmZpZy90Yy10aWM4MC5jOiBBZGQgY29kZSB0byBpbnNlcnQgcHJlZGVmaW5lZCBzeW1ib2xzIGludG8gdGhlCi0Jc3ltYm9sIHRhYmxlIHNvIHRoZXkgY2FuIGJlIHBhcnNlZCBieSB0aGUgc3RhbmRhcmQgZXhwcmVzc2lvbiBwYXJzZXIuCi0JUmVtb3ZlIGN1c3RvbSBjb2RlIHRoYXQgdXNlIHRvIHBhcnNlIHRoZW0uCi0JKiBjb25maWcvdGMtdGljODAuaDogTW92ZSBkZWZpbml0aW9uIG9mIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0JdG8gYSBsb2NhdGlvbiBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgdGhlIHRhcmdldCBpbmNsdWRlIGZpbGVzLgotCQotVGh1IEZlYiAxMyAyMTo0NDoxOCAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogYXMuaDogR05VIGMgcHJvdmlkZXMgdW5saW5rKCkgZnVuY3Rpb24uCi0KLQlVbmlmeSBzZWN0aW9uIGhhbmRsaW5nIG9uIG9wZW5WTVMvQWxwaGE6Ci0JKiBjb25maWcvdGMtYWxwaGEuYyhzX2FscGhhX2xpbmspOiBSZW1vdmUuCi0JKHNfYWxwaGFfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQlSZW1vdmUgY2FzZS1oYWNraW5nIG9mIHN5bWJvbHMKLQlBZGQgLmNvZGVfYWRkcmVzcyBwc2V1ZG8tb3AuCi0JKEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUik6IE5ldyByZWxvY2F0aW9uLgotCShzX2FscGhhX2NvZGVfYWRkcmVzcyk6IE5ldyBmdW5jdGlvbi4KLQkoYWxwaGFfY3RvcnNfc2VjdGlvbiwgYWxwaGFfZHRvcnNfc2VjdGlvbik6IE5ldyBzZWN0aW9ucyBmb3IgQysrCi0Jc3RhdGljIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycy4KLQlBZGQgZGVidWcgY29kZSBmb3IgY3Jhc2ggZGVidWdzLCB0byBiZSByZW1vdmVkIHdoZW4gdHJhY2ViYWNrIGNvZGUKLQlpcyBhZGRlZCB0byBvYmplY3QgY29kZS4KLQkoc19hbHBoYV9uYW1lKTogTmV3IGZ1bmN0aW9uIGZvciAubmFtZSBwc2V1ZG8tb3AuCi0JKGFscGhhX3ByaW50X3Rva2VuKTogTmV3IGZ1bmN0aW9uIHRvIHByaW50IHRva2VuIGV4cHJlc3Npb25zIHdpdGgKLQlhbHBoYSBzcGVjaWZpYyBleHRlbnNpb25zLgotCi0JKiBtYWtlZmlsZS52bXM6IEFsbG93IGNvbXBpbGF0aW9uIHdpdGggY3VycmVudCBnY2Mgc25hcHNob3QuCi0KLVRodSBGZWIgMTMgMTY6Mjk6MDQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoVEVYSTJEVkkpOiBTZXQgdG8ganVzdCBuYW1lIG9mIHByb2dyYW0uCi0JKERWSVBTKTogU2V0IHRvIGR2aXBzLgotCShwcywgYXMucHMsIGdhc3AucHMpOiBOZXcgdGFyZ2V0cy4KLQkoaW50ZXJuYWxzLmluZm8sIGdhc3AuZHZpLCBpbnRlcm5hbHMuZHZpKTogU2V0IGJvdGggVEVYSU5QVVRTCi0gCWFuZCBNQUtFSU5GTyBlbnYgdmFyaWFibGVzLgotCShpbnRlcm5hbHMucHMpOiBVc2UgRFZJUFMgbWFjcm8uCi0JKGNsZWFuKTogUmVtb3ZlIGNvcmUgYW5kIGJhY2t1cCBmaWxlcy4KLQkoZGlzdGNsZWFuKTogUmVtb3ZlIHRlbXBvcmFyeSBmaWxlcyBmcm9tIGJ1aWxkaW5nIGludGVybmFscy4KLQkoY2xlYW4tZHZpKTogRGl0dG8uCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKEZyYWdzKTogRml4IHR5cG8uCi0JKEdBUyBwcm9jZXNzaW5nKTogRGl0dG8uCi0JKENQVSBiYWNrZW5kKTogRGl0dG8uCi0JKiBlY29mZi5jIChpbml0X2ZpbGUpOiBVc2UgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gdmFsdWUgZGlyZWN0bHkuCi0JKiBtcHctY29uZmlnLmluOiBEZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gYXMgMS4KLQkqIHJlYWQuYzogUmVtb3ZlIHVnbHkgaGFjayB0aGF0IGRlYWx0IHdpdGggY29uZmlnIGZpbGVzIG5vdAotCWNvcnJlY3RseSBkZWZpbmluZyBUQVJHRVRfQllURVNfQklHX0VORElBTi4KLQkodGFyZ2V0X2JpZ19lbmRpYW4pOiBVc2UgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gZGlyZWN0bHkuCi0JKiBjb25maWcvYXJtLWJpZy5tdDogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIHRvIDEuCi0JKiBjb25maWcvYXJtLWxpdC5tdDogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIHRvIDAuCi0JKiBjb25maWcvbWlwcy1iaWcubXQ6IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiB0byAxLgotCSogY29uZmlnL21pcHMtbGl0Lm10OiBEZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gdG8gMC4KLQkqIGNvbmZpZy9wcGMtbGl0Lm10OiBEZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gdG8gMS4KLQkqIGNvbmZpZy9wcGMtc29sLm10OiBSZXBsYWNlIFRBUkdFVF9CWVRFU19MSVRUTEVfRU5ESUFOCi0Jd2l0aCBUQVJHRVRfQllURVNfQklHX0VORElBTiBkZWZpbmVkIHRvIDAuCi0JKiBjb25maWcvdGMtYXJtLmg6IFJlbW92ZSB1c2Ugb2YgVEFSR0VUX0JZVEVTX0xJVFRMRV9FTkRJQU4KLQlhbmQgc2ltcGxpZnkuICBUZXN0IHZhbHVlIG9mIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLCBub3QganVzdAotCXdoZXRoZXIgaXQgaXMgZGVmaW5lZCBvciBub3QuCi0JKiBjb25maWcvdGMtbWlwcy5oOiBSZW1vdmUgdXNlIG9mIFRBUkdFVF9CWVRFU19MSVRUTEVfRU5ESUFOLgotCSogY29uZmlnL3RjLXBwYy5oOiBSZW1vdmUgdXNlIG9mIFRBUkdFVF9CWVRFU19MSVRUTEVfRU5ESUFOCi0JYW5kIHNpbXBsaWZ5LiBUZXN0IHZhbHVlIG9mIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLCBub3QganVzdAotCXdoZXRoZXIgaXQgaXMgZGVmaW5lZCBvciBub3QuCi0JKiBjb25maWcvdGljODAuaCAoVEFSR0VUX0ZPUk1BVCk6IERlZmluZSB0byBjb2ZmLXRpYzgwLgotCShUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZSB0byAwLgotCi1UaHUgRmViIDEzIDE0OjQwOjE2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IENvcnJlY3QgdGV4dCBpbiBhc19mYXRhbCBlcnJvciBtZXNzYWdlLAotCWJmZF9wZXJmb3JtX3JlbG9jYXRpb24gLT4gYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4KLQotVGh1IEZlYiAxMyAxNDo0ODowMyAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChMRVhfVElMREUpOiBEZWZpbmUgaWYgVEVfREVMVEEuCi0JKiByZWFkLmMgKExFWF9USUxERSk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkobGV4X3R5cGUpOiBVc2UgTEVYX1RJTERFLgotCSogZXhwci5jIChnZXRfc3ltYm9sX2VuZCk6IENoZWNrIGZpcnN0IGNoYXIgd2l0aCBpc19uYW1lX2JlZ2lubmVyLAotCW5vdCBpc19wYXJ0X29mX25hbWUuCi0KLVRodSBGZWIgMTMgMTE6NDA6NTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2hvd191c2FnZSk6IEFkZCBtaXNzaW5nIGJhY2tzbGFzaCBhdCBlbmQKLQlvZiBjb250aW51ZWQgbGluZS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBDb3JyZWN0IGJhc2UgYWRkcmVzcwotCWZvciBhbiBleHRlbmRlZCBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbi4KLQkobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHByZXZfbm9wX2ZyYWcpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwcmV2X25vcF9mcmFnX2hvbGRzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHJldl9ub3BfZnJhZ19yZXF1aXJlZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHByZXZfbm9wX2ZyYWdfc2luY2UpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShhcHBlbmRfaW5zbik6IElmIHdlIGFyZW4ndCByZW9yZGVyaW5nLCBhbmQgcHJldl9ub3BfZnJhZyBpcyBub3QKLQlOVUxMLCBhbmQgd2UgZG9uJ3QgbmVlZCBhbnkgbm9wcywgdGhlbiBkZWNyZWFzZSB0aGUgc2l6ZSBvZgotCXByZXZfbm9wX2ZyYWcuICBEb24ndCBpbnNlcnQgbm9wcyBiZWNhdXNlIG9mIGluc3RydWN0aW9ucyBpbgotCW5vcmVvcmRlciBzZWN0aW9ucy4gIFJlbWVtYmVyIHdoZXRoZXIgdGhlIHByZXZpb3VzIGluc3RydWN0aW9ucwotCXdoZXJlIGluIG5vcmVvcmRlciBzZWN0aW9ucyBldmVuIHdoZW4gbm90IHJlb3JkZXJpbmcuCi0JKG1pcHNfbm9fcHJldl9pbnNuKTogQWRkIHByZXNlcnZlciBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4gIFJlZmVyIHByZXZfbm9wX2ZyYWcgdmFyaWFibGVzIHdoZW4gYXBwcm9wcmlhdGUuCi0JKG1pcHNfZW1pdF9kZWxheXMpOiBTZXQgdXAgcHJldl9ub3BfZnJhZy4KLQkoc19taXBzc2V0KTogQ2xlYXIgcHJldl9ub3BfZnJhZyBpZiByZW9yZGVyaW5nLgotCi1XZWQgRmViIDEyIDE0OjM2OjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBSZW1vdmUgdXNlbGVzcyBjb2RlIHdoaWNoCi0JaGFuZGxlZCBzd2FwcGluZyBhIG1pcHMxNiBqdW1wIHdpdGggYSBtaXBzMTYgaW5zdHJ1Y3Rpb24gd2l0aCBhCi0JcmVsb2MuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BhcnNlX29wdGlvbik6IFdoZW4gZGVidWdnaW5nLCBzZXQKLQltaXBzX29wdGltaXplIHRvIDEsIG5vdCAwLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfaXApOiBIYW5kbGUgYW4gZXh0ZW5kIG9wZXJhbmQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG15X2dldEV4cHJlc3Npb24pOiBJbiBtaXBzMTYgbW9kZSwgaWYgaXQgbG9va3MKLQlsaWtlIHRoZSBleHByZXNzaW9uIHdhcyBiYXNlZCBvbiBgLicsIGFkanVzdCB0aGUgdmFsdWUgb2YgdGhlCi0Jc3ltYm9sLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IFdhcm4gYWJvdXQgYW4gYXR0ZW1wdCB0byBwdXQgYW4KLSAJZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gaW4gYSBkZWxheSBzbG90IHdoZW4gbm90IHJlb3JkZXJpbmcuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IFdhcm4gaWYgYW4gZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gYXBwZWFycyBpbiBhCi0JZGVsYXkgc2xvdC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19wc2V1ZG9fdGFibGUpOiBBZGQgImluc24iLgotCShzX2luc24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogZG9jL2MtbWlwcy50ZXhpOiBEb2N1bWVudCAuaW5zbi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBBZGQgdGhlIGdlbmVyYWwgcmVnaXN0ZXJzIHRvIHRoZQotCXN5bWJvbCB0YWJsZS4KLQkobWlwczE2X2lwKTogRmlyc3QgcGFyc2UgdGhlIGV4cHJlc3Npb24sIGFuZCB0aGVuIHNlZSB3aGV0aGVyIGl0Ci0JY2FtZSB1cCB3aXRoIGEgcmVnaXN0ZXIsIHJhdGhlciB0aGFuIHRyeWluZyB0byBmaXJzdCBzZWUgd2hldGhlcgotCXdlIGFyZSBsb29raW5nIGF0IGEgcmVnaXN0ZXIuCi0KLVR1ZSBGZWIgMTEgMTU6MTM6MzkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jOiBOdW1lcm91cyBjaGFuZ2VzIGFuZCBhZGRpdGlvbnMgdG8gZmxlc2gKLQlvdXQgZnVuY3Rpb25zIHRoYXQgd2VyZSBwcmV2aW91c2x5IGp1c3Qgc3R1YnMsIGFuZCBmaXggc29tZQotCXByb2JsZW1zIGZvdW5kIHVzaW5nIHRoZSBuZXcgVEljODAgdGVzdHN1aXRlIGNhc2VzLgotCi1UdWUgRmViIDExIDE1OjUyOjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2lwKTogSGFuZGxlICVncHJlbCBtb2RpZmllci4KLQkobWRfYXBwbHlfZml4KTogSGFuZGxlIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUwuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogT3V0cHV0IGp1bXAgaW5zdHJ1Y3Rpb24gYXMgYQotCXBhaXIgb2YgMiBieXRlIGluc3RydWN0aW9ucywgcmF0aGVyIHRoYW4gYXMgYSBzaW5nbGUgNCBieXRlCi0JaW5zdHJ1Y3Rpb24uCi0KLU1vbiBGZWIgMTAgMjI6MDY6MDAgMTk5NyAgRGF3biBQZXJjaGlrICAoZGF3bkBjeWdudXMuY29tKQotCi0JKiBpdGJsLW9wcy5jLCBpdGJsLWxleC5sLCBpdGJsLXBhcnNlLnksIGl0Ymwtb3BzLmgsCi0JY29uZmlnL2l0YmwtbWlwcy5oOiBBZGQgY29weXJpZ2h0IG1lc3NhZ2UgYW5kIGZpeCBpbmRlbnRhdGlvbi4KLQotTW9uIEZlYiAxMCAxODowOTowMCAxOTk3ICBEYXduIFBlcmNoaWsgIChkYXduQGN5Z251cy5jb20pCi0KLQkqIGl0Ymwtb3BzLmM6IE5ldyBmaWxlLiAgQWRkIHN1cHBvcnQgZm9yIGR5bmFtaWNhbGx5IHJlYWQgCi0JaW5zdHJ1Y3Rpb24gcmVnaXN0ZXJzLCBvcGNvZGVzIGFuZCBmb3JtYXRzLiAgQnVpbGQgaW50ZXJuYWwgdGFibGUgCi0JZm9yIG5ldyBpbnN0cnVjdGlvbnMgYW5kIHByb3ZpZGUgY2FsbGJhY2tzIGZvciBhc3NlbWJsZXIgYW5kIAotCWRpc2Fzc2VtYmxlci4KLQkqIGl0YmwtbGV4LmwsIGl0YmwtcGFyc2UueTogTGV4IGFuZCB5YWNjIHBhcnNlcnMgZm9yIGluc3RydWN0aW9uIAotCXNwZWMgdGFibGUuCi0JKiBpdGJsLW9wcy5oOiBOZXcgZmlsZS4gIEhlYWRlciBmaWxlIGZvciBpdGJsIHN1cHBvcnQuCi0JKiBjb25maWcvaXRibC1taXBzLmg6IE5ldyBmaWxlLiAgTWlwcyBzcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IKLQlpdGJsIHN1cHBvcnQuCi0KLUZyaSBGZWIgIDcgMDk6NTI6MzQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9hc3NlbWJsZSk6IElmIGEgY29uc3RhbnQgb3BlcmFuZCB3b24ndAotCWZpdCBpbnRvIHRoZSBjb25zdGFudCBmaWVsZCBvZiBhIHJlbGF4YWJsZSBvcGVyYW5kLCB0aGVuIGl0IGRvZXMKLQlub3QgbWF0Y2guCi0KLVRodSBGZWIgIDYgMjA6MDg6MTIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IFRyZWF0Ci0JYSBqc3IgdGFyZ2V0IGluIGEgZGlmZmVyZW50IHNlY3Rpb24ganVzdCBsaWtlIGEganNyIHRvCi0JYW4gdW5kZWZpbmVkIHRhcmdldC4KLQotVGh1IEZlYiAgNiAxNjo1Mjo1NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgcmVsb2NhdGlvbnMKLQlhZ2FpbnN0IGFueSBtaXBzMTYgc3ltYm9scywgbm90IGp1c3QgZXh0ZXJuYWxseSB2aXNpYmxlIG9uZXMuCi0JKG1kX2FwcGx5X2ZpeCk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi1XZWQgRmViICA1IDExOjExOjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2lwKTogQWNjZXB0IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBpbgotCXRoZSBvcGVyYW5kIG9mIHRoZSBleGl0IGluc3RydWN0aW9uLgotCi1UdWUgRmViICA0IDE0OjEyOjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IElmIHdlIGxlYXZlIGFuIGVxdWF0ZWQgc3ltYm9sCi0JYXMgT19zeW1ib2wsIGNvcHkgb3ZlciB0aGUgc2VnbWVudC4KLQotTW9uIEZlYiAgMyAxMjozNTo1NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6IElmIHdlIGFyZW4ndCBhZGp1c3RpbmcgdGhpcwotCWZpeHVwIHRvIGJlIGFnYWluc3QgdGhlIHNlY3Rpb24gc3ltYm9sLCBhZGp1c3QgdGhlIHZhbHVlCi0JYWNjb3JkaW5nbHkuCi0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBEb24ndCBjaGFuZ2UgWF9hZGRfbnVtYmVyIGZvcgotCWFuIGVxdWF0ZWQgc3ltYm9sLgotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogQXZvaWQgbG9vcGluZyBvbiBlcXVhdGVkIHN5bWJvbHMuCi0JQWRqdXN0IGZ4X29mZnNldCBieSBYX2FkZF9udW1iZXIgZm9yIGVhY2ggc3ltYm9sLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBBdm9pZCBsb29waW5nIG9uIGVxdWF0ZWQKLQlzeW1ib2xzLgotCShmaXh1cF9zZWdtZW50KTogQWRkIGEgbG9vcCB0byB0cmFjayBkb3duIGVxdWF0ZWQgc3ltYm9scyBhbmQKLQlhZGp1c3QgZnhfb2Zmc2V0IGFwcHJvcHJpYXRlbHkuCi0KLUZyaSBKYW4gMzEgMTU6MjE6MDIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9yZWxheF90YWJsZSk6IEFkZCBlbnRyaWVzIHRvIGFsbG93Ci0Jam1wIC0+IGJyYSByZWxheGluZy4KLQkobWRfY29udmVydF9mcmFnKTogSGFuZGxlIGptcC0+YnJhIHJlbGF4aW5nLgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSBqbXAtPmJyYSByZWxheGluZy4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBMaWtld2lzZS4KLQotRnJpIEphbiAzMSAxMzoxNTowNSAxOTk3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfYWxpZ25fY29kZSk6IEFkZCBjb21tZW50cyBleHBsYWluaW5nIHRoZQotCW5vcCBpbnN0cnVjdGlvbnMuCi0KLUZyaSBKYW4gMzEgMTA6NDY6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoZW5mb3JjZV9hbGlnbmVkX2RhdGEpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzcGFyY19jb25zX2FsaWduKTogRG9uJ3QgZG8gYW55dGhpbmcgdW5sZXNzIGVuZm9yY2VfYWxpZ25lZF9kYXRhCi0JaXMgc2V0LgotCShtZF9sb25nb3B0cyk6IEFkZCAiZW5mb3JjZS1hbGlnbmVkLWRhdGEiLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiAtLWVuZm9yY2UtYWxpZ25lZC1kYXRhLgotCSogZG9jL2Mtc3BhcmMudGV4aSAoU3BhcmMtQWxpZ25lZC1EYXRhKTogTmV3IG5vZGU7IGRvY3VtZW50Ci0JZW5mb3JjZS1hbGlnbmVkLWRhdGEuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcHNldWRvX3RhYmxlKTogSWYgT0JKX1hDT0ZGLCBhZGQgImxvbmciLAotIAkid29yZCIsIGFuZCAic2hvcnQiLgotCShwcGNfeGNvZmZfY29ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIHdyaXRlLmMgKHJlbGF4X3NlZ21lbnQpOiBHaXZlIGFuIGVycm9yIGlmIGEgLnNwYWNlIHN5bWJvbCBpcwotCWNvbW1vbiBvciB1bmRlZmluZWQuCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogRG9uJ3QgaGFuZGxlIG1yaV9wZW5kaW5nX2FsaWduIGlmCi0JdGhlIGhhbmRsZXIgaXMgc19nbG9ibCBvciBzX2lnbm9yZS4KLQotVGh1IEphbiAzMCAxMTo0Njo1OSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZmluZF9vcGNvZGUpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlICJudW1vcHMiLgotCSogY29uZmlnL3RjLXRpYzgwLmM6IE1hbnkgYWRkaXRpb25zIHRvIHByZXZpb3VzIHBsYWNlaG9sZGVyIGZpbGUuCi0JKiBjb25maWcvdGMtdGljODAuaDogRGl0dG8uCi0KLVRodSBKYW4gMzAgMTI6Mjg6MTggMTk5NyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2FsaWduX2NvZGUpOiBJbXByb3ZlIHRoZSBub3AgcGF0dGVybnMuCi0KLVRodSBKYW4gMzAgMTI6MDg6NDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2ZpeF9hZGp1c3RhYmxlKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLW1pcHMuaCAodGNfZml4X2FkanVzdGFibGUpOiBDYWxsIG1pcHNfZml4X2FkanVzdGFibGUuCi0JKG1pcHNfZml4X2FkanVzdGFibGUpOiBEZWNsYXJlLgotCi0JSWRlYXMgZnJvbSBTcmluaXZhcyBBZGRhZ2FybGEgPHNyaW5pdmFzQGNkb3RkLmVybmV0LmluPjoKLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogQWZ0ZXIgZG9pbmcgYW4gbXJpX3BlbmRpbmdfYWxpZ24sCi0JYWRqdXN0IHRoZSBsaW5lX2xhYmVsIGlmIHRoZXJlIGlzIG9uZS4KLQkoc19zcGFjZSk6IFNldCBtcmlfcGVuZGluZ19hbGlnbiBpZiBhbiBvZGQgbnVtYmVyIG9mIGJ5dGVzIHdlcmUKLQlvdXRwdXQuCi0KLVdlZCBKYW4gMjkgMTU6MzE6MTIgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmggKG1kX2RvX2FsaWduKTogQWRkIHRoaXMgaG9vayB0byBjYWxsCi0JZDEwdl9jbGVhbnVwKCkgd2hlbiBhICIuYWxpZ24iIGlzIGRldGVjdGVkLgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChmaW5kX29wY29kZSk6IENvcnJlY3RseSBjYWxjdWxhdGUKLQlicmFuY2ggZGlzcGxhY2VtZW50IHdoZW4gLmFsaWducyBhcmUgcHJlc2VudC4KLQotV2VkIEphbiAyOSAwOTo0MjoxMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX3JlbGF4X3RhYmxlKTogRGVmaW5lLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBJbXBsZW1lbnQuCi0JKG1kX2Fzc2VtYmxlKTogSGFuZGxlIHJlbGF4YWJsZSBvcGVyYW5kcy9pbnN0cnVjdGlvbnMgY29ycmVjdGx5LgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IEltcGxlbWVudC4KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmggKFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUpOiBEZWZpbmUuCi0KLVR1ZSBKYW4gMjggMTU6Mjc6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IEdpdmUgYW4gZXJyb3IgZm9yIGp1bXBzIHRvIGEKLQltaXNhbGlnbmVkIGFkZHJlc3MuCi0JKG1kX2FwcGx5X2ZpeCk6IE1ha2UgYSBicmFuY2ggdG8gYW4gb2RkIGFkZHJlc3MgYW4gZXJyb3IgcmF0aGVyCi0JdGhhbiBhIHdhcm5pbmcuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2NvbnZlcnRfZnJhZyk6IElmIHRoZSB1c2VyIGV4cGxpY2l0bHkKLQlyZXF1ZXN0ZWQgYW4gZXh0ZW5kZWQgb3Bjb2RlLCBwYXNzIHdhcm4gYXMgdHJ1ZSB0byBtaXBzMTZfaW1tZWQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9pcCk6IEhhbmRsZSBhIG1pc3NpbmcgZXhwcmVzc2lvbiBsaWtlCi0JYW4gZXhwbGljaXQgMCwgc28gdGhhdCBleHBsaWNpdGx5IGV4dGVuZGVkIGluc3RydWN0aW9ucyB3b3JrCi0JY29ycmVjdGx5LgotCi1Nb24gSmFuIDI3IDE3OjQxOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfc3ltYm9scyk6IERvbid0IGdlbmVyYXRlIGEgbG9jYWwgRUNPRkYKLQlzeW1ib2wgZm9yIGEgY29tbW9uIHN5bWJvbC4KLQotV2VkIEphbiAyMiAxMDozOTozOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JUGF0Y2ggcHJlc3VtZWQgdG8gaGF2ZSBiZWVuIGNoZWNrZWQgaW4gYXdoaWxlIGFnbyBidXQgd2Fzbid0LgotCU1vbiBOb3YgMjUgMTA6NDU6MTQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0JKiB3cml0ZS5jOiBEZWxldGUgImlmbmRlZiBtZF9yZWxheF9mcmFnIiBhcm91bmQgaXNfZG5yYW5nZS4KLQkocmVsYXhfc2VnbWVudCwgY2FzZSByc19vcmcpOiBNb3ZlIGNvZGUgaW5zaWRlIGJyYWNlcy4gIE1vdmUgbG9jYWxzCi0JdGFyZ2V0LGFmdGVyIGluc2lkZSB0b28uCi0JKHJlbGF4X3NlZ21lbnQsIGNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQpOiBHdXRzIG1vdmVkIHRvIC4uLgotCShyZWxheF9mcmFnKTogTmV3IGZ1bmN0aW9uLgotCUNhbGwgbWRfcHJlcGFyZV9yZWxheF9zY2FuIGlmIGRlZmluZWQuCi0KLU1vbiBKYW4gMjAgMTA6NTY6NDcgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBSZWplY3QgcGMtcmVsYXRpdmUgYWRkcmVzc2VzIGZvciB0aGUKLSAJJ3AnIG9wZXJhbmQgc3BlY2lmaWVyLgotCi1Nb24gSmFuIDIwIDEwOjM5OjM2IDE5OTcgIEouVC4gQ29ua2xpbiAgPGp0Y0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChIQVZFX0xPTkdfQlJBTkNIKTogTmV3IG1hY3JvLCByZXR1cm5zIHRydWUgZm9yCi0gCW02OGsgZmFtaWx5IGNwdXMgd2hpY2ggc3VwcG9ydCBsb25nIGJyYW5jaCBhZGRyZXNzaW5nIG1vZGVzLgotCShtNjhrX2lwLCBtZF9jb252ZXJ0X2ZyYWdfMSwgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsCi0gCW1kX2NyZWF0ZV9sb25nX2p1bXApOiBVc2UgaXQuCi0KLU1vbiBKYW4gMjAgMTI6NDI6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IERvbid0IHNldCBTRUNfQUxMT0Mgb3IgU0VDX0xPQUQgZm9yCi0JdGhlIC5yZWdpbmZvIG9yIC5NSVBTLm9wdGlvbnMgc2VjdGlvbiBpZiBjb25maWd1cmVkIGZvciBhbgotCWVtYmVkZGVkIHRhcmdldC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBEb24ndCBzZXQgaW50ZXJsb2NrcyBmb3IKLQltaXBzXzQ2NTAuCi0KLVdlZCBKYW4gMTUgMTM6NTE6NTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IE1ha2Ugc3VyZSB0aGUgc3ltYm9sIGVuZHMgd2l0aAotCXdoaXRlc3BhY2UgYmVmb3JlIGNoZWNraW5nIHdoZXRoZXIgdGhlIG5leHQgY2hhcmFjdGVyIGlzICc9Jy4KLQotVHVlIEphbiAxNCAxNTowNzoyNyAxOTk3ICBSb2JlcnQgTGlwZSA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoc2NvX2lkKTogTW92ZWQgZnJvbSBoZXJlLi4uCi0JKiBjb25maWcvb2JqLWVsZi5jIChzY29faWQpOiAuLi50byBoZXJlLiAgQWRkaW5nIHRoZSBpZGVudGlmaWVyCi0JcmVhbGx5IGlzIGFuIFNDTyBFTEYgc3BlY2lmaWMgdGhpbmcsIG5vdCBqdXN0IGEgU0NPIHg4NiBzcGVjaWZpYwotCXRoaW5nLgotCi1Nb24gSmFuIDEzIDIyOjQzOjAxIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0aWM4MC0qLSopOiBEb24ndCByZXF1aXJlICdjb2ZmJy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVGh1IEphbiAgOSAwOTowODo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogQ2hlY2sgZm9yIG92ZXJmbG93IG9mIGEgbmVnYXRpdmUgdmFsdWUKLQljb3JyZWN0bHkuCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChzdHJ1Y3QgbGFiZWxfbGluZSk6IERlZmluZS4KLQkobGFiZWxzLCBjdXJyZW50X2xhYmVsKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKG1kX2Fzc2VtYmxlKTogTWFyayBjdXJyZW50X2xhYmVsIGFzIHRleHQsIGFuZCBjbGVhciBpdC4KLQkobTY4a19mcm9iX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgotCShtNjhrX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogTmV3IGZ1bmN0aW9uLgotCShtNjhrX2Zyb2Jfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLW02OGsuaCAodGNfZnJvYl9sYWJlbCk6IERlZmluZS4KLQkobWRfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBEZWZpbmUuCi0JKHRjX2Zyb2Jfc3ltYm9sKTogRG9uJ3Qgd2FybiwganVzdCBjYWxsIG02OGtfZnJvYl9zeW1ib2wuCi0JKHRjX2Zyb2JfY29mZl9zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBXaGVuIGRlZmluaW5nIGEgbWFjcm8gaW4gTVJJIG1vZGUsCi0JZG9uJ3QgYWRkIHRoZSBzeW1ib2wgdG8gdGhlIHN5bWJvbCB0YWJsZS4KLQotVHVlIEphbiAgNyAxMToyMTo0MiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBzeW0xLXN5bTIgZml4dXBzCi0JaGVyZSBzaW5jZSBmaXh1cF9zZWdtZW50IGRvZXNuJ3QgKGxpbmtyZWxheCBpcyBzZXQpLgotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0KLU1vbiBKYW4gIDYgMTU6MTk6MzIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9hc3NlbWJsZSk6IFR3ZWFrIGZ4X29mZnNldCBmb3IgcGMtcmVsYXRpdmUKLQlyZWxvY3MuCi0KLUZyaSBKYW4gIDMgMTY6NDc6MDggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChzdHJ1Y3QgaHBwYV9maXhfc3RydWN0KTogVHdlYWsgZnhfcl9maWVsZCdzIHR5cGUKLQl0byBhdm9pZCB3YXJuaW5ncyB3aXRoIHRoZSBuYXRpdmUgSFAgY29tcGlsZXIuCi0JKGZpeF9uZXdfaHBwYSk6IFNpbWlsYXJseSBmb3IgdGhlIHJfdHlwZSBhcmd1bWVudC4KLQkocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlLCBocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbik6IEVuY2xvc2UKLQlpbiBhbiAjaWYgT0JKX0VMRiB0byBrZWVwIGdjYyAtV2FsbCBxdWlldC4KLQkobWRfYXBwbHlfZml4KTogQWx3YXlzIGluaXRpYWxpemUgInJlc3VsdCIuCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2Fzc2VtYmxlKTogR2VuZXJhdGUgcmVsb2NhdGlvbnMuCi0KLUZyaSBKYW4gIDMgMTg6MTc6MjMgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfZXZlbik6IEFkanVzdCB0aGUgYWxpZ25tZW50IG9mIHRoZSBjdXJyZW50Ci0Jc2VjdGlvbi4KLQotRnJpIEphbiAgMyAxNzoxMDozMyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2ZpbGVfc3ltYm9sKTogV2hlbiB1c2luZyBFQ09GRiBkZWJ1Z2dpbmcsCi0JcGFzcyBvbiB0aGUgbmV3IGZpbGUgaG9vay4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2ZpeF9hZGp1c3RhYmxlKTogTm90IHF1aXRlIHRoZSBzYW1lIGFzCi0JIWFscGhhX2ZvcmNlX3JlbG9jYXRpb24sIGFzIGxvY2FsIExJVEVSQUxzIGNhbiBiZSBhZGp1c3RlZCB0byBiZQotCXJlbGF0aXZlIHRvIHRoZSBzZWN0aW9uLgotCi1GcmkgSmFuICAzIDEyOjA5OjI0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHlhbmtfc3ltYm9scyk6IElmIHRjX2Zyb2JfY29mZl9zeW1ib2wgaXMKLQlkZWZpbmVkLCBjYWxsIGl0LgotCSogY29uZmlnL3RjLW02OGsuaCAodGNfZnJvYl9zeW1ib2wpOiBDaGVjayB3aGV0aGVyIHRleHQgbGFiZWwgaXMKLQlhbGlnbmVkIHRvIG9kZCBib3VuZGFyeS4KLQkodGNfZnJvYl9jb2ZmX3N5bWJvbCk6IERlZmluZS4KLQotCSogZG9jL2FzLnRleGluZm8gKFNldCk6IENoYW5nZSBwYXJlbnRoZXNpemVkIEB4cmVmIHRvIEBweHJlZi4KLQotCSogbWFjcm8uYyAobWFjcm9fZXhwYW5kX2JvZHkpOiBJbiBNUkkgbW9kZSwganVzdCBjb3B5IGEgc2luZ2xlICYuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBDYWxsIGZyYWdfZ3JvdyBiZWZvcmUgYWRkaW5nIGEKLQlQQ0lOREVYIGZyYWcuICBGcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT4uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBBY2NlcHQgJ0InIGFzIGEgc2l6ZSBmb3IgYW4KLQlpbW1lZGlhdGUgdmFsdWUuCi0JKG1kX2Fzc2VtYmxlKTogSWYgdGhlIHNpemUgaXMgJ0InLCBzZXQgZnhfc2lnbmVkLgotCShtZF9hcHBseV9maXhfMik6IFVzZSBmeF9zaWduZWQgd2hlbiBjaGVja2luZyBmb3Igb3ZlcmZsb3cuCi0KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBBZGQgZnhfc2lnbmVkIGZpZWxkLgotCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IEluaXRpYWxpemUgZnhfbm9fb3ZlcmZsb3cgYW5kCi0JZnhfc2lnbmVkIGZpZWxkcy4KLQkoZml4dXBfc2VnbWVudCk6IFVzZSBmeF9zaWduZWQgd2hlbiBjaGVja2luZyBmb3Igb3ZlcmZsb3cuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IENoZWNrIGZ4X25vX292ZXJmbG93IGFuZAotCWZ4X3NpZ25lZCB3aGVuIGNoZWNraW5nIGZvciBvdmVyZmxvdy4KLQotVGh1IEphbiAgMiAxMzozNzoyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE5PVEVTLCBOT1RFUy5jb25maWc6IFJlbW92ZWQuICBUaGVzZSBhcmUgcmFyZWx5LCBpZiBldmVyLAotCXVwZGF0ZWQsIGFuZCBhbGwgdGhlIHVzZWZ1bCBpbmZvcm1hdGlvbiBpcyBpbiBkb2MvaW50ZXJuYWxzLnRleGkuCi0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT46Ci0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENoZWNrIGZvciBjb25kaXRpb25hbCBvcGVyYXRvcnMKLQliZWZvcmUgZG9pbmcgYW4gTVJJIHBlbmRpbmcgYWxpZ25tZW50LgotCSogY29uZmlnL3RjLW02OGsuaCAobTY4a19jb25kaXRpb25hbF9wc2V1ZG9vcCk6IERlY2xhcmUuCi0JKHRjX2NvbmRpdGlvbmFsX3BzZXVkb3ApOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2NvbmRpdGlvbmFsX3BzZXVkb3ApOiBOZXcgZnVuY3Rpb24uCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKENQVSBiYWNrZW5kKTogRGVzY3JpYmUKLQl0Y19jb25kaXRpb25hbF9wc2V1ZG9vcC4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPjoKLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfcmVsMzJfZnJvbV9jbWRsaW5lKTogTmV3IHN0YXRpYwotCXZhcmlhYmxlLgotCShtZF9iZWdpbik6IENoZWNrIG02OGtfcmVsMzJfZnJvbV9jbWRsaW5lIGJlZm9yZSBzZXR0aW5nCi0JbTY4a19yZWwzMi4KLQkobTY4a19tcmlfbW9kZV9jaGFuZ2UpOiBMaWtld2lzZS4KLQkobWRfbG9uZ29wdHMpOiBBZGQgLS1kaXNwLXNpemUtZGVmYXVsdC0xNiBhbmQKLQktLWRpc3Atc2l6ZS1kZWZhdWx0LTMyLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgbmV3IG9wdGlvbnMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIG5ldyBvcHRpb25zLgotCSogZG9jL2MtbTY4ay50ZXhpIChNNjhLLU9wdHMpOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPjoKLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaW5kZXhfd2lkdGhfZGVmYXVsdCk6IE5ldyBzdGF0aWMKLQl2YXJpYWJsZS4KLQkobTY4a19pcCk6IFVzZSBtNjhrX2luZGV4X3dpZHRoX2RlZmF1bHQgdG8gc2V0IHRoZSBzaXplIG9mIGEgYmFzZQotCXJlZ2lzdGVyIHdob3NlIHNpemUgd2FzIG5vdCBnaXZlbi4KLQkobWRfbG9uZ29wdHMpOiBBZGQgLS1iYXNlLXNpemUtZGVmYXVsdC0xNiBhbmQKLQktLWJhc2Utc2l6ZS1kZWZhdWx0LTMyLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgbmV3IG9wdGlvbnMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIG5ldyBvcHRpb25zLgotCSogZG9jL2MtbTY4ay50ZXhpIChNNjhLLU9wdHMpOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQotCSogZG9jL2MtbWlwcy50ZXhpOiBNZW50aW9uIElTQSBsZXZlbCA0LCBhbmQgdGhlIC1taXBzMTYgb3B0aW9uLgotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBtaXBzLSotbGludXgqIHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IFJld3JpdGUgNjQgYml0IGhhbmRsaW5nIHRvCi0Jd29yayBpZiB2YWx1ZVQgaXMgb25seSAzMiBiaXRzLgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBUaHJvdWdob3V0LCBjaGVjayB0YXJnZXRfYmlnX2VuZGlhbiByYXRoZXIKLSAJdGhhbiBieXRlX29yZGVyLgotIAkoYnl0ZV9vcmRlcik6IFJlbW92ZS4KLQkobWlwc19pbml0X2FmdGVyX2FyZ3MpOiBSZW1vdmUuCi0JKiBjb25maWcvdGMtbWlwcy5oIChMSVRUTEVfRU5ESUFOLCBCSUdfRU5ESUFOKTogRG9uJ3QgZGVmaW5lLgotCShtaXBzX2luaXRfYWZ0ZXJfYXJncyk6IERvbid0IGRlY2xhcmUuCi0JKHRjX2luaXRfYWZ0ZXJfYXJncyk6IERvbid0IGRlZmluZS4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAodGNfZnJvYl9hZnRlcl9yZWxvY3MpOiBEZWZpbmUgaWYKLQlPQkpfTUFZQkVfRUxGLgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0JKEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TKTogTGlrZXdpc2UuCi0KLVR1ZSBEZWMgMzEgMTU6MTI6MzUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IElmIHRoaXMgaXMgc3N0LntoLHd9IG9yCi0Jc2xkLntoLHd9IGFuZCB0aGUgb3BlcmFuZCBpcyByZWxvY2F0YWJsZSwgYWRqdXN0IHRoZSBhZGVuZCBieQotCXNoaWZ0aW5nIGl0IHJpZ2h0IG9uZSBiaXQuCi0KLVR1ZSBEZWMgMzEgMTI6NTY6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENoZWNrIG1yaV9wZW5kaW5nX2FsaWduIGFmdGVyCi0JY2hlY2tpbmcgZm9yIGEgbWFjcm8uICBGcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUKLQk8cmZnQG1vbmtleXMuY29tPi4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9DRkxBR1MpOiBBZGQgLURfR05VX1NPVVJDRS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeDMpOiBSZW5hbWUgZnJvbSBtZF9hcHBseV9maXgsIGFuZAotIAlhZGQgc2VnbWVudCBhcmd1bWVudC4gIElmIE9CSl9FTEYsIHRyZWF0IGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEKLSAJc3ltYm9sIGluIGEgbGlua29uY2Ugc2VjdGlvbiBsaWtlIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGFuIGV4dGVybmFsCi0gCXN5bWJvbC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChNRF9BUFBMWV9GSVgzKTogRGVmaW5lLgotCi1Nb24gRGVjIDMwIDExOjM1OjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X21hY3JvKTogQWRkIGNhc2UgZm9yIE1fQUJTLgotCi1GcmkgRGVjIDI3IDIyOjUxOjUxIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBOT1RFUy5jb25maWcgKEltcGxlbWVudGF0aW9uKTogYXMuaCAjZGVmaW5lJ3MgIkdBUyIgbm90ICJnYXMiLAotCWluY2x1ZGVzIGNvbmZpZy5oIGluc3RlYWQgb2YgaG9zdC5oLCB0Yy5oIGluc3RlYWQgb2YgdHAuaCwgYW5kCi0JdGFyZy1lbnYuaCBpbnN0ZWFkIG9mIHRhcmdldC1lbnZpcm9ubWVudC5oLgotCUFsc28sIG9iai1mb3JtYXQuaCBpbmNsdWRlcyB0YXJnLWNwdS5oIGluc3RlYWQgb2YKLSAJdGFyZ2V0LXByb2Nlc3Nvci5oLgotCSogY29uZmlndXJlLmluIChjYXNlICR7Z2VuZXJpY190YXJnZXR9KTogQWRkIHRpYzgwLSotY29mZiBlbnRyeS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mLgotCSogY29uZmlnL29iai1jb2ZmLmggKGNvZmYvdGljODAuaCk6IEluY2x1ZGUgaWYgVENfVElDODAgZGVmaW5lZC4KLQkoVEFSR0VUX0ZPUk1BVCk6IERlZmluZSB0byAiY29mZi10aWM4MCIuCi0JKiBjb25maWcvdGMtdGljODAuYzogTmV3IGZpbGUgZm9yIFRJYzgwIHN1cHBvcnQuCi0JKiBjb25maWcvdGMtdGljODAuaDogTmV3IGZpbGUgZm9yIFRJYzgwIHN1cHBvcnQuCi0JCi1GcmkgRGVjIDI3IDExOjQyOjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm8gKE0pOiBNZW50aW9uIGV4cGxpY2l0bHkgdGhhdCAtTSBjaGFuZ2VzIG1hY3JvCi0JaGFuZGxpbmcuCi0KLVRodSBEZWMgMTkgMTI6MDY6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IElmIHRoZSBmaXh1cCBzeW1ib2wgaGFzIGJlZW4KLQllcXVhdGVkIHRvIGFuIHVuZGVmaW5lZCBzeW1ib2wsIGNvbnZlcnQgdGhlIGZpeHVwIHRvIGJlaW5nIGFnYWluc3QKLQl0aGUgdGFyZ2V0IHN5bWJvbC4gIFJlbW92ZSBvYnNvbGV0ZSBjb2RlIGhhbmRsaW5nIGEgc3BlY2lhbCBjYXNlCi0JZm9yIGkzODYgUElDLgotCi1XZWQgRGVjIDE4IDIyOjU0OjM5IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBVc2UgTmV3Rm9sZGVyUmVjdXJzaXZlIGZvciBpbnN0YWxsYXRpb24uCi0KLVdlZCBEZWMgMTggMTY6MDA6NDIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGRvX2Fzc2VtYmxlKTogQ29ycmVjdCBwcmV2aW91cyBidWcgZml4LgotCi1XZWQgRGVjIDE4IDE1OjI3OjQwIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9hc3NlbWJsZSk6IEZpeCBidWcgd2hpY2ggY2F1c2VkCi0Jc2Vjb25kIGluc3RydWN0aW9uIGluIGEgbGluZSB0byBiZSBjYXNlIHNlbnNpdGl6ZS4KLQotV2VkIERlYyAxOCAxMDowODo0NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1uMTAyMDBfaW5zZXJ0X29wZXJhbmQpOiBEb24ndAotCXJhbmdlIGNoZWNrIG9wZXJhbmRzIHdpdGggTU4xMDIwMF9PUEVSQU5EX05PQ0hFQ0sgc2V0LgotCShjaGVja19vcGVyYW5kKTogTGlrZXdpc2UuCi0KLVR1ZSBEZWMgMTcgMTA6NTk6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBVbmRvIHBhcnQgb2YgbGFzdCBGcmlkYXkncyBhbGlnbm1lbnQgY2hhbmdlcy4KLSAJKG1kX2JlZ2luKTogQWx3YXlzIGFsaWduIHRoZSB0ZXh0IHNlY3Rpb24gdG8gYSBmb3VyIGJ5dGUKLQlib3VuZGFyeS4KLQkoYXBwZW5kX2luc24pOiBSZW1vdmUgY2FsbCB0byByZWNvcmRfYWxpZ24uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGluc25fbGFiZWwpOiBSZW1vdmUuCi0JKHN0cnVjdCBpbnNuX2xhYmVsX2xpc3QpOiBEZWZpbmUuCi0JKGluc25fbGFiZWxzLCBmcmVlX2luc25fbGFiZWxzKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhcHBlbmRfaW5zbik6IE1hcmsgYWxsIG1pcHMxNiB0ZXh0IGxhYmVscywgYW5kIG1ha2UgdGhlbSBvZGQuCi0JSGFuZGxlIGFsbCBsYWJlbHMgYWZ0ZXIgZW1pdHRpbmcgYSBub3AsIG5vdCBqdXN0IG9uZS4gIENhbGwKLQltaXBzX2NsZWFyX2luc25fbGFiZWxzIHJhdGhlciB0aGFuIGp1c3QgY2xlYXJpbmcgaW5zbl9sYWJlbC4KLQkobWlwc19lbWl0X2RlbGF5cyk6IEFkZCBpbnNucyBwYXJhbWV0ZXIsIGFuZCB1c2UgaXQgdG8gZGVjaWRlCi0Jd2hldGhlciB0byBtYXJrIG1pcHMxNiBsYWJlbHMuICBIYW5kbGUgYWxsIGxhYmVscywgbm90IGp1c3Qgb25lLgotCUZvcmNlIG1pcHMxNiBsYWJlbHMgdG8gYmUgb2RkLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShtaXBzMTZfaW1tZWQpOiBEb24ndCBjaGVjayBmb3IgYW4gb2RkIGJyYW5jaCB0YXJnZXQuCi0JKG1kX2FwcGx5X2ZpeCk6IERvbid0IGNoZWNrIG1pcHMxNiBtb2RlIGZvciBhIGJyYW5jaCByZWxvYy4KLQkobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBJZ25vcmUgdGhlIGxvdyBiaXQgaW4gYSBicmFuY2ggdGFyZ2V0LgotCShtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkobWlwc19ub19wcmV2X2luc24pOiBDYWxsIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgcmF0aGVyIHRoYW4ganVzdAotCWNsZWFyaW5nIGluc25fbGFiZWwuCi0JKG1pcHNfYWxpZ24sIG1pcHNfZmx1c2hfcGVuZGluZ19vdXRwdXQsIHNfY29ucyk6IExpa2V3aXNlLgotCShzX2Zsb2F0X2NvbnMsIHNfZ3B3b3JkKTogTGlrZXdpc2UuCi0JKHNfYWxpZ24pOiBVc2UgaW5zbl9sYWJlbHMgcmF0aGVyIHRoYW4gaW5zbl9sYWJlbC4KLQkoc19jb25zLCBzX2Zsb2F0X2NvbnMsIHNfZ3B3b3JkKTogTGlrZXdpc2UuCi0JKG1pcHNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19kZWZpbmVfbGFiZWwpOiBSZXdyaXRlIHRvIGFkZCB0byBpbnNuX2xhYmVscyBsaXN0LgotCSogY29uZmlnL3RjLW1pcHMuaCAodGNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyk6IERlZmluZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBJZiB0aGUgc2l6ZSBvZiBhIGZ1bmN0aW9uIGNvbWVzCi0Jb3V0IG9kZCwgaW5jcmVtZW50IGl0LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IE9ubHkgdXBkYXRlIHByZXZfaW5zbiB3aGVuIG5vdAotCXJlb3JkZXJpbmcgaWYgcGxhY2UgaXMgTlVMTC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2lwKTogQ2hlY2sgZm9yIGEgbWlzc2luZyBleHByZXNzaW9uCi0Jd2hlbiB1c2luZyB0aGUgcmVnaXN0ZXIgaW5kaXJlY3QgYWRkcmVzc2luZyBtb2RlLgotCi1Nb24gRGVjIDE2IDEwOjA4OjQ2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobW4xMDIwMF9pbnNlcnRfb3BlcmFuZCk6IERvbid0Ci0JY2hlY2sgMjRiaXQgb3BlcmFuZHMgZm9yIG92ZXJmbG93LgotCShjaGVja19vcGVyYW5kKTogTGlrZXdpc2UuCi0KLU1vbiBEZWMgMTYgMTE6NTA6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbyAoU2VjdGlvbik6IERvY3VtZW50IGhvdyB0byB1c2UgdGhlIC5zZWN0aW9uCi0JcHNldWRvLW9wIGZvciBDT0ZGIGFuZCBFTEYuCi0KLVN1biBEZWMgMTUgMTU6MjY6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IEZpeCBsaW5rb25jZSBjaGVjayBmb3IgRUxGLgotCi1TYXQgRGVjIDE0IDIyOjM3OjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAocHJldl9pbnNuX3JlbG9jX3R5cGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShSRUxBWF9NSVBTMTZfRU5DT0RFKTogQWRkIGRzbG90IGFuZCBqYWxfZHNsb3QgYXJndW1lbnRzLCBhbmQKLQlzdG9yZSB0aGVtLiAgQWRqdXN0IG90aGVyIFJFTEFYX01JUFMxNiBtYWNyb3MuCi0JKFJFTEFYX01JUFMxNl9EU0xPVCk6IERlZmluZS4KLQkoUkVMQVhfTUlQUzE2X0pBTF9EU0xPVCk6IERlZmluZS4KLQkoYXBwZW5kX2luc24pOiBQYXNzIG5ldyBhcmd1bWVudHMgdG8gUkVMQVhfTUlQUzE2X0VOQ09ERS4gIENvcnJlY3QKLQloYW5kbGluZyBvZiB3aGV0aGVyIHByZXZpb3VzIGluc3RydWN0aW9uIGhhcyBhIGZpeHVwLiAgU2V0Ci0JcHJldl9pbnNuX3JlbG9jX3R5cGUuCi0JKG1pcHNfbm9fcHJldl9pbnNuKTogQ2xlYXIgcHJldl9pbnNuX3JlbG9jX3R5cGUuCi0JKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogVXNlIHRoZSByaWdodCBiYXNlIGFkZHJlc3MgZm9yIGEgUEMKLQlyZWxhdGl2ZSBhZGQgb3IgbG9hZC4KLQkobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuICBJZiBhIFBDIHJlbGF0aXZlIGFkZCBvciBsb2FkIGlzCi0JdXNlZCwgcmVjb3JkIHRoZSBhbGlnbm1lbnQgZm9yIHRoZSBzZWN0aW9uLgotCi1GcmkgRGVjIDEzIDEzOjAwOjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBEb24ndCByZWR1Y2UgYSByZWxvYyBhZ2FpbnN0IGEKLQlsaW5rb25jZSBzZWN0aW9uIGludG8gYSByZWxvYyBhZ2FpbnN0IHRoZSBzZWN0aW9uIHN5bWJvbC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X21hY3JvKTogUmVtb3ZlIG5vcCBpbnN0cnVjdGlvbnMgYWZ0ZXIKLQlicmFuY2ggaW5zdHJ1Y3Rpb25zLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IElmIGNvbmZpZ3VyZWQgZm9yIGFuIGVtYmVkZGVkIEVMRgotCXN5c3RlbSwgZG9uJ3Qgc2V0IHRoZSBzZWN0aW9uIGFsaWdubWVudCB0byAyKio0LgotCShzX2NoYW5nZV9zZWMpOiBMaWtld2lzZS4KLQkoYXBwZW5kX2luc24pOiBDYWxsIHJlY29yZF9hbGlnbm1lbnQgZm9yIHRoZSBzZWN0aW9uLgotCShtZF9zZWN0aW9uX2FsaWduKTogRG9uJ3QgYWxpZ24gdGhlIHNlY3Rpb24gc2l6ZSBmb3IgYW4gZW1iZWRkZWQKLQlFTEYgc3lzdGVtLgotCi1UaHUgRGVjIDEyIDE2OjQwOjQ3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBNYWtlIHN1cmUgdGhhdCBzeW1ib2xzIGFyZQotCXJlc29sdmVkOyBleHByZXNzaW9uIHN5bWJvbHMgbWF5IGhhdmUgYmVlbiBza2lwcGVkLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4KLQotVGh1IERlYyAxMiAxNToxODoyMSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zdWZmaXgpOiBNb3ZlIEBwbHQgdG8KLQlCRkRfUkVMT0NfMjRfUExUX1BDUkVMIHJlbG9jYXRpb24uCi0JKG1kX2FwcGx5X2ZpeDMpOiBTdXBwb3J0IEJGRF9SRUxPQ18yNF9QTFRfUENSRUwuCi0KLVR1ZSBEZWMgMTAgMTM6NTE6NTUgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHdyaXRlXzJfc2hvcnQpOiBSZW1vdmUgY29kZSB0aGF0IGNhbGxlZAotCXBhcmFsbGVsX29rKCkgd2hlbiB0aGUgcHJvZ3JhbW1lciBzcGVjaWZpZWQgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zLgotCi1UdWUgRGVjIDEwIDEyOjIzOjE5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBVcGRhdGUgdG8gaGFuZGxlIGVuZGlhbm5lc3MKLQlpc3N1ZXMgY29ycmVjdGx5LgotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9hc3NlbWJsZSk6IE9wY29kZSAweDAgaXMgdmFsaWQhCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IExpa2V3aXNlLgotCi1UdWUgRGVjIDEwIDExOjM3OjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHJvb20KLQlpbiBhIGZyYWcgYWZ0ZXIgYSBtaXBzMTYgaW5zdHJ1Y3Rpb24gdG8gc3dpdGNoIGl0IHdpdGggYSBqdW1wCi0JaW5zdHJ1Y3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogR2l2ZSBhbiBlcnJvciBmb3IgYW4KLQlhdHRlbXB0IHRvIHVzZSBhIG5vbiBhYnNvbHV0ZSBzeW1ib2wgaW4gYW4gZXh0ZW5kaW5nIGZyYWcuCi0KLU1vbiBEZWMgIDkgMTY6NDg6MjAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jOiBGbGVzaCBvdXQgYXNzZW1ibGVyIHN1cHBvcnQgZm9yIE1OMTAyMDAuCi0JKiBjb25maWcvdGMtbW4xMDIwMC5oOiBMaWtld2lzZS4KLQotTW9uIERlYyAgOSAxNzowOTo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IEF0IHRoZSBlbmQgb2YgYSBDIGNvbW1lbnQsIHBhc3Mgc3BhY2UgdG8KLQlVTkdFVCByYXRoZXIgdGhhbiBQVVQuICBTZXQgb2xkX3N0YXRlIGJlZm9yZSBzZXR0aW5nIHN0YXRlIHRvIC0yLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IEF2b2lkIGFuIGluZmluaXRlIGxvb3AKLQl3aGVuIGV4dGVuZGluZyBiZWNhdXNlIHRoZSB2YWx1ZSBpcyBleGFjdGx5IG1heHRpbnkgKyAxLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChSRUxBWF9NSVBTMTZfRU5DT0RFKTogQWRkIHNtYWxsIGFuZCBleHQKLQlhcmd1bWVudHMsIGFuZCBzdG9yZSB0aGVtLiAgQWRqdXN0IG90aGVyIFJFTEFYX01JUFMxNiBtYWNyb3MuCi0JKFJFTEFYX01JUFMxNl9VU0VSX1NNQUxMKTogRGVmaW5lLgotCShSRUxBWF9NSVBTMTZfVVNFUl9FWFQpOiBEZWZpbmUuCi0JKG1pcHMxNl9zbWFsbCwgbWlwczE2X2V4dCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShhcHBlbmRfaW5zbik6IFBhc3MgbWlwczE2X3NtYWxsIGFuZCBtaXBzMTZfZXh0IHRvCi0JUkVMQVhfTUlQUzE2X0VOQ09ERS4KLQkobWlwczE2X2lwKTogU2V0IG1pcHMxNl9zbWFsbCBhbmQgbWlwczE2X2V4dC4KLQkobWlwczE2X2ltbWVkKTogRG9uJ3QgY2hlY2sgbWlwczE2X2F1dG9leHRlbmQuCi0JKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogQ2hlY2sgVVNFUl9TTUFMTCBhbmQgVVNFUl9FWFQuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IFByaW50IGFuIGVycm9yIGZvciBhbiBvdXQgb2YgcmFuZ2UKLQlmaXh1cCwgcmF0aGVyIHRoYW4gY2FsbGluZyBhYm9ydC4KLQotCSogYXMuYyAobWFpbik6IFVubGluayB0aGUgb3V0cHV0IGZpbGUgaWYgdGhlcmUgYXJlIGVycm9ycyB3aGlsZQotCWdlbmVyYXRpbmcgdGhlIGZpeHVwcy4KLQotRnJpIERlYyAgNiAxODo0ODoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogRG9uJ3QgY2FsbAotCVNfR0VUX1ZBTFVFLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBDYWxsIHJlc29sdmVfc3ltYm9sX3ZhbHVlIGJlZm9yZSBjYWxsaW5nCi0JU19HRVRfVkFMVUUsIGFuZCBkb24ndCBhZGQgaW4gdGhlIGZyYWcgYWRkcmVzcy4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2ltbWVkKTogQWRkIGZpbGUgYW5kIGxpbmUgcGFyYW1ldGVycywKLQlhbmQgdXNlIHRoZW0gd2hlbiByZXBvcnRpbmcgZXJyb3JzLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCi1GcmkgRGVjICA2IDE1OjM2OjMyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYzogRml4IHZhcmlvdXMgZ2NjIC1XYWxsIHdhcm5pbmdzLgotCVJlbW92ZSAnJCcgcHJlZml4aW5nIGZvciByZWdpc3RlcnMuCi0KLUZyaSBEZWMgIDYgMDA6NTU6NDggMTk5NiAgTWFydGluICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9hc3NlbWJsZSk6IENoZWNrIHRvIHNlZSBpZiBwcmV2X3NlZwotCWlzIGluaXRpYWxpemVkIGJlZm9yZSB1c2luZyBpdC4KLQkoZDEwdl9jbGVhbnVwKTogTm8gbG9uZ2VyIHVzZXMgaXRzIGFyZ3VtZW50LCBzbyBtYWtlIGl0IHZvaWQuCi0KLQkqIGNvbmZpZy90Yy1kMTB2LmggKGQxMHZfY2xlYW51cCk6IENoYW5nZSBwcm90b3R5cGUuCi0JCi1UaHUgRGVjICA1IDExOjAzOjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IGRpc2NhcmQgdGhlIHN5bWJvbCBmb3IgYSBQQwotCXJlbGF0aXZlIGZpeHVwIHRvIGFuIGFic29sdXRlIHN5bWJvbC4KLQotV2VkIERlYyAgNCAxNTo0Mjo0MSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXNzZW1ibGUsIGQxMHZfY2xlYW51cCk6IEZpeCBidWcKLQl3aXRoIG11bHRpcGxlIHNlY3Rpb25zLgotCi1XZWQgRGVjICA0IDEzOjAwOjA3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfbG9uZ29wdHMpOiBSZW5hbWUgbWlwcy0xNiB0byBtaXBzMTYsIGFuZAotCW5vLW1pcHMtMTYgdG8gbm8tbWlwczE2LgotCShzX21pcHNzZXQpOiBBY2NlcHQgLnNldCBtaXBzMTYgYW5kIC5zZXQgbm9taXBzMTYuCi0KLVdlZCBEZWMgIDQgMTA6MzU6MzMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogVGFrZSBleHByZXNzaW9uUyBwb2ludGVyCi0JYXJndW1lbnQsIGFuZCBjaGVjayBmb3IgKy8tIGNvbnN0YW50IGZvbGxvd2luZyB0aGUgc3VmZml4LCBmb2xkaW5nCi0JaXQgaW50byB0aGUgZXhwcmVzc2lvbi4KLQkocHBjX2VsZl9jb25zKTogQ2hhbmdlIHBwY19lbGZfc3VmZml4IGNhbGxzLgotCShtZF9hc3NlbWJsZSk6IERpdHRvLgotCShzaGxpYik6IFJlcGxhY2UgYm9vbGVhbiBtcmVsb2NhdGFibGUgd2l0aCBlbnVtZXJhdGlvbiBzaGxpYi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogRGlzY3JpbWluYXRlIGJldHdlZW4gUElDIHN0eWxlIHNoYXJlZCBsaWJyYXJpZXMKLQlhbmQgLW1yZWxvY2F0YWJsZS4KLQkocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBEb24ndCByZXBvcnQgd2FybmluZ3MgZm9yIFBJQyBzdHlsZSBzaGFyZWQKLQlsaWJyYXJpZXMuCi0KLVR1ZSBEZWMgIDMgMjM6MTg6MjkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmggKHt0YyxwcGN9X2NvbW1lbnRfY2hhcnMpOiBEZWZpbmUsIHNvIHRoYXQgd2UgY2FuCi0JY2hhbmdlIHRoZSBjb21tZW50IGNoYXJhY3RlcnMuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAoY29tbWVudF9jaGFycyk6IERlbGV0ZSBpbiBmYXZvciBvZgotCXRjX2NvbW1lbnRfY2hhcnMuCi0JKHBwY197ZWFiaSxzb2xhcmlzfV9jb21tZW50X2NoYXJzKTogRWFiaSBhbmQgU29sYXJpcyB2ZXJzaW9ucyBvZgotCWNvbW1lbnQgY2hhcnMuCi0JKHBwY19jb21tZW50X2NoYXJzKTogU2VsZWN0IGFwcHJvcHJpYXRlIGNvbW1lbnQgY2hhcnMgYnkgZGVmYXVsdC4KLQkobXNvbGFyaXMpOiBOZXcgZmxhZyBmb3IgLW17LG5vLX1zb2xhcmlzLgotCShtZF9wYXJzZV9vcHRpb24pOiBSZWNvZ25pemUgLUsgcGljLiAgQWRkIHN1cHBvcnQgZm9yCi0JLW17LG5vLX1zb2xhcmlzLgotCShtZF9zaG93X3VzYWdlKTogVXBkYXRlLgotCShtZF9iZWdpbik6IERvIG5vdCBzZXQgRUxGIGZsYWdzIGlmIFNvbGFyaXMuCi0JKHBwY19lbGZfc3VmZml4KTogQGxvY2FsIHNldHMgUl9QUENfTE9DQUwyNFBDIHJlbG9jYXRpb24uCi0JKG1kX2FwcGx5X2ZpeDMpOiBBZGQgc3VwcG9ydCBmb3IgUl9QUENfTE9DQUwyNFBDLgotCi1Nb24gRGVjICAyIDEzOjQ4OjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXMuYyAobWFpbik6IENvcnJlY3QgaGFuZGxpbmcgb2YgZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0LgotCi1TdW4gRGVjICAxIDIxOjQ2OjA1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAodGNfZ2VuX3JlbG9jKTogR2V0IHRoZSBhZGRlbmQgZnJvbQotCWZ4X29mZnNldCwgbm90IGZ4X2FkZG51bWJlci4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuaCAodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBkbyBhbnkKLQlyZWxvYyBhZGp1c3RtZW50cy4KLQotU2F0IE5vdiAzMCAxNzozNDo0OCAxOTk2ICBFbGlvdCBEcmVzc2VsaGF1cyAgPGVsaW90QHdhbGx5LmVkYy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IENvcnJlY3QgbWlzc3BlbGxpbmc6IGJhbGVuY2VkIHRvIGJhbGFuY2VkLgotCi1XZWQgTm92IDI3IDEzOjI1OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2VjdGlvbl9hbGlnbik6IENoZWNrIGZvciBhbiBhbGlnbm1lbnQgb2YKLQk0LCBub3QgYW4gYWxpZ25tZW50IG9mIDE2LiAgQ29ycmVjdHMgQXVndXN0IDcgcGF0Y2guCi0KLVR1ZSBOb3YgMjYgMTA6MzM6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIGNvbmYuaW46IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfbGNvbW0pOiBEb24ndCBnaXZlIGFuIGVycm9yIGlmIG5vCi0JYWxpZ25tZW50IGlzIHNwZWNpZmllZC4KLQotCUFkZCBzdXBwb3J0IGZvciBtaXBzMTYgKDE2IGJpdCBNSVBTIGltcGxlbWVudGF0aW9uKToKLQkqIGNvbmZpZy90Yy1taXBzLmM6IEV4dGVuc2l2ZSBhZGRpdGlvbnMgZm9yIG1pcHMxNiBzdXBwb3J0LCBub3QKLQlsaXN0ZWQgaGVyZS4KLQkoUkVMQVhfT0xELCBSRUxBWF9ORVcpOiBVc2Ugb25seSA3IGJpdHMgZWFjaC4KLQkoaW5zbl91c2VzX3JlZyk6IENoYW5nZSBsYXN0IHBhcmFtZXRlciB0byBhbiBlbnVtLgotCSogY29uZmlnL3RjLW1pcHMuaCAoTE9DQUxfTEFCRUxTX0RPTExBUik6IERlZmluZSBhcyAwLgotCShtZF9yZWxheF9mcmFnKTogRGVmaW5lIGFzIG1pcHNfcmVsYXhfZnJhZy4KLQkobWlwc19yZWxheF9mcmFnKTogRGVjbGFyZS4KLQkoc3RydWN0IG1pcHNfY2xfaW5zbik6IEFkZCB1c2VfZXh0ZW5kIGFuZCBleHRlbmQgZmllbGRzLgotCSh0Y19maXhfYWRqdXN0YWJsZSk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKFNfR0VUX09USEVSKTogRGVmaW5lLgotCShTX1NFVF9PVEhFUik6IERlZmluZS4KLQotTW9uIE5vdiAyNSAxODowMjoyOSAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAYmVhdXR5LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBJbXBsZW1lbnQgY2FzZXMgZm9yIG5ldyA8LCA+LCBtLCBuLAotIAlvIGFuZCBwIG9wZXJhbmQgc3BlY2lmaWVycy4KLQotTW9uIE5vdiAyNSAxMDo0NToxNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYzogRGVsZXRlICJpZm5kZWYgbWRfcmVsYXhfZnJhZyIgYXJvdW5kIGlzX2RucmFuZ2UuCi0JKHJlbGF4X3NlZ21lbnQsIGNhc2UgcnNfb3JnKTogTW92ZSBjb2RlIGluc2lkZSBicmFjZXMuICBNb3ZlIGxvY2FscwotCXRhcmdldCxhZnRlciBpbnNpZGUgdG9vLgotCShyZWxheF9zZWdtZW50LCBjYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50KTogR3V0cyBtb3ZlZCB0byAuLi4KLQkocmVsYXhfZnJhZyk6IE5ldyBmdW5jdGlvbi4KLQlDYWxsIG1kX3ByZXBhcmVfcmVsYXhfc2NhbiBpZiBkZWZpbmVkLgotCSogY29uZmlnL3RjLW02OGsuaCAobWRfcHJlcGFyZV9yZWxheF9zY2FuKTogUmVuYW1lZCBmcm9tCi0JTTY4S19BSU1fS0xVREdFLgotCi1Nb24gTm92IDI1IDA4OjQ5OjM2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAoYWRkcmVzc19yZWdpc3RlcnMpOiBVc2UgJyQnIGFzIHJlZ2lzdGVyCi0JcHJlZml4IGluc3RlYWQgb2YgJyUnLgotCShkYXRhX3JlZ2lzdGVycywgb3RoZXJfcmVnaXN0ZXJzLCBtZF9hc3NlbWJsZSk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChhZGRyZXNzX3JlZ2lzdGVycyk6IFVzZSAnJScgcHJlZml4IGZvciByZWdzLgotCShkYXRhX3JlZ2lzdGVycywgb3RoZXJfcmVnaXN0ZXJzLCBtZF9hc3NlbWJsZSk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IENvcnJlY3RseSBkZXRlcm1pbmUgdGhlCi0JY29ycmVjdCBsb2NhdGlvbiBhbmQgdHlwZSBmb3IgZWFjaCByZWxvY2F0aW9uLgotCShtZF9wY3JlbF9mcm9tKTogU2ltcGxpZnkuCi0KLUZyaSBOb3YgMjIgMTU6NDI6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfY29udmVydF9mcmFnKTogSW1wcm92ZSB3YXJuaW5nIHdoZW4gYnJhbmNoIGlzCi0JY29udmVydGVkIGludG8gYnJhbmNoIGFyb3VuZCBicmFuY2guCi0KLVRodSBOb3YgMjEgMTE6NTY6MTEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5oIChESUZGX0VYUFJfT0spOiBEb24ndCBkZWZpbmUgdGhpcy4KLQkodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgcmVsb2NzIGFnYWluc3Qgd2VhayBzeW1ib2xzIG9yIAotCXBjLXJlbGF0aXZlIHJlbG9jcy4KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2JlZ2luKTogU2V0IGxpbmtyZWxheC4KLQkobWRfYXNzZW1ibGUpOiBDcmVhdGUgZml4dXBzIGFzIG5lZWRlZC4KLQkobWRfYXBwbHlfZml4Myk6IEd1dC4gIEl0IHNob3VsZG4ndCBldmVyIGdldCBjYWxsZWQgYW55bW9yZS4KLQotVHVlIE5vdiAxOSAxNzo0ODowNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rKTogV2hlbiBhdXRvbWF0aWNhbGx5IGNvbnZlcnRpbmcKLQlzZXJpYWwgb3BzIHRvIHBhcmFsbGVsLCBkbyBub3QgY29uc2lkZXIgYSBicmFuY2ggYXMgdGhlIGZpcnN0Ci0JaW5zdHJ1Y3Rpb24uCi0KLVR1ZSBOb3YgMTkgMTM6MzU6MjIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1QuCi0KLU1vbiBOb3YgMTggMTU6MjY6NTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtbjEwMzAwX2luc2VydF9vcGVyYW5kKTogUHJvdmlkZSBwcm90b3R5cGUKLQl2aWEgUEFSQU1TLgotCShjaGVja19vcGVyYW5kKTogTGlrZXdpc2UuCi0KLU1vbiBOb3YgMTggMTU6MjI6MjggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChwYXJhbGxlbF9vayk6IEJyYW5jaCBhbmQgbGluayBpbnN0cnVjdGlvbnMKLQltb2RpZnkgcjEzLgotCSh3cml0ZV8yX3Nob3J0KTogQ2FsbCBwYXJhbGxlbF9vayB0byBjaGVjayB3aGV0aGVyIHR3byBzaG9ydAotCWluc3RydWN0aW9ucyB0aGUgdXNlciByZXF1ZXN0ZWQgZXhlY3V0ZSBpbiBwYXJhbGxlbCwgY2FuIGJlCi0JZXhlY3V0ZWQgdGhhdCB3YXkuCi0KLVRodSBOb3YgMTQgMTE6MTc6NDkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHdyaXRlXzJfc2hvcnQpOiBGaXggYnVnIHRoYXQgd291bGRuJ3QKLQlhbGxvdyBhIGJyYW5jaCBhbmQgbGluayBpbiBwYXJhbGxlbCB3aXRoIGFuIGV4ZSBpbnN0cnVjdGlvbi4KLQotRnJpIE5vdiAgOCAxMzo1NTowMyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtZDEwdi50ZXhpOiBBZGQgaW5mbyBvbiBAd29yZCBtb2RpZmllci4KLQotV2VkIE5vdiAgNiAxMzo0NjowNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0JCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtbjEwMzAwX2luc2VydF9vcGVyYW5kKTogTU4xMDMwMF9PUEVSQU5EX1NQTElUCi0Jb3BlcmFuZHMgYXJlIGFzc3VtZWQgdG8gYmUgMzJiaXRzLiAgVXNlICJiaXRzIiBmaWVsZCB0byBob2xkIHRoZQotCW51bWJlciBvZiBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uIHdvcmQgZm9yIE1OMTAzMDBfT1BFUkFORF9TUExJVC4KLQkobW4xMDMwMF9jaGVja19vcGVyYW5kKTogTU4xMDMwMF9PUEVSQU5EX1NQTElUIG9wZXJhbmRzIGFyZSBhc3N1bWVkCi0JdG8gYmUgMzJiaXRzLgotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtbjEwMzAwX2luc2VydF9vcGVyYW5kKTogU2hpZnQgbG93IHBhcnQKLQlvZiBhIE1OMTAzMDBfT1BFUkFORF9TUExJVCBvcGVyYW5kIGJ5IG9wZXJhbmQtPnNoaWZ0LgotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtbjEwMzAwX2luc2VydF9vcGVyYW5kKTogSGFuZGxlCi0JTU4xMDMwMF9PUEVSQU5EX1NQTElULgotCi1UdWUgTm92ICA1IDEzOjMwOjQwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBJbnNlcnQgb3BlcmFuZHMgaW50bwotCXRoZSBleHRlbnNpb24gcGFydCBvZiB0aGUgaW5zdHJ1Y3Rpb24gaWYgbmVjZXNzYXJ5LgotCShtbjEwMzAwX2luc2VydF9vcGVyYW5kKTogQWNjZXB0IHBvaW50ZXIgdG8gZXh0ZW5zaW9uIHdvcmQKLQlhcmd1bWVudC4gIE1ha2UgaW5zbiBhIHBvaW50ZXIgYXJndW1lbnQgdG9vLiAgUmV0dXJuIHR5cGUKLQlpcyBub3cgdm9pZC4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0KLU1vbiBOb3YgIDQgMTI6NTM6NDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtbjEwMzAwX2luc2VydF9vcGVyYW5kKTogSGFuZGxlCi0JcmVwZWF0ZWQgcmVnaXN0ZXIgb3BlcmFuZHMuCi0KLUZyaSBOb3YgIDEgMTA6NDI6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbzogQWRkZWQgc2VjdGlvbiBvbiByZXBvcnRpbmcgYnVncy4KLQotCSogY29uZmlnL3RjLWFscGhhLmM6IENoYW5nZSB1c2VzIG9mIHZvaWQgKiB0byBQVFIuICBDaGFuZ2UgdGhlCi0JYWxwaGFfbWFjcm8gZW1pdCBmaWVsZCB0byBleHBlY3QgYSBjb25zdCBhcmd1bWVudCwgYW5kIGNoYW5nZSB0aGUKLQlhcmcgZmllbGQgdG8gYmUgY29uc3QuICBGaXggc29tZSBzcGFjaW5nIHRvIGZvbGxvdyB0aGUgR05VCi0Jc3RhbmRhcmQuCi0KLUZyaSBOb3YgIDEgMTA6MzI6MDMgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9wYXJzZV9vcHRpb24pOiBBZGQga25vd2xlZGdlIG9mIDIxMTY0cGMKLQkocGNhNTYpIGFuZCAyMTI2NCAoZXY2KSBjcHVzLgotCShtZF9hcHBseV9maXgpOiBQcml2YXRlIHJlbG9jYXRpb24gdHlwZXMgYXJlIG5vdyBuZWdhdGl2ZS4KLQkoYWxwaGFfZm9yY2VfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCSh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQkoZW1pdF9pbnNuKTogTGlrZXdpc2UuCi0JKGVtaXRfbGRYdSk6IERvIHRoZSByaWdodCB0aGluZyB3aGVuIHRoZSBoYXJkd2FyZSBjYW4gZG8gYnl0ZSBpbnNucy4KLQkoZW1pdF9zdFgpOiBMaWtld2lzZS4KLQkoZW1pdF9zZXh0WCk6IExpa2V3aXNlLgotCi1UaHUgT2N0IDMxIDE2OjMzOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBDYWxsIHJlc29sdmVfc3ltYm9sX3ZhbHVlIG9uCi0JYSBzeW1ib2wgZm91bmQgaW4gYSByZWxvYy4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IEltcHJvdmUgdGhlIGVycm9yIG1lc3NhZ2UgaWYKLQlhbiB1bmRlZmluZWQgc3ltYm9sIGlzIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4KLQotV2VkIE9jdCAzMCAyMDoxNTozNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aTogUmV3cml0ZSwgYW5kIGFkZCBhIGxvdCBvZiBkb2N1bWVudGF0aW9uLgotCSogZG9jL01ha2VmaWxlLmluIChpbnRlcm5hbHMuaW5mbyk6IE5ldyB0YXJnZXQuCi0KLVdlZCBPY3QgMzAgMTQ6NTU6NTcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5oICh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCByZWxvY3MKLQlhZ2FpbnN0IHdlYWsgc3ltYm9scy4KLQotVHVlIE9jdCAyOSAxMjoyODoxNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgbG9zZSBmb3IgcmVsYXhhYmxlCi0JYWRkcmVzc2VzIGxpa2UgLis2LgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBNYWtlIHN1cmUgd2UgaW5zZXJ0IHRoZQotCWZpeHVwIGF0IHRoZSByaWdodCBhZGRyZXNzIHdpdGhpbiB0aGUgZnJhZy4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfY29udmVydF9mcmFnKTogRG9uJ3Qgc2V0IGZyYWdQLT5mcl9maXgKLQl0byBhbiBhYnNvbHV0ZSB2YWx1ZSwgaW5zdGVhZCBpbmNyZW1lbnQgaXQgYXMgbmVlZGVkLgotCi0JKiBjb25maWcvdGMtdjg1MC5oIChUQ19HRU5FUklDX1JFTEFYX1RBQkxFKTogRGVmaW5lLgotCSogY29uZmlnL3RjLXY4NTAuYzogRml4IHNvbWUgaW5kZW50aW9uIHByb2JsZW1zLgotCShtZF9yZWxheF90YWJsZSk6IERlZmluZSBmb3IgRDktPkQ5OSBicmFuY2ggZGlzcGxhY2VtZW50Ci0JcmVsYXhpbmcuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IERvIHNvbWV0aGluZyB1c2VmdWwgaW5zdGVhZCBvZiBhYm9ydGluZy4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBMaWtld2lzZS4KLQkobWRfYXNzZW1ibGUpOiBOb3RlIGlmIHRoZSBtYXRjaGluZyBpbnN0cnVjdGlvbiBoYXMgYSByZWxheGFibGUKLQlvcGVyYW5kLiAgSWYgaXQgZG9lcywgYWxsb2NhdGUgZnJhZyB3aXRoIGZyYWdfdmFyIGFuZCBkb24ndAotCWRvIGFueSBmaXh1cHMuCi0KLU1vbiBPY3QgMjggMTA6NDg6NDAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmggKG1kX2NsZWFudXApOiBOZXcgZnVuY3Rpb24uICBUaGlzIGlzIG5lZWRlZCB0bwotCXdyaXRlIG91dCBhbnkgYnVmZmVyZWQgaW5zdHJ1Y3Rpb25zIHdoZW4gYSAiLmVuZCIgaXMgZm91bmQuCi0KLU1vbiBPY3QgMjggMTA6NDM6NDUgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogTmV3IGhvb2sgbWRfY2xlYW51cCgpLgotCi1GcmkgT2N0IDI1IDAwOjAxOjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4X25ld19leHApOiBVc2UgbWFrZV9leHByX3N5bWJvbCB0byBidWlsZCBhbgotCWV4cHJlc3Npb24gc3ltYm9sIGZvciBhIGNvbXBsZXggZml4dXAuCi0KLVRodSBPY3QgMjQgMTQ6MzE6MDQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX3JlbG9jX3ByZWZpeCk6IFNldmVyYWwgZGlzZ3VzdGluZwotCWhhY2tzIHRvIGltcHJvdmUgcGFyc2luZyBvZiBjb21wbGV4IGhpLCBsbywgemRhLCBldGMKLQlleHByZXNzaW9ucy4KLQkobWRfYXNzZW1ibGUpOiBEb24ndCBkZW1hbmQgYW5kIGVhdCBhIHRyYWlsaW5nICcpJyBhZnRlciBmaW5kaW5nCi0JYSB2ODUwIHJlbG9jYXRpb24gcHJlZml4LiAgU2lnbiBleHRlbmQgdGhlIGNvbnN0YW50IGluIGEKLQlCRkRfUkVMT0NfTE8xNiBleHByZXNzaW9uLiAgRG8gZWF0IGEgdHJhaWxpbmcgJyknIGFmdGVyIGEgY29tcGxldGUKLQlvcGVyYW5kLgotCShwYXJzZV9jb25zX2V4cHJlc3Npb25fdjg1MCk6IERvbid0IGVhdCBhIHRyYWlsaW5nICcpJyBhZnRlcgotCWZpbmRpbmcgYSB2ODUwIHJlbG9jYXRpb24gcHJlZml4LgotCi0JKiBjb25maWcvdGMtdjg1MC5oIChUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04pOiBEZWZpbmUuCi0JKFRDX0NPTlNfRklYX05FVyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXY4NTAuYyAocGFyc2VfY29uc19leHByZXNzaW9uX3Y4NTApOiBOZXcgZnVuY3Rpb24uCi0JKGNvbnNfZml4X25ld192ODUwKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IFREQSByZWxvY3MuCi0KLVdlZCBPY3QgMjMgMTg6MjA6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBHaXZlIGEgYmV0dGVyIHdhcm5pbmcgbWVzc2FnZQotCWZvciBhbiB1bmtub3duIHJlbG9jYXRpb24gdHlwZS4KLQotV2VkIE9jdCAyMyAxNjoyMToyOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAud29yZDsgYWxsb2NhdGVzCi0JNCBieXRlcyBvZiBzcGFjZS4KLQotVHVlIE9jdCAyMiAyMjowMToyNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlIFREQU9GRiByZWxvY3MKLQlkaWZmZXJlbnRseSBmb3IgbW92ZWEgJiBzc3Qvc2xkIGluc25zLgotCi1UdWUgT2N0IDIyIDE3OjA5OjMyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2spOiBEb24ndCBhbGxvdyBpbGxlZ2FsIGNvbWJpbmF0aW9ucwotCW9mIGluc3RydWN0aW9ucy4KLQotVHVlIE9jdCAyMiAxMToyODozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iai5oIChzdHJ1Y3QgZm9ybWF0X29wcyk6IEFkZCBmcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIGZpZWxkLgotCSogY29uZmlnL29iai1tdWx0aS5oIChvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZm9ybWF0X29wcyk6IEluaXRpYWxpemUgbmV3Ci0JZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBmaWVsZC4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mb3JtYXRfb3BzKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbWlwcy5jOiBVbmRlZmluZSBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBiZWZvcmUKLQlpbmNsdWRpbmcgb2JqLWVsZi5oLgotCi1Nb24gT2N0IDIxIDExOjM4OjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoY29uc19maXhfbmV3X21pcHMpOiBPbmx5IHRyZWF0IDggYnl0ZSByZWxvYwotCXNwZWNpYWxseSBpZiBub3QgRUxGLgotCShtZF9hcHBseV9maXgpOiBIYW5kbGUgQkZEX1JFTE9DXzY0LgotCSh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgQkZEX1JFTE9DXzY0LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgzKTogRG9uJ3QgaW5jcmVtZW50IHZhbHVlIGZvciBhIFBDCi0gCXJlbGF0aXZlIHJlbG9jIHdoZW4gQkZEX0FTU0VNQkxFUiBhbmQgT0JKX0FPVVQgKG1vcmUgdWdseSBnYXMKLSAJcmVsb2MgaGFja2luZykuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oIChTX0lTX0RFRklORSk6IG5vbiBCRkRfQVNTRU1CTEVSIHZlcnNpb246Ci0JRG9uJ3QgY2hlY2sgU19HRVRfT1RIRVIuCi0KLUZyaSBPY3QgMTggMTQ6MDY6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogQWNjZXB0IGFuIG9kZCBmbG9hdGluZyBwb2ludAotCXJlZ2lzdGVyIHdpdGggbC5zIG9yIHMucy4KLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9wc2V1ZG9fdGFibGUpOiBVc2Ugb2JqX2FvdXRfdHlwZSBmb3IKLQkudHlwZSBwc2V1ZG8tb3AuCi0JKG9ial9hb3V0X3R5cGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1UaHUgT2N0IDE3IDE3OjU1OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoT0JKUykpOiBEZXBlbmQgdXBvbiBsaWJpYmVydHkuaC4KLQotV2VkIE9jdCAxNiAxMToyODozMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfcmVsb2NfcHJlZml4KTogUmVjb2duaXplIHpkYW9mZiwgdGRhb2ZmCi0JYW5kIHNkYW9mZiBleHByZXNzaW9ucy4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IGFkZCBzeW1ib2wgdmFsdWUgdG8gYWRkZW5kIGlmCi0JVENfVjg1MCBhbmQgT0JKX0VMRi4KLQkqIGNvbmZpZy90Yy12ODUwLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IGFueQotCXBjLXJlbGF0aXZlIGZpeHVwcy4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfcGNyZWxfZnJvbSk6IFVuZG8geWVzdGVyZGF5J3MgY2hhbmdlcy4KLQkobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdjg1MC5oIChNRF9QQ1JFTF9GUk9NX1NFQ1RJT04pOiBMaWtld2lzZS4KLQotVHVlIE9jdCAxNSAyMzoxOTowMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX3BjcmVsX2Zyb20pOiBEZWxldGUgdW51c2VkIGZ1bmN0aW9uLgotCShtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtdjg1MC5oIChNRF9QQ1JFTF9GUk9NX1NFQ1RJT04pOiBEZWZpbmUuCi0KLU1vbiBPY3QgMTQgMTM6NTk6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogQWRkIGNhc3QgdG8gb2Zmc2V0VCB3aGVuIHVzaW5nCi0JYSBjb25zdGFudCB3aXRoICZ+LgotCi1Nb24gT2N0IDE0IDExOjI0OjI4IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9maWxlKTogTW92ZSBFQ09GRiBkZWJ1ZyBwcm9jZXNzaW5nIHRvIC4uLgotCShlbGZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyk6IC4uLiBoZXJlLiAgTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2Zyb21fZmlsZV9hZnRlcl9yZWxvY3MpOiBOZXcgbWFjcm8uCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENhbGwgKmZyb2JfYWZ0ZXJfcmVsb2NzIGFmdGVyIHRoZQotCWNhbGwgdG8gd3JpdGVfcmVsb2NzLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYzogVXNlIG5ldyBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUwgcmVsb2MuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChsb2FkX2V4cHJlc3Npb24pOiBEb24ndCBTRVRfVkFMVUUgb24gdGhlIHNlY3Rpb24KLQlzeW1ib2wsIGFzIHRoaXMgbWVzc2VzIHVwIGxpbmtpbmcuICBJbnN0ZWFkLCBleHBhbmQgdGhlIHJlY3Vyc2l2ZSBjYWxsCi0JaW5saW5lIGFuZCBjaGFuZ2UgdXAgdGhlIGFwcHJvcHJpYXRlIGJpdHMgdG8gZ2V0IHRoZSAweDgwMDAgb2Zmc2V0Ci0JaW4gdGhlIHJlbG9jIGFkZGVuZC4KLQotVGh1IE9jdCAxMCAxNzozMDozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IFBlcm1pdCB0aGUgZGlmZmVyZW5jZSBvZgotCXR3byBzeW1ib2xzIGluIHRoZSBzYW1lIHNlZ21lbnQgdG8gYmUgYWRqdXN0ZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgZ2V0IGNvbmZ1c2VkIGJ5IENQVS1WRU5ET1ItbGludXgtZ251LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgT2N0IDEwIDE3OjIyOjE4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfaW5zZXJ0X29wZXJhbmQpOiBDaGFuZ2UgbW9zdCB3YXJuaW5ncyBpbnRvCi0JZXJyb3JzLgotCShwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IERpdHRvLgotCShtZF9hc3NlbWJsZSk6IERpdHRvLgotCShwcGNfdGMpOiBEaXR0by4KLQkocHBjX3BlX3NlY3Rpb24pOiBEaXR0by4KLQkocHBjX2Zyb2Jfc3ltYm9sKTogRGl0dG8uCi0KLVRodSBPY3QgMTAgMTI6MDU6NDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IFBhc3MgYW4gZXh0cmEgc2hpZnQgY291bnQKLQl0byBtbjEwMzAwX2luc2VydF9vcGVyYW5kIGJhc2VkIG9uIHRoZSBvcGNvZGUgZm9ybWF0LgotCShtbjEwMzAwX2luc2VydF9vcGVyYW5kKTogQWNjZXB0IGFuZCB1c2UgZXh0cmEgc2hpZnQgY291bnQKLQlwYXJhbWV0ZXIuCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogVXNlIEZNVF8qIG1hY3JvcyBmb3IKLQlmb3JtYXRzIHJhdGhlciB0aGFuIGhhcmQtY29kZWQgY29uc3RhbnRzLgotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IEZvcm1hdCBENSBpbnN0cnVjdGlvbnMKLQlhcmUgNyBieXRlcyBsb25nLiAgV3JpdGUgb3V0IGluc3RydWN0aW9ucyBpbiBiaWctZW5kaWFuIGZvcm1hdC4KLQotVHVlIE9jdCAgOCAxNDo1NjoxNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogVHdlYWsgZnVydGhlciBzbwotCXRoYXQgYWxsIGluc3RydWN0aW9ucyBhcmUgcGFyc2VkIGNvcnJlY3RseS4KLQotVHVlIE9jdCAgOCAxMzowMjoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmg6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKHhtYWxsb2MsIHhyZWFsbG9jKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGFzLmM6IERvbid0IGluY2x1ZGUgbGliaWJlcnR5LmguCi0JKiBleHByLmMsIHJlYWQuYywgc3RhYnMuYywgY29uZmlnL29iai1jb2ZmLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1pcHMuYzogTGlrZXdpc2UuCi0JKiBtZXNzYWdlcy5jOiBMaWtld2lzZS4KLQkoeHN0cmVycm9yKTogRG9uJ3QgZGVjbGFyZS4KLQkqIHhtYWxsb2MuYzogUmVtb3ZlLgotCi1Nb24gT2N0ICA3IDE2OjUzOjIzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuaCAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKSBSZW1vdmUuCi0JKHN5c3RlbV9yZWdpc3RlcnMsIGNjX25hbWVzKTogTGlrZXdpc2UuCi0JKGFkZHJlc3NfcmVnaXN0ZXJzLCBkYXRhX3JlZ2lzdGVycywgb3RoZXJfcmVnaXN0ZXJzKTogTmV3IHJlZ2lzdGVyCi0JYXJyYXlzLgotCShyZWdpc3Rlcl9uYW1lLCBzeXN0ZW1fcmVnaXN0ZXJfbmFtZSwgY2NfbmFtZSk6IFJlbW92ZS4KLQkobW4xMDMwMF9yZWxvY19wcmVmaXgpOiBMaWtld2lzZS4KLQkoZGF0YV9yZWdpc3Rlcl9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShhZGRyZXNzX3JlZ2lzdGVyX25hbWUsIG90aGVyX3JlZ2lzdGVyX25hbWUpOiBMaWtld2lzZS4KLQkobWRfYXNzZW1ibGUpOiBSb3VnaCBjdXQgYXQgcGFyc2luZyBvcGVyYW5kcy4gIFJlbW92ZSBsb3RzIG9mCi0JdW53YW50ZWQgY29kZS4KLQkobWRfYXBwbHlfZml4Myk6IERpc2FibGUgZm9yIG5vdy4KLQotTW9uIE9jdCAgNyAxMTozODozNCAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoc2VsZWN0X2NvbnRyb2xfcmVncyk6IE5ldyBmdW5jdGlvbiwgZXh0cmFjdGVkCi0Jb3V0IG9mIG02OGtfaW5pdF9hZnRlcl9hcmdzLgotCShtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IFVzZSBpdC4KLQkobXJpX2NoaXApOiBVc2UgaXQgaGVyZSBhcyB3ZWxsIHRvIHVwZGF0ZSBzZXQgb2YgYWxsb3dlZCBjb250cm9sCi0JcmVncyBmb3IgbW92ZWMuCi0KLU1vbiBPY3QgIDcgMTE6MjQ6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfYmVnaW4pOiBOZXcgZnVuY3Rpb24uCi0JKG9ial9lbGZfc2VjdGlvbik6IEFkZCB0aGUgc2VjdGlvbiBzeW1ib2wgdG8gdGhlIHN5bWJvbCB0YWJsZS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9iZWdpbik6IERlZmluZS4KLQkoZWxmX2JlZ2luKTogRGVjbGFyZS4KLQkqIGFzLmMgKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IENhbGwgb2JqX2JlZ2luIGlmIGl0IGlzCi0JZGVmaW5lZC4KLQotRnJpIE9jdCAgNCAxODozNzozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogU3VidHJhY3QgdGhlIHNlY3Rpb24gYWRkcmVzcwotCWZyb20gYSBQQyByZWxhdGl2ZSByZWxvYyBpZiBUQ19NNjhLLgotCi1UaHUgT2N0ICAzIDE1OjE1OjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSk6IE1ha2UgLnVhaGFsZiwgLnVhd29yZCwgYW5kCi0JLnVheHdvcmQgYXZhaWxhYmxlIGV2ZW4gaWYgbm90IE9CSl9FTEYuCi0JKG1kX2F0b2YpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIHdvcmRQLgotCi1UaHUgT2N0ICAzIDAwOjE2OjUwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTB4MDAuYywgY29uZmlnL3RjLW1uMTB4MDAuaDogTmV3IGZpbGVzCi0JZm9yIE1hdHN1c2hpdGEgTU4xMHgwMCBzdXBwb3J0LgotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgbW4xMHgwMC0qLSoKLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotV2VkIE9jdCAgMiAxNTo1NDowMyAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogb2JqLWV2YXguaDogbW92ZSBvcGVudm1zIGRlZmluaXRpb25zIGZyb20gaGVyZSB0byB0Yy1hbHBoYS5jLgotCSogdGMtYWxwaGEuYzogYWRkIHN1cHBvcnQgZm9yIHZtc19jYXNlX2hhY2sgbGlrZSBpbiB2YXgvdm1zLgotCShsb2FkX2V4cHJlc3Npb24pOiB0cmFjayBjbG9iYmVyaW5nIG9mIGJhc2UgcmVnIGJlZm9yZSBqbXAvanNyLgotCShzX2FscGhhX2ZpbGUpOiBwYXNzIGNhc2VfaGFjayBmbGFncyBhbmQgc291cmNlIGZpbGVuYW1lIHZpYQotCXN5bWJvbCB0YWJsZSB0byBiZmQuCi0JKiB0Yy1hbHBoYS5oIChUQ19DT05TX0ZJWF9ORVcpOiBkZWZpbmUKLQotVHVlIE9jdCAgMSAxNjoxNjowMSAxOTk2ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBtaXBzLSotZWxmKi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIE9jdCAgMSAxMjozNzo0OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19tYWNybyk6IFdhcm4gaWYgYSBtYWNybyBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhCi0JcHNldWRvLW9wLgotCShzX3NwYWNlKTogSW4gbTY4ayBNUkkgbW9kZSwgYWxpZ24gdG8gYSB3b3JkIGJvdW5kYXJ5LgotCSogbWFjcm8uYyAoZGVmaW5lX21hY3JvKTogQWRkIG5hbWVwIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCSogbWFjcm8uaCAoZGVmaW5lX21hY3JvKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCShwYXJzZV9hcmdzKTogQ2hhbmdlIHZlcnNpb24gcHJpbnRpbmcgdG8gbWF0Y2ggY3VycmVudCBHTlUKLQlzdGFuZGFyZHMuCi0JKiBnYXNwLmMgKHNob3dfdXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKG1haW4pOiBDaGFuZ2UgdmVyc2lvbiBwcmludGluZyB0byBtYXRjaCBjdXJyZW50IEdOVSBzdGFuZGFyZHMuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGluaXRfdGFibGUpOiBDb3JyZWN0IGFjY2VzcyBjb250cm9sIHVuaXQKLQlyZWdpc3RlciBudW1iZXJzLiAgRnJvbSBLZW4gUm9zZSA8cm9zZUBuZXRjb20uY29tPi4KLQotCSogY29uZmlnL3RjLWFscGhhLmM6IEFkZCBzb21lIHN0YXRpYyBmdW5jdGlvbiBwcm90b3R5cGVzLgotIAkoYWxwaGFfbWFjcm9zKTogTW92ZSB0byB0b3Agb2YgZmlsZS4gIE1ha2Ugc3RhdGljLgotCShhbHBoYV9udW1fbWFjcm9zKTogTW92ZSB0byB0b3Agb2YgZmlsZS4KLQotVHVlIE9jdCAgMSAwOTozNjoxOSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiB0Yy12ODUwLmg6ICBEZWZpbmUgTE9DQUxfTEFCRUwgdG8gcmVjb2duaXNlIF8uTF8qIHN5bWJvbHMKLQlnZW5lcmF0ZWQgYnkgRFdBUkYuCi0KLVNhdCBTZXAgMjggMDM6Mzg6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3Rfc3ltYm9sX3RhYmxlKTogUmVtb3ZlIGJvZ3VzIGNvZGUgaW4gQkZENjQgY2FzZSwKLQlhbmQganVzdCBjYWxsIHNwcmludGZfdm1hLgotCi1UaHUgU2VwIDI2IDE2OjA0OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChleHByKTogQ2hhbmdlID4+PSB0byA+PiAoZml4IHR5cG8pLiAgKEZyb20gbWVpc3NuZXIpLgotCi1UdWUgU2VwIDI0IDE5OjA1OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChmbG9hdF9jb25zKTogQ2FsbCBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCBpZiBpdCBpcwotCWRlZmluZWQuCi0KLVR1ZSBTZXAgMjQgMTI6MjI6MTggMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX29wZXJhbmQpOiBDcmVhdGVkLiAgQWxsb3dzIG9wZXJhbmRzIHRvIAotCXN0YXJ0IHdpdGggJyMnLgotCSogY29uZmlnL3RjLWQxMHYuaCAobWRfb3BlcmFuZCk6IFVuZGVmaW5lZC4KLQotTW9uIFNlcCAyMyAxMjoxMzoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGFkZF9maXgpOiBUcmVhdCBhIHdpZHRoIG9mICczJyBsaWtlICdCJy4KLQkobWRfYXNzZW1ibGUpOiBBIGZpeHVwIHdpZHRoIG9mICczJyBtZWFucyBhIDEgYnl0ZSByZWxvYy4KLQotVGh1IFNlcCAxOSAxMjoyMToyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgYWRqdXN0IFBDIHJlbGF0aXZlCi0JcmVsb2MgZm9yIHRoZSBpOTYwIGZvciBhIHJlbG9jIGluIHRoZSBzYW1lIHNlY3Rpb24uICBUaGlzIHVuZG9lcwotCW9uZSBvZiB0aGUgdHdvIGNoYW5nZXMgbWFkZSBBdWcgMTkuCi0KLVdlZCBTZXAgMTggMTI6MTE6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfZW5kZWYpOiBCb3RoIHZlcnNpb25zOiBNb3ZlIENfU1RBVAotCXN5bWJvbHMgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLU1vbiBTZXAgMTYgMTE6NDE6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKGV4cHIpOiBBbHdheXMgdXNlIHVuc2lnbmVkIHJpZ2h0IHNoaWZ0cyBmb3IgPj4uCi0KLVRodSBTZXAgMTIgMTA6MjU6NDUgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBVcGRhdGUgdHdvIHRodW1iIGluc3RydWN0aW9uCi0gCXNsb3RzIHdoZW4gcHJvY2Vzc2luZyBCTCBmaXh1cHMuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAob3V0cHV0X2luc3QpOiBFbnN1cmUgVGh1bWIgQkwgZml4dXAgaXMgbWFya2VkCi0gCW9uIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSBpbnN0cnVjdGlvbi4KLQotV2VkIFNlcCAxMSAwMDowOTozNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N0YWIpOiBDcmVhdGUgYW4gZXhwcmVzc2lvbiBzeW1ib2wgZm9yIGEgY29tcGxleAotCXN0YWJzIGV4cHJlc3Npb24sIHJhdGhlciB0aGFuIGdpdmluZyBhbiBlcnJvci4KLQotCSogZWNvZmYuYyAoZWNvZmZfbmV3X2ZpbGUpOiBEb24ndCBkbyBhbnl0aGluZyBpZiB3ZSBhcmUgc3RpbGwgaW4KLQl0aGUgc2FtZSBmaWxlLgotCi1UdWUgU2VwIDEwIDExOjQ1OjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBGaWxsIGluIHRoZSB2YWx1ZSBmb3IgYSBjb25zdGFudAotCWp1bXAsIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgcmVsb2MuCi0KLU1vbiBTZXAgIDkgMTA6NTc6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IERvbid0IHN3YXAgYW4gaW5zdHJ1Y3Rpb24gd2hpY2gKLQlzZXRzIGEgY29uZGl0aW9uIGNvZGUgd2l0aCBhbiBpbnN0cnVjdGlvbiB3aGljaCB1c2VzIGEgY29uZGl0aW9uCi0JY29kZS4KLQkobWlwc19pcCk6IEluIGNhc2VzICdOJyBhbmQgJ00nLCBsb29rIGZvciAkZmNjTiByYXRoZXIgdGhhbiBhbgotCWltbWVkaWF0ZSB2YWx1ZS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBSZWNvZ25pemUgcjUwMDAgZm9yIGNwdS4KLQkobWlwc19pcCk6IEdpdmUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSBpZiB0aGUgSVNBIGxldmVsIGlzIHdyb25nLgotCShtZF9wYXJzZV9vcHRpb24pOiBSZWNvZ25pemUgLW1jcHU9W3ZdW3JdNTAwMC4KLQotU2F0IFNlcCAgNyAxMzoyNTo1NSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKENPVU5UX1RPUF9aRVJPRVMpOiBBZGRlZCBtYWNybyB0byBjb3VudAotIAlsZWFkaW5nIHplcm9lcy4KLQkobG9hZF9yZWdpc3Rlcik6IEVuc3VyZSBoaTMyIGJpdHMgYXJlIG5vdCBsb3N0IGR1cmluZyBsbzMyYml0Ci0gCXByb2Nlc3NpbmcuIEZpeCBzaGlmdCBvZmZzZXQgdGhhdCB3YXMgb3ZlcmZsb3dpbmcgaW50byB0aGUgbmV4dAotIAlpbnN0cnVjdGlvbiBmaWVsZC4gQWRkIGNvZGUgdG8gZ2VuZXJhdGUgc2hvcnRlciBzZXF1ZW5jZXMgZm9yCi0gCWNvbnN0YW50cyB3aXRoIGEgc2luZ2xlIGNvbnRpZ3VvdXMgc2VxZXVlbmNlIG9mIG9uZXMuCi0KLUZyaSBTZXAgIDYgMTc6MDc6MTIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGQxMHZfZG90X3dvcmQpOiBOZXcgZnVuY3Rpb24gdG8gc3VwcG9ydAotCSJAd29yZCIgd2l0aCB0aGUgd29yZCBwc2V1ZG8tb3AuCi0JKG1kX2FwcGx5X2ZpeDMpOiBDbGVhbnVwIGFuZCBjaGFuZ2VzIHRvIHN1cHBvcnQgY29ycmVjdCBzaXplcwotCWZvciAxNiBhbmQgMTgtYml0IHJlbG9jcy4KLQotRnJpIFNlcCAgNiAxNjowMDoyOSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjLSotYW91dCk6IFNldCBgZW0nLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZy90ZS1zcGFyY2FvdXQuaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JSWZkZWYgVEVfU1BBUkNPVVQgZGVmaW5lIFRBUkdFVF9GT1JNQVQgYW5kIFNQQVJDX0JJRU5ESUFOLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKElOU05fQklHX0VORElBTik6IE5ldyBtYWNyby4KLQkoU1BFQ0lBTF9DQVNFX3tTRVRTVyxTRVRYfSk6IERlZmluZS4KLQkoe05PUCxPUixGTU9WUyxTRVRISSxTTExYLFNSQX1fSU5TTik6IERlZmluZS4KLQkobWRfYmVnaW4pOiBEZWxldGUgc2V0dGluZyBvZiBgdGFyZ2V0X2JpZ19lbmRpYW4nLgotCShvdXRwdXRfaW5zbik6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXNzZW1ibGUpOiBSZXdyaXRlLiAgQWRkIGBzZXR4JyBzdXBwb3J0LgotCShzcGFyY19pcCk6IEhhbmRsZSBgMCcgb3BlcmFuZCBjaGFyLiAgUmVjb2duaXplIHNldHV3LCBzZXRzdywgc2V0eAotCXNwZWNpYWwgY2FzZXMuCi0JKG1kX2F0b2YpOiBBZGQgbGl0dGxlIGVuZGlhbiBzdXBwb3J0LgotCShtZF9udW1iZXJfdG9fY2hhcnMpOiBMaWtld2lzZS4KLQkobWRfYXBwbHlfZml4KTogTGlrZXdpc2UuCi0JKG1kX2xvbmdvcHRzKTogUmVjb2duaXplIC1FTCwtRUIgaWZkZWYgU1BBUkNfQklFTkRJQU4uCi0JKG1kX3BhcnNlX29wdGlvbik6IExpa2V3aXNlLgotCShtZF9zaG93X3VzYWdlKTogUHJpbnQgLUVMLCAtRUIgaWZkZWYgU1BBUkNfQklFTkRJQU4uCi0KLVRodSBTZXAgIDUgMTM6NDA6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9uZXdfZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVjb2ZmLmggKGVjb2ZmX25ld19maWxlKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAob2JqX2FwcF9maWxlKTogRGVmaW5lLgotCi1UaHUgU2VwICA1IDEzOjM5OjI1IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobG9hZF9leHByZXNzaW9uKTogQmlhcyB0aGUgLmxpdDggc2VjdGlvbgotCXN5bWJvbCBieSAzMmsgc28gdGhhdCBvdXIgMTYtYml0IHNpZ25lZCBvZmZzZXQgY2FuIGFkZHJlc3MgdGhlCi0JZW50aXJlIGNodW5rLiAgUmVwb3J0ZWQgYnkgPG1hdHRAbGtnLmRlYy5jb20+LgotCi1XZWQgU2VwICA0IDEwOjIzOjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgdG1wLgotCi1XZWQgU2VwICA0IDExOjI0OjI5IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IFJlbW92ZSB1bm5lY2Vzc2FyeSBjb2RlIHRoYXQKLSAJd2FzIGNhdXNpbmcgdGhlIGhpZ2ggMzJiaXRzIG9mIDY0Yml0IGNvbnN0YW50cyB0byBiZSBsb3N0LgotCQotVHVlIFNlcCAgMyAxMzo1Mjo1NiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogQWRkZWQgY2hhbmdlcyB0byBzdXBwb3J0IGZ1bmN0aW9uCi0JcG9pbnRlcnMgYW5kICJAd29yZCIgc3ludGF4LgotCi1UdWUgU2VwICAzIDExOjU3OjE4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYzogUmVtb3ZlIGNvbW1lbnRlZCBvdXQgYW5kICNpZiAwJ2QgY29kZS4KLQkodjg1MF9yZWxvY19wcmVmaXgpOiBQcm92aWRlIHByb3RvdHlwZS4KLQkocG9zdGZpeCwgZ2V0X3JlbG9jLCBidWlsZF9pbnNuKTogUmVtb3ZlIHByb3RvdHlwZXMgZm9yIG5vbmV4aXN0YW50Ci0JZnVuY3Rpb25zLgotCShtZF9iZWdpbiwgbWRfYXNzZW1ibGUsIG1kX2FwcGx5X2ZpeDMpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQkobWRfYXNzZW1ibGUpOiBBZGQgZGVmYXVsdCB0byBjYXNlIHN0YXRlbWVudC4KLQotU2F0IEF1ZyAzMSAxNjowMzowMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogQ29tcHV0ZSBzaXplIG9mIHRoZSBpbnN0cmN0aW9uCi0JZnJvbSB0aGUgb3Bjb2RlLgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hcHBseV9maXgzKTogRG8gc2ltcGxlIGJ5dGUsIHNob3J0IGFuZAotCXdvcmQgZml4dXBzIHRvby4KLQotRnJpIEF1ZyAzMCAyMzo1MDowOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2FwcGx5X2ZpeDMpOiBVc2UgbGl0dGxlIGVuZGlhbiBnZXQvcHV0Ci0Jcm91dGluZXMgdG8gZmV0Y2gvc3RvcmUgdGhlIHVwZGF0ZWQgaW5zdHJ1Y3Rpb24gZnJvbS90byBtZW1vcnkuCi0JKHY4NTBfaW5zZXJ0X29wZXJhbmQpOiBJZiB0aGUgb3BlcmFuZCBoYXMgYSBzcGVjaWFsaXplZCBpbnNlcnQKLQlyb3V0aW5lLCBjYWxsIGl0LgotCi1GcmkgQXVnIDMwIDE4OjM1OjI2IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChyZWdfbmFtZV9zZWFyY2gpOiBBbGlnbiBjYWxsaW5nIGNvbnZlbnRpb24gdG8KLSAJYmUgbGlrZSBpZGVudGljYWwgZnVuY3Rpb24gZm91bmQgaW4gdGMtcHBjLmMuCi0JKGdldF9yZWxvYyk6IFJlbW92ZWQuCi0JKHY4NTBfcmVsb2NfcHJlZml4KTogTmV3IGZ1bmN0aW9uLCBwYXJzZSBsbygpLCBoaSgpIGFuZCBoaTAoKS4KLQkobWRfYXNzZW1ibGUpOiBlbWl0IGZpeHVwcy4KLQkobWRfcGNyZWxfZnJvbSk6IHJlbmFtZWQgZnJvbSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24sIGVtaXQgcHJvcGVyCi0gCWRpc3BsYWNlbWVudC4KLQkobWRfYXBwbHlfZml4Myk6IGhhbmRsZSBmaXh1cHMvcmVsb2NzLgotCSogY29uZmlnL3RjLXY4NTAuaCAoTURfUENSRUxfRlJPTV9TRUNUSU9OKTogUmVtb3ZlZCBkZWZpbml0aW9uLgotCQotRnJpIEF1ZyAzMCAxODoxMjowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlBZGQgU0ggRUxGIHN1cHBvcnQuCi0JKiBjb25maWd1cmUuaW4gKHNoLSotZWxmKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWcvdGMtc2guaCAoVEFSR0VUX0FSQ0gpOiBEZWZpbmUuCi0JKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0gCShUQ19DT0ZGX0ZJWDJSVFlQRSk6IE9ubHkgZGVmaW5lIGlmIE9CSl9DT0ZGLgotCShCRkRfQVJDSCwgQ09GRl9NQUdJQywgVENfQ09VTlRfUkVMT0MpOiBMaWtld2lzZS4KLQkoVENfUkVMT0NfTUFOR0xFLCB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBMaWtld2lzZS4KLQkoRE9fTk9UX1NUUklQLCBORUVEX0ZYX1JfVFlQRSwgVENfS0VFUF9GWF9PRkZTRVQpOiBMaWtld2lzZS4KLQkoVENfQ09GRl9TSVpFTUFDSERFUCwgdGNfZnJvYl9maWxlKTogTGlrZXdpc2UuCi0JKFNVQl9TRUdNRU5UX0FMSUdOKTogTGlrZXdpc2UuCi0JKFJFTE9DXzMyKTogRG9uJ3QgZGVmaW5lLgotCSh0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCk6IERlZmluZSBpZiBCRkRfQVNTRU1CTEVSLgotCSh0YXJnZXRfYmlnX2VuZGlhbik6IERlY2xhcmUgaWYgT0JKX0VMRi4KLQkoVEFSR0VUX0ZPUk1BVCk6IERlZmluZSBpZiBPQkpfRUxGLgotCSogY29uZmlnL3RjLXNoLmM6IFVzZSBCRkQgcmVsb2MgY29kZXMgaW5zdGVhZCBvZiBTSCBDT0ZGIHJlbG9jCi0JbnVtYmVycyB0aHJvdWdob3V0LgotCSh0Y19jcmF3bF9zeW1ib2xfY2hhaW4pOiBPbmx5IGRlZmluZSBpZiBPQkpfQ09GRi4KLQkodGNfaGVhZGVyc19ob29rLCB0Y19jb2ZmX3NpemVtYWNoZGVwKTogTGlrZXdpc2UuCi0JKHN0cnVjdCBzaF9jb3VudF9yZWxvY3MpOiBEZWZpbmUuCi0JKHNoX2NvdW50X3JlbG9jcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQlzaF9mcm9iX2ZpbGUuICBBZGQgQkZEX0FTU0VNQkxFUiBjb2RlLgotCShzaF9mcm9iX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoc2hfZnJvYl9maWxlKTogQ2FsbCBzaF9mcm9iX3NlY3Rpb24uCi0JKG1kX2NvbnZlcnRfZnJhZyk6IElmIEJGRF9BU1NFTUJMRVIsIGNoYW5nZSB0eXBlIG9mIGhlYWRlcnMsIGFuZAotCWNhbGwgc2VjdGlvbl9zeW1ib2wgcmF0aGVyIHRoYW4gc2VnX2luZm8gKHNlZyktPmRvdC4KLQkobWRfc2VjdGlvbl9hbGlnbik6IEFkZCBPQkpfRUxGIHZlcnNpb24uCi0JKFNXSVRDSF9UQUJMRV9DT05TKTogRGVmaW5lLgotCShTV0lUQ0hfVEFCTEUpOiBVc2UgU1dJVENIX1RBQkxFX0NPTlMuCi0JKG1kX2FwcGx5X2ZpeCk6IENoYW5nZSBwYXJhbWV0ZXIgdHlwZXMgaWYgQkZEX0FTU0VNQkxFUi4gIE9ubHkKLQloYW5kbGUgZnhfcl90eXBlID09IDAgaWYgbm90IEJGRF9BU1NFTUJMRVIuICBSZXR1cm4gMCBpZgotCUJGRF9BU1NFTUJMRVIuCi0JKHN0cnVjdCByZWxvY19tYXApOiBEZWZpbmUgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JKGNvZmZfcmVsb2NfbWFwKTogTGlrZXdpc2UuCi0JKHNoX2NvZmZfcmVsb2NfbWFuZ2xlKTogVXNlIGNvZmZfcmVsb2NfbWFwIHRvIGNvbnZlcnQgZnhfcl90eXBlLgotCSh0Y19nZW5fcmVsb2MpOiBOZXcgZnVuY3Rpb24gaWYgQkZEX0FTU0VNQkxFUi4KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IElmZGVmIG91dCBmeF93aGVyZSB0ZXN0IHdoaWNoIHRyaWdnZXJzCi0JaW5hcHByb3ByaWF0ZWx5IGZvciBTSCBFTEYuCi0JKHdyaXRlX29iamVjdF9maWxlKTogQ2FsbCB0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCBhbmQKLQlvYmpfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgaWYgdGhleSBhcmUgZGVmaW5lZC4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2UgQkZEX1JFTE9DXzE2LCBub3QKLQlCRkRfUkVMT0NfTk9ORSwgd2hlbiBjYWxsaW5nIGZpeF9uZXdfZXhwIGZvciBhIGJyb2tlbiB3b3JkLgotCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IEZpeCBjb252ZXJzaW9uIG9mIGJ5dGUgY291bnQgdG8gQkZEIHJlbG9jCi0JY29kZS4KLQotRnJpIEF1ZyAzMCAxNDo0NzozOCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZmluZF9vcGNvZGUpOiBGaXggcHJvYmxlbSB3aXRoIGNhbGN1bGF0aW5nIAotCWJyYW5jaCBzaXplcyBpbiBhY3Jvc3Mgc2VjdGlvbnMuCi0KLUZyaSBBdWcgMzAgMDA6NDQ6MTMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtODUwLmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlIGhpKCkgY29ycmVjdGx5LiAgSGFuZGxlCi0JaGkwKCkgdG9vLgotCi1XZWQgQXVnIDI4IDIzOjExOjA4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYmVnaW4pOiBEZWFsIHdpdGggZW5kIG9mIG9wY29kZQotCXRhYmxlIG1hcmtlci4KLQotV2VkIEF1ZyAyOCAxOToyMDowNCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZmluZF9vcGNvZGUpOiBGaXggYSBidWcgd2hpY2ggY291bGQgZ2VuZXJhdGUKLQl0aGUgd3Jvbmcgb3Bjb2RlIGZvciBjYXNlcyBsaWtlIHN0Mncgd2hlcmUgdGhlcmUgYXJlIG1hbnkgZm9ybXMKLQlvZiB0aGUgc2FtZSBpbnN0cnVjdGlvbi4KLQotVHVlIEF1ZyAyNyAxMzo1MzoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IElmIG1kX3BhcnNlX25hbWUgaXMgZGVmaW5lZCwgY2FsbCBpdCBiZWZvcmUKLQljYWxsaW5nIHN5bWJvbF9maW5kX29yX21ha2UuCi0JKiBjb25maWcvdGMtcHBjLmggKG1kX3BhcnNlX25hbWUpOiBEZWZpbmUuCi0JKHBwY19wYXJzZV9uYW1lKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1wcGMuYyAocmVnX25hbWVfc2VhcmNoKTogQWRkIHJlZ3MgYW5kIHJlZ2NvdW50Ci0JcGFyYW1ldGVycy4KLQkocmVnaXN0ZXJfbmFtZSk6IFVwZGF0ZSBjYWxsIHRvIHJlZ19uYW1lX3NlYXJjaC4KLQkoY3Jfb3BlcmFuZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGNyX25hbWVzKTogTmV3IHN0YXRpYyBjb25zdCBhcnJheS4KLQkocHBjX3BhcnNlX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2Fzc2VtYmxlKTogSWYgUFBDX09QRVJBTkRfQ1IgaXMgc2V0IGluIHRoZSBvcGVyYW5kIGZsYWdzLCBzZXQKLQljcl9vcGVyYW5kIGJlZm9yZSBjYWxsaW5nIGV4cHJlc3Npb24uCi0KLVR1ZSBBdWcgMjcgMDk6MDU6NTAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MpOiBBZGQgbmV3IGFyZ3VtZW50IHRvCi0JaHBwYV9nZW5fcmVsb2NfdHlwZSBjYWxsLgotCi1Nb24gQXVnIDI2IDE4OjI0OjUxIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBGaXhlZCAiLndvcmQiLiAgRml4ZWQgcHJvYmxlbSB3aXRoIHJhbmdlIGNoZWNraW5nCi0Jb24gYWRkcmVzc2VzLiAgSW1wcm92ZWQgZXJyb3IgbWVzc2FnZXMuCi0JKiBkb2MvYy1kMTB2LnRleGk6IEFkZGVkIGRvY3MgZm9yIHJlZ2lzdGVyIHBhaXJzLgotCi1Nb24gQXVnIDI2IDEzOjM5OjI3IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChwYXJhbGxlbF9vayk6IEZpeCBidWcgaW4gcGFyYWxsZWwgCi0JY2hlY2tpbmcgY29kZS4KLQotTW9uIEF1ZyAyNiAxNDozODoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGluaXRfZmlsZSk6IEluaXRpYWxpemUgZk1lcmdlIHRvIDEuCi0JKGFkZF9maWxlKTogUmVzdG9yZSBvbGQgZmlsZSBtZXJnaW5nIGNvZGUsIGJ1dCBvbmx5IG1lcmdlIGZpbGVzIGlmCi0JZk1lcmdlIGlzIHNldC4KLQkoZWNvZmZfZGlyZWN0aXZlX2xvYyk6IENsZWFyIGZNZXJnZSBmaWVsZCBvZiBjdXJyZW50IGZpbGUuCi0JKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBMaWtld2lzZS4KLQotRnJpIEF1ZyAyMyAxMTo0MDo0NyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtZDEwdi50ZXhpOiBGaXggdHlwby4gCi0KLUZyaSBBdWcgMjMgMTA6NDE6MzIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IENvcnJlY3QgYml0IG1hc2tpbmcgZm9yCi0JaGkgYW5kIGxvIGV4cHJlc3Npb25zLgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IFJvdWdoIGN1dCBhdCBkZW1hbmRpbmcKLQkiZXAiIG9yICJyMzAiIGluIHNzdCBhbmQgc2xkIGluc3RydWN0aW9ucy4KLQkobWRfYXBwbHlfZml4Myk6IERvbid0IGFib3J0LiAgSnVzdCB3YXJuIHRoYXQgd2UgZG9uJ3QKLQloYXZlIHJlbG9jcyB5ZXQuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKENDX05BTUVfQ05UKTogRGVmaW5lLgotCShjY19uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSBWODUwX09QRVJBTkRfQ0MgY29ycmVjdGx5LgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IERvbid0IGZvcmdldCB0byBpbml0aWFsaXplCi0JImluc24iIQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChyZWdfbmFtZV9zZWFyY2gpOiBHZW5lcmFsaXplIHRvIHNlYXJjaAotCWFueSBnaXZlbiByZWdpc3RlciB0YWJsZS4KLQkocmVnaXN0ZXJfbmFtZSk6IFBhc3MgYXBwcm9wcmlhdGUgdGFibGUgYW5kIHNpemUgdG8gcmVnX25hbWVfc2VhcmNoLgotCShzeXN0ZW1fcmVnaXN0ZXJfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoU1lTUkVHX05BTUVfQ05UKTogRGVmaW5lLgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSBvcGVyYW5kcyB3aGljaCBhcmUgc3lzdGVtIHJlZ2lzdGVycy4KLQkKLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogSWYgd2UgZmluZCBhIHJlZ2lzdGVyLCBidXQgdGhlCi0Jb3Bjb2RlIGRvZXNuJ3Qgd2FudCBhIHJlZ2lzdGVyLCB0aGVuIHdlIGRvbid0IGhhdmUgYSBtYXRjaC4KLQkobWRfYXNzZW1ibGUpOiBHZXQgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgb3Bjb2RlIHRhYmxlLgotCi1UaHUgQXVnIDIyIDEwOjIwOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgYW5kIHN1YnN0aXR1dGUgSExERU5WLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKEhMREVOVik6IE5ldyB2YXJpYWJsZS4KLQkoYXMubmV3KTogVXNlICQoSExERU5WKS4KLQotCSogZWNvZmYuYyAoZWNvZmZfZGlyZWN0aXZlX2VuZGVmKTogQXZvaWQgYSBkaXZpc2lvbiBieSB6ZXJvIGVycm9yCi0JaWYgYW4gYXJyYXkgZGltZW5zaW9uIGlzIG5vdCBrbm93bi4KLQotVGh1IEF1ZyAyMiAxMDo1MDowMCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogRml4IGEgcmVsb2MgYnVnIGNhdXNlZCBieSBteSBsYXN0IGNoYW5nZS4gCi0JKiBkb2MvYy1kMTB2LnRleGk6IENsZWFudXAuCi0JCi1UdWUgQXVnIDIwIDE1OjE1OjE2IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy12ODUwLmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlICh2ODUwLSotZWxmKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAodjg1MC0qLWVsZik6IE5ldyB0YXJnZXQuCi0JCi1XZWQgQXVnIDIxIDE1OjUwOjU0IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkb2MvYy1kMTB2LnRleGk6IE5ldyBmaWxlLgotCSogZG9jL2FsbC50ZXhpOiBBZGRlZCBEMTBWIHN0dWZmLgotCSogZG9jL2FzLnRleGluZm86IEFkZGVkIEQxMFYgc3R1ZmYuCi0KLVR1ZSBBdWcgMjAgMTQ6MTA6MDIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEFsbCByZWZlcmVuY2VzIHRvIGRlZmluZWQgc3ltYm9scyBzaG91bGQKLSAJbm93IHVzZSB0aGUgb3B0aW1hbCBpbnN0cnVjdGlvbi4gIC5mbG9hdCBhbmQgLmRvdWJsZSBub3cgd29yay4gCi0KLU1vbiBBdWcgMTkgMTQ6NDE6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IEFkanVzdCBQQyByZWxhdGl2ZSByZWxvYyBieQotCXNlY3Rpb24gYWRkcmVzcyBmb3IgdGhlIGk5NjAgYXMgaXMgZG9uZSBmb3IgdGhlIGkzODYuCi0KLVRodSBBdWcgMTUgMTY6Mzc6NTkgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBBZGQgd2lsZGNhcmRzIGZvciBjb25maWcgbWF0Y2hpbmcsIGFkZCBtaXBzLSotKgotCWNhc2UsIGZvcndhcmQtaW5jbHVkZSBiZmQvZWxmLWJmZC5oLgotCi1UaHUgQXVnIDE1IDEzOjI0OjMwIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBBZGQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGUgb3Bjb2RlCi0gICAgICAgIHRhYmxlIHRvIGhlbHAgZGV0ZXJtaW5pbmUgd2hpY2ggaW5zdHJ1Y3Rpb25zIGNhbiBiZSBkb25lCi0gICAgICAgIGluIHBhcmFsbGVsLiAKLQotVGh1IEF1ZyAxNSAxNzowMTozMSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYzogTWFqb3IgY2hhbmdlcyB0byBhZGQgVGh1bWIgc3VwcG9ydCwgd2l0aCBsb3RzCi0gCW9mIGNoYW5nZSBpbnB1dCBmcm9tIDxyZWFybnNoYUBhcm1sdGQuY28udWs+LgotCVJldmVydGVkIHRvIElOU05fU0laRSBtYWNybywgcmF0aGVyIHRoYW4gaW5zbl9zaXplIHZhcmlhYmxlLgotCShpbnNucyk6IEFkZGVkIEFSTSAiYngiIGluc3RydWN0aW9uIHN1cHBvcnQuCi0JKHRpbnNucyk6IEFkZGVkIFRodW1iIGluc3RydWN0aW9uIGRlZmluaXRpb24gc3RydWN0dXJlLgotCShhcm1fdG9wc19oc2gpOiBBZGRlZCBoYXNoIHN0cnVjdHVyZSBmb3IgVGh1bWIgb3Bjb2Rlcy4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkZWQgIi5hcm0iLCAiLnRodW1iIiBhbmQgIi5jb2RlIiBwc2V1ZG8tb3BzLgotCShvcGNvZGVfc2VsZWN0LHNfYXJtLHNfdGh1bWIsc19jb2RlKTogQWRkZWQuCi0JKGRlY29kZV9zaGlmdCk6IEFsbG93IHVwcGVyLWNhc2UgUlJYLgotCShkb19sZHN0KTogU2ltcGxlciBoYWxmd29yZCBzdXBwb3J0LgotCShkb19sZG1zdG0pOiBJbXByb3ZlZC4KLQkocmVnX2xpc3QsIGRvX2J4LCB0aHVtYl9yZWcsIHRodW1iX2FkZF9zdWIsIHRodW1iX3NoaWZ0LAotIAl0aHVtYl9tb3ZfY29tcGFyZSwgdGh1bWJfbG9hZF9zdG9yZSwgZG9fdF9hcml0LCBkb190X2FkZCwKLSAJZG9fdF9hc3IsIGRvX3RfYnJhbmNoLCBkb190X2J4LCBkb190X2NvbXBhcmUsIGRvX3RfbGRtc3RtLAotIAlkb190X2xkcmIsIGRvX3RfbGRyaCwgZG9fdF9sZHMsIGRvX3RfbHNsLCBkb190X2xzciwgZG9fdF9tb3YsCi0gCWRvX3RfcHVzaF9wb3AsIGRvX3Rfc3RyLCBkb190X3N0cmIsIGRvX3Rfc3RyaCwgZG9fdF9zdWIsIGRvX3Rfc3dpLAotIAlkb190X2Fkcik6IEFkZGVkLgotCShtZF9hcHBseV9maXgzKTogQWRkIHN1cHBvcnQgZm9yIEJGRF9SRUxPQ19BUk1fVEhVTUJfKiByZWxvY2F0aW9ucy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWRkIHN1cHBvcnQgZm9yIC1tdGh1bWIuCi0JKG1kX3Nob3dfdXNhZ2UpOiBVcGRhdGVkIHRvIHJlZmxlY3QgbmV3IGNvbW1hbmQgbGluZSBvcHRpb24uCi0JKGFybV9kYXRhX2luX2NvZGUsIGFybV9jYW5vbmljYWxpemVfc3ltYm9sX25hbWUpOiBBZGRlZC4KLQkqIGNvbmZpZy90Yy1hcm0uaDogUHJvdmlkZSBUQ19GSVhfVFlQRSB0byBhbGxvdyBwcml2YXRlIEFSTQotIAlmcmFnbWVudCBpbmZvcm1hdGlvbiB0byBiZSBoZWxkLgotCi1UaHUgQXVnIDE1IDE2OjEyOjAwIDE5OTYgIFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBBbHNvIHNldCBmaXhQLT5meF9kb25lIGlmIGZ4X2FkZHN5IGlzIAotCW5vbi1udWxsLCBidXQgaXMgYSBjb25zdGFudC4KLQkoZml4X25ld19hcm0pOiBDYWxsIG1ha2VfZXhwcl9zeW1ib2wgdG8gbWFrZSB0aGUgZXhwcmVzc2lvbiBzeW1ib2wKLQlzbyB0aGF0IGVycm9yIHJlcG9ydGluZyB3aWxsIHdvcmsgY29ycmVjdGx5LgotCi1XZWQgQXVnIDE0IDEwOjM3OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCByZWxvY3MKLQlhZ2FpbnN0IHdlYWsgc3ltYm9scy4KLQotVHVlIEF1ZyAxMyAxNzozOToyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoVENfRk9SQ0VfUkVMT0NUSU9OKTogRGVmaW5lIGlmIE9CSl9YQ09GRi4KLQkocHBjX2ZvcmNlX3JlbG9jYXRpb24pOiBEZWNsYXJlIGlmIE9CSl9YQ09GRi4KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcgZnVuY3Rpb24gaWYKLQlPQkpfWENPRkYuCi0KLU1vbiBBdWcgMTIgMTY6NDk6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5oIChCWVRFX09SREVSKTogRG9uJ3QgZGVmaW5lLiAgTm8gbG9uZ2VyIHVzZWQuCi0KLUZyaSBBdWcgIDkgMTc6NDg6MjggMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEZpeCBwcm9ibGVtIHdpdGggcmVsb2NzLiAKLQotRnJpIEF1ZyAgOSAxNDoxNjoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IElmIG5vdCBCRkRfQVNTRU1CTEVSLCBhbHdheXMgYWxpZ24KLQl3aXRoIG5vcHMgaWYgbm90IGluIGRhdGFfc2VjdGlvbiBvciBic3Nfc2VjdGlvbi4KLQotVGh1IEF1ZyAgOCAxMjozMjo1NiAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCUFkZCBzdXBwb3J0IGZvciBvcGVuVk1TL0FscGhhLgotCSogYXMuaCAoUFJJTlRGX0xJS0UpOiBEb24ndCBkZWZpbmUgaWYgVk1TLCBmb3Igbm93LgotCSogY29uZmlnL29iai1ldmF4LmM6IE5ldyBmaWxlLgotCSogY29uZmlnL29iai1ldmF4Lmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLWFscGhhLmM6IEFkZCBzdXBwb3J0IGZvciBFVkFYIGZvcm1hdCBpZiBPQkpfRVZBWCBpcwotCWRlZmluZWQuCi0JKiBjb25maWcvdGMtYWxwaGEuaDogQWRkIHN1cHBvcnQgZm9yIEVWQVggZm9ybWF0IGlmIE9CSl9FVkFYIGlzCi0JZGVmaW5lZC4gIEFkZCBjYXNlIGZvciBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91ci4KLQkqIGNvbmZpZy92bXMtYS1jb25mLmg6IE5ldyBmaWxlLgotCSogY29uZi1hLWdhcy5jb206IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluOiBBZGQgdGFyZ2V0IGFscGhhLSotKnZtcyouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBtYWtlZmlsZS52bXM6IE5ldyBmaWxlLgotCSogcmVhZC5jIChzX2xjb21tKTogQWxpZ24gYnNzX3NlZyBvbiA4IGJ5dGUgYm91bmRhcnkgaWYgT0JKX0VWQVguCi0JRG9uJ3QgY2FsbCBmZnMgb24gb3BlblZNUy9BbHBoYS4KLQotV2VkIEF1ZyAgNyAxNDoxOTowMyAxOTk2ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWd1cmUuaW46IE1ha2UgR0FTX0NIRUNLX0RFQ0xfTkVFREVEIGluY2x1ZGUgPHN0cmluZy5oPiBvcgotCTxzdHJpbmdzLmg+IGlmIHRoZXkgZXhpc3QuICBDYWxsIEdBU19DSEVDS19ERUNMX05FRURFRCBvbiBzdHJzdHIKLQlhbmQgc2Jyay4KLQkqIGFjY29uZmlnLmggKE5FRURfREVDTEFSQVRJT05fU1RSU1RSKTogTmV3IG1hY3JvLgotCShORUVEX0RFQ0xBUkFUSU9OX1NCUkspOiBOZXcgbWFjcm8uCi0JKiBjb25maWd1cmUsIGNvbmYuaW46IFJlYnVpbGQuCi0JKiBhcy5oOiBPbmx5IGluY2x1ZGUgPHN0cmluZ3MuaD4gaWYgSEFWRV9TVFJJTkdTX0guCi0JKHN0cnN0cik6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIuCi0JKiBhcy5jOiBJZiBIQVZFX1NCUksgYW5kIE5FRURfREVDTEFSQVRJT05fU0JSSywgZGVjbGFyZSBzYnJrLgotCi1XZWQgQXVnICA3IDExOjUwOjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IEhhbmRsZSBhZGRpdGlvbiBvciBzdWJ0cmFjdGlvbgotCWJ5IGEgY29uc3RhbnQgYmVmb3JlIGVudGVyaW5nIHRoZSBtYWluIHN3aXRjaC4gIFJlamVjdCBhdHRlbXB0cyB0bwotCWFwcGx5IGFuIGFyaXRobWV0aWMgZnVuY3Rpb24gdG8gbm9uLWFic29sdXRlIHN5bWJvbHMsIGV4Y2VwdCBmb3IKLQl0aGUgc3BlY2lhbCBjYXNlIG9mIHN1YnRyYWN0aW9uIG9mIHR3byBzeW1ib2xzIGluIHRoZSBzYW1lCi0Jc2VjdGlvbi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2VjdGlvbl9hbGlnbik6IERvIGFsaWduIGlmIE9CSl9FTEYsIGJ1dAotCW5vdCB0byBtb3JlIHRoYW4gYSAxNiBieXRlIGJvdW5kYXJ5LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19nZW5fcmVsb2MpOiBBY2NlcHQgYWxsIHJlbG9jczsgcmVtb3ZlCi0JI2lmbmRlZiBPQkpfRUxGIGxpbmVzLiAgRnJvbSBFcmljIFZhbGV0dGUgPHZhbGV0dGVAY3JmLmNhbm9uLmZyPi4KLQkodGNfZ2VuX3JlbG9jKTogSWYgb3V0IG9mIG1lbW9yeSBjYWxsIGFzX2ZhdGFsIHJhdGhlciB0aGFuCi0JYXNzZXJ0LiAgSWYgbm8gaG93dG8gZm91bmQsIGNhbGwgYXNfYmFkX3doZXJlIHJhdGhlciB0aGFuCi0JYXNfZmF0YWwuICBDaGFuZ2UgdGhlIGVycm9yIG1lc3NhZ2Ugc2xpZ2h0bHkuICBTZXQgaG93dG8gdG8gYQotCW5vbi1OVUxMIHZhbHVlIGluIG9yZGVyIHRvIGtlZXAgZ29pbmcuCi0KLVR1ZSBBdWcgIDYgMTI6NTg6MDMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEFkZGVkIGNvZGUgdG8gc3VwcG9ydCAzMi1iaXQgZml4dXBzIGZvciBzdGFicy4KLQotVHVlIEF1ZyAgNiAxMToxNToyNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChnZXRfc3BlY2lmaWMpOiBOZXcgb3BlcmFuZCAic2l6ZSIgZGVyaXZlZAotCWZyb20gIi5iIiwgIi53IiBhbmQgIi5sIiBleHRlbnNpb25zLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4gIElmCi0JdGhlIGJhc2UgaW5zdHJ1Y3Rpb24gaGFzIG5vIG9wZXJhbmRzLCB0aGVuIHVzZSB0aGUgc2l6ZSB0bwotCWRldGVybWluZSB3aGljaCBzcGVjaWZpYyBpbnN0cnVjdGlvbiB0byB1c2UuCi0KLU1vbiBBdWcgIDUgMTQ6MjE6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChtZW1fZm10KTogQ2FsbCBwYXJzZV9leHByIGJlZm9yZSBlbWl0LgotCi1GcmkgQXVnICAyIDExOjIzOjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2VjdGlvbl9hbGlnbik6IERvbid0IGNoYW5nZSBhZGRyIGlmCi0JT0JKX0VMRi4KLQotVGh1IEF1ZyAgMSAyMzo1MTo1MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IFJldmVydCB5ZXN0ZXJkYXkncyBjaGFuZ2VzLgotCQotV2VkIEp1bCAzMSAxNDo0NjoxMSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogRGlzYWJsZSByYW5nZSBjaGVja2luZyBvbiAxNi1iaXQgdmFsdWVzLgotCi1XZWQgSnVsIDMxIDE2OjI3OjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFNldCBva19hcmNoIGZvciBldmVyeSBpbnN0cnVjdGlvbiwKLQlub3QganVzdCB0aGUgb25lcyB0aGF0IGRvbid0IG1hdGNoLgotCi1XZWQgSnVsIDMxIDExOjQ1OjE1IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBGaXhlZCBidWdzIGluIHNob3J0IHJlbG9jcyBhbmQgcmFuZ2UgY2hlY2tpbmcuCi0KLVdlZCBKdWwgMzEgMTU6NDE6NDIgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtYXJtLmM6IENoYW5nZWQgSU5TTl9TSVpFIHRvIHZhcmlhYmxlIGluc25fc2l6ZSwgYXMKLSAJcHJlLWN1cnNvciB0byBhZGRpbmcgVGh1bWIgc3VwcG9ydC4gQWxzbyBhZGRlZCBjcHVfdmFyaWFudCBmbGFnCi0gCWluZm9ybWF0aW9uIHRvIGVhY2ggb2YgdGhlIGFzbV9mbGcgc3RydWN0dXJlcy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogVXBkYXRlZCBBUk03IHBhcnNpbmcgdG8gYWxsb3cgJ3QnIGZvcgotIAl0aHVtYi9oYWxmd29yZCBzdXBwb3J0LCBhc3dlbGwgYXMgJ20nIGZvciBsb25nIG11bHRpcGx5LgotCShtZF9zaG93X3VzYWdlKTogVXBkYXRlZCBoZWxwIG1lc3NhZ2UuCi0JKG1kX2Fzc2VtYmxlKTogQ2hlY2sgdGhhdCBpbnN0cnVjdGlvbiBmbGFncyBhcmUgYXBwbGljYXRlZCB0byB0aGUKLSAJY3VycmVudCBjcHUgdmFyaWFudC4KLQkobWRfYXBwbHlfZml4MywgdGNfZ2VuX3JlbG9jKTogQWRkIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTggYW5kCi0gCUJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMIHJlbG9jYXRpb24gc3VwcG9ydCBmb3IgbmV3IGhhbGZ3b3JkIGFuZAotIAlzaWduZXh0ZW5zaW9uIGluc3RydWN0aW9ucy4KLQkoZG9fbGRzdCk6IEdlbmVyYXRlIGhhbGZ3b3JkIGFuZCBzaWduZXh0ZW5zaW9uIHZhcmlhbnRzIGlmCi0gCW1uZW1vbmljIGZsYWdzIG1hdGNoLgotCShsZHN0X2V4dGVuZCk6IERvIG5vdCBhbGxvdyBzaGlmdHMgaW4gdGhlIG9mZnNldCBmaWVsZCBvZiBoYWxmd29yZAotIAlvciBzaWduZXh0ZW5zaW9uIGluc3RydWN0aW9ucy4KLQkodmFsaWRhdGVfb2Zmc2V0X2ltbSk6IFByb3ZpZGUgY2hlY2sgb24gaGFsZndvcmQgYW5kIHNpZ25leHRlbnNpb24KLSAJaW1tZWRpYXRlIHJhbmdlLgotCShhZGRfdG9fbGl0X3Bvb2wpOiBNZXJnZSBpZGVudGljYWwgbGl0ZXJhbCBwb29sIHZhbHVlcy4KLQotVHVlIEp1bCAzMCAxNDoyODoyMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHNlbGVjdG9yX3RhYmxlKTogQWRkICdFJyBzZWxlY3Rvci4KLQkoY29uc19maXhfbmV3X2hwcGEpOiBEb24ndCBjb2tlIG9uIGVfZXNlbC4KLQkodGNfZ2VuX3JlbG9jLCBTT00gdmVyc2lvbik6IEhhbmRsZSBSX0NPTVAyIHdoZW4gdXNlZAotCXRvIGhlbHAgZ2VuZXJhdGUgZXhjZXB0aW9uIGhhbmRsaW5nIHRhYmxlcy4KLQkobWRfYXBwbHlfZml4KTogRG9uJ3QgdHJ5IHRvIGFwcGx5IGZpeHVwcyB3aXRoIGFuIGVfZXNlbAotCXNlbGVjdG9yLgotCShocHBhX2ZpeF9hZGp1c3RhYmxlKTogRml4dXBzIHdpdGggZV9lc2VsIHNlbGVjdG9ycwotCWFyZSBub3QgYWRqdXN0YWJsZS4KLQotVHVlIEp1bCAzMCAxNTo1MTo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgMmJ5dGUsIDRieXRlLCBhbmQgOGJ5dGUKLQlwc2V1ZG8tb3BzLgotCi1GcmkgSnVsIDI2IDExOjQzOjAzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBBZGRlZCBsb3RzIG9mIGVycm9yIGNoZWNraW5nLiAgQWRkZWQgaGFja3MKLQl0byBzdXBwb3J0IGFjY3VtdWxhdG9yIHNoaWZ0cy4KLQkKLUZyaSBKdWwgMjYgMTE6NTY6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKFNfU0VUX0VYVEVSTkFMKTogTGV0IC53ZWFrIG92ZXJyaWRlLgotCShTX0NMRUFSX0VYVEVSTkFMKTogTGlrZXdpc2UuCi0JKFNfU0VUX1dFQUspOiBSZW1vdmUgZXJyb3I7IGp1c3QgbGV0IC53ZWFrIG92ZXJyaWRlLgotCi1UaHUgSnVsIDI1IDE1OjIyOjUxIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9hc3NlbWJsZSk6IE5vdyBoYW5kbGVzIG11bHRpbGluZQotCWluc3RydWN0aW9ucy4KLQotVGh1IEp1bCAyNSAxMjowMzozMyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogRml4IHBhY2thZ2luZyBidWcuIEFkZGVkIHJhbmdlIGNoZWNraW5nLgotCUFkZGVkIGtsdWRnZSBmb3IgZGl2cyBpbnN0cnVjdGlvbi4gIEZpeGVkIG1pbm9yIHByb2JsZW0gd2l0aAotCW11bHRpcGxlIHRleHQgc2VjdGlvbnMuCi0JKiBjb25maWcvdGMtZDEwdi5oIChkMTB2X2NsZWFudXApOiBDaGFuZ2UgcHJvdG90eXBlLiAKLQkKLVR1ZSBKdWwgMjMgMTA6NDk6MzYgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBGaXggYWxsIGluc3RydWN0aW9uCi0JYWRkcmVzc2VzIHRvIGJlIHJpZ2h0LXNoaWZ0ZWQgYnkgMi4KLQotTW9uIEp1bCAyMiAxMTozMjozNiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogTWFueSBjaGFuZ2VzIHRvIGdldCByZWxvY3Mgd29ya2luZy4KLSAJKHJlZ2lzdGVyX25hbWUpOiBObyBsb25nZXIgY3JlYXRlcyBhIHN5bWJvbCBmb3IgcmVnaXN0ZXIgbmFtZXMuCi0gCShwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBtb3ZlZCB0byBvcGNvZGVzL2QxMHYtb3BjLmMuCi0JKGQxMHZfaW5zZXJ0X29wZXJhbmQpOiBOb3cgd29ya3MgY29ycmVjdGx5IGZvciBlaXRoZXIgY29udGFpbmVyLgotCSogY29uZmlnL3RjLWQxMHYuaCAoZDEwdl9jbGVhbnVwKTogRGVjbGFyZS4gCi0JCi1Nb24gSnVsIDIyIDE0OjAxOjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAodGNfZ2VuX3JlbG9jKTogQkZEX1JFTE9DX1BDUkVMX0hJMTZfUyBhbmQKLQlCRkRfUkVMT0NfUENSRUxfTE8xNiBhcmUgZXhwZWN0ZWQgdG8gYmUgUEMgcmVsYXRpdmUuCi0KLU1vbiBKdWwgMjIgMTI6NDY6NTUgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIHRjLWFscGhhLmM6IFBhdGNoZXMgdG8gdHJhY2sgY3VycmVudCBtaW5pbXVtIGFsaWdubWVudCB0byByZWR1Y2UKLQl0aGUgbnVtYmVyIG9mIGZyYWdtZW50cyBjcmVhdGVkIHdpdGggZnJhZ19hbGlnbi4KLQkoYWxwaGFfY3VycmVudF9hbGlnbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNfYWxwaGFfdGV4dCk6IFJlc2V0IGFsaWdubWVudCB0byAwLgotCShzX2FscGhhX2RhdGEsIHNfYWxwaGFfcmRhdGEsIHNfYWxwaGFfc2RhdGEpOiBMaWtld2lzZS4KLQkoc19hbHBoYV9zdHJpbmdlciwgc19hbHBoYV9zcGFjZSk6IE5ldyBmdW5jdGlvbnMuCi0JKHNfYWxwaGFfY29ucywgYWxwaGFfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBSZW1vdmUgZnVuY3Rpb25zLgotCShhbHBoYV9jb25zX2FsaWduKTogTmV3IGZ1bmN0aW9uIHRvIHJlcGxhY2UgYm90aCBvZiB0aGVtLgotCShlbWl0X2luc24pOiBPbmx5IGFsaWduIGlmIGFscGhhX2N1cnJlbnRfYWxpZ24gaXMgbGVzcyB0aGFuIDI7Ci0JcmVzZXQgYWxwaGFfY3VycmVudF9hbGlnbiB0byAyLgotCShzX2FscGhhX2dwcmVsMzIpOiBMaWtld2lzZS4KLQkoc19hbHBoYV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLiAgQmFzaWNhbGx5IGR1cGxpY2F0ZSB0aGUgb3RoZXIKLQlhbHBoYSBzZWN0aW9uIGNoYW5nZSBob29rcy4gIE9ubHkgZGVmaW5lIGZvciBFTEYuCi0JKHNfYWxwaGFfZmxvYXRfY29ucyk6IFNpbXBsaWZ5IGFsaWdubWVudCBoYW5kbGluZy4KLQkobWRfcHNldWRvX3RhYmxlKTogT25seSBkZWZpbmUgInJkYXRhIiBhbmQgInNkYXRhIiBpZiBPQkpfRUNPRkYuCi0JSWYgT0JKX0VMRiwgZGVmaW5lICJzZWN0aW9uIiwgInNlY3Rpb24ucyIsICJzZWN0IiwgYW5kICJzZWN0LnMiLgotCURvbid0IGRlZmluZSB0aGUgc19hbHBoYV9jb25zIHBzZXVkby1vcHMuICBEbyBkZWZpbmUKLQlzX2FscGhhX3N0cmluZ2VyIGFuZCBzX2FscGhhX3NwYWNlIHBzZXVkby1vcHMuCi0JKGFscGhhX2FsaWduKTogU2tpcCBpZiBsZXNzIHRoYW4gY3VycmVudCBkZWZhdWx0IGFsaWdubWVudC4gIFNldAotCWRlZmF1bHQgYWxpZ25tZW50LgotCSogdGMtYWxwaGEuaCAobWRfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBSZW1vdmUuCi0JKG1kX2NvbnNfYWxpZ24pOiBBZGQuCi0KLQkqIHRjLWFscGhhLmM6IEFkZCBvb2RsZXMgb2YgZnVuY3Rpb24gZGVzY3JpcHRpb24gY29tbWVudHMuCi0JKG1kX2JpZ251bV90b19jaGFycyk6IFJlbW92ZTsgdGhlcmUgYXJlIG5vIGNhbGxlcnMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIHNvbWUgbW9yZSB2YXJpYW50cy4KLQotVGh1IEp1bCAxOCAxNTo1NDo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEFuZHJldyBHaWVydGggPEFORFJFV0dAbWljcm9saXNlLmNvLnVrPjoKLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMtKi1zeXN2NCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcHNldWRvX3RhYmxlKTogQ2hhbmdlIHVhaGFsZiwgdWF3b3JkLCBhbmQKLQl1YXh3b3JkIHRvIHVzZSBzX3VhY29ucy4KLQkoc3BhcmNfbm9fYWxpZ25fY29ucyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNfdWFjb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3BhcmNfY29uc19hbGlnbik6IElmIHNwYXJjX25vX2FsaWduX2NvbnMgaXMgc2V0LCBqdXN0IGNsZWFyIGl0Ci0JYW5kIHJldHVybi4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfY29tbW9uKTogUmVtb3ZlIHVudXNlZCBsYWJlbCBhbGxvY2F0ZV9ic3MuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG1pcHMtKi1pcml4NiogdGFyZ2V0LiAgSGFuZGxlIElyaXggNiBsaWtlIElyaXgKLQk1IHdpdGggcmVnYXJkIHRvIHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBVc2UgdGhlIGNvcnJlY3QgbGVuZ3RoIHdoZW4KLQlhbGxvY2F0aW5nIHNwYWNlIGZvciB0aGUgdW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIGVycm9yIG1lc3NhZ2UuCi0KLVRodSBKdWwgMTggMTI6NTc6MTAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQxMHYtKi0qKTogQWxsb3cgZDEwdi0qLSosIGRvbid0IHJlcXVpcmUgZDEwdi0qLWVsZiouCi0KLVdlZCBKdWwgMTcgMTQ6MjU6MTMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLWQxMHYuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUgKGQxMHYtKi1lbGYpOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChkMTB2LSotZWxmKTogTmV3IHRhcmdldC4KLQkKLUZyaSBKdWwgMTIgMjA6NTQ6MTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IFJlY29nbml6ZSAtSyBQSUMuCi0KLVdlZCBKdWwgMTAgMTI6Mzk6MDggMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9hbGlnbik6IENoYW5nZSBmaWxsIHBhcmFtZXRlcgotCXRvIGEgcG9pbnRlci4gIFRha2UgTlVMTCBhcyAwIG9yIG5vcCBkZXBlbmRpbmcgb24gc2VjdGlvbi4gIENoYW5nZQotCWFsbCBjYWxsZXJzLgotCShzX2FscGhhX2FsaWduKTogUmVuYW1lIGxvY2FsIHZhcmlhYmxlcy4KLQotCSogZG9jL2FzLnRleGluZm8gKC5hbGlnbik6IERvY3VtZW50IGFjdGlvbiBvZiBvbWl0dGVkCi0JZmlsbCBwYXJhbWV0ZXIuCi0KLVdlZCBKdWwgMTAgMDA6MjM6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBHaXZlIGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UKLQl3aGVuIGFuIHVuc3VwcG9ydGVkIFBDIHJlbGF0aXZlIHJlbG9jIGlzIHNlZW4sIHJhdGhlciB0aGFuIGNhbGxpbmcKLQlhYm9ydC4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogUmVtb3ZlIG5vdF9jcHBfbGluZSBsb2NhbCB2YXJpYWJsZS4KLQlJbnN0ZWFkLCBjaGVjayBzdGF0ZSB3aGVuICcjJyBjb21tZW50IGlzIHNlZW4uCi0KLU1vbiBKdWwgIDggMTQ6MTE6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX3JlZ21hc2tfZnJhZyk6IE9ubHkgZGVmaW5lIGlmIE9CSl9FTEYgb3IKLSAJT0JKX01BWUJFX0VMRi4KLQkodGNfZ2VuX3JlbG9jKTogSWYgZml4dXAgd2FzIGNoYW5nZWQgdG8gYmUgUEMgcmVsYXRpdmUsIGNoYW5nZQotIAlyZWxvYyB0eXBlIGFjY29yZGluZ2x5LiAgVXNlIG5hbWUgb2YgcmVsb2MgaW4gZXJyb3IgbWVzc2FnZS4KLQotCSogYXMuaDogRG9uJ3QgZGVmaW5lIGNvbnN0IG9yIHZvbGF0aWxlLgotCSogZmxvbnVtLmg6IERvbid0IGRlZmluZSBjb25zdC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAodGNfZ2VuX3JlbG9jKTogQ2hhbmdlIHRoZSBjb2RlIGFwcHJvcHJpYXRlbHkKLQlpZiBmeF9wY3JlbCBpcyBzZXQuICBDb3JyZWN0IHNldHRpbmcgdGhlIGFkZGVuZCBjYXNlIGluIHRoZQotCU9CSl9FTEYgY2FzZSAoZnJvbSBBbmRyZWFzIFNjaHdhYgotCTxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+KS4KLQkobWRfc2hvd191c2FnZSk6IENvcnJlY3QgLW1mYzUyMDAgdG8gLW01MjAwLgotCi1GcmkgSnVsICA1IDEwOjMyOjU4IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtbTY4ay50ZXhpOiBEb2N1bWVudCAtbTUyMDAgZmxhZy4KLQkqIGRvYy9hcy50ZXhpbmZvOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFRoZSBjb2xkZmlyZSBkb2VzIG5vdCBzdXBwb3J0IDh4Ci0gCXNjYWxlIGZhY3Rvci4KLQotRnJpIEp1bCAgNSAxMTowNzoyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAoU19TRVRfRVhURVJOQUwpOiBDaGFuZ2UgYXNfd2FybiB0byBhc19iYWQuCi0JKFNfQ0xFQVJfRVhURVJOQUwsIFNfU0VUX1dFQUspOiBMaWtld2lzZS4KLQotVGh1IEp1bCAgNCAxMTo1OTo0NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogU2V0IHRvIGN5Z251cy0yLjcuMS4KLQotCSogUmVsZWFzZWQgYmludXRpbHMgMi43LgotCi1UaHUgSnVsICA0IDEwOjExOjMzIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IE9ubHkgcGVyZm9ybSByYW5nZSBjaGVjayB3aGVuCi0gCWRlYWxpbmcgd2l0aCBPX2NvbnN0YW50IGV4cHJlc3Npb25zLgotCi1XZWQgSnVsICAzIDE1OjAyOjIxIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogbTY4ay1wYXJzZS5oIChtNjhrX3JlZ2lzdGVyKTogQWRkIG5ldyBjb2xkZmlsZSBjb250cm9sCi0JcmVnaXN0ZXJzLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtY2Y1MjAwX2NvbnRyb2xfcmVncyk6IE5ldyB2YXJpYWJsZSwgCi0JYXJyYXkgb2YgY29udHJvbCByZWdpc3RlcnMgZm9yIHRoZSBjb2xkZmlyZS4KLQkoY3B1X29mX2FyY2gpOiBBZGRlZCBtY2Y1MjAwLgotCShhcmNocyk6IEFkZGVkIG1jZjUyMDAuCi0JKGluaXRfdGFibGUpOiBBZGQgbmV3IGNvbnRyb2wgcmVnaXN0ZXJzLgotCShtNjhrX2lwKTogQWRkZWQgc3VwcG9ydCBmb3IgbmV3IGNvbnRyb2wgcmVnaXN0ZXJzLgotCShtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9zaG93X3VzYWdlKTogQWRkIC1tNTIwMCB0byB1c2FnZSB0ZXh0LgotCi1XZWQgSnVsICAzIDE2OjA1OjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5oIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50KTogRGVjbGFyZS4KLQkqIHJlYWQuYyAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCk6IFJlbW92ZSBkZWNsYXJhdGlvbi4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IENvcnJlY3QgcGFyZW50aGVzaXphdGlvbiBvZiB8fAotCXdpdGhpbiAmJi4KLQkobWRfYXNzZW1ibGUpOiBGaXggaGFuZGxpbmcgb2YgQGwgd2l0aCBhbiB1bnNpZ25lZCBjb25zdGFudC4gIEFkZAotCWRlZmF1bHQgY2FzZSB0byByZWxvYyBzd2l0Y2guCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKEFPVVRfTUFDSFRZUEUpOiBEZWZpbmUgYXMgMCBpZiBURV8zODZCU0QuCi0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gVG9tIFF1aWdnbGUgPHF1aWdnbGVAc2dpLmNvbT46Ci0JKiBlY29mZi5jIChsYXN0X2xpbmVubyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGFkZF9wcm9jZWR1cmUpOiBTZXQgbGFzdF9saW5lbm8uCi0JKGVjb2ZmX2RpcmVjdGl2ZV9sb2MpOiBMaWtld2lzZS4KLQkoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IExpa2V3aXNlLgotCShlY29mZl9maXhfbG9jKTogTmV3IGZ1bmN0aW9uLgotCSogZWNvZmYuaCAoZWNvZmZfZml4X2xvYyk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IFdoZW4gaW5zZXJ0aW5nIG5vcHMsIGFuZCB1c2luZwotCUVDT0ZGIGRlYnVnZ2luZywgY2FsbCBlY29mZl9maXhfbG9jLgotCi1UdWUgSnVsICAyIDIzOjAyOjEyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGJ1aWxkX2J5dGVzKTogSWYgYW4gb3BlcmFuZCB0eXBlIGlzIAotCW1hcmtlZCBhcyBTUkNfSU5fRFNUIHJldHJpZXZlIGl0IGZyb20gdGhlICJkZXN0aW5hdGlvbiIgb3AuCi0KLVNhdCBKdW4gMjkgMTM6Mzg6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGFybS0qLXJpc2NpeCopOiBTZXQgZW11bGF0aW9uIHRvIHJpc2NpeC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy90ZS1yaXNjaXguaDogTmV3IGZpbGUgdG8gZGVmaW5lIFRFX1JJU0NJWC4KLQotCSogY29uZmlnL3RjLXNoLmggKFNVQl9TRUdNRU5UX0FMSUdOKTogRGVmaW5lLgotCi1GcmkgSnVuIDI4IDE1OjE0OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy5zdGF0dXMpOiBKdXN0IHJ1biBjb25maWcuc3RhdHVzIGFzIG90aGVyCi0JdG9vbHMgZG8uCi0KLUZyaSBKdW4gMjggMTE6MDk6MzggMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluIChUQVJHRVRfT1MpOiBBZGQgZGVmaW5pdGlvbiB0byBjb25mLgotCi1UaHUgSnVuIDI3IDIwOjM5OjQwIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBQYXJlbnRoZXNpemUKLQljb3BfaW50ZXJsb2NrcyBleHByZXNzaW9ucy4KLQotVGh1IEp1biAyNyAxMjoxODoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19wcmludCk6IENsb3NlIHRoZSBsaXN0aW5nIGZpbGUgaWYgaXQgaXMgbm90Ci0Jc3Rkb3V0LiAgQ2xvc2UgdGhlIG90aGVyIGZpbGVzIG9wZW5lZCBmb3IgdGhlIGxpc3RpbmcuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChtZF9jb25zX2FsaWduKTogRGVmaW5lLgotCShzcGFyY19jb25zX2FsaWduKTogRGVjbGFyZS4KLQkoSEFORExFX0FMSUdOKTogRGVmaW5lLgotCShzcGFyY19oYW5kbGVfYWxpZ24pOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2NvbnNfYWxpZ24pOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX2hhbmRsZV9hbGlnbik6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuYyAoY29uc193b3JrZXIpOiBDYWxsIG1kX2NvbnNfYWxpZ24gaWYgaXQgaXMgZGVmaW5lZC4KLQotCSogYXMuaCAoc3RydWN0IGZyYWcpOiBBZGQgZnJfZmlsZSBhbmQgZnJfbGluZSBmaWVsZHMuCi0JKiBmcmFncy5jIChmcmFnX25ldyk6IFNldCBmcl9maWxlIGFuZCBmcl9saW5lLgotCShmcmFnX3Zhcik6IExpa2V3aXNlLgotCShmcmFnX3ZhcmlhbnQpOiBMaWtld2lzZS4KLQotCSogYXMuaCAoc3RydWN0IGZyYWcpOiBSZW1vdmUgdW51c2VkIGFsaWduX21hc2sgYW5kIGFsaWduX29mZnNldAotCWZpZWxkcy4KLQotCSogbGlzdGluZy5jIChjYWxjX2hleCk6IE9mZnNldCBieSBmcl9maXggd2hlbiBleGFtaW5pbmcgZnJfdmFyLgotCUZyb20gPHVkZGVib3JnQGNhcm1lbi5zZT4uCi0KLVdlZCBKdW4gMjYgMTM6MjE6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1vc2YqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLW02OGsuYzogQWRkIDY4ZWMwNjAgYXMgYSBzeW5vbnltIGZvciA2ODA2MC4KLQotV2VkIEp1biAyNiAxNjoyMzowOCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IEFkZGVkIGNvcF9pbnRlcmxvY2tzLCB0byBhdm9pZCBOT1AgaW5zZXJ0aW9uCi0gCWJldHdlZW4gY28tcHJvY2Vzc29yIGNvbXBhcmlzb25zIGFuZCBicmFuY2hlcyBmb3IgdGhlIFZSNDMwMC4KLQotTW9uIEp1biAyNCAxODowMjo1MCAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgaW5jbHVkZWRpciwKLQlJTlNUQUxMX1BST0dSQU0sIElOU1RBTExfREFUQSk6IFVzZSBhdXRvY29uZi1zZXQgdmFsdWVzLgotCShkb2NkaXIpOiBSZW1vdmVkLgotCSogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBhdXRvY29uZiAyLjUgb3IgaGlnaGVyLgotCSogZG9jL01ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLAotCWluY2x1ZGVkaXIpOiBVc2UgYXV0b2NvbmYgc2V0IHZhbHVlcy4KLQkoZG9jZGlyKTogUmVtb3ZlZC4KLQotTW9uIEp1biAyNCAxMTo1ODoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19lamVjdCk6IERvbid0IGRvIGFueXRoaW5nIGlmIGxpc3RpbmcgaXMgMC4KLQkobGlzdGluZ19saXN0KTogTGlrZXdpc2UuCi0JKGxpc3Rpbmdfc291cmNlX2xpbmUpOiBMaWtld2lzZS4KLQkobGlzdGluZ190aXRsZSk6IERvbid0IHNhdmUgdGl0bGUgaWYgbGlzdGluZyBpcyAwLgotCShsaXN0aW5nX3NvdXJjZV9maWxlKTogQ2hlY2sgbGlzdGluZyByYXRoZXIgdGhhbiBsaXN0aW5nX3RhaWwuCi0KLQkqIGNvbmZpZ3VyZS5pbjogT24gYWxwaGEqLSotb3NmKiwgbGluayBhZ2FpbnN0IGxpYmJmZC5hIGlmIG5vdAotCXVzaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBKdW4gMjEgMTg6MjI6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogSW4gY2FzZSAnaScvJ2onLCBkb24ndCByZXF1aXJlIGFuCi0JYWJzb2x1dGUgZXhwcmVzc2lvbiBpZiBhIHJlbG9jYXRpb24gdHlwZSB3YXMgc3BlY2lmaWVkLgotCi1GcmkgSnVuIDIxIDE3OjQwOjE2IDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG1lcmxpbi5nY3MucmVkc3RvbmUuYXJteS5taWw+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yICotKi1ydGVtcyogY29uZmlndXJhdGlvbnMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBKdW4gMjEgMTY6MDE6MTggMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGFscGhhLSotbGludXhlY29mZiogdGFyZ2V0LiAgVXNlIGVsZiBmb3IKLQlhbHBoYS0qLWxpbnV4KiB0YXJnZXQuICBGb3JjZSBiZmRfZ2FzIGZvciBhbHBoYS0qLiAgUmVxdWlyZQotCW9wY29kZXMgbGlicmFyeSBmb3IgYWxwaGEuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEwLgotCSogY29uZmlnL3RjLWFscGhhLmM6IFN1YnN0YW50aWFsIHJld3JpdGUgdG8gYWRkIEVMRiBzdXBwb3J0IGFuZAotCXVzZSBuZXcgb3Bjb2RlIHRhYmxlLgotCSogY29uZmlnL3RjLWFscGhhLmggKG1kX3VuZGVmaW5lZF9zeW1ib2wpOiBEb24ndCBkZWZpbmUuCi0JKExPQ0FMX0xBQkVMKTogRGVmaW5lIGRpZmZlcmVudGx5IGlmIE9CSl9FTEYuCi0JKEZBS0VfTEFCRUxfTkFNRSk6IERlZmluZSBpZiBPQkpfRUxGLgotCSogY29uZmlnL2FscGhhLW9wY29kZS5oOiBSZW1vdmUuCi0JKiBjb25maWcvb2JqLWVsZi5oOiBJZiBUQ19BTFBIQSwgZGVmaW5lIEVDT0ZGX0RFQlVHR0lORy4KLQkqIE1ha2VmaWxlLmluIChUQVJHX0NQVV9ERVBfYWxwaGEpOiBEZXBlbmQgdXBvbgotCWluY2x1ZGUvb3Bjb2RlL2FscGhhLmggcmF0aGVyIHRoYW4gY29uZmlnL2FscGhhLW9wY29kZS5oLgotCi1UaHUgSnVuIDIwIDE5OjEwOjI4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9lbWl0X3JlbG9jYXRpb25zKTogR2l2ZSBhbiBlcnJvciBpZiB0aGUKLQlyZWxvY2F0aW9uIHN5bWJvbCB3YXMgbm90IHJlc29sdmVkLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBMaWtld2lzZS4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBSZWZldGNoIHRoZSBzeW1ib2wgc2VjdGlvbiBhZnRlcgotCWNhbGxpbmcgU19HRVRfVkFMVUUsIHNpbmNlIGl0IG1heSBoYXZlIGNoYW5nZWQuCi0KLQkqIGV4cHIuYyAoc3RydWN0IGV4cHJfc3ltYm9sX2xpbmUpOiBEZWZpbmUuCi0JKGV4cHJfc3ltYm9sX2xpbmVzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWFrZV9leHByX3N5bWJvbCk6IEFkZCBlbnRyeSB0byBleHByX3N5bWJvbF9saW5lcy4KLQkoZXhwcl9zeW1ib2xfd2hlcmUpOiBOZXcgZnVuY3Rpb24uCi0JKiBleHByLmg6IFVzZSBleHRlcm4gb24gZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCShleHByX3N5bWJvbF93aGVyZSk6IERlY2xhcmUuCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogVHJ5IHRvIHVzZSBleHByX3N5bWJvbF93aGVyZQotCXJhdGhlciB0aGFuIHByaW50aW5nIHRoZSBtZWFuaW5nbGVzcyBuYW1lIG9mIGFuIGV4cHJlc3Npb24KLQlzeW1ib2wuCi0KLVRodSBKdW4gMjAgMTU6NTc6NDEgMTk5NiAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX251bWJlcl90b19jaGFycyk6IERlbGV0ZWQuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChtZF9udW1iZXJfdG9fY2hhcnMpOiBOZXcgbWFjcm8uCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChidWlsZF9vcGVyYXRlX24sIGJ1aWxkX21lbSk6IE1vdmVkIGVhcmxpZXIgaW4KLQl0aGUgZmlsZS4KLQkobG9hZF9zeW1ib2xfYWRkcmVzcywgbG9hZF9leHByZXNzaW9uKTogVXNlIGJ1aWxkX21lbS4KLQkoYnVpbGRfb3BlcmF0ZSk6IE5ldyBmdW5jdGlvbi4KLQkoZW1pdF9hZGRxX3IpOiBVc2UgaXQuCi0KLQlXZWQgTWFyIDEzIDIyOjE0OjE0IDE5OTYgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogICNpZiBWTVMsIHVzZSBTX1NFVF9PVEhFUiB0byBzdG9yZSBgY29uc3RfZmxhZycuCi0KLQlUdWUgTWFyICA1IDE0OjMxOjQ1IDE5OTYgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvdGMtdmF4LmggKE5PUF9PUENPREUpOiBEZWZpbmUuCi0KLQlTdW4gRmViICA0IDIxOjAxOjAzIDE5OTYgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5oIChTX0lTX0NPTU1PTik6IERlZmluZS4KLQkoU19JU19MT0NBTCk6IENoZWNrIGZvciBcMDAyIGFzIHdlbGwgYXMgXDAwMS4KLQkoTE9OR1dPUkRfQUxJR05NRU5UKTogTmV3IG1hY3JvLgotCShTVUJfU0VHTUVOVF9BTElHTik6IFVzZSBpdC4KLQotCUZyaSBKYW4gMjYgMTc6NDQ6MDkgMTk5NiAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy92bXMtY29uZi5oOiBSZWNvbmNpbGUgd2l0aCBjb25mLmluLgotCi1XZWQgSnVuIDE5IDExOjMxOjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoaXNfZG5yYW5nZSk6IE9ubHkgZGVmaW5lIGlmIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgaXMKLQlkZWZpbmVkLgotCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgdGhhdCBhbnkgbnVtYmVyIG9mIGhleCBkaWdpdHMgY2FuCi0JZm9sbG93IFx4LgotCi0JKiBhcy5jIChzdHJ1Y3QgZGVmc3ltX2xpc3QpOiBEZWZpbmUuCi0JKGRlZnN5bXMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwYXJzZV9hcmdzKTogSnVzdCBwdXQgLS1kZWZzeW0gYXJndW1lbnRzIG9uIGRlZnN5bXMgbGlzdCwgcmF0aGVyCi0JdGhhbiBkZWZpbmluZyB0aGVtLgotCShtYWluKTogRGVmaW5lIGRlZnN5bXMgYWZ0ZXIgb3V0cHV0IGZpbGUgaXMgY3JlYXRlZC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFJlamVjdCBQUkUgYW5kIFBPU1QgaW5kZXhpbmcgbW9kZSBvbgotCWNwdTMyLiAgRnJvbSBFcmljIE5vcnVtIDxFcmljLk5vcnVtQHVzYXNrLmNhPi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEluIGNhc2VzICdJJywgJ2knLCBhbmQgJ2onLCBzZXQKLQlpbnNuX2Vycm9yIHJhdGhlciB0aGFuIGNhbGxpbmcgY2hlY2tfYWJzb2x1dGVfZXhwci4KLQotCSogYXMuYyAoZW11bGF0aW9uX25hbWUpOiBSZW1vdmUgdW51c2VkIHN0YXRpYyB2YXJpYWJsZS4KLQkoZGVmYXVsdF9lbXVsX2JmZF9uYW1lKTogQWRkIHJldHVybiBOVUxMIHRvIGF2b2lkIHdhcm5pbmcuCi0JKiBlY29mZi5jIChlY29mZl9zdGFiKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgbmFtZSBhbmQKLQluYW1lX2VuZC4KLQkqIGZyYWdzLmMgKGZyYWdfbmV3KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSB0bXAuCi0JKiBoYXNoLmMgKGhhc2hfZ3Jvdyk6IFBhcmVudGhlc2l6ZSArIHdpdGhpbiA8PC4KLQkoaGFzaF9wcmludF9zdGF0aXN0aWNzKTogVXNlICVsdSwgbm90ICVkLCB0byBwcmludCB1bnNpZ25lZAotCWxvbmcgdmFyaWFibGVzLgotCSogbWVzc2FnZXMuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiLgotCShmcHJpbnRfdmFsdWUpOiBBZGQgY2FzdCB0byBhdm9pZCBwcmludGYgd2FybmluZy4KLQkoc3ByaW50X3ZhbHVlKTogTGlrZXdpc2UuCi0JKiByZWFkLmM6IEluY2x1ZGUgImVjb2ZmLmgiLgotCShlbWl0X2V4cHIpOiBBZGQgY2FzdHMgdG8gYXZvaWQgcHJpbnRmIHdhcm5pbmdzLgotCSogcmVhZC5oOiBVc2UgZXh0ZXJuIGZvciBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0JKHBvcF9pbnNlcnQpOiBEZWNsYXJlLgotCSogc3RhYnMuYzogSW5jbHVkZSAiZWNvZmYuaCIuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIHRtcCwKLQlmb3JtZXJfbGFzdF9mcmFnUCwgYW5kIG5ld19mcmFnUC4KLQkqIHN1YnNlZ3MuaCAoc3Vic2Vnc19wcmludF9zdGF0aXN0aWNzKTogRGVjbGFyZS4KLQkqIHN5bWJvbHMuYyAoZGVidWdfdmVyaWZ5X3N5bWNoYWluKTogQ2hhbmdlIG1hY3JvIHRvIGRpc2NhcmQKLQlhcmd1bWVudHMuCi0JKiB3cml0ZS5jIChkdW1wX3NlY3Rpb25fcmVsb2NzKTogTGlrZXdpc2UuCi0JKiB3cml0ZS5oOiBVc2UgZXh0ZXJuIGZvciBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0JKHdyaXRlX3ByaW50X3N0YXRpc3RpY3MpOiBEZWNsYXJlLgotCSogY29uZmlnL2UtbWlwc2Vjb2ZmLmMgKG1pcHNlY29mZl9iZmRfbmFtZSk6IFJldHVybiBOVUxMIHRvIGF2b2lkCi0Jd2FybmluZy4KLQkqIGNvbmZpZy9lLW1pcHNlbGYuYyAobWlwc2VsZl9iZmRfbmFtZSk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1lbGYuaCAoZWxmX2Vjb2ZmX3NldF9leHQpOiBEZWNsYXJlLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogSWYgT0JKX0VMRiwgYWx3YXlzCi0JZW1pdCByZWxvY2F0aW9ucyBhZ2FpbnN0IGV4dGVybmFsIHN5bWJvbHMuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jICh0Y19nZW5fcmVsb2MpOiBPdXRwdXQgYSBzZW5zaWJsZSBlcnJvcgotIAltZXNzYWdlIGlmIGJmZF9yZWxvY190eXBlX2xvb2t1cCBmYWlscywgcmF0aGVyIHRoYW4gY2FsbGluZwotIAlhc3NlcnQuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9mb3JjZV9yZWxvY2F0aW9uKTogQWRkCi0JQkZEX1JFTE9DXzEyX1BDUkVMIHRvIHN3aXRjaC4KLQotVHVlIEp1biAxOCAyMDoyOTo1NyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChMT0NBTF9MQUJFTCxGQUtFX0xBQkVMX05BTUUpOiBVc2UgZGVmYXVsdHMgZm9yCi0JVEVfUEUgKExmb28sIG5vdCAuTGZvbykuCi0KLVR1ZSBKdW4gMTggMTc6MTM6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfZmlsbCk6IERvbid0IHdhcm4gYWJvdXQgYSB6ZXJvIHJlcGVhdCBjb3VudC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IERvbid0IHdhcm4gYWJvdXQgdXNpbmcgQVQgYXMgYQotCWNvcHJvY2Vzc29yIHJlZ2lzdGVyLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IFdoZW4gY2hlY2tpbmcgdGhlIHNpemUgb2YgYQotCXJlZ2lzdGVyIHRvIHNldCB0aGUgc2l6ZSBvZiBhbiBpbnN0cnVjdGlvbiwgZG8gYSBiaXR3aXNlIGFuZCB3aXRoCi0JUmVnOCBhbmQgUmVnMTYgcmF0aGVyIHRoYW4gcmVxdWlyaW5nIHRoZSB0eXBlIHRvIGJlIGV4YWN0bHkgUmVnOAotCW9yIFJlZzE2LgotCi1UdWUgSnVuIDE4IDEzOjE5OjUxIDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAocGFyc2VfcmVnKTogVHdlYWsgZXJyb3IgbWVzc2FnZXMuCi0JKGJ1aWxkX2J5dGVzKTogTGlrZXdpc2UuCi0JKHNraXBfY29sb250aGluZyk6IEhhbmRsZSA6MzIgc3VmZml4LgotCShnZXRfc3BlY2lmaWMpOiBQcm9tb3RlIExfMjQgdG8gTF8zMiBpZiBpdCBtYWtlcyBhIG1hdGNoLgotCURvbid0IGFsd2F5cyBwcm9tb3RlIExfOCB0byBMXzE2LgotCShkb19hX2ZpeF9pbW0pOiBDbGVhbiB1cCBMXzMyIGFuZCBMXzI0IGhhbmRsaW5nLgotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoU21vZGUpOiBOZXcgdmFyaWFibGUuCi0JKGg4MzAwaG1vZGUpOiBUdXJuIG9mZiBIbW9kZS4KLQkoaDgzMDBzbW9kZSk6IE5ldyBmdW5jdGlvbi4gIFR1cm4gb24gU21vZGUgYW5kIEhtb2RlLgotCShtZF9wc2V1ZG9fdGFibGUpOiBOZXcgIi5oODMwMHMiIHBzZXVkby1vcC4KLQkocGFyc2VfcmVnKTogSGFuZGxlICJleHIiIHJlZ2lzdGVyLgotCShnZXRfb3BlcmFuZCk6IEhhbmRsZSBiaXphcnJlIHN5bnRheCBmb3IgInN0bS5sIiBhbmQgImxkbS5sIi4KLQlIYW5kbGUgIm1hY2giIGFuZCAibWFjaGwiIG9wZXJhbmRzIGZvciBsZG1hYy4KLQkoZ2V0X3NwZWNpZmljKTogSGFuZGxlICJzdG0ubCIgYW5kICJsZG0ubCIuCi0JKGJ1aWxkX2J5dGVzKTogSGFuZGxlICJzdG0ubCIgYW5kICJsZG0ubCI7IGhhbmRsZSBNQUNSRUcgb3BlcmFuZHMuCi0JKiBjb25maWcvdGMtaDgzMDAuaCAoQ09GRl9NQUdJQyk6IEhhbmRsZSBIOC9TIG1hZ2ljIG51bWJlci4KLQkoU21vZGUpOiBEZWNsYXJlLgotCi1Nb24gSnVuIDE3IDE1OjUwOjUzIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IFJlb3JkZXIgY2hhcHRlciBvZiBtYWNoaW5lIGRlcGVuZGVudCBvcHRpb25zIHNvCi0gCXRoYXQgaXQgaXMgc29ydGVkIGJ5IGNoaXAgbmFtZS4gIAotCi0JKiBkb2MvYXMudGV4aW5mbzogVXNlIGNvbnNpc3RhbnQgc3BlbGxpbmcgb2YgVmF4LgotCSogZG9jL2MtdmF4LnRleGk6IExpa2V3aXNlLgotCi1Nb24gSnVuIDE3IDExOjI2OjU2IDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgIi5iZWdpbl90cnkiIGFuZCAiLmVuZF90cnkiCi0JcHNldWRvIG9wcy4KLQkodGNfZ2VuX3JlbG9jLCBTT00gdmVyc2lvbik6IEhhbmRsZSBSX0JFR0lOX1RSWSBhbmQgUl9FTkRfVFJZLgotCShtZF9hcHBseV9maXgpOiBMaWtld2lzZS4KLQkocGFfdHJ5KTogTmV3IGZ1bmN0aW9uLgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSByZWxvY3MgZm9yIEJFR0lOX1RSWSBhbmQgRU5EX1RSWS4KLQotU3VuIEp1biAxNiAyMjo1Nzo0NyAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICIubGV2ZWwiIHBzZXVkbyBvcC4KLQkocGFfbGV2ZWwpOiBOZXcgZnVuY3Rpb24uCi0KLUZyaSBKdW4gMTQgMjA6MDY6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbmV3bGluZSk6IERvbid0IGRvIGFueXRoaW5nIGlmIGxpc3RpbmcgaXMgMC4KLQotVGh1IEp1biAxMyAxNzo1MDo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBJZiBzeW1ib2xfdGFibGVfZnJvemVuIGlzIHNldCwgY2FsbAotCXN5bWJvbF9jcmVhdGUsIG5vdCBzeW1ib2xfbmV3LgotCi1XZWQgSnVuIDEyIDE0OjEwOjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBEb24ndCBzZXQgc3lfdXNlZF9pbl9yZWxvYyBmb3IgYW4KLQlhYnNvbHV0ZSBzeW1ib2wgdW5sZXNzIFRDX0ZPUkNFX1JFTE9DQVRJT04gcmV0dXJucyB0cnVlLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAocHJldmlvdXNfZmlsZV9zeW1ib2wpOiBSZW1vdmUgQkZEX0FTU0VNQkxFUgotCXZlcnNpb24uCi0JKGNfZG90X2ZpbGVfc3ltYm9sKTogQkZEX0FTU0VNQkxFUiB2ZXJzaW9uOiBEb24ndCBzZXQgdGhlIHZhbHVlIG9mCi0JdGhlIHN5bWJvbCB0byBhIHBvaW50ZXIuICBEb24ndCBzZXQgcHJldmlvdXNfZmlsZV9zeW1ib2wuCi0JU2ltcGxpZnkgc3ltYm9sIGxpc3QgcmVhcnJhbmdlbWVudC4KLQkoY29mZl9mcm9iX3N5bWJvbCk6IERvbid0IGRvIGFueXRoaW5nIHdpdGggQ19GSUxFIHN5bWJvbHMuCi0JKGNvZmZfYWRqdXN0X3N5bXRhYik6IERvbid0IGNoZWNrIHByZXZpb3VzX2ZpbGVfc3ltYm9sLgotCi1Nb24gSnVuIDEwIDE0OjUyOjI5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX2xjb21tKTogTmV3IGZ1bmN0aW9uIGZvciAubGNvbW0KLQlkaXJlY3RpdmUuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBwcGNfZWxmX2xjb21tLgotCi1Nb24gSnVuIDEwIDExOjQ1OjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEFjY2VwdCBBQlNMIGZvciAnTycsIHNvIHRoYXQgYGJmZXh0dQotCWQwezI0OjF9LGQwJyB3b3JrcyB3aXRob3V0IGFuIGltbWVkaWF0ZSBwcmVmaXggb24gdGhlIGJpdCBudW1iZXJzLgotCShtZF9iZWdpbik6IEFkZCBkaWdpdHMgdG8gYWx0X25vdGVuZF90YWJsZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTWFrZSBzIGEgY29uc3QgcG9pbnRlci4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiZW1wdHkiLgotCShzX2VtcHR5KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHN0cnVjdCBmaWxlbmFtZV9saXN0KTogT25seSBkZWZpbmUgaWYgbm90Ci0JQkZEX0FTU0VNQkxFUi4KLQkoZmlsZW5hbWVfbGlzdF9oZWFkLCBmaWxlbmFtZV9saXN0X3RhaWwpOiBMaWtld2lzZS4KLQkoY19zZWN0aW9uX3N5bWJvbCk6IFJlbW92ZSB1bnVzZWQgQkZEX0FTU0VNQkxFUiB2ZXJzaW9uLgotCShvYmpfY29mZl9lbmRlZiwgQkZEX0FTU0VNQkxFUiB2ZXJzaW9uKTogRG9uJ3Qgc2V0IHRoZSBkZWJ1Z2dpbmcKLQlmbGFnIGZvciBDX01PUywgQ19NT0UsIENfTU9VLCBvciBDX0VPUyBzeW1ib2xzLCBzaW5jZSB0aGV5IHNob3VsZAotCWhhdmUgYSBzZWN0aW9uIG9mIE5fQUJTIHJhdGhlciB0aGFuIE5fREVCVUcuICBJZiB3ZSBkbyBhIG1lcmdlLAotCXJlbW92ZSB0aGUgbmV3IHN5bWJvbCBmcm9tIHRoZSBsaXN0LgotIAkob2JqX2NvZmZfZW5kZWYsIGJvdGggdmVyc2lvbnMpOiBDYWxsIHRhZ19pbnNlcnQgZXZlbiBpZiB0aGVyZSBpcwotCWFuIG9sZCBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lLCBpZiB0aGUgb2xkIHN5bWJvbCBkb2VzIG5vdAotCWhhcHBlbiB0byBiZSBhIHRhZy4KLQkoY29mZl9mcm9iX3N5bWJvbCk6IENoZWNrIFNGX0dFVF9UQUcsIENfRU9GLCBhbmQgQ19GSUxFIG91dHNpZGUgb2YKLQl0aGUgU0ZfR0VUX0RFQlVHIGNvbmRpdGlvbi4gIERvbid0IGNhbGwgU0FfU0VUX1NZTV9FTkRORFggd2l0aCBhCi0Jc3ltYm9sIHRoYXQgd2lsbCBiZSBtb3ZlZCB0byB0aGUgZW5kIG9mIHRoZSBzeW1ib2wgbGlzdC4KLQkoY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zKTogQWx3YXlzIGNhbGwgc2VjdGlvbl9zeW1ib2wgZm9yIC50ZXh0LAotCS5kYXRhLCBhbmQgLmJzcy4KLQkoY29mZl9mcm9iX3NlY3Rpb24pOiBMaWtld2lzZS4gIEFsc28sIHJlbW92ZSB1bnVzZWQgdmFyaWFibGUKLQlzdHJuYW1lLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoY29udmVydF9paWYpOiBDYWxsIGZyYWdfZ3JvdyByYXRoZXIgdGhhbgotCW1hbmlwdWxhdGluZyBmcmFncyBkaXJlY3RseS4KLQkobWRfbnVtYmVyX3RvX2ZpZWxkKTogQWRqdXN0IG1lbV9wdHIgY29ycmVjdGx5IGlmIEVORElBTiBpcwotCWRlZmluZWQuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IElmICcvJyBpcyBMSU5FX0NPTU1FTlRfU1RBUlQsIGNoZWNrCi0gCXdoZXRoZXIgdGhlIG5leHQgY2hhcmFjdGVyIGlzICcqJyBiZWZvcmUgY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUKLQlhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLiAgUGVybWl0IExJTkVfQ09NTUVOVF9TVEFSVCB0byBzdGFydCBhCi0JY29tbWVudCBpbiBzdGF0ZSAxIChzZWVuIHNvbWUgd2hpdGVzcGFjZSkgYXMgd2VsbCwgdG8gbWF0Y2ggdGhlCi0JZG9jdW1lbnRhdGlvbi4KLQotCSogZ2FzcC5jIChkb19hbGlnbik6IFBlcm1pdCBhIGZpbGwgdmFsdWUgZm9yIC5hbGlnbi4KLQotV2VkIEp1biAgNSAxNzowOToyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAobmV4dF9jaGFyX29mX3N0cmluZyk6IFdhcm4gaWYgYSBuZXdsaW5lIGlzIHNlZW4gaW4gdGhlCi0JbWlkZGxlIG9mIGEgc3RyaW5nLiAgQ2FsbCBidW1wX2xpbmVfY291bnRlcnMgd2hlbiBhcHByb3ByaWF0ZS4KLQotV2VkIEp1biAgNSAxNzowODozNiAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogc3ltYm9scy5jIChjb2xvbik6IFVzZSBMT0NBTF9MQUJFTC4KLQotVHVlIEp1biAgNCAxMDo1NToxNiAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNzazMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEb24ndCBjaGVjayB0byBzZWUgaWYgdG9vbGRpciBleGlzdHMuCi0JTWFrZSAkKHRvb2xkaXIpIGFuZCAkKHRvb2xkaXIpL2Jpbi4KLQotVHVlIEp1biAgNCAxMDoxNDo1MyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9wcGMtc29sLm10IChUREVGSU5FUyk6IERvbid0IHR1cm4gb24gLW1yZWduYW1lcyBieQotCWRlZmF1bHQuCi0KLU1vbiBKdW4gIDMgMTE6MzQ6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRG9uJ3QgY2FsbCBhc193YXJuIGlmIHdlIGFyZSBzZXR0aW5nCi0JaW5zbl9lcnJvci4gIERvbid0IHB1dCB0aGUgc3RyaW5nICJFUlJPUiIgaW4gaW5zbl9lcnJvci4gIFNldAotCWluc25fZXJyb3IgcmF0aGVyIHRoYW4gY2FsbGluZyBhc193YXJuIGZvciBhbiB1bnN1cHBvcnRlZCBvcGNvZGUuCi0KLVNhdCBKdW4gIDEgMjE6NTE6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wYXJzZV9vcHRpb24pOiBDaGVjayBmb3IgYSA2NCBiaXQgZm9ybWF0Ci0JYmVmb3JlIHBlcm1pdHRpbmcgLTY0LgotCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlKTogUmVtb3ZlIGR1cGxpY2F0ZQotCWJmZF9wZXJyb3IuCi0KLUZyaSBNYXkgMzEgMDE6MDg6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IElmIC02NCwgY3JlYXRlIGEgLk1JUFMub3B0aW9ucwotCXNlY3Rpb24gcmF0aGVyIHRoYW4gYSAucmVnaW5mbyBzZWN0aW9uLgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogSWYgLTY0LCB3cml0ZSBvdXQgNjQgYml0IFJlZ0luZm8KLQlpbmZvcm1hdGlvbi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IElmIG1pcHNfaXNhIDwgMywgcGVybWl0IGEgMzIKLQliaXQgdmFsdWUgd2l0aCB0aGUgaGlnaCBiaXQgc2V0LgotCi1UaHUgTWF5IDMwIDE5OjAwOjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2xjb21tKTogU2V0IHNlY3Rpb24gZmxhZ3MgZm9yIC5zYnNzIHNlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfNjQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtaXBzX3RhcmdldF9mb3JtYXQpOiBJZiBtaXBzXzY0LCByZXR1cm4gZWxmNjQgdGFyZ2V0cyByYXRoZXIgdGhhbgotCWVsZjMyIG9uZXMuCi0JKG1kX2xvbmdvcHRzKTogQWRkICIzMiIgYW5kICI2NCIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAtMzIgYW5kIC02NC4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLTMyIGFuZCAtNjQuCi0JKGNvbnNfZml4X25ld19taXBzKTogSWYgbWlwc182NCwgZG9uJ3QgY29udmVydCBhbiA4IGJ5dGUgcmVsb2MgdG8KLQlhIDQgYnl0ZSBvbmUuCi0KLVRodSBNYXkgMzAgMTA6MzY6MTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKGNvbW1lbnRfY2hhcnMpOiBNYWtlICchJyBhIGNvbW1lbnQgY2hhcmFjdGVyCi0JZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eS4KLQotCSogc3RhYnMuYyAoc19zdGFiX2dlbmVyaWMpOiBVbmRlciBQb3dlclBDIFNvbGFyaXMsIGNvbnZlcnQgYQotCS5zdGFiZCB3aXRoIDQgYXJndW1lbnRzIGludG8gYSAuc3RhYm4uCi0KLVdlZCBNYXkgMjkgMTY6NDM6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IFdoZW4gcGFzc2luZyBYX2FkZF9udW1iZXIgdG8KLQltYWNyb19idWlsZCwgY2FzdCBpdCB0byBpbnQgZmlyc3QuCi0KLVR1ZSBNYXkgMjggMTM6Mjk6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtejhrLmMgKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBmeF9yX3R5cGUgb2YgMCwgYXMKLQljcmVhdGVkIGJ5IGVtaXRfZXhwci4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfY3JlYXRlKTogSWYgYmZkX21ha2VfZW1wdHlfc3ltYm9sIGZhaWxzLCBjYWxsCi0JYXNfcGVycm9yIHJhdGhlciB0aGFuIGFzc2VydC4KLQotRnJpIE1heSAyNCAxODoyNDoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBNYXJrIHNlY3Rpb25zIGNyZWF0ZWQgdG8gaG9sZAotCWZsb2F0aW5nIHBvaW50IGluZm9ybWF0aW9uIGFzIHJlYWQgb25seS4KLQotRnJpIE1heSAyNCAxMjowNzo1NCAxOTk2ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfc2V0X2NwdSk6IENoYW5nZSBkZWZhdWx0cyB0byBtYXRjaCBBSVguCi0KLVRodSBNYXkgMjMgMTc6MzQ6MjQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgLnNraXAgYXMgYSBzeW5vbnltIGZvciAuc3BhY2UuCi0KLQkqIHN0YWJzLmMgKHNfc3RhYl9nZW5lcmljKTogRm9yIFBvd2VyUEMgRUxGLCBhbGxvdyAuc3RhYmQgdG8gdGFrZQotCTQgYXJndW1lbnRzLCBwcm92aWRpbmcgdGhlIDR0aCBhcmd1bWVudCBpcyAwLCB0byBhbGxvdwotCWNvbXBhdGliaWxpdHkgd2l0aCB0aGUgU29sYXJpcyBhc3NlbWJsZXIuCi0KLVRodSBNYXkgMTYgMTU6NTE6NDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guaCAoc3RydWN0IHNoX3NlZ21lbnRfaW5mb190eXBlKTogRGVmaW5lLgotCShUQ19TRUdNRU5UX0lORk9fVFlQRSk6IERlZmluZS4KLQkoc2hfZnJvYl9sYWJlbCk6IERlY2xhcmUuCi0JKHRjX2Zyb2JfbGFiZWwpOiBEZWZpbmUuCi0JKHNoX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogRGVjbGFyZS4KLQkobWRfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtc2guYyAobWRfYXNzZW1ibGUpOiBJZiByZWxheGluZywgZW1pdCBhIFJfU0hfQ09ERQotIAlyZWxvYyBiZWZvcmUgdGhlIGluc3RydWN0aW9uIGlmIG5lY2Vzc2FyeS4KLQkoc2hfZnJvYl9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQkoc2hfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBOZXcgZnVuY3Rpb24uCi0JKHNoX2NvZmZfZnJvYl9maWxlKTogSWdub3JlIEFMSUdOLCBDT0RFLCBEQVRBLCBhbmQgTEFCRUwgcmVsb2NzCi0Jd2hlbiBsb29raW5nIGZvciB0aGUgcmVsb2MgZm9yIHRoZSB0YXJnZXQgb2YgLnVzZXMuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IEZpeCBwcmludGYgZm9ybWF0ICglMHhseCB0byAweCVseCkuCi0JKHNoX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSBDT0RFLCBEQVRBLCBhbmQgTEFCRUwgcmVsb2NzIHRvIGJlCi0JZW1pdHRlZC4KLQkobWRfYXBwbHlfZml4KTogSWdub3JlIENPREUsIERBVEEsIGFuZCBMQUJFTCByZWxvY3MuCi0JKHNoX2NvZmZfcmVsb2NfbWFuZ2xlKTogRm9yY2UgQ09ERSwgREFUQSwgYW5kIExBQkVMIHJlbG9jcyB0byB1c2UKLQl0aGUgYWJzb2x1dGUgc3ltYm9sLgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogQWRkIHRjX3NlZ21lbnRfaW5mb19kYXRhIGZpZWxkIGlmCi0JVENfU0VHTUVOVF9JTkZPX1RZUEUgaXMgZGVmaW5lZC4KLQotV2VkIE1heSAxNSAxMjoyMzo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogTWFrZSBzdXJlIHRoZSBvcGNvZGUgc3VmZml4Ci0JbWF0Y2hlcyB0aGUgcmVnaXN0ZXIgc2l6ZS4KLQotV2VkIE1heSAxNSAwODozMzozNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb3VudF9lbnRyaWVzX2luX2NoYWluKTogSWdub3JlIEZpeHVwcyB3aXRoCi0JZnhfZG9uZSBzZXQuIAotCShkb19yZWxvY3NfZm9yKTogTGlrZXdpc2UuCi0JKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBqdXN0IHF1aXQgaWYgbGlua3JlbGF4IGlzIHNldC4gIFRyeSB0bwotCWFwcGx5IG5vbiBwYy1yZWxhdGl2ZSBzeW0xLXN5bTIgZml4dXBzLCBldmVuIGlmIGxpbmtyZWxheCBpcwotCW5vbnplcm8uCi0KLUZyaSBNYXkgMTAgMTQ6MTY6NTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfdmFsaWRhdGVfZml4KTogQWxsb3cgR09UIGFuZCBzZWN0aW9uCi0JcmVsYXRpdmUgcmVsb2NhdGlvbnMgd2l0aCAtbXJlbG9jYXRhYmxlLiAgQWxzbyBhbGxvdyB1bmZpeGVkCi0JcmVsb2NzIGluIC5leF9zaGFyZWQuCi0KLVR1ZSBNYXkgIDcgMTE6MjQ6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoeWFua19zeW1ib2xzKTogQ2hlY2sgdGhhdCBGTkFNRV9PRkZTRVQgaXMKLQlub24temVybyBiZWZvcmUgYXNzdW1pbmcgdGhpcyBpcyBhIGxvbmcgZmlsZSBuYW1lLgotCSh3X3N0cmluZ3MpOiBMaWtld2lzZS4KLQkoY19kb3RfZmlsZV9zeW1ib2wpOiBTZXQgRk5BTUVfT0ZGU0VUIHRvIDEgZm9yIGEgbG9uZyBmaWxlIG5hbWUuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3X3N0cmluZ3MpOiBNb3ZlIGRlY2xhcmF0aW9uIG9mIGkgaW5zaWRlCi0JI2lmZGVmIGJsb2NrIHdoaWNoIHVzZXMgaXQuCi0KLVR1ZSBNYXkgIDcgMDA6NDk6NTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoZG9fYV9maXhfaW1tKTogUmVuYW1lIGxhc3QgYXJndW1lbnQgdG8KLQkicmVsYXhtb2RlIi4gIE91dHB1dCByZWxvY3Mgd2hpY2ggaWRlbnRpZnkgdmFyaW91cyByZWxheGluZwotCXBvc3NpYmlsaXRpZXMgZm9yIG1vdi5bYndsXSBpbnN0cnVjdGlvbnMuCi0JKGJ1aWxkX2J5dGVzKTogUGFzcyBpbiBhIHJlbGF4aW5nIG1vZGUgdG8gZG9fYV9maXhfaW1tLgotCi1Nb24gTWF5ICA2IDE1OjI2OjI4IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uaCAoVENfSEFORExFU19GWF9ET05FKTogRGVmaW5lLgotCShNRF9BUFBMWV9GSVgzKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWFybS5jIChteV9nZXRfZXhwcmVzc2lvbik6IE9ubHkgd2F0Y2ggZm9yIGJhZCBzZWdtZW50cwotCWlmIE9CSl9BT1VULgotCShtZF9hcHBseV9maXgzKTogUmVuYW1lZCBmcm9tIG1kX2FwcGx5X2ZpeC4KLQlJZiBwY3JlbCByZWxvYyBhbmQgc3ltYm9sIGlzIGluIGRpZmZlcmVudCBzZWN0aW9uLCB1bmRvIGVmZmVjdHMKLQlvZiBtZF9wY3JlbF9mcm9tLgotCi1TYXQgTWF5ICA0IDEyOjQ5OjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdAotCWFueSByZWxvYyB3aXRoIGFuIExSJSBvciBSUiUgZmllbGQgc2VsZWN0b3IgZm9yIFNPTS4KLQotU2F0IE1heSAgNCAxMToyNjoxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgc3Vic2Vncy5oIHRvIGFwcHJvcHJpYXRlIFRBUkdfQ1BVX0RFUF8qCi0gCXZhcmlhYmxlcy4KLQotRnJpIE1heSAgMyAxNzo1ODozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgbWVyZ2UgYSBzeW1ib2wgd2l0aAotCVNGX0dFVF9TVEFUSUNTIHNldC4KLQkoeWFua19zeW1ib2xzKTogTGlrZXdpc2UuCi0KLVdlZCBNYXkgIDEgMTM6Mzg6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogSWYgTUFOWV9TRUdNRU5UUyBhbmQgbm90Ci0JQkZEX0FTU0VNQkxFUiwgYWRkIG5hbWUgZmllbGQuCi0JKiBjb25maWcvb2JqLWNvZmYuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiLgotCShjb2ZmX2hlYWRlcl9hcHBlbmQpOiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzLgotCShjcmF3bF9zeW1ib2xzKTogSnVzdCB1c2UgdGhlIG5hbWUgZmllbGQgZm9yIHRoZSBzeW1ib2wgbmFtZSwKLQl3aXRob3V0IHdvcnJ5aW5nIGFib3V0IG51bGwgYnl0ZSB0ZXJtaW5hdGlvbi4KLQkod19zdHJpbmdzKTogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBMaWtld2lzZS4gIEFsc28sIHVzZSB0aGUgbmFtZSBmaWVsZCwgcmF0aGVyCi0JdGhhbiBzY25oZHIuc19uYW1lLgotCShvYmpfY29mZl9hZGRfc2VnbWVudCk6IFBlcm1pdCBsb25nIHNlY3Rpb24gbmFtZXMuCi0JKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogVXNlIHRoZSBuYW1lIGZpZWxkLCByYXRoZXIgdGhhbgotCXNjbmhkci5zX25hbWUuCi0JKGFkanVzdF9zdGFiX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90ZS1wZS5oIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAoYnJ0YWJfZW1pdCk6IERvbid0IHNldCBmeF9pbV9kaXNwIGZpZWxkLgotCShtZW1fZm10KTogTGlrZXdpc2UuCi0JKG1kX2FwcGx5X2ZpeCk6IERvbid0IGNoZWNrIGZ4X2ltX2Rpc3AgZmllbGQuCi0KLVRodSBBcHIgMjUgMTE6Mzk6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCAqIGFmdGVyIHNwYXJjKi0qLXZ4d29ya3MuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IElmIHRjX2NvbW1lbnRfY2hhcnMgaXMgbm90IGRlZmluZWQsCi0JZGVmaW5lIGl0IHRvIGNvbW1lbnRfY2hhcnMuICBVc2UgdGNfY29tbWVudF9jaGFycyByYXRoZXIgdGhhbgotCWNvbW1lbnRfY2hhcnMuCi0JKGRvX3NjcnViX2NoYXJzKTogVXNlIHRjX2NvbW1lbnRfY2hhcnMgcmF0aGVyIHRoYW4gY29tbWVudF9jaGFycy4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKHRjX2NvbW1lbnRfY2hhcnMpOiBEZWZpbmUuCi0JKG02OGtfY29tbWVudF9jaGFycyk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2NvbW1lbnRfY2hhcnMpOiBSZW5hbWUgZnJvbQotCWNvbW1lbnRfY2hhcnMuICBDaGFuZ2UgaW50byBhIHBvaW50ZXIgcmF0aGVyIHRoYW4gYW4gYXJyYXkuCi0JKG1kX2xvbmdvcHRzKTogQWRkICJiaXR3aXNlLW9yIi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIE9QVElPTl9CSVRXSVNFX09SLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiAtLWJpdHdpc2Utb3IuCi0JKiBkb2MvYy1tNjhrLnRleGk6IERvY3VtZW50IC0tYml0d2lzZS1vci4KLQotV2VkIEFwciAyNCAxMToyODozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBQcmV2ZW50IGF0dGVtcHRzIHRvIHVzZSBsb25nIG9mZnNldHMKLSAJaW4gNjgwMDAgbW9kZS4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBCRkRfQVNTRU1CTEVSIHZlcnNpb246Ci0JY2FsbCBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lLiAgTm9uIEJGRF9BU1NFTUJMRVIgdmVyc2lvbjoKLQljb3JyZWN0IGhhbmRsaW5nIG9mIGlucHV0IGxpbmUgcG9pbnRlciwgYW5kIGNhbGwKLQlkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lLgotCi1Nb24gQXByIDIyIDE4OjAyOjM3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAYmx1ZXMuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGluX2JpdGZpZWxkX3JhbmdlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3BhcmNfaXApOiBOZXcgY2FzZXMgWCxZLiAgVXNlIFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AuCi0JKG1kX2FwcGx5X2ZpeCwgY2FzZXMgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLAotCUJGRF9SRUxPQ19TUEFSQ197V0RJU1AxNixXRElTUDE5fSk6IEZpeCB1bmRlZmluZWQgY29kZS4KLQkobWRfYXBwbHlfZml4KTogTmV3IGNhc2VzIEJGRF9SRUxPQ19TUEFSQ19bNTZdLgotCSh0Y19nZW5fcmVsb2MpOiBOZXcgY2FzZXMgQkZEX1JFTE9DX1NQQVJDX1s1Nl0uCi0KLVRodSBBcHIgMTggMTg6NTg6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYzogQkZEX0FTU0VNQkxFUjoKLSAJKGNvZmZfbGFzdF9iZik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBTZXQgZW5kbmR4IG9mIGEgLmJmIHN5bWJvbC4KLQlOb24gQkZEX0FTU0VNQkxFUjoKLQkob2JqX2NvZmZfZW5kZWYpOiBDYWxsIFNGX1NFVF9QUk9DRVNTIG9uIGEgLmJmIHN5bWJvbC4KLQkobGFzdF9iZlApOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCSh5YW5rX3N5bWJvbHMpOiBTZXQgZW5kbmR4IG9mIGEgLmJmIHN5bWJvbC4KLQotVGh1IEFwciAxOCAxMTo1Mzo1OCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWRkIHN1cHBvcnQgZm9yIFNvbGFyaXMncyAtbGUKLQlhbmQgLXMgb3B0aW9ucy4gIEFkZCAtYmUgZm9yIGdvb2QgbWVhc3VyZS4KLQotV2VkIEFwciAxNyAxMjozMTowMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19zcGFjZSk6IFN1cHBvcnQgbm9uLWNvbnN0YW50IGZpbGwgdmFsdWUuICBIYW5kbGUgZmlsbAotCXZhbHVlIGNvcnJlY3RseSBmb3IgYSBzaXplIG90aGVyIHRoYW4gMS4KLQotVHVlIEFwciAxNiAxNToxNzo0MCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG15X2dldF9mbG9hdF9leHByZXNzaW9uKTogVXBkYXRlIGNhbGwgdG8KLQlnZW5fdG9fd29yZHMsIFhfUFJFQ0lTSU9OIGNoYW5nZWQgZnJvbSA2IHRvIDUuCi0KLVR1ZSBBcHIgMTYgMTA6MjU6NDIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHJlZ2lzdGVyX25hbWUscmVnX25hbWVfc2VhcmNoKTogTW92ZSByZWdpc3RlcgotCW5hbWUgbG9va3VwIGZyb20gUEUgc3BlY2lmaWMgY29kZSB0byBhbGwgdGFyZ2V0cy4gIEFkZCBzdXBwb3J0IGZvcgotCS1tcmVnbmFtZXMvLW1uby1yZWduYW1lcyB0byBjb250cm9sIHdoZXRoZXIgcmVnaXN0ZXIgbmFtZXMgYXJlCi0JZXhwYW5kZWQgb3Igbm90LgotCShtZF9hc3NlbWJsZSk6IENhbGwgcmVnaXN0ZXJfbmFtZSBmb3IgYWxsIHBsYXRmb3Jtcy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWRkIHN1cHBvcnQgZm9yIC1tcmVnbmFtZXMvLW1uby1yZWduYW1lcy4KLQotCSogY29uZmlndXJlLmluIChwb3dlcnBjbGUqLSotc29sYXJpcyk6IEFkZCBzdXBwb3J0LgotCShwb3dlcnBjKi0qLWxpbnV4KTogRGl0dG8uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLQkqIGNvbmZpZy9wcGMtc29sLm10OiBOZXcgY29uZmlnIGZpbGUgZm9yIFBvd2VyUEMgU29sYXJpcy4KLQotTW9uIEFwciAxNSAxMjoyNjozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZnJvYl9maWxlKTogUGVybWl0IG11bHRpcGxlICVoaSByZWxvY3MgdG8KLQliZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgJWxvIHJlbG9jLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX2FkZHJlc3MpOiBDYXN0IFhfYWRkX251bWJlciB0byB2YWx1ZVQKLQliZWZvcmUgY29tcGFyaW5nIGFnYWluc3QgTUFYX0dQUkVMX09GRlNFVCwgc28gdGhhdCBuZWdhdGl2ZQotCW51bWJlcnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LgotCShtYWNybyk6IExpa2V3aXNlLgotCi1UaHUgQXByIDExIDEyOjM5OjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGxhc3RfaW5zbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2Fzc2VtYmxlKTogV2FybiBhYm91dCBwdXR0aW5nIGZsb2F0aW5nIHBvaW50IGJyYW5jaGVzIGluIGEKLQlkZWxheSBzbG90LiAgSWYgYXJjaGl0ZWN0dXJlIGlzIGxlc3MgdGhhbiB2OSwgaW5zZXJ0IE5PUAotCWluc3RydWN0aW9ucyBiZXR3ZWVuIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyBhbmQgZmxvYXRpbmcKLQlwb2ludCBicmFuY2hlcy4gIChUaGUgU3VuT1MgYXNzZW1ibGVyIGRvZXMgYm90aCB0aGVzZSBvcGVyYXRpb25zLikKLQlTYXZlIHRoZSBsYXN0IGluc3RydWN0aW9uIG9wY29kZS4KLQkoc3BhcmNfaXApOiBBZGQgcGluc24gcGFyYW1ldGVyLiAgQ2hhbmdlIGNhbGxlci4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBDb3JyZWN0IGNoZWNrCi0JZm9yIGJ5dGUganVtcCB0byBuZXh0IGluc3RydWN0aW9uIHRvIHNraXAgZW1wdHkgZnJhZ3MuCi0KLVdlZCBBcHIgMTAgMTY6NDg6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfaXApOiBJZiB3ZSBhcmUgZ29pbmcgdG8gY2FsbCBlbWl0X2FkZDY0Ci0JZm9yIGFkZHEgd2l0aCBhIDE2IGJpdCBzaWduZWQgdmFsdWUsIGp1c3QgZW1pdCBhIGxkYSBpbnN0cnVjdGlvbgotCWluc3RlYWQuCi0KLVdlZCBBcHIgMTAgMTQ6MzQ6NDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoZG9fYV9maXhfaW1tKTogRG9uJ3QgY3V0IG9mZiBoaWdoIGJpdHMKLQlvZiBhIDMyYml0IG9wZXJhbmQuCi0KLU1vbiBBcHIgIDggMTQ6NDI6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFBlcm1pdCAtLWVuYWJsZS1zaGFyZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YKLQlkaXJlY3Rvcmllcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEFwciAgNSAxNzowMTozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChnZXRfc3BlY2lmaWMpOiBSZW1vdmUgc29tZSAjaWYgMCBjb2RlLgotCShidWlsZF9ieXRlcyk6IFJlbW92ZSBhbGwgQUJTTU9WIHJlbGF0ZWQgY29kZTsgaXQncyB1bm5lY2Vzc2FyeS4KLQotRnJpIEFwciAgNSAxNToxMzoxMCAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jOiBGaXggaGFuZGxpbmcgb2YgZGVub3JtYWxpemVkIGV4dGVuZGVkCi0JcHJlY2lzaW9uIG51bWJlcnMgYW5kIG92ZXJmbG93L3VuZGVyZmxvdyBkZXRlY3Rpb24uCi0JKE1BWF9QUkVDSVNJT04sIFhfUFJFQ0lTSU9OLCBQX1BSRUNJU0lPTik6IENoYW5nZWQgZnJvbSA2IHRvIDUsIHRvCi0Jbm90IGluY2x1ZGUgdGhlIDE2IGJpdCBnYXAgaW4gdGhlIG02OGsgZXh0ZW5kZWQgcHJlY2lzaW9uIGZvcm1hdC4KLQotRnJpIEFwciAgNSAxNDoyOToyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGkzODYtKi1mcmVlYnNkZWxmKiB0YXJnZXQ7IGZyb20gSm9obiBQb2xzdHJhCi0JPGpkcEBwb2xzdHJhLmNvbT4uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBcHIgIDUgMTg6Mzk6MjggMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBBbGxvdyBub24temVybyBvZmZzZXRzIGZyb20gLnNkYXRhIHN5bWJvbHMgdG8KLSAJYmUgYWNjZXNzZWQgdXNpbmcgdGhlICRncCByZWdpc3Rlci4KLQkqIGNvbmZpZy90Yy1taXBzLmggKE1BWF9HUFJFTF9PRkZTRVQpOiBBZGRlZC4KLQotV2VkIEFwciAgMyAxMDo1NjoxNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfbWRfZW5kKTogU2V0IGJmZCBtYWNoaW5lIG51bWJlciB0bwotCWJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0IGlmIGN1cnJlbnRfYXJjaGl0ZWN0dXJlIGlzIHNwYXJjbGV0LgotCi1Nb24gQXByICAxIDE2OjU1OjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChnZXRfbGluZV9zYik6IEJ1bXAgbGluZSBjb3VudGVycyBiYXNlZCBvbgotCWlucHV0X2xpbmVfcG9pbnRlclstMV0sIG5vdCAqaW5wdXRfbGluZV9wb2ludGVyLiAgRG9uJ3QgYm90aGVyIHRvCi0JY2FsbCBMSVNUSU5HX05FV0xJTkUuCi0JKHNfbWFjcm8pOiBEb24ndCBjYWxsIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUuCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBXaGVuIGhhbmRsaW5nIEMgc3R5bGUgY29tbWVudHMsIHVuZ2V0Ci0JY2gyIHJhdGhlciB0aGFuIGNoLgotCi1GcmkgTWFyIDI5IDE2OjE1OjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5oIChlbnVtIGxpbmtvbmNlX3R5cGUpOiBEZWZpbmUuCi0JKHNfbGlua29uY2UpOiBEZWNsYXJlLgotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkICJsaW5rb25jZSIuCi0JKHNfbGlua29uY2UpOiBOZXcgZnVuY3Rpb24uCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogQWRkIGxpbmtvbmNlIGZpZWxkIHRvCi0JTUFOWV9TRUdNRU5UUyAmJiAhIEJGRF9BU1NFTUJMRVIgc2VjdGlvbi4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChvYmpfaGFuZGxlX2xpbmtfb25jZSk6IERlZmluZSBpZiBURV9QRS4KLQkob2JqX2NvZmZfcGVfaGFuZGxlX2xpbmtfb25jZSk6IERlY2xhcmUgaWYgVEVfUEUuCi0JKiBjb25maWcvb2JqLWNvZmYuYzogSWYgVEVfUEUgYW5kIG5vdCBCRkRfQVNTRU1CTEVSLCAjaW5jbHVkZQotCSJjb2ZmL3BlLmgiLgotCShvYmpfY29mZl9wZV9oYW5kbGVfbGlua19vbmNlKTogTmV3IGZ1bmN0aW9uLCBkZWZpbmVkIGlmIFRFX1BFLgotCShjX3NlY3Rpb25fc3ltYm9sKTogSWYgVEVfUEUsIHNldCB0aGUgeF9jb21kYXQgZmllbGQgaW4gdGhlIGF1eAotCWVudHJ5IGJhc2VkIG9uIHRoZSBsaW5rb25jZSBmaWVsZCBpbiBzZWdtZW50X2luZm8uCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgLmxpbmtvbmNlLgotCi1GcmkgTWFyIDI5IDExOjMxOjI3IDE5OTYgIEouVC4gQ29ua2xpbiAgKGp0Y0BsaXNhLmN5Z251cy5jb20pCi0KLQkqIGRvYy9hcy4xOiBDaGFuZ2VkIHRvIGJlIHJlY29nbml6ZWQgYnkgY2F0bWFuIC13IG9uIFNvbGFyaXMuCi0KLVRodSBNYXIgMjggMTU6Mjc6NDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChzX3N0YWJfZ2VuZXJpYyk6IENhbGwgdGhlIGxpc3RpbmcgZnVuY3Rpb25zIGJlZm9yZQotCWRvaW5nIHRoZSByZXN0IG9mIHRoZSBwcm9jZXNzaW5nLCB3aGljaCBtYXkgaW52b2x2ZSBmcmVlaW5nIHRoZQotCXN0cmluZy4gIFBhc3Mgc3RyaW5nLCBub3Qgc3RyaW5nICsgc3Ryb2ZmLCB0byBPQkpfUFJPQ0VTU19TVEFCIGluCi0JU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyBjYXNlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBSZW1vdmUgbmVzdGVkIGNvbW1lbnQuCi0JKHRjX2dlbl9yZWxvYyk6IE1vdmUgbGFiZWwgZG9uZSBpbnNpZGUgdGhlIGlmZGVmIGluIHdoaWNoIGl0IGlzCi0JdXNlZC4KLQkobWRfYXBwbHlfZml4KTogUGFzcyBwb2ludGVycyB0byBjb3JyZWN0IHR5cGVzIHRvIGxpYmhwcGEuaAotCWZ1bmN0aW9ucy4gIEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAodGNfZnJvYl9maWxlKTogRGVmaW5lLgotCShtaXBzX2Zyb2JfZmlsZSk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbWlwcy5jIChzdHJ1Y3QgbWlwc19oaV9maXh1cCk6IERlZmluZS4KLQkobWlwc19oaV9maXh1cF9saXN0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoaW1tX3VubWF0Y2hlZF9oaSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2Fzc2VtYmxlKTogQ2xlYXIgaW1tX3JlbG9jLCBpbW1fdW5tYXRjaGVkX2hpLCBhbmQKLQlvZmZzZXRfcmVsb2MuICBQYXNzIGltbV91bm1hdGNoZWRfaGkgdG8gYXBwZW5kX2luc24uCi0JKGFwcGVuZF9pbnNuKTogQWRkIHVubWF0Y2hlZF9oaSBwYXJhbWV0ZXIuICBJZiBpdCBpcyBzZXQsIGFkZCB0aGUKLQluZXcgZml4dXAgdG8gbWlwc19oaV9maXh1cF9saXN0LiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShtaXBzX2lwKTogU2V0IGltbV91bm1hdGNoZWRfaGkgd2hlbiBhcHByb3ByaWF0ZS4KLQkobWlwc19mcm9iX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0KLVRodSBNYXIgMjggMTE6NDc6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzcGFyYy0qLXNvbGFyaXMyKik6IFJlbmFtZWQgZnJvbSBzcGFyYyotKi1zb2xhcmlzMiouCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UdWUgTWFyIDI2IDE4OjE5OjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXMuYyAobWFpbik6IENhbGwgYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUuCi0KLUZyaSBNYXIgMjIgMTE6MTM6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5oIChzdHJkdXApOiBEb24ndCBkZWNsYXJlLgotCSogc3RhYnMuYzogSW5jbHVkZSBsaWJpYmVydHkuaAotCShnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogVXNlIHhzdHJkdXAgcmF0aGVyIHRoYW4gc3RyZHVwLgotCShzX3N0YWJfZ2VuZXJpYyk6IExpa2V3aXNlLgotCSogYXMuYyAocGFyc2VfYXJncyk6IExpa2V3aXNlLgotCSogcmVhZC5jIChzX21yaV9zZWN0KTogTGlrZXdpc2UuCi0KLQkqIGdhc3AuYyAoY2hhbmdlX2Jhc2UpOiBSZWNvZ25pemUgXCguLi4pIGNvbnN0cnVjdCBkb2N1bWVudGVkIHRvCi0JcGFzcyB0aHJvdWdoIGVuY2xvc2VkIGNoYXJhY3RlcnMgbGl0ZXJhbGx5IHRocm91Z2ggdG8gdGhlIG91dHB1dC4KLQkocHJvY2Vzc19hc3NpZ25zKTogTGlrZXdpc2UuICBBbHNvLCBiZSBtb3JlIGNhcmVmdWwgdG8gYXZvaWQKLQlsb29raW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgotCi1UaHUgTWFyIDIxIDEzOjE4OjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfcGFyc2Vfb3B0aW9uKTogSWYgT0JKX0VMRiwgaWdub3JlIC1rIGZvcgotCUZyZWVCU0QgY29tcGF0aWJpbGl0eS4gIEZyb20gSm9obiBQb2xzdHJhIDxqZHBAcG9sc3RyYS5jb20+LgotCi1XZWQgTWFyIDIwIDE4OjEzOjMyIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBkb2MvYXMudGV4aW5mbywgZG9jL2MtaTk2MC50ZXhpOiBGaXggdHlwb3MuCi0KLVdlZCBNYXIgMjAgMTc6MDU6MTYgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogY29uZmlnL2FscGhhLW9wY29kZS5oOiBBZGRlZCBjdnRzdCBpbnN0cnVjdGlvbi4KLQotTW9uIE1hciAxOCAxMzoxMjo0NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N0YWIpOiBEb24ndCB0cnkgdG8gbWFrZSBhIHN5bWJvbCBvdXQgb2YgdGhlIHN0YWIKLQlzdHJpbmcuICBFeHRyYWN0IHRoZSBhZGRlbmQgZnJvbSB0aGUgcmVzdWx0IG9mIGV4cHJlc3Npb24uCi0KLUZyaSBNYXIgMTUgMTc6MTA6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBJZiB3aGl0ZXNwYWNlIGlzIHNlZW4gaW4gc3RhdGUgMTEsIGFuZAotCUxBQkVMU19XSVRIT1VUX0NPTE9OUyBpcyBub3QgZGVmaW5lZCwgYW5kIHdlIGFyZSBub3QgaW4gbTY4ayBNUkkKLQltb2RlLCBjaGFuZ2UgdGhlIHN0YXRlIHRvIDMgcmF0aGVyIHRoYW4gMS4KLQotVGh1IE1hciAxNCAxODoxODoyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChDX1JFR0lTVEVSX1NFQ1RJT04pOiBDaGFuZ2UgZnJvbSAyMCB0byA1MCwgdG8KLQljb3JyZXNwb25kIHRvIDExIE1hcmNoIGNoYW5nZS4KLQotVGh1IE1hciAxNCAxNToyNzoxMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChidWlsZF9ieXRlcywgTUVNSU5EIGNhc2UpOiBHZW5lcmF0ZQotCWFuIFJfTUVNX0lORElSRUNUIHJlbG9jIHJhdGhlciB0aGFuIFJfUkVMQllURS4KLQotVHVlIE1hciAxMiAxMjoyMToxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuOC4KLQotTW9uIE1hciAxMSAxODo1NzoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAoZ2VuX3RvX3dvcmRzKTogSW1wcm92ZSBoYW5kbGluZyBvZgotCVhfUFJFQ0lTSU9OIG51bWJlcnMuICBCYXNlZCBvbiBwYXRjaGVzIGZyb20gQW5kcmVhcyBTY2h3YWIKLQk8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPi4KLQotTW9uIE1hciAxMSAwOTo1OTo1MyAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBhcy5oIChTRUdfTk9STUFMLCBTRUdfTElTVCk6IEJ1bXAgc2VnbWVudCBsaW1pdCBmcm9tIDEwIHRvIDQwLgotCShTRUdfTEFTVCk6IE5ldy4KLQkqIHN1YnNlZ3MuYyAoTUFOWV9TRUdNRU5UUyk6IEluY3JlYXNlIHNlZ21lbnQgbGltaXQuCi0JKiBvYmotY29mZi5jIChzZWdfTl9UWVBFLCBzZWdfaW5mb19vZmZfYnlfNCk6IExpa2V3aXNlLgotCShkb19yZWxvY3NfZm9yLCB3X3N5bWJvbHMsIG9ial9jb2ZmX2FkZF9zZWdtZW50LCBkb19saW5lbm9zX2ZvciwKLQljcmF3bF9zeW1ib2xzLCBjb2ZmX2hlYWRlcl9hcHBlbmQpOiBMb29wIHRvIFNFR19MQVNUIHJhdGhlciB0aGFuCi0JU0VHX0U5LgotCQotVGh1IE1hciAgNyAxNToxNzozOSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogSGFuZGxlIG9wZXJhbmQgY2hhciAnTycgKG5lZyByZWcpLgotCi1UaHUgTWFyICA3IDA5OjE5OjE1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoU1VCU0VHX01JTExJKTogRGVmaW5lLgotCShwYV9kZWZfc3Vic3BhY2VzKTogQWRkICRNSUxMSUNPREUkLgotCShwYV9zcGFjZXNfYmVnaW4pOiBTZXQgc2VjdGlvbiBmbGFncyBmb3IgJE1JTExJQ09ERSQuCi0KLVdlZCBNYXIgIDYgMTQ6MTE6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBPbmx5IFNFQ19MT0FEIGlmIHRoZSB0eXBlIGlzCi0Jbm90IFNIVF9OT0JJVFMuICBEb24ndCB0YW1wZXIgd2l0aCBmbGFncyBiYXNlZCBvbiB0eXBlIGlmIGEKLQlzcGVjaWFsIHNlY3Rpb24gd2FzIGZvdW5kIChyZXZlcnQgRmViIDI5IGNoYW5nZSkuCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IE9ubHkgYWxpZ24gdXNpbmcgdGhlIG5vcCBwYXR0ZXJuCi0JaWYgYWxpZ25pbmcgdG8gYSBsb25nd29yZCBib3VuZGFyeSBvciBncmVhdGVyLgotCi1UdWUgTWFyICA1IDE1OjEwOjQzIDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogUGFzcyAxIG5vdCAyIHRvIGZyYWdfYWxpZ24uCi0KLU1vbiBNYXIgIDQgMjA6NTA6NTcgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotY3lnd2luMzIpOiBEb24ndCB1c2UgYmZkX2dhcy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLU1vbiBNYXIgIDQgMTA6MTM6MDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBBZGQgZGVmYXVsdCBkZWZpbml0aW9ucyBmb3IgUl9OMFNFTCBhbmQKLQlSX04xU0VMIHNpbmNlIHRoZXkncmUgbm90IGRlZmluZWQgZm9yIG9sZCB2ZXJzaW9ucyBvZiBocHV4LgotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MpOiBGaXggdHlwbyBpbiBSX0NPTVAyIGNvZGUuCi0JU2V0ICJzeW1fcHRyX3B0ciIgYW5kICJhZGRlbmQiIGZpZWxkcyB0byBkdW1teSB2YWx1ZXMgZm9yCi0JUl9OMFNFTCBhbmQgUl9OMVNFTC4KLQotRnJpIE1hciAgMSAxMDoyMDo1MiAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZmxvbnVtLWtvbnN0LmM6IEFkZCB0d28gbW9yZSBjb25zdGFudHMgZm9yIDFlKy0yMDQ4IGFuZAotCTFlKy00MDk2LCBhbmQgY29ycmVjdCB0aGUgb3RoZXIgY29uc3RhbnRzLgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSGFuZGxlIE9fbG9naWNhbF9ub3QuCi0KLVRodSBGZWIgMjkgMTM6NTg6MzUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBBbGxvdyBwcmVkZWZpbmVkIHNlY3Rpb24KLQl0eXBlcyB0byBzZXQgdGhlIG5vYml0cyB0eXBlLiAgQXZvaWQgYSBzaGFkb3dlZCBkZWNsYXJhdGlvbi4KLQotV2VkIEZlYiAyOCAxNTozODo1NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X2FkanVzdGFibGUpOiBGb3IgU09NLCBkb24ndAotCXJlZHVjZSByZWxvY3MgdXNpbmcgZV9ubHJzZWwgZmllbGQgc2VsZWN0b3JzLgotCi0JKiB3cml0ZS5jIChmaXhfbmV3X2V4cCk6IERvbid0IHVzZSAjZWxpZi4gIFNvbWUgY29tcGlsZXJzCi0JZG9uJ3QgaGFuZGxlIGl0LgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChzZWxlY3Rvcl90YWJsZSk6IEFkZCAibiIsICJubCIsIGFuZCAibmxyIiB0bwotCXRoZSBzZWxlY3RvciB0YWJsZS4KLQkocGFfY2hrX2ZpZWxkX3NlbGVjdG9yKTogSGFuZGxlIG5ldyBmaWVsZCBzZWxlY3RvcnMgZm9yIFNPTS4KLQotVHVlIEZlYiAyNyAxNDo0MjoyNyAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlndXJlLmluIChtNjhrLSotbGludXgqYW91dCosIG02OGstKi1saW51eCopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy90ZS1saW51eC5oIChMT0NBTF9MQUJFTFNfRkIpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQVJHRVRfRk9STUFUKSBbVEVfTElOVVhdOiBEZWZpbmUgdG8KLQkiYS5vdXQtbTY4ay1saW51eCIuCi0JKiBjb25maWcvdGMtbTY4ay5jIChjb21tZW50X2NoYXJzKTogRG9uJ3QgaW5jbHVkZSAnIycgaWYgVEVfTElOVVgKLQlpcyBkZWZpbmVkLgotCi1Nb24gRmViIDI2IDE4OjU4OjU4IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBVcGRhdGUgdG8gaGFuZGxlIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuCi0KLU1vbiBGZWIgMjYgMTA6MzQ6MTAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFByaW50IGFsbCBhcmNoaXRlY3R1cmVzIHRoYXQgc3VwcG9ydAotCXRoZSBpbnNuIG9uIG1pc21hdGNoLgotCi1GcmkgRmViIDIzIDIxOjQ0OjM5IDE5OTYgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIGEyOS1jb2ZmLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgRmViIDIyIDE2OjM5OjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKHNoX2NvZmZfZnJvYl9maWxlKTogRG9uJ3QgY29uc2lkZXIgdGhlIGFkZHJlc3MKLQlvZiB0aGUgc2VjdGlvbiB3aGVuIGxvb2tpbmcgZm9yIHRoZSBSX1NIX1VTRVMgZml4dXAsIGJlY2F1c2UgdGhlCi0JZnJhZyBhZGRyZXNzZXMgaGF2ZSBub3QgeWV0IGJlZW4gYWRqdXN0ZWQuCi0KLQkqIGdkYmluaXQuaW46IFNldCBhIGJyZWFrcG9pbnQgb24gYXNfd2Fybl93aGVyZS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBBZGQgbWlzc2luZyBhcmd1bWVudHMgdG8gbWFjcm9fYnVpbGQKLQlvbWl0dGVkIGluIGxhc3QgY2hhbmdlLiAgRnJvbSBKaW0gV2lsc29uIDx3aWxzb25AY3lnbnVzLmNvbT4uCi0KLVdlZCBGZWIgMjEgMTc6MDA6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAodGNfcmVsb2NfbWFuZ2xlKTogQ2hhbmdlIHJlbG9jIGJhc2VkIG9uIHNpemUKLQlpZiBpdCBpcyBUQ19DT05TX1JFTE9DLiAgU2V0IGEgc2l6ZSBvZiA0IHRvIFJfUkVMTE9ORy4KLQotV2VkIEZlYiAyMSAwOToyNTozOSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogUmVjb2duaXplICVhc3IwIGZvciB2OC4KLQotVHVlIEZlYiAyMCAyMTo0ODowMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHBhcnNlX2tleXdvcmRfYXJnKTogQWNjZXB0IGxlYWRpbmcgJyUnLgotCShzcGFyY19pcCk6IEFjY2VwdCAlYXNyWzEuLjMxXSBmb3IgdjggYW5kICVhc3JbJTE2Li4zMV0gZm9yIHY5LgotCVJlY29nbml6ZSBbdVVdIGZvcm1hdCBhcmdzIGFzIHNwYXJjbGV0IGNwcmVncy4KLQotVHVlIEZlYiAyMCAyMjoyNTo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9oYW5kbGVfYWxpZ24pOiBEb24ndCBlbWl0IFJfU0hfQUxJR04gcmVsb2NzCi0JaW4gYnNzX3NlY3Rpb24uCi0KLU1vbiBGZWIgMTkgMTQ6MTY6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogQ2hlY2sgU19JU19XRUFLIGFzCi0Jd2VsbCBhcyBTX0lTX0VYVEVSTkFMLgotCSh0Y19maXhfYWRqdXN0YWJsZSk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCk6IEluIE9CSl9FTEYgY2FzZSwgY2hlY2sgZm9yCi0JU19JU19XRUFLIGFzIHdlbGwgYXMgU19JU19FWFRFUk5BTCB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gcmV0dXJuCi0JZWFybHkuCi0JKHRjX2dlbl9yZWxvYyk6IENoZWNrIFNfSVNfV0VBSyBhcyB3ZWwgYXMgU19JU19FWFRFUk5BTCB3aGVuCi0JZGVjaWRpbmcgd2hldGhlciB0byBjb252ZXJ0IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiBpZiBQSUMuCi0KLU1vbiBGZWIgMTkgMDI6MTU6NTcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtYXhfYXJjaGl0ZWN0dXJlKTogQ2hhbmdlIHRvIHNwYXJjbGl0ZSBmb3IKLQkzMiBiaXQgYXJjaC4KLQkoZGVmYXVsdF9jb21wYXRpYmxlKTogRGVsZXRlLgotCShzcGFyY19mZnMpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2JlZ2luKTogT25seSBjYWxsIFNQQVJDX09QQ09ERV9DT05GTElDVF9QIG9uY2UuCi0JKHNwYXJjX2lwKTogUmV3cml0ZSBhcmNoaXRlY3R1cmUgbWF0Y2ggYW5kIGJ1bXAgbG9naWMuCi0KLVN1biBGZWIgMTggMTU6MDM6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciAnZG8gbm90IG1peCcgZnJvbSBuYXRpdmUgbGlua2VyIGJlZm9yZQotIAl0cnlpbmcgdG8gdXNlIC1ycGF0aC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEZlYiAxNiAxNjo1MzozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTRl9BREpfTE5OT1BUUik6IERlZmluZSAobm9uIEJGRF9BU1NFTUJMRVIpLgotCShTRl9HRVRfQURKX0xOTk9QVFIpOiBEZWZpbmUgKG5vbiBCRkRfQVNTRU1CTEVSKS4KLQkoU0ZfU0VUX0FESl9MTk5PUFRSKTogRGVmaW5lIChub24gQkZEX0FTU0VNQkxFUikuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfZW5kZWYpOiBTZXQgQURKX0xOTk9QVFIgd2hlbiBMTk5PUFRSCi0JaXMgc2V0LgotCSh3X3N5bWJvbHMpOiBJZiBBREpfTE5OT1BUUiBpcyBzZXQsIGFkZCB0aGUgc2VjdGlvbiBsbm5vcHRyIGZpZWxkCi0JdG8gdGhlIHN5bWJvbCBsbm5vcHRyIGZpZWxkLCB0byBnZXQgdGhlIGNvcnJlY3QgZmlsZSBvZmZzZXQuCi0KLVRodSBGZWIgMTUgMTQ6NDg6MzggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9zeW1ib2wpOiBPbiB0aGUgUG93ZXJQQywgZm9yY2UgYWxsCi0Jc3ltYm9scyB0aGF0IGFyZSBub3QgZnVuY3Rpb24sIGZpbGUsIG9yIHNlY3Rpb24gc3ltYm9scyB0byBiZQotCW9iamVjdCB0eXBlcy4KLQotVGh1IEZlYiAxNSAxMToyMDoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogU2V0IGFuZCBzdWJzdGl0dXRlIFJQQVRIX0VOVlZBUi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChSUEFUSF9FTlZWQVIpOiBOZXcgdmFyaWFibGUuCi0JKGNoZWNrKTogVXNlICQoUlBBVEhfRU5WVkFSKSByYXRoZXIgdGhhbiBMRF9MSUJSQVJZX1BBVEguCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWNjZXB0IGk2ODYuICBGcm9tIEguSi4gTHUgPGhqbEB6b29tLmNvbT46IGkzODYKLQlkb2Vzbid0IG5lZWQgb3Bjb2Rlcy4gIElmIGNvbmZpZ3VyaW5nIHNoYXJlZCwgb3Bjb2RlcyBuZWVkcyBiZmQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBGZWIgMTQgMTY6MzM6MTIgMTk5NiAgTWFydGluIEFuYW50aGFyYW1hbiAgPG1hcnRpbkBtYWlsLmltZWNoLnVuaS1kdWlzYnVyZy5kZT4KLQotCSogcmVhZC5jIChzX21yaV9zZWN0KTogRG9uJ3QgcmV0dXJuICdcMCcgaW4gdHlwZS4gIFNldCBhbGwKLQlhcHByb3ByaWF0ZSBmbGFncyBpbiBCRkQgc2VjdGlvbi4KLQotCSogY29uZmlndXJlLmluIChtNjhrLSotcHNvcyopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnL3RlLXBzb3MuaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtbTY4ay5jIChjb21tZW50X2NoYXJzKTogRG9uJ3QgaW5jbHVkZSAnIycgaWYgVEVfUFNPUwotCWlzIGRlZmluZWQuCi0KLVdlZCBGZWIgMTQgMTM6NDM6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBkdXBsaWNhdGUgc2V0dGluZyBvZiBjcHVfdHlwZS4gIENoZWNrCi0Jd2hldGhlciBvcGNvZGVzIGxpYnJhcnkgaXMgcmVxdWlyZWQgZm9yIG9uIGFsbCB0YXJnZXRzLCBub3QganVzdAotCXByaW1hcnkgb25lLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2JpZ19nb3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzX2V4dGVybik6IERvbid0IGRlY2xhcmUuCi0JKHJlZ19uZWVkc19kZWxheSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1hY3JvX2J1aWxkKTogUGVybWl0IEdPVC9DQUxMX0hJL0xPIHJlbG9jcy4KLQkobWFjcm9fYnVpbGRfbHVpKTogSWYgcGxhY2UgaXMgbm90IE5VTEwsIHVzZSB0aGUgbnVtYmVyIGluIHRoZQotCWV4cHJlc3Npb24uCi0JKGxvYWRfYWRkcmVzcyk6IEhhbmRsZSBtaXBzX2JpZ19nb3QgY2FzZS4KLQkobWFjcm8pOiBIYW5kbGUgbWlwc19iaWdfZ290IGZvciBNX0xBX0FCLCBNX0pBTF9BLCBhbmQgbG9hZCBhbmQKLQlzdG9yZSBtYWNyb3MuCi0JKE9QVElPTl9YR09UKTogRGVmaW5lLgotCShtZF9sb25nb3B0cyk6IEFkZCAieGdvdCIgaWYgT0JKX0VMRi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIC14Z290LgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiAteGdvdC4KLQkobWRfYXBwbHlfZml4KTogUGVybWl0IEdPVC9DQUxMX0hJL0xPIHJlbG9jcy4KLQkodGNfZ2VuX3JlbG9jKTogSGFuZGxlIEdPVC9DQUxMX0hJL0xPIHJlbG9jcy4KLQotV2VkIEZlYiAxNCAxMToyMjoyNyAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCkgW29wZXJhbmQga2luZCAnIyddOiBXaGVuIGZpeGluZwotCXRoZSBieXRlIHJlbG9jYXRpb24sIHBvaW50IGl0IHRvIHRoZSBsb3cgYnl0ZSBvZiB0aGUgd29yZC4KLQotVHVlIEZlYiAxMyAxNTozMToxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEhETEZMQUdTIGZvciAqLSotaHB1eCB3aXRoIC0tZW5hYmxlLXNoYXJlZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIEZlYiAxMiAxNTo1Mzo0NiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgYW55IHNwYXJjKiBjcHUuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1Nb24gRmViIDEyIDE1OjQxOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkICJtcmkiIGFuZCAiLm1yaSIuCi0JKHNfbXJpKTogTmV3IGZ1bmN0aW9uLgotCSogcmVhZC5oIChzX21yaSk6IERlY2xhcmUuCi0JKiBhcHAuYyAoc2NydWJfbTY4a19tcmkpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtcmlfcHNldWRvKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZG9fc2NydWJfYmVnaW4pOiBBZGQgbTY4a19tcmkgcGFyYW1ldGVyLiAgVXNlIGl0IHJhdGhlciB0aGFuCi0JZmxhZ19tNjhrX21yaS4gIEluaXRpYWxpemUgc2NydWJfbTY4a19tcmkuCi0JKG1yaV9zdGF0ZSwgbXJpX2xhc3RfY2gpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoc3RydWN0IGFwcF9zYXZlKTogQWRkIHNjcnViX202OGtfbXJpLCBtcmlfc3RhdGUsIGFuZCBtcmlfbGFzdF9jaAotCWZpZWxkcy4KLQkoYXBwX3B1c2gpOiBTYXZlIG5ldyBmaWVsZHMuCi0JKGFwcF9wb3ApOiBSZXN0b3JlIG5ldyBmaWVsZHMuCi0JKGRvX3NjcnViX2NoYXJzKTogQ2hlY2sgc2NydWJfbTY4a19tcmkgcmF0aGVyIHRoYW4gZmxhZ19tcmlfbXJpLgotCUlmIFRDX002OEssIHVzZSBhIHRyaXZpYWwgc3RhdGUgbWFjaGluZSB0byBsb29rIGZvciBvY2N1cnJlbmNlcyBvZgotCXRoZSAubXJpIHBzZXVkby1vcCwgYW5kIGNoYW5nZSB0aGUgbW9kZSBhcHByb3ByaWF0ZWx5LgotCSogYXMuaCAoZG9fc2NydWJfYmVnaW4pOiBVcGRhdGUgcHJvdG90eXBlLgotCSogaW5wdXQtc2NydWIuYyAoaW5wdXRfc2NydWJfYmVnaW4pOiBQYXNzIGZsYWdfbTY4a19tcmkgdG8KLQlkb19zY3J1Yl9iZWdpbi4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHJlZ19wcmVmaXhfb3B0aW9uYWxfc2Vlbik6IE5ldyBzdGF0aWMKLQl2YXJpYWJsZS4KLQkobTY4a19tcmlfbW9kZV9jaGFuZ2UpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX3BhcnNlX29wdGlvbik6IFNldCByZWdfcHJlZml4X29wdGlvbmFsX3NlZW4uCi0JKiBjb25maWcvdGMtbTY4ay5oIChtNjhrX21yaV9tb2RlX2NoYW5nZSk6IERlY2xhcmUuCi0JKE1SSV9NT0RFX0NIQU5HRSk6IERlZmluZS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCAubXJpIHBzZXVkby1vcC4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogSW4gTVJJIG1vZGUsIGRvbid0IHRyZWF0ICcjJyBhcyBhCi0JY29tbWVudCBjaGFyYWN0ZXIuCi0KLU1vbiBGZWIgMTIgMTU6MTY6MjkgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQlTdXBwb3J0IGZvciBPQkpfRUxGIG9uIG02OGssIG1vc3RseSBpbnNpZGUgI2lmZGVmIE9CSl9FTEY6Ci0JKiBjb25maWcvbTY4ay1wYXJzZS5oIChlbnVtIHBpY19yZWxvY2F0aW9uKTogRGVmaW5lLgotCShzdHJ1Y3QgbTY4a19leHApOiBBZGQgcGljX3JlbG9jIGZpZWxkLgotCSogY29uZmlnL3RjLW02OGsuaCAoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogRGVmaW5lLgotCSh0Y19maXhfYWRqdXN0YWJsZSk6IERlZmluZSB0byBjYWxsIHRjX202OGtfZml4X2FkanVzdGFibGUuCi0JKE5PX1JFTE9DKTogRGVmaW5lIHRvIEJGRF9SRUxPQ19OT05FIGlmIEJGRF9BU1NFTUJMRVIsIHRvIHplcm8KLQlvdGhlcndpc2UuCi0JKiBjb25maWcvdGMtbTY4ay5jOiBEZWxldGUgZGVmaW5pdGlvbiBvZiBOT19SRUxPQy4KLSAJKHN0cnVjdCBtNjhrX2l0KTogQWRkIHBpY19yZWxvYyBmaWVsZC4KLQkoYWRkX2ZpeCk6IENvcHkgb3ZlciBwaWNfcmVsb2MgZmllbGQuCi0JKG1kX3BzZXVkb190YWJsZSk6IEludGVycHJldCAuYWxpZ24gcGFyYW1ldGVyIGFzIGJ5dGUgY291bnQuCi0JKG1vdGVfcHNldWRvX3RhYmxlKTogTGlrZXdpc2UuCi0JKHRjX202OGtfZml4X2FkanVzdGFibGUpOiBOZXcgZnVuY3Rpb24uCi0JKGdldF9yZWxvY19jb2RlKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hc3NlbWJsZSk6IFVzZSBpdCBhcyBsYXN0IGFyZ3VtZW50IHRvIGZpeF9uZXdfZXhwLgotCShtZF9hcHBseV9maXhfMik6IEZvciBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHN5bWJvbCBkb24ndCBwdXQgdGhlCi0JYWRkZW5kIGludG8gdGhlIGRhdGEuCi0JKHRjX2dlbl9yZWxvYyk6IERpZmZlcmVudCBhZGRlbmQgY29tcHV0YXRpb24gZm9yIE9CSl9FTEYuCi0JKG02OGtfaXApOiBEb24ndCByZWxheCBhbiBvcGVyYW5kIHRoYXQgcmVxdWlyZXMgcGljIHJlbG9jYXRpb24uCi0JKG1kX2JlZ2luKTogQWxpZ24gLnRleHQsIC5kYXRhIGFuZCAuYnNzIG9uIDQgYnl0ZSBib3VuZGFyeSBieQotCWRlZmF1bHQuCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgYWRkIHN5bWJvbCB2YWx1ZSB0byBhZGRlbmQgaWYKLSAJVENfTTY4SyBhbmQgT0JKX0VMRi4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLnkgKHl5bGV4KTogSGFuZGxlIEBQTFRQQywgZXRjLgotCShtb3Rvcm9sYV9vcGVyYW5kKTogQWRkIHJ1bGUgZm9yIGAoemFwYywgRVhQUiknLgotCi1Nb24gRmViIDEyIDEwOjA3OjMzIDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0KTogRml4ZWQgc28gdGhhdCB3aGl0ZXNwYWNlCi0JKnJlYWxseSogaXMgcGVybWlzc2libGUgYmVmb3JlIHRoZSBjb21tYS4KLQotTW9uIEZlYiAxMiAwMDoxMjoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IEFsaWduIHRvIGEgMiBieXRlIGJvdW5kYXJ5IGJlZm9yZQotCWluc2VydGluZyBub3AgaW5zdHJ1Y3Rpb25zLgotCi1GcmkgRmViICA5IDEwOjU0OjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RlLWF1eC5oOiBDaGFuZ2UgaW5jbHVkZSBvZiBhdXguaCB0byBhdXgtY29mZi5oLgotCi1UaHUgRmViICA4IDIwOjAyOjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAodGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKTogQ29ycmVjdCBzdG9yYWdlCi0JY2xhc3Mgc2V0dGluZyBmb3IgYSBDQUxMTkFNRSBzeW1ib2wgaW4gQ09GRi4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogUGFzcyBuZWdhdGl2ZSBudW1iZXJzIGZvciBuZXcgLmJhbGlnblt3bF0gYW5kCi0JLnAyYWxpZ25bd2xdIHBzZXVkby1vcHMuCi0JKHNfYWxpZ25fYnl0ZXMpOiBUcmVhdCBhIG5lZ2F0aXZlIGFyZ3VtZW50IGFzIHNwZWNpZnlpbmcgdGhlIGZpbGwKLQlsZW5ndGguCi0JKHNfYWxpZ25fcHR3byk6IExpa2V3aXNlLgotCi1XZWQgRmViICA3IDE0OjEyOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIGJhbGlnbncsIGJhbGlnbmwsIHAyYWxpZ253LCBhbmQgcDJhbGlnbmwuCi0JKGRvX2FsaWduKTogVGFrZSBuZXcgbGVuIHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4gIFBhc3MgaXQKLQl0byBtZF9kb19hbGlnbi4KLQkoc19hbGlnbl9ieXRlcyk6IEFyZyBub3cgaW5kaWNhdGVzIHRoZSBsZW5ndGggb2YgdGhlIGZpbGwgcGF0dGVybi4KLQkoc19hbGlnbl9wdHdvKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBQYXNzIGxlbmd0aCB0bwotCW1kX2RvX2FsaWduLgotCSogY29uZmlnL3RjLWkzODYuaCAobWRfZG9fYWxpZ24pOiBUYWtlIG5ldyBsZW4gcGFyYW1ldGVyLgotCSogY29uZmlnL3RjLW04OGsuaCAobWRfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG04OGtfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zaC5oIChtZF9kb19hbGlnbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgbmV3IHBzZXVkby1vcHMuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9tZGVwcyk6IERpdmlkZSBvZmZzZXQgYnkgZnJfdmFyLCBhcyBpcwotCWRvbmUgaW4gY3Z0X2ZyYWdfdG9fZmlsbC4KLQotCSogY29uZmlnL3RjLXNoLmggKHNoX2RvX2FsaWduKTogRGVjbGFyZS4KLQkobWRfZG9fYWxpZ24pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2xpbmVubyk6IERvbid0IHRyeSB0byBzdG9yZSB0aGUgYWRkcmVzcwotCWRpZmZlcmVuY2UgaWYgdGhlIG5leHQgYWRkcmVzcyBpcyBiZWZvcmUgdGhlIGN1cnJlbnQgb25lLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChzdHJ1Y3QgbTY4a19jcHUpOiBBZGQgYWxpYXMgZmllbGQuCi0JKGFyY2hzKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKG02OGtfaXApOiBEb24ndCBsaXN0IGFsaWFzIG5hbWVzIHdoZW4gbGlzdGluZyBDUFVzIHdoaWNoIHN1cHBvcnQKLQlhbiBpbnN0cnVjdGlvbi4KLQotCSogYXMuYyAobWFpbik6IENhbGwgcGFyc2VfYXJncyBiZWZvcmUgcmVhZF9iZWdpbi4KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IElmIGZsYWdfbTY4a19tcmksIGRvbid0IHB1dCBhIGRvdCBpbgotCWZyb250IG9mIGdlbmVyYXRlZCBwc2V1ZG8tb3BzLgotCSogcmVhZC5jIChwb3RhYmxlKTogSWdub3JlICJuYW1lIi4KLQkoc19hcHBfZmlsZSk6IFBlcm1pdCBhIHNpbmdsZSBxdW90ZSBhZnRlciB0aGUgc3RyaW5nLCBzaW5jZSBvbmUKLQltYXkgYXBwZWFyIGluIG02OGsgTVJJIG1vZGUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIC0tZW5hYmxlLXNoYXJlZC4gIElmIGxpbmtpbmcgYWdhaW5zdAotCXNoYXJlZCBCRkQgYW5kIG9wY29kZXMsIGZpeCBsaWJyYXJ5IG5hbWUgb24gU3VuT1MsIGFuZCB0cnkgdG8gc2V0Ci0JLXJwYXRoIHJlYXNvbmFibHkuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBGZWIgIDYgMTU6MTY6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5oIChmbGFnX202OGtfbXJpKTogRGVjbGFyZS4KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBJZiBUQ19NNjhLLCBzZXQgZmxhZ19tNjhrX21yaSBmb3IgLU0uCi0JKiBNYW55IGZpbGVzOiBGb3IgTVJJIHN5bnRheCB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBtNjhrIE1SSQotCWFzc2VtYmxlciwgY2hlY2sgZmxhZ19tNjhrX21yaSByYXRoZXIgdGhhbiBmbGFnX21yaSBvcgotCU1SSV9NT0RFX05FRURTX1BTRVVET19ET1QuCi0KLU1vbiBGZWIgIDUgMTY6Mjk6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChBUkNIX0hYKTogRGVmaW5lLgotCShhcmNoX3RhYik6IEFkZCBIWC4KLQkodGFyZ19oYXNfc2ZyKTogSGFuZGxlIEFSQ0hfSFguCi0JKHRhcmdfaGFzX2ljbGFzcyk6IEhhbmRsZSBBUkNIX0hYLgotCSh0Y19jb2ZmX2ZpeDJydHlwZSk6IEFkZCByZXR1cm4gMCB0byBhdm9pZCB3YXJuaW5nLgotCSh0Y19oZWFkZXJzX2hvb2spOiBJZiB0aGUgYXJjaGl0ZWN0dXJlIHdhcyBzcGVjaWZpZWQgZXhwbGljaXRseSwKLQl1c2UgaXQgd2hlbiBzZXR0aW5nIHRoZSBmbGFncy4gIFNldCB0aGUgZXh0ZXJuIHZhcmlhYmxlIGNvZmZfZmxhZ3MKLQlyYXRoZXIgdGhhbiBoZWFkZXJzLT5maWxlaGRyLmZfZmxhZ3MsIHNpbmNlIHRoZSBsYXR0ZXIgaXMgc2V0Ci0JdW5jb25kaXRpb25hbGx5IGluIG9iai1jb2ZmLmMuCi0JKGk5NjBfaGFuZGxlX2FsaWduKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBmaXhwLgotCi0JU3VwcG9ydCBmb3IgYnVpbGRpbmcgYmZkIGFuZCBvcGNvZGVzIGFzIHNoYXJlZCBsaWJyYXJpZXMsIGJhc2VkIG9uCi0JcGF0Y2hlcyBmcm9tIEFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PjoKLQkqIGNvbmZpZ3VyZS5pbjogU2V0IE9QQ09ERVMgYW5kIEJGRCB0byBzZWFyY2ggZGlyZWN0b3JpZXMuCi0JU3Vic3RpdHV0ZSBPUENPREVTX0RFUCBhbmQgQkZEREVQLiAgT24gU3VuT1MsIHNldCBITERGTEFHUy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChMREZMQUdTLCBITERGTEFHUyk6IE5ldyB2YXJpYWJsZXMuCi0JKExJQkRFUFMpOiBOZXcgdmFyaWFibGUuCi0JKGFzLm5ldzA6IERlcGVuZCB1cG9uICQoTElCREVQUykgcmF0aGVyIHRoYW4gJChMSUJTKS4gIFVzZQotCSQoSExERkxBR1MpIGluIGxpbmsuCi0JKGNoZWNrKTogU2V0IExEX0xJQlJBUllfUEFUSCBpbiB0aGUgZW52aXJvbm1lbnQuCi0KLUZyaSBGZWIgIDIgMTc6NDE6NTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KLQotCSogY29uZmlnL3RjLXBwYy5oIChFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IE1ha2UgLnNkYXRhMiwgLnNic3MyLAotCS5QUEMuRU1CLnNkYXRhMCwgYW5kIC5QUEMuRU1CLnNic3MwIHNlY3Rpb25zIGFsbCBkZWZhdWx0IHRvCi0JcmVhZC1vbmx5LCBub3QgcmVhZC93cml0ZS4KLQotRnJpIEZlYiAgMiAxNDowOToyNSAxOTk2ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1hGT1JNKTogUmVtb3ZlIC1lLgotCi1GcmkgRmViICAyIDEyOjMyOjE1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogVXNlIFNfSVNfREVGSU5FRCBhbmQgU19JU19DT01NT04gcmF0aGVyCi0JdGhhbiBjb21wYXJpbmcgU19HRVRfU0VHTUVOVCB0byB1bmRlZmluZWRfc2VjdGlvbi4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIGFuCi0JdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wuCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogVXNlIFNfSVNfREVGSU5FRCBhbmQKLQlTX0lTX0NPTU1PTiByYXRoZXIgdGhhbiBjb21wYXJpbmcgU19HRVRfU0VHTUVOVCB0bwotCXVuZGVmaW5lZF9zZWN0aW9uLgotCShTX0dFVF9WQUxVRSk6IExpa2V3aXNlLiAgQXZvaWQgcmVjdXJzaW9uIHByb2JsZW1zIGlmIFNfSVNfREVGSU5FRAotCW9yIFNfSVNfQ09NTU9OIGNhbGwgU19HRVRfVkFMVUUuCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoU19JU19DT01NT04pOiBEZWZpbmUgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2VtaXRfcmVsb2NhdGlvbnMpOiBJZiBhIHJlbG9jIGlzIGVxdWF0ZWQKLQl0byBhbiB1bmRlZmluZWQgb3IgY29tbW9uIHN5bWJvbCwgY29udmVydCB0aGUgcmVsb2MgdG8gYmUgYWdhaW5zdAotCXRoZSB0YXJnZXQgc3ltYm9sLgotCShvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKTogU2tpcCBzeW1ib2xzIHdoaWNoIHdlcmUgZXF1YXRlZCB0byBhbgotCXVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9sLgotCSogY29uZmlnL29iai1ib3V0LmggKFNfSVNfQ09NTU9OKTogRGVmaW5lIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlnL29iai1ib3V0LmMgKG9ial9lbWl0X3JlbG9jYXRpb25zKTogSWYgYSByZWxvYyBpcyBlcXVhdGVkCi0JdG8gYW4gdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wsIGNvbnZlcnQgdGhlIHJlbG9jIHRvIGJlIGFnYWluc3QKLQl0aGUgdGFyZ2V0IHN5bWJvbC4KLQkob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gYW4KLQl1bmRlZmluZWQgb3IgY29tbW9uIHN5bWJvbC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogVXNlIFNfSVNfREVGSU5FRCBhbmQKLQlTX0lTX0NPTU1PTiByYXRoZXIgdGhhbiBjb21wYXJpbmcgU19HRVRfU0VHTUVOVCB0bwotCXVuZGVmaW5lZF9zZWN0aW9uLgotCSh5YW5rX3N5bWJvbHMpOiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIGFuIHVuZGVmaW5lZCBvcgotCWNvbW1vbiBzeW1ib2wuCi0KLVRodSBGZWIgIDEgMTU6MzQ6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoU19JU19MT0NBTCk6IENoZWNrIGZvciBcMDAyIGFzIHdlbGwgYXMgXDAwMS4KLQkqIGNvbmZpZy9vYmotYm91dC5oIChTX0lTX0xPQ0FMKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZ3VyZS5pbjogTWFrZSBzdXJlIHdlIG9ubHkgYWRkIG02OGstcGFyc2UubyB0bwotCSR7ZXh0cmFfb2JqZWN0c30gb25jZSwgbm8gbWF0dGVyIGhvdyBtYW55IG02OGsgdGFyZ2V0cyBoYXZlIGJlZW4KLQllbmFibGVkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgSmFuIDMxIDE4OjMxOjQ2IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWN5Z3dpbjMyLCBwcGMtKi1jeWd3aW4zMik6IE5ldy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEphbiAzMSAxNDowMzoxNyAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICJleHRlbmQiIGFuZCAibGRvdWJsZSIuCi0JKiBkb2MvYy1tNjhrLnRleGk6IERvY3VtZW50IC5leHRlbmQgYW5kIC5sZG91YmxlLgotCi0JKiBjb25maWd1cmUuaW4gKG02OCotYXBwbGUtYXV4Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWcvdGUtYXV4Lmg6IE5ldyBmaWxlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvbXBhcmVfZXh0ZXJuYWxfcmVsb2NzKTogTmV3IHN0YXRpYyBmdW5jdGlvbgotCWlmIFRFX0FVWC4KLQkoZG9fcmVsb2NzX2Zvcik6IFNvcnQgcmVsb2NzIGlmIFRFX0FVWC4KLQkoZml4dXBfc2VnbWVudCk6IElmIFRFX0FVWCwgc3RvcmUgY29tbW9uIHN5bWJvbCB2YWx1ZSBpbiBzZWdtZW50LgotCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0ZPUk1BVCk6IERlZmluZSBpZiBURV9BVVguCi0KLVdlZCBKYW4gMzEgMTI6MjQ6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU19JU19MT0NBTCk6IENoZWNrIGZvciBcMDAyIGFzIHdlbGwgYXMgXDAwMS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoc19taXBzX2dsb2JsKTogU2V0IEJTRl9PQkpFQ1QgaWYgaXQgaXMgbm90Ci0JQlNGX0ZVTkNUSU9OLgotCShzX2NwbG9hZCk6IFNldCBCU0ZfT0JKRUNUIGZvciBfZ3BfZGlzcCBzeW1ib2wuCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBJZiBTX1NFVF9TSVpFIGlzIGRlZmluZWQsIHNldCB0aGUgc2l6ZSBvZiB0aGUKLQlzeW1ib2wuCi0JKiBlY29mZi5jIChhZGRfcHJvY2VkdXJlKTogU2V0IHRoZSBCU0ZfRlVOQ1RJT04gZmxhZy4KLQkoZWNvZmZfYnVpbGRfc3ltYm9scyk6IElmIFNfU0VUX1NJWkUgaXMgZGVmaW5lZCwgc2V0IHRoZSBzaXplIG9mCi0JYW4gdW5kZWZpbmVkIHN5bWJvbCBhbmQgdGhlIHNpemUgb2YgYSBmdW5jdGlvbiBzeW1ib2wuCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9zeW1ib2wpOiBJZiBUQ19NSVBTLCBzZXQgQlNGX09CSkVDVAotCWZvciBhbGwgY29tbW9uIHN5bWJvbHMuCi0KLVR1ZSBKYW4gMzAgMTI6MzU6MjQgMTk5NiAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHBhcnNlX21lbW9wKTogSW4gTVJJIG1vZGUsIGRvbid0IHVzZSBpbXBsaWNpdAotCXNjYWxpbmcgb2YgaW5kZXguCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IEFjY2VwdCAweCBoZXggY29uc3RhbnRzIGluIE1SSSBtb2RlIGlmIG5vdCBvbgotCW02OGsuCi0KLU1vbiBKYW4gMjkgMTI6MjE6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3R5cGUpOiBTZXQgQlNGX09CSkVDVCBmbGFnIGZvciBhIHR5cGUKLQlvZiBvYmplY3QuICBGcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT4uCi0KLQkqIGVjb2ZmLmMgKGxvY2Fsc3ltX3QpOiBBZGQgYWRkZW5kIGZpZWxkLgotCShhZGRfZWNvZmZfc3ltYm9sKTogQWRkIGFkZGVuZCBhcmd1bWVudC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoY29mZl9zeW1fdmFsdWUpOiBNYWtlIHN0YXRpYy4KLQkoY29mZl9zeW1fYWRkZW5kKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZWNvZmZfZGlyZWN0aXZlX2RlZik6IEluaXRpYWxpemUgY29mZl9zeW1fYWRkZW5kLgotCShlY29mZl9kaXJlY3RpdmVfdmFsKTogQWNjZXB0IHN5bWJvbCArIGNvbnN0YW50LgotCShlY29mZl9kaXJlY3RpdmVfZW5kZWYpOiBQYXNzIGNvZmZfc3ltX2FkZGVuZCB0byBhZGRfZWNvZmZfc3ltYm9sLgotCShlY29mZl9idWlsZF9zeW1ib2xzKTogSW5jbHVkZSB0aGUgYWRkZW5kIGluIHRoZSBzeW1ib2wgdmFsdWUuCi0KLUZyaSBKYW4gMjYgMTk6Mjg6NTIgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXNzZW1ibGUpOiBJZ25vcmUgb3ZlcmZsb3cgb24gCi0JQkZEX1JFTE9DXzE2X0dPVE9GRiBhbmQgQkZEX1JFTE9DX1BQQ19UT0MxNi4KLQotRnJpIEphbiAyNiAxNjoxNDoxNyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IFNEQTIxIHJlbG9jYXRpb25zIGFyZSBub3cgNAotCWJ5dGVzIGluIHNpemUsIHNvIG9mZnNldCBhcHByb3ByaWF0ZWx5IGluIGJpZyBlbmRpYW4gbW9kZSB3aGVuCi0Jd3JpdGluZyB0aGUgYm90dG9tIDIgYnl0ZXMuCi0KLVRodSBKYW4gMjUgMjA6MjY6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChkZWZhdWx0X2NvbXBhdGlibGUpOiBOZXcgc3RhdGljIGxvY2FsLgotCShtZF9iZWdpbik6IEluaXRpYWxpemUgaXQuICBSZXdyaXRlIHdhcm5fb25fYnVtcCBoYW5kbGluZy4KLQkoc3BhcmNfaXApOiBJZiBubyBhcmNoaXRlY3R1cmUgb3IgLWJ1bXAgc3BlY2lmaWVkLCBkb24ndCBtYXJrIGFzCi0JbWlzbWF0Y2hlZCB0aG9zZSBpbiBkZWZhdWx0X2NvbXBhdGlibGUuCi0KLVRodSBKYW4gMjUgMTI6MjE6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JU0NPIEVMRiBzdXBwb3J0IGZyb20gUm9iZXJ0IExpcGUgPHJvYmVydGxAYXJuZXQuY29tPjoKLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLXNjbyplbGYqKTogVXNlIGZtdCBlbGYsIHRhcmcgc2NvNS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy9zY281Lm10OiBOZXcgZmlsZTsgc2V0IFRERUZJTkVTIHRvIC1EU0NPX0VMRi4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHNjb19pZCk6IE5ldyBmdW5jdGlvbiwgaWYgU0NPX0VMRi4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKHRjX2luaXRfYWZ0ZXJfYXJncyk6IERlZmluZSBpZiBTQ09fRUxGLgotCShzY29faWQpOiBEZWNsYXJlIGlmIFNDT19FTEYuCi0KLVRodSBKYW4gMjUgMDM6MTA6NTMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChpbml0aWFsX2FyY2hpdGVjdHVyZSxjYW5fYnVtcF92OV9wKTogRGVsZXRlZC4KLQkoe21heCx3YXJuX2FmdGVyfV9hcmNoaXRlY3R1cmUpOiBOZXcgc3RhdGljIGxvY2Fscy4KLQkobWRfYmVnaW4pOiBSZXBsYWNlIE5VTU9QQ09ERVMgd2l0aCBzcGFyY19udW1fb3Bjb2Rlcy4KLQlJZiBib3RoIGFyY2hpdGVjdHVyZSBhbmQgLWJ1bXAgcmVxdWVzdGVkLCBzZXQgbWF4X2FyY2hpdGVjdHVyZSB0byBtYXguCi0JKHNwYXJjX21kX2VuZCk6IFNpbXBsaWZ5LgotCShzcGFyY19pcCk6IFJlcGxhY2UgcmVmZXJlbmNlcyB0byBjYW5fYnVtcF92OV9wIHdpdGggbWF4X2FyY2hpdGVjdHVyZS4KLQlSZXdyaXRlIGNvZGUgdG8gYnVtcCBhcmNoaXRlY3R1cmUgYW5kIGNoZWNrIGZvciBjb25mbGljdHMuCi0JKG1kX2xvbmdvcHRzKTogUmVjb2duaXplIC14YXJjaD17djhwbHVzLHY4cGx1c2F9IGZvciBjb21wYXRpYmlsaXR5Ci0Jd2l0aCBTb2xhcmlzIGFzc2VtYmxlci4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTGlrZXdpc2UuICBDYWxsIHNwYXJjX29wY29kZV9sb29rdXBfYXJjaC4KLQkobWRfc2hvd191c2FnZSk6IFVwZGF0ZS4KLQotV2VkIEphbiAyNCAyMjoxMTowMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFJVTlRFU1QpOiBGaXggcmVmZXJlbmNlIHRvICQke3NyY2Rpcn0uCi0KLU1vbiBKYW4gMjIgMDk6MjE6MzYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQVJHRVRfRk9STUFUKTogVXNlICNpZmRlZiBTUEFSQ19BUkNINjQgaW5zdGVhZCBvZgotCSNpZmRlZiBzcGFyY3Y5IHdoZW4gY2hvb3NpbmcgdmFsdWUuCi0JKEVOVjY0KTogRGVsZXRlLgotCShtZF9lbmQpOiBEZWZpbmUuCi0JKHNwYXJjX21kX2VuZCk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoU1BBUkNfVjkpOiBSZW5hbWVkIGZyb20gc3BhcmN2OS4KLQkoaW5pdGlhbF9hcmNoaXRlY3R1cmUpOiBOZXcgc3RhdGljIGxvY2FsLgotCShjYW5fYnVtcF92OV9wKTogTGlrZXdpc2UuCi0JKE5PX1Y5KTogRGVsZXRlIGFsbCBvY2N1cnJlbmNlcy4KLQkoc3BhcmNfbWRfZW5kKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19pcCk6IE5ldyBsb2NhbCB2OV9hcmdfcC4gIFJld29yayBmcCByZWcgbnVtYmVyIHRlc3QuCi0JRG9uJ3QgYnVtcCBhcmNoaXRlY3R1cmUgdG8gdjkgdW5sZXNzIGNhbl9idW1wX3Y5X3Agc2V0LgotCShtZF9wYXJzZV9vcHRpb24pOiAtQTxhcmNoPiBwYXNzZWQsIHNldCBjYW5fYnVtcF92OV9wIGFjY29yZGluZ2x5LgotCSogY29uZmlndXJlLmluIChzcGFyYzY0IHRhcmdldCBjcHUpOiBEb24ndCBzZXQgb2JqX2Zvcm1hdCBoZXJlLgotCShTUEFSQ19WOSk6IFJlbmFtZWQgZnJvbSBzcGFyY3Y5LgotCShzcGFyYzY0LSotZWxmKik6IERlZmluZSBTUEFSQ19BUkNINjQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogYWNjb25maWcuaCAoU1BBUkNfVjkpOiBSZW5hbWVkIGZyb20gc3BhcmN2OS4KLQkoU1BBUkNfQVJDSDY0KTogQWRkLgotCSogY29uZi5pbjogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWcvdm1zY29uZi5oOiBVcGRhdGUuCi0KLU1vbiBKYW4gMjIgMTc6MjQ6NDcgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogT3B0aW1pc2UgImRsaSIgbG9hZHMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBhZGQgIi1tY3B1PXZyNDEwMCIgdG8gaGVscCB0ZXh0LgotCi1Nb24gSmFuIDIyIDExOjUzOjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IElmIGEgc3ltYm9sIGlzIGVxdWF0ZWQgdG8gYW4KLQl1bmRlZmluZWQgc3ltYm9sLCBwcmVzZXJ2ZSB0aGUgWF9vcCBvZiBPX3N5bWJvbC4KLQkoU19HRVRfVkFMVUUpOiBGaXggY2hlY2sgdG8gcGVybWl0IHRoaXMgY2FzZS4KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IElmIGEgcmVsb2MgaXMgYWdhaW5zdCBhbiB1bmRlZmluZWQKLQlzeW1ib2wgZXF1YXRlZCB0byBhbm90aGVyIHN5bWJvbCwgY2hhbmdlIHRoZSByZWxvYyB0byBiZSBhZ2FpbnN0Ci0JdGhlIGxhdHRlciBzeW1ib2wuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19jc2VjdCk6IEFuIHVubmFtZWQgY3NlY3QgaXMgc3RvcmFnZSBjbGFzcwotCVhNQ19QUi4KLQotTW9uIEphbiAyMiAxMDo1OTo0OCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZi9wcGMuaCk6IEluY2x1ZGUgZWxmL3BwYy5oIGlmIHRhcmdldAotCWNvbXB1dGVyIGlzIFBvd2VyUEMuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEFkZCBtb3JlIGVtYmVkZGVkIHJlbG9jYXRpb25zLgotCi0JKiBjb25maWcvdGMtcHBjLmggKEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TKTogQWRkIHNlY3Rpb25zCi0JbWVudGlvbmVkIGluIHRoZSBlYWJpLgotCi1UaHUgSmFuIDE4IDE3OjU4OjE5IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19yZWxkYXRhKTogQ2hhbmdlZCBhbGlnbmVtZW50IG9uIHJlbGRhdGFfc2VjdGlvbgotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfcGRhdGEpOiBDaGFuZ2VkIHRoZSBhbGlnbm1lbnQgb24gcGRhdGFfc2VjdGlvbgotCi1Nb24gSmFuIDE1IDE3OjQzOjQyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtYXBwaW5nKTogQWRkIG1vcmUgcmVsb2NhdGlvbiBzdWZmaXhlcy4KLQotU3VuIEphbiAxNCAyMToyOTozNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBBbGxvdyAuZ2NjX2V4Y2VwdF90YWJsZQotCWFzIGEgc2VjdGlvbiBpdCBpcyBvayB0byBoYXZlIHVuYWRvcm5lZCAtbXJlbG9jYXRhYmxlIHBvaW50ZXJzIGluLgotCi1TYXQgSmFuIDEzIDExOjA5OjA4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfc2VjdGlvbiopOiBXcmFwIHRoZXNlIGZ1bmN0aW9ucyBpbnNpZGUKLQkjaWZkZWYgT0JKX0VMRi4KLQotRnJpIEphbiAxMiAxNTozMjowNyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IEFkZCBob29rcyBzbyBtYWNoaW5lCi0JZGVwZW5kZW50IHNlY3Rpb24gYXR0cmlidXRlcyBjYW4gYmUgaGFuZGxlZC4KLQotCSogY29uZmlnL3RjLXBwYy5oOiAobWRfZWxmX3NlY3Rpb25fe2xldHRlcix0eXBlLHdvcmQsZmxhZ3N9KTogTmV3Ci0JbWFjcm9zIHRvIGFkZCBzdXBwb3J0IGZvciBleGNsdWRlIHNlY3Rpb24gZmxhZyBhbmQgb3JkZXJlZCBzZWN0aW9uCi0JdHlwZS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3NlY3Rpb25fe2xldHRlcix0eXBlLHdvcmQsZmxhZ3N9KTogTmV3Ci0JZnVuY3Rpb25zIHRvIGFkZCBzdXBwb3J0IGZvciBleGNsdWRlIHNlY3Rpb24gZmxhZyBhbmQgb3JkZXJlZAotCXNlY3Rpb24gdHlwZS4KLQotRnJpIEphbiAxMiAxMjowNDowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBEb24ndCB0cnkgdG8gbG9vayB1cCB0aGUgc2VjdGlvbgotCXN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZS4gIEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBoYXZlIGEgc3ltYm9sCi0Jd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGEgc2VjdGlvbiwgYnV0IG5vIGNvbm5lY3Rpb24gdG8gaXQuCi0KLQkqIHJlYWQuYyAoY29uc193b3JrZXIpOiBPbmx5IGNhbGwgbXJpX2NvbW1lbnRfZW5kIGZyb20gZmxhZ19tcmkuCi0JRnJvbSBKYW1lcyBDYXJsc29uIDxjYXJsc29uQHh5bG9naWNzLmNvbT4uCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IFNraXAgd2hpdGVzcGFjZSBhZnRlciBhIGNsb3NlIHBhcmVudGhlc2lzLgotCUZyb20gSmFtZXMgQ2FybHNvbiA8Y2FybHNvbkB4eWxvZ2ljcy5jb20+LgotCi1UdWUgSmFuICAyIDEyOjQzOjIzIDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2FwcGx5X2ZpeCk6IENhbGwgYXNfYmFkX3doZXJlIGluc3RlYWQgb2YKLQlhc193YXJuX3doZXJlIGZvciByZWxvY2F0aW9uIG92ZXJmbG93LgotCShwYXJzZV9yZWcpOiBBY2NlcHQgcmVnaXN0ZXIgbmFtZSBvbmx5IGlmIG5leHQgY2hhcmFjdGVyIGlzCi0Jbm90IGFscGhhbnVtZXJpYy4KLQotRm9yIG9sZGVyIGNoYW5nZXMgc2VlIENoYW5nZUxvZy05Mjk1CmRpZmYgLS1naXQgYS9nYXMvTWFrZWZpbGUuYW0gYi9nYXMvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4OGYyMWMuLjAwMDAwMDAKLS0tIGEvZ2FzL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsMTY5NSArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCi0KLSMjIFdvcmsgYXJvdW5kIGFwcGFyZW50IGF1dG9tYWtlIGJ1Zy4KLUlOVExMSUJTID0gQElOVExMSUJTQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzIGRlamFnbnUKLQotU1VCRElSUyA9IGRvYyBwbwotCi10b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpCi0KLVlBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdIDsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MLi4vYmlzb24vYmlzb24gOyBlbHNlIGVjaG8gYmlzb24gLXkgOyBmaWAKLUxFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdIDsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleCA7ICBlbHNlIGVjaG8gZmxleCA7IGZpYAotCi1ERVAgPSAkKHNyY2RpcikvLi4vbWtkZXAKLQotVEFSR19DUFUgPSBAdGFyZ2V0X2NwdV90eXBlQAotVEFSR19DUFVfQyA9ICQoc3JjZGlyKS9jb25maWcvdGMtQHRhcmdldF9jcHVfdHlwZUAuYwotVEFSR19DUFVfTyA9IHRjLUB0YXJnZXRfY3B1X3R5cGVALm8KLVRBUkdfQ1BVX0ggPSAkKHNyY2RpcikvY29uZmlnL3RjLUB0YXJnZXRfY3B1X3R5cGVALmgKLU9CSl9GT1JNQVRfQyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLUBvYmpfZm9ybWF0QC5jCi1PQkpfRk9STUFUX08gPSBvYmotQG9ial9mb3JtYXRALm8KLU9CSl9GT1JNQVRfSCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLUBvYmpfZm9ybWF0QC5oCi1UQVJHX0VOVl9IID0gJChzcmNkaXIpL2NvbmZpZy90ZS1AdGVfZmlsZUAuaAotQVRPRl9UQVJHX0MgPSAkKHNyY2RpcikvY29uZmlnL2F0b2YtQGF0b2ZALmMKLUFUT0ZfVEFSR19PID0gYXRvZi1AYXRvZkAubwotCi0jIHVzZSBAdGFyZ2V0X2NwdV90eXBlQCBmb3IgcmVmZXJpbmcgdG8gY29uZmlndXJlZCB0YXJnZXQgbmFtZQotSVRfSERSUz1pdGJsLXBhcnNlLmggJChzcmNkaXIpL2l0Ymwtb3BzLmggCi1JVF9TUkNTPWl0YmwtcGFyc2UuYyBpdGJsLWxleC5jICQoc3JjZGlyKS9pdGJsLW9wcy5jCi1JVF9ERVBTPSQoc3JjZGlyKS9pdGJsLXBhcnNlLnkgJChzcmNkaXIpL2l0YmwtbGV4LmwgJChzcmNkaXIpL2NvbmZpZy9pdGJsLUB0YXJnZXRfY3B1X3R5cGVALmgKLUlUX09CSlM9aXRibC1wYXJzZS5vIGl0YmwtbGV4Lm8gaXRibC1vcHMubwotCi0jIENQVSB0eXBlcy4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLgotCi1DUFVfVFlQRVMgPSBcCi0JYTI5ayBcCi0JYWxwaGEgXAotCWFyYyBcCi0JYXJtIFwKLQlkMTB2IFwKLQlkMzB2IFwKLQlmcjMwIFwKLQloODMwMCBcCi0JaDg1MDAgXAotCWhwcGEgXAotCWkzODYgXAotCWk4NjAgXAotCWk5NjAgXAotCW0zMnIgXAotCW02OGsgXAotCW04OGsgXAotCW1jb3JlIFwKLQltaXBzIFwKLQltbjEwMjAwIFwKLQltbjEwMzAwIFwKLQluczMyayBcCi0JcHBjIFwKLQlzaCBcCi0Jc3BhcmMgXAotCXRhaG9lIFwKLQl0aWMzMCBcCi0JdGljODAgXAotCXZheCBcCi0JdzY1IFwKLQl2ODUwIFwKLQl6OGsKLQotIyBPYmplY3QgZm9ybWF0IHR5cGVzLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24uCi0jIFdlIGRlbGliZXJhdGVseSBvbWl0IHNvbSwgc2luY2UgaXQgZG9lcyBub3Qgd29yayBhcyBhIGNyb3NzIGFzc2VtYmxlci4KLQotT0JKX0ZPUk1BVFMgPSBcCi0JYW91dCBcCi0JYm91dCBcCi0JY29mZiBcCi0JZWNvZmYgXAotCWVsZiBcCi0JZXZheCBcCi0JaHAzMDAgXAotCWllZWUgXAotCXZtcwotCi0jIFRoaXMgaXMgYW4gc2ggY2FzZSB3aGljaCBzZXRzIHZhbGlkIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZSBDUFUKLSMgdHlwZSBpbiB0aGUgc2hlbGwgdmFyaWFibGUgYyBhbmQgdGhlIE9TIHR5cGUgaW4gdGhlIHNoZWxsIHZhcmlhYmxlIG8KLSMgYXJlIHN1cHBvcnRlZC4gIFRoaXMgaGVscHMgY3V0cyBkb3duIG9uIHRoZSBhbW91bnQgb2YgZGVwZW5kZW5jeQotIyBpbmZvcm1hdGlvbi4KLQotQ1BVX09CSl9WQUxJRCA9IFwKLQl2YWxpZD0gOyBcCi0JY2FzZSAkJG8gaW4gXAotCWFvdXQpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIGEyOWsgfCBhcm0gfCBpMzg2IHwgaTg2MCB8IG02OGsgfCBtaXBzIHwgbnMzMmsgfCBzcGFyYyB8IHRhaG9lIHwgdGljMzAgfCB2YXgpIFwKLQkgICAgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWJvdXQpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIGk5NjApIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQljb2ZmKSB2YWxpZD15ZXMgOzsgXAotCWVjb2ZmKSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBtaXBzIHwgYWxwaGEpIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQllbGYpIHZhbGlkPXllcyA7OyBcCi0JZXZheCkgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgYWxwaGEpIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQlocDMwMCkgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgbTY4aykgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCXZtcykgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgdmF4KSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JZXNhYzsKLQotIyBUaGlzIGlzIGxpa2UgQ1BVX09CSl9WQUxJRCwgZm9yIHRoZSBvYmo9bXVsdGkgY2FzZS4KLQotQ1BVX01VTFRJX1ZBTElEID0gXAotCXZhbGlkPSA7IFwKLQljYXNlICQkYyBpbiBcCi0JaTM4NiB8IG1pcHMpIHZhbGlkPXllcyA7OyBcCi0JZXNhYzsKLQotIyBSZWd1bGFyIHNvdXJjZSBmaWxlcy4KLQotR0FTX0NGSUxFUyA9IFwKLQlhcHAuYyBcCi0JYXMuYyBcCi0JYXRvZi1nZW5lcmljLmMgXAotCWJpZ251bS1jb3B5LmMgXAotCWNvbmQuYyBcCi0JZGVwZW5kLmMgXAotCWVjb2ZmLmMgXAotCWVob3B0LmMgXAotCWV4cHIuYyBcCi0JZmxvbnVtLWNvcHkuYyBcCi0JZmxvbnVtLWtvbnN0LmMgXAotCWZsb251bS1tdWx0LmMgXAotCWZyYWdzLmMgXAotCWhhc2guYyBcCi0JaW5wdXQtZmlsZS5jIFwKLQlpbnB1dC1zY3J1Yi5jIFwKLQlsaXN0aW5nLmMgXAotCWxpdGVyYWwuYyBcCi0JbWFjcm8uYyBcCi0JbWVzc2FnZXMuYyBcCi0Jb3V0cHV0LWZpbGUuYyBcCi0JcmVhZC5jIFwKLQlzYi5jIFwKLQlzdGFicy5jIFwKLQlzdWJzZWdzLmMgXAotCXN5bWJvbHMuYyBcCi0Jd3JpdGUuYwotCi1DRklMRVMgPSAkKEdBU19DRklMRVMpIGdhc3AuYyBpdGJsLW9wcy5jCi0KLUhGSUxFUyA9IFwKLQlhcy5oIFwKLQlhc2ludGwuaCBcCi0JYmlnbnVtLmggXAotCWJpdF9maXguaCBcCi0JY2dlbi5oIFwKLQllY29mZi5oIFwKLQllbXVsLXRhcmdldC5oIFwKLQllbXVsLmggXAotCWV4cHIuaCBcCi0JZmxvbnVtLmggXAotCWZyYWdzLmggXAotCWhhc2guaCBcCi0JaW5wdXQtZmlsZS5oIFwKLQlpdGJsLW9wcy5oIFwKLQlsaXN0aW5nLmggXAotCW1hY3JvLmggXAotCW9iai5oIFwKLQlvdXRwdXQtZmlsZS5oIFwKLQlyZWFkLmggXAotCXNiLmggXAotCXN0cnVjLXN5bWJvbC5oIFwKLQlzdWJzZWdzLmggXAotCXN5bWJvbHMuaCBcCi0JdGMuaCBcCi0Jd3JpdGUuaAotCi0jIENQVSBmaWxlcyBpbiBjb25maWcuCi0KLVRBUkdFVF9DUFVfQ0ZJTEVTID0gXAotCWNvbmZpZy90Yy1hMjlrLmMgXAotCWNvbmZpZy90Yy1hbHBoYS5jIFwKLQljb25maWcvdGMtYXJjLmMgXAotCWNvbmZpZy90Yy1hcm0uYyBcCi0JY29uZmlnL3RjLWQxMHYuYyBcCi0JY29uZmlnL3RjLWQzMHYuYyBcCi0JY29uZmlnL3RjLWg4MzAwLmMgXAotCWNvbmZpZy90Yy1oODUwMC5jIFwKLQljb25maWcvdGMtaHBwYS5jIFwKLQljb25maWcvdGMtaTM4Ni5jIFwKLQljb25maWcvdGMtaTg2MC5jIFwKLQljb25maWcvdGMtaTk2MC5jIFwKLQljb25maWcvdGMtbTMyci5jIFwKLQljb25maWcvdGMtbTY4ay5jIFwKLQljb25maWcvdGMtbTg4ay5jIFwKLQljb25maWcvdGMtbWNvcmUuYyBcCi0JY29uZmlnL3RjLW1pcHMuYyBcCi0JY29uZmlnL3RjLW1uMTAyMDAuYyBcCi0JY29uZmlnL3RjLW1uMTAzMDAuYyBcCi0JY29uZmlnL3RjLW5zMzJrLmMgXAotCWNvbmZpZy90Yy1wcGMuYyBcCi0JY29uZmlnL3RjLXNoLmMgXAotCWNvbmZpZy90Yy1zcGFyYy5jIFwKLQljb25maWcvdGMtdGFob2UuYyBcCi0JY29uZmlnL3RjLXRpYzMwLmMgXAotCWNvbmZpZy90Yy10aWM4MC5jIFwKLQljb25maWcvdGMtdmF4LmMgXAotCWNvbmZpZy90Yy13NjUuYyBcCi0JY29uZmlnL3RjLXY4NTAuYyBcCi0JY29uZmlnL3RjLXo4ay5jCi0KLVRBUkdFVF9DUFVfSEZJTEVTID0gXAotCWNvbmZpZy90Yy1hMjlrLmggXAotCWNvbmZpZy90Yy1hbHBoYS5oIFwKLQljb25maWcvdGMtYXJjLmggXAotCWNvbmZpZy90Yy1hcm0uaCBcCi0JY29uZmlnL3RjLWQxMHYuaCBcCi0JY29uZmlnL3RjLWQzMHYuaCBcCi0JY29uZmlnL3RjLWg4MzAwLmggXAotCWNvbmZpZy90Yy1oODUwMC5oIFwKLQljb25maWcvdGMtaHBwYS5oIFwKLQljb25maWcvdGMtaTM4Ni5oIFwKLQljb25maWcvdGMtaTg2MC5oIFwKLQljb25maWcvdGMtaTk2MC5oIFwKLQljb25maWcvdGMtbTMyci5oIFwKLQljb25maWcvdGMtbTY4ay5oIFwKLQljb25maWcvdGMtbTg4ay5oIFwKLQljb25maWcvdGMtbWNvcmUuaCBcCi0JY29uZmlnL3RjLW1pcHMuaCBcCi0JY29uZmlnL3RjLW1uMTAyMDAuaCBcCi0JY29uZmlnL3RjLW1uMTAzMDAuaCBcCi0JY29uZmlnL3RjLW5zMzJrLmggXAotCWNvbmZpZy90Yy1wcGMuaCBcCi0JY29uZmlnL3RjLXNoLmggXAotCWNvbmZpZy90Yy1zcGFyYy5oIFwKLQljb25maWcvdGMtdGFob2UuaCBcCi0JY29uZmlnL3RjLXRpYzMwLmggXAotCWNvbmZpZy90Yy10aWM4MC5oIFwKLQljb25maWcvdGMtdmF4LmggXAotCWNvbmZpZy90Yy13NjUuaCBcCi0JY29uZmlnL3RjLXY4NTAuaCBcCi0JY29uZmlnL3RjLXo4ay5oCi0KLSMgT0JKIGZpbGVzIGluIGNvbmZpZwotCi1PQkpfRk9STUFUX0NGSUxFUyA9IFwKLQljb25maWcvb2JqLWFvdXQuYyBcCi0JY29uZmlnL29iai1ib3V0LmMgXAotCWNvbmZpZy9vYmotY29mZi5jIFwKLQljb25maWcvb2JqLWVjb2ZmLmMgXAotCWNvbmZpZy9vYmotZWxmLmMgXAotCWNvbmZpZy9vYmotZXZheC5jIFwKLQljb25maWcvb2JqLWhwMzAwLmMgXAotCWNvbmZpZy9vYmotaWVlZS5jIFwKLQljb25maWcvb2JqLXNvbS5jIFwKLQljb25maWcvb2JqLXZtcy5jCi0KLU9CSl9GT1JNQVRfSEZJTEVTID0gXAotCWNvbmZpZy9vYmotYW91dC5oIFwKLQljb25maWcvb2JqLWJvdXQuaCBcCi0JY29uZmlnL29iai1jb2ZmLmggXAotCWNvbmZpZy9vYmotZWNvZmYuaCBcCi0JY29uZmlnL29iai1lbGYuaCBcCi0JY29uZmlnL29iai1ldmF4LmggXAotCWNvbmZpZy9vYmotaHAzMDAuaCBcCi0JY29uZmlnL29iai1pZWVlLmggXAotCWNvbmZpZy9vYmotc29tLmggXAotCWNvbmZpZy9vYmotdm1zLmgKLQotIyBFbXVsYXRpb24gaGVhZGVyIGZpbGVzIGluIGNvbmZpZwotCi1UQVJHX0VOVl9IRklMRVMgPSBcCi0JY29uZmlnL3RlLTM4NmJzZC5oIFwKLQljb25maWcvdGUtYXV4LmggXAotCWNvbmZpZy90ZS1kZWx0YS5oIFwKLQljb25maWcvdGUtZGVsdDg4LmggXAotCWNvbmZpZy90ZS1kcHgyLmggXAotCWNvbmZpZy90ZS1keW5peC5oIFwKLQljb25maWcvdGUtZ2VuZXJpYy5oIFwKLQljb25maWcvdGUtZ28zMi5oIFwKLQljb25maWcvdGUtaHAzMDAuaCBcCi0JY29uZmlnL3RlLWhwcGEuaCBcCi0JY29uZmlnL3RlLWkzODZhaXguaCBcCi0JY29uZmlnL3RlLWljOTYwLmggXAotCWNvbmZpZy90ZS1saW51eC5oIFwKLQljb25maWcvdGUtbG5ld3MuaCBcCi0JY29uZmlnL3RlLWx5bnguaCBcCi0JY29uZmlnL3RlLW1hY2guaCBcCi0JY29uZmlnL3RlLW1hY29zLmggXAotCWNvbmZpZy90ZS1tdWx0aS5oIFwKLQljb25maWcvdGUtbmJzZC5oIFwKLQljb25maWcvdGUtbmJzZDUzMi5oIFwKLQljb25maWcvdGUtcGM1MzJtYWNoLmggXAotCWNvbmZpZy90ZS1wZS5oIFwKLQljb25maWcvdGUtcHBjbncuaCBcCi0JY29uZmlnL3RlLXBzb3MuaCBcCi0JY29uZmlnL3RlLXJpc2NpeC5oIFwKLQljb25maWcvdGUtc3BhcmNhb3V0LmggXAotCWNvbmZpZy90ZS1zdW4zLmggXAotCWNvbmZpZy90ZS1zdnI0LmggXAotCWNvbmZpZy90ZS1zeXN2MzIuaAotCi0jIE11bHRpIGZpbGVzIGluIGNvbmZpZwotCi1NVUxUSV9DRklMRVMgPSBcCi0JY29uZmlnL2UtaTM4NmNvZmYuYyBcCi0JY29uZmlnL2UtaTM4NmVsZi5jIFwKLQljb25maWcvZS1taXBzZWNvZmYuYyBcCi0JY29uZmlnL2UtbWlwc2VsZi5jCi0KLUNPTkZJR19PQkpTID0gXAotCSQoVEFSR19DUFVfTykgXAotCSQoT0JKX0ZPUk1BVF9PKSBcCi0JJChBVE9GX1RBUkdfTykgXAotCSQoZXh0cmFfb2JqZWN0cykKLQotR0VORVJJQ19PQkpTID0gXAotCWFwcC5vIFwKLQlhcy5vIFwKLQlhdG9mLWdlbmVyaWMubyBcCi0JYmlnbnVtLWNvcHkubyBcCi0JY29uZC5vIFwKLQlkZXBlbmQubyBcCi0JZWhvcHQubyBcCi0JZXhwci5vIFwKLQlmbG9udW0ta29uc3QubyBcCi0JZmxvbnVtLWNvcHkubyBcCi0JZmxvbnVtLW11bHQubyBcCi0JZnJhZ3MubyBcCi0JaGFzaC5vIFwKLQlpbnB1dC1maWxlLm8gXAotCWlucHV0LXNjcnViLm8gXAotCWxpdGVyYWwubyBcCi0JbWVzc2FnZXMubyBcCi0Jb3V0cHV0LWZpbGUubyBcCi0JcmVhZC5vIFwKLQlzdWJzZWdzLm8gXAotCXN5bWJvbHMubyBcCi0Jd3JpdGUubyBcCi0JbGlzdGluZy5vIFwKLQllY29mZi5vIFwKLQlzdGFicy5vIFwKLQlzYi5vIFwKLQltYWNyby5vCi0KLU9CSlMgPSAkKENPTkZJR19PQkpTKSAkKEdFTkVSSUNfT0JKUykKLQotUE9URklMRVMgPSAkKE1VTFRJX0NGSUxFUykgJChUQVJHRVRfRU5WX0hGSUxFUykgJChPQkpfRk9STUFUX0hGSUxFUykgXAotCSQoT0JKX0ZPUk1BVF9DRklMRVMpICQoVEFSR0VUX0NQVV9IRklMRVMpICQoVEFSR0VUX0NQVV9DRklMRVMpIFwKLQkkKEhGSUxFUykgJChDRklMRVMpICQoR0FTX0NGSUxFUykKLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLW5vaW5zdF9QUk9HUkFNUyA9IGFzLW5ldyBnYXNwLW5ldwotbm9pbnN0X1NDUklQVFMgPSAuZ2RiaW5pdAotCi0kKHNyY2RpcikvbWFrZS1nYXMuY29tOiBzdGFtcC1tay5jb20KLXN0YW1wLW1rLmNvbTogdm1zY29uZi5zaCBNYWtlZmlsZQotCXNoICQoc3JjZGlyKS92bXNjb25mLnNoICQoR0VORVJJQ19PQkpTKSA+IG5ldy1tYWtlLmNvbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBuZXctbWFrZS5jb20gJChzcmNkaXIpL21ha2UtZ2FzLmNvbQotCXRvdWNoIHN0YW1wLW1rLmNvbQotCi1FWFRSQV9ESVNUID0gbWFrZS1nYXMuY29tCi0KLURJU1RTVFVGRiA9IG1ha2UtZ2FzLmNvbSBtNjhrLXBhcnNlLmMgaXRibC1wYXJzZS5jIGl0YmwtcGFyc2UuaCBpdGJsLWxleC5jCi1kaXN0c3R1ZmY6ICQoRElTVFNUVUZGKSBpbmZvCi0KLURJU1RDTEVBTkZJTEVTID0gdGFyZy1jcHUuaCBvYmotZm9ybWF0LmggdGFyZy1lbnYuaCBpdGJsLWNwdS5oIGNnZW4tZGVzYy5oCi0KLSMgTm93IGZpZ3VyZSBvdXQgZnJvbSB0aG9zZSB2YXJpYWJsZXMgaG93IHRvIGNvbXBpbGUgYW5kIGxpbmsuCi0KLUJBU0VESVIgPSAkKHNyY2RpcikvLi4KLUJGRERJUiA9ICQoQkFTRURJUikvYmZkCi1JTkNESVIgPSAkKEJBU0VESVIpL2luY2x1ZGUKLQotIyBUaGlzIGlzIHRoZSB2YXJpYWJsZSBhY3R1YWxseSB1c2VkIHdoZW4gd2UgY29tcGlsZS4KLSMgU3BlY2lmeSB0aGUgZGlyZWN0b3JpZXMgdG8gYmUgc2VhcmNoZWQgZm9yIGhlYWRlciBmaWxlcy4KLSMgQm90aCAuIGFuZCBzcmNkaXIgYXJlIHVzZWQsIGluIHRoYXQgb3JkZXIsCi0jIHNvIHRoYXQgdG0uaCBhbmQgY29uZmlnLmggd2lsbCBiZSBmb3VuZCBpbiB0aGUgY29tcGlsYXRpb24KLSMgc3ViZGlyZWN0b3J5IHJhdGhlciB0aGFuIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoc3JjZGlyKS9jb25maWcgLUkkKElOQ0RJUikgLUkkKHNyY2RpcikvLi4gLUkkKEJGRERJUikgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi0jIFRoaXMgc2hvdWxkIGJlIHBhcmFsbGVsIHRvIElOQ0xVREVTLCBidXQgc2hvdWxkIHJlcGxhY2UgJChzcmNkaXIpCi0jIHdpdGggJCR7c3JjZGlyfSwgYW5kIHNob3VsZCB3b3JrIGluIGEgc3ViZGlyZWN0b3J5LiAgVGhpcyBpcyB1c2VkCi0jIHdoZW4gYnVpbGRpbmcgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHRoZSBkZXBlbmRlbmN5IGJ1aWxkaW5nIGlzIGRvbmUKLSMgaW4gYSBzdWJkaXJlY3RvcnkuCi1ERVBfSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkIC1JJCR7c3JjZGlyfS9jb25maWcgLUkkJHtzcmNkaXJ9Ly4uL2luY2x1ZGUgLUkkJHtzcmNkaXJ9Ly4uIC1JJCR7c3JjZGlyfS8uLi9iZmQgLUkkJHtzcmNkaXJ9Ly4uL2ludGwgLUkuLi8uLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotIyBIb3cgdG8gbGluayB3aXRoIGJvdGggb3VyIHNwZWNpYWwgbGlicmFyeSBmYWNpbGl0aWVzCi0jIGFuZCB0aGUgc3lzdGVtJ3MgaW5zdGFsbGVkIGxpYnJhcmllcy4KLQotR0FTTElCUyA9IEBPUENPREVTX0xJQkAgQEJGRExJQkAgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi0KLSMgRmlsZXMgdG8gYmUgY29waWVkIGF3YXkgYWZ0ZXIgZWFjaCBzdGFnZSBpbiBidWlsZGluZy4KLVNUQUdFU1RVRkYgPSAqLm8gJChub2luc3RfUFJPR1JBTVMpCi0KLSQoT0JKUyk6IEBBTExfT0JKX0RFUFNACi0KLWFzX25ld19TT1VSQ0VTID0gJChHQVNfQ0ZJTEVTKQotYXNfbmV3X0xEQUREID0gJChUQVJHX0NQVV9PKSAkKE9CSl9GT1JNQVRfTykgJChBVE9GX1RBUkdfTykgXAotCSQoZXh0cmFfb2JqZWN0cykgJChHQVNMSUJTKSAkKElOVExMSUJTKQotYXNfbmV3X0RFUEVOREVOQ0lFUyA9ICQoVEFSR19DUFVfTykgJChPQkpfRk9STUFUX08pICQoQVRPRl9UQVJHX08pIFwKLQkkKGV4dHJhX29iamVjdHMpICQoR0FTTElCUykgJChJTlRMREVQUykKLQotIyBTdHVmZiB0aGF0IGV2ZXJ5IG9iamVjdCBmaWxlIGRlcGVuZHMgdXBvbi4gIElmIGFueXRoaW5nIGlzIHJlbW92ZWQKLSMgZnJvbSB0aGlzIGxpc3QsIHJlbW92ZSBpdCBmcm9tIGRlcC1pbi5zZWQgYXMgd2VsbC4KLSQoT0JKUyk6IGNvbmZpZy5oIGFzLmggJChUQVJHX0VOVl9IKSAkKE9CSl9GT1JNQVRfSCkgJChUQVJHX0NQVV9IKSBmbG9udW0uaCBcCi0JZXhwci5oIHN0cnVjLXN5bWJvbC5oIHdyaXRlLmggZnJhZ3MuaCBoYXNoLmggcmVhZC5oIHN5bWJvbHMuaCB0Yy5oIFwKLQlvYmouaCBsaXN0aW5nLmggYmlnbnVtLmggYml0X2ZpeC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBhc2ludGwuaAotCi1nYXNwX25ld19TT1VSQ0VTID0gZ2FzcC5jIG1hY3JvLmMgc2IuYyBoYXNoLmMKLWdhc3BfbmV3X0xEQUREID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTExJQlMpCi1nYXNwX25ld19ERVBFTkRFTkNJRVMgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMREVQUykKLQotRVhQRUNUID0gYGlmIFsgLWYgJCR7cm9vdG1lfS8uLi9leHBlY3QvZXhwZWN0IF0gOyB0aGVuIFwKLSAgICAgICAgICBlY2hvICQke3Jvb3RtZX0vLi4vZXhwZWN0L2V4cGVjdCA7IFwKLSAgICAgICAgICBlbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi0KLVJVTlRFU1QgPSBgaWYgWyAtZiAkJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCBdIDsgdGhlbiBcCi0JCWVjaG8gJCR7c3JjZGlyfS8uLi9kZWphZ251L3J1bnRlc3QgOyBlbHNlIGVjaG8gcnVudGVzdDsgXAotCSAgIGZpYAotUlVOVEVTVEZMQUdTPQotCi1jaGVjay1ERUpBR05VOiBzaXRlLmV4cAotCWlmIFsgLWQgdGVzdHN1aXRlIF07IHRoZW4gXAotCSAgdHJ1ZTsgXAotCWVsc2UgXAotCSAgbWtkaXIgdGVzdHN1aXRlOyBcCi0JZmkKLQlybSAtZiB0ZXN0c3VpdGUvc2l0ZS5leHAKLQljcCBzaXRlLmV4cCB0ZXN0c3VpdGUvc2l0ZS5leHAKLQlyb290bWU9YHB3ZGA7IGV4cG9ydCByb290bWU7IFwKLQlzcmNkaXI9YGNkICR7c3JjZGlyfTsgcHdkYCA7IGV4cG9ydCBzcmNkaXIgOyBcCi0JRVhQRUNUPSR7RVhQRUNUfSA7IGV4cG9ydCBFWFBFQ1QgOyBcCi0JaWYgWyAtZiAkKHRvcF9idWlsZGRpcikvLi4vZXhwZWN0L2V4cGVjdCBdOyB0aGVuIFwKLQkgIFRDTF9MSUJSQVJZPWBjZCAkKHRvcF9zcmNkaXIpLy4uL3RjbC9saWJyYXJ5ICYmIHB3ZGA7IFwKLQkgIGV4cG9ydCBUQ0xfTElCUkFSWTsgXAotCWZpOyBcCi0JcnVudGVzdD0kKFJVTlRFU1QpOyBcCi0JY2QgdGVzdHN1aXRlOyBcCi0JaWYgJChTSEVMTCkgLWMgIiQkcnVudGVzdCAtLXZlcnNpb24iID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgJCRydW50ZXN0IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHtzcmNkaXJ9L3Rlc3RzdWl0ZSBcCi0JCSQoUlVOVEVTVEZMQUdTKTsgXAotCWVsc2UgZWNobyAiV0FSTklORzogY291bGQgbm90IGZpbmQgXGBydW50ZXN0JyIgMT4mMjsgOjtcCi0JZmkKLQotIyBUaGUgaW1wbGljaXQgLmMubyBydWxlIGRvZXNuJ3Qgd29yayBmb3IgdGhlc2UsIHBlcmhhcHMgYmVjYXVzZSBvZgotIyB0aGUgdmFyaWFibGVzLCBvciBwZXJoYXBzIGJlY2F1c2UgdGhlIHNvdXJjZXMgYXJlIG5vdCBvbiB2cGF0aC4KLSQoVEFSR19DUFVfTyk6ICQoVEFSR19DUFVfQykgJChUQVJHX0NQVV9ERVBfQHRhcmdldF9jcHVfdHlwZUApCi0JJChDT01QSUxFKSAtYyAkKFRBUkdfQ1BVX0MpCi0kKEFUT0ZfVEFSR19PKTogJChBVE9GX1RBUkdfQykKLQkkKENPTVBJTEUpIC1jICQoQVRPRl9UQVJHX0MpCi0KLSMgZWNvZmYuYyBvbmx5IGhhcyBmdWxsIGRlcGVuZGVuY2llcyB3aGVuIEVDT0ZGX0RFQlVHR0lORyBpcyBkZWZpbmVkLAotIyBzbyB0aGUgYXV0b21hdGljIGRlcGVuZGVuY3kgc3R1ZmYgZG9lc24ndCB3b3JrLgotZWNvZmYubyA6IGVjb2ZmLmMgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIFwKLQkkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggXAotCSQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmgKLQotIyBXZSBuZWVkIGFsbCB0aGVzZSBleHBsaWNpdCBydWxlcyBmb3IgdGhlIG11bHRpIHN0dWZmLiAgQmVjYXVzZSBvZgotIyB0aGVzZSBydWxlcywgd2UgZG9uJ3QgbmVlZCBvbmUgZm9yIE9CSl9GT1JNQVRfTy4KLQotb2JqLWFvdXQubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5jCi1vYmotYm91dC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmMKLW9iai1jb2ZmLm86ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5jCi1vYmotZWNvZmYubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmMKLW9iai1lbGYubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuYwotb2JqLWV2YXgubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5jCi1vYmotaHAzMDAubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmMKLW9iai1pZWVlLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1pZWVlLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWllZWUuYwotb2JqLW11bHRpLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1tdWx0aS5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1tdWx0aS5jCi1vYmotc29tLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1zb20uYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotc29tLmMKLW9iai12bXMubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai12bXMuYwotCi1lLW1pcHNlbGYubyA6ICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWxmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWxmLmMKLWUtbWlwc2Vjb2ZmLm8gOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2Vjb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWNvZmYuYwotZS1pMzg2Y29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLWkzODZjb2ZmLmMKLWUtaTM4NmVsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jCi0KLSMgVGhlIG02OGsgb3BlcmFuZCBwYXJzZXIuCi0KLUVYVFJBX2FzX25ld19TT1VSQ0VTID0gY29uZmlnL202OGstcGFyc2UueQotCi0jIElmIG02OGstcGFyc2UueSBpcyBpbiBhIGRpZmZlcmVudCBkaXJlY3RvcnksIHRoZW4geWx3cmFwIHdpbGwgdXNlIGFuCi0jIGFic29sdXRlIHBhdGggd2hlbiBpdCBpbnZva2VzIHlhY2MsIHdoaWNoIHdpbGwgY2F1c2UgeWFjYyB0byBwdXQgdGhlCi0jIGFic29sdXRlIHBhdGggaW50byB0aGUgZ2VuZXJhdGVkIGZpbGUuICBUaGF0J3MgYSBwYWluIHdoZW4gaXQgY29tZXMKLSMgdG8gZ2VuZXJhdGluZyBzbmFwc2hvdHMsIGJlY2F1c2UgaXQgaW50cm9kdWNlcyBzcHVyaW91cyBkaWZmcy4KLSMgU2luY2Ugd2hlbiB3ZSBtYWtlIHRoZSBzbmFwc2hvdHMgJChzcmNkaXIpID0gIi4iLCB3ZSBjaGVjayBmb3IgdGhhdAotIyBjYXNlIGFuZCBoYW5kbGUgaXQgZGlmZmVyZW50bHkuICBUaGlzIG1lYW5zIHRoYXQgYW55Ym9keSB3aG8KLSMgY29uZmlndXJlcyB3aXRoICQoc3JjZGlyKSA9ICIuIiB3aWxsIGhhdmUgdG8gc2V0IHRoZWlyIHBhdGggaW4gdGhlCi0jIGRlYnVnZ2VyIGlmIHRoZXkgd2FudCB0byBkZWJ1ZyBtNjhrLXBhcnNlLnkuICBUaGlzIGlzIGJhZCwgYnV0IG9uCi0jIHRoZSBvdGhlciBoYW5kIGl0J3MgZ29vZCB0aGF0IHBlb3BsZSB3aG8gdXNlIHRoZSBwcmVidWlsdAotIyBtNjhrLXBhcnNlLmMgZG9uJ3QgZ2V0IGEgc3B1cmlvdXMgYWJzb2x1dGUgcGF0aC4KLW02OGstcGFyc2UuYzogJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLnkKLQlmPSQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS55OyBcCi0JaWYgWyAkJGYgPSAiLi9jb25maWcvbTY4ay1wYXJzZS55IiBdOyB0aGVuIFwKLQkgIGxuIC1zIGNvbmZpZy9tNjhrLXBhcnNlLnkgLiA+IC9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8fCBcCi0JICAgbG4gY29uZmlnL202OGstcGFyc2UueSAuID4gL2Rldi9udWxsIDI+L2Rldi9udWxsIHx8IFwKLQkgICBjcCBjb25maWcvbTY4ay1wYXJzZS55IC4gPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgXAotCSAgZj1tNjhrLXBhcnNlLnk7IFwKLQllbHNlIHRydWU7IGZpOyBcCi0JJChTSEVMTCkgJChZTFdSQVApICIkKFlBQ0MpIiAkJGYgeS50YWIuYyBtNjhrLXBhcnNlLmMgLS07IFwKLQlpZiBbICQkZiA9ICJtNjhrLXBhcnNlLnkiIF07IHRoZW4gXAotCSAgcm0gLWYgbTY4ay1wYXJzZS55OyBcCi0JZWxzZSB0cnVlOyBmaQotbTY4ay1wYXJzZS5vOiBtNjhrLXBhcnNlLmMgJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgKLQotIyBEb24ndCBsZXQgdGhlIC55LmggcnVsZSBjbG9iYmVyIG02OGstcGFyc2UuaC4KLW02OGstcGFyc2UuaDogOyBAdHJ1ZQotJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmg6IDsgQHRydWUKLQotIyBUaGUgaW5zdHJ1Y3Rpb24gdGFibGUgc3BlY2lmaWNhdGlvbiBsZXhpY2FsIGFuYWx5emVyIGFuZCBwYXJzZXIuCi0KLWl0YmwtbGV4LmM6ICQoc3JjZGlyKS9pdGJsLWxleC5sCi1pdGJsLWxleC5vOiBpdGJsLWxleC5jIGl0YmwtcGFyc2UuaAotCi1pdGJsLXBhcnNlLm86IGl0YmwtcGFyc2UuYyBpdGJsLXBhcnNlLmggJChzcmNkaXIpL2l0Ymwtb3BzLmgKLQotaXRibC1vcHMubzogJChzcmNkaXIpL2l0Ymwtb3BzLmMgJChzcmNkaXIpL2l0Ymwtb3BzLmggaXRibC1wYXJzZS5oCi0KLWl0YmwtcGFyc2UuYyBpdGJsLXBhcnNlLmg6ICQoc3JjZGlyKS9pdGJsLXBhcnNlLnkKLQkkKFNIRUxMKSAkKFlMV1JBUCkgIiQoWUFDQykiICQoc3JjZGlyKS9pdGJsLXBhcnNlLnkgeS50YWIuYyBpdGJsLXBhcnNlLmMgeS50YWIuaCBpdGJsLXBhcnNlLmggLS0gLWQKLQotIyBzdGFuZC1hbG9uZSBpdGJsIGFzc2VtYmxlciAmIGRpc2Fzc2VtYmxlcgotCi1FWFRSQV9QUk9HUkFNUyA9IGl0YmwtdGVzdAotaXRibF90ZXN0X1NPVVJDRVMgPSBpdGJsLXBhcnNlLnkgaXRibC1sZXgubAotaXRibF90ZXN0X0xEQUREID0gaXRibC10ZXN0LW9wcy5vIGl0YmwtdGVzdC5vICQoR0FTTElCUykgQExFWExJQkAKLQotaXRibC10ZXN0LW9wcy5vOiAkKHNyY2RpcikvaXRibC1vcHMuYyAkKHNyY2RpcikvaXRibC1vcHMuaCBpdGJsLXBhcnNlLmgKLQkkKENPTVBJTEUpIC1vIGl0YmwtdGVzdC1vcHMubyAtRFNUQU5EX0FMT05FIC1jICQoc3JjZGlyKS9pdGJsLW9wcy5jCi0KLWl0YmwtdGVzdC5vOiAkKHNyY2RpcikvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC10ZXN0LmMgJChzcmNkaXIpL2l0Ymwtb3BzLmgKLQkkKENPTVBJTEUpIC1jIC1EU1RBTkRfQUxPTkUgJChzcmNkaXIpL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jCi0KLSMgQ0dFTiBpbnRlcmZhY2UuCi0KLUNHRU5fQ1BVX1BSRUZJWCA9IEBjZ2VuX2NwdV9wcmVmaXhACi0KLWNnZW4ubzogY2dlbi5jIGNnZW4uaCBjZ2VuLWRlc2MuaCBzdWJzZWdzLmggXAotCSQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotCSQoc3JjZGlyKS8uLi9vcGNvZGVzLyQoQ0dFTl9DUFVfUFJFRklYKS1kZXNjLmggXAotCSQoc3JjZGlyKS8uLi9vcGNvZGVzLyQoQ0dFTl9DUFVfUFJFRklYKS1vcGMuaAotCi0jIFJlbWFrZSB0aGUgaW5mbyBmaWxlcy4KLQotTU9TVExZQ0xFQU5GSUxFUyA9ICQoU1RBR0VTVFVGRikgY29yZSBzdGFtcC1tay5jb20gXAotCXRlc3RzdWl0ZS8qLm8gdGVzdHN1aXRlLyoub3V0IHRlc3RzdWl0ZS9nYXMubG9nIHRlc3RzdWl0ZS9nYXMuc3VtIFwKLQl0ZXN0c3VpdGUvc2l0ZS5leHAgc2l0ZS5iYWsgc2l0ZS5leHAgc3RhZ2Ugc3RhZ2UxIHN0YWdlMgotCi1DTEVBTkZJTEVTID0gZGVwLnNlZCAudGNkZXAgLm9iamRlcCAuZGVwMiAuZGVwMSAuZGVwYSAuZGVwIC5kZXBkaXIKLQotLlBIT05ZOiBpbnN0YWxsLWV4ZWMtbG9jYWwgaW5zdGFsbC1kYXRhLWxvY2FsCi0uUEhPTlk6IGluc3RhbGwtZXhlYy1iaW5kaXIgaW5zdGFsbC1leGVjLXRvb2xkaXIKLQotaW5zdGFsbC1leGVjLWxvY2FsOiBpbnN0YWxsLWV4ZWMtYmluZGlyIEBpbnN0YWxsX3Rvb2xkaXJACi0KLWluc3RhbGwtZXhlYy1iaW5kaXI6ICQobm9pbnN0X1BST0dSQU1TKQotCSQobWtpbnN0YWxsZGlycykgJChiaW5kaXIpCi0JQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0KLWluc3RhbGwtZXhlYy10b29sZGlyOiAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKG1raW5zdGFsbGRpcnMpICQodG9vbGRpcikvYmluCi0Jbj1gZWNobyBhcyB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2A7IFwKLQlpZiBbICIkKGJpbmRpcikvJCRuJChFWEVFWFQpIiAhPSAiJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCkiIF07IHRoZW4gXAotCSAgcm0gLWYgJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCk7IFwKLQkgIGxuICQoYmluZGlyKS8kJG4kKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCkgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCBcCi0JICAgIHx8ICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pIGFzLW5ldyQoRVhFRVhUKSAkKHRvb2xkaXIpL2Jpbi9hcyQoRVhFRVhUKTsgXAotCWVsc2UgXAotCSAgdHJ1ZSA7IFwKLQlmaQotCi0jIFRoZXNlIGV4aXN0IGZvciBtYWludGVuYW5jZSBwdXJwb3Nlcy4KLQotLlBIT05ZOiBib290c3RyYXAgYm9vdHN0cmFwMiBib290c3RyYXAzIHN0YWdlMSBzdGFnZTIgc3RhZ2UzIGNvbXBhcmlzb24KLQotYm9vdHN0cmFwOiBhcy1uZXcKLQkkKE1BS0UpIHN0YWdlMQotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMSBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgc3RhZ2UyCi0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCi0KLWJvb3RzdHJhcDI6Ci0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UxIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBzdGFnZTIKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTIgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIGNvbXBhcmlzb24gYWdhaW5zdD1zdGFnZTIKLQotYm9vdHN0cmFwMzoKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTIgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIGNvbXBhcmlzb24gYWdhaW5zdD1zdGFnZTIKLQotIyBDb3B5IHRoZSBvYmplY3QgZmlsZXMgZnJvbSBhIHBhcnRpY3VsYXIgc3RhZ2UgaW50byBhIHN1YmRpcmVjdG9yeS4KLXN0YWdlMToKLQktbWtkaXIgc3RhZ2UxCi0JLW12ICQoU1RBR0VTVFVGRikgc3RhZ2UxCi0JaWYgWyAtZiBzdGFnZTEvYXMtbmV3JChFWEVFWFQpIC1hICEgLWYgc3RhZ2UxL2FzJChFWEVFWFQpIF0gOyB0aGVuIChjZCBzdGFnZTEgOyBsbiAtcyBhcy1uZXckKEVYRUVYVCkgYXMkKEVYRUVYVCkpIDsgZmkKLQotc3RhZ2UyOgotCS1ta2RpciBzdGFnZTIKLQktbXYgJChTVEFHRVNUVUZGKSBzdGFnZTIKLQlpZiBbIC1mIHN0YWdlMi9hcy1uZXckKEVYRUVYVCkgLWEgISAtZiBzdGFnZTIvYXMkKEVYRUVYVCkgXSA7IHRoZW4gKGNkIHN0YWdlMiA7IGxuIC1zIGFzLW5ldyQoRVhFRVhUKSBhcyQoRVhFRVhUKSkgOyBmaQotCi1zdGFnZTM6Ci0JLW1rZGlyIHN0YWdlMwotCS1tdiAkKFNUQUdFU1RVRkYpIHN0YWdlMwotCWlmIFsgLWYgc3RhZ2UzL2FzLW5ldyQoRVhFRVhUKSAtYSAhIC1mIHN0YWdlMy9hcyQoRVhFRVhUKSBdIDsgdGhlbiAoY2Qgc3RhZ2UzIDsgbG4gLXMgYXMtbmV3IGFzJChFWEVFWFQpKSA7IGZpCi0KLWFnYWluc3Q9c3RhZ2UyCi0KLSMgVGhpcyBydWxlIGlzIGRlcml2ZWQgZnJvbSBjb3JyZXNwb25kaW5nIGNvZGUgaW4gdGhlIE1ha2VmaWxlLmluIGZvciBnY2MuCi0jIFRoZSAidGFpbCArMTZjIiBpcyB0byBieXBhc3MgaGVhZGVycyB3aGljaCBtYXkgaW5jbHVkZSB0aW1lc3RhbXBzIG9yCi0jIHRlbXBvcmFyeSBhc3NlbWJseSBmaWxlIG5hbWVzLgotY29tcGFyaXNvbjoKLQl4PTAgOyBcCi0JZm9yIGZpbGUgaW4gKi5vIDsgZG8gXAotCSAgdGFpbCArMTZjIC4vJCRmaWxlID4gdG1wLWZvbzE7IFwKLQkgIGlmIHRhaWwgKzE2YyAke2FnYWluc3R9LyQkZmlsZSA+IHRtcC1mb28yIDI+L2Rldi9udWxsIDsgdGhlbiBcCi0JICAgIGlmIGNtcCB0bXAtZm9vMSB0bXAtZm9vMiA7IHRoZW4gXAotCSAgICAgIHRydWUgOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGVjaG8gJCRmaWxlIGRpZmZlcnMgOyBcCi0JICAgICAgeD0xIDsgXAotCSAgICBmaSA7IFwKLQkgIGVsc2UgdHJ1ZTsgZmkgOyBcCi0JZG9uZSA7IFwKLQlleGl0ICQkeAotCS1ybSAtZiB0bXAtZm9vKgotCi0uUEhPTlk6IGRlLXN0YWdlMSBkZS1zdGFnZTIgZGUtc3RhZ2UzCi0KLWRlLXN0YWdlMToKLQktIChjZCBzdGFnZTEgOyBybSAtZiBhcyQoRVhFRVhUKSA7IG12IC1mICogLi4pCi0JLSBybWRpciBzdGFnZTEKLQotZGUtc3RhZ2UyOgotCS0gKGNkIHN0YWdlMiA7IHJtIC1mIGFzJChFWEVFWFQpIDsgbXYgLWYgKiAuLikKLQktIHJtZGlyIHN0YWdlMgotCi1kZS1zdGFnZTM6Ci0JLSAoY2Qgc3RhZ2UzIDsgcm0gLWYgYXMkKEVYRUVYVCkgOyBtdiAtZiAqIC4uKQotCS0gcm1kaXIgc3RhZ2UzCi0KLSMgQXV0b21hdGljIGRlcGVuZGVuY3kgY29tcHV0YXRpb24uICBUaGlzIGlzIGEgcmVhbCBwYWluLCBiZWNhdXNlIHRoZQotIyBkZXBlbmRlbmNpZXMgY2hhbmdlIGJhc2VkIG9uIHRhcmdldF9jcHVfdHlwZSBhbmQgb2JqX2Zvcm1hdC4gIFdlCi0jIGN1cnJlbnRseSBpZ25vcmUgYW55IGRlcGVuZGVuY2llcyBjYXVzZWQgYnkgZW11bGF0aW9uIGZpbGVzLgotCi1ERVBfRklMRV9ERVBTID0gICQoQ0ZJTEVTKSAkKEhGSUxFUykgJChUQVJHRVRfQ1BVX0NGSUxFUykgXAotCSQoVEFSR0VUX0NQVV9IRklMRVMpICQoT0JKX0ZPUk1BVF9DRklMRVMpICQoT0JKX0ZPUk1BVF9IRklMRVMpCi0KLS5kZXA6IGRlcC5zZWQgJChERVBfRklMRV9ERVBTKSAudGNkZXAgLm9iamRlcCAuZGVwMgotCXJtIC1mIC5kZXAxCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQkkKE1BS0UpIERFUD0kKERFUCkgc3JjZGlyPSQke3NyY2Rpcn0gVlBBVEg9JCR7c3JjZGlyfSAuZGVwMQotCXJtIC1yZiAuZGVwZGlyCi0Jc2VkIC1mIGRlcC5zZWQgPCAuZGVwMSA+IC5kZXBhCi0Jc2VkIC1mIGRlcC5zZWQgPCAudGNkZXAgPj4gLmRlcGEKLQlzZWQgLWYgZGVwLnNlZCA8IC5vYmpkZXAgPj4gLmRlcGEKLQlzZWQgLWYgZGVwLnNlZCA8IC5kZXAyID4+IC5kZXBhCi0JZWNobyAnJCQoT0JKUyk6ICQkKERFUF9AdGFyZ2V0JydfY3B1X3R5cGVAX0BvYmonJ19mb3JtYXRAKScgPj4gLmRlcGEKLQllY2hvICckJChUQVJHX0NQVV9PKTogJCQoVENERVBfQHRhcmdldCcnX2NwdV90eXBlQF9Ab2JqJydfZm9ybWF0QCknID4+IC5kZXBhCi0JZWNobyAnJCQoT0JKX0ZPUk1BVF9PKTogJCQoT0JKREVQX0B0YXJnZXQnJ19jcHVfdHlwZUBfQG9iaicnX2Zvcm1hdEApJyA+PiAuZGVwYQotCWVjaG8gJyMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWScgPj4gLmRlcGEKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgLmRlcGEgLmRlcAotCi0jIFRoaXMgcnVsZSBuZWVkcyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCi0uZGVwMTogJChDRklMRVMpICQoTVVMVElfQ0ZJTEVTKQotCWlmIFsgLWQgLmRlcGRpciBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgLmRlcGRpcjsgZmkKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCWNkIC5kZXBkaXI7IFwKLQllY2hvICcnID4gdGFyZy1jcHUuaDsgXAotCWVjaG8gJycgPiBvYmotZm9ybWF0Lmg7IFwKLQllY2hvICcnID4gdGFyZy1lbnYuaDsgXAotCWVjaG8gJycgPiBpdGJsLWNwdS5oOyBcCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiAuZGVwOyBcCi0JJChERVApIC1mIC5kZXAgLURCRkRfQVNTRU1CTEVSIC1JLiAtSS4uIC1JJCR7c3JjZGlyfSAtSS4uLy4uL2JmZCAkKERFUF9JTkNMVURFUykgJD8KLQlzZWQgLWUgJy9JRiBZT1UgUFVUIEFOWVRISU5HLywkJGQnIDwgLmRlcGRpci8uZGVwID4gLmRlcDEKLQlybSAtZiAuZGVwZGlyLy5kZXAKLQotIyBXb3JrIG91dCB0aGUgc3BlY2lhbCBkZXBlbmRlbmNpZXMgZm9yIHRoZSB0Yy0qLmMgZmlsZXMuCi0udGNkZXA6ICQoVEFSR0VUX0NQVV9DRklMRVMpCi0Jcm0gLWYgLnRjZGVwYQotCWlmIFsgLWQgLmRlcGRpciBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgLmRlcGRpcjsgZmkKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCWNkIC5kZXBkaXI7IFwKLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgIGZvciBvIGluICQoT0JKX0ZPUk1BVFMpOyBkbyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiQke2N9IicuaCInID4gdGFyZy1jcHUuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvYmotJyIkJHtvfSInLmgiJyA+IG9iai1mb3JtYXQuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0ZS1nZW5lcmljLmgiJyA+IHRhcmctZW52Lmg7IFwKLQkgICAgICBlY2hvICcnID4gaXRibC1jcHUuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvcGNvZGVzLyciJCR7Y30iJy1kZXNjLmgiJyA+IGNnZW4tZGVzYy5oOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICAgIGNwICQke3NyY2Rpcn0vY29uZmlnL3RjLSQke2N9LmMgZHVtbXkuYzsgXAotCSAgICAgIGVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDsgXAotCSAgICAgICQoREVQKSAtZiAuZGVwIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpIGR1bW15LmM7IFwKLQkgICAgICBzZWQgLWUgInMvZHVtbXkubzogZHVtbXkuYy9UQ0RFUF8kJHtjfV8kJHtvfSA9LyIgXAotCQkgIC1lICcxLC9ETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSL2QnIFwKLQkJICAtZSAnL0lGIFlPVSBQVVQgQU5ZVEhJTkcvLCQkZCcgXAotCQkgIC1lICcvXiQkL2QnIDwgLmRlcCA+PiAuLi8udGNkZXBhOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCWVjaG8gJ1RDREVQX2hwcGFfc29tID0gJCQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIHN1YnNlZ3MuaCBcJyA+PiAudGNkZXBhCi0JZWNobyAnICAkJChJTkNESVIpL29ic3RhY2suaCAkJChCRkRESVIpL2xpYmhwcGEuaCBcJyA+PiAudGNkZXBhCi0JZWNobyAnICAkJChJTkNESVIpL29wY29kZS9ocHBhLmggJCQoQkZERElSKS9zb20uaCcgPj4gLnRjZGVwYQotCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICAkKENQVV9NVUxUSV9WQUxJRCkgXAotCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgbz1lY29mZjsgXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgZWNobyAnVENERVBfJyIkJHtjfSInX211bHRpID0gXCcgPj4gLnRjZGVwYTsgXAotCSAgICBlY2hvICckJChUQ0RFUF8nIiQke2N9IidfY29mZikgXCcgPj4gLnRjZGVwYTsgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyQkKFRDREVQXyciJCR7Y30iJ19lY29mZikgXCcgPj4gLnRjZGVwYTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICAgIGVjaG8gJyQkKFRDREVQXyciJCR7Y30iJ19lbGYpJyA+PiAudGNkZXBhOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCW12IC1mIC50Y2RlcGEgLnRjZGVwCi0KLSMgV29yayBvdXQgdGhlIHNwZWNpYWwgZGVwZW5kZW5jaWVzIGZvciB0aGUgb2JqLSouYyBmaWxlcy4KLS5vYmpkZXA6ICQoT0JKX0ZPUk1BVF9DRklMRVMpCi0Jcm0gLWYgLm9iamRlcGEKLQlpZiBbIC1kIC5kZXBkaXIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIC5kZXBkaXI7IGZpCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQljZCAuZGVwZGlyOyBcCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICBmb3IgbyBpbiAkKE9CSl9GT1JNQVRTKTsgZG8gXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGMtJyIkJHtjfSInLmgiJyA+IHRhcmctY3B1Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAib2JqLSciJCR7b30iJy5oIicgPiBvYmotZm9ybWF0Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGUtZ2VuZXJpYy5oIicgPiB0YXJnLWVudi5oOyBcCi0JICAgICAgZWNobyAnJyA+IGl0YmwtY3B1Lmg7IFwKLQkgICAgICBybSAtZiBkdW1teS5jOyBcCi0JICAgICAgY3AgJCR7c3JjZGlyfS9jb25maWcvb2JqLSQke299LmMgZHVtbXkuYzsgXAotCSAgICAgIGVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDsgXAotCSAgICAgICQoREVQKSAtZiAuZGVwIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpIGR1bW15LmM7IFwKLQkgICAgICBzZWQgLWUgInMvZHVtbXkubzogZHVtbXkuYy9PQkpERVBfJCR7Y31fJCR7b30gPS8iIFwKLQkJICAtZSAnMSwvRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUi9kJyBcCi0JCSAgLWUgJy9JRiBZT1UgUFVUIEFOWVRISU5HLywkJGQnIFwKLQkJICAtZSAnL14kJC9kJyA8IC5kZXAgPj4gLi4vLm9iamRlcGE7IFwKLQkgICAgICBybSAtZiBkdW1teS5jOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JZWNobyAnT0JKREVQX2hwcGFfc29tID0gJCQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5oIHN1YnNlZ3MuaCBcJyA+PiAub2JqZGVwYQotCWVjaG8gJyAgJCQoSU5DRElSKS9vYnN0YWNrLmggJCQoQkZERElSKS9saWJocHBhLmggXCcgPj4gLm9iamRlcGEKLQllY2hvICcgICQkKEJGRERJUikvc29tLmggICQkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwnID4+IC5vYmpkZXBhCi0JZWNobyAnICAkJChJTkNESVIpL2FvdXQvc3RhYi5kZWYnID4+IC5vYmpkZXBhCi0JIyBXZSBkb24ndCB0cnkgdG8gaGFuZGxlIGFsbCBtdWx0aSBjYXNlcy4KLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgICQoQ1BVX01VTFRJX1ZBTElEKSBcCi0JICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICBvPWVjb2ZmOyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBlY2hvICdPQkpERVBfJyIkJHtjfSInX211bHRpID0gXCcgPj4gLm9iamRlcGE7IFwKLQkgICAgZWNobyAnJCQoT0JKREVQXyciJCR7Y30iJ19jb2ZmKSBcJyA+PiAub2JqZGVwYTsgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyQkKE9CSkRFUF8nIiQke2N9IidfZWNvZmYpIFwnID4+IC5vYmpkZXBhOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgICAgZWNobyAnJCQoT0JKREVQXyciJCR7Y30iJ19lbGYpJyA+PiAub2JqZGVwYTsgXAotCSAgZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQltdiAtZiAub2JqZGVwYSAub2JqZGVwCi0KLSMgV29yayBvdXQgdGhlIGRlcGVuZGVuY2llcyBmb3IgZWFjaCBDUFUvT0JKIGNvbWJpbmF0aW9uLgotIyBOb3RlIHRoYXQgU09NIGlzIGEgc3BlY2lhbCBjYXNlLCBiZWNhdXNlIGl0IG9ubHkgd29ya3MgbmF0aXZlLgotLmRlcDI6ICQoVEFSR0VUX0NQVV9IRklMRVMpICQoT0JKX0ZPUk1BVF9IRklMRVMpCi0Jcm0gLWYgLmRlcDJhCi0JaWYgWyAtZCAuZGVwZGlyIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciAuZGVwZGlyOyBmaQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JY2QgLmRlcGRpcjsgXAotCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAotCSAgZm9yIG8gaW4gJChPQkpfRk9STUFUUyk7IGRvIFwKLQkgICAgJChDUFVfT0JKX1ZBTElEKSBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgInRjLSciJCR7Y30iJy5oIicgPiB0YXJnLWNwdS5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgIm9iai0nIiQke299IicuaCInID4gZHVtbXkuYzsgXAotCSAgICAgIGVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDsgXAotCSAgICAgICQoREVQKSAtZiAuZGVwIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpIGR1bW15LmM7IFwKLQkgICAgICBzZWQgLWUgInMvZHVtbXkubzogZHVtbXkuYy9ERVBfJCR7Y31fJCR7b30gPS8iIFwKLQkJICAtZSAnMSwvRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUi9kJyBcCi0JCSAgLWUgJy9JRiBZT1UgUFVUIEFOWVRISU5HLywkJGQnIFwKLQkJICAtZSAnL14kJC9kJyA8IC5kZXAgPj4gLi4vLmRlcDJhOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JZWNobyAnREVQX2hwcGFfc29tID0gJCQoQkZERElSKS9zb20uaCcgPj4gLmRlcDJhCi0JIyBXZSBkb24ndCB0cnkgdG8gaGFuZGxlIGFsbCBtdWx0aSBjYXNlcy4KLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgICQoQ1BVX01VTFRJX1ZBTElEKSBcCi0JICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICBvPWVjb2ZmOyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBlY2hvICdERVBfJyIkJHtjfSInX211bHRpID0gXCcgPj4gLmRlcDJhOyBcCi0JICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfY29mZikgXCcgPj4gLmRlcDJhOyBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnJCQoREVQXyciJCR7Y30iJ19lY29mZikgXCcgPj4gLmRlcDJhOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgICAgZWNobyAnJCQoREVQXyciJCR7Y30iJ19lbGYpJyA+PiAuZGVwMmE7IFwKLQkgIGVsc2UgdHJ1ZTsgZmk7IFwKLQlkb25lCi0JbXYgLWYgLmRlcDJhIC5kZXAyCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZCBcCi0JCS1lICJzIUBJTkNESVJAISQke3NyY2Rpcn0vLi4vaW5jbHVkZSEiIFwKLQkJLWUgInMhQEJGRERJUkAhJCR7c3JjZGlyfS8uLi9iZmQhIiBcCi0JCS1lICJzIUBTUkNESVJAISQke3NyY2Rpcn0hIgotCi1kZXA6IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmFtCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KLQotLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi0KLWFwcC5vOiBhcHAuYwotYXMubzogYXMuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBvdXRwdXQtZmlsZS5oIFwKLSAgc2IuaCBtYWNyby5oCi1hdG9mLWdlbmVyaWMubzogYXRvZi1nZW5lcmljLmMKLWJpZ251bS1jb3B5Lm86IGJpZ251bS1jb3B5LmMKLWNvbmQubzogY29uZC5jIG1hY3JvLmggc2IuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1kZXBlbmQubzogZGVwZW5kLmMKLWVjb2ZmLm86IGVjb2ZmLmMKLWVob3B0Lm86IGVob3B0LmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2VsZi9kd2FyZjIuaAotZXhwci5vOiBleHByLmMgJChJTkNESVIpL29ic3RhY2suaAotZmxvbnVtLWNvcHkubzogZmxvbnVtLWNvcHkuYwotZmxvbnVtLWtvbnN0Lm86IGZsb251bS1rb25zdC5jCi1mbG9udW0tbXVsdC5vOiBmbG9udW0tbXVsdC5jCi1mcmFncy5vOiBmcmFncy5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1oYXNoLm86IGhhc2guYwotaW5wdXQtZmlsZS5vOiBpbnB1dC1maWxlLmMgaW5wdXQtZmlsZS5oCi1pbnB1dC1zY3J1Yi5vOiBpbnB1dC1zY3J1Yi5jIGlucHV0LWZpbGUuaCBzYi5oCi1saXN0aW5nLm86IGxpc3RpbmcuYyBpbnB1dC1maWxlLmggc3Vic2Vncy5oCi1saXRlcmFsLm86IGxpdGVyYWwuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaAotbWFjcm8ubzogbWFjcm8uYyBzYi5oIG1hY3JvLmgKLW1lc3NhZ2VzLm86IG1lc3NhZ2VzLmMKLW91dHB1dC1maWxlLm86IG91dHB1dC1maWxlLmMgb3V0cHV0LWZpbGUuaAotcmVhZC5vOiByZWFkLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggc2IuaCBtYWNyby5oIFwKLSAgZWNvZmYuaAotc2Iubzogc2IuYyBzYi5oCi1zdGFicy5vOiBzdGFicy5jICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oIGVjb2ZmLmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1zdWJzZWdzLm86IHN1YnNlZ3MuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaAotc3ltYm9scy5vOiBzeW1ib2xzLmMgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLXdyaXRlLm86IHdyaXRlLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggb3V0cHV0LWZpbGUuaAotZ2FzcC5vOiBnYXNwLmMgc2IuaCBtYWNyby5oCi1lLWkzODZjb2ZmLm86ICQoc3JjZGlyKS9jb25maWcvZS1pMzg2Y29mZi5jIGVtdWwuaCBcCi0gIGVtdWwtdGFyZ2V0LmgKLWUtaTM4NmVsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jIGVtdWwuaCBlbXVsLXRhcmdldC5oCi1lLW1pcHNlY29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2Vjb2ZmLmMgZW11bC5oIFwKLSAgZW11bC10YXJnZXQuaAotZS1taXBzZWxmLm86ICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWxmLmMgZW11bC5oIGVtdWwtdGFyZ2V0LmgKLQotVENERVBfYTI5a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvYTI5ay5oCi1UQ0RFUF9hMjlrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2EyOWsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotVENERVBfYTI5a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotVENERVBfYWxwaGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL29wY29kZS9hbHBoYS5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9hdG9mLXZheC5jCi1UQ0RFUF9hbHBoYV9lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9hbHBoYS5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9hdG9mLXZheC5jCi1UQ0RFUF9hbHBoYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKHNyY2RpcikvY29uZmlnL2F0b2YtdmF4LmMKLVRDREVQX2FscGhhX2V2YXggPSAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggXAotICAkKHNyY2RpcikvY29uZmlnL2F0b2YtdmF4LmMKLVRDREVQX2FyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvYXJjLmggXAotICAkKElOQ0RJUikvZWxmL2FyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLVRDREVQX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9hcmMuaCAkKElOQ0RJUikvZWxmL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotVENERVBfYXJtX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaAotVENERVBfYXJtX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYXJtLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLVRDREVQX2FybV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1UQ0RFUF9kMTB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMTB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oIFwKLSAgJChJTkNESVIpL2VsZi9wcGMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1UQ0RFUF9kMTB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMTB2LmggJChJTkNESVIpL2VsZi9wcGMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLVRDREVQX2QzMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMzB2LmgKLVRDREVQX2QzMHZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2QzMHYuaAotVENERVBfZnIzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvc3ltY2F0LmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9mcjMwLW9wYy5oIFwKLSAgY2dlbi5oCi1UQ0RFUF9mcjMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1vcGMuaCBcCi0gIGNnZW4uaAotVENERVBfaDgzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9oODMwMC5oCi1UQ0RFUF9oODMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2g4MzAwLmgKLVRDREVQX2g4NTAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2g4NTAwLW9wYy5oCi1UQ0RFUF9oODUwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9oODUwMC1vcGMuaAotVENERVBfaHBwYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKEJGRERJUikvbGliaHBwYS5oICQoQkZERElSKS9saWJiZmQuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaHBwYS5oCi1UQ0RFUF9ocHBhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oICQoQkZERElSKS9lbGYzMi1ocHBhLmggXAotICAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKEJGRERJUikvbGliYmZkLmggJChJTkNESVIpL29wY29kZS9ocHBhLmgKLVRDREVQX2kzODZfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaTM4Ni5oCi1UQ0RFUF9pMzg2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2kzODYuaAotVENERVBfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTM4Ni5oCi1UQ0RFUF9pODYwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9pODYwLmgKLVRDREVQX2k4NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9pODYwLmgKLVRDREVQX2k4NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggJChJTkNESVIpL29wY29kZS9pODYwLmgKLVRDREVQX2k5NjBfYm91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pOTYwLmgKLVRDREVQX2k5NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTk2MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pOTYwLmgKLVRDREVQX2k5NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi1UQ0RFUF9tMzJyX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9zeW1jYXQuaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tMzJyLWRlc2MuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItb3BjLmggXAotICBjZ2VuLmgKLVRDREVQX20zMnJfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvc3ltY2F0LmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tMzJyLW9wYy5oIFwKLSAgY2dlbi5oCi1UQ0RFUF9tNjhrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAotVENERVBfbTY4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tNjhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmggJChJTkNESVIpL29wY29kZS9tNjhrLmggXAotICAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAotVENERVBfbTY4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi1UQ0RFUF9tNjhrX2hwMzAwID0gJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuaCAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggXAotICAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi1UQ0RFUF9tODhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvY29uZmlnL204OGstb3Bjb2RlLmgKLVRDREVQX204OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvY29uZmlnL204OGstb3Bjb2RlLmgKLVRDREVQX21jb3JlX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tY29yZS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL21jb3JlLW9wYy5oCi1UQ0RFUF9tY29yZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tY29yZS1vcGMuaCBcCi0gICQoSU5DRElSKS9lbGYvbWNvcmUuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1UQ0RFUF9taXBzX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBpdGJsLW9wcy5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oCi1UQ0RFUF9taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIFwKLSAgaXRibC1vcHMuaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLVRDREVQX21pcHNfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9taXBzLmggXAotICBpdGJsLW9wcy5oCi1UQ0RFUF9taXBzX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9taXBzLmggaXRibC1vcHMuaCBcCi0gICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLVRDREVQX21uMTAyMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmgKLVRDREVQX21uMTAyMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaAotVENERVBfbW4xMDMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaAotVENERVBfbW4xMDMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCi1UQ0RFUF9uczMya19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1UQ0RFUF9uczMya19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9uczMyay5oICQoSU5DRElSKS9vYnN0YWNrLmgKLVRDREVQX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1UQ0RFUF9wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oCi1UQ0RFUF9wcGNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvcHBjLmggJChJTkNESVIpL2VsZi9wcGMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLVRDREVQX3NoX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zaC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL3NoLW9wYy5oCi1UQ0RFUF9zaF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9zaC1vcGMuaAotVENERVBfc3BhcmNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmgKLVRDREVQX3NwYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zcGFyYy5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaAotVENERVBfc3BhcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oICQoSU5DRElSKS9lbGYvc3BhcmMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLVRDREVQX3RhaG9lX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3RhaG9lLmgKLVRDREVQX3RhaG9lX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdGFob2UuaAotVENERVBfdGFob2VfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3RhaG9lLmgKLVRDREVQX3RpYzMwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAotVENERVBfdGljMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCi1UQ0RFUF90aWMzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCi1UQ0RFUF90aWM4MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljODAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmgKLVRDREVQX3RpYzgwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmgKLVRDREVQX3ZheF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCi1UQ0RFUF92YXhfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCi1UQ0RFUF92YXhfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLVRDREVQX3ZheF92bXMgPSAkKHNyY2RpcikvY29uZmlnL29iai12bXMuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLVRDREVQX3c2NV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3c2NS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL3c2NS1vcGMuaAotVENERVBfdzY1X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy93NjUtb3BjLmgKLVRDREVQX3Y4NTBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92ODUwLmgKLVRDREVQX3Y4NTBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3Y4NTAuaAotVENERVBfejhrX2NvZmYgPSAkKHNyY2RpcikvLi4vb3Bjb2Rlcy96OGstb3BjLmggJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvejhrLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1UQ0RFUF96OGtfZWxmID0gJChzcmNkaXIpLy4uL29wY29kZXMvejhrLW9wYy5oICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oIFwKLSAgJChCRkRESVIpL2VsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmgKLVRDREVQX2hwcGFfc29tID0gJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9vcGNvZGUvaHBwYS5oIFwKLSAgJChCRkRESVIpL3NvbS5oCi1UQ0RFUF9pMzg2X211bHRpID0gJChUQ0RFUF9pMzg2X2NvZmYpICQoVENERVBfaTM4Nl9lbGYpCi1UQ0RFUF9taXBzX211bHRpID0gJChUQ0RFUF9taXBzX2NvZmYpICQoVENERVBfbWlwc19lY29mZikgXAotICAkKFRDREVQX21pcHNfZWxmKQotT0JKREVQX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLU9CSkRFUF9hMjlrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2EyOWsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX2EyOWtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX2FscGhhX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoQkZERElSKS9saWJlY29mZi5oCi1PQkpERVBfYWxwaGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX2FscGhhX2V2YXggPSAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oCi1PQkpERVBfYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9hcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfYXJtX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLU9CSkRFUF9hcm1fY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hcm0uaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX2FybV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9kMTB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMTB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfZDMwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX2QzMHZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9mcjMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9oODMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDgzMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX2g4MzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfaDg1MDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9oODUwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9ocHBhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oICQoQkZERElSKS9lbGYzMi1ocHBhLmggXAotICAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX2kzODZfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLU9CSkRFUF9pMzg2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX2kzODZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX2k4NjBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLU9CSkRFUF9pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfaTg2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfaTk2MF9ib3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX2k5NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTk2MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfaTk2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfbTMycl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX20zMnJfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX202OGtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLU9CSkRFUF9tNjhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX202OGtfaHAzMDAgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmMgJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLU9CSkRFUF9tODhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX204OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX21jb3JlX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tY29yZS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfbWNvcmVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9taXBzX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1PQkpERVBfbWlwc19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX21pcHNfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKEJGRERJUikvbGliZWNvZmYuaAotT0JKREVQX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfbW4xMDIwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX21uMTAyMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX21uMTAzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9tbjEwMzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9uczMya19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLU9CSkRFUF9uczMya19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9uczMya19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX3BwY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfcHBjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX3NoX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zaC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfc2hfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLU9CSkRFUF9zcGFyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3BhcmMuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX3NwYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1PQkpERVBfdGFob2VfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfdGFob2VfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF90aWMzMF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLU9CSkRFUF90aWMzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljMzAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX3RpYzMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfdGljODBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF90aWM4MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX3ZheF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1PQkpERVBfdmF4X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF92YXhfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfdmF4X3ZtcyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLU9CSkRFUF93NjVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi93NjUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX3c2NV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF92ODUwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfejhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvejhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF96OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfaHBwYV9zb20gPSAkKHNyY2RpcikvY29uZmlnL29iai1zb20uaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoQkZERElSKS9saWJocHBhLmggJChCRkRESVIpL3NvbS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotT0JKREVQX2kzODZfbXVsdGkgPSAkKE9CSkRFUF9pMzg2X2NvZmYpICQoT0JKREVQX2kzODZfZWxmKQotT0JKREVQX21pcHNfbXVsdGkgPSAkKE9CSkRFUF9taXBzX2NvZmYpICQoT0JKREVQX21pcHNfZWNvZmYpIFwKLSAgJChPQkpERVBfbWlwc19lbGYpCi1ERVBfYTI5a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9hMjlrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oCi1ERVBfYWxwaGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2FscGhhX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLURFUF9hbHBoYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmgKLURFUF9hbHBoYV9ldmF4ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaAotREVQX2FyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oCi1ERVBfYXJtX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfYXJtX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmgKLURFUF9kMTB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMTB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2QxMHZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMTB2LmgKLURFUF9kMzB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2QzMHZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmgKLURFUF9mcjMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2ZyMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmgKLURFUF9oODMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDgzMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2g4MzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaAotREVQX2g4NTAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfaDg1MDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oCi1ERVBfaHBwYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9ocHBhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oICQoQkZERElSKS9lbGYzMi1ocHBhLmggXAotICAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLURFUF9pMzg2X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9pMzg2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2kzODZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmgKLURFUF9pODYwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2k4NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmgKLURFUF9pOTYwX2JvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmgKLURFUF9pOTYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2k5NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmgKLURFUF9tMzJyX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX20zMnJfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmgKLURFUF9tNjhrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9tNjhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmgKLURFUF9tNjhrX2hwMzAwID0gJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuaCAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggXAotICAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9tODhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX204OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmgKLURFUF9tY29yZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbWNvcmUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaAotREVQX21pcHNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX21pcHNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbWlwc19lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLURFUF9taXBzX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oCi1ERVBfbW4xMDIwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9tbjEwMjAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oCi1ERVBfbW4xMDMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9tbjEwMzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oCi1ERVBfbnMzMmtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9uczMya19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbnMzMmtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oCi1ERVBfcHBjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcnM2MDAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9wcGNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaAotREVQX3NoX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zaC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfc2hfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oCi1ERVBfc3BhcmNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9zcGFyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3BhcmMuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3NwYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaAotREVQX3RhaG9lX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdGFob2VfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3RhaG9lX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaAotREVQX3RpYzMwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdGljMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF90aWMzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmgKLURFUF90aWM4MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljODAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3RpYzgwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaAotREVQX3ZheF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF92YXhfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF92YXhfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaAotREVQX3ZheF92bXMgPSAkKHNyY2RpcikvY29uZmlnL29iai12bXMuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotREVQX3c2NV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3c2NS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdzY1X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1LmgKLURFUF92ODUwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3Y4NTBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmgKLURFUF96OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi96OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3o4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oCi1ERVBfaHBwYV9zb20gPSAkKEJGRERJUikvc29tLmgKLURFUF9pMzg2X211bHRpID0gJChERVBfaTM4Nl9jb2ZmKSAkKERFUF9pMzg2X2VsZikKLURFUF9taXBzX211bHRpID0gJChERVBfbWlwc19jb2ZmKSAkKERFUF9taXBzX2Vjb2ZmKSBcCi0gICQoREVQX21pcHNfZWxmKQotJChPQkpTKTogJChERVBfQHRhcmdldF9jcHVfdHlwZUBfQG9ial9mb3JtYXRAKQotJChUQVJHX0NQVV9PKTogJChUQ0RFUF9AdGFyZ2V0X2NwdV90eXBlQF9Ab2JqX2Zvcm1hdEApCi0kKE9CSl9GT1JNQVRfTyk6ICQoT0JKREVQX0B0YXJnZXRfY3B1X3R5cGVAX0BvYmpfZm9ybWF0QCkKLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQpkaWZmIC0tZ2l0IGEvZ2FzL01ha2VmaWxlLmluIGIvZ2FzL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDRmZmYyLi4wMDAwMDAwCi0tLSBhL2dhcy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI0ODggKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuCi0KLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi0KLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAotQUxMX09CSl9ERVBTID0gQEFMTF9PQkpfREVQU0AKLUFTID0gQEFTQAotQkZETElCID0gQEJGRExJQkAKLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUNDID0gQENDQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1FWEVFWFQgPSBARVhFRVhUQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1JTkNMVURFX0xPQ0FMRV9IID0gQElOQ0xVREVfTE9DQUxFX0hACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi1JTlRMREVQUyA9IEBJTlRMREVQU0AKLUlOVExPQkpTID0gQElOVExPQkpTQAotTEQgPSBATERACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotTVNHRk1UID0gQE1TR0ZNVEAKLU5NID0gQE5NQAotT1BDT0RFU19MSUIgPSBAT1BDT0RFU19MSUJACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QT0ZJTEVTID0gQFBPRklMRVNACi1QT1NVQiA9IEBQT1NVQkAKLVJBTkxJQiA9IEBSQU5MSUJACi1VU0VfSU5DTFVERURfTElCSU5UTCA9IEBVU0VfSU5DTFVERURfTElCSU5UTEAKLVVTRV9OTFMgPSBAVVNFX05MU0AKLVZFUlNJT04gPSBAVkVSU0lPTkAKLWF0b2YgPSBAYXRvZkAKLWNnZW5fY3B1X3ByZWZpeCA9IEBjZ2VuX2NwdV9wcmVmaXhACi1leHRyYV9vYmplY3RzID0gQGV4dHJhX29iamVjdHNACi1pbnN0YWxsX3Rvb2xkaXIgPSBAaW5zdGFsbF90b29sZGlyQAotbCA9IEBsQAotb2JqX2Zvcm1hdCA9IEBvYmpfZm9ybWF0QAotdGFyZ2V0X2NwdV90eXBlID0gQHRhcmdldF9jcHVfdHlwZUAKLXRlX2ZpbGUgPSBAdGVfZmlsZUAKLQotSU5UTExJQlMgPSBASU5UTExJQlNACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMgZGVqYWdudQotCi1TVUJESVJTID0gZG9jIHBvCi0KLXRvb2xkaXIgPSAkKGV4ZWNfcHJlZml4KS8kKHRhcmdldF9hbGlhcykKLQotWUFDQyA9IGBpZiBbIC1mIC4uL2Jpc29uL2Jpc29uIF0gOyB0aGVuIGVjaG8gLi4vYmlzb24vYmlzb24gLXkgLUwuLi9iaXNvbi9iaXNvbiA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAotTEVYID0gYGlmIFsgLWYgLi4vZmxleC9mbGV4IF0gOyB0aGVuIGVjaG8gLi4vZmxleC9mbGV4IDsgIGVsc2UgZWNobyBmbGV4IDsgZmlgCi0KLURFUCA9ICQoc3JjZGlyKS8uLi9ta2RlcAotCi1UQVJHX0NQVSA9IEB0YXJnZXRfY3B1X3R5cGVACi1UQVJHX0NQVV9DID0gJChzcmNkaXIpL2NvbmZpZy90Yy1AdGFyZ2V0X2NwdV90eXBlQC5jCi1UQVJHX0NQVV9PID0gdGMtQHRhcmdldF9jcHVfdHlwZUAubwotVEFSR19DUFVfSCA9ICQoc3JjZGlyKS9jb25maWcvdGMtQHRhcmdldF9jcHVfdHlwZUAuaAotT0JKX0ZPUk1BVF9DID0gJChzcmNkaXIpL2NvbmZpZy9vYmotQG9ial9mb3JtYXRALmMKLU9CSl9GT1JNQVRfTyA9IG9iai1Ab2JqX2Zvcm1hdEAubwotT0JKX0ZPUk1BVF9IID0gJChzcmNkaXIpL2NvbmZpZy9vYmotQG9ial9mb3JtYXRALmgKLVRBUkdfRU5WX0ggPSAkKHNyY2RpcikvY29uZmlnL3RlLUB0ZV9maWxlQC5oCi1BVE9GX1RBUkdfQyA9ICQoc3JjZGlyKS9jb25maWcvYXRvZi1AYXRvZkAuYwotQVRPRl9UQVJHX08gPSBhdG9mLUBhdG9mQC5vCi0KLSMgdXNlIEB0YXJnZXRfY3B1X3R5cGVAIGZvciByZWZlcmluZyB0byBjb25maWd1cmVkIHRhcmdldCBuYW1lCi1JVF9IRFJTID0gaXRibC1wYXJzZS5oICQoc3JjZGlyKS9pdGJsLW9wcy5oIAotSVRfU1JDUyA9IGl0YmwtcGFyc2UuYyBpdGJsLWxleC5jICQoc3JjZGlyKS9pdGJsLW9wcy5jCi1JVF9ERVBTID0gJChzcmNkaXIpL2l0YmwtcGFyc2UueSAkKHNyY2RpcikvaXRibC1sZXgubCAkKHNyY2RpcikvY29uZmlnL2l0YmwtQHRhcmdldF9jcHVfdHlwZUAuaAotSVRfT0JKUyA9IGl0YmwtcGFyc2UubyBpdGJsLWxleC5vIGl0Ymwtb3BzLm8KLQotIyBDUFUgdHlwZXMuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4KLQotQ1BVX1RZUEVTID0gXAotCWEyOWsgXAotCWFscGhhIFwKLQlhcmMgXAotCWFybSBcCi0JZDEwdiBcCi0JZDMwdiBcCi0JZnIzMCBcCi0JaDgzMDAgXAotCWg4NTAwIFwKLQlocHBhIFwKLQlpMzg2IFwKLQlpODYwIFwKLQlpOTYwIFwKLQltMzJyIFwKLQltNjhrIFwKLQltODhrIFwKLQltY29yZSBcCi0JbWlwcyBcCi0JbW4xMDIwMCBcCi0JbW4xMDMwMCBcCi0JbnMzMmsgXAotCXBwYyBcCi0Jc2ggXAotCXNwYXJjIFwKLQl0YWhvZSBcCi0JdGljMzAgXAotCXRpYzgwIFwKLQl2YXggXAotCXc2NSBcCi0Jdjg1MCBcCi0JejhrCi0KLQotIyBPYmplY3QgZm9ybWF0IHR5cGVzLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24uCi0jIFdlIGRlbGliZXJhdGVseSBvbWl0IHNvbSwgc2luY2UgaXQgZG9lcyBub3Qgd29yayBhcyBhIGNyb3NzIGFzc2VtYmxlci4KLQotT0JKX0ZPUk1BVFMgPSBcCi0JYW91dCBcCi0JYm91dCBcCi0JY29mZiBcCi0JZWNvZmYgXAotCWVsZiBcCi0JZXZheCBcCi0JaHAzMDAgXAotCWllZWUgXAotCXZtcwotCi0KLSMgVGhpcyBpcyBhbiBzaCBjYXNlIHdoaWNoIHNldHMgdmFsaWQgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhlIENQVQotIyB0eXBlIGluIHRoZSBzaGVsbCB2YXJpYWJsZSBjIGFuZCB0aGUgT1MgdHlwZSBpbiB0aGUgc2hlbGwgdmFyaWFibGUgbwotIyBhcmUgc3VwcG9ydGVkLiAgVGhpcyBoZWxwcyBjdXRzIGRvd24gb24gdGhlIGFtb3VudCBvZiBkZXBlbmRlbmN5Ci0jIGluZm9ybWF0aW9uLgotCi1DUFVfT0JKX1ZBTElEID0gXAotCXZhbGlkPSA7IFwKLQljYXNlICQkbyBpbiBcCi0JYW91dCkgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgYTI5ayB8IGFybSB8IGkzODYgfCBpODYwIHwgbTY4ayB8IG1pcHMgfCBuczMyayB8IHNwYXJjIHwgdGFob2UgfCB0aWMzMCB8IHZheCkgXAotCSAgICB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JYm91dCkgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgaTk2MCkgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWNvZmYpIHZhbGlkPXllcyA7OyBcCi0JZWNvZmYpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIG1pcHMgfCBhbHBoYSkgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWVsZikgdmFsaWQ9eWVzIDs7IFwKLQlldmF4KSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBhbHBoYSkgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWhwMzAwKSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBtNjhrKSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0Jdm1zKSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICB2YXgpIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQllc2FjOwotCi0KLSMgVGhpcyBpcyBsaWtlIENQVV9PQkpfVkFMSUQsIGZvciB0aGUgb2JqPW11bHRpIGNhc2UuCi0KLUNQVV9NVUxUSV9WQUxJRCA9IFwKLQl2YWxpZD0gOyBcCi0JY2FzZSAkJGMgaW4gXAotCWkzODYgfCBtaXBzKSB2YWxpZD15ZXMgOzsgXAotCWVzYWM7Ci0KLQotIyBSZWd1bGFyIHNvdXJjZSBmaWxlcy4KLQotR0FTX0NGSUxFUyA9IFwKLQlhcHAuYyBcCi0JYXMuYyBcCi0JYXRvZi1nZW5lcmljLmMgXAotCWJpZ251bS1jb3B5LmMgXAotCWNvbmQuYyBcCi0JZGVwZW5kLmMgXAotCWVjb2ZmLmMgXAotCWVob3B0LmMgXAotCWV4cHIuYyBcCi0JZmxvbnVtLWNvcHkuYyBcCi0JZmxvbnVtLWtvbnN0LmMgXAotCWZsb251bS1tdWx0LmMgXAotCWZyYWdzLmMgXAotCWhhc2guYyBcCi0JaW5wdXQtZmlsZS5jIFwKLQlpbnB1dC1zY3J1Yi5jIFwKLQlsaXN0aW5nLmMgXAotCWxpdGVyYWwuYyBcCi0JbWFjcm8uYyBcCi0JbWVzc2FnZXMuYyBcCi0Jb3V0cHV0LWZpbGUuYyBcCi0JcmVhZC5jIFwKLQlzYi5jIFwKLQlzdGFicy5jIFwKLQlzdWJzZWdzLmMgXAotCXN5bWJvbHMuYyBcCi0Jd3JpdGUuYwotCi0KLUNGSUxFUyA9ICQoR0FTX0NGSUxFUykgZ2FzcC5jIGl0Ymwtb3BzLmMKLQotSEZJTEVTID0gXAotCWFzLmggXAotCWFzaW50bC5oIFwKLQliaWdudW0uaCBcCi0JYml0X2ZpeC5oIFwKLQljZ2VuLmggXAotCWVjb2ZmLmggXAotCWVtdWwtdGFyZ2V0LmggXAotCWVtdWwuaCBcCi0JZXhwci5oIFwKLQlmbG9udW0uaCBcCi0JZnJhZ3MuaCBcCi0JaGFzaC5oIFwKLQlpbnB1dC1maWxlLmggXAotCWl0Ymwtb3BzLmggXAotCWxpc3RpbmcuaCBcCi0JbWFjcm8uaCBcCi0Jb2JqLmggXAotCW91dHB1dC1maWxlLmggXAotCXJlYWQuaCBcCi0Jc2IuaCBcCi0Jc3RydWMtc3ltYm9sLmggXAotCXN1YnNlZ3MuaCBcCi0Jc3ltYm9scy5oIFwKLQl0Yy5oIFwKLQl3cml0ZS5oCi0KLQotIyBDUFUgZmlsZXMgaW4gY29uZmlnLgotCi1UQVJHRVRfQ1BVX0NGSUxFUyA9IFwKLQljb25maWcvdGMtYTI5ay5jIFwKLQljb25maWcvdGMtYWxwaGEuYyBcCi0JY29uZmlnL3RjLWFyYy5jIFwKLQljb25maWcvdGMtYXJtLmMgXAotCWNvbmZpZy90Yy1kMTB2LmMgXAotCWNvbmZpZy90Yy1kMzB2LmMgXAotCWNvbmZpZy90Yy1oODMwMC5jIFwKLQljb25maWcvdGMtaDg1MDAuYyBcCi0JY29uZmlnL3RjLWhwcGEuYyBcCi0JY29uZmlnL3RjLWkzODYuYyBcCi0JY29uZmlnL3RjLWk4NjAuYyBcCi0JY29uZmlnL3RjLWk5NjAuYyBcCi0JY29uZmlnL3RjLW0zMnIuYyBcCi0JY29uZmlnL3RjLW02OGsuYyBcCi0JY29uZmlnL3RjLW04OGsuYyBcCi0JY29uZmlnL3RjLW1jb3JlLmMgXAotCWNvbmZpZy90Yy1taXBzLmMgXAotCWNvbmZpZy90Yy1tbjEwMjAwLmMgXAotCWNvbmZpZy90Yy1tbjEwMzAwLmMgXAotCWNvbmZpZy90Yy1uczMyay5jIFwKLQljb25maWcvdGMtcHBjLmMgXAotCWNvbmZpZy90Yy1zaC5jIFwKLQljb25maWcvdGMtc3BhcmMuYyBcCi0JY29uZmlnL3RjLXRhaG9lLmMgXAotCWNvbmZpZy90Yy10aWMzMC5jIFwKLQljb25maWcvdGMtdGljODAuYyBcCi0JY29uZmlnL3RjLXZheC5jIFwKLQljb25maWcvdGMtdzY1LmMgXAotCWNvbmZpZy90Yy12ODUwLmMgXAotCWNvbmZpZy90Yy16OGsuYwotCi0KLVRBUkdFVF9DUFVfSEZJTEVTID0gXAotCWNvbmZpZy90Yy1hMjlrLmggXAotCWNvbmZpZy90Yy1hbHBoYS5oIFwKLQljb25maWcvdGMtYXJjLmggXAotCWNvbmZpZy90Yy1hcm0uaCBcCi0JY29uZmlnL3RjLWQxMHYuaCBcCi0JY29uZmlnL3RjLWQzMHYuaCBcCi0JY29uZmlnL3RjLWg4MzAwLmggXAotCWNvbmZpZy90Yy1oODUwMC5oIFwKLQljb25maWcvdGMtaHBwYS5oIFwKLQljb25maWcvdGMtaTM4Ni5oIFwKLQljb25maWcvdGMtaTg2MC5oIFwKLQljb25maWcvdGMtaTk2MC5oIFwKLQljb25maWcvdGMtbTMyci5oIFwKLQljb25maWcvdGMtbTY4ay5oIFwKLQljb25maWcvdGMtbTg4ay5oIFwKLQljb25maWcvdGMtbWNvcmUuaCBcCi0JY29uZmlnL3RjLW1pcHMuaCBcCi0JY29uZmlnL3RjLW1uMTAyMDAuaCBcCi0JY29uZmlnL3RjLW1uMTAzMDAuaCBcCi0JY29uZmlnL3RjLW5zMzJrLmggXAotCWNvbmZpZy90Yy1wcGMuaCBcCi0JY29uZmlnL3RjLXNoLmggXAotCWNvbmZpZy90Yy1zcGFyYy5oIFwKLQljb25maWcvdGMtdGFob2UuaCBcCi0JY29uZmlnL3RjLXRpYzMwLmggXAotCWNvbmZpZy90Yy10aWM4MC5oIFwKLQljb25maWcvdGMtdmF4LmggXAotCWNvbmZpZy90Yy13NjUuaCBcCi0JY29uZmlnL3RjLXY4NTAuaCBcCi0JY29uZmlnL3RjLXo4ay5oCi0KLQotIyBPQkogZmlsZXMgaW4gY29uZmlnCi0KLU9CSl9GT1JNQVRfQ0ZJTEVTID0gXAotCWNvbmZpZy9vYmotYW91dC5jIFwKLQljb25maWcvb2JqLWJvdXQuYyBcCi0JY29uZmlnL29iai1jb2ZmLmMgXAotCWNvbmZpZy9vYmotZWNvZmYuYyBcCi0JY29uZmlnL29iai1lbGYuYyBcCi0JY29uZmlnL29iai1ldmF4LmMgXAotCWNvbmZpZy9vYmotaHAzMDAuYyBcCi0JY29uZmlnL29iai1pZWVlLmMgXAotCWNvbmZpZy9vYmotc29tLmMgXAotCWNvbmZpZy9vYmotdm1zLmMKLQotCi1PQkpfRk9STUFUX0hGSUxFUyA9IFwKLQljb25maWcvb2JqLWFvdXQuaCBcCi0JY29uZmlnL29iai1ib3V0LmggXAotCWNvbmZpZy9vYmotY29mZi5oIFwKLQljb25maWcvb2JqLWVjb2ZmLmggXAotCWNvbmZpZy9vYmotZWxmLmggXAotCWNvbmZpZy9vYmotZXZheC5oIFwKLQljb25maWcvb2JqLWhwMzAwLmggXAotCWNvbmZpZy9vYmotaWVlZS5oIFwKLQljb25maWcvb2JqLXNvbS5oIFwKLQljb25maWcvb2JqLXZtcy5oCi0KLQotIyBFbXVsYXRpb24gaGVhZGVyIGZpbGVzIGluIGNvbmZpZwotCi1UQVJHX0VOVl9IRklMRVMgPSBcCi0JY29uZmlnL3RlLTM4NmJzZC5oIFwKLQljb25maWcvdGUtYXV4LmggXAotCWNvbmZpZy90ZS1kZWx0YS5oIFwKLQljb25maWcvdGUtZGVsdDg4LmggXAotCWNvbmZpZy90ZS1kcHgyLmggXAotCWNvbmZpZy90ZS1keW5peC5oIFwKLQljb25maWcvdGUtZ2VuZXJpYy5oIFwKLQljb25maWcvdGUtZ28zMi5oIFwKLQljb25maWcvdGUtaHAzMDAuaCBcCi0JY29uZmlnL3RlLWhwcGEuaCBcCi0JY29uZmlnL3RlLWkzODZhaXguaCBcCi0JY29uZmlnL3RlLWljOTYwLmggXAotCWNvbmZpZy90ZS1saW51eC5oIFwKLQljb25maWcvdGUtbG5ld3MuaCBcCi0JY29uZmlnL3RlLWx5bnguaCBcCi0JY29uZmlnL3RlLW1hY2guaCBcCi0JY29uZmlnL3RlLW1hY29zLmggXAotCWNvbmZpZy90ZS1tdWx0aS5oIFwKLQljb25maWcvdGUtbmJzZC5oIFwKLQljb25maWcvdGUtbmJzZDUzMi5oIFwKLQljb25maWcvdGUtcGM1MzJtYWNoLmggXAotCWNvbmZpZy90ZS1wZS5oIFwKLQljb25maWcvdGUtcHBjbncuaCBcCi0JY29uZmlnL3RlLXBzb3MuaCBcCi0JY29uZmlnL3RlLXJpc2NpeC5oIFwKLQljb25maWcvdGUtc3BhcmNhb3V0LmggXAotCWNvbmZpZy90ZS1zdW4zLmggXAotCWNvbmZpZy90ZS1zdnI0LmggXAotCWNvbmZpZy90ZS1zeXN2MzIuaAotCi0KLSMgTXVsdGkgZmlsZXMgaW4gY29uZmlnCi0KLU1VTFRJX0NGSUxFUyA9IFwKLQljb25maWcvZS1pMzg2Y29mZi5jIFwKLQljb25maWcvZS1pMzg2ZWxmLmMgXAotCWNvbmZpZy9lLW1pcHNlY29mZi5jIFwKLQljb25maWcvZS1taXBzZWxmLmMKLQotCi1DT05GSUdfT0JKUyA9IFwKLQkkKFRBUkdfQ1BVX08pIFwKLQkkKE9CSl9GT1JNQVRfTykgXAotCSQoQVRPRl9UQVJHX08pIFwKLQkkKGV4dHJhX29iamVjdHMpCi0KLQotR0VORVJJQ19PQkpTID0gXAotCWFwcC5vIFwKLQlhcy5vIFwKLQlhdG9mLWdlbmVyaWMubyBcCi0JYmlnbnVtLWNvcHkubyBcCi0JY29uZC5vIFwKLQlkZXBlbmQubyBcCi0JZWhvcHQubyBcCi0JZXhwci5vIFwKLQlmbG9udW0ta29uc3QubyBcCi0JZmxvbnVtLWNvcHkubyBcCi0JZmxvbnVtLW11bHQubyBcCi0JZnJhZ3MubyBcCi0JaGFzaC5vIFwKLQlpbnB1dC1maWxlLm8gXAotCWlucHV0LXNjcnViLm8gXAotCWxpdGVyYWwubyBcCi0JbWVzc2FnZXMubyBcCi0Jb3V0cHV0LWZpbGUubyBcCi0JcmVhZC5vIFwKLQlzdWJzZWdzLm8gXAotCXN5bWJvbHMubyBcCi0Jd3JpdGUubyBcCi0JbGlzdGluZy5vIFwKLQllY29mZi5vIFwKLQlzdGFicy5vIFwKLQlzYi5vIFwKLQltYWNyby5vCi0KLQotT0JKUyA9ICQoQ09ORklHX09CSlMpICQoR0VORVJJQ19PQkpTKQotCi1QT1RGSUxFUyA9ICQoTVVMVElfQ0ZJTEVTKSAkKFRBUkdFVF9FTlZfSEZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKSBcCi0JJChPQkpfRk9STUFUX0NGSUxFUykgJChUQVJHRVRfQ1BVX0hGSUxFUykgJChUQVJHRVRfQ1BVX0NGSUxFUykgXAotCSQoSEZJTEVTKSAkKENGSUxFUykgJChHQVNfQ0ZJTEVTKQotCi0KLW5vaW5zdF9QUk9HUkFNUyA9IGFzLW5ldyBnYXNwLW5ldwotbm9pbnN0X1NDUklQVFMgPSAuZ2RiaW5pdAotCi1FWFRSQV9ESVNUID0gbWFrZS1nYXMuY29tCi0KLURJU1RTVFVGRiA9IG1ha2UtZ2FzLmNvbSBtNjhrLXBhcnNlLmMgaXRibC1wYXJzZS5jIGl0YmwtcGFyc2UuaCBpdGJsLWxleC5jCi0KLURJU1RDTEVBTkZJTEVTID0gdGFyZy1jcHUuaCBvYmotZm9ybWF0LmggdGFyZy1lbnYuaCBpdGJsLWNwdS5oIGNnZW4tZGVzYy5oCi0KLSMgTm93IGZpZ3VyZSBvdXQgZnJvbSB0aG9zZSB2YXJpYWJsZXMgaG93IHRvIGNvbXBpbGUgYW5kIGxpbmsuCi0KLUJBU0VESVIgPSAkKHNyY2RpcikvLi4KLUJGRERJUiA9ICQoQkFTRURJUikvYmZkCi1JTkNESVIgPSAkKEJBU0VESVIpL2luY2x1ZGUKLQotIyBUaGlzIGlzIHRoZSB2YXJpYWJsZSBhY3R1YWxseSB1c2VkIHdoZW4gd2UgY29tcGlsZS4KLSMgU3BlY2lmeSB0aGUgZGlyZWN0b3JpZXMgdG8gYmUgc2VhcmNoZWQgZm9yIGhlYWRlciBmaWxlcy4KLSMgQm90aCAuIGFuZCBzcmNkaXIgYXJlIHVzZWQsIGluIHRoYXQgb3JkZXIsCi0jIHNvIHRoYXQgdG0uaCBhbmQgY29uZmlnLmggd2lsbCBiZSBmb3VuZCBpbiB0aGUgY29tcGlsYXRpb24KLSMgc3ViZGlyZWN0b3J5IHJhdGhlciB0aGFuIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoc3JjZGlyKS9jb25maWcgLUkkKElOQ0RJUikgLUkkKHNyY2RpcikvLi4gLUkkKEJGRERJUikgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi0jIFRoaXMgc2hvdWxkIGJlIHBhcmFsbGVsIHRvIElOQ0xVREVTLCBidXQgc2hvdWxkIHJlcGxhY2UgJChzcmNkaXIpCi0jIHdpdGggJCR7c3JjZGlyfSwgYW5kIHNob3VsZCB3b3JrIGluIGEgc3ViZGlyZWN0b3J5LiAgVGhpcyBpcyB1c2VkCi0jIHdoZW4gYnVpbGRpbmcgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHRoZSBkZXBlbmRlbmN5IGJ1aWxkaW5nIGlzIGRvbmUKLSMgaW4gYSBzdWJkaXJlY3RvcnkuCi1ERVBfSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkIC1JJCR7c3JjZGlyfS9jb25maWcgLUkkJHtzcmNkaXJ9Ly4uL2luY2x1ZGUgLUkkJHtzcmNkaXJ9Ly4uIC1JJCR7c3JjZGlyfS8uLi9iZmQgLUkkJHtzcmNkaXJ9Ly4uL2ludGwgLUkuLi8uLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotIyBIb3cgdG8gbGluayB3aXRoIGJvdGggb3VyIHNwZWNpYWwgbGlicmFyeSBmYWNpbGl0aWVzCi0jIGFuZCB0aGUgc3lzdGVtJ3MgaW5zdGFsbGVkIGxpYnJhcmllcy4KLQotR0FTTElCUyA9IEBPUENPREVTX0xJQkAgQEJGRExJQkAgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi0KLSMgRmlsZXMgdG8gYmUgY29waWVkIGF3YXkgYWZ0ZXIgZWFjaCBzdGFnZSBpbiBidWlsZGluZy4KLVNUQUdFU1RVRkYgPSAqLm8gJChub2luc3RfUFJPR1JBTVMpCi0KLWFzX25ld19TT1VSQ0VTID0gJChHQVNfQ0ZJTEVTKQotYXNfbmV3X0xEQUREID0gJChUQVJHX0NQVV9PKSAkKE9CSl9GT1JNQVRfTykgJChBVE9GX1RBUkdfTykgXAotCSQoZXh0cmFfb2JqZWN0cykgJChHQVNMSUJTKSAkKElOVExMSUJTKQotCi1hc19uZXdfREVQRU5ERU5DSUVTID0gJChUQVJHX0NQVV9PKSAkKE9CSl9GT1JNQVRfTykgJChBVE9GX1RBUkdfTykgXAotCSQoZXh0cmFfb2JqZWN0cykgJChHQVNMSUJTKSAkKElOVExERVBTKQotCi0KLWdhc3BfbmV3X1NPVVJDRVMgPSBnYXNwLmMgbWFjcm8uYyBzYi5jIGhhc2guYwotZ2FzcF9uZXdfTERBREQgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMTElCUykKLWdhc3BfbmV3X0RFUEVOREVOQ0lFUyA9IC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYSAkKElOVExERVBTKQotCi1FWFBFQ1QgPSBgaWYgWyAtZiAkJHtyb290bWV9Ly4uL2V4cGVjdC9leHBlY3QgXSA7IHRoZW4gXAotICAgICAgICAgIGVjaG8gJCR7cm9vdG1lfS8uLi9leHBlY3QvZXhwZWN0IDsgXAotICAgICAgICAgIGVsc2UgZWNobyBleHBlY3QgOyBmaWAKLQotCi1SVU5URVNUID0gYGlmIFsgLWYgJCR7c3JjZGlyfS8uLi9kZWphZ251L3J1bnRlc3QgXSA7IHRoZW4gXAotCQllY2hvICQke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IDsgZWxzZSBlY2hvIHJ1bnRlc3Q7IFwKLQkgICBmaWAKLQotUlVOVEVTVEZMQUdTID0gCi0KLSMgVGhlIG02OGsgb3BlcmFuZCBwYXJzZXIuCi0KLUVYVFJBX2FzX25ld19TT1VSQ0VTID0gY29uZmlnL202OGstcGFyc2UueQotCi0jIHN0YW5kLWFsb25lIGl0YmwgYXNzZW1ibGVyICYgZGlzYXNzZW1ibGVyCi0KLUVYVFJBX1BST0dSQU1TID0gaXRibC10ZXN0Ci1pdGJsX3Rlc3RfU09VUkNFUyA9IGl0YmwtcGFyc2UueSBpdGJsLWxleC5sCi1pdGJsX3Rlc3RfTERBREQgPSBpdGJsLXRlc3Qtb3BzLm8gaXRibC10ZXN0Lm8gJChHQVNMSUJTKSBATEVYTElCQAotCi0jIENHRU4gaW50ZXJmYWNlLgotCi1DR0VOX0NQVV9QUkVGSVggPSBAY2dlbl9jcHVfcHJlZml4QAotCi0jIFJlbWFrZSB0aGUgaW5mbyBmaWxlcy4KLQotTU9TVExZQ0xFQU5GSUxFUyA9ICQoU1RBR0VTVFVGRikgY29yZSBzdGFtcC1tay5jb20gXAotCXRlc3RzdWl0ZS8qLm8gdGVzdHN1aXRlLyoub3V0IHRlc3RzdWl0ZS9nYXMubG9nIHRlc3RzdWl0ZS9nYXMuc3VtIFwKLQl0ZXN0c3VpdGUvc2l0ZS5leHAgc2l0ZS5iYWsgc2l0ZS5leHAgc3RhZ2Ugc3RhZ2UxIHN0YWdlMgotCi0KLUNMRUFORklMRVMgPSBkZXAuc2VkIC50Y2RlcCAub2JqZGVwIC5kZXAyIC5kZXAxIC5kZXBhIC5kZXAgLmRlcGRpcgotCi1hZ2FpbnN0ID0gc3RhZ2UyCi0KLSMgQXV0b21hdGljIGRlcGVuZGVuY3kgY29tcHV0YXRpb24uICBUaGlzIGlzIGEgcmVhbCBwYWluLCBiZWNhdXNlIHRoZQotIyBkZXBlbmRlbmNpZXMgY2hhbmdlIGJhc2VkIG9uIHRhcmdldF9jcHVfdHlwZSBhbmQgb2JqX2Zvcm1hdC4gIFdlCi0jIGN1cnJlbnRseSBpZ25vcmUgYW55IGRlcGVuZGVuY2llcyBjYXVzZWQgYnkgZW11bGF0aW9uIGZpbGVzLgotCi1ERVBfRklMRV9ERVBTID0gJChDRklMRVMpICQoSEZJTEVTKSAkKFRBUkdFVF9DUFVfQ0ZJTEVTKSBcCi0JJChUQVJHRVRfQ1BVX0hGSUxFUykgJChPQkpfRk9STUFUX0NGSUxFUykgJChPQkpfRk9STUFUX0hGSUxFUykKLQotCi1UQ0RFUF9hMjlrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLQotVENERVBfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLQotVENERVBfYTI5a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotCi1UQ0RFUF9hbHBoYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggXAotICAkKHNyY2RpcikvY29uZmlnL2F0b2YtdmF4LmMKLQotVENERVBfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotCi1UQ0RFUF9hbHBoYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKHNyY2RpcikvY29uZmlnL2F0b2YtdmF4LmMKLQotVENERVBfYWxwaGFfZXZheCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotCi1UQ0RFUF9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLVRDREVQX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9hcmMuaCAkKElOQ0RJUikvZWxmL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotCi1UQ0RFUF9hcm1fYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi0KLVRDREVQX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi0KLVRDREVQX2FybV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLVRDREVQX2QxMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMTB2LmggXAotICAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotVENERVBfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oICQoSU5DRElSKS9lbGYvcHBjLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLVRDREVQX2QzMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMzB2LmgKLQotVENERVBfZDMwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCi0KLVRDREVQX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1vcGMuaCBcCi0gIGNnZW4uaAotCi1UQ0RFUF9mcjMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1vcGMuaCBcCi0gIGNnZW4uaAotCi1UQ0RFUF9oODMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDgzMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2g4MzAwLmgKLQotVENERVBfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9oODMwMC5oCi0KLVRDREVQX2g4NTAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2g4NTAwLW9wYy5oCi0KLVRDREVQX2g4NTAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2g4NTAwLW9wYy5oCi0KLVRDREVQX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKEJGRERJUikvbGliYmZkLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaAotCi1UQ0RFUF9ocHBhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oICQoQkZERElSKS9lbGYzMi1ocHBhLmggXAotICAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKEJGRERJUikvbGliYmZkLmggJChJTkNESVIpL29wY29kZS9ocHBhLmgKLQotVENERVBfaTM4Nl9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9pMzg2LmgKLQotVENERVBfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pMzg2LmgKLQotVENERVBfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTM4Ni5oCi0KLVRDREVQX2k4NjBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL2k4NjAuaAotCi1UQ0RFUF9pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCi0KLVRDREVQX2k4NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggJChJTkNESVIpL29wY29kZS9pODYwLmgKLQotVENERVBfaTk2MF9ib3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2k5NjAuaAotCi1UQ0RFUF9pOTYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi0KLVRDREVQX2k5NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi0KLVRDREVQX20zMnJfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1vcGMuaCBcCi0gIGNnZW4uaAotCi1UQ0RFUF9tMzJyX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1vcGMuaCBcCi0gIGNnZW4uaAotCi1UQ0RFUF9tNjhrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAotCi1UQ0RFUF9tNjhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi0KLVRDREVQX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAotCi1UQ0RFUF9tNjhrX2hwMzAwID0gJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuaCAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggXAotICAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi0KLVRDREVQX204OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTg4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS9jb25maWcvbTg4ay1vcGNvZGUuaAotCi1UQ0RFUF9tODhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpL2NvbmZpZy9tODhrLW9wY29kZS5oCi0KLVRDREVQX21jb3JlX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tY29yZS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL21jb3JlLW9wYy5oCi0KLVRDREVQX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL21jb3JlLW9wYy5oIFwKLSAgJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotVENERVBfbWlwc19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9taXBzLmggaXRibC1vcHMuaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIFwKLSAgJChJTkNESVIpL2NvZmYvZWNvZmYuaAotCi1UQ0RFUF9taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIFwKLSAgaXRibC1vcHMuaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLQotVENERVBfbWlwc19lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBcCi0gIGl0Ymwtb3BzLmgKLQotVENERVBfbWlwc19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIGl0Ymwtb3BzLmggXAotICAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi0KLVRDREVQX21uMTAyMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmgKLQotVENERVBfbW4xMDIwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCi0KLVRDREVQX21uMTAzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9tbjEwMzAwLmgKLQotVENERVBfbW4xMDMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCi0KLVRDREVQX25zMzJrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotVENERVBfbnMzMmtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCAkKElOQ0RJUikvb2JzdGFjay5oCi0KLVRDREVQX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLVRDREVQX3BwY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvcHBjLmgKLQotVENERVBfcHBjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oICQoSU5DRElSKS9lbGYvcHBjLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLVRDREVQX3NoX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zaC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL3NoLW9wYy5oCi0KLVRDREVQX3NoX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL3NoLW9wYy5oCi0KLVRDREVQX3NwYXJjX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9zcGFyYy5oCi0KLVRDREVQX3NwYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zcGFyYy5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaAotCi1UQ0RFUF9zcGFyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmggJChJTkNESVIpL2VsZi9zcGFyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotCi1UQ0RFUF90YWhvZV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS90YWhvZS5oCi0KLVRDREVQX3RhaG9lX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdGFob2UuaAotCi1UQ0RFUF90YWhvZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvdGFob2UuaAotCi1UQ0RFUF90aWMzMF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzMwLmgKLQotVENERVBfdGljMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCi0KLVRDREVQX3RpYzMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzMwLmgKLQotVENERVBfdGljODBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oCi0KLVRDREVQX3RpYzgwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmgKLQotVENERVBfdmF4X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLQotVENERVBfdmF4X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92YXguaAotCi1UQ0RFUF92YXhfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLQotVENERVBfdmF4X3ZtcyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92YXguaAotCi1UQ0RFUF93NjVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi93NjUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy93NjUtb3BjLmgKLQotVENERVBfdzY1X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy93NjUtb3BjLmgKLQotVENERVBfdjg1MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3Y4NTAuaAotCi1UQ0RFUF92ODUwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92ODUwLmgKLQotVENERVBfejhrX2NvZmYgPSAkKHNyY2RpcikvLi4vb3Bjb2Rlcy96OGstb3BjLmggJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvejhrLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLVRDREVQX3o4a19lbGYgPSAkKHNyY2RpcikvLi4vb3Bjb2Rlcy96OGstb3BjLmggJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggXAotICAkKEJGRERJUikvZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaAotCi1UQ0RFUF9ocHBhX3NvbSA9ICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaCBcCi0gICQoQkZERElSKS9zb20uaAotCi1UQ0RFUF9pMzg2X211bHRpID0gJChUQ0RFUF9pMzg2X2NvZmYpICQoVENERVBfaTM4Nl9lbGYpCi1UQ0RFUF9taXBzX211bHRpID0gJChUQ0RFUF9taXBzX2NvZmYpICQoVENERVBfbWlwc19lY29mZikgXAotICAkKFRDREVQX21pcHNfZWxmKQotCi1PQkpERVBfYTI5a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1PQkpERVBfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX2EyOWtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfYWxwaGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9hbHBoYV9lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKEJGRERJUikvbGliZWNvZmYuaAotCi1PQkpERVBfYWxwaGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfYWxwaGFfZXZheCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmgKLU9CSkRFUF9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfYXJtX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotT0JKREVQX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9hcm1fZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9kMTB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMTB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9kMTB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX2QzMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX2QzMHZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfZnIzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfZnIzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9oODMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDgzMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX2g4NTAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9oODUwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfaHBwYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfaHBwYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCAkKEJGRERJUikvZWxmMzItaHBwYS5oIFwKLSAgJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX2kzODZfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotT0JKREVQX2kzODZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9pMzg2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX2k4NjBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotT0JKREVQX2k4NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX2k4NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfaTk2MF9ib3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1PQkpERVBfaTk2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pOTYwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX2k5NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfbTMycl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfbTMycl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9tNjhrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLU9CSkRFUF9tNjhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfbTY4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9tNjhrX2hwMzAwID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5jICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmggXAotICAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLU9CSkRFUF9tODhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9tY29yZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbWNvcmUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfbWNvcmVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX21pcHNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotT0JKREVQX21pcHNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX21pcHNfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKEJGRERJUikvbGliZWNvZmYuaAotCi1PQkpERVBfbWlwc19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX21uMTAyMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX21uMTAyMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfbW4xMDMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfbW4xMDMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9uczMya19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotT0JKREVQX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfbnMzMmtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX3BwY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9wcGNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9zaF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc2guaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfc2hfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX3NwYXJjX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1PQkpERVBfc3BhcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX3NwYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF90YWhvZV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotT0JKREVQX3RhaG9lX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfdGFob2VfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX3RpYzMwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1PQkpERVBfdGljMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX3RpYzMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF90aWM4MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljODAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfdGljODBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX3ZheF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLU9CSkRFUF92YXhfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfdmF4X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfdmF4X3ZtcyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotT0JKREVQX3c2NV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3c2NS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF93NjVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF92ODUwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF92ODUwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX3o4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3o4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF96OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9ocHBhX3NvbSA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKEJGRERJUikvc29tLmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi0KLU9CSkRFUF9pMzg2X211bHRpID0gJChPQkpERVBfaTM4Nl9jb2ZmKSAkKE9CSkRFUF9pMzg2X2VsZikKLU9CSkRFUF9taXBzX211bHRpID0gJChPQkpERVBfbWlwc19jb2ZmKSAkKE9CSkRFUF9taXBzX2Vjb2ZmKSBcCi0gICQoT0JKREVQX21pcHNfZWxmKQotCi1ERVBfYTI5a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9hMjlrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2EyOWsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfYTI5a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaAotCi1ERVBfYWxwaGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotCi1ERVBfYWxwaGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oCi0KLURFUF9hbHBoYV9ldmF4ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaAotREVQX2FyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmgKLQotREVQX2FybV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9hcm1fZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaAotCi1ERVBfZDEwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2QxMHZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMTB2LmgKLQotREVQX2QzMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9kMzB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oCi0KLURFUF9mcjMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfZnIzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaAotCi1ERVBfaDgzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2g4MzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaAotCi1ERVBfaDg1MDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2g4NTAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaAotCi1ERVBfaHBwYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2hwcGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggJChCRkRESVIpL2VsZjMyLWhwcGEuaCBcCi0gICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotCi1ERVBfaTM4Nl9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9pMzg2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaAotCi1ERVBfaTg2MF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfaTg2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaAotCi1ERVBfaTk2MF9ib3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oCi1ERVBfaTk2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pOTYwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2k5NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmgKLQotREVQX20zMnJfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9tMzJyX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oCi0KLURFUF9tNjhrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX202OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTY4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9tNjhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oCi0KLURFUF9tNjhrX2hwMzAwID0gJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuaCAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggXAotICAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX204OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTg4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9tODhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oCi0KLURFUF9tY29yZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbWNvcmUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbWNvcmVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oCi0KLURFUF9taXBzX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX21pcHNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9taXBzX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotCi1ERVBfbWlwc19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaAotCi1ERVBfbW4xMDIwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX21uMTAyMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmgKLQotREVQX21uMTAzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9tbjEwMzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oCi0KLURFUF9uczMya19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbnMzMmtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbnMzMmtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oCi0KLURFUF9wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfcHBjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmgKLQotREVQX3NoX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zaC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9zaF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmgKLQotREVQX3NwYXJjX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9zcGFyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3BhcmMuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfc3BhcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oCi0KLURFUF90YWhvZV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdGFob2VfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdGFob2VfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oCi0KLURFUF90aWMzMF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdGljMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3RpYzMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaAotCi1ERVBfdGljODBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3RpYzgwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaAotCi1ERVBfdmF4X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdmF4X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF92YXhfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaAotCi1ERVBfdmF4X3ZtcyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi0KLURFUF93NjVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi93NjUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdzY1X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1LmgKLQotREVQX3Y4NTBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF92ODUwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oCi0KLURFUF96OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi96OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfejhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmgKLQotREVQX2hwcGFfc29tID0gJChCRkRESVIpL3NvbS5oCi1ERVBfaTM4Nl9tdWx0aSA9ICQoREVQX2kzODZfY29mZikgJChERVBfaTM4Nl9lbGYpCi1ERVBfbWlwc19tdWx0aSA9ICQoREVQX21pcHNfY29mZikgJChERVBfbWlwc19lY29mZikgXAotICAkKERFUF9taXBzX2VsZikKLQotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSAgLmdkYmluaXQKLW5vaW5zdF9QUk9HUkFNUyA9ICBhcy1uZXckKEVYRUVYVCkgZ2FzcC1uZXckKEVYRUVYVCkKLVBST0dSQU1TID0gICQobm9pbnN0X1BST0dSQU1TKQotCi0KLURFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJTID0gQExJQlNACi1pdGJsX3Rlc3RfT0JKRUNUUyA9ICBpdGJsLXBhcnNlLm8gaXRibC1sZXgubwotaXRibF90ZXN0X0RFUEVOREVOQ0lFUyA9ICBpdGJsLXRlc3Qtb3BzLm8gaXRibC10ZXN0Lm8gXAotLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1pdGJsX3Rlc3RfTERGTEFHUyA9IAotYXNfbmV3X09CSkVDVFMgPSAgYXBwLm8gYXMubyBhdG9mLWdlbmVyaWMubyBiaWdudW0tY29weS5vIGNvbmQubyBcCi1kZXBlbmQubyBlY29mZi5vIGVob3B0Lm8gZXhwci5vIGZsb251bS1jb3B5Lm8gZmxvbnVtLWtvbnN0Lm8gXAotZmxvbnVtLW11bHQubyBmcmFncy5vIGhhc2gubyBpbnB1dC1maWxlLm8gaW5wdXQtc2NydWIubyBsaXN0aW5nLm8gXAotbGl0ZXJhbC5vIG1hY3JvLm8gbWVzc2FnZXMubyBvdXRwdXQtZmlsZS5vIHJlYWQubyBzYi5vIHN0YWJzLm8gXAotc3Vic2Vncy5vIHN5bWJvbHMubyB3cml0ZS5vCi1hc19uZXdfTERGTEFHUyA9IAotZ2FzcF9uZXdfT0JKRUNUUyA9ICBnYXNwLm8gbWFjcm8ubyBzYi5vIGhhc2gubwotZ2FzcF9uZXdfTERGTEFHUyA9IAotU0NSSVBUUyA9ICAkKG5vaW5zdF9TQ1JJUFRTKQotCi1MRVhfT1VUUFVUX1JPT1QgPSBATEVYX09VVFBVVF9ST09UQAotTEVYTElCID0gQExFWExJQkAKLVlMV1JBUCA9ICQodG9wX3NyY2RpcikvLi4veWx3cmFwCi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAKLURJU1RfQ09NTU9OID0gIFJFQURNRSAuL3N0YW1wLWguaW4gQ09QWUlORyBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gXAotTWFrZWZpbGUuaW4gTkVXUyBhY2luY2x1ZGUubTQgYWNsb2NhbC5tNCBjb25maWcuaW4gY29uZmlnL202OGstcGFyc2UuYyBcCi1jb25maWd1cmUgY29uZmlndXJlLmluIGdkYmluaXQuaW4gaXRibC1sZXguYyBpdGJsLXBhcnNlLmMKLQotCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotCi1UQVIgPSB0YXIKLUdaSVBfRU5WID0gLS1iZXN0Ci1TT1VSQ0VTID0gJChpdGJsX3Rlc3RfU09VUkNFUykgJChhc19uZXdfU09VUkNFUykgJChFWFRSQV9hc19uZXdfU09VUkNFUykgJChnYXNwX25ld19TT1VSQ0VTKQotT0JKRUNUUyA9ICQoaXRibF90ZXN0X09CSkVDVFMpICQoYXNfbmV3X09CSkVDVFMpICQoZ2FzcF9uZXdfT0JKRUNUUykKLQotYWxsOiBhbGwtcmVkaXJlY3QKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLlMgLmMgLmwgLmxvIC5vIC5zIC55Ci0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluICBhY2luY2x1ZGUubTQKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQotCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0KLWNvbmZpZy5oOiBzdGFtcC1oCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mIHN0YW1wLWg7IFwKLQkJJChNQUtFKSBzdGFtcC1oOyBcCi0JZWxzZSA6OyBmaQotc3RhbXAtaDogJChzcmNkaXIpL2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiBcCi0JICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAotJChzcmNkaXIpL2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQllbHNlIDo7IGZpCi0kKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKLQotbW9zdGx5Y2xlYW4taGRyOgotCi1jbGVhbi1oZHI6Ci0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oCi0KLW1haW50YWluZXItY2xlYW4taGRyOgotLmdkYmluaXQ6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzIGdkYmluaXQuaW4KLQljZCAkKHRvcF9idWlsZGRpcikgJiYgQ09ORklHX0ZJTEVTPSRAOmdkYmluaXQuaW4gQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi1tb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUzoKLQotY2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0JLXRlc3QgLXogIiQobm9pbnN0X1BST0dSQU1TKSIgfHwgcm0gLWYgJChub2luc3RfUFJPR1JBTVMpCi0KLWRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUzoKLQotbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUzoKLQotLmMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0uUy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi5vIGNvcmUgKi5jb3JlCi0KLWNsZWFuLWNvbXBpbGU6Ci0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLW1haW50YWluZXItY2xlYW4tY29tcGlsZToKLQotLmMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0uUy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tbGlidG9vbDoKLQktcm0gLWYgKi5sbwotCi1jbGVhbi1saWJ0b29sOgotCS1ybSAtcmYgLmxpYnMgX2xpYnMKLQotZGlzdGNsZWFuLWxpYnRvb2w6Ci0KLW1haW50YWluZXItY2xlYW4tbGlidG9vbDoKLQotaXRibC10ZXN0JChFWEVFWFQpOiAkKGl0YmxfdGVzdF9PQkpFQ1RTKSAkKGl0YmxfdGVzdF9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGl0YmwtdGVzdCQoRVhFRVhUKQotCSQoTElOSykgJChpdGJsX3Rlc3RfTERGTEFHUykgJChpdGJsX3Rlc3RfT0JKRUNUUykgJChpdGJsX3Rlc3RfTERBREQpICQoTElCUykKLQotYXMtbmV3JChFWEVFWFQpOiAkKGFzX25ld19PQkpFQ1RTKSAkKGFzX25ld19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGFzLW5ldyQoRVhFRVhUKQotCSQoTElOSykgJChhc19uZXdfTERGTEFHUykgJChhc19uZXdfT0JKRUNUUykgJChhc19uZXdfTERBREQpICQoTElCUykKLQotZ2FzcC1uZXckKEVYRUVYVCk6ICQoZ2FzcF9uZXdfT0JKRUNUUykgJChnYXNwX25ld19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGdhc3AtbmV3JChFWEVFWFQpCi0JJChMSU5LKSAkKGdhc3BfbmV3X0xERkxBR1MpICQoZ2FzcF9uZXdfT0JKRUNUUykgJChnYXNwX25ld19MREFERCkgJChMSUJTKQotLmwuYzoKLQkkKExFWCkgJChBTV9MRkxBR1MpICQoTEZMQUdTKSAkPCAmJiBtdiAkKExFWF9PVVRQVVRfUk9PVCkuYyAkQAotLnkuYzoKLQkkKFNIRUxMKSAkKFlMV1JBUCkgIiQoWUFDQykiICQ8IHkudGFiLmMgJCouYyB5LnRhYi5oICQqLmggLS0gJChBTV9ZRkxBR1MpICQoWUZMQUdTKQotY29uZmlnL202OGstcGFyc2UuaDogY29uZmlnL202OGstcGFyc2UuYwotaXRibC1wYXJzZS5oOiBpdGJsLXBhcnNlLmMKLQotCi0jIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAotIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCi0jIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCi0jICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKLSMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7Ci0jICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgotCi1AU0VUX01BS0VACi0KLWFsbC1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLWluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAotY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgZG90X3NlZW49eWVzOyBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKLQlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXJldj0nJzsgbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gIi4iICYmIGRvdF9zZWVuPXllczsgXAotCWRvbmU7IFwKLQl0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyIgJiYgcmV2PSIuICQkcmV2IjsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKLXRhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi0KLXRhZ3M6IFRBR1MKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCWhlcmU9YHB3ZGAgJiYgY2QgJChzcmNkaXIpIFwKLQkgICYmIG1raWQgLWYkJGhlcmUvSUQgJCR1bmlxdWUgJChMSVNQKQotCi1UQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmluICQoVEFHU19ERVBFTkRFTkNJRVMpICQoTElTUCkKLQl0YWdzPTsgXAotCWhlcmU9YHB3ZGA7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLSAgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCi0gICBmaTsgXAotCWRvbmU7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JdGVzdCAteiAiJChFVEFHU19BUkdTKWNvbmZpZy5pbiQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAotCSAgfHwgKGNkICQoc3JjZGlyKSAmJiBldGFncyAkKEVUQUdTX0FSR1MpICQkdGFncyBjb25maWcuaW4gJCR1bmlxdWUgJChMSVNQKSAtbyAkJGhlcmUvVEFHUykKLQotbW9zdGx5Y2xlYW4tdGFnczoKLQotY2xlYW4tdGFnczoKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQKLQotbWFpbnRhaW5lci1jbGVhbi10YWdzOgotCi1kaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCi10b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKLQotIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgotIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgotIyB0YXJmaWxlLgotZGlzdGNoZWNrOiBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgenhmICQoZGlzdGRpcikudGFyLmd6Ci0JbWtkaXIgJChkaXN0ZGlyKS89YnVpbGQKLQlta2RpciAkKGRpc3RkaXIpLz1pbnN0Ci0JZGNfaW5zdGFsbF9iYXNlPWBjZCAkKGRpc3RkaXIpLz1pbnN0ICYmIHB3ZGA7IFwKLQljZCAkKGRpc3RkaXIpLz1idWlsZCBcCi0JICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9JCRkY19pbnN0YWxsX2Jhc2UgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlAYmFubmVyPSIkKGRpc3RkaXIpLnRhci5neiBpcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uIjsgXAotCWRhc2hlcz1gZWNobyAiJCRiYW5uZXIiIHwgc2VkIHMvLi89L2dgOyBcCi0JZWNobyAiJCRkYXNoZXMiOyBcCi0JZWNobyAiJCRiYW5uZXIiOyBcCi0JZWNobyAiJCRkYXNoZXMiCi1kaXN0OiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdC1hbGw6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQktcm0gLXJmICQoZGlzdGRpcikKLQlta2RpciAkKGRpc3RkaXIpCi0JLWNobW9kIDc3NyAkKGRpc3RkaXIpCi0JQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgY3AgLXByICQkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAotCSAgZmk7IFwKLQlkb25lCi0JZm9yIHN1YmRpciBpbiAkKFNVQkRJUlMpOyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1kICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBta2RpciAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICAgIGNobW9kIDc3NyAkKGRpc3RkaXIpLyQkc3ViZGlyOyBcCi0JICAgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0uLi8kKGRpc3RkaXIpIGRpc3RkaXI9Li4vJChkaXN0ZGlyKS8kJHN1YmRpciBkaXN0ZGlyKSBcCi0JICAgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLQotREVKQVRPT0wgPSAkKFBBQ0tBR0UpCi0KLVJVTlRFU1RERUZBVUxURkxBR1MgPSAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCRzcmNkaXIKLXNpdGUuZXhwOiBNYWtlZmlsZQotCUBlY2hvICdNYWtpbmcgYSBuZXcgc2l0ZS5leHAgZmlsZS4uLicKLQlAdGVzdCAhIC1mIHNpdGUuYmFrIHx8IHJtIC1mIHNpdGUuYmFrCi0JQGVjaG8gJyMjIHRoZXNlIHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgbWFrZSAjIycgPiAkQC10Ci0JQGVjaG8gJyMgRG8gbm90IGVkaXQgaGVyZS4gIElmIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZXNlIHZhbHVlcycgPj4gJEAtdAotCUBlY2hvICcjIGVkaXQgdGhlIGxhc3Qgc2VjdGlvbicgPj4gJEAtdAotCUBlY2hvICdzZXQgdG9vbCAkKERFSkFUT09MKScgPj4gJEAtdAotCUBlY2hvICdzZXQgc3JjZGlyICQoc3JjZGlyKScgPj4gJEAtdAotCUBlY2hvICdzZXQgb2JqZGlyJyBgcHdkYCA+PiAkQC10Ci0JQGVjaG8gJ3NldCBob3N0X2FsaWFzICQoaG9zdF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IGhvc3RfdHJpcGxldCAkKGhvc3RfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnc2V0IHRhcmdldF9hbGlhcyAkKHRhcmdldF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IHRhcmdldF90cmlwbGV0ICQodGFyZ2V0X3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBidWlsZF9hbGlhcyAkKGJ1aWxkX2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgYnVpbGRfdHJpcGxldCAkKGJ1aWxkX3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJyMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlIGdlbmVyYXRlZCBieSBjb25maWd1cmUuIERvIE5vdCBFZGl0ICMjJyA+PiAkQC10Ci0JQHRlc3QgISAtZiBzaXRlLmV4cCB8fCBzZWQgJzEsL14jIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZS4qIyMvIGQnIHNpdGUuZXhwID4+ICRALXQKLQlAdGVzdCAhIC1mIHNpdGUuZXhwIHx8IG12IHNpdGUuZXhwIHNpdGUuYmFrCi0JQG12ICRALXQgc2l0ZS5leHAKLWluZm8tYW06Ci1pbmZvOiBpbmZvLXJlY3Vyc2l2ZQotZHZpLWFtOgotZHZpOiBkdmktcmVjdXJzaXZlCi1jaGVjay1hbToKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjay1ERUpBR05VCi1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLWFsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtZXhlYy1sb2NhbAotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCi0KLWluc3RhbGwtZGF0YS1hbToKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKLXVuaW5zdGFsbC1hbToKLXVuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQotYWxsLWFtOiBNYWtlZmlsZSAkKFBST0dSQU1TKSAkKFNDUklQVFMpIGNvbmZpZy5oCi1hbGwtcmVkaXJlY3Q6IGFsbC1yZWN1cnNpdmUtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKLWluc3RhbGxkaXJzLWFtOgotCi0KLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoTU9TVExZQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTU9TVExZQ0xFQU5GSUxFUykKLQotY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCS10ZXN0IC16ICIkKERJU1RDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChESVNUQ0xFQU5GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICJpdGJsLWxleGxjb25maWcvbTY4ay1wYXJzZWhjb25maWcvbTY4ay1wYXJzZWNpdGJsLXBhcnNlaGl0YmwtcGFyc2VjIiB8fCBybSAtZiBpdGJsLWxleGwgY29uZmlnL202OGstcGFyc2VoIGNvbmZpZy9tNjhrLXBhcnNlYyBpdGJsLXBhcnNlaCBpdGJsLXBhcnNlYwotbW9zdGx5Y2xlYW4tYW06ICBtb3N0bHljbGVhbi1oZHIgbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotCQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgXAotCQltb3N0bHljbGVhbi10YWdzIG1vc3RseWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQotCi1jbGVhbi1hbTogIGNsZWFuLWhkciBjbGVhbi1ub2luc3RQUk9HUkFNUyBjbGVhbi1jb21waWxlIGNsZWFuLWxpYnRvb2wgXAotCQljbGVhbi10YWdzIGNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQotCi1kaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUyBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbi1nZW5lcmljIFwKLQkJY2xlYW4tYW0KLQktcm0gLWYgbGlidG9vbAotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi1tYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotCQltYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBcCi0JCW1haW50YWluZXItY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgXAotCQlkaXN0Y2xlYW4tYW0KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi0uUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCi1tb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBkaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotY2xlYW4tbm9pbnN0UFJPR1JBTVMgbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUyBcCi1tb3N0bHljbGVhbi1jb21waWxlIGRpc3RjbGVhbi1jb21waWxlIGNsZWFuLWNvbXBpbGUgXAotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYnRvb2wgXAotY2xlYW4tbGlidG9vbCBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi11bmluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi11bmluc3RhbGwtZXhlYy1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIHVuaW5zdGFsbGRpcnMtcmVjdXJzaXZlIFwKLWFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgXAotZHZpLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUgdGFncyB0YWdzLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbi10YWdzIFwKLWRpc3RjbGVhbi10YWdzIGNsZWFuLXRhZ3MgbWFpbnRhaW5lci1jbGVhbi10YWdzIGRpc3RkaXIgY2hlY2stREVKQUdOVSBcCi1pbmZvLWFtIGluZm8gZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIFwKLWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtbG9jYWwgXAotaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gXAotaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsIGFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIGluc3RhbGxkaXJzLWFtIFwKLWluc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBcCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotJChzcmNkaXIpL21ha2UtZ2FzLmNvbTogc3RhbXAtbWsuY29tCi1zdGFtcC1tay5jb206IHZtc2NvbmYuc2ggTWFrZWZpbGUKLQlzaCAkKHNyY2Rpcikvdm1zY29uZi5zaCAkKEdFTkVSSUNfT0JKUykgPiBuZXctbWFrZS5jb20KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbmV3LW1ha2UuY29tICQoc3JjZGlyKS9tYWtlLWdhcy5jb20KLQl0b3VjaCBzdGFtcC1tay5jb20KLWRpc3RzdHVmZjogJChESVNUU1RVRkYpIGluZm8KLQotJChPQkpTKTogQEFMTF9PQkpfREVQU0AKLQotIyBTdHVmZiB0aGF0IGV2ZXJ5IG9iamVjdCBmaWxlIGRlcGVuZHMgdXBvbi4gIElmIGFueXRoaW5nIGlzIHJlbW92ZWQKLSMgZnJvbSB0aGlzIGxpc3QsIHJlbW92ZSBpdCBmcm9tIGRlcC1pbi5zZWQgYXMgd2VsbC4KLSQoT0JKUyk6IGNvbmZpZy5oIGFzLmggJChUQVJHX0VOVl9IKSAkKE9CSl9GT1JNQVRfSCkgJChUQVJHX0NQVV9IKSBmbG9udW0uaCBcCi0JZXhwci5oIHN0cnVjLXN5bWJvbC5oIHdyaXRlLmggZnJhZ3MuaCBoYXNoLmggcmVhZC5oIHN5bWJvbHMuaCB0Yy5oIFwKLQlvYmouaCBsaXN0aW5nLmggYmlnbnVtLmggYml0X2ZpeC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBhc2ludGwuaAotCi1jaGVjay1ERUpBR05VOiBzaXRlLmV4cAotCWlmIFsgLWQgdGVzdHN1aXRlIF07IHRoZW4gXAotCSAgdHJ1ZTsgXAotCWVsc2UgXAotCSAgbWtkaXIgdGVzdHN1aXRlOyBcCi0JZmkKLQlybSAtZiB0ZXN0c3VpdGUvc2l0ZS5leHAKLQljcCBzaXRlLmV4cCB0ZXN0c3VpdGUvc2l0ZS5leHAKLQlyb290bWU9YHB3ZGA7IGV4cG9ydCByb290bWU7IFwKLQlzcmNkaXI9YGNkICR7c3JjZGlyfTsgcHdkYCA7IGV4cG9ydCBzcmNkaXIgOyBcCi0JRVhQRUNUPSR7RVhQRUNUfSA7IGV4cG9ydCBFWFBFQ1QgOyBcCi0JaWYgWyAtZiAkKHRvcF9idWlsZGRpcikvLi4vZXhwZWN0L2V4cGVjdCBdOyB0aGVuIFwKLQkgIFRDTF9MSUJSQVJZPWBjZCAkKHRvcF9zcmNkaXIpLy4uL3RjbC9saWJyYXJ5ICYmIHB3ZGA7IFwKLQkgIGV4cG9ydCBUQ0xfTElCUkFSWTsgXAotCWZpOyBcCi0JcnVudGVzdD0kKFJVTlRFU1QpOyBcCi0JY2QgdGVzdHN1aXRlOyBcCi0JaWYgJChTSEVMTCkgLWMgIiQkcnVudGVzdCAtLXZlcnNpb24iID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgJCRydW50ZXN0IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHtzcmNkaXJ9L3Rlc3RzdWl0ZSBcCi0JCSQoUlVOVEVTVEZMQUdTKTsgXAotCWVsc2UgZWNobyAiV0FSTklORzogY291bGQgbm90IGZpbmQgXGBydW50ZXN0JyIgMT4mMjsgOjtcCi0JZmkKLQotIyBUaGUgaW1wbGljaXQgLmMubyBydWxlIGRvZXNuJ3Qgd29yayBmb3IgdGhlc2UsIHBlcmhhcHMgYmVjYXVzZSBvZgotIyB0aGUgdmFyaWFibGVzLCBvciBwZXJoYXBzIGJlY2F1c2UgdGhlIHNvdXJjZXMgYXJlIG5vdCBvbiB2cGF0aC4KLSQoVEFSR19DUFVfTyk6ICQoVEFSR19DUFVfQykgJChUQVJHX0NQVV9ERVBfQHRhcmdldF9jcHVfdHlwZUApCi0JJChDT01QSUxFKSAtYyAkKFRBUkdfQ1BVX0MpCi0kKEFUT0ZfVEFSR19PKTogJChBVE9GX1RBUkdfQykKLQkkKENPTVBJTEUpIC1jICQoQVRPRl9UQVJHX0MpCi0KLSMgZWNvZmYuYyBvbmx5IGhhcyBmdWxsIGRlcGVuZGVuY2llcyB3aGVuIEVDT0ZGX0RFQlVHR0lORyBpcyBkZWZpbmVkLAotIyBzbyB0aGUgYXV0b21hdGljIGRlcGVuZGVuY3kgc3R1ZmYgZG9lc24ndCB3b3JrLgotZWNvZmYubyA6IGVjb2ZmLmMgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIFwKLQkkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggXAotCSQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmgKLQotIyBXZSBuZWVkIGFsbCB0aGVzZSBleHBsaWNpdCBydWxlcyBmb3IgdGhlIG11bHRpIHN0dWZmLiAgQmVjYXVzZSBvZgotIyB0aGVzZSBydWxlcywgd2UgZG9uJ3QgbmVlZCBvbmUgZm9yIE9CSl9GT1JNQVRfTy4KLQotb2JqLWFvdXQubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5jCi1vYmotYm91dC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmMKLW9iai1jb2ZmLm86ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5jCi1vYmotZWNvZmYubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmMKLW9iai1lbGYubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuYwotb2JqLWV2YXgubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5jCi1vYmotaHAzMDAubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmMKLW9iai1pZWVlLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1pZWVlLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWllZWUuYwotb2JqLW11bHRpLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1tdWx0aS5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1tdWx0aS5jCi1vYmotc29tLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1zb20uYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotc29tLmMKLW9iai12bXMubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai12bXMuYwotCi1lLW1pcHNlbGYubyA6ICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWxmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWxmLmMKLWUtbWlwc2Vjb2ZmLm8gOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2Vjb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWNvZmYuYwotZS1pMzg2Y29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLWkzODZjb2ZmLmMKLWUtaTM4NmVsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jCi0KLSMgSWYgbTY4ay1wYXJzZS55IGlzIGluIGEgZGlmZmVyZW50IGRpcmVjdG9yeSwgdGhlbiB5bHdyYXAgd2lsbCB1c2UgYW4KLSMgYWJzb2x1dGUgcGF0aCB3aGVuIGl0IGludm9rZXMgeWFjYywgd2hpY2ggd2lsbCBjYXVzZSB5YWNjIHRvIHB1dCB0aGUKLSMgYWJzb2x1dGUgcGF0aCBpbnRvIHRoZSBnZW5lcmF0ZWQgZmlsZS4gIFRoYXQncyBhIHBhaW4gd2hlbiBpdCBjb21lcwotIyB0byBnZW5lcmF0aW5nIHNuYXBzaG90cywgYmVjYXVzZSBpdCBpbnRyb2R1Y2VzIHNwdXJpb3VzIGRpZmZzLgotIyBTaW5jZSB3aGVuIHdlIG1ha2UgdGhlIHNuYXBzaG90cyAkKHNyY2RpcikgPSAiLiIsIHdlIGNoZWNrIGZvciB0aGF0Ci0jIGNhc2UgYW5kIGhhbmRsZSBpdCBkaWZmZXJlbnRseS4gIFRoaXMgbWVhbnMgdGhhdCBhbnlib2R5IHdobwotIyBjb25maWd1cmVzIHdpdGggJChzcmNkaXIpID0gIi4iIHdpbGwgaGF2ZSB0byBzZXQgdGhlaXIgcGF0aCBpbiB0aGUKLSMgZGVidWdnZXIgaWYgdGhleSB3YW50IHRvIGRlYnVnIG02OGstcGFyc2UueS4gIFRoaXMgaXMgYmFkLCBidXQgb24KLSMgdGhlIG90aGVyIGhhbmQgaXQncyBnb29kIHRoYXQgcGVvcGxlIHdobyB1c2UgdGhlIHByZWJ1aWx0Ci0jIG02OGstcGFyc2UuYyBkb24ndCBnZXQgYSBzcHVyaW91cyBhYnNvbHV0ZSBwYXRoLgotbTY4ay1wYXJzZS5jOiAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UueQotCWY9JChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLnk7IFwKLQlpZiBbICQkZiA9ICIuL2NvbmZpZy9tNjhrLXBhcnNlLnkiIF07IHRoZW4gXAotCSAgbG4gLXMgY29uZmlnL202OGstcGFyc2UueSAuID4gL2Rldi9udWxsIDI+L2Rldi9udWxsIHx8IFwKLQkgICBsbiBjb25maWcvbTY4ay1wYXJzZS55IC4gPiAvZGV2L251bGwgMj4vZGV2L251bGwgfHwgXAotCSAgIGNwIGNvbmZpZy9tNjhrLXBhcnNlLnkgLiA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyBcCi0JICBmPW02OGstcGFyc2UueTsgXAotCWVsc2UgdHJ1ZTsgZmk7IFwKLQkkKFNIRUxMKSAkKFlMV1JBUCkgIiQoWUFDQykiICQkZiB5LnRhYi5jIG02OGstcGFyc2UuYyAtLTsgXAotCWlmIFsgJCRmID0gIm02OGstcGFyc2UueSIgXTsgdGhlbiBcCi0JICBybSAtZiBtNjhrLXBhcnNlLnk7IFwKLQllbHNlIHRydWU7IGZpCi1tNjhrLXBhcnNlLm86IG02OGstcGFyc2UuYyAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAotCi0jIERvbid0IGxldCB0aGUgLnkuaCBydWxlIGNsb2JiZXIgbTY4ay1wYXJzZS5oLgotbTY4ay1wYXJzZS5oOiA7IEB0cnVlCi0kKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaDogOyBAdHJ1ZQotCi0jIFRoZSBpbnN0cnVjdGlvbiB0YWJsZSBzcGVjaWZpY2F0aW9uIGxleGljYWwgYW5hbHl6ZXIgYW5kIHBhcnNlci4KLQotaXRibC1sZXguYzogJChzcmNkaXIpL2l0YmwtbGV4LmwKLWl0YmwtbGV4Lm86IGl0YmwtbGV4LmMgaXRibC1wYXJzZS5oCi0KLWl0YmwtcGFyc2UubzogaXRibC1wYXJzZS5jIGl0YmwtcGFyc2UuaCAkKHNyY2RpcikvaXRibC1vcHMuaAotCi1pdGJsLW9wcy5vOiAkKHNyY2RpcikvaXRibC1vcHMuYyAkKHNyY2RpcikvaXRibC1vcHMuaCBpdGJsLXBhcnNlLmgKLQotaXRibC1wYXJzZS5jIGl0YmwtcGFyc2UuaDogJChzcmNkaXIpL2l0YmwtcGFyc2UueQotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJChzcmNkaXIpL2l0YmwtcGFyc2UueSB5LnRhYi5jIGl0YmwtcGFyc2UuYyB5LnRhYi5oIGl0YmwtcGFyc2UuaCAtLSAtZAotCi1pdGJsLXRlc3Qtb3BzLm86ICQoc3JjZGlyKS9pdGJsLW9wcy5jICQoc3JjZGlyKS9pdGJsLW9wcy5oIGl0YmwtcGFyc2UuaAotCSQoQ09NUElMRSkgLW8gaXRibC10ZXN0LW9wcy5vIC1EU1RBTkRfQUxPTkUgLWMgJChzcmNkaXIpL2l0Ymwtb3BzLmMKLQotaXRibC10ZXN0Lm86ICQoc3JjZGlyKS90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLXRlc3QuYyAkKHNyY2RpcikvaXRibC1vcHMuaAotCSQoQ09NUElMRSkgLWMgLURTVEFORF9BTE9ORSAkKHNyY2RpcikvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC10ZXN0LmMKLQotY2dlbi5vOiBjZ2VuLmMgY2dlbi5oIGNnZW4tZGVzYy5oIHN1YnNlZ3MuaCBcCi0JJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0JJChzcmNkaXIpLy4uL29wY29kZXMvJChDR0VOX0NQVV9QUkVGSVgpLWRlc2MuaCBcCi0JJChzcmNkaXIpLy4uL29wY29kZXMvJChDR0VOX0NQVV9QUkVGSVgpLW9wYy5oCi0KLS5QSE9OWTogaW5zdGFsbC1leGVjLWxvY2FsIGluc3RhbGwtZGF0YS1sb2NhbAotLlBIT05ZOiBpbnN0YWxsLWV4ZWMtYmluZGlyIGluc3RhbGwtZXhlYy10b29sZGlyCi0KLWluc3RhbGwtZXhlYy1sb2NhbDogaW5zdGFsbC1leGVjLWJpbmRpciBAaW5zdGFsbF90b29sZGlyQAotCi1pbnN0YWxsLWV4ZWMtYmluZGlyOiAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKG1raW5zdGFsbGRpcnMpICQoYmluZGlyKQotCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgZWNobyAiICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi1pbnN0YWxsLWV4ZWMtdG9vbGRpcjogJChub2luc3RfUFJPR1JBTVMpCi0JJChta2luc3RhbGxkaXJzKSAkKHRvb2xkaXIpL2JpbgotCW49YGVjaG8gYXMgfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JaWYgWyAiJChiaW5kaXIpLyQkbiQoRVhFRVhUKSIgIT0gIiQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpIiBdOyB0aGVuIFwKLQkgIHJtIC1mICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpOyBcCi0JICBsbiAkKGJpbmRpcikvJCRuJChFWEVFWFQpICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAotCSAgICB8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSBhcy1uZXckKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCk7IFwKLQllbHNlIFwKLQkgIHRydWUgOyBcCi0JZmkKLQotIyBUaGVzZSBleGlzdCBmb3IgbWFpbnRlbmFuY2UgcHVycG9zZXMuCi0KLS5QSE9OWTogYm9vdHN0cmFwIGJvb3RzdHJhcDIgYm9vdHN0cmFwMyBzdGFnZTEgc3RhZ2UyIHN0YWdlMyBjb21wYXJpc29uCi0KLWJvb3RzdHJhcDogYXMtbmV3Ci0JJChNQUtFKSBzdGFnZTEKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTEgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIHN0YWdlMgotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMiBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgY29tcGFyaXNvbiBhZ2FpbnN0PXN0YWdlMgotCi1ib290c3RyYXAyOgotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMSBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgc3RhZ2UyCi0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCi0KLWJvb3RzdHJhcDM6Ci0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCi0KLSMgQ29weSB0aGUgb2JqZWN0IGZpbGVzIGZyb20gYSBwYXJ0aWN1bGFyIHN0YWdlIGludG8gYSBzdWJkaXJlY3RvcnkuCi1zdGFnZTE6Ci0JLW1rZGlyIHN0YWdlMQotCS1tdiAkKFNUQUdFU1RVRkYpIHN0YWdlMQotCWlmIFsgLWYgc3RhZ2UxL2FzLW5ldyQoRVhFRVhUKSAtYSAhIC1mIHN0YWdlMS9hcyQoRVhFRVhUKSBdIDsgdGhlbiAoY2Qgc3RhZ2UxIDsgbG4gLXMgYXMtbmV3JChFWEVFWFQpIGFzJChFWEVFWFQpKSA7IGZpCi0KLXN0YWdlMjoKLQktbWtkaXIgc3RhZ2UyCi0JLW12ICQoU1RBR0VTVFVGRikgc3RhZ2UyCi0JaWYgWyAtZiBzdGFnZTIvYXMtbmV3JChFWEVFWFQpIC1hICEgLWYgc3RhZ2UyL2FzJChFWEVFWFQpIF0gOyB0aGVuIChjZCBzdGFnZTIgOyBsbiAtcyBhcy1uZXckKEVYRUVYVCkgYXMkKEVYRUVYVCkpIDsgZmkKLQotc3RhZ2UzOgotCS1ta2RpciBzdGFnZTMKLQktbXYgJChTVEFHRVNUVUZGKSBzdGFnZTMKLQlpZiBbIC1mIHN0YWdlMy9hcy1uZXckKEVYRUVYVCkgLWEgISAtZiBzdGFnZTMvYXMkKEVYRUVYVCkgXSA7IHRoZW4gKGNkIHN0YWdlMyA7IGxuIC1zIGFzLW5ldyBhcyQoRVhFRVhUKSkgOyBmaQotCi0jIFRoaXMgcnVsZSBpcyBkZXJpdmVkIGZyb20gY29ycmVzcG9uZGluZyBjb2RlIGluIHRoZSBNYWtlZmlsZS5pbiBmb3IgZ2NjLgotIyBUaGUgInRhaWwgKzE2YyIgaXMgdG8gYnlwYXNzIGhlYWRlcnMgd2hpY2ggbWF5IGluY2x1ZGUgdGltZXN0YW1wcyBvcgotIyB0ZW1wb3JhcnkgYXNzZW1ibHkgZmlsZSBuYW1lcy4KLWNvbXBhcmlzb246Ci0JeD0wIDsgXAotCWZvciBmaWxlIGluICoubyA7IGRvIFwKLQkgIHRhaWwgKzE2YyAuLyQkZmlsZSA+IHRtcC1mb28xOyBcCi0JICBpZiB0YWlsICsxNmMgJHthZ2FpbnN0fS8kJGZpbGUgPiB0bXAtZm9vMiAyPi9kZXYvbnVsbCA7IHRoZW4gXAotCSAgICBpZiBjbXAgdG1wLWZvbzEgdG1wLWZvbzIgOyB0aGVuIFwKLQkgICAgICB0cnVlIDsgXAotCSAgICBlbHNlIFwKLQkgICAgICBlY2hvICQkZmlsZSBkaWZmZXJzIDsgXAotCSAgICAgIHg9MSA7IFwKLQkgICAgZmkgOyBcCi0JICBlbHNlIHRydWU7IGZpIDsgXAotCWRvbmUgOyBcCi0JZXhpdCAkJHgKLQktcm0gLWYgdG1wLWZvbyoKLQotLlBIT05ZOiBkZS1zdGFnZTEgZGUtc3RhZ2UyIGRlLXN0YWdlMwotCi1kZS1zdGFnZTE6Ci0JLSAoY2Qgc3RhZ2UxIDsgcm0gLWYgYXMkKEVYRUVYVCkgOyBtdiAtZiAqIC4uKQotCS0gcm1kaXIgc3RhZ2UxCi0KLWRlLXN0YWdlMjoKLQktIChjZCBzdGFnZTIgOyBybSAtZiBhcyQoRVhFRVhUKSA7IG12IC1mICogLi4pCi0JLSBybWRpciBzdGFnZTIKLQotZGUtc3RhZ2UzOgotCS0gKGNkIHN0YWdlMyA7IHJtIC1mIGFzJChFWEVFWFQpIDsgbXYgLWYgKiAuLikKLQktIHJtZGlyIHN0YWdlMwotCi0uZGVwOiBkZXAuc2VkICQoREVQX0ZJTEVfREVQUykgLnRjZGVwIC5vYmpkZXAgLmRlcDIKLQlybSAtZiAuZGVwMQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JJChNQUtFKSBERVA9JChERVApIHNyY2Rpcj0kJHtzcmNkaXJ9IFZQQVRIPSQke3NyY2Rpcn0gLmRlcDEKLQlybSAtcmYgLmRlcGRpcgotCXNlZCAtZiBkZXAuc2VkIDwgLmRlcDEgPiAuZGVwYQotCXNlZCAtZiBkZXAuc2VkIDwgLnRjZGVwID4+IC5kZXBhCi0Jc2VkIC1mIGRlcC5zZWQgPCAub2JqZGVwID4+IC5kZXBhCi0Jc2VkIC1mIGRlcC5zZWQgPCAuZGVwMiA+PiAuZGVwYQotCWVjaG8gJyQkKE9CSlMpOiAkJChERVBfQHRhcmdldCcnX2NwdV90eXBlQF9Ab2JqJydfZm9ybWF0QCknID4+IC5kZXBhCi0JZWNobyAnJCQoVEFSR19DUFVfTyk6ICQkKFRDREVQX0B0YXJnZXQnJ19jcHVfdHlwZUBfQG9iaicnX2Zvcm1hdEApJyA+PiAuZGVwYQotCWVjaG8gJyQkKE9CSl9GT1JNQVRfTyk6ICQkKE9CSkRFUF9AdGFyZ2V0JydfY3B1X3R5cGVAX0BvYmonJ19mb3JtYXRAKScgPj4gLmRlcGEKLQllY2hvICcjIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVknID4+IC5kZXBhCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIC5kZXBhIC5kZXAKLQotIyBUaGlzIHJ1bGUgbmVlZHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotLmRlcDE6ICQoQ0ZJTEVTKSAkKE1VTFRJX0NGSUxFUykKLQlpZiBbIC1kIC5kZXBkaXIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIC5kZXBkaXI7IGZpCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQljZCAuZGVwZGlyOyBcCi0JZWNobyAnJyA+IHRhcmctY3B1Lmg7IFwKLQllY2hvICcnID4gb2JqLWZvcm1hdC5oOyBcCi0JZWNobyAnJyA+IHRhcmctZW52Lmg7IFwKLQllY2hvICcnID4gaXRibC1jcHUuaDsgXAotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDsgXAotCSQoREVQKSAtZiAuZGVwIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpICQ/Ci0Jc2VkIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyA8IC5kZXBkaXIvLmRlcCA+IC5kZXAxCi0Jcm0gLWYgLmRlcGRpci8uZGVwCi0KLSMgV29yayBvdXQgdGhlIHNwZWNpYWwgZGVwZW5kZW5jaWVzIGZvciB0aGUgdGMtKi5jIGZpbGVzLgotLnRjZGVwOiAkKFRBUkdFVF9DUFVfQ0ZJTEVTKQotCXJtIC1mIC50Y2RlcGEKLQlpZiBbIC1kIC5kZXBkaXIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIC5kZXBkaXI7IGZpCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQljZCAuZGVwZGlyOyBcCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICBmb3IgbyBpbiAkKE9CSl9GT1JNQVRTKTsgZG8gXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGMtJyIkJHtjfSInLmgiJyA+IHRhcmctY3B1Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAib2JqLSciJCR7b30iJy5oIicgPiBvYmotZm9ybWF0Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGUtZ2VuZXJpYy5oIicgPiB0YXJnLWVudi5oOyBcCi0JICAgICAgZWNobyAnJyA+IGl0YmwtY3B1Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAib3Bjb2Rlcy8nIiQke2N9IictZGVzYy5oIicgPiBjZ2VuLWRlc2MuaDsgXAotCSAgICAgIHJtIC1mIGR1bW15LmM7IFwKLQkgICAgICBjcCAkJHtzcmNkaXJ9L2NvbmZpZy90Yy0kJHtjfS5jIGR1bW15LmM7IFwKLQkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXA7IFwKLQkgICAgICAkKERFUCkgLWYgLmRlcCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCi0JICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvVENERVBfJCR7Y31fJCR7b30gPS8iIFwKLQkJICAtZSAnMSwvRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUi9kJyBcCi0JCSAgLWUgJy9JRiBZT1UgUFVUIEFOWVRISU5HLywkJGQnIFwKLQkJICAtZSAnL14kJC9kJyA8IC5kZXAgPj4gLi4vLnRjZGVwYTsgXAotCSAgICAgIHJtIC1mIGR1bW15LmM7IFwKLQkgICAgZWxzZSB0cnVlOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQllY2hvICdUQ0RFUF9ocHBhX3NvbSA9ICQkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBzdWJzZWdzLmggXCcgPj4gLnRjZGVwYQotCWVjaG8gJyAgJCQoSU5DRElSKS9vYnN0YWNrLmggJCQoQkZERElSKS9saWJocHBhLmggXCcgPj4gLnRjZGVwYQotCWVjaG8gJyAgJCQoSU5DRElSKS9vcGNvZGUvaHBwYS5oICQkKEJGRERJUikvc29tLmgnID4+IC50Y2RlcGEKLQkjIFdlIGRvbid0IHRyeSB0byBoYW5kbGUgYWxsIG11bHRpIGNhc2VzLgotCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAotCSAgJChDUFVfTVVMVElfVkFMSUQpIFwKLQkgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgIG89ZWNvZmY7IFwKLQkgICAgJChDUFVfT0JKX1ZBTElEKSBcCi0JICAgIGVjaG8gJ1RDREVQXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IC50Y2RlcGE7IFwKLQkgICAgZWNobyAnJCQoVENERVBfJyIkJHtjfSInX2NvZmYpIFwnID4+IC50Y2RlcGE7IFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICckJChUQ0RFUF8nIiQke2N9IidfZWNvZmYpIFwnID4+IC50Y2RlcGE7IFwKLQkgICAgZWxzZSB0cnVlOyBmaTsgXAotCSAgICBlY2hvICckJChUQ0RFUF8nIiQke2N9IidfZWxmKScgPj4gLnRjZGVwYTsgXAotCSAgZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQltdiAtZiAudGNkZXBhIC50Y2RlcAotCi0jIFdvcmsgb3V0IHRoZSBzcGVjaWFsIGRlcGVuZGVuY2llcyBmb3IgdGhlIG9iai0qLmMgZmlsZXMuCi0ub2JqZGVwOiAkKE9CSl9GT1JNQVRfQ0ZJTEVTKQotCXJtIC1mIC5vYmpkZXBhCi0JaWYgWyAtZCAuZGVwZGlyIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciAuZGVwZGlyOyBmaQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JY2QgLmRlcGRpcjsgXAotCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAotCSAgZm9yIG8gaW4gJChPQkpfRk9STUFUUyk7IGRvIFwKLQkgICAgJChDUFVfT0JKX1ZBTElEKSBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgInRjLSciJCR7Y30iJy5oIicgPiB0YXJnLWNwdS5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgIm9iai0nIiQke299IicuaCInID4gb2JqLWZvcm1hdC5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgInRlLWdlbmVyaWMuaCInID4gdGFyZy1lbnYuaDsgXAotCSAgICAgIGVjaG8gJycgPiBpdGJsLWNwdS5oOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICAgIGNwICQke3NyY2Rpcn0vY29uZmlnL29iai0kJHtvfS5jIGR1bW15LmM7IFwKLQkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXA7IFwKLQkgICAgICAkKERFUCkgLWYgLmRlcCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCi0JICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvT0JKREVQXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCAuZGVwID4+IC4uLy5vYmpkZXBhOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCWVjaG8gJ09CSkRFUF9ocHBhX3NvbSA9ICQkKHNyY2RpcikvY29uZmlnL29iai1zb20uaCBzdWJzZWdzLmggXCcgPj4gLm9iamRlcGEKLQllY2hvICcgICQkKElOQ0RJUikvb2JzdGFjay5oICQkKEJGRERJUikvbGliaHBwYS5oIFwnID4+IC5vYmpkZXBhCi0JZWNobyAnICAkJChCRkRESVIpL3NvbS5oICAkJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcJyA+PiAub2JqZGVwYQotCWVjaG8gJyAgJCQoSU5DRElSKS9hb3V0L3N0YWIuZGVmJyA+PiAub2JqZGVwYQotCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICAkKENQVV9NVUxUSV9WQUxJRCkgXAotCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgbz1lY29mZjsgXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgZWNobyAnT0JKREVQXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IC5vYmpkZXBhOyBcCi0JICAgIGVjaG8gJyQkKE9CSkRFUF8nIiQke2N9IidfY29mZikgXCcgPj4gLm9iamRlcGE7IFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICckJChPQkpERVBfJyIkJHtjfSInX2Vjb2ZmKSBcJyA+PiAub2JqZGVwYTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICAgIGVjaG8gJyQkKE9CSkRFUF8nIiQke2N9IidfZWxmKScgPj4gLm9iamRlcGE7IFwKLQkgIGVsc2UgdHJ1ZTsgZmk7IFwKLQlkb25lCi0JbXYgLWYgLm9iamRlcGEgLm9iamRlcAotCi0jIFdvcmsgb3V0IHRoZSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggQ1BVL09CSiBjb21iaW5hdGlvbi4KLSMgTm90ZSB0aGF0IFNPTSBpcyBhIHNwZWNpYWwgY2FzZSwgYmVjYXVzZSBpdCBvbmx5IHdvcmtzIG5hdGl2ZS4KLS5kZXAyOiAkKFRBUkdFVF9DUFVfSEZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKQotCXJtIC1mIC5kZXAyYQotCWlmIFsgLWQgLmRlcGRpciBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgLmRlcGRpcjsgZmkKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCWNkIC5kZXBkaXI7IFwKLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgIGZvciBvIGluICQoT0JKX0ZPUk1BVFMpOyBkbyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiQke2N9IicuaCInID4gdGFyZy1jcHUuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvYmotJyIkJHtvfSInLmgiJyA+IGR1bW15LmM7IFwKLQkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXA7IFwKLQkgICAgICAkKERFUCkgLWYgLmRlcCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCi0JICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvREVQXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCAuZGVwID4+IC4uLy5kZXAyYTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCWVjaG8gJ0RFUF9ocHBhX3NvbSA9ICQkKEJGRERJUikvc29tLmgnID4+IC5kZXAyYQotCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICAkKENQVV9NVUxUSV9WQUxJRCkgXAotCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgbz1lY29mZjsgXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgZWNobyAnREVQXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IC5kZXAyYTsgXAotCSAgICBlY2hvICckJChERVBfJyIkJHtjfSInX2NvZmYpIFwnID4+IC5kZXAyYTsgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfZWNvZmYpIFwnID4+IC5kZXAyYTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfZWxmKScgPj4gLmRlcDJhOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCW12IC1mIC5kZXAyYSAuZGVwMgotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQgXAotCQktZSAicyFASU5DRElSQCEkJHtzcmNkaXJ9Ly4uL2luY2x1ZGUhIiBcCi0JCS1lICJzIUBCRkRESVJAISQke3NyY2Rpcn0vLi4vYmZkISIgXAotCQktZSAicyFAU1JDRElSQCEkJHtzcmNkaXJ9ISIKLQotZGVwOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotCi1hcHAubzogYXBwLmMKLWFzLm86IGFzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggb3V0cHV0LWZpbGUuaCBcCi0gIHNiLmggbWFjcm8uaAotYXRvZi1nZW5lcmljLm86IGF0b2YtZ2VuZXJpYy5jCi1iaWdudW0tY29weS5vOiBiaWdudW0tY29weS5jCi1jb25kLm86IGNvbmQuYyBtYWNyby5oIHNiLmggJChJTkNESVIpL29ic3RhY2suaAotZGVwZW5kLm86IGRlcGVuZC5jCi1lY29mZi5vOiBlY29mZi5jCi1laG9wdC5vOiBlaG9wdC5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9lbGYvZHdhcmYyLmgKLWV4cHIubzogZXhwci5jICQoSU5DRElSKS9vYnN0YWNrLmgKLWZsb251bS1jb3B5Lm86IGZsb251bS1jb3B5LmMKLWZsb251bS1rb25zdC5vOiBmbG9udW0ta29uc3QuYwotZmxvbnVtLW11bHQubzogZmxvbnVtLW11bHQuYwotZnJhZ3MubzogZnJhZ3MuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaAotaGFzaC5vOiBoYXNoLmMKLWlucHV0LWZpbGUubzogaW5wdXQtZmlsZS5jIGlucHV0LWZpbGUuaAotaW5wdXQtc2NydWIubzogaW5wdXQtc2NydWIuYyBpbnB1dC1maWxlLmggc2IuaAotbGlzdGluZy5vOiBsaXN0aW5nLmMgaW5wdXQtZmlsZS5oIHN1YnNlZ3MuaAotbGl0ZXJhbC5vOiBsaXRlcmFsLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLW1hY3JvLm86IG1hY3JvLmMgc2IuaCBtYWNyby5oCi1tZXNzYWdlcy5vOiBtZXNzYWdlcy5jCi1vdXRwdXQtZmlsZS5vOiBvdXRwdXQtZmlsZS5jIG91dHB1dC1maWxlLmgKLXJlYWQubzogcmVhZC5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIHNiLmggbWFjcm8uaCBcCi0gIGVjb2ZmLmgKLXNiLm86IHNiLmMgc2IuaAotc3RhYnMubzogc3RhYnMuYyAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCBlY29mZi5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotc3Vic2Vncy5vOiBzdWJzZWdzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLXN5bWJvbHMubzogc3ltYm9scy5jICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi13cml0ZS5vOiB3cml0ZS5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIG91dHB1dC1maWxlLmgKLWdhc3AubzogZ2FzcC5jIHNiLmggbWFjcm8uaAotZS1pMzg2Y29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmNvZmYuYyBlbXVsLmggXAotICBlbXVsLXRhcmdldC5oCi1lLWkzODZlbGYubzogJChzcmNkaXIpL2NvbmZpZy9lLWkzODZlbGYuYyBlbXVsLmggZW11bC10YXJnZXQuaAotZS1taXBzZWNvZmYubzogJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlY29mZi5jIGVtdWwuaCBcCi0gIGVtdWwtdGFyZ2V0LmgKLWUtbWlwc2VsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2VsZi5jIGVtdWwuaCBlbXVsLXRhcmdldC5oCi0kKE9CSlMpOiAkKERFUF9AdGFyZ2V0X2NwdV90eXBlQF9Ab2JqX2Zvcm1hdEApCi0kKFRBUkdfQ1BVX08pOiAkKFRDREVQX0B0YXJnZXRfY3B1X3R5cGVAX0BvYmpfZm9ybWF0QCkKLSQoT0JKX0ZPUk1BVF9PKTogJChPQkpERVBfQHRhcmdldF9jcHVfdHlwZUBfQG9ial9mb3JtYXRAKQotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2dhcy9ORVdTIGIvZ2FzL05FV1MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDQwNzYuLjAwMDAwMDAKLS0tIGEvZ2FzL05FV1MKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLSotIHRleHQgLSotCi0KLUNoYW5nZXMgaW4gMi4xMDoKLQotU3VwcG9ydCBmb3IgdGhlIE1vdG9yb2xsYSBNQ29yZSAyMTAgcHJvY2Vzc29yIGFkZGVkLgotCi1BIG5ldyBwc2V1ZG8tb3AgLmludGVsX3N5bnRheCBoYXMgYmVlbiBpbXBsZW1lbnRlZCB0byBhbGxvdyBnYXMgdG8gcGFyc2UgaTM4NiBhc3NlbWJseQotcHJvZ3JhbXMgd2l0aCBpbnRlbCBzeW50YXguCi0KLU5ldyBwc2V1ZG8tb3BzIC5mdW5jLC5lbmRmdW5jIHRvIGFpZCBpbiBkZWJ1Z2dpbmcgdXNlci13cml0dGVuIGFzc2VtYmxlciBjb2RlLgotCi1GdWxsIDE2LWJpdCBtb2RlIHN1cHBvcnQgZm9yIGkzODYuCi0KLUdyZWF0bHkgaW1wcm92ZWQgaW5zdHJ1Y3Rpb24gb3BlcmFuZCBjaGVja2luZyBmb3IgaTM4Ni4gIFRoaXMgY2hhbmdlIHdpbGwKLXByb2R1Y2UgZXJyb3JzIG9yIHdhcm5pbmdzIG9uIGluY29ycmVjdCBhc3NlbWJseSBjb2RlIHRoYXQgcHJldmlvdXMgdmVyc2lvbnMgb2YKLWdhcyBhY2NlcHRlZC4gIElmIHlvdSBnZXQgdW5leHBlY3RlZCBtZXNzYWdlcyBmcm9tIGNvZGUgdGhhdCB3b3JrZWQgd2l0aCBvbGRlcgotdmVyc2lvbnMgb2YgZ2FzLCBwbGVhc2UgZG91YmxlIGNoZWNrIHRoZSBjb2RlIGJlZm9yZSByZXBvcnRpbmcgYSBidWcuCi0KLVdlYWsgc3ltYm9sIHN1cHBvcnQgYWRkZWQgZm9yIENPRkYgdGFyZ2V0cy4KLQotTWl0c3ViaXNoaSBEMzBWIHN1cHBvcnQgYWRkZWQuCi0KLVRleGFzIEluc3RydW1lbnRzIGM4MCAodG1zMzIwYzgwKSBzdXBwb3J0IGFkZGVkLgotCi1DaGFuZ2VzIGluIDIuOToKLQotVGV4YXMgSW5zdHJ1bWVudHMgYzMwICh0bXMzMjBjMzApIHN1cHBvcnQgYWRkZWQuCi0KLVRoZSBhc3NlbWJsZXIgbm93IG9wdGltaXplcyB0aGUgZXhjZXB0aW9uIGZyYW1lIGluZm9ybWF0aW9uIGdlbmVyYXRlZCBieSBlZ2NzCi1hbmQgZ2NjIDIuOC4gIFRoZSBuZXcgLS10cmFkaXRpb25hbC1mb3JtYXQgb3B0aW9uIGRpc2FibGVzIHRoaXMgb3B0aW1pemF0aW9uLgotCi1BZGRlZCAtLWdzdGFicyBvcHRpb24gdG8gZ2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCi1UaGUgLWEgb3B0aW9uIHRha2VzIGEgbmV3IHN1Ym9wdGlvbiwgbSAoZS5nLiwgLWFsbSkgdG8gZXhwYW5kIG1hY3JvcyBpbiBhCi1saXN0aW5nLgotCi1BZGRlZCAtTUQgb3B0aW9uIHRvIHByaW50IGRlcGVuZGVuY2llcy4KLQotQ2hhbmdlcyBpbiAyLjg6Ci0KLUJlT1Mgc3VwcG9ydCBhZGRlZC4KLQotTUlQUzE2IHN1cHBvcnQgYWRkZWQuCi0KLU1vdG9yb2xhIENvbGRGaXJlIDUyMDAgc3VwcG9ydCBhZGRlZCAoY29uZmlndXJlIGZvciBtNjhrIGFuZCB1c2UgLW01MjAwKS4KLQotQWxwaGEvVk1TIHN1cHBvcnQgYWRkZWQuCi0KLW02OGsgb3B0aW9ucyAtLWJhc2Utc2l6ZS1kZWZhdWx0LTE2LCAtLWJhc2Utc2l6ZS1kZWZhdWx0LTMyLAotLS1kaXNwLXNpemUtZGVmYXVsdC0xNiwgYW5kIC0tZGlzcC1zaXplLWRlZmF1bHQtMzIgYWRkZWQuCi0KLVRoZSBhbGlnbm1lbnQgZGlyZWN0aXZlcyBub3cgdGFrZSBhbiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudCwgd2hpY2ggaXMgdGhlCi1tYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBza2lwLiAgSWYgZG9pbmcgdGhlIGFsaWdubWVudCB3b3VsZCByZXF1aXJlIHNraXBwaW5nCi1tb3JlIHRoYW4gdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcywgdGhlIGFsaWdubWVudCBpcyBub3QgZG9uZSBhdCBhbGwuCi0KLVRoZSBFTEYgYXNzZW1ibGVyIGhhcyBhIG5ldyBwc2V1ZG8tb3AsIC5zeW12ZXIsIHVzZWQgZm9yIHN5bWJvbCB2ZXJzaW9uaW5nLgotCi1UaGUgLWEgb3B0aW9uIHRha2VzIGEgbmV3IHN1Ym9wdGlvbiwgYyAoZS5nLiwgLWFsYyksIHRvIHNraXAgZmFsc2UgY29uZGl0aW9uYWxzCi1pbiBsaXN0aW5ncy4KLQotQWRkZWQgbmV3IHBzZXVkby1vcCwgLmVxdWl2OyBpdCdzIGxpa2UgLmVxdSwgZXhjZXB0IHRoYXQgaXQgaXMgYW4gZXJyb3IgaWYgdGhlCi1zeW1ib2wgaXMgYWxyZWFkeSBkZWZpbmVkLgotCi1DaGFuZ2VzIGluIDIuNzoKLQotVGhlIFBvd2VyUEMgYXNzZW1ibGVyIG5vdyBhbGxvd3MgdGhlIHVzZSBvZiBzeW1ib2xpYyByZWdpc3RlciBuYW1lcyAocjAsIGV0Yy4pCi1pZiAtbXJlZ25hbWVzIGlzIHVzZWQuICBTeW1ib2xpYyBuYW1lcyBwcmVjZWRlZCBieSBhICclJyAoJXIwLCBldGMuKSBjYW4gYmUKLXVzZWQgYW55IHRpbWUuICBQb3dlclBDIDg2MCBtb3ZlIHRvL2Zyb20gU1BSIGluc3RydWN0aW9ucyBoYXZlIGJlZW4gYWRkZWQuCi0KLUFscGhhIExpbnV4IChFTEYpIHN1cHBvcnQgYWRkZWQuCi0KLVBvd2VyUEMgRUxGIHN1cHBvcnQgYWRkZWQuCi0KLW02OGsgTGludXggKEVMRikgc3VwcG9ydCBhZGRlZC4KLQotaTk2MCBIeC9KeCBzdXBwb3J0IGFkZGVkLgotCi1pMzg2L1Bvd2VyUEMgZ251LXdpbjMyIHN1cHBvcnQgYWRkZWQuCi0KLVNDTyBFTEYgc3VwcG9ydCBhZGRlZC4gIEZvciBPcGVuU2VydmVyIDUgdGFyZ2V0cyAoaTM4Ni11bmtub3duLXNjbzMuMnY1KSB0aGUKLWRlZmF1bHQgaXMgdG8gYnVpbGQgQ09GRi1vbmx5IHN1cHBvcnQuICBUbyBnZXQgYSBzZXQgb2YgdG9vbHMgdGhhdCBnZW5lcmF0ZSBFTEYKLSh0aGV5J2xsIHVuZGVyc3RhbmQgYm90aCBDT0ZGIGFuZCBFTEYpLCB5b3UgbXVzdCBjb25maWd1cmUgd2l0aAotdGFyZ2V0PWkzODYtdW5rbm93bi1zY28zLjJ2NWVsZi4KLQotbTg4ay1tb3Rvcm9sYS1zeXN2Myogc3VwcG9ydCBhZGRlZC4KLQotQ2hhbmdlcyBpbiAyLjY6Ci0KLUdhcyBub3cgZGlyZWN0bHkgc3VwcG9ydHMgbWFjcm9zLCB3aXRob3V0IHJlcXVpcmluZyBHQVNQLgotCi1HYXMgbm93IGhhcyBhbiBNUkkgYXNzZW1ibGVyIGNvbXBhdGliaWxpdHkgbW9kZS4gIFVzZSAtTSBvciAtLW1yaSB0byBzZWxlY3QgTVJJCi1tb2RlLiAgVGhlIHBzZXVkby1vcCBgYC5tcmkgMScnIHdpbGwgc3dpdGNoIGludG8gdGhlIE1SSSBtb2RlIHVudGlsIHRoZSBgYC5tcmkKLTAnJyBpcyBzZWVuOyB0aGlzIGNhbiBiZSBjb252ZW5pZW50IGZvciBpbmxpbmUgYXNzZW1ibGVyIGNvZGUuCi0KLUFkZGVkIC0tZGVmc3ltIFNZTT1WQUxVRSBvcHRpb24uCi0KLUFkZGVkIC1taXBzNCBzdXBwb3J0IHRvIE1JUFMgYXNzZW1ibGVyLgotCi1BZGRlZCBQSUMgc3VwcG9ydCB0byBTb2xhcmlzIGFuZCBTUEFSQyBTdW5PUyA0IGFzc2VtYmxlci4KLQotQ2hhbmdlcyBpbiAyLjQ6Ci0KLUNvbnZlcnRlZCB0aGlzIGRpcmVjdG9yeSB0byB1c2UgYW4gYXV0b2NvbmYtZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLUFSTSBzdXBwb3J0LCBmcm9tIFJpY2hhcmQgRWFybnNoYXcuCi0KLVVwZGF0ZWQgVk1TIHN1cHBvcnQsIGZyb20gUGF0IFJhbmtpbiwgaW5jbHVkaW5nIGNvbnNpZGVyYWJseSBpbXByb3ZlZCBkZWJ1Z2dpbmcKLXN1cHBvcnQuCi0KLVN1cHBvcnQgZm9yIHRoZSBjb250cm9sIHJlZ2lzdGVycyBpbiB0aGUgNjgwNjAuCi0KLUhhbmRsZXMgKGlnbm9yZXMpIGEgbmV3IGRpcmVjdGl2ZSAiLnRoaXNfR0NDX3JlcXVpcmVzX3RoZV9HTlVfYXNzZW1ibGVyIiwgdG8KLXByb3ZpZGUgZm9yIHBvc3NpYmxlIGZ1dHVyZSBnY2MgY2hhbmdlcywgZm9yIHRhcmdldHMgd2hlcmUgZ2FzIHByb3ZpZGVzIHNvbWUKLWZlYXR1cmVzIG5vdCBhdmFpbGFibGUgaW4gdGhlIG5hdGl2ZSBhc3NlbWJsZXIuICBJZiB0aGUgbmF0aXZlIGFzc2VtYmxlciBpcwotdXNlZCwgaXQgc2hvdWxkIGJlY29tZSBvYnZpb3VzIHByZXR0eSBxdWlja2x5IHdoYXQgdGhlIHByb2JsZW0gaXMuCi0KLVVzYWdlIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIHdpdGggIi0taGVscCIuCi0KLVRoZSBHTlUgQXNzZW1ibGVyIFByZXByb2Nlc3NvciAoZ2FzcCkgaXMgaW5jbHVkZWQuICAoQWN0dWFsbHksIGl0IHdhcyBpbiAyLjMKLWFsc28sIGJ1dCBkaWRuJ3QgZ2V0IGludG8gdGhlIE5FV1MgZmlsZS4pCi0KLVdlYWsgc3ltYm9sIHN1cHBvcnQgZm9yIGEub3V0LgotCi1BIGJ1ZyBpbiB0aGUgbGlzdGluZyBjb2RlIHdoaWNoIGNvdWxkIGNhdXNlIGFuIGluZmluaXRlIGxvb3AgaGFzIGJlZW4gZml4ZWQuCi1CdWdzIGluIGxpc3RpbmdzIHdoZW4gZ2VuZXJhdGluZyBhIENPRkYgb2JqZWN0IGZpbGUgaGF2ZSBhbHNvIGJlZW4gZml4ZWQuCi0KLUluaXRpYWwgaTM4Ni1zdnI0IFBJQyBpbXBsZW1lbnRhdGlvbiBmcm9tIEVyaWMgWW91bmdkYWxlLCBiYXNlZCBvbiBjb2RlIGJ5IFBhdWwKLUtyYW5lbmJ1cmcuCi0KLUltcHJvdmVkIEFscGhhIHN1cHBvcnQuICBJbW1lZGlhdGUgY29uc3RhbnRzIGNhbiBoYXZlIGEgbXVjaCBsYXJnZXIgcmFuZ2Ugbm93LgotU3VwcG9ydCBmb3IgdGhlIDIxMTY0IGhhcyBiZWVuIGNvbnRyaWJ1dGVkIGJ5IERpZ2l0YWwuCi0KLVVwZGF0ZWQgbnMzMmsgKHBjNTMyLW1hY2gsIG5ldGJzZDUzMikgc3VwcG9ydCBmcm9tIElhbiBEYWxsLgotCi1DaGFuZ2VzIGluIDIuMzoKLQotTWFjaCBpMzg2IHN1cHBvcnQsIGJ5IERhdmlkIE1hY2tlbnppZSBhbmQgS2VuIFJhZWJ1cm4uCi0KLVJTLzYwMDAgYW5kIFBvd2VyUEMgc3VwcG9ydCBieSBJYW4gVGF5bG9yLgotCi1WTVMgY29tbWFuZCBzY3JpcHRzIChtYWtlLWdhcy5jb20sIGNvbmZpZy1nYXMuY29tKSBoYXZlIGJlZW4gd29ya2VkIG9uIGEgYml0LAotYmFzZWQgb24gbWFpbCByZWNlaXZlZCBmcm9tIHZhcmlvdXMgcGVvcGxlLiAgVGhlIGAtaCMnIG9wdGlvbiBzaG91bGQgd29yayBhZ2FpbgotdG9vLgotCi1IUC1QQSB3b3JrLCBieSBKZWZmIExhdy4gIE5vdGUsIGZvciB0aGUgUEEsIGdhcy0yLjMgaGFzIGJlZW4gZGVzaWduZWQgdG8gd29yawotd2l0aCBnZGItNC4xMiBhbmQgZ2NjLTIuNi4gIEFzIGdjYy0yLjYgaGFzIG5vdCBiZWVuIHJlbGVhc2VkIHlldCwgYSBzcGVjaWFsCi12ZXJzaW9uIG9mIGdjYy0yLjUuOCBoYXMgYmVlbiBwYXRjaGVkIHRvIHdvcmsgd2l0aCBnYXMtMi4zLiAgWW91IGNhbiByZXRyaWV2ZQotdGhpcyBzcGVjaWFsIHZlcnNpb24gb2YgZ2NjLTIuNS44IHZpYSBhbm9ueW1vdXMgZnRwIGZyb20gamFndWFyLmNzLnV0YWguZWR1Ci1pbiB0aGUgImRpc3QiIGRpcmVjdG9yeS4KLQotVmF4IHN1cHBvcnQgaW4gZ2FzIGZpeGVkIGZvciBCU0QsIHNvIGl0IGJ1aWxkcyBhbmQgc2VlbXMgdG8gcnVuIGEgY291cGxlIHNpbXBsZQotdGVzdHMgb2theS4gIEkgaGF2ZW4ndCBwdXQgaXQgdGhyb3VnaCBleHRlbnNpdmUgdGVzdGluZy4gIChHTlUgbWFrZSBpcwotY3VycmVudGx5IHJlcXVpcmVkIGZvciBCU0QgNC4zIGJ1aWxkcy4pCi0KLVN1cHBvcnQgZm9yIHRoZSBERUMgQWxwaGEsIHJ1bm5pbmcgT1NGLzEgKEVDT0ZGIGZvcm1hdCkuICBUaGUgZ2FzIHN1cHBvcnQgaXMKLWJhc2VkIG9uIGNvZGUgZG9uYXRlZCBieSBDTVUsIHdoaWNoIHVzZWQgYW4gYS5vdXQtYmFzZWQgZm9ybWF0LiAgSSdtIGFmcmFpZCB0aGUKLWFscGhhLWEub3V0IHN1cHBvcnQgaXMgcHJldHR5IGJhZGx5IG1hbmdsZWQsIGFuZCBtdWNoIG9mIGl0IHJlbW92ZWQ7IG1ha2luZyBpdAotd29yayB3aWxsIHJlcXVpcmUgcmV3cml0aW5nIGl0IGFzIEJGRCBzdXBwb3J0IGZvciB0aGUgZm9ybWF0IGFueXdheXMuCi0KLUlyaXggNSBzdXBwb3J0LgotCi1UaGUgdGVzdCBzdWl0ZXMgaGF2ZSBiZWVuIGZpeGVkIHVwIGEgYml0LCBzbyB0aGF0IHRoZXkgc2hvdWxkIHdvcmsgd2l0aCBhCi1jb3VwbGUgZGlmZmVyZW50IHZlcnNpb25zIG9mIGV4cGVjdCBhbmQgZGVqYWdudS4KLQotU3ltYm9scycgdmFsdWVzIGFyZSBub3cgaGFuZGxlZCBpbnRlcm5hbGx5IGFzIGV4cHJlc3Npb25zLCBwZXJtaXR0aW5nIG1vcmUKLWZsZXhpYmlsaXR5IGluIGV2YWx1YXRpbmcgdGhlbSBpbiBzb21lIGNhc2VzLiAgU29tZSBkZXRhaWxzIG9mIHJlbG9jYXRpb24KLWhhbmRsaW5nIGhhdmUgYWxzbyBjaGFuZ2VkLCBhbmQgc2ltcGxlIGNvbnN0YW50IHBvb2wgbWFuYWdlbWVudCBoYXMgYmVlbiBhZGRlZCwKLXRvIG1ha2UgdGhlIEFscGhhIHBvcnQgZWFzaWVyLgotCi1OZXcgb3B0aW9uICItLXN0YXRpc3RpY3MiIGZvciBwcmludGluZyBvdXQgcHJvZ3JhbSBydW4gdGltZXMuICBUaGlzIGlzIGludGVuZGVkCi10byBiZSB1c2VkIHdpdGggdGhlIGdjYyAiLVEiIG9wdGlvbiwgd2hpY2ggcHJpbnRzIG91dCB0aW1lcyBzcGVudCBpbiB2YXJpb3VzCi1waGFzZXMgb2YgY29tcGlsYXRpb24uICAoWW91IHNob3VsZCBiZSBhYmxlIHRvIGdldCBhbGwgb2YgdGhlbSBwcmludGVkIG91dCB3aXRoCi0iZ2NjIC1RIC1XYSwtLXN0YXRpc3RpY3MiLCBJIHRoaW5rLikKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DaGFuZ2VzIGluIDIuMjoKLQotUlMvNjAwMCBBSVggYW5kIE1JUFMgU0dJIElyaXggNSBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLgotCi1Db25maWd1cmF0aW9ucyB0aGF0IGFyZSBzdGlsbCBpbiBkZXZlbG9wbWVudCAoYW5kIHRoZXJlZm9yZSBhcmUgY29udmVuaWVudCB0bwotaGF2ZSBsaXN0ZWQgaW4gY29uZmlndXJlLmluKSBzdGlsbCBnZXQgcmVqZWN0ZWQgd2l0aG91dCBhIG1pbm9yIGNoYW5nZSB0bwotZ2FzL01ha2VmaWxlLmluLCBzbyBwZW9wbGUgbm90IGRvaW5nIGRldmVsb3BtZW50IHdvcmsgc2hvdWxkbid0IGdldCB0aGUKLWltcHJlc3Npb24gdGhhdCBzdXBwb3J0IGZvciBzdWNoIGNvbmZpZ3VyYXRpb25zIGlzIGFjdHVhbGx5IGJlbGlldmVkIHRvIGJlCi1yZWxpYWJsZS4KLQotVGhlIHByb2dyYW0gbmFtZSAodXN1YWxseSAiYXMiKSBpcyBwcmludGVkIHdoZW4gYSBmYXRhbCBlcnJvciBtZXNzYWdlIGlzCi1kaXNwbGF5ZWQuICBUaGlzIHNob3VsZCBwcmV2ZW50IHNvbWUgY29uZnVzaW9uIGFib3V0IHRoZSBzb3VyY2Ugb2Ygb2NjYXNpb25hbAotbWVzc2FnZXMgYWJvdXQgImludGVybmFsIGVycm9ycyIuCi0KLUVMRiBzdXBwb3J0IGlzIGZhbGxpbmcgaW50byBwbGFjZS4gIFN1cHBvcnQgZm9yIHRoZSAzODYgc2hvdWxkIGJlIHdvcmtpbmcuCi1TdXBwb3J0IGZvciBTUEFSQyBTb2xhcmlzIGlzIGluLiAgSFBQQSBzdXBwb3J0IGZyb20gVXRhaCBpcyBiZWluZyBpbnRlZ3JhdGVkLgotCi1TeW1ib2wgdmFsdWVzIGFyZSBtYWludGFpbmVkIGFzIGV4cHJlc3Npb25zIGluc3RlYWQgb2YgYmVpbmcgaW1tZWRpYXRlbHkgYm9pbGVkCi1kb3duIHRvIGFkZC1zeW1ib2wsIHN1Yi1zeW1ib2wsIGFuZCBjb25zdGFudC4gIFRoaXMgcGVybWl0cyBzbGlnaHRseSBtb3JlCi1jb21wbGV4IGNhbGN1bGF0aW9ucyBpbnZvbHZpbmcgc3ltYm9scyB3aG9zZSB2YWx1ZXMgYXJlIG5vdCBhbHJlYWRleSBrbm93bi4KLQotREJYLXN0eWxlIGRlYnVnZ2luZyBpbmZvICgic3RhYnMiKSBpcyBub3cgc3VwcG9ydGVkIGZvciBDT0ZGIGZvcm1hdHMuCi1JZiBhbnkgc3RhYnMgZGlyZWN0aXZlcyBhcmUgc2VlbiBpbiB0aGUgc291cmNlLCBHQVMgd2lsbCBjcmVhdGUgdHdvIG5ldwotc2VjdGlvbnM6IGEgIi5zdGFiIiBhbmQgYSAiLnN0YWJzdHIiIHNlY3Rpb24uICBUaGUgZm9ybWF0IG9mIHRoZSAuc3RhYgotc2VjdGlvbiBpcyBuZWFybHkgaWRlbnRpY2FsIHRvIHRoZSBhLm91dCBzeW1ib2wgZm9ybWF0LCBhbmQgLnN0YWJzdHIgaXMKLWl0cyBzdHJpbmcgdGFibGUuICBGb3IgdGhpcyB0byBiZSB1c2VmdWwsIHlvdSBtdXN0IGhhdmUgY29uZmlndXJlZCBHQ0MKLXRvIGdlbmVyYXRlIHN0YWJzIChieSBkZWZpbmluZyBEQlhfREVCVUdHSU5HX0lORk8pLCBhbmQgbXVzdCBoYXZlIGEgR0RCCi10aGF0IGNhbiB1c2UgdGhlIHN0YWIgc2VjdGlvbnMgKDQuMTEgb3IgbGF0ZXIpLgotCi1MeW54T1MsIG9uIGkzODYgYW5kIG02OGsgcGxhdGZvcm1zLCBpcyBub3cgc3VwcG9ydGVkLiAgU1BBUkMgTHlueE9TCi1zdXBwb3J0IGlzIGluIHByb2dyZXNzLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNoYW5nZXMgaW4gMi4xOgotCi1TZXZlcmFsIHNtYWxsIGZpeGVzIGZvciBpMzg2LWFpeCAoUFMvMikgc3VwcG9ydCBmcm9tIE1pbmggVHJhbi1MZSBoYXZlIGJlZW4KLWluY29ycG9yYXRlZCwgYnV0IG5vdCB3ZWxsIHRlc3RlZCB5ZXQuCi0KLUFsdGVyZWQgdGhlIG9wY29kZSB0YWJsZSBzcGxpdCBmb3IgbTY4azsgaXQgc2hvdWxkIHJlcXVpcmUgbGVzcyBWTSB0byBjb21waWxlCi13aXRoIGdjYyBub3cuCi0KLVNvbWUgbWlub3IgYWRqdXN0bWVudHMgdG8gYWRkIChDb252ZXJnZW50IFRlY2hub2xvZ2llcycpIE1pbmlmcmFtZSBzdXBwb3J0LAotc3VnZ2VzdGVkIGJ5IFJvbmFsZCBDb2xlLgotCi1IUFBBIHN1cHBvcnQgKHJ1bm5pbmcgT1NGIG9ubHksIG5vdCBIUFVYKSBoYXMgYmVlbiBjb250cmlidXRlZCBieSBVdGFoLiAgVGhpcwotaW5jbHVkZXMgaW1wcm92ZWQgRUxGIHN1cHBvcnQsIHdoaWNoIEkndmUgc3RhcnRlZCBhZGFwdGluZyBmb3IgU1BBUkMgU29sYXJpcwotMi54LiAgSW50ZWdyYXRpb24gaXNuJ3QgY29tcGxldGVseSwgc28gaXQgcHJvYmFibHkgd29uJ3Qgd29yay4KLQotSFA5MDAwLzMwMCBzdXBwb3J0LCBkb25hdGVkIGJ5IEhQLCBoYXMgYmVlbiBtZXJnZWQgaW4uCi0KLUlhbiBUYXlsb3IgaGFzIGZpbmlzaGVkIHRoZSBNSVBTIEVDT0ZGIChVbHRyaXgsIElyaXgpIHN1cHBvcnQuCi0KLUJldHRlciBlcnJvciBtZXNzYWdlcyBmb3IgdW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbnMgKGUuZy4sIGhwcGEtaHB1eCkuCi0KLVRlc3Qgc3VpdGUgZnJhbWV3b3JrIGlzIHN0YXJ0aW5nIHRvIGJlY29tZSByZWFzb25hYmxlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNoYW5nZXMgaW4gMi4wOgotCi1Nb3N0bHkgYnVnIGZpeGVzLgotCi1Tb21lIG1vcmUgbWVyZ2luZyBvZiBCRkQgYW5kIEVMRiBjb2RlLCBidXQgRUxGIHN0aWxsIGRvZXNuJ3Qgd29yay4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DaGFuZ2VzIGluIDEuOTQ6Ci0KLUJGRCBtZXJnZSBpcyBwYXJ0bHkgZG9uZS4gIEFkdmVudHVyb3VzIHNvdWxzIG1heSB0cnkgZ2l2aW5nIGNvbmZpZ3VyZSB0aGUKLSItLXdpdGgtYmZkLWFzc2VtYmxlciIgb3B0aW9uLiAgQ3VycmVudGx5LCBFTEYgZm9ybWF0IHJlcXVpcmVzIGl0LCBhLm91dCBmb3JtYXQKLWFjY2VwdHMgaXQ7IFNQQVJDIENQVSBhY2NlcHRzIGl0LiAgSXQncyB0aGUgZGVmYXVsdCBvbmx5IGZvciBPUyAiZWxmIiBvcgotInNvbGFyaXMiLiAgKEVMRiBpc24ndCByZWFsbHkgc3VwcG9ydGVkIHlldC4gIEl0IG5lZWRzIHdvcmsuICBJJ3ZlIGdvdCBzb21lCi1jb2RlIGZyb20gVXRhaCBmb3IgSFAtUEEgRUxGLCBhbmQgZnJvbSBERyBmb3IgbTg4ayBFTEYsIGJ1dCB0aGV5J3JlIG5vdCBmdWxseQotbWVyZ2VkIHlldC4pCi0KLVRoZSA2OEsgb3Bjb2RlIHRhYmxlIGhhcyBiZWVuIHNwbGl0IGluIGhhbGYuICBJdCBzaG91bGQgbm93IGNvbXBpbGUgdW5kZXIgZ2NjCi13aXRob3V0IGNvbnN1bWluZyByaWRpY3Vsb3VzIGFtb3VudHMgb2YgbWVtb3J5LgotCi1BIGNvdXBsZSBkYXRhIHN0cnVjdHVyZXMgaGF2ZSBiZWVuIHJlZHVjZWQgaW4gc2l6ZS4gIFRoaXMgc2hvdWxkIHJlc3VsdCBpbgotc2F2aW5nIGEgbGl0dGxlIGJpdCBvZiBzcGFjZSBhdCBydW50aW1lLgotCi1TdXBwb3J0IGZvciBNSVBTLCBmcm9tIE9TRiBhbmQgUmFscGggQ2FtcGJlbGwsIGhhcyBiZWVuIG1lcmdlZCBpbi4gIFRoZSBPU0YKLWNvZGUgcHJvdmlkZWQgUk9TRSBmb3JtYXQgc3VwcG9ydCwgd2hpY2ggSSBoYXZlbid0IG1lcmdlZCBpbiB5ZXQuICAoSSBjYW4gbWFrZQotaXQgYXZhaWxhYmxlLCBpZiBhbnlvbmUgd2FudHMgdG8gdHJ5IGl0IG91dC4pICBSYWxwaCdzIGNvZGUsIGZvciBCU0QgNC40LAotc3VwcG9ydHMgYS5vdXQgZm9ybWF0LiAgV2UgZG9uJ3QgaGF2ZSBFQ09GRiBzdXBwb3J0IGluIGp1c3QgeWV0OyBpdCdzIGNvbWluZy4KLQotU3VwcG9ydCBmb3IgdGhlIEhpdGFjaGkgSDgvNTAwIGhhcyBiZWVuIGFkZGVkLgotCi1WTVMgaG9zdCBhbmQgdGFyZ2V0IHN1cHBvcnQgc2hvdWxkIGJlIHdvcmtpbmcgbm93LCB0aGFua3MgY2hpZWZseSB0byBFcmljCi1Zb3VuZ2RhbGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2hhbmdlcyBpbiAxLjkzLjAxOgotCi1Gb3IgbTY4aywgc3VwcG9ydCBmb3IgbW9yZSBwcm9jZXNzb3JzIGhhcyBiZWVuIGFkZGVkOiA2ODA0MCwgQ1BVMzIsIDY4ODUxLgotCi1Gb3IgaTM4NiwgLmFsaWduIGlzIG5vdyBwb3dlci1vZi10d287IHdhcyBudW1iZXItb2YtYnl0ZXMuCi0KLUZvciBtNjhrLCAiJSIgaXMgbm93IGFjY2VwdGVkIGJlZm9yZSByZWdpc3RlciBuYW1lcy4gIEZvciBDT0ZGIGZvcm1hdCwgd2hpY2gKLWRvZXNuJ3QgdXNlIHVuZGVyc2NvcmUgcHJlZml4ZXMgZm9yIEMgbGFiZWxzLCBpdCBpcyByZXF1aXJlZCwgc28gdmFyaWFibGUgImEwIgotY2FuIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSB0aGUgcmVnaXN0ZXIuCi0KLUxhc3QgcHVibGljIHJlbGVhc2Ugd2FzIDEuMzguICBMb3RzIG9mIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBzaW5jZSB0aGVuLCBsb3RzCi1vZiBuZXcgQ1BVcyBhbmQgZm9ybWF0cywgbG90cyBvZiBidWdzIGZpeGVkLgotCi0MCi1Mb2NhbCB2YXJpYWJsZXM6Ci1maWxsLWNvbHVtbjogNzkKLUVuZDoKZGlmZiAtLWdpdCBhL2dhcy9SRUFETUUgYi9nYXMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWMyN2RiLi4wMDAwMDAwCi0tLSBhL2dhcy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotCQlSRUFETUUgZm9yIEdBUwotCi1BIG51bWJlciBvZiB0aGluZ3MgaGF2ZSBjaGFuZ2VkIHNpbmNlIHZlcnNpb24gMSBhbmQgdGhlIHdvbmRlcmZ1bCB3b3JsZCBvZiBnYXMKLWxvb2tzIHZlcnkgZGlmZmVyZW50LiAgVGhlcmUncyBzdGlsbCBhIGxvdCBvZiBpcnJlbGV2YW50IGdhcmJhZ2UgbHlpbmcgYXJvdW5kCi10aGF0IHdpbGwgYmUgY2xlYW5lZCB1cCBpbiB0aW1lLiAgRG9jdW1lbnRhdGlvbiBpcyBzY2FyY2UsIGFzIGFyZSBsb2dzIG9mIHRoZQotY2hhbmdlcyBtYWRlIHNpbmNlIHRoZSBsYXN0IGdhcyByZWxlYXNlLiAgTXkgYXBvbG9naWVzLCBhbmQgSSdsbCB0cnkgdG8gZ2V0Ci1zb21ldGhpbmcgdXNlZnVsLgotCi1VbnBhY2tpbmcgYW5kIEluc3RhbGxhdGlvbiAtIFN1bW1hcnkKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1TZWUgLi4vYmludXRpbHMvUkVBRE1FLgotCi1UbyBidWlsZCBqdXN0IHRoZSBhc3NlbWJsZXIsIG1ha2UgdGhlIHRhcmdldCBhbGwtZ2FzLgotCi1Eb2N1bWVudGF0aW9uCi09PT09PT09PT09PT09Ci0KLVRoZSBHQVMgcmVsZWFzZSBpbmNsdWRlcyB0ZXhpbmZvIHNvdXJjZSBmb3IgaXRzIG1hbnVhbCwgd2hpY2ggY2FuIGJlIHByb2Nlc3NlZAotaW50byBgaW5mbycgb3IgYGR2aScgZm9ybXMuCi0KLVRoZSBEVkkgZm9ybSBpcyBzdWl0YWJsZSBmb3IgcHJpbnRpbmcgb3IgZGlzcGxheWluZzsgdGhlIGNvbW1hbmRzIGZvciBkb2luZwotdGhpcyB2YXJ5IGZyb20gc3lzdGVtIHRvIHN5c3RlbS4gIE9uIG1hbnkgc3lzdGVtcywgYGxwciAtZCcgd2lsbCBwcmludCBhIERWSQotZmlsZS4gIE9uIG90aGVycywgeW91IG1heSBuZWVkIHRvIHJ1biBhIHByb2dyYW0gc3VjaCBhcyBgZHZpcHMnIHRvIGNvbnZlcnQgdGhlCi1EVkkgZmlsZSBpbnRvIGEgZm9ybSB5b3VyIHN5c3RlbSBjYW4gcHJpbnQuCi0KLUlmIHlvdSB3aXNoIHRvIGJ1aWxkIHRoZSBEVkkgZmlsZSwgeW91IHdpbGwgbmVlZCB0byBoYXZlIFRlWCBpbnN0YWxsZWQgb24geW91cgotc3lzdGVtLiAgWW91IGNhbiByZWJ1aWxkIGl0IGJ5IHR5cGluZzoKLQotCWNkIGdhcy9kb2MKLQltYWtlIGFzLmR2aQotCi1UaGUgSW5mbyBmb3JtIGlzIHZpZXdhYmxlIHdpdGggdGhlIEdOVSBFbWFjcyBgaW5mbycgc3Vic3lzdGVtLCBvciB0aGUKLXN0YW5kYWxvbmUgYGluZm8nIHByb2dyYW0sIGF2YWlsYWJsZSBhcyBwYXJ0IG9mIHRoZSBHTlUgVGV4aW5mbyBkaXN0cmlidXRpb24uCi1UbyBidWlsZCB0aGUgaW5mbyBmaWxlcywgeW91IHdpbGwgbmVlZCB0aGUgYG1ha2VpbmZvJyBwcm9ncmFtLiAgVHlwZToKLQotCWNkIGdhcy9kb2MKLQltYWtlIGluZm8KLQotU3BlY2lmeWluZyBuYW1lcyBmb3IgaG9zdHMgYW5kIHRhcmdldHMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgIFRoZSBzcGVjaWZpY2F0aW9ucyB1c2VkIGZvciBob3N0cyBhbmQgdGFyZ2V0cyBpbiB0aGUgYGNvbmZpZ3VyZScKLXNjcmlwdCBhcmUgYmFzZWQgb24gYSB0aHJlZS1wYXJ0IG5hbWluZyBzY2hlbWUsIGJ1dCBzb21lIHNob3J0Ci1wcmVkZWZpbmVkIGFsaWFzZXMgYXJlIGFsc28gc3VwcG9ydGVkLiAgVGhlIGZ1bGwgbmFtaW5nIHNjaGVtZSBlbmNvZGVzCi10aHJlZSBwaWVjZXMgb2YgaW5mb3JtYXRpb24gaW4gdGhlIGZvbGxvd2luZyBwYXR0ZXJuOgotCi0gICAgIEFSQ0hJVEVDVFVSRS1WRU5ET1ItT1MKLQotICAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIHRoZSBhbGlhcyBgc3VuNCcgYXMgYSBIT1NUIGFyZ3VtZW50IG9yIGluIGEKLWAtLXRhcmdldD1UQVJHRVQnIG9wdGlvbi4gIFRoZSBlcXVpdmFsZW50IGZ1bGwgbmFtZSBpcwotYHNwYXJjLXN1bi1zdW5vczQnLgotCi0gICBUaGUgYGNvbmZpZ3VyZScgc2NyaXB0IGFjY29tcGFueWluZyBHQVMgZG9lcyBub3QgcHJvdmlkZSBhbnkgcXVlcnkKLWZhY2lsaXR5IHRvIGxpc3QgYWxsIHN1cHBvcnRlZCBob3N0IGFuZCB0YXJnZXQgbmFtZXMgb3IgYWxpYXNlcy4gCi1gY29uZmlndXJlJyBjYWxscyB0aGUgQm91cm5lIHNoZWxsIHNjcmlwdCBgY29uZmlnLnN1YicgdG8gbWFwCi1hYmJyZXZpYXRpb25zIHRvIGZ1bGwgbmFtZXM7IHlvdSBjYW4gcmVhZCB0aGUgc2NyaXB0LCBpZiB5b3Ugd2lzaCwgb3IKLXlvdSBjYW4gdXNlIGl0IHRvIHRlc3QgeW91ciBndWVzc2VzIG9uIGFiYnJldmlhdGlvbnMtLWZvciBleGFtcGxlOgotCi0gICAgICUgc2ggY29uZmlnLnN1YiBzdW40Ci0gICAgIHNwYXJjLXN1bi1zdW5vczQxMQotICAgICAlIHNoIGNvbmZpZy5zdWIgc3VuMwotICAgICBtNjhrLXN1bi1zdW5vczQxMQotICAgICAlIHNoIGNvbmZpZy5zdWIgZGVjc3RhdGlvbgotICAgICBtaXBzLWRlYy11bHRyaXg0MgotICAgICAlIHNoIGNvbmZpZy5zdWIgaHAzMDBic2QKLSAgICAgbTY4ay1ocC1ic2QKLSAgICAgJSBzaCBjb25maWcuc3ViIGkzODZ2Ci0gICAgIGkzODYtdW5rbm93bi1zeXN2Ci0gICAgICUgc2ggY29uZmlnLnN1YiBpNzg2dgotICAgICBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gYGk3ODZ2JzogbWFjaGluZSBgaTc4NnYnIG5vdCByZWNvZ25pemVkCi0KLQotYGNvbmZpZ3VyZScgb3B0aW9ucwotPT09PT09PT09PT09PT09PT09PQotCi0gICBIZXJlIGlzIGEgc3VtbWFyeSBvZiB0aGUgYGNvbmZpZ3VyZScgb3B0aW9ucyBhbmQgYXJndW1lbnRzIHRoYXQgYXJlCi1tb3N0IG9mdGVuIHVzZWZ1bCBmb3IgYnVpbGRpbmcgR0FTLiAgYGNvbmZpZ3VyZScgYWxzbyBoYXMgc2V2ZXJhbCBvdGhlcgotb3B0aW9ucyBub3QgbGlzdGVkIGhlcmUuCi0KLSAgICAgY29uZmlndXJlIFstLWhlbHBdCi0gICAgICAgICAgICAgICBbLS1wcmVmaXg9RElSXQotICAgICAgICAgICAgICAgWy0tc3JjZGlyPVBBVEhdCi0gICAgICAgICAgICAgICBbLS1ob3N0PUhPU1RdCi0gICAgICAgICAgICAgICBbLS10YXJnZXQ9VEFSR0VUXQotICAgICAgICAgICAgICAgWy0td2l0aC1PUFRJT05dCi0gICAgICAgICAgICAgICBbLS1lbmFibGUtT1BUSU9OXQotCi1Zb3UgbWF5IGludHJvZHVjZSBvcHRpb25zIHdpdGggYSBzaW5nbGUgYC0nIHJhdGhlciB0aGFuIGAtLScgaWYgeW91Ci1wcmVmZXI7IGJ1dCB5b3UgbWF5IGFiYnJldmlhdGUgb3B0aW9uIG5hbWVzIGlmIHlvdSB1c2UgYC0tJy4KLQotYC0taGVscCcKLSAgICAgUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIGBjb25maWd1cmUnLCBhbmQgZXhpdC4KLQotYC1wcmVmaXg9RElSJwotICAgICBDb25maWd1cmUgdGhlIHNvdXJjZSB0byBpbnN0YWxsIHByb2dyYW1zIGFuZCBmaWxlcyB1bmRlciBkaXJlY3RvcnkKLSAgICAgYERJUicuCi0KLWAtLXNyY2Rpcj1QQVRIJwotICAgICBMb29rIGZvciB0aGUgcGFja2FnZSdzIHNvdXJjZSBjb2RlIGluIGRpcmVjdG9yeSBESVIuICBVc3VhbGx5Ci0gICAgIGBjb25maWd1cmUnIGNhbiBkZXRlcm1pbmUgdGhhdCBkaXJlY3RvcnkgYXV0b21hdGljYWxseS4KLQotYC0taG9zdD1IT1NUJwotICAgICBDb25maWd1cmUgR0FTIHRvIHJ1biBvbiB0aGUgc3BlY2lmaWVkIEhPU1QuICBOb3JtYWxseSB0aGUKLSAgICAgY29uZmlndXJlIHNjcmlwdCBjYW4gZmlndXJlIHRoaXMgb3V0IGF1dG9tYXRpY2FsbHkuCi0KLSAgICAgVGhlcmUgaXMgbm8gY29udmVuaWVudCB3YXkgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIGFsbCBhdmFpbGFibGUKLSAgICAgaG9zdHMuCi0KLWAtLXRhcmdldD1UQVJHRVQnCi0gICAgIENvbmZpZ3VyZSBHQVMgZm9yIGNyb3NzLWFzc2VtYmxpbmcgcHJvZ3JhbXMgZm9yIHRoZSBzcGVjaWZpZWQKLSAgICAgVEFSR0VULiAgV2l0aG91dCB0aGlzIG9wdGlvbiwgR0FTIGlzIGNvbmZpZ3VyZWQgdG8gYXNzZW1ibGUgLm8gZmlsZXMKLSAgICAgdGhhdCBydW4gb24gdGhlIHNhbWUgbWFjaGluZSAoSE9TVCkgYXMgR0FTIGl0c2VsZi4KLQotICAgICBUaGVyZSBpcyBubyBjb252ZW5pZW50IHdheSB0byBnZW5lcmF0ZSBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZQotICAgICB0YXJnZXRzLgotCi1gLS1lbmFibGUtT1BUSU9OJwotICAgICBUaGVzZSBmbGFncyB0ZWxsIHRoZSBwcm9ncmFtIG9yIGxpYnJhcnkgYmVpbmcgY29uZmlndXJlZCB0byAKLSAgICAgY29uZmlndXJlIGl0c2VsZiBkaWZmZXJlbnRseSBmcm9tIHRoZSBkZWZhdWx0IGZvciB0aGUgc3BlY2lmaWVkCi0gICAgIGhvc3QvdGFyZ2V0IGNvbWJpbmF0aW9uLiAgU2VlIGJlbG93IGZvciBhIGxpc3Qgb2YgYC0tZW5hYmxlJwotICAgICBvcHRpb25zIHJlY29nbml6ZWQgaW4gdGhlIGdhcyBkaXN0cmlidXRpb24uCi0KLWBjb25maWd1cmUnIGFjY2VwdHMgb3RoZXIgb3B0aW9ucywgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBjb25maWd1cmluZwotb3RoZXIgR05VIHRvb2xzIHJlY3Vyc2l2ZWx5OyBidXQgdGhlc2UgYXJlIHRoZSBvbmx5IG9wdGlvbnMgdGhhdCBhZmZlY3QKLUdBUyBvciBpdHMgc3VwcG9ydGluZyBsaWJyYXJpZXMuCi0KLVRoZSBgLS1lbmFibGUnIG9wdGlvbnMgcmVjb2duaXplZCBieSBzb2Z0d2FyZSBpbiB0aGUgZ2FzIGRpc3RyaWJ1dGlvbiBhcmU6Ci0KLWAtLWVuYWJsZS10YXJnZXRzPS4uLicKLSAgICAgVGhpcyBjYXVzZXMgb25lIG9yIG1vcmUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb25zIHRvIGJlIGFkZGVkIHRvIHRob3NlIGZvcgotICAgICB3aGljaCBCRkQgc3VwcG9ydCBpcyBjb21waWxlZC4gIEN1cnJlbnRseSBnYXMgY2Fubm90IHVzZSBhbnkgZm9ybWF0IG90aGVyCi0gICAgIHRoYW4gaXRzIGNvbXBpbGVkLWluIGRlZmF1bHQsIHNvIHRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bC4KLQotYC0tZW5hYmxlLWJmZC1hc3NlbWJsZXInCi0gICAgIFRoaXMgY2F1c2VzIHRoZSBhc3NlbWJsZXIgdG8gdXNlIHRoZSBuZXcgY29kZSBiZWluZyBtZXJnZWQgaW50byBpdCB0byB1c2UKLSAgICAgQkZEIGRhdGEgc3RydWN0dXJlcyBpbnRlcm5hbGx5LCBhbmQgdXNlIEJGRCBmb3Igd3JpdGluZyBvYmplY3QgZmlsZXMuCi0gICAgIEZvciBtb3N0IHRhcmdldHMsIHRoaXMgaXNuJ3Qgc3VwcG9ydGVkIHlldC4gIEZvciBtb3N0IHRhcmdldHMgd2hlcmUgaXQgaGFzCi0gICAgIGJlZW4gZG9uZSwgaXQncyBhbHJlYWR5IHRoZSBkZWZhdWx0LiAgU28gZ2VuZXJhbGx5IHlvdSB3b24ndCBuZWVkIHRvIHVzZQotICAgICB0aGlzIG9wdGlvbi4KLQotU3VwcG9ydGVkIHBsYXRmb3JtcwotPT09PT09PT09PT09PT09PT09PQotCi1BdCB0aGlzIHBvaW50IEkgYmVsaWV2ZSBnYXMgdG8gYmUgYW5zaSBvbmx5IGNvZGUgZm9yIG1vc3QgdGFyZ2V0IGNwdSdzLiAgVGhhdAotaXMsIHRoZXJlIHNob3VsZCBiZSByZWxhdGl2ZWx5IGZldywgaWYgYW55IGhvc3Qgc3lzdGVtIGRlcGVuZGVuY2llcy4gIFNvCi1wb3J0aW5nIChhcyBhIGNyb3NzLWFzc2VtYmxlcikgdG8gaG9zdHMgbm90IHlldCBzdXBwb3J0ZWQgc2hvdWxkIGJlIGZhaXJseQotZWFzeS4gIFBvcnRpbmcgdG8gYSBuZXcgdGFyZ2V0IHNob3VsZG4ndCBiZSB0b28gdG91Z2ggaWYgaXQncyBhIHZhcmlhbnQgb2Ygb25lCi1hbHJlYWR5IHN1cHBvcnRlZC4KLQotTmF0aXZlIGFzc2VtYmxpbmcgc2hvdWxkIHdvcmsgb246Ci0KLQlzdW4zCi0Jc3VuNAotCTM4NmJzZAotCWJzZC8zODYKLQlkZWx0YSAobTY4ay1zeXN2IGZyb20gTW90b3JvbGEpCi0JZGVsdGE4OCAobTg4ay1zeXN2IGZyb20gTW90b3JvbGEpCi0JR05VL2xpbnV4Ci0JbTY4ayBocHV4IDguMCAoaHB1eCA3LjAgbWF5IGJlIGEgcHJvYmxlbSkKLQl2YXggYnNkLCB1bHRyaXgsIHZtcwotCWhwOTAwMHMzMDAKLQlkZWNzdGF0aW9uCi0JaXJpeCA0Ci0JaXJpeCA1Ci0JbWluaWZyYW1lIChtNjhrLXN5c3YgZnJvbSBDb252ZXJnZW50IFRlY2hub2xvZ2llcykKLQlpMzg2LWFpeCAocHMvMikKLQlocHBhIChocHV4IDQuM2JzZCwgb3NmMSkKLQlBSVgKLQl1bml4d2FyZQotCXNjbyAzLjJ2NC4yCi0Jc2NvIG9wZW5zZXJ2ZXIgNS4wIChhLmsuYS4gMy4ydjUuMCApCi0Jc3BhcmMgc29sYXJpcwotCW5zMzJrIChuZXRic2QsIGxpdGVzKQotCi1JIGJlbGlldmUgdGhhdCBnYXMgYXMgYSBjcm9zcy1hc3NlbWJsZXIgY2FuIGN1cnJlbnRseSBiZSB0YXJnZXR0ZWQgZm9yCi1tb3N0IG9mIHRoZSBhYm92ZSBob3N0cywgcGx1cwotCi0JZGVjc3RhdGlvbi1ic2QgKGEub3V0IGZvcm1hdCwgdG8gYmUgdXNlZCBpbiBCU0QgNC40KQotCWVibW9uMjlrCi0JZ28zMiAoRE9TIG9uIGkzODYsIHdpdGggREpHUFAgLS0gb2xkIGEub3V0IHZlcnNpb24pCi0JaDgvMzAwLCBoOC81MDAgKEhpdGFjaGkpCi0JaTM4Ni1haXggKHBzLzIpCi0JaTk2MC1jb2ZmCi0JbWlwcyBlY29mZiAoZGVjc3RhdGlvbi11bHRyaXgsIGlyaXMsIG1pcHMgbWFnbnVtLCBtaXBzLWlkdC1lY29mZikKLQlNaXRzdWJpc2hpIGQxMHYgYW5kIGQzMHYKLQluaW5keTk2MAotCXBvd2VycGMgRUFCSQotCVNIIChIaXRhY2hpKQotCXNjbzM4NgotCVRJIHRpYzMwIGFuZCB0aWM4MAotCXZheCBic2Qgb3IgdWx0cml4PwotCXZtcwotCXZ4d29ya3M2OGsKLQl2eHdvcmtzOTYwCi0JejgwMDAgKFppbG9nKQotCi1NSVBTIEVDT0ZGIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQsIGJ1dCBHQVMgd2lsbCBub3QgcnVuIGEgQy1zdHlsZQotcHJlcHJvY2Vzc29yLiAgSWYgeW91IHdhbnQgdGhhdCwgcmVuYW1lIHlvdXIgZmlsZSB0byBoYXZlIGEgIi5TIiBzdWZmaXgsIGFuZAotcnVuIGdjYyBvbiBpdC4gIE9yIHJ1biAiZ2NjIC14YXNzZW1ibGVyLXdpdGgtY3BwIGZvby5zIi4KLQotU3VwcG9ydCBmb3IgRUxGIHNob3VsZCB3b3JrIG5vdyBmb3Igc3BhcmMsIGhwcGEsIGkzODYsIGFscGhhLCBtNjhrLAotTUlQUywgcG93ZXJwYy4KLQotU3VwcG9ydCBmb3Igc2VxdWVudCAobnMzMmspLCB0YWhvZSwgaTg2MCwgbTg4ayBtYXkgYmUgc3VmZmVyaW5nIGZyb20gYml0cm90LgotCi1JZiB5b3UgdHJ5IG91dCBnYXMgb24gc29tZSBob3N0IG9yIHRhcmdldCBub3QgbGlzdGVkIGFib3ZlLCBwbGVhc2UgbGV0IG1lIGtub3cKLXRoZSByZXN1bHRzLCBzbyBJIGNhbiB1cGRhdGUgdGhlIGxpc3QuCi0KLUNvbXBpbGVyIFN1cHBvcnQgSGFja3MKLT09PT09PT09PT09PT09PT09PT09PT0KLQotT24gYSBmZXcgdGFyZ2V0cywgdGhlIGFzc2VtYmxlciBoYXMgYmVlbiBtb2RpZmllZCB0byBzdXBwb3J0IGEgZmVhdHVyZQotdGhhdCBpcyBwb3RlbnRpYWxseSB1c2VmdWwgd2hlbiBhc3NlbWJsaW5nIGNvbXBpbGVyIG91dHB1dCwgYnV0IHdoaWNoCi1tYXkgY29uZnVzZSBhc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtbWVycy4gIElmIGFzc2VtYmxlciBlbmNvdW50ZXJzIGEKLS53b3JkIHBzZXVkby1vcCBvZiB0aGUgZm9ybSBzeW1ib2wxLXN5bWJvbDIgKHRoZSBkaWZmZXJlbmNlIG9mIHR3bwotc3ltYm9scyksIGFuZCB0aGUgZGlmZmVyZW5jZSBvZiB0aG9zZSB0d28gc3ltYm9scyB3aWxsIG5vdCBmaXQgaW4gMTYKLWJpdHMsIHRoZSBhc3NlbWJsZXIgd2lsbCBjcmVhdGUgYSBicmFuY2ggYXJvdW5kIGEgbG9uZyBqdW1wIHRvCi1zeW1ib2wxLCBhbmQgaW5zZXJ0IHRoaXMgaW50byB0aGUgb3V0cHV0IGRpcmVjdGx5IGJlZm9yZSB0aGUgbmV4dAotbGFiZWw6IFRoZSAud29yZCB3aWxsIChpbnN0ZWFkIG9mIGNvbnRhaW5pbmcgZ2FyYmFnZSwgb3IgZ2l2aW5nIGFuCi1lcnJvciBtZXNzYWdlKSBjb250YWluICh0aGUgYWRkcmVzcyBvZiB0aGUgbG9uZyBqdW1wKS1zeW1ib2wyLiAgVGhpcwotYWxsb3dzIHRoZSBhc3NlbWJsZXIgdG8gYXNzZW1ibGUganVtcCB0YWJsZXMgdGhhdCBqdW1wIHRvIGxvY2F0aW9ucwotdmVyeSBmYXIgYXdheSBpbnRvIGNvZGUgdGhhdCB3b3JrcyBwcm9wZXJseS4gIElmIHRoZSBuZXh0IGxhYmVsIGlzCi1tb3JlIHRoYW4gMzJLIGF3YXkgZnJvbSB0aGUgLndvcmQsIHlvdSBsb3NlIChzaWxlbnRseSk7IFJNUyBjbGFpbXMKLXRoaXMgd2lsbCBuZXZlciBoYXBwZW4uICBJZiB0aGUgLUsgb3B0aW9uIGlzIGdpdmVuLCB5b3Ugd2lsbCBnZXQgYQotd2FybmluZyBtZXNzYWdlIHdoZW4gdGhpcyBoYXBwZW5zLgotCi0KLVJFUE9SVElORyBCVUdTIElOIEdBUwotPT09PT09PT09PT09PT09PT09PT09Ci0KLUJ1Z3MgaW4gZ2FzIHNob3VsZCBiZSByZXBvcnRlZCB0byBidWctZ251LXV0aWxzQGdudS5vcmcuICBUaGV5IG1heSBiZQotY3Jvc3MtcG9zdGVkIHRvIGJ1Zy1nY2MgaWYgdGhleSBhZmZlY3QgdGhlIHVzZSBvZiBnYXMgd2l0aCBnY2MuICBUaGV5Ci1zaG91bGQgbm90IGJlIHJlcG9ydGVkIGp1c3QgdG8gYnVnLWdjYywgc2luY2UgSSBkb24ndCByZWFkIHRoYXQgbGlzdCwKLWFuZCB0aGVyZWZvcmUgd291bGRuJ3Qgc2VlIHRoZW0uCi0KLUlmIHlvdSByZXBvcnQgYSBidWcgaW4gR0FTLCBwbGVhc2UgcmVtZW1iZXIgdG8gaW5jbHVkZToKLQotQSBkZXNjcmlwdGlvbiBvZiBleGFjdGx5IHdoYXQgd2VudCB3cm9uZywgYW5kIGV4YWN0bHkgd2hhdCBzaG91bGQgaGF2ZQotaGFwcGVuZWQgaW5zdGVhZC4KLQotVGhlIHR5cGUgb2YgbWFjaGluZSAoVkFYLCA2ODAyMCwgZXRjKSBhbmQgb3BlcmF0aW5nIHN5c3RlbSAoQlNELCBTdW5PUywgRFlOSVgsCi1WTVMsIGV0YykgR0FTIHdhcyBydW5uaW5nIG9uLgotCi1UaGUgY29uZmlndXJhdGlvbiBuYW1lKHMpIGdpdmVuIHRvIHRoZSAiY29uZmlndXJlIiBzY3JpcHQuICBUaGUKLSJjb25maWcuc3RhdHVzIiBmaWxlIHNob3VsZCBoYXZlIHRoaXMgaW5mb3JtYXRpb24uCi0KLVRoZSBvcHRpb25zIGdpdmVuIHRvIEdBUyBhdCBydW4gdGltZS4KLQotVGhlIGFjdHVhbCBpbnB1dCBmaWxlIHRoYXQgY2F1c2VkIHRoZSBwcm9ibGVtLgotCi1JdCBpcyBzaWxseSB0byByZXBvcnQgYSBidWcgaW4gR0FTIHdpdGhvdXQgaW5jbHVkaW5nIGFuIGlucHV0IGZpbGUgZm9yIEdBUy4KLURvbid0IGFzayB1cyB0byBnZW5lcmF0ZSB0aGUgZmlsZSBqdXN0IGJlY2F1c2UgeW91IG1hZGUgaXQgZnJvbSBmaWxlcyB5b3UKLXRoaW5rIHdlIGhhdmUgYWNjZXNzIHRvLgotCi0xLiBZb3UgbWlnaHQgYmUgbWlzdGFrZW4uCi0yLiBJdCBtaWdodCB0YWtlIHVzIGEgbG90IG9mIHRpbWUgdG8gaW5zdGFsbCB0aGluZ3MgdG8gcmVnZW5lcmF0ZSB0aGF0IGZpbGUuCi0zLiBXZSBtaWdodCBnZXQgYSBkaWZmZXJlbnQgZmlsZSBmcm9tIHRoZSBvbmUgeW91IGdvdCwgYW5kIG1pZ2h0IG5vdCBzZWUgYW55Ci0gICBidWcuCi0KLVRvIHNhdmUgdXMgdGhlc2UgZGVsYXlzIGFuZCB1bmNlcnRhaW50aWVzLCBhbHdheXMgc2VuZCB0aGUgaW5wdXQgZmlsZSBmb3IgdGhlCi1wcm9ncmFtIHRoYXQgZmFpbGVkLiAgQSBzbWFsbGVyIHRlc3QgY2FzZSB0aGF0IGRlbW9uc3RyYXRlcyB0aGUgcHJvYmxlbSBpcyBvZgotY291cnNlIHByZWZlcmFibGUsIGJ1dCBiZSBzdXJlIGl0IGlzIGEgY29tcGxldGUgaW5wdXQgZmlsZSwgYW5kIHRoYXQgaXQgcmVhbGx5Ci1kb2VzIGRlbW9uc3RyYXRlIHRoZSBwcm9ibGVtOyBidXQgaWYgcGFyaW5nIGl0IGRvd24gd291bGQgY2F1c2UgbGFyZ2UgZGVsYXlzCi1pbiBmaWxpbmcgdGhlIGJ1ZyByZXBvcnQsIGRvbid0IGJvdGhlci4KLQotSWYgdGhlIGlucHV0IGZpbGUgaXMgdmVyeSBsYXJnZSwgYW5kIHlvdSBhcmUgb24gdGhlIGludGVybmV0LCB5b3UgbWF5IHdhbnQgdG8KLW1ha2UgaXQgYXZhbGlhYmxlIGZvciBhbm9ueW1vdXMgRlRQIGluc3RlYWQgb2YgbWFpbGluZyBpdC4gIElmIHlvdSBkbywgaW5jbHVkZQotaW5zdHJ1Y3Rpb25zIGZvciBGVFAnaW5nIGl0IGluIHlvdXIgYnVnIHJlcG9ydC4KLQotSWYgeW91IGV4cGVjdCB0byBiZSBjb250cmlidXRpbmcgYSBsYXJnZSBudW1iZXIgb2YgdGVzdCBjYXNlcywgaXQgd291bGQgYmUKLWhlbHBmdWwgaWYgeW91IHdvdWxkIGxvb2sgYXQgdGhlIHRlc3Qgc3VpdGUgaW5jbHVkZWQgaW4gdGhlIHJlbGVhc2UgKGJhc2VkIG9uCi10aGUgRGVqYSBHbnUgdGVzdGluZyBmcmFtZXdvcmssIGF2YWlsYWJsZSBmcm9tIHRoZSB1c3VhbCBmdHAgc2l0ZXMpIGFuZCB3cml0ZQotdGVzdCBjYXNlcyB0byBmaXQgaW50byB0aGF0IGZyYW1ld29yay4gIFRoaXMgaXMgY2VydGFpbmx5IG5vdCByZXF1aXJlZC4KZGlmZiAtLWdpdCBhL2dhcy9SRUFETUUtdm1zIGIvZ2FzL1JFQURNRS12bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NmM2MDMuLjAwMDAwMDAKLS0tIGEvZ2FzL1JFQURNRS12bXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotCVRoaXMgZG9jdW1lbnQgZXhwbGFpbnMgYSBjb3VwbGUgb2YgdGhpbmdzIHRoYXQgYXJlIHNwZWNpZmljIHRvIFZNUy4KLVRoZXJlIGFyZSBjdXJyZW50bHkgdHdvICJjaGFwdGVycyIsIHRoZSBmaXJzdCBkZWFscyB3aXRoIGNyb3NzLWFzc2VtYmx5IAotaXNzdWVzLCBhbmQgdGhlIHNlY29uZCBkZWFscyB3aXRoIHRoZSBWTVMgZGVidWdnZXIgYW5kIEdOVS1DQy4KLQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqIE5vdGVzIGZvciBDcm9zcyBBc3NlbWJseSB3aXRoIFZNUyAqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlJZiB5b3Ugd2lzaCB0byBidWlsZCBnYXMgb24gYSBub24tVk1TIHN5c3RlbSB0byBjcm9zcy1hc3NlbWJsZSwgCi15b3Ugc2hvdWxkIHVzZToKLQotY29uZmlndXJlICR7aG9zdHR5cGV9IC10YXJnZXQ9dm1zCi0KLWFuZCB0aGVuIGZvbGxvdyB0aGUgdXN1YWwgcHJvY2VkdXJlLiAgVGhlIG9iamVjdCBmaWxlcyBnZW5lcmF0ZWQgb24KLVVuaXggd2lsbCBiZSBjb3JyZWN0IGZyb20gYSBiaW5hcnkgcG9pbnQgb2YgdmlldywgYnV0IHRoZSByZWFsIHRyaWNrIGlzCi1nZXR0aW5nIHRoZW0gdG8gdGhlIFZNUyBtYWNoaW5lLiAgVGhlIGZvcm1hdCBvZiB0aGUgb2JqZWN0IGZpbGUgaXMKLWEgdmFyaWFibGUtbGVuZ3RoIHJlY29yZCwgYnV0IGVhY2ggcmVjb3JkIGNvbnRhaW5zIGJpbmFyeSBkYXRhLiAgZ2FzCi13cml0ZXMgdGhlIHJlY29yZHMgaW4gdGhlIHNhbWUgZm9ybWF0IHRoYXQgVk1TIHdvdWxkIGV4cGVjdCwKLW5hbWVseSBhIHR3by1ieXRlIGNvdW50IGZvbGxvd2VkIGJ5IHRoYXQgbnVtYmVyIG9mIGJ5dGVzLgotCi0JSWYgeW91IHRyeSB0byBjb3B5IHRoZSBmaWxlIHRvIGEgVk1TIHN5c3RlbSB1c2luZyBmdHAsIHRoZSBmdHAKLXByb3RvY29sIHdpbGwgc2NyZXcgdXAgdGhlIGZpbGUgYnkgbG9va2luZyBmb3IgbnVsbHMgKHJlY29yZCB0ZXJtaW5hdG9yIGZvcgotdW5peCkgYW5kIGl0IHdpbGwgaW5zZXJ0IGl0J3Mgb3duIHJlY29yZCB0ZXJtaW5hdG9ycyBhdCB0aGF0IHBvaW50LiAgVGhpcwotd2lsbCBvYnZpb3VzbHkgY29ycnVwdCB0aGUgZmlsZS4gCi0KLQlJZiB5b3UgdHJ5IHRvIHRyYW5zZmVyIHRoZSBmaWxlIHdpdGggZnRwIGluIGJpbmFyeSBtb2RlLCB0aGUKLWZpbGUgaXRzZWxmIHdpbGwgbm90IGJlIGNvcnJ1cHQsIGJ1dCBWTVMgd2lsbCB0aGluayB0aGF0IHRoZSBmaWxlIGNvbnRhaW5zCi1maXhlZC1sZW5ndGggcmVjb3JkcyBvZiA1MTIgYnl0ZXMuICBZb3UgY2FuIHVzZSB0aGUgcHVibGljLWRvbWFpbiBGSUxFIAotdXRpbGl0eSB0byBjaGFuZ2UgdGhpcyB3aXRoIGEgY29tbWFuZCBsaWtlOgotCi0kRklMRSBmb28uby90eXBlPXZhcmlhYmxlCi0KLUlmIHlvdSBkbyBub3QgaGF2ZSB0aGlzIHV0aWxpdHkgYXZhaWxhYmxlLCB0aGUgZm9sbG93aW5nIHByb2dyYW0gY2FuIGJlIAotdXNlZCB0byBwZXJmb3JtIHRoaXMgdGFzazoKLQotCSNpbmNsdWRlIDxmYWIuaD4KLQkKLQkjZGVmaW5lIFJNRSRDX1NFVFJGTSAxCi0JIAotCXN0cnVjdCBGQUIgKiBmYWI7Ci0JCi0JbWFpbihpbnQgYXJnYywgY2hhciAqIGFyZ3ZbXSl7Ci0JCWludCBpLCBzdGF0dXM7Ci0JCWZhYiA9IChzdHJ1Y3QgRkFCKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgRkFCKSk7Ci0JCSpmYWIgPSBjYyRybXNfZmFiOwkvKiBpbml0aWFsaXplIEZBQiovCi0JCWZhYi0+ZmFiJGJfZmFjID0gRkFCJE1fUFVUOwotCQlmYWItPmZhYiRsX2ZvcCB8PSBGQUIkTV9FU0M7Ci0JCWZhYi0+ZmFiJGxfY3R4ID0gUk1FJENfU0VUUkZNOwotCQlmYWItPmZhYiR3X2lmaSA9IDA7Ci0JCWZvcihpPTE7aTxhcmdjO2krKyl7Ci0JCSAgcHJpbnRmKCJTZXR0aW5nICVzIHRvIHZhcmlhYmxlIGxlbmd0aCByZWNvcmRzLlxuIixhcmd2W2ldKTsKLQkJICBmYWItPmZhYiRsX2ZuYSA9IGFyZ3ZbaV07Ci0JICAgICAgIAkgIGZhYi0+ZmFiJGJfZm5zID0gc3RybGVuKGFyZ3ZbaV0pOwotCQkgIHN0YXR1cyA9IHN5cyRvcGVuKGZhYiwwLDApOwotCQkgIGlmKChzdGF0dXMgJiA3KSAhPSAxKSBsaWIkc2lnbmFsKHN0YXR1cyk7Ci0JCSAgZmFiLT5mYWIkYl9yZm0gPSBGQUIkQ19WQVI7Ci0JCSAgc3RhdHVzID0gc3lzJG1vZGlmeShmYWIsMCwwKTsKLQkJICBpZigoc3RhdHVzICYgNykgIT0gMSkgbGliJHNpZ25hbChzdGF0dXMpOwotCQkgIHN0YXR1cyA9IHN5cyRjbG9zZShmYWIsMCwwKTsKLQkJICBpZigoc3RhdHVzICYgNykgIT0gMSkgbGliJHNpZ25hbChzdGF0dXMpOwotCQl9OwotCX0KLQotCUlmIHlvdSBoYXZlIE5GUyBydW5uaW5nIG9uIHRoZSBWTVMgc3lzdGVtLCB3aGF0IHlvdSBuZWVkIHRvIGRvCi1kZXBlbmRzIHVwb24gd2hpY2ggTkZTIHNvZnR3YXJlIHlvdSBhcmUgcnVubmluZyBvbiB0aGUgVk1TIHN5c3RlbS4gIFRoZXJlCi1hcmUgYSBudW1iZXIgb2YgZGlmZmVyZW50IFRDUC9JUCBwYWNrYWdlcyBmb3IgVk1TIGF2YWlsYWJsZSwgYW5kIG9ubHkgdmVyeQotbGltaXRlZCB0ZXN0aW5nIGhhcyBiZWVuIHBlcmZvcm1lZC4gICBJbiB0aGUgdGVzdHMgdGhhdCBoYXMgYmVlbiBkb25lIHNvCi1mYXIsIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSB3aWxsIGFsd2F5cyBiZSBjb3JyZWN0IHdoZW4gdHJhbnNmZXJyaW5nIHRoZQotZmlsZSB2aWEgTkZTLCBidXQgdGhlIHJlY29yZCBhdHRyaWJ1dGVzIG1heSBvciBtYXkgbm90IGJlIGNvcnJlY3QuIAotCi0JT25lIHByb3ByaWV0YXJ5IFRDUC9JUC9ORlMgcGFja2FnZSBmb3IgVk1TIGlzIGtub3duIHRvIAotYXV0b21hdGljYWxseSBmaXggdGhlIHJlY29yZCBhdHRyaWJ1dGVzIG9mIHRoZSBvYmplY3QgZmlsZSBpZiB5b3UgTkZTIG1vdW50Ci1hIHVuaXggZGlzayBmcm9tIHRoZSBWTVMgc3lzdGVtLCBhbmQgaWYgdGhlIGZpbGUgaGFzIGEgIi5vYmoiIGV4dGVuc2lvbiBvbgotdGhlIHVuaXggc3lzdGVtLiAgT3RoZXIgVENQL0lQIHBhY2thZ2VzIG1pZ2h0IGRvIHRoaXMgZm9yIHlvdSBhcyB3ZWxsLCBidXQKLXRoZXkgaGF2ZSBub3QgYmVlbiBjaGVja2VkLgotCi1ObyBtYXR0ZXIgd2hhdCBtZXRob2QgeW91IHVzZSB0byBnZXQgdGhlIGZpbGUgdG8gdGhlIFZNUyBzeXN0ZW0sIGl0IGlzCi1hbHdheXMgYSBnb29kIGlkZWEgdG8gY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgdGhlIGNvcnJlY3QgdHlwZSBieQotZG9pbmcgYSAiJGRpci9mdWxsIiBvbiB0aGUgb2JqZWN0IGZpbGUuIFRoZSBkZXNpcmVkIHJlY29yZCBhdHRyaWJ1dGVzIHdpbGwKLWJlICJOb25lIi4gIFVuZGVzaXJhYmxlIHJlY29yZCBhdHRyaWJ1dGVzIHdpbGwgYmUgIlN0cmVhbS1MRiIgb3IgYW55dGhpbmcKLWVsc2UuIAotCi1PbmNlIHlvdSBnZXQgdGhlIGZpbGVzIG9uIHRoZSBWTVMgc3lzdGVtLCB5b3UgY2FuIGNoZWNrIHRoZWlyIGludGVncml0eSAKLXdpdGggdGhlICIkYW5hbC9vYmoiIGNvbW1hbmQuICAoTmF0dXJhbGx5IGF0IHNvbWUgcG9pbnQgeW91IHNob3VsZCByZW5hbWUKLXRoZSAubyBmaWxlcyB0byAub2JqKS4gIEFzIGZhciBhcyB0aGUgZGVidWdnZXIgaXMgY29uY2VybmVkLCB0aGUgcmVjb3JkcyAKLXdpbGwgYmUgY29ycmVjdCwgYnV0IHRoZSBkZWJ1Z2dlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGZpbmQgdGhlIHNvdXJjZSBmaWxlcywKLXNpbmNlIGl0IG9ubHkgaGFzIHRoZSBmaWxlIG5hbWUsIGFuZCBub3QgdGhlIGZ1bGwgZGlyZWN0b3J5IHNwZWNpZmljYXRpb24uCi1Zb3UgbXVzdCBnaXZlIHRoZSBkZWJ1Z2dlciBzb21lIGhlbHAgYnkgdGVsbGluZyBpdCB3aGljaCBkaXJlY3RvcmllcyB0byAKLXNlYXJjaCBmb3IgdGhlIGluZGl2aWR1YWwgZmlsZXMgLSBvbmNlIHlvdSBoYXZlIGRvbmUgdGhpcyB5b3Ugc2hvdWxkIGJlIAotYWJsZSB0byBwcm9jZWVkIG5vcm1hbGx5LgotCi0JSXQgaXMgYSBnb29kIGlkZWEgdG8gdXNlIG5hbWVzIGZvciB5b3VyIGZpbGVzIHdoaWNoIHdpbGwgYmUgdmFsaWQKLXVuZGVyIFZNUywgc2luY2Ugb3RoZXJ3aXNlIHlvdSB3aWxsIGhhdmUgbm8gd2F5IG9mIGdldHRpbmcgdGhlIGRlYnVnZ2VyIHRvCi1maW5kIHRoZSBzb3VyY2UgZmlsZSB3aGVuIGRldWdnaW5nLgotCi1UaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgdGhlIG9iamVjdCBmaWxlIG5vcm1hbGx5IGNvbnRpbnMgc3BlY2lmaWMKLWluZm9ybWF0aW9uIHRoYXQgdGhlIGRlYnVnZ2VyIGNhbiB1c2UgdG8gcG9zaXRpdmVseSBpZGVudGlmeSBhIGZpbGUsIGFuZCBpZgoteW91IGFyZSBhc3NlbWJsaW5nIG9uIGEgdW5peCBzeXN0ZW0gdGhpcyBpbmZvcm1hdGlvbiBzaW1wbHkgZG9lcyBub3QgZXhpc3QKLWluIGEgbWVhbmluZ2Z1bCB3YXkuICBZb3UgbXVzdCBoZWxwIHRoZSBkZWJ1Z2dlciBieSB1c2luZyB0aGUgIlNFVCBGSUxFPSIKLWNvbW1hbmQgdG8gdGVsbCB0aGUgZGVidWdnZXIgd2hlcmUgdG8gbG9vayBmb3Igc291cmNlIGZpbGVzLiBUaGUgZGVidWdnZXIKLXJlY29yZHMgd2lsbCBiZSBjb3JyZWN0LCBleGNlcHQgdGhhdCB0aGUgZGVidWdnZXIgd2lsbCBub3QgYmUgaW5pdGlhbGx5Ci1hYmxlIHRvIGZpbmQgdGhlIHNvdXJjZSBmaWxlcy4gIFlvdSBjYW4gdXNlIHRoZSAiU0VUIEZJTEUiIGNvbW1hbmQgdG8gdGVsbAotdGhlIGRlYnVnZ2VyIHdoZXJlIHRvIGxvb2sgZm9yIHRoZSBzb3VyY2UgZmlsZXMuIAotCi1JIGhhdmUgb25seSB0ZXN0ZWQgdGhpcyB3aXRoIGEgU1ZyNCBpNDg2IG1hY2hpbmUsIGFuZCBldmVyeXRoaW5nIHNlZW1zIHRvCi13b3JrIE9LLCB3aXRoIHRoZSBsaW1pdGVkIHRlc3RpbmcgdGhhdCBJIGhhdmUgZG9uZS4gIE90aGVyIG1hY2hpbmVzIG1heQotb3IgbWF5IG5vdCB3b3JrLiAgWW91IHNob3VsZCByZWFkIHRoZSBjaGFwdGVycyBvbiBjcm9zcy1jb21waWxlcnMgaW4gdGhlIGdjYwotbWFudWFsIGJlZm9yZSBmb29saW5nIHdpdGggdGhpcy4gIFNpbmNlIGdhcyBkb2VzIG5vdCBuZWVkIHRvIGRvIGFueSBmbG9hdGluZwotcG9pbnQgYXJpdGhtZXRpYywgdGhlIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cyB0aGF0IGFyZSBnZW5lcmF0ZWQgaGVyZSBzaG91bGQKLWJlIGNvcnJlY3QgLSB0aGUgb25seSBjb25jZXJuIGlzIHdpdGggY29uc3RhbnQgZm9sZGluZyBpbiB0aGUgbWFpbiBjb21waWxlci4KLVRoZSByYW5nZSBhbmQgcHJlY2lzaW9uIG9mIGZsb2F0cyBhbmQgZG91YmxlcyBhcmUgc2ltaWxhciBvbiB0aGUgNDg2ICh3aXRoIAotYSBidWlsdGluIDgwMzg3KSBhbmQgdGhlIFZBWCwgYWx0aG91Z2ggdGhlcmUgaXMgYSBmYWN0b3Igb2YgMiB0byA0Ci1kaWZmZXJlbmNlIGluIHRoZSByYW5nZS4gIFRoZSBkb3VibGUsIGFzIGltcGxlbWVudGVkIG9uIHRoZSA0ODYsIGlzIHF1aXRlCi1zaW1pbGFyIHRvIHRoZSBHX0ZMT0FUIG9uIHRoZSBWQVguIAotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqIE5vdGVzIGZvciB1c2luZyBHTlUgQ0Mgd2l0aCB0aGUgVk1TIGRlYnVnZ2VyKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQotCTEpIFlvdSBzaG91bGQgYmUgYXdhcmUgdGhhdCBHTlUtQywgYXMgd2l0aCBhbnkgb3RoZXIgZGVjZW50IGNvbXBpbGVyLAotd2lsbCBkbyB0aGluZ3Mgd2hlbiBvcHRpbWl6YXRpb24gaXMgdHVybmVkIG9uIHRoYXQgeW91IG1heSBub3QgZXhwZWN0LiAKLVNvbWV0aW1lcyBpbnRlcm1lZGlhdGUgcmVzdWx0cyBhcmUgbm90IHdyaXR0ZW4gdG8gdmFyaWFibGVzLCBpZiB0aGV5IGFyZSBvbmx5Ci11c2VkIGluIG9uZSBwbGFjZSwgYW5kIHNvbWV0aW1lcyB2YXJpYWJsZXMgdGhhdCBhcmUgbm90IHVzZWQgYXQgYWxsIHdpbGwgbm90IGJlCi13cml0dGVuIHRvIHRoZSBzeW1ib2wgdGFibGUuICBBbHNvLCBwYXJhbWV0ZXJzIHRvIGlubGluZSBmdW5jdGlvbnMgYXJlIG9mdGVuCi1pbmFjY2Vzc2libGUuIFlvdSBjYW4gc2VlIHRoZSBhc3NlbWJseSBjb2RlIGVxdWl2YWxlbnQgYnkgdXNpbmcgS1A3IGluIHRoZQotZGVidWdnZXIsIGFuZCBmcm9tIHRoaXMgeW91IGNhbiB0ZWxsIGlmIGluIGZhY3QgYSB2YXJpYWJsZSBzaG91bGQgaGF2ZSB0aGUKLXZhbHVlIHRoYXQgeW91IGV4cGVjdC4gIFlvdSBjYW4gZmluZCBvdXQgaWYgYSB2YXJpYWJsZSBsaXZlcyB3aXRoaW5nIGEgcmVnaXN0ZXIKLWJ5IGRvaW5nIGEgJ3Nob3cgc3ltYm9sL2FkZHInLgotCi0JMikgT3Zlcmx5IGNvbXBsZXggZGF0YSB0eXBlcywgc3VjaCBhczoKLQotaW50ICgqKCooKigqKCooKiBzYXJyNilbMV0pWzFdKVsyXSlbM10pWzRdKVs1XTsKLQotd2lsbCBub3QgYmUgZGVidWdnZWQgcHJvcGVybHksIHNpbmNlIHRoZSBkZWJ1Z2dpbmcgcmVjb3JkIG92ZXJmbG93cyBhbiBpbnRlcm5hbAotZGVidWdnZXIgYnVmZmVyLiAgZ2NjLWFzIHdpbGwgY29udmVydCB0aGVzZSB0byAqdm9pZCBhcyBmYXIgYXMgdGhlIGRlYnVnZ2VyCi1zeW1ib2wgdGFibGUgaXMgY29uY2VybmVkLCB3aGljaCB3aWxsIGF2b2lkIGFueSBwcm9ibGVtcywgYW5kIHRoZSBhc3NlbWJsZXIKLXdpbGwgZ2l2ZSB5b3UgYSBtZXNzYWdlIGluZm9ybWluZyB5b3UgdGhhdCB0aGlzIGhhcyBoYXBwZW5lZC4KLQotCTMpIFlvdSBtdXN0LCBvZiBjb3Vyc2UsIGNvbXBpbGUgYW5kIGxpbmsgd2l0aCAvZGVidWcuICBJZiB5b3UgbGluawotd2l0aG91dCBkZWJ1ZywgeW91IHN0aWxsIGdldCB0cmFjZWJhY2sgdGFibGUgaW4gdGhlIGV4ZWN1dGFibGUsIGJ1dCB0aGVyZSBpcyBubwotc3ltYm9sIHRhYmxlIGZvciB2YXJpYWJsZXMuCi0KLQk0KSBJbmNsdWRlZCBpbiB0aGUgcGF0Y2hlcyB0byBWTVMuQyBhcmUgZml4ZXMgdG8gdHdvIGJ1Z3MgdGhhdCBhcmUKLXVucmVsYXRlZCB0byB0aGUgY2hhbmdlcyB0aGF0IEkgaGF2ZSBtYWRlLiAgT25lIG9mIHRoZXNlIG1hZGUgaXQgaW1wb3NzaWJsZSB0bwotZGVidWcgc21hbGwgcHJvZ3JhbXMgc29tZXRpbWVzLCBhbmQgdGhlIG90aGVyIGNhdXNlZCB0aGUgZGVidWdnZXIgdG8gYmVjb21lCi1jb25mdXNlZCBhYm91dCB3aGljaCByb3V0aW5lIGl0IHdhcyBpbiwgYW5kIGdpdmUgdGhpcyBpbmNvcnJlY3QgaW5mbyBpbgotdHJhY2ViYWNrcy4KLQotCTUpIElmIHlvdSBhcmUgdXNpbmcgdGhlIEdOVS1DKysgY29tcGlsZXIsIHlvdSBzaG91bGQgbW9kaWZ5IHRoZQotY29tcGlsZXIgZHJpdmVyIGZpbGUgR05VX0NDOlswMDAwMDBdR0NDLkNPTSAob3IgR1hYLkNPTSkuICBJZiB5b3UgaGF2ZSBhCi1zZXBlcmF0ZSBHWFguQ09NLCB0aGVuIHlvdSBuZWVkIHRvIGNoYW5nZSBvbmUgbGluZSBpbiBHWFguQ09NIHRvOgotJCBpZiBmJGxvY2F0ZSgiRCIscDIpIC5uZS4gUDJfTGVuZ3RoIHRoZW4gRGVidWcgPSAiICIiLUcwIiIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpY2UgemVyby0tLT4gIF4KLUlmIHlvdSBhcmUgdXNpbmcgYSBHQ0MuQ09NIHRoYXQgZG9lcyBib3RoIEMgYW5kIEMrKywgYWRkIHRoZSBmb2xsb3dpbmcgbGluZXMgdG8KLUdDQy5DT006Ci0KLSQhCi0kISBVc2Ugb2xkIHN0eWxlIGRlYnVnZ2luZyByZWNvcmRzIGZvciBWTVMKLSQhCi0kIGlmIChEZWJ1Zy5uZXMuIiIgKS5hbmQuIFBsdXMgdGhlbiBEZWJ1ZyA9ICIgIiItRzAiIiIKLQotYWZ0ZXIgdGhlIHZhcmlhYmxlcyBQbHVzIGFuZCBEZWJ1ZyBhcmUgc2V0LiAgVGhlIHJlYXNvbiBmb3IgdGhpcywgaXMgdGhhdCBDKysKLWNvbXBpbGVyIGJ5IGRlZmF1bHQgZ2VuZXJhdGVzIGRlYnVnZ2luZyByZWNvcmRzIHRoYXQgYXJlIG1vcmUgY29tcGxleCwKLXdpdGggbWFueSBuZXcgc3ludGFjdGljYWwgZWxlbWVudHMgdGhhdCBhbGxvdyBmb3IgdGhlIG5ldyBmZWF0dXJlcyBvZiB0aGUKLWxhbmd1YWdlLiAgVGhlIC1HMCBzd2l0Y2ggdGVsbHMgdGhlIEMrKyBjb21waWxlciB0byB1c2UgdGhlIG9sZCBzdHlsZSBkZWJ1Z2dpbmcKLXJlY29yZHMuICBVbnRpbCB0aGUgZGVidWdnZXIgdW5kZXJzdGFuZHMgQysrIHRoZXJlIGlzIG5vdCBhbnkgcG9pbnQgdG8gdHJ5IGFuZAotdXNlIHRoZSBleHBhbmRlZCBzeW50YXguCi0KLQk2KSBXaGVuIHlvdSBoYXZlIG5lc3RlZCBzY29wZXMsIGkuZS46Ci1tYWluKCl7Ci0JaW50IGk7Ci0Je2ludCBpOwotCQl7aW50IGk7Ci19O307fQotYW5kIHlvdSBzYXkgIkVYQU0gaSIgdGhlIGRlYnVnZ2VyIG5lZWRzIHRvIGZpZ3VyZSBvdXQgd2hpY2ggdmFyaWFibGUgeW91Ci1hY3R1YWxseSB3YW50IHRvIHJlZmVyZW5jZS4gIEkgaGF2ZSBhcnJhbmdlZCB0aGluZ3MgdG8gZGVmaW5lIGEgYmxvY2sgdG8gdGhlCi1kZWJ1Z2dlciB3aGVuIHlvdSB1c2UgYnJhY2tldHMgdG8gZW50ZXIgYSBuZXcgc2NvcGUsIHNvIGluIHRoZSBleGFtcGxlIGFib3ZlLAotdGhlIHZhcmlhYmxlcyB3b3VsZCBiZSBkZXNjcmliZWQgYXM6Ci1URVNUXG1haW5caQotVEVTVFxtYWluXCQwXGkKLVRFU1RcbWFpblwkMFwkMFxpCi1BdCBlYWNoIGxldmVsLCB0aGUgYmxvY2sgbmFtZSBpcyBhIG51bWJlciB3aXRoIGEgZG9sbGFyIHNpZ24gcHJlZml4LCB0aGUKLW51bWJlcnMgc3RhcnQgd2l0aCAwIGFuZCBjb3VudCB1cHdhcmQuICBXaGVuIHlvdSBzYXkgRVhBTSBpLCB0aGUgZGVidWdnZXIgbG9va3MKLWF0IHRoZSBjdXJyZW50IFBDLCBhbmQgZGVjaWRlcyB3aGljaCBibG9jayBpdCBpcyBjdXJyZW50bHkgaW4uICBJdCB3b3JrcyBmcm9tCi10aGUgaW5uZXJtb3N0IGxldmVsIG91dHdhcmQgdW50aWwgaXQgZmluZHMgYSBibG9jayB0aGF0IGhhcyB0aGUgdmFyaWFibGUgImkiCi1kZWZpbmVkLiAgWW91IGNhbiBhbHdheXMgc3BlY2lmeSB0aGUgc2NvcGUgZXhwbGljaXRseS4KLQotCTcpICBXaXRoIEMrKywgdGhlcmUgY2FuIGJlIGEgbG90IG9mIGlubGluZSBmdW5jdGlvbnMsIGFuZCBpdCB3b3VsZCBiZQotcmF0aGVyIHJlc3RyaWN0aXZlIHRvIGZvcmNlIHRoZSB1c2VyIHRvIGRlYnVnIHRoZSBwcm9ncmFtIGJ5IGNvbnZlcnRpbmcgYWxsIG9mCi10aGUgaW5saW5lIGZ1bmN0aW9ucyB0byBub3JtYWwgZnVuY3Rpb25zLiAgV2hhdCBJIGhhdmUgZG9uZSBpcyB0byBlc3NlbnRpYWxseQotImFkZCIgKHdpdGggdGhlIGRlYnVnZ2VyKSBzb3VyY2UgbGluZXMgZnJvbSB0aGUgaW5jbHVkZSBmaWxlcyB0aGF0IGNvbnRhaW4gdGhlCi1pbmxpbmUgZnVuY3Rpb25zLiAgVGh1cyB3aGVuIHlvdSBzdGVwIGludG8gYW4gaW5saW5lIGZ1bmN0aW9uIGl0IGFwcGVhcnMgYXMgaWYKLXlvdSBoYXZlIGNhbGxlZCB0aGUgZnVuY3Rpb24sIGFuZCB5b3UgY2FuIGV4YW1pbmUgdmFyaWFibGVzIGFuZCBzbyBmb3J0aC4gCi1UaGVyZSBhcmUgc2V2ZXJhbCAqdmVyeSogaW1wb3J0YW50IGRpZmZlcmVuY2VzLCBob3dldmVyLiAgRmlyc3Qgb2YgYWxsLCBzaW5jZQotdGhlcmUgaXMgbm8gZnVuY3Rpb24gY2FsbCBpbnZvbHZlZCwgeW91IGNhbm5vdCBzdGVwIG92ZXIgdGhlIGlubGluZSBmdW5jdGlvbgotY2FsbCAtIHlvdSBhbHdheXMgc3RlcCBpbnRvIGl0LiBTZWNvbmRseSwgc2luY2UgdGhlIHNhbWUgc291cmNlIGxpbmVzIGFyZSB1c2VkCi1pbiBtYW55IGxvY2F0aW9ucywgdGhlcmUgaXMgYSBzZXBlcmF0ZSBjb3B5IG9mIHRoZSBzb3VyY2UgZm9yICplYWNoKiB1c2FnZS4gCi1XaXRob3V0IHRoaXMsIGJyZWFrcG9pbnRzIGRvIG5vdCB3b3JrLCBzaW5jZSB3ZSBtdXN0IGhhdmUgYSAxLXRvLTEgbWFwcGluZwotYmV0d2VlbiBzb3VyY2UgbGluZXMgYW5kIFBDLgotCVNpbmNlIHlvdSBjYW5ub3Qgc3RlcCBvdmVyIGlubGluZSBmdW5jdGlvbiBjYWxscywgaXQgY2FuIGJlIGEgcmVhbCBwYWluCi1pZiB5b3UgYXJlIG5vdCByZWFsbHkgaW50ZXJlc3RlZCBpbiB3aGF0IGlzIGdvaW5nIG9uIGZvciB0aGF0IGZ1bmN0aW9uIGNhbGwuCi1XaGF0IEkgaGF2ZSBkb25lIGlzIHRvIHVzZSB0aGUgIi1EIiBzd2l0Y2ggZm9yIHRoZSBhc3NlbWJsZXIgdG8gdG9nZ2xlIHRoZQotZm9sbG93aW5nIGJlaGF2aW9yLiAgV2l0aCB0aGUgIi1EIiBzd2l0Y2gsIGFsbCBpbmxpbmUgZnVuY3Rpb25zIGFyZSBpbmNsdWRlZCBpbgotdGhlIG9iamVjdCBmaWxlLCBhbmQgeW91IGNhbiBkZWJ1ZyBldmVyeXRoaW5nLiAgV2l0aG91dCB0aGUgIi1EIiBzd2l0Y2gKLShkZWZhdWx0IGNhc2Ugd2l0aCBWTVMgaW1wbGVtZW50YXRpb24pLCBpbmxpbmUgZnVuY3Rpb25zIGFyZSBpbmNsdWRlZCAqb25seSogaWYKLXRoZXkgZGlkIG5vdCBjb21lIGZyb20gc3lzdGVtIGhlYWRlciBmaWxlcyAoaS5lLiBmcm9tIEdOVV9DQ19JTkNMVURFOiBvcgotR05VX0dYWF9JTkNMVURFOikuICBUaHVzLCB3aXRob3V0IHRoZSBzd2l0Y2ggdGhlIHVzZXIgb25seSBkZWJ1Z3MgaGlzL2hlciBvd24KLWlubGluZSBmdW5jdGlvbnMsIGFuZCBub3QgdGhlIHN5c3RlbSBvbmVzLiAoVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpZiB5b3UgZG8KLWEgbG90IG9mIHN0cmVhbSBJL08gaW4gQysrKS4gIFRoaXMgcHJvYmFibHkgd2lsbCBub3QgcHJvdmlkZSBlbm91Z2ggZ3JhbnVsYXJpdHkKLWZvciBtYW55IHVzZXJzLCBidXQgZm9yIG5vdyB0aGlzIGlzIHN0aWxsIHNvbWV3aGF0IGV4cGVyaW1lbnRhbCwgYW5kIEkgd291bGQKLWxpa2UgdG8gcmVmbGVjdCB1cG9uIGl0IGFuZCBnZXQgc29tZSBmZWVkYmFjayBiZWZvcmUgSSBnbyBhbnkgZnVydGhlci4gCi1Qb3NzaWJsZSBzb2x1dGlvbnMgaW5jbHVkZSBhbiBpbnRlcmFjdGl2ZSBwcm9tcHRpbmcsIGEgbG9naWNhbCBuYW1lLCBvciBhIG5ldwotY29tbWFuZCBsaW5lIG9wdGlvbiBpbiBnY2MuYyAod2hpY2ggaXMgdGhlbiBwYXNzZWQgdGhyb3VnaCBzb21laG93IHRvIHRoZSBndXRzCi1vZiB0aGUgYXNzZW1ibGVyKS4KLQlUaGUgaW5saW5lIGZ1bmN0aW9ucyBmcm9tIGhlYWRlciBmaWxlcyBhcHBlYXIgYWZ0ZXIgdGhlIHNvdXJjZSBjb2RlCi1mb3IgdGhlIHNvdXJjZSBmaWxlLiAgVGhpcyBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IHRoZSBzb3VyY2UgZmlsZSBpdHNlbGYgaXMKLW51bWJlcmVkIHdpdGggdGhlIHNhbWUgbGluZSBudW1iZXJzIHRoYXQgeW91IGdldCB3aXRoIGFuIGVkaXRvci4gIEluIGFkZGl0aW9uLAotdGhlIGVudGlyZSBoZWFkZXIgZmlsZSBpcyBub3QgaW5jbHVkZWQsIHNpbmNlIHRoZSBhc3NlbWJsZXIgbWFrZXMgYSBsaXN0IG9mCi10aGUgbWluIGFuZCBtYXggc291cmNlIGxpbmVzIHRoYXQgYXJlIHVzZWQsIGFuZCBvbmx5IGluY2x1ZGVzIHRob3NlIGxpbmVzIGZyb20KLXRoZSBmaXJzdCB0byB0aGUgbGFzdCBhY3R1YWxseSB1c2VkLiAoSXQgaXMgZWFzeSB0byBjaGFuZ2UgaXQgdG8gaW5jbHVkZSB0aGUKLXdob2xlIGZpbGUpLgotCi0JOCkgV2hlbiB5b3UgYXJlIGRlYnVnZ2luZyBDKysgb2JqZWN0cywgdGhlIG9iamVjdCAidGhpcyIgaXMgcmVmZXJlZCB0bwotYXMgIiR0aGlzIi4gIEFjdHVhbGx5LCB0aGUgY29tcGlsZXIgd3JpdGVzIGl0IGFzICIudGhpcyIsIGJ1dCB0aGUgcGVyaW9kIGlzCi1ub3QgZ29vZCBmb3IgdGhlIGRlYnVnZ2VyLCBzbyBJIGhhdmUgYSByb3V0aW5lIHRvIGNvbnZlcnQgaXQgdG8gYSAkLiAgKEl0Ci1hY3R1YWxseSBjb252ZXJ0cyBhbGwgcGVyaW9kcyB0byAkLCBidXQgb25seSBmb3IgdmFyaWFibGVzLCBzaW5jZSB0aGlzIHdhcwotaW50ZW5kZWQgdG8gYWxsb3cgdXMgdG8gYWNjZXNzICJ0aGlzIi4KLQotCTkpIElmIHlvdSB1c2UgdGhlIGFzbSgiLi4uIikga2V5d29yZCBmb3IgZ2xvYmFsIHN5bWJvbHMsIHlvdSB3aWxsIG5vdAotYmUgYWJsZSB0byBzZWUgdGhhdCBzeW1ib2wgd2l0aCB0aGUgZGVidWdnZXIuICBUaGUgcmVhc29uIGlzIHRoYXQgdGhlcmUgYXJlIHR3bwotcmVjb3JkcyBmb3IgdGhlIHN5bWJvbCBzdG9yZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlcyBvZiB0aGUgYXNzZW1ibGVyLiAgT25lCi1jb250YWlucyB0aGUgaW5mbyBzdWNoIGFzIHBzZWN0IG51bWJlciBhbmQgb2Zmc2V0LCBhbmQgdGhlIG90aGVyIG9uZSBjb250YWlucwotdGhlIGluZm9ybWF0aW9uIGhhdmluZyB0byBkbyB3aXRoIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhcmlhYmxlLiAgSW4gb3JkZXIgdG8KLWRlYnVnIGFzIHN5bWJvbCwgeW91IG5lZWQgdG8gYmUgYWJsZSB0byBjb29yZWxhdGUgdGhlc2UgcmVjb3JkcywgYW5kIHRoZSBvbmx5Ci13YXkgdG8gZG8gdGhpcyBpcyBieSBuYW1lLiAgVGhlIHJlY29yZCB3aXRoIHRoZSBzdG9yYWdlIGF0dHJpYnV0ZXMgd2lsbCB0YWtlCi10aGUgbmFtZSB1c2VkIGluIHRoZSBhc20gZGlyZWN0aXZlLCBhbmQgdGhlIHJlY29yZCB0aGF0IHNwZWNpZmllcyB0aGUgZGF0YSB0eXBlCi1oYXMgdGhlIGFjdHVhbCB2YXJpYWJsZSBuYW1lLCBhbmQgdGh1cyB3aGVuIHlvdSB1c2UgdGhlIGFzbSBkaXJlY3RpdmUgdG8gY2hhbmdlCi1hIHZhcmlhYmxlIG5hbWUsIHRoZSBzeW1ib2wgYmVjb21lcyBpbnZpc2libGUuCi0KLQkxMCkgT2xkZXIgdmVyc2lvbnMgb2YgdGhlIGNvbXBpbGVyICggR05VLUMgMS4zNy45MiBhbmQgZWFybGllcikgcGxhY2UKLWdsb2JhbCBjb25zdGFudHMgaW4gdGhlIHRleHQgcHNlY3QuICBUaGlzIGlzIHVuZm9ydHVuYXRlLCBzaW5jZSB0byB0aGUgbGlua2VyCi10aGlzIGFwcGVhcnMgdG8gYmUgYW4gZW50cnkgcG9pbnQuICBJIHNlbnQgYSBwYXRjaCB0byB0aGUgY29tcGlsZXIgdG8gUk1TLAotd2hpY2ggd2lsbCBnZW5lcmF0ZSBhIC5jb25zdCBzZWN0aW9uIGZvciB0aGVzZSB2YXJpYWJsZXMsIGFuZCBwYXRjaGVkIHRoZQotYXNzZW1ibGVyIHRvIHB1dCB0aGVzZSB2YXJpYWJsZXMgaW50byBhIHBzZWN0IGp1c3QgbGlrZSB0aGF0IGZvciBub3JtYWwKLXZhcmlhYmxlcywgZXhjZXB0IHRoYXQgdGhleSBhcmUgbWFya2VkIE5PV1JULiAgc3RhdGljIGNvbnN0YW50cyBhcmUgc3RpbGwKLXBsYWNlZCBpbiB0aGUgdGV4dCBwc2VjdCwgc2luY2UgdGhlcmUgaXMgbm8gbmVlZCBmb3IgYW55IGV4dGVybmFsIGFjY2Vzcy4KZGlmZiAtLWdpdCBhL2dhcy9hY2luY2x1ZGUubTQgYi9nYXMvYWNpbmNsdWRlLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWEyYzE2Li4wMDAwMDAwCi0tLSBhL2dhcy9hY2luY2x1ZGUubTQKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1kbmwgR0FTX0NIRUNLX0RFQ0xfTkVFREVEKG5hbWUsIHR5cGVkZWZuYW1lLCB0eXBlZGVmLCBoZWFkZXJzKQotQUNfREVGVU4oR0FTX0NIRUNLX0RFQ0xfTkVFREVELFsKLUFDX01TR19DSEVDS0lORyh3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciAkMSkKLUFDX0NBQ0hFX1ZBTChnYXNfY3ZfZGVjbF9uZWVkZWRfJDEsCi1BQ19UUllfTElOSyhbJDRdLAotWwotdHlwZWRlZiAkMzsKLSQyIHg7Ci14ID0gKCQyKSAkMTsKLV0sIGdhc19jdl9kZWNsX25lZWRlZF8kMT1ubywgZ2FzX2N2X2RlY2xfbmVlZGVkXyQxPXllcykpZG5sCi1BQ19NU0dfUkVTVUxUKCRnYXNfY3ZfZGVjbF9uZWVkZWRfJDEpCi1pZiB0ZXN0ICRnYXNfY3ZfZGVjbF9uZWVkZWRfJDEgPSB5ZXM7IHRoZW4KLSBBQ19ERUZJTkUoW05FRURfREVDTEFSQVRJT05fXXRyYW5zbGl0KCQxLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgIFtEZWZpbmUgaWYgJDEgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuXSkKLWZpCi1dKWRubAotZG5sCi1kbmwgU29tZSBub24tQU5TSSBwcmVwcm9jZXNzb3JzIGJvdGNoIHJlcXVvdGluZyBpbnNpZGUgc3RyaW5ncy4gIFRoYXQncyBiYWQKLWRubCBlbm91Z2gsIGJ1dCBvbiBzb21lIG9mIHRob3NlIHN5c3RlbXMsIHRoZSBhc3NlcnQgbWFjcm8gcmVsaWVzIG9uIHJlcXVvdGluZwotZG5sIHdvcmtpbmcgcHJvcGVybHkhCi1kbmwgR0FTX1dPUktJTkdfQVNTRVJUCi1BQ19ERUZVTihHQVNfV09SS0lOR19BU1NFUlQsCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3Igd29ya2luZyBhc3NlcnQgbWFjcm9dKQotQUNfQ0FDSEVfVkFMKGdhc19jdl9hc3NlcnRfb2ssCi1BQ19UUllfTElOSyhbI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+XSwgWwotLyogY2hlY2sgZm9yIHJlcXVvdGluZyBwcm9ibGVtcyAqLwotc3RhdGljIGludCBhLCBiLCBjLCBkOwotc3RhdGljIGNoYXIgKnM7Ci1hc3NlcnQgKCFzdHJjbXAocywgImZvbyBiYXIgYmF6IHF1dXgiKSk7Ci0vKiBjaGVjayBmb3IgbmV3bGluZSBoYW5kbGluZyAqLwotYXNzZXJ0IChhID09IGIKLSAgICAgICAgfHwgYyA9PSBkKTsKLV0sIGdhc19jdl9hc3NlcnRfb2s9eWVzLCBnYXNfY3ZfYXNzZXJ0X29rPW5vKSlkbmwKLUFDX01TR19SRVNVTFQoJGdhc19jdl9hc3NlcnRfb2spCi10ZXN0ICRnYXNfY3ZfYXNzZXJ0X29rID0geWVzIHx8IEFDX0RFRklORShCUk9LRU5fQVNTRVJULCAxLCBbYXNzZXJ0IGJyb2tlbj9dKQotXSlkbmwKLWRubAotZG5sIFNpbmNlIG1hbnkgQm91cm5lIHNoZWxsIGltcGxlbWVudGF0aW9ucyBsYWNrIHN1YnJvdXRpbmVzLCB1c2UgdGhpcwotZG5sIGhhY2sgdG8gc2ltcGxpZnkgdGhlIGNvZGUgaW4gY29uZmlndXJlLmluLgotZG5sIEdBU19VTklRKGxpc3R2YXIpCi1BQ19ERUZVTihHQVNfVU5JUSwKLVtfZ2FzX3VuaXFfbGlzdD0iWyRdJDEiCi1fZ2FzX3VuaXFfbmV3bGlzdD0iIgotZG5sIFByb3RlY3QgYWdhaW5zdCBlbXB0eSBpbnB1dCBsaXN0LgotZm9yIF9nYXNfdW5pcV9pIGluIF9nYXNfdW5pcV9kdW1teSBbJF1fZ2FzX3VuaXFfbGlzdCA7IGRvCi0gIGNhc2UgWyRdX2dhc191bmlxX2kgaW4KLSAgX2dhc191bmlxX2R1bW15KSA7OwotICAqKSBjYXNlICIgWyRdX2dhc191bmlxX25ld2xpc3QgIiBpbgotICAgICAgICoiIFskXV9nYXNfdW5pcV9pICIqKSA7OwotICAgICAgICopIF9nYXNfdW5pcV9uZXdsaXN0PSJbJF1fZ2FzX3VuaXFfbmV3bGlzdCBbJF1fZ2FzX3VuaXFfaSIgOzsKLSAgICAgZXNhYyA7OwotICBlc2FjCi1kb25lCi0kMT1bJF1fZ2FzX3VuaXFfbmV3bGlzdAotXSlkbmwKZGlmZiAtLWdpdCBhL2dhcy9hY2xvY2FsLm00IGIvZ2FzL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNmQ2MGMuLjAwMDAwMDAKLS0tIGEvZ2FzL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSw4MjIgKzAsMCBAQAotZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjQKLQotZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLWRubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWRubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLWRubCBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLWRubCBHQVNfQ0hFQ0tfREVDTF9ORUVERUQobmFtZSwgdHlwZWRlZm5hbWUsIHR5cGVkZWYsIGhlYWRlcnMpCi1BQ19ERUZVTihHQVNfQ0hFQ0tfREVDTF9ORUVERUQsWwotQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yICQxKQotQUNfQ0FDSEVfVkFMKGdhc19jdl9kZWNsX25lZWRlZF8kMSwKLUFDX1RSWV9MSU5LKFskNF0sCi1bCi10eXBlZGVmICQzOwotJDIgeDsKLXggPSAoJDIpICQxOwotXSwgZ2FzX2N2X2RlY2xfbmVlZGVkXyQxPW5vLCBnYXNfY3ZfZGVjbF9uZWVkZWRfJDE9eWVzKSlkbmwKLUFDX01TR19SRVNVTFQoJGdhc19jdl9kZWNsX25lZWRlZF8kMSkKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF8kMSA9IHllczsgdGhlbgotIEFDX0RFRklORShbTkVFRF9ERUNMQVJBVElPTl9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIDEsCi0JICAgW0RlZmluZSBpZiAkMSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy5dKQotZmkKLV0pZG5sCi1kbmwKLWRubCBTb21lIG5vbi1BTlNJIHByZXByb2Nlc3NvcnMgYm90Y2ggcmVxdW90aW5nIGluc2lkZSBzdHJpbmdzLiAgVGhhdCdzIGJhZAotZG5sIGVub3VnaCwgYnV0IG9uIHNvbWUgb2YgdGhvc2Ugc3lzdGVtcywgdGhlIGFzc2VydCBtYWNybyByZWxpZXMgb24gcmVxdW90aW5nCi1kbmwgd29ya2luZyBwcm9wZXJseSEKLWRubCBHQVNfV09SS0lOR19BU1NFUlQKLUFDX0RFRlVOKEdBU19XT1JLSU5HX0FTU0VSVCwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB3b3JraW5nIGFzc2VydCBtYWNyb10pCi1BQ19DQUNIRV9WQUwoZ2FzX2N2X2Fzc2VydF9vaywKLUFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD5dLCBbCi0vKiBjaGVjayBmb3IgcmVxdW90aW5nIHByb2JsZW1zICovCi1zdGF0aWMgaW50IGEsIGIsIGMsIGQ7Ci1zdGF0aWMgY2hhciAqczsKLWFzc2VydCAoIXN0cmNtcChzLCAiZm9vIGJhciBiYXogcXV1eCIpKTsKLS8qIGNoZWNrIGZvciBuZXdsaW5lIGhhbmRsaW5nICovCi1hc3NlcnQgKGEgPT0gYgotICAgICAgICB8fCBjID09IGQpOwotXSwgZ2FzX2N2X2Fzc2VydF9vaz15ZXMsIGdhc19jdl9hc3NlcnRfb2s9bm8pKWRubAotQUNfTVNHX1JFU1VMVCgkZ2FzX2N2X2Fzc2VydF9vaykKLXRlc3QgJGdhc19jdl9hc3NlcnRfb2sgPSB5ZXMgfHwgQUNfREVGSU5FKEJST0tFTl9BU1NFUlQsIDEsIFthc3NlcnQgYnJva2VuP10pCi1dKWRubAotZG5sCi1kbmwgU2luY2UgbWFueSBCb3VybmUgc2hlbGwgaW1wbGVtZW50YXRpb25zIGxhY2sgc3Vicm91dGluZXMsIHVzZSB0aGlzCi1kbmwgaGFjayB0byBzaW1wbGlmeSB0aGUgY29kZSBpbiBjb25maWd1cmUuaW4uCi1kbmwgR0FTX1VOSVEobGlzdHZhcikKLUFDX0RFRlVOKEdBU19VTklRLAotW19nYXNfdW5pcV9saXN0PSJbJF0kMSIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1kbmwgUHJvdGVjdCBhZ2FpbnN0IGVtcHR5IGlucHV0IGxpc3QuCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15IFskXV9nYXNfdW5pcV9saXN0IDsgZG8KLSAgY2FzZSBbJF1fZ2FzX3VuaXFfaSBpbgotICBfZ2FzX3VuaXFfZHVtbXkpIDs7Ci0gICopIGNhc2UgIiBbJF1fZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgWyRdX2dhc191bmlxX2kgIiopIDs7Ci0gICAgICAgKikgX2dhc191bmlxX25ld2xpc3Q9IlskXV9nYXNfdW5pcV9uZXdsaXN0IFskXV9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLSQxPVskXV9nYXNfdW5pcV9uZXdsaXN0Ci1dKWRubAotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2ggLS0KLSMgc29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLgotIyBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KLQotIyBzZXJpYWwgMQotCi1kbmwgVXNhZ2U6Ci1kbmwgQU1fSU5JVF9BVVRPTUFLRShwYWNrYWdlLHZlcnNpb24sIFtuby1kZWZpbmVdKQotCi1BQ19ERUZVTihBTV9JTklUX0FVVE9NQUtFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pCi1QQUNLQUdFPVskMV0KLUFDX1NVQlNUKFBBQ0tBR0UpCi1WRVJTSU9OPVskMl0KLUFDX1NVQlNUKFZFUlNJT04pCi1kbmwgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCi1maQotaWZlbHNlKFskM10sLAotQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSkpCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKQotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKQotZG5sIEZJWE1FIFRoaXMgaXMgdHJ1bHkgZ3Jvc3MuCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvLCAkbWlzc2luZ19kaXIpCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSldKQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLgotIwotCi1BQ19ERUZVTihBTV9TQU5JVFlfQ0hFQ0ssCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICJbJF0qIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiWyRdKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICJbJF0qIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCi0gICBmaQotCi0gICB0ZXN0ICJbJF0yIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCi1maQotcm0gLWYgY29uZnRlc3QqCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi1kbmwgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0sIERJUkVDVE9SWSkKLWRubCBUaGUgcHJvZ3JhbSBtdXN0IHByb3Blcmx5IGltcGxlbWVudCAtLXZlcnNpb24uCi1BQ19ERUZVTihBTV9NSVNTSU5HX1BST0csCi1bQUNfTVNHX0NIRUNLSU5HKGZvciB3b3JraW5nICQyKQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKCQyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgJDE9JDIKLSAgIEFDX01TR19SRVNVTFQoZm91bmQpCi1lbHNlCi0gICAkMT0iJDMvbWlzc2luZyAkMiIKLSAgIEFDX01TR19SRVNVTFQobWlzc2luZykKLWZpCi1BQ19TVUJTVCgkMSldKQotCi0KLSMgc2VyaWFsIDI1IEFNX1BST0dfTElCVE9PTAotQUNfREVGVU4oQU1fUFJPR19MSUJUT09MLAotW0FDX1JFUVVJUkUoW0FNX0VOQUJMRV9TSEFSRURdKWRubAotQUNfUkVRVUlSRShbQU1fRU5BQkxFX1NUQVRJQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBTV9QUk9HX0xEXSlkbmwKLUFDX1JFUVVJUkUoW0FNX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKLWRubAotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotQUNfU1VCU1QoTElCVE9PTClkbmwKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ci10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGhvc3QiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ1sjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICA7OwotCi0qLSotY3lnd2luKikKLSAgQU1fU1lTX0xJQlRPT0xfQ1lHV0lOCi0gIDs7Ci0KLWVzYWMKLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCBBQ19NU0dfRVJST1IoW2xpYnRvb2wgY29uZmlndXJlIGZhaWxlZF0pCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLV0pCi0KLSMgQU1fRU5BQkxFX1NIQVJFRCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc2hhcmVkIGZsYWcKLSMgVXNhZ2U6IEFNX0VOQUJMRV9TSEFSRURbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQU1fRU5BQkxFX1NIQVJFRCwKLVtkZWZpbmUoW0FNX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzaGFyZWQsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFNX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zaGFyZWQ9QU1fRU5BQkxFX1NIQVJFRF9ERUZBVUxUKWRubAotXSkKLQotIyBBTV9ESVNBQkxFX1NIQVJFRCAtIHNldCB0aGUgZGVmYXVsdCBzaGFyZWQgZmxhZyB0byAtLWRpc2FibGUtc2hhcmVkCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NIQVJFRCwKLVtBTV9FTkFCTEVfU0hBUkVEKG5vKV0pCi0KLSMgQU1fRElTQUJMRV9TVEFUSUMgLSBzZXQgdGhlIGRlZmF1bHQgc3RhdGljIGZsYWcgdG8gLS1kaXNhYmxlLXN0YXRpYwotQUNfREVGVU4oQU1fRElTQUJMRV9TVEFUSUMsCi1bQU1fRU5BQkxFX1NUQVRJQyhubyldKQotCi0jIEFNX0VOQUJMRV9TVEFUSUMgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnCi0jIFVzYWdlOiBBTV9FTkFCTEVfU1RBVElDWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFNX0VOQUJMRV9TVEFUSUMsCi1bZGVmaW5lKFtBTV9FTkFCTEVfU1RBVElDX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc3RhdGljLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BTV9FTkFCTEVfU1RBVElDX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc3RhdGljPUFNX0VOQUJMRV9TVEFUSUNfREVGQVVMVClkbmwKLV0pCi0KLQotIyBBTV9QUk9HX0xEIC0gZmluZCB0aGUgcGF0aCB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCi1BQ19ERUZVTihBTV9QUk9HX0xELAotW0FDX0FSR19XSVRIKGdudS1sZCwKLVsgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub11dLAotdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzLCB3aXRoX2dudV9sZD1ubykKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSBHQ0NdKQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLWNoYW5nZXF1b3RlKCwpZG5sCi0gIC8qIHwgW0EtWmEtel06XFwqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCi1lbHNlCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQotZmkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX0xELAotW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotICAgICAgICB0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmldKQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRMRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi10ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQotQUNfU1VCU1QoTEQpCi1BTV9QUk9HX0xEX0dOVQotXSkKLQotQUNfREVGVU4oQU1fUFJPR19MRF9HTlUsCi1bQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgYWNfY3ZfcHJvZ19nbnVfbGQsCi1bIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maV0pCi1dKQotCi0jIEFNX1BST0dfTk0gLSBmaW5kIHRoZSBwYXRoIHRvIGEgQlNELWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKLUFDX0RFRlVOKEFNX1BST0dfTk0sCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgQlNELWNvbXBhdGlibGUgbm1dKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTk0sCi1baWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluIC91c3IvdWNiIC91c3IvY2NzL2JpbiAkUEFUSCAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgIGFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0gICAgICBlbHNlCi0gICAgICAgIGFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0iCi0gICAgICBmaQotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmldKQotTk09IiRhY19jdl9wYXRoX05NIgotQUNfTVNHX1JFU1VMVChbJE5NXSkKLUFDX1NVQlNUKE5NKQotXSkKLQotIyBBTV9TWVNfTElCVE9PTF9DWUdXSU4gLSBmaW5kIHRvb2xzIG5lZWRlZCBvbiBjeWd3aW4KLUFDX0RFRlVOKEFNX1NZU19MSUJUT09MX0NZR1dJTiwKLVtBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQotQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQotXSkKLQotIyBMaWtlIEFDX0NPTkZJR19IRUFERVIsIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdGFtcCBmaWxlLgotCi1BQ19ERUZVTihBTV9DT05GSUdfSEVBREVSLAotW0FDX1BSRVJFUShbMi4xMl0pCi1BQ19DT05GSUdfSEVBREVSKFskMV0pCi1kbmwgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KLWRubCBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKLWRubCB0aGF0IGlzIGdlbmVyYXRlZC4gIFdlIG11c3Qgc3RyaXAgZXZlcnl0aGluZyBwYXN0IHRoZSBmaXJzdCAiOiIsCi1kbmwgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgbGFzdCAiLyIuCi1BQ19PVVRQVVRfQ09NTUFORFMoY2hhbmdlcXVvdGUoPDwsPj4pZG5sCi1pZmVsc2UocGF0c3Vic3QoPDwkMT4+LCA8PFteIF0+PiwgPDw+PiksIDw8Pj4sCi08PHRlc3QgLXogIjw8JD4+Q09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gcGF0c3Vic3QoPDwkMT4+LCA8PF5cKFteOl0qL1wpPy4qPj4sIDw8XDE+PilzdGFtcC1oPDw+PmRubD4+LAotPDxhbV9pbmR4PTEKLWZvciBhbV9maWxlIGluIDw8JDE+PjsgZG8KLSAgY2FzZSAiIDw8JD4+Q09ORklHX0hFQURFUlMgIiBpbgotICAqIiA8PCQ+PmFtX2ZpbGUgIio8PCk+PgotICAgIGVjaG8gdGltZXN0YW1wID4gYGVjaG8gPDwkPj5hbV9maWxlIHwgc2VkIC1lICdzJTouKiUlJyAtZSAncyVbXi9dKiQlJSdgc3RhbXAtaCRhbV9pbmR4Ci0gICAgOzsKLSAgZXNhYwotICBhbV9pbmR4PWBleHByICI8PCQ+PmFtX2luZHgiICsgMWAKLWRvbmU8PD4+ZG5sPj4pCi1jaGFuZ2VxdW90ZShbLF0pKV0pCi0KLQotZG5sIEFNX1BST0dfTEVYCi1kbmwgTG9vayBmb3IgZmxleCwgbGV4IG9yIG1pc3NpbmcsIHRoZW4gcnVuIEFDX1BST0dfTEVYIGFuZCBBQ19ERUNMX1lZVEVYVAotQUNfREVGVU4oQU1fUFJPR19MRVgsCi1bbWlzc2luZ19kaXI9aWZlbHNlKFskMV0sLGBjZCAkYWNfYXV4X2RpciAmJiBwd2RgLCQxKQotQUNfQ0hFQ0tfUFJPR1MoTEVYLCBmbGV4IGxleCwgIiRtaXNzaW5nX2Rpci9taXNzaW5nIGZsZXgiKQotQUNfUFJPR19MRVgKLUFDX0RFQ0xfWVlURVhUXSkKLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotQUNfREVGVU4oQ1lfV0lUSF9OTFMsCi0gIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKLSAgICBBQ19BUkdfRU5BQkxFKG5scywKLSAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAotICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKLSAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQotICAgIEFDX1NVQlNUKFVTRV9OTFMpCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAotICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUywgMSwgW0RlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCi0gICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKLSAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCi0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKLSAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQotICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KLQlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KLQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKLQkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAotCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCi0JICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKLQkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQsIDEsCi0JCQlbRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuXSkKLQkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQotCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLQkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAotCQkgIFtDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCi0JCSAgW0NBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliXSkKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCV0pCi0KLQlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KLSAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KLQotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgotCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgotCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCi0gICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKLSAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotICAgICAgICBBQ19TVUJTVChNU0dGTVQpCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgotICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCi0JZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KLQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBBQ19NU0dfUkVTVUxUKAotCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKLSAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCi0gICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KLSAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgotICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQotICAgIEFDX1NVQlNUKENBVEFMT0dTKQotICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKLSAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKLSAgICBBQ19TVUJTVChHTU9GSUxFUykKLSAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQotICAgIEFDX1NVQlNUKElOVExERVBTKQotICAgIEFDX1NVQlNUKElOVExMSUJTKQotICAgIEFDX1NVQlNUKElOVExPQkpTKQotICAgIEFDX1NVQlNUKFBPRklMRVMpCi0gICAgQUNfU1VCU1QoUE9TVUIpCi0gIF0pCi0KLUFDX0RFRlVOKENZX0dOVV9HRVRURVhULAotICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKLQotICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQotICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFksIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbl0pCi0gICBmaQotCi0gICBBTV9MQ19NRVNTQUdFUwotICAgQ1lfV0lUSF9OTFMKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCi0gICAgIGZpCi0KLSAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCi0gICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCi0gICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKLSAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKLQotICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQotICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6Ci0gICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAotICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQotCi0JIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcwotICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCi0JIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCi0gICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKLSAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKLSAgIGRubCBwYWNrYWdlcy4KLSAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICBBQ19TVUJTVChHVF9OTykKLSAgIEFDX1NVQlNUKEdUX1lFUykKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKLQotICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCi0gICBsPQotICAgQUNfU1VCU1QobCkKLQotICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKLSAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQotICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCi0gICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgXSkKLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAotZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQotQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKLVsjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKLVtjYXNlICJbJF0kMSIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIFskM107IHRoZW4KLQlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1kbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAotZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCi1pZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgotXSlkbmwKLSAgOzsKLWVzYWNdKWRubAotJDE9IiRhY19jdl9wYXRoXyQxIgotaWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoWyRdJDEpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotQUNfU1VCU1QoJDEpZG5sCi1dKQotCi0jIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAotICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKLSAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAotICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCi0JCVtEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLl0pCi0gICAgZmkKLSAgZmldKQotCi0jIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KLSMgRnJvbSBKaW0gTWV5ZXJpbmcKLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9NQUlOVEFJTkVSX01PREUsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCi0gIGRubCBtYWludGFpbmVyLW1vZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAotICBBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKLVsgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQotICBBQ19NU0dfUkVTVUxUKCRVU0VfTUFJTlRBSU5FUl9NT0RFKQotICBBTV9DT05ESVRJT05BTChNQUlOVEFJTkVSX01PREUsIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXMpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICBBQ19TVUJTVChNQUlOVClkbmwKLV0KLSkKLQotIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KLQotQUNfREVGVU4oQU1fQ09ORElUSU9OQUwsCi1bQUNfU1VCU1QoJDFfVFJVRSkKLUFDX1NVQlNUKCQxX0ZBTFNFKQotaWYgJDI7IHRoZW4KLSAgJDFfVFJVRT0KLSAgJDFfRkFMU0U9JyMnCi1lbHNlCi0gICQxX1RSVUU9JyMnCi0gICQxX0ZBTFNFPQotZmldKQotCmRpZmYgLS1naXQgYS9nYXMvYXBwLmMgYi9nYXMvYXBwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOGRmM2EuLjAwMDAwMDAKLS0tIGEvZ2FzL2FwcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI1NSArMCwwIEBACi0vKiBUaGlzIGlzIHRoZSBBc3NlbWJsZXIgUHJlLVByb2Nlc3NvcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogTW9kaWZpZWQgYnkgQWxsZW4gV2lyZnMtQnJvY2ssIEluc3RhbnRpYXRpb25zIEluYyAyLzkwICovCi0vKiBBcHAsIHRoZSBhc3NlbWJsZXIgcHJlLXByb2Nlc3Nvci4gIFRoaXMgcHJlLXByb2Nlc3NvciBzdHJpcHMgb3V0IGV4Y2VzcwotICAgc3BhY2VzLCB0dXJucyBzaW5nbGUtcXVvdGVkIGNoYXJhY3RlcnMgaW50byBhIGRlY2ltYWwgY29uc3RhbnQsIGFuZCB0dXJucwotICAgIyA8bnVtYmVyPiA8ZmlsZW5hbWU+IDxnYXJiYWdlPiBpbnRvIGEgLmxpbmUgPG51bWJlcj5cbi5maWxlIDxmaWxlbmFtZT4KLSAgIHBhaXIuICBUaGlzIG5lZWRzIGJldHRlciBlcnJvci1oYW5kbGluZy4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFzLmgiCQkJLyogRm9yIEJBRF9DQVNFKCkgb25seSAqLwotCi0jaWYgKF9fU1REQ19fICE9IDEpCi0jaWZuZGVmIGNvbnN0Ci0jZGVmaW5lIGNvbnN0ICAvKiBlbXB0eSAqLwotI2VuZGlmCi0jZW5kaWYKLQotLyogV2hldGhlciB3ZSBhcmUgc2NydWJiaW5nIGluIG02OGsgTVJJIG1vZGUuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tCi0gICBmbGFnX202OGtfbXJpLCBiZWNhdXNlIHRoZSB0d28gZmxhZ3Mgd2lsbCBiZSBhZmZlY3RlZCBieSB0aGUgLm1yaQotICAgcHNldWRvLW9wIGF0IGRpZmZlcmVudCB0aW1lcy4gICovCi1zdGF0aWMgaW50IHNjcnViX202OGtfbXJpOwotCi0vKiBUaGUgcHNldWRvLW9wIHdoaWNoIHN3aXRjaGVzIGluIGFuZCBvdXQgb2YgTVJJIG1vZGUuICBTZWUgdGhlCi0gICBjb21tZW50IGluIGRvX3NjcnViX2NoYXJzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyIG1yaV9wc2V1ZG9bXSA9ICIubXJpIDAiOwotCi0jaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCi0vKiBUaGUgcHNldWRvLW9wIGZvciB3aGljaCB3ZSBuZWVkIHRvIHNwZWNpYWwtY2FzZSBgQCcgY2hhcmFjdGVycy4gCi0gICBTZWUgdGhlIGNvbW1lbnQgaW4gZG9fc2NydWJfY2hhcnMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgICBzeW12ZXJfcHNldWRvW10gPSAiLnN5bXZlciI7Ci1zdGF0aWMgY29uc3QgY2hhciAqIHN5bXZlcl9zdGF0ZTsKLSNlbmRpZgotCi1zdGF0aWMgY2hhciBsZXhbMjU2XTsKLXN0YXRpYyBjb25zdCBjaGFyIHN5bWJvbF9jaGFyc1tdID0KLSIkLl9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSI7Ci0KLSNkZWZpbmUgTEVYX0lTX1NZTUJPTF9DT01QT05FTlQJCTEKLSNkZWZpbmUgTEVYX0lTX1dISVRFU1BBQ0UJCTIKLSNkZWZpbmUgTEVYX0lTX0xJTkVfU0VQQVJBVE9SCQkzCi0jZGVmaW5lIExFWF9JU19DT01NRU5UX1NUQVJUCQk0Ci0jZGVmaW5lIExFWF9JU19MSU5FX0NPTU1FTlRfU1RBUlQJNQotI2RlZmluZQlMRVhfSVNfVFdPQ0hBUl9DT01NRU5UXzFTVAk2Ci0jZGVmaW5lCUxFWF9JU19TVFJJTkdRVU9URQkJOAotI2RlZmluZQlMRVhfSVNfQ09MT04JCQk5Ci0jZGVmaW5lCUxFWF9JU19ORVdMSU5FCQkJMTAKLSNkZWZpbmUJTEVYX0lTX09ORUNIQVJfUVVPVEUJCTExCi0jaWZkZWYgVENfVjg1MAotI2RlZmluZSBMRVhfSVNfRE9VQkxFREFTSF8xU1QJCTEyCi0jZW5kaWYKLSNpZmRlZiBUQ19NMzJSCi0jZGVmaW5lIExFWF9JU19ET1VCTEVCQVJfMVNUCQkxMwotI2VuZGlmCi0jZGVmaW5lIElTX1NZTUJPTF9DT01QT05FTlQoYykJCShsZXhbY10gPT0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQpCi0jZGVmaW5lIElTX1dISVRFU1BBQ0UoYykJCShsZXhbY10gPT0gTEVYX0lTX1dISVRFU1BBQ0UpCi0jZGVmaW5lIElTX0xJTkVfU0VQQVJBVE9SKGMpCQkobGV4W2NdID09IExFWF9JU19MSU5FX1NFUEFSQVRPUikKLSNkZWZpbmUgSVNfQ09NTUVOVChjKQkJCShsZXhbY10gPT0gTEVYX0lTX0NPTU1FTlRfU1RBUlQpCi0jZGVmaW5lIElTX0xJTkVfQ09NTUVOVChjKQkJKGxleFtjXSA9PSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUKQotI2RlZmluZQlJU19ORVdMSU5FKGMpCQkJKGxleFtjXSA9PSBMRVhfSVNfTkVXTElORSkKLQotc3RhdGljIGludCBwcm9jZXNzX2VzY2FwZSBQQVJBTVMgKChpbnQpKTsKLQotLyogRklYTUUtc29vbjogVGhlIGVudGlyZSBsZXhlci9wYXJzZXIgdGhpbmd5IHNob3VsZCBiZQotICAgYnVpbHQgc3RhdGljYWxseSBhdCBjb21waWxlIHRpbWUgcmF0aGVyIHRoYW4gZHluYW1pY2FsbHkKLSAgIGVhY2ggYW5kIGV2ZXJ5IHRpbWUgdGhlIGFzc2VtYmxlciBpcyBydW4uICB4b3hvcmljaC4gKi8KLQotdm9pZCAKLWRvX3NjcnViX2JlZ2luIChtNjhrX21yaSkKLSAgICAgaW50IG02OGtfbXJpOwotewotICBjb25zdCBjaGFyICpwOwotICBpbnQgYzsKLQotICBzY3J1Yl9tNjhrX21yaSA9IG02OGtfbXJpOwotCi0gIGxleFsnICddID0gTEVYX0lTX1dISVRFU1BBQ0U7Ci0gIGxleFsnXHQnXSA9IExFWF9JU19XSElURVNQQUNFOwotICBsZXhbJ1xyJ10gPSBMRVhfSVNfV0hJVEVTUEFDRTsKLSAgbGV4WydcbiddID0gTEVYX0lTX05FV0xJTkU7Ci0gIGxleFsnOyddID0gTEVYX0lTX0xJTkVfU0VQQVJBVE9SOwotICBsZXhbJzonXSA9IExFWF9JU19DT0xPTjsKLQotICBpZiAoISBtNjhrX21yaSkKLSAgICB7Ci0gICAgICBsZXhbJyInXSA9IExFWF9JU19TVFJJTkdRVU9URTsKLQotI2lmbmRlZiBUQ19IUFBBCi0gICAgICBsZXhbJ1wnJ10gPSBMRVhfSVNfT05FQ0hBUl9RVU9URTsKLSNlbmRpZgotCi0jaWZkZWYgU0lOR0xFX1FVT1RFX1NUUklOR1MKLSAgICAgIGxleFsnXCcnXSA9IExFWF9JU19TVFJJTkdRVU9URTsKLSNlbmRpZgotICAgIH0KLQotICAvKiBOb3RlOiBpZiBhbnkgb3RoZXIgY2hhcmFjdGVyIGNhbiBiZSBMRVhfSVNfU1RSSU5HUVVPVEUsIHRoZSBsb29wCi0gICAgIGluIHN0YXRlIDUgb2YgZG9fc2NydWJfY2hhcnMgbXVzdCBiZSBjaGFuZ2VkLiAgKi8KLQotICAvKiBOb3RlIHRoYXQgdGhlc2Ugb3ZlcnJpZGUgdGhlIHByZXZpb3VzIGRlZmF1bHRzLCBlLmcuIGlmICc7JyBpcyBhCi0gICAgIGNvbW1lbnQgY2hhciwgdGhlbiBpdCBpc24ndCBhIGxpbmUgc2VwYXJhdG9yLiAgKi8KLSAgZm9yIChwID0gc3ltYm9sX2NoYXJzOyAqcDsgKytwKQotICAgIHsKLSAgICAgIGxleFsodW5zaWduZWQgY2hhcikgKnBdID0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQ7Ci0gICAgfQkJCQkvKiBkZWNsYXJlIHN5bWJvbCBjaGFyYWN0ZXJzICovCi0KLSAgZm9yIChjID0gMTI4OyBjIDwgMjU2OyArK2MpCi0gICAgbGV4W2NdID0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQ7Ci0KLSNpZmRlZiB0Y19zeW1ib2xfY2hhcnMKLSAgLyogVGhpcyBtYWNybyBwZXJtaXRzIHRoZSBwcm9jZXNzb3IgdG8gc3BlY2lmeSBhbGwgY2hhcmFjdGVycyB3aGljaAotICAgICBtYXkgYXBwZWFycyBpbiBhbiBvcGVyYW5kLiAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIHNjcnViYmVyIGZyb20KLSAgICAgZGlzY2FyZGluZyBtZWFuaW5nZnVsIHdoaXRlc3BhY2UgaW4gY2VydGFpbiBjYXNlcy4gIFRoZSBpMzg2Ci0gICAgIGJhY2tlbmQgdXNlcyB0aGlzIHRvIHN1cHBvcnQgcHJlZml4ZXMsIHdoaWNoIGNhbiBjb25mdXNlIHRoZQotICAgICBzY3J1YmJlciBhcyB0byB3aGV0aGVyIGl0IGlzIHBhcnNpbmcgb3BlcmFuZHMgb3Igb3Bjb2Rlcy4gICovCi0gIGZvciAocCA9IHRjX3N5bWJvbF9jaGFyczsgKnA7ICsrcCkKLSAgICBsZXhbKHVuc2lnbmVkIGNoYXIpICpwXSA9IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UOwotI2VuZGlmCi0KLSAgLyogVGhlIG02OGsgYmFja2VuZCB3YW50cyB0byBiZSBhYmxlIHRvIGNoYW5nZSBjb21tZW50X2NoYXJzLiAgKi8KLSNpZm5kZWYgdGNfY29tbWVudF9jaGFycwotI2RlZmluZSB0Y19jb21tZW50X2NoYXJzIGNvbW1lbnRfY2hhcnMKLSNlbmRpZgotICBmb3IgKHAgPSB0Y19jb21tZW50X2NoYXJzOyAqcDsgcCsrKQotICAgIHsKLSAgICAgIGxleFsodW5zaWduZWQgY2hhcikgKnBdID0gTEVYX0lTX0NPTU1FTlRfU1RBUlQ7Ci0gICAgfQkJCQkvKiBkZWNsYXJlIGNvbW1lbnQgY2hhcnMgKi8KLQotICBmb3IgKHAgPSBsaW5lX2NvbW1lbnRfY2hhcnM7ICpwOyBwKyspCi0gICAgewotICAgICAgbGV4Wyh1bnNpZ25lZCBjaGFyKSAqcF0gPSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUOwotICAgIH0JCQkJLyogZGVjbGFyZSBsaW5lIGNvbW1lbnQgY2hhcnMgKi8KLQotICBmb3IgKHAgPSBsaW5lX3NlcGFyYXRvcl9jaGFyczsgKnA7IHArKykKLSAgICB7Ci0gICAgICBsZXhbKHVuc2lnbmVkIGNoYXIpICpwXSA9IExFWF9JU19MSU5FX1NFUEFSQVRPUjsKLSAgICB9CQkJCS8qIGRlY2xhcmUgbGluZSBzZXBhcmF0b3JzICovCi0KLSAgLyogT25seSBhbGxvdyBzbGFzaC1zdGFyIGNvbW1lbnRzIGlmIHNsYXNoIGlzIG5vdCBpbiB1c2UuCi0gICAgIEZJWE1FOiBUaGlzIGlzbid0IHJpZ2h0LiAgV2Ugc2hvdWxkIGFsd2F5cyBwZXJtaXQgdGhlbS4gICovCi0gIGlmIChsZXhbJy8nXSA9PSAwKQotICAgIHsKLSAgICAgIGxleFsnLyddID0gTEVYX0lTX1RXT0NIQVJfQ09NTUVOVF8xU1Q7Ci0gICAgfQotCi0gIGlmIChtNjhrX21yaSkKLSAgICB7Ci0gICAgICBsZXhbJ1wnJ10gPSBMRVhfSVNfU1RSSU5HUVVPVEU7Ci0gICAgICBsZXhbJzsnXSA9IExFWF9JU19DT01NRU5UX1NUQVJUOwotICAgICAgbGV4WycqJ10gPSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUOwotICAgICAgLyogVGhlIE1SSSBkb2N1bWVudGF0aW9uIHNheXMgJyEnIGlzIExFWF9JU19DT01NRU5UX1NUQVJULCBidXQKLSAgICAgICAgIHRoZW4gaXQgY2FuJ3QgYmUgdXNlZCBpbiBhbiBleHByZXNzaW9uLiAgKi8KLSAgICAgIGxleFsnISddID0gTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVDsKLSAgICB9Ci0KLSNpZmRlZiBUQ19WODUwCi0gIGxleFsnLSddID0gTEVYX0lTX0RPVUJMRURBU0hfMVNUOwotI2VuZGlmCi0jaWZkZWYgVENfTTMyUgotICBsZXhbJ3wnXSA9IExFWF9JU19ET1VCTEVCQVJfMVNUOwotI2VuZGlmCi0jaWZkZWYgVENfRDMwVgotICAvKiBtdXN0IGRvIHRoaXMgaXMgd2Ugd2FudCBWTElXIGluc3RydWN0aW9uIHdpdGggIi0+IiBvciAiPC0iICovCi0gIGxleFsnLSddID0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQ7Ci0jZW5kaWYKLX0JCQkJLyogZG9fc2NydWJfYmVnaW4oKSAqLwotCi0vKiBTYXZlZCBzdGF0ZSBvZiB0aGUgc2NydWJiZXIgKi8KLXN0YXRpYyBpbnQgc3RhdGU7Ci1zdGF0aWMgaW50IG9sZF9zdGF0ZTsKLXN0YXRpYyBjaGFyICpvdXRfc3RyaW5nOwotc3RhdGljIGNoYXIgb3V0X2J1ZlsyMF07Ci1zdGF0aWMgaW50IGFkZF9uZXdsaW5lczsKLXN0YXRpYyBjaGFyICpzYXZlZF9pbnB1dDsKLXN0YXRpYyBpbnQgc2F2ZWRfaW5wdXRfbGVuOwotc3RhdGljIGNvbnN0IGNoYXIgKm1yaV9zdGF0ZTsKLXN0YXRpYyBjaGFyIG1yaV9sYXN0X2NoOwotCi0vKiBEYXRhIHN0cnVjdHVyZSBmb3Igc2F2aW5nIHRoZSBzdGF0ZSBvZiBhcHAgYWNyb3NzICNpbmNsdWRlJ3MuICBOb3RlIHRoYXQKLSAgIGFwcCBpcyBjYWxsZWQgYXN5bmNocm9ub3VzbHkgdG8gdGhlIHBhcnNpbmcgb2YgdGhlIC5pbmNsdWRlJ3MsIHNvIG91cgotICAgc3RhdGUgYXQgdGhlIHRpbWUgLmluY2x1ZGUgaXMgaW50ZXJwcmV0ZWQgaXMgY29tcGxldGVseSB1bnJlbGF0ZWQuCi0gICBUaGF0J3Mgd2h5IHdlIGhhdmUgdG8gc2F2ZSBpdCBhbGwuICAqLwotCi1zdHJ1Y3QgYXBwX3NhdmUKLSAgewotICAgIGludCAgICAgICAgICBzdGF0ZTsKLSAgICBpbnQgICAgICAgICAgb2xkX3N0YXRlOwotICAgIGNoYXIgKiAgICAgICBvdXRfc3RyaW5nOwotICAgIGNoYXIgICAgICAgICBvdXRfYnVmW3NpemVvZiAob3V0X2J1ZildOwotICAgIGludCAgICAgICAgICBhZGRfbmV3bGluZXM7Ci0gICAgY2hhciAqICAgICAgIHNhdmVkX2lucHV0OwotICAgIGludCAgICAgICAgICBzYXZlZF9pbnB1dF9sZW47Ci0gICAgaW50ICAgICAgICAgIHNjcnViX202OGtfbXJpOwotICAgIGNvbnN0IGNoYXIgKiBtcmlfc3RhdGU7Ci0gICAgY2hhciAgICAgICAgIG1yaV9sYXN0X2NoOwotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotICAgIGNvbnN0IGNoYXIgKiBzeW12ZXJfc3RhdGU7Ci0jZW5kaWYKLSAgfTsKLQotY2hhciAqCi1hcHBfcHVzaCAoKQotewotICByZWdpc3RlciBzdHJ1Y3QgYXBwX3NhdmUgKnNhdmVkOwotCi0gIHNhdmVkID0gKHN0cnVjdCBhcHBfc2F2ZSAqKSB4bWFsbG9jIChzaXplb2YgKCpzYXZlZCkpOwotICBzYXZlZC0+c3RhdGUgPSBzdGF0ZTsKLSAgc2F2ZWQtPm9sZF9zdGF0ZSA9IG9sZF9zdGF0ZTsKLSAgc2F2ZWQtPm91dF9zdHJpbmcgPSBvdXRfc3RyaW5nOwotICBtZW1jcHkgKHNhdmVkLT5vdXRfYnVmLCBvdXRfYnVmLCBzaXplb2YgKG91dF9idWYpKTsKLSAgc2F2ZWQtPmFkZF9uZXdsaW5lcyA9IGFkZF9uZXdsaW5lczsKLSAgc2F2ZWQtPnNhdmVkX2lucHV0ID0gc2F2ZWRfaW5wdXQ7Ci0gIHNhdmVkLT5zYXZlZF9pbnB1dF9sZW4gPSBzYXZlZF9pbnB1dF9sZW47Ci0gIHNhdmVkLT5zY3J1Yl9tNjhrX21yaSA9IHNjcnViX202OGtfbXJpOwotICBzYXZlZC0+bXJpX3N0YXRlID0gbXJpX3N0YXRlOwotICBzYXZlZC0+bXJpX2xhc3RfY2ggPSBtcmlfbGFzdF9jaDsKLSNpZiBkZWZpbmVkIFRDX0FSTSAmJiBkZWZpbmVkIE9CSl9FTEYKLSAgc2F2ZWQtPnN5bXZlcl9zdGF0ZSA9IHN5bXZlcl9zdGF0ZTsKLSNlbmRpZgotCi0gIC8qIGRvX3NjcnViX2JlZ2luKCkgaXMgbm90IHVzZWZ1bCwganVzdCB3YXN0ZXMgdGltZS4gKi8KLQotICBzdGF0ZSA9IDA7Ci0gIHNhdmVkX2lucHV0ID0gTlVMTDsKLQotICByZXR1cm4gKGNoYXIgKikgc2F2ZWQ7Ci19Ci0KLXZvaWQgCi1hcHBfcG9wIChhcmcpCi0gICAgIGNoYXIgKmFyZzsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IGFwcF9zYXZlICpzYXZlZCA9IChzdHJ1Y3QgYXBwX3NhdmUgKikgYXJnOwotCi0gIC8qIFRoZXJlIGlzIG5vIGRvX3NjcnViX2VuZCAoKS4gKi8KLSAgc3RhdGUgPSBzYXZlZC0+c3RhdGU7Ci0gIG9sZF9zdGF0ZSA9IHNhdmVkLT5vbGRfc3RhdGU7Ci0gIG91dF9zdHJpbmcgPSBzYXZlZC0+b3V0X3N0cmluZzsKLSAgbWVtY3B5IChvdXRfYnVmLCBzYXZlZC0+b3V0X2J1Ziwgc2l6ZW9mIChvdXRfYnVmKSk7Ci0gIGFkZF9uZXdsaW5lcyA9IHNhdmVkLT5hZGRfbmV3bGluZXM7Ci0gIHNhdmVkX2lucHV0ID0gc2F2ZWQtPnNhdmVkX2lucHV0OwotICBzYXZlZF9pbnB1dF9sZW4gPSBzYXZlZC0+c2F2ZWRfaW5wdXRfbGVuOwotICBzY3J1Yl9tNjhrX21yaSA9IHNhdmVkLT5zY3J1Yl9tNjhrX21yaTsKLSAgbXJpX3N0YXRlID0gc2F2ZWQtPm1yaV9zdGF0ZTsKLSAgbXJpX2xhc3RfY2ggPSBzYXZlZC0+bXJpX2xhc3RfY2g7Ci0jaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCi0gIHN5bXZlcl9zdGF0ZSA9IHNhdmVkLT5zeW12ZXJfc3RhdGU7Ci0jZW5kaWYKLQotICBmcmVlIChhcmcpOwotfQkJCQkvKiBhcHBfcG9wKCkgKi8KLQotLyogQEAgVGhpcyBhc3N1bWVzIHRoYXQgXG4gJmMgYXJlIHRoZSBzYW1lIG9uIGhvc3QgYW5kIHRhcmdldC4gIFRoaXMgaXMgbm90Ci0gICBuZWNlc3NhcmlseSB0cnVlLiAgKi8KLXN0YXRpYyBpbnQgCi1wcm9jZXNzX2VzY2FwZSAoY2gpCi0gICAgIGludCBjaDsKLXsKLSAgc3dpdGNoIChjaCkKLSAgICB7Ci0gICAgY2FzZSAnYic6Ci0gICAgICByZXR1cm4gJ1xiJzsKLSAgICBjYXNlICdmJzoKLSAgICAgIHJldHVybiAnXGYnOwotICAgIGNhc2UgJ24nOgotICAgICAgcmV0dXJuICdcbic7Ci0gICAgY2FzZSAncic6Ci0gICAgICByZXR1cm4gJ1xyJzsKLSAgICBjYXNlICd0JzoKLSAgICAgIHJldHVybiAnXHQnOwotICAgIGNhc2UgJ1wnJzoKLSAgICAgIHJldHVybiAnXCcnOwotICAgIGNhc2UgJyInOgotICAgICAgcmV0dXJuICdcIic7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBjaDsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgaW5wdXQgY2hhcmFjdGVycy4gIFRoZSBHRVQKLSAgIHBhcmFtZXRlciBpcyB1c2VkIHRvIHJldHJpZXZlIG1vcmUgaW5wdXQgY2hhcmFjdGVycy4gIEdFVCBzaG91bGQKLSAgIHNldCBpdHMgcGFyYW1ldGVyIHRvIHBvaW50IHRvIGEgYnVmZmVyLCBhbmQgcmV0dXJuIHRoZSBsZW5ndGggb2YKLSAgIHRoZSBidWZmZXI7IGl0IHNob3VsZCByZXR1cm4gMCBhdCBlbmQgb2YgZmlsZS4gIFRoZSBzY3J1YmJlZCBvdXRwdXQKLSAgIGNoYXJhY3RlcnMgYXJlIHB1dCBpbnRvIHRoZSBidWZmZXIgc3RhcnRpbmcgYXQgVE9TVEFSVDsgdGhlIFRPU1RBUlQKLSAgIGJ1ZmZlciBpcyBUT0xFTiBieXRlcyBpbiBsZW5ndGguICBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyCi0gICBvZiBzY3J1YmJlZCBjaGFyYWN0ZXJzIHB1dCBpbnRvIFRPU1RBUlQuICBUaGlzIHdpbGwgYmUgVE9MRU4gdW5sZXNzCi0gICBlbmQgb2YgZmlsZSB3YXMgc2Vlbi4gIFRoaXMgZnVuY3Rpb24gaXMgYXJyYW5nZWQgYXMgYSBzdGF0ZQotICAgbWFjaGluZSwgYW5kIHNhdmVzIGl0cyBzdGF0ZSBzbyB0aGF0IGl0IG1heSByZXR1cm4gYXQgYW55IHBvaW50LgotICAgVGhpcyBpcyB0aGUgd2F5IHRoZSBvbGQgY29kZSB1c2VkIHRvIHdvcmsuICAqLwotCi1pbnQKLWRvX3NjcnViX2NoYXJzIChnZXQsIHRvc3RhcnQsIHRvbGVuKQotICAgICBpbnQgKCpnZXQpIFBBUkFNUyAoKGNoYXIgKiopKTsKLSAgICAgY2hhciAqdG9zdGFydDsKLSAgICAgaW50IHRvbGVuOwotewotICBjaGFyICp0byA9IHRvc3RhcnQ7Ci0gIGNoYXIgKnRvZW5kID0gdG9zdGFydCArIHRvbGVuOwotICBjaGFyICpmcm9tOwotICBjaGFyICpmcm9tZW5kOwotICBpbnQgZnJvbWxlbjsKLSAgcmVnaXN0ZXIgaW50IGNoLCBjaDIgPSAwOwotCi0gIC8qU3RhdGUgMDogYmVnaW5uaW5nIG9mIG5vcm1hbCBsaW5lCi0JICAxOiBBZnRlciBmaXJzdCB3aGl0ZXNwYWNlIG9uIGxpbmUgKGZsdXNoIG1vcmUgd2hpdGUpCi0JICAyOiBBZnRlciBmaXJzdCBub24td2hpdGUgKG9wY29kZSkgb24gbGluZSAoa2VlcCAxd2hpdGUpCi0JICAzOiBhZnRlciBzZWNvbmQgd2hpdGUgb24gbGluZSAoaW50byBvcGVyYW5kcykgKGZsdXNoIHdoaXRlKQotCSAgNDogYWZ0ZXIgcHV0dGluZyBvdXQgYSAubGluZSwgcHV0IG91dCBkaWdpdHMKLQkgIDU6IHBhcnNpbmcgYSBzdHJpbmcsIHRoZW4gZ28gdG8gb2xkLXN0YXRlCi0JICA2OiBwdXR0aW5nIG91dCBcIGVzY2FwZSBpbiBhICJkIHN0cmluZy4KLQkgIDc6IEFmdGVyIHB1dHRpbmcgb3V0IGEgLmFwcGZpbGUsIHB1dCBvdXQgc3RyaW5nLgotCSAgODogQWZ0ZXIgcHV0dGluZyBvdXQgYSAuYXBwZmlsZSBzdHJpbmcsIGZsdXNoIHVudGlsIG5ld2xpbmUuCi0JICA5OiBBZnRlciBzZWVpbmcgc3ltYm9sIGNoYXIgaW4gc3RhdGUgMyAoa2VlcCAxd2hpdGUgYWZ0ZXIgc3ltY2hhcikKLQkgMTA6IEFmdGVyIHNlZWluZyB3aGl0ZXNwYWNlIGluIHN0YXRlIDkgKGtlZXAgd2hpdGUgYmVmb3JlIHN5bWNoYXIpCi0JIDExOiBBZnRlciBzZWVpbmcgYSBzeW1ib2wgY2hhcmFjdGVyIGluIHN0YXRlIDAgKGVnIGEgbGFiZWwgZGVmaW5pdGlvbikKLQkgLTE6IG91dHB1dCBzdHJpbmcgaW4gb3V0X3N0cmluZyBhbmQgZ28gdG8gdGhlIHN0YXRlIGluIG9sZF9zdGF0ZQotCSAtMjogZmx1c2ggdGV4dCB1bnRpbCBhICcqJyAnLycgaXMgc2VlbiwgdGhlbiBnbyB0byBzdGF0ZSBvbGRfc3RhdGUKLSNpZmRlZiBUQ19WODUwCi0gICAgICAgICAxMjogQWZ0ZXIgc2VlaW5nIGEgZGFzaCwgbG9va2luZyBmb3IgYSBzZWNvbmQgZGFzaCBhcyBhIHN0YXJ0IG9mIGNvbW1lbnQuCi0jZW5kaWYKLSNpZmRlZiBUQ19NMzJSCi0JIDEzOiBBZnRlciBzZWVpbmcgYSB2ZXJ0aWNhbCBiYXIsIGxvb2tpbmcgZm9yIGEgc2Vjb25kIHZlcnRpY2FsIGJhciBhcyBhIHBhcmFsbGVsIGV4cHJlc3Npb24gc2VwZXJhdG9yLgotI2VuZGlmCi0JICAqLwotCi0gIC8qIEkgYWRkZWQgc3RhdGVzIDkgYW5kIDEwIGJlY2F1c2UgdGhlIE1JUFMgRUNPRkYgYXNzZW1ibGVyIHVzZXMKLSAgICAgY29uc3RydWN0cyBsaWtlIGBgLmxvYyAxIDIwJycuICBUaGlzIHdhcyB0dXJuaW5nIGludG8gYGAubG9jCi0gICAgIDEyMCcnLiAgU3RhdGVzIDkgYW5kIDEwIGVuc3VyZSB0aGF0IGEgc3BhY2UgaXMgbmV2ZXIgZHJvcHBlZCBpbgotICAgICBiZXR3ZWVuIGNoYXJhY3RlcnMgd2hpY2ggY291bGQgYXBwZWFyIGluIGEgaWRlbnRpZmllci4gIElhbgotICAgICBUYXlsb3IsIGlhbkBjeWdudXMuY29tLgotCi0gICAgIEkgYWRkZWQgc3RhdGUgMTEgc28gdGhhdCBzb21ldGhpbmcgbGlrZSAiTGZvbyBhZGQgJXIyNSwlcjI2LCVyMjciIHdvcmtzCi0gICAgIGNvcnJlY3RseSBvbiB0aGUgUEEgKGFuZCBhbnkgb3RoZXIgdGFyZ2V0IHdoZXJlIGNvbG9ucyBhcmUgb3B0aW9uYWwpLgotICAgICBKZWZmIExhdywgbGF3QGNzLnV0YWguZWR1LgotCi0gICAgIEkgYWRkZWQgc3RhdGUgMTMgc28gdGhhdCBzb21ldGhpbmcgbGlrZSAiY21wIHIxLCByMiB8fCB0cmFwICMxIiBkb2VzIG5vdAotICAgICBnZXQgc3F1YXNoZWQgaW50byAiY21wIHIxLHIyfHx0cmFwIzEiLCB3aXRoIHRoZSBhbGwgaW1wb3J0YW50IHNwYWNlCi0gICAgIGJldHdlZW4gdGhlICd0cmFwJyBhbmQgdGhlICcjMScgYmVpbmcgZWxpbWluYXRlZC4gIG5pY2tjQGN5Z251cy5jb20gICovCi0KLSAgLyogVGhpcyBtYWNybyBnZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4gICovCi0KLSNkZWZpbmUgR0VUKCkJCQkJXAotICAoZnJvbSA8IGZyb21lbmQJCQlcCi0gICA/ICogKHVuc2lnbmVkIGNoYXIgKikgKGZyb20rKykJXAotICAgOiAoKHNhdmVkX2lucHV0ICE9IE5VTEwJCVwKLSAgICAgICA/IChmcmVlIChzYXZlZF9pbnB1dCksCQlcCi0JICBzYXZlZF9pbnB1dCA9IE5VTEwsCQlcCi0JICAwKQkJCQlcCi0gICAgICAgOiAwKSwJCQkJXAotICAgICAgZnJvbWxlbiA9ICgqZ2V0KSAoJmZyb20pLAkJXAotICAgICAgZnJvbWVuZCA9IGZyb20gKyBmcm9tbGVuLAkJXAotICAgICAgKGZyb21sZW4gPT0gMAkJCVwKLSAgICAgICA/IEVPRgkJCQlcCi0gICAgICAgOiAqICh1bnNpZ25lZCBjaGFyICopIChmcm9tKyspKSkpCi0KLSAgLyogVGhpcyBtYWNybyBwdXNoZXMgYSBjaGFyYWN0ZXIgYmFjayBvbiB0aGUgaW5wdXQgc3RyZWFtLiAgKi8KLQotI2RlZmluZSBVTkdFVCh1Y2gpICgqLS1mcm9tID0gKHVjaCkpCi0KLSAgLyogVGhpcyBtYWNybyBwdXRzIGEgY2hhcmFjdGVyIGludG8gdGhlIG91dHB1dCBidWZmZXIuICBJZiB0aGlzCi0gICAgIGNoYXJhY3RlciBmaWxscyB0aGUgb3V0cHV0IGJ1ZmZlciwgdGhpcyBtYWNybyBqdW1wcyB0byB0aGUgbGFiZWwKLSAgICAgVE9GVUxMLiAgV2UgdXNlIHRoaXMgcmF0aGVyIHVnbHkgYXBwcm9hY2ggYmVjYXVzZSB3ZSBuZWVkIHRvCi0gICAgIGhhbmRsZSB0d28gZGlmZmVyZW50IHRlcm1pbmF0aW9uIGNvbmRpdGlvbnM6IEVPRiBvbiB0aGUgaW5wdXQKLSAgICAgc3RyZWFtLCBhbmQgYSBmdWxsIG91dHB1dCBidWZmZXIuICBJdCB3b3VsZCBiZSBzaW1wbGVyIGlmIHdlCi0gICAgIGFsd2F5cyByZWFkIGluIHRoZSBlbnRpcmUgaW5wdXQgc3RyZWFtIGJlZm9yZSBwcm9jZXNzaW5nIGl0LCBidXQKLSAgICAgSSBkb24ndCB3YW50IHRvIG1ha2Ugc3VjaCBhIHNpZ25pZmljYW50IGNoYW5nZSB0byB0aGUgYXNzZW1ibGVyJ3MKLSAgICAgbWVtb3J5IHVzYWdlLiAgKi8KLQotI2RlZmluZSBQVVQocGNoKQkJCVwKLSAgZG8JCQkJCVwKLSAgICB7CQkJCQlcCi0gICAgICAqdG8rKyA9IChwY2gpOwkJCVwKLSAgICAgIGlmICh0byA+PSB0b2VuZCkJCQlcCi0gICAgICAgIGdvdG8gdG9mdWxsOwkJCVwKLSAgICB9CQkJCQlcCi0gIHdoaWxlICgwKQotCi0gIGlmIChzYXZlZF9pbnB1dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyb20gPSBzYXZlZF9pbnB1dDsKLSAgICAgIGZyb21lbmQgPSBmcm9tICsgc2F2ZWRfaW5wdXRfbGVuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZyb21sZW4gPSAoKmdldCkgKCZmcm9tKTsKLSAgICAgIGlmIChmcm9tbGVuID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBmcm9tZW5kID0gZnJvbSArIGZyb21sZW47Ci0gICAgfQotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIC8qIFRoZSBjYXNlcyBpbiB0aGlzIHN3aXRjaCBlbmQgd2l0aCBjb250aW51ZSwgaW4gb3JkZXIgdG8KLSAgICAgICAgIGJyYW5jaCBiYWNrIHRvIHRoZSB0b3Agb2YgdGhpcyB3aGlsZSBsb29wIGFuZCBnZW5lcmF0ZSB0aGUKLSAgICAgICAgIG5leHQgb3V0cHV0IGNoYXJhY3RlciBpbiB0aGUgYXBwcm9wcmlhdGUgc3RhdGUuICAqLwotICAgICAgc3dpdGNoIChzdGF0ZSkKLQl7Ci0JY2FzZSAtMToKLQkgIGNoID0gKm91dF9zdHJpbmcrKzsKLQkgIGlmICgqb3V0X3N0cmluZyA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgc3RhdGUgPSBvbGRfc3RhdGU7Ci0JICAgICAgb2xkX3N0YXRlID0gMzsKLQkgICAgfQotCSAgUFVUIChjaCk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgLTI6Ci0JICBmb3IgKDs7KQotCSAgICB7Ci0JICAgICAgZG8KLQkJewotCQkgIGNoID0gR0VUICgpOwotCi0JCSAgaWYgKGNoID09IEVPRikKLQkJICAgIHsKLQkJICAgICAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgaW4gY29tbWVudCIpKTsKLQkJICAgICAgZ290byBmcm9tZW9mOwotCQkgICAgfQotCi0JCSAgaWYgKGNoID09ICdcbicpCi0JCSAgICBQVVQgKCdcbicpOwotCQl9Ci0JICAgICAgd2hpbGUgKGNoICE9ICcqJyk7Ci0KLQkgICAgICB3aGlsZSAoKGNoID0gR0VUICgpKSA9PSAnKicpCi0JCTsKLQotCSAgICAgIGlmIChjaCA9PSBFT0YpCi0JCXsKLQkJICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBjb21tZW50IikpOwotCQkgIGdvdG8gZnJvbWVvZjsKLQkJfQotCi0JICAgICAgaWYgKGNoID09ICcvJykKLQkJYnJlYWs7Ci0KLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICB9Ci0KLQkgIHN0YXRlID0gb2xkX3N0YXRlOwotCSAgVU5HRVQgKCcgJyk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgNDoKLQkgIGNoID0gR0VUICgpOwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgZ290byBmcm9tZW9mOwotCSAgZWxzZSBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKLQkgICAgUFVUIChjaCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB3aGlsZSAoY2ggIT0gRU9GICYmIElTX1dISVRFU1BBQ0UgKGNoKSkKLQkJY2ggPSBHRVQgKCk7Ci0JICAgICAgaWYgKGNoID09ICciJykKLQkJewotCQkgIFVOR0VUIChjaCk7Ci0JCSAgaWYgKHNjcnViX202OGtfbXJpKQotCQkgICAgb3V0X3N0cmluZyA9ICJcblx0YXBwZmlsZSAiOwotCQkgIGVsc2UKLQkJICAgIG91dF9zdHJpbmcgPSAiXG5cdC5hcHBmaWxlICI7Ci0JCSAgb2xkX3N0YXRlID0gNzsKLQkJICBzdGF0ZSA9IC0xOwotCQkgIFBVVCAoKm91dF9zdHJpbmcrKyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB3aGlsZSAoY2ggIT0gRU9GICYmIGNoICE9ICdcbicpCi0JCSAgICBjaCA9IEdFVCAoKTsKLQkJICBzdGF0ZSA9IDA7Ci0JCSAgUFVUIChjaCk7Ci0JCX0KLQkgICAgfQotCSAgY29udGludWU7Ci0KLQljYXNlIDU6Ci0JICAvKiBXZSBhcmUgZ29pbmcgdG8gY29weSBldmVyeXRoaW5nIHVwIHRvIGEgcXVvdGUgY2hhcmFjdGVyLAotICAgICAgICAgICAgIHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgYSBiYWNrc2xhc2guICBXZSB0cnkgdG8KLSAgICAgICAgICAgICBvcHRpbWl6ZSB0aGUgY29weWluZyBpbiB0aGUgc2ltcGxlIGNhc2Ugd2l0aG91dCB1c2luZyB0aGUKLSAgICAgICAgICAgICBHRVQgYW5kIFBVVCBtYWNyb3MuICAqLwotCSAgewotCSAgICBjaGFyICpzOwotCSAgICBpbnQgbGVuOwotCi0JICAgIGZvciAocyA9IGZyb207IHMgPCBmcm9tZW5kOyBzKyspCi0JICAgICAgewotCQljaCA9ICpzOwotCQkvKiBUaGlzIGNvbmRpdGlvbiBtdXN0IGJlIGNoYW5nZWQgaWYgdGhlIHR5cGUgb2YgYW55Ci0gICAgICAgICAgICAgICAgICAgb3RoZXIgY2hhcmFjdGVyIGNhbiBiZSBMRVhfSVNfU1RSSU5HUVVPVEUuICAqLwotCQlpZiAoY2ggPT0gJ1xcJwotCQkgICAgfHwgY2ggPT0gJyInCi0JCSAgICB8fCBjaCA9PSAnXCcnCi0JCSAgICB8fCBjaCA9PSAnXG4nKQotCQkgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgbGVuID0gcyAtIGZyb207Ci0JICAgIGlmIChsZW4gPiB0b2VuZCAtIHRvKQotCSAgICAgIGxlbiA9IHRvZW5kIC0gdG87Ci0JICAgIGlmIChsZW4gPiAwKQotCSAgICAgIHsKLQkJbWVtY3B5ICh0bywgZnJvbSwgbGVuKTsKLQkJdG8gKz0gbGVuOwotCQlmcm9tICs9IGxlbjsKLQkgICAgICB9Ci0JICB9Ci0KLQkgIGNoID0gR0VUICgpOwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIHN0cmluZzogaW5zZXJ0ZWQgJ1wiJyIpKTsKLQkgICAgICBzdGF0ZSA9IG9sZF9zdGF0ZTsKLQkgICAgICBVTkdFVCAoJ1xuJyk7Ci0JICAgICAgUFVUICgnIicpOwotCSAgICB9Ci0JICBlbHNlIGlmIChsZXhbY2hdID09IExFWF9JU19TVFJJTkdRVU9URSkKLQkgICAgewotCSAgICAgIHN0YXRlID0gb2xkX3N0YXRlOwotCSAgICAgIFBVVCAoY2gpOwotCSAgICB9Ci0jaWZuZGVmIE5PX1NUUklOR19FU0NBUEVTCi0JICBlbHNlIGlmIChjaCA9PSAnXFwnKQotCSAgICB7Ci0JICAgICAgc3RhdGUgPSA2OwotCSAgICAgIFBVVCAoY2gpOwotCSAgICB9Ci0jZW5kaWYKLQkgIGVsc2UgaWYgKHNjcnViX202OGtfbXJpICYmIGNoID09ICdcbicpCi0JICAgIHsKLQkgICAgICAvKiBKdXN0IHF1aWV0bHkgdGVybWluYXRlIHRoZSBzdHJpbmcuICBUaGlzIHBlcm1pdHMgbGluZXMgbGlrZQotCQkgICBibmUJbGFiZWwJbG9vcCBpZiB3ZSBoYXZlbid0IHJlYWNoIGVuZCB5ZXQKLQkJICovCi0JICAgICAgc3RhdGUgPSBvbGRfc3RhdGU7Ci0JICAgICAgVU5HRVQgKGNoKTsKLQkgICAgICBQVVQgKCdcJycpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBQVVQgKGNoKTsKLQkgICAgfQotCSAgY29udGludWU7Ci0KLQljYXNlIDY6Ci0JICBzdGF0ZSA9IDU7Ci0JICBjaCA9IEdFVCAoKTsKLQkgIHN3aXRjaCAoY2gpCi0JICAgIHsKLQkgICAgICAvKiBIYW5kbGUgc3RyaW5ncyBicm9rZW4gYWNyb3NzIGxpbmVzLCBieSB0dXJuaW5nICdcbicgaW50bwotCQkgJ1xcJyBhbmQgJ24nLiAgKi8KLQkgICAgY2FzZSAnXG4nOgotCSAgICAgIFVOR0VUICgnbicpOwotCSAgICAgIGFkZF9uZXdsaW5lcysrOwotCSAgICAgIFBVVCAoJ1xcJyk7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnIic6Ci0JICAgIGNhc2UgJ1xcJzoKLQkgICAgY2FzZSAnYic6Ci0JICAgIGNhc2UgJ2YnOgotCSAgICBjYXNlICduJzoKLQkgICAgY2FzZSAncic6Ci0JICAgIGNhc2UgJ3QnOgotCSAgICBjYXNlICd2JzoKLQkgICAgY2FzZSAneCc6Ci0JICAgIGNhc2UgJ1gnOgotCSAgICBjYXNlICcwJzoKLQkgICAgY2FzZSAnMSc6Ci0JICAgIGNhc2UgJzInOgotCSAgICBjYXNlICczJzoKLQkgICAgY2FzZSAnNCc6Ci0JICAgIGNhc2UgJzUnOgotCSAgICBjYXNlICc2JzoKLQkgICAgY2FzZSAnNyc6Ci0JICAgICAgYnJlYWs7Ci0jaWYgZGVmaW5lZChJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUykgfCBkZWZpbmVkKE9OTFlfU1RBTkRBUkRfRVNDQVBFUykKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc193YXJuIChfKCJVbmtub3duIGVzY2FwZSAnXFwlYycgaW4gc3RyaW5nOiBJZ25vcmVkIiksIGNoKTsKLQkgICAgICBicmVhazsKLSNlbHNlICAvKiBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMgKi8KLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKiBBY2NlcHQgXHggYXMgeCBmb3IgYW55IHggKi8KLQkgICAgICBicmVhazsKLSNlbmRpZiAvKiBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMgKi8KLQotCSAgICBjYXNlIEVPRjoKLQkgICAgICBhc193YXJuIChfKCJFbmQgb2YgZmlsZSBpbiBzdHJpbmc6ICdcIicgaW5zZXJ0ZWQiKSk7Ci0JICAgICAgUFVUICgnIicpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBQVVQgKGNoKTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSA3OgotCSAgY2ggPSBHRVQgKCk7Ci0JICBzdGF0ZSA9IDU7Ci0JICBvbGRfc3RhdGUgPSA4OwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgZ290byBmcm9tZW9mOwotCSAgUFVUIChjaCk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgODoKLQkgIGRvCi0JICAgIGNoID0gR0VUICgpOwotCSAgd2hpbGUgKGNoICE9ICdcbicgJiYgY2ggIT0gRU9GKTsKLQkgIGlmIChjaCA9PSBFT0YpCi0JICAgIGdvdG8gZnJvbWVvZjsKLQkgIHN0YXRlID0gMDsKLQkgIFBVVCAoY2gpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBPSywgd2UgYXJlIHNvbWV3aGVyZSBpbiBzdGF0ZXMgMCB0aHJvdWdoIDQgb3IgOSB0aHJvdWdoIDExICovCi0KLSAgICAgIC8qIGZsdXNoY2hhcjogKi8KLSAgICAgIGNoID0gR0VUICgpOwotCi0gICAgcmVjeWNsZToKLQotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotICAgICAgLyogV2UgbmVlZCB0byB3YXRjaCBvdXQgZm9yIC5zeW12ZXIgZGlyZWN0aXZlcy4gIFNlZSB0aGUgY29tbWVudCBsYXRlcgotCSBpbiB0aGlzIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChzeW12ZXJfc3RhdGUgPT0gTlVMTCkKLQl7Ci0JICBpZiAoKHN0YXRlID09IDAgfHwgc3RhdGUgPT0gMSkgJiYgY2ggPT0gc3ltdmVyX3BzZXVkb1swXSkKLQkgICAgc3ltdmVyX3N0YXRlID0gc3ltdmVyX3BzZXVkbyArIDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGFkdmFuY2UgdG8gdGhlIG5leHQgc3RhdGUgaWYgd2UgZmluZCB0aGUgcmlnaHQKLQkgICAgIGNoYXJhY3Rlci4gICovCi0JICBpZiAoY2ggIT0gJ1wwJyAmJiAoKnN5bXZlcl9zdGF0ZSA9PSBjaCkpCi0JICAgICsrc3ltdmVyX3N0YXRlOwotCSAgZWxzZSBpZiAoKnN5bXZlcl9zdGF0ZSAhPSAnXDAnKQotCSAgICAvKiBXZSBkaWQgbm90IGdldCB0aGUgZXhwZWN0ZWQgY2hhcmFjdGVyLCBvciB3ZSBkaWRuJ3QKLQkgICAgICAgZ2V0IGEgdmFsaWQgdGVybWluYXRpbmcgY2hhcmFjdGVyIGFmdGVyIHNlZWluZyB0aGUKLQkgICAgICAgZW50aXJlIHBzZXVkby1vcCwgc28gd2UgbXVzdCBnbyBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuICAqLwotCSAgICBzeW12ZXJfc3RhdGUgPSBOVUxMOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UndmUgcmVhZCB0aGUgZW50aXJlIHBzZXVkby1vcC4gIElmIHRoaXMgaXMgdGhlIGVuZAotCQkgb2YgdGhlIGxpbmUsIGdvIGJhY2sgdG8gdGhlIGJlZ2lubmluZy4gICovCi0JICAgICAgaWYgKElTX05FV0xJTkUgKGNoKSkKLQkJc3ltdmVyX3N0YXRlID0gTlVMTDsKLQkgICAgfQotCX0KLSNlbmRpZiAvKiBUQ19BUk0gJiYgT0JKX0VMRiAqLwotCi0jaWZkZWYgVENfTTY4SwotICAgICAgLyogV2Ugd2FudCB0byBoYXZlIHBzZXVkby1vcHMgd2hpY2ggY29udHJvbCB3aGV0aGVyIHdlIGFyZSBpbgotICAgICAgICAgTVJJIG1vZGUgb3Igbm90LiAgVW5mb3J0dW5hdGVseSwgc2luY2UgbTY4ayBNUkkgbW9kZSBhZmZlY3RzCi0gICAgICAgICB0aGUgc2NydWJiZXIsIHRoYXQgbWVhbnMgdGhhdCB3ZSBuZWVkIGEgc3BlY2lhbCBwdXJwb3NlCi0gICAgICAgICByZWNvZ25pemVyIGhlcmUuICAqLwotICAgICAgaWYgKG1yaV9zdGF0ZSA9PSBOVUxMKQotCXsKLQkgIGlmICgoc3RhdGUgPT0gMCB8fCBzdGF0ZSA9PSAxKQotCSAgICAgICYmIGNoID09IG1yaV9wc2V1ZG9bMF0pCi0JICAgIG1yaV9zdGF0ZSA9IG1yaV9wc2V1ZG8gKyAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBhZHZhbmNlIHRvIHRoZSBuZXh0IHN0YXRlIGlmIHdlIGZpbmQgdGhlIHJpZ2h0Ci0JICAgICBjaGFyYWN0ZXIsIG9yIGlmIHdlIG5lZWQgYSBzcGFjZSBjaGFyYWN0ZXIgYW5kIHdlIGdldCBhbnkKLQkgICAgIHdoaXRlc3BhY2UgY2hhcmFjdGVyLCBvciBpZiB3ZSBuZWVkIGEgJzAnIGFuZCB3ZSBnZXQgYQotCSAgICAgJzEnICh0aGlzIGlzIHNvIHRoYXQgd2Ugb25seSBuZWVkIG9uZSBzdGF0ZSB0byBoYW5kbGUKLQkgICAgIGBgLm1yaSAwJycgYW5kIGBgLm1yaSAxJycpLiAgKi8KLQkgIGlmIChjaCAhPSAnXDAnCi0JICAgICAgJiYgKCptcmlfc3RhdGUgPT0gY2gKLQkJICB8fCAoKm1yaV9zdGF0ZSA9PSAnICcKLQkJICAgICAgJiYgbGV4W2NoXSA9PSBMRVhfSVNfV0hJVEVTUEFDRSkKLQkJICB8fCAoKm1yaV9zdGF0ZSA9PSAnMCcKLQkJICAgICAgJiYgY2ggPT0gJzEnKSkpCi0JICAgIHsKLQkgICAgICBtcmlfbGFzdF9jaCA9IGNoOwotCSAgICAgICsrbXJpX3N0YXRlOwotCSAgICB9Ci0JICBlbHNlIGlmICgqbXJpX3N0YXRlICE9ICdcMCcKLQkJICAgfHwgKGxleFtjaF0gIT0gTEVYX0lTX1dISVRFU1BBQ0UKLQkJICAgICAgICYmIGxleFtjaF0gIT0gTEVYX0lTX05FV0xJTkUpKQotCSAgICB7Ci0JICAgICAgLyogV2UgZGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIGNoYXJhY3Rlciwgb3Igd2UgZGlkbid0Ci0JCSBnZXQgYSB2YWxpZCB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIgYWZ0ZXIgc2VlaW5nIHRoZQotCQkgZW50aXJlIHBzZXVkby1vcCwgc28gd2UgbXVzdCBnbyBiYWNrIHRvIHRoZQotCQkgYmVnaW5uaW5nLiAgKi8KLQkgICAgICBtcmlfc3RhdGUgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSd2ZSByZWFkIHRoZSBlbnRpcmUgcHNldWRvLW9wLiAgbWlwc19sYXN0X2NoIGlzCi0gICAgICAgICAgICAgICAgIGVpdGhlciAnMCcgb3IgJzEnIGluZGljYXRpbmcgd2hldGhlciB0byBlbnRlciBvcgotICAgICAgICAgICAgICAgICBsZWF2ZSBNUkkgbW9kZS4gICovCi0JICAgICAgZG9fc2NydWJfYmVnaW4gKG1yaV9sYXN0X2NoID09ICcxJyk7Ci0JICAgICAgbXJpX3N0YXRlID0gTlVMTDsKLQotCSAgICAgIC8qIFdlIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBjaGFyYWN0ZXIgYXMgdXN1YWwuICBUaGUKLSAgICAgICAgICAgICAgICAgbWFpbiBnYXMgcmVhZGVyIG11c3QgYWxzbyBoYW5kbGUgdGhlIC5tcmkgcHNldWRvLW9wCi0gICAgICAgICAgICAgICAgIHRvIGNvbnRyb2wgZXhwcmVzc2lvbiBwYXJzaW5nIGFuZCB0aGUgbGlrZS4gICovCi0JICAgIH0KLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKGNoID09IEVPRikKLQl7Ci0JICBpZiAoc3RhdGUgIT0gMCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIG5vdCBhdCBlbmQgb2YgYSBsaW5lOyBuZXdsaW5lIGluc2VydGVkIikpOwotCSAgICAgIHN0YXRlID0gMDsKLQkgICAgICBQVVQgKCdcbicpOwotCSAgICB9Ci0JICBnb3RvIGZyb21lb2Y7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGxleFtjaF0pCi0JewotCWNhc2UgTEVYX0lTX1dISVRFU1BBQ0U6Ci0JICBkbwotCSAgICB7Ci0JICAgICAgY2ggPSBHRVQgKCk7Ci0JICAgIH0KLQkgIHdoaWxlIChjaCAhPSBFT0YgJiYgSVNfV0hJVEVTUEFDRSAoY2gpKTsKLQkgIGlmIChjaCA9PSBFT0YpCi0JICAgIGdvdG8gZnJvbWVvZjsKLQotCSAgaWYgKHN0YXRlID09IDApCi0JICAgIHsKLQkgICAgICAvKiBQcmVzZXJ2ZSBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBhdCB0aGUKLQkJIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotCSAgICAgIHN0YXRlID0gMTsKLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIFBVVCAoJyAnKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoSVNfQ09NTUVOVCAoY2gpCi0JICAgICAgfHwgY2ggPT0gJy8nCi0JICAgICAgfHwgSVNfTElORV9TRVBBUkFUT1IgKGNoKSkKLQkgICAgewotCSAgICAgIGlmIChzY3J1Yl9tNjhrX21yaSkKLQkJewotCQkgIC8qIEluIE1SSSBtb2RlLCB3ZSBrZWVwIHRoZXNlIHNwYWNlcy4gICovCi0JCSAgVU5HRVQgKGNoKTsKLQkJICBQVVQgKCcgJyk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBnb3RvIHJlY3ljbGU7Ci0JICAgIH0KLQotCSAgLyogSWYgd2UncmUgaW4gc3RhdGUgMiBvciAxMSwgd2UndmUgc2VlbiBhIG5vbi13aGl0ZQotCSAgICAgY2hhcmFjdGVyIGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UuICBJZiB0aGUgbmV4dCBjaGFyYWN0ZXIKLQkgICAgIGlzICc6JywgdGhpcyBpcyB3aGl0ZXNwYWNlIGFmdGVyIGEgbGFiZWwgbmFtZSB3aGljaCB3ZQotCSAgICAgbm9ybWFsbHkgbXVzdCBpZ25vcmUuICBJbiBNUkkgbW9kZSwgdGhvdWdoLCBzcGFjZXMgYXJlCi0JICAgICBub3QgcGVybWl0dGVkIGJldHdlZW4gdGhlIGxhYmVsIGFuZCB0aGUgY29sb24uICAqLwotCSAgaWYgKChzdGF0ZSA9PSAyIHx8IHN0YXRlID09IDExKQotCSAgICAgICYmIGxleFtjaF0gPT0gTEVYX0lTX0NPTE9OCi0JICAgICAgJiYgISBzY3J1Yl9tNjhrX21yaSkKLQkgICAgewotCSAgICAgIHN0YXRlID0gMTsKLQkgICAgICBQVVQgKGNoKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBzd2l0Y2ggKHN0YXRlKQotCSAgICB7Ci0JICAgIGNhc2UgMDoKLQkgICAgICBzdGF0ZSsrOwotCSAgICAgIGdvdG8gcmVjeWNsZTsJLyogUHVudGVkIGxlYWRpbmcgc3AgKi8KLQkgICAgY2FzZSAxOgotCSAgICAgIC8qIFdlIGNhbiBhcnJpdmUgaGVyZSBpZiB3ZSBsZWF2ZSBhIGxlYWRpbmcgd2hpdGVzcGFjZQotCQkgY2hhcmFjdGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLQkgICAgICBnb3RvIHJlY3ljbGU7Ci0JICAgIGNhc2UgMjoKLQkgICAgICBzdGF0ZSA9IDM7Ci0JICAgICAgaWYgKHRvICsgMSA8IHRvZW5kKQotCQl7Ci0JCSAgLyogT3B0aW1pemUgY29tbW9uIGNhc2UgYnkgc2tpcHBpbmcgVU5HRVQvR0VULiAgKi8KLQkJICBQVVQgKCcgJyk7CS8qIFNwIGFmdGVyIG9wY28gKi8KLQkJICBnb3RvIHJlY3ljbGU7Ci0JCX0KLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIFBVVCAoJyAnKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAzOgotCSAgICAgIGlmIChzY3J1Yl9tNjhrX21yaSkKLQkJewotCQkgIC8qIEluIE1SSSBtb2RlLCB3ZSBrZWVwIHRoZXNlIHNwYWNlcy4gICovCi0JCSAgVU5HRVQgKGNoKTsKLQkJICBQVVQgKCcgJyk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBnb3RvIHJlY3ljbGU7CS8qIFNwIGluIG9wZXJhbmRzICovCi0JICAgIGNhc2UgOToKLQkgICAgY2FzZSAxMDoKLQkgICAgICBpZiAoc2NydWJfbTY4a19tcmkpCi0JCXsKLQkJICAvKiBJbiBNUkkgbW9kZSwgd2Uga2VlcCB0aGVzZSBzcGFjZXMuICAqLwotCQkgIHN0YXRlID0gMzsKLQkJICBVTkdFVCAoY2gpOwotCQkgIFBVVCAoJyAnKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIHN0YXRlID0gMTA7CS8qIFNwIGFmdGVyIHN5bWJvbCBjaGFyICovCi0JICAgICAgZ290byByZWN5Y2xlOwotCSAgICBjYXNlIDExOgotCSAgICAgIGlmIChmbGFnX202OGtfbXJpCi0jaWZkZWYgTEFCRUxTX1dJVEhPVVRfQ09MT05TCi0JCSAgfHwgMQotI2VuZGlmCi0JCSAgKQotCQlzdGF0ZSA9IDE7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogV2Uga25vdyB0aGF0IGNoIGlzIG5vdCAnOicsIHNpbmNlIHdlIHRlc3RlZCB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICBjYXNlIGFib3ZlLiAgVGhlcmVmb3JlIHRoaXMgaXMgbm90IGEgbGFiZWwsIHNvIGl0Ci0gICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHRoZSBvcGNvZGUsIGFuZCB3ZSd2ZSBqdXN0IHNlZW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlIGFmdGVyIGl0LiAgKi8KLQkJICBzdGF0ZSA9IDM7Ci0JCX0KLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIFBVVCAoJyAnKTsJLyogU3AgYWZ0ZXIgbGFiZWwgZGVmaW5pdGlvbi4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgQkFEX0NBU0UgKHN0YXRlKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIExFWF9JU19UV09DSEFSX0NPTU1FTlRfMVNUOgotCSAgY2gyID0gR0VUICgpOwotCSAgaWYgKGNoMiA9PSAnKicpCi0JICAgIHsKLQkgICAgICBmb3IgKDs7KQotCQl7Ci0JCSAgZG8KLQkJICAgIHsKLQkJICAgICAgY2gyID0gR0VUICgpOwotCQkgICAgICBpZiAoY2gyICE9IEVPRiAmJiBJU19ORVdMSU5FIChjaDIpKQotCQkJYWRkX25ld2xpbmVzKys7Ci0JCSAgICB9Ci0JCSAgd2hpbGUgKGNoMiAhPSBFT0YgJiYgY2gyICE9ICcqJyk7Ci0KLQkJICB3aGlsZSAoY2gyID09ICcqJykKLQkJICAgIGNoMiA9IEdFVCAoKTsKLQotCQkgIGlmIChjaDIgPT0gRU9GIHx8IGNoMiA9PSAnLycpCi0JCSAgICBicmVhazsKLQotCQkgIC8qIFRoaXMgVU5HRVQgd2lsbCBlbnN1cmUgdGhhdCB3ZSBjb3VudCBuZXdsaW5lcwotICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGx5LiAgKi8KLQkJICBVTkdFVCAoY2gyKTsKLQkJfQotCi0JICAgICAgaWYgKGNoMiA9PSBFT0YpCi0JCWFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIG11bHRpbGluZSBjb21tZW50IikpOwotCi0JICAgICAgY2ggPSAnICc7Ci0JICAgICAgZ290byByZWN5Y2xlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoY2gyICE9IEVPRikKLQkJVU5HRVQgKGNoMik7Ci0JICAgICAgaWYgKHN0YXRlID09IDkgfHwgc3RhdGUgPT0gMTApCi0JCXN0YXRlID0gMzsKLQkgICAgICBQVVQgKGNoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIExFWF9JU19TVFJJTkdRVU9URToKLQkgIGlmIChzdGF0ZSA9PSAxMCkKLQkgICAgewotCSAgICAgIC8qIFByZXNlcnZlIHRoZSB3aGl0ZXNwYWNlIGluIGZvbyAiYmFyIiAqLwotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgc3RhdGUgPSAzOwotCSAgICAgIFBVVCAoJyAnKTsKLQotCSAgICAgIC8qIFBVVCBkaWRuJ3QganVtcCBvdXQuICBXZSBjb3VsZCBqdXN0IGJyZWFrLCBidXQgd2UKLSAgICAgICAgICAgICAgICAga25vdyB3aGF0IHdpbGwgaGFwcGVuLCBzbyBvcHRpbWl6ZSBhIGJpdC4gICovCi0JICAgICAgY2ggPSBHRVQgKCk7Ci0JICAgICAgb2xkX3N0YXRlID0gMzsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RhdGUgPT0gOSkKLQkgICAgb2xkX3N0YXRlID0gMzsKLQkgIGVsc2UKLQkgICAgb2xkX3N0YXRlID0gc3RhdGU7Ci0JICBzdGF0ZSA9IDU7Ci0JICBQVVQgKGNoKTsKLQkgIGJyZWFrOwotCi0jaWZuZGVmIElFRUVfU1RZTEUKLQljYXNlIExFWF9JU19PTkVDSEFSX1FVT1RFOgotCSAgaWYgKHN0YXRlID09IDEwKQotCSAgICB7Ci0JICAgICAgLyogUHJlc2VydmUgdGhlIHdoaXRlc3BhY2UgaW4gZm9vICdiJyAqLwotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgc3RhdGUgPSAzOwotCSAgICAgIFBVVCAoJyAnKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgY2ggPSBHRVQgKCk7Ci0JICBpZiAoY2ggPT0gRU9GKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgYWZ0ZXIgYSBvbmUtY2hhcmFjdGVyIHF1b3RlOyBcXDAgaW5zZXJ0ZWQiKSk7Ci0JICAgICAgY2ggPSAwOwotCSAgICB9Ci0JICBpZiAoY2ggPT0gJ1xcJykKLQkgICAgewotCSAgICAgIGNoID0gR0VUICgpOwotCSAgICAgIGlmIChjaCA9PSBFT0YpCi0JCXsKLQkJICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBlc2NhcGUgY2hhcmFjdGVyIikpOwotCQkgIGNoID0gJ1xcJzsKLQkJfQotCSAgICAgIGVsc2UKLQkJY2ggPSBwcm9jZXNzX2VzY2FwZSAoY2gpOwotCSAgICB9Ci0JICBzcHJpbnRmIChvdXRfYnVmLCAiJWQiLCAoaW50KSAodW5zaWduZWQgY2hhcikgY2gpOwotCi0JICAvKiBOb25lIG9mIHRoZXNlICd4IGNvbnN0YW50cyBmb3IgdXMuICBXZSB3YW50ICd4Jy4gICovCi0JICBpZiAoKGNoID0gR0VUICgpKSAhPSAnXCcnKQotCSAgICB7Ci0jaWZkZWYgUkVRVUlSRV9DSEFSX0NMT1NFX1FVT1RFCi0JICAgICAgYXNfd2FybiAoXygiTWlzc2luZyBjbG9zZSBxdW90ZTogKGFzc3VtZWQpIikpOwotI2Vsc2UKLQkgICAgICBpZiAoY2ggIT0gRU9GKQotCQlVTkdFVCAoY2gpOwotI2VuZGlmCi0JICAgIH0KLQkgIGlmIChzdHJsZW4gKG91dF9idWYpID09IDEpCi0JICAgIHsKLQkgICAgICBQVVQgKG91dF9idWZbMF0pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAoc3RhdGUgPT0gOSkKLQkgICAgb2xkX3N0YXRlID0gMzsKLQkgIGVsc2UKLQkgICAgb2xkX3N0YXRlID0gc3RhdGU7Ci0JICBzdGF0ZSA9IC0xOwotCSAgb3V0X3N0cmluZyA9IG91dF9idWY7Ci0JICBQVVQgKCpvdXRfc3RyaW5nKyspOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWNhc2UgTEVYX0lTX0NPTE9OOgotCSAgaWYgKHN0YXRlID09IDkgfHwgc3RhdGUgPT0gMTApCi0JICAgIHN0YXRlID0gMzsKLQkgIGVsc2UgaWYgKHN0YXRlICE9IDMpCi0JICAgIHN0YXRlID0gMTsKLQkgIFBVVCAoY2gpOwotCSAgYnJlYWs7Ci0KLQljYXNlIExFWF9JU19ORVdMSU5FOgotCSAgLyogUm9sbCBvdXQgYSBidW5jaCBvZiBuZXdsaW5lcyBmcm9tIGluc2lkZSBjb21tZW50cywgZXRjLiAgKi8KLQkgIGlmIChhZGRfbmV3bGluZXMpCi0JICAgIHsKLQkgICAgICAtLWFkZF9uZXdsaW5lczsKLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICB9Ci0JICAvKiBmYWxsIHRocnUgaW50by4uLiAqLwotCi0JY2FzZSBMRVhfSVNfTElORV9TRVBBUkFUT1I6Ci0JICBzdGF0ZSA9IDA7Ci0JICBQVVQgKGNoKTsKLQkgIGJyZWFrOwotCi0jaWZkZWYgVENfVjg1MAotCWNhc2UgTEVYX0lTX0RPVUJMRURBU0hfMVNUOgotCSAgY2gyID0gR0VUKCk7Ci0JICBpZiAoY2gyICE9ICctJykKLQkgICAgewotCSAgICAgIFVOR0VUIChjaDIpOwotCSAgICAgIGdvdG8gZGVfZmF1bHQ7Ci0JICAgIH0KLQkgIC8qIHJlYWQgYW5kIHNraXAgdG8gZW5kIG9mIGxpbmUgKi8KLQkgIGRvCi0JICAgIHsKLQkgICAgICBjaCA9IEdFVCAoKTsKLQkgICAgfQotCSAgd2hpbGUgKGNoICE9IEVPRiAmJiBjaCAhPSAnXG4nKTsKLQkgIGlmIChjaCA9PSBFT0YpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBjb21tZW50OyBuZXdsaW5lIGluc2VydGVkIikpOwotCSAgICB9Ci0JICBzdGF0ZSA9IDA7Ci0JICBQVVQgKCdcbicpOwotCSAgYnJlYWs7Ci0jZW5kaWYJICAgIAotI2lmZGVmIFRDX00zMlIKLQljYXNlIExFWF9JU19ET1VCTEVCQVJfMVNUOgotCSAgY2gyID0gR0VUKCk7Ci0JICBpZiAoY2gyICE9ICd8JykKLQkgICAgewotCSAgICAgIFVOR0VUIChjaDIpOwotCSAgICAgIGdvdG8gZGVfZmF1bHQ7Ci0JICAgIH0KLQkgIC8qIFJlc2V0IGJhY2sgdG8gc3RhdGUgMSBhbmQgcHJldGVuZCB0aGF0IHdlIGFyZSBwYXJzaW5nIGEgbGluZSBmcm9tCi0JICAgICBqdXN0IGFmdGVyIHRoZSBmaXJzdCB3aGl0ZSBzcGFjZS4gICovCi0JICBzdGF0ZSA9IDE7Ci0JICBQVVQgKCd8Jyk7Ci0JICBQVVQgKCd8Jyk7Ci0JICBicmVhazsKLSNlbmRpZgkgICAgCi0JY2FzZSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUOgotCSAgLyogRklYTUUtc29tZWRheTogVGhlIHR3byBjaGFyYWN0ZXIgY29tbWVudCBzdHVmZiB3YXMgYmFkbHkKLQkgICAgIHRob3VnaHQgb3V0LiAgT24gaTM4Niwgd2Ugd2FudCAnLycgYXMgbGluZSBjb21tZW50IHN0YXJ0Ci0JICAgICBBTkQgd2Ugd2FudCBDIHN0eWxlIGNvbW1lbnRzLiAgaGVuY2UgdGhpcyBoYWNrLiAgVGhlCi0JICAgICB3aG9sZSBsZXhpY2FsIHByb2Nlc3Mgc2hvdWxkIGJlIHJld29ya2VkLiAgeG94b3JpY2guICAqLwotCSAgaWYgKGNoID09ICcvJykKLQkgICAgewotCSAgICAgIGNoMiA9IEdFVCAoKTsKLQkgICAgICBpZiAoY2gyID09ICcqJykKLQkJewotCQkgIG9sZF9zdGF0ZSA9IDM7Ci0JCSAgc3RhdGUgPSAtMjsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIFVOR0VUIChjaDIpOwotCQl9Ci0JICAgIH0gLyogYmFkIGhhY2sgKi8KLQotCSAgaWYgKHN0YXRlID09IDAgfHwgc3RhdGUgPT0gMSkJLyogT25seSBjb21tZW50IGF0IHN0YXJ0IG9mIGxpbmUuICAqLwotCSAgICB7Ci0JICAgICAgaW50IHN0YXJ0Y2g7Ci0KLQkgICAgICBzdGFydGNoID0gY2g7Ci0KLQkgICAgICBkbwotCQl7Ci0JCSAgY2ggPSBHRVQgKCk7Ci0JCX0KLQkgICAgICB3aGlsZSAoY2ggIT0gRU9GICYmIElTX1dISVRFU1BBQ0UgKGNoKSk7Ci0JICAgICAgaWYgKGNoID09IEVPRikKLQkJewotCQkgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIGNvbW1lbnQ7IG5ld2xpbmUgaW5zZXJ0ZWQiKSk7Ci0JCSAgUFVUICgnXG4nKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JyB8fCBzdGF0ZSAhPSAwIHx8IHN0YXJ0Y2ggIT0gJyMnKQotCQl7Ci0JCSAgLyogTm90IGEgY3BwIGxpbmUuICAqLwotCQkgIHdoaWxlIChjaCAhPSBFT0YgJiYgIUlTX05FV0xJTkUgKGNoKSkKLQkJICAgIGNoID0gR0VUICgpOwotCQkgIGlmIChjaCA9PSBFT0YpCi0JCSAgICBhc193YXJuIChfKCJFT0YgaW4gQ29tbWVudDogTmV3bGluZSBpbnNlcnRlZCIpKTsKLQkJICBzdGF0ZSA9IDA7Ci0JCSAgUFVUICgnXG4nKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIC8qIExva3MgbGlrZSBgIyAxMjMgImZpbGVuYW1lIicgZnJvbSBjcHAuICAqLwotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgb2xkX3N0YXRlID0gNDsKLQkgICAgICBzdGF0ZSA9IC0xOwotCSAgICAgIGlmIChzY3J1Yl9tNjhrX21yaSkKLQkJb3V0X3N0cmluZyA9ICJcdGFwcGxpbmUgIjsKLQkgICAgICBlbHNlCi0JCW91dF9zdHJpbmcgPSAiXHQuYXBwbGluZSAiOwotCSAgICAgIFBVVCAoKm91dF9zdHJpbmcrKyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotI2lmZGVmIFRDX0QxMFYKLQkgIC8qIEFsbCBpbnNucyBlbmQgaW4gYSBjaGFyIGZvciB3aGljaCBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVCBpcyB0cnVlLgotCSAgICAgVHJhcCBpcyB0aGUgb25seSBzaG9ydCBpbnNuIHRoYXQgaGFzIGEgZmlyc3Qgb3BlcmFuZCB0aGF0IGlzCi0JICAgICBuZWl0aGVyIHJlZ2lzdGVyIG5vciBsYWJlbC4KLQkgICAgIFdlIG11c3QgcHJldmVudCBleGVmMGYgfHx0cmFwICMxIHRvIGRlZ2VuZXJhdGUgdG8gZXhlZjBmIHx8dHJhcCMxIC4KLQkgICAgIFdlIGNhbid0IG1ha2UgJyMnIExFWF9JU19TWU1CT0xfQ09NUE9ORU5UIGJlY2F1c2UgaXQgaXMgYWxyZWFkeQotCSAgICAgTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVC4gIEhvd2V2ZXIsIGl0IGlzIHRoZSBvbmx5IGNoYXJhY3RlciBpbgotCSAgICAgbGluZV9jb21tZW50X2NoYXJzIGZvciBkMTB2LCBoZW5jZSB3ZSBjYW4gcmVjb2duaXplIGl0IGFzIHN1Y2guICAqLwotCSAgLyogQW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2ggd291bGQgYmUgdG8gcmVzZXQgdGhlIHN0YXRlIHRvIDEgd2hlbgotCSAgICAgd2Ugc2VlICd8fCcsICc8Jy0gb3IgJy0+JywgYnV0IHRoYXQgc2VlbXMgdG8gYmUgb3ZlcmtpbGwuICAqLwotCSAgaWYgKHN0YXRlID09IDEwKSBQVVQgKCcgJyk7Ci0jZW5kaWYKLQkgIC8qIFdlIGhhdmUgYSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyIHdoaWNoIGlzIG5vdCBhdCB0aGUKLQkgICAgIHN0YXJ0IG9mIGEgbGluZS4gIElmIHRoaXMgaXMgYWxzbyBhIG5vcm1hbCBjb21tZW50Ci0JICAgICBjaGFyYWN0ZXIsIGZhbGwgdGhyb3VnaC4gIE90aGVyd2lzZSB0cmVhdCBpdCBhcyBhIGRlZmF1bHQKLQkgICAgIGNoYXJhY3Rlci4gICovCi0JICBpZiAoc3RyY2hyICh0Y19jb21tZW50X2NoYXJzLCBjaCkgPT0gTlVMTAotCSAgICAgICYmICghIHNjcnViX202OGtfbXJpCi0JCSAgfHwgKGNoICE9ICchJyAmJiBjaCAhPSAnKicpKSkKLQkgICAgZ290byBkZV9mYXVsdDsKLQkgIGlmIChzY3J1Yl9tNjhrX21yaQotCSAgICAgICYmIChjaCA9PSAnIScgfHwgY2ggPT0gJyonIHx8IGNoID09ICcjJykKLQkgICAgICAmJiBzdGF0ZSAhPSAxCi0JICAgICAgJiYgc3RhdGUgIT0gMTApCi0JICAgIGdvdG8gZGVfZmF1bHQ7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgTEVYX0lTX0NPTU1FTlRfU1RBUlQ6Ci0jaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCi0JICAvKiBPbiB0aGUgQVJNLCBgQCcgaXMgdGhlIGNvbW1lbnQgY2hhcmFjdGVyLgotCSAgICAgVW5mb3J0dW5hdGVseSB0aGlzIGlzIGFsc28gYSBzcGVjaWFsIGNoYXJhY3RlciBpbiBFTEYgLnN5bXZlcgotCSAgICAgZGlyZWN0aXZlcyAoYW5kIC50eXBlLCB0aG91Z2ggd2UgZGVhbCB3aXRoIHRob3NlIGFub3RoZXIgd2F5KS4gIFNvCi0JICAgICB3ZSBjaGVjayBpZiB0aGlzIGxpbmUgaXMgc3VjaCBhIGRpcmVjdGl2ZSwgYW5kIHRyZWF0IHRoZSBjaGFyYWN0ZXIKLQkgICAgIGFzIGRlZmF1bHQgaWYgc28uICBUaGlzIGlzIGEgaGFjay4gICovCi0JICBpZiAoKHN5bXZlcl9zdGF0ZSAhPSBOVUxMKSAmJiAoKnN5bXZlcl9zdGF0ZSA9PSAwKSkKLQkgICAgZ290byBkZV9mYXVsdDsKLSNlbmRpZgotCSAgZG8KLQkgICAgewotCSAgICAgIGNoID0gR0VUICgpOwotCSAgICB9Ci0JICB3aGlsZSAoY2ggIT0gRU9GICYmICFJU19ORVdMSU5FIChjaCkpOwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgaW4gY29tbWVudDsgbmV3bGluZSBpbnNlcnRlZCIpKTsKLQkgIHN0YXRlID0gMDsKLQkgIFBVVCAoJ1xuJyk7Ci0JICBicmVhazsKLQotCWNhc2UgTEVYX0lTX1NZTUJPTF9DT01QT05FTlQ6Ci0JICBpZiAoc3RhdGUgPT0gMTApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgc3ltYm9sIGNoYXJhY3RlciBmb2xsb3dpbmcgYW5vdGhlciBzeW1ib2wKLQkJIGNoYXJhY3Rlciwgd2l0aCB3aGl0ZXNwYWNlIGluIGJldHdlZW4uICBXZSBza2lwcGVkCi0JCSB0aGUgd2hpdGVzcGFjZSBlYXJsaWVyLCBzbyBvdXRwdXQgaXQgbm93LiAgKi8KLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIHN0YXRlID0gMzsKLQkgICAgICBQVVQgKCcgJyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHN0YXRlID09IDMpCi0JICAgIHN0YXRlID0gOTsKLQotCSAgLyogVGhpcyBpcyBhIGNvbW1vbiBjYXNlLiAgUXVpY2tseSBjb3B5IENIIGFuZCBhbGwgdGhlCi0gICAgICAgICAgICAgZm9sbG93aW5nIHN5bWJvbCBjb21wb25lbnQgb3Igbm9ybWFsIGNoYXJhY3RlcnMuICAqLwotCSAgaWYgKHRvICsgMSA8IHRvZW5kCi0JICAgICAgJiYgbXJpX3N0YXRlID09IE5VTEwKLSNpZiBkZWZpbmVkIFRDX0FSTSAmJiBkZWZpbmVkIE9CSl9FTEYKLQkgICAgICAmJiBzeW12ZXJfc3RhdGUgPT0gTlVMTAotI2VuZGlmCi0JICAgICAgKQotCSAgICB7Ci0JICAgICAgY2hhciAqczsKLQkgICAgICBpbnQgbGVuOwotCi0JICAgICAgZm9yIChzID0gZnJvbTsgcyA8IGZyb21lbmQ7IHMrKykKLQkJewotCQkgIGludCB0eXBlOwotCi0JCSAgY2gyID0gKiAodW5zaWduZWQgY2hhciAqKSBzOwotCQkgIHR5cGUgPSBsZXhbY2gyXTsKLQkJICBpZiAodHlwZSAhPSAwCi0JCSAgICAgICYmIHR5cGUgIT0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQpCi0JCSAgICBicmVhazsKLQkJfQotCSAgICAgIGlmIChzID4gZnJvbSkKLQkJewotCQkgIC8qIEhhbmRsZSB0aGUgbGFzdCBjaGFyYWN0ZXIgbm9ybWFsbHksIGZvcgotICAgICAgICAgICAgICAgICAgICAgc2ltcGxpY2l0eS4gICovCi0JCSAgLS1zOwotCQl9Ci0JICAgICAgbGVuID0gcyAtIGZyb207Ci0JICAgICAgaWYgKGxlbiA+ICh0b2VuZCAtIHRvKSAtIDEpCi0JCWxlbiA9ICh0b2VuZCAtIHRvKSAtIDE7Ci0JICAgICAgaWYgKGxlbiA+IDApCi0JCXsKLQkJICBQVVQgKGNoKTsKLQkJICBpZiAobGVuID4gOCkKLQkJICAgIHsKLQkJICAgICAgbWVtY3B5ICh0bywgZnJvbSwgbGVuKTsKLQkJICAgICAgdG8gKz0gbGVuOwotCQkgICAgICBmcm9tICs9IGxlbjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHN3aXRjaCAobGVuKQotCQkJewotCQkJY2FzZSA4OiAqdG8rKyA9ICpmcm9tKys7Ci0JCQljYXNlIDc6ICp0bysrID0gKmZyb20rKzsKLQkJCWNhc2UgNjogKnRvKysgPSAqZnJvbSsrOwotCQkJY2FzZSA1OiAqdG8rKyA9ICpmcm9tKys7Ci0JCQljYXNlIDQ6ICp0bysrID0gKmZyb20rKzsKLQkJCWNhc2UgMzogKnRvKysgPSAqZnJvbSsrOwotCQkJY2FzZSAyOiAqdG8rKyA9ICpmcm9tKys7Ci0JCQljYXNlIDE6ICp0bysrID0gKmZyb20rKzsKLQkJCX0KLQkJICAgIH0gCi0JCSAgY2ggPSBHRVQgKCk7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWRlZmF1bHQ6Ci0JZGVfZmF1bHQ6Ci0JICAvKiBTb21lIHJlbGF0aXZlbHkgYG5vcm1hbCcgY2hhcmFjdGVyLiAgKi8KLQkgIGlmIChzdGF0ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgc3RhdGUgPSAxMTsJLyogTm93IHNlZWluZyBsYWJlbCBkZWZpbml0aW9uICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKHN0YXRlID09IDEpCi0JICAgIHsKLQkgICAgICBzdGF0ZSA9IDI7CS8qIERpdHRvICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKHN0YXRlID09IDkpCi0JICAgIHsKLQkgICAgICBpZiAobGV4W2NoXSAhPSBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVCkKLQkJc3RhdGUgPSAzOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdGF0ZSA9PSAxMCkKLQkgICAgewotCSAgICAgIHN0YXRlID0gMzsKLQkgICAgfQotCSAgUFVUIChjaCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qTk9UUkVBQ0hFRCovCi0KLSBmcm9tZW9mOgotICAvKiBXZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuICAqLwotICByZXR1cm4gdG8gLSB0b3N0YXJ0OwotCi0gdG9mdWxsOgotICAvKiBUaGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsLiAgU2F2ZSBhbnkgaW5wdXQgd2UgaGF2ZSBub3QgeWV0Ci0gICAgIHByb2Nlc3NlZC4gICovCi0gIGlmIChmcm9tZW5kID4gZnJvbSkKLSAgICB7Ci0gICAgICBjaGFyICpzYXZlOwotCi0gICAgICBzYXZlID0gKGNoYXIgKikgeG1hbGxvYyAoZnJvbWVuZCAtIGZyb20pOwotICAgICAgbWVtY3B5IChzYXZlLCBmcm9tLCBmcm9tZW5kIC0gZnJvbSk7Ci0gICAgICBpZiAoc2F2ZWRfaW5wdXQgIT0gTlVMTCkKLQlmcmVlIChzYXZlZF9pbnB1dCk7Ci0gICAgICBzYXZlZF9pbnB1dCA9IHNhdmU7Ci0gICAgICBzYXZlZF9pbnB1dF9sZW4gPSBmcm9tZW5kIC0gZnJvbTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc2F2ZWRfaW5wdXQgIT0gTlVMTCkKLQl7Ci0JICBmcmVlIChzYXZlZF9pbnB1dCk7Ci0JICBzYXZlZF9pbnB1dCA9IE5VTEw7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRvIC0gdG9zdGFydDsKLX0KLQotLyogZW5kIG9mIGFwcC5jICovCmRpZmYgLS1naXQgYS9nYXMvYXMuYyBiL2dhcy9hcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2RkMzU3Li4wMDAwMDAwCi0tLSBhL2dhcy9hcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMCArMCwwIEBACi0vKiBhcy5jIC0gR0FTIG1haW4gcHJvZ3JhbS4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotLyoKLSAqIE1haW4gcHJvZ3JhbSBmb3IgQVM7IGEgMzItYml0IGFzc2VtYmxlciBvZiBHTlUuCi0gKiBVbmRlcnN0YW5kcyBjb21tYW5kIGFyZ3VtZW50cy4KLSAqIEhhcyBhIGZldyByb3V0aW5lcyB0aGF0IGRvbid0IGZpdCBpbiBvdGhlciBtb2R1bGVzIGJlY2F1c2UgdGhleQotICogYXJlIHNoYXJlZC4KLSAqCi0gKgotICoJCQlidWdzCi0gKgotICogOiBpbml0aWFsaXNlcnMKLSAqCVNpbmNlIG5vLW9uZSBlbHNlIHNheXMgdGhleSB3aWxsIHN1cHBvcnQgdGhlbSBpbiBmdXR1cmU6IEkKLSAqIGRvbid0IHN1cHBvcnQgdGhlbSBub3cuCi0gKgotICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0jZGVmaW5lIENPTU1PTgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib3V0cHV0LWZpbGUuaCIKLSNpbmNsdWRlICJzYi5oIgotI2luY2x1ZGUgIm1hY3JvLmgiCi0KLSNpZm5kZWYgSEFWRV9JVEJMX0NQVQotI2RlZmluZSBpdGJsX3BhcnNlKGl0YmxfZmlsZSkgMQotI2RlZmluZSBpdGJsX2luaXQoKQotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NCUksKLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLWV4dGVybiBQVFIgc2JyayAoKTsKLSNlbmRpZgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIHNob3dfdXNhZ2UgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgdm9pZCBwYXJzZV9hcmdzIFBBUkFNUyAoKGludCAqLCBjaGFyICoqKikpOwotc3RhdGljIHZvaWQgZHVtcF9zdGF0aXN0aWNzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyBQQVJBTVMgKChpbnQgYXJnYywgY2hhciAqKmFyZ3YpKTsKLXN0YXRpYyBpbnQgbWFjcm9fZXhwciBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgc2IgKiwgaW50ICopKTsKLQotaW50IGxpc3Rpbmc7CQkJLyogdHJ1ZSBpZiBhIGxpc3RpbmcgaXMgd2FudGVkICovCi0KLXN0YXRpYyBjaGFyICpsaXN0aW5nX2ZpbGVuYW1lID0gTlVMTDsJLyogTmFtZSBvZiBsaXN0aW5nIGZpbGUuICAqLwotCi0vKiBUeXBlIG9mIGRlYnVnZ2luZyB0byBnZW5lcmF0ZS4gICovCi0KLWVudW0gZGVidWdfaW5mb190eXBlIGRlYnVnX3R5cGUgPSBERUJVR19OT05FOwotCi0vKiBNYXhpbXVtIGxldmVsIG9mIG1hY3JvIG5lc3RpbmcuICAqLwotCi1pbnQgbWF4X21hY3JvX25lc3QgPSAxMDA7Ci0KLWNoYXIgKm15bmFtZTsJCQkvKiBhcmd2WzBdICovCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc2VnVCByZWdfc2VjdGlvbiwgZXhwcl9zZWN0aW9uOwotc2VnVCB0ZXh0X3NlY3Rpb24sIGRhdGFfc2VjdGlvbiwgYnNzX3NlY3Rpb247Ci0jZW5kaWYKLQotLyogVGhlIGRlZmF1bHQgb2JzdGFjayBjaHVuayBzaXplLiAgSWYgd2Ugc2V0IHRoaXMgdG8gemVybywgdGhlCi0gICBvYnN0YWNrIGNvZGUgd2lsbCB1c2Ugd2hhdGV2ZXIgd2lsbCBmaXQgaW4gYSA0MDk2IGJ5dGUgYmxvY2suICAqLwotaW50IGNodW5rc2l6ZSA9IDA7Ci0KLS8qIFRvIG1vbml0b3IgbWVtb3J5IGFsbG9jYXRpb24gbW9yZSBlZmZlY3RpdmVseSwgbWFrZSB0aGlzIG5vbi16ZXJvLgotICAgVGhlbiB0aGUgY2h1bmsgc2l6ZXMgZm9yIGdhcyBhbmQgYmZkIHdpbGwgYmUgcmVkdWNlZC4gICovCi1pbnQgZGVidWdfbWVtb3J5ID0gMDsKLQotLyogV2UgYnVpbGQgYSBsaXN0IG9mIGRlZnN5bXMgYXMgd2UgcmVhZCB0aGUgb3B0aW9ucywgYW5kIHRoZW4gZGVmaW5lCi0gICB0aGVtIGFmdGVyIHdlIGhhdmUgaW5pdGlhbGl6ZWQgZXZlcnl0aGluZy4gICovCi0KLXN0cnVjdCBkZWZzeW1fbGlzdAotewotICBzdHJ1Y3QgZGVmc3ltX2xpc3QgKm5leHQ7Ci0gIGNoYXIgKm5hbWU7Ci0gIHZhbHVlVCB2YWx1ZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGVmc3ltX2xpc3QgKmRlZnN5bXM7Ci0KLS8qIEtlZXAgYSByZWNvcmQgb2YgdGhlIGl0YmwgZmlsZXMgd2UgcmVhZCBpbi4gKi8KLQotc3RydWN0IGl0YmxfZmlsZV9saXN0Ci17Ci0gIHN0cnVjdCBpdGJsX2ZpbGVfbGlzdCAqbmV4dDsKLSAgY2hhciAqbmFtZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXRibF9maWxlX2xpc3QgKml0YmxfZmlsZXM7Ci0MCi12b2lkCi1wcmludF92ZXJzaW9uX2lkICgpCi17Ci0gIHN0YXRpYyBpbnQgcHJpbnRlZDsKLSAgaWYgKHByaW50ZWQpCi0gICAgcmV0dXJuOwotICBwcmludGVkID0gMTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJHTlUgYXNzZW1ibGVyIHZlcnNpb24gJXMgKCVzKSB1c2luZyBCRkQgdmVyc2lvbiAlcyIpLAotCSAgIFZFUlNJT04sIFRBUkdFVF9BTElBUywgQkZEX1ZFUlNJT04pOwotI2Vsc2UKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJHTlUgYXNzZW1ibGVyIHZlcnNpb24gJXMgKCVzKSIpLCBWRVJTSU9OLCBUQVJHRVRfQUxJQVMpOwotI2VuZGlmCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJVc2FnZTogJXMgW29wdGlvbi4uLl0gW2FzbWZpbGUuLi5dXG4iKSwgbXluYW1lKTsKLQotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLU9wdGlvbnM6XG5cCi0gIC1hW3N1Yi1vcHRpb24uLi5dCXR1cm4gb24gbGlzdGluZ3NcblwKLSAgICBTdWItb3B0aW9ucyBbZGVmYXVsdCBobHNdOlxuXAotICAgIGMgICBvbWl0IGZhbHNlIGNvbmRpdGlvbmFsc1xuXAotICAgIGQgICBvbWl0IGRlYnVnZ2luZyBkaXJlY3RpdmVzXG5cCi0gICAgaCAgIGluY2x1ZGUgaGlnaC1sZXZlbCBzb3VyY2VcblwKLSAgICBsICAgaW5jbHVkZSBhc3NlbWJseVxuXAotICAgIG0gICBpbmNsdWRlIG1hY3JvIGV4cGFuc2lvbnNcblwKLSAgICBuICAgb21pdCBmb3JtcyBwcm9jZXNzaW5nXG5cCi0gICAgcyAgIGluY2x1ZGUgc3ltYm9sc1xuXAotICAgID1maWxlIHNldCBsaXN0aW5nIGZpbGUgbmFtZSAobXVzdCBiZSBsYXN0IHN1Yi1vcHRpb24pXG4iKSk7Ci0gIAotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLUQJCSAgICAgICAgICBwcm9kdWNlIGFzc2VtYmxlciBkZWJ1Z2dpbmcgbWVzc2FnZXNcblwKLSAgLS1kZWZzeW0gU1lNPVZBTCAgICAgICAgZGVmaW5lIHN5bWJvbCBTWU0gdG8gZ2l2ZW4gdmFsdWVcblwKLSAgLWYJCSAgICAgICAgICBza2lwIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQgcHJlcHJvY2Vzc2luZ1xuXAotICAtLWdzdGFicwkgICAgICAgICAgZ2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uXG5cCi0gIC0taGVscAkJICBzaG93IHRoaXMgbWVzc2FnZSBhbmQgZXhpdFxuXAotICAtSSBESVIJCSAgYWRkIERJUiB0byBzZWFyY2ggbGlzdCBmb3IgLmluY2x1ZGUgZGlyZWN0aXZlc1xuXAotICAtSgkJICAgICAgICAgIGRvbid0IHdhcm4gYWJvdXQgc2lnbmVkIG92ZXJmbG93XG5cCi0gIC1LCQkgICAgICAgICAgd2FybiB3aGVuIGRpZmZlcmVuY2VzIGFsdGVyZWQgZm9yIGxvbmcgZGlzcGxhY2VtZW50c1xuXAotICAtTCwtLWtlZXAtbG9jYWxzICAgICAgICBrZWVwIGxvY2FsIHN5bWJvbHMgKGUuZy4gc3RhcnRpbmcgd2l0aCBgTCcpXG4iKSk7Ci0gIAotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLU0sLS1tcmkJICAgICAgICAgIGFzc2VtYmxlIGluIE1SSSBjb21wYXRpYmlsaXR5IG1vZGVcblwKLSAgLS1NRCBGSUxFCSAgICAgICAgICB3cml0ZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGluIEZJTEUgKGRlZmF1bHQgbm9uZSlcblwKLSAgLW5vY3BwCQkgIGlnbm9yZWRcblwKLSAgLW8gT0JKRklMRQkgICAgICAgICAgbmFtZSB0aGUgb2JqZWN0LWZpbGUgb3V0cHV0IE9CSkZJTEUgKGRlZmF1bHQgYS5vdXQpXG5cCi0gIC1SCQkgICAgICAgICAgZm9sZCBkYXRhIHNlY3Rpb24gaW50byB0ZXh0IHNlY3Rpb25cblwKLSAgLS1zdGF0aXN0aWNzCSAgICAgICAgICBwcmludCB2YXJpb3VzIG1lYXN1cmVkIHN0YXRpc3RpY3MgZnJvbSBleGVjdXRpb25cblwKLSAgLS1zdHJpcC1sb2NhbC1hYnNvbHV0ZSAgc3RyaXAgbG9jYWwgYWJzb2x1dGUgc3ltYm9sc1xuXAotICAtLXRyYWRpdGlvbmFsLWZvcm1hdAkgIFVzZSBzYW1lIGZvcm1hdCBhcyBuYXRpdmUgYXNzZW1ibGVyIHdoZW4gcG9zc2libGVcblwKLSAgLS12ZXJzaW9uCQkgIHByaW50IGFzc2VtYmxlciB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdFxuXAotICAtVwkJCSAgc3VwcHJlc3Mgd2FybmluZ3NcblwKLSAgLS1pdGJsIElOU1RUQkwJICBleHRlbmQgaW5zdHJ1Y3Rpb24gc2V0IHRvIGluY2x1ZGUgaW5zdHJ1Y3Rpb25zXG5cCi0JCQkgIG1hdGNoaW5nIHRoZSBzcGVjaWZpY2F0aW9ucyBkZWZpbmVkIGluIGZpbGUgSU5TVFRCTFxuXAotICAtdwkJCSAgaWdub3JlZFxuXAotICAtWAkJCSAgaWdub3JlZFxuXAotICAtWgkJCSAgZ2VuZXJhdGUgb2JqZWN0IGZpbGUgZXZlbiBhZnRlciBlcnJvcnNcbiIpKTsKLSAgCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtLWxpc3RpbmctbGhzLXdpZHRoCSAgc2V0IHRoZSB3aWR0aCBpbiB3b3JkcyBvZiB0aGUgb3V0cHV0IGRhdGEgY29sdW1uIG9mXG5cCi0JCQkgIHRoZSBsaXN0aW5nXG5cCi0gIC0tbGlzdGluZy1saHMtd2lkdGgyCSAgc2V0IHRoZSB3aWR0aCBpbiB3b3JkcyBvZiB0aGUgY29udGludWF0aW9uIGxpbmVzXG5cCi0JCQkgIG9mIHRoZSBvdXRwdXQgZGF0YSBjb2x1bW47IGlnbm9yZWQgaWYgc21hbGxlciB0aGFuXG5cCi0JCQkgIHRoZSB3aWR0aCBvZiB0aGUgZmlyc3QgbGluZVxuXAotICAtLWxpc3RpbmctcmhzLXdpZHRoCSAgc2V0IHRoZSBtYXggd2lkdGggaW4gY2hhcmFjdGVycyBvZiB0aGUgbGluZXMgZnJvbVxuXAotCQkJICB0aGUgc291cmNlIGZpbGVcblwKLSAgLS1saXN0aW5nLWNvbnQtbGluZXMJICBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRpbnVhdGlvbiBsaW5lcyB1c2VkXG5cCi0JCQkgIGZvciB0aGUgb3V0cHV0IGRhdGEgY29sdW1uIG9mIHRoZSBsaXN0aW5nXG4iKSk7Ci0KLSAgbWRfc2hvd191c2FnZSAoc3RyZWFtKTsKLQotICBmcHJpbnRmIChzdHJlYW0sIF8oIlxuUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci19Ci0KLSNpZmRlZiBVU0VfRU1VTEFUSU9OUwotI2RlZmluZSBFTVVMQVRJT05fRU5WSVJPTiAiQVNfRU1VTEFUSU9OIgotCi1leHRlcm4gc3RydWN0IGVtdWxhdGlvbiBtaXBzYmVsZiwgbWlwc2xlbGYsIG1pcHNlbGY7Ci1leHRlcm4gc3RydWN0IGVtdWxhdGlvbiBtaXBzYmVjb2ZmLCBtaXBzbGVjb2ZmLCBtaXBzZWNvZmY7Ci1leHRlcm4gc3RydWN0IGVtdWxhdGlvbiBpMzg2Y29mZiwgaTM4NmVsZjsKLQotc3RhdGljIHN0cnVjdCBlbXVsYXRpb24gKmNvbnN0IGVtdWxhdGlvbnNbXSA9IHsgRU1VTEFUSU9OUyB9Owotc3RhdGljIGNvbnN0IGludCBuX2VtdWxhdGlvbnMgPSBzaXplb2YgKGVtdWxhdGlvbnMpIC8gc2l6ZW9mIChlbXVsYXRpb25zWzBdKTsKLQotc3RhdGljIHZvaWQgc2VsZWN0X2VtdWxhdGlvbl9tb2RlIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotCi1zdGF0aWMgdm9pZAotc2VsZWN0X2VtdWxhdGlvbl9tb2RlIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBpOwotICBjaGFyICpwLCAqZW0gPSAwOwotCi0gIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCi0gICAgaWYgKCFzdHJuY21wICgiLS1lbSIsIGFyZ3ZbaV0sIDQpKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKGkgPT0gYXJnYykKLSAgICBnb3RvIGRvX2RlZmF1bHQ7Ci0KLSAgcCA9IHN0cmNociAoYXJndltpXSwgJz0nKTsKLSAgaWYgKHApCi0gICAgcCsrOwotICBlbHNlCi0gICAgcCA9IGFyZ3ZbaSsxXTsKLQotICBpZiAoIXAgfHwgISpwKQotICAgIGFzX2ZhdGFsIChfKCJtaXNzaW5nIGVtdWxhdGlvbiBtb2RlIG5hbWUiKSk7Ci0gIGVtID0gcDsKLQotIGRvX2RlZmF1bHQ6Ci0gIGlmIChlbSA9PSAwKQotICAgIGVtID0gZ2V0ZW52IChFTVVMQVRJT05fRU5WSVJPTik7Ci0gIGlmIChlbSA9PSAwKQotICAgIGVtID0gREVGQVVMVF9FTVVMQVRJT047Ci0KLSAgaWYgKGVtKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuX2VtdWxhdGlvbnM7IGkrKykKLQlpZiAoIXN0cmNtcCAoZW11bGF0aW9uc1tpXS0+bmFtZSwgZW0pKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaSA9PSBuX2VtdWxhdGlvbnMpCi0JYXNfZmF0YWwgKF8oInVucmVjb2duaXplZCBlbXVsYXRpb24gbmFtZSBgJXMnIiksIGVtKTsKLSAgICAgIHRoaXNfZW11bGF0aW9uID0gZW11bGF0aW9uc1tpXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB0aGlzX2VtdWxhdGlvbiA9IGVtdWxhdGlvbnNbMF07Ci0KLSAgdGhpc19lbXVsYXRpb24tPmluaXQgKCk7Ci19Ci0KLWNvbnN0IGNoYXIgKgotZGVmYXVsdF9lbXVsX2JmZF9uYW1lICgpCi17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZAotY29tbW9uX2VtdWxfaW5pdCAoKQotewotICB0aGlzX2Zvcm1hdCA9IHRoaXNfZW11bGF0aW9uLT5mb3JtYXQ7Ci0KLSAgaWYgKHRoaXNfZW11bGF0aW9uLT5sZWFkaW5nX3VuZGVyc2NvcmUgPT0gMikKLSAgICB0aGlzX2VtdWxhdGlvbi0+bGVhZGluZ191bmRlcnNjb3JlID0gdGhpc19mb3JtYXQtPmRmbF9sZWFkaW5nX3VuZGVyc2NvcmU7Ci0KLSAgaWYgKHRoaXNfZW11bGF0aW9uLT5kZWZhdWx0X2VuZGlhbiAhPSAyKQotICAgIHRhcmdldF9iaWdfZW5kaWFuID0gdGhpc19lbXVsYXRpb24tPmRlZmF1bHRfZW5kaWFuOwotCi0gIGlmICh0aGlzX2VtdWxhdGlvbi0+ZmFrZV9sYWJlbF9uYW1lID09IDApCi0gICAgewotICAgICAgaWYgKHRoaXNfZW11bGF0aW9uLT5sZWFkaW5nX3VuZGVyc2NvcmUpCi0JdGhpc19lbXVsYXRpb24tPmZha2VfbGFiZWxfbmFtZSA9ICJMMFwwMDEiOwotICAgICAgZWxzZQotCS8qIFdoYXQgb3RoZXIgcGFyYW1ldGVycyBzaG91bGQgd2UgdGVzdD8gICovCi0JdGhpc19lbXVsYXRpb24tPmZha2VfbGFiZWxfbmFtZSA9ICIuTDBcMDAxIjsKLSAgICB9Ci19Ci0jZW5kaWYKLQotLyoKLSAqIFNpbmNlIGl0IGlzIGVhc3kgdG8gZG8gaGVyZSB3ZSBpbnRlcnByZXQgdGhlIHNwZWNpYWwgYXJnICItIgotICogdG8gbWVhbiAidXNlIHN0ZGluIiBhbmQgd2Ugc2V0IHRoYXQgYXJndltdIHBvaW50aW5nIHRvICIiLgotICogQWZ0ZXIgd2UgaGF2ZSBtdW5nZWQgYXJndltdLCB0aGUgb25seSB0aGluZ3MgbGVmdCBhcmUgc291cmNlIGZpbGUKLSAqIG5hbWUocykgYW5kICIiKHMpIGRlbm90aW5nIHN0ZGluLiBUaGVzZSBmaWxlIG5hbWVzIGFyZSB1c2VkCi0gKiAocGVyaGFwcyBtb3JlIHRoYW4gb25jZSkgbGF0ZXIuCi0gKgotICogY2hlY2sgZm9yIG5ldyBtYWNoaW5lLWRlcCBjbWRsaW5lIG9wdGlvbnMgaW4KLSAqIG1kX3BhcnNlX29wdGlvbiBkZWZpbml0aW9ucyBpbiBjb25maWcvdGMtKi5jCi0gKi8KLQotc3RhdGljIHZvaWQKLXBhcnNlX2FyZ3MgKHBhcmdjLCBwYXJndikKLSAgICAgaW50ICpwYXJnYzsKLSAgICAgY2hhciAqKipwYXJndjsKLXsKLSAgaW50IG9sZF9hcmdjLCBuZXdfYXJnYzsKLSAgY2hhciAqKm9sZF9hcmd2LCAqKm5ld19hcmd2OwotCi0gIC8qIFN0YXJ0aW5nIHRoZSBzaG9ydCBvcHRpb24gc3RyaW5nIHdpdGggJy0nIGlzIGZvciBwcm9ncmFtcyB0aGF0Ci0gICAgIGV4cGVjdCBvcHRpb25zIGFuZCBvdGhlciBBUkdWLWVsZW1lbnRzIGluIGFueSBvcmRlciBhbmQgdGhhdCBjYXJlIGFib3V0Ci0gICAgIHRoZSBvcmRlcmluZyBvZiB0aGUgdHdvLiAgV2UgZGVzY3JpYmUgZWFjaCBub24tb3B0aW9uIEFSR1YtZWxlbWVudAotICAgICBhcyBpZiBpdCB3ZXJlIHRoZSBhcmd1bWVudCBvZiBhbiBvcHRpb24gd2l0aCBjaGFyYWN0ZXIgY29kZSAxLiAgKi8KLQotICBjaGFyICpzaG9ydG9wdHM7Ci0gIGV4dGVybiBDT05TVCBjaGFyICptZF9zaG9ydG9wdHM7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIHN0ZF9zaG9ydG9wdHNbXSA9Ci0gICAgewotICAgICAgJy0nLCAnSicsCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLSAgICAgIC8qIC1LIGlzIG5vdCBtZWFuaW5nZnVsIGlmIC53b3JkIGlzIG5vdCBiZWluZyBoYWNrZWQuICAqLwotICAgICAgJ0snLAotI2VuZGlmCi0gICAgICAnTCcsICdNJywgJ1InLCAnVycsICdaJywgJ2YnLCAnYScsICc6JywgJzonLCAnRCcsICdJJywgJzonLCAnbycsICc6JywKLSNpZm5kZWYgVk1TCi0gICAgICAvKiAtdiB0YWtlcyBhbiBhcmd1bWVudCBvbiBWTVMsIHNvIHdlIGRvbid0IG1ha2UgaXQgYSBnZW5lcmljCi0gICAgICAgICBvcHRpb24uICAqLwotICAgICAgJ3YnLAotI2VuZGlmCi0gICAgICAndycsICdYJywKLSAgICAgIC8qIE5ldyBvcHRpb24gZm9yIGV4dGVuZGluZyBpbnN0cnVjdGlvbiBzZXQgKHNlZSBhbHNvIC0taXRibCBiZWxvdykgKi8KLSAgICAgICd0JywgJzonLAotICAgICAgJ1wwJwotICAgIH07Ci0gIHN0cnVjdCBvcHRpb24gKmxvbmdvcHRzOwotICBleHRlcm4gc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdOwotICBleHRlcm4gc2l6ZV90IG1kX2xvbmdvcHRzX3NpemU7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIHN0ZF9sb25nb3B0c1tdID0gewotI2RlZmluZSBPUFRJT05fSEVMUCAoT1BUSU9OX1NURF9CQVNFKQotICAgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSEVMUH0sCi0gICAgeyJrZWVwLWxvY2FscyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnTCd9LAotICAgIHsibXJpIiwgbm9fYXJndW1lbnQsIE5VTEwsICdNJ30sCi0jZGVmaW5lIE9QVElPTl9OT0NQUCAoT1BUSU9OX1NURF9CQVNFICsgMSkKLSAgICB7Im5vY3BwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0NQUH0sCi0jZGVmaW5lIE9QVElPTl9TVEFUSVNUSUNTIChPUFRJT05fU1REX0JBU0UgKyAyKQotICAgIHsic3RhdGlzdGljcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RBVElTVElDU30sCi0jZGVmaW5lIE9QVElPTl9WRVJTSU9OIChPUFRJT05fU1REX0JBU0UgKyAzKQotICAgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVkVSU0lPTn0sCi0jZGVmaW5lIE9QVElPTl9EVU1QQ09ORklHIChPUFRJT05fU1REX0JBU0UgKyA0KQotICAgIHsiZHVtcC1jb25maWciLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RVTVBDT05GSUd9LAotI2RlZmluZSBPUFRJT05fVkVSQk9TRSAoT1BUSU9OX1NURF9CQVNFICsgNSkKLSAgICB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUkJPU0V9LAotI2RlZmluZSBPUFRJT05fRU1VTEFUSU9OIChPUFRJT05fU1REX0JBU0UgKyA2KQotICAgIHsiZW11bGF0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTVVMQVRJT059LAotI2RlZmluZSBPUFRJT05fREVGU1lNIChPUFRJT05fU1REX0JBU0UgKyA3KQotICAgIHsiZGVmc3ltIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ERUZTWU19LAotI2RlZmluZSBPUFRJT05fSU5TVFRCTCAoT1BUSU9OX1NURF9CQVNFICsgOCkKLSAgICAvKiBOZXcgb3B0aW9uIGZvciBleHRlbmRpbmcgaW5zdHJ1Y3Rpb24gc2V0IChzZWUgYWxzbyAtdCBhYm92ZSkuCi0gICAgICAgVGhlICItdCBmaWxlIiBvciAiLS1pdGJsIGZpbGUiIG9wdGlvbiBleHRlbmRzIHRoZSBiYXNpYyBzZXQgb2YKLSAgICAgICB2YWxpZCBpbnN0cnVjdGlvbnMgYnkgcmVhZGluZyAiZmlsZSIsIGEgdGV4dCBmaWxlIGNvbnRhaW5pbmcgYQotICAgICAgIGxpc3Qgb2YgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4gIFRoZSBhZGRpdGlvbmFsIG9wY29kZXMgYW5kIHRoZWlyCi0gICAgICAgZm9ybWF0cyBhcmUgYWRkZWQgdG8gdGhlIGJ1aWx0LWluIHNldCBvZiBpbnN0cnVjdGlvbnMsIGFuZAotICAgICAgIG1uZW1vbmljcyBmb3IgbmV3IHJlZ2lzdGVycyBtYXkgYWxzbyBiZSBkZWZpbmVkLiAgKi8KLSAgICB7Iml0YmwiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lOU1RUQkx9LAotI2RlZmluZSBPUFRJT05fTElTVElOR19MSFNfV0lEVEggKE9QVElPTl9TVERfQkFTRSArIDkpCi0gICAgeyJsaXN0aW5nLWxocy13aWR0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElTVElOR19MSFNfV0lEVEh9LAotI2RlZmluZSBPUFRJT05fTElTVElOR19MSFNfV0lEVEgyIChPUFRJT05fU1REX0JBU0UgKyAxMCkKLSAgICB7Imxpc3RpbmctbGhzLXdpZHRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MSVNUSU5HX0xIU19XSURUSDJ9LAotI2RlZmluZSBPUFRJT05fTElTVElOR19SSFNfV0lEVEggKE9QVElPTl9TVERfQkFTRSArIDExKQotICAgIHsibGlzdGluZy1yaHMtd2lkdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJU1RJTkdfUkhTX1dJRFRIfSwKLSNkZWZpbmUgT1BUSU9OX0xJU1RJTkdfQ09OVF9MSU5FUyAoT1BUSU9OX1NURF9CQVNFICsgMTIpCi0gICAgeyJsaXN0aW5nLWNvbnQtbGluZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJU1RJTkdfQ09OVF9MSU5FU30sCi0jZGVmaW5lIE9QVElPTl9ERVBGSUxFIChPUFRJT05fU1REX0JBU0UgKyAxMykKLSAgICB7Ik1EIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ERVBGSUxFfSwKLSNkZWZpbmUgT1BUSU9OX0dTVEFCUyAoT1BUSU9OX1NURF9CQVNFICsgMTQpCi0gICAgeyJnc3RhYnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0dTVEFCU30sCi0jZGVmaW5lIE9QVElPTl9TVFJJUF9MT0NBTF9BQlNPTFVURSAoT1BUSU9OX1NURF9CQVNFICsgMTUpCi0gICAgeyJzdHJpcC1sb2NhbC1hYnNvbHV0ZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RSSVBfTE9DQUxfQUJTT0xVVEV9LAotI2RlZmluZSBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUIChPUFRJT05fU1REX0JBU0UgKyAxNikKLSAgICB7InRyYWRpdGlvbmFsLWZvcm1hdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUfQotICB9OwotCi0gIC8qIENvbnN0cnVjdCB0aGUgb3B0aW9uIGxpc3RzIGZyb20gdGhlIHN0YW5kYXJkIGxpc3QgYW5kIHRoZQotICAgICB0YXJnZXQgZGVwZW5kZW50IGxpc3QuICAqLwotICBzaG9ydG9wdHMgPSBjb25jYXQgKHN0ZF9zaG9ydG9wdHMsIG1kX3Nob3J0b3B0cywgKGNoYXIgKikgTlVMTCk7Ci0gIGxvbmdvcHRzID0gKHN0cnVjdCBvcHRpb24gKikgeG1hbGxvYyAoc2l6ZW9mIChzdGRfbG9uZ29wdHMpICsgbWRfbG9uZ29wdHNfc2l6ZSk7Ci0gIG1lbWNweSAobG9uZ29wdHMsIHN0ZF9sb25nb3B0cywgc2l6ZW9mIChzdGRfbG9uZ29wdHMpKTsKLSAgbWVtY3B5ICgoY2hhciAqKSBsb25nb3B0cyArIHNpemVvZiAoc3RkX2xvbmdvcHRzKSwKLQkgIG1kX2xvbmdvcHRzLCBtZF9sb25nb3B0c19zaXplKTsKLQotICAvKiBNYWtlIGEgbG9jYWwgY29weSBvZiB0aGUgb2xkIGFyZ3YuICAqLwotICBvbGRfYXJnYyA9ICpwYXJnYzsKLSAgb2xkX2FyZ3YgPSAqcGFyZ3Y7Ci0KLSAgLyogSW5pdGlhbGl6ZSBhIG5ldyBhcmd2IHRoYXQgY29udGFpbnMgbm8gb3B0aW9ucy4gICovCi0gIG5ld19hcmd2ID0gKGNoYXIgKiopIHhtYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqIChvbGRfYXJnYyArIDEpKTsKLSAgbmV3X2FyZ3ZbMF0gPSBvbGRfYXJndlswXTsKLSAgbmV3X2FyZ2MgPSAxOwotICBuZXdfYXJndltuZXdfYXJnY10gPSBOVUxMOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIC8qIGdldG9wdF9sb25nX29ubHkgaXMgbGlrZSBnZXRvcHRfbG9uZywgYnV0ICctJyBhcyB3ZWxsIGFzICctLScgY2FuCi0JIGluZGljYXRlIGEgbG9uZyBvcHRpb24uICAqLwotICAgICAgaW50IGxvbmdpbmQ7Ci0gICAgICBpbnQgb3B0YyA9IGdldG9wdF9sb25nX29ubHkgKG9sZF9hcmdjLCBvbGRfYXJndiwgc2hvcnRvcHRzLCBsb25nb3B0cywKLQkJCQkgICAmbG9uZ2luZCk7Ci0KLSAgICAgIGlmIChvcHRjID09IC0xKQotCWJyZWFrOwotCi0gICAgICBzd2l0Y2ggKG9wdGMpCi0JewotCWRlZmF1bHQ6Ci0JICAvKiBtZF9wYXJzZV9vcHRpb24gc2hvdWxkIHJldHVybiAxIGlmIGl0IHJlY29nbml6ZXMgb3B0YywKLQkgICAgIDAgaWYgbm90LiAgKi8KLQkgIGlmIChtZF9wYXJzZV9vcHRpb24gKG9wdGMsIG9wdGFyZykgIT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBgLXYnIGlzbid0IGluY2x1ZGVkIGluIHRoZSBnZW5lcmFsIHNob3J0X29wdHMgbGlzdCwgc28gY2hlY2sgZm9yCi0JICAgICBpdCBleHBsaWNpdHkgaGVyZSBiZWZvcmUgZGVjaWRpbmcgd2UndmUgZ290dGVuIGEgYmFkIGFyZ3VtZW50LiAgKi8KLQkgIGlmIChvcHRjID09ICd2JykKLQkgICAgewotI2lmZGVmIFZNUwotCSAgICAgIC8qIFRlbGxpbmcgZ2V0b3B0IHRvIHRyZWF0IC12J3MgdmFsdWUgYXMgb3B0aW9uYWwgY2FuIHJlc3VsdAotCQkgaW4gaXQgcGlja2luZyB1cCBhIGZvbGxvd2luZyBmaWxlbmFtZSBhcmd1bWVudCBoZXJlLiAgVGhlCi0JCSBWTVMgY29kZSBpbiBtZF9wYXJzZV9vcHRpb24gY2FuIHJldHVybiAwIGluIHRoYXQgY2FzZSwKLQkJIGJ1dCBpdCBoYXMgbm8gd2F5IG9mIHB1c2hpbmcgdGhlIGZpbGVuYW1lIGFyZ3VtZW50IGJhY2suICAqLwotCSAgICAgIGlmIChvcHRhcmcgJiYgKm9wdGFyZykKLQkJbmV3X2FyZ3ZbbmV3X2FyZ2MrK10gPSBvcHRhcmcsICBuZXdfYXJndltuZXdfYXJnY10gPSBOVUxMOwotCSAgICAgIGVsc2UKLSNlbHNlCi0JICAgICAgY2FzZSAndic6Ci0jZW5kaWYKLQkgICAgICBjYXNlIE9QVElPTl9WRVJCT1NFOgotCQlwcmludF92ZXJzaW9uX2lkICgpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKkZBTExUSFJVKi8KLQotCWNhc2UgJz8nOgotCSAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLQotCWNhc2UgMToJCQkvKiBGaWxlIG5hbWUuICAqLwotCSAgaWYgKCFzdHJjbXAgKG9wdGFyZywgIi0iKSkKLQkgICAgb3B0YXJnID0gIiI7Ci0JICBuZXdfYXJndltuZXdfYXJnYysrXSA9IG9wdGFyZzsKLQkgIG5ld19hcmd2W25ld19hcmdjXSA9IE5VTEw7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0hFTFA6Ci0JICBzaG93X3VzYWdlIChzdGRvdXQpOwotCSAgZXhpdCAoRVhJVF9TVUNDRVNTKTsKLQotCWNhc2UgT1BUSU9OX05PQ1BQOgotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9TVEFUSVNUSUNTOgotCSAgZmxhZ19wcmludF9zdGF0aXN0aWNzID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fU1RSSVBfTE9DQUxfQUJTT0xVVEU6Ci0JICBmbGFnX3N0cmlwX2xvY2FsX2Fic29sdXRlID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUOgotCSAgZmxhZ190cmFkaXRpb25hbF9mb3JtYXQgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9WRVJTSU9OOgotCSAgLyogVGhpcyBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBHTlUgc3RhbmRhcmRzIGRvY3VtZW50LiAgKi8KLQkgIHByaW50ZiAoXygiR05VIGFzc2VtYmxlciAlc1xuIiksIFZFUlNJT04pOwotCSAgcHJpbnRmIChfKCJDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIpKTsKLQkgIHByaW50ZiAoXygiXAotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuXAotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIikpOwotCSAgcHJpbnRmIChfKCJUaGlzIGFzc2VtYmxlciB3YXMgY29uZmlndXJlZCBmb3IgYSB0YXJnZXQgb2YgYCVzJy5cbiIpLAotCQkgIFRBUkdFVF9BTElBUyk7Ci0JICBleGl0IChFWElUX1NVQ0NFU1MpOwotCi0JY2FzZSBPUFRJT05fRU1VTEFUSU9OOgotI2lmZGVmIFVTRV9FTVVMQVRJT05TCi0JICBpZiAoc3RyY21wIChvcHRhcmcsIHRoaXNfZW11bGF0aW9uLT5uYW1lKSkKLQkgICAgYXNfZmF0YWwgKF8oIm11bHRpcGxlIGVtdWxhdGlvbiBuYW1lcyBzcGVjaWZpZWQiKSk7Ci0jZWxzZQotCSAgYXNfZmF0YWwgKF8oImVtdWxhdGlvbnMgbm90IGhhbmRsZWQgaW4gdGhpcyBjb25maWd1cmF0aW9uIikpOwotI2VuZGlmCi0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0RVTVBDT05GSUc6Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oImFsaWFzID0gJXNcbiIpLCBUQVJHRVRfQUxJQVMpOwotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJjYW5vbmljYWwgPSAlc1xuIiksIFRBUkdFVF9DQU5PTklDQUwpOwotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJjcHUtdHlwZSA9ICVzXG4iKSwgVEFSR0VUX0NQVSk7Ci0jaWZkZWYgVEFSR0VUX09CSl9GT1JNQVQKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiZm9ybWF0ID0gJXNcbiIpLCBUQVJHRVRfT0JKX0ZPUk1BVCk7Ci0jZW5kaWYKLSNpZmRlZiBUQVJHRVRfRk9STUFUCi0JICBmcHJpbnRmIChzdGRlcnIsIF8oImJmZC10YXJnZXQgPSAlc1xuIiksIFRBUkdFVF9GT1JNQVQpOwotI2VuZGlmCi0JICBleGl0IChFWElUX1NVQ0NFU1MpOwotCi0JY2FzZSBPUFRJT05fREVGU1lNOgotCSAgewotCSAgICBjaGFyICpzOwotCSAgICBsb25nIGk7Ci0JICAgIHN0cnVjdCBkZWZzeW1fbGlzdCAqbjsKLQotCSAgICBmb3IgKHMgPSBvcHRhcmc7ICpzICE9ICdcMCcgJiYgKnMgIT0gJz0nOyBzKyspCi0JICAgICAgOwotCSAgICBpZiAoKnMgPT0gJ1wwJykKLQkgICAgICBhc19mYXRhbCAoXygiYmFkIGRlZnN5bTsgZm9ybWF0IGlzIC0tZGVmc3ltIG5hbWU9dmFsdWUiKSk7Ci0JICAgICpzKysgPSAnXDAnOwotCSAgICBpID0gc3RydG9sIChzLCAoY2hhciAqKikgTlVMTCwgMCk7Ci0JICAgIG4gPSAoc3RydWN0IGRlZnN5bV9saXN0ICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0JICAgIG4tPm5leHQgPSBkZWZzeW1zOwotCSAgICBuLT5uYW1lID0gb3B0YXJnOwotCSAgICBuLT52YWx1ZSA9IGk7Ci0JICAgIGRlZnN5bXMgPSBuOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9JTlNUVEJMOgotCWNhc2UgJ3QnOgotCSAgewotCSAgICAvKiBvcHRhcmcgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgaW5zdHJ1Y3Rpb24gCi0JICAgICAgIGZvcm1hdHMsIG9wY29kZXMsIHJlZ2lzdGVyIG5hbWVzLCBldGMuICovCi0JICAgIHN0cnVjdCBpdGJsX2ZpbGVfbGlzdCAqbjsKLQotCSAgICBpZiAob3B0YXJnID09IE5VTEwpCi0JICAgICAgewotCQlhc193YXJuICggXygiTm8gZmlsZSBuYW1lIGZvbGxvd2luZyAtdCBvcHRpb25cbiIpICk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgCi0JICAgIG4gPSAoc3RydWN0IGl0YmxfZmlsZV9saXN0ICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0JICAgIG4tPm5leHQgPSBpdGJsX2ZpbGVzOwotCSAgICBuLT5uYW1lID0gb3B0YXJnOwotCSAgICBpdGJsX2ZpbGVzID0gbjsKLQotCSAgICAvKiBQYXJzZSB0aGUgZmlsZSBhbmQgYWRkIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zIHRvIG91ciBpbnRlcm5hbAotCSAgICAgICB0YWJsZS4gIElmIG11bHRpcGxlIGluc3RydWN0aW9uIHRhYmxlcyBhcmUgc3BlY2lmaWVkLCB0aGUgCi0JICAgICAgIGluZm9ybWF0aW9uIGZyb20gdGhpcyB0YWJsZSBnZXRzIGFwcGVuZGVkIG9udG8gdGhlIGV4aXN0aW5nIAotCSAgICAgICBpbnRlcm5hbCB0YWJsZS4gKi8KLQkgICAgaXRibF9maWxlcy0+bmFtZSA9IHhzdHJkdXAgKG9wdGFyZyk7Ci0JICAgIGlmIChpdGJsX3BhcnNlIChpdGJsX2ZpbGVzLT5uYW1lKSAhPSAwKQotCSAgICAgIHsKLQkJZnByaW50ZiAoc3RkZXJyLCBfKCJGYWlsZWQgdG8gcmVhZCBpbnN0cnVjdGlvbiB0YWJsZSAlc1xuIiksIAotCQkJIGl0YmxfZmlsZXMtPm5hbWUpOwotCQlleGl0IChFWElUX1NVQ0NFU1MpOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fREVQRklMRToKLQkgIHN0YXJ0X2RlcGVuZGVuY2llcyAob3B0YXJnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fR1NUQUJTOgotCSAgZGVidWdfdHlwZSA9IERFQlVHX1NUQUJTOwotCSAgYnJlYWs7Ci0gCi0JY2FzZSAnSic6Ci0JICBmbGFnX3NpZ25lZF9vdmVyZmxvd19vayA9IDE7Ci0JICBicmVhazsKLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi0JY2FzZSAnSyc6Ci0JICBmbGFnX3dhcm5fZGlzcGxhY2VtZW50ID0gMTsKLQkgIGJyZWFrOwotI2VuZGlmCi0KLQljYXNlICdMJzoKLQkgIGZsYWdfa2VlcF9sb2NhbHMgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9MSVNUSU5HX0xIU19XSURUSDoKLQkgIGxpc3RpbmdfbGhzX3dpZHRoID0gYXRvaShvcHRhcmcpOwotCSAgaWYgKGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCA8IGxpc3RpbmdfbGhzX3dpZHRoKQotCSAgICBsaXN0aW5nX2xoc193aWR0aF9zZWNvbmQgPSBsaXN0aW5nX2xoc193aWR0aDsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0xJU1RJTkdfTEhTX1dJRFRIMjoKLQkgIHsKLQkgICAgaW50IHRtcCA9IGF0b2kob3B0YXJnKTsKLQkgICAgaWYgKHRtcCA+IGxpc3RpbmdfbGhzX3dpZHRoKQotCSAgICAgIGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCA9IHRtcDsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0xJU1RJTkdfUkhTX1dJRFRIOgotCSAgbGlzdGluZ19yaHNfd2lkdGggPSBhdG9pKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9MSVNUSU5HX0NPTlRfTElORVM6Ci0JICBsaXN0aW5nX2xoc19jb250X2xpbmVzID0gYXRvaShvcHRhcmcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdNJzoKLQkgIGZsYWdfbXJpID0gMTsKLSNpZmRlZiBUQ19NNjhLCi0JICBmbGFnX202OGtfbXJpID0gMTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0KLQljYXNlICdSJzoKLQkgIGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0ID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnVyc6Ci0JICBmbGFnX25vX3dhcm5pbmdzID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnWic6Ci0JICBmbGFnX2Fsd2F5c19nZW5lcmF0ZV9vdXRwdXQgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdhJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICB3aGlsZSAoKm9wdGFyZykKLQkJewotCQkgIHN3aXRjaCAoKm9wdGFyZykKLQkJICAgIHsKLQkJICAgIGNhc2UgJ2MnOgotCQkgICAgICBsaXN0aW5nIHw9IExJU1RJTkdfTk9DT05EOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2QnOgotCQkgICAgICBsaXN0aW5nIHw9IExJU1RJTkdfTk9ERUJVRzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdoJzoKLQkJICAgICAgbGlzdGluZyB8PSBMSVNUSU5HX0hMTDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdsJzoKLQkJICAgICAgbGlzdGluZyB8PSBMSVNUSU5HX0xJU1RJTkc7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnbSc6Ci0JCSAgICAgIGxpc3RpbmcgfD0gTElTVElOR19NQUNFWFA7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnbic6Ci0JCSAgICAgIGxpc3RpbmcgfD0gTElTVElOR19OT0ZPUk07Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAncyc6Ci0JCSAgICAgIGxpc3RpbmcgfD0gTElTVElOR19TWU1CT0xTOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJz0nOgotCQkgICAgICBsaXN0aW5nX2ZpbGVuYW1lID0geHN0cmR1cCAob3B0YXJnICsgMSk7Ci0JCSAgICAgIG9wdGFyZyArPSBzdHJsZW4gKGxpc3RpbmdfZmlsZW5hbWUpOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGFzX2ZhdGFsIChfKCJpbnZhbGlkIGxpc3Rpbmcgb3B0aW9uIGAlYyciKSwgKm9wdGFyZyk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIG9wdGFyZysrOwotCQl9Ci0JICAgIH0KLQkgIGlmICghbGlzdGluZykKLQkgICAgbGlzdGluZyA9IExJU1RJTkdfREVGQVVMVDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnRCc6Ci0JICAvKiBERUJVRyBpcyBpbXBsZW1lbnRlZDogaXQgZGVidWdzIGRpZmZlcmVudCAqLwotCSAgLyogdGhpbmdzIGZyb20gb3RoZXIgcGVvcGxlJ3MgYXNzZW1ibGVycy4gKi8KLQkgIGZsYWdfZGVidWcgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdmJzoKLQkgIGZsYWdfbm9fY29tbWVudHMgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdJJzoKLQkgIHsJCQkvKiBJbmNsdWRlIGZpbGUgZGlyZWN0b3J5ICovCi0JICAgIGNoYXIgKnRlbXAgPSB4c3RyZHVwIChvcHRhcmcpOwotCSAgICBhZGRfaW5jbHVkZV9kaXIgKHRlbXApOwotCSAgICBicmVhazsKLQkgIH0KLQotCWNhc2UgJ28nOgotCSAgb3V0X2ZpbGVfbmFtZSA9IHhzdHJkdXAgKG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ3cnOgotCSAgYnJlYWs7Ci0KLQljYXNlICdYJzoKLQkgIC8qIC1YIG1lYW5zIHRyZWF0IHdhcm5pbmdzIGFzIGVycm9ycyAqLwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBmcmVlIChzaG9ydG9wdHMpOwotICBmcmVlIChsb25nb3B0cyk7Ci0KLSAgKnBhcmdjID0gbmV3X2FyZ2M7Ci0gICpwYXJndiA9IG5ld19hcmd2OwotfQotCi1zdGF0aWMgbG9uZyBzdGFydF90aW1lOwotCi1pbnQgCi1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBtYWNyb19hbHRlcm5hdGU7Ci0gIGludCBtYWNyb19zdHJpcF9hdDsKLSAgaW50IGtlZXBfaXQ7Ci0KLSAgc3RhcnRfdGltZSA9IGdldF9ydW5fdGltZSAoKTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIGlmIChkZWJ1Z19tZW1vcnkpCi0gICAgewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGV4dGVybiBsb25nIF9iZmRfY2h1bmtzaXplOwotICAgICAgX2JmZF9jaHVua3NpemUgPSA2NDsKLSNlbmRpZgotICAgICAgY2h1bmtzaXplID0gNjQ7Ci0gICAgfQotCi0jaWZkZWYgSE9TVF9TUEVDSUFMX0lOSVQKLSAgSE9TVF9TUEVDSUFMX0lOSVQgKGFyZ2MsIGFyZ3YpOwotI2VuZGlmCi0KLSAgbXluYW1lID0gYXJndlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChteW5hbWUpOwotCi0gIFNUQVJUX1BST0dSRVNTIChteW5hbWUsIDApOwotCi0jaWZuZGVmIE9CSl9ERUZBVUxUX09VVFBVVF9GSUxFX05BTUUKLSNkZWZpbmUgT0JKX0RFRkFVTFRfT1VUUFVUX0ZJTEVfTkFNRSAiYS5vdXQiCi0jZW5kaWYKLQotICBvdXRfZmlsZV9uYW1lID0gT0JKX0RFRkFVTFRfT1VUUFVUX0ZJTEVfTkFNRTsKLQotICBoZXhfaW5pdCAoKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGJmZF9pbml0ICgpOwotICBiZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSAobXluYW1lKTsKLSNlbmRpZgotCi0jaWZkZWYgVVNFX0VNVUxBVElPTlMKLSAgc2VsZWN0X2VtdWxhdGlvbl9tb2RlIChhcmdjLCBhcmd2KTsKLSNlbmRpZgotCi0gIFBST0dSRVNTICgxKTsKLSAgc3ltYm9sX2JlZ2luICgpOwotICBmcmFnX2luaXQgKCk7Ci0gIHN1YnNlZ3NfYmVnaW4gKCk7Ci0gIHBhcnNlX2FyZ3MgKCZhcmdjLCAmYXJndik7IAotICByZWFkX2JlZ2luICgpOwotICBpbnB1dF9zY3J1Yl9iZWdpbiAoKTsKLSAgZXhwcl9iZWdpbiAoKTsKLQotICBpZiAoZmxhZ19wcmludF9zdGF0aXN0aWNzKQotICAgIHhhdGV4aXQgKGR1bXBfc3RhdGlzdGljcyk7Ci0KLSAgbWFjcm9fYWx0ZXJuYXRlID0gMDsKLSAgbWFjcm9fc3RyaXBfYXQgPSAwOwotI2lmZGVmIFRDX0k5NjAKLSAgbWFjcm9fc3RyaXBfYXQgPSBmbGFnX21yaTsKLSNlbmRpZgotI2lmZGVmIFRDX0EyOUsKLSAgLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQU1EIDI5SyBmYW1pbHkgbWFjcm8gYXNzZW1ibGVyCi0gICAgIHNwZWNpZmljYXRpb24uICAqLwotICBtYWNyb19hbHRlcm5hdGUgPSAxOwotICBtYWNyb19zdHJpcF9hdCA9IDE7Ci0jZW5kaWYKLQotICBtYWNyb19pbml0IChtYWNyb19hbHRlcm5hdGUsIGZsYWdfbXJpLCBtYWNyb19zdHJpcF9hdCwgbWFjcm9fZXhwcik7Ci0KLSAgUFJPR1JFU1MgKDEpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBvdXRwdXRfZmlsZV9jcmVhdGUgKG91dF9maWxlX25hbWUpOwotICBhc3NlcnQgKHN0ZG91dHB1dCAhPSAwKTsKLSNlbmRpZgotCi0jaWZkZWYgdGNfaW5pdF9hZnRlcl9hcmdzCi0gIHRjX2luaXRfYWZ0ZXJfYXJncyAoKTsKLSNlbmRpZgotCi0gIGl0YmxfaW5pdCAoKTsKLQotICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGZ1bGx5IGluaXRpYWxpemVkLCBhbmQgaGF2ZSBjcmVhdGVkIHRoZSBvdXRwdXQKLSAgICAgZmlsZSwgZGVmaW5lIGFueSBzeW1ib2xzIHJlcXVlc3RlZCBieSAtLWRlZnN5bSBjb21tYW5kIGxpbmUKLSAgICAgYXJndW1lbnRzLiAgKi8KLSAgd2hpbGUgKGRlZnN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeW07Ci0gICAgICBzdHJ1Y3QgZGVmc3ltX2xpc3QgKm5leHQ7Ci0KLSAgICAgIHN5bSA9IHN5bWJvbF9uZXcgKGRlZnN5bXMtPm5hbWUsIGFic29sdXRlX3NlY3Rpb24sIGRlZnN5bXMtPnZhbHVlLAotCQkJJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bSk7Ci0gICAgICBuZXh0ID0gZGVmc3ltcy0+bmV4dDsKLSAgICAgIGZyZWUgKGRlZnN5bXMpOwotICAgICAgZGVmc3ltcyA9IG5leHQ7Ci0gICAgfQotCi0gIFBST0dSRVNTICgxKTsKLQotICBwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MgKGFyZ2MsIGFyZ3YpOwkvKiBBc3NlbWJsZSBpdC4gKi8KLQotICBjb25kX2ZpbmlzaF9jaGVjayAoLTEpOwotCi0jaWZkZWYgbWRfZW5kCi0gIG1kX2VuZCAoKTsKLSNlbmRpZgotCi0gIGlmIChzZWVuX2F0X2xlYXN0XzFfZmlsZSAoKQotICAgICAgJiYgKGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dCB8fCBoYWRfZXJyb3JzICgpID09IDApKQotICAgIGtlZXBfaXQgPSAxOwotICBlbHNlCi0gICAga2VlcF9pdCA9IDA7Ci0KLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAhZGVmaW5lZCAoQkZEKQotICAvKiBUaGlzIHVzZWQgdG8gYmUgZG9uZSBhdCB0aGUgc3RhcnQgb2Ygd3JpdGVfb2JqZWN0X2ZpbGUgaW4KLSAgICAgd3JpdGUuYywgYnV0IHRoYXQgY2F1c2VkIHByb2JsZW1zIHdoZW4gZG9pbmcgbGlzdGluZ3Mgd2hlbgotICAgICBrZWVwX2l0IHdhcyB6ZXJvLiAgVGhpcyBjb3VsZCBwcm9iYWJseSBiZSBtb3ZlZCBhYm92ZSBtZF9lbmQsIGJ1dAotICAgICBJIGRpZG4ndCB3YW50IHRvIHJpc2sgdGhlIGNoYW5nZS4gICovCi0gIHN1YnNlZ3NfZmluaXNoICgpOwotI2VuZGlmCi0KLSAgaWYgKGtlZXBfaXQpCi0gICAgd3JpdGVfb2JqZWN0X2ZpbGUgKCk7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICBsaXN0aW5nX3ByaW50IChsaXN0aW5nX2ZpbGVuYW1lKTsKLSNlbmRpZgotCi0jaWZuZGVmIE9CSl9WTVMgLyogZG9lcyBpdHMgb3duIGZpbGUgaGFuZGxpbmcgKi8KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoa2VlcF9pdCkKLSNlbmRpZgotICAgIG91dHB1dF9maWxlX2Nsb3NlIChvdXRfZmlsZV9uYW1lKTsKLSNlbmRpZgotCi0gIGlmIChoYWRfZXJyb3JzICgpID4gMCAmJiAhIGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dCkKLSAgICBrZWVwX2l0ID0gMDsKLQotICBpZiAoIWtlZXBfaXQpCi0gICAgdW5saW5rIChvdXRfZmlsZV9uYW1lKTsKLQotICBpbnB1dF9zY3J1Yl9lbmQgKCk7Ci0KLSAgRU5EX1BST0dSRVNTIChteW5hbWUpOwotCi0gIC8qIFVzZSB4ZXhpdCBpbnN0ZWFkIG9mIHJldHVybiwgYmVjYXVzZSB1bmRlciBWTVMgZW52aXJvbm1lbnRzIHRoZXkKLSAgICAgbWF5IG5vdCBwbGFjZSB0aGUgc2FtZSBpbnRlcnByZXRhdGlvbiBvbiB0aGUgdmFsdWUgZ2l2ZW4uICAqLwotICBpZiAoaGFkX2Vycm9ycyAoKSA+IDApCi0gICAgeGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0KLSAgLyogT25seSBnZW5lcmF0ZSBkZXBlbmRlbmN5IGZpbGUgaWYgYXNzZW1ibGVyIHdhcyBzdWNjZXNzZnVsLiAgKi8KLSAgcHJpbnRfZGVwZW5kZW5jaWVzICgpOwotCi0gIHhleGl0IChFWElUX1NVQ0NFU1MpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9zdGF0aXN0aWNzICgpCi17Ci0jaWZkZWYgSEFWRV9TQlJLCi0gIGNoYXIgKmxpbSA9IChjaGFyICopIHNicmsgKDApOwotI2VuZGlmCi0gIGxvbmcgcnVuX3RpbWUgPSBnZXRfcnVuX3RpbWUgKCkgLSBzdGFydF90aW1lOwotCi0gIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHRvdGFsIHRpbWUgaW4gYXNzZW1ibHk6ICVsZC4lMDZsZFxuIiksCi0JICAgbXluYW1lLCBydW5fdGltZSAvIDEwMDAwMDAsIHJ1bl90aW1lICUgMTAwMDAwMCk7Ci0jaWZkZWYgSEFWRV9TQlJLCi0gIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGRhdGEgc2l6ZSAlbGRcbiIpLAotCSAgIG15bmFtZSwgKGxvbmcpIChsaW0gLSAoY2hhciAqKSAmZW52aXJvbikpOwotI2VuZGlmCi0KLSAgc3Vic2Vnc19wcmludF9zdGF0aXN0aWNzIChzdGRlcnIpOwotICB3cml0ZV9wcmludF9zdGF0aXN0aWNzIChzdGRlcnIpOwotICBzeW1ib2xfcHJpbnRfc3RhdGlzdGljcyAoc3RkZXJyKTsKLSAgcmVhZF9wcmludF9zdGF0aXN0aWNzIChzdGRlcnIpOwotCi0jaWZkZWYgdGNfcHJpbnRfc3RhdGlzdGljcwotICB0Y19wcmludF9zdGF0aXN0aWNzIChzdGRlcnIpOwotI2VuZGlmCi0jaWZkZWYgb2JqX3ByaW50X3N0YXRpc3RpY3MKLSAgb2JqX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0jZW5kaWYKLX0KLQwKLQotLyoJCQlwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MoKQotICoKLSAqIEhlcmUgdG8gYXR0ZW1wdCAxIHBhc3Mgb3ZlciBlYWNoIGlucHV0IGZpbGUuCi0gKiBXZSBzY2FuIGFyZ3ZbKl0gbG9va2luZyBmb3IgZmlsZW5hbWVzIG9yIGV4YWN0bHkgIiIgd2hpY2ggaXMKLSAqIHNob3J0aGFuZCBmb3Igc3RkaW4uIEFueSBhcmd2IHRoYXQgaXMgTlVMTCBpcyBub3QgYSBmaWxlLW5hbWUuCi0gKiBXZSBzZXQgbmVlZF9wYXNzXzIgVFJVRSBpZiwgYWZ0ZXIgdGhpcywgd2Ugc3RpbGwgaGF2ZSB1bnJlc29sdmVkCi0gKiBleHByZXNzaW9ucyBvZiB0aGUgZm9ybSAodW5rbm93biB2YWx1ZSkrLSh1bmtub3duIHZhbHVlKS4KLSAqCi0gKiBOb3RlIHRoZSB1bip4IHNlbWFudGljczogdGhlcmUgaXMgb25seSAxIGxvZ2ljYWwgaW5wdXQgZmlsZSwgYnV0IGl0Ci0gKiBtYXkgYmUgYSBjYXRlbmF0aW9uIG9mIG1hbnkgJ3BoeXNpY2FsJyBpbnB1dCBmaWxlcy4KLSAqLwotc3RhdGljIHZvaWQgCi1wZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IHNhd19hX2ZpbGUgPSAwOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZmxhZ3dvcmQgYXBwbGljYWJsZTsKLSNlbmRpZgotCi0gIG5lZWRfcGFzc18yID0gMDsKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0jaWZkZWYgTUFOWV9TRUdNRU5UUwotICB7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0gICAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICAgIHNlZ21lbnRfaW5mb1tpXS5maXhfcm9vdCA9IDA7Ci0gIH0KLSAgLyogQ3JlYXRlIHRoZSB0aHJlZSBmaXhlZCBvbmVzICovCi0gIHsKLSAgICBzZWdUIHNlZzsKLQotI2lmZGVmIFRFX0FQT0xMTwotICAgIHNlZyA9IHN1YnNlZ19uZXcgKCIud3RleHQiLCAwKTsKLSNlbHNlCi0gICAgc2VnID0gc3Vic2VnX25ldyAoIi50ZXh0IiwgMCk7Ci0jZW5kaWYKLSAgICBhc3NlcnQgKHNlZyA9PSBTRUdfRTApOwotICAgIHNlZyA9IHN1YnNlZ19uZXcgKCIuZGF0YSIsIDApOwotICAgIGFzc2VydCAoc2VnID09IFNFR19FMSk7Ci0gICAgc2VnID0gc3Vic2VnX25ldyAoIi5ic3MiLCAwKTsKLSAgICBhc3NlcnQgKHNlZyA9PSBTRUdfRTIpOwotI2lmZGVmIFRFX0FQT0xMTwotICAgIGNyZWF0ZV90YXJnZXRfc2VnbWVudHMgKCk7Ci0jZW5kaWYKLSAgfQotCi0jZWxzZSAvKiBub3QgTUFOWV9TRUdNRU5UUyAqLwotICB0ZXh0X2ZpeF9yb290ID0gTlVMTDsKLSAgZGF0YV9maXhfcm9vdCA9IE5VTEw7Ci0gIGJzc19maXhfcm9vdCA9IE5VTEw7Ci0jZW5kaWYgLyogbm90IE1BTllfU0VHTUVOVFMgKi8KLSNlbHNlIC8qIEJGRF9BU1NFTUJMRVIgKi8KLSAgLyogQ3JlYXRlIHRoZSBzdGFuZGFyZCBzZWN0aW9ucywgYW5kIHRob3NlIHRoZSBhc3NlbWJsZXIgdXNlcwotICAgICBpbnRlcm5hbGx5LiAgKi8KLSAgdGV4dF9zZWN0aW9uID0gc3Vic2VnX25ldyAoVEVYVF9TRUNUSU9OX05BTUUsIDApOwotICBkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3IChEQVRBX1NFQ1RJT05fTkFNRSwgMCk7Ci0gIGJzc19zZWN0aW9uID0gc3Vic2VnX25ldyAoQlNTX1NFQ1RJT05fTkFNRSwgMCk7Ci0gIC8qIEBAIEZJWE1FIC0tIHdlJ3JlIHNldHRpbmcgdGhlIFJFTE9DIGZsYWcgc28gdGhhdCBzZWN0aW9ucyBhcmUgYXNzdW1lZAotICAgICB0byBoYXZlIHJlbG9jcywgb3RoZXJ3aXNlIHdlIGRvbid0IGZpbmQgb3V0IGluIHRpbWUuICovCi0gIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgdGV4dF9zZWN0aW9uLAotCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MKLQkJCQkgICAgICAgfCBTRUNfQ09ERSB8IFNFQ19SRUFET05MWSkpOwotICAvKiBAQCBGSVhNRSAtLSBTRUNfQ09ERSBzZWVtcyB0byBtZWFuIGNvZGUgb25seSwgcmF0aGVyIHRoYW4gY29kZSBwb3NzaWJseS4qLwotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgZGF0YV9zZWN0aW9uLAotCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpKTsKLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIGJzc19zZWN0aW9uLCBhcHBsaWNhYmxlICYgU0VDX0FMTE9DKTsKLSAgc2VnX2luZm8gKGJzc19zZWN0aW9uKS0+YnNzID0gMTsKLSAgc3Vic2VnX25ldyAoQkZEX0FCU19TRUNUSU9OX05BTUUsIDApOwotICBzdWJzZWdfbmV3IChCRkRfVU5EX1NFQ1RJT05fTkFNRSwgMCk7Ci0gIHJlZ19zZWN0aW9uID0gc3Vic2VnX25ldyAoIipHQVMgYHJlZycgc2VjdGlvbioiLCAwKTsKLSAgZXhwcl9zZWN0aW9uID0gc3Vic2VnX25ldyAoIipHQVMgYGV4cHInIHNlY3Rpb24qIiwgMCk7Ci0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLSAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCAwKTsKLQotICAvKiBUaGlzIG1heSBhZGQgc3ltYm9sIHRhYmxlIGVudHJpZXMsIHdoaWNoIHJlcXVpcmVzIGhhdmluZyBhbiBvcGVuIEJGRCwKLSAgICAgYW5kIHNlY3Rpb25zIGFscmVhZHkgY3JlYXRlZCwgaW4gQkZEX0FTU0VNQkxFUiBtb2RlLiAgKi8KLSAgbWRfYmVnaW4gKCk7Ci0KLSNpZmRlZiBvYmpfYmVnaW4KLSAgb2JqX2JlZ2luICgpOwotI2VuZGlmCi0KLSAgYXJndisrOwkJCS8qIHNraXAgYXJndlswXSAqLwotICBhcmdjLS07CQkJLyogc2tpcCBhcmd2WzBdICovCi0gIHdoaWxlIChhcmdjLS0pCi0gICAgewotICAgICAgaWYgKCphcmd2KQotCXsJCQkvKiBJcyBpdCBhIGZpbGUtbmFtZSBhcmd1bWVudD8gKi8KLQkgIFBST0dSRVNTICgxKTsKLQkgIHNhd19hX2ZpbGUrKzsKLQkgIC8qIGFyZ3YtPiIiIGlmIHN0ZGluIGRlc2lyZWQsIGVsc2UtPmZpbGVuYW1lICovCi0JICByZWFkX2Ffc291cmNlX2ZpbGUgKCphcmd2KTsKLQl9Ci0gICAgICBhcmd2Kys7CQkJLyogY29tcGxldGVkIHRoYXQgYXJndiAqLwotICAgIH0KLSAgaWYgKCFzYXdfYV9maWxlKQotICAgIHJlYWRfYV9zb3VyY2VfZmlsZSAoIiIpOwotfQkJCQkvKiBwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MoKSAqLwotCi0vKiBUaGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIG1hY3JvIGNvZGUgYW5kIGdhcyBleHByZXNzaW9uIGhhbmRsaW5nLiAgKi8KLQotc3RhdGljIGludAotbWFjcm9fZXhwciAoZW1zZywgaWR4LCBpbiwgdmFsKQotICAgICBjb25zdCBjaGFyICplbXNnOwotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIGludCAqdmFsOwotewotICBjaGFyICpob2xkOwotICBleHByZXNzaW9uUyBleDsKLQotICBzYl90ZXJtaW5hdGUgKGluKTsKLQotICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBpbi0+cHRyICsgaWR4OwotICBleHByZXNzaW9uICgmZXgpOwotICBpZHggPSBpbnB1dF9saW5lX3BvaW50ZXIgLSBpbi0+cHRyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCi0gIGlmIChleC5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgYXNfYmFkICgiJXMiLCBlbXNnKTsKLQotICAqdmFsID0gKGludCkgZXguWF9hZGRfbnVtYmVyOwotCi0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIGVuZCBvZiBhcy5jICovCmRpZmYgLS1naXQgYS9nYXMvYXMuaCBiL2dhcy9hcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzJkZmFkLi4wMDAwMDAwCi0tLSBhL2dhcy9hcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQ1ICswLDAgQEAKLS8qIGFzLmggLSBnbG9iYWwgaGVhZGVyIGZpbGUKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBHQVMKLSNkZWZpbmUgR0FTIDEKLS8qCi0gKiBJIHRoaW5rIHRoaXMgc3R1ZmYgaXMgbGFyZ2VseSBvdXQgb2YgZGF0ZS4gIHhveG9yaWNoLgotICoKLSAqIENBUElUQUxJU0VEIG5hbWVzIGFyZSAjZGVmaW5lZC4KLSAqICJsb3dlcmNhc2VIIiBpcyAjZGVmaW5lZCBpZiAibG93ZXJjYXNlLmgiIGhhcyBiZWVuICNpbmNsdWRlLWQuCi0gKiAibG93ZXJjYXNlVCIgaXMgYSB0eXBlZGVmIG9mICJsb3dlcmNhc2UiIG9iamVjdHMuCi0gKiAibG93ZXJjYXNlUCIgaXMgdHlwZSAicG9pbnRlciB0byBvYmplY3Qgb2YgdHlwZSAnbG93ZXJjYXNlJyIuCi0gKiAibG93ZXJjYXNlUyIgaXMgdHlwZWRlZiBzdHJ1Y3QgLi4uIGxvd2VyY2FzZVMuCi0gKgotICogI2RlZmluZSBERUJVRyB0byBlbmFibGUgYWxsIHRoZSAia25vdyIgYXNzZXJ0aW9uIHRlc3RzLgotICogI2RlZmluZSBTVVNQRUNUIHdoZW4gZGVidWdnaW5nIGhhc2ggY29kZS4KLSAqICNkZWZpbmUgQ09NTU9OIGFzICJleHRlcm4iIGZvciBhbGwgbW9kdWxlcyBleGNlcHQgb25lLCB3aGVyZSB5b3UgI2RlZmluZQotICoJQ09NTU9OIGFzICIiLgotICogSWYgVEVTVCBpcyAjZGVmaW5lZCwgdGhlbiB3ZSBhcmUgdGVzdGluZyBhIG1vZHVsZTogI2RlZmluZSBDT01NT04gYXMgIiIuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0vKiBUaGlzIGlzIHRoZSBjb2RlIHJlY29tbWVuZGVkIGluIHRoZSBhdXRvY29uZiBkb2N1bWVudGF0aW9uLCBhbG1vc3QKLSAgIHZlcmJhdGltLiAgSWYgaXQgZG9lc24ndCB3b3JrIGZvciB5b3UsIGxldCBtZSBrbm93LCBhbmQgbm90aWZ5Ci0gICBkam1AZ251LmFpLm1pdC5lZHUgYXMgd2VsbC4gICovCi0vKiBBZGRlZCAjdW5kZWYgZm9yIERKIERlbG9yaWUuICBUaGUgcmlnaHQgZml4IGlzIHRvIGVuc3VyZSB0aGF0IGFzLmgKLSAgIGlzIGluY2x1ZGVkIGZpcnN0LCBiZWZvcmUgZXZlbiBhbnkgc3lzdGVtIGhlYWRlciBmaWxlcywgaW4gYWxsIGZpbGVzCi0gICB0aGF0IHVzZSBpdC4gIEtSIDE5OTQuMTEuMDMgKi8KLS8qIEFkZGVkIHZvaWQqIHZlcnNpb24gZm9yIFNUREMgY2FzZS4gIFRoaXMgaXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoCi0gICB0aGUgZGVjbGFyYXRpb24gaW4gYmlzb24uc2ltcGxlLCB1c2VkIGZvciBtNjhrIG9wZXJhbmQgcGFyc2luZy4KLSAgIC0tS1IgMTk5NS4wOC4wOCAqLwotLyogRm9yY2Ugdm9pZCogZGVjbCBmb3IgaHB1eC4gIFRoaXMgaXMgd2hhdCBCaXNvbiB1c2VzLiAgLS1LUiAxOTk1LjA4LjE2ICovCi0KLS8qIEFJWCByZXF1aXJlcyB0aGlzIHRvIGJlIHRoZSBmaXJzdCB0aGluZyBpbiB0aGUgZmlsZS4gICovCi0jaWZkZWYgX19HTlVDX18KLSMgaWZuZGVmIGFsbG9jYQotIyAgaWZkZWYgX19TVERDX18KLWV4dGVybiB2b2lkICphbGxvY2EgKCk7Ci0jICBlbHNlCi1leHRlcm4gY2hhciAqYWxsb2NhICgpOwotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbHNlCi0jIGlmIEhBVkVfQUxMT0NBX0gKLSMgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyBlbHNlCi0jICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgIGVsc2UKLSMgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotIyAgICBpZiAhZGVmaW5lZCAoX19TVERDX18pICYmICFkZWZpbmVkIChfX2hwdXgpCi1leHRlcm4gY2hhciAqYWxsb2NhICgpOwotIyAgICBlbHNlCi1leHRlcm4gdm9pZCAqYWxsb2NhICgpOwotIyAgICBlbmRpZiAvKiBfX1NURENfXywgX19ocHV4ICovCi0jICAgZW5kaWYgLyogYWxsb2NhICovCi0jICBlbmRpZiAvKiBfQUlYICovCi0jIGVuZGlmIC8qIEhBVkVfQUxMT0NBX0ggKi8KLSNlbmRpZgotCi0vKiBOb3csIHRlbmQgdG8gdGhlIHJlc3Qgb2YgdGhlIGNvbmZpZ3VyYXRpb24uICAqLwotCi0vKiBTeXN0ZW0gaW5jbHVkZSBmaWxlcyBmaXJzdC4uLiAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19UWVBFU19ICi0vKiBmb3Igc2l6ZV90LCBwaWRfdCAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLS8qIFRoZSBmaXJzdCBnZXRvcHQgdmFsdWUgZm9yIG1hY2hpbmUtaW5kZXBlbmRlbnQgbG9uZyBvcHRpb25zLgotICAgMTUwIGlzbid0IHNwZWNpYWw7IGl0J3MganVzdCBhbiBhcmJpdHJhcnkgbm9uLUFTQ0lJIGNoYXIgdmFsdWUuICAqLwotI2RlZmluZSBPUFRJT05fU1REX0JBU0UgMTUwCi0vKiBUaGUgZmlyc3QgZ2V0b3B0IHZhbHVlIGZvciBtYWNoaW5lLWRlcGVuZGVudCBsb25nIG9wdGlvbnMuCi0gICAxNzAgZ2l2ZXMgdGhlIHN0YW5kYXJkIG9wdGlvbnMgcm9vbSB0byBncm93LiAgKi8KLSNkZWZpbmUgT1BUSU9OX01EX0JBU0UgMTcwCi0KLSNpZmRlZiBERUJVRwotI3VuZGVmIE5ERUJVRwotI2VuZGlmCi0jaWYgIWRlZmluZWQgKF9fR05VQ19fKSB8fCBfX0dOVUNfTUlOT1JfXyA8PSA1Ci0jZGVmaW5lIF9fUFJFVFRZX0ZVTkNUSU9OX18gICgoY2hhciopMCkKLSNlbmRpZgotI2lmIDAKLQotLyogSGFuZGxlIGxvc3NhZ2Ugd2l0aCBhc3NlcnQuaC4gICovCi0jaWZuZGVmIEJST0tFTl9BU1NFUlQKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbHNlIC8qIEJST0tFTl9BU1NFUlQgKi8KLSNpZm5kZWYgTkRFQlVHCi0jZGVmaW5lIGFzc2VydChwKSAoKHApID8gMCA6IChhc19hc3NlcnQgKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXyksIDApKQotI2Vsc2UKLSNkZWZpbmUgYXNzZXJ0KHApICgocCksIDApCi0jZW5kaWYKLSNlbmRpZiAvKiBCUk9LRU5fQVNTRVJUICovCi0KLSNlbHNlCi0KLSNkZWZpbmUgYXNzZXJ0KFApICgoUCkgPyAwIDogKGFzX2Fzc2VydCAoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fKSwgMCkpCi0jdW5kZWYgYWJvcnQKLSNkZWZpbmUgYWJvcnQoKQkJYXNfYWJvcnQgKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXykKLQotI2VuZGlmCi0KLQotLyogTm93IEdOVSBoZWFkZXIgZmlsZXMuLi4gKi8KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNpbmNsdWRlIDxiZmQuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGxpYmliZXJ0eS5oPgotCi0vKiBEZWZpbmUgdGhlIHN0YW5kYXJkIHByb2dyZXNzIG1hY3Jvcy4gICovCi0jaW5jbHVkZSA8cHJvZ3Jlc3MuaD4KLQotLyogVGhpcyBkb2Vzbid0IGdldCB0YWtlbiBjYXJlIG9mIGFueXdoZXJlLiAgKi8KLSNpZm5kZWYgX19NV0VSS1NfXyAgLyogTWV0cm93ZXJrcyBDIGNob2tlcyBvbiB0aGUgImRlZmluZWQgKGlubGluZSkiICovCi0jaWYgIWRlZmluZWQgKF9fR05VQ19fKSAmJiAhZGVmaW5lZCAoaW5saW5lKQotI2RlZmluZSBpbmxpbmUKLSNlbmRpZgotI2VuZGlmIC8qICFfX01XRVJLU19fICovCi0KLS8qIE90aGVyIHN0dWZmIGZyb20gY29uZmlnLmguICAqLwotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi1leHRlcm4gY2hhciAqc3Ryc3RyICgpOwotI2VuZGlmCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MKLWV4dGVybiBQVFIgbWFsbG9jICgpOwotZXh0ZXJuIFBUUiByZWFsbG9jICgpOwotI2VuZGlmCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi1leHRlcm4gdm9pZCBmcmVlICgpOwotI2VuZGlmCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9FUlJOTwotZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZgotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTgotZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotI2VuZGlmCi0KLS8qIFRoaXMgaXMgbmVlZGVkIGZvciBWTVMuICAqLwotI2lmICEgZGVmaW5lZCAoSEFWRV9VTkxJTkspICYmIGRlZmluZWQgKEhBVkVfUkVNT1ZFKQotI2RlZmluZSB1bmxpbmsgcmVtb3ZlCi0jZW5kaWYKLQotLyogSGFjayB0byBtYWtlICJnY2MgLVdhbGwiIG5vdCBjb21wbGFpbiBhYm91dCBvYnN0YWNrIG1hY3Jvcy4gICovCi0jaWYgIWRlZmluZWQgKG1lbWNweSkgJiYgIWRlZmluZWQgKGJjb3B5KQotI2RlZmluZSBiY29weShzcmMsZGVzdCxzaXplKQltZW1jcHkoZGVzdCxzcmMsc2l6ZSkKLSNlbmRpZgotCi0vKiBNYWtlIFNhYmVyIGhhcHBpZXIgb24gb2JzdGFjay5oLiAgKi8KLSNpZmRlZiBTQUJFUgotI3VuZGVmICBfX1BUUl9UT19JTlQKLSNkZWZpbmUgX19QVFJfVE9fSU5UKFApICgoaW50KShQKSkKLSN1bmRlZiAgX19JTlRfVE9fUFRSCi0jZGVmaW5lIF9fSU5UX1RPX1BUUihQKSAoKGNoYXIgKikoUCkpCi0jZW5kaWYKLQotI2lmbmRlZiBfX0xJTkVfXwotI2RlZmluZSBfX0xJTkVfXyAidW5rbm93biIKLSNlbmRpZiAvKiBfX0xJTkVfXyAqLwotCi0jaWZuZGVmIF9fRklMRV9fCi0jZGVmaW5lIF9fRklMRV9fICJ1bmtub3duIgotI2VuZGlmIC8qIF9fRklMRV9fICovCi0KLSNpZm5kZWYgRk9QRU5fV0IKLSNpZmRlZiBHTzMyCi0jaW5jbHVkZSAiZm9wZW4tYmluLmgiCi0jZWxzZQotI2luY2x1ZGUgImZvcGVuLXNhbWUuaCIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRVhJVF9TVUNDRVNTCi0jZGVmaW5lIEVYSVRfU1VDQ0VTUyAwCi0jZGVmaW5lIEVYSVRfRkFJTFVSRSAxCi0jZW5kaWYKLQotI2RlZmluZSBvYnN0YWNrX2NodW5rX2FsbG9jIHhtYWxsb2MKLSNkZWZpbmUgb2JzdGFja19jaHVua19mcmVlIHhmcmVlCi0KLSNkZWZpbmUgeGZyZWUgZnJlZQotCi0jaW5jbHVkZSAiYXNpbnRsLmgiCi0KLSNkZWZpbmUgQkFEX0NBU0UodmFsKSBcCi17IFwKLSAgICAgIGFzX2ZhdGFsKF8oIkNhc2UgdmFsdWUgJWxkIHVuZXhwZWN0ZWQgYXQgbGluZSAlZCBvZiBmaWxlIFwiJXNcIlxuIiksIFwKLQkgICAgICAgKGxvbmcpIHZhbCwgX19MSU5FX18sIF9fRklMRV9fKTsgXAotCSAgIH0KLQwKLSNpbmNsdWRlICJmbG9udW0uaCIKLQotLyogVGhlc2UgYXJlIGFzc2VtYmxlci13aWRlIGNvbmNlcHRzICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1leHRlcm4gYmZkICpzdGRvdXRwdXQ7Ci10eXBlZGVmIGJmZF92bWEgYWRkcmVzc1Q7Ci10eXBlZGVmIGJmZF9zaWduZWRfdm1hIG9mZnNldFQ7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGFkZHJlc3NUOwotdHlwZWRlZiBsb25nIG9mZnNldFQ7Ci0jZW5kaWYKLQotLyogVHlwZSBvZiBzeW1ib2wgdmFsdWUsIGV0Yy4gIEZvciB1c2UgaW4gcHJvdG90eXBlcy4gICovCi10eXBlZGVmIGFkZHJlc3NUIHZhbHVlVDsKLQotI2lmbmRlZiBDT01NT04KLSNpZmRlZiBURVNUCi0jZGVmaW5lIENPTU1PTgkJCS8qIGRlY2xhcmUgb3VyIENPTU1PTnMgc3RvcmFnZSBoZXJlLiAqLwotI2Vsc2UKLSNkZWZpbmUgQ09NTU9OIGV4dGVybgkJLyogb3VyIGNvbW1vbnMgbGl2ZSBlbHN3aGVyZSAqLwotI2VuZGlmCi0jZW5kaWYKLS8qIENPTU1PTiBub3cgZGVmaW5lZCAqLwotCi0jaWZkZWYgREVCVUcKLSNpZm5kZWYga25vdwotI2RlZmluZSBrbm93KHApIGFzc2VydChwKQkvKiBWZXJpZnkgb3VyIGFzc3VtcHRpb25zISAqLwotI2VuZGlmIC8qIG5vdCB5ZXQgZGVmaW5lZCAqLwotI2Vsc2UKLSNkZWZpbmUga25vdyhwKQkJCS8qIGtub3coKSBjaGVja3MgYXJlIG5vLW9wLmVkICovCi0jZW5kaWYKLQwKLS8qIGlucHV0X3NjcnViLmMgKi8KLQotLyoKLSAqIFN1cHBsaWVzIHNhbml0aXNlZCBidWZmZXJzIHRvIHJlYWQuYy4KLSAqIEFsc28gdW5kZXJzdGFuZHMgcHJpbnRpbmcgbGluZS1udW1iZXIgcGFydCBvZiBlcnJvciBtZXNzYWdlcy4KLSAqLwotDAotCi0vKiBzdWJzZWdzLmMgICAgIFN1Yi1zZWdtZW50cy4gQWxzbywgc2VnbWVudCg9ZXhwcmVzc2lvbiB0eXBlKXMuKi8KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNpZmRlZiBNQU5ZX1NFR01FTlRTCi0jaW5jbHVkZSAiYmZkLmgiCi0jZGVmaW5lIE5fU0VHTUVOVFMgNDAKLSNkZWZpbmUgU0VHX05PUk1BTCh4KSAoKHgpID49IFNFR19FMCAmJiAoeCkgPD0gU0VHX0UzOSkKLSNkZWZpbmUgU0VHX0xJU1QgU0VHX0UwLFNFR19FMSxTRUdfRTIsU0VHX0UzLFNFR19FNCxTRUdfRTUsU0VHX0U2LFNFR19FNyxTRUdfRTgsU0VHX0U5LFwKLQkJIFNFR19FMTAsU0VHX0UxMSxTRUdfRTEyLFNFR19FMTMsU0VHX0UxNCxTRUdfRTE1LFNFR19FMTYsU0VHX0UxNyxTRUdfRTE4LFNFR19FMTksXAotCQkgU0VHX0UyMCxTRUdfRTIxLFNFR19FMjIsU0VHX0UyMyxTRUdfRTI0LFNFR19FMjUsU0VHX0UyNixTRUdfRTI3LFNFR19FMjgsU0VHX0UyOSxcCi0JCSBTRUdfRTMwLFNFR19FMzEsU0VHX0UzMixTRUdfRTMzLFNFR19FMzQsU0VHX0UzNSxTRUdfRTM2LFNFR19FMzcsU0VHX0UzOCxTRUdfRTM5Ci0jZGVmaW5lIFNFR19URVhUIFNFR19FMAotI2RlZmluZSBTRUdfREFUQSBTRUdfRTEKLSNkZWZpbmUgU0VHX0JTUyBTRUdfRTIKLSNkZWZpbmUgU0VHX0xBU1QgU0VHX0UzOQotI2Vsc2UKLSNkZWZpbmUgTl9TRUdNRU5UUyAzCi0jZGVmaW5lIFNFR19OT1JNQUwoeCkgKCh4KSA9PSBTRUdfVEVYVCB8fCAoeCkgPT0gU0VHX0RBVEEgfHwgKHgpID09IFNFR19CU1MpCi0jZGVmaW5lIFNFR19MSVNUIFNFR19URVhULFNFR19EQVRBLFNFR19CU1MKLSNlbmRpZgotCi10eXBlZGVmIGVudW0gX3NlZ1QKLSAgewotICAgIFNFR19BQlNPTFVURSA9IDAsCi0gICAgU0VHX0xJU1QsCi0gICAgU0VHX1VOS05PV04sCi0gICAgU0VHX0dPT0YsCQkJLyogT25seSBoYXBwZW5zIGlmIEFTIGhhcyBhIGxvZ2ljIGVycm9yLiAqLwotICAgIC8qIEludmVudGVkIHNvIHdlIGRvbid0IGNyYXNoIHByaW50aW5nICovCi0gICAgLyogZXJyb3IgbWVzc2FnZSBpbnZvbHZpbmcgd2VpcmQgc2VnbWVudC4gKi8KLSAgICBTRUdfRVhQUiwJCQkvKiBJbnRlcm1lZGlhdGUgZXhwcmVzc2lvbiB2YWx1ZXMuICovCi0gICAgU0VHX0RFQlVHLAkJCS8qIERlYnVnIHNlZ21lbnQgKi8KLSAgICBTRUdfTlRWLAkJCS8qIFRyYW5zZmVydCB2ZWN0b3IgcHJlbG9hZCBzZWdtZW50ICovCi0gICAgU0VHX1BUViwJCQkvKiBUcmFuc2ZlcnQgdmVjdG9yIHBvc3Rsb2FkIHNlZ21lbnQgKi8KLSAgICBTRUdfUkVHSVNURVIJCS8qIE15dGhpY2FsOiBhIHJlZ2lzdGVyLXZhbHVlZCBleHByZXNzaW9uICovCi0gIH0gc2VnVDsKLQotI2RlZmluZSBTRUdfTUFYSU1VTV9PUkRJTkFMIChTRUdfUkVHSVNURVIpCi0jZWxzZQotdHlwZWRlZiBhc2VjdGlvbiAqc2VnVDsKLSNkZWZpbmUgU0VHX05PUk1BTChTRUcpCQkoKFNFRykgIT0gYWJzb2x1dGVfc2VjdGlvbglcCi0JCQkJICYmIChTRUcpICE9IHVuZGVmaW5lZF9zZWN0aW9uCVwKLQkJCQkgJiYgKFNFRykgIT0gcmVnX3NlY3Rpb24JXAotCQkJCSAmJiAoU0VHKSAhPSBleHByX3NlY3Rpb24pCi0jZW5kaWYKLXR5cGVkZWYgaW50IHN1YnNlZ1Q7Ci0KLS8qIFdoYXQgc3Vic2VnIHdlIGFyZSBhY2NyZXRpbmcgbm93PyAqLwotQ09NTU9OIHN1YnNlZ1Qgbm93X3N1YnNlZzsKLQotLyogU2VnbWVudCBvdXIgaW5zdHJ1Y3Rpb25zIGVtaXQgdG8uICovCi1DT01NT04gc2VnVCBub3dfc2VnOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBzZWdtZW50X25hbWUoU0VHKQliZmRfZ2V0X3NlY3Rpb25fbmFtZSAoc3Rkb3V0cHV0LCBTRUcpCi0jZWxzZQotZXh0ZXJuIGNoYXIgY29uc3QgKmNvbnN0IHNlZ19uYW1lW107Ci0jZGVmaW5lIHNlZ21lbnRfbmFtZShTRUcpCXNlZ19uYW1lWyhpbnQpIChTRUcpXQotI2VuZGlmCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotZXh0ZXJuIGludCBzZWN0aW9uX2FsaWdubWVudFtdOwotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1leHRlcm4gc2VnVCByZWdfc2VjdGlvbiwgZXhwcl9zZWN0aW9uOwotLyogU2hvdWxkbid0IHRoZXNlIGJlIGVsaW1pbmF0ZWQgc29tZWRheT8gICovCi1leHRlcm4gc2VnVCB0ZXh0X3NlY3Rpb24sIGRhdGFfc2VjdGlvbiwgYnNzX3NlY3Rpb247Ci0jZGVmaW5lIGFic29sdXRlX3NlY3Rpb24JYmZkX2Fic19zZWN0aW9uX3B0cgotI2RlZmluZSB1bmRlZmluZWRfc2VjdGlvbgliZmRfdW5kX3NlY3Rpb25fcHRyCi0jZWxzZQotI2RlZmluZSByZWdfc2VjdGlvbgkJU0VHX1JFR0lTVEVSCi0jZGVmaW5lIGV4cHJfc2VjdGlvbgkJU0VHX0VYUFIKLSNkZWZpbmUgdGV4dF9zZWN0aW9uCQlTRUdfVEVYVAotI2RlZmluZSBkYXRhX3NlY3Rpb24JCVNFR19EQVRBCi0jZGVmaW5lIGJzc19zZWN0aW9uCQlTRUdfQlNTCi0jZGVmaW5lIGFic29sdXRlX3NlY3Rpb24JU0VHX0FCU09MVVRFCi0jZGVmaW5lIHVuZGVmaW5lZF9zZWN0aW9uCVNFR19VTktOT1dOCi0jZW5kaWYKLQotLyogcmVsYXgoKSAqLwotCi1lbnVtIF9yZWxheF9zdGF0ZQotICB7Ci0gICAgLyogVmFyaWFibGUgY2hhcnMgdG8gYmUgcmVwZWF0ZWQgZnJfb2Zmc2V0IHRpbWVzLgotICAgICAgIEZyX3N5bWJvbCB1bnVzZWQuIFVzZWQgd2l0aCBmcl9vZmZzZXQgPT0gMCBmb3IgYQotICAgICAgIGNvbnN0YW50IGxlbmd0aCBmcmFnLiAqLwotICAgIHJzX2ZpbGwgPSAxLAotCi0gICAgLyogQWxpZ24uICBUaGUgZnJfb2Zmc2V0IGZpZWxkIGhvbGRzIHRoZSBwb3dlciBvZiAyIHRvIHdoaWNoIHRvCi0gICAgICAgYWxpZ24uICBUaGUgZnJfdmFyIGZpZWxkIGhvbGRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUKLSAgICAgICBmaWxsIHBhdHRlcm4uICBUaGUgZnJfc3VidHlwZSBmaWVsZCBob2xkcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKLSAgICAgICBieXRlcyB0byBza2lwIHdoZW4gYWxpZ25pbmcsIG9yIDAgaWYgdGhlcmUgaXMgbm8gbWF4aW11bS4gICovCi0gICAgcnNfYWxpZ24sCi0KLSAgICAvKiBBbGlnbiBjb2RlLiAgVGhlIGZyX29mZnNldCBmaWVsZCBob2xkcyB0aGUgcG93ZXIgb2YgMiB0byB3aGljaAotICAgICAgIHRvIGFsaWduLiAgVGhpcyB0eXBlIGlzIG9ubHkgZ2VuZXJhdGVkIGJ5IG1hY2hpbmUgc3BlY2lmaWMKLSAgICAgICBjb2RlLCB3aGljaCBpcyBub3JtYWxseSByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgdGhlIGZpbGwKLSAgICAgICBwYXR0ZXJuLiAgVGhlIGZyX3N1YnR5cGUgZmllbGQgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mCi0gICAgICAgYnl0ZXMgdG8gc2tpcCB3aGVuIGFsaWduaW5nLCBvciAwIGlmIHRoZXJlIGlzIG5vIG1heGltdW0uICAqLwotICAgIHJzX2FsaWduX2NvZGUsCi0KLSAgICAvKiBPcmc6IEZyX29mZnNldCwgZnJfc3ltYm9sOiBhZGRyZXNzLiAxIHZhcmlhYmxlIGNoYXI6IGZpbGwKLSAgICAgICBjaGFyYWN0ZXIuICovCi0gICAgcnNfb3JnLAotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLSAgICAvKiBKRjogZ3VucG9pbnQgKi8KLSAgICByc19icm9rZW5fd29yZCwKLSNlbmRpZgotCi0gICAgLyogbWFjaGluZS1zcGVjaWZpYyByZWxheGFibGUgKG9yIHNpbWlsYXJseSBhbHRlcmFibGUpIGluc3RydWN0aW9uICovCi0gICAgcnNfbWFjaGluZV9kZXBlbmRlbnQsCi0KLSAgICAvKiAuc3BhY2UgZGlyZWN0aXZlIHdpdGggZXhwcmVzc2lvbiBvcGVyYW5kIHRoYXQgbmVlZHMgdG8gYmUgY29tcHV0ZWQKLSAgICAgICBsYXRlci4gIFNpbWlsYXIgdG8gcnNfb3JnLCBidXQgZGlmZmVyZW50LgotICAgICAgIGZyX3N5bWJvbDogb3BlcmFuZAotICAgICAgIDEgdmFyaWFibGUgY2hhcjogZmlsbCBjaGFyYWN0ZXIgICovCi0gICAgcnNfc3BhY2UsCi0KLSAgICAvKiBBIERXQVJGIGxlYjEyOCB2YWx1ZTsgb25seSBFTEYgdXNlcyB0aGlzLiAgVGhlIHN1YnR5cGUgaXMgMCBmb3IKLSAgICAgICB1bnNpZ25lZCwgMSBmb3Igc2lnbmVkLiAgKi8KLSAgICByc19sZWIxMjgsCi0KLSAgICAvKiBFeGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24gd2hpY2ggd2UgbWF5IGJlIGFibGUgdG8gb3B0aW1pemUuICAqLwotICAgIHJzX2NmYQotICB9OwotCi10eXBlZGVmIGVudW0gX3JlbGF4X3N0YXRlIHJlbGF4X3N0YXRlVDsKLQotLyogVGhpcyB0eXBlIGlzIHVzZWQgaW4gcHJvdG90eXBlcywgc28gaXQgY2FuJ3QgYmUgYSB0eXBlIHRoYXQgd2lsbCBiZQotICAgd2lkZW5lZCBmb3IgYXJndW1lbnQgcGFzc2luZy4gICovCi10eXBlZGVmIHVuc2lnbmVkIGludCByZWxheF9zdWJzdGF0ZVQ7Ci0KLS8qIEVub3VnaCBiaXRzIGZvciBhZGRyZXNzLCBidXQgc3RpbGwgYW4gaW50ZWdlciB0eXBlLgotICAgQ291bGQgYmUgYSBwcm9ibGVtLCBjcm9zcy1hc3NlbWJsaW5nIGZvciA2NC1iaXQgbWFjaGluZXMuICAqLwotdHlwZWRlZiBhZGRyZXNzVCByZWxheF9hZGRyZXNzVDsKLQwKLS8qIG1haW4gcHJvZ3JhbSAiYXMuYyIgKGNvbW1hbmQgYXJndW1lbnRzIGV0YykgKi8KLQotQ09NTU9OIHVuc2lnbmVkIGNoYXIgZmxhZ19ub19jb21tZW50czsgLyogLWYgKi8KLUNPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfZGVidWc7IC8qIC1EICovCi1DT01NT04gdW5zaWduZWQgY2hhciBmbGFnX3NpZ25lZF9vdmVyZmxvd19vazsgLyogLUogKi8KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotQ09NTU9OIHVuc2lnbmVkIGNoYXIgZmxhZ193YXJuX2Rpc3BsYWNlbWVudDsgLyogLUsgKi8KLSNlbmRpZgotCi0vKiBUcnVlIGlmIGxvY2FsIHN5bWJvbHMgc2hvdWxkIGJlIHJldGFpbmVkLiAgKi8KLUNPTU1PTiBpbnQgZmxhZ19rZWVwX2xvY2FsczsgLyogLUwgKi8KLQotLyogVHJ1ZSBpZiB3ZSBhcmUgYXNzZW1ibGluZyBpbiBNUkkgbW9kZS4gICovCi1DT01NT04gaW50IGZsYWdfbXJpOwotCi0vKiBUcnVlIGlmIHdlIGFyZSBhc3NlbWJsaW5nIGluIG02OGsgTVJJIG1vZGUuICAqLwotQ09NTU9OIGludCBmbGFnX202OGtfbXJpOwotCi0vKiBTaG91bGQgdGhlIGRhdGEgc2VjdGlvbiBiZSBtYWRlIHJlYWQtb25seSBhbmQgYXBwZW5kZWQgdG8gdGhlIHRleHQKLSAgIHNlY3Rpb24/ICAqLwotQ09NTU9OIHVuc2lnbmVkIGNoYXIgZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQ7IC8qIC1SICovCi0KLS8qIFRydWUgaWYgd2FybmluZ3Mgc2hvdWxkIGJlIGluaGliaXRlZC4gICovCi1DT01NT04gaW50IGZsYWdfbm9fd2FybmluZ3M7IC8qIC1XICovCi0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIGF0dGVtcHQgdG8gZ2VuZXJhdGUgb3V0cHV0IGV2ZW4gaWYgbm9uLWZhdGFsIGVycm9ycwotICAgYXJlIGRldGVjdGVkLiAgKi8KLUNPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dDsgLyogLVogKi8KLQotLyogVGhpcyBpcyB0cnVlIGlmIHRoZSBhc3NlbWJsZXIgc2hvdWxkIG91dHB1dCB0aW1lIGFuZCBzcGFjZSB1c2FnZS4gKi8KLUNPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfcHJpbnRfc3RhdGlzdGljczsKLQotLyogVHJ1ZSBpZiBsb2NhbCBhYnNvbHV0ZSBzeW1ib2xzIGFyZSB0byBiZSBzdHJpcHBlZC4gICovCi1DT01NT04gaW50IGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGU7Ci0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGEgdHJhZGl0aW9uYWwgZm9ybWF0IG9iamVjdCBmaWxlLiAgKi8KLUNPTU1PTiBpbnQgZmxhZ190cmFkaXRpb25hbF9mb3JtYXQ7Ci0KLS8qIG5hbWUgb2YgZW1pdHRlZCBvYmplY3QgZmlsZSAqLwotQ09NTU9OIGNoYXIgKm91dF9maWxlX25hbWU7Ci0KLS8qIG5hbWUgb2YgZmlsZSBkZWZpbmluZyBleHRlbnNpb25zIHRvIHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBzZXQgKi8KLUNPTU1PTiBjaGFyICppbnN0dGJsX2ZpbGVfbmFtZTsKLQotLyogVFJVRSBpZiB3ZSBuZWVkIGEgc2Vjb25kIHBhc3MuICovCi1DT01NT04gaW50IG5lZWRfcGFzc18yOwotCi0vKiBUUlVFIGlmIHdlIHNob3VsZCBkbyBubyByZWxheGluZywgYW5kCi0gICBsZWF2ZSBsb3RzIG9mIHBhZGRpbmcuICAqLwotQ09NTU9OIGludCBsaW5rcmVsYXg7Ci0KLS8qIFRSVUUgaWYgd2Ugc2hvdWxkIHByb2R1Y2UgYSBsaXN0aW5nLiAgKi8KLWV4dGVybiBpbnQgbGlzdGluZzsKLQotLyogVHlwZSBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2Ugc2hvdWxkIGdlbmVyYXRlLiAgV2UgY3VycmVudGx5Ci0gICBvbmx5IHN1cHBvcnQgc3RhYnMgYW5kIEVDT0ZGLiAgKi8KLQotZW51bSBkZWJ1Z19pbmZvX3R5cGUKLSAgewotICAgIERFQlVHX1VOU1BFQ0lGSUVELAotICAgIERFQlVHX05PTkUsCi0gICAgREVCVUdfU1RBQlMsCi0gICAgREVCVUdfRUNPRkYsCi0gICAgREVCVUdfRFdBUkYsCi0gICAgREVCVUdfRFdBUkYyCi0gIH07Ci0KLWV4dGVybiBlbnVtIGRlYnVnX2luZm9fdHlwZSBkZWJ1Z190eXBlOwotDAotLyogTWF4aW11bSBsZXZlbCBvZiBtYWNybyBuZXN0aW5nLiAgKi8KLWV4dGVybiBpbnQgbWF4X21hY3JvX25lc3Q7Ci0KLS8qIE9ic3RhY2sgY2h1bmsgc2l6ZS4gIEtlZXAgbGFyZ2UgZm9yIGVmZmljaWVudCBzcGFjZSB1c2UsIG1ha2Ugc21hbGwgdG8KLSAgIGluY3JlYXNlIG1hbGxvYyBjYWxscyBmb3IgbW9uaXRvcmluZyBtZW1vcnkgYWxsb2NhdGlvbi4gICovCi1leHRlcm4gaW50IGNodW5rc2l6ZTsKLQotc3RydWN0IF9wc2V1ZG9fdHlwZQotICB7Ci0gICAgLyogYXNzZW1ibGVyIG1uZW1vbmljLCBsb3dlciBjYXNlLCBubyAnLicgKi8KLSAgICBjb25zdCBjaGFyICpwb2NfbmFtZTsKLSAgICAvKiBEbyB0aGUgd29yayAqLwotICAgIHZvaWQgKCpwb2NfaGFuZGxlcikgUEFSQU1TICgoaW50KSk7Ci0gICAgLyogVmFsdWUgdG8gcGFzcyB0byBoYW5kbGVyICovCi0gICAgaW50IHBvY192YWw7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IF9wc2V1ZG9fdHlwZSBwc2V1ZG9fdHlwZVM7Ci0KLS8qIFByZWZlciB2YXJhcmdzIGZvciBub24tQU5TSSBjb21waWxlciwgc2luY2Ugc29tZSB3aWxsIGJhcmYgaWYgdGhlCi0gICBlbGxpcHNpcyBkZWZpbml0aW9uIGlzIHVzZWQgd2l0aCBhIG5vLWFyZ3VtZW50cyBkZWNsYXJhdGlvbi4gICovCi0jaWYgZGVmaW5lZCAoSEFWRV9WQVJBUkdTX0gpICYmICFkZWZpbmVkIChfX1NURENfXykKLSN1bmRlZiBIQVZFX1NUREFSR19ICi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfU1REQVJHX0gpCi0jZGVmaW5lIFVTRV9TVERBUkcKLSNlbmRpZgotI2lmICFkZWZpbmVkIChVU0VfU1REQVJHKSAmJiBkZWZpbmVkIChIQVZFX1ZBUkFSR1NfSCkKLSNkZWZpbmUgVVNFX1ZBUkFSR1MKLSNlbmRpZgotCi0jaWZkZWYgVVNFX1NUREFSRwotI2lmIChfX0dOVUNfXyA+PSAyKSAmJiAhZGVmaW5lZChWTVMpCi0vKiBmb3IgdXNlIHdpdGggLVdmb3JtYXQgKi8KLQotI2lmIF9fR05VQ19NSU5PUl9fIDwgNgotLyogU3VwcG9ydCBmb3IgZG91YmxlIHVuZGVyc2NvcmVzIGluIGF0dHJpYnV0ZSBuYW1lcyB3YXMgYWRkZWQgaW4gZ2NjCi0gICAyLjYsIHNvIGF2b2lkIHRoZW0gaWYgd2UgYXJlIHVzaW5nIGFuIGVhcmxpZXIgdmVyc2lvbi4gICovCi0jZGVmaW5lIF9fcHJpbnRmX18gcHJpbnRmCi0jZGVmaW5lIF9fZm9ybWF0X18gZm9ybWF0Ci0jZW5kaWYKLQotI2RlZmluZSBQUklOVEZfTElLRShGQ04pIFwKLSAgdm9pZCBGQ04gKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBcCi0gICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDEsIDIpKSkKLSNkZWZpbmUgUFJJTlRGX1dIRVJFX0xJS0UoRkNOKSBcCi0gIHZvaWQgRkNOIChjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIFwKLSAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgNCkpKQotCi0jZWxzZSAvKiBfX0dOVUNfXyA8IDIgfHwgZGVmaW5lZChWTVMpICovCi0KLSNkZWZpbmUgUFJJTlRGX0xJS0UoRkNOKQl2b2lkIEZDTiBQQVJBTVMgKChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpCi0jZGVmaW5lIFBSSU5URl9XSEVSRV9MSUtFKEZDTikJdm9pZCBGQ04gUEFSQU1TICgoY2hhciAqZmlsZSwgXAotCQkJCQkJICB1bnNpZ25lZCBpbnQgbGluZSwgXAotCQkJCQkgIAkgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSkKLQotI2VuZGlmIC8qIF9fR05VQ19fIDwgMiB8fCBkZWZpbmVkKFZNUykgKi8KLQotI2Vsc2UgLyogISBVU0VfU1REQVJHICovCi0KLSNkZWZpbmUgUFJJTlRGX0xJS0UoRkNOKQl2b2lkIEZDTiAoKQotI2RlZmluZSBQUklOVEZfV0hFUkVfTElLRShGQ04pCXZvaWQgRkNOICgpCi0KLSNlbmRpZiAvKiAhIFVTRV9TVERBUkcgKi8KLQotUFJJTlRGX0xJS0UgKGFzX2JhZCk7Ci1QUklOVEZfTElLRSAoYXNfZmF0YWwpOwotUFJJTlRGX0xJS0UgKGFzX3Rza3Rzayk7Ci1QUklOVEZfTElLRSAoYXNfd2Fybik7Ci1QUklOVEZfV0hFUkVfTElLRSAoYXNfYmFkX3doZXJlKTsKLVBSSU5URl9XSEVSRV9MSUtFIChhc193YXJuX3doZXJlKTsKLQotdm9pZCBhc19hc3NlcnQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKikpOwotdm9pZCBhc19hYm9ydCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKSk7Ci0KLXZvaWQgZnByaW50X3ZhbHVlIFBBUkFNUyAoKEZJTEUgKmZpbGUsIGFkZHJlc3NUIHZhbHVlKSk7Ci12b2lkIHNwcmludF92YWx1ZSBQQVJBTVMgKChjaGFyICpidWYsIGFkZHJlc3NUIHZhbHVlKSk7Ci0KLWludCBoYWRfZXJyb3JzIFBBUkFNUyAoKHZvaWQpKTsKLWludCBoYWRfd2FybmluZ3MgUEFSQU1TICgodm9pZCkpOwotCi12b2lkIHByaW50X3ZlcnNpb25faWQgUEFSQU1TICgodm9pZCkpOwotY2hhciAqYXBwX3B1c2ggUEFSQU1TICgodm9pZCkpOwotY2hhciAqYXRvZl9pZWVlIFBBUkFNUyAoKGNoYXIgKnN0ciwgaW50IHdoYXRfa2luZCwgTElUVExFTlVNX1RZUEUgKiB3b3JkcykpOwotY2hhciAqaW5wdXRfc2NydWJfaW5jbHVkZV9maWxlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lLCBjaGFyICpwb3NpdGlvbikpOwotY2hhciAqaW5wdXRfc2NydWJfbmV3X2ZpbGUgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLWNoYXIgKmlucHV0X3NjcnViX25leHRfYnVmZmVyIFBBUkFNUyAoKGNoYXIgKipidWZwKSk7Ci1pbnQgZG9fc2NydWJfY2hhcnMgUEFSQU1TICgoaW50ICgqZ2V0KSAoY2hhciAqKiksIGNoYXIgKnRvLCBpbnQgdG9sZW4pKTsKLWludCBnZW5fdG9fd29yZHMgUEFSQU1TICgoTElUVExFTlVNX1RZUEUgKiB3b3JkcywgaW50IHByZWNpc2lvbiwKLQkJCSAgbG9uZyBleHBvbmVudF9iaXRzKSk7Ci1pbnQgaGFkX2VyciBQQVJBTVMgKCh2b2lkKSk7Ci1pbnQgaWdub3JlX2lucHV0IFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgY29uZF9maW5pc2hfY2hlY2sgUEFSQU1TICgoaW50KSk7Ci12b2lkIGNvbmRfZXhpdF9tYWNybyBQQVJBTVMgKChpbnQpKTsKLWludCBzZWVuX2F0X2xlYXN0XzFfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGFwcF9wb3AgUEFSQU1TICgoY2hhciAqYXJnKSk7Ci12b2lkIGFzX2hvd211Y2ggUEFSQU1TICgoRklMRSAqIHN0cmVhbSkpOwotdm9pZCBhc19wZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqZ3JpcGUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci12b2lkIGFzX3doZXJlIFBBUkFNUyAoKGNoYXIgKipuYW1lcCwgdW5zaWduZWQgaW50ICpsaW5lcCkpOwotdm9pZCBidW1wX2xpbmVfY291bnRlcnMgUEFSQU1TICgodm9pZCkpOwotdm9pZCBkb19zY3J1Yl9iZWdpbiBQQVJBTVMgKChpbnQpKTsKLXZvaWQgaW5wdXRfc2NydWJfYmVnaW4gUEFSQU1TICgodm9pZCkpOwotdm9pZCBpbnB1dF9zY3J1Yl9jbG9zZSBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGlucHV0X3NjcnViX2VuZCBQQVJBTVMgKCh2b2lkKSk7Ci1pbnQgbmV3X2xvZ2ljYWxfbGluZSBQQVJBTVMgKChjaGFyICpmbmFtZSwgaW50IGxpbmVfbnVtYmVyKSk7Ci12b2lkIHN1YnNlZ3NfYmVnaW4gUEFSQU1TICgodm9pZCkpOwotdm9pZCBzdWJzZWdfY2hhbmdlIFBBUkFNUyAoKHNlZ1Qgc2VnLCBpbnQgc3Vic2VnKSk7Ci1zZWdUIHN1YnNlZ19uZXcgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgc3Vic2VnVCBzdWJzZWcpKTsKLXNlZ1Qgc3Vic2VnX2ZvcmNlX25ldyBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBzdWJzZWdUIHN1YnNlZykpOwotdm9pZCBzdWJzZWdfc2V0IFBBUkFNUyAoKHNlZ1Qgc2VnLCBzdWJzZWdUIHN1YnNlZykpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXNlZ1Qgc3Vic2VnX2dldCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotI2VuZGlmCi0KLXZvaWQgc3RhcnRfZGVwZW5kZW5jaWVzIFBBUkFNUyAoKGNoYXIgKikpOwotdm9pZCByZWdpc3Rlcl9kZXBlbmRlbmN5IFBBUkFNUyAoKGNoYXIgKikpOwotdm9pZCBwcmludF9kZXBlbmRlbmNpZXMgUEFSQU1TICgodm9pZCkpOwotCi1zdHJ1Y3QgZXhwcmVzc2lvblM7Ci1zdHJ1Y3QgZml4Owotc3RydWN0IHN5bWJvbDsKLXN0cnVjdCByZWxheF90eXBlOwotdHlwZWRlZiBzdHJ1Y3QgZnJhZyBmcmFnUzsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLS8qIGxpdGVyYWwuYyAqLwotdmFsdWVUIGFkZF90b19saXRlcmFsX3Bvb2wgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqLCB2YWx1ZVQsIHNlZ1QsIGludCkpOwotI2VuZGlmCi0KLWludCBjaGVja19laF9mcmFtZSBQQVJBTVMgKChzdHJ1Y3QgZXhwcmVzc2lvblMgKiwgdW5zaWduZWQgaW50ICopKTsKLWludCBlaF9mcmFtZV9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBQQVJBTVMgKChmcmFnUyAqKSk7Ci1pbnQgZWhfZnJhbWVfcmVsYXhfZnJhZyBQQVJBTVMgKChmcmFnUyAqKSk7Ci12b2lkIGVoX2ZyYW1lX2NvbnZlcnRfZnJhZyBQQVJBTVMgKChmcmFnUyAqKSk7Ci0KLSNpbmNsdWRlICJleHByLmgiCQkvKiBCZWZvcmUgdGFyZy0qLmggKi8KLQotLyogdGhpcyBvbmUgc3RhcnRzIHRoZSBjaGFpbiBvZiB0YXJnZXQgZGVwZW5kYW50IGhlYWRlcnMgKi8KLSNpbmNsdWRlICJ0YXJnLWVudi5oIgotCi0jaW5jbHVkZSAic3RydWMtc3ltYm9sLmgiCi0jaW5jbHVkZSAid3JpdGUuaCIKLSNpbmNsdWRlICJmcmFncy5oIgotI2luY2x1ZGUgImhhc2guaCIKLSNpbmNsdWRlICJyZWFkLmgiCi0jaW5jbHVkZSAic3ltYm9scy5oIgotCi0jaW5jbHVkZSAidGMuaCIKLSNpbmNsdWRlICJvYmouaCIKLQotI2lmZGVmIFVTRV9FTVVMQVRJT05TCi0jaW5jbHVkZSAiZW11bC5oIgotI2VuZGlmCi0jaW5jbHVkZSAibGlzdGluZy5oIgotCi0jaWZuZGVmIExPQ0FMX0xBQkVMU19ET0xMQVIKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAwCi0jZW5kaWYKLQotI2lmbmRlZiBMT0NBTF9MQUJFTFNfRkIKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDAKLSNlbmRpZgotCi0jaWZuZGVmIFRFWFRfU0VDVElPTl9OQU1FCi0jZGVmaW5lIFRFWFRfU0VDVElPTl9OQU1FCSIudGV4dCIKLSNkZWZpbmUgREFUQV9TRUNUSU9OX05BTUUJIi5kYXRhIgotI2RlZmluZSBCU1NfU0VDVElPTl9OQU1FCSIuYnNzIgotI2VuZGlmCi0KLSNlbmRpZiAvKiBHQVMgKi8KLQotLyogZW5kIG9mIGFzLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9hc2ludGwuaCBiL2dhcy9hc2ludGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczM2M4NS4uMDAwMDAwMAotLS0gYS9nYXMvYXNpbnRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiBhc2ludGwuaCAtIGdhcy1zcGVjaWZpYyBoZWFkZXIgZm9yIGdldHRleHQgY29kZS4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBUb20gVHJvbWV5IDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaWZkZWYgSEFWRV9MT0NBTEVfSAotIyBpbmNsdWRlIDxsb2NhbGUuaD4KLSNlbmRpZgotCi0jaWZkZWYgRU5BQkxFX05MUwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jIGRlZmluZSBfKFN0cmluZykgZ2V0dGV4dCAoU3RyaW5nKQotIyBpZmRlZiBnZXR0ZXh0X25vb3AKLSMgIGRlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQotIyBlbHNlCi0jICBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotIyBlbmRpZgotI2Vsc2UKLS8qIFN0dWJzIHRoYXQgZG8gc29tZXRoaW5nIGNsb3NlIGVub3VnaC4gICovCi0jIGRlZmluZSB0ZXh0ZG9tYWluKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGdldHRleHQoU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZGdldHRleHQoRG9tYWluLE1lc3NhZ2UpIChNZXNzYWdlKQotIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbixNZXNzYWdlLFR5cGUpIChNZXNzYWdlKQotIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWluLERpcmVjdG9yeSkgKERvbWFpbikKLSMgZGVmaW5lIF8oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvYXRvZi1nZW5lcmljLmMgYi9nYXMvYXRvZi1nZW5lcmljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNmY2NjUuLjAwMDAwMDAKLS0tIGEvZ2FzL2F0b2YtZ2VuZXJpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjM2ICswLDAgQEAKLS8qIGF0b2ZfZ2VuZXJpYy5jIC0gdHVybiBhIHN0cmluZyBvZiBkaWdpdHMgaW50byBhIEZsb251bQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFICgwKQotI2VuZGlmCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRSAgKDEpCi0jZW5kaWYKLQotI2lmZGVmIFRSQUNFCi1zdGF0aWMgdm9pZCBmbG9udW1fcHJpbnQgUEFSQU1TICgoY29uc3QgRkxPTlVNX1RZUEUgKikpOwotI2VuZGlmCi0KLSNkZWZpbmUgQVNTVU1FX0RFQ0lNQUxfTUFSS19JU19ET1QKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJCQkJCQkJCQkqCi0gKglHaXZlbiBhIHN0cmluZyBvZiBkZWNpbWFsIGRpZ2l0cyAsIHdpdGggb3B0aW9uYWwgZGVjaW1hbAkqCi0gKgltYXJrIGFuZCBvcHRpb25hbCBkZWNpbWFsIGV4cG9uZW50IChwbGFjZSB2YWx1ZSkgb2YgdGhlCQkqCi0gKglsb3dlc3Rfb3JkZXIgZGVjaW1hbCBkaWdpdDogcHJvZHVjZSBhIGZsb2F0aW5nIHBvaW50CQkqCi0gKgludW1iZXIuIFRoZSBudW1iZXIgaXMgJ2dlbmVyaWMnIGZsb2F0aW5nIHBvaW50OiBvdXIJCSoKLSAqCWNhbGxlciB3aWxsIGVuY29kZSBpdCBmb3IgYSBzcGVjaWZpYyBtYWNoaW5lIGFyY2hpdGVjdHVyZS4JKgotICoJCQkJCQkJCQkqCi0gKglBc3N1bXB0aW9ucwkJCQkJCQkqCi0gKgkJdXNlcyBiYXNlIChyYWRpeCkgMgkJCQkJKgotICoJCXRoaXMgbWFjaGluZSB1c2VzIDIncyBjb21wbGVtZW50IGJpbmFyeSBpbnRlZ2VycwkqCi0gKgkJdGFyZ2V0IGZsb251bXMgdXNlICIgICAgICAiICAgICAgICAgIiAgICAgICAiCQkqCi0gKgkJdGFyZ2V0IGZsb251bXMgZXhwb25lbnRzIGZpdCBpbiBhIGxvbmcJCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0KLSAgU3ludGF4OgotCi0gIDxmbG9udW0+IDo6PSA8b3B0aW9uYWwtc2lnbj4gPGRlY2ltYWwtbnVtYmVyPiA8b3B0aW9uYWwtZXhwb25lbnQ+Ci0gIDxvcHRpb25hbC1zaWduPiA6Oj0gJysnIHwgJy0nIHwge2VtcHR5fQotICA8ZGVjaW1hbC1udW1iZXI+IDo6PSA8aW50ZWdlcj4KLSAgfCA8aW50ZWdlcj4gPHJhZGl4LWNoYXJhY3Rlcj4KLSAgfCA8aW50ZWdlcj4gPHJhZGl4LWNoYXJhY3Rlcj4gPGludGVnZXI+Ci0gIHwgPHJhZGl4LWNoYXJhY3Rlcj4gPGludGVnZXI+Ci0KLSAgPG9wdGlvbmFsLWV4cG9uZW50PiA6Oj0ge2VtcHR5fQotICB8IDxleHBvbmVudC1jaGFyYWN0ZXI+IDxvcHRpb25hbC1zaWduPiA8aW50ZWdlcj4KLQotICA8aW50ZWdlcj4gOjo9IDxkaWdpdD4gfCA8ZGlnaXQ+IDxpbnRlZ2VyPgotICA8ZGlnaXQ+IDo6PSAnMCcgfCAnMScgfCAnMicgfCAnMycgfCAnNCcgfCAnNScgfCAnNicgfCAnNycgfCAnOCcgfCAnOScKLSAgPGV4cG9uZW50LWNoYXJhY3Rlcj4gOjo9IHtvbmUgY2hhcmFjdGVyIGZyb20gInN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzIn0KLSAgPHJhZGl4LWNoYXJhY3Rlcj4gOjo9IHtvbmUgY2hhcmFjdGVyIGZyb20gInN0cmluZ19vZl9kZWNpbWFsX21hcmtzIn0KLQotICAqLwotCi1pbnQKLWF0b2ZfZ2VuZXJpYyAoYWRkcmVzc19vZl9zdHJpbmdfcG9pbnRlciwKLQkgICAgICBzdHJpbmdfb2ZfZGVjaW1hbF9tYXJrcywKLQkgICAgICBzdHJpbmdfb2ZfZGVjaW1hbF9leHBvbmVudF9tYXJrcywKLQkgICAgICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKQotICAgICAvKiByZXR1cm4gcG9pbnRlciB0byBqdXN0IEFGVEVSIG51bWJlciB3ZSByZWFkLiAqLwotICAgICBjaGFyICoqYWRkcmVzc19vZl9zdHJpbmdfcG9pbnRlcjsKLSAgICAgLyogQXQgbW9zdCBvbmUgcGVyIG51bWJlci4gKi8KLSAgICAgY29uc3QgY2hhciAqc3RyaW5nX29mX2RlY2ltYWxfbWFya3M7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzOwotICAgICBGTE9OVU1fVFlQRSAqYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcjsKLXsKLSAgaW50IHJldHVybl92YWx1ZTsJCS8qIDAgbWVhbnMgT0suICovCi0gIGNoYXIgKmZpcnN0X2RpZ2l0OwotICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX2RpZ2l0c19iZWZvcmVfZGVjaW1hbDsKLSAgdW5zaWduZWQgaW50IG51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbDsKLSAgbG9uZyBkZWNpbWFsX2V4cG9uZW50OwotICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX2RpZ2l0c19hdmFpbGFibGU7Ci0gIGNoYXIgZGlnaXRzX3NpZ25fY2hhcjsKLQotICAvKgotICAgKiBTY2FuIHRoZSBpbnB1dCBzdHJpbmcsIGFic3RyYWN0aW5nICgxKWRpZ2l0cyAoMilkZWNpbWFsIG1hcmsgKDMpIGV4cG9uZW50LgotICAgKiBJdCB3b3VsZCBiZSBzaW1wbGVyIHRvIG1vZGlmeSB0aGUgc3RyaW5nLCBidXQgd2UgZG9uJ3Q7IGp1c3QgdG8gYmUgbmljZQotICAgKiB0byBjYWxsZXIuCi0gICAqIFdlIG5lZWQgdG8ga25vdyBob3cgbWFueSBkaWdpdHMgd2UgaGF2ZSwgc28gd2UgY2FuIGFsbG9jYXRlIHNwYWNlIGZvcgotICAgKiB0aGUgZGlnaXRzJyB2YWx1ZS4KLSAgICovCi0KLSAgY2hhciAqcDsKLSAgY2hhciBjOwotICBpbnQgc2Vlbl9zaWduaWZpY2FudF9kaWdpdDsKLQotI2lmZGVmIEFTU1VNRV9ERUNJTUFMX01BUktfSVNfRE9UCi0gIGFzc2VydCAoc3RyaW5nX29mX2RlY2ltYWxfbWFya3NbMF0gPT0gJy4nCi0JICAmJiBzdHJpbmdfb2ZfZGVjaW1hbF9tYXJrc1sxXSA9PSAwKTsKLSNkZWZpbmUgSVNfREVDSU1BTF9NQVJLKGMpCSgoYykgPT0gJy4nKQotI2Vsc2UKLSNkZWZpbmUgSVNfREVDSU1BTF9NQVJLKGMpCSgwICE9IHN0cmNociAoc3RyaW5nX29mX2RlY2ltYWxfbWFya3MsIChjKSkpCi0jZW5kaWYKLQotICBmaXJzdF9kaWdpdCA9ICphZGRyZXNzX29mX3N0cmluZ19wb2ludGVyOwotICBjID0gKmZpcnN0X2RpZ2l0OwotCi0gIGlmIChjID09ICctJyB8fCBjID09ICcrJykKLSAgICB7Ci0gICAgICBkaWdpdHNfc2lnbl9jaGFyID0gYzsKLSAgICAgIGZpcnN0X2RpZ2l0Kys7Ci0gICAgfQotICBlbHNlCi0gICAgZGlnaXRzX3NpZ25fY2hhciA9ICcrJzsKLQotICBzd2l0Y2ggKGZpcnN0X2RpZ2l0WzBdKQotICAgIHsKLSAgICBjYXNlICduJzoKLSAgICBjYXNlICdOJzoKLSAgICAgIGlmICghc3RybmNhc2VjbXAgKCJuYW4iLCBmaXJzdF9kaWdpdCwgMykpCi0JewotCSAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+c2lnbiA9IDA7Ci0JICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5leHBvbmVudCA9IDA7Ci0JICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5sZWFkZXIgPQotCSAgICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5sb3c7Ci0JICAqYWRkcmVzc19vZl9zdHJpbmdfcG9pbnRlciA9IGZpcnN0X2RpZ2l0ICsgMzsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaSc6Ci0gICAgY2FzZSAnSSc6Ci0gICAgICBpZiAoIXN0cm5jYXNlY21wICgiaW5mIiwgZmlyc3RfZGlnaXQsIDMpKQotCXsKLQkgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPnNpZ24gPQotCSAgICBkaWdpdHNfc2lnbl9jaGFyID09ICcrJyA/ICdQJyA6ICdOJzsKLQkgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmV4cG9uZW50ID0gMDsKLQkgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxlYWRlciA9Ci0JICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxvdzsKLQotCSAgZmlyc3RfZGlnaXQgKz0gMzsKLQkgIGlmICghc3RybmNhc2VjbXAgKCJpbml0eSIsIGZpcnN0X2RpZ2l0LCA1KSkKLQkgICAgZmlyc3RfZGlnaXQgKz0gNTsKLQotCSAgKmFkZHJlc3Nfb2Zfc3RyaW5nX3BvaW50ZXIgPSBmaXJzdF9kaWdpdDsKLQotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIG51bWJlcl9vZl9kaWdpdHNfYmVmb3JlX2RlY2ltYWwgPSAwOwotICBudW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWwgPSAwOwotICBkZWNpbWFsX2V4cG9uZW50ID0gMDsKLSAgc2Vlbl9zaWduaWZpY2FudF9kaWdpdCA9IDA7Ci0gIGZvciAocCA9IGZpcnN0X2RpZ2l0OwotICAgICAgICgoKGMgPSAqcCkgIT0gJ1wwJykKLQkmJiAoIWMgfHwgIUlTX0RFQ0lNQUxfTUFSSyAoYykpCi0JJiYgKCFjIHx8ICFzdHJjaHIgKHN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzLCBjKSkpOwotICAgICAgIHArKykKLSAgICB7Ci0gICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpKQotCXsKLQkgIGlmIChzZWVuX3NpZ25pZmljYW50X2RpZ2l0IHx8IGMgPiAnMCcpCi0JICAgIHsKLQkgICAgICArK251bWJlcl9vZl9kaWdpdHNfYmVmb3JlX2RlY2ltYWw7Ci0JICAgICAgc2Vlbl9zaWduaWZpY2FudF9kaWdpdCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZpcnN0X2RpZ2l0Kys7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYnJlYWs7CQkvKiBwIC0+IGNoYXIgYWZ0ZXIgcHJlLWRlY2ltYWwgZGlnaXRzLiAqLwotCX0KLSAgICB9CQkJCS8qIEZvciBlYWNoIGRpZ2l0IGJlZm9yZSBkZWNpbWFsIG1hcmsuICovCi0KLSNpZm5kZWYgT0xEX0ZMT0FUX1JFQURTCi0gIC8qIElnbm9yZSB0cmFpbGluZyAwJ3MgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuICBUaGUgb3JpZ2luYWwgY29kZSBoZXJlCi0gICAqIChpZmRlZidkIG91dCkgZG9lcyBub3QgZG8gdGhpcywgYW5kIG51bWJlcnMgbGlrZQotICAgKgk0LjI5NDk2NzI5NjAwMDAwMDAwMDAwZSswOQkoMioqMzEpCi0gICAqIGNvbWUgb3V0IGluZXhhY3QgZm9yIHNvbWUgcmVhc29uIHJlbGF0ZWQgdG8gbGVuZ3RoIG9mIHRoZSBkaWdpdAotICAgKiBzdHJpbmcuCi0gICAqLwotICBpZiAoYyAmJiBJU19ERUNJTUFMX01BUksgKGMpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCB6ZXJvcyA9IDA7CS8qIExlbmd0aCBvZiBjdXJyZW50IHN0cmluZyBvZiB6ZXJvcyAqLwotCi0gICAgICBmb3IgKHArKzsgKGMgPSAqcCkgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpOyBwKyspCi0JewotCSAgaWYgKGMgPT0gJzAnKQotCSAgICB7Ci0JICAgICAgemVyb3MrKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsICs9IDEgKyB6ZXJvczsKLQkgICAgICB6ZXJvcyA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgfQotI2Vsc2UKLSAgaWYgKGMgJiYgSVNfREVDSU1BTF9NQVJLIChjKSkKLSAgICB7Ci0gICAgICBmb3IgKHArKzsKLQkgICAoKChjID0gKnApICE9ICdcMCcpCi0JICAgICYmICghYyB8fCAhc3RyY2hyIChzdHJpbmdfb2ZfZGVjaW1hbF9leHBvbmVudF9tYXJrcywgYykpKTsKLQkgICBwKyspCi0JewotCSAgaWYgKGlzZGlnaXQgKGMpKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBtYXkgYmUgcmV0cmFjdGVkIGJlbG93LiAqLwotCSAgICAgIG51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbCsrOwotCi0JICAgICAgaWYgKCAvKiBzZWVuX3NpZ25pZmljYW50X2RpZ2l0IHx8ICovIGMgPiAnMCcpCi0JCXsKLQkJICBzZWVuX3NpZ25pZmljYW50X2RpZ2l0ID0gVFJVRTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoIXNlZW5fc2lnbmlmaWNhbnRfZGlnaXQpCi0JCXsKLQkJICBudW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWwgPSAwOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9CQkJLyogRm9yIGVhY2ggZGlnaXQgYWZ0ZXIgZGVjaW1hbCBtYXJrLiAqLwotICAgIH0KLQotICB3aGlsZSAobnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsCi0JICYmIGZpcnN0X2RpZ2l0W251bWJlcl9vZl9kaWdpdHNfYmVmb3JlX2RlY2ltYWwKLQkJCSsgbnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsXSA9PSAnMCcpCi0gICAgLS1udW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWw7Ci0jZW5kaWYKLQotICBpZiAoZmxhZ19tNjhrX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoYyA9PSAnXycpCi0JYyA9ICorK3A7Ci0gICAgfQotICBpZiAoYyAmJiBzdHJjaHIgKHN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzLCBjKSkKLSAgICB7Ci0gICAgICBjaGFyIGRpZ2l0c19leHBvbmVudF9zaWduX2NoYXI7Ci0KLSAgICAgIGMgPSAqKytwOwotICAgICAgaWYgKGZsYWdfbTY4a19tcmkpCi0JewotCSAgd2hpbGUgKGMgPT0gJ18nKQotCSAgICBjID0gKisrcDsKLQl9Ci0gICAgICBpZiAoYyAmJiBzdHJjaHIgKCIrLSIsIGMpKQotCXsKLQkgIGRpZ2l0c19leHBvbmVudF9zaWduX2NoYXIgPSBjOwotCSAgYyA9ICorK3A7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRpZ2l0c19leHBvbmVudF9zaWduX2NoYXIgPSAnKyc7Ci0JfQotCi0gICAgICBmb3IgKDsgKGMpOyBjID0gKisrcCkKLQl7Ci0JICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpKQotCSAgICB7Ci0JICAgICAgZGVjaW1hbF9leHBvbmVudCA9IGRlY2ltYWxfZXhwb25lbnQgKiAxMCArIGMgLSAnMCc7Ci0JICAgICAgLyoKLQkgICAgICAgKiBCVUchIElmIHdlIG92ZXJmbG93IGhlcmUsIHdlIGxvc2UhCi0JICAgICAgICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoZGlnaXRzX2V4cG9uZW50X3NpZ25fY2hhciA9PSAnLScpCi0JewotCSAgZGVjaW1hbF9leHBvbmVudCA9IC1kZWNpbWFsX2V4cG9uZW50OwotCX0KLSAgICB9Ci0KLSAgKmFkZHJlc3Nfb2Zfc3RyaW5nX3BvaW50ZXIgPSBwOwotCi0KLQotICBudW1iZXJfb2ZfZGlnaXRzX2F2YWlsYWJsZSA9Ci0gICAgbnVtYmVyX29mX2RpZ2l0c19iZWZvcmVfZGVjaW1hbCArIG51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbDsKLSAgcmV0dXJuX3ZhbHVlID0gMDsKLSAgaWYgKG51bWJlcl9vZl9kaWdpdHNfYXZhaWxhYmxlID09IDApCi0gICAgewotICAgICAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+ZXhwb25lbnQgPSAwOwkvKiBOb3Qgc3RyaWN0bHkgbmVjZXNzYXJ5ICovCi0gICAgICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5sZWFkZXIKLQk9IC0xICsgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+bG93OwotICAgICAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+c2lnbiA9IGRpZ2l0c19zaWduX2NoYXI7Ci0gICAgICAvKiBXZSBoYXZlIGp1c3QgY29uY29jdGVkICgrLy0pMC4wRTAgKi8KLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBjb3VudDsJCS8qIE51bWJlciBvZiB1c2VmdWwgZGlnaXRzIGxlZnQgdG8gc2Nhbi4gKi8KLQotICAgICAgTElUVExFTlVNX1RZUEUgKmRpZ2l0c19iaW5hcnlfbG93OwotICAgICAgdW5zaWduZWQgaW50IHByZWNpc2lvbjsKLSAgICAgIHVuc2lnbmVkIGludCBtYXhpbXVtX3VzZWZ1bF9kaWdpdHM7Ci0gICAgICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX2RpZ2l0c190b191c2U7Ci0gICAgICB1bnNpZ25lZCBpbnQgbW9yZV90aGFuX2Vub3VnaF9iaXRzX2Zvcl9kaWdpdHM7Ci0gICAgICB1bnNpZ25lZCBpbnQgbW9yZV90aGFuX2Vub3VnaF9saXR0bGVudW1zX2Zvcl9kaWdpdHM7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2l6ZV9vZl9kaWdpdHNfaW5fbGl0dGxlbnVtczsKLSAgICAgIHVuc2lnbmVkIGludCBzaXplX29mX2RpZ2l0c19pbl9jaGFyczsKLSAgICAgIEZMT05VTV9UWVBFIHBvd2VyX29mXzEwX2Zsb251bTsKLSAgICAgIEZMT05VTV9UWVBFIGRpZ2l0c19mbG9udW07Ci0KLSAgICAgIHByZWNpc2lvbiA9IChhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5oaWdoCi0JCSAgIC0gYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+bG93Ci0JCSAgICsgMSk7CS8qIE51bWJlciBvZiBkZXN0aW5hdGlvbiBsaXR0bGVudW1zLiAqLwotCi0gICAgICAvKiBJbmNsdWRlcyBndWFyZCBiaXRzICh0d28gbGl0dGxlbnVtcyB3b3J0aCkgKi8KLSNpZiAwIC8qIFRoZSBpbnRlZ2VyIHZlcnNpb24gYmVsb3cgaXMgdmVyeSBjbG9zZSwgYW5kIGl0IGRvZXNuJ3QKLQkgcmVxdWlyZSBmbG9hdGluZyBwb2ludCBzdXBwb3J0ICh3aGljaCBpcyBjdXJyZW50bHkgYnVnZ3kgb24KLQkgdGhlIEFscGhhKS4gICovCi0gICAgICBtYXhpbXVtX3VzZWZ1bF9kaWdpdHMgPSAoKChkb3VibGUpIChwcmVjaXNpb24gLSAyKSkKLQkJCSAgICAgICAqICgoZG91YmxlKSAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKSkKLQkJCSAgICAgICAvIChMT0dfVE9fQkFTRV8yX09GXzEwKSkKLQkrIDI7CQkJLyogMiA6OiBndWFyZCBkaWdpdHMuICovCi0jZWxzZQotICAgICAgbWF4aW11bV91c2VmdWxfZGlnaXRzID0gKCgocHJlY2lzaW9uIC0gMikpCi0JCQkgICAgICAgKiAoIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpKQotCQkJICAgICAgICogMTAwMDAwMCAvIDMzMjE5MjgpCi0JKyAyOwkJCS8qIDIgOjogZ3VhcmQgZGlnaXRzLiAqLwotI2VuZGlmCi0KLSAgICAgIGlmIChudW1iZXJfb2ZfZGlnaXRzX2F2YWlsYWJsZSA+IG1heGltdW1fdXNlZnVsX2RpZ2l0cykKLQl7Ci0JICBudW1iZXJfb2ZfZGlnaXRzX3RvX3VzZSA9IG1heGltdW1fdXNlZnVsX2RpZ2l0czsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbnVtYmVyX29mX2RpZ2l0c190b191c2UgPSBudW1iZXJfb2ZfZGlnaXRzX2F2YWlsYWJsZTsKLQl9Ci0KLSAgICAgIC8qIENhc3QgdGhlc2UgdG8gU0lHTkVEIExPTkcgZmlyc3QsIG90aGVyd2lzZSwgb24gc3lzdGVtcyB3aXRoCi0JIExPTkcgd2lkZXIgdGhhbiBJTlQgKHN1Y2ggYXMgQWxwaGEgT1NGLzEpLCB1bnNpZ25lZG5lc3MgbWF5Ci0JIGNhdXNlIHVuZXhwZWN0ZWQgcmVzdWx0cy4gICovCi0gICAgICBkZWNpbWFsX2V4cG9uZW50ICs9ICgobG9uZykgbnVtYmVyX29mX2RpZ2l0c19iZWZvcmVfZGVjaW1hbAotCQkJICAgLSAobG9uZykgbnVtYmVyX29mX2RpZ2l0c190b191c2UpOwotCi0jaWYgMAotICAgICAgbW9yZV90aGFuX2Vub3VnaF9iaXRzX2Zvcl9kaWdpdHMKLQk9ICgoKChkb3VibGUpIG51bWJlcl9vZl9kaWdpdHNfdG9fdXNlKSAqIExPR19UT19CQVNFXzJfT0ZfMTApICsgMSk7Ci0jZWxzZQotICAgICAgbW9yZV90aGFuX2Vub3VnaF9iaXRzX2Zvcl9kaWdpdHMKLQk9IChudW1iZXJfb2ZfZGlnaXRzX3RvX3VzZSAqIDMzMjE5MjggLyAxMDAwMDAwICsgMSk7Ci0jZW5kaWYKLQotICAgICAgbW9yZV90aGFuX2Vub3VnaF9saXR0bGVudW1zX2Zvcl9kaWdpdHMKLQk9IChtb3JlX3RoYW5fZW5vdWdoX2JpdHNfZm9yX2RpZ2l0cwotCSAgIC8gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCSsgMjsKLQotICAgICAgLyogQ29tcHV0ZSAoZGlnaXRzKSBwYXJ0LiBJbiAiMTIuMzRFNTYiIHRoaXMgaXMgdGhlICIxMjM0IiBwYXJ0LgotCSBBcml0aG1ldGljIGlzIGV4YWN0IGhlcmUuIElmIG5vIGRpZ2l0cyBhcmUgc3VwcGxpZWQgdGhlbiB0aGlzCi0JIHBhcnQgaXMgYSAwIHZhbHVlZCBiaW5hcnkgaW50ZWdlci4gIEFsbG9jYXRlIHJvb20gdG8gYnVpbGQgdXAKLQkgdGhlIGJpbmFyeSBudW1iZXIgYXMgbGl0dGxlbnVtcy4gIFdlIHdhbnQgdGhpcyBtZW1vcnkgdG8KLQkgZGlzYXBwZWFyIHdoZW4gd2UgbGVhdmUgdGhpcyBmdW5jdGlvbi4gIEFzc3VtZSBubyBhbGlnbm1lbnQKLQkgcHJvYmxlbXMgPT4gKHJvb20gZm9yIG4gb2JqZWN0cykgPT0gbiAqIChyb29tIGZvciAxCi0JIG9iamVjdCkuICAqLwotCi0gICAgICBzaXplX29mX2RpZ2l0c19pbl9saXR0bGVudW1zID0gbW9yZV90aGFuX2Vub3VnaF9saXR0bGVudW1zX2Zvcl9kaWdpdHM7Ci0gICAgICBzaXplX29mX2RpZ2l0c19pbl9jaGFycyA9IHNpemVfb2ZfZGlnaXRzX2luX2xpdHRsZW51bXMKLQkqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCi0gICAgICBkaWdpdHNfYmluYXJ5X2xvdyA9IChMSVRUTEVOVU1fVFlQRSAqKQotCWFsbG9jYSAoc2l6ZV9vZl9kaWdpdHNfaW5fY2hhcnMpOwotCi0gICAgICBtZW1zZXQgKChjaGFyICopIGRpZ2l0c19iaW5hcnlfbG93LCAnXDAnLCBzaXplX29mX2RpZ2l0c19pbl9jaGFycyk7Ci0KLSAgICAgIC8qIERpZ2l0c19iaW5hcnlfbG93W10gaXMgYWxsb2NhdGVkIGFuZCB6ZXJvZWQuICovCi0KLSAgICAgIC8qCi0gICAgICAgKiBQYXJzZSB0aGUgZGVjaW1hbCBkaWdpdHMgYXMgaWYgKiBkaWdpdHNfbG93IHdhcyBpbiB0aGUgdW5pdHMgcG9zaXRpb24uCi0gICAgICAgKiBFbWl0IGEgYmluYXJ5IG51bWJlciBpbnRvIGRpZ2l0c19iaW5hcnlfbG93W10uCi0gICAgICAgKgotICAgICAgICogVXNlIGEgbGFyZ2UtcHJlY2lzaW9uIHZlcnNpb24gb2Y6Ci0gICAgICAgKiAoKCgxc3QtZGlnaXQpICogMTAgKyAybmQtZGlnaXQpICogMTAgKyAzcmQtZGlnaXQgLi4uKSAqIDEwICsgbGFzdC1kaWdpdAotICAgICAgICovCi0KLSAgICAgIGZvciAocCA9IGZpcnN0X2RpZ2l0LCBjb3VudCA9IG51bWJlcl9vZl9kaWdpdHNfdG9fdXNlOyBjb3VudDsgcCsrLCAtLWNvdW50KQotCXsKLQkgIGMgPSAqcDsKLQkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYykpCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIE11bHRpcGx5IGJ5IDEwLiBBc3N1bWUgY2FuIG5ldmVyIG92ZXJmbG93LgotCSAgICAgICAqIEFkZCB0aGlzIGRpZ2l0IHRvIGRpZ2l0c19iaW5hcnlfbG93W10uCi0JICAgICAgICovCi0KLQkgICAgICBsb25nIGNhcnJ5OwotCSAgICAgIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fcG9pbnRlcjsKLQkgICAgICBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtX2xpbWl0OwotCi0JICAgICAgbGl0dGxlbnVtX2xpbWl0ID0gZGlnaXRzX2JpbmFyeV9sb3cKLQkJKyBtb3JlX3RoYW5fZW5vdWdoX2xpdHRsZW51bXNfZm9yX2RpZ2l0cwotCQktIDE7Ci0KLQkgICAgICBjYXJyeSA9IGMgLSAnMCc7CS8qIGNoYXIgLT4gYmluYXJ5ICovCi0KLQkgICAgICBmb3IgKGxpdHRsZW51bV9wb2ludGVyID0gZGlnaXRzX2JpbmFyeV9sb3c7Ci0JCSAgIGxpdHRsZW51bV9wb2ludGVyIDw9IGxpdHRsZW51bV9saW1pdDsKLQkJICAgbGl0dGxlbnVtX3BvaW50ZXIrKykKLQkJewotCQkgIGxvbmcgd29yazsKLQotCQkgIHdvcmsgPSBjYXJyeSArIDEwICogKGxvbmcpICgqbGl0dGxlbnVtX3BvaW50ZXIpOwotCQkgICpsaXR0bGVudW1fcG9pbnRlciA9IHdvcmsgJiBMSVRUTEVOVU1fTUFTSzsKLQkJICBjYXJyeSA9IHdvcmsgPj4gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCQl9Ci0KLQkgICAgICBpZiAoY2FycnkgIT0gMCkKLQkJewotCQkgIC8qCi0JCSAgICogV2UgaGF2ZSBhIEdST1NTIGludGVybmFsIGVycm9yLgotCQkgICAqIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4KLQkJICAgKi8KLQkJICBhc19mYXRhbCAoXygiZmFpbGVkIHNhbml0eSBjaGVjay4iKSk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKytjb3VudDsJCS8qICcuJyBkb2Vzbid0IGFsdGVyIGRpZ2l0cyB1c2VkIGNvdW50LiAqLwotCSAgICB9Ci0JfQotCi0KLSAgICAgIC8qCi0gICAgICAgKiBEaWdpdHNfYmluYXJ5X2xvd1tdIHByb3Blcmx5IGVuY29kZXMgdGhlIHZhbHVlIG9mIHRoZSBkaWdpdHMuCi0gICAgICAgKiBGb3JnZXQgYWJvdXQgYW55IGhpZ2gtb3JkZXIgbGl0dGxlbnVtcyB0aGF0IGFyZSAwLgotICAgICAgICovCi0gICAgICB3aGlsZSAoZGlnaXRzX2JpbmFyeV9sb3dbc2l6ZV9vZl9kaWdpdHNfaW5fbGl0dGxlbnVtcyAtIDFdID09IDAKLQkgICAgICYmIHNpemVfb2ZfZGlnaXRzX2luX2xpdHRsZW51bXMgPj0gMikKLQlzaXplX29mX2RpZ2l0c19pbl9saXR0bGVudW1zLS07Ci0KLSAgICAgIGRpZ2l0c19mbG9udW0ubG93ID0gZGlnaXRzX2JpbmFyeV9sb3c7Ci0gICAgICBkaWdpdHNfZmxvbnVtLmhpZ2ggPSBkaWdpdHNfYmluYXJ5X2xvdyArIHNpemVfb2ZfZGlnaXRzX2luX2xpdHRsZW51bXMgLSAxOwotICAgICAgZGlnaXRzX2Zsb251bS5sZWFkZXIgPSBkaWdpdHNfZmxvbnVtLmhpZ2g7Ci0gICAgICBkaWdpdHNfZmxvbnVtLmV4cG9uZW50ID0gMDsKLSAgICAgIC8qCi0gICAgICAgKiBUaGUgdmFsdWUgb2YgZGlnaXRzX2Zsb251bSAuIHNpZ24gc2hvdWxkIG5vdCBiZSBpbXBvcnRhbnQuCi0gICAgICAgKiBXZSBoYXZlIGFscmVhZHkgZGVjaWRlZCB0aGUgb3V0cHV0J3Mgc2lnbi4KLSAgICAgICAqIFdlIHRydXN0IHRoYXQgdGhlIHNpZ24gd29uJ3QgaW5mbHVlbmNlIHRoZSBvdGhlciBwYXJ0cyBvZiB0aGUgbnVtYmVyIQotICAgICAgICogU28gd2UgZ2l2ZSBpdCBhIHZhbHVlIGZvciB0aGVzZSByZWFzb25zOgotICAgICAgICogKDEpIGNvdXJ0ZXN5IHRvIGh1bWFucyByZWFkaW5nL2RlYnVnZ2luZwotICAgICAgICogICAgIHRoZXNlIG51bWJlcnMgc28gdGhleSBkb24ndCBnZXQgZXhjaXRlZCBhYm91dCBzdHJhbmdlIHZhbHVlcwotICAgICAgICogKDIpIGluIGZ1dHVyZSB0aGVyZSBtYXkgYmUgbW9yZSBtZWFuaW5nIGF0dGFjaGVkIHRvIHNpZ24sCi0gICAgICAgKiAgICAgYW5kIHdoYXQgd2FzCi0gICAgICAgKiAgICAgaGFybWxlc3Mgbm9pc2UgbWF5IGJlY29tZSBkaXNydXB0aXZlLCBpbGwtY29uZGl0aW9uZWQgKG9yIHdvcnNlKQotICAgICAgICogICAgIGlucHV0LgotICAgICAgICovCi0gICAgICBkaWdpdHNfZmxvbnVtLnNpZ24gPSAnKyc7Ci0KLSAgICAgIHsKLQkvKgotCSAqIENvbXB1dGUgdGhlIG1hbnRzc2EgKCYgZXhwb25lbnQpIG9mIHRoZSBwb3dlciBvZiAxMC4KLQkgKiBJZiBzdWNlc3NmdWwsIHRoZW4gbXVsdGlwbHkgdGhlIHBvd2VyIG9mIDEwIGJ5IHRoZSBkaWdpdHMKLQkgKiBnaXZpbmcgcmV0dXJuX2JpbmFyeV9tYW50aXNzYSBhbmQgcmV0dXJuX2JpbmFyeV9leHBvbmVudC4KLQkgKi8KLQotCUxJVFRMRU5VTV9UWVBFICpwb3dlcl9iaW5hcnlfbG93OwotCWludCBkZWNpbWFsX2V4cG9uZW50X2lzX25lZ2F0aXZlOwotCS8qIFRoaXMgcmVmZXJzIHRvIHRoZSAiLTU2IiBpbiAiMTIuMzRFLTU2Ii4gKi8KLQkvKiBGQUxTRTogZGVjaW1hbF9leHBvbmVudCBpcyBwb3NpdGl2ZSAob3IgMCkgKi8KLQkvKiBUUlVFOiAgZGVjaW1hbF9leHBvbmVudCBpcyBuZWdhdGl2ZSAqLwotCUZMT05VTV9UWVBFIHRlbXBvcmFyeV9mbG9udW07Ci0JTElUVExFTlVNX1RZUEUgKnRlbXBvcmFyeV9iaW5hcnlfbG93OwotCXVuc2lnbmVkIGludCBzaXplX29mX3Bvd2VyX2luX2xpdHRsZW51bXM7Ci0JdW5zaWduZWQgaW50IHNpemVfb2ZfcG93ZXJfaW5fY2hhcnM7Ci0KLQlzaXplX29mX3Bvd2VyX2luX2xpdHRsZW51bXMgPSBwcmVjaXNpb247Ci0JLyogUHJlY2lzaW9uIGhhcyBhIGJ1aWx0LWluIGZ1ZGdlIGZhY3RvciBzbyB3ZSBnZXQgYSBmZXcgZ3VhcmQgYml0cy4gKi8KLQotCWRlY2ltYWxfZXhwb25lbnRfaXNfbmVnYXRpdmUgPSBkZWNpbWFsX2V4cG9uZW50IDwgMDsKLQlpZiAoZGVjaW1hbF9leHBvbmVudF9pc19uZWdhdGl2ZSkKLQkgIHsKLQkgICAgZGVjaW1hbF9leHBvbmVudCA9IC1kZWNpbWFsX2V4cG9uZW50OwotCSAgfQotCi0JLyogRnJvbSBub3cgb246IHRoZSBkZWNpbWFsIGV4cG9uZW50IGlzID4gMC4gSXRzIHNpZ24gaXMgc2VwYXJhdGUuICovCi0KLQlzaXplX29mX3Bvd2VyX2luX2NoYXJzID0gc2l6ZV9vZl9wb3dlcl9pbl9saXR0bGVudW1zCi0JICAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpICsgMjsKLQotCXBvd2VyX2JpbmFyeV9sb3cgPSAoTElUVExFTlVNX1RZUEUgKikgYWxsb2NhIChzaXplX29mX3Bvd2VyX2luX2NoYXJzKTsKLQl0ZW1wb3JhcnlfYmluYXJ5X2xvdyA9IChMSVRUTEVOVU1fVFlQRSAqKSBhbGxvY2EgKHNpemVfb2ZfcG93ZXJfaW5fY2hhcnMpOwotCW1lbXNldCAoKGNoYXIgKikgcG93ZXJfYmluYXJ5X2xvdywgJ1wwJywgc2l6ZV9vZl9wb3dlcl9pbl9jaGFycyk7Ci0JKnBvd2VyX2JpbmFyeV9sb3cgPSAxOwotCXBvd2VyX29mXzEwX2Zsb251bS5leHBvbmVudCA9IDA7Ci0JcG93ZXJfb2ZfMTBfZmxvbnVtLmxvdyA9IHBvd2VyX2JpbmFyeV9sb3c7Ci0JcG93ZXJfb2ZfMTBfZmxvbnVtLmxlYWRlciA9IHBvd2VyX2JpbmFyeV9sb3c7Ci0JcG93ZXJfb2ZfMTBfZmxvbnVtLmhpZ2ggPSBwb3dlcl9iaW5hcnlfbG93ICsgc2l6ZV9vZl9wb3dlcl9pbl9saXR0bGVudW1zIC0gMTsKLQlwb3dlcl9vZl8xMF9mbG9udW0uc2lnbiA9ICcrJzsKLQl0ZW1wb3JhcnlfZmxvbnVtLmxvdyA9IHRlbXBvcmFyeV9iaW5hcnlfbG93OwotCXRlbXBvcmFyeV9mbG9udW0uaGlnaCA9IHRlbXBvcmFyeV9iaW5hcnlfbG93ICsgc2l6ZV9vZl9wb3dlcl9pbl9saXR0bGVudW1zIC0gMTsKLQkvKgotCSAqIChwb3dlcikgPT0gMS4KLQkgKiBTcGFjZSBmb3IgdGVtcG9yYXJ5X2Zsb251bSBhbGxvY2F0ZWQuCi0JICovCi0KLQkvKgotCSAqIC4uLgotCSAqCi0JICogV0hJTEUJbW9yZSBiaXRzCi0JICogRE8JZmluZCBuZXh0IGJpdCAod2l0aCBwbGFjZSB2YWx1ZSkKLQkgKgltdWx0aXBseSBpbnRvIHBvd2VyIG1hbnRpc3NhCi0JICogT0QKLQkgKi8KLQl7Ci0JICBpbnQgcGxhY2VfbnVtYmVyX2xpbWl0OwotCSAgLyogQW55IDEwXigyXm4pIHdob3NlICJuIiBleGNlZWRzIHRoaXMgKi8KLQkgIC8qIHZhbHVlIHdpbGwgZmFsbCBvZmYgdGhlIGVuZCBvZiAqLwotCSAgLyogZmxvbnVtX1hYWFhfcG93ZXJzX29mX3RlbltdLiAqLwotCSAgaW50IHBsYWNlX251bWJlcjsKLQkgIGNvbnN0IEZMT05VTV9UWVBFICptdWx0aXBsaWNhbmQ7CS8qIC0+IDEwXigyXm4pICovCi0KLQkgIHBsYWNlX251bWJlcl9saW1pdCA9IHRhYmxlX3NpemVfb2ZfZmxvbnVtX3Bvd2Vyc19vZl90ZW47Ci0KLQkgIG11bHRpcGxpY2FuZCA9IChkZWNpbWFsX2V4cG9uZW50X2lzX25lZ2F0aXZlCi0JCQkgID8gZmxvbnVtX25lZ2F0aXZlX3Bvd2Vyc19vZl90ZW4KLQkJCSAgOiBmbG9udW1fcG9zaXRpdmVfcG93ZXJzX29mX3Rlbik7Ci0KLQkgIGZvciAocGxhY2VfbnVtYmVyID0gMTsvKiBQbGFjZSB2YWx1ZSBvZiB0aGlzIGJpdCBvZiBleHBvbmVudC4gKi8KLQkgICAgICAgZGVjaW1hbF9leHBvbmVudDsvKiBRdWl0IHdoZW4gbm8gbW9yZSAxIGJpdHMgaW4gZXhwb25lbnQuICovCi0JICAgICAgIGRlY2ltYWxfZXhwb25lbnQgPj49IDEsIHBsYWNlX251bWJlcisrKQotCSAgICB7Ci0JICAgICAgaWYgKGRlY2ltYWxfZXhwb25lbnQgJiAxKQotCQl7Ci0JCSAgaWYgKHBsYWNlX251bWJlciA+IHBsYWNlX251bWJlcl9saW1pdCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIGRlY2ltYWwgZXhwb25lbnQgaGFzIGEgbWFnbml0dWRlIHNvIGdyZWF0Ci0JCQkgdGhhdCBvdXIgdGFibGVzIGNhbid0IGhlbHAgdXMgZnJhZ21lbnQgaXQuCi0JCQkgQWx0aG91Z2ggdGhpcyByb3V0aW5lIGlzIGluIGVycm9yIGJlY2F1c2UgaXQKLQkJCSBjYW4ndCBpbWFnaW5lIGEgbnVtYmVyIHRoYXQgYmlnLCBzaWduYWwgYW4KLQkJCSBlcnJvciBhcyBpZiBpdCBpcyB0aGUgdXNlcidzIGZhdWx0IGZvcgotCQkJIHByZXNlbnRpbmcgc3VjaCBhIGJpZyBudW1iZXIuICAqLwotCQkgICAgICByZXR1cm5fdmFsdWUgPSBFUlJPUl9FWFBPTkVOVF9PVkVSRkxPVzsKLQkJICAgICAgLyogcXVpdCBvdXQgb2YgbG9vcCBncmFjZWZ1bGx5ICovCi0JCSAgICAgIGRlY2ltYWxfZXhwb25lbnQgPSAwOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLSNpZmRlZiBUUkFDRQotCQkgICAgICBwcmludGYgKCJiZWZvcmUgbXVsdGlwbHksIHBsYWNlX251bWJlciA9ICVkLiwgcG93ZXJfb2ZfMTBfZmxvbnVtOlxuIiwKLQkJCSAgICAgIHBsYWNlX251bWJlcik7Ci0KLQkJICAgICAgZmxvbnVtX3ByaW50ICgmcG93ZXJfb2ZfMTBfZmxvbnVtKTsKLQkJICAgICAgKHZvaWQpIHB1dGNoYXIgKCdcbicpOwotI2VuZGlmCi0jaWZkZWYgVFJBQ0UKLQkJICAgICAgcHJpbnRmICgibXVsdGlwbGllcjpcbiIpOwotCQkgICAgICBmbG9udW1fcHJpbnQgKG11bHRpcGxpY2FuZCArIHBsYWNlX251bWJlcik7Ci0JCSAgICAgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLSNlbmRpZgotCQkgICAgICBmbG9udW1fbXVsdGlwIChtdWx0aXBsaWNhbmQgKyBwbGFjZV9udW1iZXIsCi0JCQkJICAgICAmcG93ZXJfb2ZfMTBfZmxvbnVtLCAmdGVtcG9yYXJ5X2Zsb251bSk7Ci0jaWZkZWYgVFJBQ0UKLQkJICAgICAgcHJpbnRmICgiYWZ0ZXIgbXVsdGlwbHk6XG4iKTsKLQkJICAgICAgZmxvbnVtX3ByaW50ICgmdGVtcG9yYXJ5X2Zsb251bSk7Ci0JCSAgICAgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLSNlbmRpZgotCQkgICAgICBmbG9udW1fY29weSAoJnRlbXBvcmFyeV9mbG9udW0sICZwb3dlcl9vZl8xMF9mbG9udW0pOwotI2lmZGVmIFRSQUNFCi0JCSAgICAgIHByaW50ZiAoImFmdGVyIGNvcHk6XG4iKTsKLQkJICAgICAgZmxvbnVtX3ByaW50ICgmcG93ZXJfb2ZfMTBfZmxvbnVtKTsKLQkJICAgICAgKHZvaWQpIHB1dGNoYXIgKCdcbicpOwotI2VuZGlmCi0JCSAgICB9IC8qIElmIHRoaXMgYml0IG9mIGRlY2ltYWxfZXhwb25lbnQgd2FzIGNvbXB1dGFibGUuKi8KLQkJfSAvKiBJZiB0aGlzIGJpdCBvZiBkZWNpbWFsX2V4cG9uZW50IHdhcyBzZXQuICovCi0JICAgIH0gLyogRm9yIGVhY2ggYml0IG9mIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBleHBvbmVudCAqLwotI2lmZGVmIFRSQUNFCi0JICBwcmludGYgKCJhZnRlciBjb21wdXRpbmcgcG93ZXJfb2ZfMTBfZmxvbnVtOlxuIik7Ci0JICBmbG9udW1fcHJpbnQgKCZwb3dlcl9vZl8xMF9mbG9udW0pOwotCSAgKHZvaWQpIHB1dGNoYXIgKCdcbicpOwotI2VuZGlmCi0JfQotCi0gICAgICB9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBwb3dlcl9vZl8xMF9mbG9udW0gaXMgcG93ZXIgb2YgdGVuIGluIGJpbmFyeSAobWFudGlzc2EpICwgKGV4cG9uZW50KS4KLSAgICAgICAqIEl0IG1heSBiZSB0aGUgbnVtYmVyIDEsIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QgTkVFRCB0byBtdWx0aXBseS4KLSAgICAgICAqCi0gICAgICAgKiBNdWx0aXBseSAoZGVjaW1hbCBkaWdpdHMpIGJ5IHBvd2VyX29mXzEwX2Zsb251bS4KLSAgICAgICAqLwotCi0gICAgICBmbG9udW1fbXVsdGlwICgmcG93ZXJfb2ZfMTBfZmxvbnVtLCAmZGlnaXRzX2Zsb251bSwgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcik7Ci0gICAgICAvKiBBc3NlcnQgc2lnbiBvZiB0aGUgbnVtYmVyIHdlIG1hZGUgaXMgJysnLiAqLwotICAgICAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+c2lnbiA9IGRpZ2l0c19zaWduX2NoYXI7Ci0KLSAgICB9Ci0gIHJldHVybiByZXR1cm5fdmFsdWU7Ci19Ci0KLSNpZmRlZiBUUkFDRQotc3RhdGljIHZvaWQKLWZsb251bV9wcmludCAoZikKLSAgICAgY29uc3QgRkxPTlVNX1RZUEUgKmY7Ci17Ci0gIExJVFRMRU5VTV9UWVBFICpscDsKLSAgY2hhciBsaXR0bGVudW1fZm9ybWF0WzEwXTsKLSAgc3ByaW50ZiAobGl0dGxlbnVtX2Zvcm1hdCwgIiAlJTAlZHgiLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSAqIDIpOwotI2RlZmluZSBwcmludF9saXR0bGVudW0oTFApCShwcmludGYgKGxpdHRsZW51bV9mb3JtYXQsIExQKSkKLSAgcHJpbnRmICgiZmxvbnVtIEAlcCAlYyBlJWxkIiwgZiwgZi0+c2lnbiwgZi0+ZXhwb25lbnQpOwotICBpZiAoZi0+bG93IDwgZi0+aGlnaCkKLSAgICBmb3IgKGxwID0gZi0+aGlnaDsgbHAgPj0gZi0+bG93OyBscC0tKQotICAgICAgcHJpbnRfbGl0dGxlbnVtICgqbHApOwotICBlbHNlCi0gICAgZm9yIChscCA9IGYtPmxvdzsgbHAgPD0gZi0+aGlnaDsgbHArKykKLSAgICAgIHByaW50X2xpdHRsZW51bSAoKmxwKTsKLSAgcHJpbnRmICgiXG4iKTsKLSAgZmZsdXNoIChzdGRvdXQpOwotfQotI2VuZGlmCi0KLS8qIGVuZCBvZiBhdG9mX2dlbmVyaWMuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2JpZ251bS1jb3B5LmMgYi9nYXMvYmlnbnVtLWNvcHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmZmNiZi4uMDAwMDAwMAotLS0gYS9nYXMvYmlnbnVtLWNvcHkuYworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qIGJpZ251bV9jb3B5LmMgLSBjb3B5IGEgYmlnbnVtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotLyoKLSAqCQkJYmlnbnVtX2NvcHkgKCkKLSAqCi0gKiBDb3B5IGEgYmlnbnVtIGZyb20gaW4gdG8gb3V0LgotICogSWYgdGhlIG91dHB1dCBpcyBzaG9ydGVyIHRoYW4gdGhlIGlucHV0LCBjb3B5IGxvd2VyLW9yZGVyIGxpdHRsZW51bXMuCi0gKiBSZXR1cm4gMCBvciB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGxpdHRsZW51bXMgZHJvcHBlZC4KLSAqIEFzc3VtZXMgbGl0dGxlbnVtIGFycmF5cyBhcmUgZGVuc2VseSBwYWNrZWQ6IG5vIHVudXNlZCBjaGFycyBiZXR3ZWVuCi0gKiB0aGUgbGl0dGxlbnVtcy4gVXNlcyBtZW1jcHkoKSB0byBtb3ZlIGxpdHRsZW51bXMsIGFuZCB3YW50cyB0bwotICoga25vdyBsZW5ndGggKGluIGNoYXJzKSBvZiB0aGUgaW5wdXQgYmlnbnVtLgotICovCi0KLS8qIHZvaWQgKi8KLWludAotYmlnbnVtX2NvcHkgKGluLCBpbl9sZW5ndGgsIG91dCwgb3V0X2xlbmd0aCkKLSAgICAgcmVnaXN0ZXIgTElUVExFTlVNX1RZUEUgKmluOwotICAgICByZWdpc3RlciBpbnQgaW5fbGVuZ3RoOwkvKiBpbiBzaXplb2YobGl0dGxlbnVtKXMgKi8KLSAgICAgcmVnaXN0ZXIgTElUVExFTlVNX1RZUEUgKm91dDsKLSAgICAgcmVnaXN0ZXIgaW50IG91dF9sZW5ndGg7CS8qIGluIHNpemVvZihsaXR0bGVudW0pcyAqLwotewotICBpbnQgc2lnbmlmaWNhbnRfbGl0dGxlbnVtc19kcm9wcGVkOwotCi0gIGlmIChvdXRfbGVuZ3RoIDwgaW5fbGVuZ3RoKQotICAgIHsKLSAgICAgIExJVFRMRU5VTV9UWVBFICpwOwkvKiAtPiBtb3N0IHNpZ25pZmljYW50IChub24temVybykgaW5wdXQKLQkJCQkgICAgICBsaXR0bGVudW0uICovCi0KLSAgICAgIG1lbWNweSAoKHZvaWQgKikgb3V0LCAodm9pZCAqKSBpbiwKLQkgICAgICAodW5zaWduZWQgaW50KSBvdXRfbGVuZ3RoIDw8IExJVFRMRU5VTV9TSElGVCk7Ci0gICAgICBmb3IgKHAgPSBpbiArIGluX2xlbmd0aCAtIDE7IHAgPj0gaW47IC0tcCkKLQl7Ci0JICBpZiAoKnApCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIHNpZ25pZmljYW50X2xpdHRsZW51bXNfZHJvcHBlZCA9IHAgLSBpbiAtIGluX2xlbmd0aCArIDE7Ci0KLSAgICAgIGlmIChzaWduaWZpY2FudF9saXR0bGVudW1zX2Ryb3BwZWQgPCAwKQotCXsKLQkgIHNpZ25pZmljYW50X2xpdHRsZW51bXNfZHJvcHBlZCA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG1lbWNweSAoKGNoYXIgKikgb3V0LCAoY2hhciAqKSBpbiwKLQkgICAgICAodW5zaWduZWQgaW50KSBpbl9sZW5ndGggPDwgTElUVExFTlVNX1NISUZUKTsKLQotICAgICAgaWYgKG91dF9sZW5ndGggPiBpbl9sZW5ndGgpCi0JewotCSAgbWVtc2V0ICgoY2hhciAqKSAob3V0ICsgaW5fbGVuZ3RoKSwKLQkJICAnXDAnLAotCQkgICh1bnNpZ25lZCBpbnQpIChvdXRfbGVuZ3RoIC0gaW5fbGVuZ3RoKSA8PCBMSVRUTEVOVU1fU0hJRlQpOwotCX0KLQotICAgICAgc2lnbmlmaWNhbnRfbGl0dGxlbnVtc19kcm9wcGVkID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzaWduaWZpY2FudF9saXR0bGVudW1zX2Ryb3BwZWQpOwotfQkJCQkvKiBiaWdudW1fY29weSgpICovCi0KLS8qIGVuZCBvZiBiaWdudW0tY29weS5jICovCmRpZmYgLS1naXQgYS9nYXMvYmlnbnVtLmggYi9nYXMvYmlnbnVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYjJmMTYuLjAwMDAwMDAKLS0tIGEvZ2FzL2JpZ251bS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyogYmlnbnVtLmgtYXJiaXRyYXJ5IHByZWNpc2lvbiBpbnRlZ2VycwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCQkJCQkJCQkJKgotICoJQXJiaXRyYXJ5LXByZWNpc2lvbiBpbnRlZ2VyIGFyaXRobWV0aWMuCQkJCSoKLSAqCUZvciBzcGVlZCwgd2Ugd29yayBpbiBncm91cHMgb2YgYml0cywgZXZlbiB0aG91Z2ggdGhpcwkJKgotICoJY29tcGxpY2F0ZXMgYWxnb3JpdGhtcy4JCQkJCQkqCi0gKglFYWNoIGdyb3VwIG9mIGJpdHMgaXMgY2FsbGVkIGEgJ2xpdHRsZW51bScuCQkJKgotICoJQSBidW5jaCBvZiBsaXR0bGVudW1zIHJlcHJlc2VudGluZyBhIChwb3NzaWJseSBsYXJnZSkJCSoKLSAqCWludGVnZXIgaXMgY2FsbGVkIGEgJ2JpZ251bScuCQkJCQkqCi0gKglCaWdudW1zIGFyZSA+PSAwLgkJCQkJCSoKLSAqCQkJCQkJCQkJKgotIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZQlMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMJKDE2KQotI2RlZmluZQlMSVRUTEVOVU1fUkFESVgJCQkoMSA8PCBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0jZGVmaW5lCUxJVFRMRU5VTV9NQVNLCQkJKDB4RkZGRikKLSNkZWZpbmUgTElUVExFTlVNX1NISUZUCQkJKDEpCi0jZGVmaW5lIENIQVJTX1BFUl9MSVRUTEVOVU0JCSgxIDw8IExJVFRMRU5VTV9TSElGVCkKLSNpZm5kZWYgQklUU19QRVJfQ0hBUgotI2RlZmluZSBCSVRTX1BFUl9DSEFSCQkJKDgpCi0jZW5kaWYKLQotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBMSVRUTEVOVU1fVFlQRTsKLQotLyogSkYgdHJ1bmNhdGVkIHRoaXMgdG8gZ2V0IGFyb3VuZCBhIHByb2JsZW0gd2l0aCBHQ0MgKi8KLSNkZWZpbmUJTE9HX1RPX0JBU0VfMl9PRl8xMCAoMy4zMjE5MjgwOTQ4ODczNjIzNDc4NzAzMTk0Mjk0ODkzOTAxNzU4NjUxKQotLyogV0FSTklORzogSSBoYXZlbid0IGNoZWNrZWQgdGhhdCB0aGUgdHJhaWxpbmcgZGlnaXRzIGFyZSBjb3JyZWN0ISAqLwotCi0vKiBsZW5ndGhzIGFyZSBpbiBzaXplb2YobGl0dGxlbnVtKXMgKi8KLQotaW50IGJpZ251bV9jb3B5IFBBUkFNUyAoKExJVFRMRU5VTV9UWVBFICogaW4sIGludCBpbl9sZW5ndGgsCi0JCQkgTElUVExFTlVNX1RZUEUgKiBvdXQsIGludCBvdXRfbGVuZ3RoKSk7Ci0KLS8qIGVuZCBvZiBiaWdudW0uaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2JpdF9maXguaCBiL2dhcy9iaXRfZml4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNzI5YTcuLjAwMDAwMDAKLS0tIGEvZ2FzL2JpdF9maXguaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qIHdyaXRlLmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZSBiaXRfZml4IHdhcyBpbXBsZW1lbnRlZCB0byBzdXBwb3J0IG1hY2hpbmVzIHRoYXQgbmVlZCB2YXJpYWJsZXMKLSAgIHRvIGJlIGluc2VydGVkIGluIGJpdGZpZWxkcyBvdGhlciB0aGFuIDEsIDIgYW5kIDQgYnl0ZXMuCi0gICBGdXJ0aGVybW9yZSBpdCBnaXZlcyB1cyBhIHBvc3NpYmlsbGl0eSB0byBtYXNrIGluIGJpdHMgaW4gdGhlIHN5bWJvbAotICAgd2hlbiBpdCdzIGZpeGVkIGluIHRoZSBvYmplY3Rjb2RlIGFuZCBjaGVjayB0aGUgc3ltYm9scyBsaW1pdHMuCi0KLSAgIFRoZSBvci1tYXNrIGlzIHVzZWQgdG8gc2V0IHRoZSBodWZmbWFuIGJpdHMgaW4gZGlzcGxhY2VtZW50cyBmb3IgdGhlCi0gICBuczMyayBwb3J0LgotICAgVGhlIGFjYmksIGFkZHFpLCBtb3ZxaSwgY21wcWkgaW5zdHJ1Y3Rpb24gcmVxdWlyZXMgYW4gYXNzZW1ibGVyIHRoYXQKLSAgIGNhbiBoYW5kbGUgYml0ZmllbGRzLiBJZSBoYW5kbGUgYW4gZXhwcmVzc2lvbiwgZXZhbHVhdGUgaXQgYW5kIGluc2VydAotICAgdGhlIHJlc3VsdCBpbiBhbiBzb21lIGJpdGZpZWxkLiAoIGV4OiA1IGJpdHMgaW4gYSBzaG9ydCBmaWVsZCBvZiBhIG9wY29kZSkKLSAgICovCi0KLSNpZm5kZWYgX19iaXRfZml4X2hfXwotI2RlZmluZSBfX2JpdF9maXhfaF9fCi0KLXN0cnVjdCBiaXRfZml4Ci0gIHsKLSAgICBpbnQgZnhfYml0X3NpemU7CQkvKiBMZW5ndGggb2YgYml0ZmllbGQgKi8KLSAgICBpbnQgZnhfYml0X29mZnNldDsJCS8qIEJpdCBvZmZzZXQgdG8gYml0ZmllbGQgKi8KLSAgICBsb25nIGZ4X2JpdF9iYXNlOwkJLyogV2hlcmUgZG8gd2UgYXBwbHkgdGhlIGJpdGZpeC4KLQkJCQkgICAgICBJZiB0aGlzIGlzIHplcm8sIGRlZmF1bHQgaXMgYXNzdW1lZC4gKi8KLSAgICBsb25nIGZ4X2JpdF9iYXNlX2FkajsJLyogQWRqdXN0bWVudCBvZiBiYXNlICovCi0gICAgbG9uZyBmeF9iaXRfbWF4OwkJLyogU2lnbmV4dGVuZGVkIG1heCBmb3IgYml0ZmllbGQgKi8KLSAgICBsb25nIGZ4X2JpdF9taW47CQkvKiBTaWduZXh0ZW5kZWQgbWluIGZvciBiaXRmaWVsZCAqLwotICAgIGxvbmcgZnhfYml0X2FkZDsJCS8qIE9yIG1hc2ssIHVzZWQgZm9yIGh1ZmZtYW4gcHJlZml4ICovCi0gIH07Ci10eXBlZGVmIHN0cnVjdCBiaXRfZml4IGJpdF9maXhTOwotCi0jZW5kaWYgLyogX19iaXRfZml4X2hfXyAqLwotCi0vKiBlbmQgb2YgYml0X2ZpeC5oICovCmRpZmYgLS1naXQgYS9nYXMvY2dlbi5jIGIvZ2FzL2NnZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyMzMwZS4uMDAwMDAwMAotLS0gYS9nYXMvY2dlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYzICswLDAgQEAKLS8qIEdBUyBpbnRlcmZhY2UgZm9yIHRhcmdldHMgdXNpbmcgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvci4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgImNnZW4tZGVzYy5oIgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgImNnZW4uaCIKLQotLyogT3Bjb2RlIHRhYmxlIGRlc2NyaXB0b3IsIG11c3QgYmUgc2V0IGJ5IG1kX2JlZ2luLiAgKi8KLQotQ0dFTl9DUFVfREVTQyBnYXNfY2dlbl9jcHVfZGVzYzsKLQotLyogQ2FsbGJhY2sgdG8gaW5zZXJ0IGEgcmVnaXN0ZXIgaW50byB0aGUgc3ltYm9sIHRhYmxlLgotICAgQSB0YXJnZXQgbWF5IGNob29zZSB0byBsZXQgR0FTIHBhcnNlIHRoZSByZWdpc3RlcnMuCi0gICA/Pz8gTm90IGN1cnJlbnRseSB1c2VkLiAgKi8KLQotdm9pZAotY2dlbl9hc21fcmVjb3JkX3JlZ2lzdGVyIChuYW1lLCBudW1iZXIpCi0gICAgIGNoYXIgKiBuYW1lOwotICAgICBpbnQgbnVtYmVyOwotewotICAvKiBVc2Ugc3ltYm9sX2NyZWF0ZSBoZXJlIGluc3RlYWQgb2Ygc3ltYm9sX25ldyBzbyB3ZSBkb24ndCB0cnkgdG8KLSAgICAgb3V0cHV0IHJlZ2lzdGVycyBpbnRvIHRoZSBvYmplY3QgZmlsZSdzIHN5bWJvbCB0YWJsZS4gICovCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9jcmVhdGUgKG5hbWUsIHJlZ19zZWN0aW9uLAotCQkJCSAgICAgIG51bWJlciwgJiB6ZXJvX2FkZHJlc3NfZnJhZykpOwotfQotCi0vKiBXZSBuZWVkIHRvIGtlZXAgYSBsaXN0IG9mIGZpeHVwcy4gIFdlIGNhbid0IHNpbXBseSBnZW5lcmF0ZSB0aGVtIGFzCi0gICB3ZSBnbywgYmVjYXVzZSB0aGF0IHdvdWxkIHJlcXVpcmUgdXMgdG8gZmlyc3QgY3JlYXRlIHRoZSBmcmFnLCBhbmQKLSAgIHRoYXQgd291bGQgc2NyZXcgdXAgcmVmZXJlbmNlcyB0byBgYC4nJy4KLQotICAgVGhpcyBpcyB1c2VkIGJ5IGNwdSdzIHdpdGggc2ltcGxlIG9wZXJhbmRzLiAgSXQga2VlcHMga25vd2xlZGdlIG9mIHdoYXQKLSAgIGFuIGBleHByZXNzaW9uUycgaXMgYW5kIHdoYXQgYSBgZml4dXAnIGlzIG91dCBvZiBDR0VOIHdoaWNoIGZvciB0aGUgdGltZQotICAgYmVpbmcgaXMgcHJlZmVyYWJsZS4KLQotICAgT1BJTkRFWCBpcyB0aGUgaW5kZXggaW4gdGhlIG9wZXJhbmQgdGFibGUuCi0gICBPUElORk8gaXMgc29tZXRoaW5nIHRoZSBjYWxsZXIgY2hvb3NlcyB0byBoZWxwIGluIHJlbG9jIGRldGVybWluYXRpb24uICAqLwotCi1zdHJ1Y3QgZml4dXAKLXsKLSAgaW50IG9waW5kZXg7Ci0gIGludCBvcGluZm87Ci0gIGV4cHJlc3Npb25TIGV4cDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZml4dXAgZml4dXBzIFtHQVNfQ0dFTl9NQVhfRklYVVBTXTsKLXN0YXRpYyBpbnQgbnVtX2ZpeHVwczsKLQotLyogUHJlcGFyZSB0byBwYXJzZSBhbiBpbnN0cnVjdGlvbi4KLSAgID8/PyBNYXkgd2lzaCB0byBtYWtlIHRoaXMgc3RhdGljIGFuZCBkZWxldGUgY2FsbHMgaW4gbWRfYXNzZW1ibGUuICAqLwotCi12b2lkCi1nYXNfY2dlbl9pbml0X3BhcnNlICgpCi17Ci0gIG51bV9maXh1cHMgPSAwOwotfQotCi0vKiBRdWV1ZSBhIGZpeHVwLiAgKi8KLQotc3RhdGljIHZvaWQKLXF1ZXVlX2ZpeHVwIChvcGluZGV4LCBvcGluZm8sIGV4cFApCi0gICAgIGludCAgICAgICAgICAgb3BpbmRleDsKLSAgICAgZXhwcmVzc2lvblMgKiBleHBQOwotewotICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIHRoaXMgZXhwcmVzc2lvbi4gICovCi0gIGlmIChudW1fZml4dXBzID49IEdBU19DR0VOX01BWF9GSVhVUFMpCi0gICAgYXNfZmF0YWwgKF8oInRvbyBtYW55IGZpeHVwcyIpKTsKLSAgZml4dXBzW251bV9maXh1cHNdLmV4cCAgICAgPSAqIGV4cFA7Ci0gIGZpeHVwc1tudW1fZml4dXBzXS5vcGluZGV4ID0gb3BpbmRleDsKLSAgZml4dXBzW251bV9maXh1cHNdLm9waW5mbyAgPSBvcGluZm87Ci0gICsrIG51bV9maXh1cHM7Ci19Ci0KLS8qIFRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGFsbG93IGEgYmFja3VwIG9mIHRoZSBmaXh1cCBjaGFpbiB0byBiZSBtYWRlLAotICAgYW5kIHRvIGhhdmUgdGhpcyBiYWNrdXAgYmUgc3dhcHBlZCB3aXRoIHRoZSBjdXJyZW50IGNoYWluLiAgVGhpcyBhbGxvd3MKLSAgIGNlcnRhaW4gcG9ydHMsIGVnIHRoZSBtMzJyLCB0byBzd2FwIHR3byBpbnN0cnVjdGlvbnMgYW5kIHN3YXAgdGhlaXIgZml4dXBzCi0gICBhdCB0aGUgc2FtZSB0aW1lLiAgKi8KLS8qID8/PyBJIHRoaW5rIHdpdGggY2dlbl9hc21fZmluaXNoX2luc24gKG9yIHNvbWV0aGluZyBlbHNlKSB0aGVyZSBpcyBubwotICAgbW9yZSBuZWVkIGZvciB0aGlzLiAgKi8KLQotc3RhdGljIHN0cnVjdCBmaXh1cCBzYXZlZF9maXh1cHMgW0dBU19DR0VOX01BWF9GSVhVUFNdOwotc3RhdGljIGludCBzYXZlZF9udW1fZml4dXBzOwotCi12b2lkCi1nYXNfY2dlbl9zYXZlX2ZpeHVwcyAoKQotewotICBzYXZlZF9udW1fZml4dXBzID0gbnVtX2ZpeHVwczsKLSAgCi0gIG1lbWNweSAoc2F2ZWRfZml4dXBzLCBmaXh1cHMsIHNpemVvZiAoZml4dXBzWzBdKSAqIG51bV9maXh1cHMpOwotCi0gIG51bV9maXh1cHMgPSAwOwotfQotCi12b2lkCi1nYXNfY2dlbl9yZXN0b3JlX2ZpeHVwcyAoKQotewotICBudW1fZml4dXBzID0gc2F2ZWRfbnVtX2ZpeHVwczsKLSAgCi0gIG1lbWNweSAoZml4dXBzLCBzYXZlZF9maXh1cHMsIHNpemVvZiAoZml4dXBzWzBdKSAqIG51bV9maXh1cHMpOwotCi0gIHNhdmVkX251bV9maXh1cHMgPSAwOwotfQotCi12b2lkCi1nYXNfY2dlbl9zd2FwX2ZpeHVwcyAoKQotewotICBpbnQgdG1wOwotICBzdHJ1Y3QgZml4dXAgdG1wX2ZpeHVwOwotCi0gIGlmIChudW1fZml4dXBzID09IDApCi0gICAgewotICAgICAgZ2FzX2NnZW5fcmVzdG9yZV9maXh1cHMgKCk7Ci0gICAgfQotICBlbHNlIGlmIChzYXZlZF9udW1fZml4dXBzID09IDApCi0gICAgewotICAgICAgZ2FzX2NnZW5fc2F2ZV9maXh1cHMgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdG1wID0gc2F2ZWRfbnVtX2ZpeHVwczsKLSAgICAgIHNhdmVkX251bV9maXh1cHMgPSBudW1fZml4dXBzOwotICAgICAgbnVtX2ZpeHVwcyA9IHRtcDsKLSAgICAgIAotICAgICAgZm9yICh0bXAgPSBHQVNfQ0dFTl9NQVhfRklYVVBTOyB0bXAtLTspCi0JewotCSAgdG1wX2ZpeHVwICAgICAgICAgID0gc2F2ZWRfZml4dXBzIFt0bXBdOwotCSAgc2F2ZWRfZml4dXBzIFt0bXBdID0gZml4dXBzIFt0bXBdOwotCSAgZml4dXBzIFt0bXBdICAgICAgID0gdG1wX2ZpeHVwOwotCX0KLSAgICB9Ci19Ci0KLS8qIERlZmF1bHQgcm91dGluZSB0byByZWNvcmQgYSBmaXh1cC4KLSAgIFRoaXMgaXMgYSBjb3ZlciBmdW5jdGlvbiB0byBmaXhfbmV3LgotICAgSXQgZXhpc3RzIGJlY2F1c2Ugd2UgcmVjb3JkIElOU04gd2l0aCB0aGUgZml4dXAuCi0KLSAgIEZSQUcgYW5kIFdIRVJFIGFyZSB0aGVpciByZXNwZWN0aXZlIGFyZ3VtZW50cyB0byBmaXhfbmV3X2V4cC4KLSAgIExFTkdUSCBpcyBpbiBiaXRzLgotICAgT1BJTkZPIGlzIHNvbWV0aGluZyB0aGUgY2FsbGVyIGNob29zZXMgdG8gaGVscCBpbiByZWxvYyBkZXRlcm1pbmF0aW9uLgotCi0gICBBdCB0aGlzIHBvaW50IHdlIGRvIG5vdCB1c2UgYSBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgZm9yCi0gICBvcGVyYW5kcyByZXNpZGluZyBpbiB0aGUgaW5zbiwgYnV0IGluc3RlYWQganVzdCB1c2UgdGhlCi0gICBvcGVyYW5kIGluZGV4LiAgVGhpcyBsZXRzIHVzIGVhc2lseSBoYW5kbGUgZml4dXBzIGZvciBhbnkKLSAgIG9wZXJhbmQgdHlwZS4gIFdlIHBpY2sgYSBCRkQgcmVsb2MgdHlwZSBpbiBtZF9hcHBseV9maXguICAqLwotCi1maXhTICoKLWdhc19jZ2VuX3JlY29yZF9maXh1cCAoZnJhZywgd2hlcmUsIGluc24sIGxlbmd0aCwgb3BlcmFuZCwgb3BpbmZvLCBzeW1ib2wsIG9mZnNldCkKLSAgICAgZnJhZ1MgKiAgICAgICAgICAgICAgZnJhZzsKLSAgICAgaW50ICAgICAgICAgICAgICAgICAgd2hlcmU7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqICAgIGluc247Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLSAgICAgY29uc3QgQ0dFTl9PUEVSQU5EICogb3BlcmFuZDsKLSAgICAgaW50ICAgICAgICAgICAgICAgICAgb3BpbmZvOwotICAgICBzeW1ib2xTICogICAgICAgICAgICBzeW1ib2w7Ci0gICAgIG9mZnNldFQgICAgICAgICAgICAgIG9mZnNldDsKLXsKLSAgZml4UyAqIGZpeFA7Ci0KLSAgLyogSXQgbWF5IHNlZW0gc3RyYW5nZSB0byB1c2Ugb3BlcmFuZC0+YXR0cnMgYW5kIG5vdCBpbnNuLT5hdHRycyBoZXJlLAotICAgICBidXQgaXQgaXMgdGhlIG9wZXJhbmQgdGhhdCBoYXMgYSBwYyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLQotICBmaXhQID0gZml4X25ldyAoZnJhZywgd2hlcmUsIGxlbmd0aCAvIDgsIHN5bWJvbCwgb2Zmc2V0LAotCQkgIENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFIChvcGVyYW5kLCBDR0VOX09QRVJBTkRfUENSRUxfQUREUiksCi0JCSAgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkKLQkJICAgICgoaW50KSBCRkRfUkVMT0NfVU5VU0VECi0JCSAgICAgKyAoaW50KSBvcGVyYW5kLT50eXBlKSk7Ci0gIGZpeFAtPmZ4X2NnZW4uaW5zbiA9IGluc247Ci0gIGZpeFAtPmZ4X2NnZW4ub3BpbmZvID0gb3BpbmZvOwotCi0gIHJldHVybiBmaXhQOwotfQotCi0vKiBEZWZhdWx0IHJvdXRpbmUgdG8gcmVjb3JkIGEgZml4dXAgZ2l2ZW4gYW4gZXhwcmVzc2lvbi4KLSAgIFRoaXMgaXMgYSBjb3ZlciBmdW5jdGlvbiB0byBmaXhfbmV3X2V4cC4KLSAgIEl0IGV4aXN0cyBiZWNhdXNlIHdlIHJlY29yZCBJTlNOIHdpdGggdGhlIGZpeHVwLgotCi0gICBGUkFHIGFuZCBXSEVSRSBhcmUgdGhlaXIgcmVzcGVjdGl2ZSBhcmd1bWVudHMgdG8gZml4X25ld19leHAuCi0gICBMRU5HVEggaXMgaW4gYml0cy4KLSAgIE9QSU5GTyBpcyBzb21ldGhpbmcgdGhlIGNhbGxlciBjaG9vc2VzIHRvIGhlbHAgaW4gcmVsb2MgZGV0ZXJtaW5hdGlvbi4KLQotICAgQXQgdGhpcyBwb2ludCB3ZSBkbyBub3QgdXNlIGEgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGZvcgotICAgb3BlcmFuZHMgcmVzaWRpbmcgaW4gdGhlIGluc24sIGJ1dCBpbnN0ZWFkIGp1c3QgdXNlIHRoZQotICAgb3BlcmFuZCBpbmRleC4gIFRoaXMgbGV0cyB1cyBlYXNpbHkgaGFuZGxlIGZpeHVwcyBmb3IgYW55Ci0gICBvcGVyYW5kIHR5cGUuICBXZSBwaWNrIGEgQkZEIHJlbG9jIHR5cGUgaW4gbWRfYXBwbHlfZml4LiAgKi8KLQotZml4UyAqCi1nYXNfY2dlbl9yZWNvcmRfZml4dXBfZXhwIChmcmFnLCB3aGVyZSwgaW5zbiwgbGVuZ3RoLCBvcGVyYW5kLCBvcGluZm8sIGV4cCkKLSAgICAgZnJhZ1MgKiAgICAgICAgICAgICAgZnJhZzsKLSAgICAgaW50ICAgICAgICAgICAgICAgICAgd2hlcmU7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqICAgIGluc247Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLSAgICAgY29uc3QgQ0dFTl9PUEVSQU5EICogb3BlcmFuZDsKLSAgICAgaW50ICAgICAgICAgICAgICAgICAgb3BpbmZvOwotICAgICBleHByZXNzaW9uUyAqICAgICAgICBleHA7Ci17Ci0gIGZpeFMgKiBmaXhQOwotCi0gIC8qIEl0IG1heSBzZWVtIHN0cmFuZ2UgdG8gdXNlIG9wZXJhbmQtPmF0dHJzIGFuZCBub3QgaW5zbi0+YXR0cnMgaGVyZSwKLSAgICAgYnV0IGl0IGlzIHRoZSBvcGVyYW5kIHRoYXQgaGFzIGEgcGMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0KLSAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgbGVuZ3RoIC8gOCwgZXhwLAotCQkgICAgICBDR0VOX09QRVJBTkRfQVRUUl9WQUxVRSAob3BlcmFuZCwgQ0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpLAotCQkgICAgICAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKQotCQkgICAgICAgICgoaW50KSBCRkRfUkVMT0NfVU5VU0VECi0JCQkgKyAoaW50KSBvcGVyYW5kLT50eXBlKSk7Ci0gIGZpeFAtPmZ4X2NnZW4uaW5zbiA9IGluc247Ci0gIGZpeFAtPmZ4X2NnZW4ub3BpbmZvID0gb3BpbmZvOwotCi0gIHJldHVybiBmaXhQOwotfQotCi0vKiBVc2VkIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIG5leHQgdHdvIHByb2NlZHVyZXMuICAqLwotc3RhdGljIGptcF9idWYgZXhwcl9qbXBfYnVmOwotCi0vKiBDYWxsYmFjayBmb3IgY2dlbiBpbnRlcmZhY2UuICBQYXJzZSB0aGUgZXhwcmVzc2lvbiBhdCAqU1RSUC4KLSAgIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGZvciBzdWNjZXNzIChpbiB3aGljaCBjYXNlCi0gICAqU1RSUCBpcyBhZHZhbmNlZCBwYXN0IHRoZSBwYXJzZWQgdGV4dCkuCi0gICBXQU5UIGlzIGFuIGluZGljYXRpb24gb2Ygd2hhdCB0aGUgY2FsbGVyIGlzIGxvb2tpbmcgZm9yLgotICAgSWYgV0FOVCA9PSBDR0VOX0FTTV9QQVJTRV9JTklUIHRoZSBjYWxsZXIgaXMgYmVnaW5uaW5nIHRvIHRyeSB0byBtYXRjaAotICAgYSB0YWJsZSBlbnRyeSB3aXRoIHRoZSBpbnNuLCByZXNldCB0aGUgcXVldWVkIGZpeHVwcyBjb3VudGVyLgotICAgQW4gZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IGlzIHN0b3JlZCBpbiBSRVNVTFRQLgotICAgT1BJTkRFWCBpcyB0aGUgb3BlcmFuZCdzIHRhYmxlIGVudHJ5IGluZGV4LgotICAgT1BJTkZPIGlzIHNvbWV0aGluZyB0aGUgY2FsbGVyIGNob29zZXMgdG8gaGVscCBpbiByZWxvYyBkZXRlcm1pbmF0aW9uLgotICAgVGhlIHJlc3VsdGluZyB2YWx1ZSBpcyBzdG9yZWQgaW4gVkFMVUVQLiAgKi8KLQotY29uc3QgY2hhciAqCi1nYXNfY2dlbl9wYXJzZV9vcGVyYW5kIChjZCwgd2FudCwgc3RyUCwgb3BpbmRleCwgb3BpbmZvLCByZXN1bHRQLCB2YWx1ZVApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3R5cGUgd2FudDsKLSAgICAgY29uc3QgY2hhciAqKiBzdHJQOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgaW50IG9waW5mbzsKLSAgICAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0ICogcmVzdWx0UDsKLSAgICAgYmZkX3ZtYSAqIHZhbHVlUDsKLXsKLSNpZmRlZiBfX1NURENfXwotICAvKiBUaGVzZSBhcmUgdm9sYXRpbGUgdG8gc3Vydml2ZSB0aGUgc2V0am1wLiAgKi8KLSAgY2hhciAqIHZvbGF0aWxlIGhvbGQ7Ci0gIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCAqIHZvbGF0aWxlIHJlc3VsdFBfMTsKLSNlbHNlCi0gIHN0YXRpYyBjaGFyICogaG9sZDsKLSAgc3RhdGljIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCAqIHJlc3VsdFBfMTsKLSNlbmRpZgotICBjb25zdCBjaGFyICogZXJybXNnID0gTlVMTDsKLSAgZXhwcmVzc2lvblMgZXhwOwotCi0gIGlmICh3YW50ID09IENHRU5fUEFSU0VfT1BFUkFORF9JTklUKQotICAgIHsKLSAgICAgIGdhc19jZ2VuX2luaXRfcGFyc2UgKCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmVzdWx0UF8xID0gcmVzdWx0UDsKLSAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gKGNoYXIgKikgKiBzdHJQOwotCi0gIC8qIFdlIHJlbHkgb24gbWRfb3BlcmFuZCB0byBsb25nam1wIGJhY2sgdG8gdXMuCi0gICAgIFRoaXMgaXMgZG9uZSB2aWEgZ2FzX2NnZW5fbWRfb3BlcmFuZC4gICovCi0gIGlmIChzZXRqbXAgKGV4cHJfam1wX2J1ZikgIT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSAoY2hhciAqKSBob2xkOwotICAgICAgKiByZXN1bHRQXzEgPSBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX0VSUk9SOwotICAgICAgcmV0dXJuICJpbGxlZ2FsIG9wZXJhbmQiOwotICAgIH0KLQotICBleHByZXNzaW9uICgmIGV4cCk7Ci0KLSAgKiBzdHJQID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCi0gIC8qIEZJWE1FOiBOZWVkIHRvIGNoZWNrIGB3YW50Jy4gICovCi0KLSAgc3dpdGNoIChleHAuWF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2lsbGVnYWwgOgotICAgICAgZXJybXNnID0gXygiaWxsZWdhbCBvcGVyYW5kIik7Ci0gICAgICAqIHJlc3VsdFAgPSBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX0VSUk9SOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2Fic2VudCA6Ci0gICAgICBlcnJtc2cgPSBfKCJtaXNzaW5nIG9wZXJhbmQiKTsKLSAgICAgICogcmVzdWx0UCA9IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfRVJST1I7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fY29uc3RhbnQgOgotICAgICAgKiB2YWx1ZVAgPSBleHAuWF9hZGRfbnVtYmVyOwotICAgICAgKiByZXN1bHRQID0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9OVU1CRVI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fcmVnaXN0ZXIgOgotICAgICAgKiB2YWx1ZVAgPSBleHAuWF9hZGRfbnVtYmVyOwotICAgICAgKiByZXN1bHRQID0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9SRUdJU1RFUjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgcXVldWVfZml4dXAgKG9waW5kZXgsIG9waW5mbywgJiBleHApOwotICAgICAgKiB2YWx1ZVAgPSAwOwotICAgICAgKiByZXN1bHRQID0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9RVUVVRUQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIGVycm1zZzsKLX0KLQotLyogbWRfb3BlcmFuZCBoYW5kbGVyIHRvIGNhdGNoIHVucmVjb2duaXplZCBleHByZXNzaW9ucyBhbmQgaGFsdCB0aGUKLSAgIHBhcnNpbmcgcHJvY2VzcyBzbyB0aGUgbmV4dCBlbnRyeSBjYW4gYmUgdHJpZWQuCi0KLSAgID8/PyBUaGlzIGNvdWxkIGJlIGRvbmUgZGlmZmVyZW50bHkgYnkgYWRkaW5nIGNvZGUgdG8gYGV4cHJlc3Npb24nLiAgKi8KLQotdm9pZAotZ2FzX2NnZW5fbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICogZXhwcmVzc2lvblA7Ci17Ci0gIGxvbmdqbXAgKGV4cHJfam1wX2J1ZiwgMSk7Ci19Ci0KLS8qIEZpbmlzaCBhc3NlbWJsaW5nIGluc3RydWN0aW9uIElOU04uCi0gICBCVUYgY29udGFpbnMgd2hhdCB3ZSd2ZSBidWlsdCB1cCBzbyBmYXIuCi0gICBMRU5HVEggaXMgdGhlIHNpemUgb2YgdGhlIGluc24gaW4gYml0cy4KLSAgIFJFTEFYX1AgaXMgbm9uLXplcm8gaWYgcmVsYXhhYmxlIGluc25zIHNob3VsZCBiZSBlbWl0dGVkIGFzIHN1Y2guCi0gICBPdGhlcndpc2UgdGhleSdyZSBlbWl0dGVkIGluIG5vbi1yZWxheGFibGUgZm9ybXMuCi0gICBUaGUgInJlc3VsdCIgaXMgc3RvcmVkIGluIFJFU1VMVCBpZiBub24tTlVMTC4gICovCi0KLXZvaWQKLWdhc19jZ2VuX2ZpbmlzaF9pbnNuIChpbnNuLCBidWYsIGxlbmd0aCwgcmVsYXhfcCwgcmVzdWx0KQotICAgICBjb25zdCBDR0VOX0lOU04gKiBpbnNuOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZjsKLSAgICAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSAgICAgaW50IHJlbGF4X3A7Ci0gICAgIGZpbmlzaGVkX2luc25TICogcmVzdWx0OwotewotICBpbnQgaTsKLSAgaW50IHJlbGF4X29wZXJhbmQ7Ci0gIGNoYXIgKiBmOwotICB1bnNpZ25lZCBpbnQgYnl0ZV9sZW4gPSBsZW5ndGggLyA4OwotCi0gIC8qID8/PyBUYXJnZXQgZm9vIGlzc3VlcyB2YXJpb3VzIHdhcm5pbmdzIGhlcmUsIHNvIG9uZSBtaWdodCB3YW50IHRvIHByb3ZpZGUKLSAgICAgYSBob29rIGhlcmUuICBIb3dldmVyLCBvdXIgY2FsbGVyIGlzIGRlZmluZWQgaW4gdGMtZm9vLmMgc28gdGhlcmUKLSAgICAgc2hvdWxkbid0IGJlIGEgbmVlZCBmb3IgYSBob29rLiAgKi8KLQotICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLgotICAgICBJdCBpcyBpbXBvcnRhbnQgdG8gZmV0Y2ggZW5vdWdoIHNwYWNlIGluIG9uZSBjYWxsIHRvIGBmcmFnX21vcmUnLgotICAgICBXZSB1c2UgKGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkgdG8gY29tcHV0ZSB3aGVyZSB3ZSBhcmUgYW5kIHdlCi0gICAgIGRvbid0IHdhbnQgZnJhZ19ub3cgdG8gY2hhbmdlIGJldHdlZW4gY2FsbHMuCi0KLSAgICAgUmVsYXhhYmxlIGluc3RydWN0aW9uczogV2UgbmVlZCB0byBlbnN1cmUgd2UgYWxsb2NhdGUgZW5vdWdoCi0gICAgIHNwYWNlIGZvciB0aGUgbGFyZ2VzdCBpbnNuLiAgKi8KLQotICBpZiAoQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9SRUxBWCkpCi0gICAgYWJvcnQgKCk7IC8qIFRoZXNlIGN1cnJlbnRseSBzaG91bGRuJ3QgZ2V0IGhlcmUuICAqLwotCi0gIC8qIElzIHRoZXJlIGEgcmVsYXhhYmxlIGluc24gd2l0aCB0aGUgcmVsYXhhYmxlIG9wZXJhbmQgbmVlZGluZyBhIGZpeHVwPyAgKi8KLQotICByZWxheF9vcGVyYW5kID0gLTE7Ci0gIGlmIChyZWxheF9wICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fUkVMQVhBQkxFKSkKLSAgICB7Ci0gICAgICAvKiBTY2FuIHRoZSBmaXh1cHMgZm9yIHRoZSBvcGVyYW5kIGFmZmVjdGVkIGJ5IHJlbGF4aW5nCi0JIChpLmUuIHRoZSBicmFuY2ggYWRkcmVzcykuICAqLwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2ZpeHVwczsgKysgaSkKLQl7Ci0JICBpZiAoQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUgKGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtIChnYXNfY2dlbl9jcHVfZGVzYywgZml4dXBzW2ldLm9waW5kZXgpLAotCQkJCSAgICAgICBDR0VOX09QRVJBTkRfUkVMQVgpKQotCSAgICB7Ci0JICAgICAgcmVsYXhfb3BlcmFuZCA9IGk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChyZWxheF9vcGVyYW5kICE9IC0xKQotICAgIHsKLSAgICAgIGludCBtYXhfbGVuOwotICAgICAgZnJhZ1MgKiBvbGRfZnJhZzsKLQotI2lmZGVmIFRDX0NHRU5fTUFYX1JFTEFYCi0gICAgICBtYXhfbGVuID0gVENfQ0dFTl9NQVhfUkVMQVggKGluc24sIGJ5dGVfbGVuKTsKLSNlbHNlCi0gICAgICBtYXhfbGVuID0gQ0dFTl9NQVhfSU5TTl9TSVpFOwotI2VuZGlmCi0gICAgICAvKiBFbnN1cmUgdmFyaWFibGUgcGFydCBhbmQgZml4ZWQgcGFydCBhcmUgaW4gc2FtZSBmcmFnbWVudC4gICovCi0gICAgICAvKiBGSVhNRTogSGF2aW5nIHRvIGRvIHRoaXMgc2VlbXMgbGlrZSBhIGhhY2suICAqLwotICAgICAgZnJhZ19ncm93IChtYXhfbGVuKTsKLQotICAgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBmaXhlZCBwYXJ0LiAgKi8KLSAgICAgIGYgPSBmcmFnX21vcmUgKGJ5dGVfbGVuKTsKLQotICAgICAgLyogQ3JlYXRlIGEgcmVsYXhhYmxlIGZyYWdtZW50IGZvciB0aGlzIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIG9sZF9mcmFnID0gZnJhZ19ub3c7Ci0KLSAgICAgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJbWF4X2xlbiAtIGJ5dGVfbGVuIC8qIG1heCBjaGFycyAqLywKLQkJMCAvKiB2YXJpYWJsZSBwYXJ0IGFscmVhZHkgYWxsb2NhdGVkICovLAotCQkvKiBGSVhNRTogV2hlbiB3ZSBtYWNoaW5lIGdlbmVyYXRlIHRoZSByZWxheCB0YWJsZSwKLQkJICAgbWFjaGluZSBnZW5lcmF0ZSBhIG1hY3JvIHRvIGNvbXB1dGUgc3VidHlwZS4gICovCi0JCTEgLyogc3VidHlwZSAqLywKLQkJZml4dXBzW3JlbGF4X29wZXJhbmRdLmV4cC5YX2FkZF9zeW1ib2wsCi0JCWZpeHVwc1tyZWxheF9vcGVyYW5kXS5leHAuWF9hZGRfbnVtYmVyLAotCQlmKTsKLQotICAgICAgLyogUmVjb3JkIHRoZSBvcGVyYW5kIG51bWJlciB3aXRoIHRoZSBmcmFnbWVudCBzbyBtZF9jb252ZXJ0X2ZyYWcKLQkgY2FuIHVzZSBnYXNfY2dlbl9tZF9yZWNvcmRfZml4dXAgdG8gcmVjb3JkIHRoZSBhcHByb3ByaWF0ZSByZWxvYy4gICovCi0gICAgICBvbGRfZnJhZy0+ZnJfY2dlbi5pbnNuICAgID0gaW5zbjsKLSAgICAgIG9sZF9mcmFnLT5mcl9jZ2VuLm9waW5kZXggPSBmaXh1cHNbcmVsYXhfb3BlcmFuZF0ub3BpbmRleDsKLSAgICAgIG9sZF9mcmFnLT5mcl9jZ2VuLm9waW5mbyAgPSBmaXh1cHNbcmVsYXhfb3BlcmFuZF0ub3BpbmZvOwotICAgICAgaWYgKHJlc3VsdCkKLQlyZXN1bHQtPmZyYWcgPSBvbGRfZnJhZzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmID0gZnJhZ19tb3JlIChieXRlX2xlbik7Ci0gICAgICBpZiAocmVzdWx0KQotCXJlc3VsdC0+ZnJhZyA9IGZyYWdfbm93OwotICAgIH0KLQotICAvKiBJZiB3ZSdyZSByZWNvcmRpbmcgaW5zbnMgYXMgbnVtYmVycyAocmF0aGVyIHRoYW4gYSBzdHJpbmcgb2YgYnl0ZXMpLAotICAgICB0YXJnZXQgYnl0ZSBvcmRlciBoYW5kbGluZyBpcyBkZWZlcnJlZCB1bnRpbCBub3cuICAqLwotI2lmIENHRU5fSU5UX0lOU05fUAotICBjZ2VuX3B1dF9pbnNuX3ZhbHVlIChnYXNfY2dlbl9jcHVfZGVzYywgZiwgbGVuZ3RoLCAqYnVmKTsKLSNlbHNlCi0gIG1lbWNweSAoZiwgYnVmLCBieXRlX2xlbik7Ci0jZW5kaWYKLQotICAvKiBDcmVhdGUgYW55IGZpeHVwcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fZml4dXBzOyArK2kpCi0gICAgewotICAgICAgZml4UyAqZml4UDsKLSAgICAgIGNvbnN0IENHRU5fT1BFUkFORCAqb3BlcmFuZCA9Ci0JY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9udW0gKGdhc19jZ2VuX2NwdV9kZXNjLCBmaXh1cHNbaV0ub3BpbmRleCk7Ci0KLSAgICAgIC8qIERvbid0IGNyZWF0ZSBmaXh1cHMgZm9yIHRoZXNlLiAgVGhhdCdzIGRvbmUgZHVyaW5nIHJlbGF4YXRpb24uCi0JIFdlIGRvbid0IG5lZWQgdG8gdGVzdCBmb3IgQ0dFTl9JTlNOX1JFTEFYIGFzIHRoZXkgY2FuJ3QgZ2V0IGhlcmUKLQkgKHNlZSBhYm92ZSkuICAqLwotICAgICAgaWYgKHJlbGF4X3AKLQkgICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fUkVMQVhBQkxFKQotCSAgJiYgQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUgKG9wZXJhbmQsIENHRU5fT1BFUkFORF9SRUxBWCkpCi0JY29udGludWU7Ci0KLSNpZm5kZWYgbWRfY2dlbl9yZWNvcmRfZml4dXBfZXhwCi0jZGVmaW5lIG1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCBnYXNfY2dlbl9yZWNvcmRfZml4dXBfZXhwCi0jZW5kaWYKLQotCWZpeFAgPSBtZF9jZ2VuX3JlY29yZF9maXh1cF9leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkJCSBpbnNuLCBsZW5ndGgsIG9wZXJhbmQsCi0JCQkJCSBmaXh1cHNbaV0ub3BpbmZvLAotCQkJCQkgJiBmaXh1cHNbaV0uZXhwKTsKLQlpZiAocmVzdWx0KQotCSAgcmVzdWx0LT5maXh1cHNbaV0gPSBmaXhQOwotICAgIH0KLQotICBpZiAocmVzdWx0KQotICAgIHsKLSAgICAgIHJlc3VsdC0+bnVtX2ZpeHVwcyA9IG51bV9maXh1cHM7Ci0gICAgICByZXN1bHQtPmFkZHIgPSBmOwotICAgIH0KLX0KLQotLyogQXBwbHkgYSBmaXh1cCB0byB0aGUgb2JqZWN0IGNvZGUuICBUaGlzIGlzIGNhbGxlZCBmb3IgYWxsIHRoZQotICAgZml4dXBzIHdlIGdlbmVyYXRlZCBieSB0aGUgY2FsbCB0byBmaXhfbmV3X2V4cCwgYWJvdmUuICBJbiB0aGUgY2FsbAotICAgYWJvdmUgd2UgdXNlZCBhIHJlbG9jIGNvZGUgd2hpY2ggd2FzIHRoZSBsYXJnZXN0IGxlZ2FsIHJlbG9jIGNvZGUKLSAgIHBsdXMgdGhlIG9wZXJhbmQgaW5kZXguICBIZXJlIHdlIHVuZG8gdGhhdCB0byByZWNvdmVyIHRoZSBvcGVyYW5kCi0gICBpbmRleC4gIEF0IHRoaXMgcG9pbnQgYWxsIHN5bWJvbCB2YWx1ZXMgc2hvdWxkIGJlIGZ1bGx5IHJlc29sdmVkLAotICAgYW5kIHdlIGF0dGVtcHQgdG8gY29tcGxldGVseSByZXNvbHZlIHRoZSByZWxvYy4gIElmIHdlIGNhbiBub3QgZG8KLSAgIHRoYXQsIHdlIGRldGVybWluZSB0aGUgY29ycmVjdCByZWxvYyBjb2RlIGFuZCBwdXQgaXQgYmFjayBpbiB0aGUgZml4dXAuICAqLwotCi0vKiBGSVhNRTogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHNvbWUgb2YgdGhlIGZpeHVwcyBhbmQgYmZkX2luc3RhbGxfcmVsb2NhdGlvbgotICAgaGFuZGxlcyB0aGUgcmVzdC4gIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gKG9yIHNvbWUgb3RoZXIgYmZkIGZ1bmN0aW9uKQotICAgc2hvdWxkIGhhbmRsZSB0aGVtIGFsbC4gICovCi0KLWludAotZ2FzX2NnZW5fbWRfYXBwbHlfZml4MyAoZml4UCwgdmFsdWVQLCBzZWcpCi0gICAgIGZpeFMgKiAgIGZpeFA7Ci0gICAgIHZhbHVlVCAqIHZhbHVlUDsKLSAgICAgc2VnVCAgICAgc2VnOwotewotICBjaGFyICogd2hlcmUgPSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0gIHZhbHVlVCB2YWx1ZTsKLSAgLyogY2Fub25pY2FsIG5hbWUsIHNpbmNlIHVzZWQgYSBsb3QgKi8KLSAgQ0dFTl9DUFVfREVTQyBjZCA9IGdhc19jZ2VuX2NwdV9kZXNjOwotICAKLSAgLyogRklYTUUgRklYTUUgRklYTUU6IFRoZSB2YWx1ZSB3ZSBhcmUgcGFzc2VkIGluICp2YWx1ZXAgaW5jbHVkZXMKLSAgICAgdGhlIHN5bWJvbCB2YWx1ZXMuICBTaW5jZSB3ZSBhcmUgdXNpbmcgQkZEX0FTU0VNQkxFUiwgaWYgd2UgYXJlCi0gICAgIGRvaW5nIHRoaXMgcmVsb2NhdGlvbiB0aGUgY29kZSBpbiB3cml0ZS5jIGlzIGdvaW5nIHRvIGNhbGwKLSAgICAgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiwgd2hpY2ggaXMgYWxzbyBnb2luZyB0byB1c2UgdGhlIHN5bWJvbAotICAgICB2YWx1ZS4gIFRoYXQgbWVhbnMgdGhhdCBpZiB0aGUgcmVsb2MgaXMgZnVsbHkgcmVzb2x2ZWQgd2Ugd2FudCB0bwotICAgICB1c2UgKnZhbHVlcCBzaW5jZSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIGlzIG5vdCBiZWluZyB1c2VkLgotICAgICBIb3dldmVyLCBpZiB0aGUgcmVsb2MgaXMgbm90IGZ1bGx5IHJlc29sdmVkIHdlIGRvIG5vdCB3YW50IHRvIHVzZQotICAgICAqdmFsdWVwLCBhbmQgbXVzdCB1c2UgZnhfb2Zmc2V0IGluc3RlYWQuICBIb3dldmVyLCBpZiB0aGUgcmVsb2MKLSAgICAgaXMgUEMgcmVsYXRpdmUsIHdlIGRvIHdhbnQgdG8gdXNlICp2YWx1ZXAgc2luY2UgaXQgaW5jbHVkZXMgdGhlCi0gICAgIHJlc3VsdCBvZiBtZF9wY3JlbF9mcm9tLiAgVGhpcyBpcyBjb25mdXNpbmcuICAqLwotCi0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHZhbHVlID0gKiB2YWx1ZVA7Ci0gICAgICBmaXhQLT5meF9kb25lID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeFAtPmZ4X3BjcmVsKQotICAgIHZhbHVlID0gKiB2YWx1ZVA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGZpeFAtPmZ4X29mZnNldDsKLSAgICAgIGlmIChmaXhQLT5meF9zdWJzeSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCXsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9zdWJzeSkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X3N1YnN5KTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdlIGRvbid0IGFjdHVhbGx5IHN1cHBvcnQgc3VidHJhY3RpbmcgYSBzeW1ib2wuICAqLwotIAkgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICAgXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKChpbnQpIGZpeFAtPmZ4X3JfdHlwZSA+PSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIGludCBvcGluZGV4ID0gKGludCkgZml4UC0+Znhfcl90eXBlIC0gKGludCkgQkZEX1JFTE9DX1VOVVNFRDsKLSAgICAgIGNvbnN0IENHRU5fT1BFUkFORCAqb3BlcmFuZCA9IGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtIChjZCwgb3BpbmRleCk7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0gICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2NfdHlwZTsKLSAgICAgIENHRU5fRklFTERTICpmaWVsZHMgPSBhbGxvY2EgKENHRU5fQ1BVX1NJWkVPRl9GSUVMRFMgKGNkKSk7Ci0gICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSBmaXhQLT5meF9jZ2VuLmluc247Ci0KLSAgICAgIC8qIElmIHRoZSByZWxvYyBoYXMgYmVlbiBmdWxseSByZXNvbHZlZCBmaW5pc2ggdGhlIG9wZXJhbmQgaGVyZS4gICovCi0gICAgICAvKiBGSVhNRTogVGhpcyBkdXBsaWNhdGVzIHRoZSBjYXBhYmlsaXRpZXMgb2YgY29kZSBpbiBCRkQuICAqLwotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUKLQkgIC8qIEZJWE1FOiBJZiBwYXJ0aWFsX2lucGxhY2UgaXNuJ3Qgc2V0IGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gd29uJ3QKLQkgICAgIGZpbmlzaCB0aGUgam9iLiAgVGVzdGluZyBmb3IgcGNyZWwgaXMgYSB0ZW1wb3JhcnkgaGFjay4gICovCi0JICB8fCBmaXhQLT5meF9wY3JlbCkKLQl7Ci0JICBDR0VOX0NQVV9TRVRfRklFTERTX0JJVFNJWkUgKGNkKSAoZmllbGRzLCBDR0VOX0lOU05fQklUU0laRSAoaW5zbikpOwotCSAgQ0dFTl9DUFVfU0VUX1ZNQV9PUEVSQU5EIChjZCkgKGNkLCBvcGluZGV4LCBmaWVsZHMsIChiZmRfdm1hKSB2YWx1ZSk7Ci0KLSNpZiBDR0VOX0lOVF9JTlNOX1AKLQkgIHsKLQkgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlID0KLQkgICAgICBjZ2VuX2dldF9pbnNuX3ZhbHVlIChjZCwgd2hlcmUsIENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKSk7Ci0KLQkgICAgLyogPz8/IDAgaXMgcGFzc2VkIGZvciBgcGMnICovCi0JICAgIGVycm1zZyA9IENHRU5fQ1BVX0lOU0VSVF9PUEVSQU5EIChjZCkgKGNkLCBvcGluZGV4LCBmaWVsZHMsCi0JCQkJCQkgICAmaW5zbl92YWx1ZSwgKGJmZF92bWEpIDApOwotCSAgICBjZ2VuX3B1dF9pbnNuX3ZhbHVlIChjZCwgd2hlcmUsIENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKSwKLQkJCQkgaW5zbl92YWx1ZSk7Ci0JICB9Ci0jZWxzZQotCSAgICAvKiA/Pz8gMCBpcyBwYXNzZWQgZm9yIGBwYycgKi8KLQkgICAgZXJybXNnID0gQ0dFTl9DUFVfSU5TRVJUX09QRVJBTkQgKGNkKSAoY2QsIG9waW5kZXgsIGZpZWxkcywgd2hlcmUsCi0JCQkJCQkgICAoYmZkX3ZtYSkgMCk7Ci0jZW5kaWYKLQkgIGlmIChlcnJtc2cpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgIiVzIiwgZXJybXNnKTsKLQl9Ci0KLSAgICAgIGlmIChmaXhQLT5meF9kb25lKQotCXJldHVybiAxOwotCi0gICAgICAvKiBUaGUgb3BlcmFuZCBpc24ndCBmdWxseSByZXNvbHZlZC4gIERldGVybWluZSBhIEJGRCByZWxvYyB2YWx1ZQotCSBiYXNlZCBvbiB0aGUgb3BlcmFuZCBpbmZvcm1hdGlvbiBhbmQgbGVhdmUgaXQgdG8KLQkgYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4gIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3Qgd29yayB3aGVuCi0JIHBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZS4gICovCi0KLSAgICAgIHJlbG9jX3R5cGUgPSBtZF9jZ2VuX2xvb2t1cF9yZWxvYyAoaW5zbiwgb3BlcmFuZCwgZml4UCk7Ci0gICAgICBpZiAocmVsb2NfdHlwZSAhPSBCRkRfUkVMT0NfTk9ORSkKLQl7Ci0JICBmaXhQLT5meF9yX3R5cGUgPSByZWxvY190eXBlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJ1bnJlc29sdmVkIGV4cHJlc3Npb24gdGhhdCBtdXN0IGJlIHJlc29sdmVkIikpOwotCSAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChmaXhQLT5meF9kb25lKQotICAgIHsKLSAgICAgIC8qIFdlJ3JlIGZpbmlzaGVkIHdpdGggdGhpcyBmaXh1cC4gIEluc3RhbGwgaXQgYmVjYXVzZQotCSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHdvbid0IGJlIGNhbGxlZCB0byBkbyBpdC4gICovCi0gICAgICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLQl7Ci0JY2FzZSBCRkRfUkVMT0NfODoKLQkgIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsIHZhbHVlLCAxKTsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzE2OgotCSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwgdmFsdWUsIDIpOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfMzI6Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLCB2YWx1ZSwgNCk7Ci0JICBicmVhazsKLQkvKiBGSVhNRTogbGF0ZXIgYWRkIHN1cHBvcnQgZm9yIDY0IGJpdHMuICAqLwotCWRlZmF1bHQ6Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgaW5zdGFsbCBmaXggZm9yIHJlbG9jIHR5cGUgJWQgKGAlcycpIiksCi0JCQlmaXhQLT5meF9yX3R5cGUsIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXhQLT5meF9yX3R5cGUpKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHdpbGwgYmUgY2FsbGVkIHRvIGZpbmlzaCB0aGluZ3MgdXAuICAqLwotICAgIH0KLQotICAvKiBUdWNrIGB2YWx1ZScgYXdheSBmb3IgdXNlIGJ5IHRjX2dlbl9yZWxvYy4KLSAgICAgU2VlIHRoZSBjb21tZW50IGRlc2NyaWJpbmcgZnhfYWRkbnVtYmVyIGluIHdyaXRlLmguCi0gICAgIFRoaXMgZmllbGQgaXMgbWlzbmFtZWQgKG9yIG1pc3VzZWQgOi0pLiAgKi8KLSAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsdWU7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldCBmb3JtYXQuCi0KLSAgIEZJWE1FOiBUbyB3aGF0IGV4dGVudCBjYW4gd2UgZ2V0IGFsbCByZWxldmFudCB0YXJnZXRzIHRvIHVzZSB0aGlzPyAgKi8KLQotYXJlbGVudCAqCi1nYXNfY2dlbl90Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeFApCi0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLSAgICAgZml4UyAqICAgICBmaXhQOwotewotICBhcmVsZW50ICogcmVsb2M7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4UC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgIF8oImludGVybmFsIGVycm9yOiBjYW4ndCBleHBvcnQgcmVsb2MgdHlwZSAlZCAoYCVzJykiKSwKLQkJICAgIGZpeFAtPmZ4X3JfdHlwZSwgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeFAtPmZ4X3JfdHlwZSkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGFzc2VydCAoIWZpeFAtPmZ4X3BjcmVsID09ICFyZWxvYy0+aG93dG8tPnBjX3JlbGF0aXZlKTsKLQotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAmIGZpeFAtPmZ4X2FkZHN5LT5ic3ltOwotCi0gIC8qIFVzZSBmeF9vZmZzZXQgZm9yIHRoZXNlIGNhc2VzICovCi0gIGlmICggICBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWQotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCkKLSAgICByZWxvYy0+YWRkZW5kICA9IGZpeFAtPmZ4X29mZnNldDsKLSAgZWxzZQotICAgIHJlbG9jLT5hZGRlbmQgID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotCi0gIHJlbG9jLT5hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlOwotICByZXR1cm4gcmVsb2M7Ci19CmRpZmYgLS1naXQgYS9nYXMvY2dlbi5oIGIvZ2FzL2NnZW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjMTczMi4uMDAwMDAwMAotLS0gYS9nYXMvY2dlbi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyogR0FTIGNnZW4gc3VwcG9ydC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBHQVNfQ0dFTl9ICi0jZGVmaW5lIEdBU19DR0VOX0gKLQotLyogT3Bjb2RlIHRhYmxlIGhhbmRsZS4gICovCi1leHRlcm4gQ0dFTl9DUFVfREVTQyBnYXNfY2dlbl9jcHVfZGVzYzsKLQotLyogTWF4aW11bSBudW1iZXIgb2YgZml4dXBzIGluIGFuIGluc24uCi0gICBJZiB5b3UgbmVlZCB0byBjaGFuZ2UgdGhpcywgYWxsb3cgdGFyZ2V0IHRvIG92ZXJyaWRlIGFuZCBkbyBzbyB0aGVyZS4gICovCi0jZGVmaW5lIEdBU19DR0VOX01BWF9GSVhVUFMgMwotCi0vKiBTdHJ1Y3QgZGVmaW5pbmcgcmVzdWx0IG9mIGdhc19jZ2VuX2ZpbmlzaF9pbnNuLiAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogZnJhZyBjb250YWluaW5nIHRoZSBpbnNuICovCi0gIGZyYWdTICogZnJhZzsKLSAgLyogQWRkcmVzcyBvZiBpbnNuIGluIGZyYWcuICAqLwotICBjaGFyICogYWRkcjsKLSAgLyogTnVtYmVyIG9mIGZpeHVwcyB0aGlzIGluc24gaGFzLiAgKi8KLSAgaW50IG51bV9maXh1cHM7Ci0gIC8qIEFycmF5IG9mIGZpeHVwcy4gICovCi0gIGZpeFMgKiBmaXh1cHNbR0FTX0NHRU5fTUFYX0ZJWFVQU107Ci19IGZpbmlzaGVkX2luc25TOwotCi0vKiBDYWxsYmFjayBmb3Igb3BlcmFuZCBwYXJzaW5nLgotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgZm9yIHN1Y2Nlc3MuCi0gICBUaGUgcGFyc2VkIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgYmZkX3ZtYSAqLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICogZ2FzX2NnZW5fcGFyc2Vfb3BlcmFuZAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF90eXBlLAotCSAgICAgIGNvbnN0IGNoYXIgKiosIGludCwgaW50LCBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiwKLQkgICAgICBiZmRfdm1hICopKTsKLQotLyogQ2FsbCB0aGlzIGZyb20gbWRfYXNzZW1ibGUgdG8gaW5pdGlhbGl6ZSB0aGUgYXNzZW1ibGVyIGNhbGxiYWNrLiAgKi8KLWV4dGVybiB2b2lkIGdhc19jZ2VuX2luaXRfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gdm9pZCBnYXNfY2dlbl9zYXZlX2ZpeHVwcyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBnYXNfY2dlbl9yZXN0b3JlX2ZpeHVwcyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBnYXNfY2dlbl9zd2FwX2ZpeHVwcyBQQVJBTVMgKCh2b2lkKSk7Ci0gICAgIAotLyogQWRkIGEgcmVnaXN0ZXIgdG8gdGhlIGFzc2VtYmxlcidzIGhhc2ggdGFibGUuCi0gICBUaGlzIG1ha2VzIGxldHMgR0FTIHBhcnNlIHJlZ2lzdGVycyBmb3IgdXMuCi0gICA/Pz8gVGhpcyBpc24ndCBjdXJyZW50bHkgdXNlZCwgYnV0IGl0IGNvdWxkIGJlIGluIHRoZSBmdXR1cmUuICAqLwotZXh0ZXJuIHZvaWQgY2dlbl9hc21fcmVjb3JkX3JlZ2lzdGVyIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0KLS8qIEFmdGVyIENHRU5fU1lNIChhc3NlbWJsZV9pbnNuKSBpcyBkb25lLCB0aGlzIGlzIGNhbGxlZCB0bwotICAgb3V0cHV0IHRoZSBpbnNuIGFuZCByZWNvcmQgYW55IGZpeHVwcy4gICovCi1leHRlcm4gdm9pZCBnYXNfY2dlbl9maW5pc2hfaW5zbiBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKiwKLQkJCQkJICBDR0VOX0lOU05fQllURVNfUFRSLCB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgaW50LCBmaW5pc2hlZF9pbnNuUyAqKSk7Ci0KLS8qIFJlY29yZCBhIGZpeHVwLiAgKi8KLWV4dGVybiBmaXhTICogZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwIFBBUkFNUyAoKGZyYWdTICosIGludCwgY29uc3QgQ0dFTl9JTlNOICosCi0JCQkJCSAgICAgaW50LCBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAotCQkJCQkgICAgIHN5bWJvbFMgKiwgb2Zmc2V0VCkpOwotZXh0ZXJuIGZpeFMgKiBnYXNfY2dlbl9yZWNvcmRfZml4dXBfZXhwIFBBUkFNUyAoKGZyYWdTICosIGludCwgY29uc3QgQ0dFTl9JTlNOICosCi0JCQkJCQkgaW50LCBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAotCQkJCQkJIGV4cHJlc3Npb25TICopKTsKLQotLyogbWRfYXBwbHlfZml4MyBoYW5kbGVyICovCi1leHRlcm4gaW50IGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMgUEFSQU1TICgoZml4UyAqLCB2YWx1ZVQgKiwgc2VnVCkpOwotCi0vKiB0Y19nZW5fcmVsb2MgaGFuZGxlciAqLwotZXh0ZXJuIGFyZWxlbnQgKmdhc19jZ2VuX3RjX2dlbl9yZWxvYyBQQVJBTVMgKChhc2VjdGlvbiAqLCBmaXhTICopKTsKLQotLyogVGFyZ2V0IHN1cHBsaWVkIHJvdXRpbmUgdG8gbG9va3VwIGEgcmVsb2MuICAqLwotZXh0ZXJuIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotbWRfY2dlbl9sb29rdXBfcmVsb2MgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICosIGNvbnN0IENHRU5fT1BFUkFORCAqLAotCQkJICAgICAgZml4UyAqKSk7Ci0KLS8qIE9wdGlvbmFsIHRhcmdldCBzdXBwbGllZCByb3V0aW5lIHRvIHJlY29yZCBhIGZpeHVwIGZvciBhbiBleHByZXNzaW9uLiAgKi8KLWV4dGVybiBmaXhTICoKLW1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCBQQVJBTVMgKChmcmFnUyAqLCBpbnQsIGNvbnN0IENHRU5fSU5TTiAqLCBpbnQsCi0JCQkJICBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAotCQkJCSAgZXhwcmVzc2lvblMgKikpOwotCi0jZW5kaWYgLyogR0FTX0NHRU5fSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmQuYyBiL2dhcy9jb25kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTJhOGUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2MSArMCwwIEBACi0vKiBjb25kLmMgLSBjb25kaXRpb25hbCBhc3NlbWJseSBwc2V1ZG8tb3BzLCBhbmQgLmluY2x1ZGUKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm1hY3JvLmgiCi0KLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLS8qIFRoaXMgaXMgYWxsb2NhdGVkIHRvIGdyb3cgYW5kIHNocmluayBhcyAuaWZkZWYvLmVuZGlmIHBhaXJzIGFyZSBzY2FubmVkLiAqLwotc3RydWN0IG9ic3RhY2sgY29uZF9vYnN0YWNrOwotCi1zdHJ1Y3QgZmlsZV9saW5lCi17Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotfTsKLQotLyogV2UgcHVzaCBvbmUgb2YgdGhlc2Ugc3RydWN0dXJlcyBmb3IgZWFjaCAuaWYsIGFuZCBwb3AgaXQgYXQgdGhlCi0gICAuZW5kaWYuICAqLwotCi1zdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUKLXsKLSAgLyogVGhlIHNvdXJjZSBmaWxlICYgbGluZSBudW1iZXIgb2YgdGhlICJpZiIuICAqLwotICBzdHJ1Y3QgZmlsZV9saW5lIGlmX2ZpbGVfbGluZTsKLSAgLyogVGhlIHNvdXJjZSBmaWxlICYgbGluZSBvZiB0aGUgImVsc2UiLiAgKi8KLSAgc3RydWN0IGZpbGVfbGluZSBlbHNlX2ZpbGVfbGluZTsKLSAgLyogVGhlIHByZXZpb3VzIGNvbmRpdGlvbmFsLiAgKi8KLSAgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICpwcmV2aW91c19jZnJhbWU7Ci0gIC8qIEhhdmUgd2Ugc2VlbiBhbiBlbHNlIHlldD8gICovCi0gIGludCBlbHNlX3NlZW47Ci0gIC8qIFdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBpZ25vcmluZyBpbnB1dC4gICovCi0gIGludCBpZ25vcmluZzsKLSAgLyogV2hldGhlciBhIGNvbmRpdGlvbmFsIGF0IGEgaGlnaGVyIGxldmVsIGlzIGlnbm9yaW5nIGlucHV0LiAgKi8KLSAgaW50IGRlYWRfdHJlZTsKLSAgLyogTWFjcm8gbmVzdGluZyBsZXZlbCBhdCB3aGljaCB0aGlzIGNvbmRpdGlvbmFsIHdhcyBjcmVhdGVkLiAgKi8KLSAgaW50IG1hY3JvX25lc3Q7Ci19OwotCi1zdGF0aWMgdm9pZCBpbml0aWFsaXplX2NmcmFtZSBQQVJBTVMgKChzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKmNmcmFtZSkpOwotc3RhdGljIGNoYXIgKmdldF9tcmlfc3RyaW5nIFBBUkFNUyAoKGludCwgaW50ICopKTsKLQotc3RhdGljIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqY3VycmVudF9jZnJhbWUgPSBOVUxMOwotCi12b2lkIAotc19pZmRlZiAoYXJnKQotICAgICBpbnQgYXJnOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwkJLyogcG9pbnRzIHRvIG5hbWUgb2Ygc3ltYm9sICovCi0gIHJlZ2lzdGVyIHN0cnVjdCBzeW1ib2wgKnN5bWJvbFA7CS8qIFBvaW50cyB0byBzeW1ib2wgKi8KLSAgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lIGNmcmFtZTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7CQkvKiBMZWFkaW5nIHdoaXRlc3BhY2UgaXMgcGFydCBvZiBvcGVyYW5kLiAqLwotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmICghaXNfbmFtZV9iZWdpbm5lciAoKm5hbWUpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBpZGVudGlmaWVyIGZvciBcIi5pZmRlZlwiIikpOwotICAgICAgb2JzdGFja18xZ3JvdyAoJmNvbmRfb2JzdGFjaywgMCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYzsKLQotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gICAgICBpbml0aWFsaXplX2NmcmFtZSAoJmNmcmFtZSk7Ci0gICAgICBjZnJhbWUuaWdub3JpbmcgPSBjZnJhbWUuZGVhZF90cmVlIHx8ICEoKHN5bWJvbFAgIT0gMCkgXiBhcmcpOwotICAgICAgY3VycmVudF9jZnJhbWUgPSAoKHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqKQotCQkJb2JzdGFja19jb3B5ICgmY29uZF9vYnN0YWNrLCAmY2ZyYW1lLAotCQkJCSAgICAgIHNpemVvZiAoY2ZyYW1lKSkpOwotCi0gICAgICBpZiAoTElTVElOR19TS0lQX0NPTkQgKCkKLQkgICYmIGNmcmFtZS5pZ25vcmluZwotCSAgJiYgKGNmcmFtZS5wcmV2aW91c19jZnJhbWUgPT0gTlVMTAotCSAgICAgIHx8ICEgY2ZyYW1lLnByZXZpb3VzX2NmcmFtZS0+aWdub3JpbmcpKQotCWxpc3RpbmdfbGlzdCAoMik7Ci0KLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQkJCQkvKiBpZiBhIHZhbGlkIGlkZW50aWZ5ZXIgbmFtZSAqLwotfQkJCQkvKiBzX2lmZGVmKCkgKi8KLQotdm9pZCAKLXNfaWYgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgZXhwcmVzc2lvblMgb3BlcmFuZDsKLSAgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lIGNmcmFtZTsKLSAgaW50IHQ7Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwkJLyogTGVhZGluZyB3aGl0ZXNwYWNlIGlzIHBhcnQgb2Ygb3BlcmFuZC4gKi8KLQotICBpZiAoY3VycmVudF9jZnJhbWUgIT0gTlVMTCAmJiBjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcpCi0gICAgewotICAgICAgb3BlcmFuZC5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV4cHJlc3Npb24gKCZvcGVyYW5kKTsKLSAgICAgIGlmIChvcGVyYW5kLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIm5vbi1jb25zdGFudCBleHByZXNzaW9uIGluIFwiLmlmXCIgc3RhdGVtZW50IikpOwotICAgIH0KLQotICBzd2l0Y2ggKChvcGVyYXRvclQpIGFyZykKLSAgICB7Ci0gICAgY2FzZSBPX2VxOiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgPT0gMDsgYnJlYWs7Ci0gICAgY2FzZSBPX25lOiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgIT0gMDsgYnJlYWs7Ci0gICAgY2FzZSBPX2x0OiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgPCAwOyBicmVhazsKLSAgICBjYXNlIE9fbGU6IHQgPSBvcGVyYW5kLlhfYWRkX251bWJlciA8PSAwOyBicmVhazsKLSAgICBjYXNlIE9fZ2U6IHQgPSBvcGVyYW5kLlhfYWRkX251bWJlciA+PSAwOyBicmVhazsKLSAgICBjYXNlIE9fZ3Q6IHQgPSBvcGVyYW5kLlhfYWRkX251bWJlciA+IDA7IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIGFib3ZlIGVycm9yIGlzIHNpZ25hbGVkLCB0aGlzIHdpbGwgZGlzcGF0Y2gKLSAgICAgdXNpbmcgYW4gdW5kZWZpbmVkIHJlc3VsdC4gIE5vIGJpZyBkZWFsLiAgKi8KLSAgaW5pdGlhbGl6ZV9jZnJhbWUgKCZjZnJhbWUpOwotICBjZnJhbWUuaWdub3JpbmcgPSBjZnJhbWUuZGVhZF90cmVlIHx8ICEgdDsKLSAgY3VycmVudF9jZnJhbWUgPSAoKHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqKQotCQkgICAgb2JzdGFja19jb3B5ICgmY29uZF9vYnN0YWNrLCAmY2ZyYW1lLCBzaXplb2YgKGNmcmFtZSkpKTsKLQotICBpZiAoTElTVElOR19TS0lQX0NPTkQgKCkKLSAgICAgICYmIGNmcmFtZS5pZ25vcmluZwotICAgICAgJiYgKGNmcmFtZS5wcmV2aW91c19jZnJhbWUgPT0gTlVMTAotCSAgfHwgISBjZnJhbWUucHJldmlvdXNfY2ZyYW1lLT5pZ25vcmluZykpCi0gICAgbGlzdGluZ19saXN0ICgyKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19pZigpICovCi0KLS8qIEdldCBhIHN0cmluZyBmb3IgdGhlIE1SSSBJRkMgb3IgSUZOQyBwc2V1ZG8tb3BzLiAgKi8KLQotc3RhdGljIGNoYXIgKgotZ2V0X21yaV9zdHJpbmcgKHRlcm1pbmF0b3IsIGxlbikKLSAgICAgaW50IHRlcm1pbmF0b3I7Ci0gICAgIGludCAqbGVuOwotewotICBjaGFyICpyZXQ7Ci0gIGNoYXIgKnM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBzID0gcmV0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCcnKQotICAgIHsKLSAgICAgICsrczsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCXsKLQkgICpzKysgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBpZiAoc1stMV0gPT0gJ1wnJykKLQkgICAgewotCSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcJycpCi0JCWJyZWFrOwotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICB9Ci0JfQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyICE9IHRlcm1pbmF0b3IKLQkgICAgICYmICEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHdoaWxlIChzID4gcmV0ICYmIChzWy0xXSA9PSAnICcgfHwgc1stMV0gPT0gJ1x0JykpCi0JLS1zOwotICAgIH0KLQotICAqbGVuID0gcyAtIHJldDsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhlIE1SSSBJRkMgYW5kIElGTkMgcHNldWRvLW9wcy4gICovCi0KLXZvaWQKLXNfaWZjIChhcmcpCi0gICAgIGludCBhcmc7Ci17Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotICBjaGFyICpzMSwgKnMyOwotICBpbnQgbGVuMSwgbGVuMjsKLSAgaW50IHJlczsKLSAgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lIGNmcmFtZTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIHMxID0gZ2V0X21yaV9zdHJpbmcgKCcsJywgJmxlbjEpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICBhc19iYWQgKF8oImJhZCBmb3JtYXQgZm9yIGlmYyBvciBpZm5jIikpOwotICBlbHNlCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgczIgPSBnZXRfbXJpX3N0cmluZyAoJzsnLCAmbGVuMik7Ci0KLSAgcmVzID0gbGVuMSA9PSBsZW4yICYmIHN0cm5jbXAgKHMxLCBzMiwgbGVuMSkgPT0gMDsKLQotICBpbml0aWFsaXplX2NmcmFtZSAoJmNmcmFtZSk7Ci0gIGNmcmFtZS5pZ25vcmluZyA9IGNmcmFtZS5kZWFkX3RyZWUgfHwgISAocmVzIF4gYXJnKTsKLSAgY3VycmVudF9jZnJhbWUgPSAoKHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqKQotCQkgICAgb2JzdGFja19jb3B5ICgmY29uZF9vYnN0YWNrLCAmY2ZyYW1lLCBzaXplb2YgKGNmcmFtZSkpKTsKLQotICBpZiAoTElTVElOR19TS0lQX0NPTkQgKCkKLSAgICAgICYmIGNmcmFtZS5pZ25vcmluZwotICAgICAgJiYgKGNmcmFtZS5wcmV2aW91c19jZnJhbWUgPT0gTlVMTAotCSAgfHwgISBjZnJhbWUucHJldmlvdXNfY2ZyYW1lLT5pZ25vcmluZykpCi0gICAgbGlzdGluZ19saXN0ICgyKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZCAKLXNfZW5kaWYgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICpob2xkOwotCi0gIGlmIChjdXJyZW50X2NmcmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiXCIuZW5kaWZcIiB3aXRob3V0IFwiLmlmXCIiKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKExJU1RJTkdfU0tJUF9DT05EICgpCi0JICAmJiBjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcKLQkgICYmIChjdXJyZW50X2NmcmFtZS0+cHJldmlvdXNfY2ZyYW1lID09IE5VTEwKLQkgICAgICB8fCAhIGN1cnJlbnRfY2ZyYW1lLT5wcmV2aW91c19jZnJhbWUtPmlnbm9yaW5nKSkKLQlsaXN0aW5nX2xpc3QgKDEpOwotCi0gICAgICBob2xkID0gY3VycmVudF9jZnJhbWU7Ci0gICAgICBjdXJyZW50X2NmcmFtZSA9IGN1cnJlbnRfY2ZyYW1lLT5wcmV2aW91c19jZnJhbWU7Ci0gICAgICBvYnN0YWNrX2ZyZWUgKCZjb25kX29ic3RhY2ssIGhvbGQpOwotICAgIH0JCQkJLyogaWYgb25lIHBvcCB0b28gbWFueSAqLwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfZW5kaWYoKSAqLwotCi12b2lkIAotc19lbHNlIChhcmcpCi0gICAgIGludCBhcmc7Ci17Ci0gIGlmIChjdXJyZW50X2NmcmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLmVsc2Ugd2l0aG91dCBtYXRjaGluZyAuaWYgLSBpZ25vcmVkIikpOwotCi0gICAgfQotICBlbHNlIGlmIChjdXJyZW50X2NmcmFtZS0+ZWxzZV9zZWVuKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZHVwbGljYXRlIFwiZWxzZVwiIC0gaWdub3JlZCIpKTsKLSAgICAgIGFzX2JhZF93aGVyZSAoY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmZpbGUsCi0JCSAgICBjdXJyZW50X2NmcmFtZS0+ZWxzZV9maWxlX2xpbmUubGluZSwKLQkJICAgIF8oImhlcmUgaXMgdGhlIHByZXZpb3VzIFwiZWxzZVwiIikpOwotICAgICAgYXNfYmFkX3doZXJlIChjdXJyZW50X2NmcmFtZS0+aWZfZmlsZV9saW5lLmZpbGUsCi0JCSAgICBjdXJyZW50X2NmcmFtZS0+aWZfZmlsZV9saW5lLmxpbmUsCi0JCSAgICBfKCJoZXJlIGlzIHRoZSBwcmV2aW91cyBcImlmXCIiKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfd2hlcmUgKCZjdXJyZW50X2NmcmFtZS0+ZWxzZV9maWxlX2xpbmUuZmlsZSwKLQkJJmN1cnJlbnRfY2ZyYW1lLT5lbHNlX2ZpbGVfbGluZS5saW5lKTsKLQotICAgICAgaWYgKCFjdXJyZW50X2NmcmFtZS0+ZGVhZF90cmVlKQotCXsKLQkgIGN1cnJlbnRfY2ZyYW1lLT5pZ25vcmluZyA9ICFjdXJyZW50X2NmcmFtZS0+aWdub3Jpbmc7Ci0JICBpZiAoTElTVElOR19TS0lQX0NPTkQgKCkpCi0JICAgIHsKLQkgICAgICBpZiAoISBjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcpCi0JCWxpc3RpbmdfbGlzdCAoMSk7Ci0JICAgICAgZWxzZQotCQlsaXN0aW5nX2xpc3QgKDIpOwotCSAgICB9Ci0JfQkJCS8qIGlmIG5vdCBhIGRlYWQgdHJlZSAqLwotCi0gICAgICBjdXJyZW50X2NmcmFtZS0+ZWxzZV9zZWVuID0gMTsKLSAgICB9CQkJCS8qIGlmIGVycm9yIGVsc2UgZG8gaXQgKi8KLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzX2Vsc2UoKSAqLwotCi12b2lkIAotc19pZmVxcyAoYXJnKQotICAgICBpbnQgYXJnOwotewotICBjaGFyICpzMSwgKnMyOwotICBpbnQgbGVuMSwgbGVuMjsKLSAgaW50IHJlczsKLSAgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lIGNmcmFtZTsKLQotICBzMSA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuMSk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCIuaWZlcXMgc3ludGF4IGVycm9yIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgczIgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbjIpOwotCi0gIHJlcyA9IGxlbjEgPT0gbGVuMiAmJiBzdHJuY21wIChzMSwgczIsIGxlbjEpID09IDA7Ci0KLSAgaW5pdGlhbGl6ZV9jZnJhbWUgKCZjZnJhbWUpOwotICBjZnJhbWUuaWdub3JpbmcgPSBjZnJhbWUuZGVhZF90cmVlIHx8ICEgKHJlcyBeIGFyZyk7Ci0gIGN1cnJlbnRfY2ZyYW1lID0gKChzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKikKLQkJICAgIG9ic3RhY2tfY29weSAoJmNvbmRfb2JzdGFjaywgJmNmcmFtZSwgc2l6ZW9mIChjZnJhbWUpKSk7Ci0KLSAgaWYgKExJU1RJTkdfU0tJUF9DT05EICgpCi0gICAgICAmJiBjZnJhbWUuaWdub3JpbmcKLSAgICAgICYmIChjZnJhbWUucHJldmlvdXNfY2ZyYW1lID09IE5VTEwKLQkgIHx8ICEgY2ZyYW1lLnByZXZpb3VzX2NmcmFtZS0+aWdub3JpbmcpKQotICAgIGxpc3RpbmdfbGlzdCAoMik7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19pZmVxcygpICovCi0KLWludCAKLWlnbm9yZV9pbnB1dCAoKQotewotICBjaGFyICpzOwotCi0gIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgaWYgKGZsYWdfbTY4a19tcmkKLSNpZmRlZiBOT19QU0VVRE9fRE9UCi0gICAgICB8fCAxCi0jZW5kaWYKLSAgICAgICkKLSAgICB7Ci0gICAgICBpZiAoc1stMV0gIT0gJy4nKQotCS0tczsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc1stMV0gIT0gJy4nKQotCXJldHVybiAoY3VycmVudF9jZnJhbWUgIT0gTlVMTCkgJiYgKGN1cnJlbnRfY2ZyYW1lLT5pZ25vcmluZyk7Ci0gICAgfQotCi0gIC8qIFdlIGNhbm5vdCBpZ25vcmUgY2VydGFpbiBwc2V1ZG8gb3BzLiAgKi8KLSAgaWYgKCgoc1swXSA9PSAnaScKLQl8fCBzWzBdID09ICdJJykKLSAgICAgICAmJiAoIXN0cm5jYXNlY21wIChzLCAiaWYiLCAyKQotCSAgIHx8ICFzdHJuY2FzZWNtcCAocywgImlmZGVmIiwgNSkKLQkgICB8fCAhc3RybmNhc2VjbXAgKHMsICJpZm5kZWYiLCA2KSkpCi0gICAgICB8fCAoKHNbMF0gPT0gJ2UnCi0JICAgfHwgc1swXSA9PSAnRScpCi0JICAmJiAoIXN0cm5jYXNlY21wIChzLCAiZWxzZSIsIDQpCi0JICAgICAgfHwgIXN0cm5jYXNlY21wIChzLCAiZW5kaWYiLCA1KQotCSAgICAgIHx8ICFzdHJuY2FzZWNtcCAocywgImVuZGMiLCA0KSkpKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAoY3VycmVudF9jZnJhbWUgIT0gTlVMTCkgJiYgKGN1cnJlbnRfY2ZyYW1lLT5pZ25vcmluZyk7Ci19CQkJCS8qIGlnbm9yZV9pbnB1dCgpICovCi0KLXN0YXRpYyB2b2lkIAotaW5pdGlhbGl6ZV9jZnJhbWUgKGNmcmFtZSkKLSAgICAgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICpjZnJhbWU7Ci17Ci0gIG1lbXNldCAoY2ZyYW1lLCAwLCBzaXplb2YgKCpjZnJhbWUpKTsKLSAgYXNfd2hlcmUgKCZjZnJhbWUtPmlmX2ZpbGVfbGluZS5maWxlLAotCSAgICAmY2ZyYW1lLT5pZl9maWxlX2xpbmUubGluZSk7Ci0gIGNmcmFtZS0+cHJldmlvdXNfY2ZyYW1lID0gY3VycmVudF9jZnJhbWU7Ci0gIGNmcmFtZS0+ZGVhZF90cmVlID0gY3VycmVudF9jZnJhbWUgIT0gTlVMTCAmJiBjdXJyZW50X2NmcmFtZS0+aWdub3Jpbmc7Ci0gIGNmcmFtZS0+bWFjcm9fbmVzdCA9IG1hY3JvX25lc3Q7Ci19Ci0KLS8qIEdpdmUgYW4gZXJyb3IgaWYgYSBjb25kaXRpb25hbCBpcyB1bnRlcm1pbmF0ZWQgaW5zaWRlIGEgbWFjcm8gb3IKLSAgIHRoZSBhc3NlbWJseSBhcyBhIHdob2xlLiAgSWYgTkVTVCBpcyBub24gbmVnYXRpdmUsIHdlIGFyZSBiZWluZwotICAgY2FsbGVkIGJlY2F1c2Ugb2YgdGhlIGVuZCBvZiBhIG1hY3JvIGV4cGFuc2lvbi4gIElmIE5FU1QgaXMKLSAgIG5lZ2F0aXZlLCB3ZSBhcmUgYmVpbmcgY2FsbGVkIGF0IHRoZSBvZiB0aGUgaW5wdXQgZmlsZXMuICAqLwotCi12b2lkCi1jb25kX2ZpbmlzaF9jaGVjayAobmVzdCkKLSAgICAgaW50IG5lc3Q7Ci17Ci0gIGlmIChjdXJyZW50X2NmcmFtZSAhPSBOVUxMICYmIGN1cnJlbnRfY2ZyYW1lLT5tYWNyb19uZXN0ID49IG5lc3QpCi0gICAgewotICAgICAgaWYgKG5lc3QgPj0gMCkKLQlhc19iYWQgKF8oImVuZCBvZiBtYWNybyBpbnNpZGUgY29uZGl0aW9uYWwiKSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJlbmQgb2YgZmlsZSBpbnNpZGUgY29uZGl0aW9uYWwiKSk7Ci0gICAgICBhc19iYWRfd2hlcmUgKGN1cnJlbnRfY2ZyYW1lLT5pZl9maWxlX2xpbmUuZmlsZSwKLQkJICAgIGN1cnJlbnRfY2ZyYW1lLT5pZl9maWxlX2xpbmUubGluZSwKLQkJICAgIF8oImhlcmUgaXMgdGhlIHN0YXJ0IG9mIHRoZSB1bnRlcm1pbmF0ZWQgY29uZGl0aW9uYWwiKSk7Ci0gICAgICBpZiAoY3VycmVudF9jZnJhbWUtPmVsc2Vfc2VlbikKLQlhc19iYWRfd2hlcmUgKGN1cnJlbnRfY2ZyYW1lLT5lbHNlX2ZpbGVfbGluZS5maWxlLAotCQkgICAgICBjdXJyZW50X2NmcmFtZS0+ZWxzZV9maWxlX2xpbmUubGluZSwKLQkJICAgICAgXygiaGVyZSBpcyB0aGUgXCJlbHNlXCIgb2YgdGhlIHVudGVybWluYXRlZCBjb25kaXRpb25hbCIpKTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgZXhpdCBvdXQgb2YgYSBtYWNyby4gIFdlIGFzc3VtZQotICAgdGhhdCBhbnkgY29uZGl0aW9uYWxzIHdoaWNoIGJlZ2FuIHdpdGhpbiB0aGUgbWFjcm8gYXJlIGNvcnJlY3RseQotICAgbmVzdGVkLCBhbmQganVzdCBwb3AgdGhlbSBvZmYgdGhlIHN0YWNrLiAgKi8KLQotdm9pZAotY29uZF9leGl0X21hY3JvIChuZXN0KQotICAgICBpbnQgbmVzdDsKLXsKLSAgd2hpbGUgKGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwgJiYgY3VycmVudF9jZnJhbWUtPm1hY3JvX25lc3QgPj0gbmVzdCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKmhvbGQ7Ci0KLSAgICAgIGhvbGQgPSBjdXJyZW50X2NmcmFtZTsKLSAgICAgIGN1cnJlbnRfY2ZyYW1lID0gY3VycmVudF9jZnJhbWUtPnByZXZpb3VzX2NmcmFtZTsKLSAgICAgIG9ic3RhY2tfZnJlZSAoJmNvbmRfb2JzdGFjaywgaG9sZCk7Ci0gICAgfQotfQotCi0vKiBlbmQgb2YgY29uZC5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnLWdhcy5jb20gYi9nYXMvY29uZmlnLWdhcy5jb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNTI0OGEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy1nYXMuY29tCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLSQhY29uZmlnLWdhcy5jb20KLSQhIFRoaXMgZmlsZSBzZXRzIHRoaW5ncyB1cCB0byBidWlsZCBnYXMgb24gYSBWTVMgc3lzdGVtIHRvIGdlbmVyYXRlIG9iamVjdAotJCEgZmlsZXMgZm9yIGEgVk1TIHN5c3RlbS4gIFdlIGRvIG5vdCB1c2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIHNpbmNlIHdlCi0kISBkbyBub3QgaGF2ZSAvYmluL3NoIHRvIGV4ZWN1dGUgaXQuCi0kIQotJCEKLSQgZ2FzX2hvc3Q9InZtcyIKLSQgYXJjaF9pbmR4ID0gMSArICgoZiRnZXRzeWkoIkNQVSIpLmdlLjEyOCkuYW5kLjEpCSEgdmF4PT0xLCBhbHBoYT09MgotJCBhcmNoID0gZiRlbGVtZW50KGFyY2hfaW5keCwifCIsInxWQVh8QWxwaGF8IikKLSQgaWYgYXJjaC5lcXMuIlZBWCIKLSQgdGhlbgotJCAgY3B1X3R5cGU9InZheCIKLSQgIG9ial9mb3JtYXQ9InZtcyIKLSQgIGF0b2Y9InZheCIKLSQgZWxzZQotJCAgY3B1X3R5cGU9ImFscGhhIgotJCAgb2JqX2Zvcm1hdD0iZXZheCIKLSQgIGF0b2Y9ImllZWUiCi0kIGVuZGlmCi0kIGVtdWxhdGlvbj0iZ2VuZXJpYyIKLSQhCi0kCURFTEVURQk9ICJkZWxldGUvbm9Db25maXJtIgotJAlFQ0hPCT0gIndyaXRlIHN5cyRvdXRwdXQiCi0kIQotJCEgVGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uCi0kIGNhbGwgbWFrZSAidGFyZy1jcHUuaCIgIlsuY29uZmlnXXRjLScnY3B1X3R5cGUnLmgiCi0kIGNhbGwgbWFrZSAidGFyZy1lbnYuaCIgIlsuY29uZmlnXXRlLScnZW11bGF0aW9uJy5oIgotJCEKLSQhIENvZGUgdG8gaGFuZGxlIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuCi0kIGNhbGwgbWFrZSAib2JqLWZvcm1hdC5oIiAiWy5jb25maWddb2JqLScnb2JqX2Zvcm1hdCcuaCIKLSQhCi0kISAobm90IGN1cnJlbnRseSB1c2VkIGZvciB2YXggb3IgYWxwaGEpCi0kIGNhbGwgbWFrZSAiaXRibC1jcHUuaCIgIlsuY29uZmlnXWl0YmwtJydjcHVfdHlwZScuaCIKLSQhCi0kIQotJCEgQ3JlYXRlIHRoZSBmaWxlIHZlcnNpb24ub3B0LCB3aGljaCBoZWxwcyBpZGVudGlmeSB0aGUgZXhlY3V0YWJsZS4KLSQhCi0kaWYgZiR0cm5sbm0oIklGSUxFJCIpLm5lcy4iIiB0aGVuICBjbG9zZS9ub0xvZyBpZmlsZSQKLSRzZWFyY2ggQ09ORklHVVJFLklOICJBTV9JTklUX0FVVE9NQUtFIi9FeGFjdC9PdXRwdXQ9Y29uZmlnLWdhcy10bXAudG1wCi0kb3BlbiBpZmlsZSQgY29uZmlnLWdhcy10bXAudG1wCi0kcmVhZCBpZmlsZSQgbGluZQotJGNsb3NlIGlmaWxlJAotJERFTEVURSBjb25maWctZ2FzLXRtcC50bXA7KgotJCEgRGlzY2FyZCAiQU1fSU5JVF9BVVRPTUFLRShnYXMsICIgYW5kICIpIiBwYXJ0cy4KLSRpams9ZiRsb2NhdGUoIiwiLGxpbmUpKzIKLSRsaW5lPWYkZXh0cmFjdChpamssZiRsZW5ndGgobGluZSktaWprLGxpbmUpCi0kaWprPWYkbG9jYXRlKCIpIixsaW5lKQotJGxpbmU9ZiRleHRyYWN0KDAsaWprLGxpbmUpCi0kIQotJCBpZiBmJHNlYXJjaCgidmVyc2lvbi5vcHQiKS5uZXMuIiIgdGhlbiBERUxFVEUgdmVyc2lvbi5vcHQ7KgotJGNvcHkgX05MOiB2ZXJzaW9uLm9wdAotJG9wZW4vQXBwZW5kIGlmaWxlJCB2ZXJzaW9uLm9wdAotJHdyaXRlIGlmaWxlJCAiaWRlbnRpZmljYXRpb249IisiIiIiK2xpbmUrIiIiIgotJGNsb3NlIGlmaWxlJAotJCEKLSQhIE5vdyB3cml0ZSBjb25maWcuaC4KLSQhCi0kIGlmIGYkc2VhcmNoKCJjb25maWcuaCIpLm5lcy4iIiB0aGVuIERFTEVURSBjb25maWcuaDsqCi0kY29weSBfTkw6IGNvbmZpZy5oCi0kb3Blbi9BcHBlbmQgaWZpbGUkIGNvbmZpZy5oCi0kd3JpdGUgaWZpbGUkICIvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWctZ2FzLmNvbS4gKi8KLSR3cml0ZSBpZmlsZSQgIiNpZm5kZWYgVkVSU0lPTiIKLSR3cml0ZSBpZmlsZSQgIiNkZWZpbmUgVkVSU0lPTiAgICAgICIiIixsaW5lLCIiIiIKLSR3cml0ZSBpZmlsZSQgIiNlbmRpZiIKLSR3cml0ZSBpZmlsZSQgIi8qLS0qLyIKLSRpZiBhcmNoIC5lcXMuICJWQVgiCi0kdGhlbgotJGFwcGVuZCBbLmNvbmZpZ112bXMtY29uZi5oIGlmaWxlJDoKLSRlbHNlCi0kIGFwcGVuZCBbLmNvbmZpZ112bXMtYS1jb25mLmggaWZpbGUkOgotJGVuZGlmCi0kY2xvc2UgaWZpbGUkCi0kRUNITyAiQ3JlYXRlZCBjb25maWcuaC4iCi0kIQotJCEgQ2hlY2sgZm9yLCBhbmQgcG9zc2libHkgbWFrZSwgaGVhZGVyIGZpbGUgPHVuaXN0ZC5oPi4KLSQhCi0kIGlmIGYkc2VhcmNoKCJ0bXAtY2hrLWguKiIpLm5lcy4iIiB0aGVuICBERUxFVEUgdG1wLWNoay1oLio7KgotJCFjYW4ndCB1c2Ugc2ltcGxlIGAjaW5jbHVkZSBIRFInIHdpdGggYGdjYyAvRGVmaW5lPSJIRFI9PGZvby5oPiInCi0kIWJlY2F1c2UgdGhlIDIuNi5bMC0zXSBwcmVwcm9jZXNzb3IgaGFuZGxlcyBpdCB3cm9uZyAoVk1TLXNwZWNpZmljIGdjYyBidWcpCi0kIGNyZWF0ZSB0bXAtY2hrLWguYwotaW50IHRtcF9jaGtfaDsJLyogZ3VhcmFudGVlIG5vbi1lbXB0eSBvdXRwdXQgKi8KLSNpZmRlZiBIQVZFX1NURElPX0gKLSNpbmNsdWRlIDxzdGRpby5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklYSU9fSAotI2luY2x1ZGUgPHVuaXhpby5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklYTElCX0gKLSNpbmNsdWRlIDx1bml4bGliLmg+Ci0jZW5kaWYKLSQgb24gd2FybmluZyB0aGVuICBjb250aW51ZQotJCBDSEVDSyA9ICJjYWxsIHRtcF9jaGtfaCIKLSQgQ0hFQ0sgIkhBVkVfU1RESU9fSCIKLSQgaWYgLm5vdC4kc3RhdHVzCi0kIHRoZW4JdHlwZSBzeXMkaW5wdXQ6Ci0KLT8gY291bGQgbm90IGNvbXBpbGUgPHN0ZGlvLmg+LgotCi0gIElmIHlvdSdyZSBjb21waWxpbmcgd2l0aCBERUMgQyBvciBWQVggQywgY3JlYXRlIGNvbmZpZy5zdGF0dXMgYXMgYW4KLSAgZW1wdHkgZmlsZSBhbmQgc3RhcnQgZ251IG1ha2UgYWdhaW4uCi0KLSAgSWYgeW91J3JlIGNvbXBpbGluZyB3aXRoIEdOVSBDLCB0aGVyZSBpcyBzb21lIHNldHVwIHByb2JsZW0gYW5kCi0gIGdhcyBjb25maWd1cmF0aW9uIGNhbm5vdCBwcm9jZWVkLgotCi0kCURFTEVURSB0bXAtY2hrLWguYzsqCi0kCWV4aXQgJXgwMDJDCi0kIGVuZGlmCi0kIQotJCBDSEVDSyAiSEFWRV9VTklTVERfSCIKLSQgaWYgLm5vdC4kc3RhdHVzCi0kIHRoZW4KLSQgIGlmIGYkdHJubG5tKCJIRklMRSQiKS5uZXMuIiIgdGhlbiAgY2xvc2Uvbm9Mb2cgaGZpbGUkCi0kICBDSEVDSyAiSEFWRV9VTklYSU9fSCIKLSQgIGdvdF91bml4aW8gPSAoJHN0YXR1cyAuYW5kLiAxKQotJCAgQ0hFQ0sgIkhBVkVfVU5JWExJQl9IIgotJCAgZ290X3VuaXhsaWIgPSAoJHN0YXR1cyAuYW5kLiAxKQotJCAgY3JlYXRlIFtddW5pc3RkLmgJIXdpdGggcnVkaW1lbnRhcnkgY29udGVudHMKLS8qIDx1bmlzdGQuaD4gc3Vic3RpdHV0ZSBmb3IgYnVpbGRpbmcgZ2FzICovCi0jaWZuZGVmIFVOSVNURF9ICi0jZGVmaW5lIFVOSVNURF9ICi0KLSQgIG9wZW4vQXBwZW5kIGhmaWxlJCBbXXVuaXN0ZC5oCi0kICBpZiBnb3RfdW5peGlvCi0kICB0aGVuICB3cml0ZSBoZmlsZSQgIiNpbmNsdWRlIDx1bml4aW8uaD4iCi0kICBlbHNlICBhcHBlbmQgc3lzJGlucHV0OiBoZmlsZSQ6Ci0vKiBzb21lIG9mIHRoZSByb3V0aW5lcyBub3JtYWxseSBwcm90b3R5cGVkIGluIDx1bml4aW8uaD4gKi8KLWV4dGVybiBpbnQgY3JlYXQoKSwgb3BlbigpLCBjbG9zZSgpLCByZWFkKCksIHdyaXRlKCk7Ci1leHRlcm4gaW50IGFjY2VzcygpLCBkdXAoKSwgZHVwMigpLCBmc3RhdCgpLCBzdGF0KCk7Ci1leHRlcm4gbG9uZyBsc2VlaygpOwotJCAgZW5kaWYKLSQgIHdyaXRlIGhmaWxlJCAiIgotJCAgaWYgZ290X3VuaXhsaWIKLSQgIHRoZW4gIHdyaXRlIGhmaWxlJCAiI2luY2x1ZGUgPHVuaXhsaWIuaD4iCi0kICBlbHNlICBhcHBlbmQgc3lzJGlucHV0OiBoZmlsZSQ6Ci0vKiBzb21lIG9mIHRoZSByb3V0aW5lcyBub3JtYWxseSBwcm90b3R5cGVkIGluIDx1bml4bGliLmg+ICovCi1leHRlcm4gY2hhciAqc2JyaygpLCAqZ2V0Y3dkKCksICpjdXNlcmlkKCk7Ci1leHRlcm4gaW50IGJyaygpLCBjaGRpcigpLCBjaG1vZCgpLCBjaG93bigpLCBta2RpcigpOwotZXh0ZXJuIHVuc2lnbmVkIGdldHVpZCgpLCB1bWFzaygpOwotJCAgZW5kaWYKLSQgIGFwcGVuZCBzeXMkaW5wdXQ6IGhmaWxlJDoKLQotI2VuZGlmIC8qVU5JU1REX0gqLwotJCAgY2xvc2UgaGZpbGUkCi0kICBFQ0hPICJDcmVhdGVkICIiW111bmlzdGQuaCIiLiIKLSQgZW5kaWYgIWdjYyAnI2luY2x1ZGUgPHVuaXN0ZC5oPicgZmFpbGVkCi0kIERFTEVURSB0bXAtY2hrLWguYzsqCi0kCi0kdG1wX2Noa19oOiBzdWJyb3V0aW5lCi0kICBzZXQgbm9PbgotJCAgaG5hbWUgPSBmJGVkaXQoIjwiICsgKHAxIC0gIkhBVkVfIiAtICJfSCIpICsgIi5oPiIsIkxPV0VSQ0FTRSIpCi0kICB3cml0ZSBzeXMkb3V0cHV0ICJDaGVja2luZyBmb3IgJydobmFtZScuIgotJCAgaWYgZiRzZWFyY2goInRtcC1jaGstaC5vYmoiKS5uZXMuIiIgdGhlbiAgREVMRVRFIHRtcC1jaGstaC5vYmo7KgotJCAgZGVmaW5lL25vTG9nIHN5cyRlcnJvciBfTkw6CSFjYW4ndCB1c2UgL1VzZXJfTW9kZSBoZXJlIGR1ZSB0byBnY2MKLSQgIGRlZmluZS9ub0xvZyBzeXMkb3V0cHV0IF9OTDoJISBkcml2ZXIncyB1c2Ugb2YgbXVsdGlwbGUgaW1hZ2UgYWN0aXZhdGlvbgotJCAgZ2NjIC9JbmNsdWRlPShbXSxbLS5pbmNsdWRlXSkgL0RlZmluZT0oIicncDEnIikgdG1wLWNoay1oLmMKLSQhY2FuJ3QganVzdCBjaGVjayAkc3RhdHVzOyBnY2MgMi42LlswLTNdIHByZXByb2Nlc3NvciBkb2Vzbid0IHNldCBpdCBjb3JyZWN0bHkKLSQgIG9rID0gKCgkc3RhdHVzLmFuZC4xKS5hbmQuKGYkc2VhcmNoKCJ0bXAtY2hrLWgub2JqIikubmVzLiIiKSkgLm9yLiAleDEwMDAwMDAwCi0kICBkZWFzc2lnbiBzeXMkZXJyb3IJIXJlc3RvcmUsIG1vcmUgb3IgbGVzcwotJCAgZGVhc3NpZ24gc3lzJG91dHB1dAotJCAgaWYgb2sgdGhlbiAgREVMRVRFIHRtcC1jaGstaC5vYmo7KgotJCAgZXhpdCBvawotJCBlbmRzdWJyb3V0aW5lICF0bXBfY2hrX2gKLSQKLSQhCi0kISBEb25lCi0kIQotJCBpZiBmJHNlYXJjaCgiY29uZmlnLnN0YXR1cyIpIC5uZXMuICIiIHRoZW4gREVMRVRFIGNvbmZpZy5zdGF0dXM7KgotJCBvcGVuL3dyaXRlIGNmaWxlIFtdY29uZmlnLnN0YXR1cwotJCB3cml0ZSBjZmlsZSAiTGlua3MgYXJlIG5vdyBzZXQgdXAgZm9yIHVzZSB3aXRoIGEgIithcmNoKyIgcnVubmluZyBWTVMuIgotJCBjbG9zZSBjZmlsZQotJCB0eXBlIFtdY29uZmlnLnN0YXR1cwotJGV4aXQKLSQhCi0kIQotJG1ha2U6IHN1YnJvdXRpbmUKLSQgIGlmIGYkc2VhcmNoKHAxKS5uZXMuIiIgdGhlbiBERUxFVEUgJ3AxJzsqCi0kICBjcmVhdGUgJ3AxJwotJCAgaWYgZiR0cm5sbm0oIklGSUxFJCIpLm5lcy4iIiB0aGVuICBjbG9zZS9ub0xvZyBpZmlsZSQKLSQgIG9wZW4vQXBwZW5kIGlmaWxlJCAncDEnCi0kICB3cml0ZSBpZmlsZSQgIiNpbmNsdWRlICIiJydmJHN0cmluZyhwMiAtICJbLmNvbmZpZ10iKSciIiIKLSQgIGNsb3NlIGlmaWxlJAotJCAgRUNITyAiQ3JlYXRlZCAnJ3AxJyBmb3IgJydwMicuIgotJGVuZHN1YnJvdXRpbmUgIW1ha2UKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcuaW4gYi9nYXMvY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWYyYWRhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgbGV4IGRlY2xhcmVzIHl5dGV4dCBhcyBhIGNoYXIgKiBieSBkZWZhdWx0LCBub3QgYSBjaGFyW10uICAqLwotI3VuZGVmIFlZVEVYVF9QT0lOVEVSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NVU5NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcmVtb3ZlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1JFTU9WRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNicmsgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0JSSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB1bmxpbmsgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVU5MSU5LCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGVycm5vLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0VSUk5PX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01FTU9SWV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkYXJnLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUREFSR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhcmFyZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFSQVJHU19ICi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogRGVmaW5lIGlmIGRlZmF1bHRpbmcgdG8gRUxGIG9uIFNDTyA1LiAqLwotI3VuZGVmIFNDT19FTEYKLQotLyogVXNlIEVMRiBzdGFicyBmb3IgTUlQUywgbm90IEVDT0ZGIHN0YWJzICovCi0jdW5kZWYgTUlQU19TVEFCU19FTEYKLQotLyogRGVmaW5lIGlmIGRlZmF1bHQgdGFyZ2V0IGlzIFBvd2VyUEMgU29sYXJpcy4gKi8KLSN1bmRlZiBUQVJHRVRfU09MQVJJU19DT01NRU5UCi0KLS8qIERlZmluZSBhcyAxIGlmIGJpZyBlbmRpYW4uICovCi0jdW5kZWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLQotLyogRGVmYXVsdCBhcmNoaXRlY3R1cmUuICovCi0jdW5kZWYgREVGQVVMVF9BUkNICi0KLS8qIFVzaW5nIGNnZW4gY29kZT8gKi8KLSN1bmRlZiBVU0lOR19DR0VOCi0KLS8qIFVzaW5nIGkzODYgQ09GRj8gKi8KLSN1bmRlZiBJMzg2Q09GRgotCi0vKiBVc2luZyBtNjhrIENPRkY/ICovCi0jdW5kZWYgTTY4S0NPRkYKLQotLyogVXNpbmcgbTg4ayBDT0ZGPyAqLwotI3VuZGVmIE04OEtDT0ZGCi0KLS8qIGEub3V0IHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX0FPVVQKLQotLyogYi5vdXQgc3VwcG9ydD8gKi8KLSN1bmRlZiBPQkpfTUFZQkVfQk9VVAotCi0vKiBDT0ZGIHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX0NPRkYKLQotLyogRUNPRkYgc3VwcG9ydD8gKi8KLSN1bmRlZiBPQkpfTUFZQkVfRUNPRkYKLQotLyogRUxGIHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX0VMRgotCi0vKiBnZW5lcmljIHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX0dFTkVSSUMKLQotLyogSFAzMDAgc3VwcG9ydD8gKi8KLSN1bmRlZiBPQkpfTUFZQkVfSFAzMDAKLQotLyogSUVFRSBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9JRUVFCi0KLS8qIFNPTSBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9TT00KLQotLyogVk1TIHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX1ZNUwotCi0vKiBVc2UgZW11bGF0aW9uIHN1cHBvcnQ/ICovCi0jdW5kZWYgVVNFX0VNVUxBVElPTlMKLQotLyogU3VwcG9ydGVkIGVtdWxhdGlvbnMuICovCi0jdW5kZWYgRU1VTEFUSU9OUwotCi0vKiBEZWZhdWx0IGVtdWxhdGlvbi4gKi8KLSN1bmRlZiBERUZBVUxUX0VNVUxBVElPTgotCi0vKiBvbGQgQ09GRiBzdXBwb3J0PyAqLwotI3VuZGVmIE1BTllfU0VHTUVOVFMKLQotLyogVXNlIEJGRCBpbnRlcmZhY2U/ICovCi0jdW5kZWYgQkZEX0FTU0VNQkxFUgotCi0vKiBUYXJnZXQgYWxpYXMuICovCi0jdW5kZWYgVEFSR0VUX0FMSUFTCi0KLS8qIENhbm9uaWNhbCB0YXJnZXQuICovCi0jdW5kZWYgVEFSR0VUX0NBTk9OSUNBTAotCi0vKiBUYXJnZXQgQ1BVLiAqLwotI3VuZGVmIFRBUkdFVF9DUFUKLQotLyogVGFyZ2V0IHZlbmRvci4gKi8KLSN1bmRlZiBUQVJHRVRfVkVORE9SCi0KLS8qIFRhcmdldCBPUy4gKi8KLSN1bmRlZiBUQVJHRVRfT1MKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIENvbXBpbGluZyBjcm9zcy1hc3NlbWJsZXI/ICovCi0jdW5kZWYgQ1JPU1NfQ09NUElMRQotCi0vKiBhc3NlcnQgYnJva2VuPyAqLwotI3VuZGVmIEJST0tFTl9BU1NFUlQKLQotLyogRGVmaW5lIGlmIHN0cnN0ciBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotCi0vKiBEZWZpbmUgaWYgbWFsbG9jIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DCi0KLS8qIERlZmluZSBpZiBmcmVlIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotCi0vKiBEZWZpbmUgaWYgc2JyayBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLQotLyogRGVmaW5lIGlmIGVudmlyb24gaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OCi0KLS8qIERlZmluZSBpZiBlcnJubyBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VSUk5PCi0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvYW91dF9nbnUuaCBiL2dhcy9jb25maWcvYW91dF9nbnUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkZjljYi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2FvdXRfZ251LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIGFvdXRfZ251LmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfX0FfT1VUX0dOVV9IX18KLSNkZWZpbmUgX19BX09VVF9HTlVfSF9fCi0KLS8qIFRoZXJlIGFyZSB0d28gbWFpbiBmbGF2b3VycyBvZiBhLm91dCwgb25lIHdoaWNoIHVzZXMgdGhlIHN0YW5kYXJkCi0gICByZWxvY2F0aW9ucywgYW5kIG9uZSB3aGljaCB1c2VzIGV4dGVuZGVkIHJlbG9jYXRpb25zLgotCi0gICBUb2RheSwgdGhlIGV4dGVuZGVkIHJlbG9jIHVzZXMgYXJlCi0gICBUQ19TUEFSQywgVENfQTI5SwotCi0gICBlYWNoIG11c3QgZGVmaW5lIHRoZSBlbnVtIHJlbG9jX3R5cGUKLQotKi8KLQotI2RlZmluZSBVU0VfRVhURU5ERURfUkVMT0MgKGRlZmluZWQoVENfU1BBUkMpIHx8IGRlZmluZWQoVENfQTI5SykpCi0KLSNpZiBkZWZpbmVkKFRDX1NQQVJDKSB8fCBkZWZpbmVkKFRDX0EyOUspCi1lbnVtIHJlbG9jX3R5cGUKLSAgewotICAgIFJFTE9DXzgsIFJFTE9DXzE2LCBSRUxPQ18zMiwvKiBzaW1wbGUgcmVsb2NhdGlvbnMgKi8KLSAgICBSRUxPQ19ESVNQOCwgUkVMT0NfRElTUDE2LCBSRUxPQ19ESVNQMzIsCS8qIHBjLXJlbCBkaXNwbGFjZW1lbnQgKi8KLSAgICBSRUxPQ19XRElTUDMwLCBSRUxPQ19XRElTUDIyLAotICAgIFJFTE9DX0hJMjIsIFJFTE9DXzIyLAotICAgIFJFTE9DXzEzLCBSRUxPQ19MTzEwLAotICAgIFJFTE9DX1NGQV9CQVNFLCBSRUxPQ19TRkFfT0ZGMTMsCi0gICAgUkVMT0NfQkFTRTEwLCBSRUxPQ19CQVNFMTMsIFJFTE9DX0JBU0UyMiwJLyogUC5JLkMuIChiYXNlLXJlbGF0aXZlKSAqLwotICAgIFJFTE9DX1BDMTAsIFJFTE9DX1BDMjIsCS8qIGZvciBzb21lIHNvcnQgb2YgcGMtcmVsIFAuSS5DLiAoPykgKi8KLSAgICBSRUxPQ19KTVBfVEJMLAkJLyogUC5JLkMuIGp1bXAgdGFibGUgKi8KLSAgICBSRUxPQ19TRUdPRkYxNiwJCS8qIHJlcHV0ZWRseSBmb3Igc2hhcmVkIGxpYnJhcmllcyBzb21laG93ICovCi0gICAgUkVMT0NfR0xPQl9EQVQsIFJFTE9DX0pNUF9TTE9ULCBSRUxPQ19SRUxBVElWRSwKLSAgICBSRUxPQ18xMCwgUkVMT0NfMTEsCi0gICAgUkVMT0NfV0RJU1AyXzE0LAotICAgIFJFTE9DX1dESVNQMTksCi0gICAgUkVMT0NfSEhJMjIsCi0gICAgUkVMT0NfSExPMTAsCi0KLSAgICAvKiAyOUsgcmVsb2NhdGlvbiB0eXBlcyAqLwotICAgIFJFTE9DX0pVTVBUQVJHLCBSRUxPQ19DT05TVCwgUkVMT0NfQ09OU1RILAotCi0gICAgUkVMT0NfV0RJU1AxNCwgUkVMT0NfV0RJU1AyMSwKLQotICAgIE5PX1JFTE9DCi0gIH07Ci0KLSNlbmRpZiAvKiBUQ19TUEFSQyBvciBUQ19BMjlLICovCi0KLQotI2RlZmluZSBfX0dOVV9FWEVDX01BQ1JPU19fCi0KLSNpZm5kZWYgX19TVFJVQ1RfRVhFQ19PVkVSUklERV9fCi0KLS8qIFRoaXMgaXMgdGhlIGxheW91dCBvbiBkaXNrIG9mIGEgVW5peCBWNywgQmVya2VsZXksIFN1bk9TLCBWYXggVWx0cml4Ci0gICAic3RydWN0IGV4ZWMiLiAgRG9uJ3QgYXNzdW1lIHRoYXQgb24gdGhpcyBtYWNoaW5lLCB0aGUgInN0cnVjdCBleGVjIgotICAgd2lsbCBsYXkgb3V0IHRoZSBzYW1lIHNpemVzIG9yIGFsaWdubWVudHMuICAqLwotCi1zdHJ1Y3QgZXhlY19ieXRlcwotICB7Ci0gICAgdW5zaWduZWQgY2hhciBhX2luZm9bNF07Ci0gICAgdW5zaWduZWQgY2hhciBhX3RleHRbNF07Ci0gICAgdW5zaWduZWQgY2hhciBhX2RhdGFbNF07Ci0gICAgdW5zaWduZWQgY2hhciBhX2Jzc1s0XTsKLSAgICB1bnNpZ25lZCBjaGFyIGFfc3ltc1s0XTsKLSAgICB1bnNpZ25lZCBjaGFyIGFfZW50cnlbNF07Ci0gICAgdW5zaWduZWQgY2hhciBhX3Ryc2l6ZVs0XTsKLSAgICB1bnNpZ25lZCBjaGFyIGFfZHJzaXplWzRdOwotICB9OwotCi0vKiBIb3cgYmlnIHRoZSAic3RydWN0IGV4ZWMiIGlzIG9uIGRpc2sgKi8KLSNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCSg4ICogNCkKLQotLyogVGhpcyBpcyB0aGUgbGF5b3V0IGluIG1lbW9yeSBvZiBhICJzdHJ1Y3QgZXhlYyIgd2hpbGUgd2UgcHJvY2VzcyBpdC4gICovCi0KLXN0cnVjdCBleGVjCi17Ci0gIHVuc2lnbmVkIGxvbmcgYV9pbmZvOwkJLyogVXNlIG1hY3JvcyBOX01BR0lDLCBldGMgZm9yIGFjY2VzcyAqLwotICB1bnNpZ25lZCBhX3RleHQ7CQkvKiBsZW5ndGggb2YgdGV4dCwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgYV9kYXRhOwkJLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfYnNzOwkJLyogbGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhIGZvciBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX3N5bXM7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgYV9lbnRyeTsJCS8qIHN0YXJ0IGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgYV90cnNpemU7CQkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX2Ryc2l6ZTsJCS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIGRhdGEsIGluIGJ5dGVzICovCi19OwotCi0jZW5kaWYgLyogX19TVFJVQ1RfRVhFQ19PVkVSUklERV9fICovCi0KLS8qIHRoZXNlIGdvIGluIHRoZSBOX01BQ0hUWVBFIGZpZWxkICovCi0vKiBUaGVzZSBzeW1ib2xzIGNvdWxkIGJlIGRlZmluZWQgYnkgY29kZSBmcm9tIFN1bnMuLi5wdW50ICdlbSAqLwotI3VuZGVmIE1fVU5LTk9XTgotI3VuZGVmIE1fNjgwMTAKLSN1bmRlZiBNXzY4MDIwCi0jdW5kZWYgTV9TUEFSQwotZW51bSBtYWNoaW5lX3R5cGUKLSAgewotICAgIE1fVU5LTk9XTiA9IDAsCi0gICAgTV82ODAxMCA9IDEsCi0gICAgTV82ODAyMCA9IDIsCi0gICAgTV9TUEFSQyA9IDMsCi0gICAgLyogc2tpcCBhIGJ1bmNoIHNvIHdlIGRvbid0IHJ1biBpbnRvIGFueSBvZiBzdW4ncyBudW1iZXJzICovCi0gICAgTV8zODYgPSAxMDAsCi0gICAgTV8yOUsgPSAxMDEsCi0gICAgTV9SUzYwMDAgPSAxMDIsCQkvKiBJQk0gUlMvNjAwMCAqLwotICAgIC8qIEhQL0JTRCBmb3JtYXRzICovCi0gICAgTV9IUDIwMCA9IDIwMCwJCS8qIGhwMjAwICg2ODAxMCkgQlNEIGJpbmFyeSAqLwotICAgIE1fSFAzMDAgPSAzMDAsCQkvKiBocDMwMCAoNjgwMjArNjg4ODEpIEJTRCBiaW5hcnkgKi8KLSAgICBNX0hQVVgyMyA9IDB4MDIwQwkJLyogaHAyMDAvMzAwIEhQVVggYmluYXJ5ICovCi0gIH07Ci0KLSNkZWZpbmUgTl9NQUdJQyhleGVjKSAoKGV4ZWMpLmFfaW5mbyAmIDB4ZmZmZikKLSNkZWZpbmUgTl9NQUNIVFlQRShleGVjKSAoKGVudW0gbWFjaGluZV90eXBlKSgoKGV4ZWMpLmFfaW5mbyA+PiAxNikgJiAweGZmKSkKLSNkZWZpbmUgTl9GTEFHUyhleGVjKSAoKChleGVjKS5hX2luZm8gPj4gMjQpICYgMHhmZikKLSNkZWZpbmUgTl9TRVRfSU5GTyhleGVjLCBtYWdpYywgdHlwZSwgZmxhZ3MpIFwKLSAgICAoKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKSBcCi0gICAgIHwgKCgoaW50KSh0eXBlKSAmIDB4ZmYpIDw8IDE2KSBcCi0gICAgIHwgKCgoZmxhZ3MpICYgMHhmZikgPDwgMjQpKQotI2RlZmluZSBOX1NFVF9NQUdJQyhleGVjLCBtYWdpYykgXAotICAgICgoZXhlYykuYV9pbmZvID0gKCgoZXhlYykuYV9pbmZvICYgMHhmZmZmMDAwMCkgfCAoKG1hZ2ljKSAmIDB4ZmZmZikpKQotCi0jZGVmaW5lIE5fU0VUX01BQ0hUWVBFKGV4ZWMsIG1hY2h0eXBlKSBcCi0gICAgKChleGVjKS5hX2luZm8gPSBcCi0gICAgICgoZXhlYykuYV9pbmZvJjB4ZmYwMGZmZmYpIHwgKCgoKGludCkobWFjaHR5cGUpKSYweGZmKSA8PCAxNikpCi0KLSNkZWZpbmUgTl9TRVRfRkxBR1MoZXhlYywgZmxhZ3MpIFwKLSAgICAoKGV4ZWMpLmFfaW5mbyA9IFwKLSAgICAgKChleGVjKS5hX2luZm8mMHgwMGZmZmZmZikgfCAoKChmbGFncykgJiAweGZmKSA8PCAyNCkpCi0KLS8qIENvZGUgaW5kaWNhdGluZyBvYmplY3QgZmlsZSBvciBpbXB1cmUgZXhlY3V0YWJsZS4gICovCi0jaWZuZGVmIE9NQUdJQwotI2RlZmluZSBPTUFHSUMgMDQwNwotI2VuZGlmCi0vKiBDb2RlIGluZGljYXRpbmcgcHVyZSBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgTk1BR0lDIDA0MTAKLS8qIENvZGUgaW5kaWNhdGluZyBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIFpNQUdJQyAwNDEzCi0KLS8qIFZpcnR1YWwgQWRkcmVzcyBvZiB0ZXh0IHNlZ21lbnQgZnJvbSB0aGUgYS5vdXQgZmlsZS4gIEZvciBPTUFHSUMsCi0gICAoYWxtb3N0IGFsd2F5cyAidW5saW5rZWQgLm8ncyIgdGhlc2UgZGF5cyksIHNob3VsZCBiZSB6ZXJvLgotICAgRm9yIGxpbmtlZCBmaWxlcywgc2hvdWxkIHJlZmxlY3QgcmVhbGl0eSBpZiB3ZSBrbm93IGl0LiAgKi8KLQotI2lmbmRlZiBOX1RYVEFERFIKLSNkZWZpbmUgTl9UWFRBRERSKHgpCShOX01BR0lDKHgpPT1PTUFHSUM/IDAgOiBURVhUX1NUQVJUX0FERFIpCi0jZW5kaWYKLQotI2lmbmRlZiBOX0JBRE1BRwotI2RlZmluZSBOX0JBRE1BRyh4KQkgIChOX01BR0lDKHgpICE9IE9NQUdJQwkJXAotCQkJICAgJiYgTl9NQUdJQyh4KSAhPSBOTUFHSUMJCVwKLQkJCSAgICYmIE5fTUFHSUMoeCkgIT0gWk1BR0lDKQotI2VuZGlmCi0KLS8qIEJ5IGRlZmF1bHQsIHNlZ21lbnQgc2l6ZSBpcyBjb25zdGFudC4gIEJ1dCBvbiBzb21lIG1hY2hpbmVzLCBpdCBjYW4KLSAgIGJlIGEgZnVuY3Rpb24gb2YgdGhlIGEub3V0IGhlYWRlciAoZS5nLiBtYWNoaW5lIHR5cGUpLiAgKi8KLSNpZm5kZWYJTl9TRUdTSVpFCi0jZGVmaW5lCU5fU0VHU0laRSh4KQlTRUdNRU5UX1NJWkUKLSNlbmRpZgotCi0vKiBUaGlzIGNvbXBsZXhpdHkgaXMgZm9yIGVuY2Fwc3VsYXRlZCBDT0ZGIHN1cHBvcnQgKi8KLSNpZm5kZWYgX05fSERST0ZGCi0jZGVmaW5lIF9OX0hEUk9GRih4KQkoTl9TRUdTSVpFKHgpIC0gc2l6ZW9mIChzdHJ1Y3QgZXhlYykpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1RYVE9GRgotI2RlZmluZSBOX1RYVE9GRih4KQkoTl9NQUdJQyh4KSA9PSBaTUFHSUMgPwlcCi0JCQkgX05fSERST0ZGKCh4KSkgKyBzaXplb2YgKHN0cnVjdCBleGVjKSA6CVwKLQkJCSBzaXplb2YgKHN0cnVjdCBleGVjKSkKLSNlbmRpZgotCi0KLSNpZm5kZWYgTl9EQVRPRkYKLSNkZWZpbmUgTl9EQVRPRkYoeCkJKCBOX1RYVE9GRih4KSArICh4KS5hX3RleHQgKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9UUkVMT0ZGCi0jZGVmaW5lIE5fVFJFTE9GRih4KQkoIE5fREFUT0ZGKHgpICsgKHgpLmFfZGF0YSApCi0jZW5kaWYKLQotI2lmbmRlZiBOX0RSRUxPRkYKLSNkZWZpbmUgTl9EUkVMT0ZGKHgpCSggTl9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplICkKLSNlbmRpZgotCi0jaWZuZGVmIE5fU1lNT0ZGCi0jZGVmaW5lIE5fU1lNT0ZGKHgpCSggTl9EUkVMT0ZGKHgpICsgKHgpLmFfZHJzaXplICkKLSNlbmRpZgotCi0jaWZuZGVmIE5fU1RST0ZGCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKLSNlbmRpZgotCi0vKiBBZGRyZXNzIG9mIHRleHQgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLiAgKi8KLSNpZm5kZWYgTl9UWFRBRERSCi0jZGVmaW5lCU5fVFhUQUREUih4KQkwCi0jZW5kaWYKLQotI2lmbmRlZiBOX0RBVEFERFIKLSNkZWZpbmUgTl9EQVRBRERSKHgpIFwKLSAgICAoTl9NQUdJQyh4KT09T01BR0lDPyAoTl9UWFRBRERSKHgpKyh4KS5hX3RleHQpIFwKLSAgICAgOiAgKE5fU0VHU0laRSh4KSArICgoTl9UWFRBRERSKHgpKyh4KS5hX3RleHQtMSkgJiB+KE5fU0VHU0laRSh4KS0xKSkpKQotI2VuZGlmCi0KLS8qIEFkZHJlc3Mgb2YgYnNzIHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4gICovCi0jZGVmaW5lIE5fQlNTQUREUih4KSAoTl9EQVRBRERSKHgpICsgKHgpLmFfZGF0YSkKLQwKLXN0cnVjdCBubGlzdAotICB7Ci0gICAgdW5pb24KLSAgICAgIHsKLQljaGFyICpuX25hbWU7Ci0Jc3RydWN0IG5saXN0ICpuX25leHQ7Ci0JbG9uZyBuX3N0cng7Ci0gICAgICB9Ci0gICAgbl91bjsKLSAgICB1bnNpZ25lZCBjaGFyIG5fdHlwZTsKLSAgICBjaGFyIG5fb3RoZXI7Ci0gICAgc2hvcnQgbl9kZXNjOwotICAgIHVuc2lnbmVkIGxvbmcgbl92YWx1ZTsKLSAgfTsKLQotI2RlZmluZSBOX1VOREYgMAotI2RlZmluZSBOX0FCUyAyCi0jZGVmaW5lIE5fVEVYVCA0Ci0jZGVmaW5lIE5fREFUQSA2Ci0jZGVmaW5lIE5fQlNTIDgKLSNkZWZpbmUJTl9DT01NCTB4MTIJCS8qIGNvbW1vbiAodmlzaWJsZSBpbiBzaGFyZWQgbGliIGNvbW1vbnMpICovCi0jZGVmaW5lIE5fRk4gMHgxRgkJLyogRmlsZSBuYW1lIG9mIGEgLm8gZmlsZSAqLwotCi0vKiBOb3RlOiBOX0VYVCBjYW4gb25seSB1c2VmdWxseSBiZSBPUi1lZCB3aXRoIE5fVU5ERiwgTl9BQlMsIE5fVEVYVCwKLSAgIE5fREFUQSwgb3IgTl9CU1MuICBXaGVuIHRoZSBsb3ctb3JkZXIgYml0IG9mIG90aGVyIHR5cGVzIGlzIHNldCwKLSAgIChlLmcuIE5fV0FSTklORyB2ZXJzdXMgTl9GTiksIHRoZXkgYXJlIHR3byBkaWZmZXJlbnQgdHlwZXMuICAqLwotI2RlZmluZSBOX0VYVCAxCi0jZGVmaW5lIE5fVFlQRSAwMzYKLSNkZWZpbmUgTl9TVEFCIDAzNDAKLQotLyogVGhlIGZvbGxvd2luZyB0eXBlIGluZGljYXRlcyB0aGUgZGVmaW5pdGlvbiBvZiBhIHN5bWJvbCBhcyBiZWluZwotICAgYW4gaW5kaXJlY3QgcmVmZXJlbmNlIHRvIGFub3RoZXIgc3ltYm9sLiAgVGhlIG90aGVyIHN5bWJvbAotICAgYXBwZWFycyBhcyBhbiB1bmRlZmluZWQgcmVmZXJlbmNlLCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhpcyBzeW1ib2wuCi0KLSAgIEluZGlyZWN0aW9uIGlzIGFzeW1tZXRyaWNhbC4gIFRoZSBvdGhlciBzeW1ib2wncyB2YWx1ZSB3aWxsIGJlIHVzZWQKLSAgIHRvIHNhdGlzZnkgcmVxdWVzdHMgZm9yIHRoZSBpbmRpcmVjdCBzeW1ib2wsIGJ1dCBub3QgdmljZSB2ZXJzYS4KLSAgIElmIHRoZSBvdGhlciBzeW1ib2wgZG9lcyBub3QgaGF2ZSBhIGRlZmluaXRpb24sIGxpYnJhcmllcyB3aWxsCi0gICBiZSBzZWFyY2hlZCB0byBmaW5kIGEgZGVmaW5pdGlvbi4gICovCi0KLSNkZWZpbmUgTl9JTkRSIDB4YQotCi0vKiBUaGUgZm9sbG93aW5nIHN5bWJvbHMgcmVmZXIgdG8gc2V0IGVsZW1lbnRzLgotICAgQWxsIHRoZSBOX1NFVFtBVERCXSBzeW1ib2xzIHdpdGggdGhlIHNhbWUgbmFtZSBmb3JtIG9uZSBzZXQuCi0gICBTcGFjZSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBzZXQgaW4gdGhlIHRleHQgc2VjdGlvbiwgYW5kIGVhY2ggc2V0Ci0gICBlbGVtZW50J3MgdmFsdWUgaXMgc3RvcmVkIGludG8gb25lIHdvcmQgb2YgdGhlIHNwYWNlLgotICAgVGhlIGZpcnN0IHdvcmQgb2YgdGhlIHNwYWNlIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNldCAobnVtYmVyIG9mIGVsZW1lbnRzKS4KLQotICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHNldCBpcyBtYWRlIGludG8gYW4gTl9TRVRWIHN5bWJvbAotICAgd2hvc2UgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUgc2V0LgotICAgVGhpcyBzeW1ib2wgYWN0cyBsaWtlIGEgTl9EQVRBIGdsb2JhbCBzeW1ib2wKLSAgIGluIHRoYXQgaXQgY2FuIHNhdGlzZnkgdW5kZWZpbmVkIGV4dGVybmFsIHJlZmVyZW5jZXMuICAqLwotCi0vKiBUaGVzZSBhcHBlYXIgYXMgaW5wdXQgdG8gTEQsIGluIGEgLm8gZmlsZS4gICovCi0jZGVmaW5lCU5fU0VUQQkweDE0CQkvKiBBYnNvbHV0ZSBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRUCTB4MTYJCS8qIFRleHQgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VURAkweDE4CQkvKiBEYXRhIHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVEIJMHgxQQkJLyogQnNzIHNldCBlbGVtZW50IHN5bWJvbCAqLwotCi0vKiBUaGlzIGlzIG91dHB1dCBmcm9tIExELiAgKi8KLSNkZWZpbmUgTl9TRVRWCTB4MUMJCS8qIFBvaW50ZXIgdG8gc2V0IHZlY3RvciBpbiBkYXRhIGFyZWEuICAqLwotCi0vKiBXYXJuaW5nIHN5bWJvbC4gVGhlIHRleHQgZ2l2ZXMgYSB3YXJuaW5nIG1lc3NhZ2UsIHRoZSBuZXh0IHN5bWJvbAotICAgaW4gdGhlIHRhYmxlIHdpbGwgYmUgdW5kZWZpbmVkLiBXaGVuIHRoZSBzeW1ib2wgaXMgcmVmZXJlbmNlZCwgdGhlCi0gICBtZXNzYWdlIGlzIHByaW50ZWQuICAqLwotCi0jZGVmaW5lCU5fV0FSTklORyAweDFlCi0KLS8qIFdlYWsgc3ltYm9scy4gIFRoZXNlIGFyZSBhIEdOVSBleHRlbnNpb24gdG8gdGhlIGEub3V0IGZvcm1hdC4gIFRoZQotICAgc2VtYW50aWNzIGFyZSB0aG9zZSBvZiBFTEYgd2VhayBzeW1ib2xzLiAgV2VhayBzeW1ib2xzIGFyZSBhbHdheXMKLSAgIGV4dGVybmFsbHkgdmlzaWJsZS4gIFRoZSBOX1dFQUs/IHZhbHVlcyBhcmUgc3F1ZWV6ZWQgaW50byB0aGUKLSAgIGF2YWlsYWJsZSBzbG90cy4gIFRoZSB2YWx1ZSBvZiBhIE5fV0VBS1Ugc3ltYm9sIGlzIDAuICBUaGUgdmFsdWVzCi0gICBvZiB0aGUgb3RoZXIgdHlwZXMgYXJlIHRoZSBkZWZpbml0aW9ucy4gICovCi0jZGVmaW5lIE5fV0VBS1UJMHgwZAkJLyogV2VhayB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTl9XRUFLQSAweDBlCQkvKiBXZWFrIGFic29sdXRlIHN5bWJvbC4gICovCi0jZGVmaW5lIE5fV0VBS1QgMHgwZgkJLyogV2VhayB0ZXh0IHN5bWJvbC4gICovCi0jZGVmaW5lIE5fV0VBS0QgMHgxMAkJLyogV2VhayBkYXRhIHN5bWJvbC4gICovCi0jZGVmaW5lIE5fV0VBS0IgMHgxMQkJLyogV2VhayBic3Mgc3ltYm9sLiAgKi8KLQwKLS8qIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIHNpbmdsZSByZWxvY2F0aW9uIHRvIGJlIHBlcmZvcm1lZC4KLSAgIFRoZSB0ZXh0LXJlbG9jYXRpb24gc2VjdGlvbiBvZiB0aGUgZmlsZSBpcyBhIHZlY3RvciBvZiB0aGVzZSBzdHJ1Y3R1cmVzLAotICAgYWxsIG9mIHdoaWNoIGFwcGx5IHRvIHRoZSB0ZXh0IHNlY3Rpb24uCi0gICBMaWtld2lzZSwgdGhlIGRhdGEtcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gdGhlIGRhdGEgc2VjdGlvbi4gICovCi0KLS8qIFRoZSBmb2xsb3dpbmcgZW51bSBhbmQgc3RydWN0IHdlcmUgYm9ycm93ZWQgZnJvbSBTdW5PUydzCi0gICAvdXNyL2luY2x1ZGUvc3VuNC9hLm91dC5oICBhbmQgZXh0ZW5kZWQgdG8gaGFuZGxlCi0gICBvdGhlciBtYWNoaW5lcy4gIEl0IGlzIGN1cnJlbnRseSB1c2VkIG9uIFNQQVJDIGFuZCBBTUQgMjkwMDAuCi0KLSAgIHJlbG9jX2V4dF9ieXRlcyBpcyBob3cgaXQgbG9va3Mgb24gZGlzay4gIHJlbG9jX2luZm9fZXh0ZW5kZWQgaXMKLSAgIGhvdyB3ZSBtaWdodCBwcm9jZXNzIGl0IG9uIGEgbmF0aXZlIGhvc3QuICAqLwotI2lmIFVTRV9FWFRFTkRFRF9SRUxPQwotCi1zdHJ1Y3QgcmVsb2NfZXh0X2J5dGVzCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyIHJfYWRkcmVzc1s0XTsKLSAgICB1bnNpZ25lZCBjaGFyIHJfaW5kZXhbM107Ci0gICAgdW5zaWduZWQgY2hhciByX2JpdHNbMV07Ci0gICAgdW5zaWduZWQgY2hhciByX2FkZGVuZFs0XTsKLSAgfTsKLQotCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcJMHg4MAotI2RlZmluZQlSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFCTB4MDEKLQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX0JJRwkJMHgxRgotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRwkwCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFCTB4RjgKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUJMwotCi0jZGVmaW5lCVJFTE9DX0VYVF9TSVpFCTEyCS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCi0KLXN0cnVjdCByZWxvY19pbmZvX2V4dGVuZGVkCi17Ci0gIHVuc2lnbmVkIGxvbmcgcl9hZGRyZXNzOwotICB1bnNpZ25lZCBpbnQgcl9pbmRleDoyNDsKLSMgZGVmaW5lCXJfc3ltYm9sbnVtICByX2luZGV4Ci0gIHVuc2lnbmVkIHJfZXh0ZXJuOjE7Ci0gIHVuc2lnbmVkOjI7Ci0gIC8qICBSUy82MDAwIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgZW51bSBiaXRmaWVsZAotCSAgICBlbnVtIHJlbG9jX3R5cGUgcl90eXBlOjU7ICovCi0gIGVudW0gcmVsb2NfdHlwZSByX3R5cGU7Ci0gIGxvbmcgaW50IHJfYWRkZW5kOwotfTsKLQotI2Vsc2UKLQotLyogVGhlIHN0YW5kYXJkLCBvbGQtZmFzaGlvbmVkLCBCZXJrZWxleSBjb21wYXRpYmxlIHJlbG9jYXRpb24gc3RydWN0ICovCi0KLQotCi0jaWZkZWYgVENfSTg2MAotLyogTk9URTogdGhyZWUgYml0cyBtYXgsIHNlZSBzdHJ1Y3QgcmVsb2NfaW5mb19pODYwLnJfdHlwZSAqLwotZW51bSBpODYwX3JlbG9jX3R5cGUKLSAgewotICAgIE5PX1JFTE9DID0gMCwgQlJBRERSLCBMT1cwLCBMT1cxLCBMT1cyLCBMT1czLCBMT1c0LCBTUExJVDAsIFNQTElUMSwgU1BMSVQyLCBSRUxPQ18zMiwKLSAgfTsKLQotdHlwZWRlZiBlbnVtIGk4NjBfcmVsb2NfdHlwZSByZWxvY190eXBlOwotCi0vKiBOT1RFOiB0d28gYml0cyBtYXgsIHNlZSByZWxvY19pbmZvX2k4NjAucl90eXBlICovCi1lbnVtIGhpZ2hsb3dfdHlwZQotICB7Ci0gICAgTk9fU1BFQyA9IDAsIFBBSVIsIEhJR0gsIEhJR0hBREosCi0gIH07Ci0KLQotc3RydWN0IHJlbG9jX2luZm9faTg2MAotewotICB1bnNpZ25lZCBsb25nIHJfYWRkcmVzczsKLSAgLyoKLQkgKiBVc2luZyBiaXQgZmllbGRzIGhlcmUgaXMgYSBiYWQgaWRlYSBiZWNhdXNlIHRoZSBvcmRlciBpcyBub3QgcG9ydGFibGUuIDotKAotCSAqLwotICB1bnNpZ25lZCBpbnQgcl9zeW1ib2xudW06MjQ7Ci0gIHVuc2lnbmVkIGludCByX3BjcmVsOjE7Ci0gIHVuc2lnbmVkIGludCByX2V4dGVybjoxOwotICAvKiBjb21iaW5pbmcgdGhlIHR3byBmaWVsZCBzaW1wbGlmaWVzIHRoZSBhcmd1bWVudCBwYXNzaW5nIGluICJuZXdfZml4KCkiICovCi0gIC8qIGFuZCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGV4aXN0aW5nIFNwYXJjICNpZmRlZidzICovCi0gIC8qIHJfdHlwZTogIGhpZ2hsb3dfdHlwZSAtIGJpdHMgNSw0OyByZWxvY190eXBlIC0gYml0cyAzLTAgKi8KLSAgdW5zaWduZWQgaW50IHJfdHlwZTo2OwotICBsb25nIHJfYWRkZW5kOwotfTsKLQotI2VuZGlmIC8qIFRDX0k4NjAgKi8KLQotCi1zdHJ1Y3QgcmVsb2Nfc3RkX2J5dGVzCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyIHJfYWRkcmVzc1s0XTsKLSAgICB1bnNpZ25lZCBjaGFyIHJfaW5kZXhbM107Ci0gICAgdW5zaWduZWQgY2hhciByX2JpdHNbMV07Ci0gIH07Ci0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUENSRUxfQklHCTB4ODAKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFCTB4MDEKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfQklHCTB4NjAKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRwk1CS8qIFRvIHNoaWZ0IHRvIHVuaXRzIHBsYWNlICovCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9MSVRUTEUJMHgwNgotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFCTEKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19FWFRFUk5fQklHCTB4MTAKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRQkweDA4Ci0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcJMHgwOAotI2RlZmluZQlSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRQkweDA4Ci0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHCTB4MDQKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFCTB4MDQKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19SRUxBVElWRV9CSUcJMHgwMgotI2RlZmluZQlSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUJMHgwMgotCi0jZGVmaW5lCVJFTE9DX1NURF9TSVpFCTgJLyogQnl0ZXMgcGVyIHJlbG9jYXRpb24gZW50cnkgKi8KLQotI2VuZGlmIC8qIFVTRV9FWFRFTkRFRF9SRUxPQyAqLwotCi0jaWZuZGVmIENVU1RPTV9SRUxPQ19GT1JNQVQKLXN0cnVjdCByZWxvY2F0aW9uX2luZm8KLXsKLSAgLyogQWRkcmVzcyAod2l0aGluIHNlZ21lbnQpIHRvIGJlIHJlbG9jYXRlZC4gICovCi0gIGludCByX2FkZHJlc3M7Ci0gIC8qIFRoZSBtZWFuaW5nIG9mIHJfc3ltYm9sbnVtIGRlcGVuZHMgb24gcl9leHRlcm4uICAqLwotICB1bnNpZ25lZCBpbnQgcl9zeW1ib2xudW06MjQ7Ci0gIC8qIE5vbnplcm8gbWVhbnMgdmFsdWUgaXMgYSBwYy1yZWxhdGl2ZSBvZmZzZXQKLQkgICBhbmQgaXQgc2hvdWxkIGJlIHJlbG9jYXRlZCBmb3IgY2hhbmdlcyBpbiBpdHMgb3duIGFkZHJlc3MKLQkgICBhcyB3ZWxsIGFzIGZvciBjaGFuZ2VzIGluIHRoZSBzeW1ib2wgb3Igc2VjdGlvbiBzcGVjaWZpZWQuICAqLwotICB1bnNpZ25lZCBpbnQgcl9wY3JlbDoxOwotICAvKiBMZW5ndGggKGFzIGV4cG9uZW50IG9mIDIpIG9mIHRoZSBmaWVsZCB0byBiZSByZWxvY2F0ZWQuCi0JICAgVGh1cywgYSB2YWx1ZSBvZiAyIGluZGljYXRlcyAxPDwyIGJ5dGVzLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOjI7Ci0gIC8qIDEgPT4gcmVsb2NhdGUgd2l0aCB2YWx1ZSBvZiBzeW1ib2wuCi0JICAgcl9zeW1ib2xudW0gaXMgdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wKLQkgICBpbiBmaWxlJ3MgdGhlIHN5bWJvbCB0YWJsZS4KLQkgICAwID0+IHJlbG9jYXRlIHdpdGggdGhlIGFkZHJlc3Mgb2YgYSBzZWdtZW50LgotCSAgIHJfc3ltYm9sbnVtIGlzIE5fVEVYVCwgTl9EQVRBLCBOX0JTUyBvciBOX0FCUwotCSAgICh0aGUgTl9FWFQgYml0IG1heSBiZSBzZXQgYWxzbywgYnV0IHNpZ25pZmllcyBub3RoaW5nKS4gICovCi0gIHVuc2lnbmVkIGludCByX2V4dGVybjoxOwotICAvKiBUaGUgbmV4dCB0aHJlZSBiaXRzIGFyZSBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcywgYW5kIHNlZW0gdG8KLQkgICBiZSB1bmRvY3VtZW50ZWQuICAqLwotI2lmZGVmIFRDX05TMzJLCi0gIHVuc2lnbmVkIGludCByX2JzcjoxOwotICB1bnNpZ25lZCBpbnQgcl9kaXNwOjI7Ci0jZWxzZQotICB1bnNpZ25lZCBpbnQgcl9iYXNlcmVsOjE7CS8qIExpbmthZ2UgdGFibGUgcmVsYXRpdmUgKi8KLSAgdW5zaWduZWQgaW50IHJfam1wdGFibGU6MTsJLyogcGMtcmVsYXRpdmUgdG8ganVtcCB0YWJsZSAqLwotICB1bnNpZ25lZCBpbnQgcl9yZWxhdGl2ZToxOwkvKiAicmVsYXRpdmUgcmVsb2NhdGlvbiIgKi8KLSNlbmRpZiAvKiBUQ19OUzMySyAqLwotICAvKiB1bnVzZWQgKi8KLSAgdW5zaWduZWQgaW50IHJfcGFkOjE7CQkvKiBQYWRkaW5nIC0tIHNldCB0byB6ZXJvICovCi19OwotCi0jZW5kaWYgLyogQ1VTVE9NX1JFTE9DX0ZPUk1BVCAqLwotCi0jZW5kaWYgLyogX19BX09VVF9HTlVfSF9fICovCi0KLS8qIGVuZCBvZiBhb3V0X2dudS5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL2F0b2YtaWVlZS5jIGIvZ2FzL2NvbmZpZy9hdG9mLWllZWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJmMGZmYi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2F0b2YtaWVlZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzE1ICswLDAgQEAKLS8qIGF0b2ZfaWVlZS5jIC0gdHVybiBhIEZsb251bSBpbnRvIGFuIElFRUUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotLyogRmxvbnVtcyByZXR1cm5lZCBoZXJlLiAgKi8KLWV4dGVybiBGTE9OVU1fVFlQRSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcjsKLQotc3RhdGljIGludCBuZXh0X2JpdHMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCB1bmdldF9iaXRzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciBQQVJBTVMgKChMSVRUTEVOVU1fVFlQRSAqKSk7Ci0KLWV4dGVybiBjb25zdCBjaGFyIEVYUF9DSEFSU1tdOwotLyogUHJlY2lzaW9uIGluIExpdHRsZU51bXMuICovCi0vKiBEb24ndCBjb3VudCB0aGUgZ2FwIGluIHRoZSBtNjhrIGV4dGVuZGVkIHByZWNpc2lvbiBmb3JtYXQuICAqLwotI2RlZmluZSBNQVhfUFJFQ0lTSU9OICg1KQotI2RlZmluZSBGX1BSRUNJU0lPTiAoMikKLSNkZWZpbmUgRF9QUkVDSVNJT04gKDQpCi0jZGVmaW5lIFhfUFJFQ0lTSU9OICg1KQotI2RlZmluZSBQX1BSRUNJU0lPTiAoNSkKLQotLyogTGVuZ3RoIGluIExpdHRsZU51bXMgb2YgZ3VhcmQgYml0cy4gKi8KLSNkZWZpbmUgR1VBUkQgKDIpCi0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIG1hc2tbXSA9Ci17Ci0gIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMDEsCi0gIDB4MDAwMDAwMDMsCi0gIDB4MDAwMDAwMDcsCi0gIDB4MDAwMDAwMGYsCi0gIDB4MDAwMDAwMWYsCi0gIDB4MDAwMDAwM2YsCi0gIDB4MDAwMDAwN2YsCi0gIDB4MDAwMDAwZmYsCi0gIDB4MDAwMDAxZmYsCi0gIDB4MDAwMDAzZmYsCi0gIDB4MDAwMDA3ZmYsCi0gIDB4MDAwMDBmZmYsCi0gIDB4MDAwMDFmZmYsCi0gIDB4MDAwMDNmZmYsCi0gIDB4MDAwMDdmZmYsCi0gIDB4MDAwMGZmZmYsCi0gIDB4MDAwMWZmZmYsCi0gIDB4MDAwM2ZmZmYsCi0gIDB4MDAwN2ZmZmYsCi0gIDB4MDAwZmZmZmYsCi0gIDB4MDAxZmZmZmYsCi0gIDB4MDAzZmZmZmYsCi0gIDB4MDA3ZmZmZmYsCi0gIDB4MDBmZmZmZmYsCi0gIDB4MDFmZmZmZmYsCi0gIDB4MDNmZmZmZmYsCi0gIDB4MDdmZmZmZmYsCi0gIDB4MGZmZmZmZmYsCi0gIDB4MWZmZmZmZmYsCi0gIDB4M2ZmZmZmZmYsCi0gIDB4N2ZmZmZmZmYsCi0gIDB4ZmZmZmZmZmYsCi19OwotDAotCi1zdGF0aWMgaW50IGJpdHNfbGVmdF9pbl9saXR0bGVudW07Ci1zdGF0aWMgaW50IGxpdHRsZW51bXNfbGVmdDsKLXN0YXRpYyBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtX3BvaW50ZXI7Ci0KLXN0YXRpYyBpbnQKLW5leHRfYml0cyAobnVtYmVyX29mX2JpdHMpCi0gICAgIGludCBudW1iZXJfb2ZfYml0czsKLXsKLSAgaW50IHJldHVybl92YWx1ZTsKLQotICBpZiAoIWxpdHRsZW51bXNfbGVmdCkKLSAgICByZXR1cm4gKDApOwotICBpZiAobnVtYmVyX29mX2JpdHMgPj0gYml0c19sZWZ0X2luX2xpdHRsZW51bSkKLSAgICB7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW2JpdHNfbGVmdF9pbl9saXR0bGVudW1dICYgKmxpdHRsZW51bV9wb2ludGVyOwotICAgICAgbnVtYmVyX29mX2JpdHMgLT0gYml0c19sZWZ0X2luX2xpdHRsZW51bTsKLSAgICAgIHJldHVybl92YWx1ZSA8PD0gbnVtYmVyX29mX2JpdHM7Ci0KLSAgICAgIGlmICgtLWxpdHRsZW51bXNfbGVmdCkKLQl7Ci0JICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gbnVtYmVyX29mX2JpdHM7Ci0JICAtLWxpdHRsZW51bV9wb2ludGVyOwotCSAgcmV0dXJuX3ZhbHVlIHw9ICgqbGl0dGxlbnVtX3BvaW50ZXIgPj4gYml0c19sZWZ0X2luX2xpdHRsZW51bSkgJiBtYXNrW251bWJlcl9vZl9iaXRzXTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSAtPSBudW1iZXJfb2ZfYml0czsKLSAgICAgIHJldHVybl92YWx1ZSA9IG1hc2tbbnVtYmVyX29mX2JpdHNdICYgKCpsaXR0bGVudW1fcG9pbnRlciA+PiBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKTsKLSAgICB9Ci0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0KLQotLyogTnVtIGhhZCBiZXR0ZXIgYmUgbGVzcyB0aGFuIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAqLwotc3RhdGljIHZvaWQKLXVuZ2V0X2JpdHMgKG51bSkKLSAgICAgaW50IG51bTsKLXsKLSAgaWYgKCFsaXR0bGVudW1zX2xlZnQpCi0gICAgewotICAgICAgKytsaXR0bGVudW1fcG9pbnRlcjsKLSAgICAgICsrbGl0dGxlbnVtc19sZWZ0OwotICAgICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IG51bTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJpdHNfbGVmdF9pbl9saXR0bGVudW0gKyBudW0gPiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0gICAgewotICAgICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IG51bSAtIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKTsKLSAgICAgICsrbGl0dGxlbnVtX3BvaW50ZXI7Ci0gICAgICArK2xpdHRsZW51bXNfbGVmdDsKLSAgICB9Ci0gIGVsc2UKLSAgICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtICs9IG51bTsKLX0KLQotc3RhdGljIHZvaWQKLW1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKQotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7Ci17Ci0gIGFzX2JhZCAoXygiY2Fubm90IGNyZWF0ZSBmbG9hdGluZy1wb2ludCBudW1iZXIiKSk7Ci0gIHdvcmRzWzBdID0gKExJVFRMRU5VTV9UWVBFKSAoKHVuc2lnbmVkKSAtMSkgPj4gMTsgLyogWmVybyB0aGUgbGVmdG1vc3QgYml0ICovCi0gIHdvcmRzWzFdID0gKExJVFRMRU5VTV9UWVBFKSAtMTsKLSAgd29yZHNbMl0gPSAoTElUVExFTlVNX1RZUEUpIC0xOwotICB3b3Jkc1szXSA9IChMSVRUTEVOVU1fVFlQRSkgLTE7Ci0gIHdvcmRzWzRdID0gKExJVFRMRU5VTV9UWVBFKSAtMTsKLSAgd29yZHNbNV0gPSAoTElUVExFTlVNX1RZUEUpIC0xOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCVdhcm5pbmc6IHRoaXMgcmV0dXJucyAxNi1iaXQgTElUVExFTlVNcy4gSXQgaXMgdXAgdG8gdGhlIGNhbGxlcgkqCi0gKgl0byBmaWd1cmUgb3V0IGFueSBhbGlnbm1lbnQgcHJvYmxlbXMgYW5kIHRvIGNvbnNwaXJlIGZvciB0aGUJKgotICoJYnl0ZXMvd29yZCB0byBiZSBlbWl0dGVkIGluIHRoZSByaWdodCBvcmRlci4gQmlnZW5kaWFucyBiZXdhcmUhCSoKLSAqCQkJCQkJCQkJKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogTm90ZSB0aGF0IGF0b2YtaWVlZSBhbHdheXMgaGFzIFggYW5kIFAgcHJlY2lzaW9ucyBlbmFibGVkLiAgaXQgaXMgdXAKLSAgIHRvIG1kX2F0b2YgdG8gZmlsdGVyIHRoZW0gb3V0IGlmIHRoZSB0YXJnZXQgbWFjaGluZSBkb2VzIG5vdCBzdXBwb3J0Ci0gICB0aGVtLiAgKi8KLQotLyogUmV0dXJucyBwb2ludGVyIHBhc3QgdGV4dCBjb25zdW1lZC4gKi8KLWNoYXIgKgotYXRvZl9pZWVlIChzdHIsIHdoYXRfa2luZCwgd29yZHMpCi0gICAgIGNoYXIgKnN0cjsJCQkvKiBUZXh0IHRvIGNvbnZlcnQgdG8gYmluYXJ5LiAqLwotICAgICBjaGFyIHdoYXRfa2luZDsJCS8qICdkJywgJ2YnLCAnZycsICdoJyAqLwotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7CS8qIEJ1aWxkIHRoZSBiaW5hcnkgaGVyZS4gKi8KLXsKLSAgLyogRXh0cmEgYml0cyBmb3IgemVyb2VkIGxvdy1vcmRlciBiaXRzLiAgVGhlIDFzdCBNQVhfUFJFQ0lTSU9OIGFyZQotICAgICB6ZXJvZWQsIHRoZSBsYXN0IGNvbnRhaW4gZmxvbnVtIGJpdHMuICovCi0gIHN0YXRpYyBMSVRUTEVOVU1fVFlQRSBiaXRzW01BWF9QUkVDSVNJT04gKyBNQVhfUFJFQ0lTSU9OICsgR1VBUkRdOwotICBjaGFyICpyZXR1cm5fdmFsdWU7Ci0gIC8qIE51bWJlciBvZiAxNi1iaXQgd29yZHMgaW4gdGhlIGZvcm1hdC4gKi8KLSAgaW50IHByZWNpc2lvbjsKLSAgbG9uZyBleHBvbmVudF9iaXRzOwotICBGTE9OVU1fVFlQRSBzYXZlX2dlbl9mbG9udW07Ci0KLSAgLyogV2UgaGF2ZSB0byBzYXZlIHRoZSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciBiZWNhdXNlIGl0Ci0gICAgIGNvbnRhaW5zIHN0b3JhZ2UgYWxsb2NhdGlvbiBhYm91dCB0aGUgYXJyYXkgb2YgTElUVExFTlVNcyB3aGVyZQotICAgICB0aGUgdmFsdWUgaXMgYWN0dWFsbHkgc3RvcmVkLiAgV2Ugd2lsbCBhbGxvY2F0ZSBvdXIgb3duIGFycmF5IG9mCi0gICAgIGxpdHRsZW51bXMgYmVsb3csIGJ1dCBoYXZlIHRvIHJlc3RvcmUgdGhlIGdsb2JhbCBvbmUgb24gZXhpdC4gICovCi0gIHNhdmVfZ2VuX2Zsb251bSA9IGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyOwotCi0gIHJldHVybl92YWx1ZSA9IHN0cjsKLSAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubG93ID0gYml0cyArIE1BWF9QUkVDSVNJT047Ci0gIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmhpZ2ggPSBOVUxMOwotICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sZWFkZXIgPSBOVUxMOwotICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5leHBvbmVudCA9IDA7Ci0gIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLnNpZ24gPSAnXDAnOwotCi0gIC8qIFVzZSBtb3JlIExpdHRsZU51bXMgdGhhbiBzZWVtcyBuZWNlc3Nhcnk6IHRoZSBoaWdoZXN0IGZsb251bSBtYXkKLSAgICAgaGF2ZSAxNSBsZWFkaW5nIDAgYml0cywgc28gY291bGQgYmUgdXNlbGVzcy4gKi8KLQotICBtZW1zZXQgKGJpdHMsICdcMCcsIHNpemVvZiAoTElUVExFTlVNX1RZUEUpICogTUFYX1BSRUNJU0lPTik7Ci0KLSAgc3dpdGNoICh3aGF0X2tpbmQpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlY2lzaW9uID0gRl9QUkVDSVNJT047Ci0gICAgICBleHBvbmVudF9iaXRzID0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjaXNpb24gPSBEX1BSRUNJU0lPTjsKLSAgICAgIGV4cG9uZW50X2JpdHMgPSAxMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgY2FzZSAnZSc6Ci0gICAgY2FzZSAnRSc6Ci0gICAgICBwcmVjaXNpb24gPSBYX1BSRUNJU0lPTjsKLSAgICAgIGV4cG9uZW50X2JpdHMgPSAxNTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0KLSAgICAgIHByZWNpc2lvbiA9IFBfUFJFQ0lTSU9OOwotICAgICAgZXhwb25lbnRfYml0cyA9IC0xOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotICAgICAgcmV0dXJuIChOVUxMKTsKLSAgICB9Ci0KLSAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuaGlnaAotICAgID0gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubG93ICsgcHJlY2lzaW9uIC0gMSArIEdVQVJEOwotCi0gIGlmIChhdG9mX2dlbmVyaWMgKCZyZXR1cm5fdmFsdWUsICIuIiwgRVhQX0NIQVJTLAotCQkgICAgJmdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKSkKLSAgICB7Ci0gICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0gICAgICByZXR1cm4gKE5VTEwpOwotICAgIH0KLSAgZ2VuX3RvX3dvcmRzICh3b3JkcywgcHJlY2lzaW9uLCBleHBvbmVudF9iaXRzKTsKLQotICAvKiBSZXN0b3JlIHRoZSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcidzIHN0b3JhZ2UgYWxsb2MgKGFuZAotICAgICBldmVyeXRoaW5nIGVsc2UpLiAgKi8KLSAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgPSBzYXZlX2dlbl9mbG9udW07Ci0KLSAgcmV0dXJuIHJldHVybl92YWx1ZTsKLX0KLQotLyogVHVybiBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciBpbnRvIGEgcmVhbCBmbG9hdC9kb3VibGUvZXh0ZW5kZWQuICAqLwotaW50Ci1nZW5fdG9fd29yZHMgKHdvcmRzLCBwcmVjaXNpb24sIGV4cG9uZW50X2JpdHMpCi0gICAgIExJVFRMRU5VTV9UWVBFICp3b3JkczsKLSAgICAgaW50IHByZWNpc2lvbjsKLSAgICAgbG9uZyBleHBvbmVudF9iaXRzOwotewotICBpbnQgcmV0dXJuX3ZhbHVlID0gMDsKLQotICBsb25nIGV4cG9uZW50XzE7Ci0gIGxvbmcgZXhwb25lbnRfMjsKLSAgbG9uZyBleHBvbmVudF8zOwotICBsb25nIGV4cG9uZW50XzQ7Ci0gIGludCBleHBvbmVudF9za2lwcGFnZTsKLSAgTElUVExFTlVNX1RZUEUgd29yZDE7Ci0gIExJVFRMRU5VTV9UWVBFICpscDsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRzX2VuZDsKLQotICB3b3Jkc19lbmQgPSB3b3JkcyArIHByZWNpc2lvbjsKLSNpZmRlZiBUQ19NNjhLCi0gIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04pCi0gICAgLyogT24gdGhlIG02OGsgdGhlIGV4dGVuZGVkIHByZWNpc2lvbiBmb3JtYXQgaGFzIGEgZ2FwIG9mIDE2IGJpdHMKLSAgICAgICBiZXR3ZWVuIHRoZSBleHBvbmVudCBhbmQgdGhlIG1hbnRpc3NhLiAgKi8KLSAgICB3b3Jkc19lbmQrKzsKLSNlbmRpZgotCi0gIGlmIChnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sb3cgPiBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sZWFkZXIpCi0gICAgewotICAgICAgLyogMC4wZTAgc2Vlbi4gKi8KLSAgICAgIGlmIChnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID09ICcrJykKLQl3b3Jkc1swXSA9IDB4MDAwMDsKLSAgICAgIGVsc2UKLQl3b3Jkc1swXSA9IDB4ODAwMDsKLSAgICAgIG1lbXNldCAoJndvcmRzWzFdLCAnXDAnLAotCSAgICAgICh3b3Jkc19lbmQgLSB3b3JkcyAtIDEpICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotICAgIH0KLQotICAvKiBOYU46ICBEbyB0aGUgcmlnaHQgdGhpbmcgKi8KLSAgaWYgKGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLnNpZ24gPT0gMCkKLSAgICB7Ci0gICAgICBpZiAocHJlY2lzaW9uID09IEZfUFJFQ0lTSU9OKQotCXsKLQkgIHdvcmRzWzBdID0gMHg3ZmZmOwotCSAgd29yZHNbMV0gPSAweGZmZmY7Ci0JfQotICAgICAgZWxzZSBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OKQotCXsKLSNpZmRlZiBUQ19NNjhLCi0JICB3b3Jkc1swXSA9IDB4N2ZmZjsKLQkgIHdvcmRzWzFdID0gMDsKLQkgIHdvcmRzWzJdID0gMHhmZmZmOwotCSAgd29yZHNbM10gPSAweGZmZmY7Ci0JICB3b3Jkc1s0XSA9IDB4ZmZmZjsKLQkgIHdvcmRzWzVdID0gMHhmZmZmOwotI2Vsc2UgLyogISBUQ19NNjhLICovCi0jaWZkZWYgVENfSTM4NgotCSAgd29yZHNbMF0gPSAweGZmZmY7Ci0JICB3b3Jkc1sxXSA9IDB4YzAwMDsKLQkgIHdvcmRzWzJdID0gMDsKLQkgIHdvcmRzWzNdID0gMDsKLQkgIHdvcmRzWzRdID0gMDsKLSNlbHNlIC8qICEgVENfSTM4NiAqLwotCSAgYWJvcnQgKCk7Ci0jZW5kaWYgLyogISBUQ19JMzg2ICovCi0jZW5kaWYgLyogISBUQ19NNjhLICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIHdvcmRzWzBdID0gMHg3ZmZmOwotCSAgd29yZHNbMV0gPSAweGZmZmY7Ci0JICB3b3Jkc1syXSA9IDB4ZmZmZjsKLQkgIHdvcmRzWzNdID0gMHhmZmZmOwotCX0KLSAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0gICAgfQotICBlbHNlIGlmIChnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID09ICdQJykKLSAgICB7Ci0gICAgICAvKiArSU5GOiAgRG8gdGhlIHJpZ2h0IHRoaW5nICovCi0gICAgICBpZiAocHJlY2lzaW9uID09IEZfUFJFQ0lTSU9OKQotCXsKLQkgIHdvcmRzWzBdID0gMHg3ZjgwOwotCSAgd29yZHNbMV0gPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKLQl7Ci0jaWZkZWYgVENfTTY4SwotCSAgd29yZHNbMF0gPSAweDdmZmY7Ci0JICB3b3Jkc1sxXSA9IDA7Ci0JICB3b3Jkc1syXSA9IDA7Ci0JICB3b3Jkc1szXSA9IDA7Ci0JICB3b3Jkc1s0XSA9IDA7Ci0JICB3b3Jkc1s1XSA9IDA7Ci0jZWxzZSAvKiAhIFRDX002OEsgKi8KLSNpZmRlZiBUQ19JMzg2Ci0JICB3b3Jkc1swXSA9IDB4N2ZmZjsKLQkgIHdvcmRzWzFdID0gMHg4MDAwOwotCSAgd29yZHNbMl0gPSAwOwotCSAgd29yZHNbM10gPSAwOwotCSAgd29yZHNbNF0gPSAwOwotI2Vsc2UgLyogISBUQ19JMzg2ICovCi0JICBhYm9ydCAoKTsKLSNlbmRpZiAvKiAhIFRDX0kzODYgKi8KLSNlbmRpZiAvKiAhIFRDX002OEsgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd29yZHNbMF0gPSAweDdmZjA7Ci0JICB3b3Jkc1sxXSA9IDA7Ci0JICB3b3Jkc1syXSA9IDA7Ci0JICB3b3Jkc1szXSA9IDA7Ci0JfQotICAgICAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotICAgIH0KLSAgZWxzZSBpZiAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAnTicpCi0gICAgewotICAgICAgLyogTmVnYXRpdmUgSU5GICovCi0gICAgICBpZiAocHJlY2lzaW9uID09IEZfUFJFQ0lTSU9OKQotCXsKLQkgIHdvcmRzWzBdID0gMHhmZjgwOwotCSAgd29yZHNbMV0gPSAweDA7Ci0JfQotICAgICAgZWxzZSBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OKQotCXsKLSNpZmRlZiBUQ19NNjhLCi0JICB3b3Jkc1swXSA9IDB4ZmZmZjsKLQkgIHdvcmRzWzFdID0gMDsKLQkgIHdvcmRzWzJdID0gMDsKLQkgIHdvcmRzWzNdID0gMDsKLQkgIHdvcmRzWzRdID0gMDsKLQkgIHdvcmRzWzVdID0gMDsKLSNlbHNlIC8qICEgVENfTTY4SyAqLwotI2lmZGVmIFRDX0kzODYKLQkgIHdvcmRzWzBdID0gMHhmZmZmOwotCSAgd29yZHNbMV0gPSAweDgwMDA7Ci0JICB3b3Jkc1syXSA9IDA7Ci0JICB3b3Jkc1szXSA9IDA7Ci0JICB3b3Jkc1s0XSA9IDA7Ci0jZWxzZSAvKiAhIFRDX0kzODYgKi8KLQkgIGFib3J0ICgpOwotI2VuZGlmIC8qICEgVENfSTM4NiAqLwotI2VuZGlmIC8qICEgVENfTTY4SyAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB3b3Jkc1swXSA9IDB4ZmZmMDsKLQkgIHdvcmRzWzFdID0gMHgwOwotCSAgd29yZHNbMl0gPSAweDA7Ci0JICB3b3Jkc1szXSA9IDB4MDsKLQl9Ci0gICAgICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci0gICAgfQotICAvKgotICAgKiBUaGUgZmxvYXRpbmcgcG9pbnQgZm9ybWF0cyB3ZSBzdXBwb3J0IGhhdmU6Ci0gICAqIEJpdCAxNSBpcyBzaWduIGJpdC4KLSAgICogQml0cyAxNDpuIGFyZSBleGNlc3Mtd2hhdGV2ZXIgZXhwb25lbnQuCi0gICAqIEJpdHMgbi0xOjAgKGlmIGFueSkgYXJlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiBmcmFjdGlvbi4KLSAgICogQml0cyAxNTowIG9mIHRoZSBuZXh0IHdvcmQocykgYXJlIHRoZSBuZXh0IG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4KLSAgICoKLSAgICogU28gd2UgbmVlZDogbnVtYmVyIG9mIGJpdHMgb2YgZXhwb25lbnQsIG51bWJlciBvZiBiaXRzIG9mCi0gICAqIG1hbnRpc3NhLgotICAgKi8KLSAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLSAgbGl0dGxlbnVtX3BvaW50ZXIgPSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sZWFkZXI7Ci0gIGxpdHRsZW51bXNfbGVmdCA9ICgxCi0JCSAgICAgKyBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sZWFkZXIKLQkJICAgICAtIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvdyk7Ci0gIC8qIFNlZWsgKGFuZCBmb3JnZXQpIDFzdCBzaWduaWZpY2FudCBiaXQgKi8KLSAgZm9yIChleHBvbmVudF9za2lwcGFnZSA9IDA7ICFuZXh0X2JpdHMgKDEpOyArK2V4cG9uZW50X3NraXBwYWdlKTs7Ci0gIGV4cG9uZW50XzEgPSAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuZXhwb25lbnQKLQkJKyBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sZWFkZXIKLQkJKyAxCi0JCS0gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubG93KTsKLSAgLyogUmFkaXggTElUVExFTlVNX1JBRElYLCBwb2ludCBqdXN0IGhpZ2hlciB0aGFuCi0gICAgIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxlYWRlci4gKi8KLSAgZXhwb25lbnRfMiA9IGV4cG9uZW50XzEgKiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0gIC8qIFJhZGl4IDIuICovCi0gIGV4cG9uZW50XzMgPSBleHBvbmVudF8yIC0gZXhwb25lbnRfc2tpcHBhZ2U7Ci0gIC8qIEZvcmdldCBsZWFkaW5nIHplcm9zLCBmb3JnZXQgMXN0IGJpdC4gKi8KLSAgZXhwb25lbnRfNCA9IGV4cG9uZW50XzMgKyAoKDEgPDwgKGV4cG9uZW50X2JpdHMgLSAxKSkgLSAyKTsKLSAgLyogT2Zmc2V0IGV4cG9uZW50LiAqLwotCi0gIGxwID0gd29yZHM7Ci0KLSAgLyogV29yZCAxLiBTaWduLCBleHBvbmVudCBhbmQgcGVyaGFwcyBoaWdoIGJpdHMuICovCi0gIHdvcmQxID0gKChnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID09ICcrJykKLQkgICA/IDAKLQkgICA6ICgxIDw8IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSkpOwotCi0gIC8qIEFzc3VtZSAyJ3MgY29tcGxlbWVudCBpbnRlZ2Vycy4gKi8KLSAgaWYgKGV4cG9uZW50XzQgPD0gMCkKLSAgICB7Ci0gICAgICBpbnQgcHJlY19iaXRzOwotICAgICAgaW50IG51bV9iaXRzOwotCi0gICAgICB1bmdldF9iaXRzICgxKTsKLSAgICAgIG51bV9iaXRzID0gLWV4cG9uZW50XzQ7Ci0gICAgICBwcmVjX2JpdHMgPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgKiBwcmVjaXNpb24gLSAoZXhwb25lbnRfYml0cyArIDEgKyBudW1fYml0cyk7Ci0jaWZkZWYgVENfSTM4NgotICAgICAgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTiAmJiBleHBvbmVudF9iaXRzID09IDE1KQotCXsKLQkgIC8qIE9uIHRoZSBpMzg2IGEgZGVub3JtYWxpemVkIGV4dGVuZGVkIHByZWNpc2lvbiBmbG9hdCBpcwotCSAgICAgc2hpZnRlZCBkb3duIGJ5IG9uZSwgZWZmZWN0aXZlbHkgZGVjcmVhc2luZyB0aGUgZXhwb25lbnQKLQkgICAgIGJpYXMgYnkgb25lLiAgKi8KLQkgIHByZWNfYml0cyAtPSAxOwotCSAgbnVtX2JpdHMgKz0gMTsKLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKG51bV9iaXRzID49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIGV4cG9uZW50X2JpdHMpCi0JewotCSAgLyogQmlnZ2VyIHRoYW4gb25lIGxpdHRsZW51bSAqLwotCSAgbnVtX2JpdHMgLT0gKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpIC0gZXhwb25lbnRfYml0czsKLQkgICpscCsrID0gd29yZDE7Ci0JICBpZiAobnVtX2JpdHMgKyBleHBvbmVudF9iaXRzICsgMSA+IHByZWNpc2lvbiAqIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkgICAgewotCSAgICAgIC8qIEV4cG9uZW50IG92ZXJmbG93ICovCi0JICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCSAgICAgIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLQkgICAgfQotI2lmZGVmIFRDX002OEsKLQkgIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04gJiYgZXhwb25lbnRfYml0cyA9PSAxNSkKLQkgICAgKmxwKysgPSAwOwotI2VuZGlmCi0JICB3aGlsZSAobnVtX2JpdHMgPj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCSAgICB7Ci0JICAgICAgbnVtX2JpdHMgLT0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCSAgICAgICpscCsrID0gMDsKLQkgICAgfQotCSAgaWYgKG51bV9iaXRzKQotCSAgICAqbHArKyA9IG5leHRfYml0cyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gKG51bV9iaXRzKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04gJiYgZXhwb25lbnRfYml0cyA9PSAxNSkKLQkgICAgewotCSAgICAgICpscCsrID0gd29yZDE7Ci0jaWZkZWYgVENfTTY4SwotCSAgICAgICpscCsrID0gMDsKLSNlbmRpZgotCSAgICAgICpscCsrID0gbmV4dF9iaXRzIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSBudW1fYml0cyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHdvcmQxIHw9IG5leHRfYml0cyAoKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpIC0gKGV4cG9uZW50X2JpdHMgKyBudW1fYml0cykpOwotCSAgICAgICpscCsrID0gd29yZDE7Ci0JICAgIH0KLQl9Ci0gICAgICB3aGlsZSAobHAgPCB3b3Jkc19lbmQpCi0JKmxwKysgPSBuZXh0X2JpdHMgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyk7Ci0KLSAgICAgIC8qIFJvdW5kIHRoZSBtYW50aXNzYSB1cCwgYnV0IGRvbid0IGNoYW5nZSB0aGUgbnVtYmVyICovCi0gICAgICBpZiAobmV4dF9iaXRzICgxKSkKLQl7Ci0JICAtLWxwOwotCSAgaWYgKHByZWNfYml0cyA+PSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JICAgIHsKLQkgICAgICBpbnQgbiA9IDA7Ci0JICAgICAgaW50IHRtcF9iaXRzOwotCi0JICAgICAgbiA9IDA7Ci0JICAgICAgdG1wX2JpdHMgPSBwcmVjX2JpdHM7Ci0JICAgICAgd2hpbGUgKHRtcF9iaXRzID4gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCQl7Ci0JCSAgaWYgKGxwW25dICE9IChMSVRUTEVOVU1fVFlQRSkgLSAxKQotCQkgICAgYnJlYWs7Ci0JCSAgLS1uOwotCQkgIHRtcF9iaXRzIC09IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkJfQotCSAgICAgIGlmICh0bXBfYml0cyA+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUwotCQkgIHx8IChscFtuXSAmIG1hc2tbdG1wX2JpdHNdKSAhPSBtYXNrW3RtcF9iaXRzXQotCQkgIHx8IChwcmVjX2JpdHMgIT0gKHByZWNpc2lvbiAqIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUwotCQkJCSAgICAtIGV4cG9uZW50X2JpdHMgLSAxKQotI2lmZGVmIFRDX0kzODYKLQkJICAgICAgLyogQW4gZXh0ZW5kZWQgcHJlY2lzaW9uIGZsb2F0IHdpdGggb25seSB0aGUgaW50ZWdlcgotCQkJIGJpdCBzZXQgd291bGQgYmUgaW52YWxpZC4gIFRoYXQgbXVzdCBiZSBjb252ZXJ0ZWQKLQkJCSB0byB0aGUgc21hbGxlc3Qgbm9ybWFsaXplZCBudW1iZXIuICAqLwotCQkgICAgICAmJiAhKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTgotCQkJICAgJiYgcHJlY19iaXRzID09IChwcmVjaXNpb24gKiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMKLQkJCQkJICAgIC0gZXhwb25lbnRfYml0cyAtIDIpKQotI2VuZGlmCi0JCSAgICAgICkpCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIGNhcnJ5OwotCi0JCSAgZm9yIChjYXJyeSA9IDE7IGNhcnJ5ICYmIChscCA+PSB3b3Jkcyk7IGxwLS0pCi0JCSAgICB7Ci0JCSAgICAgIGNhcnJ5ID0gKmxwICsgY2Fycnk7Ci0JCSAgICAgICpscCA9IGNhcnJ5OwotCQkgICAgICBjYXJyeSA+Pj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhbiBvdmVyZmxvdyBvZiB0aGUgZGVub3JtYWwgbnVtYmVycy4gIFdlCi0gICAgICAgICAgICAgICAgICAgICBuZWVkIHRvIGZvcmdldCB3aGF0IHdlIGhhdmUgcHJvZHVjZWQsIGFuZCBpbnN0ZWFkCi0gICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSB0aGUgc21hbGxlc3Qgbm9ybWFsaXplZCBudW1iZXIuICAqLwotCQkgIGxwID0gd29yZHM7Ci0JCSAgd29yZDEgPSAoKGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLnNpZ24gPT0gJysnKQotCQkJICAgPyAwCi0JCQkgICA6ICgxIDw8IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSkpOwotCQkgIHdvcmQxIHw9ICgxCi0JCQkgICAgPDwgKChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKQotCQkJCS0gZXhwb25lbnRfYml0cykpOwotCQkgICpscCsrID0gd29yZDE7Ci0jaWZkZWYgVENfSTM4NgotCQkgIC8qIFNldCB0aGUgaW50ZWdlciBiaXQgaW4gdGhlIGV4dGVuZGVkIHByZWNpc2lvbiBmb3JtYXQuCi0JCSAgICAgVGhpcyBjYW5ub3QgaGFwcGVuIG9uIHRoZSBtNjhrIHdoZXJlIHRoZSBtYW50aXNzYQotCQkgICAgIGp1c3Qgb3ZlcmZsb3dzIGludG8gdGhlIGludGVnZXIgYml0IGFib3ZlLiAgKi8KLQkJICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OKQotCQkgICAgKmxwKysgPSAxIDw8IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKTsKLSNlbmRpZgotCQkgIHdoaWxlIChscCA8IHdvcmRzX2VuZCkKLQkJICAgICpscCsrID0gMDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgICpscCArPSAxOwotCX0KLQotICAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKCh1bnNpZ25lZCBsb25nKSBleHBvbmVudF80ID49IG1hc2tbZXhwb25lbnRfYml0c10pCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIEV4cG9uZW50IG92ZXJmbG93LiBMb3NlIGltbWVkaWF0ZWx5LgotICAgICAgICovCi0KLSAgICAgIC8qCi0gICAgICAgKiBXZSBsZWF2ZSByZXR1cm5fdmFsdWUgYWxvbmU6IGFkbWl0IHdlIHJlYWQgdGhlCi0gICAgICAgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KLSAgICAgICAqIGJlY2F1c2Ugd2UgY2FuJ3QgZW5jb2RlIHRoZSBudW1iZXIuCi0gICAgICAgKi8KLSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLSAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgd29yZDEgfD0gKGV4cG9uZW50XzQgPDwgKChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSAtIGV4cG9uZW50X2JpdHMpKQotCXwgbmV4dF9iaXRzICgoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkgLSBleHBvbmVudF9iaXRzKTsKLSAgICB9Ci0KLSAgKmxwKysgPSB3b3JkMTsKLQotICAvKiBYX1BSRUNJU0lPTiBpcyBzcGVjaWFsOiBvbiB0aGUgNjhrLCBpdCBoYXMgMTYgYml0cyBvZiB6ZXJvIGluIHRoZQotICAgICBtaWRkbGUuICBFaXRoZXIgd2F5LCBpdCBpcyB0aGVuIGZvbGxvd2VkIGJ5IGEgMSBiaXQuICovCi0gIGlmIChleHBvbmVudF9iaXRzID09IDE1ICYmIHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKLSAgICB7Ci0jaWZkZWYgVENfTTY4SwotICAgICAgKmxwKysgPSAwOwotI2VuZGlmCi0gICAgICAqbHArKyA9ICgxIDw8IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKQotCSAgICAgICB8IG5leHRfYml0cyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpOwotICAgIH0KLQotICAvKiBUaGUgcmVzdCBvZiB0aGUgd29yZHMgYXJlIGp1c3QgbWFudGlzc2EgYml0cy4gKi8KLSAgd2hpbGUgKGxwIDwgd29yZHNfZW5kKQotICAgICpscCsrID0gbmV4dF9iaXRzIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpOwotCi0gIGlmIChuZXh0X2JpdHMgKDEpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgY2Fycnk7Ci0gICAgICAvKgotICAgICAgICogU2luY2UgdGhlIE5FWFQgYml0IGlzIGEgMSwgcm91bmQgVVAgdGhlIG1hbnRpc3NhLgotICAgICAgICogVGhlIGN1bm5pbmcgZGVzaWduIG9mIHRoZXNlIGhpZGRlbi0xIGZsb2F0cyBwZXJtaXRzCi0gICAgICAgKiB1cyB0byBsZXQgdGhlIG1hbnRpc3NhIG92ZXJmbG93IGludG8gdGhlIGV4cG9uZW50LCBhbmQKLSAgICAgICAqIGl0ICdkb2VzIHRoZSByaWdodCB0aGluZycuIEhvd2V2ZXIsIHdlIGxvc2UgaWYgdGhlCi0gICAgICAgKiBoaWdoZXN0LW9yZGVyIGJpdCBvZiB0aGUgbG93ZXN0LW9yZGVyIHdvcmQgZmxpcHMuCi0gICAgICAgKiBJcyB0aGF0IGNsZWFyPwotICAgICAgICovCi0KLSAgICAgIC8qICNpZiAoc2l6ZW9mKGNhcnJ5KSkgPCAoKHNpemVvZihiaXRzWzBdKSAqIEJJVFNfUEVSX0NIQVIpICsgMikKLQkgUGxlYXNlIGFsbG93IGF0IGxlYXN0IDEgbW9yZSBiaXQgaW4gY2FycnkgdGhhbiBpcyBpbiBhIExJVFRMRU5VTS4KLQkgV2UgbmVlZCB0aGF0IGV4dHJhIGJpdCB0byBob2xkIGEgY2FycnkgZHVyaW5nIGEgTElUVExFTlVNIGNhcnJ5Ci0JIHByb3BhZ2F0aW9uLiBBbm90aGVyIGV4dHJhIGJpdCAoa2VwdCAwKSB3aWxsIGFzc3VyZSB1cyB0aGF0IHdlCi0JIGRvbid0IGdldCBhIHN0aWNreSBzaWduIGJpdCBhZnRlciBzaGlmdGluZyByaWdodCwgYW5kIHRoYXQKLQkgcGVybWl0cyB1cyB0byBwcm9wYWdhdGUgdGhlIGNhcnJ5IHdpdGhvdXQgYW55IG1hc2tpbmcgb2YgYml0cy4KLQkgI2VuZGlmICovCi0gICAgICBmb3IgKGNhcnJ5ID0gMSwgbHAtLTsgY2FycnkgJiYgKGxwID49IHdvcmRzKTsgbHAtLSkKLQl7Ci0JICBjYXJyeSA9ICpscCArIGNhcnJ5OwotCSAgKmxwID0gY2Fycnk7Ci0JICBjYXJyeSA+Pj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCX0KLSAgICAgIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04gJiYgZXhwb25lbnRfYml0cyA9PSAxNSkKLQl7Ci0JICAvKiBFeHRlbmRlZCBwcmVjaXNpb24gbnVtYmVycyBoYXZlIGFuIGV4cGxpY2l0IGludGVnZXIgYml0Ci0JICAgICB0aGF0IHdlIG1heSBoYXZlIHRvIHJlc3RvcmUuICAqLwotCSAgaWYgKGxwID09IHdvcmRzKQotCSAgICB7Ci0jaWZkZWYgVENfTTY4SwotCSAgICAgIC8qIE9uIHRoZSBtNjhrIHRoZXJlIGlzIGEgZ2FwIG9mIDE2IGJpdHMuICBXZSBtdXN0Ci0JCSBleHBsaWNpdGx5IHByb3BhZ2F0ZSB0aGUgY2FycnkgaW50byB0aGUgZXhwb25lbnQuICovCi0JICAgICAgd29yZHNbMF0gKz0gd29yZHNbMV07Ci0JICAgICAgd29yZHNbMV0gPSAwOwotCSAgICAgIGxwKys7Ci0jZW5kaWYKLQkgICAgICAvKiBQdXQgYmFjayB0aGUgaW50ZWdlciBiaXQuICAqLyAKLQkgICAgICBscFsxXSB8PSAxIDw8IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKTsKLQkgICAgfQotIAl9Ci0gICAgICBpZiAoKHdvcmQxIF4gKndvcmRzKSAmICgxIDw8IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSkpCi0JewotCSAgLyogV2UgbGVhdmUgcmV0dXJuX3ZhbHVlIGFsb25lOiBhZG1pdCB3ZSByZWFkIHRoZQotCSAgICogbnVtYmVyLCBidXQgcmV0dXJuIGEgZmxvYXRpbmcgZXhjZXB0aW9uCi0JICAgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgotCSAgICovCi0JICAqd29yZHMgJj0gfigxIDw8IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSk7Ci0JICAvKiBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7ICovCi0JICAvKiByZXR1cm4gcmV0dXJuX3ZhbHVlOyAqLwotCX0KLSAgICB9Ci0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0KLQotI2lmIDAgLyogdW51c2VkICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgYSByZWFsIGtsdWRnZS4gIFNvbWVvbmUgcmVhbGx5IHNob3VsZCBkbyBpdCBiZXR0ZXIsCi0gICBidXQgSSdtIHRvbyBsYXp5LCBhbmQgSSBkb24ndCB1bmRlcnN0YW5kIHRoaXMgc3R1ZmYgYWxsIHRvbyB3ZWxsCi0gICBhbnl3YXkuIChKRikgICovCi1zdGF0aWMgdm9pZAotaW50X3RvX2dlbiAoeCkKLSAgICAgbG9uZyB4OwotewotICBjaGFyIGJ1ZlsyMF07Ci0gIGNoYXIgKmJ1ZnA7Ci0KLSAgc3ByaW50ZiAoYnVmLCAiJWxkIiwgeCk7Ci0gIGJ1ZnAgPSAmYnVmWzBdOwotICBpZiAoYXRvZl9nZW5lcmljICgmYnVmcCwgIi4iLCBFWFBfQ0hBUlMsICZnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcikpCi0gICAgYXNfYmFkIChfKCJFcnJvciBjb252ZXJ0aW5nIG51bWJlciB0byBmbG9hdGluZyBwb2ludCAoRXhwb25lbnQgb3ZlcmZsb3c/KSIpKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgVEVTVAotY2hhciAqCi1wcmludF9nZW4gKGdlbikKLSAgICAgRkxPTlVNX1RZUEUgKmdlbjsKLXsKLSAgRkxPTlVNX1RZUEUgZjsKLSAgTElUVExFTlVNX1RZUEUgYXJyWzEwXTsKLSAgZG91YmxlIGR2OwotICBmbG9hdCBmdjsKLSAgc3RhdGljIGNoYXIgc2J1Zls0MF07Ci0KLSAgaWYgKGdlbikKLSAgICB7Ci0gICAgICBmID0gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXI7Ci0gICAgICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciA9ICpnZW47Ci0gICAgfQotICBnZW5fdG9fd29yZHMgKCZhcnJbMF0sIDQsIDExKTsKLSAgbWVtY3B5ICgmZHYsICZhcnJbMF0sIHNpemVvZiAoZG91YmxlKSk7Ci0gIHNwcmludGYgKHNidWYsICIleCAleCAleCAleCAlLjE0RyAgICIsIGFyclswXSwgYXJyWzFdLCBhcnJbMl0sIGFyclszXSwgZHYpOwotICBnZW5fdG9fd29yZHMgKCZhcnJbMF0sIDIsIDgpOwotICBtZW1jcHkgKCZmdiwgJmFyclswXSwgc2l6ZW9mIChmbG9hdCkpOwotICBzcHJpbnRmIChzYnVmICsgc3RybGVuIChzYnVmKSwgIiV4ICV4ICUuMTJnXG4iLCBhcnJbMF0sIGFyclsxXSwgZnYpOwotCi0gIGlmIChnZW4pCi0gICAgewotICAgICAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgPSBmOwotICAgIH0KLQotICByZXR1cm4gKHNidWYpOwotfQotCi0jZW5kaWYKLQotLyogZW5kIG9mIGF0b2YtaWVlZS5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL2F0b2YtdGFob2UuYyBiL2dhcy9jb25maWcvYXRvZi10YWhvZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjA0ODVjLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvYXRvZi10YWhvZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMxICswLDAgQEAKLQotLyogYXRvZl90YWhvZS5jIC0gdHVybiBhIHN0cmluZyBpbnRvIGEgVGFob2UgZmxvYXRpbmcgcG9pbnQgbnVtYmVyCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAqLwotCi0vKiBUaGlzIGlzIHJlYWxseSBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiBhdG9mX3ZheC5jLiBJIGdsb21tZWQgaXQgd2hvbGVzYWxlCi0gICBhbmQgdGhlbiBzaGF2ZWQgaXQgZG93bi4gSSBkb24ndCBldmVuIGtub3cgaG93IGl0IHdvcmtzLiAoRG9uJ3QgeW91IGZpbmQKLSAgIG15IGhvbmVzdHkgcmVmcmVzaGluZz8gIGJvd2VuQGNzLkJ1ZmZhbG8uRURVIChEZXZvbiBFIEJvd2VuKQotCi0gICBJIGRvbid0IGFsbG93IHVwcGVyY2FzZSBsZXR0ZXJzIGluIHRoZSBwcmVjaXNpb24gZGVzY3JwaXRvcnMuIEllICdmJyBhbmQKLSAgICdkJyBhcmUgYWxsb3dlZCBidXQgJ0YnIGFuZCAnRCcgYXJlbid0ICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi0vKiBQcmVjaXNpb24gaW4gTGl0dGxlTnVtcy4gKi8KLSNkZWZpbmUgTUFYX1BSRUNJU0lPTiAoNCkKLSNkZWZpbmUgRF9QUkVDSVNJT04gKDQpCi0jZGVmaW5lIEZfUFJFQ0lTSU9OICgyKQotCi0vKiBQcmVjaXNpb24gaW4gY2hhcnMuICovCi0jZGVmaW5lIERfUFJFQ0lTSU9OX0NIQVJTICg4KQotI2RlZmluZSBGX1BSRUNJU0lPTl9DSEFSUyAoNCkKLQotLyogTGVuZ3RoIGluIExpdHRsZU51bXMgb2YgZ3VhcmQgYml0cy4gKi8KLSNkZWZpbmUgR1VBUkQgKDIpCi0KLXN0YXRpYyBjb25zdCBsb25nIGludCBtYXNrW10gPQotewotICAweDAwMDAwMDAwLAotICAweDAwMDAwMDAxLAotICAweDAwMDAwMDAzLAotICAweDAwMDAwMDA3LAotICAweDAwMDAwMDBmLAotICAweDAwMDAwMDFmLAotICAweDAwMDAwMDNmLAotICAweDAwMDAwMDdmLAotICAweDAwMDAwMGZmLAotICAweDAwMDAwMWZmLAotICAweDAwMDAwM2ZmLAotICAweDAwMDAwN2ZmLAotICAweDAwMDAwZmZmLAotICAweDAwMDAxZmZmLAotICAweDAwMDAzZmZmLAotICAweDAwMDA3ZmZmLAotICAweDAwMDBmZmZmLAotICAweDAwMDFmZmZmLAotICAweDAwMDNmZmZmLAotICAweDAwMDdmZmZmLAotICAweDAwMGZmZmZmLAotICAweDAwMWZmZmZmLAotICAweDAwM2ZmZmZmLAotICAweDAwN2ZmZmZmLAotICAweDAwZmZmZmZmLAotICAweDAxZmZmZmZmLAotICAweDAzZmZmZmZmLAotICAweDA3ZmZmZmZmLAotICAweDBmZmZmZmZmLAotICAweDFmZmZmZmZmLAotICAweDNmZmZmZmZmLAotICAweDdmZmZmZmZmLAotICAweGZmZmZmZmZmCi19OwotDAotCi0vKiBTaGFyZWQgYmV0d2VlbiBmbG9udW1fZ2VuMnRhaG9lIGFuZCBuZXh0X2JpdHMgKi8KLXN0YXRpYyBpbnQgYml0c19sZWZ0X2luX2xpdHRsZW51bTsKLXN0YXRpYyBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtX3BvaW50ZXI7Ci1zdGF0aWMgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9lbmQ7Ci0KLSNpZiBfX1NURENfXyA9PSAxCi0KLWludCBmbG9udW1fZ2VuMnRhaG9lIChpbnQgZm9ybWF0X2xldHRlciwgRkxPTlVNX1RZUEUgKiBmLCBMSVRUTEVOVU1fVFlQRSAqIHdvcmRzKTsKLQotI2Vsc2UgLyogbm90IF9fU1REQ19fICovCi0KLWludCBmbG9udW1fZ2VuMnRhaG9lICgpOwotCi0jZW5kaWYgLyogbm90IF9fU1REQ19fICovCi0KLQotc3RhdGljIGludAotbmV4dF9iaXRzIChudW1iZXJfb2ZfYml0cykKLSAgICAgaW50IG51bWJlcl9vZl9iaXRzOwotewotICBpbnQgcmV0dXJuX3ZhbHVlOwotCi0gIGlmIChsaXR0bGVudW1fcG9pbnRlciA8IGxpdHRsZW51bV9lbmQpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChudW1iZXJfb2ZfYml0cyA+PSBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKQotICAgIHsKLSAgICAgIHJldHVybl92YWx1ZSA9IG1hc2tbYml0c19sZWZ0X2luX2xpdHRsZW51bV0gJiAqbGl0dGxlbnVtX3BvaW50ZXI7Ci0gICAgICBudW1iZXJfb2ZfYml0cyAtPSBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtOwotICAgICAgcmV0dXJuX3ZhbHVlIDw8PSBudW1iZXJfb2ZfYml0czsKLSAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSBudW1iZXJfb2ZfYml0czsKLSAgICAgIGxpdHRsZW51bV9wb2ludGVyLS07Ci0gICAgICBpZiAobGl0dGxlbnVtX3BvaW50ZXIgPj0gbGl0dGxlbnVtX2VuZCkKLQlyZXR1cm5fdmFsdWUgfD0gKCgqbGl0dGxlbnVtX3BvaW50ZXIpID4+IChiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKSkgJgotCSAgbWFza1tudW1iZXJfb2ZfYml0c107Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSAtPSBudW1iZXJfb2ZfYml0czsKLSAgICAgIHJldHVybl92YWx1ZSA9IG1hc2tbbnVtYmVyX29mX2JpdHNdICYKLQkoKCpsaXR0bGVudW1fcG9pbnRlcikgPj4gYml0c19sZWZ0X2luX2xpdHRsZW51bSk7Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3JkcykKLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwotewotICAqd29yZHMgPSAweDgwMDA7CQkvKiBGbG9hdGluZyBSZXNlcnZlZCBPcGVyYW5kIENvZGUgKi8KLX0KLQwKLXN0YXRpYyBpbnQJCQkvKiAwIG1lYW5zIGxldHRlciBpcyBPSy4gKi8KLXdoYXRfa2luZF9vZl9mbG9hdCAobGV0dGVyLCBwcmVjaXNpb25QLCBleHBvbmVudF9iaXRzUCkKLSAgICAgY2hhciBsZXR0ZXI7CQkvKiBJbjogbG93ZXJjYXNlIHBsZWFzZS4gV2hhdCBraW5kIG9mIGZsb2F0PyAqLwotICAgICBpbnQgKnByZWNpc2lvblA7CQkvKiBOdW1iZXIgb2YgMTYtYml0IHdvcmRzIGluIHRoZSBmbG9hdC4gKi8KLSAgICAgbG9uZyBpbnQgKmV4cG9uZW50X2JpdHNQOwkvKiBOdW1iZXIgb2YgZXhwb25lbnQgYml0cy4gKi8KLXsKLSAgaW50IHJldHZhbDsJCQkvKiAwOiBPSy4gKi8KLQotICByZXR2YWwgPSAwOwotICBzd2l0Y2ggKGxldHRlcikKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICAqcHJlY2lzaW9uUCA9IEZfUFJFQ0lTSU9OOwotICAgICAgKmV4cG9uZW50X2JpdHNQID0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICAqcHJlY2lzaW9uUCA9IERfUFJFQ0lTSU9OOwotICAgICAgKmV4cG9uZW50X2JpdHNQID0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHZhbCA9IDY5OwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gKHJldHZhbCk7Ci19Ci0MCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qCQkJCQkJCQkJKgotKglXYXJuaW5nOiB0aGlzIHJldHVybnMgMTYtYml0IExJVFRMRU5VTXMsIGJlY2F1c2UgdGhhdCBpcwkqCi0qCXdoYXQgdGhlIFZBWCB0aGlua3MgaW4uIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gZmlndXJlCSoKLSoJb3V0IGFueSBhbGlnbm1lbnQgcHJvYmxlbXMgYW5kIHRvIGNvbnNwaXJlIGZvciB0aGUgYnl0ZXMvd29yZAkqCi0qCXRvIGJlIGVtaXR0ZWQgaW4gdGhlIHJpZ2h0IG9yZGVyLiBCaWdlbmRpYW5zIGJld2FyZSEJCSoKLSoJCQkJCQkJCQkqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWNoYXIgKgkJCQkvKiBSZXR1cm4gcG9pbnRlciBwYXN0IHRleHQgY29uc3VtZWQuICovCi1hdG9mX3RhaG9lIChzdHIsIHdoYXRfa2luZCwgd29yZHMpCi0gICAgIGNoYXIgKnN0cjsJCQkvKiBUZXh0IHRvIGNvbnZlcnQgdG8gYmluYXJ5LiAqLwotICAgICBjaGFyIHdoYXRfa2luZDsJCS8qICdkJywgJ2YnLCAnZycsICdoJyAqLwotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7CS8qIEJ1aWxkIHRoZSBiaW5hcnkgaGVyZS4gKi8KLXsKLSAgRkxPTlVNX1RZUEUgZjsKLSAgTElUVExFTlVNX1RZUEUgYml0c1tNQVhfUFJFQ0lTSU9OICsgTUFYX1BSRUNJU0lPTiArIEdVQVJEXTsKLSAgLyogRXh0cmEgYml0cyBmb3IgemVyb2VkIGxvdy1vcmRlciBiaXRzLiAqLwotICAvKiBUaGUgMXN0IE1BWF9QUkVDSVNJT04gYXJlIHplcm9lZCwgKi8KLSAgLyogdGhlIGxhc3QgY29udGFpbiBmbG9udW0gYml0cy4gKi8KLSAgY2hhciAqcmV0dXJuX3ZhbHVlOwotICBpbnQgcHJlY2lzaW9uOwkJLyogTnVtYmVyIG9mIDE2LWJpdCB3b3JkcyBpbiB0aGUgZm9ybWF0LiAqLwotICBsb25nIGludCBleHBvbmVudF9iaXRzOwotCi0gIHJldHVybl92YWx1ZSA9IHN0cjsKLSAgZi5sb3cgPSBiaXRzICsgTUFYX1BSRUNJU0lPTjsKLSAgZi5oaWdoID0gTlVMTDsKLSAgZi5sZWFkZXIgPSBOVUxMOwotICBmLmV4cG9uZW50ID0gTlVMTDsKLSAgZi5zaWduID0gJ1wwJzsKLQotICBpZiAod2hhdF9raW5kX29mX2Zsb2F0ICh3aGF0X2tpbmQsICZwcmVjaXNpb24sICZleHBvbmVudF9iaXRzKSkKLSAgICB7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBOVUxMOwkvKiBXZSBsb3N0LiAqLwotICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotICAgIH0KLSAgaWYgKHJldHVybl92YWx1ZSkKLSAgICB7Ci0gICAgICBtZW1zZXQgKGJpdHMsICdcMCcsIHNpemVvZiAoTElUVExFTlVNX1RZUEUpICogTUFYX1BSRUNJU0lPTik7Ci0KLSAgICAgIC8qIFVzZSBtb3JlIExpdHRsZU51bXMgdGhhbiBzZWVtcyAqLwotICAgICAgLyogbmVjZXNzYXJ5OiB0aGUgaGlnaGVzdCBmbG9udW0gbWF5IGhhdmUgKi8KLSAgICAgIC8qIDE1IGxlYWRpbmcgMCBiaXRzLCBzbyBjb3VsZCBiZSB1c2VsZXNzLiAqLwotICAgICAgZi5oaWdoID0gZi5sb3cgKyBwcmVjaXNpb24gLSAxICsgR1VBUkQ7Ci0KLSAgICAgIGlmIChhdG9mX2dlbmVyaWMgKCZyZXR1cm5fdmFsdWUsICIuIiwgImVFIiwgJmYpKQotCXsKLQkgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLQkgIHJldHVybl92YWx1ZSA9IE5VTEw7CS8qIHdlIGxvc3QgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGZsb251bV9nZW4ydGFob2UgKHdoYXRfa2luZCwgJmYsIHdvcmRzKSkKLQkgICAgewotCSAgICAgIHJldHVybl92YWx1ZSA9IE5VTEw7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19Ci0MCi0vKgotICogSW46IGEgZmxvbnVtLCBhIFRhaG9lIGZsb2F0aW5nIHBvaW50IGZvcm1hdC4KLSAqIE91dDogYSBUYWhvZSBmbG9hdGluZy1wb2ludCBiaXQgcGF0dGVybi4KLSAqLwotCi1pbnQJCQkJLyogMDogT0suICovCi1mbG9udW1fZ2VuMnRhaG9lIChmb3JtYXRfbGV0dGVyLCBmLCB3b3JkcykKLSAgICAgY2hhciBmb3JtYXRfbGV0dGVyOwkvKiBPbmUgb2YgJ2QnICdmJy4gKi8KLSAgICAgRkxPTlVNX1RZUEUgKmY7Ci0gICAgIExJVFRMRU5VTV9UWVBFICp3b3JkczsJLyogRGVsaXZlciBhbnN3ZXIgaGVyZS4gKi8KLXsKLSAgTElUVExFTlVNX1RZUEUgKmxwOwotICBpbnQgcHJlY2lzaW9uOwotICBsb25nIGludCBleHBvbmVudF9iaXRzOwotICBpbnQgcmV0dXJuX3ZhbHVlOwkJLyogMCA9PSBPSy4gKi8KLQotICByZXR1cm5fdmFsdWUgPSB3aGF0X2tpbmRfb2ZfZmxvYXQgKGZvcm1hdF9sZXR0ZXIsICZwcmVjaXNpb24sICZleHBvbmVudF9iaXRzKTsKLSAgaWYgKHJldHVybl92YWx1ZSAhPSAwKQotICAgIHsKLSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZi0+bG93ID4gZi0+bGVhZGVyKQotCXsKLQkgIC8qIDAuMGUwIHNlZW4uICovCi0JICBtZW1zZXQgKHdvcmRzLCAnXDAnLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSAqIHByZWNpc2lvbik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxvbmcgaW50IGV4cG9uZW50XzE7Ci0JICBsb25nIGludCBleHBvbmVudF8yOwotCSAgbG9uZyBpbnQgZXhwb25lbnRfMzsKLQkgIGxvbmcgaW50IGV4cG9uZW50XzQ7Ci0JICBpbnQgZXhwb25lbnRfc2tpcHBhZ2U7Ci0JICBMSVRUTEVOVU1fVFlQRSB3b3JkMTsKLQotCSAgLyogSkY6IERlYWwgd2l0aCBuZXcgTmFuLCArSW5mIGFuZCAtSW5mIGNvZGVzICovCi0JICBpZiAoZi0+c2lnbiAhPSAnLScgJiYgZi0+c2lnbiAhPSAnKycpCi0JICAgIHsKLQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0JICAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKLQkgICAgfQotCSAgLyoKLQkgICAqIEFsbCB0YWhvZSBmbG9hdGluZ19wb2ludCBmb3JtYXRzIGhhdmU6Ci0JICAgKiBCaXQgMTUgaXMgc2lnbiBiaXQuCi0JICAgKiBCaXRzIDE0Om4gYXJlIGV4Y2Vzcy13aGF0ZXZlciBleHBvbmVudC4KLQkgICAqIEJpdHMgbi0xOjAgKGlmIGFueSkgYXJlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiBmcmFjdGlvbi4KLQkgICAqIEJpdHMgMTU6MCBvZiB0aGUgbmV4dCB3b3JkIGFyZSB0aGUgbmV4dCBtb3N0IHNpZ25pZmljYW50IGJpdHMuCi0JICAgKiBBbmQgc28gb24gZm9yIGVhY2ggb3RoZXIgd29yZC4KLQkgICAqCi0JICAgKiBTbyB3ZSBuZWVkOiBudW1iZXIgb2YgYml0cyBvZiBleHBvbmVudCwgbnVtYmVyIG9mIGJpdHMgb2YKLQkgICAqIG1hbnRpc3NhLgotCSAgICovCi0KLQkgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JICBsaXR0bGVudW1fcG9pbnRlciA9IGYtPmxlYWRlcjsKLQkgIGxpdHRsZW51bV9lbmQgPSBmLT5sb3c7Ci0JICAvKiBTZWVrIChhbmQgZm9yZ2V0KSAxc3Qgc2lnbmlmaWNhbnQgYml0ICovCi0JICBmb3IgKGV4cG9uZW50X3NraXBwYWdlID0gMDsKLQkgICAgICAgIW5leHRfYml0cyAoMSk7Ci0JICAgICAgIGV4cG9uZW50X3NraXBwYWdlKyspCi0JICAgIHsKLQkgICAgfQotCSAgZXhwb25lbnRfMSA9IGYtPmV4cG9uZW50ICsgZi0+bGVhZGVyICsgMSAtIGYtPmxvdzsKLQkgIC8qIFJhZGl4IExJVFRMRU5VTV9SQURJWCwgcG9pbnQganVzdCBoaWdoZXIgdGhhbiBmIC0+IGxlYWRlci4gKi8KLQkgIGV4cG9uZW50XzIgPSBleHBvbmVudF8xICogTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCSAgLyogUmFkaXggMi4gKi8KLQkgIGV4cG9uZW50XzMgPSBleHBvbmVudF8yIC0gZXhwb25lbnRfc2tpcHBhZ2U7Ci0JICAvKiBGb3JnZXQgbGVhZGluZyB6ZXJvcywgZm9yZ2V0IDFzdCBiaXQuICovCi0JICBleHBvbmVudF80ID0gZXhwb25lbnRfMyArICgxIDw8IChleHBvbmVudF9iaXRzIC0gMSkpOwotCSAgLyogT2Zmc2V0IGV4cG9uZW50LiAqLwotCi0JICBpZiAoZXhwb25lbnRfNCAmIH5tYXNrW2V4cG9uZW50X2JpdHNdKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBFeHBvbmVudCBvdmVyZmxvdy4gTG9zZSBpbW1lZGlhdGVseS4KLQkgICAgICAgKi8KLQotCSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLQotCSAgICAgIC8qCi0JICAgICAgICogV2UgbGVhdmUgcmV0dXJuX3ZhbHVlIGFsb25lOiBhZG1pdCB3ZSByZWFkIHRoZQotCSAgICAgICAqIG51bWJlciwgYnV0IHJldHVybiBhIGZsb2F0aW5nIGV4Y2VwdGlvbgotCSAgICAgICAqIGJlY2F1c2Ugd2UgY2FuJ3QgZW5jb2RlIHRoZSBudW1iZXIuCi0JICAgICAgICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGxwID0gd29yZHM7Ci0KLQkgICAgICAvKiBXb3JkIDEuIFNpZ24sIGV4cG9uZW50IGFuZCBwZXJoYXBzIGhpZ2ggYml0cy4gKi8KLQkgICAgICAvKiBBc3N1bWUgMidzIGNvbXBsZW1lbnQgaW50ZWdlcnMuICovCi0JICAgICAgd29yZDEgPSAoKGV4cG9uZW50XzQgJiBtYXNrW2V4cG9uZW50X2JpdHNdKSA8PCAoMTUgLSBleHBvbmVudF9iaXRzKSkKLQkJfCAoKGYtPnNpZ24gPT0gJysnKSA/IDAgOiAweDgwMDApCi0JCXwgbmV4dF9iaXRzICgxNSAtIGV4cG9uZW50X2JpdHMpOwotCSAgICAgICpscCsrID0gd29yZDE7Ci0KLQkgICAgICAvKiBUaGUgcmVzdCBvZiB0aGUgd29yZHMgYXJlIGp1c3QgbWFudGlzc2EgYml0cy4gKi8KLQkgICAgICBmb3IgKDsgbHAgPCB3b3JkcyArIHByZWNpc2lvbjsgbHArKykKLQkJewotCQkgICpscCA9IG5leHRfYml0cyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKTsKLQkJfQotCi0JICAgICAgaWYgKG5leHRfYml0cyAoMSkpCi0JCXsKLQkJICAvKgotCQkgICAqIFNpbmNlIHRoZSBORVhUIGJpdCBpcyBhIDEsIHJvdW5kIFVQIHRoZSBtYW50aXNzYS4KLQkJICAgKiBUaGUgY3VubmluZyBkZXNpZ24gb2YgdGhlc2UgaGlkZGVuLTEgZmxvYXRzIHBlcm1pdHMKLQkJICAgKiB1cyB0byBsZXQgdGhlIG1hbnRpc3NhIG92ZXJmbG93IGludG8gdGhlIGV4cG9uZW50LCBhbmQKLQkJICAgKiBpdCAnZG9lcyB0aGUgcmlnaHQgdGhpbmcnLiBIb3dldmVyLCB3ZSBsb3NlIGlmIHRoZQotCQkgICAqIGhpZ2hlc3Qtb3JkZXIgYml0IG9mIHRoZSBsb3dlc3Qtb3JkZXIgd29yZCBmbGlwcy4KLQkJICAgKiBJcyB0aGF0IGNsZWFyPwotCQkgICAqLwotCi0JCSAgdW5zaWduZWQgbG9uZyBpbnQgY2Fycnk7Ci0KLQkJICAvKgotCQkgICAgI2lmIChzaXplb2YoY2FycnkpKSA8ICgoc2l6ZW9mKGJpdHNbMF0pICogQklUU19QRVJfQ0hBUikgKyAyKQotCQkgICAgUGxlYXNlIGFsbG93IGF0IGxlYXN0IDEgbW9yZSBiaXQgaW4gY2FycnkgdGhhbiBpcyBpbiBhIExJVFRMRU5VTS4KLQkJICAgIFdlIG5lZWQgdGhhdCBleHRyYSBiaXQgdG8gaG9sZCBhIGNhcnJ5IGR1cmluZyBhIExJVFRMRU5VTSBjYXJyeQotCQkgICAgcHJvcGFnYXRpb24uIEFub3RoZXIgZXh0cmEgYml0IChrZXB0IDApIHdpbGwgYXNzdXJlIHVzIHRoYXQgd2UKLQkJICAgIGRvbid0IGdldCBhIHN0aWNreSBzaWduIGJpdCBhZnRlciBzaGlmdGluZyByaWdodCwgYW5kIHRoYXQKLQkJICAgIHBlcm1pdHMgdXMgdG8gcHJvcGFnYXRlIHRoZSBjYXJyeSB3aXRob3V0IGFueSBtYXNraW5nIG9mIGJpdHMuCi0JCSAgICAjZW5kaWYKLQkJICAgICovCi0JCSAgZm9yIChjYXJyeSA9IDEsIGxwLS07Ci0JCSAgICAgICBjYXJyeSAmJiAobHAgPj0gd29yZHMpOwotCQkgICAgICAgbHAtLSkKLQkJICAgIHsKLQkJICAgICAgY2FycnkgPSAqbHAgKyBjYXJyeTsKLQkJICAgICAgKmxwID0gY2Fycnk7Ci0JCSAgICAgIGNhcnJ5ID4+PSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JCSAgICB9Ci0KLQkJICBpZiAoKHdvcmQxIF4gKndvcmRzKSAmICgxIDw8IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSkpCi0JCSAgICB7Ci0JCSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLQkJICAgICAgLyoKLQkJICAgICAgICogV2UgbGVhdmUgcmV0dXJuX3ZhbHVlIGFsb25lOiBhZG1pdCB3ZSByZWFkIHRoZQotCQkgICAgICAgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KLQkJICAgICAgICogYmVjYXVzZSB3ZSBjYW4ndCBlbmNvZGUgdGhlIG51bWJlci4KLQkJICAgICAgICovCi0JCSAgICB9Ci0JCX0JCS8qIGlmICh3ZSBuZWVkZWQgdG8gcm91bmQgdXApICovCi0JICAgIH0JCQkvKiBpZiAoZXhwb25lbnQgb3ZlcmZsb3cpICovCi0JfQkJCS8qIGlmICgwLjBlMCkgKi8KLSAgICB9CQkJCS8qIGlmIChmbG9hdF90eXBlIHdhcyBPSykgKi8KLSAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotfQotDAotLyoKLSAqCQltZF9hdG9mKCkKLSAqCi0gKiBJbjoJaW5wdXRfbGluZV9wb2ludGVyIC0+IHRoZSAxc3QgY2hhcmFjdGVyIG9mIGEgZmxvYXRpbmctcG9pbnQKLSAqCQludW1iZXIuCi0gKgkxIGxldHRlciBkZW5vdGluZyB0aGUgdHlwZSBvZiBzdGF0ZW1lbnQgdGhhdCB3YW50cyBhCi0gKgkJYmluYXJ5IGZsb2F0aW5nIHBvaW50IG51bWJlciByZXR1cm5lZC4KLSAqCUFkZHJlc3Mgb2Ygd2hlcmUgdG8gYnVpbGQgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbC4KLSAqCQlBc3N1bWVkIHRvIGJlICdiaWcgZW5vdWdoJy4KLSAqCUFkZHJlc3Mgb2Ygd2hlcmUgdG8gcmV0dXJuIHNpemUgb2YgbGl0ZXJhbCAoaW4gY2hhcnMpLgotICoKLSAqIE91dDoJSW5wdXRfbGluZV9wb2ludGVyIC0+IG9mIG5leHQgY2hhciBhZnRlciBmbG9hdGluZyBudW1iZXIuCi0gKglFcnJvciBtZXNzYWdlLCBvciAwLgotICoJRmxvYXRpbmcgcG9pbnQgbGl0ZXJhbC4KLSAqCU51bWJlciBvZiBjaGFycyB3ZSB1c2VkIGZvciB0aGUgbGl0ZXJhbC4KLSAqLwotCi1jaGFyICoKLW1kX2F0b2YgKHdoYXRfc3RhdGVtZW50X3R5cGUsIGxpdGVyYWxQLCBzaXplUCkKLSAgICAgY2hhciB3aGF0X3N0YXRlbWVudF90eXBlOwotICAgICBjaGFyICpsaXRlcmFsUDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX1BSRUNJU0lPTl07Ci0gIHJlZ2lzdGVyIGNoYXIga2luZF9vZl9mbG9hdDsKLSAgcmVnaXN0ZXIgaW50IG51bWJlcl9vZl9jaGFyczsKLSAgcmVnaXN0ZXIgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9wb2ludGVyOwotCi0gIHN3aXRjaCAod2hhdF9zdGF0ZW1lbnRfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6CQkJLyogLmZmbG9hdCAqLwotICAgIGNhc2UgJ2QnOgkJCS8qIC5kZmxvYXQgKi8KLSAgICAgIGtpbmRfb2ZfZmxvYXQgPSB3aGF0X3N0YXRlbWVudF90eXBlOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAga2luZF9vZl9mbG9hdCA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9OwotCi0gIGlmIChraW5kX29mX2Zsb2F0KQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICpsaW1pdDsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gYXRvZl90YWhvZSAoaW5wdXRfbGluZV9wb2ludGVyLAotCQkJCSAgICAgICBraW5kX29mX2Zsb2F0LAotCQkJCSAgICAgICB3b3Jkcyk7Ci0gICAgICAvKgotICAgICAgICogVGhlIGF0b2ZfdGFob2UoKSBidWlsZHMgdXAgMTYtYml0IG51bWJlcnMuCi0gICAgICAgKiBTaW5jZSB0aGUgYXNzZW1ibGVyIG1heSBub3QgYmUgcnVubmluZyBvbgotICAgICAgICogYSBkaWZmZXJlbnQtZW5kaWFuIG1hY2hpbmUsIGJlIHZlcnkgY2FyZWZ1bCBhYm91dAotICAgICAgICogY29udmVydGluZyB3b3JkcyB0byBjaGFycy4KLSAgICAgICAqLwotICAgICAgbnVtYmVyX29mX2NoYXJzID0gKGtpbmRfb2ZfZmxvYXQgPT0gJ2YnID8gRl9QUkVDSVNJT05fQ0hBUlMgOgotCQkJIChraW5kX29mX2Zsb2F0ID09ICdkJyA/IERfUFJFQ0lTSU9OX0NIQVJTIDogMCkpOwotICAgICAga25vdyAobnVtYmVyX29mX2NoYXJzIDw9IE1BWF9QUkVDSVNJT04gKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaW1pdCA9IHdvcmRzICsgKG51bWJlcl9vZl9jaGFycyAvIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGZvciAobGl0dGxlbnVtX3BvaW50ZXIgPSB3b3JkczsKLQkgICBsaXR0bGVudW1fcG9pbnRlciA8IGxpbWl0OwotCSAgIGxpdHRsZW51bV9wb2ludGVyKyspCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRlcmFsUCwgKmxpdHRsZW51bV9wb2ludGVyLAotCQkJICAgICAgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCSAgbGl0ZXJhbFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0JfTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBudW1iZXJfb2ZfY2hhcnMgPSAwOwotICAgIH07Ci0KLSAgKnNpemVQID0gbnVtYmVyX29mX2NoYXJzOwotICByZXR1cm4ga2luZF9vZl9mbG9hdCA/IDAgOiBfKCJCYWQgY2FsbCB0byBtZF9hdG9mKCkiKTsKLX0KLQotLyogYXRvZl90YWhvZS5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL2F0b2YtdmF4LmMgYi9nYXMvY29uZmlnL2F0b2YtdmF4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YjkwYTguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9hdG9mLXZheC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE3ICswLDAgQEAKLS8qIGF0b2ZfdmF4LmMgLSB0dXJuIGEgRmxvbnVtIGludG8gYSBWQVggZmxvYXRpbmcgcG9pbnQgbnVtYmVyCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTIsIDkzLCA5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLXN0YXRpYyBpbnQgYXRvZl92YXhfc2l6ZW9mIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGludCBuZXh0X2JpdHMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyIFBBUkFNUyAoKExJVFRMRU5VTV9UWVBFICopKTsKLXN0YXRpYyBpbnQgd2hhdF9raW5kX29mX2Zsb2F0IFBBUkFNUyAoKGludCwgaW50ICosIGxvbmcgKikpOwotc3RhdGljIGNoYXIgKmF0b2ZfdmF4IFBBUkFNUyAoKGNoYXIgKiwgaW50LCBMSVRUTEVOVU1fVFlQRSAqKSk7Ci0KLS8qIFByZWNpc2lvbiBpbiBMaXR0bGVOdW1zLiAqLwotI2RlZmluZSBNQVhfUFJFQ0lTSU9OICg4KQotI2RlZmluZSBIX1BSRUNJU0lPTiAoOCkKLSNkZWZpbmUgR19QUkVDSVNJT04gKDQpCi0jZGVmaW5lIERfUFJFQ0lTSU9OICg0KQotI2RlZmluZSBGX1BSRUNJU0lPTiAoMikKLQotLyogTGVuZ3RoIGluIExpdHRsZU51bXMgb2YgZ3VhcmQgYml0cy4gKi8KLSNkZWZpbmUgR1VBUkQgKDIpCi0KLWludCBmbG9udW1fZ2VuMnZheCBQQVJBTVMgKChpbnQgZm9ybWF0X2xldHRlciwgRkxPTlVNX1RZUEUgKiBmLAotCQkJICAgIExJVFRMRU5VTV9UWVBFICogd29yZHMpKTsKLQotLyogTnVtYmVyIG9mIGNoYXJzIGluIGZsb251bSB0eXBlICdsZXR0ZXInLiAqLwotc3RhdGljIGludAotYXRvZl92YXhfc2l6ZW9mIChsZXR0ZXIpCi0gICAgIGludCBsZXR0ZXI7Ci17Ci0gIGludCByZXR1cm5fdmFsdWU7Ci0KLSAgLyoKLSAgICogUGVybWl0dGluZyB1cHBlcmNhc2UgbGV0dGVycyBpcyBwcm9iYWJseSBhIGJhZCBpZGVhLgotICAgKiBQbGVhc2UgdXNlIG9ubHkgbG93ZXItY2FzZWQgbGV0dGVycyBpbiBjYXNlIHRoZSB1cHBlci1jYXNlZAotICAgKiBvbmVzIGJlY29tZSB1bnN1cHBvcnRlZCEKLSAgICovCi0gIHN3aXRjaCAobGV0dGVyKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICAgIHJldHVybl92YWx1ZSA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ2cnOgotICAgIGNhc2UgJ0cnOgotICAgICAgcmV0dXJuX3ZhbHVlID0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaCc6Ci0gICAgY2FzZSAnSCc6Ci0gICAgICByZXR1cm5fdmFsdWUgPSAxNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybl92YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0JCQkJLyogYXRvZl92YXhfc2l6ZW9mICovCi0KLXN0YXRpYyBjb25zdCBsb25nIG1hc2tbXSA9Ci17Ci0gIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMDEsCi0gIDB4MDAwMDAwMDMsCi0gIDB4MDAwMDAwMDcsCi0gIDB4MDAwMDAwMGYsCi0gIDB4MDAwMDAwMWYsCi0gIDB4MDAwMDAwM2YsCi0gIDB4MDAwMDAwN2YsCi0gIDB4MDAwMDAwZmYsCi0gIDB4MDAwMDAxZmYsCi0gIDB4MDAwMDAzZmYsCi0gIDB4MDAwMDA3ZmYsCi0gIDB4MDAwMDBmZmYsCi0gIDB4MDAwMDFmZmYsCi0gIDB4MDAwMDNmZmYsCi0gIDB4MDAwMDdmZmYsCi0gIDB4MDAwMGZmZmYsCi0gIDB4MDAwMWZmZmYsCi0gIDB4MDAwM2ZmZmYsCi0gIDB4MDAwN2ZmZmYsCi0gIDB4MDAwZmZmZmYsCi0gIDB4MDAxZmZmZmYsCi0gIDB4MDAzZmZmZmYsCi0gIDB4MDA3ZmZmZmYsCi0gIDB4MDBmZmZmZmYsCi0gIDB4MDFmZmZmZmYsCi0gIDB4MDNmZmZmZmYsCi0gIDB4MDdmZmZmZmYsCi0gIDB4MGZmZmZmZmYsCi0gIDB4MWZmZmZmZmYsCi0gIDB4M2ZmZmZmZmYsCi0gIDB4N2ZmZmZmZmYsCi0gIDB4ZmZmZmZmZmYKLX07Ci0MCi0KLS8qIFNoYXJlZCBiZXR3ZWVuIGZsb251bV9nZW4ydmF4IGFuZCBuZXh0X2JpdHMgKi8KLXN0YXRpYyBpbnQgYml0c19sZWZ0X2luX2xpdHRsZW51bTsKLXN0YXRpYyBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtX3BvaW50ZXI7Ci1zdGF0aWMgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9lbmQ7Ci0KLXN0YXRpYyBpbnQKLW5leHRfYml0cyAobnVtYmVyX29mX2JpdHMpCi0gICAgIGludCBudW1iZXJfb2ZfYml0czsKLXsKLSAgaW50IHJldHVybl92YWx1ZTsKLQotICBpZiAobGl0dGxlbnVtX3BvaW50ZXIgPCBsaXR0bGVudW1fZW5kKQotICAgIHJldHVybiAwOwotICBpZiAobnVtYmVyX29mX2JpdHMgPj0gYml0c19sZWZ0X2luX2xpdHRsZW51bSkKLSAgICB7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW2JpdHNfbGVmdF9pbl9saXR0bGVudW1dICYgKmxpdHRsZW51bV9wb2ludGVyOwotICAgICAgbnVtYmVyX29mX2JpdHMgLT0gYml0c19sZWZ0X2luX2xpdHRsZW51bTsKLSAgICAgIHJldHVybl92YWx1ZSA8PD0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICBsaXR0bGVudW1fcG9pbnRlci0tOwotICAgICAgaWYgKGxpdHRsZW51bV9wb2ludGVyID49IGxpdHRsZW51bV9lbmQpCi0JcmV0dXJuX3ZhbHVlIHw9ICgoKmxpdHRsZW51bV9wb2ludGVyKSA+PiAoYml0c19sZWZ0X2luX2xpdHRsZW51bSkpICYgbWFza1tudW1iZXJfb2ZfYml0c107Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSAtPSBudW1iZXJfb2ZfYml0czsKLSAgICAgIHJldHVybl92YWx1ZSA9IG1hc2tbbnVtYmVyX29mX2JpdHNdICYgKCgqbGl0dGxlbnVtX3BvaW50ZXIpID4+IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pOwotICAgIH0KLSAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZAotbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpCi0gICAgIExJVFRMRU5VTV9UWVBFICp3b3JkczsKLXsKLSAgKndvcmRzID0gMHg4MDAwOwkJLyogRmxvYXRpbmcgUmVzZXJ2ZWQgT3BlcmFuZCBDb2RlICovCi19Ci0MCi1zdGF0aWMgaW50CQkJLyogMCBtZWFucyBsZXR0ZXIgaXMgT0suICovCi13aGF0X2tpbmRfb2ZfZmxvYXQgKGxldHRlciwgcHJlY2lzaW9uUCwgZXhwb25lbnRfYml0c1ApCi0gICAgIGludCBsZXR0ZXI7CQkvKiBJbjogbG93ZXJjYXNlIHBsZWFzZS4gV2hhdCBraW5kIG9mIGZsb2F0PyAqLwotICAgICBpbnQgKnByZWNpc2lvblA7CQkvKiBOdW1iZXIgb2YgMTYtYml0IHdvcmRzIGluIHRoZSBmbG9hdC4gKi8KLSAgICAgbG9uZyAqZXhwb25lbnRfYml0c1A7CS8qIE51bWJlciBvZiBleHBvbmVudCBiaXRzLiAqLwotewotICBpbnQgcmV0dmFsOwkJCS8qIDA6IE9LLiAqLwotCi0gIHJldHZhbCA9IDA7Ci0gIHN3aXRjaCAobGV0dGVyKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgICpwcmVjaXNpb25QID0gRl9QUkVDSVNJT047Ci0gICAgICAqZXhwb25lbnRfYml0c1AgPSA4OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgICpwcmVjaXNpb25QID0gRF9QUkVDSVNJT047Ci0gICAgICAqZXhwb25lbnRfYml0c1AgPSA4OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdnJzoKLSAgICAgICpwcmVjaXNpb25QID0gR19QUkVDSVNJT047Ci0gICAgICAqZXhwb25lbnRfYml0c1AgPSAxMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaCc6Ci0gICAgICAqcHJlY2lzaW9uUCA9IEhfUFJFQ0lTSU9OOwotICAgICAgKmV4cG9uZW50X2JpdHNQID0gMTU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR2YWwgPSA2OTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIChyZXR2YWwpOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJCQkJCQkJCQkqCi0gKglXYXJuaW5nOiB0aGlzIHJldHVybnMgMTYtYml0IExJVFRMRU5VTXMsIGJlY2F1c2UgdGhhdCBpcwkqCi0gKgl3aGF0IHRoZSBWQVggdGhpbmtzIGluLiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGZpZ3VyZQkqCi0gKglvdXQgYW55IGFsaWdubWVudCBwcm9ibGVtcyBhbmQgdG8gY29uc3BpcmUgZm9yIHRoZSBieXRlcy93b3JkCSoKLSAqCXRvIGJlIGVtaXR0ZWQgaW4gdGhlIHJpZ2h0IG9yZGVyLiBCaWdlbmRpYW5zIGJld2FyZSEJCSoKLSAqCQkJCQkJCQkJKgotIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGNoYXIgKgkJCQkvKiBSZXR1cm4gcG9pbnRlciBwYXN0IHRleHQgY29uc3VtZWQuICovCi1hdG9mX3ZheCAoc3RyLCB3aGF0X2tpbmQsIHdvcmRzKQotICAgICBjaGFyICpzdHI7CQkJLyogVGV4dCB0byBjb252ZXJ0IHRvIGJpbmFyeS4gKi8KLSAgICAgaW50IHdoYXRfa2luZDsJCS8qICdkJywgJ2YnLCAnZycsICdoJyAqLwotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7CS8qIEJ1aWxkIHRoZSBiaW5hcnkgaGVyZS4gKi8KLXsKLSAgRkxPTlVNX1RZUEUgZjsKLSAgTElUVExFTlVNX1RZUEUgYml0c1tNQVhfUFJFQ0lTSU9OICsgTUFYX1BSRUNJU0lPTiArIEdVQVJEXTsKLSAgLyogRXh0cmEgYml0cyBmb3IgemVyb2VkIGxvdy1vcmRlciBiaXRzLiAqLwotICAvKiBUaGUgMXN0IE1BWF9QUkVDSVNJT04gYXJlIHplcm9lZCwgKi8KLSAgLyogdGhlIGxhc3QgY29udGFpbiBmbG9udW0gYml0cy4gKi8KLSAgY2hhciAqcmV0dXJuX3ZhbHVlOwotICBpbnQgcHJlY2lzaW9uOwkJLyogTnVtYmVyIG9mIDE2LWJpdCB3b3JkcyBpbiB0aGUgZm9ybWF0LiAqLwotICBsb25nIGV4cG9uZW50X2JpdHM7Ci0KLSAgcmV0dXJuX3ZhbHVlID0gc3RyOwotICBmLmxvdyA9IGJpdHMgKyBNQVhfUFJFQ0lTSU9OOwotICBmLmhpZ2ggPSBOVUxMOwotICBmLmxlYWRlciA9IE5VTEw7Ci0gIGYuZXhwb25lbnQgPSAwOwotICBmLnNpZ24gPSAnXDAnOwotCi0gIGlmICh3aGF0X2tpbmRfb2ZfZmxvYXQgKHdoYXRfa2luZCwgJnByZWNpc2lvbiwgJmV4cG9uZW50X2JpdHMpKQotICAgIHsKLSAgICAgIHJldHVybl92YWx1ZSA9IE5VTEw7CS8qIFdlIGxvc3QuICovCi0gICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0gICAgfQotCi0gIGlmIChyZXR1cm5fdmFsdWUpCi0gICAgewotICAgICAgbWVtc2V0IChiaXRzLCAnXDAnLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSAqIE1BWF9QUkVDSVNJT04pOwotCi0gICAgICAvKiBVc2UgbW9yZSBMaXR0bGVOdW1zIHRoYW4gc2VlbXMgKi8KLSAgICAgIC8qIG5lY2Vzc2FyeTogdGhlIGhpZ2hlc3QgZmxvbnVtIG1heSBoYXZlICovCi0gICAgICAvKiAxNSBsZWFkaW5nIDAgYml0cywgc28gY291bGQgYmUgdXNlbGVzcy4gKi8KLSAgICAgIGYuaGlnaCA9IGYubG93ICsgcHJlY2lzaW9uIC0gMSArIEdVQVJEOwotCi0gICAgICBpZiAoYXRvZl9nZW5lcmljICgmcmV0dXJuX3ZhbHVlLCAiLiIsICJlRSIsICZmKSkKLQl7Ci0JICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0JICByZXR1cm5fdmFsdWUgPSBOVUxMOwkvKiB3ZSBsb3N0ICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChmbG9udW1fZ2VuMnZheCAod2hhdF9raW5kLCAmZiwgd29yZHMpKQotCSAgICB7Ci0JICAgICAgcmV0dXJuX3ZhbHVlID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0JCQkJLyogYXRvZl92YXgoKSAqLwotDAotLyoKLSAqIEluOiBhIGZsb251bSwgYSB2YXggZmxvYXRpbmcgcG9pbnQgZm9ybWF0LgotICogT3V0OiBhIHZheCBmbG9hdGluZy1wb2ludCBiaXQgcGF0dGVybi4KLSAqLwotCi1pbnQJCQkJLyogMDogT0suICovCi1mbG9udW1fZ2VuMnZheCAoZm9ybWF0X2xldHRlciwgZiwgd29yZHMpCi0gICAgIGNoYXIgZm9ybWF0X2xldHRlcjsJLyogT25lIG9mICdkJyAnZicgJ2cnICdoJy4gKi8KLSAgICAgRkxPTlVNX1RZUEUgKmY7Ci0gICAgIExJVFRMRU5VTV9UWVBFICp3b3JkczsJLyogRGVsaXZlciBhbnN3ZXIgaGVyZS4gKi8KLXsKLSAgTElUVExFTlVNX1RZUEUgKmxwOwotICBpbnQgcHJlY2lzaW9uOwotICBsb25nIGV4cG9uZW50X2JpdHM7Ci0gIGludCByZXR1cm5fdmFsdWU7CQkvKiAwID09IE9LLiAqLwotCi0gIHJldHVybl92YWx1ZSA9IHdoYXRfa2luZF9vZl9mbG9hdCAoZm9ybWF0X2xldHRlciwgJnByZWNpc2lvbiwgJmV4cG9uZW50X2JpdHMpOwotCi0gIGlmIChyZXR1cm5fdmFsdWUgIT0gMCkKLSAgICB7Ci0gICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGYtPmxvdyA+IGYtPmxlYWRlcikKLQl7Ci0JICAvKiAwLjBlMCBzZWVuLiAqLwotCSAgbWVtc2V0ICh3b3JkcywgJ1wwJywgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkgKiBwcmVjaXNpb24pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb25nIGV4cG9uZW50XzE7Ci0JICBsb25nIGV4cG9uZW50XzI7Ci0JICBsb25nIGV4cG9uZW50XzM7Ci0JICBsb25nIGV4cG9uZW50XzQ7Ci0JICBpbnQgZXhwb25lbnRfc2tpcHBhZ2U7Ci0JICBMSVRUTEVOVU1fVFlQRSB3b3JkMTsKLQotCSAgLyogSkY6IERlYWwgd2l0aCBuZXcgTmFuLCArSW5mIGFuZCAtSW5mIGNvZGVzICovCi0JICBpZiAoZi0+c2lnbiAhPSAnLScgJiYgZi0+c2lnbiAhPSAnKycpCi0JICAgIHsKLQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0JICAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKLQkgICAgfQotCSAgLyoKLQkJCSAqIEFsbCB2YXhlbiBmbG9hdGluZ19wb2ludCBmb3JtYXRzIChzbyBmYXIpIGhhdmU6Ci0JCQkgKiBCaXQgMTUgaXMgc2lnbiBiaXQuCi0JCQkgKiBCaXRzIDE0Om4gYXJlIGV4Y2Vzcy13aGF0ZXZlciBleHBvbmVudC4KLQkJCSAqIEJpdHMgbi0xOjAgKGlmIGFueSkgYXJlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiBmcmFjdGlvbi4KLQkJCSAqIEJpdHMgMTU6MCBvZiB0aGUgbmV4dCB3b3JkIGFyZSB0aGUgbmV4dCBtb3N0IHNpZ25pZmljYW50IGJpdHMuCi0JCQkgKiBBbmQgc28gb24gZm9yIGVhY2ggb3RoZXIgd29yZC4KLQkJCSAqCi0JCQkgKiBBbGwgdGhpcyB0byBiZSBjb21wYXRpYmxlIHdpdGggYSBLRjExPz8gKFdoaWNoIGlzIHN0aWxsIGZhc3RlcgotCQkJICogdGhhbiBsb3RzIG9mIHZheGVuIEkgY2FuIHRoaW5rIG9mLCBidXQgaXQgYWxzbyBoYXMgaGlnaGVyCi0JCQkgKiBtYWludGVuYW5jZSBjb3N0cyAuLi4gc2lnaCkuCi0JCQkgKgotCQkJICogU28gd2UgbmVlZDogbnVtYmVyIG9mIGJpdHMgb2YgZXhwb25lbnQsIG51bWJlciBvZiBiaXRzIG9mCi0JCQkgKiBtYW50aXNzYS4KLQkJCSAqLwotCi0jaWZkZWYgTkVWRVIJCQkvKioqKioqKiBUaGlzIHplcm9pbmcgc2VlbXMgcmVkdW5kYW50IC0gRGVhbiAzbWF5ODYgKioqKioqKioqKi8KLQkgIC8qCi0JCQkgKiBObyBtYXR0ZXIgaG93IGZldyBiaXRzIHdlIGdvdCBiYWNrIGZyb20gdGhlIGF0b2YoKQotCQkJICogcm91dGluZSwgYWRkIGVub3VnaCB6ZXJvIGxpdHRsZW51bXMgc28gdGhlIHJlc3Qgb2YgdGhlCi0JCQkgKiBjb2RlIHdvbid0IHJ1biBvdXQgb2YgInNpZ25pZmljYW50IiBiaXRzIGluIHRoZSBtYW50aXNzYS4KLQkJCSAqLwotCSAgewotCSAgICBMSVRUTEVOVU1fVFlQRSAqbHRwOwotCSAgICBmb3IgKGx0cCA9IGYtPmxlYWRlciArIDE7Ci0JCSBsdHAgPD0gZi0+bG93ICsgcHJlY2lzaW9uOwotCQkgbHRwKyspCi0JICAgICAgewotCQkqbHRwID0gMDsKLQkgICAgICB9Ci0JICB9Ci0jZW5kaWYKLQotCSAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgIGxpdHRsZW51bV9wb2ludGVyID0gZi0+bGVhZGVyOwotCSAgbGl0dGxlbnVtX2VuZCA9IGYtPmxvdzsKLQkgIC8qIFNlZWsgKGFuZCBmb3JnZXQpIDFzdCBzaWduaWZpY2FudCBiaXQgKi8KLQkgIGZvciAoZXhwb25lbnRfc2tpcHBhZ2UgPSAwOwotCSAgICAgICAhbmV4dF9iaXRzICgxKTsKLQkgICAgICAgZXhwb25lbnRfc2tpcHBhZ2UrKyk7OwotCi0JICBleHBvbmVudF8xID0gZi0+ZXhwb25lbnQgKyBmLT5sZWFkZXIgKyAxIC0gZi0+bG93OwotCSAgLyogUmFkaXggTElUVExFTlVNX1JBRElYLCBwb2ludCBqdXN0IGhpZ2hlciB0aGFuIGYtPmxlYWRlci4gKi8KLQkgIGV4cG9uZW50XzIgPSBleHBvbmVudF8xICogTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCSAgLyogUmFkaXggMi4gKi8KLQkgIGV4cG9uZW50XzMgPSBleHBvbmVudF8yIC0gZXhwb25lbnRfc2tpcHBhZ2U7Ci0JICAvKiBGb3JnZXQgbGVhZGluZyB6ZXJvcywgZm9yZ2V0IDFzdCBiaXQuICovCi0JICBleHBvbmVudF80ID0gZXhwb25lbnRfMyArICgxIDw8IChleHBvbmVudF9iaXRzIC0gMSkpOwotCSAgLyogT2Zmc2V0IGV4cG9uZW50LiAqLwotCi0JICBpZiAoZXhwb25lbnRfNCAmIH5tYXNrW2V4cG9uZW50X2JpdHNdKQotCSAgICB7Ci0JICAgICAgLyoKLQkJCQkgKiBFeHBvbmVudCBvdmVyZmxvdy4gTG9zZSBpbW1lZGlhdGVseS4KLQkJCQkgKi8KLQotCSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLQotCSAgICAgIC8qCi0JCQkJICogV2UgbGVhdmUgcmV0dXJuX3ZhbHVlIGFsb25lOiBhZG1pdCB3ZSByZWFkIHRoZQotCQkJCSAqIG51bWJlciwgYnV0IHJldHVybiBhIGZsb2F0aW5nIGV4Y2VwdGlvbgotCQkJCSAqIGJlY2F1c2Ugd2UgY2FuJ3QgZW5jb2RlIHRoZSBudW1iZXIuCi0JCQkJICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGxwID0gd29yZHM7Ci0KLQkgICAgICAvKiBXb3JkIDEuIFNpZ24sIGV4cG9uZW50IGFuZCBwZXJoYXBzIGhpZ2ggYml0cy4gKi8KLQkgICAgICAvKiBBc3N1bWUgMidzIGNvbXBsZW1lbnQgaW50ZWdlcnMuICovCi0JICAgICAgd29yZDEgPSAoKChleHBvbmVudF80ICYgbWFza1tleHBvbmVudF9iaXRzXSkgPDwgKDE1IC0gZXhwb25lbnRfYml0cykpCi0JCSAgICAgICB8ICgoZi0+c2lnbiA9PSAnKycpID8gMCA6IDB4ODAwMCkKLQkJICAgICAgIHwgbmV4dF9iaXRzICgxNSAtIGV4cG9uZW50X2JpdHMpKTsKLQkgICAgICAqbHArKyA9IHdvcmQxOwotCi0JICAgICAgLyogVGhlIHJlc3Qgb2YgdGhlIHdvcmRzIGFyZSBqdXN0IG1hbnRpc3NhIGJpdHMuICovCi0JICAgICAgZm9yICg7IGxwIDwgd29yZHMgKyBwcmVjaXNpb247IGxwKyspCi0JCXsKLQkJICAqbHAgPSBuZXh0X2JpdHMgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyk7Ci0JCX0KLQotCSAgICAgIGlmIChuZXh0X2JpdHMgKDEpKQotCQl7Ci0JCSAgLyoKLQkJCQkJICogU2luY2UgdGhlIE5FWFQgYml0IGlzIGEgMSwgcm91bmQgVVAgdGhlIG1hbnRpc3NhLgotCQkJCQkgKiBUaGUgY3VubmluZyBkZXNpZ24gb2YgdGhlc2UgaGlkZGVuLTEgZmxvYXRzIHBlcm1pdHMKLQkJCQkJICogdXMgdG8gbGV0IHRoZSBtYW50aXNzYSBvdmVyZmxvdyBpbnRvIHRoZSBleHBvbmVudCwgYW5kCi0JCQkJCSAqIGl0ICdkb2VzIHRoZSByaWdodCB0aGluZycuIEhvd2V2ZXIsIHdlIGxvc2UgaWYgdGhlCi0JCQkJCSAqIGhpZ2hlc3Qtb3JkZXIgYml0IG9mIHRoZSBsb3dlc3Qtb3JkZXIgd29yZCBmbGlwcy4KLQkJCQkJICogSXMgdGhhdCBjbGVhcj8KLQkJCQkJICovCi0KLQkJICB1bnNpZ25lZCBsb25nIGNhcnJ5OwotCi0JCSAgLyoKLQkJCQkJICAjaWYgKHNpemVvZihjYXJyeSkpIDwgKChzaXplb2YoYml0c1swXSkgKiBCSVRTX1BFUl9DSEFSKSArIDIpCi0JCQkJCSAgUGxlYXNlIGFsbG93IGF0IGxlYXN0IDEgbW9yZSBiaXQgaW4gY2FycnkgdGhhbiBpcyBpbiBhIExJVFRMRU5VTS4KLQkJCQkJICBXZSBuZWVkIHRoYXQgZXh0cmEgYml0IHRvIGhvbGQgYSBjYXJyeSBkdXJpbmcgYSBMSVRUTEVOVU0gY2FycnkKLQkJCQkJICBwcm9wYWdhdGlvbi4gQW5vdGhlciBleHRyYSBiaXQgKGtlcHQgMCkgd2lsbCBhc3N1cmUgdXMgdGhhdCB3ZQotCQkJCQkgIGRvbid0IGdldCBhIHN0aWNreSBzaWduIGJpdCBhZnRlciBzaGlmdGluZyByaWdodCwgYW5kIHRoYXQKLQkJCQkJICBwZXJtaXRzIHVzIHRvIHByb3BhZ2F0ZSB0aGUgY2Fycnkgd2l0aG91dCBhbnkgbWFza2luZyBvZiBiaXRzLgotCQkJCQkgICNlbmRpZgotCQkJCQkgICovCi0JCSAgZm9yIChjYXJyeSA9IDEsIGxwLS07Ci0JCSAgICAgICBjYXJyeSAmJiAobHAgPj0gd29yZHMpOwotCQkgICAgICAgbHAtLSkKLQkJICAgIHsKLQkJICAgICAgY2FycnkgPSAqbHAgKyBjYXJyeTsKLQkJICAgICAgKmxwID0gY2Fycnk7Ci0JCSAgICAgIGNhcnJ5ID4+PSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JCSAgICB9Ci0KLQkJICBpZiAoKHdvcmQxIF4gKndvcmRzKSAmICgxIDw8IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSkpCi0JCSAgICB7Ci0JCSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLQkJICAgICAgLyoKLQkJCQkJCSAqIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLQkJCQkJCSAqIG51bWJlciwgYnV0IHJldHVybiBhIGZsb2F0aW5nIGV4Y2VwdGlvbgotCQkJCQkJICogYmVjYXVzZSB3ZSBjYW4ndCBlbmNvZGUgdGhlIG51bWJlci4KLQkJCQkJCSAqLwotCQkgICAgfQotCQl9CQkvKiBpZiAod2UgbmVlZGVkIHRvIHJvdW5kIHVwKSAqLwotCSAgICB9CQkJLyogaWYgKGV4cG9uZW50IG92ZXJmbG93KSAqLwotCX0JCQkvKiBpZiAoMC4wZTApICovCi0gICAgfQkJCQkvKiBpZiAoZmxvYXRfdHlwZSB3YXMgT0spICovCi0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0JCQkJLyogZmxvbnVtX2dlbjJ2YXgoKSAqLwotCi0KLS8qIEpGIHRoaXMgdXNlZCB0byBiZSBpbiB2YXguYyBidXQgdGhpcyBsb29rcyBsaWtlIGEgYmV0dGVyIHBsYWNlIGZvciBpdCAqLwotCi0vKgotICoJCW1kX2F0b2YoKQotICoKLSAqIEluOglpbnB1dF9saW5lX3BvaW50ZXItPnRoZSAxc3QgY2hhcmFjdGVyIG9mIGEgZmxvYXRpbmctcG9pbnQKLSAqCQludW1iZXIuCi0gKgkxIGxldHRlciBkZW5vdGluZyB0aGUgdHlwZSBvZiBzdGF0ZW1lbnQgdGhhdCB3YW50cyBhCi0gKgkJYmluYXJ5IGZsb2F0aW5nIHBvaW50IG51bWJlciByZXR1cm5lZC4KLSAqCUFkZHJlc3Mgb2Ygd2hlcmUgdG8gYnVpbGQgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbC4KLSAqCQlBc3N1bWVkIHRvIGJlICdiaWcgZW5vdWdoJy4KLSAqCUFkZHJlc3Mgb2Ygd2hlcmUgdG8gcmV0dXJuIHNpemUgb2YgbGl0ZXJhbCAoaW4gY2hhcnMpLgotICoKLSAqIE91dDoJSW5wdXRfbGluZV9wb2ludGVyLT5vZiBuZXh0IGNoYXIgYWZ0ZXIgZmxvYXRpbmcgbnVtYmVyLgotICoJRXJyb3IgbWVzc2FnZSwgb3IgMC4KLSAqCUZsb2F0aW5nIHBvaW50IGxpdGVyYWwuCi0gKglOdW1iZXIgb2YgY2hhcnMgd2UgdXNlZCBmb3IgdGhlIGxpdGVyYWwuCi0gKi8KLQotI2RlZmluZSBNQVhJTVVNX05VTUJFUl9PRl9MSVRUTEVOVU1TICg4KQkvKiBGb3IgLmhmbG9hdHMuICovCi0KLWNoYXIgKgotbWRfYXRvZiAod2hhdF9zdGF0ZW1lbnRfdHlwZSwgbGl0ZXJhbFAsIHNpemVQKQotICAgICBpbnQgd2hhdF9zdGF0ZW1lbnRfdHlwZTsKLSAgICAgY2hhciAqbGl0ZXJhbFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWElNVU1fTlVNQkVSX09GX0xJVFRMRU5VTVNdOwotICByZWdpc3RlciBjaGFyIGtpbmRfb2ZfZmxvYXQ7Ci0gIHJlZ2lzdGVyIGludCBudW1iZXJfb2ZfY2hhcnM7Ci0gIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1QOwotCi0gIHN3aXRjaCAod2hhdF9zdGF0ZW1lbnRfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnRic6CQkJLyogLmZsb2F0ICovCi0gICAgY2FzZSAnZic6CQkJLyogLmZmbG9hdCAqLwotICAgICAga2luZF9vZl9mbG9hdCA9ICdmJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRCc6CQkJLyogLmRvdWJsZSAqLwotICAgIGNhc2UgJ2QnOgkJCS8qIC5kZmxvYXQgKi8KLSAgICAgIGtpbmRfb2ZfZmxvYXQgPSAnZCc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2cnOgkJCS8qIC5nZmxvYXQgKi8KLSAgICAgIGtpbmRfb2ZfZmxvYXQgPSAnZyc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgkJCS8qIC5oZmxvYXQgKi8KLSAgICAgIGtpbmRfb2ZfZmxvYXQgPSAnaCc7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBraW5kX29mX2Zsb2F0ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH07Ci0KLSAgaWYgKGtpbmRfb2ZfZmxvYXQpCi0gICAgewotICAgICAgcmVnaXN0ZXIgTElUVExFTlVNX1RZUEUgKmxpbWl0OwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBhdG9mX3ZheCAoaW5wdXRfbGluZV9wb2ludGVyLAotCQkJCSAgICAga2luZF9vZl9mbG9hdCwKLQkJCQkgICAgIHdvcmRzKTsKLSAgICAgIC8qCi0gICAgICAgKiBUaGUgYXRvZl92YXgoKSBidWlsZHMgdXAgMTYtYml0IG51bWJlcnMuCi0gICAgICAgKiBTaW5jZSB0aGUgYXNzZW1ibGVyIG1heSBub3QgYmUgcnVubmluZyBvbgotICAgICAgICogYSBsaXR0bGUtZW5kaWFuIG1hY2hpbmUsIGJlIHZlcnkgY2FyZWZ1bCBhYm91dAotICAgICAgICogY29udmVydGluZyB3b3JkcyB0byBjaGFycy4KLSAgICAgICAqLwotICAgICAgbnVtYmVyX29mX2NoYXJzID0gYXRvZl92YXhfc2l6ZW9mIChraW5kX29mX2Zsb2F0KTsKLSAgICAgIGtub3cgKG51bWJlcl9vZl9jaGFycyA8PSBNQVhJTVVNX05VTUJFUl9PRl9MSVRUTEVOVU1TICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGltaXQgPSB3b3JkcyArIChudW1iZXJfb2ZfY2hhcnMgLyBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBmb3IgKGxpdHRsZW51bVAgPSB3b3JkczsgbGl0dGxlbnVtUCA8IGxpbWl0OyBsaXR0bGVudW1QKyspCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRlcmFsUCwgKmxpdHRsZW51bVAsIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkgIGxpdGVyYWxQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCX07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbnVtYmVyX29mX2NoYXJzID0gMDsKLSAgICB9OwotCi0gICpzaXplUCA9IG51bWJlcl9vZl9jaGFyczsKLSAgcmV0dXJuIGtpbmRfb2ZfZmxvYXQgPyAwIDogXygiQmFkIGNhbGwgdG8gbWRfYXRvZigpIik7Ci19Ci0KLS8qIGVuZCBvZiBhdG9mLXZheC5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL2UtaTM4NmNvZmYuYyBiL2dhcy9jb25maWcvZS1pMzg2Y29mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmVkNzI4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvZS1pMzg2Y29mZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiZW11bC5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1pMzg2Y29mZl9iZmRfbmFtZSAoKQotewotICBhYm9ydCAoKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNkZWZpbmUgZW11bF9iZmRfbmFtZQlpMzg2Y29mZl9iZmRfbmFtZQotI2RlZmluZSBlbXVsX2Zvcm1hdAkmY29mZl9mb3JtYXRfb3BzCi0KLSNkZWZpbmUgZW11bF9uYW1lCSJpMzg2Y29mZiIKLSNkZWZpbmUgZW11bF9zdHJ1Y3RfbmFtZSBpMzg2Y29mZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDAKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9lLWkzODZlbGYuYyBiL2dhcy9jb25maWcvZS1pMzg2ZWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNjcwMWUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9lLWkzODZlbGYuYworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImVtdWwuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotaTM4NmVsZl9iZmRfbmFtZSAoKQotewotICBhYm9ydCAoKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNkZWZpbmUgZW11bF9iZmRfbmFtZQlpMzg2ZWxmX2JmZF9uYW1lCi0jZGVmaW5lIGVtdWxfZm9ybWF0CSZlbGZfZm9ybWF0X29wcwotCi0jZGVmaW5lIGVtdWxfbmFtZQkiaTM4NmVsZiIKLSNkZWZpbmUgZW11bF9zdHJ1Y3RfbmFtZSBpMzg2ZWxmCi0jZGVmaW5lIGVtdWxfZGVmYXVsdF9lbmRpYW4gMAotI2luY2x1ZGUgImVtdWwtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL2UtbWlwc2Vjb2ZmLmMgYi9nYXMvY29uZmlnL2UtbWlwc2Vjb2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMmY3MWIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9lLW1pcHNlY29mZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiZW11bC5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqbWlwc2Vjb2ZmX2JmZF9uYW1lIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotbWlwc2Vjb2ZmX2JmZF9uYW1lICgpCi17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gTlVMTDsKLX0KLQotI2RlZmluZSBlbXVsX2JmZF9uYW1lCW1pcHNlY29mZl9iZmRfbmFtZQotI2RlZmluZSBlbXVsX2Zvcm1hdAkmZWNvZmZfZm9ybWF0X29wcwotCi0jZGVmaW5lIGVtdWxfbmFtZQkibWlwc2JlY29mZiIKLSNkZWZpbmUgZW11bF9zdHJ1Y3RfbmFtZSBtaXBzYmVjb2ZmCi0jZGVmaW5lIGVtdWxfZGVmYXVsdF9lbmRpYW4gMQotI2luY2x1ZGUgImVtdWwtdGFyZ2V0LmgiCi0KLSN1bmRlZiAgZW11bF9uYW1lCi0jdW5kZWYgIGVtdWxfc3RydWN0X25hbWUKLSN1bmRlZiAgZW11bF9kZWZhdWx0X2VuZGlhbgotCi0jZGVmaW5lIGVtdWxfbmFtZQkibWlwc2xlY29mZiIKLSNkZWZpbmUgZW11bF9zdHJ1Y3RfbmFtZSBtaXBzbGVjb2ZmCi0jZGVmaW5lIGVtdWxfZGVmYXVsdF9lbmRpYW4gMAotI2luY2x1ZGUgImVtdWwtdGFyZ2V0LmgiCi0KLSN1bmRlZiBlbXVsX25hbWUKLSN1bmRlZiBlbXVsX3N0cnVjdF9uYW1lCi0jdW5kZWYgZW11bF9kZWZhdWx0X2VuZGlhbgotCi0jZGVmaW5lIGVtdWxfbmFtZQkibWlwc2Vjb2ZmIgotI2RlZmluZSBlbXVsX3N0cnVjdF9uYW1lIG1pcHNlY29mZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDIKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9lLW1pcHNlbGYuYyBiL2dhcy9jb25maWcvZS1taXBzZWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYTcyZjUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9lLW1pcHNlbGYuYworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImVtdWwuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKm1pcHNlbGZfYmZkX25hbWUgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1taXBzZWxmX2JmZF9uYW1lICgpCi17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gTlVMTDsKLX0KLQotI2RlZmluZSBlbXVsX2JmZF9uYW1lCW1pcHNlbGZfYmZkX25hbWUKLSNkZWZpbmUgZW11bF9mb3JtYXQJJmVsZl9mb3JtYXRfb3BzCi0KLSNkZWZpbmUgZW11bF9uYW1lCSJtaXBzYmVsZiIKLSNkZWZpbmUgZW11bF9zdHJ1Y3RfbmFtZSBtaXBzYmVsZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDEKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgotCi0jdW5kZWYgIGVtdWxfbmFtZQotI3VuZGVmICBlbXVsX3N0cnVjdF9uYW1lCi0jdW5kZWYgIGVtdWxfZGVmYXVsdF9lbmRpYW4KLQotI2RlZmluZSBlbXVsX25hbWUJIm1pcHNsZWxmIgotI2RlZmluZSBlbXVsX3N0cnVjdF9uYW1lIG1pcHNsZWxmCi0jZGVmaW5lIGVtdWxfZGVmYXVsdF9lbmRpYW4gMAotI2luY2x1ZGUgImVtdWwtdGFyZ2V0LmgiCi0KLSN1bmRlZiBlbXVsX25hbWUKLSN1bmRlZiBlbXVsX3N0cnVjdF9uYW1lCi0jdW5kZWYgZW11bF9kZWZhdWx0X2VuZGlhbgotCi0jZGVmaW5lIGVtdWxfbmFtZQkibWlwc2VsZiIKLSNkZWZpbmUgZW11bF9zdHJ1Y3RfbmFtZSBtaXBzZWxmCi0jZGVmaW5lIGVtdWxfZGVmYXVsdF9lbmRpYW4gMgotI2luY2x1ZGUgImVtdWwtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL2dvMzIuY2ZnIGIvZ2FzL2NvbmZpZy9nbzMyLmNmZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA1OTM5NS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2dvMzIuY2ZnCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyogY29uZmlnLmggZm9yIGdvMzIgKi8NCi0NCi0jZGVmaW5lIEkzODZDT0ZGIDENCi0NCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLw0KLSN1bmRlZiBDX0FMTE9DQQ0KLQ0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4NCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLw0KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORA0KLQ0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLw0KLSN1bmRlZiBIQVZFX0FMTE9DQV9IDQotDQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8NCi0jdW5kZWYgaW5saW5lDQotDQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlDQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlDQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLg0KLQlTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzDQotCVNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3Nlcw0KLQlTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bg0KLSAqLw0KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04NCi0NCi0vKiBTaG91bGQgZ2FzIHVzZSBoaWdoLWxldmVsIEJGRCBpbnRlcmZhY2VzPyAgKi8NCi0jdW5kZWYgQkZEX0FTU0VNQkxFUg0KLQ0KLS8qIElmIHdlIGFyZW4ndCBkb2luZyBjcm9zcy1hc3NlbWJsaW5nLCBzb21lIG9wZXJhdGlvbnMgY2FuIGJlIG9wdGltaXplZCwNCi0gICBzaW5jZSBieXRlIG9yZGVycyBhbmQgdmFsdWUgc2l6ZXMgZG9uJ3QgbmVlZCB0byBiZSBhZGp1c3RlZC4gICovDQotI3VuZGVmIENST1NTX0NPTVBJTEUNCi0NCi0vKiBTb21lIGdhcyBjb2RlIHdhbnRzIHRvIGtub3cgdGhlc2UgcGFyYW1ldGVycy4gICovDQotI2RlZmluZSBUQVJHRVRfQUxJQVMJCSJpMzg2Ig0KLSNkZWZpbmUgVEFSR0VUX0NQVQkJImkzODYiDQotI2RlZmluZSBUQVJHRVRfQ0FOT05JQ0FMCSJpMzg2LWkzODYiDQotI2RlZmluZSBUQVJHRVRfT1MJCSJkamdwcCINCi0jZGVmaW5lIFRBUkdFVF9WRU5ET1IJCSJkamdwcCINCi0NCi0vKiBTb21lIG9wZXJhdGluZyBzeXN0ZW1zLCBmb3IgZXhhbXBsZSBET1MsIHJlcXVpcmUgdGhlIHVzZSBvZiAid2IiIG1vZGUgd2hlbg0KLSAgIG9wZW5pbmcgYSBiaW5hcnkgZmlsZSBmb3Igd3JpdGluZy4gIElmIG9ubHkgInciIGlzIHVzZWQsIHRoZSBmaWxlIHdpbGwgbm90DQotICAgYmUgY29ycmVjdC4gIEhvd2V2ZXIsIHNvbWUgb3RoZXIgc3lzdGVtcyByZWplY3Qgc3VjaCBhIG1vZGUuICBUaGlzIGluZGljYXRlcw0KLSAgIHdoaWNoIC4uL2luY2x1ZGUvZm9wZW4tKi5oIGhlYWRlciBmaWxlIHdlIHdhbnQgdG8gaW5jbHVkZSwgc28gdGhhdCB3ZSBjYW4NCi0gICBnZXQgbWFjcm9zIHRoYXQnbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciB0aGlzIHN5c3RlbS4gICovDQotI2RlZmluZSBXQU5UX0ZPUEVOX0JJTiAxDQotDQotLyogU29tZXRpbWVzIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGRvbid0IGRlY2xhcmUgbWFsbG9jIGFuZCByZWFsbG9jLiAgKi8NCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MNCi0NCi0vKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBmcmVlLiAgKi8NCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFDQotDQotLyogU29tZXRpbWVzIGVycm5vLmggZG9lc24ndCBkZWNsYXJlIGVycm5vIGl0c2VsZi4gICovDQotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRVJSTk8NCi0NCi0jZGVmaW5lIE1BTllfU0VHTUVOVFMgMQ0KLQ0KLS8qIE5lZWRlZCBvbmx5IGZvciBzcGFyYyBjb25maWd1cmF0aW9uICovDQotI3VuZGVmIHNwYXJjdjkNCi0NCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJlbW92ZSBmdW5jdGlvbi4gICovDQotI2RlZmluZSBIQVZFX1JFTU9WRSAxDQotDQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB1bmxpbmsgZnVuY3Rpb24uICAqLw0KLSNkZWZpbmUgSEFWRV9VTkxJTksgMQ0KLQ0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGVycm5vLmg+IGhlYWRlciBmaWxlLiAgKi8NCi0jZGVmaW5lIEhBVkVfRVJSTk9fSCAxDQotDQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAgKi8NCi0jZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQ0KLQ0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGFyZy5oPiBoZWFkZXIgZmlsZS4gICovDQotI2RlZmluZSBIQVZFX1NUREFSR19IIDENCi0NCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLw0KLSNkZWZpbmUgSEFWRV9TVERMSUJfSCAxDQotDQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8NCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQ0KLQ0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLw0KLSN1bmRlZiBIQVZFX1NUUklOR1NfSA0KLQ0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovDQotI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDENCi0NCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLw0KLSNkZWZpbmUgSEFWRV9VTklTVERfSCAxDQotDQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFyYXJncy5oPiBoZWFkZXIgZmlsZS4gICovDQotI3VuZGVmIEhBVkVfVkFSQVJHU19IDQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9pdGJsLW1pcHMuaCBiL2dhcy9jb25maWcvaXRibC1taXBzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NDgyYmQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9pdGJsLW1pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLQotLyogaXRibC1taXBzLmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTk3ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRGVmaW5lcyBmb3IgTWlwcyBpdGJsIGNvcCBzdXBwb3J0ICovCi0KLSNpbmNsdWRlICJvcGNvZGUvbWlwcy5oIgotCi0vKiBWYWx1ZXMgZm9yIHByb2Nlc3NvcnMgd2lsbCBiZSBmcm9tIDAgdG8gTlVNQkVSX09GX1BST0NFU1NPUlMtMSAqLwotI2RlZmluZSBOVU1CRVJfT0ZfUFJPQ0VTU09SUyA0Ci0jZGVmaW5lIE1BWF9CSVRQT1MgMzEKLQotLyogTWlwcyBzcGVjaWZpY3MgKi8KLSNkZWZpbmUgTUlQU19PUENPREVfQ09QMCAoMHgyMSkJLyogQ09QeitDTywgYml0cyAzMS0yNTogMDEwMHp6MSAqLwotI2RlZmluZSBNSVBTX0VOQ09ERV9DT1BfTlVNKHopICgoTUlQU19PUENPREVfQ09QMHx6PDwxKTw8MjUpCi0jZGVmaW5lIE1JUFNfSVNfQ09QX0lOU04oaW5zbikgKChNSVBTX09QQ09ERV9DT1AwJihpbnNuPj4yNSkpIFwKLQk9PSBNSVBTX09QQ09ERV9DT1AwKQotI2RlZmluZSBNSVBTX0RFQ09ERV9DT1BfTlVNKGluc24pICgofk1JUFNfT1BDT0RFX0NPUDAmKGluc24+PjI1KSk+PjEpCi0jZGVmaW5lIE1JUFNfREVDT0RFX0NPUF9DT0ZVTihpbnNuKSAoKH5NSVBTX0VOQ09ERV9DT1BfTlVNKDMpKSYoaW5zbikpCi0KLS8qIGRlZmluaXRpb25zIHJlcXVpcmVkIGJ5IGdlbmVyaWMgY29kZSAqLwotI2RlZmluZSBJVEJMX0lTX0lOU04oaW5zbikgTUlQU19JU19DT1BfSU5TTihpbnNuKQotI2RlZmluZSBJVEJMX0RFQ09ERV9QTlVNKGluc24pIE1JUFNfREVDT0RFX0NPUF9OVU0oaW5zbikKLSNkZWZpbmUgSVRCTF9FTkNPREVfUE5VTShwbnVtKSBNSVBTX0VOQ09ERV9DT1BfTlVNKHBudW0pCi0KLSNkZWZpbmUgSVRCTF9PUENPREVfU1RSVUNUIG1pcHNfb3Bjb2RlCi0jZGVmaW5lIElUQkxfT1BDT0RFUyBtaXBzX29wY29kZXMKLSNkZWZpbmUgSVRCTF9OVU1fT1BDT0RFUyBOVU1PUENPREVTCi0jZGVmaW5lIElUQkxfTlVNX01BQ1JPUyBNX05VTV9NQUNST1MKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvbTY4ay1wYXJzZS5oIGIvZ2FzL2NvbmZpZy9tNjhrLXBhcnNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMzEzNDIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9tNjhrLXBhcnNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyogbTY4ay1wYXJzZS5oIC0tIGhlYWRlciBmaWxlIGZvciBtNjhrIGFzc2VtYmxlcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MSwgOTIsIDkzLCA5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBNNjhLX1BBUlNFX0gKLSNkZWZpbmUgTTY4S19QQVJTRV9ICi0KLS8qIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGluZ3Mgd2hpY2ggYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZQotICAgb3BlcmFuZCBwYXJzZXIgaW4gbTY4ay55IGFuZCB0aGUgbTY4ayBhc3NlbWJsZXIgcHJvcGVyIGluCi0gICB0Yy1tNjhrLmMuICAqLwotCi0vKiBUaGUgdmFyaW91cyBtNjhrIHJlZ2lzdGVycy4gICovCi0KLS8qIERBVEEgYW5kIEFERFIgaGF2ZSB0byBiZSBjb250aWd1b3VzLCBzbyB0aGF0IHJlZy1EQVRBIGdpdmVzCi0gICAwLTc9PWRhdGEgcmVnLCA4LTE1PT1hZGRyIHJlZyBmb3Igb3BlcmFuZHMgdGhhdCB0YWtlIGJvdGggdHlwZXMuCi0KLSAgIFdlIGRvbid0IHVzZSBmb3JtcyBsaWtlICJBRERSMCA9IEFERFIiIGhlcmUgYmVjYXVzZSB0aGlzIGZpbGUgaXMKLSAgIGxpa2VseSB0byBiZSB1c2VkIG9uIGFuIEFwb2xsbywgYW5kIHRoZSBicm9rZW4gQXBvbGxvIGNvbXBpbGVyCi0gICBnaXZlcyBhbiBgdW5kZWZpbmVkIHZhcmlhYmxlJyBlcnJvciBpZiB3ZSBkbyB0aGF0LCBhY2NvcmRpbmcgdG8KLSAgIHRyb3lAY2JtZS51bnN3LmVkdS5hdS4gICovCi0KLSNkZWZpbmUgREFUQSBEQVRBMAotI2RlZmluZSBBRERSIEFERFIwCi0jZGVmaW5lIFNQIEFERFI3Ci0jZGVmaW5lIEJBRCBCQUQwCi0jZGVmaW5lIEJBQyBCQUMwCi0KLWVudW0gbTY4a19yZWdpc3RlcgotewotICBEQVRBMCA9IDEsCQkJLyogICAxLSA4ID09IGRhdGEgcmVnaXN0ZXJzIDAtNyAqLwotICBEQVRBMSwKLSAgREFUQTIsCi0gIERBVEEzLAotICBEQVRBNCwKLSAgREFUQTUsCi0gIERBVEE2LAotICBEQVRBNywKLQotICBBRERSMCwKLSAgQUREUjEsCi0gIEFERFIyLAotICBBRERSMywKLSAgQUREUjQsCi0gIEFERFI1LAotICBBRERSNiwKLSAgQUREUjcsCi0KLSAgRlAwLAkJCQkvKiBFaWdodCBGUCByZWdpc3RlcnMgKi8KLSAgRlAxLAotICBGUDIsCi0gIEZQMywKLSAgRlA0LAotICBGUDUsCi0gIEZQNiwKLSAgRlA3LAotCi0gIENPUDAsCQkJCS8qIENvLXByb2Nlc3NvciAjMC0jNyAqLwotICBDT1AxLAotICBDT1AyLAotICBDT1AzLAotICBDT1A0LAotICBDT1A1LAotICBDT1A2LAotICBDT1A3LAotCi0gIFBDLAkJCQkvKiBQcm9ncmFtIGNvdW50ZXIgKi8KLSAgWlBDLAkJCQkvKiBIYWNrIGZvciBQcm9ncmFtIHNwYWNlLCBidXQgMCBhZGRyZXNzaW5nICovCi0gIFNSLAkJCQkvKiBTdGF0dXMgUmVnICovCi0gIENDUiwJCQkJLyogQ29uZGl0aW9uIGNvZGUgUmVnICovCi0KLSAgLyogVGhlc2UgaGF2ZSB0byBiZSBncm91cGVkIHRvZ2V0aGVyIGZvciB0aGUgbW92ZWMgaW5zdHJ1Y3Rpb24gdG8gd29yay4gKi8KLSAgVVNQLAkJCQkvKiAgVXNlciBTdGFjayBQb2ludGVyICovCi0gIElTUCwJCQkJLyogIEludGVycnVwdCBzdGFjayBwb2ludGVyICovCi0gIFNGQywKLSAgREZDLAotICBDQUNSLAotICBWQlIsCi0gIENBQVIsCi0gIE1TUCwKLSAgSVRUMCwKLSAgSVRUMSwKLSAgRFRUMCwKLSAgRFRUMSwKLSAgTU1VU1IsCi0gIFRDLAotICBTUlAsCi0gIFVSUCwKLSAgQlVTQ1IsCQkJLyogNjgwNjAgYWRkZWQgdGhlc2UgKi8KLSAgUENSLAotICBST01CQVIsCQkJLyogbWNmNTIwMCBhZGRlZCB0aGVzZSAqLwotICBSQU1CQVIwLAotICBSQU1CQVIxLAotICBNQkFSLAotI2RlZmluZSBsYXN0X21vdmVjX3JlZyBNQkFSCi0gIC8qIGVuZCBvZiBtb3ZlYyBvcmRlcmluZyBjb25zdHJhaW50cyAqLwotCi0gIEZQSSwKLSAgRlBTLAotICBGUEMsCi0KLSAgRFJQLAkJCQkvKiA2ODg1MSBvciA2ODAzMCBNTVUgcmVncyAqLwotICBDUlAsCi0gIENBTCwKLSAgVkFMLAotICBTQ0MsCi0gIEFDLAotICBCQUQwLAotICBCQUQxLAotICBCQUQyLAotICBCQUQzLAotICBCQUQ0LAotICBCQUQ1LAotICBCQUQ2LAotICBCQUQ3LAotICBCQUMwLAotICBCQUMxLAotICBCQUMyLAotICBCQUMzLAotICBCQUM0LAotICBCQUM1LAotICBCQUM2LAotICBCQUM3LAotICBQU1IsCQkJCS8qIGFrYSBNTVVTUiBvbiA2ODAzMCAoYnV0IG5vdCBNTVVTUiBvbiA2ODA0MCkKLQkJCQkgICBhbmQgQUNVU1Igb24gNjhlYzAzMCAqLwotICBQQ1NSLAotCi0gIElDLAkJCQkvKiBpbnN0cnVjdGlvbiBjYWNoZSB0b2tlbiAqLwotICBEQywJCQkJLyogZGF0YSBjYWNoZSB0b2tlbiAqLwotICBOQywJCQkJLyogbm8gY2FjaGUgdG9rZW4gKi8KLSAgQkMsCQkJCS8qIGJvdGggY2FjaGVzIHRva2VuICovCi0KLSAgVFQwLAkJCQkvKiA2ODAzMCBhY2Nlc3MgY29udHJvbCB1bml0IHJlZ3MgKi8KLSAgVFQxLAotCi0gIFpEQVRBMCwJCQkvKiBzdXBwcmVzc2VkIGRhdGEgcmVnaXN0ZXJzLiAgKi8KLSAgWkRBVEExLAotICBaREFUQTIsCi0gIFpEQVRBMywKLSAgWkRBVEE0LAotICBaREFUQTUsCi0gIFpEQVRBNiwKLSAgWkRBVEE3LAotCi0gIFpBRERSMCwJCQkvKiBzdXBwcmVzc2VkIGFkZHJlc3MgcmVnaXN0ZXJzLiAgKi8KLSAgWkFERFIxLAotICBaQUREUjIsCi0gIFpBRERSMywKLSAgWkFERFI0LAotICBaQUREUjUsCi0gIFpBRERSNiwKLSAgWkFERFI3LAotfTsKLQotLyogU2l6ZSBpbmZvcm1hdGlvbi4gICovCi0KLWVudW0gbTY4a19zaXplCi17Ci0gIC8qIFVuc3BlY2lmaWVkLiAgKi8KLSAgU0laRV9VTlNQRUMsCi0KLSAgLyogQnl0ZS4gICovCi0gIFNJWkVfQllURSwKLQotICAvKiBXb3JkICgyIGJ5dGVzKS4gICovCi0gIFNJWkVfV09SRCwKLQotICAvKiBMb25nd29yZCAoNCBieXRlcykuICAqLwotICBTSVpFX0xPTkcKLX07Ci0KLS8qIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IGFuIGluZGV4IHJlZ2lzdGVyLiAgKi8KLQotc3RydWN0IG02OGtfaW5kZXhyZWcKLXsKLSAgLyogVGhlIGluZGV4IHJlZ2lzdGVyIGl0c2VsZi4gICovCi0gIGVudW0gbTY4a19yZWdpc3RlciByZWc7Ci0KLSAgLyogVGhlIHNpemUgdG8gdXNlLiAgKi8KLSAgZW51bSBtNjhrX3NpemUgc2l6ZTsKLQotICAvKiBUaGUgdmFsdWUgdG8gc2NhbGUgYnkuICAqLwotICBpbnQgc2NhbGU7Ci19OwotCi0jaWZkZWYgT0JKX0VMRgotLyogVGhlIHR5cGUgb2YgYSBQSUMgZXhwcmVzc2lvbi4gICovCi0KLWVudW0gcGljX3JlbG9jYXRpb24KLXsKLSAgcGljX25vbmUsCQkJLyogbm90IHBpYyAqLwotICBwaWNfcGx0X3BjcmVsLAkJLyogQFBMVFBDICovCi0gIHBpY19nb3RfcGNyZWwsCQkvKiBAR09UUEMgKi8KLSAgcGljX3BsdF9vZmYsCQkJLyogQFBMVCAqLwotICBwaWNfZ290X29mZgkJCS8qIEBHT1QgKi8KLX07Ci0jZW5kaWYKLQotLyogVGhlIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgYW4gZXhwcmVzc2lvbi4gICovCi0KLXN0cnVjdCBtNjhrX2V4cAotewotICAvKiBUaGUgc2l6ZSB0byB1c2UuICAqLwotICBlbnVtIG02OGtfc2l6ZSBzaXplOwotCi0jaWZkZWYgT0JKX0VMRgotICAvKiBUaGUgdHlwZSBvZiBwaWMgcmVsb2NhdGlvbiBpZiBhbnkuICAqLwotICBlbnVtIHBpY19yZWxvY2F0aW9uIHBpY19yZWxvYzsKLSNlbmRpZgotCi0gIC8qIFRoZSBleHByZXNzaW9uIGl0c2VsZi4gICovCi0gIGV4cHJlc3Npb25TIGV4cDsKLX07Ci0KLS8qIFRoZSBvcGVyYW5kIG1vZGVzLiAgKi8KLQotZW51bSBtNjhrX29wZXJhbmRfdHlwZQotewotICBJTU1FRCA9IDEsCi0gIEFCU0wsCi0gIERSRUcsCi0gIEFSRUcsCi0gIEZQUkVHLAotICBDT05UUk9MLAotICBBSU5EUiwKLSAgQUlOQywKLSAgQURFQywKLSAgRElTUCwKLSAgQkFTRSwKLSAgUE9TVCwKLSAgUFJFLAotICBSRUdMU1QKLX07Ci0KLS8qIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGEgcGFyc2VkIG9wZXJhbmQuICAqLwotCi1zdHJ1Y3QgbTY4a19vcAotewotICAvKiBUaGUgdHlwZSBvZiBvcGVyYW5kLiAgKi8KLSAgZW51bSBtNjhrX29wZXJhbmRfdHlwZSBtb2RlOwotCi0gIC8qIFRoZSBtYWluIHJlZ2lzdGVyLiAgKi8KLSAgZW51bSBtNjhrX3JlZ2lzdGVyIHJlZzsKLQotICAvKiBUaGUgcmVnaXN0ZXIgbWFzayBmb3IgbW9kZSBSRUdMU1QuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0KLSAgLyogQW4gZXJyb3IgbWVzc2FnZS4gICovCi0gIGNvbnN0IGNoYXIgKmVycm9yOwotCi0gIC8qIFRoZSBpbmRleCByZWdpc3Rlci4gICovCi0gIHN0cnVjdCBtNjhrX2luZGV4cmVnIGluZGV4OwotCi0gIC8qIFRoZSBkaXNwbGFjZW1lbnQuICAqLwotICBzdHJ1Y3QgbTY4a19leHAgZGlzcDsKLQotICAvKiBUaGUgb3V0ZXIgZGlzcGxhY2VtZW50LiAgKi8KLSAgc3RydWN0IG02OGtfZXhwIG9kaXNwOwotfTsKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoTTY4S19QQVJTRV9IKSAqLwotCi0vKiBUaGUgcGFyc2luZyBmdW5jdGlvbi4gICovCi0KLWV4dGVybiBpbnQgbTY4a19pcF9vcCBQQVJBTVMgKChjaGFyICosIHN0cnVjdCBtNjhrX29wICopKTsKLQotLyogV2hldGhlciByZWdpc3RlciBwcmVmaXhlcyBhcmUgb3B0aW9uYWwuICAqLwotZXh0ZXJuIGludCBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWw7CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL202OGstcGFyc2UueSBiL2dhcy9jb25maWcvbTY4ay1wYXJzZS55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGE0ZTRmLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvbTY4ay1wYXJzZS55CisrKyAvZGV2L251bGwKQEAgLTEsMTA2MSArMCwwIEBACi0vKiBtNjhrLnkgLS0gYmlzb24gZ3JhbW1hciBmb3IgbTY4ayBvcGVyYW5kIHBhcnNpbmcKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgOTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEtlbiBSYWVidXJuIGFuZCBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgYSBiaXNvbiBncmFtbWFyIHRvIHBhcnNlIG02OGsgb3BlcmFuZHMuICBUaGUgbTY4awotICAgaGFzIGEgY29tcGxpY2F0ZWQgb3BlcmFuZCBzeW50YXgsIGFuZCBnYXMgc3VwcG9ydHMgdHdvIG1haW4KLSAgIHZhcmlhdGlvbnMgb2YgaXQuICBVc2luZyBhIGdyYW1tYXIgaXMgcHJvYmFibHkgb3ZlcmtpbGwsIGJ1dCBhdAotICAgbGVhc3QgaXQgbWFrZXMgY2xlYXIgZXhhY3RseSB3aGF0IHdlIGRvIHN1cHBvcnQuICAqLwotCi0lewotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJ0Yy1tNjhrLmgiCi0jaW5jbHVkZSAibTY4ay1wYXJzZS5oIgotCi0vKiBSZW1hcCBub3JtYWwgeWFjYyBwYXJzZXIgaW50ZXJmYWNlIG5hbWVzICh5eXBhcnNlLCB5eWxleCwgeXllcnJvciwKLSAgIGV0YyksIGFzIHdlbGwgYXMgZ3JhdHVpdGlvdXNseSBnbG9iYWwgc3ltYm9sIG5hbWVzIElmIG90aGVyIHBhcnNlcgotICAgZ2VuZXJhdG9ycyAoYmlzb24sIGJ5YWNjLCBldGMpIHByb2R1Y2UgYWRkaXRpb25hbCBnbG9iYWwgbmFtZXMgdGhhdAotICAgY29uZmxpY3QgYXQgbGluayB0aW1lLCB0aGVuIHRob3NlIHBhcnNlciBnZW5lcmF0b3JzIG5lZWQgdG8gYmUKLSAgIGZpeGVkIGluc3RlYWQgb2YgYWRkaW5nIHRob3NlIG5hbWVzIHRvIHRoaXMgbGlzdC4gKi8KLQotI2RlZmluZQl5eW1heGRlcHRoIG02OGtfbWF4ZGVwdGgKLSNkZWZpbmUJeXlwYXJzZQltNjhrX3BhcnNlCi0jZGVmaW5lCXl5bGV4CW02OGtfbGV4Ci0jZGVmaW5lCXl5ZXJyb3IJbTY4a19lcnJvcgotI2RlZmluZQl5eWx2YWwJbTY4a19sdmFsCi0jZGVmaW5lCXl5Y2hhcgltNjhrX2NoYXIKLSNkZWZpbmUJeXlkZWJ1ZwltNjhrX2RlYnVnCi0jZGVmaW5lCXl5cGFjdAltNjhrX3BhY3QJCi0jZGVmaW5lCXl5cjEJbTY4a19yMQkJCQotI2RlZmluZQl5eXIyCW02OGtfcjIJCQkKLSNkZWZpbmUJeXlkZWYJbTY4a19kZWYJCQotI2RlZmluZQl5eWNoawltNjhrX2NoawkJCi0jZGVmaW5lCXl5cGdvCW02OGtfcGdvCQkKLSNkZWZpbmUJeXlhY3QJbTY4a19hY3QJCQotI2RlZmluZQl5eWV4Y2EJbTY4a19leGNhCi0jZGVmaW5lIHl5ZXJyZmxhZyBtNjhrX2VycmZsYWcKLSNkZWZpbmUgeXluZXJycwltNjhrX25lcnJzCi0jZGVmaW5lCXl5cHMJbTY4a19wcwotI2RlZmluZQl5eXB2CW02OGtfcHYKLSNkZWZpbmUJeXlzCW02OGtfcwotI2RlZmluZQl5eV95eXMJbTY4a195eXMKLSNkZWZpbmUJeXlzdGF0ZQltNjhrX3N0YXRlCi0jZGVmaW5lCXl5dG1wCW02OGtfdG1wCi0jZGVmaW5lCXl5dgltNjhrX3YKLSNkZWZpbmUJeXlfeXl2CW02OGtfeXl2Ci0jZGVmaW5lCXl5dmFsCW02OGtfdmFsCi0jZGVmaW5lCXl5bGxvYwltNjhrX2xsb2MKLSNkZWZpbmUgeXlyZWRzCW02OGtfcmVkcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KLSNkZWZpbmUgeXl0b2tzCW02OGtfdG9rcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KLSNkZWZpbmUgeXlsaHMJbTY4a195eWxocwotI2RlZmluZSB5eWxlbgltNjhrX3l5bGVuCi0jZGVmaW5lIHl5ZGVmcmVkIG02OGtfeXlkZWZyZWQKLSNkZWZpbmUgeXlkZ290bwltNjhrX3l5ZGdvdG8KLSNkZWZpbmUgeXlzaW5kZXggbTY4a195eXNpbmRleAotI2RlZmluZSB5eXJpbmRleCBtNjhrX3l5cmluZGV4Ci0jZGVmaW5lIHl5Z2luZGV4IG02OGtfeXlnaW5kZXgKLSNkZWZpbmUgeXl0YWJsZQkgbTY4a195eXRhYmxlCi0jZGVmaW5lIHl5Y2hlY2sJIG02OGtfeXljaGVjawotCi0jaWZuZGVmIFlZREVCVUcKLSNkZWZpbmUgWVlERUJVRyAxCi0jZW5kaWYKLQotLyogSW50ZXJuYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIGVudW0gbTY4a19yZWdpc3RlciBtNjhrX3JlZ19wYXJzZSBQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHl5ZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qIFRoZSBwYXJzZXIgc2V0cyBmaWVsZHMgcG9pbnRlZCB0byBieSB0aGlzIGdsb2JhbCB2YXJpYWJsZS4gICovCi1zdGF0aWMgc3RydWN0IG02OGtfb3AgKm9wOwotCi0lfQotCi0ldW5pb24KLXsKLSAgc3RydWN0IG02OGtfaW5kZXhyZWcgaW5kZXhyZWc7Ci0gIGVudW0gbTY4a19yZWdpc3RlciByZWc7Ci0gIHN0cnVjdCBtNjhrX2V4cCBleHA7Ci0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgaW50IG9uZXJlZzsKLX0KLQotJXRva2VuIDxyZWc+IERSIEFSIEZQUiBGUENSIExQQyBaQVIgWkRSIExaUEMgQ1JFRwotJXRva2VuIDxpbmRleHJlZz4gSU5ERVhSRUcKLSV0b2tlbiA8ZXhwPiBFWFBSCi0KLSV0eXBlIDxpbmRleHJlZz4gemlyZWcgemRpcmVnCi0ldHlwZSA8cmVnPiB6YWRyIHpkciBhcGMgemFwYyB6cGMgb3B0emFwYyBvcHRjemFwYwotJXR5cGUgPGV4cD4gb3B0Y2V4cHIgb3B0ZXhwcmMKLSV0eXBlIDxtYXNrPiByZWdsaXN0IGlyZWdsaXN0IHJlZ2xpc3RwYWlyCi0ldHlwZSA8b25lcmVnPiByZWdsaXN0cmVnCi0KLSUlCi0KLS8qIEFuIG9wZXJhbmQuICAqLwotCi1vcGVyYW5kOgotCSAgZ2VuZXJpY19vcGVyYW5kCi0JfCBtb3Rvcm9sYV9vcGVyYW5kCi0JfCBtaXRfb3BlcmFuZAotCTsKLQotLyogQSBnZW5lcmljIG9wZXJhbmQuICAqLwotCi1nZW5lcmljX29wZXJhbmQ6Ci0JICBEUgotCQl7Ci0JCSAgb3AtPm1vZGUgPSBEUkVHOwotCQkgIG9wLT5yZWcgPSAkMTsKLQkJfQotCXwgQVIKLQkJewotCQkgIG9wLT5tb2RlID0gQVJFRzsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCX0KLQl8IEZQUgotCQl7Ci0JCSAgb3AtPm1vZGUgPSBGUFJFRzsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCX0KLQl8IEZQQ1IKLQkJewotCQkgIG9wLT5tb2RlID0gQ09OVFJPTDsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCX0KLQl8IENSRUcKLQkJewotCQkgIG9wLT5tb2RlID0gQ09OVFJPTDsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCX0KLQl8IEVYUFIKLQkJewotCQkgIG9wLT5tb2RlID0gQUJTTDsKLQkJICBvcC0+ZGlzcCA9ICQxOwotCQl9Ci0JfCAnIycgRVhQUgotCQl7Ci0JCSAgb3AtPm1vZGUgPSBJTU1FRDsKLQkJICBvcC0+ZGlzcCA9ICQyOwotCQl9Ci0JfCAnJicgRVhQUgotCQl7Ci0JCSAgb3AtPm1vZGUgPSBJTU1FRDsKLQkJICBvcC0+ZGlzcCA9ICQyOwotCQl9Ci0JfCByZWdsaXN0Ci0JCXsKLQkJICBvcC0+bW9kZSA9IFJFR0xTVDsKLQkJICBvcC0+bWFzayA9ICQxOwotCQl9Ci0JOwotCi0vKiBBbiBvcGVyYW5kIGluIE1vdG9yb2xhIHN5bnRheC4gIFRoaXMgaW5jbHVkZXMgTVJJIHN5bnRheCBhcyB3ZWxsLAotICAgd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgZGlmZmVyZW50IGluIHRoYXQgaXQgcGVybWl0cyBjb21tdXRhdGl2aXR5Ci0gICBvZiBpbmRleCBhbmQgYmFzZSByZWdpc3RlcnMsIGFuZCBwZXJtaXRzIGFuIG9mZnNldCBleHByZXNzaW9uIHRvCi0gICBhcHBlYXIgaW5zaWRlIG9yIG91dHNpZGUgb2YgdGhlIHBhcmVudGhlc2VzLiAgKi8KLQotbW90b3JvbGFfb3BlcmFuZDoKLQkgICcoJyBBUiAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gQUlORFI7Ci0JCSAgb3AtPnJlZyA9ICQyOwotCQl9Ci0JfCAnKCcgQVIgJyknICcrJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBBSU5DOwotCQkgIG9wLT5yZWcgPSAkMjsKLQkJfQotCXwgJy0nICcoJyBBUiAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gQURFQzsKLQkJICBvcC0+cmVnID0gJDM7Ci0JCX0KLQl8ICcoJyBFWFBSICcsJyB6YXBjICcpJwotCQl7Ci0JCSAgb3AtPnJlZyA9ICQ0OwotCQkgIG9wLT5kaXNwID0gJDI7Ci0JCSAgaWYgKCgkNCA+PSBaQUREUjAgJiYgJDQgPD0gWkFERFI3KQotCQkgICAgICB8fCAkNCA9PSBaUEMpCi0JCSAgICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgZWxzZQotCQkgICAgb3AtPm1vZGUgPSBESVNQOwotCQl9Ci0JfCAnKCcgemFwYyAnLCcgRVhQUiAnKScKLQkJewotCQkgIG9wLT5yZWcgPSAkMjsKLQkJICBvcC0+ZGlzcCA9ICQ0OwotCQkgIGlmICgoJDIgPj0gWkFERFIwICYmICQyIDw9IFpBRERSNykKLQkJICAgICAgfHwgJDIgPT0gWlBDKQotCQkgICAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIGVsc2UKLQkJICAgIG9wLT5tb2RlID0gRElTUDsKLQkJfQotCXwgRVhQUiAnKCcgemFwYyAnKScKLQkJewotCQkgIG9wLT5yZWcgPSAkMzsKLQkJICBvcC0+ZGlzcCA9ICQxOwotCQkgIGlmICgoJDMgPj0gWkFERFIwICYmICQzIDw9IFpBRERSNykKLQkJICAgICAgfHwgJDMgPT0gWlBDKQotCQkgICAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIGVsc2UKLQkJICAgIG9wLT5tb2RlID0gRElTUDsKLQkJfQotCXwgJygnIExQQyAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gRElTUDsKLQkJICBvcC0+cmVnID0gJDI7Ci0JCX0KLQl8ICcoJyBaQVIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgb3AtPnJlZyA9ICQyOwotCQl9Ci0JfCAnKCcgTFpQQyAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBvcC0+cmVnID0gJDI7Ci0JCX0KLQl8ICcoJyBFWFBSICcsJyB6YXBjICcsJyB6aXJlZyAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBvcC0+cmVnID0gJDQ7Ci0JCSAgb3AtPmRpc3AgPSAkMjsKLQkJICBvcC0+aW5kZXggPSAkNjsKLQkJfQotCXwgJygnIEVYUFIgJywnIHphcGMgJywnIHpwYyAnKScKLQkJewotCQkgIGlmICgkNCA9PSBQQyB8fCAkNCA9PSBaUEMpCi0JCSAgICB5eWVycm9yIChfKCJzeW50YXggZXJyb3IiKSk7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5yZWcgPSAkNjsKLQkJICBvcC0+ZGlzcCA9ICQyOwotCQkgIG9wLT5pbmRleC5yZWcgPSAkNDsKLQkJICBvcC0+aW5kZXguc2l6ZSA9IFNJWkVfVU5TUEVDOwotCQkgIG9wLT5pbmRleC5zY2FsZSA9IDE7Ci0JCX0KLQl8ICcoJyBFWFBSICcsJyB6ZGlyZWcgb3B0Y3phcGMgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgb3AtPnJlZyA9ICQ1OwotCQkgIG9wLT5kaXNwID0gJDI7Ci0JCSAgb3AtPmluZGV4ID0gJDQ7Ci0JCX0KLQl8ICcoJyB6ZGlyZWcgJywnIEVYUFIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgb3AtPmRpc3AgPSAkNDsKLQkJICBvcC0+aW5kZXggPSAkMjsKLQkJfQotCXwgRVhQUiAnKCcgemFwYyAnLCcgemlyZWcgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgb3AtPnJlZyA9ICQzOwotCQkgIG9wLT5kaXNwID0gJDE7Ci0JCSAgb3AtPmluZGV4ID0gJDU7Ci0JCX0KLQl8ICcoJyB6YXBjICcsJyB6aXJlZyAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBvcC0+cmVnID0gJDI7Ci0JCSAgb3AtPmluZGV4ID0gJDQ7Ci0JCX0KLQl8IEVYUFIgJygnIHphcGMgJywnIHpwYyAnKScKLQkJewotCQkgIGlmICgkMyA9PSBQQyB8fCAkMyA9PSBaUEMpCi0JCSAgICB5eWVycm9yIChfKCJzeW50YXggZXJyb3IiKSk7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5yZWcgPSAkNTsKLQkJICBvcC0+ZGlzcCA9ICQxOwotCQkgIG9wLT5pbmRleC5yZWcgPSAkMzsKLQkJICBvcC0+aW5kZXguc2l6ZSA9IFNJWkVfVU5TUEVDOwotCQkgIG9wLT5pbmRleC5zY2FsZSA9IDE7Ci0JCX0KLQl8ICcoJyB6YXBjICcsJyB6cGMgJyknCi0JCXsKLQkJICBpZiAoJDIgPT0gUEMgfHwgJDIgPT0gWlBDKQotCQkgICAgeXllcnJvciAoXygic3ludGF4IGVycm9yIikpOwotCQkgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBvcC0+cmVnID0gJDQ7Ci0JCSAgb3AtPmluZGV4LnJlZyA9ICQyOwotCQkgIG9wLT5pbmRleC5zaXplID0gU0laRV9VTlNQRUM7Ci0JCSAgb3AtPmluZGV4LnNjYWxlID0gMTsKLQkJfQotCXwgRVhQUiAnKCcgemRpcmVnIG9wdGN6YXBjICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5yZWcgPSAkNDsKLQkJICBvcC0+ZGlzcCA9ICQxOwotCQkgIG9wLT5pbmRleCA9ICQzOwotCQl9Ci0JfCAnKCcgemRpcmVnIG9wdGN6YXBjICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5yZWcgPSAkMzsKLQkJICBvcC0+aW5kZXggPSAkMjsKLQkJfQotCXwgJygnICdbJyBFWFBSIG9wdGN6YXBjICddJyAnLCcgemlyZWcgb3B0Y2V4cHIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IFBPU1Q7Ci0JCSAgb3AtPnJlZyA9ICQ0OwotCQkgIG9wLT5kaXNwID0gJDM7Ci0JCSAgb3AtPmluZGV4ID0gJDc7Ci0JCSAgb3AtPm9kaXNwID0gJDg7Ci0JCX0KLQl8ICcoJyAnWycgRVhQUiBvcHRjemFwYyAnXScgb3B0Y2V4cHIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IFBPU1Q7Ci0JCSAgb3AtPnJlZyA9ICQ0OwotCQkgIG9wLT5kaXNwID0gJDM7Ci0JCSAgb3AtPm9kaXNwID0gJDY7Ci0JCX0KLQl8ICcoJyAnWycgemFwYyAnXScgJywnIHppcmVnIG9wdGNleHByICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBQT1NUOwotCQkgIG9wLT5yZWcgPSAkMzsKLQkJICBvcC0+aW5kZXggPSAkNjsKLQkJICBvcC0+b2Rpc3AgPSAkNzsKLQkJfQotCXwgJygnICdbJyB6YXBjICddJyBvcHRjZXhwciAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUE9TVDsKLQkJICBvcC0+cmVnID0gJDM7Ci0JCSAgb3AtPm9kaXNwID0gJDU7Ci0JCX0KLQl8ICcoJyAnWycgRVhQUiAnLCcgemFwYyAnLCcgemlyZWcgJ10nIG9wdGNleHByICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBQUkU7Ci0JCSAgb3AtPnJlZyA9ICQ1OwotCQkgIG9wLT5kaXNwID0gJDM7Ci0JCSAgb3AtPmluZGV4ID0gJDc7Ci0JCSAgb3AtPm9kaXNwID0gJDk7Ci0JCX0KLQl8ICcoJyAnWycgemFwYyAnLCcgemlyZWcgJ10nIG9wdGNleHByICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBQUkU7Ci0JCSAgb3AtPnJlZyA9ICQzOwotCQkgIG9wLT5pbmRleCA9ICQ1OwotCQkgIG9wLT5vZGlzcCA9ICQ3OwotCQl9Ci0JfCAnKCcgJ1snIEVYUFIgJywnIHphcGMgJywnIHpwYyAnXScgb3B0Y2V4cHIgJyknCi0JCXsKLQkJICBpZiAoJDUgPT0gUEMgfHwgJDUgPT0gWlBDKQotCQkgICAgeXllcnJvciAoXygic3ludGF4IGVycm9yIikpOwotCQkgIG9wLT5tb2RlID0gUFJFOwotCQkgIG9wLT5yZWcgPSAkNzsKLQkJICBvcC0+ZGlzcCA9ICQzOwotCQkgIG9wLT5pbmRleC5yZWcgPSAkNTsKLQkJICBvcC0+aW5kZXguc2l6ZSA9IFNJWkVfVU5TUEVDOwotCQkgIG9wLT5pbmRleC5zY2FsZSA9IDE7Ci0JCSAgb3AtPm9kaXNwID0gJDk7Ci0JCX0KLQl8ICcoJyAnWycgemFwYyAnLCcgenBjICddJyBvcHRjZXhwciAnKScKLQkJewotCQkgIGlmICgkMyA9PSBQQyB8fCAkMyA9PSBaUEMpCi0JCSAgICB5eWVycm9yIChfKCJzeW50YXggZXJyb3IiKSk7Ci0JCSAgb3AtPm1vZGUgPSBQUkU7Ci0JCSAgb3AtPnJlZyA9ICQ1OwotCQkgIG9wLT5pbmRleC5yZWcgPSAkMzsKLQkJICBvcC0+aW5kZXguc2l6ZSA9IFNJWkVfVU5TUEVDOwotCQkgIG9wLT5pbmRleC5zY2FsZSA9IDE7Ci0JCSAgb3AtPm9kaXNwID0gJDc7Ci0JCX0KLQl8ICcoJyAnWycgb3B0ZXhwcmMgemRpcmVnIG9wdGN6YXBjICddJyBvcHRjZXhwciAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUFJFOwotCQkgIG9wLT5yZWcgPSAkNTsKLQkJICBvcC0+ZGlzcCA9ICQzOwotCQkgIG9wLT5pbmRleCA9ICQ0OwotCQkgIG9wLT5vZGlzcCA9ICQ3OwotCQl9Ci0JOwotCi0vKiBBbiBvcGVyYW5kIGluIE1JVCBzeW50YXguICAqLwotCi1taXRfb3BlcmFuZDoKLQkgIG9wdHphcGMgJ0AnCi0JCXsKLQkJICAvKiBXZSB1c2Ugb3B0emFwYyB0byBhdm9pZCBhIHNoaWZ0L3JlZHVjZSBjb25mbGljdC4gICovCi0JCSAgaWYgKCQxIDwgQUREUjAgfHwgJDEgPiBBRERSNykKLQkJICAgIHl5ZXJyb3IgKF8oInN5bnRheCBlcnJvciIpKTsKLQkJICBvcC0+bW9kZSA9IEFJTkRSOwotCQkgIG9wLT5yZWcgPSAkMTsKLQkJfQotCXwgb3B0emFwYyAnQCcgJysnCi0JCXsKLQkJICAvKiBXZSB1c2Ugb3B0emFwYyB0byBhdm9pZCBhIHNoaWZ0L3JlZHVjZSBjb25mbGljdC4gICovCi0JCSAgaWYgKCQxIDwgQUREUjAgfHwgJDEgPiBBRERSNykKLQkJICAgIHl5ZXJyb3IgKF8oInN5bnRheCBlcnJvciIpKTsKLQkJICBvcC0+bW9kZSA9IEFJTkM7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQl9Ci0JfCBvcHR6YXBjICdAJyAnLScKLQkJewotCQkgIC8qIFdlIHVzZSBvcHR6YXBjIHRvIGF2b2lkIGEgc2hpZnQvcmVkdWNlIGNvbmZsaWN0LiAgKi8KLQkJICBpZiAoJDEgPCBBRERSMCB8fCAkMSA+IEFERFI3KQotCQkgICAgeXllcnJvciAoXygic3ludGF4IGVycm9yIikpOwotCQkgIG9wLT5tb2RlID0gQURFQzsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCX0KLQl8IG9wdHphcGMgJ0AnICcoJyBFWFBSICcpJwotCQl7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQkgIG9wLT5kaXNwID0gJDQ7Ci0JCSAgaWYgKCgkMSA+PSBaQUREUjAgJiYgJDEgPD0gWkFERFI3KQotCQkgICAgICB8fCAkMSA9PSBaUEMpCi0JCSAgICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgZWxzZQotCQkgICAgb3AtPm1vZGUgPSBESVNQOwotCQl9Ci0JfCBvcHR6YXBjICdAJyAnKCcgb3B0ZXhwcmMgemlyZWcgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQkgIG9wLT5kaXNwID0gJDQ7Ci0JCSAgb3AtPmluZGV4ID0gJDU7Ci0JCX0KLQl8IG9wdHphcGMgJ0AnICcoJyBFWFBSICcpJyAnQCcgJygnIG9wdGV4cHJjIHppcmVnICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBQT1NUOwotCQkgIG9wLT5yZWcgPSAkMTsKLQkJICBvcC0+ZGlzcCA9ICQ0OwotCQkgIG9wLT5pbmRleCA9ICQ5OwotCQkgIG9wLT5vZGlzcCA9ICQ4OwotCQl9Ci0JfCBvcHR6YXBjICdAJyAnKCcgRVhQUiAnKScgJ0AnICcoJyBFWFBSICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBQT1NUOwotCQkgIG9wLT5yZWcgPSAkMTsKLQkJICBvcC0+ZGlzcCA9ICQ0OwotCQkgIG9wLT5vZGlzcCA9ICQ4OwotCQl9Ci0JfCBvcHR6YXBjICdAJyAnKCcgb3B0ZXhwcmMgemlyZWcgJyknICdAJyAnKCcgRVhQUiAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUFJFOwotCQkgIG9wLT5yZWcgPSAkMTsKLQkJICBvcC0+ZGlzcCA9ICQ0OwotCQkgIG9wLT5pbmRleCA9ICQ1OwotCQkgIG9wLT5vZGlzcCA9ICQ5OwotCQl9Ci0JOwotCi0vKiBBbiBpbmRleCByZWdpc3RlciwgcG9zc2libHkgc3VwcHJlc3NlZCwgd2hpY2ggbmVlZCBub3QgaGF2ZSBhIHNpemUKLSAgIG9yIHNjYWxlLiAgKi8KLQotemlyZWc6Ci0JICBJTkRFWFJFRwotCXwgemFkcgotCQl7Ci0JCSAgJCQucmVnID0gJDE7Ci0JCSAgJCQuc2l6ZSA9IFNJWkVfVU5TUEVDOwotCQkgICQkLnNjYWxlID0gMTsKLQkJfQotCTsKLQotLyogQSByZWdpc3RlciB3aGljaCBtYXkgYmUgYW4gaW5kZXggcmVnaXN0ZXIsIGJ1dCB3aGljaCBtYXkgbm90IGJlIGFuCi0gICBhZGRyZXNzIHJlZ2lzdGVyLiAgVGhpcyBub250ZXJtaW5hbCBpcyB1c2VkIHRvIGF2b2lkIGFtYmlndWl0eSB3aGVuCi0gICB0cnlpbmcgdG8gcGFyc2Ugc29tZXRoaW5nIGxpa2UgKDAsZDUsYTYpIGFzIGNvbXBhcmVkIHRvICgwLGE2LGQ1KS4gICovCi0KLXpkaXJlZzoKLQkgIElOREVYUkVHCi0JfCB6ZHIKLQkJewotCQkgICQkLnJlZyA9ICQxOwotCQkgICQkLnNpemUgPSBTSVpFX1VOU1BFQzsKLQkJICAkJC5zY2FsZSA9IDE7Ci0JCX0KLQk7Ci0KLS8qIEFuIGFkZHJlc3Mgb3IgZGF0YSByZWdpc3Rlciwgb3IgYSBzdXBwcmVzc2VkIGFkZHJlc3Mgb3IgZGF0YQotICAgcmVnaXN0ZXIuICAqLwotCi16YWRyOgotCSAgemRyCi0JfCBBUgotCXwgWkFSCi0JOwotCi0vKiBBIGRhdGEgcmVnaXN0ZXIgd2hpY2ggbWF5IGJlIHN1cHByZXNzZWQuICAqLwotCi16ZHI6Ci0JICBEUgotCXwgWkRSCi0JOwotCi0vKiBFaXRoZXIgYW4gYWRkcmVzcyByZWdpc3RlciBvciB0aGUgUEMuICAqLwotCi1hcGM6Ci0JICBBUgotCXwgTFBDCi0JOwotCi0vKiBFaXRoZXIgYW4gYWRkcmVzcyByZWdpc3Rlciwgb3IgdGhlIFBDLCBvciBhIHN1cHByZXNzZWQgYWRkcmVzcwotICAgcmVnaXN0ZXIsIG9yIGEgc3VwcHJlc3NlZCBQQy4gICovCi0KLXphcGM6Ci0JICBhcGMKLQl8IExaUEMKLQl8IFpBUgotCTsKLQotLyogQW4gb3B0aW9uYWwgemFwYy4gICovCi0KLW9wdHphcGM6Ci0JICAvKiBlbXB0eSAqLwotCQl7Ci0JCSAgJCQgPSBaQUREUjA7Ci0JCX0KLQl8IHphcGMKLQk7Ci0KLS8qIFRoZSBQQywgb3B0aW9uYWxseSBzdXBwcmVzc2VkLiAgKi8KLQotenBjOgotCSAgTFBDCi0JfCBMWlBDCi0JOwotCi0vKiAnLCcgemFwYyB3aGVuIGl0IG1heSBiZSBvbWl0dGVkLiAgKi8KLQotb3B0Y3phcGM6Ci0JICAvKiBlbXB0eSAqLwotCQl7Ci0JCSAgJCQgPSBaQUREUjA7Ci0JCX0KLQl8ICcsJyB6YXBjCi0JCXsKLQkJICAkJCA9ICQyOwotCQl9Ci0JOwotCi0vKiAnLCcgRVhQUiB3aGVuIGl0IG1heSBiZSBvbWl0dGVkLiAgKi8KLQotb3B0Y2V4cHI6Ci0JICAvKiBlbXB0eSAqLwotCQl7Ci0JCSAgJCQuZXhwLlhfb3AgPSBPX2Fic2VudDsKLQkJICAkJC5zaXplID0gU0laRV9VTlNQRUM7Ci0JCX0KLQl8ICcsJyBFWFBSCi0JCXsKLQkJICAkJCA9ICQyOwotCQl9Ci0JOwotCi0vKiBFWFBSICcsJyB3aGVuIGl0IG1heSBiZSBvbWl0dGVkLiAgKi8KLQotb3B0ZXhwcmM6Ci0JICAvKiBlbXB0eSAqLwotCQl7Ci0JCSAgJCQuZXhwLlhfb3AgPSBPX2Fic2VudDsKLQkJICAkJC5zaXplID0gU0laRV9VTlNQRUM7Ci0JCX0KLQl8IEVYUFIgJywnCi0JCXsKLQkJICAkJCA9ICQxOwotCQl9Ci0JOwotCi0vKiBBIHJlZ2lzdGVyIGxpc3QgZm9yIHRoZSBtb3ZlbSBpbnN0cnVjdGlvbi4gICovCi0KLXJlZ2xpc3Q6Ci0JICByZWdsaXN0cGFpcgotCXwgcmVnbGlzdHBhaXIgJy8nIGlyZWdsaXN0Ci0JCXsKLQkJICAkJCA9ICQxIHwgJDM7Ci0JCX0KLQl8IHJlZ2xpc3RyZWcgJy8nIGlyZWdsaXN0Ci0JCXsKLQkJICAkJCA9ICgxIDw8ICQxKSB8ICQzOwotCQl9Ci0JOwotCi0vKiBXZSB1c2UgaXJlZ2xpc3Qgd2hlbiB3ZSBrbm93IHdlIGFyZSBsb29raW5nIGF0IGEgcmVnbGlzdCwgYW5kIHdlCi0gICBjYW4gc2FmZWx5IHJlZHVjZSBhIHNpbXBsZSByZWdpc3RlciB0byByZWdsaXN0cmVnLiAgSWYgd2UgcGVybWl0dGVkCi0gICByZWdsaXN0IHRvIHJlZHVjZSB0byByZWdsaXN0cmVnLCBpdCB3b3VsZCBiZSBhbWJpZ3VvdXMgd2hldGhlciBhCi0gICBwbGFpbiByZWdpc3RlciB3ZXJlIGEgRFJFRy9BUkVHL0ZQUkVHIG9yIGEgUkVHTFNULiAgKi8KLQotaXJlZ2xpc3Q6Ci0JICByZWdsaXN0cmVnCi0JCXsKLQkJICAkJCA9IDEgPDwgJDE7Ci0JCX0KLQl8IHJlZ2xpc3RwYWlyCi0JfCByZWdsaXN0cGFpciAnLycgaXJlZ2xpc3QKLQkJewotCQkgICQkID0gJDEgfCAkMzsKLQkJfQotCXwgcmVnbGlzdHJlZyAnLycgaXJlZ2xpc3QKLQkJewotCQkgICQkID0gKDEgPDwgJDEpIHwgJDM7Ci0JCX0KLQk7Ci0KLXJlZ2xpc3RwYWlyOgotCSAgcmVnbGlzdHJlZyAnLScgcmVnbGlzdHJlZwotCQl7Ci0JCSAgaWYgKCQxIDw9ICQzKQotCQkgICAgJCQgPSAoMSA8PCAoJDMgKyAxKSkgLSAxIC0gKCgxIDw8ICQxKSAtIDEpOwotCQkgIGVsc2UKLQkJICAgICQkID0gKDEgPDwgKCQxICsgMSkpIC0gMSAtICgoMSA8PCAkMykgLSAxKTsKLQkJfQotCTsKLQotcmVnbGlzdHJlZzoKLQkgIERSCi0JCXsKLQkJICAkJCA9ICQxIC0gREFUQTA7Ci0JCX0KLQl8IEFSCi0JCXsKLQkJICAkJCA9ICQxIC0gQUREUjAgKyA4OwotCQl9Ci0JfCBGUFIKLQkJewotCQkgICQkID0gJDEgLSBGUDAgKyAxNjsKLQkJfQotCXwgRlBDUgotCQl7Ci0JCSAgaWYgKCQxID09IEZQSSkKLQkJICAgICQkID0gMjQ7Ci0JCSAgZWxzZSBpZiAoJDEgPT0gRlBTKQotCQkgICAgJCQgPSAyNTsKLQkJICBlbHNlCi0JCSAgICAkJCA9IDI2OwotCQl9Ci0JOwotCi0lJQotCi0vKiBUaGUgc3RyaW5nIHRvIHBhcnNlIGlzIHN0b3JlZCBoZXJlLCBhbmQgbW9kaWZpZWQgYnkgeXlsZXguICAqLwotCi1zdGF0aWMgY2hhciAqc3RyOwotCi0vKiBUaGUgb3JpZ2luYWwgc3RyaW5nIHBvaW50ZXIuICAqLwotCi1zdGF0aWMgY2hhciAqc3Ryb3JpZzsKLQotLyogSWYgKkNDUCBjb3VsZCBiZSBhIHJlZ2lzdGVyLCByZXR1cm4gdGhlIHJlZ2lzdGVyIG51bWJlciBhbmQgYWR2YW5jZQotICAgKkNDUC4gIE90aGVyd2lzZSBkb24ndCBjaGFuZ2UgKkNDUCwgYW5kIHJldHVybiAwLiAgKi8KLQotc3RhdGljIGVudW0gbTY4a19yZWdpc3RlcgotbTY4a19yZWdfcGFyc2UgKGNjcCkKLSAgICAgcmVnaXN0ZXIgY2hhciAqKmNjcDsKLXsKLSAgY2hhciAqc3RhcnQgPSAqY2NwOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIHN5bWJvbFMgKnN5bWJvbHA7Ci0KLSAgaWYgKGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCkKLSAgICB7Ci0gICAgICBpZiAoKnN0YXJ0ID09IFJFR0lTVEVSX1BSRUZJWCkKLQlzdGFydCsrOwotICAgICAgcCA9IHN0YXJ0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICgqc3RhcnQgIT0gUkVHSVNURVJfUFJFRklYKQotCXJldHVybiAwOwotICAgICAgcCA9IHN0YXJ0ICsgMTsKLSAgICB9Ci0KLSAgaWYgKCEgaXNfbmFtZV9iZWdpbm5lciAoKnApKQotICAgIHJldHVybiAwOwotCi0gIHArKzsKLSAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoKnApICYmICpwICE9ICcuJyAmJiAqcCAhPSAnOicgJiYgKnAgIT0gJyonKQotICAgIHArKzsKLQotICBjID0gKnA7Ci0gICpwID0gMDsKLSAgc3ltYm9scCA9IHN5bWJvbF9maW5kIChzdGFydCk7Ci0gICpwID0gYzsKLQotICBpZiAoc3ltYm9scCAhPSBOVUxMICYmIFNfR0VUX1NFR01FTlQgKHN5bWJvbHApID09IHJlZ19zZWN0aW9uKQotICAgIHsKLSAgICAgICpjY3AgPSBwOwotICAgICAgcmV0dXJuIFNfR0VUX1ZBTFVFIChzeW1ib2xwKTsKLSAgICB9Ci0KLSAgLyogSW4gTVJJIG1vZGUsIHNvbWV0aGluZyBsaWtlIGZvby5iYXIgY2FuIGJlIGVxdWF0ZWQgdG8gYSByZWdpc3RlcgotICAgICBuYW1lLiAgKi8KLSAgd2hpbGUgKGZsYWdfbXJpICYmIGMgPT0gJy4nKQotICAgIHsKLSAgICAgICsrcDsKLSAgICAgIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKCpwKSAmJiAqcCAhPSAnLicgJiYgKnAgIT0gJzonICYmICpwICE9ICcqJykKLQlwKys7Ci0gICAgICBjID0gKnA7Ci0gICAgICAqcCA9ICdcMCc7Ci0gICAgICBzeW1ib2xwID0gc3ltYm9sX2ZpbmQgKHN0YXJ0KTsKLSAgICAgICpwID0gYzsKLSAgICAgIGlmIChzeW1ib2xwICE9IE5VTEwgJiYgU19HRVRfU0VHTUVOVCAoc3ltYm9scCkgPT0gcmVnX3NlY3Rpb24pCi0JewotCSAgKmNjcCA9IHA7Ci0JICByZXR1cm4gU19HRVRfVkFMVUUgKHN5bWJvbHApOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoZSBsZXhlci4gICovCi0KLXN0YXRpYyBpbnQKLXl5bGV4ICgpCi17Ci0gIGVudW0gbTY4a19yZWdpc3RlciByZWc7Ci0gIGNoYXIgKnM7Ci0gIGludCBwYXJlbnM7Ci0gIGludCBjID0gMDsKLSAgaW50IHRhaWwgPSAwOwotICBjaGFyICpob2xkOwotCi0gIGlmICgqc3RyID09ICcgJykKLSAgICArK3N0cjsKLQotICBpZiAoKnN0ciA9PSAnXDAnKQotICAgIHJldHVybiAwOwotCi0gIC8qIFZhcmlvdXMgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSBqdXN0IHJldHVybmVkIGRpcmVjdGx5LiAgKi8KLSAgc3dpdGNoICgqc3RyKQotICAgIHsKLSAgICBjYXNlICdAJzoKLSAgICAgIC8qIEluIE1SSSBtb2RlLCB0aGlzIGNhbiBiZSB0aGUgc3RhcnQgb2YgYW4gb2N0YWwgbnVtYmVyLiAgKi8KLSAgICAgIGlmIChmbGFnX21yaSkKLQl7Ci0JICBpZiAoaXNkaWdpdCAoc3RyWzFdKQotCSAgICAgIHx8ICgoc3RyWzFdID09ICcrJyB8fCBzdHJbMV0gPT0gJy0nKQotCQkgICYmIGlzZGlnaXQgKHN0clsyXSkpKQotCSAgICBicmVhazsKLQl9Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgJyMnOgotICAgIGNhc2UgJyYnOgotICAgIGNhc2UgJywnOgotICAgIGNhc2UgJyknOgotICAgIGNhc2UgJy8nOgotICAgIGNhc2UgJ1snOgotICAgIGNhc2UgJ10nOgotICAgICAgcmV0dXJuICpzdHIrKzsKLSAgICBjYXNlICcrJzoKLSAgICAgIC8qIEl0IHNvIGhhcHBlbnMgdGhhdCBhICcrJyBjYW4gb25seSBhcHBlYXIgYXQgdGhlIGVuZCBvZiBhbgotICAgICAgICAgb3BlcmFuZC4gIElmIGl0IGFwcGVhcnMgYW55d2hlcmUgZWxzZSwgaXQgbXVzdCBiZSBhIHVuYXJ5Ci0gICAgICAgICBwbHVzIG9uIGFuIGV4cHJlc3Npb24uICAqLwotICAgICAgaWYgKHN0clsxXSA9PSAnXDAnKQotCXJldHVybiAqc3RyKys7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICctJzoKLSAgICAgIC8qIEEgJy0nIGNhbiBvbmx5IGFwcGVhciBpbiAtKGFyKSwgcm4tcm4sIG9yIGFyQC0uICBJZiBpdAotICAgICAgICAgYXBwZWFycyBhbnl3aGVyZSBlbHNlLCBpdCBtdXN0IGJlIGEgdW5hcnkgbWludXMgb24gYW4KLSAgICAgICAgIGV4cHJlc3Npb24uICAqLwotICAgICAgaWYgKHN0clsxXSA9PSAnXDAnKQotCXJldHVybiAqc3RyKys7Ci0gICAgICBzID0gc3RyICsgMTsKLSAgICAgIGlmICgqcyA9PSAnKCcpCi0JKytzOwotICAgICAgaWYgKG02OGtfcmVnX3BhcnNlICgmcykgIT0gMCkKLQlyZXR1cm4gKnN0cisrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnKCc6Ci0gICAgICAvKiBBICcoJyBjYW4gb25seSBhcHBlYXIgaW4gYChyZWcpJywgYChleHByLC4uLicsIGAoWycsIGBAKCcsIG9yCi0gICAgICAgICBgKSgnLiAgSWYgaXQgYXBwZWFycyBhbnl3aGVyZSBlbHNlLCBpdCBtdXN0IGJlIHN0YXJ0aW5nIGFuCi0gICAgICAgICBleHByZXNzaW9uLiAgKi8KLSAgICAgIGlmIChzdHJbMV0gPT0gJ1snCi0JICB8fCAoc3RyID4gc3Ryb3JpZwotCSAgICAgICYmIChzdHJbLTFdID09ICdAJwotCQkgIHx8IHN0clstMV0gPT0gJyknKSkpCi0JcmV0dXJuICpzdHIrKzsKLSAgICAgIHMgPSBzdHIgKyAxOwotICAgICAgaWYgKG02OGtfcmVnX3BhcnNlICgmcykgIT0gMCkKLQlyZXR1cm4gKnN0cisrOwotICAgICAgLyogQ2hlY2sgZm9yIHRoZSBjYXNlIG9mICcoZXhwciwuLi4nIGJ5IHNjYW5uaW5nIGFoZWFkLiAgSWYgd2UKLSAgICAgICAgIGZpbmQgYSBjb21tYSBvdXRzaWRlIG9mIGJhbGFuY2VkIHBhcmVudGhlc2VzLCB3ZSByZXR1cm4gJygnLgotICAgICAgICAgSWYgd2UgZmluZCBhbiB1bmJhbGFuY2VkIHJpZ2h0IHBhcmVudGhlc2lzLCB0aGVuIHByZXN1bWFibHkKLSAgICAgICAgIHRoZSAnKCcgcmVhbGx5IHN0YXJ0cyBhbiBleHByZXNzaW9uLiAgKi8KLSAgICAgIHBhcmVucyA9IDA7Ci0gICAgICBmb3IgKHMgPSBzdHIgKyAxOyAqcyAhPSAnXDAnOyBzKyspCi0JewotCSAgaWYgKCpzID09ICcoJykKLQkgICAgKytwYXJlbnM7Ci0JICBlbHNlIGlmICgqcyA9PSAnKScpCi0JICAgIHsKLQkgICAgICBpZiAocGFyZW5zID09IDApCi0JCWJyZWFrOwotCSAgICAgIC0tcGFyZW5zOwotCSAgICB9Ci0JICBlbHNlIGlmICgqcyA9PSAnLCcgJiYgcGFyZW5zID09IDApCi0JICAgIHsKLQkgICAgICAvKiBBIGNvbW1hIGNhbiBub3Qgbm9ybWFsbHkgYXBwZWFyIGluIGFuIGV4cHJlc3Npb24sIHNvCi0JCSB0aGlzIGlzIGEgY2FzZSBvZiAnKGV4cHIsLi4uJy4gICovCi0JICAgICAgcmV0dXJuICpzdHIrKzsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogU2VlIGlmIGl0J3MgYSByZWdpc3Rlci4gICovCi0KLSAgcmVnID0gbTY4a19yZWdfcGFyc2UgKCZzdHIpOwotICBpZiAocmVnICE9IDApCi0gICAgewotICAgICAgaW50IHJldDsKLQotICAgICAgeXlsdmFsLnJlZyA9IHJlZzsKLQotICAgICAgaWYgKHJlZyA+PSBEQVRBMCAmJiByZWcgPD0gREFUQTcpCi0JcmV0ID0gRFI7Ci0gICAgICBlbHNlIGlmIChyZWcgPj0gQUREUjAgJiYgcmVnIDw9IEFERFI3KQotCXJldCA9IEFSOwotICAgICAgZWxzZSBpZiAocmVnID49IEZQMCAmJiByZWcgPD0gRlA3KQotCXJldHVybiBGUFI7Ci0gICAgICBlbHNlIGlmIChyZWcgPT0gRlBJCi0JICAgICAgIHx8IHJlZyA9PSBGUFMKLQkgICAgICAgfHwgcmVnID09IEZQQykKLQlyZXR1cm4gRlBDUjsKLSAgICAgIGVsc2UgaWYgKHJlZyA9PSBQQykKLQlyZXR1cm4gTFBDOwotICAgICAgZWxzZSBpZiAocmVnID49IFpEQVRBMCAmJiByZWcgPD0gWkRBVEE3KQotCXJldCA9IFpEUjsKLSAgICAgIGVsc2UgaWYgKHJlZyA+PSBaQUREUjAgJiYgcmVnIDw9IFpBRERSNykKLQlyZXQgPSBaQVI7Ci0gICAgICBlbHNlIGlmIChyZWcgPT0gWlBDKQotCXJldHVybiBMWlBDOwotICAgICAgZWxzZQotCXJldHVybiBDUkVHOwotCi0gICAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgaGF2ZSBhIGRhdGEgb3IgYWRkcmVzcyByZWdpc3Rlci4gIFdlCi0JIG11c3QgY2hlY2sgZm9yIGEgc2l6ZSBvciBzY2FsZTsgaWYgd2UgZmluZCBvbmUsIHdlIG11c3QKLQkgcmV0dXJuIElOREVYUkVHLiAgKi8KLQotICAgICAgcyA9IHN0cjsKLQotICAgICAgaWYgKCpzICE9ICcuJyAmJiAqcyAhPSAnOicgJiYgKnMgIT0gJyonKQotCXJldHVybiByZXQ7Ci0KLSAgICAgIHl5bHZhbC5pbmRleHJlZy5yZWcgPSByZWc7Ci0KLSAgICAgIGlmICgqcyAhPSAnLicgJiYgKnMgIT0gJzonKQotCXl5bHZhbC5pbmRleHJlZy5zaXplID0gU0laRV9VTlNQRUM7Ci0gICAgICBlbHNlCi0JewotCSAgKytzOwotCSAgc3dpdGNoICgqcykKLQkgICAgewotCSAgICBjYXNlICd3JzoKLQkgICAgY2FzZSAnVyc6Ci0JICAgICAgeXlsdmFsLmluZGV4cmVnLnNpemUgPSBTSVpFX1dPUkQ7Ci0JICAgICAgKytzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdsJzoKLQkgICAgY2FzZSAnTCc6Ci0JICAgICAgeXlsdmFsLmluZGV4cmVnLnNpemUgPSBTSVpFX0xPTkc7Ci0JICAgICAgKytzOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHl5ZXJyb3IgKF8oImlsbGVnYWwgc2l6ZSBzcGVjaWZpY2F0aW9uIikpOwotCSAgICAgIHl5bHZhbC5pbmRleHJlZy5zaXplID0gU0laRV9VTlNQRUM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHl5bHZhbC5pbmRleHJlZy5zY2FsZSA9IDE7Ci0KLSAgICAgIGlmICgqcyA9PSAnKicgfHwgKnMgPT0gJzonKQotCXsKLQkgIGV4cHJlc3Npb25TIHNjYWxlOwotCi0JICArK3M7Ci0KLQkgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotCSAgZXhwcmVzc2lvbiAoJnNjYWxlKTsKLQkgIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCi0JICBpZiAoc2NhbGUuWF9vcCAhPSBPX2NvbnN0YW50KQotCSAgICB5eWVycm9yIChfKCJzY2FsZSBzcGVjaWZpY2F0aW9uIG11c3QgcmVzb2x2ZSB0byBhIG51bWJlciIpKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN3aXRjaCAoc2NhbGUuWF9hZGRfbnVtYmVyKQotCQl7Ci0JCWNhc2UgMToKLQkJY2FzZSAyOgotCQljYXNlIDQ6Ci0JCWNhc2UgODoKLQkJICB5eWx2YWwuaW5kZXhyZWcuc2NhbGUgPSBzY2FsZS5YX2FkZF9udW1iZXI7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgeXllcnJvciAoXygiaW52YWxpZCBzY2FsZSB2YWx1ZSIpKTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBzdHIgPSBzOwotCi0gICAgICByZXR1cm4gSU5ERVhSRUc7Ci0gICAgfQotCi0gIC8qIEl0IG11c3QgYmUgYW4gZXhwcmVzc2lvbi4gIEJlZm9yZSB3ZSBjYWxsIGV4cHJlc3Npb24sIHdlIG5lZWQgdG8KLSAgICAgbG9vayBhaGVhZCB0byBzZWUgaWYgdGhlcmUgaXMgYSBzaXplIHNwZWNpZmljYXRpb24uICBXZSBtdXN0IGRvCi0gICAgIHRoYXQgZmlyc3QsIGJlY2F1c2Ugb3RoZXJ3aXNlIGZvby5sIHdpbGwgYmUgdHJlYXRlZCBhcyB0aGUgc3ltYm9sCi0gICAgIGZvby5sLCByYXRoZXIgdGhhbiBhcyB0aGUgc3ltYm9sIGZvbyB3aXRoIGEgbG9uZyBzaXplCi0gICAgIHNwZWNpZmljYXRpb24uICBUaGUgZ3JhbW1hciByZXF1aXJlcyB0aGF0IGFsbCBleHByZXNzaW9ucyBlbmQgYXQKLSAgICAgdGhlIGVuZCBvZiB0aGUgb3BlcmFuZCwgb3Igd2l0aCAnLCcsICcoJywgJ10nLCAnKScuICAqLwotCi0gIHBhcmVucyA9IDA7Ci0gIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJzsgcysrKQotICAgIHsKLSAgICAgIGlmICgqcyA9PSAnKCcpCi0JewotCSAgaWYgKHBhcmVucyA9PSAwCi0JICAgICAgJiYgcyA+IHN0cgotCSAgICAgICYmIChzWy0xXSA9PSAnKScgfHwgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNbLTFdKSkpCi0JICAgIGJyZWFrOwotCSAgKytwYXJlbnM7Ci0JfQotICAgICAgZWxzZSBpZiAoKnMgPT0gJyknKQotCXsKLQkgIGlmIChwYXJlbnMgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAtLXBhcmVuczsKLQl9Ci0gICAgICBlbHNlIGlmIChwYXJlbnMgPT0gMAotCSAgICAgICAmJiAoKnMgPT0gJywnIHx8ICpzID09ICddJykpCi0JYnJlYWs7Ci0gICAgfQotCi0gIHl5bHZhbC5leHAuc2l6ZSA9IFNJWkVfVU5TUEVDOwotICBpZiAocyA8PSBzdHIgKyAyCi0gICAgICB8fCAoc1stMl0gIT0gJy4nICYmIHNbLTJdICE9ICc6JykpCi0gICAgdGFpbCA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHNbLTFdKQotCXsKLQljYXNlICdzJzoKLQljYXNlICdTJzoKLQljYXNlICdiJzoKLQljYXNlICdCJzoKLQkgIHl5bHZhbC5leHAuc2l6ZSA9IFNJWkVfQllURTsKLQkgIGJyZWFrOwotCWNhc2UgJ3cnOgotCWNhc2UgJ1cnOgotCSAgeXlsdmFsLmV4cC5zaXplID0gU0laRV9XT1JEOwotCSAgYnJlYWs7Ci0JY2FzZSAnbCc6Ci0JY2FzZSAnTCc6Ci0JICB5eWx2YWwuZXhwLnNpemUgPSBTSVpFX0xPTkc7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKHl5bHZhbC5leHAuc2l6ZSAhPSBTSVpFX1VOU1BFQykKLQl0YWlsID0gMjsKLSAgICB9Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIHsKLSAgICAvKiBMb29rIGZvciBAUExUUEMsIGV0Yy4gICovCi0gICAgY2hhciAqY3A7Ci0KLSAgICB5eWx2YWwuZXhwLnBpY19yZWxvYyA9IHBpY19ub25lOwotICAgIGNwID0gcyAtIHRhaWw7Ci0gICAgaWYgKGNwIC0gNiA+IHN0ciAmJiBjcFstNl0gPT0gJ0AnKQotICAgICAgewotCWlmIChzdHJuY21wIChjcCAtIDYsICJAUExUUEMiLCA2KSA9PSAwKQotCSAgewotCSAgICB5eWx2YWwuZXhwLnBpY19yZWxvYyA9IHBpY19wbHRfcGNyZWw7Ci0JICAgIHRhaWwgKz0gNjsKLQkgIH0KLQllbHNlIGlmIChzdHJuY21wIChjcCAtIDYsICJAR09UUEMiLCA2KSA9PSAwKQotCSAgewotCSAgICB5eWx2YWwuZXhwLnBpY19yZWxvYyA9IHBpY19nb3RfcGNyZWw7Ci0JICAgIHRhaWwgKz0gNjsKLQkgIH0KLSAgICAgIH0KLSAgICBlbHNlIGlmIChjcCAtIDQgPiBzdHIgJiYgY3BbLTRdID09ICdAJykKLSAgICAgIHsKLQlpZiAoc3RybmNtcCAoY3AgLSA0LCAiQFBMVCIsIDQpID09IDApCi0JICB7Ci0JICAgIHl5bHZhbC5leHAucGljX3JlbG9jID0gcGljX3BsdF9vZmY7Ci0JICAgIHRhaWwgKz0gNDsKLQkgIH0KLQllbHNlIGlmIChzdHJuY21wIChjcCAtIDQsICJAR09UIiwgNCkgPT0gMCkKLQkgIHsKLQkgICAgeXlsdmFsLmV4cC5waWNfcmVsb2MgPSBwaWNfZ290X29mZjsKLQkgICAgdGFpbCArPSA0OwotCSAgfQotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICBpZiAodGFpbCAhPSAwKQotICAgIHsKLSAgICAgIGMgPSBzWy10YWlsXTsKLSAgICAgIHNbLXRhaWxdID0gMDsKLSAgICB9Ci0KLSAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotICBleHByZXNzaW9uICgmeXlsdmFsLmV4cC5leHApOwotICBzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0KLSAgaWYgKHRhaWwgIT0gMCkKLSAgICB7Ci0gICAgICBzWy10YWlsXSA9IGM7Ci0gICAgICBzdHIgPSBzOwotICAgIH0KLQotICByZXR1cm4gRVhQUjsKLX0KLQotLyogUGFyc2UgYW4gbTY4ayBvcGVyYW5kLiAgVGhpcyBpcyB0aGUgb25seSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQKLSAgIGZyb20gb3V0c2lkZSB0aGlzIGZpbGUuICAqLwotCi1pbnQKLW02OGtfaXBfb3AgKHMsIG9wYXJnKQotICAgICBjaGFyICpzOwotICAgICBzdHJ1Y3QgbTY4a19vcCAqb3Bhcmc7Ci17Ci0gIG1lbXNldCAob3BhcmcsIDAsIHNpemVvZiAqb3BhcmcpOwotICBvcGFyZy0+ZXJyb3IgPSBOVUxMOwotICBvcGFyZy0+aW5kZXgucmVnID0gWkRBVEEwOwotICBvcGFyZy0+aW5kZXguc2NhbGUgPSAxOwotICBvcGFyZy0+ZGlzcC5leHAuWF9vcCA9IE9fYWJzZW50OwotICBvcGFyZy0+b2Rpc3AuZXhwLlhfb3AgPSBPX2Fic2VudDsKLQotICBzdHIgPSBzdHJvcmlnID0gczsKLSAgb3AgPSBvcGFyZzsKLQotICByZXR1cm4geXlwYXJzZSAoKTsKLX0KLQotLyogVGhlIGVycm9yIGhhbmRsZXIuICAqLwotCi1zdGF0aWMgdm9pZAoteXllcnJvciAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgb3AtPmVycm9yID0gczsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvbTg4ay1vcGNvZGUuaCBiL2dhcy9jb25maWcvbTg4ay1vcGNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0NjRiYy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL204OGstb3Bjb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NTkgKzAsMCBAQAotLyogbTg4ay1vcGNvZGUuaCAtLSBJbnN0cnVjdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIE1vdG9yb2xhIDg4MDAwCi0gICBDb250cmlidXRlZCBieSBEZXZvbiBCb3dlbiBvZiBCdWZmYWxvIFVuaXZlcnNpdHkKLSAgIGFuZCBUb3Jiam9ybiBHcmFubHVuZCBvZiB0aGUgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MCwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWYgIWRlZmluZWQoX19TVERDX18pICYmICFkZWZpbmVkKGNvbnN0KQotI2RlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qCi0gIENoYXJhY3RlciBjb2RlcyBmb3Igb3Bfc3BlYyBmaWVsZCBiZWxvdy4KLSAgUmVzZXJ2ZWQgZm9yIHNlbGYtbWF0Y2hpbmc6IFsgXSAsCi0KLSAgZCA9IEdSRiBEZXN0aW5hdGlvbiByZWdpc3RlciAoMjE6NSkKLSAgeCA9IFhSRiByZWdpc3RlciBwcmVmaXguICBNYWtlcyBuZXh0IGQsIDEsIG9yIDIsIG1hdGNoIGFuIGV4dGVuZGVkIHJlZ2lzdGVyLgotICAxID0gU291cmNlIHJlZ2lzdGVyIDEgKDE2OjUpCi0gIDIgPSBTb3VyY2UgcmVnaXN0ZXIgMiAoMDo1KQotICAzID0gQm90aCBzb3VyY2UgcmVnaXN0ZXJzIChzYW1lIHZhbHVlKSAoMDo1IGFuZCAxNjo1KQotICBJID0gSU1NMTYgKDA6MTYpCi0gIGIgPSBiaXQgZmllbGQgc3BlYy4gKDA6MTApCi0gIHAgPSAxNiBiaXQgcGMgZGlzcGwuICgwOjE2KQotICBQID0gMjYgYml0IHBjIGRpc3BsLiAoMDoyNikKLSAgQiA9IGJiMC9iYjEgY29uZGl0aW9uICgyMTo1KQotICBNID0gYmNuZCBjb25kaXRpb24gKDIxOjUpCi0gIGYgPSBmY3IgKDU6NikKLSAgYyA9IGNyICg1OjYpCi0gIFYgPSBWRUM5ICgwOjkpCi0gIG8gPSBPNiBmaWVsZCBvZiAicHJvdCIgaW5zbiAoMTA6NykKLSAgPyA9IEdpdmUgd2FybmluZyBmb3IgdGhpcyBpbnNuL29wZXJhbmQgY29tYmluYXRpb24KLSAqLwotCi0vKiBpbnN0cnVjdGlvbiBkZXNjcmlwdG9yIHN0cnVjdHVyZSAqLwotCi1zdHJ1Y3QgbTg4a19vcGNvZGUKLXsKLSAgdW5zaWduZWQgaW50IG9wY29kZTsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqb3Bfc3BlYzsKLX07Ci0KLS8qIGFuZCBpbnRyb2R1Y2luZy4uLiB0aGUgTW90b3JvbGEgODgxMDAgYW5kIDg4MTEwIGluc3RydWN0aW9uIHNldHMuLi4gKi8KLQotLyogQnkgZGVmYXVsdCwgaW5jbHVkZSB0aGUgODgxMTAgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgTUM4ODExMAotCi0jaWYgZGVmaW5lZCAoTUM4ODExMCkKLSNkZWZpbmUgX01DODgxMDAoT1BDT0RFLE1ORU0sT1BfU1BFQykKLSNkZWZpbmUgX01DODgxMTAoT1BDT0RFLE1ORU0sT1BfU1BFQykge09QQ09ERSxNTkVNLE9QX1NQRUN9LAotI2Vsc2UKLSNkZWZpbmUgX01DODgxMDAoT1BDT0RFLE1ORU0sT1BfU1BFQykge09QQ09ERSxNTkVNLE9QX1NQRUN9LAotI2RlZmluZSBfTUM4ODExMChPUENPREUsTU5FTSxPUF9TUEVDKQotI2VuZGlmCi0KLSNkZWZpbmUgX01DODh4eHgoT1BDT0RFLE1ORU0sT1BfU1BFQykge09QQ09ERSxNTkVNLE9QX1NQRUN9LAotCi0vKiBFcXVhbCBtbmVtb25pY3MgbXVzdCBiZSBhZGphY2VudC4KLSAgIE1vcmUgc3BlY2lmaWMgb3BlcmFuZCBzcGVjaWZpY2F0aW9uIG11c3QgZ28gYmVmb3JlIG1vcmUgZ2VuZXJhbC4KLSAgIEZvciBleGFtcGxlLCAiZCwxLDIiIG11c3QgZ28gYmVmb3JlICJkLDEsSSIgYXMgYSByZWdpc3RlciBmb3IgczIKLSAgIHdvdWxkIG90aGVyd2lzZSBiZSBjb25zaWRlcmVkIGEgdmFyaWFibGUgbmFtZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbTg4a19vcGNvZGUgbTg4a19vcGNvZGVzW10gPQotewotICAvKgkgICBPcGNvZGUJTW5lbW9uaWMJT3BzcGVjICovCi0KLSAgX01DODh4eHggKDB4ZjQwMDcwMDAsICJhZGQiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4NzAwMDAwMDAsICJhZGQiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDcyMDAsICJhZGQuY2kiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNzMwMCwgImFkZC5jaW8iLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNzEwMCwgImFkZC5jbyIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDA2MDAwLCAiYWRkdSIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg2MDAwMDAwMCwgImFkZHUiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDYyMDAsICJhZGR1LmNpIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDYzMDAsICJhZGR1LmNpbyIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDA2MTAwLCAiYWRkdS5jbyIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDA0MDAwLCAiYW5kIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDQwMDAwMDAwLCAiYW5kIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA0NDAwLCAiYW5kLmMiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg0NDAwMDAwMCwgImFuZC51IiwJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZDAwMDAwMDAsICJiYjAiLAkJIkIsMSxwIikKLSAgX01DODh4eHggKDB4ZDQwMDAwMDAsICJiYjAubiIsCSJCLDEscCIpCi0gIF9NQzg4eHh4ICgweGQ4MDAwMDAwLCAiYmIxIiwJCSJCLDEscCIpCi0gIF9NQzg4eHh4ICgweGRjMDAwMDAwLCAiYmIxLm4iLAkiQiwxLHAiKQotICBfTUM4OHh4eCAoMHhlODAwMDAwMCwgImJjbmQiLAkJIk0sMSxwIikKLSAgX01DODh4eHggKDB4ZWMwMDAwMDAsICJiY25kLm4iLAkiTSwxLHAiKQotICBfTUM4OHh4eCAoMHhjMDAwMDAwMCwgImJyIiwJCSJQIikKLSAgX01DODh4eHggKDB4YzQwMDAwMDAsICJici5uIiwJCSJQIikKLSAgX01DODh4eHggKDB4YzgwMDAwMDAsICJic3IiLAkJIlAiKQotICBfTUM4OHh4eCAoMHhjYzAwMDAwMCwgImJzci5uIiwJIlAiKQotICBfTUM4OHh4eCAoMHhmNDAwODAwMCwgImNsciIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmMDAwODAwMCwgImNsciIsCQkiZCwxLGIiKQotICBfTUM4OHh4eCAoMHhmNDAwN2MwMCwgImNtcCIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg3YzAwMDAwMCwgImNtcCIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwNzgwMCwgImRpdiIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg3ODAwMDAwMCwgImRpdiIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwNzgwMCwgImRpdnMiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4NzgwMDAwMDAsICJkaXZzIiwJCSJkLDEsSSIpCi0gIF9NQzg4MTEwICgweGY0MDA2OTAwLCAiZGl2dS5kIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDY4MDAsICJkaXZ1IiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDY4MDAwMDAwLCAiZGl2dSIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwOTAwMCwgImV4dCIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmMDAwOTAwMCwgImV4dCIsCQkiZCwxLGIiKQotICBfTUM4OHh4eCAoMHhmNDAwOTgwMCwgImV4dHUiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjAwMDk4MDAsICJleHR1IiwJCSJkLDEsYiIpCi0gIF9NQzg4eHh4ICgweDg0MDAyODAwLCAiZmFkZC5zc3MiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYTgwMCwgImZhZGQuc3NzIiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDI4ODAsICJmYWRkLnNzZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBhODIwLCAiZmFkZC5zc2QiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYTg0MCwgImZhZGQuc3N4IiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDJhMDAsICJmYWRkLnNkcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBhODgwLCAiZmFkZC5zZHMiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMmE4MCwgImZhZGQuc2RkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGE4YTAsICJmYWRkLnNkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhOGMwLCAiZmFkZC5zZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYTkwMCwgImZhZGQuc3hzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGE5MjAsICJmYWRkLnN4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhOTQwLCAiZmFkZC5zeHgiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMjgyMCwgImZhZGQuZHNzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGFhMDAsICJmYWRkLmRzcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAyOGEwLCAiZmFkZC5kc2QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWEyMCwgImZhZGQuZHNkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFhNDAsICJmYWRkLmRzeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAyYTIwLCAiZmFkZC5kZHMiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWE4MCwgImZhZGQuZGRzIiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDJhYTAsICJmYWRkLmRkZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYWEwLCAiZmFkZC5kZGQiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWFjMCwgImZhZGQuZGR4IiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFiMDAsICJmYWRkLmR4cyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYjIwLCAiZmFkZC5keGQiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWI0MCwgImZhZGQuZHh4IiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFjMDAsICJmYWRkLnhzcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYzIwLCAiZmFkZC54c2QiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWM0MCwgImZhZGQueHN4IiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFjODAsICJmYWRkLnhkcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhY2EwLCAiZmFkZC54ZGQiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWNjMCwgImZhZGQueGR4IiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFkMDAsICJmYWRkLnh4cyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhZDIwLCAiZmFkZC54eGQiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWQ0MCwgImZhZGQueHh4IiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDNhODAsICJmY21wLnNkZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiYTgwLCAiZmNtcC5zZGQiLAkiZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAzYTAwLCAiZmNtcC5zZHMiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmEwMCwgImZjbXAuc2RzIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmIwMCwgImZjbXAuc2R4IiwJImQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMzg4MCwgImZjbXAuc3NkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGI4ODAsICJmY21wLnNzZCIsCSJkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDM4MDAsICJmY21wLnNzcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiODAwLCAiZmNtcC5zc3MiLAkiZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiOTAwLCAiZmNtcC5zc3giLAkiZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiYzgwLCAiZmNtcC5zeGQiLAkiZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiYzAwLCAiZmNtcC5zeHMiLAkiZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiZDAwLCAiZmNtcC5zeHgiLAkiZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDAzYWEwLCAiZmNtcHUuc2RkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGJhYTAsICJmY21wdS5zZGQiLAkiZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDAzYTIwLCAiZmNtcHUuc2RzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGJhMjAsICJmY21wdS5zZHMiLAkiZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiYjIwLCAiZmNtcHUuc2R4IiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwMzhhMCwgImZjbXB1LnNzZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiOGEwLCAiZmNtcHUuc3NkIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwMzgyMCwgImZjbXB1LnNzcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiODIwLCAiZmNtcHUuc3NzIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjkyMCwgImZjbXB1LnNzeCIsCSJkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGJjYTAsICJmY21wdS5zeGQiLAkiZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiYzIwLCAiZmNtcHUuc3hzIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmQyMCwgImZjbXB1LnN4eCIsCSJkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDA4ODAsICJmY3Z0LmRzIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDA4ODgwLCAiZmN2dC5kcyIsCSJ4ZCx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4OGMwLCAiZmN2dC5keCIsCSJ4ZCx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDAwODIwLCAiZmN2dC5zZCIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwODgyMCwgImZjdnQuc2QiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODg0MCwgImZjdnQuc3giLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODkyMCwgImZjdnQueGQiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODkwMCwgImZjdnQueHMiLAkieGQseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwNzAwMCwgImZkaXYuc3NzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGYwMDAsICJmZGl2LnNzcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDA3MDgwLCAiZmRpdi5zc2QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjAyMCwgImZkaXYuc3NkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGYwNDAsICJmZGl2LnNzeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDA3MjAwLCAiZmRpdi5zZHMiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjA4MCwgImZkaXYuc2RzIiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDcyODAsICJmZGl2LnNkZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMGEwLCAiZmRpdi5zZGQiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjBjMCwgImZkaXYuc2R4IiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGYxMDAsICJmZGl2LnN4cyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMTIwLCAiZmRpdi5zeGQiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjE0MCwgImZkaXYuc3h4IiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDcwMjAsICJmZGl2LmRzcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMjAwLCAiZmRpdi5kc3MiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwNzBhMCwgImZkaXYuZHNkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGYyMjAsICJmZGl2LmRzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMjQwLCAiZmRpdi5kc3giLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwNzIyMCwgImZkaXYuZGRzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGYyODAsICJmZGl2LmRkcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDA3MmEwLCAiZmRpdi5kZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjJhMCwgImZkaXYuZGRkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGYyYzAsICJmZGl2LmRkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMzAwLCAiZmRpdi5keHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjMyMCwgImZkaXYuZHhkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGYzNDAsICJmZGl2LmR4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmNDAwLCAiZmRpdi54c3MiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjQyMCwgImZkaXYueHNkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY0NDAsICJmZGl2LnhzeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmNDgwLCAiZmRpdi54ZHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjRhMCwgImZkaXYueGRkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY0YzAsICJmZGl2LnhkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmNTAwLCAiZmRpdi54eHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjUyMCwgImZkaXYueHhkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY1NDAsICJmZGl2Lnh4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweGY0MDBlYzAwLCAiZmYwIiwJCSJkLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwZTgwMCwgImZmMSIsCQkiZCwyIikKLSAgX01DODh4eHggKDB4ODAwMDQ4MDAsICJmbGRjciIsCSJkLGYiKQotICBfTUM4OHh4eCAoMHg4NDAwMjAyMCwgImZsdC5kcyIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwMjIyMCwgImZsdC5kcyIsCSJ4ZCwyIikKLSAgX01DODh4eHggKDB4ODQwMDIwMDAsICJmbHQuc3MiLAkiZCwyIikKLSAgX01DODgxMTAgKDB4ODQwMDIyMDAsICJmbHQuc3MiLAkieGQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDAyMjQwLCAiZmx0LnhzIiwJInhkLDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMDAwMCwgImZtdWwuc3NzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMDgwMDAsICJmbXVsLnNzcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAwMDgwLCAiZm11bC5zc2QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwODAyMCwgImZtdWwuc3NkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDgwNDAsICJmbXVsLnNzeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAwMjAwLCAiZm11bC5zZHMiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwODA4MCwgImZtdWwuc2RzIiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDAyODAsICJmbXVsLnNkZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MGEwLCAiZm11bC5zZGQiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODBjMCwgImZtdWwuc2R4IiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDgxMDAsICJmbXVsLnN4cyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MTIwLCAiZm11bC5zeGQiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODE0MCwgImZtdWwuc3h4IiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDAwMjAsICJmbXVsLmRzcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MjAwLCAiZm11bC5kc3MiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMDBhMCwgImZtdWwuZHNkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMDgyMjAsICJmbXVsLmRzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MjQwLCAiZm11bC5kc3giLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMDIyMCwgImZtdWwuZGRzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMDgyODAsICJmbXVsLmRkcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAwMmEwLCAiZm11bC5kZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwODJhMCwgImZtdWwuZGRkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDgyYzAsICJmbXVsLmRkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MzAwLCAiZm11bC5keHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODMyMCwgImZtdWwuZHhkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDgzNDAsICJmbXVsLmR4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4NDAwLCAiZm11bC54c3MiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODQyMCwgImZtdWwueHNkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg0NDAsICJmbXVsLnhzeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4NDgwLCAiZm11bC54ZHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODRhMCwgImZtdWwueGRkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg0YzAsICJmbXVsLnhkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4NTAwLCAiZm11bC54eHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODUyMCwgImZtdWwueHhkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg1NDAsICJmbXVsLnh4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA3OGEwLCAiZnNxcnQuZGQiLAkiZCwyIikKLSAgX01DODgxMTAgKDB4ODQwMGY4YTAsICJmc3FydC5kZCIsCSJ4ZCx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA3ODgwLCAiZnNxcnQuZHMiLAkiZCwyIikKLSAgX01DODgxMTAgKDB4ODQwMGY4ODAsICJmc3FydC5kcyIsCSJ4ZCx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmOGMwLCAiZnNxcnQuZHgiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwNzgyMCwgImZzcXJ0LnNkIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmODIwLCAiZnNxcnQuc2QiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwNzgwMCwgImZzcXJ0LnNzIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmODAwLCAiZnNxcnQuc3MiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjg0MCwgImZzcXJ0LnN4IiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY5MjAsICJmc3FydC54ZCIsCSJ4ZCx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmOTAwLCAiZnNxcnQueHMiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjk0MCwgImZzcXJ0Lnh4IiwJInhkLHgyIikKLSAgX01DODh4eHggKDB4ODAwMDg4MDAsICJmc3RjciIsCSIzLGYiKQotICBfTUM4OHh4eCAoMHg4NDAwMzAwMCwgImZzdWIuc3NzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGIwMDAsICJmc3ViLnNzcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAzMDgwLCAiZnN1Yi5zc2QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjAyMCwgImZzdWIuc3NkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGIwNDAsICJmc3ViLnNzeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAzMjAwLCAiZnN1Yi5zZHMiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjA4MCwgImZzdWIuc2RzIiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDMyODAsICJmc3ViLnNkZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMGEwLCAiZnN1Yi5zZGQiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjBjMCwgImZzdWIuc2R4IiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGIxMDAsICJmc3ViLnN4cyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMTIwLCAiZnN1Yi5zeGQiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjE0MCwgImZzdWIuc3h4IiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDMwMjAsICJmc3ViLmRzcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMjAwLCAiZnN1Yi5kc3MiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMzBhMCwgImZzdWIuZHNkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGIyMjAsICJmc3ViLmRzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMjQwLCAiZnN1Yi5kc3giLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMzIyMCwgImZzdWIuZGRzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGIyODAsICJmc3ViLmRkcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAzMmEwLCAiZnN1Yi5kZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjJhMCwgImZzdWIuZGRkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGIyYzAsICJmc3ViLmRkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMzAwLCAiZnN1Yi5keHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjMyMCwgImZzdWIuZHhkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGIzNDAsICJmc3ViLmR4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiNDAwLCAiZnN1Yi54c3MiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjQyMCwgImZzdWIueHNkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGI0NDAsICJmc3ViLnhzeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiNDgwLCAiZnN1Yi54ZHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjRhMCwgImZzdWIueGRkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGI0YzAsICJmc3ViLnhkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiNTAwLCAiZnN1Yi54eHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjUyMCwgImZzdWIueHhkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGI1NDAsICJmc3ViLnh4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDgwMDBjODAwLCAiZnhjciIsCQkiZCwzLGYiKQotICBfTUM4OHh4eCAoMHg4NDAwZmMwMSwgImlsbG9wMSIsCSIiKQotICBfTUM4OHh4eCAoMHg4NDAwZmMwMiwgImlsbG9wMiIsCSIiKQotICBfTUM4OHh4eCAoMHg4NDAwZmMwMywgImlsbG9wMyIsCSIiKQotICBfTUM4OHh4eCAoMHg4NDAwNDg4MCwgImludC5zZCIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYzg4MCwgImludC5zZCIsCSJkLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDQ4MDAsICJpbnQuc3MiLAkiZCwyIikKLSAgX01DODgxMTAgKDB4ODQwMGM4MDAsICJpbnQuc3MiLAkiZCx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBjOTAwLCAiaW50LnN4IiwJImQseDIiKQotICBfTUM4OHh4eCAoMHhmNDAwYzAwMCwgImptcCIsCQkiMiIpCi0gIF9NQzg4eHh4ICgweGY0MDBjNDAwLCAiam1wLm4iLAkiMiIpCi0gIF9NQzg4eHh4ICgweGY0MDBjODAwLCAianNyIiwJCSIyIikKLSAgX01DODh4eHggKDB4ZjQwMGNjMDAsICJqc3IubiIsCSIyIikKLSAgX01DODh4eHggKDB4ZjQwMDE0MDAsICJsZCIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwMTYwMCwgImxkIiwJCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHgxNDAwMDAwMCwgImxkIiwJCSJkLDEsSSIpCi0gIF9NQzg4MTEwICgweGYwMDAxNjAwLCAibGQiLAkJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMTQwMCwgImxkIiwJCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHgwNDAwMDAwMCwgImxkIiwJCSJ4ZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMWUwMCwgImxkLmIiLAkJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAxYzAwLCAibGQuYiIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHgxYzAwMDAwMCwgImxkLmIiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDFkMDAsICJsZC5iLnVzciIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDAxZjAwLCAibGQuYi51c3IiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDBlMDAsICJsZC5idSIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMGMwMCwgImxkLmJ1IiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4MGMwMDAwMDAsICJsZC5idSIsCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwZDAwLCAibGQuYnUudXNyIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDBmMDAsICJsZC5idS51c3IiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDEyMDAsICJsZC5kIiwJCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMTAwMCwgImxkLmQiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4MTAwMDAwMDAsICJsZC5kIiwJCSJkLDEsSSIpCi0gIF9NQzg4MTEwICgweGYwMDAxMjAwLCAibGQuZCIsCQkieGQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAxMDAwLCAibGQuZCIsCQkieGQsMSwyIikKLSAgX01DODgxMTAgKDB4MDAwMDAwMDAsICJsZC5kIiwJCSJ4ZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMTEwMCwgImxkLmQudXNyIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDEzMDAsICJsZC5kLnVzciIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMTEwMCwgImxkLmQudXNyIiwJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweGYwMDAxMzAwLCAibGQuZC51c3IiLAkieGQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAxYTAwLCAibGQuaCIsCQkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDE4MDAsICJsZC5oIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDE4MDAwMDAwLCAibGQuaCIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMTkwMCwgImxkLmgudXNyIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDFiMDAsICJsZC5oLnVzciIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMGEwMCwgImxkLmh1IiwJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwODAwLCAibGQuaHUiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHgwODAwMDAwMCwgImxkLmh1IiwJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDA5MDAsICJsZC5odS51c3IiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwMGIwMCwgImxkLmh1LnVzciIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMTUwMCwgImxkLnVzciIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDAxNzAwLCAibGQudXNyIiwJImQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAxNTAwLCAibGQudXNyIiwJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweGYwMDAxNzAwLCAibGQudXNyIiwJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMWEwMCwgImxkLngiLAkJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMTgwMCwgImxkLngiLAkJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweDNjMDAwMDAwLCAibGQueCIsCQkieGQsMSxJIikKLSAgX01DODgxMTAgKDB4ZjAwMDE5MDAsICJsZC54LnVzciIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMWIwMCwgImxkLngudXNyIiwJInhkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMzYwMCwgImxkYSIsCQkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDYwMDAsICJsZGEiLAkJIj9kLDEsMiIpCS8qIE91dHB1dCBhZGR1ICovCi0gIF9NQzg4eHh4ICgweDYwMDAwMDAwLCAibGRhIiwJCSI/ZCwxLEkiKQkvKiBPdXRwdXQgYWRkdSAqLwotICBfTUM4OHh4eCAoMHhmNDAwNjAwMCwgImxkYS5iIiwJIj9kLDFbMl0iKQkvKiBPdXRwdXQgYWRkdSAqLwotICBfTUM4OHh4eCAoMHhmNDAwNjAwMCwgImxkYS5iIiwJIj9kLDEsMiIpCS8qIE91dHB1dCBhZGR1ICovCi0gIF9NQzg4eHh4ICgweDYwMDAwMDAwLCAibGRhLmIiLAkiP2QsMSxJIikJLyogT3V0cHV0IGFkZHUgKi8KLSAgX01DODh4eHggKDB4ZjQwMDMyMDAsICJsZGEuZCIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwNjAwMCwgImxkYS5kIiwJIj9kLDEsMiIpCS8qIE91dHB1dCBhZGR1ICovCi0gIF9NQzg4eHh4ICgweDYwMDAwMDAwLCAibGRhLmQiLAkiP2QsMSxJIikJLyogT3V0cHV0IGFkZHUgKi8KLSAgX01DODgxMTAgKDB4ZjQwMDNlMDAsICJsZGEueCIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwM2EwMCwgImxkYS5oIiwJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDA2MDAwLCAibGRhLmgiLAkiP2QsMSwyIikJLyogT3V0cHV0IGFkZHUgKi8KLSAgX01DODh4eHggKDB4NjAwMDAwMDAsICJsZGEuaCIsCSI/ZCwxLEkiKQkvKiBPdXRwdXQgYWRkdSAqLwotICBfTUM4OHh4eCAoMHg4MDAwNDAwMCwgImxkY3IiLAkJImQsYyIpCi0gIF9NQzg4eHh4ICgweGY0MDBhMDAwLCAibWFrIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGYwMDBhMDAwLCAibWFrIiwJCSJkLDEsYiIpCi0gIF9NQzg4eHh4ICgweDQ4MDAwMDAwLCAibWFzayIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHg0YzAwMDAwMCwgIm1hc2sudSIsCSJkLDEsSSIpCi0gIF9NQzg4MTEwICgweDg0MDBjMDAwLCAibW92LnMiLAkiZCx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA0MjAwLCAibW92LnMiLAkieGQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBjMDgwLCAibW92LmQiLAkiZCx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA0MjgwLCAibW92LmQiLAkieGQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBjMzAwLCAibW92IiwJCSJ4ZCx4MiIpCi0gIF9NQzg4eHh4ICgweGY0MDA2YzAwLCAibXVsIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDZjMDAwMDAwLCAibXVsIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA2ZTAwLCAibXVscyIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg2YzAwMDAwMCwgIm11bHMiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDZjMDAsICJtdWx1IiwJCSJkLDEsMiIpCS8qIHN5bm9ueW0gZm9yIG11bCAqLwotICBfTUM4OHh4eCAoMHg2YzAwMDAwMCwgIm11bHUiLAkJImQsMSxJIikJLyogc3lub255bSBmb3IgbXVsICovCi0gIF9NQzg4MTEwICgweGY0MDA2ZDAwLCAibXVsdS5kIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ODQwMDUwODAsICJuaW50LnNkIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBkMDgwLCAibmludC5zZCIsCSJkLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDUwMDAsICJuaW50LnNzIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBkMDAwLCAibmludC5zcyIsCSJkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGQxMDAsICJuaW50LnN4IiwJImQseDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNTgwMCwgIm9yIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDU4MDAwMDAwLCAib3IiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDVjMDAsICJvci5jIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDVjMDAwMDAwLCAib3IudSIsCQkiZCwxLEkiKQotICBfTUM4ODExMCAoMHg4ODAwMjAyMCwgInBhZGQuYiIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAyMDQwLCAicGFkZC5oIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIwNjAsICJwYWRkIiwJCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAyMGEwLCAicGFkZHMudS5iIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIwYzAsICJwYWRkcy51LmgiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMjBlMCwgInBhZGRzLnUiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMjEyMCwgInBhZGRzLnVzLmIiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMjE0MCwgInBhZGRzLnVzLmgiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMjE2MCwgInBhZGRzLnVzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIxYTAsICJwYWRkcy5zLmIiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMjFjMCwgInBhZGRzLnMuaCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAyMWUwLCAicGFkZHMucyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAzODYwLCAicGNtcCIsCQkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMDAwMCwgInBtdWwiLAkJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDY0MjAsICJwcGFjay4zMi5iIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDYyNDAsICJwcGFjay4xNi5oIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDY0NDAsICJwcGFjay4zMi5oIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDYxNjAsICJwcGFjay44IiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDYyNjAsICJwcGFjay4xNiIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2NDYwLCAicHBhY2suMzIiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwNzgwMCwgInByb3QiLAkJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDcwMDAsICJwcm90IiwJCSJkLDEsbyIpCi0gIF9NQzg4MTEwICgweDg4MDAzMDIwLCAicHN1Yi5iIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDMwNDAsICJwc3ViLmgiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzA2MCwgInBzdWIiLAkJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDMwYTAsICJwc3Vicy51LmIiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzBjMCwgInBzdWJzLnUuaCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAzMGUwLCAicHN1YnMudSIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAzMTIwLCAicHN1YnMudXMuYiIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAzMTQwLCAicHN1YnMudXMuaCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAzMTYwLCAicHN1YnMudXMiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzFhMCwgInBzdWJzLnMuYiIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAzMWMwLCAicHN1YnMucy5oIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDMxZTAsICJwc3Vicy5zIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDY4MDAsICJwdW5way5uIiwJImQsMSIpCi0gIF9NQzg4MTEwICgweDg4MDA2ODIwLCAicHVucGsuYiIsCSJkLDEiKQotICBfTUM4ODExMCAoMHg4ODAwNjg0MCwgInB1bnBrLmgiLAkiZCwxIikKLSAgX01DODh4eHggKDB4ZjQwMGE4MDAsICJyb3QiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjAwMGE4MDAsICJyb3QiLAkJImQsMSxiIikKLSAgX01DODh4eHggKDB4ZjQwMGZjMDAsICJydGUiLAkJIiIpCi0gIF9NQzg4eHh4ICgweGY0MDA4ODAwLCAic2V0IiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGYwMDA4ODAwLCAic2V0IiwJCSJkLDEsYiIpCi0gIF9NQzg4eHh4ICgweGY0MDAyNjAwLCAic3QiLAkJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAyNDAwLCAic3QiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4MjQwMDAwMDAsICJzdCIsCQkiZCwxLEkiKQotICBfTUM4ODExMCAoMHhmMDAwMjYwMCwgInN0IiwJCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDI0MDAsICJzdCIsCQkieGQsMSwyIikKLSAgX01DODgxMTAgKDB4MzQwMDAwMDAsICJzdCIsCQkieGQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDJlMDAsICJzdC5iIiwJCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMmMwMCwgInN0LmIiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4MmMwMDAwMDAsICJzdC5iIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAyZDAwLCAic3QuYi51c3IiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwMmYwMCwgInN0LmIudXNyIiwJImQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGY0MDAyZDgwLCAic3QuYi51c3Iud3QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHhmNDAwMmY4MCwgInN0LmIudXNyLnd0IiwJImQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGY0MDAyYzgwLCAic3QuYi53dCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweGY0MDAyZTgwLCAic3QuYi53dCIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMjIwMCwgInN0LmQiLAkJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAyMDAwLCAic3QuZCIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHgyMDAwMDAwMCwgInN0LmQiLAkJImQsMSxJIikKLSAgX01DODgxMTAgKDB4ZjAwMDIyMDAsICJzdC5kIiwJCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDIwMDAsICJzdC5kIiwJCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHgzMDAwMDAwMCwgInN0LmQiLAkJInhkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAyMTAwLCAic3QuZC51c3IiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwMjMwMCwgInN0LmQudXNyIiwJImQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyMTAwLCAic3QuZC51c3IiLAkieGQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjAwMDIzMDAsICJzdC5kLnVzciIsCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjQwMDIxODAsICJzdC5kLnVzci53dCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweGY0MDAyMzgwLCAic3QuZC51c3Iud3QiLAkiZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDIxODAsICJzdC5kLnVzci53dCIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMjM4MCwgInN0LmQudXNyLnd0IiwJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmNDAwMjA4MCwgInN0LmQud3QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHhmNDAwMjI4MCwgInN0LmQud3QiLAkiZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDIwODAsICJzdC5kLnd0IiwJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweGYwMDAyMjgwLCAic3QuZC53dCIsCSJ4ZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDJhMDAsICJzdC5oIiwJCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMjgwMCwgInN0LmgiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4MjgwMDAwMDAsICJzdC5oIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAyOTAwLCAic3QuaC51c3IiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwMmIwMCwgInN0LmgudXNyIiwJImQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGY0MDAyOTgwLCAic3QuaC51c3Iud3QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHhmNDAwMmI4MCwgInN0LmgudXNyLnd0IiwJImQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGY0MDAyODgwLCAic3QuaC53dCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweGY0MDAyYTgwLCAic3QuaC53dCIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMjUwMCwgInN0LnVzciIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDAyNzAwLCAic3QudXNyIiwJImQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyNTAwLCAic3QudXNyIiwJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweGYwMDAyNzAwLCAic3QudXNyIiwJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmNDAwMjU4MCwgInN0LnVzci53dCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweGY0MDAyNzgwLCAic3QudXNyLnd0IiwJImQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyNTgwLCAic3QudXNyLnd0IiwJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweGYwMDAyNzgwLCAic3QudXNyLnd0IiwJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmNDAwMjQ4MCwgInN0Lnd0IiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjQwMDI2ODAsICJzdC53dCIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMjQ4MCwgInN0Lnd0IiwJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweGYwMDAyNjgwLCAic3Qud3QiLAkieGQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyYTAwLCAic3QueCIsCQkieGQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyODAwLCAic3QueCIsCQkieGQsMSwyIikKLSAgX01DODgxMTAgKDB4MzgwMDAwMDAsICJzdC54IiwJCSJ4ZCwxLEkiKQotICBfTUM4ODExMCAoMHhmMDAwMjkwMCwgInN0LngudXNyIiwJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweGYwMDAyYjAwLCAic3QueC51c3IiLAkieGQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyOTgwLCAic3QueC51c3Iud3QiLAkieGQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjAwMDJiODAsICJzdC54LnVzci53dCIsCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDI4ODAsICJzdC54Lnd0IiwJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweGYwMDAyYTgwLCAic3QueC53dCIsCSJ4ZCwxWzJdIikKLSAgX01DODh4eHggKDB4ODAwMDgwMDAsICJzdGNyIiwJCSIzLGMiKQotICBfTUM4OHh4eCAoMHhmNDAwNzQwMCwgInN1YiIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg3NDAwMDAwMCwgInN1YiIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwNzYwMCwgInN1Yi5jaSIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDA3NzAwLCAic3ViLmNpbyIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDA3NTAwLCAic3ViLmNvIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDY0MDAsICJzdWJ1IiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDY0MDAwMDAwLCAic3VidSIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwNjYwMCwgInN1YnUuY2kiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNjcwMCwgInN1YnUuY2lvIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDY1MDAsICJzdWJ1LmNvIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjAwMGQwMDAsICJ0YjAiLAkJIkIsMSxWIikKLSAgX01DODh4eHggKDB4ZjAwMGQ4MDAsICJ0YjEiLAkJIkIsMSxWIikKLSAgX01DODh4eHggKDB4ZjQwMGY4MDAsICJ0Ym5kIiwJCSIxLDIiKQotICBfTUM4OHh4eCAoMHhmODAwMDAwMCwgInRibmQiLAkJIjEsSSIpCi0gIF9NQzg4eHh4ICgweGYwMDBlODAwLCAidGNuZCIsCQkiTSwxLFYiKQotICBfTUM4OHh4eCAoMHg4NDAwNTg4MCwgInRybmMuc2QiLAkiZCwyIikKLSAgX01DODgxMTAgKDB4ODQwMGQ4ODAsICJ0cm5jLnNkIiwJImQseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwNTgwMCwgInRybmMuc3MiLAkiZCwyIikKLSAgX01DODgxMTAgKDB4ODQwMGQ4MDAsICJ0cm5jLnNzIiwJImQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZDkwMCwgInRybmMuc3giLAkiZCx4MiIpCi0gIF9NQzg4eHh4ICgweDgwMDBjMDAwLCAieGNyIiwJCSJkLDMsYyIpCi0gIF9NQzg4eHh4ICgweGY0MDAwNjAwLCAieG1lbSIsCQkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDA0MDAsICJ4bWVtIiwJCSJkLDEsMiIpCi0gIF9NQzg4MTAwICgweDA0MDAwMDAwLCAieG1lbSIsCQkiP2QsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDAyMDAsICJ4bWVtLmJ1IiwJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwMDAwLCAieG1lbS5idSIsCSJkLDEsMiIpCi0gIF9NQzg4MTAwICgweDAwMDAwMDAwLCAieG1lbS5idSIsCSI/ZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMDMwMCwgInhtZW0uYnUudXNyIiwJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwMTAwLCAieG1lbS5idS51c3IiLAkiZCwxLDIiKQotICBfTUM4ODEwMCAoMHgwMDAwMDEwMCwgInhtZW0uYnUudXNyIiwJIj9kLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwNzAwLCAieG1lbS51c3IiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDA1MDAsICJ4bWVtLnVzciIsCSJkLDEsMiIpCi0gIF9NQzg4MTAwICgweDA0MDAwMTAwLCAieG1lbS51c3IiLAkiP2QsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDUwMDAsICJ4b3IiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4NTAwMDAwMDAsICJ4b3IiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDU0MDAsICJ4b3IuYyIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDU0MDAwMDAwLCAieG9yLnUiLAkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHgwMDAwMDAwMCwgIiIsCQkwKQotfTsKLQotI2RlZmluZSBOVU1PUENPREVTICgoc2l6ZW9mIG04OGtfb3Bjb2RlcykvKHNpemVvZiBtODhrX29wY29kZXNbMF0pKQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotYW91dC5jIGIvZ2FzL2NvbmZpZy9vYmotYW91dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTE5MzQ3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWFvdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDYyOSArMCwwIEBACi0vKiBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NgotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKLW9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlCi10byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jdW5kZWYgTk9fUkVMT0MKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2VuZGlmCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLS8qIGluOiBzZWdUICAgb3V0OiBOX1RZUEUgYml0cyAqLwotY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdID0KLXsKLSAgTl9BQlMsCi0gIE5fVEVYVCwKLSAgTl9EQVRBLAotICBOX0JTUywKLSAgTl9VTkRGLAkJCS8qIHVua25vd24gKi8KLSAgTl9VTkRGLAkJCS8qIGVycm9yICovCi0gIE5fVU5ERiwJCQkvKiBleHByZXNzaW9uICovCi0gIE5fVU5ERiwJCQkvKiBkZWJ1ZyAqLwotICBOX1VOREYsCQkJLyogbnR2ICovCi0gIE5fVU5ERiwJCQkvKiBwdHYgKi8KLSAgTl9SRUdJU1RFUiwJCQkvKiByZWdpc3RlciAqLwotfTsKLQotY29uc3Qgc2VnVCBOX1RZUEVfc2VnW05fVFlQRSArIDJdID0KLXsJCQkJLyogTl9UWVBFID09IDB4MUUgPSAzMi0yICovCi0gIFNFR19VTktOT1dOLAkJCS8qIE5fVU5ERiA9PSAwICovCi0gIFNFR19HT09GLAotICBTRUdfQUJTT0xVVEUsCQkJLyogTl9BQlMgPT0gMiAqLwotICBTRUdfR09PRiwKLSAgU0VHX1RFWFQsCQkJLyogTl9URVhUID09IDQgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19EQVRBLAkJCS8qIE5fREFUQSA9PSA2ICovCi0gIFNFR19HT09GLAotICBTRUdfQlNTLAkJCS8qIE5fQlNTID09IDggKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKLSAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAotICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKLSAgU0VHX1JFR0lTVEVSLAkJCS8qIGR1bW15IE5fUkVHSVNURVIgZm9yIHJlZ3MgPSAzMCAqLwotICBTRUdfR09PRiwKLX07Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgb2JqX2FvdXRfbGluZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9hb3V0X3dlYWsgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfYW91dF90eXBlIFBBUkFNUyAoKGludCkpOwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJsaW5lIiwgb2JqX2FvdXRfbGluZSwgMH0sCS8qIHNvdXJjZSBjb2RlIGxpbmUgbnVtYmVyICovCi0gIHsibG4iLCBvYmpfYW91dF9saW5lLCAwfSwJLyogY29mZiBsaW5lIG51bWJlciB0aGF0IHdlIHVzZSBhbnl3YXkgKi8KLQotICB7IndlYWsiLCBvYmpfYW91dF93ZWFrLCAwfSwJLyogbWFyayBzeW1ib2wgYXMgd2Vhay4gICovCi0KLSAgeyJ0eXBlIiwgb2JqX2FvdXRfdHlwZSwgMH0sCi0KLSAgLyogY29mZiBkZWJ1ZyBwc2V1ZG9zIChpZ25vcmVkKSAqLwotICB7ImRlZiIsIHNfaWdub3JlLCAwfSwKLSAgeyJkaW0iLCBzX2lnbm9yZSwgMH0sCi0gIHsiZW5kZWYiLCBzX2lnbm9yZSwgMH0sCi0gIHsiaWRlbnQiLCBzX2lnbm9yZSwgMH0sCi0gIHsibGluZSIsIHNfaWdub3JlLCAwfSwKLSAgeyJsbiIsIHNfaWdub3JlLCAwfSwKLSAgeyJzY2wiLCBzX2lnbm9yZSwgMH0sCi0gIHsic2l6ZSIsIHNfaWdub3JlLCAwfSwKLSAgeyJ0YWciLCBzX2lnbm9yZSwgMH0sCi0gIHsidmFsIiwgc19pZ25vcmUsIDB9LAotICB7InZlcnNpb24iLCBzX2lnbm9yZSwgMH0sCi0KLSAgeyJvcHRpbSIsIHNfaWdub3JlLCAwfSwJLyogRm9yIHN1bjM4NmkgY2MgKD8pICovCi0KLSAgLyogb3RoZXIgc3R1ZmYgKi8KLSAgeyJBQk9SVCIsIHNfYWJvcnQsIDB9LAotCi0gIHtOVUxMfQkJCS8qIGVuZCBzZW50aW5lbCAqLwotfTsJCQkJLyogb2JqX3BzZXVkb190YWJsZSAqLwotCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLXZvaWQKLW9ial9hb3V0X2Zyb2Jfc3ltYm9sIChzeW0sIHB1bnQpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgaW50ICpwdW50OwotewotICBmbGFnd29yZCBmbGFnczsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgaW50IGRlc2MsIHR5cGUsIG90aGVyOwotCi0gIGZsYWdzID0gc3ltLT5ic3ltLT5mbGFnczsKLSAgZGVzYyA9IFNfR0VUX0RFU0MgKHN5bSk7Ci0gIHR5cGUgPSBTX0dFVF9UWVBFIChzeW0pOwotICBvdGhlciA9IFNfR0VUX09USEVSIChzeW0pOwotICBzZWMgPSBzeW0tPmJzeW0tPnNlY3Rpb247Ci0KLSAgLyogT25seSBmcm9iIHNpbXBsZSBzeW1ib2xzIHRoaXMgd2F5IHJpZ2h0IG5vdy4gICovCi0gIGlmICghICh0eXBlICYgfiAoTl9UWVBFIHwgTl9FWFQpKSkKLSAgICB7Ci0gICAgICBpZiAodHlwZSA9PSAoTl9VTkRGIHwgTl9FWFQpCi0JICAmJiBzZWMgPT0gJmJmZF9hYnNfc2VjdGlvbikKLQlzeW0tPmJzeW0tPnNlY3Rpb24gPSBzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCi0gICAgICBpZiAoKHR5cGUgJiBOX1RZUEUpICE9IE5fSU5EUgotCSAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VUQQotCSAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VUVAotCSAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VURAotCSAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VUQgotCSAgJiYgdHlwZSAhPSBOX1dBUk5JTkcKLQkgICYmIChzZWMgPT0gJmJmZF9hYnNfc2VjdGlvbgotCSAgICAgIHx8IHNlYyA9PSAmYmZkX3VuZF9zZWN0aW9uKSkKLQlyZXR1cm47Ci0gICAgICBpZiAoZmxhZ3MgJiBCU0ZfRVhQT1JUKQotCXR5cGUgfD0gTl9FWFQ7Ci0KLSAgICAgIHN3aXRjaCAodHlwZSAmIE5fVFlQRSkKLQl7Ci0JY2FzZSBOX1NFVEE6Ci0JY2FzZSBOX1NFVFQ6Ci0JY2FzZSBOX1NFVEQ6Ci0JY2FzZSBOX1NFVEI6Ci0JICAvKiBTZXQgdGhlIGRlYnVnZ2luZyBmbGFnIGZvciBjb25zdHJ1Y3RvciBzeW1ib2xzIHNvIHRoYXQKLQkgICAgIEJGRCBsZWF2ZXMgdGhlbSBhbG9uZS4gICovCi0JICBzeW0tPmJzeW0tPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0KLQkgIC8qIFlvdSBjYW4ndCBwdXQgYSBjb21tb24gc3ltYm9sIGluIGEgc2V0LiAgVGhlIHdheSBhIHNldAotCSAgICAgZWxlbWVudCB3b3JrcyBpcyB0aGF0IHRoZSBzeW1ib2wgaGFzIGEgZGVmaW5pdGlvbiBhbmQgYQotCSAgICAgbmFtZSwgYW5kIHRoZSBsaW5rZXIgYWRkcyB0aGUgZGVmaW5pdGlvbiB0byB0aGUgc2V0IG9mCi0JICAgICB0aGF0IG5hbWUuICBUaGF0IGRvZXMgbm90IHdvcmsgZm9yIGEgY29tbW9uIHN5bWJvbCwKLQkgICAgIGJlY2F1c2UgdGhlIGxpbmtlciBjYW4ndCB0ZWxsIHdoaWNoIGNvbW1vbiBzeW1ib2wgdGhlCi0JICAgICB1c2VyIG1lYW5zLiAgRklYTUU6IFVzaW5nIGFzX2JhZCBoZXJlIG1heSBiZQotCSAgICAgaW5hcHByb3ByaWF0ZSwgc2luY2UgdGhlIHVzZXIgbWF5IHdhbnQgdG8gZm9yY2UgYQotCSAgICAgcGFydGljdWxhciB0eXBlIHdpdGhvdXQgcmVnYXJkIHRvIHRoZSBzZW1hbnRpY3Mgb2Ygc2V0czsKLQkgICAgIG9uIHRoZSBvdGhlciBoYW5kLCB3ZSBjZXJ0YWlubHkgZG9uJ3Qgd2FudCBhbnlib2R5IHRvIGJlCi0JICAgICBtaXNsZWFkIGludG8gdGhpbmtpbmcgdGhhdCB0aGVpciBjb2RlIHdpbGwgd29yay4gICovCi0JICBpZiAoU19JU19DT01NT04gKHN5bSkpCi0JICAgIGFzX2JhZCAoXygiQXR0ZW1wdCB0byBwdXQgYSBjb21tb24gc3ltYm9sIGludG8gc2V0ICVzIiksCi0JCSAgICBTX0dFVF9OQU1FIChzeW0pKTsKLQkgIC8qIFNpbWlsYXJseSwgeW91IGNhbid0IHB1dCBhbiB1bmRlZmluZWQgc3ltYm9sIGluIGEgc2V0LiAgKi8KLQkgIGVsc2UgaWYgKCEgU19JU19ERUZJTkVEIChzeW0pKQotCSAgICBhc19iYWQgKF8oIkF0dGVtcHQgdG8gcHV0IGFuIHVuZGVmaW5lZCBzeW1ib2wgaW50byBzZXQgJXMiKSwKLQkJICAgIFNfR0VUX05BTUUgKHN5bSkpOwotCi0JICBicmVhazsKLQljYXNlIE5fSU5EUjoKLQkgIC8qIFB1dCBpbmRpcmVjdCBzeW1ib2xzIGluIHRoZSBpbmRpcmVjdCBzZWN0aW9uLiAgKi8KLQkgIHN5bS0+YnN5bS0+c2VjdGlvbiA9IGJmZF9pbmRfc2VjdGlvbl9wdHI7Ci0JICBzeW0tPmJzeW0tPmZsYWdzIHw9IEJTRl9JTkRJUkVDVDsKLQkgIGlmICh0eXBlICYgTl9FWFQpCi0JICAgIHsKLQkgICAgICBzeW0tPmJzeW0tPmZsYWdzIHw9IEJTRl9FWFBPUlQ7Ci0JICAgICAgc3ltLT5ic3ltLT5mbGFncyAmPX4gQlNGX0xPQ0FMOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIE5fV0FSTklORzoKLQkgIC8qIE1hcmsgd2FybmluZyBzeW1ib2xzLiAgKi8KLQkgIHN5bS0+YnN5bS0+ZmxhZ3MgfD0gQlNGX1dBUk5JTkc7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltLT5ic3ltLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotICAgIH0KLQotICBTX1NFVF9UWVBFIChzeW0sIHR5cGUpOwotCi0gIC8qIERvdWJsZSBjaGVjayB3ZWFrIHN5bWJvbHMuICAqLwotICBpZiAoc3ltLT5ic3ltLT5mbGFncyAmIEJTRl9XRUFLKQotICAgIHsKLSAgICAgIGlmIChTX0lTX0NPTU1PTiAoc3ltKSkKLQlhc19iYWQgKF8oIlN5bWJvbCBgJXMnIGNhbiBub3QgYmUgYm90aCB3ZWFrIGFuZCBjb21tb24iKSwKLQkJU19HRVRfTkFNRSAoc3ltKSk7Ci0gICAgfQotfQotCi12b2lkCi1vYmpfYW91dF9mcm9iX2ZpbGUgKCkKLXsKLSAgLyogUmVsb2NhdGlvbiBwcm9jZXNzaW5nIG1heSByZXF1aXJlIGtub3dpbmcgdGhlIFZNQXMgb2YgdGhlIHNlY3Rpb25zLgotICAgICBTaW5jZSB3cml0aW5nIHRvIGEgc2VjdGlvbiB3aWxsIGNhdXNlIHRoZSBCRkQgYmFjayBlbmQgdG8gY29tcHV0ZSB0aGUKLSAgICAgVk1BcywgZmFrZSBpdCBvdXQgaGVyZS4uLi4gICovCi0gIGJmZF9ieXRlIGIgPSAwOwotICBib29sZWFuIHggPSB0cnVlOwotICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCB0ZXh0X3NlY3Rpb24pICE9IDApCi0gICAgewotICAgICAgeCA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoc3Rkb3V0cHV0LCB0ZXh0X3NlY3Rpb24sICZiLCAoZmlsZV9wdHIpIDAsCi0JCQkJICAgIChiZmRfc2l6ZV90eXBlKSAxKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgZGF0YV9zZWN0aW9uKSAhPSAwKQotICAgIHsKLSAgICAgIHggPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKHN0ZG91dHB1dCwgZGF0YV9zZWN0aW9uLCAmYiwgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAoYmZkX3NpemVfdHlwZSkgMSk7Ci0gICAgfQotICBhc3NlcnQgKHggPT0gdHJ1ZSk7Ci19Ci0KLSNlbHNlCi0KLS8qIFJlbG9jYXRpb24uICovCi0KLS8qCi0gKgkJZW1pdF9yZWxvY2F0aW9ucygpCi0gKgotICogQ3Jhd2wgYWxvbmcgYSBmaXhTIGNoYWluLiBFbWl0IHRoZSBzZWdtZW50J3MgcmVsb2NhdGlvbnMuCi0gKi8KLXZvaWQKLW9ial9lbWl0X3JlbG9jYXRpb25zICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgZml4UyAqZml4UDsJCS8qIEZpeHVwIGNoYWluIGZvciB0aGlzIHNlZ21lbnQuICovCi0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICBmb3IgKDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCi0gICAgaWYgKGZpeFAtPmZ4X2RvbmUgPT0gMCkKLSAgICAgIHsKLQlzeW1ib2xTICpzeW07Ci0KLQlzeW0gPSBmaXhQLT5meF9hZGRzeTsKLQl3aGlsZSAoc3ltLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JICAgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltKSB8fCBTX0lTX0NPTU1PTiAoc3ltKSkpCi0JICBzeW0gPSBzeW0tPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbDsKLQlmaXhQLT5meF9hZGRzeSA9IHN5bTsKLQotCWlmICghIHN5bS0+c3lfcmVzb2x2ZWQgJiYgISBTX0lTX0RFRklORUQgKHN5bSkpCi0JICB7Ci0JICAgIGNoYXIgKmZpbGU7Ci0JICAgIHVuc2lnbmVkIGludCBsaW5lOwotCi0JICAgIGlmIChleHByX3N5bWJvbF93aGVyZSAoc3ltLCAmZmlsZSwgJmxpbmUpKQotCSAgICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgXygidW5yZXNvbHZlZCByZWxvY2F0aW9uIikpOwotCSAgICBlbHNlCi0JICAgICAgYXNfYmFkIChfKCJiYWQgcmVsb2NhdGlvbjogc3ltYm9sIGAlcycgbm90IGluIHN5bWJvbCB0YWJsZSIpLAotCQkgICAgICBTX0dFVF9OQU1FIChzeW0pKTsKLQkgIH0KLQotCXRjX2FvdXRfZml4X3RvX2NoYXJzICgqd2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKTsKLQkqd2hlcmUgKz0gbWRfcmVsb2Nfc2l6ZTsKLSAgICAgIH0KLX0KLQotI2lmbmRlZiBvYmpfaGVhZGVyX2FwcGVuZAotLyogQW91dCBmaWxlIGdlbmVyYXRpb24gJiB1dGlsaXRpZXMgKi8KLXZvaWQKLW9ial9oZWFkZXJfYXBwZW5kICh3aGVyZSwgaGVhZGVycykKLSAgICAgY2hhciAqKndoZXJlOwotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLXsKLSAgdGNfaGVhZGVyc19ob29rIChoZWFkZXJzKTsKLQotI2lmZGVmIENST1NTX0NPTVBJTEUKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2luZm8sIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfaW5mbykpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9pbmZvKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3RleHQsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGV4dCkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90ZXh0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2RhdGEsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGF0YSkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kYXRhKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2Jzcywgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9ic3MpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfYnNzKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3N5bXMsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfc3ltcykpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9zeW1zKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5LCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5KSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3Ryc2l6ZSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90cnNpemUpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdHJzaXplKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2Ryc2l6ZSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kcnNpemUpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZHJzaXplKTsKLQotI2Vsc2UgLyogQ1JPU1NfQ09NUElMRSAqLwotCi0gIGFwcGVuZCAod2hlcmUsIChjaGFyICopICZoZWFkZXJzLT5oZWFkZXIsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyKSk7Ci0jZW5kaWYgLyogQ1JPU1NfQ09NUElMRSAqLwotCi19Ci0jZW5kaWYKLQotdm9pZAotb2JqX3N5bWJvbF90b19jaGFycyAod2hlcmUsIHN5bWJvbFApCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSAmKFNfR0VUX09GRlNFVCAoc3ltYm9sUCkpLCBTX0dFVF9PRkZTRVQgKHN5bWJvbFApLCBzaXplb2YgKFNfR0VUX09GRlNFVCAoc3ltYm9sUCkpKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSAmKFNfR0VUX0RFU0MgKHN5bWJvbFApKSwgU19HRVRfREVTQyAoc3ltYm9sUCksIHNpemVvZiAoU19HRVRfREVTQyAoc3ltYm9sUCkpKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSAmKHN5bWJvbFAtPnN5X3N5bWJvbC5uX3ZhbHVlKSwgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplb2YgKHN5bWJvbFAtPnN5X3N5bWJvbC5uX3ZhbHVlKSk7Ci0KLSAgYXBwZW5kICh3aGVyZSwgKGNoYXIgKikgJnN5bWJvbFAtPnN5X3N5bWJvbCwgc2l6ZW9mIChvYmpfc3ltYm9sX3R5cGUpKTsKLX0KLQotdm9pZAotb2JqX2VtaXRfc3ltYm9scyAod2hlcmUsIHN5bWJvbF9yb290UCkKLSAgICAgY2hhciAqKndoZXJlOwotICAgICBzeW1ib2xTICpzeW1ib2xfcm9vdFA7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgLyogRW1pdCBhbGwgc3ltYm9scyBsZWZ0IGluIHRoZSBzeW1ib2wgY2hhaW4uICAqLwotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgLyogVXNlZCB0byBzYXZlIHRoZSBvZmZzZXQgb2YgdGhlIG5hbWUuIEl0IGlzIHVzZWQgdG8gcG9pbnQKLQkgdG8gdGhlIHN0cmluZyBpbiBtZW1vcnkgYnV0IG11c3QgYmUgYSBmaWxlIG9mZnNldC4gKi8KLSAgICAgIHJlZ2lzdGVyIGNoYXIgKnRlbXA7Ci0KLSAgICAgIHRlbXAgPSBTX0dFVF9OQU1FIChzeW1ib2xQKTsKLSAgICAgIFNfU0VUX09GRlNFVCAoc3ltYm9sUCwgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQpOwotCi0gICAgICAvKiBBbnkgc3ltYm9sIHN0aWxsIHVuZGVmaW5lZCBhbmQgaXMgbm90IGEgZGJnIHN5bWJvbCBpcyBtYWRlIE5fRVhULiAqLwotICAgICAgaWYgKCFTX0lTX0RFQlVHIChzeW1ib2xQKSAmJiAhU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQlTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0KLSAgICAgIC8qIEFkanVzdCB0aGUgdHlwZSBvZiBhIHdlYWsgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChTX0dFVF9XRUFLIChzeW1ib2xQKSkKLQl7Ci0JICBzd2l0Y2ggKFNfR0VUX1RZUEUgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgIGNhc2UgTl9VTkRGOiBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtVKTsgYnJlYWs7Ci0JICAgIGNhc2UgTl9BQlM6CSBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtBKTsgYnJlYWs7Ci0JICAgIGNhc2UgTl9URVhUOiBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtUKTsgYnJlYWs7Ci0JICAgIGNhc2UgTl9EQVRBOiBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtEKTsgYnJlYWs7Ci0JICAgIGNhc2UgTl9CU1M6ICBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtCKTsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6IGFzX2JhZCAoXygiJXM6IGJhZCB0eXBlIGZvciB3ZWFrIHN5bWJvbCIpLCB0ZW1wKTsgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIG9ial9zeW1ib2xfdG9fY2hhcnMgKHdoZXJlLCBzeW1ib2xQKTsKLSAgICAgIFNfU0VUX05BTUUgKHN5bWJvbFAsIHRlbXApOwotICAgIH0KLX0KLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2FvdXRfbGluZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiBBc3N1bWUgZGVsaW1pdGVyIGlzIHBhcnQgb2YgZXhwcmVzc2lvbi4KLSAgICAgQlNENC4yIGFzIGZhaWxzIHdpdGggZGVsaWdodGZ1bCBidWcsIHNvIHdlCi0gICAgIGFyZSBub3QgYmVpbmcgaW5jb21wYXRpYmxlIGhlcmUuICovCi0gIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIChpbnQpIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBvYmpfYW91dF9saW5lKCkgKi8KLQotLyogSGFuZGxlIC53ZWFrLiAgVGhpcyBpcyBhIEdOVSBleHRlbnNpb24uICAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2FvdXRfd2VhayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBkbwotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIFNfU0VUX1dFQUsgKHN5bWJvbFApOwotICAgICAgaWYgKGMgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLQkgICAgYyA9ICdcbic7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGMgPT0gJywnKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIC50eXBlLiAgT24ge05ldCxPcGVufUJTRCwgdGhpcyBpcyB1c2VkIHRvIHNldCB0aGUgbl9vdGhlciBmaWVsZCwKLSAgIHdoaWNoIGlzIHRoZW4gYXBwYXJlbnRseSB1c2VkIHdoZW4gZG9pbmcgZHluYW1pYyBsaW5raW5nLiAgT2xkZXIKLSAgIHZlcnNpb25zIG9nYXMgaWdub3JlZCB0aGUgLnR5cGUgcHNldWRvLW9wLCBzbyB3ZSBhbHNvIGlnbm9yZSBpdCBpZgotICAgd2UgY2FuJ3QgcGFyc2UgaXQuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2FvdXRfdHlwZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgaWYgKHN5bSAhPSBOVUxMKQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdAJykKLQkgICAgewotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJvYmplY3QiLCA2KSA9PSAwKQotCQlTX1NFVF9PVEhFUiAoc3ltLCAxKTsKLQkgICAgICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJmdW5jdGlvbiIsIDgpID09IDApCi0JCVNfU0VUX09USEVSIChzeW0sIDIpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJZ25vcmUgZXZlcnl0aGluZyBlbHNlIG9uIHRoZSBsaW5lLiAgKi8KLSAgc19pZ25vcmUgKDApOwotfQotCi12b2lkCi1vYmpfcmVhZF9iZWdpbl9ob29rICgpCi17Ci19Ci0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotCi12b2lkCi1vYmpfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgc3ltYm9sUyAqKnN5bWJvbFBQOwotICBpbnQgc3ltYm9sX251bWJlciA9IDA7Ci0KLSAgdGNfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKTsKLQotICBzeW1ib2xQUCA9ICZzeW1ib2xfcm9vdFA7CS8qLT5sYXN0IHN5bWJvbCBjaGFpbiBsaW5rLiAqLwotICB3aGlsZSAoKHN5bWJvbFAgPSAqc3ltYm9sUFApICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHN5bWJvbFAtPnN5X21yaV9jb21tb24pCi0JewotCSAgaWYgKFNfSVNfRVhURVJOQUwgKHN5bWJvbFApKQotCSAgICBhc19iYWQgKF8oIiVzOiBnbG9iYWwgc3ltYm9scyBub3Qgc3VwcG9ydGVkIGluIGNvbW1vbiBzZWN0aW9ucyIpLAotCQkgICAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQgJiYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19EQVRBKSkKLQl7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBTRUdfVEVYVCk7Ci0JfQkJCS8qIGlmIHB1c2luZyBkYXRhIGludG8gdGV4dCAqLwotCi0gICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sUCwgMSk7Ci0KLSAgICAgIC8qIFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gdW5kZWZpbmVkIG9yIGNvbW1vbgotCSBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChzeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JICAmJiAoISBTX0lTX0RFRklORUQgKHN5bWJvbFApIHx8IFNfSVNfQ09NTU9OIChzeW1ib2xQKSkpCi0JewotCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBPSywgaGVyZSBpcyBob3cgd2UgZGVjaWRlIHdoaWNoIHN5bWJvbHMgZ28gb3V0IGludG8gdGhlIGJyYXZlCi0JIG5ldyBzeW10YWIuICBTeW1ib2xzIHRoYXQgZG8gYXJlOgotCi0JICogc3ltYm9scyB3aXRoIG5vIG5hbWUgKHN0YWJkJ3M/KQotCSAqIHN5bWJvbHMgd2l0aCBkZWJ1ZyBpbmZvIGluIHRoZWlyIE5fVFlQRQotCi0JIFN5bWJvbHMgdGhhdCBkb24ndCBhcmU6Ci0JICogc3ltYm9scyB0aGF0IGFyZSByZWdpc3RlcnMKLQkgKiBzeW1ib2xzIHdpdGggXDEgYXMgdGhlaXIgM3JkIGNoYXJhY3RlciAobnVtZXJpYyBsYWJlbHMpCi0JICogImxvY2FsIGxhYmVscyIgYXMgZGVmaW5lZCBieSBTX0xPQ0FMX05BTUUobmFtZSkgaWYgdGhlIC1MCi0JIHN3aXRjaCB3YXMgcGFzc2VkIHRvIGdhcy4KLQotCSBBbGwgb3RoZXIgc3ltYm9scyBhcmUgb3V0cHV0LiAgV2UgY29tcGxhaW4gaWYgYSBkZWxldGVkCi0JIHN5bWJvbCB3YXMgbWFya2VkIGV4dGVybmFsLiAqLwotCi0KLSAgICAgIGlmICghU19JU19SRUdJU1RFUiAoc3ltYm9sUCkKLQkgICYmICghU19HRVRfTkFNRSAoc3ltYm9sUCkKLQkgICAgICB8fCBTX0lTX0RFQlVHIChzeW1ib2xQKQotCSAgICAgIHx8ICFTX0lTX0RFRklORUQgKHN5bWJvbFApCi0JICAgICAgfHwgU19JU19FWFRFUk5BTCAoc3ltYm9sUCkKLQkgICAgICB8fCAoU19HRVRfTkFNRSAoc3ltYm9sUClbMF0gIT0gJ1wwMDEnCi0JCSAgJiYgKGZsYWdfa2VlcF9sb2NhbHMgfHwgIVNfTE9DQUxfTkFNRSAoc3ltYm9sUCkpKSkpCi0JewotCSAgc3ltYm9sUC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcisrOwotCi0JICAvKiBUaGUgKyAxIGFmdGVyIHN0cmxlbiBhY2NvdW50IGZvciB0aGUgXDAgYXQgdGhlCi0JCQkgICBlbmQgb2YgZWFjaCBzdHJpbmcgKi8KLQkgIGlmICghU19JU19TVEFCRCAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICAvKiBPcmRpbmFyeSBjYXNlLiAqLwotCSAgICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gc3RyaW5nX2J5dGVfY291bnQ7Ci0JICAgICAgc3RyaW5nX2J5dGVfY291bnQgKz0gc3RybGVuIChTX0dFVF9OQU1FIChzeW1ib2xQKSkgKyAxOwotCSAgICB9Ci0JICBlbHNlCQkJLyogLlN0YWJkIGNhc2UuICovCi0JICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gMDsKLQkgIHN5bWJvbFBQID0gJihzeW1ib2xfbmV4dCAoc3ltYm9sUCkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoU19JU19FWFRFUk5BTCAoc3ltYm9sUCkgfHwgIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JICAgIC8qIFRoaXMgd2FybmluZyBzaG91bGQgbmV2ZXIgZ2V0IHRyaWdnZXJlZCBhbnkgbW9yZS4KLQkgICAgICAgV2VsbCwgbWF5YmUgaWYgeW91J3JlIGRvaW5nIHR3aXN0ZWQgdGhpbmdzIHdpdGgKLQkgICAgICAgcmVnaXN0ZXIgbmFtZXMuLi4gICovCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkxvY2FsIHN5bWJvbCAlcyBuZXZlciBkZWZpbmVkLiIpLCBkZWNvZGVfbG9jYWxfbGFiZWxfbmFtZSAoU19HRVRfTkFNRSAoc3ltYm9sUCkpKTsKLQkgICAgfQkJCS8qIG9vcHMuICovCi0KLQkgIC8qIFVuaG9vayBpdCBmcm9tIHRoZSBjaGFpbiAqLwotCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOwotCX0JCQkvKiBpZiB0aGlzIHN5bWJvbCBzaG91bGQgYmUgaW4gdGhlIG91dHB1dCAqLwotICAgIH0JCQkJLyogZm9yIGVhY2ggc3ltYm9sICovCi0KLSAgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUgKGhlYWRlcnMsIHN5bWJvbF9udW1iZXIpOwotfQotCi0vKgotICogRmluZCBzdHJpbmdzIGJ5IGNyYXdsaW5nIGFsb25nIHN5bWJvbCB0YWJsZSBjaGFpbi4KLSAqLwotCi12b2lkCi1vYmpfZW1pdF9zdHJpbmdzICh3aGVyZSkKLSAgICAgY2hhciAqKndoZXJlOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0jaWZkZWYgQ1JPU1NfQ09NUElMRQotICAvKiBHb3R0YSBkbyBtZF8gYnl0ZS1vcmRlcmluZyBzdHVmZiBmb3Igc3RyaW5nX2J5dGVfY291bnQgZmlyc3QgLSBLV0sgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIHN0cmluZ19ieXRlX2NvdW50LCBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KTsKLSNlbHNlIC8qIENST1NTX0NPTVBJTEUgKi8KLSAgYXBwZW5kICh3aGVyZSwgKGNoYXIgKikgJnN0cmluZ19ieXRlX2NvdW50LCAodW5zaWduZWQgbG9uZykgc2l6ZW9mIChzdHJpbmdfYnl0ZV9jb3VudCkpOwotI2VuZGlmIC8qIENST1NTX0NPTVBJTEUgKi8KLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgaWYgKFNfR0VUX05BTUUgKHN5bWJvbFApKQotCWFwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIFNfR0VUX05BTUUgKHN5bWJvbFApLAotCQkodW5zaWduZWQgbG9uZykgKHN0cmxlbiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpICsgMSkpOwotICAgIH0JCQkJLyogd2FsayBzeW1ib2wgY2hhaW4gKi8KLX0KLQotI2lmbmRlZiBBT1VUX1ZFUlNJT04KLSNkZWZpbmUgQU9VVF9WRVJTSU9OIDAKLSNlbmRpZgotCi12b2lkCi1vYmpfcHJlX3dyaXRlX2hvb2sgKGhlYWRlcnMpCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICBIX1NFVF9EWU5BTUlDIChoZWFkZXJzLCAwKTsKLSAgSF9TRVRfVkVSU0lPTiAoaGVhZGVycywgQU9VVF9WRVJTSU9OKTsKLSAgSF9TRVRfTUFDSFRZUEUgKGhlYWRlcnMsIEFPVVRfTUFDSFRZUEUpOwotICB0Y19hb3V0X3ByZV93cml0ZV9ob29rIChoZWFkZXJzKTsKLX0KLQotdm9pZAotREVGVU5fVk9JRCAoc19zZWN0KQotewotICAvKiBTdHJpcCBvdXQgdGhlIHNlY3Rpb24gbmFtZSAqLwotICBjaGFyICpzZWN0aW9uX25hbWU7Ci0gIGNoYXIgKnNlY3Rpb25fbmFtZV9lbmQ7Ci0gIGNoYXIgYzsKLQotICB1bnNpZ25lZCBpbnQgbGVuOwotICB1bnNpZ25lZCBpbnQgZXhwOwotICBjaGFyICpzYXZlOwotCi0gIHNlY3Rpb25fbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzZWN0aW9uX25hbWVfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGxlbiA9IHNlY3Rpb25fbmFtZV9lbmQgLSBzZWN0aW9uX25hbWU7Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKGMgPT0gJywnKQotICAgIHsKLSAgICAgIGV4cCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLSAgZWxzZSBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBleHAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICAgICAgZXhwID0gMDsKLSAgICB9Ci0gIGlmIChleHAgPj0gMTAwMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInN1YnNlZ21lbnQgaW5kZXggdG9vIGhpZ2giKSk7Ci0gICAgfQotCi0gIGlmIChzdHJjbXAgKHNlY3Rpb25fbmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICB7Ci0gICAgICBzdWJzZWdfc2V0IChTRUdfVEVYVCwgKHN1YnNlZ1QpIGV4cCk7Ci0gICAgfQotCi0gIGlmIChzdHJjbXAgKHNlY3Rpb25fbmFtZSwgIi5kYXRhIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpCi0Jc3Vic2VnX3NldCAoU0VHX1RFWFQsIChzdWJzZWdUKSBleHAgKyAxMDAwKTsKLSAgICAgIGVsc2UKLQlzdWJzZWdfc2V0IChTRUdfREFUQSwgKHN1YnNlZ1QpIGV4cCk7Ci0gICAgfQotCi0gICpzZWN0aW9uX25hbWVfZW5kID0gYzsKLX0KLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0vKiBlbmQgb2Ygb2JqLWFvdXQuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotYW91dC5oIGIvZ2FzL2NvbmZpZy9vYmotYW91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzkwNzBlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWFvdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKiBvYmotYW91dC5oLCBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQgZm9yIGdhcywgdGhlIGFzc2VtYmxlci4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qIFRhZyB0byB2YWxpZGF0ZSBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQgcHJvY2Vzc2luZyAqLwotI2RlZmluZSBPQkpfQU9VVCAxCi0KLSNpbmNsdWRlICJ0YXJnLWNwdS5oIgotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0jaW5jbHVkZSAiYmZkL2xpYmFvdXQuaCIKLQotI2RlZmluZSBPVVRQVVRfRkxBVk9SIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyCi0KLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZuZGVmIFZNUwotI2luY2x1ZGUgImFvdXRfZ251LmgiCQkvKiBOZWVkZWQgdG8gZGVmaW5lIHN0cnVjdCBubGlzdC4gU2lnaC4gKi8KLSNlbHNlCi0jaW5jbHVkZSAiYV9vdXQuaCIKLSNlbmRpZgotCi0jaWZuZGVmIEFPVVRfTUFDSFRZUEUKLSNkZWZpbmUgQU9VVF9NQUNIVFlQRSAwCi0jZW5kaWYgLyogQU9VVF9NQUNIVFlQRSAqLwotCi1leHRlcm4gY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdOwotZXh0ZXJuIGNvbnN0IHNlZ1QgTl9UWVBFX3NlZ1tdOwotCi0jaWZuZGVmIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRQotI2RlZmluZSBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUJKE9NQUdJQykKLSNlbmRpZiAvKiBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUgKi8KLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0vKiBTWU1CT0wgVEFCTEUgKi8KLS8qIFN5bWJvbCB0YWJsZSBlbnRyeSBkYXRhIHR5cGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgbmxpc3Qgb2JqX3N5bWJvbF90eXBlOwkvKiBTeW1ib2wgdGFibGUgZW50cnkgKi8KLQotLyogU3ltYm9sIHRhYmxlIG1hY3JvcyBhbmQgY29uc3RhbnRzICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNkZWZpbmUgU19TRVRfT1RIRVIoUyxWKQkJKGFvdXRfc3ltYm9sKChTKS0+YnN5bSktPm90aGVyID0gKFYpKQotI2RlZmluZSBTX1NFVF9UWVBFKFMsVCkJCQkoYW91dF9zeW1ib2woKFMpLT5ic3ltKS0+dHlwZSA9IChUKSkKLSNkZWZpbmUgU19TRVRfREVTQyhTLEQpCQkJKGFvdXRfc3ltYm9sKChTKS0+YnN5bSktPmRlc2MgPSAoRCkpCi0jZGVmaW5lIFNfR0VUX09USEVSKFMpCQkJKGFvdXRfc3ltYm9sKChTKS0+YnN5bSktPm90aGVyKQotI2RlZmluZSBTX0dFVF9UWVBFKFMpCQkJKGFvdXRfc3ltYm9sKChTKS0+YnN5bSktPnR5cGUpCi0jZGVmaW5lIFNfR0VUX0RFU0MoUykJCQkoYW91dF9zeW1ib2woKFMpLT5ic3ltKS0+ZGVzYykKLQotYXNlY3Rpb24gKnRleHRfc2VjdGlvbiwgKmRhdGFfc2VjdGlvbiwgKmJzc19zZWN0aW9uOwotCi0jZGVmaW5lIG9ial9mcm9iX3N5bWJvbChTLFBVTlQpCW9ial9hb3V0X2Zyb2Jfc3ltYm9sIChTLCAmUFVOVCkKLSNkZWZpbmUgb2JqX2Zyb2JfZmlsZSgpCQlvYmpfYW91dF9mcm9iX2ZpbGUgKCkKLWV4dGVybiB2b2lkIG9ial9hb3V0X2Zyb2Jfc3ltYm9sIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKiwgaW50ICopKTsKLWV4dGVybiB2b2lkIG9ial9hb3V0X2Zyb2JfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKFNFQykJKDEpCi0KLSNlbHNlCi0KLS8qIFdlIHVzZSB0aGUgc3lfb2JqIGZpZWxkIHRvIHJlY29yZCB3aGV0aGVyIGEgc3ltYm9sIGlzIHdlYWsuICAqLwotI2RlZmluZSBPQkpfU1lNRklFTERfVFlQRSBjaGFyCi0KLS8qCi0gKiAgTWFjcm9zIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KLSAqICBUaGlzIHN5bnRheGljIGluZGlyZWN0aW9uIGFsbG93cyBpbmRlcGVuZGVuY2UgcmVnYXJkaW5nIGEub3V0IG9yIGNvZmYuCi0gKiAgVGhlIGFyZ3VtZW50IChzKSBvZiBhbGwgdGhlc2UgbWFjcm9zIGlzIGEgcG9pbnRlciB0byBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KLSAqLwotCi0vKiBUcnVlIGlmIHRoZSBzeW1ib2wgaXMgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19JU19FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9FWFQpCi0KLS8qIFRydWUgaWYgc3ltYm9sIGhhcyBiZWVuIGRlZmluZWQsIGllIGlzIGluIE5fe1RFWFQsREFUQSxCU1MsQUJTfSBvciBOX0VYVCAqLwotI2RlZmluZSBTX0lTX0RFRklORUQocykgXAotICAoU19HRVRfVFlQRSAocykgIT0gTl9VTkRGIHx8IFNfR0VUX0RFU0MgKHMpICE9IDApCi0KLSNkZWZpbmUgU19JU19DT01NT04ocykgXAotICAoU19HRVRfVFlQRSAocykgPT0gTl9VTkRGICYmIFNfR0VUX1ZBTFVFIChzKSAhPSAwKQotCi0jZGVmaW5lIFNfSVNfUkVHSVNURVIocykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSA9PSBOX1JFR0lTVEVSKQotCi0vKiBUcnVlIGlmIGEgZGVidWcgc3BlY2lhbCBzeW1ib2wgZW50cnkgKi8KLSNkZWZpbmUgU19JU19ERUJVRyhzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fU1RBQikKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbG9jYWwgc3ltYm9sIG5hbWUgKi8KLSNkZWZpbmUgU19JU19MT0NBTChzKSAJCQkJCVwKLSAgKChTX0dFVF9OQU1FIChzKSAJCQkJCVwKLSAgICAmJiAhU19JU19ERUJVRyAocykgCQkJCQlcCi0gICAgJiYgKHN0cmNociAoU19HRVRfTkFNRSAocyksICdcMDAxJykgIT0gTlVMTAkJXAotICAgICAgICB8fCBzdHJjaHIgKFNfR0VUX05BTUUgKHMpLCAnXDAwMicpICE9IE5VTEwJXAotICAgICAgICB8fCAoU19MT0NBTF9OQU1FKHMpICYmICFmbGFnX2tlZXBfbG9jYWxzKSkpCVwKLSAgIHx8IChmbGFnX3N0cmlwX2xvY2FsX2Fic29sdXRlCQkJXAotICAgICAgICYmICEgU19JU19FWFRFUk5BTChzKQkJCQlcCi0gICAgICAgJiYgU19HRVRfU0VHTUVOVCAocykgPT0gYWJzb2x1dGVfc2VjdGlvbikpCi0vKiBUcnVlIGlmIGEgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgZmlsZSAqLwotI2RlZmluZSBTX0lTX0VYVEVSTihzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fRVhUKQotLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGhhcyBiZWVuIGdlbmVyYXRlZCBiZWNhdXNlIG9mIGEgLnN0YWJkIGRpcmVjdGl2ZSAqLwotI2RlZmluZSBTX0lTX1NUQUJEKHMpCQkoU19HRVRfTkFNRShzKSA9PSAoY2hhciAqKTApCi0KLS8qIEFjY2Vzc29ycyAqLwotLyogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX0dFVF9OQU1FKHMpCQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX25hbWUpCi0vKiBUaGUgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRhYmxlICovCi0jZGVmaW5lIFNfR0VUX09GRlNFVChzKQkJKChzKS0+c3lfc3ltYm9sLm5fdW4ubl9zdHJ4KQotLyogVGhlIHR5cGUgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX0dFVF9UWVBFKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9UWVBFKQotLyogVGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIHNlZ21lbnQgKi8KLSNkZWZpbmUgU19HRVRfU0VHTUVOVChzKQkoTl9UWVBFX3NlZ1tTX0dFVF9UWVBFKHMpXSkKLS8qIFRoZSBuX290aGVyIGV4cHJlc3Npb24gdmFsdWUgKi8KLSNkZWZpbmUgU19HRVRfT1RIRVIocykJCSgocyktPnN5X3N5bWJvbC5uX290aGVyKQotLyogVGhlIG5fZGVzYyBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfR0VUX0RFU0MocykJCSgocyktPnN5X3N5bWJvbC5uX2Rlc2MpCi0vKiBXaGV0aGVyIHRoZSBzeW1ib2wgaXMgd2Vhay4gICovCi0jZGVmaW5lIFNfR0VUX1dFQUsocykJCSgocyktPnN5X29iaikKLQotLyogTW9kaWZpZXJzICovCi0vKiBBc3N1bWUgdGhhdCBhIHN5bWJvbCBjYW5ub3QgYmUgc2ltdWx0YW5lb3VzbHkgaW4gbW9yZSB0aGFuIG9uIHNlZ21lbnQgKi8KLS8qIHNldCBzZWdtZW50ICovCi0jZGVmaW5lIFNfU0VUX1NFR01FTlQocyxzZWcpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJj0gfk5fVFlQRSwocyktPnN5X3N5bWJvbC5uX3R5cGV8PVNFR01FTlRfVE9fU1lNQk9MX1RZUEUoc2VnKSkKLS8qIFRoZSBzeW1ib2wgaXMgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19TRVRfRVhURVJOQUwocykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSB8PSBOX0VYVCkKLS8qIFRoZSBzeW1ib2wgaXMgbm90IGV4dGVybmFsICovCi0jZGVmaW5lIFNfQ0xFQVJfRVhURVJOQUwocykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmPSB+Tl9FWFQpCi0vKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX1NFVF9OQU1FKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX3VuLm5fbmFtZSA9ICh2KSkKLS8qIFNldCB0aGUgb2Zmc2V0IGluIHRoZSBzdHJpbmcgdGFibGUgKi8KLSNkZWZpbmUgU19TRVRfT0ZGU0VUKHMsdikJKChzKS0+c3lfc3ltYm9sLm5fdW4ubl9zdHJ4ID0gKHYpKQotLyogU2V0IHRoZSBuX3R5cGUgZmllbGQgKi8KLSNkZWZpbmUgU19TRVRfVFlQRShzLHQpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlID0gKHQpKQotLyogU2V0IHRoZSBuX290aGVyIGV4cHJlc3Npb24gdmFsdWUgKi8KLSNkZWZpbmUgU19TRVRfT1RIRVIocyx2KQkoKHMpLT5zeV9zeW1ib2wubl9vdGhlciA9ICh2KSkKLS8qIFNldCB0aGUgbl9kZXNjIGV4cHJlc3Npb24gdmFsdWUgKi8KLSNkZWZpbmUgU19TRVRfREVTQyhzLHYpCQkoKHMpLT5zeV9zeW1ib2wubl9kZXNjID0gKHYpKQotLyogTWFyayB0aGUgc3ltYm9sIGFzIHdlYWsuICBUaGlzIGNhdXNlcyBuX3R5cGUgdG8gYmUgYWRqdXN0ZWQgd2hlbgotICAgdGhlIHN5bWJvbCBpcyB3cml0dGVuIG91dC4gICovCi0jZGVmaW5lIFNfU0VUX1dFQUsocykJCSgocyktPnN5X29iaiA9IDEpCi0KLS8qIEZpbGUgaGVhZGVyIG1hY3JvIGFuZCB0eXBlIGRlZmluaXRpb24gKi8KLQotI2RlZmluZSBIX0dFVF9GSUxFX1NJWkUoaCkJKEhfR0VUX0hFQURFUl9TSVpFKGgpIFwKLQkJCQkgKyBIX0dFVF9URVhUX1NJWkUoaCkgXAotCQkJCSArIEhfR0VUX0RBVEFfU0laRShoKSBcCi0JCQkJICsgSF9HRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCkgXAotCQkJCSArIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgpIFwKLQkJCQkgKyBIX0dFVF9EQVRBX1JFTE9DQVRJT05fU0laRShoKSBcCi0JCQkJICsgSF9HRVRfU1RSSU5HX1NJWkUoaCkpCi0KLSNkZWZpbmUgSF9HRVRfSEVBREVSX1NJWkUoaCkJCShFWEVDX0JZVEVTX1NJWkUpCi0jZGVmaW5lIEhfR0VUX1RFWFRfU0laRShoKQkJKChoKS0+aGVhZGVyLmFfdGV4dCkKLSNkZWZpbmUgSF9HRVRfREFUQV9TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV9kYXRhKQotI2RlZmluZSBIX0dFVF9CU1NfU0laRShoKQkJKChoKS0+aGVhZGVyLmFfYnNzKQotI2RlZmluZSBIX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRShoKQkoKGgpLT5oZWFkZXIuYV90cnNpemUpCi0jZGVmaW5lIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKGgpCSgoaCktPmhlYWRlci5hX2Ryc2l6ZSkKLSNkZWZpbmUgSF9HRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCkJKChoKS0+aGVhZGVyLmFfc3ltcykKLSNkZWZpbmUgSF9HRVRfRU5UUllfUE9JTlQoaCkJCSgoaCktPmhlYWRlci5hX2VudHJ5KQotI2RlZmluZSBIX0dFVF9TVFJJTkdfU0laRShoKQkJKChoKS0+c3RyaW5nX3RhYmxlX3NpemUpCi0jZGVmaW5lIEhfR0VUX0xJTkVOT19TSVpFKGgpCQkoMCkKLQotI2RlZmluZSBIX0dFVF9EWU5BTUlDKGgpCQkoKGgpLT5oZWFkZXIuYV9pbmZvID4+IDMxKQotI2RlZmluZSBIX0dFVF9WRVJTSU9OKGgpCQkoKChoKS0+aGVhZGVyLmFfaW5mbyA+PiAyNCkgJiAweDdmKQotI2RlZmluZSBIX0dFVF9NQUNIVFlQRShoKQkJKCgoaCktPmhlYWRlci5hX2luZm8gPj4gMTYpICYgMHhmZikKLSNkZWZpbmUgSF9HRVRfTUFHSUNfTlVNQkVSKGgpCQkoKGgpLT5oZWFkZXIuYV9pbmZvICYgMHhmZmZmKQotCi0jZGVmaW5lIEhfU0VUX0RZTkFNSUMoaCx2KQkJKChoKS0+aGVhZGVyLmFfaW5mbyA9ICgoKHYpIDw8IDMxKSBcCi0JCQkJCQkJICAgICAgIHwgKEhfR0VUX1ZFUlNJT04oaCkgPDwgMjQpIFwKLQkJCQkJCQkgICAgICAgfCAoSF9HRVRfTUFDSFRZUEUoaCkgPDwgMTYpIFwKLQkJCQkJCQkgICAgICAgfCAoSF9HRVRfTUFHSUNfTlVNQkVSKGgpKSkpCi0KLSNkZWZpbmUgSF9TRVRfVkVSU0lPTihoLHYpCQkoKGgpLT5oZWFkZXIuYV9pbmZvID0gKChIX0dFVF9EWU5BTUlDKGgpIDw8IDMxKSBcCi0JCQkJCQkJICAgICAgIHwgKCh2KSA8PCAyNCkgXAotCQkJCQkJCSAgICAgICB8IChIX0dFVF9NQUNIVFlQRShoKSA8PCAxNikgXAotCQkJCQkJCSAgICAgICB8IChIX0dFVF9NQUdJQ19OVU1CRVIoaCkpKSkKLQotI2RlZmluZSBIX1NFVF9NQUNIVFlQRShoLHYpCQkoKGgpLT5oZWFkZXIuYV9pbmZvID0gKChIX0dFVF9EWU5BTUlDKGgpIDw8IDMxKSBcCi0JCQkJCQkJICAgICAgIHwgKEhfR0VUX1ZFUlNJT04oaCkgPDwgMjQpIFwKLQkJCQkJCQkgICAgICAgfCAoKHYpIDw8IDE2KSBcCi0JCQkJCQkJICAgICAgIHwgKEhfR0VUX01BR0lDX05VTUJFUihoKSkpKQotCi0jZGVmaW5lIEhfU0VUX01BR0lDX05VTUJFUihoLHYpCQkoKGgpLT5oZWFkZXIuYV9pbmZvID0gKChIX0dFVF9EWU5BTUlDKGgpIDw8IDMxKSBcCi0JCQkJCQkJICAgICAgIHwgKEhfR0VUX1ZFUlNJT04oaCkgPDwgMjQpIFwKLQkJCQkJCQkgICAgICAgfCAoSF9HRVRfTUFDSFRZUEUoaCkgPDwgMTYpIFwKLQkJCQkJCQkgICAgICAgfCAoKHYpKSkpCi0KLSNkZWZpbmUgSF9TRVRfVEVYVF9TSVpFKGgsdikJCSgoaCktPmhlYWRlci5hX3RleHQgPSBtZF9zZWN0aW9uX2FsaWduKFNFR19URVhULCAodikpKQotI2RlZmluZSBIX1NFVF9EQVRBX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfZGF0YSA9IG1kX3NlY3Rpb25fYWxpZ24oU0VHX0RBVEEsICh2KSkpCi0jZGVmaW5lIEhfU0VUX0JTU19TSVpFKGgsdikJCSgoaCktPmhlYWRlci5hX2JzcyA9IG1kX3NlY3Rpb25fYWxpZ24oU0VHX0JTUywgKHYpKSkKLQotI2RlZmluZSBIX1NFVF9SRUxPQ0FUSU9OX1NJWkUoaCx0LGQpCShIX1NFVF9URVhUX1JFTE9DQVRJT05fU0laRSgoaCksKHQpKSxcCi0JCQkJCSBIX1NFVF9EQVRBX1JFTE9DQVRJT05fU0laRSgoaCksKGQpKSkKLQotI2RlZmluZSBIX1NFVF9URVhUX1JFTE9DQVRJT05fU0laRShoLHYpCSgoaCktPmhlYWRlci5hX3Ryc2l6ZSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUoaCx2KQkoKGgpLT5oZWFkZXIuYV9kcnNpemUgPSAodikpCi0jZGVmaW5lIEhfU0VUX1NZTUJPTF9UQUJMRV9TSVpFKGgsdikJKChoKS0+aGVhZGVyLmFfc3ltcyA9ICh2KSAqIDEyKQotCi0jZGVmaW5lIEhfU0VUX0VOVFJZX1BPSU5UKGgsdikJCSgoaCktPmhlYWRlci5hX2VudHJ5ID0gKHYpKQotI2RlZmluZSBIX1NFVF9TVFJJTkdfU0laRShoLHYpCQkoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSA9ICh2KSkKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHN0cnVjdCBleGVjIGhlYWRlcjsJCS8qIGEub3V0IGhlYWRlciAqLwotICAgIGxvbmcgc3RyaW5nX3RhYmxlX3NpemU7CS8qIG5hbWVzICsgJ1wwJyArIHNpemVvZihpbnQpICovCi0gIH0KLQotb2JqZWN0X2hlYWRlcnM7Ci0KLS8qIGxpbmUgbnVtYmVyaW5nIHN0dWZmLiAqLwotI2RlZmluZSBPQkpfRU1JVF9MSU5FTk8oYSwgYiwgYykJezt9Ci0KLXN0cnVjdCBmaXg7Ci12b2lkIHRjX2FvdXRfZml4X3RvX2NoYXJzIFBBUkFNUyAoKGNoYXIgKndoZXJlLCBzdHJ1Y3QgZml4ICpmaXhQLCByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3MpKTsKLQotI2VuZGlmCi0KLSNkZWZpbmUgb2JqX3N5bWJvbF9uZXdfaG9vayhzKQl7O30KLQotI2RlZmluZSBFTUlUX1NFQ1RJT05fU1lNQk9MUwkJMAotCi0jZGVmaW5lIEFPVVRfU1RBQlMKLQotLyogZW5kIG9mIG9iai1hb3V0LmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWJvdXQuYyBiL2dhcy9jb25maWcvb2JqLWJvdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliODBmNS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1ib3V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyogYi5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZQotICAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotY29uc3Qgc2hvcnQJCQkvKiBpbjogc2VnVCAgIG91dDogTl9UWVBFIGJpdHMgKi8KLSAgc2VnX05fVFlQRVtdID0KLXsKLSAgTl9BQlMsCi0gIE5fVEVYVCwKLSAgTl9EQVRBLAotICBOX0JTUywKLSAgTl9VTkRGLAkJCS8qIHVua25vd24gKi8KLSAgTl9VTkRGLAkJCS8qIGVycm9yICovCi0gIE5fVU5ERiwJCQkvKiBleHByZXNzaW9uICovCi0gIE5fVU5ERiwJCQkvKiBkZWJ1ZyAqLwotICBOX1VOREYsCQkJLyogbnR2ICovCi0gIE5fVU5ERiwJCQkvKiBwdHYgKi8KLSAgTl9SRUdJU1RFUiwJCQkvKiByZWdpc3RlciAqLwotfTsKLQotY29uc3Qgc2VnVCBOX1RZUEVfc2VnW05fVFlQRSArIDJdID0KLXsJCQkJLyogTl9UWVBFID09IDB4MUUgPSAzMi0yICovCi0gIFNFR19VTktOT1dOLAkJCS8qIE5fVU5ERiA9PSAwICovCi0gIFNFR19HT09GLAotICBTRUdfQUJTT0xVVEUsCQkJLyogTl9BQlMgPT0gMiAqLwotICBTRUdfR09PRiwKLSAgU0VHX1RFWFQsCQkJLyogTl9URVhUID09IDQgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19EQVRBLAkJCS8qIE5fREFUQSA9PSA2ICovCi0gIFNFR19HT09GLAotICBTRUdfQlNTLAkJCS8qIE5fQlNTID09IDggKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKLSAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAotICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKLSAgU0VHX1JFR0lTVEVSLAkJCS8qIGR1bW15IE5fUkVHSVNURVIgZm9yIHJlZ3MgPSAzMCAqLwotICBTRUdfR09PRiwKLX07Ci0KLXN0YXRpYyB2b2lkIG9ial9ib3V0X2xpbmUgUEFSQU1TICgoaW50KSk7Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW10gPQotewotICB7ImxpbmUiLCBvYmpfYm91dF9saW5lLCAwfSwJLyogc291cmNlIGNvZGUgbGluZSBudW1iZXIgKi8KLQotLyogY29mZiBkZWJ1Z2dpbmcgZGlyZWN0aXZlcy4gIEN1cnJlbnRseSBpZ25vcmVkIHNpbGVudGx5ICovCi0gIHsiZGVmIiwgc19pZ25vcmUsIDB9LAotICB7ImRpbSIsIHNfaWdub3JlLCAwfSwKLSAgeyJlbmRlZiIsIHNfaWdub3JlLCAwfSwKLSAgeyJsbiIsIHNfaWdub3JlLCAwfSwKLSAgeyJzY2wiLCBzX2lnbm9yZSwgMH0sCi0gIHsic2l6ZSIsIHNfaWdub3JlLCAwfSwKLSAgeyJ0YWciLCBzX2lnbm9yZSwgMH0sCi0gIHsidHlwZSIsIHNfaWdub3JlLCAwfSwKLSAgeyJ2YWwiLCBzX2lnbm9yZSwgMH0sCi0KLS8qIG90aGVyIHN0dWZmIHdlIGRvbid0IGhhbmRsZSAqLwotICB7IkFCT1JUIiwgc19pZ25vcmUsIDB9LAotICB7ImlkZW50Iiwgc19pZ25vcmUsIDB9LAotCi0gIHtOVUxMfQkJCS8qIGVuZCBzZW50aW5lbCAqLwotfTsJCQkJLyogb2JqX3BzZXVkb190YWJsZSAqLwotCi0vKiBSZWxvY2F0aW9uLiAqLwotCi0vKgotICoJCWVtaXRfcmVsb2NhdGlvbnMoKQotICoKLSAqIENyYXdsIGFsb25nIGEgZml4UyBjaGFpbi4gRW1pdCB0aGUgc2VnbWVudCdzIHJlbG9jYXRpb25zLgotICovCi12b2lkCi1vYmpfZW1pdF9yZWxvY2F0aW9ucyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICoqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7CQkvKiBGaXh1cCBjaGFpbiBmb3IgdGhpcyBzZWdtZW50LiAqLwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgZm9yICg7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotICAgIHsKLSAgICAgIGlmIChmaXhQLT5meF9kb25lID09IDAKLQkgIHx8IGZpeFAtPmZ4X3JfdHlwZSAhPSBOT19SRUxPQykKLQl7Ci0JICBzeW1ib2xTICpzeW07Ci0KLQkgIHN5bSA9IGZpeFAtPmZ4X2FkZHN5OwotCSAgd2hpbGUgKHN5bS0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCQkgJiYgKCEgU19JU19ERUZJTkVEIChzeW0pIHx8IFNfSVNfQ09NTU9OIChzeW0pKSkKLQkgICAgc3ltID0gc3ltLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2w7Ci0JICBmaXhQLT5meF9hZGRzeSA9IHN5bTsKLQotCSAgdGNfYm91dF9maXhfdG9fY2hhcnMgKCp3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpOwotCSAgKndoZXJlICs9IHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbyk7Ci0JfQkJCS8qIGlmIHRoZXJlJ3MgYSBzeW1ib2wgKi8KLSAgICB9CQkJCS8qIGZvciBlYWNoIGZpeHVwICovCi0KLX0JCQkJLyogZW1pdF9yZWxvY2F0aW9ucygpICovCi0KLS8qIEFvdXQgZmlsZSBnZW5lcmF0aW9uICYgdXRpbGl0aWVzICovCi0KLS8qIENvbnZlcnQgYSBsdmFsdWUgdG8gbWFjaGluZSBkZXBlbmRlbnQgZGF0YSAqLwotdm9pZAotb2JqX2hlYWRlcl9hcHBlbmQgKHdoZXJlLCBoZWFkZXJzKQotICAgICBjaGFyICoqd2hlcmU7Ci0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICAvKiBBbHdheXMgbGVhdmUgaW4gaG9zdCBieXRlIG9yZGVyICovCi0KLSAgaGVhZGVycy0+aGVhZGVyLmFfdGFsaWduID0gc2VjdGlvbl9hbGlnbm1lbnRbU0VHX1RFWFRdOwotCi0gIGlmIChoZWFkZXJzLT5oZWFkZXIuYV90YWxpZ24gPCAyKQotICAgIHsKLSAgICAgIGhlYWRlcnMtPmhlYWRlci5hX3RhbGlnbiA9IDI7Ci0gICAgfQkJCQkvKiBmb3JjZSB0byBhdCBsZWFzdCAyICovCi0KLSAgaGVhZGVycy0+aGVhZGVyLmFfZGFsaWduID0gc2VjdGlvbl9hbGlnbm1lbnRbU0VHX0RBVEFdOwotICBoZWFkZXJzLT5oZWFkZXIuYV9iYWxpZ24gPSBzZWN0aW9uX2FsaWdubWVudFtTRUdfQlNTXTsKLQotICBoZWFkZXJzLT5oZWFkZXIuYV90bG9hZCA9IDA7Ci0gIGhlYWRlcnMtPmhlYWRlci5hX2Rsb2FkID0gbWRfc2VjdGlvbl9hbGlnbiAoU0VHX0RBVEEsIEhfR0VUX1RFWFRfU0laRSAoaGVhZGVycykpOwotCi0gIGhlYWRlcnMtPmhlYWRlci5hX3JlbGF4YWJsZSA9IGxpbmtyZWxheDsKLQotI2lmZGVmIENST1NTX0NPTVBJTEUKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX21hZ2ljLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX21hZ2ljKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX21hZ2ljKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3RleHQsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGV4dCkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90ZXh0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2RhdGEsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGF0YSkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kYXRhKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2Jzcywgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9ic3MpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfYnNzKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3N5bXMsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfc3ltcykpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9zeW1zKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5LCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5KSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3Ryc2l6ZSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90cnNpemUpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdHJzaXplKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2Ryc2l6ZSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kcnNpemUpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZHJzaXplKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3Rsb2FkLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3Rsb2FkKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3Rsb2FkKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2Rsb2FkLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2Rsb2FkKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2Rsb2FkKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3RhbGlnbiwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90YWxpZ24pKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGFsaWduKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2RhbGlnbiwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kYWxpZ24pKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGFsaWduKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2JhbGlnbiwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9iYWxpZ24pKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfYmFsaWduKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3JlbGF4YWJsZSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9yZWxheGFibGUpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfcmVsYXhhYmxlKTsKLSNlbHNlIC8qICEgQ1JPU1NfQ09NUElMRSAqLwotICBhcHBlbmQgKHdoZXJlLCAoY2hhciAqKSAmaGVhZGVycy0+aGVhZGVyLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlcikpOwotI2VuZGlmIC8qICEgQ1JPU1NfQ09NUElMRSAqLwotfQkJCQkvKiBhX2hlYWRlcl9hcHBlbmQoKSAqLwotCi12b2lkCi1vYmpfc3ltYm9sX3RvX2NoYXJzICh3aGVyZSwgc3ltYm9sUCkKLSAgICAgY2hhciAqKndoZXJlOwotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBtZF9udW1iZXJfdG9fY2hhcnMgKChjaGFyICopICYoU19HRVRfT0ZGU0VUIChzeW1ib2xQKSksIFNfR0VUX09GRlNFVCAoc3ltYm9sUCksIHNpemVvZiAoU19HRVRfT0ZGU0VUIChzeW1ib2xQKSkpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKChjaGFyICopICYoU19HRVRfREVTQyAoc3ltYm9sUCkpLCBTX0dFVF9ERVNDIChzeW1ib2xQKSwgc2l6ZW9mIChTX0dFVF9ERVNDIChzeW1ib2xQKSkpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKChjaGFyICopICZzeW1ib2xQLT5zeV9zeW1ib2wubl92YWx1ZSwgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplb2YgKHN5bWJvbFAtPnN5X3N5bWJvbC5uX3ZhbHVlKSk7Ci0KLSAgYXBwZW5kICh3aGVyZSwgKGNoYXIgKikgJnN5bWJvbFAtPnN5X3N5bWJvbCwgc2l6ZW9mIChvYmpfc3ltYm9sX3R5cGUpKTsKLX0JCQkJLyogb2JqX3N5bWJvbF90b19jaGFycygpICovCi0KLXZvaWQKLW9ial9lbWl0X3N5bWJvbHMgKHdoZXJlLCBzeW1ib2xfcm9vdFApCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgc3ltYm9sUyAqc3ltYm9sX3Jvb3RQOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIC8qCi0JICogRW1pdCBhbGwgc3ltYm9scyBsZWZ0IGluIHRoZSBzeW1ib2wgY2hhaW4uCi0JICovCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICAvKiBVc2VkIHRvIHNhdmUgdGhlIG9mZnNldCBvZiB0aGUgbmFtZS4gSXQgaXMgdXNlZCB0byBwb2ludAotCQkgICB0byB0aGUgc3RyaW5nIGluIG1lbW9yeSBidXQgbXVzdCBiZSBhIGZpbGUgb2Zmc2V0LiAqLwotICAgICAgY2hhciAqdGVtcDsKLQotICAgICAgdGVtcCA9IFNfR0VUX05BTUUgKHN5bWJvbFApOwotICAgICAgU19TRVRfT0ZGU0VUIChzeW1ib2xQLCBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCk7Ci0KLSAgICAgIC8qIEFueSBzeW1ib2wgc3RpbGwgdW5kZWZpbmVkIGFuZCBpcyBub3QgYSBkYmcgc3ltYm9sIGlzIG1hZGUgTl9FWFQuICovCi0gICAgICBpZiAoIVNfSVNfREVCVUcgKHN5bWJvbFApICYmICFTX0lTX0RFRklORUQgKHN5bWJvbFApKQotCVNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQotICAgICAgb2JqX3N5bWJvbF90b19jaGFycyAod2hlcmUsIHN5bWJvbFApOwotICAgICAgU19TRVRfTkFNRSAoc3ltYm9sUCwgdGVtcCk7Ci0gICAgfQotfQkJCQkvKiBlbWl0X3N5bWJvbHMoKSAqLwotCi12b2lkCi1vYmpfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBTX1NFVF9PVEhFUiAoc3ltYm9sUCwgMCk7Ci0gIFNfU0VUX0RFU0MgKHN5bWJvbFAsIDApOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2JvdXRfbGluZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiBBc3N1bWUgZGVsaW1pdGVyIGlzIHBhcnQgb2YgZXhwcmVzc2lvbi4gKi8KLSAgLyogQlNENC4yIGFzIGZhaWxzIHdpdGggZGVsaWdodGZ1bCBidWcsIHNvIHdlICovCi0gIC8qIGFyZSBub3QgYmVpbmcgaW5jb21wYXRpYmxlIGhlcmUuICovCi0gIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIChpbnQpIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBvYmpfYm91dF9saW5lKCkgKi8KLQotdm9pZAotb2JqX3JlYWRfYmVnaW5faG9vayAoKQotewotfQotCi12b2lkCi1vYmpfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLXsKLSAgc3ltYm9sUyAqKnN5bWJvbFBQOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBpbnQgc3ltYm9sX251bWJlciA9IDA7Ci0KLSAgdGNfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKTsKLQotICBzeW1ib2xQUCA9ICZzeW1ib2xfcm9vdFA7CS8qLT5sYXN0IHN5bWJvbCBjaGFpbiBsaW5rLiAqLwotICB3aGlsZSAoKHN5bWJvbFAgPSAqc3ltYm9sUFApICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0ICYmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfREFUQSkpCi0JewotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgU0VHX1RFWFQpOwotCX0JCQkvKiBpZiBwdXNpbmcgZGF0YSBpbnRvIHRleHQgKi8KLQotICAgICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbFAsIDEpOwotCi0gICAgICAvKiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIHVuZGVmaW5lZCBvciBjb21tb24KLQkgc3ltYm9scy4gICovCi0gICAgICBpZiAoc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCSAgJiYgKCEgU19JU19ERUZJTkVEIChzeW1ib2xQKSB8fCBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpKQotCXsKLQkgICpzeW1ib2xQUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogT0ssIGhlcmUgaXMgaG93IHdlIGRlY2lkZSB3aGljaCBzeW1ib2xzIGdvIG91dCBpbnRvIHRoZQotCSBicmF2ZSBuZXcgc3ltdGFiLiAgU3ltYm9scyB0aGF0IGRvIGFyZToKLQkJCi0JICogc3ltYm9scyB3aXRoIG5vIG5hbWUgKHN0YWJkJ3M/KQotCSAqIHN5bWJvbHMgd2l0aCBkZWJ1ZyBpbmZvIGluIHRoZWlyIE5fVFlQRQotCQkKLQkgU3ltYm9scyB0aGF0IGRvbid0IGFyZToKLQkgKiBzeW1ib2xzIHRoYXQgYXJlIHJlZ2lzdGVycwotCSAqIHN5bWJvbHMgd2l0aCBcMSBhcyB0aGVpciAzcmQgY2hhcmFjdGVyIChudW1lcmljIGxhYmVscykKLQkgKiAibG9jYWwgbGFiZWxzIiBhcyBkZWZpbmVkIGJ5IFNfTE9DQUxfTkFNRShuYW1lKQotCSBpZiB0aGUgLUwgc3dpdGNoIHdhcyBwYXNzZWQgdG8gZ2FzLgotCQkKLQkgQWxsIG90aGVyIHN5bWJvbHMgYXJlIG91dHB1dC4gIFdlIGNvbXBsYWluIGlmIGEgZGVsZXRlZAotCSBzeW1ib2wgd2FzIG1hcmtlZCBleHRlcm5hbC4gKi8KLQotCi0gICAgICBpZiAoMQotCSAgJiYgIVNfSVNfUkVHSVNURVIgKHN5bWJvbFApCi0JICAmJiAoIVNfR0VUX05BTUUgKHN5bWJvbFApCi0JICAgICAgfHwgU19JU19ERUJVRyAoc3ltYm9sUCkKLSNpZmRlZiBUQ19JOTYwCi0gICAgICAvKiBGSVhNRS1TT09OIHRoaXMgaWZkZWYgc2VlbXMgaGlnaGx5IGR1YmlvdXMgdG8gbWUuICB4b3hvcmljaC4gKi8KLQkgICAgICB8fCAhU19JU19ERUZJTkVEIChzeW1ib2xQKQotCSAgICAgIHx8IFNfSVNfRVhURVJOQUwgKHN5bWJvbFApCi0jZW5kaWYgLyogVENfSTk2MCAqLwotCSAgICAgIHx8IChTX0dFVF9OQU1FIChzeW1ib2xQKVswXSAhPSAnXDAwMScgJiYgKGZsYWdfa2VlcF9sb2NhbHMgfHwgIVNfTE9DQUxfTkFNRSAoc3ltYm9sUCkpKSkpCi0JewotCSAgc3ltYm9sUC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcisrOwotCi0JICAvKiBUaGUgKyAxIGFmdGVyIHN0cmxlbiBhY2NvdW50IGZvciB0aGUgXDAgYXQgdGhlCi0JCQkgICBlbmQgb2YgZWFjaCBzdHJpbmcgKi8KLQkgIGlmICghU19JU19TVEFCRCAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICAvKiBPcmRpbmFyeSBjYXNlLiAqLwotCSAgICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gc3RyaW5nX2J5dGVfY291bnQ7Ci0JICAgICAgc3RyaW5nX2J5dGVfY291bnQgKz0gc3RybGVuIChTX0dFVF9OQU1FIChzeW1ib2xQKSkgKyAxOwotCSAgICB9Ci0JICBlbHNlCQkJLyogLlN0YWJkIGNhc2UuICovCi0JICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gMDsKLQkgIHN5bWJvbFBQID0gJihzeW1ib2xfbmV4dCAoc3ltYm9sUCkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoU19JU19FWFRFUk5BTCAoc3ltYm9sUCkgfHwgIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkxvY2FsIHN5bWJvbCAlcyBuZXZlciBkZWZpbmVkIiksIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQkgICAgfQkJCS8qIG9vcHMuICovCi0KLQkgIC8qIFVuaG9vayBpdCBmcm9tIHRoZSBjaGFpbiAqLwotCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOwotCX0JCQkvKiBpZiB0aGlzIHN5bWJvbCBzaG91bGQgYmUgaW4gdGhlIG91dHB1dCAqLwotICAgIH0JCQkJLyogZm9yIGVhY2ggc3ltYm9sICovCi0KLSAgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUgKGhlYWRlcnMsIHN5bWJvbF9udW1iZXIpOwotfQotCi0vKgotICogRmluZCBzdHJpbmdzIGJ5IGNyYXdsaW5nIGFsb25nIHN5bWJvbCB0YWJsZSBjaGFpbi4KLSAqLwotCi12b2lkCi1vYmpfZW1pdF9zdHJpbmdzICh3aGVyZSkKLSAgICAgY2hhciAqKndoZXJlOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0jaWZkZWYgQ1JPU1NfQ09NUElMRQotICAvKiBHb3R0YSBkbyBtZF8gYnl0ZS1vcmRlcmluZyBzdHVmZiBmb3Igc3RyaW5nX2J5dGVfY291bnQgZmlyc3QgLSBLV0sgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIHN0cmluZ19ieXRlX2NvdW50LCBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KTsKLSNlbHNlIC8qIENST1NTX0NPTVBJTEUgKi8KLSAgYXBwZW5kICh3aGVyZSwgKGNoYXIgKikgJnN0cmluZ19ieXRlX2NvdW50LCAodW5zaWduZWQgbG9uZykgc2l6ZW9mIChzdHJpbmdfYnl0ZV9jb3VudCkpOwotI2VuZGlmIC8qIENST1NTX0NPTVBJTEUgKi8KLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgaWYgKFNfR0VUX05BTUUgKHN5bWJvbFApKQotCWFwcGVuZCAod2hlcmUsIFNfR0VUX05BTUUgKHN5bWJvbFApLCAodW5zaWduZWQgbG9uZykgKHN0cmxlbiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpICsgMSkpOwotICAgIH0JCQkJLyogd2FsayBzeW1ib2wgY2hhaW4gKi8KLX0KLQotLyogZW5kIG9mIG9iai1ib3V0LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWJvdXQuaCBiL2dhcy9jb25maWcvb2JqLWJvdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1MzlhMC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1ib3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyogYi5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZQotICAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBDYW1icmlkZ2UsIE1BCi0gICAwMjEzOSwgVVNBLiAqLwotCi0vKgotICogVGhpcyBmaWxlIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiAnYS5vdXQuaCcuICBJdCBpcyB0byBiZSB1c2VkIGluIGFsbCBHTlUKLSAqIHRvb2xzIG1vZGlmaWVkIHRvIHN1cHBvcnQgdGhlIGk4MDk2MCBiLm91dCBmb3JtYXQgKG9yIHRvb2xzIHRoYXQgb3BlcmF0ZSBvbgotICogb2JqZWN0IGZpbGVzIGNyZWF0ZWQgYnkgc3VjaCB0b29scykuCi0gKgotICogQWxsIGk4MDk2MCBkZXZlbG9wbWVudCBpcyBkb25lIGluIGEgQ1JPU1MtREVWRUxPUE1FTlQgZW52aXJvbm1lbnQuICBJLmUuLAotICogb2JqZWN0IGNvZGUgaXMgZ2VuZXJhdGVkIG9uLCBhbmQgZXhlY3V0ZWQgdW5kZXIgdGhlIGRpcmVjdGlvbiBvZiBhIHN5bWJvbGljCi0gKiBkZWJ1Z2dlciBydW5uaW5nIG9uLCBhIGhvc3Qgc3lzdGVtLiAgV2UgZG8gbm90IHdhbnQgdG8gYmUgc3ViamVjdCB0byB0aGUKLSAqIHZhZ2FyaWVzIG9mIHdoaWNoIGhvc3QgaXQgaXMgb3Igd2hldGhlciBpdCBzdXBwb3J0cyBDT0ZGIG9yIGEub3V0IGZvcm1hdCwgb3IKLSAqIGFueXRoaW5nIGVsc2UuICBXZSBETyB3YW50IHRvOgotICoKLSAqCW8gYWx3YXlzIGdlbmVyYXRlIHRoZSBzYW1lIGZvcm1hdCBvYmplY3QgZmlsZXMsIHJlZ2FyZGxlc3Mgb2YgaG9zdC4KLSAqCi0gKglvIGhhdmUgYW4gJ2Eub3V0JyBoZWFkZXIgdGhhdCB3ZSBjYW4gbW9kaWZ5IGZvciBvdXIgb3duIHB1cnBvc2VzCi0gKgkgICh0aGUgODA5NjAgaXMgdHlwaWNhbGx5IGFuIGVtYmVkZGVkIHByb2Nlc3NvciBhbmQgbWF5IHJlcXVpcmUKLSAqCSAgZW5oYW5jZWQgbGlua2VyIHN1cHBvcnQgdGhhdCB0aGUgbm9ybWFsIGEub3V0LmggaGVhZGVyIGNhbid0Ci0gKgkgIGFjY29tbW9kYXRlKS4KLSAqCi0gKiBBcyBmb3IgYnl0ZS1vcmRlcmluZywgdGhlIGZvbGxvd2luZyBydWxlcyBhcHBseToKLSAqCi0gKglvIFRleHQgYW5kIGRhdGEgdGhhdCBpcyBhY3R1YWxseSBkb3dubG9hZGVkIHRvIHRoZSB0YXJnZXQgaXMgYWx3YXlzCi0gKgkgIGluIGk4MDk2MCAobGl0dGxlLWVuZGlhbikgb3JkZXIuCi0gKgotICoJbyBBbGwgb3RoZXIgbnVtYmVycyAoaW4gdGhlIGhlYWRlciwgc3ltYm9scywgcmVsb2NhdGlvbiBkaXJlY3RpdmVzKQotICoJICBhcmUgaW4gaG9zdCBieXRlLW9yZGVyOiAgb2JqZWN0IGZpbGVzIENBTk5PVCBiZSBsaWZ0ZWQgZnJvbSBhCi0gKgkgIGxpdHRsZS1lbmQgaG9zdCBhbmQgdXNlZCBvbiBhIGJpZy1lbmRpYW4gKG9yIHZpY2UgdmVyc2EpIHdpdGhvdXQKLSAqCSAgbW9kaWZpY2F0aW9uLgotICogPT0+IFRISVMgSVMgTk8gTE9OR0VSIFRSVUUgVVNJTkcgQkZELiAgV0UgQ0FOIEdFTkVSQVRFIEFOWSBCWVRFIE9SREVSCi0gKiAgICAgRk9SIFRIRSBIRUFERVIsIEFORCBSRUFEIEFOWSBCWVRFIE9SREVSLiAgUFJFRkVSRU5DRSBXT1VMRCBCRSBUTwotICogICAgIFVTRSBMSVRUTEUtRU5ESUFOIEJZVEUgT1JERVIgVEhST1VHSE9VVCwgUkVHQVJETEVTUyBPRiBIT1NULiAgPD09Ci0gKgotICoJbyBUaGUgZG93bmxvYWRlciAoJ2NvbW05NjAnKSB0YWtlcyBjYXJlIHRvIGdlbmVyYXRlIGEgcHNldWRvLWhlYWRlcgotICoJICB3aXRoIGNvcnJlY3QgKGk4MDk2MCkgYnl0ZS1vcmRlcmluZyBiZWZvcmUgc2hpcHBpbmcgdGV4dCBhbmQgZGF0YQotICoJICBvZmYgdG8gdGhlIE5JTkRZIG1vbml0b3IgaW4gdGhlIHRhcmdldCBzeXN0ZW1zLiAgU3ltYm9scyBhbmQKLSAqCSAgcmVsb2NhdGlvbiBpbmZvIGFyZSBuZXZlciBzZW50IHRvIHRoZSB0YXJnZXQuCi0gKi8KLQotCi0jZGVmaW5lIE9CSl9CT1VUIDEKLQotI2RlZmluZSBPVVRQVVRfRkxBVk9SIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyCi0KLSNpbmNsdWRlICJ0YXJnLWNwdS5oIgotCi0jZGVmaW5lIE9CSl9ERUZBVUxUX09VVFBVVF9GSUxFX05BTUUJImIub3V0IgotCi1leHRlcm4gY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdOwotZXh0ZXJuIGNvbnN0IHNlZ1QgTl9UWVBFX3NlZ1tdOwotCi0jZGVmaW5lIEJNQUdJQwkwNDE1Ci0vKiBXZSBkb24ndCBhY2NlcHQgdGhlIGZvbGxvd2luZyAoc2VlIE5fQkFETUFHIG1hY3JvKS4KLSAqIFRoZXkncmUganVzdCBoZXJlIHNvIEdOVSBjb2RlIHdpbGwgY29tcGlsZS4KLSAqLwotI2RlZmluZQlPTUFHSUMJMDQwNwkJLyogb2xkIGltcHVyZSBmb3JtYXQgKi8KLSNkZWZpbmUJTk1BR0lDCTA0MTAJCS8qIHJlYWQtb25seSB0ZXh0ICovCi0jZGVmaW5lCVpNQUdJQwkwNDEzCQkvKiBkZW1hbmQgbG9hZCBmb3JtYXQgKi8KLQotI2lmbmRlZiBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUKLSNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFCShCTUFHSUMpCi0jZW5kaWYgLyogREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFICovCi0KLS8qIEZJTEUgSEVBREVSCi0gKglBbGwgJ2xlbmd0aHMnIGFyZSBnaXZlbiBhcyBhIG51bWJlciBvZiBieXRlcy4KLSAqCUFsbCAnYWxpZ25tZW50cycgYXJlIGZvciByZWxpbmthYmxlIGZpbGVzIG9ubHk7ICBhbiBhbGlnbm1lbnQgb2YKLSAqCQknbicgaW5kaWNhdGVzIHRoZSBjb3JyZXNwb25kaW5nIHNlZ21lbnQgbXVzdCBiZWdpbiBhdCBhbgotICoJCWFkZHJlc3MgdGhhdCBpcyBhIG11bHRpcGxlIG9mICgyKipuKS4KLSAqLwotc3RydWN0IGV4ZWMKLSAgewotICAgIC8qIFN0YW5kYXJkIHN0dWZmICovCi0gICAgdW5zaWduZWQgbG9uZyBhX21hZ2ljOwkvKiBJZGVudGlmaWVzIHRoaXMgYXMgYSBiLm91dCBmaWxlCSovCi0gICAgdW5zaWduZWQgbG9uZyBhX3RleHQ7CS8qIExlbmd0aCBvZiB0ZXh0CQkJKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfZGF0YTsJLyogTGVuZ3RoIG9mIGRhdGEJCQkqLwotICAgIHVuc2lnbmVkIGxvbmcgYV9ic3M7CS8qIExlbmd0aCBvZiBydW50aW1lIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhICovCi0gICAgdW5zaWduZWQgbG9uZyBhX3N5bXM7CS8qIExlbmd0aCBvZiBzeW1ib2wgdGFibGUJCSovCi0gICAgdW5zaWduZWQgbG9uZyBhX2VudHJ5OwkvKiBSdW50aW1lIHN0YXJ0IGFkZHJlc3MJCSovCi0gICAgdW5zaWduZWQgbG9uZyBhX3Ryc2l6ZTsJLyogTGVuZ3RoIG9mIHRleHQgcmVsb2NhdGlvbiBpbmZvCSovCi0gICAgdW5zaWduZWQgbG9uZyBhX2Ryc2l6ZTsJLyogTGVuZ3RoIG9mIGRhdGEgcmVsb2NhdGlvbiBpbmZvCSovCi0KLSAgICAvKiBBZGRlZCBmb3IgaTk2MCAqLwotICAgIHVuc2lnbmVkIGxvbmcgYV90bG9hZDsJLyogVGV4dCBydW50aW1lIGxvYWQgYWRkcmVzcwkJKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfZGxvYWQ7CS8qIERhdGEgcnVudGltZSBsb2FkIGFkZHJlc3MJCSovCi0gICAgdW5zaWduZWQgY2hhciBhX3RhbGlnbjsJLyogQWxpZ25tZW50IG9mIHRleHQgc2VnbWVudAkJKi8KLSAgICB1bnNpZ25lZCBjaGFyIGFfZGFsaWduOwkvKiBBbGlnbm1lbnQgb2YgZGF0YSBzZWdtZW50CQkqLwotICAgIHVuc2lnbmVkIGNoYXIgYV9iYWxpZ247CS8qIEFsaWdubWVudCBvZiBic3Mgc2VnbWVudAkJKi8KLSAgICB1bnNpZ25lZCBjaGFyIGFfcmVsYXhhYmxlOwkvKiBDb250YWlucyBlbm91Z2ggaW5mbyB0byByZWxheCAgICAgKi8KLSAgfTsKLQotI2RlZmluZSBOX0JBRE1BRyh4KQkoKCh4KS5hX21hZ2ljKSE9Qk1BR0lDKQotI2RlZmluZSBOX1RYVE9GRih4KQkoIHNpemVvZihzdHJ1Y3QgZXhlYykgKQotI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgKHgpLmFfdGV4dCApCi0jZGVmaW5lIE5fVFJPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQotI2RlZmluZSBOX0RST0ZGKHgpCSggTl9UUk9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZGVmaW5lIE5fU1lNT0ZGKHgpCSggTl9EUk9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKLQotLyogQSBzaW5nbGUgZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZQotICovCi1zdHJ1Y3Qgbmxpc3QKLSAgewotICAgIHVuaW9uCi0gICAgICB7Ci0JY2hhciAqbl9uYW1lOwotCXN0cnVjdCBubGlzdCAqbl9uZXh0OwotCWxvbmcgbl9zdHJ4OwkJLyogSW5kZXggaW50byBzdHJpbmcgdGFibGUJKi8KLSAgICAgIH0KLSAgICBuX3VuOwotICAgIHVuc2lnbmVkIGNoYXIgbl90eXBlOwkvKiBTZWUgYmVsb3cJCQkJKi8KLSAgICBjaGFyIG5fb3RoZXI7CQkvKiBVc2VkIGluIGk4MDk2MCBzdXBwb3J0IC0tIHNlZSBiZWxvdwkqLwotICAgIHNob3J0IG5fZGVzYzsKLSAgICB1bnNpZ25lZCBsb25nIG5fdmFsdWU7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IG5saXN0IG9ial9zeW1ib2xfdHlwZTsKLQotLyogTGVnYWwgdmFsdWVzIG9mIG5fdHlwZQotICovCi0jZGVmaW5lIE5fVU5ERgkwCQkvKiBVbmRlZmluZWQgc3ltYm9sCSovCi0jZGVmaW5lIE5fQUJTCTIJCS8qIEFic29sdXRlIHN5bWJvbAkqLwotI2RlZmluZSBOX1RFWFQJNAkJLyogVGV4dCBzeW1ib2wJCSovCi0jZGVmaW5lIE5fREFUQQk2CQkvKiBEYXRhIHN5bWJvbAkJKi8KLSNkZWZpbmUgTl9CU1MJOAkJLyogQlNTIHN5bWJvbAkJKi8KLSNkZWZpbmUgTl9GTgkzMQkJLyogRmlsZW5hbWUgc3ltYm9sCSovCi0KLSNkZWZpbmUgTl9FWFQJMQkJLyogRXh0ZXJuYWwgc3ltYm9sIChPUidkIGluIHdpdGggb25lIG9mIGFib3ZlKQkqLwotI2RlZmluZSBOX1RZUEUJMDM2CQkvKiBNYXNrIGZvciBhbGwgdGhlIHR5cGUgYml0cwkJCSovCi0jZGVmaW5lIE5fU1RBQgkwMzQwCQkvKiBNYXNrIGZvciBhbGwgYml0cyB1c2VkIGZvciBTREIgZW50cmllcyAJKi8KLQotI2lmbmRlZiBDVVNUT01fUkVMT0NfRk9STUFUCi1zdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvCi0gIHsKLSAgICBpbnQgcl9hZGRyZXNzOwkJLyogRmlsZSBhZGRyZXNzIG9mIGl0ZW0gdG8gYmUgcmVsb2NhdGVkCSovCi0gICAgdW5zaWduZWQKLSAgICAgIHJfaW5kZXg6MjQsCQkvKiBJbmRleCBvZiBzeW1ib2wgb24gd2hpY2ggcmVsb2NhdGlvbiBpcyBiYXNlZCovCi0gICAgICByX3BjcmVsOjEsCQkvKiAxID0+IHJlbG9jYXRlIFBDLXJlbGF0aXZlOyBlbHNlIGFic29sdXRlCi0JCSAqCU9uIGk5NjAsIHBjLXJlbGF0aXZlIGltcGxpZXMgMjQtYml0Ci0JCSAqCWFkZHJlc3MsIGFic29sdXRlIGltcGxpZXMgMzItYml0LgotCQkgKi8KLSAgICAgIHJfbGVuZ3RoOjIsCQkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVsb2NhdGU6Ci0JCSAqCTAgPT4gMSBieXRlCi0JCSAqCTEgPT4gMiBieXRlcwotCQkgKgkyID0+IDQgYnl0ZXMgLS0gb25seSB2YWx1ZSB1c2VkIGZvciBpOTYwCi0JCSAqLwotICAgICAgcl9leHRlcm46MSwgcl9ic3I6MSwJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLwotICAgICAgcl9kaXNwOjEsCQkJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLwotICAgICAgcl9jYWxsajoxLAkJLyogMSBpZiByZWxvY2F0aW9uIHRhcmdldCBpcyBhbiBpOTYwICdjYWxsaicgKi8KLSAgICAgIG51dGhpbjoxOwkJCS8qIFVudXNlZAkJCQkqLwotICB9OwotCi0jZW5kaWYgLyogQ1VTVE9NX1JFTE9DX0ZPUk1BVCAqLwotCi0vKgotICogIE1hY3JvcyB0byBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gYSBzeW1ib2wgdGFibGUgZW50cnkuCi0gKiAgVGhpcyBzeW50YXhpYyBpbmRpcmVjdGlvbiBhbGxvd3MgaW5kZXBlbmRlbmNlIHJlZ2FyZGluZyBhLm91dCBvciBjb2ZmLgotICogIFRoZSBhcmd1bWVudCAocykgb2YgYWxsIHRoZXNlIG1hY3JvcyBpcyBhIHBvaW50ZXIgdG8gYSBzeW1ib2wgdGFibGUgZW50cnkuCi0gKi8KLQotLyogUHJlZGljYXRlcyAqLwotLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGlzIGV4dGVybmFsICovCi0jZGVmaW5lIFNfSVNfRVhURVJOQUwocykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fRVhUKQotCi0vKiBUcnVlIGlmIHN5bWJvbCBoYXMgYmVlbiBkZWZpbmVkLCBpZSBpcyBpbiBOX3tURVhULERBVEEsQlNTLEFCU30gb3IgTl9FWFQgKi8KLSNkZWZpbmUgU19JU19ERUZJTkVEKHMpCQkoKFNfR0VUX1RZUEUocykgIT0gTl9VTkRGKSB8fCAoU19HRVRfREVTQyhzKSAhPSAwKSkKLQotI2RlZmluZSBTX0lTX0NPTU1PTihzKSBcCi0gIChTX0dFVF9UWVBFIChzKSA9PSBOX1VOREYgJiYgU19HRVRfVkFMVUUgKHMpICE9IDApCi0KLSNkZWZpbmUgU19JU19SRUdJU1RFUihzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlID09IE5fUkVHSVNURVIpCi0KLS8qIFRydWUgaWYgYSBkZWJ1ZyBzcGVjaWFsIHN5bWJvbCBlbnRyeSAqLwotI2RlZmluZSBTX0lTX0RFQlVHKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9TVEFCKQotLyogVHJ1ZSBpZiBhIHN5bWJvbCBpcyBsb2NhbCBzeW1ib2wgbmFtZSAqLwotI2RlZmluZSBTX0lTX0xPQ0FMKHMpIAkJCQkJXAotICAoKFNfR0VUX05BTUUgKHMpIAkJCQkJXAotICAgICYmICFTX0lTX0RFQlVHIChzKSAJCQkJCVwKLSAgICAmJiAoc3RyY2hyIChTX0dFVF9OQU1FIChzKSwgJ1wwMDEnKSAhPSBOVUxMCQlcCi0gICAgICAgIHx8IHN0cmNociAoU19HRVRfTkFNRSAocyksICdcMDAyJykgIT0gTlVMTAlcCi0gICAgICAgIHx8IChTX0xPQ0FMX05BTUUocykgJiYgIWZsYWdfa2VlcF9sb2NhbHMpKSkJXAotICAgfHwgKGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGUJCQlcCi0gICAgICAgJiYgIVNfSVNfRVhURVJOQUwocykJCQkJXAotICAgICAgICYmIFNfR0VUX1NFR01FTlQocykgPT0gYWJzb2x1dGVfc2VjdGlvbikpCi0vKiBUcnVlIGlmIGEgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgZmlsZSAqLwotI2RlZmluZSBTX0lTX0VYVEVSTihzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fRVhUKQotLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGhhcyBiZWVuIGdlbmVyYXRlZCBiZWNhdXNlIG9mIGEgLnN0YWJkIGRpcmVjdGl2ZSAqLwotI2RlZmluZSBTX0lTX1NUQUJEKHMpCQkoU19HRVRfTkFNRShzKSA9PSBOVUxMKQotCi0vKiBBY2Nlc3NvcnMgKi8KLS8qIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19HRVRfTkFNRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fdW4ubl9uYW1lKQotLyogVGhlIHBvaW50ZXIgdG8gdGhlIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTX0dFVF9PRkZTRVQocykJCSgocyktPnN5X3N5bWJvbC5uX3VuLm5fc3RyeCkKLS8qIFRoZSB0eXBlIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19HRVRfVFlQRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fVFlQRSkKLS8qIFRoZSBudW1lcmljIHZhbHVlIG9mIHRoZSBzZWdtZW50ICovCi0jZGVmaW5lIFNfR0VUX1NFR01FTlQocykJKE5fVFlQRV9zZWdbU19HRVRfVFlQRShzKV0pCi0vKiBUaGUgbl9vdGhlciBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfR0VUX09USEVSKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9vdGhlcikKLS8qIFRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX0dFVF9ERVNDKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9kZXNjKQotCi0vKiBNb2RpZmllcnMgKi8KLS8qIEFzc3VtZSB0aGF0IGEgc3ltYm9sIGNhbm5vdCBiZSBzaW11bHRhbmVvdXNseSBpbiBtb3JlIHRoYW4gb24gc2VnbWVudCAqLwotLyogc2V0IHNlZ21lbnQgKi8KLSNkZWZpbmUgU19TRVRfU0VHTUVOVChzLHNlZykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmPSB+Tl9UWVBFLChzKS0+c3lfc3ltYm9sLm5fdHlwZXw9U0VHTUVOVF9UT19TWU1CT0xfVFlQRShzZWcpKQotLyogVGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX1NFVF9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlIHw9IE5fRVhUKQotLyogVGhlIHN5bWJvbCBpcyBub3QgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19DTEVBUl9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICY9IH5OX0VYVCkKLS8qIFNldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfU0VUX05BTUUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fdW4ubl9uYW1lID0gKHYpKQotLyogU2V0IHRoZSBvZmZzZXQgaW4gdGhlIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTX1NFVF9PRkZTRVQocyx2KQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX3N0cnggPSAodikpCi0vKiBTZXQgdGhlIG5fb3RoZXIgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9PVEhFUihzLHYpCSgocyktPnN5X3N5bWJvbC5uX290aGVyID0gKHYpKQotLyogU2V0IHRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9ERVNDKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX2Rlc2MgPSAodikpCi0vKiBTZXQgdGhlIG5fdHlwZSB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9UWVBFKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgPSAodikpCi0KLS8qIEZpbGUgaGVhZGVyIG1hY3JvIGFuZCB0eXBlIGRlZmluaXRpb24gKi8KLQotI2RlZmluZSBIX0dFVF9GSUxFX1NJWkUoaCkJKHNpemVvZihzdHJ1Y3QgZXhlYykgKyBcCi0JCQkJIEhfR0VUX1RFWFRfU0laRShoKSArIEhfR0VUX0RBVEFfU0laRShoKSArIFwKLQkJCQkgSF9HRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCkgKyBcCi0JCQkJIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgpICsgXAotCQkJCSBIX0dFVF9EQVRBX1JFTE9DQVRJT05fU0laRShoKSArIFwKLQkJCQkgKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSkKLQotI2RlZmluZSBIX0dFVF9IRUFERVJfU0laRShoKQkJKHNpemVvZihzdHJ1Y3QgZXhlYykpCi0jZGVmaW5lIEhfR0VUX1RFWFRfU0laRShoKQkJKChoKS0+aGVhZGVyLmFfdGV4dCkKLSNkZWZpbmUgSF9HRVRfREFUQV9TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV9kYXRhKQotI2RlZmluZSBIX0dFVF9CU1NfU0laRShoKQkJKChoKS0+aGVhZGVyLmFfYnNzKQotI2RlZmluZSBIX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRShoKQkoKGgpLT5oZWFkZXIuYV90cnNpemUpCi0jZGVmaW5lIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKGgpCSgoaCktPmhlYWRlci5hX2Ryc2l6ZSkKLSNkZWZpbmUgSF9HRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCkJKChoKS0+aGVhZGVyLmFfc3ltcykKLSNkZWZpbmUgSF9HRVRfTUFHSUNfTlVNQkVSKGgpCQkoKGgpLT5oZWFkZXIuYV9pbmZvKQotI2RlZmluZSBIX0dFVF9FTlRSWV9QT0lOVChoKQkJKChoKS0+aGVhZGVyLmFfZW50cnkpCi0jZGVmaW5lIEhfR0VUX1NUUklOR19TSVpFKGgpCQkoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSkKLSNkZWZpbmUgSF9HRVRfTElORU5PX1NJWkUoaCkJCSgwKQotCi0jaWZkZWYgRVhFQ19NQUNISU5FX1RZUEUKLSNkZWZpbmUgSF9HRVRfTUFDSElORV9UWVBFKGgpCQkoKGgpLT5oZWFkZXIuYV9tYWNodHlwZSkKLSNlbmRpZiAvKiBFWEVDX01BQ0hJTkVfVFlQRSAqLwotI2lmZGVmIEVYRUNfVkVSU0lPTgotI2RlZmluZSBIX0dFVF9WRVJTSU9OKGgpCQkoKGgpLT5oZWFkZXIuYV92ZXJzaW9uKQotI2VuZGlmIC8qIEVYRUNfVkVSU0lPTiAqLwotCi0jZGVmaW5lIEhfU0VUX1RFWFRfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV90ZXh0ID0gKHYpKQotI2RlZmluZSBIX1NFVF9EQVRBX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfZGF0YSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfQlNTX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfYnNzID0gKHYpKQotCi0jZGVmaW5lIEhfU0VUX1JFTE9DQVRJT05fU0laRShoLHQsZCkJKEhfU0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKChoKSwodCkpLFwKLQkJCQkJIEhfU0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKChoKSwoZCkpKQotCi0jZGVmaW5lIEhfU0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgsdikJKChoKS0+aGVhZGVyLmFfdHJzaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9EQVRBX1JFTE9DQVRJT05fU0laRShoLHYpCSgoaCktPmhlYWRlci5hX2Ryc2l6ZSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCx2KQkoKGgpLT5oZWFkZXIuYV9zeW1zID0gKHYpICogXAotCQkJCQkgc2l6ZW9mKHN0cnVjdCBubGlzdCkpCi0KLSNkZWZpbmUgSF9TRVRfTUFHSUNfTlVNQkVSKGgsdikJCSgoaCktPmhlYWRlci5hX21hZ2ljID0gKHYpKQotCi0jZGVmaW5lIEhfU0VUX0VOVFJZX1BPSU5UKGgsdikJCSgoaCktPmhlYWRlci5hX2VudHJ5ID0gKHYpKQotI2RlZmluZSBIX1NFVF9TVFJJTkdfU0laRShoLHYpCQkoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSA9ICh2KSkKLSNpZmRlZiBFWEVDX01BQ0hJTkVfVFlQRQotI2RlZmluZSBIX1NFVF9NQUNISU5FX1RZUEUoaCx2KQkJKChoKS0+aGVhZGVyLmFfbWFjaHR5cGUgPSAodikpCi0jZW5kaWYgLyogRVhFQ19NQUNISU5FX1RZUEUgKi8KLSNpZmRlZiBFWEVDX1ZFUlNJT04KLSNkZWZpbmUgSF9TRVRfVkVSU0lPTihoLHYpCQkoKGgpLT5oZWFkZXIuYV92ZXJzaW9uID0gKHYpKQotI2VuZGlmIC8qIEVYRUNfVkVSU0lPTiAqLwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgc3RydWN0IGV4ZWMgaGVhZGVyOwkJLyogYS5vdXQgaGVhZGVyICovCi0gICAgbG9uZyBzdHJpbmdfdGFibGVfc2l6ZTsJLyogbmFtZXMgKyAnXDAnICsgc2l6ZW9mKGludCkgKi8KLSAgfQotCi1vYmplY3RfaGVhZGVyczsKLQotLyogdW51c2VkIGhvb2tzLiAqLwotI2RlZmluZSBPQkpfRU1JVF9MSU5FTk8oYSwgYiwgYykJezt9Ci0jZGVmaW5lIG9ial9wcmVfd3JpdGVfaG9vayhhKQkJezt9Ci0KLSNpZiBfX1NURENfXwotc3RydWN0IGZpeDsKLSNlbmRpZgotZXh0ZXJuIHZvaWQgdGNfYW91dF9maXhfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqd2hlcmUsCi0JCQkJCSAgc3RydWN0IGZpeCAqZml4UCwKLQkJCQkJICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3MpKTsKLWV4dGVybiB2b2lkIHRjX2JvdXRfZml4X3RvX2NoYXJzIFBBUkFNUyAoKGNoYXIgKndoZXJlLAotCQkJCQkgIHN0cnVjdCBmaXggKmZpeFAsCi0JCQkJCSAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzKSk7Ci0KLSNkZWZpbmUgQU9VVF9TVEFCUwotCi0vKiBlbmQgb2Ygb2JqLWJvdXQuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotY29mZi5jIGIvZ2FzL2NvbmZpZy9vYmotY29mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGUzZGY5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ODEgKzAsMCBAQAotLyogY29mZiBvYmplY3QgZmlsZSBmb3JtYXQKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIE9CSl9IRUFERVIgIm9iai1jb2ZmLmgiCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLS8qIEkgdGhpbmsgdGhpcyBpcyBwcm9iYWJseSBhbHdheXMgY29ycmVjdC4gICovCi0jaWZuZGVmIEtFRVBfUkVMT0NfSU5GTwotI2RlZmluZSBLRUVQX1JFTE9DX0lORk8KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBvYmpfY29mZl9ic3MgUEFSQU1TICgoaW50KSk7Ci1jb25zdCBjaGFyICpzX2dldF9uYW1lIFBBUkFNUyAoKHN5bWJvbFMgKiBzKSk7Ci1zdGF0aWMgc3ltYm9sUyAqZGVmX3N5bWJvbF9pbl9wcm9ncmVzczsKLQotDAotLyogc3RhY2sgc3R1ZmYgKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBsb25nIGNodW5rX3NpemU7Ci0gICAgdW5zaWduZWQgbG9uZyBlbGVtZW50X3NpemU7Ci0gICAgdW5zaWduZWQgbG9uZyBzaXplOwotICAgIGNoYXIgKmRhdGE7Ci0gICAgdW5zaWduZWQgbG9uZyBwb2ludGVyOwotICB9Ci1zdGFjazsKLQotc3RhdGljIHN0YWNrICoKLXN0YWNrX2luaXQgKGNodW5rX3NpemUsIGVsZW1lbnRfc2l6ZSkKLSAgICAgdW5zaWduZWQgbG9uZyBjaHVua19zaXplOwotICAgICB1bnNpZ25lZCBsb25nIGVsZW1lbnRfc2l6ZTsKLXsKLSAgc3RhY2sgKnN0OwotCi0gIHN0ID0gKHN0YWNrICopIG1hbGxvYyAoc2l6ZW9mIChzdGFjaykpOwotICBpZiAoIXN0KQotICAgIHJldHVybiAwOwotICBzdC0+ZGF0YSA9IG1hbGxvYyAoY2h1bmtfc2l6ZSk7Ci0gIGlmICghc3QtPmRhdGEpCi0gICAgewotICAgICAgZnJlZSAoc3QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBzdC0+cG9pbnRlciA9IDA7Ci0gIHN0LT5zaXplID0gY2h1bmtfc2l6ZTsKLSAgc3QtPmNodW5rX3NpemUgPSBjaHVua19zaXplOwotICBzdC0+ZWxlbWVudF9zaXplID0gZWxlbWVudF9zaXplOwotICByZXR1cm4gc3Q7Ci19Ci0KLSNpZiAwCi0vKiBOb3QgY3VycmVudGx5IHVzZWQuICAqLwotc3RhdGljIHZvaWQKLXN0YWNrX2RlbGV0ZSAoc3QpCi0gICAgIHN0YWNrICpzdDsKLXsKLSAgZnJlZSAoc3QtPmRhdGEpOwotICBmcmVlIChzdCk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGNoYXIgKgotc3RhY2tfcHVzaCAoc3QsIGVsZW1lbnQpCi0gICAgIHN0YWNrICpzdDsKLSAgICAgY2hhciAqZWxlbWVudDsKLXsKLSAgaWYgKHN0LT5wb2ludGVyICsgc3QtPmVsZW1lbnRfc2l6ZSA+PSBzdC0+c2l6ZSkKLSAgICB7Ci0gICAgICBzdC0+c2l6ZSArPSBzdC0+Y2h1bmtfc2l6ZTsKLSAgICAgIGlmICgoc3QtPmRhdGEgPSB4cmVhbGxvYyAoc3QtPmRhdGEsIHN0LT5zaXplKSkgPT0gKGNoYXIgKikgMCkKLQlyZXR1cm4gKGNoYXIgKikgMDsKLSAgICB9Ci0gIG1lbWNweSAoc3QtPmRhdGEgKyBzdC0+cG9pbnRlciwgZWxlbWVudCwgc3QtPmVsZW1lbnRfc2l6ZSk7Ci0gIHN0LT5wb2ludGVyICs9IHN0LT5lbGVtZW50X3NpemU7Ci0gIHJldHVybiBzdC0+ZGF0YSArIHN0LT5wb2ludGVyOwotfQotCi1zdGF0aWMgY2hhciAqCi1zdGFja19wb3AgKHN0KQotICAgICBzdGFjayAqc3Q7Ci17Ci0gIGlmIChzdC0+cG9pbnRlciA8IHN0LT5lbGVtZW50X3NpemUpCi0gICAgewotICAgICAgc3QtPnBvaW50ZXIgPSAwOwotICAgICAgcmV0dXJuIChjaGFyICopIDA7Ci0gICAgfQotICBzdC0+cG9pbnRlciAtPSBzdC0+ZWxlbWVudF9zaXplOwotICByZXR1cm4gc3QtPmRhdGEgKyBzdC0+cG9pbnRlcjsKLX0KLQwKLS8qCi0gKiBNYWludGFpbiBhIGxpc3Qgb2YgdGhlIHRhZ25hbWVzIG9mIHRoZSBzdHJ1Y3RyZXMuCi0gKi8KLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnRhZ19oYXNoOwotCi1zdGF0aWMgdm9pZAotdGFnX2luaXQgKCkKLXsKLSAgdGFnX2hhc2ggPSBoYXNoX25ldyAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXRhZ19pbnNlcnQgKG5hbWUsIHN5bWJvbFApCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIGNvbnN0IGNoYXIgKmVycm9yX3N0cmluZzsKLQotICBpZiAoKGVycm9yX3N0cmluZyA9IGhhc2hfamFtICh0YWdfaGFzaCwgbmFtZSwgKGNoYXIgKikgc3ltYm9sUCkpKQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCJJbnNlcnRpbmcgXCIlc1wiIGludG8gc3RydWN0dXJlIHRhYmxlIGZhaWxlZDogJXMiKSwKLQkJbmFtZSwgZXJyb3Jfc3RyaW5nKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBzeW1ib2xTICoKLXRhZ19maW5kIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotI2lmZGVmIFNUUklQX1VOREVSU0NPUkUKLSAgaWYgKCpuYW1lID09ICdfJykKLSAgICBuYW1lKys7Ci0jZW5kaWYgLyogU1RSSVBfVU5ERVJTQ09SRSAqLwotICByZXR1cm4gKHN5bWJvbFMgKikgaGFzaF9maW5kICh0YWdfaGFzaCwgbmFtZSk7Ci19Ci0KLXN0YXRpYyBzeW1ib2xTICoKLXRhZ19maW5kX29yX21ha2UgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgaWYgKChzeW1ib2xQID0gdGFnX2ZpbmQgKG5hbWUpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwKLQkJCSAgICAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gICAgICB0YWdfaW5zZXJ0IChTX0dFVF9OQU1FIChzeW1ib2xQKSwgc3ltYm9sUCk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCk7Ci0jZW5kaWYKLSAgICB9CQkJCS8qIG5vdCBmb3VuZCAqLwotCi0gIHJldHVybiBzeW1ib2xQOwotfQotCi0vKiBXZSBhY2NlcHQgdGhlIC5ic3MgZGlyZWN0aXZlIHRvIHNldCB0aGUgc2VjdGlvbiBmb3IgYmFja3dhcmQKLSAgIGNvbXBhdGliaWxpdHkgd2l0aCBlYXJsaWVyIHZlcnNpb25zIG9mIGdhcy4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9ic3MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLSAgICBzdWJzZWdfbmV3ICgiLmJzcyIsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgZWxzZQotICAgIHNfbGNvbW0gKDApOwotfQotCi0vKiBIYW5kbGUgLndlYWsuICBUaGlzIGlzIGEgR05VIGV4dGVuc2lvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl93ZWFrIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjOwotICBzeW1ib2xTICpzeW1ib2xQOwotIAotICBkbwotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotI2lmZGVmIEJGRF9BU1NFTUxFUgotICAgICAgU19TRVRfV0VBSyAoc3ltYm9sUCk7Ci0jZW5kaWYKLQotI2lmZGVmIFRFX1BFCi0gICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX05UX1dFQUspOwotI2Vsc2UKLSAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfV0VBS0VYVCk7Ci0jZW5kaWYKLQotICAgICAgaWYgKGMgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLQkgICAgYyA9ICdcbic7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGMgPT0gJywnKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi1zdGF0aWMgdm9pZCBTQV9TRVRfU1lNX1RBR05EWCBQQVJBTVMgKChzeW1ib2xTICosIHN5bWJvbFMgKikpOwotCi0jZGVmaW5lIEdFVF9GSUxFTkFNRV9TVFJJTkcoWCkgXAotKChjaGFyKikoJigoWCktPnN5X3N5bWJvbC5vc3RfYXV4ZW50LT54X2ZpbGUueF9uLnhfb2Zmc2V0KSlbMV0pCi0KLS8qIEBAIEljay4gICovCi1zdGF0aWMgc2VnVAotZmV0Y2hfY29mZl9kZWJ1Z19zZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBzZWdUIGRlYnVnX3NlY3Rpb247Ci0gIGlmICghZGVidWdfc2VjdGlvbikKLSAgICB7Ci0gICAgICBDT05TVCBhc3ltYm9sICpzOwotICAgICAgcyA9IGJmZF9tYWtlX2RlYnVnX3N5bWJvbCAoc3Rkb3V0cHV0LCAoY2hhciAqKSAwLCAwKTsKLSAgICAgIGFzc2VydCAocyAhPSAwKTsKLSAgICAgIGRlYnVnX3NlY3Rpb24gPSBzLT5zZWN0aW9uOwotICAgIH0KLSAgcmV0dXJuIGRlYnVnX3NlY3Rpb247Ci19Ci0KLXZvaWQKLVNBX1NFVF9TWU1fRU5ETkRYIChzeW0sIHZhbCkKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBzeW1ib2xTICp2YWw7Ci17Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmVudHJ5LCAqcDsKLQotICBlbnRyeSA9ICZjb2Zmc3ltYm9sIChzeW0tPmJzeW0pLT5uYXRpdmVbMV07Ci0gIHAgPSBjb2Zmc3ltYm9sICh2YWwtPmJzeW0pLT5uYXRpdmU7Ci0gIGVudHJ5LT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5wID0gcDsKLSAgZW50cnktPmZpeF9lbmQgPSAxOwotfQotCi1zdGF0aWMgdm9pZAotU0FfU0VUX1NZTV9UQUdORFggKHN5bSwgdmFsKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIHN5bWJvbFMgKnZhbDsKLXsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqZW50cnksICpwOwotCi0gIGVudHJ5ID0gJmNvZmZzeW1ib2wgKHN5bS0+YnN5bSktPm5hdGl2ZVsxXTsKLSAgcCA9IGNvZmZzeW1ib2wgKHZhbC0+YnN5bSktPm5hdGl2ZTsKLSAgZW50cnktPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LnAgPSBwOwotICBlbnRyeS0+Zml4X3RhZyA9IDE7Ci19Ci0KLXN0YXRpYyBpbnQKLVNfR0VUX0RBVEFfVFlQRSAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHJldHVybiBjb2Zmc3ltYm9sIChzeW0tPmJzeW0pLT5uYXRpdmUtPnUuc3ltZW50Lm5fdHlwZTsKLX0KLQotaW50Ci1TX1NFVF9EQVRBX1RZUEUgKHN5bSwgdmFsKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIGludCB2YWw7Ci17Ci0gIGNvZmZzeW1ib2wgKHN5bS0+YnN5bSktPm5hdGl2ZS0+dS5zeW1lbnQubl90eXBlID0gdmFsOwotICByZXR1cm4gdmFsOwotfQotCi1pbnQKLVNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICByZXR1cm4gY29mZnN5bWJvbCAoc3ltLT5ic3ltKS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzczsKLX0KLQotaW50Ci1TX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIHZhbCkKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBpbnQgdmFsOwotewotICBjb2Zmc3ltYm9sIChzeW0tPmJzeW0pLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gdmFsOwotICByZXR1cm4gdmFsOwotfQotCi0vKiBNZXJnZSBhIGRlYnVnIHN5bWJvbCBjb250YWluaW5nIGRlYnVnIGluZm9ybWF0aW9uIGludG8gYSBub3JtYWwgc3ltYm9sLiAqLwotCi12b2lkCi1jX3N5bWJvbF9tZXJnZSAoZGVidWcsIG5vcm1hbCkKLSAgICAgc3ltYm9sUyAqZGVidWc7Ci0gICAgIHN5bWJvbFMgKm5vcm1hbDsKLXsKLSAgU19TRVRfREFUQV9UWVBFIChub3JtYWwsIFNfR0VUX0RBVEFfVFlQRSAoZGVidWcpKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAobm9ybWFsLCBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWJ1ZykpOwotCi0gIGlmIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykgPiBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChub3JtYWwpKQotICAgIHsKLSAgICAgIC8qIHRha2UgdGhlIG1vc3Qgd2UgaGF2ZSAqLwotICAgICAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAobm9ybWFsLCBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykpOwotICAgIH0KLQotICBpZiAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVidWcpID4gMCkKLSAgICB7Ci0gICAgICAvKiBNb3ZlIGFsbCB0aGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIG1lbWNweSAoU1lNX0FVWElORk8gKG5vcm1hbCksIFNZTV9BVVhJTkZPIChkZWJ1ZyksCi0JICAgICAgKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKQotCSAgICAgICAqIHNpemVvZiAoKlNZTV9BVVhJTkZPIChkZWJ1ZykpKSk7Ci0gICAgfQotCi0gIC8qIE1vdmUgdGhlIGRlYnVnIGZsYWdzLiAqLwotICBTRl9TRVRfREVCVUdfRklFTEQgKG5vcm1hbCwgU0ZfR0VUX0RFQlVHX0ZJRUxEIChkZWJ1ZykpOwotfQotCi12b2lkCi1jX2RvdF9maWxlX3N5bWJvbCAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChmaWxlbmFtZSwgYmZkX2Fic19zZWN0aW9uX3B0ciwgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX0ZJTEUpOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAxKTsKLQotICBzeW1ib2xQLT5ic3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICB7Ci0gICAgZXh0ZXJuIGludCBsaXN0aW5nOwotICAgIGlmIChsaXN0aW5nKQotICAgICAgewotCWxpc3Rpbmdfc291cmNlX2ZpbGUgKGZpbGVuYW1lKTsKLSAgICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHN5bWJvbCBpcyBmaXJzdCBvbiB0aGUgc3ltYm9sIGNoYWluICovCi0gIGlmIChzeW1ib2xfcm9vdFAgIT0gc3ltYm9sUCkKLSAgICB7Ci0gICAgICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIHN5bWJvbF9pbnNlcnQgKHN5bWJvbFAsIHN5bWJvbF9yb290UCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgfQkJCQkvKiBpZiBub3QgZmlyc3Qgb24gdGhlIGxpc3QgKi8KLX0KLQotLyogTGluZSBudW1iZXIgaGFuZGxpbmcgKi8KLQotc3RydWN0IGxpbmVfbm8gewotICBzdHJ1Y3QgbGluZV9ubyAqbmV4dDsKLSAgZnJhZ1MgKmZyYWc7Ci0gIGFsZW50IGw7Ci19OwotCi1pbnQgY29mZl9saW5lX2Jhc2U7Ci0KLS8qIFN5bWJvbCBvZiBsYXN0IGZ1bmN0aW9uLCB3aGljaCB3ZSBzaG91bGQgaGFuZyBsaW5lI3Mgb2ZmIG9mLiAgKi8KLXN0YXRpYyBzeW1ib2xTICpsaW5lX2ZzeW07Ci0KLSNkZWZpbmUgaW5fZnVuY3Rpb24oKQkJKGxpbmVfZnN5bSAhPSAwKQotI2RlZmluZSBjbGVhcl9mdW5jdGlvbigpCShsaW5lX2ZzeW0gPSAwKQotI2RlZmluZSBzZXRfZnVuY3Rpb24oRikJCShsaW5lX2ZzeW0gPSAoRiksIGNvZmZfYWRkX2xpbmVzeW0gKEYpKQotCi0MCi12b2lkCi1jb2ZmX29ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIGxvbmcgICBzeiA9IChPQkpfQ09GRl9NQVhfQVVYRU5UUklFUyArIDEpICogc2l6ZW9mIChjb21iaW5lZF9lbnRyeV90eXBlKTsKLSAgY2hhciAqIHMgID0gKGNoYXIgKikgeG1hbGxvYyAoc3opOwotICAKLSAgbWVtc2V0IChzLCAwLCBzeik7Ci0gIGNvZmZzeW1ib2wgKHN5bWJvbFAtPmJzeW0pLT5uYXRpdmUgPSAoY29tYmluZWRfZW50cnlfdHlwZSAqKSBzOwotCi0gIFNfU0VUX0RBVEFfVFlQRSAoc3ltYm9sUCwgVF9OVUxMKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgMCk7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDApOwotCi0gIGlmIChTX0lTX1NUUklORyAoc3ltYm9sUCkpCi0gICAgU0ZfU0VUX1NUUklORyAoc3ltYm9sUCk7Ci0gIAotICBpZiAoU19JU19MT0NBTCAoc3ltYm9sUCkpCi0gICAgU0ZfU0VUX0xPQ0FMIChzeW1ib2xQKTsKLX0KLQotDAotLyoKLSAqIEhhbmRsZSAubG4gZGlyZWN0aXZlcy4KLSAqLwotCi1zdGF0aWMgc3ltYm9sUyAqY3VycmVudF9saW5lbm9fc3ltOwotc3RhdGljIHN0cnVjdCBsaW5lX25vICpsaW5lX25vczsKLS8qIEBAIEJsaW5kbHkgYXNzdW1lIGFsbCAubG4gZGlyZWN0aXZlcyB3aWxsIGJlIGluIHRoZSAudGV4dCBzZWN0aW9uLi4uICAqLwotaW50IGNvZmZfbl9saW5lX25vczsKLQotc3RhdGljIHZvaWQKLWFkZF9saW5lbm8gKGZyYWcsIG9mZnNldCwgbnVtKQotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgaW50IG9mZnNldDsKLSAgICAgaW50IG51bTsKLXsKLSAgc3RydWN0IGxpbmVfbm8gKm5ld19saW5lID0KLSAgICAoc3RydWN0IGxpbmVfbm8gKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbGluZV9ubykpOwotICBpZiAoIWN1cnJlbnRfbGluZW5vX3N5bSkKLSAgICB7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIG5ld19saW5lLT5uZXh0ID0gbGluZV9ub3M7Ci0gIG5ld19saW5lLT5mcmFnID0gZnJhZzsKLSAgbmV3X2xpbmUtPmwubGluZV9udW1iZXIgPSBudW07Ci0gIG5ld19saW5lLT5sLnUub2Zmc2V0ID0gb2Zmc2V0OwotICBsaW5lX25vcyA9IG5ld19saW5lOwotICBjb2ZmX25fbGluZV9ub3MrKzsKLX0KLQotdm9pZAotY29mZl9hZGRfbGluZXN5bSAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIGlmIChsaW5lX25vcykKLSAgICB7Ci0gICAgICBjb2Zmc3ltYm9sIChjdXJyZW50X2xpbmVub19zeW0tPmJzeW0pLT5saW5lbm8gPSAoYWxlbnQgKikgbGluZV9ub3M7Ci0gICAgICBjb2ZmX25fbGluZV9ub3MrKzsKLSAgICAgIGxpbmVfbm9zID0gMDsKLSAgICB9Ci0gIGN1cnJlbnRfbGluZW5vX3N5bSA9IHN5bTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2xuIChhcHBsaW5lKQotICAgICBpbnQgYXBwbGluZTsKLXsKLSAgaW50IGw7Ci0KLSAgaWYgKCEgYXBwbGluZSAmJiBkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmxuIHBzZXVkby1vcCBpbnNpZGUgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoIWFwcGxpbmUpCi0gICAgewotICAgICAgYWRkX2xpbmVubyAoZnJhZ19ub3csIGZyYWdfbm93X2ZpeCAoKSwgbCk7Ci0gICAgfQotCi0gIGlmIChhcHBsaW5lKQotICAgIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIGwgLSAxKTsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIHsKLSAgICBleHRlcm4gaW50IGxpc3Rpbmc7Ci0KLSAgICBpZiAobGlzdGluZykKLSAgICAgIHsKLQlpZiAoISBhcHBsaW5lKQotCSAgbCArPSBjb2ZmX2xpbmVfYmFzZSAtIDE7Ci0JbGlzdGluZ19zb3VyY2VfbGluZSAobCk7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qCi0gKgkJCWRlZigpCi0gKgotICogSGFuZGxlIC5kZWYgZGlyZWN0aXZlcy4KLSAqCi0gKiBPbmUgbWlnaHQgYXNrIDogd2h5IGNhbid0IHdlIHN5bWJvbF9uZXcgaWYgdGhlIHN5bWJvbCBkb2VzIG5vdAotICogYWxyZWFkeSBleGlzdCBhbmQgZmlsbCBpdCB3aXRoIGRlYnVnIGluZm9ybWF0aW9uLiAgQmVjYXVzZSBvZgotICogdGhlIENfRUZDTiBzcGVjaWFsIHN5bWJvbC4gSXQgd291bGQgY2xvYmJlciB0aGUgdmFsdWUgb2YgdGhlCi0gKiBmdW5jdGlvbiBzeW1ib2wgYmVmb3JlIHdlIGhhdmUgYSBjaGFuY2UgdG8gbm90aWNlIHRoYXQgaXQgaXMKLSAqIGEgQ19FRkNOLiBBbmQgYSBzZWNvbmQgcmVhc29uIGlzIHRoYXQgdGhlIGNvZGUgaXMgbW9yZSBjbGVhciB0aGlzCi0gKiB3YXkuIChhdCBsZWFzdCBJIHRoaW5rIGl0IGlzIDotKS4KLSAqCi0gKi8KLQotI2RlZmluZSBTS0lQX1NFTUlfQ09MT04oKQl3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICc7JykKLSNkZWZpbmUgU0tJUF9XSElURVNQQUNFUygpCXdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcgJyB8fCBcCi0JCQkJICAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1x0JykgXAotICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfZGVmICh3aGF0KQotICAgICBpbnQgd2hhdDsKLXsKLSAgY2hhciBuYW1lX2VuZDsJCS8qIENoYXIgYWZ0ZXIgdGhlIGVuZCBvZiBuYW1lICovCi0gIGNoYXIgKnN5bWJvbF9uYW1lOwkJLyogTmFtZSBvZiB0aGUgZGVidWcgc3ltYm9sICovCi0gIGNoYXIgKnN5bWJvbF9uYW1lX2NvcHk7CS8qIFRlbXBvcmFyeSBjb3B5IG9mIHRoZSBuYW1lICovCi0gIHVuc2lnbmVkIGludCBzeW1ib2xfbmFtZV9sZW5ndGg7Ci0KLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZGVmIHBzZXVkby1vcCB1c2VkIGluc2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIFNLSVBfV0hJVEVTUEFDRVMgKCk7Ci0KLSAgc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0jaWZkZWYgU1RSSVBfVU5ERVJTQ09SRQotICBpZiAoc3ltYm9sX25hbWVbMF0gPT0gJ18nICYmIHN5bWJvbF9uYW1lWzFdICE9IDApCi0gICAgc3ltYm9sX25hbWUrKzsKLSNlbmRpZiAvKiBTVFJJUF9VTkRFUlNDT1JFICovCi0KLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltYm9sX25hbWVfbGVuZ3RoID0gc3RybGVuIChzeW1ib2xfbmFtZSk7Ci0gIHN5bWJvbF9uYW1lX2NvcHkgPSB4bWFsbG9jIChzeW1ib2xfbmFtZV9sZW5ndGggKyAxKTsKLSAgc3RyY3B5IChzeW1ib2xfbmFtZV9jb3B5LCBzeW1ib2xfbmFtZSk7Ci0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHN5bWJvbF9uYW1lX2NvcHkgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHN5bWJvbF9uYW1lX2NvcHkpOwotI2VuZGlmCi0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgbmV3IHN5bWJvbCAqLwotICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzID0gc3ltYm9sX21ha2UgKHN5bWJvbF9uYW1lX2NvcHkpOwotICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOwotICBTX1NFVF9WQUxVRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMCk7Ci0KLSAgaWYgKFNfSVNfU1RSSU5HIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICBTRl9TRVRfU1RSSU5HIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdW5zaWduZWQgaW50IGRpbV9pbmRleDsKLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2VuZGVmIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgLyogRElNIEJVRyBGSVggc2FjQGN5Z251cy5jb20gKi8KLSAgZGltX2luZGV4ID0gMDsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kZWYgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIC8qIFNldCB0aGUgc2VjdGlvbiBudW1iZXIgYWNjb3JkaW5nIHRvIHN0b3JhZ2UgY2xhc3MuICovCi0gIHN3aXRjaCAoU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgewotICAgIGNhc2UgQ19TVFJUQUc6Ci0gICAgY2FzZSBDX0VOVEFHOgotICAgIGNhc2UgQ19VTlRBRzoKLSAgICAgIFNGX1NFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIENfRklMRToKLSAgICBjYXNlIENfVFBERUY6Ci0gICAgICBTRl9TRVRfREVCVUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZmV0Y2hfY29mZl9kZWJ1Z19zZWN0aW9uICgpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0VGQ046Ci0gICAgICBTRl9TRVRfTE9DQUwgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwkvKiBEbyBub3QgZW1pdCB0aGlzIHN5bWJvbC4gKi8KLSAgICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBDX0JMT0NLOgotICAgICAgU0ZfU0VUX1BST0NFU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwkvKiBXaWxsIG5lZWQgcHJvY2Vzc2luZyBiZWZvcmUgd3JpdGluZyAqLwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIENfRkNOOgotICAgICAgewotCUNPTlNUIGNoYXIgKm5hbWU7Ci0JU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgdGV4dF9zZWN0aW9uKTsKLQotCW5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5ic3ltKTsKLQlpZiAobmFtZVsxXSA9PSAnYicgJiYgbmFtZVsyXSA9PSAnZicpCi0JICB7Ci0JICAgIGlmICghIGluX2Z1bmN0aW9uICgpKQotCSAgICAgIGFzX3dhcm4gKF8oImAlcycgc3ltYm9sIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uIiksIG5hbWUpOwotLyoJICAgIFNBX1NFVF9TWU1fTE5OTyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMTIzNDUpOyovCi0JICAgIC8qIFdpbGwgbmVlZCByZWxvY2F0aW5nICovCi0JICAgIFNGX1NFVF9QUk9DRVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQkgICAgY2xlYXJfZnVuY3Rpb24gKCk7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotI2lmZGVmIENfQVVUT0FSRwotICAgIGNhc2UgQ19BVVRPQVJHOgotI2VuZGlmIC8qIENfQVVUT0FSRyAqLwotICAgIGNhc2UgQ19BVVRPOgotICAgIGNhc2UgQ19SRUc6Ci0gICAgY2FzZSBDX0FSRzoKLSAgICBjYXNlIENfUkVHUEFSTToKLSAgICBjYXNlIENfRklFTEQ6Ci0gICAgICBTRl9TRVRfREVCVUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgYWJzb2x1dGVfc2VjdGlvbik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19NT1M6Ci0gICAgY2FzZSBDX01PRToKLSAgICBjYXNlIENfTU9VOgotICAgIGNhc2UgQ19FT1M6Ci0gICAgICBTX1NFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0VYVDoKLSAgICBjYXNlIENfV0VBS0VYVDoKLSNpZmRlZiBURV9QRQotICAgIGNhc2UgQ19OVF9XRUFLOgotI2VuZGlmCi0gICAgY2FzZSBDX1NUQVQ6Ci0gICAgY2FzZSBDX0xBQkVMOgotICAgICAgLyogVmFsaWQgYnV0IHNldCBzb21ld2hlcmUgZWxzZSAoc19jb21tLCBzX2xjb21tLCBjb2xvbikgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICBjYXNlIENfVVNUQVRJQzoKLSAgICBjYXNlIENfRVhUREVGOgotICAgIGNhc2UgQ19VTEFCRUw6Ci0gICAgICBhc193YXJuIChfKCJ1bmV4cGVjdGVkIHN0b3JhZ2UgY2xhc3MgJWQiKSwKLQkgICAgICAgU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpOwotICAgICAgYnJlYWs7Ci0gICAgfQkJCQkvKiBzd2l0Y2ggb24gc3RvcmFnZSBjbGFzcyAqLwotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgYnVpbHQgYSBkZWJ1ZyBzeW1ib2wsIHRyeSB0byBmaW5kIGlmIHdlIHNob3VsZAotICAgICBtZXJnZSB3aXRoIGFuIGV4aXN0aW5nIHN5bWJvbCBvciBub3QuICBJZiBhIHN5bWJvbCBpcyBDX0VGQ04gb3IKLSAgICAgU0VHX0FCU09MVVRFIG9yIHVudGFnZ2VkIFNFR19ERUJVRyBpdCBuZXZlciBtZXJnZXMuICovCi0KLSAgLyogVHdvIGNhc2VzIGZvciBmdW5jdGlvbnMuICBFaXRoZXIgZGVidWcgZm9sbG93ZWQgYnkgZGVmaW5pdGlvbiBvcgotICAgICBkZWZpbml0aW9uIGZvbGxvd2VkIGJ5IGRlYnVnLiAgRm9yIGRlZmluaXRpb24gZmlyc3QsIHdlIHdpbGwKLSAgICAgbWVyZ2UgdGhlIGRlYnVnIHN5bWJvbCBpbnRvIHRoZSBkZWZpbml0aW9uLiAgRm9yIGRlYnVnIGZpcnN0LCB0aGUKLSAgICAgbGluZW5vIGVudHJ5IE1VU1QgcG9pbnQgdG8gdGhlIGRlZmluaXRpb24gZnVuY3Rpb24gb3IgZWxzZSBpdAotICAgICB3aWxsIHBvaW50IG9mZiBpbnRvIHNwYWNlIHdoZW4gb2JqX2NyYXdsX3N5bWJvbF9jaGFpbigpIG1lcmdlcwotICAgICB0aGUgZGVidWcgc3ltYm9sIGludG8gdGhlIHJlYWwgc3ltYm9sLiAgVGhlcmVmb3IsIGxldCdzIHByZXN1bWUKLSAgICAgdGhlIGRlYnVnIHN5bWJvbCBpcyBhIHJlYWwgZnVuY3Rpb24gcmVmZXJlbmNlLiAqLwotCi0gIC8qIEZJWE1FLVNPT04gSWYgZm9yIHNvbWUgcmVhc29uIHRoZSBkZWZpbml0aW9uIGxhYmVsL3N5bWJvbCBpcwotICAgICBuZXZlciBzZWVuLCB0aGlzIHdpbGwgcHJvYmFibHkgbGVhdmUgYW4gdW5kZWZpbmVkIHN5bWJvbCBhdCBsaW5rCi0gICAgIHRpbWUuICovCi0KLSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IENfRUZDTgotICAgICAgfHwgKCFzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzdGRvdXRwdXQsCi0JCQkJCSBTX0dFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSksCi0JCSAgICIqREVCVUcqIikKLQkgICYmICFTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICAgIHx8IFNfR0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IGFic29sdXRlX3NlY3Rpb24KLSAgICAgIHx8IChzeW1ib2xQID0gc3ltYm9sX2ZpbmRfYmFzZSAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksIERPX05PVF9TVFJJUCkpID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgIT0gc3ltYm9sX2xhc3RQKQotCXN5bWJvbF9hcHBlbmQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbF9sYXN0UCwgJnN5bWJvbF9yb290UCwKLQkJICAgICAgICZzeW1ib2xfbGFzdFApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoaXMgc3ltYm9sIGFscmVhZHkgZXhpc3RzLCBtZXJnZSB0aGUgbmV3bHkgY3JlYXRlZCBzeW1ib2wKLQkgaW50byB0aGUgb2xkIG9uZS4gIFRoaXMgaXMgbm90IG1hbmRhdG9yeS4gVGhlIGxpbmtlciBjYW4KLQkgaGFuZGxlIGR1cGxpY2F0ZSBzeW1ib2xzIGNvcnJlY3RseS4gQnV0IEkgZ3Vlc3MgdGhhdCBpdCBzYXZlCi0JIGEgKmxvdCogb2Ygc3BhY2UgaWYgdGhlIGFzc2VtYmx5IGZpbGUgZGVmaW5lcyBhIGxvdCBvZgotCSBzeW1ib2xzLiBbbG9pY10gKi8KLQotICAgICAgLyogVGhlIGRlYnVnIGVudHJ5IChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSBpcyBtZXJnZWQgaW50byB0aGUKLQkgcHJldmlvdXMgZGVmaW5pdGlvbi4gKi8KLQotICAgICAgY19zeW1ib2xfbWVyZ2UgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbFApOwotICAgICAgc3ltYm9sX3JlbW92ZSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0KLSAgICAgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPSBzeW1ib2xQOwotCi0gICAgICBpZiAoU0ZfR0VUX0ZVTkNUSU9OIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKQotCSAgfHwgU0ZfR0VUX1RBRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykKLQkgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IENfU1RBVCkKLQl7Ci0JICAvKiBGb3IgZnVuY3Rpb25zLCBhbmQgdGFncywgYW5kIHN0YXRpYyBzeW1ib2xzLCB0aGUgc3ltYm9sCi0JICAgICAqbXVzdCogYmUgd2hlcmUgdGhlIGRlYnVnIHN5bWJvbCBhcHBlYXJzLiAgTW92ZSB0aGUKLQkgICAgIGV4aXN0aW5nIHN5bWJvbCB0byB0aGUgY3VycmVudCBwbGFjZS4gKi8KLQkgIC8qIElmIGl0IGFscmVhZHkgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIGxpc3QsIGRvIG5vdGhpbmcgKi8KLQkgIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IHN5bWJvbF9sYXN0UCkKLQkgICAgewotCSAgICAgIHN5bWJvbF9yZW1vdmUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICAgIHN5bWJvbF9hcHBlbmQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbF9sYXN0UCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpvbGR0YWc7Ci0KLSAgICAgIG9sZHRhZyA9IHN5bWJvbF9maW5kX2Jhc2UgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLAotCQkJCSBET19OT1RfU1RSSVApOwotICAgICAgaWYgKG9sZHRhZyA9PSBOVUxMIHx8ICEgU0ZfR0VUX1RBRyAob2xkdGFnKSkKLQl0YWdfaW5zZXJ0IChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwKLQkJICAgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgIH0KLQotICBpZiAoU0ZfR0VUX0ZVTkNUSU9OIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICB7Ci0gICAgICBrbm93IChzaXplb2YgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpIDw9IHNpemVvZiAobG9uZykpOwotICAgICAgc2V0X2Z1bmN0aW9uIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgICAgIFNGX1NFVF9QUk9DRVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQotICAgICAgaWYgKHN5bWJvbFAgPT0gTlVMTCkKLQl7Ci0JICAvKiBUaGF0IGlzLCBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIHNlZW4gdGhlCi0JICAgICBmdW5jdGlvbi4uLiAqLwotCSAgc3ltYm9sX3RhYmxlX2luc2VydCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0JfSAvKiBkZWZpbml0aW9uIGZvbGxvd3MgZGVidWcgKi8KLSAgICB9IC8qIENyZWF0ZSB0aGUgbGluZSBudW1iZXIgZW50cnkgcG9pbnRpbmcgdG8gdGhlIGZ1bmN0aW9uIGJlaW5nIGRlZmluZWQgKi8KLQotICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzID0gTlVMTDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2RpbSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgZGltX2luZGV4OwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmRpbSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0KLSAgZm9yIChkaW1faW5kZXggPSAwOyBkaW1faW5kZXggPCBESU1OVU07IGRpbV9pbmRleCsrKQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRVMgKCk7Ci0gICAgICBTQV9TRVRfU1lNX0RJTUVOIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBkaW1faW5kZXgsCi0JCQlnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0KLSAgICAgIHN3aXRjaCAoKmlucHV0X2xpbmVfcG9pbnRlcikKLQl7Ci0JY2FzZSAnLCc6Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFzX3dhcm4gKF8oImJhZGx5IGZvcm1lZCAuZGltIGRpcmVjdGl2ZSBpZ25vcmVkIikpOwotCSAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLQljYXNlICdcbic6Ci0JY2FzZSAnOyc6Ci0JICBkaW1faW5kZXggPSBESU1OVU07Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9saW5lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCB0aGlzX2Jhc2U7Ci0KLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBQcm9iYWJseSBzdGFicy1zdHlsZSBsaW5lPyAgKi8KLSAgICAgIG9ial9jb2ZmX2xuICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdGhpc19iYXNlID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmICghc3RyY21wICgiLmJmIiwgU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpKQotICAgIGNvZmZfbGluZV9iYXNlID0gdGhpc19iYXNlOwotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDEpOwotICBTQV9TRVRfU1lNX0xOTk8gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGNvZmZfbGluZV9iYXNlKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgaWYgKHN0cmNtcCAoIi5iZiIsIFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKSA9PSAwKQotICAgIHsKLSAgICAgIGV4dGVybiBpbnQgbGlzdGluZzsKLQotICAgICAgaWYgKGxpc3RpbmcpCi0JbGlzdGluZ19zb3VyY2VfbGluZSAoKHVuc2lnbmVkIGludCkgY29mZl9saW5lX2Jhc2UpOwotICAgIH0KLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfc2l6ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zaXplIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDEpOwotICBTQV9TRVRfU1lNX1NJWkUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3NjbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zY2wgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfdGFnIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKnN5bWJvbF9uYW1lOwotICBjaGFyIG5hbWVfZW5kOwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnRhZyBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0gIHN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHN5bWJvbF9uYW1lID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzeW1ib2xfbmFtZSk7Ci0jZW5kaWYKLQotICAvKiBBc3N1bWUgdGhhdCB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IC50YWcgaXMgYWx3YXlzIGRlZmluZWQuCi0gICAgIFRoaXMgd2FzIGEgYmFkIGFzc3VtcHRpb24uICBJJ3ZlIGFkZGVkIGZpbmRfb3JfbWFrZS4geG94b3JpY2guICovCi0gIFNBX1NFVF9TWU1fVEFHTkRYIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLAotCQkgICAgIHRhZ19maW5kX29yX21ha2UgKHN5bWJvbF9uYW1lKSk7Ci0gIGlmIChTQV9HRVRfU1lNX1RBR05EWCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gMEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygidGFnIG5vdCBmb3VuZCBmb3IgLnRhZyAlcyIpLCBzeW1ib2xfbmFtZSk7Ci0gICAgfQkJCQkvKiBub3QgZGVmaW5lZCAqLwotCi0gIFNGX1NFVF9UQUdHRUQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3R5cGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudHlwZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTX1NFVF9EQVRBX1RZUEUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICBpZiAoSVNGQ04gKFNfR0VUX0RBVEFfVFlQRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpICYmCi0gICAgICBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSAhPSBDX1RQREVGKQotICAgIHsKLSAgICAgIFNGX1NFVF9GVU5DVElPTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgfQkJCQkvKiBpcyBhIGZ1bmN0aW9uICovCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3ZhbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi52YWwgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKCppbnB1dF9saW5lX3BvaW50ZXIpKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgY2hhciBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHN5bWJvbF9uYW1lID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzeW1ib2xfbmFtZSk7Ci0jZW5kaWYKLSAgICAgIGlmICghc3RyY21wIChzeW1ib2xfbmFtZSwgIi4iKSkKLQl7Ci0JICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV9mcmFnID0gZnJhZ19ub3c7Ci0JICBTX1NFVF9WQUxVRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLQkgIC8qIElmIHRoZSAudmFsIGlzICE9IGZyb20gdGhlIC5kZWYgKGUuZy4gc3RhdGljcykgKi8KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLCBzeW1ib2xfbmFtZSkpCi0JewotCSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfdmFsdWUuWF9vcCA9IE9fc3ltYm9sOwotCSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sID0KLQkgICAgc3ltYm9sX2ZpbmRfb3JfbWFrZSAoc3ltYm9sX25hbWUpOwotCSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfdmFsdWUuWF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyID0gMDsKLQotCSAgLyogSWYgdGhlIHNlZ21lbnQgaXMgdW5kZWZpbmVkIHdoZW4gdGhlIGZvcndhcmQgcmVmZXJlbmNlIGlzCi0JICAgICByZXNvbHZlZCwgdGhlbiBjb3B5IHRoZSBzZWdtZW50IGlkIGZyb20gdGhlIGZvcndhcmQKLQkgICAgIHN5bWJvbC4gICovCi0JICBTRl9TRVRfR0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCX0KLSAgICAgIC8qIE90aGVyd2lzZSwgaXQgaXMgdGhlIG5hbWUgb2YgYSBub24gZGVidWcgc3ltYm9sIGFuZCBpdHMgdmFsdWUgd2lsbCBiZSBjYWxjdWxhdGVkIGxhdGVyLiAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gICAgfQkJCQkvKiBpZiBzeW1ib2wgYmFzZWQgKi8KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi1jb2ZmX29ial9yZWFkX2JlZ2luX2hvb2sgKCkKLXsKLSAgLyogVGhlc2UgaGFkIGJldHRlciBiZSB0aGUgc2FtZS4gIFVzdWFsbHkgMTggYnl0ZXMuICovCi0jaWZuZGVmIEJGRF9IRUFERVJTCi0gIGtub3cgKHNpemVvZiAoU1lNRU5UKSA9PSBzaXplb2YgKEFVWEVOVCkpOwotICBrbm93IChTWU1FU1ogPT0gQVVYRVNaKTsKLSNlbmRpZgotICB0YWdfaW5pdCAoKTsKLX0KLQotCi1zeW1ib2xTICpjb2ZmX2xhc3RfZnVuY3Rpb247Ci1zdGF0aWMgc3ltYm9sUyAqY29mZl9sYXN0X2JmOwotCi12b2lkCi1jb2ZmX2Zyb2Jfc3ltYm9sIChzeW1wLCBwdW50KQotICAgICBzeW1ib2xTICpzeW1wOwotICAgICBpbnQgKnB1bnQ7Ci17Ci0gIHN0YXRpYyBzeW1ib2xTICpsYXN0X3RhZ1A7Ci0gIHN0YXRpYyBzdGFjayAqYmxvY2tfc3RhY2s7Ci0gIHN0YXRpYyBzeW1ib2xTICpzZXRfZW5kOwotICBzeW1ib2xTICpuZXh0X3NldF9lbmQgPSBOVUxMOwotCi0gIGlmIChzeW1wID09ICZhYnNfc3ltYm9sKQotICAgIHsKLSAgICAgICpwdW50ID0gMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGN1cnJlbnRfbGluZW5vX3N5bSkKLSAgICBjb2ZmX2FkZF9saW5lc3ltICgoc3ltYm9sUyAqKSAwKTsKLQotICBpZiAoIWJsb2NrX3N0YWNrKQotICAgIGJsb2NrX3N0YWNrID0gc3RhY2tfaW5pdCAoNTEyLCBzaXplb2YgKHN5bWJvbFMqKSk7Ci0KLSAgaWYgKFNfSVNfV0VBSyAoc3ltcCkpCi0gICAgewotI2lmZGVmIFRFX1BFCi0gICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1wLCBDX05UX1dFQUspOwotI2Vsc2UKLSAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXAsIENfV0VBS0VYVCk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKCFTX0lTX0RFRklORUQgKHN5bXApCi0gICAgICAmJiAhU19JU19XRUFLIChzeW1wKQotICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgIT0gQ19TVEFUKQotICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXAsIENfRVhUKTsKLQotICBpZiAoIVNGX0dFVF9ERUJVRyAoc3ltcCkpCi0gICAgewotICAgICAgc3ltYm9sUyAqcmVhbDsKLSAgICAgIGlmICghU0ZfR0VUX0xPQ0FMIChzeW1wKQotCSAgJiYgIVNGX0dFVF9TVEFUSUNTIChzeW1wKQotCSAgJiYgKHJlYWwgPSBzeW1ib2xfZmluZF9iYXNlIChTX0dFVF9OQU1FIChzeW1wKSwgRE9fTk9UX1NUUklQKSkKLQkgICYmIHJlYWwgIT0gc3ltcCkKLQl7Ci0JICBjX3N5bWJvbF9tZXJnZSAoc3ltcCwgcmVhbCk7Ci0JICAqcHVudCA9IDE7Ci0JfQotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKHN5bXApICYmICFTRl9HRVRfTE9DQUwgKHN5bXApKQotCXsKLQkgIGFzc2VydCAoU19HRVRfVkFMVUUgKHN5bXApID09IDApOwotCSAgU19TRVRfRVhURVJOQUwgKHN5bXApOwotCX0KLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXApID09IENfTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltcCkgPT0gdGV4dF9zZWN0aW9uCi0JICAgICAgJiYgc3ltcCAhPSBzZWdfaW5mbyAodGV4dF9zZWN0aW9uKS0+c3ltKQotCSAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1wLCBDX0xBQkVMKTsKLQkgIGVsc2UKLQkgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCwgQ19TVEFUKTsKLQl9Ci0gICAgICBpZiAoU0ZfR0VUX1BST0NFU1MgKHN5bXApKQotCXsKLQkgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1wKSA9PSBDX0JMT0NLKQotCSAgICB7Ci0JICAgICAgaWYgKCFzdHJjbXAgKFNfR0VUX05BTUUgKHN5bXApLCAiLmJiIikpCi0JCXN0YWNrX3B1c2ggKGJsb2NrX3N0YWNrLCAoY2hhciAqKSAmc3ltcCk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3ltYm9sUyAqYmVnaW47Ci0JCSAgYmVnaW4gPSAqKHN5bWJvbFMgKiopIHN0YWNrX3BvcCAoYmxvY2tfc3RhY2spOwotCQkgIGlmIChiZWdpbiA9PSAwKQotCQkgICAgYXNfd2FybiAoXygibWlzbWF0Y2hlZCAuZWIiKSk7Ci0JCSAgZWxzZQotCQkgICAgbmV4dF9zZXRfZW5kID0gYmVnaW47Ci0JCX0KLQkgICAgfQotCSAgaWYgKGNvZmZfbGFzdF9mdW5jdGlvbiA9PSAwICYmIFNGX0dFVF9GVU5DVElPTiAoc3ltcCkpCi0JICAgIHsKLQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eHA7Ci0JICAgICAgY29mZl9sYXN0X2Z1bmN0aW9uID0gc3ltcDsKLQkgICAgICBpZiAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltcCkgPCAxKQotCQlTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1wLCAxKTsKLQkgICAgICBhdXhwID0gJmNvZmZzeW1ib2wgKHN5bXAtPmJzeW0pLT5uYXRpdmVbMV0udS5hdXhlbnQ7Ci0JICAgICAgbWVtc2V0IChhdXhwLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuLCAwLAotCQkgICAgICBzaXplb2YgKGF1eHAtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW4pKTsKLQkgICAgfQotCSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXApID09IENfRUZDTikKLQkgICAgewotCSAgICAgIGlmIChjb2ZmX2xhc3RfZnVuY3Rpb24gPT0gMCkKLQkJYXNfZmF0YWwgKF8oIkNfRUZDTiBzeW1ib2wgb3V0IG9mIHNjb3BlIikpOwotCSAgICAgIFNBX1NFVF9TWU1fRlNJWkUgKGNvZmZfbGFzdF9mdW5jdGlvbiwKLQkJCQkobG9uZykgKFNfR0VUX1ZBTFVFIChzeW1wKQotCQkJCQktIFNfR0VUX1ZBTFVFIChjb2ZmX2xhc3RfZnVuY3Rpb24pKSk7Ci0JICAgICAgbmV4dF9zZXRfZW5kID0gY29mZl9sYXN0X2Z1bmN0aW9uOwotCSAgICAgIGNvZmZfbGFzdF9mdW5jdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoU19JU19FWFRFUk5BTCAoc3ltcCkpCi0JU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCwgQ19FWFQpOwotICAgICAgZWxzZSBpZiAoU0ZfR0VUX0xPQ0FMIChzeW1wKSkKLQkqcHVudCA9IDE7Ci0KLSAgICAgIGlmIChTRl9HRVRfRlVOQ1RJT04gKHN5bXApKQotCXN5bXAtPmJzeW0tPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQotICAgICAgLyogbW9yZSAuLi4gKi8KLSAgICB9Ci0KLSAgaWYgKFNGX0dFVF9UQUcgKHN5bXApKQotICAgIGxhc3RfdGFnUCA9IHN5bXA7Ci0gIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXApID09IENfRU9TKQotICAgIG5leHRfc2V0X2VuZCA9IGxhc3RfdGFnUDsKLQotI2lmZGVmIE9CSl9YQ09GRgotICAvKiBUaGlzIGlzIHByZXR0eSBob3JyaWJsZSwgYnV0IHdlIGhhdmUgdG8gc2V0ICpwdW50IGNvcnJlY3RseSBpbgotICAgICBvcmRlciB0byBjYWxsIFNBX1NFVF9TWU1fRU5ETkRYIGNvcnJlY3RseS4gICovCi0gIGlmICghIHN5bXAtPnN5X3VzZWRfaW5fcmVsb2MKLSAgICAgICYmICgoc3ltcC0+YnN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDAKLQkgIHx8ICghIFNfSVNfRVhURVJOQUwgKHN5bXApCi0JICAgICAgJiYgISBzeW1wLT5zeV90Yy5vdXRwdXQKLQkgICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1wKSAhPSBDX0ZJTEUpKSkKLSAgICAqcHVudCA9IDE7Ci0jZW5kaWYKLQotICBpZiAoc2V0X2VuZCAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiAhICpwdW50Ci0gICAgICAmJiAoKHN5bXAtPmJzeW0tPmZsYWdzICYgQlNGX05PVF9BVF9FTkQpICE9IDAKLQkgIHx8IChTX0lTX0RFRklORUQgKHN5bXApCi0JICAgICAgJiYgISBTX0lTX0NPTU1PTiAoc3ltcCkKLQkgICAgICAmJiAoISBTX0lTX0VYVEVSTkFMIChzeW1wKSB8fCBTRl9HRVRfRlVOQ1RJT04gKHN5bXApKSkpKQotICAgIHsKLSAgICAgIFNBX1NFVF9TWU1fRU5ETkRYIChzZXRfZW5kLCBzeW1wKTsKLSAgICAgIHNldF9lbmQgPSBOVUxMOwotICAgIH0KLQotICBpZiAobmV4dF9zZXRfZW5kICE9IE5VTEwKLSAgICAgICYmICEgKnB1bnQpCi0gICAgc2V0X2VuZCA9IG5leHRfc2V0X2VuZDsKLQotICBpZiAoISAqcHVudAotICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgPT0gQ19GQ04KLSAgICAgICYmIHN0cmNtcCAoU19HRVRfTkFNRSAoc3ltcCksICIuYmYiKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChjb2ZmX2xhc3RfYmYgIT0gTlVMTCkKLQlTQV9TRVRfU1lNX0VORE5EWCAoY29mZl9sYXN0X2JmLCBzeW1wKTsKLSAgICAgIGNvZmZfbGFzdF9iZiA9IHN5bXA7Ci0gICAgfQotCi0gIGlmIChjb2Zmc3ltYm9sIChzeW1wLT5ic3ltKS0+bGluZW5vKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgc3RydWN0IGxpbmVfbm8gKmxwdHI7Ci0gICAgICBhbGVudCAqbDsKLQotICAgICAgbHB0ciA9IChzdHJ1Y3QgbGluZV9ubyAqKSBjb2Zmc3ltYm9sIChzeW1wLT5ic3ltKS0+bGluZW5vOwotICAgICAgZm9yIChpID0gMDsgbHB0cjsgbHB0ciA9IGxwdHItPm5leHQpCi0JaSsrOwotICAgICAgbHB0ciA9IChzdHJ1Y3QgbGluZV9ubyAqKSBjb2Zmc3ltYm9sIChzeW1wLT5ic3ltKS0+bGluZW5vOwotCi0gICAgICAvKiBXZSBuZWVkIGkgZW50cmllcyBmb3IgbGluZSBudW1iZXJzLCBwbHVzIDEgZm9yIHRoZSBmaXJzdAotCSBlbnRyeSB3aGljaCBCRkQgd2lsbCBvdmVycmlkZSwgcGx1cyAxIGZvciB0aGUgbGFzdCB6ZXJvCi0JIGVudHJ5IChhIG1hcmtlciBmb3IgQkZEKS4gICovCi0gICAgICBsID0gKGFsZW50ICopIHhtYWxsb2MgKChpICsgMikgKiBzaXplb2YgKGFsZW50KSk7Ci0gICAgICBjb2Zmc3ltYm9sIChzeW1wLT5ic3ltKS0+bGluZW5vID0gbDsKLSAgICAgIGxbaSArIDFdLmxpbmVfbnVtYmVyID0gMDsKLSAgICAgIGxbaSArIDFdLnUuc3ltID0gTlVMTDsKLSAgICAgIGZvciAoOyBpID4gMDsgaS0tKQotCXsKLQkgIGlmIChscHRyLT5mcmFnKQotCSAgICBscHRyLT5sLnUub2Zmc2V0ICs9IGxwdHItPmZyYWctPmZyX2FkZHJlc3M7Ci0JICBsW2ldID0gbHB0ci0+bDsKLQkgIGxwdHIgPSBscHRyLT5uZXh0OwotCX0KLSAgICB9Ci19Ci0KLXZvaWQKLWNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyAoYWJmZCwgc2VjLCB4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiB4OwotewotICBzeW1ib2xTICpzZWNzeW07Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGludCBubG5ubywgbnJlbG9jcyA9IDA7Ci0KLSAgLyogUlMvNjAwMCBnYXMgY3JlYXRlcyBhIC5kZWJ1ZyBzZWN0aW9uIG1hbnVhbGx5IGluIHBwY19mcm9iX2ZpbGUgaW4KLSAgICAgdGMtcHBjLmMuICBEbyBub3QgZ2V0IGNvbmZ1c2VkIGJ5IGl0LiAgKi8KLSAgaWYgKHNlZ2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCFzdHJjbXAgKHNlYy0+bmFtZSwgIi50ZXh0IikpCi0gICAgbmxubm8gPSBjb2ZmX25fbGluZV9ub3M7Ci0gIGVsc2UKLSAgICBubG5ubyA9IDA7Ci0gIHsKLSAgICAvKiBAQCBIb3BlIHRoYXQgbm9uZSBvZiB0aGUgZml4dXBzIGV4cGFuZCB0byBtb3JlIHRoYW4gb25lIHJlbG9jCi0gICAgICAgZW50cnkuLi4gICovCi0gICAgZml4UyAqZml4cCA9IHNlZ2luZm8tPmZpeF9yb290OwotICAgIHdoaWxlIChmaXhwKQotICAgICAgewotCWlmICghIGZpeHAtPmZ4X2RvbmUpCi0JICBucmVsb2NzKys7Ci0JZml4cCA9IGZpeHAtPmZ4X25leHQ7Ci0gICAgICB9Ci0gIH0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKSA9PSAwCi0gICAgICAmJiBucmVsb2NzID09IDAKLSAgICAgICYmIG5sbm5vID09IDAKLSAgICAgICYmIHNlYyAhPSB0ZXh0X3NlY3Rpb24KLSAgICAgICYmIHNlYyAhPSBkYXRhX3NlY3Rpb24KLSAgICAgICYmIHNlYyAhPSBic3Nfc2VjdGlvbikKLSAgICByZXR1cm47Ci0gIHNlY3N5bSA9IHNlY3Rpb25fc3ltYm9sIChzZWMpOwotICBTQV9TRVRfU0NOX05SRUxPQyAoc2Vjc3ltLCBucmVsb2NzKTsKLSAgU0FfU0VUX1NDTl9OTElOTk8gKHNlY3N5bSwgbmxubm8pOwotfQotCi12b2lkCi1jb2ZmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKCkKLXsKLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcywgKGNoYXIqKSAwKTsKLX0KLQotLyoKLSAqIGltcGxlbWVudCB0aGUgLnNlY3Rpb24gcHNldWRvIG9wOgotICoJLnNlY3Rpb24gbmFtZSB7LCAiZmxhZ3MifQotICogICAgICAgICAgICAgICAgXiAgICAgICAgIF4KLSAqICAgICAgICAgICAgICAgIHwgICAgICAgICArLS0tIG9wdGlvbmFsIGZsYWdzOiAnYicgZm9yIGJzcwotICogICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJyBmb3IgaW5mbwotICogICAgICAgICAgICAgICAgKy0tIHNlY3Rpb24gbmFtZSAgICAgICAgICAgICAgICdsJyBmb3IgbGliCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nIGZvciBub2xvYWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycgZm9yIG92ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycgZm9yIGRhdGEKLSAqCQkJCQkJICdkJyAoYXBwYXJlbnRseSBtODhrIGZvciBkYXRhKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JyBmb3IgdGV4dAotICoJCQkJCQkgJ3InIGZvciByZWFkLW9ubHkgZGF0YQotICogQnV0IGlmIHRoZSBhcmd1bWVudCBpcyBub3QgYSBxdW90ZWQgc3RyaW5nLCB0cmVhdCBpdCBhcyBhCi0gKiBzdWJzZWdtZW50IG51bWJlci4KLSAqLwotCi12b2lkCi1vYmpfY29mZl9zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIFN0cmlwIG91dCB0aGUgc2VjdGlvbiBuYW1lICovCi0gIGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgZXhwOwotICBmbGFnd29yZCBmbGFnczsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgY2hhciB0eXBlOwotCi0gICAgICBzX21yaV9zZWN0ICgmdHlwZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNlY3Rpb25fbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIG5hbWUgPSB4bWFsbG9jIChpbnB1dF9saW5lX3BvaW50ZXIgLSBzZWN0aW9uX25hbWUgKyAxKTsKLSAgc3RyY3B5IChuYW1lLCBzZWN0aW9uX25hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBleHAgPSAwOwotICBmbGFncyA9IFNFQ19OT19GTEFHUzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0JZXhwID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicKLQkJICYmICEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSAgICB7Ci0JICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCQl7Ci0JCWNhc2UgJ2InOiBmbGFncyB8PSBTRUNfQUxMT0M7IGZsYWdzICY9fiBTRUNfTE9BRDsgYnJlYWs7Ci0JCWNhc2UgJ24nOiBmbGFncyAmPX4gU0VDX0xPQUQ7IGJyZWFrOwotCQljYXNlICdkJzoKLQkJY2FzZSAndyc6IGZsYWdzICY9fiBTRUNfUkVBRE9OTFk7IGJyZWFrOwotCQljYXNlICd4JzogZmxhZ3MgfD0gU0VDX0NPREU7IGJyZWFrOwotCQljYXNlICdyJzogZmxhZ3MgfD0gU0VDX1JFQURPTkxZOyBicmVhazsKLQotCQljYXNlICdpJzogLyogU1RZUF9JTkZPICovCi0JCWNhc2UgJ2wnOiAvKiBTVFlQX0xJQiAqLwotCQljYXNlICdvJzogLyogU1RZUF9PVkVSICovCi0JCSAgYXNfd2FybiAoXygidW5zdXBwb3J0ZWQgc2VjdGlvbiBhdHRyaWJ1dGUgJyVjJyIpLAotCQkJICAgKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBhc193YXJuKF8oInVua25vd24gc2VjdGlvbiBhdHRyaWJ1dGUgJyVjJyIpLAotCQkJICAqaW5wdXRfbGluZV9wb2ludGVyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICB9Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIicpCi0JICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLSAgICB9Ci0KLSAgc2VjID0gc3Vic2VnX25ldyAobmFtZSwgKHN1YnNlZ1QpIGV4cCk7Ci0KLSAgaWYgKGZsYWdzICE9IFNFQ19OT19GTEFHUykKLSAgICB7Ci0gICAgICBmbGFnd29yZCBvbGRmbGFnczsKLQotICAgICAgb2xkZmxhZ3MgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjKTsKLSAgICAgIG9sZGZsYWdzICY9IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTOwotICAgICAgZmxhZ3MgfD0gb2xkZmxhZ3M7Ci0KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWMsIGZsYWdzKSkKLQlhc193YXJuIChfKCJlcnJvciBzZXR0aW5nIGZsYWdzIGZvciBcIiVzXCI6ICVzIiksCi0JCSBiZmRfc2VjdGlvbl9uYW1lIChzdGRvdXRwdXQsIHNlYyksCi0JCSBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLWNvZmZfYWRqdXN0X3N5bXRhYiAoKQotewotICBpZiAoc3ltYm9sX3Jvb3RQID09IE5VTEwKLSAgICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbF9yb290UCkgIT0gQ19GSUxFKQotICAgIGNfZG90X2ZpbGVfc3ltYm9sICgiZmFrZSIpOwotfQotCi12b2lkCi1jb2ZmX2Zyb2Jfc2VjdGlvbiAoc2VjKQotICAgICBzZWdUIHNlYzsKLXsKLSAgc2VnVCBzdHJzZWM7Ci0gIGNoYXIgKnA7Ci0gIGZyYWdTICpmcmFncDsKLSAgYmZkX3ZtYSBzaXplLCBuX2VudHJpZXMsIG1hc2s7Ci0KLSAgLyogVGhlIENPRkYgYmFjayBlbmQgaW4gQkZEIHJlcXVpcmVzIHRoYXQgYWxsIHNlY3Rpb24gc2l6ZXMgYmUKLSAgICAgcm91bmRlZCB1cCB0byBtdWx0aXBsZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2VjdGlvbiBhbGlnbm1lbnRzLgotICAgICBTZWVtcyBraW5kYSBzaWxseSB0byBtZSwgYnV0IHRoYXQncyB0aGUgd2F5IGl0IGlzLiAgKi8KLSAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKTsKLSAgbWFzayA9ICgoYmZkX3ZtYSkgMSA8PCAoYmZkX3ZtYSkgc2VjLT5hbGlnbm1lbnRfcG93ZXIpIC0gMTsKLSAgaWYgKHNpemUgJiBtYXNrKQotICAgIHsKLSAgICAgIHNpemUgPSAoc2l6ZSArIG1hc2spICYgfm1hc2s7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCBzZWMsIHNpemUpOwotICAgIH0KLQotICAvKiBJZiB0aGUgc2VjdGlvbiBzaXplIGlzIG5vbi16ZXJvLCB0aGUgc2VjdGlvbiBzeW1ib2wgbmVlZHMgYW4gYXV4Ci0gICAgIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCBpdCwgaW5kaWNhdGluZyB0aGUgc2l6ZS4gIFdlIGRvbid0IGtub3cKLSAgICAgYWxsIHRoZSB2YWx1ZXMgeWV0OyBjb2ZmX2Zyb2Jfc3ltYm9sIHdpbGwgZmlsbCB0aGVtIGluIGxhdGVyLiAgKi8KLSAgaWYgKHNpemUgIT0gMAotICAgICAgfHwgc2VjID09IHRleHRfc2VjdGlvbgotICAgICAgfHwgc2VjID09IGRhdGFfc2VjdGlvbgotICAgICAgfHwgc2VjID09IGJzc19zZWN0aW9uKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnNlY3N5bSA9IHNlY3Rpb25fc3ltYm9sIChzZWMpOwotCi0gICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzZWNzeW0sIENfU1RBVCk7Ci0gICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzZWNzeW0sIDEpOwotICAgICAgU0ZfU0VUX1NUQVRJQ1MgKHNlY3N5bSk7Ci0gICAgICBTQV9TRVRfU0NOX1NDTkxFTiAoc2Vjc3ltLCBzaXplKTsKLSAgICB9Ci0KLSAgLyogQEAgdGhlc2Ugc2hvdWxkIGJlIGluIGEgInN0YWJzLmgiIGZpbGUsIG9yIG1heWJlIGFzLmggKi8KLSNpZm5kZWYgU1RBQl9TRUNUSU9OX05BTUUKLSNkZWZpbmUgU1RBQl9TRUNUSU9OX05BTUUgIi5zdGFiIgotI2VuZGlmCi0jaWZuZGVmIFNUQUJfU1RSSU5HX1NFQ1RJT05fTkFNRQotI2RlZmluZSBTVEFCX1NUUklOR19TRUNUSU9OX05BTUUgIi5zdGFic3RyIgotI2VuZGlmCi0gIGlmIChzdHJjbXAgKFNUQUJfU1RSSU5HX1NFQ1RJT05fTkFNRSwgc2VjLT5uYW1lKSkKLSAgICByZXR1cm47Ci0KLSAgc3Ryc2VjID0gc2VjOwotICBzZWMgPSBzdWJzZWdfZ2V0IChTVEFCX1NFQ1RJT05fTkFNRSwgMCk7Ci0gIC8qIHNpemUgaXMgYWxyZWFkeSByb3VuZGVkIHVwLCBzaW5jZSBvdGhlciBzZWN0aW9uIHdpbGwgYmUgbGlzdGVkIGZpcnN0ICovCi0gIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHN0cnNlYyk7Ci0KLSAgbl9lbnRyaWVzID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWMpIC8gMTIgLSAxOwotCi0gIC8qIEZpbmQgZmlyc3Qgbm9uLWVtcHR5IGZyYWcuICBJdCBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoLiAgKi8KLSAgZnJhZ3AgPSBzZWdfaW5mbyAoc2VjKS0+ZnJjaGFpblAtPmZyY2hfcm9vdDsKLSAgd2hpbGUgKGZyYWdwICYmIGZyYWdwLT5mcl9maXggPT0gMCkKLSAgICBmcmFncCA9IGZyYWdwLT5mcl9uZXh0OwotICBhc3NlcnQgKGZyYWdwICE9IDAgJiYgZnJhZ3AtPmZyX2ZpeCA+PSAxMik7Ci0KLSAgLyogU3RvcmUgdGhlIHZhbHVlcy4gICovCi0gIHAgPSBmcmFncC0+ZnJfbGl0ZXJhbDsKLSAgYmZkX2hfcHV0XzE2IChzdGRvdXRwdXQsIG5fZW50cmllcywgKGJmZF9ieXRlICopIHAgKyA2KTsKLSAgYmZkX2hfcHV0XzMyIChzdGRvdXRwdXQsIHNpemUsIChiZmRfYnl0ZSAqKSBwICsgOCk7Ci19Ci0KLXZvaWQKLW9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpCi0gICAgIHNlZ1Qgc2VnOwotewotICBjaGFyICpmaWxlOwotICBjaGFyICpwOwotICBjaGFyICpzdGFic3RyX25hbWU7Ci0gIHVuc2lnbmVkIGludCBzdHJvZmY7Ci0KLSAgLyogTWFrZSBzcGFjZSBmb3IgdGhpcyBmaXJzdCBzeW1ib2wuICovCi0gIHAgPSBmcmFnX21vcmUgKDEyKTsKLSAgLyogWmVybyBpdCBvdXQuICovCi0gIG1lbXNldCAocCwgMCwgMTIpOwotICBhc193aGVyZSAoJmZpbGUsICh1bnNpZ25lZCBpbnQgKikgTlVMTCk7Ci0gIHN0YWJzdHJfbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChzZWctPm5hbWUpICsgNCk7Ci0gIHN0cmNweSAoc3RhYnN0cl9uYW1lLCBzZWctPm5hbWUpOwotICBzdHJjYXQgKHN0YWJzdHJfbmFtZSwgInN0ciIpOwotICBzdHJvZmYgPSBnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0IChmaWxlLCBzdGFic3RyX25hbWUpOwotICBrbm93IChzdHJvZmYgPT0gMSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgc3Ryb2ZmLCA0KTsKLX0KLQotI2lmZGVmIERFQlVHCi0vKiBmb3IgZGVidWdnaW5nICovCi1jb25zdCBjaGFyICoKLXNfZ2V0X25hbWUgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIHJldHVybiAoKHMgPT0gTlVMTCkgPyAiKE5VTEwpIiA6IFNfR0VUX05BTUUgKHMpKTsKLX0KLQotdm9pZAotc3ltYm9sX2R1bXAgKCkKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgcHJpbnRmKF8oIjB4JWx4OiBcIiVzXCIgdHlwZSA9ICVsZCwgY2xhc3MgPSAlZCwgc2VnbWVudCA9ICVkXG4iKSwKLQkgICAgICh1bnNpZ25lZCBsb25nKSBzeW1ib2xQLAotCSAgICAgU19HRVRfTkFNRShzeW1ib2xQKSwKLQkgICAgIChsb25nKSBTX0dFVF9EQVRBX1RZUEUoc3ltYm9sUCksCi0JICAgICBTX0dFVF9TVE9SQUdFX0NMQVNTKHN5bWJvbFApLAotCSAgICAgKGludCkgU19HRVRfU0VHTUVOVChzeW1ib2xQKSk7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogREVCVUcgKi8KLQotI2Vsc2UgLyogbm90IEJGRF9BU1NFTUJMRVIgKi8KLQotI2luY2x1ZGUgImZyYWdzLmgiCi0vKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHdlIGluY2x1ZGUgaW50ZXJuYWwgYmZkIHRoaW5ncy4gKi8KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNpZmRlZiBURV9QRQotI2luY2x1ZGUgImNvZmYvcGUuaCIKLSNlbmRpZgotCi0vKiBUaGUgTk9QX09QQ09ERSBpcyBmb3IgdGhlIGFsaWdubWVudCBmaWxsIHZhbHVlLiAgRmlsbCB3aXRoIG5vcCBzbwotICAgdGhhdCB3ZSBjYW4gc3RpY2sgc2VjdGlvbnMgdG9nZXRoZXIgd2l0aG91dCBjYXVzaW5nIHRyb3VibGUuICAqLwotI2lmbmRlZiBOT1BfT1BDT0RFCi0jZGVmaW5lIE5PUF9PUENPREUgMHgwMAotI2VuZGlmCi0KLS8qIFRoZSB6ZXJvZXMgaWYgc3ltYm9sIG5hbWUgaXMgbG9uZ2VyIHRoYW4gOCBjaGFycyAqLwotI2RlZmluZSBTX1NFVF9aRVJPRVMocyx2KQkJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3plcm9lcyA9ICh2KSkKLQotI2RlZmluZSBNSU4oYSxiKSAoKGEpIDwgKGIpPyAoYSkgOiAoYikpCi0vKiBUaGlzIHZlY3RvciBpcyB1c2VkIHRvIHR1cm4gYW4gaW50ZXJuYWwgc2VnbWVudCBpbnRvIGEgc2VjdGlvbiAjCi0gICBzdWl0YWJsZSBmb3IgaW5zZXJ0aW9uIGludG8gYSBjb2ZmIHN5bWJvbCB0YWJsZQotICovCi0KLWNvbnN0IHNob3J0IHNlZ19OX1RZUEVbXSA9Ci17CQkJCS8qIGluOiBzZWdUICAgb3V0OiBOX1RZUEUgYml0cyAqLwotICBDX0FCU19TRUNUSU9OLAotICAxLCAgICAyLCAgMywgICA0LCAgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwKLSAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsCi0gIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLAotICAzMSwgIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwKLSAgQ19VTkRFRl9TRUNUSU9OLAkJLyogU0VHX1VOS05PV04gKi8KLSAgQ19VTkRFRl9TRUNUSU9OLAkJLyogU0VHX0dPT0YgKi8KLSAgQ19VTkRFRl9TRUNUSU9OLAkJLyogU0VHX0VYUFIgKi8KLSAgQ19ERUJVR19TRUNUSU9OLAkJLyogU0VHX0RFQlVHICovCi0gIENfTlRWX1NFQ1RJT04sCQkvKiBTRUdfTlRWICovCi0gIENfUFRWX1NFQ1RJT04sCQkvKiBTRUdfUFRWICovCi0gIENfUkVHSVNURVJfU0VDVElPTiwJCS8qIFNFR19SRUdJU1RFUiAqLwotfTsKLQotaW50IGZ1bmN0aW9uX2xpbmVvZmYgPSAtMTsJLyogT2Zmc2V0IGluIGxpbmUjcyB3aGVyZSB0aGUgbGFzdCBmdW5jdGlvbgotCQkJCSAgIHN0YXJ0ZWQgKHRoZSBvZGQgZW50cnkgZm9yIGxpbmUgIzApICovCi0KLS8qIHN0cnVjdHVyZSB1c2VkIHRvIGtlZXAgdGhlIGZpbGVuYW1lcyB3aGljaAotICAgYXJlIHRvbyBsb25nIGFyb3VuZCBzbyB0aGF0IHdlIGNhbiBzdGljayB0aGVtCi0gICBpbnRvIHRoZSBzdHJpbmcgdGFibGUgKi8KLXN0cnVjdCBmaWxlbmFtZV9saXN0IAotewotICBjaGFyICpmaWxlbmFtZTsKLSAgc3RydWN0IGZpbGVuYW1lX2xpc3QgKm5leHQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IGZpbGVuYW1lX2xpc3QgKmZpbGVuYW1lX2xpc3RfaGVhZDsKLXN0YXRpYyBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqZmlsZW5hbWVfbGlzdF90YWlsOwotCi1zdGF0aWMgc3ltYm9sUyAqbGFzdF9saW5lX3N5bWJvbDsKLQotLyogQWRkIDQgdG8gdGhlIHJlYWwgdmFsdWUgdG8gZ2V0IHRoZSBpbmRleCBhbmQgY29tcGVuc2F0ZSB0aGUKLSAgIG5lZ2F0aXZlcy4gVGhpcyB2ZWN0b3IgaXMgdXNlZCBieSBTX0dFVF9TRUdNRU5UIHRvIHR1cm4gYSBjb2ZmCi0gICBzZWN0aW9uIG51bWJlciBpbnRvIGEgc2VnbWVudCBudW1iZXIKLSovCi1zdGF0aWMgc3ltYm9sUyAqcHJldmlvdXNfZmlsZV9zeW1ib2w7Ci12b2lkIGNfc3ltYm9sX21lcmdlICgpOwotc3RhdGljIGludCBsaW5lX2Jhc2U7Ci0KLXN5bWJvbFMgKmNfc2VjdGlvbl9zeW1ib2wgKCk7Ci1iZmQgKmFiZmQ7Ci0KLXN0YXRpYyB2b2lkIGZpeHVwX3NlZ21lbnQgUEFSQU1TICgoc2VnbWVudF9pbmZvX3R5cGUgKnNlZ1AsCi0JCQkJICAgc2VnVCB0aGlzX3NlZ21lbnRfdHlwZSkpOwotCi0KLXN0YXRpYyB2b2lkIGZpeHVwX21kZXBzIFBBUkFNUyAoKGZyYWdTICosCi0JCQkJIG9iamVjdF9oZWFkZXJzICosCi0JCQkJIHNlZ1QpKTsKLQotCi1zdGF0aWMgdm9pZCBmaWxsX3NlY3Rpb24gUEFSQU1TICgoYmZkICogYWJmZCwKLQkJCQkgIG9iamVjdF9oZWFkZXJzICosCi0JCQkJICB1bnNpZ25lZCBsb25nICopKTsKLQotCi1zdGF0aWMgaW50IGNfbGluZV9uZXcgUEFSQU1TICgoc3ltYm9sUyAqIHN5bWJvbCwgbG9uZyBwYWRkciwKLQkJCSAgICAgICBpbnQgbGluZV9udW1iZXIsCi0JCQkgICAgICAgZnJhZ1MgKiBmcmFnKSk7Ci0KLQotc3RhdGljIHZvaWQgd19zeW1ib2xzIFBBUkFNUyAoKGJmZCAqIGFiZmQsIGNoYXIgKndoZXJlLAotCQkJICAgICAgIHN5bWJvbFMgKiBzeW1ib2xfcm9vdFApKTsKLQotc3RhdGljIHZvaWQgYWRqdXN0X3N0YWJfc2VjdGlvbiBQQVJBTVMgKChiZmQgKmFiZmQsIHNlZ1Qgc2VnKSk7Ci0KLXN0YXRpYyB2b2lkIG9ial9jb2ZmX2xjb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfdGV4dCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9jb2ZmX2RhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfY29mZl9pZGVudCBQQVJBTVMgKChpbnQpKTsKLXZvaWQgb2JqX2NvZmZfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLQotLyogU2VjdGlvbiBzdHVmZgotCi0gICBXZSBhbGxvdyBtb3JlIHRoYW4ganVzdCB0aGUgc3RhbmRhcmQgMyBzZWN0aW9ucywgaW5mYWN0LCB3ZSBhbGxvdwotICAgNDAgc2VjdGlvbnMsICh0aG91Z2ggdGhlIHVzdWFsIHRocmVlIGhhdmUgdG8gYmUgdGhlcmUpLgotCi0gICBUaGlzIHN0cnVjdHVyZSBwZXJmb3JtcyB0aGUgbWFwcGluZ3MgZm9yIHVzOgotKi8KLQotCi10eXBlZGVmIHN0cnVjdAotewotICBzZWdUIHNlZ190OwotICBpbnQgaTsKLX0gc2VnX2luZm9fdHlwZTsKLQotc3RhdGljIGNvbnN0IHNlZ19pbmZvX3R5cGUgc2VnX2luZm9fb2ZmX2J5XzRbXSA9Ci17Ci0ge1NFR19QVFYsICB9LAotIHtTRUdfTlRWLCAgfSwKLSB7U0VHX0RFQlVHLCB9LAotIHtTRUdfQUJTT0xVVEUsICB9LAotIHtTRUdfVU5LTk9XTiwJIH0sCi0ge1NFR19FMH0sIHtTRUdfRTF9LCB7U0VHX0UyfSwge1NFR19FM30sIHtTRUdfRTR9LAotIHtTRUdfRTV9LCB7U0VHX0U2fSwge1NFR19FN30sIHtTRUdfRTh9LCB7U0VHX0U5fSwKLSB7U0VHX0UxMH0se1NFR19FMTF9LHtTRUdfRTEyfSx7U0VHX0UxM30se1NFR19FMTR9LAotIHtTRUdfRTE1fSx7U0VHX0UxNn0se1NFR19FMTd9LHtTRUdfRTE4fSx7U0VHX0UxOX0sCi0ge1NFR19FMjB9LHtTRUdfRTIxfSx7U0VHX0UyMn0se1NFR19FMjN9LHtTRUdfRTI0fSwKLSB7U0VHX0UyNX0se1NFR19FMjZ9LHtTRUdfRTI3fSx7U0VHX0UyOH0se1NFR19FMjl9LAotIHtTRUdfRTMwfSx7U0VHX0UzMX0se1NFR19FMzJ9LHtTRUdfRTMzfSx7U0VHX0UzNH0sCi0ge1NFR19FMzV9LHtTRUdfRTM2fSx7U0VHX0UzN30se1NFR19FMzh9LHtTRUdfRTM5fSwKLSB7KHNlZ1QpNDB9LAotIHsoc2VnVCk0MX0sCi0geyhzZWdUKTQyfSwKLSB7KHNlZ1QpNDN9LAotIHsoc2VnVCk0NH0sCi0geyhzZWdUKTQ1fSwKLSB7KHNlZ1QpMH0sCi0geyhzZWdUKTB9LAotIHsoc2VnVCkwfSwKLSB7U0VHX1JFR0lTVEVSfQotfTsKLQotCi0KLSNkZWZpbmUgU0VHX0lORk9fRlJPTV9TRUNUSU9OX05VTUJFUih4KSAoc2VnX2luZm9fb2ZmX2J5XzRbKHgpKzRdKQotCi1zdGF0aWMgcmVsYXhfYWRkcmVzc1QKLXJlbGF4X2FsaWduIChhZGRyZXNzLCBhbGlnbm1lbnQpCi0gICAgIHJlbGF4X2FkZHJlc3NUIGFkZHJlc3M7Ci0gICAgIGxvbmcgYWxpZ25tZW50OwotewotICByZWxheF9hZGRyZXNzVCBtYXNrOwotICByZWxheF9hZGRyZXNzVCBuZXdfYWRkcmVzczsKLQotICBtYXNrID0gfigofjApIDw8IGFsaWdubWVudCk7Ci0gIG5ld19hZGRyZXNzID0gKGFkZHJlc3MgKyBtYXNrKSAmICh+bWFzayk7Ci0gIHJldHVybiAobmV3X2FkZHJlc3MgLSBhZGRyZXNzKTsKLX0KLQotCi1zZWdUCi1zX2dldF9zZWdtZW50ICh4KQotICAgICBzeW1ib2xTICogeDsKLXsKLSAgcmV0dXJuIFNFR19JTkZPX0ZST01fU0VDVElPTl9OVU1CRVIgKHgtPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSkuc2VnX3Q7Ci19Ci0KLS8qIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgZnJhZyBjaGFpbiBhbmQgZmlsbCBpbiB0aGUgc2VjdGlvbiBoZWFkZXIKLSAgIHRvIGNvbnRhaW4gYWxsIG9mIGl0LCBhbHNvIGZpbGwgaW4gdGhlIGFkZHIgb2YgdGhlIHNlY3Rpb25zICovCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1zaXplX3NlY3Rpb24gKGFiZmQsIGlkeCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGlkeDsKLXsKLQotICB1bnNpZ25lZCBpbnQgc2l6ZSA9IDA7Ci0gIGZyYWdTICpmcmFnID0gc2VnbWVudF9pbmZvW2lkeF0uZnJjaGFpblAtPmZyY2hfcm9vdDsKLSAgd2hpbGUgKGZyYWcpCi0gICAgewotICAgICAgc2l6ZSA9IGZyYWctPmZyX2FkZHJlc3M7Ci0gICAgICBpZiAoZnJhZy0+ZnJfYWRkcmVzcyAhPSBzaXplKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiT3V0IG9mIHN0ZXBcbiIpKTsKLQkgIHNpemUgPSBmcmFnLT5mcl9hZGRyZXNzOwotCX0KLQotICAgICAgc3dpdGNoIChmcmFnLT5mcl90eXBlKQotCXsKLSNpZmRlZiBUQ19DT0ZGX1NJWkVNQUNIREVQCi0JY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKLQkgIHNpemUgKz0gVENfQ09GRl9TSVpFTUFDSERFUCAoZnJhZyk7Ci0JICBicmVhazsKLSNlbmRpZgotCWNhc2UgcnNfc3BhY2U6Ci0JICBhc3NlcnQgKGZyYWctPmZyX3N5bWJvbCA9PSAwKTsKLQljYXNlIHJzX2ZpbGw6Ci0JY2FzZSByc19vcmc6Ci0JICBzaXplICs9IGZyYWctPmZyX2ZpeDsKLQkgIHNpemUgKz0gZnJhZy0+ZnJfb2Zmc2V0ICogZnJhZy0+ZnJfdmFyOwotCSAgYnJlYWs7Ci0JY2FzZSByc19hbGlnbjoKLQljYXNlIHJzX2FsaWduX2NvZGU6Ci0JICB7Ci0JICAgIGFkZHJlc3NUIG9mZjsKLQotCSAgICBzaXplICs9IGZyYWctPmZyX2ZpeDsKLQkgICAgb2ZmID0gcmVsYXhfYWxpZ24gKHNpemUsIGZyYWctPmZyX29mZnNldCk7Ci0JICAgIGlmIChmcmFnLT5mcl9zdWJ0eXBlICE9IDAgJiYgb2ZmID4gZnJhZy0+ZnJfc3VidHlwZSkKLQkgICAgICBvZmYgPSAwOwotCSAgICBzaXplICs9IG9mZjsKLQkgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBCQURfQ0FTRSAoZnJhZy0+ZnJfdHlwZSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBmcmFnID0gZnJhZy0+ZnJfbmV4dDsKLSAgICB9Ci0gIHNlZ21lbnRfaW5mb1tpZHhdLnNjbmhkci5zX3NpemUgPSBzaXplOwotICByZXR1cm4gc2l6ZTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb3VudF9lbnRyaWVzX2luX2NoYWluIChpZHgpCi0gICAgIHVuc2lnbmVkIGludCBpZHg7Ci17Ci0gIHVuc2lnbmVkIGludCBucmVsb2NzOwotICBmaXhTICpmaXh1cF9wdHI7Ci0KLSAgLyogQ291bnQgdGhlIHJlbG9jYXRpb25zICovCi0gIGZpeHVwX3B0ciA9IHNlZ21lbnRfaW5mb1tpZHhdLmZpeF9yb290OwotICBucmVsb2NzID0gMDsKLSAgd2hpbGUgKGZpeHVwX3B0ciAhPSAoZml4UyAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChmaXh1cF9wdHItPmZ4X2RvbmUgPT0gMCAmJiBUQ19DT1VOVF9SRUxPQyAoZml4dXBfcHRyKSkKLQl7Ci0jaWZkZWYgVENfQTI5SwotCSAgaWYgKGZpeHVwX3B0ci0+Znhfcl90eXBlID09IFJFTE9DX0NPTlNUSCkKLQkgICAgbnJlbG9jcyArPSAyOwotCSAgZWxzZQotCSAgICBucmVsb2NzKys7Ci0jZWxzZQotCSAgbnJlbG9jcysrOwotI2VuZGlmCi0JfQotCi0gICAgICBmaXh1cF9wdHIgPSBmaXh1cF9wdHItPmZ4X25leHQ7Ci0gICAgfQotICByZXR1cm4gbnJlbG9jczsKLX0KLQotI2lmZGVmIFRFX0FVWAotCi1zdGF0aWMgaW50IGNvbXBhcmVfZXh0ZXJuYWxfcmVsb2NzIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLS8qIEFVWCdzIGxkIGV4cGVjdHMgcmVsb2NhdGlvbnMgdG8gYmUgc29ydGVkICovCi1zdGF0aWMgaW50Ci1jb21wYXJlX2V4dGVybmFsX3JlbG9jcyAoeCwgeSkKLSAgICAgY29uc3QgUFRSIHg7Ci0gICAgIGNvbnN0IFBUUiB5OwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmEgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIHg7Ci0gIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqYiA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgeTsKLSAgYmZkX3ZtYSBhYWRyID0gYmZkX2dldGIzMiAoYS0+cl92YWRkcik7Ci0gIGJmZF92bWEgYmFkciA9IGJmZF9nZXRiMzIgKGItPnJfdmFkZHIpOwotICByZXR1cm4gKGFhZHIgPCBiYWRyID8gLTEgOiBiYWRyIDwgYWFkciA/IDEgOiAwKTsKLX0KLQotI2VuZGlmCi0KLS8qIG91dHB1dCBhbGwgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24gKi8KLXZvaWQKLWRvX3JlbG9jc19mb3IgKGFiZmQsIGgsIGZpbGVfY3Vyc29yKQotICAgICBiZmQgKiBhYmZkOwotICAgICBvYmplY3RfaGVhZGVycyAqIGg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmZpbGVfY3Vyc29yOwotewotICB1bnNpZ25lZCBpbnQgbnJlbG9jczsKLSAgdW5zaWduZWQgaW50IGlkeDsKLSAgdW5zaWduZWQgbG9uZyByZWxvY19zdGFydCA9ICpmaWxlX2N1cnNvcjsKLQotICBmb3IgKGlkeCA9IFNFR19FMDsgaWR4IDwgU0VHX0xBU1Q7IGlkeCsrKQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50X2luZm9baWR4XS5zY25oZHIuc19uYW1lWzBdKQotCXsKLQkgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3B0cjsKLQkgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0ZXJuYWxfcmVsb2NfdmVjOwotCSAgdW5zaWduZWQgaW50IGV4dGVybmFsX3JlbG9jX3NpemU7Ci0JICB1bnNpZ25lZCBpbnQgYmFzZSA9IHNlZ21lbnRfaW5mb1tpZHhdLnNjbmhkci5zX3BhZGRyOwotCSAgZml4UyAqZml4X3B0ciA9IHNlZ21lbnRfaW5mb1tpZHhdLmZpeF9yb290OwotCSAgbnJlbG9jcyA9IGNvdW50X2VudHJpZXNfaW5fY2hhaW4gKGlkeCk7Ci0KLQkgIGlmIChucmVsb2NzKQotCSAgICAvKiBCeXBhc3MgdGhpcyBzdHVmZiBpZiBubyByZWxvY3MuICBUaGlzIGFsc28gaW5jaWRlbnRhbGx5Ci0JICAgICAgIGF2b2lkcyBhIFNDTyBidWcsIHdoZXJlIGZyZWUobWFsbG9jKDApKSB0ZW5kcyB0byBjcmFzaC4gICovCi0JICAgIHsKLQkgICAgICBleHRlcm5hbF9yZWxvY19zaXplID0gbnJlbG9jcyAqIFJFTFNaOwotCSAgICAgIGV4dGVybmFsX3JlbG9jX3ZlYyA9Ci0JCShzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgbWFsbG9jIChleHRlcm5hbF9yZWxvY19zaXplKTsKLQotCSAgICAgIGV4dF9wdHIgPSBleHRlcm5hbF9yZWxvY192ZWM7Ci0KLQkgICAgICAvKiBGaWxsIGluIHRoZSBpbnRlcm5hbCBjb2ZmIHN0eWxlIHJlbG9jIHN0cnVjdCBmcm9tIHRoZQotCQkgaW50ZXJuYWwgZml4IGxpc3QuICAqLwotCSAgICAgIHdoaWxlIChmaXhfcHRyKQotCQl7Ci0JCSAgc3RydWN0IGludGVybmFsX3JlbG9jIGludHI7Ci0KLQkJICAvKiBPbmx5IG91dHB1dCBzb21lIG9mIHRoZSByZWxvY2F0aW9ucyAqLwotCQkgIGlmIChmaXhfcHRyLT5meF9kb25lID09IDAgJiYgVENfQ09VTlRfUkVMT0MgKGZpeF9wdHIpKQotCQkgICAgewotI2lmZGVmIFRDX1JFTE9DX01BTkdMRQotCQkgICAgICBUQ19SRUxPQ19NQU5HTEUgKCZzZWdtZW50X2luZm9baWR4XSwgZml4X3B0ciwgJmludHIsCi0JCQkJICAgICAgIGJhc2UpOwotCi0jZWxzZQotCQkgICAgICBzeW1ib2xTICpkb3Q7Ci0JCSAgICAgIHN5bWJvbFMgKnN5bWJvbF9wdHIgPSBmaXhfcHRyLT5meF9hZGRzeTsKLQotCQkgICAgICBpbnRyLnJfdHlwZSA9IFRDX0NPRkZfRklYMlJUWVBFIChmaXhfcHRyKTsKLQkJICAgICAgaW50ci5yX3ZhZGRyID0KLQkJCWJhc2UgKyBmaXhfcHRyLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4X3B0ci0+Znhfd2hlcmU7Ci0KLSNpZmRlZiBUQ19LRUVQX0ZYX09GRlNFVAotCQkgICAgICBpbnRyLnJfb2Zmc2V0ID0gZml4X3B0ci0+Znhfb2Zmc2V0OwotI2Vsc2UKLQkJICAgICAgaW50ci5yX29mZnNldCA9IDA7Ci0jZW5kaWYKLQotCQkgICAgICB3aGlsZSAoc3ltYm9sX3B0ci0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCQkJICAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bWJvbF9wdHIpCi0JCQkJIHx8IFNfSVNfQ09NTU9OIChzeW1ib2xfcHRyKSkpCi0JCQl7Ci0JCQkgIHN5bWJvbFMgKm47Ci0KLQkJCSAgLyogV2UgbXVzdCBhdm9pZCBsb29waW5nLCBhcyB0aGF0IGNhbiBvY2N1cgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgYmFkbHkgd3JpdHRlbiBwcm9ncmFtLiAgKi8KLQkJCSAgbiA9IHN5bWJvbF9wdHItPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbDsKLQkJCSAgaWYgKG4gPT0gc3ltYm9sX3B0cikKLQkJCSAgICBicmVhazsKLQkJCSAgc3ltYm9sX3B0ciA9IG47Ci0JCQl9Ci0KLQkJICAgICAgLyogVHVybiB0aGUgc2VnbWVudCBvZiB0aGUgc3ltYm9sIGludG8gYW4gb2Zmc2V0LiAgKi8KLQkJICAgICAgaWYgKHN5bWJvbF9wdHIpCi0JCQl7Ci0JCQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1ib2xfcHRyLCAxKTsKLQkJCSAgaWYgKCEgc3ltYm9sX3B0ci0+c3lfcmVzb2x2ZWQpCi0JCQkgICAgewotCQkJICAgICAgY2hhciAqZmlsZTsKLQkJCSAgICAgIHVuc2lnbmVkIGludCBsaW5lOwotCi0JCQkgICAgICBpZiAoZXhwcl9zeW1ib2xfd2hlcmUgKHN5bWJvbF9wdHIsICZmaWxlLCAmbGluZSkpCi0JCQkJYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLAotCQkJCQkgICAgICBfKCJ1bnJlc29sdmVkIHJlbG9jYXRpb24iKSk7Ci0JCQkgICAgICBlbHNlCi0JCQkJYXNfYmFkIChfKCJiYWQgcmVsb2NhdGlvbjogc3ltYm9sIGAlcycgbm90IGluIHN5bWJvbCB0YWJsZSIpLAotCQkJCQlTX0dFVF9OQU1FIChzeW1ib2xfcHRyKSk7Ci0JCQkgICAgfQotCQkJICBkb3QgPSBzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVCAoc3ltYm9sX3B0cildLmRvdDsKLQkJCSAgaWYgKGRvdCkKLQkJCSAgICB7Ci0JCQkgICAgICBpbnRyLnJfc3ltbmR4ID0gZG90LT5zeV9udW1iZXI7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgaW50ci5yX3N5bW5keCA9IHN5bWJvbF9wdHItPnN5X251bWJlcjsKLQkJCSAgICB9Ci0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBpbnRyLnJfc3ltbmR4ID0gLTE7Ci0JCQl9Ci0jZW5kaWYKLQotCQkgICAgICAodm9pZCkgYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsICZpbnRyLCBleHRfcHRyKTsKLQkJICAgICAgZXh0X3B0cisrOwotCi0jaWYgZGVmaW5lZChUQ19BMjlLKQotCi0JCSAgICAgIC8qIFRoZSAyOWsgaGFzIGEgc3BlY2lhbCBrbHVkZ2UgZm9yIHRoZSBoaWdoIDE2IGJpdAotCQkJIHJlbG9jLiAgVHdvIHJlbG9jYXRpb25zIGFyZSBlbWl0ZWQsIFJfSUhJSEFMRiwKLQkJCSBhbmQgUl9JSENPTlNULiBUaGUgc2Vjb25kIG9uZSBkb2Vzbid0IGNvbnRhaW4gYQotCQkJIHN5bWJvbCwgYnV0IHVzZXMgdGhlIHZhbHVlIGZvciBvZmZzZXQuICAqLwotCi0JCSAgICAgIGlmIChpbnRyLnJfdHlwZSA9PSBSX0lISUhBTEYpCi0JCQl7Ci0JCQkgIC8qIG5vdyBlbWl0IHRoZSBzZWNvbmQgYml0ICovCi0JCQkgIGludHIucl90eXBlID0gUl9JSENPTlNUOwotCQkJICBpbnRyLnJfc3ltbmR4ID0gZml4X3B0ci0+ZnhfYWRkbnVtYmVyOwotCQkJICAodm9pZCkgYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsICZpbnRyLCBleHRfcHRyKTsKLQkJCSAgZXh0X3B0cisrOwotCQkJfQotI2VuZGlmCi0JCSAgICB9Ci0KLQkJICBmaXhfcHRyID0gZml4X3B0ci0+ZnhfbmV4dDsKLQkJfQotCi0jaWZkZWYgVEVfQVVYCi0JICAgICAgLyogU29ydCB0aGUgcmVsb2MgdGFibGUgKi8KLQkgICAgICBxc29ydCAoKFBUUikgZXh0ZXJuYWxfcmVsb2NfdmVjLCBucmVsb2NzLAotCQkgICAgIHNpemVvZiAoc3RydWN0IGV4dGVybmFsX3JlbG9jKSwgY29tcGFyZV9leHRlcm5hbF9yZWxvY3MpOwotI2VuZGlmCi0KLQkgICAgICAvKiBXcml0ZSBvdXQgdGhlIHJlbG9jIHRhYmxlICovCi0JICAgICAgYmZkX3dyaXRlICgoUFRSKSBleHRlcm5hbF9yZWxvY192ZWMsIDEsIGV4dGVybmFsX3JlbG9jX3NpemUsCi0JCQkgYWJmZCk7Ci0JICAgICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NfdmVjKTsKLQotCSAgICAgIC8qIEZpbGwgaW4gc2VjdGlvbiBoZWFkZXIgaW5mby4gICovCi0JICAgICAgc2VnbWVudF9pbmZvW2lkeF0uc2NuaGRyLnNfcmVscHRyID0gKmZpbGVfY3Vyc29yOwotCSAgICAgICpmaWxlX2N1cnNvciArPSBleHRlcm5hbF9yZWxvY19zaXplOwotCSAgICAgIHNlZ21lbnRfaW5mb1tpZHhdLnNjbmhkci5zX25yZWxvYyA9IG5yZWxvY3M7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIE5vIHJlbG9jcyAqLwotCSAgICAgIHNlZ21lbnRfaW5mb1tpZHhdLnNjbmhkci5zX3JlbHB0ciA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKiBTZXQgcmVsb2NhdGlvbl9zaXplIGZpZWxkIGluIGZpbGUgaGVhZGVycyAqLwotICBIX1NFVF9SRUxPQ0FUSU9OX1NJWkUgKGgsICpmaWxlX2N1cnNvciAtIHJlbG9jX3N0YXJ0LCAwKTsKLX0KLQotCi0vKiBydW4gdGhyb3VnaCBhIGZyYWcgY2hhaW4gYW5kIHdyaXRlIG91dCB0aGUgZGF0YSB0byBnbyB3aXRoIGl0LCBmaWxsCi0gICBpbiB0aGUgc2NuaGRycyB3aXRoIHRoZSBpbmZvIG9uIHRoZSBmaWxlIHBvc3Rpb25zCi0qLwotc3RhdGljIHZvaWQKLWZpbGxfc2VjdGlvbiAoYWJmZCwgaCwgZmlsZV9jdXJzb3IpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIG9iamVjdF9oZWFkZXJzICpoOwotICAgICB1bnNpZ25lZCBsb25nICpmaWxlX2N1cnNvcjsKLXsKLQotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IHBhZGRyID0gMDsKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQgPSAwOwotICAgICAgc3RydWN0IGludGVybmFsX3NjbmhkciAqcyA9ICYoc2VnbWVudF9pbmZvW2ldLnNjbmhkcik7Ci0KLSAgICAgIFBST0dSRVNTICgxKTsKLQotICAgICAgaWYgKHMtPnNfbmFtZVswXSkKLQl7Ci0JICBmcmFnUyAqZnJhZyA9IHNlZ21lbnRfaW5mb1tpXS5mcmNoYWluUC0+ZnJjaF9yb290OwotCSAgY2hhciAqYnVmZmVyOwotCi0JICBpZiAocy0+c19zaXplID09IDApCi0JICAgIHMtPnNfc2NucHRyID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJ1ZmZlciA9IHhtYWxsb2MgKHMtPnNfc2l6ZSk7Ci0JICAgICAgcy0+c19zY25wdHIgPSAqZmlsZV9jdXJzb3I7Ci0JICAgIH0KLQkgIGtub3cgKHMtPnNfcGFkZHIgPT0gcGFkZHIpOwotCi0JICBpZiAoc3RyY21wIChzLT5zX25hbWUsICIudGV4dCIpID09IDApCi0JICAgIHMtPnNfZmxhZ3MgfD0gU1RZUF9URVhUOwotCSAgZWxzZSBpZiAoc3RyY21wIChzLT5zX25hbWUsICIuZGF0YSIpID09IDApCi0JICAgIHMtPnNfZmxhZ3MgfD0gU1RZUF9EQVRBOwotCSAgZWxzZSBpZiAoc3RyY21wIChzLT5zX25hbWUsICIuYnNzIikgPT0gMCkKLQkgICAgewotCSAgICAgIHMtPnNfc2NucHRyID0gMDsKLQkgICAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfQlNTOwotCi0JICAgICAgLyogQEAgU2hvdWxkIG1ha2UgdGhlIGkzODYgYW5kIGEyOWsgY29mZiB0YXJnZXRzIGRlZmluZQotCQkgQ09GRl9OT0xPQURfUFJPQkxFTSwgYW5kIGhhdmUgb25seSBvbmUgdGVzdCBoZXJlLiAgKi8KLSNpZm5kZWYgVENfSTM4NgotI2lmbmRlZiBUQ19BMjlLCi0jaWZuZGVmIENPRkZfTk9MT0FEX1BST0JMRU0KLQkgICAgICAvKiBBcHBhcmVudGx5IHRoZSBTVlIzIGxpbmtlciAoYW5kIGV4ZWMgc3lzY2FsbCkgYW5kIFVESQotCQkgbW9uZGZlIHByb2dyZW0gYXJlIGNvbmZ1c2VkIGJ5IG5vbG9hZCBzZWN0aW9ucy4gICovCi0JICAgICAgcy0+c19mbGFncyB8PSBTVFlQX05PTE9BRDsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChzLT5zX25hbWUsICIubGl0IikgPT0gMCkKLQkgICAgcy0+c19mbGFncyA9IFNUWVBfTElUIHwgU1RZUF9URVhUOwotCSAgZWxzZSBpZiAoc3RyY21wIChzLT5zX25hbWUsICIuaW5pdCIpID09IDApCi0JICAgIHMtPnNfZmxhZ3MgfD0gU1RZUF9URVhUOwotCSAgZWxzZSBpZiAoc3RyY21wIChzLT5zX25hbWUsICIuZmluaSIpID09IDApCi0JICAgIHMtPnNfZmxhZ3MgfD0gU1RZUF9URVhUOwotCSAgZWxzZSBpZiAoc3RybmNtcCAocy0+c19uYW1lLCAiLmNvbW1lbnQiLCA4KSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfSU5GTzsKLQotCSAgd2hpbGUgKGZyYWcpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgZmlsbF9zaXplOwotCSAgICAgIHN3aXRjaCAoZnJhZy0+ZnJfdHlwZSkKLQkJewotCQljYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50OgotCQkgIGlmIChmcmFnLT5mcl9maXgpCi0JCSAgICB7Ci0JCSAgICAgIG1lbWNweSAoYnVmZmVyICsgZnJhZy0+ZnJfYWRkcmVzcywKLQkJCSAgICAgIGZyYWctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAodW5zaWduZWQgaW50KSBmcmFnLT5mcl9maXgpOwotCQkgICAgICBvZmZzZXQgKz0gZnJhZy0+ZnJfZml4OwotCQkgICAgfQotCi0JCSAgYnJlYWs7Ci0JCWNhc2UgcnNfc3BhY2U6Ci0JCSAgYXNzZXJ0IChmcmFnLT5mcl9zeW1ib2wgPT0gMCk7Ci0JCWNhc2UgcnNfZmlsbDoKLQkJY2FzZSByc19hbGlnbjoKLQkJY2FzZSByc19hbGlnbl9jb2RlOgotCQljYXNlIHJzX29yZzoKLQkJICBpZiAoZnJhZy0+ZnJfZml4KQotCQkgICAgewotCQkgICAgICBtZW1jcHkgKGJ1ZmZlciArIGZyYWctPmZyX2FkZHJlc3MsCi0JCQkgICAgICBmcmFnLT5mcl9saXRlcmFsLAotCQkJICAgICAgKHVuc2lnbmVkIGludCkgZnJhZy0+ZnJfZml4KTsKLQkJICAgICAgb2Zmc2V0ICs9IGZyYWctPmZyX2ZpeDsKLQkJICAgIH0KLQotCQkgIGZpbGxfc2l6ZSA9IGZyYWctPmZyX3ZhcjsKLQkJICBpZiAoZmlsbF9zaXplICYmIGZyYWctPmZyX29mZnNldCA+IDApCi0JCSAgICB7Ci0JCSAgICAgIHVuc2lnbmVkIGludCBjb3VudDsKLQkJICAgICAgdW5zaWduZWQgaW50IG9mZiA9IGZyYWctPmZyX2ZpeDsKLQkJICAgICAgZm9yIChjb3VudCA9IGZyYWctPmZyX29mZnNldDsgY291bnQ7IGNvdW50LS0pCi0JCQl7Ci0JCQkgIGlmIChmaWxsX3NpemUgKyBmcmFnLT5mcl9hZGRyZXNzICsgb2ZmIDw9IHMtPnNfc2l6ZSkKLQkJCSAgICB7Ci0JCQkgICAgICBtZW1jcHkgKGJ1ZmZlciArIGZyYWctPmZyX2FkZHJlc3MgKyBvZmYsCi0JCQkJICAgICAgZnJhZy0+ZnJfbGl0ZXJhbCArIGZyYWctPmZyX2ZpeCwKLQkJCQkgICAgICBmaWxsX3NpemUpOwotCQkJICAgICAgb2ZmICs9IGZpbGxfc2l6ZTsKLQkJCSAgICAgIG9mZnNldCArPSBmaWxsX3NpemU7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQkgIGJyZWFrOwotCQljYXNlIHJzX2Jyb2tlbl93b3JkOgotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgZnJhZyA9IGZyYWctPmZyX25leHQ7Ci0JICAgIH0KLQotCSAgaWYgKHMtPnNfc2l6ZSAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHMtPnNfc2NucHRyICE9IDApCi0JCXsKLQkJICBiZmRfd3JpdGUgKGJ1ZmZlciwgcy0+c19zaXplLCAxLCBhYmZkKTsKLQkJICAqZmlsZV9jdXJzb3IgKz0gcy0+c19zaXplOwotCQl9Ci0JICAgICAgZnJlZSAoYnVmZmVyKTsKLQkgICAgfQotCSAgcGFkZHIgKz0gcy0+c19zaXplOwotCX0KLSAgICB9Ci19Ci0KLS8qIENvZmYgZmlsZSBnZW5lcmF0aW9uICYgdXRpbGl0aWVzICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX2hlYWRlcl9hcHBlbmQgKGFiZmQsIGgpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIG9iamVjdF9oZWFkZXJzICogaDsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGNoYXIgYnVmZmVyWzEwMDBdOwotICBjaGFyIGJ1ZmZlcm9bMTAwMF07Ci0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgdW5zaWduZWQgbG9uZyBzdHJpbmdfc2l6ZSA9IDQ7Ci0jZW5kaWYKLQotICBiZmRfc2VlayAoYWJmZCwgMCwgMCk7Ci0KLSNpZm5kZWYgT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIKLSAgSF9TRVRfTUFHSUNfTlVNQkVSIChoLCBDT0ZGX01BR0lDKTsKLSAgSF9TRVRfVkVSU0lPTl9TVEFNUCAoaCwgMCk7Ci0gIEhfU0VUX0VOVFJZX1BPSU5UIChoLCAwKTsKLSAgSF9TRVRfVEVYVF9TVEFSVCAoaCwgc2VnbWVudF9pbmZvW1NFR19FMF0uZnJjaGFpblAtPmZyY2hfcm9vdC0+ZnJfYWRkcmVzcyk7Ci0gIEhfU0VUX0RBVEFfU1RBUlQgKGgsIHNlZ21lbnRfaW5mb1tTRUdfRTFdLmZyY2hhaW5QLT5mcmNoX3Jvb3QtPmZyX2FkZHJlc3MpOwotICBIX1NFVF9TSVpFT0ZfT1BUSU9OQUxfSEVBREVSIChoLCBiZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0KGFiZmQsICZoLT5hb3V0aGRyLAotCQkJCQkJCSAgICAgYnVmZmVybykpOwotI2Vsc2UgLyogZGVmaW5lZCAoT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIpICovCi0gIEhfU0VUX1NJWkVPRl9PUFRJT05BTF9IRUFERVIgKGgsIDApOwotI2VuZGlmIC8qIGRlZmluZWQgKE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSKSAqLwotCi0gIGkgPSBiZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0IChhYmZkLCAmaC0+ZmlsZWhkciwgYnVmZmVyKTsKLQotICBiZmRfd3JpdGUgKGJ1ZmZlciwgaSwgMSwgYWJmZCk7Ci0gIGJmZF93cml0ZSAoYnVmZmVybywgSF9HRVRfU0laRU9GX09QVElPTkFMX0hFQURFUiAoaCksIDEsIGFiZmQpOwotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19MQVNUOyBpKyspCi0gICAgewotICAgICAgaWYgKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19uYW1lWzBdKQotCXsKLQkgIHVuc2lnbmVkIGludCBzaXplOwotCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQkgIC8qIFN1cHBvcnQgbG9uZyBzZWN0aW9uIG5hbWVzIGFzIGZvdW5kIGluIFBFLiAgVGhpcyBjb2RlCi0gICAgICAgICAgICAgbXVzdCBjb29yZGluYXRlIHdpdGggdGhhdCBpbiB3cml0ZV9vYmplY3RfZmlsZSBhbmQKLSAgICAgICAgICAgICB3X3N0cmluZ3MuICAqLwotCSAgaWYgKHN0cmxlbiAoc2VnbWVudF9pbmZvW2ldLm5hbWUpID4gU0NOTk1MRU4pCi0JICAgIHsKLQkgICAgICBtZW1zZXQgKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19uYW1lLCAwLCBTQ05OTUxFTik7Ci0JICAgICAgc3ByaW50ZiAoc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWUsICIvJWx1Iiwgc3RyaW5nX3NpemUpOwotCSAgICAgIHN0cmluZ19zaXplICs9IHN0cmxlbiAoc2VnbWVudF9pbmZvW2ldLm5hbWUpICsgMTsKLQkgICAgfQotI2VuZGlmCi0KLQkgIHNpemUgPSBiZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQgKGFiZmQsCi0JCQkJCSAgICYoc2VnbWVudF9pbmZvW2ldLnNjbmhkciksCi0JCQkJCSAgIGJ1ZmZlcik7Ci0JICBpZiAoc2l6ZSA9PSAwKQotCSAgICBhc19iYWQgKF8oImJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCBmYWlsZWQiKSk7Ci0JICBiZmRfd3JpdGUgKGJ1ZmZlciwgc2l6ZSwgMSwgYWJmZCk7Ci0JfQotICAgIH0KLX0KLQotCi1jaGFyICoKLXN5bWJvbF90b19jaGFycyAoYWJmZCwgd2hlcmUsIHN5bWJvbFApCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGNoYXIgKndoZXJlOwotICAgICBzeW1ib2xTICogc3ltYm9sUDsKLXsKLSAgdW5zaWduZWQgaW50IG51bWF1eCA9IHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfZW50cnkubl9udW1hdXg7Ci0gIHVuc2lnbmVkIGludCBpOwotICB2YWx1ZVQgdmFsOwotCi0gIC8qIFR1cm4gYW55IHN5bWJvbHMgd2l0aCByZWdpc3RlciBhdHRyaWJ1dGVzIGludG8gYWJzIHN5bWJvbHMgKi8KLSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHJlZ19zZWN0aW9uKQotICAgIHsKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGFic29sdXRlX3NlY3Rpb24pOwotICAgIH0KLSAgLyogQXQgdGhlIHNhbWUgdGltZSwgcmVsb2NhdGUgYWxsIHN5bWJvbHMgdG8gdGhlaXIgb3V0cHV0IHZhbHVlICovCi0KLSNpZm5kZWYgVEVfUEUKLSAgdmFsID0gKHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UIChzeW1ib2xQKV0uc2NuaGRyLnNfcGFkZHIKLQkgKyBTX0dFVF9WQUxVRSAoc3ltYm9sUCkpOwotI2Vsc2UKLSAgdmFsID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotI2VuZGlmCi0KLSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsIHZhbCk7Ci0KLSAgc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3ZhbHVlID0gdmFsOwotCi0gIHdoZXJlICs9IGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgJnN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfZW50cnksCi0JCQkJICB3aGVyZSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG51bWF1eDsgaSsrKQotICAgIHsKLSAgICAgIHdoZXJlICs9IGJmZF9jb2ZmX3N3YXBfYXV4X291dCAoYWJmZCwKLQkJCQkgICAgICAmc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbaV0sCi0JCQkJICAgICAgU19HRVRfREFUQV9UWVBFIChzeW1ib2xQKSwKLQkJCQkgICAgICBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSwKLQkJCQkgICAgICBpLCBudW1hdXgsIHdoZXJlKTsKLSAgICB9Ci0gIHJldHVybiB3aGVyZTsKLQotfQotCi12b2lkCi1jb2ZmX29ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIGNoYXIgdW5kZXJzY29yZSA9IDA7CQkvKiBTeW1ib2wgaGFzIGxlYWRpbmcgXyAqLwotCi0gIC8qIEVmZmVjdGl2ZSBzeW1ib2wgKi8KLSAgLyogU3RvcmUgdGhlIHBvaW50ZXIgaW4gdGhlIG9mZnNldC4gKi8KLSAgU19TRVRfWkVST0VTIChzeW1ib2xQLCAwTCk7Ci0gIFNfU0VUX0RBVEFfVFlQRSAoc3ltYm9sUCwgVF9OVUxMKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgMCk7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDApOwotICAvKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uICovCi0gIHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfZmxhZ3MgPSAwOwotICAvKiBBdXhpbGlhcnkgZW50cmllcyAqLwotICBtZW1zZXQgKChjaGFyICopICZzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2F1eGVudFswXSwgMCwgQVVYRVNaKTsKLQotICBpZiAoU19JU19TVFJJTkcgKHN5bWJvbFApKQotICAgIFNGX1NFVF9TVFJJTkcgKHN5bWJvbFApOwotICBpZiAoIXVuZGVyc2NvcmUgJiYgU19JU19MT0NBTCAoc3ltYm9sUCkpCi0gICAgU0ZfU0VUX0xPQ0FMIChzeW1ib2xQKTsKLX0KLQotLyoKLSAqIEhhbmRsZSAubG4gZGlyZWN0aXZlcy4KLSAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfbG4gKGFwcGxpbmUpCi0gICAgIGludCBhcHBsaW5lOwotewotICBpbnQgbDsKLQotICBpZiAoISBhcHBsaW5lICYmIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIubG4gcHNldWRvLW9wIGluc2lkZSAuZGVmLy5lbmRlZjogaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogd3JvbmcgY29udGV4dCAqLwotCi0gIGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgY19saW5lX25ldyAoMCwgZnJhZ19ub3dfZml4ICgpLCBsLCBmcmFnX25vdyk7Ci0KLSAgaWYgKGFwcGxpbmUpCi0gICAgbmV3X2xvZ2ljYWxfbGluZSAoKGNoYXIgKikgTlVMTCwgbCAtIDEpOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgewotICAgIGV4dGVybiBpbnQgbGlzdGluZzsKLQotICAgIGlmIChsaXN0aW5nKQotICAgICAgewotCWlmICghIGFwcGxpbmUpCi0JICBsICs9IGxpbmVfYmFzZSAtIDE7Ci0JbGlzdGluZ19zb3VyY2VfbGluZSAoKHVuc2lnbmVkIGludCkgbCk7Ci0gICAgICB9Ci0KLSAgfQotI2VuZGlmCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qCi0gKgkJCWRlZigpCi0gKgotICogSGFuZGxlIC5kZWYgZGlyZWN0aXZlcy4KLSAqCi0gKiBPbmUgbWlnaHQgYXNrIDogd2h5IGNhbid0IHdlIHN5bWJvbF9uZXcgaWYgdGhlIHN5bWJvbCBkb2VzIG5vdAotICogYWxyZWFkeSBleGlzdCBhbmQgZmlsbCBpdCB3aXRoIGRlYnVnIGluZm9ybWF0aW9uLiAgQmVjYXVzZSBvZgotICogdGhlIENfRUZDTiBzcGVjaWFsIHN5bWJvbC4gSXQgd291bGQgY2xvYmJlciB0aGUgdmFsdWUgb2YgdGhlCi0gKiBmdW5jdGlvbiBzeW1ib2wgYmVmb3JlIHdlIGhhdmUgYSBjaGFuY2UgdG8gbm90aWNlIHRoYXQgaXQgaXMKLSAqIGEgQ19FRkNOLiBBbmQgYSBzZWNvbmQgcmVhc29uIGlzIHRoYXQgdGhlIGNvZGUgaXMgbW9yZSBjbGVhciB0aGlzCi0gKiB3YXkuIChhdCBsZWFzdCBJIHRoaW5rIGl0IGlzIDotKS4KLSAqCi0gKi8KLQotI2RlZmluZSBTS0lQX1NFTUlfQ09MT04oKQl3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICc7JykKLSNkZWZpbmUgU0tJUF9XSElURVNQQUNFUygpCXdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcgJyB8fCBcCi0JCQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXHQnKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfZGVmICh3aGF0KQotICAgICBpbnQgd2hhdDsKLXsKLSAgY2hhciBuYW1lX2VuZDsJCS8qIENoYXIgYWZ0ZXIgdGhlIGVuZCBvZiBuYW1lICovCi0gIGNoYXIgKnN5bWJvbF9uYW1lOwkJLyogTmFtZSBvZiB0aGUgZGVidWcgc3ltYm9sICovCi0gIGNoYXIgKnN5bWJvbF9uYW1lX2NvcHk7CS8qIFRlbXBvcmFyeSBjb3B5IG9mIHRoZSBuYW1lICovCi0gIHVuc2lnbmVkIGludCBzeW1ib2xfbmFtZV9sZW5ndGg7Ci0KLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZGVmIHBzZXVkby1vcCB1c2VkIGluc2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIFNLSVBfV0hJVEVTUEFDRVMgKCk7Ci0KLSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9IChzeW1ib2xTICopIG9ic3RhY2tfYWxsb2MgKCZub3Rlcywgc2l6ZW9mICgqZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpOwotICBtZW1zZXQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDAsIHNpemVvZiAoKmRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKTsKLQotICBzeW1ib2xfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltYm9sX25hbWVfbGVuZ3RoID0gc3RybGVuIChzeW1ib2xfbmFtZSk7Ci0gIHN5bWJvbF9uYW1lX2NvcHkgPSB4bWFsbG9jIChzeW1ib2xfbmFtZV9sZW5ndGggKyAxKTsKLSAgc3RyY3B5IChzeW1ib2xfbmFtZV9jb3B5LCBzeW1ib2xfbmFtZSk7Ci0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHN5bWJvbF9uYW1lX2NvcHkgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHN5bWJvbF9uYW1lX2NvcHkpOwotI2VuZGlmCi0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgbmV3IHN5bWJvbCAqLwotI2lmZGVmIFNUUklQX1VOREVSU0NPUkUKLSAgU19TRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgKCpzeW1ib2xfbmFtZV9jb3B5ID09ICdfJwotCQkJCSAgICAgICA/IHN5bWJvbF9uYW1lX2NvcHkgKyAxCi0JCQkJICAgICAgIDogc3ltYm9sX25hbWVfY29weSkpOwotI2Vsc2UgLyogU1RSSVBfVU5ERVJTQ09SRSAqLwotICBTX1NFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBzeW1ib2xfbmFtZV9jb3B5KTsKLSNlbmRpZiAvKiBTVFJJUF9VTkRFUlNDT1JFICovCi0gIC8qIGZyZWUoc3ltYm9sX25hbWVfY29weSk7ICovCi0gIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X25hbWVfb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpIH4wOwotICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV9udW1iZXIgPSB+MDsKLSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfZnJhZyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKLSAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDApOwotCi0gIGlmIChTX0lTX1NUUklORyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgU0ZfU0VUX1NUUklORyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXVuc2lnbmVkIGludCBkaW1faW5kZXg7Ci0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2VuZGVmIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFAgPSAwOwotICAvKiBESU0gQlVHIEZJWCBzYWNAY3lnbnVzLmNvbSAqLwotICBkaW1faW5kZXggPSAwOwotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5lbmRlZiBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgLyogU2V0IHRoZSBzZWN0aW9uIG51bWJlciBhY2NvcmRpbmcgdG8gc3RvcmFnZSBjbGFzcy4gKi8KLSAgc3dpdGNoIChTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICB7Ci0gICAgY2FzZSBDX1NUUlRBRzoKLSAgICBjYXNlIENfRU5UQUc6Ci0gICAgY2FzZSBDX1VOVEFHOgotICAgICAgU0ZfU0VUX1RBRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotICAgIGNhc2UgQ19GSUxFOgotICAgIGNhc2UgQ19UUERFRjoKLSAgICAgIFNGX1NFVF9ERUJVRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBTRUdfREVCVUcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfRUZDTjoKLSAgICAgIFNGX1NFVF9MT0NBTCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7CS8qIERvIG5vdCBlbWl0IHRoaXMgc3ltYm9sLiAqLwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIENfQkxPQ0s6Ci0gICAgICBTRl9TRVRfUFJPQ0VTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7CS8qIFdpbGwgbmVlZCBwcm9jZXNzaW5nIGJlZm9yZSB3cml0aW5nICovCi0gICAgICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotICAgIGNhc2UgQ19GQ046Ci0gICAgICBTX1NFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBTRUdfRTApOwotCi0gICAgICBpZiAoc3RyY21wIChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwgIi5iZiIpID09IDApCi0JewkJCS8qIC5iZiAqLwotCSAgaWYgKGZ1bmN0aW9uX2xpbmVvZmYgPCAwKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJgLmJmJyBzeW1ib2wgd2l0aG91dCBwcmVjZWRpbmcgZnVuY3Rpb25cbiIpKTsKLQkgICAgfQkJCS8qIG1pc3NpbmcgZnVuY3Rpb24gc3ltYm9sICovCi0JICBTQV9HRVRfU1lNX0xOTk9QVFIgKGxhc3RfbGluZV9zeW1ib2wpID0gZnVuY3Rpb25fbGluZW9mZjsKLQotCSAgU0ZfU0VUX1BST0NFU1MgKGxhc3RfbGluZV9zeW1ib2wpOwotCSAgU0ZfU0VUX0FESl9MTk5PUFRSIChsYXN0X2xpbmVfc3ltYm9sKTsKLQkgIFNGX1NFVF9QUk9DRVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQkgIGZ1bmN0aW9uX2xpbmVvZmYgPSAtMTsKLQl9Ci0gICAgICAvKiBWYWx1ZSBpcyBhbHdheXMgc2V0IHRvIC4gKi8KLSAgICAgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X2ZyYWcgPSBmcmFnX25vdzsKLSAgICAgIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBDX0FVVE9BUkcKLSAgICBjYXNlIENfQVVUT0FSRzoKLSNlbmRpZiAvKiBDX0FVVE9BUkcgKi8KLSAgICBjYXNlIENfQVVUTzoKLSAgICBjYXNlIENfUkVHOgotICAgIGNhc2UgQ19NT1M6Ci0gICAgY2FzZSBDX01PRToKLSAgICBjYXNlIENfTU9VOgotICAgIGNhc2UgQ19BUkc6Ci0gICAgY2FzZSBDX1JFR1BBUk06Ci0gICAgY2FzZSBDX0ZJRUxEOgotICAgIGNhc2UgQ19FT1M6Ci0gICAgICBTRl9TRVRfREVCVUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgYWJzb2x1dGVfc2VjdGlvbik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19FWFQ6Ci0gICAgY2FzZSBDX1dFQUtFWFQ6Ci0jaWZkZWYgVEVfUEUKLSAgICBjYXNlIENfTlRfV0VBSzoKLSNlbmRpZgotICAgIGNhc2UgQ19TVEFUOgotICAgIGNhc2UgQ19MQUJFTDoKLSAgICAgIC8qIFZhbGlkIGJ1dCBzZXQgc29tZXdoZXJlIGVsc2UgKHNfY29tbSwgc19sY29tbSwgY29sb24pICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19VU1RBVElDOgotICAgIGNhc2UgQ19FWFRERUY6Ci0gICAgY2FzZSBDX1VMQUJFTDoKLSAgICAgIGFzX3dhcm4gKF8oInVuZXhwZWN0ZWQgc3RvcmFnZSBjbGFzcyAlZCIpLCBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSk7Ci0gICAgICBicmVhazsKLSAgICB9CQkJCS8qIHN3aXRjaCBvbiBzdG9yYWdlIGNsYXNzICovCi0KLSAgLyogTm93IHRoYXQgd2UgaGF2ZSBidWlsdCBhIGRlYnVnIHN5bWJvbCwgdHJ5IHRvIGZpbmQgaWYgd2Ugc2hvdWxkCi0gICAgIG1lcmdlIHdpdGggYW4gZXhpc3Rpbmcgc3ltYm9sIG9yIG5vdC4gIElmIGEgc3ltYm9sIGlzIENfRUZDTiBvcgotICAgICBhYnNvbHV0ZV9zZWN0aW9uIG9yIHVudGFnZ2VkIFNFR19ERUJVRyBpdCBuZXZlciBtZXJnZXMuICBXZSBhbHNvCi0gICAgIGRvbid0IG1lcmdlIGxhYmVscywgd2hpY2ggYXJlIGluIGEgZGlmZmVyZW50IG5hbWVzcGFjZSwgbm9yCi0gICAgIHN5bWJvbHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW4gZGVmaW5lZCBzaW5jZSB0aGV5IGFyZSB0eXBpY2FsbHkKLSAgICAgdW5pcXVlLCBub3IgZG8gd2UgbWVyZ2UgdGFncyB3aXRoIG5vbi10YWdzLiAgKi8KLQotICAvKiBUd28gY2FzZXMgZm9yIGZ1bmN0aW9ucy4gIEVpdGhlciBkZWJ1ZyBmb2xsb3dlZCBieSBkZWZpbml0aW9uIG9yCi0gICAgIGRlZmluaXRpb24gZm9sbG93ZWQgYnkgZGVidWcuICBGb3IgZGVmaW5pdGlvbiBmaXJzdCwgd2Ugd2lsbAotICAgICBtZXJnZSB0aGUgZGVidWcgc3ltYm9sIGludG8gdGhlIGRlZmluaXRpb24uICBGb3IgZGVidWcgZmlyc3QsIHRoZQotICAgICBsaW5lbm8gZW50cnkgTVVTVCBwb2ludCB0byB0aGUgZGVmaW5pdGlvbiBmdW5jdGlvbiBvciBlbHNlIGl0Ci0gICAgIHdpbGwgcG9pbnQgb2ZmIGludG8gc3BhY2Ugd2hlbiBjcmF3bF9zeW1ib2xzKCkgbWVyZ2VzIHRoZSBkZWJ1ZwotICAgICBzeW1ib2wgaW50byB0aGUgcmVhbCBzeW1ib2wuICBUaGVyZWZvciwgbGV0J3MgcHJlc3VtZSB0aGUgZGVidWcKLSAgICAgc3ltYm9sIGlzIGEgcmVhbCBmdW5jdGlvbiByZWZlcmVuY2UuICovCi0KLSAgLyogRklYTUUtU09PTiBJZiBmb3Igc29tZSByZWFzb24gdGhlIGRlZmluaXRpb24gbGFiZWwvc3ltYm9sIGlzCi0gICAgIG5ldmVyIHNlZW4sIHRoaXMgd2lsbCBwcm9iYWJseSBsZWF2ZSBhbiB1bmRlZmluZWQgc3ltYm9sIGF0IGxpbmsKLSAgICAgdGltZS4gKi8KLQotICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gQ19FRkNOCi0gICAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSBDX0xBQkVMCi0gICAgICB8fCAoU19HRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gU0VHX0RFQlVHCi0JICAmJiAhU0ZfR0VUX1RBRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgICB8fCBTX0dFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSBhYnNvbHV0ZV9zZWN0aW9uCi0gICAgICB8fCBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV92YWx1ZS5YX29wICE9IE9fY29uc3RhbnQKLSAgICAgIHx8IChzeW1ib2xQID0gc3ltYm9sX2ZpbmRfYmFzZSAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksIERPX05PVF9TVFJJUCkpID09IE5VTEwKLSAgICAgIHx8IChTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSAhPSBTRl9HRVRfVEFHIChzeW1ib2xQKSkpCi0gICAgewotICAgICAgc3ltYm9sX2FwcGVuZCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sX2xhc3RQLCAmc3ltYm9sX3Jvb3RQLAotCQkgICAgICZzeW1ib2xfbGFzdFApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoaXMgc3ltYm9sIGFscmVhZHkgZXhpc3RzLCBtZXJnZSB0aGUgbmV3bHkgY3JlYXRlZCBzeW1ib2wKLQkgaW50byB0aGUgb2xkIG9uZS4gIFRoaXMgaXMgbm90IG1hbmRhdG9yeS4gVGhlIGxpbmtlciBjYW4KLQkgaGFuZGxlIGR1cGxpY2F0ZSBzeW1ib2xzIGNvcnJlY3RseS4gQnV0IEkgZ3Vlc3MgdGhhdCBpdCBzYXZlCi0JIGEgKmxvdCogb2Ygc3BhY2UgaWYgdGhlIGFzc2VtYmx5IGZpbGUgZGVmaW5lcyBhIGxvdCBvZgotCSBzeW1ib2xzLiBbbG9pY10gKi8KLQotICAgICAgLyogVGhlIGRlYnVnIGVudHJ5IChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSBpcyBtZXJnZWQgaW50byB0aGUKLQkgcHJldmlvdXMgZGVmaW5pdGlvbi4gICovCi0KLSAgICAgIGNfc3ltYm9sX21lcmdlIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBzeW1ib2xQKTsKLSAgICAgIC8qIEZJWE1FLVNPT04gU2hvdWxkICpkZWZfc3ltYm9sX2luX3Byb2dyZXNzIGJlIGZyZWUnZD8geG94b3JpY2guICovCi0gICAgICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzID0gc3ltYm9sUDsKLQotICAgICAgaWYgKFNGX0dFVF9GVU5DVElPTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykKLQkgIHx8IFNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpCi0JICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSBDX1NUQVQpCi0JewotCSAgLyogRm9yIGZ1bmN0aW9ucywgYW5kIHRhZ3MsIGFuZCBzdGF0aWMgc3ltYm9scywgdGhlIHN5bWJvbAotCSAgICAgKm11c3QqIGJlIHdoZXJlIHRoZSBkZWJ1ZyBzeW1ib2wgYXBwZWFycy4gIE1vdmUgdGhlCi0JICAgICBleGlzdGluZyBzeW1ib2wgdG8gdGhlIGN1cnJlbnQgcGxhY2UuICovCi0JICAvKiBJZiBpdCBhbHJlYWR5IGlzIGF0IHRoZSBlbmQgb2YgdGhlIHN5bWJvbCBsaXN0LCBkbyBub3RoaW5nICovCi0JICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyAhPSBzeW1ib2xfbGFzdFApCi0JICAgIHsKLQkgICAgICBzeW1ib2xfcmVtb3ZlIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAmc3ltYm9sX3Jvb3RQLAotCQkJICAgICAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICBzeW1ib2xfYXBwZW5kIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBzeW1ib2xfbGFzdFAsCi0JCQkgICAgICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICB9CQkJLyogaWYgbm90IGFscmVhZHkgaW4gcGxhY2UgKi8KLQl9CQkJLyogaWYgZnVuY3Rpb24gKi8KLSAgICB9CQkJCS8qIG5vcm1hbCBvciBtZXJnYWJsZSAqLwotCi0gIGlmIChTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpvbGR0YWc7Ci0KLSAgICAgIG9sZHRhZyA9IHN5bWJvbF9maW5kX2Jhc2UgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLAotCQkJCSBET19OT1RfU1RSSVApOwotICAgICAgaWYgKG9sZHRhZyA9PSBOVUxMIHx8ICEgU0ZfR0VUX1RBRyAob2xkdGFnKSkKLQl0YWdfaW5zZXJ0IChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwKLQkJICAgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgIH0KLQotICBpZiAoU0ZfR0VUX0ZVTkNUSU9OIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICB7Ci0gICAgICBrbm93IChzaXplb2YgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpIDw9IHNpemVvZiAobG9uZykpOwotICAgICAgZnVuY3Rpb25fbGluZW9mZgotCT0gY19saW5lX25ldyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMCwgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICAgICAgU0ZfU0VUX1BST0NFU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCi0gICAgICBpZiAoc3ltYm9sUCA9PSBOVUxMKQotCXsKLQkgIC8qIFRoYXQgaXMsIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UndmUgc2VlbiB0aGUKLQkgICAgIGZ1bmN0aW9uLi4uICovCi0JICBzeW1ib2xfdGFibGVfaW5zZXJ0IChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQl9CQkJLyogZGVmaW5pdGlvbiBmb2xsb3dzIGRlYnVnICovCi0gICAgfQkJCQkvKiBDcmVhdGUgdGhlIGxpbmUgbnVtYmVyIGVudHJ5IHBvaW50aW5nIHRvIHRoZSBmdW5jdGlvbiBiZWluZyBkZWZpbmVkICovCi0KLSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9IE5VTEw7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9kaW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IGRpbV9pbmRleDsKLQotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5kaW0gcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDEpOwotCi0gIGZvciAoZGltX2luZGV4ID0gMDsgZGltX2luZGV4IDwgRElNTlVNOyBkaW1faW5kZXgrKykKLSAgICB7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0VTICgpOwotICAgICAgU0FfU0VUX1NZTV9ESU1FTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZGltX2luZGV4LAotCQkJZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotCi0gICAgICBzd2l0Y2ggKCppbnB1dF9saW5lX3BvaW50ZXIpCi0JewotCWNhc2UgJywnOgotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhc193YXJuIChfKCJiYWRseSBmb3JtZWQgLmRpbSBkaXJlY3RpdmUgaWdub3JlZCIpKTsKLQkgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0JY2FzZSAnXG4nOgotCWNhc2UgJzsnOgotCSAgZGltX2luZGV4ID0gRElNTlVNOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfbGluZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgdGhpc19iYXNlOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgb2JqX2NvZmZfbG4gKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYW1lID0gU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gIHRoaXNfYmFzZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIC8qIE9ubHkgLmJmIHN5bWJvbHMgaW5kaWNhdGUgdGhlIHVzZSBvZiBhIG5ldyBiYXNlIGxpbmUgbnVtYmVyOyB0aGUKLSAgICAgbGluZSBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCAuZWYsIC5iYiwgLmViIGFyZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgc3RhcnQgb2YgdGhlIGNvbnRhaW5pbmcgZnVuY3Rpb24uICAqLwotICBpZiAoIXN0cmNtcCAoIi5iZiIsIG5hbWUpKQotICAgIHsKLSNpZiAwIC8qIFhYWCBDYW4gd2UgZXZlciBoYXZlIGxpbmUgbnVtYmVycyBnb2luZyBiYWNrd2FyZHM/ICAqLwotICAgICAgaWYgKHRoaXNfYmFzZSA+IGxpbmVfYmFzZSkKLSNlbmRpZgotCXsKLQkgIGxpbmVfYmFzZSA9IHRoaXNfYmFzZTsKLQl9Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICAgICAgewotCWV4dGVybiBpbnQgbGlzdGluZzsKLQlpZiAobGlzdGluZykKLQkgIHsKLQkgICAgbGlzdGluZ19zb3VyY2VfbGluZSAoKHVuc2lnbmVkIGludCkgbGluZV9iYXNlKTsKLQkgIH0KLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxKTsKLSAgU0FfU0VUX1NZTV9MTk5PIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCB0aGlzX2Jhc2UpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9zaXplIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnNpemUgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0gIFNBX1NFVF9TWU1fU0laRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfc2NsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnNjbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl90YWcgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqc3ltYm9sX25hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0KLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudGFnIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxKTsKLSAgc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHN5bWJvbF9uYW1lID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzeW1ib2xfbmFtZSk7Ci0jZW5kaWYKLQotICAvKiBBc3N1bWUgdGhhdCB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IC50YWcgaXMgYWx3YXlzIGRlZmluZWQuCi0gICAgIFRoaXMgd2FzIGEgYmFkIGFzc3VtcHRpb24uICBJJ3ZlIGFkZGVkIGZpbmRfb3JfbWFrZS4geG94b3JpY2guICovCi0gIFNBX1NFVF9TWU1fVEFHTkRYIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLAotCQkgICAgIChsb25nKSB0YWdfZmluZF9vcl9tYWtlIChzeW1ib2xfbmFtZSkpOwotICBpZiAoU0FfR0VUX1NZTV9UQUdORFggKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IDBMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oInRhZyBub3QgZm91bmQgZm9yIC50YWcgJXMiKSwgc3ltYm9sX25hbWUpOwotICAgIH0JCQkJLyogbm90IGRlZmluZWQgKi8KLQotICBTRl9TRVRfVEFHR0VEIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl90eXBlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnR5cGUgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfREFUQV9UWVBFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0KLSAgaWYgKElTRkNOIChTX0dFVF9EQVRBX1RZUEUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKSAmJgotICAgICAgU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgIT0gQ19UUERFRikKLSAgICB7Ci0gICAgICBTRl9TRVRfRlVOQ1RJT04gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgIH0JCQkJLyogaXMgYSBmdW5jdGlvbiAqLwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl92YWwgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudmFsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIGlmIChpc19uYW1lX2JlZ2lubmVyICgqaW5wdXRfbGluZV9wb2ludGVyKSkKLSAgICB7Ci0gICAgICBjaGFyICpzeW1ib2xfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGNoYXIgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICBzeW1ib2xfbmFtZSA9IHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAoc3ltYm9sX25hbWUpOwotI2VuZGlmCi0KLSAgICAgIGlmICghc3RyY21wIChzeW1ib2xfbmFtZSwgIi4iKSkKLQl7Ci0JICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV9mcmFnID0gZnJhZ19ub3c7Ci0JICBTX1NFVF9WQUxVRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLQkgIC8qIElmIHRoZSAudmFsIGlzICE9IGZyb20gdGhlIC5kZWYgKGUuZy4gc3RhdGljcykgKi8KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLCBzeW1ib2xfbmFtZSkpCi0JewotCSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfdmFsdWUuWF9vcCA9IE9fc3ltYm9sOwotCSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sID0KLQkgICAgc3ltYm9sX2ZpbmRfb3JfbWFrZSAoc3ltYm9sX25hbWUpOwotCSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfdmFsdWUuWF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyID0gMDsKLQotCSAgLyogSWYgdGhlIHNlZ21lbnQgaXMgdW5kZWZpbmVkIHdoZW4gdGhlIGZvcndhcmQgcmVmZXJlbmNlIGlzCi0JICAgICByZXNvbHZlZCwgdGhlbiBjb3B5IHRoZSBzZWdtZW50IGlkIGZyb20gdGhlIGZvcndhcmQKLQkgICAgIHN5bWJvbC4gICovCi0JICBTRl9TRVRfR0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCi0JICAvKiBGSVhNRTogZ2NjIGNhbiBnZW5lcmF0ZSBhZGRyZXNzIGV4cHJlc3Npb25zCi0JICAgICBoZXJlIGluIHVudXN1YWwgY2FzZXMgKHNlYXJjaCBmb3IgIm9ic2N1cmUiCi0JICAgICBpbiBzZGJvdXQuYykuICBXZSBqdXN0IGlnbm9yZSB0aGUgb2Zmc2V0Ci0JICAgICBoZXJlLCB0aHVzIGdlbmVyYXRpbmcgaW5jb3JyZWN0IGRlYnVnZ2luZwotCSAgICAgaW5mb3JtYXRpb24uICBXZSBpZ25vcmUgdGhlIHJlc3Qgb2YgdGhlCi0JICAgICBsaW5lIGp1c3QgYmVsb3cuICAqLwotCX0KLSAgICAgIC8qIE90aGVyd2lzZSwgaXQgaXMgdGhlIG5hbWUgb2YgYSBub24gZGVidWcgc3ltYm9sIGFuZAotCSBpdHMgdmFsdWUgd2lsbCBiZSBjYWxjdWxhdGVkIGxhdGVyLiAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gICAgICAvKiBGSVhNRTogdGhpcyBpcyB0byBhdm9pZCBhbiBlcnJvciBtZXNzYWdlIGluIHRoZQotCSBGSVhNRSBjYXNlIG1lbnRpb25lZCBqdXN0IGFib3ZlLiAgKi8KLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTX1NFVF9WQUxVRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywKLQkJICAgKHZhbHVlVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAgIH0JCQkJLyogaWYgc3ltYm9sIGJhc2VkICovCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2lmZGVmIFRFX1BFCi0KLS8qIEhhbmRsZSB0aGUgLmxpbmtvbmNlIHBzZXVkby1vcC4gIFRoaXMgaXMgcGFyc2VkIGJ5IHNfbGlua29uY2UgaW4KLSAgIHJlYWQuYywgd2hpY2ggdGhlbiBjYWxscyB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCBzcGVjaWZpYyByb3V0aW5lLiAgKi8KLQotdm9pZAotb2JqX2NvZmZfcGVfaGFuZGxlX2xpbmtfb25jZSAodHlwZSkKLSAgICAgZW51bSBsaW5rb25jZV90eXBlIHR5cGU7Ci17Ci0gIHNlZ19pbmZvIChub3dfc2VnKS0+c2NuaGRyLnNfZmxhZ3MgfD0gSU1BR0VfU0NOX0xOS19DT01EQVQ7Ci0KLSAgLyogV2Ugc3RvcmUgdGhlIHR5cGUgaW4gdGhlIHNlZ19pbmZvIHN0cnVjdHVyZSwgYW5kIHVzZSBpdCB0byBzZXQgdXAKLSAgICAgdGhlIGF1eGlsaWFyeSBlbnRyeSBmb3IgdGhlIHNlY3Rpb24gc3ltYm9sIGluIGNfc2VjdGlvbl9zeW1ib2wuICAqLwotICBzZWdfaW5mbyAobm93X3NlZyktPmxpbmtvbmNlID0gdHlwZTsKLX0KLQotI2VuZGlmIC8qIFRFX1BFICovCi0KLXZvaWQKLWNvZmZfb2JqX3JlYWRfYmVnaW5faG9vayAoKQotewotICAvKiBUaGVzZSBoYWQgYmV0dGVyIGJlIHRoZSBzYW1lLiAgVXN1YWxseSAxOCBieXRlcy4gKi8KLSNpZm5kZWYgQkZEX0hFQURFUlMKLSAga25vdyAoc2l6ZW9mIChTWU1FTlQpID09IHNpemVvZiAoQVVYRU5UKSk7Ci0gIGtub3cgKFNZTUVTWiA9PSBBVVhFU1opOwotI2VuZGlmCi0gIHRhZ19pbml0ICgpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHJ1bnMgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGFuZCBwdXRzIGFsbCB0aGUKLSAgIGV4dGVybmFscyBvbnRvIGFub3RoZXIgY2hhaW4gKi8KLQotLyogVGhlIGNoYWluIG9mIGdsb2JhbHMuICAqLwotc3ltYm9sUyAqc3ltYm9sX2dsb2JhbFA7Ci1zeW1ib2xTICpzeW1ib2xfZ2xvYmFsX2xhc3RQOwotCi0vKiBUaGUgY2hhaW4gb2YgZXh0ZXJuYWxzICovCi1zeW1ib2xTICpzeW1ib2xfZXh0ZXJuUDsKLXN5bWJvbFMgKnN5bWJvbF9leHRlcm5fbGFzdFA7Ci0KLXN0YWNrICpibG9ja19zdGFjazsKLXN5bWJvbFMgKmxhc3RfZnVuY3Rpb25QOwotc3RhdGljIHN5bWJvbFMgKmxhc3RfYmZQOwotc3ltYm9sUyAqbGFzdF90YWdQOwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci15YW5rX3N5bWJvbHMgKCkKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9udW1iZXIgPSAwOwotICB1bnNpZ25lZCBpbnQgbGFzdF9maWxlX3N5bW5vID0gMDsKLQotICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqZmlsZW5hbWVfbGlzdF9zY2FuID0gZmlsZW5hbWVfbGlzdF9oZWFkOwotCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsKLSAgICAgICBzeW1ib2xQOwotICAgICAgIHN5bWJvbFAgPSBzeW1ib2xQID8gc3ltYm9sX25leHQgKHN5bWJvbFApIDogc3ltYm9sX3Jvb3RQKQotICAgIHsKLSAgICAgIGlmIChzeW1ib2xQLT5zeV9tcmlfY29tbW9uKQotCXsKLQkgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0VYVAotI2lmZGVmIFRFX1BFCi0JICAgICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19OVF9XRUFLCi0jZW5kaWYKLQkgICAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX1dFQUtFWFQpCi0JICAgIGFzX2JhZCAoXygiJXM6IGdsb2JhbCBzeW1ib2xzIG5vdCBzdXBwb3J0ZWQgaW4gY29tbW9uIHNlY3Rpb25zIiksCi0JCSAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0JICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKCFTRl9HRVRfREVCVUcgKHN5bWJvbFApKQotCXsKLQkgIC8qIERlYnVnIHN5bWJvbHMgZG8gbm90IG5lZWQgYWxsIHRoaXMgcnViYmlzaCAqLwotCSAgc3ltYm9sUyAqcmVhbF9zeW1ib2xQOwotCi0JICAvKiBMKiBhbmQgQ19FRkNOIHN5bWJvbHMgbmV2ZXIgbWVyZ2UuICovCi0JICBpZiAoIVNGX0dFVF9MT0NBTCAoc3ltYm9sUCkKLQkgICAgICAmJiAhU0ZfR0VUX1NUQVRJQ1MgKHN5bWJvbFApCi0JICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgIT0gQ19MQUJFTAotCSAgICAgICYmIHN5bWJvbFAtPnN5X3ZhbHVlLlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgICYmIChyZWFsX3N5bWJvbFAgPSBzeW1ib2xfZmluZF9iYXNlIChTX0dFVF9OQU1FIChzeW1ib2xQKSwgRE9fTk9UX1NUUklQKSkKLQkgICAgICAmJiByZWFsX3N5bWJvbFAgIT0gc3ltYm9sUCkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FLVNPT046IHdoZXJlIGRvIGR1cHMgY29tZSBmcm9tPwotCQkgTWF5YmUgdGFnIHJlZmVyZW5jZXMgYmVmb3JlIGRlZmluaXRpb25zPyB4b3hvcmljaC4gKi8KLQkgICAgICAvKiBNb3ZlIHRoZSBkZWJ1ZyBkYXRhIGZyb20gdGhlIGRlYnVnIHN5bWJvbCB0byB0aGUKLQkJIHJlYWwgc3ltYm9sLiBEbyBOT1QgZG8gdGhlIG9wb3NpdGUgKGkuZS4gbW92ZSBmcm9tCi0JCSByZWFsIHN5bWJvbCB0byBkZWJ1ZyBzeW1ib2wgYW5kIHJlbW92ZSByZWFsIHN5bWJvbCBmcm9tIHRoZQotCQkgbGlzdC4pIEJlY2F1c2Ugc29tZSBwb2ludGVycyByZWZlciB0byB0aGUgcmVhbCBzeW1ib2wKLQkJIHdoZXJlYXMgbm8gcG9pbnRlcnMgcmVmZXIgdG8gdGhlIGRlYnVnIHN5bWJvbC4gKi8KLQkgICAgICBjX3N5bWJvbF9tZXJnZSAoc3ltYm9sUCwgcmVhbF9zeW1ib2xQKTsKLQkgICAgICAvKiBSZXBsYWNlIHRoZSBjdXJyZW50IHN5bWJvbCBieSB0aGUgcmVhbCBvbmUgKi8KLQkgICAgICAvKiBUaGUgc3ltYm9scyB3aWxsIG5ldmVyIGJlIHRoZSBsYXN0IG9yIHRoZSBmaXJzdAotCQkgYmVjYXVzZSA6IDFzdCBzeW1ib2wgaXMgLmZpbGUgYW5kIDMgbGFzdCBzeW1ib2xzIGFyZQotCQkgLnRleHQsIC5kYXRhLCAuYnNzICovCi0JICAgICAgc3ltYm9sX3JlbW92ZSAocmVhbF9zeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICBzeW1ib2xfaW5zZXJ0IChyZWFsX3N5bWJvbFAsIHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICAgIHN5bWJvbFAgPSByZWFsX3N5bWJvbFA7Ci0JICAgIH0JCQkvKiBpZiBub3QgbG9jYWwgYnV0IGR1cCdkICovCi0KLQkgIGlmIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCAmJiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0UxKSkKLQkgICAgewotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIFNFR19FMCk7Ci0JICAgIH0JCQkvKiBwdXNoIGRhdGEgaW50byB0ZXh0ICovCi0KLQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1ib2xQLCAxKTsKLQotCSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhU0ZfR0VUX0xPQ0FMIChzeW1ib2xQKSkKLQkJewotCQkgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19FMCkKLQkJewotCQkgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfTEFCRUwpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19TVEFUKTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIE1haW5seSB0byBzcGVlZCB1cCBpZiBub3QgLWcgKi8KLQkgIGlmIChTRl9HRVRfUFJPQ0VTUyAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICAvKiBIYW5kbGUgdGhlIG5lc3RlZCBibG9ja3MgYXV4aWxpYXJ5IGluZm8uICovCi0JICAgICAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfQkxPQ0spCi0JCXsKLQkJICBpZiAoIXN0cmNtcCAoU19HRVRfTkFNRSAoc3ltYm9sUCksICIuYmIiKSkKLQkJICAgIHN0YWNrX3B1c2ggKGJsb2NrX3N0YWNrLCAoY2hhciAqKSAmc3ltYm9sUCk7Ci0JCSAgZWxzZQotCQkgICAgewkJLyogLmViICovCi0JCSAgICAgIHJlZ2lzdGVyIHN5bWJvbFMgKmJlZ2luX3N5bWJvbFA7Ci0JCSAgICAgIGJlZ2luX3N5bWJvbFAgPSAqKHN5bWJvbFMgKiopIHN0YWNrX3BvcCAoYmxvY2tfc3RhY2spOwotCQkgICAgICBpZiAoYmVnaW5fc3ltYm9sUCA9PSAoc3ltYm9sUyAqKSAwKQotCQkJYXNfd2FybiAoXygibWlzbWF0Y2hlZCAuZWIiKSk7Ci0JCSAgICAgIGVsc2UKLQkJCVNBX1NFVF9TWU1fRU5ETkRYIChiZWdpbl9zeW1ib2xQLCBzeW1ib2xfbnVtYmVyICsgMik7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICAvKiBJZiB3ZSBhcmUgYWJsZSB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiBhIGZ1bmN0aW9uLCBhbmQgd2UKLQkgICAgICAgYXJlIG91dCBvZiBhIGZ1bmN0aW9uIChsYXN0X2Z1bmN0aW9uUCA9PSAwKSB0aGVuLCB0aGUKLQkgICAgICAgZnVuY3Rpb24gc3ltYm9sIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIGFuIGF1eGlsaWFyeQotCSAgICAgICBlbnRyeS4gKi8KLQkgICAgICBpZiAobGFzdF9mdW5jdGlvblAgPT0gKHN5bWJvbFMgKikgMCAmJgotCQkgIFNGX0dFVF9GVU5DVElPTiAoc3ltYm9sUCkpCi0JCXsKLQkJICBsYXN0X2Z1bmN0aW9uUCA9IHN5bWJvbFA7Ci0KLQkJICBpZiAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCkgPCAxKQotCQkgICAgewotCQkgICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAxKTsKLQkJICAgIH0JCS8qIG1ha2UgaXQgYXQgbGVhc3QgMSAqLwotCi0JCSAgLyogQ2xvYmJlciBwb3NzaWJsZSBzdGFsZSAuZGltIGluZm9ybWF0aW9uLiAqLwotI2lmIDAKLQkJICAvKiBJZmZlZCBvdXQgYnkgc3RldmUgLSB0aGlzIGZyaWVzIHRoZSBsbm5vcHRyIGluZm8gdG9vICovCi0JCSAgYnplcm8gKHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzBdLnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW4sCi0JCQkgc2l6ZW9mIChzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2F1eGVudFswXS54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuKSk7Ci0jZW5kaWYKLQkJfQotCSAgICAgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0ZDTikKLQkJewotCQkgIGlmIChzdHJjbXAgKFNfR0VUX05BTUUgKHN5bWJvbFApLCAiLmJmIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGxhc3RfYmZQICE9IE5VTEwpCi0JCQlTQV9TRVRfU1lNX0VORE5EWCAobGFzdF9iZlAsIHN5bWJvbF9udW1iZXIpOwotCQkgICAgICBsYXN0X2JmUCA9IHN5bWJvbFA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0VGQ04pCi0JCXsKLQkJICAvKiBJIGRvbid0IGV2ZW4ga25vdyBpZiB0aGlzIGlzIG5lZWRlZCBmb3Igc2RiLiBCdXQKLQkJICAgICB0aGUgc3RhbmRhcmQgYXNzZW1ibGVyIGdlbmVyYXRlcyBpdCwgc28uLi4gICovCi0JCSAgaWYgKGxhc3RfZnVuY3Rpb25QID09IChzeW1ib2xTICopIDApCi0JCSAgICBhc19mYXRhbCAoXygiQ19FRkNOIHN5bWJvbCBvdXQgb2Ygc2NvcGUiKSk7Ci0JCSAgU0FfU0VUX1NZTV9GU0laRSAobGFzdF9mdW5jdGlvblAsCi0JCQkJICAgIChsb25nKSAoU19HRVRfVkFMVUUgKHN5bWJvbFApIC0KLQkJCQkJICAgIFNfR0VUX1ZBTFVFIChsYXN0X2Z1bmN0aW9uUCkpKTsKLQkJICBTQV9TRVRfU1lNX0VORE5EWCAobGFzdF9mdW5jdGlvblAsIHN5bWJvbF9udW1iZXIpOwotCQkgbGFzdF9mdW5jdGlvblAgPSAoc3ltYm9sUyAqKSAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChTRl9HRVRfVEFHIChzeW1ib2xQKSkKLQl7Ci0JICAvKiBGaXJzdCBkZXNjcmlwdG9yIG9mIGEgc3RydWN0dXJlIG11c3QgcG9pbnQgdG8KLQkgICAgICAgdGhlIGZpcnN0IHNsb3QgYWZ0ZXIgdGhlIHN0cnVjdHVyZSBkZXNjcmlwdGlvbi4gKi8KLQkgIGxhc3RfdGFnUCA9IHN5bWJvbFA7Ci0KLQl9Ci0gICAgICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0VPUykKLQl7Ci0JICAvKiArMiB0YWtlIGluIGFjY291bnQgdGhlIGN1cnJlbnQgc3ltYm9sICovCi0JICBTQV9TRVRfU1lNX0VORE5EWCAobGFzdF90YWdQLCBzeW1ib2xfbnVtYmVyICsgMik7Ci0JfQotICAgICAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19GSUxFKQotCXsKLQkgIC8qIElmIHRoZSBmaWxlbmFtZSB3YXMgdG9vIGxvbmcgdG8gZml0IGluIHRoZQotCSAgICAgYXV4ZW50LCBwdXQgaXQgaW4gdGhlIHN0cmluZyB0YWJsZSAqLwotCSAgaWYgKFNBX0dFVF9GSUxFX0ZOQU1FX1pFUk9TIChzeW1ib2xQKSA9PSAwCi0JICAgICAgJiYgU0FfR0VUX0ZJTEVfRk5BTUVfT0ZGU0VUIChzeW1ib2xQKSAhPSAwKQotCSAgICB7Ci0JICAgICAgU0FfU0VUX0ZJTEVfRk5BTUVfT0ZGU0VUIChzeW1ib2xQLCBzdHJpbmdfYnl0ZV9jb3VudCk7Ci0JICAgICAgc3RyaW5nX2J5dGVfY291bnQgKz0gc3RybGVuIChmaWxlbmFtZV9saXN0X3NjYW4tPmZpbGVuYW1lKSArIDE7Ci0JICAgICAgZmlsZW5hbWVfbGlzdF9zY2FuID0gZmlsZW5hbWVfbGlzdF9zY2FuLT5uZXh0OwotCSAgICB9Ci0JICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsIGxhc3RfZmlsZV9zeW1ubyk7Ci0JICAgICAgbGFzdF9maWxlX3N5bW5vID0gc3ltYm9sX251bWJlcjsKLQkgICAgfQkJCS8qIG5vIG9uZSBwb2ludHMgYXQgdGhlIGZpcnN0IC5maWxlIHN5bWJvbCAqLwotCX0JCQkvKiBpZiBkZWJ1ZyBvciB0YWcgb3IgZW9zIG9yIGZpbGUgKi8KLQotI2lmZGVmIHRjX2Zyb2JfY29mZl9zeW1ib2wKLSAgICAgIHRjX2Zyb2JfY29mZl9zeW1ib2wgKHN5bWJvbFApOwotI2VuZGlmCi0KLSAgICAgIC8qIFdlIG11c3QgcHV0IHRoZSBleHRlcm5hbCBzeW1ib2xzIGFwYXJ0LiBUaGUgbG9hZGVyCi0JIGRvZXMgbm90IGJvbWIgaWYgd2UgZG8gbm90LiBCdXQgdGhlIHJlZmVyZW5jZXMgaW4KLQkgdGhlIGVuZG5keCBmaWVsZCBmb3IgYSAuYmIgc3ltYm9sIGFyZSBub3QgY29ycmVjdGVkCi0JIGlmIGFuIGV4dGVybmFsIHN5bWJvbCBpcyByZW1vdmVkIGJldHdlZW4gLmJiIGFuZCAuYmUuCi0JIEkuZSBpbiB0aGUgZm9sbG93aW5nIGNhc2UgOgotCSBbMjBdIC5iYiBlbmRuZHggPSAyMgotCSBbMjFdIGZvbyBleHRlcm5hbAotCSBbMjJdIC5iZQotCSBsZCB3aWxsIG1vdmUgdGhlIHN5bWJvbCAyMSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IGJ1dAotCSBlbmRuZHggd2lsbCBzdGlsbCBiZSAyMiBpbnN0ZWFkIG9mIDIxLiAqLwotCi0KLSAgICAgIGlmIChTRl9HRVRfTE9DQUwgKHN5bWJvbFApKQotCXsKLQkgIC8qIHJlbW92ZSBDX0VGQ04gYW5kIExPQ0FMIChMLi4uKSBzeW1ib2xzICovCi0JICAvKiBuZXh0IHBvaW50ZXIgcmVtYWlucyB2YWxpZCAqLwotCSAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0KLQl9Ci0gICAgICBlbHNlIGlmIChzeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JICAgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgfHwgU19JU19DT01NT04gKHN5bWJvbFApKSkKLQl7Ci0JICAvKiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIHVuZGVmaW5lZCBvciBjb21tb24KLQkgICAgIHN5bWJvbHMuICAqLwotCSAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JfQotICAgICAgZWxzZSBpZiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkKLQkgICAgICAgJiYgIVNfSVNfREVCVUcgKHN5bWJvbFApCi0JICAgICAgICYmICFTRl9HRVRfU1RBVElDUyAoc3ltYm9sUCkKLQkgICAgICAgJiYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRVhUCi0jaWZkZWYgVEVfUEUKLQkJICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19OVF9XRUFLCi0jZW5kaWYKLQkJICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19XRUFLRVhUKSkKLQl7Ci0JICAvKiBpZiBleHRlcm5hbCwgUmVtb3ZlIGZyb20gdGhlIGxpc3QgKi8KLQkgIHN5bWJvbFMgKmhvbGQgPSBzeW1ib2xfcHJldmlvdXMgKHN5bWJvbFApOwotCi0JICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgIHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzIChzeW1ib2xQKTsKLQkgIHN5bWJvbF9hcHBlbmQgKHN5bWJvbFAsIHN5bWJvbF9leHRlcm5fbGFzdFAsICZzeW1ib2xfZXh0ZXJuUCwgJnN5bWJvbF9leHRlcm5fbGFzdFApOwotCSAgc3ltYm9sUCA9IGhvbGQ7Ci0JfQotICAgICAgZWxzZSBpZiAoISBTX0lTX0RFQlVHIChzeW1ib2xQKQotCSAgICAgICAmJiAhIFNGX0dFVF9TVEFUSUNTIChzeW1ib2xQKQotCSAgICAgICAmJiAhIFNGX0dFVF9GVU5DVElPTiAoc3ltYm9sUCkKLQkgICAgICAgJiYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRVhUCi0jaWZkZWYgVEVfUEUKLQkJICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19OVF9XRUFLCi0jZW5kaWYKLQkJICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19OVF9XRUFLKSkKLQl7Ci0JICBzeW1ib2xTICpob2xkID0gc3ltYm9sX3ByZXZpb3VzIChzeW1ib2xQKTsKLQotCSAgLyogVGhlIE8nUmVpbGx5IENPRkYgYm9vayBzYXlzIHRoYXQgZGVmaW5lZCBnbG9iYWwgc3ltYm9scwotICAgICAgICAgICAgIGNvbWUgYXQgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIHRhYmxlLCBqdXN0IGJlZm9yZQotICAgICAgICAgICAgIHVuZGVmaW5lZCBnbG9iYWwgc3ltYm9scy4gICovCi0KLQkgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMgKHN5bWJvbFApOwotCSAgc3ltYm9sX2FwcGVuZCAoc3ltYm9sUCwgc3ltYm9sX2dsb2JhbF9sYXN0UCwgJnN5bWJvbF9nbG9iYWxQLAotCQkJICZzeW1ib2xfZ2xvYmFsX2xhc3RQKTsKLQkgIHN5bWJvbFAgPSBob2xkOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoU0ZfR0VUX1NUUklORyAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IHN0cmluZ19ieXRlX2NvdW50OwotCSAgICAgIHN0cmluZ19ieXRlX2NvdW50ICs9IHN0cmxlbiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpICsgMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQgPSAwOwotCSAgICB9CQkJLyogZml4ICJsb25nIiBuYW1lcyAqLwotCi0JICBzeW1ib2xQLT5zeV9udW1iZXIgPSBzeW1ib2xfbnVtYmVyOwotCSAgc3ltYm9sX251bWJlciArPSAxICsgU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCk7Ci0JfQkJCS8qIGlmIGxvY2FsIHN5bWJvbCAqLwotICAgIH0JCQkJLyogdHJhdmVyc2UgdGhlIHN5bWJvbCBsaXN0ICovCi0gIHJldHVybiBzeW1ib2xfbnVtYmVyOwotCi19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludAotZ2x1ZV9zeW1ib2xzIChoZWFkLCB0YWlsKQotICAgICBzeW1ib2xTICoqaGVhZDsKLSAgICAgc3ltYm9sUyAqKnRhaWw7Ci17Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfbnVtYmVyID0gMDsKLQotICB3aGlsZSAoKmhlYWQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xTICp0bXAgPSAqaGVhZDsKLQotICAgICAgLyogYXBwZW5kICovCi0gICAgICBzeW1ib2xfcmVtb3ZlICh0bXAsIGhlYWQsIHRhaWwpOwotICAgICAgc3ltYm9sX2FwcGVuZCAodG1wLCBzeW1ib2xfbGFzdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0gICAgICAvKiBhbmQgcHJvY2VzcyAqLwotICAgICAgaWYgKFNGX0dFVF9TVFJJTkcgKHRtcCkpCi0JewotCSAgdG1wLT5zeV9uYW1lX29mZnNldCA9IHN0cmluZ19ieXRlX2NvdW50OwotCSAgc3RyaW5nX2J5dGVfY291bnQgKz0gc3RybGVuIChTX0dFVF9OQU1FICh0bXApKSArIDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHRtcC0+c3lfbmFtZV9vZmZzZXQgPSAwOwotCX0JCQkvKiBmaXggImxvbmciIG5hbWVzICovCi0KLSAgICAgIHRtcC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcjsKLSAgICAgIHN5bWJvbF9udW1iZXIgKz0gMSArIFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHRtcCk7Ci0gICAgfQkJCQkvKiBhcHBlbmQgdGhlIGVudGlyZSBleHRlcm4gY2hhaW4gKi8KLQotICByZXR1cm4gc3ltYm9sX251bWJlcjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotdGllX3RhZ3MgKCkKLXsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9udW1iZXIgPSAwOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBzeW1ib2xQLT5zeV9udW1iZXIgPSBzeW1ib2xfbnVtYmVyOwotCi0gICAgICBpZiAoU0ZfR0VUX1RBR0dFRCAoc3ltYm9sUCkpCi0JewotCSAgU0FfU0VUX1NZTV9UQUdORFgKLQkgICAgKHN5bWJvbFAsCi0JICAgICAoKHN5bWJvbFMgKikgU0FfR0VUX1NZTV9UQUdORFggKHN5bWJvbFApKS0+c3lfbnVtYmVyKTsKLQl9Ci0KLSAgICAgIHN5bWJvbF9udW1iZXIgKz0gMSArIFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFApOwotICAgIH0KLQotICByZXR1cm4gc3ltYm9sX251bWJlcjsKLX0KLQotc3RhdGljIHZvaWQKLWNyYXdsX3N5bWJvbHMgKGgsIGFiZmQpCi0gICAgIG9iamVjdF9oZWFkZXJzICpoOwotICAgICBiZmQgKiBhYmZkOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICAvKiBJbml0aWFsaXplIHRoZSBzdGFjayB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG1hdGNoaW5nIC5iYiAuYmUgKi8KLQotICBibG9ja19zdGFjayA9IHN0YWNrX2luaXQgKDUxMiwgc2l6ZW9mIChzeW1ib2xTICopKTsKLQotICAvKiBUaGUgc3ltYm9sIGxpc3Qgc2hvdWxkIGJlIG9yZGVyZWQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2UKLSAgICogb3JkZXIgOgotICAgKiAuIC5maWxlIHN5bWJvbAotICAgKiAuIGRlYnVnIGVudHJpZXMgZm9yIGZ1bmN0aW9ucwotICAgKiAuIGZha2Ugc3ltYm9scyBmb3IgdGhlIHNlY3Rpb25zLCBpbmNsdWRpbmcgLnRleHQgLmRhdGEgYW5kIC5ic3MKLSAgICogLiBkZWZpbmVkIHN5bWJvbHMKLSAgICogLiB1bmRlZmluZWQgc3ltYm9scwotICAgKiBCdXQgdGhpcyBpcyBub3QgbWFuZGF0b3J5LiBUaGUgb25seSBpbXBvcnRhbnQgcG9pbnQgaXMgdG8gcHV0IHRoZQotICAgKiB1bmRlZmluZWQgc3ltYm9scyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LgotICAgKi8KLQotICAvKiBJcyB0aGVyZSBhIC5maWxlIHN5bWJvbCA/IElmIG5vdCBpbnNlcnQgb25lIGF0IHRoZSBiZWdpbm5pbmcuICovCi0gIGlmIChzeW1ib2xfcm9vdFAgPT0gTlVMTAotICAgICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sX3Jvb3RQKSAhPSBDX0ZJTEUpCi0gICAgewotICAgICAgY19kb3RfZmlsZV9zeW1ib2wgKCJmYWtlIik7Ci0gICAgfQotCi0gIC8qCi0gICAqIEJ1aWxkIHVwIHN0YXRpYyBzeW1ib2xzIGZvciB0aGUgc2VjdGlvbnMsIHRoZXkgYXJlIGZpbGxlZCBpbiBsYXRlcgotICAgKi8KLQotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19MQVNUOyBpKyspCi0gICAgaWYgKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19uYW1lWzBdKQotICAgICAgc2VnbWVudF9pbmZvW2ldLmRvdCA9IGNfc2VjdGlvbl9zeW1ib2wgKHNlZ21lbnRfaW5mb1tpXS5uYW1lLAotCQkJCQkgICAgICBpIC0gU0VHX0UwICsgMSk7Ci0KLSAgLyogVGFrZSBhbGwgdGhlIGV4dGVybmFscyBvdXQgYW5kIHB1dCB0aGVtIGludG8gYW5vdGhlciBjaGFpbiAqLwotICBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSAoaCwgeWFua19zeW1ib2xzICgpKTsKLSAgLyogVGFrZSB0aGUgZXh0ZXJuYWxzIGFuZCBnbHVlIHRoZW0gb250byB0aGUgZW5kLiovCi0gIEhfU0VUX1NZTUJPTF9UQUJMRV9TSVpFIChoLAotCQkJICAgKEhfR0VUX1NZTUJPTF9DT1VOVCAoaCkKLQkJCSAgICArIGdsdWVfc3ltYm9scyAoJnN5bWJvbF9nbG9iYWxQLAotCQkJCQkgICAgJnN5bWJvbF9nbG9iYWxfbGFzdFApCi0JCQkgICAgKyBnbHVlX3N5bWJvbHMgKCZzeW1ib2xfZXh0ZXJuUCwKLQkJCQkJICAgICZzeW1ib2xfZXh0ZXJuX2xhc3RQKSkpOwotCi0gIEhfU0VUX1NZTUJPTF9UQUJMRV9TSVpFIChoLCB0aWVfdGFncyAoKSk7Ci0gIGtub3cgKHN5bWJvbF9nbG9iYWxQID09IE5VTEwpOwotICBrbm93IChzeW1ib2xfZ2xvYmFsX2xhc3RQID09IE5VTEwpOwotICBrbm93IChzeW1ib2xfZXh0ZXJuUCA9PSBOVUxMKTsKLSAga25vdyAoc3ltYm9sX2V4dGVybl9sYXN0UCA9PSBOVUxMKTsKLX0KLQotLyoKLSAqIEZpbmQgc3RyaW5ncyBieSBjcmF3bGluZyBhbG9uZyBzeW1ib2wgdGFibGUgY2hhaW4uCi0gKi8KLQotdm9pZAotd19zdHJpbmdzICh3aGVyZSkKLSAgICAgY2hhciAqd2hlcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHN0cnVjdCBmaWxlbmFtZV9saXN0ICpmaWxlbmFtZV9saXN0X3NjYW4gPSBmaWxlbmFtZV9saXN0X2hlYWQ7Ci0KLSAgLyogR290dGEgZG8gbWRfIGJ5dGUtb3JkZXJpbmcgc3R1ZmYgZm9yIHN0cmluZ19ieXRlX2NvdW50IGZpcnN0IC0gS1dLICovCi0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsICh2YWx1ZVQpIHN0cmluZ19ieXRlX2NvdW50LCA0KTsKLSAgd2hlcmUgKz0gNDsKLQotI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0gIC8qIFN1cHBvcnQgbG9uZyBzZWN0aW9uIG5hbWVzIGFzIGZvdW5kIGluIFBFLiAgVGhpcyBjb2RlIG11c3QKLSAgICAgY29vcmRpbmF0ZSB3aXRoIHRoYXQgaW4gY29mZl9oZWFkZXJfYXBwZW5kIGFuZCB3cml0ZV9vYmplY3RfZmlsZS4gICovCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19MQVNUOyBpKyspCi0gICAgICB7Ci0JaWYgKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19uYW1lWzBdCi0JICAgICYmIHN0cmxlbiAoc2VnbWVudF9pbmZvW2ldLm5hbWUpID4gU0NOTk1MRU4pCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBzaXplOwotCi0JICAgIHNpemUgPSBzdHJsZW4gKHNlZ21lbnRfaW5mb1tpXS5uYW1lKSArIDE7Ci0JICAgIG1lbWNweSAod2hlcmUsIHNlZ21lbnRfaW5mb1tpXS5uYW1lLCBzaXplKTsKLQkgICAgd2hlcmUgKz0gc2l6ZTsKLQkgIH0KLSAgICAgIH0KLSAgfQotI2VuZGlmIC8qIENPRkZfTE9OR19TRUNUSU9OX05BTUVTICovCi0KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOwotICAgICAgIHN5bWJvbFA7Ci0gICAgICAgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLQotICAgICAgaWYgKFNGX0dFVF9TVFJJTkcgKHN5bWJvbFApKQotCXsKLQkgIHNpemUgPSBzdHJsZW4gKFNfR0VUX05BTUUgKHN5bWJvbFApKSArIDE7Ci0JICBtZW1jcHkgKHdoZXJlLCBTX0dFVF9OQU1FIChzeW1ib2xQKSwgc2l6ZSk7Ci0JICB3aGVyZSArPSBzaXplOwotCX0KLSAgICAgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0ZJTEUKLQkgICYmIFNBX0dFVF9GSUxFX0ZOQU1FX1pFUk9TIChzeW1ib2xQKSA9PSAwCi0JICAmJiBTQV9HRVRfRklMRV9GTkFNRV9PRkZTRVQgKHN5bWJvbFApICE9IDApCi0JewotCSAgc2l6ZSA9IHN0cmxlbiAoZmlsZW5hbWVfbGlzdF9zY2FuLT5maWxlbmFtZSkgKyAxOwotCSAgbWVtY3B5ICh3aGVyZSwgZmlsZW5hbWVfbGlzdF9zY2FuLT5maWxlbmFtZSwgc2l6ZSk7Ci0JICBmaWxlbmFtZV9saXN0X3NjYW4gPSBmaWxlbmFtZV9saXN0X3NjYW4gLT5uZXh0OwotCSAgd2hlcmUgKz0gc2l6ZTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZG9fbGluZW5vc19mb3IgKGFiZmQsIGgsIGZpbGVfY3Vyc29yKQotICAgICBiZmQgKiBhYmZkOwotICAgICBvYmplY3RfaGVhZGVycyAqIGg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmZpbGVfY3Vyc29yOwotewotICB1bnNpZ25lZCBpbnQgaWR4OwotICB1bnNpZ25lZCBsb25nIHN0YXJ0ID0gKmZpbGVfY3Vyc29yOwotCi0gIGZvciAoaWR4ID0gU0VHX0UwOyBpZHggPCBTRUdfTEFTVDsgaWR4KyspCi0gICAgewotICAgICAgc2VnbWVudF9pbmZvX3R5cGUgKnMgPSBzZWdtZW50X2luZm8gKyBpZHg7Ci0KLQotICAgICAgaWYgKHMtPnNjbmhkci5zX25sbm5vICE9IDApCi0JewotCSAgc3RydWN0IGxpbmVub19saXN0ICpsaW5lX3B0cjsKLQotCSAgc3RydWN0IGV4dGVybmFsX2xpbmVubyAqYnVmZmVyID0KLQkgIChzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vICopIHhtYWxsb2MgKHMtPnNjbmhkci5zX25sbm5vICogTElORVNaKTsKLQotCSAgc3RydWN0IGV4dGVybmFsX2xpbmVubyAqZHN0ID0gYnVmZmVyOwotCi0JICAvKiBSdW4gdGhyb3VnaCB0aGUgdGFibGUgd2UndmUgYnVpbHQgYW5kIHR1cm4gaXQgaW50byBpdHMgZXh0ZXJuYWwKLQkgZm9ybSwgdGFrZSB0aGlzIGNoYW5jZSB0byByZW1vdmUgZHVwbGljYXRlcyAqLwotCi0JICBmb3IgKGxpbmVfcHRyID0gcy0+bGluZW5vX2xpc3RfaGVhZDsKLQkgICAgICAgbGluZV9wdHIgIT0gKHN0cnVjdCBsaW5lbm9fbGlzdCAqKSBOVUxMOwotCSAgICAgICBsaW5lX3B0ciA9IGxpbmVfcHRyLT5uZXh0KQotCSAgICB7Ci0KLQkgICAgICBpZiAobGluZV9wdHItPmxpbmUubF9sbm5vID09IDApCi0JCXsKLQkJICAvKiBUdXJuIGEgcG9pbnRlciB0byBhIHN5bWJvbCBpbnRvIHRoZSBzeW1ib2xzJyBpbmRleCAqLwotCQkgIGxpbmVfcHRyLT5saW5lLmxfYWRkci5sX3N5bW5keCA9Ci0JCSAgICAoKHN5bWJvbFMgKikgbGluZV9wdHItPmxpbmUubF9hZGRyLmxfc3ltbmR4KS0+c3lfbnVtYmVyOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbGluZV9wdHItPmxpbmUubF9hZGRyLmxfcGFkZHIgKz0gKChzdHJ1Y3QgZnJhZyAqKSAobGluZV9wdHItPmZyYWcpKS0+ZnJfYWRkcmVzczsKLQkJfQotCi0KLQkgICAgICAodm9pZCkgYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0IChhYmZkLCAmKGxpbmVfcHRyLT5saW5lKSwgZHN0KTsKLQkgICAgICBkc3QrKzsKLQotCSAgICB9Ci0KLQkgIHMtPnNjbmhkci5zX2xubm9wdHIgPSAqZmlsZV9jdXJzb3I7Ci0KLQkgIGJmZF93cml0ZSAoYnVmZmVyLCAxLCBzLT5zY25oZHIuc19ubG5ubyAqIExJTkVTWiwgYWJmZCk7Ci0JICBmcmVlIChidWZmZXIpOwotCi0JICAqZmlsZV9jdXJzb3IgKz0gcy0+c2NuaGRyLnNfbmxubm8gKiBMSU5FU1o7Ci0JfQotICAgIH0KLSAgSF9TRVRfTElORU5PX1NJWkUgKGgsICpmaWxlX2N1cnNvciAtIHN0YXJ0KTsKLX0KLQotCi0vKiBOb3cgd2UgcnVuIHRocm91Z2ggdGhlIGxpc3Qgb2YgZnJhZyBjaGFpbnMgaW4gYSBzZWdtZW50IGFuZAotICAgbWFrZSBhbGwgdGhlIHN1YnNlZ21lbnQgZnJhZ3MgYXBwZWFyIGF0IHRoZSBlbmQgb2YgdGhlCi0gICBsaXN0LCBhcyBpZiB0aGUgc2VnIDAgd2FzIGV4dHJhIGxvbmcgKi8KLQotc3RhdGljIHZvaWQKLXJlbW92ZV9zdWJzZWdzICgpCi17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgZnJjaGFpblMgKmhlYWQgPSBzZWdtZW50X2luZm9baV0uZnJjaGFpblA7Ci0gICAgICBmcmFnUyBkdW1teTsKLSAgICAgIGZyYWdTICpwcmV2X2ZyYWcgPSAmZHVtbXk7Ci0KLSAgICAgIHdoaWxlIChoZWFkICYmIGhlYWQtPmZyY2hfc2VnID09IGkpCi0JewotCSAgcHJldl9mcmFnLT5mcl9uZXh0ID0gaGVhZC0+ZnJjaF9yb290OwotCSAgcHJldl9mcmFnID0gaGVhZC0+ZnJjaF9sYXN0OwotCSAgaGVhZCA9IGhlYWQtPmZyY2hfbmV4dDsKLQl9Ci0gICAgICBwcmV2X2ZyYWctPmZyX25leHQgPSAwOwotICAgIH0KLX0KLQotdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotaW50IGNvZmZfZmxhZ3M7Ci1leHRlcm4gdm9pZAotd3JpdGVfb2JqZWN0X2ZpbGUgKCkKLXsKLSAgaW50IGk7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBmcmNoYWluICpmcmNoYWluX3B0cjsKLQotICBvYmplY3RfaGVhZGVycyBoZWFkZXJzOwotICB1bnNpZ25lZCBsb25nIGZpbGVfY3Vyc29yOwotICBiZmQgKmFiZmQ7Ci0gIHVuc2lnbmVkIGludCBhZGRyOwotICBhYmZkID0gYmZkX29wZW53IChvdXRfZmlsZV9uYW1lLCBUQVJHRVRfRk9STUFUKTsKLQotCi0gIGlmIChhYmZkID09IDApCi0gICAgewotICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3QgY3JlYXRlICVzIiksIG91dF9maWxlX25hbWUpOwotICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gIGJmZF9zZXRfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KTsKLSAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIEJGRF9BUkNILCBtYWNoaW5lKTsKLQotICBzdHJpbmdfYnl0ZV9jb3VudCA9IDQ7Ci0KLSAgZm9yIChmcmNoYWluX3B0ciA9IGZyY2hhaW5fcm9vdDsKLSAgICAgICBmcmNoYWluX3B0ciAhPSAoc3RydWN0IGZyY2hhaW4gKikgTlVMTDsKLSAgICAgICBmcmNoYWluX3B0ciA9IGZyY2hhaW5fcHRyLT5mcmNoX25leHQpCi0gICAgewotICAgICAgLyogUnVuIHRocm91Z2ggYWxsIHRoZSBzdWItc2VnbWVudHMgYW5kIGFsaWduIHRoZW0gdXAuICBBbHNvCi0JIGNsb3NlIGFueSBvcGVuIGZyYWdzLiAgV2UgdGFjayBhIC5maWxsIG9udG8gdGhlIGVuZCBvZiB0aGUKLQkgZnJhZyBjaGFpbiBzbyB0aGF0IGFueSAuYWxpZ24ncyBzaXplIGNhbiBiZSB3b3JrZWQgYnkgbG9va2luZwotCSBhdCB0aGUgbmV4dCBmcmFnLiAgKi8KLQotICAgICAgc3Vic2VnX3NldCAoZnJjaGFpbl9wdHItPmZyY2hfc2VnLCBmcmNoYWluX3B0ci0+ZnJjaF9zdWJzZWcpOwotI2lmbmRlZiBTVUJfU0VHTUVOVF9BTElHTgotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpIDEKLSNlbmRpZgotI2lmZGVmIG1kX2RvX2FsaWduCi0gICAgICBtZF9kb19hbGlnbiAoU1VCX1NFR01FTlRfQUxJR04gKG5vd19zZWcpLCAoY2hhciAqKSBOVUxMLCAwLCAwLAotCQkgICBhbGlnbm1lbnRfZG9uZSk7Ci0jZW5kaWYKLSAgICAgIGZyYWdfYWxpZ24gKFNVQl9TRUdNRU5UX0FMSUdOIChub3dfc2VnKSwgTk9QX09QQ09ERSwgMCk7Ci0jaWZkZWYgbWRfZG9fYWxpZ24KLSAgICBhbGlnbm1lbnRfZG9uZToKLSNlbmRpZgotICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gICAgICBmcmFnX25vdy0+ZnJfZml4ID0gMDsKLSAgICAgIGtub3cgKGZyYWdfbm93LT5mcl9uZXh0ID09IE5VTEwpOwotICAgIH0KLQotCi0gIHJlbW92ZV9zdWJzZWdzICgpOwotCi0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICByZWxheF9zZWdtZW50IChzZWdtZW50X2luZm9baV0uZnJjaGFpblAtPmZyY2hfcm9vdCwgaSk7Ci0gICAgfQotCi0gIEhfU0VUX05VTUJFUl9PRl9TRUNUSU9OUyAoJmhlYWRlcnMsIDApOwotCi0gIC8qIEZpbmQgb3V0IGhvdyBiaWcgdGhlIHNlY3Rpb25zIGFyZSwgYW5kIHNldCB0aGUgYWRkcmVzc2VzLiAgKi8KLSAgYWRkciA9IDA7Ci0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgbG9uZyBzaXplOwotCi0gICAgICBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfcGFkZHIgPSBhZGRyOwotICAgICAgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX3ZhZGRyID0gYWRkcjsKLQotICAgICAgaWYgKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19uYW1lWzBdKQotCXsKLQkgIEhfU0VUX05VTUJFUl9PRl9TRUNUSU9OUyAoJmhlYWRlcnMsCi0JCQkJICAgIEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyAoJmhlYWRlcnMpICsgMSk7Ci0KLSNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCSAgLyogU3VwcG9ydCBsb25nIHNlY3Rpb24gbmFtZXMgYXMgZm91bmQgaW4gUEUuICBUaGlzIGNvZGUKLQkgICAgIG11c3QgY29vcmRpbmF0ZSB3aXRoIHRoYXQgaW4gY29mZl9oZWFkZXJfYXBwZW5kIGFuZAotCSAgICAgd19zdHJpbmdzLiAgKi8KLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IGxlbjsKLQotCSAgICBsZW4gPSBzdHJsZW4gKHNlZ21lbnRfaW5mb1tpXS5uYW1lKTsKLQkgICAgaWYgKGxlbiA+IFNDTk5NTEVOKQotCSAgICAgIHN0cmluZ19ieXRlX2NvdW50ICs9IGxlbiArIDE7Ci0JICB9Ci0jZW5kaWYgLyogQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMgKi8KLQl9Ci0KLSAgICAgIHNpemUgPSBzaXplX3NlY3Rpb24gKGFiZmQsICh1bnNpZ25lZCBpbnQpIGkpOwotICAgICAgYWRkciArPSBzaXplOwotCi0gICAgICAvKiBJIHRoaW5rIHRoZSBzZWN0aW9uIGFsaWdubWVudCBpcyBvbmx5IHVzZWQgb24gdGhlIGk5NjA7IHRoZQotCSBpOTYwIG5lZWRzIGl0LCBhbmQgaXQgc2hvdWxkIGRvIG5vIGhhcm0gb24gb3RoZXIgdGFyZ2V0cy4gICovCi0jaWZkZWYgQUxJR05NRU5UX0lOX1NfRkxBR1MKLSAgICAgIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19mbGFncyB8PSAoc2VjdGlvbl9hbGlnbm1lbnRbaV0gJiAweEYpIDw8IDg7Ci0jZWxzZQotICAgICAgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX2FsaWduID0gMSA8PCBzZWN0aW9uX2FsaWdubWVudFtpXTsKLSNlbmRpZgotCi0gICAgICBpZiAoaSA9PSBTRUdfRTApCi0JSF9TRVRfVEVYVF9TSVpFICgmaGVhZGVycywgc2l6ZSk7Ci0gICAgICBlbHNlIGlmIChpID09IFNFR19FMSkKLQlIX1NFVF9EQVRBX1NJWkUgKCZoZWFkZXJzLCBzaXplKTsKLSAgICAgIGVsc2UgaWYgKGkgPT0gU0VHX0UyKQotCUhfU0VUX0JTU19TSVpFICgmaGVhZGVycywgc2l6ZSk7Ci0gICAgfQotCi0gIC8qIFR1cm4gdGhlIGdhcyBuYXRpdmUgc3ltYm9sIHRhYmxlIHNoYXBlIGludG8gYSBjb2ZmIHN5bWJvbCB0YWJsZSAqLwotICBjcmF3bF9zeW1ib2xzICgmaGVhZGVycywgYWJmZCk7Ci0KLSAgaWYgKHN0cmluZ19ieXRlX2NvdW50ID09IDQpCi0gICAgc3RyaW5nX2J5dGVfY291bnQgPSAwOwotCi0gIEhfU0VUX1NUUklOR19TSVpFICgmaGVhZGVycywgc3RyaW5nX2J5dGVfY291bnQpOwotCi0jaWZkZWYgdGNfZnJvYl9maWxlCi0gIHRjX2Zyb2JfZmlsZSAoKTsKLSNlbmRpZgotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgZml4dXBfbWRlcHMgKHNlZ21lbnRfaW5mb1tpXS5mcmNoYWluUC0+ZnJjaF9yb290LCAmaGVhZGVycywgaSk7Ci0gICAgICBmaXh1cF9zZWdtZW50ICgmc2VnbWVudF9pbmZvW2ldLCBpKTsKLSAgICB9Ci0KLSAgLyogTG9vayBmb3IgIi5zdGFiIiBzZWdtZW50cyBhbmQgZmlsbCBpbiB0aGVpciBpbml0aWFsIHN5bWJvbHMKLSAgICAgY29ycmVjdGx5LiAqLwotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIG5hbWUgPSBzZWdtZW50X2luZm9baV0ubmFtZTsKLQotICAgICAgaWYgKG5hbWUgIT0gTlVMTAotCSAgJiYgc3RybmNtcCAoIi5zdGFiIiwgbmFtZSwgNSkgPT0gMAotCSAgJiYgc3RybmNtcCAoIi5zdGFic3RyIiwgbmFtZSwgOCkgIT0gMCkKLQlhZGp1c3Rfc3RhYl9zZWN0aW9uIChhYmZkLCBpKTsKLSAgICB9Ci0KLSAgZmlsZV9jdXJzb3IgPSBIX0dFVF9URVhUX0ZJTEVfT0ZGU0VUICgmaGVhZGVycyk7Ci0KLSAgYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgZmlsZV9jdXJzb3IsIDApOwotCi0gIC8qIFBsYW50IHRoZSBkYXRhICovCi0KLSAgZmlsbF9zZWN0aW9uIChhYmZkLCAmaGVhZGVycywgJmZpbGVfY3Vyc29yKTsKLQotICBkb19yZWxvY3NfZm9yIChhYmZkLCAmaGVhZGVycywgJmZpbGVfY3Vyc29yKTsKLQotICBkb19saW5lbm9zX2ZvciAoYWJmZCwgJmhlYWRlcnMsICZmaWxlX2N1cnNvcik7Ci0KLSAgSF9TRVRfRklMRV9NQUdJQ19OVU1CRVIgKCZoZWFkZXJzLCBDT0ZGX01BR0lDKTsKLSNpZm5kZWYgT0JKX0NPRkZfT01JVF9USU1FU1RBTVAKLSAgSF9TRVRfVElNRV9TVEFNUCAoJmhlYWRlcnMsIChsb25nKXRpbWUoKHRpbWVfdCAqKTApKTsKLSNlbHNlCi0gIEhfU0VUX1RJTUVfU1RBTVAgKCZoZWFkZXJzLCAwKTsKLSNlbmRpZgotI2lmZGVmIFRDX0NPRkZfU0VUX01BQ0hJTkUKLSAgVENfQ09GRl9TRVRfTUFDSElORSAoJmhlYWRlcnMpOwotI2VuZGlmCi0KLSNpZm5kZWYgQ09GRl9GTEFHUwotI2RlZmluZSBDT0ZGX0ZMQUdTIDAKLSNlbmRpZgotCi0jaWZkZWYgS0VFUF9SRUxPQ19JTkZPCi0gIEhfU0VUX0ZMQUdTICgmaGVhZGVycywgKChIX0dFVF9MSU5FTk9fU0laRSgmaGVhZGVycykgPyAwIDogRl9MTk5PKSB8Ci0JCQkgIENPRkZfRkxBR1MgfCBjb2ZmX2ZsYWdzKSk7Ci0jZWxzZQotICBIX1NFVF9GTEFHUyAoJmhlYWRlcnMsICgoSF9HRVRfTElORU5PX1NJWkUoJmhlYWRlcnMpICAgICA/IDAgOiBGX0xOTk8pICAgfAotCQkJICAoSF9HRVRfUkVMT0NBVElPTl9TSVpFKCZoZWFkZXJzKSA/IDAgOiBGX1JFTEZMRykgfAotCQkJICBDT0ZGX0ZMQUdTIHwgY29mZl9mbGFncykpOwotI2VuZGlmCi0KLSAgewotICAgIHVuc2lnbmVkIGludCBzeW10YWJsZV9zaXplID0gSF9HRVRfU1lNQk9MX1RBQkxFX1NJWkUgKCZoZWFkZXJzKTsKLSAgICBjaGFyICpidWZmZXIxID0geG1hbGxvYyAoc3ltdGFibGVfc2l6ZSArIHN0cmluZ19ieXRlX2NvdW50ICsgMSk7Ci0KLSAgICBIX1NFVF9TWU1CT0xfVEFCTEVfUE9JTlRFUiAoJmhlYWRlcnMsIGJmZF90ZWxsIChhYmZkKSk7Ci0gICAgd19zeW1ib2xzIChhYmZkLCBidWZmZXIxLCBzeW1ib2xfcm9vdFApOwotICAgIGlmIChzdHJpbmdfYnl0ZV9jb3VudCA+IDApCi0gICAgICB3X3N0cmluZ3MgKGJ1ZmZlcjEgKyBzeW10YWJsZV9zaXplKTsKLSAgICBiZmRfd3JpdGUgKGJ1ZmZlcjEsIDEsIHN5bXRhYmxlX3NpemUgKyBzdHJpbmdfYnl0ZV9jb3VudCwgYWJmZCk7Ci0gICAgZnJlZSAoYnVmZmVyMSk7Ci0gIH0KLQotICBjb2ZmX2hlYWRlcl9hcHBlbmQgKGFiZmQsICZoZWFkZXJzKTsKLSNpZiAwCi0gIC8qIFJlY2VudCBjaGFuZ2VzIHRvIHdyaXRlIG5lZWQgdGhpcywgYnV0IHdoZXJlIGl0IHNob3VsZAotICAgICBnbyBpcyB1cCB0byBLZW4uLiAqLwotICBpZiAoYmZkX2Nsb3NlX2FsbF9kb25lIChhYmZkKSA9PSBmYWxzZSkKLSAgICBhc19mYXRhbCAoXygiQ2FuJ3QgY2xvc2UgJXM6ICVzIiksIG91dF9maWxlX25hbWUsCi0JICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotI2Vsc2UKLSAgewotICAgIGV4dGVybiBiZmQgKnN0ZG91dHB1dDsKLSAgICBzdGRvdXRwdXQgPSBhYmZkOwotICB9Ci0jZW5kaWYKLQotfQotCi0vKiBBZGQgYSBuZXcgc2VnbWVudC4gIFRoaXMgaXMgY2FsbGVkIGZyb20gc3Vic2VnX25ldyB2aWEgdGhlCi0gICBvYmpfbmV3X3NlZ21lbnQgbWFjcm8uICAqLwotCi1zZWdUCi1vYmpfY29mZl9hZGRfc2VnbWVudCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSNpZm5kZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgY2hhciBidWZbU0NOTk1MRU4gKyAxXTsKLQotICBzdHJuY3B5IChidWYsIG5hbWUsIFNDTk5NTEVOKTsKLSAgYnVmW1NDTk5NTEVOXSA9ICdcMCc7Ci0gIG5hbWUgPSBidWY7Ci0jZW5kaWYKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfTEFTVCAmJiBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZVswXTsgaSsrKQotICAgIGlmIChzdHJjbXAgKG5hbWUsIHNlZ21lbnRfaW5mb1tpXS5uYW1lKSA9PSAwKQotICAgICAgcmV0dXJuIChzZWdUKSBpOwotCi0gIGlmIChpID09IFNFR19MQVNUKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiVG9vIG1hbnkgbmV3IHNlY3Rpb25zOyBjYW4ndCBhZGQgXCIlc1wiIiksIG5hbWUpOwotICAgICAgcmV0dXJuIG5vd19zZWc7Ci0gICAgfQotCi0gIC8qIEFkZCBhIG5ldyBzZWN0aW9uLiAgKi8KLSAgc3RybmNweSAoc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWUsIG5hbWUsCi0JICAgc2l6ZW9mIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZSkpOwotICBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfZmxhZ3MgPSBTVFlQX1JFRzsKLSAgc2VnbWVudF9pbmZvW2ldLm5hbWUgPSB4c3RyZHVwIChuYW1lKTsKLQotICByZXR1cm4gKHNlZ1QpIGk7Ci19Ci0KLS8qCi0gKiBpbXBsZW1lbnQgdGhlIC5zZWN0aW9uIHBzZXVkbyBvcDoKLSAqCS5zZWN0aW9uIG5hbWUgeywgImZsYWdzIn0KLSAqICAgICAgICAgICAgICAgIF4gICAgICAgICBeCi0gKiAgICAgICAgICAgICAgICB8ICAgICAgICAgKy0tLSBvcHRpb25hbCBmbGFnczogJ2InIGZvciBic3MKLSAqICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScgZm9yIGluZm8KLSAqICAgICAgICAgICAgICAgICstLSBzZWN0aW9uIG5hbWUgICAgICAgICAgICAgICAnbCcgZm9yIGxpYgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJyBmb3Igbm9sb2FkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nIGZvciBvdmVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnIGZvciBkYXRhCi0gKgkJCQkJCSAnZCcgKGFwcGFyZW50bHkgbTg4ayBmb3IgZGF0YSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcgZm9yIHRleHQKLSAqCQkJCQkJICdyJyBmb3IgcmVhZC1vbmx5IGRhdGEKLSAqIEJ1dCBpZiB0aGUgYXJndW1lbnQgaXMgbm90IGEgcXVvdGVkIHN0cmluZywgdHJlYXQgaXQgYXMgYQotICogc3Vic2VnbWVudCBudW1iZXIuCi0gKi8KLQotdm9pZAotb2JqX2NvZmZfc2VjdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiBTdHJpcCBvdXQgdGhlIHNlY3Rpb24gbmFtZSAqLwotICBjaGFyICpzZWN0aW9uX25hbWUsICpuYW1lOwotICBjaGFyIGM7Ci0gIHVuc2lnbmVkIGludCBleHA7Ci0gIGxvbmcgZmxhZ3M7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIGNoYXIgdHlwZTsKLQotICAgICAgc19tcmlfc2VjdCAoJnR5cGUpOwotICAgICAgZmxhZ3MgPSAwOwotICAgICAgaWYgKHR5cGUgPT0gJ0MnKQotCWZsYWdzID0gU1RZUF9URVhUOwotICAgICAgZWxzZSBpZiAodHlwZSA9PSAnRCcpCi0JZmxhZ3MgPSBTVFlQX0RBVEE7Ci0gICAgICBzZWdtZW50X2luZm9bbm93X3NlZ10uc2NuaGRyLnNfZmxhZ3MgfD0gZmxhZ3M7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc2VjdGlvbl9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgbmFtZSA9IHhtYWxsb2MgKGlucHV0X2xpbmVfcG9pbnRlciAtIHNlY3Rpb25fbmFtZSArIDEpOwotICBzdHJjcHkgKG5hbWUsIHNlY3Rpb25fbmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgZXhwID0gMDsKLSAgZmxhZ3MgPSAwOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0JZXhwID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicKLQkJICYmICEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSAgICB7Ci0JICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCQl7Ci0JCWNhc2UgJ2InOiBmbGFncyB8PSBTVFlQX0JTUzsgICAgYnJlYWs7Ci0JCWNhc2UgJ2knOiBmbGFncyB8PSBTVFlQX0lORk87ICAgYnJlYWs7Ci0JCWNhc2UgJ2wnOiBmbGFncyB8PSBTVFlQX0xJQjsgICAgYnJlYWs7Ci0JCWNhc2UgJ24nOiBmbGFncyB8PSBTVFlQX05PTE9BRDsgYnJlYWs7Ci0JCWNhc2UgJ28nOiBmbGFncyB8PSBTVFlQX09WRVI7ICAgYnJlYWs7Ci0JCWNhc2UgJ2QnOgotCQljYXNlICd3JzogZmxhZ3MgfD0gU1RZUF9EQVRBOyAgIGJyZWFrOwotCQljYXNlICd4JzogZmxhZ3MgfD0gU1RZUF9URVhUOyAgIGJyZWFrOwotCQljYXNlICdyJzogZmxhZ3MgfD0gU1RZUF9MSVQ7CWJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGFzX3dhcm4oXygidW5rbm93biBzZWN0aW9uIGF0dHJpYnV0ZSAnJWMnIiksCi0JCQkgICppbnB1dF9saW5lX3BvaW50ZXIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgIH0KLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICciJykKLQkgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgIH0KLQotICBzdWJzZWdfbmV3IChuYW1lLCAoc3Vic2VnVCkgZXhwKTsKLQotICBzZWdtZW50X2luZm9bbm93X3NlZ10uc2NuaGRyLnNfZmxhZ3MgfD0gZmxhZ3M7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfdGV4dCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzdWJzZWdfbmV3ICgiLnRleHQiLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2RhdGEgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KQotICAgIHN1YnNlZ19uZXcgKCIudGV4dCIsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpICsgMTAwMCk7Ci0gIGVsc2UKLSAgICBzdWJzZWdfbmV3ICgiLmRhdGEiLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9pZGVudCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsJCS8qIHNhdmUgY3VycmVudCBzZWcJKi8KLSAgc3Vic2VnVCBjdXJyZW50X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIHN1YnNlZ19uZXcgKCIuY29tbWVudCIsIDApOwkJLyogLmNvbW1lbnQgc2VnCQkqLwotICBzdHJpbmdlciAoMSk7CQkJCS8qIHJlYWQgc3RyaW5nCQkqLwotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOwkvKiByZXN0b3JlIGN1cnJlbnQgc2VnCSovCi19Ci0KLXZvaWQKLWNfc3ltYm9sX21lcmdlIChkZWJ1Zywgbm9ybWFsKQotICAgICBzeW1ib2xTICpkZWJ1ZzsKLSAgICAgc3ltYm9sUyAqbm9ybWFsOwotewotICBTX1NFVF9EQVRBX1RZUEUgKG5vcm1hbCwgU19HRVRfREFUQV9UWVBFIChkZWJ1ZykpOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChub3JtYWwsIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlYnVnKSk7Ci0KLSAgaWYgKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKSA+IFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKG5vcm1hbCkpCi0gICAgewotICAgICAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAobm9ybWFsLCBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykpOwotICAgIH0JCQkJLyogdGFrZSB0aGUgbW9zdCB3ZSBoYXZlICovCi0KLSAgaWYgKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKSA+IDApCi0gICAgewotICAgICAgbWVtY3B5ICgoY2hhciAqKSAmbm9ybWFsLT5zeV9zeW1ib2wub3N0X2F1eGVudFswXSwKLQkgICAgICAoY2hhciAqKSAmZGVidWctPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzBdLAotCSAgICAgICh1bnNpZ25lZCBpbnQpIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykgKiBBVVhFU1opKTsKLSAgICB9CQkJCS8qIE1vdmUgYWxsIHRoZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24gKi8KLQotICAvKiBNb3ZlIHRoZSBkZWJ1ZyBmbGFncy4gKi8KLSAgU0ZfU0VUX0RFQlVHX0ZJRUxEIChub3JtYWwsIFNGX0dFVF9ERUJVR19GSUVMRCAoZGVidWcpKTsKLX0JCQkJLyogY19zeW1ib2xfbWVyZ2UoKSAqLwotCi1zdGF0aWMgaW50Ci1jX2xpbmVfbmV3IChzeW1ib2wsIHBhZGRyLCBsaW5lX251bWJlciwgZnJhZykKLSAgICAgc3ltYm9sUyAqIHN5bWJvbDsKLSAgICAgbG9uZyBwYWRkcjsKLSAgICAgaW50IGxpbmVfbnVtYmVyOwotICAgICBmcmFnUyAqIGZyYWc7Ci17Ci0gIHN0cnVjdCBsaW5lbm9fbGlzdCAqbmV3X2xpbmUgPQotICAoc3RydWN0IGxpbmVub19saXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxpbmVub19saXN0KSk7Ci0KLSAgc2VnbWVudF9pbmZvX3R5cGUgKnMgPSBzZWdtZW50X2luZm8gKyBub3dfc2VnOwotICBuZXdfbGluZS0+bGluZS5sX2xubm8gPSBsaW5lX251bWJlcjsKLQotICBpZiAobGluZV9udW1iZXIgPT0gMCkKLSAgICB7Ci0gICAgICBsYXN0X2xpbmVfc3ltYm9sID0gc3ltYm9sOwotICAgICAgbmV3X2xpbmUtPmxpbmUubF9hZGRyLmxfc3ltbmR4ID0gKGxvbmcpIHN5bWJvbDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuZXdfbGluZS0+bGluZS5sX2FkZHIubF9wYWRkciA9IHBhZGRyOwotICAgIH0KLQotICBuZXdfbGluZS0+ZnJhZyA9IChjaGFyICopIGZyYWc7Ci0gIG5ld19saW5lLT5uZXh0ID0gKHN0cnVjdCBsaW5lbm9fbGlzdCAqKSBOVUxMOwotCi0KLSAgaWYgKHMtPmxpbmVub19saXN0X2hlYWQgPT0gKHN0cnVjdCBsaW5lbm9fbGlzdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHMtPmxpbmVub19saXN0X2hlYWQgPSBuZXdfbGluZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzLT5saW5lbm9fbGlzdF90YWlsLT5uZXh0ID0gbmV3X2xpbmU7Ci0gICAgfQotICBzLT5saW5lbm9fbGlzdF90YWlsID0gbmV3X2xpbmU7Ci0gIHJldHVybiBMSU5FU1ogKiBzLT5zY25oZHIuc19ubG5ubysrOwotfQotCi12b2lkCi1jX2RvdF9maWxlX3N5bWJvbCAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIHN5bWJvbFAgPSBzeW1ib2xfbmV3ICgiLmZpbGUiLAotCQkJU0VHX0RFQlVHLAotCQkJMCwKLQkJCSZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0KLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19GSUxFKTsKLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCwgMSk7Ci0KLSAgaWYgKHN0cmxlbiAoZmlsZW5hbWUpID4gRklMTk1MRU4pCi0gICAgewotICAgICAgLyogRmlsZW5hbWUgaXMgdG9vIGxvbmcgdG8gZml0IGludG8gYW4gYXV4ZW50LAotCSB3ZSBzdGljayBpdCBpbnRvIHRoZSBzdHJpbmcgdGFibGUgaW5zdGVhZC4gIFdlIGtlZXAKLQkgYSBsaW5rZWQgbGlzdCBvZiB0aGUgZmlsZW5hbWVzIHdlIGZpbmQgc28gd2UgY2FuIGVtaXQKLQkgdGhlbSBsYXRlci4qLwotICAgICAgc3RydWN0IGZpbGVuYW1lX2xpc3QgKmYgPSAoKHN0cnVjdCBmaWxlbmFtZV9saXN0ICopCi0JCQkJIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGZpbGVuYW1lX2xpc3QpKSk7Ci0KLSAgICAgIGYtPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gICAgICBmLT5uZXh0ID0gMDsKLQotICAgICAgU0FfU0VUX0ZJTEVfRk5BTUVfWkVST1MgKHN5bWJvbFAsIDApOwotICAgICAgU0FfU0VUX0ZJTEVfRk5BTUVfT0ZGU0VUIChzeW1ib2xQLCAxKTsKLQotICAgICAgaWYgKGZpbGVuYW1lX2xpc3RfdGFpbCkgCi0JZmlsZW5hbWVfbGlzdF90YWlsLT5uZXh0ID0gZjsKLSAgICAgIGVsc2UKLQlmaWxlbmFtZV9saXN0X2hlYWQgPSBmOwotICAgICAgZmlsZW5hbWVfbGlzdF90YWlsID0gZjsgICAgICAKLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgU0FfU0VUX0ZJTEVfRk5BTUUgKHN5bWJvbFAsIGZpbGVuYW1lKTsKLSAgICB9Ci0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgewotICAgIGV4dGVybiBpbnQgbGlzdGluZzsKLSAgICBpZiAobGlzdGluZykKLSAgICAgIHsKLQlsaXN0aW5nX3NvdXJjZV9maWxlIChmaWxlbmFtZSk7Ci0gICAgICB9Ci0KLSAgfQotCi0jZW5kaWYKLSAgU0ZfU0VUX0RFQlVHIChzeW1ib2xQKTsKLSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHByZXZpb3VzX2ZpbGVfc3ltYm9sKTsKLQotICBwcmV2aW91c19maWxlX3N5bWJvbCA9IHN5bWJvbFA7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHN5bWJvbCBpcyBmaXJzdCBvbiB0aGUgc3ltYm9sIGNoYWluICovCi0gIGlmIChzeW1ib2xfcm9vdFAgIT0gc3ltYm9sUCkKLSAgICB7Ci0gICAgICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIHN5bWJvbF9pbnNlcnQgKHN5bWJvbFAsIHN5bWJvbF9yb290UCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgfQotfQkJCQkvKiBjX2RvdF9maWxlX3N5bWJvbCgpICovCi0KLS8qCi0gKiBCdWlsZCBhICdzZWN0aW9uIHN0YXRpYycgc3ltYm9sLgotICovCi0KLXN5bWJvbFMgKgotY19zZWN0aW9uX3N5bWJvbCAobmFtZSwgaWR4KQotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgaWR4OwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9iYXNlIChuYW1lLCBET19OT1RfU1RSSVApOwotICBpZiAoc3ltYm9sUCA9PSBOVUxMKQotICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCBpZHgsIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBNbW1tLiAgSSBqdXN0IGxvdmUgdmlvbGF0aW5nIGludGVyZmFjZXMuICBNYWtlcyBtZSBmZWVsLi4uZGlydHkuICAqLwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgaWR4KTsKLSAgICAgIHN5bWJvbFAtPnN5X2ZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0gICAgfQotCi0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfU1RBVCk7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDEpOwotCi0gIFNGX1NFVF9TVEFUSUNTIChzeW1ib2xQKTsKLQotI2lmZGVmIFRFX0RFTFRBCi0gIC8qIG1hbmZyZWRAcy1kaXJla3RuZXQuZGU6IHNlY3Rpb24gc3ltYm9scyAqbXVzdCogaGF2ZSB0aGUgTE9DQUwgYml0IGNsZWFyZWQsCi0gICAgIHdoaWNoIGlzIHNldCBieSB0aGUgbmV3IGRlZmluaXRpb24gb2YgTE9DQUxfTEFCRUwgaW4gdGMtbTY4ay5oLiAgKi8KLSAgU0ZfQ0xFQVJfTE9DQUwgKHN5bWJvbFApOwotI2VuZGlmCi0jaWZkZWYgVEVfUEUKLSAgLyogSWYgdGhlIC5saW5rb25jZSBwc2V1ZG8tb3Agd2FzIHVzZWQgZm9yIHRoaXMgc2VjdGlvbiwgd2UgbXVzdAotICAgICBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGF1eGlsaWFyeSBlbnRyeSBmb3IgdGhlIHNlY3Rpb24KLSAgICAgc3ltYm9sLiAgKi8KLSAgaWYgKHNlZ21lbnRfaW5mb1tpZHhdLmxpbmtvbmNlICE9IExJTktPTkNFX1VOU0VUKQotICAgIHsKLSAgICAgIGludCB0eXBlOwotCi0gICAgICBzd2l0Y2ggKHNlZ21lbnRfaW5mb1tpZHhdLmxpbmtvbmNlKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBMSU5LT05DRV9ESVNDQVJEOgotCSAgdHlwZSA9IElNQUdFX0NPTURBVF9TRUxFQ1RfQU5ZOwotCSAgYnJlYWs7Ci0JY2FzZSBMSU5LT05DRV9PTkVfT05MWToKLQkgIHR5cGUgPSBJTUFHRV9DT01EQVRfU0VMRUNUX05PRFVQTElDQVRFUzsKLQkgIGJyZWFrOwotCWNhc2UgTElOS09OQ0VfU0FNRV9TSVpFOgotCSAgdHlwZSA9IElNQUdFX0NPTURBVF9TRUxFQ1RfU0FNRV9TSVpFOwotCSAgYnJlYWs7Ci0JY2FzZSBMSU5LT05DRV9TQU1FX0NPTlRFTlRTOgotCSAgdHlwZSA9IElNQUdFX0NPTURBVF9TRUxFQ1RfRVhBQ1RfTUFUQ0g7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIFNZTV9BVVhFTlQgKHN5bWJvbFApLT54X3Njbi54X2NvbWRhdCA9IHR5cGU7Ci0gICAgfQotI2VuZGlmIC8qIFRFX1BFICovCi0KLSAgcmV0dXJuIHN5bWJvbFA7Ci19CQkJCS8qIGNfc2VjdGlvbl9zeW1ib2woKSAqLwotCi1zdGF0aWMgdm9pZAotd19zeW1ib2xzIChhYmZkLCB3aGVyZSwgc3ltYm9sX3Jvb3RQKQotICAgICBiZmQgKiBhYmZkOwotICAgICBjaGFyICp3aGVyZTsKLSAgICAgc3ltYm9sUyAqIHN5bWJvbF9yb290UDsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogRmlyc3QgZmlsbCBpbiB0aG9zZSB2YWx1ZXMgd2UgaGF2ZSBvbmx5IGp1c3Qgd29ya2VkIG91dCAqLwotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfTEFTVDsgaSsrKQotICAgIHsKLSAgICAgIHN5bWJvbFAgPSBzZWdtZW50X2luZm9baV0uZG90OwotICAgICAgaWYgKHN5bWJvbFApCi0JewotCSAgU0FfU0VUX1NDTl9TQ05MRU4gKHN5bWJvbFAsIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19zaXplKTsKLQkgIFNBX1NFVF9TQ05fTlJFTE9DIChzeW1ib2xQLCBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbnJlbG9jKTsKLQkgIFNBX1NFVF9TQ05fTkxJTk5PIChzeW1ib2xQLCBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmxubm8pOwotCX0KLSAgICB9Ci0KLSAgLyoKLSAgICAgKiBFbWl0IGFsbCBzeW1ib2xzIGxlZnQgaW4gdGhlIHN5bWJvbCBjaGFpbi4KLSAgICAgKi8KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qIFVzZWQgdG8gc2F2ZSB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lLiBJdCBpcyB1c2VkIHRvIHBvaW50Ci0JICAgICAgIHRvIHRoZSBzdHJpbmcgaW4gbWVtb3J5IGJ1dCBtdXN0IGJlIGEgZmlsZSBvZmZzZXQuICovCi0gICAgICByZWdpc3RlciBjaGFyICp0ZW1wOwotCi0gICAgICAvKiBXZSBjYW4ndCBmaXggdGhlIGxubm9wdHIgZmllbGQgaW4geWFua19zeW1ib2xzIHdpdGggdGhlIG90aGVyCi0gICAgICAgICBhZGp1c3RtZW50cywgYmVjYXVzZSB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgd2Uga25vdyB3aGVyZSB0aGV5Ci0gICAgICAgICBnbyBpbiB0aGUgZmlsZS4gICovCi0gICAgICBpZiAoU0ZfR0VUX0FESl9MTk5PUFRSIChzeW1ib2xQKSkKLQl7Ci0JICBTQV9HRVRfU1lNX0xOTk9QVFIgKHN5bWJvbFApICs9Ci0JICAgIHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UIChzeW1ib2xQKV0uc2NuaGRyLnNfbG5ub3B0cjsKLQl9Ci0KLSAgICAgIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoc3ltYm9sUCk7Ci0KLSAgICAgIHRlbXAgPSBTX0dFVF9OQU1FIChzeW1ib2xQKTsKLSAgICAgIGlmIChTRl9HRVRfU1RSSU5HIChzeW1ib2xQKSkKLQl7Ci0JICBTX1NFVF9PRkZTRVQgKHN5bWJvbFAsIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0KTsKLQkgIFNfU0VUX1pFUk9FUyAoc3ltYm9sUCwgMCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1lbXNldCAoc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX25hbWUsIDAsIFNZTU5NTEVOKTsKLQkgIHN0cm5jcHkgKHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfZW50cnkubl9uYW1lLCB0ZW1wLCBTWU1OTUxFTik7Ci0JfQotICAgICAgd2hlcmUgPSBzeW1ib2xfdG9fY2hhcnMgKGFiZmQsIHdoZXJlLCBzeW1ib2xQKTsKLSAgICAgIFNfU0VUX05BTUUgKHN5bWJvbFAsIHRlbXApOwotICAgIH0KLQotfQkJCQkvKiB3X3N5bWJvbHMoKSAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfbGNvbW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc19sY29tbSgwKTsKLSAgcmV0dXJuOwotI2lmIDAKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBpbnQgdGVtcDsKLSAgY2hhciAqcDsKLQotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiTWlzc2luZyBzaXplIGV4cHJlc3Npb24iKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJsY29tbSBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIiksIHRlbXApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICpwID0gMDsKLQotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZShuYW1lKTsKLQotICBpZiAoU19HRVRfU0VHTUVOVChzeW1ib2xQKSA9PSBTRUdfVU5LTk9XTiAmJgotICAgICAgU19HRVRfVkFMVUUoc3ltYm9sUCkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBuZWVkX3Bhc3NfMikKLQl7Ci0JICBjaGFyICpwOwotCSAgc2VnVCBjdXJyZW50X3NlZyA9IG5vd19zZWc7IAkvKiBzYXZlIGN1cnJlbnQgc2VnICAgICAqLwotCSAgc3Vic2VnVCBjdXJyZW50X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0KLQkgIHN1YnNlZ19zZXQgKFNFR19FMiwgMSk7Ci0JICBzeW1ib2xQLT5zeV9mcmFnID0gZnJhZ19ub3c7Ci0JICBwID0gZnJhZ192YXIocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKTAsIHN5bWJvbFAsCi0JCSAgICAgICAob2Zmc2V0VCkgdGVtcCwgKGNoYXIgKikgMCk7Ci0JICAqcCA9IDA7Ci0JICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOyAvKiByZXN0b3JlIGN1cnJlbnQgc2VnICovCi0JICBTX1NFVF9TRUdNRU5UKHN5bWJvbFAsIFNFR19FMik7Ci0JICBTX1NFVF9TVE9SQUdFX0NMQVNTKHN5bWJvbFAsIENfU1RBVCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGFzX2JhZChfKCJTeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkIiksIG5hbWUpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotZml4dXBfbWRlcHMgKGZyYWdzLCBoLCB0aGlzX3NlZ21lbnQpCi0gICAgIGZyYWdTICogZnJhZ3M7Ci0gICAgIG9iamVjdF9oZWFkZXJzICogaDsKLSAgICAgc2VnVCB0aGlzX3NlZ21lbnQ7Ci17Ci0gIHN1YnNlZ19jaGFuZ2UgKHRoaXNfc2VnbWVudCwgMCk7Ci0gIHdoaWxlIChmcmFncykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGZyYWdzLT5mcl90eXBlKQotCXsKLQljYXNlIHJzX2FsaWduOgotCWNhc2UgcnNfYWxpZ25fY29kZToKLQljYXNlIHJzX29yZzoKLSNpZmRlZiBIQU5ETEVfQUxJR04KLQkgIEhBTkRMRV9BTElHTiAoZnJhZ3MpOwotI2VuZGlmCi0JICBmcmFncy0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0JICBmcmFncy0+ZnJfb2Zmc2V0ID0KLQkgICAgKChmcmFncy0+ZnJfbmV4dC0+ZnJfYWRkcmVzcyAtIGZyYWdzLT5mcl9hZGRyZXNzIC0gZnJhZ3MtPmZyX2ZpeCkKLQkgICAgIC8gZnJhZ3MtPmZyX3Zhcik7Ci0JICBicmVhazsKLQljYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50OgotCSAgbWRfY29udmVydF9mcmFnIChoLCB0aGlzX3NlZ21lbnQsIGZyYWdzKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ3MpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIDsKLQl9Ci0gICAgICBmcmFncyA9IGZyYWdzLT5mcl9uZXh0OwotICAgIH0KLX0KLQotI2lmIDEKLQotI2lmbmRlZiBUQ19GT1JDRV9SRUxPQ0FUSU9OCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4KSAwCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLWZpeHVwX3NlZ21lbnQgKHNlZ1AsIHRoaXNfc2VnbWVudF90eXBlKQotICAgICBzZWdtZW50X2luZm9fdHlwZSAqIHNlZ1A7Ci0gICAgIHNlZ1QgdGhpc19zZWdtZW50X3R5cGU7Ci17Ci0gIHJlZ2lzdGVyIGZpeFMgKiBmaXhQOwotICByZWdpc3RlciBzeW1ib2xTICphZGRfc3ltYm9sUDsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ViX3N5bWJvbFA7Ci0gIGxvbmcgYWRkX251bWJlcjsKLSAgcmVnaXN0ZXIgaW50IHNpemU7Ci0gIHJlZ2lzdGVyIGNoYXIgKnBsYWNlOwotICByZWdpc3RlciBsb25nIHdoZXJlOwotICByZWdpc3RlciBjaGFyIHBjcmVsOwotICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gIHJlZ2lzdGVyIHNlZ1QgYWRkX3N5bWJvbF9zZWdtZW50ID0gYWJzb2x1dGVfc2VjdGlvbjsKLQotICBmb3IgKGZpeFAgPSBzZWdQLT5maXhfcm9vdDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCi0gICAgewotICAgICAgZnJhZ1AgPSBmaXhQLT5meF9mcmFnOwotICAgICAga25vdyAoZnJhZ1ApOwotICAgICAgd2hlcmUgPSBmaXhQLT5meF93aGVyZTsKLSAgICAgIHBsYWNlID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyB3aGVyZTsKLSAgICAgIHNpemUgPSBmaXhQLT5meF9zaXplOwotICAgICAgYWRkX3N5bWJvbFAgPSBmaXhQLT5meF9hZGRzeTsKLSAgICAgIHN1Yl9zeW1ib2xQID0gZml4UC0+Znhfc3Vic3k7Ci0gICAgICBhZGRfbnVtYmVyID0gZml4UC0+Znhfb2Zmc2V0OwotICAgICAgcGNyZWwgPSBmaXhQLT5meF9wY3JlbDsKLQotICAgICAgLyogV2Ugd2FudCBmdW5jdGlvbi1yZWxhdGl2ZSBzdGFicyB0byB3b3JrIG9uIHN5c3RlbXMgd2hpY2gKLQkgbWF5IHVzZSBhIHJlbGF4aW5nIGxpbmtlcjsgdGh1cyB3ZSBtdXN0IGhhbmRsZSB0aGUgc3ltMS1zeW0yCi0JIGZpeHVwcyBmdW5jdGlvbi1yZWxhdGl2ZSBzdGFicyBnZW5lcmF0ZXMuCi0KLQkgT2YgY291cnNlLCBpZiB5b3UgYWN0dWFsbHkgZW5hYmxlIHJlbGF4aW5nIGluIHRoZSBsaW5rZXIsIHRoZQotCSBsaW5lIGFuZCBibG9jayBzY29waW5nIGluZm9ybWF0aW9uIGlzIGdvaW5nIHRvIGJlIGluY29ycmVjdAotCSBpbiBzb21lIGNhc2VzLiAgVGhlIG9ubHkgd2F5IHRvIHJlYWxseSBmaXggdGhpcyBpcyB0byBzdXBwb3J0Ci0JIGEgcmVsb2MgaW52b2x2aW5nIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChsaW5rcmVsYXgKLQkgICYmICghc3ViX3N5bWJvbFAgfHwgcGNyZWwpKQotCWNvbnRpbnVlOwotCi0jaWZkZWYgVENfSTk2MAotICAgICAgaWYgKGZpeFAtPmZ4X3RjYml0ICYmIFNGX0dFVF9DQUxMTkFNRSAoYWRkX3N5bWJvbFApKQotCXsKLQkgIC8qIFJlbG9jYXRpb24gc2hvdWxkIGJlIGRvbmUgdmlhIHRoZSBhc3NvY2lhdGVkICdiYWwnIGVudHJ5Ci0JICAgICBwb2ludCBzeW1ib2wuICovCi0KLQkgIGlmICghU0ZfR0VUX0JBTE5BTUUgKHRjX2dldF9iYWxfb2ZfY2FsbCAoYWRkX3N5bWJvbFApKSkKLQkgICAgewotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgICBfKCJObyAnYmFsJyBlbnRyeSBwb2ludCBmb3IgbGVhZnByb2MgJXMiKSwKLQkJCSAgICBTX0dFVF9OQU1FIChhZGRfc3ltYm9sUCkpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBmaXhQLT5meF9hZGRzeSA9IGFkZF9zeW1ib2xQID0gdGNfZ2V0X2JhbF9vZl9jYWxsIChhZGRfc3ltYm9sUCk7Ci0JfQotI2VuZGlmCi0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgc3ltYm9scyBoYXZlIGJlZW4gcmVzb2x2ZWQ7IHRoaXMgbWF5IG5vdCBoYXZlCi0gICAgICAgICBoYXBwZW5lZCBpZiB0aGVzZSBhcmUgZXhwcmVzc2lvbiBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChhZGRfc3ltYm9sUCAhPSBOVUxMICYmICEgYWRkX3N5bWJvbFAtPnN5X3Jlc29sdmVkKQotCXJlc29sdmVfc3ltYm9sX3ZhbHVlIChhZGRfc3ltYm9sUCwgMSk7Ci0KLSAgICAgIGlmIChhZGRfc3ltYm9sUCAhPSBOVUxMKQotCXsKLQkgIC8qIElmIHRoaXMgZml4dXAgaXMgYWdhaW5zdCBhIHN5bWJvbCB3aGljaCBoYXMgYmVlbiBlcXVhdGVkCi0JICAgICB0byBhbm90aGVyIHN5bWJvbCwgY29udmVydCBpdCB0byB0aGUgb3RoZXIgc3ltYm9sLiAgKi8KLQkgIGlmIChhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCSAgICAgICYmICghIFNfSVNfREVGSU5FRCAoYWRkX3N5bWJvbFApCi0JCSAgfHwgU19JU19DT01NT04gKGFkZF9zeW1ib2xQKSkpCi0JICAgIHsKLQkgICAgICB3aGlsZSAoYWRkX3N5bWJvbFAtPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wKLQkJICAgICAmJiAoISBTX0lTX0RFRklORUQgKGFkZF9zeW1ib2xQKQotCQkJIHx8IFNfSVNfQ09NTU9OIChhZGRfc3ltYm9sUCkpKQotCQl7Ci0JCSAgc3ltYm9sUyAqbjsKLQotCQkgIC8qIFdlIG11c3QgYXZvaWQgbG9vcGluZywgYXMgdGhhdCBjYW4gb2NjdXIgd2l0aCBhCi0JCSAgICAgYmFkbHkgd3JpdHRlbiBwcm9ncmFtLiAgKi8KLQkJICBuID0gYWRkX3N5bWJvbFAtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbDsKLQkJICBpZiAobiA9PSBhZGRfc3ltYm9sUCkKLQkJICAgIGJyZWFrOwotCQkgIGFkZF9udW1iZXIgKz0gYWRkX3N5bWJvbFAtPnN5X3ZhbHVlLlhfYWRkX251bWJlcjsKLQkJICBhZGRfc3ltYm9sUCA9IG47Ci0JCX0KLQkgICAgICBmaXhQLT5meF9hZGRzeSA9IGFkZF9zeW1ib2xQOwotCSAgICAgIGZpeFAtPmZ4X29mZnNldCA9IGFkZF9udW1iZXI7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChzdWJfc3ltYm9sUCAhPSBOVUxMICYmICEgc3ViX3N5bWJvbFAtPnN5X3Jlc29sdmVkKQotCXJlc29sdmVfc3ltYm9sX3ZhbHVlIChzdWJfc3ltYm9sUCwgMSk7Ci0KLSAgICAgIGlmIChhZGRfc3ltYm9sUCAhPSBOVUxMCi0JICAmJiBhZGRfc3ltYm9sUC0+c3lfbXJpX2NvbW1vbikKLQl7Ci0JICBrbm93IChhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbCk7Ci0JICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0JICBmaXhQLT5meF9vZmZzZXQgPSBhZGRfbnVtYmVyOwotCSAgYWRkX3N5bWJvbFAgPSBmaXhQLT5meF9hZGRzeSA9IGFkZF9zeW1ib2xQLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2w7Ci0JfQotCi0gICAgICBpZiAoYWRkX3N5bWJvbFApCi0JewotCSAgYWRkX3N5bWJvbF9zZWdtZW50ID0gU19HRVRfU0VHTUVOVCAoYWRkX3N5bWJvbFApOwotCX0JCQkvKiBpZiB0aGVyZSBpcyBhbiBhZGRlbmQgKi8KLQotICAgICAgaWYgKHN1Yl9zeW1ib2xQKQotCXsKLQkgIGlmIChhZGRfc3ltYm9sUCA9PSBOVUxMIHx8IGFkZF9zeW1ib2xfc2VnbWVudCA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgaWYgKGFkZF9zeW1ib2xQICE9IE5VTEwpCi0JCXsKLQkJICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0JCSAgYWRkX3N5bWJvbFAgPSBOVUxMOwotCQkgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJfQotCi0JICAgICAgLyogSXQncyBqdXN0IC1zeW0uICAqLwotCSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkJewotCQkgIGFkZF9udW1iZXIgLT0gU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKTsKLQkJICBmaXhQLT5meF9zdWJzeSA9IDA7Ci0JCSAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLSNpZm5kZWYgVENfTTY4SwotCQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCQlfKCJOZWdhdGl2ZSBvZiBub24tYWJzb2x1dGUgc3ltYm9sICVzIiksCi0JCQkJU19HRVRfTkFNRSAoc3ViX3N5bWJvbFApKTsKLSNlbmRpZgotCQkgIGFkZF9udW1iZXIgLT0gU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKTsKLQkJfQkJLyogbm90IGFic29sdXRlICovCi0KLQkgICAgICAvKiBpZiBzdWJfc3ltYm9sIGlzIGluIHRoZSBzYW1lIHNlZ21lbnQgdGhhdCBhZGRfc3ltYm9sCi0JCSBhbmQgYWRkX3N5bWJvbCBpcyBlaXRoZXIgaW4gREFUQSwgVEVYVCwgQlNTIG9yIEFCU09MVVRFICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhZGRfc3ltYm9sX3NlZ21lbnQKLQkJICAgJiYgU0VHX05PUk1BTCAoYWRkX3N5bWJvbF9zZWdtZW50KSkKLQkgICAgewotCSAgICAgIC8qIERpZmZlcmVuY2Ugb2YgMiBzeW1ib2xzIGZyb20gc2FtZSBzZWdtZW50LiAgQ2FuJ3QKLQkJIG1ha2UgZGlmZmVyZW5jZSBvZiAyIHVuZGVmaW5lZHM6ICd2YWx1ZScgbWVhbnMKLQkJIHNvbWV0aGluZyBkaWZmZXJlbnQgZm9yIE5fVU5ERi4gKi8KLSNpZmRlZiBUQ19JOTYwCi0JICAgICAgLyogTWFrZXMgbm8gc2Vuc2UgdG8gdXNlIHRoZSBkaWZmZXJlbmNlIG9mIDIgYXJiaXRyYXJ5IHN5bWJvbHMKLQkgICAgICAgICBhcyB0aGUgdGFyZ2V0IG9mIGEgY2FsbCBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgaWYgKGZpeFAtPmZ4X3RjYml0KQotCQl7Ci0JCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJCV8oImNhbGxqIHRvIGRpZmZlcmVuY2Ugb2YgMiBzeW1ib2xzIikpOwotCQl9Ci0jZW5kaWYgLyogVENfSTk2MCAqLwotCSAgICAgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKSAtCi0JCVNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCk7Ci0JICAgICAgYWRkX3N5bWJvbFAgPSBOVUxMOwotCi0JICAgICAgaWYgKCFUQ19GT1JDRV9SRUxPQ0FUSU9OIChmaXhQKSkKLQkJewotCQkgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJICBmaXhQLT5meF9zdWJzeSA9IE5VTEw7Ci0JCSAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0jaWZkZWYgVENfTTY4SyAvKiBpcyB0aGlzIHJpZ2h0PyAqLwotCQkgIHBjcmVsID0gMDsKLQkJICBmaXhQLT5meF9wY3JlbCA9IDA7Ci0jZW5kaWYKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBEaWZmZXJlbnQgc2VnbWVudHMgaW4gc3VidHJhY3Rpb24uICovCi0JICAgICAga25vdyAoIShTX0lTX0VYVEVSTkFMIChzdWJfc3ltYm9sUCkgJiYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSkpOwotCi0JICAgICAgaWYgKChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWJzb2x1dGVfc2VjdGlvbikpCi0JCXsKLQkJICBhZGRfbnVtYmVyIC09IFNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCk7Ci0JCX0KLSNpZmRlZiBESUZGX0VYUFJfT0sKLQkgICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gdGhpc19zZWdtZW50X3R5cGUKLSNpZiAwIC8qIE9rYXkgZm9yIDY4aywgYXQgbGVhc3QuLi4gKi8KLQkJICAgICAgICYmICFwY3JlbAotI2VuZGlmCi0JCSAgICAgICApCi0JCXsKLQkJICAvKiBNYWtlIGl0IHBjLXJlbGF0aXZlLiAgKi8KLQkJICBhZGRfbnVtYmVyICs9IChtZF9wY3JlbF9mcm9tIChmaXhQKQotCQkJCSAtIFNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCkpOwotCQkgIHBjcmVsID0gMTsKLQkJICBmaXhQLT5meF9wY3JlbCA9IDE7Ci0JCSAgc3ViX3N5bWJvbFAgPSAwOwotCQkgIGZpeFAtPmZ4X3N1YnN5ID0gMDsKLQkJfQotI2VuZGlmCi0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJCV8oIkNhbid0IGVtaXQgcmVsb2Mgey0gJXMtc2VnIHN5bWJvbCBcIiVzXCJ9IEAgZmlsZSBhZGRyZXNzICVsZC4iKSwKLQkJCQlzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSksCi0JCQkJU19HRVRfTkFNRSAoc3ViX3N5bWJvbFApLAotCQkJCShsb25nKSAoZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZSkpOwotCQl9CQkvKiBpZiBhYnNvbHV0ZSAqLwotCSAgICB9Ci0JfQkJCS8qIGlmIHN1Yl9zeW1ib2xQICovCi0KLSAgICAgIGlmIChhZGRfc3ltYm9sUCkKLQl7Ci0JICBpZiAoYWRkX3N5bWJvbF9zZWdtZW50ID09IHRoaXNfc2VnbWVudF90eXBlICYmIHBjcmVsKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBUaGlzIGZpeHVwIHdhcyBtYWRlIHdoZW4gdGhlIHN5bWJvbCdzIHNlZ21lbnQgd2FzCi0JICAgICAgICogU0VHX1VOS05PV04sIGJ1dCBpdCBpcyBub3cgaW4gdGhlIGxvY2FsIHNlZ21lbnQuCi0JICAgICAgICogU28gd2Uga25vdyBob3cgdG8gZG8gdGhlIGFkZHJlc3Mgd2l0aG91dCByZWxvY2F0aW9uLgotCSAgICAgICAqLwotI2lmZGVmIFRDX0k5NjAKLQkgICAgICAvKiByZWxvY19jYWxsaigpIG1heSByZXBsYWNlIGEgJ2NhbGwnIHdpdGggYSAnY2FsbHMnIG9yIGEgJ2JhbCcsCi0JICAgICAgICogaW4gd2hpY2ggY2FzZXMgaXQgbW9kaWZpZXMgKmZpeFAgYXMgYXBwcm9wcmlhdGUuICBJbiB0aGUgY2FzZQotCSAgICAgICAqIG9mIGEgJ2NhbGxzJywgbm8gZnVydGhlciB3b3JrIGlzIHJlcXVpcmVkLCBhbmQgKmZpeFAgaGFzIGJlZW4KLQkgICAgICAgKiBzZXQgdXAgdG8gbWFrZSB0aGUgcmVzdCBvZiB0aGUgY29kZSBiZWxvdyBhIG5vLW9wLgotCSAgICAgICAqLwotCSAgICAgIHJlbG9jX2NhbGxqIChmaXhQKTsKLSNlbmRpZiAvKiBUQ19JOTYwICovCi0KLQkgICAgICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0JICAgICAgYWRkX251bWJlciAtPSBtZF9wY3JlbF9mcm9tIChmaXhQKTsKLQotCSAgICAgIC8qIFdlIHVzZWQgdG8gZG8KLQkJICAgYWRkX251bWJlciAtPSBzZWdQLT5zY25oZHIuc192YWRkcjsKLQkJIGlmIGRlZmluZWQgKFRDX0kzODYpIHx8IGRlZmluZWQgKFRFX0xZTlgpLiAgSSBub3cKLQkJIHRoaW5rIHRoYXQgd2FzIGFuIGVycm9yIHByb3BhZ2F0ZWQgZnJvbSB0aGUgY2FzZSB3aGVuCi0JCSB3ZSBhcmUgZ29pbmcgdG8gZW1pdCB0aGUgcmVsb2NhdGlvbi4gIElmIHdlIGFyZSBub3QKLQkJIGdvaW5nIHRvIGVtaXQgdGhlIHJlbG9jYXRpb24sIHRoZW4gd2UganVzdCB3YW50IHRvCi0JCSBzZXQgYWRkX251bWJlciB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2xzLgotCQkgVGhpcyBpcyBhIGNhc2UgdGhhdCB3b3VsZCBvbmx5IGFyaXNlIHdoZW4gdGhlcmUgaXMgYQotCQkgUEMgcmVsYXRpdmUgcmVmZXJlbmNlIGZyb20gYSBzZWN0aW9uIG90aGVyIHRoYW4gLnRleHQKLQkJIHRvIGEgc3ltYm9sIGRlZmluZWQgaW4gdGhlIHNhbWUgc2VjdGlvbiwgYW5kIHRoZQotCQkgcmVmZXJlbmNlIGlzIG5vdCByZWxheGVkLiAgU2luY2UganVtcCBpbnN0cnVjdGlvbnMgb24KLQkJIHRoZSBpMzg2IGFyZSByZWxheGVkLCB0aGlzIGNvdWxkIG9ubHkgYXJpc2Ugd2l0aCBhCi0JCSBjYWxsIGluc3RydWN0aW9uLiAgKi8KLQotCSAgICAgIHBjcmVsID0gMDsJLyogTGllLiBEb24ndCB3YW50IGZ1cnRoZXIgcGNyZWwgcHJvY2Vzc2luZy4gKi8KLQkgICAgICBpZiAoIVRDX0ZPUkNFX1JFTE9DQVRJT04gKGZpeFApKQotCQl7Ci0JCSAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQkgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN3aXRjaCAoYWRkX3N5bWJvbF9zZWdtZW50KQotCQl7Ci0JCWNhc2UgYWJzb2x1dGVfc2VjdGlvbjoKLSNpZmRlZiBUQ19JOTYwCi0JCSAgcmVsb2NfY2FsbGogKGZpeFApOwkvKiBTZWUgY29tbWVudCBhYm91dCByZWxvY19jYWxsaigpIGFib3ZlKi8KLSNlbmRpZiAvKiBUQ19JOTYwICovCi0JCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotCQkgIGFkZF9zeW1ib2xQID0gTlVMTDsKLQotCQkgIGlmICghVENfRk9SQ0VfUkVMT0NBVElPTiAoZml4UCkpCi0JCSAgICB7Ci0JCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJICAgICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0KLQotI2lmIGRlZmluZWQoVENfQTI5SykgfHwgKGRlZmluZWQoVEVfUEUpICYmIGRlZmluZWQoVENfSTM4NikpIHx8IGRlZmluZWQoVENfTTg4SykKLQkJICAvKiBUaGlzIHJlYWxseSBzaG91bGQgYmUgaGFuZGxlZCBpbiB0aGUgbGlua2VyLCBidXQKLQkJICAgICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvcmJpZHMuICAqLwotCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLSNlbHNlCi0JCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApICsKLQkJICAgIHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UIChhZGRfc3ltYm9sUCldLnNjbmhkci5zX3BhZGRyOwotI2VuZGlmCi0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBTRUdfVU5LTk9XTjoKLSNpZmRlZiBUQ19JOTYwCi0JCSAgaWYgKChpbnQpIGZpeFAtPmZ4X2JpdF9maXhQID09IDEzKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGlzIGEgQ09CUiBpbnN0cnVjdGlvbi4gIFRoZXkgaGF2ZSBvbmx5IGEKLQkJICAgICAgICogMTMtYml0IGRpc3BsYWNlbWVudCBhbmQgYXJlIG9ubHkgdG8gYmUgdXNlZAotCQkgICAgICAgKiBmb3IgbG9jYWwgYnJhbmNoZXM6IGZsYWcgYXMgZXJyb3IsIGRvbid0IGdlbmVyYXRlCi0JCSAgICAgICAqIHJlbG9jYXRpb24uCi0JCSAgICAgICAqLwotCQkgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkJICAgIF8oImNhbid0IHVzZSBDT0JSIGZvcm1hdCB3aXRoIGV4dGVybmFsIGxhYmVsIikpOwotCQkgICAgICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0JCS8qIENPQlIgKi8KLSNlbmRpZiAvKiBUQ19JOTYwICovCi0jaWYgKChkZWZpbmVkIChUQ19JMzg2KSB8fCBkZWZpbmVkIChURV9MWU5YKSB8fCBkZWZpbmVkIChURV9BVVgpKSAmJiAhZGVmaW5lZChURV9QRSkpIHx8IGRlZmluZWQgKENPRkZfQ09NTU9OX0FEREVORCkKLQkJICAvKiAzODYgQ09GRiB1c2VzIGEgcGVjdWxpYXIgZm9ybWF0IGluIHdoaWNoIHRoZQotCQkgICAgIHZhbHVlIG9mIGEgY29tbW9uIHN5bWJvbCBpcyBzdG9yZWQgaW4gdGhlIC50ZXh0Ci0JCSAgICAgc2VnbWVudCAoSSd2ZSBjaGVja2VkIHRoaXMgb24gU1ZSMy4yIGFuZCBTQ08KLQkJICAgICAzLjIuMikgSWFuIFRheWxvciA8aWFuQGN5Z251cy5jb20+LiAgKi8KLQkJICAvKiBUaGlzIGlzIGFsc28gdHJ1ZSBmb3IgNjhrIENPRkYgb24gc3lzdiBtYWNoaW5lcwotCQkgICAgIChDaGVja2VkIG9uIE1vdG9yb2xhIHN5c3Y2OCBSM1Y2IGFuZCBSM1Y3LjEsIGFuZCBhbHNvIG9uCi0JCSAgICAgVU5JWCBTeXN0ZW0gVi9NNjgwMDAsIFJlbGVhc2UgMS4wIGZyb20gQVRUL0JlbGwgTGFicykKLQkJICAgICBQaGlsaXBwZSBEZSBNdXl0ZXIgPHBoZG1AaW5mby51Y2wuYWMuYmU+LiAqLwotCQkgIGlmIChTX0lTX0NPTU1PTiAoYWRkX3N5bWJvbFApKQotCQkgICAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotI2VuZGlmCi0JCSAgYnJlYWs7Ci0KLQotCQl9CQkvKiBzd2l0Y2ggb24gc3ltYm9sIHNlZyAqLwotCSAgICB9CQkJLyogaWYgbm90IGluIGxvY2FsIHNlZyAqLwotCX0JCQkvKiBpZiB0aGVyZSB3YXMgYSArIHN5bWJvbCAqLwotCi0gICAgICBpZiAocGNyZWwpCi0JewotI2lmICFkZWZpbmVkKFRDX004OEspICYmICEoZGVmaW5lZChURV9QRSkgJiYgZGVmaW5lZChUQ19JMzg2KSkgJiYgIWRlZmluZWQoVENfQTI5SykKLQkgIC8qIFRoaXMgYWRqdXN0bWVudCBpcyBub3QgY29ycmVjdCBvbiB0aGUgbTg4aywgZm9yIHdoaWNoIHRoZQotCSAgICAgbGlua2VyIGRvZXMgYWxsIHRoZSBjb21wdXRhdGlvbi4gICovCi0JICBhZGRfbnVtYmVyIC09IG1kX3BjcmVsX2Zyb20gKGZpeFApOwotI2VuZGlmCi0JICBpZiAoYWRkX3N5bWJvbFAgPT0gMCkKLQkgICAgewotCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gJmFic19zeW1ib2w7Ci0JICAgIH0JCQkvKiBpZiB0aGVyZSdzIGFuIGFkZF9zeW1ib2wgKi8KLSNpZiBkZWZpbmVkIChUQ19JMzg2KSB8fCBkZWZpbmVkIChURV9MWU5YKSB8fCBkZWZpbmVkIChUQ19JOTYwKSB8fCBkZWZpbmVkIChUQ19NNjhLKQotCSAgLyogT24gdGhlIDM4NiB3ZSBtdXN0IGFkanVzdCBieSB0aGUgc2VnbWVudCB2YWRkciBhcyB3ZWxsLgotCSAgICAgSWFuIFRheWxvci4KLQotCSAgICAgSSBjaGFuZ2VkIHRoZSBpOTYwIHRvIHdvcmsgdGhpcyB3YXkgYXMgd2VsbC4gIFRoaXMgaXMKLQkgICAgIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBHTlUgbGlua2VyIGJlaGF2aW91ci4gIEkgZG8KLQkgICAgIG5vdCBrbm93IHdoYXQgb3RoZXIgaTk2MCBDT0ZGIGFzc2VtYmxlcnMgZG8uICBUaGlzIGlzIG5vdAotCSAgICAgYSBjb21tb24gY2FzZTogbm9ybWFsbHksIG9ubHkgYXNzZW1ibGVyIGNvZGUgd2lsbCBjb250YWluCi0JICAgICBhIFBDIHJlbGF0aXZlIHJlbG9jLCBhbmQgb25seSBicmFuY2hlcyB3aGljaCBkbyBub3QKLQkgICAgIG9yaWdpbmF0ZSBpbiB0aGUgLnRleHQgc2VjdGlvbiB3aWxsIGhhdmUgYSBub24temVybwotCSAgICAgYWRkcmVzcy4KLQotCSAgICAgSSBjaGFuZ2VkIHRoZSBtNjhrIHRvIHdvcmsgdGhpcyB3YXkgYXMgd2VsbC4gIFRoaXMgd2lsbAotCSAgICAgYnJlYWsgZXhpc3RpbmcgUEMgcmVsYXRpdmUgcmVsb2NzIGZyb20gc2VjdGlvbnMgd2hpY2ggZG8KLQkgICAgIG5vdCBzdGFydCBhdCBhZGRyZXNzIDAsIGJ1dCBpdCB3aWxsIG1ha2UgbGQgLXIgd29yay4KLQkgICAgIElhbiBUYXlsb3IsIDQgT2N0IDk2LiAgKi8KLQotCSAgYWRkX251bWJlciAtPSBzZWdQLT5zY25oZHIuc192YWRkcjsKLSNlbmRpZgotCX0JCQkvKiBpZiBwY3JlbCAqLwotCi0jaWZkZWYgTURfQVBQTFlfRklYMwotICAgICAgbWRfYXBwbHlfZml4MyAoZml4UCwgKHZhbHVlVCAqKSAmYWRkX251bWJlciwgdGhpc19zZWdtZW50X3R5cGUpOwotI2Vsc2UKLSAgICAgIG1kX2FwcGx5X2ZpeCAoZml4UCwgYWRkX251bWJlcik7Ci0jZW5kaWYKLQotICAgICAgaWYgKCFmaXhQLT5meF9iaXRfZml4UCAmJiAhIGZpeFAtPmZ4X25vX292ZXJmbG93KQotCXsKLSNpZm5kZWYgVENfTTg4SwotCSAgLyogVGhlIG04OGsgdXNlcyB0aGUgb2Zmc2V0IGZpZWxkIG9mIHRoZSByZWxvYyB0byBnZXQgYXJvdW5kCi0JICAgICB0aGlzIHByb2JsZW0uICAqLwotCSAgaWYgKChzaXplID09IDEKLQkgICAgICAgJiYgKChhZGRfbnVtYmVyICYgfjB4RkYpCi0JCSAgIHx8IChmaXhQLT5meF9zaWduZWQgJiYgKGFkZF9udW1iZXIgJiAweDgwKSkpCi0JICAgICAgICYmICgoYWRkX251bWJlciAmIH4weEZGKSAhPSAoLTEgJiB+MHhGRikKLQkJICAgfHwgKGFkZF9udW1iZXIgJiAweDgwKSA9PSAwKSkKLQkgICAgICB8fCAoc2l6ZSA9PSAyCi0JCSAgJiYgKChhZGRfbnVtYmVyICYgfjB4RkZGRikKLQkJICAgICAgfHwgKGZpeFAtPmZ4X3NpZ25lZCAmJiAoYWRkX251bWJlciAmIDB4ODAwMCkpKQotCQkgICYmICgoYWRkX251bWJlciAmIH4weEZGRkYpICE9ICgtMSAmIH4weEZGRkYpCi0JCSAgICAgIHx8IChhZGRfbnVtYmVyICYgMHg4MDAwKSA9PSAwKSkpCi0JICAgIHsKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICAgXygiVmFsdWUgb2YgJWxkIHRvbyBsYXJnZSBmb3IgZmllbGQgb2YgJWQgYnl0ZXMgYXQgMHglbHgiKSwKLQkJCSAgICAobG9uZykgYWRkX251bWJlciwgc2l6ZSwKLQkJCSAgICAodW5zaWduZWQgbG9uZykgKGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmUpKTsKLQkgICAgfQotI2VuZGlmCi0jaWZkZWYgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRAotCSAgLyogV2FybiBpZiBhIC53b3JkIHZhbHVlIGlzIHRvbyBsYXJnZSB3aGVuIHRyZWF0ZWQgYXMgYQotCSAgICAgc2lnbmVkIG51bWJlci4gIFdlIGFscmVhZHkga25vdyBpdCBpcyBub3QgdG9vIG5lZ2F0aXZlLgotCSAgICAgVGhpcyBpcyB0byBjYXRjaCBvdmVyLWxhcmdlIHN3aXRjaGVzIGdlbmVyYXRlZCBieSBnY2Mgb24KLQkgICAgIHRoZSA2OGsuICAqLwotCSAgaWYgKCFmbGFnX3NpZ25lZF9vdmVyZmxvd19vawotCSAgICAgICYmIHNpemUgPT0gMgotCSAgICAgICYmIGFkZF9udW1iZXIgPiAweDdmZmYpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygiU2lnbmVkIC53b3JkIG92ZXJmbG93OyBzd2l0Y2ggbWF5IGJlIHRvbyBsYXJnZTsgJWxkIGF0IDB4JWx4IiksCi0JCQkgIChsb25nKSBhZGRfbnVtYmVyLAotCQkJICAodW5zaWduZWQgbG9uZykgKGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmUpKTsKLSNlbmRpZgotCX0JCQkvKiBub3QgYSBiaXQgZml4ICovCi0gICAgfQkJCQkvKiBGb3IgZWFjaCBmaXhTIGluIHRoaXMgc2VnbWVudC4gKi8KLX0JCQkJLyogZml4dXBfc2VnbWVudCgpICovCi0KLSNlbmRpZgotCi0vKiBUaGUgZmlyc3QgZW50cnkgaW4gYSAuc3RhYiBzZWN0aW9uIGlzIHNwZWNpYWwuICAqLwotCi12b2lkCi1vYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbiAoc2VnKQotICAgICBzZWdUIHNlZzsKLXsKLSAgY2hhciAqZmlsZTsKLSAgY2hhciAqcDsKLSAgY2hhciAqc3RhYnN0cl9uYW1lOwotICB1bnNpZ25lZCBpbnQgc3Ryb2ZmOwotCi0gIC8qIE1ha2Ugc3BhY2UgZm9yIHRoaXMgZmlyc3Qgc3ltYm9sLiAqLwotICBwID0gZnJhZ19tb3JlICgxMik7Ci0gIC8qIFplcm8gaXQgb3V0LiAqLwotICBtZW1zZXQgKHAsIDAsIDEyKTsKLSAgYXNfd2hlcmUgKCZmaWxlLCAodW5zaWduZWQgaW50ICopIE5VTEwpOwotICBzdGFic3RyX25hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoc2VnbWVudF9pbmZvW3NlZ10ubmFtZSkgKyA0KTsKLSAgc3RyY3B5IChzdGFic3RyX25hbWUsIHNlZ21lbnRfaW5mb1tzZWddLm5hbWUpOwotICBzdHJjYXQgKHN0YWJzdHJfbmFtZSwgInN0ciIpOwotICBzdHJvZmYgPSBnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0IChmaWxlLCBzdGFic3RyX25hbWUpOwotICBrbm93IChzdHJvZmYgPT0gMSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgc3Ryb2ZmLCA0KTsKLX0KLQotLyogRmlsbCBpbiB0aGUgY291bnRzIGluIHRoZSBmaXJzdCBlbnRyeSBpbiBhIC5zdGFiIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3N0YWJfc2VjdGlvbihhYmZkLCBzZWcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIHNlZ1Qgc3RhYnN0cnNlZyA9IFNFR19VTktOT1dOOwotICBjb25zdCBjaGFyICpzZWNuYW1lLCAqbmFtZTI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnAgPSBOVUxMOwotICBpbnQgaSwgc3Ryc3ogPSAwLCBuc3ltczsKLSAgZnJhZ1MgKmZyYWcgPSBzZWdtZW50X2luZm9bc2VnXS5mcmNoYWluUC0+ZnJjaF9yb290OwotCi0gIC8qIExvb2sgZm9yIHRoZSBhc3NvY2lhdGVkIHN0cmluZyB0YWJsZSBzZWN0aW9uLiAqLwotCi0gIHNlY25hbWUgPSBzZWdtZW50X2luZm9bc2VnXS5uYW1lOwotICBuYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKHNlY25hbWUpICsgNCk7Ci0gIHN0cmNweSAobmFtZSwgc2VjbmFtZSk7Ci0gIHN0cmNhdCAobmFtZSwgInN0ciIpOwotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgbmFtZTIgPSBzZWdtZW50X2luZm9baV0ubmFtZTsKLSAgICAgIGlmIChuYW1lMiAhPSBOVUxMICYmIHN0cm5jbXAobmFtZTIsIG5hbWUsIDgpID09IDApCi0JewotCSAgc3RhYnN0cnNlZyA9IGk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGZvdW5kIHRoZSBzZWN0aW9uLCBnZXQgaXRzIHNpemUuICovCi0gIGlmIChzdGFic3Ryc2VnICE9IFNFR19VTktOT1dOKQotICAgIHN0cnN6ID0gc2l6ZV9zZWN0aW9uIChhYmZkLCBzdGFic3Ryc2VnKTsKLQotICBuc3ltcyA9IHNpemVfc2VjdGlvbiAoYWJmZCwgc2VnKSAvIDEyIC0gMTsKLQotICAvKiBMb29rIGZvciB0aGUgZmlyc3QgZnJhZyBvZiBzdWZmaWNpZW50IHNpemUgZm9yIHRoZSBpbml0aWFsIHN0YWIKLSAgICAgc3ltYm9sLCBhbmQgY29sbGVjdCBhIHBvaW50ZXIgdG8gaXQuICovCi0gIHdoaWxlIChmcmFnICYmIGZyYWctPmZyX2ZpeCA8IDEyKQotICAgIGZyYWcgPSBmcmFnLT5mcl9uZXh0OwotICBhc3NlcnQgKGZyYWcgIT0gMCk7Ci0gIHAgPSBmcmFnLT5mcl9saXRlcmFsOwotICBhc3NlcnQgKHAgIT0gMCk7Ci0KLSAgLyogV3JpdGUgaW4gdGhlIG51bWJlciBvZiBzdGFiIHN5bWJvbHMgYW5kIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcKLSAgICAgdGFibGUuICovCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgKGJmZF92bWEpIG5zeW1zLCAoYmZkX2J5dGUgKikgcCArIDYpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzdHJzeiwgKGJmZF9ieXRlICopIHAgKyA4KTsKLX0KLQotI2VuZGlmIC8qIG5vdCBCRkRfQVNTRU1CTEVSICovCi0KLWNvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW10gPQotewotICB7ImRlZiIsIG9ial9jb2ZmX2RlZiwgMH0sCi0gIHsiZGltIiwgb2JqX2NvZmZfZGltLCAwfSwKLSAgeyJlbmRlZiIsIG9ial9jb2ZmX2VuZGVmLCAwfSwKLSAgeyJsaW5lIiwgb2JqX2NvZmZfbGluZSwgMH0sCi0gIHsibG4iLCBvYmpfY29mZl9sbiwgMH0sCi0gIHsiYXBwbGluZSIsIG9ial9jb2ZmX2xuLCAxfSwKLSAgeyJzY2wiLCBvYmpfY29mZl9zY2wsIDB9LAotICB7InNpemUiLCBvYmpfY29mZl9zaXplLCAwfSwKLSAgeyJ0YWciLCBvYmpfY29mZl90YWcsIDB9LAotICB7InR5cGUiLCBvYmpfY29mZl90eXBlLCAwfSwKLSAgeyJ2YWwiLCBvYmpfY29mZl92YWwsIDB9LAotICB7InNlY3Rpb24iLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0Iiwgb2JqX2NvZmZfc2VjdGlvbiwgMH0sCi0gIC8qIEZJWE1FOiBXZSBpZ25vcmUgdGhlIE1SSSBzaG9ydCBhdHRyaWJ1dGUuICAqLwotICB7InNlY3Rpb24ucyIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAotICB7InNlY3QucyIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAotICAvKiBXZSBhY2NlcHQgdGhlIC5ic3MgZGlyZWN0aXZlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGgKLSAgICAgZWFybGllciB2ZXJzaW9ucyBvZiBnYXMuICAqLwotICB7ImJzcyIsIG9ial9jb2ZmX2JzcywgMH0sCi0gIHsid2VhayIsIG9ial9jb2ZmX3dlYWssIDB9LAotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gIHsidXNlIiwgb2JqX2NvZmZfc2VjdGlvbiwgMH0sCi0gIHsidGV4dCIsIG9ial9jb2ZmX3RleHQsIDB9LAotICB7ImRhdGEiLCBvYmpfY29mZl9kYXRhLCAwfSwKLSAgeyJsY29tbSIsIG9ial9jb2ZmX2xjb21tLCAwfSwKLSAgeyJpZGVudCIsIG9ial9jb2ZmX2lkZW50LCAwfSwKLSNlbHNlCi0gIHsib3B0aW0iLCBzX2lnbm9yZSwgMH0sCS8qIEZvciBzdW4zODZpIGNjICg/KSAqLwotICB7ImlkZW50Iiwgc19pZ25vcmUsIDB9LAkvKiB3ZSBkb24ndCB5ZXQgaGFuZGxlIHRoaXMuICovCi0jZW5kaWYKLSAgeyJ2ZXJzaW9uIiwgc19pZ25vcmUsIDB9LAotICB7IkFCT1JUIiwgc19hYm9ydCwgMH0sCi0jaWZkZWYgVENfTTg4SwotICAvKiBUaGUgbTg4ayB1c2VzIHNkZWYgaW5zdGVhZCBvZiBkZWYuICAqLwotICB7InNkZWYiLCBvYmpfY29mZl9kZWYsIDB9LAotI2VuZGlmCi0gIHtOVUxMfQkJCS8qIGVuZCBzZW50aW5lbCAqLwotfTsJCQkJLyogb2JqX3BzZXVkb190YWJsZSAqLwotDAotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogU3VwcG9ydCBmb3IgYSBDT0ZGIGVtdWxhdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3BvcF9pbnNlcnQgKCkKLXsKLSAgcG9wX2luc2VydCAob2JqX3BzZXVkb190YWJsZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MgKHNlYykKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub19mdW5jICgpCi17Ci0gIGFib3J0ICgpOwotfQotCi1jb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyBjb2ZmX2Zvcm1hdF9vcHMgPQotewotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgMCwKLSAgMSwKLSAgY29mZl9mcm9iX3N5bWJvbCwKLSAgbm9fZnVuYywKLSAgY29mZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzLAotICAwLCAwLAotICAwLCAwLAotICAwLAotI2lmIDAKLSAgb2JqX2dlbmVyYXRlX2FzbV9saW5lbm8sCi0jZWxzZQotICBub19mdW5jLAotI2VuZGlmCi0jaWYgMAotICBvYmpfc3RhYiwKLSNlbHNlCi0gIG5vX2Z1bmMsCi0jZW5kaWYKLSAgY29mZl9zZWNfc3ltX29rX2Zvcl9yZWxvYywKLSAgY29mZl9wb3BfaW5zZXJ0LAotI2lmIDAKLSAgb2JqX3NldF9leHQsCi0jZWxzZQotICBub19mdW5jLAotI2VuZGlmCi0gIGNvZmZfb2JqX3JlYWRfYmVnaW5faG9vaywKLSAgY29mZl9vYmpfc3ltYm9sX25ld19ob29rLAotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1jb2ZmLmggYi9nYXMvY29uZmlnL29iai1jb2ZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NTA0NzcuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotY29mZi5oCisrKyAvZGV2L251bGwKQEAgLTEsODQxICswLDAgQEAKLS8qIGNvZmYgb2JqZWN0IGZpbGUgZm9ybWF0Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBPQkpfRk9STUFUX0gKLSNkZWZpbmUgT0JKX0ZPUk1BVF9ICi0KLSNkZWZpbmUgT0JKX0NPRkYgMQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0jZGVmaW5lIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQKLSNkZWZpbmUgT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIKLSNkZWZpbmUgQkZEX0hFQURFUlMKLSNkZWZpbmUgQkZECi0KLSNlbmRpZgotCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2luY2x1ZGUgImJmZC5oIgotCi0vKiBUaGlzIGludGVybmFsX2xpbmVubyBjcmFwIGlzIHRvIHN0b3AgbmFtZXNwYWNlIHBvbGx1dGlvbiBmcm9tIHRoZQotICAgYmZkIGludGVybmFsIGNvZmYgaGVhZGVyZmlsZS4gKi8KLSNkZWZpbmUgaW50ZXJuYWxfbGluZW5vIGJmZF9pbnRlcm5hbF9saW5lbm8KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jdW5kZWYgaW50ZXJuYWxfbGluZW5vCi0KLS8qIENQVS1zcGVjaWZpYyBzZXR1cDogICovCi0KLSNpZmRlZiBUQ19BUk0KLSNpbmNsdWRlICJjb2ZmL2FybS5oIgotI2lmbmRlZiBUQVJHRVRfRk9STUFUCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtYXJtIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFRDX1BQQwotI2lmZGVmIFRFX1BFCi0jaW5jbHVkZSAiY29mZi9wb3dlcnBjLmgiCi0jZWxzZQotI2luY2x1ZGUgImNvZmYvcnM2MDAwLmgiCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgVENfU1BBUkMKLSNpbmNsdWRlICJjb2ZmL3NwYXJjLmgiCi0jZW5kaWYKLQotI2lmZGVmIFRDX0kzODYKLSNpbmNsdWRlICJjb2ZmL2kzODYuaCIKLQotI2lmZGVmIFRFX1BFCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgInBlLWkzODYiCi0jZW5kaWYKLQotI2lmbmRlZiBUQVJHRVRfRk9STUFUCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtaTM4NiIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBUQ19NNjhLCi0jaW5jbHVkZSAiY29mZi9tNjhrLmgiCi0jaWZuZGVmIFRBUkdFVF9GT1JNQVQKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1tNjhrIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFRDX0EyOUsKLSNpbmNsdWRlICJjb2ZmL2EyOWsuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1hMjlrLWJpZyIKLSNlbmRpZgotCi0jaWZkZWYgVENfSTk2MAotI2luY2x1ZGUgImNvZmYvaTk2MC5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLUludGVsLWxpdHRsZSIKLSNlbmRpZgotCi0jaWZkZWYgVENfWjhLCi0jaW5jbHVkZSAiY29mZi96OGsuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi16OGsiCi0jZW5kaWYKLQotI2lmZGVmIFRDX0g4MzAwCi0jaW5jbHVkZSAiY29mZi9oODMwMC5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLWg4MzAwIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19IODUwMAotI2luY2x1ZGUgImNvZmYvaDg1MDAuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1oODUwMCIKLSNlbmRpZgotCi0jaWZkZWYgVENfU0gKLSNpbmNsdWRlICJjb2ZmL3NoLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCQkJCVwKLSAgKHNobAkJCQkJCQlcCi0gICA/IChzaF9zbWFsbCA/ICJjb2ZmLXNobC1zbWFsbCIgOiAiY29mZi1zaGwiKQkJXAotICAgOiAoc2hfc21hbGwgPyAiY29mZi1zaC1zbWFsbCIgOiAiY29mZi1zaCIpKQotI2VuZGlmCi0KLSNpZmRlZiBUQ19NODhLCi0jaW5jbHVkZSAiY29mZi9tODhrLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtbTg4a2JjcyIKLSNlbmRpZgotCi0jaWZkZWYgVENfVzY1Ci0jaW5jbHVkZSAiY29mZi93NjUuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi13NjUiCi0jZW5kaWYKLQotI2lmZGVmIFRDX1RJQzMwCi0jaW5jbHVkZSAiY29mZi90aWMzMC5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLXRpYzMwIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19USUM4MAotI2luY2x1ZGUgImNvZmYvdGljODAuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi10aWM4MCIKLSNkZWZpbmUgQUxJR05NRU5UX0lOX1NfRkxBR1MgMQotI2VuZGlmCi0KLSNpZmRlZiBUQ19NQ09SRQotI2luY2x1ZGUgImNvZmYvbWNvcmUuaCIKLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJwZS1tY29yZSIKLSNlbmRpZgotI2VuZGlmCi0KLS8qIFRhcmdldHMgbWF5IGFsc28gc2V0IHRoaXMuICBBbHNvLCBpZiBCRkRfQVNTRU1CTEVSIGlzIGRlZmluZWQsIHRoaXMKLSAgIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gZGVmaW5lZC4gICovCi0jdW5kZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotI2RlZmluZSBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTIDEKLQotI2lmbmRlZiBPQkpfQ09GRl9NQVhfQVVYRU5UUklFUwotI2RlZmluZSBPQkpfQ09GRl9NQVhfQVVYRU5UUklFUyAxCi0jZW5kaWYgLyogT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMgKi8KLQotZXh0ZXJuIHZvaWQgY29mZl9vYmpfc3ltYm9sX25ld19ob29rIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOwotI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rIGNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vawotCi1leHRlcm4gdm9pZCBjb2ZmX29ial9yZWFkX2JlZ2luX2hvb2sgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBvYmpfcmVhZF9iZWdpbl9ob29rIGNvZmZfb2JqX3JlYWRfYmVnaW5faG9vawotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBUaGlzIGZpbGUgcmVhbGx5IGNvbnRhaW5zIHR3byBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIENPRkYgYmFjayBlbmQuCi0gICBUaGV5IGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBtZXJnZWQsIGJ1dCB0aGlzIGlzIG9ubHkgYQotICAgcHJlbGltaW5hcnksIG1lY2hhbmljYWwgbWVyZ2luZy4gIE1hbnkgZGVmaW5pdGlvbnMgdGhhdCBhcmUKLSAgIGlkZW50aWNhbCBiZXR3ZWVuIHRoZSB0d28gYXJlIHN0aWxsIGZvdW5kIGluIGJvdGggdmVyc2lvbnMuCi0KLSAgIFRoZSBmaXJzdCB2ZXJzaW9uLCB3aXRoIEJGRF9BU1NFTUJMRVIgZGVmaW5lZCwgdXNlcyBoaWdoLWxldmVsIEJGRAotICAgaW50ZXJmYWNlcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLiAgVGhlIHNlY29uZCB2ZXJzaW9uLCB3aXRoCi0gICBCRkRfQVNTRU1CTEVSIG5vdCBkZWZpbmVkLCBhbHNvIHVzZXMgQkZELCBidXQgbW9zdGx5IGZvciBzd2FwcGluZwotICAgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBmb3IgZG9pbmcgdGhlIGFjdHVhbCBJL08uICBUaGUgbGF0dGVyIGRlZmluZXMKLSAgIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9scyBCRkQgYW5kIEJGRF9IRUFERVJTLiAgVHJ5IG5vdCB0byBsZXQgdGhpcwotICAgY29uZnVzZSB5b3UuCi0KLSAgIFRoZXNlIHR3byBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgbWVyZ2VkLCBhbmQgZXZlbnR1YWxseSB0aGUKLSAgIEJGRF9BU1NFTUJMRVIgdmVyc2lvbiBzaG91bGQgdGFrZSBvdmVyIGNvbXBsZXRlbHkuICBSZWxlYXNlIHRpbWluZwotICAgaXNzdWVzIGFuZCBuYW1lc3BhY2UgcHJvYmxlbXMgY29udmluY2VkIG1lIHRvIG1lcmdlIHRoZSB0d28KLSAgIHRvZ2V0aGVyIGluIHRoaXMgZmFzaGlvbiwgYSBsaXR0bGUgc29vbmVyIHRoYW4gSSB3b3VsZCBoYXZlIGxpa2VkLgotICAgVGhlIHJlYWwgbWVyZ2Ugc2hvdWxkIGJlIG11Y2ggYmV0dGVyIGRvbmUgYnkgdGhlIHRpbWUgdGhlIG5leHQKLSAgIHJlbGVhc2UgY29tZXMgb3V0LgotCi0gICBGb3Igbm93LCB0aGUgc3RydWN0dXJlIG9mIHRoaXMgZmlsZSBpczoKLQk8Y29tbW9uPgotCSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JPG9uZSB2ZXJzaW9uPgotCSNlbHNlCi0JPG90aGVyIHZlcnNpb24+Ci0JI2VuZGlmCi0JPGNvbW1vbj4KLSAgIFVuZm9ydHVuYXRlbHksIHRoZSBjb21tb24gcG9ydGlvbnMgYXJlIHZlcnkgc21hbGwgYXQgdGhlIG1vbWVudCwKLSAgIGFuZCBtYW55IGRlY2xhcmF0aW9ucyBvciBkZWZpbml0aW9ucyBhcmUgZHVwbGljYXRlZC4gIFRoZSBzdHJ1Y3R1cmUKLSAgIG9mIG9iai1jb2ZmLmMgaXMgc2ltaWxhci4KLQotICAgU2VlIGRvYy9pbnRlcm5hbHMudGV4aSBmb3IgYSBicmllZiBkaXNjdXNzaW9uIG9mIHRoZSBoaXN0b3J5LCBpZgotICAgeW91IGNhcmUuCi0KLSAgIEtlbiBSYWVidXJuLCA1IE1heSAxOTk0Ci0KLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNpbmNsdWRlICJiZmQvbGliY29mZi5oIgotCi0jZGVmaW5lIE9VVFBVVF9GTEFWT1IgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLQotLyogU1lNQk9MIFRBQkxFICovCi0KLS8qIEFsdGVyIHRoZSBmaWVsZCBuYW1lcywgZm9yIG5vdywgdW50aWwgd2UndmUgZml4ZWQgdXAgdGhlIG90aGVyCi0gICByZWZlcmVuY2VzIHRvIHVzZSB0aGUgbmV3IG5hbWUuICAqLwotI2lmZGVmIFRDX0k5NjAKLSNkZWZpbmUgVENfU1lNRklFTERfVFlQRQlzdHJ1Y3Qgc3ltYm9sICoKLSNkZWZpbmUgc3lfdGMJCQliYWwKLSNlbmRpZgotCi0jZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFCXVuc2lnbmVkIGxvbmcKLSNkZWZpbmUgc3lfb2JqCQkJc3lfZmxhZ3MKLQotI2RlZmluZSBTWU1fQVVYRU5UKFMpCSgmY29mZnN5bWJvbCAoKFMpLT5ic3ltKS0+bmF0aXZlWzFdLnUuYXV4ZW50KQotI2RlZmluZSBTWU1fQVVYSU5GTyhTKQkoJmNvZmZzeW1ib2wgKChTKS0+YnN5bSktPm5hdGl2ZVsxXSkKLQotI2RlZmluZSBET19OT1RfU1RSSVAJMAotCi1leHRlcm4gdm9pZCBvYmpfY29mZl9zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotCi0vKiBUaGUgbnVtYmVyIG9mIGF1eGlsaWFyeSBlbnRyaWVzICovCi0jZGVmaW5lIFNfR0VUX05VTUJFUl9BVVhJTElBUlkocykJKGNvZmZzeW1ib2woKHMpLT5ic3ltKS0+bmF0aXZlLT51LnN5bWVudC5uX251bWF1eCkKLS8qIFRoZSBudW1iZXIgb2YgYXV4aWxpYXJ5IGVudHJpZXMgKi8KLSNkZWZpbmUgU19TRVRfTlVNQkVSX0FVWElMSUFSWShzLHYpCShTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChzKSA9ICh2KSkKLQotLyogVHJ1ZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGluIHRoZSBzdHJpbmcgdGFibGUsIGkuZS4gaXRzIGxlbmd0aCBpcyA+IDguICovCi0jZGVmaW5lIFNfSVNfU1RSSU5HKHMpCQkoc3RybGVuKFNfR0VUX05BTUUocykpID4gOCA/IDEgOiAwKQotCi1leHRlcm4gaW50IFNfU0VUX0RBVEFfVFlQRSBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICosIGludCkpOwotZXh0ZXJuIGludCBTX1NFVF9TVE9SQUdFX0NMQVNTIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKiwgaW50KSk7Ci1leHRlcm4gaW50IFNfR0VUX1NUT1JBR0VfQ0xBU1MgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqKSk7Ci1leHRlcm4gdm9pZCBTQV9TRVRfU1lNX0VORE5EWCBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICosIHN0cnVjdCBzeW1ib2wgKikpOwotCi0vKiBBdXhpbGlhcnkgZW50cnkgbWFjcm9zLiBTQV8gc3RhbmRzIGZvciBzeW1ib2wgYXV4aWxpYXJ5ICovCi0vKiBPbWl0IHRoZSB0diByZWxhdGVkIGZpZWxkcyAqLwotLyogQWNjZXNzb3JzICovCi0KLSNkZWZpbmUgU0FfR0VUX1NZTV9UQUdORFgocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X3RhZ25keC5sKQotI2RlZmluZSBTQV9HRVRfU1lNX0xOTk8ocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubykKLSNkZWZpbmUgU0FfR0VUX1NZTV9TSVpFKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCi0jZGVmaW5lIFNBX0dFVF9TWU1fRlNJWkUocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9mc2l6ZSkKLSNkZWZpbmUgU0FfR0VUX1NZTV9MTk5PUFRSKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKQotI2RlZmluZSBTQV9HRVRfU1lNX0VORE5EWChzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4KQotI2RlZmluZSBTQV9HRVRfU1lNX0RJTUVOKHMsaSkJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWyhpKV0pCi0jZGVmaW5lIFNBX0dFVF9GSUxFX0ZOQU1FKHMpCShTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfZm5hbWUpCi0jZGVmaW5lIFNBX0dFVF9TQ05fU0NOTEVOKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9zY25sZW4pCi0jZGVmaW5lIFNBX0dFVF9TQ05fTlJFTE9DKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ucmVsb2MpCi0jZGVmaW5lIFNBX0dFVF9TQ05fTkxJTk5PKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ubGlubm8pCi0KLSNkZWZpbmUgU0FfU0VUX1NZTV9MTk5PKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubz0odikpCi0jZGVmaW5lIFNBX1NFVF9TWU1fU0laRShzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemU9KHYpKQotI2RlZmluZSBTQV9TRVRfU1lNX0ZTSVpFKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9mc2l6ZT0odikpCi0jZGVmaW5lIFNBX1NFVF9TWU1fTE5OT1BUUihzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NZTV9ESU1FTihzLGksdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWyhpKV09KHYpKQotI2RlZmluZSBTQV9TRVRfRklMRV9GTkFNRShzLHYpCXN0cm5jcHkoU1lNX0FVWEVOVCAocyktPnhfZmlsZS54X2ZuYW1lLCh2KSxGSUxOTUxFTikKLSNkZWZpbmUgU0FfU0VUX1NDTl9TQ05MRU4ocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfc2NubGVuPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NDTl9OUkVMT0Mocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfbnJlbG9jPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NDTl9OTElOTk8ocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfbmxpbm5vPSh2KSkKLQotLyoKLSAqIEludGVybmFsIHVzZSBvbmx5IGRlZmluaXRpb25zLiBTRl8gc3RhbmRzIGZvciBzeW1ib2wgZmxhZ3MuCi0gKgotICogVGhlc2UgdmFsdWVzIGNhbiBiZSBhc3NpZ25lZCB0byBzeV9zeW1ib2wub3N0X2ZsYWdzIGZpZWxkIG9mIGEgc3ltYm9sUy4KLSAqCi0gKiBZb3UnbGwgYnJlYWsgaTk2MCBpZiB5b3Ugc2hpZnQgdGhlIFNZU1BST0MgYml0cyBhbnl3aGVyZSBlbHNlLiAgZm9yCi0gKiBtb3JlIG9uIHRoZSBiYWxuYW1lL2NhbGxuYW1lIGhhY2ssIHNlZSB0Yy1pOTYwLmguICBiLm91dCBpcyBkb25lCi0gKiBkaWZmZXJlbnRseS4KLSAqLwotCi0jZGVmaW5lIFNGX0k5NjBfTUFTSwkoMHgwMDAwMDFmZikJLyogQml0cyAwLTggYXJlIHVzZWQgYnkgdGhlIGk5NjAgcG9ydC4gKi8KLSNkZWZpbmUgU0ZfU1lTUFJPQwkoMHgwMDAwMDAzZikJLyogYml0cyAwLTUgYXJlIHVzZWQgdG8gc3RvcmUgdGhlIHN5c3Byb2MgbnVtYmVyICovCi0jZGVmaW5lIFNGX0lTX1NZU1BST0MJKDB4MDAwMDAwNDApCS8qIGJpdCA2IG1hcmtzIHN5bWJvbHMgdGhhdCBhcmUgc3lzcHJvY3MgKi8KLSNkZWZpbmUgU0ZfQkFMTkFNRQkoMHgwMDAwMDA4MCkJLyogYml0IDcgbWFya3MgQkFMTkFNRSBzeW1ib2xzICovCi0jZGVmaW5lIFNGX0NBTExOQU1FCSgweDAwMDAwMTAwKQkvKiBiaXQgOCBtYXJrcyBDQUxMTkFNRSBzeW1ib2xzICovCi0KLSNkZWZpbmUgU0ZfTk9STUFMX01BU0sJKDB4MDAwMGZmZmYpCS8qIGJpdHMgMTItMTUgYXJlIGdlbmVyYWwgcHVycG9zZS4gKi8KLQotI2RlZmluZSBTRl9TVEFUSUNTCSgweDAwMDAxMDAwKQkvKiBNYXJrIHRoZSAudGV4dCAmIGFsbCBzeW1ib2xzICovCi0jZGVmaW5lIFNGX0RFRklORUQJKDB4MDAwMDIwMDApCS8qIFN5bWJvbCBpcyBkZWZpbmVkIGluIHRoaXMgZmlsZSAqLwotI2RlZmluZSBTRl9TVFJJTkcJKDB4MDAwMDQwMDApCS8qIFN5bWJvbCBuYW1lIGxlbmd0aCA+IDggKi8KLSNkZWZpbmUgU0ZfTE9DQUwJKDB4MDAwMDgwMDApCS8qIFN5bWJvbCBtdXN0IG5vdCBiZSBlbWl0dGVkICovCi0KLSNkZWZpbmUgU0ZfREVCVUdfTUFTSwkoMHhmZmZmMDAwMCkJLyogYml0cyAxNi0zMSBhcmUgZGVidWcgaW5mbyAqLwotCi0jZGVmaW5lIFNGX0ZVTkNUSU9OCSgweDAwMDEwMDAwKQkvKiBUaGUgc3ltYm9sIGlzIGEgZnVuY3Rpb24gKi8KLSNkZWZpbmUgU0ZfUFJPQ0VTUwkoMHgwMDAyMDAwMCkJLyogUHJvY2VzcyBzeW1ib2wgYmVmb3JlIHdyaXRlICovCi0jZGVmaW5lIFNGX1RBR0dFRAkoMHgwMDA0MDAwMCkJLyogSXMgYXNzb2NpYXRlZCB3aXRoIGEgdGFnICovCi0jZGVmaW5lIFNGX1RBRwkJKDB4MDAwODAwMDApCS8qIElzIGEgdGFnICovCi0jZGVmaW5lIFNGX0RFQlVHCSgweDAwMTAwMDAwKQkvKiBJcyBpbiBkZWJ1ZyBvciBhYnMgc2VjdGlvbiAqLwotI2RlZmluZSBTRl9HRVRfU0VHTUVOVAkoMHgwMDIwMDAwMCkJLyogR2V0IHRoZSBzZWN0aW9uIG9mIHRoZSBmb3J3YXJkIHN5bWJvbC4gKi8KLS8qIEFsbCBvdGhlciBiaXRzIGFyZSB1bnVzZWQuICovCi0KLS8qIEFjY2Vzc29ycyAqLwotI2RlZmluZSBTRl9HRVQocykJCSgocyktPnN5X2ZsYWdzKQotI2RlZmluZSBTRl9HRVRfREVCVUcocykJCSgocyktPmJzeW0tPmZsYWdzICYgQlNGX0RFQlVHR0lORykKLSNkZWZpbmUgU0ZfU0VUX0RFQlVHKHMpCQkoKHMpLT5ic3ltLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HKQotI2RlZmluZSBTRl9HRVRfTk9STUFMX0ZJRUxEKHMpCShTRl9HRVQgKHMpICYgU0ZfTk9STUFMX01BU0spCi0jZGVmaW5lIFNGX0dFVF9ERUJVR19GSUVMRChzKQkoU0ZfR0VUIChzKSAmIFNGX0RFQlVHX01BU0spCi0jZGVmaW5lIFNGX0dFVF9GSUxFKHMpCQkoU0ZfR0VUIChzKSAmIFNGX0ZJTEUpCi0jZGVmaW5lIFNGX0dFVF9TVEFUSUNTKHMpCShTRl9HRVQgKHMpICYgU0ZfU1RBVElDUykKLSNkZWZpbmUgU0ZfR0VUX0RFRklORUQocykJKFNGX0dFVCAocykgJiBTRl9ERUZJTkVEKQotI2RlZmluZSBTRl9HRVRfU1RSSU5HKHMpCShTRl9HRVQgKHMpICYgU0ZfU1RSSU5HKQotI2RlZmluZSBTRl9HRVRfTE9DQUwocykJCShTRl9HRVQgKHMpICYgU0ZfTE9DQUwpCi0jZGVmaW5lIFNGX0dFVF9GVU5DVElPTihzKSAgICAgIChTRl9HRVQgKHMpICYgU0ZfRlVOQ1RJT04pCi0jZGVmaW5lIFNGX0dFVF9QUk9DRVNTKHMpCShTRl9HRVQgKHMpICYgU0ZfUFJPQ0VTUykKLSNkZWZpbmUgU0ZfR0VUX1RBR0dFRChzKQkoU0ZfR0VUIChzKSAmIFNGX1RBR0dFRCkKLSNkZWZpbmUgU0ZfR0VUX1RBRyhzKQkJKFNGX0dFVCAocykgJiBTRl9UQUcpCi0jZGVmaW5lIFNGX0dFVF9HRVRfU0VHTUVOVChzKQkoU0ZfR0VUIChzKSAmIFNGX0dFVF9TRUdNRU5UKQotI2RlZmluZSBTRl9HRVRfSTk2MChzKQkJKFNGX0dFVCAocykgJiBTRl9JOTYwX01BU0spCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9HRVRfQkFMTkFNRShzKQkoU0ZfR0VUIChzKSAmIFNGX0JBTE5BTUUpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9HRVRfQ0FMTE5BTUUocykJKFNGX0dFVCAocykgJiBTRl9DQUxMTkFNRSkJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX0dFVF9JU19TWVNQUk9DKHMpCShTRl9HRVQgKHMpICYgU0ZfSVNfU1lTUFJPQykJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX0dFVF9TWVNQUk9DKHMpCShTRl9HRVQgKHMpICYgU0ZfU1lTUFJPQykJLyogdXNlZCBieSBpOTYwICovCi0KLS8qIE1vZGlmaWVycyAqLwotI2RlZmluZSBTRl9TRVQocyx2KQkJKFNGX0dFVCAocykgPSAodikpCi0jZGVmaW5lIFNGX1NFVF9OT1JNQUxfRklFTEQocyx2KShTRl9HRVQgKHMpIHw9ICgodikgJiBTRl9OT1JNQUxfTUFTSykpCi0jZGVmaW5lIFNGX1NFVF9ERUJVR19GSUVMRChzLHYpCShTRl9HRVQgKHMpIHw9ICgodikgJiBTRl9ERUJVR19NQVNLKSkKLSNkZWZpbmUgU0ZfU0VUX0ZJTEUocykJCShTRl9HRVQgKHMpIHw9IFNGX0ZJTEUpCi0jZGVmaW5lIFNGX1NFVF9TVEFUSUNTKHMpCShTRl9HRVQgKHMpIHw9IFNGX1NUQVRJQ1MpCi0jZGVmaW5lIFNGX1NFVF9ERUZJTkVEKHMpCShTRl9HRVQgKHMpIHw9IFNGX0RFRklORUQpCi0jZGVmaW5lIFNGX1NFVF9TVFJJTkcocykJKFNGX0dFVCAocykgfD0gU0ZfU1RSSU5HKQotI2RlZmluZSBTRl9TRVRfTE9DQUwocykJCShTRl9HRVQgKHMpIHw9IFNGX0xPQ0FMKQotI2RlZmluZSBTRl9DTEVBUl9MT0NBTChzKQkoU0ZfR0VUIChzKSAmPSB+U0ZfTE9DQUwpCi0jZGVmaW5lIFNGX1NFVF9GVU5DVElPTihzKSAgICAgIChTRl9HRVQgKHMpIHw9IFNGX0ZVTkNUSU9OKQotI2RlZmluZSBTRl9TRVRfUFJPQ0VTUyhzKQkoU0ZfR0VUIChzKSB8PSBTRl9QUk9DRVNTKQotI2RlZmluZSBTRl9TRVRfVEFHR0VEKHMpCShTRl9HRVQgKHMpIHw9IFNGX1RBR0dFRCkKLSNkZWZpbmUgU0ZfU0VUX1RBRyhzKQkJKFNGX0dFVCAocykgfD0gU0ZfVEFHKQotI2RlZmluZSBTRl9TRVRfR0VUX1NFR01FTlQocykJKFNGX0dFVCAocykgfD0gU0ZfR0VUX1NFR01FTlQpCi0jZGVmaW5lIFNGX1NFVF9JOTYwKHMsdikJKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX0k5NjBfTUFTSykpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9TRVRfQkFMTkFNRShzKQkoU0ZfR0VUIChzKSB8PSBTRl9CQUxOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfU0VUX0NBTExOQU1FKHMpCShTRl9HRVQgKHMpIHw9IFNGX0NBTExOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfU0VUX0lTX1NZU1BST0MocykJKFNGX0dFVCAocykgfD0gU0ZfSVNfU1lTUFJPQykJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX1NFVF9TWVNQUk9DKHMsdikJKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX1NZU1BST0MpKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLQotLyogLS0tLS0tLS0tLS0tLS0gIExpbmUgbnVtYmVyIGhhbmRsaW5nIC0tLS0tLS0gKi8KLWV4dGVybiBpbnQgdGV4dF9saW5lbm9fbnVtYmVyOwotZXh0ZXJuIGludCBjb2ZmX2xpbmVfYmFzZTsKLWV4dGVybiBpbnQgY29mZl9uX2xpbmVfbm9zOwotCi0jZGVmaW5lIG9ial9lbWl0X2xpbmVubyhXSEVSRSxMSU5FLEZJTEVfU1RBUlQpCWFib3J0ICgpCi1leHRlcm4gdm9pZCBjb2ZmX2FkZF9saW5lc3ltIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOwotCi0KLXZvaWQgY19kb3RfZmlsZV9zeW1ib2wgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLSNkZWZpbmUgb2JqX2FwcF9maWxlIGNfZG90X2ZpbGVfc3ltYm9sCi0KLWV4dGVybiB2b2lkIGNvZmZfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqLCBpbnQgKikpOwotZXh0ZXJuIHZvaWQgY29mZl9hZGp1c3Rfc3ltdGFiIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGNvZmZfZnJvYl9zZWN0aW9uIFBBUkFNUyAoKHNlZ1QpKTsKLWV4dGVybiB2b2lkIGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBvYmpfZnJvYl9zeW1ib2woUyxQKSAJY29mZl9mcm9iX3N5bWJvbChTLCZQKQotI2lmbmRlZiBvYmpfYWRqdXN0X3N5bXRhYgotI2RlZmluZSBvYmpfYWRqdXN0X3N5bXRhYigpCWNvZmZfYWRqdXN0X3N5bXRhYigpCi0jZW5kaWYKLSNkZWZpbmUgb2JqX2Zyb2Jfc2VjdGlvbihTKQljb2ZmX2Zyb2Jfc2VjdGlvbiAoUykKLSNkZWZpbmUgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MoKSBjb2ZmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKCkKLQotZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKmNvZmZfbGFzdF9mdW5jdGlvbjsKLQotLyogRm9yd2FyZCB0aGUgc2VnbWVudCBvZiBhIGZvcndhcmRlZCBzeW1ib2wsIGhhbmRsZSBhc3NpZ25tZW50cyB0aGF0Ci0gICBqdXN0IGNvcHkgc3ltYm9sIHZhbHVlcywgZXRjLiAgKi8KLSNpZm5kZWYgVEVfSTM4NkFJWAotI2RlZmluZSBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyhkZXN0LHNyYykgXAotICAoU0ZfR0VUX0dFVF9TRUdNRU5UIChkZXN0KSBcCi0gICA/IChTX1NFVF9TRUdNRU5UIChkZXN0LCBTX0dFVF9TRUdNRU5UIChzcmMpKSwgMCkgXAotICAgOiAwKQotI2Vsc2UKLSNkZWZpbmUgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMoZGVzdCxzcmMpIFwKLSAgKFNGX0dFVF9HRVRfU0VHTUVOVCAoZGVzdCkgJiYgU19HRVRfU0VHTUVOVCAoZGVzdCkgPT0gU0VHX1VOS05PV04gXAotICAgPyAoU19TRVRfU0VHTUVOVCAoZGVzdCwgU19HRVRfU0VHTUVOVCAoc3JjKSksIDApIFwKLSAgIDogMCkKLSNlbmRpZgotCi0vKiBzYW5pdHkgY2hlY2sgKi8KLQotI2lmZGVmIFRDX0k5NjAKLSNpZm5kZWYgQ19MRUFGU1RBVAotaGV5ICEgV2hlcmUgaXMgdGhlIENfTEVBRlNUQVQgZGVmaW5pdGlvbiA/IGk5NjAgLSBjb2ZmIHN1cHBvcnQgaXMgZGVwZW5kaW5nIG9uIGl0LgotI2VuZGlmIC8qIG5vIENfTEVBRlNUQVQgKi8KLSNlbmRpZiAvKiBUQ19JOTYwICovCi0KLSNlbHNlIC8qIG5vdCBCRkRfQVNTRU1CTEVSICovCi0KLSNpZmRlZiBUQ19BMjlLCi0vKiBBbGxvdyB0cmFuc2xhdGUgZnJvbSBhb3V0IHJlbG9jcyB0byBjb2ZmIHJlbG9jcyAqLwotI2RlZmluZSBOT19SRUxPQyAyMAotI2RlZmluZSBSRUxPQ18zMiAxCi0jZGVmaW5lIFJFTE9DXzggMgotI2RlZmluZSBSRUxPQ19DT05TVCAzCi0jZGVmaW5lIFJFTE9DX0NPTlNUSCA0Ci0jZGVmaW5lIFJFTE9DX0pVTVBUQVJHIDUKLSNkZWZpbmUgUkVMT0NfQkFTRTIyIDYKLSNkZWZpbmUgUkVMT0NfSEkyMiA3Ci0jZGVmaW5lIFJFTE9DX0xPMTAgOAotI2RlZmluZSBSRUxPQ19CQVNFMTMgOQotI2RlZmluZSBSRUxPQ19XRElTUDIyIDEwCi0jZGVmaW5lIFJFTE9DX1dESVNQMzAgMTEKLSNlbmRpZgotCi1leHRlcm4gY29uc3Qgc2VnVCBOX1RZUEVfc2VnW107Ci0KLS8qIE1hZ2ljIG51bWJlciBvZiBwYWdlZCBleGVjdXRhYmxlLiAqLwotI2RlZmluZSBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUJMHg4MzAwCi0KLQotLyogU1lNQk9MIFRBQkxFICovCi0KLS8qIFN5bWJvbCB0YWJsZSBlbnRyeSBkYXRhIHR5cGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogQmFzaWMgc3ltYm9sICovCi0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgb3N0X2VudHJ5OwotICAvKiBBdXhpbGlhcnkgZW50cnkuICovCi0gIHVuaW9uIGludGVybmFsX2F1eGVudCBvc3RfYXV4ZW50W09CSl9DT0ZGX01BWF9BVVhFTlRSSUVTXTsKLSAgLyogb2JqX2NvZmYgaW50ZXJuYWwgdXNlIG9ubHkgZmxhZ3MgKi8KLSAgdW5zaWduZWQgaW50IG9zdF9mbGFnczsKLX0gb2JqX3N5bWJvbF90eXBlOwotCi0jaWZuZGVmIERPX05PVF9TVFJJUAotI2RlZmluZSBET19OT1RfU1RSSVAJMAotI2VuZGlmCi0vKiBTeW1ib2wgdGFibGUgbWFjcm9zIGFuZCBjb25zdGFudHMgKi8KLQotLyogUG9zc2libGUgYW5kIHVzZWZ1bGwgc2VjdGlvbiBudW1iZXIgaW4gc3ltYm9sIHRhYmxlCi0gKiBUaGUgdmFsdWVzIG9mIFRFWFQsIERBVEEgYW5kIEJTUyBtYXkgbm90IGJlIHBvcnRhYmxlLgotICovCi0KLSNkZWZpbmUgQ19BQlNfU0VDVElPTgkJTl9BQlMKLSNkZWZpbmUgQ19VTkRFRl9TRUNUSU9OCQlOX1VOREVGCi0jZGVmaW5lIENfREVCVUdfU0VDVElPTgkJTl9ERUJVRwotI2RlZmluZSBDX05UVl9TRUNUSU9OCQlOX1RWCi0jZGVmaW5lIENfUFRWX1NFQ1RJT04JCVBfVFYKLSNkZWZpbmUgQ19SRUdJU1RFUl9TRUNUSU9OCTUwCi0KLS8qCi0gKiAgTWFjcm9zIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KLSAqICBUaGlzIHN5bnRheGljIGluZGlyZWN0aW9uIGFsbG93cyBpbmRlcGVuZGVuY2UgcmVnYXJkaW5nIGEub3V0IG9yIGNvZmYuCi0gKiAgVGhlIGFyZ3VtZW50IChzKSBvZiBhbGwgdGhlc2UgbWFjcm9zIGlzIGEgcG9pbnRlciB0byBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KLSAqLwotCi0vKiBQcmVkaWNhdGVzICovCi0vKiBUcnVlIGlmIHRoZSBzeW1ib2wgaXMgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19JU19FWFRFUk5BTChzKSAgICAgICAgKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtID09IENfVU5ERUZfU0VDVElPTikKLS8qIFRydWUgaWYgc3ltYm9sIGhhcyBiZWVuIGRlZmluZWQsIGllIDoKLSAgIHNlY3Rpb24gPiAwIChEQVRBLCBURVhUIG9yIEJTUykKLSAgIHNlY3Rpb24gPT0gMCBhbmQgdmFsdWUgPiAwIChleHRlcm5hbCBic3Mgc3ltYm9sKSAqLwotI2RlZmluZSBTX0lTX0RFRklORUQocykgXAotICAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPiBDX1VOREVGX1NFQ1RJT04gXAotICAgfHwgKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtID09IENfVU5ERUZfU0VDVElPTiBcCi0gICAgICAgJiYgU19HRVRfVkFMVUUgKHMpID4gMCkgXAotICAgfHwgKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtID09IENfQUJTX1NFQ1RJT04pKQotLyogVHJ1ZSBpZiBhIGRlYnVnIHNwZWNpYWwgc3ltYm9sIGVudHJ5ICovCi0jZGVmaW5lIFNfSVNfREVCVUcocykJCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA9PSBDX0RFQlVHX1NFQ1RJT04pCi0vKiBUcnVlIGlmIGEgc3ltYm9sIGlzIGxvY2FsIHN5bWJvbCBuYW1lICovCi0vKiBBIHN5bWJvbCBuYW1lIHdob3NlIG5hbWUgaW5jbHVkZXMgXkEgaXMgYSBnYXMgaW50ZXJuYWwgcHNldWRvIHN5bWJvbCAqLwotI2RlZmluZSBTX0lTX0xPQ0FMKHMpIFwKLSAgKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtID09IENfUkVHSVNURVJfU0VDVElPTiBcCi0gICB8fCAoU19MT0NBTF9OQU1FKHMpICYmICEgZmxhZ19rZWVwX2xvY2FscyAmJiAhIFNfSVNfREVCVUcgKHMpKSBcCi0gICB8fCBzdHJjaHIgKFNfR0VUX05BTUUgKHMpLCAnXDAwMScpICE9IE5VTEwgXAotICAgfHwgc3RyY2hyIChTX0dFVF9OQU1FIChzKSwgJ1wwMDInKSAhPSBOVUxMIFwKLSAgIHx8IChmbGFnX3N0cmlwX2xvY2FsX2Fic29sdXRlIFwKLSAgICAgICAmJiAhU19JU19FWFRFUk5BTChzKSBcCi0gICAgICAgJiYgKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gQ19BQlNfU0VDVElPTikpCi0vKiBUcnVlIGlmIGEgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgZmlsZSAqLwotI2RlZmluZSBTX0lTX0VYVEVSTihzKQkJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtID09IDAgXAotCQkJCSAmJiBTX0dFVF9WQUxVRSAocykgPT0gMCkKLS8qCi0gKiBUcnVlIGlmIGEgc3ltYm9sIGNhbiBiZSBtdWx0aXBseSBkZWZpbmVkIChic3Mgc3ltYm9scyBoYXZlIHRoaXMgZGVmCi0gKiB0aG91Z2ggaXQgaXMgYmFkIHByYWN0aWNlKQotICovCi0jZGVmaW5lIFNfSVNfQ09NTU9OKHMpCQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gMCBcCi0JCQkJICYmIFNfR0VUX1ZBTFVFIChzKSAhPSAwKQotLyogVHJ1ZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGluIHRoZSBzdHJpbmcgdGFibGUsIGkuZS4gaXRzIGxlbmd0aCBpcyA+IDguICovCi0jZGVmaW5lIFNfSVNfU1RSSU5HKHMpCQkoc3RybGVuKFNfR0VUX05BTUUocykpID4gOCA/IDEgOiAwKQotCi0vKiBUcnVlIGlmIGEgc3ltYm9sIGlzIGRlZmluZWQgYXMgd2Vhay4gICovCi0jaWZkZWYgVEVfUEUKLSNkZWZpbmUgU19JU19XRUFLKHMpIFwKLSAgKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbGFzcyA9PSBDX05UX1dFQUsgXAotICAgfHwgKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NsYXNzID09IENfV0VBS0VYVCkKLSNlbHNlCi0jZGVmaW5lIFNfSVNfV0VBSyhzKSBcCi0gICgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY2xhc3MgPT0gQ19XRUFLRVhUKQotI2VuZGlmCi0KLS8qIEFjY2Vzc29ycyAqLwotLyogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX0dFVF9OQU1FKHMpCQkoKGNoYXIqKShzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX29mZnNldCkKLS8qIFRoZSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdGFibGUgKi8KLSNkZWZpbmUgU19HRVRfT0ZGU0VUKHMpICAgICAgICAgKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX29mZnNldCkKLS8qIFRoZSBudW1lcmljIHZhbHVlIG9mIHRoZSBzZWdtZW50ICovCi0jZGVmaW5lIFNfR0VUX1NFR01FTlQocykgICBzX2dldF9zZWdtZW50KHMpCi0vKiBUaGUgZGF0YSB0eXBlICovCi0jZGVmaW5lIFNfR0VUX0RBVEFfVFlQRShzKQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fdHlwZSkKLS8qIFRoZSBzdG9yYWdlIGNsYXNzICovCi0jZGVmaW5lIFNfR0VUX1NUT1JBR0VfQ0xBU1MocykJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbGFzcykKLS8qIFRoZSBudW1iZXIgb2YgYXV4aWxpYXJ5IGVudHJpZXMgKi8KLSNkZWZpbmUgU19HRVRfTlVNQkVSX0FVWElMSUFSWShzKQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fbnVtYXV4KQotCi0vKiBNb2RpZmllcnMgKi8KLS8qIFNldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfU0VUX05BTUUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKSh2KSkKLS8qIFNldCB0aGUgb2Zmc2V0IG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19TRVRfT0ZGU0VUKHMsdikJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX29mZnNldCA9ICh2KSkKLS8qIFRoZSBudW1lcmljIHZhbHVlIG9mIHRoZSBzZWdtZW50ICovCi0jZGVmaW5lIFNfU0VUX1NFR01FTlQocyx2KQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPSBTRUdNRU5UX1RPX1NZTUJPTF9UWVBFKHYpKQotLyogVGhlIGRhdGEgdHlwZSAqLwotI2RlZmluZSBTX1NFVF9EQVRBX1RZUEUocyx2KQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fdHlwZSA9ICh2KSkKLS8qIFRoZSBzdG9yYWdlIGNsYXNzICovCi0jZGVmaW5lIFNfU0VUX1NUT1JBR0VfQ0xBU1Mocyx2KQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NsYXNzID0gKHYpKQotLyogVGhlIG51bWJlciBvZiBhdXhpbGlhcnkgZW50cmllcyAqLwotI2RlZmluZSBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZKHMsdikJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX251bWF1eCA9ICh2KSkKLQotLyogQWRkaXRpb25hbCBtb2RpZmllcnMgKi8KLS8qIFRoZSBzeW1ib2wgaXMgZXh0ZXJuYWwgKGRvZXMgbm90IG1lYW4gdW5kZWZpbmVkKSAqLwotI2RlZmluZSBTX1NFVF9FWFRFUk5BTChzKSAgICAgICB7IFNfU0VUX1NUT1JBR0VfQ0xBU1MocywgQ19FWFQpIDsgU0ZfQ0xFQVJfTE9DQUwocyk7IH0KLQotLyogQXV4aWxpYXJ5IGVudHJ5IG1hY3Jvcy4gU0FfIHN0YW5kcyBmb3Igc3ltYm9sIGF1eGlsaWFyeSAqLwotLyogT21pdCB0aGUgdHYgcmVsYXRlZCBmaWVsZHMgKi8KLS8qIEFjY2Vzc29ycyAqLwotI2RlZmluZSBTWU1fQVVYRU5UKFMpCSgmKFMpLT5zeV9zeW1ib2wub3N0X2F1eGVudFswXSkKLQotI2RlZmluZSBTQV9HRVRfU1lNX1RBR05EWChzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfdGFnbmR4LmwpCi0jZGVmaW5lIFNBX0dFVF9TWU1fTE5OTyhzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQotI2RlZmluZSBTQV9HRVRfU1lNX1NJWkUocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKLSNkZWZpbmUgU0FfR0VUX1NZTV9GU0laRShzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2ZzaXplKQotI2RlZmluZSBTQV9HRVRfU1lNX0xOTk9QVFIocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZGVmaW5lIFNBX0dFVF9TWU1fRU5ETkRYKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCkKLSNkZWZpbmUgU0FfR0VUX1NZTV9ESU1FTihzLGkpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsoaSldKQotI2RlZmluZSBTQV9HRVRfRklMRV9GTkFNRShzKQkoU1lNX0FVWEVOVCAocyktPnhfZmlsZS54X2ZuYW1lKQotI2RlZmluZSBTQV9HRVRfRklMRV9GTkFNRV9PRkZTRVQocykgIChTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfbi54X29mZnNldCkKLSNkZWZpbmUgU0FfR0VUX0ZJTEVfRk5BTUVfWkVST1MocykgICAoU1lNX0FVWEVOVCAocyktPnhfZmlsZS54X24ueF96ZXJvZXMpCi0jZGVmaW5lIFNBX0dFVF9TQ05fU0NOTEVOKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9zY25sZW4pCi0jZGVmaW5lIFNBX0dFVF9TQ05fTlJFTE9DKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ucmVsb2MpCi0jZGVmaW5lIFNBX0dFVF9TQ05fTkxJTk5PKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ubGlubm8pCi0KLS8qIE1vZGlmaWVycyAqLwotI2RlZmluZSBTQV9TRVRfU1lNX1RBR05EWChzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF90YWduZHgubD0odikpCi0jZGVmaW5lIFNBX1NFVF9TWU1fTE5OTyhzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm89KHYpKQotI2RlZmluZSBTQV9TRVRfU1lNX1NJWkUocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NZTV9GU0laRShzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfZnNpemU9KHYpKQotI2RlZmluZSBTQV9TRVRfU1lNX0xOTk9QVFIocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cj0odikpCi0jZGVmaW5lIFNBX1NFVF9TWU1fRU5ETkRYKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NZTV9ESU1FTihzLGksdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWyhpKV09KHYpKQotI2RlZmluZSBTQV9TRVRfRklMRV9GTkFNRShzLHYpCXN0cm5jcHkoU1lNX0FVWEVOVCAocyktPnhfZmlsZS54X2ZuYW1lLCh2KSxGSUxOTUxFTikKLSNkZWZpbmUgU0FfU0VUX0ZJTEVfRk5BTUVfT0ZGU0VUKHMsdikgKFNZTV9BVVhFTlQgKHMpLT54X2ZpbGUueF9uLnhfb2Zmc2V0PSh2KSkKLSNkZWZpbmUgU0FfU0VUX0ZJTEVfRk5BTUVfWkVST1Mocyx2KSAgKFNZTV9BVVhFTlQgKHMpLT54X2ZpbGUueF9uLnhfemVyb2VzPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NDTl9TQ05MRU4ocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfc2NubGVuPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NDTl9OUkVMT0Mocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfbnJlbG9jPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NDTl9OTElOTk8ocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfbmxpbm5vPSh2KSkKLQotLyoKLSAqIEludGVybmFsIHVzZSBvbmx5IGRlZmluaXRpb25zLiBTRl8gc3RhbmRzIGZvciBzeW1ib2wgZmxhZ3MuCi0gKgotICogVGhlc2UgdmFsdWVzIGNhbiBiZSBhc3NpZ25lZCB0byBzeV9zeW1ib2wub3N0X2ZsYWdzIGZpZWxkIG9mIGEgc3ltYm9sUy4KLSAqCi0gKiBZb3UnbGwgYnJlYWsgaTk2MCBpZiB5b3Ugc2hpZnQgdGhlIFNZU1BST0MgYml0cyBhbnl3aGVyZSBlbHNlLiAgZm9yCi0gKiBtb3JlIG9uIHRoZSBiYWxuYW1lL2NhbGxuYW1lIGhhY2ssIHNlZSB0Yy1pOTYwLmguICBiLm91dCBpcyBkb25lCi0gKiBkaWZmZXJlbnRseS4KLSAqLwotCi0jZGVmaW5lIFNGX0k5NjBfTUFTSwkoMHgwMDAwMDFmZikJLyogQml0cyAwLTggYXJlIHVzZWQgYnkgdGhlIGk5NjAgcG9ydC4gKi8KLSNkZWZpbmUgU0ZfU1lTUFJPQwkoMHgwMDAwMDAzZikJLyogYml0cyAwLTUgYXJlIHVzZWQgdG8gc3RvcmUgdGhlIHN5c3Byb2MgbnVtYmVyICovCi0jZGVmaW5lIFNGX0lTX1NZU1BST0MJKDB4MDAwMDAwNDApCS8qIGJpdCA2IG1hcmtzIHN5bWJvbHMgdGhhdCBhcmUgc3lzcHJvY3MgKi8KLSNkZWZpbmUgU0ZfQkFMTkFNRQkoMHgwMDAwMDA4MCkJLyogYml0IDcgbWFya3MgQkFMTkFNRSBzeW1ib2xzICovCi0jZGVmaW5lIFNGX0NBTExOQU1FCSgweDAwMDAwMTAwKQkvKiBiaXQgOCBtYXJrcyBDQUxMTkFNRSBzeW1ib2xzICovCi0KLSNkZWZpbmUgU0ZfTk9STUFMX01BU0sJKDB4MDAwMGZmZmYpCS8qIGJpdHMgMTItMTUgYXJlIGdlbmVyYWwgcHVycG9zZS4gKi8KLQotI2RlZmluZSBTRl9TVEFUSUNTCSgweDAwMDAxMDAwKQkvKiBNYXJrIHRoZSAudGV4dCAmIGFsbCBzeW1ib2xzICovCi0jZGVmaW5lIFNGX0RFRklORUQJKDB4MDAwMDIwMDApCS8qIFN5bWJvbCBpcyBkZWZpbmVkIGluIHRoaXMgZmlsZSAqLwotI2RlZmluZSBTRl9TVFJJTkcJKDB4MDAwMDQwMDApCS8qIFN5bWJvbCBuYW1lIGxlbmd0aCA+IDggKi8KLSNkZWZpbmUgU0ZfTE9DQUwJKDB4MDAwMDgwMDApCS8qIFN5bWJvbCBtdXN0IG5vdCBiZSBlbWl0dGVkICovCi0KLSNkZWZpbmUgU0ZfREVCVUdfTUFTSwkoMHhmZmZmMDAwMCkJLyogYml0cyAxNi0zMSBhcmUgZGVidWcgaW5mbyAqLwotCi0jZGVmaW5lIFNGX0ZVTkNUSU9OCSgweDAwMDEwMDAwKQkvKiBUaGUgc3ltYm9sIGlzIGEgZnVuY3Rpb24gKi8KLSNkZWZpbmUgU0ZfUFJPQ0VTUwkoMHgwMDAyMDAwMCkJLyogUHJvY2VzcyBzeW1ib2wgYmVmb3JlIHdyaXRlICovCi0jZGVmaW5lIFNGX1RBR0dFRAkoMHgwMDA0MDAwMCkJLyogSXMgYXNzb2NpYXRlZCB3aXRoIGEgdGFnICovCi0jZGVmaW5lIFNGX1RBRwkJKDB4MDAwODAwMDApCS8qIElzIGEgdGFnICovCi0jZGVmaW5lIFNGX0RFQlVHCSgweDAwMTAwMDAwKQkvKiBJcyBpbiBkZWJ1ZyBvciBhYnMgc2VjdGlvbiAqLwotI2RlZmluZSBTRl9HRVRfU0VHTUVOVAkoMHgwMDIwMDAwMCkJLyogR2V0IHRoZSBzZWN0aW9uIG9mIHRoZSBmb3J3YXJkIHN5bWJvbC4gKi8KLSNkZWZpbmUgU0ZfQURKX0xOTk9QVFIJKDB4MDA0MDAwMDApCS8qIEhhcyBhIGxubm9wdHIgKi8KLS8qIEFsbCBvdGhlciBiaXRzIGFyZSB1bnVzZWQuICovCi0KLS8qIEFjY2Vzc29ycyAqLwotI2RlZmluZSBTRl9HRVQocykJCSgocyktPnN5X3N5bWJvbC5vc3RfZmxhZ3MpCi0jZGVmaW5lIFNGX0dFVF9OT1JNQUxfRklFTEQocykJKFNGX0dFVCAocykgJiBTRl9OT1JNQUxfTUFTSykKLSNkZWZpbmUgU0ZfR0VUX0RFQlVHX0ZJRUxEKHMpCShTRl9HRVQgKHMpICYgU0ZfREVCVUdfTUFTSykKLSNkZWZpbmUgU0ZfR0VUX0ZJTEUocykJCShTRl9HRVQgKHMpICYgU0ZfRklMRSkKLSNkZWZpbmUgU0ZfR0VUX1NUQVRJQ1MocykJKFNGX0dFVCAocykgJiBTRl9TVEFUSUNTKQotI2RlZmluZSBTRl9HRVRfREVGSU5FRChzKQkoU0ZfR0VUIChzKSAmIFNGX0RFRklORUQpCi0jZGVmaW5lIFNGX0dFVF9TVFJJTkcocykJKFNGX0dFVCAocykgJiBTRl9TVFJJTkcpCi0jZGVmaW5lIFNGX0dFVF9MT0NBTChzKQkJKFNGX0dFVCAocykgJiBTRl9MT0NBTCkKLSNkZWZpbmUgU0ZfR0VUX0ZVTkNUSU9OKHMpICAgICAgKFNGX0dFVCAocykgJiBTRl9GVU5DVElPTikKLSNkZWZpbmUgU0ZfR0VUX1BST0NFU1MocykJKFNGX0dFVCAocykgJiBTRl9QUk9DRVNTKQotI2RlZmluZSBTRl9HRVRfREVCVUcocykJCShTRl9HRVQgKHMpICYgU0ZfREVCVUcpCi0jZGVmaW5lIFNGX0dFVF9UQUdHRUQocykJKFNGX0dFVCAocykgJiBTRl9UQUdHRUQpCi0jZGVmaW5lIFNGX0dFVF9UQUcocykJCShTRl9HRVQgKHMpICYgU0ZfVEFHKQotI2RlZmluZSBTRl9HRVRfR0VUX1NFR01FTlQocykJKFNGX0dFVCAocykgJiBTRl9HRVRfU0VHTUVOVCkKLSNkZWZpbmUgU0ZfR0VUX0FESl9MTk5PUFRSKHMpCShTRl9HRVQgKHMpICYgU0ZfQURKX0xOTk9QVFIpCi0jZGVmaW5lIFNGX0dFVF9JOTYwKHMpCQkoU0ZfR0VUIChzKSAmIFNGX0k5NjBfTUFTSykJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX0dFVF9CQUxOQU1FKHMpCShTRl9HRVQgKHMpICYgU0ZfQkFMTkFNRSkJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX0dFVF9DQUxMTkFNRShzKQkoU0ZfR0VUIChzKSAmIFNGX0NBTExOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfR0VUX0lTX1NZU1BST0MocykJKFNGX0dFVCAocykgJiBTRl9JU19TWVNQUk9DKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfR0VUX1NZU1BST0MocykJKFNGX0dFVCAocykgJiBTRl9TWVNQUk9DKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLQotLyogTW9kaWZpZXJzICovCi0jZGVmaW5lIFNGX1NFVChzLHYpCQkoU0ZfR0VUIChzKSA9ICh2KSkKLSNkZWZpbmUgU0ZfU0VUX05PUk1BTF9GSUVMRChzLHYpKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX05PUk1BTF9NQVNLKSkKLSNkZWZpbmUgU0ZfU0VUX0RFQlVHX0ZJRUxEKHMsdikJKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX0RFQlVHX01BU0spKQotI2RlZmluZSBTRl9TRVRfRklMRShzKQkJKFNGX0dFVCAocykgfD0gU0ZfRklMRSkKLSNkZWZpbmUgU0ZfU0VUX1NUQVRJQ1MocykJKFNGX0dFVCAocykgfD0gU0ZfU1RBVElDUykKLSNkZWZpbmUgU0ZfU0VUX0RFRklORUQocykJKFNGX0dFVCAocykgfD0gU0ZfREVGSU5FRCkKLSNkZWZpbmUgU0ZfU0VUX1NUUklORyhzKQkoU0ZfR0VUIChzKSB8PSBTRl9TVFJJTkcpCi0jZGVmaW5lIFNGX1NFVF9MT0NBTChzKQkJKFNGX0dFVCAocykgfD0gU0ZfTE9DQUwpCi0jZGVmaW5lIFNGX0NMRUFSX0xPQ0FMKHMpCShTRl9HRVQgKHMpICY9IH5TRl9MT0NBTCkKLSNkZWZpbmUgU0ZfU0VUX0ZVTkNUSU9OKHMpICAgICAgKFNGX0dFVCAocykgfD0gU0ZfRlVOQ1RJT04pCi0jZGVmaW5lIFNGX1NFVF9QUk9DRVNTKHMpCShTRl9HRVQgKHMpIHw9IFNGX1BST0NFU1MpCi0jZGVmaW5lIFNGX1NFVF9ERUJVRyhzKQkJKFNGX0dFVCAocykgfD0gU0ZfREVCVUcpCi0jZGVmaW5lIFNGX1NFVF9UQUdHRUQocykJKFNGX0dFVCAocykgfD0gU0ZfVEFHR0VEKQotI2RlZmluZSBTRl9TRVRfVEFHKHMpCQkoU0ZfR0VUIChzKSB8PSBTRl9UQUcpCi0jZGVmaW5lIFNGX1NFVF9HRVRfU0VHTUVOVChzKQkoU0ZfR0VUIChzKSB8PSBTRl9HRVRfU0VHTUVOVCkKLSNkZWZpbmUgU0ZfU0VUX0FESl9MTk5PUFRSKHMpCShTRl9HRVQgKHMpIHw9IFNGX0FESl9MTk5PUFRSKQotI2RlZmluZSBTRl9TRVRfSTk2MChzLHYpCShTRl9HRVQgKHMpIHw9ICgodikgJiBTRl9JOTYwX01BU0spKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfU0VUX0JBTE5BTUUocykJKFNGX0dFVCAocykgfD0gU0ZfQkFMTkFNRSkJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX1NFVF9DQUxMTkFNRShzKQkoU0ZfR0VUIChzKSB8PSBTRl9DQUxMTkFNRSkJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX1NFVF9JU19TWVNQUk9DKHMpCShTRl9HRVQgKHMpIHw9IFNGX0lTX1NZU1BST0MpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9TRVRfU1lTUFJPQyhzLHYpCShTRl9HRVQgKHMpIHw9ICgodikgJiBTRl9TWVNQUk9DKSkJLyogdXNlZCBieSBpOTYwICovCi0KLS8qIEZpbGUgaGVhZGVyIG1hY3JvIGFuZCB0eXBlIGRlZmluaXRpb24gKi8KLQotLyoKLSAqIEZpbGUgcG9zaXRpb24gY2FsY3VsYXRvcnMuIEJld2FyZSB0byB1c2UgdGhlbSB3aGVuIGFsbCB0aGUKLSAqIGFwcHJvcHJpYXRlIGZpZWxkcyBhcmUgc2V0IGluIHRoZSBoZWFkZXIuCi0gKi8KLQotI2lmZGVmIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0jZGVmaW5lIE9CSl9DT0ZGX0FPVVRIRFJTWiAoMCkKLSNlbHNlCi0jZGVmaW5lIE9CSl9DT0ZGX0FPVVRIRFJTWiAoQU9VVEhEUlNaKQotI2VuZGlmIC8qIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSICovCi0KLSNkZWZpbmUgSF9HRVRfRklMRV9TSVpFKGgpIFwKLSAgICAobG9uZykoRklMSFNaICsgT0JKX0NPRkZfQU9VVEhEUlNaICsgXAotCSAgIEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKSAqIFNDTkhTWiArIFwKLQkgICBIX0dFVF9URVhUX1NJWkUoaCkgKyBIX0dFVF9EQVRBX1NJWkUoaCkgKyBcCi0JICAgSF9HRVRfUkVMT0NBVElPTl9TSVpFKGgpICsgSF9HRVRfTElORU5PX1NJWkUoaCkgKyBcCi0JICAgSF9HRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCkgKyBcCi0JICAgKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSkKLSNkZWZpbmUgSF9HRVRfVEVYVF9GSUxFX09GRlNFVChoKSBcCi0gICAgKGxvbmcpKEZJTEhTWiArIE9CSl9DT0ZGX0FPVVRIRFJTWiArIFwKLQkgICBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1opCi0jZGVmaW5lIEhfR0VUX0RBVEFfRklMRV9PRkZTRVQoaCkgXAotICAgIChsb25nKShGSUxIU1ogKyBPQkpfQ09GRl9BT1VUSERSU1ogKyBcCi0JICAgSF9HRVRfTlVNQkVSX09GX1NFQ1RJT05TKGgpICogU0NOSFNaICsgXAotCSAgIEhfR0VUX1RFWFRfU0laRShoKSkKLSNkZWZpbmUgSF9HRVRfQlNTX0ZJTEVfT0ZGU0VUKGgpIDAKLSNkZWZpbmUgSF9HRVRfUkVMT0NBVElPTl9GSUxFX09GRlNFVChoKSBcCi0gICAgKGxvbmcpKEZJTEhTWiArIE9CSl9DT0ZGX0FPVVRIRFJTWiArIFwKLQkgICBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1ogKyBcCi0JICAgSF9HRVRfVEVYVF9TSVpFKGgpICsgSF9HRVRfREFUQV9TSVpFKGgpKQotI2RlZmluZSBIX0dFVF9MSU5FTk9fRklMRV9PRkZTRVQoaCkgXAotICAgIChsb25nKShGSUxIU1ogKyBPQkpfQ09GRl9BT1VUSERSU1ogKyBcCi0JICAgSF9HRVRfTlVNQkVSX09GX1NFQ1RJT05TKGgpICogU0NOSFNaICsgXAotCSAgIEhfR0VUX1RFWFRfU0laRShoKSArIEhfR0VUX0RBVEFfU0laRShoKSArIFwKLQkgICBIX0dFVF9SRUxPQ0FUSU9OX1NJWkUoaCkpCi0jZGVmaW5lIEhfR0VUX1NZTUJPTF9UQUJMRV9GSUxFX09GRlNFVChoKSBcCi0gICAgKGxvbmcpKEZJTEhTWiArIE9CSl9DT0ZGX0FPVVRIRFJTWiArIFwKLQkgICBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1ogKyBcCi0JICAgSF9HRVRfVEVYVF9TSVpFKGgpICsgSF9HRVRfREFUQV9TSVpFKGgpICsgXAotCSAgIEhfR0VUX1JFTE9DQVRJT05fU0laRShoKSArIEhfR0VUX0xJTkVOT19TSVpFKGgpKQotCi0vKiBBY2Nlc3NvcnMgKi8KLS8qIGFvdXRoZHIgKi8KLSNkZWZpbmUgSF9HRVRfTUFHSUNfTlVNQkVSKGgpICAgICAgICAgICAoKGgpLT5hb3V0aGRyLm1hZ2ljKQotI2RlZmluZSBIX0dFVF9WRVJTSU9OX1NUQU1QKGgpCQkoKGgpLT5hb3V0aGRyLnZzdGFtcCkKLSNkZWZpbmUgSF9HRVRfVEVYVF9TSVpFKGgpICAgICAgICAgICAgICAoKGgpLT5hb3V0aGRyLnRzaXplKQotI2RlZmluZSBIX0dFVF9EQVRBX1NJWkUoaCkgICAgICAgICAgICAgICgoaCktPmFvdXRoZHIuZHNpemUpCi0jZGVmaW5lIEhfR0VUX0JTU19TSVpFKGgpICAgICAgICAgICAgICAgKChoKS0+YW91dGhkci5ic2l6ZSkKLSNkZWZpbmUgSF9HRVRfRU5UUllfUE9JTlQoaCkgICAgICAgICAgICAoKGgpLT5hb3V0aGRyLmVudHJ5KQotI2RlZmluZSBIX0dFVF9URVhUX1NUQVJUKGgpCQkoKGgpLT5hb3V0aGRyLnRleHRfc3RhcnQpCi0jZGVmaW5lIEhfR0VUX0RBVEFfU1RBUlQoaCkJCSgoaCktPmFvdXRoZHIuZGF0YV9zdGFydCkKLS8qIGZpbGVoZHIgKi8KLSNkZWZpbmUgSF9HRVRfRklMRV9NQUdJQ19OVU1CRVIoaCkJKChoKS0+ZmlsZWhkci5mX21hZ2ljKQotI2RlZmluZSBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkJKChoKS0+ZmlsZWhkci5mX25zY25zKQotI2RlZmluZSBIX0dFVF9USU1FX1NUQU1QKGgpCQkoKGgpLT5maWxlaGRyLmZfdGltZGF0KQotI2RlZmluZSBIX0dFVF9TWU1CT0xfVEFCTEVfUE9JTlRFUihoKQkoKGgpLT5maWxlaGRyLmZfc3ltcHRyKQotI2RlZmluZSBIX0dFVF9TWU1CT0xfQ09VTlQoaCkJCSgoaCktPmZpbGVoZHIuZl9uc3ltcykKLSNkZWZpbmUgSF9HRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCkJKEhfR0VUX1NZTUJPTF9DT1VOVChoKSAqIFNZTUVTWikKLSNkZWZpbmUgSF9HRVRfU0laRU9GX09QVElPTkFMX0hFQURFUihoKQkoKGgpLT5maWxlaGRyLmZfb3B0aGRyKQotI2RlZmluZSBIX0dFVF9GTEFHUyhoKQkJCSgoaCktPmZpbGVoZHIuZl9mbGFncykKLS8qIEV4dHJhIGZpZWxkcyB0byBhY2hpZXZlIGJzZCBhLm91dCBjb21wYXRpYmlsaXR5IGFuZCBmb3IgY29udmVuaWVuY2UgKi8KLSNkZWZpbmUgSF9HRVRfUkVMT0NBVElPTl9TSVpFKGgpICAgCSgoaCktPnJlbG9jYXRpb25fc2l6ZSkKLSNkZWZpbmUgSF9HRVRfU1RSSU5HX1NJWkUoaCkgICAgICAgICAgICAoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSkKLSNkZWZpbmUgSF9HRVRfTElORU5PX1NJWkUoaCkgICAgICAgICAgICAoKGgpLT5saW5lbm9fc2l6ZSkKLQotI2lmbmRlZiBPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUgotI2RlZmluZSBIX0dFVF9IRUFERVJfU0laRShoKQkJKHNpemVvZihGSUxIRFIpIFwKLQkJCQkJICsgc2l6ZW9mKEFPVVRIRFIpXAotCQkJCQkgKyAoSF9HRVRfTlVNQkVSX09GX1NFQ1RJT05TKGgpICogU0NOSFNaKSkKLSNlbHNlIC8qIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSICovCi0jZGVmaW5lIEhfR0VUX0hFQURFUl9TSVpFKGgpCQkoc2l6ZW9mKEZJTEhEUikgXAotCQkJCQkgKyAoSF9HRVRfTlVNQkVSX09GX1NFQ1RJT05TKGgpICogU0NOSFNaKSkKLSNlbmRpZiAvKiBPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUiAqLwotCi0jZGVmaW5lIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgpCSh0ZXh0X3NlY3Rpb25faGVhZGVyLnNfbnJlbG9jICogUkVMU1opCi0jZGVmaW5lIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKGgpCShkYXRhX3NlY3Rpb25faGVhZGVyLnNfbnJlbG9jICogUkVMU1opCi0KLS8qIE1vZGlmaWVycyAqLwotLyogYW91dGhkciAqLwotI2RlZmluZSBIX1NFVF9NQUdJQ19OVU1CRVIoaCx2KSAgICAgICAgICgoaCktPmFvdXRoZHIubWFnaWMgPSAodikpCi0jZGVmaW5lIEhfU0VUX1ZFUlNJT05fU1RBTVAoaCx2KQkoKGgpLT5hb3V0aGRyLnZzdGFtcCA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfVEVYVF9TSVpFKGgsdikgICAgICAgICAgICAoKGgpLT5hb3V0aGRyLnRzaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9EQVRBX1NJWkUoaCx2KSAgICAgICAgICAgICgoaCktPmFvdXRoZHIuZHNpemUgPSAodikpCi0jZGVmaW5lIEhfU0VUX0JTU19TSVpFKGgsdikgICAgICAgICAgICAgKChoKS0+YW91dGhkci5ic2l6ZSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfRU5UUllfUE9JTlQoaCx2KSAgICAgICAgICAoKGgpLT5hb3V0aGRyLmVudHJ5ID0gKHYpKQotI2RlZmluZSBIX1NFVF9URVhUX1NUQVJUKGgsdikJCSgoaCktPmFvdXRoZHIudGV4dF9zdGFydCA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfREFUQV9TVEFSVChoLHYpCQkoKGgpLT5hb3V0aGRyLmRhdGFfc3RhcnQgPSAodikpCi0vKiBmaWxlaGRyICovCi0jZGVmaW5lIEhfU0VUX0ZJTEVfTUFHSUNfTlVNQkVSKGgsdikJKChoKS0+ZmlsZWhkci5mX21hZ2ljID0gKHYpKQotI2RlZmluZSBIX1NFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCx2KQkoKGgpLT5maWxlaGRyLmZfbnNjbnMgPSAodikpCi0jZGVmaW5lIEhfU0VUX1RJTUVfU1RBTVAoaCx2KQkJKChoKS0+ZmlsZWhkci5mX3RpbWRhdCA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfU1lNQk9MX1RBQkxFX1BPSU5URVIoaCx2KQkoKGgpLT5maWxlaGRyLmZfc3ltcHRyID0gKHYpKQotI2RlZmluZSBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRShoLHYpICAgICgoaCktPmZpbGVoZHIuZl9uc3ltcyA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfU0laRU9GX09QVElPTkFMX0hFQURFUihoLHYpICgoaCktPmZpbGVoZHIuZl9vcHRoZHIgPSAodikpCi0jZGVmaW5lIEhfU0VUX0ZMQUdTKGgsdikJCSgoaCktPmZpbGVoZHIuZl9mbGFncyA9ICh2KSkKLS8qIEV4dHJhIGZpZWxkcyB0byBhY2hpZXZlIGJzZCBhLm91dCBjb21wYXRpYmlsaXR5IGFuZCBmb3IgY29udmluaWVuY2UgKi8KLSNkZWZpbmUgSF9TRVRfUkVMT0NBVElPTl9TSVpFKGgsdCxkKSAJKChoKS0+cmVsb2NhdGlvbl9zaXplID0gKHQpKyhkKSkKLSNkZWZpbmUgSF9TRVRfU1RSSU5HX1NJWkUoaCx2KSAgICAgICAgICAoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfTElORU5PX1NJWkUoaCx2KSAgICAgICAgICAoKGgpLT5saW5lbm9fc2l6ZSA9ICh2KSkKLQotLyogU2VnbWVudCBmbGlwcGluZyAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciBhb3V0aGRyOwkvKiBhLm91dCBoZWFkZXIgKi8KLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgZmlsZWhkcjsJLyogRmlsZSBoZWFkZXIsIG5vdCBtYWNoaW5lIGRlcC4gKi8KLSAgbG9uZyBzdHJpbmdfdGFibGVfc2l6ZTsJLyogbmFtZXMgKyAnXDAnICsgc2l6ZW9mKGludCkgKi8KLSAgbG9uZyByZWxvY2F0aW9uX3NpemU7CS8qIEN1bXVsYXRlZCBzaXplIG9mIHJlbG9jYXRpb24KLQkJCSAgIGluZm9ybWF0aW9uIGZvciBhbGwgc2VjdGlvbnMgaW4KLQkJCSAgIGJ5dGVzLiAqLwotICBsb25nIGxpbmVub19zaXplOwkJLyogU2l6ZSBvZiB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24KLQkJCQkgICB0YWJsZSBpbiBieXRlcyAqLwotfSBvYmplY3RfaGVhZGVyczsKLQotCi0KLXN0cnVjdCBsaW5lbm9fbGlzdAotewotICBzdHJ1Y3QgYmZkX2ludGVybmFsX2xpbmVubyBsaW5lOwotICBjaGFyICpmcmFnOwkJCS8qIEZyYWcgdG8gd2hpY2ggdGhlIGxpbmUgbnVtYmVyIGlzIHJlbGF0ZWQgKi8KLSAgc3RydWN0IGxpbmVub19saXN0ICpuZXh0OwkvKiBGb3J3YXJkIGNoYWluIHBvaW50ZXIgKi8KLX07Ci0KLQotCi0KLSNkZWZpbmUgb2JqX3NlZ21lbnRfbmFtZShpKSAoc2VnbWVudF9pbmZvWyhpbnQpIChpKV0uc2NuaGRyLnNfbmFtZSkKLQotI2RlZmluZSBvYmpfYWRkX3NlZ21lbnQocykgb2JqX2NvZmZfYWRkX3NlZ21lbnQgKHMpCi0KLWV4dGVybiBzZWdUIG9ial9jb2ZmX2FkZF9zZWdtZW50IFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi1leHRlcm4gdm9pZCBvYmpfY29mZl9zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotCi1leHRlcm4gdm9pZCBjX2RvdF9maWxlX3N5bWJvbCBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotI2RlZmluZSBvYmpfYXBwX2ZpbGUgY19kb3RfZmlsZV9zeW1ib2wKLWV4dGVybiB2b2lkIG9ial9leHRyYV9zdHVmZiBQQVJBTVMgKChvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpKTsKLQotZXh0ZXJuIHNlZ1Qgc19nZXRfc2VnbWVudCBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICogcHRyKSk7Ci0KLWV4dGVybiB2b2lkIGNfc2VjdGlvbl9oZWFkZXIgUEFSQU1TICgoc3RydWN0IGludGVybmFsX3NjbmhkciAqIGhlYWRlciwKLQkJCQkgICAgICBjaGFyICpuYW1lLAotCQkJCSAgICAgIGxvbmcgY29yZV9hZGRyZXNzLAotCQkJCSAgICAgIGxvbmcgc2l6ZSwKLQkJCQkgICAgICBsb25nIGRhdGFfcHRyLAotCQkJCSAgICAgIGxvbmcgcmVsb2NfcHRyLAotCQkJCSAgICAgIGxvbmcgbGluZW5vX3B0ciwKLQkJCQkgICAgICBsb25nIHJlbG9jX251bWJlciwKLQkJCQkgICAgICBsb25nIGxpbmVub19udW1iZXIsCi0JCQkJICAgICAgbG9uZyBhbGlnbm1lbnQpKTsKLQotI2lmbmRlZiB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sKLXZvaWQgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOwotI2VuZGlmCi0KLS8qIHNhbml0eSBjaGVjayAqLwotCi0jaWZkZWYgVENfSTk2MAotI2lmbmRlZiBDX0xFQUZTVEFUCi1oZXkgISBXaGVyZSBpcyB0aGUgQ19MRUFGU1RBVCBkZWZpbml0aW9uID8gaTk2MCAtIGNvZmYgc3VwcG9ydCBpcyBkZXBlbmRpbmcgb24gaXQuCi0jZW5kaWYgLyogbm8gQ19MRUFGU1RBVCAqLwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLWV4dGVybiBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyIGRhdGFfc2VjdGlvbl9oZWFkZXI7Ci1leHRlcm4gc3RydWN0IGludGVybmFsX3NjbmhkciB0ZXh0X3NlY3Rpb25faGVhZGVyOwotCi0vKiBGb3J3YXJkIHRoZSBzZWdtZW50IG9mIGEgZm9yd2FyZGVkIHN5bWJvbC4gICovCi0jZGVmaW5lIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKGRlc3Qsc3JjKSBcCi0gIChTRl9HRVRfR0VUX1NFR01FTlQgKGRlc3QpIFwKLSAgID8gKFNfU0VUX1NFR01FTlQgKGRlc3QsIFNfR0VUX1NFR01FTlQgKHNyYykpLCAwKSBcCi0gICA6IDApCi0KLSNpZmRlZiBURV9QRQotI2RlZmluZSBvYmpfaGFuZGxlX2xpbmtfb25jZSh0KSBvYmpfY29mZl9wZV9oYW5kbGVfbGlua19vbmNlICh0KQotZXh0ZXJuIHZvaWQgb2JqX2NvZmZfcGVfaGFuZGxlX2xpbmtfb25jZSAoKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogbm90IEJGRF9BU1NFTUJMRVIgKi8KLQotLyogSW4gQ09GRiwgaWYgYSBzeW1ib2wgaXMgZGVmaW5lZCB1c2luZyAuZGVmLy52YWwgU1lNLy5lbmRlZiwgaXQncyBPSwotICAgdG8gcmVkZWZpbmUgdGhlIHN5bWJvbCBsYXRlciBvbi4gIFRoaXMgY2FuIGhhcHBlbiBpZiBDIHN5bWJvbHMgdXNlCi0gICBhIHByZWZpeCwgYW5kIGEgc3ltYm9sIGlzIGRlZmluZWQgYm90aCB3aXRoIGFuZCB3aXRob3V0IHRoZSBwcmVmaXgsCi0gICBhcyBpbiBzdGFydC9fc3RhcnQvX19zdGFydCBpbiBnY2MvbGliZ2NjMS10ZXN0LmMuICAqLwotI2RlZmluZSBSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04oc3ltKQkJXAotKFNGX0dFVF9HRVRfU0VHTUVOVCAoc3ltKQkJCQlcCi0gPyAoc3ltLT5zeV9mcmFnID0gZnJhZ19ub3csCQkJCVwKLSAgICBTX1NFVF9WQUxVRSAoc3ltLCBmcmFnX25vd19maXggKCkpLAkJCVwKLSAgICBTX1NFVF9TRUdNRU5UIChzeW0sIG5vd19zZWcpLAkJCVwKLSAgICAwKQkJCQkJCQlcCi0gOiAwKQotCi0vKiBTdGFicyBpbiBhIGNvZmYgZmlsZSBnbyBpbnRvIHRoZWlyIG93biBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyAxCi0KLS8qIFdlIG5lZWQgMTIgYnl0ZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIHRvIGhvbGQgc29tZSBpbml0aWFsCi0gICBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gdm9pZCBvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbiBQQVJBTVMgKChzZWdUKSk7Ci0jZGVmaW5lIElOSVRfU1RBQl9TRUNUSU9OKHNlZykgb2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKLQotI2VuZGlmIC8qIE9CSl9GT1JNQVRfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZWNvZmYuYyBiL2dhcy9jb25maWcvb2JqLWVjb2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjM2NlODguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotZWNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKiBFQ09GRiBvYmplY3QgZmlsZSBmb3JtYXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSAgIFRoaXMgZmlsZSB3YXMgcHV0IHRvZ2V0aGVyIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIE9CSl9IRUFERVIgIm9iai1lY29mZi5oIgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImJmZC9saWJjb2ZmLmgiCi0jaW5jbHVkZSAiYmZkL2xpYmVjb2ZmLmgiCi0KLS8qIEFsbW9zdCBhbGwgb2YgdGhlIEVDT0ZGIHN1cHBvcnQgaXMgYWN0dWFsbHkgaW4gZWNvZmYuYyBpbiB0aGUgbWFpbgotICAgZ2FzIGRpcmVjdG9yeS4gIFRoaXMgZmlsZSBtb3N0bHkganVzdCBhcnJhbmdlcyB0byBjYWxsIHRoYXQgb25lIGF0Ci0gICB0aGUgcmlnaHQgdGltZXMuICAqLwotCi1zdGF0aWMgaW50IGVjb2ZmX3NlY19zeW1fb2tfZm9yX3JlbG9jIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIG9ial9lY29mZl9mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICosIGludCAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9wb3BfaW5zZXJ0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVGhlc2UgYXJlIHRoZSBwc2V1ZG8tb3BzIHdlIHN1cHBvcnQgaW4gdGhpcyBmaWxlLiAgT25seSB0aG9zZQotICAgcmVsYXRpbmcgdG8gZGVidWdnaW5nIGluZm9ybWF0aW9uIGFyZSBzdXBwb3J0ZWQgaGVyZS4KLQotICAgVGhlIGZvbGxvd2luZyBwc2V1ZG8tb3BzIGZyb20gdGhlIEthbmUgYW5kIEhlaW5yaWNoIE1JUFMgYm9vawotICAgc2hvdWxkIGJlIGRlZmluZWQgaGVyZSwgYnV0IGFyZSBjdXJyZW50bHkgdW5zdXBwb3J0ZWQ6IC5hZW50LAotICAgLmJnbmIsIC5lbmRiLCAudmVyc3RhbXAsIC52cmVnLgotCi0gICBUaGUgZm9sbG93aW5nIHBzZXVkby1vcHMgZnJvbSB0aGUgS2FuZSBhbmQgSGVpbnJpY2ggTUlQUyBib29rIGFyZQotICAgTUlQUyBDUFUgc3BlY2lmaWMsIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBieSB0Yy1taXBzLmM6IC5hbGlhcywKLSAgIC5leHRlcm4sIC5nYWxpdmUsIC5namFsZGVmLCAuZ2pybGl2ZSwgLmxpdmVyZWcsIC5ub2FsaWFzLCAub3B0aW9uLAotICAgLnJkYXRhLCAuc2RhdGEsIC5zZXQuCi0KLSAgIFRoZSBmb2xsb3dpbmcgcHNldWRvLW9wcyBmcm9tIHRoZSBLYW5lIGFuZCBIZWlucmljaCBNSVBTIGJvb2sgYXJlCi0gICBub3QgTUlQUyBDUFUgc3BlY2lmaWMsIGJ1dCBhcmUgYWxzbyBub3QgRUNPRkYgc3BlY2lmaWMuICBJIGhhdmUKLSAgIG9ubHkgbGlzdGVkIHRoZSBvbmVzIHdoaWNoIGFyZSBub3QgYWxyZWFkeSBpbiByZWFkLmMuICBJdCdzIG5vdAotICAgY29tcGxldGVseSBjbGVhciB3aGVyZSB0aGVzZSBzaG91bGQgYmUgZGVmaW5lZCwgYnV0IHRjLW1pcHMuYyBpcwotICAgcHJvYmFibHkgdGhlIG1vc3QgcmVhc29uYWJsZSBwbGFjZTogLmFzY2lpeiwgLmFzbTAsIC5lbmRyLCAuZXJyLAotICAgLmhhbGYsIC5sYWIsIC5yZXBlYXQsIC5zdHJ1Y3QsIC53ZWFrZXh0LiAgKi8KLQotY29uc3QgcHNldWRvX3R5cGVTIG9ial9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIC8qIENPRkYgc3R5bGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAubG4gaXMgbm90IHVzZWQ7IC5sb2MgaXMgdXNlZAotICAgICBpbnN0ZWFkLiAgKi8KLSAgeyAiZGVmIiwJZWNvZmZfZGlyZWN0aXZlX2RlZiwJMCB9LAotICB7ICJkaW0iLAllY29mZl9kaXJlY3RpdmVfZGltLAkwIH0sCi0gIHsgImVuZGVmIiwJZWNvZmZfZGlyZWN0aXZlX2VuZGVmLAkwIH0sCi0gIHsgImZpbGUiLAllY29mZl9kaXJlY3RpdmVfZmlsZSwJMCB9LAotICB7ICJzY2wiLAllY29mZl9kaXJlY3RpdmVfc2NsLAkwIH0sCi0gIHsgInNpemUiLAllY29mZl9kaXJlY3RpdmVfc2l6ZSwJMCB9LAotICB7ICJlc2l6ZSIsCWVjb2ZmX2RpcmVjdGl2ZV9zaXplLAkwIH0sCi0gIHsgInRhZyIsCWVjb2ZmX2RpcmVjdGl2ZV90YWcsCTAgfSwKLSAgeyAidHlwZSIsCWVjb2ZmX2RpcmVjdGl2ZV90eXBlLAkwIH0sCi0gIHsgImV0eXBlIiwJZWNvZmZfZGlyZWN0aXZlX3R5cGUsCTAgfSwKLSAgeyAidmFsIiwJZWNvZmZfZGlyZWN0aXZlX3ZhbCwJMCB9LAotCi0gIC8qIEVDT0ZGIHNwZWNpZmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIHsgImJlZ2luIiwJZWNvZmZfZGlyZWN0aXZlX2JlZ2luLAkwIH0sCi0gIHsgImJlbmQiLAllY29mZl9kaXJlY3RpdmVfYmVuZCwJMCB9LAotICB7ICJlbmQiLAllY29mZl9kaXJlY3RpdmVfZW5kLAkwIH0sCi0gIHsgImVudCIsCWVjb2ZmX2RpcmVjdGl2ZV9lbnQsCTAgfSwKLSAgeyAiZm1hc2siLAllY29mZl9kaXJlY3RpdmVfZm1hc2ssCTAgfSwKLSAgeyAiZnJhbWUiLAllY29mZl9kaXJlY3RpdmVfZnJhbWUsCTAgfSwKLSAgeyAibG9jIiwJZWNvZmZfZGlyZWN0aXZlX2xvYywJMCB9LAotICB7ICJtYXNrIiwJZWNvZmZfZGlyZWN0aXZlX21hc2ssCTAgfSwKLQotICAvKiBPdGhlciBFQ09GRiBkaXJlY3RpdmVzLiAgKi8KLSAgeyAiZXh0ZXJuIiwJZWNvZmZfZGlyZWN0aXZlX2V4dGVybiwJMCB9LAotCi0jaWZuZGVmIFRDX01JUFMKLSAgLyogRm9yIFRDX01JUFMsIHRjLW1pcHMuYyBhZGRzIHRoaXMuICovCi0gIHsgIndlYWtleHQiLAllY29mZl9kaXJlY3RpdmVfd2Vha2V4dCwgMCB9LAotI2VuZGlmCi0KLSAgLyogVGhlc2UgYXJlIHVzZWQgb24gSXJpeC4gIEkgZG9uJ3Qga25vdyBob3cgdG8gaW1wbGVtZW50IHRoZW0uICAqLwotICB7ICJiZ25iIiwJc19pZ25vcmUsCQkwIH0sCi0gIHsgImVuZGIiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAidmVyc3RhbXAiLAlzX2lnbm9yZSwJCTAgfSwKLQotICAvKiBTZW50aW5lbC4gICovCi0gIHsgTlVMTCB9Ci19OwotCi0vKiBTd2FwIG91dCB0aGUgc3ltYm9scyBhbmQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBCRkQuICAqLwotCi12b2lkCi1lY29mZl9mcm9iX2ZpbGUgKCkKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwCi0gICAgPSAmZWNvZmZfYmFja2VuZCAoc3Rkb3V0cHV0KS0+ZGVidWdfc3dhcDsKLSAgYmZkX3ZtYSBhZGRyOwotICBhc2VjdGlvbiAqc2VjOwotICBIRFJSICpoZHI7Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciAqc2V0OwotCi0gIC8qIFNldCB0aGUgc2VjdGlvbiBWTUEgdmFsdWVzLiAgV2UgZm9yY2UgdGhlIC5zZGF0YSBhbmQgLnNic3MKLSAgICAgc2VjdGlvbnMgdG8gdGhlIGVuZCB0byBlbnN1cmUgdGhhdCB0aGVpciBWTUEgYWRkcmVzc2VzIGFyZSBjbG9zZQotICAgICB0b2dldGhlciBzbyB0aGF0IHRoZSBHUCByZWdpc3RlciBjYW4gYWRkcmVzcyBib3RoIG9mIHRoZW0uICBXZQotICAgICBwdXQgdGhlIC5ic3Mgc2VjdGlvbiBhZnRlciB0aGUgLnNic3Mgc2VjdGlvbi4KLQotICAgICBBbHNvLCBmb3IgdGhlIEFscGhhLCB3ZSBtdXN0IHNvcnQgdGhlIHNlY3Rpb25zLCB0byBtYWtlIHN1cmUgdGhleQotICAgICBhcHBlYXIgaW4gdGhlIG91dHB1dCBmaWxlIGluIHRoZSBjb3JyZWN0IG9yZGVyLiAgKEFjdHVhbGx5LCBtYXliZQotICAgICB0aGlzIGlzIGEgam9iIGZvciBCRkQuICBCdXQgdGhlIFZNQXMgY29tcHV0ZWQgd291bGQgYmUgb3V0IG9mCi0gICAgIHdoYWNrIGlmIHdlIGNvbXB1dGVkIHRoZW0gZ2l2ZW4gb3VyIGluaXRpYWwsIHJhbmRvbSBvcmRlcmluZy4KLSAgICAgSXQncyBwb3NzaWJsZSB0aGF0IHRoYXQgd291bGRuJ3QgYnJlYWsgdGhpbmdzOyBJIGNvdWxkIGRvIHNvbWUKLSAgICAgZXhwZXJpbWVudGluZyBzb21ldGltZSBhbmQgZmluZCBvdXQuCi0KLSAgICAgVGhpcyBvdXRwdXQgb3JkZXJpbmcgb2Ygc2VjdGlvbnMgaXMgbWFnaWMsIG9uIHRoZSBBbHBoYSwgYXQKLSAgICAgbGVhc3QuICBUaGUgLmxpdGEgc2VjdGlvbiBtdXN0IGNvbWUgYmVmb3JlIC5saXQ4IGFuZCAubGl0NCwKLSAgICAgb3RoZXJ3aXNlIHRoZSBPU0YvMSBsaW5rZXIgbWF5IHNpbGVudGx5IHRyYXNoIHRoZSAubGl0ezQsOH0KLSAgICAgc2VjdGlvbiBjb250ZW50cy4gIEFsc28sIC50ZXh0IG11c3QgcHJlY2VlZCAucmRhdGEuICBUaGVzZSBkaWZmZXIKLSAgICAgZnJvbSB0aGUgb3JkZXIgZGVzY3JpYmVkIGluIHNvbWUgcGFydHMgb2YgdGhlIERFQyBPU0YvMSBBc3NlbWJseQotICAgICBMYW5ndWFnZSBQcm9ncmFtbWVyJ3MgR3VpZGUsIGJ1dCB0aGF0IG9yZGVyIGRvZXNuJ3Qgc2VlbSB0byB3b3JrCi0gICAgIHdpdGggdGhlaXIgbGlua2VyLgotCi0gICAgIEkgZG9uJ3Qga25vdyBpZiBzZWN0aW9uIG9yZGVyaW5nIG9uIHRoZSBNSVBTIGlzIGltcG9ydGFudC4gICovCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWVzW10gPSB7Ci0gICAgLyogdGV4dCBzZWdtZW50ICovCi0gICAgIi50ZXh0IiwgIi5yZGF0YSIsICIuaW5pdCIsICIuZmluaSIsCi0gICAgLyogZGF0YSBzZWdtZW50ICovCi0gICAgIi5kYXRhIiwgIi5saXRhIiwgIi5saXQ4IiwgIi5saXQ0IiwgIi5zZGF0YSIsICIuZ290IiwKLSAgICAvKiBic3Mgc2VnbWVudCAqLwotICAgICIuc2JzcyIsICIuYnNzIiwKLSAgfTsKLSNkZWZpbmUgbl9uYW1lcyAoc2l6ZW9mIChuYW1lcykgLyBzaXplb2YgKG5hbWVzWzBdKSkKLQotICBhZGRyID0gMDsKLSAgewotICAgIC8qIFNlY3Rpb25zIHRoYXQgbWF0Y2ggbmFtZXMsIG9yZGVyIHRvIGJlIHN0cmFpZ2h0ZW5lZCBvdXQgbGF0ZXIuICAqLwotICAgIGFzZWN0aW9uICpzZWNzW25fbmFtZXNdOwotICAgIC8qIExpbmtlZCBsaXN0IG9mIHNlY3Rpb25zIHdpdGggbm9uLW1hdGNoaW5nIG5hbWVzLiAgUmFuZG9tIG9yZGVyaW5nLiAgKi8KLSAgICBhc2VjdGlvbiAqb3RoZXJfc2VjdGlvbnMgPSAwOwotICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBzZWN0aW9uLCBzaW5jZSB3ZSdyZSBkZXN0cm95aW5nIHRoZSBvcmlnaW5hbAotICAgICAgIG9yZGVyaW5nLiAgKi8KLSAgICBhc2VjdGlvbiAqbmV4dDsKLQotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG5fbmFtZXM7IGkrKykKLSAgICAgIHNlY3NbaV0gPSAwOwotICAgIGZvciAoc2VjID0gc3Rkb3V0cHV0LT5zZWN0aW9uczsgc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzZWMgPSBuZXh0KQotICAgICAgewotCW5leHQgPSBzZWMtPm5leHQ7Ci0JZm9yIChpID0gMDsgaSA8IG5fbmFtZXM7IGkrKykKLQkgIGlmICghc3RyY21wIChzZWMtPm5hbWUsIG5hbWVzW2ldKSkKLQkgICAgewotCSAgICAgIHNlY3NbaV0gPSBzZWM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQlpZiAoaSA9PSBuX25hbWVzKQotCSAgewotCSAgICBiZmRfc2V0X3NlY3Rpb25fdm1hIChzdGRvdXRwdXQsIHNlYywgYWRkcik7Ci0JICAgIGFkZHIgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCBzZWMpOwotCSAgICBzZWMtPm5leHQgPSBvdGhlcl9zZWN0aW9uczsKLQkgICAgb3RoZXJfc2VjdGlvbnMgPSBzZWM7Ci0JICB9Ci0gICAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IG5fbmFtZXM7IGkrKykKLSAgICAgIGlmIChzZWNzW2ldKQotCXsKLQkgIHNlYyA9IHNlY3NbaV07Ci0JICBiZmRfc2V0X3NlY3Rpb25fdm1hIChzdGRvdXRwdXQsIHNlYywgYWRkcik7Ci0JICBhZGRyICs9IGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgc2VjKTsKLQl9Ci0gICAgZm9yIChpID0gbl9uYW1lcyAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgaWYgKHNlY3NbaV0pCi0JewotCSAgc2VjID0gc2Vjc1tpXTsKLQkgIHNlYy0+bmV4dCA9IG90aGVyX3NlY3Rpb25zOwotCSAgb3RoZXJfc2VjdGlvbnMgPSBzZWM7Ci0JfQotICAgIHN0ZG91dHB1dC0+c2VjdGlvbnMgPSBvdGhlcl9zZWN0aW9uczsKLSAgfQotCi0gIC8qIEJ1aWxkIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBhc3NlcnQgKGVjb2ZmX2RhdGEgKHN0ZG91dHB1dCkgIT0gMCk7Ci0gIGhkciA9ICZlY29mZl9kYXRhIChzdGRvdXRwdXQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlcjsKLSAgZWNvZmZfYnVpbGRfZGVidWcgKGhkciwgJmJ1ZiwgZGVidWdfc3dhcCk7Ci0KLSAgLyogRmluaXNoIHVwIHRoZSBlY29mZl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotICBzZXQgPSBidWY7Ci0jZGVmaW5lIFNFVChwdHIsIGNvdW50LCB0eXBlLCBzaXplKSBcCi0gIGlmIChoZHItPmNvdW50ID09IDApIFwKLSAgICBlY29mZl9kYXRhIChzdGRvdXRwdXQpLT5kZWJ1Z19pbmZvLnB0ciA9ICh0eXBlKSBOVUxMOyBcCi0gIGVsc2UgXAotICAgIHsgXAotICAgICAgZWNvZmZfZGF0YSAoc3Rkb3V0cHV0KS0+ZGVidWdfaW5mby5wdHIgPSAodHlwZSkgc2V0OyBcCi0gICAgICBzZXQgKz0gaGRyLT5jb3VudCAqIHNpemU7IFwKLSAgICB9Ci0KLSAgU0VUIChsaW5lLCBjYkxpbmUsIHVuc2lnbmVkIGNoYXIgKiwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSk7Ci0gIFNFVCAoZXh0ZXJuYWxfZG5yLCBpZG5NYXgsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfZG5yX3NpemUpOwotICBTRVQgKGV4dGVybmFsX3BkciwgaXBkTWF4LCBQVFIsIGRlYnVnX3N3YXAtPmV4dGVybmFsX3Bkcl9zaXplKTsKLSAgU0VUIChleHRlcm5hbF9zeW0sIGlzeW1NYXgsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOwotICBTRVQgKGV4dGVybmFsX29wdCwgaW9wdE1heCwgUFRSLCBkZWJ1Z19zd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSk7Ci0gIFNFVCAoZXh0ZXJuYWxfYXV4LCBpYXV4TWF4LCB1bmlvbiBhdXhfZXh0ICosIHNpemVvZiAodW5pb24gYXV4X2V4dCkpOwotICBTRVQgKHNzLCBpc3NNYXgsIGNoYXIgKiwgc2l6ZW9mIChjaGFyKSk7Ci0gIFNFVCAoc3NleHQsIGlzc0V4dE1heCwgY2hhciAqLCBzaXplb2YgKGNoYXIpKTsKLSAgU0VUIChleHRlcm5hbF9yZmQsIGNyZmQsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpOwotICBTRVQgKGV4dGVybmFsX2ZkciwgaWZkTWF4LCBQVFIsIGRlYnVnX3N3YXAtPmV4dGVybmFsX2Zkcl9zaXplKTsKLSAgU0VUIChleHRlcm5hbF9leHQsIGlleHRNYXgsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpOwotCi0jdW5kZWYgU0VUCi0KLSAgLyogRmlsbCBpbiB0aGUgcmVnaXN0ZXIgbWFza3MuICAqLwotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBncHJtYXNrID0gMDsKLSAgICB1bnNpZ25lZCBsb25nIGZwcm1hc2sgPSAwOwotICAgIHVuc2lnbmVkIGxvbmcgKmNwcm1hc2sgPSBOVUxMOwotCi0jaWZkZWYgVENfTUlQUwotICAgIC8qIEZpbGwgaW4gdGhlIE1JUFMgcmVnaXN0ZXIgbWFza3MuICBJdCdzIHByb2JhYmx5IG5vdCB3b3J0aAotICAgICAgIHNldHRpbmcgdXAgYSBnZW5lcmljIGludGVyZmFjZSBmb3IgdGhpcy4gICovCi0gICAgZ3BybWFzayA9IG1pcHNfZ3BybWFzazsKLSAgICBjcHJtYXNrID0gbWlwc19jcHJtYXNrOwotI2VuZGlmCi0KLSNpZmRlZiBUQ19BTFBIQQotICAgIGFscGhhX2Zyb2JfZWNvZmZfZGF0YSAoKTsKLQotICAgIGlmICghIGJmZF9lY29mZl9zZXRfZ3BfdmFsdWUgKHN0ZG91dHB1dCwgYWxwaGFfZ3BfdmFsdWUpKQotICAgICAgYXNfZmF0YWwgKF8oIkNhbid0IHNldCBHUCB2YWx1ZSIpKTsKLQotICAgIGdwcm1hc2sgPSBhbHBoYV9ncHJtYXNrOwotICAgIGZwcm1hc2sgPSBhbHBoYV9mcHJtYXNrOwotI2VuZGlmCi0KLSAgICBpZiAoISBiZmRfZWNvZmZfc2V0X3JlZ21hc2tzIChzdGRvdXRwdXQsIGdwcm1hc2ssIGZwcm1hc2ssIGNwcm1hc2spKQotICAgICAgYXNfZmF0YWwgKF8oIkNhbid0IHNldCByZWdpc3RlciBtYXNrcyIpKTsKLSAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgRUNPRkYgY29kZSB0byBzZXQgdGhlIGV4dGVybmFsIGluZm9ybWF0aW9uCi0gICBmb3IgYSBzeW1ib2wuICBXZSBqdXN0IHBhc3MgaXQgb24gdG8gQkZELCB3aGljaCBleHBlY3RzIHRoZSBzd2FwcGVkCi0gICBpbmZvcm1hdGlvbiB0byBiZSBzdG9yZWQgaW4gdGhlIG5hdGl2ZSBmaWVsZCBvZiB0aGUgc3ltYm9sLiAgKi8KLQotdm9pZAotb2JqX2Vjb2ZmX3NldF9leHQgKHN5bSwgZXh0KQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIEVYVFIgKmV4dDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwCi0gICAgPSAmZWNvZmZfYmFja2VuZCAoc3Rkb3V0cHV0KS0+ZGVidWdfc3dhcDsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKmVzeW07Ci0KLSAga25vdyAoYmZkX2FzeW1ib2xfZmxhdm91ciAoc3ltLT5ic3ltKSA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpOwotICBlc3ltID0gZWNvZmZzeW1ib2wgKHN5bS0+YnN5bSk7Ci0gIGVzeW0tPmxvY2FsID0gZmFsc2U7Ci0gIGVzeW0tPm5hdGl2ZSA9IHhtYWxsb2MgKGRlYnVnX3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKTsKLSAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9vdXQpIChzdGRvdXRwdXQsIGV4dCwgZXN5bS0+bmF0aXZlKTsKLX0KLQotc3RhdGljIGludAotZWNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MgKHNlYykKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWNvZmZfZnJvYl9zeW1ib2wgKHN5bSwgcHVudHApCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgaW50ICpwdW50cDsKLXsKLSAgZWNvZmZfZnJvYl9zeW1ib2wgKHN5bSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lY29mZl9wb3BfaW5zZXJ0ICgpCi17Ci0gIHBvcF9pbnNlcnQgKG9ial9wc2V1ZG9fdGFibGUpOwotfQotCi1jb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyBlY29mZl9mb3JtYXRfb3BzID0KLXsKLSAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAotICAwLAotICAxLAotICBvYmpfZWNvZmZfZnJvYl9zeW1ib2wsCi0gIGVjb2ZmX2Zyb2JfZmlsZSwKLSAgMCwKLSAgMCwgMCwKLSAgMCwgMCwKLSAgMCwKLSAgZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubywKLSAgZWNvZmZfc3RhYiwKLSAgZWNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MsCi0gIGVjb2ZmX3BvcF9pbnNlcnQsCi0gIGVjb2ZmX3NldF9leHQsCi0gIGVjb2ZmX3JlYWRfYmVnaW5faG9vaywKLSAgZWNvZmZfc3ltYm9sX25ld19ob29rLAotfTsKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWVjb2ZmLmggYi9nYXMvY29uZmlnL29iai1lY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjdlNjE5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWVjb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKiBFQ09GRiBvYmplY3QgZmlsZSBmb3JtYXQgaGVhZGVyIGZpbGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIE9CSl9FQ09GRiAxCi0KLS8qIFVzZSB0aGUgZ2VuZXJpYyBFQ09GRiBkZWJ1Z2dpbmcgY29kZS4gICovCi0jZGVmaW5lIEVDT0ZGX0RFQlVHR0lORyAxCi0KLSNkZWZpbmUgT1VUUFVUX0ZMQVZPUiBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLQotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNpbmNsdWRlICJlY29mZi5oIgotCi0vKiBGb3IgZWFjaCBnYXMgc3ltYm9sIHdlIGtlZXAgdHJhY2sgb2Ygd2hpY2ggZmlsZSBpdCBjYW1lIGZyb20sIG9mCi0gICB3aGV0aGVyIHdlIGhhdmUgZ2VuZXJhdGVkIGFuIEVDT0ZGIHN5bWJvbCBmb3IgaXQsIGFuZCB3aGV0aGVyIHRoZQotICAgc3ltYm9scyBpcyB1bmRlZmluZWQgKHRoaXMgbGFzdCBpcyBuZWVkZWQgdG8gZGlzdGluZ3Vpc2ggYSAuZXh0ZXJuCi0gICBzeW1ib2xzIGZyb20gYSAuY29tbSBzeW1ib2wpLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfU1lNQk9MX0ZJRUxEUyBcCi0gIHN0cnVjdCBlZmRyICplY29mZl9maWxlOyBcCi0gIHN0cnVjdCBsb2NhbHN5bSAqZWNvZmZfc3ltYm9sOyBcCi0gIHZhbHVlVCBlY29mZl9leHRlcm5fc2l6ZTsKLQotLyogTW9kaWZ5IHRoZSBFQ09GRiBzeW1ib2wuICAqLwotI2RlZmluZSBvYmpfZnJvYl9zeW1ib2woc3ltcCwgcHVudCkgZWNvZmZfZnJvYl9zeW1ib2wgKHN5bXApCi0KLS8qIFRoaXMgaXMgdXNlZCB0byB3cml0ZSB0aGUgc3ltYm9saWMgZGF0YSBpbiB0aGUgZm9ybWF0IHRoYXQgQkZECi0gICBleHBlY3RzIGl0LiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX2Zyb2JfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG9ial9mcm9iX2ZpbGUoKSBlY29mZl9mcm9iX2ZpbGUgKCkKLQotLyogV2UgdXNlIHRoZSBFQ09GRiBmdW5jdGlvbnMgYXMgb3VyIGhvb2tzLiAgKi8KLSNkZWZpbmUgb2JqX3JlYWRfYmVnaW5faG9vayBlY29mZl9yZWFkX2JlZ2luX2hvb2sKLSNkZWZpbmUgb2JqX3N5bWJvbF9uZXdfaG9vayBlY29mZl9zeW1ib2xfbmV3X2hvb2sKLQotLyogUmVjb3JkIGZpbGUgc3dpdGNoZXMgaW4gdGhlIEVDT0ZGIHN5bWJvbCB0YWJsZS4gICovCi0jZGVmaW5lIG9ial9hcHBfZmlsZShuYW1lKSBlY29mZl9uZXdfZmlsZSAobmFtZSkKLQotLyogQXQgdGhlIG1vbWVudCB3ZSBkb24ndCB3YW50IHRvIGRvIGFueSBzdGFicyBwcm9jZXNzaW5nIGluIHJlYWQuYy4gICovCi0jZGVmaW5lIE9CSl9QUk9DRVNTX1NUQUIoc2VnLCB3aGF0LCBzdHJpbmcsIHR5cGUsIG90aGVyLCBkZXNjKSBcCi0gIGVjb2ZmX3N0YWIgKChzZWcpLCAod2hhdCksIChzdHJpbmcpLCAodHlwZSksIChvdGhlciksIChkZXNjKSkKLQotI2RlZmluZSBFTUlUX1NFQ1RJT05fU1lNQk9MUwkJMAotI2RlZmluZSBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MoU0VDKQkxCi0KLSNkZWZpbmUgb2JqX2Vjb2ZmX3NldF9leHQgZWNvZmZfc2V0X2V4dAotZXh0ZXJuIHZvaWQgb2JqX2Vjb2ZmX3NldF9leHQgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqLCBFWFRSICopKTsKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWVsZi5jIGIvZ2FzL2NvbmZpZy9vYmotZWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MGM0YjcuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzY0ICswLDAgQEAKLS8qIEVMRiBvYmplY3QgZmlsZSBmb3JtYXQKLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIE9CSl9IRUFERVIgIm9iai1lbGYuaCIKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLSNpZm5kZWYgRUNPRkZfREVCVUdHSU5HCi0jZGVmaW5lIEVDT0ZGX0RFQlVHR0lORyAwCi0jZWxzZQotI2RlZmluZSBORUVEX0VDT0ZGX0RFQlVHCi0jZW5kaWYKLQotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSNpbmNsdWRlICJlY29mZi5oIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19BTFBIQQotI2luY2x1ZGUgImVsZi9hbHBoYS5oIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19NSVBTCi0jaW5jbHVkZSAiZWxmL21pcHMuaCIKLSNlbmRpZgotCi0jaWZkZWYgVENfUFBDCi0jaW5jbHVkZSAiZWxmL3BwYy5oIgotI2VuZGlmCi0KLXN0YXRpYyBiZmRfdm1hIGVsZl9zX2dldF9zaXplIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotc3RhdGljIHZvaWQgZWxmX3Nfc2V0X3NpemUgUEFSQU1TICgoc3ltYm9sUyAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYmZkX3ZtYSBlbGZfc19nZXRfYWxpZ24gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfc19zZXRfYWxpZ24gUEFSQU1TICgoc3ltYm9sUyAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgdm9pZCBlbGZfY29weV9zeW1ib2xfYXR0cmlidXRlcyBQQVJBTVMgKChzeW1ib2xTICosIHN5bWJvbFMgKikpOwotc3RhdGljIGludCBlbGZfc2VjX3N5bV9va19mb3JfcmVsb2MgUEFSQU1TICgoYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgYWRqdXN0X3N0YWJfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotc3RhdGljIGJvb2xlYW4gZWxmX2dldF9leHRyIFBBUkFNUyAoKGFzeW1ib2wgKiwgRVhUUiAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfc2V0X2luZGV4IFBBUkFNUyAoKGFzeW1ib2wgKiwgYmZkX3NpemVfdHlwZSkpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIG9ial9lbGZfbGluZSBQQVJBTVMgKChpbnQpKTsKLXZvaWQgb2JqX2VsZl92ZXJzaW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl9zaXplIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl90eXBlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl9pZGVudCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfd2VhayBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfbG9jYWwgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWxmX2NvbW1vbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfc3ltdmVyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl92dGFibGVfaW5oZXJpdCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfdnRhYmxlX2VudHJ5IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl9kYXRhIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl90ZXh0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl9zdWJzZWN0aW9uIFBBUkFNUyAoKGludCkpOwotCi1zdGF0aWMgY29uc3QgcHNldWRvX3R5cGVTIGVsZl9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiY29tbSIsIG9ial9lbGZfY29tbW9uLCAwfSwKLSAgeyJpZGVudCIsIG9ial9lbGZfaWRlbnQsIDB9LAotICB7ImxvY2FsIiwgb2JqX2VsZl9sb2NhbCwgMH0sCi0gIHsicHJldmlvdXMiLCBvYmpfZWxmX3ByZXZpb3VzLCAwfSwKLSAgeyJzZWN0aW9uIiwgb2JqX2VsZl9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0aW9uLnMiLCBvYmpfZWxmX3NlY3Rpb24sIDB9LAotICB7InNlY3QiLCBvYmpfZWxmX3NlY3Rpb24sIDB9LAotICB7InNlY3QucyIsIG9ial9lbGZfc2VjdGlvbiwgMH0sCi0gIHsic2l6ZSIsIG9ial9lbGZfc2l6ZSwgMH0sCi0gIHsidHlwZSIsIG9ial9lbGZfdHlwZSwgMH0sCi0gIHsidmVyc2lvbiIsIG9ial9lbGZfdmVyc2lvbiwgMH0sCi0gIHsid2VhayIsIG9ial9lbGZfd2VhaywgMH0sCi0KLSAgLyogVGhlc2UgYXJlIHVzZWQgZm9yIHN0YWJzLWluLWVsZiBjb25maWd1cmF0aW9ucy4gICovCi0gIHsibGluZSIsIG9ial9lbGZfbGluZSwgMH0sCi0KLSAgLyogVGhpcyBpcyBhIEdOVSBleHRlbnNpb24gdG8gaGFuZGxlIHN5bWJvbCB2ZXJzaW9ucy4gICovCi0gIHsic3ltdmVyIiwgb2JqX2VsZl9zeW12ZXIsIDB9LAotCi0gIC8qIEEgR05VIGV4dGVuc2lvbiB0byBjaGFuZ2Ugc3Vic2VjdGlvbiBvbmx5LiAgKi8KLSAgeyJzdWJzZWN0aW9uIiwgb2JqX2VsZl9zdWJzZWN0aW9uLCAwfSwKLQotICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gYWlkIGluIGdhcmJhZ2UgY29sbGVjdGluZyBDKysgdnRhYmxlcy4gICovCi0gIHsidnRhYmxlX2luaGVyaXQiLCBvYmpfZWxmX3Z0YWJsZV9pbmhlcml0LCAwfSwKLSAgeyJ2dGFibGVfZW50cnkiLCBvYmpfZWxmX3Z0YWJsZV9lbnRyeSwgMH0sCi0KLSAgLyogVGhlc2UgYXJlIHVzZWQgZm9yIGR3YXJmLiAqLwotICB7IjJieXRlIiwgY29ucywgMn0sCi0gIHsiNGJ5dGUiLCBjb25zLCA0fSwKLSAgeyI4Ynl0ZSIsIGNvbnMsIDh9LAotCi0gIC8qIFdlIG5lZWQgdG8gdHJhcCB0aGUgc2VjdGlvbiBjaGFuZ2luZyBjYWxscyB0byBoYW5kbGUgLnByZXZpb3VzLiAgKi8KLSAgeyJkYXRhIiwgb2JqX2VsZl9kYXRhLCAwfSwKLSAgeyJ0ZXh0Iiwgb2JqX2VsZl90ZXh0LCAwfSwKLQotICAvKiBFbmQgc2VudGluZWwuICAqLwotICB7TlVMTH0sCi19OwotCi1zdGF0aWMgY29uc3QgcHNldWRvX3R5cGVTIGVjb2ZmX2RlYnVnX3BzZXVkb190YWJsZVtdID0KLXsKLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0gIC8qIENPRkYgc3R5bGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBFQ09GRi4gLmxuIGlzIG5vdCB1c2VkOyAubG9jCi0gICAgIGlzIHVzZWQgaW5zdGVhZC4gICovCi0gIHsgImRlZiIsCWVjb2ZmX2RpcmVjdGl2ZV9kZWYsCTAgfSwKLSAgeyAiZGltIiwJZWNvZmZfZGlyZWN0aXZlX2RpbSwJMCB9LAotICB7ICJlbmRlZiIsCWVjb2ZmX2RpcmVjdGl2ZV9lbmRlZiwJMCB9LAotICB7ICJmaWxlIiwJZWNvZmZfZGlyZWN0aXZlX2ZpbGUsCTAgfSwKLSAgeyAic2NsIiwJZWNvZmZfZGlyZWN0aXZlX3NjbCwJMCB9LAotICB7ICJ0YWciLAllY29mZl9kaXJlY3RpdmVfdGFnLAkwIH0sCi0gIHsgInZhbCIsCWVjb2ZmX2RpcmVjdGl2ZV92YWwsCTAgfSwKLQotICAvKiBDT0ZGIGRlYnVnZ2luZyByZXF1aXJlcyBwc2V1ZG8tb3BzIC5zaXplIGFuZCAudHlwZSwgYnV0IEVMRgotICAgICBhbHJlYWR5IGhhcyBtZWFuaW5ncyBmb3IgdGhvc2UuICBXZSB1c2UgLmVzaXplIGFuZCAuZXR5cGUKLSAgICAgaW5zdGVhZC4gIFRoZXNlIGFyZSBvbmx5IGdlbmVyYXRlZCBieSBnY2MgYW55aG93LiAgKi8KLSAgeyAiZXNpemUiLAllY29mZl9kaXJlY3RpdmVfc2l6ZSwJMCB9LAotICB7ICJldHlwZSIsCWVjb2ZmX2RpcmVjdGl2ZV90eXBlLAkwIH0sCi0KLSAgLyogRUNPRkYgc3BlY2lmaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgeyAiYmVnaW4iLAllY29mZl9kaXJlY3RpdmVfYmVnaW4sCTAgfSwKLSAgeyAiYmVuZCIsCWVjb2ZmX2RpcmVjdGl2ZV9iZW5kLAkwIH0sCi0gIHsgImVuZCIsCWVjb2ZmX2RpcmVjdGl2ZV9lbmQsCTAgfSwKLSAgeyAiZW50IiwJZWNvZmZfZGlyZWN0aXZlX2VudCwJMCB9LAotICB7ICJmbWFzayIsCWVjb2ZmX2RpcmVjdGl2ZV9mbWFzaywJMCB9LAotICB7ICJmcmFtZSIsCWVjb2ZmX2RpcmVjdGl2ZV9mcmFtZSwJMCB9LAotICB7ICJsb2MiLAllY29mZl9kaXJlY3RpdmVfbG9jLAkwIH0sCi0gIHsgIm1hc2siLAllY29mZl9kaXJlY3RpdmVfbWFzaywJMCB9LAotCi0gIC8qIE90aGVyIEVDT0ZGIGRpcmVjdGl2ZXMuICAqLwotICB7ICJleHRlcm4iLAllY29mZl9kaXJlY3RpdmVfZXh0ZXJuLAkwIH0sCi0KLSAgLyogVGhlc2UgYXJlIHVzZWQgb24gSXJpeC4gIEkgZG9uJ3Qga25vdyBob3cgdG8gaW1wbGVtZW50IHRoZW0uICAqLwotICB7ICJhbGlhcyIsCXNfaWdub3JlLAkJMCB9LAotICB7ICJiZ25iIiwJc19pZ25vcmUsCQkwIH0sCi0gIHsgImVuZGIiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAibGFiIiwJc19pZ25vcmUsCQkwIH0sCi0gIHsgIm5vYWxpYXMiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAidmVyc3RhbXAiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAidnJlZyIsCXNfaWdub3JlLAkJMCB9LAotI2VuZGlmCi0KLSAge05VTEx9CQkJLyogZW5kIHNlbnRpbmVsICovCi19OwotCi0jdW5kZWYgTk9fUkVMT0MKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgc3RhcnRzLiAgKi8KLQotdm9pZAotZWxmX2JlZ2luICgpCi17Ci0gIC8qIEFkZCBzeW1ib2xzIGZvciB0aGUga25vd24gc2VjdGlvbnMgdG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHNlY3Rpb25fc3ltYm9sIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rkb3V0cHV0LAotCQkJCQkJCQlURVhUX1NFQ1RJT05fTkFNRSkpKTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc2VjdGlvbl9zeW1ib2wgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsCi0JCQkJCQkJCURBVEFfU0VDVElPTl9OQU1FKSkpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzZWN0aW9uX3N5bWJvbCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0ZG91dHB1dCwKLQkJCQkJCQkJQlNTX1NFQ1RJT05fTkFNRSkpKTsKLX0KLQotdm9pZAotZWxmX3BvcF9pbnNlcnQgKCkKLXsKLSAgcG9wX2luc2VydCAoZWxmX3BzZXVkb190YWJsZSk7Ci0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgcG9wX2luc2VydCAoZWNvZmZfZGVidWdfcHNldWRvX3RhYmxlKTsKLX0KLQotc3RhdGljIGJmZF92bWEKLWVsZl9zX2dldF9zaXplIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgcmV0dXJuIFNfR0VUX1NJWkUgKHN5bSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfc19zZXRfc2l6ZSAoc3ltLCBzeikKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBiZmRfdm1hIHN6OwotewotICBTX1NFVF9TSVpFIChzeW0sIHN6KTsKLX0KLQotc3RhdGljIGJmZF92bWEKLWVsZl9zX2dldF9hbGlnbiAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHJldHVybiBTX0dFVF9BTElHTiAoc3ltKTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9zX3NldF9hbGlnbiAoc3ltLCBhbGlnbikKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBiZmRfdm1hIGFsaWduOwotewotICBTX1NFVF9BTElHTiAoc3ltLCBhbGlnbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfY29weV9zeW1ib2xfYXR0cmlidXRlcyAoZGVzdCwgc3JjKQotICAgICBzeW1ib2xTICpkZXN0LCAqc3JjOwotewotICBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyAoZGVzdCwgc3JjKTsKLX0KLQotc3RhdGljIGludAotZWxmX3NlY19zeW1fb2tfZm9yX3JlbG9jIChzZWMpCi0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJldHVybiBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MgKHNlYyk7Ci19Ci0KLXZvaWQKLWVsZl9maWxlX3N5bWJvbCAocykKLSAgICAgY2hhciAqczsKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIHN5bSA9IHN5bWJvbF9uZXcgKHMsIGFic29sdXRlX3NlY3Rpb24sICh2YWx1ZVQpIDAsIChzdHJ1Y3QgZnJhZyAqKSAwKTsKLSAgc3ltLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOwotICBzeW0tPmJzeW0tPmZsYWdzIHw9IEJTRl9GSUxFOwotCi0gIGlmIChzeW1ib2xfcm9vdFAgIT0gc3ltKQotICAgIHsKLSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bSwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfaW5zZXJ0IChzeW0sIHN5bWJvbF9yb290UCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0jaWZkZWYgREVCVUcKLSAgICAgIHZlcmlmeV9zeW1ib2xfY2hhaW4gKHN5bWJvbF9yb290UCwgc3ltYm9sX2xhc3RQKTsKLSNlbmRpZgotICAgIH0KLQotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSAgZWNvZmZfbmV3X2ZpbGUgKHMpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX2NvbW1vbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIGludCB0ZW1wLCBzaXplOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBpbnQgaGF2ZV9hbGlnbjsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7CQkvKiBza2lwICcsJyAqLwotICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLkNPTU1vbiBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIiksIHRlbXApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHNpemUgPSB0ZW1wOwotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9IDApCi0gICAgewotICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSBzaXplKQotCXsKLQkgIGFzX3dhcm4gKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVkLiIpLAotCQkgICBTX0dFVF9OQU1FIChzeW1ib2xQKSwgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwgc2l6ZSk7Ci0JfQotICAgIH0KLSAga25vdyAoc3ltYm9sUC0+c3lfZnJhZyA9PSAmemVyb19hZGRyZXNzX2ZyYWcpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgaGF2ZV9hbGlnbiA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoYXZlX2FsaWduID0gMTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLSAgaWYgKCEgaGF2ZV9hbGlnbiB8fCAqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLSAgICB7Ci0gICAgICBpZiAoISBoYXZlX2FsaWduKQotCXRlbXAgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIGlmICh0ZW1wIDwgMCkKLQkgICAgewotCSAgICAgIHRlbXAgPSAwOwotCSAgICAgIGFzX3dhcm4gKF8oIkNvbW1vbiBhbGlnbm1lbnQgbmVnYXRpdmU7IDAgYXNzdW1lZCIpKTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzeW1ib2xQLT5sb2NhbCkKLQl7Ci0JICBzZWdUIG9sZF9zZWM7Ci0JICBpbnQgb2xkX3N1YnNlYzsKLQkgIGNoYXIgKnBmcmFnOwotCSAgaW50IGFsaWduOwotCi0JLyogYWxsb2NhdGVfYnNzOiAqLwotCSAgb2xkX3NlYyA9IG5vd19zZWc7Ci0JICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKLQkgIGlmICh0ZW1wKQotCSAgICB7Ci0JICAgICAgLyogY29udmVydCB0byBhIHBvd2VyIG9mIDIgYWxpZ25tZW50ICovCi0JICAgICAgZm9yIChhbGlnbiA9IDA7ICh0ZW1wICYgMSkgPT0gMDsgdGVtcCA+Pj0gMSwgKythbGlnbik7Ci0JICAgICAgaWYgKHRlbXAgIT0gMSkKLQkJewotCQkgIGFzX2JhZCAoXygiQ29tbW9uIGFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIikpOwotCQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgYWxpZ24gPSAwOwotCSAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIGFsaWduKTsKLQkgIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAwKTsKLQkgIGlmIChhbGlnbikKLQkgICAgZnJhZ19hbGlnbiAoYWxpZ24sIDAsIDApOwotCSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWN0aW9uKQotCSAgICBzeW1ib2xQLT5zeV9mcmFnLT5mcl9zeW1ib2wgPSAwOwotCSAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWdfbm93OwotCSAgcGZyYWcgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBzeW1ib2xQLAotCQkJICAgIChvZmZzZXRUKSBzaXplLCAoY2hhciAqKSAwKTsKLQkgICpwZnJhZyA9IDA7Ci0JICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLQkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJzc19zZWN0aW9uKTsKLQkgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgc3Vic2VnX3NldCAob2xkX3NlYywgb2xkX3N1YnNlYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQlhbGxvY2F0ZV9jb21tb246Ci0JICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgc2l6ZSk7Ci0JICBTX1NFVF9BTElHTiAoc3ltYm9sUCwgdGVtcCk7Ci0JICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBiZmRfY29tX3NlY3Rpb25fcHRyKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAvKiBAQCBTb21lIHVzZSB0aGUgZG90LCBzb21lIGRvbid0LiAgQ2FuIHdlIGdldCBzb21lIGNvbnNpc3RlbmN5Pz8gICovCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLicpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAvKiBAQCBTb21lIHNheSBkYXRhLCBzb21lIHNheSBic3MuICAqLwotICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImJzc1wiIiwgNCkKLQkgICYmIHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImRhdGFcIiIsIDUpKQotCXsKLQkgIHdoaWxlICgqLS1pbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotCSAgICA7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQkgIGdvdG8gYmFkX2NvbW1vbl9zZWdtZW50OwotCX0KLSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJyInKQotCTsKLSAgICAgIGdvdG8gYWxsb2NhdGVfY29tbW9uOwotICAgIH0KLQotICBzeW1ib2xQLT5ic3ltLT5mbGFncyB8PSBCU0ZfT0JKRUNUOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHJldHVybjsKLQotICB7Ci0gIGJhZF9jb21tb25fc2VnbWVudDoKLSAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnXG4nKQotICAgICAgcCsrOwotICAgIGMgPSAqcDsKLSAgICAqcCA9ICdcMCc7Ci0gICAgYXNfYmFkIChfKCJiYWQgLmNvbW1vbiBzZWdtZW50ICVzIiksIGlucHV0X2xpbmVfcG9pbnRlciArIDEpOwotICAgICpwID0gYzsKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX2xvY2FsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIGRvCi0gICAgewotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0gICAgICBzeW1ib2xQLT5sb2NhbCA9IDE7Ci0gICAgICBpZiAoYyA9PSAnLCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCSAgICBjID0gJ1xuJzsKLQl9Ci0gICAgfQotICB3aGlsZSAoYyA9PSAnLCcpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2VsZl93ZWFrIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIGRvCi0gICAgewotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgU19TRVRfV0VBSyAoc3ltYm9sUCk7Ci0gICAgICBzeW1ib2xQLT5sb2NhbCA9IDE7Ci0gICAgICBpZiAoYyA9PSAnLCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCSAgICBjID0gJ1xuJzsKLQl9Ci0gICAgfQotICB3aGlsZSAoYyA9PSAnLCcpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgc2VnVCBwcmV2aW91c19zZWN0aW9uOwotc3RhdGljIGludCBwcmV2aW91c19zdWJzZWN0aW9uOwotCi0vKiBIYW5kbGUgdGhlIC5zZWN0aW9uIHBzZXVkby1vcC4gIFRoaXMgY29kZSBzdXBwb3J0cyB0d28gZGlmZmVyZW50Ci0gICBzeW50YXhlcy4KLQotICAgVGhlIGZpcnN0IGlzIGZvdW5kIG9uIFNvbGFyaXMsIGFuZCBsb29rcyBsaWtlCi0gICAgICAgLnNlY3Rpb24gIi5zZWMxIiwjYWxsb2MsI2V4ZWNpbnN0ciwjd3JpdGUKLSAgIEhlcmUgdGhlIG5hbWVzIGFmdGVyICcjJyBhcmUgdGhlIFNIRl8qIGZsYWdzIHRvIHR1cm4gb24gZm9yIHRoZQotICAgc2VjdGlvbi4gIEknbSBub3Qgc3VyZSBob3cgaXQgZGV0ZXJtaW5lcyB0aGUgU0hUXyogdHlwZSAoQkZECi0gICBkb2Vzbid0IHJlYWxseSBnaXZlIHVzIGNvbnRyb2wgb3ZlciB0aGUgdHlwZSwgYW55aG93KS4KLQotICAgVGhlIHNlY29uZCBmb3JtYXQgaXMgZm91bmQgb24gVW5peFdhcmUsIGFuZCBwcm9iYWJseSBtb3N0IFNWUjQKLSAgIG1hY2hpbmVzLCBhbmQgbG9va3MgbGlrZQotICAgICAgIC5zZWN0aW9uIC5zZWMxLCJhIixAcHJvZ2JpdHMKLSAgIFRoZSBxdW90ZWQgc3RyaW5nIG1heSBjb250YWluIGFueSBjb21iaW5hdGlvbiBvZiBhLCB3LCB4LCBhbmQKLSAgIHJlcHJlc2VudHMgdGhlIFNIRl8qIGZsYWdzIHRvIHR1cm4gb24gZm9yIHRoZSBzZWN0aW9uLiAgVGhlIHN0cmluZwotICAgYmVnaW5uaW5nIHdpdGggJ0AnIGNhbiBiZSBwcm9nYml0cyBvciBub2JpdHMuICBUaGVyZSBzaG91bGQgYmUKLSAgIG90aGVyIHBvc3NpYmlsaXRpZXMsIGJ1dCBJIGRvbid0IGtub3cgd2hhdCB0aGV5IGFyZS4gIEluIGFueSBjYXNlLAotICAgQkZEIGRvZXNuJ3QgcmVhbGx5IGxldCB1cyBzZXQgdGhlIHNlY3Rpb24gdHlwZS4gICovCi0KLS8qIENlcnRhaW4gbmFtZWQgc2VjdGlvbnMgaGF2ZSBwYXJ0aWN1bGFyIGRlZmluZWQgdHlwZXMsIGxpc3RlZCBvbiBwLgotICAgNC0xOSBvZiB0aGUgQUJJLiAgKi8KLXN0cnVjdCBzcGVjaWFsX3NlY3Rpb24KLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgaW50IHR5cGU7Ci0gIGludCBhdHRyaWJ1dGVzOwotfTsKLQotc3RhdGljIHN0cnVjdCBzcGVjaWFsX3NlY3Rpb24gc3BlY2lhbF9zZWN0aW9uc1tdID0KLXsKLSAgeyAiLmJzcyIsCVNIVF9OT0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURQkJfSwKLSAgeyAiLmNvbW1lbnQiLAlTSFRfUFJPR0JJVFMsCTAJCQkJfSwKLSAgeyAiLmRhdGEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURQkJfSwKLSAgeyAiLmRhdGExIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUJCX0sCi0gIHsgIi5kZWJ1ZyIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAotICB7ICIuZmluaSIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAotICB7ICIuaW5pdCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAotICB7ICIubGluZSIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAotICB7ICIubm90ZSIsCVNIVF9OT1RFLAkwCQkJCX0sCi0gIHsgIi5yb2RhdGEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQwkJCX0sCi0gIHsgIi5yb2RhdGExIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MJCQl9LAotICB7ICIudGV4dCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAotCi0jaWZkZWYgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMKLSAgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMKLSNlbmRpZgotCi0jaWYgMAotICAvKiBUaGUgZm9sbG93aW5nIHNlY3Rpb24gbmFtZXMgYXJlIHNwZWNpYWwsIGJ1dCB0aGV5IGNhbiBub3QKLSAgICAgcmVhc29uYWJseSBhcHBlYXIgaW4gYXNzZW1ibGVyIGNvZGUuICBTb21lIG9mIHRoZSBhdHRyaWJ1dGVzIGFyZQotICAgICBwcm9jZXNzb3IgZGVwZW5kZW50LiAgKi8KLSAgeyAiLmR5bmFtaWMiLAlTSFRfRFlOQU1JQywJU0hGX0FMTE9DIC8qICsgU0hGX1dSSVRFICovIAl9LAotICB7ICIuZHluc3RyIiwJU0hUX1NUUlRBQiwJU0hGX0FMTE9DCQkJfSwKLSAgeyAiLmR5bnN5bSIsCVNIVF9EWU5TWU0sCVNIRl9BTExPQwkJCX0sCi0gIHsgIi5nb3QiLAlTSFRfUFJPR0JJVFMsCTAJCQkJfSwKLSAgeyAiLmhhc2giLAlTSFRfSEFTSCwJU0hGX0FMTE9DCQkJfSwKLSAgeyAiLmludGVycCIsCVNIVF9QUk9HQklUUywJLyogU0hGX0FMTE9DICovCQkJfSwKLSAgeyAiLnBsdCIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAotICB7ICIuc2hzdHJ0YWIiLFNIVF9TVFJUQUIsCTAJCQkJfSwKLSAgeyAiLnN0cnRhYiIsCVNIVF9TVFJUQUIsCS8qIFNIRl9BTExPQyAqLwkJCX0sCi0gIHsgIi5zeW10YWIiLAlTSFRfU1lNVEFCLAkvKiBTSEZfQUxMT0MgKi8JCQl9LAotI2VuZGlmCi0KLSAgeyBOVUxMLAkwLAkJMAkJCQl9Ci19OwotCi12b2lkCi1vYmpfZWxmX3NlY3Rpb24gKHh4eCkKLSAgICAgaW50IHh4eDsKLXsKLSAgY2hhciAqc3RyaW5nOwotICBpbnQgbmV3X3NlYzsKLSAgc2VnVCBzZWM7Ci0gIGludCB0eXBlLCBhdHRyOwotICBpbnQgaTsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHN5bWJvbFMgKnNlY3N5bTsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIGNoYXIgbXJpX3R5cGU7Ci0KLSAgICAgIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOwotICAgICAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0KLSAgICAgIHNfbXJpX3NlY3QgKCZtcmlfdHlwZSk7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vawotICAgICAgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7Ci0jZW5kaWYKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBHZXQgbmFtZSBvZiBzZWN0aW9uLiAgKi8KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIicpCi0gICAgewotICAgICAgc3RyaW5nID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZ4eHgpOwotICAgICAgaWYgKHN0cmluZyA9PSBOVUxMKQotCXsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjaGFyIGM7Ci0gICAgICB3aGlsZSAoMCA9PSBzdHJjaHIgKCJcblx0LDsgIiwgKnApKQotCXArKzsKLSAgICAgIGlmIChwID09IGlucHV0X2xpbmVfcG9pbnRlcikKLQl7Ci0JICBhc193YXJuIChfKCJNaXNzaW5nIHNlY3Rpb24gbmFtZSIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgYyA9ICpwOwotICAgICAgKnAgPSAwOwotICAgICAgc3RyaW5nID0geG1hbGxvYyAoKHVuc2lnbmVkIGxvbmcpIChwIC0gaW5wdXRfbGluZV9wb2ludGVyICsgMSkpOwotICAgICAgc3RyY3B5IChzdHJpbmcsIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotICAgIH0KLQotICAvKiBTd2l0Y2ggdG8gdGhlIHNlY3Rpb24sIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeS4gICovCi0gIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOwotICBwcmV2aW91c19zdWJzZWN0aW9uID0gbm93X3N1YnNlZzsKLQotICBuZXdfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0ZG91dHB1dCwgc3RyaW5nKSA9PSBOVUxMOwotICBzZWMgPSBzdWJzZWdfbmV3IChzdHJpbmcsIDApOwotCi0gIC8qIElmIHRoaXMgc2VjdGlvbiBhbHJlYWR5IGV4aXN0ZWQsIHdlIGRvbid0IGJvdGhlciB0byBjaGFuZ2UgdGhlCi0gICAgIGZsYWcgdmFsdWVzLiAgKi8KLSAgaWYgKCEgbmV3X3NlYykKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gICAgICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKLSNlbmRpZgotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICB0eXBlID0gU0hUX05VTEw7Ci0gIGF0dHIgPSAwOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICAvKiBTa2lwIHRoZSBjb21tYS4gICovCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIicpCi0JewotCSAgLyogUGljayB1cCBhIHN0cmluZyB3aXRoIGEgY29tYmluYXRpb24gb2YgYSwgdywgeC4gICovCi0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLQkgICAgewotCSAgICAgIHN3aXRjaCAoKmlucHV0X2xpbmVfcG9pbnRlcikKLQkJewotCQljYXNlICdhJzoKLQkJICBhdHRyIHw9IFNIRl9BTExPQzsKLQkJICBicmVhazsKLQkJY2FzZSAndyc6Ci0JCSAgYXR0ciB8PSBTSEZfV1JJVEU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3gnOgotCQkgIGF0dHIgfD0gU0hGX0VYRUNJTlNUUjsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICB7Ci0JCSAgICBjaGFyICpiYWRfbXNnID0gXygiQmFkIC5zZWN0aW9uIGRpcmVjdGl2ZTogd2FudCBhLHcseCBpbiBzdHJpbmciKTsKLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9sZXR0ZXIKLQkJICAgIGludCBtZF9hdHRyID0gbWRfZWxmX3NlY3Rpb25fbGV0dGVyICgqaW5wdXRfbGluZV9wb2ludGVyLCAmYmFkX21zZyk7Ci0JCSAgICBpZiAobWRfYXR0cikKLQkJICAgICAgYXR0ciB8PSBtZF9hdHRyOwotCQkgICAgZWxzZQotI2VuZGlmCi0JCSAgICAgIHsKLQkJCWFzX3dhcm4gKGJhZF9tc2cpOwotCQkJaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkJCXJldHVybjsKLQkJICAgICAgfQotCQkgIH0KLQkJfQotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICB9Ci0KLQkgIC8qIFNraXAgdGhlIGNsb3NpbmcgcXVvdGUuICAqLwotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQkgICAgewotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnQCcgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJScpCi0JCXsKLQkJICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkJICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAicHJvZ2JpdHMiLAotCQkJICAgICAgIHNpemVvZiAicHJvZ2JpdHMiIC0gMSkgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdHlwZSA9IFNIVF9QUk9HQklUUzsKLQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IHNpemVvZiAicHJvZ2JpdHMiIC0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJub2JpdHMiLAotCQkJCSAgICBzaXplb2YgIm5vYml0cyIgLSAxKSA9PSAwKQotCQkgICAgewotCQkgICAgICB0eXBlID0gU0hUX05PQklUUzsKLQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IHNpemVvZiAibm9iaXRzIiAtIDE7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX3R5cGUKLQkJICAgIGludCBtZF90eXBlID0gbWRfZWxmX3NlY3Rpb25fdHlwZSAoJmlucHV0X2xpbmVfcG9pbnRlcik7Ci0JCSAgICBpZiAobWRfdHlwZSkKLQkJICAgICAgdHlwZSA9IG1kX3R5cGU7Ci0JCSAgICBlbHNlCi0jZW5kaWYKLQkJICAgICAgewotCQkJYXNfd2FybiAoXygiVW5yZWNvZ25pemVkIHNlY3Rpb24gdHlwZSIpKTsKLQkJCWlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JCSAgICAgIH0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyMnKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiQmFkIC5zZWN0aW9uIGRpcmVjdGl2ZSAtIGNoYXJhY3RlciBmb2xsb3dpbmcgbmFtZSBpcyBub3QgJyMnIikpOwotCQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIndyaXRlIiwKLQkJCSAgIHNpemVvZiAid3JpdGUiIC0gMSkgPT0gMCkKLQkJewotCQkgIGF0dHIgfD0gU0hGX1dSSVRFOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSBzaXplb2YgIndyaXRlIiAtIDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJhbGxvYyIsCi0JCQkJc2l6ZW9mICJhbGxvYyIgLSAxKSA9PSAwKQotCQl7Ci0JCSAgYXR0ciB8PSBTSEZfQUxMT0M7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IHNpemVvZiAiYWxsb2MiIC0gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImV4ZWNpbnN0ciIsCi0JCQkJc2l6ZW9mICJleGVjaW5zdHIiIC0gMSkgPT0gMCkKLQkJewotCQkgIGF0dHIgfD0gU0hGX0VYRUNJTlNUUjsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gc2l6ZW9mICJleGVjaW5zdHIiIC0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX3dvcmQKLQkJICBpbnQgbWRfYXR0ciA9IG1kX2VsZl9zZWN0aW9uX3dvcmQgKCZpbnB1dF9saW5lX3BvaW50ZXIpOwotCQkgIGlmIChtZF9hdHRyKQotCQkgICAgYXR0ciB8PSBtZF9hdHRyOwotCQkgIGVsc2UKLSNlbmRpZgotCQkgICAgewotCQkgICAgICBhc193YXJuIChfKCJVbnJlY29nbml6ZWQgc2VjdGlvbiBhdHRyaWJ1dGUiKSk7Ci0JCSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JCSAgICAgIHJldHVybjsKLQkJICAgIH0KLQkJfQotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgfQotCSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCSAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgIH0KLQotICAvKiBTZWUgaWYgdGhpcyBpcyBvbmUgb2YgdGhlIHNwZWNpYWwgc2VjdGlvbnMuICAqLwotICBmb3IgKGkgPSAwOyBzcGVjaWFsX3NlY3Rpb25zW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJpbmdbMV0gPT0gc3BlY2lhbF9zZWN0aW9uc1tpXS5uYW1lWzFdCi0JICAmJiBzdHJjbXAgKHN0cmluZywgc3BlY2lhbF9zZWN0aW9uc1tpXS5uYW1lKSA9PSAwKQotCXsKLQkgIGlmICh0eXBlID09IFNIVF9OVUxMKQotCSAgICB0eXBlID0gc3BlY2lhbF9zZWN0aW9uc1tpXS50eXBlOwotCSAgZWxzZSBpZiAodHlwZSAhPSBzcGVjaWFsX3NlY3Rpb25zW2ldLnR5cGUpCi0JICAgIGFzX3dhcm4gKF8oIlNldHRpbmcgaW5jb3JyZWN0IHNlY3Rpb24gdHlwZSBmb3IgJXMiKSwgc3RyaW5nKTsKLQotCSAgaWYgKChhdHRyICZ+IHNwZWNpYWxfc2VjdGlvbnNbaV0uYXR0cmlidXRlcykgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIEFzIGEgR05VIGV4dGVuc2lvbiwgd2UgcGVybWl0IGEgLm5vdGUgc2VjdGlvbiB0byBiZQotICAgICAgICAgICAgICAgICBhbGxvY2F0YWJsZS4gIElmIHRoZSBsaW5rZXIgc2VlcyBhbiBhbGxvY2F0ZWFibGUKLSAgICAgICAgICAgICAgICAgLm5vdGUgc2VjdGlvbiwgaXQgd2lsbCBjcmVhdGUgYSBQVF9OT1RFIHNlZ21lbnQgaW4KLSAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBpZiAoc3RyY21wIChzdHJpbmcsICIubm90ZSIpICE9IDAKLQkJICB8fCBhdHRyICE9IFNIRl9BTExPQykKLQkJYXNfd2FybiAoXygiU2V0dGluZyBpbmNvcnJlY3Qgc2VjdGlvbiBhdHRyaWJ1dGVzIGZvciAlcyIpLAotCQkJIHN0cmluZyk7Ci0JICAgIH0KLQkgIGF0dHIgfD0gc3BlY2lhbF9zZWN0aW9uc1tpXS5hdHRyaWJ1dGVzOwotCi0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGZsYWdzID0gKFNFQ19SRUxPQwotCSAgIHwgKChhdHRyICYgU0hGX1dSSVRFKSA/IDAgOiBTRUNfUkVBRE9OTFkpCi0JICAgfCAoKGF0dHIgJiBTSEZfQUxMT0MpID8gU0VDX0FMTE9DIDogMCkKLQkgICB8ICgoKGF0dHIgJiBTSEZfQUxMT0MpICYmIHR5cGUgIT0gU0hUX05PQklUUykgPyBTRUNfTE9BRCA6IDApCi0JICAgfCAoKGF0dHIgJiBTSEZfRVhFQ0lOU1RSKSA/IFNFQ19DT0RFIDogMCkpOwotICBpZiAoc3BlY2lhbF9zZWN0aW9uc1tpXS5uYW1lID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKHR5cGUgPT0gU0hUX1BST0dCSVRTKQotCWZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotICAgICAgZWxzZSBpZiAodHlwZSA9PSBTSFRfTk9CSVRTKQotCXsKLQkgIGZsYWdzIHw9IFNFQ19BTExPQzsKLQkgIGZsYWdzICY9fiBTRUNfTE9BRDsKLQl9Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9mbGFncwotICAgICAgZmxhZ3MgPSBtZF9lbGZfc2VjdGlvbl9mbGFncyAoZmxhZ3MsIGF0dHIsIHR5cGUpOwotI2VuZGlmCi0gICAgfQotCi0gIC8qIFByZXZlbnQgU0VDX0hBU19DT05URU5UUyBmcm9tIGJlaW5nIGluYWR2ZXJ0ZW50bHkgc2V0LiAgKi8KLSAgaWYgKHR5cGUgPT0gU0hUX05PQklUUykKLSAgICBzZWdfaW5mbyAoc2VjKS0+YnNzID0gMTsKLQotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLCBmbGFncyk7Ci0KLSAgLyogQWRkIGEgc3ltYm9sIGZvciB0aGlzIHNlY3Rpb24gdG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIHNlY3N5bSA9IHN5bWJvbF9maW5kIChzdHJpbmcpOwotICBpZiAoc2Vjc3ltICE9IE5VTEwpCi0gICAgc2Vjc3ltLT5ic3ltID0gc2VjLT5zeW1ib2w7Ci0gIGVsc2UKLSAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzZWN0aW9uX3N5bWJvbCAoc2VjKSk7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vawotICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKLSNlbmRpZgotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIENoYW5nZSB0byB0aGUgLmRhdGEgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX2RhdGEgKGkpCi0gICAgIGludCBpOwotewotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgcHJldmlvdXNfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIHByZXZpb3VzX3N1YnNlY3Rpb24gPSBub3dfc3Vic2VnOwotICBzX2RhdGEgKGkpOwotCi0jaWZkZWYgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sKLSAgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7Ci0jZW5kaWYKLX0KLQotLyogQ2hhbmdlIHRvIHRoZSAudGV4dCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfdGV4dCAoaSkKLSAgICAgaW50IGk7Ci17Ci0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0gIHNfdGV4dCAoaSk7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vawotICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotb2JqX2VsZl9zdWJzZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzdWJzZWdfc2V0IChub3dfc2VnLCAoc3Vic2VnVCkgdGVtcCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vawotICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKLSNlbmRpZgotfQotCi0vKiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgcHJvY2Vzc29yIGJhY2tlbmRzIGlmIHRoZXkgY2hhbmdlCi0gICBzZWN0aW9ucy4gICovCi0KLXZvaWQKLW9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKQotewotICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci19Ci0KLXZvaWQKLW9ial9lbGZfcHJldmlvdXMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKHByZXZpb3VzX3NlY3Rpb24gPT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi5wcmV2aW91cyB3aXRob3V0IGNvcnJlc3BvbmRpbmcgLnNlY3Rpb247IGlnbm9yZWQiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBzdWJzZWdfc2V0IChwcmV2aW91c19zZWN0aW9uLCBwcmV2aW91c19zdWJzZWN0aW9uKTsKLSAgcHJldmlvdXNfc2VjdGlvbiA9IDA7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vawotICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotb2JqX2VsZl9saW5lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIEFzc3VtZSBkZWxpbWl0ZXIgaXMgcGFydCBvZiBleHByZXNzaW9uLiAgQlNENC4yIGFzIGZhaWxzIHdpdGgKLSAgICAgZGVsaWdodGZ1bCBidWcsIHNvIHdlIGFyZSBub3QgYmVpbmcgaW5jb21wYXRpYmxlIGhlcmUuICovCi0gIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIChpbnQpIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGlzIGhhbmRsZXMgdGhlIC5zeW12ZXIgcHNldWRvLW9wLCB3aGljaCBpcyB1c2VkIHRvIHNwZWNpZnkgYQotICAgc3ltYm9sIHZlcnNpb24uICBUaGUgc3ludGF4IGlzIGBgLnN5bXZlciBOQU1FLFNZTVZFUk5BTUUnJy4KLSAgIFNZTVZFUk5BTUUgbWF5IGNvbnRhaW4gRUxGX1ZFUl9DSFIgKCdAJykgY2hhcmFjdGVycy4gIFRoaXMKLSAgIHBzZXVkby1vcCBjYXVzZXMgdGhlIGFzc2VtYmxlciB0byBlbWl0IGEgc3ltYm9sIG5hbWVkIFNZTVZFUk5BTUUKLSAgIHdpdGggdGhlIHNhbWUgdmFsdWUgYXMgdGhlIHN5bWJvbCBOQU1FLiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfc3ltdmVyIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBpZiAoc3ltLT5zeV9vYmoudmVyc2lvbmVkX25hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm11bHRpcGxlIC5zeW12ZXIgZGlyZWN0aXZlcyBmb3Igc3ltYm9sIGAlcyciKSwKLQkgICAgICBTX0dFVF9OQU1FIChzeW0pKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBpbiAuc3ltdmVyIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIGlmIChjICE9IEVMRl9WRVJfQ0hSKQotCWJyZWFrOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlcisrID0gYzsKLSAgICB9Ci0KLSAgc3ltLT5zeV9vYmoudmVyc2lvbmVkX25hbWUgPSB4c3RyZHVwIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBpZiAoc3RyY2hyIChzeW0tPnN5X29iai52ZXJzaW9uZWRfbmFtZSwgRUxGX1ZFUl9DSFIpID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHZlcnNpb24gbmFtZSBpbiBgJXMnIGZvciBzeW1ib2wgYCVzJyIpLAotCSAgICAgIHN5bS0+c3lfb2JqLnZlcnNpb25lZF9uYW1lLCBTX0dFVF9OQU1FIChzeW0pKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoaXMgaGFuZGxlcyB0aGUgLnZ0YWJsZV9pbmhlcml0IHBzZXVkby1vcCwgd2hpY2ggaXMgdXNlZCB0byBpbmRpY2F0ZQotICAgdG8gdGhlIGxpbmtlciB0aGUgaGllcmFyY2h5IGluIHdoaWNoIGEgcGFydGljdWxhciB0YWJsZSByZXNpZGVzLiAgVGhlCi0gICBzeW50YXggaXMgIi52dGFibGVfaW5oZXJpdCBDSElMRE5BTUUsIFBBUkVOVE5BTUUiLiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfdnRhYmxlX2luaGVyaXQgKGlnbm9yZSkKLXsKLSAgY2hhciAqY25hbWUsICpwbmFtZTsKLSAgc3ltYm9sUyAqY3N5bSwgKnBzeW07Ci0gIGNoYXIgYywgYmFkID0gMDsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgY25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgY3N5bSA9IHN5bWJvbF9maW5kIChjbmFtZSk7Ci0KLSAgLyogR0NGSVhNRTogc2hvdWxkIGNoZWNrIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0d28gLnZ0YWJsZV9pbmhlcml0cyBmb3IKLSAgICAgdGhlIHNhbWUgY2hpbGQgc3ltYm9sLiAgQWxzbywgd2UgY2FuIGN1cnJlbnRseSBvbmx5IGRvIHRoaXMgaWYgdGhlCi0gICAgIGNoaWxkIHN5bWJvbCBpcyBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgcGxhY2VkIGluIGEgZnJhZ21lbnQuICAqLwotCi0gIGlmIChjc3ltID09IE5VTEwgfHwgY3N5bS0+c3lfZnJhZyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoImV4cGVjdGVkIGAlcycgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IGZvciAudnRhYmxlX2luaGVyaXQiLAotCSAgICAgIGNuYW1lKTsKLSAgICAgIGJhZCA9IDE7Ci0gICAgfQotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoImV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgaW4gLnZ0YWJsZV9pbmhlcml0Iik7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICcwJwotICAgICAgJiYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnXDAnCi0JICB8fCBpc3NwYWNlKGlucHV0X2xpbmVfcG9pbnRlclsxXSkpKQotICAgIHsKLSAgICAgIHBzeW0gPSBzZWN0aW9uX3N5bWJvbCAoYWJzb2x1dGVfc2VjdGlvbik7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChwbmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBpZiAoYmFkKQotICAgIHJldHVybjsKLQotICBhc3NlcnQgKGNzeW0tPnN5X3ZhbHVlLlhfb3AgPT0gT19jb25zdGFudCk7Ci0gIGZpeF9uZXcgKGNzeW0tPnN5X2ZyYWcsIGNzeW0tPnN5X3ZhbHVlLlhfYWRkX251bWJlciwgMCwgcHN5bSwgMCwgMCwKLQkgICBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQpOwotfQotICAKLS8qIFRoaXMgaGFuZGxlcyB0aGUgLnZ0YWJsZV9lbnRyeSBwc2V1ZG8tb3AsIHdoaWNoIGlzIHVzZWQgdG8gaW5kaWNhdGUKLSAgIHRvIHRoZSBsaW5rZXIgdGhhdCBhIHZ0YWJsZSBzbG90IHdhcyB1c2VkLiAgVGhlIHN5bnRheCBpcwotICAgIi52dGFibGVfZW50cnkgdGFibGVuYW1lLCBvZmZzZXQiLiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfdnRhYmxlX2VudHJ5IChpZ25vcmUpCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgb2Zmc2V0VCBvZmZzZXQ7Ci0gIGNoYXIgYzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkICgiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBpbiAudnRhYmxlX2VudHJ5Iik7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIG9mZnNldCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIGZpeF9uZXcgKGZyYWdfbm93LCBmcmFnX25vd19maXggKCksIDAsIHN5bSwgb2Zmc2V0LCAwLAotCSAgIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLW9ial9yZWFkX2JlZ2luX2hvb2sgKCkKLXsKLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgZWNvZmZfcmVhZF9iZWdpbl9ob29rICgpOwotI2VuZGlmCi19Ci0KLXZvaWQKLW9ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIHN5bWJvbFAtPnN5X29iai5zaXplID0gTlVMTDsKLSAgc3ltYm9sUC0+c3lfb2JqLnZlcnNpb25lZF9uYW1lID0gTlVMTDsKLQotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICBlY29mZl9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApOwotI2VuZGlmCi19Ci0KLXZvaWQKLW9ial9lbGZfdmVyc2lvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgYzsKLSAgY2hhciBjaDsKLSAgY2hhciAqcDsKLSAgYXNlY3Rpb24gKnNlZyA9IG5vd19zZWc7Ci0gIHN1YnNlZ1Qgc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgRWxmX0ludGVybmFsX05vdGUgaV9ub3RlOwotICBFbGZfRXh0ZXJuYWxfTm90ZSBlX25vdGU7Ci0gIGFzZWN0aW9uICpub3RlX3NlY3AgPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgaW50IGksIGxlbjsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CS8qIC0+IDFzdCBjaGFyIG9mIHN0cmluZy4gKi8KLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgIHdoaWxlIChpc19hX2NoYXIgKGMgPSBuZXh0X2NoYXJfb2Zfc3RyaW5nICgpKSkKLQk7Ci0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOwotICAgICAgKihpbnB1dF9saW5lX3BvaW50ZXIgLSAxKSA9ICdcMCc7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICAgICAgLyogY3JlYXRlIHRoZSAubm90ZSBzZWN0aW9uICovCi0KLSAgICAgIG5vdGVfc2VjcCA9IHN1YnNlZ19uZXcgKCIubm90ZSIsIDApOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsCi0JCQkgICAgIG5vdGVfc2VjcCwKLQkJCSAgICAgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWSk7Ci0KLSAgICAgIC8qIHByb2Nlc3MgdGhlIHZlcnNpb24gc3RyaW5nICovCi0KLSAgICAgIGxlbiA9IHN0cmxlbiAobmFtZSk7Ci0KLSAgICAgIGlfbm90ZS5uYW1lc3ogPSAoKGxlbiArIDEpICsgMykgJiB+MzsgLyogcm91bmQgdGhpcyB0byB3b3JkIGJvdW5kYXJ5ICovCi0gICAgICBpX25vdGUuZGVzY3N6ID0gMDsJLyogbm8gZGVzY3JpcHRpb24gKi8KLSAgICAgIGlfbm90ZS50eXBlID0gTlRfVkVSU0lPTjsKLSAgICAgIHAgPSBmcmFnX21vcmUgKHNpemVvZiAoZV9ub3RlLm5hbWVzeikpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpX25vdGUubmFtZXN6LCA0KTsKLSAgICAgIHAgPSBmcmFnX21vcmUgKHNpemVvZiAoZV9ub3RlLmRlc2NzeikpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpX25vdGUuZGVzY3N6LCA0KTsKLSAgICAgIHAgPSBmcmFnX21vcmUgKHNpemVvZiAoZV9ub3RlLnR5cGUpKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaV9ub3RlLnR5cGUsIDQpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JewotCSAgY2ggPSAqKG5hbWUgKyBpKTsKLQkgIHsKLQkgICAgRlJBR19BUFBFTkRfMV9DSEFSIChjaCk7Ci0JICB9Ci0JfQotICAgICAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7Ci0KLSAgICAgIHN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIHF1b3RlZCBzdHJpbmciKSk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2VsZl9zaXplIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBjaGFyICpwOwotICBleHByZXNzaW9uUyBleHA7Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgICpwID0gMDsKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBgJXMnIGluIC5zaXplIGRpcmVjdGl2ZSIpLCBuYW1lKTsKLSAgICAgICpwID0gYzsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCA9PSBPX2Fic2VudCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgZXhwcmVzc2lvbiBpbiAuc2l6ZSBkaXJlY3RpdmUiKSk7Ci0gICAgICBleHAuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLSAgICB9Ci0gICpwID0gMDsKLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLSAgaWYgKGV4cC5YX29wID09IE9fY29uc3RhbnQpCi0gICAgU19TRVRfU0laRSAoc3ltLCBleHAuWF9hZGRfbnVtYmVyKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bS0+c3lfb2JqLnNpemUgPSAoZXhwcmVzc2lvblMgKikgeG1hbGxvYyAoc2l6ZW9mIChleHByZXNzaW9uUykpOwotICAgICAgKnN5bS0+c3lfb2JqLnNpemUgPSBleHA7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIEVMRiAudHlwZSBwc2V1ZG8tb3AuICBUaGlzIHNldHMgdGhlIHR5cGUgb2YgYSBzeW1ib2wuCi0gICBUaGVyZSBhcmUgZm91ciBzeW50YXhlczoKLSAgIAotICAgVGhlIGZpcnN0ICh1c2VkIG9uIFNvbGFyaXMpIGlzCi0gICAgICAgLnR5cGUgU1lNLCNmdW5jdGlvbgotICAgVGhlIHNlY29uZCAodXNlZCBvbiBVbml4V2FyZSkgaXMKLSAgICAgICAudHlwZSBTWU0sQGZ1bmN0aW9uCi0gICBUaGUgdGhpcmQgKHJlcG9ydGVkbHkgdG8gYmUgdXNlZCBvbiBJcml4IDYuMCkgaXMKLSAgICAgICAudHlwZSBTWU0gU1RUX0ZVTkMKLSAgIFRoZSBmb3VydGggKHVzZWQgb24gTmV0QlNEL0FybSBhbmQgTGludXgvQVJNKSBpcwotICAgICAgIC50eXBlIFNZTSwlZnVuY3Rpb24KLSAgICovCi0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX3R5cGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBpbnQgdHlwZTsKLSAgY29uc3QgY2hhciAqdHlwZW5hbWU7Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICggICAqaW5wdXRfbGluZV9wb2ludGVyID09ICcjJwotICAgICAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnQCcKLSAgICAgIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyUnKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHR5cGVuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgdHlwZSA9IDA7Ci0gIGlmIChzdHJjbXAgKHR5cGVuYW1lLCAiZnVuY3Rpb24iKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKHR5cGVuYW1lLCAiU1RUX0ZVTkMiKSA9PSAwKQotICAgIHR5cGUgPSBCU0ZfRlVOQ1RJT047Ci0gIGVsc2UgaWYgKHN0cmNtcCAodHlwZW5hbWUsICJvYmplY3QiKSA9PSAwCi0JICAgfHwgc3RyY21wICh0eXBlbmFtZSwgIlNUVF9PQkpFQ1QiKSA9PSAwKQotICAgIHR5cGUgPSBCU0ZfT0JKRUNUOwotICBlbHNlCi0gICAgYXNfYmFkIChfKCJpZ25vcmluZyB1bnJlY29nbml6ZWQgc3ltYm9sIHR5cGUgXCIlc1wiIiksIHR5cGVuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBzeW0tPmJzeW0tPmZsYWdzIHw9IHR5cGU7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfaWRlbnQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3RhdGljIHNlZ1QgY29tbWVudF9zZWN0aW9uOwotICBzZWdUIG9sZF9zZWN0aW9uID0gbm93X3NlZzsKLSAgaW50IG9sZF9zdWJzZWN0aW9uID0gbm93X3N1YnNlZzsKLQotICBpZiAoIWNvbW1lbnRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBjaGFyICpwOwotICAgICAgY29tbWVudF9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5jb21tZW50IiwgMCk7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgY29tbWVudF9zZWN0aW9uLAotCQkJICAgICBTRUNfUkVBRE9OTFkgfCBTRUNfSEFTX0NPTlRFTlRTKTsKLSAgICAgIHAgPSBmcmFnX21vcmUgKDEpOwotICAgICAgKnAgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHN1YnNlZ19zZXQgKGNvbW1lbnRfc2VjdGlvbiwgMCk7Ci0gIHN0cmluZ2VyICgxKTsKLSAgc3Vic2VnX3NldCAob2xkX3NlY3Rpb24sIG9sZF9zdWJzZWN0aW9uKTsKLX0KLQotI2lmZGVmIElOSVRfU1RBQl9TRUNUSU9OCi0KLS8qIFRoZSBmaXJzdCBlbnRyeSBpbiBhIC5zdGFicyBzZWN0aW9uIGlzIHNwZWNpYWwuICAqLwotCi12b2lkCi1vYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpCi0gICAgIHNlZ1Qgc2VnOwotewotICBjaGFyICpmaWxlOwotICBjaGFyICpwOwotICBjaGFyICpzdGFic3RyX25hbWU7Ci0gIHVuc2lnbmVkIGludCBzdHJvZmY7Ci0KLSAgLyogRm9yY2UgdGhlIHNlY3Rpb24gdG8gYWxpZ24gdG8gYSBsb25nd29yZCBib3VuZGFyeS4gIFdpdGhvdXQgdGhpcywKLSAgICAgVW5peFdhcmUgYXIgY3Jhc2hlcy4gICovCi0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnLCAyKTsKLQotICAvKiBNYWtlIHNwYWNlIGZvciB0aGlzIGZpcnN0IHN5bWJvbC4gKi8KLSAgcCA9IGZyYWdfbW9yZSAoMTIpOwotICAvKiBaZXJvIGl0IG91dC4gKi8KLSAgbWVtc2V0IChwLCAwLCAxMik7Ci0gIGFzX3doZXJlICgmZmlsZSwgKHVuc2lnbmVkIGludCAqKSBOVUxMKTsKLSAgc3RhYnN0cl9uYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKHNlZ21lbnRfbmFtZSAoc2VnKSkgKyA0KTsKLSAgc3RyY3B5IChzdGFic3RyX25hbWUsIHNlZ21lbnRfbmFtZSAoc2VnKSk7Ci0gIHN0cmNhdCAoc3RhYnN0cl9uYW1lLCAic3RyIik7Ci0gIHN0cm9mZiA9IGdldF9zdGFiX3N0cmluZ19vZmZzZXQgKGZpbGUsIHN0YWJzdHJfbmFtZSk7Ci0gIGtub3cgKHN0cm9mZiA9PSAxKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBzdHJvZmYsIDQpOwotICBzZWdfaW5mbyAoc2VnKS0+c3RhYnUucCA9IHA7Ci19Ci0KLSNlbmRpZgotCi0vKiBGaWxsIGluIHRoZSBjb3VudHMgaW4gdGhlIGZpcnN0IGVudHJ5IGluIGEgLnN0YWJzIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3N0YWJfc2VjdGlvbnMgKGFiZmQsIHNlYywgeHh4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiB4eHg7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGFzZWN0aW9uICpzdHJzZWM7Ci0gIGNoYXIgKnA7Ci0gIGludCBzdHJzeiwgbnN5bXM7Ci0KLSAgaWYgKHN0cm5jbXAgKCIuc3RhYiIsIHNlYy0+bmFtZSwgNSkpCi0gICAgcmV0dXJuOwotICBpZiAoIXN0cmNtcCAoInN0ciIsIHNlYy0+bmFtZSArIHN0cmxlbiAoc2VjLT5uYW1lKSAtIDMpKQotICAgIHJldHVybjsKLQotICBuYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKHNlYy0+bmFtZSkgKyA0KTsKLSAgc3RyY3B5IChuYW1lLCBzZWMtPm5hbWUpOwotICBzdHJjYXQgKG5hbWUsICJzdHIiKTsKLSAgc3Ryc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotICBpZiAoc3Ryc2VjKQotICAgIHN0cnN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Ryc2VjKTsKLSAgZWxzZQotICAgIHN0cnN6ID0gMDsKLSAgbnN5bXMgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpIC8gMTIgLSAxOwotCi0gIHAgPSBzZWdfaW5mbyAoc2VjKS0+c3RhYnUucDsKLSAgYXNzZXJ0IChwICE9IDApOwotCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgKGJmZF92bWEpIG5zeW1zLCAoYmZkX2J5dGUgKikgcCArIDYpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzdHJzeiwgKGJmZF9ieXRlICopIHAgKyA4KTsKLX0KLQotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVDT0ZGIGNvZGUuICBJdCBpcyBzdXBwb3NlZCB0bwotICAgcmVjb3JkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24gc28gdGhhdCB0aGUgYmFja2VuZCBjYW4KLSAgIHdyaXRlIGl0IG91dCBjb3JyZWN0bHkuICBUaGUgRUxGIGJhY2tlbmQgZG9lc24ndCBhY3R1YWxseSBoYW5kbGUKLSAgIHRoaXMgYXQgdGhlIG1vbWVudCwgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLiAgV2Ugc2F2ZSB0aGUgaW5mb3JtYXRpb24KLSAgIGluIHRoZSBzeW1ib2wuICAqLwotCi12b2lkCi1lbGZfZWNvZmZfc2V0X2V4dCAoc3ltLCBleHQpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgc3RydWN0IGVjb2ZmX2V4dHIgKmV4dDsKLXsKLSAgc3ltLT5ic3ltLT51ZGF0YS5wID0gKFBUUikgZXh0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgSXQgaXMKLSAgIHN1cHBvc2VkIHRvICpFWFQgdG8gdGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbiwgYW5kIHJldHVybgotICAgd2hldGhlciB0aGUgc3ltYm9sIHNob3VsZCBiZSB1c2VkIGF0IGFsbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZ2V0X2V4dHIgKHN5bSwgZXh0KQotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIEVYVFIgKmV4dDsKLXsKLSAgaWYgKHN5bS0+dWRhdGEucCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgKmV4dCA9ICooRVhUUiAqKSBzeW0tPnVkYXRhLnA7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgSXQgaGFzCi0gICBub3RoaW5nIHRvIGRvIGZvciBFTEYuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1lbGZfc2V0X2luZGV4IChzeW0sIGluZHgpCi0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotewotfQotCi0jZW5kaWYgLyogTkVFRF9FQ09GRl9ERUJVRyAqLwotCi12b2lkCi1lbGZfZnJvYl9zeW1ib2wgKHN5bXAsIHB1bnRwKQotICAgICBzeW1ib2xTICpzeW1wOwotICAgICBpbnQgKnB1bnRwOwotewotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICBlY29mZl9mcm9iX3N5bWJvbCAoc3ltcCk7Ci0jZW5kaWYKLQotICBpZiAoc3ltcC0+c3lfb2JqLnNpemUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHN5bXAtPnN5X29iai5zaXplLT5YX29wKQotCXsKLQljYXNlIE9fc3VidHJhY3Q6Ci0JICBTX1NFVF9TSVpFIChzeW1wLAotCQkgICAgICAoU19HRVRfVkFMVUUgKHN5bXAtPnN5X29iai5zaXplLT5YX2FkZF9zeW1ib2wpCi0JCSAgICAgICArIHN5bXAtPnN5X29iai5zaXplLT5YX2FkZF9udW1iZXIKLQkJICAgICAgIC0gU19HRVRfVkFMVUUgKHN5bXAtPnN5X29iai5zaXplLT5YX29wX3N5bWJvbCkpKTsKLQkgIGJyZWFrOwotCWNhc2UgT19jb25zdGFudDoKLQkgIFNfU0VUX1NJWkUgKHN5bXAsCi0JCSAgICAgIChTX0dFVF9WQUxVRSAoc3ltcC0+c3lfb2JqLnNpemUtPlhfYWRkX3N5bWJvbCkKLQkJICAgICAgICsgc3ltcC0+c3lfb2JqLnNpemUtPlhfYWRkX251bWJlcikpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFzX2JhZCAoXygiLnNpemUgZXhwcmVzc2lvbiB0b28gY29tcGxpY2F0ZWQgdG8gZml4IHVwIikpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZnJlZSAoc3ltcC0+c3lfb2JqLnNpemUpOwotICAgICAgc3ltcC0+c3lfb2JqLnNpemUgPSBOVUxMOwotICAgIH0KLQotICBpZiAoc3ltcC0+c3lfb2JqLnZlcnNpb25lZF9uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBzeW1ib2wgd2FzIGdpdmVuIGEgbmV3IG5hbWUgd2l0aCB0aGUgLnN5bXZlciBkaXJlY3RpdmUuCi0KLSAgICAgICAgIElmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlLCBqdXN0IHJlbmFtZSB0aGUgc3ltYm9sIHRvCi0gICAgICAgICBpbmNsdWRlIHRoZSB2ZXJzaW9uIHN0cmluZy4gIFRoaXMgd2lsbCBtYWtlIHRoZSByZWxvY3MgYmUKLSAgICAgICAgIGFnYWluc3QgdGhlIGNvcnJlY3QgdmVyc2lvbmVkIHN5bWJvbC4KLQotCSBJZiB0aGlzIGlzIGEgZGVmaW5pdGlvbiwgYWRkIGFuIGFsaWFzLiAgRklYTUU6IFVzaW5nIGFuIGFsaWFzCi0JIHdpbGwgcGVybWl0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gcmVmZXIgdG8gdGhlIHJpZ2h0Ci0JIHN5bWJvbC4gIEhvd2V2ZXIsIGl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgaXQgaXMgdGhlIGJlc3QKLQkgYXBwcm9hY2guICAqLwotCi0gICAgICBpZiAoISBTX0lTX0RFRklORUQgKHN5bXApKQotCXsKLQkgIGNoYXIgKnA7Ci0KLQkgIC8qIFZlcmlmeSB0aGF0IHRoZSBuYW1lIGlzbid0IHVzaW5nIHRoZSBAQCBzeW50YXgtLXRoaXMgaXMKLSAgICAgICAgICAgICByZXNlcnZlZCBmb3IgZGVmaW5pdGlvbnMgb2YgdGhlIGRlZmF1bHQgdmVyc2lvbiB0byBsaW5rCi0gICAgICAgICAgICAgYWdhaW5zdC4gICovCi0JICBwID0gc3RyY2hyIChzeW1wLT5zeV9vYmoudmVyc2lvbmVkX25hbWUsIEVMRl9WRVJfQ0hSKTsKLQkgIGtub3cgKHAgIT0gTlVMTCk7Ci0JICBpZiAocFsxXSA9PSBFTEZfVkVSX0NIUikKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBhdHRlbXB0IHRvIGRlY2xhcmUgZXh0ZXJuYWwgdmVyc2lvbiBuYW1lIGFzIGRlZmF1bHQgaW4gc3ltYm9sIGAlcyciKSwKLQkJICAgICAgc3ltcC0+c3lfb2JqLnZlcnNpb25lZF9uYW1lKTsKLQkgICAgICAqcHVudHAgPSB0cnVlOwotCSAgICB9Ci0JICBTX1NFVF9OQU1FIChzeW1wLCBzeW1wLT5zeV9vYmoudmVyc2lvbmVkX25hbWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xTICpzeW1wMjsKLQotCSAgLyogRklYTUU6IENyZWF0aW5nIGEgbmV3IHN5bWJvbCBoZXJlIGlzIHJpc2t5LiAgV2UncmUgaW4gdGhlCi0gICAgICAgICAgICAgZmluYWwgbG9vcCBvdmVyIHRoZSBzeW1ib2wgdGFibGUuICBXZSBjYW4gZ2V0IGF3YXkgd2l0aAotICAgICAgICAgICAgIGl0IG9ubHkgYmVjYXVzZSB0aGUgc3ltYm9sIGdvZXMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCwKLSAgICAgICAgICAgICB3aGVyZSB0aGUgbG9vcCB3aWxsIHN0aWxsIHNlZSBpdC4gIEl0IHdvdWxkIHByb2JhYmx5IGJlCi0gICAgICAgICAgICAgYmV0dGVyIHRvIGRvIHRoaXMgaW4gb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0LiAqLwotCi0JICBzeW1wMiA9IHN5bWJvbF9maW5kX29yX21ha2UgKHN5bXAtPnN5X29iai52ZXJzaW9uZWRfbmFtZSk7Ci0KLQkgIC8qIE5vdyB3ZSBhY3QgYXMgdGhvdWdoIHdlIHNhdyBzeW1wMiA9IHN5bS4gICovCi0KLQkgIFNfU0VUX1NFR01FTlQgKHN5bXAyLCBTX0dFVF9TRUdNRU5UIChzeW1wKSk7Ci0KLQkgIC8qIFN1YnRyYWN0aW5nIG91dCB0aGUgZnJhZyBhZGRyZXNzIGhlcmUgaXMgYSBoYWNrIGJlY2F1c2UKLSAgICAgICAgICAgICB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgZmluYWwgbG9vcC4gICovCi0JICBTX1NFVF9WQUxVRSAoc3ltcDIsIFNfR0VUX1ZBTFVFIChzeW1wKSAtIHN5bXAtPnN5X2ZyYWctPmZyX2FkZHJlc3MpOwotCi0JICBzeW1wMi0+c3lfZnJhZyA9IHN5bXAtPnN5X2ZyYWc7Ci0KLQkgIC8qIFRoaXMgd2lsbCBjb3B5IG92ZXIgdGhlIHNpemUgaW5mb3JtYXRpb24uICAqLwotCSAgY29weV9zeW1ib2xfYXR0cmlidXRlcyAoc3ltcDIsIHN5bXApOwotCi0JICBpZiAoU19JU19XRUFLIChzeW1wKSkKLQkgICAgU19TRVRfV0VBSyAoc3ltcDIpOwotCi0JICBpZiAoU19JU19FWFRFUk5BTCAoc3ltcCkpCi0JICAgIFNfU0VUX0VYVEVSTkFMIChzeW1wMik7Ci0JfQotICAgIH0KLQotICAvKiBEb3VibGUgY2hlY2sgd2VhayBzeW1ib2xzLiAgKi8KLSAgaWYgKHN5bXAtPmJzeW0tPmZsYWdzICYgQlNGX1dFQUspCi0gICAgewotICAgICAgaWYgKFNfSVNfQ09NTU9OIChzeW1wKSkKLQlhc19iYWQgKF8oIlN5bWJvbCBgJXMnIGNhbiBub3QgYmUgYm90aCB3ZWFrIGFuZCBjb21tb24iKSwKLQkJU19HRVRfTkFNRSAoc3ltcCkpOwotICAgIH0KLQotI2lmZGVmIFRDX01JUFMKLSAgLyogVGhlIElyaXggNSBhbmQgNiBhc3NlbWJsZXJzIHNldCB0aGUgdHlwZSBvZiBhbnkgY29tbW9uIHN5bWJvbCBhbmQKLSAgICAgYW55IHVuZGVmaW5lZCBub24tZnVuY3Rpb24gc3ltYm9sIHRvIFNUVF9PQkpFQ1QuICBXZSB0cnkgdG8gYmUKLSAgICAgY29tcGF0aWJsZSwgc2luY2UgbmV3ZXIgSXJpeCA1IGFuZCA2IGxpbmtlcnMgY2FyZS4gIEhvd2V2ZXIsIHdlCi0gICAgIG9ubHkgc2V0IHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIFNUVF9PQkpFQ1QgaWYgd2UgYXJlIG9uIElyaXgsCi0gICAgIGJlY2F1c2UgdGhhdCBpcyB0aGUgb25seSB0aW1lIGdjYyB3aWxsIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkKLSAgICAgLmdsb2JhbCBkaXJlY3RpdmVzIHRvIG1hcmsgZnVuY3Rpb25zLiAgKi8KLQotICBpZiAoU19JU19DT01NT04gKHN5bXApKQotICAgIHN5bXAtPmJzeW0tPmZsYWdzIHw9IEJTRl9PQkpFQ1Q7Ci0KLSAgaWYgKHN0cnN0ciAoVEFSR0VUX09TLCAiaXJpeCIpICE9IE5VTEwKLSAgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltcCkgJiYgKChzeW1wLT5ic3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikgPT0gMCkpKQotICAgIHN5bXAtPmJzeW0tPmZsYWdzIHw9IEJTRl9PQkpFQ1Q7Ci0jZW5kaWYKLQotI2lmZGVmIFRDX1BQQwotICAvKiBGcm9iIHRoZSBQb3dlclBDLCBzbyB0aGF0IHRoZSBzeW1ib2wgYWx3YXlzIGhhcyBvYmplY3QgdHlwZQotICAgICBpZiBpdCBpcyBub3Qgc29tZSBvdGhlciB0eXBlLiAgVnhXb3JrcyBuZWVkcyB0aGlzLiAgKi8KLSAgaWYgKChzeW1wLT5ic3ltLT5mbGFncyAmIChCU0ZfRlVOQ1RJT04gfCBCU0ZfRklMRSB8IEJTRl9TRUNUSU9OX1NZTSkpID09IDAKLSAgICAgICYmIFNfSVNfREVGSU5FRCAoc3ltcCkpCi0gICAgc3ltcC0+YnN5bS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKLSNlbmRpZgotfQotCi12b2lkCi1lbGZfZnJvYl9maWxlICgpCi17Ci0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCBhZGp1c3Rfc3RhYl9zZWN0aW9ucywgKFBUUikgMCk7Ci0KLSNpZmRlZiBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZwotICBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyAoKTsKLSNlbmRpZgotfQotCi0vKiBJdCBpcyByZXF1aXJlZCB0aGF0IHdlIGxldCB3cml0ZV9yZWxvY3MgaGF2ZSB0aGUgb3Bwb3J0dW5pdHkgdG8KLSAgIG9wdGltaXplIGF3YXkgZml4dXBzIGJlZm9yZSBvdXRwdXQgaGFzIGJlZ3VuLCBzaW5jZSBpdCBpcyBwb3NzaWJsZQotICAgdG8gZWxpbWluYXRlIGFsbCBmaXh1cHMgZm9yIGEgc2VjdGlvbiBhbmQgdGh1cyB3ZSBuZXZlciBzaG91bGQKLSAgIGhhdmUgZ2VuZXJhdGVkIHRoZSByZWxvY2F0aW9uIHNlY3Rpb24uICAqLwotCi12b2lkCi1lbGZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAoKQotewotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICAvKiBHZW5lcmF0ZSB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqZGVidWdfc3dhcDsKLSAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvIGRlYnVnOwotICAgICAgY2hhciAqYnVmOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgZGVidWdfc3dhcAotCT0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKHN0ZG91dHB1dCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0gICAgICBrbm93IChkZWJ1Z19zd2FwICE9IChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqKSBOVUxMKTsKLSAgICAgIGVjb2ZmX2J1aWxkX2RlYnVnICgmZGVidWcuc3ltYm9saWNfaGVhZGVyLCAmYnVmLCBkZWJ1Z19zd2FwKTsKLQotICAgICAgLyogU2V0IHVwIHRoZSBwb2ludGVycyBpbiBkZWJ1Zy4gICovCi0jZGVmaW5lIFNFVChwdHIsIG9mZnNldCwgdHlwZSkgXAotICAgIGRlYnVnLnB0ciA9ICh0eXBlKSAoYnVmICsgZGVidWcuc3ltYm9saWNfaGVhZGVyLm9mZnNldCkKLQotICAgICAgU0VUIChsaW5lLCBjYkxpbmVPZmZzZXQsIHVuc2lnbmVkIGNoYXIgKik7Ci0gICAgICBTRVQgKGV4dGVybmFsX2RuciwgY2JEbk9mZnNldCwgUFRSKTsKLSAgICAgIFNFVCAoZXh0ZXJuYWxfcGRyLCBjYlBkT2Zmc2V0LCBQVFIpOwotICAgICAgU0VUIChleHRlcm5hbF9zeW0sIGNiU3ltT2Zmc2V0LCBQVFIpOwotICAgICAgU0VUIChleHRlcm5hbF9vcHQsIGNiT3B0T2Zmc2V0LCBQVFIpOwotICAgICAgU0VUIChleHRlcm5hbF9hdXgsIGNiQXV4T2Zmc2V0LCB1bmlvbiBhdXhfZXh0ICopOwotICAgICAgU0VUIChzcywgY2JTc09mZnNldCwgY2hhciAqKTsKLSAgICAgIFNFVCAoZXh0ZXJuYWxfZmRyLCBjYkZkT2Zmc2V0LCBQVFIpOwotICAgICAgU0VUIChleHRlcm5hbF9yZmQsIGNiUmZkT2Zmc2V0LCBQVFIpOwotICAgICAgLyogc3NleHQgYW5kIGV4dGVybmFsX2V4dCBhcmUgc2V0IHVwIGp1c3QgYmVsb3cuICAqLwotCi0jdW5kZWYgU0VUCi0KLSAgICAgIC8qIFNldCB1cCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0gICAgICBkZWJ1Zy5zc2V4dCA9IGRlYnVnLnNzZXh0X2VuZCA9IE5VTEw7Ci0gICAgICBkZWJ1Zy5leHRlcm5hbF9leHQgPSBkZWJ1Zy5leHRlcm5hbF9leHRfZW5kID0gTlVMTDsKLSAgICAgIGlmICghIGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMgKHN0ZG91dHB1dCwgJmRlYnVnLCBkZWJ1Z19zd2FwLCB0cnVlLAotCQkJCSAgICAgICBlbGZfZ2V0X2V4dHIsIGVsZl9zZXRfaW5kZXgpKQotCWFzX2ZhdGFsIChfKCJGYWlsZWQgdG8gc2V0IHVwIGRlYnVnZ2luZyBpbmZvcm1hdGlvbjogJXMiKSwKLQkJICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0KLSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsICIubWRlYnVnIik7Ci0gICAgICBhc3NlcnQgKHNlYyAhPSBOVUxMKTsKLQotICAgICAga25vdyAoc3Rkb3V0cHV0LT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKTsKLQotICAgICAgLyogV2Ugc2V0IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLCBjYWxsIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cwotCSB0byBmb3JjZSB0aGUgRUxGIGJhY2tlbmQgdG8gYWxsb2NhdGUgYSBmaWxlIHBvc2l0aW9uLCBhbmQgdGhlbgotCSB3cml0ZSBvdXQgdGhlIGRhdGEuICBGSVhNRTogSXMgdGhpcyByZWFsbHkgdGhlIGJlc3Qgd2F5IHRvIGRvCi0JIHRoaXM/ICAqLwotICAgICAgc2VjLT5fcmF3X3NpemUgPSBiZmRfZWNvZmZfZGVidWdfc2l6ZSAoc3Rkb3V0cHV0LCAmZGVidWcsIGRlYnVnX3N3YXApOwotCi0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKHN0ZG91dHB1dCwgc2VjLCAoUFRSKSBOVUxMLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgKGJmZF9zaXplX3R5cGUpIDApKQotCWFzX2ZhdGFsIChfKCJDYW4ndCBzdGFydCB3cml0aW5nIC5tZGVidWcgc2VjdGlvbjogJXMiKSwKLQkJICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0KLSAgICAgIGtub3cgKHN0ZG91dHB1dC0+b3V0cHV0X2hhc19iZWd1biA9PSB0cnVlKTsKLSAgICAgIGtub3cgKHNlYy0+ZmlsZXBvcyAhPSAwKTsKLQotICAgICAgaWYgKCEgYmZkX2Vjb2ZmX3dyaXRlX2RlYnVnIChzdGRvdXRwdXQsICZkZWJ1ZywgZGVidWdfc3dhcCwKLQkJCQkgICBzZWMtPmZpbGVwb3MpKQotCWFzX2ZhdGFsIChfKCJDb3VsZCBub3Qgd3JpdGUgLm1kZWJ1ZyBzZWN0aW9uOiAlcyIpLAotCQkgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICB9Ci0jZW5kaWYgLyogTkVFRF9FQ09GRl9ERUJVRyAqLwotfQotCi0jaWZkZWYgU0NPX0VMRgotCi0vKiBIZWF2aWx5IHBsYWdhcml6ZWQgZnJvbSBvYmpfZWxmX3ZlcnNpb24uICBUaGUgaWRlYSBpcyB0byBlbWl0IHRoZQotICAgU0NPIHNwZWNpZmljIGlkZW50aWZpZXIgaW4gdGhlIC5ub3RlcyBzZWN0aW9uIHRvIHNhdGlzZnkgdGhlIFNDTwotICAgbGlua2VyLgotCi0gICBUaGlzIGxvb2tzIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBpdCByZWFsbHkgaXMuICBBcyBvcHBvc2VkIHRvIHRoZQotICAgIm9idmlvdXMiIHNvbHV0aW9uLCB0aGlzIHNob3VsZCBoYW5kbGUgdGhlIGNyb3NzIGRldiBjYXNlcwotICAgY29ycmVjdGx5LiAgKGkuZSwgaG9zdGluZyBvbiBhIDY0IGJpdCBiaWcgZW5kaWFuIHByb2Nlc3NvciwgYnV0Ci0gICBnZW5lcmF0aW5nIFNDTyBFbGYgY29kZSkgRWZmaWNpZW5jeSBpc24ndCBhIGNvbmNlcm4sIGFzIHRoZXJlCi0gICBzaG91bGQgYmUgZXhhY3RseSBvbmUgb2YgdGhlc2Ugc2VjdGlvbnMgcGVyIG9iamVjdCBtb2R1bGUuCi0KLSAgIFNDTyBPcGVuU2VydmVyIDUgaWRlbnRpZmllcyBpdCdzIEVMRiBtb2R1bGVzIHdpdGggYSBzdGFuZGFyZCBFTEYKLSAgIC5ub3RlIHNlY3Rpb24uCi0KLSAgIGludF8zMiBuYW1lc3ogID0gNCA7ICBOYW1lIHNpemUgCi0gICBpbnRfMzIgZGVzY3N6ICA9IDEyIDsgRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gCi0gICBpbnRfMzIgdHlwZSAgICA9IDEgOyAgCi0gICBjaGFyICAgbmFtZVs0XSA9ICJTQ08iIDsgT3JpZ2luYXRvciBuYW1lIEFMV0FZUyBTQ08gKyBOVUxMIAotICAgaW50XzMyIHZlcnNpb24gPSAobWFqb3IgdmVyICMgPDwgMTYpICB8IHZlcnNpb24gb2YgdG9vbHMgOwotICAgaW50XzMyIHNvdXJjZSAgPSAodG9vbF9pZCA8PCAxNiApIHwgMSA7Ci0gICBpbnRfMzIgaW5mbyAgICA9IDAgOyAgICBUaGVzZSBhcmUgc2V0IGJ5IHRoZSBTQ08gdG9vbHMsIGJ1dCB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3Qga25vdyBlbm91Z2ggYWJvdXQgdGhlIHNvdXJjZSAKLQkJCSAgIGVudmlyb25tZW50IHRvIHNldCB0aGVtLiAgU0NPIGxkIGN1cnJlbnRseQotCQkJICAgaWdub3JlcyB0aGVtLCBhbmQgcmVjb21tZW5kcyB3ZSBzZXQgdGhlbQotCQkJICAgdG8gemVyby4gICovCi0KLSNkZWZpbmUgU0NPX01BSk9SX1ZFUlNJT04gMHgxCi0jZGVmaW5lIFNDT19NSU5PUl9WRVJTSU9OIDB4MQotCi12b2lkCi1zY29faWQgKCkKLXsKLQotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgYzsKLSAgY2hhciBjaDsKLSAgY2hhciAqcDsKLSAgYXNlY3Rpb24gKnNlZyA9IG5vd19zZWc7Ci0gIHN1YnNlZ1Qgc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgRWxmX0ludGVybmFsX05vdGUgaV9ub3RlOwotICBFbGZfRXh0ZXJuYWxfTm90ZSBlX25vdGU7Ci0gIGFzZWN0aW9uICpub3RlX3NlY3AgPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgaW50IGksIGxlbjsKLQotICAvKiBjcmVhdGUgdGhlIC5ub3RlIHNlY3Rpb24gKi8KLQotICBub3RlX3NlY3AgPSBzdWJzZWdfbmV3ICgiLm5vdGUiLCAwKTsKLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsCi0JCQkgbm90ZV9zZWNwLAotCQkJIFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkpOwotCi0gIC8qIHByb2Nlc3MgdGhlIHZlcnNpb24gc3RyaW5nICovCi0KLSAgaV9ub3RlLm5hbWVzeiA9IDQ7IAotICBpX25vdGUuZGVzY3N6ID0gMTI7CQkvKiAxMiBkZXNjcmlwdGl2ZSBieXRlcyAqLwotICBpX25vdGUudHlwZSA9IE5UX1ZFUlNJT047CS8qIENvbnRhaW5zIGEgdmVyc2lvbiBzdHJpbmcgKi8KLQotICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGlfbm90ZS5uYW1lc3opKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpX25vdGUubmFtZXN6LCA0KTsKLQotICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGlfbm90ZS5kZXNjc3opKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpX25vdGUuZGVzY3N6LCA0KTsKLQotICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGlfbm90ZS50eXBlKSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaV9ub3RlLnR5cGUsIDQpOwotCi0gIHAgPSBmcmFnX21vcmUgKDQpOwotICBzdHJjcHkgKHAsICJTQ08iKTsgCi0KLSAgLyogTm90ZTogdGhpcyBpcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIEVMRiB3ZSdyZSByZXByZXNlbnRpbmcgKi8KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgKFNDT19NQUpPUl9WRVJTSU9OIDw8IDE2KSB8IChTQ09fTUlOT1JfVkVSU0lPTiksIDQpOwotCi0gIC8qIEhlcmUsIHdlIHBpY2sgYSBtYWdpYyBudW1iZXIgZm9yIG91cnNlbHZlcyAoeWVzLCBJICJyZWdpc3RlcmVkIgotICAgICBpdCB3aXRoIFNDTy4gIFRoZSBib3R0b20gYml0IHNob3dzIHRoYXQgd2UgYXJlIGNvbXBhdCB3aXRoIHRoZQotICAgICBTQ08gQUJJLiAgKi8KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgMHg0YzUyMDAwMCB8IDB4MDAwMSwgNCk7Ci0KLSAgLyogSWYgd2Uga25ldyAob3IgY2FyZWQpIHdoYXQgdGhlIHNvdXJjZSBsYW5ndWFnZSBvcHRpb25zIHdlcmUsIHdlJ2QKLSAgICAgZmlsbCB0aGVtIGluIGhlcmUuICBTQ08gaGFzIGdpdmVuIHVzIHBlcm1pc3Npb24gdG8gaWdub3JlIHRoZXNlCi0gICAgIGFuZCBqdXN0IHNldCB0aGVtIHRvIHplcm8uICAqLwotICBwID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAweDAwMDAsIDQpOwotIAotICBmcmFnX2FsaWduICgyLCAwLCAwKTsKLQotICAvKiBXZSBwcm9iYWJseSBjYW4ndCByZXN0b3JlIHRoZSBjdXJyZW50IHNlZ21lbnQsIGZvciB0aGVyZSBsaWtlbHkKLSAgICAgaXNuJ3Qgb25lIHlldC4uLiAgKi8KLSAgaWYgKHNlZyAmJiBzdWJzZWcpCi0gICAgc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpOwotCi19Ci0KLSNlbmRpZiAvKiBTQ09fRUxGICovCi0KLWNvbnN0IHN0cnVjdCBmb3JtYXRfb3BzIGVsZl9mb3JtYXRfb3BzID0KLXsKLSAgYmZkX3RhcmdldF9lbGZfZmxhdm91ciwKLSAgMCwKLSAgMSwKLSAgZWxmX2Zyb2Jfc3ltYm9sLAotICBlbGZfZnJvYl9maWxlLAotICBlbGZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcywKLSAgZWxmX3NfZ2V0X3NpemUsIGVsZl9zX3NldF9zaXplLAotICBlbGZfc19nZXRfYWxpZ24sIGVsZl9zX3NldF9hbGlnbiwKLSAgZWxmX2NvcHlfc3ltYm9sX2F0dHJpYnV0ZXMsCi0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotICBlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vLAotICBlY29mZl9zdGFiLAotI2Vsc2UKLSAgMCwKLSAgMCwJCQkJLyogcHJvY2Vzc19zdGFiICovCi0jZW5kaWYKLSAgZWxmX3NlY19zeW1fb2tfZm9yX3JlbG9jLAotICBlbGZfcG9wX2luc2VydCwKLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0gIGVsZl9lY29mZl9zZXRfZXh0LAotI2Vsc2UKLSAgMCwKLSNlbmRpZgotICBvYmpfcmVhZF9iZWdpbl9ob29rLAotICBvYmpfc3ltYm9sX25ld19ob29rLAotfTsKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWVsZi5oIGIvZ2FzL2NvbmZpZy9vYmotZWxmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNGJjNWYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotZWxmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyogRUxGIG9iamVjdCBmaWxlIGZvcm1hdC4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogSFAgUEEtUklTQyBzdXBwb3J0IHdhcyBjb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlCi0gICBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLiAgKi8KLQotI2lmbmRlZiBfT0JKX0VMRl9ICi0jZGVmaW5lIF9PQkpfRUxGX0gKLQotI2RlZmluZSBPQkpfRUxGIDEKLQotI2RlZmluZSBPVVRQVVRfRkxBVk9SIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLQotI2luY2x1ZGUgPGJmZC5oPgotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAkJLyogZm9yIG5vdyAqLwotI2luY2x1ZGUgImJmZC9lbGYtYmZkLmgiCi0KLS8qIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgZWFjaCBzeW1ib2wuICAqLwotCi0vKiBGSVhNRTogRm9yIHNvbWUgcmVhc29uLCB0aGlzIHN0cnVjdHVyZSBpcyBuZWVkZWQgYm90aCBoZXJlIGFuZCBpbgotICAgb2JqLW11bHRpLmguICAqLwotI2lmbmRlZiBPQkpfU1lNRklFTERfVFlQRQotc3RydWN0IGVsZl9vYmpfc3kKLXsKLSAgLyogVXNlIHRoaXMgdG8ga2VlcCB0cmFjayBvZiAuc2l6ZSBleHByZXNzaW9ucyB0aGF0IGludm9sdmUKLSAgICAgZGlmZmVyZW5jZXMgdGhhdCB3ZSBjYW4ndCBjb21wdXRlIHlldC4gICovCi0gIGV4cHJlc3Npb25TICpzaXplOwotCi0gIC8qIFRoZSBuYW1lIHNwZWNpZmllZCBieSB0aGUgLnN5bXZlciBkaXJlY3RpdmUuICAqLwotICBjaGFyICp2ZXJzaW9uZWRfbmFtZTsKLX07Ci0jZW5kaWYKLQotI2RlZmluZSBPQkpfU1lNRklFTERfVFlQRSBzdHJ1Y3QgZWxmX29ial9zeQotCi0vKiBTeW1ib2wgZmllbGRzIHVzZWQgYnkgdGhlIEVMRiBiYWNrIGVuZC4gICovCi0jZGVmaW5lIEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUyBpbnQgbG9jYWw6MTsKLQotLyogRG9uJ3QgY2hhbmdlIHRoaXM7IGNoYW5nZSBFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMgaW5zdGVhZC4gICovCi0jZGVmaW5lIFRBUkdFVF9TWU1CT0xfRklFTERTIEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUwotCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAwCi0jZGVmaW5lIFRSVUUgICFGQUxTRQotI2VuZGlmCi0KLSNkZWZpbmUgb2JqX2JlZ2luKCkgZWxmX2JlZ2luICgpCi1leHRlcm4gdm9pZCBlbGZfYmVnaW4gUEFSQU1TICgodm9pZCkpOwotCi0vKiBzaG91bGQgYmUgY29uZGl0aW9uYWwgb24gYWRkcmVzcyBzaXplISAqLwotI2RlZmluZSBlbGZfc3ltYm9sKGFzeW1ib2wpICgoZWxmX3N5bWJvbF90eXBlICopKCYoYXN5bWJvbCktPnRoZV9iZmQpKQotCi0jZGVmaW5lIFNfR0VUX1NJWkUoUykgKGVsZl9zeW1ib2wgKChTKS0+YnN5bSktPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZSkKLSNkZWZpbmUgU19TRVRfU0laRShTLFYpIFwKLSAgKGVsZl9zeW1ib2woKFMpLT5ic3ltKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplID0gKFYpKQotCi0jZGVmaW5lIFNfR0VUX0FMSUdOKFMpIChlbGZfc3ltYm9sICgoUyktPmJzeW0pLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3ZhbHVlKQotI2RlZmluZSBTX1NFVF9BTElHTihTLFYpIFwKLSAgKGVsZl9zeW1ib2wgKChTKS0+YnN5bSktPmludGVybmFsX2VsZl9zeW0uc3RfdmFsdWUgPSAoVikpCi0KLSNkZWZpbmUgU19HRVRfT1RIRVIoUykgKGVsZl9zeW1ib2wgKChTKS0+YnN5bSktPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXIpCi0jZGVmaW5lIFNfU0VUX09USEVSKFMsVikgXAotICAoZWxmX3N5bWJvbCAoKFMpLT5ic3ltKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlciA9IChWKSkKLQotZXh0ZXJuIGFzZWN0aW9uICpnZGJfc2VjdGlvbjsKLQotI2RlZmluZSBvYmpfZnJvYl9maWxlICBlbGZfZnJvYl9maWxlCi1leHRlcm4gdm9pZCBlbGZfZnJvYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAgZWxmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKLWV4dGVybiB2b2lkIGVsZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSBvYmpfYXBwX2ZpbGUgZWxmX2ZpbGVfc3ltYm9sCi1leHRlcm4gdm9pZCBlbGZfZmlsZV9zeW1ib2wgUEFSQU1TICgoY2hhciAqKSk7Ci0KLWV4dGVybiB2b2lkIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiB2b2lkIG9ial9lbGZfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIG9ial9lbGZfcHJldmlvdXMgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBvYmpfZWxmX3ZlcnNpb24gUEFSQU1TICgoaW50KSk7Ci0KLS8qIEJGRCB3YW50cyB0byB3cml0ZSB0aGUgdWRhdGEgZmllbGQsIHdoaWNoIGlzIGEgbm8tbm8gZm9yIHRoZQotICAgZ2xvYmFsbHkgZGVmaW5lZCBzZWN0aW9ucy4gICovCi0jZGVmaW5lIG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyhTRUMpCSgoU0VDKS0+b3duZXIgIT0gMCkKLQotLyogV2hlbiBzZXR0aW5nIG9uZSBzeW1ib2wgZXF1YWwgdG8gYW5vdGhlciwgYnkgZGVmYXVsdCB3ZSBwcm9iYWJseQotICAgd2FudCB0aGVtIHRvIGhhdmUgdGhlIHNhbWUgInNpemUiLCB3aGF0ZXZlciBpdCBtZWFucyBpbiB0aGUgY3VycmVudAotICAgY29udGV4dC4gICovCi0jZGVmaW5lIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKERFU1QsU1JDKQkJCVwKLWRvCQkJCQkJCQlcCi0gIHsJCQkJCQkJCVwKLSAgICBpZiAoKFNSQyktPnN5X29iai5zaXplKQkJCQkJXAotICAgICAgewkJCQkJCQkJXAotCWlmICgoREVTVCktPnN5X29iai5zaXplID09IE5VTEwpCQkJXAotCSAgKERFU1QpLT5zeV9vYmouc2l6ZSA9CQkJCQlcCi0JICAgIChleHByZXNzaW9uUyAqKSB4bWFsbG9jIChzaXplb2YgKGV4cHJlc3Npb25TKSk7CVwKLQkqKERFU1QpLT5zeV9vYmouc2l6ZSA9ICooU1JDKS0+c3lfb2JqLnNpemU7CQlcCi0gICAgICB9CQkJCQkJCQlcCi0gICAgZWxzZQkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQlcCi0JaWYgKChERVNUKS0+c3lfb2JqLnNpemUgIT0gTlVMTCkJCQlcCi0JICBmcmVlICgoREVTVCktPnN5X29iai5zaXplKTsJCQkJXAotCShERVNUKS0+c3lfb2JqLnNpemUgPSBOVUxMOwkJCQlcCi0gICAgICB9CQkJCQkJCQlcCi0gICAgU19TRVRfU0laRSAoKERFU1QpLCBTX0dFVF9TSVpFIChTUkMpKTsJCQlcCi0gICAgU19TRVRfT1RIRVIgKChERVNUKSwgU19HRVRfT1RIRVIgKFNSQykpOwkJCVwKLSAgfQkJCQkJCQkJXAotd2hpbGUgKDApCi0KLS8qIFN0YWJzIGdvIGluIGEgc2VwYXJhdGUgc2VjdGlvbi4gICovCi0jZGVmaW5lIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMgMQotCi0vKiBXZSBuZWVkIDEyIGJ5dGVzIGF0IHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiB0byBob2xkIHNvbWUgaW5pdGlhbAotICAgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIHZvaWQgb2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbiBQQVJBTVMgKChzZWdUKSk7Ci0jZGVmaW5lIElOSVRfU1RBQl9TRUNUSU9OKHNlZykgb2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbiAoc2VnKQotCi0jaWZkZWYgVENfQUxQSEEKLSNkZWZpbmUgRUNPRkZfREVCVUdHSU5HIGFscGhhX2ZsYWdfbWRlYnVnCi1leHRlcm4gaW50IGFscGhhX2ZsYWdfbWRlYnVnOwotI2VuZGlmCi0KLS8qIEZvciBub3csIGFsd2F5cyBzZXQgRUNPRkZfREVCVUdHSU5HIGZvciBhIE1JUFMgdGFyZ2V0LiAgKi8KLSNpZmRlZiBUQ19NSVBTCi0jaWZkZWYgTUlQU19TVEFCU19FTEYKLSNkZWZpbmUgRUNPRkZfREVCVUdHSU5HIDAKLSNlbHNlCi0jZGVmaW5lIEVDT0ZGX0RFQlVHR0lORyAxCi0jZW5kaWYgLyogTUlQU19TVEFCU19FTEYgKi8KLSNlbmRpZiAvKiBUQ19NSVBTICovCi0KLSNpZmRlZiBFQ09GRl9ERUJVR0dJTkcKLS8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgd2UgbmVlZCBzb21lCi0gICBhZGRpdGlvbmFsIGZpZWxkcyBmb3IgZWFjaCBzeW1ib2wuICAqLwotI3VuZGVmIFRBUkdFVF9TWU1CT0xfRklFTERTCi0jZGVmaW5lIFRBUkdFVF9TWU1CT0xfRklFTERTIFwKLSAgRUxGX1RBUkdFVF9TWU1CT0xfRklFTERTIFwKLSAgc3RydWN0IGVmZHIgKmVjb2ZmX2ZpbGU7IFwKLSAgc3RydWN0IGxvY2Fsc3ltICplY29mZl9zeW1ib2w7IFwKLSAgdmFsdWVUIGVjb2ZmX2V4dGVybl9zaXplOwotCi0vKiBXZSBzbXVnZ2xlIHN0YWJzIGluIEVDT0ZGIHJhdGhlciB0aGFuIHVzaW5nIGEgc2VwYXJhdGUgc2VjdGlvbi4KLSAgIFRoZSBJcml4IGxpbmtlciBjYW4gbm90IGhhbmRsZSBhIHNlcGFyYXRlIHN0YWJzIHNlY3Rpb24uICAqLwotCi0jdW5kZWYgIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMKLSNkZWZpbmUgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyAoIUVDT0ZGX0RFQlVHR0lORykKLQotI3VuZGVmICBJTklUX1NUQUJfU0VDVElPTgotI2RlZmluZSBJTklUX1NUQUJfU0VDVElPTihzZWcpIFwKLSAgKCh2b2lkKShFQ09GRl9ERUJVR0dJTkcgPyAwIDogKG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24gKHNlZyksIDApKSkKLQotI2RlZmluZSBPQkpfUFJPQ0VTU19TVEFCKHNlZywgd2hhdCwgc3RyaW5nLCB0eXBlLCBvdGhlciwgZGVzYykJCVwKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykJCQkJCQkJXAotICAgIGVjb2ZmX3N0YWIgKChzZWcpLCAod2hhdCksIChzdHJpbmcpLCAodHlwZSksIChvdGhlciksIChkZXNjKSkKLSNlbmRpZiAvKiBFQ09GRl9ERUJVR0dJTkcgKi8KLQotZXh0ZXJuIHZvaWQgZWxmX2Zyb2Jfc3ltYm9sIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKiwgaW50ICopKTsKLSNpZm5kZWYgb2JqX2Zyb2Jfc3ltYm9sCi0jZGVmaW5lIG9ial9mcm9iX3N5bWJvbChzeW1wLCBwdW50KSBlbGZfZnJvYl9zeW1ib2wgKHN5bXAsICZwdW50KQotI2VuZGlmCi0KLWV4dGVybiB2b2lkIGVsZl9wb3BfaW5zZXJ0IFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgb2JqX3BvcF9pbnNlcnQoKQllbGZfcG9wX2luc2VydCgpCi0KLSNpZm5kZWYgT0JKX01BWUJFX0VMRgotI2RlZmluZSBvYmpfZWNvZmZfc2V0X2V4dCBlbGZfZWNvZmZfc2V0X2V4dAotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGVjb2ZmX2V4dHI7Ci0jZW5kaWYKLWV4dGVybiB2b2lkIGVsZl9lY29mZl9zZXRfZXh0IFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKiwgc3RydWN0IGVjb2ZmX2V4dHIgKikpOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfT0JKX0VMRl9IICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1ldmF4LmMgYi9nYXMvY29uZmlnL29iai1ldmF4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MThjODMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotZXZheC5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogb2JqLWV2YXguYyAtIEVWQVggKG9wZW5WTVMvQWxwaGEpIG9iamVjdCBmaWxlIGZvcm1hdC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEtsYXVzIEvkbXBmIChra2FlbXBmQHByb2dpcy5kZSkgb2YKLSAgICAgcHJvR0lTIFNvZnR3YXJlLCBBYWNoZW4sIEdlcm1hbnkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIKLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAotICAgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBPQkpfSEVBREVSICJvYmotZXZheC5oIgotCi0jaW5jbHVkZSAiYXMuaCIKLQotc3RhdGljIHZvaWQgc19ldmF4X3dlYWsgUEFSQU1TICgoaW50KSk7Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW10gPQotewotICB7ICJ3ZWFrIiwgc19ldmF4X3dlYWssIDB9LAotICB7MCwgMCwgMH0sCi19OwkJCQkvKiBvYmpfcHNldWRvX3RhYmxlICovCi0KLXZvaWQgb2JqX3JlYWRfYmVnaW5faG9vayAoKSB7fQotCi0vKiBIYW5kbGUgdGhlIHdlYWsgc3BlY2lmaWMgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZXZheF93ZWFrIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIGRvCi0gICAgewotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgU19TRVRfV0VBSyAoc3ltYm9sUCk7Ci0gICAgICBpZiAoYyA9PSAnLCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCSAgICBjID0gJ1xuJzsKLQl9Ci0gICAgfQotICB3aGlsZSAoYyA9PSAnLCcpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2Ygb2JqLWV2YXguYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZXZheC5oIGIvZ2FzL2NvbmZpZy9vYmotZXZheC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDlkYjE5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWV2YXguaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBvYmotZXZheC5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBLbGF1cyBL5G1wZiAoa2thZW1wZkBwcm9naXMuZGUpIG9mCi0gICAgIHByb0dJUyBTb2Z0d2FyZSwgQWFjaGVuLCBHZXJtYW55LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCi0gICBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogVGhpcyBmaWxlIGlzIG9iai1ldmF4LmggYW5kIGlzIGludGVuZGVkIHRvIGJlIGEgdGVtcGxhdGUgZm9yCi0gKiBvYmplY3QgZm9ybWF0IHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSAqLwotCi0vKiBkZWZpbmUgYW4gb2JqIHNwZWNpZmljIG1hY3JvIG9mZiB3aGljaCB0YXJnZXQgY3B1IGJhY2sgZW5kcyBtYXkga2V5LiAqLwotI2RlZmluZSBPQkpfRVZBWCAxCi0KLS8qIGluY2x1ZGUgd2hhdGV2ZXIgdGFyZ2V0IGNwdSBpcyBhcHByb3ByaWF0ZS4gKi8KLSNpbmNsdWRlICJ0YXJnLWNwdS5oIgotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBPVVRQVVRfRkxBVk9SIGJmZF90YXJnZXRfZXZheF9mbGF2b3VyCi0jZW5kaWYKLQotLyoKLSAqIFNZTUJPTFMKLSAqLwotCi0vKgotICogSWYgeW91ciBvYmplY3QgZm9ybWF0IG5lZWRzIHRvIHJlb3JkZXIgc3ltYm9scywgZGVmaW5lIHRoaXMuICBXaGVuCi0gKiBkZWZpbmVkLCBzeW1ib2xzIGFyZSBrZXB0IG9uIGEgZG91Ymx5IGxpbmtlZCBsaXN0IGFuZCBmdW5jdGlvbnMgYXJlCi0gKiBtYWRlIGF2YWlsYWJsZSBmb3IgcHVzaCwgaW5zZXJ0LCBhcHBlbmQsIGFuZCBkZWxldGUuICBJZiBub3QgZGVmaW5lZCwKLSAqIHN5bWJvbHMgYXJlIGtlcHQgb24gYSBzaW5nbHkgbGlua2VkIGxpc3QsIG9ubHkgdGhlIGFwcGVuZCBhbmQgY2xlYXIKLSAqIGZhY2lsaXRpZXMgYXJlIGF2YWlsYWJsZSwgYW5kIHRoZXkgYXJlIG1hY3Jvcy4KLSAqLwotCi0vKiAjZGVmaW5lIFNZTUJPTFNfTkVFRF9QQUNLUE9JTlRFUlMgKi8KLQotLyogICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgdm9pZCAqbm90aGluZzsKLSAgfQotb2JqX3N5bWJvbF90eXBlOwkJLyogc2hvdWxkIGJlIHRoZSBmb3JtYXQncyBzeW1ib2wgc3RydWN0dXJlICovCi0KLXR5cGVkZWYgdm9pZCAqb2JqZWN0X2hlYWRlcnM7Ci0KLSNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFICgwKQkvKiB5b3VyIG1hZ2ljIG51bWJlciAqLwotCi0jZGVmaW5lIE9CSl9FTUlUX0xJTkVOTyhhLGIsYykJLyogbXVzdCBiZSAqc29tZXRoaW5nKi4gIFRoaXMgbm8tb3AncyBpdCBvdXQuICovCi0KLSNkZWZpbmUgb2JqX3N5bWJvbF9uZXdfaG9vayhzKSAgICAgICAgezt9Ci0KLSNkZWZpbmUgU19TRVRfT1RIRVIoUyxWKQotI2RlZmluZSBTX1NFVF9UWVBFKFMsVCkKLSNkZWZpbmUgU19TRVRfREVTQyhTLEQpCi0jZGVmaW5lIFNfR0VUX09USEVSKFMpCTAKLSNkZWZpbmUgU19HRVRfVFlQRShTKQkwCi0jZGVmaW5lIFNfR0VUX0RFU0MoUykJMAotCi0jZGVmaW5lIFBEU0NfU19LX0tJTkRfRlBfU1RBQ0sgOQotI2RlZmluZSBQRFNDX1NfS19LSU5EX0ZQX1JFR0lTVEVSIDEwCi0jZGVmaW5lIFBEU0NfU19LX0tJTkRfTlVMTCA4Ci0KLSNkZWZpbmUgUERTQ19TX0tfTUlOX1NUQUNLX1NJWkUgMzIKLSNkZWZpbmUgUERTQ19TX0tfTUlOX1JFR0lTVEVSX1NJWkUgMjQKLSNkZWZpbmUgUERTQ19TX0tfTlVMTF9TSVpFIDE2Ci0KLSNkZWZpbmUgUERTQ19TX01fQkFTRV9SRUdfSVNfRlAgMHg4MAkvKiBsb3cgYnl0ZSAqLwotI2RlZmluZSBQRFNDX1NfTV9OQVRJVkUgMHgxMAkJLyogaGlnaCBieXRlICovCi0jZGVmaW5lIFBEU0NfU19NX05PX0pBQ0tFVCAweDIwCQkvKiBoaWdoIGJ5dGUgKi8KLQotI2RlZmluZSBMS1BfU19LX1NJWkUgMTYKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIG9iai1ldmF4LmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWdlbmVyaWMuYyBiL2dhcy9jb25maWcvb2JqLWdlbmVyaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmYzNkMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1nZW5lcmljLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgb2JqLWdlbmVyaWMuYyBhbmQgaXMgaW50ZW5kZWQgdG8gYmUgYSB0ZW1wbGF0ZSBmb3IKLSAgIG9iamVjdCBmb3JtYXQgc3BlY2lmaWMgc291cmNlIGZpbGVzLgotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotLyogVGhlc2UgY2hhcnMgc3RhcnQgYSBjb21tZW50IGFueXdoZXJlIGluIGEgc291cmNlIGZpbGUgKGV4Y2VwdCBpbnNpZGUKLSAgIGFub3RoZXIgY29tbWVudCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiBvYmotZ2VuZXJpYy5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1nZW5lcmljLmggYi9nYXMvY29uZmlnL29iai1nZW5lcmljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMThlNDMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotZ2VuZXJpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIG9iai1nZW5lcmljLmgKLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgaXMgb2JqLWdlbmVyaWMuaCBhbmQgaXMgaW50ZW5kZWQgdG8gYmUgYSB0ZW1wbGF0ZSBmb3IKLSAqIG9iamVjdCBmb3JtYXQgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotICovCi0KLS8qIGRlZmluZSBhbiBvYmogc3BlY2lmaWMgbWFjcm8gb2ZmIHdoaWNoIHRhcmdldCBjcHUgYmFjayBlbmRzIG1heSBrZXkuICovCi0jZGVmaW5lIE9CSl9HRU5FUklDIDEKLQotLyogaW5jbHVkZSB3aGF0ZXZlciB0YXJnZXQgY3B1IGlzIGFwcHJvcHJpYXRlLiAqLwotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLS8qCi0gKiBTWU1CT0xTCi0gKi8KLQotLyoKLSAqIElmIHlvdXIgb2JqZWN0IGZvcm1hdCBuZWVkcyB0byByZW9yZGVyIHN5bWJvbHMsIGRlZmluZSB0aGlzLiAgV2hlbgotICogZGVmaW5lZCwgc3ltYm9scyBhcmUga2VwdCBvbiBhIGRvdWJseSBsaW5rZWQgbGlzdCBhbmQgZnVuY3Rpb25zIGFyZQotICogbWFkZSBhdmFpbGFibGUgZm9yIHB1c2gsIGluc2VydCwgYXBwZW5kLCBhbmQgZGVsZXRlLiAgSWYgbm90IGRlZmluZWQsCi0gKiBzeW1ib2xzIGFyZSBrZXB0IG9uIGEgc2luZ2x5IGxpbmtlZCBsaXN0LCBvbmx5IHRoZSBhcHBlbmQgYW5kIGNsZWFyCi0gKiBmYWNpbGl0aWVzIGFyZSBhdmFpbGFibGUsIGFuZCB0aGV5IGFyZSBtYWNyb3MuCi0gKi8KLQotLyogI2RlZmluZSBTWU1CT0xTX05FRURfUEFDS1BPSU5URVJTICovCi0KLS8qICAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHZvaWQgKm5vdGhpbmc7Ci0gIH0KLQotb2JqX3N5bWJvbF90eXBlOwkJLyogc2hvdWxkIGJlIHRoZSBmb3JtYXQncyBzeW1ib2wgc3RydWN0dXJlICovCi0KLXR5cGVkZWYgdm9pZCAqb2JqZWN0X2hlYWRlcnM7Ci0KLS8qIHN5bWJvbHMgaGF2ZSBuYW1lcyAqLwotI2RlZmluZSBTX0dFVF9OQU1FKHMpCQkoImZvbyIpCS8qIGdldCB0aGUgbmFtZSBvZiBhIHN5bWJvbFAgKi8KLSNkZWZpbmUgU19TRVRfTkFNRShzLHYpCQk7Ci0vKiBzeW1ib2xzIGhhdmUgc2VnbWVudHMgKi8KLSNkZWZpbmUgU19HRVRfU0VHTUVOVChzKQkoU0VHX1VOS05PV04pCi0jZGVmaW5lIFNfU0VUX1NFR01FTlQocyx2KQk7Ci0vKiBzeW1ib2xzIG1heSBiZSBleHRlcm5hbCAqLwotI2RlZmluZSBTX0lTX0VYVEVSTkFMKHMpCSgwKQotI2RlZmluZSBTX1NFVF9FWFRFUk5BTChzKQk7Ci0KLS8qIHN5bWJvbHMgbWF5IG9yIG1heSBub3QgYmUgZGVmaW5lZCAqLwotI2RlZmluZSBTX0lTX0RFRklORUQocykJCSgwKQotCi0KLSNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFICgwKQkvKiB5b3VyIG1hZ2ljIG51bWJlciAqLwotCi0jZGVmaW5lIE9CSl9FTUlUX0xJTkVOTyhhLGIsYykJLyogbXVzdCBiZSAqc29tZXRoaW5nKi4gIFRoaXMgbm8tb3AncyBpdCBvdXQuICovCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiBvYmotZ2VuZXJpYy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1ocDMwMC5jIGIvZ2FzL2NvbmZpZy9vYmotaHAzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5Y2M1My4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1ocDMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIG9iai1ocDMwMC5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImNvbmZpZy9vYmotYW91dC5jIgotCi0vKiBBb3V0IGZpbGUgZ2VuZXJhdGlvbiAmIHV0aWxpdGllcyAqLwotdm9pZAotaHAzMDBfaGVhZGVyX2FwcGVuZCAod2hlcmUsIGhlYWRlcnMpCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci17Ci0gIHRjX2hlYWRlcnNfaG9vayAoaGVhZGVycyk7Ci0KLSNkZWZpbmUgRE8oRklFTEQpCVwKLSAgeyBcCi0gICAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5GSUVMRCwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuRklFTEQpKTsgXAotICAgICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5GSUVMRCk7IFwKLSAgfQotCi0gIERPIChhX2luZm8pOwotICBETyAoYV9zcGFyZTEpOwotICBETyAoYV9zcGFyZTIpOwotICBETyAoYV90ZXh0KTsgICAgICAKLSAgRE8gKGFfZGF0YSk7ICAgICAKLSAgRE8gKGFfYnNzKTsgICAgIAotICBETyAoYV90cnNpemUpOyAKLSAgRE8gKGFfZHJzaXplKTsKLSAgRE8gKGFfc3BhcmUzKTsKLSAgRE8gKGFfc3BhcmU0KTsKLSAgRE8gKGFfc3BhcmU1KTsKLSAgRE8gKGFfZW50cnkpOyAKLSAgRE8gKGFfc3BhcmU2KTsKLSAgRE8gKGFfc3BhcmU3KTsKLSAgRE8gKGFfc3ltcyk7ICAKLSAgRE8gKGFfc3BhcmU4KTsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWhwMzAwLmggYi9nYXMvY29uZmlnL29iai1ocDMwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQwMDZiLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWhwMzAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgb2JqLWhwMzAwLmgKLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIF9fU1RSVUNUX0VYRUNfT1ZFUlJJREVfXwotCi1zdHJ1Y3QgZXhlY19ieXRlcwotewotICB1bnNpZ25lZCBjaGFyIGFfaW5mb1s0XTsgICAvKiBhX21hY2h0eXBlL2FfbWFnaWMgKi8KLSAgdW5zaWduZWQgY2hhciBhX3NwYXJlMVs0XTsKLSAgdW5zaWduZWQgY2hhciBhX3NwYXJlMls0XTsKLSAgdW5zaWduZWQgY2hhciBhX3RleHRbNF07ICAgLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIgYV9kYXRhWzRdOyAgIC8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfYnNzWzRdOyAgICAvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgZm9yIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIgYV90cnNpemVbNF07IC8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIgYV9kcnNpemVbNF07IC8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIGRhdGEsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTNbNF07IC8qIEhQID0gcGFzY2FsIGludGVyZmFjZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTRbNF07IC8qIEhQID0gc3ltYm9sIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBhX3NwYXJlNVs0XTsgLyogSFAgPSBkZWJ1ZyBuYW1lIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBhX2VudHJ5WzRdOyAgLyogc3RhcnQgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfc3BhcmU2WzRdOyAvKiBIUCA9IHNvdXJjZSBsaW5lIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBhX3NwYXJlN1s0XTsgLyogSFAgPSB2YWx1ZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgYV9zeW1zWzRdOyAgIC8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfc3BhcmU4WzRdOwotfTsKLQotLyogSG93IGJpZyB0aGUgInN0cnVjdCBleGVjIiBpcyBvbiBkaXNrICovCi0jZGVmaW5lIEVYRUNfQllURVNfU0laRSAoMTYgKiA0KQotCi1zdHJ1Y3QgZXhlYwotewotICB1bnNpZ25lZCBsb25nIGFfaW5mbzsKLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMTsKLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMjsKLSAgdW5zaWduZWQgbG9uZyBhX3RleHQ7ICAgICAgCi0gIHVuc2lnbmVkIGxvbmcgYV9kYXRhOyAgICAgCi0gIHVuc2lnbmVkIGxvbmcgYV9ic3M7ICAgICAKLSAgdW5zaWduZWQgbG9uZyBhX3Ryc2l6ZTsgCi0gIHVuc2lnbmVkIGxvbmcgYV9kcnNpemU7Ci0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTM7Ci0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTQ7Ci0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTU7Ci0gIHVuc2lnbmVkIGxvbmcgYV9lbnRyeTsgCi0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTY7Ci0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTc7Ci0gIHVuc2lnbmVkIGxvbmcgYV9zeW1zOyAgCi0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTg7Ci19OwotCi0jZGVmaW5lIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRQkoT01BR0lDKQotI2RlZmluZSBBT1VUX1ZFUlNJT04JMHgwMgotI2RlZmluZSBBT1VUX01BQ0hUWVBFCTB4MGMKLSNkZWZpbmUgT01BR0lDCQkweDEwNgotICAgIAotI2RlZmluZSBvYmpfaGVhZGVyX2FwcGVuZAlocDMwMF9oZWFkZXJfYXBwZW5kCi0jaW5jbHVkZSAiY29uZmlnL29iai1hb3V0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1pZWVlLmMgYi9nYXMvY29uZmlnL29iai1pZWVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTA3OTguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotaWVlZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjI3ICswLDAgQEAKLS8qIG9iai1mb3JtYXQgZm9yIGllZWUtNjk1IHJlY29yZHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLQotLyoKLSAgY3JlYXRlZCBieQotCi0gIHN0ZXZlIGNoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLSAgKi8KLQotLyoKLSAgdGhpcyB3aWxsIGhvcGVmdWxseSBiZWNvbWUgdGhlIHBvcnQgdGhyb3VnaCB3aGljaCBiZmQgYW5kIGdhcyB0YWxrLAotICBmb3IgdGhlIG1vbWVudCwgb25seSBpZWVlIGlzIGtub3duIHRvIHdvcmsgd2VsbC4KLSAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm91dHB1dC1maWxlLmgiCi0jaW5jbHVkZSAiZnJhZ3MuaCIKLQotYmZkICphYmZkOwotCi0vKiBIb3cgbWFueSBhZGRyZXNzZXMgZG9lcyB0aGUgLmFsaWduIHRha2U/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+c3lfc3ltYm9sLnN5Lm5hbWUpKQotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgaW50IHg7Ci0gIH0KLQotb2JqZWN0X2hlYWRlcnM7Ci0KLSNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFIDEKLQotCi1pbnQgbGluZW5vX3Jvb3RQOwotCi0KLSNkZWZpbmUgSUVFRV9TVFlMRQotCi0vKiBlbmQgb2Ygb2JqLWllZWUuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotbXVsdGkuYyBiL2dhcy9jb25maWcvb2JqLW11bHRpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMTUwOTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotbXVsdGkuYworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotLyogZm9vICovCi0KLSNpbmNsdWRlICJhcy5oIgotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1tdWx0aS5oIGIvZ2FzL2NvbmZpZy9vYmotbXVsdGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4ZDk4ZC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1tdWx0aS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyogaGkgKi8KLQotI2luY2x1ZGUgImVtdWwuaCIKLSNpbmNsdWRlICJ0YXJnLWNwdS5oIgotCi0jZGVmaW5lIE9VVFBVVF9GTEFWT1IJCSh0aGlzX2Zvcm1hdC0+Zmxhdm9yKQotI2RlZmluZSBvYmpfZnJvYl9zeW1ib2woUyxQKQkodGhpc19mb3JtYXQtPmZyb2Jfc3ltYm9sKShTLCYoUCkpCi0jZGVmaW5lIG9ial9mcm9iX2ZpbGUJCSh0aGlzX2Zvcm1hdC0+ZnJvYl9maWxlKQotI2RlZmluZSBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAodGhpc19mb3JtYXQtPmZyb2JfZmlsZV9hZnRlcl9yZWxvY3MpCi0jZGVmaW5lIG9ial9lY29mZl9zZXRfZXh0CSh0aGlzX2Zvcm1hdC0+ZWNvZmZfc2V0X2V4dCkKLSNkZWZpbmUgb2JqX3BvcF9pbnNlcnQJCSh0aGlzX2Zvcm1hdC0+cG9wX2luc2VydCkKLSNkZWZpbmUgb2JqX3JlYWRfYmVnaW5faG9vaygpCSh0aGlzX2Zvcm1hdC0+cmVhZF9iZWdpbl9ob29rP3RoaXNfZm9ybWF0LT5yZWFkX2JlZ2luX2hvb2soKToodm9pZCkwKQotI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rCSh0aGlzX2Zvcm1hdC0+c3ltYm9sX25ld19ob29rKQotI2RlZmluZSBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MgKHRoaXNfZm9ybWF0LT5zZWNfc3ltX29rX2Zvcl9yZWxvYykKLSNkZWZpbmUgU19HRVRfU0laRQkJKHRoaXNfZm9ybWF0LT5zX2dldF9zaXplKQotI2RlZmluZSBTX1NFVF9TSVpFCQkodGhpc19mb3JtYXQtPnNfc2V0X3NpemUpCi0jZGVmaW5lIFNfR0VUX0FMSUdOCQkodGhpc19mb3JtYXQtPnNfZ2V0X2FsaWduKQotI2RlZmluZSBTX1NFVF9BTElHTgkJKHRoaXNfZm9ybWF0LT5zX3NldF9hbGlnbikKLSNkZWZpbmUgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMgKHRoaXNfZm9ybWF0LT5jb3B5X3N5bWJvbF9hdHRyaWJ1dGVzKQotI2RlZmluZSBPQkpfUFJPQ0VTU19TVEFCCSh0aGlzX2Zvcm1hdC0+cHJvY2Vzc19zdGFiKQotCi0jaWYgZGVmaW5lZCAoT0JKX01BWUJFX0VDT0ZGKSB8fCAoZGVmaW5lZCAoT0JKX01BWUJFX0VMRikgJiYgZGVmaW5lZCAoVENfTUlQUykpCi0jZGVmaW5lIEVDT0ZGX0RFQlVHR0lORyAxCi0jZW5kaWYKLQotLyogRklYTUU6IFdoYXQncyB0aGUgc3RvcnkgaGVyZT8gIFdoeSBkbyB3ZSBoYXZlIHRvIGRlZmluZQotICAgT0JKX1NZTUZJRUxEX1RZUEUgYm90aCBoZXJlIGFuZCBpbiBvYmotZWxmLmg/ICAqLwotI2lmZGVmIE9CSl9NQVlCRV9FTEYKLXN0cnVjdCBlbGZfb2JqX3N5Ci17Ci0gIGV4cHJlc3Npb25TICpzaXplOwotICBjaGFyICp2ZXJzaW9uZWRfbmFtZTsKLX07Ci0jZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFIHN0cnVjdCBlbGZfb2JqX3N5Ci0jZGVmaW5lIEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUyBpbnQgbG9jYWw6MTsKLSNlbHNlCi0jZGVmaW5lIEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUwotI2VuZGlmCi0KLSNpZmRlZiBFQ09GRl9ERUJVR0dJTkcKLXN0cnVjdCBlZmRyOwotc3RydWN0IGxvY2Fsc3ltOwotI2RlZmluZSBFQ09GRl9ERUJVR19UQVJHRVRfU1lNQk9MX0ZJRUxEUyBzdHJ1Y3QgZWZkciAqZWNvZmZfZmlsZTsgc3RydWN0IGxvY2Fsc3ltICplY29mZl9zeW1ib2w7IHZhbHVlVCBlY29mZl9leHRlcm5fc2l6ZTsKLSNlbHNlCi0jZGVmaW5lIEVDT0ZGX0RFQlVHX1RBUkdFVF9TWU1CT0xfRklFTERTCi0jZW5kaWYKLQotI2RlZmluZSBUQVJHRVRfU1lNQk9MX0ZJRUxEUyBcCi0JRUxGX1RBUkdFVF9TWU1CT0xfRklFTERTIFwKLQlFQ09GRl9ERUJVR19UQVJHRVRfU1lNQk9MX0ZJRUxEUwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotc29tLmMgYi9nYXMvY29uZmlnL29iai1zb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhZjE4Zi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1zb20uYworKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKiBTT00gb2JqZWN0IGZpbGUgZm9ybWF0LgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuCi0KLSAgIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoCi0gICBhbmQgYnkgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotLyogU09NIGRvZXMgbm90IG5lZWQgYW55IHBzZXVkby1vcHMuICAqLwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KLXsKLSAge05VTEx9Ci19OwotCi1zdGF0aWMgaW50IHZlcnNpb25fc2VlbiA9IDA7Ci1zdGF0aWMgaW50IGNvcHlyaWdodF9zZWVuID0gMDsKLXN0YXRpYyBpbnQgY29tcGlsZXJfc2VlbiA9IDA7Ci0KLS8qIFVudXNlZCBieSBTT00uICAqLwotdm9pZCBvYmpfcmVhZF9iZWdpbl9ob29rICgpIHt9Ci0KLS8qIEhhbmRsZSBhIC5jb21waWxlciBkaXJlY3RpdmUuICAgVGhpcyBpcyBpbnRlbmRlZCB0byBjcmVhdGUgdGhlCi0gICBjb21waWxhdGlvbiB1bml0IGF1eGlsaWFyeSBoZWFkZXIgZm9yIE1QRSBzdWNoIHRoYXQgdGhlIGxpbmtlZGl0b3IKLSAgIGNhbiBoYW5kbGUgU09NIGV4dHJhY3Rpb24gZnJvbSBhcmNoaXZlcy4gVGhlIGZvcm1hdCBvZiB0aGUgcXVvdGVkCi0gICBzdHJpbmcgaXMgInNvdXJjZWZpbGUgbGFuZ3VhZ2UgdmVyc2lvbiIgYW5kIGlzIGRlbGltaXRlZCBieSBibGFua3MuKi8KLQotdm9pZAotb2JqX3NvbV9jb21waWxlciAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpidWY7Ci0gIGNoYXIgYzsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKmxhbmd1YWdlX25hbWU7Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgKnZlcnNpb25faWQ7Ci0KLSAgaWYgKGNvbXBpbGVyX3NlZW4pCi0gICAgewotICAgICAgYXNfYmFkICgiT25seSBvbmUgLmNvbXBpbGVyIHBzZXVkby1vcCBwZXIgZmlsZSEiKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wiJykKLSAgICB7Ci0gICAgICBidWYgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHdoaWxlIChpc19hX2NoYXIgKG5leHRfY2hhcl9vZl9zdHJpbmcgKCkpKQotCTsKLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMDAwJzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIik7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBQYXJzZSB0aGUgcXVvdGVkIHN0cmluZyBpbnRvIGl0cyBjb21wb25lbnQgcGFydHMuICBTa2lwIHRoZQotICAgICBxdW90ZS4gICovCi0gIGZpbGVuYW1lID0gYnVmICsgMTsKLSAgcCA9IGZpbGVuYW1lOwotICB3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcMDAwJykKLSAgICBwKys7Ci0gIGlmICgqcCA9PSAnXDAwMCcpCi0gICAgewotICAgICAgYXNfYmFkICgiLmNvbXBpbGVyIGRpcmVjdGl2ZSBtaXNzaW5nIGxhbmd1YWdlIGFuZCB2ZXJzaW9uIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9ICdcMDAwJzsKLQotICBsYW5ndWFnZV9uYW1lCT0gKytwOwotICB3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcMDAwJykgcCsrOwotICBpZiAoKnAgPT0gJ1wwMDAnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoIi5jb21waWxlciBkaXJlY3RpdmUgbWlzc2luZyB2ZXJzaW9uIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9ICdcMDAwJzsKLQotICB2ZXJzaW9uX2lkCT0gKytwOwotICB3aGlsZSAoKnAgIT0gJ1wwMDAnKSBwKys7Ci0gIC8qIFJlbW92ZSB0aGUgdHJhaWxpbmcgcXVvdGUuICAqLwotICAqKC0tcCkgPSAnXDAwMCc7Ci0KLSAgY29tcGlsZXJfc2VlbiA9IDE7Ci0gIGlmICghIGJmZF9zb21fYXR0YWNoX2NvbXBpbGF0aW9uX3VuaXQgKHN0ZG91dHB1dCwgZmlsZW5hbWUsIGxhbmd1YWdlX25hbWUsCi0JCQkJCSAiR05VIFRvb2xzIiwgdmVyc2lvbl9pZCkpCi0gICAgewotICAgICAgYmZkX3BlcnJvciAoc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0gICAgICBhc19mYXRhbCAoIkZBVEFMOiBBdHRhY2hpbmcgY29tcGlsZXIgaGVhZGVyICVzIiwgc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0gICAgfQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLnZlcnNpb24gZGlyZWN0aXZlLiAgKi8KLQotdm9pZAotb2JqX3NvbV92ZXJzaW9uICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKnZlcnNpb24sIGM7Ci0KLSAgaWYgKHZlcnNpb25fc2VlbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIk9ubHkgb25lIC52ZXJzaW9uIHBzZXVkby1vcCBwZXIgZmlsZSEiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCi0gICAgewotICAgICAgdmVyc2lvbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgd2hpbGUgKGlzX2FfY2hhciAobmV4dF9jaGFyX29mX3N0cmluZyAoKSkpCi0JOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwMDAnOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgcXVvdGVkIHN0cmluZyIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHZlcnNpb25fc2VlbiA9IDE7Ci0gIGlmIChiZmRfc29tX2F0dGFjaF9hdXhfaGRyIChzdGRvdXRwdXQsIFZFUlNJT05fQVVYX0lELCB2ZXJzaW9uKSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBiZmRfcGVycm9yIChzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IEF0dGFjaGluZyB2ZXJzaW9uIGhlYWRlciAlcyIpLCBzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLmNvcHlyaWdodCBkaXJlY3RpdmUuICAgVGhpcyBwcm9iYWJseSBpc24ndCBjb21wbGV0ZSwgYnV0Ci0gICBpdCdzIG9mIGR1YmlvdXMgdmFsdWUgYW55d2F5IGFuZCAoSU1ITykgbm90IHdvcnRoIHRoZSB0aW1lIHRvIGZpbmlzaC4KLSAgIElmIHlvdSBjYXJlIGFib3V0IGNvcHlyaWdodCBzdHJpbmdzIHRoYXQgbXVjaCwgeW91IGZpeCBpdC4gICovCi0KLXZvaWQKLW9ial9zb21fY29weXJpZ2h0ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKmNvcHlyaWdodCwgYzsKLQotICBpZiAoY29weXJpZ2h0X3NlZW4pCi0gICAgewotICAgICAgYXNfYmFkIChfKCJPbmx5IG9uZSAuY29weXJpZ2h0IHBzZXVkby1vcCBwZXIgZmlsZSEiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCi0gICAgewotICAgICAgY29weXJpZ2h0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICB3aGlsZSAoaXNfYV9jaGFyIChuZXh0X2NoYXJfb2Zfc3RyaW5nICgpKSkKLQk7Ci0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAwMCc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY29weXJpZ2h0X3NlZW4gPSAxOwotICBpZiAoYmZkX3NvbV9hdHRhY2hfYXV4X2hkciAoc3Rkb3V0cHV0LCBDT1BZUklHSFRfQVVYX0lELCBjb3B5cmlnaHQpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGJmZF9wZXJyb3IgKHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQXR0YWNoaW5nIGNvcHlyaWdodCBoZWFkZXIgJXMiKSwgc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFBlcmZvcm0gYW55IGluaXRpYWxpemF0aW9uIG5lY2Vzc2FyeSBmb3Igc3RhYnMgc3VwcG9ydC4KLQotICAgRm9yIFNPTSB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgc3BhY2Ugd2hpY2ggd2lsbCBjb250YWluIHRoZQotICAgdHdvIHN0YWJzIHN1YnNwYWNlcy4gIEFkZGl0aW9uYWxseSB3ZSBuZWVkIHRvIHNldCB1cCB0aGUKLSAgIHNwYWNlL3N1YnNwYWNlIHJlbGF0aW9uc2hpcHMgYW5kIHNldCBzcGFjZS9zdWJzcGFjZSBhdHRyaWJ1dGVzCi0gICB3aGljaCBCRkQgZG9lcyBub3QgdW5kZXJzdGFuZC4gICovCi0KLXZvaWQKLW9ial9zb21faW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIHNlZ1Qgc2F2ZWRfc2VnID0gbm93X3NlZzsKLSAgc2VnVCBzcGFjZTsKLSAgc3Vic2VnVCBzYXZlZF9zdWJzZWcgPSBub3dfc3Vic2VnOwotICBjaGFyICpwLCAqZmlsZTsKLSAgdW5zaWduZWQgaW50IHN0cm9mZjsKLQotICAvKiBNYWtlIHRoZSBzcGFjZSB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIGRlYnVnIHN1YnNwYWNlcy4gICovCi0gIHNwYWNlID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzdGRvdXRwdXQsICIkR0RCX0RFQlVHJCIpOwotCi0gIC8qIFNldCBTT00gc3BlY2lmaWMgYXR0cmlidXRlcyBmb3IgdGhlIHNwYWNlLiAgSW4gcGFydGljdWxhciB3ZSBzZXQKLSAgICAgdGhlIHNwYWNlICJkZWZpbmVkIiwgInByaXZhdGUiLCAic29ydF9rZXkiLCBhbmQgInNwbnVtIiB2YWx1ZXMuIAotCi0gICAgIER1ZSB0byBhIGJ1ZyBpbiBweGRiIChjYWxsZWQgYnkgaHB1eCBsaW5rZXIpLCB0aGUgc29ydCBrZXlzCi0gICAgIG9mIHRoZSB2YXJpb3VzIHN0YWJzIHNwYWNlcy9zdWJzcGFjZXMgbmVlZCB0byBiZSAic21hbGwiLiAgV2UKLSAgICAgcmVzZXJ2ZSByYW5nZSA3Mi83MyB3aGljaCBhcHBlYXIgdG8gd29yayB3ZWxsLiAgKi8KLSAgb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgKHNwYWNlLCAxLCAxLCA3MiwgMik7Ci0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc3BhY2UsIDIpOwotCi0gIC8qIFNldCB0aGUgY29udGFpbmluZyBzcGFjZSBmb3IgYm90aCBzdGFiIHNlY3Rpb25zIHRvIGJlICRHREJfREVCVUckCi0gICAgIChqdXN0IGNyZWF0ZWQgYWJvdmUpLiAgQWxzbyBzZXQgc29tZSBhdHRyaWJ1dGVzIHdoaWNoIEJGRCBkb2VzCi0gICAgIG5vdCB1bmRlcnN0YW5kLiAgSW4gcGFydGljdWxhciwgYWNjZXNzIGJpdHMsIHNvcnQga2V5cywgYW5kIGxvYWQKLSAgICAgcXVhZHJhbnQuICAqLwotICBvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyAoc2VnLCBzcGFjZSwgMHgxZiwgNzMsIDApOwotICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZywgMik7Ci0KLSAgLyogTWFrZSBzb21lIHNwYWNlIGZvciB0aGUgZmlyc3Qgc3BlY2lhbCBzdGFiIGVudHJ5IGFuZCB6ZXJvIHRoZSBtZW1vcnkuCi0gICAgIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsZW5ndGggb2YgdGhpcyBmaWxlJ3MKLSAgICAgc3RhYiBzdHJpbmcgYW5kIHRoZSBsaWtlLiAgVXNpbmcgaXQgYXZvaWRzIHRoZSBuZWVkIHRvIAotICAgICByZWxvY2F0ZSB0aGUgc3RhYiBzdHJpbmdzLgotCi0gICAgIFRoZSAkR0RCX1NUUklOR1MkIHNwYWNlIHdpbGwgYmUgY3JlYXRlZCBhcyBhIHNpZGUgZWZmZWN0IG9mCi0gICAgIHRoZSBjYWxsIHRvIGdldF9zdGFiX3N0cmluZ19vZmZzZXQuICAqLwotICBwID0gZnJhZ19tb3JlICgxMik7Ci0gIG1lbXNldCAocCwgMCwgMTIpOwotICBhc193aGVyZSAoJmZpbGUsICh1bnNpZ25lZCBpbnQgKikgTlVMTCk7Ci0gIHN0cm9mZiA9IGdldF9zdGFiX3N0cmluZ19vZmZzZXQgKGZpbGUsICIkR0RCX1NUUklOR1MkIik7Ci0gIGtub3cgKHN0cm9mZiA9PSAxKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBzdHJvZmYsIDQpOwotICBzZWdfaW5mbyAoc2VnKS0+c3RhYnUucCA9IHA7Ci0KLSAgLyogU2V0IHRoZSBjb250YWluaW5nIHNwYWNlIGZvciBib3RoIHN0YWIgc2VjdGlvbnMgdG8gYmUgJEdEQl9ERUJVRyQKLSAgICAgKGp1c3QgY3JlYXRlZCBhYm92ZSkuICBBbHNvIHNldCBzb21lIGF0dHJpYnV0ZXMgd2hpY2ggQkZEIGRvZXMKLSAgICAgbm90IHVuZGVyc3RhbmQuICBJbiBwYXJ0aWN1bGFyLCBhY2Nlc3MgYml0cywgc29ydCBrZXlzLCBhbmQgbG9hZAotICAgICBxdWFkcmFudC4gICovCi0gIHNlZyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsICIkR0RCX1NUUklOR1MkIik7Ci0gIG9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIChzZWcsIHNwYWNlLCAweDFmLCA3MiwgMCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnLCAyKTsKLQotICBzdWJzZWdfc2V0IChzYXZlZF9zZWcsIHNhdmVkX3N1YnNlZyk7Ci19Ci0KLS8qIEZpbGwgaW4gdGhlIGNvdW50cyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gYSAuc3RhYnMgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc3RhYl9zZWN0aW9ucyAoYWJmZCwgc2VjLCB4eHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHh4eDsKLXsKLSAgYXNlY3Rpb24gKnN0cnNlYzsKLSAgY2hhciAqcDsKLSAgaW50IHN0cnN6LCBuc3ltczsKLQotICBpZiAoc3RyY21wICgiJEdEQl9TWU1CT0xTJCIsIHNlYy0+bmFtZSkpCi0gICAgcmV0dXJuOwotCi0gIHN0cnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiJEdEQl9TVFJJTkdTJCIpOwotICBpZiAoc3Ryc2VjKQotICAgIHN0cnN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Ryc2VjKTsKLSAgZWxzZQotICAgIHN0cnN6ID0gMDsKLSAgbnN5bXMgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpIC8gMTIgLSAxOwotCi0gIHAgPSBzZWdfaW5mbyAoc2VjKS0+c3RhYnUucDsKLSAgYXNzZXJ0IChwICE9IDApOwotCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgKGJmZF92bWEpIG5zeW1zLCAoYmZkX2J5dGUgKikgcCArIDYpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzdHJzeiwgKGJmZF9ieXRlICopIHAgKyA4KTsKLX0KLQotLyogQ2FsbGVkIGxhdGUgaW4gdGhlIGFzc3NlbWJseSBwaGFzZSB0byBhZGp1c3QgdGhlIHNwZWNpYWwKLSAgIHN0YWIgZW50cnkgYW5kIHRvIHNldCB0aGUgc3RhcnRpbmcgYWRkcmVzcyBmb3IgZWFjaCBjb2RlIHN1YnNwYWNlLiAgKi8KLQotdm9pZAotc29tX2Zyb2JfZmlsZSAoKQotewotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgYWRqdXN0X3N0YWJfc2VjdGlvbnMsIChQVFIpIDApOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotc29tLmggYi9nYXMvY29uZmlnL29iai1zb20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwODdiMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1zb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qIFNPTSBvYmplY3QgZmlsZSBmb3JtYXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4KLQotICAgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKLSAgIGFuZCBieSBDeWdudXMgU3VwcG9ydC4gICovCi0KLSNpZm5kZWYgX09CSl9TT01fSAotI2RlZmluZSBfT0JKX1NPTV9ICi0KLSNkZWZpbmUgT0JKX1NPTSAxCi0KLSNpbmNsdWRlIDxiZmQuaD4KLSNpbmNsdWRlICJiZmQvc29tLmgiCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAwCi0jZGVmaW5lIFRSVUUgIUZBTFNFCi0jZW5kaWYKLQotLyogc2hvdWxkIGJlIGNvbmRpdGlvbmFsIG9uIGFkZHJlc3Mgc2l6ZSEgICovCi0jZGVmaW5lIHNvbV9zeW1ib2woYXN5bWJvbCkgKChzb21fc3ltYm9sX3R5cGUgKikoJihhc3ltYm9sKS0+dGhlX2JmZCkpCi0KLWV4dGVybiB2b2lkIHNvbV9maWxlX3N5bWJvbCBQQVJBTVMgKChjaGFyICopKTsKLWV4dGVybiB2b2lkIG9ial9zb21fdmVyc2lvbiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIG9ial9zb21faW5pdF9zdGFiX3NlY3Rpb24gUEFSQU1TICgoc2VnVCkpOwotZXh0ZXJuIHZvaWQgb2JqX3NvbV9jb3B5cmlnaHQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBvYmpfc29tX2NvbXBpbGVyIFBBUkFNUyAoKGludCkpOwotCi0jZGVmaW5lIG9ial9zeW1ib2xfbmV3X2hvb2socykgezt9Ci0KLS8qIFNPTSBoYXMgc2V2ZXJhbCBhdHRyaWJ1dGVzIGZvciBzcGFjZXMvc3Vic3BhY2VzIHdoaWNoIGNhbiBub3QKLSAgIGJlIGVhc2lseSBleHByZXNzZWQgaW4gQkZELiAgV2UgdXNlIHRoZXNlIG1hY3JvcyB0byB0cmlnZ2VyIGNhbGxzCi0gICBpbnRvIHRoZSBTT00gQkZEIGJhY2tlbmQgdG8gc2V0IHRoZXNlIGF0dHJpYnV0ZXMuICAqLwotI2RlZmluZSBvYmpfc2V0X3NlY3Rpb25fYXR0cmlidXRlcyAgYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzCi0jZGVmaW5lIG9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIGJmZF9zb21fc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcwotCi0vKiBMaWtld2lzZSBmb3Igc3ltYm9sIHR5cGVzLiAgKi8KLSNkZWZpbmUgb2JqX3NldF9zeW1ib2xfdHlwZSBiZmRfc29tX3NldF9zeW1ib2xfdHlwZQotCi0vKiBTdGFicyBnbyBpbiBhIHNlcGFyYXRlIHNlY3Rpb25zLiAgR0RCIGV4cGVjdHMgdG8gZmluZCB0aGVtIGluIHNlY3Rpb25zCi0gICB3aXRoIHRoZSBuYW1lcyAkR0RCX1NZTUJPTFMkIGFuZCAkR0RCX1NUUklOR1MkIHJhdGhlciB0aGFuIC5zdGFiIGFuZAotICAgLnN0YWJzdHIuICAqLwotI2RlZmluZSBTRVBBUkFURV9TVEFCX1NFQ1RJT05TIDEKLSNkZWZpbmUgU1RBQl9TRUNUSU9OX05BTUUgIiRHREJfU1lNQk9MUyQiCi0jZGVmaW5lIFNUQUJfU1RSSU5HX1NFQ1RJT05fTkFNRSAiJEdEQl9TVFJJTkdTJCIKLQotLyogV2UgdXNlIElOSVRfU1RBQl9TRUNUSU9OIHRvIHJlY29yZCB0aGUgc3BhY2Uvc3Vic3BhY2UgcmVsYXRpb25zaGlwcwotICAgZm9yIHRoZSB2YXJpb3VzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCi0jZGVmaW5lIElOSVRfU1RBQl9TRUNUSU9OKHNlZykgb2JqX3NvbV9pbml0X3N0YWJfc2VjdGlvbiAoc2VnKQotCi0vKiBXZSdsbCBiZSB1cGRhdGluZyB0aGUgbWFnaWMgMXN0IHN0YWIgZW50cnkgb25jZSB0aGUgZW50aXJlIGFzc2VtYmx5Ci0gICBmYWlsIGhhcyBiZWVuIHByb2Nlc3NlZC4gICovCi0jZGVmaW5lIG9ial9mcm9iX2ZpbGUoKSBzb21fZnJvYl9maWxlKCkKLQotI2VuZGlmIC8qIF9PQkpfU09NX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLXZtcy5jIGIvZ2FzL2NvbmZpZy9vYmotdm1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMDhmOGUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotdm1zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTQ5ICswLDAgQEAKLS8qIHZtcy5jIC0tIFdyaXRlIG91dCBhIFZBWC9WTVMgb2JqZWN0IGZpbGUKLSAgIENvcHlyaWdodCAoQykgMTk4NywgODgsIDkyLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IERhdmlkIEwuIEthc2h0YW4gKi8KLS8qIE1vZGlmaWVkIGJ5IEVyaWMgWW91bmdkYWxlIHRvIHdyaXRlIFZNUyBkZWJ1ZyByZWNvcmRzIGZvciBwcm9ncmFtCi0gICB2YXJpYWJsZXMgKi8KLQotLyogV2FudCBhbGwgb2Ygb2JqLXZtcy5oIChhcyBvYmotZm9ybWF0LmgsIHZpYSB0YXJnLWVudi5oLCB2aWEgYXMuaCkuICAqLwotI2RlZmluZSBXQU5UX1ZNU19PQkpfREVGUwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0vKiBXaGF0IHdlIGRvIGlmIHRoZXJlIGlzIGEgZ29vZi4gKi8KLSNkZWZpbmUgZXJyb3IgYXNfZmF0YWwKLQotI2lmZGVmIFZNUwkJCS8qIFRoZXNlIGFyZSBvZiBubyB1c2UgaWYgd2UgYXJlIGNyb3NzIGFzc2VtYmxpbmcuICovCi0jaW5jbHVkZSA8ZmFiLmg+CQkvKiBEZWZpbmUgRmlsZSBBY2Nlc3MgQmxvY2sJICAqLwotI2luY2x1ZGUgPG5hbS5oPgkJLyogRGVmaW5lIE5BTSBCbG9jawkJICAqLwotI2luY2x1ZGUgPHhhYi5oPgkJLyogRGVmaW5lIFhBQiAtIGFsbCBkaWZmZXJlbnQgdHlwZXMqLwotZXh0ZXJuIGludCBzeXMkb3BlbigpLCBzeXMkY2xvc2UoKSwgc3lzJGFzY3RpbSgpOwotI2VuZGlmCi0KLS8qCi0gKglWZXJzaW9uIHN0cmluZyBvZiB0aGUgY29tcGlsZXIgdGhhdCBwcm9kdWNlZCB0aGUgY29kZSB3ZSBhcmUKLSAqCWFzc2VtYmxpbmcuICAoQW5kIHRoaXMgYXNzZW1ibGVyLCBpZiB3ZSBkbyBub3QgaGF2ZSBjb21waWxlciBpbmZvLikKLSAqLwotY2hhciAqY29tcGlsZXJfdmVyc2lvbl9zdHJpbmc7Ci0KLWV4dGVybiBpbnQgZmxhZ19oYXNoX2xvbmdfbmFtZXM7CS8qIC0rICovCi1leHRlcm4gaW50IGZsYWdfb25lOwkJCS8qIC0xOyBjb21wYXRpYmlsaXR5IHdpdGggZ2NjIDEueCAqLwotZXh0ZXJuIGludCBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmM7CS8qIC1IICovCi1leHRlcm4gaW50IGZsYWdfbm9faGFzaF9taXhlZF9jYXNlOwkvKiAtaCBOVU0gKi8KLQotLyogRmxhZyB0aGF0IGRldGVybWluZXMgaG93IHdlIG1hcCBuYW1lcy4gIFRoaXMgdGFrZXMgc2V2ZXJhbCB2YWx1ZXMsIGFuZAotICogaXMgc2V0IHdpdGggdGhlIC1oIHN3aXRjaC4gIEEgdmFsdWUgb2YgemVybyBpbXBsaWVzIG5hbWVzIHNob3VsZCBiZQotICogdXBwZXIgY2FzZSwgYW5kIHRoZSBwcmVzZW5jZSBvZiB0aGUgLWggc3dpdGNoIGluaGliaXRzIHRoZSBjYXNlIGhhY2suCi0gKiBObyAtaCBzd2l0Y2ggYXQgYWxsIHNldHMgdm1zX25hbWVfbWFwcGluZyB0byAwLCBhbmQgYWxsb3dzIGNhc2UgaGFja2luZy4KLSAqIEEgdmFsdWUgb2YgMiAoc2V0IHdpdGggLWgyKSBpbXBsaWVzIG5hbWVzIHNob3VsZCBiZQotICogYWxsIGxvd2VyIGNhc2UsIHdpdGggbm8gY2FzZSBoYWNrLiAgQSB2YWx1ZSBvZiAzIChzZXQgd2l0aCAtaDMpIGltcGxpZXMKLSAqIHRoYXQgY2FzZSBzaG91bGQgYmUgcHJlc2VydmVkLiAgKi8KLQotLyogSWYgdGhlIC0rIHN3aXRjaCBpcyBnaXZlbiwgdGhlbiB0aGUgaGFzaCBpcyBhcHBlbmRlZCB0byBhbnkgbmFtZSB0aGF0IGlzCi0gKiBsb25nZXIgdGhhbiAzMSBjaGFyYWN0ZXJzLCByZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHRoZSAtaCBzd2l0Y2guCi0gKi8KLQotY2hhciB2bXNfbmFtZV9tYXBwaW5nID0gMDsKLQotc3RhdGljIHN5bWJvbFMgKkVudHJ5X1BvaW50X1N5bWJvbCA9IDA7CS8qIFBvaW50ZXIgdG8gIl9tYWluIiAqLwotCi0vKgotICoJV2UgYXVnbWVudCB0aGUgImdhcyIgc3ltYm9sIHN0cnVjdHVyZSB3aXRoIHRoaXMKLSAqLwotc3RydWN0IFZNU19TeW1ib2wKLXsKLSAgc3RydWN0IFZNU19TeW1ib2wgKk5leHQ7Ci0gIHN5bWJvbFMgKlN5bWJvbDsKLSAgaW50IFNpemU7Ci0gIGludCBQc2VjdF9JbmRleDsKLSAgaW50IFBzZWN0X09mZnNldDsKLX07Ci0KLXN0cnVjdCBWTVNfU3ltYm9sICpWTVNfU3ltYm9scyA9IDA7Ci1zdHJ1Y3QgVk1TX1N5bWJvbCAqQ3RvcnNfU3ltYm9scyA9IDA7Ci1zdHJ1Y3QgVk1TX1N5bWJvbCAqRHRvcnNfU3ltYm9scyA9IDA7Ci0KLS8qIFdlIG5lZWQgdGhpcyB0byBrZWVwIHRyYWNrIG9mIHRoZSB2YXJpb3VzIGlucHV0IGZpbGVzLCBzbyB0aGF0IHdlIGNhbgotICogZ2l2ZSB0aGUgZGVidWdnZXIgdGhlIGNvcnJlY3Qgc291cmNlIGxpbmUuCi0gKi8KLQotc3RydWN0IGlucHV0X2ZpbGUKLXsKLSAgc3RydWN0IGlucHV0X2ZpbGUgKm5leHQ7Ci0gIHN0cnVjdCBpbnB1dF9maWxlICpzYW1lX2ZpbGVfZnBudDsKLSAgaW50IGZpbGVfbnVtYmVyOwotICBpbnQgbWF4X2xpbmU7Ci0gIGludCBtaW5fbGluZTsKLSAgaW50IG9mZnNldDsKLSAgY2hhciBmbGFnOwotICBjaGFyICpuYW1lOwotICBzeW1ib2xTICpzcG50OwotfTsKLQotc3RhdGljIHN0cnVjdCBpbnB1dF9maWxlICpmaWxlX3Jvb3QgPSAoc3RydWN0IGlucHV0X2ZpbGUgKikgTlVMTDsKLQotCi0vKgotICogU3R5bGVzIG9mIFBTRUNUUyAocHJvZ3JhbSBzZWN0aW9ucykgdGhhdCB3ZSBnZW5lcmF0ZTsganVzdCBzaG9ydGhhbmQKLSAqIHRvIGF2b2lkIGxpc3RzIG9mIHNlY3Rpb24gYXR0cmlidXRlcy4gIFVzZWQgYnkgVk1TX1BzZWN0X1NwZWMoKS4KLSAqLwotZW51bSBwc190eXBlCi17Ci0gIHBzX1RFWFQsIHBzX0RBVEEsIHBzX0NPTU1PTiwgcHNfQ09OU1QsIHBzX0NUT1JTLCBwc19EVE9SUwotfTsKLQotLyoKLSAqIFRoaXMgZW51bSBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHZhcmlvdXMgdHlwZXMgb2YgdmFyaWFibGVzIHRoYXQKLSAqIG1heSBiZSBwcmVzZW50LgotICovCi0KLWVudW0gYWR2YW5jZWRfdHlwZQotewotICBCQVNJQywgUE9JTlRFUiwgQVJSQVksIEVOVU0sIFNUUlVDVCwgVU5JT04sIEZVTkNUSU9OLCBWT0lELCBBTElBUywgVU5LTk9XTgotfTsKLQotLyoKLSAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdGFicyBkaXJlY3RpdmVzLCBhbmQgdGhlCi0gKiBpbmZvcm1hdGlvbiBpcyBmaWxsZWQgaW4gYnkgVk1TX3R5cGVkZWZfcGFyc2UuICBFdmVyeXRoaW5nIHRoYXQgaXMgbmVlZGVkCi0gKiB0byBnZW5lcmF0ZSB0aGUgZGVidWdnaW5nIHJlY29yZCBmb3IgYSBnaXZlbiBzeW1ib2wgaXMgcHJlc2VudCBoZXJlLgotICogVGhpcyBjb3VsZCBiZSBkb25lIG1vcmUgZWZmaWNpZW50bHksIHVzaW5nIG5lc3RlZCBzdHJ1Y3QvdW5pb25zLCBidXQgZm9yIG5vdwotICogSSBhbSBoYXBweSB0aGF0IGl0IHdvcmtzLgotICovCi1zdHJ1Y3QgVk1TX0RCR19TeW1ib2wKLXsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpuZXh0OwotICAvKiBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoaXMgaXMgKi8KLSAgZW51bSBhZHZhbmNlZF90eXBlIGFkdmFuY2VkOwotICAvKiB0aGlzIHJlY29yZCBpcyBmb3IgdGhpcyB0eXBlICovCi0gIGludCBkYnhfdHlwZTsKLSAgLyogRm9yIGFkdmFuY2VkIHR5cGVzIHRoaXMgaXMgdGhlIHR5cGUgcmVmZXJyZWQgdG8uICBJLmUuLCB0aGUgdHlwZQotICAgICBhIHBvaW50ZXIgcG9pbnRzIHRvLCBvciB0aGUgdHlwZSBvZiBvYmplY3QgdGhhdCBtYWtlcyB1cCBhbgotICAgICBhcnJheS4gICovCi0gIGludCB0eXBlMjsKLSAgLyogVXNlIHRoaXMgdHlwZSB3aGVuIGdlbmVyYXRpbmcgYSB2YXJpYWJsZSBkZWYgKi8KLSAgaW50IFZNU190eXBlOwotICAvKiB1c2VkIGZvciBhcnJheXMgLSB0aGlzIHdpbGwgYmUgcHJlc2VudCBmb3IgYWxsICovCi0gIGludCBpbmRleF9taW47Ci0gIC8qIGVudHJpZXMsIGJ1dCB3aWxsIGJlIG1lYW5pbmdsZXNzIGZvciBub24tYXJyYXlzICovCi0gIGludCBpbmRleF9tYXg7Ci0gIC8qIFNpemUgaW4gYnl0ZXMgb2YgdGhlIGRhdGEgdHlwZS4gIEZvciBhbiBhcnJheSwgdGhpcyBpcyB0aGUgc2l6ZQotICAgICBvZiBvbmUgZWxlbWVudCBpbiB0aGUgYXJyYXkgKi8KLSAgaW50IGRhdGFfc2l6ZTsKLSAgLyogTnVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUvdW5pb24vZW51bSAtIHVzZWQgZm9yIHJlZiAqLwotICBpbnQgc3RydWNfbnVtYjsKLX07Ci0KLSNkZWZpbmUgU1lNVFlQTFNUX1NJWkUgKDE8PDQpCS8qIDE2OyBtdXN0IGJlIHBvd2VyIG9mIHR3byAqLwotI2RlZmluZSBTWU1UWVBfSEFTSCh4KSAoKHVuc2lnbmVkKSh4KSAmIChTWU1UWVBMU1RfU0laRS0xKSkKLXN0cnVjdCBWTVNfREJHX1N5bWJvbCAqVk1TX1N5bWJvbF90eXBlX2xpc3RbU1lNVFlQTFNUX1NJWkVdOwotCi0vKgotICogV2UgbmVlZCB0aGlzIHN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mIGZvcndhcmQgcmVmZXJlbmNlcyB0bwotICogc3RydWN0L3VuaW9uL2VudW0gdGhhdCBoYXZlIG5vdCBiZWVuIGRlZmluZWQgeWV0LiAgV2hlbiB0aGV5IGFyZSB1bHRpbWF0ZWx5Ci0gKiBkZWZpbmVkLCB0aGVuIHdlIGNhbiBnbyBiYWNrIGFuZCBnZW5lcmF0ZSB0aGUgVElSIGNvbW1hbmRzIHRvIG1ha2UgYSBiYWNrCi0gKiByZWZlcmVuY2UuCi0gKi8KLQotc3RydWN0IGZvcndhcmRfcmVmCi17Ci0gIHN0cnVjdCBmb3J3YXJkX3JlZiAqbmV4dDsKLSAgaW50IGRieF90eXBlOwotICBpbnQgc3RydWNfbnVtYjsKLSAgY2hhciByZXNvbHZlZDsKLX07Ci0KLXN0cnVjdCBmb3J3YXJkX3JlZiAqZl9yZWZfcm9vdCA9IChzdHJ1Y3QgZm9yd2FyZF9yZWYgKikgTlVMTDsKLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGNvbXBhcmUgdGhlIG5hbWVzIG9mIGNlcnRhaW4gdHlwZXMgdG8gdmFyaW91cwotICogZml4ZWQgdHlwZXMgdGhhdCBhcmUga25vd24gYnkgdGhlIGRlYnVnZ2VyLgotICovCi0jZGVmaW5lIHR5cGVfY2hlY2soWCkgICFzdHJjbXAgKHN5bWJvbF9uYW1lLCBYKQotCi0vKgotICogVGhpcyB2YXJpYWJsZSBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB3ZSBhcmUKLSAqIHdvcmtpbmcgb24gd2hpbGUgd2UgYXJlIHBhcnNpbmcgdGhlIHN0YWJzIGRpcmVjdGl2ZXMuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpzeW1ib2xfbmFtZTsKLQotLyogV2UgdXNlIHRoaXMgY291bnRlciB0byBhc3NpZ24gbnVtYmVycyB0byBhbGwgb2YgdGhlIHN0cnVjdHVyZXMsIHVuaW9ucwotICogYW5kIGVudW1zIHRoYXQgd2UgZGVmaW5lLiAgV2hlbiB3ZSBhY3R1YWxseSBkZWNsYXJlIGEgdmFyaWFibGUgdG8gdGhlCi0gKiBkZWJ1Z2dlciwgd2UgY2FuIHNpbXBseSBkbyBpdCBieSBudW1iZXIsIHJhdGhlciB0aGFuIGRlc2NyaWJpbmcgdGhlCi0gKiB3aG9sZSB0aGluZyBlYWNoIHRpbWUuCi0gKi8KLQotc3RhdGljIHN0cnVjdHVyZV9jb3VudCA9IDA7Ci0KLS8qIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSBtYWtpbmcgdGhlIGxhc3QgYXR0ZW1wdCB0bwotICAgcGFyc2UgdGhlIHN0YWJzLCBhbmQgdGhhdCB3ZSBzaG91bGQgZGVmaW5lIGFzIG11Y2ggYXMgd2UgY2FuLCBhbmQgaWdub3JlCi0gICB0aGUgcmVzdCAqLwotCi1zdGF0aWMgaW50IGZpbmFsX3Bhc3M7Ci0KLS8qIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHN0cnVjdHVyZSBudW1iZXIKLSAqIGZvciBhIGdpdmVuIHZhcmlhYmxlLiAgSWYgdGhpcyBpcyA8IDAsIHRoYXQgbWVhbnMgdGhhdCB0aGUgc3RydWN0dXJlCi0gKiBoYXMgbm90IHlldCBiZWVuIGRlZmluZWQgdG8gdGhlIGRlYnVnZ2VyLiAgVGhpcyBpcyBzdGlsbCBjb29sLCBzaW5jZQotICogdGhlIFZNUyBvYmplY3QgbGFuZ3VhZ2UgaGFzIHdheXMgb2YgZml4aW5nIHRoaW5ncyB1cCBhZnRlciB0aGUgZmFjdCwKLSAqIHNvIHdlIGp1c3QgbWFrZSBhIG5vdGUgb2YgdGhpcywgYW5kIGdlbmVyYXRlIGZpeHVwcyBhdCB0aGUgZW5kLgotICovCi1zdGF0aWMgaW50IHN0cnVjdF9udW1iZXI7Ci0KLS8qIFRoaXMgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIERfZmxvYXQgYW5kIEdfZmxvYXQgZm9yIHRlbGxpbmcKLSAgIHRoZSBkZWJ1Z2dlciBhYm91dCBkb3VibGVzLiAgZ2NjIG91dHB1dHMgdGhlIHNhbWUgLnN0YWJzIHJlZ2FyZGxlc3MKLSAgIG9mIHdoZXRoZXIgLW1nIGlzIHVzZWQgdG8gc2VsZWN0IGFsdGVybmF0ZSBkb3VibGVzLiAgKi8KLQotc3RhdGljIGludCB2YXhfZ19kb3VibGVzID0gMDsKLQotLyogTG9jYWwgc3ltYm9sIHJlZmVyZW5jZXMgKHVzZWQgdG8gaGFuZGxlIE5fQUJTIHN5bWJvbHM7IGdjYyBkb2VzIG5vdAotICAgZ2VuZXJhdGUgdGhvc2UsIGJ1dCB0aGV5J3JlIHBvc3NpYmxlIHdpdGggaGFuZC1jb2RlZCBhc3NlbWJsZXIgaW5wdXQpCi0gICBhcmUgYWx3YXlzIG1hZGUgcmVsYXRpdmUgdG8gc29tZSBwYXJ0aWN1bGFyIGVudmlyb25tZW50LiAgSWYgdGhlIGN1cnJlbnQKLSAgIGlucHV0IGhhcyBhbnkgc3VjaCBzeW1ib2xzLCB0aGVuIHdlIGV4cGVjdCB0aGlzIHRvIGdldCBpbmNyZW1lbnRlZAotICAgZXhhY3RseSBvbmNlIGFuZCBlbmQgdXAgaGF2aW5nIGFsbCBvZiB0aGVtIGJlIGluIGVudmlyb25tZW50ICMwLiAgKi8KLQotc3RhdGljIGludCBDdXJyZW50X0Vudmlyb25tZW50ID0gLTE7Ci0KLS8qIEV2ZXJ5IG9iamVjdCBmaWxlIG11c3Qgc3BlY2lmeSBhbiBtb2R1bGUgbmFtZSwgd2hpY2ggaXMgYWxzbyB1c2VkIGJ5Ci0gICB0cmFjZWJhY2sgcmVjb3Jkcy4gIFNldCBpbiBXcml0ZV9WTVNfTUhEX1JlY29yZHMoKS4gICovCi0KLXN0YXRpYyBjaGFyIE1vZHVsZV9OYW1lWzI1NSsxXTsKLQotLyoKLSAqIFZhcmlhYmxlIGRlc2NyaXB0b3JzIGFyZSB1c2VkIHRlbGwgdGhlIGRlYnVnZ2VyIHRoZSBkYXRhIHR5cGVzIG9mIGNlcnRhaW4KLSAqIG1vcmUgY29tcGxpY2F0ZWQgdmFyaWFibGVzIChiYXNpY2FsbHkgYW55dGhpbmcgaW52b2x2aW5nIGEgc3RydWN0dXJlLAotICogdW5pb24sIGVudW0sIGFycmF5IG9yIHBvaW50ZXIpLiAgU29tZSBub24tcG9pbnRlciB2YXJpYWJsZXMgb2YgdGhlCi0gKiBiYXNpYyB0eXBlcyB0aGF0IHRoZSBkZWJ1Z2dlciBrbm93cyBhYm91dCBkbyBub3QgcmVxdWlyZSBhIHZhcmlhYmxlCi0gKiBkZXNjcmlwdG9yLgotICoKLSAqIFNpbmNlIGl0IGlzIGltcG9zc2libGUgdG8gaGF2ZSBhIHZhcmlhYmxlIGRlc2NyaXB0b3IgbG9uZ2VyIHRoYW4gMTI4Ci0gKiBieXRlcyBieSB2aXJ0dWUgb2YgdGhlIHdheSB0aGF0IHRoZSBWTVMgb2JqZWN0IGxhbmd1YWdlIGlzIHNldCB1cCwKLSAqIGl0IG1ha2VzIG5vdCBzZW5zZSB0byBtYWtlIHRoZSBhcnJheXMgYW55IGxvbmdlciB0aGFuIHRoaXMsIG9yIHdvcnJ5aW5nCi0gKiBhYm91dCBkeW5hbWljIHNpemluZyBvZiB0aGUgYXJyYXkuCi0gKgotICogVGhlc2UgYXJlIHRoZSBhcnJheXMgYW5kIGNvdW50ZXJzIHRoYXQgd2UgdXNlIHRvIGJ1aWxkIGEgdmFyaWFibGUKLSAqIGRlc2NyaXB0b3IuCi0gKi8KLQotI2RlZmluZSBNQVhfREVCVUdfUkVDT1JEIDEyOAotc3RhdGljIGNoYXIgTG9jYWxbTUFYX0RFQlVHX1JFQ09SRF07CS8qIGJ1ZmZlciBmb3IgdmFyaWFibGUgZGVzY3JpcHRvciAqLwotc3RhdGljIGNoYXIgQXN1ZmZpeFtNQVhfREVCVUdfUkVDT1JEXTsJLyogYnVmZmVyIGZvciBhcnJheSBkZXNjcmlwdG9yICovCi1zdGF0aWMgaW50IExwbnQ7CQkvKiBpbmRleCBpbnRvIExvY2FsICovCi1zdGF0aWMgaW50IEFwb2ludDsJCS8qIGluZGV4IGludG8gQXN1ZmZpeCAqLwotc3RhdGljIGNoYXIgb3ZlcmZsb3c7CQkvKiBmbGFnIHRvIGluZGljYXRlIHdlIGhhdmUgd3JpdHRlbiB0b28gbXVjaCovCi1zdGF0aWMgaW50IHRvdGFsX2xlbjsJCS8qIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB0b3RhbCBsZW5ndGggb2YgdmFyaWFibGUKLQkJCQlkZXNjcmlwdG9yIHBsdXMgYXJyYXkgZGVzY3JpcHRvciAtIHVzZWQgZm9yIGxlbiBieXRlKi8KLQotLyogRmxhZyBpZiB3ZSBoYXZlIHRvbGQgdXNlciBhYm91dCBmaW5kaW5nIGdsb2JhbCBjb25zdGFudHMgaW4gdGhlIHRleHQKLSAgIHNlY3Rpb24uICovCi1zdGF0aWMgaW50IGdhdmVfY29tcGlsZXJfbWVzc2FnZSA9IDA7Ci0KLQotLyoKLSAqCUdsb2JhbCBkYXRhIChPYmplY3QgcmVjb3JkcyBsaW1pdGVkIHRvIDUxMiBieXRlcyBieSBWQVgtMTEgIkMiIHJ1bnRpbWUpCi0gKi8KLXN0YXRpYyBpbnQgVk1TX09iamVjdF9GaWxlX0ZEOwkvKiBGaWxlIERlc2NyaXB0b3IgZm9yIG9iamVjdCBmaWxlICovCi1zdGF0aWMgY2hhciBPYmplY3RfUmVjb3JkX0J1ZmZlcls1MTJdOwkvKiBCdWZmZXIgZm9yIG9iamVjdCBmaWxlIHJlY29yZHMgICovCi1zdGF0aWMgaW50IE9iamVjdF9SZWNvcmRfT2Zmc2V0Oy8qIE9mZnNldCB0byBlbmQgb2YgZGF0YQkgICAqLwotc3RhdGljIGludCBDdXJyZW50X09iamVjdF9SZWNvcmRfVHlwZTsJLyogVHlwZSBvZiByZWNvcmQgaW4gYWJvdmUJICAgKi8KLQotLyoKLSAqCU1hY3JvcyBmb3IgbW92aW5nIGRhdGEgYXJvdW5kLiAgTXVzdCB3b3JrIG9uIGJpZy1lbmRpYW4gc3lzdGVtcy4KLSAqLwotI2lmZGVmIFZNUyAgLyogVGhlc2UgYXJlIG1vcmUgZWZmaWNpZW50IGZvciBWTVMtPlZNUyBzeXN0ZW1zICovCi0jZGVmaW5lIENPUFlfTE9ORyhkZXN0LHZhbCkJKCAqKGxvbmcgKikoZGVzdCkgPSAodmFsKSApCi0jZGVmaW5lIENPUFlfU0hPUlQoZGVzdCx2YWwpCSggKihzaG9ydCAqKShkZXN0KSA9ICh2YWwpICkKLSNlbHNlCi0jZGVmaW5lIENPUFlfTE9ORyhkZXN0LHZhbCkJbWRfbnVtYmVyX3RvX2NoYXJzICgoZGVzdCksICh2YWwpLCA0KQotI2RlZmluZSBDT1BZX1NIT1JUKGRlc3QsdmFsKQltZF9udW1iZXJfdG9fY2hhcnMgKChkZXN0KSwgKHZhbCksIDIpCi0jZW5kaWYKLS8qCi0gKglNYWNyb3MgZm9yIHBsYWNpbmcgZGF0YSBpbnRvIHRoZSBvYmplY3QgcmVjb3JkIGJ1ZmZlci4KLSAqLwotI2RlZmluZSBQVVRfTE9ORyh2YWwpIFwKLQkoIENPUFlfTE9ORyAoJk9iamVjdF9SZWNvcmRfQnVmZmVyW09iamVjdF9SZWNvcmRfT2Zmc2V0XSwgKHZhbCkpLCBcCi0JICBPYmplY3RfUmVjb3JkX09mZnNldCArPSA0ICkKLQotI2RlZmluZSBQVVRfU0hPUlQodmFsKSBcCi0JKCBDT1BZX1NIT1JUICgmT2JqZWN0X1JlY29yZF9CdWZmZXJbT2JqZWN0X1JlY29yZF9PZmZzZXRdLCAodmFsKSksIFwKLQkgIE9iamVjdF9SZWNvcmRfT2Zmc2V0ICs9IDIgKQotCi0jZGVmaW5lIFBVVF9DSEFSKHZhbCkgKCBPYmplY3RfUmVjb3JkX0J1ZmZlcltPYmplY3RfUmVjb3JkX09mZnNldCsrXSA9ICh2YWwpICkKLQotI2RlZmluZSBQVVRfQ09VTlRFRF9TVFJJTkcoY3ApIGRvIHsgXAotCQkJcmVnaXN0ZXIgY29uc3QgY2hhciAqcCA9IChjcCk7IFwKLQkJCVBVVF9DSEFSICgoY2hhcikgc3RybGVuIChwKSk7IFwKLQkJCXdoaWxlICgqcCkgUFVUX0NIQVIgKCpwKyspOyB9IHdoaWxlICgwKQotCi0vKgotICoJTWFjcm8gZm9yIGRldGVybWluaW5nIGlmIGEgTmFtZSBoYXMgcHNlY3QgYXR0cmlidXRlcyBhdHRhY2hlZAotICoJdG8gaXQuCi0gKi8KLSNkZWZpbmUgUFNFQ1RfQVRUUklCVVRFU19TVFJJTkcJCSIkJFBzZWN0QXR0cmlidXRlc18iCi0jZGVmaW5lIFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HX0xFTkdUSAkxOAotCi0jZGVmaW5lIEhBU19QU0VDVF9BVFRSSUJVVEVTKE5hbWUpIFwKLQkJKHN0cm5jbXAgKCgqTmFtZSA9PSAnXycgPyBOYW1lICsgMSA6IE5hbWUpLCBcCi0JCQkgIFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HLCBcCi0JCQkgIFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HX0xFTkdUSCkgPT0gMCkKLQwKLQotIC8qIGluOiBzZWdUICAgb3V0OiBOX1RZUEUgYml0cyAqLwotY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdID0KLXsKLSAgTl9BQlMsCi0gIE5fVEVYVCwKLSAgTl9EQVRBLAotICBOX0JTUywKLSAgTl9VTkRGLAkJCS8qIHVua25vd24gKi8KLSAgTl9VTkRGLAkJCS8qIGVycm9yICovCi0gIE5fVU5ERiwJCQkvKiBleHByZXNzaW9uICovCi0gIE5fVU5ERiwJCQkvKiBkZWJ1ZyAqLwotICBOX1VOREYsCQkJLyogbnR2ICovCi0gIE5fVU5ERiwJCQkvKiBwdHYgKi8KLSAgTl9SRUdJU1RFUiwJCQkvKiByZWdpc3RlciAqLwotfTsKLQotY29uc3Qgc2VnVCBOX1RZUEVfc2VnW05fVFlQRSArIDJdID0KLXsJCQkJLyogTl9UWVBFID09IDB4MUUgPSAzMi0yICovCi0gIFNFR19VTktOT1dOLAkJCS8qIE5fVU5ERiA9PSAwICovCi0gIFNFR19HT09GLAotICBTRUdfQUJTT0xVVEUsCQkJLyogTl9BQlMgPT0gMiAqLwotICBTRUdfR09PRiwKLSAgU0VHX1RFWFQsCQkJLyogTl9URVhUID09IDQgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19EQVRBLAkJCS8qIE5fREFUQSA9PSA2ICovCi0gIFNFR19HT09GLAotICBTRUdfQlNTLAkJCS8qIE5fQlNTID09IDggKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKLSAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAotICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKLSAgU0VHX1JFR0lTVEVSLAkJCS8qIGR1bW15IE5fUkVHSVNURVIgZm9yIHJlZ3MgPSAzMCAqLwotICBTRUdfR09PRiwKLX07Ci0MCi0KLS8qIExvY2FsIHN1cHBvcnQgcm91dGluZXMgd2hpY2ggcmV0dXJuIGEgdmFsdWUuICAqLwotCi1zdGF0aWMgc3RydWN0IGlucHV0X2ZpbGUgKmZpbmRfZmlsZSBQQVJBTVMgKChzeW1ib2xTICopKTsKLXN0YXRpYyBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKmZpbmRfc3ltYm9sIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHN5bWJvbFMgKkRlZmluZV9Sb3V0aW5lIFBBUkFNUyAoKHN5bWJvbFMgKixpbnQsc3ltYm9sUyAqLGludCkpOwotCi1zdGF0aWMgY2hhciAqY3Z0X2ludGVnZXIgUEFSQU1TICgoY2hhciAqLGludCAqKSk7Ci1zdGF0aWMgY2hhciAqZml4X25hbWUgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X3N0cnVjdF9uYW1lIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgb2Zmc2V0VCBWTVNfSW5pdGlhbGl6ZWRfRGF0YV9TaXplIFBBUkFNUyAoKHN5bWJvbFMgKix1bnNpZ25lZCkpOwotCi1zdGF0aWMgaW50IFZNU19UQlRfU291cmNlX0ZpbGUgUEFSQU1TICgoY2hhciAqLGludCkpOwotc3RhdGljIGludCBnZW4xIFBBUkFNUyAoKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqLGludCkpOwotc3RhdGljIGludCBmb3J3YXJkX3JlZmVyZW5jZSBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBpbnQgZmluYWxfZm9yd2FyZF9yZWZlcmVuY2UgUEFSQU1TICgoc3RydWN0IFZNU19EQkdfU3ltYm9sICopKTsKLXN0YXRpYyBpbnQgVk1TX3R5cGVkZWZfcGFyc2UgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgaW50IGhhc2hfc3RyaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBWTVNfUHNlY3RfU3BlYyBQQVJBTVMgKChjb25zdCBjaGFyICosaW50LGVudW0gcHNfdHlwZSwKLQkJCQkgICBzdHJ1Y3QgVk1TX1N5bWJvbCAqKSk7Ci0KLS8qIExvY2FsIHN1cHBvcnQgcm91dGluZXMgd2hpY2ggZG9uJ3QgZGlyZWN0bHkgcmV0dXJuIGFueSB2YWx1ZS4gICovCi0KLXN0YXRpYyB2b2lkIHNfY29uc3QgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBDcmVhdGVfVk1TX09iamVjdF9GaWxlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIENsb3NlX1ZNU19PYmplY3RfRmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCB2bXNfdGlyX3N0YWNrX3BzZWN0IFBBUkFNUyAoKGludCxpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgUEFSQU1TICgoY29uc3QgY2hhciAqLGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19TZXRfRGF0YSBQQVJBTVMgKChpbnQsaW50LGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19TdG9yZV9TdHJ1Y3QgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfRGVmX1N0cnVjdCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19TZXRfU3RydWN0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgVk1TX1RCVF9Nb2R1bGVfQmVnaW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgVk1TX1RCVF9Nb2R1bGVfRW5kIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIFZNU19UQlRfUm91dGluZV9CZWdpbiBQQVJBTVMgKChzeW1ib2xTICosaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfVEJUX1JvdXRpbmVfRW5kIFBBUkFNUyAoKGludCxzeW1ib2xTICopKTsKLXN0YXRpYyB2b2lkIFZNU19UQlRfQmxvY2tfQmVnaW4gUEFSQU1TICgoc3ltYm9sUyAqLGludCxjaGFyICopKTsKLXN0YXRpYyB2b2lkIFZNU19UQlRfQmxvY2tfRW5kIFBBUkFNUyAoKHZhbHVlVCkpOwotc3RhdGljIHZvaWQgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uIFBBUkFNUyAoKGludCxpbnQsaW50LGludCkpOwotc3RhdGljIHZvaWQgVk1TX1RCVF9Tb3VyY2VfTGluZXMgUEFSQU1TICgoaW50LGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIGZwdXNoIFBBUkFNUyAoKGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIHJwdXNoIFBBUkFNUyAoKGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIGFycmF5X3N1ZmZpeCBQQVJBTVMgKChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKikpOwotc3RhdGljIHZvaWQgbmV3X2ZvcndhcmRfcmVmIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgZ2VuZXJhdGVfc3VmZml4IFBBUkFNUyAoKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqLGludCkpOwotc3RhdGljIHZvaWQgYml0ZmllbGRfc3VmZml4IFBBUkFNUyAoKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqLGludCkpOwotc3RhdGljIHZvaWQgc2V0dXBfYmFzaWNfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKikpOwotc3RhdGljIHZvaWQgVk1TX0RCR19yZWNvcmQgUEFSQU1TICgoc3RydWN0IFZNU19EQkdfU3ltYm9sICosaW50LGludCxjaGFyICopKTsKLXN0YXRpYyB2b2lkIFZNU19sb2NhbF9zdGFiX1BhcnNlIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotc3RhdGljIHZvaWQgVk1TX3N0YWJfcGFyc2UgUEFSQU1TICgoc3ltYm9sUyAqLGludCxpbnQsaW50LGludCkpOwotc3RhdGljIHZvaWQgVk1TX0dTWU1fUGFyc2UgUEFSQU1TICgoc3ltYm9sUyAqLGludCkpOwotc3RhdGljIHZvaWQgVk1TX0xDU1lNX1BhcnNlIFBBUkFNUyAoKHN5bWJvbFMgKixpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19TVFNZTV9QYXJzZSBQQVJBTVMgKChzeW1ib2xTICosaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfUlNZTV9QYXJzZSBQQVJBTVMgKChzeW1ib2xTICosc3ltYm9sUyAqLGludCkpOwotc3RhdGljIHZvaWQgVk1TX0xTWU1fUGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgRGVmaW5lX0xvY2FsX1N5bWJvbHMgUEFSQU1TICgoc3ltYm9sUyAqLHN5bWJvbFMgKixzeW1ib2xTICosaW50KSk7Ci1zdGF0aWMgdm9pZCBXcml0ZV9WTVNfTUhEX1JlY29yZHMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgV3JpdGVfVk1TX0VPTV9SZWNvcmQgUEFSQU1TICgoaW50LHZhbHVlVCkpOwotc3RhdGljIHZvaWQgVk1TX0Nhc2VfSGFja19TeW1ib2wgUEFSQU1TICgoY29uc3QgY2hhciAqLGNoYXIgKikpOwotc3RhdGljIHZvaWQgVk1TX01vZGlmeV9Qc2VjdF9BdHRyaWJ1dGVzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKixpbnQgKikpOwotc3RhdGljIHZvaWQgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyBQQVJBTVMgKChjb25zdCBjaGFyICosaW50LGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19Mb2NhbF9FbnZpcm9ubWVudF9TZXR1cCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIFZNU19FbWl0X0dsb2JhbHZhbHVlcyBQQVJBTVMgKCh1bnNpZ25lZCx1bnNpZ25lZCxjaGFyICopKTsKLXN0YXRpYyB2b2lkIFZNU19Qcm9jZWR1cmVfRW50cnlfUHQgUEFSQU1TICgoY2hhciAqLGludCxpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU2V0X1BzZWN0IFBBUkFNUyAoKGludCxpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU3RvcmVfUmVwZWF0ZWRfRGF0YSBQQVJBTVMgKChpbnQsY2hhciAqLGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19TdG9yZV9QSUNfU3ltYm9sX1JlZmVyZW5jZSBQQVJBTVMgKChzeW1ib2xTICosaW50LAotCQkJCQkJICAgIGludCxpbnQsaW50LGludCkpOwotc3RhdGljIHZvaWQgVk1TX0ZpeF9JbmRpcmVjdF9SZWZlcmVuY2UgUEFSQU1TICgoaW50LGludCxmcmFnUyAqLGZyYWdTICopKTsKLQotLyogU3VwcG9ydCBjb2RlIHdoaWNoIHVzZWQgdG8gYmUgaW5saW5lIHdpdGhpbiB2bXNfd3JpdGVfb2JqZWN0X2ZpbGUuICAqLwotc3RhdGljIHZvaWQgdm1zX2ZpeHVwX3RleHRfc2VjdGlvbiBQQVJBTVMgKCh1bnNpZ25lZCxzdHJ1Y3QgZnJhZyAqLHN0cnVjdCBmcmFnICopKTsKLXN0YXRpYyB2b2lkIHN5bnRoZXNpemVfZGF0YV9zZWdtZW50IFBBUkFNUyAoKHVuc2lnbmVkLHVuc2lnbmVkLHN0cnVjdCBmcmFnICopKTsKLXN0YXRpYyB2b2lkIHZtc19maXh1cF9kYXRhX3NlY3Rpb24gUEFSQU1TICgodW5zaWduZWQsdW5zaWduZWQpKTsKLXN0YXRpYyB2b2lkIGdsb2JhbF9zeW1ib2xfZGlyZWN0b3J5IFBBUkFNUyAoKHVuc2lnbmVkLHVuc2lnbmVkKSk7Ci1zdGF0aWMgdm9pZCBsb2NhbF9zeW1ib2xzX0RTVCBQQVJBTVMgKChzeW1ib2xTICosc3ltYm9sUyAqKSk7Ci1zdGF0aWMgdm9pZCB2bXNfYnVpbGRfRFNUIFBBUkFNUyAoKHVuc2lnbmVkKSk7Ci1zdGF0aWMgdm9pZCB2bXNfZml4dXBfeHRvcnNfc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgVk1TX1N5bWJvbCAqLCBpbnQpKTsKLQwKLQotLyogVGhlIGZvbGxvd2luZyBjb2RlIGRlZmluZXMgdGhlIHNwZWNpYWwgdHlwZXMgb2YgcHNldWRvLW9wcyB0aGF0IHdlCi0gICB1c2Ugd2l0aCBWTVMuICAqLwotCi11bnNpZ25lZCBjaGFyIGNvbnN0X2ZsYWcgPSBJTl9ERUZBVUxUX1NFQ1RJT047Ci0KLXN0YXRpYyB2b2lkCi1zX2NvbnN0IChhcmcpCi0gICAgIGludCBhcmc7CS8qIDNyZCBmaWVsZCBmcm9tIG9ial9wc2V1ZG9fdGFibGVbXTsgbm90IG5lZWRlZCBoZXJlICovCi17Ci0gIC8qIFNpbmNlIHdlIGRvbid0IG5lZWQgYGFyZycsIHVzZSBpdCBhcyBvdXIgc2NyYXRjaCB2YXJpYWJsZSBzbyB0aGF0Ci0gICAgIHdlIHdvbid0IGdldCBhbnkgIm5vdCB1c2VkIiB3YXJuaW5ncyBhYm91dCBpdC4gICovCi0gIGFyZyA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzdWJzZWdfc2V0IChTRUdfREFUQSwgKHN1YnNlZ1QpIGFyZyk7Ci0gIGNvbnN0X2ZsYWcgPSAxOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1jb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJjb25zdCIsIHNfY29uc3QsIDB9LAotICB7MCwgMCwgMH0sCi19OwkJCQkvKiBvYmpfcHNldWRvX3RhYmxlICovCi0KLQotLyogUm91dGluZSB0byBwZXJmb3JtIFJFU09MVkVfU1lNQk9MX1JFREVGSU5JVElPTigpLiAgKi8KLQotaW50Ci12bXNfcmVzb2x2ZV9zeW1ib2xfcmVkZWYgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICAvKgotICAgKglJZiB0aGUgbmV3IHN5bWJvbCBpcyAuY29tbSBBTkQgaXQgaGFzIGEgc2l6ZSBvZiB6ZXJvLAotICAgKgl3ZSBpZ25vcmUgaXQgKGkuZS4gdGhlIG9sZCBzeW1ib2wgb3ZlcnJpZGVzIGl0KQotICAgKi8KLSAgaWYgKFNFR01FTlRfVE9fU1lNQk9MX1RZUEUgKChpbnQpIG5vd19zZWcpID09IChOX1VOREYgfCBOX0VYVCkKLSAgICAgICYmIGZyYWdfbm93X2ZpeCAoKSA9PSAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oImNvbXBpbGVyIGVtaXR0ZWQgemVyby1zaXplIGNvbW1vbiBzeW1ib2wgYCVzJyBhbHJlYWR5IGRlZmluZWQiKSwKLQkgICAgICAgU19HRVRfTkFNRSAoc3ltKSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIC8qCi0gICAqCUlmIHRoZSBvbGQgc3ltYm9sIGlzIC5jb21tIGFuZCBpdCBoYXMgYSBzaXplIG9mIHplcm8sCi0gICAqCXdlIG92ZXJyaWRlIGl0IHdpdGggdGhlIG5ldyBzeW1ib2wgdmFsdWUuCi0gICAqLwotICBpZiAoU19JU19FWFRFUk5BTCAoc3ltKSAmJiBTX0lTX0RFRklORUQgKHN5bSkgJiYgU19HRVRfVkFMVUUgKHN5bSkgPT0gMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJjb21waWxlciByZWRlZmluZWQgemVyby1zaXplIGNvbW1vbiBzeW1ib2wgYCVzJyIpLAotCSAgICAgICBTX0dFVF9OQU1FIChzeW0pKTsKLSAgICAgIHN5bS0+c3lfZnJhZyAgPSBmcmFnX25vdzsKLSAgICAgIFNfU0VUX09USEVSIChzeW0sIGNvbnN0X2ZsYWcpOwotICAgICAgU19TRVRfVkFMVUUgKHN5bSwgZnJhZ19ub3dfZml4ICgpKTsKLSAgICAgIC8qIEtlZXAgTl9FWFQgYml0LiAgKi8KLSAgICAgIHN5bS0+c3lfc3ltYm9sLm5fdHlwZSB8PSBTRUdNRU5UX1RPX1NZTUJPTF9UWVBFICgoaW50KSBub3dfc2VnKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBgdGNfZnJvYl9sYWJlbCcgaGFuZGxlciBmb3IgY29sb24oc3ltYm9scy5jKSwgdXNlZCB0byBleGFtaW5lIHRoZQotICAgZHVtbXkgbGFiZWwocykgZ2NjIGluc2VydHMgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGZpbGUgaXQgZ2VuZXJhdGVzLgotICAgZ2NjIDEueCBwdXQgImdjY19jb21waWxlZC4iOyBnY2MgMi54IChhcyBvZiAyLjcpIHB1dHMgImdjYzJfY29tcGlsZWQuIgotICAgYW5kICJfX2dudV9sYW5ndWFnZV88bmFtZT4iIGFuZCBwb3NzaWJseSAiX192YXhfPHR5cGU+X2RvdWJsZXMiLiAgKi8KLQotdm9pZAotdm1zX2NoZWNrX2Zvcl9zcGVjaWFsX2xhYmVsIChzeW1ib2xQKQotc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgLyogU3BlY2lhbCBsYWJlbHMgb25seSBvY2N1ciBwcmlvciB0byBleHBsaWNpdCBzZWN0aW9uIGRpcmVjdGl2ZXMuICAqLwotICBpZiAoKGNvbnN0X2ZsYWcgJiBJTl9ERUZBVUxUX1NFQ1RJT04pICE9IDApCi0gICAgewotICAgICAgY2hhciAqc3ltX25hbWUgPSBTX0dFVF9OQU1FIChzeW1ib2xQKTsKLQotICAgICAgaWYgKCpzeW1fbmFtZSA9PSAnXycpCi0JKytzeW1fbmFtZTsKLQotICAgICAgaWYgKCFzdHJjbXAgKHN5bV9uYW1lLCAiX192YXhfZ19kb3VibGVzIikpCi0JdmF4X2dfZG91YmxlcyA9IDE7Ci0jaWYgMAkvKiBub3QgbmVjZXNzYXJ5ICovCi0gICAgICBlbHNlIGlmICghc3RyY21wIChzeW1fbmFtZSwgIl9fdmF4X2RfZG91YmxlcyIpKQotCXZheF9nX2RvdWJsZXMgPSAwOwotI2VuZGlmCi0jaWYgMAkvKiB0aGVzZSBhcmUgcG90ZW50aWFsIGFsdGVybmF0aXZlcyB0byB0Yy12YXguYydzIG1kX3BhcnNlX29wdGlvbnMoKSAqLwotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoc3ltX25hbWUsICJnY2NfY29tcGlsZWQuIikpCi0JZmxhZ19vbmUgPSAxOwotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoc3ltX25hbWUsICJfX2dudV9sYW5ndWFnZV9jcGx1c3BsdXMiKSkKLQlmbGFnX2hhc2hfbG9uZ19uYW1lcyA9IDE7Ci0jZW5kaWYKLSAgICB9Ci0gIHJldHVybjsKLX0KLQotCi12b2lkCi1vYmpfcmVhZF9iZWdpbl9ob29rICgpCi17Ci0gIHJldHVybjsKLX0KLQotCi12b2lkCi1vYmpfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgc3ltYm9sUyAqKnN5bWJvbFBQOwotICBpbnQgc3ltYm9sX251bWJlciA9IDA7Ci0KLSAgc3ltYm9sUFAgPSAmc3ltYm9sX3Jvb3RQOwkvKiAtPiBsYXN0IHN5bWJvbCBjaGFpbiBsaW5rLiAqLwotICB3aGlsZSAoKHN5bWJvbFAgPSAqc3ltYm9sUFApICE9IE5VTEwpCi0gICAgewotICAgICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbFAsIDEpOwotCi0gICAgIC8qIE9LLCBoZXJlIGlzIGhvdyB3ZSBkZWNpZGUgd2hpY2ggc3ltYm9scyBnbyBvdXQgaW50byB0aGUKLQlicmF2ZSBuZXcgc3ltdGFiLiAgU3ltYm9scyB0aGF0IGRvIGFyZToKLQotCSogc3ltYm9scyB3aXRoIG5vIG5hbWUgKHN0YWJkJ3M/KQotCSogc3ltYm9scyB3aXRoIGRlYnVnIGluZm8gaW4gdGhlaXIgTl9UWVBFCi0JKiBzeW1ib2xzIHdpdGggXDEgYXMgdGhlaXIgM3JkIGNoYXJhY3RlciAobnVtZXJpYyBsYWJlbHMpCi0JKiAibG9jYWwgbGFiZWxzIiBuZWVkZWQgZm9yIFBJQyBmaXh1cHMKLQotCVN5bWJvbHMgdGhhdCBkb24ndCBhcmU6Ci0JKiBzeW1ib2xzIHRoYXQgYXJlIHJlZ2lzdGVycwotCi0JQWxsIG90aGVyIHN5bWJvbHMgYXJlIG91dHB1dC4gIFdlIGNvbXBsYWluIGlmIGEgZGVsZXRlZAotCXN5bWJvbCB3YXMgbWFya2VkIGV4dGVybmFsLiAgKi8KLQotICAgICAgaWYgKCFTX0lTX1JFR0lTVEVSIChzeW1ib2xQKSkKLQl7Ci0JICBzeW1ib2xQLT5zeV9udW1iZXIgPSBzeW1ib2xfbnVtYmVyKys7Ci0JICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IDA7Ci0JICBzeW1ib2xQUCA9ICYoc3ltYm9sX25leHQgKHN5bWJvbFApKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKFNfSVNfRVhURVJOQUwgKHN5bWJvbFApIHx8ICFTX0lTX0RFRklORUQgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJMb2NhbCBzeW1ib2wgJXMgbmV2ZXIgZGVmaW5lZCIpLCBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0JICAgIH0JCQkvKiBvb3BzLiAqLwotCi0JICAvKiBVbmhvb2sgaXQgZnJvbSB0aGUgY2hhaW4uICAqLwotCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOwotCX0JCQkvKiBpZiB0aGlzIHN5bWJvbCBzaG91bGQgYmUgaW4gdGhlIG91dHB1dCAqLwotCi0gICAgfQkJCS8qIGZvciBlYWNoIHN5bWJvbCAqLwotCi0gIEhfU0VUX1NUUklOR19TSVpFIChoZWFkZXJzLCBzdHJpbmdfYnl0ZV9jb3VudCk7Ci0gIEhfU0VUX1NZTUJPTF9UQUJMRV9TSVpFIChoZWFkZXJzLCBzeW1ib2xfbnVtYmVyKTsKLX0JCQkJLyogb2JqX2NyYXdsX3N5bWJvbF9jaGFpbigpICovCi0MCi0KLSAvKioqKioqIFZNUyBPQkpFQ1QgRklMRSBIQUNLSU5HIFJPVVRJTkVTICoqKioqKiovCi0KLQotLyogQ3JlYXRlIHRoZSBWTVMgb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotQ3JlYXRlX1ZNU19PYmplY3RfRmlsZSAoKQotewotI2lmCWRlZmluZWQoZXVuaWNlKSB8fCAhZGVmaW5lZChWTVMpCi0gIFZNU19PYmplY3RfRmlsZV9GRCA9IGNyZWF0IChvdXRfZmlsZV9uYW1lLCAwNzc3LCAidmFyIik7Ci0jZWxzZQkvKiBldW5pY2UgKi8KLSAgVk1TX09iamVjdF9GaWxlX0ZEID0gY3JlYXQgKG91dF9maWxlX25hbWUsIDAsICJyZm09dmFyIiwKLQkJCSAgICAgICJjdHg9YmluIiwgIm1iYz0xNiIsICJkZXE9NjQiLCAiZm9wPXRlZiIsCi0JCQkgICAgICAic2hyPW5pbCIpOwotI2VuZGlmCS8qIGV1bmljZSAqLwotICAvKiBEZWFsIHdpdGggZXJyb3JzLiAgKi8KLSAgaWYgKFZNU19PYmplY3RfRmlsZV9GRCA8IDApCi0gICAgYXNfZmF0YWwgKF8oIkNvdWxkbid0IGNyZWF0ZSBWTVMgb2JqZWN0IGZpbGUgXCIlc1wiIiksIG91dF9maWxlX25hbWUpOwotICAvKiBJbml0aWFsaXplIG9iamVjdCBmaWxlIGhhY2tpbmcgdmFyaWFibGVzLiAgKi8KLSAgT2JqZWN0X1JlY29yZF9PZmZzZXQgPSAwOwotICBDdXJyZW50X09iamVjdF9SZWNvcmRfVHlwZSA9IC0xOwotfQotCi0KLS8qIEZsdXNoIHRoZSBvYmplY3QgcmVjb3JkIGJ1ZmZlciB0byB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpCi17Ci0gIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHksIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIHJldHVybjsKLQotI2lmbmRlZiBWTVMJCQkvKiBGb3IgY3Jvc3MtYXNzZW1ibHkgcHVycG9zZXMuICovCi0gIHsKLSAgICBjaGFyIFJlY0xlblsyXTsKLQotICAgIC8qICJWYXJpYWJsZS1sZW5ndGggcmVjb3JkIiBmaWxlcyBoYXZlIGEgdHdvIGJ5dGUgbGVuZ3RoIGZpZWxkCi0gICAgICAgcHJlcGVuZGVkIHRvIGVhY2ggcmVjb3JkLiAgSXQncyBub3JtYWxseSBvdXQtb2YtYmFuZCwgYW5kIG5hdGl2ZQotICAgICAgIFZNUyBvdXRwdXQgd2lsbCBpbnNlcnQgaXQgYXV0b21hdGljYWxseSBmb3IgdGhpcyB0eXBlIG9mIGZpbGUuCi0gICAgICAgV2hlbiBjcm9zcy1hc3NlbWJsaW5nLCB3ZSBtdXN0IHdyaXRlIGl0IGV4cGxpY2l0bHkuICAqLwotICAgIG1kX251bWJlcl90b19jaGFycyAoUmVjTGVuLCBPYmplY3RfUmVjb3JkX09mZnNldCwgMik7Ci0gICAgaWYgKHdyaXRlIChWTVNfT2JqZWN0X0ZpbGVfRkQsIFJlY0xlbiwgMikgIT0gMikKLSAgICAgIGVycm9yIChfKCJJL08gZXJyb3Igd3JpdGluZyBWTVMgb2JqZWN0IGZpbGUgKGxlbmd0aCBwcmVmaXgpIikpOwotICAgIC8qIFdlIGFsc28gbmVlZCB0byBmb3JjZSB0aGUgYWN0dWFsIHJlY29yZCB0byBiZSBhbiBldmVuIG51bWJlciBvZgotICAgICAgIGJ5dGVzLiAgRm9yIG5hdGl2ZSBvdXRwdXQsIHRoYXQncyBhdXRvbWF0aWM7IHdoZW4gY3Jvc3MtYXNzZW1ibGluZywKLSAgICAgICBwYWQgd2l0aCBhIE5VTCBieXRlIGlmIGxlbmd0aCBpcyBvZGQuICBEbyBzbyBfYWZ0ZXJfIHdyaXRpbmcgdGhlCi0gICAgICAgcHJlLXBhZGRlZCBsZW5ndGguICBTaW5jZSBvdXIgYnVmZmVyIGlzIGRlZmluZWQgd2l0aCBldmVuIHNpemUsCi0gICAgICAgYW4gb2RkIG9mZnNldCBpbXBsaWVzIHRoYXQgaXQgaGFzIHNvbWUgcm9vbSBsZWZ0LiAgKi8KLSAgICBpZiAoKE9iamVjdF9SZWNvcmRfT2Zmc2V0ICYgMSkgIT0gMCkKLSAgICAgIE9iamVjdF9SZWNvcmRfQnVmZmVyW09iamVjdF9SZWNvcmRfT2Zmc2V0KytdID0gJ1wwJzsKLSAgfQotI2VuZGlmIC8qIG5vdCBWTVMgKi8KLQotICAvKiBXcml0ZSB0aGUgZGF0YSB0byB0aGUgZmlsZS4gICovCi0gIGlmICh3cml0ZSAoVk1TX09iamVjdF9GaWxlX0ZELCBPYmplY3RfUmVjb3JkX0J1ZmZlciwgT2JqZWN0X1JlY29yZF9PZmZzZXQpCi0gICAgICAhPSBPYmplY3RfUmVjb3JkX09mZnNldCkKLSAgICBlcnJvciAoXygiSS9PIGVycm9yIHdyaXRpbmcgVk1TIG9iamVjdCBmaWxlIikpOwotCi0gIC8qIFRoZSBidWZmZXIgaXMgbm93IGVtcHR5LiAgKi8KLSAgT2JqZWN0X1JlY29yZF9PZmZzZXQgPSAwOwotfQotCi0KLS8qIERlY2xhcmUgYSBwYXJ0aWN1bGFyIHR5cGUgb2Ygb2JqZWN0IGZpbGUgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChUeXBlKQotICAgICBpbnQgVHlwZTsKLXsKLSAgLyogSWYgdGhlIHR5cGUgbWF0Y2hlcywgd2UgYXJlIGRvbmUuICAqLwotICBpZiAoVHlwZSA9PSBDdXJyZW50X09iamVjdF9SZWNvcmRfVHlwZSkKLSAgICByZXR1cm47Ci0gIC8qIE90aGVyd2lzZTogZmx1c2ggdGhlIGJ1ZmZlci4gICovCi0gIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLSAgLyogUmVtZW1iZXIgdGhlIG5ldyB0eXBlLiAgKi8KLSAgQ3VycmVudF9PYmplY3RfUmVjb3JkX1R5cGUgPSBUeXBlOwotfQotCi0KLS8qIENsb3NlIHRoZSBWTVMgT2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotQ2xvc2VfVk1TX09iamVjdF9GaWxlICgpCi17Ci0gIC8qIEZsdXNoIChzaG91bGQgbmV2ZXIgYmUgbmVjZXNzYXJ5KSBhbmQgcmVzZXQgc2F2ZWQgcmVjb3JkLXR5cGUgY29udGV4dC4gICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkICgtMSk7Ci0KLSNpZm5kZWYgVk1TCQkJLyogRm9yIGNyb3NzLWFzc2VtYmx5IHB1cnBvc2VzLiAqLwotICB7Ci0gICAgY2hhciBSZWNMZW5bMl07Ci0gICAgaW50IG1pbnVzX29uZSA9IC0xOwotCi0gICAgLyogV3JpdGUgYSAyIGJ5dGUgcmVjb3JkLWxlbmd0aCBmaWVsZCBvZiAtMSBpbnRvIHRoZSBmaWxlLCB3aGljaAotICAgICAgIG1lYW5zIGVuZC1vZi1ibG9jayB3aGVuIHJlYWQsIGhlbmNlIGVuZC1vZi1maWxlIHdoZW4gb2NjdXJyaW5nCi0gICAgICAgaW4gdGhlIGZpbGUncyBsYXN0IGJsb2NrLiAgSXQgaXMgb25seSBuZWVkZWQgZm9yIHZhcmlhYmxlLWxlbmd0aAotICAgICAgIHJlY29yZCBmaWxlcyB0cmFuc2ZlcnJlZCB0byBWTVMgYXMgZml4ZWQtbGVuZ3RoIHJlY29yZCBmaWxlcwotICAgICAgICh0eXBpY2FsIGZvciBiaW5hcnkgRlRQOyBORlMgc2hvdWxkbid0IG5lZWQgaXQsIGJ1dCBpdCB3b24ndCBodXJ0KS4gICovCi0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChSZWNMZW4sIG1pbnVzX29uZSwgMik7Ci0gICAgd3JpdGUgKFZNU19PYmplY3RfRmlsZV9GRCwgUmVjTGVuLCAyKTsKLSAgfQotI2Vsc2UKLSAgICAvKiBXaGVuIHdyaXR0ZW4gb24gYSBWTVMgc3lzdGVtLCB0aGUgZmlsZSBoZWFkZXIgKGNmIGlub2RlKSB3aWxsIHJlY29yZAotICAgICAgIHRoZSBhY3R1YWwgZW5kLW9mLWZpbGUgcG9zaXRpb24gYW5kIG5vIGlubGluZSBtYXJrZXIgaXMgbmVlZGVkLiAgKi8KLSNlbmRpZgotCi0gIGNsb3NlIChWTVNfT2JqZWN0X0ZpbGVfRkQpOwotfQotDAotCi0gLyoqKioqKiBUZXh0IEluZm9ybWF0aW9uIGFuZCBSZWxvY2F0aW9uIHJvdXRpbmVzICoqKioqKi8KLQotCi0vKiBTdGFjayBQc2VjdCBiYXNlIGZvbGxvd2VkIGJ5IHNpZ25lZCwgdmFyeWluZy1zaXplZCBvZmZzZXQuCi0gICBDb21tb24gdG8gc2V2ZXJhbCBvYmplY3QgcmVjb3Jkcy4gICovCi0KLXN0YXRpYyB2b2lkCi12bXNfdGlyX3N0YWNrX3BzZWN0IChQc2VjdF9JbmRleCwgT2Zmc2V0LCBGb3JjZSkKLSAgICAgaW50IFBzZWN0X0luZGV4OwotICAgICBpbnQgT2Zmc2V0OwotICAgICBpbnQgRm9yY2U7Ci17Ci0gIGludCBwc2VjdF93aWR0aCwgb2Zmc2V0X3dpZHRoOwotCi0gIHBzZWN0X3dpZHRoID0gKCh1bnNpZ25lZCkgUHNlY3RfSW5kZXggPiAyNTUpID8gMiA6IDE7Ci0gIG9mZnNldF93aWR0aCA9IChGb3JjZSB8fCBPZmZzZXQgPiAzMjc2NyB8fCBPZmZzZXQgPCAtMzI3NjgpID8gNAotCQkgOiAoT2Zmc2V0ID4gMTI3IHx8IE9mZnNldCA8IC0xMjgpID8gMiA6IDE7Ci0jZGVmaW5lIFN0YV9QKHAsbykgKCgobyk8PDEpIHwgKChwKS0xKSkKLSAgLyogYnl0ZSBvciB3b3JkIHBzZWN0OyBieXRlLCB3b3JkLCBvciBsb25nd29yZCBvZmZzZXQgKi8KLSAgc3dpdGNoIChTdGFfUChwc2VjdF93aWR0aCxvZmZzZXRfd2lkdGgpKQotICAgIHsKLSAgICAgIGNhc2UgU3RhX1AoMSwxKToJUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1BCKTsKLQkJCVBVVF9DSEFSICgoY2hhcikodW5zaWduZWQgY2hhcikgUHNlY3RfSW5kZXgpOwotCQkJUFVUX0NIQVIgKChjaGFyKSBPZmZzZXQpOwotCQkJYnJlYWs7Ci0gICAgICBjYXNlIFN0YV9QKDEsMik6CVBVVF9DSEFSIChUSVJfU19DX1NUQV9QVyk7Ci0JCQlQVVRfQ0hBUiAoKGNoYXIpKHVuc2lnbmVkIGNoYXIpIFBzZWN0X0luZGV4KTsKLQkJCVBVVF9TSE9SVCAoT2Zmc2V0KTsKLQkJCWJyZWFrOwotICAgICAgY2FzZSBTdGFfUCgxLDQpOglQVVRfQ0hBUiAoVElSX1NfQ19TVEFfUEwpOwotCQkJUFVUX0NIQVIgKChjaGFyKSh1bnNpZ25lZCBjaGFyKSBQc2VjdF9JbmRleCk7Ci0JCQlQVVRfTE9ORyAoT2Zmc2V0KTsKLQkJCWJyZWFrOwotICAgICAgY2FzZSBTdGFfUCgyLDEpOglQVVRfQ0hBUiAoVElSX1NfQ19TVEFfV1BCKTsKLQkJCVBVVF9TSE9SVCAoUHNlY3RfSW5kZXgpOwotCQkJUFVUX0NIQVIgKChjaGFyKSBPZmZzZXQpOwotCQkJYnJlYWs7Ci0gICAgICBjYXNlIFN0YV9QKDIsMik6CVBVVF9DSEFSIChUSVJfU19DX1NUQV9XUFcpOwotCQkJUFVUX1NIT1JUIChQc2VjdF9JbmRleCk7Ci0JCQlQVVRfU0hPUlQgKE9mZnNldCk7Ci0JCQlicmVhazsKLSAgICAgIGNhc2UgU3RhX1AoMiw0KToJUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1dQTCk7Ci0JCQlQVVRfU0hPUlQgKFBzZWN0X0luZGV4KTsKLQkJCVBVVF9MT05HIChPZmZzZXQpOwotCQkJYnJlYWs7Ci0gICAgfQotI3VuZGVmIFN0YV9QCi19Ci0KLQotLyogU3RvcmUgaW1tZWRpYXRlIGRhdGEgaW4gY3VycmVudCBQc2VjdC4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKFBvaW50ZXIsIFNpemUsIFJlY29yZF9UeXBlKQotICAgICBjb25zdCBjaGFyICpQb2ludGVyOwotICAgICBpbnQgU2l6ZTsKLSAgICAgaW50IFJlY29yZF9UeXBlOwotewotICByZWdpc3RlciBpbnQgaTsKLQotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoUmVjb3JkX1R5cGUpOwotICAvKiBXZSBjYW4gb25seSBzdG9yZSBhcyBtb3N0IDEyOCBieXRlcyBhdCBhIHRpbWUgZHVlIHRvIHRoZSB3YXkgdGhhdAotICAgICBUSVIgY29tbWFuZHMgYXJlIGVuY29kZWQuICAqLwotICB3aGlsZSAoU2l6ZSA+IDApCi0gICAgewotICAgICAgaSA9IChTaXplID4gMTI4KSA/IDEyOCA6IFNpemU7Ci0gICAgICBTaXplIC09IGk7Ci0gICAgICAvKiBJZiB3ZSBjYW5ub3QgYWNjb21tb2RhdGUgdGhpcyByZWNvcmQsIGZsdXNoIHRoZSBidWZmZXIuICAqLwotICAgICAgaWYgKChPYmplY3RfUmVjb3JkX09mZnNldCArIGkgKyAxKSA+PSBzaXplb2YgT2JqZWN0X1JlY29yZF9CdWZmZXIpCi0JRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotICAgICAgLyogSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCByZWNvcmQgdHlwZS4gICovCi0gICAgICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLQlQVVRfQ0hBUiAoUmVjb3JkX1R5cGUpOwotICAgICAgLyogU3RvcmUgdGhlIGNvdW50LiAgVGhlIFN0b3JlIEltbWVkaWF0ZSBUSVIgY29tbWFuZCBpcyBpbXBsaWVkIGJ5Ci0gICAgICAgICBhIG5lZ2F0aXZlIGNvbW1hbmQgYnl0ZSwgYW5kIHRoZSBsZW5ndGggb2YgdGhlIGltbWVkaWF0ZSBkYXRhCi0gICAgICAgICBpcyBhYnMoY29tbWFuZF9ieXRlKS4gIFNvLCB3ZSB3cml0ZSB0aGUgbmVnYXRlZCBsZW5ndGggdmFsdWUuICAqLwotICAgICAgUFVUX0NIQVIgKChjaGFyKSAoLWkgJiAweGZmKSk7Ci0gICAgICAvKiBOb3cgc3RvcmUgdGhlIGRhdGEuICAqLwotICAgICAgd2hpbGUgKC0taSA+PSAwKQotCVBVVF9DSEFSICgqUG9pbnRlcisrKTsKLSAgICB9Ci0gIC8qIEZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQotCi0vKiBNYWtlIGEgZGF0YSByZWZlcmVuY2UuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX1NldF9EYXRhIChQc2VjdF9JbmRleCwgT2Zmc2V0LCBSZWNvcmRfVHlwZSwgRm9yY2UpCi0gICAgIGludCBQc2VjdF9JbmRleDsKLSAgICAgaW50IE9mZnNldDsKLSAgICAgaW50IFJlY29yZF9UeXBlOwotICAgICBpbnQgRm9yY2U7Ci17Ci0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChSZWNvcmRfVHlwZSk7Ci0gIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIHJlY29yZCB0eXBlLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKFJlY29yZF9UeXBlKTsKLSAgLyogU3RhY2sgdGhlIFBzZWN0IGJhc2Ugd2l0aCBpdHMgb2Zmc2V0LiAgKi8KLSAgdm1zX3Rpcl9zdGFja19wc2VjdCAoUHNlY3RfSW5kZXgsIE9mZnNldCwgRm9yY2UpOwotICAvKiBTZXQgcmVsb2NhdGlvbiBiYXNlLiAgKi8KLSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RPX1BJRFIpOwotICAvKiBGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbC4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0KLQotLyogTWFrZSBhIGRlYnVnZ2VyIHJlZmVyZW5jZSB0byBhIHN0cnVjdCwgdW5pb24gb3IgZW51bS4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfU3RvcmVfU3RydWN0IChTdHJ1Y3RfSW5kZXgpCi0gICAgIGludCBTdHJ1Y3RfSW5kZXg7Ci17Ci0gIC8qIFdlIGFyZSB3cml0aW5nIGEgZGVidWcgcmVjb3JkLiAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfREJHKTsKLSAgLyogSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCB0aGUgcmVjb3JkIHR5cGUuICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoT0JKX1NfQ19EQkcpOwotICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfVVcpOwotICBQVVRfU0hPUlQgKFN0cnVjdF9JbmRleCk7Ci0gIFBVVF9DSEFSIChUSVJfU19DX0NUTF9TVEtETCk7Ci0gIFBVVF9DSEFSIChUSVJfU19DX1NUT19MKTsKLSAgLyogRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwuICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotCi0KLS8qIE1ha2UgYSBkZWJ1Z2dlciByZWZlcmVuY2UgdG8gcGFydGlhbGx5IGRlZmluZSBhIHN0cnVjdCwgdW5pb24gb3IgZW51bS4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfRGVmX1N0cnVjdCAoU3RydWN0X0luZGV4KQotICAgICBpbnQgU3RydWN0X0luZGV4OwotewotICAvKiBXZSBhcmUgd3JpdGluZyBhIGRlYnVnIHJlY29yZC4gICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0RCRyk7Ci0gIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIHJlY29yZCB0eXBlLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfREJHKTsKLSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1VXKTsKLSAgUFVUX1NIT1JUIChTdHJ1Y3RfSW5kZXgpOwotICBQVVRfQ0hBUiAoVElSX1NfQ19DVExfREZMT0MpOwotICAvKiBGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbC4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1WTVNfU2V0X1N0cnVjdCAoU3RydWN0X0luZGV4KQotICAgICBpbnQgU3RydWN0X0luZGV4OwotewkJCQkvKiBzZWUgcHJldmlvdXMgZnVuY3Rpb25zIGZvciBjb21tZW50cyAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoT0JKX1NfQ19EQkcpOwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoT0JKX1NfQ19EQkcpOwotICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfVVcpOwotICBQVVRfU0hPUlQgKFN0cnVjdF9JbmRleCk7Ci0gIFBVVF9DSEFSIChUSVJfU19DX0NUTF9TVExPQyk7Ci0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0MCi0KLSAvKioqKioqIFRyYWNlYmFjayBJbmZvcm1hdGlvbiByb3V0aW5lcyAqKioqKiovCi0KLQotLyogV3JpdGUgdGhlIFRyYWNlYmFjayBNb2R1bGUgQmVnaW4gcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19UQlRfTW9kdWxlX0JlZ2luICgpCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKmNwLCAqY3AxOwotICBpbnQgU2l6ZTsKLSAgY2hhciBMb2NhbFsyNTZdOwotCi0gIC8qIEFycmFuZ2UgdG8gc3RvcmUgdGhlIGRhdGEgbG9jYWxseSAobGVhdmUgcm9vbSBmb3Igc2l6ZSBieXRlKS4gICovCi0gIGNwID0gJkxvY2FsWzFdOwotICAvKiBCZWdpbiBtb2R1bGUuICAqLwotICAqY3ArKyA9IERTVF9TX0NfTU9EQkVHOwotICAqY3ArKyA9IDA7CQkvKiBmbGFnczsgbm90IHVzZWQgKi8KLSAgLyoKLSAgICoJTGFuZ3VhZ2UgdHlwZSA9PSAiQyIKLSAgICoKLSAgICogKEZJWE1FOiAgdGhpcyBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGlucHV0Li4uKQotICAgKi8KLSAgQ09QWV9MT05HIChjcCwgRFNUX1NfQ19DKTsKLSAgY3AgKz0gNDsKLSAgLyogU3RvcmUgdGhlIG1vZHVsZSBuYW1lLiAgKi8KLSAgKmNwKysgPSAoY2hhcikgc3RybGVuIChNb2R1bGVfTmFtZSk7Ci0gIGNwMSA9IE1vZHVsZV9OYW1lOwotICB3aGlsZSAoKmNwMSkKLSAgICAqY3ArKyA9ICpjcDErKzsKLSAgLyogTm93IHdlIGNhbiBzdG9yZSB0aGUgcmVjb3JkIHNpemUuICAqLwotICBTaXplID0gKGNwIC0gTG9jYWwpOwotICBMb2NhbFswXSA9IFNpemUgLSAxOwotICAvKiBQdXQgaXQgaW50byB0aGUgb2JqZWN0IHJlY29yZC4gICovCi0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIFNpemUsIE9CSl9TX0NfVEJUKTsKLX0KLQotCi0vKiBXcml0ZSB0aGUgVHJhY2ViYWNrIE1vZHVsZSBFbmQgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19UQlRfTW9kdWxlX0VuZCAoKQotewotICBjaGFyIExvY2FsWzJdOwotCi0gIC8qIEVuZCBtb2R1bGUuICAqLwotICBMb2NhbFswXSA9IDE7Ci0gIExvY2FsWzFdID0gRFNUX1NfQ19NT0RFTkQ7Ci0gIC8qIFB1dCBpdCBpbnRvIHRoZSBvYmplY3QgcmVjb3JkLiAgKi8KLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgMiwgT0JKX1NfQ19UQlQpOwotfQotCi0KLS8qIFdyaXRlIGEgVHJhY2ViYWNrIFJvdXRpbmUgQmVnaW4gcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19UQlRfUm91dGluZV9CZWdpbiAoc3ltYm9sUCwgUHNlY3QpCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci0gICAgIGludCBQc2VjdDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqY3AsICpjcDE7Ci0gIGNoYXIgKk5hbWU7Ci0gIGludCBPZmZzZXQ7Ci0gIGludCBTaXplOwotICBjaGFyIExvY2FsWzUxMl07Ci0KLSAgLyogU3RyaXAgdGhlIGxlYWRpbmcgIl8iIGZyb20gdGhlIG5hbWUuICAqLwotICBOYW1lID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7Ci0gIGlmICgqTmFtZSA9PSAnXycpCi0gICAgTmFtZSsrOwotICAvKiBHZXQgdGhlIHRleHQgcHNlY3Qgb2Zmc2V0LiAgKi8KLSAgT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotICAvKiBTZXQgdGhlIHJlY29yZCBzaXplLiAgKi8KLSAgU2l6ZSA9IDEgKyAxICsgNCArIDEgKyBzdHJsZW4gKE5hbWUpOwotICBMb2NhbFswXSA9IFNpemU7Ci0gIC8qIERTVCB0eXBlICJyb3V0aW5lIGJlZ2luIi4gICovCi0gIExvY2FsWzFdID0gRFNUX1NfQ19SVE5CRUc7Ci0gIC8qIFVzZXMgQ2FsbFMvQ2FsbEcuICAqLwotICBMb2NhbFsyXSA9IDA7Ci0gIC8qIFN0b3JlIHRoZSBkYXRhIHNvIGZhci4gICovCi0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDMsIE9CSl9TX0NfVEJUKTsKLSAgLyogTWFrZSBzdXJlIHdlIGFyZSBzdGlsbCBnZW5lcmF0aW5nIGEgT0JKX1NfQ19UQlQgcmVjb3JkLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfVEJUKTsKLSAgLyogU3RhY2sgdGhlIGFkZHJlc3MuICAqLwotICB2bXNfdGlyX3N0YWNrX3BzZWN0IChQc2VjdCwgT2Zmc2V0LCAwKTsKLSAgLyogU3RvcmUgdGhlIGRhdGEgcmVmZXJlbmNlLiAgKi8KLSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RPX1BJRFIpOwotICAvKiBTdG9yZSB0aGUgY291bnRlZCBzdHJpbmcgYXMgZGF0YS4gICovCi0gIGNwID0gTG9jYWw7Ci0gIGNwMSA9IE5hbWU7Ci0gIFNpemUgPSBzdHJsZW4gKGNwMSkgKyAxOwotICAqY3ArKyA9IFNpemUgLSAxOwotICB3aGlsZSAoKmNwMSkKLSAgICAqY3ArKyA9ICpjcDErKzsKLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgU2l6ZSwgT0JKX1NfQ19UQlQpOwotfQotCi0KLS8qIFdyaXRlIGEgVHJhY2ViYWNrIFJvdXRpbmUgRW5kIHJlY29yZC4KLQotICAgV2UgKm11c3QqIHNlYXJjaCB0aGUgc3ltYm9sIHRhYmxlIHRvIGZpbmQgdGhlIG5leHQgcm91dGluZSwgc2luY2UgdGhlCi0gICBhc3NlbWJlciBoYXMgYSB3YXkgb2YgcmVhc3NlbWJsaW5nIHRoZSBzeW1ib2wgdGFibGUgT1VUIE9GIE9SREVSIFRodXMKLSAgIHRoZSBuZXh0IHJvdXRpbmUgaW4gdGhlIHN5bWJvbCBsaXN0IGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgbmV4dCBvbmUgaW4KLSAgIG1lbW9yeS4gIEZvciBkZWJ1Z2dpbmcgdG8gd29yayBjb3JyZWN0bHkgd2UgbXVzdCBrbm93IHRoZSBzaXplIG9mIHRoZQotICAgcm91dGluZS4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfVEJUX1JvdXRpbmVfRW5kIChNYXhfU2l6ZSwgc3ApCi0gICAgIGludCBNYXhfU2l6ZTsKLSAgICAgc3ltYm9sUyAqc3A7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGludCBTaXplID0gMHg3ZmZmZmZmZjsKLSAgY2hhciBMb2NhbFsxNl07Ci0gIHZhbHVlVCBzeW1fdmFsdWUsIHNwX3ZhbHVlID0gU19HRVRfVkFMVUUgKHNwKTsKLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgaWYgKCFTX0lTX0RFQlVHIChzeW1ib2xQKSAmJiBTX0dFVF9UWVBFIChzeW1ib2xQKSA9PSBOX1RFWFQpCi0JewotCSAgaWYgKCpTX0dFVF9OQU1FIChzeW1ib2xQKSA9PSAnTCcpCi0JICAgIGNvbnRpbnVlOwotCSAgc3ltX3ZhbHVlID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCSAgaWYgKHN5bV92YWx1ZSA+IHNwX3ZhbHVlICYmIHN5bV92YWx1ZSA8IFNpemUpCi0JICAgIFNpemUgPSBzeW1fdmFsdWU7Ci0KLQkgIC8qCi0JICAgKiBEdW1teSBsYWJlbHMgbGlrZSAiZ2NjX2NvbXBpbGVkLiIgc2hvdWxkIG5vIGxvbmdlciByZWFjaCBoZXJlLgotCSAgICovCi0jaWYgMAotCSAgZWxzZQotCSAgLyogY2hlY2sgaWYgZ2NjX2NvbXBpbGVkLiBoYXMgc2l6ZSBvZiB6ZXJvICovCi0JICBpZiAoc3ltX3ZhbHVlID09IHNwX3ZhbHVlICYmCi0JICAgICAgc3AgIT0gc3ltYm9sUCAmJgotCSAgICAgICghc3RyY21wIChTX0dFVF9OQU1FIChzcCksICJnY2NfY29tcGlsZWQuIikgfHwKLQkgICAgICAgIXN0cmNtcCAoU19HRVRfTkFNRSAoc3ApLCAiZ2NjMl9jb21waWxlZC4iKSkpCi0JICAgIFNpemUgPSBzeW1fdmFsdWU7Ci0jZW5kaWYKLQl9Ci0gICAgfQotICBpZiAoU2l6ZSA9PSAweDdmZmZmZmZmKQotICAgIFNpemUgPSBNYXhfU2l6ZTsKLSAgU2l6ZSAtPSBzcF92YWx1ZTsJCS8qIGFuZCBnZXQgdGhlIHNpemUgb2YgdGhlIHJvdXRpbmUgKi8KLSAgLyogUmVjb3JkIFNpemUuICAqLwotICBMb2NhbFswXSA9IDY7Ci0gIC8qIERTVCB0eXBlIGlzICJyb3V0aW5lIGVuZCIuICAqLwotICBMb2NhbFsxXSA9IERTVF9TX0NfUlRORU5EOwotICBMb2NhbFsyXSA9IDA7CQkvKiB1bnVzZWQgKi8KLSAgLyogU2l6ZSBvZiByb3V0aW5lLiAgKi8KLSAgQ09QWV9MT05HICgmTG9jYWxbM10sIFNpemUpOwotICAvKiBTdG9yZSB0aGUgcmVjb3JkLiAgKi8KLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgNywgT0JKX1NfQ19UQlQpOwotfQotCi0KLS8qIFdyaXRlIGEgVHJhY2ViYWNrIEJsb2NrIEJlZ2luIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfVEJUX0Jsb2NrX0JlZ2luIChzeW1ib2xQLCBQc2VjdCwgTmFtZSkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgICAgaW50IFBzZWN0OwotICAgICBjaGFyICpOYW1lOwotewotICByZWdpc3RlciBjaGFyICpjcCwgKmNwMTsKLSAgaW50IE9mZnNldDsKLSAgaW50IFNpemU7Ci0gIGNoYXIgTG9jYWxbNTEyXTsKLQotICAvKiBTZXQgdGhlIHJlY29yZCBzaXplLiAgKi8KLSAgU2l6ZSA9IDEgKyAxICsgNCArIDEgKyBzdHJsZW4gKE5hbWUpOwotICBMb2NhbFswXSA9IFNpemU7Ci0gIC8qIERTVCB0eXBlIGlzICJiZWdpbiBibG9jayI7IHdlIHNpbXVsYXRlIHdpdGggYSBwaG9ueSByb3V0aW5lLiAgKi8KLSAgTG9jYWxbMV0gPSBEU1RfU19DX0JMS0JFRzsKLSAgLyogVXNlcyBDYWxsUy9DYWxsRy4gICovCi0gIExvY2FsWzJdID0gMDsKLSAgLyogU3RvcmUgdGhlIGRhdGEgc28gZmFyLiAgKi8KLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgMywgT0JKX1NfQ19EQkcpOwotICAvKiBNYWtlIHN1cmUgd2UgYXJlIHN0aWxsIGdlbmVyYXRpbmcgYSBkZWJ1ZyByZWNvcmQuICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoT0JKX1NfQ19EQkcpOwotICAvKiBOb3cgZ2V0IHRoZSBzeW1ib2wgYWRkcmVzcy4gICovCi0gIFBVVF9DSEFSIChUSVJfU19DX1NUQV9XUEwpOwotICBQVVRfU0hPUlQgKFBzZWN0KTsKLSAgLyogR2V0IHRoZSB0ZXh0IHBzZWN0IG9mZnNldC4gICovCi0gIE9mZnNldCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLSAgUFVUX0xPTkcgKE9mZnNldCk7Ci0gIC8qIFN0b3JlIHRoZSBkYXRhIHJlZmVyZW5jZS4gICovCi0gIFBVVF9DSEFSIChUSVJfU19DX1NUT19QSURSKTsKLSAgLyogU3RvcmUgdGhlIGNvdW50ZWQgc3RyaW5nIGFzIGRhdGEuICAqLwotICBjcCA9IExvY2FsOwotICBjcDEgPSBOYW1lOwotICBTaXplID0gc3RybGVuIChjcDEpICsgMTsKLSAgKmNwKysgPSBTaXplIC0gMTsKLSAgd2hpbGUgKCpjcDEpCi0gICAgKmNwKysgPSAqY3AxKys7Ci0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIFNpemUsIE9CSl9TX0NfREJHKTsKLX0KLQotCi0vKiBXcml0ZSBhIFRyYWNlYmFjayBCbG9jayBFbmQgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19UQlRfQmxvY2tfRW5kIChTaXplKQotICAgICB2YWx1ZVQgU2l6ZTsKLXsKLSAgY2hhciBMb2NhbFsxNl07Ci0KLSAgTG9jYWxbMF0gPSA2OwkJLyogcmVjb3JkIGxlbmd0aCAqLwotICAvKiBEU1QgdHlwZSBpcyAiYmxvY2sgZW5kIjsgc2ltdWxhdGUgd2l0aCBhIHBob255IGVuZCByb3V0aW5lLiAgKi8KLSAgTG9jYWxbMV0gPSBEU1RfU19DX0JMS0VORDsKLSAgTG9jYWxbMl0gPSAwOwkJLyogdW51c2VkLCBtdXN0IGJlIHplcm8gKi8KLSAgQ09QWV9MT05HICgmTG9jYWxbM10sIFNpemUpOwotICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCA3LCBPQkpfU19DX0RCRyk7Ci19Ci0MCi0KLS8qIFdyaXRlIGEgTGluZSBudW1iZXIgPC0+IFByb2dyYW0gQ291bnRlciBjb3JyZWxhdGlvbiByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uIChMaW5lX051bWJlciwgT2Zmc2V0LCBQc2VjdCwgRG9fRGVsdGEpCi0gICAgIGludCBMaW5lX051bWJlcjsKLSAgICAgaW50IE9mZnNldDsKLSAgICAgaW50IFBzZWN0OwotICAgICBpbnQgRG9fRGVsdGE7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKmNwOwotICBjaGFyIExvY2FsWzY0XTsKLQotICBpZiAoRG9fRGVsdGEgPT0gMCkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogIElmIG5vdCBkZWx0YSwgc2V0IG91ciBQQy9MaW5lIG51bWJlciBjb3JyZWxhdGlvbi4KLSAgICAgICAqLwotICAgICAgY3AgPSAmTG9jYWxbMV07CS8qIFB1dCBzaXplIGluIExvY2FsWzBdIGxhdGVyLiAgKi8KLSAgICAgIC8qIERTVCB0eXBlIGlzICJMaW5lIE51bWJlci9QQyBjb3JyZWxhdGlvbiIuICAqLwotICAgICAgKmNwKysgPSBEU1RfU19DX0xJTkVfTlVNOwotICAgICAgLyogU2V0IExpbmUgbnVtYmVyLiAgKi8KLSAgICAgIGlmIChMaW5lX051bWJlciAtIDEgPD0gMjU1KQotCXsKLQkgICpjcCsrID0gRFNUX1NfQ19TRVRfTElOVU1fQjsKLQkgICpjcCsrID0gKGNoYXIpIChMaW5lX051bWJlciAtIDEpOwotCX0KLSAgICAgIGVsc2UgaWYgKExpbmVfTnVtYmVyIC0gMSA8PSA2NTUzNSkKLQl7Ci0JICAqY3ArKyA9IERTVF9TX0NfU0VUX0xJTkVfTlVNOwotCSAgQ09QWV9TSE9SVCAoY3AsIExpbmVfTnVtYmVyIC0gMSksICBjcCArPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqY3ArKyA9IERTVF9TX0NfU0VUX0xJTlVNX0w7Ci0JICBDT1BZX0xPTkcgKGNwLCBMaW5lX051bWJlciAtIDEpLCAgY3AgKz0gNDsKLQl9Ci0gICAgICAvKiBTZXQgUEMuICAqLwotICAgICAgKmNwKysgPSBEU1RfU19DX1NFVF9BQlNfUEM7Ci0gICAgICAvKiBTdG9yZSBzaXplIG5vdyB0aGF0IHdlIGtub3cgaXQsIHRoZW4gb3V0cHV0IHRoZSBkYXRhLiAgKi8KLSAgICAgIExvY2FsWzBdID0gY3AgLSAmTG9jYWxbMV07Ci0JLyogQWNjb3VudCBmb3IgdGhlIHNwYWNlIHRoYXQgVElSX1NfQ19TVE9fUElEUiB3aWxsIHVzZSBmb3IgdGhlIFBDLiAgKi8KLQlMb2NhbFswXSArPSA0OwkJLyogc2l6ZSBpbmNsdWRlcyBsZW5ndGggb2YgYW5vdGhlciBsb25nd29yZCAqLwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgY3AgLSBMb2NhbCwgT0JKX1NfQ19UQlQpOwotICAgICAgLyogTWFrZSBzdXJlIHdlIGFyZSBzdGlsbCBnZW5lcmF0aW5nIGEgT0JKX1NfQ19UQlQgcmVjb3JkLiAgKi8KLSAgICAgIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotCVBVVF9DSEFSIChPQkpfU19DX1RCVCk7Ci0gICAgICB2bXNfdGlyX3N0YWNrX3BzZWN0IChQc2VjdCwgT2Zmc2V0LCAwKTsKLSAgICAgIFBVVF9DSEFSIChUSVJfU19DX1NUT19QSURSKTsKLSAgICAgIC8qIERvIGEgUEMgb2Zmc2V0IG9mIDAgdG8gcmVnaXN0ZXIgdGhlIGxpbmUgbnVtYmVyLiAgKi8KLSAgICAgIExvY2FsWzBdID0gMjsKLSAgICAgIExvY2FsWzFdID0gRFNUX1NfQ19MSU5FX05VTTsKLSAgICAgIExvY2FsWzJdID0gMDsJCS8qIEluY3JlbWVudCBQQyBieSAwIGFuZCByZWdpc3RlciBsaW5lICMgKi8KLSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDMsIE9CSl9TX0NfVEJUKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoRG9fRGVsdGEgPCAwKQotCXsKLQkgIC8qCi0JICAgKiAgV2hlbiBkZWx0YSBpcyBuZWdhdGl2ZSwgdGVybWluYXRlIHRoZSBsaW5lIG51bWJlcnMuCi0JICAgKi8KLQkgIExvY2FsWzBdID0gMSArIDEgKyA0OwotCSAgTG9jYWxbMV0gPSBEU1RfU19DX0xJTkVfTlVNOwotCSAgTG9jYWxbMl0gPSBEU1RfU19DX1RFUk1fTDsKLQkgIENPUFlfTE9ORyAoJkxvY2FsWzNdLCBPZmZzZXQpOwotCSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgNywgT0JKX1NfQ19UQlQpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIC8qCi0gICAgICAgKiAgRG8gYSBQQy9MaW5lIGRlbHRhLgotICAgICAgICovCi0gICAgICBjcCA9ICZMb2NhbFsxXTsKLSAgICAgICpjcCsrID0gRFNUX1NfQ19MSU5FX05VTTsKLSAgICAgIGlmIChMaW5lX051bWJlciA+IDEpCi0JewotCSAgLyogV2UgbmVlZCB0byBpbmNyZW1lbnQgdGhlIGxpbmUgbnVtYmVyLiAgKi8KLQkgIGlmIChMaW5lX051bWJlciAtIDEgPD0gMjU1KQotCSAgICB7Ci0JICAgICAgKmNwKysgPSBEU1RfU19DX0lOQ1JfTElOVU07Ci0JICAgICAgKmNwKysgPSBMaW5lX051bWJlciAtIDE7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKExpbmVfTnVtYmVyIC0gMSA8PSA2NTUzNSkKLQkgICAgewotCSAgICAgICpjcCsrID0gRFNUX1NfQ19JTkNSX0xJTlVNX1c7Ci0JICAgICAgQ09QWV9TSE9SVCAoY3AsIExpbmVfTnVtYmVyIC0gMSksICBjcCArPSAyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAqY3ArKyA9IERTVF9TX0NfSU5DUl9MSU5VTV9MOwotCSAgICAgIENPUFlfTE9ORyAoY3AsIExpbmVfTnVtYmVyIC0gMSksICBjcCArPSA0OwotCSAgICB9Ci0JfQotICAgICAgLyoKLSAgICAgICAqCUluY3JlbWVudCB0aGUgUEMKLSAgICAgICAqLwotICAgICAgaWYgKE9mZnNldCA8PSAxMjgpCi0JewotCSAgLyogU21hbGwgb2Zmc2V0cyBhcmUgZW5jb2RlZCBhcyBuZWdhdGl2ZSBudW1iZXJzLCByYXRoZXIgdGhhbiB0aGUKLQkgICAgIHVzdWFsIG5vbi1uZWdhdGl2ZSB0eXBlIGNvZGUgZm9sbG93ZWQgYnkgYW5vdGhlciBkYXRhIGZpZWxkLiAgKi8KLQkgICpjcCsrID0gKGNoYXIpIC1PZmZzZXQ7Ci0JfQotICAgICAgZWxzZSBpZiAoT2Zmc2V0IDw9IDY1NTM1KQotCXsKLQkgICpjcCsrID0gRFNUX1NfQ19ERUxUQV9QQ19XOwotCSAgQ09QWV9TSE9SVCAoY3AsIE9mZnNldCksICBjcCArPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqY3ArKyA9IERTVF9TX0NfREVMVEFfUENfTDsKLQkgIENPUFlfTE9ORyAoY3AsIE9mZnNldCksICBjcCArPSA0OwotCX0KLSAgICAgIC8qIFNldCBzaXplIG5vdyB0aGF0IGJlIGtub3cgaXQsIHRoZW4gb3V0cHV0IHRoZSBkYXRhLiAgKi8KLSAgICAgIExvY2FsWzBdID0gY3AgLSAmTG9jYWxbMV07Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBjcCAtIExvY2FsLCBPQkpfU19DX1RCVCk7Ci0gICAgfQotfQotDAotCi0vKiBEZXNjcmliZSBhIHNvdXJjZSBmaWxlIHRvIHRoZSBkZWJ1Z2dlci4gICovCi0KLXN0YXRpYyBpbnQKLVZNU19UQlRfU291cmNlX0ZpbGUgKEZpbGVuYW1lLCBJRF9OdW1iZXIpCi0gICAgIGNoYXIgKkZpbGVuYW1lOwotICAgICBpbnQgSURfTnVtYmVyOwotewotICByZWdpc3RlciBjaGFyICpjcDsKLSAgaW50IGxlbiwgcmZvLCBmZmIsIGViazsKLSAgY2hhciBjZHRbOF07Ci0gIGNoYXIgTG9jYWxbNTEyXTsKLSNpZmRlZiBWTVMJCQkvKiBVc2VkIGZvciBuYXRpdmUgYXNzZW1ibHkgKi8KLSAgdW5zaWduZWQgU3RhdHVzOwotICBzdHJ1Y3QgRkFCIGZhYjsJCQkvKiBSTVMgZmlsZSBhY2Nlc3MgYmxvY2sgKi8KLSAgc3RydWN0IE5BTSBuYW07CQkJLyogZmlsZSBuYW1lIGluZm9ybWF0aW9uICovCi0gIHN0cnVjdCBYQUJEQVQgeGFiZGF0OwkJCS8qIGRhdGUrdGltZSBmaWVsZHMgKi8KLSAgc3RydWN0IFhBQkZIQyB4YWJmaGM7CQkJLyogZmlsZSBoZWFkZXIgY2hhcmFjdGVyaXN0aWNzICovCi0gIGNoYXIgcmVzdWx0YW50X3N0cmluZ19idWZmZXJbMjU1ICsgMV07Ci0KLSAgLyoKLSAgICoJU2V0IHVwIFJNUyBzdHJ1Y3R1cmVzOgotICAgKi8KLSAgLyogRkFCIC0tIGZpbGUgYWNjZXNzIGJsb2NrICovCi0gIG1lbXNldCAoKGNoYXIgKikgJmZhYiwgMCwgc2l6ZW9mIGZhYik7Ci0gIGZhYi5mYWIkYl9iaWQgPSBGQUIkQ19CSUQ7Ci0gIGZhYi5mYWIkYl9ibG4gPSAodW5zaWduZWQgY2hhcikgc2l6ZW9mIGZhYjsKLSAgZmFiLmZhYiRsX2ZuYSA9IEZpbGVuYW1lOwotICBmYWIuZmFiJGJfZm5zID0gKHVuc2lnbmVkIGNoYXIpIHN0cmxlbiAoRmlsZW5hbWUpOwotICBmYWIuZmFiJGxfbmFtID0gKGNoYXIgKikgJm5hbTsKLSAgZmFiLmZhYiRsX3hhYiA9IChjaGFyICopICZ4YWJkYXQ7Ci0gIC8qIE5BTSAtLSBmaWxlIG5hbWUgYmxvY2sgKi8KLSAgbWVtc2V0ICgoY2hhciAqKSAmbmFtLCAwLCBzaXplb2YgbmFtKTsKLSAgbmFtLm5hbSRiX2JpZCA9IE5BTSRDX0JJRDsKLSAgbmFtLm5hbSRiX2JsbiA9ICh1bnNpZ25lZCBjaGFyKSBzaXplb2YgbmFtOwotICBuYW0ubmFtJGxfcnNhID0gcmVzdWx0YW50X3N0cmluZ19idWZmZXI7Ci0gIG5hbS5uYW0kYl9yc3MgPSAodW5zaWduZWQgY2hhcikgKHNpemVvZiByZXN1bHRhbnRfc3RyaW5nX2J1ZmZlciAtIDEpOwotICAvKiBYQUJzIC0tIGV4dGVuZGVkIGF0dHJpYnV0ZXMgYmxvY2tzICovCi0gIG1lbXNldCAoKGNoYXIgKikgJnhhYmRhdCwgMCwgc2l6ZW9mIHhhYmRhdCk7Ci0gIHhhYmRhdC54YWIkYl9jb2QgPSBYQUIkQ19EQVQ7Ci0gIHhhYmRhdC54YWIkYl9ibG4gPSAodW5zaWduZWQgY2hhcikgc2l6ZW9mIHhhYmRhdDsKLSAgeGFiZGF0LnhhYiRsX254dCA9IChjaGFyICopICZ4YWJmaGM7Ci0gIG1lbXNldCAoKGNoYXIgKikgJnhhYmZoYywgMCwgc2l6ZW9mIHhhYmZoYyk7Ci0gIHhhYmZoYy54YWIkYl9jb2QgPSBYQUIkQ19GSEM7Ci0gIHhhYmZoYy54YWIkYl9ibG4gPSAodW5zaWduZWQgY2hhcikgc2l6ZW9mIHhhYmZoYzsKLSAgeGFiZmhjLnhhYiRsX254dCA9IDA7Ci0gIC8qCi0gICAqCUdldCB0aGUgZmlsZSBpbmZvcm1hdGlvbgotICAgKi8KLSAgU3RhdHVzID0gc3lzJG9wZW4gKCZmYWIpOwotICBpZiAoIShTdGF0dXMgJiAxKSkKLSAgICB7Ci0gICAgICBhc190c2t0c2sgKF8oIkNvdWxkbid0IGZpbmQgc291cmNlIGZpbGUgXCIlc1wiLCBzdGF0dXM9JSVYJXgiKSwKLQkJIEZpbGVuYW1lLCBTdGF0dXMpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBzeXMkY2xvc2UgKCZmYWIpOwotICAvKiBOb3cgZXh0cmFjdCBmaWVsZHMgb2YgaW50ZXJlc3QuICAqLwotICBtZW1jcHkgKGNkdCwgKGNoYXIgKikgJnhhYmRhdC54YWIkcV9jZHQsIDgpOwkvKiBjcmVhdGlvbiBkYXRlICovCi0gIGViayA9IHhhYmZoYy54YWIkbF9lYms7CQkvKiBlbmQtb2YtZmlsZSBibG9jayAqLwotICBmZmIgPSB4YWJmaGMueGFiJHdfZmZiOwkJLyogZmlyc3QgZnJlZSBieXRlIG9mIGxhc3QgYmxvY2sgKi8KLSAgcmZvID0geGFiZmhjLnhhYiRiX3JmbzsJCS8qIHJlY29yZCBmb3JtYXQgKi8KLSAgbGVuID0gbmFtLm5hbSRiX3JzbDsJCQkvKiBsZW5ndGggb2YgRmlsZW5hbWUgKi8KLSAgcmVzdWx0YW50X3N0cmluZ19idWZmZXJbbGVuXSA9ICdcMCc7Ci0gIEZpbGVuYW1lID0gcmVzdWx0YW50X3N0cmluZ19idWZmZXI7CS8qIGZ1bGwgZmlsZW5hbWUgKi8KLSNlbHNlCQkJCS8qIENyb3NzLWFzc2VtYmx5ICovCi0gIC8qIFtQZXJoYXBzIHdlIG91Z2h0IHRvIHVzZSBhY3R1YWwgdmFsdWVzIGRlcml2ZWQgZnJvbSBzdGF0KCkgaGVyZT9dICAqLwotICBtZW1zZXQgKGNkdCwgMCwgOCk7CQkJLyogbnVsbCBWTVMgcXVhZHdvcmQgYmluYXJ5IHRpbWUgKi8KLSAgZWJrID0gZmZiID0gcmZvID0gMDsKLSAgbGVuID0gc3RybGVuIChGaWxlbmFtZSk7Ci0gIGlmIChsZW4gPiAyNTUpCS8qIGEgc2luZ2xlIGJ5dGUgaXMgdXNlZCBhcyBjb3VudCBwcmVmaXggKi8KLSAgICB7Ci0gICAgICBGaWxlbmFtZSArPSAobGVuIC0gMjU1KTsJCS8qIHRhaWwgZW5kIGlzIG1vcmUgc2lnbmlmaWNhbnQgKi8KLSAgICAgIGxlbiA9IDI1NTsKLSAgICB9Ci0jZW5kaWYgLyogVk1TICovCi0KLSAgY3AgPSAmTG9jYWxbMV07CQkJLyogZmlsbCBpbiByZWNvcmQgbGVuZ3RoIGxhdGVyICovCi0gICpjcCsrID0gRFNUX1NfQ19TT1VSQ0U7CQkvKiBEU1QgdHlwZSBpcyAic291cmNlIGZpbGUiICovCi0gICpjcCsrID0gRFNUX1NfQ19TUkNfRk9STUZFRUQ7CQkvKiBmb3JtZmVlZHMgY291bnQgYXMgc291cmNlIHJlY29yZHMgKi8KLSAgKmNwKysgPSBEU1RfU19DX1NSQ19ERUNMRklMRTsJCS8qIGRlY2xhcmUgc291cmNlIGZpbGUgKi8KLSAga25vdyAoY3AgPT0gJkxvY2FsWzRdKTsKLSAgKmNwKysgPSAwOwkJCQkvKiBmaWxsIGluIHRoaXMgbGVuZ3RoIGJlbG93ICovCi0gICpjcCsrID0gMDsJCQkJLyogZmxhZ3M7IG11c3QgYmUgemVybyAqLwotICBDT1BZX1NIT1JUIChjcCwgSURfTnVtYmVyKSwgIGNwICs9IDI7CS8qIGZpbGUgSUQgbnVtYmVyICovCi0gIG1lbWNweSAoY3AsIGNkdCwgOCksICBjcCArPSA4OwkvKiBjcmVhdGlvbiBkYXRlK3RpbWUgKi8KLSAgQ09QWV9MT05HIChjcCwgZWJrKSwgIGNwICs9IDQ7CS8qIGVuZC1vZi1maWxlIGJsb2NrICovCi0gIENPUFlfU0hPUlQgKGNwLCBmZmIpLCAgY3AgKz0gMjsJLyogZmlyc3QgZnJlZSBieXRlIG9mIGxhc3QgYmxvY2sgKi8KLSAgKmNwKysgPSAoY2hhcikgcmZvOwkJCS8qIFJNUyByZWNvcmQgZm9ybWF0ICovCi0gIC8qIEZpbGVuYW1lLiAgKi8KLSAgKmNwKysgPSAoY2hhcikgbGVuOwotICB3aGlsZSAoLS1sZW4gPj0gMCkKLSAgICAqY3ArKyA9ICpGaWxlbmFtZSsrOwotICAvKiBMaWJyYXJ5IG1vZHVsZSBuYW1lIChub25lKS4gICovCi0gICpjcCsrID0gMDsKLSAgLyogTm93IHRoYXQgc2l6ZSBpcyBrbm93biwgZmlsbCBpdCBpbiBhbmQgd3JpdGUgb3V0IHRoZSByZWNvcmQuICAqLwotICBMb2NhbFs0XSA9IGNwIC0gJkxvY2FsWzVdOwkJLyogc291cmNlIGZpbGUgZGVjbGFyYXRpb24gc2l6ZSAqLyAKLSAgTG9jYWxbMF0gPSBjcCAtICZMb2NhbFsxXTsJCS8qIFRCVCByZWNvcmQgc2l6ZSAqLwotICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBjcCAtIExvY2FsLCBPQkpfU19DX1RCVCk7Ci0gIHJldHVybiAxOwotfQotCi0KLS8qIFRyYWNlYmFjayBpbmZvcm1hdGlvbiBpcyBkZXNjcmliZWQgaW4gdGVybXMgb2YgbGluZXMgZnJvbSBjb21waWxlcgotICAgbGlzdGluZyBmaWxlcywgbm90IGxpbmVzIGZyb20gc291cmNlIGZpbGVzLiAgV2UgbmVlZCB0byBzZXQgdXAgdGhlCi0gICBjb3JyZWxhdGlvbiBiZXR3ZWVuIGxpc3RpbmcgbGluZSBudW1iZXJzIGFuZCBzb3VyY2UgbGluZSBudW1iZXJzLgotICAgU2luY2UgZ2NjJ3MgLnN0YWJuIGRpcmVjdGl2ZXMgcmVmZXIgdG8gdGhlIHNvdXJjZSBsaW5lcywgd2UganVzdAotICAgbmVlZCB0byBkZXNjcmliZSBhIG9uZS10by1vbmUgY29ycmVzcG9uZGVuY2UuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX1RCVF9Tb3VyY2VfTGluZXMgKElEX051bWJlciwgU3RhcnRpbmdfTGluZV9OdW1iZXIsIE51bWJlcl9PZl9MaW5lcykKLSAgICAgaW50IElEX051bWJlcjsKLSAgICAgaW50IFN0YXJ0aW5nX0xpbmVfTnVtYmVyOwotICAgICBpbnQgTnVtYmVyX09mX0xpbmVzOwotewotICBjaGFyICpjcDsKLSAgaW50IGNodW5rX2xpbWl0OwotICBjaGFyIExvY2FsWzEyOF07CS8qIHJvb20gZW5vdWdoIHRvIGRlc2NyaWJlIDEzMTA3MDAgbGluZXMuLi4gKi8KLQotICBjcCA9ICZMb2NhbFsxXTsJLyogUHV0IHNpemUgaW4gTG9jYWxbMF0gbGF0ZXIuICAqLwotICAqY3ArKyA9IERTVF9TX0NfU09VUkNFOwkJLyogRFNUIHR5cGUgaXMgInNvdXJjZSBmaWxlIi4gICovCi0gICpjcCsrID0gRFNUX1NfQ19TUkNfU0VURklMRTsJCS8qIFNldCBTb3VyY2UgRmlsZS4gICovCi0gIENPUFlfU0hPUlQgKGNwLCBJRF9OdW1iZXIpLCAgY3AgKz0gMjsJLyogRmlsZSBJRCBOdW1iZXIuICAqLwotICAvKiBTZXQgcmVjb3JkIG51bWJlciBhbmQgZGVmaW5lIGxpbmVzLiAgU2luY2Ugbm8gbG9uZ3dvcmQgZm9ybSBvZgotICAgICBTUkNfREVGTElORVMgaXMgYXZhaWxhYmxlLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gY29wZSB3aXRoIGFueSBodWdlCi0gICAgIGZpbGVzIGEgY2h1bmsgYXQgYSB0aW1lLiAgSXQgZG9lc24ndCBtYXR0ZXIgZm9yIHRyYWNlYmFja3MsIHNpbmNlCi0gICAgIHVuc3BlY2lmaWVkIGxpbmVzIGFyZSBtYXBwZWQgb25lLXRvLW9uZSBhbmQgd29yayBvdXQgcmlnaHQsIGJ1dCBpdAotICAgICBkb2VzIG1hdHRlciB3aXRoaW4gdGhlIGRlYnVnZ2VyLiAgV2l0aG91dCB0aGlzIGV4cGxpY2l0IG1hcHBpbmcsCi0gICAgIGl0IHdpbGwgY29tcGxhaW4gYWJvdXQgbGluZXMgbm90IGV4aXN0aW5nIGluIHRoZSBtb2R1bGUuICAqLwotICBjaHVua19saW1pdCA9IChzaXplb2YgTG9jYWwgLSA1KSAvIDY7Ci0gIGlmIChOdW1iZXJfT2ZfTGluZXMgPiA2NTUzNSAqIGNodW5rX2xpbWl0KQkvKiBhdm9pZCBidWZmZXIgb3ZlcmZsb3cgKi8KLSAgICBOdW1iZXJfT2ZfTGluZXMgPSA2NTUzNSAqIGNodW5rX2xpbWl0OwotICB3aGlsZSAoTnVtYmVyX09mX0xpbmVzID4gNjU1MzUpCi0gICAgewotICAgICAgKmNwKysgPSBEU1RfU19DX1NSQ19TRVRSRUNfTDsKLSAgICAgIENPUFlfTE9ORyAoY3AsIFN0YXJ0aW5nX0xpbmVfTnVtYmVyKSwgIGNwICs9IDQ7Ci0gICAgICAqY3ArKyA9IERTVF9TX0NfU1JDX0RFRkxJTkVTX1c7Ci0gICAgICBDT1BZX1NIT1JUIChjcCwgNjU1MzUpLCAgY3AgKz0gMjsKLSAgICAgIFN0YXJ0aW5nX0xpbmVfTnVtYmVyICs9IDY1NTM1OwotICAgICAgTnVtYmVyX09mX0xpbmVzIC09IDY1NTM1OwotICAgIH0KLSAgLyogU2V0IHJlY29yZCBudW1iZXIgYW5kIGRlZmluZSBsaW5lcywgbm9ybWFsIGNhc2UuICAqLwotICBpZiAoU3RhcnRpbmdfTGluZV9OdW1iZXIgPD0gNjU1MzUpCi0gICAgewotICAgICAgKmNwKysgPSBEU1RfU19DX1NSQ19TRVRSRUNfVzsKLSAgICAgIENPUFlfU0hPUlQgKGNwLCBTdGFydGluZ19MaW5lX051bWJlciksICBjcCArPSAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpjcCsrID0gRFNUX1NfQ19TUkNfU0VUUkVDX0w7Ci0gICAgICBDT1BZX0xPTkcgKGNwLCBTdGFydGluZ19MaW5lX051bWJlciksICBjcCArPSA0OwotICAgIH0KLSAgKmNwKysgPSBEU1RfU19DX1NSQ19ERUZMSU5FU19XOwotICBDT1BZX1NIT1JUIChjcCwgTnVtYmVyX09mX0xpbmVzKSwgIGNwICs9IDI7Ci0gIC8qIFNldCBzaXplIG5vdyB0aGF0IGJlIGtub3cgaXQsIHRoZW4gb3V0cHV0IHRoZSBkYXRhLiAgKi8KLSAgTG9jYWxbMF0gPSBjcCAtICZMb2NhbFsxXTsKLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgY3AgLSBMb2NhbCwgT0JKX1NfQ19UQlQpOwotfQotDAotCi0gLyoqKioqKiBEZWJ1Z2dlciBJbmZvcm1hdGlvbiBzdXBwb3J0IHJvdXRpbmVzICoqKioqKi8KLQotCi0vKiBUaGlzIHJvdXRpbmUgbG9jYXRlcyBhIGZpbGUgaW4gdGhlIGxpc3Qgb2YgZmlsZXMuICBJZiBhbiBlbnRyeSBkb2VzCi0gICBub3QgZXhpc3QsIG9uZSBpcyBjcmVhdGVkLiAgRm9yIGluY2x1ZGUgZmlsZXMsIGEgbmV3IGVudHJ5IGlzIGFsd2F5cwotICAgY3JlYXRlZCBzdWNoIHRoYXQgaW5saW5lIGZ1bmN0aW9ucyBjYW4gYmUgcHJvcGVybHkgZGVidWdnZWQuICAqLwotCi1zdGF0aWMgc3RydWN0IGlucHV0X2ZpbGUgKgotZmluZF9maWxlIChzcCkKLSAgICAgc3ltYm9sUyAqc3A7Ci17Ci0gIHN0cnVjdCBpbnB1dF9maWxlICpzYW1lX2ZpbGUgPSAwOwotICBzdHJ1Y3QgaW5wdXRfZmlsZSAqZnBudCwgKmxhc3QgPSAwOwotICBjaGFyICpzcF9uYW1lOwotCi0gIGZvciAoZnBudCA9IGZpbGVfcm9vdDsgZnBudDsgZnBudCA9IGZwbnQtPm5leHQpCi0gICAgewotICAgICAgaWYgKGZwbnQtPnNwbnQgPT0gc3ApCi0JcmV0dXJuIGZwbnQ7Ci0gICAgICBsYXN0ID0gZnBudDsKLSAgICB9Ci0gIHNwX25hbWUgPSBTX0dFVF9OQU1FIChzcCk7Ci0gIGZvciAoZnBudCA9IGZpbGVfcm9vdDsgZnBudDsgZnBudCA9IGZwbnQtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoc3BfbmFtZSwgZnBudC0+bmFtZSkgPT0gMCkKLQl7Ci0JICBpZiAoZnBudC0+ZmxhZyA9PSAxKQotCSAgICByZXR1cm4gZnBudDsKLQkgIHNhbWVfZmlsZSA9IGZwbnQ7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBmcG50ID0gKHN0cnVjdCBpbnB1dF9maWxlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGlucHV0X2ZpbGUpKTsKLSAgaWYgKCFmaWxlX3Jvb3QpCi0gICAgZmlsZV9yb290ID0gZnBudDsKLSAgZWxzZQotICAgIGxhc3QtPm5leHQgPSBmcG50OwotICBmcG50LT5uZXh0ID0gMDsKLSAgZnBudC0+bmFtZSA9IHNwX25hbWU7Ci0gIGZwbnQtPm1pbl9saW5lID0gMHg3ZmZmZmZmZjsKLSAgZnBudC0+bWF4X2xpbmUgPSAwOwotICBmcG50LT5vZmZzZXQgPSAwOwotICBmcG50LT5mbGFnID0gMDsKLSAgZnBudC0+ZmlsZV9udW1iZXIgPSAwOwotICBmcG50LT5zcG50ID0gc3A7Ci0gIGZwbnQtPnNhbWVfZmlsZV9mcG50ID0gc2FtZV9maWxlOwotICByZXR1cm4gZnBudDsKLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgY29udmVydHMgYSBudW1iZXIgc3RyaW5nIGludG8gYW4gaW50ZWdlciwgYW5kIHN0b3BzIHdoZW4KLSAgIGl0IHNlZXMgYW4gaW52YWxpZCBjaGFyYWN0ZXIuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgY2hhcmFjdGVyIGp1c3QgcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIgcmVhZC4gIE5vIGVycm9yIGlzIGdlbmVyYXRlZC4gICovCi0KLXN0YXRpYyBjaGFyICoKLWN2dF9pbnRlZ2VyIChzdHIsIHJ0bikKLSAgICAgY2hhciAqc3RyOwotICAgICBpbnQgKnJ0bjsKLXsKLSAgaW50IGl2YWwgPSAwLCBzZ24gPSAxOwotCi0gIGlmICgqc3RyID09ICctJykKLSAgICBzZ24gPSAtMSwgICsrc3RyOwotICB3aGlsZSAoKnN0ciA+PSAnMCcgJiYgKnN0ciA8PSAnOScpCi0gICAgaXZhbCA9IDEwICogaXZhbCArICpzdHIrKyAtICcwJzsKLSAgKnJ0biA9IHNnbiAqIGl2YWw7Ci0gIHJldHVybiBzdHI7Ci19Ci0MCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhbmQgZGVmaW5pdGlvbnMgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgb2JqZWN0Ci0gKiByZWNvcmRzIHRoYXQgd2lsbCBkZXNjcmliZSBwcm9ncmFtIHZhcmlhYmxlcyB0byB0aGUgVk1TIGRlYnVnZ2VyLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBtYW55IG9mIHRoZSByb3V0aW5lcyBuZWVkZWQgdG8gb3V0cHV0IGRlYnVnZ2luZyBpbmZvCi0gKiBpbnRvIHRoZSBvYmplY3QgZmlsZSB0aGF0IHRoZSBWTVMgZGVidWdnZXIgbmVlZHMgdG8gdW5kZXJzdGFuZCBzeW1ib2xzLgotICogVGhlc2Ugcm91dGluZXMgYXJlIGNhbGxlZCB2ZXJ5IGxhdGUgaW4gdGhlIGFzc2VtYmx5IHByb2Nlc3MsIGFuZCB0aHVzCi0gKiB3ZSBjYW4gYmUgZmFpcmx5IGxheCBhYm91dCBjaGFuZ2luZyB0aGluZ3MsIHNpbmNlIHRoZSBHU0QgYW5kIHRoZSBUSVIKLSAqIHNlY3Rpb25zIGhhdmUgYWxyZWFkeSBiZWVuIG91dHB1dC4KLSAqLwotCi0KLS8qIFRoaXMgcm91dGluZSBmaXhlcyB0aGUgbmFtZXMgdGhhdCBhcmUgZ2VuZXJhdGVkIGJ5IEMrKywgIi50aGlzIiBpcyBhIGdvb2QKLSAgIGV4YW1wbGUuICBUaGUgcGVyaW9kIGRvZXMgbm90IHdvcmsgZm9yIHRoZSBkZWJ1Z2dlciwgc2luY2UgaXQgbG9va3MgbGlrZQotICAgdGhlIHN5bnRheCBmb3IgYSBzdHJ1Y3R1cmUgZWxlbWVudCwgYW5kIHRodXMgaXQgZ2V0cyBtaWdodGlseSBjb25mdXNlZC4KLQotICAgV2UgYWxzbyB1c2UgdGhpcyB0byBzdHJpcCB0aGUgUHNlY3RBdHRyaWJ1dGUgaGFjayBmcm9tIHRoZSBuYW1lIGJlZm9yZSB3ZQotICAgd3JpdGUgYSBkZWJ1Z2dlciByZWNvcmQuICAqLwotCi1zdGF0aWMgY2hhciAqCi1maXhfbmFtZSAocG50KQotICAgICBjaGFyICpwbnQ7Ci17Ci0gIGNoYXIgKnBudDE7Ci0KLSAgLyogS2lsbCBhbnkgbGVhZGluZyAiXyIuICAqLwotICBpZiAoKnBudCA9PSAnXycpCi0gICAgcG50Kys7Ci0KLSAgLyogSXMgdGhlcmUgYSBQc2VjdCBBdHRyaWJ1dGUgdG8gc2tpcD8/ICAqLwotICBpZiAoSEFTX1BTRUNUX0FUVFJJQlVURVMgKHBudCkpCi0gICAgewotICAgICAgLyogWWVzOiBTa2lwIGl0LiAgKi8KLSAgICAgIHBudCArPSBQU0VDVF9BVFRSSUJVVEVTX1NUUklOR19MRU5HVEg7Ci0gICAgICB3aGlsZSAoKnBudCkKLQl7Ci0JICBpZiAoKHBudFswXSA9PSAnJCcpICYmIChwbnRbMV0gPT0gJyQnKSkKLQkgICAgewotCSAgICAgIHBudCArPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBwbnQrKzsKLQl9Ci0gICAgfQotCi0gIC8qIEhlcmUgd2UgZml4IHRoZSAudGhpcyAtPiAkdGhpcyBjb252ZXJzaW9uLiAgKi8KLSAgZm9yIChwbnQxID0gcG50OyAqcG50MSAhPSAwOyBwbnQxKyspCi0gICAgaWYgKCpwbnQxID09ICcuJykKLSAgICAgICpwbnQxID0gJyQnOwotCi0gIHJldHVybiBwbnQ7Ci19Ci0KLQotLyogV2hlbiBkZWZpbmluZyBhIHN0cnVjdHVyZSwgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBmaW5kIHRoZSBuYW1lIG9mCi0gICB0aGUgYWN0dWFsIHN0cnVjdHVyZS4gIEl0IGlzIGFzc3VtZWQgdGhhdCBzdHIgcG9pbnRzIHRvIHRoZSBlcXVhbCBzaWduCi0gICBpbiB0aGUgZGVmaW5pdGlvbiwgYW5kIGl0IG1vdmVzIGJhY2t3YXJkIHVudGlsIGl0IGZpbmRzIHRoZSBzdGFydCBvZiB0aGUKLSAgIG5hbWUuICBJZiBpdCBmaW5kcyBhIDAsIHRoZW4gaXQga25vd3MgdGhhdCB0aGlzIHN0cnVjdHVyZSBkZWYgaXMgaW4gdGhlCi0gICBvdXRlcm1vc3QgbGV2ZWwsIGFuZCB0aHVzIHN5bWJvbF9uYW1lIHBvaW50cyB0byB0aGUgc3ltYm9sIG5hbWUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1nZXRfc3RydWN0X25hbWUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpwbnQ7Ci0gIHBudCA9IHN0cjsKLSAgd2hpbGUgKCgqcG50ICE9ICc6JykgJiYgKCpwbnQgIT0gJ1wwJykpCi0gICAgcG50LS07Ci0gIGlmICgqcG50ID09ICdcMCcpCi0gICAgcmV0dXJuIChjaGFyICopIHN5bWJvbF9uYW1lOwotICAqcG50LS0gPSAnXDAnOwotICB3aGlsZSAoKCpwbnQgIT0gJzsnKSAmJiAoKnBudCAhPSAnPScpKQotICAgIHBudC0tOwotICBpZiAoKnBudCA9PSAnOycpCi0gICAgcmV0dXJuIHBudCArIDE7Ci0gIHdoaWxlICgoKnBudCA8ICcwJykgfHwgKCpwbnQgPiAnOScpKQotICAgIHBudCsrOwotICB3aGlsZSAoKCpwbnQgPj0gJzAnKSAmJiAoKnBudCA8PSAnOScpKQotICAgIHBudCsrOwotICByZXR1cm4gcG50OwotfQotCi0KLS8qIFNlYXJjaCBzeW1ib2wgbGlzdCBmb3IgdHlwZSBudW1iZXIgZGJ4X3R5cGUuCi0gICBSZXR1cm4gYSBwb2ludGVyIHRvIHN0cnVjdC4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKgotZmluZF9zeW1ib2wgKGRieF90eXBlKQotICAgICBpbnQgZGJ4X3R5cGU7Ci17Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLQotICBzcG50ID0gVk1TX1N5bWJvbF90eXBlX2xpc3RbU1lNVFlQX0hBU0ggKGRieF90eXBlKV07Ci0gIHdoaWxlIChzcG50KQotICAgIHsKLSAgICAgIGlmIChzcG50LT5kYnhfdHlwZSA9PSBkYnhfdHlwZSkKLQlicmVhazsKLSAgICAgIHNwbnQgPSBzcG50LT5uZXh0OwotICAgIH0KLSAgaWYgKCFzcG50IHx8IHNwbnQtPmFkdmFuY2VkICE9IEFMSUFTKQotICAgIHJldHVybiBzcG50OwotICByZXR1cm4gZmluZF9zeW1ib2wgKHNwbnQtPnR5cGUyKTsKLX0KLQotCi0jaWYgMAkJLyogb2Jzb2xldGUgKi8KLS8qIHRoaXMgcm91dGluZSBwdXRzIGluZm8gaW50byBlaXRoZXIgTG9jYWwgb3IgQXN1ZmZpeCwgZGVwZW5kaW5nIG9uIHRoZSBzaWduCi0gKiBvZiBzaXplLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGl0IGlzIGVhc2llciB0byBidWlsZCB0aGUgdmFyaWFibGUgZGVzY3JpcHRvcgotICogYmFja3dhcmRzLCB3aGlsZSB0aGUgYXJyYXkgZGVzY3JpcHRvciBpcyBiZXN0IGJ1aWx0IGZvcndhcmRzLiAgSW4gdGhlIGVuZAotICogdGhleSBnZXQgcHV0IHRvZ2V0aGVyLCBpZiB0aGVyZSBpcyBub3QgYSBzdHJ1Y3QvdW5pb24vZW51bSBhbG9uZyB0aGUgd2F5Ci0gKi8KLXN0YXRpYyB2b2lkCi1wdXNoICh2YWx1ZSwgc2l6ZTEpCi0gICAgIGludCB2YWx1ZSwgc2l6ZTE7Ci17Ci0gIGlmIChzaXplMSA8IDApCi0gICAgewotICAgICAgc2l6ZTEgPSAtc2l6ZTE7Ci0gICAgICBpZiAoTHBudCA8IHNpemUxKQotCXsKLQkgIG92ZXJmbG93ID0gMTsKLQkgIExwbnQgPSAxOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIExwbnQgLT0gc2l6ZTE7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKCZMb2NhbFtMcG50ICsgMV0sIHZhbHVlLCBzaXplMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKEFwb2ludCArIHNpemUxID49IE1BWF9ERUJVR19SRUNPUkQpCi0JewotCSAgb3ZlcmZsb3cgPSAxOwotCSAgQXBvaW50ID0gTUFYX0RFQlVHX1JFQ09SRCAtIDE7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICgmQXN1ZmZpeFtBcG9pbnRdLCB2YWx1ZSwgc2l6ZTEpOwotICAgICAgQXBvaW50ICs9IHNpemUxOwotICAgIH0KLX0KLSNlbmRpZgotCi0KLXN0YXRpYyB2b2lkCi1mcHVzaCAodmFsdWUsIHNpemUpCi0gICAgIGludCB2YWx1ZSwgc2l6ZTsKLXsKLSAgaWYgKEFwb2ludCArIHNpemUgPj0gTUFYX0RFQlVHX1JFQ09SRCkKLSAgICB7Ci0gICAgICBvdmVyZmxvdyA9IDE7Ci0gICAgICBBcG9pbnQgPSBNQVhfREVCVUdfUkVDT1JEIC0gMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChzaXplID09IDEpCi0gICAgQXN1ZmZpeFtBcG9pbnQrK10gPSAoY2hhcikgdmFsdWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKCZBc3VmZml4W0Fwb2ludF0sIHZhbHVlLCBzaXplKTsKLSAgICAgIEFwb2ludCArPSBzaXplOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXJwdXNoICh2YWx1ZSwgc2l6ZSkKLSAgICAgaW50IHZhbHVlLCBzaXplOwotewotICBpZiAoTHBudCA8IHNpemUpCi0gICAgewotICAgICAgb3ZlcmZsb3cgPSAxOwotICAgICAgTHBudCA9IDE7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc2l6ZSA9PSAxKQotICAgICAgTG9jYWxbTHBudC0tXSA9IChjaGFyKSB2YWx1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIExwbnQgLT0gc2l6ZTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoJkxvY2FsW0xwbnQgKyAxXSwgdmFsdWUsIHNpemUpOwotICAgIH0KLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgZ2VuZXJhdGVzIHRoZSBhcnJheSBkZXNjcmlwdG9yIGZvciBhIGdpdmVuIGFycmF5LiAgKi8KLQotc3RhdGljIHZvaWQKLWFycmF5X3N1ZmZpeCAoc3BudDIpCi0gICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDI7Ci17Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50MTsKLSAgaW50IHJhbms7Ci0gIGludCB0b3RhbF9zaXplOwotCi0gIHJhbmsgPSAwOwotICBzcG50ID0gc3BudDI7Ci0gIHdoaWxlIChzcG50LT5hZHZhbmNlZCAhPSBBUlJBWSkKLSAgICB7Ci0gICAgICBzcG50ID0gZmluZF9zeW1ib2wgKHNwbnQtPnR5cGUyKTsKLSAgICAgIGlmICghc3BudCkKLQlyZXR1cm47Ci0gICAgfQotICBzcG50MSA9IHNwbnQ7Ci0gIHRvdGFsX3NpemUgPSAxOwotICB3aGlsZSAoc3BudDEtPmFkdmFuY2VkID09IEFSUkFZKQotICAgIHsKLSAgICAgIHJhbmsrKzsKLSAgICAgIHRvdGFsX3NpemUgKj0gKHNwbnQxLT5pbmRleF9tYXggLSBzcG50MS0+aW5kZXhfbWluICsgMSk7Ci0gICAgICBzcG50MSA9IGZpbmRfc3ltYm9sIChzcG50MS0+dHlwZTIpOwotICAgIH0KLSAgdG90YWxfc2l6ZSA9IHRvdGFsX3NpemUgKiBzcG50MS0+ZGF0YV9zaXplOwotICBmcHVzaCAoc3BudDEtPmRhdGFfc2l6ZSwgMik7CS8qIGVsZW1lbnQgc2l6ZSAqLwotICBpZiAoc3BudDEtPlZNU190eXBlID09IERCR19TX0NfQURWQU5DRURfVFlQRSkKLSAgICBmcHVzaCAoMCwgMSk7Ci0gIGVsc2UKLSAgICBmcHVzaCAoc3BudDEtPlZNU190eXBlLCAxKTsJLyogZWxlbWVudCB0eXBlICovCi0gIGZwdXNoIChEU0NfS19DTEFTU19BLCAxKTsJLyogZGVzY3JpcHRvciBjbGFzcyAqLwotICBmcHVzaCAoMCwgNCk7CQkJLyogYmFzZSBhZGRyZXNzICovCi0gIGZwdXNoICgwLCAxKTsJCQkvKiBzY2FsZSBmYWN0b3IgLS0gbm90IGFwcGxpY2FibGUgKi8KLSAgZnB1c2ggKDAsIDEpOwkJCS8qIGRpZ2l0IGNvdW50IC0tIG5vdCBhcHBsaWNhYmxlICovCi0gIGZwdXNoICgweGMwLCAxKTsJCS8qIGZsYWdzOiBtdWx0aXBsaWVyIGJsb2NrICYgYm91bmRzIHByZXNlbnQgKi8KLSAgZnB1c2ggKHJhbmssIDEpOwkJLyogbnVtYmVyIG9mIGRpbWVuc2lvbnMgKi8KLSAgZnB1c2ggKHRvdGFsX3NpemUsIDQpOwotICBmcHVzaCAoMCwgNCk7CQkJLyogcG9pbnRlciB0byBlbGVtZW50IFswXVswXS4uLlswXSAqLwotICBzcG50MSA9IHNwbnQ7Ci0gIHdoaWxlIChzcG50MS0+YWR2YW5jZWQgPT0gQVJSQVkpCi0gICAgewotICAgICAgZnB1c2ggKHNwbnQxLT5pbmRleF9tYXggLSBzcG50MS0+aW5kZXhfbWluICsgMSwgNCk7Ci0gICAgICBzcG50MSA9IGZpbmRfc3ltYm9sIChzcG50MS0+dHlwZTIpOwotICAgIH0KLSAgc3BudDEgPSBzcG50OwotICB3aGlsZSAoc3BudDEtPmFkdmFuY2VkID09IEFSUkFZKQotICAgIHsKLSAgICAgIGZwdXNoIChzcG50MS0+aW5kZXhfbWluLCA0KTsKLSAgICAgIGZwdXNoIChzcG50MS0+aW5kZXhfbWF4LCA0KTsKLSAgICAgIHNwbnQxID0gZmluZF9zeW1ib2wgKHNwbnQxLT50eXBlMik7Ci0gICAgfQotfQotCi0KLS8qIFRoaXMgcm91dGluZSBnZW5lcmF0ZXMgdGhlIHN0YXJ0IG9mIGEgdmFyaWFibGUgZGVzY3JpcHRvciBiYXNlZCB1cG9uCi0gICBhIHN0cnVjdC91bmlvbi9lbnVtIHRoYXQgaGFzIHlldCB0byBiZSBkZWZpbmVkLiAgV2UgZGVmaW5lIHRoaXMgc3BvdCBhcwotICAgYSBuZXcgbG9jYXRpb24sIGFuZCBzYXZlIGZvdXIgYnl0ZXMgZm9yIHRoZSBhZGRyZXNzLiAgV2hlbiB0aGUgc3RydWN0IGlzCi0gICBmaW5hbGx5IGRlZmluZWQsIHRoZW4gd2UgY2FuIGdvIGJhY2sgYW5kIHBsdWcgaW4gdGhlIGNvcnJlY3QgYWRkcmVzcy4gICovCi0KLXN0YXRpYyB2b2lkCi1uZXdfZm9yd2FyZF9yZWYgKGRieF90eXBlKQotICAgICBpbnQgZGJ4X3R5cGU7Ci17Ci0gIHN0cnVjdCBmb3J3YXJkX3JlZiAqZnBudDsKLSAgZnBudCA9IChzdHJ1Y3QgZm9yd2FyZF9yZWYgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZm9yd2FyZF9yZWYpKTsKLSAgZnBudC0+bmV4dCA9IGZfcmVmX3Jvb3Q7Ci0gIGZfcmVmX3Jvb3QgPSBmcG50OwotICBmcG50LT5kYnhfdHlwZSA9IGRieF90eXBlOwotICBmcG50LT5zdHJ1Y19udW1iID0gKytzdHJ1Y3R1cmVfY291bnQ7Ci0gIGZwbnQtPnJlc29sdmVkID0gJ04nOwotICBycHVzaCAoRFNUX0tfVFNfSU5ELCAxKTsJLyogaW5kaXJlY3QgdHlwZSBzcGVjaWZpY2F0aW9uICovCi0gIHRvdGFsX2xlbiA9IDU7Ci0gIHJwdXNoICh0b3RhbF9sZW4sIDIpOwotICBzdHJ1Y3RfbnVtYmVyID0gLWZwbnQtPnN0cnVjX251bWI7Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIGdlbmVyYXRlcyB0aGUgdmFyaWFibGUgZGVzY3JpcHRvciB1c2VkIHRvIGRlc2NyaWJlIG5vbi1iYXNpYwotICAgdmFyaWFibGVzLiAgSXQgY2FsbHMgaXRzZWxmIHJlY3Vyc2l2ZWx5IHVudGlsIGl0IGdldHMgdG8gdGhlIGJvdHRvbSBvZiBpdAotICAgYWxsLCBhbmQgdGhlbiBidWlsZHMgdGhlIGRlc2NyaXB0b3IgYmFja3dhcmRzLiAgSXQgaXMgZWFzaWVzdCB0byBkbyBpdAotICAgdGhpcyB3YXkgc2luY2Ugd2UgbXVzdCBwZXJpb2RpY2FsbHkgd3JpdGUgbGVuZ3RoIGJ5dGVzLCBhbmQgaXQgaXMgZWFzaWVzdAotICAgaWYgd2Uga25vdyB0aGUgdmFsdWUgd2hlbiBpdCBpcyB0aW1lIHRvIHdyaXRlIGl0LiAgKi8KLQotc3RhdGljIGludAotZ2VuMSAoc3BudCwgYXJyYXlfc3VmZml4X2xlbikKLSAgICAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotICAgICBpbnQgYXJyYXlfc3VmZml4X2xlbjsKLXsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50MTsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoIChzcG50LT5hZHZhbmNlZCkKLSAgICB7Ci0gICAgY2FzZSBWT0lEOgotICAgICAgcnB1c2ggKERCR19TX0NfVk9JRCwgMSk7Ci0gICAgICB0b3RhbF9sZW4gKz0gMTsKLSAgICAgIHJwdXNoICh0b3RhbF9sZW4sIDIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBCQVNJQzoKLSAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgaWYgKGFycmF5X3N1ZmZpeF9sZW4gPT0gMCkKLQl7Ci0JICBycHVzaCAoc3BudC0+Vk1TX3R5cGUsIDEpOwotCSAgcnB1c2ggKERCR19TX0NfQkFTSUMsIDEpOwotCSAgdG90YWxfbGVuID0gMjsKLQkgIHJwdXNoICh0b3RhbF9sZW4sIDIpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgcnB1c2ggKDAsIDQpOwotICAgICAgcnB1c2ggKERTVF9LX1ZGTEFHU19EU0MsIDEpOwotICAgICAgcnB1c2ggKERTVF9LX1RTX0RTQywgMSk7CS8qIGRlc2NyaXB0b3IgdHlwZSBzcGVjaWZpY2F0aW9uICovCi0gICAgICB0b3RhbF9sZW4gPSAtMjsKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgU1RSVUNUOgotICAgIGNhc2UgVU5JT046Ci0gICAgY2FzZSBFTlVNOgotICAgICAgc3RydWN0X251bWJlciA9IHNwbnQtPnN0cnVjX251bWI7Ci0gICAgICBpZiAoc3RydWN0X251bWJlciA8IDApCi0JewotCSAgbmV3X2ZvcndhcmRfcmVmIChzcG50LT5kYnhfdHlwZSk7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBycHVzaCAoREJHX1NfQ19TVFJVQ1QsIDEpOwotICAgICAgdG90YWxfbGVuID0gNTsKLSAgICAgIHJwdXNoICh0b3RhbF9sZW4sIDIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBQT0lOVEVSOgotICAgICAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudC0+dHlwZTIpOwotICAgICAgaSA9IDE7Ci0gICAgICBpZiAoIXNwbnQxKQotCW5ld19mb3J3YXJkX3JlZiAoc3BudC0+dHlwZTIpOwotICAgICAgZWxzZQotCWkgPSBnZW4xIChzcG50MSwgMCk7Ci0gICAgICBpZiAoaSkKLQl7CS8qICgqdm9pZCkgaXMgYSBzcGVjaWFsIGNhc2UsIGRvIG5vdCBwdXQgcG9pbnRlciBzdWZmaXggKi8KLQkgIHJwdXNoIChEQkdfU19DX1BPSU5URVIsIDEpOwotCSAgdG90YWxfbGVuICs9IDM7Ci0JICBycHVzaCAodG90YWxfbGVuLCAyKTsKLQl9Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIEFSUkFZOgotICAgICAgc3BudDEgPSBzcG50OwotICAgICAgd2hpbGUgKHNwbnQxLT5hZHZhbmNlZCA9PSBBUlJBWSkKLQl7Ci0JICBzcG50MSA9IGZpbmRfc3ltYm9sIChzcG50MS0+dHlwZTIpOwotCSAgaWYgKCFzcG50MSkKLQkgICAgewotCSAgICAgIGFzX3Rza3RzayAoXygiZGVidWdnZXIgZm9yd2FyZCByZWZlcmVuY2UgZXJyb3IsIGRieCB0eXBlICVkIiksCi0JCQkgc3BudC0+dHlwZTIpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotLyogSXQgaXMgdG9vIGxhdGUgdG8gZ2VuZXJhdGUgZm9yd2FyZCByZWZlcmVuY2VzLCBzbyB0aGUgdXNlciBnZXRzIGEgbWVzc2FnZS4KLSAqIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIG9uIGEgY29tcGlsZXIgZXJyb3IgKi8KLSAgICAgICh2b2lkKSBnZW4xIChzcG50MSwgMSk7Ci0gICAgICBpID0gQXBvaW50OwotICAgICAgYXJyYXlfc3VmZml4IChzcG50KTsKLSAgICAgIGFycmF5X3N1ZmZpeF9sZW4gPSBBcG9pbnQgLSBpOwotICAgICAgc3dpdGNoIChzcG50MS0+YWR2YW5jZWQpCi0JewotCWNhc2UgQkFTSUM6Ci0JY2FzZSBGVU5DVElPTjoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBycHVzaCAoMCwgMik7Ci0JICB0b3RhbF9sZW4gKz0gMjsKLQkgIHJwdXNoICh0b3RhbF9sZW4sIDIpOwotCSAgcnB1c2ggKERTVF9LX1ZGTEFHU19EU0MsIDEpOwotCSAgcnB1c2ggKDEsIDEpOwkJLyogZmxhZ3M6IGVsZW1lbnQgdmFsdWUgc3BlYyBpbmNsdWRlZCAqLwotCSAgcnB1c2ggKDEsIDEpOwkJLyogb25lIGRpbWVuc2lvbiAqLwotCSAgcnB1c2ggKERCR19TX0NfQ09NUExFWF9BUlJBWSwgMSk7Ci0JfQotICAgICAgdG90YWxfbGVuICs9IGFycmF5X3N1ZmZpeF9sZW4gKyA4OwotICAgICAgcnB1c2ggKHRvdGFsX2xlbiwgMik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgkvKiBsaW50IHN1cHByZXNzaW9uICovCi0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIFRoaXMgZ2VuZXJhdGVzIGEgc3VmZml4IGZvciBhIHZhcmlhYmxlLiAgSWYgaXQgaXMgbm90IGEgZGVmaW5lZCB0eXBlIHlldCwKLSAgIHRoZW4gZGJ4X3R5cGUgY29udGFpbnMgdGhlIHR5cGUgd2UgYXJlIGV4cGVjdGluZyBzbyB3ZSBjYW4gZ2VuZXJhdGUgYQotICAgZm9yd2FyZCByZWZlcmVuY2UuICBUaGlzIGNhbGxzIGdlbjEgdG8gYnVpbGQgbW9zdCBvZiB0aGUgZGVzY3JpcHRvciwgYW5kCi0gICB0aGVuIGl0IHB1dHMgdGhlIGljaW5nIG9uIGF0IHRoZSBlbmQuICBJdCB0aGVuIGR1bXBzIHdoYXRldmVyIGlzIG5lZWRlZAotICAgdG8gZ2V0IGEgY29tcGxldGUgZGVzY3JpcHRvciAoaS5lLiBzdHJ1Y3QgcmVmZXJlbmNlLCBhcnJheSBzdWZmaXgpLiAgKi8KLQotc3RhdGljIHZvaWQKLWdlbmVyYXRlX3N1ZmZpeCAoc3BudCwgZGJ4X3R5cGUpCi0gICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLSAgICAgaW50IGRieF90eXBlOwotewotICBzdGF0aWMgY29uc3QgY2hhciBwdm9pZFs2XSA9IHsKLQkJNSwJCS8qIHJlY29yZC5sZW5ndGggPT0gNSAqLwotCQlEU1RfS19UWVBTUEVDLAkvKiByZWNvcmQudHlwZSA9PSAxICh0eXBlIHNwZWNpZmljYXRpb24pICovCi0JCTAsCQkvKiBuYW1lLmxlbmd0aCA9PSAwLCBubyBuYW1lIGZvbGxvd3MgKi8KLQkJMSwgMCwJCS8qIHR5cGUubGVuZ3RoID09IDEgezIgYnl0ZXMsIGxpdHRsZSBlbmRpYW59ICovCi0JCURCR19TX0NfVk9JRAkvKiB0eXBlLnR5cGUgPT0gNSAocG9pbnRlciB0byB1bnNwZWNpZmllZCkgKi8KLSAgfTsKLSAgaW50IGk7Ci0KLSAgQXBvaW50ID0gMDsKLSAgTHBudCA9IE1BWF9ERUJVR19SRUNPUkQgLSAxOwotICB0b3RhbF9sZW4gPSAwOwotICBzdHJ1Y3RfbnVtYmVyID0gMDsKLSAgb3ZlcmZsb3cgPSAwOwotICBpZiAoIXNwbnQpCi0gICAgbmV3X2ZvcndhcmRfcmVmIChkYnhfdHlwZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc3BudC0+Vk1TX3R5cGUgIT0gREJHX1NfQ19BRFZBTkNFRF9UWVBFKQotCXJldHVybjsJCS8qIG5vIHN1ZmZpeCBuZWVkZWQgKi8KLSAgICAgIGdlbjEgKHNwbnQsIDApOwotICAgIH0KLSAgcnB1c2ggKDAsIDEpOwkJLyogbm8gbmFtZSAobGVuPT0wKSAqLwotICBycHVzaCAoRFNUX0tfVFlQU1BFQywgMSk7Ci0gIHRvdGFsX2xlbiArPSA0OwotICBycHVzaCAodG90YWxfbGVuLCAxKTsKLSAgLyogSWYgdGhlIHZhcmlhYmxlIGRlc2NyaXB0b3Igb3ZlcmZsb3dzIHRoZSByZWNvcmQsIG91dHB1dCBhIGRlc2NyaXB0b3IKLSAgICAgZm9yIGEgcG9pbnRlciB0byB2b2lkLiAgKi8KLSAgaWYgKCh0b3RhbF9sZW4gPj0gTUFYX0RFQlVHX1JFQ09SRCkgfHwgb3ZlcmZsb3cpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiVmFyaWFibGUgZGVzY3JpcHRvciAlZCB0b28gY29tcGxpY2F0ZWQuICBEZWZpbmVkIGFzIGB2b2lkIConLiIpLAotCQlzcG50LT5kYnhfdHlwZSk7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKHB2b2lkLCA2LCBPQkpfU19DX0RCRyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpID0gMDsKLSAgd2hpbGUgKExwbnQgPCBNQVhfREVCVUdfUkVDT1JEIC0gMSkKLSAgICBMb2NhbFtpKytdID0gTG9jYWxbKytMcG50XTsKLSAgTHBudCA9IGk7Ci0gIC8qIHdlIHVzZSB0aGlzIGZvciByZWZlcmVuY2UgdG8gc3RydWN0dXJlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkICovCi0gIGlmIChzdHJ1Y3RfbnVtYmVyID4gMCkKLSAgICB7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBMcG50LCBPQkpfU19DX0RCRyk7Ci0gICAgICBMcG50ID0gMDsKLSAgICAgIFZNU19TdG9yZV9TdHJ1Y3QgKHN0cnVjdF9udW1iZXIpOwotICAgIH0KLSAgLyogV2UgdXNlIHRoaXMgZm9yIGEgZm9yd2FyZCByZWZlcmVuY2UgdG8gYSBzdHJ1Y3R1cmUgdGhhdCBoYXMgeWV0IHRvCi0gICAgIGJlIGRlZmluZWQuICBXZSBzdG9yZSBmb3VyIGJ5dGVzIG9mIHplcm8gdG8gbWFrZSByb29tIGZvciB0aGUgYWN0dWFsCi0gICAgIGFkZHJlc3Mgb25jZSBpdCBpcyBrbm93bi4gICovCi0gIGlmIChzdHJ1Y3RfbnVtYmVyIDwgMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3RfbnVtYmVyID0gLXN0cnVjdF9udW1iZXI7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBMcG50LCBPQkpfU19DX0RCRyk7Ci0gICAgICBMcG50ID0gMDsKLSAgICAgIFZNU19EZWZfU3RydWN0IChzdHJ1Y3RfbnVtYmVyKTsKLSAgICAgIENPUFlfTE9ORyAoJkxvY2FsW0xwbnRdLCAwTCk7Ci0gICAgICBMcG50ICs9IDQ7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBMcG50LCBPQkpfU19DX0RCRyk7Ci0gICAgICBMcG50ID0gMDsKLSAgICB9Ci0gIGkgPSAwOwotICB3aGlsZSAoaSA8IEFwb2ludCkKLSAgICBMb2NhbFtMcG50KytdID0gQXN1ZmZpeFtpKytdOwotICBpZiAoTHBudCAhPSAwKQotICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIExwbnQsIE9CSl9TX0NfREJHKTsKLSAgTHBudCA9IDA7Ci19Ci0KLQotCS8qICJub3ZlbCBsZW5ndGgiIHR5cGUgZG9lc24ndCB3b3JrIGZvciBzaW1wbGUgYXRvbWljIHR5cGVzICovCi0jZGVmaW5lIFVTRV9CSVRTVFJJTkdfREVTQ1JJUFRPUih0KSAoKHQpLT5hZHZhbmNlZCA9PSBCQVNJQykKLSN1bmRlZiBTRVRVUF9CQVNJQ19UWVBFUwotCi0vKiBUaGlzIHJvdXRpbmUgZ2VuZXJhdGVzIGEgdHlwZSBkZXNjcmlwdGlvbiBmb3IgYSBiaXRmaWVsZC4gICovCi0KLXN0YXRpYyB2b2lkCi1iaXRmaWVsZF9zdWZmaXggKHNwbnQsIHdpZHRoKQotICAgICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7Ci0gICAgIGludCB3aWR0aDsKLXsKLSAgTG9jYWxbTHBudCsrXSA9IDEzOwkJCS8qIHJlYy5sZW49PTEzICovCi0gIExvY2FsW0xwbnQrK10gPSBEU1RfS19UWVBTUEVDOwkvKiBhIHR5cGUgc3BlY2lmaWNhdGlvbiByZWNvcmQgKi8KLSAgTG9jYWxbTHBudCsrXSA9IDA7CQkJLyogbm90IG5hbWVkICovCi0gIENPUFlfU0hPUlQgKCZMb2NhbFtMcG50XSwgOSk7CQkvKiB0eXAubGVuPT05ICovCi0gIExwbnQgKz0gMjsKLSAgTG9jYWxbTHBudCsrXSA9IERTVF9LX1RTX05PVl9MRU5HOwkvKiBUaGlzIHR5cGUgaXMgYSAibm92ZWwgbGVuZ3RoIgotCQkJCQkgICBpbmNhcm5hdGlvbiBvZiBzb21lIG90aGVyIHR5cGUuICAqLwotICBDT1BZX0xPTkcgKCZMb2NhbFtMcG50XSwgd2lkdGgpOwkvKiBzaXplIGluIGJpdHMgPT0gbm92ZWwgbGVuZ3RoICovCi0gIExwbnQgKz0gNDsKLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgTHBudCwgT0JKX1NfQ19EQkcpOwotICBMcG50ID0gMDsKLSAgLyogYXNzZXJ0KCBzcG50LT5zdHJ1Y19udW1iID4gMCApOyAqLwotICBWTVNfU3RvcmVfU3RydWN0IChzcG50LT5zdHJ1Y19udW1iKTsJLyogb3V0cHV0IDQgbW9yZSBieXRlcyAqLwotfQotCi0KLS8qIEZvcm1hbGx5IGRlZmluZSBhIGJ1aWx0aW4gdHlwZSwgc28gdGhhdCBpdCBjYW4gc2VydmUgYXMgdGhlIHRhcmdldCBvZgotICAgYW4gaW5kaXJlY3QgcmVmZXJlbmNlLiAgSXQgbWFrZXMgYml0ZmllbGRfc3VmZml4KCkgZWFzaWVyIGJ5IGF2b2lkaW5nCi0gICB0aGUgbmVlZCB0byB1c2UgYSBmb3J3YXJkIHJlZmVyZW5jZSBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWFjaAotICAgdHlwZSB1c2VkIGluIGEgYml0ZmllbGQuICAqLwotCi1zdGF0aWMgdm9pZAotc2V0dXBfYmFzaWNfdHlwZSAoc3BudCkKLSAgICAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotewotI2lmZGVmIFNFVFVQX0JBU0lDX1RZUEVTCi0gIC8qIFRoaXMgd291bGQgYmUgdmVyeSB1c2VmdWwgaWYgIm5vdmVsIGxlbmd0aCIgZmllbGRzIGFjdHVhbGx5IHdvcmtlZAotICAgICB3aXRoIGJhc2ljIHR5cGVzIGxpa2UgdGhleSBkbyB3aXRoIGVudW1lcmF0ZWQgdHlwZXMuICBIb3dldmVyLAotICAgICB0aGV5IGRvIG5vdCwgc28gdGhpcyBpc24ndCB3b3J0aCBkb2luZyBqdXN0IHNvIHRoYXQgeW91IGNhbiB1c2UKLSAgICAgRVhBTUlORS9UWVBFPShfX2xvbmdfbG9uZ19pbnQpIGluc3RlYWQgb2YgRVhBTUlORS9RVUFELiAgKi8KLSAgY2hhciAqcDsKLSNpZm5kZWYgU0VUVVBfU1lOT05ZTV9UWVBFUwotICAvKiBUaGlzIGRldGVybWluZXMgd2hldGhlciBjb21wYXRpYmxlIHRoaW5ncyBsaWtlIGBpbnQnIGFuZCBgbG9uZyBpbnQnCi0gICAgIG91Z2h0IHRvIGhhdmUgZGlzdGluY3QgdHlwZSByZWNvcmRzIHJhdGhlciB0aGFuIHNoYXJpbmcgb25lLiAgKi8KLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50MjsKLQotICAvKiBmaXJzdCBjaGVjayB3aGV0aGVyIHRoaXMgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHNlZW4gYnkgYW5vdGhlciBuYW1lICovCi0gIGZvciAoc3BudDIgPSBWTVNfU3ltYm9sX3R5cGVfbGlzdFtTWU1UWVBfSEFTSCAoc3BudC0+Vk1TX3R5cGUpXTsKLSAgICAgICBzcG50MjsKLSAgICAgICBzcG50MiA9IHNwbnQyLT5uZXh0KQotICAgIGlmIChzcG50MiAhPSBzcG50ICYmIHNwbnQyLT5WTVNfdHlwZSA9PSBzcG50LT5WTVNfdHlwZSkKLSAgICAgIHsKLQlzcG50LT5zdHJ1Y19udW1iID0gc3BudDItPnN0cnVjX251bWI7Ci0JcmV0dXJuOwotICAgICAgfQotI2VuZGlmCi0KLSAgLyogYHN0cnVjdHVyZSBudW1iZXInIGRvZXNuJ3QgcmVhbGx5IG1lYW4gYHN0cnVjdHVyZSc7IGl0IG1lYW5zIGFuIGluZGV4Ci0gICAgIGludG8gYSBsaW5rZXIgbWFpbnRhaW5lZCBzZXQgb2Ygc2F2ZWQgbG9jYXRpb25zIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkCi0gICAgIGFnYWluIGxhdGVyLiAgKi8KLSAgc3BudC0+c3RydWNfbnVtYiA9ICsrc3RydWN0dXJlX2NvdW50OwotICBWTVNfRGVmX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7CS8qIHJlbWVtYmVyIHdoZXJlIHRoaXMgdHlwZSBsaXZlcyAqLwotICAvKiBkZWZpbmUgdGhlIHNpbXBsZSBzY2FsYXIgdHlwZSAqLwotICBMb2NhbFtMcG50KytdID0gNiArIHN0cmxlbiAoc3ltYm9sX25hbWUpICsgMjsJLyogcmVjLmxlbiAqLwotICBMb2NhbFtMcG50KytdID0gRFNUX0tfVFlQU1BFQzsJLyogcmVjLnR5cD09dHlwZSBzcGVjaWZpY2F0aW9uICovCi0gIExvY2FsW0xwbnQrK10gPSBzdHJsZW4gKHN5bWJvbF9uYW1lKSArIDI7Ci0gIExvY2FsW0xwbnQrK10gPSAnXyc7CQkJLyogcHJlZml4IG5hbWUgd2l0aCAiX18iICovCi0gIExvY2FsW0xwbnQrK10gPSAnXyc7Ci0gIGZvciAocCA9IHN5bWJvbF9uYW1lOyAqcDsgcCsrKQotICAgIExvY2FsW0xwbnQrK10gPSAqcCA9PSAnICcgPyAnXycgOiAqcDsKLSAgQ09QWV9TSE9SVCAoJkxvY2FsW0xwbnRdLCAyKTsJCS8qIHR5cC5sZW49PTIgKi8KLSAgTHBudCArPSAyOwotICBMb2NhbFtMcG50KytdID0gRFNUX0tfVFNfQVRPTTsJLyogdHlwLmtpbmQgaXMgc2ltcGxlIHR5cGUgKi8KLSAgTG9jYWxbTHBudCsrXSA9IHNwbnQtPlZNU190eXBlOwkvKiB0eXAudHlwZSAqLwotICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBMcG50LCBPQkpfU19DX0RCRyk7Ci0gIExwbnQgPSAwOwotI2VuZGlmCS8qIFNFVFVQX0JBU0lDX1RZUEVTICovCi0gIHJldHVybjsKLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgZ2VuZXJhdGVzIGEgc3ltYm9sIGRlZmluaXRpb24gZm9yIGEgQyBzeW1ib2wgZm9yIHRoZSBkZWJ1Z2dlci4KLSAgIEl0IHRha2VzIGEgcHNlY3QgYW5kIG9mZnNldCBmb3IgZ2xvYmFsIHN5bWJvbHM7IGlmIHBzZWN0IDwgMCwgdGhlbiB0aGlzIGlzCi0gICBhIGxvY2FsIHZhcmlhYmxlIGFuZCB0aGUgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIEZQLiAgSW4gdGhpcyBjYXNlIGl0IGNhbgotICAgYmUgZWl0aGVyIGEgdmFyaWFibGUgKE9mZnNldCA8IDApIG9yIGEgcGFyYW1ldGVyIChPZmZzZXQgPiAwKS4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfREJHX3JlY29yZCAoc3BudCwgUHNlY3QsIE9mZnNldCwgTmFtZSkKLSAgICAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotICAgICBpbnQgUHNlY3Q7Ci0gICAgIGludCBPZmZzZXQ7Ci0gICAgIGNoYXIgKk5hbWU7Ci17Ci0gIGNoYXIgKk5hbWVfcG50OwotICBpbnQgbGVuOwotICBpbnQgaSA9IDA7Ci0KLSAgLyogaWYgdGhlcmUgYXJlIGJhZCBjaGFyYWN0ZXJzIGluIG5hbWUsIGNvbnZlcnQgdGhlbSAqLwotICBOYW1lX3BudCA9IGZpeF9uYW1lIChOYW1lKTsKLQotICBsZW4gPSBzdHJsZW4gKE5hbWVfcG50KTsKLSAgaWYgKFBzZWN0IDwgMCkKLSAgICB7CQkJCS8qIHRoaXMgaXMgYSBsb2NhbCB2YXJpYWJsZSwgcmVmZXJlbmNlZCB0byBTUCAqLwotICAgICAgTG9jYWxbaSsrXSA9IDcgKyBsZW47Ci0gICAgICBMb2NhbFtpKytdID0gc3BudC0+Vk1TX3R5cGU7Ci0gICAgICBMb2NhbFtpKytdID0gKE9mZnNldCA+IDApID8gREJHX0NfRlVOQ1RJT05fUEFSQU0gOiBEQkdfQ19MT0NBTF9TWU07Ci0gICAgICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgT2Zmc2V0KTsKLSAgICAgIGkgKz0gNDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBMb2NhbFtpKytdID0gNyArIGxlbjsKLSAgICAgIExvY2FsW2krK10gPSBzcG50LT5WTVNfdHlwZTsKLSAgICAgIExvY2FsW2krK10gPSBEU1RfS19WQUxLSU5EX0FERFI7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0gICAgICBpID0gMDsKLSAgICAgIFZNU19TZXRfRGF0YSAoUHNlY3QsIE9mZnNldCwgT0JKX1NfQ19EQkcsIDApOwotICAgIH0KLSAgTG9jYWxbaSsrXSA9IGxlbjsKLSAgd2hpbGUgKCpOYW1lX3BudCAhPSAnXDAnKQotICAgIExvY2FsW2krK10gPSAqTmFtZV9wbnQrKzsKLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICBpZiAoc3BudC0+Vk1TX3R5cGUgPT0gREJHX1NfQ19BRFZBTkNFRF9UWVBFKQotICAgIGdlbmVyYXRlX3N1ZmZpeCAoc3BudCwgMCk7Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIHBhcnNlcyB0aGUgc3RhYnMgZW50cmllcyBpbiBvcmRlciB0byBtYWtlIHRoZSBkZWZpbml0aW9uCi0gICBmb3IgdGhlIGRlYnVnZ2VyIG9mIGxvY2FsIHN5bWJvbHMgYW5kIGZ1bmN0aW9uIHBhcmFtZXRlcnMuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX2xvY2FsX3N0YWJfUGFyc2UgKHNwKQotICAgICBzeW1ib2xTICpzcDsKLXsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotICBjaGFyICpwbnQ7Ci0gIGNoYXIgKnBudDE7Ci0gIGNoYXIgKnN0cjsKLSAgaW50IGRieF90eXBlOwotCi0gIGRieF90eXBlID0gMDsKLSAgc3RyID0gU19HRVRfTkFNRSAoc3ApOwotICBwbnQgPSAoY2hhciAqKSBzdHJjaHIgKHN0ciwgJzonKTsKLSAgaWYgKCFwbnQpCi0gICAgcmV0dXJuOwkJCS8qIG5vIGNvbG9uIHByZXNlbnQgKi8KLSAgcG50MSA9IHBudCsrOwkJCS8qIHNhdmUgdGhpcyBmb3IgbGF0ZXIsIGFuZCBza2lwIGNvbG9uICovCi0gIGlmICgqcG50ID09ICdjJykKLSAgICByZXR1cm47CQkJLyogaWdub3JlIHN0YXRpYyBjb25zdGFudHMgKi8KLQotLyogdGhlcmUgaXMgb25lIGxpdHRsZSBjYXRjaCB0aGF0IHdlIG11c3QgYmUgYXdhcmUgb2YuICBTb21ldGltZXMgZnVuY3Rpb24KLSAqIHBhcmFtZXRlcnMgYXJlIG9wdGltaXplZCBpbnRvIHJlZ2lzdGVycywgYW5kIHRoZSBjb21waWxlciwgaW4gaXRzIGluZmlpdGUKLSAqIHdpc2RvbSBvdXRwdXRzIHN0YWJzIHJlY29yZHMgZm9yICpib3RoKi4gIEluIGdlbmVyYWwgd2Ugd2FudCB0byB1c2UgdGhlCi0gKiByZWdpc3RlciBpZiBpdCBpcyBwcmVzZW50LCBzbyB3ZSBtdXN0IHNlYXJjaCB0aGUgcmVzdCBvZiB0aGUgc3ltYm9scyBmb3IKLSAqIHRoaXMgZnVuY3Rpb24gdG8gc2VlIGlmIHRoaXMgcGFyYW1ldGVyIGlzIGFzc2lnbmVkIHRvIGEgcmVnaXN0ZXIuCi0gKi8KLSAgewotICAgIHN5bWJvbFMgKnNwMTsKLSAgICBjaGFyICpzdHIxOwotICAgIGNoYXIgKnBudDI7Ci0KLSAgICBpZiAoKnBudCA9PSAncCcpCi0gICAgICB7Ci0JZm9yIChzcDEgPSBzeW1ib2xfbmV4dCAoc3ApOyBzcDE7IHNwMSA9IHN5bWJvbF9uZXh0IChzcDEpKQotCSAgewotCSAgICBpZiAoIVNfSVNfREVCVUcgKHNwMSkpCi0JICAgICAgY29udGludWU7Ci0JICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoc3AxKSA9PSBOX0ZVTikKLQkgICAgICB7Ci0JCXBudDIgPSAoY2hhciAqKSBzdHJjaHIgKFNfR0VUX05BTUUgKHNwMSksICc6JykgKyAxOwotCQlpZiAoKnBudDIgPT0gJ0YnIHx8ICpwbnQyID09ICdmJykKLQkJICBicmVhazsKLQkgICAgICB9Ci0JICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoc3AxKSAhPSBOX1JTWU0pCi0JICAgICAgY29udGludWU7Ci0JICAgIHN0cjEgPSBTX0dFVF9OQU1FIChzcDEpOwkvKiBhbmQgZ2V0IHRoZSBuYW1lICovCi0JICAgIHBudDIgPSBzdHI7Ci0JICAgIHdoaWxlICgqcG50MiAhPSAnOicpCi0JICAgICAgewotCQlpZiAoKnBudDIgIT0gKnN0cjEpCi0JCSAgYnJlYWs7Ci0JCXBudDIrKzsKLQkJc3RyMSsrOwotCSAgICAgIH0KLQkgICAgaWYgKCpzdHIxID09ICc6JyAmJiAqcG50MiA9PSAnOicpCi0JICAgICAgcmV0dXJuOwkvKiB0aGV5IGFyZSB0aGUgc2FtZSEgIGxldHMgc2tpcCB0aGlzIG9uZSAqLwotCSAgfQkJCS8qIGZvciAqLwotCXBudCsrOwkJCS8qIHNraXAgcCBpbiBjYXNlIG5vIHJlZ2lzdGVyICovCi0gICAgICB9CQkJLyogaWYgKi8KLSAgfQkJCQkvKiBwIGJsb2NrICovCi0KLSAgcG50ID0gY3Z0X2ludGVnZXIgKHBudCwgJmRieF90eXBlKTsKLSAgc3BudCA9IGZpbmRfc3ltYm9sIChkYnhfdHlwZSk7Ci0gIGlmICghc3BudCkKLSAgICByZXR1cm47CQkJLypEdW5ubyB3aGF0IHRoaXMgaXMqLwotICAqcG50MSA9ICdcMCc7Ci0gIFZNU19EQkdfcmVjb3JkIChzcG50LCAtMSwgU19HRVRfVkFMVUUgKHNwKSwgc3RyKTsKLSAgKnBudDEgPSAnOic7CQkJLyogYW5kIHJlc3RvcmUgdGhlIHN0cmluZyAqLwotICByZXR1cm47Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIHBhcnNlcyBhIHN0YWJzIGVudHJ5IHRvIGZpbmQgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkCi0gICB0byBkZWZpbmUgYSB2YXJpYWJsZS4gIEl0IGlzIHVzZWQgZm9yIGdsb2JhbCBhbmQgc3RhdGljIHZhcmlhYmxlcy4KLSAgIEJhc2ljYWxseSB3ZSBuZWVkIHRvIGtub3cgdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4gIFdpdGggb2xkZXIKLSAgIHZlcnNpb25zIG9mIHRoZSBjb21waWxlciwgY29uc3Qgc3ltYm9scyBhcmUgdHJlYXRlZCBkaWZmZXJlbnRseSwgaW4KLSAgIHRoYXQgaWYgdGhleSBhcmUgZ2xvYmFsIHRoZXkgYXJlIHdyaXR0ZW4gaW50byB0aGUgdGV4dCBwc2VjdC4gIFRoZQotICAgZ2xvYmFsIHN5bWJvbCBlbnRyeSBmb3Igc3VjaCBhIGNvbnN0IGlzIGFjdHVhbGx5IHdyaXR0ZW4gYXMgYSBwcm9ncmFtCi0gICBlbnRyeSBwb2ludCAoWXVrISEpLCBzbyBpZiB3ZSBjYW5ub3QgZmluZCBhIHN5bWJvbCBpbiB0aGUgbGlzdCBvZgotICAgcHNlY3RzLCB3ZSBtdXN0IHNlYXJjaCB0aGUgZW50cnkgcG9pbnRzIGFzIHdlbGwuICBzdGF0aWMgY29uc3RzIGFyZQotICAgZXZlbiBoYXJkZXIsIHNpbmNlIHRoZXkgYXJlIG5ldmVyIGFzc2lnbmVkIGEgbWVtb3J5IGFkZHJlc3MuICBUaGUKLSAgIGNvbXBpbGVyIHBhc3NlcyBhIHN0YWIgdG8gdGVsbCB1cyB0aGUgdmFsdWUsIGJ1dCBJIGFtIG5vdCBzdXJlIHdoYXQKLSAgIHRvIGRvIHdpdGggaXQuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX3N0YWJfcGFyc2UgKHNwLCBleHBlY3RlZF90eXBlLCB0eXBlMSwgdHlwZTIsIFRleHRfUHNlY3QpCi0gICAgIHN5bWJvbFMgKnNwOwotICAgICBpbnQgZXhwZWN0ZWRfdHlwZTsJLyogY2hhciAqLwotICAgICBpbnQgdHlwZTEsIHR5cGUyLCBUZXh0X1BzZWN0OwotewotICBjaGFyICpwbnQ7Ci0gIGNoYXIgKnBudDE7Ci0gIGNoYXIgKnN0cjsKLSAgc3ltYm9sUyAqc3AxOwotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7Ci0gIHN0cnVjdCBWTVNfU3ltYm9sICp2c3A7Ci0gIGludCBkYnhfdHlwZTsKLQotICBkYnhfdHlwZSA9IDA7Ci0gIHN0ciA9IFNfR0VUX05BTUUgKHNwKTsKLSAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChzdHIsICc6Jyk7Ci0gIGlmICghcG50KQotICAgIHJldHVybjsJCQkvKiBubyBjb2xvbiBwcmVzZW50ICovCi0gIHBudDEgPSBwbnQ7CQkJLyogc2F2ZSB0aGlzIGZvciBsYXRlciovCi0gIHBudCsrOwotICBpZiAoKnBudCA9PSBleHBlY3RlZF90eXBlKQotICAgIHsKLSAgICAgIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmZGJ4X3R5cGUpOwotICAgICAgc3BudCA9IGZpbmRfc3ltYm9sIChkYnhfdHlwZSk7Ci0gICAgICBpZiAoIXNwbnQpCi0JcmV0dXJuOwkJLypEdW5ubyB3aGF0IHRoaXMgaXMqLwotICAgICAgLyoKLSAgICAgICAqIE5vdyB3ZSBuZWVkIHRvIHNlYXJjaCB0aGUgc3ltYm9sIHRhYmxlIHRvIGZpbmQgdGhlIHBzZWN0IGFuZAotICAgICAgICogb2Zmc2V0IGZvciB0aGlzIHZhcmlhYmxlLgotICAgICAgICovCi0gICAgICAqcG50MSA9ICdcMCc7Ci0gICAgICB2c3AgPSBWTVNfU3ltYm9sczsKLSAgICAgIHdoaWxlICh2c3ApCi0JewotCSAgcG50ID0gU19HRVRfTkFNRSAodnNwLT5TeW1ib2wpOwotCSAgaWYgKHBudCAmJiAqcG50KysgPT0gJ18nCi0JICAgICAgLyogbWFrZSBzdXJlIG5hbWUgaXMgdGhlIHNhbWUgYW5kIHN5bWJvbCB0eXBlIG1hdGNoZXMgKi8KLQkgICAgICAmJiBzdHJjbXAgKHBudCwgc3RyKSA9PSAwCi0JICAgICAgJiYgKFNfR0VUX1JBV19UWVBFICh2c3AtPlN5bWJvbCkgPT0gdHlwZTEKLQkJICB8fCBTX0dFVF9SQVdfVFlQRSAodnNwLT5TeW1ib2wpID09IHR5cGUyKSkKLQkgICAgYnJlYWs7Ci0JICB2c3AgPSB2c3AtPk5leHQ7Ci0JfQotICAgICAgaWYgKHZzcCkKLQl7Ci0JICBWTVNfREJHX3JlY29yZCAoc3BudCwgdnNwLT5Qc2VjdF9JbmRleCwgdnNwLT5Qc2VjdF9PZmZzZXQsIHN0cik7Ci0JICAqcG50MSA9ICc6JzsJCS8qIGFuZCByZXN0b3JlIHRoZSBzdHJpbmcgKi8KLQkgIHJldHVybjsKLQl9Ci0gICAgICAvKiBUaGUgc3ltYm9sIHdhcyBub3QgaW4gdGhlIHN5bWJvbCBsaXN0LCBidXQgaXQgbWF5IGJlIGFuCi0gICAgICAgICAiZW50cnkgcG9pbnQiIGlmIGl0IHdhcyBhIGNvbnN0YW50LiAgKi8KLSAgICAgIGZvciAoc3AxID0gc3ltYm9sX3Jvb3RQOyBzcDE7IHNwMSA9IHN5bWJvbF9uZXh0IChzcDEpKQotCXsKLQkgIC8qCi0JICAgKglEaXNwYXRjaCBvbiBTVEFCIHR5cGUKLQkgICAqLwotCSAgaWYgKFNfSVNfREVCVUcgKHNwMSkgfHwgKFNfR0VUX1RZUEUgKHNwMSkgIT0gTl9URVhUKSkKLQkgICAgY29udGludWU7Ci0JICBwbnQgPSBTX0dFVF9OQU1FIChzcDEpOwotCSAgaWYgKCpwbnQgPT0gJ18nKQotCSAgICBwbnQrKzsKLQkgIGlmIChzdHJjbXAgKHBudCwgc3RyKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCFnYXZlX2NvbXBpbGVyX21lc3NhZ2UgJiYgZXhwZWN0ZWRfdHlwZSA9PSAnRycpCi0JCXsKLQkJICBjaGFyICpsb25nX2NvbnN0X21zZyA9IF8oIlwKLSoqKldhcm5pbmcgLSB0aGUgYXNzZW1ibHkgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIGhhcyBwbGFjZWQgXG5cCi0gZ2xvYmFsIGNvbnN0YW50KHMpIGluIHRoZSB0ZXh0IHBzZWN0LiAgVGhlc2Ugd2lsbCBub3QgYmUgYXZhaWxhYmxlIHRvIFxuXAotIG90aGVyIG1vZHVsZXMsIHNpbmNlIHRoaXMgaXMgbm90IHRoZSBjb3JyZWN0IHdheSB0byBoYW5kbGUgdGhpcy4gWW91IFxuXAotIGhhdmUgdHdvIG9wdGlvbnM6IDEpIGdldCBhIHBhdGNoZWQgY29tcGlsZXIgdGhhdCBkb2VzIG5vdCBwdXQgZ2xvYmFsIFxuXAotIGNvbnN0YW50cyBpbiB0aGUgdGV4dCBwc2VjdCwgb3IgMikgcmVtb3ZlIHRoZSAnY29uc3QnIGtleXdvcmQgZnJvbSBcblwKLSBkZWZpbml0aW9ucyBvZiBnbG9iYWwgdmFyaWFibGVzIGluIHlvdXIgc291cmNlIG1vZHVsZShzKS4gIERvbid0IHNheSBcblwKLSBJIGRpZG4ndCB3YXJuIHlvdSEgXG4iKTsKLQotCQkgIGFzX3Rza3RzayAobG9uZ19jb25zdF9tc2cpOwotCQkgIGdhdmVfY29tcGlsZXJfbWVzc2FnZSA9IDE7Ci0JCX0KLQkgICAgICBWTVNfREJHX3JlY29yZCAoc3BudCwKLQkJCSAgICAgIFRleHRfUHNlY3QsCi0JCQkgICAgICBTX0dFVF9WQUxVRSAoc3AxKSwKLQkJCSAgICAgIHN0cik7Ci0JICAgICAgKnBudDEgPSAnOic7Ci0JICAgICAgLyogZm9vbCBhc3NlbWJsZXIgdG8gbm90IG91dHB1dCB0aGlzIGFzIGEgcm91dGluZSBpbiB0aGUgVEJUICovCi0JICAgICAgcG50MSA9IFNfR0VUX05BTUUgKHNwMSk7Ci0JICAgICAgKnBudDEgPSAnTCc7Ci0JICAgICAgU19TRVRfTkFNRSAoc3AxLCBwbnQxKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotICAqcG50MSA9ICc6JzsJCQkvKiBhbmQgcmVzdG9yZSB0aGUgc3RyaW5nICovCi0gIHJldHVybjsKLX0KLQotCi0vKiBTaW1wbGVyIGludGVyZmFjZXMgaW50byBWTVNfc3RhYl9wYXJzZSgpLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19HU1lNX1BhcnNlIChzcCwgVGV4dF9Qc2VjdCkKLSAgICAgc3ltYm9sUyAqc3A7Ci0gICAgIGludCBUZXh0X1BzZWN0OwotewkJCQkvKiBHbG9iYWwgdmFyaWFibGVzICovCi0gIFZNU19zdGFiX3BhcnNlIChzcCwgJ0cnLCAoTl9VTkRGIHwgTl9FWFQpLCAoTl9EQVRBIHwgTl9FWFQpLCBUZXh0X1BzZWN0KTsKLX0KLQotc3RhdGljIHZvaWQKLVZNU19MQ1NZTV9QYXJzZSAoc3AsIFRleHRfUHNlY3QpCi0gICAgIHN5bWJvbFMgKnNwOwotICAgICBpbnQgVGV4dF9Qc2VjdDsKLXsJCQkJLyogU3RhdGljIHN5bWJvbHMgLSB1bmluaXRpYWxpemVkICovCi0gIFZNU19zdGFiX3BhcnNlIChzcCwgJ1MnLCBOX0JTUywgLTEsIFRleHRfUHNlY3QpOwotfQotCi1zdGF0aWMgdm9pZAotVk1TX1NUU1lNX1BhcnNlIChzcCwgVGV4dF9Qc2VjdCkKLSAgICAgc3ltYm9sUyAqc3A7Ci0gICAgIGludCBUZXh0X1BzZWN0OwotewkJCQkvKiBTdGF0aWMgc3ltYm9scyAtIGluaXRpYWxpemVkICovCi0gIFZNU19zdGFiX3BhcnNlIChzcCwgJ1MnLCBOX0RBVEEsIC0xLCBUZXh0X1BzZWN0KTsKLX0KLQotCi0vKiBGb3IgcmVnaXN0ZXIgc3ltYm9scywgd2UgbXVzdCBmaWd1cmUgb3V0IHdoYXQgcmFuZ2Ugb2YgYWRkcmVzc2VzCi0gICB3aXRoaW4gdGhlIHBzZWN0IGFyZSB2YWxpZC4gIFdlIHdpbGwgdXNlIHRoZSBicmFja2V0cyBpbiB0aGUgc3RhYgotICAgZGlyZWN0aXZlcyB0byBnaXZlIHVzIGd1aWRhbmNlIGFzIHRvIHRoZSBQQyByYW5nZSB0aGF0IHRoaXMgdmFyaWFibGUKLSAgIGlzIGluIHNjb3BlLiAgSSBhbSBzdGlsbCBub3QgY29tcGxldGVseSBjb21mb3J0YWJsZSB3aXRoIHRoaXMgYnV0Ci0gICBhcyBJIGxlYXJuIG1vcmUsIEkgc2VlbSB0byBnZXQgYSBiZXR0ZXIgaGFuZGxlIG9uIHdoYXQgaXMgZ29pbmcgb24uCi0gICBDYXZlYXQgRW1wdG9yLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19SU1lNX1BhcnNlIChzcCwgQ3VycmVudF9Sb3V0aW5lLCBUZXh0X1BzZWN0KQotICAgICBzeW1ib2xTICpzcCwgKkN1cnJlbnRfUm91dGluZTsKLSAgICAgaW50IFRleHRfUHNlY3Q7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLSAgY2hhciAqcG50OwotICBjaGFyICpwbnQxOwotICBjaGFyICpzdHI7Ci0gIGludCBkYnhfdHlwZTsKLSAgaW50IGxlbjsKLSAgaW50IGkgPSAwOwotICBpbnQgYmNudCA9IDA7Ci0gIGludCBNaW5fT2Zmc2V0ID0gLTE7CQkvKiBtaW4gUEMgb2YgdmFsaWRpdHkgKi8KLSAgaW50IE1heF9PZmZzZXQgPSAwOwkJLyogbWF4IFBDIG9mIHZhbGlkaXR5ICovCi0KLSAgZm9yIChzeW1ib2xQID0gc3A7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCURpc3BhdGNoIG9uIFNUQUIgdHlwZQotICAgICAgICovCi0gICAgICBzd2l0Y2ggKFNfR0VUX1JBV19UWVBFIChzeW1ib2xQKSkKLQl7Ci0JY2FzZSBOX0xCUkFDOgotCSAgaWYgKGJjbnQrKyA9PSAwKQotCSAgICBNaW5fT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1JCUkFDOgotCSAgaWYgKC0tYmNudCA9PSAwKQotCSAgICBNYXhfT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHN5bWJvbFApIC0gMTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmICgoTWluX09mZnNldCAhPSAtMSkgJiYgKGJjbnQgPT0gMCkpCi0JYnJlYWs7Ci0gICAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHN5bWJvbFApID09IE5fRlVOKQotCXsKLQkgIHBudCA9IChjaGFyICopIHN0cmNociAoU19HRVRfTkFNRSAoc3ltYm9sUCksICc6JykgKyAxOwotCSAgaWYgKCpwbnQgPT0gJ0YnIHx8ICpwbnQgPT0gJ2YnKSBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBhZGRyZXNzZXMgd2VyZSBkZWZpbmVkLiAgSWYgbm90LCB0aGVuIHRoZXJlCi0gICAgIHdlcmUgbm8gYnJhY2tldHMgaW4gdGhlIGZ1bmN0aW9uLCBhbmQgd2UgbXVzdCB0cnkgdG8gc2VhcmNoIGZvcgotICAgICB0aGUgbmV4dCBmdW5jdGlvbi4gIFNpbmNlIGZ1bmN0aW9ucyBjYW4gYmUgaW4gYW55IG9yZGVyLCB3ZSBzaG91bGQKLSAgICAgc2VhcmNoIGFsbCBvZiB0aGUgc3ltYm9sIGxpc3QgdG8gZmluZCB0aGUgY29ycmVjdCBlbmRpbmcgYWRkcmVzcy4gICovCi0gIGlmIChNaW5fT2Zmc2V0ID09IC0xKQotICAgIHsKLSAgICAgIGludCBNYXhfU291cmNlX09mZnNldDsKLSAgICAgIGludCBUaGlzX09mZnNldDsKLQotICAgICAgTWluX09mZnNldCA9IFNfR0VUX1ZBTFVFIChzcCk7Ci0gICAgICBNYXhfU291cmNlX09mZnNldCA9IE1pbl9PZmZzZXQ7CS8qIGp1c3QgaW4gY2FzZSBubyBOX1NMSU5FcyBmb3VuZCAqLwotICAgICAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotCXN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHN5bWJvbFApKQotCSAgewotCSAgY2FzZSBOX1RFWFQgfCBOX0VYVDoKLQkgICAgVGhpc19PZmZzZXQgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7Ci0JICAgIGlmIChUaGlzX09mZnNldCA+IE1pbl9PZmZzZXQgJiYgVGhpc19PZmZzZXQgPCBNYXhfT2Zmc2V0KQotCSAgICAgIE1heF9PZmZzZXQgPSBUaGlzX09mZnNldDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE5fU0xJTkU6Ci0JICAgIFRoaXNfT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCSAgICBpZiAoVGhpc19PZmZzZXQgPiBNYXhfU291cmNlX09mZnNldCkKLQkgICAgICBNYXhfU291cmNlX09mZnNldCA9IFRoaXNfT2Zmc2V0OwotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGxhc3Qgcm91dGluZSwgdGhlbiB3ZSB1c2UgdGhlIFBDIG9mIHRoZSBsYXN0IHNvdXJjZQotICAgICAgICAgbGluZSBhcyBhIG1hcmtlciBvZiB0aGUgbWF4IFBDIGZvciB3aGljaCB0aGlzIHJlZyBpcyB2YWxpZC4gICovCi0gICAgICBpZiAoTWF4X09mZnNldCA9PSAweDdmZmZmZmZmKQotCU1heF9PZmZzZXQgPSBNYXhfU291cmNlX09mZnNldDsKLSAgICB9Ci0KLSAgZGJ4X3R5cGUgPSAwOwotICBzdHIgPSBTX0dFVF9OQU1FIChzcCk7Ci0gIGlmICgocG50ID0gKGNoYXIgKikgc3RyY2hyIChzdHIsICc6JykpID09IDApCi0gICAgcmV0dXJuOwkJCS8qIG5vIGNvbG9uIHByZXNlbnQgKi8KLSAgcG50MSA9IHBudDsJCQkvKiBzYXZlIHRoaXMgZm9yIGxhdGVyKi8KLSAgcG50Kys7Ci0gIGlmICgqcG50ICE9ICdyJykKLSAgICByZXR1cm47Ci0gIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmZGJ4X3R5cGUpOwotICBzcG50ID0gZmluZF9zeW1ib2wgKGRieF90eXBlKTsKLSAgaWYgKCFzcG50KQotICAgIHJldHVybjsJCQkvKkR1bm5vIHdoYXQgdGhpcyBpcyB5ZXQqLwotICAqcG50MSA9ICdcMCc7Ci0gIHBudCA9IGZpeF9uYW1lIChTX0dFVF9OQU1FIChzcCkpOwkvKiBpZiB0aGVyZSBhcmUgYmFkIGNoYXJhY3RlcnMgaW4gbmFtZSwgY29udmVydCB0aGVtICovCi0gIGxlbiA9IHN0cmxlbiAocG50KTsKLSAgTG9jYWxbaSsrXSA9IDI1ICsgbGVuOwotICBMb2NhbFtpKytdID0gc3BudC0+Vk1TX3R5cGU7Ci0gIExvY2FsW2krK10gPSBEU1RfS19WRkxBR1NfVFZTOwkvKiB0cmFpbGluZyB2YWx1ZSBzcGVjaWZpZWQgKi8KLSAgQ09QWV9MT05HICgmTG9jYWxbaV0sIDEgKyBsZW4pOwkvKiByZWxhdGl2ZSBvZmZzZXQsIGJleW9uZCBuYW1lICovCi0gIGkgKz0gNDsKLSAgTG9jYWxbaSsrXSA9IGxlbjsJCQkvKiBuYW1lIGxlbmd0aCAoYXNjaWMgcHJlZml4KSAqLwotICB3aGlsZSAoKnBudCAhPSAnXDAnKQotICAgIExvY2FsW2krK10gPSAqcG50Kys7Ci0gIExvY2FsW2krK10gPSBEU1RfS19WU19GT0xMT1dTOwkvKiB2YWx1ZSBzcGVjaWZpY2F0aW9uIGZvbGxvd3MgKi8KLSAgQ09QWV9TSE9SVCAoJkxvY2FsW2ldLCAxNSk7CQkvKiBsZW5ndGggb2YgcmVzdCBvZiByZWNvcmQgKi8KLSAgaSArPSAyOwotICBMb2NhbFtpKytdID0gRFNUX0tfVlNfQUxMT0NfU1BMSVQ7CS8qIHNwbGl0IGxpZmV0aW1lICovCi0gIExvY2FsW2krK10gPSAxOwkJCS8qIG9uZSBiaW5kaW5nIGZvbGxvd3MgKi8KLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICBpID0gMDsKLSAgVk1TX1NldF9EYXRhIChUZXh0X1BzZWN0LCBNaW5fT2Zmc2V0LCBPQkpfU19DX0RCRywgMSk7Ci0gIFZNU19TZXRfRGF0YSAoVGV4dF9Qc2VjdCwgTWF4X09mZnNldCwgT0JKX1NfQ19EQkcsIDEpOwotICBMb2NhbFtpKytdID0gRFNUX0tfVkFMS0lORF9SRUc7CQkvKiBuZXN0ZWQgdmFsdWUgc3BlYyAqLwotICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgU19HRVRfVkFMVUUgKHNwKSk7Ci0gIGkgKz0gNDsKLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICAqcG50MSA9ICc6JzsKLSAgaWYgKHNwbnQtPlZNU190eXBlID09IERCR19TX0NfQURWQU5DRURfVFlQRSkKLSAgICBnZW5lcmF0ZV9zdWZmaXggKHNwbnQsIDApOwotfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gZXhhbWluZXMgYSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiwgY2hlY2tpbmcgYWxsIG9mIHRoZSBlbGVtZW50cwotICAgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIG9mIHRoZW0gYXJlIGZ1bGx5IGRlZmluZWQuICBUaGUgb25seSB0aGluZyB0aGF0IHdlCi0gICBraWNrIG91dCBhcmUgYXJyYXlzIG9mIHVuZGVmaW5lZCBzdHJ1Y3RzLCBzaW5jZSB3ZSBkbyBub3Qga25vdyBob3cgYmlnCi0gICB0aGV5IGFyZS4gIEFsbCBvdGhlcnMgd2UgY2FuIGhhbmRsZSB3aXRoIGEgbm9ybWFsIGZvcndhcmQgcmVmZXJlbmNlLiAgKi8KLQotc3RhdGljIGludAotZm9yd2FyZF9yZWZlcmVuY2UgKHBudCkKLSAgICAgY2hhciAqcG50OwotewotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQsICpzcG50MTsKLSAgaW50IGk7Ci0KLSAgcG50ID0gY3Z0X2ludGVnZXIgKHBudCArIDEsICZpKTsKLSAgaWYgKCpwbnQgPT0gJzsnKQotICAgIHJldHVybiAwOwkJCS8qIG5vIGZvcndhcmQgcmVmZXJlbmNlcyAqLwotICBkbwotICAgIHsKLSAgICAgIHBudCA9IChjaGFyICopIHN0cmNociAocG50LCAnOicpOwotICAgICAgcG50ID0gY3Z0X2ludGVnZXIgKHBudCArIDEsICZpKTsKLSAgICAgIHNwbnQgPSBmaW5kX3N5bWJvbCAoaSk7Ci0gICAgICB3aGlsZSAoc3BudCAmJiAoc3BudC0+YWR2YW5jZWQgPT0gUE9JTlRFUiB8fCBzcG50LT5hZHZhbmNlZCA9PSBBUlJBWSkpCi0JewotCSAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudC0+dHlwZTIpOwotCSAgaWYgKHNwbnQtPmFkdmFuY2VkID09IEFSUkFZICYmICFzcG50MSkKLQkgICAgcmV0dXJuIDE7Ci0JICBzcG50ID0gc3BudDE7Ci0JfQotICAgICAgcG50ID0gY3Z0X2ludGVnZXIgKHBudCArIDEsICZpKTsKLSAgICAgIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmaSk7Ci0gICAgfSB3aGlsZSAoKisrcG50ICE9ICc7Jyk7Ci0gIHJldHVybiAwOwkJCS8qIG5vIGZvcndhcmQgcmVmZW5jZXMgZm91bmQgKi8KLX0KLQotCi0vKiBVc2VkIHRvIGNoZWNrIGEgc2luZ2xlIGVsZW1lbnQgb2YgYSBzdHJ1Y3R1cmUgb24gdGhlIGZpbmFsIHBhc3MuICAqLwotCi1zdGF0aWMgaW50Ci1maW5hbF9mb3J3YXJkX3JlZmVyZW5jZSAoc3BudCkKLSAgICAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotewotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQxOwotCi0gIHdoaWxlIChzcG50ICYmIChzcG50LT5hZHZhbmNlZCA9PSBQT0lOVEVSIHx8IHNwbnQtPmFkdmFuY2VkID09IEFSUkFZKSkKLSAgICB7Ci0gICAgICBzcG50MSA9IGZpbmRfc3ltYm9sIChzcG50LT50eXBlMik7Ci0gICAgICBpZiAoc3BudC0+YWR2YW5jZWQgPT0gQVJSQVkgJiYgIXNwbnQxKQotCXJldHVybiAxOwotICAgICAgc3BudCA9IHNwbnQxOwotICAgIH0KLSAgcmV0dXJuIDA7CS8qIG5vIGZvcndhcmQgcmVmZW5jZXMgZm91bmQgKi8KLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgcGFyc2VzIHRoZSBzdGFicyBkaXJlY3RpdmVzIHRvIGZpbmQgYW55IGRlZmluaXRpb25zIG9mIGRieAotICAgdHlwZSBudW1iZXJzLiAgSXQgbWFrZXMgYSBub3RlIG9mIGFsbCBvZiB0aGVtLCBjcmVhdGluZyBhIHN0cnVjdHVyZQotICAgZWxlbWVudCBvZiBWTVNfREJHX1N5bWJvbCB0aGF0IGRlc2NyaWJlcyBpdC4gIFRoaXMgYWxzbyBnZW5lcmF0ZXMgdGhlCi0gICBpbmZvIGZvciB0aGUgZGVidWdnZXIgdGhhdCBkZXNjcmliZXMgdGhlIHN0cnVjdC91bmlvbi9lbnVtLCBzbyB0aGF0Ci0gICBmdXJ0aGVyIHJlZmVyZW5jZXMgdG8gdGhlc2UgZGF0YSB0eXBlcyB3aWxsIGJlIGJ5IG51bWJlcgotCi0gICBXZSBoYXZlIHRvIHByb2Nlc3MgcG9pbnRlcnMgcmlnaHQgYXdheSwgc2luY2UgdGhlcmUgY2FuIGJlIHJlZmVyZW5jZXMKLSAgIHRvIHRoZW0gbGF0ZXIgaW4gdGhlIHNhbWUgc3RhYnMgZGlyZWN0aXZlLiAgV2UgY2Fubm90IGhhdmUgZm9yd2FyZAotICAgcmVmZXJlbmNlcyB0byBwb2ludGVycywgKGJ1dCB3ZSBjYW4gaGF2ZSBhIGZvcndhcmQgcmVmZXJlbmNlIHRvIGEKLSAgIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUvZW51bS91bmlvbikgYW5kIHRoaXMgaXMgd2h5IHdlIHByb2Nlc3MgdGhlbQotICAgaW1tZWRpYXRlbHkuICBBZnRlciB3ZSBwcm9jZXNzIHRoZSBwb2ludGVyLCB0aGVuIHdlIHNlYXJjaCBmb3IgZGVmcwotICAgdGhhdCBhcmUgbmVzdGVkIGV2ZW4gZGVlcGVyLgotCi0gICA4LzE1LzkyOiBXZSBoYXZlIHRvIHByb2Nlc3MgYXJyYXlzIHJpZ2h0IGF3YXkgdG9vLCBiZWNhdXNlIHRoZXJlIGNhbgotICAgYmUgbXVsdGlwbGUgcmVmZXJlbmNlcyB0byBpZGVudGljYWwgYXJyYXkgdHlwZXMgaW4gb25lIHN0cnVjdHVyZQotICAgZGVmaW5pdGlvbiwgYW5kIG9ubHkgdGhlIGZpcnN0IG9uZSBoYXMgdGhlIGRlZmluaXRpb24uICAqLwotCi1zdGF0aWMgaW50Ci1WTVNfdHlwZWRlZl9wYXJzZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnBudDsKLSAgY2hhciAqcG50MTsKLSAgY29uc3QgY2hhciAqcG50MjsKLSAgaW50IGk7Ci0gIGludCBkdHlwZTsKLSAgc3RydWN0IGZvcndhcmRfcmVmICpmcG50OwotICBpbnQgaTEsIGkyLCBpMywgbGVuOwotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDE7Ci0KLSAgLyogY2hlY2sgZm9yIGFueSBuZXN0ZWQgZGVmJ3MgKi8KLSAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChzdHIgKyAxLCAnPScpOwotICBpZiAocG50ICYmIHN0clsxXSAhPSAnKicgJiYgKHN0clsxXSAhPSAnYScgfHwgc3RyWzJdICE9ICdyJykKLSAgICAgICYmIFZNU190eXBlZGVmX3BhcnNlIChwbnQpID09IDEpCi0gICAgcmV0dXJuIDE7Ci0gIC8qIG5vdyBmaW5kIGRieF90eXBlIG9mIGVudHJ5ICovCi0gIHBudCA9IHN0ciAtIDE7Ci0gIGlmICgqcG50ID09ICdjJykKLSAgICB7CQkJCS8qIGNoZWNrIGZvciBzdGF0aWMgY29uc3RhbnRzICovCi0gICAgICAqc3RyID0gJ1wwJzsJCS8qIGZvciBub3cgd2UgaWdub3JlIHRoZW0gKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgd2hpbGUgKCgqcG50IDw9ICc5JykgJiYgKCpwbnQgPj0gJzAnKSkKLSAgICBwbnQtLTsKLSAgcG50Kys7CQkJLyogYW5kIGdldCBiYWNrIHRvIHRoZSBudW1iZXIgKi8KLSAgY3Z0X2ludGVnZXIgKHBudCwgJmkxKTsKLSAgc3BudCA9IGZpbmRfc3ltYm9sIChpMSk7Ci0gIC8qIGZpcnN0IHNlZSBpZiB0aGlzIGhhcyBiZWVuIGRlZmluZWQgYWxyZWFkeSwgZHVlIHRvIGZvcndhcmQgcmVmZXJlbmNlICovCi0gIGlmICghc3BudCkKLSAgICB7Ci0gICAgICBpMiA9IFNZTVRZUF9IQVNIIChpMSk7Ci0gICAgICBzcG50ID0gKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBWTVNfREJHX1N5bWJvbCkpOwotICAgICAgc3BudC0+bmV4dCA9IFZNU19TeW1ib2xfdHlwZV9saXN0W2kyXTsKLSAgICAgIFZNU19TeW1ib2xfdHlwZV9saXN0W2kyXSA9IHNwbnQ7Ci0gICAgICBzcG50LT5kYnhfdHlwZSA9IGkxOwkvKiBhbmQgc2F2ZSB0aGUgdHlwZSAqLwotICAgICAgc3BudC0+dHlwZTIgPSBzcG50LT5WTVNfdHlwZSA9IHNwbnQtPmRhdGFfc2l6ZSA9IDA7Ci0gICAgICBzcG50LT5pbmRleF9taW4gPSBzcG50LT5pbmRleF9tYXggPSBzcG50LT5zdHJ1Y19udW1iID0gMDsKLSAgICB9Ci0gIC8qCi0gICAqIEZvciBzdHJ1Y3RzIGFuZCB1bmlvbnMsIGRvIGEgcGFydGlhbCBwYXJzZSwgb3RoZXJ3aXNlIHdlIHNvbWV0aW1lcyBnZXQKLSAgICogY2lyY3VsYXIgZGVmaW5pdGlvbnMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZXNvbHZlLiAgV2UgcmVhZCBlbm91Z2gKLSAgICogaW5mbyBzbyB0aGF0IGFueSByZWZlcmVuY2UgdG8gdGhpcyB0eXBlIGhhcyBlbm91Z2ggaW5mbyB0byBiZSByZXNvbHZlZC4KLSAgICovCi0gIHBudCA9IHN0ciArIDE7CQkvKiBwb2ludCB0byBjaGFyYWN0ZXIgcGFzdCBlcXVhbCBzaWduICovCi0gIGlmICgqcG50ID49ICcwJyAmJiAqcG50IDw9ICc5JykKLSAgICB7Ci0gICAgICBpZiAodHlwZV9jaGVjayAoInZvaWQiKSkKLQl7CQkJLyogdGhpcyBpcyB0aGUgdm9pZCBzeW1ib2wgKi8KLQkgICpzdHIgPSAnXDAnOwotCSAgc3BudC0+YWR2YW5jZWQgPSBWT0lEOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgaWYgKHR5cGVfY2hlY2sgKCJ1bmtub3duIHR5cGUiKSkKLQl7Ci0JICAqc3RyID0gJ1wwJzsKLQkgIHNwbnQtPmFkdmFuY2VkID0gVU5LTk9XTjsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50LCAmaTEpOwotICAgICAgaWYgKGkxICE9IHNwbnQtPmRieF90eXBlKQotCXsKLQkgIHNwbnQtPmFkdmFuY2VkID0gQUxJQVM7Ci0JICBzcG50LT50eXBlMiA9IGkxOwotCSAgc3RyY3B5IChzdHIsIHBudDEpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYXNfdHNrdHNrIChfKCJkZWJ1Z2dpbmVyIG91dHB1dDogJWQgaXMgYW4gdW5rbm93biB1bnR5cGVkIHZhcmlhYmxlLiIpLAotCQkgc3BudC0+ZGJ4X3R5cGUpOwotICAgICAgcmV0dXJuIDE7CQkJLyogZG8gbm90IGtub3cgd2hhdCB0aGlzIGlzICovCi0gICAgfQotCi0gIHBudCA9IHN0ciArIDE7CQkvKiBwb2ludCB0byBjaGFyYWN0ZXIgcGFzdCBlcXVhbCBzaWduICovCi0gIHN3aXRjaCAoKnBudCkKLSAgICB7Ci0gICAgY2FzZSAncic6Ci0gICAgICBzcG50LT5hZHZhbmNlZCA9IEJBU0lDOwotICAgICAgaWYgKHR5cGVfY2hlY2sgKCJpbnQiKSkKLQl7Ci0JICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfU0xJTlQ7Ci0JICBzcG50LT5kYXRhX3NpemUgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJsb25nIGludCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19TTElOVDsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoInVuc2lnbmVkIGludCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19VTElOVDsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImxvbmcgdW5zaWduZWQgaW50IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1VMSU5UOwotCSAgc3BudC0+ZGF0YV9zaXplID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgic2hvcnQgaW50IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1NTSU5UOwotCSAgc3BudC0+ZGF0YV9zaXplID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgic2hvcnQgdW5zaWduZWQgaW50IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1VTSU5UOwotCSAgc3BudC0+ZGF0YV9zaXplID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgiY2hhciIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19TQ0hBUjsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoInNpZ25lZCBjaGFyIikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1NDSEFSOwotCSAgc3BudC0+ZGF0YV9zaXplID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgidW5zaWduZWQgY2hhciIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19VQ0hBUjsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImZsb2F0IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1JFQUw0OwotCSAgc3BudC0+ZGF0YV9zaXplID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgiZG91YmxlIikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSB2YXhfZ19kb3VibGVzID8gREJHX1NfQ19SRUFMOF9HIDogREJHX1NfQ19SRUFMODsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDg7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImxvbmcgZG91YmxlIikpCi0JewotCSAgLyogc2FtZSBhcyBkb3VibGUsIGF0IGxlYXN0IGZvciBub3cgKi8KLQkgIHNwbnQtPlZNU190eXBlID0gdmF4X2dfZG91YmxlcyA/IERCR19TX0NfUkVBTDhfRyA6IERCR19TX0NfUkVBTDg7Ci0JICBzcG50LT5kYXRhX3NpemUgPSA4OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJsb25nIGxvbmcgaW50IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1NRVUFEOwkvKiBzaWduZWQgcXVhZHdvcmQgKi8KLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDg7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImxvbmcgbG9uZyB1bnNpZ25lZCBpbnQiKSkKLQl7Ci0JICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfVVFVQUQ7CS8qIHVuc2lnbmVkIHF1YWR3b3JkICovCi0JICBzcG50LT5kYXRhX3NpemUgPSA4OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJjb21wbGV4IGZsb2F0IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX0NPTVBMWDQ7Ci0JICBzcG50LT5kYXRhX3NpemUgPSAyICogNDsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgiY29tcGxleCBkb3VibGUiKSkKLQl7Ci0JICBzcG50LT5WTVNfdHlwZSA9IHZheF9nX2RvdWJsZXMgPyBEQkdfU19DX0NPTVBMWDhfRyA6IERCR19TX0NfQ09NUExYODsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDIgKiA4OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJjb21wbGV4IGxvbmcgZG91YmxlIikpCi0JewotCSAgLyogc2FtZSBhcyBjb21wbGV4IGRvdWJsZSwgYXQgbGVhc3QgZm9yIG5vdyAqLwotCSAgc3BudC0+Vk1TX3R5cGUgPSB2YXhfZ19kb3VibGVzID8gREJHX1NfQ19DT01QTFg4X0cgOiBEQkdfU19DX0NPTVBMWDg7Ci0JICBzcG50LT5kYXRhX3NpemUgPSAyICogODsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyoJW3ByXQotCSAgICogU2hvdWxkbid0IGdldCBoZXJlLCBidXQgaWYgd2UgZG8sIHNvbWV0aGluZwotCSAgICogbW9yZSBzdWJzdGFudGlhbCBvdWdodCB0byBiZSBkb25lLi4uCi0JICAgKi8KLQkgIHNwbnQtPlZNU190eXBlID0gMDsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDA7Ci0JfQotICAgICAgaWYgKHNwbnQtPlZNU190eXBlICE9IDApCi0Jc2V0dXBfYmFzaWNfdHlwZSAoc3BudCk7Ci0gICAgICBwbnQxID0gKGNoYXIgKikgc3RyY2hyIChzdHIsICc7JykgKyAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAndSc6Ci0gICAgICBzcG50LT5hZHZhbmNlZCA9ICgqcG50ID09ICdzJykgPyBTVFJVQ1QgOiBVTklPTjsKLSAgICAgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19BRFZBTkNFRF9UWVBFOwotICAgICAgcG50MSA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmc3BudC0+ZGF0YV9zaXplKTsKLSAgICAgIGlmICghZmluYWxfcGFzcyAmJiBmb3J3YXJkX3JlZmVyZW5jZSAocG50KSkKLQl7Ci0JICBzcG50LT5zdHJ1Y19udW1iID0gLTE7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBzcG50LT5zdHJ1Y19udW1iID0gKytzdHJ1Y3R1cmVfY291bnQ7Ci0gICAgICBwbnQxLS07Ci0gICAgICBwbnQgPSBnZXRfc3RydWN0X25hbWUgKHN0cik7Ci0gICAgICBWTVNfRGVmX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7Ci0gICAgICBpID0gMDsKLSAgICAgIGZvciAoZnBudCA9IGZfcmVmX3Jvb3Q7IGZwbnQ7IGZwbnQgPSBmcG50LT5uZXh0KQotCWlmIChmcG50LT5kYnhfdHlwZSA9PSBzcG50LT5kYnhfdHlwZSkKLQkgIHsKLQkgICAgZnBudC0+cmVzb2x2ZWQgPSAnWSc7Ci0JICAgIFZNU19TZXRfU3RydWN0IChmcG50LT5zdHJ1Y19udW1iKTsKLQkgICAgVk1TX1N0b3JlX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7Ci0JICAgIGkrKzsKLQkgIH0KLSAgICAgIGlmIChpID4gMCkKLQlWTVNfU2V0X1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7Ci0gICAgICBpID0gMDsKLSAgICAgIExvY2FsW2krK10gPSAxMSArIHN0cmxlbiAocG50KTsKLSAgICAgIExvY2FsW2krK10gPSBEQkdfU19DX1NUUlVDVF9TVEFSVDsKLSAgICAgIExvY2FsW2krK10gPSBEU1RfS19WRkxBR1NfTk9WQUw7CS8qIHN0cnVjdHVyZSBkZWZpbml0aW9uIG9ubHkgKi8KLSAgICAgIENPUFlfTE9ORyAoJkxvY2FsW2ldLCAwTCk7CS8qIGhlbmNlIHZhbHVlIGlzIHVudXNlZCAqLwotICAgICAgaSArPSA0OwotICAgICAgTG9jYWxbaSsrXSA9IHN0cmxlbiAocG50KTsKLSAgICAgIHBudDIgPSBwbnQ7Ci0gICAgICB3aGlsZSAoKnBudDIgIT0gJ1wwJykKLQlMb2NhbFtpKytdID0gKnBudDIrKzsKLSAgICAgIGkyID0gc3BudC0+ZGF0YV9zaXplICogODsJLyogbnVtYmVyIG9mIGJpdHMgKi8KLSAgICAgIENPUFlfTE9ORyAoJkxvY2FsW2ldLCBpMik7Ci0gICAgICBpICs9IDQ7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0gICAgICBpID0gMDsKLSAgICAgIGlmIChwbnQgIT0gc3ltYm9sX25hbWUpCi0JewotCSAgcG50ICs9IHN0cmxlbiAocG50KTsKLQkgICpwbnQgPSAnOic7Ci0JfQkJCS8qIHJlcGxhY2UgY29sb24gZm9yIGxhdGVyICovCi0gICAgICB3aGlsZSAoKisrcG50MSAhPSAnOycpCi0JewotCSAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChwbnQxLCAnOicpOwotCSAgKnBudCA9ICdcMCc7Ci0JICBwbnQyID0gcG50MTsKLQkgIHBudDEgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJmR0eXBlKTsKLQkgIHBudDEgPSBjdnRfaW50ZWdlciAocG50MSArIDEsICZpMik7Ci0JICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudDEgKyAxLCAmaTMpOwotCSAgc3BudDEgPSBmaW5kX3N5bWJvbCAoZHR5cGUpOwotCSAgbGVuID0gc3RybGVuIChwbnQyKTsKLQkgIGlmIChzcG50MSAmJiAoc3BudDEtPmFkdmFuY2VkID09IEJBU0lDIHx8IHNwbnQxLT5hZHZhbmNlZCA9PSBFTlVNKQotCSAgICAgICYmICgoaTMgIT0gc3BudDEtPmRhdGFfc2l6ZSAqIDgpIHx8IChpMiAlIDggIT0gMCkpKQotCSAgICB7CQkJLyogYml0ZmllbGQgKi8KLQkgICAgICBpZiAoVVNFX0JJVFNUUklOR19ERVNDUklQVE9SIChzcG50MSkpCi0JCXsKLQkJICAvKiBUaGlzIHVzZXMgYSB0eXBlIGRlc2NyaXB0b3IsIHdoaWNoIGRvZXNuJ3Qgd29yayBpZgotCQkgICAgIHRoZSBlbmNsb3Npbmcgc3RydWN0dXJlIGhhcyBiZWVuIHBsYWNlZCBpbiBhIHJlZ2lzdGVyLgotCQkgICAgIEFsc28sIGVudW0gYml0ZmllbGRzIGRlZ2VuZXJhdGUgdG8gc2ltcGxlIGludGVnZXJzLiAgKi8KLQkJICBpbnQgdW5zaWduZWRfdHlwZSA9IChzcG50MS0+Vk1TX3R5cGUgPT0gREJHX1NfQ19VTElOVAotCQkJCSAgICB8fCBzcG50MS0+Vk1TX3R5cGUgPT0gREJHX1NfQ19VU0lOVAotCQkJCSAgICB8fCBzcG50MS0+Vk1TX3R5cGUgPT0gREJHX1NfQ19VQ0hBUgotCQkJCSAgICB8fCBzcG50MS0+Vk1TX3R5cGUgPT0gREJHX1NfQ19VUVVBRAotCQkJCSAgICB8fCBzcG50MS0+YWR2YW5jZWQgPT0gRU5VTSk7IC8qIChhcHByb3hpbWF0ZSkgKi8KLQkJICBBcG9pbnQgPSAwOwotCQkgIGZwdXNoICgxOSArIGxlbiwgMSk7Ci0JCSAgZnB1c2ggKHVuc2lnbmVkX3R5cGUgPyBEQkdfU19DX1VCSVRVIDogREJHX1NfQ19TQklUVSwgMSk7Ci0JCSAgZnB1c2ggKERTVF9LX1ZGTEFHU19EU0MsIDEpOwkvKiBzcGVjaWZpZWQgYnkgZGVzY3JpcHRvciAqLwotCQkgIGZwdXNoICgxICsgbGVuLCA0KTsJLyogcmVsYXRpdmUgb2Zmc2V0IHRvIGRlc2NyaXB0b3IgKi8KLQkJICBmcHVzaCAobGVuLCAxKTsJCS8qIGxlbmd0aCBieXRlIChhc2NpYyBwcmVmaXgpICovCi0JCSAgd2hpbGUgKCpwbnQyICE9ICdcMCcpCS8qIG5hbWUgYnl0ZXMgKi8KLQkJICAgIGZwdXNoICgqcG50MisrLCAxKTsKLQkJICBmcHVzaCAoaTMsIDIpOwkvKiBkc2MgbGVuZ3RoID09IHNpemUgb2YgYml0ZmllbGQgKi8KLQkJCQkJLyogZHNjIHR5cGUgPT0gdW4/c2lnbmVkIGJpdGZpZWxkICovCi0JCSAgZnB1c2ggKHVuc2lnbmVkX3R5cGUgPyBEQkdfU19DX1VCSVRVIDogREJHX1NfQ19TQklUVSwgMSk7Ci0JCSAgZnB1c2ggKERTQ19LX0NMQVNTX1VCUywgMSk7CS8qIGRzYyBjbGFzcyA9PSB1bmFsaWduZWQgYml0c3RyaW5nICovCi0JCSAgZnB1c2ggKDB4MDAsIDQpOwkJLyogZHNjIHBvaW50ZXIgPT0gemVyb2VzICovCi0JCSAgZnB1c2ggKGkyLCA0KTsJLyogc3RhcnQgcG9zaXRpb24gKi8KLQkJICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKEFzdWZmaXgsIEFwb2ludCwgT0JKX1NfQ19EQkcpOwotCQkgIEFwb2ludCA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBVc2UgYSAibm92ZWwgbGVuZ3RoIiB0eXBlIHNwZWNpZmljYXRpb24sIHdoaWNoIHdvcmtzCi0JCSAgICAgcmlnaHQgZm9yIHJlZ2lzdGVyIHN0cnVjdHVyZXMgYW5kIGZvciBlbnVtIGJpdGZpZWxkcwotCQkgICAgIGJ1dCByZXN1bHRzIGluIGxhcmdlciBvYmplY3QgbW9kdWxlcy4gICovCi0JCSAgTG9jYWxbaSsrXSA9IDcgKyBsZW47Ci0JCSAgTG9jYWxbaSsrXSA9IERCR19TX0NfQURWQU5DRURfVFlQRTsJLyogdHlwZSBzcGVjIGZvbGxvd3MgKi8KLQkJICBMb2NhbFtpKytdID0gREJHX1NfQ19TVFJVQ1RfSVRFTTsJLyogdmFsdWUgaXMgYSBiaXQgb2Zmc2V0ICovCi0JCSAgQ09QWV9MT05HICgmTG9jYWxbaV0sIGkyKTsJCS8qIGJpdCBvZmZzZXQgKi8KLQkJICBpICs9IDQ7Ci0JCSAgTG9jYWxbaSsrXSA9IHN0cmxlbiAocG50Mik7Ci0JCSAgd2hpbGUgKCpwbnQyICE9ICdcMCcpCi0JCSAgICBMb2NhbFtpKytdID0gKnBudDIrKzsKLQkJICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0JCSAgaSA9IDA7Ci0JCSAgYml0ZmllbGRfc3VmZml4IChzcG50MSwgaTMpOwotCSAgICAgfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsJCQkvKiBub3QgYSBiaXRmaWVsZCAqLwotCSAgICAgIC8qIGNoZWNrIGlmIHRoaXMgaXMgYSBmb3J3YXJkIHJlZmVyZW5jZSAqLwotCSAgICAgIGlmIChmaW5hbF9wYXNzICYmIGZpbmFsX2ZvcndhcmRfcmVmZXJlbmNlIChzcG50MSkpCi0JCXsKLQkJICBhc190c2t0c2sgKF8oImRlYnVnZ2VyIG91dHB1dDogc3RydWN0dXJlIGVsZW1lbnQgYCVzJyBoYXMgdW5kZWZpbmVkIHR5cGUiKSwKLQkJCSAgIHBudDIpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgTG9jYWxbaSsrXSA9IDcgKyBsZW47Ci0JICAgICAgTG9jYWxbaSsrXSA9IHNwbnQxID8gc3BudDEtPlZNU190eXBlIDogREJHX1NfQ19BRFZBTkNFRF9UWVBFOwotCSAgICAgIExvY2FsW2krK10gPSBEQkdfU19DX1NUUlVDVF9JVEVNOwotCSAgICAgIENPUFlfTE9ORyAoJkxvY2FsW2ldLCBpMik7CQkvKiBiaXQgb2Zmc2V0ICovCi0JICAgICAgaSArPSA0OwotCSAgICAgIExvY2FsW2krK10gPSBzdHJsZW4gKHBudDIpOwotCSAgICAgIHdoaWxlICgqcG50MiAhPSAnXDAnKQotCQlMb2NhbFtpKytdID0gKnBudDIrKzsKLQkgICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0JICAgICAgaSA9IDA7Ci0JICAgICAgaWYgKCFzcG50MSkKLQkJZ2VuZXJhdGVfc3VmZml4IChzcG50MSwgZHR5cGUpOwotCSAgICAgIGVsc2UgaWYgKHNwbnQxLT5WTVNfdHlwZSA9PSBEQkdfU19DX0FEVkFOQ0VEX1RZUEUpCi0JCWdlbmVyYXRlX3N1ZmZpeCAoc3BudDEsIDApOwotCSAgICB9Ci0JfQotICAgICAgcG50MSsrOwotICAgICAgTG9jYWxbaSsrXSA9IDB4MDE7CS8qIGxlbmd0aCBieXRlICovCi0gICAgICBMb2NhbFtpKytdID0gREJHX1NfQ19TVFJVQ1RfRU5EOwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICAgICAgaSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdlJzoKLSAgICAgIHNwbnQtPmFkdmFuY2VkID0gRU5VTTsKLSAgICAgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19BRFZBTkNFRF9UWVBFOwotICAgICAgc3BudC0+c3RydWNfbnVtYiA9ICsrc3RydWN0dXJlX2NvdW50OwotICAgICAgc3BudC0+ZGF0YV9zaXplID0gNDsKLSAgICAgIFZNU19EZWZfU3RydWN0IChzcG50LT5zdHJ1Y19udW1iKTsKLSAgICAgIGkgPSAwOwotICAgICAgZm9yIChmcG50ID0gZl9yZWZfcm9vdDsgZnBudDsgZnBudCA9IGZwbnQtPm5leHQpCi0JaWYgKGZwbnQtPmRieF90eXBlID09IHNwbnQtPmRieF90eXBlKQotCSAgewotCSAgICBmcG50LT5yZXNvbHZlZCA9ICdZJzsKLQkgICAgVk1TX1NldF9TdHJ1Y3QgKGZwbnQtPnN0cnVjX251bWIpOwotCSAgICBWTVNfU3RvcmVfU3RydWN0IChzcG50LT5zdHJ1Y19udW1iKTsKLQkgICAgaSsrOwotCSAgfQotICAgICAgaWYgKGkgPiAwKQotCVZNU19TZXRfU3RydWN0IChzcG50LT5zdHJ1Y19udW1iKTsKLSAgICAgIGkgPSAwOwotICAgICAgbGVuID0gc3RybGVuIChzeW1ib2xfbmFtZSk7Ci0gICAgICBMb2NhbFtpKytdID0gMyArIGxlbjsKLSAgICAgIExvY2FsW2krK10gPSBEQkdfU19DX0VOVU1fU1RBUlQ7Ci0gICAgICBMb2NhbFtpKytdID0gNCAqIDg7CQkvKiBlbnVtIHZhbHVlcyBhcmUgMzIgYml0cyAqLwotICAgICAgTG9jYWxbaSsrXSA9IGxlbjsKLSAgICAgIHBudDIgPSBzeW1ib2xfbmFtZTsKLSAgICAgIHdoaWxlICgqcG50MiAhPSAnXDAnKQotCUxvY2FsW2krK10gPSAqcG50MisrOwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICAgICAgaSA9IDA7Ci0gICAgICB3aGlsZSAoKisrcG50ICE9ICc7JykKLQl7Ci0JICBwbnQxID0gKGNoYXIgKikgc3RyY2hyIChwbnQsICc6Jyk7Ci0JICAqcG50MSsrID0gJ1wwJzsKLQkgIHBudDEgPSBjdnRfaW50ZWdlciAocG50MSwgJmkxKTsKLQkgIGxlbiA9IHN0cmxlbiAocG50KTsKLQkgIExvY2FsW2krK10gPSA3ICsgbGVuOwotCSAgTG9jYWxbaSsrXSA9IERCR19TX0NfRU5VTV9JVEVNOwotCSAgTG9jYWxbaSsrXSA9IERTVF9LX1ZBTEtJTkRfTElURVJBTDsKLQkgIENPUFlfTE9ORyAoJkxvY2FsW2ldLCBpMSk7Ci0JICBpICs9IDQ7Ci0JICBMb2NhbFtpKytdID0gbGVuOwotCSAgcG50MiA9IHBudDsKLQkgIHdoaWxlICgqcG50ICE9ICdcMCcpCi0JICAgIExvY2FsW2krK10gPSAqcG50Kys7Ci0JICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0JICBpID0gMDsKLQkgIHBudCA9IHBudDE7CQkvKiBTa2lwIGZpbmFsIHNlbWljb2xvbiAqLwotCX0KLSAgICAgIExvY2FsW2krK10gPSAweDAxOwkvKiBsZW4gYnl0ZSAqLwotICAgICAgTG9jYWxbaSsrXSA9IERCR19TX0NfRU5VTV9FTkQ7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0gICAgICBpID0gMDsKLSAgICAgIHBudDEgPSBwbnQgKyAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYSc6Ci0gICAgICBzcG50LT5hZHZhbmNlZCA9IEFSUkFZOwotICAgICAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX0FEVkFOQ0VEX1RZUEU7Ci0gICAgICBwbnQgPSAoY2hhciAqKSBzdHJjaHIgKHBudCwgJzsnKTsKLSAgICAgIGlmICghcG50KQotCXJldHVybiAxOwotICAgICAgcG50MSA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmc3BudC0+aW5kZXhfbWluKTsKLSAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50MSArIDEsICZzcG50LT5pbmRleF9tYXgpOwotICAgICAgcG50MSA9IGN2dF9pbnRlZ2VyIChwbnQxICsgMSwgJnNwbnQtPnR5cGUyKTsKLSAgICAgIHBudCA9IChjaGFyICopIHN0cmNociAoc3RyICsgMSwgJz0nKTsKLSAgICAgIGlmIChwbnQgJiYgVk1TX3R5cGVkZWZfcGFyc2UgKHBudCkgPT0gMSkKLQlyZXR1cm4gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2YnOgotICAgICAgc3BudC0+YWR2YW5jZWQgPSBGVU5DVElPTjsKLSAgICAgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19GVU5DVElPTl9BRERSOwotICAgICAgLyogdGhpcyBtYXNxdWVyYWRlcyBhcyBhIGJhc2ljIHR5cGUqLwotICAgICAgc3BudC0+ZGF0YV9zaXplID0gNDsKLSAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJnNwbnQtPnR5cGUyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJyonOgotICAgICAgc3BudC0+YWR2YW5jZWQgPSBQT0lOVEVSOwotICAgICAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX0FEVkFOQ0VEX1RZUEU7Ci0gICAgICBzcG50LT5kYXRhX3NpemUgPSA0OwotICAgICAgcG50MSA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmc3BudC0+dHlwZTIpOwotICAgICAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChzdHIgKyAxLCAnPScpOwotICAgICAgaWYgKHBudCAmJiBWTVNfdHlwZWRlZl9wYXJzZSAocG50KSA9PSAxKQotCXJldHVybiAxOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHNwbnQtPmFkdmFuY2VkID0gVU5LTk9XTjsKLSAgICAgIHNwbnQtPlZNU190eXBlID0gMDsKLSAgICAgIGFzX3Rza3RzayAoXygiZGVidWdnZXIgb3V0cHV0OiAlZCBpcyBhbiB1bmtub3duIHR5cGUgb2YgdmFyaWFibGUuIiksCi0JCSBzcG50LT5kYnhfdHlwZSk7Ci0gICAgICByZXR1cm4gMTsJCQkvKiB1bmFibGUgdG8gZGVjaXBoZXIgKi8KLSAgICB9Ci0gIC8qIFRoaXMgcmVtb3ZlcyB0aGUgZXZpZGVuY2Ugb2YgdGhlIGRlZmluaXRpb24gc28gdGhhdCB0aGUgb3V0ZXIgbGV2ZWxzCi0gICAgIG9mIHBhcnNpbmcgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgaXQuICAqLwotICBwbnQgPSBzdHI7Ci0gIHdoaWxlICgqcG50MSAhPSAnXDAnKQotICAgICpwbnQrKyA9ICpwbnQxKys7Ci0gICpwbnQgPSAnXDAnOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUaGlzIGlzIHRoZSByb290IHJvdXRpbmUgdGhhdCBwYXJzZXMgdGhlIHN0YWJzIGVudHJpZXMgZm9yIGRlZmluaXRpb25zLgotICAgaXQgY2FsbHMgVk1TX3R5cGVkZWZfcGFyc2UsIHdoaWNoIGNhbiBpbiB0dXJuIGNhbGwgaXRzZWxmLiAgV2UgbmVlZCB0bwotICAgYmUgY2FyZWZ1bCwgc2luY2Ugc29tZXRpbWVzIHRoZXJlIGFyZSBmb3J3YXJkIHJlZmVyZW5jZXMgdG8gb3RoZXIgc3ltYm9sCi0gICB0eXBlcywgYW5kIHRoZXNlIGNhbm5vdCBiZSByZXNvbHZlZCB1bnRpbCB3ZSBoYXZlIGNvbXBsZXRlZCB0aGUgcGFyc2UuCi0KLSAgIEFsc28gY2hlY2sgYW5kIHNlZSBpZiB3ZSBhcmUgdXNpbmcgY29udGludWF0aW9uIHN0YWJzLCBpZiB3ZSBhcmUsIHRoZW4KLSAgIHBhc3RlIHRvZ2V0aGVyIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIHN0YWIgYmVmb3JlIHdlIHBhc3MgaXQgdG8KLSAgIFZNU190eXBlZGVmX3BhcnNlLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19MU1lNX1BhcnNlICgpCi17Ci0gIGNoYXIgKnBudDsKLSAgY2hhciAqcG50MTsKLSAgY2hhciAqcG50MjsKLSAgY2hhciAqc3RyOwotICBjaGFyICpwYXJzZV9idWZmZXIgPSAwOwotICBjaGFyIGZpeGl0WzEwXTsKLSAgaW50IGluY29tcGxldGUsIHBhc3MsIGluY29tMTsKLSAgc3RydWN0IGZvcndhcmRfcmVmICpmcG50OwotICBzeW1ib2xTICpzcDsKLQotICBwYXNzID0gMDsKLSAgZmluYWxfcGFzcyA9IDA7Ci0gIGluY29tcGxldGUgPSAwOwotICBkbwotICAgIHsKLSAgICAgIGluY29tMSA9IGluY29tcGxldGU7Ci0gICAgICBpbmNvbXBsZXRlID0gMDsKLSAgICAgIGZvciAoc3AgPSBzeW1ib2xfcm9vdFA7IHNwOyBzcCA9IHN5bWJvbF9uZXh0IChzcCkpCi0JewotCSAgLyoKLQkgICAqCURlYWwgd2l0aCBTVEFCIHN5bWJvbHMKLQkgICAqLwotCSAgaWYgKFNfSVNfREVCVUcgKHNwKSkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICoJRGlzcGF0Y2ggb24gU1RBQiB0eXBlCi0JICAgICAgICovCi0JICAgICAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoc3ApKQotCQl7Ci0JCWNhc2UgTl9HU1lNOgotCQljYXNlIE5fTENTWU06Ci0JCWNhc2UgTl9TVFNZTToKLQkJY2FzZSBOX1BTWU06Ci0JCWNhc2UgTl9SU1lNOgotCQljYXNlIE5fTFNZTToKLQkJY2FzZSBOX0ZVTjoJLypzb21ldGltZXMgdGhlc2UgY29udGFpbiB0eXBlZGVmcyovCi0JCSAgc3RyID0gU19HRVRfTkFNRSAoc3ApOwotCQkgIHN5bWJvbF9uYW1lID0gc3RyOwotCQkgIHBudCA9IHN0ciArIHN0cmxlbiAoc3RyKSAtIDE7Ci0JCSAgaWYgKCpwbnQgPT0gJz8nKSAgLyogQ29udGludWF0aW9uIHN0YWIuICAqLwotCQkgICAgewotCQkgICAgICBzeW1ib2xTICpzcG5leHQ7Ci0JCSAgICAgIGludCB0bGVuID0gMDsKLQotCQkgICAgICBzcG5leHQgPSBzcDsKLQkJICAgICAgZG8gewotCQkJdGxlbiArPSBzdHJsZW4gKHN0cikgLSAxOwotCQkJc3BuZXh0ID0gc3ltYm9sX25leHQgKHNwbmV4dCk7Ci0JCQlzdHIgPSBTX0dFVF9OQU1FIChzcG5leHQpOwotCQkJcG50ID0gc3RyICsgc3RybGVuIChzdHIpIC0gMTsKLQkJICAgICAgfSB3aGlsZSAoKnBudCA9PSAnPycpOwotCQkgICAgICB0bGVuICs9IHN0cmxlbiAoc3RyKTsKLQkJICAgICAgcGFyc2VfYnVmZmVyID0gKGNoYXIgKikgeG1hbGxvYyAodGxlbiArIDEpOwotCQkgICAgICBzdHJjcHkgKHBhcnNlX2J1ZmZlciwgU19HRVRfTkFNRSAoc3ApKTsKLQkJICAgICAgcG50MiA9IHBhcnNlX2J1ZmZlciArIHN0cmxlbiAocGFyc2VfYnVmZmVyKSAtIDE7Ci0JCSAgICAgICpwbnQyID0gJ1wwJzsKLQkJICAgICAgc3BuZXh0ID0gc3A7Ci0JCSAgICAgIGRvIHsKLQkJCXNwbmV4dCA9IHN5bWJvbF9uZXh0IChzcG5leHQpOwotCQkJc3RyID0gU19HRVRfTkFNRSAoc3BuZXh0KTsKLQkJCXN0cmNhdCAocG50Miwgc3RyKTsKLQkJCXBudDIgKz0gIHN0cmxlbiAoc3RyKSAtIDE7Ci0JCQkqc3RyID0gJ1wwJzsgIC8qIEVyYXNlIHRoaXMgc3RyaW5nICAqLwotCQkgICAgIC8qIFNfU0VUX05BTUUgKHNwbmV4dCwgc3RyKTsgKi8KLQkJCWlmICgqcG50MiAhPSAnPycpIGJyZWFrOwotCQkJKnBudDIgPSAnXDAnOwotCQkgICAgICB9IHdoaWxlICgxKTsKLQkJICAgICAgc3RyID0gcGFyc2VfYnVmZmVyOwotCQkgICAgICBzeW1ib2xfbmFtZSA9IHN0cjsKLQkJICAgIH0KLQkJICBpZiAoKHBudCA9IChjaGFyICopIHN0cmNociAoc3RyLCAnOicpKSAhPSAwKQotCQkgICAgewotCQkgICAgICAqcG50ID0gJ1wwJzsKLQkJICAgICAgcG50MSA9IHBudCArIDE7Ci0JCSAgICAgIGlmICgocG50MiA9IChjaGFyICopIHN0cmNociAocG50MSwgJz0nKSkgIT0gMCkKLQkJCWluY29tcGxldGUgKz0gVk1TX3R5cGVkZWZfcGFyc2UgKHBudDIpOwotCQkgICAgICBpZiAocGFyc2VfYnVmZmVyKQotCQkJewotCQkJICAvKiAgQXQgdGhpcyBwb2ludCB0aGUgcGFyc2UgYnVmZmVyIHNob3VsZCBqdXN0Ci0JCQkgICAgICBjb250YWluIG5hbWU6bm4uICBJZiBpdCBkb2VzIG5vdCwgdGhlbiB3ZQotCQkJICAgICAgYXJlIGluIHJlYWwgdHJvdWJsZS4gIEFueXdheSwgdGhpcyBpcyBhbHdheXMKLQkJCSAgICAgIHNob3J0ZXIgdGhhbiB0aGUgb3JpZ2luYWwgbGluZS4gICovCi0JCQkgIHBudDIgPSBTX0dFVF9OQU1FIChzcCk7Ci0JCQkgIHN0cmNweSAocG50MiwgcGFyc2VfYnVmZmVyKTsKLQkJICAgICAgIC8qIFNfU0VUX05BTUUgKHNwLCBwbnQyKTsgKi8KLQkJCSAgZnJlZSAocGFyc2VfYnVmZmVyKSwgIHBhcnNlX2J1ZmZlciA9IDA7Ci0JCQl9Ci0JCSAgICAgICpwbnQgPSAnOic7CS8qIHB1dCBiYWNrIGNvbG9uIHRvIHJlc3RvcmUgZGJ4X3R5cGUgKi8KLQkJICAgIH0KLQkJICBicmVhazsKLQkJfQkJLypzd2l0Y2gqLwotCSAgICB9CQkJLyogaWYgKi8KLQl9CQkJLypmb3IqLwotICAgICAgcGFzcysrOwotICAgICAgLyoKLSAgICAgICAqIE1ha2Ugb25lIGxhc3QgcGFzcywgaWYgbmVlZGVkLCBhbmQgZGVmaW5lIHdoYXRldmVyIHdlIGNhbgotICAgICAgICogdGhhdCBpcyBsZWZ0LgotICAgICAgICovCi0gICAgICBpZiAoZmluYWxfcGFzcyA9PSAwICYmIGluY29tcGxldGUgPT0gaW5jb20xKQotCXsKLQkgIGZpbmFsX3Bhc3MgPSAxOwotCSAgaW5jb20xKys7CS8qIEZvcmNlIG9uZSBsYXN0IHBhc3MgdGhyb3VnaCAqLwotCX0KLSAgfSB3aGlsZSAoaW5jb21wbGV0ZSAhPSAwICYmIGluY29tcGxldGUgIT0gaW5jb20xKTsKLSAgLyogcmVwZWF0IHVudGlsIGFsbCByZWZzIHJlc29sdmVkIGlmIHBvc3NpYmxlICovCi0vKglpZiAocGFzcyA+IDEpIHByaW50ZiAoIiBSZXF1aXJlZCAlZCBwYXNzZXNcbiIsIHBhc3MpOyAqLwotICBpZiAoaW5jb21wbGV0ZSAhPSAwKQotICAgIHsKLSAgICAgIGFzX3Rza3RzayAoXygiZGVidWdnZXIgb3V0cHV0OiBVbmFibGUgdG8gcmVzb2x2ZSAlZCBjaXJjdWxhciByZWZlcmVuY2VzLiIpLAotCQkgaW5jb21wbGV0ZSk7Ci0gICAgfQotICBmcG50ID0gZl9yZWZfcm9vdDsKLSAgc3ltYm9sX25hbWUgPSAiXDAiOwotICB3aGlsZSAoZnBudCkKLSAgICB7Ci0gICAgICBpZiAoZnBudC0+cmVzb2x2ZWQgIT0gJ1knKQotCXsKLQkgIGlmIChmaW5kX3N5bWJvbCAoZnBudC0+ZGJ4X3R5cGUpKQotCSAgICB7Ci0JICAgICAgYXNfdHNrdHNrIChfKCJkZWJ1Z2dlciBmb3J3YXJkIHJlZmVyZW5jZSBlcnJvciwgZGJ4IHR5cGUgJWQiKSwKLQkJCSBmcG50LT5kYnhfdHlwZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGZpeGl0WzBdID0gMDsKLQkgIHNwcmludGYgKCZmaXhpdFsxXSwgIiVkPXM0OyIsIGZwbnQtPmRieF90eXBlKTsKLQkgIHBudDIgPSAoY2hhciAqKSBzdHJjaHIgKCZmaXhpdFsxXSwgJz0nKTsKLQkgIFZNU190eXBlZGVmX3BhcnNlIChwbnQyKTsKLQl9Ci0gICAgICBmcG50ID0gZnBudC0+bmV4dDsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLURlZmluZV9Mb2NhbF9TeW1ib2xzIChzMFAsIHMyUCwgQ3VycmVudF9Sb3V0aW5lLCBUZXh0X1BzZWN0KQotICAgICBzeW1ib2xTICpzMFAsICpzMlA7Ci0gICAgIHN5bWJvbFMgKkN1cnJlbnRfUm91dGluZTsKLSAgICAgaW50IFRleHRfUHNlY3Q7Ci17Ci0gIHN5bWJvbFMgKnMxUDsJCS8qIGVhY2ggc3ltYm9sIGZyb20gczBQIC4uIHMyUCAoZXhjbHVzaXZlKSAqLwotCi0gIGZvciAoczFQID0gc3ltYm9sX25leHQgKHMwUCk7IHMxUCAhPSBzMlA7IHMxUCA9IHN5bWJvbF9uZXh0IChzMVApKQotICAgIHsKLSAgICAgIGlmICghczFQKQotCWJyZWFrOwkJLyogYW5kIHJldHVybiAqLwotICAgICAgaWYgKFNfR0VUX1JBV19UWVBFIChzMVApID09IE5fRlVOKQotCXsKLQkgIGNoYXIgKnBudCA9IChjaGFyICopIHN0cmNociAoU19HRVRfTkFNRSAoczFQKSwgJzonKSArIDE7Ci0JICBpZiAoKnBudCA9PSAnRicgfHwgKnBudCA9PSAnZicpIGJyZWFrOwotCX0KLSAgICAgIGlmICghU19JU19ERUJVRyAoczFQKSkKLQljb250aW51ZTsKLSAgICAgIC8qCi0gICAgICAgKglEaXNwYXRjaCBvbiBTVEFCIHR5cGUKLSAgICAgICAqLwotICAgICAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoczFQKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGNvbnRpbnVlOwkJLyogbm90IGxlZnQgb3IgcmlnaHQgYnJhY2UgKi8KLQotCWNhc2UgTl9MU1lNOgotCWNhc2UgTl9QU1lNOgotCSAgVk1TX2xvY2FsX3N0YWJfUGFyc2UgKHMxUCk7Ci0JICBicmVhazsKLQotCWNhc2UgTl9SU1lNOgotCSAgVk1TX1JTWU1fUGFyc2UgKHMxUCwgQ3VycmVudF9Sb3V0aW5lLCBUZXh0X1BzZWN0KTsKLQkgIGJyZWFrOwotCX0JCQkvKnN3aXRjaCovCi0gICAgfQkJCQkvKiBmb3IgKi8KLX0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNyYXdscyB0aGUgc3ltYm9sIGNoYWluIHNlYXJjaGluZyBmb3IgbG9jYWwgc3ltYm9scyB0aGF0Ci0gICBuZWVkIHRvIGJlIGRlc2NyaWJlZCB0byB0aGUgZGVidWdnZXIuICBXaGVuIHdlIGVudGVyIGEgbmV3IHNjb3BlIHdpdGgKLSAgIGEgInsiLCBpdCBjcmVhdGVzIGEgbmV3ICJibG9jayIsIHdoaWNoIGhlbHBzIHRoZSBkZWJ1Z2dlciBrZWVwIHRyYWNrCi0gICBvZiB3aGljaCBzY29wZSB3ZSBhcmUgY3VycmVudGx5IGluLiAgKi8KLQotc3RhdGljIHN5bWJvbFMgKgotRGVmaW5lX1JvdXRpbmUgKHMwUCwgTGV2ZWwsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCkKLSAgICAgc3ltYm9sUyAqczBQOwotICAgICBpbnQgTGV2ZWw7Ci0gICAgIHN5bWJvbFMgKkN1cnJlbnRfUm91dGluZTsKLSAgICAgaW50IFRleHRfUHNlY3Q7Ci17Ci0gIHN5bWJvbFMgKnMxUDsKLSAgdmFsdWVUIE9mZnNldDsKLSAgaW50IHJjb3VudCA9IDA7Ci0KLSAgZm9yIChzMVAgPSBzeW1ib2xfbmV4dCAoczBQKTsgczFQICE9IDA7IHMxUCA9IHN5bWJvbF9uZXh0IChzMVApKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoczFQKSA9PSBOX0ZVTikKLQl7Ci0JICBjaGFyICpwbnQgPSAoY2hhciAqKSBzdHJjaHIgKFNfR0VUX05BTUUgKHMxUCksICc6JykgKyAxOwotCSAgaWYgKCpwbnQgPT0gJ0YnIHx8ICpwbnQgPT0gJ2YnKSBicmVhazsKLQl9Ci0gICAgICBpZiAoIVNfSVNfREVCVUcgKHMxUCkpCi0JY29udGludWU7Ci0gICAgICAvKgotICAgICAgICoJRGlzcGF0Y2ggb24gU1RBQiB0eXBlCi0gICAgICAgKi8KLSAgICAgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHMxUCkpCi0JewotCWRlZmF1bHQ6Ci0JICBjb250aW51ZTsJCS8qIG5vdCBsZWZ0IG9yIHJpZ2h0IGJyYWNlICovCi0KLQljYXNlIE5fTEJSQUM6Ci0JICBpZiAoTGV2ZWwgIT0gMCkKLQkgICAgewotCSAgICAgIGNoYXIgc3RyWzEwXTsKLQkgICAgICBzcHJpbnRmIChzdHIsICIkJWQiLCByY291bnQrKyk7Ci0JICAgICAgVk1TX1RCVF9CbG9ja19CZWdpbiAoczFQLCBUZXh0X1BzZWN0LCBzdHIpOwotCSAgICB9Ci0JICBPZmZzZXQgPSBTX0dFVF9WQUxVRSAoczFQKTsJLyogc2lkZS1lZmZlY3Q6IGZ1bGx5IHJlc29sdmUgc3ltYm9sICovCi0JICBEZWZpbmVfTG9jYWxfU3ltYm9scyAoczBQLCBzMVAsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk7Ci0JICBzMVAgPSBEZWZpbmVfUm91dGluZSAoczFQLCBMZXZlbCArIDEsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk7Ci0JICBpZiAoTGV2ZWwgIT0gMCkKLQkgICAgVk1TX1RCVF9CbG9ja19FbmQgKFNfR0VUX1ZBTFVFIChzMVApIC0gT2Zmc2V0KTsKLQkgIHMwUCA9IHMxUDsKLQkgIGJyZWFrOwotCi0JY2FzZSBOX1JCUkFDOgotCSAgcmV0dXJuIHMxUDsKLQl9CQkJLypzd2l0Y2gqLwotICAgIH0JCQkJLyogZm9yICovCi0KLSAgLyogV2UgZW5kIHVwIGhlcmUgaWYgdGhlcmUgd2VyZSBubyBicmFja2V0cyBpbiB0aGlzIGZ1bmN0aW9uLgotICAgICBEZWZpbmUgZXZlcnl0aGluZy4gICovCi0gIERlZmluZV9Mb2NhbF9TeW1ib2xzIChzMFAsIChzeW1ib2xTICopMCwgQ3VycmVudF9Sb3V0aW5lLCBUZXh0X1BzZWN0KTsKLSAgcmV0dXJuIHMxUDsKLX0KLQwKLQotI2lmbmRlZiBWTVMKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci1zdGF0aWMgdm9pZCBnZXRfVk1TX3RpbWVfb25fdW5peCBQQVJBTVMgKChjaGFyICopKTsKLQotLyogTWFudWZhY3R1cmUgYSBWTVMtbGlrZSB0aW1lIHN0cmluZyBvbiBhIFVuaXggYmFzZWQgc3lzdGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1nZXRfVk1TX3RpbWVfb25fdW5peCAoTm93KQotICAgICBjaGFyICpOb3c7Ci17Ci0gIGNoYXIgKnBudDsKLSAgdGltZV90IHRpbWViOwotCi0gIHRpbWUgKCZ0aW1lYik7Ci0gIHBudCA9IGN0aW1lICgmdGltZWIpOwotICBwbnRbM10gPSAwOwotICBwbnRbN10gPSAwOwotICBwbnRbMTBdID0gMDsKLSAgcG50WzE2XSA9IDA7Ci0gIHBudFsyNF0gPSAwOwotICBzcHJpbnRmIChOb3csICIlMnMtJTNzLSVzICVzIiwgcG50ICsgOCwgcG50ICsgNCwgcG50ICsgMjAsIHBudCArIDExKTsKLX0KLSNlbmRpZiAvKiBub3QgVk1TICovCi0KLQotLyogV3JpdGUgdGhlIE1IRCAoTW9kdWxlIEhlYWRlcikgcmVjb3Jkcy4gICovCi0KLXN0YXRpYyB2b2lkCi1Xcml0ZV9WTVNfTUhEX1JlY29yZHMgKCkKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqY3A7Ci0gIHJlZ2lzdGVyIGNoYXIgKmNwMTsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0jaWZkZWYgVk1TCi0gIHN0cnVjdCB7IHVuc2lnbmVkIHNob3J0IGxlbiwgbWJ6OyBjaGFyICpwdHI7IH0gRGVzY3JpcHRvcjsKLSNlbmRpZgotICBjaGFyIE5vd1sxNysxXTsKLQotICAvKiBXZSBhcmUgd3JpdGluZyBhIG1vZHVsZSBoZWFkZXIgcmVjb3JkLiAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfSERSKTsKLSAgLyoKLSAgICoJKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCSpNQUlOIE1PRFVMRSBIRUFERVIgUkVDT1JEKgotICAgKgkqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICovCi0gIC8qIFN0b3JlIHJlY29yZCB0eXBlIGFuZCBoZWFkZXIgdHlwZS4gICovCi0gIFBVVF9DSEFSIChPQkpfU19DX0hEUik7Ci0gIFBVVF9DSEFSIChNSERfU19DX01IRCk7Ci0gIC8qIFN0cnVjdHVyZSBsZXZlbCBpcyAwLiAgKi8KLSAgUFVUX0NIQVIgKE9CSl9TX0NfU1RSTFZMKTsKLSAgLyogTWF4aW11bSByZWNvcmQgc2l6ZSBpcyBzaXplIG9mIHRoZSBvYmplY3QgcmVjb3JkIGJ1ZmZlci4gICovCi0gIFBVVF9TSE9SVCAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikpOwotCi0JLyoKLQkgKglGSVhNRTogIG1vZHVsZSBuYW1lIGFuZCB2ZXJzaW9uIHNob3VsZCBiZSB1c2VyCi0JICoJCXNwZWNpZmlhYmxlIHZpYSBgLmlkZW50JyBhbmQvb3IgYCNwcmFnbWEgaWRlbnQnLgotCSAqLwotCi0gIC8qIEdldCBtb2R1bGUgbmFtZSAodGhlIEZJTEVOQU1FIHBhcnQgb2YgdGhlIG9iamVjdCBmaWxlKS4gICovCi0gIGNwID0gb3V0X2ZpbGVfbmFtZTsKLSAgY3AxID0gTW9kdWxlX05hbWU7Ci0gIHdoaWxlICgqY3ApCi0gICAgewotICAgICAgaWYgKCpjcCA9PSAnXScgfHwgKmNwID09ICc+JyB8fCAqY3AgPT0gJzonIHx8ICpjcCA9PSAnLycpCi0JewotCSAgY3AxID0gTW9kdWxlX05hbWU7Ci0JICBjcCsrOwotCSAgY29udGludWU7Ci0JfQotICAgICAgKmNwMSsrID0gaXNsb3dlciAoKmNwKSA/IHRvdXBwZXIgKCpjcCsrKSA6ICpjcCsrOwotICAgIH0KLSAgKmNwMSA9ICdcMCc7Ci0KLSAgLyogTGltaXQgaXQgdG8gMzEgY2hhcmFjdGVycyBhbmQgc3RvcmUgaW4gdGhlIG9iamVjdCByZWNvcmQuICAqLwotICB3aGlsZSAoLS1jcDEgPj0gTW9kdWxlX05hbWUpCi0gICAgaWYgKCpjcDEgPT0gJy4nKQotICAgICAgKmNwMSA9ICdcMCc7Ci0gIGlmIChzdHJsZW4gKE1vZHVsZV9OYW1lKSA+IDMxKQotICAgIHsKLSAgICAgIGlmIChmbGFnX2hhc2hfbG9uZ19uYW1lcykKLQlhc190c2t0c2sgKF8oIk1vZHVsZSBuYW1lIHRydW5jYXRlZDogJXNcbiIpLCBNb2R1bGVfTmFtZSk7Ci0gICAgICBNb2R1bGVfTmFtZVszMV0gPSAnXDAnOwotICAgIH0KLSAgUFVUX0NPVU5URURfU1RSSU5HIChNb2R1bGVfTmFtZSk7Ci0gIC8qIE1vZHVsZSBWZXJzaW9uIGlzICJWMS4wIi4gICovCi0gIFBVVF9DT1VOVEVEX1NUUklORyAoIlYxLjAiKTsKLSAgLyogQ3JlYXRpb24gdGltZSBpcyAibm93IiAoMTcgY2hhcnMgb2YgdGltZSBzdHJpbmcpOiAiZGQtTU1NLXl5eXkgaGg6bW0iLiAgKi8KLSNpZm5kZWYgVk1TCi0gIGdldF9WTVNfdGltZV9vbl91bml4IChOb3cpOwotI2Vsc2UgLyogVk1TICovCi0gIERlc2NyaXB0b3IubGVuID0gc2l6ZW9mIE5vdyAtIDE7Ci0gIERlc2NyaXB0b3IubWJ6ID0gMDsJCS8qIHR5cGUgJiBjbGFzcyB1bnNwZWNpZmllZCAqLwotICBEZXNjcmlwdG9yLnB0ciA9IE5vdzsKLSAgKHZvaWQpIHN5cyRhc2N0aW0gKCh1bnNpZ25lZCBzaG9ydCAqKTAsICZEZXNjcmlwdG9yLCAobG9uZyAqKTAsIDApOwotI2VuZGlmIC8qIFZNUyAqLwotICBmb3IgKGkgPSAwOyBpIDwgMTc7IGkrKykKLSAgICBQVVRfQ0hBUiAoTm93W2ldKTsKLSAgLyogUGF0Y2ggdGltZSBpcyAibmV2ZXIiICgxNyB6ZXJvcykuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgMTc7IGkrKykKLSAgICBQVVRfQ0hBUiAoMCk7Ci0gIC8qIEZvcmNlIHRoaXMgdG8gYmUgYSBzZXBhcmF0ZSBvdXRwdXQgcmVjb3JkLiAgKi8KLSAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotCi0gIC8qCi0gICAqCSoqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoJKkxBTkdVQUdFIFBST0NFU1NPUiBOQU1FKgotICAgKgkqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqLwotICAvKiBTdG9yZSByZWNvcmQgdHlwZSBhbmQgaGVhZGVyIHR5cGUuICAqLwotICBQVVRfQ0hBUiAoT0JKX1NfQ19IRFIpOwotICBQVVRfQ0hBUiAoTUhEX1NfQ19MTk0pOwotICAvKgotICAgKiBTdG9yZSBsYW5ndWFnZSBwcm9jZXNzb3IgbmFtZSBhbmQgdmVyc2lvbiAobm90IGEgY291bnRlZCBzdHJpbmchKS4KLSAgICoKLSAgICogVGhpcyBpcyBub3JtYWxseSBzdXBwbGllZCBieSB0aGUgZ2NjIGRyaXZlciBmb3IgdGhlIGNvbW1hbmQgbGluZQotICAgKiB3aGljaCBpbnZva2VzIGdhcy4gIElmIGFic2VudCwgd2UgZmFsbCBiYWNrIHRvIGdhcydzIHZlcnNpb24uCi0gICAqLwotICBjcCA9IGNvbXBpbGVyX3ZlcnNpb25fc3RyaW5nOwotICBpZiAoY3AgPT0gMCkKLSAgICB7Ci0gICAgICBjcCA9ICJHTlUgQVMgIFYiOwotICAgICAgd2hpbGUgKCpjcCkKLQlQVVRfQ0hBUiAoKmNwKyspOwotICAgICAgY3AgPSBWRVJTSU9OOwotICAgIH0KLSAgd2hpbGUgKCpjcCA+PSAnICcpCi0gICAgUFVUX0NIQVIgKCpjcCsrKTsKLSAgLyogRm9yY2UgdGhpcyB0byBiZSBhIHNlcGFyYXRlIG91dHB1dCByZWNvcmQuICAqLwotICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0KLQotLyogV3JpdGUgdGhlIEVPTSAoRW5kIE9mIE1vZHVsZSkgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVdyaXRlX1ZNU19FT01fUmVjb3JkIChQc2VjdCwgT2Zmc2V0KQotICAgICBpbnQgUHNlY3Q7Ci0gICAgIHZhbHVlVCBPZmZzZXQ7Ci17Ci0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGFuIGVuZC1vZi1tb2R1bGUgcmVjb3JkCi0gICAqCSh0aGlzIGFzc3VtZXMgdGhhdCB0aGUgZW50cnkgcG9pbnQgd2lsbCBhbHdheXMgYmUgaW4gYSBwc2VjdAotICAgKgkgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgYnl0ZSwgd2hpY2ggaXMgdGhlIGNhc2UgZm9yIGNvZGUgaW4KLSAgICoJIFRleHRfUHNlY3Q9PTApCi0gICAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoT0JKX1NfQ19FT00pOwotICBQVVRfQ0hBUiAoT0JKX1NfQ19FT00pOwkvKiBSZWNvcmQgdHlwZS4gICovCi0gIFBVVF9DSEFSICgwKTsJCQkvKiBFcnJvciBzZXZlcml0eSBsZXZlbCAod2UgaWdub3JlIGl0KS4gKi8KLSAgLyoKLSAgICoJU3RvcmUgdGhlIGVudHJ5IHBvaW50LCBpZiBpdCBleGlzdHMKLSAgICovCi0gIGlmIChQc2VjdCA+PSAwKQotICAgIHsKLSAgICAgIFBVVF9DSEFSIChQc2VjdCk7Ci0gICAgICBQVVRfTE9ORyAoT2Zmc2V0KTsKLSAgICB9Ci0gIC8qIEZsdXNoIHRoZSByZWNvcmQ7IHRoaXMgd2lsbCBiZSBvdXIgZmluYWwgb3V0cHV0LiAgKi8KLSAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotDAotCi0vKiB0aGlzIGhhc2ggcm91dGluZSBib3Jyb3dlZCBmcm9tIEdOVS1FTUFDUywgYW5kIHN0cmVuZ3RoZW5lZCBzbGlnaHRseSAgRVJZKi8KLQotc3RhdGljIGludAotaGFzaF9zdHJpbmcgKHB0cikKLSAgICAgY29uc3QgY2hhciAqcHRyOwotewotICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikgcHRyOwotICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQgPSBwICsgc3RybGVuIChwdHIpOwotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGludCBoYXNoID0gMDsKLQotICB3aGlsZSAocCAhPSBlbmQpCi0gICAgewotICAgICAgYyA9ICpwKys7Ci0gICAgICBoYXNoID0gKChoYXNoIDw8IDMpICsgKGhhc2ggPDwgMTUpICsgKGhhc2ggPj4gMjgpICsgYyk7Ci0gICAgfQotICByZXR1cm4gaGFzaDsKLX0KLQotLyoKLSAqCUdlbmVyYXRlIGEgQ2FzZS1IYWNrZWQgVk1TIHN5bWJvbCBuYW1lIChsaW1pdGVkIHRvIDMxIGNoYXJzKQotICovCi1zdGF0aWMgdm9pZAotVk1TX0Nhc2VfSGFja19TeW1ib2wgKEluLCBPdXQpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKkluOwotICAgICByZWdpc3RlciBjaGFyICpPdXQ7Ci17Ci0gIGxvbmcgaW50IGluaXQ7Ci0gIGxvbmcgaW50IHJlc3VsdDsKLSAgY2hhciAqcG50ID0gMDsKLSAgY2hhciAqbmV3X25hbWU7Ci0gIGNvbnN0IGNoYXIgKm9sZF9uYW1lOwotICByZWdpc3RlciBpbnQgaTsKLSAgaW50IGRlc3RydWN0b3IgPSAwOwkJLypoYWNrIHRvIGFsbG93IGZvciBjYXNlIHNlbnMgaW4gYSBkZXN0cnVjdG9yKi8KLSAgaW50IHRydW5jYXRlID0gMDsKLSAgaW50IENhc2VfSGFja19CaXRzID0gMDsKLSAgaW50IFNhd19Eb2xsYXIgPSAwOwotICBzdGF0aWMgY2hhciBIZXhfVGFibGVbMTZdID0KLSAgeycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJ307Ci0KLSAgLyoKLSAgICoJS2lsbCBhbnkgbGVhZGluZyAiXyIKLSAgICovCi0gIGlmICgoSW5bMF0gPT0gJ18nKSAmJiAoKEluWzFdID4gJzknKSB8fCAoSW5bMV0gPCAnMCcpKSkKLSAgICBJbisrOwotCi0gIG5ld19uYW1lID0gT3V0OwkJLyogc2F2ZSB0aGlzIGZvciBsYXRlciovCi0KLSNpZiBiYXJmb28JCQkvKiBEZWFkIGNvZGUgKi8KLSAgaWYgKChJblswXSA9PSAnXycpICYmIChJblsxXSA9PSAnJCcpICYmIChJblsyXSA9PSAnXycpKQotICAgIGRlc3RydWN0b3IgPSAxOwotI2VuZGlmCi0KLSAgLyogV2UgbWF5IG5lZWQgdG8gdHJ1bmNhdGUgdGhlIHN5bWJvbCwgc2F2ZSB0aGUgaGFzaCBmb3IgbGF0ZXIqLwotICByZXN1bHQgPSAoc3RybGVuIChJbikgPiAyMykgPyBoYXNoX3N0cmluZyAoSW4pIDogMDsKLSAgLyoKLSAgICoJSXMgdGhlcmUgYSBQc2VjdCBBdHRyaWJ1dGUgdG8gc2tpcD8/Ci0gICAqLwotICBpZiAoSEFTX1BTRUNUX0FUVFJJQlVURVMgKEluKSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICoJWWVzOiBTa2lwIGl0Ci0gICAgICAgKi8KLSAgICAgIEluICs9IFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HX0xFTkdUSDsKLSAgICAgIHdoaWxlICgqSW4pCi0JewotCSAgaWYgKChJblswXSA9PSAnJCcpICYmIChJblsxXSA9PSAnJCcpKQotCSAgICB7Ci0JICAgICAgSW4gKz0gMjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgSW4rKzsKLQl9Ci0gICAgfQotCi0gIG9sZF9uYW1lID0gSW47Ci0vKglpZiAoc3RybGVuIChJbikgPiAzMSAmJiBmbGFnX2hhc2hfbG9uZ19uYW1lcykKLQkgIGFzX3Rza3RzayAoIlN5bWJvbCBuYW1lIHRydW5jYXRlZDogJXNcbiIsIEluKTsgKi8KLSAgLyoKLSAgICoJRG8gdGhlIGNhc2UgY29udmVyc2lvbgotICAgKi8KLSAgaSA9IDIzOwkJCS8qIE1heGltdW0gb2YgMjMgY2hhcnMgKi8KLSAgd2hpbGUgKCpJbiAmJiAoLS1pID49IDApKQotICAgIHsKLSAgICAgIENhc2VfSGFja19CaXRzIDw8PSAxOwotICAgICAgaWYgKCpJbiA9PSAnJCcpCi0JU2F3X0RvbGxhciA9IDE7Ci0gICAgICBpZiAoKGRlc3RydWN0b3IgPT0gMSkgJiYgKGkgPT0gMjEpKQotCVNhd19Eb2xsYXIgPSAwOwotICAgICAgc3dpdGNoICh2bXNfbmFtZV9tYXBwaW5nKQotCXsKLQljYXNlIDA6Ci0JICBpZiAoaXN1cHBlciAoKkluKSkgewotCSAgICAqT3V0KysgPSAqSW4rKzsKLQkgICAgQ2FzZV9IYWNrX0JpdHMgfD0gMTsKLQkgIH0gZWxzZSB7Ci0JICAgICpPdXQrKyA9IGlzbG93ZXIgKCpJbikgPyB0b3VwcGVyICgqSW4rKykgOiAqSW4rKzsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgMzogKk91dCsrID0gKkluKys7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBpZiAoaXNsb3dlciAoKkluKSkgewotCSAgICAqT3V0KysgPSAqSW4rKzsKLQkgIH0gZWxzZSB7Ci0JICAgICpPdXQrKyA9IGlzdXBwZXIgKCpJbikgPyB0b2xvd2VyICgqSW4rKykgOiAqSW4rKzsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIC8qCi0gICAqCUlmIHdlIHNhdyBhIGRvbGxhciBzaWduLCB3ZSBkb24ndCBkbyBjYXNlIGhhY2tpbmcKLSAgICovCi0gIGlmIChmbGFnX25vX2hhc2hfbWl4ZWRfY2FzZSB8fCBTYXdfRG9sbGFyKQotICAgIENhc2VfSGFja19CaXRzID0gMDsKLQotICAvKgotICAgKglJZiB3ZSBoYXZlIG1vcmUgdGhhbiAyMyBjaGFyYWN0ZXJzIGFuZCBldmVyeXRoaW5nIGlzIGxvd2VyY2FzZQotICAgKgl3ZSBjYW4gaW5zZXJ0IHRoZSBmdWxsIDMxIGNoYXJhY3RlcnMKLSAgICovCi0gIGlmICgqSW4pCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCVdlICBoYXZlIG1vcmUgdGhhbiAyMyBjaGFyYWN0ZXJzCi0gICAgICAgKiBJZiB3ZSBtdXN0IGFkZCB0aGUgY2FzZSBoYWNrLCB0aGVuIHdlIGhhdmUgdHJ1bmNhdGVkIHRoZSBzdHIKLSAgICAgICAqLwotICAgICAgcG50ID0gT3V0OwotICAgICAgdHJ1bmNhdGUgPSAxOwotICAgICAgaWYgKENhc2VfSGFja19CaXRzID09IDApCi0JewotCSAgLyoKLQkgICAqCUFuZCBzbyBmYXIgdGhleSBhcmUgYWxsIGxvd2VyIGNhc2U6Ci0JICAgKgkJQ2hlY2sgdXAgdG8gOCBtb3JlIGNoYXJhY3RlcnMKLQkgICAqCQlhbmQgZW5zdXJlIHRoYXQgdGhleSBhcmUgbG93ZXJjYXNlCi0JICAgKi8KLQkgIGZvciAoaSA9IDA7IChJbltpXSAhPSAwKSAmJiAoaSA8IDgpOyBpKyspCi0JICAgIGlmIChpc3VwcGVyIChJbltpXSkgJiYgIVNhd19Eb2xsYXIgJiYgIWZsYWdfbm9faGFzaF9taXhlZF9jYXNlKQotCSAgICAgIGJyZWFrOwotCi0JICBpZiAoSW5baV0gPT0gMCkKLQkgICAgdHJ1bmNhdGUgPSAwOwotCi0JICBpZiAoKGkgPT0gOCkgfHwgKEluW2ldID09IDApKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKglUaGV5IGFyZTogIENvcHkgdXAgdG8gMzEgY2hhcmFjdGVycwotCSAgICAgICAqCQkJdG8gdGhlIG91dHB1dCBzdHJpbmcKLQkgICAgICAgKi8KLQkgICAgICBpID0gODsKLQkgICAgICB3aGlsZSAoKC0taSA+PSAwKSAmJiAoKkluKSkKLQkJc3dpdGNoICh2bXNfbmFtZV9tYXBwaW5nKXsKLQkJY2FzZSAwOiAqT3V0KysgPSBpc2xvd2VyICgqSW4pID8gdG91cHBlciAoKkluKyspIDogKkluKys7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMzogKk91dCsrID0gKkluKys7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMjogKk91dCsrID0gaXN1cHBlciAoKkluKSA/IHRvbG93ZXIgKCpJbisrKSA6ICpJbisrOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKgotICAgKglJZiB0aGVyZSB3ZXJlIGFueSB1cHBlcmNhc2UgY2hhcmFjdGVycyBpbiB0aGUgbmFtZSB3ZQotICAgKgl0YWtlIG9uIHRoZSBjYXNlIGhhY2tpbmcgc3RyaW5nCi0gICAqLwotCi0gIC8qIE9sZCBiZWhhdmlvciBmb3IgcmVndWxhciBHTlUtQyBjb21waWxlciAqLwotICBpZiAoIWZsYWdfaGFzaF9sb25nX25hbWVzKQotICAgIHRydW5jYXRlID0gMDsKLSAgaWYgKChDYXNlX0hhY2tfQml0cyAhPSAwKSB8fCAodHJ1bmNhdGUgPT0gMSkpCi0gICAgewotICAgICAgaWYgKHRydW5jYXRlID09IDApCi0JewotCSAgKk91dCsrID0gJ18nOwotCSAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkgICAgewotCSAgICAgICpPdXQrKyA9IEhleF9UYWJsZVtDYXNlX0hhY2tfQml0cyAmIDB4Zl07Ci0JICAgICAgQ2FzZV9IYWNrX0JpdHMgPj49IDQ7Ci0JICAgIH0KLQkgICpPdXQrKyA9ICdYJzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgT3V0ID0gcG50OwkJLypDdXQgYmFjayB0byAyMyBjaGFyYWN0ZXJzIG1heGltdW0gKi8KLQkgICpPdXQrKyA9ICdfJzsKLQkgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCi0JICAgIHsKLQkgICAgICBpbml0ID0gcmVzdWx0ICYgMHgwMWY7Ci0JICAgICAgKk91dCsrID0gKGluaXQgPCAxMCkgPyAoJzAnICsgaW5pdCkgOiAoJ0EnICsgaW5pdCAtIDEwKTsKLQkgICAgICByZXN1bHQgPSByZXN1bHQgPj4gNTsKLQkgICAgfQotCX0KLSAgICB9CQkJCS8qQ2FzZSBIYWNrICovCi0gIC8qCi0gICAqCURvbmUKLSAgICovCi0gICpPdXQgPSAwOwotICBpZiAodHJ1bmNhdGUgPT0gMSAmJiBmbGFnX2hhc2hfbG9uZ19uYW1lcyAmJiBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpCi0gICAgYXNfdHNrdHNrIChfKCJTeW1ib2wgJXMgcmVwbGFjZWQgYnkgJXNcbiIpLCBvbGRfbmFtZSwgbmV3X25hbWUpOwotfQotDAotCi0vKgotICoJU2NhbiBhIHN5bWJvbCBuYW1lIGZvciBhIHBzZWN0IGF0dHJpYnV0ZSBzcGVjaWZpY2F0aW9uCi0gKi8KLSNkZWZpbmUgR0xPQkFMU1lNQk9MX0JJVAkweDEwMDAwCi0jZGVmaW5lIEdMT0JBTFZBTFVFX0JJVAkJMHgyMDAwMAotCi0KLXN0YXRpYyB2b2lkCi1WTVNfTW9kaWZ5X1BzZWN0X0F0dHJpYnV0ZXMgKE5hbWUsIEF0dHJpYnV0ZV9Qb2ludGVyKQotICAgICBjb25zdCBjaGFyICpOYW1lOwotICAgICBpbnQgKkF0dHJpYnV0ZV9Qb2ludGVyOwotewotICByZWdpc3RlciBpbnQgaTsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqY3A7Ci0gIGludCBOZWdhdGU7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QKLSAgewotICAgIGNvbnN0IGNoYXIgKk5hbWU7Ci0gICAgaW50IFZhbHVlOwotICB9IEF0dHJpYnV0ZXNbXSA9Ci0gIHsKLSAgICB7IlBJQyIsIEdQU19TX01fUElDfSwKLSAgICB7IkxJQiIsIEdQU19TX01fTElCfSwKLSAgICB7Ik9WUiIsIEdQU19TX01fT1ZSfSwKLSAgICB7IlJFTCIsIEdQU19TX01fUkVMfSwKLSAgICB7IkdCTCIsIEdQU19TX01fR0JMfSwKLSAgICB7IlNIUiIsIEdQU19TX01fU0hSfSwKLSAgICB7IkVYRSIsIEdQU19TX01fRVhFfSwKLSAgICB7IlJEIiwgR1BTX1NfTV9SRH0sCi0gICAgeyJXUlQiLCBHUFNfU19NX1dSVH0sCi0gICAgeyJWRUMiLCBHUFNfU19NX1ZFQ30sCi0gICAgeyJHTE9CQUxTWU1CT0wiLCBHTE9CQUxTWU1CT0xfQklUfSwKLSAgICB7IkdMT0JBTFZBTFVFIiwgR0xPQkFMVkFMVUVfQklUfSwKLSAgICB7MCwgMH0KLSAgfTsKLQotICAvKgotICAgKglLaWxsIGxlYWRpbmcgIl8iCi0gICAqLwotICBpZiAoKk5hbWUgPT0gJ18nKQotICAgIE5hbWUrKzsKLSAgLyoKLSAgICoJQ2hlY2sgZm9yIGEgUFNFQ1QgYXR0cmlidXRlIGxpc3QKLSAgICovCi0gIGlmICghSEFTX1BTRUNUX0FUVFJJQlVURVMgKE5hbWUpKQotICAgIHJldHVybjsJCQkvKiBJZiBub3QsIHJldHVybiAqLwotICAvKgotICAgKglTa2lwIHRoZSBhdHRyaWJ1dGUgbGlzdCBpbmRpY2F0b3IKLSAgICovCi0gIE5hbWUgKz0gUFNFQ1RfQVRUUklCVVRFU19TVFJJTkdfTEVOR1RIOwotICAvKgotICAgKglQcm9jZXNzIHRoZSBhdHRyaWJ1dGVzICgiXyIgc2VwYXJhdGVkLCAiJCIgdGVybWluYXRlZCkKLSAgICovCi0gIHdoaWxlICgqTmFtZSAhPSAnJCcpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCUFzc3VtZSBub3QgbmVnYXRpbmcKLSAgICAgICAqLwotICAgICAgTmVnYXRlID0gMDsKLSAgICAgIC8qCi0gICAgICAgKglDaGVjayBmb3IgIk5PIgotICAgICAgICovCi0gICAgICBpZiAoKE5hbWVbMF0gPT0gJ04nKSAmJiAoTmFtZVsxXSA9PSAnTycpKQotCXsKLQkgIC8qCi0JICAgKglXZSBhcmUgbmVnYXRpbmcgKGFuZCBza2lwIHRoZSBOTykKLQkgICAqLwotCSAgTmVnYXRlID0gMTsKLQkgIE5hbWUgKz0gMjsKLQl9Ci0gICAgICAvKgotICAgICAgICoJRmluZCB0aGUgdG9rZW4gZGVsaW1pdGVyCi0gICAgICAgKi8KLSAgICAgIGNwID0gTmFtZTsKLSAgICAgIHdoaWxlICgqY3AgJiYgKCpjcCAhPSAnXycpICYmICgqY3AgIT0gJyQnKSkKLQljcCsrOwotICAgICAgLyoKLSAgICAgICAqCUxvb2sgZm9yIHRoZSB0b2tlbiBpbiB0aGUgYXR0cmlidXRlIGxpc3QKLSAgICAgICAqLwotICAgICAgZm9yIChpID0gMDsgQXR0cmlidXRlc1tpXS5OYW1lOyBpKyspCi0JewotCSAgLyoKLQkgICAqCUlmIHRoZSBzdHJpbmdzIG1hdGNoLCBzZXQvY2xlYXIgdGhlIGF0dHIuCi0JICAgKi8KLQkgIGlmIChzdHJuY21wIChOYW1lLCBBdHRyaWJ1dGVzW2ldLk5hbWUsIGNwIC0gTmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICoJU2V0IG9yIGNsZWFyCi0JICAgICAgICovCi0JICAgICAgaWYgKE5lZ2F0ZSkKLQkJKkF0dHJpYnV0ZV9Qb2ludGVyICY9Ci0JCSAgfkF0dHJpYnV0ZXNbaV0uVmFsdWU7Ci0JICAgICAgZWxzZQotCQkqQXR0cmlidXRlX1BvaW50ZXIgfD0KLQkJICBBdHRyaWJ1dGVzW2ldLlZhbHVlOwotCSAgICAgIC8qCi0JICAgICAgICoJRG9uZQotCSAgICAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgLyoKLSAgICAgICAqCU5vdyBza2lwIHRoZSBhdHRyaWJ1dGUKLSAgICAgICAqLwotICAgICAgTmFtZSA9IGNwOwotICAgICAgaWYgKCpOYW1lID09ICdfJykKLQlOYW1lKys7Ci0gICAgfQotfQotDAotCi0jZGVmaW5lIEdCTFNZTV9SRUYgMAotI2RlZmluZSBHQkxTWU1fREVGIDEKLSNkZWZpbmUgR0JMU1lNX1ZBTCAyCi0jZGVmaW5lIEdCTFNZTV9MQ0wgNAkvKiBub3QgR0JMIGFmdGVyIGFsbC4uLiAqLwotI2RlZmluZSBHQkxTWU1fV0VBSyA4Ci0KLS8qCi0gKglEZWZpbmUgYSBnbG9iYWwgc3ltYm9sIChvciBwb3NzaWJseSBhIGxvY2FsIG9uZSkuCi0gKi8KLXN0YXRpYyB2b2lkCi1WTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChOYW1lLCBQc2VjdF9OdW1iZXIsIFBzZWN0X09mZnNldCwgRmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKk5hbWU7Ci0gICAgIGludCBQc2VjdF9OdW1iZXI7Ci0gICAgIGludCBQc2VjdF9PZmZzZXQ7Ci0gICAgIGludCBGbGFnczsKLXsKLSAgY2hhciBMb2NhbFszMl07Ci0KLSAgLyoKLSAgICoJV2UgYXJlIHdyaXRpbmcgYSBHU0QgcmVjb3JkCi0gICAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoT0JKX1NfQ19HU0QpOwotICAvKgotICAgKglJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHRoZSBHU0QgcmVjb3JkIHR5cGUKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChPQkpfU19DX0dTRCk7Ci0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgR2xvYmFsIChvciBsb2NhbCkgc3ltYm9sIGRlZmluaXRpb24gc3VicmVjb3JkLgotICAgKi8KLSAgUFVUX0NIQVIgKChGbGFncyAmIEdCTFNZTV9MQ0wpICE9IDAgPyBHU0RfU19DX0xTWSA6Ci0JICAgICgodW5zaWduZWQpIFBzZWN0X051bWJlciA8PSAyNTUpID8gR1NEX1NfQ19TWU0gOiBHU0RfU19DX1NZTVcpOwotICAvKgotICAgKglEYXRhIHR5cGUgaXMgdW5kZWZpbmVkCi0gICAqLwotICBQVVRfQ0hBUiAoMCk7Ci0gIC8qCi0gICAqCVN3aXRjaCBvbiBEZWZpbml0aW9uL1JlZmVyZW5jZQotICAgKi8KLSAgaWYgKChGbGFncyAmIEdCTFNZTV9ERUYpID09IDApCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCVJlZmVyZW5jZQotICAgICAgICovCi0gICAgICBQVVRfU0hPUlQgKCgoRmxhZ3MgJiBHQkxTWU1fVkFMKSA9PSAwKSA/IEdTWV9TX01fUkVMIDogMCk7Ci0gICAgICBpZiAoKEZsYWdzICYgR0JMU1lNX0xDTCkgIT0gMCkJLyogbG9jYWwgc3ltYm9scyBoYXZlIGV4dHJhIGZpZWxkICovCi0JUFVUX1NIT1JUIChDdXJyZW50X0Vudmlyb25tZW50KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgc3ltX2ZsYWdzOwotCi0gICAgICAvKgotICAgICAgICoJRGVmaW5pdGlvbgotICAgICAgICpbIGFzc2VydCAoTFNZX1NfTV9ERUYgPT0gR1NZX1NfTV9ERUYgJiYgTFNZX1NfTV9SRUwgPT0gR1NZX1NfTV9SRUwpOyBdCi0gICAgICAgKi8KLSAgICAgIHN5bV9mbGFncyA9IEdTWV9TX01fREVGOwotICAgICAgaWYgKEZsYWdzICYgR0JMU1lNX1dFQUspCi0Jc3ltX2ZsYWdzIHw9IEdTWV9TX01fV0VBSzsKLSAgICAgIGlmICgoRmxhZ3MgJiBHQkxTWU1fVkFMKSA9PSAwKQotCXN5bV9mbGFncyB8PSBHU1lfU19NX1JFTDsKLSAgICAgIFBVVF9TSE9SVCAoc3ltX2ZsYWdzKTsKLSAgICAgIGlmICgoRmxhZ3MgJiBHQkxTWU1fTENMKSAhPSAwKQkvKiBsb2NhbCBzeW1ib2xzIGhhdmUgZXh0cmEgZmllbGQgKi8KLQlQVVRfU0hPUlQgKEN1cnJlbnRfRW52aXJvbm1lbnQpOwotICAgICAgLyoKLSAgICAgICAqCVBzZWN0IE51bWJlcgotICAgICAgICovCi0gICAgICBpZiAoKEZsYWdzICYgR0JMU1lNX0xDTCkgPT0gMCAmJiAodW5zaWduZWQpIFBzZWN0X051bWJlciA8PSAyNTUpCi0JUFVUX0NIQVIgKFBzZWN0X051bWJlcik7Ci0gICAgICBlbHNlCi0JUFVUX1NIT1JUIChQc2VjdF9OdW1iZXIpOwotICAgICAgLyoKLSAgICAgICAqCU9mZnNldAotICAgICAgICovCi0gICAgICBQVVRfTE9ORyAoUHNlY3RfT2Zmc2V0KTsKLSAgICB9Ci0gIC8qCi0gICAqCUZpbmFsbHksIHRoZSBnbG9iYWwgc3ltYm9sIG5hbWUKLSAgICovCi0gIFZNU19DYXNlX0hhY2tfU3ltYm9sIChOYW1lLCBMb2NhbCk7Ci0gIFBVVF9DT1VOVEVEX1NUUklORyAoTG9jYWwpOwotICAvKgotICAgKglGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbAotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQotLyoKLSAqCURlZmluZSBhbiBlbnZpcm9ubWVudCB0byBzdXBwb3J0IGxvY2FsIHN5bWJvbCByZWZlcmVuY2VzLgotICoJVGhpcyBpcyBqdXN0IHRvIG1vbGxpZnkgdGhlIGxpbmtlcjsgd2UgZG9uJ3QgYWN0dWFsbHkgZG8KLSAqCWFueXRoaW5nIHVzZWZ1bCB3aXRoIGl0LgotICovCi1zdGF0aWMgdm9pZAotVk1TX0xvY2FsX0Vudmlyb25tZW50X1NldHVwIChFbnZfTmFtZSkKLSAgICBjb25zdCBjaGFyICpFbnZfTmFtZTsKLXsKLSAgLyogV2UgYXJlIHdyaXRpbmcgYSBHU0QgcmVjb3JkLiAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfR1NEKTsKLSAgLyogSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCB0aGUgR1NEIHJlY29yZCB0eXBlLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfR1NEKTsKLSAgLyogV2UgYXJlIHdyaXRpbmcgYW4gRU5WIHN1YnJlY29yZC4gICovCi0gIFBVVF9DSEFSIChHU0RfU19DX0VOVik7Ci0KLSAgKytDdXJyZW50X0Vudmlyb25tZW50OwkvKiBpbmRleCBvZiBlbnZpcm9ubWVudCBiZWluZyBkZWZpbmVkICovCi0KLSAgLyogRU5WJFdfRkxBR1M6ICB3ZSBhcmUgZGVmaW5pbmcgdGhlIG5leHQgZW52aXJvbm1lbnQuICBJdCdzIG5vdCBuZXN0ZWQuICAqLwotICBQVVRfU0hPUlQgKEVOVl9TX01fREVGKTsKLSAgLyogRU5WJFdfRU5WSU5EWDogIGluZGV4IGlzIGFsd2F5cyAwIGZvciBub24tbmVzdGVkIGRlZmluaXRpb25zLiAgKi8KLSAgUFVUX1NIT1JUICgwKTsKLQotICAvKiBFTlYkQl9OQU1MTkcgKyBFTlYkVF9OQU1FOiAgZW52aXJvbm1lbnQgbmFtZSBpbiBBU0NJQyBmb3JtYXQuICAqLwotICBpZiAoIUVudl9OYW1lKSBFbnZfTmFtZSA9ICIiOwotICBQVVRfQ09VTlRFRF9TVFJJTkcgKChjaGFyICopRW52X05hbWUpOwotCi0gIC8qIEZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQwKLQotLyoKLSAqCURlZmluZSBhIHBzZWN0Ci0gKi8KLXN0YXRpYyBpbnQKLVZNU19Qc2VjdF9TcGVjIChOYW1lLCBTaXplLCBUeXBlLCB2c3ApCi0gICAgIGNvbnN0IGNoYXIgKk5hbWU7Ci0gICAgIGludCBTaXplOwotICAgICBlbnVtIHBzX3R5cGUgVHlwZTsKLSAgICAgc3RydWN0IFZNU19TeW1ib2wgKnZzcDsKLXsKLSAgY2hhciBMb2NhbFszMl07Ci0gIGludCBQc2VjdF9BdHRyaWJ1dGVzOwotCi0gIC8qCi0gICAqCUdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBQU0VDVCBmbGFncyBnaXZlbiB0aGUgUFNFQ1QgdHlwZQotICAgKi8KLSAgc3dpdGNoIChUeXBlKQotICAgIHsKLSAgICBjYXNlIHBzX1RFWFQ6Ci0gICAgICAvKiBUZXh0IHBzZWN0cyBhcmUgUElDLG5vT1ZSLFJFTCxub0dCTCxTSFIsRVhFLFJELG5vV1JULiAqLwotICAgICAgUHNlY3RfQXR0cmlidXRlcyA9IChHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1NIUnxHUFNfU19NX0VYRQotCQkJICB8R1BTX1NfTV9SRCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHBzX0RBVEE6Ci0gICAgICAvKiBEYXRhIHBzZWN0cyBhcmUgUElDLG5vT1ZSLFJFTCxub0dCTCxub1NIUixub0VYRSxSRCxXUlQuICovCi0gICAgICBQc2VjdF9BdHRyaWJ1dGVzID0gKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fUkR8R1BTX1NfTV9XUlQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBwc19DT01NT046Ci0gICAgICAvKiBDb21tb24gYmxvY2sgcHNlY3RzIGFyZTogIFBJQyxPVlIsUkVMLEdCTCxub1NIUixub0VYRSxSRCxXUlQuICovCi0gICAgICBQc2VjdF9BdHRyaWJ1dGVzID0gKEdQU19TX01fUElDfEdQU19TX01fT1ZSfEdQU19TX01fUkVMfEdQU19TX01fR0JMCi0JCQkgIHxHUFNfU19NX1JEfEdQU19TX01fV1JUKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgcHNfQ09OU1Q6Ci0gICAgICAvKiBDb25zdCBkYXRhIHBzZWN0cyBhcmU6ICBQSUMsT1ZSLFJFTCxHQkwsbm9TSFIsbm9FWEUsUkQsbm9XUlQuICovCi0gICAgICBQc2VjdF9BdHRyaWJ1dGVzID0gKEdQU19TX01fUElDfEdQU19TX01fT1ZSfEdQU19TX01fUkVMfEdQU19TX01fR0JMCi0JCQkgIHxHUFNfU19NX1JEKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgcHNfQ1RPUlM6Ci0gICAgICAvKiBDdG9yIHBzZWN0cyBhcmUgUElDLG5vT1ZSLFJFTCxHQkwsbm9TSFIsbm9FWEUsUkQsbm9XUlQuICovCi0gICAgICBQc2VjdF9BdHRyaWJ1dGVzID0gKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fR0JMfEdQU19TX01fUkQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBwc19EVE9SUzoKLSAgICAgIC8qIER0b3IgcHNlY3RzIGFyZSBQSUMsbm9PVlIsUkVMLEdCTCxub1NIUixub0VYRSxSRCxub1dSVC4gKi8KLSAgICAgIFBzZWN0X0F0dHJpYnV0ZXMgPSAoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9HQkx8R1BTX1NfTV9SRCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogaW1wb3NzaWJsZSAqLwotICAgICAgZXJyb3IgKF8oIlVua25vd24gVk1TIHBzZWN0IHR5cGUgKCVsZCkiKSwgKGxvbmcpIFR5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAvKgotICAgKglNb2RpZnkgdGhlIHBzZWN0IGF0dHJpYnV0ZXMgYWNjb3JkaW5nIHRvIGFueSBhdHRyaWJ1dGUgc3RyaW5nCi0gICAqLwotICBpZiAodnNwICYmIFNfR0VUX1RZUEUgKHZzcC0+U3ltYm9sKSA9PSBOX0FCUykKLSAgICBQc2VjdF9BdHRyaWJ1dGVzIHw9IEdMT0JBTFZBTFVFX0JJVDsKLSAgZWxzZSBpZiAoSEFTX1BTRUNUX0FUVFJJQlVURVMgKE5hbWUpKQotICAgIFZNU19Nb2RpZnlfUHNlY3RfQXR0cmlidXRlcyAoTmFtZSwgJlBzZWN0X0F0dHJpYnV0ZXMpOwotICAvKgotICAgKglDaGVjayBmb3IgZ2xvYmFscmVmL2RlZi92YWwuCi0gICAqLwotICBpZiAoKFBzZWN0X0F0dHJpYnV0ZXMgJiBHTE9CQUxWQUxVRV9CSVQpICE9IDApCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIGdsb2JhbHZhbHVlIHN5bWJvbHMgd2VyZSBnZW5lcmF0ZWQgYmVmb3JlLiBUaGlzIGNvZGUKLSAgICAgICAqIHByZXZlbnRzIHVuc2lnaHRseSBwc2VjdCBidWlsZHVwLCBhbmQgbWFrZXMgc3VyZSB0aGF0Ci0gICAgICAgKiBmaXh1cCByZWZlcmVuY2VzIGFyZSBlbWl0dGVkIGNvcnJlY3RseS4KLSAgICAgICAqLwotICAgICAgdnNwLT5Qc2VjdF9JbmRleCA9IC0xOwkvKiB0byBjYXRjaCBlcnJvcnMgKi8KLSAgICAgIFNfU0VUX1RZUEUgKHZzcC0+U3ltYm9sLCBOX1VOREYpOwkJLyogbWFrZSByZWZzIHdvcmsgKi8KLSAgICAgIHJldHVybiAxOwkJCS8qIGRlY3JlbWVudCBwc2VjdCBjb3VudGVyICovCi0gICAgfQotCi0gIGlmICgoUHNlY3RfQXR0cmlidXRlcyAmIEdMT0JBTFNZTUJPTF9CSVQpICE9IDApCi0gICAgewotICAgICAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAodnNwLT5TeW1ib2wpKQotCXsKLQljYXNlIE5fVU5ERiB8IE5fRVhUOgotCSAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoTmFtZSwgdnNwLT5Qc2VjdF9JbmRleCwKLQkJCQkgIHZzcC0+UHNlY3RfT2Zmc2V0LCBHQkxTWU1fUkVGKTsKLQkgIHZzcC0+UHNlY3RfSW5kZXggPSAtMTsKLQkgIFNfU0VUX1RZUEUgKHZzcC0+U3ltYm9sLCBOX1VOREYpOwotCSAgcmV0dXJuIDE7CQkvKiByZXR1cm4gYW5kIGluZGljYXRlIG5vIHBzZWN0ICovCi0JY2FzZSBOX0RBVEEgfCBOX0VYVDoKLQkgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKE5hbWUsIHZzcC0+UHNlY3RfSW5kZXgsCi0JCQkJICB2c3AtPlBzZWN0X09mZnNldCwgR0JMU1lNX0RFRik7Ci0JICAvKiBJbiB0aGlzIGNhc2Ugd2Ugc3RpbGwgZ2VuZXJhdGUgdGhlIHBzZWN0ICovCi0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYXNfZmF0YWwgKF8oIkdsb2JhbHN5bWJvbCBhdHRyaWJ1dGUgZm9yIHN5bWJvbCAlcyB3YXMgdW5leHBlY3RlZC4iKSwKLQkJICAgIE5hbWUpOwotCSAgYnJlYWs7Ci0JfQkJCS8qIHN3aXRjaCAqLwotICAgIH0KLQotICBQc2VjdF9BdHRyaWJ1dGVzICY9IDB4ZmZmZjsJLyogY2xlYXIgb3V0IHRoZSBnbG9iYWxyZWYvZGVmIHN0dWZmICovCi0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgR1NEIHJlY29yZAotICAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfR1NEKTsKLSAgLyoKLSAgICoJSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCB0aGUgR1NEIHJlY29yZCB0eXBlCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoT0JKX1NfQ19HU0QpOwotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhIFBTRUNUIGRlZmluaXRpb24gc3VicmVjb3JkCi0gICAqLwotICBQVVRfQ0hBUiAoR1NEX1NfQ19QU0MpOwotICAvKgotICAgKglQc2VjdHMgYXJlIGFsd2F5cyBMT05HV09SRCBhbGlnbmVkCi0gICAqLwotICBQVVRfQ0hBUiAoMik7Ci0gIC8qCi0gICAqCVNwZWNpZnkgdGhlIHBzZWN0IGF0dHJpYnV0ZXMKLSAgICovCi0gIFBVVF9TSE9SVCAoUHNlY3RfQXR0cmlidXRlcyk7Ci0gIC8qCi0gICAqCVNwZWNpZnkgdGhlIGFsbG9jYXRpb24KLSAgICovCi0gIFBVVF9MT05HIChTaXplKTsKLSAgLyoKLSAgICoJRmluYWxseSwgdGhlIHBzZWN0IG5hbWUKLSAgICovCi0gIFZNU19DYXNlX0hhY2tfU3ltYm9sIChOYW1lLCBMb2NhbCk7Ci0gIFBVVF9DT1VOVEVEX1NUUklORyAoTG9jYWwpOwotICAvKgotICAgKglGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbAotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0MCi0KLS8qIEdpdmVuIHRoZSBwb2ludGVyIHRvIGEgc3ltYm9sIHdlIGNhbGN1bGF0ZSBob3cgYmlnIHRoZSBkYXRhIGF0IHRoZQotICAgc3ltYm9sIGlzLiAgV2UgZG8gdGhpcyBieSBsb29raW5nIGZvciB0aGUgbmV4dCBzeW1ib2wgKGxvY2FsIG9yIGdsb2JhbCkKLSAgIHdoaWNoIHdpbGwgaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGFub3RoZXIgZGF0dW0uICAqLwotCi1zdGF0aWMgb2Zmc2V0VAotVk1TX0luaXRpYWxpemVkX0RhdGFfU2l6ZSAoczBQLCBFbmRfT2ZfRGF0YSkKLSAgICAgcmVnaXN0ZXIgc3ltYm9sUyAqczBQOwotICAgICB1bnNpZ25lZCBFbmRfT2ZfRGF0YTsKLXsKLSAgc3ltYm9sUyAqczFQOwotICB2YWx1ZVQgczBQX3ZhbCA9IFNfR0VUX1ZBTFVFIChzMFApLCBzMVBfdmFsLAotCSBuZWFyZXN0X3ZhbCA9ICh2YWx1ZVQpIEVuZF9PZl9EYXRhOwotCi0gIC8qIEZpbmQgdGhlIG5lYXJlc3Qgc3ltYm9sIHdoYXQgZm9sbG93cyB0aGlzIG9uZS4gICovCi0gIGZvciAoczFQID0gc3ltYm9sX3Jvb3RQOyBzMVA7IHMxUCA9IHN5bWJvbF9uZXh0IChzMVApKQotICAgIHsKLSAgICAgIC8qIFRoZSBkYXRhIHR5cGUgbXVzdCBtYXRjaC4gICovCi0gICAgICBpZiAoU19HRVRfVFlQRSAoczFQKSAhPSBOX0RBVEEpCi0JY29udGludWU7Ci0gICAgICBzMVBfdmFsID0gU19HRVRfVkFMVUUgKHMxUCk7Ci0gICAgICBpZiAoczFQX3ZhbCA+IHMwUF92YWwgJiYgczFQX3ZhbCA8IG5lYXJlc3RfdmFsKQotCW5lYXJlc3RfdmFsID0gczFQX3ZhbDsKLSAgICB9Ci0gIC8qIENhbGN1bGF0ZSBpdHMgc2l6ZS4gICovCi0gIHJldHVybiAob2Zmc2V0VCkgKG5lYXJlc3RfdmFsIC0gczBQX3ZhbCk7Ci19Ci0KLQotLyogQ2hlY2sgc3ltYm9sIG5hbWVzIGZvciB0aGUgUHNlY3QgaGFjayB3aXRoIGEgZ2xvYmFsdmFsdWUsIGFuZCB0aGVuCi0gICBnZW5lcmF0ZSBnbG9iYWx2YWx1ZXMgZm9yIHRob3NlIHRoYXQgaGF2ZSBpdC4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfRW1pdF9HbG9iYWx2YWx1ZXMgKHRleHRfc2l6LCBkYXRhX3NpeiwgRGF0YV9TZWdtZW50KQotICAgICB1bnNpZ25lZCB0ZXh0X3NpejsKLSAgICAgdW5zaWduZWQgZGF0YV9zaXo7Ci0gICAgIGNoYXIgKkRhdGFfU2VnbWVudDsKLXsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3A7Ci0gIGNoYXIgKnN0cmlwcGVkX25hbWUsICpOYW1lOwotICBpbnQgU2l6ZTsKLSAgaW50IFBzZWN0X0F0dHJpYnV0ZXM7Ci0gIGludCBnbG9iYWx2YWx1ZTsKLSAgaW50IHR5cCwgYWJzdHlwOwotCi0gIC8qCi0gICAqIFNjYW4gdGhlIHN5bWJvbCB0YWJsZSBmb3IgZ2xvYmFsdmFsdWVzLCBhbmQgZW1pdCBkZWYvcmVmIHdoZW4KLSAgICogcmVxdWlyZWQuICBUaGVzZSB3aWxsIGJlIGNhdWdodCBhZ2FpbiBsYXRlciBhbmQgY29udmVydGVkIHRvCi0gICAqIE5fVU5ERgotICAgKi8KLSAgZm9yIChzcCA9IHN5bWJvbF9yb290UDsgc3A7IHNwID0gc3AtPnN5X25leHQpCi0gICAgewotICAgICAgdHlwID0gU19HRVRfUkFXX1RZUEUgKHNwKTsKLSAgICAgIGFic3R5cCA9ICgodHlwICYgfk5fRVhUKSA9PSBOX0FCUyk7Ci0gICAgICAvKgotICAgICAgICoJU2VlIGlmIHRoaXMgaXMgc29tZXRoaW5nIHdlIHdhbnQgdG8gbG9vayBhdC4KLSAgICAgICAqLwotICAgICAgaWYgKCFhYnN0eXAgJiYKLQkgIHR5cCAhPSAoTl9EQVRBIHwgTl9FWFQpICYmCi0JICB0eXAgIT0gKE5fVU5ERiB8IE5fRVhUKSkKLQljb250aW51ZTsKLSAgICAgIC8qCi0gICAgICAgKglTZWUgaWYgdGhpcyBoYXMgZ2xvYmFsdmFsdWUgc3BlY2lmaWNhdGlvbi4KLSAgICAgICAqLwotICAgICAgTmFtZSA9IFNfR0VUX05BTUUgKHNwKTsKLQotICAgICAgaWYgKGFic3R5cCkKLQl7Ci0JICBzdHJpcHBlZF9uYW1lID0gMDsKLQkgIFBzZWN0X0F0dHJpYnV0ZXMgPSBHTE9CQUxWQUxVRV9CSVQ7Ci0JfQotICAgICAgZWxzZSBpZiAoSEFTX1BTRUNUX0FUVFJJQlVURVMgKE5hbWUpKQotCXsKLQkgIHN0cmlwcGVkX25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKE5hbWUpICsgMSk7Ci0JICBzdHJjcHkgKHN0cmlwcGVkX25hbWUsIE5hbWUpOwotCSAgUHNlY3RfQXR0cmlidXRlcyA9IDA7Ci0JICBWTVNfTW9kaWZ5X1BzZWN0X0F0dHJpYnV0ZXMgKHN0cmlwcGVkX25hbWUsICZQc2VjdF9BdHRyaWJ1dGVzKTsKLQl9Ci0gICAgICBlbHNlCi0JY29udGludWU7Ci0KLSAgICAgIGlmICgoUHNlY3RfQXR0cmlidXRlcyAmIEdMT0JBTFZBTFVFX0JJVCkgIT0gMCkKLQl7Ci0JICBzd2l0Y2ggKHR5cCkKLQkgICAgewotCSAgICBjYXNlIE5fQUJTOgotCSAgICAgIC8qIExvY2FsIHN5bWJvbCByZWZlcmVuY2VzIHdpbGwgd2FudAotCQkgdG8gaGF2ZSBhbiBlbnZpcm9ubWVudCBkZWZpbmVkLiAgKi8KLQkgICAgICBpZiAoQ3VycmVudF9FbnZpcm9ubWVudCA8IDApCi0JCVZNU19Mb2NhbF9FbnZpcm9ubWVudF9TZXR1cCAoIi5OX0FCUyIpOwotCSAgICAgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKE5hbWUsIDAsCi0JCQkJICAgICAgU19HRVRfVkFMVUUgKHNwKSwKLQkJCQkgICAgICBHQkxTWU1fREVGfEdCTFNZTV9WQUx8R0JMU1lNX0xDTCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTl9BQlMgfCBOX0VYVDoKLQkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChOYW1lLCAwLAotCQkJCSAgICAgIFNfR0VUX1ZBTFVFIChzcCksCi0JCQkJICAgICAgR0JMU1lNX0RFRnxHQkxTWU1fVkFMKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBOX1VOREYgfCBOX0VYVDoKLQkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChzdHJpcHBlZF9uYW1lLCAwLCAwLCBHQkxTWU1fVkFMKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBOX0RBVEEgfCBOX0VYVDoKLQkgICAgICBTaXplID0gVk1TX0luaXRpYWxpemVkX0RhdGFfU2l6ZSAoc3AsIHRleHRfc2l6ICsgZGF0YV9zaXopOwotCSAgICAgIGlmIChTaXplID4gNCkKLQkJZXJyb3IgKF8oIkludmFsaWQgZGF0YSB0eXBlIGZvciBnbG9iYWx2YWx1ZSIpKTsKLQkgICAgICBnbG9iYWx2YWx1ZSA9IG1kX2NoYXJzX3RvX251bWJlciAoRGF0YV9TZWdtZW50ICsgCi0JCSAgICAgU19HRVRfVkFMVUUgKHNwKSAtIHRleHRfc2l6ICwgU2l6ZSk7Ci0JICAgICAgLyogVGhyZWUgdGltZXMgZm9yIGdvb2QgbHVjay4gIFRoZSBsaW5rZXIgc2VlbXMgdG8gZ2V0IGNvbmZ1c2VkCi0JICAgICAgICAgaWYgdGhlcmUgYXJlIGZld2VyIHRoYW4gdGhyZWUgKi8KLQkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChzdHJpcHBlZF9uYW1lLCAwLCAwLCBHQkxTWU1fVkFMKTsKLQkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChzdHJpcHBlZF9uYW1lLCAwLCBnbG9iYWx2YWx1ZSwKLQkJCQkgICAgICBHQkxTWU1fREVGfEdCTFNZTV9WQUwpOwotCSAgICAgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKHN0cmlwcGVkX25hbWUsIDAsIGdsb2JhbHZhbHVlLAotCQkJCSAgICAgIEdCTFNZTV9ERUZ8R0JMU1lNX1ZBTCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfd2FybiAoXygiSW52YWxpZCBnbG9iYWx2YWx1ZSBvZiAlcyIpLCBzdHJpcHBlZF9uYW1lKTsKLQkgICAgICBicmVhazsKLQkgICAgfQkJCS8qIHN3aXRjaCAqLwotCX0JCQkvKiBpZiAqLwotICAgICAgaWYgKHN0cmlwcGVkX25hbWUpIGZyZWUgKHN0cmlwcGVkX25hbWUpOwkvKiBjbGVhbiB1cCAqLwotICAgIH0JCQkJLyogZm9yICovCi0KLX0KLQwKLQotLyoKLSAqCURlZmluZSBhIHByb2NlZHVyZSBlbnRyeSBwdC9tYXNrCi0gKi8KLXN0YXRpYyB2b2lkCi1WTVNfUHJvY2VkdXJlX0VudHJ5X1B0IChOYW1lLCBQc2VjdF9OdW1iZXIsIFBzZWN0X09mZnNldCwgRW50cnlfTWFzaykKLSAgICAgY2hhciAqTmFtZTsKLSAgICAgaW50IFBzZWN0X051bWJlcjsKLSAgICAgaW50IFBzZWN0X09mZnNldDsKLSAgICAgaW50IEVudHJ5X01hc2s7Ci17Ci0gIGNoYXIgTG9jYWxbMzJdOwotCi0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgR1NEIHJlY29yZAotICAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfR1NEKTsKLSAgLyoKLSAgICoJSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCB0aGUgR1NEIHJlY29yZCB0eXBlCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoT0JKX1NfQ19HU0QpOwotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhIFByb2NlZHVyZSBFbnRyeSBQdC9NYXNrIHN1YnJlY29yZAotICAgKi8KLSAgUFVUX0NIQVIgKCgodW5zaWduZWQpIFBzZWN0X051bWJlciA8PSAyNTUpID8gR1NEX1NfQ19FUE0gOiBHU0RfU19DX0VQTVcpOwotICAvKgotICAgKglEYXRhIHR5cGUgaXMgdW5kZWZpbmVkCi0gICAqLwotICBQVVRfQ0hBUiAoMCk7Ci0gIC8qCi0gICAqCUZsYWdzID0gIlJFTE9DQVRBQkxFIiBhbmQgIkRFRklORUQiCi0gICAqLwotICBQVVRfU0hPUlQgKEdTWV9TX01fREVGIHwgR1NZX1NfTV9SRUwpOwotICAvKgotICAgKglQc2VjdCBOdW1iZXIKLSAgICovCi0gIGlmICgodW5zaWduZWQpIFBzZWN0X051bWJlciA8PSAyNTUpCi0gICAgUFVUX0NIQVIgKFBzZWN0X051bWJlcik7Ci0gIGVsc2UKLSAgICBQVVRfU0hPUlQgKFBzZWN0X051bWJlcik7Ci0gIC8qCi0gICAqCU9mZnNldAotICAgKi8KLSAgUFVUX0xPTkcgKFBzZWN0X09mZnNldCk7Ci0gIC8qCi0gICAqCUVudHJ5IG1hc2sKLSAgICovCi0gIFBVVF9TSE9SVCAoRW50cnlfTWFzayk7Ci0gIC8qCi0gICAqCUZpbmFsbHksIHRoZSBnbG9iYWwgc3ltYm9sIG5hbWUKLSAgICovCi0gIFZNU19DYXNlX0hhY2tfU3ltYm9sIChOYW1lLCBMb2NhbCk7Ci0gIFBVVF9DT1VOVEVEX1NUUklORyAoTG9jYWwpOwotICAvKgotICAgKglGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbAotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQwKLQotLyoKLSAqCVNldCB0aGUgY3VycmVudCBsb2NhdGlvbiBjb3VudGVyIHRvIGEgcGFydGljdWxhciBQc2VjdCBhbmQgT2Zmc2V0Ci0gKi8KLXN0YXRpYyB2b2lkCi1WTVNfU2V0X1BzZWN0IChQc2VjdF9JbmRleCwgT2Zmc2V0LCBSZWNvcmRfVHlwZSkKLSAgICAgaW50IFBzZWN0X0luZGV4OwotICAgICBpbnQgT2Zmc2V0OwotICAgICBpbnQgUmVjb3JkX1R5cGU7Ci17Ci0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgIlJlY29yZF9UeXBlIiByZWNvcmQKLSAgICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCUlmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIHJlY29yZCB0eXBlCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoUmVjb3JkX1R5cGUpOwotICAvKgotICAgKglTdGFjayB0aGUgUHNlY3QgYmFzZSArIE9mZnNldAotICAgKi8KLSAgdm1zX3Rpcl9zdGFja19wc2VjdCAoUHNlY3RfSW5kZXgsIE9mZnNldCwgMCk7Ci0gIC8qCi0gICAqCVNldCByZWxvY2F0aW9uIGJhc2UKLSAgICovCi0gIFBVVF9DSEFSIChUSVJfU19DX0NUTF9TRVRSQik7Ci0gIC8qCi0gICAqCUZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotDAotCi0vKgotICoJU3RvcmUgcmVwZWF0ZWQgaW1tZWRpYXRlIGRhdGEgaW4gY3VycmVudCBQc2VjdAotICovCi1zdGF0aWMgdm9pZAotVk1TX1N0b3JlX1JlcGVhdGVkX0RhdGEgKFJlcGVhdF9Db3VudCwgUG9pbnRlciwgU2l6ZSwgUmVjb3JkX1R5cGUpCi0gICAgIGludCBSZXBlYXRfQ291bnQ7Ci0gICAgIHJlZ2lzdGVyIGNoYXIgKlBvaW50ZXI7Ci0gICAgIGludCBTaXplOwotICAgICBpbnQgUmVjb3JkX1R5cGU7Ci17Ci0KLSAgLyoKLSAgICoJSWdub3JlIHplcm8gYnl0ZXMvd29yZHMvbG9uZ3dvcmRzCi0gICAqLwotICBzd2l0Y2ggKFNpemUpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIGlmIChQb2ludGVyWzNdICE9IDAgfHwgUG9pbnRlclsyXSAhPSAwKSBicmVhazsKLSAgICAgIC8qIGVsc2UgRkFMTFRIUlUgKi8KLSAgICBjYXNlIDI6Ci0gICAgICBpZiAoUG9pbnRlclsxXSAhPSAwKSBicmVhazsKLSAgICAgIC8qIGVsc2UgRkFMTFRIUlUgKi8KLSAgICBjYXNlIDE6Ci0gICAgICBpZiAoUG9pbnRlclswXSAhPSAwKSBicmVhazsKLSAgICAgIC8qIHplcm8gdmFsdWUgKi8KLSAgICAgIHJldHVybjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICAvKgotICAgKglJZiB0aGUgZGF0YSBpcyB0b28gYmlnIGZvciBhIFRJUl9TX0NfU1RPX1JJVkIgc3ViLXJlY29yZAotICAgKgl0aGVuIHdlIGRvIGl0IG1hbnVhbGx5Ci0gICAqLwotICBpZiAoU2l6ZSA+IDI1NSkKLSAgICB7Ci0gICAgICB3aGlsZSAoLS1SZXBlYXRfQ291bnQgPj0gMCkKLQlWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKFBvaW50ZXIsIFNpemUsIFJlY29yZF9UeXBlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgIlJlY29yZF9UeXBlIiByZWNvcmQKLSAgICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCUlmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgcmVjb3JkIHR5cGUKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCVN0YWNrIHRoZSByZXBlYXQgY291bnQKLSAgICovCi0gIFBVVF9DSEFSIChUSVJfU19DX1NUQV9MVyk7Ci0gIFBVVF9MT05HIChSZXBlYXRfQ291bnQpOwotICAvKgotICAgKglBbmQgbm93IHRoZSBjb21tYW5kIGFuZCBpdHMgZGF0YQotICAgKi8KLSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RPX1JJVkIpOwotICBQVVRfQ0hBUiAoU2l6ZSk7Ci0gIHdoaWxlICgtLVNpemUgPj0gMCkKLSAgICBQVVRfQ0hBUiAoKlBvaW50ZXIrKyk7Ci0gIC8qCi0gICAqCUZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotDAotCi0vKgotICoJU3RvcmUgYSBQb3NpdGlvbiBJbmRlcGVuZGVudCBSZWZlcmVuY2UKLSAqLwotc3RhdGljIHZvaWQKLVZNU19TdG9yZV9QSUNfU3ltYm9sX1JlZmVyZW5jZSAoU3ltYm9sLCBPZmZzZXQsIFBDX1JlbGF0aXZlLAotCQkJCVBzZWN0LCBQc2VjdF9PZmZzZXQsIFJlY29yZF9UeXBlKQotICAgICBzeW1ib2xTICpTeW1ib2w7Ci0gICAgIGludCBPZmZzZXQ7Ci0gICAgIGludCBQQ19SZWxhdGl2ZTsKLSAgICAgaW50IFBzZWN0OwotICAgICBpbnQgUHNlY3RfT2Zmc2V0OwotICAgICBpbnQgUmVjb3JkX1R5cGU7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBWTVNfU3ltYm9sICp2c3AgPSBTeW1ib2wtPnN5X29iajsKLSAgY2hhciBMb2NhbFszMl07Ci0gIGludCBsb2NhbF9zeW0gPSAwOwotCi0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgIlJlY29yZF9UeXBlIiByZWNvcmQKLSAgICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCUlmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgcmVjb3JkIHR5cGUKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCVNldCB0byB0aGUgYXBwcm9wcmlhdGUgb2Zmc2V0IGluIHRoZSBQc2VjdC4KLSAgICoJRm9yIGEgQ29kZSByZWZlcmVuY2Ugd2UgbmVlZCB0byBmaXggdGhlIG9wZXJhbmQKLSAgICoJc3BlY2lmaWVyIGFzIHdlbGwsIHNvIGJhY2sgdXAgMSBieXRlOwotICAgKglmb3IgYSBEYXRhIHJlZmVyZW5jZSB3ZSBqdXN0IHN0b3JlIEhFUkUuCi0gICAqLwotICBWTVNfU2V0X1BzZWN0IChQc2VjdCwKLQkJIFBDX1JlbGF0aXZlID8gUHNlY3RfT2Zmc2V0IC0gMSA6IFBzZWN0X09mZnNldCwKLQkJIFJlY29yZF9UeXBlKTsKLSAgLyoKLSAgICoJTWFrZSBzdXJlIHdlIGFyZSBzdGlsbCBnZW5lcmF0aW5nIGEgIlJlY29yZCBUeXBlIiByZWNvcmQKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCURpc3BhdGNoIG9uIHN5bWJvbCB0eXBlIChzbyB3ZSBjYW4gc3RhY2sgaXRzIHZhbHVlKQotICAgKi8KLSAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoU3ltYm9sKSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICoJR2xvYmFsIHN5bWJvbAotICAgICAgICovCi0gICAgY2FzZSBOX0FCUzoKLSAgICAgIGxvY2FsX3N5bSA9IDE7Ci0gICAgICAvKkZBTExUSFJVKi8KLSAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6Ci0jaWZkZWYJTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUKLSAgICBjYXNlIE5fVU5ERiB8IE5fRVhUOgotICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6Ci0jZW5kaWYJLyogTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUgKi8KLSAgICBjYXNlIE5fVU5ERjoKLSAgICBjYXNlIE5fVEVYVCB8IE5fRVhUOgotICAgICAgLyoKLSAgICAgICAqCUdldCB0aGUgc3ltYm9sIG5hbWUgKGNhc2UgaGFja2VkKQotICAgICAgICovCi0gICAgICBWTVNfQ2FzZV9IYWNrX1N5bWJvbCAoU19HRVRfTkFNRSAoU3ltYm9sKSwgTG9jYWwpOwotICAgICAgLyoKLSAgICAgICAqCVN0YWNrIHRoZSBnbG9iYWwgc3ltYm9sIHZhbHVlCi0gICAgICAgKi8KLSAgICAgIGlmICghbG9jYWxfc3ltKQotCXsKLQkgIFBVVF9DSEFSIChUSVJfU19DX1NUQV9HQkwpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBMb2NhbCBzeW1ib2xzIGhhdmUgYW4gZXh0cmEgZmllbGQuICAqLwotCSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RBX0xTWSk7Ci0JICBQVVRfU0hPUlQgKEN1cnJlbnRfRW52aXJvbm1lbnQpOwotCX0KLSAgICAgIFBVVF9DT1VOVEVEX1NUUklORyAoTG9jYWwpOwotICAgICAgaWYgKE9mZnNldCkKLQl7Ci0JICAvKgotCSAgICoJU3RhY2sgdGhlIGxvbmd3b3JkIG9mZnNldAotCSAgICovCi0JICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfTFcpOwotCSAgUFVUX0xPTkcgKE9mZnNldCk7Ci0JICAvKgotCSAgICoJQWRkIHRoZSB0d28sIGxlYXZpbmcgdGhlIHJlc3VsdCBvbiB0aGUgc3RhY2sKLQkgICAqLwotCSAgUFVUX0NIQVIgKFRJUl9TX0NfT1BSX0FERCk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgICAvKgotICAgICAgICoJVW5pbml0aWFsaXplZCBsb2NhbCBkYXRhCi0gICAgICAgKi8KLSAgICBjYXNlIE5fQlNTOgotICAgICAgLyoKLSAgICAgICAqCVN0YWNrIHRoZSBQc2VjdCAoK29mZnNldCkKLSAgICAgICAqLwotICAgICAgdm1zX3Rpcl9zdGFja19wc2VjdCAodnNwLT5Qc2VjdF9JbmRleCwKLQkJCSAgIHZzcC0+UHNlY3RfT2Zmc2V0ICsgT2Zmc2V0LAotCQkJICAgMCk7Ci0gICAgICBicmVhazsKLSAgICAgIC8qCi0gICAgICAgKglMb2NhbCB0ZXh0Ci0gICAgICAgKi8KLSAgICBjYXNlIE5fVEVYVDoKLSAgICAgIC8qCi0gICAgICAgKglTdGFjayB0aGUgUHNlY3QgKCtvZmZzZXQpCi0gICAgICAgKi8KLSAgICAgIHZtc190aXJfc3RhY2tfcHNlY3QgKHZzcC0+UHNlY3RfSW5kZXgsCi0JCQkgICBTX0dFVF9WQUxVRSAoU3ltYm9sKSArIE9mZnNldCwKLQkJCSAgIDApOwotICAgICAgYnJlYWs7Ci0gICAgICAvKgotICAgICAgICoJSW5pdGlhbGl6ZWQgbG9jYWwgb3IgZ2xvYmFsIGRhdGEKLSAgICAgICAqLwotICAgIGNhc2UgTl9EQVRBOgotI2lmbmRlZglOT1RfVkFYXzExX0NfQ09NUEFUSUJMRQotICAgIGNhc2UgTl9VTkRGIHwgTl9FWFQ6Ci0gICAgY2FzZSBOX0RBVEEgfCBOX0VYVDoKLSNlbmRpZgkvKiBOT1RfVkFYXzExX0NfQ09NUEFUSUJMRSAqLwotICAgICAgLyoKLSAgICAgICAqCVN0YWNrIHRoZSBQc2VjdCAoK29mZnNldCkKLSAgICAgICAqLwotICAgICAgdm1zX3Rpcl9zdGFja19wc2VjdCAodnNwLT5Qc2VjdF9JbmRleCwKLQkJCSAgIHZzcC0+UHNlY3RfT2Zmc2V0ICsgT2Zmc2V0LAotCQkJICAgMCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIC8qCi0gICAqCVN0b3JlIGVpdGhlciBhIGNvZGUgb3IgZGF0YSByZWZlcmVuY2UKLSAgICovCi0gIFBVVF9DSEFSIChQQ19SZWxhdGl2ZSA/IFRJUl9TX0NfU1RPX1BJQ1IgOiBUSVJfU19DX1NUT19QSURSKTsKLSAgLyoKLSAgICoJRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0MCi0KLS8qCi0gKglDaGVjayBpbiB0aGUgdGV4dCBhcmVhIGZvciBhbiBpbmRpcmVjdCBwYy1yZWxhdGl2ZSByZWZlcmVuY2UKLSAqCWFuZCBmaXggaXQgdXAgd2l0aCBhZGRyZXNzaW5nIG1vZGUgMHhmZiBbUEMgaW5kaXJlY3RdCi0gKgotICoJVEhJUyBTSE9VTEQgQkUgUkVQTEFDRUQgQlkgVEhFIFVTRSBPRiBUSVJfU19DX1NUT19QSVJSIElOIFRIRQotICoJUElDIENPREUgR0VORVJBVElORyBGSVhVUCBST1VUSU5FLgotICovCi1zdGF0aWMgdm9pZAotVk1TX0ZpeF9JbmRpcmVjdF9SZWZlcmVuY2UgKFRleHRfUHNlY3QsIE9mZnNldCwgZnJhZ1AsIHRleHRfZnJhZ19yb290KQotICAgICBpbnQgVGV4dF9Qc2VjdDsKLSAgICAgaW50IE9mZnNldDsKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICBmcmFnUyAqdGV4dF9mcmFnX3Jvb3Q7Ci17Ci0gIC8qCi0gICAqCVRoZSBhZGRyZXNzaW5nIG1vZGUgYnl0ZSBpcyAxIGJ5dGUgYmVmb3JlIHRoZSBhZGRyZXNzCi0gICAqLwotICBPZmZzZXQtLTsKLSAgLyoKLSAgICoJSXMgaXQgaW4gVEhJUyBmcmFnPz8KLSAgICovCi0gIGlmICgoT2Zmc2V0IDwgZnJhZ1AtPmZyX2FkZHJlc3MpIHx8Ci0gICAgICAoT2Zmc2V0ID49IChmcmFnUC0+ZnJfYWRkcmVzcyArIGZyYWdQLT5mcl9maXgpKSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICoJV2UgbmVlZCB0byBzZWFyY2ggZm9yIHRoZSBmcmFnbWVudCBjb250YWluaW5nIHRoaXMKLSAgICAgICAqCU9mZnNldAotICAgICAgICovCi0gICAgICBmb3IgKGZyYWdQID0gdGV4dF9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQotCXsKLQkgIGlmICgoT2Zmc2V0ID49IGZyYWdQLT5mcl9hZGRyZXNzKSAmJgotCSAgICAgIChPZmZzZXQgPCAoZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4KSkpCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIC8qCi0gICAgICAgKglJZiB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBmcmFnLCB0aGluZ3MgYXJlIEJBRCEhCi0gICAgICAgKi8KLSAgICAgIGlmIChmcmFnUCA9PSAwKQotCWVycm9yIChfKCJDb3VsZG4ndCBmaW5kIGZpeHVwIGZyYWdtZW50IHdoZW4gY2hlY2tpbmcgZm9yIGluZGlyZWN0IHJlZmVyZW5jZSIpKTsKLSAgICB9Ci0gIC8qCi0gICAqCUNoZWNrIGZvciBpbmRpcmVjdCBQQyByZWxhdGl2ZSBhZGRyZXNzaW5nIG1vZGUKLSAgICovCi0gIGlmIChmcmFnUC0+ZnJfbGl0ZXJhbFtPZmZzZXQgLSBmcmFnUC0+ZnJfYWRkcmVzc10gPT0gKGNoYXIpIDB4ZmYpCi0gICAgewotICAgICAgc3RhdGljIGNoYXIgQWRkcmVzc19Nb2RlID0gKGNoYXIpIDB4ZmY7Ci0KLSAgICAgIC8qCi0gICAgICAgKglZZXM6IFN0b3JlIHRoZSBpbmRpcmVjdCBtb2RlIGJhY2sgaW50byB0aGUgaW1hZ2UKLSAgICAgICAqCSAgICAgdG8gZml4IHVwIHRoZSBkYW1hZ2UgZG9uZSBieSBTVE9fUElDUgotICAgICAgICovCi0gICAgICBWTVNfU2V0X1BzZWN0IChUZXh0X1BzZWN0LCBPZmZzZXQsIE9CSl9TX0NfVElSKTsKLSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoJkFkZHJlc3NfTW9kZSwgMSwgT0JKX1NfQ19USVIpOwotICAgIH0KLX0KLQwKLQotLyoKLSAqCUlmIHRoZSBwcm9jZWR1cmUgIm1haW4oKSIgZXhpc3RzIHdlIGhhdmUgdG8gYWRkIHRoZSBpbnN0cnVjdGlvbgotICoJImpzYiBjJG1haW5fYXJncyIgYXQgdGhlIGJlZ2lubmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggVkFYLTExICJDIi4KLSAqCi0gKglGSVhNRTogIHRoZSBtYWNybyBuYW1lIGBIQUNLX0RFQ19DX1NUQVJUVVAnIHNob3VsZCBiZSByZW5hbWVkCi0gKgkJdG8gYEhBQ0tfVkFYQ1JUTF9TVEFSVFVQJyBiZWNhdXNlIERpZ2l0YWwncyBjb21waWxlcgotICoJCW5hbWVkICJERUMgQyIgdXNlcyBydW4tdGltZSBsaWJyYXJ5ICJERUNDJFNIUiIsIGJ1dCB0aGlzCi0gKgkJc3RhcnR1cCBjb2RlIGlzIGZvciAiVkFYQ1JUTCIsIHRoZSBsaWJyYXJ5IGZvciBEaWdpdGFsJ3MKLSAqCQlvbGRlciAiVkFYIEMiLiAgQWxzbywgdGhpcyBleHRyYSBjb2RlIGlzbid0IG5lZWRlZCBmb3IKLSAqCQlzdXBwb3J0aW5nIGdjYyBiZWNhdXNlIGl0IGFscmVhZHkgZ2VuZXJhdGVzIHRoZSBWQVhDUlRMCi0gKgkJc3RhcnR1cCBjYWxsIHdoZW4gY29tcGlsaW5nIG1haW4oKS4gIFRoZSByZWZlcmVuY2UgdG8KLSAqCQlgZmxhZ19oYXNoX2xvbmdfbmFtZXMnIGxvb2tzIHZlcnkgc3VzcGljaW91cyB0b287Ci0gKgkJcHJvYmFibHkgYW4gb2xkLXN0eWxlIGNvbW1hbmQgbGluZSBvcHRpb24gd2FzIGluYWR2ZXJ0ZW50bHkKLSAqCQlvdmVybG9hZGVkIGhlcmUsIHRoZW4gYmxpbmRseSBjb252ZXJ0ZWQgaW50byB0aGUgbmV3IG9uZS4KLSAqLwotdm9pZAotdm1zX2NoZWNrX2Zvcl9tYWluICgpCi17Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0jaWZkZWYJSEFDS19ERUNfQ19TVEFSVFVQCS8qIEpGICovCi0gIHJlZ2lzdGVyIHN0cnVjdCBmcmNoYWluICpmcmNoYWluUDsKLSAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICByZWdpc3RlciBmcmFnUyAqKnByZXZfZnJhZ1BQOwotICByZWdpc3RlciBzdHJ1Y3QgZml4ICpmaXhQOwotICByZWdpc3RlciBmcmFnUyAqTmV3X0ZyYWc7Ci0gIGludCBpOwotI2VuZGlmCS8qIEhBQ0tfREVDX0NfU1RBUlRVUCAqLwotCi0gIHN5bWJvbFAgPSAoc3ltYm9sUyAqKSBzeW1ib2xfZmluZCAoIl9tYWluIik7Ci0gIGlmIChzeW1ib2xQICYmICFTX0lTX0RFQlVHIChzeW1ib2xQKSAmJgotICAgICAgU19JU19FWFRFUk5BTCAoc3ltYm9sUCkgJiYgKFNfR0VUX1RZUEUgKHN5bWJvbFApID09IE5fVEVYVCkpCi0gICAgewotI2lmZGVmCUhBQ0tfREVDX0NfU1RBUlRVUAotICAgICAgaWYgKCFmbGFnX2hhc2hfbG9uZ19uYW1lcykKLQl7Ci0jZW5kaWYKLQkgIC8qCi0JICAgKglSZW1lbWJlciB0aGUgZW50cnkgcG9pbnQgc3ltYm9sCi0JICAgKi8KLQkgIEVudHJ5X1BvaW50X1N5bWJvbCA9IHN5bWJvbFA7Ci0jaWZkZWYgSEFDS19ERUNfQ19TVEFSVFVQCi0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qCi0JICAgKglTY2FuIGFsbCB0aGUgZnJhZ21lbnQgY2hhaW5zIGZvciB0aGUgb25lIHdpdGggIl9tYWluIgotCSAgICoJKEFjdHVhbGx5IHdlIGtub3cgdGhlIGZyYWdtZW50IGZyb20gdGhlIHN5bWJvbCwgYnV0IHdlIG5lZWQKLQkgICAqCSB0aGUgcHJldmlvdXMgZnJhZ21lbnQgc28gd2UgY2FuIGNoYW5nZSBpdHMgcG9pbnRlcikKLQkgICAqLwotCSAgZnJjaGFpblAgPSBmcmNoYWluX3Jvb3Q7Ci0JICB3aGlsZSAoZnJjaGFpblApCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqCVNjYW4gYWxsIHRoZSBmcmFnbWVudHMgaW4gdGhpcyBjaGFpbiwgcmVtZW1iZXJpbmcKLQkgICAgICAgKgl0aGUgInByZXZpb3VzIGZyYWdtZW50IgotCSAgICAgICAqLwotCSAgICAgIHByZXZfZnJhZ1BQID0gJmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0JICAgICAgZnJhZ1AgPSBmcmNoYWluUC0+ZnJjaF9yb290OwotCSAgICAgIHdoaWxlIChmcmFnUCAmJiAoZnJhZ1AgIT0gZnJjaGFpblAtPmZyY2hfbGFzdCkpCi0JCXsKLQkJICAvKgotCQkgICAqCUlzIHRoaXMgdGhlIGZyYWdtZW50PwotCQkgICAqLwotCQkgIGlmIChmcmFnUCA9PSBzeW1ib2xQLT5zeV9mcmFnKQotCQkgICAgewotCQkgICAgICAvKgotCQkgICAgICAgKglZZXM6IE1vZGlmeSB0aGUgZnJhZ21lbnQgYnkgcmVwbGFjaW5nCi0JCSAgICAgICAqCSAgICAgaXQgd2l0aCBhIG5ldyBmcmFnbWVudC4KLQkJICAgICAgICovCi0JCSAgICAgIE5ld19GcmFnID0gKGZyYWdTICopCi0JCQl4bWFsbG9jIChzaXplb2YgKCpOZXdfRnJhZykgKwotCQkJCSBmcmFnUC0+ZnJfZml4ICsKLQkJCQkgZnJhZ1AtPmZyX3ZhciArCi0JCQkJIDUpOwotCQkgICAgICAvKgotCQkgICAgICAgKglUaGUgZnJhZ21lbnRzIGFyZSB0aGUgc2FtZSBleGNlcHQKLQkJICAgICAgICoJdGhhdCB0aGUgImZpeGVkIiBhcmVhIGlzIGxhcmdlcgotCQkgICAgICAgKi8KLQkJICAgICAgKk5ld19GcmFnID0gKmZyYWdQOwotCQkgICAgICBOZXdfRnJhZy0+ZnJfZml4ICs9IDY7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCUNvcHkgdGhlIGxpdGVyYWwgZGF0YSBvcGVuaW5nIGEgaG9sZQotCQkgICAgICAgKgkyIGJ5dGVzIGFmdGVyICJfbWFpbiIgKGkuZS4ganVzdCBhZnRlcgotCQkgICAgICAgKgl0aGUgZW50cnkgbWFzaykuICBJbnRvIHdoaWNoIHdlIHBsYWNlCi0JCSAgICAgICAqCXRoZSBKU0IgaW5zdHJ1Y3Rpb24uCi0JCSAgICAgICAqLwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFswXSA9IGZyYWdQLT5mcl9saXRlcmFsWzBdOwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFsxXSA9IGZyYWdQLT5mcl9saXRlcmFsWzFdOwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFsyXSA9IDB4MTY7CS8qIEpzYiAqLwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFszXSA9IDB4ZWY7Ci0JCSAgICAgIE5ld19GcmFnLT5mcl9saXRlcmFsWzRdID0gMDsKLQkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbNV0gPSAwOwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFs2XSA9IDA7Ci0JCSAgICAgIE5ld19GcmFnLT5mcl9saXRlcmFsWzddID0gMDsKLQkJICAgICAgZm9yIChpID0gMjsgaSA8IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfdmFyOyBpKyspCi0JCQlOZXdfRnJhZy0+ZnJfbGl0ZXJhbFtpICsgNl0gPQotCQkJICBmcmFnUC0+ZnJfbGl0ZXJhbFtpXTsKLQkJICAgICAgLyoKLQkJICAgICAgICoJTm93IHJlcGxhY2UgdGhlIG9sZCBmcmFnbWVudCB3aXRoIHRoZQotCQkgICAgICAgKgluZXdseSBnZW5lcmF0ZWQgb25lLgotCQkgICAgICAgKi8KLQkJICAgICAgKnByZXZfZnJhZ1BQID0gTmV3X0ZyYWc7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCVJlbWVtYmVyIHRoZSBlbnRyeSBwb2ludCBzeW1ib2wKLQkJICAgICAgICovCi0JCSAgICAgIEVudHJ5X1BvaW50X1N5bWJvbCA9IHN5bWJvbFA7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCVNjYW4gdGhlIHRleHQgYXJlYSBmaXh1cCBzdHJ1Y3R1cmVzCi0JCSAgICAgICAqCWFzIG9mZnNldHMgaW4gdGhlIGZyYWdtZW50IG1heSBoYXZlCi0JCSAgICAgICAqCWNoYW5nZWQKLQkJICAgICAgICovCi0JCSAgICAgIGZvciAoZml4UCA9IHRleHRfZml4X3Jvb3Q7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotCQkJewotCQkJICAvKgotCQkJICAgKglMb29rIGZvciByZWZlcmVuY2VzIHRvIHRoaXMKLQkJCSAgICoJZnJhZ21lbnQuCi0JCQkgICAqLwotCQkJICBpZiAoZml4UC0+ZnhfZnJhZyA9PSBmcmFnUCkKLQkJCSAgICB7Ci0JCQkgICAgICAvKgotCQkJICAgICAgICoJQ2hhbmdlIHRoZSBmcmFnbWVudAotCQkJICAgICAgICoJcG9pbnRlcgotCQkJICAgICAgICovCi0JCQkgICAgICBmaXhQLT5meF9mcmFnID0gTmV3X0ZyYWc7Ci0JCQkgICAgICAvKgotCQkJICAgICAgICoJSWYgdGhlIG9mZnNldCBpcyBhZnRlcgotCQkJICAgICAgICoJdGhlIGVudHJ5IG1hc2sgd2UgbmVlZAotCQkJICAgICAgICoJdG8gYWNjb3VudCBmb3IgdGhlIEpTQgotCQkJICAgICAgICoJaW5zdHJ1Y3Rpb24gd2UganVzdAotCQkJICAgICAgICoJaW5zZXJ0ZWQuCi0JCQkgICAgICAgKi8KLQkJCSAgICAgIGlmIChmaXhQLT5meF93aGVyZSA+PSAyKQotCQkJCWZpeFAtPmZ4X3doZXJlICs9IDY7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICAvKgotCQkgICAgICAgKglTY2FuIHRoZSBzeW1ib2xzIGFzIG9mZnNldHMgaW4gdGhlCi0JCSAgICAgICAqCWZyYWdtZW50IG1heSBoYXZlIGNoYW5nZWQKLQkJICAgICAgICovCi0JCSAgICAgIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsKLQkJCSAgIHN5bWJvbFA7Ci0JCQkgICBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotCQkJewotCQkJICAvKgotCQkJICAgKglMb29rIGZvciByZWZlcmVuY2VzIHRvIHRoaXMKLQkJCSAgICoJZnJhZ21lbnQuCi0JCQkgICAqLwotCQkJICBpZiAoc3ltYm9sUC0+c3lfZnJhZyA9PSBmcmFnUCkKLQkJCSAgICB7Ci0JCQkgICAgICAvKgotCQkJICAgICAgICoJQ2hhbmdlIHRoZSBmcmFnbWVudAotCQkJICAgICAgICoJcG9pbnRlcgotCQkJICAgICAgICovCi0JCQkgICAgICBzeW1ib2xQLT5zeV9mcmFnID0gTmV3X0ZyYWc7Ci0JCQkgICAgICAvKgotCQkJICAgICAgICoJSWYgdGhlIG9mZnNldCBpcyBhZnRlcgotCQkJICAgICAgICoJdGhlIGVudHJ5IG1hc2sgd2UgbmVlZAotCQkJICAgICAgICoJdG8gYWNjb3VudCBmb3IgdGhlIEpTQgotCQkJICAgICAgICoJaW5zdHJ1Y3Rpb24gd2UganVzdAotCQkJICAgICAgICoJaW5zZXJ0ZWQuCi0JCQkgICAgICAgKi8KLQkJCSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgPj0gMikKLQkJCQlTX1NFVF9WQUxVRSAoc3ltYm9sUCwKLQkJCQkJICAgICBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgKyA2KTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCU1ha2UgYSBzeW1ib2wgcmVmZXJlbmNlIHRvCi0JCSAgICAgICAqCSJfYyRtYWluX2FyZ3MiIHNvIHdlIGNhbiBnZXQKLQkJICAgICAgICoJaXRzIGFkZHJlc3MgaW5zZXJ0ZWQgaW50byB0aGUKLQkJICAgICAgICoJSlNCIGluc3RydWN0aW9uLgotCQkgICAgICAgKi8KLQkJICAgICAgc3ltYm9sUCA9IChzeW1ib2xTICopIHhtYWxsb2MgKHNpemVvZiAoKnN5bWJvbFApKTsKLQkJICAgICAgU19TRVRfTkFNRSAoc3ltYm9sUCwgIl9DJE1BSU5fQVJHUyIpOwotCQkgICAgICBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1VOREYpOwotCQkgICAgICBTX1NFVF9PVEhFUiAoc3ltYm9sUCwgMCk7Ci0JCSAgICAgIFNfU0VUX0RFU0MgKHN5bWJvbFAsIDApOwotCQkgICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgMCk7Ci0JCSAgICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gMDsKLQkJICAgICAgc3ltYm9sUC0+c3lfbnVtYmVyID0gMDsKLQkJICAgICAgc3ltYm9sUC0+c3lfb2JqID0gMDsKLQkJICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9IE5ld19GcmFnOwotCQkgICAgICBzeW1ib2xQLT5zeV9yZXNvbHZlZCA9IDA7Ci0JCSAgICAgIHN5bWJvbFAtPnN5X3Jlc29sdmluZyA9IDA7Ci0JCSAgICAgIC8qIHRoaXMgYWN0dWFsbHkgaW5zZXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0ICovCi0JCSAgICAgIHN5bWJvbF9hcHBlbmQgKHN5bWJvbF9yb290UCwgc3ltYm9sUCwKLQkJCQkgICAgICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0JCSAgICAgIHN5bWJvbF9yb290UCA9IHN5bWJvbFA7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCUdlbmVyYXRlIGEgdGV4dCBmaXh1cCBzdHJ1Y3R1cmUKLQkJICAgICAgICoJdG8gZ2V0ICJfYyRtYWluX2FyZ3MiIHN0b3JlZCBpbnRvIHRoZQotCQkgICAgICAgKglKU0IgaW5zdHJ1Y3Rpb24uCi0JCSAgICAgICAqLwotCQkgICAgICBmaXhQID0gKHN0cnVjdCBmaXggKikgeG1hbGxvYyAoc2l6ZW9mICgqZml4UCkpOwotCQkgICAgICBmaXhQLT5meF9mcmFnID0gTmV3X0ZyYWc7Ci0JCSAgICAgIGZpeFAtPmZ4X3doZXJlID0gNDsKLQkJICAgICAgZml4UC0+ZnhfYWRkc3kgPSBzeW1ib2xQOwotCQkgICAgICBmaXhQLT5meF9zdWJzeSA9IDA7Ci0JCSAgICAgIGZpeFAtPmZ4X29mZnNldCA9IDA7Ci0JCSAgICAgIGZpeFAtPmZ4X3NpemUgPSA0OwotCQkgICAgICBmaXhQLT5meF9wY3JlbCA9IDE7Ci0JCSAgICAgIGZpeFAtPmZ4X25leHQgPSB0ZXh0X2ZpeF9yb290OwotCQkgICAgICB0ZXh0X2ZpeF9yb290ID0gZml4UDsKLQkJICAgICAgLyoKLQkJICAgICAgICoJTm93IG1ha2Ugc3VyZSB3ZSBleGl0IGZyb20gdGhlIGxvb3AKLQkJICAgICAgICovCi0JCSAgICAgIGZyY2hhaW5QID0gMDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgLyoKLQkJICAgKglUcnkgdGhlIG5leHQgZnJhZ21lbnQKLQkJICAgKi8KLQkJICBwcmV2X2ZyYWdQUCA9ICZmcmFnUC0+ZnJfbmV4dDsKLQkJICBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0OwotCQl9Ci0JICAgICAgLyoKLQkgICAgICAgKglUcnkgdGhlIG5leHQgZnJhZ21lbnQgY2hhaW4KLQkgICAgICAgKi8KLQkgICAgICBpZiAoZnJjaGFpblApCi0JCWZyY2hhaW5QID0gZnJjaGFpblAtPmZyY2hfbmV4dDsKLQkgICAgfQotCX0KLSNlbmRpZiAvKiBIQUNLX0RFQ19DX1NUQVJUVVAgKi8KLSAgICB9Ci19Ci0MCi0KLS8qCi0gKglCZWdpbm5pbmcgb2Ygdm1zX3dyaXRlX29iamVjdF9maWxlKCkuCi0gKi8KLQotc3RhdGljCi1zdHJ1Y3Qgdm1zX29ial9zdGF0ZSB7Ci0KLSAgLyogTmV4dCBwcm9ncmFtIHNlY3Rpb24gaW5kZXggdG8gdXNlLiAgKi8KLSAgaW50CXBzZWN0X251bWJlcjsKLQotICAvKiBQc2VjdCBpbmRleCBmb3IgY29kZS4gIEFsd2F5cyBlbmRzIHVwICMwLiAgKi8KLSAgaW50CXRleHRfcHNlY3Q7Ci0KLSAgLyogUHNlY3QgaW5kZXggZm9yIGluaXRpYWxpemVkIHN0YXRpYyB2YXJpYWJsZXMuICAqLwotICBpbnQJZGF0YV9wc2VjdDsKLQotICAvKiBQc2VjdCBpbmRleCBmb3IgdW5pbml0aWFsaXplZCBzdGF0aWMgdmFyaWFibGVzLiAgKi8KLSAgaW50CWJzc19wc2VjdDsKLQotICAvKiBQc2VjdCBpbmRleCBmb3Igc3RhdGljIGNvbnN0cnVjdG9ycy4gICovCi0gIGludAljdG9yc19wc2VjdDsKLQotICAvKiBQc2VjdCBpbmRleCBmb3Igc3RhdGljIGRlc3RydWN0b3JzLiAgKi8KLSAgaW50CWR0b3JzX3BzZWN0OwotCi0gIC8qIE51bWJlciBvZiBieXRlcyB1c2VkIGZvciBsb2NhbCBzeW1ib2wgZGF0YS4gICovCi0gIGludAlsb2NhbF9pbml0ZF9kYXRhX3NpemU7Ci0KLSAgLyogRHluYW1pYyBidWZmZXIgZm9yIGluaXRpYWxpemVkIGRhdGEuICAqLwotICBjaGFyICpkYXRhX3NlZ21lbnQ7Ci0KLX0gdm1zX29ial9zdGF0ZTsKLQotI2RlZmluZSBQc2VjdF9OdW1iZXIJCXZtc19vYmpfc3RhdGUucHNlY3RfbnVtYmVyCi0jZGVmaW5lIFRleHRfUHNlY3QJCXZtc19vYmpfc3RhdGUudGV4dF9wc2VjdAotI2RlZmluZSBEYXRhX1BzZWN0CQl2bXNfb2JqX3N0YXRlLmRhdGFfcHNlY3QKLSNkZWZpbmUgQnNzX1BzZWN0CQl2bXNfb2JqX3N0YXRlLmJzc19wc2VjdAotI2RlZmluZSBDdG9yc19Qc2VjdAkJdm1zX29ial9zdGF0ZS5jdG9yc19wc2VjdAotI2RlZmluZSBEdG9yc19Qc2VjdAkJdm1zX29ial9zdGF0ZS5kdG9yc19wc2VjdAotI2RlZmluZSBMb2NhbF9Jbml0ZF9EYXRhX1NpemUJdm1zX29ial9zdGF0ZS5sb2NhbF9pbml0ZF9kYXRhX3NpemUKLSNkZWZpbmUgRGF0YV9TZWdtZW50CQl2bXNfb2JqX3N0YXRlLmRhdGFfc2VnbWVudAotCi0KLSNkZWZpbmUgSVNfR1hYX1ZUQUJMRShzeW1QKSAoc3RybmNtcCAoU19HRVRfTkFNRSAoc3ltUCksICJfX3Z0LiIsIDUpID09IDApCi0jZGVmaW5lIElTX0dYWF9YVE9SKHN5bVApIChzdHJuY21wIChTX0dFVF9OQU1FIChzeW1QKSwgIl9fR0xPQkFMXy4iLCAxMCkgPT0gMCkKLSNkZWZpbmUgWFRPUl9TSVpFIDQKLQwKLQotLyogUGVyZm9ybSB0ZXh0IHNlZ21lbnQgZml4dXBzLiAgKi8KLQotc3RhdGljIHZvaWQKLXZtc19maXh1cF90ZXh0X3NlY3Rpb24gKHRleHRfc2l6LCB0ZXh0X2ZyYWdfcm9vdCwgZGF0YV9mcmFnX3Jvb3QpCi0gICAgIHVuc2lnbmVkIHRleHRfc2l6OwotICAgICBzdHJ1Y3QgZnJhZyAqdGV4dF9mcmFnX3Jvb3Q7Ci0gICAgIHN0cnVjdCBmcmFnICpkYXRhX2ZyYWdfcm9vdDsKLXsKLSAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICByZWdpc3RlciBzdHJ1Y3QgZml4ICpmaXhQOwotICBvZmZzZXRUIGRpZjsKLQotICAvKiBTY2FuIHRoZSB0ZXh0IGZyYWdtZW50cy4gICovCi0gIGZvciAoZnJhZ1AgPSB0ZXh0X2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCi0gICAgewotICAgICAgLyogU3RvcCBpZiB3ZSBnZXQgdG8gdGhlIGRhdGEgZnJhZ21lbnRzLiAgKi8KLSAgICAgIGlmIChmcmFnUCA9PSBkYXRhX2ZyYWdfcm9vdCkKLQlicmVhazsKLSAgICAgIC8qIElnbm9yZSBmcmFnbWVudHMgd2l0aCBubyBkYXRhLiAgKi8KLSAgICAgIGlmICgoZnJhZ1AtPmZyX2ZpeCA9PSAwKSAmJiAoZnJhZ1AtPmZyX3ZhciA9PSAwKSkKLQljb250aW51ZTsKLSAgICAgIC8qIEdvIHRoZSB0aGUgYXBwcm9wcmlhdGUgb2Zmc2V0IGluIHRoZSBUZXh0IFBzZWN0LiAgKi8KLSAgICAgIFZNU19TZXRfUHNlY3QgKFRleHRfUHNlY3QsIGZyYWdQLT5mcl9hZGRyZXNzLCBPQkpfU19DX1RJUik7Ci0gICAgICAvKiBTdG9yZSB0aGUgImZpeGVkIiBwYXJ0LiAgKi8KLSAgICAgIGlmIChmcmFnUC0+ZnJfZml4KQotCVZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoZnJhZ1AtPmZyX2xpdGVyYWwsCi0JCQkJICBmcmFnUC0+ZnJfZml4LAotCQkJCSAgT0JKX1NfQ19USVIpOwotICAgICAgLyogU3RvcmUgdGhlICJ2YXJpYWJsZSIgcGFydC4gICovCi0gICAgICBpZiAoZnJhZ1AtPmZyX3ZhciAmJiBmcmFnUC0+ZnJfb2Zmc2V0KQotCVZNU19TdG9yZV9SZXBlYXRlZF9EYXRhIChmcmFnUC0+ZnJfb2Zmc2V0LAotCQkJCSBmcmFnUC0+ZnJfbGl0ZXJhbCArIGZyYWdQLT5mcl9maXgsCi0JCQkJIGZyYWdQLT5mcl92YXIsCi0JCQkJIE9CSl9TX0NfVElSKTsKLSAgICB9CQkJLyogdGV4dCBmcmFnIGxvb3AgKi8KLQotICAvKgotICAgKglOb3cgd2UgZ28gdGhyb3VnaCB0aGUgdGV4dCBzZWdtZW50IGZpeHVwcyBhbmQgZ2VuZXJhdGUKLSAgICoJVElSIHJlY29yZHMgdG8gZml4IHVwIGFkZHJlc3NlcyB3aXRoaW4gdGhlIFRleHQgUHNlY3QuCi0gICAqLwotICBmb3IgKGZpeFAgPSB0ZXh0X2ZpeF9yb290OyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKLSAgICB7Ci0gICAgICAvKiBXZSBETyBoYW5kbGUgdGhlIGNhc2Ugb2YgIlN5bWJvbCAtIFN5bWJvbCIgYXMKLQkgbG9uZyBhcyBpdCBpcyBpbiB0aGUgc2FtZSBzZWdtZW50LiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9zdWJzeSAmJiBmaXhQLT5meF9hZGRzeSkKLQl7Ci0JICAvKiBUaGV5IG5lZWQgdG8gYmUgaW4gdGhlIHNhbWUgc2VnbWVudC4gICovCi0JICBpZiAoU19HRVRfUkFXX1RZUEUgKGZpeFAtPmZ4X3N1YnN5KSAhPQotCSAgICAgIFNfR0VUX1JBV19UWVBFIChmaXhQLT5meF9hZGRzeSkpCi0JICAgIGVycm9yIChfKCJGaXh1cCBkYXRhIGFkZHN5IGFuZCBzdWJzeSBkb24ndCBoYXZlIHRoZSBzYW1lIHR5cGUiKSk7Ci0JICAvKiBBbmQgdGhleSBuZWVkIHRvIGJlIGluIG9uZSB0aGF0IHdlIGNhbiBjaGVjayB0aGUgcHNlY3Qgb24uICAqLwotCSAgaWYgKChTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSkgIT0gTl9EQVRBKSAmJgotCQkgICAgKFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KSAhPSBOX1RFWFQpKQotCSAgICBlcnJvciAoXygiRml4dXAgZGF0YSBhZGRzeSBhbmQgc3Vic3kgZG9uJ3QgaGF2ZSBhbiBhcHByb3ByaWF0ZSB0eXBlIikpOwotCSAgLyogVGhpcyBoYWQgYmV0dGVyIG5vdCBiZSBQQyByZWxhdGl2ZSEgICovCi0JICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JICAgIGVycm9yIChfKCJGaXh1cCBkYXRhIGlzIGVycm9uZW91c2x5IFwicGNyZWxcIiIpKTsKLQkgIC8qIFN1YnRyYWN0IHRoZWlyIHZhbHVlcyB0byBnZXQgdGhlIGRpZmZlcmVuY2UuICAqLwotCSAgZGlmID0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KSAtIFNfR0VUX1ZBTFVFIChmaXhQLT5meF9zdWJzeSk7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKExvY2FsLCAodmFsdWVUKWRpZiwgZml4UC0+Znhfc2l6ZSk7Ci0JICAvKiBOb3cgZ2VuZXJhdGUgdGhlIGZpeHVwIG9iamVjdCByZWNvcmRzOwotCSAgICAgc2V0IHRoZSBwc2VjdCBhbmQgc3RvcmUgdGhlIGRhdGEuICAqLwotCSAgVk1TX1NldF9Qc2VjdCAoVGV4dF9Qc2VjdCwKLQkJCSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MsCi0JCQkgT0JKX1NfQ19USVIpOwotCSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwKLQkJCQkgICAgZml4UC0+Znhfc2l6ZSwKLQkJCQkgICAgT0JKX1NfQ19USVIpOwotCSAgY29udGludWU7CS8qIGRvbmUgd2l0aCB0aGlzIGZpeHVwICovCi0JICAgIH0JCS8qIGlmIGZ4X3N1YnN5ICYmIGZ4X2FkZHN5ICovCi0gICAgICAvKiBTaXplIHdpbGwgSEFWRSB0byBiZSAibG9uZyIuICAqLwotICAgICAgaWYgKGZpeFAtPmZ4X3NpemUgIT0gNCkKLQllcnJvciAoXygiRml4dXAgZGF0dW0gaXMgbm90IGEgbG9uZ3dvcmQiKSk7Ci0gICAgICAvKiBTeW1ib2wgbXVzdCBiZSAiYWRkZWQiIChpZiBpdCBpcyBldmVyCi0JIHN1YnRyYWN0ZWQgd2UgY2FuIGZpeCB0aGlzIGFzc3VtcHRpb24pLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9hZGRzeSA9PSAwKQotCWVycm9yIChfKCJGaXh1cCBkYXR1bSBpcyBub3QgXCJmaXhQLT5meF9hZGRzeVwiIikpOwotICAgICAgLyogU3RvcmUgdGhlIHN5bWJvbCB2YWx1ZSBpbiBhIFBJQyBmYXNoaW9uLiAgKi8KLSAgICAgIFZNU19TdG9yZV9QSUNfU3ltYm9sX1JlZmVyZW5jZSAoZml4UC0+ZnhfYWRkc3ksCi0JCQkJICAgICAgZml4UC0+Znhfb2Zmc2V0LAotCQkJCSAgICAgIGZpeFAtPmZ4X3BjcmVsLAotCQkJCSAgICAgIFRleHRfUHNlY3QsCi0JCQkJICAgIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcywKLQkJCQkgICAgICBPQkpfU19DX1RJUik7Ci0JICAvKgotCSAgICogIENoZWNrIGZvciBpbmRpcmVjdCBhZGRyZXNzIHJlZmVyZW5jZSwgd2hpY2ggaGFzIHRvIGJlIGZpeGVkIHVwCi0JICAgKiAgKGFzIHRoZSBsaW5rZXIgd2lsbCBzY3JldyBpdCB1cCB3aXRoIFRJUl9TX0NfU1RPX1BJQ1IpLi4uCi0JICAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCkKLQlWTVNfRml4X0luZGlyZWN0X1JlZmVyZW5jZSAoVGV4dF9Qc2VjdCwKLQkJCQkgICAgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzLAotCQkJCSAgICBmaXhQLT5meF9mcmFnLAotCQkJCSAgICB0ZXh0X2ZyYWdfcm9vdCk7Ci0gICAgfQkJCS8qIHRleHQgZml4IGxvb3AgKi8KLX0KLQwKLQotLyogQ3JlYXRlIGEgYnVmZmVyIGhvbGRpbmcgdGhlIGRhdGEgc2VnbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zeW50aGVzaXplX2RhdGFfc2VnbWVudCAoZGF0YV9zaXosIHRleHRfc2l6LCBkYXRhX2ZyYWdfcm9vdCkKLSAgICAgdW5zaWduZWQgZGF0YV9zaXosIHRleHRfc2l6OwotICAgICBzdHJ1Y3QgZnJhZyAqZGF0YV9mcmFnX3Jvb3Q7Ci17Ci0gIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgY2hhciAqZmlsbF9saXRlcmFsOwotICBsb25nIGZpbGxfc2l6ZSwgY291bnQsIGk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIGRhdGEgc2VnbWVudC4gICovCi0gIERhdGFfU2VnbWVudCA9IChjaGFyICopIHhtYWxsb2MgKGRhdGFfc2l6KTsKLSAgLyogUnVuIHRocm91Z2ggdGhlIGRhdGEgZnJhZ21lbnRzLCBmaWxsaW5nIGluIHRoZSBzZWdtZW50LiAgKi8KLSAgZm9yIChmcmFnUCA9IGRhdGFfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKLSAgICB7Ci0gICAgICBpID0gZnJhZ1AtPmZyX2FkZHJlc3MgLSB0ZXh0X3NpejsKLSAgICAgIGlmIChmcmFnUC0+ZnJfZml4KQotCW1lbWNweSAoRGF0YV9TZWdtZW50ICsgaSwgZnJhZ1AtPmZyX2xpdGVyYWwsIGZyYWdQLT5mcl9maXgpOwotICAgICAgaSArPSBmcmFnUC0+ZnJfZml4OwotCi0gICAgICBpZiAoKGZpbGxfc2l6ZSA9IGZyYWdQLT5mcl92YXIpICE9IDApCi0JewotCSAgZmlsbF9saXRlcmFsID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBmcmFnUC0+ZnJfZml4OwotCSAgZm9yIChjb3VudCA9IGZyYWdQLT5mcl9vZmZzZXQ7IGNvdW50OyBjb3VudC0tKQotCSAgICB7Ci0JICAgICAgbWVtY3B5IChEYXRhX1NlZ21lbnQgKyBpLCBmaWxsX2xpdGVyYWwsIGZpbGxfc2l6ZSk7Ci0JICAgICAgaSArPSBmaWxsX3NpemU7Ci0JICAgIH0KLQl9Ci0gICAgfQkJCS8qIGRhdGEgZnJhZyBsb29wICovCi0KLSAgcmV0dXJuOwotfQotCi0KLS8qIFBlcmZvcm0gZGF0YSBzZWdtZW50IGZpeHVwcy4gICovCi0KLXN0YXRpYyB2b2lkCi12bXNfZml4dXBfZGF0YV9zZWN0aW9uIChkYXRhX3NpeiwgdGV4dF9zaXopCi0gICAgIHVuc2lnbmVkIGRhdGFfc2l6LCB0ZXh0X3NpejsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IFZNU19TeW1ib2wgKnZzcDsKLSAgcmVnaXN0ZXIgc3RydWN0IGZpeCAqZml4UDsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3A7Ci0gIGFkZHJlc3NUIGZyX2FkZHJlc3M7Ci0gIG9mZnNldFQgZGlmOwotICB2YWx1ZVQgdmFsOwotCi0gIC8qIFJ1biB0aHJvdWdoIGFsbCB0aGUgZGF0YSBzeW1ib2xzIGFuZCBzdG9yZSB0aGUgZGF0YS4gICovCi0gIGZvciAodnNwID0gVk1TX1N5bWJvbHM7IHZzcDsgdnNwID0gdnNwLT5OZXh0KQotICAgIHsKLSAgICAgIC8qIElnbm9yZSBhbnl0aGluZyBvdGhlciB0aGFuIGRhdGEgc3ltYm9scy4gICovCi0gICAgICBpZiAoU19HRVRfVFlQRSAodnNwLT5TeW1ib2wpICE9IE5fREFUQSkKLQljb250aW51ZTsKLSAgICAgIC8qIFNldCB0aGUgUHNlY3QgKyBPZmZzZXQuICAqLwotICAgICAgVk1TX1NldF9Qc2VjdCAodnNwLT5Qc2VjdF9JbmRleCwKLQkJICAgICAgIHZzcC0+UHNlY3RfT2Zmc2V0LAotCQkgICAgICAgT0JKX1NfQ19USVIpOwotICAgICAgLyogU3RvcmUgdGhlIGRhdGEuICAqLwotICAgICAgdmFsID0gU19HRVRfVkFMVUUgKHZzcC0+U3ltYm9sKTsKLSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoRGF0YV9TZWdtZW50ICsgdmFsIC0gdGV4dF9zaXosCi0JCQkJdnNwLT5TaXplLAotCQkJCU9CSl9TX0NfVElSKTsKLSAgICB9CQkJLyogTl9EQVRBIHN5bWJvbCBsb29wICovCi0KLSAgLyoKLSAgICoJTm93IHdlIGdvIHRocm91Z2ggdGhlIGRhdGEgc2VnbWVudCBmaXh1cHMgYW5kIGdlbmVyYXRlCi0gICAqCVRJUiByZWNvcmRzIHRvIGZpeCB1cCBhZGRyZXNzZXMgd2l0aGluIHRoZSBEYXRhIFBzZWN0cy4KLSAgICovCi0gIGZvciAoZml4UCA9IGRhdGFfZml4X3Jvb3Q7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotICAgIHsKLSAgICAgIC8qIEZpbmQgdGhlIHN5bWJvbCBmb3IgdGhlIGNvbnRhaW5pbmcgZGF0dW0uICAqLwotICAgICAgZm9yICh2c3AgPSBWTVNfU3ltYm9sczsgdnNwOyB2c3AgPSB2c3AtPk5leHQpCi0JewotCSAgLyogT25seSBib3RoZXIgd2l0aCBEYXRhIHN5bWJvbHMuICAqLwotCSAgc3AgPSB2c3AtPlN5bWJvbDsKLQkgIGlmIChTX0dFVF9UWVBFIChzcCkgIT0gTl9EQVRBKQotCSAgICBjb250aW51ZTsKLQkgIC8qIElnbm9yZSBzeW1ib2wgaWYgQWZ0ZXIgZml4dXAuICAqLwotCSAgdmFsID0gU19HRVRfVkFMVUUgKHNwKTsKLQkgIGZyX2FkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotCSAgaWYgKHZhbCA+IGZpeFAtPmZ4X3doZXJlICsgZnJfYWRkcmVzcykKLQkgICAgY29udGludWU7Ci0JICAvKiBTZWUgaWYgdGhlIGRhdHVtIGlzIGhlcmUuICAqLwotCSAgaWYgKHZhbCArIHZzcC0+U2l6ZSA8PSBmaXhQLT5meF93aGVyZSArIGZyX2FkZHJlc3MpCi0JICAgIGNvbnRpbnVlOwotCSAgLyogV2UgRE8gaGFuZGxlIHRoZSBjYXNlIG9mICJTeW1ib2wgLSBTeW1ib2wiIGFzCi0JICAgICBsb25nIGFzIGl0IGlzIGluIHRoZSBzYW1lIHNlZ21lbnQuICAqLwotCSAgaWYgKGZpeFAtPmZ4X3N1YnN5ICYmIGZpeFAtPmZ4X2FkZHN5KQotCSAgICB7Ci0JICAgICAgLyogVGhleSBuZWVkIHRvIGJlIGluIHRoZSBzYW1lIHNlZ21lbnQuICAqLwotCSAgICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoZml4UC0+Znhfc3Vic3kpICE9Ci0JCSAgU19HRVRfUkFXX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KSkKLQkJZXJyb3IgKF8oIkZpeHVwIGRhdGEgYWRkc3kgYW5kIHN1YnN5IGRvbid0IGhhdmUgdGhlIHNhbWUgdHlwZSIpKTsKLQkgICAgICAvKiBBbmQgdGhleSBuZWVkIHRvIGJlIGluIG9uZSB0aGF0IHdlIGNhbiBjaGVjayB0aGUgcHNlY3Qgb24uICAqLwotCSAgICAgIGlmICgoU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpICE9IE5fREFUQSkgJiYKLQkJICAoU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpICE9IE5fVEVYVCkpCi0JCWVycm9yIChfKCJGaXh1cCBkYXRhIGFkZHN5IGFuZCBzdWJzeSBkb24ndCBoYXZlIGFuIGFwcHJvcHJpYXRlIHR5cGUiKSk7Ci0JICAgICAgLyogVGhpcyBoYWQgYmV0dGVyIG5vdCBiZSBQQyByZWxhdGl2ZSEgICovCi0JICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCQllcnJvciAoXygiRml4dXAgZGF0YSBpcyBlcnJvbmVvdXNseSBcInBjcmVsXCIiKSk7Ci0JICAgICAgLyogU3VidHJhY3QgdGhlaXIgdmFsdWVzIHRvIGdldCB0aGUgZGlmZmVyZW5jZS4gICovCi0JICAgICAgZGlmID0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KSAtIFNfR0VUX1ZBTFVFIChmaXhQLT5meF9zdWJzeSk7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChMb2NhbCwgKHZhbHVlVClkaWYsIGZpeFAtPmZ4X3NpemUpOwotCSAgICAgIC8qCi0JICAgICAgICogTm93IGdlbmVyYXRlIHRoZSBmaXh1cCBvYmplY3QgcmVjb3JkczsKLQkgICAgICAgKiBzZXQgdGhlIHBzZWN0IGFuZCBzdG9yZSB0aGUgZGF0YS4KLQkgICAgICAgKi8KLQkgICAgICBWTVNfU2V0X1BzZWN0ICh2c3AtPlBzZWN0X0luZGV4LAotCQkJICAgICBmcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUKLQkJCQkgLSB2YWwgKyB2c3AtPlBzZWN0X09mZnNldCwKLQkJCSAgICAgT0JKX1NfQ19USVIpOwotCSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsCi0JCQkJCWZpeFAtPmZ4X3NpemUsCi0JCQkJCU9CSl9TX0NfVElSKTsKLQkJICBicmVhazsJLyogZG9uZSB3aXRoIHRoaXMgZml4dXAgKi8KLQkJfQotCSAgLyogU2l6ZSB3aWxsIEhBVkUgdG8gYmUgImxvbmciLiAgKi8KLQkgIGlmIChmaXhQLT5meF9zaXplICE9IDQpCi0JICAgIGVycm9yIChfKCJGaXh1cCBkYXR1bSBpcyBub3QgYSBsb25nd29yZCIpKTsKLQkgIC8qIFN5bWJvbCBtdXN0IGJlICJhZGRlZCIgKGlmIGl0IGlzIGV2ZXIKLQkgICAgIHN1YnRyYWN0ZWQgd2UgY2FuIGZpeCB0aGlzIGFzc3VtcHRpb24pLiAgKi8KLQkgIGlmIChmaXhQLT5meF9hZGRzeSA9PSAwKQotCSAgICBlcnJvciAoXygiRml4dXAgZGF0dW0gaXMgbm90IFwiZml4UC0+ZnhfYWRkc3lcIiIpKTsKLQkgIC8qIFN0b3JlIHRoZSBzeW1ib2wgdmFsdWUgaW4gYSBQSUMgZmFzaGlvbi4gICovCi0JICBWTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UgKGZpeFAtPmZ4X2FkZHN5LAotCQkJCQkgIGZpeFAtPmZ4X29mZnNldCwKLQkJCQkJICBmaXhQLT5meF9wY3JlbCwKLQkJCQkJICB2c3AtPlBzZWN0X0luZGV4LAotCQkJCQkgIGZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZQotCQkJCQkgICAgICAtIHZhbCArIHZzcC0+UHNlY3RfT2Zmc2V0LAotCQkJCQkgIE9CSl9TX0NfVElSKTsKLQkgIC8qIERvbmUgd2l0aCB0aGlzIGZpeHVwLiAgKi8KLQkgIGJyZWFrOwotCX0JCS8qIHZtc19zeW1ib2wgbG9vcCAqLwotCi0gICAgfQkJCS8qIGRhdGEgZml4IGxvb3AgKi8KLX0KLQotLyogUGVyZm9ybSBjdG9ycy9kdG9ycyBzZWdtZW50IGZpeHVwcy4gICovCi0KLXN0YXRpYyB2b2lkCi12bXNfZml4dXBfeHRvcnNfc2VjdGlvbiAoc3ltYm9scywgc2VjdF9ubykKLQlzdHJ1Y3QgVk1TX1N5bWJvbCAqc3ltYm9sczsKLQlpbnQgc2VjdF9ubzsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IFZNU19TeW1ib2wgKnZzcDsKLQotICAvKiBSdW4gdGhyb3VnaCBhbGwgdGhlIHN5bWJvbHMgYW5kIHN0b3JlIHRoZSBkYXRhLiAgKi8KLSAgZm9yICh2c3AgPSBzeW1ib2xzOyB2c3A7IHZzcCA9IHZzcC0+TmV4dCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBzeW1ib2xTICpzcDsKLQotICAgICAgLyogU2V0IHJlbG9jYXRpb24gYmFzZS4gICovCi0gICAgICBWTVNfU2V0X1BzZWN0ICh2c3AtPlBzZWN0X0luZGV4LCB2c3AtPlBzZWN0X09mZnNldCwgT0JKX1NfQ19USVIpOwotCi0gICAgICBzcCA9IHZzcC0+U3ltYm9sOwotICAgICAgLyogU3RhY2sgdGhlIFBzZWN0IGJhc2Ugd2l0aCBpdHMgb2Zmc2V0LiAgKi8KLSAgICAgIFZNU19TZXRfRGF0YSAoVGV4dF9Qc2VjdCwgU19HRVRfVkFMVUUgKHNwKSwgT0JKX1NfQ19USVIsIDApOwotICAgIH0KLSAgLyogRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwuICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotCi0gIHJldHVybjsKLX0KLQwKLQotLyogRGVmaW5lIHN5bWJvbHMgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkgKHRleHRfc2l6LCBkYXRhX3NpeikKLSAgICAgdW5zaWduZWQgdGV4dF9zaXosIGRhdGFfc2l6OwotewotICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnNwOwotICByZWdpc3RlciBzdHJ1Y3QgVk1TX1N5bWJvbCAqdnNwOwotICBpbnQgR2xvYmFscmVmLCBkZWZpbmVfYXNfZ2xvYmFsX3N5bWJvbDsKLQotI2lmIDAKLSAgLyogVGhlIGcrKyBjb21waWxlciBkb2VzIG5vdCB3cml0ZSBvdXQgZXh0ZXJuYWwgcmVmZXJlbmNlcyB0bwotICAgICB2dGFibGVzIGNvcnJlY3RseS4gIENoZWNrIGZvciB0aGlzIGFuZCBob2xsZXIgaWYgd2Ugc2VlIGl0Ci0gICAgIGhhcHBlbmluZy4gIElmIHRoYXQgY29tcGlsZXIgYnVnIGlzIGV2ZXIgZml4ZWQgd2UgY2FuIHJlbW92ZQotICAgICB0aGlzLgotCi0gICAgIChKdW4nOTU6IGdjYyAyLjcuMCdzIGNjMXBsdXMgc3RpbGwgZXhoaWJpdHMgdGhpcyBiZWhhdmlvci4pCi0KLSAgICAgVGhpcyB3YXMgcmVwb3J0ZWRseSBmaXhlZCBhcyBvZiBKdW5lIDIsIDE5OTguICAgKi8KLQotICBmb3IgKHNwID0gc3ltYm9sX3Jvb3RQOyBzcDsgc3AgPSBzeW1ib2xfbmV4dCAoc3ApKQotICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoc3ApID09IE5fVU5ERiAmJiBJU19HWFhfVlRBQkxFIChzcCkpCi0gICAgICB7Ci0JU19TRVRfVFlQRSAoc3AsIE5fVU5ERiB8IE5fRVhUKTsKLQlTX1NFVF9PVEhFUiAoc3AsIDEpOwotCWFzX3dhcm4gKF8oImcrKyB3cm90ZSBhbiBleHRlcm4gcmVmZXJlbmNlIHRvIGAlcycgYXMgYSByb3V0aW5lLlxuSSB3aWxsIGZpeCBpdCwgYnV0IEkgaG9wZSB0aGF0IGl0IHdhcyBub3RlIHJlYWxseSBhIHJvdXRpbmUuIiksCi0JCSBTX0dFVF9OQU1FIChzcCkpOwotICAgICAgfQotI2VuZGlmCi0KLSAgLyoKLSAgICogTm93IHNjYW4gdGhlIHN5bWJvbHMgYW5kIGVtaXQgdGhlIGFwcHJvcHJpYXRlIEdTRCByZWNvcmRzCi0gICAqLwotICBmb3IgKHNwID0gc3ltYm9sX3Jvb3RQOyBzcDsgc3AgPSBzeW1ib2xfbmV4dCAoc3ApKQotICAgIHsKLSAgICAgIGRlZmluZV9hc19nbG9iYWxfc3ltYm9sID0gMDsKLSAgICAgIHZzcCA9IDA7Ci0gICAgICAvKiBEaXNwYXRjaCBvbiBzeW1ib2wgdHlwZS4gICovCi0gICAgICBzd2l0Y2ggKFNfR0VUX1JBV19UWVBFIChzcCkpCi0JewotCi0JLyogR2xvYmFsIHVuaW5pdGlhbGl6ZWQgZGF0YS4gICovCi0JY2FzZSBOX1VOREYgfCBOX0VYVDoKLQkgIC8qIE1ha2UgYSBWTVMgZGF0YSBzeW1ib2wgZW50cnkuICAqLwotCSAgdnNwID0gKHN0cnVjdCBWTVNfU3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAqdnNwKTsKLQkgIHZzcC0+U3ltYm9sID0gc3A7Ci0JICB2c3AtPlNpemUgPSBTX0dFVF9WQUxVRSAoc3ApOwotCSAgdnNwLT5Qc2VjdF9JbmRleCA9IFBzZWN0X051bWJlcisrOwotCSAgdnNwLT5Qc2VjdF9PZmZzZXQgPSAwOwotCSAgdnNwLT5OZXh0ID0gVk1TX1N5bWJvbHM7Ci0JICBWTVNfU3ltYm9scyA9IHZzcDsKLQkgIHNwLT5zeV9vYmogPSB2c3A7Ci0JICAvKiBNYWtlIHRoZSBwc2VjdCBmb3IgdGhpcyBkYXRhLiAgKi8KLQkgIEdsb2JhbHJlZiA9IFZNU19Qc2VjdF9TcGVjIChTX0dFVF9OQU1FIChzcCksCi0JCQkJICAgICAgdnNwLT5TaXplLAotCQkJCSAgICAgIFNfR0VUX09USEVSIChzcCkgPyBwc19DT05TVCA6IHBzX0NPTU1PTiwKLQkJCQkgICAgICB2c3ApOwotCSAgaWYgKEdsb2JhbHJlZikKLQkgICAgUHNlY3RfTnVtYmVyLS07Ci0jaWZkZWYJTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUKLQkgIGRlZmluZV9hc19nbG9iYWxfc3ltYm9sID0gMTsKLSNlbHNlCi0JICAvKiBTZWUgaWYgdGhpcyBpcyBhbiBleHRlcm5hbCB2dGFibGUuICBXZSB3YW50IHRvIGhlbHAgdGhlCi0JICAgICBsaW5rZXIgZmluZCB0aGVzZSB0aGluZ3MgaW4gbGlicmFyaWVzLCBzbyB3ZSBtYWtlIGEgc3ltYm9sCi0JICAgICByZWZlcmVuY2UuICBUaGlzIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggVkFYLUMgdXNhZ2UgZm9yCi0JICAgICB2YXJpYWJsZXMsIGJ1dCBzaW5jZSB2dGFibGVzIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseSBieQotCSAgICAgZysrLCB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCB0aGlzIGhhY2suICAqLwotCSAgZGVmaW5lX2FzX2dsb2JhbF9zeW1ib2wgPSBJU19HWFhfVlRBQkxFIChzcCk7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCi0JLyogTG9jYWwgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLQljYXNlIE5fQlNTOgotCSAgLyogTWFrZSBhIFZNUyBkYXRhIHN5bWJvbCBlbnRyeS4gICovCi0JICB2c3AgPSAoc3RydWN0IFZNU19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mICp2c3ApOwotCSAgdnNwLT5TeW1ib2wgPSBzcDsKLQkgIHZzcC0+U2l6ZSA9IDA7Ci0JICB2c3AtPlBzZWN0X0luZGV4ID0gQnNzX1BzZWN0OwotCSAgdnNwLT5Qc2VjdF9PZmZzZXQgPSBTX0dFVF9WQUxVRSAoc3ApIC0gYnNzX2FkZHJlc3NfZnJhZy5mcl9hZGRyZXNzOwotCSAgdnNwLT5OZXh0ID0gVk1TX1N5bWJvbHM7Ci0JICBWTVNfU3ltYm9scyA9IHZzcDsKLQkgIHNwLT5zeV9vYmogPSB2c3A7Ci0JICBicmVhazsKLQotCS8qIEdsb2JhbCBpbml0aWFsaXplZCBkYXRhLiAgKi8KLQljYXNlIE5fREFUQSB8IE5fRVhUOgotCSAgLyogTWFrZSBhIFZNUyBkYXRhIHN5bWJvbCBlbnRyeS4gICovCi0JICB2c3AgPSAoc3RydWN0IFZNU19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mICp2c3ApOwotCSAgdnNwLT5TeW1ib2wgPSBzcDsKLQkgIHZzcC0+U2l6ZSA9IFZNU19Jbml0aWFsaXplZF9EYXRhX1NpemUgKHNwLCB0ZXh0X3NpeiArIGRhdGFfc2l6KTsKLQkgIHZzcC0+UHNlY3RfSW5kZXggPSBQc2VjdF9OdW1iZXIrKzsKLQkgIHZzcC0+UHNlY3RfT2Zmc2V0ID0gMDsKLQkgIHZzcC0+TmV4dCA9IFZNU19TeW1ib2xzOwotCSAgVk1TX1N5bWJvbHMgPSB2c3A7Ci0JICBzcC0+c3lfb2JqID0gdnNwOwotCSAgLyogTWFrZSBpdHMgcHNlY3QuICAqLwotCSAgR2xvYmFscmVmID0gVk1TX1BzZWN0X1NwZWMgKFNfR0VUX05BTUUgKHNwKSwKLQkJCQkgICAgICB2c3AtPlNpemUsCi0JCQkJICAgICAgU19HRVRfT1RIRVIgKHNwKSA/IHBzX0NPTlNUIDogcHNfQ09NTU9OLAotCQkJCSAgICAgIHZzcCk7Ci0JICBpZiAoR2xvYmFscmVmKQotCSAgICBQc2VjdF9OdW1iZXItLTsKLSNpZmRlZglOT1RfVkFYXzExX0NfQ09NUEFUSUJMRQotCSAgZGVmaW5lX2FzX2dsb2JhbF9zeW1ib2wgPSAxOwotI2Vsc2UKLQkgIC8qIFNlZSBOX1VOREZ8Tl9FWFQgYWJvdmUgZm9yIGV4cGxhbmF0aW9uLiAgKi8KLQkgIGRlZmluZV9hc19nbG9iYWxfc3ltYm9sID0gSVNfR1hYX1ZUQUJMRSAoc3ApOwotI2VuZGlmCi0JICBicmVhazsKLQotCS8qIExvY2FsIGluaXRpYWxpemVkIGRhdGEuICAqLwotCWNhc2UgTl9EQVRBOgotCSAgewotCSAgICBjaGFyICpzeW1fbmFtZSA9IFNfR0VUX05BTUUgKHNwKTsKLQotCSAgICAvKiBBbHdheXMgc3VwcHJlc3MgbG9jYWwgbnVtZXJpYyBsYWJlbHMuICAqLwotCSAgICBpZiAoc3ltX25hbWUgJiYgc3RyY21wIChzeW1fbmFtZSwgRkFLRV9MQUJFTF9OQU1FKSA9PSAwKQotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIE1ha2UgYSBWTVMgZGF0YSBzeW1ib2wgZW50cnkuICAqLwotCSAgICB2c3AgPSAoc3RydWN0IFZNU19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mICp2c3ApOwotCSAgICB2c3AtPlN5bWJvbCA9IHNwOwotCSAgICB2c3AtPlNpemUgPSBWTVNfSW5pdGlhbGl6ZWRfRGF0YV9TaXplIChzcCwgdGV4dF9zaXogKyBkYXRhX3Npeik7Ci0JICAgIHZzcC0+UHNlY3RfSW5kZXggPSBEYXRhX1BzZWN0OwotCSAgICB2c3AtPlBzZWN0X09mZnNldCA9IExvY2FsX0luaXRkX0RhdGFfU2l6ZTsKLQkgICAgTG9jYWxfSW5pdGRfRGF0YV9TaXplICs9IHZzcC0+U2l6ZTsKLQkgICAgdnNwLT5OZXh0ID0gVk1TX1N5bWJvbHM7Ci0JICAgIFZNU19TeW1ib2xzID0gdnNwOwotCSAgICBzcC0+c3lfb2JqID0gdnNwOwotCSAgfQotCSAgYnJlYWs7Ci0KLQkvKiBHbG9iYWwgVGV4dCBkZWZpbml0aW9uLiAgKi8KLQljYXNlIE5fVEVYVCB8IE5fRVhUOgotCSAgewotCi0JICAgIGlmIChJU19HWFhfWFRPUiAoc3ApKQotCSAgICAgIHsKLQkJdnNwID0gKHN0cnVjdCBWTVNfU3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAqdnNwKTsKLQkJdnNwLT5TeW1ib2wgPSBzcDsKLQkJdnNwLT5TaXplID0gWFRPUl9TSVpFOwotCQlzcC0+c3lfb2JqID0gdnNwOwotCQlzd2l0Y2ggKChTX0dFVF9OQU1FIChzcCkpWzEwXSkKLQkJICB7Ci0JCSAgICBjYXNlICdJJzoKLQkJICAgICAgdnNwLT5Qc2VjdF9JbmRleCA9IEN0b3JzX1BzZWN0OwotCQkgICAgICB2c3AtPlBzZWN0X09mZnNldCA9IChDdG9yc19TeW1ib2xzPT0wKT8wOihDdG9yc19TeW1ib2xzLT5Qc2VjdF9PZmZzZXQrWFRPUl9TSVpFKTsKLQkJICAgICAgdnNwLT5OZXh0ID0gQ3RvcnNfU3ltYm9sczsKLQkJICAgICAgQ3RvcnNfU3ltYm9scyA9IHZzcDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdEJzoKLQkJICAgICAgdnNwLT5Qc2VjdF9JbmRleCA9IER0b3JzX1BzZWN0OwotCQkgICAgICB2c3AtPlBzZWN0X09mZnNldCA9IChEdG9yc19TeW1ib2xzPT0wKT8wOihEdG9yc19TeW1ib2xzLT5Qc2VjdF9PZmZzZXQrWFRPUl9TSVpFKTsKLQkJICAgICAgdnNwLT5OZXh0ID0gRHRvcnNfU3ltYm9sczsKLQkJICAgICAgRHRvcnNfU3ltYm9scyA9IHZzcDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdHJzoKLQkJICAgICAgYXNfd2FybiAoXygiQ2FuJ3QgaGFuZGxlIGdsb2JhbCB4dG9ycyBzeW1ib2xzIHlldC4iKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYXNfd2FybiAoXygiVW5rbm93biAlcyIpLCBTX0dFVF9OQU1FIChzcCkpOwotCQkgICAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQl1bnNpZ25lZCBzaG9ydCBFbnRyeV9NYXNrOwotCi0JCS8qIEdldCB0aGUgZW50cnkgbWFzay4gICovCi0JCWZyYWdQID0gc3AtPnN5X2ZyYWc7Ci0JCS8qIEZpcnN0IGZyYWcgbWlnaHQgYmUgZW1wdHkgaWYgd2UncmUgZ2VuZXJhdGluZyBsaXN0aW5ncy4KLQkJICAgU28gc2tpcCBlbXB0eSByc19maWxsIGZyYWdzLiAgKi8KLQkJd2hpbGUgKGZyYWdQICYmIGZyYWdQLT5mcl90eXBlID09IHJzX2ZpbGwgJiYgZnJhZ1AtPmZyX2ZpeCA9PSAwKQotCQkgIGZyYWdQID0gZnJhZ1AtPmZyX25leHQ7Ci0KLQkJLyogSWYgZmlyc3QgZnJhZyBkb2Vzbid0IGNvbnRhaW4gdGhlIGRhdGEsIHdoYXQgZG8gd2UgZG8/Ci0JCSAgIElmIGl0J3MgcG9zc2libHkgc21hbGxlciB0aGFuIHR3byBieXRlcywgdGhhdCB3b3VsZAotCQkgICBpbXBseSB0aGF0IHRoZSBlbnRyeSBtYXNrIGlzIG5vdCBzdG9yZWQgd2hlcmUgd2UncmUKLQkJICAgZXhwZWN0aW5nIGl0LgotCi0JCSAgIElmIHlvdSBjYW4gZmluZCBhIHRlc3QgY2FzZSB0aGF0IHRyaWdnZXJzIHRoaXMsIHJlcG9ydAotCQkgICBpdCAoYW5kIHRlbGwgbWUgd2hhdCB0aGUgZW50cnkgbWFzayBmaWVsZCBvdWdodCB0byBiZSksCi0JCSAgIGFuZCBJJ2xsIHRyeSB0byBmaXggaXQuICBLUiAqLwotCQlpZiAoZnJhZ1AtPmZyX2ZpeCA8IDIpCi0JCSAgYWJvcnQgKCk7Ci0KLQkJRW50cnlfTWFzayA9IChmcmFnUC0+ZnJfbGl0ZXJhbFswXSAmIDB4MDBmZikgfAotCQkJICAgICAoKGZyYWdQLT5mcl9saXRlcmFsWzFdICYgMHgwMGZmKSA8PCA4KTsKLQkJLyogRGVmaW5lIHRoZSBwcm9jZWR1cmUgZW50cnkgcG9pbnQuICAqLwotCQlWTVNfUHJvY2VkdXJlX0VudHJ5X1B0IChTX0dFVF9OQU1FIChzcCksCi0JCQkJICAgIFRleHRfUHNlY3QsCi0JCQkJICAgIFNfR0VUX1ZBTFVFIChzcCksCi0JCQkJICAgIEVudHJ5X01hc2spOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQkvKiBMb2NhbCBUZXh0IGRlZmluaXRpb24uICAqLwotCWNhc2UgTl9URVhUOgotCSAgLyogTWFrZSBhIFZNUyBkYXRhIHN5bWJvbCBlbnRyeS4gICovCi0JICBpZiAoVGV4dF9Qc2VjdCAhPSAtMSkKLQkgICAgewotCSAgICAgIHZzcCA9IChzdHJ1Y3QgVk1TX1N5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKnZzcCk7Ci0JICAgICAgdnNwLT5TeW1ib2wgPSBzcDsKLQkgICAgICB2c3AtPlNpemUgPSAwOwotCSAgICAgIHZzcC0+UHNlY3RfSW5kZXggPSBUZXh0X1BzZWN0OwotCSAgICAgIHZzcC0+UHNlY3RfT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHNwKTsKLQkgICAgICB2c3AtPk5leHQgPSBWTVNfU3ltYm9sczsKLQkgICAgICBWTVNfU3ltYm9scyA9IHZzcDsKLQkgICAgICBzcC0+c3lfb2JqID0gdnNwOwotCSAgICB9Ci0JICBicmVhazsKLQotCS8qIEdsb2JhbCBSZWZlcmVuY2UuICAqLwotCWNhc2UgTl9VTkRGOgotCSAgLyogTWFrZSBhIEdTRCBnbG9iYWwgc3ltYm9sIHJlZmVyZW5jZSByZWNvcmQuICAqLwotCSAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoU19HRVRfTkFNRSAoc3ApLAotCQkJCSAgMCwKLQkJCQkgIDAsCi0JCQkJICBHQkxTWU1fUkVGKTsKLQkgIGJyZWFrOwotCi0JLyogQWJzb2x1dGUgc3ltYm9sLiAgKi8KLQljYXNlIE5fQUJTOgotCWNhc2UgTl9BQlMgfCBOX0VYVDoKLQkgIC8qIGdjYyBkb2Vzbid0IGdlbmVyYXRlIHRoZXNlOwotCSAgICAgVk1TX0VtaXRfR2xvYmFsdmFsdWUgaGFuZGxlcyB0aGVtIHRob3VnaC4JKi8KLQkgIHZzcCA9IChzdHJ1Y3QgVk1TX1N5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKnZzcCk7Ci0JICB2c3AtPlN5bWJvbCA9IHNwOwotCSAgdnNwLT5TaXplID0gNDsJCS8qIGFsd2F5cyBhc3N1bWUgMzIgYml0cyAqLwotCSAgdnNwLT5Qc2VjdF9JbmRleCA9IDA7Ci0JICB2c3AtPlBzZWN0X09mZnNldCA9IFNfR0VUX1ZBTFVFIChzcCk7Ci0JICB2c3AtPk5leHQgPSBWTVNfU3ltYm9sczsKLQkgIFZNU19TeW1ib2xzID0gdnNwOwotCSAgc3AtPnN5X29iaiA9IHZzcDsKLQkgIGJyZWFrOwotCi0JLyogQW55dGhpbmcgZWxzZS4gICovCi0JZGVmYXVsdDoKLQkgIC8qIElnbm9yZSBTVEFCIHN5bWJvbHMsIGluY2x1ZGluZyAuc3RhYnMgZW1pdHRlZCBieSBnKysuICAqLwotCSAgaWYgKFNfSVNfREVCVUcgKHNwKSB8fCAoU19HRVRfVFlQRSAoc3ApID09IDIyKSkKLQkgICAgYnJlYWs7Ci0JICAvKgotCSAgICoJRXJyb3Igb3RoZXJ3aXNlLgotCSAgICovCi0JICBhc190c2t0c2sgKF8oInVuaGFuZGxlZCBzdGFiIHR5cGUgJWQiKSwgU19HRVRfVFlQRSAoc3ApKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogR2xvYmFsIHN5bWJvbHMgaGF2ZSBkaWZmZXJlbnQgbGlua2FnZSB0aGFuIGV4dGVybmFsIHZhcmlhYmxlcy4gICovCi0gICAgICBpZiAoZGVmaW5lX2FzX2dsb2JhbF9zeW1ib2wpCi0JVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoU19HRVRfTkFNRSAoc3ApLAotCQkJCXZzcC0+UHNlY3RfSW5kZXgsCi0JCQkJMCwKLQkJCQlHQkxTWU1fREVGKTsKLSAgICB9Ci0KLSAgcmV0dXJuOwotfQotDAotCi0vKiBPdXRwdXQgZGVidWdnZXIgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uIGZvciBzeW1ib2xzIHdoaWNoCi0gICBhcmUgbG9jYWwgdG8gYSBzcGVjaWZpYyByb3V0aW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLWxvY2FsX3N5bWJvbHNfRFNUIChzMFAsIEN1cnJlbnRfUm91dGluZSkKLSAgICAgc3ltYm9sUyAqczBQLCAqQ3VycmVudF9Sb3V0aW5lOwotewotICBzeW1ib2xTICpzMVA7Ci0gIGNoYXIgKnMwUF9uYW1lLCAqcG50MCwgKnBudDE7Ci0KLSAgczBQX25hbWUgPSBTX0dFVF9OQU1FIChzMFApOwotICBpZiAoKnMwUF9uYW1lKysgIT0gJ18nKQotICAgIHJldHVybjsKLQotICBmb3IgKHMxUCA9IEN1cnJlbnRfUm91dGluZTsgczFQOyBzMVAgPSBzeW1ib2xfbmV4dCAoczFQKSkKLSAgICB7Ci0jaWYgMAkJLyogcmVkdW5kYW50OyBSQVdfVFlQRSAhPSBOX0ZVTiBzdWZmaWNlcyAqLwotICAgICAgaWYgKCFTX0lTX0RFQlVHIChzMVApKQotCWNvbnRpbnVlOwotI2VuZGlmCi0gICAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHMxUCkgIT0gTl9GVU4pCi0JY29udGludWU7Ci0gICAgICBwbnQwID0gczBQX25hbWU7Ci0gICAgICBwbnQxID0gU19HRVRfTkFNRSAoczFQKTsKLSAgICAgIC8qIFdlIGFzc3VtZSB0aGUgdHdvIHN0cmluZ3MgYXJlIG5ldmVyIGV4YWN0bHkgZXF1YWwuLi4gICovCi0gICAgICB3aGlsZSAoKnBudDArKyA9PSAqcG50MSsrKQotCXsKLQl9Ci0gICAgICAvKiBGb3VuZCBpdCBpZiBzMFAgbmFtZSBpcyBleGhhdXN0ZWQgYW5kIHMxUCBuYW1lIGhhcyAiOkYiIG9yICI6ZiIgbmV4dC4KLQkgTm90ZTogIGJvdGggcG9pbnRlcnMgaGF2ZSBhZHZhbmNlZCBvbmUgcGFzdCB0aGUgbm9uLW1hdGNoaW5nIGNoYXIuICAqLwotICAgICAgaWYgKCgqcG50MSA9PSAnRicgfHwgKnBudDEgPT0gJ2YnKSAmJiAqLS1wbnQxID09ICc6JyAmJiAqLS1wbnQwID09ICdcMCcpCi0JewotCSAgRGVmaW5lX1JvdXRpbmUgKHMxUCwgMCwgQ3VycmVudF9Sb3V0aW5lLCBUZXh0X1BzZWN0KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0KLS8qIENvbnN0cnVjdCBhbmQgb3V0cHV0IHRoZSBkZWJ1ZyBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX2J1aWxkX0RTVCAodGV4dF9zaXopCi0gICAgIHVuc2lnbmVkIHRleHRfc2l6OwotewotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICBzeW1ib2xTICpDdXJyZW50X1JvdXRpbmUgPSAwOwotICBzdHJ1Y3QgaW5wdXRfZmlsZSAqQ3VyX0ZpbGUgPSAwOwotICBvZmZzZXRUIEN1cl9PZmZzZXQgPSAtMTsKLSAgaW50IEN1cl9MaW5lX051bWJlciA9IDA7Ci0gIGludCBGaWxlX051bWJlciA9IDA7Ci0gIGludCBEZWJ1Z2dlcl9PZmZzZXQgPSAwOwotICBpbnQgZmlsZV9hdmFpbGFibGU7Ci0gIGludCBkc2M7Ci0gIG9mZnNldFQgdmFsOwotCi0gIC8qIFdyaXRlIHRoZSBUcmFjZWJhY2sgQmVnaW4gTW9kdWxlIHJlY29yZC4gICovCi0gIFZNU19UQlRfTW9kdWxlX0JlZ2luICgpOwotCi0gIC8qCi0gICAqCU91dHB1dCBkZWJ1Z2dpbmcgaW5mbyBmb3IgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgc3RhdGljIHZhcmlhYmxlcwotICAgKgl0aGF0IGFyZSBub3Qgc3BlY2lmaWMgdG8gb25lIHJvdXRpbmUuICBXZSBhbHNvIG5lZWQgdG8gZXhhbWluZQotICAgKglhbGwgc3RhYnMgZGlyZWN0aXZlcywgdG8gZmluZCB0aGUgZGVmaW5pdGlvbnMgdG8gYWxsIG9mIHRoZQotICAgKglhZHZhbmNlZCBkYXRhIHR5cGVzLCBhbmQgdGhpcyBpcyBkb25lIGJ5IFZNU19MU1lNX1BhcnNlLiAgVGhpcwotICAgKgluZWVkcyB0byBiZSBkb25lIGJlZm9yZSBhbnkgZGVmaW5pdGlvbnMgYXJlIG91dHB1dCB0byB0aGUgb2JqZWN0Ci0gICAqCWZpbGUsIHNpbmNlIHRoZXJlIGNhbiBiZSBmb3J3YXJkIHJlZmVyZW5jZXMgaW4gdGhlIHN0YWJzCi0gICAqCWRpcmVjdGl2ZXMuICBXaGVuIHRocm91Z2ggd2l0aCBwYXJzaW5nLCB0aGUgdGV4dCBvZiB0aGUgc3RhYnMKLSAgICoJZGlyZWN0aXZlIGlzIGFsdGVyZWQsIHdpdGggdGhlIGRlZmluaXRpb25zIHJlbW92ZWQsIHNvIHRoYXQgbGF0ZXIKLSAgICoJcGFzc2VzIHdpbGwgc2VlIGRpcmVjdGl2ZXMgYXMgdGhleSB3b3VsZCBiZSB3cml0dGVuIGlmIHRoZSB0eXBlCi0gICAqCXdlcmUgYWxyZWFkeSBkZWZpbmVkLgotICAgKgotICAgKglXZSBhbHNvIGxvb2sgZm9yIGZpbGVzIGFuZCBpbmNsdWRlIGZpbGVzLCBhbmQgbWFrZSBhIGxpc3Qgb2YKLSAgICoJdGhlbS4gIFdlIGV4YW1pbmUgdGhlIHNvdXJjZSBmaWxlIG51bWJlcnMgdG8gZXN0YWJsaXNoIHRoZSBhY3R1YWwKLSAgICoJbGluZXMgdGhhdCBjb2RlIHdhcyBnZW5lcmF0ZWQgZnJvbSwgYW5kIHRoZW4gZ2VuZXJhdGUgb2Zmc2V0cy4KLSAgICovCi0gIFZNU19MU1lNX1BhcnNlICgpOwotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgLyogT25seSBkZWFsIHdpdGggU1RBQiBzeW1ib2xzIGhlcmUuICAqLwotICAgICAgaWYgKCFTX0lTX0RFQlVHIChzeW1ib2xQKSkKLQljb250aW51ZTsKLSAgICAgIC8qCi0gICAgICAgKglEaXNwYXRjaCBvbiBTVEFCIHR5cGUuCi0gICAgICAgKi8KLSAgICAgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHN5bWJvbFApKQotCXsKLQljYXNlIE5fU0xJTkU6Ci0JICBkc2MgPSBTX0dFVF9ERVNDIChzeW1ib2xQKTsKLQkgIGlmIChkc2MgPiBDdXJfRmlsZS0+bWF4X2xpbmUpCi0JICAgIEN1cl9GaWxlLT5tYXhfbGluZSA9IGRzYzsKLQkgIGlmIChkc2MgPCBDdXJfRmlsZS0+bWluX2xpbmUpCi0JICAgIEN1cl9GaWxlLT5taW5fbGluZSA9IGRzYzsKLQkgIGJyZWFrOwotCWNhc2UgTl9TTzoKLQkgIEN1cl9GaWxlID0gZmluZF9maWxlIChzeW1ib2xQKTsKLQkgIEN1cl9GaWxlLT5mbGFnID0gMTsKLQkgIEN1cl9GaWxlLT5taW5fbGluZSA9IDE7Ci0JICBicmVhazsKLQljYXNlIE5fU09MOgotCSAgQ3VyX0ZpbGUgPSBmaW5kX2ZpbGUgKHN5bWJvbFApOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0dTWU06Ci0JICBWTVNfR1NZTV9QYXJzZSAoc3ltYm9sUCwgVGV4dF9Qc2VjdCk7Ci0JICBicmVhazsKLQljYXNlIE5fTENTWU06Ci0JICBWTVNfTENTWU1fUGFyc2UgKHN5bWJvbFAsIFRleHRfUHNlY3QpOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0ZVTjoJCS8qIEZvciBzdGF0aWMgY29uc3RhbnQgc3ltYm9scyAqLwotCWNhc2UgTl9TVFNZTToKLQkgIFZNU19TVFNZTV9QYXJzZSAoc3ltYm9sUCwgVGV4dF9Qc2VjdCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQkJLyogc3dpdGNoICovCi0gICAgfQkJCS8qIGZvciAqLwotCi0gIC8qCi0gICAqCU5vdyB3ZSB0YWtlIGEgcXVpY2sgc3dlZXAgdGhyb3VnaCB0aGUgZmlsZXMgYW5kIGFzc2lnbiBvZmZzZXRzCi0gICAqCXRvIGVhY2ggb25lLiAgVGhpcyB3aWxsIGVzc2VudGlhbGx5IGJlIHRoZSBzdGFydGluZyBsaW5lIG51bWJlciB0bwotICAgKgl0aGUgZGVidWdnZXIgZm9yIGVhY2ggZmlsZS4gIE91dHB1dCB0aGUgaW5mbyBmb3IgdGhlIGRlYnVnZ2VyIHRvCi0gICAqCXNwZWNpZnkgdGhlIGZpbGVzLCBhbmQgdGhlbiB0ZWxsIGl0IGhvdyBtYW55IGxpbmVzIHRvIHVzZS4KLSAgICovCi0gIGZvciAoQ3VyX0ZpbGUgPSBmaWxlX3Jvb3Q7IEN1cl9GaWxlOyBDdXJfRmlsZSA9IEN1cl9GaWxlLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChDdXJfRmlsZS0+bWF4X2xpbmUgPT0gMCkKLQljb250aW51ZTsKLSAgICAgIGlmICgoc3RybmNtcCAoQ3VyX0ZpbGUtPm5hbWUsICJHTlVfR1hYX0lOQ0xVREU6IiwgMTYpID09IDApICYmCi0JICAhZmxhZ19kZWJ1ZykKLQljb250aW51ZTsKLSAgICAgIGlmICgoc3RybmNtcCAoQ3VyX0ZpbGUtPm5hbWUsICJHTlVfQ0NfSU5DTFVERToiLCAxNSkgPT0gMCkgJiYKLQkgICFmbGFnX2RlYnVnKQotCWNvbnRpbnVlOwotICAgICAgLyogc2hvdyBhIGZldyBleHRyYSBsaW5lcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lvbiBzZWxlY3RlZCAqLwotICAgICAgaWYgKEN1cl9GaWxlLT5taW5fbGluZSA+IDIpCi0JQ3VyX0ZpbGUtPm1pbl9saW5lIC09IDI7Ci0gICAgICBDdXJfRmlsZS0+b2Zmc2V0ID0gRGVidWdnZXJfT2Zmc2V0IC0gQ3VyX0ZpbGUtPm1pbl9saW5lICsgMTsKLSAgICAgIERlYnVnZ2VyX09mZnNldCArPSBDdXJfRmlsZS0+bWF4X2xpbmUgLSBDdXJfRmlsZS0+bWluX2xpbmUgKyAxOwotICAgICAgaWYgKEN1cl9GaWxlLT5zYW1lX2ZpbGVfZnBudCkKLQl7Ci0JICBDdXJfRmlsZS0+ZmlsZV9udW1iZXIgPSBDdXJfRmlsZS0+c2FtZV9maWxlX2ZwbnQtPmZpbGVfbnVtYmVyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBDdXJfRmlsZS0+ZmlsZV9udW1iZXIgPSArK0ZpbGVfTnVtYmVyOwotCSAgZmlsZV9hdmFpbGFibGUgPSBWTVNfVEJUX1NvdXJjZV9GaWxlIChDdXJfRmlsZS0+bmFtZSwKLQkJCQkJCUN1cl9GaWxlLT5maWxlX251bWJlcik7Ci0JICBpZiAoIWZpbGVfYXZhaWxhYmxlKQotCSAgICB7Ci0JICAgICAgQ3VyX0ZpbGUtPmZpbGVfbnVtYmVyID0gMDsKLQkgICAgICBGaWxlX051bWJlci0tOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotICAgICAgVk1TX1RCVF9Tb3VyY2VfTGluZXMgKEN1cl9GaWxlLT5maWxlX251bWJlciwKLQkJCSAgICBDdXJfRmlsZS0+bWluX2xpbmUsCi0JCQkgICAgQ3VyX0ZpbGUtPm1heF9saW5lIC0gQ3VyX0ZpbGUtPm1pbl9saW5lICsgMSk7Ci0gIH0JCQkvKiBmb3IgKi8KLSAgQ3VyX0ZpbGUgPSAoc3RydWN0IGlucHV0X2ZpbGUgKikgTlVMTDsKLQotICAvKgotICAgKglTY2FuIHRoZSBzeW1ib2xzIGFuZCB3cml0ZSBvdXQgdGhlIHJvdXRpbmVzCi0gICAqCSh0aGlzIG1ha2VzIHRoZSBhc3N1bXB0aW9uIHRoYXQgc3ltYm9scyBhcmUgaW4KLSAgICoJIG9yZGVyIG9mIGFzY2VuZGluZyB0ZXh0IHNlZ21lbnQgb2Zmc2V0KQotICAgKi8KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKglEZWFsIHdpdGggdGV4dCBzeW1ib2xzLgotICAgICAgICovCi0gICAgICBpZiAoIVNfSVNfREVCVUcgKHN5bWJvbFApICYmIFNfR0VUX1RZUEUgKHN5bWJvbFApID09IE5fVEVYVCkKLQl7Ci0JICAvKgotCSAgICogSWdub3JlIHN5bWJvbHMgc3RhcnRpbmcgd2l0aCAiTCIsIGFzIHRoZXkgYXJlIGxvY2FsIHN5bWJvbHMuCi0JICAgKi8KLQkgIGlmICgqU19HRVRfTkFNRSAoc3ltYm9sUCkgPT0gJ0wnKQotCSAgICBjb250aW51ZTsKLQkgIC8qCi0JICAgKiBJZiB0aGVyZSBpcyBhIHJvdXRpbmUgc3RhcnQgZGVmaW5lZCwgdGVybWluYXRlIGl0LgotCSAgICovCi0JICBpZiAoQ3VycmVudF9Sb3V0aW5lKQotCSAgICBWTVNfVEJUX1JvdXRpbmVfRW5kICh0ZXh0X3NpeiwgQ3VycmVudF9Sb3V0aW5lKTsKLQotCSAgLyoKLQkgICAqIENoZWNrIGZvciAmIHNraXAgZHVtbXkgbGFiZWxzIGxpa2UgImdjY19jb21waWxlZC4iLgotCSAgICogVGhleSdyZSBpZGVudGlmaWVkIGJ5IHRoZSBJTl9ERUZBVUxUX1NFQ1RJT04gZmxhZy4KLQkgICAqLwotCSAgaWYgKChTX0dFVF9PVEhFUiAoc3ltYm9sUCkgJiBJTl9ERUZBVUxUX1NFQ1RJT04pICE9IDAgJiYKLQkgICAgICBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgPT0gMCkKLQkgICAgY29udGludWU7Ci0JICAvKgotCSAgICogU3RvcmUgdGhlIHJvdXRpbmUgYmVnaW4gdHJhY2ViYWNrIGluZm8uCi0JICAgKi8KLQkgIFZNU19UQlRfUm91dGluZV9CZWdpbiAoc3ltYm9sUCwgVGV4dF9Qc2VjdCk7Ci0JICBDdXJyZW50X1JvdXRpbmUgPSBzeW1ib2xQOwotCSAgLyoKLQkgICAqIERlZmluZSBzeW1ib2xzIGxvY2FsIHRvIHRoaXMgcm91dGluZS4KLQkgICAqLwotCSAgbG9jYWxfc3ltYm9sc19EU1QgKHN5bWJvbFAsIEN1cnJlbnRfUm91dGluZSk7Ci0JICAvKgotCSAgICoJRG9uZQotCSAgICovCi0JICBjb250aW51ZTsKLQotCX0KLSAgICAgIC8qCi0gICAgICAgKglEZWFsIHdpdGggU1RBQiBzeW1ib2xzLgotICAgICAgICovCi0gICAgICBlbHNlIGlmIChTX0lTX0RFQlVHIChzeW1ib2xQKSkKLQl7Ci0JICAvKgotCSAgICogIERpc3BhdGNoIG9uIFNUQUIgdHlwZS4KLQkgICAqLwotCSAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoc3ltYm9sUCkpCi0JICAgIHsKLQkJLyoKLQkJICoJTGluZSBudW1iZXIKLQkJICovCi0JICAgIGNhc2UgTl9TTElORToKLQkgICAgICAvKiBPZmZzZXQgdGhlIGxpbmUgaW50byB0aGUgY29ycmVjdCBwb3J0aW9uIG9mIHRoZSBmaWxlLiAgKi8KLQkgICAgICBpZiAoQ3VyX0ZpbGUtPmZpbGVfbnVtYmVyID09IDApCi0JCWJyZWFrOwotCSAgICAgIHZhbCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLQkgICAgICAvKiBTb21ldGltZXMgdGhlIHNhbWUgb2Zmc2V0IGdldHMgc2V2ZXJhbCBzb3VyY2UgbGluZXMKLQkJIGFzc2lnbmVkIHRvIGl0LiAgV2Ugc2hvdWxkIGJlIHNlbGVjdGl2ZSBhYm91dCB3aGljaAotCQkgbGluZXMgd2UgYWxsb3csIHdlIHNob3VsZCBwcmVmZXIgbGluZXMgdGhhdCBhcmUgaW4KLQkJIHRoZSBtYWluIHNvdXJjZSBmaWxlIHdoZW4gZGVidWdnaW5nIGlubGluZSBmdW5jdGlvbnMuICAqLwotCSAgICAgIGlmICh2YWwgPT0gQ3VyX09mZnNldCAmJiBDdXJfRmlsZS0+ZmlsZV9udW1iZXIgIT0gMSkKLQkJYnJlYWs7Ci0KLQkgICAgICAvKiBjYWxjdWxhdGUgYWN0dWFsIGRlYnVnZ2VyIHNvdXJjZSBsaW5lICovCi0JICAgICAgZHNjID0gU19HRVRfREVTQyAoc3ltYm9sUCkgKyBDdXJfRmlsZS0+b2Zmc2V0OwotCSAgICAgIFNfU0VUX0RFU0MgKHN5bWJvbFAsIGRzYyk7Ci0JICAgICAgLyoKLQkgICAgICAgKiBEZWZpbmUgUEMvTGluZSBjb3JyZWxhdGlvbi4KLQkgICAgICAgKi8KLQkgICAgICBpZiAoQ3VyX09mZnNldCA9PSAtMSkKLQkJewotCQkgIC8qCi0JCSAgICogRmlyc3QgTl9TTElORTsgc2V0IHVwIGluaXRpYWwgY29ycmVsYXRpb24uCi0JCSAgICovCi0JCSAgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uIChkc2MsCi0JCQkJCSAgICAgICB2YWwsCi0JCQkJCSAgICAgICBUZXh0X1BzZWN0LAotCQkJCQkgICAgICAgMCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoZHNjIC0gQ3VyX0xpbmVfTnVtYmVyKSA8PSAwKQotCQl7Ci0JCSAgLyoKLQkJICAgKiBMaW5lIGRlbHRhIGlzIG5vdCArdmUsIHdlIG5lZWQgdG8gY2xvc2UgdGhlIGxpbmUgYW5kCi0JCSAgICogc3RhcnQgYSBuZXcgUEMvTGluZSBjb3JyZWxhdGlvbi4KLQkJICAgKi8KLQkJICBWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24gKDAsCi0JCQkJCSAgICAgICB2YWwgLSBDdXJfT2Zmc2V0LAotCQkJCQkgICAgICAgMCwKLQkJCQkJICAgICAgIC0xKTsKLQkJICBWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24gKGRzYywKLQkJCQkJICAgICAgIHZhbCwKLQkJCQkJICAgICAgIFRleHRfUHNlY3QsCi0JCQkJCSAgICAgICAwKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qCi0JCSAgICogTGluZSBkZWx0YSBpcyArdmUsIGFsbCBpcyB3ZWxsLgotCQkgICAqLwotCQkgIFZNU19UQlRfTGluZV9QQ19Db3JyZWxhdGlvbiAoZHNjIC0gQ3VyX0xpbmVfTnVtYmVyLAotCQkJCQkgICAgICAgdmFsIC0gQ3VyX09mZnNldCwKLQkJCQkJICAgICAgIDAsCi0JCQkJCSAgICAgICAxKTsKLQkJfQotCSAgICAgIC8qIFVwZGF0ZSB0aGUgY3VycmVudCBsaW5lL1BDIGluZm8uICAqLwotCSAgICAgIEN1cl9MaW5lX051bWJlciA9IGRzYzsKLQkgICAgICBDdXJfT2Zmc2V0ID0gdmFsOwotCSAgICAgIGJyZWFrOwotCi0JCS8qCi0JCSAqCVNvdXJjZSBmaWxlCi0JCSAqLwotCSAgICBjYXNlIE5fU086Ci0JICAgICAgLyogUmVtZW1iZXIgdGhhdCB3ZSBoYWQgYSBzb3VyY2UgZmlsZSBhbmQgZW1pdAotCQkgdGhlIHNvdXJjZSBmaWxlIGRlYnVnZ2VyIHJlY29yZC4gICovCi0JICAgICAgQ3VyX0ZpbGUgPSBmaW5kX2ZpbGUgKHN5bWJvbFApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTl9TT0w6Ci0JICAgICAgLyogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgcmVhbGx5IGluIHRoZSBhY3R1YWwKLQkJIHNvdXJjZSBmaWxlIHdoZW4gd2UgY29tcHV0ZSB0aGUgbWF4aW11bSBsaW5lIG51bWJlci4KLQkJIE90aGVyd2lzZSB0aGUgZGVidWdnZXIgZ2V0cyByZWFsbHkgY29uZnVzZWQuICAqLwotCSAgICAgIEN1cl9GaWxlID0gZmluZF9maWxlIChzeW1ib2xQKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9CQkvKiBzd2l0Y2ggKi8KLQl9CQkvKiBpZiAoSVNfREVCVUcpICovCi0gICAgfQkJCS8qIGZvciAqLwotCi0gICAgLyoKLSAgICAgKiBJZiB0aGVyZSBpcyBhIHJvdXRpbmUgc3RhcnQgZGVmaW5lZCwgdGVybWluYXRlIGl0Ci0gICAgICogKGFuZCB0aGUgbGluZSBudW1iZXJzKS4KLSAgICAgKi8KLSAgICBpZiAoQ3VycmVudF9Sb3V0aW5lKQotICAgICAgewotCS8qIFRlcm1pbmF0ZSB0aGUgbGluZSBudW1iZXJzLiAgKi8KLQlWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24gKDAsCi0JCQkJICAgICB0ZXh0X3NpeiAtIFNfR0VUX1ZBTFVFIChDdXJyZW50X1JvdXRpbmUpLAotCQkJCSAgICAgMCwKLQkJCQkgICAgIC0xKTsKLQkvKiBUZXJtaW5hdGUgdGhlIHJvdXRpbmUuICAqLwotCVZNU19UQlRfUm91dGluZV9FbmQgKHRleHRfc2l6LCBDdXJyZW50X1JvdXRpbmUpOwotICAgICAgfQotCi0gIC8qIFdyaXRlIHRoZSBUcmFjZWJhY2sgRW5kIE1vZHVsZSBUQlQgcmVjb3JkLiAgKi8KLSAgVk1TX1RCVF9Nb2R1bGVfRW5kICgpOwotfQotDAotCi0vKiBXcml0ZSBhIFZBWC9WTVMgb2JqZWN0IGZpbGUgKGV2ZXJ5dGhpbmcgZWxzZSBoYXMgYmVlbiBkb25lISkuICAqLwotCi12b2lkCi12bXNfd3JpdGVfb2JqZWN0X2ZpbGUgKHRleHRfc2l6LCBkYXRhX3NpeiwgYnNzX3NpeiwgdGV4dF9mcmFnX3Jvb3QsCi0JCSAgICAgICBkYXRhX2ZyYWdfcm9vdCkKLSAgICAgdW5zaWduZWQgdGV4dF9zaXo7Ci0gICAgIHVuc2lnbmVkIGRhdGFfc2l6OwotICAgICB1bnNpZ25lZCBic3Nfc2l6OwotICAgICBmcmFnUyAqdGV4dF9mcmFnX3Jvb3Q7Ci0gICAgIGZyYWdTICpkYXRhX2ZyYWdfcm9vdDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IFZNU19TeW1ib2wgKnZzcDsKLQotICAvKgotICAgKiBJbml0aWFsaXplIHByb2dyYW0gc2VjdGlvbiBpbmRpY2VzOyB2YWx1ZXMgZ2V0IHVwZGF0ZWQgbGF0ZXIuCi0gICAqLwotICBQc2VjdF9OdW1iZXIgPSAwOwkJLyogbmV4dCBQc2VjdCBJbmRleCB0byB1c2UgKi8KLSAgVGV4dF9Qc2VjdCA9IC0xOwkJLyogVGV4dCBQc2VjdCBJbmRleCAgICovCi0gIERhdGFfUHNlY3QgPSAtMjsJCS8qIERhdGEgUHNlY3QgSW5kZXggICBKRjogV2FzIC0xICovCi0gIEJzc19Qc2VjdCA9IC0zOwkJLyogQnNzIFBzZWN0IEluZGV4ICAgIEpGOiBXYXMgLTEgKi8KLSAgQ3RvcnNfUHNlY3QgPSAtNDsJCS8qIEN0b3JzIFBzZWN0IEluZGV4ICAqLwotICBEdG9yc19Qc2VjdCA9IC01OwkJLyogRHRvcnMgUHNlY3QgSW5kZXggICovCi0gIC8qIEluaXRpYWxpemUgb3RoZXIgc3RhdGUgdmFyaWFibGVzLiAgKi8KLSAgRGF0YV9TZWdtZW50ID0gMDsKLSAgTG9jYWxfSW5pdGRfRGF0YV9TaXplID0gMDsKLQotICAvKgotICAgKglDcmVhdGUgdGhlIGFjdHVhbCBvdXRwdXQgZmlsZSBhbmQgcG9wdWxhdGUgaXQgd2l0aCByZXF1aXJlZAotICAgKgkibW9kdWxlIGhlYWRlciIgaW5mb3JtYXRpb24uCi0gICAqLwotICBDcmVhdGVfVk1TX09iamVjdF9GaWxlICgpOwotICBXcml0ZV9WTVNfTUhEX1JlY29yZHMgKCk7Ci0KLSAgLyoKLSAgICoJQ3JlYXRlIHRoZSBEYXRhIHNlZ21lbnQ6Ci0gICAqCi0gICAqCVNpbmNlIHRoaXMgaXMgUkVBTExZIGhhcmQgdG8gZG8gYW55IG90aGVyIHdheSwKLSAgICoJd2UgYWN0dWFsbHkgbWFudWZhY3R1cmUgdGhlIGRhdGEgc2VnbWVudCBhbmQKLSAgICoJdGhlbiBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzIG91dCBvZiBpdC4KLSAgICoJV2UgbmVlZCB0byBnZW5lcmF0ZSB0aGlzIGVhcmx5LCBzbyB0aGF0IGdsb2JhbHZhbHVlcwotICAgKgljYW4gYmUgcHJvcGVybHkgZW1pdHRlZC4KLSAgICovCi0gIGlmIChkYXRhX3NpeiA+IDApCi0gICAgc3ludGhlc2l6ZV9kYXRhX3NlZ21lbnQgKGRhdGFfc2l6LCB0ZXh0X3NpeiwgZGF0YV9mcmFnX3Jvb3QpOwotCi0KLSAgLyoqKioqKiogIEdsb2JhbCBTeW1ib2wgRGlyZWN0b3J5ICAqKioqKioqLwotCi0gIC8qCi0gICAqCUVtaXQgZ2xvYmFsdmFsdWVzIG5vdy4gIFdlIG11c3QgZG8gdGhpcyBiZWZvcmUgdGhlIHRleHQgcHNlY3QgaXMKLSAgICoJZGVmaW5lZCwgb3Igd2Ugd2lsbCBnZXQgbGlua2VyIHdhcm5pbmdzIGFib3V0IG11bHRpcGx5IGRlZmluZWQKLSAgICoJc3ltYm9scy4gIEFsbCBvZiB0aGUgZ2xvYmFsdmFsdWVzICJyZWZlcmVuY2UiIHBzZWN0IDAsIGFsdGhvdWdoCi0gICAqCWl0IHJlYWxseSBkb2VzIG5vdCBoYXZlIGFueXRoaW5nIHRvIGRvIHdpdGggaXQuCi0gICAqLwotICBWTVNfRW1pdF9HbG9iYWx2YWx1ZXMgKHRleHRfc2l6LCBkYXRhX3NpeiwgRGF0YV9TZWdtZW50KTsKLSAgLyoKLSAgICoJRGVmaW5lIHRoZSBUZXh0IFBzZWN0Ci0gICAqLwotICBUZXh0X1BzZWN0ID0gUHNlY3RfTnVtYmVyKys7Ci0gIFZNU19Qc2VjdF9TcGVjICgiJGNvZGUiLCB0ZXh0X3NpeiwgcHNfVEVYVCwgMCk7Ci0gIC8qCi0gICAqCURlZmluZSB0aGUgQlNTIFBzZWN0Ci0gICAqLwotICBpZiAoYnNzX3NpeiA+IDApCi0gICAgewotICAgICAgQnNzX1BzZWN0ID0gUHNlY3RfTnVtYmVyKys7Ci0gICAgICBWTVNfUHNlY3RfU3BlYyAoIiR1bmluaXRpYWxpemVkX2RhdGEiLCBic3Nfc2l6LCBwc19EQVRBLCAwKTsKLSAgICB9Ci0gIC8qCi0gICAqIERlZmluZSBzeW1ib2xzIHRvIHRoZSBsaW5rZXIuCi0gICAqLwotICBnbG9iYWxfc3ltYm9sX2RpcmVjdG9yeSAodGV4dF9zaXosIGRhdGFfc2l6KTsKLSAgLyoKLSAgICoJRGVmaW5lIHRoZSBEYXRhIFBzZWN0Ci0gICAqLwotICBpZiAoZGF0YV9zaXogPiAwICYmIExvY2FsX0luaXRkX0RhdGFfU2l6ZSA+IDApCi0gICAgewotICAgICAgRGF0YV9Qc2VjdCA9IFBzZWN0X051bWJlcisrOwotICAgICAgVk1TX1BzZWN0X1NwZWMgKCIkZGF0YSIsIExvY2FsX0luaXRkX0RhdGFfU2l6ZSwgcHNfREFUQSwgMCk7Ci0gICAgICAvKgotICAgICAgICogTG9jYWwgaW5pdGlhbGl6ZWQgZGF0YSAoTl9EQVRBKSBzeW1ib2xzIG5lZWQgdG8gYmUgdXBkYXRlZCB0byB0aGUKLSAgICAgICAqIHByb3BlciB2YWx1ZSBvZiBEYXRhX1BzZWN0IG5vdyB0aGF0IGl0J3MgYWN0dWFsbHkgYmVlbiBkZWZpbmVkLgotICAgICAgICogKEEgZHVtbXkgdmFsdWUgd2FzIHVzZWQgaW4gZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkoKSBhYm92ZS4pCi0gICAgICAgKi8KLSAgICAgIGZvciAodnNwID0gVk1TX1N5bWJvbHM7IHZzcDsgdnNwID0gdnNwLT5OZXh0KQotCWlmICh2c3AtPlBzZWN0X0luZGV4IDwgMCAmJiBTX0dFVF9SQVdfVFlQRSAodnNwLT5TeW1ib2wpID09IE5fREFUQSkKLQkgIHZzcC0+UHNlY3RfSW5kZXggPSBEYXRhX1BzZWN0OwotICAgIH0KLQotCi0gIGlmIChDdG9yc19TeW1ib2xzICE9IDApCi0gICAgewotICAgICAgY2hhciAqcHNfbmFtZSA9ICIkY3RvcnMiOwotICAgICAgQ3RvcnNfUHNlY3QgPSBQc2VjdF9OdW1iZXIrKzsKLSAgICAgIFZNU19Qc2VjdF9TcGVjIChwc19uYW1lLCBDdG9yc19TeW1ib2xzLT5Qc2VjdF9PZmZzZXQgKyBYVE9SX1NJWkUsCi0JCSAgICAgIHBzX0NUT1JTLCAwKTsKLSAgICAgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKHBzX25hbWUsIEN0b3JzX1BzZWN0LAotCQkJCSAgMCwgR0JMU1lNX0RFRnxHQkxTWU1fV0VBSyk7Ci0gICAgICBmb3IgKHZzcCA9IEN0b3JzX1N5bWJvbHM7IHZzcDsgdnNwID0gdnNwLT5OZXh0KQotCXZzcC0+UHNlY3RfSW5kZXggPSBDdG9yc19Qc2VjdDsKLSAgICB9Ci0KLSAgaWYgKER0b3JzX1N5bWJvbHMgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICpwc19uYW1lID0gIiRkdG9ycyI7Ci0gICAgICBEdG9yc19Qc2VjdCA9IFBzZWN0X051bWJlcisrOwotICAgICAgVk1TX1BzZWN0X1NwZWMgKHBzX25hbWUsIER0b3JzX1N5bWJvbHMtPlBzZWN0X09mZnNldCArIFhUT1JfU0laRSwKLQkJICAgICAgcHNfRFRPUlMsIDApOwotICAgICAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAocHNfbmFtZSwgRHRvcnNfUHNlY3QsCi0JCQkJICAwLCBHQkxTWU1fREVGfEdCTFNZTV9XRUFLKTsKLSAgICAgIGZvciAodnNwID0gRHRvcnNfU3ltYm9sczsgdnNwOyB2c3AgPSB2c3AtPk5leHQpCi0JdnNwLT5Qc2VjdF9JbmRleCA9IER0b3JzX1BzZWN0OwotICAgIH0KLQotICAvKioqKioqKiAgVGV4dCBJbmZvcm1hdGlvbiBhbmQgUmVsb2NhdGlvbiBSZWNvcmRzICAqKioqKioqLwotCi0gIC8qCi0gICAqCVdyaXRlIHRoZSB0ZXh0IHNlZ21lbnQgZGF0YQotICAgKi8KLSAgaWYgKHRleHRfc2l6ID4gMCkKLSAgICB2bXNfZml4dXBfdGV4dF9zZWN0aW9uICh0ZXh0X3NpeiwgdGV4dF9mcmFnX3Jvb3QsIGRhdGFfZnJhZ19yb290KTsKLSAgLyoKLSAgICoJV3JpdGUgdGhlIGRhdGEgc2VnbWVudCBkYXRhLCB0aGVuIGRpc2NhcmQgaXQuCi0gICAqLwotICBpZiAoZGF0YV9zaXogPiAwKQotICAgIHsKLSAgICAgIHZtc19maXh1cF9kYXRhX3NlY3Rpb24gKGRhdGFfc2l6LCB0ZXh0X3Npeik7Ci0gICAgICBmcmVlIChEYXRhX1NlZ21lbnQpLCAgRGF0YV9TZWdtZW50ID0gMDsKLSAgICB9Ci0KLSAgaWYgKEN0b3JzX1N5bWJvbHMgIT0gMCkKLSAgICB7Ci0gICAgICB2bXNfZml4dXBfeHRvcnNfc2VjdGlvbiAoQ3RvcnNfU3ltYm9scywgQ3RvcnNfUHNlY3QpOwotICAgIH0KLQotICBpZiAoRHRvcnNfU3ltYm9scyAhPSAwKQotICAgIHsKLSAgICAgIHZtc19maXh1cF94dG9yc19zZWN0aW9uIChEdG9yc19TeW1ib2xzLCBEdG9yc19Qc2VjdCk7Ci0gICAgfQotCi0KLSAgLyoqKioqKiogIERlYnVnZ2VyIFN5bWJvbCBUYWJsZSBSZWNvcmRzICAqKioqKioqLwotCi0gIHZtc19idWlsZF9EU1QgKHRleHRfc2l6KTsKLQotCi0gIC8qKioqKioqICBXcmFwIHRoaW5ncyB1cCAgKioqKioqKi8KLQotICAvKgotICAgKglXcml0ZSB0aGUgRW5kIE9mIE1vZHVsZSByZWNvcmQKLSAgICovCi0gIGlmIChFbnRyeV9Qb2ludF9TeW1ib2wpCi0gICAgV3JpdGVfVk1TX0VPTV9SZWNvcmQgKFRleHRfUHNlY3QsIFNfR0VUX1ZBTFVFIChFbnRyeV9Qb2ludF9TeW1ib2wpKTsKLSAgZWxzZQotICAgIFdyaXRlX1ZNU19FT01fUmVjb3JkICgtMSwgKHZhbHVlVCkgMCk7Ci0KLSAgLyoKLSAgICoJQWxsIGRvbmUsIGNsb3NlIHRoZSBvYmplY3QgZmlsZQotICAgKi8KLSAgQ2xvc2VfVk1TX09iamVjdF9GaWxlICgpOwotfQotCi0vKiBlbmQgb2Ygb2JqLXZtcy5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai12bXMuaCBiL2dhcy9jb25maWcvb2JqLXZtcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzBjMWZiLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLXZtcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUyICswLDAgQEAKLS8qIFZNUyBvYmplY3QgZmlsZSBmb3JtYXQKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi1vciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci1XSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICovCi0KLS8qIFRhZyB0byB2YWxpZGF0ZSBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQgcHJvY2Vzc2luZyAqLwotI2RlZmluZSBPQkpfVk1TIDEKLQotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNkZWZpbmUgTE9OR1dPUkRfQUxJR05NRU5UCTIKLQotLyogVGhpcyBtYWNybyBjb250cm9scyBzdWJzZWN0aW9uIGFsaWdubWVudCB3aXRoaW4gYSBzZWN0aW9uLgotICoKLSAqIFVuZGVyIFZBWC9WTVMsIHRoZSBsaW5rZXIgKGFuZCBQU0VDVCBzcGVjaWZpY2F0aW9ucykKLSAqIHRha2UgY2FyZSBvZiBjb3JyZWN0bHkgYWxpZ25pbmcgdGhlIHNlZ21lbnRzLgotICogRG9pbmcgdGhlIGFsaWdubWVudCBoZXJlIChvbiBpbml0aWFsaXplZCBkYXRhKSBjYW4KLSAqIG1lc3MgdXAgdGhlIGNhbGN1bGF0aW9uIG9mIGdsb2JhbCBkYXRhIFBTRUNUIHNpemVzLgotICovCi0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykJXAotCQkoKChTRUcpID09IGRhdGFfc2VjdGlvbikgPyAwIDogTE9OR1dPUkRfQUxJR05NRU5UKQotCi0vKiBUaGlzIGZsYWcgaXMgdXNlZCB0byByZW1lbWJlciB3aGV0aGVyIHdlIGFyZSBpbiB0aGUgY29uc3Qgb3IgdGhlCi0gICBkYXRhIHNlY3Rpb24uICBCeSBhbmQgbGFyZ2UgdGhleSBhcmUgaWRlbnRpY2FsLCBidXQgd2Ugc2V0IGEgbm8td3JpdGUKLSAgIGJpdCBmb3IgcHNlY3RzIGluIHRoZSBjb25zdCBzZWN0aW9uLiAgKi8KLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgY29uc3RfZmxhZzsKLQotLyogVGhpcyBpcyBvdmVybG9hZGVkIG9udG8gY29uc3RfZmxhZywgZm9yIGNvbnZlbmllbmNlLiAgSXQncyB1c2VkIHRvIGZsYWcKLSAgIGR1bW15IGxhYmVscyBsaWtlICJnY2MyX2NvbXBpbGVkLiIgIHdoaWNoIG9jY3VyIGJlZm9yZSB0aGUgZmlyc3QgLnRleHQKLSAgIG9yIC5kYXRhIHNlY3Rpb24gZGlyZWN0aXZlLiAgKi8KLQotI2RlZmluZSBJTl9ERUZBVUxUX1NFQ1RJT04gMHg4MAotCi0vKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiBvYmotdm1zLmMuICovCi1leHRlcm4gY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdOwotZXh0ZXJuIGNvbnN0IHNlZ1QgTl9UWVBFX3NlZ1tdOwotCi0jdW5kZWYgTk9fUkVMT0MKLWVudW0gcmVsb2NfdHlwZQotICB7Ci0gICAgTk9fUkVMT0MsIFJFTE9DXzMyCi0gIH07Ci0KLSNkZWZpbmUgTl9CQURNQUcoeCkJKDApCi0jZGVmaW5lIE5fVFhUT0ZGKHgpCSggc2l6ZW9mKHN0cnVjdCBleGVjKSApCi0jZGVmaW5lIE5fREFUT0ZGKHgpCSggTl9UWFRPRkYoeCkgKyAoeCkuYV90ZXh0ICkKLSNkZWZpbmUgTl9UUk9GRih4KQkoIE5fREFUT0ZGKHgpICsgKHgpLmFfZGF0YSApCi0jZGVmaW5lIE5fRFJPRkYoeCkJKCBOX1RST0ZGKHgpICsgKHgpLmFfdHJzaXplICkKLSNkZWZpbmUgTl9TWU1PRkYoeCkJKCBOX0RST0ZGKHgpICsgKHgpLmFfZHJzaXplICkKLSNkZWZpbmUgTl9TVFJPRkYoeCkJKCBOX1NZTU9GRih4KSArICh4KS5hX3N5bXMgKQotCi0vKiBXZSB1c2UgdGhpcyBjb3B5IG9mIHRoZSBleGVjIGhlYWRlciBmb3IgVk1TLiAgV2UgZG8gbm90IGFjdHVhbGx5IHVzZSBpdCwgYnV0Ci0gICB3aGF0IHdlIGFjdHVhbGx5IGRvIGlzIGxldCBnYXMgZmlsbCBpbiB0aGUgcmVsZXZhbnQgc2xvdHMsIGFuZCB3aGVuIHdlIGdldAotICAgYXJvdW5kIHRvIHdyaXRpbmcgYW4gb2JqIGZpbGUsIHdlIGp1c3QgcGljayBvdXQgd2hhdCB3ZSBuZWVkLiAgKi8KLQotc3RydWN0IGV4ZWMKLXsKLSAgdW5zaWduZWQgbG9uZyBhX3RleHQ7CQkvKiBsZW5ndGggb2YgdGV4dCwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX2RhdGE7CQkvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX2JzczsJCS8qIGxlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX2Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX2VudHJ5OwkvKiBzdGFydCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9zeW1zOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBkYXRhIGluIGZpbGUsIGluIGJ5dGVzICovCi19OwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgc3RydWN0IGV4ZWMgaGVhZGVyOwkJLyogYS5vdXQgaGVhZGVyICovCi0gICAgbG9uZyBzdHJpbmdfdGFibGVfc2l6ZTsJLyogbmFtZXMgKyAnXDAnICsgc2l6ZW9mKGludCkgKi8KLSAgfQotb2JqZWN0X2hlYWRlcnM7Ci0KLS8qIEEgc2luZ2xlIGVudHJ5IGluIHRoZSBzeW1ib2wgdGFibGUKLSAqICh0aGlzIHN0YXJ0ZWQgYXMgYSBjbG9uZSBvZiBib3V0LmgncyBubGlzdCwgYnV0IG11Y2ggd2FzIHVubmVlZGVkKS4KLSAqLwotc3RydWN0IG5saXN0Ci0gIHsKLSAgICBjaGFyICpuX25hbWU7Ci0gICAgdW5zaWduZWQgY2hhciBuX3R5cGU7CS8qIFNlZSBiZWxvdwkJCQkqLwotICAgIHVuc2lnbmVkIGNoYXIgbl9vdGhlcjsJLyogdXNlZCBmb3IgY29uc3RfZmxhZyBhbmQgImRlZmF1bHQgc2VjdGlvbiIgKi8KLSAgICB1bnNpZ25lZAk6IDE2OwkJLyogcGFkZGluZyBmb3IgYWxpZ25tZW50ICovCi0gICAgaW50IG5fZGVzYzsJCQkvKiBzb3VyY2UgbGluZSBudW1iZXIgZm9yIE5fU0xJTkUgc3RhYnMgKi8KLSAgfTsKLQotLyogTGVnYWwgdmFsdWVzIG9mIG5fdHlwZSAoc2VlIGFvdXQvc3RhYi5kZWYgZm9yIHRoZSBtYWpvcml0eSBvZiB0aGUgY29kZXMpLgotICovCi0jZGVmaW5lIE5fVU5ERgkwCQkvKiBVbmRlZmluZWQgc3ltYm9sCSovCi0jZGVmaW5lIE5fQUJTCTIJCS8qIEFic29sdXRlIHN5bWJvbAkqLwotI2RlZmluZSBOX1RFWFQJNAkJLyogVGV4dCBzeW1ib2wJCSovCi0jZGVmaW5lIE5fREFUQQk2CQkvKiBEYXRhIHN5bWJvbAkJKi8KLSNkZWZpbmUgTl9CU1MJOAkJLyogQlNTIHN5bWJvbAkJKi8KLSNkZWZpbmUgTl9GTgkzMQkJLyogRmlsZW5hbWUgc3ltYm9sCSovCi0KLSNkZWZpbmUgTl9FWFQJMQkJLyogRXh0ZXJuYWwgc3ltYm9sIChPUidkIGluIHdpdGggb25lIG9mIGFib3ZlKQkqLwotI2RlZmluZSBOX1RZUEUJMDM2CQkvKiBNYXNrIGZvciBhbGwgdGhlIHR5cGUgYml0cwkJCSovCi0KLSNkZWZpbmUgTl9TVEFCCTAzNDAJCS8qIE1hc2sgZm9yIGFsbCBiaXRzIHVzZWQgZm9yIFNEQiBlbnRyaWVzIAkqLwotCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotCi0vKiBTWU1CT0wgVEFCTEUgKi8KLS8qIFN5bWJvbCB0YWJsZSBlbnRyeSBkYXRhIHR5cGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgbmxpc3Qgb2JqX3N5bWJvbF90eXBlOwkvKiBTeW1ib2wgdGFibGUgZW50cnkgKi8KLQotLyogU3ltYm9sIHRhYmxlIG1hY3JvcyBhbmQgY29uc3RhbnRzICovCi0KLSNkZWZpbmUgT0JKX1NZTUZJRUxEX1RZUEUgc3RydWN0IFZNU19TeW1ib2wgKgotCi0vKgotICogIE1hY3JvcyB0byBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gYSBzeW1ib2wgdGFibGUgZW50cnkuCi0gKiAgVGhpcyBzeW50YXhpYyBpbmRpcmVjdGlvbiBhbGxvd3MgaW5kZXBlbmRlbmNlIHJlZ2FyZGluZyBhLm91dCBvciBjb2ZmLgotICogIFRoZSBhcmd1bWVudCAocykgb2YgYWxsIHRoZXNlIG1hY3JvcyBpcyBhIHBvaW50ZXIgdG8gYSBzeW1ib2wgdGFibGUgZW50cnkuCi0gKi8KLQotLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGlzIGV4dGVybmFsICovCi0jZGVmaW5lIFNfSVNfRVhURVJOQUwocykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fRVhUKQotCi0vKiBUcnVlIGlmIHN5bWJvbCBoYXMgYmVlbiBkZWZpbmVkLCBpZSBpcyBpbiBOX3tURVhULERBVEEsQlNTLEFCU30gb3IgTl9FWFQgKi8KLSNkZWZpbmUgU19JU19ERUZJTkVEKHMpCQkoU19HRVRfVFlQRShzKSAhPSBOX1VOREYpCi0KLSNkZWZpbmUgU19JU19DT01NT04ocykJKFNfR0VUX1RZUEUocykgPT0gTl9VTkRGICYmIFNfR0VUX1ZBTFVFKHMpICE9IDApCi0KLSNkZWZpbmUgU19JU19SRUdJU1RFUihzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlID09IE5fUkVHSVNURVIpCi0KLS8qIFRydWUgaWYgYSBkZWJ1ZyBzcGVjaWFsIHN5bWJvbCBlbnRyeSAqLwotI2RlZmluZSBTX0lTX0RFQlVHKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9TVEFCKQotLyogVHJ1ZSBpZiBhIHN5bWJvbCBpcyBsb2NhbCBzeW1ib2wgbmFtZSAqLwotLyogQSBzeW1ib2wgbmFtZSB3aG9zZSBuYW1lIGJlZ2luIHdpdGggXkEgaXMgYSBnYXMgaW50ZXJuYWwgcHNldWRvIHN5bWJvbAotICAgbmFtZWxlc3Mgc3ltYm9scyBjb21lIGZyb20gLnN0YWIgZGlyZWN0aXZlcy4gKi8KLSNkZWZpbmUgU19JU19MT0NBTChzKQkJKFNfR0VUX05BTUUocykgJiYgXAotCQkJCSAhU19JU19ERUJVRyhzKSAmJiBcCi0JCQkJIChzdHJjaHIoU19HRVRfTkFNRShzKSwgJ1wwMDEnKSAhPSAwIHx8IFwKLQkJCQkgIHN0cmNocihTX0dFVF9OQU1FKHMpLCAnXDAwMicpICE9IDAgfHwgXAotCQkJCSAgKFNfTE9DQUxfTkFNRShzKSAmJiAhZmxhZ19rZWVwX2xvY2FscykpKQotLyogVHJ1ZSBpZiBhIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiB0aGlzIGZpbGUgKi8KLSNkZWZpbmUgU19JU19FWFRFUk4ocykJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX0VYVCkKLS8qIFRydWUgaWYgdGhlIHN5bWJvbCBoYXMgYmVlbiBnZW5lcmF0ZWQgYmVjYXVzZSBvZiBhIC5zdGFiZCBkaXJlY3RpdmUgKi8KLSNkZWZpbmUgU19JU19TVEFCRChzKQkJKFNfR0VUX05BTUUocykgPT0gKGNoYXIgKikwKQotCi0vKiBBY2Nlc3NvcnMgKi8KLS8qIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19HRVRfTkFNRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fbmFtZSkKLS8qIFRoZSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdGFibGUgKi8KLSNkZWZpbmUgU19HRVRfT0ZGU0VUKHMpCQkoKHMpLT5zeV9uYW1lX29mZnNldCkKLS8qIFRoZSByYXcgdHlwZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfR0VUX1JBV19UWVBFKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlKQotLyogVGhlIHR5cGUgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX0dFVF9UWVBFKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9UWVBFKQotLyogVGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIHNlZ21lbnQgKi8KLSNkZWZpbmUgU19HRVRfU0VHTUVOVChzKQkoTl9UWVBFX3NlZ1tTX0dFVF9UWVBFKHMpXSkKLS8qIFRoZSBuX290aGVyIGV4cHJlc3Npb24gdmFsdWUgKi8KLSNkZWZpbmUgU19HRVRfT1RIRVIocykJCSgocyktPnN5X3N5bWJvbC5uX290aGVyKQotLyogVGhlIG5fZGVzYyBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfR0VUX0RFU0MocykJCSgocyktPnN5X3N5bWJvbC5uX2Rlc2MpCi0KLS8qIE1vZGlmaWVycyAqLwotLyogQXNzdW1lIHRoYXQgYSBzeW1ib2wgY2Fubm90IGJlIHNpbXVsdGFuZW91c2x5IGluIG1vcmUgdGhhbiBvbiBzZWdtZW50ICovCi0vKiBzZXQgc2VnbWVudCAqLwotI2RlZmluZSBTX1NFVF9TRUdNRU5UKHMsc2VnKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICY9IH5OX1RZUEUsKHMpLT5zeV9zeW1ib2wubl90eXBlfD1TRUdNRU5UX1RPX1NZTUJPTF9UWVBFKHNlZykpCi0vKiBUaGUgc3ltYm9sIGlzIGV4dGVybmFsICovCi0jZGVmaW5lIFNfU0VUX0VYVEVSTkFMKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgfD0gTl9FWFQpCi0vKiBUaGUgc3ltYm9sIGlzIG5vdCBleHRlcm5hbCAqLwotI2RlZmluZSBTX0NMRUFSX0VYVEVSTkFMKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJj0gfk5fRVhUKQotLyogU2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19TRVRfTkFNRShzLHYpCQkoKHMpLT5zeV9zeW1ib2wubl9uYW1lID0gKHYpKQotLyogU2V0IHRoZSBvZmZzZXQgaW4gdGhlIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTX1NFVF9PRkZTRVQocyx2KQkoKHMpLT5zeV9uYW1lX29mZnNldCA9ICh2KSkKLS8qIFNldCB0aGUgbl9vdGhlciBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfU0VUX09USEVSKHMsdikJKChzKS0+c3lfc3ltYm9sLm5fb3RoZXIgPSAodikpCi0vKiBTZXQgdGhlIG5fZGVzYyBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfU0VUX0RFU0Mocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fZGVzYyA9ICh2KSkKLS8qIFNldCB0aGUgbl90eXBlIGV4cHJlc3Npb24gdmFsdWUgKi8KLSNkZWZpbmUgU19TRVRfVFlQRShzLHYpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlID0gKHYpKQotCi0KLS8qIEZpbGUgaGVhZGVyIG1hY3JvIGFuZCB0eXBlIGRlZmluaXRpb24gKi8KLQotI2RlZmluZSBIX0dFVF9URVhUX1NJWkUoaCkJCSgoaCktPmhlYWRlci5hX3RleHQpCi0jZGVmaW5lIEhfR0VUX0RBVEFfU0laRShoKQkJKChoKS0+aGVhZGVyLmFfZGF0YSkKLSNkZWZpbmUgSF9HRVRfQlNTX1NJWkUoaCkJCSgoaCktPmhlYWRlci5hX2JzcykKLQotI2RlZmluZSBIX1NFVF9URVhUX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfdGV4dCA9IG1kX3NlY3Rpb25fYWxpZ24oU0VHX1RFWFQsICh2KSkpCi0jZGVmaW5lIEhfU0VUX0RBVEFfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV9kYXRhID0gbWRfc2VjdGlvbl9hbGlnbihTRUdfREFUQSwgKHYpKSkKLSNkZWZpbmUgSF9TRVRfQlNTX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfYnNzID0gbWRfc2VjdGlvbl9hbGlnbihTRUdfQlNTLCAodikpKQotCi0jZGVmaW5lIEhfU0VUX1NUUklOR19TSVpFKGgsdikJCSgoaCktPnN0cmluZ190YWJsZV9zaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRShoLHYpCSgoaCktPmhlYWRlci5hX3N5bXMgPSAodikgKiBcCi0JCQkJCSBzaXplb2Yoc3RydWN0IG5saXN0KSkKLQotLyogbGluZSBudW1iZXJpbmcgc3R1ZmYuICovCi0jZGVmaW5lIE9CSl9FTUlUX0xJTkVOTyhhLCBiLCBjKQl7O30KLQotI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rKHMpCXs7fQotCi0vKiBGb3JjZSBzdHJ1Y3R1cmUgdGFncyBpbnRvIHNjb3BlIHNvIHRoYXQgdGhlaXIgdXNlIGluIHByb3RvdHlwZXMKLSAgIHdpbGwgbmV2ZXIgYmUgdGhlaXIgZmlyc3Qgb2NjdXJhbmNlLiAgKi8KLXN0cnVjdCBmaXg7Ci1zdHJ1Y3Qgc3ltYm9sOwotc3RydWN0IGZyYWc7Ci0KLS8qIG9iai12bXMgcm91dGluZXMgdmlzaWJsZSB0byB0aGUgcmVzdCBvZiBnYXMuICAqLwotCi1leHRlcm4gdm9pZCB0Y19hb3V0X2ZpeF90b19jaGFycyBQQVJBTVMgKChjaGFyICosc3RydWN0IGZpeCAqLHJlbGF4X2FkZHJlc3NUKSk7Ci0KLWV4dGVybiBpbnQgdm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOwotI2RlZmluZSBSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04oWCkJdm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmKFgpCi0KLS8qIENvbXBpbGVyLWdlbmVyYXRlZCBsYWJlbCAiX192YXhfZ19kb3VibGVzIiBpcyB1c2VkIHRvIGF1Z21lbnQgLnN0YWJzLiAqLwotZXh0ZXJuIHZvaWQgdm1zX2NoZWNrX2Zvcl9zcGVjaWFsX2xhYmVsIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOwotI2RlZmluZSBvYmpfZnJvYl9sYWJlbChYKSB2bXNfY2hlY2tfZm9yX3NwZWNpYWxfbGFiZWwoWCkKLQotZXh0ZXJuIHZvaWQgdm1zX2NoZWNrX2Zvcl9tYWluIFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIHZvaWQgdm1zX3dyaXRlX29iamVjdF9maWxlIFBBUkFNUyAoKHVuc2lnbmVkLHVuc2lnbmVkLHVuc2lnbmVkLAotCQkJCQkgICBzdHJ1Y3QgZnJhZyAqLHN0cnVjdCBmcmFnICopKTsKLQotLyogVk1TIGV4ZWN1dGFibGVzIGFyZSBub3RoaW5nIGxpa2UgYS5vdXQsIGJ1dCB0aGUgVk1TIHBvcnQgb2YgZ2NjIHVzZXMKLSAgIGEub3V0IGZvcm1hdCBzdGFicyB3aGljaCBvYmotdm1zLmMgdGhlbiB0cmFuc2xhdGVzLiAgKi8KLQotI2RlZmluZSBBT1VUX1NUQUJTCi0KLQwKLSNpZmRlZiBXQU5UX1ZNU19PQkpfREVGUwotCi0vKiBUaGUgcmVzdCBvZiB0aGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIGNvbnN0YW50cyB1c2VkIHdpdGhpbgotICAgdGhlIGFjdHVhbCBWTVMgb2JqZWN0IGZpbGUuICBXZSBkbyBub3QgdXNlIGEgJCBpbiB0aGUgc3ltYm9scyAoYXMgcGVyCi0gICB1c3VhbCBWTVMgY29udmVudGlvbikgc2luY2UgU3lzdGVtIFYgZ2FncyBvbiBpdC4gICovCi0KLSNkZWZpbmUJT0JKX1NfQ19IRFIJMAotI2RlZmluZQlPQkpfU19DX0hEUl9NSEQJMAotI2RlZmluZQlPQkpfU19DX0hEUl9MTk0JMQotI2RlZmluZQlPQkpfU19DX0hEUl9TUkMJMgotI2RlZmluZQlPQkpfU19DX0hEUl9UVEwJMwotI2RlZmluZQlPQkpfU19DX0hEUl9DUFIJNAotI2RlZmluZQlPQkpfU19DX0hEUl9NVEMJNQotI2RlZmluZQlPQkpfU19DX0hEUl9HVFgJNgotI2RlZmluZQlPQkpfU19DX0dTRAkxCi0jZGVmaW5lCU9CSl9TX0NfR1NEX1BTQwkwCi0jZGVmaW5lCU9CSl9TX0NfR1NEX1NZTQkxCi0jZGVmaW5lCU9CSl9TX0NfR1NEX0VQTQkyCi0jZGVmaW5lCU9CSl9TX0NfR1NEX1BSTwkzCi0jZGVmaW5lCU9CSl9TX0NfR1NEX1NZTVcJNAotI2RlZmluZQlPQkpfU19DX0dTRF9FUE1XCTUKLSNkZWZpbmUJT0JKX1NfQ19HU0RfUFJPVwk2Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX0lEQwk3Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX0VOVgk4Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX0xTWQk5Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX0xFUE0JMTAKLSNkZWZpbmUJT0JKX1NfQ19HU0RfTFBSTwkxMQotI2RlZmluZQlPQkpfU19DX0dTRF9TUFNDCTEyCi0jZGVmaW5lCU9CSl9TX0NfVElSCTIKLSNkZWZpbmUJT0JKX1NfQ19FT00JMwotI2RlZmluZQlPQkpfU19DX0RCRwk0Ci0jZGVmaW5lCU9CSl9TX0NfVEJUCTUKLSNkZWZpbmUJT0JKX1NfQ19MTksJNgotI2RlZmluZQlPQkpfU19DX0VPTVcJNwotI2RlZmluZQlPQkpfU19DX01BWFJFQ1RZUAk3Ci0jZGVmaW5lCU9CSl9TX0tfU1VCVFlQCTEKLSNkZWZpbmUJT0JKX1NfQ19TVUJUWVAJMQotI2RlZmluZQlPQkpfU19DX01BWFJFQ1NJWgkyMDQ4Ci0jZGVmaW5lCU9CSl9TX0NfU1RSTFZMCTAKLSNkZWZpbmUJT0JKX1NfQ19TWU1TSVoJMzEKLSNkZWZpbmUJT0JKX1NfQ19TVE9SRVBMSU0JLTEKLSNkZWZpbmUJT0JKX1NfQ19QU0NBTElMSU0JOQotDAotI2RlZmluZQlNSERfU19DX01IRAkwCi0jZGVmaW5lCU1IRF9TX0NfTE5NCTEKLSNkZWZpbmUJTUhEX1NfQ19TUkMJMgotI2RlZmluZQlNSERfU19DX1RUTAkzCi0jZGVmaW5lCU1IRF9TX0NfQ1BSCTQKLSNkZWZpbmUJTUhEX1NfQ19NVEMJNQotI2RlZmluZQlNSERfU19DX0dUWAk2Ci0jZGVmaW5lCU1IRF9TX0NfTUFYSERSVFlQCTYKLQwKLSNkZWZpbmUJR1NEX1NfS19FTlRSSUVTCTEKLSNkZWZpbmUJR1NEX1NfQ19FTlRSSUVTCTEKLSNkZWZpbmUJR1NEX1NfQ19QU0MJMAotI2RlZmluZQlHU0RfU19DX1NZTQkxCi0jZGVmaW5lCUdTRF9TX0NfRVBNCTIKLSNkZWZpbmUJR1NEX1NfQ19QUk8JMwotI2RlZmluZQlHU0RfU19DX1NZTVcJNAotI2RlZmluZQlHU0RfU19DX0VQTVcJNQotI2RlZmluZQlHU0RfU19DX1BST1cJNgotI2RlZmluZQlHU0RfU19DX0lEQwk3Ci0jZGVmaW5lCUdTRF9TX0NfRU5WCTgKLSNkZWZpbmUJR1NEX1NfQ19MU1kJOQotI2RlZmluZQlHU0RfU19DX0xFUE0JMTAKLSNkZWZpbmUJR1NEX1NfQ19MUFJPCTExCi0jZGVmaW5lCUdTRF9TX0NfU1BTQwkxMgotI2RlZmluZQlHU0RfU19DX1NZTVYJMTMKLSNkZWZpbmUJR1NEX1NfQ19FUE1WCTE0Ci0jZGVmaW5lCUdTRF9TX0NfUFJPVgkxNQotI2RlZmluZQlHU0RfU19DX01BWFJFQ1RZUAkxNQotDAotI2RlZmluZQlHU1lfU19NX1dFQUsJMQotI2RlZmluZQlHU1lfU19NX0RFRgkyCi0jZGVmaW5lCUdTWV9TX01fVU5JCTQKLSNkZWZpbmUJR1NZX1NfTV9SRUwJOAotCi0jZGVmaW5lCUxTWV9TX01fREVGCTIKLSNkZWZpbmUJTFNZX1NfTV9SRUwJOAotCi0jZGVmaW5lCUVOVl9TX01fREVGCTEKLSNkZWZpbmUJRU5WX1NfTV9ORVNURUQJMgotDAotI2RlZmluZQlHUFNfU19NX1BJQwkxCi0jZGVmaW5lCUdQU19TX01fTElCCTIKLSNkZWZpbmUJR1BTX1NfTV9PVlIJNAotI2RlZmluZQlHUFNfU19NX1JFTAk4Ci0jZGVmaW5lCUdQU19TX01fR0JMCTE2Ci0jZGVmaW5lCUdQU19TX01fU0hSCTMyCi0jZGVmaW5lCUdQU19TX01fRVhFCTY0Ci0jZGVmaW5lCUdQU19TX01fUkQJMTI4Ci0jZGVmaW5lCUdQU19TX01fV1JUCTI1NgotI2RlZmluZQlHUFNfU19NX1ZFQwk1MTIKLSNkZWZpbmUJR1BTX1NfS19OQU1FCTkKLSNkZWZpbmUJR1BTX1NfQ19OQU1FCTkKLQwKLSNkZWZpbmUJVElSX1NfQ19TVEFfR0JMCTAKLSNkZWZpbmUJVElSX1NfQ19TVEFfU0IJMQotI2RlZmluZQlUSVJfU19DX1NUQV9TVwkyCi0jZGVmaW5lCVRJUl9TX0NfU1RBX0xXCTMKLSNkZWZpbmUJVElSX1NfQ19TVEFfUEIJNAotI2RlZmluZQlUSVJfU19DX1NUQV9QVwk1Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX1BMCTYKLSNkZWZpbmUJVElSX1NfQ19TVEFfVUIJNwotI2RlZmluZQlUSVJfU19DX1NUQV9VVwk4Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX0JGSQk5Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX1dGSQkxMAotI2RlZmluZQlUSVJfU19DX1NUQV9MRkkJMTEKLSNkZWZpbmUJVElSX1NfQ19TVEFfRVBNCTEyCi0jZGVmaW5lCVRJUl9TX0NfU1RBX0NLQVJHCTEzCi0jZGVmaW5lCVRJUl9TX0NfU1RBX1dQQgkxNAotI2RlZmluZQlUSVJfU19DX1NUQV9XUFcJMTUKLSNkZWZpbmUJVElSX1NfQ19TVEFfV1BMCTE2Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX0xTWQkxNwotI2RlZmluZQlUSVJfU19DX1NUQV9MSVQJMTgKLSNkZWZpbmUJVElSX1NfQ19TVEFfTEVQTQkxOQotI2RlZmluZQlUSVJfU19DX01BWFNUQUNPRAkxOQotI2RlZmluZQlUSVJfU19DX01JTlNUT0NPRAkyMAotI2RlZmluZQlUSVJfU19DX1NUT19TQgkyMAotI2RlZmluZQlUSVJfU19DX1NUT19TVwkyMQotI2RlZmluZQlUSVJfU19DX1NUT19MCTIyCi0jZGVmaW5lCVRJUl9TX0NfU1RPX0JECTIzCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1dECTI0Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX0xECTI1Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX0xJCTI2Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1BJRFIJMjcKLSNkZWZpbmUJVElSX1NfQ19TVE9fUElDUgkyOAotI2RlZmluZQlUSVJfU19DX1NUT19SU0IJMjkKLSNkZWZpbmUJVElSX1NfQ19TVE9fUlNXCTMwCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1JMCTMxCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1ZQUwkzMgotI2RlZmluZQlUSVJfU19DX1NUT19VU0IJMzMKLSNkZWZpbmUJVElSX1NfQ19TVE9fVVNXCTM0Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1JVQgkzNQotI2RlZmluZQlUSVJfU19DX1NUT19SVVcJMzYKLSNkZWZpbmUJVElSX1NfQ19TVE9fQgkzNwotI2RlZmluZQlUSVJfU19DX1NUT19XCTM4Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1JCCTM5Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1JXCTQwCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1JJVkIJNDEKLSNkZWZpbmUJVElSX1NfQ19TVE9fUElSUgk0MgotI2RlZmluZQlUSVJfU19DX01BWFNUT0NPRAk0MgotI2RlZmluZQlUSVJfU19DX01JTk9QUkNPRAk1MAotI2RlZmluZQlUSVJfU19DX09QUl9OT1AJNTAKLSNkZWZpbmUJVElSX1NfQ19PUFJfQURECTUxCi0jZGVmaW5lCVRJUl9TX0NfT1BSX1NVQgk1MgotI2RlZmluZQlUSVJfU19DX09QUl9NVUwJNTMKLSNkZWZpbmUJVElSX1NfQ19PUFJfRElWCTU0Ci0jZGVmaW5lCVRJUl9TX0NfT1BSX0FORAk1NQotI2RlZmluZQlUSVJfU19DX09QUl9JT1IJNTYKLSNkZWZpbmUJVElSX1NfQ19PUFJfRU9SCTU3Ci0jZGVmaW5lCVRJUl9TX0NfT1BSX05FRwk1OAotI2RlZmluZQlUSVJfU19DX09QUl9DT00JNTkKLSNkZWZpbmUJVElSX1NfQ19PUFJfSU5TVgk2MAotI2RlZmluZQlUSVJfU19DX09QUl9BU0gJNjEKLSNkZWZpbmUJVElSX1NfQ19PUFJfVVNICTYyCi0jZGVmaW5lCVRJUl9TX0NfT1BSX1JPVAk2MwotI2RlZmluZQlUSVJfU19DX09QUl9TRUwJNjQKLSNkZWZpbmUJVElSX1NfQ19PUFJfUkVERUYJNjUKLSNkZWZpbmUJVElSX1NfQ19PUFJfREZMSVQJNjYKLSNkZWZpbmUJVElSX1NfQ19NQVhPUFJDT0QJNjYKLSNkZWZpbmUJVElSX1NfQ19NSU5DVExDT0QJODAKLSNkZWZpbmUJVElSX1NfQ19DVExfU0VUUkIJODAKLSNkZWZpbmUJVElSX1NfQ19DVExfQVVHUkIJODEKLSNkZWZpbmUJVElSX1NfQ19DVExfREZMT0MJODIKLSNkZWZpbmUJVElSX1NfQ19DVExfU1RMT0MJODMKLSNkZWZpbmUJVElSX1NfQ19DVExfU1RLREwJODQKLSNkZWZpbmUJVElSX1NfQ19NQVhDVExDT0QJODQKLQwKLS8qCi0gKglEZWJ1Z2dlciBzeW1ib2wgZGVmaW5pdGlvbnM6ICBUaGVzZSBhcmUgZG9uZSBieSBoYW5kLCBhcyBubwotICoJCQkJCW1hY2hpbmUtcmVhZGFibGUgdmVyc2lvbiBzZWVtcwotICoJCQkJCXRvIGJlIGF2YWlsYWJsZS4KLSAqLwotI2RlZmluZSBEU1RfU19DX0MJICA3CS8qIExhbmd1YWdlID09ICJDIgkqLwotI2RlZmluZSBEU1RfU19DX0NYWAkgMTUJLyogTGFuZ3VhZ2UgPT0gIkMrKyIJKi8KLSNkZWZpbmUgRFNUX1NfQ19WRVJTSU9OCTE1MwotI2RlZmluZQlEU1RfU19DX1NPVVJDRQkxNTUJLyogU291cmNlIGZpbGUJCSovCi0jZGVmaW5lIERTVF9TX0NfUFJPTE9HCTE2MgotI2RlZmluZQlEU1RfU19DX0JMS0JFRwkxNzYJLyogQmVnaW5uaW5nIG9mIGJsb2NrCSovCi0jZGVmaW5lCURTVF9TX0NfQkxLRU5ECTE3NwkvKiBFbmQgb2YgYmxvY2sJKi8KLSNkZWZpbmUgRFNUX1NfQ19FTlRSWQkxODEKLSNkZWZpbmUgRFNUX1NfQ19QU0VDVAkxODQKLSNkZWZpbmUJRFNUX1NfQ19MSU5FX05VTQkxODUJLyogTGluZSBOdW1iZXIJCSovCi0jZGVmaW5lIERTVF9TX0NfTEJMT1JMSVQJMTg2Ci0jZGVmaW5lIERTVF9TX0NfTEFCRUwJMTg3Ci0jZGVmaW5lCURTVF9TX0NfTU9EQkVHCTE4OAkvKiBCZWdpbm5pbmcgb2YgbW9kdWxlCSovCi0jZGVmaW5lCURTVF9TX0NfTU9ERU5ECTE4OQkvKiBFbmQgb2YgbW9kdWxlCSovCi0jZGVmaW5lCURTVF9TX0NfUlROQkVHCTE5MAkvKiBCZWdpbm5pbmcgb2Ygcm91dGluZQkqLwotI2RlZmluZQlEU1RfU19DX1JUTkVORAkxOTEJLyogRW5kIG9mIHJvdXRpbmUJKi8KLSNkZWZpbmUJRFNUX1NfQ19ERUxUQV9QQ19XCTEJLyogSW5jciBQQwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU0JMgkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU1fVwkzCS8qIEluY3IgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0lOQ1IJNAotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9JTkNSX1cJNQotI2RlZmluZSBEU1RfU19DX1JFU0VUX0xJTlVNX0lOQ1IJNgotI2RlZmluZSBEU1RfU19DX0JFR19TVE1UX01PREUJNwotI2RlZmluZSBEU1RfU19DX0VORF9TVE1UX01PREUJOAotI2RlZmluZQlEU1RfU19DX1NFVF9MSU5FX05VTQk5CS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfUEMJCTEwCi0jZGVmaW5lIERTVF9TX0NfU0VUX1BDX1cJCTExCi0jZGVmaW5lIERTVF9TX0NfU0VUX1BDX0wJCTEyCi0jZGVmaW5lIERTVF9TX0NfU0VUX1NUTVROVU0JMTMKLSNkZWZpbmUgRFNUX1NfQ19URVJNCQkxNAkvKiBFbmQgb2YgbGluZXMJKi8KLSNkZWZpbmUgRFNUX1NfQ19URVJNX1cJCTE1CS8qIEVuZCBvZiBsaW5lcwkqLwotI2RlZmluZQlEU1RfU19DX1NFVF9BQlNfUEMJMTYJLyogU2V0IFBDCSovCi0jZGVmaW5lCURTVF9TX0NfREVMVEFfUENfTAkxNwkvKiBJbmNyIFBDCSovCi0jZGVmaW5lIERTVF9TX0NfSU5DUl9MSU5VTV9MCTE4CS8qIEluY3IgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0IJMTkJLyogU2V0IExpbmUgIwkqLwotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9MCTIwCS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUJRFNUX1NfQ19URVJNX0wJCTIxCS8qIEVuZCBvZiBsaW5lcwkqLwotLyogdGhlc2UgYXJlIHVzZWQgd2l0aCBEU1RfU19DX1NPVVJDRSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19ERUNMRklMRQkgMQkvKiBEZWNsYXJlIHNvdXJjZSBmaWxlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX1NFVEZJTEUJIDIJLyogU2V0IHNvdXJjZSBmaWxlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX1NFVFJFQ19MCSAzCS8qIFNldCByZWNvcmQsIGxvbmd3b3JkIHZhbHVlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX1NFVFJFQ19XCSA0CS8qIFNldCByZWNvcmQsIHdvcmQgdmFsdWUgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVGTElORVNfVwkxMAkvKiAjIG9mIGxpbmUsIHdvcmQgY291bnRlciAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19ERUZMSU5FU19CCTExCS8qICMgb2YgbGluZSwgYnl0ZSBjb3VudGVyICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX0ZPUk1GRUVECTE2CS8qIF5MIGNvdW50cyBhcyBhIHJlY29yZCAqLwotLyogdGhlIGZvbGxvd2luZyBhcmUgdGhlIGNvZGVzIGZvciB0aGUgdmFyaW91cyBkYXRhIHR5cGVzLiAgQW55dGhpbmcgbm90IG9uCi0gKiB0aGUgbGlzdCBpcyBpbmNsdWRlZCB1bmRlciAnYWR2YW5jZWRfdHlwZScKLSAqLwotI2RlZmluZSBEQkdfU19DX1VDSEFSCQkweDAyCi0jZGVmaW5lIERCR19TX0NfVVNJTlQJCTB4MDMKLSNkZWZpbmUgREJHX1NfQ19VTElOVAkJMHgwNAotI2RlZmluZSBEQkdfU19DX1VRVUFECQkweDA1Ci0jZGVmaW5lIERCR19TX0NfU0NIQVIJCTB4MDYKLSNkZWZpbmUgREJHX1NfQ19TU0lOVAkJMHgwNwotI2RlZmluZSBEQkdfU19DX1NMSU5UCQkweDA4Ci0jZGVmaW5lIERCR19TX0NfU1FVQUQJCTB4MDkKLSNkZWZpbmUgREJHX1NfQ19SRUFMNAkJMHgwYQotI2RlZmluZSBEQkdfU19DX1JFQUw4CQkweDBiCQkvKiBEX2Zsb2F0IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX0NPTVBMWDQJCTB4MGMJCS8qIDJ4Rl9mbG9hdCBjb21wbGV4IGZsb2F0ICovCi0jZGVmaW5lIERCR19TX0NfQ09NUExYOAkJMHgwZAkJLyogMnhEX2Zsb2F0IGNvbXBsZXggZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfUkVBTDhfRwkJMHgxYgkJLyogR19mbG9hdCBkb3VibGUgKi8KLSNkZWZpbmUgREJHX1NfQ19DT01QTFg4X0cJMHgxZAkJLyogMnhHX2Zsb2F0IGNvbXBsZXggZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfRlVOQ1RJT05fQUREUgkweDE3Ci0jZGVmaW5lIERCR19TX0NfQURWQU5DRURfVFlQRQkweGEzCi0vKiAgU29tZSBvZiB0aGVzZSBhcmUganVzdCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4gIFtwcl0KLSAqLwotI2RlZmluZSBEQkdfU19DX1VCSVRBCQkweDAxCS8qIHVuc2lnbmVkLCBhbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX1VCSVRVCQkweDIyCS8qIHVuc2lnbmVkLCB1bmFsaWduZWQgYml0IGZpZWxkICovCi0jZGVmaW5lIERCR19TX0NfU0JJVEEJCTB4MjkJLyogc2lnbmVkLCBhbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX1NCSVRVCQkweDJhCS8qIHNpZ25lZCwgdW5hbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX0NTVFJJTkcJCTB4MmUJLyogYXNjaXogKCdcMCcgdGVybWluYXRlZCkgc3RyaW5nICovCi0jZGVmaW5lIERCR19TX0NfV0NIQVIJCTB4MzgJLyogd2NoYXJfdCAqLwotLyogIFRoZXNlIGFyZSBkZXNjcmlwdG9yIGNsYXNzIGNvZGVzLgotICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX1MJCTB4MDEJLyogc3RhdGljIChmaXhlZCBsZW5ndGgpICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX0QJCTB4MDIJLyogZHluYW1pYyBzdHJpbmcgKG5vdCB2aWEgbWFsbG9jISkgKi8KLSNkZWZpbmUgRFNDX0tfQ0xBU1NfQQkJMHgwNAkvKiBhcnJheSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19VQlMJCTB4MGQJLyogdW5hbGlnbmVkIGJpdCBzdHJpbmcgKi8KLS8qICBUaGVzZSBhcmUgdGhlIGNvZGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRlZmluaXRpb25zIG9mIHN0cnVjdAotICogIHVuaW9uIGFuZCBlbnVtIHJlY29yZHMKLSAqLwotI2RlZmluZSBEQkdfU19DX0VOVU1fSVRFTQkJMHhhNAotI2RlZmluZSBEQkdfU19DX0VOVU1fU1RBUlQJCTB4YTUKLSNkZWZpbmUgREJHX1NfQ19FTlVNX0VORAkJMHhhNgotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9JVEVNCQlEU1RfS19WRkxBR1NfQklUT0ZGUwkvKiAweGZmICovCi0jZGVmaW5lIERCR19TX0NfU1RSVUNUX1NUQVJUCQkweGFiCi0jZGVmaW5lIERCR19TX0NfU1RSVUNUX0VORAkJMHhhYwotI2RlZmluZSBEU1RfS19UWVBTUEVDCQkJMHhhZgkJLyogdHlwZSBzcGVjaWZpY2F0aW9uICovCi0vKiBUaGVzZSBjb2RlcyBhcmUgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgc3ltYm9sIGRlZmluaXRpb24gcmVjb3JkcwotICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19OT1ZBTAkJMHg4MAkvKiBzdHJ1Y3QgZGVmaW5pdGlvbiBvbmx5ICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19EU0MJCTB4ZmEJLyogZGVzY3JpcHRvciB1c2VkICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19UVlMJCTB4ZmIJLyogdHJhaWxpbmcgdmFsdWUgc3BlY2lmaWVkICovCi0jZGVmaW5lIERTVF9LX1ZTX0ZPTExPV1MJCTB4ZmQJLyogdmFsdWUgc3BlYyBmb2xsb3dzICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19CSVRPRkZTCQkweGZmCS8qIHZhbHVlIGNvbnRhaW5zIGJpdCBvZmZzZXQgKi8KLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9MSVRFUkFMCTAKLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9BRERSCTEKLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9ERVNDCTIKLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9SRUcJMwotI2RlZmluZSBEU1RfS19SRUdfVkFYX0FQCTB4MGMJLyogUjEyICovCi0jZGVmaW5lIERTVF9LX1JFR19WQVhfRlAJMHgwZAkvKiBSMTMgKi8KLSNkZWZpbmUgRFNUX0tfUkVHX1ZBWF9TUAkweDBlCS8qIFIxNCAqLwotI2RlZmluZSBEU1RfVl9WQUxLSU5ECQkwCS8qIG9mZnNldCBvZiB2YWxraW5kIGZpZWxkICovCi0jZGVmaW5lIERTVF9WX0lORElSRUNUCQkyCS8qIG9mZnNldCB0byBpbmRpcmVjdCBiaXQgKi8KLSNkZWZpbmUgRFNUX1ZfRElTUAkJMwkvKiBvZmZzZXQgdG8gZGlzcGxhY2VtZW50IGJpdCAqLwotI2RlZmluZSBEU1RfVl9SRUdOVU0JCTQJLyogb2Zmc2V0IHRvIHJlZ2lzdGVyIG51bWJlciAqLwotI2RlZmluZSBEU1RfTV9JTkRJUkVDVAkJKDE8PERTVF9WX0lORElSRUNUKQotI2RlZmluZSBEU1RfTV9ESVNQCQkoMTw8RFNUX1ZfRElTUCkKLSNkZWZpbmUgREJHX0NfRlVOQ1RJT05fUEFSQU0JLyogMHhjOSAqLwlcCi0JKERTVF9LX1ZBTEtJTkRfQUREUnxEU1RfTV9ESVNQfChEU1RfS19SRUdfVkFYX0FQPDxEU1RfVl9SRUdOVU0pKQotI2RlZmluZSBEQkdfQ19MT0NBTF9TWU0JCS8qIDB4ZDkgKi8JXAotCShEU1RfS19WQUxLSU5EX0FERFJ8RFNUX01fRElTUHwoRFNUX0tfUkVHX1ZBWF9GUDw8RFNUX1ZfUkVHTlVNKSkKLS8qIEtpbmRzIG9mIHZhbHVlIHNwZWNpZmljYXRpb25zCi0gKi8KLSNkZWZpbmUgRFNUX0tfVlNfQUxMT0NfU1BMSVQJMwkvKiBzcGxpdCBsaWZldGltZSAqLwotLyogS2luZHMgb2YgdHlwZSBzcGVjaWZpY2F0aW9ucwotICovCi0jZGVmaW5lIERTVF9LX1RTX0FUT00JCTB4MDEJLyogYXRvbWljIHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotI2RlZmluZSBEU1RfS19UU19EU0MJCTB4MDIJLyogZGVzY3JpcHRvciB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfSU5ECQkweDAzCS8qIGluZGlyZWN0IHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotI2RlZmluZSBEU1RfS19UU19UUFRSCQkweDA0CS8qIHR5cGVkIHBvaW50ZXIgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX1BUUgkJMHgwNQkvKiBwb2ludGVyIHR5cGUgc3BlYyAqLwotI2RlZmluZSBEU1RfS19UU19BUlJBWQkJMHgwNwkvKiBhcnJheSB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfTk9WX0xFTkcJMHgwZQkvKiBub3ZlbCBsZW5ndGggdHlwZSBzcGVjICovCi0vKiAgVGhlc2UgYXJlIHRoZSBjb2RlcyB0aGF0IGFyZSB1c2VkIGluIHRoZSBzdWZmaXggcmVjb3JkcyB0byBkZXRlcm1pbmUgdGhlCi0gKiAgYWN0dWFsIGRhdGEgdHlwZQotICovCi0jZGVmaW5lIERCR19TX0NfQkFTSUMJCQlEU1RfS19UU19BVE9NCi0jZGVmaW5lIERCR19TX0NfQkFTSUNfQVJSQVkJCURTVF9LX1RTX0RTQwotI2RlZmluZSBEQkdfU19DX1NUUlVDVAkJCURTVF9LX1RTX0lORAotI2RlZmluZSBEQkdfU19DX1BPSU5URVIJCQlEU1RfS19UU19UUFRSCi0jZGVmaW5lIERCR19TX0NfVk9JRAkJCURTVF9LX1RTX1BUUgotI2RlZmluZSBEQkdfU19DX0NPTVBMRVhfQVJSQVkJCURTVF9LX1RTX0FSUkFZCi0KLSNlbmRpZgkvKiBXQU5UX1ZNU19PQkpfREVGUyAqLwotCi0vKiBlbmQgb2Ygb2JqLXZtcy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWEyOWsuYyBiL2dhcy9jb25maWcvdGMtYTI5ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDBmZWM1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYTI5ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5NiArMCwwIEBACi0vKiB0Yy1hMjlrLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBBTUQgMjkwMDAuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBKb2huIEdpbG1vcmUgaGFzIHJlb3JnYW5pemVkIHRoaXMgbW9kdWxlIHNvbWV3aGF0LCB0byBtYWtlIGl0IGVhc2llcgotICAgdG8gY29udmVydCBpdCB0byBuZXcgbWFjaGluZXMnIGFzc2VtYmxlcnMgYXMgZGVzaXJlZC4gIFRoZXJlIHdhcyB0b28KLSAgIG11Y2ggYmxvb2R5IHJld3JpdGluZyByZXF1aXJlZCBiZWZvcmUuICBUaGVyZSBzdGlsbCBwcm9iYWJseSBpcy4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvYTI5ay5oIgotCi0vKiBNYWtlIGl0IGVhc2llciB0byBjbG9uZSB0aGlzIG1hY2hpbmUgZGVzYyBpbnRvIGFub3RoZXIgb25lLiAgKi8KLSNkZWZpbmUJbWFjaGluZV9vcGNvZGUJYTI5a19vcGNvZGUKLSNkZWZpbmUJbWFjaGluZV9vcGNvZGVzCWEyOWtfb3Bjb2RlcwotI2RlZmluZQltYWNoaW5lX2lwCWEyOWtfaXAKLSNkZWZpbmUJbWFjaGluZV9pdAlhMjlrX2l0Ci0KLSNkZWZpbmUJSU1NRURJQVRFX0JJVAkweDAxMDAwMDAwCS8qIFR1cm5zIFJCIGludG8gSW1tZWRpYXRlICovCi0jZGVmaW5lCUFCU09MVVRFX0JJVAkweDAxMDAwMDAwCS8qIFR1cm5zIFBDLXJlbGF0aXZlIHRvIEFic29sdXRlICovCi0jZGVmaW5lCUNFX0JJVAkJMHgwMDgwMDAwMAkvKiBDb3Byb2Nlc3NvciBlbmFibGUgaW4gTE9BRCAqLwotI2RlZmluZQlVSV9CSVQJCTB4MDAwMDAwODAJLyogVW5zaWduZWQgaW50ZWdlciBpbiBDT05WRVJUICovCi0KLS8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoID0gTlVMTDsKLQotc3RydWN0IG1hY2hpbmVfaXQKLSAgewotICAgIGNoYXIgKmVycm9yOwotICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICAgIHN0cnVjdCBubGlzdCAqbmxpc3RwOwotICAgIGV4cHJlc3Npb25TIGV4cDsKLSAgICBpbnQgcGNyZWw7Ci0gICAgaW50IHJlbG9jX29mZnNldDsJCS8qIE9mZnNldCBvZiByZWxvYyB3aXRoaW4gaW5zbiAqLwotCi0gICAgaW50IHJlbG9jOwotICB9Ci10aGVfaW5zbjsKLQotc3RhdGljIHZvaWQgbWFjaGluZV9pcCBQQVJBTVMgKChjaGFyICpzdHIpKTsKLS8qIHN0YXRpYyB2b2lkIHByaW50X2luc24gUEFSQU1TICgoc3RydWN0IG1hY2hpbmVfaXQgKmluc24pKTsgKi8KLSNpZm5kZWYgT0JKX0NPRkYKLXN0YXRpYyB2b2lkIHNfZGF0YTEgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgc191c2UgUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQotY29uc3QgcHNldWRvX3R5cGVTCi1tZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCA0fSwKLSAgeyJibG9jayIsIHNfc3BhY2UsIDB9LAotICB7ImNwdXR5cGUiLCBzX2lnbm9yZSwgMH0sCS8qIENQVSBhcyAyOTAwMCBvciAyOTA1MCAqLwotICB7InJlZyIsIHNfbHN5bSwgMH0sCQkvKiBSZWdpc3RlciBlcXVhdGUsIHNhbWUgYXMgZXF1ICovCi0gIHsic3BhY2UiLCBzX2lnbm9yZSwgMH0sCS8qIExpc3RpbmcgY29udHJvbCAqLwotICB7InNlY3QiLCBzX2lnbm9yZSwgMH0sCS8qIENyZWF0aW9uIG9mIGNvZmYgc2VjdGlvbnMgKi8KLSNpZm5kZWYgT0JKX0NPRkYKLSAgLyogV2UgY2FuIGRvIHRoaXMgcmlnaHQgd2l0aCBjb2ZmLiAgKi8KLSAgeyJ1c2UiLCBzX3VzZSwgMH0sCi0jZW5kaWYKLSAgeyJ3b3JkIiwgY29ucywgNH0sCi0gIHtOVUxMLCAwLCAwfSwKLX07Ci0KLSNpZiBkZWZpbmVkKEJGRF9IRUFERVJTKQotI2lmZGVmIFJFTFNaCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IFJFTFNaOwkvKiBDb2ZmIGhlYWRlcnMgKi8KLSNlbHNlCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDEyOwkJLyogc29tZXRoaW5nIGVsc2UgaGVhZGVycyAqLwotI2VuZGlmCi0jZWxzZQotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSAxMjsJCS8qIE5vdCBiZmRpemVkKi8KLSNlbmRpZgotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzIHdvcmsgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFdlIG5lZWRlZCBhbiB1bnVzZWQgY2hhciBmb3IgbGluZSBzZXBhcmF0aW9uIHRvIHdvcmsgYXJvdW5kIHRoZQotICAgbGFjayBvZiBtYWNyb3MsIHVzaW5nIHNlZCBhbmQgc3VjaC4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiQCI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0vKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYy4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdAotICAgYWxsLCBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4gICovCi0KLS8qCi0gKiAgYW51bGwgYml0IC0gY2F1c2VzIHRoZSBicmFuY2ggZGVsYXkgc2xvdCBpbnN0cnVjdGlvbnMgdG8gbm90IGJlIGV4ZWN1dGVkCi0gKi8KLSNkZWZpbmUgQU5OVUwgICAgICAgKDEgPDwgMjkpCi0KLSNpZm5kZWYgT0JKX0NPRkYKLQotc3RhdGljIHZvaWQKLXNfdXNlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIudGV4dCIsIDUpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0gICAgICBzX3RleHQgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIi5kYXRhIiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLSAgICAgIHNfZGF0YSAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLmRhdGExIiwgNikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKLSAgICAgIHNfZGF0YTEgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAvKiBMaXRlcmFscyBjYW4ndCBnbyBpbiB0aGUgdGV4dCBzZWdtZW50IGJlY2F1c2UgeW91IGNhbid0IHJlYWQgZnJvbQotICAgICBpbnN0cnVjdGlvbiBtZW1vcnkgb24gc29tZSAyOWsncy4gIFNvLCBpbnRvIGluaXRpYWxpemVkIGRhdGEuICovCi0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIubGl0IiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNDsKLSAgICAgIHN1YnNlZ19zZXQgKFNFR19EQVRBLCAyMDApOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYXNfYmFkIChfKCJVbmtub3duIHNlZ21lbnQgdHlwZSIpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZGF0YTEgKCkKLXsKLSAgc3Vic2VnX3NldCAoU0VHX0RBVEEsIDEpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotLyogSW5zdGFsbCBzeW1ib2wgZGVmaW5pdGlvbiB0aGF0IG1hcHMgUkVHTkFNRSB0byBSRUdOTy4KLSAgIEZJWE1FLVNPT046ICBUaGVzZSBhcmUgbm90IHJlY29nbml6ZWQgaW4gbWl4ZWQgY2FzZS4gICovCi0KLXN0YXRpYyB2b2lkCi1pbnNlcnRfc3JlZyAocmVnbmFtZSwgcmVnbnVtKQotICAgICBjaGFyICpyZWduYW1lOwotICAgICBpbnQgcmVnbnVtOwotewotICAvKiBGSVhNRS1TT09OLCBwdXQgc29tZXRoaW5nIGluIHRoZXNlIHN5bXMgc28gdGhleSB3b24ndCBiZSBvdXRwdXQKLSAgICAgdG8gdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlLiAgKi8KLQotICAvKiBNdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBuYW1lcyBvZiB0aGUgc3BlY2lhbCByZWdpc3RlcnMuICAqLwotICBjaGFyIGJ1Zls4MF07Ci0gIGludCBpOwotCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKHJlZ25hbWUsIFNFR19SRUdJU1RFUiwgKHZhbHVlVCkgcmVnbnVtLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICBmb3IgKGkgPSAwOyByZWduYW1lW2ldOyBpKyspCi0gICAgYnVmW2ldID0gaXNsb3dlciAocmVnbmFtZVtpXSkgPyB0b3VwcGVyIChyZWduYW1lW2ldKSA6IHJlZ25hbWVbaV07Ci0gIGJ1ZltpXSA9ICdcMCc7Ci0KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoYnVmLCBTRUdfUkVHSVNURVIsICh2YWx1ZVQpIHJlZ251bSwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLX0KLQotLyogSW5zdGFsbCBzeW1ib2wgZGVmaW5pdGlvbnMgZm9yIGFzc29ydGVkIHNwZWNpYWwgcmVnaXN0ZXJzLgotICAgU2VlIEFTTTI5SyBSZWYgcGFnZSAyLTkuICAqLwotCi12b2lkCi1kZWZpbmVfc29tZV9yZWdzICgpCi17Ci0jZGVmaW5lIFNSRUcJMjU2Ci0KLSAgLyogUHJvdGVjdGVkIHNwZWNpYWwtcHVycG9zZSByZWdpc3RlciBuYW1lcyAqLwotICBpbnNlcnRfc3JlZyAoInZhYiIsIFNSRUcgKyAwKTsKLSAgaW5zZXJ0X3NyZWcgKCJvcHMiLCBTUkVHICsgMSk7Ci0gIGluc2VydF9zcmVnICgiY3BzIiwgU1JFRyArIDIpOwotICBpbnNlcnRfc3JlZyAoImNmZyIsIFNSRUcgKyAzKTsKLSAgaW5zZXJ0X3NyZWcgKCJjaGEiLCBTUkVHICsgNCk7Ci0gIGluc2VydF9zcmVnICgiY2hkIiwgU1JFRyArIDUpOwotICBpbnNlcnRfc3JlZyAoImNoYyIsIFNSRUcgKyA2KTsKLSAgaW5zZXJ0X3NyZWcgKCJyYnAiLCBTUkVHICsgNyk7Ci0gIGluc2VydF9zcmVnICgidG1jIiwgU1JFRyArIDgpOwotICBpbnNlcnRfc3JlZyAoInRtciIsIFNSRUcgKyA5KTsKLSAgaW5zZXJ0X3NyZWcgKCJwYzAiLCBTUkVHICsgMTApOwotICBpbnNlcnRfc3JlZyAoInBjMSIsIFNSRUcgKyAxMSk7Ci0gIGluc2VydF9zcmVnICgicGMyIiwgU1JFRyArIDEyKTsKLSAgaW5zZXJ0X3NyZWcgKCJtbXUiLCBTUkVHICsgMTMpOwotICBpbnNlcnRfc3JlZyAoImxydSIsIFNSRUcgKyAxNCk7Ci0KLSAgLyogQWRkaXRpb25hbCBwcm90ZWN0ZWQgc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVycyBmb3IgdGhlIDI5MDUwICovCi0gIGluc2VydF9zcmVnICgicnNuIiwgIFNSRUcgKyAxNSk7Ci0gIGluc2VydF9zcmVnICgicm1hMCIsIFNSRUcgKyAxNik7Ci0gIGluc2VydF9zcmVnICgicm1jMCIsIFNSRUcgKyAxNyk7Ci0gIGluc2VydF9zcmVnICgicm1hMSIsIFNSRUcgKyAxOCk7Ci0gIGluc2VydF9zcmVnICgicm1jMSIsIFNSRUcgKyAxOSk7Ci0gIGluc2VydF9zcmVnICgic3BjMCIsIFNSRUcgKyAyMCk7Ci0gIGluc2VydF9zcmVnICgic3BjMSIsIFNSRUcgKyAyMSk7Ci0gIGluc2VydF9zcmVnICgic3BjMiIsIFNSRUcgKyAyMik7Ci0gIGluc2VydF9zcmVnICgiaWJhMCIsIFNSRUcgKyAyMyk7Ci0gIGluc2VydF9zcmVnICgiaWJjMCIsIFNSRUcgKyAyNCk7Ci0gIGluc2VydF9zcmVnICgiaWJhMSIsIFNSRUcgKyAyNSk7Ci0gIGluc2VydF9zcmVnICgiaWJjMSIsIFNSRUcgKyAyNik7Ci0KLSAgLyogQWRkaXRpb25hbCByZWdpc3RlcnMgZm9yIHRoZSAyOTA0MC4gICovCi0gIGluc2VydF9zcmVnICgiZGJhIiwgU1JFRyArIDI3KTsKLSAgaW5zZXJ0X3NyZWcgKCJkYmMiLCBTUkVHICsgMjgpOwotICBpbnNlcnRfc3JlZyAoImNpciIsIFNSRUcgKyAyOSk7Ci0gIGluc2VydF9zcmVnICgiY2RyIiwgU1JFRyArIDMwKTsKLQotICAvKiBVbnByb3RlY3RlZCBzcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXIgbmFtZXMgKi8KLSAgaW5zZXJ0X3NyZWcgKCJpcGMiLCBTUkVHICsgMTI4KTsKLSAgaW5zZXJ0X3NyZWcgKCJpcGEiLCBTUkVHICsgMTI5KTsKLSAgaW5zZXJ0X3NyZWcgKCJpcGIiLCBTUkVHICsgMTMwKTsKLSAgaW5zZXJ0X3NyZWcgKCJxIiwgU1JFRyArIDEzMSk7Ci0gIGluc2VydF9zcmVnICgiYWx1IiwgU1JFRyArIDEzMik7Ci0gIGluc2VydF9zcmVnICgiYnAiLCBTUkVHICsgMTMzKTsKLSAgaW5zZXJ0X3NyZWcgKCJmYyIsIFNSRUcgKyAxMzQpOwotICBpbnNlcnRfc3JlZyAoImNyIiwgU1JFRyArIDEzNSk7Ci0gIGluc2VydF9zcmVnICgiZnBlIiwgU1JFRyArIDE2MCk7Ci0gIGluc2VydF9zcmVnICgiaW50ZSIsIFNSRUcgKyAxNjEpOwotICBpbnNlcnRfc3JlZyAoImZwcyIsIFNSRUcgKyAxNjIpOwotICAvKiAgIiIsICAgIFNSRUcrMTYzKTsJICBSZXNlcnZlZCAqLwotICBpbnNlcnRfc3JlZyAoImV4b3AiLCBTUkVHICsgMTY0KTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIEl0IHNob3VsZAotICAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMuLCB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgd2lsbAotICAgbmVlZC4gICovCi12b2lkCi1tZF9iZWdpbiAoKQotewotICByZWdpc3RlciBjb25zdCBjaGFyICpyZXR2YWwgPSBOVUxMOwotICBpbnQgbG9zZSA9IDA7Ci0gIHJlZ2lzdGVyIGludCBza2lwbmV4dCA9IDA7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotICByZWdpc3RlciBjaGFyICpzdHJlbmQsICpzdHJlbmQyOwotCi0gIC8qIEhhc2ggdXAgYWxsIHRoZSBvcGNvZGVzIGZvciBmYXN0IHVzZSBsYXRlci4gICovCi0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fb3Bjb2RlczsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtYWNoaW5lX29wY29kZXNbaV0ubmFtZTsKLQotICAgICAgaWYgKHNraXBuZXh0KQotCXsKLQkgIHNraXBuZXh0ID0gMDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSGFjayB0byBhdm9pZCBtdWx0aXBsZSBvcGNvZGUgZW50cmllcy4gIFdlIHByZS1sb2NhdGUgYWxsIHRoZQotCSB2YXJpYXRpb25zIChiL2kgZmllbGQgYW5kIFAvQSBmaWVsZCkgYW5kIGhhbmRsZSB0aGVtLiAqLwotCi0gICAgICBpZiAoIXN0cmNtcCAobmFtZSwgbWFjaGluZV9vcGNvZGVzW2kgKyAxXS5uYW1lKSkKLQl7Ci0JICBpZiAoKG1hY2hpbmVfb3Bjb2Rlc1tpXS5vcGNvZGUgJiAweDAxMDAwMDAwKSAhPSAwCi0JICAgICAgfHwgKG1hY2hpbmVfb3Bjb2Rlc1tpICsgMV0ub3Bjb2RlICYgMHgwMTAwMDAwMCkgPT0gMAotCSAgICAgIHx8ICgobWFjaGluZV9vcGNvZGVzW2ldLm9wY29kZSB8IDB4MDEwMDAwMDApCi0JCSAgIT0gbWFjaGluZV9vcGNvZGVzW2kgKyAxXS5vcGNvZGUpKQotCSAgICBnb3RvIGJhZF90YWJsZTsKLQkgIHN0cmVuZCA9IG1hY2hpbmVfb3Bjb2Rlc1tpXS5hcmdzICsgc3RybGVuIChtYWNoaW5lX29wY29kZXNbaV0uYXJncykgLSAxOwotCSAgc3RyZW5kMiA9IG1hY2hpbmVfb3Bjb2Rlc1tpICsgMV0uYXJncyArIHN0cmxlbiAobWFjaGluZV9vcGNvZGVzW2kgKyAxXS5hcmdzKSAtIDE7Ci0JICBzd2l0Y2ggKCpzdHJlbmQpCi0JICAgIHsKLQkgICAgY2FzZSAnYic6Ci0JICAgICAgaWYgKCpzdHJlbmQyICE9ICdpJykKLQkJZ290byBiYWRfdGFibGU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ1AnOgotCSAgICAgIGlmICgqc3RyZW5kMiAhPSAnQScpCi0JCWdvdG8gYmFkX3RhYmxlOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICBiYWRfdGFibGU6Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhbmRsZSBvcGNvZGUgJXNcbiIsCi0JCSAgICAgICBuYW1lKTsKLQkgICAgICBsb3NlID0gMTsKLQkgICAgfQotCi0JICAvKiBPSywgdGhpcyBpcyBhbiBpL2Igb3IgQS9QIHBhaXIuICBXZSBza2lwIHRoZQotCSAgICAgaGlnaGVyLXZhbHVlZCBvbmUsIGFuZCBsZXQgdGhlIGNvZGUgZm9yIG9wZXJhbmQgY2hlY2tpbmcKLQkgICAgIGhhbmRsZSBPUi1pbmcgaW4gdGhlIGJpdC4gICovCi0JICBza2lwbmV4dCA9IDE7Ci0JfQotCi0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgbmFtZSwgKFBUUikgJm1hY2hpbmVfb3Bjb2Rlc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsICE9IE5VTEwpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIsCi0JCSAgIG1hY2hpbmVfb3Bjb2Rlc1tpXS5uYW1lLCByZXR2YWwpOwotCSAgbG9zZSA9IDE7Ci0JfQotICAgIH0KLQotICBpZiAobG9zZSkKLSAgICBhc19mYXRhbCAoXygiQnJva2VuIGFzc2VtYmxlci4gIE5vIGFzc2VtYmx5IGF0dGVtcHRlZC4iKSk7Ci0KLSAgZGVmaW5lX3NvbWVfcmVncyAoKTsKLX0KLQotLyogQXNzZW1ibGUgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uICBJdHMgbGFiZWwgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkCi0gICBieSB0aGUgZ2VuZXJpYyBmcm9udCBlbmQuICBXZSBqdXN0IHBhcnNlIG9wY29kZSBhbmQgb3BlcmFuZHMsIGFuZAotICAgcHJvZHVjZSB0aGUgYnl0ZXMgb2YgZGF0YSBhbmQgcmVsb2NhdGlvbi4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqdG9QOwotCi0gIGtub3cgKHN0cik7Ci0gIG1hY2hpbmVfaXAgKHN0cik7Ci0gIHRvUCA9IGZyYWdfbW9yZSAoNCk7Ci0gIC8qIHB1dCBvdXQgdGhlIG9wY29kZSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvUCwgdGhlX2luc24ub3Bjb2RlLCA0KTsKLQotICAvKiBwdXQgb3V0IHRoZSBzeW1ib2wtZGVwZW5kZW50IHN0dWZmICovCi0gIGlmICh0aGVfaW5zbi5yZWxvYyAhPSBOT19SRUxPQykKLSAgICB7Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICh0b1AgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIHRoZV9pbnNuLnJlbG9jX29mZnNldCksCi0JCSAgIDQsCQkvKiBzaXplICovCi0JCSAgICZ0aGVfaW5zbi5leHAsCi0JCSAgIHRoZV9pbnNuLnBjcmVsLAotCQkgICB0aGVfaW5zbi5yZWxvYyk7Ci0gICAgfQotfQotCi1jaGFyICoKLXBhcnNlX29wZXJhbmQgKHMsIG9wZXJhbmRwLCBvcHQpCi0gICAgIGNoYXIgKnM7Ci0gICAgIGV4cHJlc3Npb25TICpvcGVyYW5kcDsKLSAgICAgaW50IG9wdDsKLXsKLSAgY2hhciAqc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2hhciAqbmV3OwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0gIGV4cHJlc3Npb24gKG9wZXJhbmRwKTsKLSAgaWYgKG9wZXJhbmRwLT5YX29wID09IE9fYWJzZW50ICYmICEgb3B0KQotICAgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotICBuZXcgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIEluc3RydWN0aW9uIHBhcnNpbmcuICBUYWtlcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBvcGNvZGUuCi0gICBPcGVyYW5kcyBhcmUgYXQgaW5wdXRfbGluZV9wb2ludGVyLiAgT3V0cHV0IGlzIGluIHRoZV9pbnNuLgotICAgV2FybmluZ3Mgb3IgZXJyb3JzIGFyZSBnZW5lcmF0ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotbWFjaGluZV9pcCAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnM7Ci0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIHN0cnVjdCBtYWNoaW5lX29wY29kZSAqaW5zbjsKLSAgY2hhciAqYXJnc1N0YXJ0OwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgZXhwcmVzc2lvblMgdGhlX29wZXJhbmQ7Ci0gIGV4cHJlc3Npb25TICpvcGVyYW5kID0gJnRoZV9vcGVyYW5kOwotICB1bnNpZ25lZCBpbnQgcmVnOwotCi0gIC8qIE11c3QgaGFuZGxlIGBkaXYwJyBvcGNvZGUuICAqLwotICBzID0gc3RyOwotICBpZiAoaXNhbHBoYSAoKnMpKQotICAgIGZvciAoOyBpc2FsbnVtICgqcyk7ICsrcykKLSAgICAgIGlmIChpc3VwcGVyICgqcykpCi0JKnMgPSB0b2xvd2VyICgqcyk7Ci0KLSAgc3dpdGNoICgqcykKLSAgICB7Ci0gICAgY2FzZSAnXDAnOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcgJzoJCQkvKiBGSVhNRS1TT01FREFZIG1vcmUgd2hpdGVzcGFjZSAqLwotICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oIlVua25vd24gb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoKGluc24gPSAoc3RydWN0IG1hY2hpbmVfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgc3RyKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlVua25vd24gb3Bjb2RlIGAlcycuIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBhcmdzU3RhcnQgPSBzOwotICBvcGNvZGUgPSBpbnNuLT5vcGNvZGU7Ci0gIG1lbXNldCAoJnRoZV9pbnNuLCAnXDAnLCBzaXplb2YgKHRoZV9pbnNuKSk7Ci0gIHRoZV9pbnNuLnJlbG9jID0gTk9fUkVMT0M7Ci0KLSAgLyogQnVpbGQgdGhlIG9wY29kZSwgY2hlY2tpbmcgYXMgd2UgZ28gdG8gbWFrZSBzdXJlIHRoYXQgdGhlCi0gICAgIG9wZXJhbmRzIG1hdGNoLgotICAgCi0gICAgIElmIGFuIG9wZXJhbmQgbWF0Y2hlcywgd2UgbW9kaWZ5IHRoZV9pbnNuIG9yIG9wY29kZSBhcHByb3ByaWF0ZWx5LAotICAgICBhbmQgZG8gYSAiY29udGludWUiLiAgSWYgYW4gb3BlcmFuZCBmYWlscyB0byBtYXRjaCwgd2UgImJyZWFrIi4gICovCi0KLSAgaWYgKGluc24tPmFyZ3NbMF0gIT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBQcmltZSB0aGUgcHVtcC4gICovCi0gICAgICBzID0gcGFyc2Vfb3BlcmFuZCAocywgb3BlcmFuZCwgaW5zbi0+YXJnc1swXSA9PSAnSScpOwotICAgIH0KLQotICBmb3IgKGFyZ3MgPSBpbnNuLT5hcmdzOzsgKythcmdzKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKmFyZ3MpCi0JewotCi0JY2FzZSAnXDAnOgkJLyogZW5kIG9mIGFyZ3MgKi8KLQkgIGlmICgqcyA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgLyogV2UgYXJlIHRydWx5IGRvbmUuICovCi0JICAgICAgdGhlX2luc24ub3Bjb2RlID0gb3Bjb2RlOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgYXNfYmFkIChfKCJUb28gbWFueSBvcGVyYW5kczogJXMiKSwgcyk7Ci0JICBicmVhazsKLQotCWNhc2UgJywnOgkJLyogTXVzdCBtYXRjaCBhIGNvbW1hICovCi0JICBpZiAoKnMrKyA9PSAnLCcpCi0JICAgIHsKLQkgICAgICAvKiBQYXJzZSBuZXh0IG9wZXJhbmQuICAqLwotCSAgICAgIHMgPSBwYXJzZV9vcGVyYW5kIChzLCBvcGVyYW5kLCBhcmdzWzFdID09ICdJJyk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAndic6CQkvKiBUcmFwIG51bWJlcnMgKGltbWVkaWF0ZSBmaWVsZCkgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBpZiAob3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgMjU2KQotCQl7Ci0JCSAgb3Bjb2RlIHw9IChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgMTYpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNfYmFkIChfKCJJbW1lZGlhdGUgdmFsdWUgb2YgJWxkIGlzIHRvbyBsYXJnZSIpLAotCQkJICAobG9uZykgb3BlcmFuZC0+WF9hZGRfbnVtYmVyKTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0JICB0aGVfaW5zbi5yZWxvYyA9IFJFTE9DXzg7Ci0JICB0aGVfaW5zbi5yZWxvY19vZmZzZXQgPSAxOwkvKiBCSUctRU5ESUFOIEJ5dGUgMSBvZiBpbnNuICovCi0JICB0aGVfaW5zbi5leHAgPSAqb3BlcmFuZDsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnYic6CQkvKiBBIGdlbmVyYWwgcmVnaXN0ZXIgb3IgOC1iaXQgaW1tZWRpYXRlICovCi0JY2FzZSAnaSc6Ci0JICAvKiBXZSB0cmVhdCB0aGUgdHdvIGNhc2VzIGlkZW50aWNhbGx5IHNpbmNlIHdlIG1hc2hlZAotCSAgICAgdGhlbSB0b2dldGhlciBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fcmVnaXN0ZXIpCi0JICAgIGdvdG8gZ2VuZXJhbF9yZWc7Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGUgJ2knIGNhc2UgcmVhbGx5IGV4aXN0cy4gICovCi0JICBpZiAoKGluc24tPm9wY29kZSB8IElNTUVESUFURV9CSVQpICE9IChpbnNuICsgMSktPm9wY29kZSkKLQkgICAgYnJlYWs7Ci0KLQkgIG9wY29kZSB8PSBJTU1FRElBVEVfQklUOwotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIGlmIChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCAyNTYpCi0JCXsKLQkJICBvcGNvZGUgfD0gb3BlcmFuZC0+WF9hZGRfbnVtYmVyOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNfYmFkIChfKCJJbW1lZGlhdGUgdmFsdWUgb2YgJWxkIGlzIHRvbyBsYXJnZSIpLAotCQkJICAobG9uZykgb3BlcmFuZC0+WF9hZGRfbnVtYmVyKTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0JICB0aGVfaW5zbi5yZWxvYyA9IFJFTE9DXzg7Ci0JICB0aGVfaW5zbi5yZWxvY19vZmZzZXQgPSAzOwkvKiBCSUctRU5ESUFOIEJ5dGUgMyBvZiBpbnNuICovCi0JICB0aGVfaW5zbi5leHAgPSAqb3BlcmFuZDsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnYSc6CQkvKiBuZXh0IG9wZXJhbmQgbXVzdCBiZSBhIHJlZ2lzdGVyICovCi0JY2FzZSAnYyc6Ci0JZ2VuZXJhbF9yZWc6Ci0JICAvKiBsck5OTiBvciBnck5OTiBvciAlJWV4cHIgb3IgYSB1c2VyLWRlZiByZWdpc3RlciBuYW1lICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCAhPSBPX3JlZ2lzdGVyKQotCSAgICBicmVhazsJCS8qIE9ubHkgcmVnaXN0ZXJzICovCi0JICBrbm93IChvcGVyYW5kLT5YX2FkZF9zeW1ib2wgPT0gMCk7Ci0JICBrbm93IChvcGVyYW5kLT5YX29wX3N5bWJvbCA9PSAwKTsKLQkgIHJlZyA9IG9wZXJhbmQtPlhfYWRkX251bWJlcjsKLQkgIGlmIChyZWcgPj0gU1JFRykKLQkgICAgYnJlYWs7CQkvKiBObyBzcGVjaWFsIHJlZ2lzdGVycyAqLwotCi0JICAvKiBHb3QgdGhlIHJlZ2lzdGVyLCBub3cgZmlndXJlIG91dCB3aGVyZSBpdCBnb2VzIGluIHRoZQotCSAgICAgb3Bjb2RlLiAgKi8KLQkgIHN3aXRjaCAoKmFyZ3MpCi0JICAgIHsKLQkgICAgY2FzZSAnYSc6Ci0JICAgICAgb3Bjb2RlIHw9IHJlZyA8PCA4OwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ2InOgotCSAgICBjYXNlICdpJzoKLQkgICAgICBvcGNvZGUgfD0gcmVnOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ2MnOgotCSAgICAgIG9wY29kZSB8PSByZWcgPDwgMTY7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAneCc6CQkvKiAxNiBiaXQgY29uc3RhbnQsIHplcm8tZXh0ZW5kZWQgKi8KLQljYXNlICdYJzoJCS8qIDE2IGJpdCBjb25zdGFudCwgb25lLWV4dGVuZGVkICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgb3Bjb2RlIHw9IChvcGVyYW5kLT5YX2FkZF9udW1iZXIgJiAweEZGKSA8PCAwIHwKLQkJKChvcGVyYW5kLT5YX2FkZF9udW1iZXIgJiAweEZGMDApIDw8IDgpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICB0aGVfaW5zbi5yZWxvYyA9IFJFTE9DX0NPTlNUOwotCSAgdGhlX2luc24uZXhwID0gKm9wZXJhbmQ7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ2gnOgotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIG9wY29kZSB8PSAob3BlcmFuZC0+WF9hZGRfbnVtYmVyICYgMHgwMEZGMDAwMCkgPj4gMTYgfAotCQkoKCh1bnNpZ25lZCBsb25nKSBvcGVyYW5kLT5YX2FkZF9udW1iZXIKLQkJICAvKiBhdm9pZCBzaWduIGV4dCAqLyAgJiAweEZGMDAwMDAwKSA+PiA4KTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgdGhlX2luc24ucmVsb2MgPSBSRUxPQ19DT05TVEg7Ci0JICB0aGVfaW5zbi5leHAgPSAqb3BlcmFuZDsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnUCc6CQkvKiBQQy1yZWxhdGl2ZSBqdW1wIGFkZHJlc3MgKi8KLQljYXNlICdBJzoJCS8qIEFic29sdXRlIGp1bXAgYWRkcmVzcyAqLwotCSAgLyogVGhlc2UgdHdvIGFyZSB0cmVhdGVkIHRvZ2V0aGVyIHNpbmNlIHdlIGZvbGRlZCB0aGUKLQkgICAgIG9wY29kZSB0YWJsZSBlbnRyaWVzIHRvZ2V0aGVyLiAgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICAvKiBNYWtlIHN1cmUgdGhlICdBJyBjYXNlIHJlYWxseSBleGlzdHMuICAqLwotCSAgICAgIGlmICgoaW5zbi0+b3Bjb2RlIHwgQUJTT0xVVEVfQklUKSAhPSAoaW5zbiArIDEpLT5vcGNvZGUpCi0JCWJyZWFrOwotCSAgICAgIHsKLQkJYmZkX3ZtYSB2LCBtYXNrOwotCQltYXNrID0gMHgxZmZmZjsKLQkJdiA9IG9wZXJhbmQtPlhfYWRkX251bWJlciAmIH4gbWFzazsKLQkJaWYgKHYpCi0JCSAgYXNfYmFkICgiY2FsbC9qbXAgdGFyZ2V0IG91dCBvZiByYW5nZSIpOwotCSAgICAgIH0KLQkgICAgICBvcGNvZGUgfD0gQUJTT0xVVEVfQklUIHwKLQkJKG9wZXJhbmQtPlhfYWRkX251bWJlciAmIDB4MDAwM0ZDMDApIDw8IDYgfAotCQkoKG9wZXJhbmQtPlhfYWRkX251bWJlciAmIDB4MDAwMDAzRkMpID4+IDIpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICB0aGVfaW5zbi5yZWxvYyA9IFJFTE9DX0pVTVBUQVJHOwotCSAgdGhlX2luc24uZXhwID0gKm9wZXJhbmQ7Ci0JICB0aGVfaW5zbi5wY3JlbCA9IDE7CS8qIEFzc3VtZSBQQy1yZWxhdGl2ZSBqdW1wICovCi0JICAvKiBGSVhNRS1TT09OLCBEbyB3ZSBmaWd1cmUgb3V0IHdoZXRoZXIgYWJzIGxhdGVyLCBhZnRlcgotICAgICAgICAgICAgIGtub3cgc3ltIHZhbD8gKi8KLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnZSc6CQkvKiBDb3Byb2Nlc3NvciBlbmFibGUgYml0IGZvciBMT0FEL1NUT1JFIGluc24gKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBpZiAob3BlcmFuZC0+WF9hZGRfbnVtYmVyID09IDApCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmIChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPT0gMSkKLQkJewotCQkgIG9wY29kZSB8PSBDRV9CSVQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICduJzoJCS8qIENvbnRyb2wgYml0cyBmb3IgTE9BRC9TVE9SRSBpbnN0cnVjdGlvbnMgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQgJiYKLQkgICAgICBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCAxMjgpCi0JICAgIHsKLQkgICAgICBvcGNvZGUgfD0gKG9wZXJhbmQtPlhfYWRkX251bWJlciA8PCAxNik7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAncyc6CQkvKiBTcGVjaWFsIHJlZ2lzdGVyIG51bWJlciAqLwotCSAgaWYgKG9wZXJhbmQtPlhfb3AgIT0gT19yZWdpc3RlcikKLQkgICAgYnJlYWs7CQkvKiBPbmx5IHJlZ2lzdGVycyAqLwotCSAgaWYgKG9wZXJhbmQtPlhfYWRkX251bWJlciA8IFNSRUcpCi0JICAgIGJyZWFrOwkJLyogTm90IGEgc3BlY2lhbCByZWdpc3RlciAqLwotCSAgb3Bjb2RlIHw9IChvcGVyYW5kLT5YX2FkZF9udW1iZXIgJiAweEZGKSA8PCA4OwotCSAgY29udGludWU7Ci0KLQljYXNlICd1JzoJCS8qIFVJIGJpdCBvZiBDT05WRVJUICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgaWYgKG9wZXJhbmQtPlhfYWRkX251bWJlciA9PSAwKQotCQljb250aW51ZTsKLQkgICAgICBpZiAob3BlcmFuZC0+WF9hZGRfbnVtYmVyID09IDEpCi0JCXsKLQkJICBvcGNvZGUgfD0gVUlfQklUOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAncic6CQkvKiBSTkQgYml0cyBvZiBDT05WRVJUICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50ICYmCi0JICAgICAgb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgOCkKLQkgICAgewotCSAgICAgIG9wY29kZSB8PSBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgNDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdJJzoJCS8qIElEIGJpdHMgb2YgSU5WIGFuZCBJUkVUSU5WLiAgKi8KLQkgIC8qIFRoaXMgb3BlcmFuZCBpcyBvcHRpb25hbC4gICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2Fic2VudCkKLQkgICAgY29udGludWU7Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQKLQkJICAgJiYgb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgNCkKLQkgICAgewotCSAgICAgIG9wY29kZSB8PSBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgMTY7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnZCc6CQkvKiBGRCBiaXRzIG9mIENPTlZFUlQgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQgJiYKLQkgICAgICBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCA0KQotCSAgICB7Ci0JICAgICAgb3Bjb2RlIHw9IG9wZXJhbmQtPlhfYWRkX251bWJlciA8PCAyOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCi0JY2FzZSAnZic6CQkvKiBGUyBiaXRzIG9mIENPTlZFUlQgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQgJiYKLQkgICAgICBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCA0KQotCSAgICB7Ci0JICAgICAgb3Bjb2RlIHw9IG9wZXJhbmQtPlhfYWRkX251bWJlciA8PCAwOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ0MnOgotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCAmJgotCSAgICAgIG9wZXJhbmQtPlhfYWRkX251bWJlciA8IDQpCi0JICAgIHsKLQkgICAgICBvcGNvZGUgfD0gb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDw8IDE2OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ0YnOgotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCAmJgotCSAgICAgIG9wZXJhbmQtPlhfYWRkX251bWJlciA8IDE2KQotCSAgICB7Ci0JICAgICAgb3Bjb2RlIHw9IG9wZXJhbmQtPlhfYWRkX251bWJlciA8PCAxODsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgQkFEX0NBU0UgKCphcmdzKTsKLQl9Ci0gICAgICAvKiBUeXBlcyBvciB2YWx1ZXMgb2YgYXJncyBkb24ndCBtYXRjaC4gICovCi0gICAgICBhc19iYWQgKCJJbnZhbGlkIG9wZXJhbmRzIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUgbWRfYXRvZiBpbiBtNjhrLmMuICBJIHRoaW5rIHRoaXMgaXMgcmlnaHQsCi0gICBidXQgSSdtIG5vdCBzdXJlLgotCi0gICBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIG9mIHR5cGUgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIKLSAgIG9mIExJVFRMRU5VTVMgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMKLSAgIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLQotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiAiQmFkIGNhbGwgdG8gTURfQVRPRigpIjsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIFdyaXRlIG91dCBiaWctZW5kaWFuLgotICovCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbDsJLyogUmVtZW1iZXIgdmFsdWUgZm9yIGVtaXRfcmVsb2MgKi8KLQotCi0gIGtub3cgKGZpeFAtPmZ4X3NpemUgPT0gNCk7Ci0gIGtub3cgKGZpeFAtPmZ4X3JfdHlwZSA8IE5PX1JFTE9DKTsKLQotICAvKiBUaGlzIGlzIGEgaGFjay4gIFRoZXJlIHNob3VsZCBiZSBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXMuICAqLwotICBpZiAoZml4UC0+Znhfcl90eXBlID09IFJFTE9DX1dESVNQMzAgJiYgZml4UC0+ZnhfYWRkc3kpCi0gICAgewotICAgICAgdmFsICs9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLSAgICB9Ci0KLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotCi0gICAgY2FzZSBSRUxPQ18zMjoKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiAyNDsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAxNjsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DXzg6Ci0gICAgICBidWZbMF0gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfV0RJU1AzMDoKLSAgICAgIHZhbCA9ICh2YWwgPj49IDIpICsgMTsKLSAgICAgIGJ1ZlswXSB8PSAodmFsID4+IDI0KSAmIDB4M2Y7Ci0gICAgICBidWZbMV0gPSAodmFsID4+IDE2KTsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0hJMjI6Ci0gICAgICBidWZbMV0gfD0gKHZhbCA+PiAyNikgJiAweDNmOwotICAgICAgYnVmWzJdID0gdmFsID4+IDE4OwotICAgICAgYnVmWzNdID0gdmFsID4+IDEwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0xPMTA6Ci0gICAgICBidWZbMl0gfD0gKHZhbCA+PiA4KSAmIDB4MDM7Ci0gICAgICBidWZbM10gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfQkFTRTEzOgotICAgICAgYnVmWzJdIHw9ICh2YWwgPj4gOCkgJiAweDFmOwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX1dESVNQMjI6Ci0gICAgICB2YWwgPSAodmFsID4+PSAyKSArIDE7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgUkVMT0NfQkFTRTIyOgotICAgICAgYnVmWzFdIHw9ICh2YWwgPj4gMTYpICYgMHgzZjsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0pVTVBUQVJHOgkvKiAwMFhYMDBYWCBwYXR0ZXJuIGluIGEgd29yZCAqLwotICAgICAgaWYgKCFmaXhQLT5meF9kb25lKQotCXsKLQkgIC8qIFRoZSBsaW5rZXIgdHJpZXMgdG8gc3VwcG9ydCBib3RoIEFNRCBhbmQgb2xkIEdOVSBzdHlsZQotICAgICAgICAgICAgIFJfSVJFTCByZWxvY3MuICBUaGF0IG1lYW5zIHRoYXQgaWYgdGhlIGFkZGVuZCBpcyBleGFjdGx5Ci0gICAgICAgICAgICAgdGhlIG5lZ2F0aXZlIG9mIHRoZSBhZGRyZXNzIHdpdGhpbiB0aGUgc2VjdGlvbiwgdGhlCi0gICAgICAgICAgICAgbGlua2VyIHdpbGwgbm90IGhhbmRsZSBpdCBjb3JyZWN0bHkuICAqLwotCSAgaWYgKGZpeFAtPmZ4X3BjcmVsCi0JICAgICAgJiYgdmFsICE9IDAKLQkgICAgICAmJiB2YWwgPT0gLSAoZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlKSkKLQkgICAgYXNfYmFkX3doZXJlCi0JICAgICAgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JICAgICAgICJ0aGUgbGlua2VyIHdpbGwgbm90IGhhbmRsZSB0aGlzIHJlbG9jYXRpb24gY29ycmVjdGx5Iik7Ci0JfQotICAgICAgZWxzZSBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JewotCSAgbG9uZyB2ID0gdmFsID4+IDE3OwotCSAgaWYgKHYgIT0gMCAmJiB2ICE9IC0xKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICJjYWxsL2ptcCB0YXJnZXQgb3V0IG9mIHJhbmdlIik7Ci0JfQotICAgICAgZWxzZQotCS8qIHRoaXMgY2FzZSB3YXMgc3VwcG9zZWQgdG8gYmUgaGFuZGxlZCBpbiBtYWNoaW5lX2lwICovCi0JYWJvcnQgKCk7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMTA7CS8qIEhvbGRzIGJpdHMgMDAwM0ZGRkMgb2YgYWRkcmVzcyAqLwotICAgICAgYnVmWzNdID0gdmFsID4+IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfQ09OU1Q6CQkvKiAwMFhYMDBYWCBwYXR0ZXJuIGluIGEgd29yZCAqLwotICAgICAgYnVmWzFdID0gdmFsID4+IDg7CS8qIEhvbGRzIGJpdHMgMDAwMFhYWFggKi8KLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19DT05TVEg6CQkvKiAwMFhYMDBYWCBwYXR0ZXJuIGluIGEgd29yZCAqLwotICAgICAgYnVmWzFdID0gdmFsID4+IDI0OwkvKiBIb2xkcyBiaXRzIFhYWFgwMDAwICovCi0gICAgICBidWZbM10gPSB2YWwgPj4gMTY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTk9fUkVMT0M6Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygiYmFkIHJlbG9jYXRpb24gdHlwZTogMHglMDJ4IiksIGZpeFAtPmZ4X3JfdHlwZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLSNpZmRlZiBPQkpfQ09GRgotc2hvcnQKLXRjX2NvZmZfZml4MnJ0eXBlIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJFTE9DXzMyOgotICAgICAgcmV0dXJuIChSX1dPUkQpOwotICAgIGNhc2UgUkVMT0NfODoKLSAgICAgIHJldHVybiAoUl9CWVRFKTsKLSAgICBjYXNlIFJFTE9DX0NPTlNUOgotICAgICAgcmV0dXJuIChSX0lMT0hBTEYpOwotICAgIGNhc2UgUkVMT0NfQ09OU1RIOgotICAgICAgcmV0dXJuIChSX0lISUhBTEYpOwotICAgIGNhc2UgUkVMT0NfSlVNUFRBUkc6Ci0gICAgICByZXR1cm4gKFJfSVJFTCk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50ZiAoXygibmVlZCAlbzNcbiIpLCBmaXhQLT5meF9yX3R5cGUpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQkJCQkvKiBzd2l0Y2ggb24gdHlwZSAqLwotCi0gIHJldHVybiAoMCk7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCi0vKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciAyOWsgKi8KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VnOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGFzX2ZhdGFsIChfKCJhMjlrX2NvbnZlcnRfZnJhZ1xuIikpOwotfQotCi0vKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciBhMjlrICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VndHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICBzZWdUIHNlZ3R5cGU7Ci17Ci0gIGFzX2ZhdGFsIChfKCJhMjlrX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4XG4iKSk7Ci0gIHJldHVybiAwOwotfQotCi0jaWYgMAotLyogZm9yIGRlYnVnZ2luZyBvbmx5ICovCi1zdGF0aWMgdm9pZAotcHJpbnRfaW5zbiAoaW5zbikKLSAgICAgc3RydWN0IG1hY2hpbmVfaXQgKmluc247Ci17Ci0gIGNoYXIgKlJlbG9jW10gPQotICB7Ci0gICAgIlJFTE9DXzgiLAotICAgICJSRUxPQ18xNiIsCi0gICAgIlJFTE9DXzMyIiwKLSAgICAiUkVMT0NfRElTUDgiLAotICAgICJSRUxPQ19ESVNQMTYiLAotICAgICJSRUxPQ19ESVNQMzIiLAotICAgICJSRUxPQ19XRElTUDMwIiwKLSAgICAiUkVMT0NfV0RJU1AyMiIsCi0gICAgIlJFTE9DX0hJMjIiLAotICAgICJSRUxPQ18yMiIsCi0gICAgIlJFTE9DXzEzIiwKLSAgICAiUkVMT0NfTE8xMCIsCi0gICAgIlJFTE9DX1NGQV9CQVNFIiwKLSAgICAiUkVMT0NfU0ZBX09GRjEzIiwKLSAgICAiUkVMT0NfQkFTRTEwIiwKLSAgICAiUkVMT0NfQkFTRTEzIiwKLSAgICAiUkVMT0NfQkFTRTIyIiwKLSAgICAiUkVMT0NfUEMxMCIsCi0gICAgIlJFTE9DX1BDMjIiLAotICAgICJSRUxPQ19KTVBfVEJMIiwKLSAgICAiUkVMT0NfU0VHT0ZGMTYiLAotICAgICJSRUxPQ19HTE9CX0RBVCIsCi0gICAgIlJFTE9DX0pNUF9TTE9UIiwKLSAgICAiUkVMT0NfUkVMQVRJVkUiLAotICAgICJOT19SRUxPQyIKLSAgfTsKLQotICBpZiAoaW5zbi0+ZXJyb3IpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1I6ICVzXG4iKTsKLSAgICB9Ci0gIGZwcmludGYgKHN0ZGVyciwgIm9wY29kZT0weCUwOHhcbiIsIGluc24tPm9wY29kZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgInJlbG9jID0gJXNcbiIsIFJlbG9jW2luc24tPnJlbG9jXSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImV4cCA9ICB7XG4iKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXHRcdFhfYWRkX3N5bWJvbCA9ICVzXG4iLAotCSAgIGluc24tPmV4cC5YX2FkZF9zeW1ib2wgPwotCSAgIChTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9hZGRfc3ltYm9sKSA/Ci0JICAgIFNfR0VUX05BTUUgKGluc24tPmV4cC5YX2FkZF9zeW1ib2wpIDogIj8/PyIpIDogIjAiKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXHRcdFhfb3Bfc3ltYm9sID0gJXNcbiIsCi0JICAgaW5zbi0+ZXhwLlhfb3Bfc3ltYm9sID8KLQkgICAoU19HRVRfTkFNRSAoaW5zbi0+ZXhwLlhfb3Bfc3ltYm9sKSA/Ci0JICAgIFNfR0VUX05BTUUgKGluc24tPmV4cC5YX29wX3N5bWJvbCkgOiAiPz8/IikgOiAiMCIpOwotICBmcHJpbnRmIChzdGRlcnIsICJcdFx0WF9hZGRfbnVtYmVyID0gJWRcbiIsCi0JICAgaW5zbi0+ZXhwLlhfYWRkX251bWJlcik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIn1cbiIpOwotfQotCi0jZW5kaWYKLQotLyogVHJhbnNsYXRlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyB0byB0YXJnZXQgZm9ybWF0LgotCi0gICBPbiBzcGFyYy8yOWs6IGZpcnN0IDQgYnl0ZXMgYXJlIG5vcm1hbCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIG5leHQgdGhyZWUKLSAgIGJ5dGVzIGFyZSBpbmRleCwgbW9zdCBzaWcuIGJ5dGUgZmlyc3QuICBCeXRlIDcgaXMgYnJva2VuIHVwIHdpdGgKLSAgIGJpdCA3IGFzIGV4dGVybmFsLCBiaXRzIDYgJiA1IHVudXNlZCwgYW5kIHRoZSBsb3dlcgotICAgZml2ZSBiaXRzIGFzIHJlbG9jYXRpb24gdHlwZS4gIE5leHQgNCBieXRlcyBhcmUgbG9uZyBhZGRlbmQuICovCi0vKiBUaGFueCBhbmQgYSB0aXAgb2YgdGhlIGhhdCB0byBNaWNoYWVsIEJsb29tLCBtYkB0dGlkY2EudHRpLmNvbSAqLwotCi0jaWZkZWYgT0JKX0FPVVQKLQotdm9pZAotdGNfYW91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICBsb25nIHJfc3ltYm9sbnVtOwotCi0gIGtub3cgKGZpeFAtPmZ4X3JfdHlwZSA8IE5PX1JFTE9DKTsKLSAga25vdyAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCk7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwKLSAgICAgICBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSwKLQkJICAgICAgNCk7Ci0KLSAgcl9zeW1ib2xudW0gPSAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkJID8gU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpCi0JCSA6IGZpeFAtPmZ4X2FkZHN5LT5zeV9udW1iZXIpOwotCi0gIHdoZXJlWzRdID0gKHJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB3aGVyZVs1XSA9IChyX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB3aGVyZVs2XSA9IHJfc3ltYm9sbnVtICYgMHgwZmY7Ci0gIHdoZXJlWzddID0gKCgoIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpKSA8PCA3KSAmIDB4ODApIHwgKDAgJiAweDYwKSB8IChmaXhQLT5meF9yX3R5cGUgJiAweDFGKTsKLSAgLyogQWxzbyBlYXN5ICovCi0gIG1kX251bWJlcl90b19jaGFycyAoJndoZXJlWzhdLCBmaXhQLT5meF9hZGRudW1iZXIsIDQpOwotfQotCi0jZW5kaWYgLyogT0JKX0FPVVQgKi8KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci19Ci0MCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgbGluZSBpcyB1bnJlY29nbml6ZWQuICBUaGlzIGlzIHVzZWQgdG8gaGFuZGxlCi0gICBkZWZpbml0aW9ucyBvZiBhMjlrIHN0eWxlIGxvY2FsIGxhYmVscy4gICovCi0KLWludAotYTI5a191bnJlY29nbml6ZWRfbGluZSAoYykKLSAgICAgaW50IGM7Ci17Ci0gIGludCBsYWI7Ci0gIGNoYXIgKnM7Ci0KLSAgaWYgKGMgIT0gJyQnCi0gICAgICB8fCAhIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBpbnB1dF9saW5lX3BvaW50ZXJbMF0pKQotICAgIHJldHVybiAwOwotCi0gIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgbGFiID0gMDsKLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0gICAgewotICAgICAgbGFiID0gbGFiICogMTAgKyAqcyAtICcwJzsKLSAgICAgICsrczsKLSAgICB9Ci0KLSAgaWYgKCpzICE9ICc6JykKLSAgICB7Ci0gICAgICAvKiBOb3QgYSBsYWJlbCBkZWZpbml0aW9uLiAgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoZG9sbGFyX2xhYmVsX2RlZmluZWQgKGxhYikpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJsYWJlbCBcIiQlZFwiIHJlZGVmaW5lZCIpLCBsYWIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGRlZmluZV9kb2xsYXJfbGFiZWwgKGxhYik7Ci0gIGNvbG9uIChkb2xsYXJfbGFiZWxfbmFtZSAobGFiLCAwKSk7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHMgKyAxOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBEZWZhdWx0IHRoZSB2YWx1ZXMgb2Ygc3ltYm9scyBrbm93biB0aGF0IHNob3VsZCBiZSAicHJlZGVmaW5lZCIuICBXZQotICAgZG9uJ3QgYm90aGVyIHRvIHByZWRlZmluZSB0aGVtIHVubGVzcyB5b3UgYWN0dWFsbHkgdXNlIG9uZSwgc2luY2UgdGhlcmUKLSAgIGFyZSBhIGxvdCBvZiB0aGVtLiAgKi8KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBsb25nIHJlZ251bTsKLSAgY2hhciB0ZXN0YnVmWzUgKyAvKlNMT1AqLyA1XTsKLQotICBpZiAobmFtZVswXSA9PSAnZycgfHwgbmFtZVswXSA9PSAnRycKLSAgICAgIHx8IG5hbWVbMF0gPT0gJ2wnIHx8IG5hbWVbMF0gPT0gJ0wnCi0gICAgICB8fCBuYW1lWzBdID09ICdzJyB8fCBuYW1lWzBdID09ICdTJykKLSAgICB7Ci0gICAgICAvKiBQZXJoYXBzIGEgZ2xvYmFsIG9yIGxvY2FsIHJlZ2lzdGVyIG5hbWUgKi8KLSAgICAgIGlmIChuYW1lWzFdID09ICdyJyB8fCBuYW1lWzFdID09ICdSJykKLQl7Ci0JICBsb25nIG1heHJlZzsKLQotCSAgLyogUGFyc2UgdGhlIG51bWJlciwgbWFrZSBzdXJlIGl0IGhhcyBubyBleHRyYSB6ZXJvZXMgb3IKLQkgICAgIHRyYWlsaW5nIGNoYXJzLiAqLwotCSAgcmVnbnVtID0gYXRvbCAoJm5hbWVbMl0pOwotCi0JICBpZiAobmFtZVswXSA9PSAncycgfHwgbmFtZVswXSA9PSAnUycpCi0JICAgIG1heHJlZyA9IDI1NTsKLQkgIGVsc2UKLQkgICAgbWF4cmVnID0gMTI3OwotCSAgaWYgKHJlZ251bSA+IG1heHJlZykKLQkgICAgcmV0dXJuIE5VTEw7Ci0KLQkgIHNwcmludGYgKHRlc3RidWYsICIlbGQiLCByZWdudW0pOwotCSAgaWYgKHN0cmNtcCAodGVzdGJ1ZiwgJm5hbWVbMl0pICE9IDApCi0JICAgIHJldHVybiBOVUxMOwkvKiBncjAwNyBvciBscjdmb28gb3Igd2hhdGV2ZXIgKi8KLQotCSAgLyogV2UgaGF2ZSBhIHdpZW5lciEgIERlZmluZSBhbmQgcmV0dXJuIGEgbmV3IHN5bWJvbCBmb3IgaXQuICAqLwotCSAgaWYgKG5hbWVbMF0gPT0gJ2wnIHx8IG5hbWVbMF0gPT0gJ0wnKQotCSAgICByZWdudW0gKz0gMTI4OwotCSAgZWxzZSBpZiAobmFtZVswXSA9PSAncycgfHwgbmFtZVswXSA9PSAnUycpCi0JICAgIHJlZ251bSArPSBTUkVHOwotCSAgcmV0dXJuIChzeW1ib2xfbmV3IChuYW1lLCBTRUdfUkVHSVNURVIsICh2YWx1ZVQpIHJlZ251bSwKLQkJCSAgICAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFBhcnNlIGFuIG9wZXJhbmQgdGhhdCBpcyBtYWNoaW5lLXNwZWNpZmljLiAgKi8KLQotdm9pZAotbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLQotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICclJyAmJiBpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJyUnKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgYSBudW1lcmljIHJlZ2lzdGVyIGV4cHJlc3Npb24uICBObyBiaWdneS4gICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsJLyogU2tpcCAlJSAqLwotICAgICAgKHZvaWQpIGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgICAgIGlmIChleHByZXNzaW9uUC0+WF9vcCAhPSBPX2NvbnN0YW50Ci0JICB8fCBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID4gMjU1KQotCWFzX2JhZCAoXygiSW52YWxpZCBleHByZXNzaW9uIGFmdGVyICUlJSVcbiIpKTsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICB9Ci0gIGVsc2UgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnJicpCi0gICAgewotICAgICAgLyogV2UgYXJlIHRha2luZyB0aGUgJ2FkZHJlc3MnIG9mIGEgcmVnaXN0ZXIuLi50aGlzIG9uZSBpcyBub3QKLQkgaW4gdGhlIG1hbnVhbCwgYnV0IGl0ICppcyogaW4gdHJhcHMvZnBzeW1ib2wuaCEgIFdoYXQgdGhleQotCSBzZWVtIHRvIHdhbnQgaXMgdGhlIHJlZ2lzdGVyIG51bWJlciwgYXMgYW4gYWJzb2x1dGUgbnVtYmVyLiAgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwkvKiBTa2lwICYgKi8KLSAgICAgICh2b2lkKSBleHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gICAgICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgIT0gT19yZWdpc3RlcikKLQlhc19iYWQgKF8oIkludmFsaWQgcmVnaXN0ZXIgaW4gJiBleHByZXNzaW9uIikpOwotICAgICAgZWxzZQotCWV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLSAgICB9Ci0gIGVsc2UgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnJCcKLQkgICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzFdKSkKLSAgICB7Ci0gICAgICBsb25nIGxhYjsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBzeW1ib2xTICpzeW07Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBsb2NhbCBsYWJlbC4gICovCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGxhYiA9IChsb25nKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmIChkb2xsYXJfbGFiZWxfZGVmaW5lZCAobGFiKSkKLQl7Ci0JICBuYW1lID0gZG9sbGFyX2xhYmVsX25hbWUgKGxhYiwgMCk7Ci0JICBzeW0gPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5hbWUgPSBkb2xsYXJfbGFiZWxfbmFtZSAobGFiLCAxKTsKLQkgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCX0KLQotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBzeW07Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnJCcpCi0gICAgewotICAgICAgY2hhciAqczsKLSAgICAgIGNoYXIgdHlwZTsKLSAgICAgIGludCBmaWVsZG51bSwgZmllbGRsaW1pdDsKLSAgICAgIExJVFRMRU5VTV9UWVBFIGZsb2F0YnVmWzhdOwotCi0gICAgICAvKiAkZmxvYXQoKSwgJGRvdWJsZU4oKSwgb3IgJGV4dGVuZE4oKSBjb252ZXJ0IGZsb2F0aW5nIHZhbHVlcwotCSB0byBpbnRlZ2Vycy4gICovCi0KLSAgICAgIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgICsrczsKLQotICAgICAgZmllbGRudW0gPSAwOwotICAgICAgaWYgKHN0cm5jbXAgKHMsICJkb3VibGUiLCBzaXplb2YgImRvdWJsZSIgLSAxKSA9PSAwKQotCXsKLQkgIHMgKz0gc2l6ZW9mICJkb3VibGUiIC0gMTsKLQkgIHR5cGUgPSAnZCc7Ci0JICBmaWVsZGxpbWl0ID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChzLCAiZmxvYXQiLCBzaXplb2YgImZsb2F0IiAtIDEpID09IDApCi0JewotCSAgcyArPSBzaXplb2YgImZsb2F0IiAtIDE7Ci0JICB0eXBlID0gJ2YnOwotCSAgZmllbGRsaW1pdCA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywgImV4dGVuZCIsIHNpemVvZiAiZXh0ZW5kIiAtIDEpID09IDApCi0JewotCSAgcyArPSBzaXplb2YgImV4dGVuZCIgLSAxOwotCSAgdHlwZSA9ICd4JzsKLQkgIGZpZWxkbGltaXQgPSA0OwotCX0KLSAgICAgIGVsc2UgCi0JewotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGlzZGlnaXQgKCpzKSkKLQl7Ci0JICBmaWVsZG51bSA9ICpzIC0gJzAnOwotCSAgKytzOwotCX0KLSAgICAgIGlmIChmaWVsZG51bSA+PSBmaWVsZGxpbWl0KQotCXJldHVybjsKLQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCpzICE9ICcoJykKLQlyZXR1cm47Ci0gICAgICArK3M7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgICAgIHMgPSBhdG9mX2llZWUgKHMsIHR5cGUsIGZsb2F0YnVmKTsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JcmV0dXJuOwotICAgICAgcyA9IHM7Ci0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqcyAhPSAnKScpCi0JcmV0dXJuOwotICAgICAgKytzOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OyAKLSAgICAgIGV4cHJlc3Npb25QLT5YX3Vuc2lnbmVkID0gMTsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAoKGZsb2F0YnVmW2ZpZWxkbnVtICogMl0KLQkJCQkgICAgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCQkJCSAgICsgZmxvYXRidWZbZmllbGRudW0gKiAyICsgMV0pOwotICAgIH0KLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgcmV0dXJuIHNpemU7CQkJLyogQnl0ZSBhbGlnbm1lbnQgaXMgZmluZSAqLwotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgMjkwMDAsIHRoZXkncmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uLAotICAgd2hpY2ggd2UgaGF2ZSBzZXQgdXAgYXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpeHVwIHRvby4gICovCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0vKiBlbmQgb2YgdGMtYTI5ay5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWEyOWsuaCBiL2dhcy9jb25maWcvdGMtYTI5ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjBmNjA1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYTI5ay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogdGMtYTI5ay5oIC0tIEFzc2VtYmxlIGZvciB0aGUgQU1EIDI5MDAwLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfQTI5SwotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCTEKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgTEVYX0RPTExBUiAxCi0KLSNkZWZpbmUgdGNfdW5yZWNvZ25pemVkX2xpbmUoYykgYTI5a191bnJlY29nbml6ZWRfbGluZSAoYykKLWV4dGVybiBpbnQgYTI5a191bnJlY29nbml6ZWRfbGluZSBQQVJBTVMgKChpbnQpKTsKLQotI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soYSkJCTsJLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQk7CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihhKQk7CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayhhKQk7CS8qIG5vdCB1c2VkICovCi0KLSNkZWZpbmUgQU9VVF9NQUNIVFlQRSAxMDEKLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4X3B0cikgdGNfY29mZl9maXgycnR5cGUoZml4X3B0cikKLSNkZWZpbmUgQkZEX0FSQ0ggYmZkX2FyY2hfYTI5awotI2RlZmluZSBDT0ZGX01BR0lDIFNJUEZCT01BR0lDCi0vKiBTaG91bGQgdGhlIHJlbG9jIGJlIG91dHB1dCA/Ci0Jb24gdGhlIDI5aywgdGhpcyBpcyB0cnVlIG9ubHkgaWYgdGhlcmUgaXMgYSBzeW1ib2wgYXR0YXRjaGVkLgotCW9uIHRoZSBoOCwgdGhpcyBpcyBhbGx3YXlzIHRydWUsIHNpbmNlIG5vIGZpeHVwIGlzIGRvbmUKLSovCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICh4LT5meF9hZGRzeSkKLSNkZWZpbmUgVENfQ09OU19SRUxPQyBSRUxPQ18zMgotCi0jZGVmaW5lIENPRkZfRkxBR1MgRl9BUjMyVwotI2RlZmluZSByZWxvY190eXBlIGludAotI2RlZmluZSBORUVEX0ZYX1JfVFlQRQotCi0jZGVmaW5lIFpFUk9fQkFTRURfU0VHTUVOVFMKLQotLyogZW5kIG9mIHRjLWEyOWsuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1hbHBoYS5jIGIvZ2FzL2NvbmZpZy90Yy1hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njg2MTdmLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYWxwaGEuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3NjIgKzAsMCBAQAotLyogdGMtYWxwaGEuYyAtIFByb2Nlc3Nvci1zcGVjaWZpYyBjb2RlIGZvciB0aGUgREVDIEFscGhhIEFYUCBDUFUuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkzLTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHksIDE5OTMuCi0gICBXcml0dGVuIGJ5IEFsZXNzYW5kcm8gRm9yaW4sIGJhc2VkIG9uIGVhcmxpZXIgZ2FzLTEuMzggdGFyZ2V0IENQVSBmaWxlcy4KLSAgIE1vZGlmaWVkIGJ5IEtlbiBSYWVidXJuIGZvciBnYXMtMi54IGFuZCBFQ09GRiBzdXBwb3J0LgotICAgTW9kaWZpZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gZm9yIEVMRiBzdXBwb3J0LgotICAgTW9kaWZpZWQgYnkgS2xhdXMgSyJhbXBmIGZvciBFVkFYIChvcGVuVk1TL0FscGhhKSBzdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogTWFjaCBPcGVyYXRpbmcgU3lzdGVtCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTMgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlCi0gKiBzb2Z0d2FyZSwgZGVyaXZhdGl2ZSB3b3JrcyBvciBtb2RpZmllZCB2ZXJzaW9ucywgYW5kIGFueSBwb3J0aW9ucwotICogdGhlcmVvZiwgYW5kIHRoYXQgYm90aCBub3RpY2VzIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCi0gKgotICogQ0FSTkVHSUUgTUVMTE9OIEFMTE9XUyBGUkVFIFVTRSBPRiBUSElTIFNPRlRXQVJFIElOIElUUwotICogQ09ORElUSU9OLiAgQ0FSTkVHSUUgTUVMTE9OIERJU0NMQUlNUyBBTlkgTElBQklMSVRZIE9GIEFOWSBLSU5EIEZPUgotICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuCi0gKgotICogQ2FybmVnaWUgTWVsbG9uIHJlcXVlc3RzIHVzZXJzIG9mIHRoaXMgc29mdHdhcmUgdG8gcmV0dXJuIHRvCi0gKgotICogIFNvZnR3YXJlIERpc3RyaWJ1dGlvbiBDb29yZGluYXRvciAgb3IgIFNvZnR3YXJlLkRpc3RyaWJ1dGlvbkBDUy5DTVUuRURVCi0gKiAgU2Nob29sIG9mIENvbXB1dGVyIFNjaWVuY2UKLSAqICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICogIFBpdHRzYnVyZ2ggUEEgMTUyMTMtMzg5MAotICoKLSAqIGFueSBpbXByb3ZlbWVudHMgb3IgZXh0ZW5zaW9ucyB0aGF0IHRoZXkgbWFrZSBhbmQgZ3JhbnQgQ2FybmVnaWUgdGhlCi0gKiByaWdodHMgdG8gcmVkaXN0cmlidXRlIHRoZXNlIGNoYW5nZXMuCi0gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgImVjb2ZmLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvYWxwaGEuaCIKLQotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJlbGYvYWxwaGEuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotDAotLyogTG9jYWwgdHlwZXMgKi8KLQotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgMgotI2RlZmluZSBNQVhfSU5TTl9BUkdTIDUKLQotc3RydWN0IGFscGhhX2ZpeHVwCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotfTsKLQotc3RydWN0IGFscGhhX2luc24KLXsKLSAgdW5zaWduZWQgaW5zbjsKLSAgaW50IG5maXh1cHM7Ci0gIHN0cnVjdCBhbHBoYV9maXh1cCBmaXh1cHNbTUFYX0lOU05fRklYVVBTXTsKLX07Ci0KLWVudW0gYWxwaGFfbWFjcm9fYXJnCi17Ci0gIE1BQ1JPX0VPQSA9IDEsIE1BQ1JPX0lSLCBNQUNST19QSVIsIE1BQ1JPX0NQSVIsIE1BQ1JPX0ZQUiwgTUFDUk9fRVhQCi19OwotCi1zdHJ1Y3QgYWxwaGFfbWFjcm8KLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgdm9pZCAoKmVtaXQpIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci0gIGNvbnN0IFBUUiBhcmc7Ci0gIGVudW0gYWxwaGFfbWFjcm9fYXJnIGFyZ3NldHNbMTZdOwotfTsKLQotLyogVHdvIGV4dHJhIHN5bWJvbHMgd2Ugd2FudCB0byBzZWUgaW4gb3VyIGlucHV0LiAgVGhpcyBpcyBhIGJsYXRlbnQKLSAgIG1pc3VzZSBvZiB0aGUgZXhwcmVzc2lvblMuWF9vcCBmaWVsZC4gICovCi0KLSNkZWZpbmUgT19wcmVnaXN0ZXIJKE9fbWF4KzEpCS8qIE9fcmVnaXN0ZXIsIGJ1dCBpbiBwYXJlbnRoZXNlcyAqLwotI2RlZmluZSBPX2NwcmVnaXN0ZXIJKE9fcHJlZ2lzdGVyKzEpCS8qICsgYSBsZWFkaW5nIGNvbW1hICovCi0KLS8qIE1hY3JvcyBmb3IgZXh0cmFjdGluZyB0aGUgdHlwZSBhbmQgbnVtYmVyIG9mIGVuY29kZWQgcmVnaXN0ZXIgdG9rZW5zICovCi0KLSNkZWZpbmUgaXNfaXJfbnVtKHgpCQkoKCh4KSAmIDMyKSA9PSAwKQotI2RlZmluZSBpc19mcHJfbnVtKHgpCQkoKCh4KSAmIDMyKSAhPSAwKQotI2RlZmluZSByZWdubyh4KQkJKCh4KSAmIDMxKQotCi0vKiBTb21ldGhpbmcgb2RkIGluaGVyaXRlZCBmcm9tIHRoZSBvbGQgYXNzZW1ibGVyICovCi0KLSNkZWZpbmUgbm90ZV9ncHJlZyhSKQkJKGFscGhhX2dwcm1hc2sgfD0gKDEgPDwgKFIpKSkKLSNkZWZpbmUgbm90ZV9mcHJlZyhSKQkJKGFscGhhX2Zwcm1hc2sgfD0gKDEgPDwgKFIpKSkKLQotLyogUHJlZGljYXRlcyBmb3IgMTYtIGFuZCAzMi1iaXQgcmFuZ2VzICovCi0vKiBYWFg6IFRoZSBub24tc2hpZnQgdmVyc2lvbiBhcHBlYXJzIHRvIHRyaWdnZXIgYSBjb21waWxlciBidWcgd2hlbgotICAgY3Jvc3MtYXNzZW1ibGluZyBmcm9tIHg4NiB3LyBnY2MgMi43LjIuICAqLwotCi0jaWYgMQotI2RlZmluZSByYW5nZV9zaWduZWRfMTYoeCkgXAotCSgoKG9mZnNldFQpKHgpID4+IDE1KSA9PSAwIHx8ICgob2Zmc2V0VCkoeCkgPj4gMTUpID09IC0xKQotI2RlZmluZSByYW5nZV9zaWduZWRfMzIoeCkgXAotCSgoKG9mZnNldFQpKHgpID4+IDMxKSA9PSAwIHx8ICgob2Zmc2V0VCkoeCkgPj4gMzEpID09IC0xKQotI2Vsc2UKLSNkZWZpbmUgcmFuZ2Vfc2lnbmVkXzE2KHgpCSgob2Zmc2V0VCkoeCkgPj0gLShvZmZzZXRUKTB4ODAwMCAmJglcCi0JCQkJIChvZmZzZXRUKSh4KSA8PSAgKG9mZnNldFQpMHg3RkZGKQotI2RlZmluZSByYW5nZV9zaWduZWRfMzIoeCkJKChvZmZzZXRUKSh4KSA+PSAtKG9mZnNldFQpMHg4MDAwMDAwMCAmJiBcCi0JCQkJIChvZmZzZXRUKSh4KSA8PSAgKG9mZnNldFQpMHg3RkZGRkZGRikKLSNlbmRpZgotCi0vKiBNYWNyb3MgZm9yIHNpZ24gZXh0ZW5kaW5nIGZyb20gMTYtIGFuZCAzMi1iaXRzLiAgKi8KLS8qIFhYWDogVGhlIGNhc3QgbWFjcm9zIHdpbGwgd29yayBvbiBhbGwgdGhlIHN5c3RlbXMgdGhhdCBJIGNhcmUgYWJvdXQsCi0gICBidXQgcmVhbGx5IGEgcHJlZGljYXRlIHNob3VsZCBiZSBmb3VuZCB0byB1c2UgdGhlIG5vbi1jYXN0IGZvcm1zLiAgKi8KLQotI2lmIDEKLSNkZWZpbmUgc2lnbl9leHRlbmRfMTYoeCkJKChzaG9ydCkoeCkpCi0jZGVmaW5lIHNpZ25fZXh0ZW5kXzMyKHgpCSgoaW50KSh4KSkKLSNlbHNlCi0jZGVmaW5lIHNpZ25fZXh0ZW5kXzE2KHgpCSgob2Zmc2V0VCkoKCh4KSAmIDB4RkZGRikgXiAweDgwMDApIC0gMHg4MDAwKQotI2RlZmluZSBzaWduX2V4dGVuZF8zMih4KQkoKG9mZnNldFQpKCgoeCkgJiAweEZGRkZGRkZGKSBcCi0JCQkJCSAgIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwKQotI2VuZGlmCi0KLS8qIE1hY3JvcyB0byBidWlsZCB0b2tlbnMgKi8KLQotI2RlZmluZSBzZXRfdG9rX3JlZyh0LCByKQkobWVtc2V0KCYodCksIDAsIHNpemVvZih0KSksCQlcCi0JCQkJICh0KS5YX29wID0gT19yZWdpc3RlciwJCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAocikpCi0jZGVmaW5lIHNldF90b2tfcHJlZyh0LCByKQkobWVtc2V0KCYodCksIDAsIHNpemVvZih0KSksCQlcCi0JCQkJICh0KS5YX29wID0gT19wcmVnaXN0ZXIsCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAocikpCi0jZGVmaW5lIHNldF90b2tfY3ByZWcodCwgcikJKG1lbXNldCgmKHQpLCAwLCBzaXplb2YodCkpLAkJXAotCQkJCSAodCkuWF9vcCA9IE9fY3ByZWdpc3RlciwJCVwKLQkJCQkgKHQpLlhfYWRkX251bWJlciA9IChyKSkKLSNkZWZpbmUgc2V0X3Rva19mcmVnKHQsIHIpCShtZW1zZXQoJih0KSwgMCwgc2l6ZW9mKHQpKSwJCVwKLQkJCQkgKHQpLlhfb3AgPSBPX3JlZ2lzdGVyLAkJCVwKLQkJCQkgKHQpLlhfYWRkX251bWJlciA9IChyKSszMikKLSNkZWZpbmUgc2V0X3Rva19zeW0odCwgcywgYSkJKG1lbXNldCgmKHQpLCAwLCBzaXplb2YodCkpLAkJXAotCQkJCSAodCkuWF9vcCA9IE9fc3ltYm9sLAkJCVwKLQkJCQkgKHQpLlhfYWRkX3N5bWJvbCA9IChzKSwJCVwKLQkJCQkgKHQpLlhfYWRkX251bWJlciA9IChhKSkKLSNkZWZpbmUgc2V0X3Rva19jb25zdCh0LCBuKQkobWVtc2V0KCYodCksIDAsIHNpemVvZih0KSksCQlcCi0JCQkJICh0KS5YX29wID0gT19jb25zdGFudCwJCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAobikpCi0KLQwKLS8qIFByb3RvdHlwZXMgZm9yIGFsbCBsb2NhbCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGludCB0b2tlbml6ZV9hcmd1bWVudHMgUEFSQU1TICgoY2hhciAqLCBleHByZXNzaW9uUyAqLCBpbnQpKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpmaW5kX29wY29kZV9tYXRjaAotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICosIGNvbnN0IGV4cHJlc3Npb25TICosIGludCAqLCBpbnQgKikpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqZmluZF9tYWNyb19tYXRjaAotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKiwgY29uc3QgZXhwcmVzc2lvblMgKiwgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfb3BlcmFuZAotICBQQVJBTVMgKCh1bnNpZ25lZCwgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKiwgb2Zmc2V0VCwgY2hhciAqLCB1bnNpZ25lZCkpOwotc3RhdGljIHZvaWQgYXNzZW1ibGVfaW5zbgotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICosIGNvbnN0IGV4cHJlc3Npb25TICosIGludCwKLQkgICBzdHJ1Y3QgYWxwaGFfaW5zbiAqKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2luc24gUEFSQU1TICgoc3RydWN0IGFscGhhX2luc24gKikpOwotc3RhdGljIHZvaWQgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24KLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIHN0cnVjdCBhbHBoYV9pbnNuICopKTsKLXN0YXRpYyB2b2lkIGFzc2VtYmxlX3Rva2VucwotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgaW50KSk7Ci0KLXN0YXRpYyBpbnQgbG9hZF9leHByZXNzaW9uCi0gIFBBUkFNUyAoKGludCwgY29uc3QgZXhwcmVzc2lvblMgKiwgaW50ICosIGV4cHJlc3Npb25TICopKTsKLQotc3RhdGljIHZvaWQgZW1pdF9sZGdwIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2RpdmlzaW9uIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2xkYSBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF9sZGFoIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2lyX2xvYWQgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfbG9hZHN0b3JlIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2pzcmptcCBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF9sZFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfbGRYdSBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF91bGRYIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X3VsZFh1IFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2xkaWwgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfc3RYIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X3VzdFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfc2V4dFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfcmV0amNyIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyB2b2lkIHNfYWxwaGFfdGV4dCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfZGF0YSBQQVJBTVMgKChpbnQpKTsKLSNpZm5kZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgc19hbHBoYV9jb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9yZGF0YSBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FQ09GRgotc3RhdGljIHZvaWQgc19hbHBoYV9zZGF0YSBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLXN0YXRpYyB2b2lkIHNfYWxwaGFfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfZW50IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9lbmQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX21hc2sgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX2ZyYW1lIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9wcm9sb2d1ZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfY29mZl93cmFwcGVyIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLXN0YXRpYyB2b2lkIHNfYWxwaGFfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgc19hbHBoYV9ncHJlbDMyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9mbG9hdF9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9wcm9jIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9zZXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX2Jhc2UgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX2FsaWduIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9zdHJpbmdlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfc3BhY2UgUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyB2b2lkIGNyZWF0ZV9saXRlcmFsX3NlY3Rpb24gUEFSQU1TICgoY29uc3QgY2hhciAqLCBzZWdUICosIHN5bWJvbFMgKiopKTsKLSNpZm5kZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgc2VsZWN0X2dwX3ZhbHVlIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgYWxwaGFfYWxpZ24gUEFSQU1TICgoaW50LCBjaGFyICosIHN5bWJvbFMgKiwgaW50KSk7Ci0KLQwKLS8qIEdlbmVyaWMgYXNzZW1ibGVyIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggbXVzdCBiZSBkZWZpbmVkIGJ5IGFsbAotICAgdGFyZ2V0cy4gICovCi0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtYXkgYmUgdXNlZCB0byBzZXBhcmF0ZSBtdWx0aXBsZSBjb21tYW5kcyBvbiBhCi0gICBzaW5nbGUgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYXJlIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXhwb25lbnQgaW4gYSBmbG9hdGluZwotICAgcG9pbnQgbnVtYmVyLiAgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1lYW4gdGhhdCBhIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LAotICAgYXMgaW4gMGQxLjAuICAqLwotI2lmIDAKLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZEQiOwotI2Vsc2UKLS8qIFhYWDogRG8gYWxsIG9mIHRoZXNlIHJlYWxseSBnZXQgdXNlZCBvbiB0aGUgYWxwaGE/PyAgKi8KLWNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VWQVgKLWNvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJGbTpnKzFoOkhHOiI7Ci0jZWxzZQotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIkZtOmdHOiI7Ci0jZW5kaWYKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotI2RlZmluZSBPUFRJT05fMzJBRERSIChPUFRJT05fTURfQkFTRSkKLSAgeyAiMzJhZGRyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl8zMkFERFIgfSwKLSNkZWZpbmUgT1BUSU9OX1JFTEFYIChPUFRJT05fMzJBRERSKzEpCi0gIHsgInJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SRUxBWCB9LAotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgT1BUSU9OX01ERUJVRyAoT1BUSU9OX1JFTEFYKzEpCi0jZGVmaW5lIE9QVElPTl9OT19NREVCVUcgKE9QVElPTl9NREVCVUcrMSkKLSAgeyAibWRlYnVnIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NREVCVUcgfSwKLSAgeyAibm8tbWRlYnVnIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19NREVCVUcgfSwKLSNlbmRpZgotICB7IE5VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwIH0KLX07Ci0KLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotDAotI2lmZGVmIE9CSl9FVkFYCi0jZGVmaW5lIEFYUF9SRUdfUjAgICAgIDAKLSNkZWZpbmUgQVhQX1JFR19SMTYgICAgMTYKLSNkZWZpbmUgQVhQX1JFR19SMTcgICAgMTcKLSN1bmRlZiBBWFBfUkVHX1Q5Ci0jZGVmaW5lIEFYUF9SRUdfVDkgICAgIDIyCi0jdW5kZWYgQVhQX1JFR19UMTAKLSNkZWZpbmUgQVhQX1JFR19UMTAgICAgMjMKLSN1bmRlZiBBWFBfUkVHX1QxMQotI2RlZmluZSBBWFBfUkVHX1QxMSAgICAyNAotI3VuZGVmIEFYUF9SRUdfVDEyCi0jZGVmaW5lIEFYUF9SRUdfVDEyICAgIDI1Ci0jZGVmaW5lIEFYUF9SRUdfQUkgICAgIDI1Ci0jdW5kZWYgQVhQX1JFR19GUAotI2RlZmluZSBBWFBfUkVHX0ZQICAgICAyOQotCi0jdW5kZWYgQVhQX1JFR19HUAotI2RlZmluZSBBWFBfUkVHX0dQIEFYUF9SRUdfUFYKLSNlbmRpZiAvKiBPQkpfRVZBWCAgKi8KLQotLyogVGhlIGNwdSBmb3Igd2hpY2ggd2UgYXJlIGdlbmVyYXRpbmcgY29kZSAqLwotc3RhdGljIHVuc2lnbmVkIGFscGhhX3RhcmdldCA9IEFYUF9PUENPREVfQkFTRTsKLXN0YXRpYyBjb25zdCBjaGFyICphbHBoYV90YXJnZXRfbmFtZSA9ICI8YWxsPiI7Ci0KLS8qIFRoZSBoYXNoIHRhYmxlIG9mIGluc3RydWN0aW9uIG9wY29kZXMgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICphbHBoYV9vcGNvZGVfaGFzaDsKLQotLyogVGhlIGhhc2ggdGFibGUgb2YgbWFjcm8gb3Bjb2RlcyAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmFscGhhX21hY3JvX2hhc2g7Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLS8qIFRoZSAkZ3AgcmVsb2NhdGlvbiBzeW1ib2wgKi8KLXN0YXRpYyBzeW1ib2xTICphbHBoYV9ncF9zeW1ib2w7Ci0KLS8qIFhYWDogd2hhdCBpcyB0aGlzLCBhbmQgd2h5IGlzIGl0IGV4cG9ydGVkPyAqLwotdmFsdWVUIGFscGhhX2dwX3ZhbHVlOwotI2VuZGlmCi0KLS8qIFRoZSBjdXJyZW50ICRncCByZWdpc3RlciAqLwotc3RhdGljIGludCBhbHBoYV9ncF9yZWdpc3RlciA9IEFYUF9SRUdfR1A7Ci0KLS8qIEEgdGFibGUgb2YgdGhlIHJlZ2lzdGVyIHN5bWJvbHMgKi8KLXN0YXRpYyBzeW1ib2xTICphbHBoYV9yZWdpc3Rlcl90YWJsZVs2NF07Ci0KLS8qIENvbnN0YW50IHNlY3Rpb25zLCBvciBzZWN0aW9ucyBvZiBjb25zdGFudHMgKi8KLSNpZmRlZiBPQkpfRUNPRkYKLXN0YXRpYyBzZWdUIGFscGhhX2xpdGFfc2VjdGlvbjsKLXN0YXRpYyBzZWdUIGFscGhhX2xpdDRfc2VjdGlvbjsKLSNlbmRpZgotI2lmZGVmIE9CSl9FVkFYCi1zdGF0aWMgc2VnVCBhbHBoYV9saW5rX3NlY3Rpb247Ci1zdGF0aWMgc2VnVCBhbHBoYV9jdG9yc19zZWN0aW9uOwotc3RhdGljIHNlZ1QgYWxwaGFfZHRvcnNfc2VjdGlvbjsKLSNlbmRpZgotc3RhdGljIHNlZ1QgYWxwaGFfbGl0OF9zZWN0aW9uOwotCi0vKiBTeW1ib2xzIHJlZmVycmluZyB0byBzYWlkIHNlY3Rpb25zLiAqLwotI2lmZGVmIE9CSl9FQ09GRgotc3RhdGljIHN5bWJvbFMgKmFscGhhX2xpdGFfc3ltYm9sOwotc3RhdGljIHN5bWJvbFMgKmFscGhhX2xpdDRfc3ltYm9sOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLXN0YXRpYyBzeW1ib2xTICphbHBoYV9saW5rX3N5bWJvbDsKLXN0YXRpYyBzeW1ib2xTICphbHBoYV9jdG9yc19zeW1ib2w7Ci1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfZHRvcnNfc3ltYm9sOwotI2VuZGlmCi1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfbGl0OF9zeW1ib2w7Ci0KLS8qIExpdGVyYWwgZm9yIC5saXRYKzB4ODAwMCB3aXRoaW4gLmxpdGEgKi8KLSNpZmRlZiBPQkpfRUNPRkYKLXN0YXRpYyBvZmZzZXRUIGFscGhhX2xpdDRfbGl0ZXJhbDsKLXN0YXRpYyBvZmZzZXRUIGFscGhhX2xpdDhfbGl0ZXJhbDsKLSNlbmRpZgotCi0vKiBUaGUgYWN0aXZlIC5lbnQgc3ltYm9sLiAgKi8KLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfY3VyX2VudF9zeW07Ci0jZW5kaWYKLQotLyogSXMgdGhlIGFzc2VtYmxlciBub3QgYWxsb3dlZCB0byB1c2UgJGF0PyAqLwotc3RhdGljIGludCBhbHBoYV9ub2F0X29uID0gMDsKLQotLyogQXJlIG1hY3JvcyBlbmFibGVkPyAqLwotc3RhdGljIGludCBhbHBoYV9tYWNyb3Nfb24gPSAxOwotCi0vKiBBcmUgZmxvYXRzIGRpc2FibGVkPyAqLwotc3RhdGljIGludCBhbHBoYV9ub2Zsb2F0c19vbiA9IDA7Ci0KLS8qIEFyZSBhZGRyZXNzZXMgMzIgYml0PyAqLwotc3RhdGljIGludCBhbHBoYV9hZGRyMzJfb24gPSAwOwotCi0vKiBTeW1ib2wgbGFiZWxsaW5nIHRoZSBjdXJyZW50IGluc24uICBXaGVuIHRoZSBBbHBoYSBnYXMgc2VlcwotICAgICBmb286Ci0gICAgICAgLnF1YWQgMAotICAgYW5kIHRoZSBzZWN0aW9uIGhhcHBlbnMgdG8gbm90IGJlIG9uIGFuIGVpZ2h0IGJ5dGUgYm91bmRhcnksIGl0Ci0gICB3aWxsIGFsaWduIGJvdGggdGhlIHN5bWJvbCBhbmQgdGhlIC5xdWFkIHRvIGFuIGVpZ2h0IGJ5dGUgYm91bmRhcnkuICAqLwotc3RhdGljIHN5bWJvbFMgKmFscGhhX2luc25fbGFiZWw7Ci0KLS8qIFdoZXRoZXIgd2Ugc2hvdWxkIGF1dG9tYXRpY2FsbHkgYWxpZ24gZGF0YSBnZW5lcmF0aW9uIHBzZXVkby1vcHMuCi0gICAuYWxpZ24gMCB3aWxsIHR1cm4gdGhpcyBvZmYuICAqLwotc3RhdGljIGludCBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLQotLyogVGhlIGtub3duIGN1cnJlbnQgYWxpZ25tZW50IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24uICAqLwotc3RhdGljIGludCBhbHBoYV9jdXJyZW50X2FsaWduOwotCi0vKiBUaGVzZSBhcmUgZXhwb3J0ZWQgdG8gRUNPRkYgY29kZS4gICovCi11bnNpZ25lZCBsb25nIGFscGhhX2dwcm1hc2ssIGFscGhhX2Zwcm1hc2s7Ci0KLS8qIFdoZXRoZXIgdGhlIGRlYnVnZ2luZyBvcHRpb24gd2FzIHNlZW4uICAqLwotc3RhdGljIGludCBhbHBoYV9kZWJ1ZzsKLQotI2lmZGVmIE9CSl9FTEYKLS8qIFdoZXRoZXIgd2UgYXJlIGVtaXR0aW5nIGFuIG1kZWJ1ZyBzZWN0aW9uLiAgKi8KLWludCBhbHBoYV9mbGFnX21kZWJ1ZyA9IDE7Ci0jZW5kaWYKLQotLyogRG9uJ3QgZnVsbHkgcmVzb2x2ZSByZWxvY2F0aW9ucywgYWxsb3dpbmcgY29kZSBtb3ZlbWVudCBpbiB0aGUgbGlua2VyLiAgKi8KLXN0YXRpYyBpbnQgYWxwaGFfZmxhZ19yZWxheDsKLQotLyogV2hhdCB2YWx1ZSB0byBnaXZlIHRvIGJmZF9zZXRfZ3Bfc2l6ZS4gICovCi1zdGF0aWMgaW50IGdfc3dpdGNoX3ZhbHVlID0gODsKLQotI2lmZGVmIE9CSl9FVkFYCi0vKiBDb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgcHJvY2VkdXJlIGhlcmUuICAqLwotc3RhdGljIHN0cnVjdCB7Ci0gIHN5bWJvbFMgKnN5bWJvbDsJLyogcHJvYyBwZGVzYyBzeW1ib2wgKi8KLSAgaW50IHBkc2NraW5kOwotICBpbnQgZnJhbWVyZWc7CQkvKiByZWdpc3RlciBmb3IgZnJhbWUgcG9pbnRlciAqLwotICBpbnQgZnJhbWVzaXplOwkvKiBzaXplIG9mIGZyYW1lICovCi0gIGludCByc2Ffb2Zmc2V0OwotICBpbnQgcmFfc2F2ZTsKLSAgaW50IGZwX3NhdmU7Ci0gIGxvbmcgaW1hc2s7Ci0gIGxvbmcgZm1hc2s7Ci0gIGludCB0eXBlOwotICBpbnQgcHJvbG9ndWU7Ci19IGFscGhhX2V2YXhfcHJvYzsKLQotc3RhdGljIGludCBhbHBoYV9mbGFnX2hhc2hfbG9uZ19uYW1lcyA9IDA7CQkvKiAtKyAqLwotc3RhdGljIGludCBhbHBoYV9mbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMgPSAwOwkJLyogLUggKi8KLQotLyogSWYgdGhlIC0rIHN3aXRjaCBpcyBnaXZlbiwgdGhlbiBhIGhhc2ggaXMgYXBwZW5kZWQgdG8gYW55IG5hbWUgdGhhdCBpcwotICogbG9uZ2VyIHRoYW4gNjQgY2hhcmFjdGVycywgZWxzZSBsb25nZXIgc3ltYm9sIG5hbWVzIGFyZSB0cnVuY2F0ZWQuCi0gKi8KLQotI2VuZGlmCi0MCi0vKiBBIHRhYmxlIG9mIENQVSBuYW1lcyBhbmQgb3Bjb2RlIHNldHMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNwdV90eXBlCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGZsYWdzOwotfSBjcHVfdHlwZXNbXSA9Ci17Ci0gIC8qIEFkIGhvYyBjb252ZW50aW9uOiBjcHUgbnVtYmVyIGdldHMgcGFsY29kZSwgcHJvY2VzcyBjb2RlIGRvZXNuJ3QuCi0gICAgIFRoaXMgc3VwcG9ydHMgdXNhZ2UgdW5kZXIgRFUgNC4wYiB0aGF0IGRvZXMgIi5hcmNoIGV2NCIsIGFuZCAKLSAgICAgdXNhZ2UgaW4gTUlMTyB0aGF0IGRvZXMgLW0yMTA2NC4gIFByb2JhYmx5IHNvbWV0aGluZyBtb3JlCi0gICAgIHNwZWNpZmljIGxpa2UgLW0yMTA2NC1wYWwgc2hvdWxkIGJlIHVzZWQsIGJ1dCBvaCB3ZWxsLiAgKi8KLQotICB7ICIyMTA2NCIsIEFYUF9PUENPREVfQkFTRXxBWFBfT1BDT0RFX0VWNCB9LAotICB7ICIyMTA2NGEiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKLSAgeyAiMjEwNjYiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKLSAgeyAiMjEwNjgiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKLSAgeyAiMjExNjQiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjUgfSwKLSAgeyAiMjExNjRhIiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY1fEFYUF9PUENPREVfQldYIH0sCi0gIHsgIjIxMTY0cGMiLCAoQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY1fEFYUF9PUENPREVfQldYCi0JCXxBWFBfT1BDT0RFX01BWCkgfSwKLSAgeyAiMjEyNjQiLCAoQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY2fEFYUF9PUENPREVfQldYCi0JICAgICAgfEFYUF9PUENPREVfTUFYfEFYUF9PUENPREVfQ0lYKSB9LAotCi0gIHsgImV2NCIsIEFYUF9PUENPREVfQkFTRSB9LAotICB7ICJldjQ1IiwgQVhQX09QQ09ERV9CQVNFIH0sCi0gIHsgImxjYTQ1IiwgQVhQX09QQ09ERV9CQVNFIH0sCi0gIHsgImV2NSIsIEFYUF9PUENPREVfQkFTRSB9LAotICB7ICJldjU2IiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfQldYIH0sCi0gIHsgInBjYTU2IiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfQldYfEFYUF9PUENPREVfTUFYIH0sCi0gIHsgImV2NiIsIEFYUF9PUENPREVfQkFTRXxBWFBfT1BDT0RFX0JXWHxBWFBfT1BDT0RFX01BWHxBWFBfT1BDT0RFX0NJWCB9LAotCi0gIHsgImFsbCIsIEFYUF9PUENPREVfQkFTRSB9LAotICB7IDAgfQotfTsKLQotLyogVGhlIG1hY3JvIHRhYmxlICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gYWxwaGFfbWFjcm9zW10gPSB7Ci0vKiBMb2FkL1N0b3JlIG1hY3JvcyAqLwotICB7ICJsZGEiLAllbWl0X2xkYSwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRhaCIsCWVtaXRfbGRhaCwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0KLSAgeyAibGRsIiwJZW1pdF9pcl9sb2FkLCAibGRsIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRsX2wiLAllbWl0X2lyX2xvYWQsICJsZGxfbCIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkcSIsCWVtaXRfaXJfbG9hZCwgImxkcSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkcV9sIiwJZW1pdF9pcl9sb2FkLCAibGRxX2wiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHFfdSIsCWVtaXRfaXJfbG9hZCwgImxkcV91IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRmIiwJZW1pdF9sb2Fkc3RvcmUsICJsZGYiLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkZyIsCWVtaXRfbG9hZHN0b3JlLCAibGRnIiwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHMiLAllbWl0X2xvYWRzdG9yZSwgImxkcyIsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGR0IiwJZW1pdF9sb2Fkc3RvcmUsICJsZHQiLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0KLSAgeyAibGRiIiwJZW1pdF9sZFgsIChQVFIpMCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRidSIsCWVtaXRfbGRYdSwgKFBUUikwLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHciLAllbWl0X2xkWCwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHd1IiwJZW1pdF9sZFh1LCAoUFRSKTEsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0KLSAgeyAidWxkdyIsCWVtaXRfdWxkWCwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJ1bGR3dSIsCWVtaXRfdWxkWHUsIChQVFIpMSwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAidWxkbCIsCWVtaXRfdWxkWCwgKFBUUikyLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJ1bGRsdSIsCWVtaXRfdWxkWHUsIChQVFIpMiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAidWxkcSIsCWVtaXRfdWxkWHUsIChQVFIpMywKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLQotICB7ICJsZGdwIiwJZW1pdF9sZGdwLCBOVUxMLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EgfSB9LAotCi0gIHsgImxkaSIsCWVtaXRfbGRhLCBOVUxMLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRpbCIsCWVtaXRfbGRpbCwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkaXEiLAllbWl0X2xkYSwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0jaWYgMAotICB7ICJsZGlmIgllbWl0X2xkaXEsIE5VTEwsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRpZCIJZW1pdF9sZGlxLCBOVUxMLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkaWciCWVtaXRfbGRpcSwgTlVMTCwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZGlzIgllbWl0X2xkaXEsIE5VTEwsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRpdCIJZW1pdF9sZGlxLCBOVUxMLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0jZW5kaWYKLQotICB7ICJzdGwiLAllbWl0X2xvYWRzdG9yZSwgInN0bCIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInN0bF9jIiwJZW1pdF9sb2Fkc3RvcmUsICJzdGxfYyIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInN0cSIsCWVtaXRfbG9hZHN0b3JlLCAic3RxIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3RxX2MiLAllbWl0X2xvYWRzdG9yZSwgInN0cV9jIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3RxX3UiLAllbWl0X2xvYWRzdG9yZSwgInN0cV91IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3RmIiwJZW1pdF9sb2Fkc3RvcmUsICJzdGYiLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInN0ZyIsCWVtaXRfbG9hZHN0b3JlLCAic3RnIiwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJzdHMiLAllbWl0X2xvYWRzdG9yZSwgInN0cyIsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3R0IiwJZW1pdF9sb2Fkc3RvcmUsICJzdHQiLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0KLSAgeyAic3RiIiwJZW1pdF9zdFgsIChQVFIpMCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3R3IiwJZW1pdF9zdFgsIChQVFIpMSwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAidXN0dyIsCWVtaXRfdXN0WCwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJ1c3RsIiwJZW1pdF91c3RYLCAoUFRSKTIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInVzdHEiLAllbWl0X3VzdFgsIChQVFIpMywKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLQotLyogQXJpdGhtZXRpYyBtYWNyb3MgKi8KLSNpZiAwCi0gIHsgImFic2wiCWVtaXRfYWJzbCwgMSwgeyBJUiB9IH0sCi0gIHsgImFic2wiCWVtaXRfYWJzbCwgMiwgeyBJUiwgSVIgfSB9LAotICB7ICJhYnNsIgllbWl0X2Fic2wsIDIsIHsgRVhQLCBJUiB9IH0sCi0gIHsgImFic3EiCWVtaXRfYWJzcSwgMSwgeyBJUiB9IH0sCi0gIHsgImFic3EiCWVtaXRfYWJzcSwgMiwgeyBJUiwgSVIgfSB9LAotICB7ICJhYnNxIgllbWl0X2Fic3EsIDIsIHsgRVhQLCBJUiB9IH0sCi0jZW5kaWYKLQotICB7ICJzZXh0YiIsCWVtaXRfc2V4dFgsIChQVFIpMCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSAqLyB9IH0sCi0gIHsgInNleHR3IiwJZW1pdF9zZXh0WCwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BICovIH0gfSwKLQotICB7ICJkaXZsIiwJZW1pdF9kaXZpc2lvbiwgIl9fZGl2bCIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJkaXZsdSIsCWVtaXRfZGl2aXNpb24sICJfX2Rpdmx1IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCi0gIHsgImRpdnEiLAllbWl0X2RpdmlzaW9uLCAiX19kaXZxIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCi0gIHsgImRpdnF1IiwJZW1pdF9kaXZpc2lvbiwgIl9fZGl2cXUiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICAvKiBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BICovIH0gfSwKLSAgeyAicmVtbCIsCWVtaXRfZGl2aXNpb24sICJfX3JlbWwiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICAvKiBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BICovIH0gfSwKLSAgeyAicmVtbHUiLAllbWl0X2RpdmlzaW9uLCAiX19yZW1sdSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJyZW1xIiwJZW1pdF9kaXZpc2lvbiwgIl9fcmVtcSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJyZW1xdSIsCWVtaXRfZGl2aXNpb24sICJfX3JlbXF1IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCi0KLSAgeyAianNyIiwJZW1pdF9qc3JqbXAsICJqc3IiLAotICAgIHsgTUFDUk9fUElSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJqbXAiLAllbWl0X2pzcmptcCwgImptcCIsCi0gICAgeyBNQUNST19QSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInJldCIsCWVtaXRfcmV0amNyLCAicmV0IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19QSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImpjciIsCWVtaXRfcmV0amNyLCAiamNyIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19QSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImpzcl9jb3JvdXRpbmUiLAllbWl0X3JldGpjciwgImpjciIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FT0EgfSB9LAotfTsKLQotc3RhdGljIGNvbnN0IGludCBhbHBoYV9udW1fbWFjcm9zCi0gID0gc2l6ZW9mKGFscGhhX21hY3JvcykgLyBzaXplb2YoKmFscGhhX21hY3Jvcyk7Ci0MCi0vKiBQdWJsaWMgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2V0cwotICAgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwKLSAgIG5lZWQsIHRoYXQgY2FuIGJlIGRldGVybWluZWQgYmVmb3JlIGFyZ3VtZW50cyBhcmUgcGFyc2VkLiAgKi8KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogQ3JlYXRlIHRoZSBvcGNvZGUgaGFzaCB0YWJsZSAqLwotCi0gIGFscGhhX29wY29kZV9oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBhbHBoYV9udW1fb3Bjb2RlczsgKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsICpyZXR2YWwsICpzbGFzaDsKLQotICAgICAgbmFtZSA9IGFscGhhX29wY29kZXNbaV0ubmFtZTsKLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChhbHBoYV9vcGNvZGVfaGFzaCwgbmFtZSwgKFBUUikmYWxwaGFfb3Bjb2Rlc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsKQotCWFzX2ZhdGFsIChfKCJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBvcGNvZGUgYCVzJzogJXMiKSwgbmFtZSwgcmV0dmFsKTsKLQotICAgICAgLyogU29tZSBvcGNvZGVzIGluY2x1ZGUgbW9kaWZpZXJzIG9mIHZhcmlvdXMgc29ydHMgd2l0aCBhICIvbW9kIgotCSBzeW50YXgsIGxpa2UgdGhlIGFyY2hpdGVjdHVyZSBtYW51YWwgc3VnZ2VzdHMuICBIb3dldmVyLCBmb3IKLQkgdXNlIHdpdGggZ2NjIGF0IGxlYXN0LCB3ZSBhbHNvIG5lZWQgYWNjZXNzIHRvIHRob3NlIHNhbWUgb3Bjb2RlcwotCSB3aXRob3V0IHRoZSAiLyIuICAqLwotCi0gICAgICBpZiAoKHNsYXNoID0gc3RyY2hyIChuYW1lLCAnLycpKSAhPSBOVUxMKQotCXsKLQkgIGNoYXIgKnAgPSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpKTsKLQkgIG1lbWNweSAocCwgbmFtZSwgc2xhc2ggLSBuYW1lKTsKLQkgIHN0cmNweSAocCArIChzbGFzaCAtIG5hbWUpLCBzbGFzaCArIDEpOwotCi0JICAodm9pZCloYXNoX2luc2VydChhbHBoYV9vcGNvZGVfaGFzaCwgcCwgKFBUUikmYWxwaGFfb3Bjb2Rlc1tpXSk7Ci0JICAvKiBJZ25vcmUgZmFpbHVyZXMgLS0gdGhlIG9wY29kZSB0YWJsZSBkb2VzIGR1cGxpY2F0ZSBzb21lCi0JICAgICB2YXJpYW50cyBpbiBkaWZmZXJlbnQgZm9ybXMsIGxpa2UgImh3X3N0cSIgYW5kICJod19zdC9xIi4gICovCi0JfQotCi0gICAgICB3aGlsZSAoKytpIDwgYWxwaGFfbnVtX29wY29kZXMKLQkgICAgICYmIChhbHBoYV9vcGNvZGVzW2ldLm5hbWUgPT0gbmFtZQotCQkgfHwgIXN0cmNtcCAoYWxwaGFfb3Bjb2Rlc1tpXS5uYW1lLCBuYW1lKSkpCi0JY29udGludWU7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSB0aGUgbWFjcm8gaGFzaCB0YWJsZSAqLwotCi0gIGFscGhhX21hY3JvX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgZm9yIChpID0gMDsgaSA8IGFscGhhX251bV9tYWNyb3M7ICkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lLCAqcmV0dmFsOwotCi0gICAgICBuYW1lID0gYWxwaGFfbWFjcm9zW2ldLm5hbWU7Ci0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAoYWxwaGFfbWFjcm9faGFzaCwgbmFtZSwgKFBUUikmYWxwaGFfbWFjcm9zW2ldKTsKLSAgICAgIGlmIChyZXR2YWwpCi0JYXNfZmF0YWwgKF8oImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIG1hY3JvIGAlcyc6ICVzIiksIG5hbWUsIHJldHZhbCk7Ci0KLSAgICAgIHdoaWxlICgrK2kgPCBhbHBoYV9udW1fbWFjcm9zCi0JICAgICAmJiAoYWxwaGFfbWFjcm9zW2ldLm5hbWUgPT0gbmFtZQotCQkgfHwgIXN0cmNtcCAoYWxwaGFfbWFjcm9zW2ldLm5hbWUsIG5hbWUpKSkKLQljb250aW51ZTsKLSAgICB9Ci0KLSAgLyogQ29uc3RydWN0IHN5bWJvbHMgZm9yIGVhY2ggb2YgdGhlIHJlZ2lzdGVycyAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKQotICAgIHsKLSAgICAgIGNoYXIgbmFtZVs0XTsKLSAgICAgIHNwcmludGYobmFtZSwgIiQlZCIsIGkpOwotICAgICAgYWxwaGFfcmVnaXN0ZXJfdGFibGVbaV0gPSBzeW1ib2xfY3JlYXRlKG5hbWUsIHJlZ19zZWN0aW9uLCBpLAotCQkJCQkgICAgICAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgIH0KLSAgZm9yICg7IGkgPCA2NDsgKytpKQotICAgIHsKLSAgICAgIGNoYXIgbmFtZVs1XTsKLSAgICAgIHNwcmludGYobmFtZSwgIiRmJWQiLCBpLTMyKTsKLSAgICAgIGFscGhhX3JlZ2lzdGVyX3RhYmxlW2ldID0gc3ltYm9sX2NyZWF0ZShuYW1lLCByZWdfc2VjdGlvbiwgaSwKLQkJCQkJICAgICAgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIHRoZSBzcGVjaWFsIHN5bWJvbHMgYW5kIHNlY3Rpb25zIHdlJ2xsIGJlIHVzaW5nICovCi0KLSAgLyogU28gLnNic3Mgd2lsbCBnZXQgdXNlZCBmb3IgdGlueSBvYmplY3RzLiAgKi8KLSAgYmZkX3NldF9ncF9zaXplIChzdGRvdXRwdXQsIGdfc3dpdGNoX3ZhbHVlKTsKLQotI2lmZGVmIE9CSl9FQ09GRgotICBjcmVhdGVfbGl0ZXJhbF9zZWN0aW9uICgiLmxpdGEiLCAmYWxwaGFfbGl0YV9zZWN0aW9uLCAmYWxwaGFfbGl0YV9zeW1ib2wpOwotCi0gIC8qIEZvciBoYW5kbGluZyB0aGUgR1AsIGNyZWF0ZSBhIHN5bWJvbCB0aGF0IHdvbid0IGJlIG91dHB1dCBpbiB0aGUKLSAgICAgc3ltYm9sIHRhYmxlLiAgV2UnbGwgZWRpdCBpdCBvdXQgb2YgcmVsb2NzIGxhdGVyLiAgKi8KLSAgYWxwaGFfZ3Bfc3ltYm9sID0gc3ltYm9sX2NyZWF0ZSAoIjxHUCB2YWx1ZT4iLCBhbHBoYV9saXRhX3NlY3Rpb24sIDB4ODAwMCwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRVZBWAotICBjcmVhdGVfbGl0ZXJhbF9zZWN0aW9uICgiLmxpbmsiLCAmYWxwaGFfbGlua19zZWN0aW9uLCAmYWxwaGFfbGlua19zeW1ib2wpOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgewotICAgICAgc2VnVCBzZWMgPSBzdWJzZWdfbmV3KCIubWRlYnVnIiwgKHN1YnNlZ1QpMCk7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3Moc3Rkb3V0cHV0LCBzZWMsIFNFQ19IQVNfQ09OVEVOVFN8U0VDX1JFQURPTkxZKTsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoc3Rkb3V0cHV0LCBzZWMsIDMpOwotICAgIH0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0KLSAgc3Vic2VnX3NldCh0ZXh0X3NlY3Rpb24sIDApOwotfQotCi0vKiBUaGUgcHVibGljIGludGVyZmFjZSB0byB0aGUgaW5zdHJ1Y3Rpb24gYXNzZW1ibGVyLiAgKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyIG9wbmFtZVszMl07CQkJLyogY3VycmVudCBtYXhpbXVtIGlzIDEzICovCi0gIGV4cHJlc3Npb25TIHRva1tNQVhfSU5TTl9BUkdTXTsKLSAgaW50IG50b2ssIG9wbmFtZWxlbiwgdHJ1bmNsZW47Ci0KLSAgLyogc3BsaXQgb2ZmIHRoZSBvcGNvZGUgKi8KLSAgb3BuYW1lbGVuID0gc3Ryc3BuIChzdHIsICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5el8vNDY4Iik7Ci0gIHRydW5jbGVuID0gKG9wbmFtZWxlbiA8IHNpemVvZiAob3BuYW1lKSAtIDEKLQkgICAgICA/IG9wbmFtZWxlbgotCSAgICAgIDogc2l6ZW9mIChvcG5hbWUpIC0gMSk7Ci0gIG1lbWNweSAob3BuYW1lLCBzdHIsIHRydW5jbGVuKTsKLSAgb3BuYW1lW3RydW5jbGVuXSA9ICdcMCc7Ci0KLSAgLyogdG9rZW5pemUgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgKi8KLSAgaWYgKChudG9rID0gdG9rZW5pemVfYXJndW1lbnRzIChzdHIgKyBvcG5hbWVsZW4sIHRvaywgTUFYX0lOU05fQVJHUykpIDwgMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogZmluaXNoIGl0IG9mZiAqLwotICBhc3NlbWJsZV90b2tlbnMgKG9wbmFtZSwgdG9rLCBudG9rLCBhbHBoYV9tYWNyb3Nfb24pOwotfQotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24ncyBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCi0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBzaXplKQotICAgICBzZWdUIHNlZzsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQoc3Rkb3V0cHV0LCBzZWcpOwotICB2YWx1ZVQgbWFzayA9ICgodmFsdWVUKTEgPDwgYWxpZ24pIC0gMTsKLQotICByZXR1cm4gKHNpemUgKyBtYXNrKSAmIH5tYXNrOwotfQotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIG9mIHR5cGUgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIKLSAgIG9mIExJVFRMRU5VTVMgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQLiAgQW4gZXJyb3IgbWVzc2FnZSBpcwotICAgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLwotCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotZXh0ZXJuIGNoYXIgKnZheF9tZF9hdG9mIFBBUkFNUyAoKGludCwgY2hhciAqLCBpbnQgKikpOwotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgICAgLyogVkFYIGZsb2F0cyAqLwotICAgIGNhc2UgJ0cnOgotICAgICAgLyogVkFYIG1kX2F0b2YgZG9lc24ndCBsaWtlICJHIiBmb3Igc29tZSByZWFzb24uICAqLwotICAgICAgdHlwZSA9ICdnJzsKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdEJzoKLSAgICAgIHJldHVybiB2YXhfbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApOwotCi0gICAgICAvKiBJRUVFIGZsb2F0cyAqLwotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOwotICAgIH0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQotICBmb3IgKHdvcmRQID0gd29yZHMgKyBwcmVjIC0gMTsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQLS0pLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogVGFrZSBjYXJlIG9mIHRoZSB0YXJnZXQtc3BlY2lmaWMgY29tbWFuZC1saW5lIG9wdGlvbnMuICAqLwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ0YnOgotICAgICAgYWxwaGFfbm9mbG9hdHNfb24gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl8zMkFERFI6Ci0gICAgICBhbHBoYV9hZGRyMzJfb24gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdnJzoKLSAgICAgIGFscGhhX2RlYnVnID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICBnX3N3aXRjaF92YWx1ZSA9IGF0b2koYXJnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbSc6Ci0gICAgICB7Ci0JY29uc3Qgc3RydWN0IGNwdV90eXBlICpwOwotCWZvciAocCA9IGNwdV90eXBlczsgcC0+bmFtZTsgKytwKQotCSAgaWYgKHN0cmNtcChhcmcsIHAtPm5hbWUpID09IDApCi0JICAgIHsKLQkgICAgICBhbHBoYV90YXJnZXRfbmFtZSA9IHAtPm5hbWUsIGFscGhhX3RhcmdldCA9IHAtPmZsYWdzOwotCSAgICAgIGdvdG8gZm91bmQ7Ci0JICAgIH0KLQlhc193YXJuKF8oIlVua25vd24gQ1BVIGlkZW50aWZpZXIgYCVzJyIpLCBhcmcpOwotICAgICAgZm91bmQ6OwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfRVZBWAotICAgIGNhc2UgJysnOgkJCS8qIEZvciBnKysuICBIYXNoIGFueSBuYW1lID4gNjMgY2hhcnMgbG9uZy4gKi8KLSAgICAgIGFscGhhX2ZsYWdfaGFzaF9sb25nX25hbWVzID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSCc6CQkJLyogU2hvdyBuZXcgc3ltYm9sIGFmdGVyIGhhc2ggdHJ1bmNhdGlvbiAqLwotICAgICAgYWxwaGFfZmxhZ19zaG93X2FmdGVyX3RydW5jID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaCc6CQkJLyogZm9yIGdudS1jL3ZheCBjb21wYXRpYmlsaXR5LiAgKi8KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlIE9QVElPTl9SRUxBWDoKLSAgICAgIGFscGhhX2ZsYWdfcmVsYXggPSAxOwotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgY2FzZSBPUFRJT05fTURFQlVHOgotICAgICAgYWxwaGFfZmxhZ19tZGVidWcgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTk9fTURFQlVHOgotICAgICAgYWxwaGFfZmxhZ19tZGVidWcgPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFByaW50IGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIHRoYXQgd2UgYWNjZXB0LiAgKi8KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwdXRzKF8oIlwKLUFscGhhIG9wdGlvbnM6XG5cCi0tMzJhZGRyCQkJdHJlYXQgYWRkcmVzc2VzIGFzIDMyLWJpdCB2YWx1ZXNcblwKLS1GCQkJbGFjayBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgc3VwcG9ydFxuXAotLW1ldjQgfCAtbWV2NDUgfCAtbWV2NSB8IC1tZXY1NiB8IC1tcGNhNTYgfCAtbWV2NiB8IC1tYWxsXG5cCi0JCQlzcGVjaWZ5IHZhcmlhbnQgb2YgQWxwaGEgYXJjaGl0ZWN0dXJlXG5cCi0tbTIxMDY0IHwgLW0yMTA2NiB8IC1tMjExNjQgfCAtbTIxMTY0YSB8IC1tMjExNjRwYyB8IC1tMjEyNjRcblwKLQkJCXRoZXNlIHZhcmlhbnRzIGluY2x1ZGUgUEFMY29kZSBvcGNvZGVzXG4iKSwKLQlzdHJlYW0pOwotI2lmZGVmIE9CSl9FVkFYCi0gIGZwdXRzIChfKCJcCi1WTVMgb3B0aW9uczpcblwKLS0rCQkJaGFzaCBlbmNvZGUgKGRvbid0IHRydW5jYXRlKSBuYW1lcyBsb25nZXIgdGhhbiA2NCBjaGFyYWN0ZXJzXG5cCi0tSAkJCXNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb25cbiIpLAotCXN0cmVhbSk7Ci0jZW5kaWYKLX0KLQotLyogRGVjaWRlIGZyb20gd2hhdCBwb2ludCBhIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8sCi0gICByZWxhdGl2ZSB0byB0aGUgcGMtcmVsYXRpdmUgZml4dXAuICBFciwgcmVsYXRpdmVseSBzcGVha2luZy4gICovCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHZhbHVlVCBhZGRyID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OgotICAgICAgcmV0dXJuIGFkZHI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmaXhQLT5meF9zaXplICsgYWRkcjsKLSAgICB9Ci19Ci0KLS8qIEF0dGVtcHQgdG8gc2ltcGxpZnkgb3IgZXZlbiBlbGltaW5hdGUgYSBmaXh1cC4gIFRoZSByZXR1cm4gdmFsdWUgaXMKLSAgIGlnbm9yZWQ7IHBlcmhhcHMgaXQgd2FzIG9uY2UgbWVhbmluZ2Z1bCwgYnV0IG5vdyBpdCBpcyBoaXN0b3JpY2FsLgotICAgVG8gaW5kaWNhdGUgdGhhdCBhIGZpeHVwIGhhcyBiZWVuIGVsaW1pbmF0ZWQsIHNldCBmaXhQLT5meF9kb25lLgotCi0gICBGb3IgRUxGLCBoZXJlIGl0IGlzIHRoYXQgd2UgdHJhbnNmb3JtIHRoZSBHUERJU1BfSEkxNiByZWxvYyB3ZSB1c2VkCi0gICBpbnRlcm5hbGx5IGludG8gdGhlIEdQRElTUCByZWxvYyB1c2VkIGV4dGVybmFsbHkuICBXZSBoYWQgdG8gZG8KLSAgIHRoaXMgc28gdGhhdCB3ZSdkIGhhdmUgdGhlIEdQRElTUF9MTzE2IHJlbG9jIGFzIGEgdGFnIHRvIGNvbXB1dGUKLSAgIHRoZSBkaXN0YW5jZSB0byB0aGUgImxkYSIgaW5zdHJ1Y3Rpb24gZm9yIHNldHRpbmcgdGhlIGFkZGVuZCB0bwotICAgR1BESVNQLiAgKi8KLQotaW50Ci1tZF9hcHBseV9maXggKGZpeFAsIHZhbHVlUCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWx1ZVA7Ci17Ci0gIGNoYXIgKiBjb25zdCBmaXhwb3MgPSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0gIHZhbHVlVCB2YWx1ZSA9ICp2YWx1ZVA7Ci0gIHVuc2lnbmVkIGltYWdlLCBzaXplOwotCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICAgIC8qIFRoZSBHUERJU1AgcmVsb2NhdGlvbnMgYXJlIHByb2Nlc3NlZCBpbnRlcm5hbGx5IHdpdGggYSBzeW1ib2wKLQkgcmVmZXJyaW5nIHRvIHRoZSBjdXJyZW50IGZ1bmN0aW9uOyB3ZSBuZWVkIHRvIGRyb3AgaW4gYSB2YWx1ZQotCSB3aGljaCwgd2hlbiBhZGRlZCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLAotCSBnaXZlcyB0aGUgZGVzaXJlZCBHUC4gICovCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTY6Ci0gICAgICB7Ci0JZml4UyAqbmV4dCA9IGZpeFAtPmZ4X25leHQ7Ci0JYXNzZXJ0IChuZXh0LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2KTsKLQotCWZpeFAtPmZ4X29mZnNldCA9IChuZXh0LT5meF9mcmFnLT5mcl9hZGRyZXNzICsgbmV4dC0+Znhfd2hlcmUKLQkJCSAgIC0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyAtIGZpeFAtPmZ4X3doZXJlKTsKLQotCXZhbHVlID0gKHZhbHVlIC0gc2lnbl9leHRlbmRfMTYgKHZhbHVlKSkgPj4gMTY7Ci0gICAgICB9Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0FMUEhBX0dQRElTUDsKLSNlbmRpZgotICAgICAgZ290byBkb19yZWxvY19ncDsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OgotICAgICAgdmFsdWUgPSBzaWduX2V4dGVuZF8xNiAodmFsdWUpOwotICAgICAgZml4UC0+Znhfb2Zmc2V0ID0gMDsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBmaXhQLT5meF9kb25lID0gMTsKLSNlbmRpZgotCi0gICAgZG9fcmVsb2NfZ3A6Ci0gICAgICBmaXhQLT5meF9hZGRzeSA9IHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZml4cG9zLCB2YWx1ZSwgMik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCWZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsKLSAgICAgIHNpemUgPSAyOwotICAgICAgZ290byBkb19yZWxvY194eDsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCkKLQlmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0gICAgICBzaXplID0gNDsKLSAgICAgIGdvdG8gZG9fcmVsb2NfeHg7Ci0gICAgY2FzZSBCRkRfUkVMT0NfNjQ6Ci0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzY0X1BDUkVMOwotICAgICAgc2l6ZSA9IDg7Ci0gICAgZG9fcmVsb2NfeHg6Ci0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMCAmJiBmaXhQLT5meF9hZGRzeSA9PSAwKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cG9zLCB2YWx1ZSwgc2l6ZSk7Ci0JICBnb3RvIGRvbmU7Ci0JfQotICAgICAgcmV0dXJuIDE7Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDMyOgotICAgICAgYXNzZXJ0IChmaXhQLT5meF9zdWJzeSA9PSBhbHBoYV9ncF9zeW1ib2wpOwotICAgICAgZml4UC0+Znhfc3Vic3kgPSAwOwotICAgICAgLyogRklYTUU6IGluaGVyaXRlZCB0aGlzIG9ibGl2aW91c25lc3Mgb2YgYHZhbHVlJyAtLSB3aHk/ICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHBvcywgLWFscGhhX2dwX3ZhbHVlLCA0KTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0dQUkVMMzI6Ci0gICAgICByZXR1cm4gMTsKLSNlbmRpZgotCi0gICAgY2FzZSBCRkRfUkVMT0NfMjNfUENSRUxfUzI6Ci0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMCAmJiBmaXhQLT5meF9hZGRzeSA9PSAwKQotCXsKLQkgIGltYWdlID0gYmZkX2dldGwzMihmaXhwb3MpOwotCSAgaW1hZ2UgPSAoaW1hZ2UgJiB+MHgxRkZGRkYpIHwgKCh2YWx1ZSA+PiAyKSAmIDB4MUZGRkZGKTsKLQkgIGdvdG8gd3JpdGVfZG9uZTsKLQl9Ci0gICAgICByZXR1cm4gMTsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0hJTlQ6Ci0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMCAmJiBmaXhQLT5meF9hZGRzeSA9PSAwKQotCXsKLQkgIGltYWdlID0gYmZkX2dldGwzMihmaXhwb3MpOwotCSAgaW1hZ2UgPSAoaW1hZ2UgJiB+MHgzRkZGKSB8ICgodmFsdWUgPj4gMikgJiAweDNGRkYpOwotCSAgZ290byB3cml0ZV9kb25lOwotCX0KLSAgICAgIHJldHVybiAxOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDoKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZml4cG9zLCB2YWx1ZSwgMik7Ci0gICAgICByZXR1cm4gMTsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRToKLSAgICAgIHJldHVybiAxOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRToKLSAgICAgIHJldHVybiAxOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSOgotICAgICAgcmV0dXJuIDE7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0JY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQ7Ci0KLQlpZiAoKGludClmaXhQLT5meF9yX3R5cGUgPj0gMCkKLQkgIGFzX2ZhdGFsIChfKCJ1bmhhbmRsZWQgcmVsb2NhdGlvbiB0eXBlICVzIiksCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4UC0+Znhfcl90eXBlKSk7Ci0KLQlhc3NlcnQgKC0oaW50KWZpeFAtPmZ4X3JfdHlwZSA8IGFscGhhX251bV9vcGVyYW5kcyk7Ci0Jb3BlcmFuZCA9ICZhbHBoYV9vcGVyYW5kc1stKGludClmaXhQLT5meF9yX3R5cGVdOwotCi0JLyogVGhlIHJlc3Qgb2YgdGhlc2UgZml4dXBzIG9ubHkgZXhpc3QgaW50ZXJuYWxseSBkdXJpbmcgc3ltYm9sCi0JICAgcmVzb2x1dGlvbiBhbmQgaGF2ZSBubyByZXByZXNlbnRhdGlvbiBpbiB0aGUgb2JqZWN0IGZpbGUuCi0JICAgVGhlcmVmb3JlIHRoZXkgbXVzdCBiZSBjb21wbGV0ZWx5IHJlc29sdmVkIGFzIGNvbnN0YW50cy4gICovCi0KLQlpZiAoZml4UC0+ZnhfYWRkc3kgIT0gMAotCSAgICAmJiBmaXhQLT5meF9hZGRzeS0+YnN5bS0+c2VjdGlvbiAhPSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygibm9uLWFic29sdXRlIGV4cHJlc3Npb24gaW4gY29uc3RhbnQgZmllbGQiKSk7Ci0KLQlpbWFnZSA9IGJmZF9nZXRsMzIoZml4cG9zKTsKLQlpbWFnZSA9IGluc2VydF9vcGVyYW5kKGltYWdlLCBvcGVyYW5kLCAob2Zmc2V0VCl2YWx1ZSwKLQkJCSAgICAgICBmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lKTsKLSAgICAgIH0KLSAgICAgIGdvdG8gd3JpdGVfZG9uZTsKLSAgICB9Ci0KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IDAgfHwgZml4UC0+ZnhfcGNyZWwgIT0gMCkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX3dhcm5fd2hlcmUoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgIF8oInR5cGUgJWQgcmVsb2MgZG9uZT9cbiIpLCAoaW50KWZpeFAtPmZ4X3JfdHlwZSk7Ci0gICAgICBnb3RvIGRvbmU7Ci0gICAgfQotCi13cml0ZV9kb25lOgotICBtZF9udW1iZXJfdG9fY2hhcnMoZml4cG9zLCBpbWFnZSwgNCk7Ci0KLWRvbmU6Ci0gIGZpeFAtPmZ4X2RvbmUgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIExvb2sgZm9yIGEgcmVnaXN0ZXIgbmFtZSBpbiB0aGUgZ2l2ZW4gc3ltYm9sLgotICovCi0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpZiAoKm5hbWUgPT0gJyQnKQotICAgIHsKLSAgICAgIGludCBpc19mbG9hdCA9IDAsIG51bTsKLQotICAgICAgc3dpdGNoICgqKytuYW1lKQotCXsKLQljYXNlICdmJzoKLQkgIGlmIChuYW1lWzFdID09ICdwJyAmJiBuYW1lWzJdID09ICdcMCcpCi0JICAgIHJldHVybiBhbHBoYV9yZWdpc3Rlcl90YWJsZVtBWFBfUkVHX0ZQXTsKLQkgIGlzX2Zsb2F0ID0gMzI7Ci0JICAvKiBGQUxMVEhSVSAqLwotCi0JY2FzZSAncic6Ci0JICBpZiAoIWlzZGlnaXQoKisrbmFtZSkpCi0JICAgIGJyZWFrOwotCSAgLyogRkFMTFRIUlUgKi8KLQotCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLQljYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0JICBpZiAobmFtZVsxXSA9PSAnXDAnKQotCSAgICBudW0gPSBuYW1lWzBdIC0gJzAnOwotCSAgZWxzZSBpZiAobmFtZVswXSAhPSAnMCcgJiYgaXNkaWdpdChuYW1lWzFdKSAmJiBuYW1lWzJdID09ICdcMCcpCi0JICAgIHsKLQkgICAgICBudW0gPSAobmFtZVswXSAtICcwJykgKiAxMCArIG5hbWVbMV0gLSAnMCc7Ci0JICAgICAgaWYgKG51bSA+PSAzMikKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgYnJlYWs7Ci0KLQkgIGlmICghYWxwaGFfbm9hdF9vbiAmJiBudW0gPT0gQVhQX1JFR19BVCkKLQkgICAgYXNfd2FybihfKCJVc2VkICRhdCB3aXRob3V0IFwiLnNldCBub2F0XCIiKSk7Ci0JICByZXR1cm4gYWxwaGFfcmVnaXN0ZXJfdGFibGVbbnVtICsgaXNfZmxvYXRdOwotCi0JY2FzZSAnYSc6Ci0JICBpZiAobmFtZVsxXSA9PSAndCcgJiYgbmFtZVsyXSA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgaWYgKCFhbHBoYV9ub2F0X29uKQotCQlhc193YXJuKF8oIlVzZWQgJGF0IHdpdGhvdXQgXCIuc2V0IG5vYXRcIiIpKTsKLQkgICAgICByZXR1cm4gYWxwaGFfcmVnaXN0ZXJfdGFibGVbQVhQX1JFR19BVF07Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnZyc6Ci0JICBpZiAobmFtZVsxXSA9PSAncCcgJiYgbmFtZVsyXSA9PSAnXDAnKQotCSAgICByZXR1cm4gYWxwaGFfcmVnaXN0ZXJfdGFibGVbYWxwaGFfZ3BfcmVnaXN0ZXJdOwotCSAgYnJlYWs7Ci0KLQljYXNlICdzJzoKLQkgIGlmIChuYW1lWzFdID09ICdwJyAmJiBuYW1lWzJdID09ICdcMCcpCi0JICAgIHJldHVybiBhbHBoYV9yZWdpc3Rlcl90YWJsZVtBWFBfUkVHX1NQXTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi0jaWZkZWYgT0JKX0VDT0ZGCi0vKiBAQEAgTWFnaWMgRUNPRkYgYml0cy4gICovCi0KLXZvaWQKLWFscGhhX2Zyb2JfZWNvZmZfZGF0YSAoKQotewotICBzZWxlY3RfZ3BfdmFsdWUgKCk7Ci0gIC8qICR6ZXJvIGFuZCAkZjMxIGFyZSByZWFkLW9ubHkgKi8KLSAgYWxwaGFfZ3BybWFzayAmPSB+MTsKLSAgYWxwaGFfZnBybWFzayAmPSB+MTsKLX0KLSNlbmRpZgotCi0vKiBIb29rIHRvIHJlbWVtYmVyIGEgcmVjZW50bHkgZGVmaW5lZCBsYWJlbCBzbyB0aGF0IHRoZSBhdXRvLWFsaWduCi0gICBjb2RlIGNhbiBhZGp1c3QgdGhlIHN5bWJvbCBhZnRlciB3ZSBrbm93IHdoYXQgYWxpZ25tZW50IHdpbGwgYmUKLSAgIHJlcXVpcmVkLiAgKi8KLQotdm9pZAotYWxwaGFfZGVmaW5lX2xhYmVsIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IHN5bTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgd2UgbXVzdCBhbHdheXMgZW1pdCBhIHJlbG9jIGZvciBhIHR5cGUgYW5kIGZhbHNlIGlmCi0gICB0aGVyZSBpcyBzb21lIGhvcGUgb2YgcmVzb2x2aW5nIGl0IGEgYXNzZW1ibHkgdGltZS4gICovCi0KLWludAotYWxwaGFfZm9yY2VfcmVsb2NhdGlvbiAoZikKLSAgICAgZml4UyAqZjsKLXsKLSAgaWYgKGFscGhhX2ZsYWdfcmVsYXgpCi0gICAgcmV0dXJuIDE7Ci0KLSAgc3dpdGNoIChmLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUDoKLSNpZmRlZiBPQkpfRUNPRkYKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOgotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOgotI2VuZGlmCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOgotICAgIGNhc2UgQkZEX1JFTE9DX0dQUkVMMzI6Ci0jaWZkZWYgT0JKX0VWQVgKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSOgotI2VuZGlmCi0gICAgICByZXR1cm4gMTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzIzX1BDUkVMX1MyOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgIGNhc2UgQkZEX1JFTE9DXzY0OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0hJTlQ6Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc3NlcnQoKGludClmLT5meF9yX3R5cGUgPCAwICYmIC0oaW50KWYtPmZ4X3JfdHlwZSA8IGFscGhhX251bV9vcGVyYW5kcyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHdlIGNhbiBwYXJ0aWFsbHkgcmVzb2x2ZSBhIHJlbG9jYXRpb24gbm93LiAgKi8KLQotaW50Ci1hbHBoYV9maXhfYWRqdXN0YWJsZSAoZikKLSAgICAgZml4UyAqZjsKLXsKLSNpZmRlZiBPQkpfRUxGCi0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzICovCi0gIGlmIChTX0lTX0VYVEVSTiAoZi0+ZnhfYWRkc3kpIHx8IFNfSVNfV0VBSyAoZi0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotI2VuZGlmCi0KLSAgLyogQXJlIHRoZXJlIGFueSByZWxvY2F0aW9uIHR5cGVzIGZvciB3aGljaCB3ZSBtdXN0IGdlbmVyYXRlIGEgcmVsb2MKLSAgICAgYnV0IHdlIGNhbiBhZGp1c3QgdGhlIHZhbHVlcyBjb250YWluZWQgd2l0aGluIGl0PyAgKi8KLSAgc3dpdGNoIChmLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUDoKLSAgICAgIHJldHVybiAwOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDoKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTDoKLSNlbmRpZgotI2lmZGVmIE9CSl9FVkFYCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRToKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUjoKLSNlbmRpZgotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U6Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0dQUkVMMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjNfUENSRUxfUzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfNjQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfSElOVDoKLSAgICAgIHJldHVybiAxOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzc2VydCAoKGludClmLT5meF9yX3R5cGUgPCAwCi0JICAgICAgJiYgLSAoaW50KWYtPmZ4X3JfdHlwZSA8IGFscGhhX251bV9vcGVyYW5kcyk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIEdlbmVyYXRlIHRoZSBCRkQgcmVsb2MgdG8gYmUgc3R1Y2sgaW4gdGhlIG9iamVjdCBmaWxlIGZyb20gdGhlCi0gICBmaXh1cCB1c2VkIGludGVybmFsbHkgaW4gdGhlIGFzc2VtYmxlci4gICovCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWMsIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbG9jOwotCi0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9ICZmaXhwLT5meF9hZGRzeS0+YnN5bTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0KLSAgLyogTWFrZSBzdXJlIG5vbmUgb2Ygb3VyIGludGVybmFsIHJlbG9jYXRpb25zIG1ha2UgaXQgdGhpcyBmYXIuCi0gICAgIFRoZXknZCBiZXR0ZXIgaGF2ZSBiZWVuIGZ1bGx5IHJlc29sdmVkIGJ5IHRoaXMgcG9pbnQuICAqLwotICBhc3NlcnQgKChpbnQpZml4cC0+Znhfcl90eXBlID4gMCk7Ci0KLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJjYW5ub3QgcmVwcmVzZW50IGAlcycgcmVsb2NhdGlvbiBpbiBvYmplY3QgZmlsZSIpLAotCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeHAtPmZ4X3JfdHlwZSkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghZml4cC0+ZnhfcGNyZWwgIT0gIXJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oImludGVybmFsIGVycm9yPyBjYW5ub3QgZ2VuZXJhdGUgYCVzJyByZWxvY2F0aW9uIiksCi0JCWJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXhwLT5meF9yX3R5cGUpKTsKLSAgICB9Ci0gIGFzc2VydCAoIWZpeHAtPmZ4X3BjcmVsID09ICFyZWxvYy0+aG93dG8tPnBjX3JlbGF0aXZlKTsKLQotI2lmZGVmIE9CSl9FQ09GRgotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMKQotICAgIHsKLSAgICAgIC8qIGZha2Ugb3V0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uIHNpZ2ggKi8KLSAgICAgIHJlbG9jLT5hZGRlbmQgPSAtYWxwaGFfZ3BfdmFsdWU7Ci0gICAgfQotICBlbHNlCi0jZW5kaWYKLSAgICB7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotI2lmZGVmIE9CSl9FTEYKLSAgICAgIC8qCi0gICAgICAgKiBPaGhoLCB0aGlzIGlzIHVnbHkuICBUaGUgcHJvYmxlbSBpcyB0aGF0IGlmIHRoaXMgaXMgYSBsb2NhbCBnbG9iYWwKLSAgICAgICAqIHN5bWJvbCwgdGhlIHJlbG9jYXRpb24gd2lsbCBlbnRpcmVseSBiZSBwZXJmb3JtZWQgYXQgbGluayB0aW1lLCBub3QKLSAgICAgICAqIGF0IGFzc2VtYmx5IHRpbWUuICBiZmRfcGVyZm9ybV9yZWxvYyBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyBzb3J0Ci0gICAgICAgKiBvZiB0aGluZywgYW5kIGFzIGEgcmVzdWx0IHdlIG5lZWQgdG8gZmFrZSBpdCBvdXQgaGVyZS4KLSAgICAgICAqLwotICAgICAgaWYgKChTX0lTX0VYVEVSTiAoZml4cC0+ZnhfYWRkc3kpIHx8IFNfSVNfV0VBSyAoZml4cC0+ZnhfYWRkc3kpKQotCSAgJiYgIVNfSVNfQ09NTU9OKGZpeHAtPmZ4X2FkZHN5KSkKLQlyZWxvYy0+YWRkZW5kIC09IGZpeHAtPmZ4X2FkZHN5LT5ic3ltLT52YWx1ZTsKLSNlbmRpZgotICAgIH0KLQotICByZXR1cm4gcmVsb2M7Ci19Ci0KLS8qIFBhcnNlIGEgcmVnaXN0ZXIgbmFtZSBvZmYgb2YgdGhlIGlucHV0X2xpbmUgYW5kIHJldHVybiBhIHJlZ2lzdGVyCi0gICBudW1iZXIuICBHZXRzIG1kX3VuZGVmaW5lZF9zeW1ib2wgYWJvdmUgdG8gZG8gdGhlIHJlZ2lzdGVyIG5hbWUKLSAgIG1hdGNoaW5nIGZvciB1cy4KLQotICAgT25seSBjYWxsZWQgYXMgYSBwYXJ0IG9mIHByb2Nlc3NpbmcgdGhlIEVDT0ZGIC5mcmFtZSBkaXJlY3RpdmUuICAqLwotCi1pbnQKLXRjX2dldF9yZWdpc3RlciAoZnJhbWUpCi0gICAgIGludCBmcmFtZTsKLXsKLSAgaW50IGZyYW1lcmVnID0gQVhQX1JFR19TUDsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICckJykKLSAgICB7Ci0gICAgICBjaGFyICpzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgY2hhciBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xTICpzeW0gPSBtZF91bmRlZmluZWRfc3ltYm9sIChzKTsKLQotICAgICAgKnN0cmNocihzLCAnXDAnKSA9IGM7Ci0gICAgICBpZiAoc3ltICYmIChmcmFtZXJlZyA9IFNfR0VUX1ZBTFVFIChzeW0pKSA8PSAzMSkKLQlnb3RvIGZvdW5kOwotICAgIH0KLSAgYXNfd2FybiAoXygiZnJhbWUgcmVnIGV4cGVjdGVkLCB1c2luZyAkJWQuIiksIGZyYW1lcmVnKTsKLQotZm91bmQ6Ci0gIG5vdGVfZ3ByZWcgKGZyYW1lcmVnKTsKLSAgcmV0dXJuIGZyYW1lcmVnOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIHN5bWJvbCB0YWJsZSBpcyBwcm9jZXNzZWQuICBJbiBvcmRlciB0bwotICAgd29yayB3aXRoIGdjYyB3aGVuIHVzaW5nIG1pcHMtdGZpbGUsIHdlIG11c3Qga2VlcCBhbGwgbG9jYWwgbGFiZWxzLgotICAgSG93ZXZlciwgaW4gb3RoZXIgY2FzZXMsIHdlIHdhbnQgdG8gZGlzY2FyZCB0aGVtLiAgSWYgd2Ugd2VyZQotICAgY2FsbGVkIHdpdGggLWcsIGJ1dCB3ZSBkaWRuJ3Qgc2VlIGFueSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGl0IG1heQotICAgbWVhbiB0aGF0IGdjYyBpcyBzbXVnZ2xpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRocm91Z2ggdG8KLSAgIG1pcHMtdGZpbGUsIGluIHdoaWNoIGNhc2Ugd2UgbXVzdCBnZW5lcmF0ZSBhbGwgbG9jYWwgbGFiZWxzLiAgKi8KLQotI2lmZGVmIE9CSl9FQ09GRgotCi12b2lkCi1hbHBoYV9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCAoKQotewotICBpZiAoYWxwaGFfZGVidWcgIT0gMAotICAgICAgJiYgISBlY29mZl9kZWJ1Z2dpbmdfc2VlbikKLSAgICBmbGFnX2tlZXBfbG9jYWxzID0gMTsKLX0KLQotI2VuZGlmIC8qIE9CSl9FQ09GRiAqLwotDAotLyogUGFyc2UgdGhlIGFyZ3VtZW50cyB0byBhbiBvcGNvZGUuICAqLwotCi1zdGF0aWMgaW50Ci10b2tlbml6ZV9hcmd1bWVudHMgKHN0ciwgdG9rLCBudG9rKQotICAgICBjaGFyICpzdHI7Ci0gICAgIGV4cHJlc3Npb25TIHRva1tdOwotICAgICBpbnQgbnRvazsKLXsKLSAgZXhwcmVzc2lvblMgKmVuZF90b2sgPSB0b2sgKyBudG9rOwotICBjaGFyICpvbGRfaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnQgc2F3X2NvbW1hID0gMCwgc2F3X2FyZyA9IDA7Ci0KLSAgbWVtc2V0ICh0b2ssIDAsIHNpemVvZiAoKnRvaykgKiBudG9rKTsKLQotICAvKiBTYXZlIGFuZCByZXN0b3JlIGlucHV0X2xpbmVfcG9pbnRlciBhcm91bmQgdGhpcyBmdW5jdGlvbiAqLwotICBvbGRfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLSAgd2hpbGUgKHRvayA8IGVuZF90b2sgJiYgKmlucHV0X2xpbmVfcG9pbnRlcikKLSAgICB7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBzd2l0Y2ggKCppbnB1dF9saW5lX3BvaW50ZXIpCi0JewotCWNhc2UgJ1wwJzoKLQkgIGdvdG8gZmluaTsKLQotCWNhc2UgJywnOgotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpZiAoc2F3X2NvbW1hIHx8ICFzYXdfYXJnKQotCSAgICBnb3RvIGVycjsKLQkgIHNhd19jb21tYSA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgJygnOgotCSAgewotCSAgICBjaGFyICpob2xkID0gaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLQkgICAgLyogRmlyc3QgdHJ5IGZvciBwYXJlbnRoZXNpemVkIHJlZ2lzdGVyIC4uLiAqLwotCSAgICBleHByZXNzaW9uICh0b2spOwotCSAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnKScgJiYgdG9rLT5YX29wID09IE9fcmVnaXN0ZXIpCi0JICAgICAgewotCQl0b2stPlhfb3AgPSAoc2F3X2NvbW1hID8gT19jcHJlZ2lzdGVyIDogT19wcmVnaXN0ZXIpOwotCQlzYXdfY29tbWEgPSAwOwotCQlzYXdfYXJnID0gMTsKLQkJKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSsrdG9rOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgLyogLi4uIHRoZW4gZmFsbCB0aHJvdWdoIHRvIHBsYWluIGV4cHJlc3Npb24gKi8KLQkgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgIH0KLQotCWRlZmF1bHQ6Ci0JICBpZiAoc2F3X2FyZyAmJiAhc2F3X2NvbW1hKQotCSAgICBnb3RvIGVycjsKLQkgIGV4cHJlc3Npb24gKHRvayk7Ci0JICBpZiAodG9rLT5YX29wID09IE9faWxsZWdhbCB8fCB0b2stPlhfb3AgPT0gT19hYnNlbnQpCi0JICAgIGdvdG8gZXJyOwotCi0JICBzYXdfY29tbWEgPSAwOwotCSAgc2F3X2FyZyA9IDE7Ci0JICArK3RvazsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLWZpbmk6Ci0gIGlmIChzYXdfY29tbWEpCi0gICAgZ290byBlcnI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IG9sZF9pbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHJldHVybiBudG9rIC0gKGVuZF90b2sgLSB0b2spOwotCi1lcnI6Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IG9sZF9pbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHJldHVybiAtMTsKLX0KLQotLyogU2VhcmNoIGZvcndhcmQgdGhyb3VnaCBhbGwgdmFyaWFudHMgb2YgYW4gb3Bjb2RlIGxvb2tpbmcgZm9yIGEKLSAgIHN5bnRheCBtYXRjaC4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICoKLWZpbmRfb3Bjb2RlX21hdGNoKGZpcnN0X29wY29kZSwgdG9rLCBwbnRvaywgcGNwdW1hdGNoKQotICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpmaXJzdF9vcGNvZGU7Ci0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCAqcG50b2s7Ci0gICAgIGludCAqcGNwdW1hdGNoOwotewotICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpvcGNvZGUgPSBmaXJzdF9vcGNvZGU7Ci0gIGludCBudG9rID0gKnBudG9rOwotICBpbnQgZ290X2NwdV9tYXRjaCA9IDA7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGlkeDsKLSAgICAgIGludCB0b2tpZHggPSAwOwotCi0gICAgICAvKiBEb24ndCBtYXRjaCBvcGNvZGVzIHRoYXQgZG9uJ3QgZXhpc3Qgb24gdGhpcyBhcmNoaXRlY3R1cmUgKi8KLSAgICAgIGlmICghKG9wY29kZS0+ZmxhZ3MgJiBhbHBoYV90YXJnZXQpKQotCWdvdG8gbWF0Y2hfZmFpbGVkOwotCi0gICAgICBnb3RfY3B1X21hdGNoID0gMTsKLQotICAgICAgZm9yIChvcGlkeCA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGlkeDsgKytvcGlkeCkKLQl7Ci0JICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqb3BlcmFuZCA9ICZhbHBoYV9vcGVyYW5kc1sqb3BpZHhdOwotCi0JICAvKiBvbmx5IHRha2UgaW5wdXQgZnJvbSByZWFsIG9wZXJhbmRzICovCi0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9GQUtFKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogd2hlbiB3ZSBleHBlY3QgaW5wdXQsIG1ha2Ugc3VyZSB3ZSBoYXZlIGl0ICovCi0JICBpZiAodG9raWR4ID49IG50b2spCi0JICAgIHsKLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfT1BUSU9OQUxfTUFTSykgPT0gMCkKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogbWF0Y2ggb3BlcmFuZCB0eXBlIHdpdGggZXhwcmVzc2lvbiB0eXBlICovCi0JICBzd2l0Y2ggKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfVFlQRUNIRUNLX01BU0spCi0JICAgIHsKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9JUjoKLQkgICAgICBpZiAodG9rW3Rva2lkeF0uWF9vcCAhPSBPX3JlZ2lzdGVyCi0JCSAgfHwgIWlzX2lyX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9GUFI6Ci0JICAgICAgaWYgKHRva1t0b2tpZHhdLlhfb3AgIT0gT19yZWdpc3RlcgotCQkgIHx8ICFpc19mcHJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFYUF9PUEVSQU5EX0lSfEFYUF9PUEVSQU5EX1BBUkVOUzoKLQkgICAgICBpZiAodG9rW3Rva2lkeF0uWF9vcCAhPSBPX3ByZWdpc3RlcgotCQkgIHx8ICFpc19pcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfUEFSRU5TfEFYUF9PUEVSQU5EX0NPTU1BOgotCSAgICAgIGlmICh0b2tbdG9raWR4XS5YX29wICE9IE9fY3ByZWdpc3RlcgotCQkgIHx8ICFpc19pcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBWFBfT1BFUkFORF9SRUxBVElWRToKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9TSUdORUQ6Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfVU5TSUdORUQ6Ci0JICAgICAgc3dpdGNoICh0b2tbdG9raWR4XS5YX29wKQotCQl7Ci0JCWNhc2UgT19pbGxlZ2FsOgotCQljYXNlIE9fYWJzZW50OgotCQljYXNlIE9fcmVnaXN0ZXI6Ci0JCWNhc2UgT19wcmVnaXN0ZXI6Ci0JCWNhc2UgT19jcHJlZ2lzdGVyOgotCQkgIGdvdG8gbWF0Y2hfZmFpbGVkOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIC8qIGV2ZXJ5dGhpbmcgZWxzZSBzaG91bGQgaGF2ZSBiZWVuIGZha2UgKi8KLQkgICAgICBhYm9ydCgpOwotCSAgICB9Ci0JICArK3Rva2lkeDsKLQl9Ci0KLSAgICAgIC8qIHBvc3NpYmxlIG1hdGNoIC0tIGRpZCB3ZSB1c2UgYWxsIG9mIG91ciBpbnB1dD8gKi8KLSAgICAgIGlmICh0b2tpZHggPT0gbnRvaykKLQl7Ci0JICAqcG50b2sgPSBudG9rOwotCSAgcmV0dXJuIG9wY29kZTsKLQl9Ci0KLSAgICBtYXRjaF9mYWlsZWQ6OwotICAgIH0KLSAgd2hpbGUgKCsrb3Bjb2RlLWFscGhhX29wY29kZXMgPCBhbHBoYV9udW1fb3Bjb2RlcwotCSAmJiAhc3RyY21wKG9wY29kZS0+bmFtZSwgZmlyc3Rfb3Bjb2RlLT5uYW1lKSk7Ci0KLSAgaWYgKCpwY3B1bWF0Y2gpCi0gICAgICAqcGNwdW1hdGNoID0gZ290X2NwdV9tYXRjaDsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2VhcmNoIGZvcndhcmQgdGhyb3VnaCBhbGwgdmFyaWFudHMgb2YgYSBtYWNybyBsb29raW5nIGZvciBhIHN5bnRheAotICAgbWF0Y2guICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFscGhhX21hY3JvICoKLWZpbmRfbWFjcm9fbWF0Y2goZmlyc3RfbWFjcm8sIHRvaywgcG50b2spCi0gICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqZmlyc3RfbWFjcm87Ci0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCAqcG50b2s7Ci17Ci0gIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqbWFjcm8gPSBmaXJzdF9tYWNybzsKLSAgaW50IG50b2sgPSAqcG50b2s7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBjb25zdCBlbnVtIGFscGhhX21hY3JvX2FyZyAqYXJnID0gbWFjcm8tPmFyZ3NldHM7Ci0gICAgICBpbnQgdG9raWR4ID0gMDsKLQotICAgICAgd2hpbGUgKCphcmcpCi0JewotCSAgc3dpdGNoICgqYXJnKQotCSAgICB7Ci0JICAgIGNhc2UgTUFDUk9fRU9BOgotCSAgICAgIGlmICh0b2tpZHggPT0gbnRvaykKLQkJcmV0dXJuIG1hY3JvOwotCSAgICAgIGVsc2UKLQkJdG9raWR4ID0gMDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE1BQ1JPX0lSOgotCSAgICAgIGlmICh0b2tpZHggPj0gbnRvayB8fCB0b2tbdG9raWR4XS5YX29wICE9IE9fcmVnaXN0ZXIKLQkJICB8fCAhaXNfaXJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgICsrdG9raWR4OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE1BQ1JPX1BJUjoKLQkgICAgICBpZiAodG9raWR4ID49IG50b2sgfHwgdG9rW3Rva2lkeF0uWF9vcCAhPSBPX3ByZWdpc3RlcgotCQkgIHx8ICFpc19pcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgKyt0b2tpZHg7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTUFDUk9fQ1BJUjoKLQkgICAgICBpZiAodG9raWR4ID49IG50b2sgfHwgdG9rW3Rva2lkeF0uWF9vcCAhPSBPX2NwcmVnaXN0ZXIKLQkJICB8fCAhaXNfaXJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgICsrdG9raWR4OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE1BQ1JPX0ZQUjoKLQkgICAgICBpZiAodG9raWR4ID49IG50b2sgfHwgdG9rW3Rva2lkeF0uWF9vcCAhPSBPX3JlZ2lzdGVyCi0JCSAgfHwgIWlzX2Zwcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgKyt0b2tpZHg7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBNQUNST19FWFA6Ci0JICAgICAgaWYgKHRva2lkeCA+PSBudG9rKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICBzd2l0Y2ggKHRva1t0b2tpZHhdLlhfb3ApCi0JCXsKLQkJY2FzZSBPX2lsbGVnYWw6Ci0JCWNhc2UgT19hYnNlbnQ6Ci0JCWNhc2UgT19yZWdpc3RlcjoKLQkJY2FzZSBPX3ByZWdpc3RlcjoKLQkJY2FzZSBPX2NwcmVnaXN0ZXI6Ci0JCSAgZ290byBtYXRjaF9mYWlsZWQ7Ci0KLQkJZGVmYXVsdDoKLQkJICBicmVhazsKLQkJfQotCSAgICAgICsrdG9raWR4OwotCSAgICAgIGJyZWFrOwotCi0JICAgIG1hdGNoX2ZhaWxlZDoKLQkgICAgICB3aGlsZSAoKmFyZyAhPSBNQUNST19FT0EpCi0JCSsrYXJnOwotCSAgICAgIHRva2lkeCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgICsrYXJnOwotCX0KLSAgICB9Ci0gIHdoaWxlICgrK21hY3JvLWFscGhhX21hY3JvcyA8IGFscGhhX251bV9tYWNyb3MKLQkgJiYgIXN0cmNtcChtYWNyby0+bmFtZSwgZmlyc3RfbWFjcm8tPm5hbWUpKTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogSW5zZXJ0IGFuIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X29wZXJhbmQoaW5zbiwgb3BlcmFuZCwgdmFsLCBmaWxlLCBsaW5lKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgb2Zmc2V0VCB2YWw7Ci0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGxpbmU7Ci17Ci0gIGlmIChvcGVyYW5kLT5iaXRzICE9IDMyICYmICEob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9OT09WRVJGTE9XKSkKLSAgICB7Ci0gICAgICBvZmZzZXRUIG1pbiwgbWF4OwotCi0gICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9TSUdORUQpCi0JewotCSAgbWF4ID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOwotCSAgbWluID0gLSgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7Ci0JICBtaW4gPSAwOwotCX0KLQotICAgICAgaWYgKHZhbCA8IG1pbiB8fCB2YWwgPiBtYXgpCi0JewotCSAgY29uc3QgY2hhciAqZXJyID0KLQkgICAgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVzIG5vdCBiZXR3ZWVuICVkIGFuZCAlZCkiKTsKLQkgIGNoYXIgYnVmW3NpemVvZiAodmFsKSAqIDMgKyAyXTsKLQotCSAgc3ByaW50X3ZhbHVlKGJ1ZiwgdmFsKTsKLQkgIGlmIChmaWxlKQotCSAgICBhc193YXJuX3doZXJlKGZpbGUsIGxpbmUsIGVyciwgYnVmLCBtaW4sIG1heCk7Ci0JICBlbHNlCi0JICAgIGFzX3dhcm4oZXJyLCBidWYsIG1pbiwgbWF4KTsKLQl9Ci0gICAgfQotCi0gIGlmIChvcGVyYW5kLT5pbnNlcnQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZXJybXNnID0gTlVMTDsKLQotICAgICAgaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgdmFsLCAmZXJybXNnKTsKLSAgICAgIGlmIChlcnJtc2cpCi0JYXNfd2FybiAoZXJybXNnKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBpbnNuIHw9ICgodmFsICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpIDw8IG9wZXJhbmQtPnNoaWZ0KTsKLQotICByZXR1cm4gaW5zbjsKLX0KLQotLyoKLSAqIFR1cm4gYW4gb3Bjb2RlIGRlc2NyaXB0aW9uIGFuZCBhIHNldCBvZiBhcmd1bWVudHMgaW50bwotICogYW4gaW5zdHJ1Y3Rpb24gYW5kIGEgZml4dXAuCi0gKi8KLQotc3RhdGljIHZvaWQKLWFzc2VtYmxlX2luc24ob3Bjb2RlLCB0b2ssIG50b2ssIGluc24pCi0gICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKm9wY29kZTsKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIHN0cnVjdCBhbHBoYV9pbnNuICppbnNuOwotewotICBjb25zdCB1bnNpZ25lZCBjaGFyICphcmdpZHg7Ci0gIHVuc2lnbmVkIGltYWdlOwotICBpbnQgdG9raWR4ID0gMDsKLQotICBtZW1zZXQgKGluc24sIDAsIHNpemVvZiAoKmluc24pKTsKLSAgaW1hZ2UgPSBvcGNvZGUtPm9wY29kZTsKLQotICBmb3IgKGFyZ2lkeCA9IG9wY29kZS0+b3BlcmFuZHM7ICphcmdpZHg7ICsrYXJnaWR4KQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICpvcGVyYW5kID0gJmFscGhhX29wZXJhbmRzWyphcmdpZHhdOwotICAgICAgY29uc3QgZXhwcmVzc2lvblMgKnQ7Ci0KLSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX0ZBS0UpCi0JewotCSAgLyogZmFrZSBvcGVyYW5kcyB0YWtlIG5vIHZhbHVlIGFuZCBnZW5lcmF0ZSBubyBmaXh1cCAqLwotCSAgaW1hZ2UgPSBpbnNlcnRfb3BlcmFuZChpbWFnZSwgb3BlcmFuZCwgMCwgTlVMTCwgMCk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICh0b2tpZHggPj0gbnRvaykKLQl7Ci0JICBzd2l0Y2ggKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfT1BUSU9OQUxfTUFTSykKLQkgICAgewotCSAgICBjYXNlIEFYUF9PUEVSQU5EX0RFRkFVTFRfRklSU1Q6Ci0JICAgICAgdCA9ICZ0b2tbMF07Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfREVGQVVMVF9TRUNPTkQ6Ci0JICAgICAgdCA9ICZ0b2tbMV07Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfREVGQVVMVF9aRVJPOgotCSAgICAgIHsKLQkJc3RhdGljIGNvbnN0IGV4cHJlc3Npb25TIHplcm9fZXhwID0geyAwLCAwLCAwLCBPX2NvbnN0YW50LCAxIH07Ci0JCXQgPSAmemVyb19leHA7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0KCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JdCA9ICZ0b2tbdG9raWR4KytdOwotCi0gICAgICBzd2l0Y2ggKHQtPlhfb3ApCi0JewotCWNhc2UgT19yZWdpc3RlcjoKLQljYXNlIE9fcHJlZ2lzdGVyOgotCWNhc2UgT19jcHJlZ2lzdGVyOgotCSAgaW1hZ2UgPSBpbnNlcnRfb3BlcmFuZChpbWFnZSwgb3BlcmFuZCwgcmVnbm8odC0+WF9hZGRfbnVtYmVyKSwKLQkJCQkgTlVMTCwgMCk7Ci0JICBicmVhazsKLQotCWNhc2UgT19jb25zdGFudDoKLQkgIGltYWdlID0gaW5zZXJ0X29wZXJhbmQoaW1hZ2UsIG9wZXJhbmQsIHQtPlhfYWRkX251bWJlciwgTlVMTCwgMCk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICB7Ci0JICAgIHN0cnVjdCBhbHBoYV9maXh1cCAqZml4dXA7Ci0KLQkgICAgaWYgKGluc24tPm5maXh1cHMgPj0gTUFYX0lOU05fRklYVVBTKQotCSAgICAgIGFzX2ZhdGFsKF8oInRvbyBtYW55IGZpeHVwcyIpKTsKLQotCSAgICBmaXh1cCA9ICZpbnNuLT5maXh1cHNbaW5zbi0+bmZpeHVwcysrXTsKLQotCSAgICBmaXh1cC0+ZXhwID0gKnQ7Ci0JICAgIGZpeHVwLT5yZWxvYyA9IG9wZXJhbmQtPmRlZmF1bHRfcmVsb2M7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGluc24tPmluc24gPSBpbWFnZTsKLX0KLQotLyoKLSAqIEFjdHVhbGx5IG91dHB1dCBhbiBpbnN0cnVjdGlvbiB3aXRoIGl0cyBmaXh1cC4KLSAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9pbnNuIChpbnNuKQotICAgIHN0cnVjdCBhbHBoYV9pbnNuICppbnNuOwotewotICBjaGFyICpmOwotICBpbnQgaTsKLQotICAvKiBUYWtlIGNhcmUgb2YgYWxpZ25tZW50IGR1dGllcyAqLwotICBpZiAoYWxwaGFfYXV0b19hbGlnbl9vbiAmJiBhbHBoYV9jdXJyZW50X2FsaWduIDwgMikKLSAgICBhbHBoYV9hbGlnbiAoMiwgKGNoYXIgKikgTlVMTCwgYWxwaGFfaW5zbl9sYWJlbCwgMCk7Ci0gIGlmIChhbHBoYV9jdXJyZW50X2FsaWduID4gMikKLSAgICBhbHBoYV9jdXJyZW50X2FsaWduID0gMjsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGYgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24tPmluc24sIDQpOwotCi0gIC8qIEFwcGx5IHRoZSBmaXh1cHMgaW4gb3JkZXIgKi8KLSAgZm9yIChpID0gMDsgaSA8IGluc24tPm5maXh1cHM7ICsraSkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgIHN0cnVjdCBhbHBoYV9maXh1cCAqZml4dXAgPSAmaW5zbi0+Zml4dXBzW2ldOwotICAgICAgaW50IHNpemUsIHBjcmVsOwotICAgICAgZml4UyAqZml4UDsKLQotICAgICAgLyogU29tZSBmaXh1cHMgYXJlIG9ubHkgdXNlZCBpbnRlcm5hbGx5IGFuZCBzbyBoYXZlIG5vIGhvd3RvICovCi0gICAgICBpZiAoKGludClmaXh1cC0+cmVsb2MgPCAwKQotCXsKLQkgIG9wZXJhbmQgPSAmYWxwaGFfb3BlcmFuZHNbLShpbnQpZml4dXAtPnJlbG9jXTsKLQkgIHNpemUgPSA0OwotCSAgcGNyZWwgPSAoKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfUkVMQVRJVkUpICE9IDApOwotCX0KLSNpZmRlZiBPQkpfRUxGCi0gICAgICAvKiBUaGVzZSByZWxvY2F0aW9uIHR5cGVzIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseS4gKi8KLSAgICAgIGVsc2UgaWYgKGZpeHVwLT5yZWxvYyA9PSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTYKLQkgICAgICAgfHwgZml4dXAtPnJlbG9jID09IEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNikKLQl7Ci0JICBzaXplID0gMiwgcGNyZWwgPSAwOwotCX0KLSNlbmRpZgotICAgICAgZWxzZQotCXsKLQkgIHJlbG9jX2hvd3RvX3R5cGUgKnJlbG9jX2hvd3RvCi0JICAgID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHVwLT5yZWxvYyk7Ci0JICBhc3NlcnQgKHJlbG9jX2hvd3RvKTsKLQotCSAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG8pOwotCSAgcGNyZWwgPSByZWxvY19ob3d0by0+cGNfcmVsYXRpdmU7Ci0JfQotICAgICAgYXNzZXJ0IChzaXplID49IDEgJiYgc2l6ZSA8PSA0KTsKLQotICAgICAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBzaXplLAotCQkJICAmZml4dXAtPmV4cCwgcGNyZWwsIGZpeHVwLT5yZWxvYyk7Ci0KLSAgICAgIC8qIFR1cm4gb2ZmIGNvbXBsYWludHMgdGhhdCB0aGUgYWRkZW5kIGlzIHRvbyBsYXJnZSBmb3Igc29tZSBmaXh1cHMgKi8KLSAgICAgIHN3aXRjaCAoZml4dXAtPnJlbG9jKQotCXsKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjoKLSNpZmRlZiBPQkpfRUNPRkYKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOgotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOgotI2VuZGlmCi0JY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLQkgIGZpeFAtPmZ4X25vX292ZXJmbG93ID0gMTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGlmICgoaW50KWZpeHVwLT5yZWxvYyA8IDApCi0JICAgIHsKLQkgICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9OT09WRVJGTE9XKQotCQlmaXhQLT5meF9ub19vdmVyZmxvdyA9IDE7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLS8qIEdpdmVuIGFuIG9wY29kZSBuYW1lIGFuZCBhIHByZS10b2tlbml6ZWQgc2V0IG9mIGFyZ3VtZW50cywgYXNzZW1ibGUKLSAgIHRoZSBpbnNuLCBidXQgZG8gbm90IGVtaXQgaXQuCi0KLSAgIE5vdGUgdGhhdCB0aGlzIGltcGxpZXMgbm8gbWFjcm9zIGFsbG93ZWQsIHNpbmNlIHdlIGNhbid0IHN0b3JlIG1vcmUKLSAgIHRoYW4gb25lIGluc24gaW4gYW4gaW5zbiBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAotYXNzZW1ibGVfdG9rZW5zX3RvX2luc24ob3BuYW1lLCB0b2ssIG50b2ssIGluc24pCi0gICAgIGNvbnN0IGNoYXIgKm9wbmFtZTsKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIHN0cnVjdCBhbHBoYV9pbnNuICppbnNuOwotewotICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpvcGNvZGU7Ci0KLSAgLyogc2VhcmNoIG9wY29kZXMgKi8KLSAgb3Bjb2RlID0gKGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKikgaGFzaF9maW5kIChhbHBoYV9vcGNvZGVfaGFzaCwgb3BuYW1lKTsKLSAgaWYgKG9wY29kZSkKLSAgICB7Ci0gICAgICBpbnQgY3B1bWF0Y2g7Ci0gICAgICBvcGNvZGUgPSBmaW5kX29wY29kZV9tYXRjaCAob3Bjb2RlLCB0b2ssICZudG9rLCAmY3B1bWF0Y2gpOwotICAgICAgaWYgKG9wY29kZSkKLQl7Ci0JICBhc3NlbWJsZV9pbnNuIChvcGNvZGUsIHRvaywgbnRvaywgaW5zbik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZSBpZiAoY3B1bWF0Y2gpCi0JYXNfYmFkIChfKCJpbmFwcHJvcHJpYXRlIGFyZ3VtZW50cyBmb3Igb3Bjb2RlIGAlcyciKSwgb3BuYW1lKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIm9wY29kZSBgJXMnIG5vdCBzdXBwb3J0ZWQgZm9yIHRhcmdldCAlcyIpLCBvcG5hbWUsCi0JICAgICAgICBhbHBoYV90YXJnZXRfbmFtZSk7Ci0gICAgfQotICBlbHNlCi0gICAgYXNfYmFkIChfKCJ1bmtub3duIG9wY29kZSBgJXMnIiksIG9wbmFtZSk7Ci19Ci0KLS8qIEdpdmVuIGFuIG9wY29kZSBuYW1lIGFuZCBhIHByZS10b2tlbml6ZWQgc2V0IG9mIGFyZ3VtZW50cywgdGFrZSB0aGUKLSAgIG9wY29kZSBhbGwgdGhlIHdheSB0aHJvdWdoIGVtaXNzaW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWFzc2VtYmxlX3Rva2VucyAob3BuYW1lLCB0b2ssIG50b2ssIGxvY2FsX21hY3Jvc19vbikKLSAgICAgY29uc3QgY2hhciAqb3BuYW1lOwotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgaW50IGxvY2FsX21hY3Jvc19vbjsKLXsKLSAgaW50IGZvdW5kX3NvbWV0aGluZyA9IDA7Ci0gIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKm9wY29kZTsKLSAgY29uc3Qgc3RydWN0IGFscGhhX21hY3JvICptYWNybzsKLSAgaW50IGNwdW1hdGNoID0gMTsKLQotICAvKiBzZWFyY2ggbWFjcm9zICovCi0gIGlmIChsb2NhbF9tYWNyb3Nfb24pCi0gICAgewotICAgICAgbWFjcm8gPSAoKGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqKQotCSAgICAgICBoYXNoX2ZpbmQgKGFscGhhX21hY3JvX2hhc2gsIG9wbmFtZSkpOwotICAgICAgaWYgKG1hY3JvKQotCXsKLQkgIGZvdW5kX3NvbWV0aGluZyA9IDE7Ci0JICBtYWNybyA9IGZpbmRfbWFjcm9fbWF0Y2ggKG1hY3JvLCB0b2ssICZudG9rKTsKLQkgIGlmIChtYWNybykKLQkgICAgewotCSAgICAgICgqbWFjcm8tPmVtaXQpICh0b2ssIG50b2ssIG1hY3JvLT5hcmcpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogc2VhcmNoIG9wY29kZXMgKi8KLSAgb3Bjb2RlID0gKGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKikgaGFzaF9maW5kIChhbHBoYV9vcGNvZGVfaGFzaCwgb3BuYW1lKTsKLSAgaWYgKG9wY29kZSkKLSAgICB7Ci0gICAgICBmb3VuZF9zb21ldGhpbmcgPSAxOwotICAgICAgb3Bjb2RlID0gZmluZF9vcGNvZGVfbWF0Y2ggKG9wY29kZSwgdG9rLCAmbnRvaywgJmNwdW1hdGNoKTsKLSAgICAgIGlmIChvcGNvZGUpCi0JewotCSAgc3RydWN0IGFscGhhX2luc24gaW5zbjsKLQkgIGFzc2VtYmxlX2luc24gKG9wY29kZSwgdG9rLCBudG9rLCAmaW5zbik7Ci0JICBlbWl0X2luc24gKCZpbnNuKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGlmIChmb3VuZF9zb21ldGhpbmcpCi0gICAgaWYgKGNwdW1hdGNoKQotICAgICAgYXNfYmFkIChfKCJpbmFwcHJvcHJpYXRlIGFyZ3VtZW50cyBmb3Igb3Bjb2RlIGAlcyciKSwgb3BuYW1lKTsKLSAgICBlbHNlCi0gICAgICBhc19iYWQgKF8oIm9wY29kZSBgJXMnIG5vdCBzdXBwb3J0ZWQgZm9yIHRhcmdldCAlcyIpLCBvcG5hbWUsCi0JICAgICAgYWxwaGFfdGFyZ2V0X25hbWUpOwotICBlbHNlCi0gICAgYXNfYmFkIChfKCJ1bmtub3duIG9wY29kZSBgJXMnIiksIG9wbmFtZSk7Ci19Ci0KLQwKLS8qIFNvbWUgaW5zdHJ1Y3Rpb24gc2V0cyBpbmRleGVkIGJ5IGxnKHNpemUpICovCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNleHRYX29wW10gPSB7ICJzZXh0YiIsICJzZXh0dyIsICJzZXh0bCIsIE5VTEwgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW5zWGxfb3BbXSA9IHsgImluc2JsIiwgImluc3dsIiwgImluc2xsIiwgImluc3FsIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbnNYaF9vcFtdID0geyBOVUxMLCAgICAiaW5zd2giLCAiaW5zbGgiLCAiaW5zcWgiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGV4dFhsX29wW10gPSB7ICJleHRibCIsICJleHR3bCIsICJleHRsbCIsICJleHRxbCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0WGhfb3BbXSA9IHsgTlVMTCwgICAgImV4dHdoIiwgImV4dGxoIiwgImV4dHFoIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc2tYbF9vcFtdID0geyAibXNrYmwiLCAibXNrd2wiLCAibXNrbGwiLCAibXNrcWwiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1za1hoX29wW10gPSB7IE5VTEwsICAgICJtc2t3aCIsICJtc2tsaCIsICJtc2txaCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3RYX29wW10gPSB7ICJzdGIiLCAic3R3IiwgInN0bCIsICJzdHEiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxkWF9vcFtdID0geyAibGRiIiwgImxkdyIsICJsZGxsIiwgImxkcSIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGRYdV9vcFtdID0geyAibGRidSIsICJsZHd1IiwgTlVMTCwgTlVMTCB9OwotCi0vKiBJbXBsZW1lbnQgdGhlIGxkZ3AgbWFjcm8uICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9sZGdwICh0b2ssIG50b2ssIHVudXNlZCkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX0FPVVQKLUZJWE1FCi0jZW5kaWYKLSNpZiBkZWZpbmVkKE9CSl9FQ09GRikgfHwgZGVmaW5lZChPQkpfRUxGKQotICAvKiBmcm9tICJsZGdwIHIxLG4ocjIpIiwgZ2VuZXJhdGUgImxkYWggcjEsWChSMik7IGxkYSByMSxZKHIxKSIKLSAgICAgd2l0aCBhcHByb3ByaWF0ZSBjb25zdGFudHMgYW5kIHJlbG9jYXRpb25zLiAgKi8KLSAgc3RydWN0IGFscGhhX2luc24gaW5zbjsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotICBleHByZXNzaW9uUyBhZGRlbmQ7Ci0KLSAgLyogV2UncmUgZ29pbmcgdG8gbmVlZCB0aGlzIHN5bWJvbCBpbiBtZF9hcHBseV9maXgoKS4gICovCi0gICh2b2lkKSBzZWN0aW9uX3N5bWJvbCAoYWJzb2x1dGVfc2VjdGlvbik7Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLSAgaWYgKHJlZ25vICh0b2tbMl0uWF9hZGRfbnVtYmVyKSA9PSBBWFBfUkVHX1BWKQotICAgIGVjb2ZmX3NldF9ncF9wcm9sb2dfc2l6ZSAoMCk7Ci0jZW5kaWYKLQotICBuZXd0b2tbMF0gPSB0b2tbMF07Ci0gIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0gIG5ld3Rva1syXSA9IHRva1syXTsKLQotICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkYWgiLCBuZXd0b2ssIDMsICZpbnNuKTsKLQotICBhZGRlbmQgPSB0b2tbMV07Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLSAgaWYgKGFkZGVuZC5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgYXNfYmFkIChfKCJjYW4gbm90IHJlc29sdmUgZXhwcmVzc2lvbiIpKTsKLSAgYWRkZW5kLlhfb3AgPSBPX3N5bWJvbDsKLSAgYWRkZW5kLlhfYWRkX3N5bWJvbCA9IGFscGhhX2dwX3N5bWJvbDsKLSNlbmRpZgotCi0gIGluc24ubmZpeHVwcyA9IDE7Ci0gIGluc24uZml4dXBzWzBdLmV4cCA9IGFkZGVuZDsKLSAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTY7Ci0KLSAgZW1pdF9pbnNuICgmaW5zbik7Ci0KLSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIHRva1swXS5YX2FkZF9udW1iZXIpOwotCi0gIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRhIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLSAgYWRkZW5kLlhfYWRkX251bWJlciArPSA0OwotI2VuZGlmCi0KLSAgaW5zbi5uZml4dXBzID0gMTsKLSAgaW5zbi5maXh1cHNbMF0uZXhwID0gYWRkZW5kOwotICBpbnNuLmZpeHVwc1swXS5yZWxvYyA9IEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjsKLQotICBlbWl0X2luc24gKCZpbnNuKTsKLSNlbmRpZiAvKiBPQkpfRUNPRkYgfHwgT0JKX0VMRiAqLwotfQotCi0jaWZkZWYgT0JKX0VWQVgKLQotLyogQWRkIHN5bWJvbCthZGRlbmQgdG8gbGluayBwb29sLgotICAgUmV0dXJuIG9mZnNldCBmcm9tIGJhc2VzeW0gdG8gZW50cnkgaW4gbGluayBwb29sLgotCi0gICBBZGQgbmV3IGZpeHVwIG9ubHkgaWYgb2Zmc2V0IGlzbid0IDE2Yml0LiAgKi8KLQotdmFsdWVUCi1hZGRfdG9fbGlua19wb29sIChiYXNlc3ltLCBzeW0sIGFkZGVuZCkKLSAgICAgc3ltYm9sUyAqYmFzZXN5bTsKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBvZmZzZXRUIGFkZGVuZDsKLXsKLSAgc2VnVCBjdXJyZW50X3NlY3Rpb24gPSBub3dfc2VnOwotICBpbnQgY3VycmVudF9zdWJzZWMgPSBub3dfc3Vic2VnOwotICB2YWx1ZVQgb2Zmc2V0OwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2NfdHlwZTsKLSAgY2hhciAqcDsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoYWxwaGFfbGlua19zZWN0aW9uKTsKLSAgZml4UyAqZml4cDsKLQotICBvZmZzZXQgPSAtYmFzZXN5bS0+c3lfb2JqOwotCi0gIC8qIEBAIFRoaXMgYXNzdW1lcyBhbGwgZW50cmllcyBpbiBhIGdpdmVuIHNlY3Rpb24gd2lsbCBiZSBvZiB0aGUgc2FtZQotICAgICBzaXplLi4uICBQcm9iYWJseSBjb3JyZWN0LCBidXQgdW53aXNlIHRvIHJlbHkgb24uICAqLwotICAvKiBUaGlzIG11c3QgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIHRoZSBzYW1lIHN1YnNlZ21lbnQuICAqLwotCi0gIGlmIChzZWdpbmZvLT5mcmNoYWluUCkKLSAgICBmb3IgKGZpeHAgPSBzZWdpbmZvLT5mcmNoYWluUC0+Zml4X3Jvb3Q7Ci0JIGZpeHAgIT0gKGZpeFMgKikgTlVMTDsKLQkgZml4cCA9IGZpeHAtPmZ4X25leHQsIG9mZnNldCArPSA4KQotICAgICAgewotCWlmIChmaXhwLT5meF9hZGRzeSA9PSBzeW0gJiYgZml4cC0+Znhfb2Zmc2V0ID09IGFkZGVuZCkKLQkgIHsKLQkgICAgaWYgKHJhbmdlX3NpZ25lZF8xNiAob2Zmc2V0KSkKLQkgICAgICB7Ci0JICAgICAgICByZXR1cm4gb2Zmc2V0OwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLQotICAvKiBOb3QgZm91bmQgaW4gMTZiaXQgc2lnbmVkIHJhbmdlLiAgKi8KLQotICBzdWJzZWdfc2V0IChhbHBoYV9saW5rX3NlY3Rpb24sIDApOwotICBwID0gZnJhZ19tb3JlICg4KTsKLSAgbWVtc2V0IChwLCAwLCA4KTsKLQotICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA4LCBzeW0sIGFkZGVuZCwgMCwKLQkgICBCRkRfUkVMT0NfNjQpOwotCi0gIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VjdGlvbiwgY3VycmVudF9zdWJzZWMpOwotICBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZSArPSA4OwotICByZXR1cm4gb2Zmc2V0OwotfQotCi0jZW5kaWYgLyogT0JKX0VWQVggKi8KLQotLyogTG9hZCBhIChwYXJ0aWFsKSBleHByZXNzaW9uIGludG8gYSB0YXJnZXQgcmVnaXN0ZXIuCi0KLSAgIElmIHBvZmZzZXQgaXMgbm90IG51bGwsIGFmdGVyIHRoZSBjYWxsIGl0IHdpbGwgZWl0aGVyIGNvbnRhaW4KLSAgIE9fY29uc3RhbnQgMCwgb3IgYSAxNi1iaXQgb2Zmc2V0IGFwcHJvcHJpYXRlIGZvciBhbnkgTUVNIGZvcm1hdAotICAgaW5zdHJ1Y3Rpb24uICBJbiBhZGRpdGlvbiwgcGJhc2VyZWcgd2lsbCBiZSBtb2RpZmllZCB0byBwb2ludCB0bwotICAgdGhlIGJhc2UgcmVnaXN0ZXIgdG8gdXNlIGluIHRoYXQgTUVNIGZvcm1hdCBpbnN0cnVjdGlvbi4KLQotICAgSW4gYW55IGNhc2UsICpwYmFzZXJlZyBzaG91bGQgY29udGFpbiBhIGJhc2UgcmVnaXN0ZXIgdG8gYWRkIHRvIHRoZQotICAgZXhwcmVzc2lvbi4gIFRoaXMgd2lsbCBub3JtYWxseSBiZSBlaXRoZXIgQVhQX1JFR19aRVJPIG9yCi0gICBhbHBoYV9ncF9yZWdpc3Rlci4gIFN5bWJvbCBhZGRyZXNzZXMgd2lsbCBhbHdheXMgYmUgbG9hZGVkIHZpYSAkZ3AsCi0gICBzbyAiZm9vKCQwKSIgaXMgaW50ZXJwcmV0ZWQgYXMgYWRkaW5nIHRoZSBhZGRyZXNzIG9mIGZvbyB0byAkMDsKLSAgIGkuZS4gImxkcSAkdGFyZywgTElUKCRncCk7IGFkZHEgJHRhcmcsICQwLCAkdGFyZyIuICBPZGQsIHBlcmhhcHMsCi0gICBidXQgdGhpcyBpcyB3aGF0IE9TRi8xIGRvZXMuCi0KLSAgIEZpbmFsbHksIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSBpZiB0aGUgY2FsbGluZyBtYWNybyBtYXkgZW1pdCBhCi0gICBMSVRVU0UgcmVsb2MgaWYgb3RoZXJ3aXNlIGFwcHJvcHJpYXRlLiAgKi8KLQotc3RhdGljIGludAotbG9hZF9leHByZXNzaW9uICh0YXJncmVnLCBleHAsIHBiYXNlcmVnLCBwb2Zmc2V0KQotICAgICBpbnQgdGFyZ3JlZzsKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgaW50ICpwYmFzZXJlZzsKLSAgICAgZXhwcmVzc2lvblMgKnBvZmZzZXQ7Ci17Ci0gIGludCBlbWl0X2xpdHVzZSA9IDA7Ci0gIG9mZnNldFQgYWRkZW5kID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gIGludCBiYXNlcmVnID0gKnBiYXNlcmVnOwotICBzdHJ1Y3QgYWxwaGFfaW5zbiBpbnNuOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgc3dpdGNoIChleHAtPlhfb3ApCi0gICAgewotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICB7Ci0jaWZkZWYgT0JKX0VDT0ZGCi0Jb2Zmc2V0VCBsaXQ7Ci0KLQkvKiBhdHRlbXB0IHRvIHJlZHVjZSAubGl0IGxvYWQgYnkgc3BsaXR0aW5nIHRoZSBvZmZzZXQgZnJvbQotCSAgIGl0cyBzeW1ib2wgd2hlbiBwb3NzaWJsZSwgYnV0IGRvbid0IGNyZWF0ZSBhIHNpdHVhdGlvbiBpbgotCSAgIHdoaWNoIHdlJ2QgZmFpbC4gICovCi0JaWYgKCFyYW5nZV9zaWduZWRfMzIgKGFkZGVuZCkgJiYKLQkgICAgKGFscGhhX25vYXRfb24gfHwgdGFyZ3JlZyA9PSBBWFBfUkVHX0FUKSkKLQkgIHsKLQkgICAgbGl0ID0gYWRkX3RvX2xpdGVyYWxfcG9vbCAoZXhwLT5YX2FkZF9zeW1ib2wsIGFkZGVuZCwKLQkJCQkgICAgICAgYWxwaGFfbGl0YV9zZWN0aW9uLCA4KTsKLQkgICAgYWRkZW5kID0gMDsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGxpdCA9IGFkZF90b19saXRlcmFsX3Bvb2wgKGV4cC0+WF9hZGRfc3ltYm9sLCAwLAotCQkJCSAgICAgICBhbHBoYV9saXRhX3NlY3Rpb24sIDgpOwotCSAgfQotCi0JaWYgKGxpdCA+PSAweDgwMDApCi0JICBhc19mYXRhbCAoXygib3ZlcmZsb3cgaW4gbGl0ZXJhbCAoLmxpdGEpIHRhYmxlIikpOwotCi0JLyogZW1pdCAibGRxIHIsIGxpdChncCkiICovCi0KLQlpZiAoYmFzZXJlZyAhPSBhbHBoYV9ncF9yZWdpc3RlciAmJiB0YXJncmVnID09IGJhc2VyZWcpCi0JICB7Ci0JICAgIGlmIChhbHBoYV9ub2F0X29uKQotCSAgICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCSAgICBpZiAodGFyZ3JlZyA9PSBBWFBfUkVHX0FUKQotCSAgICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHdoaWxlICRhdCBpbiB1c2UiKSk7Ci0KLQkgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19BVCk7Ci0JICB9Ci0JZWxzZQotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7Ci0Jc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgYWxwaGFfbGl0YV9zeW1ib2wsIGxpdCk7Ci0Jc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGFscGhhX2dwX3JlZ2lzdGVyKTsKLQotCWFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLQlhc3NlcnQgKGluc24ubmZpeHVwcyA9PSAxKTsKLQlpbnNuLmZpeHVwc1swXS5yZWxvYyA9IEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOwotI2VuZGlmIC8qIE9CSl9FQ09GRiAqLwotI2lmZGVmIE9CSl9FTEYKLQkvKiBlbWl0ICJsZHEgciwgZ290b2ZmKGdwKSIgKi8KLQotCWlmIChiYXNlcmVnICE9IGFscGhhX2dwX3JlZ2lzdGVyICYmIHRhcmdyZWcgPT0gYmFzZXJlZykKLQkgIHsKLQkgICAgaWYgKGFscGhhX25vYXRfb24pCi0JICAgICAgYXNfYmFkIChfKCJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiKSk7Ci0JICAgIGlmICh0YXJncmVnID09IEFYUF9SRUdfQVQpCi0JICAgICAgYXNfYmFkIChfKCJtYWNybyByZXF1aXJlcyAkYXQgd2hpbGUgJGF0IGluIHVzZSIpKTsKLQotCSAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKLQkgIH0KLQllbHNlCi0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLQotCS8qIFhYWDogRGlzYWJsZSB0aGlzIC5nb3QgbWluaW1pemluZyBvcHRpbWl6YXRpb24gc28gdGhhdCB3ZSBjYW4gZ2V0Ci0JICAgYmV0dGVyIGluc3RydWN0aW9uIG9mZnNldCBrbm93bGVkZ2UgaW4gdGhlIGNvbXBpbGVyLiAgVGhpcyBoYXBwZW5zCi0JICAgdmVyeSBpbmZyZXF1ZW50bHkgYW55d2F5LiAgKi8KLQlpZiAoMSB8fCAoIXJhbmdlX3NpZ25lZF8zMiAoYWRkZW5kKQotCSAgICAmJiAoYWxwaGFfbm9hdF9vbiB8fCB0YXJncmVnID09IEFYUF9SRUdfQVQpKSkKLQkgIHsKLQkgICAgbmV3dG9rWzFdID0gKmV4cDsKLQkgICAgYWRkZW5kID0gMDsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIHNldF90b2tfc3ltIChuZXd0b2tbMV0sIGV4cC0+WF9hZGRfc3ltYm9sLCAwKTsKLQkgIH0KLQotCXNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0KLQlhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkcSIsIG5ld3RvaywgMywgJmluc24pOwotCi0JYXNzZXJ0IChpbnNuLm5maXh1cHMgPT0gMSk7Ci0JaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUw7Ci0jZW5kaWYgLyogT0JKX0VMRiAqLwotI2lmZGVmIE9CSl9FVkFYCi0Jb2Zmc2V0VCBsaW5rOwotCi0JLyogRmluZCBzeW1ib2wgb3Igc3ltYm9sIHBvaW50ZXIgaW4gbGluayBzZWN0aW9uLiAgKi8KLQotCWlmIChleHAtPlhfYWRkX3N5bWJvbCA9PSBhbHBoYV9ldmF4X3Byb2Muc3ltYm9sKQotCSAgewotCSAgICBpZiAocmFuZ2Vfc2lnbmVkXzE2IChhZGRlbmQpKQotCSAgICAgIHsKLQkJc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7Ci0JCXNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgYWRkZW5kKTsKLQkJc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOwotCQlhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkYSIsIG5ld3RvaywgMywgJmluc24pOwotCQlhZGRlbmQgPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7Ci0JCXNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0JCXNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnKTsKLQkJYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKCJsZGEiLCBuZXd0b2ssIDMsICZpbnNuKTsKLQkgICAgICB9Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZiAoIXJhbmdlX3NpZ25lZF8zMiAoYWRkZW5kKSkKLQkgICAgICB7Ci0JCWxpbmsgPSBhZGRfdG9fbGlua19wb29sIChhbHBoYV9ldmF4X3Byb2Muc3ltYm9sLAotCQkJCQkgZXhwLT5YX2FkZF9zeW1ib2wsIGFkZGVuZCk7Ci0JCWFkZGVuZCA9IDA7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlsaW5rID0gYWRkX3RvX2xpbmtfcG9vbCAoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCwKLQkJCQkJIGV4cC0+WF9hZGRfc3ltYm9sLCAwKTsKLQkgICAgICB9Ci0JICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotCSAgICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGxpbmspOwotCSAgICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0JICAgIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0JICB9Ci0jZW5kaWYgLyogT0JKX0VWQVggKi8KLQotCWVtaXRfaW5zbigmaW5zbik7Ci0KLSNpZm5kZWYgT0JKX0VWQVgKLQllbWl0X2xpdHVzZSA9IDE7Ci0KLQlpZiAoYmFzZXJlZyAhPSBhbHBoYV9ncF9yZWdpc3RlciAmJiBiYXNlcmVnICE9IEFYUF9SRUdfWkVSTykKLQkgIHsKLQkgICAgLyogZW1pdCAiYWRkcSByLCBiYXNlLCByIiAqLwotCi0JICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIGJhc2VyZWcpOwotCSAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzJdLCB0YXJncmVnKTsKLQkgICAgYXNzZW1ibGVfdG9rZW5zICgiYWRkcSIsIG5ld3RvaywgMywgMCk7Ci0JICB9Ci0jZW5kaWYKLQotCWJhc2VyZWcgPSB0YXJncmVnOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19zdWJ0cmFjdDoKLSAgICAgIC8qIEFzc3VtZSB0aGF0IHRoaXMgZGlmZmVyZW5jZSBleHByZXNzaW9uIHdpbGwgYmUgcmVzb2x2ZWQgdG8gYW4KLQkgYWJzb2x1dGUgdmFsdWUgYW5kIHRoYXQgdGhhdCB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLiAqLwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLSAgICAgIG5ld3Rva1sxXSA9ICpleHA7Ci0gICAgICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJsZGEiLCBuZXd0b2ssIDMsIDApOwotCi0gICAgICBpZiAocG9mZnNldCkKLQlzZXRfdG9rX2NvbnN0ICgqcG9mZnNldCwgMCk7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgT19iaWc6Ci0gICAgICBpZiAoZXhwLT5YX2FkZF9udW1iZXIgPiAwKQotCWFzX2JhZCAoXygiYmlnbnVtIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImZsb2F0aW5nIHBvaW50IG51bWJlciBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBhZGRlbmQgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJjYW4ndCBoYW5kbGUgZXhwcmVzc2lvbiIpKTsKLSAgICAgIGFkZGVuZCA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKCFyYW5nZV9zaWduZWRfMzIgKGFkZGVuZCkpCi0gICAgewotICAgICAgb2Zmc2V0VCBsaXQ7Ci0KLSAgICAgIC8qIGZvciA2NC1iaXQgYWRkZW5kcywganVzdCBwdXQgaXQgaW4gdGhlIGxpdGVyYWwgcG9vbCAqLwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgICAgIC8qIGVtaXQgImxkcSB0YXJncmVnLCBsaXQoYmFzZXJlZykiICAqLwotICAgICAgbGl0ID0gYWRkX3RvX2xpbmtfcG9vbCAoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCwKLQkJCSAgICAgIHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKSwgYWRkZW5kKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBsaXQpOwotICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGFscGhhX2dwX3JlZ2lzdGVyKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkcSIsIG5ld3RvaywgMywgMCk7Ci0jZWxzZQotCi0gICAgICBpZiAoYWxwaGFfbGl0OF9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgY3JlYXRlX2xpdGVyYWxfc2VjdGlvbiAoIi5saXQ4IiwKLQkJCQkgICZhbHBoYV9saXQ4X3NlY3Rpb24sCi0JCQkJICAmYWxwaGFfbGl0OF9zeW1ib2wpOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0JICBhbHBoYV9saXQ4X2xpdGVyYWwgPSBhZGRfdG9fbGl0ZXJhbF9wb29sIChhbHBoYV9saXQ4X3N5bWJvbCwgMHg4MDAwLAotCQkJCQkJICAgIGFscGhhX2xpdGFfc2VjdGlvbiwgOCk7Ci0JICBpZiAoYWxwaGFfbGl0OF9saXRlcmFsID49IDB4ODAwMCkKLQkgICAgYXNfZmF0YWwgKF8oIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXRhKSB0YWJsZSIpKTsKLSNlbmRpZgotCX0KLQotICAgICAgbGl0ID0gYWRkX3RvX2xpdGVyYWxfcG9vbCAoTlVMTCwgYWRkZW5kLCBhbHBoYV9saXQ4X3NlY3Rpb24sIDgpIC0gMHg4MDAwOwotICAgICAgaWYgKGxpdCA+PSAweDgwMDApCi0JYXNfZmF0YWwgKF8oIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXQ4KSB0YWJsZSIpKTsKLQotICAgICAgLyogZW1pdCAibGRhIGxpdHJlZywgLmxpdDgrMHg4MDAwIiAqLwotCi0gICAgICBpZiAodGFyZ3JlZyA9PSBiYXNlcmVnKQotCXsKLQkgIGlmIChhbHBoYV9ub2F0X29uKQotCSAgICBhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQkgIGlmICh0YXJncmVnID09IEFYUF9SRUdfQVQpCi0JICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHdoaWxlICRhdCBpbiB1c2UiKSk7Ci0KLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOwotCX0KLSAgICAgIGVsc2UKLQlzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLSNpZmRlZiBPQkpfRUNPRkYKLSAgICAgIHNldF90b2tfc3ltIChuZXd0b2tbMV0sIGFscGhhX2xpdGFfc3ltYm9sLCBhbHBoYV9saXQ4X2xpdGVyYWwpOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgICAgc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgYWxwaGFfbGl0OF9zeW1ib2wsIDB4ODAwMCk7Ci0jZW5kaWYKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0KLSAgICAgIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLSAgICAgIGFzc2VydCAoaW5zbi5uZml4dXBzID09IDEpOwotI2lmZGVmIE9CSl9FQ09GRgotICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOwotI2VuZGlmCi0KLSAgICAgIGVtaXRfaW5zbiAoJmluc24pOwotCi0gICAgICAvKiBlbWl0ICJsZHEgbGl0cmVnLCBsaXQobGl0cmVnKSIgKi8KLQotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBsaXQpOwotICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIG5ld3Rva1swXS5YX2FkZF9udW1iZXIpOwotCi0gICAgICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkcSIsIG5ld3RvaywgMywgJmluc24pOwotCi0gICAgICBhc3NlcnQgKGluc24ubmZpeHVwcyA8IE1BWF9JTlNOX0ZJWFVQUyk7Ci0gICAgICBpZiAoaW5zbi5uZml4dXBzID4gMCkKLQl7Ci0JICBtZW1tb3ZlICgmaW5zbi5maXh1cHNbMV0sICZpbnNuLmZpeHVwc1swXSwKLQkJICAgc2l6ZW9mKHN0cnVjdCBhbHBoYV9maXh1cCkgKiBpbnNuLm5maXh1cHMpOwotCX0KLSAgICAgIGluc24ubmZpeHVwcysrOwotICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciA9IDE7Ci0gICAgICBlbWl0X2xpdHVzZSA9IDA7Ci0KLSAgICAgIGVtaXRfaW5zbiAoJmluc24pOwotCi0gICAgICAvKiBlbWl0ICJhZGRxIGxpdHJlZywgYmFzZSwgdGFyZ2V0IiAqLwotCi0gICAgICBpZiAoYmFzZXJlZyAhPSBBWFBfUkVHX1pFUk8pCi0JewotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgYmFzZXJlZyk7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzJdLCB0YXJncmVnKTsKLQkgIGFzc2VtYmxlX3Rva2VucyAoImFkZHEiLCBuZXd0b2ssIDMsIDApOwotCX0KLSNlbmRpZiAvKiAhT0JKX0VWQVggKi8KLQotICAgICAgaWYgKHBvZmZzZXQpCi0Jc2V0X3Rva19jb25zdCAoKnBvZmZzZXQsIDApOwotICAgICAgKnBiYXNlcmVnID0gdGFyZ3JlZzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvZmZzZXRUIGxvdywgaGlnaCwgZXh0cmEsIHRtcDsKLQotICAgICAgLyogZm9yIDMyLWJpdCBvcGVyYW5kcywgYnJlYWsgdXAgdGhlIGFkZGVuZCAqLwotCi0gICAgICBsb3cgPSBzaWduX2V4dGVuZF8xNiAoYWRkZW5kKTsKLSAgICAgIHRtcCA9IGFkZGVuZCAtIGxvdzsKLSAgICAgIGhpZ2ggPSBzaWduX2V4dGVuZF8xNiAodG1wID4+IDE2KTsKLQotICAgICAgaWYgKHRtcCAtIChoaWdoIDw8IDE2KSkKLQl7Ci0JICBleHRyYSA9IDB4NDAwMDsKLQkgIHRtcCAtPSAweDQwMDAwMDAwOwotCSAgaGlnaCA9IHNpZ25fZXh0ZW5kXzE2ICh0bXAgPj4gMTYpOwotCX0KLSAgICAgIGVsc2UKLQlleHRyYSA9IDA7Ci0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOwotCi0gICAgICBpZiAoZXh0cmEpCi0JewotCSAgLyogZW1pdCAibGRhaCByLCBleHRyYShyKSAqLwotCSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBleHRyYSk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJsZGFoIiwgbmV3dG9rLCAzLCAwKTsKLQkgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnID0gdGFyZ3JlZyk7Ci0JfQotCi0gICAgICBpZiAoaGlnaCkKLQl7Ci0JICAvKiBlbWl0ICJsZGFoIHIsIGhpZ2gocikgKi8KLQkgIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgaGlnaCk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJsZGFoIiwgbmV3dG9rLCAzLCAwKTsKLQkgIGJhc2VyZWcgPSB0YXJncmVnOwotCSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOwotCX0KLQotICAgICAgaWYgKChsb3cgJiYgIXBvZmZzZXQpIHx8ICghcG9mZnNldCAmJiBiYXNlcmVnICE9IHRhcmdyZWcpKQotCXsKLQkgIC8qIGVtaXQgImxkYSByLCBsb3coYmFzZSkiICovCi0JICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGxvdyk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJsZGEiLCBuZXd0b2ssIDMsIDApOwotCSAgYmFzZXJlZyA9IHRhcmdyZWc7Ci0JICBsb3cgPSAwOwotCX0KLQotICAgICAgaWYgKHBvZmZzZXQpCi0Jc2V0X3Rva19jb25zdCAoKnBvZmZzZXQsIGxvdyk7Ci0gICAgICAqcGJhc2VyZWcgPSBiYXNlcmVnOwotICAgIH0KLQotICByZXR1cm4gZW1pdF9saXR1c2U7Ci19Ci0KLS8qIFRoZSBsZGEgbWFjcm8gZGlmZmVycyBmcm9tIHRoZSBsZGEgaW5zdHJ1Y3Rpb24gaW4gdGhhdCBpdCBoYW5kbGVzCi0gICBtb3N0IHNpbXBsZSBleHByZXNzaW9ucywgcGFydGljdWFscmx5IHN5bWJvbCBhZGRyZXNzIGxvYWRzIGFuZAotICAgbGFyZ2UgY29uc3RhbnRzLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRhICh0b2ssIG50b2ssIHVudXNlZCkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB1bnVzZWQ7Ci17Ci0gIGludCBiYXNlcmVnOwotCi0gIGlmIChudG9rID09IDIpCi0gICAgYmFzZXJlZyA9ICh0b2tbMV0uWF9vcCA9PSBPX2NvbnN0YW50ID8gQVhQX1JFR19aRVJPIDogYWxwaGFfZ3BfcmVnaXN0ZXIpOwotICBlbHNlCi0gICAgYmFzZXJlZyA9IHRva1syXS5YX2FkZF9udW1iZXI7Ci0KLSAgKHZvaWQpIGxvYWRfZXhwcmVzc2lvbiAodG9rWzBdLlhfYWRkX251bWJlciwgJnRva1sxXSwgJmJhc2VyZWcsIE5VTEwpOwotfQotCi0vKiBUaGUgbGRhaCBtYWNybyBkaWZmZXJzIGZyb20gdGhlIGxkYWggaW5zdHJ1Y3Rpb24gaW4gdGhhdCBpdCBoYXMgJDMxCi0gICBhcyBhbiBpbXBsaWVkIGJhc2UgcmVnaXN0ZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9sZGFoICh0b2ssIG50b2ssIHVudXNlZCkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB1bnVzZWQ7Ci17Ci0gIGV4cHJlc3Npb25TIG5ld3Rva1szXTsKLQotICBuZXd0b2tbMF0gPSB0b2tbMF07Ci0gIG5ld3Rva1sxXSA9IHRva1sxXTsKLSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfWkVSTyk7Ci0KLSAgYXNzZW1ibGVfdG9rZW5zICgibGRhaCIsIG5ld3RvaywgMywgMCk7Ci19Ci0KLS8qIEhhbmRsZSBhbGwgInNpbXBsZSIgaW50ZWdlciByZWdpc3RlciBsb2FkcyAtLSBsZHEsIGxkcV9sLCBsZHFfdSwKLSAgIGV0Yy4gIFRoZXkgZGlmZmVyIGZyb20gdGhlIHJlYWwgaW5zdHJ1Y3Rpb25zIGluIHRoYXQgdGhleSBkbyBzaW1wbGUKLSAgIGV4cHJlc3Npb25zIGxpa2UgdGhlIGxkYSBtYWNyby4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X2lyX2xvYWQgKHRvaywgbnRvaywgb3BuYW1lKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIG9wbmFtZTsKLXsKLSAgaW50IGJhc2VyZWcsIGxpdHVzZTsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotICBzdHJ1Y3QgYWxwaGFfaW5zbiBpbnNuOwotCi0gIGlmIChudG9rID09IDIpCi0gICAgYmFzZXJlZyA9ICh0b2tbMV0uWF9vcCA9PSBPX2NvbnN0YW50ID8gQVhQX1JFR19aRVJPIDogYWxwaGFfZ3BfcmVnaXN0ZXIpOwotICBlbHNlCi0gICAgYmFzZXJlZyA9IHRva1syXS5YX2FkZF9udW1iZXI7Ci0KLSAgbGl0dXNlID0gbG9hZF9leHByZXNzaW9uICh0b2tbMF0uWF9hZGRfbnVtYmVyLCAmdG9rWzFdLCAmYmFzZXJlZywKLQkJCSAgICAmbmV3dG9rWzFdKTsKLQotICBuZXd0b2tbMF0gPSB0b2tbMF07Ci0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnKTsKLQotICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoKGNvbnN0IGNoYXIgKilvcG5hbWUsIG5ld3RvaywgMywgJmluc24pOwotCi0gIGlmIChsaXR1c2UpCi0gICAgewotICAgICAgYXNzZXJ0IChpbnNuLm5maXh1cHMgPCBNQVhfSU5TTl9GSVhVUFMpOwotICAgICAgaWYgKGluc24ubmZpeHVwcyA+IDApCi0JewotCSAgbWVtbW92ZSAoJmluc24uZml4dXBzWzFdLCAmaW5zbi5maXh1cHNbMF0sCi0JCSAgIHNpemVvZihzdHJ1Y3QgYWxwaGFfZml4dXApICogaW5zbi5uZml4dXBzKTsKLQl9Ci0gICAgICBpbnNuLm5maXh1cHMrKzsKLSAgICAgIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0xJVFVTRTsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIgPSAxOwotICAgIH0KLQotICBlbWl0X2luc24gKCZpbnNuKTsKLX0KLQotLyogSGFuZGxlIGZwIHJlZ2lzdGVyIGxvYWRzLCBhbmQgYm90aCBpbnRlZ2VyIGFuZCBmcCByZWdpc3RlciBzdG9yZXMuCi0gICBBZ2Fpbiwgd2UgaGFuZGxlIHNpbXBsZSBleHByZXNzaW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X2xvYWRzdG9yZSAodG9rLCBudG9rLCBvcG5hbWUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgb3BuYW1lOwotewotICBpbnQgYmFzZXJlZywgbGl0dXNlOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0gIHN0cnVjdCBhbHBoYV9pbnNuIGluc247Ci0KLSAgaWYgKG50b2sgPT0gMikKLSAgICBiYXNlcmVnID0gKHRva1sxXS5YX29wID09IE9fY29uc3RhbnQgPyBBWFBfUkVHX1pFUk8gOiBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0gIGVsc2UKLSAgICBiYXNlcmVnID0gdG9rWzJdLlhfYWRkX251bWJlcjsKLQotICBpZiAodG9rWzFdLlhfb3AgIT0gT19jb25zdGFudCB8fCAhcmFuZ2Vfc2lnbmVkXzE2KHRva1sxXS5YX2FkZF9udW1iZXIpKQotICAgIHsKLSAgICAgIGlmIChhbHBoYV9ub2F0X29uKQotCWFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCi0gICAgICBsaXR1c2UgPSBsb2FkX2V4cHJlc3Npb24gKEFYUF9SRUdfQVQsICZ0b2tbMV0sICZiYXNlcmVnLCAmbmV3dG9rWzFdKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuZXd0b2tbMV0gPSB0b2tbMV07Ci0gICAgICBsaXR1c2UgPSAwOwotICAgIH0KLQotICBuZXd0b2tbMF0gPSB0b2tbMF07Ci0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnKTsKLQotICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoKGNvbnN0IGNoYXIgKilvcG5hbWUsIG5ld3RvaywgMywgJmluc24pOwotCi0gIGlmIChsaXR1c2UpCi0gICAgewotICAgICAgYXNzZXJ0IChpbnNuLm5maXh1cHMgPCBNQVhfSU5TTl9GSVhVUFMpOwotICAgICAgaWYgKGluc24ubmZpeHVwcyA+IDApCi0JewotCSAgbWVtbW92ZSAoJmluc24uZml4dXBzWzFdLCAmaW5zbi5maXh1cHNbMF0sCi0JCSAgIHNpemVvZihzdHJ1Y3QgYWxwaGFfZml4dXApICogaW5zbi5uZml4dXBzKTsKLQl9Ci0gICAgICBpbnNuLm5maXh1cHMrKzsKLSAgICAgIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0xJVFVTRTsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIgPSAxOwotICAgIH0KLQotICBlbWl0X2luc24gKCZpbnNuKTsKLX0KLQotLyogTG9hZCBhIGhhbGYtd29yZCBvciBieXRlIGFzIGFuIHVuc2lnbmVkIHZhbHVlLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRYdSAodG9rLCBudG9rLCB2bGdzaXplKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHZsZ3NpemU7Ci17Ci0gIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKLSAgICBlbWl0X2lyX2xvYWQgKHRvaywgbnRvaywgbGRYdV9vcFsobG9uZyl2bGdzaXplXSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgICAgIGlmIChhbHBoYV9ub2F0X29uKQotCWFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCi0gICAgICAvKiBlbWl0ICJsZGEgJGF0LCBleHAiICovCi0KLSAgICAgIG1lbWNweSAobmV3dG9rLCB0b2ssIHNpemVvZiAoZXhwcmVzc2lvblMpICogbnRvayk7Ci0gICAgICBuZXd0b2tbMF0uWF9hZGRfbnVtYmVyID0gQVhQX1JFR19BVDsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgbnRvaywgMSk7Ci0KLSAgICAgIC8qIGVtaXQgImxkcV91IHRhcmcsIDAoJGF0KSIgKi8KLQotICAgICAgbmV3dG9rWzBdID0gdG9rWzBdOwotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAiZXh0WGwgdGFyZywgJGF0LCB0YXJnIiAqLwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgICAgIG5ld3Rva1syXSA9IG5ld3Rva1swXTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoZXh0WGxfb3BbKGxvbmcpdmxnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0gICAgfQotfQotCi0vKiBMb2FkIGEgaGFsZi13b3JkIG9yIGJ5dGUgYXMgYSBzaWduZWQgdmFsdWUuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9sZFggKHRvaywgbnRvaywgdmxnc2l6ZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB2bGdzaXplOwotewotICBlbWl0X2xkWHUgKHRvaywgbnRvaywgdmxnc2l6ZSk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoc2V4dFhfb3BbKGxvbmcpdmxnc2l6ZV0sIHRvaywgMSwgMSk7Ci19Ci0KLS8qIExvYWQgYW4gaW50ZWdyYWwgdmFsdWUgZnJvbSBhbiB1bmFsaWduZWQgYWRkcmVzcyBhcyBhbiB1bnNpZ25lZAotICAgdmFsdWUuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF91bGRYdSAodG9rLCBudG9rLCB2bGdzaXplKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHZsZ3NpemU7Ci17Ci0gIGxvbmcgbGdzaXplID0gKGxvbmcpdmxnc2l6ZTsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0gIGlmIChhbHBoYV9ub2F0X29uKQotICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCi0gIC8qIGVtaXQgImxkYSAkYXQsIGV4cCIgKi8KLQotICBtZW1jcHkgKG5ld3RvaywgdG9rLCBzaXplb2YgKGV4cHJlc3Npb25TKSAqIG50b2spOwotICBuZXd0b2tbMF0uWF9hZGRfbnVtYmVyID0gQVhQX1JFR19BVDsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCBudG9rLCAxKTsKLQotICAvKiBlbWl0ICJsZHFfdSAkdDksIDAoJGF0KSIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfQVQpOwotICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAibGRxX3UgJHQxMCwgc2l6ZS0xKCRhdCkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UMTApOwotICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sICgxPDxsZ3NpemUpLTEpOwotICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAiZXh0WGwgJHQ5LCAkYXQsICR0OSIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19BVCk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfVDkpOwotICBhc3NlbWJsZV90b2tlbnMgKGV4dFhsX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAiZXh0WGggJHQxMCwgJGF0LCAkdDEwIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTApOwotICBhc3NlbWJsZV90b2tlbnMgKGV4dFhoX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAib3IgJHQ5LCAkdDEwLCB0YXJnIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMCk7Ci0gIG5ld3Rva1syXSA9IHRva1swXTsKLSAgYXNzZW1ibGVfdG9rZW5zICgib3IiLCBuZXd0b2ssIDMsIDEpOwotfQotCi0vKiBMb2FkIGFuIGludGVncmFsIHZhbHVlIGZyb20gYW4gdW5hbGlnbmVkIGFkZHJlc3MgYXMgYSBzaWduZWQgdmFsdWUuCi0gICBOb3RlIHRoYXQgcXVhZHMgc2hvdWxkIGdldCBmdW5uZWxlZCB0byB0aGUgdW5zaWduZWQgbG9hZCBzaW5jZSB3ZQotICAgZG9uJ3QgaGF2ZSB0byBkbyB0aGUgc2lnbiBleHRlbnNpb24uICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF91bGRYICh0b2ssIG50b2ssIHZsZ3NpemUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKLXsKLSAgZW1pdF91bGRYdSAodG9rLCBudG9rLCB2bGdzaXplKTsKLSAgYXNzZW1ibGVfdG9rZW5zIChzZXh0WF9vcFsobG9uZyl2bGdzaXplXSwgdG9rLCAxLCAxKTsKLX0KLQotLyogSW1wbGVtZW50IHRoZSBsZGlsIG1hY3JvLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRpbCAodG9rLCBudG9rLCB1bnVzZWQpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdW51c2VkOwotewotICBleHByZXNzaW9uUyBuZXd0b2tbMl07Ci0KLSAgbWVtY3B5IChuZXd0b2ssIHRvaywgc2l6ZW9mKG5ld3RvaykpOwotICBuZXd0b2tbMV0uWF9hZGRfbnVtYmVyID0gc2lnbl9leHRlbmRfMzIgKHRva1sxXS5YX2FkZF9udW1iZXIpOwotCi0gIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgbnRvaywgMSk7Ci19Ci0KLS8qIFN0b3JlIGEgaGFsZi13b3JkIG9yIGJ5dGUuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9zdFggKHRvaywgbnRvaywgdmxnc2l6ZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB2bGdzaXplOwotewotICBpbnQgbGdzaXplID0gKGludCkobG9uZyl2bGdzaXplOwotCi0gIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKLSAgICBlbWl0X2xvYWRzdG9yZSAodG9rLCBudG9rLCBzdFhfb3BbbGdzaXplXSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgICAgIGlmIChhbHBoYV9ub2F0X29uKQotCWFzX2JhZChfKCJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiKSk7Ci0KLSAgICAgIC8qIGVtaXQgImxkYSAkYXQsIGV4cCIgKi8KLQotICAgICAgbWVtY3B5IChuZXd0b2ssIHRvaywgc2l6ZW9mIChleHByZXNzaW9uUykgKiBudG9rKTsKLSAgICAgIG5ld3Rva1swXS5YX2FkZF9udW1iZXIgPSBBWFBfUkVHX0FUOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCBudG9rLCAxKTsKLQotICAgICAgLyogZW1pdCAibGRxX3UgJHQ5LCAwKCRhdCkiICovCi0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAiaW5zWGwgc3JjLCAkYXQsICR0MTAiICovCi0KLSAgICAgIG5ld3Rva1swXSA9IHRva1swXTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfQVQpOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTApOwotICAgICAgYXNzZW1ibGVfdG9rZW5zIChpbnNYbF9vcFtsZ3NpemVdLCBuZXd0b2ssIDMsIDEpOwotCi0gICAgICAvKiBlbWl0ICJtc2tYbCAkdDksICRhdCwgJHQ5IiAqLwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgICAgIG5ld3Rva1syXSA9IG5ld3Rva1swXTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAobXNrWGxfb3BbbGdzaXplXSwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAib3IgJHQ5LCAkdDEwLCAkdDkiICovCi0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEwKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm9yIiwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAic3RxX3UgJHQ5LCAwKCRhdCkgKi8KLQotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoInN0cV91IiwgbmV3dG9rLCAzLCAxKTsKLSAgICB9Ci19Ci0KLS8qIFN0b3JlIGFuIGludGVnZXIgdG8gYW4gdW5hbGlnbmVkIGFkZHJlc3MuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF91c3RYICh0b2ssIG50b2ssIHZsZ3NpemUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKLXsKLSAgaW50IGxnc2l6ZSA9IChpbnQpKGxvbmcpdmxnc2l6ZTsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0gIC8qIGVtaXQgImxkYSAkYXQsIGV4cCIgKi8KLQotICBtZW1jcHkgKG5ld3RvaywgdG9rLCBzaXplb2YgKGV4cHJlc3Npb25TKSAqIG50b2spOwotICBuZXd0b2tbMF0uWF9hZGRfbnVtYmVyID0gQVhQX1JFR19BVDsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCBudG9rLCAxKTsKLQotICAvKiBlbWl0ICJsZHFfdSAkOSwgMCgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIDApOwotICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgQVhQX1JFR19BVCk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKLQotICAvKiBlbWl0ICJsZHFfdSAkMTAsIHNpemUtMSgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAoMSA8PCBsZ3NpemUpLTEpOwotICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAiaW5zWGwgc3JjLCAkYXQsICR0MTEiICovCi0KLSAgbmV3dG9rWzBdID0gdG9rWzBdOwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTEpOwotICBhc3NlbWJsZV90b2tlbnMgKGluc1hsX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAiaW5zWGggc3JjLCAkYXQsICR0MTIiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTIpOwotICBhc3NlbWJsZV90b2tlbnMgKGluc1hoX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAibXNrWGwgJHQ5LCAkYXQsICR0OSIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKG1za1hsX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAibXNrWGggJHQxMCwgJGF0LCAkdDEwIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKG1za1hoX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAib3IgJHQ5LCAkdDExLCAkdDkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDExKTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKCJvciIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAib3IgJHQxMCwgJHQxMiwgJHQxMCIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEyKTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKCJvciIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAic3RxX3UgJHQ5LCAwKCRhdCkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7Ci0gIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgic3RxX3UiLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgInN0cV91ICR0MTAsIHNpemUtMSgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAoMSA8PCBsZ3NpemUpLTEpOwotICBhc3NlbWJsZV90b2tlbnMgKCJzdHFfdSIsIG5ld3RvaywgMywgMSk7Ci19Ci0KLS8qIFNpZ24gZXh0ZW5kIGEgaGFsZi13b3JkIG9yIGJ5dGUuICBUaGUgMzItYml0IHNpZ24gZXh0ZW5kIGlzCi0gICBpbXBsZW1lbnRlZCBhcyAiYWRkbCAkMzEsICRyLCAkdCIgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X3NleHRYICh0b2ssIG50b2ssIHZsZ3NpemUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKLXsKLSAgbG9uZyBsZ3NpemUgPSAobG9uZyl2bGdzaXplOwotCi0gIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKLSAgICBhc3NlbWJsZV90b2tlbnMgKHNleHRYX29wW2xnc2l6ZV0sIHRvaywgbnRvaywgMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgYml0c2hpZnQgPSA2NCAtIDggKiAoMSA8PCBsZ3NpemUpOwotICAgICAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0gICAgICAvKiBlbWl0ICJzbGwgc3JjLGJpdHMsZHN0IiAqLwotCi0gICAgICBuZXd0b2tbMF0gPSB0b2tbMF07Ci0gICAgICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGJpdHNoaWZ0KTsKLSAgICAgIG5ld3Rva1syXSA9IHRva1tudG9rIC0gMV07Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJzbGwiLCBuZXd0b2ssIDMsIDEpOwotCi0gICAgICAvKiBlbWl0ICJzcmEgZHN0LGJpdHMsZHN0IiAqLwotCi0gICAgICBuZXd0b2tbMF0gPSBuZXd0b2tbMl07Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJzcmEiLCBuZXd0b2ssIDMsIDEpOwotICAgIH0KLX0KLQotLyogSW1wbGVtZW50IHRoZSBkaXZpc2lvbiBhbmQgbW9kdWx1cyBtYWNyb3MuICAqLwotCi0jaWZkZWYgT0JKX0VWQVgKLQotLyogTWFrZSByZWdpc3RlciB1c2FnZSBsaWtlIGluIG5vcm1hbCBwcm9jZWR1cmUgY2FsbC4KLSAgIERvbid0IGNsb2JiZXIgUFYgYW5kIFJBLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfZGl2aXNpb24gKHRvaywgbnRvaywgc3ltbmFtZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiBzeW1uYW1lOwotewotICAvKiBESVZJU0lPTiBhbmQgTU9EVUxVUy4gWWVjaC4KLSAgICoKLSAgICogQ29udmVydAotICAgKiAgICBPUCB4LHkscmVzdWx0Ci0gICAqIHRvCi0gICAqICAgIG1vdiB4LFIxNgkjIGlmIHggIT0gUjE2Ci0gICAqICAgIG1vdiB5LFIxNwkjIGlmIHkgIT0gUjE3Ci0gICAqICAgIGxkYSBBVCxfX09QCi0gICAqICAgIGpzciBBVCwoQVQpLDAKLSAgICogICAgbW92IFIwLHJlc3VsdAotICAgKgotICAgKiB3aXRoIGFwcHJvcHJpYXRlIG9wdGltaXphdGlvbnMgaWYgUjAsUjE2LFIxNyBhcmUgdGhlIHJlZ2lzdGVycwotICAgKiBzcGVjaWZpZWQgYnkgdGhlIGNvbXBpbGVyLgotICAgKi8KLQotICBpbnQgeHIsIHlyLCBycjsKLSAgc3ltYm9sUyAqc3ltOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgeHIgPSByZWdubyAodG9rWzBdLlhfYWRkX251bWJlcik7Ci0gIHlyID0gcmVnbm8gKHRva1sxXS5YX2FkZF9udW1iZXIpOwotCi0gIGlmIChudG9rIDwgMykKLSAgICByciA9IHhyOwotICBlbHNlCi0gICAgcnIgPSByZWdubyAodG9rWzJdLlhfYWRkX251bWJlcik7Ci0KLSAgLyogTW92ZSB0aGUgb3BlcmFuZHMgaW50byB0aGUgcmlnaHQgcGxhY2UgKi8KLSAgaWYgKHlyID09IEFYUF9SRUdfUjE2ICYmIHhyID09IEFYUF9SRUdfUjE3KQotICAgIHsKLSAgICAgIC8qIFRoZXkgYXJlIGluIGV4YWN0bHkgdGhlIHdyb25nIG9yZGVyIC0tIHN3YXAgdGhyb3VnaCBBVCAqLwotCi0gICAgICBpZiAoYWxwaGFfbm9hdF9vbikKLQlhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19SMTYpOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19BVCk7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1IxNyk7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1IxNik7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfUjE3KTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHlyID09IEFYUF9SRUdfUjE2KQotCXsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfUjE2KTsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfUjE3KTsKLQkgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0JfQotCi0gICAgICBpZiAoeHIgIT0gQVhQX1JFR19SMTYpCi0JewotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgeHIpOwotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19SMTYpOwotICAgICAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0JfQotCi0gICAgICBpZiAoeXIgIT0gQVhQX1JFR19SMTYgJiYgeXIgIT0gQVhQX1JFR19SMTcpCi0JewotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgeXIpOwotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19SMTcpOwotCSAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQl9Ci0gICAgfQotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKChjb25zdCBjaGFyICopc3ltbmFtZSk7Ci0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19BVCk7Ci0gIHNldF90b2tfc3ltIChuZXd0b2tbMV0sIHN5bSwgMCk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgMiwgMSk7Ci0KLSAgLyogQ2FsbCB0aGUgZGl2aXNpb24gcm91dGluZSAqLwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKLSAgc2V0X3Rva19jcHJlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzJdLCAwKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgianNyIiwgbmV3dG9rLCAzLCAxKTsKLQotICAvKiBNb3ZlIHRoZSByZXN1bHQgdG8gdGhlIHJpZ2h0IHBsYWNlICovCi0gIGlmIChyciAhPSBBWFBfUkVHX1IwKQotICAgIHsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfUjApOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgcnIpOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLSAgICB9Ci19Ci0KLSNlbHNlIC8qICFPQkpfRVZBWCAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9kaXZpc2lvbiAodG9rLCBudG9rLCBzeW1uYW1lKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHN5bW5hbWU7Ci17Ci0gIC8qIERJVklTSU9OIGFuZCBNT0RVTFVTLiBZZWNoLgotICAgKiBDb252ZXJ0Ci0gICAqICAgIE9QIHgseSxyZXN1bHQKLSAgICogdG8KLSAgICogICAgbGRhIHB2LF9fT1AKLSAgICogICAgbW92IHgsdDEwCi0gICAqICAgIG1vdiB5LHQxMQotICAgKiAgICBqc3IgdDksKHB2KSxfX09QCi0gICAqICAgIG1vdiB0MTIscmVzdWx0Ci0gICAqCi0gICAqIHdpdGggYXBwcm9wcmlhdGUgb3B0aW1pemF0aW9ucyBpZiB0MTAsdDExLHQxMiBhcmUgdGhlIHJlZ2lzdGVycwotICAgKiBzcGVjaWZpZWQgYnkgdGhlIGNvbXBpbGVyLgotICAgKi8KLQotICBpbnQgeHIsIHlyLCBycjsKLSAgc3ltYm9sUyAqc3ltOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgeHIgPSByZWdubyAodG9rWzBdLlhfYWRkX251bWJlcik7Ci0gIHlyID0gcmVnbm8gKHRva1sxXS5YX2FkZF9udW1iZXIpOwotCi0gIGlmIChudG9rIDwgMykKLSAgICByciA9IHhyOwotICBlbHNlCi0gICAgcnIgPSByZWdubyAodG9rWzJdLlhfYWRkX251bWJlcik7Ci0KLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoKGNvbnN0IGNoYXIgKilzeW1uYW1lKTsKLQotICAvKiBNb3ZlIHRoZSBvcGVyYW5kcyBpbnRvIHRoZSByaWdodCBwbGFjZSAqLwotICBpZiAoeXIgPT0gQVhQX1JFR19UMTAgJiYgeHIgPT0gQVhQX1JFR19UMTEpCi0gICAgewotICAgICAgLyogVGhleSBhcmUgaW4gZXhhY3RseSB0aGUgd3Jvbmcgb3JkZXIgLS0gc3dhcCB0aHJvdWdoIEFUICovCi0KLSAgICAgIGlmIChhbHBoYV9ub2F0X29uKQotCWFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDExKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEwKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19UMTEpOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoeXIgPT0gQVhQX1JFR19UMTApCi0JewotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UMTApOwotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19UMTEpOwotCSAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQl9Ci0KLSAgICAgIGlmICh4ciAhPSBBWFBfUkVHX1QxMCkKLQl7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB4cik7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMCk7Ci0gICAgICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQl9Ci0KLSAgICAgIGlmICh5ciAhPSBBWFBfUkVHX1QxMCAmJiB5ciAhPSBBWFBfUkVHX1QxMSkKLQl7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB5cik7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMSk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCX0KLSAgICB9Ci0KLSAgLyogQ2FsbCB0aGUgZGl2aXNpb24gcm91dGluZSAqLwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgc3ltLCAwKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgianNyIiwgbmV3dG9rLCAyLCAxKTsKLQotICAvKiBSZWxvYWQgdGhlIEdQIHJlZ2lzdGVyICovCi0jaWZkZWYgT0JKX0FPVVQKLUZJWE1FCi0jZW5kaWYKLSNpZiBkZWZpbmVkKE9CSl9FQ09GRikgfHwgZGVmaW5lZChPQkpfRUxGKQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0gIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX1Q5KTsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRncCIsIG5ld3RvaywgMywgMSk7Ci0jZW5kaWYKLQotICAvKiBNb3ZlIHRoZSByZXN1bHQgdG8gdGhlIHJpZ2h0IHBsYWNlICovCi0gIGlmIChyciAhPSBBWFBfUkVHX1QxMikKLSAgICB7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMik7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBycik7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qICFPQkpfRVZBWCAqLwotCi0vKiBUaGUganNyIGFuZCBqbXAgbWFjcm9zIGRpZmZlciBmcm9tIHRoZWlyIGluc3RydWN0aW9uIGNvdW50ZXJwYXJ0cwotICAgaW4gdGhhdCB0aGV5IGNhbiBsb2FkIHRoZSB0YXJnZXQgYWRkcmVzcyBhbmQgZGVmYXVsdCBtb3N0Ci0gICBldmVyeXRoaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfanNyam1wICh0b2ssIG50b2ssIHZvcG5hbWUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdm9wbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqb3BuYW1lID0gKGNvbnN0IGNoYXIgKikgdm9wbmFtZTsKLSAgc3RydWN0IGFscGhhX2luc24gaW5zbjsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotICBpbnQgciwgdG9raWR4ID0gMCwgbGl0dXNlID0gMDsKLQotICBpZiAodG9raWR4IDwgbnRvayAmJiB0b2tbdG9raWR4XS5YX29wID09IE9fcmVnaXN0ZXIpCi0gICAgciA9IHJlZ25vICh0b2tbdG9raWR4KytdLlhfYWRkX251bWJlcik7Ci0gIGVsc2UKLSAgICByID0gc3RyY21wIChvcG5hbWUsICJqbXAiKSA9PSAwID8gQVhQX1JFR19aRVJPIDogQVhQX1JFR19SQTsKLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCByKTsKLQotICBpZiAodG9raWR4IDwgbnRvayAmJgotICAgICAgKHRva1t0b2tpZHhdLlhfb3AgPT0gT19wcmVnaXN0ZXIgfHwgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX2NwcmVnaXN0ZXIpKQotICAgIHIgPSByZWdubyAodG9rW3Rva2lkeCsrXS5YX2FkZF9udW1iZXIpOwotI2lmZGVmIE9CSl9FVkFYCi0gIC8qIGtlZXAgcmVnaXN0ZXIgaWYganNyICRuLjxzeW0+ICAqLwotI2Vsc2UKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBiYXNlcmVnID0gYWxwaGFfZ3BfcmVnaXN0ZXI7Ci0gICAgICBsaXR1c2UgPSBsb2FkX2V4cHJlc3Npb24gKHIgPSBBWFBfUkVHX1BWLCAmdG9rW3Rva2lkeF0sICZiYXNlcmVnLCBOVUxMKTsKLSAgICB9Ci0jZW5kaWYKLQotICBzZXRfdG9rX2NwcmVnIChuZXd0b2tbMV0sIHIpOwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgLyogRklYTUU6IEFkZCBoaW50IHJlbG9jcyB0byBCRkQgZm9yIGV2YXguICAqLwotI2Vsc2UKLSAgaWYgKHRva2lkeCA8IG50b2spCi0gICAgbmV3dG9rWzJdID0gdG9rW3Rva2lkeF07Ci0gIGVsc2UKLSNlbmRpZgotICAgIHNldF90b2tfY29uc3QgKG5ld3Rva1syXSwgMCk7Ci0KLSAgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKG9wbmFtZSwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLSAgLyogYWRkIHRoZSBMSVRVU0UgZml4dXAgKi8KLSAgaWYgKGxpdHVzZSkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGluc24ubmZpeHVwcyA8IE1BWF9JTlNOX0ZJWFVQUyk7Ci0gICAgICBpZiAoaW5zbi5uZml4dXBzID4gMCkKLQl7Ci0JICBtZW1tb3ZlICgmaW5zbi5maXh1cHNbMV0sICZpbnNuLmZpeHVwc1swXSwKLQkJICAgc2l6ZW9mKHN0cnVjdCBhbHBoYV9maXh1cCkgKiBpbnNuLm5maXh1cHMpOwotCX0KLSAgICAgIGluc24ubmZpeHVwcysrOwotICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciA9IDM7Ci0gICAgfQotCi0gIGVtaXRfaW5zbiAoJmluc24pOwotfQotCi0vKiBUaGUgcmV0IGFuZCBqY3IgaW5zdHJ1Y3Rpb25zIGRpZmZlciBmcm9tIHRoZWlyIGluc3RydWN0aW9uCi0gICBjb3VudGVycGFydHMgaW4gdGhhdCBldmVyeXRoaW5nIGNhbiBiZSBkZWZhdWx0ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9yZXRqY3IgKHRvaywgbnRvaywgdm9wbmFtZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB2b3BuYW1lOwotewotICBjb25zdCBjaGFyICpvcG5hbWUgPSAoY29uc3QgY2hhciAqKXZvcG5hbWU7Ci0gIGV4cHJlc3Npb25TIG5ld3Rva1szXTsKLSAgaW50IHIsIHRva2lkeCA9IDA7Ci0KLSAgaWYgKHRva2lkeCA8IG50b2sgJiYgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX3JlZ2lzdGVyKQotICAgIHIgPSByZWdubyAodG9rW3Rva2lkeCsrXS5YX2FkZF9udW1iZXIpOwotICBlbHNlCi0gICAgciA9IEFYUF9SRUdfWkVSTzsKLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCByKTsKLQotICBpZiAodG9raWR4IDwgbnRvayAmJgotICAgICAgKHRva1t0b2tpZHhdLlhfb3AgPT0gT19wcmVnaXN0ZXIgfHwgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX2NwcmVnaXN0ZXIpKQotICAgIHIgPSByZWdubyAodG9rW3Rva2lkeCsrXS5YX2FkZF9udW1iZXIpOwotICBlbHNlCi0gICAgciA9IEFYUF9SRUdfUkE7Ci0KLSAgc2V0X3Rva19jcHJlZyAobmV3dG9rWzFdLCByKTsKLQotICBpZiAodG9raWR4IDwgbnRvaykKLSAgICBuZXd0b2tbMl0gPSB0b2tbdG9raWR4XTsKLSAgZWxzZQotICAgIHNldF90b2tfY29uc3QgKG5ld3Rva1syXSwgc3RyY21wKG9wbmFtZSwgInJldCIpID09IDApOwotCi0gIGFzc2VtYmxlX3Rva2VucyAob3BuYW1lLCBuZXd0b2ssIDMsIDApOwotfQotDAotLyogQXNzZW1ibGVyIGRpcmVjdGl2ZXMgKi8KLQotLyogSGFuZGxlIHRoZSAudGV4dCBwc2V1ZG8tb3AuICBUaGlzIGlzIGxpa2UgdGhlIHVzdWFsIG9uZSwgYnV0IGl0Ci0gICBjbGVhcnMgYWxwaGFfaW5zbl9sYWJlbCBhbmQgcmVzdG9yZXMgYXV0byBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV90ZXh0IChpKQotICAgICBpbnQgaTsKLQotewotICBzX3RleHQgKGkpOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotfQotCi0vKiBIYW5kbGUgdGhlIC5kYXRhIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyBhbHBoYV9pbnNuX2xhYmVsIGFuZCByZXN0b3JlcyBhdXRvIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2RhdGEgKGkpCi0gICAgIGludCBpOwotewotICBzX2RhdGEgKGkpOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotfQotCi0jaWYgZGVmaW5lZCAoT0JKX0VDT0ZGKSB8fCBkZWZpbmVkIChPQkpfRVZBWCkKLQotLyogSGFuZGxlIHRoZSBPU0YvMSBhbmQgb3BlblZNUyAuY29tbSBwc2V1ZG8gcXVpcmtzLgotICAgb3BlblZNUyBjb25zdHJ1Y3RzIGEgc2VjdGlvbiBmb3IgZXZlcnkgY29tbW9uIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2NvbW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciBjOwotICByZWdpc3RlciBjaGFyICpwOwotICBvZmZzZXRUIHRlbXA7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSNpZmRlZiBPQkpfRVZBWAotICBzZWdUIGN1cnJlbnRfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIGludCBjdXJyZW50X3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0gIHNlZ1QgbmV3X3NlZzsKLSNlbmRpZgotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAvKiBqdXN0IGFmdGVyIG5hbWUgaXMgbm93ICdcMCcgKi8KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAvKiBBbHBoYSBPU0YvMSBjb21waWxlciBkb2Vzbid0IHByb3ZpZGUgdGhlIGNvbW1hLCBnY2MgZG9lcy4gICovCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLkNPTU1vbiBsZW5ndGggKCVsZC4pIDwwISBJZ25vcmVkLiIpLCAobG9uZykgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotI2lmZGVmIE9CSl9FVkFYCi0gIC8qIE1ha2UgYSBzZWN0aW9uIGZvciB0aGUgY29tbW9uIHN5bWJvbC4gICovCi0gIG5ld19zZWcgPSBzdWJzZWdfbmV3ICh4c3RyZHVwIChuYW1lKSwgMCk7Ci0jZW5kaWYKLQotICAqcCA9IGM7Ci0KLSNpZmRlZiBPQkpfRVZBWAotICAvKiBhbGlnbm1lbnQgbWlnaHQgZm9sbG93ICAqLwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgb2Zmc2V0VCBhbGlnbjsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7ICAgICAgCi0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBuZXdfc2VnLCBhbGlnbik7Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgISBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIE9CSl9FVkFYCi0gIGlmIChiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIG5ld19zZWcpID4gMCkKLSAgICB7IAotICAgICAgaWYgKGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgbmV3X3NlZykgIT0gdGVtcCkKLQlhc19iYWQgKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iKSwKLQkJU19HRVRfTkFNRSAoc3ltYm9sUCksCi0JCShsb25nKSBiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIG5ld19zZWcpLAotCQkobG9uZykgdGVtcCk7Ci0gICAgfQotI2Vsc2UKLSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHRlbXApCi0JYXNfYmFkIChfKCJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlbGQuIiksCi0JCVNfR0VUX05BTUUgKHN5bWJvbFApLAotCQkobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLAotCQkobG9uZykgdGVtcCk7Ci0gICAgfQotI2VuZGlmCi0gIGVsc2UKLSAgICB7Ci0jaWZkZWYgT0JKX0VWQVggCi0gICAgICBzdWJzZWdfc2V0IChuZXdfc2VnLCAwKTsKLSAgICAgIHAgPSBmcmFnX21vcmUgKHRlbXApOwotICAgICAgbmV3X3NlZy0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgIGlmICghIFNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0Jc3ltYm9sUC0+YnN5bS0+c2VjdGlvbiA9IG5ld19zZWc7Ci0jZWxzZQotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHRlbXApOwotI2VuZGlmCi0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0gICAgfQotCi0jaWZkZWYgT0JKX0VWQVgKLSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWN0aW9uLCBjdXJyZW50X3N1YnNlYyk7Ci0jZW5kaWYKLQotICBrbm93IChzeW1ib2xQLT5zeV9mcmFnID09ICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2VuZGlmIC8qICEgT0JKX0VMRiAqLwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0KLS8qIEhhbmRsZSB0aGUgLnJkYXRhIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyBhbHBoYV9pbnNuX2xhYmVsIGFuZCByZXN0b3JlcyBhdXRvIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3JkYXRhIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCB0ZW1wOwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgc3Vic2VnX25ldyAoIi5yZGF0YSIsIDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotfQotCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FQ09GRgotCi0vKiBIYW5kbGUgdGhlIC5zZGF0YSBwc2V1ZG8tb3AuICBUaGlzIGlzIGxpa2UgdGhlIHVzdWFsIG9uZSwgYnV0IGl0Ci0gICBjbGVhcnMgYWxwaGFfaW5zbl9sYWJlbCBhbmQgcmVzdG9yZXMgYXV0byBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9zZGF0YSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgdGVtcDsKLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN1YnNlZ19uZXcgKCIuc2RhdGEiLCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0gIGFscGhhX2F1dG9fYWxpZ25fb24gPSAxOwotICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKLX0KLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotCi0vKiBIYW5kbGUgdGhlIC5zZWN0aW9uIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyBhbHBoYV9pbnNuX2xhYmVsIGFuZCByZXN0b3JlcyBhdXRvIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3NlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgb2JqX2VsZl9zZWN0aW9uIChpZ25vcmUpOwotCi0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLSAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2VudCAoZHVtbXkpCi0gICAgIGludCBkdW1teTsKLXsKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICBlY29mZl9kaXJlY3RpdmVfZW50ICgwKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKm5hbWUsIG5hbWVfZW5kOwotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgICAgIGlmICghIGlzX25hbWVfYmVnaW5uZXIgKCpuYW1lKSkKLQl7Ci0JICBhc193YXJuIChfKCIuZW50IGRpcmVjdGl2ZSBoYXMgbm8gbmFtZSIpKTsKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3ltYm9sUyAqc3ltOwotCi0JICBpZiAoYWxwaGFfY3VyX2VudF9zeW0pCi0JICAgIGFzX3dhcm4gKF8oIm5lc3RlZCAuZW50IGRpcmVjdGl2ZXMiKSk7Ci0KLQkgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCSAgc3ltLT5ic3ltLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JICBhbHBoYV9jdXJfZW50X3N5bSA9IHN5bTsKLQotCSAgLyogVGhlIC5lbnQgZGlyZWN0aXZlIGlzIHNvbWV0aW1lcyBmb2xsb3dlZCBieSBhIG51bWJlci4gIE5vdCBzdXJlCi0JICAgICB3aGF0IGl0IHJlYWxseSBtZWFucywgYnV0IGlnbm9yZSBpdC4gICovCi0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICAgIH0KLQkgIGlmIChpc2RpZ2l0ICgqaW5wdXRfbGluZV9wb2ludGVyKSB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICctJykKLQkgICAgKHZvaWQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCX0KLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9lbmQgKGR1bW15KQotICAgICBpbnQgZHVtbXk7Ci17Ci0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgZWNvZmZfZGlyZWN0aXZlX2VuZCAoMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lLCBuYW1lX2VuZDsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gICAgICBpZiAoISBpc19uYW1lX2JlZ2lubmVyICgqbmFtZSkpCi0JewotCSAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgaGFzIG5vIG5hbWUiKSk7Ci0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bWJvbFMgKnN5bTsKLQotCSAgc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotCSAgaWYgKHN5bSAhPSBhbHBoYV9jdXJfZW50X3N5bSkKLQkgICAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgbmFtZXMgZGlmZmVyZW50IHN5bWJvbCB0aGFuIC5lbnQiKSk7Ci0KLQkgIC8qIENyZWF0ZSBhbiBleHByZXNzaW9uIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgZnVuY3Rpb24uICAqLwotCSAgaWYgKHN5bSkKLQkgICAgewotCSAgICAgIHN5bS0+c3lfb2JqLnNpemUgPSAoZXhwcmVzc2lvblMgKikgeG1hbGxvYyAoc2l6ZW9mIChleHByZXNzaW9uUykpOwotCSAgICAgIHN5bS0+c3lfb2JqLnNpemUtPlhfb3AgPSBPX3N1YnRyYWN0OwotCSAgICAgIHN5bS0+c3lfb2JqLnNpemUtPlhfYWRkX3N5bWJvbAotCSAgICAgICAgPSBzeW1ib2xfbmV3ICgiTDBcMDAxIiwgbm93X3NlZywgZnJhZ19ub3dfZml4ICgpLCBmcmFnX25vdyk7Ci0JICAgICAgc3ltLT5zeV9vYmouc2l6ZS0+WF9vcF9zeW1ib2wgPSBzeW07Ci0JICAgICAgc3ltLT5zeV9vYmouc2l6ZS0+WF9hZGRfbnVtYmVyID0gMDsKLQkgICAgfQotCi0JICBhbHBoYV9jdXJfZW50X3N5bSA9IE5VTEw7Ci0KLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQl9Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfbWFzayAoZnApCi0gICAgIGludCBmcDsKLXsKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICB7Ci0gICAgICBpZiAoZnApCi0gICAgICAgIGVjb2ZmX2RpcmVjdGl2ZV9mbWFzayAoMCk7Ci0gICAgICBlbHNlCi0gICAgICAgIGVjb2ZmX2RpcmVjdGl2ZV9tYXNrICgwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBkaXNjYXJkX3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZnJhbWUgKGR1bW15KQotICAgICBpbnQgZHVtbXk7Ci17Ci0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgZWNvZmZfZGlyZWN0aXZlX2ZyYW1lICgwKTsKLSAgZWxzZQotICAgIGRpc2NhcmRfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9wcm9sb2d1ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICpzeW07Ci0gIGludCBhcmc7Ci0KLSAgYXJnID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICBzeW0gPSBlY29mZl9nZXRfY3VyX3Byb2Nfc3ltICgpOwotICBlbHNlCi0gICAgc3ltID0gYWxwaGFfY3VyX2VudF9zeW07Ci0gIGtub3cgKHN5bSAhPSBOVUxMKTsKLQotICBzd2l0Y2ggKGFyZykKLSAgICB7Ci0gICAgICBjYXNlIDA6IC8qIE5vIFBWIHJlcXVpcmVkLiAgKi8KLQlTX1NFVF9PVEhFUiAoc3ltLCBTVE9fQUxQSEFfTk9QVik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDE6IC8qIFN0ZCBHUCBsb2FkLiAgKi8KLQlTX1NFVF9PVEhFUiAoc3ltLCBTVE9fQUxQSEFfU1REX0dQTE9BRCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDI6IC8qIE5vbi1zdGQgdXNlIG9mIFBWLiAgKi8KLQlicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQlhc19iYWQgKF8oIkludmFsaWQgYXJndW1lbnQgJWQgdG8gLnByb2xvZ3VlLiIpLCBhcmcpOwotCWJyZWFrOwotICAgIH0gIAotfQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9jb2ZmX3dyYXBwZXIgKHdoaWNoKQotICAgICBpbnQgd2hpY2g7Ci17Ci0gIHN0YXRpYyB2b2lkICgqIGNvbnN0IGZuc1tdKSBQQVJBTVMgKChpbnQpKSA9IHsKLSAgICBlY29mZl9kaXJlY3RpdmVfYmVnaW4sCi0gICAgZWNvZmZfZGlyZWN0aXZlX2JlbmQsCi0gICAgZWNvZmZfZGlyZWN0aXZlX2RlZiwKLSAgICBlY29mZl9kaXJlY3RpdmVfZGltLAotICAgIGVjb2ZmX2RpcmVjdGl2ZV9lbmRlZiwKLSAgICBlY29mZl9kaXJlY3RpdmVfZmlsZSwKLSAgICBlY29mZl9kaXJlY3RpdmVfc2NsLAotICAgIGVjb2ZmX2RpcmVjdGl2ZV90YWcsCi0gICAgZWNvZmZfZGlyZWN0aXZlX3ZhbCwKLSAgICBlY29mZl9kaXJlY3RpdmVfbG9jLAotICB9OwotCi0gIGFzc2VydCAod2hpY2ggPj0gMCAmJiB3aGljaCA8IHNpemVvZihmbnMpL3NpemVvZigqZm5zKSk7Ci0KLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICAoKmZuc1t3aGljaF0pKDApOwotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFQ09GRiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQuIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci19Ci0jZW5kaWYgLyogT0JKX0VMRiAqLwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgCi0vKiBIYW5kbGUgdGhlIHNlY3Rpb24gc3BlY2lmaWMgcHNldWRvLW9wLiAgKi8KLSAgCi1zdGF0aWMgdm9pZAotc19hbHBoYV9zZWN0aW9uIChzZWNpZCkKLSAgICAgaW50IHNlY2lkOwotewotICBpbnQgdGVtcDsKLSNkZWZpbmUgRVZBWF9TRUNUSU9OX0NPVU5UIDUKLSAgc3RhdGljIGNoYXIgKnNlY3Rpb25fbmFtZVtFVkFYX1NFQ1RJT05fQ09VTlQrMV0gPQotICAgIHsgIk5VTEwiLCAiLnJkYXRhIiwgIi5jb21tIiwgIi5saW5rIiwgIi5jdG9ycyIsICIuZHRvcnMiIH07Ci0KLSAgaWYgKChzZWNpZCA8PSAwKSB8fCAoc2VjaWQgPiBFVkFYX1NFQ1RJT05fQ09VTlQpKQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCJVbmtub3duIHNlY3Rpb24gZGlyZWN0aXZlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgc3Vic2VnX25ldyAoc2VjdGlvbl9uYW1lW3NlY2lkXSwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLSAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDA7Ci19Ci0KLQotLyogUGFyc2UgLmVudCBkaXJlY3RpdmVzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZW50IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbDsKLSAgZXhwcmVzc2lvblMgc3ltZXhwcjsKLQotICBhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQgPSAwOwotICBhbHBoYV9ldmF4X3Byb2MuZnJhbWVyZWcgPSAtMTsKLSAgYWxwaGFfZXZheF9wcm9jLmZyYW1lc2l6ZSA9IDA7Ci0gIGFscGhhX2V2YXhfcHJvYy5yc2Ffb2Zmc2V0ID0gMDsKLSAgYWxwaGFfZXZheF9wcm9jLnJhX3NhdmUgPSBBWFBfUkVHX1JBOwotICBhbHBoYV9ldmF4X3Byb2MuZnBfc2F2ZSA9IC0xOwotICBhbHBoYV9ldmF4X3Byb2MuaW1hc2sgPSAwOwotICBhbHBoYV9ldmF4X3Byb2MuZm1hc2sgPSAwOwotICBhbHBoYV9ldmF4X3Byb2MucHJvbG9ndWUgPSAwOwotICBhbHBoYV9ldmF4X3Byb2MudHlwZSA9IDA7Ci0KLSAgZXhwcmVzc2lvbiAoJnN5bWV4cHIpOwotCi0gIGlmIChzeW1leHByLlhfb3AgIT0gT19zeW1ib2wpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIi5lbnQgZGlyZWN0aXZlIGhhcyBubyBzeW1ib2wiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzeW1ib2wgPSBtYWtlX2V4cHJfc3ltYm9sICgmc3ltZXhwcik7Ci0gIHN5bWJvbC0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotICBhbHBoYV9ldmF4X3Byb2Muc3ltYm9sID0gc3ltYm9sOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBQYXJzZSAuZnJhbWUgPGZyYW1yZWc+LDxmcmFtZXNpemU+LFJBLDxyc2Ffb2Zmc2V0PiBkaXJlY3RpdmVzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZnJhbWUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbG9uZyB2YWw7Ci0KLSAgYWxwaGFfZXZheF9wcm9jLmZyYW1lcmVnID0gdGNfZ2V0X3JlZ2lzdGVyICgxKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJywnCi0gICAgICB8fCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJnZhbCkgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAuZnJhbWUgZGlyZWN0aXZlIDEuLzIuIHBhcmFtIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBhbHBoYV9ldmF4X3Byb2MuZnJhbWVzaXplID0gdmFsOwotCi0gICh2b2lkKSB0Y19nZXRfcmVnaXN0ZXIgKDEpOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAuZnJhbWUgZGlyZWN0aXZlIDMuLzQuIHBhcmFtIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgYWxwaGFfZXZheF9wcm9jLnJzYV9vZmZzZXQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3BkZXNjIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0gIGxvbmcgdmFsOwotICByZWdpc3RlciBjaGFyICpwOwotICBleHByZXNzaW9uUyBleHA7Ci0gIHN5bWJvbFMgKmVudHJ5X3N5bTsKLSAgZml4UyAqZml4cDsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoYWxwaGFfbGlua19zZWN0aW9uKTsKLQotICBpZiAobm93X3NlZyAhPSBhbHBoYV9saW5rX3NlY3Rpb24pCi0gICAgewotICAgICAgYXNfYmFkIChfKCIucGRlc2MgZGlyZWN0aXZlIG5vdCBpbiBsaW5rICgubGluaykgc2VjdGlvbiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCA9PSAwKQotICAgICAgfHwgKCFTX0lTX0RFRklORUQgKGFscGhhX2V2YXhfcHJvYy5zeW1ib2wpKSkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiLnBkZXNjIGhhcyBubyBtYXRjaGluZyAuZW50IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYWxwaGFfZXZheF9wcm9jLnN5bWJvbC0+c3lfb2JqID0gKHZhbHVlVClzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZTsKLQotICBleHByZXNzaW9uICgmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fc3ltYm9sKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5wZGVzYyBkaXJlY3RpdmUgaGFzIG5vIGVudHJ5IHN5bWJvbCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGVudHJ5X3N5bSA9IG1ha2VfZXhwcl9zeW1ib2wgKCZleHApOwotICAvKiBTYXZlIGJmZCBzeW1ib2wgb2YgcHJvYyBkZXNjIGluIGZ1bmN0aW9uIHN5bWJvbC4gICovCi0gIGFscGhhX2V2YXhfcHJvYy5zeW1ib2wtPmJzeW0tPnVkYXRhLnAgPSAoUFRSKWVudHJ5X3N5bS0+YnN5bTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIk5vIGNvbW1hIGFmdGVyIC5wZGVzYyA8ZW50cnluYW1lPiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBpZiAoc3RybmNtcChuYW1lLCAic3RhY2siLCA1KSA9PSAwKQotICAgIHsKLSAgICAgIGFscGhhX2V2YXhfcHJvYy5wZHNja2luZCA9IFBEU0NfU19LX0tJTkRfRlBfU1RBQ0s7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wKG5hbWUsICJyZWciLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIGFscGhhX2V2YXhfcHJvYy5wZHNja2luZCA9IFBEU0NfU19LX0tJTkRfRlBfUkVHSVNURVI7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wKG5hbWUsICJudWxsIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICBhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQgPSBQRFNDX1NfS19LSU5EX05VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oInVua25vd24gcHJvY2VkdXJlIGtpbmQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIGZyYWdfYWxpZ24gKDMsIDAsIDApOwotICBwID0gZnJhZ19tb3JlICgxNik7Ci0gIGZpeHAgPSBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA4LCAwLCAwLCAwLCAwKTsKLSAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gIHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplICs9IDE2OwotCi0gICpwID0gYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kCi0gICAgICAgfCAoKGFscGhhX2V2YXhfcHJvYy5mcmFtZXJlZyA9PSAyOSkgPyBQRFNDX1NfTV9CQVNFX1JFR19JU19GUCA6IDApOwotICAqKHArMSkgPSBQRFNDX1NfTV9OQVRJVkUKLQkgICB8IFBEU0NfU19NX05PX0pBQ0tFVDsKLQotICBzd2l0Y2ggKGFscGhhX2V2YXhfcHJvYy5wZHNja2luZCkKLSAgICB7Ci0gICAgICBjYXNlIFBEU0NfU19LX0tJTkRfTlVMTDoKLQkqKHArMikgPSAwOwotCSoocCszKSA9IDA7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFBEU0NfU19LX0tJTkRfRlBfUkVHSVNURVI6Ci0JKihwKzIpID0gYWxwaGFfZXZheF9wcm9jLmZwX3NhdmU7Ci0JKihwKzMpID0gYWxwaGFfZXZheF9wcm9jLnJhX3NhdmU7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFBEU0NfU19LX0tJTkRfRlBfU1RBQ0s6Ci0JbWRfbnVtYmVyX3RvX2NoYXJzIChwKzIsICh2YWx1ZVQpYWxwaGFfZXZheF9wcm9jLnJzYV9vZmZzZXQsIDIpOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoJCS8qIGltcG9zc2libGUgKi8KLQlicmVhazsKLSAgICB9Ci0KLSAgKihwKzQpID0gMDsKLSAgKihwKzUpID0gYWxwaGFfZXZheF9wcm9jLnR5cGUgJiAweDBmOwotCi0gIC8qIFNpZ25hdHVyZSBvZmZzZXQuICAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHArNiwgKHZhbHVlVCkwLCAyKTsKLQotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAtZnJhZ19ub3ctPmZyX2xpdGVyYWwrOCwgOCwgJmV4cCwgMCwgQkZEX1JFTE9DXzY0KTsKLQotICBpZiAoYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kID09IFBEU0NfU19LX0tJTkRfTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogQWRkIGR1bW15IGZpeCB0byBtYWtlIGFkZF90b19saW5rX3Bvb2wgd29yay4gICovCi0gIHAgPSBmcmFnX21vcmUgKDgpOwotICBmaXhwID0gZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgOCwgMCwgMCwgMCwgMCk7Ci0gIGZpeHAtPmZ4X2RvbmUgPSAxOwotICBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZSArPSA4OwotCi0gIC8qIHBkZXNjKzE2OiBTaXplLiAgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKWFscGhhX2V2YXhfcHJvYy5mcmFtZXNpemUsIDQpOwotCi0gIG1kX251bWJlcl90b19jaGFycyAocCs0LCAodmFsdWVUKTAsIDIpOwotCi0gIC8qIEVudHJ5IGxlbmd0aC4gICovCi0gIG1kX251bWJlcl90b19jaGFycyAocCs2LCBhbHBoYV9ldmF4X3Byb2MucHJvbG9ndWUsIDIpOwotCi0gIGlmIChhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQgPT0gUERTQ19TX0tfS0lORF9GUF9SRUdJU1RFUikKLSAgICByZXR1cm47Ci0KLSAgLyogQWRkIGR1bW15IGZpeCB0byBtYWtlIGFkZF90b19saW5rX3Bvb2wgd29yay4gICovCi0gIHAgPSBmcmFnX21vcmUgKDgpOwotICBmaXhwID0gZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgOCwgMCwgMCwgMCwgMCk7Ci0gIGZpeHAtPmZ4X2RvbmUgPSAxOwotICBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZSArPSA4OwotCi0gIC8qIHBkZXNjKzI0OiByZWdpc3RlciBtYXNrcy4gICovCi0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBhbHBoYV9ldmF4X3Byb2MuaW1hc2ssIDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHArNCwgYWxwaGFfZXZheF9wcm9jLmZtYXNrLCA0KTsKLQotICByZXR1cm47Ci19Ci0KLQotLyogU3VwcG9ydCBmb3IgY3Jhc2ggZGVidWcgb24gdm1zLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfbmFtZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICByZWdpc3RlciBjaGFyICpwOwotICBleHByZXNzaW9uUyBleHA7Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKGFscGhhX2xpbmtfc2VjdGlvbik7Ci0KLSAgaWYgKG5vd19zZWcgIT0gYWxwaGFfbGlua19zZWN0aW9uKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLm5hbWUgZGlyZWN0aXZlIG5vdCBpbiBsaW5rICgubGluaykgc2VjdGlvbiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGV4cHJlc3Npb24gKCZleHApOwotICBpZiAoZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLm5hbWUgZGlyZWN0aXZlIGhhcyBubyBzeW1ib2wiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBmcmFnX2FsaWduICgzLCAwLCAwKTsKLSAgcCA9IGZyYWdfbW9yZSAoOCk7Ci0gIHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplICs9IDg7Ci0KLSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwLWZyYWdfbm93LT5mcl9saXRlcmFsLCA4LCAmZXhwLCAwLCBCRkRfUkVMT0NfNjQpOwotCi0gIHJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9saW5rYWdlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgY2hhciAqcDsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCAhPSBPX3N5bWJvbCkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiTm8gc3ltYm9sIGFmdGVyIC5saW5rYWdlIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHAgPSBmcmFnX21vcmUgKExLUF9TX0tfU0laRSk7Ci0gICAgICBtZW1zZXQgKHAsIDAsIExLUF9TX0tfU0laRSk7Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgTEtQX1NfS19TSVpFLCAmZXhwLCAwLFwKLQkJICAgQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICByZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfY29kZV9hZGRyZXNzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgY2hhciAqcDsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCAhPSBPX3N5bWJvbCkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiTm8gc3ltYm9sIGFmdGVyIC5jb2RlX2FkZHJlc3MiKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcCA9IGZyYWdfbW9yZSAoOCk7Ci0gICAgICBtZW1zZXQgKHAsIDAsIDgpOwotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDgsICZleHAsIDAsXAotCQkgICBCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFIpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICByZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZnBfc2F2ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotCi0gIGFscGhhX2V2YXhfcHJvYy5mcF9zYXZlID0gdGNfZ2V0X3JlZ2lzdGVyICgxKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICByZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfbWFzayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsb25nIHZhbDsKLQotICBpZiAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZ2YWwpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgLm1hc2sgZGlyZWN0aXZlIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYWxwaGFfZXZheF9wcm9jLmltYXNrID0gdmFsOwotICAgICAgKHZvaWQpZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIHJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9mbWFzayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsb25nIHZhbDsKLQotICBpZiAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZ2YWwpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgLmZtYXNrIGRpcmVjdGl2ZSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFscGhhX2V2YXhfcHJvYy5mbWFzayA9IHZhbDsKLSAgICAgICh2b2lkKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9lbmQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciBjOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIGFscGhhX2V2YXhfcHJvYy5zeW1ib2wgPSAwOwotCi0gIHJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9maWxlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnM7Ci0gIGludCBsZW5ndGg7Ci0gIHN0YXRpYyBjaGFyIGNhc2VfaGFja1szMl07Ci0KLSAgZXh0ZXJuIGNoYXIgKmRlbWFuZF9jb3B5X3N0cmluZyBQQVJBTVMgKChpbnQgKmxlblApKTsKLQotICBzcHJpbnRmIChjYXNlX2hhY2ssICI8Q0FTRTolMDFkJTAxZD4iLAotCSAgICBhbHBoYV9mbGFnX2hhc2hfbG9uZ19uYW1lcywgYWxwaGFfZmxhZ19zaG93X2FmdGVyX3RydW5jKTsKLQotICBzID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoY2FzZV9oYWNrKTsKLSAgcy0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0ZJTEU7Ci0KLSAgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHMgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChkZW1hbmRfY29weV9zdHJpbmcgKCZsZW5ndGgpKTsKLSAgcy0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0ZJTEU7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgcmV0dXJuOwotfQotI2VuZGlmIC8qIE9CSl9FVkFYICAqLwotCi0vKiBIYW5kbGUgdGhlIC5ncHJlbDMyIHBzZXVkbyBvcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2dwcmVsMzIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZXhwcmVzc2lvblMgZTsKLSAgY2hhciAqcDsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGV4cHJlc3Npb24gKCZlKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgc3dpdGNoIChlLlhfb3ApCi0gICAgewotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICAgIGUuWF9hZGRfc3ltYm9sID0gc2VjdGlvbl9zeW1ib2woYWJzb2x1dGVfc2VjdGlvbik7Ci0gICAgICBlLlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIC8qIEZBTExUSFJVICovCi0gICAgY2FzZSBPX3N5bWJvbDoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCgpOwotICAgIH0KLSNlbHNlCi0jaWZkZWYgT0JKX0VDT0ZGCi0gIHN3aXRjaCAoZS5YX29wKQotICAgIHsKLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgICBlLlhfYWRkX3N5bWJvbCA9IHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICBlLlhfb3AgPSBPX3N1YnRyYWN0OwotICAgICAgZS5YX29wX3N5bWJvbCA9IGFscGhhX2dwX3N5bWJvbDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0jZW5kaWYKLSNlbmRpZgotCi0gIGlmIChhbHBoYV9hdXRvX2FsaWduX29uICYmIGFscGhhX2N1cnJlbnRfYWxpZ24gPCAyKQotICAgIGFscGhhX2FsaWduICgyLCAoY2hhciAqKSBOVUxMLCBhbHBoYV9pbnNuX2xhYmVsLCAwKTsKLSAgaWYgKGFscGhhX2N1cnJlbnRfYWxpZ24gPiAyKQotICAgIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAyOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLQotICBwID0gZnJhZ19tb3JlICg0KTsKLSAgbWVtc2V0IChwLCAwLCA0KTsKLSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwLWZyYWdfbm93LT5mcl9saXRlcmFsLCA0LAotCSAgICAgICAmZSwgMCwgQkZEX1JFTE9DX0dQUkVMMzIpOwotfQotCi0vKiBIYW5kbGUgZmxvYXRpbmcgcG9pbnQgYWxsb2NhdGlvbiBwc2V1ZG8tb3BzLiAgVGhpcyBpcyBsaWtlIHRoZQotICAgZ2VuZXJpYyB2cmVzaW9uLCBidXQgaXQgbWFrZXMgc3VyZSB0aGUgY3VycmVudCBsYWJlbCwgaWYgYW55LCBpcwotICAgY29ycmVjdGx5IGFsaWduZWQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9mbG9hdF9jb25zICh0eXBlKQotICAgICBpbnQgdHlwZTsKLXsKLSAgaW50IGxvZ19zaXplOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICAgIGxvZ19zaXplID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAnRyc6Ci0gICAgICBsb2dfc2l6ZSA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgbG9nX3NpemUgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChhbHBoYV9hdXRvX2FsaWduX29uICYmIGFscGhhX2N1cnJlbnRfYWxpZ24gPCBsb2dfc2l6ZSkKLSAgICBhbHBoYV9hbGlnbiAobG9nX3NpemUsIChjaGFyICopIE5VTEwsIGFscGhhX2luc25fbGFiZWwsIDApOwotICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA+IGxvZ19zaXplKQotICAgIGFscGhhX2N1cnJlbnRfYWxpZ24gPSBsb2dfc2l6ZTsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0KLSAgZmxvYXRfY29ucyAodHlwZSk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLnByb2MgcHNldWRvIG9wLiAgV2UgZG9uJ3QgcmVhbGx5IGRvIG11Y2ggd2l0aCBpdCBleGNlcHQKLSAgIHBhcnNlIGl0LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfcHJvYyAoaXNfc3RhdGljKQotICAgICBpbnQgaXNfc3RhdGljOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGludCB0ZW1wOwotCi0gIC8qIFRha2VzICIucHJvYyBuYW1lLG5hcmdzIiAgKi8KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICAqcCA9IDA7Ci0gICAgICBhc193YXJuIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIFwiJXNcIiIpLCBuYW1lKTsKLSAgICAgICpwID0gYzsKLSAgICAgIHRlbXAgPSAwOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIC8qICBzeW1ib2xQLT5zeV9vdGhlciA9IChzaWduZWQgY2hhcikgdGVtcDsgKi8KLSAgYXNfd2FybiAoXygidW5oYW5kbGVkOiAucHJvYyAlcywlZCIpLCBuYW1lLCB0ZW1wKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuc2V0IHBzZXVkbyBvcC4gIFRoaXMgaXMgdXNlZCB0byB0dXJuIG9uIGFuZCBvZmYgbW9zdCBvZgotICAgdGhlIGFzc2VtYmxlciBmZWF0dXJlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3NldCAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIGNoYXIgKm5hbWUsIGNoLCAqczsKLSAgaW50IHllc25vID0gMTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgcyA9IG5hbWU7Ci0gIGlmIChzWzBdID09ICduJyAmJiBzWzFdID09ICdvJykKLSAgICB7Ci0gICAgICB5ZXNubyA9IDA7Ci0gICAgICBzICs9IDI7Ci0gICAgfQotICBpZiAoIXN0cmNtcCAoInJlb3JkZXIiLCBzKSkKLSAgICAvKiBpZ25vcmUgKi8gOwotICBlbHNlIGlmICghc3RyY21wICgiYXQiLCBzKSkKLSAgICBhbHBoYV9ub2F0X29uID0gIXllc25vOwotICBlbHNlIGlmICghc3RyY21wICgibWFjcm8iLCBzKSkKLSAgICBhbHBoYV9tYWNyb3Nfb24gPSB5ZXNubzsKLSAgZWxzZSBpZiAoIXN0cmNtcCAoIm1vdmUiLCBzKSkKLSAgICAvKiBpZ25vcmUgKi8gOwotICBlbHNlIGlmICghc3RyY21wICgidm9sYXRpbGUiLCBzKSkKLSAgICAvKiBpZ25vcmUgKi8gOwotICBlbHNlCi0gICAgYXNfd2FybiAoXygiVHJpZWQgdG8gLnNldCB1bnJlY29nbml6ZWQgbW9kZSBgJXMnIiksIG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjaDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYmFzZSBwc2V1ZG8gb3AuICBUaGlzIGNoYW5nZXMgdGhlIGFzc2VtYmxlcidzIG5vdGlvbiBvZgotICAgdGhlICRncCByZWdpc3Rlci4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2Jhc2UgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSNpZiAwCi0gIGlmIChmaXJzdF8zMmJpdF9xdWFkcmFudCkKLSAgICB7Ci0gICAgICAvKiBub3QgZmF0YWwsIGJ1dCBpdCBtaWdodCBub3Qgd29yayBpbiB0aGUgZW5kICovCi0gICAgICBhc193YXJuIChfKCJGaWxlIG92ZXJyaWRlcyBuby1iYXNlLXJlZ2lzdGVyIG9wdGlvbi4iKSk7Ci0gICAgICBmaXJzdF8zMmJpdF9xdWFkcmFudCA9IDA7Ci0gICAgfQotI2VuZGlmCi0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJCcpCi0gICAgewkJCQkvKiAkck5OIGZvcm0gKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ3InKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLQotICBhbHBoYV9ncF9yZWdpc3RlciA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoYWxwaGFfZ3BfcmVnaXN0ZXIgPCAwIHx8IGFscGhhX2dwX3JlZ2lzdGVyID4gMzEpCi0gICAgewotICAgICAgYWxwaGFfZ3BfcmVnaXN0ZXIgPSBBWFBfUkVHX0dQOwotICAgICAgYXNfd2FybiAoXygiQmFkIGJhc2UgcmVnaXN0ZXIsIHVzaW5nICQlZC4iKSwgYWxwaGFfZ3BfcmVnaXN0ZXIpOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5hbGlnbiBwc2V1ZG8tb3AuICBUaGlzIGFsaWducyB0byBhIHBvd2VyIG9mIHR3by4gIEl0Ci0gICBhbHNvIGFkanVzdHMgYW55IGN1cnJlbnQgaW5zdHJ1Y3Rpb24gbGFiZWwuICBXZSB0cmVhdCB0aGlzIHRoZSBzYW1lCi0gICB3YXkgdGhlIE1JUFMgcG9ydCBkb2VzOiAuYWxpZ24gMCB0dXJucyBvZmYgYXV0byBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9hbGlnbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgYWxpZ247Ci0gIGNoYXIgZmlsbCwgKnBmaWxsOwotICBsb25nIG1heF9hbGlnbm1lbnQgPSAxNTsKLQotICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoYWxpZ24gPiBtYXhfYWxpZ25tZW50KQotICAgIHsKLSAgICAgIGFsaWduID0gbWF4X2FsaWdubWVudDsKLSAgICAgIGFzX2JhZCAoXygiQWxpZ25tZW50IHRvbyBsYXJnZTogJWQuIGFzc3VtZWQiKSwgYWxpZ24pOwotICAgIH0KLSAgZWxzZSBpZiAoYWxpZ24gPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkFsaWdubWVudCBuZWdhdGl2ZTogMCBhc3N1bWVkIikpOwotICAgICAgYWxpZ24gPSAwOwotICAgIH0KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBmaWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBwZmlsbCA9ICZmaWxsOwotICAgIH0KLSAgZWxzZQotICAgIHBmaWxsID0gTlVMTDsKLQotICBpZiAoYWxpZ24gIT0gMCkKLSAgICB7Ci0gICAgICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLSAgICAgIGFscGhhX2FsaWduIChhbGlnbiwgcGZpbGwsIGFscGhhX2luc25fbGFiZWwsIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFscGhhX2F1dG9fYWxpZ25fb24gPSAwOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIb29rIHRoZSBub3JtYWwgc3RyaW5nIHByb2Nlc3NvciB0byByZXNldCBrbm93biBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9zdHJpbmdlciAodGVybWluYXRlKQotICAgICBpbnQgdGVybWluYXRlOwotewotICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0gIHN0cmluZ2VyICh0ZXJtaW5hdGUpOwotfQotCi0vKiBIb29rIHRoZSBub3JtYWwgc3BhY2UgcHJvY2Vzc2luZyB0byByZXNldCBrbm93biBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9zcGFjZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0gIHNfc3BhY2UgKGlnbm9yZSk7Ci19Ci0KLS8qIEhvb2sgaW50byBjb25zIGZvciBhdXRvLWFsaWdubWVudC4gICovCi0KLXZvaWQKLWFscGhhX2NvbnNfYWxpZ24gKHNpemUpCi0gICAgIGludCBzaXplOwotewotICBpbnQgbG9nX3NpemU7Ci0KLSAgbG9nX3NpemUgPSAwOwotICB3aGlsZSAoKHNpemUgPj49IDEpICE9IDApCi0gICAgKytsb2dfc2l6ZTsKLQotICBpZiAoYWxwaGFfYXV0b19hbGlnbl9vbiAmJiBhbHBoYV9jdXJyZW50X2FsaWduIDwgbG9nX3NpemUpCi0gICAgYWxwaGFfYWxpZ24gKGxvZ19zaXplLCAoY2hhciAqKSBOVUxMLCBhbHBoYV9pbnNuX2xhYmVsLCAwKTsKLSAgaWYgKGFscGhhX2N1cnJlbnRfYWxpZ24gPiBsb2dfc2l6ZSkKLSAgICBhbHBoYV9jdXJyZW50X2FsaWduID0gbG9nX3NpemU7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotfQotCi0vKiBIZXJlIGNvbWUgdGhlIC51d29yZCwgLnVsb25nLCBhbmQgLnVxdWFkIGV4cGxpY2l0bHkgdW5hbGlnbmVkCi0gICBwc2V1ZG9zLiAgV2UganVzdCB0dXJuIG9mZiBhdXRvLWFsaWdubWVudCBhbmQgY2FsbCBkb3duIHRvIGNvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV91Y29ucyAoYnl0ZXMpCi0gICAgIGludCBieXRlczsKLXsKLSAgaW50IGhvbGQgPSBhbHBoYV9hdXRvX2FsaWduX29uOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gMDsKLSAgY29ucyAoYnl0ZXMpOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gaG9sZDsKLX0KLQotLyogU3dpdGNoIHRoZSB3b3JraW5nIGNwdSB0eXBlLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfYXJjaCAoaWdub3JlZCkKLSAgICAgaW50IGlnbm9yZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGNoOwotICBjb25zdCBzdHJ1Y3QgY3B1X3R5cGUgKnA7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjaCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGZvciAocCA9IGNwdV90eXBlczsgcC0+bmFtZTsgKytwKQotICAgIGlmIChzdHJjbXAobmFtZSwgcC0+bmFtZSkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgYWxwaGFfdGFyZ2V0X25hbWUgPSBwLT5uYW1lLCBhbHBoYV90YXJnZXQgPSBwLT5mbGFnczsKLQlnb3RvIGZvdW5kOwotICAgICAgfQotICBhc193YXJuKCJVbmtub3duIENQVSBpZGVudGlmaWVyIGAlcyciLCBuYW1lKTsKLQotZm91bmQ6Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjaDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotDAotCi0jaWZkZWYgREVCVUcxCi0vKiBwcmludCB0b2tlbiBleHByZXNzaW9uIHdpdGggYWxwaGEgc3BlY2lmaWMgZXh0ZW5zaW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWFscGhhX3ByaW50X3Rva2VuKGYsIGV4cCkKLSAgICBGSUxFICpmOwotICAgIGNvbnN0IGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIHN3aXRjaCAoZXhwLT5YX29wKQotICAgIHsKLSAgICAgIGNhc2UgT19jcHJlZ2lzdGVyOgotCXB1dGMgKCcsJywgZik7Ci0JLyogRkFMTFRIUlUgKi8KLSAgICAgIGNhc2UgT19wcmVnaXN0ZXI6Ci0JcHV0YyAoJygnLCBmKTsKLQl7Ci0JICBleHByZXNzaW9uUyBuZXhwID0gKmV4cDsKLQkgIG5leHAuWF9vcCA9IE9fcmVnaXN0ZXI7Ci0JICBwcmludF9leHByIChmLCAmbmV4cCk7Ci0JfQotCXB1dGMgKCcpJywgZik7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXByaW50X2V4cHIgKGYsIGV4cCk7Ci0JYnJlYWs7Ci0gICAgfQotICByZXR1cm47Ci19Ci0jZW5kaWYKLQwKLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSNpZmRlZiBPQkpfRUNPRkYKLSAgeyJjb21tIiwgc19hbHBoYV9jb21tLCAwfSwJLyogb3NmMSBjb21waWxlciBkb2VzIHRoaXMgKi8KLSAgeyJyZGF0YSIsIHNfYWxwaGFfcmRhdGEsIDB9LAotI2VuZGlmCi0gIHsidGV4dCIsIHNfYWxwaGFfdGV4dCwgMH0sCi0gIHsiZGF0YSIsIHNfYWxwaGFfZGF0YSwgMH0sCi0jaWZkZWYgT0JKX0VDT0ZGCi0gIHsic2RhdGEiLCBzX2FscGhhX3NkYXRhLCAwfSwKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgeyJzZWN0aW9uIiwgc19hbHBoYV9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0aW9uLnMiLCBzX2FscGhhX3NlY3Rpb24sIDB9LAotICB7InNlY3QiLCBzX2FscGhhX3NlY3Rpb24sIDB9LAotICB7InNlY3QucyIsIHNfYWxwaGFfc2VjdGlvbiwgMH0sCi0jZW5kaWYKLSNpZmRlZiBPQkpfRVZBWAotICB7ICJwZGVzYyIsIHNfYWxwaGFfcGRlc2MsIDB9LAotICB7ICJuYW1lIiwgc19hbHBoYV9uYW1lLCAwfSwKLSAgeyAibGlua2FnZSIsIHNfYWxwaGFfbGlua2FnZSwgMH0sCi0gIHsgImNvZGVfYWRkcmVzcyIsIHNfYWxwaGFfY29kZV9hZGRyZXNzLCAwfSwKLSAgeyAiZW50Iiwgc19hbHBoYV9lbnQsIDB9LAotICB7ICJmcmFtZSIsIHNfYWxwaGFfZnJhbWUsIDB9LAotICB7ICJmcF9zYXZlIiwgc19hbHBoYV9mcF9zYXZlLCAwfSwKLSAgeyAibWFzayIsIHNfYWxwaGFfbWFzaywgMH0sCi0gIHsgImZtYXNrIiwgc19hbHBoYV9mbWFzaywgMH0sCi0gIHsgImVuZCIsIHNfYWxwaGFfZW5kLCAwfSwKLSAgeyAiZmlsZSIsIHNfYWxwaGFfZmlsZSwgMH0sCi0gIHsgInJkYXRhIiwgc19hbHBoYV9zZWN0aW9uLCAxfSwKLSAgeyAiY29tbSIsIHNfYWxwaGFfY29tbSwgMH0sCi0gIHsgImxpbmsiLCBzX2FscGhhX3NlY3Rpb24sIDN9LAotICB7ICJjdG9ycyIsIHNfYWxwaGFfc2VjdGlvbiwgNH0sCi0gIHsgImR0b3JzIiwgc19hbHBoYV9zZWN0aW9uLCA1fSwKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgLyogRnJhbWUgcmVsYXRlZCBwc2V1ZG9zLiAgKi8KLSAgeyJlbnQiLCBzX2FscGhhX2VudCwgMH0sCi0gIHsiZW5kIiwgc19hbHBoYV9lbmQsIDB9LAotICB7Im1hc2siLCBzX2FscGhhX21hc2ssIDB9LAotICB7ImZtYXNrIiwgc19hbHBoYV9tYXNrLCAxfSwKLSAgeyJmcmFtZSIsIHNfYWxwaGFfZnJhbWUsIDB9LAotICB7InByb2xvZ3VlIiwgc19hbHBoYV9wcm9sb2d1ZSwgMH0sCi0gIC8qIENPRkYgZGVidWdnaW5nIHJlbGF0ZWQgcHNldWRvcy4gICovCi0gIHsiYmVnaW4iLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgMH0sCi0gIHsiYmVuZCIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCAxfSwKLSAgeyJkZWYiLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgMn0sCi0gIHsiZGltIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDN9LAotICB7ImVuZGVmIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDR9LAotICB7ImZpbGUiLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgNX0sCi0gIHsic2NsIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDZ9LAotICB7InRhZyIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCA3fSwKLSAgeyJ2YWwiLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgOH0sCi0gIHsibG9jIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDl9LAotI2Vsc2UKLSAgeyJwcm9sb2d1ZSIsIHNfaWdub3JlLCAwfSwKLSNlbmRpZgotICB7ImdwcmVsMzIiLCBzX2FscGhhX2dwcmVsMzIsIDB9LAotICB7InRfZmxvYXRpbmciLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdkJ30sCi0gIHsic19mbG9hdGluZyIsIHNfYWxwaGFfZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJmX2Zsb2F0aW5nIiwgc19hbHBoYV9mbG9hdF9jb25zLCAnRid9LAotICB7ImdfZmxvYXRpbmciLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdHJ30sCi0gIHsiZF9mbG9hdGluZyIsIHNfYWxwaGFfZmxvYXRfY29ucywgJ0QnfSwKLQotICB7InByb2MiLCBzX2FscGhhX3Byb2MsIDB9LAotICB7ImFwcm9jIiwgc19hbHBoYV9wcm9jLCAxfSwKLSAgeyJzZXQiLCBzX2FscGhhX3NldCwgMH0sCi0gIHsicmVndXNlIiwgc19pZ25vcmUsIDB9LAotICB7ImxpdmVyZWciLCBzX2lnbm9yZSwgMH0sCi0gIHsiYmFzZSIsIHNfYWxwaGFfYmFzZSwgMH0sCQkvKj8/Ki8KLSAgeyJvcHRpb24iLCBzX2lnbm9yZSwgMH0sCi0gIHsiYWVudCIsIHNfaWdub3JlLCAwfSwKLSAgeyJ1Z2VuIiwgc19pZ25vcmUsIDB9LAotICB7ImVmbGFnIiwgc19pZ25vcmUsIDB9LAotCi0gIHsiYWxpZ24iLCBzX2FscGhhX2FsaWduLCAwfSwKLSAgeyJkb3VibGUiLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdkJ30sCi0gIHsiZmxvYXQiLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdmJ30sCi0gIHsic2luZ2xlIiwgc19hbHBoYV9mbG9hdF9jb25zLCAnZid9LAotICB7ImFzY2lpIiwgc19hbHBoYV9zdHJpbmdlciwgMH0sCi0gIHsiYXNjaXoiLCBzX2FscGhhX3N0cmluZ2VyLCAxfSwKLSAgeyJzdHJpbmciLCBzX2FscGhhX3N0cmluZ2VyLCAxfSwKLSAgeyJzcGFjZSIsIHNfYWxwaGFfc3BhY2UsIDB9LAotICB7InNraXAiLCBzX2FscGhhX3NwYWNlLCAwfSwKLSAgeyJ6ZXJvIiwgc19hbHBoYV9zcGFjZSwgMH0sCi0KLS8qIFVuYWxpZ25lZCBkYXRhIHBzZXVkb3MuICAqLwotICB7InV3b3JkIiwgc19hbHBoYV91Y29ucywgMn0sCi0gIHsidWxvbmciLCBzX2FscGhhX3Vjb25zLCA0fSwKLSAgeyJ1cXVhZCIsIHNfYWxwaGFfdWNvbnMsIDh9LAotCi0jaWZkZWYgT0JKX0VMRgotLyogRHdhcmYgd2FudHMgdGhlc2UgdmVyc2lvbnMgb2YgdW5hbGlnbmVkLiAgKi8KLSAgeyIyYnl0ZSIsIHNfYWxwaGFfdWNvbnMsIDJ9LAotICB7IjRieXRlIiwgc19hbHBoYV91Y29ucywgNH0sCi0gIHsiOGJ5dGUiLCBzX2FscGhhX3Vjb25zLCA4fSwKLSNlbmRpZgotCi0vKiBXZSBkb24ndCBkbyBhbnkgb3B0aW1pemluZywgc28gd2UgY2FuIHNhZmVseSBpZ25vcmUgdGhlc2UuICAqLwotICB7Im5vYWxpYXMiLCBzX2lnbm9yZSwgMH0sCi0gIHsiYWxpYXMiLCBzX2lnbm9yZSwgMH0sCi0KLSAgeyJhcmNoIiwgc19hbHBoYV9hcmNoLCAwfSwKLQotICB7TlVMTCwgMCwgMH0sCi19OwotCi0MCi0vKiBCdWlsZCBhIEJGRCBzZWN0aW9uIHdpdGggaXRzIGZsYWdzIHNldCBhcHByb3ByaWF0ZWx5IGZvciB0aGUgLmxpdGEsCi0gICAubGl0OCwgb3IgLmxpdDQgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotY3JlYXRlX2xpdGVyYWxfc2VjdGlvbiAobmFtZSwgc2VjcCwgc3ltcCkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc2VnVCAqc2VjcDsKLSAgICAgc3ltYm9sUyAqKnN5bXA7Ci17Ci0gIHNlZ1QgY3VycmVudF9zZWN0aW9uID0gbm93X3NlZzsKLSAgaW50IGN1cnJlbnRfc3Vic2VjID0gbm93X3N1YnNlZzsKLSAgc2VnVCBuZXdfc2VjOwotCi0gICpzZWNwID0gbmV3X3NlYyA9IHN1YnNlZ19uZXcgKG5hbWUsIDApOwotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlY3Rpb24sIGN1cnJlbnRfc3Vic2VjKTsKLSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBuZXdfc2VjLCA0KTsKLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5ld19zZWMsCi0JCQkgU0VDX1JFTE9DIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkKLQkJCSB8IFNFQ19EQVRBKTsKLQotICBTX0NMRUFSX0VYVEVSTkFMICgqc3ltcCA9IHNlY3Rpb25fc3ltYm9sIChuZXdfc2VjKSk7Ci19Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLQotLyogQEBAIEdQIHNlbGVjdGlvbiB2b29kb28uICBBbGwgb2YgdGhpcyBzZWVtcyBvdmVybHkgY29tcGxpY2F0ZWQgYW5kCi0gICB1bm5lY2Vzc2FyeTsgd2hpY2ggaXMgdGhlIHByaW1hcnkgcmVhc29uIGl0J3MgZm9yIEVDT0ZGIG9ubHkuICAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLW1heWJlX3NldF9ncCAoc2VjKQotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBiZmRfdm1hIHZtYTsKLSAgaWYgKCFzZWMpCi0gICAgcmV0dXJuOwotICB2bWEgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChmb28sIHNlYyk7Ci0gIGlmICh2bWEgJiYgdm1hIDwgYWxwaGFfZ3BfdmFsdWUpCi0gICAgYWxwaGFfZ3BfdmFsdWUgPSB2bWE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZWxlY3RfZ3BfdmFsdWUgKCkKLXsKLSAgYXNzZXJ0IChhbHBoYV9ncF92YWx1ZSA9PSAwKTsKLQotICAvKiBHZXQgbWludXMtb25lIGluIHdoYXRldmVyIHdpZHRoLi4uICAqLwotICBhbHBoYV9ncF92YWx1ZSA9IDA7IGFscGhhX2dwX3ZhbHVlLS07Ci0KLSAgLyogU2VsZWN0IHRoZSBzbWFsbGVzdCBWTUEgb2YgdGhlc2UgZXhpc3Rpbmcgc2VjdGlvbnMuICAqLwotICBtYXliZV9zZXRfZ3AgKGFscGhhX2xpdGFfc2VjdGlvbik7Ci0jaWYgMAotICAvKiBUaGVzZSB3ZXJlIGRpc2FibGVkIGJlZm9yZSAtLSBzaG91bGQgd2UgdXNlIHRoZW0/ICAqLwotICBtYXliZV9zZXRfZ3AgKHNkYXRhKTsKLSAgbWF5YmVfc2V0X2dwIChsaXQ4X3NlYyk7Ci0gIG1heWJlX3NldF9ncCAobGl0NF9zZWMpOwotI2VuZGlmCi0KLS8qIEBAIFdpbGwgYSBzaW1wbGUgMHg4MDAwIHdvcmsgaGVyZT8gIElmIG5vdCwgd2h5IG5vdD8gICovCi0jZGVmaW5lIEdQX0FESlVTVE1FTlQJKDB4ODAwMCAtIDB4MTApCi0KLSAgYWxwaGFfZ3BfdmFsdWUgKz0gR1BfQURKVVNUTUVOVDsKLQotICBTX1NFVF9WQUxVRSAoYWxwaGFfZ3Bfc3ltYm9sLCBhbHBoYV9ncF92YWx1ZSk7Ci0KLSNpZmRlZiBERUJVRzEKLSAgcHJpbnRmIChfKCJDaG9zZSBHUCB2YWx1ZSBvZiAlbHhcbiIpLCBhbHBoYV9ncF92YWx1ZSk7Ci0jZW5kaWYKLX0KLSNlbmRpZiAvKiBPQkpfRUNPRkYgKi8KLQotLyogQ2FsbGVkIGludGVybmFsbHkgdG8gaGFuZGxlIGFsbCBhbGlnbm1lbnQgbmVlZHMuICBUaGlzIHRha2VzIGNhcmUKLSAgIG9mIGVsaWRpbmcgY2FsbHMgdG8gZnJhZ19hbGlnbiBpZiduIHRoZSBjYWNoZWQgY3VycmVudCBhbGlnbm1lbnQKLSAgIHNheXMgd2UndmUgYWxyZWFkeSBnb3QgaXQsIGFzIHdlbGwgYXMgdGFraW5nIGNhcmUgb2YgdGhlIGF1dG8tYWxpZ24KLSAgIGZlYXR1cmUgd3J0IGxhYmVscy4gICovCi0KLXN0YXRpYyB2b2lkCi1hbHBoYV9hbGlnbiAobiwgcGZpbGwsIGxhYmVsLCBmb3JjZSkKLSAgICAgaW50IG47Ci0gICAgIGNoYXIgKnBmaWxsOwotICAgICBzeW1ib2xTICpsYWJlbDsKLSAgICAgaW50IGZvcmNlOwotewotICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA+PSBuKQotICAgIHJldHVybjsKLQotICBpZiAocGZpbGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobiA+IDIKLQkgICYmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZykgJiBTRUNfQ09ERSkgIT0gMCkKLQl7Ci0JICBzdGF0aWMgY2hhciBjb25zdCB1bm9wWzRdID0geyAweDAwLCAweDAwLCAweGUwLCAweDJmIH07Ci0JICBzdGF0aWMgY2hhciBjb25zdCBub3B1bm9wWzhdID0gewotCQkweDFmLCAweDA0LCAweGZmLCAweDQ3LAotCQkweDAwLCAweDAwLCAweGUwLCAweDJmCi0JICB9OwotCi0JICAvKiBGaXJzdCwgbWFrZSBzdXJlIHdlJ3JlIG9uIGEgZm91ci1ieXRlIGJvdW5kYXJ5LCBpbiBjYXNlCi0JICAgICBzb21lb25lIGhhcyBiZWVuIHB1dHRpbmcgLmJ5dGUgdmFsdWVzIGludG8gdGhlIHRleHQKLQkgICAgIHNlY3Rpb24uICBUaGUgREVDIGFzc2VtYmxlciBzaWxlbnRseSBmaWxscyB3aXRoIHVuYWxpZ25lZAotCSAgICAgbm8tb3AgaW5zdHJ1Y3Rpb25zLiAgVGhpcyB3aWxsIHplcm8tZmlsbCwgdGhlbiBub3AtZmlsbAotCSAgICAgd2l0aCBwcm9wZXIgYWxpZ25tZW50LiAgKi8KLQkgIGlmIChhbHBoYV9jdXJyZW50X2FsaWduIDwgMikKLQkgICAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7Ci0JICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA8IDMpCi0JICAgIGZyYWdfYWxpZ25fcGF0dGVybiAoMywgdW5vcCwgc2l6ZW9mIHVub3AsIDApOwotCSAgaWYgKG4gPiAzKQotCSAgICBmcmFnX2FsaWduX3BhdHRlcm4gKG4sIG5vcHVub3AsIHNpemVvZiBub3B1bm9wLCAwKTsKLQl9Ci0gICAgICBlbHNlCi0JZnJhZ19hbGlnbiAobiwgMCwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgZnJhZ19hbGlnbiAobiwgKnBmaWxsLCAwKTsKLQotICBhbHBoYV9jdXJyZW50X2FsaWduID0gbjsKLQotICBpZiAobGFiZWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKFNfR0VUX1NFR01FTlQgKGxhYmVsKSA9PSBub3dfc2VnKTsKLSAgICAgIGxhYmVsLT5zeV9mcmFnID0gZnJhZ19ub3c7Ci0gICAgICBTX1NFVF9WQUxVRSAobGFiZWwsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0gICAgfQotCi0gIHJlY29yZF9hbGlnbm1lbnQobm93X3NlZywgbik7Ci0KLSAgLyogPz8/IGlmIGFscGhhX2ZsYWdfcmVsYXggJiYgZm9yY2UgJiYgZWxmLCByZWNvcmQgdGhlIHJlcXVlc3RlZCBhbGlnbm1lbnQKLSAgICAgaW4gYSByZWxvYyBmb3IgdGhlIGxpbmtlciB0byBzZWUuICAqLwotfQotCi0vKiBUaGUgQWxwaGEgaGFzIHN1cHBvcnQgZm9yIHNvbWUgVkFYIGZsb2F0aW5nIHBvaW50IHR5cGVzLCBhcyB3ZWxsIGFzIGZvcgotICAgSUVFRSBmbG9hdGluZyBwb2ludC4gIFdlIGNvbnNpZGVyIElFRUUgdG8gYmUgdGhlIHByaW1hcnkgZmxvYXRpbmcgcG9pbnQKLSAgIGZvcm1hdCwgYW5kIHNuZWFrIGluIHRoZSBWQVggZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBoZXJlLiAgKi8KLSNkZWZpbmUgbWRfYXRvZiB2YXhfbWRfYXRvZgotI2luY2x1ZGUgImNvbmZpZy9hdG9mLXZheC5jIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1hbHBoYS5oIGIvZ2FzL2NvbmZpZy90Yy1hbHBoYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTY5MDNhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYWxwaGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtYWxwaGEuaAotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgS2VuIFJhZWJ1cm4gPHJhZWJ1cm5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfQUxQSEEKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIFRBUkdFVF9BUkNICQkJYmZkX2FyY2hfYWxwaGEKLQotI2RlZmluZSBUQVJHRVRfRk9STUFUIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cglcCi0JCSAgICAgICA/ICJlY29mZi1saXR0bGVhbHBoYSIJCQkJXAotCQkgICAgICAgOiBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIJXAotCQkgICAgICAgPyAiZWxmNjQtYWxwaGEiCQkJCQlcCi0JCSAgICAgICA6IE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIJXAotCQkgICAgICAgPyAidm1zLWFscGhhIgkJCQkJXAotCQkgICAgICAgOiAidW5rbm93bi1mb3JtYXQiKQotCi0jZGVmaW5lIE5FRURfTElURVJBTF9QT09MCi0jZGVmaW5lIFRDX0hBTkRMRVNfRlhfRE9ORQotI2RlZmluZSBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUwotCi1leHRlcm4gaW50IGFscGhhX2ZvcmNlX3JlbG9jYXRpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci1leHRlcm4gaW50IGFscGhhX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBhbHBoYV9ncHJtYXNrLCBhbHBoYV9mcHJtYXNrOwotZXh0ZXJuIHZhbHVlVCBhbHBoYV9ncF92YWx1ZTsKLQotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKEZJWFApCWFscGhhX2ZvcmNlX3JlbG9jYXRpb24gKEZJWFApCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKEZJWFApCQlhbHBoYV9maXhfYWRqdXN0YWJsZSAoRklYUCkKLSNkZWZpbmUgUkVMT0NfUkVRVUlSRVNfU1lNQk9MCi0KLS8qIFRoaXMgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UgaWYgdGhlIHJlbG9jYXRpb24gaXMgZm9yIGEgbG9jYWwKLSAgIG9iamVjdCBmb3Igd2hpY2ggd2Ugc3RpbGwgd2FudCB0byBkbyB0aGUgcmVsb2NhdGlvbiBhdCBydW50aW1lLgotICAgVHJ1ZSBpZiB3ZSBhcmUgd2lsbGluZyB0byBwZXJmb3JtIHRoaXMgcmVsb2NhdGlvbiB3aGlsZSBidWlsZGluZwotICAgdGhlIC5vIGZpbGUuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgcGNyZWwgcmVsb2NhdGlvbnMuICAqLwotCi0jZGVmaW5lIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUChGSVgpCQkJCVwKLSAgKChGSVgpLT5meF9hZGRzeSA9PSBOVUxMCQkJCQlcCi0gICB8fCAoISBTX0lTX0VYVEVSTkFMICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotICAgICAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpCQkJCVwKLSAgICAgICAmJiBTX0lTX0RFRklORUQgKChGSVgpLT5meF9hZGRzeSkJCQlcCi0gICAgICAgJiYgISBTX0lTX0NPTU1PTiAoKEZJWCktPmZ4X2FkZHN5KSkpCi0KLSNkZWZpbmUgbWRfY29udmVydF9mcmFnKGIscyxmKQkJYXNfZmF0YWwgKCJhbHBoYSBjb252ZXJ0X2ZyYWdcbiIpCi0jZGVmaW5lIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KGYscykgXAotCQkJKGFzX2ZhdGFsKCJlc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBjYWxsZWQiKSwxKQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLSNpZmRlZiBPQkpfRVZBWAotCi0vKiBUaGlzIGZpZWxkIGtlZXBzIHRoZSBzeW1ib2xzIHBvc2l0aW9uIGluIHRoZSBsaW5rIHNlY3Rpb24uICAqLwotI2RlZmluZSBPQkpfU1lNRklFTERfVFlQRSB2YWx1ZVQKLQotI2RlZmluZSBUQ19DT05TX0ZJWF9ORVcoRlJBRyxPRkYsTEVOLEVYUCkgXAotICAgICAgZml4X25ld19leHAgKEZSQUcsIE9GRiwgKGludClMRU4sIEVYUCwgMCwgXAotCUxFTiA9PSAyID8gQkZEX1JFTE9DXzE2IFwKLQk6IExFTiA9PSA0ID8gQkZEX1JFTE9DXzMyIFwKLQk6IExFTiA9PSA4ID8gQkZEX1JFTE9DXzY0IFwKLQk6IEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFKTsKLSNlbmRpZgotCi0jZGVmaW5lIG1kX251bWJlcl90b19jaGFycwkJbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbgotCi1leHRlcm4gaW50IHRjX2dldF9yZWdpc3RlciBQQVJBTVMgKChpbnQgZnJhbWUpKTsKLWV4dGVybiB2b2lkIGFscGhhX2Zyb2JfZWNvZmZfZGF0YSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgdGNfZnJvYl9sYWJlbChzeW0pIGFscGhhX2RlZmluZV9sYWJlbCAoc3ltKQotZXh0ZXJuIHZvaWQgYWxwaGFfZGVmaW5lX2xhYmVsIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOwotCi0jZGVmaW5lIG1kX2NvbnNfYWxpZ24obmJ5dGVzKSBhbHBoYV9jb25zX2FsaWduIChuYnl0ZXMpCi1leHRlcm4gdm9pZCBhbHBoYV9jb25zX2FsaWduIFBBUkFNUyAoKGludCkpOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0jZGVmaW5lIHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KCkgYWxwaGFfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgKCkKLWV4dGVybiB2b2lkIGFscGhhX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0IFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi0jZGVmaW5lIERJRkZfRVhQUl9PSyAgIC8qIGZvby0uIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TIFwKLSAgeyAiLnNkYXRhIiwgICBTSFRfUFJPR0JJVFMsICAgU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX0FMUEhBX0dQUkVMICB9LCBcCi0gIHsgIi5zYnNzIiwgICAgU0hUX05PQklUUywgICAgIFNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9BTFBIQV9HUFJFTCAgfSwKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1hcmMuYyBiL2dhcy9jb25maWcvdGMtYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwN2MyZDcuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1hcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0ODEgKzAsMCBAQAotLyogdGMtYXJjLmMgLS0gQXNzZW1ibGVyIGZvciB0aGUgQVJDCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zIChkamVAY3lnbnVzLmNvbSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm9wY29kZS9hcmMuaCIKLSNpbmNsdWRlICJlbGYvYXJjLmgiCi0KLWV4dGVybiBpbnQgYXJjX2dldF9tYWNoIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgYXJjX2luc24gYXJjX2luc2VydF9vcGVyYW5kIFBBUkFNUyAoKGFyY19pbnNuLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICosIGludCwKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqLAotCQkJCQkgICAgb2Zmc2V0VCwgY2hhciAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIGFyY19jb21tb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBhcmNfY3B1IFBBUkFNUyAoKGludCkpOwotLypzdGF0aWMgdm9pZCBhcmNfcmVuYW1lIFBBUkFNUyAoKGludCkpOyovCi1zdGF0aWMgaW50IGdldF9hcmNfZXhwX3JlbG9jX3R5cGUgUEFSQU1TICgoaW50LCBpbnQsIGV4cHJlc3Npb25TICosCi0JCQkJCSAgIGV4cHJlc3Npb25TICopKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCAwIH0sCS8qIERlZmF1bHRpbmcgaXMgaW52YWxpZCAoMCkgKi8KLSAgeyAiY29tbW9uIiwgYXJjX2NvbW1vbiwgMCB9LAotLyp7ICJod29yZCIsIGNvbnMsIDIgfSwgLSBhbHJlYWR5IGV4aXN0cyAqLwotICB7ICJ3b3JkIiwgY29ucywgNCB9LAotLyp7ICJ4d29yZCIsIGNvbnMsIDggfSwqLwotICB7ICJjcHUiLCBhcmNfY3B1LCAwIH0sCi0vKnsgInJlbmFtZSIsIGFyY19yZW5hbWUsIDAgfSwqLwotICB7IE5VTEwsIDAsIDAgfSwKLX07Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjOyI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBzdGFydGVkIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMKLSAgIHdvcmsgaWYgJy8nIGlzbid0IG90aGVyd2lzZSBkZWZpbmVkLiAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRCI7Ci0KLS8qIEJ5dGUgb3JkZXIuICAqLwotZXh0ZXJuIGludCB0YXJnZXRfYmlnX2VuZGlhbjsKLWNvbnN0IGNoYXIgKmFyY190YXJnZXRfZm9ybWF0ID0gREVGQVVMVF9UQVJHRVRfRk9STUFUOwotc3RhdGljIGludCBieXRlX29yZGVyID0gREVGQVVMVF9CWVRFX09SREVSOwotCi0vKiBPbmUgb2YgYmZkX21hY2hfYXJjX3h4eC4gICovCi1zdGF0aWMgaW50IGFyY19tYWNoX3R5cGUgPSBiZmRfbWFjaF9hcmNfYmFzZTsKLQotLyogTm9uLXplcm8gaWYgdGhlIGNwdSB0eXBlIGhhcyBiZWVuIGV4cGxpY2l0bHkgc3BlY2lmaWVkLiAgKi8KLXN0YXRpYyBpbnQgbWFjaF90eXBlX3NwZWNpZmllZF9wID0gMDsKLQotLyogTm9uLXplcm8gaWYgb3Bjb2RlIHRhYmxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICBBIC5jcHUgY29tbWFuZCBtdXN0IGFwcGVhciBiZWZvcmUgYW55IGluc3RydWN0aW9ucy4gICovCi1zdGF0aWMgaW50IGNwdV90YWJsZXNfaW5pdF9wID0gMDsKLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmFyY19zdWZmaXhfaGFzaCA9IE5VTEw7Ci0MCi1jb25zdCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0jZGVmaW5lIE9QVElPTl9FQiAoT1BUSU9OX01EX0JBU0UgKyAwKQotICB7IkVCIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FQn0sCi0jZGVmaW5lIE9QVElPTl9FTCAoT1BUSU9OX01EX0JBU0UgKyAxKQotICB7IkVMIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTH0sCi0gIHsgTlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDAgfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLS8qCi0gKiBtZF9wYXJzZV9vcHRpb24KLSAqCi0gKiBJbnZvY2F0aW9uIGxpbmUgaW5jbHVkZXMgYSBzd2l0Y2ggbm90IHJlY29nbml6ZWQgYnkgdGhlIGJhc2UgYXNzZW1ibGVyLgotICogU2VlIGlmIGl0J3MgYSBwcm9jZXNzb3Itc3BlY2lmaWMgb3B0aW9uLgotICovCi0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSBPUFRJT05fRUI6Ci0gICAgICBieXRlX29yZGVyID0gQklHX0VORElBTjsKLSAgICAgIGFyY190YXJnZXRfZm9ybWF0ID0gImVsZjMyLWJpZ2FyYyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9FTDoKLSAgICAgIGJ5dGVfb3JkZXIgPSBMSVRUTEVfRU5ESUFOOwotICAgICAgYXJjX3RhcmdldF9mb3JtYXQgPSAiZWxmMzItbGl0dGxlYXJjIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1BUkMgb3B0aW9uczpcblwKLS1FQgkJCWdlbmVyYXRlIGJpZyBlbmRpYW4gb3V0cHV0XG5cCi0tRUwJCQlnZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIG91dHB1dFxuIikpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4KLSAgIE9wY29kZSBzZWxlY3Rpb24gaXMgZGVmZXJlZCB1bnRpbCBsYXRlciBiZWNhdXNlIHdlIG1pZ2h0IHNlZSBhIC5jcHUKLSAgIGNvbW1hbmQuICAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICAvKiBUaGUgZW5kaWFubmVzcyBjYW4gYmUgY2hvc2VuICJhdCB0aGUgZmFjdG9yeSIuICAqLwotICB0YXJnZXRfYmlnX2VuZGlhbiA9IGJ5dGVfb3JkZXIgPT0gQklHX0VORElBTjsKLQotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2FyYywgYXJjX21hY2hfdHlwZSkpCi0gICAgYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0KLSAgLyogQXNzdW1lIHRoZSBiYXNlIGNwdS4gIFRoaXMgY2FsbCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBuZWVkIHRvCi0gICAgIGluaXRpYWxpemUgYGFyY19vcGVyYW5kX21hcCcgd2hpY2ggbWF5IGJlIG5lZWRlZCBiZWZvcmUgd2Ugc2VlIHRoZQotICAgICBmaXJzdCBpbnNuLiAgKi8KLSAgYXJjX29wY29kZV9pbml0X3RhYmxlcyAoYXJjX2dldF9vcGNvZGVfbWFjaCAoYmZkX21hY2hfYXJjX2Jhc2UsCi0JCQkJCSAgICAgICB0YXJnZXRfYmlnX2VuZGlhbikpOwotfQotCi0vKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzIG9wY29kZSBhbmQgb3BlcmFuZCB0YWJsZXMuCi0gICBNQUNIIGlzIG9uZSBvZiBiZmRfbWFjaF9hcmNfeHh4LiAgKi8KLQotc3RhdGljIHZvaWQKLWluaXRfb3Bjb2RlX3RhYmxlcyAobWFjaCkKLSAgICAgaW50IG1hY2g7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotICBjaGFyICpsYXN0OwotCi0gIGlmICgoYXJjX3N1ZmZpeF9oYXNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpKTsKLQotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2FyYywgbWFjaCkpCi0gICAgYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0KLSAgLyogVGhpcyBpbml0aWFsaXplcyBhIGZldyB0aGluZ3MgaW4gYXJjLW9wYy5jIHRoYXQgd2UgbmVlZC4KLSAgICAgVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIHZhcmlvdXMgYXJjX3h4eF9zdXBwb3J0ZWQgZm5zLiAgKi8KLSAgYXJjX29wY29kZV9pbml0X3RhYmxlcyAoYXJjX2dldF9vcGNvZGVfbWFjaCAobWFjaCwgdGFyZ2V0X2JpZ19lbmRpYW4pKTsKLQotICAvKiBPbmx5IHB1dCB0aGUgZmlyc3QgZW50cnkgb2YgZWFjaCBlcXVpdmFsZW50bHkgbmFtZWQgc3VmZml4IGluIHRoZQotICAgICB0YWJsZS4gICovCi0gIGxhc3QgPSAiIjsKLSAgZm9yIChpID0gMDsgaSA8IGFyY19zdWZmaXhlc19jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIGFyY19vcHZhbF9zdXBwb3J0ZWQgKCZhcmNfc3VmZml4ZXNbaV0pKQotCWNvbnRpbnVlOwotICAgICAgaWYgKHN0cmNtcCAoYXJjX3N1ZmZpeGVzW2ldLm5hbWUsIGxhc3QpICE9IDApCi0JaGFzaF9pbnNlcnQgKGFyY19zdWZmaXhfaGFzaCwgYXJjX3N1ZmZpeGVzW2ldLm5hbWUsIChQVFIpIChhcmNfc3VmZml4ZXMgKyBpKSk7Ci0gICAgICBsYXN0ID0gYXJjX3N1ZmZpeGVzW2ldLm5hbWU7Ci0gICAgfQotCi0gIC8qIFNpbmNlIHJlZ2lzdGVycyBkb24ndCBoYXZlIGEgcHJlZml4LCB3ZSBwdXQgdGhlbSBpbiB0aGUgc3ltYm9sIHRhYmxlIHNvCi0gICAgIHRoZXkgY2FuJ3QgYmUgdXNlZCBhcyBzeW1ib2xzLiAgVGhpcyBhbHNvIHNpbXBsaWZpZXMgYXJndW1lbnQgcGFyc2luZyBhcwotICAgICB3ZSBjYW4gbGV0IGdhcyBwYXJzZSByZWdpc3RlcnMgZm9yIHVzLiAgVGhlIHJlY29yZGVkIHJlZ2lzdGVyIG51bWJlciBpcwotICAgICB0aGUgaW5kZXggaW4gYGFyY19yZWdfbmFtZXMnLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGFyY19yZWdfbmFtZXNfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoISBhcmNfb3B2YWxfc3VwcG9ydGVkICgmYXJjX3JlZ19uYW1lc1tpXSkpCi0JY29udGludWU7Ci0gICAgICAvKiBVc2Ugc3ltYm9sX2NyZWF0ZSBoZXJlIGluc3RlYWQgb2Ygc3ltYm9sX25ldyBzbyB3ZSBkb24ndCB0cnkgdG8KLQkgb3V0cHV0IHJlZ2lzdGVycyBpbnRvIHRoZSBvYmplY3QgZmlsZSdzIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfY3JlYXRlIChhcmNfcmVnX25hbWVzW2ldLm5hbWUsIHJlZ19zZWN0aW9uLAotCQkJCQkgIGksICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICAgIH0KLQotICAvKiBUZWxsIGBzX2NwdScgaXQncyB0b28gbGF0ZS4gICovCi0gIGNwdV90YWJsZXNfaW5pdF9wID0gMTsKLX0KLQwKLS8qIEluc2VydCBhbiBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24uCi0gICBJZiBSRUcgaXMgbm9uLU5VTEwsIGl0IGlzIGEgcmVnaXN0ZXIgbnVtYmVyIGFuZCBpZ25vcmUgVkFMLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1hcmNfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsLCBmaWxlLCBsaW5lKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgb2Zmc2V0VCB2YWw7Ci0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotewotICBpZiAob3BlcmFuZC0+Yml0cyAhPSAzMikKLSAgICB7Ci0gICAgICBsb25nIG1pbiwgbWF4OwotICAgICAgb2Zmc2V0VCB0ZXN0OwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCXsKLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdOT1BUKSAhPSAwKQotCSAgICBtYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7Ci0JICBlbHNlCi0JICAgIG1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQkgIG1pbiA9IDA7Ci0JfQotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfTkVHQVRJVkUpICE9IDApCi0JdGVzdCA9IC0gdmFsOwotICAgICAgZWxzZQotCXRlc3QgPSB2YWw7Ci0KLSAgICAgIGlmICh0ZXN0IDwgKG9mZnNldFQpIG1pbiB8fCB0ZXN0ID4gKG9mZnNldFQpIG1heCkKLQl7Ci0JICBjb25zdCBjaGFyICplcnIgPQotCSAgICBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIik7Ci0JICBjaGFyIGJ1ZlsxMDBdOwotCi0JICBzcHJpbnRfdmFsdWUgKGJ1ZiwgdGVzdCk7Ci0JICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQotCSAgICBhc193YXJuIChlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCSAgZWxzZQotCSAgICBhc193YXJuX3doZXJlIChmaWxlLCBsaW5lLCBlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCX0KLSAgICB9Ci0KLSAgaWYgKG9wZXJhbmQtPmluc2VydCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgICAgIGVycm1zZyA9IE5VTEw7Ci0gICAgICBpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIChsb25nKSB2YWwsICZlcnJtc2cpOwotICAgICAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQotCWFzX3dhcm4gKGVycm1zZyk7Ci0gICAgfQotICBlbHNlCi0gICAgaW5zbiB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkgICAgIDw8IG9wZXJhbmQtPnNoaWZ0KTsKLQotICByZXR1cm4gaW5zbjsKLX0KLQotLyogV2UgbmVlZCB0byBrZWVwIGEgbGlzdCBvZiBmaXh1cHMuICBXZSBjYW4ndCBzaW1wbHkgZ2VuZXJhdGUgdGhlbSBhcwotICAgd2UgZ28sIGJlY2F1c2UgdGhhdCB3b3VsZCByZXF1aXJlIHVzIHRvIGZpcnN0IGNyZWF0ZSB0aGUgZnJhZywgYW5kCi0gICB0aGF0IHdvdWxkIHNjcmV3IHVwIHJlZmVyZW5jZXMgdG8gYGAuJycuICAqLwotCi1zdHJ1Y3QgYXJjX2ZpeHVwCi17Ci0gIC8qIGluZGV4IGludG8gYGFyY19vcGVyYW5kcycgKi8KLSAgaW50IG9waW5kZXg7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLX07Ci0KLSNkZWZpbmUgTUFYX0ZJWFVQUyA1Ci0KLSNkZWZpbmUgTUFYX1NVRkZJWEVTIDUKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmb3IgZWFjaCBpbnN0cnVjdGlvbiB0byBiZSBhc3NlbWJsZWQuICAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNvbnN0IHN0cnVjdCBhcmNfb3Bjb2RlICpvcGNvZGU7Ci0gIGNoYXIgKnN0YXJ0OwotICBhcmNfaW5zbiBpbnNuOwotICBzdGF0aWMgaW50IGluaXRfdGFibGVzX3AgPSAwOwotCi0gIC8qIE9wY29kZSB0YWJsZSBpbml0aWFsaXphdGlvbiBpcyBkZWZlcnJlZCB1bnRpbCBoZXJlIGJlY2F1c2Ugd2UgaGF2ZSB0bwotICAgICB3YWl0IGZvciBhIHBvc3NpYmxlIC5jcHUgY29tbWFuZC4gICovCi0gIGlmICghaW5pdF90YWJsZXNfcCkKLSAgICB7Ci0gICAgICBpbml0X29wY29kZV90YWJsZXMgKGFyY19tYWNoX3R5cGUpOwotICAgICAgaW5pdF90YWJsZXNfcCA9IDE7Ci0gICAgfQotCi0gIC8qIFNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZS4gICovCi0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICBzdHIrKzsKLQotICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgaW4gbGlzdHMgaGFzaGVkIGJ5IHRoZSBmaXJzdCBsZXR0ZXIgKHRob3VnaAotICAgICB3ZSBuZWVkbid0IGNhcmUgaG93IHRoZXkncmUgaGFzaGVkKS4gIEdldCB0aGUgZmlyc3QgaW4gdGhlIGxpc3QuICAqLwotCi0gIG9wY29kZSA9IGFyY19vcGNvZGVfbG9va3VwX2FzbSAoc3RyKTsKLQotICAvKiBLZWVwIGxvb2tpbmcgdW50aWwgd2UgZmluZCBhIG1hdGNoLiAgKi8KLQotICBzdGFydCA9IHN0cjsKLSAgZm9yICggOyBvcGNvZGUgIT0gTlVMTDsgb3Bjb2RlID0gQVJDX09QQ09ERV9ORVhUX0FTTSAob3Bjb2RlKSkKLSAgICB7Ci0gICAgICBpbnQgcGFzdF9vcGNvZGVfcCwgZmMsIG51bV9zdWZmaXhlczsKLSAgICAgIGNoYXIgKnN5bjsKLSAgICAgIHN0cnVjdCBhcmNfZml4dXAgZml4dXBzW01BWF9GSVhVUFNdOwotICAgICAgLyogVXNlZCBhcyBhIHNhbml0eSBjaGVjay4gIElmIHdlIG5lZWQgYSBsaW1tIHJlbG9jLCBtYWtlIHN1cmUgd2UgYXNrCi0JIGZvciBhbiBleHRyYSA0IGJ5dGVzIGZyb20gZnJhZ19tb3JlLiAgKi8KLSAgICAgIGludCBsaW1tX3JlbG9jX3A7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKmluc25fc3VmZml4ZXNbTUFYX1NVRkZJWEVTXTsKLQotICAgICAgLyogSXMgdGhpcyBvcGNvZGUgc3VwcG9ydGVkIGJ5IHRoZSBzZWxlY3RlZCBjcHU/ICAqLwotICAgICAgaWYgKCEgYXJjX29wY29kZV9zdXBwb3J0ZWQgKG9wY29kZSkpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNjYW4gdGhlIHN5bnRheCBzdHJpbmcuICBJZiBpdCBkb2Vzbid0IG1hdGNoLCB0cnkgdGhlIG5leHQgb25lLiAgKi8KLQotICAgICAgYXJjX29wY29kZV9pbml0X2luc2VydCAoKTsKLSAgICAgIGluc24gPSBvcGNvZGUtPnZhbHVlOwotICAgICAgZmMgPSAwOwotICAgICAgcGFzdF9vcGNvZGVfcCA9IDA7Ci0gICAgICBudW1fc3VmZml4ZXMgPSAwOwotICAgICAgbGltbV9yZWxvY19wID0gMDsKLQotICAgICAgLyogV2UgZG9uJ3QgY2hlY2sgZm9yICgqc3RyICE9ICdcMCcpIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRvIHBhcnNlCi0JIGFueSB0cmFpbGluZyBmYWtlIGFyZ3VtZW50cyBpbiB0aGUgc3ludGF4IHN0cmluZy4gICovCi0gICAgICBmb3IgKHN0ciA9IHN0YXJ0LCBzeW4gPSBvcGNvZGUtPnN5bnRheDsgKnN5biAhPSAnXDAnOyApCi0JewotCSAgaW50IG1vZHM7Ci0JICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0KLQkgIC8qIE5vbiBvcGVyYW5kIGNoYXJzIG11c3QgbWF0Y2ggZXhhY3RseS4gICovCi0JICBpZiAoKnN5biAhPSAnJScgfHwgKisrc3luID09ICclJykKLQkgICAgewotCSAgICAgIC8qIEhhbmRsZSAnKycgc3BlY2lhbGx5IGFzIHdlIHdhbnQgdG8gYWxsb3cgImxkIHIwLFtzcC00XSIuICAqLwotCSAgICAgIC8qID8/PyBUaGUgc3ludGF4IGhhcyBjaGFuZ2VkIHRvIFtzcCwtNF0uICAqLwotCSAgICAgIGlmICgwICYmICpzeW4gPT0gJysnICYmICpzdHIgPT0gJy0nKQotCQl7Ci0JCSAgLyogU2tpcCBvdmVyIHN5bidzICssIGJ1dCBsZWF2ZSBzdHIncyAtIGFsb25lLgotCQkgICAgIFRoYXQgbWFrZXMgdGhlIGNhc2UgaWRlbnRpY2FsIHRvICJsZCByMCxbc3ArLTRdIi4gICovCi0JCSAgKytzeW47Ci0JCX0KLQkgICAgICBlbHNlIGlmICgqc3RyID09ICpzeW4pCi0JCXsKLQkJICBpZiAoKnN5biA9PSAnICcpCi0JCSAgICBwYXN0X29wY29kZV9wID0gMTsKLQkJICArK3N5bjsKLQkJICArK3N0cjsKLQkJfQotCSAgICAgIGVsc2UKLQkJYnJlYWs7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogV2UgaGF2ZSBhbiBvcGVyYW5kLiAgUGljayBvdXQgYW55IG1vZGlmaWVycy4gICovCi0JICBtb2RzID0gMDsKLQkgIHdoaWxlIChBUkNfTU9EX1AgKGFyY19vcGVyYW5kc1thcmNfb3BlcmFuZF9tYXBbKnN5bl1dLmZsYWdzKSkKLQkgICAgewotCSAgICAgIG1vZHMgfD0gYXJjX29wZXJhbmRzW2FyY19vcGVyYW5kX21hcFsqc3luXV0uZmxhZ3MgJiBBUkNfTU9EX0JJVFM7Ci0JICAgICAgKytzeW47Ci0JICAgIH0KLQkgIG9wZXJhbmQgPSBhcmNfb3BlcmFuZHMgKyBhcmNfb3BlcmFuZF9tYXBbKnN5bl07Ci0JICBpZiAob3BlcmFuZC0+Zm10ID09IDApCi0JICAgIGFzX2ZhdGFsIChfKCJ1bmtub3duIHN5bnRheCBmb3JtYXQgY2hhcmFjdGVyIGAlYyciKSwgKnN5bik7Ci0KLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX0ZBS0UpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICplcnJtc2cgPSBOVUxMOwotCSAgICAgIGlmIChvcGVyYW5kLT5pbnNlcnQpCi0JCXsKLQkJICBpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBOVUxMLCAwLCAmZXJybXNnKTsKLQkJICAvKiBJZiB3ZSBnZXQgYW4gZXJyb3IsIGdvIG9uIHRvIHRyeSB0aGUgbmV4dCBpbnNuLiAgKi8KLQkJICBpZiAoZXJybXNnKQotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgICArK3N5bjsKLQkgICAgfQotCSAgLyogQXJlIHdlIGZpbmlzaGVkIHdpdGggc3VmZml4ZXM/ICAqLwotCSAgZWxzZSBpZiAoIXBhc3Rfb3Bjb2RlX3ApCi0JICAgIHsKLQkgICAgICBpbnQgZm91bmQ7Ci0JICAgICAgY2hhciBjOwotCSAgICAgIGNoYXIgKnMsKnQ7Ci0JICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpzdWYsKnN1ZmZpeCwqc3VmZml4X2VuZDsKLQotCSAgICAgIGlmICghKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU1VGRklYKSkKLQkJYWJvcnQgKCk7Ci0KLQkgICAgICAvKiBJZiB3ZSdyZSBhdCBhIHNwYWNlIGluIHRoZSBpbnB1dCBzdHJpbmcsIHdlIHdhbnQgdG8gc2tpcCB0aGUKLQkJIHJlbWFpbmluZyBzdWZmaXhlcy4gIFRoZXJlIG1heSBiZSBzb21lIGZha2Ugb25lcyB0aG91Z2gsIHNvCi0JCSBqdXN0IGdvIG9uIHRvIHRyeSB0aGUgbmV4dCBvbmUuICAqLwotCSAgICAgIGlmICgqc3RyID09ICcgJykKLQkJewotCQkgICsrc3luOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBzID0gc3RyOwotCSAgICAgIGlmIChtb2RzICYgQVJDX01PRF9ET1QpCi0JCXsKLQkJICBpZiAoKnMgIT0gJy4nKQotCQkgICAgYnJlYWs7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogVGhpcyBjYW4gaGFwcGVuIGluICJiLm5kIGZvbyIgYW5kIHdlJ3JlIGN1cnJlbnRseSBsb29raW5nCi0JCSAgICAgZm9yICIlcSIgKGllOiBhIGNvbmRpdGlvbiBjb2RlIHN1ZmZpeCkuICAqLwotCQkgIGlmICgqcyA9PSAnLicpCi0JCSAgICB7Ci0JCSAgICAgICsrc3luOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogUGljayB0aGUgc3VmZml4IG91dCBhbmQgbG9vayBpdCB1cCB2aWEgdGhlIGhhc2ggdGFibGUuICAqLwotCSAgICAgIGZvciAodCA9IHM7ICp0ICYmIGlzYWxwaGEgKCp0KTsgKyt0KQotCQljb250aW51ZTsKLQkgICAgICBjID0gKnQ7Ci0JICAgICAgKnQgPSAnXDAnOwotCSAgICAgIHN1ZiA9IGhhc2hfZmluZCAoYXJjX3N1ZmZpeF9oYXNoLCBzKTsKLQkgICAgICAqdCA9IGM7Ci0JICAgICAgaWYgKCFzdWYpCi0JCXsKLQkJICAvKiBUaGlzIGNhbiBoYXBwZW4gaW4gImJsbGUgZm9vIiBhbmQgd2UncmUgY3VycmVudGx5IHVzaW5nCi0JCSAgICAgdGhlIHRlbXBsYXRlICJiJXElLm4gJWoiLiAgVGhlICJibCIgaW5zbiBvY2N1cnMgbGF0ZXIgaW4KLQkJICAgICB0aGUgdGFibGUgc28gImxsZSIgaXNuJ3QgYW4gaWxsZWdhbCBzdWZmaXguICAqLwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICAvKiBJcyBpdCB0aGUgcmlnaHQgdHlwZT8gIE5vdGUgdGhhdCB0aGUgc2FtZSBjaGFyYWN0ZXIgaXMgdXNlZAotCSAgICAgICAgIHNldmVyYWwgdGltZXMsIHNvIHdlIGhhdmUgdG8gZXhhbWluZSBhbGwgb2YgdGhlbS4gIFRoaXMgaXMKLQkJIHJlbGF0aXZlbHkgZWZmaWNpZW50IGFzIGVxdWl2YWxlbnQgZW50cmllcyBhcmUga2VwdAotCQkgdG9nZXRoZXIuICBJZiBpdCdzIG5vdCB0aGUgcmlnaHQgdHlwZSwgZG9uJ3QgaW5jcmVtZW50IGBzdHInCi0JCSBzbyB3ZSB0cnkgdGhlIG5leHQgb25lIGluIHRoZSBzZXJpZXMuICAqLwotCSAgICAgIGZvdW5kID0gMDsKLQkgICAgICBzdWZmaXhfZW5kID0gYXJjX3N1ZmZpeGVzICsgYXJjX3N1ZmZpeGVzX2NvdW50OwotCSAgICAgIGZvciAoc3VmZml4ID0gc3VmOwotCQkgICBzdWZmaXggPCBzdWZmaXhfZW5kICYmIHN0cmNtcCAoc3VmZml4LT5uYW1lLCBzdWYtPm5hbWUpID09IDA7Ci0JCSAgICsrc3VmZml4KQotCQl7Ci0JCSAgaWYgKGFyY19vcGVyYW5kc1tzdWZmaXgtPnR5cGVdLmZtdCA9PSAqc3luKQotCQkgICAgewotCQkgICAgICAvKiBJbnNlcnQgdGhlIHN1ZmZpeCdzIHZhbHVlIGludG8gdGhlIGluc24uICAqLwotCQkgICAgICBpZiAob3BlcmFuZC0+aW5zZXJ0KQotCQkJaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgb3BlcmFuZCwKLQkJCQkJCSAgIG1vZHMsIE5VTEwsIHN1ZmZpeC0+dmFsdWUsCi0JCQkJCQkgICBOVUxMKTsKLQkJICAgICAgZWxzZQotCQkJaW5zbiB8PSBzdWZmaXgtPnZhbHVlIDw8IG9wZXJhbmQtPnNoaWZ0OwotCi0JCSAgICAgIHN0ciA9IHQ7Ci0JCSAgICAgIGZvdW5kID0gMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICArK3N5bjsKLQkgICAgICBpZiAoIWZvdW5kKQotCQk7IC8qIFdyb25nIHR5cGUuICBKdXN0IGdvIG9uIHRvIHRyeSBuZXh0IGluc24gZW50cnkuICAqLwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChudW1fc3VmZml4ZXMgPT0gTUFYX1NVRkZJWEVTKQotCQkgICAgYXNfYmFkIChfKCJ0b28gbWFueSBzdWZmaXhlcyIpKTsKLQkJICBlbHNlCi0JCSAgICBpbnNuX3N1ZmZpeGVzW251bV9zdWZmaXhlcysrXSA9IHN1ZmZpeDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIC8qIFRoaXMgaXMgZWl0aGVyIGEgcmVnaXN0ZXIgb3IgYW4gZXhwcmVzc2lvbiBvZiBzb21lIGtpbmQuICAqLwotCSAgICB7Ci0JICAgICAgY2hhciBjOwotCSAgICAgIGNoYXIgKmhvbGQ7Ci0JICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWcgPSBOVUxMOwotCSAgICAgIGxvbmcgdmFsdWUgPSAwOwotCSAgICAgIGV4cHJlc3Npb25TIGV4cDsKLQotCSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NVRkZJWCkKLQkJYWJvcnQgKCk7Ci0KLQkgICAgICAvKiBJcyB0aGVyZSBhbnl0aGluZyBsZWZ0IHRvIHBhcnNlPwotCQkgV2UgZG9uJ3QgY2hlY2sgZm9yIHRoaXMgYXQgdGhlIHRvcCBiZWNhdXNlIHdlIHdhbnQgdG8gcGFyc2UKLQkJIGFueSB0cmFpbGluZyBmYWtlIGFyZ3VtZW50cyBpbiB0aGUgc3ludGF4IHN0cmluZy4gICovCi0JICAgICAgaWYgKCpzdHIgPT0gJ1wwJykKLQkJYnJlYWs7Ci0jaWYgMAotCSAgICAgIC8qIElzIHRoaXMgYSBzeW50YXggY2hhcmFjdGVyPyAgRWc6IGlzIHRoZXJlIGEgJ1snIHByZXNlbnQgd2hlbgotCQkgdGhlcmUgc2hvdWxkbid0IGJlPyAgKi8KLQkgICAgICBpZiAoIWlzYWxudW0gKCpzdHIpCi0JCSAgLyogJy4nIGFzIGluICIuTExDMCIgKi8KLQkJICAmJiAqc3RyICE9ICcuJwotCQkgIC8qICdfJyBhcyBpbiAiX3ByaW50IiAqLwotCQkgICYmICpzdHIgIT0gJ18nCi0JCSAgLyogJy0nIGFzIGluICJbZnAsLTRdIiAqLwotCQkgICYmICpzdHIgIT0gJy0nCi0JCSAgLyogJyUnIGFzIGluICIlaWEoX2Z1bmMpIiAqLwotCQkgICYmICpzdHIgIT0gJyUnKQotCQlicmVhazsKLSNlbmRpZgotCi0JICAgICAgLyogUGFyc2UgdGhlIG9wZXJhbmQuICAqLwotCSAgICAgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCSAgICAgIGV4cHJlc3Npb24gKCZleHApOwotCSAgICAgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCi0JICAgICAgaWYgKGV4cC5YX29wID09IE9faWxsZWdhbCkKLQkJYXNfYmFkIChfKCJpbGxlZ2FsIG9wZXJhbmQiKSk7Ci0JICAgICAgZWxzZSBpZiAoZXhwLlhfb3AgPT0gT19hYnNlbnQpCi0JCWFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotCSAgICAgIGVsc2UgaWYgKGV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICB2YWx1ZSA9IGV4cC5YX2FkZF9udW1iZXI7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX3JlZ2lzdGVyKQotCQl7Ci0JCSAgcmVnID0gYXJjX3JlZ19uYW1lcyArIGV4cC5YX2FkZF9udW1iZXI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIHRoaXMgZXhwcmVzc2lvbi4gICovCi0JCSAgaWYgKGZjID49IE1BWF9GSVhVUFMpCi0JCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCQkgIGZpeHVwc1tmY10uZXhwID0gZXhwOwotCi0JCSAgLyogSWYgdGhpcyBpcyBhIHJlZ2lzdGVyIGNvbnN0YW50IChJRTogb25lIHdob3NlCi0JCSAgICAgcmVnaXN0ZXIgdmFsdWUgZ2V0cyBzdG9yZWQgYXMgNjEtNjMpIHRoZW4gdGhpcwotCQkgICAgIG11c3QgYmUgYSBsaW1tLiAgV2UgZG9uJ3Qgc3VwcG9ydCBzaGltbSByZWxvY3MuICAqLwotCQkgIC8qID8/PyBUaGlzIGJpdCBjb3VsZCB1c2Ugc29tZSBjbGVhbmluZyB1cC4KLQkJICAgICBSZWZlcmVuY2luZyB0aGUgZm9ybWF0IGNoYXJzIGxpa2UgdGhpcyBnb2VzCi0JCSAgICAgYWdhaW5zdCBzdHlsZS4gICovCi0jZGVmaW5lIElTX1JFR19PUEVSQU5EKG8pICgobykgPT0gJ2EnIHx8IChvKSA9PSAnYicgfHwgKG8pID09ICdjJykKLQkJICBpZiAoSVNfUkVHX09QRVJBTkQgKCpzeW4pKQotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpqdW5rOwotCi0JCSAgICAgIGZpeHVwc1tmY10ub3BpbmRleCA9IGFyY19vcGVyYW5kX21hcFsnTCddOwotCQkgICAgICBsaW1tX3JlbG9jX3AgPSAxOwotCQkgICAgICAvKiBUZWxsIGluc2VydF9yZWcgd2UgbmVlZCBhIGxpbW0uICBUaGlzIGlzCi0JCQkgbmVlZGVkIGJlY2F1c2UgdGhlIHZhbHVlIGF0IHRoaXMgcG9pbnQgaXMKLQkJCSB6ZXJvLCBhIHNoaW1tLiAgKi8KLQkJICAgICAgLyogPz8/IFdlIG5lZWQgYSBjbGVhbmVyIGludGVyZmFjZSB0aGFuIHRoaXMuICAqLwotCQkgICAgICAoKmFyY19vcGVyYW5kc1thcmNfb3BlcmFuZF9tYXBbJ1EnXV0uaW5zZXJ0KQotCQkJKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgMEwsICZqdW5rKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBmaXh1cHNbZmNdLm9waW5kZXggPSBhcmNfb3BlcmFuZF9tYXBbKnN5bl07Ci0JCSAgKytmYzsKLQkJICB2YWx1ZSA9IDA7Ci0JCX0KLQotCSAgICAgIC8qIEluc2VydCB0aGUgcmVnaXN0ZXIgb3IgZXhwcmVzc2lvbiBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgaWYgKG9wZXJhbmQtPmluc2VydCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKmVycm1zZyA9IE5VTEw7Ci0JCSAgaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgb3BlcmFuZCwgbW9kcywKLQkJCQkJICAgICByZWcsIChsb25nKSB2YWx1ZSwgJmVycm1zZyk7Ci0jaWYgMAotCQkgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQkJICAgIGFzX3dhcm4gKGVycm1zZyk7Ci0jZW5kaWYKLQkJICAvKiBGSVhNRTogV2Ugd2FudCB0byB0cnkgc2hpbW0gaW5zbnMgZm9yIGxpbW0gb25lcy4gIEJ1dCBpZgotCQkgICAgIHRoZSBjb25zdGFudCB3b24ndCBmaXQsIHdlIG11c3QgZ28gb24gdG8gdHJ5IHRoZSBuZXh0Ci0JCSAgICAgcG9zc2liaWxpdHkuICBXaGVyZSBkbyB3ZSBpc3N1ZSB3YXJuaW5ncyBmb3IgY29uc3RhbnRzCi0JCSAgICAgdGhhdCBhcmUgdG9vIGJpZyB0aGVuPyAgQXQgcHJlc2VudCwgd2UnbGwgZmxhZyB0aGUgaW5zbgotCQkgICAgIGFzIHVucmVjb2duaXphYmxlISAgTWF5YmUgaGF2ZSB0aGUgImJhZCBpbnN0cnVjdGlvbiIKLQkJICAgICBlcnJvciBtZXNzYWdlIGluY2x1ZGUgb3VyIGBlcnJtc2cnPyAgKi8KLQkJICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICopIE5VTEwpCi0JCSAgICBicmVhazsKLQkJfQotCSAgICAgIGVsc2UKLQkJaW5zbiB8PSAodmFsdWUgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkgPDwgb3BlcmFuZC0+c2hpZnQ7Ci0KLQkgICAgICArK3N5bjsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgc3ludGF4IHN0cmluZywgd2UncmUgZG9uZS4gICovCi0gICAgICAvKiBGSVhNRTogdHJ5IHRvIG1vdmUgdGhpcyB0byBhIHNlcGFyYXRlIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmICgqc3luID09ICdcMCcpCi0JewotCSAgaW50IGk7Ci0JICBjaGFyICpmOwotCSAgbG9uZyBsaW1tLCBsaW1tX3A7Ci0KLQkgIC8qIEZvciB0aGUgbW9tZW50IHdlIGFzc3VtZSBhIHZhbGlkIGBzdHInIGNhbiBvbmx5IGNvbnRhaW4gYmxhbmtzCi0JICAgICBub3cuICBJRTogV2UgbmVlZG4ndCB0cnkgYWdhaW4gd2l0aCBhIGxvbmdlciB2ZXJzaW9uIG9mIHRoZQotCSAgICAgaW5zbiBhbmQgaXQgaXMgYXNzdW1lZCB0aGF0IGxvbmdlciB2ZXJzaW9ucyBvZiBpbnNucyBhcHBlYXIKLQkgICAgIGJlZm9yZSBzaG9ydGVyIG9uZXMgKGVnOiBsc3IgcjIscjMsMSB2cyBsc3IgcjIscjMpLiAgKi8KLQotCSAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQotCSAgICArK3N0cjsKLQotCSAgaWYgKCpzdHIgIT0gJ1wwJykKLQkgICAgYXNfYmFkIChfKCJqdW5rIGF0IGVuZCBvZiBsaW5lOiBgJXMnIiksIHN0cik7Ci0KLQkgIC8qIElzIHRoZXJlIGEgbGltbSB2YWx1ZT8gICovCi0JICBsaW1tX3AgPSBhcmNfb3Bjb2RlX2xpbW1fcCAoJmxpbW0pOwotCi0JICAvKiBQZXJmb3JtIHZhcmlvdXMgZXJyb3IgYW5kIHdhcm5pbmcgdGVzdHMuICAqLwotCi0JICB7Ci0JICAgIHN0YXRpYyBpbnQgaW5fZGVsYXlfc2xvdF9wID0gMDsKLQkgICAgc3RhdGljIGludCBwcmV2X2luc25fbmVlZHNfY2Nfbm9wX3AgPSAwOwotCSAgICAvKiBkZWxheSBzbG90IHR5cGUgc2VlbiAqLwotCSAgICBpbnQgZGVsYXlfc2xvdF90eXBlID0gQVJDX0RFTEFZX05PTkU7Ci0JICAgIC8qIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiBmbGFnIHNlZW4gKi8KLQkgICAgaW50IGNvbmRpdGlvbmFsID0gMDsKLQkgICAgLyogMSBpZiBjb25kaXRpb24gY29kZXMgYXJlIGJlaW5nIHNldCAqLwotCSAgICBpbnQgY2Nfc2V0X3AgPSAwOwotCSAgICAvKiAxIGlmIGNvbmRpdGlvbmFsIGJyYW5jaCwgaW5jbHVkaW5nIGBiJyAiYnJhbmNoIGFsd2F5cyIgKi8KLQkgICAgaW50IGNvbmRfYnJhbmNoX3AgPSBvcGNvZGUtPmZsYWdzICYgQVJDX09QQ09ERV9DT05EX0JSQU5DSDsKLQkgICAgaW50IG5lZWRfY2Nfbm9wX3AgPSAwOwotCi0JICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3VmZml4ZXM7ICsraSkKLQkgICAgICB7Ci0JCXN3aXRjaCAoYXJjX29wZXJhbmRzW2luc25fc3VmZml4ZXNbaV0tPnR5cGVdLmZtdCkKLQkJICB7Ci0JCSAgY2FzZSAnbicgOgotCQkgICAgZGVsYXlfc2xvdF90eXBlID0gaW5zbl9zdWZmaXhlc1tpXS0+dmFsdWU7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICdxJyA6Ci0JCSAgICBjb25kaXRpb25hbCA9IGluc25fc3VmZml4ZXNbaV0tPnZhbHVlOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSAnZicgOgotCQkgICAgY2Nfc2V0X3AgPSAxOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICAvKiBQdXR0aW5nIGFuIGluc24gd2l0aCBhIGxpbW0gdmFsdWUgaW4gYSBkZWxheSBzbG90IGlzIHN1cHBvc2VkIHRvCi0JICAgICAgIGJlIGxlZ2FsLCBidXQgbGV0J3Mgd2FybiB0aGUgdXNlciBhbnl3YXkuICBEaXR0byBmb3IgOCBieXRlCi0JICAgICAgIGp1bXBzIHdpdGggZGVsYXkgc2xvdHMuICAqLwotCSAgICBpZiAoaW5fZGVsYXlfc2xvdF9wICYmIGxpbW1fcCkKLQkgICAgICBhc193YXJuIChfKCI4IGJ5dGUgaW5zdHJ1Y3Rpb24gaW4gZGVsYXkgc2xvdCIpKTsKLQkgICAgaWYgKGRlbGF5X3Nsb3RfdHlwZSAhPSBBUkNfREVMQVlfTk9ORSAmJiBsaW1tX3ApCi0JICAgICAgYXNfd2FybiAoXygiOCBieXRlIGp1bXAgaW5zdHJ1Y3Rpb24gd2l0aCBkZWxheSBzbG90IikpOwotCSAgICBpbl9kZWxheV9zbG90X3AgPSAoZGVsYXlfc2xvdF90eXBlICE9IEFSQ19ERUxBWV9OT05FKSAmJiAhbGltbV9wOwotCi0JICAgIC8qIFdhcm4gd2hlbiBhIGNvbmRpdGlvbmFsIGJyYW5jaCBpbW1lZGlhdGVseSBmb2xsb3dzIGEgc2V0IG9mCi0JICAgICAgIHRoZSBjb25kaXRpb24gY29kZXMuICBOb3RlIHRoYXQgdGhpcyBuZWVkbid0IGJlIGRvbmUgaWYgdGhlCi0JICAgICAgIGluc24gdGhhdCBzZXRzIHRoZSBjb25kaXRpb24gY29kZXMgdXNlcyBhIGxpbW0uICAqLwotCSAgICBpZiAoY29uZF9icmFuY2hfcCAmJiBjb25kaXRpb25hbCAhPSAwIC8qIDAgPSAiYWx3YXlzIiAqLwotCQkmJiBwcmV2X2luc25fbmVlZHNfY2Nfbm9wX3ApCi0JICAgICAgYXNfd2FybiAoXygiY29uZGl0aW9uYWwgYnJhbmNoIGZvbGxvd3Mgc2V0IG9mIGZsYWdzIikpOwotCSAgICBwcmV2X2luc25fbmVlZHNfY2Nfbm9wX3AgPSBjY19zZXRfcCAmJiAhbGltbV9wOwotCSAgfQotCi0JICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLgotCSAgICAgSXQgaXMgaW1wb3J0YW50IHRvIGZldGNoIGVub3VnaCBzcGFjZSBpbiBvbmUgY2FsbCB0byBgZnJhZ19tb3JlJy4KLQkgICAgIFdlIHVzZSAoZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSB0byBjb21wdXRlIHdoZXJlIHdlIGFyZSBhbmQgd2UKLQkgICAgIGRvbid0IHdhbnQgZnJhZ19ub3cgdG8gY2hhbmdlIGJldHdlZW4gY2FsbHMuICAqLwotCSAgaWYgKGxpbW1fcCkKLQkgICAgewotCSAgICAgIGYgPSBmcmFnX21vcmUgKDgpOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgNCk7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmICsgNCwgbGltbSwgNCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGxpbW1fcmVsb2NfcCkKLQkgICAgewotCSAgICAgIC8qIFdlIG5lZWQgYSBsaW1tIHJlbG9jLCBidXQgdGhlIHRhYmxlcyB0aGluayB3ZSBkb24ndC4gICovCi0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGYgPSBmcmFnX21vcmUgKDQpOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgNCk7Ci0JICAgIH0KLQotCSAgLyogQ3JlYXRlIGFueSBmaXh1cHMuICAqLwotCSAgZm9yIChpID0gMDsgaSA8IGZjOyArK2kpCi0JICAgIHsKLQkgICAgICBpbnQgb3BfdHlwZSwgcmVsb2NfdHlwZTsKLQkgICAgICBleHByZXNzaW9uUyBleHB0bXA7Ci0JICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotCi0JICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoaXMgb3BlcmFuZC4KLQkJIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IHVzZSBhIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBmb3IKLQkJIG9wZXJhbmRzIHJlc2lkaW5nIGluIHRoZSBpbnNuLCBidXQgaW5zdGVhZCBqdXN0IHVzZSB0aGUKLQkJIG9wZXJhbmQgaW5kZXguICBUaGlzIGxldHMgdXMgZWFzaWx5IGhhbmRsZSBmaXh1cHMgZm9yIGFueQotCQkgb3BlcmFuZCB0eXBlLCBhbHRob3VnaCB0aGF0IGlzIGFkbWl0dGVkbHkgbm90IGEgdmVyeSBleGNpdGluZwotCQkgZmVhdHVyZS4gIFdlIHBpY2sgYSBCRkQgcmVsb2MgdHlwZSBpbiBtZF9hcHBseV9maXguCi0KLQkJIExpbW0gdmFsdWVzICg0IGJ5dGUgaW1tZWRpYXRlICJjb25zdGFudHMiKSBtdXN0IGJlIHRyZWF0ZWQKLQkJIG5vcm1hbGx5IGJlY2F1c2UgdGhleSdyZSBub3QgcGFydCBvZiB0aGUgYWN0dWFsIGluc24gd29yZAotCQkgYW5kIHRodXMgdGhlIGluc2VydGlvbiByb3V0aW5lcyBkb24ndCBoYW5kbGUgdGhlbS4gICovCi0KLQkgICAgICBpZiAoYXJjX29wZXJhbmRzW2ZpeHVwc1tpXS5vcGluZGV4XS5mbGFncyAmIEFSQ19PUEVSQU5EX0xJTU0pCi0JCXsKLQkJICBvcF90eXBlID0gZml4dXBzW2ldLm9waW5kZXg7Ci0JCSAgLyogRklYTUU6IGNhbiB3ZSBhZGQgdGhpcyBkYXRhIHRvIHRoZSBvcGVyYW5kIHRhYmxlPyAgKi8KLQkJICBpZiAob3BfdHlwZSA9PSBhcmNfb3BlcmFuZF9tYXBbJ0wnXSkKLQkJICAgIHJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfMzI7Ci0JCSAgZWxzZSBpZiAob3BfdHlwZSA9PSBhcmNfb3BlcmFuZF9tYXBbJ0onXSkKLQkJICAgIHJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfQVJDX0IyNjsKLQkJICBlbHNlCi0JCSAgICBhYm9ydCAoKTsKLQkJICByZWxvY190eXBlID0gZ2V0X2FyY19leHBfcmVsb2NfdHlwZSAoMSwgcmVsb2NfdHlwZSwKLQkJCQkJCSAgICAgICAmZml4dXBzW2ldLmV4cCwKLQkJCQkJCSAgICAgICAmZXhwdG1wKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIG9wX3R5cGUgPSBnZXRfYXJjX2V4cF9yZWxvY190eXBlICgwLCBmaXh1cHNbaV0ub3BpbmRleCwKLQkJCQkJCSAgICAmZml4dXBzW2ldLmV4cCwgJmV4cHRtcCk7Ci0JCSAgcmVsb2NfdHlwZSA9IG9wX3R5cGUgKyAoaW50KSBCRkRfUkVMT0NfVU5VU0VEOwotCQl9Ci0JICAgICAgb3BlcmFuZCA9ICZhcmNfb3BlcmFuZHNbb3BfdHlwZV07Ci0JICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkJICAgKChmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpCi0JCQkgICAgKyAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9MSU1NID8gNCA6IDApKSwgNCwKLQkJCSAgICZleHB0bXAsCi0JCQkgICAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9SRUxBVElWRV9CUkFOQ0gpICE9IDAsCi0JCQkgICAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSByZWxvY190eXBlKTsKLQkgICAgfQotCi0JICAvKiBBbGwgZG9uZS4gICovCi0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBUcnkgdGhlIG5leHQgZW50cnkuICAqLwotICAgIH0KLQotICBhc19iYWQgKF8oImJhZCBpbnN0cnVjdGlvbiBgJXMnIiksIHN0YXJ0KTsKLX0KLQwKLS8qID8/PyBUaGlzIHdhcyBjb3BpZWQgZnJvbSB0Yy1zcGFyYy5jLCBJIHRoaW5rLiAgSXMgaXQgbmVjZXNzYXJ5PyAgKi8KLQotc3RhdGljIHZvaWQKLWFyY19jb21tb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpwOwotICBpbnQgdGVtcCwgc2l6ZTsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7CQkvKiBza2lwICcsJyAqLwotICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLkNPTU1vbiBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIiksIHRlbXApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHNpemUgPSB0ZW1wOwotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImlnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9IDApCi0gICAgewotICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSBzaXplKQotCXsKLQkgIGFzX3dhcm4gKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVkLiIpLAotCQkgICBTX0dFVF9OQU1FIChzeW1ib2xQKSwgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwgc2l6ZSk7Ci0JfQotICAgIH0KLSAgYXNzZXJ0IChzeW1ib2xQLT5zeV9mcmFnID09ICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImV4cGVjdGVkIGNvbW1hIGFmdGVyIGNvbW1vbiBsZW5ndGgiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotICAgIHsKLSAgICAgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmICh0ZW1wIDwgMCkKLQl7Ci0JICB0ZW1wID0gMDsKLQkgIGFzX3dhcm4gKF8oIkNvbW1vbiBhbGlnbm1lbnQgbmVnYXRpdmU7IDAgYXNzdW1lZCIpKTsKLQl9Ci0gICAgICBpZiAoc3ltYm9sUC0+bG9jYWwpCi0JewotCSAgc2VnVCBvbGRfc2VjOwotCSAgaW50IG9sZF9zdWJzZWM7Ci0JICBjaGFyICpwOwotCSAgaW50IGFsaWduOwotCi0JYWxsb2NhdGVfYnNzOgotCSAgb2xkX3NlYyA9IG5vd19zZWc7Ci0JICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKLQkgIGFsaWduID0gdGVtcDsKLQkgIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCBhbGlnbik7Ci0JICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMCk7Ci0JICBpZiAoYWxpZ24pCi0JICAgIGZyYWdfYWxpZ24gKGFsaWduLCAwLCAwKTsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VjdGlvbikKLQkgICAgc3ltYm9sUC0+c3lfZnJhZy0+ZnJfc3ltYm9sID0gMDsKLQkgIHN5bWJvbFAtPnN5X2ZyYWcgPSBmcmFnX25vdzsKLQkgIHAgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBzeW1ib2xQLAotCQkJKG9mZnNldFQpIHNpemUsIChjaGFyICopIDApOwotCSAgKnAgPSAwOwotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYnNzX3NlY3Rpb24pOwotCSAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICBzdWJzZWdfc2V0IChvbGRfc2VjLCBvbGRfc3Vic2VjKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCWFsbG9jYXRlX2NvbW1vbjoKLQkgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBzaXplKTsKLQkgIFNfU0VUX0FMSUdOIChzeW1ib2xQLCB0ZW1wKTsKLQkgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJmZF9jb21fc2VjdGlvbl9wdHIpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIC8qID8/PyBTb21lIHNheSBkYXRhLCBzb21lIHNheSBic3MuICAqLwotICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIi5ic3NcIiIsIDUpCi0JICAmJiBzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIuZGF0YVwiIiwgNikpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0JICBnb3RvIGJhZF9jb21tb25fc2VnbWVudDsKLQl9Ci0gICAgICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICciJykKLQk7Ci0gICAgICBnb3RvIGFsbG9jYXRlX2NvbW1vbjsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHJldHVybjsKLQotICB7Ci0gIGJhZF9jb21tb25fc2VnbWVudDoKLSAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnXG4nKQotICAgICAgcCsrOwotICAgIGMgPSAqcDsKLSAgICAqcCA9ICdcMCc7Ci0gICAgYXNfYmFkIChfKCJiYWQgLmNvbW1vbiBzZWdtZW50ICVzIiksIGlucHV0X2xpbmVfcG9pbnRlciArIDEpOwotICAgICpwID0gYzsKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLS8qIFNlbGVjdCB0aGUgY3B1IHdlJ3JlIGFzc2VtYmxpbmcgZm9yLiAgKi8KLQotc3RhdGljIHZvaWQKLWFyY19jcHUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IG1hY2g7Ci0gIGNoYXIgYzsKLSAgY2hhciAqY3B1OwotCi0gIC8qIElmIGFuIGluc3RydWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gc2VlbiwgaXQncyB0b28gbGF0ZS4gICovCi0gIGlmIChjcHVfdGFibGVzX2luaXRfcCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi5jcHUgY29tbWFuZCBtdXN0IGFwcGVhciBiZWZvcmUgYW55IGluc3RydWN0aW9ucyIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGNwdSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBtYWNoID0gYXJjX2dldF9tYWNoIChjcHUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgaWYgKG1hY2ggPT0gLTEpCi0gICAgZ290byBiYWRfY3B1OwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgLyogVGhlIGNwdSBtYXkgaGF2ZSBiZWVuIHNlbGVjdGVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgIFRoZSBjaG9pY2VzIG11c3QgbWF0Y2guICAqLwotICAvKiA/Pz8gVGhpcyB3YXMgYSBjb21tYW5kIGxpbmUgb3B0aW9uIGVhcmx5IG9uLiAgSXQncyBnb25lIG5vdywgYnV0Ci0gICAgIGxlYXZlIHRoaXMgaW4uICAqLwotICBpZiAobWFjaF90eXBlX3NwZWNpZmllZF9wICYmIG1hY2ggIT0gYXJjX21hY2hfdHlwZSkKLSAgICBhc19iYWQgKF8oIi5jcHUgY29uZmxpY3RzIHdpdGggcHJldmlvdXMgdmFsdWUiKSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhcmNfbWFjaF90eXBlID0gbWFjaDsKLSAgICAgIG1hY2hfdHlwZV9zcGVjaWZpZWRfcCA9IDE7Ci0gICAgICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2FyYywgbWFjaCkpCi0JYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0gICAgfQotICByZXR1cm47Ci0KLSBiYWRfY3B1OgotICBhc19iYWQgKF8oImJhZCAuY3B1IG9wIikpOwotICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotfQotCi0jaWYgMAotLyogVGhlIC5yZW5hbWUgcHNldWRvLW9wLiAgVGhpcyBpcyB1c2VkIGJ5IGdjYyB0byBpbXBsZW1lbnQKLSAgIC1tbWFuZ2xlLWNwdS1saWJnY2MuICAqLwotCi1zdGF0aWMgdm9pZAotYXJjX3JlbmFtZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lLCpuZXc7Ci0gIGNoYXIgYzsKLSAgc3ltYm9sUyAqc3ltOwotICBpbnQgbGVuOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgcmVuYW1lIHN0cmluZyIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgaWYgKCpuYW1lID09ICdcMCcpCi0gICAgewotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgc3ltYm9sIHRvIHJlbmFtZSB0byIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBuZXcgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0gIHN0cmNweSAobmV3LCBuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIHN5bS0+c3lfdGMucmVhbF9uYW1lID0gbmV3OwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0jZW5kaWYKLQwKLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAuCi0gICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLQotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotICBjaGFyICphdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJiYWQgY2FsbCB0byBtZF9hdG9mIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBXcml0ZSBhIHZhbHVlIG91dCB0byB0aGUgb2JqZWN0IGZpbGUsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZQotICAgZW5kaWFubmVzcy4gICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci0gIGVsc2UKLSAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gKi8KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpOwotCi0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi0vKiBXZSBkb24ndCBoYXZlIGFueSBmb3JtIG9mIHJlbGF4aW5nLiAgKi8KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZykKLSAgICAgZnJhZ1MgKmZyYWdwOwotICAgICBhc2VjdGlvbiAqc2VnOwotewotICBhYm9ydCAoKTsKLX0KLQotLyogQ29udmVydCBhIG1hY2hpbmUgZGVwZW5kZW50IGZyYWcuICBXZSBuZXZlciBnZW5lcmF0ZSB0aGVzZS4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFncCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBmcmFnUyAqZnJhZ3A7Ci17Ci0gIGFib3J0ICgpOwotfQotCi0vKiBQYXJzZSBhbiBvcGVyYW5kIHRoYXQgaXMgbWFjaGluZS1zcGVjaWZpYy4KLQotICAgVGhlIEFSQyBoYXMgYSBzcGVjaWFsICUtb3AgdG8gYWRqdXN0IGFkZHJlc3NlcyBzbyB0aGV5J3JlIHVzYWJsZSBpbgotICAgYnJhbmNoZXMuICBUaGUgInN0IiBpcyBzaG9ydCBmb3IgdGhlIFNUYXR1cyByZWdpc3Rlci4KLSAgID8/PyBMYXRlciBleHBhbmQgdGhpcyB0byB0YWtlIGEgZmxhZ3MgdmFsdWUgdG9vLgotCi0gICA/Pz8gV2UgY2FuJ3QgY3JlYXRlIG5ldyBleHByZXNzaW9uIHR5cGVzIHNvIHdlIG1hcCB0aGUgJS1vcCdzIG9udG8gdGhlCi0gICBleGlzdGluZyBzeW50YXguICBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgY291bGQgdXNlIHRoZSBjaG9zZW4gc3ludGF4Ci0gICB0byBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdC4gIFBlcmhhcHMgcHV0IGEgc3BlY2lhbCBjb29raWUgaW4gWF9hZGRfbnVtYmVyCi0gICB0byBtYXJrIHRoZSBleHByZXNzaW9uIGFzIHNwZWNpYWwuICAqLwotCi12b2lkIAotbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgY2hhciAqcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoKnAgPT0gJyUnICYmIHN0cm5jbXAgKHAsICIlc3QoIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNDsKLSAgICAgIGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcpJykKLQl7Ci0JICBhc19iYWQgKF8oIm1pc3NpbmcgJyknIGluICUtb3AiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19zeW1ib2wKLQkgICYmIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPT0gMAotCSAgLyogSSB0aGluayB0aGlzIHRlc3QgaXMgdW5uZWNlc3NhcnkgYnV0IGp1c3QgYXMgYSBzYW5pdHkgY2hlY2suLi4gKi8KLQkgICYmIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9PSBOVUxMKQotCXsKLQkgIGV4cHJlc3Npb25TIHR3bzsKLQotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JpZ2h0X3NoaWZ0OwotCSAgdHdvLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgdHdvLlhfYWRkX3N5bWJvbCA9IHR3by5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JICB0d28uWF9hZGRfbnVtYmVyID0gMjsKLQkgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKCZ0d28pOwotCX0KLSAgICAgIC8qIGFsbG93ICVzdChzeW0xLXN5bTIpICovCi0gICAgICBlbHNlIGlmIChleHByZXNzaW9uUC0+WF9vcCA9PSBPX3N1YnRyYWN0Ci0JICAgICAgICYmIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgIT0gTlVMTAotCSAgICAgICAmJiBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgIT0gTlVMTAotCSAgICAgICAmJiBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID09IDApCi0JewotCSAgZXhwcmVzc2lvblMgdHdvOwotCi0JICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAoZXhwcmVzc2lvblApOwotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JpZ2h0X3NoaWZ0OwotCSAgdHdvLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgdHdvLlhfYWRkX3N5bWJvbCA9IHR3by5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JICB0d28uWF9hZGRfbnVtYmVyID0gMjsKLQkgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKCZ0d28pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXggZm9yICUlc3QiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuCi0gICBXZSBjb3VsZCBjYXRjaCByZWdpc3RlciBuYW1lcyBoZXJlLCBidXQgdGhhdCBpcyBoYW5kbGVkIGJ5IGluc2VydGluZwotICAgdGhlbSBhbGwgaW4gdGhlIHN5bWJvbCB0YWJsZSB0byBiZWdpbiB3aXRoLiAgKi8KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBjb25jZXJuaW5nIGV4cHJlc3Npb25zLiAgKi8KLQotLyogUGFyc2UgYSAuYnl0ZSwgLndvcmQsIGV0Yy4gZXhwcmVzc2lvbi4KLQotICAgVmFsdWVzIGZvciB0aGUgc3RhdHVzIHJlZ2lzdGVyIGFyZSBzcGVjaWZpZWQgd2l0aCAlc3QobGFiZWwpLgotICAgYGxhYmVsJyB3aWxsIGJlIHJpZ2h0IHNoaWZ0ZWQgYnkgMi4gICovCi0KLXZvaWQKLWFyY19wYXJzZV9jb25zX2V4cHJlc3Npb24gKGV4cCwgbmJ5dGVzKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICBpbnQgbmJ5dGVzOwotewotICBleHByICgwLCBleHApOwotfQotCi0vKiBSZWNvcmQgYSBmaXh1cCBmb3IgYSBjb25zIGV4cHJlc3Npb24uICAqLwotCi12b2lkCi1hcmNfY29uc19maXhfbmV3IChmcmFnLCB3aGVyZSwgbmJ5dGVzLCBleHApCi0gICAgIGZyYWdTICpmcmFnOwotICAgICBpbnQgd2hlcmU7Ci0gICAgIGludCBuYnl0ZXM7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIGlmIChuYnl0ZXMgPT0gNCkKLSAgICB7Ci0gICAgICBpbnQgcmVsb2NfdHlwZTsKLSAgICAgIGV4cHJlc3Npb25TIGV4cHRtcDsKLQotICAgICAgLyogVGhpcyBtYXkgYmUgYSBzcGVjaWFsIEFSQyByZWxvYyAoZWc6ICVzdCgpKS4gICovCi0gICAgICByZWxvY190eXBlID0gZ2V0X2FyY19leHBfcmVsb2NfdHlwZSAoMSwgQkZEX1JFTE9DXzMyLCBleHAsICZleHB0bXApOwotICAgICAgZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBuYnl0ZXMsICZleHB0bXAsIDAsIHJlbG9jX3R5cGUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgbmJ5dGVzLCBleHAsIDAsCi0JCSAgIG5ieXRlcyA9PSAyID8gQkZEX1JFTE9DXzE2Ci0JCSAgIDogbmJ5dGVzID09IDggPyBCRkRfUkVMT0NfNjQKLQkJICAgOiBCRkRfUkVMT0NfMzIpOwotICAgIH0KLX0KLQwKLS8qIEZ1bmN0aW9ucyBjb25jZXJuaW5nIHJlbG9jcy4gICovCi0KLS8qIFRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIGEgUEMgcmVsYXRpdmUganVtcCBzaG91bGQgYmUgY2FsY3VsYXRlZCwKLSAgIGdpdmVuIGEgUEMgcmVsYXRpdmUgcmVsb2MuICAqLwotCi1sb25nIAotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmICEgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgLyogVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuICBMZXQgdGhlIGxpbmtlciBmaWd1cmUgaXQgb3V0LiAgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGRlbGF5IHNsb3QuICAqLwotICByZXR1cm4gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+Znhfc2l6ZTsKLX0KLQotLyogQ29tcHV0ZSB0aGUgcmVsb2MgdHlwZSBvZiBhbiBleHByZXNzaW9uLgotICAgVGhlIHBvc3NpYmx5IG1vZGlmaWVkIGV4cHJlc3Npb24gaXMgc3RvcmVkIGluIEVYUE5FVy4KLQotICAgVGhpcyBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIGV4cHJlc3Npb25zIGdlbmVyYXRlZCBieSB0aGUgJS1vcCdzIGludG8KLSAgIHRoZSBhcHByb3ByaWF0ZSBvcGVyYW5kIHR5cGUuICBJdCBpcyBjYWxsZWQgZm9yIGJvdGggZGF0YSBpbiBpbnN0cnVjdGlvbnMKLSAgIChvcGVyYW5kcykgYW5kIGRhdGEgb3V0c2lkZSBpbnN0cnVjdGlvbnMgKHZhcmlhYmxlcywgZGVidWdnaW5nIGluZm8sIGV0Yy4pLgotCi0gICBDdXJyZW50bHkgc3VwcG9ydGVkICUtb3BzOgotCi0gICAlc3Qoc3ltYm9sKTogcmVwcmVzZW50ZWQgYXMgInN5bWJvbCA+PiAyIgotICAgICAgICAgICAgICAgICJzdCIgaXMgc2hvcnQgZm9yIFNUYXR1cyBhcyBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyIChwYykKLQotICAgREVGQVVMVF9UWVBFIGlzIHRoZSB0eXBlIHRvIHVzZSBpZiBubyBzcGVjaWFsIHByb2Nlc3NpbmcgaXMgcmVxdWlyZWQuCi0KLSAgIERBVEFfUCBpcyBub24temVybyBmb3IgZGF0YSBvciBsaW1tIHZhbHVlcywgemVybyBmb3IgaW5zbiBvcGVyYW5kcy4KLSAgIFJlbWVtYmVyIHRoYXQgdGhlIG9wY29kZSAiaW5zZXJ0aW9uIGZucyIgY2Fubm90IGJlIHVzZWQgb24gZGF0YSwgdGhleSdyZQotICAgb25seSBmb3IgaW5zZXJ0aW5nIG9wZXJhbmRzIGludG8gaW5zbnMuICBUaGV5IGFsc28gY2FuJ3QgYmUgdXNlZCBmb3IgbGltbQotICAgdmFsdWVzIGFzIHRoZSBpbnNlcnRpb24gcm91dGluZXMgZG9uJ3QgaGFuZGxlIGxpbW0gdmFsdWVzLiAgV2hlbiBjYWxsZWQgZm9yCi0gICBpbnNucyB3ZSByZXR1cm4gZnVkZ2VkIHJlbG9jIHR5cGVzIChyZWFsX3ZhbHVlIC0gQkZEX1JFTE9DX1VOVVNFRCkuICBXaGVuCi0gICBjYWxsZWQgZm9yIGRhdGEgb3IgbGltbSB2YWx1ZXMgd2UgdXNlIHJlYWwgcmVsb2MgdHlwZXMuICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfYXJjX2V4cF9yZWxvY190eXBlIChkYXRhX3AsIGRlZmF1bHRfdHlwZSwgZXhwLCBleHBuZXcpCi0gICAgIGludCBkYXRhX3A7Ci0gICAgIGludCBkZWZhdWx0X3R5cGU7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIGV4cHJlc3Npb25TICpleHBuZXc7Ci17Ci0gIC8qIElmIHRoZSBleHByZXNzaW9uIGlzICJzeW1ib2wgPj4gMiIgd2UgbXVzdCBjaGFuZ2UgaXQgdG8ganVzdCAic3ltYm9sIiwKLSAgICAgYXMgZml4X25ld19leHAgY2FuJ3QgaGFuZGxlIGl0LiAgU2ltaWxhcmlseSBmb3IgKHN5bWJvbCAtIHN5bWJvbCkgPj4gMi4KLSAgICAgVGhhdCdzIG9rIHRob3VnaC4gIFdoYXQncyByZWFsbHkgZ29pbmcgb24gaGVyZSBpcyB0aGF0IHdlJ3JlIHVzaW5nCi0gICAgICI+PiAyIiBhcyBhIHNwZWNpYWwgc3ludGF4IGZvciBzcGVjaWZ5aW5nIEJGRF9SRUxPQ19BUkNfQjI2LiAgKi8KLQotICBpZiAoZXhwLT5YX29wID09IE9fcmlnaHRfc2hpZnQKLSAgICAgICYmIGV4cC0+WF9vcF9zeW1ib2wgIT0gTlVMTAotICAgICAgJiYgZXhwLT5YX29wX3N5bWJvbC0+c3lfdmFsdWUuWF9vcCA9PSBPX2NvbnN0YW50Ci0gICAgICAmJiBleHAtPlhfb3Bfc3ltYm9sLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIgPT0gMgotICAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZXhwLT5YX2FkZF9zeW1ib2wgIT0gTlVMTAotCSAgJiYgKGV4cC0+WF9hZGRfc3ltYm9sLT5zeV92YWx1ZS5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICB8fCBleHAtPlhfYWRkX3N5bWJvbC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbCkpCi0JewotCSAgKmV4cG5ldyA9ICpleHA7Ci0JICBleHBuZXctPlhfb3AgPSBPX3N5bWJvbDsKLQkgIGV4cG5ldy0+WF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgcmV0dXJuIGRhdGFfcCA/IEJGRF9SRUxPQ19BUkNfQjI2IDogYXJjX29wZXJhbmRfbWFwWydKJ107Ci0JfQotICAgICAgZWxzZSBpZiAoZXhwLT5YX2FkZF9zeW1ib2wgIT0gTlVMTAotCSAgICAgICAmJiBleHAtPlhfYWRkX3N5bWJvbC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N1YnRyYWN0KQotCXsKLQkgICpleHBuZXcgPSBleHAtPlhfYWRkX3N5bWJvbC0+c3lfdmFsdWU7Ci0JICByZXR1cm4gZGF0YV9wID8gQkZEX1JFTE9DX0FSQ19CMjYgOiBhcmNfb3BlcmFuZF9tYXBbJ0onXTsKLQl9Ci0gICAgfQotCi0gICpleHBuZXcgPSAqZXhwOwotICByZXR1cm4gZGVmYXVsdF90eXBlOwotfQotCi0vKiBBcHBseSBhIGZpeHVwIHRvIHRoZSBvYmplY3QgY29kZS4gIFRoaXMgaXMgY2FsbGVkIGZvciBhbGwgdGhlCi0gICBmaXh1cHMgd2UgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsIHRvIGZpeF9uZXdfZXhwLCBhYm92ZS4gIEluIHRoZSBjYWxsCi0gICBhYm92ZSB3ZSB1c2VkIGEgcmVsb2MgY29kZSB3aGljaCB3YXMgdGhlIGxhcmdlc3QgbGVnYWwgcmVsb2MgY29kZQotICAgcGx1cyB0aGUgb3BlcmFuZCBpbmRleC4gIEhlcmUgd2UgdW5kbyB0aGF0IHRvIHJlY292ZXIgdGhlIG9wZXJhbmQKLSAgIGluZGV4LiAgQXQgdGhpcyBwb2ludCBhbGwgc3ltYm9sIHZhbHVlcyBzaG91bGQgYmUgZnVsbHkgcmVzb2x2ZWQsCi0gICBhbmQgd2UgYXR0ZW1wdCB0byBjb21wbGV0ZWx5IHJlc29sdmUgdGhlIHJlbG9jLiAgSWYgd2UgY2FuIG5vdCBkbwotICAgdGhhdCwgd2UgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHJlbG9jIGNvZGUgYW5kIHB1dCBpdCBiYWNrIGluIHRoZSBmaXh1cC4gICovCi0KLWludAotbWRfYXBwbHlfZml4MyAoZml4UCwgdmFsdWVQLCBzZWcpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFsdWVQOwotICAgICBzZWdUIHNlZzsKLXsKLSAgLypjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ki8KLSAgdmFsdWVUIHZhbHVlOwotCi0gIC8qIEZJWE1FIEZJWE1FIEZJWE1FOiBUaGUgdmFsdWUgd2UgYXJlIHBhc3NlZCBpbiAqdmFsdWVQIGluY2x1ZGVzCi0gICAgIHRoZSBzeW1ib2wgdmFsdWVzLiAgU2luY2Ugd2UgYXJlIHVzaW5nIEJGRF9BU1NFTUJMRVIsIGlmIHdlIGFyZQotICAgICBkb2luZyB0aGlzIHJlbG9jYXRpb24gdGhlIGNvZGUgaW4gd3JpdGUuYyBpcyBnb2luZyB0byBjYWxsCi0gICAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIHdoaWNoIGlzIGFsc28gZ29pbmcgdG8gdXNlIHRoZSBzeW1ib2wKLSAgICAgdmFsdWUuICBUaGF0IG1lYW5zIHRoYXQgaWYgdGhlIHJlbG9jIGlzIGZ1bGx5IHJlc29sdmVkIHdlIHdhbnQgdG8KLSAgICAgdXNlICp2YWx1ZVAgc2luY2UgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBpcyBub3QgYmVpbmcgdXNlZC4KLSAgICAgSG93ZXZlciwgaWYgdGhlIHJlbG9jIGlzIG5vdCBmdWxseSByZXNvbHZlZCB3ZSBkbyBub3Qgd2FudCB0byB1c2UKLSAgICAgKnZhbHVlUCwgYW5kIG11c3QgdXNlIGZ4X29mZnNldCBpbnN0ZWFkLiAgSG93ZXZlciwgaWYgdGhlIHJlbG9jCi0gICAgIGlzIFBDIHJlbGF0aXZlLCB3ZSBkbyB3YW50IHRvIHVzZSAqdmFsdWVQIHNpbmNlIGl0IGluY2x1ZGVzIHRoZQotICAgICByZXN1bHQgb2YgbWRfcGNyZWxfZnJvbS4gIFRoaXMgaXMgY29uZnVzaW5nLiAgKi8KLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICp2YWx1ZVA7Ci0gICAgICBmaXhQLT5meF9kb25lID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeFAtPmZ4X3BjcmVsKQotICAgIHsKLSAgICAgIHZhbHVlID0gKnZhbHVlUDsKLSAgICAgIC8qIEVMRiByZWxvY2F0aW9ucyBhcmUgYWdhaW5zdCBzeW1ib2xzLgotCSBJZiB0aGlzIHN5bWJvbCBpcyBpbiBhIGRpZmZlcmVudCBzZWN0aW9uIHRoZW4gd2UgbmVlZCB0byBsZWF2ZSBpdCBmb3IKLQkgdGhlIGxpbmtlciB0byBkZWFsIHdpdGguICBVbmZvcnR1bmF0ZWx5LCBtZF9wY3JlbF9mcm9tIGNhbid0IHRlbGwsCi0JIHNvIHdlIGhhdmUgdG8gdW5kbyBpdCdzIGVmZmVjdHMgaGVyZS4gICovCi0gICAgICBpZiAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWcpCi0JdmFsdWUgKz0gbWRfcGNyZWxfZnJvbSAoZml4UCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBmaXhQLT5meF9vZmZzZXQ7Ci0gICAgICBpZiAoZml4UC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoZml4UC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9zdWJzeSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBjYW4ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICAgXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKChpbnQpIGZpeFAtPmZ4X3JfdHlwZSA+PSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIGludCBvcGluZGV4OwotICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICAgY2hhciAqd2hlcmU7Ci0gICAgICBhcmNfaW5zbiBpbnNuOwotCi0gICAgICBvcGluZGV4ID0gKGludCkgZml4UC0+Znhfcl90eXBlIC0gKGludCkgQkZEX1JFTE9DX1VOVVNFRDsKLQotICAgICAgb3BlcmFuZCA9ICZhcmNfb3BlcmFuZHNbb3BpbmRleF07Ci0KLSAgICAgIC8qIEZldGNoIHRoZSBpbnN0cnVjdGlvbiwgaW5zZXJ0IHRoZSBmdWxseSByZXNvbHZlZCBvcGVyYW5kCi0JIHZhbHVlLCBhbmQgc3R1ZmYgdGhlIGluc3RydWN0aW9uIGJhY2sgYWdhaW4uICAqLwotICAgICAgd2hlcmUgPSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JaW5zbiA9IGJmZF9nZXRiMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGVsc2UKLQlpbnNuID0gYmZkX2dldGwzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgaW5zbiA9IGFyY19pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgLTEsIE5VTEwsIChvZmZzZXRUKSB2YWx1ZSwKLQkJCQkgZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSk7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotCi0gICAgICBpZiAoZml4UC0+ZnhfZG9uZSkKLQl7Ci0JICAvKiBOb3RoaW5nIGVsc2UgdG8gZG8gaGVyZS4gICovCi0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIC8qIERldGVybWluZSBhIEJGRCByZWxvYyB2YWx1ZSBiYXNlZCBvbiB0aGUgb3BlcmFuZCBpbmZvcm1hdGlvbi4KLQkgV2UgYXJlIG9ubHkgcHJlcGFyZWQgdG8gdHVybiBhIGZldyBvZiB0aGUgb3BlcmFuZHMgaW50byByZWxvY3MuCi0JICEhISBOb3RlIHRoYXQgd2UgY2FuJ3QgaGFuZGxlIGxpbW0gdmFsdWVzIGhlcmUuICBTaW5jZSB3ZSdyZSB1c2luZwotCSBpbXBsaWNpdCBhZGRlbmRzIHRoZSBhZGRlbmQgbXVzdCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBpbnN0cnVjdGlvbiwKLQkgaG93ZXZlciwgdGhlIG9wY29kZSBpbnNlcnRpb24gcm91dGluZXMgY3VycmVudGx5IGRvIG5vdGhpbmcgd2l0aAotCSBsaW1tIHZhbHVlcy4gICovCi0gICAgICBpZiAob3BlcmFuZC0+Zm10ID09ICdCJykKLQl7Ci0JICBhc3NlcnQgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1JFTEFUSVZFX0JSQU5DSCkgIT0gMAotCQkgICYmIG9wZXJhbmQtPmJpdHMgPT0gMjAKLQkJICAmJiBvcGVyYW5kLT5zaGlmdCA9PSA3KTsKLQkgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19BUkNfQjIyX1BDUkVMOwotCX0KLSAgICAgIGVsc2UgaWYgKDAgJiYgb3BlcmFuZC0+Zm10ID09ICdKJykKLQl7Ci0JICBhc3NlcnQgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX0FCU09MVVRFX0JSQU5DSCkgIT0gMAotCQkgICYmIG9wZXJhbmQtPmJpdHMgPT0gMjQKLQkJICAmJiBvcGVyYW5kLT5zaGlmdCA9PSAzMik7Ci0JICBmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfQVJDX0IyNjsKLQl9Ci0gICAgICBlbHNlIGlmICgwICYmIG9wZXJhbmQtPmZtdCA9PSAnTCcpCi0JewotCSAgYXNzZXJ0ICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9MSU1NKSAhPSAwCi0JCSAgJiYgb3BlcmFuZC0+Yml0cyA9PSAzMgotCQkgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDMyKTsKLQkgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18zMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygidW5yZXNvbHZlZCBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSByZXNvbHZlZCIpKTsKLQkgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotCXsKLQljYXNlIEJGRF9SRUxPQ184OgotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmUsCi0JCQkgICAgICB2YWx1ZSwgMSk7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ18xNjoKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUsIDIpOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfMzI6Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZSwKLQkJCSAgICAgIHZhbHVlLCA0KTsKLQkgIGJyZWFrOwotI2lmIDAKLQljYXNlIEJGRF9SRUxPQ182NDoKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUsIDgpOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQljYXNlIEJGRF9SRUxPQ19BUkNfQjI2OgotCSAgLyogSWYgIWZpeFAtPmZ4X2RvbmUgdGhlbiBgdmFsdWUnIGlzIGFuIGltcGxpY2l0IGFkZGVuZC4KLQkgICAgIFdlIG11c3Qgc2hpZnQgaXQgcmlnaHQgYnkgMiBpbiB0aGlzIGNhc2UgYXMgd2VsbCBiZWNhdXNlIHRoZQotCSAgICAgbGlua2VyIHBlcmZvcm1zIHRoZSByZWxvY2F0aW9uIGFuZCB0aGVuIGFkZHMgdGhpcyBpbiAoYXMgb3Bwb3NlZAotCSAgICAgdG8gYWRkaW5nIHRoaXMgaW4gYW5kIHRoZW4gc2hpZnRpbmcgcmlnaHQgYnkgMikuICAqLwotCSAgdmFsdWUgPj49IDI7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZSwKLQkJCSAgICAgIHZhbHVlLCA0KTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbHVlOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBUcmFuc2xhdGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvIHRvIEJGRCB0YXJnZXQKLSAgIGZvcm1hdC4gICovCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhQKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAmZml4UC0+ZnhfYWRkc3ktPmJzeW07Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlOwotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4UC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgIF8oImludGVybmFsIGVycm9yOiBjYW4ndCBleHBvcnQgcmVsb2MgdHlwZSAlZCAoYCVzJykiKSwKLQkJICAgIGZpeFAtPmZ4X3JfdHlwZSwgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeFAtPmZ4X3JfdHlwZSkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGFzc2VydCAoIWZpeFAtPmZ4X3BjcmVsID09ICFyZWxvYy0+aG93dG8tPnBjX3JlbGF0aXZlKTsKLQotICByZWxvYy0+YWRkZW5kID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotCi0gIHJldHVybiByZWxvYzsKLX0KLQwKLS8qIEZyb2JiZXJzLiAgKi8KLQotI2lmIDAKLS8qIFNldCB0aGUgcmVhbCBuYW1lIGlmIHRoZSAucmVuYW1lIHBzZXVkby1vcCB3YXMgdXNlZC4KLSAgIFJldHVybiAxIGlmIHRoZSBzeW1ib2wgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotaW50Ci1hcmNfZnJvYl9zeW1ib2wgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBpZiAoc3ltLT5zeV90Yy5yZWFsX25hbWUgIT0gKGNoYXIgKikgTlVMTCkKLSAgICBTX1NFVF9OQU1FIChzeW0sIHN5bS0+c3lfdGMucmVhbF9uYW1lKTsKLQotICByZXR1cm4gMDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1hcmMuaCBiL2dhcy9jb25maWcvdGMtYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOTVmZjQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1hcmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qIHRjLWFyYy5oIC0gTWFjcm9zIGFuZCB0eXBlIGRlZmluZXMgZm9yIHRoZSBBUkMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zIChkamVAY3lnbnVzLmNvbSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKLSAgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19BUkMgMQotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX2FyYwotCi0jZGVmaW5lIExJVFRMRV9FTkRJQU4gICAxMjM0Ci0jZGVmaW5lIEJJR19FTkRJQU4gICAgICA0MzIxCi0KLS8qIFRoZSBlbmRpYW5uZXNzIG9mIHRoZSB0YXJnZXQgZm9ybWF0IG1heSBjaGFuZ2UgYmFzZWQgb24gY29tbWFuZAotICAgbGluZSBhcmd1bWVudHMuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFyY190YXJnZXRfZm9ybWF0OwotI2RlZmluZSBERUZBVUxUX1RBUkdFVF9GT1JNQVQgImVsZjMyLWxpdHRsZWFyYyIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCBhcmNfdGFyZ2V0X2Zvcm1hdAotI2RlZmluZSBERUZBVUxUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiQVJDIEdBUyAiCi0KLSNkZWZpbmUgVENfSEFORExFU19GWF9ET05FCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotCi0vKiBUaGUgQVJDIG5lZWRzIHRvIHBhcnNlIHJlbG9jIHNwZWNpZmllcnMgaW4gLndvcmQuICAqLwotCi1leHRlcm4gdm9pZCBhcmNfcGFyc2VfY29uc19leHByZXNzaW9uICgpOwotI2RlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04oRVhQLCBOQllURVMpIFwKLWFyY19wYXJzZV9jb25zX2V4cHJlc3Npb24gKEVYUCwgTkJZVEVTKQotCi1leHRlcm4gdm9pZCBhcmNfY29uc19maXhfbmV3ICgpOwotI2RlZmluZSBUQ19DT05TX0ZJWF9ORVcoRlJBRywgV0hFUkUsIE5CWVRFUywgRVhQKSBcCi1hcmNfY29uc19maXhfbmV3IChGUkFHLCBXSEVSRSwgTkJZVEVTLCBFWFApCi0KLSNpZiAwCi0vKiBFeHRyYSBzdHVmZiB0aGF0IHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBmb3IgZWFjaCBzeW1ib2wuICAqLwotc3RydWN0IGFyY190Y19zeQotewotICAvKiBUaGUgcmVhbCBuYW1lLCBpZiB0aGUgc3ltYm9sIHdhcyByZW5hbWVkLiAgKi8KLSAgY2hhciAqcmVhbF9uYW1lOwotfTsKLQotI2RlZmluZSBUQ19TWU1GSUVMRF9UWVBFIHN0cnVjdCBhcmNfdGNfc3kKLQotLyogRmluaXNoIHVwIHRoZSBzeW1ib2wuICAqLwotZXh0ZXJuIGludCBhcmNfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqKSk7Ci0jZGVmaW5lIHRjX2Zyb2Jfc3ltYm9sKHN5bSwgcHVudCkgcHVudCA9IGFyY19mcm9iX3N5bWJvbCAoc3ltKQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWFybS5jIGIvZ2FzL2NvbmZpZy90Yy1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5OGJmMC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjg1NyArMCwwIEBACi0vKiB0Yy1hcm0uYyAtLSBBc3NlbWJsZSBmb3IgdGhlIEFSTQotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0JTW9kaWZpZWQgYnkgRGF2aWQgVGF5bG9yIChkdGF5bG9yQGFybWx0ZC5jby51aykKLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZGVmaW5lICBOT19SRUxPQyAwCi0jaW5jbHVkZSAiYXMuaCIKLQotLyogbmVlZCBUQVJHRVRfQ1BVICovCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLSNpbmNsdWRlICJzeW1ib2xzLmgiCi0jaW5jbHVkZSAibGlzdGluZy5oIgotCi0jaWZkZWYgT0JKX0VMRgotI2luY2x1ZGUgImVsZi9hcm0uaCIKLSNlbmRpZgotCi0vKiBUeXBlcyBvZiBwcm9jZXNzb3IgdG8gYXNzZW1ibGUgZm9yLiAgKi8KLSNkZWZpbmUgQVJNXzEJCTB4MDAwMDAwMDEKLSNkZWZpbmUgQVJNXzIJCTB4MDAwMDAwMDIKLSNkZWZpbmUgQVJNXzMJCTB4MDAwMDAwMDQKLSNkZWZpbmUgQVJNXzI1MAkJQVJNXzMKLSNkZWZpbmUgQVJNXzYJCTB4MDAwMDAwMDgKLSNkZWZpbmUgQVJNXzcJCUFSTV82ICAgICAgICAgICAvKiBzYW1lIGNvcmUgaW5zdHJ1Y3Rpb24gc2V0ICovCi0jZGVmaW5lIEFSTV84CQlBUk1fNiAgICAgICAgICAgLyogc2FtZSBjb3JlIGluc3RydWN0aW9uIHNldCAqLwotI2RlZmluZSBBUk1fOQkJQVJNXzYgICAgICAgICAgIC8qIHNhbWUgY29yZSBpbnN0cnVjdGlvbiBzZXQgKi8KLSNkZWZpbmUgQVJNX0NQVV9NQVNLCTB4MDAwMDAwMGYKLQotLyogVGhlIGZvbGxvd2luZyBiaXRtYXNrcyBjb250cm9sIENQVSBleHRlbnNpb25zIChBUk03IG9ud2FyZHMpOiAqLwotI2RlZmluZSBBUk1fTE9OR01VTAkweDAwMDAwMDEwCS8qIGFsbG93IGxvbmcgbXVsdGlwbGllcyAqLwotI2RlZmluZSBBUk1fSEFMRldPUkQgICAgMHgwMDAwMDAyMAkvKiBhbGxvdyBoYWxmIHdvcmQgbG9hZHMgKi8KLSNkZWZpbmUgQVJNX1RIVU1CICAgICAgIDB4MDAwMDAwNDAJLyogYWxsb3cgQlggaW5zdHJ1Y3Rpb24gICovCi0KLSNkZWZpbmUgQVJNX0FSQ0h2NAkoQVJNXzcgfCBBUk1fTE9OR01VTCB8IEFSTV9IQUxGV09SRCkKLQotLyogU29tZSB1c2VmdWwgY29tYmluYXRpb25zOiAgKi8KLSNkZWZpbmUgQVJNX0FOWQkJMHgwMGZmZmZmZgotI2RlZmluZSBBUk1fMlVQCQkweDAwZmZmZmZlCi0jZGVmaW5lIEFSTV9BTEwJCUFSTV8yVVAJCS8qIE5vdCBhcm0xIG9ubHkgKi8KLSNkZWZpbmUgQVJNXzNVUAkJMHgwMGZmZmZmYwotI2RlZmluZSBBUk1fNlVQCQkweDAwZmZmZmY4ICAgICAgLyogSW5jbHVkZXMgQVJNNyAqLwotCi0jZGVmaW5lIEZQVV9DT1JFCTB4ODAwMDAwMDAKLSNkZWZpbmUgRlBVX0ZQQTEwCTB4NDAwMDAwMDAKLSNkZWZpbmUgRlBVX0ZQQTExCTB4NDAwMDAwMDAKLSNkZWZpbmUgRlBVX05PTkUJMAotCi0vKiBTb21lIHVzZWZ1bCBjb21iaW5hdGlvbnMgICovCi0jZGVmaW5lIEZQVV9BTEwJCTB4ZmYwMDAwMDAJLyogTm90ZSB0aGlzIGlzIH5BUk1fQU5ZICovCi0jZGVmaW5lIEZQVV9NRU1NVUxUSQkweDdmMDAwMDAwCS8qIE5vdCBmcHVfY29yZSAqLwotCi0gICAgIAotI2lmbmRlZiBDUFVfREVGQVVMVAotI2lmIGRlZmluZWQgX190aHVtYl9fCi0jZGVmaW5lIENQVV9ERUZBVUxUIChBUk1fQVJDSHY0IHwgQVJNX1RIVU1CKQotI2Vsc2UKLSNkZWZpbmUgQ1BVX0RFRkFVTFQgQVJNX0FMTAotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBGUFVfREVGQVVMVAotI2RlZmluZSBGUFVfREVGQVVMVCBGUFVfQUxMCi0jZW5kaWYKLQotI2RlZmluZSBzdHJlcShhLGIpICAoc3RyY21wIChhLCBiKSA9PSAwKQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwljcHVfdmFyaWFudCA9IENQVV9ERUZBVUxUIHwgRlBVX0RFRkFVTFQ7Ci1zdGF0aWMgaW50IHRhcmdldF9vYWJpID0gMDsKLQotI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCi0vKiBGbGFncyBzdG9yZWQgaW4gcHJpdmF0ZSBhcmVhIG9mIEJGRCBzdHJ1Y3R1cmUgKi8KLXN0YXRpYyBib29sZWFuCQl1c2VzX2FwY3NfMjYgPSBmYWxzZTsKLXN0YXRpYyBib29sZWFuCQlzdXBwb3J0X2ludGVyd29yayA9IGZhbHNlOwotc3RhdGljIGJvb2xlYW4JCXVzZXNfYXBjc19mbG9hdCA9IGZhbHNlOwotc3RhdGljIGJvb2xlYW4JCXBpY19jb2RlID0gZmFsc2U7Ci0jZW5kaWYKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwgKi8KLUNPTlNUIGNoYXIgY29tbWVudF9jaGFyc1tdID0gIkAiOwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJwotICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0ICovCi0vKiBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKLSAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LiAqLwotLyogQWxzbyBub3RlIHRoYXQgY29tbWVudHMgbGlrZSB0aGlzIG9uZSB3aWxsIGFsd2F5cyB3b3JrLiAqLwotQ09OU1QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotI2lmZGVmIFRFX0xJTlVYCi1DT05TVCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci0jZWxzZQotQ09OU1QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0jZW5kaWYKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLUNPTlNUIGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi0KLUNPTlNUIGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WGVFcFAiOwotCi0vKiBQcmVmaXggY2hhcmFjdGVycyB0aGF0IGluZGljYXRlIHRoZSBzdGFydCBvZiBhbiBpbW1lZGlhdGUKLSAgIHZhbHVlLiAgKi8KLSNkZWZpbmUgaXNfaW1tZWRpYXRlX3ByZWZpeChDKSAoKEMpID09ICcjJyB8fCAoQykgPT0gJyQnKQotCi0jaWZkZWYgT0JKX0VMRgotc3ltYm9sUyAqIEdPVF9zeW1ib2w7CQkvKiBQcmUtZGVmaW5lZCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIiAqLwotI2VuZGlmCi0KLUNPTlNUIGludCBtZF9yZWxvY19zaXplID0gODsJCS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotc3RhdGljIGludCB0aHVtYl9tb2RlID0gMDsgICAgICAvKiBub24temVybyBpZiBhc3NlbWJsaW5nIHRodW1iIGluc3RydWN0aW9ucyAqLwotCi10eXBlZGVmIHN0cnVjdCBhcm1fZml4Ci17Ci0gIGludCB0aHVtYl9tb2RlOwotfSBhcm1fZml4X2RhdGE7Ci0KLXN0cnVjdCBhcm1faXQKLXsKLSAgQ09OU1QgY2hhciAqICBlcnJvcjsKLSAgdW5zaWduZWQgbG9uZyBpbnN0cnVjdGlvbjsKLSAgaW50ICAgICAgICAgICBzdWZmaXg7Ci0gIGludCAgICAgICAgICAgc2l6ZTsKLSAgc3RydWN0Ci0gICAgewotICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHR5cGU7Ci0gICAgICBleHByZXNzaW9uUyAgICAgICAgICAgICAgZXhwOwotICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHBjX3JlbDsKLSAgICB9IHJlbG9jOwotfTsKLQotc3RydWN0IGFybV9pdCBpbnN0OwotCi1zdHJ1Y3QgYXNtX3NoaWZ0Ci17Ci0gIENPTlNUIGNoYXIgKiAgdGVtcGxhdGU7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9zaGlmdCBzaGlmdFtdID0KLXsKLSAgeyJhc2wiLCAwfSwKLSAgeyJsc2wiLCAwfSwKLSAgeyJsc3IiLCAweDAwMDAwMDIwfSwKLSAgeyJhc3IiLCAweDAwMDAwMDQwfSwKLSAgeyJyb3IiLCAweDAwMDAwMDYwfSwKLSAgeyJycngiLCAweDAwMDAwMDYwfSwKLSAgeyJBU0wiLCAwfSwKLSAgeyJMU0wiLCAwfSwKLSAgeyJMU1IiLCAweDAwMDAwMDIwfSwKLSAgeyJBU1IiLCAweDAwMDAwMDQwfSwKLSAgeyJST1IiLCAweDAwMDAwMDYwfSwKLSAgeyJSUlgiLCAweDAwMDAwMDYwfQotfTsKLQotI2RlZmluZSBOT19TSElGVF9SRVNUUklDVCAxCi0jZGVmaW5lIFNISUZUX1JFU1RSSUNUCSAgMAotCi0jZGVmaW5lIE5VTV9GTE9BVF9WQUxTIDgKLQotQ09OU1QgY2hhciAqIGZwX2NvbnN0W10gPSAKLXsKLSAgIjAuMCIsICIxLjAiLCAiMi4wIiwgIjMuMCIsICI0LjAiLCAiNS4wIiwgIjAuNSIsICIxMC4wIiwgMAotfTsKLQotLyogTnVtYmVyIG9mIGxpdHRsZW51bXMgcmVxdWlyZWQgdG8gaG9sZCBhbiBleHRlbmRlZCBwcmVjaXNpb24gbnVtYmVyICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotTElUVExFTlVNX1RZUEUgZnBfdmFsdWVzW05VTV9GTE9BVF9WQUxTXVtNQVhfTElUVExFTlVNU107Ci0KLSNkZWZpbmUgRkFJTAkoLTEpCi0jZGVmaW5lIFNVQ0NFU1MgKDApCi0KLSNkZWZpbmUgU1VGRl9TIDEKLSNkZWZpbmUgU1VGRl9EIDIKLSNkZWZpbmUgU1VGRl9FIDMKLSNkZWZpbmUgU1VGRl9QIDQKLQotI2RlZmluZSBDUF9UX1ggICAweDAwMDA4MDAwCi0jZGVmaW5lIENQX1RfWSAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgQ1BfVF9QcmUgMHgwMTAwMDAwMAotI2RlZmluZSBDUF9UX1VEICAweDAwODAwMDAwCi0jZGVmaW5lIENQX1RfV0IgIDB4MDAyMDAwMDAKLQotI2RlZmluZSBDT05EU19CSVQgICAgICAgKDB4MDAxMDAwMDApCi0jZGVmaW5lIExPQURfQklUICAgICAgICAoMHgwMDEwMDAwMCkKLSNkZWZpbmUgVFJBTlNfQklUCSgweDAwMjAwMDAwKQotCi1zdHJ1Y3QgYXNtX2NvbmQKLXsKLSAgQ09OU1QgY2hhciAqICB0ZW1wbGF0ZTsKLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLX07Ci0KLS8qIFRoaXMgaXMgdG8gc2F2ZSBhIGhhc2ggbG9vay11cCBpbiB0aGUgY29tbW9uIGNhc2UgKi8KLSNkZWZpbmUgQ09ORF9BTFdBWVMgMHhlMDAwMDAwMAotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9jb25kIGNvbmRzW10gPSAKLXsKLSAgeyJlcSIsIDB4MDAwMDAwMDB9LAotICB7Im5lIiwgMHgxMDAwMDAwMH0sCi0gIHsiY3MiLCAweDIwMDAwMDAwfSwgeyJocyIsIDB4MjAwMDAwMDB9LAotICB7ImNjIiwgMHgzMDAwMDAwMH0sIHsidWwiLCAweDMwMDAwMDAwfSwgeyJsbyIsIDB4MzAwMDAwMDB9LAotICB7Im1pIiwgMHg0MDAwMDAwMH0sCi0gIHsicGwiLCAweDUwMDAwMDAwfSwKLSAgeyJ2cyIsIDB4NjAwMDAwMDB9LAotICB7InZjIiwgMHg3MDAwMDAwMH0sCi0gIHsiaGkiLCAweDgwMDAwMDAwfSwKLSAgeyJscyIsIDB4OTAwMDAwMDB9LAotICB7ImdlIiwgMHhhMDAwMDAwMH0sCi0gIHsibHQiLCAweGIwMDAwMDAwfSwKLSAgeyJndCIsIDB4YzAwMDAwMDB9LAotICB7ImxlIiwgMHhkMDAwMDAwMH0sCi0gIHsiYWwiLCAweGUwMDAwMDAwfSwKLSAgeyJudiIsIDB4ZjAwMDAwMDB9Ci19OwotCi0vKiBXYXJuaW5nOiBJZiB0aGUgdG9wIGJpdCBvZiB0aGUgc2V0X2JpdHMgaXMgc2V0LCB0aGVuIHRoZSBzdGFuZGFyZAotICAgaW5zdHJ1Y3Rpb24gYml0bWFzayBpcyBpZ25vcmVkLCBhbmQgdGhlIG5ldyBiaXRtYXNrIGlzIHRha2VuIGZyb20KLSAgIHRoZSBzZXRfYml0czogKi8KLXN0cnVjdCBhc21fZmxnCi17Ci0gIENPTlNUIGNoYXIgKiAgdGVtcGxhdGU7CS8qIEJhc2ljIGZsYWcgc3RyaW5nICovCi0gIHVuc2lnbmVkIGxvbmcgc2V0X2JpdHM7CS8qIEJpdHMgdG8gc2V0ICovCi19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgc19mbGFnW10gPQotewotICB7InMiLCBDT05EU19CSVR9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBsZHJfZmxhZ3NbXSA9Ci17Ci0gIHsiYiIsICAweDAwNDAwMDAwfSwKLSAgeyJ0IiwgIFRSQU5TX0JJVH0sCi0gIHsiYnQiLCAweDAwNDAwMDAwIHwgVFJBTlNfQklUfSwKLSAgeyJoIiwgIDB4ODAxMDAwYjB9LAotICB7InNoIiwgMHg4MDEwMDBmMH0sCi0gIHsic2IiLCAweDgwMTAwMGQwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgc3RyX2ZsYWdzW10gPQotewotICB7ImIiLCAgMHgwMDQwMDAwMH0sCi0gIHsidCIsICBUUkFOU19CSVR9LAotICB7ImJ0IiwgMHgwMDQwMDAwMCB8IFRSQU5TX0JJVH0sCi0gIHsiaCIsICAweDgwMDAwMGIwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgYnl0ZV9mbGFnW10gPQotewotICB7ImIiLCAweDAwNDAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgY21wX2ZsYWdzW10gPQotewotICB7InMiLCBDT05EU19CSVR9LAotICB7InAiLCAweDAwMTBmMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgbGRtX2ZsYWdzW10gPQotewotICB7ImVkIiwgMHgwMTgwMDAwMH0sCi0gIHsiZmQiLCAweDAwODAwMDAwfSwKLSAgeyJlYSIsIDB4MDEwMDAwMDB9LAotICB7ImZhIiwgMHgwODAwMDAwMH0sCi0gIHsiaWIiLCAweDAxODAwMDAwfSwKLSAgeyJpYSIsIDB4MDA4MDAwMDB9LAotICB7ImRiIiwgMHgwMTAwMDAwMH0sCi0gIHsiZGEiLCAweDA4MDAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgc3RtX2ZsYWdzW10gPQotewotICB7ImVkIiwgMHgwODAwMDAwMH0sCi0gIHsiZmQiLCAweDAxMDAwMDAwfSwKLSAgeyJlYSIsIDB4MDA4MDAwMDB9LAotICB7ImZhIiwgMHgwMTgwMDAwMH0sCi0gIHsiaWIiLCAweDAxODAwMDAwfSwKLSAgeyJpYSIsIDB4MDA4MDAwMDB9LAotICB7ImRiIiwgMHgwMTAwMDAwMH0sCi0gIHsiZGEiLCAweDA4MDAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgbGZtX2ZsYWdzW10gPQotewotICB7ImZkIiwgMHgwMDgwMDAwMH0sCi0gIHsiZWEiLCAweDAxMDAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgc2ZtX2ZsYWdzW10gPQotewotICB7ImZkIiwgMHgwMTAwMDAwMH0sCi0gIHsiZWEiLCAweDAwODAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgcm91bmRfZmxhZ3NbXSA9Ci17Ci0gIHsicCIsIDB4MDAwMDAwMjB9LAotICB7Im0iLCAweDAwMDAwMDQwfSwKLSAgeyJ6IiwgMHgwMDAwMDA2MH0sCi0gIHtOVUxMLCAwfQotfTsKLQotLyogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBGSVggaW5zdHJ1Y3Rpb24gaXMgYnJva2VuIG9uIHNvbWUgYXNzZW1ibGVycywKLSAgIGluIHRoYXQgaXQgYWNjZXB0cyBhIHByZWNpc2lvbiBzcGVjaWZpZXIgYXMgd2VsbCBhcyBhIHJvdW5kaW5nIHNwZWNpZmllciwKLSAgIGRlc3BpdGUgdGhlIGZhY3QgdGhhdCB0aGlzIGlzIG1lYW5pbmdsZXNzLiAgVG8gYmUgbW9yZSBjb21wYXRpYmxlLCB3ZQotICAgYWNjZXB0IGl0IGFzIHdlbGwsIHRob3VnaCBvZiBjb3Vyc2UgaXQgZG9lcyBub3Qgc2V0IGFueSBiaXRzLiAgKi8KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBmaXhfZmxhZ3NbXSA9Ci17Ci0gIHsicCIsIDB4MDAwMDAwMjB9LAotICB7Im0iLCAweDAwMDAwMDQwfSwKLSAgeyJ6IiwgMHgwMDAwMDA2MH0sCi0gIHsic3AiLCAweDAwMDAwMDIwfSwKLSAgeyJzbSIsIDB4MDAwMDAwNDB9LAotICB7InN6IiwgMHgwMDAwMDA2MH0sCi0gIHsiZHAiLCAweDAwMDAwMDIwfSwKLSAgeyJkbSIsIDB4MDAwMDAwNDB9LAotICB7ImR6IiwgMHgwMDAwMDA2MH0sCi0gIHsiZXAiLCAweDAwMDAwMDIwfSwKLSAgeyJlbSIsIDB4MDAwMDAwNDB9LAotICB7ImV6IiwgMHgwMDAwMDA2MH0sCi0gIHtOVUxMLCAwfQotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIGV4Y2VwdF9mbGFnW10gPQotewotICB7ImUiLCAweDAwNDAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgY3Bsb25nX2ZsYWdbXSA9Ci17Ci0gIHsibCIsIDB4MDA0MDAwMDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0cnVjdCBhc21fcHNyCi17Ci0gIENPTlNUIGNoYXIgKiAgdGVtcGxhdGU7Ci0gIHVuc2lnbmVkIGxvbmcgbnVtYmVyOwotfTsKLQotI2RlZmluZSBQU1JfRklFTERfTUFTSyAgMHgwMDBmMDAwMAotCi0jZGVmaW5lIFBTUl9GTEFHUwkweDAwMDgwMDAwCi0jZGVmaW5lIFBTUl9DT05UUk9MCTB4MDAwMTAwMDAgLyogVW5kb2N1bWVudGVkIGluc3RydWN0aW9uLCBpdHMgdXNlIGlzIGRpc2NvdXJhZ2VkIGJ5IEFSTSAqLwotI2RlZmluZSBQU1JfQUxMCQkweDAwMDkwMDAwCi0KLSNkZWZpbmUgQ1BTUl9BTEwJMAotI2RlZmluZSBTUFNSX0FMTAkxCi0jZGVmaW5lIENQU1JfRkxHCTIKLSNkZWZpbmUgU1BTUl9GTEcJMwotI2RlZmluZSBDUFNSX0NUTAk0Ci0jZGVmaW5lIFNQU1JfQ1RMCTUKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fcHNyIHBzcnNbXSA9Ci17Ci0gIC8qIFZhbGlkIDxwc3I+J3MgKi8KLSAgeyJjcHNyIiwJQ1BTUl9BTEx9LAotICB7ImNwc3JfYWxsIiwJQ1BTUl9BTEx9LAotICB7InNwc3IiLAlTUFNSX0FMTH0sCi0gIHsic3Bzcl9hbGwiLAlTUFNSX0FMTH0sCi0KLSAgLyogVmFsaWQgPHBzcmY+J3MgKi8KLSAgeyJjcHNyX2ZsZyIsCUNQU1JfRkxHfSwKLSAgeyJzcHNyX2ZsZyIsCVNQU1JfRkxHfSwKLSAgCi0gIC8qIFZhbGlkIDxwc3JjPidzICovCi0gIHsiY3Bzcl9jIiwJQ1BTUl9DVEx9LAotICB7ImNwc3JfY3RsIiwJQ1BTUl9DVEx9LAotICB7InNwc3JfYyIsCVNQU1JfQ1RMfSwKLSAgeyJzcHNyX2N0bCIsCVNQU1JfQ1RMfQotfTsKLQotLyogRnVuY3Rpb25zIGNhbGxlZCBieSBwYXJzZXIgKi8KLS8qIEFSTSBpbnN0cnVjdGlvbnMgKi8KLXN0YXRpYyB2b2lkIGRvX2FyaXQJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19jbXAJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19tb3YJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19sZHN0CQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fbGRtc3RtCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fYnJhbmNoCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fc3dpCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotLyogUHNldWRvIE9wIGNvZGVzICovCi1zdGF0aWMgdm9pZCBkb19hZHIJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19ub3AJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci0vKiBBUk0gMiAqLwotc3RhdGljIHZvaWQgZG9fbXVsCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fbWxhCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotLyogQVJNIDMgKi8KLXN0YXRpYyB2b2lkIGRvX3N3YXAJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci0vKiBBUk0gNiAqLwotc3RhdGljIHZvaWQgZG9fbXNyCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fbXJzCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotLyogQVJNIDdNICovCi1zdGF0aWMgdm9pZCBkb19tdWxsCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotLyogQVJNIFRIVU1CICovCi1zdGF0aWMgdm9pZCBkb19ieCAgICAgICAgICAgICAgIFBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci0KLS8qIENvcHJvY2Vzc29yIEluc3RydWN0aW9ucyAqLwotc3RhdGljIHZvaWQgZG9fY2RwCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fbHN0YwkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0YXRpYyB2b2lkIGRvX2NvX3JlZwkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX2N0cmwJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19mcF9sZHN0CQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fZnBfbGRtc3RtCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19mcF9keWFkaWMJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX21vbmFkaWMJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX2NtcAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX2Zyb21fcmVnCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19mcF90b19yZWcJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLQotc3RhdGljIHZvaWQgZml4X25ld19hcm0JCVBBUkFNUyAoKGZyYWdTICpmcmFnLCBpbnQgd2hlcmUsIAotCQkJCQkgc2hvcnQgaW50IHNpemUsIGV4cHJlc3Npb25TICpleHAsCi0JCQkJCSBpbnQgcGNfcmVsLCBpbnQgcmVsb2MpKTsKLXN0YXRpYyBpbnQgYXJtX3JlZ19wYXJzZQlQQVJBTVMgKChjaGFyICoqY2NwKSk7Ci1zdGF0aWMgaW50IGFybV9wc3JfcGFyc2UJUEFSQU1TICgoY2hhciAqKmNjcCkpOwotc3RhdGljIHZvaWQgc3ltYm9sX2xvY2F0ZQlQQVJBTVMgKChzeW1ib2xTICosIENPTlNUIGNoYXIgKiwgc2VnVCwKLQkJCQkJIHZhbHVlVCwgZnJhZ1MgKikpOwotc3RhdGljIGludCBhZGRfdG9fbGl0X3Bvb2wJUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHVuc2lnbmVkIHZhbGlkYXRlX2ltbWVkaWF0ZQlQQVJBTVMgKCh1bnNpZ25lZCkpOwotc3RhdGljIGludCB2YWxpZGF0ZV9vZmZzZXRfaW1tCVBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBvcGNvZGVfc2VsZWN0CVBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgZW5kX29mX2xpbmUJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGludCByZWdfcmVxdWlyZWRfaGVyZQlQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKLXN0YXRpYyBpbnQgcHNyX3JlcXVpcmVkX2hlcmUJUEFSQU1TICgoY2hhciAqKiwgaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgY29fcHJvY19udW1iZXIJUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCBjcF9vcGNfZXhwcgkJUEFSQU1TICgoY2hhciAqKiwgaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgY3BfcmVnX3JlcXVpcmVkX2hlcmUJUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IGZwX3JlZ19yZXF1aXJlZF9oZXJlCVBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBjcF9hZGRyZXNzX29mZnNldAlQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IGNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZQlQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IG15X2dldF9mbG9hdF9leHByZXNzaW9uCVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgc2tpcF9wYXN0X2NvbW1hCVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgd2Fsa19ub19iaWdudW1zCVBBUkFNUyAoKHN5bWJvbFMgKikpOwotc3RhdGljIGludCBuZWdhdGVfZGF0YV9vcAlQQVJBTVMgKCh1bnNpZ25lZCBsb25nICosCi0JCQkJCSB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgaW50IGRhdGFfb3AyCQlQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IGZwX29wMgkJUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGxvbmcgcmVnX2xpc3QJCVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHRodW1iX2xvYWRfc3RvcmUJUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCkpOwotc3RhdGljIGludCBkZWNvZGVfc2hpZnQJCVBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBsZHN0X2V4dGVuZAkJUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCB0aHVtYl9hZGRfc3ViCVBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBpbnNlcnRfcmVnCQlQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHRodW1iX3NoaWZ0CQlQQVJBTVMgKChjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgdGh1bWJfbW92X2NvbXBhcmUJUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNldF9jb25zdGFudF9mbG9udW1zCVBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2YWx1ZVQgbWRfY2hhcnNfdG9fbnVtYmVyCVBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBpbnNlcnRfcmVnX2FsaWFzCVBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBvdXRwdXRfaW5zdAkJUEFSQU1TICgoY2hhciAqKSk7Ci0jaWZkZWYgT0JKX0VMRgotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQlhcm1fcGFyc2VfcmVsb2Modm9pZCk7Ci0jZW5kaWYKLQotLyogQVJNIGluc3RydWN0aW9ucyB0YWtlIDRieXRlcyBpbiB0aGUgb2JqZWN0IGZpbGUsIFRodW1iIGluc3RydWN0aW9ucwotICAgdGFrZSAyOiAqLwotI2RlZmluZSBJTlNOX1NJWkUgICAgICAgNAotCi0vKiBMT05HRVNUX0lOU1QgaXMgdGhlIGxvbmdlc3QgYmFzaWMgaW5zdHJ1Y3Rpb24gbmFtZSB3aXRob3V0IGNvbmRpdGlvbnMgb3IgCi0gKiBmbGFncy4KLSAqIEFSTTdNIGhhcyA0IG9mIGxlbmd0aCA1Ci0gKi8KLQotI2RlZmluZSBMT05HRVNUX0lOU1QgNQotCi1zdHJ1Y3QgYXNtX29wY29kZSAKLXsKLSAgQ09OU1QgY2hhciAqICAgICAgICAgICB0ZW1wbGF0ZTsJLyogQmFzaWMgc3RyaW5nIHRvIG1hdGNoICovCi0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgdmFsdWU7CQkvKiBCYXNpYyBpbnN0cnVjdGlvbiBjb2RlICovCi0gIENPTlNUIGNoYXIgKiAgICAgICAgICAgY29tcF9zdWZmaXg7CS8qIENvbXB1bHNvcnkgc3VmZml4IHRoYXQgbXVzdCBmb2xsb3cgY29uZHMgKi8KLSAgQ09OU1Qgc3RydWN0IGFzbV9mbGcgKiBmbGFnczsJICAgICAgICAvKiBCaXRzIHRvIHRvZ2dsZSBpZiBmbGFnICduJyBzZXQgKi8KLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICB2YXJpYW50czsJLyogV2hpY2ggQ1BVIHZhcmlhbnRzIHRoaXMgZXhpc3RzIGZvciAqLwotICAvKiBGdW5jdGlvbiB0byBjYWxsIHRvIHBhcnNlIGFyZ3MgKi8KLSAgdm9pZCAoKiAgICAgICAgICAgICAgICBwYXJtcykgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9vcGNvZGUgaW5zbnNbXSA9IAotewotLyogQVJNIEluc3RydWN0aW9ucyAqLwotICB7ImFuZCIsICAgMHgwMDAwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJlb3IiLCAgIDB4MDAyMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsic3ViIiwgICAweDAwNDAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7InJzYiIsICAgMHgwMDYwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJhZGQiLCAgIDB4MDA4MDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsiYWRjIiwgICAweDAwYTAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7InNiYyIsICAgMHgwMGMwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJyc2MiLCAgIDB4MDBlMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsib3JyIiwgICAweDAxODAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7ImJpYyIsICAgMHgwMWMwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJ0c3QiLCAgIDB4MDEwMDAwMDAsIE5VTEwsICAgY21wX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fY21wfSwKLSAgeyJ0ZXEiLCAgIDB4MDEyMDAwMDAsIE5VTEwsICAgY21wX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fY21wfSwKLSAgeyJjbXAiLCAgIDB4MDE0MDAwMDAsIE5VTEwsICAgY21wX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fY21wfSwKLSAgeyJjbW4iLCAgIDB4MDE2MDAwMDAsIE5VTEwsICAgY21wX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fY21wfSwKLSAgeyJtb3YiLCAgIDB4MDFhMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fbW92fSwKLSAgeyJtdm4iLCAgIDB4MDFlMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fbW92fSwKLSAgeyJzdHIiLCAgIDB4MDQwMDAwMDAsIE5VTEwsICAgc3RyX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fbGRzdH0sCi0gIHsibGRyIiwgICAweDA0MTAwMDAwLCBOVUxMLCAgIGxkcl9mbGFncywgICBBUk1fQU5ZLCAgICAgIGRvX2xkc3R9LAotICB7InN0bSIsICAgMHgwODAwMDAwMCwgTlVMTCwgICBzdG1fZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19sZG1zdG19LAotICB7ImxkbSIsICAgMHgwODEwMDAwMCwgTlVMTCwgICBsZG1fZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19sZG1zdG19LAotICB7InN3aSIsICAgMHgwZjAwMDAwMCwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNX0FOWSwgICAgICBkb19zd2l9LAotICB7ImJsIiwgICAgMHgwYmZmZmZmZSwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNX0FOWSwgICAgICBkb19icmFuY2h9LAotICB7ImIiLCAgICAgMHgwYWZmZmZmZSwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNX0FOWSwgICAgICBkb19icmFuY2h9LAotCi0vKiBQc2V1ZG8gb3BzICovCi0gIHsiYWRyIiwgICAweDAyOGYwMDAwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX2Fkcn0sCi0gIHsibm9wIiwgICAweDAxYTAwMDAwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX25vcH0sCi0KLS8qIEFSTSAyIG11bHRpcGxpZXMgKi8KLSAgeyJtdWwiLCAgIDB4MDAwMDAwOTAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV8yVVAsICAgICAgZG9fbXVsfSwKLSAgeyJtbGEiLCAgIDB4MDAyMDAwOTAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV8yVVAsICAgICAgZG9fbWxhfSwKLQotLyogQVJNIDMgLSBzd3AgaW5zdHJ1Y3Rpb25zICovCi0gIHsic3dwIiwgICAweDAxMDAwMDkwLCBOVUxMLCAgIGJ5dGVfZmxhZywgICBBUk1fM1VQLCAgICAgIGRvX3N3YXB9LAotCi0vKiBBUk0gNiBDb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgKi8KLSAgeyJtcnMiLCAgIDB4MDEwZjAwMDAsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV82VVAsICAgICAgZG9fbXJzfSwKLSAgeyJtc3IiLCAgIDB4MDEyMGYwMDAsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV82VVAsICAgICAgZG9fbXNyfSwKLS8qIFNjb3R0Qjogb3VyIGNvZGUgdXNlcyAweDAxMjhmMDAwIGZvciBtc3IuCi0gICBOaWNrQzogIGJ1dCB0aGlzIGlzIHdyb25nIGJlY2F1c2UgdGhlIGJpdHMgMTYgYW5kIDE5IGFyZSBoYW5kbGVkCi0gICAgICAgICAgIGJ5IHRoZSBQU1JfeHh4IGRlZmluZXMgYWJvdmUuICAqLwotCi0vKiBBUk0gN00gbG9uZyBtdWx0aXBsaWVzIC0gbmVlZCBzaWduZWQvdW5zaWduZWQgZmxhZ3MhICovCi0gIHsic211bGwiLCAweDAwYzAwMDkwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fTE9OR01VTCwgIGRvX211bGx9LAotICB7InVtdWxsIiwgMHgwMDgwMDA5MCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0xPTkdNVUwsICBkb19tdWxsfSwKLSAgeyJzbWxhbCIsIDB4MDBlMDAwOTAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9MT05HTVVMLCAgZG9fbXVsbH0sCi0gIHsidW1sYWwiLCAweDAwYTAwMDkwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fTE9OR01VTCwgIGRvX211bGx9LAotCi0vKiBBUk0gVEhVTUIgaW50ZXJ3b3JraW5nICovCi0gIHsiYngiLCAgICAweDAxMmZmZjEwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fVEhVTUIsICAgIGRvX2J4fSwKLQotLyogRmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zICovCi0gIHsid2ZzIiwgICAweDBlMjAwMTEwLCBOVUxMLCAgIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2N0cmx9LAotICB7InJmcyIsICAgMHgwZTMwMDExMCwgTlVMTCwgICBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9jdHJsfSwKLSAgeyJ3ZmMiLCAgIDB4MGU0MDAxMTAsIE5VTEwsICAgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfY3RybH0sCi0gIHsicmZjIiwgICAweDBlNTAwMTEwLCBOVUxMLCAgIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2N0cmx9LAotICB7ImxkZiIsICAgMHgwYzEwMDEwMCwgInNkZXAiLCBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9sZHN0fSwKLSAgeyJzdGYiLCAgIDB4MGMwMDAxMDAsICJzZGVwIiwgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfbGRzdH0sCi0gIHsibGZtIiwgICAweDBjMTAwMjAwLCBOVUxMLCAgIGxmbV9mbGFncywgICBGUFVfTUVNTVVMVEksIGRvX2ZwX2xkbXN0bX0sCi0gIHsic2ZtIiwgICAweDBjMDAwMjAwLCBOVUxMLCAgIHNmbV9mbGFncywgICBGUFVfTUVNTVVMVEksIGRvX2ZwX2xkbXN0bX0sCi0gIHsibXZmIiwgICAweDBlMDA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7Im1uZiIsICAgMHgwZTEwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJhYnMiLCAgIDB4MGUyMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsicm5kIiwgICAweDBlMzA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7InNxdCIsICAgMHgwZTQwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJsb2ciLCAgIDB4MGU1MDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsibGduIiwgICAweDBlNjA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImV4cCIsICAgMHgwZTcwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJzaW4iLCAgIDB4MGU4MDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsiY29zIiwgICAweDBlOTA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7InRhbiIsICAgMHgwZWEwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJhc24iLCAgIDB4MGViMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsiYWNzIiwgICAweDBlYzA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImF0biIsICAgMHgwZWQwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJ1cmQiLCAgIDB4MGVlMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsibnJtIiwgICAweDBlZjA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImFkZiIsICAgMHgwZTAwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InN1ZiIsICAgMHgwZTIwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InJzZiIsICAgMHgwZTMwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7Im11ZiIsICAgMHgwZTEwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7ImR2ZiIsICAgMHgwZTQwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InJkZiIsICAgMHgwZTUwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InBvdyIsICAgMHgwZTYwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InJwdyIsICAgMHgwZTcwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InJtZiIsICAgMHgwZTgwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7ImZtbCIsICAgMHgwZTkwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7ImZkdiIsICAgMHgwZWEwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7ImZyZCIsICAgMHgwZWIwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InBvbCIsICAgMHgwZWMwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7ImNtZiIsICAgMHgwZTkwZjExMCwgTlVMTCwgICBleGNlcHRfZmxhZywgRlBVX0FMTCwgICAgICBkb19mcF9jbXB9LAotICB7ImNuZiIsICAgMHgwZWIwZjExMCwgTlVMTCwgICBleGNlcHRfZmxhZywgRlBVX0FMTCwgICAgICBkb19mcF9jbXB9LAotLyogVGhlIEZQQTEwIGRhdGEgc2hlZXQgc3VnZ2VzdHMgdGhhdCB0aGUgJ0UnIG9mIGNtZmUvY25mZSBzaG91bGQgbm90Ci0gICBiZSBhbiBvcHRpb25hbCBzdWZmaXgsIGJ1dCBwYXJ0IG9mIHRoZSBpbnN0cnVjdGlvbi4gIFRvIGJlIGNvbXBhdGlibGUsCi0gICB3ZSBhY2NlcHQgZWl0aGVyLiAgKi8KLSAgeyJjbWZlIiwgIDB4MGVkMGYxMTAsIE5VTEwsICAgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfY21wfSwKLSAgeyJjbmZlIiwgIDB4MGVmMGYxMTAsIE5VTEwsICAgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfY21wfSwKLSAgeyJmbHQiLCAgIDB4MGUwMDAxMTAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZnJvbV9yZWd9LAotICB7ImZpeCIsICAgMHgwZTEwMDExMCwgTlVMTCwgICBmaXhfZmxhZ3MsICAgRlBVX0FMTCwgICAgICBkb19mcF90b19yZWd9LAotCi0vKiBHZW5lcmljIGNvcHJlc3NvciBpbnN0cnVjdGlvbnMgKi8KLSAgeyJjZHAiLCAgIDB4MGUwMDAwMDAsIE5VTEwsICBOVUxMLCAgICAgICAgIEFSTV8yVVAsICAgICAgZG9fY2RwfSwKLSAgeyJsZGMiLCAgIDB4MGMxMDAwMDAsIE5VTEwsICBjcGxvbmdfZmxhZywgIEFSTV8yVVAsICAgICAgZG9fbHN0Y30sCi0gIHsic3RjIiwgICAweDBjMDAwMDAwLCBOVUxMLCAgY3Bsb25nX2ZsYWcsICBBUk1fMlVQLCAgICAgIGRvX2xzdGN9LAotICB7Im1jciIsICAgMHgwZTAwMDAxMCwgTlVMTCwgIE5VTEwsICAgICAgICAgQVJNXzJVUCwgICAgICBkb19jb19yZWd9LAotICB7Im1yYyIsICAgMHgwZTEwMDAxMCwgTlVMTCwgIE5VTEwsICAgICAgICAgQVJNXzJVUCwgICAgICBkb19jb19yZWd9LAotfTsKLQotLyogZGVmaW5lcyBmb3IgdmFyaW91cyBiaXRzIHRoYXQgd2Ugd2lsbCB3YW50IHRvIHRvZ2dsZSAqLwotCi0jZGVmaW5lIElOU1RfSU1NRURJQVRFCTB4MDIwMDAwMDAKLSNkZWZpbmUgT0ZGU0VUX1JFRwkweDAyMDAwMDAwCi0jZGVmaW5lIEhXT0ZGU0VUX0lNTSAgICAweDAwNDAwMDAwCi0jZGVmaW5lIFNISUZUX0JZX1JFRwkweDAwMDAwMDEwCi0jZGVmaW5lIFBSRV9JTkRFWAkweDAxMDAwMDAwCi0jZGVmaW5lIElOREVYX1VQCTB4MDA4MDAwMDAKLSNkZWZpbmUgV1JJVEVfQkFDSwkweDAwMjAwMDAwCi0jZGVmaW5lIE1VTFRJX1NFVF9QU1IJMHgwMDQwMDAwMAotCi0jZGVmaW5lIExJVEVSQUxfTUFTSwkweGYwMDBmMDAwCi0jZGVmaW5lIENPTkRfTUFTSwkweGYwMDAwMDAwCi0jZGVmaW5lIE9QQ09ERV9NQVNLCTB4ZmUxZmZmZmYKLSNkZWZpbmUgREFUQV9PUF9TSElGVAkyMQotCi0vKiBDb2RlcyB0byBkaXN0aW5ndWlzaCB0aGUgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMgKi8KLQotI2RlZmluZSBPUENPREVfQU5ECTAKLSNkZWZpbmUgT1BDT0RFX0VPUgkxCi0jZGVmaW5lIE9QQ09ERV9TVUIJMgotI2RlZmluZSBPUENPREVfUlNCCTMKLSNkZWZpbmUgT1BDT0RFX0FERAk0Ci0jZGVmaW5lIE9QQ09ERV9BREMJNQotI2RlZmluZSBPUENPREVfU0JDCTYKLSNkZWZpbmUgT1BDT0RFX1JTQwk3Ci0jZGVmaW5lIE9QQ09ERV9UU1QJOAotI2RlZmluZSBPUENPREVfVEVRCTkKLSNkZWZpbmUgT1BDT0RFX0NNUAkxMAotI2RlZmluZSBPUENPREVfQ01OCTExCi0jZGVmaW5lIE9QQ09ERV9PUlIJMTIKLSNkZWZpbmUgT1BDT0RFX01PVgkxMwotI2RlZmluZSBPUENPREVfQklDCTE0Ci0jZGVmaW5lIE9QQ09ERV9NVk4JMTUKLQotc3RhdGljIHZvaWQgZG9fdF9ub3AJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2FyaXQJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2FkZAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3RfYXNyCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9icmFuY2g5CVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2JyYW5jaDEyCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2JyYW5jaDIzCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2J4CQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9jb21wYXJlCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2xkbXN0bQkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3RfbGRyCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9sZHJiCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9sZHJoCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9sZHMJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2xzbAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3RfbHNyCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9tb3YJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X3B1c2hfcG9wCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X3N0cgkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3Rfc3RyYgkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3Rfc3RyaAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3Rfc3ViCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9zd2kJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2FkcgkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLQotI2RlZmluZSBUX09QQ09ERV9NVUwgMHg0MzQwCi0jZGVmaW5lIFRfT1BDT0RFX1RTVCAweDQyMDAKLSNkZWZpbmUgVF9PUENPREVfQ01OIDB4NDJjMAotI2RlZmluZSBUX09QQ09ERV9ORUcgMHg0MjQwCi0jZGVmaW5lIFRfT1BDT0RFX01WTiAweDQzYzAKLQotI2RlZmluZSBUX09QQ09ERV9BRERfUjMJMHgxODAwCi0jZGVmaW5lIFRfT1BDT0RFX1NVQl9SMyAweDFhMDAKLSNkZWZpbmUgVF9PUENPREVfQUREX0hJIDB4NDQwMAotI2RlZmluZSBUX09QQ09ERV9BRERfU1QgMHhiMDAwCi0jZGVmaW5lIFRfT1BDT0RFX1NVQl9TVCAweGIwODAKLSNkZWZpbmUgVF9PUENPREVfQUREX1NQIDB4YTgwMAotI2RlZmluZSBUX09QQ09ERV9BRERfUEMgMHhhMDAwCi0jZGVmaW5lIFRfT1BDT0RFX0FERF9JOCAweDMwMDAKLSNkZWZpbmUgVF9PUENPREVfU1VCX0k4IDB4MzgwMAotI2RlZmluZSBUX09QQ09ERV9BRERfSTMgMHgxYzAwCi0jZGVmaW5lIFRfT1BDT0RFX1NVQl9JMyAweDFlMDAKLQotI2RlZmluZSBUX09QQ09ERV9BU1JfUgkweDQxMDAKLSNkZWZpbmUgVF9PUENPREVfTFNMX1IJMHg0MDgwCi0jZGVmaW5lIFRfT1BDT0RFX0xTUl9SICAweDQwYzAKLSNkZWZpbmUgVF9PUENPREVfQVNSX0kJMHgxMDAwCi0jZGVmaW5lIFRfT1BDT0RFX0xTTF9JCTB4MDAwMAotI2RlZmluZSBUX09QQ09ERV9MU1JfSQkweDA4MDAKLQotI2RlZmluZSBUX09QQ09ERV9NT1ZfSTgJMHgyMDAwCi0jZGVmaW5lIFRfT1BDT0RFX0NNUF9JOCAweDI4MDAKLSNkZWZpbmUgVF9PUENPREVfQ01QX0xSIDB4NDI4MAotI2RlZmluZSBUX09QQ09ERV9NT1ZfSFIgMHg0NjAwCi0jZGVmaW5lIFRfT1BDT0RFX0NNUF9IUiAweDQ1MDAKLQotI2RlZmluZSBUX09QQ09ERV9MRFJfUEMgMHg0ODAwCi0jZGVmaW5lIFRfT1BDT0RFX0xEUl9TUCAweDk4MDAKLSNkZWZpbmUgVF9PUENPREVfU1RSX1NQIDB4OTAwMAotI2RlZmluZSBUX09QQ09ERV9MRFJfSVcgMHg2ODAwCi0jZGVmaW5lIFRfT1BDT0RFX1NUUl9JVyAweDYwMDAKLSNkZWZpbmUgVF9PUENPREVfTERSX0lIIDB4ODgwMAotI2RlZmluZSBUX09QQ09ERV9TVFJfSUggMHg4MDAwCi0jZGVmaW5lIFRfT1BDT0RFX0xEUl9JQiAweDc4MDAKLSNkZWZpbmUgVF9PUENPREVfU1RSX0lCIDB4NzAwMAotI2RlZmluZSBUX09QQ09ERV9MRFJfUlcgMHg1ODAwCi0jZGVmaW5lIFRfT1BDT0RFX1NUUl9SVyAweDUwMDAKLSNkZWZpbmUgVF9PUENPREVfTERSX1JIIDB4NWEwMAotI2RlZmluZSBUX09QQ09ERV9TVFJfUkggMHg1MjAwCi0jZGVmaW5lIFRfT1BDT0RFX0xEUl9SQiAweDVjMDAKLSNkZWZpbmUgVF9PUENPREVfU1RSX1JCIDB4NTQwMAotCi0jZGVmaW5lIFRfT1BDT0RFX1BVU0gJMHhiNDAwCi0jZGVmaW5lIFRfT1BDT0RFX1BPUAkweGJjMDAKLQotI2RlZmluZSBUX09QQ09ERV9CUkFOQ0ggMHhlN2ZlCi0KLXN0YXRpYyBpbnQgdGh1bWJfcmVnCQlQQVJBTVMgKChjaGFyICoqIHN0ciwgaW50IGhpX2xvKSk7Ci0KLSNkZWZpbmUgVEhVTUJfU0laRQkyCS8qIFNpemUgb2YgdGh1bWIgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgVEhVTUJfUkVHX0xPCTB4MQotI2RlZmluZSBUSFVNQl9SRUdfSEkJMHgyCi0jZGVmaW5lIFRIVU1CX1JFR19BTlkJMHgzCi0KLSNkZWZpbmUgVEhVTUJfSDEJMHgwMDgwCi0jZGVmaW5lIFRIVU1CX0gyCTB4MDA0MAotCi0jZGVmaW5lIFRIVU1CX0FTUiAwCi0jZGVmaW5lIFRIVU1CX0xTTCAxCi0jZGVmaW5lIFRIVU1CX0xTUiAyCi0KLSNkZWZpbmUgVEhVTUJfTU9WRSAwCi0jZGVmaW5lIFRIVU1CX0NPTVBBUkUgMQotCi0jZGVmaW5lIFRIVU1CX0xPQUQgMAotI2RlZmluZSBUSFVNQl9TVE9SRSAxCi0KLSNkZWZpbmUgVEhVTUJfUFBfUENfTFIgMHgwMTAwCi0KLS8qIFRoZXNlIHRocmVlIGFyZSB1c2VkIGZvciBpbW1lZGlhdGUgc2hpZnRzLCBkbyBub3QgYWx0ZXIgKi8KLSNkZWZpbmUgVEhVTUJfV09SRCAyCi0jZGVmaW5lIFRIVU1CX0hBTEZXT1JEIDEKLSNkZWZpbmUgVEhVTUJfQllURSAwCi0KLXN0cnVjdCB0aHVtYl9vcGNvZGUgCi17Ci0gIENPTlNUIGNoYXIgKiAgdGVtcGxhdGU7CS8qIEJhc2ljIHN0cmluZyB0byBtYXRjaCAqLwotICB1bnNpZ25lZCBsb25nIHZhbHVlOwkJLyogQmFzaWMgaW5zdHJ1Y3Rpb24gY29kZSAqLwotICBpbnQgICAgICAgICAgIHNpemU7Ci0gIHZvaWQgKCogICAgICAgcGFybXMpIFBBUkFNUyAoKGNoYXIgKikpOyAgLyogRnVuY3Rpb24gdG8gY2FsbCB0byBwYXJzZSBhcmdzICovCi19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IHRodW1iX29wY29kZSB0aW5zbnNbXSA9Ci17Ci0gIHsiYWRjIiwJMHg0MTQwLAkJMiwJZG9fdF9hcml0fSwKLSAgeyJhZGQiLAkweDAwMDAsCQkyLAlkb190X2FkZH0sCi0gIHsiYW5kIiwJMHg0MDAwLAkJMiwJZG9fdF9hcml0fSwKLSAgeyJhc3IiLAkweDAwMDAsCQkyLAlkb190X2Fzcn0sCi0gIHsiYiIsCQlUX09QQ09ERV9CUkFOQ0gsIDIsCWRvX3RfYnJhbmNoMTJ9LAotICB7ImJlcSIsCTB4ZDBmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYm5lIiwJMHhkMWZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJiY3MiLAkweGQyZmUsCQkyLAlkb190X2JyYW5jaDl9LAotICB7ImJocyIsCTB4ZDJmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYmNjIiwJMHhkM2ZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJidWwiLAkweGQzZmUsCQkyLAlkb190X2JyYW5jaDl9LAotICB7ImJsbyIsCTB4ZDNmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYm1pIiwJMHhkNGZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJicGwiLAkweGQ1ZmUsCQkyLAlkb190X2JyYW5jaDl9LAotICB7ImJ2cyIsCTB4ZDZmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYnZjIiwJMHhkN2ZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJiaGkiLAkweGQ4ZmUsCQkyLAlkb190X2JyYW5jaDl9LAotICB7ImJscyIsCTB4ZDlmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYmdlIiwJMHhkYWZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJibHQiLAkweGRiZmUsCQkyLAlkb190X2JyYW5jaDl9LAotICB7ImJndCIsCTB4ZGNmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYmxlIiwJMHhkZGZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJiaWMiLAkweDQzODAsCQkyLAlkb190X2FyaXR9LAotICB7ImJsIiwJMHhmN2ZmZmZmZSwJNCwJZG9fdF9icmFuY2gyM30sCi0gIHsiYngiLAkweDQ3MDAsCQkyLAlkb190X2J4fSwKLSAgeyJjbW4iLAlUX09QQ09ERV9DTU4sCTIsCWRvX3RfYXJpdH0sCi0gIHsiY21wIiwJMHgwMDAwLAkJMiwJZG9fdF9jb21wYXJlfSwKLSAgeyJlb3IiLAkweDQwNDAsCQkyLAlkb190X2FyaXR9LAotICB7ImxkbWlhIiwJMHhjODAwLAkJMiwJZG9fdF9sZG1zdG19LAotICB7ImxkciIsCTB4MDAwMCwJCTIsCWRvX3RfbGRyfSwKLSAgeyJsZHJiIiwJMHgwMDAwLAkJMiwJZG9fdF9sZHJifSwKLSAgeyJsZHJoIiwJMHgwMDAwLAkJMiwJZG9fdF9sZHJofSwKLSAgeyJsZHJzYiIsCTB4NTYwMCwJCTIsCWRvX3RfbGRzfSwKLSAgeyJsZHJzaCIsCTB4NWUwMCwJCTIsCWRvX3RfbGRzfSwKLSAgeyJsZHNiIiwJMHg1NjAwLAkJMiwJZG9fdF9sZHN9LAotICB7Imxkc2giLAkweDVlMDAsCQkyLAlkb190X2xkc30sCi0gIHsibHNsIiwJMHgwMDAwLAkJMiwJZG9fdF9sc2x9LAotICB7ImxzciIsCTB4MDAwMCwJCTIsCWRvX3RfbHNyfSwKLSAgeyJtb3YiLAkweDAwMDAsCQkyLAlkb190X21vdn0sCi0gIHsibXVsIiwJVF9PUENPREVfTVVMLAkyLAlkb190X2FyaXR9LAotICB7Im12biIsCVRfT1BDT0RFX01WTiwJMiwJZG9fdF9hcml0fSwKLSAgeyJuZWciLAlUX09QQ09ERV9ORUcsCTIsCWRvX3RfYXJpdH0sCi0gIHsib3JyIiwJMHg0MzAwLAkJMiwJZG9fdF9hcml0fSwKLSAgeyJwb3AiLAkweGJjMDAsCQkyLAlkb190X3B1c2hfcG9wfSwKLSAgeyJwdXNoIiwJMHhiNDAwLAkJMiwJZG9fdF9wdXNoX3BvcH0sCi0gIHsicm9yIiwJMHg0MWMwLAkJMiwJZG9fdF9hcml0fSwKLSAgeyJzYmMiLAkweDQxODAsCQkyLAlkb190X2FyaXR9LAotICB7InN0bWlhIiwJMHhjMDAwLAkJMiwJZG9fdF9sZG1zdG19LAotICB7InN0ciIsCTB4MDAwMCwJCTIsCWRvX3Rfc3RyfSwKLSAgeyJzdHJiIiwJMHgwMDAwLAkJMiwJZG9fdF9zdHJifSwKLSAgeyJzdHJoIiwJMHgwMDAwLAkJMiwJZG9fdF9zdHJofSwKLSAgeyJzd2kiLAkweGRmMDAsCQkyLAlkb190X3N3aX0sCi0gIHsic3ViIiwJMHgwMDAwLAkJMiwJZG9fdF9zdWJ9LAotICB7InRzdCIsCVRfT1BDT0RFX1RTVCwJMiwJZG9fdF9hcml0fSwKLSAgLyogUHNldWRvIG9wczogKi8KLSAgeyJhZHIiLCAgICAgICAweDAwMDAsICAgICAgICAgMiwgICAgICBkb190X2Fkcn0sCi0gIHsibm9wIiwgICAgICAgMHg0NkMwLCAgICAgICAgIDIsICAgICAgZG9fdF9ub3B9LCAgICAgIC8qIG1vdiByOCxyOCAqLwotfTsKLQotc3RydWN0IHJlZ19lbnRyeQotewotICBDT05TVCBjaGFyICogbmFtZTsKLSAgaW50ICAgICAgICAgIG51bWJlcjsKLX07Ci0KLSNkZWZpbmUgaW50X3JlZ2lzdGVyKHJlZykgKChyZWcpID49IDAgJiYgKHJlZykgPD0gMTUpCi0jZGVmaW5lIGNwX3JlZ2lzdGVyKHJlZykgKChyZWcpID49IDMyICYmIChyZWcpIDw9IDQ3KQotI2RlZmluZSBmcF9yZWdpc3RlcihyZWcpICgocmVnKSA+PSAxNiAmJiAocmVnKSA8PSAyMykKLQotI2RlZmluZSBSRUdfUEMJMTUKLSNkZWZpbmUgUkVHX0xSICAxNAotI2RlZmluZSBSRUdfU1AgIDEzCi0KLS8qIFRoZXNlIGFyZSB0aGUgc3RhbmRhcmQgbmFtZXM7ICBVc2VycyBjYW4gYWRkIGFsaWFzZXMgd2l0aCAucmVxICovCi1zdGF0aWMgQ09OU1Qgc3RydWN0IHJlZ19lbnRyeSByZWdfdGFibGVbXSA9Ci17Ci0gIC8qIFByb2Nlc3NvciBSZWdpc3RlciBOdW1iZXJzICovCi0gIHsicjAiLCAwfSwgICAgeyJyMSIsIDF9LCAgICAgIHsicjIiLCAyfSwgICAgICB7InIzIiwgM30sCi0gIHsicjQiLCA0fSwgICAgeyJyNSIsIDV9LCAgICAgIHsicjYiLCA2fSwgICAgICB7InI3IiwgN30sCi0gIHsicjgiLCA4fSwgICAgeyJyOSIsIDl9LCAgICAgIHsicjEwIiwgMTB9LCAgICB7InIxMSIsIDExfSwKLSAgeyJyMTIiLCAxMn0sICB7InIxMyIsIFJFR19TUH0seyJyMTQiLCBSRUdfTFJ9LHsicjE1IiwgUkVHX1BDfSwKLSAgLyogQVBDUyBjb252ZW50aW9ucyAqLwotICB7ImExIiwgMH0sCXsiYTIiLCAxfSwgICAgeyJhMyIsIDJ9LCAgICAgeyJhNCIsIDN9LAotICB7InYxIiwgNH0sCXsidjIiLCA1fSwgICAgeyJ2MyIsIDZ9LCAgICAgeyJ2NCIsIDd9LCAgICAgeyJ2NSIsIDh9LAotICB7InY2IiwgOX0sCXsic2IiLCA5fSwgICAgeyJ2NyIsIDEwfSwgICAgeyJzbCIsIDEwfSwKLSAgeyJmcCIsIDExfSwJeyJpcCIsIDEyfSwgICB7InNwIiwgUkVHX1NQfSx7ImxyIiwgUkVHX0xSfSx7InBjIiwgUkVHX1BDfSwKLSAgLyogRlAgUmVnaXN0ZXJzICovCi0gIHsiZjAiLCAxNn0sICAgeyJmMSIsIDE3fSwgICB7ImYyIiwgMTh9LCAgIHsiZjMiLCAxOX0sCi0gIHsiZjQiLCAyMH0sICAgeyJmNSIsIDIxfSwgICB7ImY2IiwgMjJ9LCAgIHsiZjciLCAyM30sCi0gIHsiYzAiLCAzMn0sICAgeyJjMSIsIDMzfSwgICB7ImMyIiwgMzR9LCAgIHsiYzMiLCAzNX0sCi0gIHsiYzQiLCAzNn0sICAgeyJjNSIsIDM3fSwgICB7ImM2IiwgMzh9LCAgIHsiYzciLCAzOX0sCi0gIHsiYzgiLCA0MH0sICAgeyJjOSIsIDQxfSwgICB7ImMxMCIsIDQyfSwgIHsiYzExIiwgNDN9LAotICB7ImMxMiIsIDQ0fSwgIHsiYzEzIiwgNDV9LCAgeyJjMTQiLCA0Nn0sICB7ImMxNSIsIDQ3fSwKLSAgeyJjcjAiLCAzMn0sICB7ImNyMSIsIDMzfSwgIHsiY3IyIiwgMzR9LCAgeyJjcjMiLCAzNX0sCi0gIHsiY3I0IiwgMzZ9LCAgeyJjcjUiLCAzN30sICB7ImNyNiIsIDM4fSwgIHsiY3I3IiwgMzl9LAotICB7ImNyOCIsIDQwfSwgIHsiY3I5IiwgNDF9LCAgeyJjcjEwIiwgNDJ9LCB7ImNyMTEiLCA0M30sCi0gIHsiY3IxMiIsIDQ0fSwgeyJjcjEzIiwgNDV9LCB7ImNyMTQiLCA0Nn0sIHsiY3IxNSIsIDQ3fSwKLSAge05VTEwsIDB9Ci19OwotCi0jZGVmaW5lIGJhZF9hcmdzIF8oIkJhZCBhcmd1bWVudHMgdG8gaW5zdHJ1Y3Rpb24iKTsKLSNkZWZpbmUgYmFkX3BjIF8oInIxNSBub3QgYWxsb3dlZCBoZXJlIik7Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICogYXJtX29wc19oc2ggPSBOVUxMOwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBhcm1fdG9wc19oc2ggPSBOVUxMOwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBhcm1fY29uZF9oc2ggPSBOVUxMOwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBhcm1fc2hpZnRfaHNoID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICogYXJtX3JlZ19oc2ggPSBOVUxMOwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBhcm1fcHNyX2hzaCA9IE5VTEw7Ci0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0gICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICBJbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgotICAgKi8KLQotc3RhdGljIHZvaWQgc19yZXEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FsaWduIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19ic3MgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2V2ZW4gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2x0b3JnIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hcm0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3RodW1iIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jb2RlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19mb3JjZV90aHVtYiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfdGh1bWJfZnVuYyBQQVJBTVMgKChpbnQpKTsKLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgdm9pZCBzX2FybV9lbGZfY29ucyBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IG15X2dldF9leHByZXNzaW9uIFBBUkFNUyAoKGV4cHJlc3Npb25TICosIGNoYXIgKiopKTsKLQotQ09OU1QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJyZXEiLCAgICAgICAgIHNfcmVxLCAwfSwJLyogTmV2ZXIgY2FsbGVkIGJlY2FzdWUgJy5yZXEnIGRvZXMgbm90IHN0YXJ0IGxpbmUgKi8KLSAgeyJic3MiLCAgICAgICAgIHNfYnNzLCAwfSwKLSAgeyJhbGlnbiIsICAgICAgIHNfYWxpZ24sIDB9LAotICB7ImFybSIsICAgICAgICAgc19hcm0sIDB9LAotICB7InRodW1iIiwgICAgICAgc190aHVtYiwgMH0sCi0gIHsiY29kZSIsICAgICAgICBzX2NvZGUsIDB9LAotICB7ImZvcmNlX3RodW1iIiwgc19mb3JjZV90aHVtYiwgMH0sCi0gIHsidGh1bWJfZnVuYyIsICBzX3RodW1iX2Z1bmMsIDB9LAotICB7ImV2ZW4iLCAgICAgICAgc19ldmVuLCAwfSwKLSAgeyJsdG9yZyIsICAgICAgIHNfbHRvcmcsIDB9LAotICB7InBvb2wiLCAgICAgICAgc19sdG9yZywgMH0sCi0jaWZkZWYgT0JKX0VMRiAgCi0gIHsid29yZCIsICAgICAgICBzX2FybV9lbGZfY29ucywgNH0sCi0gIHsibG9uZyIsICAgICAgICBzX2FybV9lbGZfY29ucywgNH0sCi0jZWxzZQotICB7IndvcmQiLCAgICAgICAgY29ucywgNH0sCi0jZW5kaWYKLSAgeyJleHRlbmQiLCAgICAgIGZsb2F0X2NvbnMsICd4J30sCi0gIHsibGRvdWJsZSIsICAgICBmbG9hdF9jb25zLCAneCd9LAotICB7InBhY2tlZCIsICAgICAgZmxvYXRfY29ucywgJ3AnfSwKLSAgezAsIDAsIDB9Ci19OwotCi0vKiBTdHVmZiBuZWVkZWQgdG8gcmVzb2x2ZSB0aGUgbGFiZWwgYW1iaWd1aXR5Ci0gICBBczoKLSAgICAgLi4uCi0gICAgIGxhYmVsOiAgIDxpbnNuPgotICAgbWF5IGRpZmZlciBmcm9tOgotICAgICAuLi4KLSAgICAgbGFiZWw6Ci0gICAgICAgICAgICAgIDxpbnNuPgotKi8KLQotc3ltYm9sUyAqICBsYXN0X2xhYmVsX3NlZW47Ci1zdGF0aWMgaW50IGxhYmVsX2lzX3RodW1iX2Z1bmN0aW9uX25hbWUgPSBmYWxzZTsKLQotLyogTGl0ZXJhbCBzdHVmZiAqLwotCi0jZGVmaW5lIE1BWF9MSVRFUkFMX1BPT0xfU0laRSAxMDI0Ci0KLXR5cGVkZWYgc3RydWN0IGxpdGVyYWxTCi17Ci0gIHN0cnVjdCBleHByZXNzaW9uUyAgZXhwOwotICBzdHJ1Y3QgYXJtX2l0ICogICAgIGluc3Q7Ci19IGxpdGVyYWxUOwotCi1saXRlcmFsVCAgbGl0ZXJhbHNbTUFYX0xJVEVSQUxfUE9PTF9TSVpFXTsKLWludCAgICAgICBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSA9IDA7IC8qIE5leHQgZnJlZSBlbnRyeSBpbiB0aGUgcG9vbCAqLwotaW50ICAgICAgIGxpdF9wb29sX251bSA9IDE7IC8qIE5leHQgbGl0ZXJhbCBwb29sIG51bWJlciAqLwotc3ltYm9sUyAqIGN1cnJlbnRfcG9vbFAgPSBOVUxMOwotc3ltYm9sUyAqIHN5bWJvbF9tYWtlX2VtcHR5IFBBUkFNUyAoKHZvaWQpKTsgCi0KLXN0YXRpYyBpbnQKLWFkZF90b19saXRfcG9vbCAoKQotewotICBpbnQgbGl0X2NvdW50ID0gMDsKLQotICBpZiAoY3VycmVudF9wb29sUCA9PSBOVUxMKQotICAgIGN1cnJlbnRfcG9vbFAgPSBzeW1ib2xfbWFrZV9lbXB0eSAoKTsKLQotICAvKiBDaGVjayBpZiB0aGlzIGxpdGVyYWwgdmFsdWUgaXMgYWxyZWFkeSBpbiB0aGUgcG9vbDogKi8KLSAgd2hpbGUgKGxpdF9jb3VudCA8IG5leHRfbGl0ZXJhbF9wb29sX3BsYWNlKQotICAgIHsKLSAgICAgIGlmIChsaXRlcmFsc1tsaXRfY291bnRdLmV4cC5YX29wID09IGluc3QucmVsb2MuZXhwLlhfb3AKLSAgICAgICAgICAmJiBpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fY29uc3RhbnQKLSAgICAgICAgICAmJiBsaXRlcmFsc1tsaXRfY291bnRdLmV4cC5YX2FkZF9udW1iZXIgPT0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyCi0gICAgICAgICAgJiYgbGl0ZXJhbHNbbGl0X2NvdW50XS5leHAuWF91bnNpZ25lZCA9PSBpbnN0LnJlbG9jLmV4cC5YX3Vuc2lnbmVkKQotICAgICAgICBicmVhazsKLSAgICAgIGxpdF9jb3VudCsrOwotICAgIH0KLQotICBpZiAobGl0X2NvdW50ID09IG5leHRfbGl0ZXJhbF9wb29sX3BsYWNlKSAvKiBuZXcgZW50cnkgKi8KLSAgICB7Ci0gICAgICBpZiAobmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UgPiBNQVhfTElURVJBTF9QT09MX1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnN0LmVycm9yID0gXygiTGl0ZXJhbCBQb29sIE92ZXJmbG93Iik7Ci0gICAgICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgICAgIH0KLQotICAgICAgbGl0ZXJhbHNbbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2VdLmV4cCA9IGluc3QucmVsb2MuZXhwOwotICAgICAgbGl0X2NvdW50ID0gbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UrKzsKLSAgICB9Ci0KLSAgaW5zdC5yZWxvYy5leHAuWF9vcCA9IE9fc3ltYm9sOwotICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgPSAobGl0X2NvdW50KSAqIDQgLSA4OwotICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9zeW1ib2wgPSBjdXJyZW50X3Bvb2xQOwotCi0gIHJldHVybiBTVUNDRVNTOwotfQotIAotLyogQ2FuJ3QgdXNlIHN5bWJvbF9uZXcgaGVyZSwgc28gaGF2ZSB0byBjcmVhdGUgYSBzeW1ib2wgYW5kIHRoZW4gYXQKLSAgIGEgbGF0ZXIgZGF0ZSBhc3NpZ24gaXQgYSB2YWx1ZS4gVGhhdHMgd2hhdCB0aGVzZSBmdW5jdGlvbnMgZG8uICAqLwotc3RhdGljIHZvaWQKLXN5bWJvbF9sb2NhdGUgKHN5bWJvbFAsIG5hbWUsIHNlZ21lbnQsIHZhbHUsIGZyYWcpCi0gICAgIHN5bWJvbFMgKiAgICBzeW1ib2xQOyAKLSAgICAgQ09OU1QgY2hhciAqIG5hbWU7CQkvKiBJdCBpcyBjb3BpZWQsIHRoZSBjYWxsZXIgY2FuIG1vZGlmeSAqLwotICAgICBzZWdUICAgICAgICAgc2VnbWVudDsJLyogU2VnbWVudCBpZGVudGlmaWVyIChTRUdfPHNvbWV0aGluZz4pICovCi0gICAgIHZhbHVlVCAgICAgICB2YWx1OwkJLyogU3ltYm9sIHZhbHVlICovCi0gICAgIGZyYWdTICogICAgICBmcmFnOwkJLyogQXNzb2NpYXRlZCBmcmFnbWVudCAqLwotewotICB1bnNpZ25lZCBpbnQgbmFtZV9sZW5ndGg7Ci0gIGNoYXIgKiBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lOwotCi0gIG5hbWVfbGVuZ3RoID0gc3RybGVuIChuYW1lKSArIDE7ICAgICAgLyogKzEgZm9yIFwwICovCi0gIG9ic3RhY2tfZ3JvdyAoJm5vdGVzLCBuYW1lLCBuYW1lX2xlbmd0aCk7Ci0gIHByZXNlcnZlZF9jb3B5X29mX25hbWUgPSBvYnN0YWNrX2ZpbmlzaCAoJm5vdGVzKTsKLSNpZmRlZiBTVFJJUF9VTkRFUlNDT1JFCi0gIGlmIChwcmVzZXJ2ZWRfY29weV9vZl9uYW1lWzBdID09ICdfJykKLSAgICBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lKys7Ci0jZW5kaWYKLQotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lID0KLSAgICB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHByZXNlcnZlZF9jb3B5X29mX25hbWUpOwotI2VuZGlmCi0KLSAgU19TRVRfTkFNRSAoc3ltYm9sUCwgcHJlc2VydmVkX2NvcHlfb2ZfbmFtZSk7Ci0KLSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgc2VnbWVudCk7Ci0gIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCB2YWx1KTsKLSAgc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMoc3ltYm9sUCk7Ci0KLSAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWc7Ci0KLSAgLyogTGluayB0byBlbmQgb2Ygc3ltYm9sIGNoYWluLiAgKi8KLSAgewotICAgIGV4dGVybiBpbnQgc3ltYm9sX3RhYmxlX2Zyb3plbjsKLSAgICBpZiAoc3ltYm9sX3RhYmxlX2Zyb3plbikKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgc3ltYm9sX2FwcGVuZCAoc3ltYm9sUCwgc3ltYm9sX2xhc3RQLCAmIHN5bWJvbF9yb290UCwgJiBzeW1ib2xfbGFzdFApOwotCi0gIG9ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApOwotCi0jaWZkZWYgdGNfc3ltYm9sX25ld19ob29rCi0gIHRjX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCk7Ci0jZW5kaWYKLSAKLSNpZmRlZiBERUJVR19TWU1TCi0gIHZlcmlmeV9zeW1ib2xfY2hhaW4gKHN5bWJvbF9yb290UCwgc3ltYm9sX2xhc3RQKTsKLSNlbmRpZiAvKiBERUJVR19TWU1TICovCi19Ci0KLXN5bWJvbFMgKgotc3ltYm9sX21ha2VfZW1wdHkgKCkgCi17Ci0gIHN5bWJvbFMgKiBzeW1ib2xQOyAKLQotICBzeW1ib2xQID0gKHN5bWJvbFMgKikgb2JzdGFja19hbGxvYyAoJm5vdGVzLCBzaXplb2YgKHN5bWJvbFMpKTsKLQotICAvKiBzeW1ib2wgbXVzdCBiZSBib3JuIGluIHNvbWUgZml4ZWQgc3RhdGUuICBUaGlzIHNlZW1zIGFzIGdvb2QgYXMgYW55LiAqLwotICBtZW1zZXQgKHN5bWJvbFAsIDAsIHNpemVvZiAoc3ltYm9sUykpOwotCi0gIHN5bWJvbFAtPmJzeW0gPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKHN0ZG91dHB1dCk7Ci0gIGFzc2VydCAoc3ltYm9sUC0+YnN5bSAhPSAwKTsKLSAgc3ltYm9sUC0+YnN5bS0+dWRhdGEucCA9IChQVFIpIHN5bWJvbFA7Ci0KLSAgcmV0dXJuIHN5bWJvbFA7Ci19Ci0KLS8qIENoZWNrIHRoYXQgYW4gaW1tZWRpYXRlIGlzIHZhbGlkLCBhbmQgaWYgc28sIGNvbnZlcnQgaXQgdG8gdGhlIHJpZ2h0IGZvcm1hdC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXZhbGlkYXRlX2ltbWVkaWF0ZSAodmFsKQotICAgICB1bnNpZ25lZCBpbnQgdmFsOwotewotICB1bnNpZ25lZCBpbnQgYTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIAotI2RlZmluZSByb3RhdGVfbGVmdCh2LCBuKSAodiA8PCBuIHwgdiA+PiAoMzIgLSBuKSkKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSArPSAyKQotICAgIGlmICgoYSA9IHJvdGF0ZV9sZWZ0ICh2YWwsIGkpKSA8PSAweGZmKQotICAgICAgcmV0dXJuIGEgfCAoaSA8PCA3KTsgLyogMTItYml0IHBhY2s6IFtzaGlmdC1jbnQsY29uc3RdICovCi0gIAotICByZXR1cm4gRkFJTDsKLX0KLQotc3RhdGljIGludAotdmFsaWRhdGVfb2Zmc2V0X2ltbSAodmFsLCBod3NlKQotICAgICBpbnQgdmFsOwotICAgICBpbnQgaHdzZTsKLXsKLSAgaWYgKChod3NlICYmICh2YWwgPCAtMjU1IHx8IHZhbCA+IDI1NSkpCi0gICAgICB8fCAodmFsIDwgLTQwOTUgfHwgdmFsID4gNDA5NSkpCi0gICAgIHJldHVybiBGQUlMOwotICByZXR1cm4gdmFsOwotfQotCi0gICAgCi1zdGF0aWMgdm9pZAotc19yZXEgKGEpCi0gICAgIGludCBhOwotewotICBhc19iYWQgKF8oIkludmFsaWQgc3ludGF4IGZvciAucmVxIGRpcmVjdGl2ZS4iKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2JzcyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiBXZSBkb24ndCBzdXBwb3J0IHB1dHRpbmcgZnJhZ3MgaW4gdGhlIEJTUyBzZWdtZW50LCB3ZSBmYWtlIGl0IGJ5Ci0gICAgIG1hcmtpbmcgaW5fYnNzLCB0aGVuIGxvb2tpbmcgYXQgc19za2lwIGZvciBjbHVlcz8uLiAqLwotICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2V2ZW4gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKCFuZWVkX3Bhc3NfMikJCS8qIE5ldmVyIG1ha2UgZnJhZyBpZiBleHBlY3QgZXh0cmEgcGFzcy4gKi8KLSAgICBmcmFnX2FsaWduICgxLCAwLCAwKTsKLSAgCi0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDEpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfbHRvcmcgKGludGVybmFsKQotICAgICBpbnQgaW50ZXJuYWw7Ci17Ci0gIGludCBsaXRfY291bnQgPSAwOwotICBjaGFyIHN5bV9uYW1lWzIwXTsKLQotICBpZiAoY3VycmVudF9wb29sUCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KLSAgICAgIGlmICghaW50ZXJuYWwpCi0JYXNfdHNrdHNrIChfKCJOb3RoaW5nIHRvIHB1dCBpbiB0aGUgcG9vbFxuIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBBbGlnbiBwb29sIGFzIHlvdSBoYXZlIHdvcmQgYWNjZXNzZXMgKi8KLSAgLyogT25seSBtYWtlIGEgZnJhZyBpZiB3ZSBoYXZlIHRvIC4uLiAqLwotICBpZiAoIW5lZWRfcGFzc18yKQotICAgIGZyYWdfYWxpZ24gKDIsIDAsIDApOwotCi0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDIpOwotCi0gIGlmIChpbnRlcm5hbCkKLSAgICBhc190c2t0c2sgKF8oIkluc2VydGluZyBpbXBsaWNpdCBwb29sIGF0IGNoYW5nZSBvZiBzZWN0aW9uIikpOwotCi0gIHNwcmludGYgKHN5bV9uYW1lLCAiJCRsaXRfXDAwMiV4IiwgbGl0X3Bvb2xfbnVtKyspOwotCi0gIHN5bWJvbF9sb2NhdGUgKGN1cnJlbnRfcG9vbFAsIHN5bV9uYW1lLCBub3dfc2VnLAotCQkgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLCBmcmFnX25vdyk7Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKGN1cnJlbnRfcG9vbFApOwotCi0gIEFSTV9TRVRfVEhVTUIgKGN1cnJlbnRfcG9vbFAsIHRodW1iX21vZGUpOwotICAKLSNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgotICBBUk1fU0VUX0lOVEVSV09SSyAoY3VycmVudF9wb29sUCwgc3VwcG9ydF9pbnRlcndvcmspOwotI2VuZGlmCi0gIAotICB3aGlsZSAobGl0X2NvdW50IDwgbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UpCi0gICAgLyogRmlyc3Qgb3V0cHV0IHRoZSBleHByZXNzaW9uIGluIHRoZSBpbnN0cnVjdGlvbiB0byB0aGUgcG9vbCAqLwotICAgIGVtaXRfZXhwciAoJihsaXRlcmFsc1tsaXRfY291bnQrK10uZXhwKSwgNCk7IC8qIC53b3JkICovCi0KLSAgbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UgPSAwOwotICBjdXJyZW50X3Bvb2xQID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLXNfYWxpZ24gKHVudXNlZCkJLyogU2FtZSBhcyBzX2FsaWduX3B0d28gYnV0IGFsaWduIDAgPT4gYWxpZ24gMiAqLwotICAgICBpbnQgdW51c2VkOwotewotICByZWdpc3RlciBpbnQgdGVtcDsKLSAgcmVnaXN0ZXIgbG9uZyB0ZW1wX2ZpbGw7Ci0gIGxvbmcgbWF4X2FsaWdubWVudCA9IDE1OwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKHRlbXAgPiBtYXhfYWxpZ25tZW50KQotICAgIGFzX2JhZCAoXygiQWxpZ25tZW50IHRvbyBsYXJnZTogJWQuIGFzc3VtZWQuIiksIHRlbXAgPSBtYXhfYWxpZ25tZW50KTsKLSAgZWxzZSBpZiAodGVtcCA8IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJBbGlnbm1lbnQgbmVnYXRpdmUuIDAgYXNzdW1lZC4iKSk7Ci0gICAgICB0ZW1wID0gMDsKLSAgICB9Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgdGVtcF9maWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgdGVtcF9maWxsID0gMDsKLQotICBpZiAoIXRlbXApCi0gICAgdGVtcCA9IDI7Ci0KLSAgLyogT25seSBtYWtlIGEgZnJhZyBpZiB3ZSBIQVZFIHRvLiAuIC4gKi8KLSAgaWYgKHRlbXAgJiYgIW5lZWRfcGFzc18yKQotICAgIGZyYWdfYWxpZ24gKHRlbXAsIChpbnQpIHRlbXBfZmlsbCwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgdGVtcCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2ZvcmNlX3RodW1iIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIElmIHdlIGFyZSBub3QgYWxyZWFkeSBpbiB0aHVtYiBtb2RlIGdvIGludG8gaXQsIEVWRU4gaWYKLSAgICAgdGhlIHRhcmdldCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCB0aHVtYiBpbnN0cnVjdGlvbnMuCi0gICAgIFRoaXMgaXMgdXNlZCBieSBnY2MvY29uZmlnL2FybS9saWIxZnVuY3MuYXNtIGZvciBleGFtcGxlCi0gICAgIHRvIGNvbXBpbGUgaW50ZXJ3b3JraW5nIHN1cHBvcnQgZnVuY3Rpb25zIGV2ZW4gaWYgdGhlCi0gICAgIHRhcmdldCBwcm9jZXNzb3Igc2hvdWxkIG5vdCBzdXBwb3J0IGludGVyd29ya2luZy4gICovCi0gICAgIAotICBpZiAoISB0aHVtYl9tb2RlKQotICAgIHsKLSAgICAgIHRodW1iX21vZGUgPSAxOwotICAgICAgCi0gICAgICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAxKTsKLSAgICB9Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc190aHVtYl9mdW5jIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIFRoZSBmb2xsb3dpbmcgbGFiZWwgaXMgdGhlIG5hbWUvYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgYSBUaHVtYiBmdW5jdGlvbi4KLSAgICAgV2UgbmVlZCB0byBrbm93IHRoaXMgZm9yIHRoZSBpbnRlcndvcmtpbmcgc3VwcG9ydC4gICovCi0KLSAgbGFiZWxfaXNfdGh1bWJfZnVuY3Rpb25fbmFtZSA9IHRydWU7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb3Bjb2RlX3NlbGVjdCAod2lkdGgpCi0gICAgIGludCB3aWR0aDsKLXsKLSAgc3dpdGNoICh3aWR0aCkKLSAgICB7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmICghIHRodW1iX21vZGUpCi0JewotCSAgaWYgKCEgKGNwdV92YXJpYW50ICYgQVJNX1RIVU1CKSkKLQkgICAgYXNfYmFkIChfKCJzZWxlY3RlZCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBUSFVNQiBvcGNvZGVzIikpOwotCSAgdGh1bWJfbW9kZSA9IDE7Ci0gICAgICAgICAgLyogTm8gbmVlZCB0byBmb3JjZSB0aGUgYWxpZ25tZW50LCBzaW5jZSB3ZSB3aWxsIGhhdmUgYmVlbgotICAgICAgICAgICAgIGNvbWluZyBmcm9tIEFSTSBtb2RlLCB3aGljaCBpcyB3b3JkLWFsaWduZWQuICovCi0gICAgICAgICAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMSk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDMyOgotICAgICAgaWYgKHRodW1iX21vZGUpCi0JewotICAgICAgICAgIGlmICgoY3B1X3ZhcmlhbnQgJiBBUk1fQU5ZKSA9PSBBUk1fVEhVTUIpCi0JICAgIGFzX2JhZCAoXygic2VsZWN0ZWQgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgQVJNIG9wY29kZXMiKSk7Ci0JICB0aHVtYl9tb2RlID0gMDsKLSAgICAgICAgICBpZiAoIW5lZWRfcGFzc18yKQotICAgICAgICAgICAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7Ci0gICAgICAgICAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMSk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIGluc3RydWN0aW9uIHNpemUgc2VsZWN0ZWQgKCVkKSIpLCB3aWR0aCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc19hcm0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgb3Bjb2RlX3NlbGVjdCAoMzIpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc190aHVtYiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBvcGNvZGVfc2VsZWN0ICgxNik7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2NvZGUgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzd2l0Y2ggKHRlbXApCi0gICAgewotICAgIGNhc2UgMTY6Ci0gICAgY2FzZSAzMjoKLSAgICAgIG9wY29kZV9zZWxlY3QgKHRlbXApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIG9wZXJhbmQgdG8gLmNvZGUgZGlyZWN0aXZlICglZCkgKGV4cGVjdGluZyAxNiBvciAzMikiKSwgdGVtcCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZW5kX29mX2xpbmUgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmICgqc3RyICE9ICdcMCcpCi0gICAgaW5zdC5lcnJvciA9IF8oIkdhcmJhZ2UgZm9sbG93aW5nIGluc3RydWN0aW9uIik7Ci19Ci0KLXN0YXRpYyBpbnQKLXNraXBfcGFzdF9jb21tYSAoc3RyKQotICAgICBjaGFyICoqIHN0cjsKLXsKLSAgY2hhciAqcCA9ICpzdHIsIGM7Ci0gIGludCBjb21tYSA9IDA7Ci0gICAgCi0gIHdoaWxlICgoYyA9ICpwKSA9PSAnICcgfHwgYyA9PSAnLCcpCi0gICAgewotICAgICAgcCsrOwotICAgICAgaWYgKGMgPT0gJywnICYmIGNvbW1hKyspCi0JcmV0dXJuIEZBSUw7Ci0gICAgfQotCi0gIGlmIChjID09ICdcMCcpCi0gICAgcmV0dXJuIEZBSUw7Ci0KLSAgKnN0ciA9IHA7Ci0gIHJldHVybiBjb21tYSA/IFNVQ0NFU1MgOiBGQUlMOwotfQotCi0vKiBBIHN0YW5kYXJkIHJlZ2lzdGVyIG11c3QgYmUgZ2l2ZW4gYXQgdGhpcyBwb2ludC4gIFNoaWZ0IGlzIHRoZSBwbGFjZSB0bwotICAgcHV0IGl0IGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLQotc3RhdGljIGludAotcmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgc2hpZnQpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgICAgIHNoaWZ0OwotewotICBzdGF0aWMgY2hhciBidWZmIFsxMjhdOyAvKiBYWFggKi8KLSAgaW50ICAgIHJlZzsKLSAgY2hhciAqIHN0YXJ0ID0gKnN0cjsKLQotICBpZiAoKHJlZyA9IGFybV9yZWdfcGFyc2UgKHN0cikpICE9IEZBSUwgJiYgaW50X3JlZ2lzdGVyIChyZWcpKQotICAgIHsKLSAgICAgIGlmIChzaGlmdCA+PSAwKQotCWluc3QuaW5zdHJ1Y3Rpb24gfD0gcmVnIDw8IHNoaWZ0OwotICAgICAgcmV0dXJuIHJlZzsKLSAgICB9Ci0KLSAgLyogUmVzdG9yZSB0aGUgc3RhcnQgcG9pbnQsIHdlIG1heSBoYXZlIGdvdCBhIHJlZyBvZiB0aGUgd3JvbmcgY2xhc3MuICAqLwotICAqc3RyID0gc3RhcnQ7Ci0gIAotICAvKiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0gICAgIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4gKi8KLSAgc3ByaW50ZiAoYnVmZiwgXygiUmVnaXN0ZXIgZXhwZWN0ZWQsIG5vdCAnJS4xMDBzJyIpLCBzdGFydCk7Ci0gIGluc3QuZXJyb3IgPSBidWZmOwotCi0gIHJldHVybiBGQUlMOwotfQotCi1zdGF0aWMgaW50Ci1wc3JfcmVxdWlyZWRfaGVyZSAoc3RyLCBjcHNyLCBzcHNyKQotICAgICBjaGFyICoqIHN0cjsKLSAgICAgaW50ICAgICBjcHNyOwotICAgICBpbnQgICAgIHNwc3I7Ci17Ci0gIGludCAgICBwc3I7Ci0gIGNoYXIgKiBzdGFydCA9ICpzdHI7Ci0gIHBzciA9IGFybV9wc3JfcGFyc2UgKHN0cik7Ci0gIAotICBpZiAgKHBzciA9PSBjcHNyIHx8IHBzciA9PSBzcHNyKQotICAgIHsKLSAgICAgIGlmIChwc3IgPT0gc3BzcikKLQlpbnN0Lmluc3RydWN0aW9uIHw9IDEgPDwgMjI7Ci0gICAgICAKLSAgICAgIHJldHVybiBTVUNDRVNTOwotICAgIH0KLQotICAvKiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0gICAgIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4gKi8KLSAgaW5zdC5lcnJvciA9IF8oIjxwc3IoZik+IGV4cGVjdGVkIik7Ci0KLSAgLyogUmVzdG9yZSB0aGUgc3RhcnQgcG9pbnQuICAqLwotICAqc3RyID0gc3RhcnQ7Ci0gIHJldHVybiBGQUlMOwotfQotCi1zdGF0aWMgaW50Ci1jb19wcm9jX251bWJlciAoc3RyKQotICAgICBjaGFyICoqc3RyOwotewotICBpbnQgcHJvY2Vzc29yLCBwY2hhcjsKLQotICB3aGlsZSAoKipzdHIgPT0gJyAnKQotICAgICgqc3RyKSsrOwotCi0gIC8qIFRoZSBkYXRhIHNoZWV0IHNlZW1zIHRvIGltcGx5IHRoYXQganVzdCBhIG51bWJlciBvbiBpdHMgb3duIGlzIHZhbGlkCi0gICAgIGhlcmUsIGJ1dCB0aGUgUklTQyBpWCBhc3NlbWJsZXIgc2VlbXMgdG8gYWNjZXB0IGEgcHJlZml4ICdwJy4gIFdlIHdpbGwKLSAgICAgYWNjZXB0IGVpdGhlci4gICovCi0gIGlmICgqKnN0ciA9PSAncCcgfHwgKipzdHIgPT0gJ1AnKQotICAgICgqc3RyKSsrOwotCi0gIHBjaGFyID0gKigqc3RyKSsrOwotICBpZiAocGNoYXIgPj0gJzAnICYmIHBjaGFyIDw9ICc5JykKLSAgICB7Ci0gICAgICBwcm9jZXNzb3IgPSBwY2hhciAtICcwJzsKLSAgICAgIGlmICgqKnN0ciA+PSAnMCcgJiYgKipzdHIgPD0gJzknKQotCXsKLQkgIHByb2Nlc3NvciA9IHByb2Nlc3NvciAqIDEwICsgKigqc3RyKSsrIC0gJzAnOwotCSAgaWYgKHByb2Nlc3NvciA+IDE1KQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIklsbGVnYWwgY28tcHJvY2Vzc29yIG51bWJlciIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJCYWQgb3IgbWlzc2luZyBjby1wcm9jZXNzb3IgbnVtYmVyIik7Ci0gICAgICByZXR1cm4gRkFJTDsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBwcm9jZXNzb3IgPDwgODsKLSAgcmV0dXJuIFNVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLWNwX29wY19leHByIChzdHIsIHdoZXJlLCBsZW5ndGgpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgd2hlcmU7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cHI7Ci0KLSAgd2hpbGUgKCoqc3RyID09ICcgJykKLSAgICAoKnN0cikrKzsKLQotICBtZW1zZXQgKCZleHByLCAnXDAnLCBzaXplb2YgKGV4cHIpKTsKLQotICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZleHByLCBzdHIpKQotICAgIHJldHVybiBGQUlMOwotICBpZiAoZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oImJhZCBvciBtaXNzaW5nIGV4cHJlc3Npb24iKTsKLSAgICAgIHJldHVybiBGQUlMOwotICAgIH0KLQotICBpZiAoKGV4cHIuWF9hZGRfbnVtYmVyICYgKCgxIDw8IGxlbmd0aCkgLSAxKSkgIT0gZXhwci5YX2FkZF9udW1iZXIpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSBjby1wcm9jZXNzb3IgZXhwcmVzc2lvbiB0b28gbGFyZ2UiKTsKLSAgICAgIHJldHVybiBGQUlMOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGV4cHIuWF9hZGRfbnVtYmVyIDw8IHdoZXJlOwotICByZXR1cm4gU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludAotY3BfcmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgd2hlcmUpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgICAgIHdoZXJlOwotewotICBpbnQgICAgcmVnOwotICBjaGFyICogc3RhcnQgPSAqc3RyOwotCi0gIGlmICgocmVnID0gYXJtX3JlZ19wYXJzZSAoc3RyKSkgIT0gRkFJTCAmJiBjcF9yZWdpc3RlciAocmVnKSkKLSAgICB7Ci0gICAgICByZWcgJj0gMTU7Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IHJlZyA8PCB3aGVyZTsKLSAgICAgIHJldHVybiByZWc7Ci0gICAgfQotCi0gIC8qIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKLSAgICAgdGhpcyBlcnJvciBjYW4gYmUgb3ZlcnJpZGRlbiAqLwotICBpbnN0LmVycm9yID0gXygiQ28tcHJvY2Vzc29yIHJlZ2lzdGVyIGV4cGVjdGVkIik7Ci0KLSAgLyogUmVzdG9yZSB0aGUgc3RhcnQgcG9pbnQgKi8KLSAgKnN0ciA9IHN0YXJ0OwotICByZXR1cm4gRkFJTDsKLX0KLQotc3RhdGljIGludAotZnBfcmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgd2hlcmUpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgICAgIHdoZXJlOwotewotICBpbnQgcmVnOwotICBjaGFyICogc3RhcnQgPSAqc3RyOwotCi0gIGlmICgocmVnID0gYXJtX3JlZ19wYXJzZSAoc3RyKSkgIT0gRkFJTCAmJiBmcF9yZWdpc3RlciAocmVnKSkKLSAgICB7Ci0gICAgICByZWcgJj0gNzsKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gcmVnIDw8IHdoZXJlOwotICAgICAgcmV0dXJuIHJlZzsKLSAgICB9Ci0KLSAgLyogSW4gdGhlIGZldyBjYXNlcyB3aGVyZSB3ZSBtaWdodCBiZSBhYmxlIHRvIGFjY2VwdCBzb21ldGhpbmcgZWxzZQotICAgICB0aGlzIGVycm9yIGNhbiBiZSBvdmVycmlkZGVuICovCi0gIGluc3QuZXJyb3IgPSBfKCJGbG9hdGluZyBwb2ludCByZWdpc3RlciBleHBlY3RlZCIpOwotCi0gIC8qIFJlc3RvcmUgdGhlIHN0YXJ0IHBvaW50ICovCi0gICpzdHIgPSBzdGFydDsKLSAgcmV0dXJuIEZBSUw7Ci19Ci0KLXN0YXRpYyBpbnQKLWNwX2FkZHJlc3Nfb2Zmc2V0IChzdHIpCi0gICAgIGNoYXIgKiogc3RyOwotewotICBpbnQgb2Zmc2V0OwotCi0gIHdoaWxlICgqKnN0ciA9PSAnICcpCi0gICAgKCpzdHIpKys7Ci0KLSAgaWYgKCEgaXNfaW1tZWRpYXRlX3ByZWZpeCAoKipzdHIpKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJpbW1lZGlhdGUgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotCi0gICgqc3RyKSsrOwotICAKLSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmIGluc3QucmVsb2MuZXhwLCBzdHIpKQotICAgIHJldHVybiBGQUlMOwotICAKLSAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBvZmZzZXQgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0gICAgICAKLSAgICAgIGlmIChvZmZzZXQgJiAzKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJjby1wcm9jZXNzb3IgYWRkcmVzcyBtdXN0IGJlIHdvcmQgYWxpZ25lZCIpOwotCSAgcmV0dXJuIEZBSUw7Ci0JfQotCi0gICAgICBpZiAob2Zmc2V0ID4gMTAyMyB8fCBvZmZzZXQgPCAtMTAyMykKLQl7Ci0JICBpbnN0LmVycm9yID0gXygib2Zmc2V0IHRvbyBsYXJnZSIpOwotCSAgcmV0dXJuIEZBSUw7Ci0JfQotCi0gICAgICBpZiAob2Zmc2V0ID49IDApCi0JaW5zdC5pbnN0cnVjdGlvbiB8PSBJTkRFWF9VUDsKLSAgICAgIGVsc2UKLQlvZmZzZXQgPSAtb2Zmc2V0OwotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IG9mZnNldCA+PiAyOwotICAgIH0KLSAgZWxzZQotICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTTsKLQotICByZXR1cm4gU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludAotY3BfYWRkcmVzc19yZXF1aXJlZF9oZXJlIChzdHIpCi0gICAgIGNoYXIgKiogc3RyOwotewotICBjaGFyICogcCA9ICogc3RyOwotICBpbnQgICAgcHJlX2luYyA9IDA7Ci0gIGludCAgICB3cml0ZV9iYWNrID0gMDsKLQotICBpZiAoKnAgPT0gJ1snKQotICAgIHsKLSAgICAgIGludCByZWc7Ci0KLSAgICAgIHArKzsKLSAgICAgIHdoaWxlICgqcCA9PSAnICcpCi0JcCsrOwotCi0gICAgICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmIHAsIDE2KSkgPT0gRkFJTCkKLQlyZXR1cm4gRkFJTDsKLQotICAgICAgd2hpbGUgKCpwID09ICcgJykKLQlwKys7Ci0KLSAgICAgIGlmICgqcCA9PSAnXScpCi0JewotCSAgcCsrOwotCSAgCi0JICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmIHApID09IFNVQ0NFU1MpCi0JICAgIHsKLQkgICAgICAvKiBbUm5dLCAjZXhwciAqLwotCSAgICAgIHdyaXRlX2JhY2sgPSBXUklURV9CQUNLOwotCSAgICAgIAotCSAgICAgIGlmIChyZWcgPT0gUkVHX1BDKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oInBjIG1heSBub3QgYmUgdXNlZCBpbiBwb3N0LWluY3JlbWVudCIpOwotCQkgIHJldHVybiBGQUlMOwotCQl9Ci0KLQkgICAgICBpZiAoY3BfYWRkcmVzc19vZmZzZXQgKCYgcCkgPT0gRkFJTCkKLQkJcmV0dXJuIEZBSUw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgcHJlX2luYyA9IFBSRV9JTkRFWCB8IElOREVYX1VQOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiAnWydSbiwgI2V4cHInXSdbIV0gKi8KLQotCSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJiBwKSA9PSBGQUlMKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oInByZS1pbmRleGVkIGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLQkgICAgICByZXR1cm4gRkFJTDsKLQkgICAgfQotCi0JICBwcmVfaW5jID0gUFJFX0lOREVYOwotCSAgCi0JICBpZiAoY3BfYWRkcmVzc19vZmZzZXQgKCYgcCkgPT0gRkFJTCkKLQkgICAgcmV0dXJuIEZBSUw7Ci0KLQkgIHdoaWxlICgqcCA9PSAnICcpCi0JICAgIHArKzsKLQotCSAgaWYgKCpwKysgIT0gJ10nKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIm1pc3NpbmcgXSIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0KLQkgIHdoaWxlICgqcCA9PSAnICcpCi0JICAgIHArKzsKLQotCSAgaWYgKCpwID09ICchJykKLQkgICAgewotCSAgICAgIGlmIChyZWcgPT0gUkVHX1BDKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oInBjIG1heSBub3QgYmUgdXNlZCB3aXRoIHdyaXRlLWJhY2siKTsKLQkJICByZXR1cm4gRkFJTDsKLQkJfQotCi0JICAgICAgcCsrOwotCSAgICAgIHdyaXRlX2JhY2sgPSBXUklURV9CQUNLOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmcCkpCi0JcmV0dXJuIEZBSUw7Ci0KLSAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTTsKLSAgICAgIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciAtPSA4OyAgLyogUEMgcmVsIGFkanVzdCAqLwotICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUkVHX1BDIDw8IDE2KTsKLSAgICAgIHByZV9pbmMgPSBQUkVfSU5ERVg7Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gd3JpdGVfYmFjayB8IHByZV9pbmM7Ci0gICpzdHIgPSBwOwotICByZXR1cm4gU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQKLWRvX25vcCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgLyogRG8gbm90aGluZyByZWFsbHkgKi8KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsgLyogVGhpcyBpcyBwb2ludGxlc3MgKi8KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX21ycyAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICAvKiBPbmx5IG9uZSBzeW50YXggKi8KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBwc3JfcmVxdWlyZWRfaGVyZSAoJiBzdHIsIENQU1JfQUxMLCBTUFNSX0FMTCkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiPHBzcj4gZXhwZWN0ZWQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotLyogVGhyZWUgcG9zc2libGUgZm9ybXM6ICI8cHNyPiwgUm0iLCAiPHBzcmY+LCBSbSIsICI8cHNyZj4sICNleHByZXNzaW9uIiAqLwotc3RhdGljIHZvaWQKLWRvX21zciAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IHJlZzsKLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyICsrOwotCi0gIGlmIChwc3JfcmVxdWlyZWRfaGVyZSAoJnN0ciwgQ1BTUl9BTEwsIFNQU1JfQUxMKSA9PSBTVUNDRVNTKQotICAgIHsKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUFNSX0FMTDsKLQotICAgICAgLyogU3l0YXggc2hvdWxkIGJlICI8cHNyPiwgUm0iICovCi0gICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0JICB8fCAocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApKSA9PSBGQUlMKQotCXsKLQkgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHBzcl9yZXF1aXJlZF9oZXJlICgmIHN0ciwgQ1BTUl9GTEcsIFNQU1JfRkxHKSA9PSBTVUNDRVNTKQotCWluc3QuaW5zdHJ1Y3Rpb24gfD0gUFNSX0ZMQUdTOwotICAgICAgZWxzZSBpZiAocHNyX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCBDUFNSX0NUTCwgU1BTUl9DVEwpID09IFNVQ0NFU1MpCi0JaW5zdC5pbnN0cnVjdGlvbiB8PSBQU1JfQ09OVFJPTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0JICByZXR1cm47Ci0JfQotICAgICAgCi0gICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotCXsKLQkgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLQkgIHJldHVybjsKLQl9Ci0gICAgICAKLSAgICAgIC8qIFN5bnRheCBjb3VsZCBiZSAiPHBzcmY+LCBybSIsICI8cHNyZj4sICNleHByZXNzaW9uIiAqLwotICAgICAgCi0gICAgICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmIHN0ciwgMCkpICE9IEZBSUwpCi0JOwotICAgICAgLyogSW1tZWRpYXRlIGV4cHJlc3Npb24gKi8KLSAgICAgIGVsc2UgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCogc3RyKSkKLQl7Ci0JICBzdHIgKys7Ci0JICBpbnN0LmVycm9yID0gTlVMTDsKLQkgIAotCSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmIGluc3QucmVsb2MuZXhwLCAmIHN0cikpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygiUmVnaXN0ZXIgb3Igc2hpZnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBpZiAoaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sKQotCSAgICB7Ci0JICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9JTU1FRElBVEU7Ci0JICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCB2YWx1ZSA9IHZhbGlkYXRlX2ltbWVkaWF0ZSAoaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyKTsKLQkgICAgICBpZiAodmFsdWUgPT0gRkFJTCkKLQkJewotCQkgIGluc3QuZXJyb3IgPSBfKCJJbnZhbGlkIGNvbnN0YW50Iik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IHZhbHVlOwotCSAgICB9Ci0KLQkgIGZsYWdzIHw9IElOU1RfSU1NRURJQVRFOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiRXJyb3I6IHVucmVjb2duaXNlZCBzeW50YXggZm9yIHNlY29uZCBhcmd1bWVudCB0byBtc3IgaW5zdHJ1Y3Rpb24iKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGluc3QuZXJyb3IgPSBOVUxMOyAKLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotLyogTG9uZyBNdWx0aXBseSBQYXJzZXIKLSAgIFVNVUxMIFJkTG8sIFJkSGksIFJtLCBScwotICAgU01VTEwgUmRMbywgUmRIaSwgUm0sIFJzCi0gICBVTUxBTCBSZExvLCBSZEhpLCBSbSwgUnMKLSAgIFNNTEFMIFJkTG8sIFJkSGksIFJtLCBScwotKi8gICAKLXN0YXRpYyB2b2lkCi1kb19tdWxsIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgcmRsbywgcmRoaSwgcm0sIHJzOwotCi0gIC8qIG9ubHkgb25lIGZvcm1hdCAicmRsbywgcmRoaSwgcm0sIHJzIiAqLwotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChyZGxvID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChyZGhpID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChybSA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIHJkaGksIHJkbG8gYW5kIHJtIG11c3QgYWxsIGJlIGRpZmZlcmVudCAqLwotICBpZiAocmRsbyA9PSByZGhpIHx8IHJkbG8gPT0gcm0gfHwgcmRoaSA9PSBybSkKLSAgICBhc190c2t0c2sgKF8oInJkaGksIHJkbG8gYW5kIHJtIG11c3QgYWxsIGJlIGRpZmZlcmVudCIpKTsKLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocnMgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgOCkpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocmRoaSA9PSBSRUdfUEMgfHwgcmRoaSA9PSBSRUdfUEMgfHwgcmRoaSA9PSBSRUdfUEMgfHwgcmRoaSA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9wYzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAKLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX211bCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIGludCByZCwgcm07Ci0gIAotICAvKiBvbmx5IG9uZSBmb3JtYXQgInJkLCBybSwgcnMiICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoKHJkID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyZCA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9wYzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJtID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJtID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX3BjOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocm0gPT0gcmQpCi0gICAgYXNfdHNrdHNrIChfKCJyZCBhbmQgcm0gc2hvdWxkIGJlIGRpZmZlcmVudCBpbiBtdWwiKSk7Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJtID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDgpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJtID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX3BjOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbWxhIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IHJkLCBybTsKLQotICAvKiBvbmx5IG9uZSBmb3JtYXQgInJkLCBybSwgcnMsIHJuIiAqLwotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChyZCA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocmQgPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBiYWRfcGM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChybSA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChybSA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9wYzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJtID09IHJkKQotICAgIGFzX3Rza3RzayAoXygicmQgYW5kIHJtIHNob3VsZCBiZSBkaWZmZXJlbnQgaW4gbWxhIikpOwotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChyZCA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCA4KSkgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocm0gPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJkID09IFJFR19QQyB8fCBybSA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9wYzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotLyogUmV0dXJucyB0aGUgaW5kZXggaW50byBmcF92YWx1ZXMgb2YgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsIG9yIC0xIGlmCi0gICBub3QgaW4gdGhlIHRhYmxlLiAgKi8KLXN0YXRpYyBpbnQKLW15X2dldF9mbG9hdF9leHByZXNzaW9uIChzdHIpCi0gICAgIGNoYXIgKiogc3RyOwotewotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIGNoYXIgKiAgICAgICAgIHNhdmVfaW47Ci0gIGV4cHJlc3Npb25TICAgIGV4cDsKLSAgaW50ICAgICAgICAgICAgaTsKLSAgaW50ICAgICAgICAgICAgajsKLQotICBtZW1zZXQgKHdvcmRzLCAwLCBNQVhfTElUVExFTlVNUyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgLyogTG9vayBmb3IgYSByYXcgZmxvYXRpbmcgcG9pbnQgbnVtYmVyICovCi0gIGlmICgoc2F2ZV9pbiA9IGF0b2ZfaWVlZSAoKnN0ciwgJ3gnLCB3b3JkcykpICE9IE5VTEwKLSAgICAgICYmIChpc19lbmRfb2ZfbGluZSBbKGludCkoKnNhdmVfaW4pXSB8fCAqc2F2ZV9pbiA9PSAnXDAnKSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0ZMT0FUX1ZBTFM7IGkrKykKLQl7Ci0JICBmb3IgKGogPSAwOyBqIDwgTUFYX0xJVFRMRU5VTVM7IGorKykKLQkgICAgewotCSAgICAgIGlmICh3b3Jkc1tqXSAhPSBmcF92YWx1ZXNbaV1bal0pCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChqID09IE1BWF9MSVRUTEVOVU1TKQotCSAgICB7Ci0JICAgICAgKnN0ciA9IHNhdmVfaW47Ci0JICAgICAgcmV0dXJuIGk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFRyeSBhbmQgcGFyc2UgYSBtb3JlIGNvbXBsZXggZXhwcmVzc2lvbiwgdGhpcyB3aWxsIHByb2JhYmx5IGZhaWwKLSAgICAgdW5sZXNzIHRoZSBjb2RlIHVzZXMgYSBmbG9hdGluZyBwb2ludCBwcmVmaXggKGVnICIwZiIpICovCi0gIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9ICpzdHI7Ci0gIGlmIChleHByZXNzaW9uICgmZXhwKSA9PSBhYnNvbHV0ZV9zZWN0aW9uCi0gICAgICAmJiBleHAuWF9vcCA9PSBPX2JpZwotICAgICAgJiYgZXhwLlhfYWRkX251bWJlciA8IDApCi0gICAgewotICAgICAgLyogRklYTUU6IDUgPSBYX1BSRUNJU0lPTiwgc2hvdWxkIGJlICNkZWZpbmUnZCB3aGVyZSB3ZSBjYW4gdXNlIGl0LgotCSBEaXR0byBmb3IgMTUuICAqLwotICAgICAgaWYgKGdlbl90b193b3JkcyAod29yZHMsIDUsIChsb25nKTE1KSA9PSAwKQotCXsKLQkgIGZvciAoaSA9IDA7IGkgPCBOVU1fRkxPQVRfVkFMUzsgaSsrKQotCSAgICB7Ci0JICAgICAgZm9yIChqID0gMDsgaiA8IE1BWF9MSVRUTEVOVU1TOyBqKyspCi0JCXsKLQkJICBpZiAod29yZHNbal0gIT0gZnBfdmFsdWVzW2ldW2pdKQotCQkgICAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIGlmIChqID09IE1BWF9MSVRUTEVOVU1TKQotCQl7Ci0JCSAgKnN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotCQkgIHJldHVybiBpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICpzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gIHJldHVybiAtMTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgYW55dGhpbmcgaW4gdGhlIGV4cHJlc3Npb24gaXMgYSBiaWdudW0gKi8KLXN0YXRpYyBpbnQKLXdhbGtfbm9fYmlnbnVtcyAoc3ApCi0gICAgIHN5bWJvbFMgKiBzcDsKLXsKLSAgaWYgKHNwLT5zeV92YWx1ZS5YX29wID09IE9fYmlnKQotICAgIHJldHVybiAxOwotCi0gIGlmIChzcC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sKQotICAgIHsKLSAgICAgIHJldHVybiAod2Fsa19ub19iaWdudW1zIChzcC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sKQotCSAgICAgIHx8IChzcC0+c3lfdmFsdWUuWF9vcF9zeW1ib2wKLQkJICAmJiB3YWxrX25vX2JpZ251bXMgKHNwLT5zeV92YWx1ZS5YX29wX3N5bWJvbCkpKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW15X2dldF9leHByZXNzaW9uIChlcCwgc3RyKQotICAgICBleHByZXNzaW9uUyAqIGVwOwotICAgICBjaGFyICoqIHN0cjsKLXsKLSAgY2hhciAqIHNhdmVfaW47Ci0gIHNlZ1QgICBzZWc7Ci0gIAotICBzYXZlX2luID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSAqc3RyOwotICBzZWcgPSBleHByZXNzaW9uIChlcCk7Ci0KLSNpZmRlZiBPQkpfQU9VVAotICBpZiAoc2VnICE9IGFic29sdXRlX3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSB0ZXh0X3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSBkYXRhX3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSBic3Nfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IHVuZGVmaW5lZF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJiYWRfc2VnbWVudCIpOwotICAgICAgKnN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBHZXQgcmlkIG9mIGFueSBiaWdudW1zIG5vdywgc28gdGhhdCB3ZSBkb24ndCBnZW5lcmF0ZSBhbiBlcnJvciBmb3Igd2hpY2gKLSAgICAgd2UgY2FuJ3QgZXN0YWJsaXNoIGEgbGluZSBudW1iZXIgbGF0ZXIgb24uICBCaWcgbnVtYmVycyBhcmUgbmV2ZXIgdmFsaWQKLSAgICAgaW4gaW5zdHJ1Y3Rpb25zLCB3aGljaCBpcyB3aGVyZSB0aGlzIHJvdXRpbmUgaXMgYWx3YXlzIGNhbGxlZC4gICovCi0gIGlmIChlcC0+WF9vcCA9PSBPX2JpZwotICAgICAgfHwgKGVwLT5YX2FkZF9zeW1ib2wKLQkgICYmICh3YWxrX25vX2JpZ251bXMgKGVwLT5YX2FkZF9zeW1ib2wpCi0JICAgICAgfHwgKGVwLT5YX29wX3N5bWJvbAotCQkgICYmIHdhbGtfbm9fYmlnbnVtcyAoZXAtPlhfb3Bfc3ltYm9sKSkpKSkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiSW52YWxpZCBjb25zdGFudCIpOwotICAgICAgKnN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgKnN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIHVucmVzdHJpY3Qgc2hvdWxkIGJlIG9uZSBpZiA8c2hpZnQ+IDxyZWdpc3Rlcj4gaXMgcGVybWl0dGVkIGZvciB0aGlzCi0gICBpbnN0cnVjdGlvbiAqLwotCi1zdGF0aWMgaW50Ci1kZWNvZGVfc2hpZnQgKHN0ciwgdW5yZXN0cmljdCkKLSAgICAgY2hhciAqKiBzdHI7Ci0gICAgIGludCAgICAgdW5yZXN0cmljdDsKLXsKLSAgc3RydWN0IGFzbV9zaGlmdCAqIHNoZnQ7Ci0gIGNoYXIgKiBwOwotICBjaGFyICAgYzsKLSAgICAKLSAgd2hpbGUgKCoqc3RyID09ICcgJykKLSAgICAoKnN0cikrKzsKLSAgICAKLSAgZm9yIChwID0gKnN0cjsgaXNhbHBoYSAoKnApOyBwKyspCi0gICAgOwotCi0gIGlmIChwID09ICpzdHIpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIlNoaWZ0IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLSAgICAgIHJldHVybiBGQUlMOwotICAgIH0KLQotICBjID0gKnA7Ci0gICpwID0gJ1wwJzsKLSAgc2hmdCA9IChzdHJ1Y3QgYXNtX3NoaWZ0ICopIGhhc2hfZmluZCAoYXJtX3NoaWZ0X2hzaCwgKnN0cik7Ci0gICpwID0gYzsKLSAgaWYgKHNoZnQpCi0gICAgewotICAgICAgaWYgKCFzdHJuY21wICgqc3RyLCAicnJ4IiwgMykKLSAgICAgICAgICB8fCAhc3RybmNtcCAoKnN0ciwgIlJSWCIsIDMpKQotCXsKLQkgICpzdHIgPSBwOwotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBzaGZ0LT52YWx1ZTsKLQkgIHJldHVybiBTVUNDRVNTOwotCX0KLQotICAgICAgd2hpbGUgKCpwID09ICcgJykKLQlwKys7Ci0KLSAgICAgIGlmICh1bnJlc3RyaWN0ICYmIHJlZ19yZXF1aXJlZF9oZXJlICgmcCwgOCkgIT0gRkFJTCkKLQl7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IHNoZnQtPnZhbHVlIHwgU0hJRlRfQllfUkVHOwotCSAgKnN0ciA9IHA7Ci0JICByZXR1cm4gU1VDQ0VTUzsKLQl9Ci0gICAgICBlbHNlIGlmIChpc19pbW1lZGlhdGVfcHJlZml4ICgqIHApKQotCXsKLQkgIGluc3QuZXJyb3IgPSBOVUxMOwotCSAgcCsrOwotCSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZwKSkKLQkgICAgcmV0dXJuIEZBSUw7Ci0KLQkgIC8qIFZhbGlkYXRlIHNvbWUgc2ltcGxlICNleHByZXNzaW9ucyAqLwotCSAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIG51bSA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQotCSAgICAgIC8qIFJlamVjdCBvcGVyYXRpb25zIGdyZWF0ZXIgdGhhbiAzMiwgb3IgbHNsICMzMiAqLwotCSAgICAgIGlmIChudW0gPiAzMiB8fCAobnVtID09IDMyICYmIHNoZnQtPnZhbHVlID09IDApKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgaW1tZWRpYXRlIHNoaWZ0Iik7Ci0JCSAgcmV0dXJuIEZBSUw7Ci0JCX0KLQotCSAgICAgIC8qIFNoaWZ0cyBvZiB6ZXJvIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gbHNsICh3aGljaCBpcyB6ZXJvKSovCi0JICAgICAgaWYgKG51bSA9PSAwKQotCQl7Ci0JCSAgKnN0ciA9IHA7Ci0JCSAgcmV0dXJuIFNVQ0NFU1M7Ci0JCX0KLQotCSAgICAgIC8qIFNoaWZ0cyBvZiAzMiBhcmUgZW5jb2RlZCBhcyAwLCBmb3IgdGhvc2Ugc2hpZnRzIHRoYXQKLQkJIHN1cHBvcnQgaXQuICAqLwotCSAgICAgIGlmIChudW0gPT0gMzIpCi0JCW51bSA9IDA7Ci0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IChudW0gPDwgNykgfCBzaGZ0LT52YWx1ZTsKLQkgICAgICAqc3RyID0gcDsKLQkgICAgICByZXR1cm4gU1VDQ0VTUzsKLQkgICAgfQotCi0JICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1NISUZUX0lNTTsKLQkgIGluc3QucmVsb2MucGNfcmVsID0gMDsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gc2hmdC0+dmFsdWU7Ci0JICAqc3RyID0gcDsKLQkgIHJldHVybiBTVUNDRVNTOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnN0LmVycm9yID0gdW5yZXN0cmljdCA/IF8oInNoaWZ0IHJlcXVpcmVzIHJlZ2lzdGVyIG9yICNleHByZXNzaW9uIikKLQkgICAgOiBfKCJzaGlmdCByZXF1aXJlcyAjZXhwcmVzc2lvbiIpOwotCSAgKnN0ciA9IHA7Ci0JICByZXR1cm4gRkFJTDsKLQl9Ci0gICAgfQotCi0gIGluc3QuZXJyb3IgPSBfKCJTaGlmdCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0gIHJldHVybiBGQUlMOwotfQotCi0vKiBEbyB0aG9zZSBkYXRhX29wcyB3aGljaCBjYW4gdGFrZSBhIG5lZ2F0aXZlIGltbWVkaWF0ZSBjb25zdGFudCAqLwotLyogYnkgYWx0ZXJpbmcgdGhlIGluc3R1Y3Rpb24uIEEgYml0IG9mIGEgaGFjayByZWFsbHkgKi8KLS8qICAgICAgTU9WIDwtPiBNVk4KLSAgICAgICAgQU5EIDwtPiBCSUMKLSAgICAgICAgQURDIDwtPiBTQkMKLSAgICAgICAgYnkgaW52ZXJ0aW5nIHRoZSBzZWNvbmQgb3BlcmFuZCwgYW5kCi0gICAgICAgIEFERCA8LT4gU1VCCi0gICAgICAgIENNUCA8LT4gQ01OCi0gICAgICAgIGJ5IG5lZ2F0aW5nIHRoZSBzZWNvbmQgb3BlcmFuZC4KLSovCi1zdGF0aWMgaW50Ci1uZWdhdGVfZGF0YV9vcCAoaW5zdHJ1Y3Rpb24sIHZhbHVlKQotICAgICB1bnNpZ25lZCBsb25nICogaW5zdHJ1Y3Rpb247Ci0gICAgIHVuc2lnbmVkIGxvbmcgICB2YWx1ZTsKLXsKLSAgaW50IG9wLCBuZXdfaW5zdDsKLSAgdW5zaWduZWQgbG9uZyBuZWdhdGVkLCBpbnZlcnRlZDsKLQotICBuZWdhdGVkID0gdmFsaWRhdGVfaW1tZWRpYXRlICgtdmFsdWUpOwotICBpbnZlcnRlZCA9IHZhbGlkYXRlX2ltbWVkaWF0ZSAofnZhbHVlKTsKLQotICBvcCA9ICgqaW5zdHJ1Y3Rpb24gPj4gREFUQV9PUF9TSElGVCkgJiAweGY7Ci0gIHN3aXRjaCAob3ApCi0gICAgewotICAgICAgLyogRmlyc3QgbmVnYXRlcyAqLwotICAgIGNhc2UgT1BDT0RFX1NVQjogICAgICAgICAgICAgLyogQUREIDwtPiBTVUIgKi8KLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX0FERDsKLSAgICAgIHZhbHVlID0gbmVnYXRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENPREVfQUREOiAKLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX1NVQjsgICAgICAgICAgICAgICAKLSAgICAgIHZhbHVlID0gbmVnYXRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENPREVfQ01QOiAgICAgICAgICAgICAvKiBDTVAgPC0+IENNTiAqLwotICAgICAgbmV3X2luc3QgPSBPUENPREVfQ01OOwotICAgICAgdmFsdWUgPSBuZWdhdGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9DTU46IAotICAgICAgbmV3X2luc3QgPSBPUENPREVfQ01QOyAgICAgICAgICAgICAgIAotICAgICAgdmFsdWUgPSBuZWdhdGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIE5vdyBJbnZlcnRlZCBvcHMgKi8KLSAgICBjYXNlIE9QQ09ERV9NT1Y6ICAgICAgICAgICAgIC8qIE1PViA8LT4gTVZOICovCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9NVk47ICAgICAgICAgICAgICAgCi0gICAgICB2YWx1ZSA9IGludmVydGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9NVk46IAotICAgICAgbmV3X2luc3QgPSBPUENPREVfTU9WOwotICAgICAgdmFsdWUgPSBpbnZlcnRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENPREVfQU5EOiAgICAgICAgICAgICAvKiBBTkQgPC0+IEJJQyAqLyAKLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX0JJQzsgICAgICAgICAgICAgICAKLSAgICAgIHZhbHVlID0gaW52ZXJ0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BDT0RFX0JJQzogCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9BTkQ7Ci0gICAgICB2YWx1ZSA9IGludmVydGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9BREM6ICAgICAgICAgICAgICAvKiBBREMgPC0+IFNCQyAqLwotICAgICAgbmV3X2luc3QgPSBPUENPREVfU0JDOyAgICAgICAgICAgICAgIAotICAgICAgdmFsdWUgPSBpbnZlcnRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENPREVfU0JDOiAKLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX0FEQzsKLSAgICAgIHZhbHVlID0gaW52ZXJ0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogV2UgY2Fubm90IGRvIGFueXRoaW5nICovCi0gICAgZGVmYXVsdDogIAotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotCi0gIGlmICh2YWx1ZSA9PSBGQUlMKQotICAgIHJldHVybiBGQUlMOwotCi0gICppbnN0cnVjdGlvbiAmPSBPUENPREVfTUFTSzsKLSAgKmluc3RydWN0aW9uIHw9IG5ld19pbnN0IDw8IERBVEFfT1BfU0hJRlQ7Ci0gIHJldHVybiB2YWx1ZTsgCi19Ci0KLXN0YXRpYyBpbnQKLWRhdGFfb3AyIChzdHIpCi0gICAgIGNoYXIgKiogc3RyOwotewotICBpbnQgdmFsdWU7Ci0gIGV4cHJlc3Npb25TIGV4cHI7Ci0KLSAgd2hpbGUgKCoqc3RyID09ICcgJykKLSAgICAoKnN0cikrKzsKLSAgICAKLSAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlIChzdHIsIDApICE9IEZBSUwpCi0gICAgewotICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoc3RyKSA9PSBTVUNDRVNTKQotCXsKLQkgIC8qIFNoaWZ0IG9wZXJhdGlvbiBvbiByZWdpc3RlciAqLwotCSAgcmV0dXJuIGRlY29kZV9zaGlmdCAoc3RyLCBOT19TSElGVF9SRVNUUklDVCk7Ci0JfQotICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW1tZWRpYXRlIGV4cHJlc3Npb24gKi8KLSAgICAgIGlmIChpc19pbW1lZGlhdGVfcHJlZml4ICgqKnN0cikpCi0JewotCSAgKCpzdHIpKys7Ci0JICBpbnN0LmVycm9yID0gTlVMTDsKLQkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCBzdHIpKQotCSAgICByZXR1cm4gRkFJTDsKLQotCSAgaWYgKGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCkKLQkgICAgewotCSAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFOwotCSAgICAgIGluc3QucmVsb2MucGNfcmVsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoc3RyKSA9PSBTVUNDRVNTKQotCQl7Ci0JCSAgLyogI3gsIHkgLS0gaWUgZXhwbGljaXQgcm90YXRpb24gYnkgWSAgKi8KLQkJICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZleHByLCBzdHIpKQotCQkgICAgcmV0dXJuIEZBSUw7Ci0KLQkJICBpZiAoZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JCSAgICB7Ci0JCSAgICAgIGluc3QuZXJyb3IgPSBfKCJDb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0JCSAgICAgIHJldHVybiBGQUlMOwotCQkgICAgfQotIAotCQkgIC8qIFJvdGF0ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiAqLwotCQkgIGlmICgoKHVuc2lnbmVkKSBleHByLlhfYWRkX251bWJlcikgPiAzMAotCQkgICAgICB8fCAoZXhwci5YX2FkZF9udW1iZXIgJiAxKSAhPSAwCi0JCSAgICAgIHx8ICgodW5zaWduZWQpIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcikgPiAyNTUpCi0JCSAgICB7Ci0JCSAgICAgIGluc3QuZXJyb3IgPSBfKCJJbnZhbGlkIGNvbnN0YW50Iik7Ci0JCSAgICAgIHJldHVybiBGQUlMOwotCQkgICAgfQotCQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSU5TVF9JTU1FRElBVEU7Ci0JCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0JCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBleHByLlhfYWRkX251bWJlciA8PCA3OwotCQkgIHJldHVybiBTVUNDRVNTOwotCQl9Ci0KLQkgICAgICAvKiBJbXBsaWNpdCByb3RhdGlvbiwgc2VsZWN0IGEgc3VpdGFibGUgb25lICAqLwotCSAgICAgIHZhbHVlID0gdmFsaWRhdGVfaW1tZWRpYXRlIChpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIpOwotCi0JICAgICAgaWYgKHZhbHVlID09IEZBSUwpCi0JCXsKLQkJICAvKiBDYW4ndCBiZSBkb25lLCBwZXJoYXBzIHRoZSBjb2RlIHJlYWRzIHNvbWV0aGluZyBsaWtlCi0JCSAgICAgImFkZCBSZCwgUm4sICMtbiIsIHdoZXJlICJzdWIgUmQsIFJuLCAjbiIgd291bGQgYmUgb2sgKi8KLQkJICBpZiAoKHZhbHVlID0gbmVnYXRlX2RhdGFfb3AgKCZpbnN0Lmluc3RydWN0aW9uLAotCQkJCQkgICAgICAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyKSkKLQkJICAgICAgPT0gRkFJTCkKLQkJICAgIHsKLQkJICAgICAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgY29uc3RhbnQiKTsKLQkJICAgICAgcmV0dXJuIEZBSUw7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gdmFsdWU7Ci0JICAgIH0KLQotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBJTlNUX0lNTUVESUFURTsKLQkgIHJldHVybiBTVUNDRVNTOwotCX0KLQotICAgICAgKCpzdHIpKys7Ci0gICAgICBpbnN0LmVycm9yID0gXygiUmVnaXN0ZXIgb3Igc2hpZnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1mcF9vcDIgKHN0cikKLSAgICAgY2hhciAqKiBzdHI7Ci17Ci0gIHdoaWxlICgqKnN0ciA9PSAnICcpCi0gICAgKCpzdHIpKys7Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlIChzdHIsIDApICE9IEZBSUwpCi0gICAgcmV0dXJuIFNVQ0NFU1M7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJbW1lZGlhdGUgZXhwcmVzc2lvbiAqLwotICAgICAgaWYgKCooKCpzdHIpKyspID09ICcjJykKLQl7Ci0JICBpbnQgaTsKLQotCSAgaW5zdC5lcnJvciA9IE5VTEw7Ci0JICB3aGlsZSAoKipzdHIgPT0gJyAnKQotCSAgICAoKnN0cikrKzsKLQotCSAgLyogRmlyc3QgdHJ5IGFuZCBtYXRjaCBleGFjdCBzdHJpbmdzLCB0aGlzIGlzIHRvIGd1YXJhbnRlZSB0aGF0Ci0JICAgICBzb21lIGZvcm1hdHMgd2lsbCB3b3JrIGV2ZW4gZm9yIGNyb3NzIGFzc2VtYmx5ICovCi0KLQkgIGZvciAoaSA9IDA7IGZwX2NvbnN0W2ldOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoc3RybmNtcCAoKnN0ciwgZnBfY29uc3RbaV0sIHN0cmxlbiAoZnBfY29uc3RbaV0pKSA9PSAwKQotCQl7Ci0JCSAgY2hhciAqc3RhcnQgPSAqc3RyOwotCi0JCSAgKnN0ciArPSBzdHJsZW4gKGZwX2NvbnN0W2ldKTsKLQkJICBpZiAoaXNfZW5kX29mX2xpbmVbKGludCkqKnN0cl0gfHwgKipzdHIgPT0gJ1wwJykKLQkJICAgIHsKLQkJICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBpICsgODsKLQkJICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0JCSAgICB9Ci0JCSAgKnN0ciA9IHN0YXJ0OwotCQl9Ci0JICAgIH0KLQotCSAgLyogSnVzdCBiZWNhdXNlIHdlIGRpZG4ndCBnZXQgYSBtYXRjaCBkb2Vzbid0IG1lYW4gdGhhdCB0aGUKLQkgICAgIGNvbnN0YW50IGlzbid0IHZhbGlkLCBqdXN0IHRoYXQgaXQgaXMgaW4gYSBmb3JtYXQgdGhhdCB3ZQotCSAgICAgZG9uJ3QgYXV0b21hdGljYWxseSByZWNvZ25pemUuICBUcnkgcGFyc2luZyBpdCB3aXRoCi0JICAgICB0aGUgc3RhbmRhcmQgZXhwcmVzc2lvbiByb3V0aW5lcy4gICovCi0JICBpZiAoKGkgPSBteV9nZXRfZmxvYXRfZXhwcmVzc2lvbiAoc3RyKSkgPj0gMCkKLQkgICAgewotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gaSArIDg7Ci0JICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0JICAgIH0KLQotCSAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgZmxvYXRpbmcgcG9pbnQgaW1tZWRpYXRlIGV4cHJlc3Npb24iKTsKLQkgIHJldHVybiBGQUlMOwotCX0KLSAgICAgIGluc3QuZXJyb3IgPSBfKCJGbG9hdGluZyBwb2ludCByZWdpc3RlciBvciBpbW1lZGlhdGUgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZG9fYXJpdCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBkYXRhX29wMiAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fYWRyIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgLyogVGhpcyBpcyBhIHBzZXVkby1vcCBvZiB0aGUgZm9ybSAiYWRyIHJkLCBsYWJlbCIgdG8gYmUgY29udmVydGVkCi0gICAgIGludG8gYSByZWxhdGl2ZSBhZGRyZXNzIG9mIHRoZSBmb3JtICJhZGQgcmQsIHBjLCAjbGFiZWwtLi04IiAqLwotCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAvKiBGcmFnIGhhY2tpbmcgd2lsbCB0dXJuIHRoaXMgaW50byBhIHN1YiBpbnN0cnVjdGlvbiBpZiB0aGUgb2Zmc2V0IHR1cm5zCi0gICAgIG91dCB0byBiZSBuZWdhdGl2ZS4gICovCi0gIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFOwotICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgLT0gODsgLyogUEMgcmVsYXRpdmUgYWRqdXN0ICovCi0gIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2NtcCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGRhdGFfb3AyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGlmICgoZmxhZ3MgJiAweDAwMDBmMDAwKSA9PSAwKQotICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ09ORFNfQklUOwotCi0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19tb3YgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBkYXRhX29wMiAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgaW50Ci1sZHN0X2V4dGVuZCAoc3RyLCBod3NlKQotICAgICBjaGFyICoqIHN0cjsKLSAgICAgaW50ICAgICBod3NlOwotewotICBpbnQgYWRkID0gSU5ERVhfVVA7Ci0KLSAgc3dpdGNoICgqKnN0cikKLSAgICB7Ci0gICAgY2FzZSAnIyc6Ci0gICAgY2FzZSAnJCc6Ci0gICAgICAoKnN0cikrKzsKLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgc3RyKSkKLQlyZXR1cm4gRkFJTDsKLQotICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICBpbnQgdmFsdWUgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0KLSAgICAgICAgICBpZiAoKGh3c2UgJiYgKHZhbHVlIDwgLTI1NSB8fCB2YWx1ZSA+IDI1NSkpCi0gICAgICAgICAgICAgICB8fCAodmFsdWUgPCAtNDA5NSB8fCB2YWx1ZSA+IDQwOTUpKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oImFkZHJlc3Mgb2Zmc2V0IHRvbyBsYXJnZSIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0KLQkgIGlmICh2YWx1ZSA8IDApCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9IC12YWx1ZTsKLQkgICAgICBhZGQgPSAwOwotCSAgICB9Ci0KLSAgICAgICAgICAvKiBIYWxmd29yZCBhbmQgc2lnbmV4dGVuc2lvbiBpbnN0cnVjdGlvbnMgaGF2ZSB0aGUKLSAgICAgICAgICAgICBpbW1lZGlhdGUgdmFsdWUgc3BsaXQgYWNyb3NzIGJpdHMgMTEuLjggYW5kIGJpdHMgMy4uMCAqLwotICAgICAgICAgIGlmIChod3NlKQotICAgICAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBhZGQgfCBIV09GRlNFVF9JTU0gfCAodmFsdWUgPj4gNCkgPDwgOCB8IHZhbHVlICYgMHhGOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gYWRkIHwgdmFsdWU7Ci0JfQotICAgICAgZWxzZQotCXsKLSAgICAgICAgICBpZiAoaHdzZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBIV09GRlNFVF9JTU07Ci0gICAgICAgICAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOwotCSAgaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotCX0KLSAgICAgIHJldHVybiBTVUNDRVNTOwotCi0gICAgY2FzZSAnLSc6Ci0gICAgICBhZGQgPSAwOwkvKiBhbmQgZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSAnKyc6Ci0gICAgICAoKnN0cikrKzsJLyogYW5kIGZhbGwgdGhyb3VnaCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgMCkgPT0gRkFJTCkKLQlyZXR1cm4gRkFJTDsKLQotICAgICAgaWYgKGh3c2UpCi0gICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gYWRkOwotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBhZGQgfCBPRkZTRVRfUkVHOwotICAgICAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKHN0cikgPT0gU1VDQ0VTUykKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVfc2hpZnQgKHN0ciwgU0hJRlRfUkVTVFJJQ1QpOwotICAgICAgICB9Ci0KLSAgICAgIHJldHVybiBTVUNDRVNTOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRvX2xkc3QgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgaGFsZndvcmQgPSAwOwotICBpbnQgcHJlX2luYyA9IDA7Ci0gIGludCBjb25mbGljdF9yZWc7Ci0gIGludCB2YWx1ZTsKLQotICAvKiBUaGlzIGlzIG5vdCBpZGVhbCwgYnV0IGl0IGlzIHRoZSBzaW1wbGVzdCB3YXkgb2YgZGVhbGluZyB3aXRoIHRoZQotICAgICBBUk03VCBoYWxmd29yZCBpbnN0cnVjdGlvbnMgKHNpbmNlIHRoZXkgdXNlIGEgZGlmZmVyZW50Ci0gICAgIGVuY29kaW5nLCBidXQgdGhlIHNhbWUgbW5lbW9uaWMpOiAqLwotICBpZiAoaGFsZndvcmQgPSAoKGZsYWdzICYgMHg4MDAwMDAwMCkgIT0gMCkpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhY3R1YWxseSBhIGxvYWQvc3RvcmUgb2YgYSBoYWxmd29yZCwgb3IgYQotICAgICAgICAgc2lnbmVkLWV4dGVuc2lvbiBsb2FkICovCi0gICAgICBpZiAoKGNwdV92YXJpYW50ICYgQVJNX0hBTEZXT1JEKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgaW5zdC5lcnJvcgotCSAgICA9IF8oIlByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IGhhbGZ3b3JkcyBvciBzaWduZWQgYnl0ZXMiKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiA9IChpbnN0Lmluc3RydWN0aW9uICYgQ09ORF9NQVNLKQotICAgICAgICAgICAgICAgICAgICAgICAgIHwgKGZsYWdzICYgfkNPTkRfTUFTSyk7Ci0KLSAgICAgIGZsYWdzID0gMDsKLSAgICB9Ci0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotICAgIAotICBpZiAoKGNvbmZsaWN0X3JlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmIHN0ciwgMTIpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCYgc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJBZGRyZXNzIGV4cGVjdGVkIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgqc3RyID09ICdbJykKLSAgICB7Ci0gICAgICBpbnQgcmVnOwotCi0gICAgICBzdHIrKzsKLSAgICAgIHdoaWxlICgqc3RyID09ICcgJykKLQlzdHIrKzsKLQotICAgICAgaWYgKChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpKSA9PSBGQUlMKQotCXJldHVybjsKLQotICAgICAgY29uZmxpY3RfcmVnID0gKCgoY29uZmxpY3RfcmVnID09IHJlZykKLQkJICAgICAgICYmIChpbnN0Lmluc3RydWN0aW9uICYgTE9BRF9CSVQpKQotCQkgICAgICA/IDEgOiAwKTsKLQotICAgICAgd2hpbGUgKCpzdHIgPT0gJyAnKQotCXN0cisrOwotCi0gICAgICBpZiAoKnN0ciA9PSAnXScpCi0JewotCSAgc3RyKys7Ci0JICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBTVUNDRVNTKQotCSAgICB7Ci0JICAgICAgLyogW1JuXSwuLi4gKHBvc3QgaW5jKSAqLwotCSAgICAgIGlmIChsZHN0X2V4dGVuZCAoJnN0ciwgaGFsZndvcmQpID09IEZBSUwpCi0JCXJldHVybjsKLQkgICAgICBpZiAoY29uZmxpY3RfcmVnKQotCQlhc193YXJuIChfKCJkZXN0aW5hdGlvbiByZWdpc3RlciBzYW1lIGFzIHdyaXRlLWJhY2sgYmFzZVxuIikpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBbUm5dICovCi0gICAgICAgICAgICAgIGlmIChoYWxmd29yZCkKLSAgICAgICAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IEhXT0ZGU0VUX0lNTTsKLQotICAgICAgICAgICAgICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgICAgICAgICAgICBzdHIrKzsKLQotICAgICAgICAgICAgICBpZiAoKnN0ciA9PSAnIScpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIGlmIChjb25mbGljdF9yZWcpCi0gICAgICAgICAgICAgICAgICBhc193YXJuIChfKCJkZXN0aW5hdGlvbiByZWdpc3RlciBzYW1lIGFzIHdyaXRlLWJhY2sgYmFzZVxuIikpOwotICAgICAgICAgICAgICAgICBzdHIrKzsKLSAgICAgICAgICAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBXUklURV9CQUNLOwotICAgICAgICAgICAgICAgfQotCi0JICAgICAgZmxhZ3MgfD0gSU5ERVhfVVA7Ci0JICAgICAgaWYgKCEgKGZsYWdzICYgVFJBTlNfQklUKSkKLQkJcHJlX2luYyA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogW1JuLC4uLl0gKi8KLQkgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygicHJlLWluZGV4ZWQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBwcmVfaW5jID0gMTsKLQkgIGlmIChsZHN0X2V4dGVuZCAoJnN0ciwgaGFsZndvcmQpID09IEZBSUwpCi0JICAgIHJldHVybjsKLQotCSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotCSAgICBzdHIrKzsKLQotCSAgaWYgKCpzdHIrKyAhPSAnXScpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygibWlzc2luZyBdIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIHdoaWxlICgqc3RyID09ICcgJykKLQkgICAgc3RyKys7Ci0KLQkgIGlmICgqc3RyID09ICchJykKLQkgICAgewotCSAgICAgIGlmIChjb25mbGljdF9yZWcpCi0JCWFzX3Rza3RzayAoXygiZGVzdGluYXRpb24gcmVnaXN0ZXIgc2FtZSBhcyB3cml0ZS1iYWNrIGJhc2VcbiIpKTsKLQkgICAgICBzdHIrKzsKLQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFdSSVRFX0JBQ0s7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmICgqc3RyID09ICc9JykKLSAgICB7Ci0gICAgICAvKiBQYXJzZSBhbiAibGRyIFJkLCA9ZXhwciIgaW5zdHJ1Y3Rpb247IHRoaXMgaXMgYW5vdGhlciBwc2V1ZG8gb3AgKi8KLSAgICAgIHN0cisrOwotCi0gICAgICB3aGlsZSAoKnN0ciA9PSAnICcpCi0Jc3RyKys7Ci0KLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLQlyZXR1cm47Ci0KLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkgICYmIGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oIkNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fY29uc3RhbnQKLQkgICYmICh2YWx1ZSA9IHZhbGlkYXRlX2ltbWVkaWF0ZShpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIpKSAhPSBGQUlMKQotCXsKLQkgIC8qIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCBhIG1vdiBpbnN0cnVjdGlvbiAqLwotCSAgaW5zdC5pbnN0cnVjdGlvbiAmPSBMSVRFUkFMX01BU0s7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IElOU1RfSU1NRURJQVRFIHwgKE9QQ09ERV9NT1YgPDwgREFUQV9PUF9TSElGVCk7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IChmbGFncyAmIENPTkRfTUFTSykgfCAodmFsdWUgJiAweGZmZik7Ci0JICBlbmRfb2ZfbGluZShzdHIpOwotCSAgcmV0dXJuOyAKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogSW5zZXJ0IGludG8gbGl0ZXJhbCBwb29sICovICAgICAKLQkgIGlmIChhZGRfdG9fbGl0X3Bvb2wgKCkgPT0gRkFJTCkKLQkgICAgewotCSAgICAgIGlmICghaW5zdC5lcnJvcikKLQkJaW5zdC5lcnJvciA9IF8oImxpdGVyYWwgcG9vbCBpbnNlcnRpb24gZmFpbGVkIik7IAotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICAvKiBDaGFuZ2UgdGhlIGluc3RydWN0aW9uIGV4cCB0byBwb2ludCB0byB0aGUgcG9vbCAqLwotICAgICAgICAgIGlmIChoYWxmd29yZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBIV09GRlNFVF9JTU07Ci0gICAgICAgICAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLQkgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9MSVRFUkFMOwotCSAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUkVHX1BDIDw8IDE2KTsKLQkgIHByZV9pbmMgPSAxOyAKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCXJldHVybjsKLQotICAgICAgaWYgKGhhbGZ3b3JkKQotICAgICAgICB7Ci0gICAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBIV09GRlNFVF9JTU07Ci0gICAgICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NODsKLSAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU07Ci0gICAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgLT0gODsgIC8qIFBDIHJlbCBhZGp1c3QgKi8KLSAgICAgIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKFJFR19QQyA8PCAxNik7Ci0gICAgICBwcmVfaW5jID0gMTsKLSAgICB9Ci0gICAgCi0gIGlmIChwcmVfaW5jICYmIChmbGFncyAmIFRSQU5TX0JJVCkpCi0gICAgaW5zdC5lcnJvciA9IF8oIlByZS1pbmNyZW1lbnQgaW5zdHJ1Y3Rpb24gd2l0aCB0cmFuc2xhdGUiKTsKLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzIHwgKHByZV9pbmMgPyBQUkVfSU5ERVggOiAwKTsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIGxvbmcKLXJlZ19saXN0IChzdHJwKQotICAgICBjaGFyICoqIHN0cnA7Ci17Ci0gIGNoYXIgKiBzdHIgPSAqc3RycDsKLSAgbG9uZyAgIHJhbmdlID0gMDsKLSAgaW50ICAgIGFub3RoZXJfcmFuZ2U7Ci0KLSAgLyogV2UgY29tZSBiYWNrIGhlcmUgaWYgd2UgZ2V0IHJhbmdlcyBjb25jYXRlbmF0ZWQgYnkgJysnIG9yICd8JyAqLwotICBkbwotICAgIHsKLSAgICAgIGFub3RoZXJfcmFuZ2UgPSAwOwotCi0gICAgICBpZiAoKnN0ciA9PSAneycpCi0JewotCSAgaW50IGluX3JhbmdlID0gMDsKLQkgIGludCBjdXJfcmVnID0gLTE7Ci0gICAgICAKLQkgIHN0cisrOwotCSAgZG8KLQkgICAgewotCSAgICAgIGludCByZWc7Ci0JICAgIAotCSAgICAgIHdoaWxlICgqc3RyID09ICcgJykKLQkJc3RyKys7Ci0KLQkgICAgICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmIHN0ciwgLTEpKSA9PSBGQUlMKQotCQlyZXR1cm4gRkFJTDsKLQkgICAgICAKLQkgICAgICBpZiAoaW5fcmFuZ2UpCi0JCXsKLQkJICBpbnQgaTsKLQkgICAgICAKLQkJICBpZiAocmVnIDw9IGN1cl9yZWcpCi0JCSAgICB7Ci0JCSAgICAgIGluc3QuZXJyb3IgPSBfKCJCYWQgcmFuZ2UgaW4gcmVnaXN0ZXIgbGlzdCIpOwotCQkgICAgICByZXR1cm4gRkFJTDsKLQkJICAgIH0KLQotCQkgIGZvciAoaSA9IGN1cl9yZWcgKyAxOyBpIDwgcmVnOyBpKyspCi0JCSAgICB7Ci0JCSAgICAgIGlmIChyYW5nZSAmICgxIDw8IGkpKQotCQkJYXNfdHNrdHNrIAotCQkJICAoXygiV2FybmluZzogRHVwbGljYXRlZCByZWdpc3RlciAociVkKSBpbiByZWdpc3RlciBsaXN0IiksCi0JCQkgICBpKTsKLQkJICAgICAgZWxzZQotCQkJcmFuZ2UgfD0gMSA8PCBpOwotCQkgICAgfQotCQkgIGluX3JhbmdlID0gMDsKLQkJfQotCi0JICAgICAgaWYgKHJhbmdlICYgKDEgPDwgcmVnKSkKLQkJYXNfdHNrdHNrIChfKCJXYXJuaW5nOiBEdXBsaWNhdGVkIHJlZ2lzdGVyIChyJWQpIGluIHJlZ2lzdGVyIGxpc3QiKSwKLQkJCSAgIHJlZyk7Ci0JICAgICAgZWxzZSBpZiAocmVnIDw9IGN1cl9yZWcpCi0JCWFzX3Rza3RzayAoXygiV2FybmluZzogUmVnaXN0ZXIgcmFuZ2Ugbm90IGluIGFzY2VuZGluZyBvcmRlciIpKTsKLQotCSAgICAgIHJhbmdlIHw9IDEgPDwgcmVnOwotCSAgICAgIGN1cl9yZWcgPSByZWc7Ci0JICAgIH0gd2hpbGUgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgIT0gRkFJTAotCQkgICAgIHx8IChpbl9yYW5nZSA9IDEsICpzdHIrKyA9PSAnLScpKTsKLQkgIHN0ci0tOwotCSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotCSAgICBzdHIrKzsKLQotCSAgaWYgKCpzdHIrKyAhPSAnfScpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygiTWlzc2luZyBgfSciKTsKLQkgICAgICByZXR1cm4gRkFJTDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHByZXNzaW9uUyBleHByOwotCi0JICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZleHByLCAmc3RyKSkKLQkgICAgcmV0dXJuIEZBSUw7Ci0KLQkgIGlmIChleHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIGlmIChleHByLlhfYWRkX251bWJlciAKLQkJICAhPSAoZXhwci5YX2FkZF9udW1iZXIgJiAweDAwMDBmZmZmKSkKLQkJewotCQkgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIHJlZ2lzdGVyIG1hc2siKTsKLQkJICByZXR1cm4gRkFJTDsKLQkJfQotCi0JICAgICAgaWYgKChyYW5nZSAmIGV4cHIuWF9hZGRfbnVtYmVyKSAhPSAwKQotCQl7Ci0JCSAgaW50IHJlZ25vID0gcmFuZ2UgJiBleHByLlhfYWRkX251bWJlcjsKLQotCQkgIHJlZ25vICY9IC1yZWdubzsKLQkJICByZWdubyA9ICgxIDw8IHJlZ25vKSAtIDE7Ci0JCSAgYXNfdHNrdHNrIAotCQkgICAgKF8oIldhcm5pbmc6IER1cGxpY2F0ZWQgcmVnaXN0ZXIgKHIlZCkgaW4gcmVnaXN0ZXIgbGlzdCIpLAotCQkgICAgIHJlZ25vKTsKLQkJfQotCi0JICAgICAgcmFuZ2UgfD0gZXhwci5YX2FkZF9udW1iZXI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChpbnN0LnJlbG9jLnR5cGUgIT0gMCkKLQkJewotCQkgIGluc3QuZXJyb3IgPSBfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4Iik7Ci0JCSAgcmV0dXJuIEZBSUw7Ci0JCX0KLQotCSAgICAgIG1lbWNweSAoJmluc3QucmVsb2MuZXhwLCAmZXhwciwgc2l6ZW9mIChleHByZXNzaW9uUykpOwotCSAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fTVVMVEk7Ci0JICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICB3aGlsZSAoKnN0ciA9PSAnICcpCi0Jc3RyKys7Ci0KLSAgICAgIGlmICgqc3RyID09ICd8JyB8fCAqc3RyID09ICcrJykKLQl7Ci0JICBzdHIrKzsKLQkgIGFub3RoZXJfcmFuZ2UgPSAxOwotCX0KLSAgICB9IHdoaWxlIChhbm90aGVyX3JhbmdlKTsKLQotICAqc3RycCA9IHN0cjsKLSAgcmV0dXJuIHJhbmdlOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbGRtc3RtIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IGJhc2VfcmVnOwotICBsb25nIHJhbmdlOwotCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoKGJhc2VfcmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGJhc2VfcmVnID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygicjE1IG5vdCBhbGxvd2VkIGFzIGJhc2UgcmVnaXN0ZXIiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotICBpZiAoKnN0ciA9PSAnIScpCi0gICAgewotICAgICAgZmxhZ3MgfD0gV1JJVEVfQkFDSzsKLSAgICAgIHN0cisrOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocmFuZ2UgPSByZWdfbGlzdCAoJnN0cikpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgqc3RyID09ICdeJykKLSAgICB7Ci0gICAgICBzdHIrKzsKLSAgICAgIGZsYWdzIHw9IE1VTFRJX1NFVF9QU1I7Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3MgfCByYW5nZTsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3N3aSAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLSAgCi0gIC8qIEFsbG93IG9wdGlvbmFsIGxlYWRpbmcgJyMnLiAgKi8KLSAgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCpzdHIpKQotICAgIHN0cisrOwotCi0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgJiBzdHIpKQotICAgIHJldHVybjsKLQotICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1NXSTsKLSAgaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICAKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIAotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19zd2FwIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IHJlZzsKLSAgCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikpID09IEZBSUwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChyZWcgPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJyMTUgbm90IGFsbG93ZWQgaW4gc3dhcCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyZWcgPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJyMTUgbm90IGFsbG93ZWQgaW4gc3dhcCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAqc3RyKysgIT0gJ1snKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHJlZyA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9wYzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmICgqc3RyKysgIT0gJ10nKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJtaXNzaW5nIF0iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2JyYW5jaCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLSAgICByZXR1cm47Ci0gIAotI2lmZGVmIE9CSl9FTEYKLSAgewotICAgIGNoYXIgKiBzYXZlX2luOwotICAKLSAgICAvKiBTY290dEI6IEZlYnJ1YXJ5IDUsIDE5OTggKi8KLSAgICAvKiBDaGVjayB0byBzZWUgb2YgUExUMzIgcmVsb2MgcmVxdWlyZWQgZm9yIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgCi0gICAgLyogYXJtX3BhcnNlX3JlbG9jKCkgd29ya3Mgb24gaW5wdXRfbGluZV9wb2ludGVyLgotICAgICAgIFdlIGFjdHVhbGx5IHdhbnQgdG8gcGFyc2UgdGhlIG9wZXJhbmRzIHRvIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24KLSAgICAgICBwYXNzZWQgaW4gJ3N0cicuICBTYXZlIHRoZSBpbnB1dCBwb2ludGVyIGFuZCByZXN0b3JlIGl0IGxhdGVyLiAgKi8KLSAgICBzYXZlX2luID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLSAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX3N5bWJvbAotCSYmICpzdHIgPT0gJygnCi0JJiYgYXJtX3BhcnNlX3JlbG9jICgpID09IEJGRF9SRUxPQ19BUk1fUExUMzIpCi0gICAgICB7Ci0JaW5zdC5yZWxvYy50eXBlICAgPSBCRkRfUkVMT0NfQVJNX1BMVDMyOwotCWluc3QucmVsb2MucGNfcmVsID0gMDsKLQkvKiBNb2RpZnkgc3RyIHRvIHBvaW50IHRvIGFmdGVyIHBhcnNlZCBvcGVyYW5kcywgb3RoZXJ3aXNlCi0JICAgZW5kX29mX2xpbmUoKSB3aWxsIGNvbXBsYWluIGFib3V0IHRoZSAoUExUKSBsZWZ0IGluIHN0ci4gICovCi0Jc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlpbnN0LnJlbG9jLnR5cGUgICA9IEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNIOwotCWluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgICAgIH0KLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICB9Ci0jZWxzZQotICBpbnN0LnJlbG9jLnR5cGUgICA9IEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNIOwotICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0jZW5kaWYgLyogT0JKX0VMRiAqLwotICAKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2J4IChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IHJlZzsKLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkpID09IEZBSUwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChyZWcgPT0gUkVHX1BDKQotICAgIGFzX3Rza3RzayAoXygiVXNlIG9mIHIxNSBpbiBieCBoYXMgdW5kZWZpbmVkIGJlaGF2aW91ciIpKTsKLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fY2RwIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgLyogQ28tcHJvY2Vzc29yIGRhdGEgb3BlcmF0aW9uLgotICAgICBGb3JtYXQ6IENEUHtjb25kfSBDUCMsPGV4cHI+LENSZCxDUm4sQ1Jteyw8ZXhwcj59ICAqLwotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKGNvX3Byb2NfbnVtYmVyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX29wY19leHByICgmc3RyLCAyMCw0KSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3BfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gU1VDQ0VTUykKLSAgICB7Ci0gICAgICBpZiAoY3Bfb3BjX2V4cHIgKCZzdHIsIDUsIDMpID09IEZBSUwpCi0JewotCSAgaWYgKCFpbnN0LmVycm9yKQotCSAgICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbHN0YyAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIC8qIENvLXByb2Nlc3NvciByZWdpc3RlciBsb2FkL3N0b3JlLgotICAgICBGb3JtYXQ6IDxMREN8U1RDe2NvbmR9W0xdIENQIyxDUmQsPGFkZHJlc3M+ICAqLwotCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoY29fcHJvY19udW1iZXIgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3BfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZSAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2NvX3JlZyAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIC8qIENvLXByb2Nlc3NvciByZWdpc3RlciB0cmFuc2Zlci4KLSAgICAgRm9ybWF0OiA8TUNSfE1SQz57Y29uZH0gQ1AjLDxleHByMT4sUmQsQ1JuLENSbXssPGV4cHIyPn0gICovCi0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChjb19wcm9jX251bWJlciAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9vcGNfZXhwciAoJnN0ciwgMjEsIDMpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBTVUNDRVNTKQotICAgIHsKLSAgICAgIGlmIChjcF9vcGNfZXhwciAoJnN0ciwgNSwgMykgPT0gRkFJTCkKLQl7Ci0JICBpZiAoIWluc3QuZXJyb3IpCi0JICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19mcF9jdHJsIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgLyogRlAgY29udHJvbCByZWdpc3RlcnMuCi0gICAgIEZvcm1hdDogPFdGU3xSRlN8V0ZDfFJGQz57Y29uZH0gUm4gICovCi0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2ZwX2xkc3QgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgc3dpdGNoIChpbnN0LnN1ZmZpeCkKLSAgICB7Ci0gICAgY2FzZSBTVUZGX1M6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRDoKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ1BfVF9YOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX0U6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IENQX1RfWTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1VGRl9QOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDUF9UX1ggfCBDUF9UX1k7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmIChmcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3BfYWRkcmVzc19yZXF1aXJlZF9oZXJlICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfbGRtc3RtIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IG51bV9yZWdzOwotCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoZnBfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBHZXQgTnVtYmVyIG9mIHJlZ2lzdGVycyB0byB0cmFuc2ZlciAqLwotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBfKCJjb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIkNvbnN0YW50IHZhbHVlIHJlcXVpcmVkIGZvciBudW1iZXIgb2YgcmVnaXN0ZXJzIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG51bV9yZWdzID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCi0gIGlmIChudW1fcmVncyA8IDEgfHwgbnVtX3JlZ3MgPiA0KQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJudW1iZXIgb2YgcmVnaXN0ZXJzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFsxOjRdIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN3aXRjaCAobnVtX3JlZ3MpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ1BfVF9YOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDUF9UX1k7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IENQX1RfWSB8IENQX1RfWDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGZsYWdzKQotICAgIHsKLSAgICAgIGludCByZWc7Ci0gICAgICBpbnQgd3JpdGVfYmFjazsKLSAgICAgIGludCBvZmZzZXQ7Ci0KLSAgICAgIC8qIFRoZSBpbnN0cnVjdGlvbiBzcGVjaWZpZWQgImVhIiBvciAiZmQiLCBzbyB3ZSBjYW4gb25seSBhY2NlcHQKLQkgW1JuXXshfS4gIFRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCByZWFsbHkgc3VwcG9ydCBzdGFja2luZyBvcgotCSB1bnN0YWNraW5nLCBzbyB3ZSBoYXZlIHRvIGVtdWxhdGUgdGhlc2UgYnkgc2V0dGluZyBhcHByb3ByaWF0ZQotCSBiaXRzIGFuZCBvZmZzZXRzLiAgKi8KLSAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLQkgIHx8ICpzdHIgIT0gJ1snKQotCXsKLQkgIGlmICghIGluc3QuZXJyb3IpCi0JICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIHN0cisrOwotICAgICAgd2hpbGUgKCpzdHIgPT0gJyAnKQotCXN0cisrOwotCi0gICAgICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikpID09IEZBSUwpCi0JcmV0dXJuOwotCi0gICAgICB3aGlsZSAoKnN0ciA9PSAnICcpCi0Jc3RyKys7Ci0KLSAgICAgIGlmICgqc3RyICE9ICddJykKLQl7Ci0JICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBzdHIrKzsKLSAgICAgIGlmICgqc3RyID09ICchJykKLQl7Ci0JICB3cml0ZV9iYWNrID0gMTsKLQkgIHN0cisrOwotCSAgaWYgKHJlZyA9PSBSRUdfUEMpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygiUjE1IG5vdCBhbGxvd2VkIGFzIGJhc2UgcmVnaXN0ZXIgd2l0aCB3cml0ZS1iYWNrIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXdyaXRlX2JhY2sgPSAwOwotCi0gICAgICBpZiAoZmxhZ3MgJiBDUF9UX1ByZSkKLQl7Ci0JICAvKiBQcmUtZGVjcmVtZW50ICovCi0JICBvZmZzZXQgPSAzICogbnVtX3JlZ3M7Ci0JICBpZiAod3JpdGVfYmFjaykKLQkgICAgZmxhZ3MgfD0gQ1BfVF9XQjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogUG9zdC1pbmNyZW1lbnQgKi8KLQkgIGlmICh3cml0ZV9iYWNrKQotCSAgICB7Ci0JICAgICAgZmxhZ3MgfD0gQ1BfVF9XQjsKLQkgICAgICBvZmZzZXQgPSAzICogbnVtX3JlZ3M7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIE5vIHdyaXRlLWJhY2ssIHNvIGNvbnZlcnQgdGhpcyBpbnRvIGEgc3RhbmRhcmQgcHJlLWluY3JlbWVudAotCQkgaW5zdHJ1Y3Rpb24gLS0gYWVzdGhldGljYWxseSBtb3JlIHBsZWFzaW5nLiAgKi8KLQkgICAgICBmbGFncyA9IENQX1RfUHJlIHwgQ1BfVF9VRDsKLQkgICAgICBvZmZzZXQgPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzIHwgb2Zmc2V0OwotICAgIH0KLSAgZWxzZSBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0JICAgfHwgY3BfYWRkcmVzc19yZXF1aXJlZF9oZXJlICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2ZwX2R5YWRpYyAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBzd2l0Y2ggKGluc3Quc3VmZml4KQotICAgIHsKLSAgICBjYXNlIFNVRkZfUzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1VGRl9EOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAweDAwMDAwMDgwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX0U6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwODAwMDA7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmIChmcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgZnBfb3AyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfbW9uYWRpYyAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBzd2l0Y2ggKGluc3Quc3VmZml4KQotICAgIHsKLSAgICBjYXNlIFNVRkZfUzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1VGRl9EOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAweDAwMDAwMDgwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX0U6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwODAwMDA7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmIChmcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGZwX29wMiAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2ZwX2NtcCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoZnBfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBmcF9vcDIgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19mcF9mcm9tX3JlZyAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBzd2l0Y2ggKGluc3Quc3VmZml4KQotICAgIHsKLSAgICBjYXNlIFNVRkZfUzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1VGRl9EOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAweDAwMDAwMDgwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX0U6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwODAwMDA7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmIChmcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2ZwX3RvX3JlZyAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHJldHVybjsKLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBmcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotLyogVGh1bWIgc3BlY2lmaWMgcm91dGluZXMgKi8KLQotLyogUGFyc2UgYW5kIHZhbGlkYXRlIHRoYXQgYSByZWdpc3RlciBpcyBvZiB0aGUgcmlnaHQgZm9ybSwgdGhpcyBzYXZlcwotICAgcmVwZWF0ZWQgY2hlY2tpbmcgb2YgdGhpcyBpbmZvcm1hdGlvbiBpbiBtYW55IHNpbWlsYXIgY2FzZXMuIAotICAgVW5saWtlIHRoZSAzMi1iaXQgY2FzZSB3ZSBkbyBub3QgaW5zZXJ0IHRoZSByZWdpc3RlciBpbnRvIHRoZSBvcGNvZGUgCi0gICBoZXJlLCBzaW5jZSB0aGUgcG9zaXRpb24gaXMgb2Z0ZW4gdW5rbm93biB1bnRpbCB0aGUgZnVsbCBpbnN0cnVjdGlvbiAKLSAgIGhhcyBiZWVuIHBhcnNlZC4gICovCi1zdGF0aWMgaW50Ci10aHVtYl9yZWcgKHN0cnAsIGhpX2xvKQotICAgICBjaGFyICoqIHN0cnA7Ci0gICAgIGludCAgICAgaGlfbG87Ci17Ci0gIGludCByZWc7Ci0KLSAgaWYgKChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoc3RycCwgLTEpKSA9PSBGQUlMKQotICAgIHJldHVybiBGQUlMOwotCi0gIHN3aXRjaCAoaGlfbG8pCi0gICAgewotICAgIGNhc2UgVEhVTUJfUkVHX0xPOgotICAgICAgaWYgKHJlZyA+IDcpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oImxvIHJlZ2lzdGVyIHJlcXVpcmVkIik7Ci0JICByZXR1cm4gRkFJTDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVEhVTUJfUkVHX0hJOgotICAgICAgaWYgKHJlZyA8IDgpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oImhpIHJlZ2lzdGVyIHJlcXVpcmVkIik7Ci0JICByZXR1cm4gRkFJTDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlZzsKLX0KLQotLyogUGFyc2UgYW4gYWRkIG9yIHN1YnRyYWN0IGluc3RydWN0aW9uLCBTVUJUUkFDVCBpcyBub24temVybyBpZiB0aGUgb3Bjb2RlCi0gICB3YXMgU1VCLiAgKi8KLXN0YXRpYyB2b2lkCi10aHVtYl9hZGRfc3ViIChzdHIsIHN1YnRyYWN0KQotICAgICBjaGFyICogc3RyOwotICAgICBpbnQgICAgc3VidHJhY3Q7Ci17Ci0gIGludCBSZCwgUnMsIFJuID0gRkFJTDsKLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChSZCA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0FOWSkpID09IEZBSUwKLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCpzdHIpKQotICAgIHsKLSAgICAgIFJzID0gUmQ7Ci0gICAgICBzdHIrKzsKLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLQlyZXR1cm47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChScyA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0FOWSkpID09IEZBSUwpCi0JcmV0dXJuOwotCi0gICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotCXsKLQkgIC8qIFR3byBvcGVyYW5kIGZvcm1hdCwgc2h1ZmZsZSB0aGUgcmVnaXN0ZXJzIGFuZCBwcmV0ZW5kIHRoZXJlIAotCSAgICAgYXJlIDMgKi8KLQkgIFJuID0gUnM7Ci0JICBScyA9IFJkOwotCX0KLSAgICAgIGVsc2UgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCpzdHIpKQotCXsKLQkgIHN0cisrOwotCSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCSAgICByZXR1cm47Ci0JfQotICAgICAgZWxzZSBpZiAoKFJuID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfQU5ZKSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0gICAgfQotCi0gIC8qIFdlIG5vdyBoYXZlIFJkIGFuZCBScyBzZXQgdG8gcmVnaXN0ZXJzLCBhbmQgUm4gc2V0IHRvIGEgcmVnaXN0ZXIgb3IgRkFJTDsKLSAgICAgZm9yIHRoZSBsYXR0ZXIgY2FzZSwgRVhQUiBjb250YWlucyB0aGUgaW1tZWRpYXRlIHRoYXQgd2FzIGZvdW5kLiAqLwotICBpZiAoUm4gIT0gRkFJTCkKLSAgICB7Ci0gICAgICAvKiBBbGwgcmVnaXN0ZXIgZm9ybWF0LiAgKi8KLSAgICAgIGlmIChSZCA+IDcgfHwgUnMgPiA3IHx8IFJuID4gNykKLQl7Ci0JICBpZiAoUnMgIT0gUmQpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygiZGVzdCBhbmQgc291cmNlMSBtdXN0IGJlIHRoZSBzYW1lIHJlZ2lzdGVyIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIENhbid0IGRvIHRoaXMgZm9yIFNVQiAqLwotCSAgaWYgKHN1YnRyYWN0KQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oInN1YnRyYWN0IHZhbGlkIG9ubHkgb24gbG8gcmVncyIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBpbnN0Lmluc3RydWN0aW9uID0gKFRfT1BDT0RFX0FERF9ISQotCQkJICAgICAgfCAoUmQgPiA3ID8gVEhVTUJfSDEgOiAwKQotCQkJICAgICAgfCAoUm4gPiA3ID8gVEhVTUJfSDIgOiAwKSk7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IChSZCAmIDcpIHwgKChSbiAmIDcpIDw8IDMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnN0Lmluc3RydWN0aW9uID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfUjMgOiBUX09QQ09ERV9BRERfUjM7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIHwgKFJzIDw8IDMpIHwgKFJuIDw8IDYpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJbW1lZGlhdGUgZXhwcmVzc2lvbiwgbm93IHRoaW5ncyBzdGFydCB0byBnZXQgbmFzdHkuICAqLwotCi0gICAgICAvKiBGaXJzdCBkZWFsIHdpdGggSEkgcmVncywgb25seSB2ZXJ5IHJlc3RyaWN0ZWQgY2FzZXMgYWxsb3dlZDoKLQkgQWRqdXN0aW5nIFNQLCBhbmQgdXNpbmcgUEMgb3IgU1AgdG8gZ2V0IGFuIGFkZHJlc3MuICAqLwotICAgICAgaWYgKChSZCA+IDcgJiYgKFJkICE9IFJFR19TUCB8fCBScyAhPSBSRUdfU1ApKQotCSAgfHwgKFJzID4gNyAmJiBScyAhPSBSRUdfU1AgJiYgUnMgIT0gUkVHX1BDKSkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiaW52YWxpZCBIaSByZWdpc3RlciB3aXRoIGltbWVkaWF0ZSIpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQl7Ci0JICAvKiBWYWx1ZSBpc24ndCBrbm93biB5ZXQsIGFsbCB3ZSBjYW4gZG8gaXMgc3RvcmUgYWxsIHRoZSBmcmFnbWVudHMKLQkgICAgIHdlIGtub3cgYWJvdXQgaW4gdGhlIGluc3RydWN0aW9uIGFuZCBsZXQgdGhlIHJlbG9jIGhhY2tpbmcgCi0JICAgICB3b3JrIGl0IGFsbCBvdXQuICAqLwotCSAgaW5zdC5pbnN0cnVjdGlvbiA9IChzdWJ0cmFjdCA/IDB4ODAwMCA6IDApIHwgKFJkIDw8IDQpIHwgUnM7Ci0JICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50IG9mZnNldCA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQotCSAgaWYgKHN1YnRyYWN0KQotCSAgICBvZmZzZXQgPSAtb2Zmc2V0OwotCi0JICBpZiAob2Zmc2V0IDwgMCkKLQkgICAgewotCSAgICAgIG9mZnNldCA9IC1vZmZzZXQ7Ci0JICAgICAgc3VidHJhY3QgPSAxOwotCi0JICAgICAgLyogUXVpY2sgY2hlY2ssIGluIGNhc2Ugb2Zmc2V0IGlzIE1JTl9JTlQgKi8KLQkgICAgICBpZiAob2Zmc2V0IDwgMCkKLQkJewotCQkgIGluc3QuZXJyb3IgPSBfKCJpbW1lZGlhdGUgdmFsdWUgb3V0IG9mIHJhbmdlIik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgc3VidHJhY3QgPSAwOwotCi0JICBpZiAoUmQgPT0gUkVHX1NQKQotCSAgICB7Ci0JICAgICAgaWYgKG9mZnNldCAmIH4weDFmYykKLQkJewotCQkgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIGltbWVkaWF0ZSB2YWx1ZSBmb3Igc3RhY2sgYWRqdXN0Iik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiA9IHN1YnRyYWN0ID8gVF9PUENPREVfU1VCX1NUIDogVF9PUENPREVfQUREX1NUOwotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gb2Zmc2V0ID4+IDI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKFJzID09IFJFR19QQyB8fCBScyA9PSBSRUdfU1ApCi0JICAgIHsKLQkgICAgICBpZiAoc3VidHJhY3QKLQkJICB8fCAob2Zmc2V0ICYgfjB4M2ZjKSkKLQkJewotCQkgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIGltbWVkaWF0ZSBmb3IgYWRkcmVzcyBjYWxjdWxhdGlvbiIpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSAoUnMgPT0gUkVHX1BDID8gVF9PUENPREVfQUREX1BDCi0JCQkJICA6IFRfT1BDT0RFX0FERF9TUCk7Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUmQgPDwgOCkgfCAob2Zmc2V0ID4+IDIpOwotCSAgICB9Ci0JICBlbHNlIGlmIChScyA9PSBSZCkKLQkgICAgewotCSAgICAgIGlmIChvZmZzZXQgJiB+MHhmZikKLQkJewotCQkgIGluc3QuZXJyb3IgPSBfKCJpbW1lZGlhdGUgdmFsdWUgb3V0IG9mIHJhbmdlIik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiA9IHN1YnRyYWN0ID8gVF9PUENPREVfU1VCX0k4IDogVF9PUENPREVfQUREX0k4OwotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKFJkIDw8IDgpIHwgb2Zmc2V0OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAob2Zmc2V0ICYgfjB4NykKLQkJewotCQkgIGluc3QuZXJyb3IgPSBfKCJpbW1lZGlhdGUgdmFsdWUgb3V0IG9mIHJhbmdlIik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiA9IHN1YnRyYWN0ID8gVF9PUENPREVfU1VCX0kzIDogVF9PUENPREVfQUREX0kzOwotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUnMgPDwgMykgfCAob2Zmc2V0IDw8IDYpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHVtYl9zaGlmdCAoc3RyLCBzaGlmdCkKLSAgICAgY2hhciAqIHN0cjsKLSAgICAgaW50ICAgIHNoaWZ0OwotewotICBpbnQgUmQsIFJzLCBSbiA9IEZBSUw7Ci0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmICgoUmQgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwKLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCpzdHIpKQotICAgIHsKLSAgICAgIC8qIFR3byBvcGVyYW5kIGltbWVkaWF0ZSBmb3JtYXQsIHNldCBScyB0byBSZC4gICovCi0gICAgICBScyA9IFJkOwotICAgICAgc3RyKys7Ci0gICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICgoUnMgPSAgdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMKQotCXJldHVybjsKLQotICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTCkKLQl7Ci0JICAvKiBUd28gb3BlcmFuZCBmb3JtYXQsIHNodWZmbGUgdGhlIHJlZ2lzdGVycyBhbmQgcHJldGVuZCB0aGVyZQotCSAgICAgYXJlIDMgKi8KLQkgIFJuID0gUnM7Ci0JICBScyA9IFJkOwotCX0KLSAgICAgIGVsc2UgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCpzdHIpKQotCXsKLQkgIHN0cisrOwotCSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCSAgICByZXR1cm47Ci0JfQotICAgICAgZWxzZSBpZiAoKFJuID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMKQotCXJldHVybjsKLSAgICB9Ci0KLSAgLyogV2Ugbm93IGhhdmUgUmQgYW5kIFJzIHNldCB0byByZWdpc3RlcnMsIGFuZCBSbiBzZXQgdG8gYSByZWdpc3RlciBvciBGQUlMOwotICAgICBmb3IgdGhlIGxhdHRlciBjYXNlLCBFWFBSIGNvbnRhaW5zIHRoZSBpbW1lZGlhdGUgdGhhdCB3YXMgZm91bmQuICovCi0KLSAgaWYgKFJuICE9IEZBSUwpCi0gICAgewotICAgICAgaWYgKFJzICE9IFJkKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJzb3VyY2UxIGFuZCBkZXN0IG11c3QgYmUgc2FtZSByZWdpc3RlciIpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgc3dpdGNoIChzaGlmdCkKLQl7Ci0JY2FzZSBUSFVNQl9BU1I6IGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9BU1JfUjsgYnJlYWs7Ci0JY2FzZSBUSFVNQl9MU0w6IGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MU0xfUjsgYnJlYWs7Ci0JY2FzZSBUSFVNQl9MU1I6IGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MU1JfUjsgYnJlYWs7Ci0JfQotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIHwgKFJuIDw8IDMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAoc2hpZnQpCi0JewotCWNhc2UgVEhVTUJfQVNSOiBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQVNSX0k7IGJyZWFrOwotCWNhc2UgVEhVTUJfTFNMOiBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfTFNMX0k7IGJyZWFrOwotCWNhc2UgVEhVTUJfTFNSOiBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfTFNSX0k7IGJyZWFrOwotCX0KLQotICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQl7Ci0JICAvKiBWYWx1ZSBpc24ndCBrbm93biB5ZXQsIGNyZWF0ZSBhIGR1bW15IHJlbG9jIGFuZCBsZXQgcmVsb2MKLQkgICAgIGhhY2tpbmcgZml4IGl0IHVwICovCi0KLQkgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fVEhVTUJfU0hJRlQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIHNoaWZ0X3ZhbHVlID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCi0JICBpZiAoc2hpZnRfdmFsdWUgPiAzMiB8fCAoc2hpZnRfdmFsdWUgPT0gMzIgJiYgc2hpZnQgPT0gVEhVTUJfTFNMKSkKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJJbnZhbGlkIGltbWVkaWF0ZSBmb3Igc2hpZnQiKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgLyogU2hpZnRzIG9mIHplcm8gYXJlIGhhbmRsZWQgYnkgY29udmVydGluZyB0byBMU0wgKi8KLQkgIGlmIChzaGlmdF92YWx1ZSA9PSAwKQotCSAgICBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfTFNMX0k7Ci0KLQkgIC8qIFNoaWZ0cyBvZiAzMiBhcmUgZW5jb2RlZCBhcyBhIHNoaWZ0IG9mIHplcm8gKi8KLQkgIGlmIChzaGlmdF92YWx1ZSA9PSAzMikKLQkgICAgc2hpZnRfdmFsdWUgPSAwOwotCi0JICBpbnN0Lmluc3RydWN0aW9uIHw9IHNoaWZ0X3ZhbHVlIDw8IDY7Ci0JfQotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIHwgKFJzIDw8IDMpOwotICAgIH0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHVtYl9tb3ZfY29tcGFyZSAoc3RyLCBtb3ZlKQotICAgICBjaGFyICogc3RyOwotICAgICBpbnQgICAgbW92ZTsKLXsKLSAgaW50IFJkLCBScyA9IEZBSUw7Ci0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmICgoUmQgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpc19pbW1lZGlhdGVfcHJlZml4ICgqc3RyKSkKLSAgICB7Ci0gICAgICBzdHIrKzsKLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLQlyZXR1cm47Ci0gICAgfQotICBlbHNlIGlmICgoUnMgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMKQotICAgIHJldHVybjsKLQotICBpZiAoUnMgIT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoUnMgPCA4ICYmIFJkIDwgOCkKLQl7Ci0JICBpZiAobW92ZSA9PSBUSFVNQl9NT1ZFKQotCSAgICAvKiBBIG1vdmUgb2YgdHdvIGxvd3JlZ3MgaXMgZW5jb2RlZCBhcyBBREQgUmQsIFJzLCAjMAotCSAgICAgICBzaW5jZSBhIE1PViBpbnN0cnVjdGlvbiBwcm9kdWNlcyB1bnByZWRpY3RhYmxlIHJlc3VsdHMgKi8KLQkgICAgaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0FERF9JMzsKLQkgIGVsc2UKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0NNUF9MUjsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUnMgPDwgMyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChtb3ZlID09IFRIVU1CX01PVkUpCi0JICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9NT1ZfSFI7Ci0JICBlbHNlCi0JICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9DTVBfSFI7Ci0KLQkgIGlmIChSZCA+IDcpCi0JICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gVEhVTUJfSDE7Ci0KLQkgIGlmIChScyA+IDcpCi0JICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gVEhVTUJfSDI7Ci0KLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKFJkICYgNykgfCAoKFJzICYgNykgPDwgMyk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChSZCA+IDcpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oIm9ubHkgbG8gcmVncyBhbGxvd2VkIHdpdGggaW1tZWRpYXRlIik7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAobW92ZSA9PSBUSFVNQl9NT1ZFKQotCWluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9NT1ZfSTg7Ci0gICAgICBlbHNlCi0JaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0NNUF9JODsKLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCA8PCA4OwotCi0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCWluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fVEhVTUJfSU1NOwotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIHZhbHVlID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCi0JICBpZiAodmFsdWUgPiAyNTUpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygiaW52YWxpZCBpbW1lZGlhdGUiKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSB2YWx1ZTsKLQl9Ci0gICAgfQotCi0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotdGh1bWJfbG9hZF9zdG9yZSAoc3RyLCBsb2FkX3N0b3JlLCBzaXplKQotICAgICBjaGFyICogc3RyOwotICAgICBpbnQgICAgbG9hZF9zdG9yZTsKLSAgICAgaW50ICAgIHNpemU7Ci17Ci0gIGludCBSZCwgUmIsIFJvID0gRkFJTDsKLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChSZCA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoKnN0ciA9PSAnWycpCi0gICAgewotICAgICAgc3RyKys7Ci0gICAgICBpZiAoKFJiID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfQU5ZKSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0KLSAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpICE9IEZBSUwpCi0JewotCSAgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCpzdHIpKQotCSAgICB7Ci0JICAgICAgc3RyKys7Ci0JICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCQlyZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChSbyA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKLQkgICAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnN0LnJlbG9jLmV4cC5YX29wID0gT19jb25zdGFudDsKLQkgIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciA9IDA7Ci0JfQotCi0gICAgICBpZiAoKnN0ciAhPSAnXScpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oImV4cGVjdGVkICddJyIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHN0cisrOwotICAgIH0KLSAgZWxzZSBpZiAoKnN0ciA9PSAnPScpCi0gICAgewotICAgICAgLyogUGFyc2UgYW4gImxkciBSZCwgPWV4cHIiIGluc3RydWN0aW9uOyB0aGlzIGlzIGFub3RoZXIgcHNldWRvIG9wICovCi0gICAgICBzdHIrKzsKLQotICAgICAgd2hpbGUgKCpzdHIgPT0gJyAnKQotCXN0cisrOwotCi0gICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCYgaW5zdC5yZWxvYy5leHAsICYgc3RyKSkKLQlyZXR1cm47Ci0KLSAgICAgIGVuZF9vZl9saW5lIChzdHIpOwotICAgICAgCi0gICAgICBpZiAoICAgaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JICAmJiBpbnN0LnJlbG9jLmV4cC5YX29wICE9IE9fc3ltYm9sKQotCXsKLQkgIGluc3QuZXJyb3IgPSAiQ29uc3RhbnQgZXhwcmVzc2lvbiBleHBlY3RlZCI7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiAoKGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciAmIH4weEZGKSA9PSAwKSkKLQl7Ci0JICAvKiBUaGlzIGNhbiBiZSBkb25lIHdpdGggYSBtb3YgaW5zdHJ1Y3Rpb24gKi8KLQotCSAgaW5zdC5pbnN0cnVjdGlvbiAgPSBUX09QQ09ERV9NT1ZfSTggfCAoUmQgPDwgOCk7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQkgIHJldHVybjsgCi0JfQotCi0gICAgICAvKiBJbnNlcnQgaW50byBsaXRlcmFsIHBvb2wgKi8gICAgIAotICAgICAgaWYgKGFkZF90b19saXRfcG9vbCAoKSA9PSBGQUlMKQotCXsKLQkgIGlmICghaW5zdC5lcnJvcikKLQkgICAgaW5zdC5lcnJvciA9ICJsaXRlcmFsIHBvb2wgaW5zZXJ0aW9uIGZhaWxlZCI7IAotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaW5zdC5yZWxvYy50eXBlICAgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDsKLSAgICAgIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gID0gVF9PUENPREVfTERSX1BDIHwgKFJkIDw8IDgpOwotICAgICAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyICs9IDQ7IC8qIEFkanVzdCBBUk0gcGlwZWxpbmUgb2Zmc2V0IHRvIFRodW1iICovCi0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JcmV0dXJuOwotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfTERSX1BDIHwgKFJkIDw8IDgpOwotICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICAgICAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyIC09IDQ7IC8qIFBpcGVsaW5lIG9mZnNldCAqLwotICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQ7Ci0gICAgICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKFJiID09IFJFR19QQyB8fCBSYiA9PSBSRUdfU1ApCi0gICAgewotICAgICAgaWYgKHNpemUgIT0gVEhVTUJfV09SRCkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiYnl0ZSBvciBoYWxmd29yZCBub3QgdmFsaWQgZm9yIGJhc2UgcmVnaXN0ZXIiKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmIChSYiA9PSBSRUdfUEMgJiYgbG9hZF9zdG9yZSAhPSBUSFVNQl9MT0FEKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJSMTUgYmFzZWQgc3RvcmUgbm90IGFsbG93ZWQiKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmIChSbyAhPSBGQUlMKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJJbnZhbGlkIGJhc2UgcmVnaXN0ZXIgZm9yIHJlZ2lzdGVyIG9mZnNldCIpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKFJiID09IFJFR19QQykKLQlpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfTERSX1BDOwotICAgICAgZWxzZSBpZiAobG9hZF9zdG9yZSA9PSBUSFVNQl9MT0FEKQotCWluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MRFJfU1A7Ci0gICAgICBlbHNlCi0JaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX1NUUl9TUDsKLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCA8PCA4OwotICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICB1bnNpZ25lZCBvZmZzZXQgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0KLQkgIGlmIChvZmZzZXQgJiB+MHgzZmMpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygiaW52YWxpZCBvZmZzZXQiKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBvZmZzZXQgPj4gMjsKLQl9Ci0gICAgICBlbHNlCi0JaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQ7Ci0gICAgfQotICBlbHNlIGlmIChSYiA+IDcpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgYmFzZSByZWdpc3RlciBpbiBsb2FkL3N0b3JlIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBlbHNlIGlmIChSbyA9PSBGQUlMKQotICAgIHsKLSAgICAgIC8qIEltbWVkaWF0ZSBvZmZzZXQgKi8KLSAgICAgIGlmIChzaXplID09IFRIVU1CX1dPUkQpCi0JaW5zdC5pbnN0cnVjdGlvbiA9IChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQKLQkJCSAgICA/IFRfT1BDT0RFX0xEUl9JVyA6IFRfT1BDT0RFX1NUUl9JVyk7Ci0gICAgICBlbHNlIGlmIChzaXplID09IFRIVU1CX0hBTEZXT1JEKQotCWluc3QuaW5zdHJ1Y3Rpb24gPSAobG9hZF9zdG9yZSA9PSBUSFVNQl9MT0FECi0JCQkgICAgPyBUX09QQ09ERV9MRFJfSUggOiBUX09QQ09ERV9TVFJfSUgpOwotICAgICAgZWxzZQotCWluc3QuaW5zdHJ1Y3Rpb24gPSAobG9hZF9zdG9yZSA9PSBUSFVNQl9MT0FECi0JCQkgICAgPyBUX09QQ09ERV9MRFJfSUIgOiBUX09QQ09ERV9TVFJfSUIpOwotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIHwgKFJiIDw8IDMpOwotCi0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIHVuc2lnbmVkIG9mZnNldCA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQkgIAotCSAgaWYgKG9mZnNldCAmIH4oMHgxZiA8PCBzaXplKSkKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJJbnZhbGlkIG9mZnNldCIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSAob2Zmc2V0ID4+IHNpemUpIDw8IDY7Ci0JfQotICAgICAgZWxzZQotCWluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFJlZ2lzdGVyIG9mZnNldCAqLwotICAgICAgaWYgKHNpemUgPT0gVEhVTUJfV09SRCkKLQlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAotCQkJICAgID8gVF9PUENPREVfTERSX1JXIDogVF9PUENPREVfU1RSX1JXKTsKLSAgICAgIGVsc2UgaWYgKHNpemUgPT0gVEhVTUJfSEFMRldPUkQpCi0JaW5zdC5pbnN0cnVjdGlvbiA9IChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQKLQkJCSAgICA/IFRfT1BDT0RFX0xEUl9SSCA6IFRfT1BDT0RFX1NUUl9SSCk7Ci0gICAgICBlbHNlCi0JaW5zdC5pbnN0cnVjdGlvbiA9IChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQKLQkJCSAgICA/IFRfT1BDT0RFX0xEUl9SQiA6IFRfT1BDT0RFX1NUUl9SQik7Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUmIgPDwgMykgfCAoUm8gPDwgNik7Ci0gICAgfQotCi0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9ub3AgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgLyogRG8gbm90aGluZyAqLwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi0vKiBIYW5kbGUgdGhlIEZvcm1hdCA0IGluc3RydWN0aW9ucyB0aGF0IGRvIG5vdCBoYXZlIGVxdWl2YWxlbnRzIGluIG90aGVyIAotICAgZm9ybWF0cy4gIFRoYXQgaXMsIEFEQywgQU5ELCBFT1IsIFNCQywgUk9SLCBUU1QsIE5FRywgQ01OLCBPUlIsIE1VTCwKLSAgIEJJQyBhbmQgTVZOLiAgKi8KLXN0YXRpYyB2b2lkCi1kb190X2FyaXQgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgaW50IFJkLCBScywgUm47Ci0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmICgoUmQgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChScyA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgIT0gRkFJTCkKLSAgICB7Ci0gICAgICAvKiBUaHJlZSBvcGVyYW5kIGZvcm1hdCBub3QgYWxsb3dlZCBmb3IgVFNULCBDTU4sIE5FRyBhbmQgTVZOLgotCSAoSXQgaXNuJ3QgYWxsb3dlZCBmb3IgQ01QIGVpdGhlciwgYnV0IHRoYXQgaXNuJ3QgaGFuZGxlZCBieSB0aGlzCi0JIGZ1bmN0aW9uLikgICovCi0gICAgICBpZiAoaW5zdC5pbnN0cnVjdGlvbiA9PSBUX09QQ09ERV9UU1QKLQkgIHx8IGluc3QuaW5zdHJ1Y3Rpb24gPT0gVF9PUENPREVfQ01OCi0JICB8fCBpbnN0Lmluc3RydWN0aW9uID09IFRfT1BDT0RFX05FRwotIAkgIHx8IGluc3QuaW5zdHJ1Y3Rpb24gPT0gVF9PUENPREVfTVZOKQotCXsKLQkgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmICgoUm4gPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwpCi0JcmV0dXJuOwotCi0gICAgICBpZiAoUnMgIT0gUmQpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oImRlc3QgYW5kIHNvdXJjZTEgb25lIG11c3QgYmUgdGhlIHNhbWUgcmVnaXN0ZXIiKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBScyA9IFJuOwotICAgIH0KLQotICBpZiAoaW5zdC5pbnN0cnVjdGlvbiA9PSBUX09QQ09ERV9NVUwKLSAgICAgICYmIFJzID09IFJkKQotICAgIGFzX3Rza3RzayAoXygiUnMgYW5kIFJkIG11c3QgYmUgZGlmZmVyZW50IGluIE1VTCIpKTsKLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIHwgKFJzIDw8IDMpOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfYWRkIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHRodW1iX2FkZF9zdWIgKHN0ciwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2FzciAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9zaGlmdCAoc3RyLCBUSFVNQl9BU1IpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9icmFuY2g5IChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLSAgICByZXR1cm47Ci0gIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5OwotICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9icmFuY2gxMiAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0gICAgcmV0dXJuOwotICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTI7Ci0gIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLS8qIEZpbmQgdGhlIHJlYWwsIFRodW1iIGVuY29kZWQgc3RhcnQgb2YgYSBUaHVtYiBmdW5jdGlvbi4gICovCi0KLXN0YXRpYyBzeW1ib2xTICoKLWZpbmRfcmVhbF9zdGFydCAoc3ltYm9sUCkKLSAgICAgc3ltYm9sUyAqIHN5bWJvbFA7Ci17Ci0gIGNoYXIgKiAgICAgICByZWFsX3N0YXJ0OwotICBjb25zdCBjaGFyICogbmFtZSA9IFNfR0VUX05BTUUgKHN5bWJvbFApOwotICBzeW1ib2xTICogICAgbmV3X3RhcmdldDsKLQotICAvKiBUaGlzIGRlZmluaXRvbm11c3QgYWdyZWUgd2l0aCB0aGUgb25lIGluIGdjYy9jb25maWcvYXJtL3RodW1iLmMgKi8KLSNkZWZpbmUgU1RVQl9OQU1FICIucmVhbF9zdGFydF9vZiIKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIGFib3J0KCk7Ci0KLSAgLyogTmFtZXMgdGhhdCBzdGFydCB3aXRoICcuJyBhcmUgbG9jYWwgbGFiZWxzLCBub3QgZnVuY3Rpb24gZW50cnkgcG9pbnRzLgotICAgICBUaGUgY29tcGlsZXIgbWF5IGdlbmVyYXRlIEJMIGluc3RydWN0aW9ucyB0byB0aGVzZSBsYWJlbHMgYmVjYXVzZSBpdAotICAgICBuZWVkcyB0byBwZXJmb3JtIGEgYnJhbmNoIHRvIGEgZmFyIGF3YXkgbG9jYXRpb24uICAqLwotICBpZiAobmFtZVswXSA9PSAnLicpCi0gICAgcmV0dXJuIHN5bWJvbFA7Ci0gIAotICByZWFsX3N0YXJ0ID0gbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChTVFVCX05BTUUpICsgMSk7Ci0gIHNwcmludGYgKHJlYWxfc3RhcnQsICIlcyVzIiwgU1RVQl9OQU1FLCBuYW1lKTsKLQotICBuZXdfdGFyZ2V0ID0gc3ltYm9sX2ZpbmQgKHJlYWxfc3RhcnQpOwotICAKLSAgaWYgKG5ld190YXJnZXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuICgiRmFpbGVkIHRvIGZpbmQgcmVhbCBzdGFydCBvZiBmdW5jdGlvbjogJXNcbiIsIG5hbWUpOwotICAgICAgbmV3X3RhcmdldCA9IHN5bWJvbFA7Ci0gICAgfQotCi0gIGZyZWUgKHJlYWxfc3RhcnQpOwotCi0gIHJldHVybiBuZXdfdGFyZ2V0OwotfQotCi0KLXN0YXRpYyB2b2lkCi1kb190X2JyYW5jaDIzIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLSAgICByZXR1cm47Ci0gIGluc3QucmVsb2MudHlwZSAgID0gQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzOwotICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotCi0gIC8qIElmIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgYnJhbmNoIGlzIGEgZGVmaW5lZCBzeW1ib2wgd2hpY2ggZG9lcyBub3QgaGF2ZQotICAgICB0aGUgVEhVTUJfRlVOQyBhdHRyaWJ1dGUsIHRoZW4gd2UgbXVzdCBiZSBjYWxsaW5nIGEgZnVuY3Rpb24gd2hpY2ggaGFzCi0gICAgIHRoZSAoaW50ZXJmYWNlYXJtKSBhdHRyaWJ1dGUuICBXZSBsb29rIGZvciB0aGUgVGh1bWIgZW50cnkgcG9pbnQgdG8gdGhhdAotICAgICBmdW5jdGlvbiBhbmQgY2hhbmdlIHRoZSBicmFuY2ggdG8gcmVmZXIgdG8gdGhhdCBmdW5jdGlvbiBpbnN0ZWFkLiAgKi8KLSAgaWYgKCAgIGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19zeW1ib2wKLSAgICAgICYmIGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCAhPSBOVUxMCi0gICAgICAmJiBTX0lTX0RFRklORUQgKGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCkKLSAgICAgICYmICEgVEhVTUJfSVNfRlVOQyAoaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sKSkKLSAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9zeW1ib2wgPSBmaW5kX3JlYWxfc3RhcnQgKGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2J4IChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGludCByZWc7Ci0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmICgocmVnID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfQU5ZKSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgLyogVGhpcyBzZXRzIFRIVU1CX0gyIGZyb20gdGhlIHRvcCBiaXQgb2YgcmVnLiAgKi8KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSByZWcgPDwgMzsKLQotICAvKiA/Pz8gRklYTUU6IFNob3VsZCBhZGQgYSBoYWNreSByZWxvYyBoZXJlIGlmIHJlZyBpcyBSRUdfUEMuICBUaGUgcmVsb2MKLSAgICAgc2hvdWxkIGNhdXNlIHRoZSBhbGlnbm1lbnQgdG8gYmUgY2hlY2tlZCBvbmNlIGl0IGlzIGtub3duLiAgVGhpcyBpcwotICAgICBiZWNhdXNlIEJYIFBDIG9ubHkgd29ya3MgaWYgdGhlIGluc3RydWN0aW9uIGlzIHdvcmQgYWxpZ25lZC4gICovCi0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2NvbXBhcmUgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbW92X2NvbXBhcmUgKHN0ciwgVEhVTUJfQ09NUEFSRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2xkbXN0bSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBpbnQgUmI7Ci0gIGxvbmcgcmFuZ2U7Ci0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmICgoUmIgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwpCi0gICAgcmV0dXJuOwotCi0gIGlmICgqc3RyICE9ICchJykKLSAgICBhc193YXJuIChfKCJJbnNlcnRlZCBtaXNzaW5nICchJzogbG9hZC9zdG9yZSBtdWx0aXBsZSBhbHdheXMgd3JpdGVzIGJhY2sgYmFzZSByZWdpc3RlciIpKTsKLSAgZWxzZQotICAgIHN0cisrOwotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChyYW5nZSA9IHJlZ19saXN0ICgmc3RyKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGluc3QucmVsb2MudHlwZSAhPSBCRkRfUkVMT0NfTk9ORSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIHJlYWxseSBkb2Vzbid0IHNlZW0gd29ydGggaXQuICovCi0gICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfTk9ORTsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJFeHByZXNzaW9uIHRvbyBjb21wbGV4Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyYW5nZSAmIH4weGZmKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJvbmx5IGxvLXJlZ3MgdmFsaWQgaW4gbG9hZC9zdG9yZSBtdWx0aXBsZSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IChSYiA8PCA4KSB8IHJhbmdlOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbGRyIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHRodW1iX2xvYWRfc3RvcmUgKHN0ciwgVEhVTUJfTE9BRCwgVEhVTUJfV09SRCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2xkcmIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbG9hZF9zdG9yZSAoc3RyLCBUSFVNQl9MT0FELCBUSFVNQl9CWVRFKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbGRyaCAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX0xPQUQsIFRIVU1CX0hBTEZXT1JEKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbGRzIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGludCBSZCwgUmIsIFJvOwotCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoKFJkID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8ICpzdHIrKyAhPSAnWycKLSAgICAgIHx8IChSYiA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAoUm8gPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwKLSAgICAgIHx8ICpzdHIrKyAhPSAnXScpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gXygiU3ludGF4OiBsZHJzW2JdIFJkLCBbUmIsIFJvXSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIHwgKFJiIDw8IDMpIHwgKFJvIDw8IDYpOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbHNsIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHRodW1iX3NoaWZ0IChzdHIsIFRIVU1CX0xTTCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2xzciAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9zaGlmdCAoc3RyLCBUSFVNQl9MU1IpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9tb3YgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbW92X2NvbXBhcmUgKHN0ciwgVEhVTUJfTU9WRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X3B1c2hfcG9wIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGxvbmcgcmFuZ2U7Ci0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmICgocmFuZ2UgPSByZWdfbGlzdCAoJnN0cikpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbnN0LnJlbG9jLnR5cGUgIT0gQkZEX1JFTE9DX05PTkUpCi0gICAgewotICAgICAgLyogVGhpcyByZWFsbHkgZG9lc24ndCBzZWVtIHdvcnRoIGl0LiAqLwotICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX05PTkU7Ci0gICAgICBpbnN0LmVycm9yID0gXygiRXhwcmVzc2lvbiB0b28gY29tcGxleCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocmFuZ2UgJiB+MHhmZikKLSAgICB7Ci0gICAgICBpZiAoKGluc3QuaW5zdHJ1Y3Rpb24gPT0gVF9PUENPREVfUFVTSAotCSAgICYmIChyYW5nZSAmIH4weGZmKSA9PSAxIDw8IFJFR19MUikKLQkgIHx8IChpbnN0Lmluc3RydWN0aW9uID09IFRfT1BDT0RFX1BPUAotCSAgICAgICYmIChyYW5nZSAmIH4weGZmKSA9PSAxIDw8IFJFR19QQykpCi0JewotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBUSFVNQl9QUF9QQ19MUjsKLQkgIHJhbmdlICY9IDB4ZmY7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIHJlZ2lzdGVyIGxpc3QgdG8gcHVzaC9wb3AgaW5zdHJ1Y3Rpb24iKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gcmFuZ2U7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9zdHIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbG9hZF9zdG9yZSAoc3RyLCBUSFVNQl9TVE9SRSwgVEhVTUJfV09SRCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X3N0cmIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbG9hZF9zdG9yZSAoc3RyLCBUSFVNQl9TVE9SRSwgVEhVTUJfQllURSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X3N0cmggKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbG9hZF9zdG9yZSAoc3RyLCBUSFVNQl9TVE9SRSwgVEhVTUJfSEFMRldPUkQpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9zdWIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfYWRkX3N1YiAoc3RyLCAxKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3Rfc3dpIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0gICAgcmV0dXJuOwotCi0gIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fU1dJOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9hZHIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgLyogVGhpcyBpcyBhIHBzZXVkby1vcCBvZiB0aGUgZm9ybSAiYWRyIHJkLCBsYWJlbCIgdG8gYmUgY29udmVydGVkCi0gICAgIGludG8gYSByZWxhdGl2ZSBhZGRyZXNzIG9mIHRoZSBmb3JtICJhZGQgcmQsIHBjLCAjbGFiZWwtLi00IiAqLwotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCA0KSA9PSBGQUlMICAvKiBTdG9yZSBSZCBpbiB0ZW1wb3JhcnkgbG9jYXRpb24gaW5zaWRlIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgbXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9BREQ7Ci0gIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciAtPSA0OyAvKiBQQyByZWxhdGl2ZSBhZGp1c3QgKi8KLSAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICBpbnN0Lmluc3RydWN0aW9uIHw9IFJFR19QQzsgLyogUmQgaXMgYWxyZWFkeSBwbGFjZWQgaW50byB0aGUgaW5zdHJ1Y3Rpb24gKi8KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbnNlcnRfcmVnIChlbnRyeSkKLSAgICAgaW50IGVudHJ5OwotewotICBpbnQgICAgbGVuID0gc3RybGVuIChyZWdfdGFibGVbZW50cnldLm5hbWUpICsgMjsKLSAgY2hhciAqIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKGxlbik7Ci0gIGNoYXIgKiBidWYyID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLSAgaW50ICAgIGkgPSAwOwotCi0jaWZkZWYgUkVHSVNURVJfUFJFRklYCi0gIGJ1ZltpKytdID0gUkVHSVNURVJfUFJFRklYOwotI2VuZGlmCi0KLSAgc3RyY3B5IChidWYgKyBpLCByZWdfdGFibGVbZW50cnldLm5hbWUpOwotCi0gIGZvciAoaSA9IDA7IGJ1ZltpXTsgaSsrKQotICAgIGJ1ZjJbaV0gPSBpc2xvd2VyIChidWZbaV0pID8gdG91cHBlciAoYnVmW2ldKSA6IGJ1ZltpXTsKLQotICBidWYyW2ldID0gJ1wwJzsKLQotICBoYXNoX2luc2VydCAoYXJtX3JlZ19oc2gsIGJ1ZiwgKFBUUikgJnJlZ190YWJsZVtlbnRyeV0pOwotICBoYXNoX2luc2VydCAoYXJtX3JlZ19oc2gsIGJ1ZjIsIChQVFIpICZyZWdfdGFibGVbZW50cnldKTsKLX0KLQotc3RhdGljIHZvaWQKLWluc2VydF9yZWdfYWxpYXMgKHN0ciwgcmVnbnVtKQotICAgICBjaGFyICpzdHI7Ci0gICAgIGludCByZWdudW07Ci17Ci0gIHN0cnVjdCByZWdfZW50cnkgKm5ldyA9Ci0gICAgKHN0cnVjdCByZWdfZW50cnkgKil4bWFsbG9jIChzaXplb2YgKHN0cnVjdCByZWdfZW50cnkpKTsKLSAgY2hhciAqbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAoc3RyKSArIDEpOwotICBzdHJjcHkgKG5hbWUsIHN0cik7Ci0KLSAgbmV3LT5uYW1lID0gbmFtZTsKLSAgbmV3LT5udW1iZXIgPSByZWdudW07Ci0KLSAgaGFzaF9pbnNlcnQgKGFybV9yZWdfaHNoLCBuYW1lLCAoUFRSKSBuZXcpOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X2NvbnN0YW50X2Zsb251bXMgKCkKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9GTE9BVF9WQUxTOyBpKyspCi0gICAgaWYgKGF0b2ZfaWVlZSAoKGNoYXIgKilmcF9jb25zdFtpXSwgJ3gnLCBmcF92YWx1ZXNbaV0pID09IE5VTEwpCi0gICAgICBhYm9ydCAoKTsKLX0KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgaW50IGk7Ci0gIAotICBpZiAoICAgKGFybV9vcHNfaHNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwKLSAgICAgIHx8IChhcm1fdG9wc19oc2ggPSBoYXNoX25ldyAoKSkgPT0gTlVMTAotICAgICAgfHwgKGFybV9jb25kX2hzaCA9IGhhc2hfbmV3ICgpKSA9PSBOVUxMCi0gICAgICB8fCAoYXJtX3NoaWZ0X2hzaCA9IGhhc2hfbmV3ICgpKSA9PSBOVUxMCi0gICAgICB8fCAoYXJtX3JlZ19oc2ggPSBoYXNoX25ldyAoKSkgPT0gTlVMTAotICAgICAgfHwgKGFybV9wc3JfaHNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oIlZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpKTsKLSAgICAKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoaW5zbnMpIC8gc2l6ZW9mIChzdHJ1Y3QgYXNtX29wY29kZSk7IGkrKykKLSAgICBoYXNoX2luc2VydCAoYXJtX29wc19oc2gsIGluc25zW2ldLnRlbXBsYXRlLCAoUFRSKSAoaW5zbnMgKyBpKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHRpbnNucykgLyBzaXplb2YgKHN0cnVjdCB0aHVtYl9vcGNvZGUpOyBpKyspCi0gICAgaGFzaF9pbnNlcnQgKGFybV90b3BzX2hzaCwgdGluc25zW2ldLnRlbXBsYXRlLCAoUFRSKSAodGluc25zICsgaSkpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChjb25kcykgLyBzaXplb2YgKHN0cnVjdCBhc21fY29uZCk7IGkrKykKLSAgICBoYXNoX2luc2VydCAoYXJtX2NvbmRfaHNoLCBjb25kc1tpXS50ZW1wbGF0ZSwgKFBUUikgKGNvbmRzICsgaSkpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzaGlmdCkgLyBzaXplb2YgKHN0cnVjdCBhc21fc2hpZnQpOyBpKyspCi0gICAgaGFzaF9pbnNlcnQgKGFybV9zaGlmdF9oc2gsIHNoaWZ0W2ldLnRlbXBsYXRlLCAoUFRSKSAoc2hpZnQgKyBpKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBzcnMpIC8gc2l6ZW9mIChzdHJ1Y3QgYXNtX3Bzcik7IGkrKykKLSAgICBoYXNoX2luc2VydCAoYXJtX3Bzcl9oc2gsIHBzcnNbaV0udGVtcGxhdGUsIChQVFIpIChwc3JzICsgaSkpOwotCi0gIGZvciAoaSA9IDA7IHJlZ190YWJsZVtpXS5uYW1lOyBpKyspCi0gICAgaW5zZXJ0X3JlZyAoaSk7Ci0KLSAgc2V0X2NvbnN0YW50X2Zsb251bXMgKCk7Ci0KLSNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgotICB7Ci0gICAgdW5zaWduZWQgaW50IGZsYWdzID0gMDsKLSAgICAKLSAgICAvKiBTZXQgdGhlIGZsYWdzIGluIHRoZSBwcml2YXRlIHN0cnVjdHVyZSAqLwotICAgIGlmICh1c2VzX2FwY3NfMjYpICAgICAgZmxhZ3MgfD0gRl9BUENTMjY7Ci0gICAgaWYgKHN1cHBvcnRfaW50ZXJ3b3JrKSBmbGFncyB8PSBGX0lOVEVSV09SSzsKLSAgICBpZiAodXNlc19hcGNzX2Zsb2F0KSAgIGZsYWdzIHw9IEZfQVBDU19GTE9BVDsKLSAgICBpZiAocGljX2NvZGUpICAgICAgICAgIGZsYWdzIHw9IEZfUElDOwotCi0gICAgYmZkX3NldF9wcml2YXRlX2ZsYWdzIChzdGRvdXRwdXQsIGZsYWdzKTsKLSAgfQotI2VuZGlmCi0gIAotICB7Ci0gICAgdW5zaWduZWQgbWFjaDsKLSAgICAKLSAgICAvKiBSZWNvcmQgdGhlIENQVSB0eXBlIGFzIHdlbGwgKi8KLSAgICBzd2l0Y2ggKGNwdV92YXJpYW50ICYgQVJNX0NQVV9NQVNLKQotICAgICAgewotICAgICAgY2FzZSBBUk1fMjoKLQltYWNoID0gYmZkX21hY2hfYXJtXzI7Ci0JYnJlYWs7Ci0JCi0gICAgICBjYXNlIEFSTV8zOiAvKiBhbHNvIEFSTV8yNTAgKi8KLQltYWNoID0gYmZkX21hY2hfYXJtXzJhOwotCWJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgY2FzZSBBUk1fNiB8IEFSTV8zIHwgQVJNXzI6CS8qIEFjdHVhbGx5IG5vIENQVSB0eXBlIGRlZmluZWQgKi8KLQltYWNoID0gYmZkX21hY2hfYXJtXzQ7Ci0JYnJlYWs7Ci0JCi0gICAgICBjYXNlIEFSTV83OiAJCQkvKiBhbHNvIEFSTV82ICovCi0JbWFjaCA9IGJmZF9tYWNoX2FybV8zOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgLyogQ2F0Y2ggc3BlY2lhbCBjYXNlcyAqLwotICAgIGlmIChjcHVfdmFyaWFudCAhPSAoRlBVX0RFRkFVTFQgfCBDUFVfREVGQVVMVCkpCi0gICAgICB7Ci0JaWYgKGNwdV92YXJpYW50ICYgQVJNX1RIVU1CKQotCSAgbWFjaCA9IGJmZF9tYWNoX2FybV80VDsKLQllbHNlIGlmICgoY3B1X3ZhcmlhbnQgJiBBUk1fQVJDSHY0KSA9PSBBUk1fQVJDSHY0KQotCSAgbWFjaCA9IGJmZF9tYWNoX2FybV80OwotCWVsc2UgaWYgKGNwdV92YXJpYW50ICYgQVJNX0xPTkdNVUwpCi0JICBtYWNoID0gYmZkX21hY2hfYXJtXzNNOwotICAgICAgfQotCQotICAgIGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIFRBUkdFVF9BUkNILCBtYWNoKTsKLSAgfQotfQotCi0vKiBUdXJuIGFuIGludGVnZXIgb2YgbiBieXRlcyAoaW4gdmFsKSBpbnRvIGEgc3RyZWFtIG9mIGJ5dGVzIGFwcHJvcHJpYXRlCi0gICBmb3IgdXNlIGluIHRoZSBhLm91dCBmaWxlLCBhbmQgc3RvcmVzIHRoZW0gaW4gdGhlIGFycmF5IHBvaW50ZWQgdG8gYnkgYnVmLgotICAgVGhpcyBrbm93cyBhYm91dCB0aGUgZW5kaWFuLW5lc3Mgb2YgdGhlIHRhcmdldCBtYWNoaW5lIGFuZCBkb2VzCi0gICBUSEUgUklHSFQgVEhJTkcsIHdoYXRldmVyIGl0IGlzLiAgUG9zc2libGUgdmFsdWVzIGZvciBuIGFyZSAxIChieXRlKQotICAgMiAoc2hvcnQpIGFuZCA0IChsb25nKSAgRmxvYXRpbmcgbnVtYmVycyBhcmUgcHV0IG91dCBhcyBhIHNlcmllcyBvZgotICAgTElUVExFTlVNUyAoc2hvcnRzLCBoZXJlIGF0IGxlYXN0KQotICAgKi8KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKiBidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCAgICBuOwotewotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotICBlbHNlCi0gICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotCi1zdGF0aWMgdmFsdWVUIAotbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIG4pCi0gICAgIGNoYXIgKiBidWY7Ci0gICAgIGludCBuOwotewotICB2YWx1ZVQgcmVzdWx0ID0gMDsKLSAgdW5zaWduZWQgY2hhciAqIHdoZXJlID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmOwotCi0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICB3aGlsZSAobi0tKQotCXsKLQkgIHJlc3VsdCA8PD0gODsKLQkgIHJlc3VsdCB8PSAoKndoZXJlKysgJiAyNTUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAobi0tKQotCXsKLQkgIHJlc3VsdCA8PD0gODsKLQkgIHJlc3VsdCB8PSAod2hlcmVbbl0gJiAyNTUpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICBvZiB0eXBlIFRZUEUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyCi0gICBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzCi0gICByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLQotICAgTm90ZSB0aGF0IGZwIGNvbnN0YW50cyBhcmVuJ3QgcmVwcmVzZW50IGluIHRoZSBub3JtYWwgd2F5IG9uIHRoZSBBUk0uCi0gICBJbiBiaWcgZW5kaWFuIG1vZGUsIHRoaW5ncyBhcmUgYXMgZXhwZWN0ZWQuICBIb3dldmVyLCBpbiBsaXR0bGUgZW5kaWFuCi0gICBtb2RlIGZwIGNvbnN0YW50cyBhcmUgYmlnLWVuZGlhbiB3b3JkLXdpc2UsIGFuZCBsaXR0bGUtZW5kaWFuIGJ5dGUtd2lzZQotICAgd2l0aGluIHRoZSB3b3Jkcy4gIEZvciBleGFtcGxlLCAoZG91YmxlKSAxLjEgaW4gYmlnIGVuZGlhbiBtb2RlIGlzCi0gICB0aGUgYnl0ZSBzZXF1ZW5jZSAzZiBmMSA5OSA5OSA5OSA5OSA5OSA5YSwgYW5kIGluIGxpdHRsZSBlbmRpYW4gbW9kZSBpcwotICAgdGhlIGJ5dGUgc2VxdWVuY2UgOTkgOTkgZjEgM2YgOWEgOTkgOTkgOTkuCi0KLSAgID8/PyBUaGUgZm9ybWF0IG9mIDEyIGJ5dGUgZmxvYXRzIGlzIHVuY2VydGFpbiBhY2NvcmRpbmcgdG8gZ2NjJ3MgYXJtLmguICAqLwotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyICAgdHlwZTsKLSAgICAgY2hhciAqIGxpdFA7Ci0gICAgIGludCAqICBzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICpzaXplUCA9IHByZWMgKiAyOwotCi0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0UCArPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGb3IgYSA0IGJ5dGUgZmxvYXQgdGhlIG9yZGVyIG9mIGVsZW1lbnRzIGluIGB3b3JkcycgaXMgMSAwLiAgRm9yIGFuCi0JIDggYnl0ZSBmbG9hdCB0aGUgb3JkZXIgaXMgMSAwIDMgMi4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSArPSAyKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaSArIDFdLCAyKTsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCArIDIsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gNDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBUaGUga25vd2xlZGdlIG9mIHRoZSBQQydzIHBpcGVsaW5lIG9mZnNldCBpcyBidWlsdCBpbnRvIHRoZSByZWxvY3MKLSAgIGZvciB0aGUgRUxGIHBvcnQgYW5kIGludG8gdGhlIGluc25zIHRoZW1zZWx2ZXMgZm9yIHRoZSBDT0ZGIHBvcnQuICAqLwotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqIGZpeFA7Ci17Ci0gIGlmICggICBmaXhQLT5meF9hZGRzeQotICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpID09IHVuZGVmaW5lZF9zZWN0aW9uCi0gICAgICAmJiBmaXhQLT5meF9zdWJzeSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAKLSAgaWYgKGZpeFAtPmZ4X3BjcmVsICYmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9USFVNQl9BREQpKQotICAgIHsKLSAgICAgIC8qIFBDIHJlbGF0aXZlIGFkZHJlc3Npbmcgb24gdGhlIFRodW1iIGlzIHNsaWdodGx5IG9kZAotCSBhcyB0aGUgYm90dG9tIHR3byBiaXRzIG9mIHRoZSBQQyBhcmUgZm9yY2VkIHRvIHplcm8KLQkgZm9yIHRoZSBjYWxjdWxhdGlvbiAqLwotICAgICAgcmV0dXJuIChmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MpICYgfjM7Ci0gICAgfQotICAKLSAgcmV0dXJuIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAqLwotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUICAgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0jaWZkZWYgT0JKX0VMRgotICAvKiBEb24ndCBhbGlnbiB0aGUgZHdhcmYyIGRlYnVnIHNlY3Rpb25zICovCi0gIGlmICghc3RybmNtcCAoc2VnbWVudC0+bmFtZSwgIi5kZWJ1ZyIsIDUpKQotICAgIHJldHVybiBzaXplOwotI2VuZGlmCi0gIC8qIFJvdW5kIGFsbCBzZWN0cyB0byBtdWx0aXBsZSBvZiA0ICovCi0gIHJldHVybiAoc2l6ZSArIDMpICYgfjM7Ci19Ci0KLS8qIFVuZGVyIEVMRiB3ZSBuZWVkIHRvIGRlZmF1bHQgX0dMT0JBTF9PRkZTRVRfVEFCTEUuICBPdGhlcndpc2UgCi0gICB3ZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCi0KLS8qIEFSR1NVU0VEICovCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKiBuYW1lOwotewotI2lmZGVmIE9CSl9FTEYKLSAgaWYgKG5hbWVbMF0gPT0gJ18nICYmIG5hbWVbMV0gPT0gJ0cnCi0gICAgICAmJiBzdHJlcSAobmFtZSwgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKSkKLSAgICB7Ci0gICAgICBpZiAoIUdPVF9zeW1ib2wpCi0JewotCSAgaWYgKHN5bWJvbF9maW5kIChuYW1lKSkKLQkgICAgYXNfYmFkICgiR09UIGFscmVhZHkgaW4gdGhlIHN5bWJvbCB0YWJsZSIpOwotCSAgCi0JICBHT1Rfc3ltYm9sID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sCi0JCQkJICAgKHZhbHVlVCkwLCAmIHplcm9fYWRkcmVzc19mcmFnKTsKLQl9Ci0gICAgICAKLSAgICAgIHJldHVybiBHT1Rfc3ltYm9sOwotICAgIH0KLSNlbmRpZgotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIGFybV9yZWdfcGFyc2UgKCkgOj0gaWYgaXQgbG9va3MgbGlrZSBhIHJlZ2lzdGVyLCByZXR1cm4gaXRzIHRva2VuIGFuZCAKLSAgIGFkdmFuY2UgdGhlIHBvaW50ZXIuICovCi0KLXN0YXRpYyBpbnQKLWFybV9yZWdfcGFyc2UgKGNjcCkKLSAgICAgcmVnaXN0ZXIgY2hhciAqKiBjY3A7Ci17Ci0gIGNoYXIgKiBzdGFydCA9ICogY2NwOwotICBjaGFyICAgYzsKLSAgY2hhciAqIHA7Ci0gIHN0cnVjdCByZWdfZW50cnkgKiByZWc7Ci0KLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVgKLSAgaWYgKCpzdGFydCAhPSBSRUdJU1RFUl9QUkVGSVgpCi0gICAgcmV0dXJuIEZBSUw7Ci0gIHAgPSBzdGFydCArIDE7Ci0jZWxzZQotICBwID0gc3RhcnQ7Ci0jaWZkZWYgT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYCi0gIGlmICgqcCA9PSBPUFRJT05BTF9SRUdJU1RFUl9QUkVGSVgpCi0gICAgcCsrLCBzdGFydCsrOwotI2VuZGlmCi0jZW5kaWYKLSAgaWYgKCFpc2FscGhhICgqcCkgfHwgIWlzX25hbWVfYmVnaW5uZXIgKCpwKSkKLSAgICByZXR1cm4gRkFJTDsKLQotICBjID0gKnArKzsKLSAgd2hpbGUgKGlzYWxwaGEgKGMpIHx8IGlzZGlnaXQgKGMpIHx8IGMgPT0gJ18nKQotICAgIGMgPSAqcCsrOwotCi0gICotLXAgPSAwOwotICByZWcgPSAoc3RydWN0IHJlZ19lbnRyeSAqKSBoYXNoX2ZpbmQgKGFybV9yZWdfaHNoLCBzdGFydCk7Ci0gICpwID0gYzsKLSAgCi0gIGlmIChyZWcpCi0gICAgewotICAgICAgKmNjcCA9IHA7Ci0gICAgICByZXR1cm4gcmVnLT5udW1iZXI7Ci0gICAgfQotCi0gIHJldHVybiBGQUlMOwotfQotCi1zdGF0aWMgaW50Ci1hcm1fcHNyX3BhcnNlIChjY3ApCi0gICAgIHJlZ2lzdGVyIGNoYXIgKiogY2NwOwotewotICBjaGFyICogc3RhcnQgPSAqIGNjcDsKLSAgY2hhciAgIGM7Ci0gIGNoYXIgKiBwOwotICBDT05TVCBzdHJ1Y3QgYXNtX3BzciAqIHBzcjsKLQotICBwID0gc3RhcnQ7Ci0gIGMgPSAqcCsrOwotICB3aGlsZSAoaXNhbHBoYSAoYykgfHwgYyA9PSAnXycpCi0gICAgYyA9ICpwKys7Ci0KLSAgKi0tcCA9IDA7ICAKLSAgcHNyID0gKENPTlNUIHN0cnVjdCBhc21fcHNyICopIGhhc2hfZmluZCAoYXJtX3Bzcl9oc2gsIHN0YXJ0KTsKLSAgKnAgPSBjOwotCi0gIGlmIChwc3IpCi0gICAgewotICAgICAgKmNjcCA9IHA7Ci0gICAgICByZXR1cm4gcHNyLT5udW1iZXI7Ci0gICAgfQotCi0gIHJldHVybiBGQUlMOwotfQotCi1pbnQKLW1kX2FwcGx5X2ZpeDMgKGZpeFAsIHZhbCwgc2VnKQotICAgICBmaXhTICogICAgICBmaXhQOwotICAgICB2YWx1ZVQgKiAgICB2YWw7Ci0gICAgIHNlZ1QgICAgICAgIHNlZzsKLXsKLSAgb2Zmc2V0VCAgICAgICAgdmFsdWUgPSAqIHZhbDsKLSAgb2Zmc2V0VCAgICAgICAgbmV3dmFsOwotICB1bnNpZ25lZCBpbnQgICBuZXdpbW07Ci0gIHVuc2lnbmVkIGxvbmcgIHRlbXA7Ci0gIGludCAgICAgICAgICAgIHNpZ247Ci0gIGNoYXIgKiAgICAgICAgIGJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLSAgYXJtX2ZpeF9kYXRhICogYXJtX2RhdGEgPSAoYXJtX2ZpeF9kYXRhICopIGZpeFAtPnRjX2ZpeF9kYXRhOwotCi0gIGFzc2VydCAoZml4UC0+Znhfcl90eXBlIDwgQkZEX1JFTE9DX1VOVVNFRCk7Ci0KLSAgLyogTm90ZSB3aGV0aGVyIHRoaXMgd2lsbCBkZWxldGUgdGhlIHJlbG9jYXRpb24uICAqLwotI2lmIDAgLyogcGF0Y2ggZnJvbSBSRWFybnNoYXcgdG8gSkRhdmlzIChkaXNhYmxlZCBmb3IgdGhlIG1vbWVudCwgc2luY2UgaXQgZG9lc24ndCB3b3JrIGZ1bGx5KSAqLwotICBpZiAoKGZpeFAtPmZ4X2FkZHN5ID09IDAgfHwgZml4UC0+ZnhfYWRkc3ktPnN5X3ZhbHVlLlhfb3AgPT0gT19jb25zdGFudCkKLSAgICAgICYmICFmaXhQLT5meF9wY3JlbCkKLSNlbHNlCi0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSAwICYmICFmaXhQLT5meF9wY3JlbCkKLSNlbmRpZgotICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGluIGEgZGlmZmVyZW50IHNlY3Rpb24gdGhlbiB3ZSBuZWVkIHRvIGxlYXZlIGl0IGZvcgotICAgICB0aGUgbGlua2VyIHRvIGRlYWwgd2l0aC4gIFVuZm9ydHVuYXRlbHksIG1kX3BjcmVsX2Zyb20gY2FuJ3QgdGVsbCwKLSAgICAgc28gd2UgaGF2ZSB0byB1bmRvIGl0J3MgZWZmZWN0cyBoZXJlLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotICAgIHsKLSAgICAgIGlmIChmaXhQLT5meF9hZGRzeSAhPSBOVUxMCi0JICAmJiBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCSAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IHNlZykKLQl7Ci0JICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNIKQotCSAgICB2YWx1ZSA9IDA7Ci0JICBlbHNlCi0JICAgIHZhbHVlICs9IG1kX3BjcmVsX2Zyb20gKGZpeFApOwotCX0KLSAgICB9Ci0KLSAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsdWU7CS8qIFJlbWVtYmVyIHZhbHVlIGZvciBlbWl0X3JlbG9jICovCi0KLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9JTU1FRElBVEU6Ci0gICAgICBuZXdpbW0gPSB2YWxpZGF0ZV9pbW1lZGlhdGUgKHZhbHVlKTsKLSAgICAgIHRlbXAgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLQotICAgICAgLyogSWYgdGhlIGluc3RydWN0aW9uIHdpbGwgZmFpbCwgc2VlIGlmIHdlIGNhbiBmaXggdGhpbmdzIHVwIGJ5Ci0JIGNoYW5naW5nIHRoZSBvcGNvZGUuICAqLwotICAgICAgaWYgKG5ld2ltbSA9PSAodW5zaWduZWQgaW50KSBGQUlMCi0JICAmJiAobmV3aW1tID0gbmVnYXRlX2RhdGFfb3AgKCZ0ZW1wLCB2YWx1ZSkpID09ICh1bnNpZ25lZCBpbnQpIEZBSUwpCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygiaW52YWxpZCBjb25zdGFudCAoJXgpIGFmdGVyIGZpeHVwXG4iKSwgdmFsdWUpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBuZXdpbW0gfD0gKHRlbXAgJiAweGZmZmZmMDAwKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCAodmFsdWVUKSBuZXdpbW0sIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgICBjYXNlIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTToKLSAgICAgIHNpZ24gPSB2YWx1ZSA+PSAwOwotICAgICAgaWYgKCh2YWx1ZSA9IHZhbGlkYXRlX29mZnNldF9pbW0gKHZhbHVlLCAwKSkgPT0gRkFJTCkKLSAgICAgICAgewotICAgICAgICAgIGFzX2JhZCAoXygiYmFkIGltbWVkaWF0ZSB2YWx1ZSBmb3Igb2Zmc2V0ICglZCkiKSwgdmFsKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgaWYgKHZhbHVlIDwgMCkKLQl2YWx1ZSA9IC12YWx1ZTsKLQotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSk7Ci0gICAgICBuZXd2YWwgJj0gMHhmZjdmZjAwMDsKLSAgICAgIG5ld3ZhbCB8PSB2YWx1ZSB8IChzaWduID8gSU5ERVhfVVAgOiAwKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgICBjYXNlIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTg6Ci0gICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUw6Ci0gICAgICBzaWduID0gdmFsdWUgPj0gMDsKLSAgICAgIGlmICgodmFsdWUgPSB2YWxpZGF0ZV9vZmZzZXRfaW1tICh2YWx1ZSwgMSkpID09IEZBSUwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIAotCQkJXygiaW52YWxpZCBsaXRlcmFsIGNvbnN0YW50OiBwb29sIG5lZWRzIHRvIGJlIGNsb3NlclxuIikpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFzX2JhZCAoXygiYmFkIGltbWVkaWF0ZSB2YWx1ZSBmb3Igb2Zmc2V0ICglZCkiKSwgdmFsdWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgIGlmICh2YWx1ZSA8IDApCi0JdmFsdWUgPSAtdmFsdWU7Ci0KLSAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBJTlNOX1NJWkUpOwotICAgICAgbmV3dmFsICY9IDB4ZmY3ZmYwZjA7Ci0gICAgICBuZXd2YWwgfD0gKCh2YWx1ZSA+PiA0KSA8PCA4KSB8IHZhbHVlICYgMHhmIHwgKHNpZ24gPyBJTkRFWF9VUCA6IDApOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgSU5TTl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0xJVEVSQUw6Ci0gICAgICBzaWduID0gdmFsdWUgPj0gMDsKLSAgICAgIGlmICh2YWx1ZSA8IDApCi0JdmFsdWUgPSAtdmFsdWU7Ci0KLSAgICAgIGlmICgodmFsdWUgPSB2YWxpZGF0ZV9vZmZzZXRfaW1tICh2YWx1ZSwgMCkpID09IEZBSUwpCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCAKLQkJCV8oImludmFsaWQgbGl0ZXJhbCBjb25zdGFudDogcG9vbCBuZWVkcyB0byBiZSBjbG9zZXJcbiIpKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSk7Ci0gICAgICBuZXd2YWwgJj0gMHhmZjdmZjAwMDsKLSAgICAgIG5ld3ZhbCB8PSB2YWx1ZSB8IChzaWduID8gSU5ERVhfVVAgOiAwKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9TSElGVF9JTU06Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLSAgICAgIGlmICgoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSA+IDMyCi0JICB8fCAodmFsdWUgPT0gMzIgCi0JICAgICAgJiYgKCgobmV3dmFsICYgMHg2MCkgPT0gMCkgfHwgKG5ld3ZhbCAmIDB4NjApID09IDB4NjApKSkKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJzaGlmdCBleHByZXNzaW9uIGlzIHRvbyBsYXJnZSIpKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHZhbHVlID09IDApCi0JbmV3dmFsICY9IH4weDYwOwkvKiBTaGlmdHMgb2YgemVybyBtdXN0IGJlIGRvbmUgYXMgbHNsICovCi0gICAgICBlbHNlIGlmICh2YWx1ZSA9PSAzMikKLQl2YWx1ZSA9IDA7Ci0gICAgICBuZXd2YWwgJj0gMHhmZmZmZjA3ZjsKLSAgICAgIG5ld3ZhbCB8PSAodmFsdWUgJiAweDFmKSA8PCA3OwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCAsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9TV0k6Ci0gICAgICBpZiAoYXJtX2RhdGEtPnRodW1iX21vZGUpCi0JewotCSAgaWYgKCgodW5zaWduZWQgbG9uZykgdmFsdWUpID4gMHhmZikKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIHN3aSBleHByZXNzaW9uIikpOwotCSAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIFRIVU1CX1NJWkUpICYgMHhmZjAwOwotCSAgbmV3dmFsIHw9IHZhbHVlOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgVEhVTUJfU0laRSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSA+IDB4MDBmZmZmZmYpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgCi0JCQkgIF8oIkludmFsaWQgc3dpIGV4cHJlc3Npb24iKSk7Ci0JICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKSAmIDB4ZmYwMDAwMDA7Ci0JICBuZXd2YWwgfD0gdmFsdWU7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgSU5TTl9TSVpFKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9NVUxUSToKLSAgICAgIGlmICgoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSA+IDB4ZmZmZikKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIkludmFsaWQgZXhwcmVzc2lvbiBpbiBsb2FkL3N0b3JlIG11bHRpcGxlIikpOwotICAgICAgbmV3dmFsID0gdmFsdWUgfCBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0g6Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBuZXd2YWwgJj0gMHhmZjAwMDAwMDsKLSAgICAgIGlmICghIHRhcmdldF9vYWJpKQotICAgICAgICB2YWx1ZSA9IGZpeFAtPmZ4X29mZnNldDsKLSAgICAgIGVsc2UKLSNlbHNlCi0JdmFsdWUgPSAodmFsdWUgPj4gMikgJiAweDAwZmZmZmZmOwotI2VuZGlmCi0gICAgICB2YWx1ZSAgPSAodmFsdWUgKyAobmV3dmFsICYgMHgwMGZmZmZmZikpICYgMHgwMGZmZmZmZjsKLSAgICAgIG5ld3ZhbCA9IHZhbHVlIHwgKG5ld3ZhbCAmIDB4ZmYwMDAwMDApOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgSU5TTl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOTogLyogY29uZGl0aW9uYWwgYnJhbmNoICovCi0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSk7Ci0gICAgICB7Ci0gICAgICAgIGFkZHJlc3NUIGRpZmYgPSAobmV3dmFsICYgMHhmZikgPDwgMTsKLSAgICAgICAgaWYgKGRpZmYgJiAweDEwMCkKLSAgICAgICAgIGRpZmYgfD0gfjB4ZmY7Ci0KLSAgICAgICAgdmFsdWUgKz0gZGlmZjsKLSAgICAgICAgaWYgKCh2YWx1ZSAmIH4weGZmKSAmJiAoKHZhbHVlICYgfjB4ZmYpICE9IH4weGZmKSkKLSAgICAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgXygiQnJhbmNoIG91dCBvZiByYW5nZSIpKTsKLSAgICAgICAgbmV3dmFsID0gKG5ld3ZhbCAmIDB4ZmYwMCkgfCAoKHZhbHVlICYgMHgxZmYpID4+IDEpOwotICAgICAgfQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgVEhVTUJfU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyOiAvKiB1bmNvbmRpdGlvbmFsIGJyYW5jaCAqLwotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIFRIVU1CX1NJWkUpOwotICAgICAgewotICAgICAgICBhZGRyZXNzVCBkaWZmID0gKG5ld3ZhbCAmIDB4N2ZmKSA8PCAxOwotICAgICAgICBpZiAoZGlmZiAmIDB4ODAwKQotICAgICAgICAgZGlmZiB8PSB+MHg3ZmY7Ci0KLSAgICAgICAgdmFsdWUgKz0gZGlmZjsKLSAgICAgICAgaWYgKCh2YWx1ZSAmIH4weDdmZikgJiYgKCh2YWx1ZSAmIH4weDdmZikgIT0gfjB4N2ZmKSkKLSAgICAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgXygiQnJhbmNoIG91dCBvZiByYW5nZSIpKTsKLSAgICAgICAgbmV3dmFsID0gKG5ld3ZhbCAmIDB4ZjgwMCkgfCAoKHZhbHVlICYgMHhmZmYpID4+IDEpOwotICAgICAgfQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgVEhVTUJfU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzOgotICAgICAgewotICAgICAgICBvZmZzZXRUIG5ld3ZhbDI7Ci0gICAgICAgIGFkZHJlc3NUIGRpZmY7Ci0KLQluZXd2YWwgID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIFRIVU1CX1NJWkUpOwotICAgICAgICBuZXd2YWwyID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYgKyBUSFVNQl9TSVpFLCBUSFVNQl9TSVpFKTsKLSAgICAgICAgZGlmZiA9ICgobmV3dmFsICYgMHg3ZmYpIDw8IDEyKSB8ICgobmV3dmFsMiAmIDB4N2ZmKSA8PCAxKTsKLSAgICAgICAgaWYgKGRpZmYgJiAweDQwMDAwMCkKLQkgIGRpZmYgfD0gfjB4M2ZmZmZmOwotICAgICAgICB2YWx1ZSArPSBkaWZmOwotICAgICAgICBpZiAoKHZhbHVlICYgfjB4M2ZmZmZmKSAmJiAoKHZhbHVlICYgfjB4M2ZmZmZmKSAhPSB+MHgzZmZmZmYpKQotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygiQnJhbmNoIHdpdGggbGluayBvdXQgb2YgcmFuZ2UiKSk7Ci0KLSAgICAgICAgbmV3dmFsICA9IChuZXd2YWwgICYgMHhmODAwKSB8ICgodmFsdWUgJiAweDdmZmZmZikgPj4gMTIpOwotICAgICAgICBuZXd2YWwyID0gKG5ld3ZhbDIgJiAweGY4MDApIHwgKCh2YWx1ZSAmIDB4ZmZmKSA+PiAxKTsKLSAgICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgVEhVTUJfU0laRSk7Ci0gICAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmICsgVEhVTUJfU0laRSwgbmV3dmFsMiwgVEhVTUJfU0laRSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgICBpZiAoZml4UC0+ZnhfZG9uZSB8fCBmaXhQLT5meF9wY3JlbCkKLQltZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDEpOwotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGVsc2UgaWYgKCF0YXJnZXRfb2FiaSkKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlID0gZml4UC0+Znhfb2Zmc2V0OwotICAgICAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgMSk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIGlmIChmaXhQLT5meF9kb25lIHx8IGZpeFAtPmZ4X3BjcmVsKQotCW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgMik7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgZWxzZSBpZiAoIXRhcmdldF9vYWJpKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWUgPSBmaXhQLT5meF9vZmZzZXQ7Ci0gICAgICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAyKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICBicmVhazsKLQotI2lmZGVmIE9CSl9FTEYKLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fR09UMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0dPVE9GRjoKLQltZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgMCwgNCk7Ci0JYnJlYWs7Ci0jZW5kaWYKLQotICAgIGNhc2UgQkZEX1JFTE9DX1JWQToKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIGlmIChmaXhQLT5meF9kb25lIHx8IGZpeFAtPmZ4X3BjcmVsKQotCW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgNCk7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgZWxzZSBpZiAoIXRhcmdldF9vYWJpKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWUgPSBmaXhQLT5meF9vZmZzZXQ7Ci0gICAgICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCA0KTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICBicmVhazsKLQotI2lmZGVmIE9CSl9FTEYKLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fUExUMzI6Ci0gICAgICAvKiBJdCBhcHBlYXJzIHRoZSBpbnN0cnVjdGlvbiBpcyBmdWxseSBwcmVwYXJlZCBhdCB0aGlzIHBvaW50LiAqLwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9HT1RQQzoKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgNCk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9DUF9PRkZfSU1NOgotICAgICAgc2lnbiA9IHZhbHVlID49IDA7Ci0gICAgICBpZiAodmFsdWUgPCAtMTAyMyB8fCB2YWx1ZSA+IDEwMjMgfHwgKHZhbHVlICYgMykpCi0JYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgICBfKCJJbGxlZ2FsIHZhbHVlIGZvciBjby1wcm9jZXNzb3Igb2Zmc2V0IikpOwotICAgICAgaWYgKHZhbHVlIDwgMCkKLQl2YWx1ZSA9IC12YWx1ZTsKLSAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBJTlNOX1NJWkUpICYgMHhmZjdmZmYwMDsKLSAgICAgIG5ld3ZhbCB8PSAodmFsdWUgPj4gMikgfCAoc2lnbiA/ICBJTkRFWF9VUCA6IDApOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCAsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQ6Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSk7Ci0gICAgICAvKiBFeGFjdGx5IHdoYXQgcmFuZ2VzLCBhbmQgd2hlcmUgdGhlIG9mZnNldCBpcyBpbnNlcnRlZCBkZXBlbmRzIG9uCi0JIHRoZSB0eXBlIG9mIGluc3RydWN0aW9uLCB3ZSBjYW4gZXN0YWJsaXNoIHRoaXMgZnJvbSB0aGUgdG9wIDQgYml0cyAqLwotICAgICAgc3dpdGNoIChuZXd2YWwgPj4gMTIpCi0JewotCWNhc2UgNDogLyogUEMgbG9hZCAqLwotCSAgLyogVGh1bWIgUEMgbG9hZHMgYXJlIHNvbWV3aGF0IG9kZCwgYml0IDEgb2YgdGhlIFBDIGlzCi0JICAgICBmb3JjZWQgdG8gemVybyBmb3IgdGhlc2UgbG9hZHMsIHNvIHdlIHdpbGwgbmVlZCB0byByb3VuZAotCSAgICAgdXAgdGhlIG9mZnNldCBpZiB0aGUgaW5zdHJ1Y3Rpb24gYWRkcmVzcyBpcyBub3Qgd29yZAotCSAgICAgYWxpZ25lZCAoc2luY2UgdGhlIGZpbmFsIGFkZHJlc3MgcHJvZHVjZWQgbXVzdCBiZSwgYW5kCi0JICAgICB3ZSBjYW4gb25seSBkZXNjcmliZSB3b3JkLWFsaWduZWQgaW1tZWRpYXRlIG9mZnNldHMpLiAgKi8KLQotCSAgaWYgKChmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgKyB2YWx1ZSkgJiAzKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oIkludmFsaWQgb2Zmc2V0LCB0YXJnZXQgbm90IHdvcmQgYWxpZ25lZCAoMHglMDhYKSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KShmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgKyB2YWx1ZSkpOwotCi0JICBpZiAoKHZhbHVlICsgMikgJiB+MHgzZmUpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygiSW52YWxpZCBvZmZzZXQiKSk7Ci0KLSAgICAgICAgICAvKiBSb3VuZCB1cCwgc2luY2UgcGMgd2lsbCBiZSByb3VuZGVkIGRvd24uICAqLwotCSAgbmV3dmFsIHw9ICh2YWx1ZSArIDIpID4+IDI7Ci0JICBicmVhazsKLQotCWNhc2UgOTogLyogU1AgbG9hZC9zdG9yZSAqLwotCSAgaWYgKHZhbHVlICYgfjB4M2ZjKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oIkludmFsaWQgb2Zmc2V0IikpOwotCSAgbmV3dmFsIHw9IHZhbHVlID4+IDI7Ci0JICBicmVhazsKLQotCWNhc2UgNjogLyogV29yZCBsb2FkL3N0b3JlICovCi0JICBpZiAodmFsdWUgJiB+MHg3YykKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIG9mZnNldCIpKTsKLQkgIG5ld3ZhbCB8PSB2YWx1ZSA8PCA0OyAvKiA2IC0gMiAqLwotCSAgYnJlYWs7Ci0KLQljYXNlIDc6IC8qIEJ5dGUgbG9hZC9zdG9yZSAqLwotCSAgaWYgKHZhbHVlICYgfjB4MWYpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygiSW52YWxpZCBvZmZzZXQiKSk7Ci0JICBuZXd2YWwgfD0gdmFsdWUgPDwgNjsKLQkgIGJyZWFrOwotCi0JY2FzZSA4OiAvKiBIYWxmd29yZCBsb2FkL3N0b3JlICovCi0JICBpZiAodmFsdWUgJiB+MHgzZSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIG9mZnNldCIpKTsKLQkgIG5ld3ZhbCB8PSB2YWx1ZSA8PCA1OyAvKiA2IC0gMSAqLwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJIlVuYWJsZSB0byBwcm9jZXNzIHJlbG9jYXRpb24gZm9yIHRodW1iIG9wY29kZTogJXgiLCBuZXd2YWwpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgVEhVTUJfU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9BREQ6Ci0gICAgICAvKiBUaGlzIGlzIGEgY29tcGxpY2F0ZWQgcmVsb2NhdGlvbiwgc2luY2Ugd2UgdXNlIGl0IGZvciBhbGwgb2YKLSAgICAgICAgIHRoZSBmb2xsb3dpbmcgaW1tZWRpYXRlIHJlbG9jYXRpb25zOgotICAgICAgICAgICAgM2JpdCBBREQvU1VCCi0gICAgICAgICAgICA4Yml0IEFERC9TVUIKLSAgICAgICAgICAgIDliaXQgQUREL1NVQiBTUCB3b3JkLWFsaWduZWQKLSAgICAgICAgICAgMTBiaXQgQUREIFBDL1NQIHdvcmQtYWxpZ25lZAotCi0gICAgICAgICBUaGUgdHlwZSBvZiBpbnN0cnVjdGlvbiBiZWluZyBwcm9jZXNzZWQgaXMgZW5jb2RlZCBpbiB0aGUKLSAgICAgICAgIGluc3RydWN0aW9uIGZpZWxkOgotICAgICAgICAgICAweDgwMDAgIFNVQgotICAgICAgICAgICAweDAwRjAgIFJkCi0gICAgICAgICAgIDB4MDAwRiAgUnMKLSAgICAgICovCi0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSk7Ci0gICAgICB7Ci0gICAgICAgIGludCByZCA9IChuZXd2YWwgPj4gNCkgJiAweGY7Ci0gICAgICAgIGludCBycyA9IG5ld3ZhbCAmIDB4ZjsKLSAgICAgICAgaW50IHN1YnRyYWN0ID0gbmV3dmFsICYgMHg4MDAwOwotCi0gICAgICAgIGlmIChyZCA9PSBSRUdfU1ApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlICYgfjB4MWZjKQotICAgICAgICAgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXygiSW52YWxpZCBpbW1lZGlhdGUgZm9yIHN0YWNrIGFkZHJlc3MgY2FsY3VsYXRpb24iKSk7Ci0gICAgICAgICAgICBuZXd2YWwgPSBzdWJ0cmFjdCA/IFRfT1BDT0RFX1NVQl9TVCA6IFRfT1BDT0RFX0FERF9TVDsKLSAgICAgICAgICAgIG5ld3ZhbCB8PSB2YWx1ZSA+PiAyOwotICAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocnMgPT0gUkVHX1BDIHx8IHJzID09IFJFR19TUCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3VidHJhY3QgfHwKLSAgICAgICAgICAgICAgICB2YWx1ZSAmIH4weDNmYykKLSAgICAgICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oIkludmFsaWQgaW1tZWRpYXRlIGZvciBhZGRyZXNzIGNhbGN1bGF0aW9uICh2YWx1ZSA9IDB4JTA4WCkiKSwgdmFsdWUpOwotICAgICAgICAgICAgbmV3dmFsID0gKHJzID09IFJFR19QQyA/IFRfT1BDT0RFX0FERF9QQyA6IFRfT1BDT0RFX0FERF9TUCk7Ci0gICAgICAgICAgICBuZXd2YWwgfD0gcmQgPDwgODsKLSAgICAgICAgICAgIG5ld3ZhbCB8PSB2YWx1ZSA+PiAyOwotICAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocnMgPT0gcmQpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlICYgfjB4ZmYpCi0gICAgICAgICAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJJbnZhbGlkIDhiaXQgaW1tZWRpYXRlIikpOwotICAgICAgICAgICAgbmV3dmFsID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfSTggOiBUX09QQ09ERV9BRERfSTg7Ci0gICAgICAgICAgICBuZXd2YWwgfD0gKHJkIDw8IDgpIHwgdmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlICYgfjB4NykKLSAgICAgICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oIkludmFsaWQgM2JpdCBpbW1lZGlhdGUiKSk7Ci0gICAgICAgICAgICBuZXd2YWwgPSBzdWJ0cmFjdCA/IFRfT1BDT0RFX1NVQl9JMyA6IFRfT1BDT0RFX0FERF9JMzsKLSAgICAgICAgICAgIG5ld3ZhbCB8PSByZCB8IChycyA8PCAzKSB8ICh2YWx1ZSA8PCA2KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgVEhVTUJfU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9JTU06Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSk7Ci0gICAgICBzd2l0Y2ggKG5ld3ZhbCA+PiAxMSkKLSAgICAgICAgewotICAgICAgICBjYXNlIDB4MDQ6IC8qIDhiaXQgaW1tZWRpYXRlIE1PViAqLwotICAgICAgICBjYXNlIDB4MDU6IC8qIDhiaXQgaW1tZWRpYXRlIENNUCAqLwotICAgICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAyNTUpCi0gICAgICAgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF8oIkludmFsaWQgaW1tZWRpYXRlOiAlZCBpcyB0b28gbGFyZ2UiKSwgdmFsdWUpOwotICAgICAgICAgIG5ld3ZhbCB8PSB2YWx1ZTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICB9Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgVEhVTUJfU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVDoKLSAgICAgIC8qIDViaXQgc2hpZnQgdmFsdWUgKDAuLjMxKSAqLwotICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDMxKQotCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygiSWxsZWdhbCBUaHVtYiBzaGlmdCB2YWx1ZTogJWQiKSwgdmFsdWUpOwotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIFRIVU1CX1NJWkUpICYgMHhmMDNmOwotICAgICAgbmV3dmFsIHw9IHZhbHVlIDw8IDY7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgVEhVTUJfU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOwotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19OT05FOgotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICBfKCJCYWQgcmVsb2NhdGlvbiBmaXh1cCB0eXBlICglZClcbiIpLCBmaXhQLT5meF9yX3R5cGUpOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotLyogVHJhbnNsYXRlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyB0byBCRkQgdGFyZ2V0Ci0gICBmb3JtYXQuICAqLwotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCi0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLSAgICAgZml4UyAqIGZpeHA7Ci17Ci0gIGFyZWxlbnQgKiByZWxvYzsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAmZml4cC0+ZnhfYWRkc3ktPmJzeW07Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCi0gIC8qIEBAIFdoeSBmeF9hZGRudW1iZXIgc29tZXRpbWVzIGFuZCBmeF9vZmZzZXQgb3RoZXIgdGltZXM/ICAqLwotI2lmbmRlZiBPQkpfRUxGCi0gIGlmIChmaXhwLT5meF9wY3JlbCA9PSAwKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gIGVsc2UKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0ID0gcmVsb2MtPmFkZHJlc3M7Ci0jZWxzZSAgLyogT0JKX0VMRiAqLwotICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotI2VuZGlmCi0KLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JewotCSAgY29kZSA9IEJGRF9SRUxPQ184X1BDUkVMOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JewotCSAgY29kZSA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsKLQkgIGJyZWFrOwotCX0KLQotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCXsKLQkgIGNvZGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JICBicmVhazsKLQl9Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNIOgotICAgIGNhc2UgQkZEX1JFTE9DX1JWQTogICAgICAKLSAgICBjYXNlIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5OgotICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyOgotICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9MSVRFUkFMOgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUw6Ci0gICAgICAvKiBJZiB0aGlzIGlzIGNhbGxlZCB0aGVuIHRoZSBhIGxpdGVyYWwgaGFzIGJlZW4gcmVmZXJlbmNlZCBhY3Jvc3MKLQkgYSBzZWN0aW9uIGJvdW5kcnkgLSBwb3NzaWJseSBkdWUgdG8gYW4gaW1wbGljaXQgZHVtcCAqLwotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiTGl0ZXJhbCByZWZlcmVuY2VkIGFjcm9zcyBzZWN0aW9uIGJvdW5kcnkgKEltcGxpY2l0IGR1bXA/KSIpKTsKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0dPVFBDOgotICAgICAgYXNzZXJ0IChmaXhwLT5meF9wY3JlbCAhPSAwKTsKLSAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gICAgICBjb2RlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0dPVDMyOgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9HT1RPRkY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX1BMVDMyOgotICAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9JTU1FRElBVEU6Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJJbnRlcm5hbF9yZWxvY2F0aW9uICh0eXBlICVkKSBub3QgZml4ZWQgdXAgKElNTUVESUFURSkiKSwKLQkJICAgIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOgotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiSW50ZXJuYWxfcmVsb2NhdGlvbiAodHlwZSAlZCkgbm90IGZpeGVkIHVwIChPRkZTRVRfSU1NKSIpLAotCQkgICAgZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHsKLQljaGFyICogdHlwZTsKLQlzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLQkgIHsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9JTU1FRElBVEU6ICAgIHR5cGUgPSAiSU1NRURJQVRFIjsgICAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTogICB0eXBlID0gIk9GRlNFVF9JTU0iOyAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04OiAgdHlwZSA9ICJPRkZTRVRfSU1NOCI7ICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9TSElGVF9JTU06ICAgIHR5cGUgPSAiU0hJRlRfSU1NIjsgICAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fU1dJOiAgICAgICAgICB0eXBlID0gIlNXSSI7ICAgICAgICAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX01VTFRJOiAgICAgICAgdHlwZSA9ICJNVUxUSSI7ICAgICAgICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9DUF9PRkZfSU1NOiAgIHR5cGUgPSAiQ1BfT0ZGX0lNTSI7ICAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fVEhVTUJfQUREOiAgICB0eXBlID0gIlRIVU1CX0FERCI7ICAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZUOiAgdHlwZSA9ICJUSFVNQl9TSElGVCI7ICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9JTU06ICAgIHR5cGUgPSAiVEhVTUJfSU1NIjsgICAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUOiB0eXBlID0gIlRIVU1CX09GRlNFVCI7IGJyZWFrOwotCSAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICI8dW5rbm93bj4iOyAgICBicmVhazsKLQkgIH0KLQlhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIkNhbiBub3QgcmVwcmVzZW50ICVzIHJlbG9jYXRpb24gaW4gdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQgKCVkKSIpLAotCQkgICAgICB0eXBlLCBmaXhwLT5meF9wY3JlbCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgfQotCi0jaWZkZWYgT0JKX0VMRgotIGlmIChjb2RlID09IEJGRF9SRUxPQ18zMl9QQ1JFTAotICAgICAmJiBHT1Rfc3ltYm9sCi0gICAgICYmIGZpeHAtPmZ4X2FkZHN5ID09IEdPVF9zeW1ib2wpCi0gICBjb2RlID0gQkZEX1JFTE9DX0FSTV9HT1RQQzsKLSNlbmRpZgotICAgCi0gIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLQotICBpZiAocmVsb2MtPmhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiQ2FuIG5vdCByZXByZXNlbnQgJXMgcmVsb2NhdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gcmVsb2M7Ci19Ci0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWd0eXBlKQotICAgICBmcmFnUyAqIGZyYWdQOwotICAgICBzZWdUICAgIHNlZ3R5cGU7Ci17Ci0gIGFzX2ZhdGFsIChfKCJtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheFxuIikpOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLW91dHB1dF9pbnN0IChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGNoYXIgKiB0byA9IE5VTEw7Ci0gICAgCi0gIGlmIChpbnN0LmVycm9yKQotICAgIHsKLSAgICAgIGFzX2JhZCAoaW5zdC5lcnJvcik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHRvID0gZnJhZ19tb3JlIChpbnN0LnNpemUpOwotICBpZiAodGh1bWJfbW9kZSAmJiAoaW5zdC5zaXplID4gVEhVTUJfU0laRSkpCi0gICAgewotICAgICAgYXNzZXJ0IChpbnN0LnNpemUgPT0gKDIgKiBUSFVNQl9TSVpFKSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvLCBpbnN0Lmluc3RydWN0aW9uID4+IDE2LCBUSFVNQl9TSVpFKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAodG8gKyAyLCBpbnN0Lmluc3RydWN0aW9uLCBUSFVNQl9TSVpFKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvLCBpbnN0Lmluc3RydWN0aW9uLCBpbnN0LnNpemUpOwotCi0gIGlmIChpbnN0LnJlbG9jLnR5cGUgIT0gQkZEX1JFTE9DX05PTkUpCi0gICAgZml4X25ld19hcm0gKGZyYWdfbm93LCB0byAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkgaW5zdC5zaXplLCAmIGluc3QucmVsb2MuZXhwLCBpbnN0LnJlbG9jLnBjX3JlbCwKLQkJIGluc3QucmVsb2MudHlwZSk7Ci0KLSAgcmV0dXJuOwotfQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBjaGFyICAgYzsKLSAgY2hhciAqIHA7Ci0gIGNoYXIgKiBxOwotICBjaGFyICogc3RhcnQ7Ci0KLSAgLyogQWxpZ24gdGhlIGluc3RydWN0aW9uLgotICAgICBUaGlzIG1heSBub3QgYmUgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvIGJ1dCAuLi4gKi8KLSAgLyogYXJtX2FsaWduICgyLCAwKTsgKi8KLSAgbGlzdGluZ19wcmV2X2xpbmUgKCk7IC8qIERlZmluZWQgaW4gbGlzdGluZy5oICovCi0KLSAgLyogQWxpZ24gdGhlIHByZXZpb3VzIGxhYmVsIGlmIG5lZWRlZC4gICovCi0gIGlmIChsYXN0X2xhYmVsX3NlZW4gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBsYXN0X2xhYmVsX3NlZW4tPnN5X2ZyYWcgPSBmcmFnX25vdzsKLSAgICAgIFNfU0VUX1ZBTFVFIChsYXN0X2xhYmVsX3NlZW4sICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChsYXN0X2xhYmVsX3NlZW4sIG5vd19zZWcpOwotICAgIH0KLQotICBtZW1zZXQgKCZpbnN0LCAnXDAnLCBzaXplb2YgKGluc3QpKTsKLSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX05PTkU7Ci0KLSAgaWYgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwkJCS8qIFNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZSAqLwotICAgIAotICAvKiBTY2FuIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG9wLWNvZGUsIHdoaWNoIG11c3QgZW5kIGluIHdoaXRlIHNwYWNlIG9yCi0gICAgIGVuZCBvZiBzdHJpbmcuICAqLwotICBmb3IgKHN0YXJ0ID0gcCA9IHN0cjsgKnAgIT0gJ1wwJzsgcCsrKQotICAgIGlmICgqcCA9PSAnICcpCi0gICAgICBicmVhazsKLSAgICAKLSAgaWYgKHAgPT0gc3RyKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiTm8gb3BlcmF0b3IgLS0gc3RhdGVtZW50IGAlcydcbiIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAodGh1bWJfbW9kZSkKLSAgICB7Ci0gICAgICBDT05TVCBzdHJ1Y3QgdGh1bWJfb3Bjb2RlICpvcGNvZGU7Ci0KLSAgICAgIGMgPSAqcDsKLSAgICAgICpwID0gJ1wwJzsKLSAgICAgIG9wY29kZSA9IChDT05TVCBzdHJ1Y3QgdGh1bWJfb3Bjb2RlICopIGhhc2hfZmluZCAoYXJtX3RvcHNfaHNoLCBzdHIpOwotICAgICAgKnAgPSBjOwotICAgICAgaWYgKG9wY29kZSkKLQl7Ci0JICBpbnN0Lmluc3RydWN0aW9uID0gb3Bjb2RlLT52YWx1ZTsKLQkgIGluc3Quc2l6ZSA9IG9wY29kZS0+c2l6ZTsKLQkgICgqb3Bjb2RlLT5wYXJtcykocCk7Ci0JICBvdXRwdXRfaW5zdCAoc3RhcnQpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBDT05TVCBzdHJ1Y3QgYXNtX29wY29kZSAqb3Bjb2RlOwotCi0gICAgICBpbnN0LnNpemUgPSBJTlNOX1NJWkU7Ci0gICAgICAvKiBwIG5vdyBwb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgb3Bjb2RlLCBwcm9iYWJseSB3aGl0ZSBzcGFjZSwgYnV0IHdlCi0JIGhhdmUgdG8gYnJlYWsgdGhlIG9wY29kZSB1cCBpbiBjYXNlIGl0IGNvbnRhaW5zIGNvbmRpb25hbHMgYW5kIGZsYWdzOwotCSBrZWVwIHRyeWluZyB3aXRoIHByb2dyZXNzaXZlbHkgc21hbGxlciBiYXNpYyBpbnN0cnVjdGlvbnMgdW50aWwgb25lCi0JIG1hdGNoZXMsIG9yIHdlIHJ1biBvdXQgb2Ygb3Bjb2RlLiAqLwotICAgICAgcSA9IChwIC0gc3RyID4gTE9OR0VTVF9JTlNUKSA/IHN0ciArIExPTkdFU1RfSU5TVCA6IHA7Ci0gICAgICBmb3IgKDsgcSAhPSBzdHI7IHEtLSkKLQl7Ci0JICBjID0gKnE7Ci0JICAqcSA9ICdcMCc7Ci0JICBvcGNvZGUgPSAoQ09OU1Qgc3RydWN0IGFzbV9vcGNvZGUgKikgaGFzaF9maW5kIChhcm1fb3BzX2hzaCwgc3RyKTsKLQkgICpxID0gYzsKLQkgIGlmIChvcGNvZGUgJiYgb3Bjb2RlLT50ZW1wbGF0ZSkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ19iaXRzID0gMDsKLQkgICAgICBjaGFyICpyOwotCi0JICAgICAgLyogQ2hlY2sgdGhhdCB0aGlzIGluc3RydWN0aW9uIGlzIHN1cHBvcnRlZCBmb3IgdGhpcyBDUFUgKi8KLQkgICAgICBpZiAoKG9wY29kZS0+dmFyaWFudHMgJiBjcHVfdmFyaWFudCkgPT0gMCkKLQkJZ290byB0cnlfc2hvcnRlcjsKLQotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBvcGNvZGUtPnZhbHVlOwotCSAgICAgIGlmIChxID09IHApCQkvKiBKdXN0IGEgc2ltcGxlIG9wY29kZSAqLwotCQl7Ci0JCSAgaWYgKG9wY29kZS0+Y29tcF9zdWZmaXggIT0gMCkKLQkJICAgIGFzX2JhZCAoXygiT3Bjb2RlIGAlcycgbXVzdCBoYXZlIHN1ZmZpeCBmcm9tIDwlcz5cbiIpLCBzdHIsCi0JCQkgICAgb3Bjb2RlLT5jb21wX3N1ZmZpeCk7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IENPTkRfQUxXQVlTOwotCQkgICAgICAoKm9wY29kZS0+cGFybXMpKHEsIDApOwotCQkgICAgfQotCQkgIG91dHB1dF9pbnN0IChzdGFydCk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0KLQkgICAgICAvKiBOb3cgY2hlY2sgZm9yIGEgY29uZGl0aW9uYWwgKi8KLQkgICAgICByID0gcTsKLQkgICAgICBpZiAocCAtIHIgPj0gMikKLQkJewotCQkgIENPTlNUIHN0cnVjdCBhc21fY29uZCAqY29uZDsKLQkJICBjaGFyIGQgPSAqKHIgKyAyKTsKLQotCQkgICoociArIDIpID0gJ1wwJzsKLQkJICBjb25kID0gKENPTlNUIHN0cnVjdCBhc21fY29uZCAqKSBoYXNoX2ZpbmQgKGFybV9jb25kX2hzaCwgcik7Ci0JCSAgKihyICsgMikgPSBkOwotCQkgIGlmIChjb25kKQotCQkgICAgewotCQkgICAgICBpZiAoY29uZC0+dmFsdWUgPT0gMHhmMDAwMDAwMCkKLQkJCWFzX3Rza3RzayAoCi1fKCJXYXJuaW5nOiBVc2Ugb2YgdGhlICdudicgY29uZGl0aW9uYWwgaXMgZGVwcmVjYXRlZFxuIikpOwotCi0JCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gY29uZC0+dmFsdWU7Ci0JCSAgICAgIHIgKz0gMjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBpbnN0Lmluc3RydWN0aW9uIHw9IENPTkRfQUxXQVlTOwotCQl9Ci0JICAgICAgZWxzZQotCQlpbnN0Lmluc3RydWN0aW9uIHw9IENPTkRfQUxXQVlTOwotCi0JICAgICAgLyogaWYgdGhlcmUgaXMgYSBjb21wdWxzb3J5IHN1ZmZpeCwgaXQgc2hvdWxkIGNvbWUgaGVyZSwgYmVmb3JlCi0JCSBhbnkgb3B0aW9uYWwgZmxhZ3MuICovCi0JICAgICAgaWYgKG9wY29kZS0+Y29tcF9zdWZmaXgpCi0JCXsKLQkJICBDT05TVCBjaGFyICpzID0gb3Bjb2RlLT5jb21wX3N1ZmZpeDsKLQotCQkgIHdoaWxlICgqcykKLQkJICAgIHsKLQkJICAgICAgaW5zdC5zdWZmaXgrKzsKLQkJICAgICAgaWYgKCpyID09ICpzKQotCQkJYnJlYWs7Ci0JCSAgICAgIHMrKzsKLQkJICAgIH0KLQotCQkgIGlmICgqcyA9PSAnXDAnKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oIk9wY29kZSBgJXMnIG11c3QgaGF2ZSBzdWZmaXggZnJvbSA8JXM+XG4iKSwgc3RyLAotCQkJICAgICAgb3Bjb2RlLT5jb21wX3N1ZmZpeCk7Ci0JCSAgICAgIHJldHVybjsKLQkJICAgIH0KLQotCQkgIHIrKzsKLQkJfQotCi0JICAgICAgLyogVGhlIHJlbWFpbmRlciwgaWYgYW55IHNob3VsZCBub3cgYmUgZmxhZ3MgZm9yIHRoZSBpbnN0cnVjdGlvbjsKLQkJIFNjYW4gdGhlc2UgY2hlY2tpbmcgZWFjaCBvbmUgZm91bmQgd2l0aCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBpZiAociAhPSBwKQotCQl7Ci0JCSAgY2hhciBkOwotCQkgIENPTlNUIHN0cnVjdCBhc21fZmxnICpmbGFnID0gb3Bjb2RlLT5mbGFnczsKLQotCQkgIGlmIChmbGFnKQotCQkgICAgewotCQkgICAgICBpbnQgZmxhZ25vOwotCi0JCSAgICAgIGQgPSAqcDsKLQkJICAgICAgKnAgPSAnXDAnOwotCi0JCSAgICAgIGZvciAoZmxhZ25vID0gMDsgZmxhZ1tmbGFnbm9dLnRlbXBsYXRlOyBmbGFnbm8rKykKLQkJCXsKLQkJCSAgaWYgKHN0cmVxIChyLCBmbGFnW2ZsYWdub10udGVtcGxhdGUpKQotCQkJICAgIHsKLQkJCSAgICAgIGZsYWdfYml0cyB8PSBmbGFnW2ZsYWdub10uc2V0X2JpdHM7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgKnAgPSBkOwotCQkgICAgICBpZiAoISBmbGFnW2ZsYWdub10udGVtcGxhdGUpCi0JCQlnb3RvIHRyeV9zaG9ydGVyOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGdvdG8gdHJ5X3Nob3J0ZXI7Ci0JCX0KLQotCSAgICAgICgqb3Bjb2RlLT5wYXJtcykgKHAsIGZsYWdfYml0cyk7Ci0JICAgICAgb3V0cHV0X2luc3QgKHN0YXJ0KTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCXRyeV9zaG9ydGVyOgotCSAgOwotCX0KLSAgICB9Ci0KLSAgLyogSXQgd2Fzbid0IGFuIGluc3RydWN0aW9uLCBidXQgaXQgbWlnaHQgYmUgYSByZWdpc3RlciBhbGlhcyBvZiB0aGUgZm9ybQotICAgICBhbGlhcyAucmVxIHJlZwotICAgICAqLwotICBxID0gcDsKLSAgd2hpbGUgKCpxID09ICcgJykKLSAgICBxKys7Ci0KLSAgYyA9ICpwOwotICAqcCA9ICdcMCc7Ci0gICAgCi0gIGlmICgqcSAmJiAhc3RybmNtcCAocSwgIi5yZXEgIiwgNCkpCi0gICAgewotICAgICAgaW50ICAgIHJlZzsKLSAgICAgIGNoYXIgKiBjb3B5X29mX3N0ciA9IHN0cjsKLSAgICAgIGNoYXIgKiByOwotICAgICAgCi0gICAgICBxICs9IDQ7Ci0gICAgICB3aGlsZSAoKnEgPT0gJyAnKQotCXErKzsKLQotICAgICAgZm9yIChyID0gcTsgKnIgIT0gJ1wwJzsgcisrKQotCWlmICgqciA9PSAnICcpCi0JICBicmVhazsKLSAgICAgIAotICAgICAgaWYgKHIgIT0gcSkKLQl7Ci0JICBpbnQgcmVnbnVtOwotCSAgY2hhciBkID0gKnI7Ci0KLQkgICpyID0gJ1wwJzsKLQkgIHJlZ251bSA9IGFybV9yZWdfcGFyc2UgKCYgcSk7Ci0JICAqciA9IGQ7Ci0KLQkgIHJlZyA9IGFybV9yZWdfcGFyc2UgKCYgc3RyKTsKLQkgIAotCSAgaWYgKHJlZyA9PSBGQUlMKQotCSAgICB7Ci0JICAgICAgaWYgKHJlZ251bSAhPSBGQUlMKQotCQl7Ci0JCSAgaW5zZXJ0X3JlZ19hbGlhcyAoc3RyLCByZWdudW0pOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNfd2FybiAoXygicmVnaXN0ZXIgJyVzJyBkb2VzIG5vdCBleGlzdFxuIiksIHEpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJlZ251bSAhPSBGQUlMKQotCSAgICB7Ci0JICAgICAgaWYgKHJlZyAhPSByZWdudW0pCi0JCWFzX3dhcm4gKF8oImlnbm9yaW5nIHJlZGVmaW5pdGlvbiBvZiByZWdpc3RlciBhbGlhcyAnJXMnIiksIGNvcHlfb2Zfc3RyICk7Ci0JICAgICAgCi0JICAgICAgLyogRG8gbm90IHdhcm4gYWJwb3V0IHJlZGVmaW5pdGlvbnMgdG8gdGhlIHNhbWUgYWxpYXMuICAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFzX3dhcm4gKF8oImlnbm9yaW5nIHJlZGVmaW5pdGlvbiBvZiByZWdpc3RlciBhbGlhcyAnJXMnIHRvIG5vbi1leGlzdGFudCByZWdpc3RlciAnJXMnIiksCi0JCSAgICAgY29weV9vZl9zdHIsIHEpOwotCX0KLSAgICAgIGVsc2UKLQlhc193YXJuIChfKCJpZ25vcmluZyBpbmNvbXBsZXRlIC5yZXEgcHNldXNvIG9wIikpOwotICAgICAgCi0gICAgICAqcCA9IGM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICpwID0gYzsKLSAgYXNfYmFkIChfKCJiYWQgaW5zdHJ1Y3Rpb24gYCVzJyIpLCBzdGFydCk7Ci19Ci0KLS8qCi0gKiBtZF9wYXJzZV9vcHRpb24KLSAqICAgIEludm9jYXRpb24gbGluZSBpbmNsdWRlcyBhIHN3aXRjaCBub3QgcmVjb2duaXplZCBieSB0aGUgYmFzZSBhc3NlbWJsZXIuCi0gKiAgICBTZWUgaWYgaXQncyBhIHByb2Nlc3Nvci1zcGVjaWZpYyBvcHRpb24uICBUaGVzZSBhcmU6Ci0gKiAgICBDcHUgdmFyaWFudHMsIHRoZSBhcm0gcGFydCBpcyBvcHRpb25hbDoKLSAqICAgICAgICAgICAgLW1bYXJtXTEgICAgICAgICAgICAgICAgQ3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuCi0gKiAgICAgICAgICAgIC1tW2FybV0yLCAtbVthcm1dMjUwICAgIEFybSAyIGFuZCBBcm0gMjUwIHByb2Nlc3NvcgotICogICAgICAgICAgICAtbVthcm1dMyAgICAgICAgICAgICAgICBBcm0gMyBwcm9jZXNzb3IKLSAqICAgICAgICAgICAgLW1bYXJtXTZbeHhdLCAgICAgICAgICAgQXJtIDYgcHJvY2Vzc29ycwotICogICAgICAgICAgICAtbVthcm1dN1t4eF1bdF1bW2RdbV0gICBBcm0gNyBwcm9jZXNzb3JzCi0gKiAgICAgICAgICAgIC1tc3Ryb25nYXJtWzExMF0JICAgICAgQXJtIDggcHJvY2Vzc29ycwotICogICAgICAgICAgICAtbWFsbCAgICAgICAgICAgICAgICAgICBBbGwgKGV4Y2VwdCB0aGUgQVJNMSkKLSAqICAgIEZQIHZhcmlhbnRzOgotICogICAgICAgICAgICAtbWZwYTEwLCAtbWZwYTExICAgICAgICBGUEExMCBhbmQgMTEgY28tcHJvY2Vzc29yIGluc3RydWN0aW9ucwotICogICAgICAgICAgICAtbWZwZS1vbGQgICAgICAgICAgICAgICAoTm8gZmxvYXQgbG9hZC9zdG9yZSBtdWx0aXBsZXMpCi0gKiAgICAgICAgICAgIC1tbm8tZnB1ICAgICAgICAgICAgICAgIERpc2FibGUgYWxsIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucwotICogICAgUnVuLXRpbWUgZW5kaWFuIHNlbGVjdGlvbjoKLSAqICAgICAgICAgICAgLUVCICAgICAgICAgICAgICAgICAgICAgYmlnIGVuZGlhbiBjcHUKLSAqICAgICAgICAgICAgLUVMICAgICAgICAgICAgICAgICAgICAgbGl0dGxlIGVuZGlhbiBjcHUKLSAqICAgIEFSTSBQcm9jZWR1cmUgQ2FsbGluZyBTdGFuZGFyZDoKLSAqCSAgICAgIC1tYXBjcy0zMgkJICAgICAgMzIgYml0IEFQQ1MKLSAqCSAgICAgIC1tYXBjcy0yNgkJICAgICAgMjYgYml0IEFQQ1MKLSAqCSAgICAgIC1tYXBjcy1mbG9hdAkgICAgICBQYXNzIGZsb2F0cyBpbiBmbG9hdCByZWdzCi0gKgkgICAgICAtbWFwY3MtcmVlbnRyYW50ICAgICAgICBQb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlCi0gKiAgICAgICAgICAgIC1tdGh1bWItaW50ZXJ3b3JrICAgICAgIENvZGUgc3VwcG9ydHMgQXJtL1RodW1iIGludGVyd29ya2luZwotICogICAgICAgICAgICAtbW9hYmkgICAgICAgICAgICAgICAgICBPbGQgRUxGIEFCSQotICovCi0KLUNPTlNUIGNoYXIgKiBtZF9zaG9ydG9wdHMgPSAibTprIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0jaWZkZWYgQVJNX0JJX0VORElBTgotI2RlZmluZSBPUFRJT05fRUIgKE9QVElPTl9NRF9CQVNFICsgMCkKLSAgeyJFQiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRUJ9LAotI2RlZmluZSBPUFRJT05fRUwgKE9QVElPTl9NRF9CQVNFICsgMSkKLSAgeyJFTCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRUx9LAotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgT1BUSU9OX09BQkkgKE9QVElPTl9NRF9CQVNFICsyKQotICB7Im9hYmkiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX09BQkl9LAotI2VuZGlmCi0jZW5kaWYKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCAgICBjOwotICAgICBjaGFyICogYXJnOwotewotICBjaGFyICogc3RyID0gYXJnOwotCi0gIHN3aXRjaCAoYykKLSAgICB7Ci0jaWZkZWYgQVJNX0JJX0VORElBTgotICAgIGNhc2UgT1BUSU9OX0VCOgotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fRUw6Ci0gICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSAnbSc6Ci0gICAgICBzd2l0Y2ggKCpzdHIpCi0JewotCWNhc2UgJ2YnOgotCSAgaWYgKHN0cmVxIChzdHIsICJmcGExMCIpKQotCSAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5GUFVfQUxMKSB8IEZQVV9GUEExMDsKLQkgIGVsc2UgaWYgKHN0cmVxIChzdHIsICJmcGExMSIpKQotCSAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5GUFVfQUxMKSB8IEZQVV9GUEExMTsKLQkgIGVsc2UgaWYgKHN0cmVxIChzdHIsICJmcGUtb2xkIikpCi0JICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkZQVV9BTEwpIHwgRlBVX0NPUkU7Ci0JICBlbHNlCi0JICAgIGdvdG8gYmFkOwotCSAgYnJlYWs7Ci0KLQljYXNlICduJzoKLQkgIGlmIChzdHJlcSAoc3RyLCAibm8tZnB1IikpCi0JICAgIGNwdV92YXJpYW50ICY9IH5GUFVfQUxMOwotCSAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgICAgIGNhc2UgJ28nOgotICAgICAgICAgIGlmIChzdHJlcSAoc3RyLCAib2FiaSIpKQotICAgICAgICAgICAgdGFyZ2V0X29hYmkgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0JICAKLSAgICAgICAgY2FzZSAndCc6Ci0gICAgICAgICAgLyogTGltaXQgYXNzZW1ibGVyIHRvIGdlbmVyYXRpbmcgb25seSBUaHVtYiBpbnN0cnVjdGlvbnM6ICovCi0gICAgICAgICAgaWYgKHN0cmVxIChzdHIsICJ0aHVtYiIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV9USFVNQjsKLSAgICAgICAgICAgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+RlBVX0FMTCkgfCBGUFVfTk9ORTsKLSAgICAgICAgICAgICAgdGh1bWJfbW9kZSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgInRodW1iLWludGVyd29yayIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV9USFVNQiB8IEFSTV9BUkNIdjQ7Ci0jaWYgZGVmaW5lZCBPQkpfQ09GRiB8fCBkZWZpbmVkIE9CSl9FTEYKLSAgICAgICAgICAgICAgc3VwcG9ydF9pbnRlcndvcmsgPSB0cnVlOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotCSAgICBnb3RvIGJhZDsKLSAgICAgICAgICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBpZiAoc3RyZXEgKHN0ciwgImFsbCIpKQotCSAgICB7Ci0JICAgICAgY3B1X3ZhcmlhbnQgPSBBUk1fQUxMIHwgRlBVX0FMTDsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgfQotI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCi0JICBpZiAoISBzdHJuY21wIChzdHIsICJhcGNzLSIsIDUpKQotCSAgICB7Ci0JICAgICAgLyogR0NDIHBhc3NlcyBvbiBhbGwgY29tbWFuZCBsaW5lIG9wdGlvbnMgc3RhcnRpbmcgIi1tYXBjcy0uLi4iCi0JCSB0byB1cywgc28gd2UgbXVzdCBwYXJzZSB0aGVtIGhlcmUuICAqLwotCi0JICAgICAgc3RyICs9IDU7Ci0JICAgICAgCi0JICAgICAgaWYgKHN0cmVxIChzdHIsICIzMiIpKQotCQl7Ci0JCSAgdXNlc19hcGNzXzI2ID0gZmFsc2U7Ci0JCSAgcmV0dXJuIDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiMjYiKSkKLQkJewotCQkgIHVzZXNfYXBjc18yNiA9IHRydWU7Ci0JCSAgcmV0dXJuIDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiZnJhbWUiKSkKLQkJewotCQkgIC8qIFN0YWNrIGZyYW1lcyBhcmUgYmVpbmcgZ2VuZXJhdGVkIC0gZG9lcyBub3QgYWZmZWN0Ci0JCSAgICAgbGlua2FnZSBvZiBjb2RlLiAgKi8KLQkJICByZXR1cm4gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICJzdGFjay1jaGVjayIpKQotCQl7Ci0JCSAgLyogU3RhY2sgY2hlY2tpbmcgaXMgYmVpbmcgcGVyZm9ybWVkIC0gZG9lcyBub3QgYWZmZWN0Ci0JCSAgICAgbGlua2FnZSwgYnV0IGRvZXMgcmVxdWlyZSB0aGF0IHRoZSBmdW5jdGlvbnMKLQkJICAgICBfX3J0X3N0a292Zl9zcGxpdF9zbWFsbCBhbmQgX19ydF9zdGtvdmZfc3BsaXRfYmlnIGJlCi0JCSAgICAgcHJlc2VudCBpbiB0aGUgZmluYWwgbGluay4gICovCi0KLQkJICByZXR1cm4gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICJmbG9hdCIpKQotCQl7Ci0JCSAgLyogRmxvYXRpbmcgcG9pbnQgYXJndW1lbnRzIGFyZSBiZWluZyBwYXNzZWQgaW4gdGhlIGZsb2F0aW5nCi0JCSAgICAgcG9pbnQgcmVnaXN0ZXJzLiAgVGhpcyBkb2VzIGFmZmVjdCBsaW5raW5nLCBzaW5jZSB0aGlzCi0JCSAgICAgdmVyc2lvbiBvZiB0aGUgQVBDUyBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiB0aGF0Ci0JCSAgICAgcGFzc2VzIGZsb2F0aW5nIHBvaW50cyBpbiB0aGUgaW50ZWdlciByZWdpc3RlcnMuICAqLwotCi0JCSAgdXNlc19hcGNzX2Zsb2F0ID0gdHJ1ZTsKLQkJICByZXR1cm4gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICJyZWVudHJhbnQiKSkKLQkJewotCQkgIC8qIFJlZW50cmFudCBjb2RlIGhhcyBiZWVuIGdlbmVyYXRlZC4gIFRoaXMgZG9lcyBhZmZlY3QKLQkJICAgICBsaW5raW5nLCBzaW5jZSB0aGVyZSBpcyBubyBwb2ludCBpbiBsaW5raW5nIHJlZW50cmFudC8KLQkJICAgICBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHdpdGggYWJzb2x1dGUgcG9zaXRpb24gY29kZS4gKi8KLQkJICBwaWNfY29kZSA9IHRydWU7Ci0JCSAgcmV0dXJuIDE7Ci0JCX0KLQkgICAgICAKLQkgICAgICBhc19iYWQgKF8oIlVucmVjb2duaXNlZCBBUENTIHN3aXRjaCAtbSVzIiksIGFyZyk7Ci0JICAgICAgcmV0dXJuIDA7Ci0gIAkgICAgfQotI2VuZGlmCi0JICAvKiBTdHJpcCBvZmYgb3B0aW9uYWwgImFybSIgKi8KLQkgIGlmICghIHN0cm5jbXAgKHN0ciwgImFybSIsIDMpKQotCSAgICBzdHIgKz0gMzsKLQotCSAgc3dpdGNoICgqc3RyKQotCSAgICB7Ci0JICAgIGNhc2UgJzEnOgotCSAgICAgIGlmIChzdHJlcSAoc3RyLCAiMSIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV8xOwotCSAgICAgIGVsc2UKLQkJZ290byBiYWQ7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnMic6Ci0JICAgICAgaWYgKHN0cmVxIChzdHIsICIyIikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzI7Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgIjI1MCIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV8yNTA7Ci0JICAgICAgZWxzZQotCQlnb3RvIGJhZDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICczJzoKLQkgICAgICBpZiAoc3RyZXEgKHN0ciwgIjMiKSkKLQkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fMzsKLQkgICAgICBlbHNlCi0JCWdvdG8gYmFkOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJzYnOgotCSAgICAgIHN3aXRjaCAoc3RydG9sIChzdHIsIE5VTEwsIDEwKSkKLQkJewotCQljYXNlIDY6Ci0JCWNhc2UgNjA6Ci0JCWNhc2UgNjAwOgotCQljYXNlIDYxMDoKLQkJY2FzZSA2MjA6Ci0JCSAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fNjsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBnb3RvIGJhZDsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJzcnOgotCSAgICAgIHN3aXRjaCAoc3RydG9sIChzdHIsICYgc3RyLCAxMCkpCS8qIEVhdCB0aGUgcHJvY2Vzc29yIG5hbWUgKi8KLQkJewotCQljYXNlIDc6Ci0JCWNhc2UgNzA6Ci0JCWNhc2UgNzAwOgotCQljYXNlIDcxMDoKLQkJY2FzZSA3MTAwOgotCQljYXNlIDc1MDA6Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgZ290byBiYWQ7Ci0JCX0KLSAgICAgICAgICAgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fNzsKLSAgICAgICAgICAgICAgZm9yICg7ICpzdHI7IHN0cisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKCogc3RyKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgY2FzZSAndCc6Ci0gICAgICAgICAgICAgICAgICAgIGNwdV92YXJpYW50IHw9IChBUk1fVEhVTUIgfCBBUk1fQVJDSHY0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgIGNhc2UgJ20nOgotICAgICAgICAgICAgICAgICAgICBjcHVfdmFyaWFudCB8PSBBUk1fTE9OR01VTDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdmJzogLyogZmUgPT4gZnAgZW5hYmxlZCBjcHUuICAqLwotCQkgICAgaWYgKHN0clsxXSA9PSAnZScpCi0JCSAgICAgICsrIHN0cjsKLQkJICAgIGVsc2UKLQkJICAgICAgZ290byBiYWQ7Ci0JCSAgICAKLQkJICBjYXNlICdjJzogLyogTGVmdCBvdmVyIGZyb20gNzEwYyBwcm9jZXNzb3IgbmFtZS4gICovCi0gICAgICAgICAgICAgICAgICBjYXNlICdkJzogLyogRGVidWcgKi8KLSAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOiAvKiBFbWJlZGRlZCBJQ0UgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkZWQgZm9yIGNvbXBsZXRlbmVzcyBpbiBBUk0gcHJvY2Vzc29yIG5hbWluZy4gKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc4JzoKLQkgICAgICBpZiAoc3RyZXEgKHN0ciwgIjgiKSB8fCBzdHJlcSAoc3RyLCAiODEwIikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzggfCBBUk1fQVJDSHY0IHwgQVJNX0xPTkdNVUw7Ci0JICAgICAgZWxzZQotCQlnb3RvIGJhZDsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSAnOSc6Ci0JICAgICAgaWYgKHN0cmVxIChzdHIsICI5IikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzkgfCBBUk1fQVJDSHY0IHwgQVJNX0xPTkdNVUw7Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgIjl0ZG1pIikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzkgfCBBUk1fQVJDSHY0IHwgQVJNX0xPTkdNVUwgfCBBUk1fVEhVTUI7Ci0JICAgICAgZWxzZQotCQlnb3RvIGJhZDsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSAncyc6Ci0JICAgICAgaWYgKHN0cmVxIChzdHIsICJzdHJvbmdhcm0iKQotCQkgIHx8IHN0cmVxIChzdHIsICJzdHJvbmdhcm0xMTAiKQotCQkgIHx8IHN0cmVxIChzdHIsICJzdHJvbmdhcm0xMTAwIikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzggfCBBUk1fQVJDSHY0IHwgQVJNX0xPTkdNVUw7Ci0JICAgICAgZWxzZQotCQlnb3RvIGJhZDsKLQkgICAgICBicmVhazsKLQkJCi0JICAgIGNhc2UgJ3YnOgotCSAgICAgIC8qIFNlbGVjdCB2YXJpYW50IGJhc2VkIG9uIGFyY2hpdGVjdHVyZSByYXRoZXIgdGhhbiBwcm9jZXNzb3IgKi8KLQkgICAgICBzd2l0Y2ggKCorK3N0cikKLQkJewotCQljYXNlICcyJzoKLQkJICBzd2l0Y2ggKCorK3N0cikKLQkJICAgIHsKLQkJICAgIGNhc2UgJ2EnOiBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV8zOyBicmVhazsKLQkJICAgIGNhc2UgMDogICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV8yOyBicmVhazsKLQkJICAgIGRlZmF1bHQ6ICBhc19iYWQgKF8oIkludmFsaWQgYXJjaGl0ZWN0dXJlIHZhcmlhbnQgLW0lcyIpLCBhcmcpOyBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJICAKLQkJY2FzZSAnMyc6Ci0JCSAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV83OwotICAgICAgICAgICAgICAgICAgICAKLQkJICBzd2l0Y2ggKCorK3N0cikKLQkJICAgIHsKLQkJICAgIGNhc2UgJ20nOiBjcHVfdmFyaWFudCB8PSBBUk1fTE9OR01VTDsgYnJlYWs7Ci0JCSAgICBjYXNlIDA6ICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OiAgYXNfYmFkIChfKCJJbnZhbGlkIGFyY2hpdGVjdHVyZSB2YXJpYW50IC1tJXMiKSwgYXJnKTsgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWNhc2UgJzQnOgotCQkgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNX0FSQ0h2NDsKLQkJICAKLQkJICBzd2l0Y2ggKCorK3N0cikKLQkJICAgIHsKLQkJICAgIGNhc2UgJ3QnOiBjcHVfdmFyaWFudCB8PSBBUk1fVEhVTUI7IGJyZWFrOwotCQkgICAgY2FzZSAwOiAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDogIGFzX2JhZCAoXygiSW52YWxpZCBhcmNoaXRlY3R1cmUgdmFyaWFudCAtbSVzIiksIGFyZyk7IGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQkgIAotCQlkZWZhdWx0OgotCQkgIGFzX2JhZCAoXygiSW52YWxpZCBhcmNoaXRlY3R1cmUgdmFyaWFudCAtbSVzIiksIGFyZyk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgZGVmYXVsdDoKLQkgICAgYmFkOgotCSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBwcm9jZXNzb3IgdmFyaWFudCAtbSVzIiksIGFyZyk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2snOgotICAgICAgcGljX2NvZGUgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoZnApCi0gICAgIEZJTEUgKiBmcDsKLXsKLSAgZnByaW50ZiAoZnAsCi1fKCJcCi0gQVJNIFNwZWNpZmljIEFzc2VtYmxlciBPcHRpb25zOlxuXAotICAtbVthcm1dWzxwcm9jZXNzb3IgbmFtZT5dIHNlbGVjdCBwcm9jZXNzb3IgdmFyaWFudFxuXAotICAtbVthcm1ddlsyfDJhfDN8M218NHw0dF0gIHNlbGVjdCBhcmNoaXRlY3R1cmUgdmFyaWFudFxuXAotICAtbXRodW1iICAgICAgICAgICAgICAgICAgIG9ubHkgYWxsb3cgVGh1bWIgaW5zdHJ1Y3Rpb25zXG5cCi0gIC1tdGh1bWItaW50ZXJ3b3JrICAgICAgICAgbWFyayB0aGUgYXNzZW1ibGVkIGNvZGUgYXMgc3VwcG9ydGluZyBpbnRlcndvcmtpbmdcblwKLSAgLW1hbGwgICAgICAgICAgICAgICAgICAgICBhbGxvdyBhbnkgaW5zdHJ1Y3Rpb25cblwKLSAgLW1mcGExMCwgLW1mcGExMSAgICAgICAgICBzZWxlY3QgZmxvYXRpbmcgcG9pbnQgYXJjaGl0ZWN0dXJlXG5cCi0gIC1tZnBlLW9sZCAgICAgICAgICAgICAgICAgZG9uJ3QgYWxsb3cgZmxvYXRpbmctcG9pbnQgbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zXG5cCi0gIC1tbm8tZnB1ICAgICAgICAgICAgICAgICAgZG9uJ3QgYWxsb3cgYW55IGZsb2F0aW5nLXBvaW50IGluc3RydWN0aW9ucy5cbiIpKTsKLSAgZnByaW50ZiAoZnAsCi1fKCJcCi0gIC1rICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgUElDIGNvZGUuXG4iKSk7Ci0jaWYgZGVmaW5lZCBPQkpfQ09GRiB8fCBkZWZpbmVkIE9CSl9FTEYKLSAgZnByaW50ZiAoZnAsCi1fKCJcCi0gIC1tYXBjcy0zMiwgLW1hcGNzLTI2ICAgICAgc3BlY2lmeSB3aGljaCBBUk0gUHJvY2VkdXJlIENhbGxpbmcgU3RhbmRhcmQgdG8gdXNlXG4iKSk7Ci0gIGZwcmludGYgKGZwLAotXygiXAotICAtbWFwY3MtZmxvYXQgICAgICAgICAgICAgIGZsb2F0aW5nIHBvaW50IGFyZ3MgYXJlIHBhc3NlZCBpbiBGUCByZWdzXG4iKSk7Ci0gIGZwcmludGYgKGZwLAotXygiXAotICAtbWFwY3MtcmVlbnRyYW50ICAgICAgICAgIHRoZSBjb2RlIGlzIHBvc2l0aW9uIGluZGVwZW5kZW50L3JlZW50cmFudFxuIikpOwotICAjZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gIGZwcmludGYgKGZwLAotXygiXAotICAtbW9hYmkgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgdGhlIG9sZCBFTEYgQUJJXG4iKSk7Ci0jZW5kaWYKLSNpZmRlZiBBUk1fQklfRU5ESUFOCi0gIGZwcmludGYgKGZwLAotXygiXAotICAtRUIgICAgICAgICAgICAgICAgICAgICAgIGFzc2VtYmxlIGNvZGUgZm9yIGEgYmlnIGVuZGlhbiBjcHVcblwKLSAgLUVMICAgICAgICAgICAgICAgICAgICAgICBhc3NlbWJsZSBjb2RlIGZvciBhIGxpdHRsZSBlbmRpYW4gY3B1XG4iKSk7Ci0jZW5kaWYKLX0KLQotLyogV2UgbmVlZCB0byBiZSBhYmxlIHRvIGZpeCB1cCBhcmJpdHJhcnkgZXhwcmVzc2lvbnMgaW4gc29tZSBzdGF0ZW1lbnRzLgotICAgVGhpcyBpcyBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgc3ltYm9scyB0aGF0IGFyZSBhbiBhcmJpdHJhcnkgZGlzdGFuY2UgZnJvbQotICAgdGhlIHBjLiAgVGhlIG1vc3QgY29tbW9uIGNhc2VzIGFyZSBvZiB0aGUgZm9ybSAoKCsvLXN5bSAtLysgLiAtIDgpICYgbWFzayksCi0gICB3aGljaCByZXR1cm5zIHBhcnQgb2YgYW4gYWRkcmVzcyBpbiBhIGZvcm0gd2hpY2ggd2lsbCBiZSB2YWxpZCBmb3IKLSAgIGEgZGF0YSBpbnN0cnVjdGlvbi4gIFdlIGRvIHRoaXMgYnkgcHVzaGluZyB0aGUgZXhwcmVzc2lvbiBpbnRvIGEgc3ltYm9sCi0gICBpbiB0aGUgZXhwcl9zZWN0aW9uLCBhbmQgY3JlYXRpbmcgYSBmaXggZm9yIHRoYXQuICAqLwotCi1zdGF0aWMgdm9pZAotZml4X25ld19hcm0gKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsIHBjX3JlbCwgcmVsb2MpCi0gICAgIGZyYWdTICogICAgICAgZnJhZzsKLSAgICAgaW50ICAgICAgICAgICB3aGVyZTsKLSAgICAgc2hvcnQgaW50ICAgICBzaXplOwotICAgICBleHByZXNzaW9uUyAqIGV4cDsKLSAgICAgaW50ICAgICAgICAgICBwY19yZWw7Ci0gICAgIGludCAgICAgICAgICAgcmVsb2M7Ci17Ci0gIGZpeFMgKiAgICAgICAgIG5ld19maXg7Ci0gIGFybV9maXhfZGF0YSAqIGFybV9kYXRhOwotCi0gIHN3aXRjaCAoZXhwLT5YX29wKQotICAgIHsKLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgY2FzZSBPX3N5bWJvbDoKLSAgICBjYXNlIE9fYWRkOgotICAgIGNhc2UgT19zdWJ0cmFjdDoKLSAgICAgIG5ld19maXggPSBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNfcmVsLCByZWxvYyk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBuZXdfZml4ID0gZml4X25ldyAoZnJhZywgd2hlcmUsIHNpemUsIG1ha2VfZXhwcl9zeW1ib2wgKGV4cCksIDAsCi0JCQkgcGNfcmVsLCByZWxvYyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogTWFyayB3aGV0aGVyIHRoZSBmaXggaXMgdG8gYSBUSFVNQiBpbnN0cnVjdGlvbiwgb3IgYW4gQVJNIGluc3RydWN0aW9uICovCi0gIGFybV9kYXRhID0gKGFybV9maXhfZGF0YSAqKSBvYnN0YWNrX2FsbG9jICgmIG5vdGVzLCBzaXplb2YgKGFybV9maXhfZGF0YSkpOwotICBuZXdfZml4LT50Y19maXhfZGF0YSA9IChQVFIpIGFybV9kYXRhOwotICBhcm1fZGF0YS0+dGh1bWJfbW9kZSA9IHRodW1iX21vZGU7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qCi0gKiBUaGlzIGZpeF9uZXcgaXMgY2FsbGVkIGJ5IGNvbnMgdmlhIFRDX0NPTlNfRklYX05FVwotICoKLSAqIFdlIGNoZWNrIHRoZSBleHByZXNzaW9uIHRvIHNlZSBpZiBpdCBpcyBvZiB0aGUgZm9ybQotICogIF9fR0xPQkFMX09GRlNFVF9UQUJMRSArID8/PwotICogSWYgaXQgaXMgdGhlbiB0aGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVmZXJlbmNlIHRvIHRoZSBHT1QuCi0gKiBpLmUuCi0gKiAJbGRyCXNsLCBMMQotICogCWFkZAlzbCwgcGMsIHNsCi0gKiBMMjoKLSAqIAkuLi4KLSAqIEwxOgotICoJLndvcmQJX19HTE9CQUxfT0ZGU0VUX1RBQkxFICsgKC4gLSAoTDIgKyA0KSkKLSAqCi0gKiBJbiB0aGlzIGNhc2UgdXNlIGEgcmVsb2MgdHlwZSBCRkRfUkVMT0NfQVJNX0dPVFBDIGluc3RlYWQgb2YgdGhlCi0gKiBub3JtYWwgQkZEX1JFTE9DX3sxNiwzMiw2NH0KLSAqLwotCi12b2lkCi1jb25zX2ZpeF9uZXdfYXJtIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwKQotICAgICBmcmFnUyAqICAgICAgIGZyYWc7Ci0gICAgIGludCAgICAgICAgICAgd2hlcmU7Ci0gICAgIGludCAgICAgICAgICAgc2l6ZTsKLSAgICAgZXhwcmVzc2lvblMgKiBleHA7Ci17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSB0eXBlOwotICBpbnQgcGNyZWwgPSAwOwotICAKLSAgLyogUGljayBhIHJlbG9jIC4uLgotICAgKgotICAgKiBAQCBTaG91bGQgbG9vayBhdCBDUFUgd29yZCBzaXplLgotICAgKi8KLSAgc3dpdGNoIChzaXplKSAKLSAgICB7Ci0gICAgY2FzZSAyOgotICAgICAgdHlwZSA9IEJGRF9SRUxPQ18xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICBkZWZhdWx0OgotICAgICAgdHlwZSA9IEJGRF9SRUxPQ18zMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSAgICAgIHR5cGUgPSBCRkRfUkVMT0NfNjQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICAvKiBMb29rIGZvciBwb3NzaWJsZSBHT1RQQyByZWxvYyAqLwotICAKLSAgLyoKLSAgICogTG9vayBmb3IgcGljIGFzc2VtYmxlciBhbmQgJ3VuZGVmIHN5bWJvbCArIGV4cHIgc3ltYm9sJyBleHByZXNzaW9uCi0gICAqIGFuZCBhIDMyIGJpdCBzaXplLgotICAgKi8KLSAgCi0gIGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgKGludCkgc2l6ZSwgZXhwLCBwY3JlbCwgdHlwZSk7Ci19Ci0KLS8qIEEgZ29vZCBwbGFjZSB0byBkbyB0aGlzLCBhbHRob3VnaCB0aGlzIHdhcyBwcm9iYWJseSBub3QgaW50ZW5kZWQKLSAqIGZvciB0aGlzIGtpbmQgb2YgdXNlLiAgV2UgbmVlZCB0byBkdW1wIHRoZSBsaXRlcmFsIHBvb2wgYmVmb3JlCi0gKiByZWZlcmVuY2VzIGFyZSBtYWRlIHRvIGEgbnVsbCBzeW1ib2wgcG9pbnRlci4gICovCi12b2lkCi1hcm1fY2xlYW51cCAoKQotewotICBpZiAoY3VycmVudF9wb29sUCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgMCk7IC8qIFB1dCBpdCBhdCB0aGUgZW5kIG9mIHRleHQgc2VjdGlvbiAqLwotICAgICAgc19sdG9yZyAoMCk7Ci0gICAgICBsaXN0aW5nX3ByZXZfbGluZSAoKTsKLSAgICB9Ci19Ci0KLXZvaWQKLWFybV9zdGFydF9saW5lX2hvb2sgKCkKLXsKLSAgbGFzdF9sYWJlbF9zZWVuID0gTlVMTDsKLX0KLQotdm9pZAotYXJtX2Zyb2JfbGFiZWwgKHN5bSkKLSAgICAgc3ltYm9sUyAqIHN5bTsKLXsKLSAgbGFzdF9sYWJlbF9zZWVuID0gc3ltOwotICAKLSAgQVJNX1NFVF9USFVNQiAoc3ltLCB0aHVtYl9tb2RlKTsKLSAgCi0jaWYgZGVmaW5lZCBPQkpfQ09GRiB8fCBkZWZpbmVkIE9CSl9FTEYKLSAgQVJNX1NFVF9JTlRFUldPUksgKHN5bSwgc3VwcG9ydF9pbnRlcndvcmspOwotI2VuZGlmCi0gIAotICBpZiAobGFiZWxfaXNfdGh1bWJfZnVuY3Rpb25fbmFtZSkKLSAgICB7Ci0gICAgICAvKiBXaGVuIHRoZSBhZGRyZXNzIG9mIGEgVGh1bWIgZnVuY3Rpb24gaXMgdGFrZW4gdGhlIGJvdHRvbQotCSBiaXQgb2YgdGhhdCBhZGRyZXNzIHNob3VsZCBiZSBzZXQuICBUaGlzIHdpbGwgYWxsb3cKLQkgaW50ZXJ3b3JraW5nIGJldHdlZW4gQXJtIGFuZCBUaHVtYiBmdW5jdGlvbnMgdG8gd29yawotCSBjb3JyZWN0bHkuICAqLwotCi0gICAgICBUSFVNQl9TRVRfRlVOQyAoc3ltLCAxKTsKLSAgICAgIAotICAgICAgbGFiZWxfaXNfdGh1bWJfZnVuY3Rpb25fbmFtZSA9IGZhbHNlOwotICAgIH0KLX0KLQotLyogQWRqdXN0IHRoZSBzeW1ib2wgdGFibGUuICBUaGlzIG1hcmtzIFRodW1iIHN5bWJvbHMgYXMgZGlzdGluY3QgZnJvbQotICAgQVJNIG9uZXMuICAqLwotCi12b2lkCi1hcm1fYWRqdXN0X3N5bXRhYiAoKQotewotI2lmZGVmIE9CSl9DT0ZGCi0gIHN5bWJvbFMgKiBzeW07Ci0KLSAgZm9yIChzeW0gPSBzeW1ib2xfcm9vdFA7IHN5bSAhPSBOVUxMOyBzeW0gPSBzeW1ib2xfbmV4dCAoc3ltKSkKLSAgICB7Ci0gICAgICBpZiAoQVJNX0lTX1RIVU1CIChzeW0pKQotICAgICAgICB7Ci0JICBpZiAoVEhVTUJfSVNfRlVOQyAoc3ltKSkKLQkgICAgewotCSAgICAgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyBhIFRodW1iIGZ1bmN0aW9uLiAgKi8KLQkgICAgICBpZiAoICAgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX1NUQVQKLQkJICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfTEFCRUwpIC8qIFRoaXMgY2FuIGhhcHBlbiEgKi8KLQkJU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX1RIVU1CU1RBVEZVTkMpOwotCi0JICAgICAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX0VYVCkKLQkJU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX1RIVU1CRVhURlVOQyk7Ci0JICAgICAgZWxzZQotCQlhc19iYWQgKF8oIiVzOiB1bmV4cGVjdGVkIGZ1bmN0aW9uIHR5cGU6ICVkIiksCi0JCQlTX0dFVF9OQU1FIChzeW0pLCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pKTsKLQkgICAgfQotICAgICAgICAgIGVsc2Ugc3dpdGNoIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlIENfRVhUOgotICAgICAgICAgICAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19USFVNQkVYVCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgQ19TVEFUOgotICAgICAgICAgICAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19USFVNQlNUQVQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIENfTEFCRUw6Ci0gICAgICAgICAgICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX1RIVU1CTEFCRUwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBkZWZhdWx0OiAvKiBkbyBub3RoaW5nICovIAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIGlmIChBUk1fSVNfSU5URVJXT1JLIChzeW0pKQotCWNvZmZzeW1ib2woc3ltLT5ic3ltKS0+bmF0aXZlLT51LnN5bWVudC5uX2ZsYWdzID0gMHhGRjsKLSAgICB9Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gIHN5bWJvbFMgKiAgICAgICAgIHN5bTsKLSAgZWxmX3N5bWJvbF90eXBlICogZWxmX3N5bTsKLSAgY2hhciAgICAgICAgICAgICAgYmluZDsKLQotICBmb3IgKHN5bSA9IHN5bWJvbF9yb290UDsgc3ltICE9IE5VTEw7IHN5bSA9IHN5bWJvbF9uZXh0IChzeW0pKQotICAgIHsKLSAgICAgIGlmIChBUk1fSVNfVEhVTUIgKHN5bSkpCi0gICAgICAgIHsKLQkgIGlmIChUSFVNQl9JU19GVU5DIChzeW0pKQotCSAgICB7Ci0JICAgICAgZWxmX3N5bSA9IGVsZl9zeW1ib2wgKHN5bS0+YnN5bSk7Ci0JICAgICAgYmluZCA9IEVMRl9TVF9CSU5EIChlbGZfc3ltKTsKLQkgICAgICBlbGZfc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoYmluZCwgU1RUX0FSTV9URlVOQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgIH0KLSNlbmRpZgotfQotCi1pbnQKLWFybV9kYXRhX2luX2NvZGUgKCkKLXsKLSAgaWYgKHRodW1iX21vZGUgJiYgISBzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIgKyAxLCAiZGF0YToiLCA1KSkKLSAgICB7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJy8nOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgCi0gIHJldHVybiAwOwotfQotCi1jaGFyICoKLWFybV9jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKG5hbWUpCi0gICAgIGNoYXIgKiBuYW1lOwotewotICBpbnQgbGVuOwotCi0gIGlmICh0aHVtYl9tb2RlICYmIChsZW4gPSBzdHJsZW4gKG5hbWUpKSA+IDUKLSAgICAgICYmIHN0cmVxIChuYW1lICsgbGVuIC0gNSwgIi9kYXRhIikpCi0gICAgewotICAgICAgKihuYW1lICsgbGVuIC0gNSkgPSAwOwotICAgIH0KLQotICByZXR1cm4gbmFtZTsKLX0KLQotYm9vbGVhbgotYXJtX3ZhbGlkYXRlX2ZpeCAoZml4UCkKLSAgICAgZml4UyAqIGZpeFA7Ci17Ci0gIC8qIElmIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgYnJhbmNoIGlzIGEgZGVmaW5lZCBzeW1ib2wgd2hpY2ggZG9lcyBub3QgaGF2ZQotICAgICB0aGUgVEhVTUJfRlVOQyBhdHRyaWJ1dGUsIHRoZW4gd2UgbXVzdCBiZSBjYWxsaW5nIGEgZnVuY3Rpb24gd2hpY2ggaGFzCi0gICAgIHRoZSAoaW50ZXJmYWNlYXJtKSBhdHRyaWJ1dGUuICBXZSBsb29rIGZvciB0aGUgVGh1bWIgZW50cnkgcG9pbnQgdG8gdGhhdAotICAgICBmdW5jdGlvbiBhbmQgY2hhbmdlIHRoZSBicmFuY2ggdG8gcmVmZXIgdG8gdGhhdCBmdW5jdGlvbiBpbnN0ZWFkLiAgKi8KLSAgaWYgKCAgIGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMKLSAgICAgICYmIGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLSAgICAgICYmIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICAmJiAhIFRIVU1CX0lTX0ZVTkMgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICBmaXhQLT5meF9hZGRzeSA9IGZpbmRfcmVhbF9zdGFydCAoZml4UC0+ZnhfYWRkc3kpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotI2lmZGVmIE9CSl9FTEYKLS8qIFJlbG9jYXRpb25zIGFnYWluc3QgVGh1bWIgZnVuY3Rpb24gbmFtZXMgbXVzdCBiZSBsZWZ0IHVuYWRqdXN0ZWQsCi0gICBzbyB0aGF0IHRoZSBsaW5rZXIgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGNvcnJlY3RseSBzZXQgdGhlCi0gICBib3R0b20gYml0IG9mIHRoZWlyIGFkZHJlc3Nlcy4gIFRoZSBNSVBTIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbgotICAgYWxzbyBwcmV2ZW50cyByZWxvY2F0aW9ucyB0aGF0IGFyZSBtaXBzLTE2IHNwZWNpZmljLCBidXQgSSBkbyBub3QKLSAgIGtub3cgd2h5IGl0IGRvZXMgdGhpcy4KLQotICAgRklYTUU6Ci0gICBUaGVyZSBpcyBvbmUgb3RoZXIgcHJvYmxlbSB0aGF0IG91Z2h0IHRvIGJlIGFkZHJlc3NlZCBoZXJlLCBidXQKLSAgIHdoaWNoIGN1cnJlbnRseSBpcyBub3Q6ICBUYWtpbmcgdGhlIGFkZHJlc3Mgb2YgYSBsYWJlbCAocmF0aGVyCi0gICB0aGFuIGEgZnVuY3Rpb24pIGFuZCB0aGVuIGxhdGVyIGp1bXBpbmcgdG8gdGhhdCBhZGRyZXNzLiAgU3VjaAotICAgYWRkcmVzc2VzIGFsc28gb3VnaHQgdG8gaGF2ZSB0aGVpciBib3R0b20gYml0IHNldCAoYXNzdW1pbmcgdGhhdAotICAgdGhleSByZXNpZGUgaW4gVGh1bWIgY29kZSksIGJ1dCBhdCB0aGUgbW9tZW50IHRoZXkgd2lsbCBub3QuICAqLwotICAgCi1ib29sZWFuCi1hcm1fZml4X2FkanVzdGFibGUgKGZpeFApCi0gICBmaXhTICogZml4UDsKLXsKLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSAgCi0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLwotICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgCi0gIGlmIChTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoVEhVTUJfSVNfRlVOQyAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICAmJiBmaXhQLT5meF9zdWJzeSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAKLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLwotICBpZiAoICAgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLWNvbnN0IGNoYXIgKgotZWxmMzJfYXJtX3RhcmdldF9mb3JtYXQgKCkKLXsKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIGlmICh0YXJnZXRfb2FiaSkKLSAgICAgIHJldHVybiAiZWxmMzItYmlnYXJtLW9hYmkiOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAiZWxmMzItYmlnYXJtIjsKLSAgZWxzZQotICAgIGlmICh0YXJnZXRfb2FiaSkKLSAgICAgIHJldHVybiAiZWxmMzItbGl0dGxlYXJtLW9hYmkiOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAiZWxmMzItbGl0dGxlYXJtIjsKLX0KLQotdm9pZAotYXJtZWxmX2Zyb2Jfc3ltYm9sIChzeW1wLCBwdW50cCkKLSAgICAgc3ltYm9sUyAqIHN5bXA7Ci0gICAgIGludCAqIHB1bnRwOwotewotICBlbGZfZnJvYl9zeW1ib2wgKHN5bXAsIHB1bnRwKTsKLX0gCi0KLWludAotYXJtX2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCi0gICAgIHN0cnVjdCBmaXggKiBmaXhwOwotewotICBpZiAoICAgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCkgICAgCi0gICAgcmV0dXJuIDE7Ci0gIAotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotYXJtX3BhcnNlX3JlbG9jICgpCi17Ci0gIGNoYXIgICBpZFsxNl07Ci0gIGNoYXIgKiBpcDsKLSAgaW50ICAgIGk7Ci0gIHN0YXRpYyBzdHJ1Y3QKLSAgewotICAgIGNoYXIgKiBzdHI7Ci0gICAgaW50ICAgIGxlbjsKLSAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gIH0KLSAgcmVsb2NfbWFwW10gPQotICB7Ci0jZGVmaW5lIE1BUChzdHIscmVsb2MpIHsgc3RyLCBzaXplb2YgKHN0ciktMSwgcmVsb2MgfQotICAgIE1BUCAoIihnb3QpIiwgICAgQkZEX1JFTE9DX0FSTV9HT1QzMiksCi0gICAgTUFQICgiKGdvdG9mZikiLCBCRkRfUkVMT0NfQVJNX0dPVE9GRiksCi0gICAgLyogU2NvdHRCOiBKYW4gMzAsIDE5OTggKi8KLSAgICAvKiBBZGRlZCBzdXBwb3J0IGZvciBwYXJzaW5nICJ2YXIoUExUKSIgYnJhbmNoIGluc3RydWN0aW9ucyAqLwotICAgIC8qIGdlbmVyYXRlZCBieSBHQ0MgZm9yIFBMVCByZWxvY3MgKi8KLSAgICBNQVAgKCIocGx0KSIsICAgIEJGRF9SRUxPQ19BUk1fUExUMzIpLAotICAgIE5VTEwsIDAsICAgICAgICAgQkZEX1JFTE9DX1VOVVNFRAotI3VuZGVmIE1BUCAgICAKLSAgfTsKLQotICBmb3IgKGkgPSAwLCBpcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICBpIDwgc2l6ZW9mIChpZCkgJiYgKGlzYWxudW0gKCppcCkgfHwgaXNwdW5jdCAoKmlwKSk7Ci0gICAgICAgaSsrLCBpcCsrKQotICAgIGlkW2ldID0gdG9sb3dlciAoKmlwKTsKLSAgCi0gIGZvciAoaSA9IDA7IHJlbG9jX21hcFtpXS5zdHI7IGkrKykKLSAgICBpZiAoc3RybmNtcCAoaWQsIHJlbG9jX21hcFtpXS5zdHIsIHJlbG9jX21hcFtpXS5sZW4pID09IDApCi0gICAgICBicmVhazsKLSAgCi0gIGlucHV0X2xpbmVfcG9pbnRlciArPSByZWxvY19tYXBbaV0ubGVuOwotICAKLSAgcmV0dXJuIHJlbG9jX21hcFtpXS5yZWxvYzsKLX0KLQotc3RhdGljIHZvaWQKLXNfYXJtX2VsZl9jb25zIChuYnl0ZXMpCi0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZmRlZiBtZF9jb25zX2FsaWduCi0gIG1kX2NvbnNfYWxpZ24gKG5ieXRlcyk7Ci0jZW5kaWYKLQotICBkbwotICAgIHsKLSAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLSAgICAgIAotICAgICAgZXhwcmVzc2lvbiAoJiBleHApOwotCi0gICAgICBpZiAoZXhwLlhfb3AgPT0gT19zeW1ib2wKLSAgICAgICAgICAmJiAqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnKCcKLSAgICAgICAgICAmJiAocmVsb2MgPSBhcm1fcGFyc2VfcmVsb2MoKSkgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLSAgICAgICAgewotICAgICAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCByZWxvYyk7Ci0gICAgICAgICAgaW50IHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLQotICAgICAgICAgIGlmIChzaXplID4gbmJ5dGVzKQotICAgICAgICAgICAgYXNfYmFkICgiJXMgcmVsb2NhdGlvbnMgZG8gbm90IGZpdCBpbiAlZCBieXRlcyIsIGhvd3RvLT5uYW1lLCBuYnl0ZXMpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVnaXN0ZXIgY2hhciAqIHAgPSBmcmFnX21vcmUgKChpbnQpIG5ieXRlcyk7Ci0gICAgICAgICAgICAgIGludCBvZmZzZXQgPSBuYnl0ZXMgLSBzaXplOwotCi0gICAgICAgICAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgb2Zmc2V0LCBzaXplLAotCQkJICAgJiBleHAsIDAsIHJlbG9jKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBlbWl0X2V4cHIgKCYgZXhwLCAodW5zaWduZWQgaW50KSBuYnl0ZXMpOwotICAgIH0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlci0tOwkJLyogUHV0IHRlcm1pbmF0b3IgYmFjayBpbnRvIHN0cmVhbS4gKi8KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1hcm0uaCBiL2dhcy9jb25maWcvdGMtYXJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOTllMjQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtYXJtLmgKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0JTW9kaWZpZWQgYnkgRGF2aWQgVGF5bG9yIChkdGF5bG9yQGFybWx0ZC5jby51aykKLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19BUk0gMQotCi0jaWZuZGVmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLSNlbmRpZgotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBDT0ZGX01BR0lDIAlBUk1NQUdJQwotI2RlZmluZSBUQVJHRVRfQVJDSCAJYmZkX2FyY2hfYXJtCi0KLSNkZWZpbmUgQU9VVF9NQUNIVFlQRSAJMAotCi0jZGVmaW5lIERJRkZfRVhQUl9PSwotCi0jaWZkZWYgIExJVFRMRV9FTkRJQU4KLSN1bmRlZiAgTElUVExFX0VORElBTgotI2VuZGlmCi0KLSNpZmRlZiAgQklHX0VORElBTgotI3VuZGVmICBCSUdfRU5ESUFOCi0jZW5kaWYKLQotI2RlZmluZSBMSVRUTEVfRU5ESUFOIAkxMjM0Ci0jZGVmaW5lIEJJR19FTkRJQU4gCTQzMjEKLQotI2lmIGRlZmluZWQgT0JKX0FPVVQKLSNpZiBkZWZpbmVkIFRFX1JJU0NJWAotIyBkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtcmlzY2l4IgotI2VsaWYgZGVmaW5lZCBURV9MSU5VWAotIyBkZWZpbmUgQVJNX0JJX0VORElBTgotIyBkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtYXJtLWxpbnV4IgotI2VsaWYgZGVmaW5lZCBURV9OZXRCU0QKLSMgZGVmaW5lIFRBUkdFVF9GT1JNQVQgImEub3V0LWFybS1uZXRic2QiCi0jZWxzZQotIyBkZWZpbmUgQVJNX0JJX0VORElBTgotIyBkZWZpbmUgVEFSR0VUX0ZPUk1BVCBcCi0gICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJhLm91dC1hcm0tYmlnIiA6ICJhLm91dC1hcm0tbGl0dGxlIikKLSNlbmRpZgotI2VuZGlmIC8qIE9CSl9BT1VUICovCi0KLSNpZmRlZiBPQkpfQUlGCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImFpZiIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBPQkpfQ09GRiB8fCBkZWZpbmVkIE9CSl9FTEYKLSMgZGVmaW5lIEFSTV9CSV9FTkRJQU4KLSAgICAgCi0jIGRlZmluZSBUQ19WQUxJREFURV9GSVgoZml4UCwgc2VnVHlwZSwgTGFiZWwpIFwKLSAgICAgaWYgKGFybV92YWxpZGF0ZV9maXggKGZpeFApKSBhZGRfc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5Ci0gIGV4dGVybiBib29sZWFuIGFybV92YWxpZGF0ZV9maXggUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0jZW5kaWYKLSAgICAgCi0jaWZkZWYgT0JKX0NPRkYKLSMgaWYgZGVmaW5lZCBURV9QRQotIyAgZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oeCkgKCh4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19SVkEpCi0jICAgaWZkZWYgVEVfRVBPQwotIyAgICBkZWZpbmUgVEFSR0VUX0ZPUk1BVCAodGFyZ2V0X2JpZ19lbmRpYW4gPyAiZXBvYy1wZS1hcm0tYmlnIiA6ICJlcG9jLXBlLWFybS1saXR0bGUiKQotIyAgIGVsc2UKLSMgICAgZGVmaW5lIFRBUkdFVF9GT1JNQVQgKHRhcmdldF9iaWdfZW5kaWFuID8gInBlLWFybS1iaWciIDogInBlLWFybS1saXR0bGUiKQotIyAgIGVuZGlmCi0jIGVsc2UKLSMgIGRlZmluZSBUQVJHRVRfRk9STUFUICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJjb2ZmLWFybS1iaWciIDogImNvZmYtYXJtLWxpdHRsZSIpCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSMgZGVmaW5lIFRBUkdFVF9GT1JNQVQgZWxmMzJfYXJtX3RhcmdldF9mb3JtYXQoKQotICBleHRlcm4gY29uc3QgY2hhciAqIGVsZjMyX2FybV90YXJnZXRfZm9ybWF0IFBBUkFNUyAoKHZvaWQpKTsKLSAgCi0jIGRlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeHApIGFybV9mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQotICBleHRlcm4gaW50IGFybV9mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotI2VuZGlmCi0KLSNkZWZpbmUgbWRfY29udmVydF9mcmFnKGIsIHMsIGYpIHthc19mYXRhbCAoXygiYXJtIGNvbnZlcnRfZnJhZ1xuIikpO30KLQotI2RlZmluZSBtZF9jbGVhbnVwKCkgYXJtX2NsZWFudXAgKCkKLSBleHRlcm4gdm9pZCBhcm1fY2xlYW51cCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgbWRfc3RhcnRfbGluZV9ob29rKCkgYXJtX3N0YXJ0X2xpbmVfaG9vayAoKQotIGV4dGVybiB2b2lkIGFybV9zdGFydF9saW5lX2hvb2sgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoUykgYXJtX2Zyb2JfbGFiZWwgKFMpCi0gZXh0ZXJuIHZvaWQgYXJtX2Zyb2JfbGFiZWwgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqKSk7Ci0KLS8qIFdlIGFsc28gbmVlZCB0byBtYXJrIGFzc2VtYmxlciBjcmVhdGVkIHN5bWJvbHM6ICAqLwotI2RlZmluZSB0Y19mcm9iX2Zha2VfbGFiZWwoUykgYXJtX2Zyb2JfbGFiZWwgKFMpCi0KLS8qIE5PVEU6IFRoZSBmYWtlIGxhYmVsIGNyZWF0aW9uIGluIHN0YWJzLmM6c19zdGFiX2dlbmVyaWMoKSBoYXMKLSAgIGRlbGliZXJhdGVseSBub3QgYmVlbiB1cGRhdGVkIHRvIG1hcmsgYXNzZW1ibGVyIGNyZWF0ZWQgc3RhYnMKLSAgIHN5bWJvbHMgYXMgVGh1bWIuICAqLwotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgYXJtX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotI2Vsc2UKLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIDAKLSNlbmRpZgotCi0vKiBXZSBuZWVkIHRvIGtlZXAgc29tZSBsb2NhbCBpbmZvcm1hdGlvbiBvbiBzeW1ib2xzLiAgKi8KLQotI2RlZmluZSBUQ19TWU1GSUVMRF9UWVBFIHVuc2lnbmVkIGludAotI2RlZmluZSBBUk1fR0VUX0ZMQUcocykgICAJKChzKS0+c3lfdGMpCi0jZGVmaW5lIEFSTV9TRVRfRkxBRyhzLHYpIAkoKHMpLT5zeV90YyB8PSAodikpCi0jZGVmaW5lIEFSTV9SRVNFVF9GTEFHKHMsdikgCSgocyktPnN5X3RjICY9IH4odikpCi0KLSNkZWZpbmUgQVJNX0ZMQUdfVEhVTUIgCQkoMSA8PCAwKQkvKiBUaGUgc3ltYm9sIGlzIGEgVGh1bWIgc3ltYm9sIHJhdGhlciB0aGFuIGFuIEFybSBzeW1ib2wuICAqLwotI2RlZmluZSBBUk1fRkxBR19JTlRFUldPUksgCSgxIDw8IDEpCS8qIFRoZSBzeW1ib2wgaXMgYXR0YWNoZWQgdG8gY29kZSB0aGF0IHN1cHBwb3J0cyBpbnRlcndvcmtpbmcuICAqLwotI2RlZmluZSBUSFVNQl9GTEFHX0ZVTkMJCSgxIDw8IDIpCS8qIFRoZSBzeW1ib2wgaXMgYXR0YWNoZWQgdG8gdGhlIHN0YXJ0IG9mIGEgVGh1bWIgZnVuY3Rpb24uICAqLwotCi0jZGVmaW5lIEFSTV9JU19USFVNQihzKQkJKEFSTV9HRVRfRkxBRyAocykgJiBBUk1fRkxBR19USFVNQikKLSNkZWZpbmUgQVJNX0lTX0lOVEVSV09SSyhzKQkoQVJNX0dFVF9GTEFHIChzKSAmIEFSTV9GTEFHX0lOVEVSV09SSykKLSNkZWZpbmUgVEhVTUJfSVNfRlVOQyhzKQkoQVJNX0dFVF9GTEFHIChzKSAmIFRIVU1CX0ZMQUdfRlVOQykKLQotI2RlZmluZSBBUk1fU0VUX1RIVU1CKHMsdCkgICAgICAoKHQpID8gQVJNX1NFVF9GTEFHIChzLCBBUk1fRkxBR19USFVNQikgICAgIDogQVJNX1JFU0VUX0ZMQUcgKHMsIEFSTV9GTEFHX1RIVU1CKSkKLSNkZWZpbmUgQVJNX1NFVF9JTlRFUldPUksocyx0KSAgKCh0KSA/IEFSTV9TRVRfRkxBRyAocywgQVJNX0ZMQUdfSU5URVJXT1JLKSA6IEFSTV9SRVNFVF9GTEFHIChzLCBBUk1fRkxBR19JTlRFUldPUkspKQotI2RlZmluZSBUSFVNQl9TRVRfRlVOQyhzLHQpICAgICAoKHQpID8gQVJNX1NFVF9GTEFHIChzLCBUSFVNQl9GTEFHX0ZVTkMpICAgIDogQVJNX1JFU0VUX0ZMQUcgKHMsIFRIVU1CX0ZMQUdfRlVOQykpCi0KLQotI2RlZmluZSBUQ19GSVhfVFlQRSBQVFIKLSNkZWZpbmUgVENfSU5JVF9GSVhfREFUQShGSVhQKSAoKEZJWFApLT50Y19maXhfZGF0YSA9IE5VTEwpCi0KLSNkZWZpbmUgVENfU1RBUlRfTEFCRUwoQyxTVFIpIFwKLSAgKGMgPT0gJzonIHx8IChjID09ICcvJyAmJiBhcm1fZGF0YV9pbl9jb2RlICgpKSkKLWludCBhcm1fZGF0YV9pbl9jb2RlIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUoc3RyKSBcCi0gYXJtX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAoc3RyKTsKLWNoYXIgKiBhcm1fY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIFBBUkFNUyAoKGNoYXIgKikpOwotCi0jZGVmaW5lIG9ial9hZGp1c3Rfc3ltdGFiKCkgYXJtX2FkanVzdF9zeW10YWIgKCkKLSBleHRlcm4gdm9pZCBhcm1fYWRqdXN0X3N5bXRhYiBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIG9ial9mcm9iX3N5bWJvbChzeW0sIHB1bnQpICBhcm1lbGZfZnJvYl9zeW1ib2wgKHN5bSwgcHVudCkKLSNlbmRpZgotCi0jZGVmaW5lIHRjX2FvdXRfcHJlX3dyaXRlX2hvb2soeCkJezt9CS8qIG5vdCB1c2VkICovCi0KLSNkZWZpbmUgTElTVElOR19IRUFERVIgIkFSTSBHQVMgIgotCi0jZGVmaW5lIE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCAnJScKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLSNkZWZpbmUgVENfSEFORExFU19GWF9ET05FCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotCi0jZGVmaW5lIExPQ0FMX0xBQkVMKG5hbWUpIChuYW1lWzBdID09ICcuJyAmJiAobmFtZVsxXSA9PSAnTCcpKQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgICAxCi0KLS8qIFRoaXMgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UgaWYgdGhlIHJlbG9jYXRpb24gaXMgZm9yIGEgbG9jYWwgb2JqZWN0Ci0gICBmb3Igd2hpY2ggd2Ugc3RpbGwgd2FudCB0byBkbyB0aGUgcmVsb2NhdGlvbiBhdCBydW50aW1lLiAgVHJ1ZSBpZiB3ZQotICAgYXJlIHdpbGxpbmcgdG8gcGVyZm9ybSB0aGlzIHJlbG9jYXRpb24gd2hpbGUgYnVpbGRpbmcgdGhlIC5vIGZpbGUuCi0gICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgcGNyZWwgcmVsb2NhdGlvbnMsIHNvIEdPVE9GRiBkb2VzIG5vdCBuZWVkIHRvIGJlCi0gICBjaGVja2VkIGhlcmUuICBJIGFtIG5vdCBzdXJlIGlmIHNvbWUgb2YgdGhlIG90aGVycyBhcmUgZXZlciB1c2VkIHdpdGgKLSAgIHBjcmVsLCBidXQgaXQgaXMgZWFzaWVyIHRvIGJlIHNhZmUgdGhhbiBzb3JyeS4gICovCi0KLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkgIFwKLSAgICggIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0FSTV9HT1QxMiBcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19BUk1fR09UMzIgXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfMzIpCi0KLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXIGNvbnNfZml4X25ld19hcm0KLSBleHRlcm4gdm9pZCBjb25zX2ZpeF9uZXdfYXJtIFBBUkFNUyAoKGZyYWdTICosIGludCwgaW50LCBleHByZXNzaW9uUyAqKSk7Ci0KLS8qIERvbid0IGFsbG93IHN5bWJvbHMgdG8gYmUgZGlzY2FyZGVkIG9uIEdPVCByZWxhdGVkIHJlbG9jcywKLSAgIG5vciBvbiBnbG9iYWxzLiAgKi8gCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKHgpIChcCi0gICAgICgoeCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfQVJNX1BMVDMyIFwKLSAgIHx8ICh4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BUk1fR09UMzIgXAotICAgfHwgKHgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9HT1RPRkYgXAotICAgfHwgU19JU19FWFRFUk4gKCh4KS0+ZnhfYWRkc3kpIFwKLSAgIHx8IFNfSVNfV0VBSyAoKHgpLT5meF9hZGRzeSkpID8gMCA6IDEpCi0gICAgIAotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0jZWxzZQotI2RlZmluZSBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0jZW5kaWYKLSAgICAgCi0vKiBlbmQgb2YgdGMtYXJtLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtZDEwdi5jIGIvZ2FzL2NvbmZpZy90Yy1kMTB2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMzhmM2UuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1kMTB2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjM2ICswLDAgQEAKLS8qIHRjLWQxMHYuYyAtLSBBc3NlbWJsZXIgY29kZSBmb3IgdGhlIE1pdHN1YmlzaGkgRDEwVgotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCi0jaW5jbHVkZSAib3Bjb2RlL2QxMHYuaCIKLSNpbmNsdWRlICJlbGYvcHBjLmgiCi0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIk8iOwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKLQotaW50IE9wdGltaXppbmcgPSAwOwotCi0jZGVmaW5lIEFUX1dPUkRfUChYKSAoKFgpLT5YX29wID09IE9fcmlnaHRfc2hpZnQgXAotCQkgICAgICAmJiAoWCktPlhfb3Bfc3ltYm9sICE9IE5VTEwgXAotCQkgICAgICAmJiAoWCktPlhfb3Bfc3ltYm9sLT5zeV92YWx1ZS5YX29wID09IE9fY29uc3RhbnQgXAotCQkgICAgICAmJiAoWCktPlhfb3Bfc3ltYm9sLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIgPT0gQVRfV09SRF9SSUdIVF9TSElGVCkKLSNkZWZpbmUgQVRfV09SRF9SSUdIVF9TSElGVCAyCi0KLQotLyogZml4dXBzICovCi0jZGVmaW5lIE1BWF9JTlNOX0ZJWFVQUyAoNSkKLXN0cnVjdCBkMTB2X2ZpeHVwCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgaW50IG9wZXJhbmQ7Ci0gIGludCBwY3JlbDsKLSAgaW50IHNpemU7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IF9maXh1cHMKLXsKLSAgaW50IGZjOwotICBzdHJ1Y3QgZDEwdl9maXh1cCBmaXhbTUFYX0lOU05fRklYVVBTXTsKLSAgc3RydWN0IF9maXh1cHMgKm5leHQ7Ci19IEZpeHVwczsKLQotc3RhdGljIEZpeHVwcyBGaXhVcHNbMl07Ci1zdGF0aWMgRml4dXBzICpmaXh1cHM7Ci0KLS8qIFRydWUgaWYgaW5zdHJ1Y3Rpb24gc3dhcHBpbmcgd2FybmluZ3Mgc2hvdWxkIGJlIGluaGliaXRlZC4gICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwOyAvKiAtLW5vd2FybnN3YXAgKi8KLQotLyogbG9jYWwgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaCBQQVJBTVMgKChjaGFyICpuYW1lKSk7Ci1zdGF0aWMgaW50IHJlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgaW50IGNoZWNrX3JhbmdlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgbnVtLCBpbnQgYml0cywgaW50IGZsYWdzKSk7Ci1zdGF0aWMgaW50IHBvc3RmaXggUEFSQU1TICgoY2hhciAqcCkpOwotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBnZXRfcmVsb2MgUEFSQU1TICgoc3RydWN0IGQxMHZfb3BlcmFuZCAqb3ApKTsKLXN0YXRpYyBpbnQgZ2V0X29wZXJhbmRzIFBBUkFNUyAoKGV4cHJlc3Npb25TIGV4cFtdKSk7Ci1zdGF0aWMgc3RydWN0IGQxMHZfb3Bjb2RlICpmaW5kX29wY29kZSBQQVJBTVMgKChzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZSwgZXhwcmVzc2lvblMgb3BzW10pKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGJ1aWxkX2luc24gUEFSQU1TICgoc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGUsIGV4cHJlc3Npb25TICpvcGVycywgdW5zaWduZWQgbG9uZyBpbnNuKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9sb25nIFBBUkFNUyAoKHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlLCB1bnNpZ25lZCBsb25nIGluc24sIEZpeHVwcyAqZngpKTsKLXN0YXRpYyB2b2lkIHdyaXRlXzFfc2hvcnQgUEFSQU1TICgoc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGUsIHVuc2lnbmVkIGxvbmcgaW5zbiwgRml4dXBzICpmeCkpOwotc3RhdGljIGludCB3cml0ZV8yX3Nob3J0IFBBUkFNUyAoKHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMSwgdW5zaWduZWQgbG9uZyBpbnNuMSwgCi0JCQkJICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTIsIHVuc2lnbmVkIGxvbmcgaW5zbjIsIGludCBleGVjX3R5cGUsIEZpeHVwcyAqZngpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRvX2Fzc2VtYmxlIFBBUkFNUyAoKGNoYXIgKnN0ciwgc3RydWN0IGQxMHZfb3Bjb2RlICoqb3Bjb2RlKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBkMTB2X2luc2VydF9vcGVyYW5kIFBBUkFNUyAoKCB1bnNpZ25lZCBsb25nIGluc24sIGludCBvcF90eXBlLAotCQkJCQkJICAgb2Zmc2V0VCB2YWx1ZSwgaW50IGxlZnQsIGZpeFMgKmZpeCkpOwotc3RhdGljIGludCBwYXJhbGxlbF9vayBQQVJBTVMgKChzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTEsIHVuc2lnbmVkIGxvbmcgaW5zbjEsIAotCQkJCXN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMiwgdW5zaWduZWQgbG9uZyBpbnNuMiwKLQkJCQlpbnQgZXhlY190eXBlKSk7Ci1zdGF0aWMgc3ltYm9sUyAqIGZpbmRfc3ltYm9sX21hdGNoaW5nX3JlZ2lzdGVyIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KLXsKLSNkZWZpbmUgT1BUSU9OX05PV0FSTlNXQVAgKE9QVElPTl9NRF9CQVNFKQotICB7Im5vd2FybnN3YXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PV0FSTlNXQVB9LAotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOyAgICAgICAKLQotc3RhdGljIHZvaWQgZDEwdl9kb3Rfd29yZCBQQVJBTVMgKChpbnQpKTsKLQotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAid29yZCIsCWQxMHZfZG90X3dvcmQsCTIgfSwKLSAgeyBOVUxMLCAgICAgICBOVUxMLCAgICAgICAgICAgMCB9Ci19OwotCi0vKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqZDEwdl9oYXNoOwotCi0vKiByZWdfbmFtZV9zZWFyY2ggZG9lcyBhIGJpbmFyeSBzZWFyY2ggb2YgdGhlIGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMKLSAgIGFycmF5IHRvIHNlZSBpZiAibmFtZSIgaXMgYSB2YWxpZCByZWdpdGVyIG5hbWUuICBSZXR1cm5zIHRoZSByZWdpc3RlcgotICAgbnVtYmVyIGZyb20gdGhlIGFycmF5IG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUuICovCi0KLXN0YXRpYyBpbnQKLXJlZ19uYW1lX3NlYXJjaCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaW50IG1pZGRsZSwgbG93LCBoaWdoOwotICBpbnQgY21wOwotCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSBkMTB2X3JlZ19uYW1lX2NudCgpIC0gMTsKLQotICBkbwotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCBkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UgCi0JICByZXR1cm4gZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1ttaWRkbGVdLnZhbHVlOwotICAgIH0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKLSAgcmV0dXJuIC0xOwotfQotCi0vKiByZWdpc3Rlcl9uYW1lKCkgY2hlY2tzIHRoZSBzdHJpbmcgYXQgaW5wdXRfbGluZV9wb2ludGVyCi0gICB0byBzZWUgaWYgaXQgaXMgYSB2YWxpZCByZWdpc3RlciBuYW1lICovCi0KLXN0YXRpYyBpbnQKLXJlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyIGMsICpwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAKLSAgd2hpbGUgKCpwICYmICpwIT0nXG4nICYmICpwIT0nXHInICYmICpwICE9JywnICYmICpwIT0nICcgJiYgKnAhPScpJykKLSAgICBwKys7Ci0KLSAgYyA9ICpwOwotICBpZiAoYykKLSAgICAqcCsrID0gMDsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChpbnB1dF9saW5lX3BvaW50ZXIpOwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICAvKiB0ZW1wb3JhcmlseSBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBoZXJlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSAoc3RydWN0IHN5bWJvbCAqKWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKGMpCi0gICAgKihwLTEpID0gYzsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotY2hlY2tfcmFuZ2UgKG51bSwgYml0cywgZmxhZ3MpCi0gICAgIHVuc2lnbmVkIGxvbmcgbnVtOwotICAgICBpbnQgYml0czsKLSAgICAgaW50IGZsYWdzOwotewotICBsb25nIG1pbiwgbWF4LCBiaXQxOwotICBpbnQgcmV0dmFsPTA7Ci0KLSAgLyogZG9uJ3QgYm90aGVyIGNoZWNraW5nIDE2LWJpdCB2YWx1ZXMgKi8KLSAgaWYgKGJpdHMgPT0gMTYpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGZsYWdzICYgT1BFUkFORF9TSElGVCkKLSAgICB7Ci0gICAgICAvKiBhbGwgc3BlY2lhbCBzaGlmdCBvcGVyYW5kcyBhcmUgdW5zaWduZWQgKi8KLSAgICAgIC8qIGFuZCA8PSAxNi4gIFdlIGFsbG93IDAgZm9yIG5vdy4gKi8KLSAgICAgIGlmIChudW0+MTYpCi0JcmV0dXJuIDE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChmbGFncyAmIE9QRVJBTkRfU0lHTkVEKQotICAgIHsKLSAgICAgIG1heCA9ICgxIDw8IChiaXRzIC0gMSkpLTE7IAotICAgICAgbWluID0gLSAoMSA8PCAoYml0cyAtIDEpKTsgIAotICAgICAgaWYgKCgobG9uZyludW0gPiBtYXgpIHx8ICgobG9uZyludW0gPCBtaW4pKQotCXJldHZhbCA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWF4ID0gKDEgPDwgYml0cykgLSAxOwotICAgICAgbWluID0gMDsKLSAgICAgIGlmICgobnVtID4gbWF4KSB8fCAobnVtIDwgbWluKSkKLQlyZXR2YWwgPSAxOwotICAgIH0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZihzdHJlYW0sIF8oIkQxMFYgb3B0aW9uczpcblwKLS1PICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplLiAgV2lsbCBkbyBzb21lIG9wZXJhdGlvbnMgaW4gcGFyYWxsZWwuXG4iKSk7Ci19IAotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ08nOgotICAgICAgLyogT3B0aW1pemUuIFdpbGwgYXR0ZW1wdCB0byBwYXJhbGxlbGl6ZSBvcGVyYXRpb25zICovCi0gICAgICBPcHRpbWl6aW5nID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX05PV0FSTlNXQVA6Ci0gICAgICBmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07Ci0gIGNoYXIgKnQ7Ci0gIGludCBpOwotICAKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gIAotICAqc2l6ZVAgPSBwcmVjICogMjsKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRQICs9IDI7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICBiZmQgKmFiZmQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGZyYWdTICpmcmFnUDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICB2YWx1ZVQgYWRkcjsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOwotICByZXR1cm4gKChhZGRyICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKLX0KLQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjaGFyICpwcmV2X25hbWUgPSAiIjsKLSAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGU7Ci0gIGQxMHZfaGFzaCA9IGhhc2hfbmV3KCk7Ci0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUuICBUaGUgRDEwdiBpbnN0cnVjdGlvbiBzZXQKLSAgICAgaGFzIG1hbnkgaWRlbnRpY2FsIG9wY29kZSBuYW1lcyB0aGF0IGhhdmUgZGlmZmVyZW50IG9wY29kZXMgYmFzZWQKLSAgICAgb24gdGhlIG9wZXJhbmRzLiAgVGhpcyBoYXNoIHRhYmxlIHRoZW4gcHJvdmlkZXMgYSBxdWljayBpbmRleCB0bwotICAgICB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggYSBwYXJ0aWN1bGFyIG5hbWUgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0KLSAgZm9yIChvcGNvZGUgPSAoc3RydWN0IGQxMHZfb3Bjb2RlICopZDEwdl9vcGNvZGVzOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHByZXZfbmFtZSwgb3Bjb2RlLT5uYW1lKSkKLQl7Ci0JICBwcmV2X25hbWUgPSAoY2hhciAqKW9wY29kZS0+bmFtZTsKLQkgIGhhc2hfaW5zZXJ0IChkMTB2X2hhc2gsIG9wY29kZS0+bmFtZSwgKGNoYXIgKikgb3Bjb2RlKTsKLQl9Ci0gICAgfQotCi0gIGZpeHVwcyA9ICZGaXhVcHNbMF07Ci0gIEZpeFVwc1swXS5uZXh0ID0gJkZpeFVwc1sxXTsKLSAgRml4VXBzWzFdLm5leHQgPSAmRml4VXBzWzBdOwotfQotCi0KLS8qIHRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgcG9zdGluY3JlbWVudCBvciBwb3N0ZGVjcmVtZW50Ci0gICBvcGVyYXRvciAoICcrJyBvciAnLScgKSBmcm9tIGFuIGV4cHJlc3Npb24gKi8KLQotc3RhdGljIGludCBwb3N0Zml4IChwKSAKLSAgICAgY2hhciAqcDsKLXsKLSAgd2hpbGUgKCpwICE9ICctJyAmJiAqcCAhPSAnKycpIAotICAgIHsKLSAgICAgIGlmICgqcD09MCB8fCAqcD09J1xuJyB8fCAqcD09J1xyJykgCi0JYnJlYWs7Ci0gICAgICBwKys7Ci0gICAgfQotCi0gIGlmICgqcCA9PSAnLScpIAotICAgIHsKLSAgICAgICpwID0gJyAnOwotICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfQotICBpZiAoKnAgPT0gJysnKSAKLSAgICB7Ci0gICAgICAqcCA9ICcgJzsKLSAgICAgIHJldHVybiAoMSk7Ci0gICAgfQotCi0gIHJldHVybiAoMCk7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAKLWdldF9yZWxvYyAob3ApIAotICAgICBzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcDsKLXsKLSAgaW50IGJpdHMgPSBvcC0+Yml0czsKLQotICBpZiAoYml0cyA8PSA0KSAKLSAgICByZXR1cm4gKDApOwotICAgICAgCi0gIGlmIChvcC0+ZmxhZ3MgJiBPUEVSQU5EX0FERFIpIAotICAgIHsKLSAgICAgIGlmIChiaXRzID09IDgpCi0JcmV0dXJuIChCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SKTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gKEJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMKTsKLSAgICB9Ci0KLSAgcmV0dXJuIChCRkRfUkVMT0NfMTYpOwotfQotCi0KLS8qIGdldF9vcGVyYW5kcyBwYXJzZXMgYSBzdHJpbmcgb2Ygb3BlcmFuZHMgYW5kIHJldHVybnMKLSAgIGFuIGFycmF5IG9mIGV4cHJlc3Npb25zICovCi0KLXN0YXRpYyBpbnQKLWdldF9vcGVyYW5kcyAoZXhwKSAKLSAgICAgZXhwcmVzc2lvblMgZXhwW107Ci17Ci0gIGNoYXIgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGludCBudW1vcHMgPSAwOwotICBpbnQgcG9zdCA9IDA7Ci0KLSAgd2hpbGUgKCpwKSAgCi0gICAgewotICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICcsJykgCi0JcCsrOwotICAgICAgaWYgKCpwPT0wIHx8ICpwPT0nXG4nIHx8ICpwPT0nXHInKSAKLQlicmVhazsKLSAgICAgIAotICAgICAgaWYgKCpwID09ICdAJykgCi0JewotCSAgcCsrOwotCSAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OwotCSAgaWYgKCpwID09ICcoJykgCi0JICAgIHsKLQkgICAgICBwKys7Ci0JICAgICAgZXhwW251bW9wc10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9BVFBBUjsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnAgPT0gJy0nKSAKLQkgICAgewotCSAgICAgIHArKzsKLQkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX0FUTUlOVVM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4cFtudW1vcHNdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfQVRTSUdOOwotCSAgICAgIHBvc3QgPSBwb3N0Zml4IChwKTsKLQkgICAgfQotCSAgbnVtb3BzKys7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICgqcCA9PSAnKScpIAotCXsKLQkgIC8qIGp1c3Qgc2tpcCB0aGUgdHJhaWxpbmcgcGFyZW4gKi8KLQkgIHArKzsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKLQotICAgICAgLyogY2hlY2sgdG8gc2VlIGlmIGl0IG1pZ2h0IGJlIGEgcmVnaXN0ZXIgbmFtZSAqLwotICAgICAgaWYgKCFyZWdpc3Rlcl9uYW1lICgmZXhwW251bW9wc10pKQotCXsKLQkgIC8qIHBhcnNlIGFzIGFuIGV4cHJlc3Npb24gKi8KLQkgIGV4cHJlc3Npb24gKCZleHBbbnVtb3BzXSk7Ci0JfQotCi0gICAgICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkB3b3JkIiwgNSkgPT0gMCkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLQkgIGlmIChleHBbbnVtb3BzXS5YX29wID09IE9fcmVnaXN0ZXIpCi0JICAgIHsKLQkgICAgICAvKiBpZiBpdCBsb29rZWQgbGlrZSBhIHJlZ2lzdGVyIG5hbWUgYnV0IHdhcyBmb2xsb3dlZCBieQotICAgICAgICAgICAgICAgICAiQHdvcmQiIHRoZW4gaXQgd2FzIHJlYWxseSBhIHN5bWJvbCwgc28gY2hhbmdlIGl0IHRvCi0gICAgICAgICAgICAgICAgIG9uZSAqLwotCSAgICAgIGV4cFtudW1vcHNdLlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgoY2hhciAqKWV4cFtudW1vcHNdLlhfb3Bfc3ltYm9sKTsKLQkgICAgfQotCi0JICAvKiBjaGVjayBmb3IgaWRlbnRpZmllckB3b3JkK2NvbnN0YW50ICovCi0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnKycpCi0JICB7Ci0JICAgIGNoYXIgKm9yaWdfbGluZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgZXhwcmVzc2lvblMgbmV3X2V4cDsKLQkgICAgZXhwcmVzc2lvbiAoJm5ld19leHApOwotCSAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBuZXdfZXhwLlhfYWRkX251bWJlcjsKLQkgIH0KLQotCSAgLyogY29udmVydCBleHByIGludG8gYSByaWdodCBzaGlmdCBieSBBVF9XT1JEX1JJR0hUX1NISUZUICovCi0JICB7Ci0JICAgIGV4cHJlc3Npb25TIG5ld19leHA7Ci0JICAgIG1lbXNldCAoJm5ld19leHAsIDAsIHNpemVvZiBuZXdfZXhwKTsKLQkgICAgbmV3X2V4cC5YX2FkZF9udW1iZXIgPSBBVF9XT1JEX1JJR0hUX1NISUZUOwotCSAgICBuZXdfZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICBuZXdfZXhwLlhfdW5zaWduZWQgPSAxOwotCSAgICBleHBbbnVtb3BzXS5YX29wX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKCZuZXdfZXhwKTsKLQkgICAgZXhwW251bW9wc10uWF9vcCA9IE9fcmlnaHRfc2hpZnQ7Ci0JICB9Ci0KLQkgIGtub3cgKEFUX1dPUkRfUCAoJmV4cFtudW1vcHNdKSk7Ci0JfQotICAgICAgCi0gICAgICBpZiAoZXhwW251bW9wc10uWF9vcCA9PSBPX2lsbGVnYWwpIAotCWFzX2JhZCAoXygiaWxsZWdhbCBvcGVyYW5kIikpOwotICAgICAgZWxzZSBpZiAoZXhwW251bW9wc10uWF9vcCA9PSBPX2Fic2VudCkgCi0JYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0KLSAgICAgIG51bW9wcysrOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgc3dpdGNoIChwb3N0KSAKLSAgICB7Ci0gICAgY2FzZSAtMToJLyogcG9zdGRlY3JlbWVudCBtb2RlICovCi0gICAgICBleHBbbnVtb3BzXS5YX29wID0gT19hYnNlbnQ7Ci0gICAgICBleHBbbnVtb3BzKytdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfTUlOVVM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6CS8qIHBvc3RpbmNyZW1lbnQgbW9kZSAqLwotICAgICAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OwotICAgICAgZXhwW251bW9wcysrXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX1BMVVM7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgZXhwW251bW9wc10uWF9vcCA9IDA7Ci0gIHJldHVybiAobnVtb3BzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWQxMHZfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wX3R5cGUsIHZhbHVlLCBsZWZ0LCBmaXgpIAotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCBvcF90eXBlOwotICAgICBvZmZzZXRUIHZhbHVlOwotICAgICBpbnQgbGVmdDsKLSAgICAgZml4UyAqZml4OwotewotICBpbnQgc2hpZnQsIGJpdHM7Ci0KLSAgc2hpZnQgPSBkMTB2X29wZXJhbmRzW29wX3R5cGVdLnNoaWZ0OwotICBpZiAobGVmdCkKLSAgICBzaGlmdCArPSAxNTsKLQotICBiaXRzID0gZDEwdl9vcGVyYW5kc1tvcF90eXBlXS5iaXRzOwotCi0gIC8qIHRydW5jYXRlIHRvIHRoZSBwcm9wZXIgbnVtYmVyIG9mIGJpdHMgKi8KLSAgaWYgKGNoZWNrX3JhbmdlICh2YWx1ZSwgYml0cywgZDEwdl9vcGVyYW5kc1tvcF90eXBlXS5mbGFncykpCi0gICAgYXNfYmFkX3doZXJlIChmaXgtPmZ4X2ZpbGUsIGZpeC0+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+ZnJfbGl0ZXJhbCk7Ci0JCSAgZWxzZQotCQkgICAgdmFsdWUgPSBTX0dFVF9WQUxVRShteW9wc1tvcG51bV0uWF9hZGRfc3ltYm9sKTsKLQotCQkgIGlmIChBVF9XT1JEX1AgKCZteW9wc1tvcG51bV0pKQotCQkgICAgewotCQkgICAgICBpZiAoYml0cyA+IDQpCi0JCQl7Ci0JCQkgIGJpdHMgKz0gMjsKLQkJCSAgaWYgKCFjaGVja19yYW5nZSAodmFsdWUsIGJpdHMsIGZsYWdzKSkKLQkJCSAgICByZXR1cm4gbmV4dF9vcGNvZGU7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIWNoZWNrX3JhbmdlICh2YWx1ZSwgYml0cywgZmxhZ3MpKQotCQkgICAgcmV0dXJuIG5leHRfb3Bjb2RlOwotCQl9Ci0JICAgICAgbmV4dF9vcGNvZGUrKzsKLQkgICAgfQotCSAgYXNfZmF0YWwgKF8oInZhbHVlIG91dCBvZiByYW5nZSIpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogbm90IGEgY29uc3RhbnQsIHNvIHVzZSBhIGxvbmcgaW5zdHJ1Y3Rpb24gKi8gICAgCi0JICByZXR1cm4gb3Bjb2RlKzI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG1hdGNoID0gMDsKLSAgICAgIC8qIG5vdyBzZWFyY2ggdGhlIG9wY29kZSB0YWJsZSB0YWJsZSBmb3Igb25lIHdpdGggb3BlcmFuZHMgKi8KLSAgICAgIC8qIHRoYXQgbWF0Y2hlcyB3aGF0IHdlJ3ZlIGdvdCAqLwotICAgICAgd2hpbGUgKCFtYXRjaCkKLQl7Ci0JICBtYXRjaCA9IDE7Ci0JICBmb3IgKGkgPSAwOyBvcGNvZGUtPm9wZXJhbmRzW2ldOyBpKyspIAotCSAgICB7Ci0JICAgICAgaW50IGZsYWdzID0gZDEwdl9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKLQkgICAgICBpbnQgWF9vcCA9IG15b3BzW2ldLlhfb3A7Ci0JICAgICAgaW50IG51bSA9IG15b3BzW2ldLlhfYWRkX251bWJlcjsKLQotCSAgICAgIGlmIChYX29wID09IDApCi0JCXsKLQkJICBtYXRjaCA9IDA7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICAKLQkgICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1JFRykKLQkJewotCQkgIGlmICgoWF9vcCAhPSBPX3JlZ2lzdGVyKQotCQkgICAgICB8fCAobnVtICYgfmZsYWdzCi0JCQkgICYgKE9QRVJBTkRfR1BSIHwgT1BFUkFORF9BQ0MwIHwgT1BFUkFORF9BQ0MxCi0JCQkgICAgIHwgT1BFUkFORF9GRkxBRyB8IE9QRVJBTkRfQ0ZMQUcKLQkJCSAgICAgfCBPUEVSQU5EX0NPTlRST0wpKSkKLQkJICAgIHsKLQkJICAgICAgbWF0Y2ggPSAwOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgIAotCSAgICAgIGlmICgoKGZsYWdzICYgT1BFUkFORF9NSU5VUykgICAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gT1BFUkFORF9NSU5VUykpKSB8fAotCQkgICgoZmxhZ3MgJiBPUEVSQU5EX1BMVVMpICAgICYmICgoWF9vcCAhPSBPX2Fic2VudCkgfHwgKG51bSAhPSBPUEVSQU5EX1BMVVMpKSkgfHwKLQkJICAoKGZsYWdzICYgT1BFUkFORF9BVE1JTlVTKSAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gT1BFUkFORF9BVE1JTlVTKSkpIHx8Ci0JCSAgKChmbGFncyAmIE9QRVJBTkRfQVRQQVIpICAgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IE9QRVJBTkRfQVRQQVIpKSkgfHwKLQkJICAoKGZsYWdzICYgT1BFUkFORF9BVFNJR04pICAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gT1BFUkFORF9BVFNJR04pKSkpCi0JCXsKLQkJICBtYXRjaCA9IDA7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICAKLQkgICAgICAvKiBVbmZvcnR1bmF0bHksIGZvciB0aGUgaW5kaXJlY3Qgb3BlcmFuZCBpbiBpbnN0cnVjdGlvbnMgc3VjaCBhcwotCQkgYGBsZGIgcjEsIEAoYyxyMTQpJycgdGhpcyBmdW5jdGlvbiBjYW4gYmUgcGFzc2VkIFhfb3AgPT0gT19yZWdpc3RlcgotCQkgKGJlY2F1c2UgJ2MnIGlzIGEgdmFsaWQgcmVnaXN0ZXIgbmFtZSkuICBIb3dldmVyIHdlIGNhbm5vdCBqdXN0Ci0JCSBpZ25vcmUgdGhlIGNhc2Ugd2hlbiBYX29wID09IE9fcmVnaXN0ZXIgYnV0IGZsYWdzICYgT1BFUkFORF9SRUcgaXMKLQkJIG51bGwsIHNvIHdlIGNoZWNrIHRvIHNlZSBpZiBhIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZSByZWdpc3RlcgotCQkgZXhpc3RzLiAgSWYgdGhlIHN5bWJvbCBkb2VzIGV4aXN0LCB0aGVuIHRoZSBwYXJzZXIgd2FzIHVuYWJsZSB0bwotCQkgZGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyBhbmQgd2UgZml4IHRoaW5ncyBoZXJlLiAgKFJlZjogUFIxNDgyNikgKi8KLQkgICAgICAKLQkgICAgICBpZiAoIShmbGFncyAmIE9QRVJBTkRfUkVHKSAmJiAoWF9vcCA9PSBPX3JlZ2lzdGVyKSkKLQkJewotCQkgIHN5bWJvbFMgKiBzeW07Ci0JCSAgCi0JCSAgc3ltID0gZmluZF9zeW1ib2xfbWF0Y2hpbmdfcmVnaXN0ZXIgKCYgbXlvcHNbaV0pOwotCQkgIAotCQkgIGlmIChzeW0gIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgbXlvcHMgW2ldLlhfb3AgPT0gWF9vcCA9PSBPX3N5bWJvbDsKLQkJICAgICAgbXlvcHMgW2ldLlhfYWRkX3N5bWJvbCA9IHN5bTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBhc19iYWQKLQkJICAgICAgKF8oImlsbGVnYWwgb3BlcmFuZCAtIHJlZ2lzdGVyIG5hbWUgZm91bmQgd2hlcmUgbm9uZSBleHBlY3RlZCIpKTsKLQkJfQotCSAgICB9Ci0JICAKLQkgIC8qIFdlJ3JlIG9ubHkgZG9uZSBpZiB0aGUgb3BlcmFuZHMgbWF0Y2hlZCBzbyBmYXIgQU5EIHRoZXJlCi0JICAgICBhcmUgbm8gbW9yZSB0byBjaGVjay4gICovCi0JICBpZiAobWF0Y2ggJiYgbXlvcHNbaV0uWF9vcCA9PSAwKSAKLQkgICAgYnJlYWs7Ci0JICBlbHNlCi0JICAgIG1hdGNoID0gMDsKLQotCSAgbmV4dF9vcGNvZGUgPSBvcGNvZGUgKyAxOwotCSAgCi0JICBpZiAobmV4dF9vcGNvZGUtPm9wY29kZSA9PSAwKSAKLQkgICAgYnJlYWs7Ci0JICAKLQkgIGlmIChzdHJjbXAgKG5leHRfb3Bjb2RlLT5uYW1lLCBvcGNvZGUtPm5hbWUpKQotCSAgICBicmVhazsKLQkgIAotCSAgb3Bjb2RlID0gbmV4dF9vcGNvZGU7Ci0JfQotICAgIH0KLQotICBpZiAoIW1hdGNoKSAgCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgb3Bjb2RlIG9yIG9wZXJhbmRzIikpOwotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgdGhhdCBhbGwgcmVnaXN0ZXJzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGJlIGV2ZW4gYXJlLiAqLwotICAvKiBBbHNvLCBpZiBhbnkgb3BlcmFuZHMgd2VyZSBtYXJrZWQgYXMgcmVnaXN0ZXJzLCBidXQgd2VyZSByZWFsbHkgc3ltYm9scyAqLwotICAvKiBmaXggdGhhdCBoZXJlLiAqLwotICBmb3IgKGk9MDsgb3Bjb2RlLT5vcGVyYW5kc1tpXTsgaSsrKSAKLSAgICB7Ci0gICAgICBpZiAoKGQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3MgJiBPUEVSQU5EX0VWRU4pICYmCi0JICAobXlvcHNbaV0uWF9hZGRfbnVtYmVyICYgMSkpIAotCWFzX2ZhdGFsIChfKCJSZWdpc3RlciBudW1iZXIgbXVzdCBiZSBFVkVOIikpOwotICAgICAgaWYgKG15b3BzW2ldLlhfb3AgPT0gT19yZWdpc3RlcikKLQl7Ci0JICBpZiAoIShkMTB2X29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzICYgT1BFUkFORF9SRUcpKSAKLQkgICAgewotCSAgICAgIG15b3BzW2ldLlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBteW9wc1tpXS5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgoY2hhciAqKW15b3BzW2ldLlhfb3Bfc3ltYm9sKTsKLQkgICAgICBteW9wc1tpXS5YX2FkZF9udW1iZXIgPSAwOwotCSAgICAgIG15b3BzW2ldLlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiBvcGNvZGU7Ci19Ci0KLS8qIGlmIHdoaWxlIHByb2Nlc3NpbmcgYSBmaXh1cCwgYSByZWxvYyByZWFsbHkgbmVlZHMgdG8gYmUgY3JlYXRlZCAqLwotLyogdGhlbiBpdCBpcyBkb25lIGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VnLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWxvYzsKLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gJmZpeHAtPmZ4X2FkZHN5LT5ic3ltOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgIF8oInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IiksIChpbnQpZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9vZmZzZXQ7Ci0KLSAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLQotICByZXR1cm4gcmVsb2M7Ci19Ci0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdwLCBzZWcpCi0gICAgIGZyYWdTICpmcmFncDsKLSAgICAgYXNlY3Rpb24gKnNlZzsKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiAwOwotfSAKLQotbG9uZwotbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhwLCBzZWMpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIHNlZ1Qgc2VjOwotewotICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKilOVUxMICYmICghU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkgfHwKLSAgICAgIChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gc2VjKSkpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci19Ci0KLWludAotbWRfYXBwbHlfZml4MyAoZml4cCwgdmFsdWVwLCBzZWcpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIHZhbHVlVCAqdmFsdWVwOwotICAgICBzZWdUIHNlZzsKLXsKLSAgY2hhciAqd2hlcmU7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgbG9uZyB2YWx1ZTsKLSAgaW50IG9wX3R5cGU7Ci0gIGludCBsZWZ0PTA7Ci0KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ID09IChzeW1ib2xTICopIE5VTEwpCi0gICAgewotICAgICAgdmFsdWUgPSAqdmFsdWVwOwotICAgICAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICB2YWx1ZSA9ICp2YWx1ZXA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGZpeHAtPmZ4X29mZnNldDsKLSAgICAgIGlmIChmaXhwLT5meF9zdWJzeSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCXsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9zdWJzeSkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdlIGRvbid0IGFjdHVhbGx5IHN1cHBvcnQgc3VidHJhY3RpbmcgYSBzeW1ib2wuICAqLwotIAkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgb3BfdHlwZSA9IGZpeHAtPmZ4X3JfdHlwZTsKLSAgaWYgKG9wX3R5cGUgJiAyMDQ4KQotICAgIHsKLSAgICAgIG9wX3R5cGUgLT0gMjA0ODsKLSAgICAgIGlmIChvcF90eXBlICYgMTAyNCkKLQl7Ci0JICBvcF90eXBlIC09IDEwMjQ7Ci0JICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MOwotCSAgbGVmdCA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAob3BfdHlwZSAmIDQwOTYpCi0JewotCSAgb3BfdHlwZSAtPSA0MDk2OwotCSAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0QxMFZfMTg7Ci0JfQotICAgICAgZWxzZQotCWZpeHAtPmZ4X3JfdHlwZSA9IGdldF9yZWxvYygoc3RydWN0IGQxMHZfb3BlcmFuZCAqKSZkMTB2X29wZXJhbmRzW29wX3R5cGVdKTsgCi0gICAgfQotCi0gIC8qIEZldGNoIHRoZSBpbnN0cnVjdGlvbiwgaW5zZXJ0IHRoZSBmdWxseSByZXNvbHZlZCBvcGVyYW5kCi0gICAgIHZhbHVlLCBhbmQgc3R1ZmYgdGhlIGluc3RydWN0aW9uIGJhY2sgYWdhaW4uICAqLwotICB3aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKLSAgaW5zbiA9IGJmZF9nZXRiMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLQotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MOgotICAgIGNhc2UgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfUjoKLSAgICBjYXNlIEJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMOgotICAgIGNhc2UgQkZEX1JFTE9DX0QxMFZfMTg6Ci0gICAgICAvKiBpbnN0cnVjdGlvbiBhZGRyZXNzZXMgYXJlIGFsd2F5cyByaWdodC1zaGlmdGVkIGJ5IDIgKi8KLSAgICAgIHZhbHVlID4+PSBBVF9XT1JEX1JJR0hUX1NISUZUOwotICAgICAgaWYgKGZpeHAtPmZ4X3NpemUgPT0gMikKLQliZmRfcHV0YjE2ICgoYmZkX3ZtYSkgdmFsdWUsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKnJlcCwgKnJlcGk7Ci0KLQkgIHJlcCA9IChzdHJ1Y3QgZDEwdl9vcGNvZGUgKikgaGFzaF9maW5kIChkMTB2X2hhc2gsICJyZXAiKTsKLQkgIHJlcGkgPSAoc3RydWN0IGQxMHZfb3Bjb2RlICopIGhhc2hfZmluZCAoZDEwdl9oYXNoLCAicmVwaSIpOwotCSAgaWYgKChpbnNuICYgRk0xMSkgPT0gRk0xMQotCSAgICAgICYmIChyZXBpICE9IE5VTEwgJiYgKGluc24gJiByZXBpLT5tYXNrKSA9PSByZXBpLT5vcGNvZGUKLQkJICB8fCByZXAgIT0gTlVMTCAmJiAoaW5zbiAmIHJlcC0+bWFzaykgPT0gcmVwLT5vcGNvZGUpCi0JICAgICAgJiYgdmFsdWUgPCA0KQotCSAgICBhc19mYXRhbAotCSAgICAgIChfKCJsaW5lICVkOiByZXAgb3IgcmVwaSBtdXN0IGluY2x1ZGUgYXQgbGVhc3QgNCBpbnN0cnVjdGlvbnMiKSwKLQkgICAgICAgZml4cC0+ZnhfbGluZSk7Ci0JICBpbnNuID0gZDEwdl9pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BfdHlwZSwgKG9mZnNldFQpdmFsdWUsIGxlZnQsIGZpeHApOwotCSAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsgIAotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIGJmZF9wdXRiMTYgKChiZmRfdm1hKSB2YWx1ZSwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICBmaXhwLT5meF9kb25lID0gMDsKLSAgICAgIHJldHVybiAxOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJsaW5lICVkOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZTogMHgleCIpLGZpeHAtPmZ4X2xpbmUsZml4cC0+Znhfcl90eXBlKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBkMTB2X2NsZWFudXAoKSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGFzc2VtYmxlciBoYXMgZmluaXNoZWQgcGFyc2luZyB0aGUgaW5wdXQgCi0gICBmaWxlIG9yIGFmdGVyIGEgbGFiZWwgaXMgZGVmaW5lZC4gIEJlY2F1c2UgdGhlIEQxMFYgYXNzZW1ibGVyIHNvbWV0aW1lcyBzYXZlcyBzaG9ydCAKLSAgIGluc3RydWN0aW9ucyB0byBzZWUgaWYgaXQgY2FuIHBhY2thZ2UgdGhlbSB3aXRoIHRoZSBuZXh0IGluc3RydWN0aW9uLCB0aGVyZSBtYXkKLSAgIGJlIGEgc2hvcnQgaW5zdHJ1Y3Rpb24gdGhhdCBzdGlsbCBuZWVkcyB3cml0dGVuLiAgKi8KLWludAotZDEwdl9jbGVhbnVwICgpCi17Ci0gIHNlZ1Qgc2VnOwotICBzdWJzZWdUIHN1YnNlZzsKLQotICBpZiAocHJldl9vcGNvZGUgJiYgZXR5cGUgPT0gMCkKLSAgICB7Ci0gICAgICBzZWcgPSBub3dfc2VnOwotICAgICAgc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgICAgIGlmIChwcmV2X3NlZykKLQlzdWJzZWdfc2V0IChwcmV2X3NlZywgcHJldl9zdWJzZWcpOwotICAgICAgd3JpdGVfMV9zaG9ydCAocHJldl9vcGNvZGUsIHByZXZfaW5zbiwgZml4dXBzLT5uZXh0KTsKLSAgICAgIHN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKLSAgICAgIHByZXZfb3Bjb2RlID0gTlVMTDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi0vKiBMaWtlIG5vcm1hbCAud29yZCwgZXhjZXB0IHN1cHBvcnQgQHdvcmQgKi8KLS8qIGNsb2JiZXJzIGlucHV0X2xpbmVfcG9pbnRlciwgY2hlY2tzIGVuZC1vZi1saW5lLiAqLwotc3RhdGljIHZvaWQKLWQxMHZfZG90X3dvcmQgKG5ieXRlcykKLSAgICAgcmVnaXN0ZXIgaW50IG5ieXRlczsJLyogMT0uYnl0ZSwgMj0ud29yZCwgND0ubG9uZyAqLwotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLSAgY2hhciAqcDsKLSAgaW50IG9mZnNldDsKLQotICBpZiAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkbwotICAgIHsKLSAgICAgIGV4cHJlc3Npb24gKCZleHApOwotICAgICAgaWYgKCFzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiQHdvcmQiLCA1KSkKLQl7Ci0JICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSA1OwotCQotCSAgcCA9IGZyYWdfbW9yZSAoMik7Ci0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMiwgCi0JCSAgICAgICAmZXhwLCAwLCBCRkRfUkVMT0NfRDEwVl8xOCk7Ci0JfQotICAgICAgZWxzZQotCWVtaXRfZXhwciAoJmV4cCwgMik7Ci0gICAgfQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICcsJyk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyLS07CQkvKiBQdXQgdGVybWluYXRvciBiYWNrIGludG8gc3RyZWFtLiAqLwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0KLS8qIE1pdHN1YmlzaGkgYXNrZWQgdGhhdCB3ZSBzdXBwb3J0IHNvbWUgb2xkIHN5bnRheCB0aGF0IGFwcGFyZW50bHkgKi8KLS8qIGhhZCBpbW1lZGlhdGUgb3BlcmFuZHMgc3RhcnRpbmcgd2l0aCAnIycuICBUaGlzIGlzIGluIHNvbWUgb2YgdGhlaXIgKi8KLS8qIHNhbXBsZSBjb2RlIGJ1dCBpcyBub3QgZG9jdW1lbnRlZCAoYWx0aG91Z2ggaXQgYXBwZWFycyBpbiBzb21lICAqLwotLyogZXhhbXBsZXMgaW4gdGhlaXIgYXNzZW1ibGVyIG1hbnVhbCkuIEZvciBub3csIHdlJ2xsIHNvbHZlIHRoaXMgKi8KLS8qIGNvbXBhdGliaWxpdHkgcHJvYmxlbSBieSBzaW1wbHkgaWdub3JpbmcgYW55ICcjJyBhdCB0aGUgYmVnaW5uaW5nICovCi0vKiBvZiBhbiBvcGVyYW5kLiAqLwotCi0vKiBvcGVyYW5kcyB0aGF0IGJlZ2luIHdpdGggJyMnIHNob3VsZCBmYWxsIHRocm91Z2ggdG8gaGVyZSAqLwotLyogZnJvbSBleHByLmMgKi8KLQotdm9pZCAKLW1kX29wZXJhbmQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgICB9Ci19Ci0KLWJvb2xlYW4KLWQxMHZfZml4X2FkanVzdGFibGUgKGZpeFApCi0gICBmaXhTICpmaXhQOwotewotCi0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMKQotICAgIHJldHVybiAxOwotICAKLSAgLyogUHJldmVudCBhbGwgYWRqdXN0bWVudHMgdG8gZ2xvYmFsIHN5bWJvbHMuICovCi0gIGlmIChTX0lTX0VYVEVSTiAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotICBpZiAoU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLwotICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotZDEwdl9mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQotICAgICAgc3RydWN0IGZpeCAqZml4cDsKLXsKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1kMTB2LmggYi9nYXMvY29uZmlnL3RjLWQxMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmZmQ1Yy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWQxMHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qIHRjLWQxMHYuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtZDEwdi5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19EMTBWCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAjZXJyb3IgRDEwViBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9kMTB2Ci0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItZDEwdiIKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0KLS8qIGNhbGwgbWRfcGNyZWxfZnJvbV9zZWN0aW9uLCBub3QgbWRfcGNyZWxfZnJvbSAqLwotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24oRklYUCwgU0VDKSAgIAotCi0vKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSBESUZGX0VYUFJfT0sJCS8qIC4tZm9vIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgICAgICAgICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4KLQotaW50IGQxMHZfY2xlYW51cCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG1kX2FmdGVyX3Bhc3NfaG9vaygpCSAgICAgZDEwdl9jbGVhbnVwKCkKLSNkZWZpbmUgbWRfY2xlYW51cCgpCQkgICAgIGQxMHZfY2xlYW51cCgpCi0jZGVmaW5lIG1kX2RvX2FsaWduKGEsYixjLGQsZSkJICAgICBkMTB2X2NsZWFudXAoKQotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgZG8ge1wKLSAgZDEwdl9jbGVhbnVwKCk7IFwKLSAgU19TRVRfVkFMVUUgKHN5bSwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgZDEwdl9maXhfYWRqdXN0YWJsZShmaXhQKQotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeHApIGQxMHZfZm9yY2VfcmVsb2NhdGlvbihmaXhwKQotZXh0ZXJuIGludCBkMTB2X2ZvcmNlX3JlbG9jYXRpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtZDMwdi5jIGIvZ2FzL2NvbmZpZy90Yy1kMzB2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MDMzYmEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1kMzB2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjE4ICswLDAgQEAKLS8qIHRjLWQzMHYuYyAtLSBBc3NlbWJsZXIgY29kZSBmb3IgdGhlIE1pdHN1YmlzaGkgRDMwVgotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCi0jaW5jbHVkZSAib3Bjb2RlL2QzMHYuaCIKLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci1jb25zdCBjaGFyICptZF9zaG9ydG9wdHMgPSAiT25OY0MiOwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKLQotI2RlZmluZSBOT1BfTVVMVElQTFkgMQotI2RlZmluZSBOT1BfQUxMIDIKLXN0YXRpYyBpbnQgd2Fybl9ub3BzID0gMDsKLXN0YXRpYyBpbnQgT3B0aW1pemluZyA9IDA7Ci1zdGF0aWMgaW50IHdhcm5fcmVnaXN0ZXJfbmFtZV9jb25mbGljdHMgPSAxOwotCi0jZGVmaW5lIEZPUkNFX1NIT1JUCTEKLSNkZWZpbmUgRk9SQ0VfTE9ORwkyCi0KLS8qIEVYRUMgdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIF9leGVjX3R5cGUKLXsKLSAgRVhFQ19VTktOT1dOLAkJCS8qIG5vIG9yZGVyIHNwZWNpZmllZCAqLwotICBFWEVDX1BBUkFMTEVMLAkJLyogZG9uZSBpbiBwYXJhbGxlbCAoRk09MDApICovCi0gIEVYRUNfU0VRLAkJCS8qIHNlcXVlbnRpYWwgKEZNPTAxKSAqLwotICBFWEVDX1JFVlNFUQkJCS8qIHJldmVyc2Ugc2VxdWVudGlhbCAoRk09MTApICovCi19IGV4ZWNfdHlwZV9lbnVtOwotCi0vKiBmaXh1cHMgKi8KLSNkZWZpbmUgTUFYX0lOU05fRklYVVBTICg1KQotc3RydWN0IGQzMHZfZml4dXAKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBpbnQgb3BlcmFuZDsKLSAgaW50IHBjcmVsOwotICBpbnQgc2l6ZTsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX2ZpeHVwcwotewotICBpbnQgZmM7Ci0gIHN0cnVjdCBkMzB2X2ZpeHVwIGZpeFtNQVhfSU5TTl9GSVhVUFNdOwotICBzdHJ1Y3QgX2ZpeHVwcyAqbmV4dDsKLX0gRml4dXBzOwotCi1zdGF0aWMgRml4dXBzIEZpeFVwc1syXTsKLXN0YXRpYyBGaXh1cHMgKmZpeHVwczsKLQotLyogV2hldGhlciBjdXJyZW50IGFuZCBwcmV2aW91cyBpbnN0cnVjdGlvbiBhcmUgd29yZCBtdWx0aXBseSBpbnNucy4gICovCi1zdGF0aWMgaW50IGN1cl9tdWwzMl9wID0gMDsKLXN0YXRpYyBpbnQgcHJldl9tdWwzMl9wID0gMDsKLQotLyogIFRoZSBmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwgaXMgdHJ1ZSBpZmYgdGhlIGluc3RydWN0aW9uIGJlaW5nIGFzc2VtYmxlZAotICAgIGhhcyBiZWVuIGV4cGxpY2l0bHkgd3JpdHRlbiBhcyBhIHBhcmFsbGVsIHNob3J0LWluc3RydWN0aW9uIHBhaXIgYnkgdGhlCi0gICAgaHVtYW4gcHJvZ3JhbW1lci4gIEl0IGlzIHVzZWQgaW4gcGFyYWxsZWxfb2soKSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCi0gICAgdGhvc2UgZGFuZ2Vyb3VzIHBhcmFsbGVsaXphdGlvbnMgYXR0ZW1wdGVkIGJ5IHRoZSBodW1hbiwgd2hpY2ggYXJlIHRvIGJlCi0gICAgYWxsb3dlZCwgYW5kIHRob3NlIGF0dGVtcHRlZCBieSB0aGUgYXNzZW1ibGVyLCB3aGljaCBhcmUgbm90LiAgSXQgaXMgc2V0Ci0gICAgZnJvbSBtZF9hc3NlbWJsZSgpLiAgKi8KLXN0YXRpYyBpbnQgZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsID0gMDsgCi1zdGF0aWMgaW50IGZsYWdfeHBfc3RhdGUgPSAwOwotCi0vKiBXaGV0aGVyIGN1cnJlbnQgYW5kIHByZXZpb3VzIGxlZnQgc3ViLWluc3RydWN0aW9uIGRpc2FibGVzCi0gICBleGVjdXRpb24gb2YgcmlnaHQgc3ViLWluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyBpbnQgY3VyX2xlZnRfa2lsbHNfcmlnaHRfcCA9IDA7Ci1zdGF0aWMgaW50IHByZXZfbGVmdF9raWxsc19yaWdodF9wID0gMDsKLQotLyogVGhlIGtub3duIGN1cnJlbnQgYWxpZ25tZW50IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24uICAqLwotc3RhdGljIGludCBkMzB2X2N1cnJlbnRfYWxpZ247Ci1zdGF0aWMgc2VnVCBkMzB2X2N1cnJlbnRfYWxpZ25fc2VnOwotCi0vKiBUaGUgbGFzdCBzZWVuIGxhYmVsIGluIHRoZSBjdXJyZW50IHNlY3Rpb24uICBUaGlzIGlzIHVzZWQgdG8gYXV0by1hbGlnbgotICAgbGFiZWxzIHByZWNlZWRpbmcgaW5zdHJ1Y3Rpb25zLiAgKi8KLXN0YXRpYyBzeW1ib2xTICpkMzB2X2xhc3RfbGFiZWw7Ci0KLS8qIFR3byBub3BzICovCi0jZGVmaW5lIE5PUF9MRUZUICAgKChsb25nIGxvbmcpIE5PUCA8PCAzMikKLSNkZWZpbmUgTk9QX1JJR0hUICAoKGxvbmcgbG9uZykgTk9QKQotI2RlZmluZSBOT1AyIChGTTAwIHwgTk9QX0xFRlQgfCBOT1BfUklHSFQpCi0KLS8qIGxvY2FsIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCByZWdfbmFtZV9zZWFyY2ggUEFSQU1TICgoY2hhciAqbmFtZSkpOwotc3RhdGljIGludCByZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHByZXNzaW9uUCkpOwotc3RhdGljIGludCBjaGVja19yYW5nZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIG51bSwgaW50IGJpdHMsIGludCBmbGFncykpOwotc3RhdGljIGludCBwb3N0Zml4IFBBUkFNUyAoKGNoYXIgKnApKTsKLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgZ2V0X3JlbG9jIFBBUkFNUyAoKHN0cnVjdCBkMzB2X29wZXJhbmQgKm9wLCBpbnQgcmVsX2ZsYWcpKTsKLXN0YXRpYyBpbnQgZ2V0X29wZXJhbmRzIFBBUkFNUyAoKGV4cHJlc3Npb25TIGV4cFtdLCBpbnQgY21wX2hhY2spKTsKLXN0YXRpYyBzdHJ1Y3QgZDMwdl9mb3JtYXQgKmZpbmRfZm9ybWF0IFBBUkFNUyAoKHN0cnVjdCBkMzB2X29wY29kZSAqb3Bjb2RlLCAKLQkJCWV4cHJlc3Npb25TIG9wc1tdLGludCBmc2l6ZSwgaW50IGNtcF9oYWNrKSk7Ci1zdGF0aWMgbG9uZyBsb25nIGJ1aWxkX2luc24gUEFSQU1TICgoc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlLCBleHByZXNzaW9uUyAqb3BlcnMpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX2xvbmcgUEFSQU1TICgoc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlLCBsb25nIGxvbmcgaW5zbiwgRml4dXBzICpmeCkpOwotc3RhdGljIHZvaWQgd3JpdGVfMV9zaG9ydCBQQVJBTVMgKChzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUsIGxvbmcgbG9uZyBpbnNuLAotCQkJCSAgIEZpeHVwcyAqZngsIGludCB1c2Vfc2VxdWVudGlhbCkpOwotc3RhdGljIGludCB3cml0ZV8yX3Nob3J0IFBBUkFNUyAoKHN0cnVjdCBkMzB2X2luc24gKm9wY29kZTEsIGxvbmcgbG9uZyBpbnNuMSwgCi0JCSAgIHN0cnVjdCBkMzB2X2luc24gKm9wY29kZTIsIGxvbmcgbG9uZyBpbnNuMiwgZXhlY190eXBlX2VudW0gZXhlY190eXBlLCBGaXh1cHMgKmZ4KSk7Ci1zdGF0aWMgbG9uZyBsb25nIGRvX2Fzc2VtYmxlIFBBUkFNUyAoKGNoYXIgKnN0ciwgc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlLAotCQkJCSAgICAgIGludCBzaG9ydHAsIGludCBpc19wYXJhbGxlbCkpOwotc3RhdGljIGludCBwYXJhbGxlbF9vayBQQVJBTVMgKChzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUxLCB1bnNpZ25lZCBsb25nIGluc24xLCAKLQkJCQlzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUyLCB1bnNpZ25lZCBsb25nIGluc24yLAotCQkJCWV4ZWNfdHlwZV9lbnVtIGV4ZWNfdHlwZSkpOwotc3RhdGljIHZvaWQgZDMwdl9udW1iZXJfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqYnVmLCBsb25nIGxvbmcgdmFsdWUsIGludCBuYnl0ZXMpKTsKLXN0YXRpYyB2b2lkIGNoZWNrX3NpemUgUEFSQU1TICgobG9uZyB2YWx1ZSwgaW50IGJpdHMsIGNoYXIgKmZpbGUsIGludCBsaW5lKSk7Ci1zdGF0aWMgdm9pZCBkMzB2X2FsaWduIFBBUkFNUyAoKGludCwgY2hhciAqLCBzeW1ib2xTICopKTsKLXN0YXRpYyB2b2lkIHNfZDMwdl9hbGlnbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZDMwdl90ZXh0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19kMzB2X2RhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2QzMHZfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOyAgICAgICAKLQotCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ICJ3b3JkIiwgY29ucywgNCB9LAotICB7ICJod29yZCIsIGNvbnMsIDIgfSwKLSAgeyAiYWxpZ24iLCBzX2QzMHZfYWxpZ24sIDAgfSwKLSAgeyAidGV4dCIsIHNfZDMwdl90ZXh0LCAwIH0sCi0gIHsgImRhdGEiLCBzX2QzMHZfZGF0YSwgMCB9LAotICB7ICJzZWN0aW9uIiwgc19kMzB2X3NlY3Rpb24sIDAgfSwKLSAgeyAic2VjdGlvbi5zIiwgc19kMzB2X3NlY3Rpb24sIDAgfSwKLSAgeyAic2VjdCIsIHNfZDMwdl9zZWN0aW9uLCAwIH0sCi0gIHsgInNlY3QucyIsIHNfZDMwdl9zZWN0aW9uLCAwIH0sCi0gIHsgTlVMTCwgTlVMTCwgMCB9Ci19OwotCi0vKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqZDMwdl9oYXNoOwotCi0vKiByZWdfbmFtZV9zZWFyY2ggZG9lcyBhIGJpbmFyeSBzZWFyY2ggb2YgdGhlIHByZV9kZWZpbmVkX3JlZ2lzdGVycwotICAgYXJyYXkgdG8gc2VlIGlmICJuYW1lIiBpcyBhIHZhbGlkIHJlZ2l0ZXIgbmFtZS4gIFJldHVybnMgdGhlIHJlZ2lzdGVyCi0gICBudW1iZXIgZnJvbSB0aGUgYXJyYXkgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4gKi8KLQotc3RhdGljIGludAotcmVnX25hbWVfc2VhcmNoIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0KLSAgbG93ID0gMDsKLSAgaGlnaCA9IHJlZ19uYW1lX2NudCAoKSAtIDE7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgY21wID0gc3RyY2FzZWNtcCAobmFtZSwgcHJlX2RlZmluZWRfcmVnaXN0ZXJzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoc3ltYm9sX2ZpbmQgKG5hbWUpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAod2Fybl9yZWdpc3Rlcl9uYW1lX2NvbmZsaWN0cykKLQkJYXNfd2FybiAoXygiUmVnaXN0ZXIgbmFtZSAlcyBjb25mbGljdHMgd2l0aCBzeW1ib2wgb2YgdGhlIHNhbWUgbmFtZSIpLAotCQkJIG5hbWUpOwotCSAgICB9Ci0gIAotCSAgcmV0dXJuIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1ttaWRkbGVdLnZhbHVlOwotCX0KLSAgICB9Ci0gIHdoaWxlIChsb3cgPD0gaGlnaCk7Ci0gIAotICByZXR1cm4gLTE7Ci19Ci0KLS8qIHJlZ2lzdGVyX25hbWUoKSBjaGVja3MgdGhlIHN0cmluZyBhdCBpbnB1dF9saW5lX3BvaW50ZXIKLSAgIHRvIHNlZSBpZiBpdCBpcyBhIHZhbGlkIHJlZ2lzdGVyIG5hbWUuICAqLwotCi1zdGF0aWMgaW50Ci1yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBpbnQgcmVnX251bWJlcjsKLSAgY2hhciBjLCAqcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgCi0gIHdoaWxlICgqcCAmJiAqcCE9J1xuJyAmJiAqcCE9J1xyJyAmJiAqcCAhPScsJyAmJiAqcCE9JyAnICYmICpwIT0nKScpCi0gICAgcCsrOwotCi0gIGMgPSAqcDsKLSAgaWYgKGMpCi0gICAgKnArKyA9IDA7Ci0KLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgLyogdGVtcG9yYXJpbHkgc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgaGVyZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gKHN0cnVjdCBzeW1ib2wgKilpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChjKQotICAgICoocC0xKSA9IGM7Ci0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLWNoZWNrX3JhbmdlIChudW0sIGJpdHMsIGZsYWdzKQotICAgICB1bnNpZ25lZCBsb25nIG51bTsKLSAgICAgaW50IGJpdHM7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgbG9uZyBtaW4sIG1heDsKLSAgaW50IHJldHZhbD0wOwotCi0gIC8qIGRvbid0IGJvdGhlciBjaGVja2luZyAzMi1iaXQgdmFsdWVzICovCi0gIGlmIChiaXRzID09IDMyKQotICAgIHJldHVybiAwOwotCi0gIGlmIChmbGFncyAmIE9QRVJBTkRfU0hJRlQpCi0gICAgewotICAgICAgLyogV2Uga25vdyB0aGF0IGFsbCBzaGlmdHMgYXJlIHJpZ2h0IGJ5IHRocmVlIGJpdHMuLi4uICovCi0gICAgICAKLSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfU0lHTkVEKQotCW51bSA9ICh1bnNpZ25lZCBsb25nKSAoKCgvKnNpZ25lZCovIGxvbmcpIG51bSkgPj4gMyk7Ci0gICAgICBlbHNlCi0JbnVtID4+PSAzOwotICAgIH0KLQotICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NJR05FRCkKLSAgICB7Ci0gICAgICBtYXggPSAoMSA8PCAoYml0cyAtIDEpKS0xOyAKLSAgICAgIG1pbiA9IC0gKDEgPDwgKGJpdHMgLSAxKSk7Ci0gICAgICBpZiAoKChsb25nKW51bSA+IG1heCkgfHwgKChsb25nKW51bSA8IG1pbikpCi0JcmV0dmFsID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtYXggPSAoMSA8PCBiaXRzKSAtIDE7Ci0gICAgICBtaW4gPSAwOwotICAgICAgaWYgKChudW0gPiBtYXgpIHx8IChudW0gPCBtaW4pKQotCXJldHZhbCA9IDE7Ci0gICAgfQotICAKLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcbkQzMFYgb3B0aW9uczpcblwKLS1PICAgICAgICAgICAgICAgICAgICAgIE1ha2UgYWRqYWNlbnQgc2hvcnQgaW5zdHJ1Y3Rpb25zIHBhcmFsbGVsIGlmIHBvc3NpYmxlLlxuXAotLW4gICAgICAgICAgICAgICAgICAgICAgV2FybiBhYm91dCBhbGwgTk9QcyBpbnNlcnRlZCBieSB0aGUgYXNzZW1ibGVyLlxuXAotLU4JCQlXYXJuIGFib3V0IE5PUHMgaW5zZXJ0ZWQgYWZ0ZXIgd29yZCBtdWx0aXBsaWVzLlxuXAotLWMgICAgICAgICAgICAgICAgICAgICAgV2FybiBhYm91dCBzeW1ib2xzIHdob2VzIG5hbWVzIG1hdGNoIHJlZ2lzdGVyIG5hbWVzLlxuXAotLUMgICAgICAgICAgICAgICAgICAgICAgT3Bwb3NpdGUgb2YgLUMuICAtYyBpcyB0aGUgZGVmYXVsdC5cbiIpKTsKLX0KLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICAgIC8qIE9wdGltaXplLiBXaWxsIGF0dGVtcHQgdG8gcGFyYWxsZWxpemUgb3BlcmF0aW9ucyAqLwotICAgIGNhc2UgJ08nOgotICAgICAgT3B0aW1pemluZyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogV2FybiBhYm91dCBhbGwgTk9QUyB0aGF0IHRoZSBhc3NlbWJsZXIgaW5zZXJ0cy4gICovCi0gICAgY2FzZSAnbic6Ci0gICAgICB3YXJuX25vcHMgPSBOT1BfQUxMOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFdhcm4gYWJvdXQgdGhlIE5PUFMgdGhhdCB0aGUgYXNzZW1ibGVyIGluc2VydHMgYmVjYXVzZSBvZiB0aGUKLQkgbXVsdGlwbHkgaGF6YXJkLiAgKi8KLSAgICBjYXNlICdOJzoKLSAgICAgIHdhcm5fbm9wcyA9IE5PUF9NVUxUSVBMWTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYyc6Ci0gICAgICB3YXJuX3JlZ2lzdGVyX25hbWVfY29uZmxpY3RzID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQyc6Ci0gICAgICB3YXJuX3JlZ2lzdGVyX25hbWVfY29uZmxpY3RzID0gMDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0gIAotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgCi0gICpzaXplUCA9IHByZWMgKiAyOwotICAKLSAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gMjsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gIGJmZCAqYWJmZDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgZnJhZ1MgKmZyYWdQOwotewotICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIHN0cnVjdCBkMzB2X29wY29kZSAqIG9wY29kZTsKLSAgZDMwdl9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgLyogSW5zZXJ0IG9wY29kZSBuYW1lcyBpbnRvIGEgaGFzaCB0YWJsZS4gKi8KLSAgZm9yIChvcGNvZGUgPSAoc3RydWN0IGQzMHZfb3Bjb2RlICopZDMwdl9vcGNvZGVfdGFibGU7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCi0gICAgICBoYXNoX2luc2VydCAoZDMwdl9oYXNoLCBvcGNvZGUtPm5hbWUsIChjaGFyICopIG9wY29kZSk7Ci0KLSAgZml4dXBzID0gJkZpeFVwc1swXTsKLSAgRml4VXBzWzBdLm5leHQgPSAmRml4VXBzWzFdOwotICBGaXhVcHNbMV0ubmV4dCA9ICZGaXhVcHNbMF07Ci0KLSAgZDMwdl9jdXJyZW50X2FsaWduX3NlZyA9IG5vd19zZWc7Ci19Ci0KLQotLyogdGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZSBwb3N0aW5jcmVtZW50IG9yIHBvc3RkZWNyZW1lbnQKLSAgIG9wZXJhdG9yICggJysnIG9yICctJyApIGZyb20gYW4gZXhwcmVzc2lvbiAqLwotCi1zdGF0aWMgaW50IHBvc3RmaXggKHApIAotICAgICBjaGFyICpwOwotewotICB3aGlsZSAoKnAgIT0gJy0nICYmICpwICE9ICcrJykgCi0gICAgewotICAgICAgaWYgKCpwPT0wIHx8ICpwPT0nXG4nIHx8ICpwPT0nXHInIHx8ICpwPT0nICcgfHwgKnA9PScsJykgCi0JYnJlYWs7Ci0gICAgICBwKys7Ci0gICAgfQotCi0gIGlmICgqcCA9PSAnLScpIAotICAgIHsKLSAgICAgICpwID0gJyAnOwotICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfQotICBpZiAoKnAgPT0gJysnKSAKLSAgICB7Ci0gICAgICAqcCA9ICcgJzsKLSAgICAgIHJldHVybiAoMSk7Ci0gICAgfQotCi0gIHJldHVybiAoMCk7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAKLWdldF9yZWxvYyAob3AsIHJlbF9mbGFnKSAKLSAgICAgc3RydWN0IGQzMHZfb3BlcmFuZCAqb3A7Ci0gICAgIGludCByZWxfZmxhZzsKLXsKLSAgc3dpdGNoIChvcC0+Yml0cykKLSAgICB7Ci0gICAgY2FzZSA2OgotICAgICAgaWYgKG9wLT5mbGFncyAmIE9QRVJBTkRfU0hJRlQpCi0JcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzlfUENSRUw7Ci0gICAgICBlbHNlCi0JcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEyOgotICAgICAgaWYgKCEob3AtPmZsYWdzICYgT1BFUkFORF9TSElGVCkpCi0JYXNfd2FybiAoXygidW5leHBlY3RlZCAxMi1iaXQgcmVsb2MgdHlwZSIpKTsKLSAgICAgIGlmIChyZWxfZmxhZyA9PSBSRUxPQ19QQ1JFTCkKLQlyZXR1cm4gQkZEX1JFTE9DX0QzMFZfMTVfUENSRUw7Ci0gICAgICBlbHNlCi0JcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzE1OwotICAgIGNhc2UgMTg6Ci0gICAgICBpZiAoIShvcC0+ZmxhZ3MgJiBPUEVSQU5EX1NISUZUKSkKLQlhc193YXJuIChfKCJ1bmV4cGVjdGVkIDE4LWJpdCByZWxvYyB0eXBlIikpOwotICAgICAgaWYgKHJlbF9mbGFnID09IFJFTE9DX1BDUkVMKQotCXJldHVybiBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gQkZEX1JFTE9DX0QzMFZfMjE7Ci0gICAgY2FzZSAzMjoKLSAgICAgIGlmIChyZWxfZmxhZyA9PSBSRUxPQ19QQ1JFTCkKLQlyZXR1cm4gQkZEX1JFTE9DX0QzMFZfMzJfUENSRUw7Ci0gICAgICBlbHNlCi0JcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzMyOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qIGdldF9vcGVyYW5kcyBwYXJzZXMgYSBzdHJpbmcgb2Ygb3BlcmFuZHMgYW5kIHJldHVybnMKLSAgIGFuIGFycmF5IG9mIGV4cHJlc3Npb25zICovCi0KLXN0YXRpYyBpbnQKLWdldF9vcGVyYW5kcyAoZXhwLCBjbXBfaGFjaykgCi0gICAgIGV4cHJlc3Npb25TIGV4cFtdOwotICAgICBpbnQgY21wX2hhY2s7Ci17Ci0gIGNoYXIgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGludCBudW1vcHMgPSAwOwotICBpbnQgcG9zdCA9IDA7Ci0KLSAgaWYgKGNtcF9oYWNrKQotICAgIHsKLSAgICAgIGV4cFtudW1vcHNdLlhfb3AgPSBPX2Fic2VudDsKLSAgICAgIGV4cFtudW1vcHMrK10uWF9hZGRfbnVtYmVyID0gY21wX2hhY2sgLSAxOwotICAgIH0KLQotICB3aGlsZSAoKnApICAKLSAgICB7Ci0gICAgICB3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJywnKSAKLQlwKys7Ci0gICAgICBpZiAoKnA9PTAgfHwgKnA9PSdcbicgfHwgKnA9PSdccicpIAotCWJyZWFrOwotICAgICAgCi0gICAgICBpZiAoKnAgPT0gJ0AnKSAKLQl7Ci0JICBwKys7Ci0JICBleHBbbnVtb3BzXS5YX29wID0gT19hYnNlbnQ7Ci0JICBpZiAoKnAgPT0gJygnKSAKLQkgICAgewotCSAgICAgIHArKzsKLQkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX0FUUEFSOwotCSAgICAgIHBvc3QgPSBwb3N0Zml4IChwKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnAgPT0gJy0nKSAKLQkgICAgewotCSAgICAgIHArKzsKLQkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX0FUTUlOVVM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4cFtudW1vcHNdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfQVRTSUdOOwotCSAgICAgIHBvc3QgPSBwb3N0Zml4IChwKTsKLQkgICAgfQotCSAgbnVtb3BzKys7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICgqcCA9PSAnKScpIAotCXsKLQkgIC8qIGp1c3Qgc2tpcCB0aGUgdHJhaWxpbmcgcGFyZW4gKi8KLQkgIHArKzsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKLQotICAgICAgLyogY2hlY2sgdG8gc2VlIGlmIGl0IG1pZ2h0IGJlIGEgcmVnaXN0ZXIgbmFtZSAqLwotICAgICAgaWYgKCFyZWdpc3Rlcl9uYW1lICgmZXhwW251bW9wc10pKQotCXsKLQkgIC8qIHBhcnNlIGFzIGFuIGV4cHJlc3Npb24gKi8KLQkgIGV4cHJlc3Npb24gKCZleHBbbnVtb3BzXSk7Ci0JfQotCi0gICAgICBpZiAoZXhwW251bW9wc10uWF9vcCA9PSBPX2lsbGVnYWwpIAotCWFzX2JhZCAoXygiaWxsZWdhbCBvcGVyYW5kIikpOwotICAgICAgZWxzZSBpZiAoZXhwW251bW9wc10uWF9vcCA9PSBPX2Fic2VudCkgCi0JYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0KLSAgICAgIG51bW9wcysrOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAgICAgc3dpdGNoIChwb3N0KSAKLQl7Ci0JY2FzZSAtMToJLyogcG9zdGRlY3JlbWVudCBtb2RlICovCi0JICBleHBbbnVtb3BzXS5YX29wID0gT19hYnNlbnQ7Ci0JICBleHBbbnVtb3BzKytdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfTUlOVVM7Ci0JICBicmVhazsKLQljYXNlIDE6CS8qIHBvc3RpbmNyZW1lbnQgbW9kZSAqLwotCSAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OwotCSAgZXhwW251bW9wcysrXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX1BMVVM7Ci0JICBicmVhazsKLQl9Ci0gICAgICBwb3N0ID0gMDsKLSAgICB9Ci0KLSAgZXhwW251bW9wc10uWF9vcCA9IDA7Ci0gIHJldHVybiAobnVtb3BzKTsKLX0KLQotLyogYnVpbGRfaW5zbiBnZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9uLiAgSXQgZG9lcyBldmVyeXRoaW5nICovCi0vKiBidXQgd3JpdGUgdGhlIEZNIGJpdHMuICovCi0KLXN0YXRpYyBsb25nIGxvbmcKLWJ1aWxkX2luc24gKG9wY29kZSwgb3BlcnMpIAotICAgICBzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGU7Ci0gICAgIGV4cHJlc3Npb25TICpvcGVyczsKLXsKLSAgaW50IGksIGxlbmd0aCwgYml0cywgc2hpZnQsIGZsYWdzOwotICB1bnNpZ25lZCBpbnQgbnVtYmVyLCBpZD0wOwotICBsb25nIGxvbmcgaW5zbjsKLSAgc3RydWN0IGQzMHZfb3Bjb2RlICpvcCA9IG9wY29kZS0+b3A7Ci0gIHN0cnVjdCBkMzB2X2Zvcm1hdCAqZm9ybSA9IG9wY29kZS0+Zm9ybTsKLQotICBpbnNuID0gb3Bjb2RlLT5lY2MgPDwgMjggfCBvcC0+b3AxIDw8IDI1IHwgb3AtPm9wMiA8PCAyMCB8IGZvcm0tPm1vZGlmaWVyIDw8IDE4OwotCi0gIGZvciAoaT0wOyBmb3JtLT5vcGVyYW5kc1tpXTsgaSsrKSAKLSAgICB7IAotICAgICAgZmxhZ3MgPSBkMzB2X29wZXJhbmRfdGFibGVbZm9ybS0+b3BlcmFuZHNbaV1dLmZsYWdzOwotCi0gICAgICAvKiBtdXN0IGJlIGEgcmVnaXN0ZXIgb3IgbnVtYmVyICovCi0gICAgICBpZiAoIShmbGFncyAmIE9QRVJBTkRfUkVHKSAmJiAhKGZsYWdzICYgT1BFUkFORF9OVU0pICYmIAotCSAgIShmbGFncyAmIE9QRVJBTkRfTkFNRSkgJiYgIShmbGFncyAmIE9QRVJBTkRfU1BFQ0lBTCkpCi0JY29udGludWU7Ci0KLSAgICAgIGJpdHMgPSBkMzB2X29wZXJhbmRfdGFibGVbZm9ybS0+b3BlcmFuZHNbaV1dLmJpdHM7Ci0gICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotCWJpdHMgKz0gMzsKLQotICAgICAgbGVuZ3RoID0gZDMwdl9vcGVyYW5kX3RhYmxlW2Zvcm0tPm9wZXJhbmRzW2ldXS5sZW5ndGg7Ci0gICAgICBzaGlmdCA9IDEyIC0gZDMwdl9vcGVyYW5kX3RhYmxlW2Zvcm0tPm9wZXJhbmRzW2ldXS5wb3NpdGlvbjsKLSAgICAgIGlmIChvcGVyc1tpXS5YX29wICE9IE9fc3ltYm9sKQotCW51bWJlciA9IG9wZXJzW2ldLlhfYWRkX251bWJlcjsKLSAgICAgIGVsc2UKLQludW1iZXIgPSAwOwotICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF9SRUcpCi0JewotCSAgLyogY2hlY2sgZm9yIG12ZnN5cyBvciBtdnRzeXMgY29udHJvbCByZWdpc3RlcnMgKi8KLQkgIGlmIChmbGFncyAmIE9QRVJBTkRfQ09OVFJPTCAmJiAobnVtYmVyICYgMHg3ZikgPiBNQVhfQ09OVFJPTF9SRUcpCi0JICAgIHsKLQkgICAgICAvKiBQU1dMIG9yIFBTV0ggKi8KLQkgICAgICBpZCA9IChudW1iZXIgJiAweDdmKSAtIE1BWF9DT05UUk9MX1JFRzsKLQkgICAgICBudW1iZXIgPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChudW1iZXIgJiBPUEVSQU5EX0ZMQUcpCi0JICAgIHsKLQkgICAgICBpZCA9IDM7ICAvKiBudW1iZXIgaXMgYSBmbGFnIHJlZ2lzdGVyICovCi0JICAgIH0KLQkgIG51bWJlciAmPSAweDdGOwotCX0KLSAgICAgIGVsc2UgaWYgKGZsYWdzICYgT1BFUkFORF9TUEVDSUFMKQotCXsKLQkgIG51bWJlciA9IGlkOwotCX0KLQotICAgICAgaWYgKG9wZXJzW2ldLlhfb3AgIT0gT19yZWdpc3RlciAmJiBvcGVyc1tpXS5YX29wICE9IE9fY29uc3RhbnQgJiYgIShmbGFncyAmIE9QRVJBTkRfTkFNRSkpCi0JewotCSAgLyogbm93IGNyZWF0ZSBhIGZpeHVwICovCi0KLQkgIGlmIChmaXh1cHMtPmZjID49IE1BWF9JTlNOX0ZJWFVQUykKLQkgICAgYXNfZmF0YWwgKF8oInRvbyBtYW55IGZpeHVwcyIpKTsKLQotCSAgZml4dXBzLT5maXhbZml4dXBzLT5mY10ucmVsb2MgPSAKLQkgICAgZ2V0X3JlbG9jICgoc3RydWN0IGQzMHZfb3BlcmFuZCAqKSZkMzB2X29wZXJhbmRfdGFibGVbZm9ybS0+b3BlcmFuZHNbaV1dLCBvcC0+cmVsb2NfZmxhZyk7Ci0JICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5zaXplID0gNDsKLQkgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLmV4cCA9IG9wZXJzW2ldOwotCSAgZml4dXBzLT5maXhbZml4dXBzLT5mY10ub3BlcmFuZCA9IGZvcm0tPm9wZXJhbmRzW2ldOwotCSAgaWYgKGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnJlbG9jID09IEJGRF9SRUxPQ19EMzBWXzlfUENSRUwpCi0JICAgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnBjcmVsID0gUkVMT0NfUENSRUw7Ci0JICBlbHNlCi0JICAgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnBjcmVsID0gb3AtPnJlbG9jX2ZsYWc7Ci0JICAoZml4dXBzLT5mYykrKzsKLQl9Ci0KLSAgICAgIC8qIHRydW5jYXRlIHRvIHRoZSBwcm9wZXIgbnVtYmVyIG9mIGJpdHMgKi8KLSAgICAgIGlmICgob3BlcnNbaV0uWF9vcCA9PSBPX2NvbnN0YW50KSAmJiBjaGVja19yYW5nZSAobnVtYmVyLCBiaXRzLCBmbGFncykpCi0JYXNfYmFkIChfKCJvcGVyYW5kIG91dCBvZiByYW5nZTogJWQiKSxudW1iZXIpOwotICAgICAgaWYgKGJpdHMgPCAzMSkKLQludW1iZXIgJj0gMHg3RkZGRkZGRiA+PiAoMzEgLSBiaXRzKTsKLSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfU0hJRlQpCi0JbnVtYmVyID4+PSAzOwotICAgICAgaWYgKGJpdHMgPT0gMzIpCi0JewotCSAgLyogaXQncyBhIExPTkcgaW5zdHJ1Y3Rpb24gKi8KLQkgIGluc24gfD0gKG51bWJlciA+PiAyNik7CS8qIHRvcCA2IGJpdHMgKi8KLQkgIGluc24gPDw9IDMyOwkJCS8qIHNoaWZ0IHRoZSBmaXJzdCB3b3JkIG92ZXIgKi8KLQkgIGluc24gfD0gKChudW1iZXIgJiAweDAzRkMwMDAwKSA8PCAyKTsgIC8qIG5leHQgOCBiaXRzICovIAotCSAgaW5zbiB8PSBudW1iZXIgJiAweDAwMDNGRkZGOwkJLyogYm90dG9tIDE4IGJpdHMgKi8KLQl9Ci0gICAgICBlbHNlCi0JaW5zbiB8PSBudW1iZXIgPDwgc2hpZnQ7Ci0gICAgfQotICByZXR1cm4gaW5zbjsKLX0KLQotCi0vKiB3cml0ZSBvdXQgYSBsb25nIGZvcm0gaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyB2b2lkCi13cml0ZV9sb25nIChvcGNvZGUsIGluc24sIGZ4KSAKLSAgICAgc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlOwotICAgICBsb25nIGxvbmcgaW5zbjsKLSAgICAgRml4dXBzICpmeDsKLXsKLSAgaW50IGksIHdoZXJlOwotICBjaGFyICpmID0gZnJhZ19tb3JlICg4KTsKLQotICBpbnNuIHw9IEZNMTE7Ci0gIGQzMHZfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCA4KTsKLQotICBmb3IgKGk9MDsgaSA8IGZ4LT5mYzsgaSsrKSAKLSAgICB7Ci0gICAgICBpZiAoZngtPmZpeFtpXS5yZWxvYykKLQl7IAotCSAgd2hlcmUgPSBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWw7IAotCSAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICAgICAgd2hlcmUsCi0JCSAgICAgICBmeC0+Zml4W2ldLnNpemUsCi0JCSAgICAgICAmKGZ4LT5maXhbaV0uZXhwKSwKLQkJICAgICAgIGZ4LT5maXhbaV0ucGNyZWwsCi0JCSAgICAgICBmeC0+Zml4W2ldLnJlbG9jKTsKLQl9Ci0gICAgfQotICBmeC0+ZmMgPSAwOwotfQotCi0KLS8qIFdyaXRlIG91dCBhIHNob3J0IGZvcm0gaW5zdHJ1Y3Rpb24gYnkgaXRzZWxmLiAgKi8KLXN0YXRpYyB2b2lkCi13cml0ZV8xX3Nob3J0IChvcGNvZGUsIGluc24sIGZ4LCB1c2Vfc2VxdWVudGlhbCkgCi0gICAgIHN0cnVjdCBkMzB2X2luc24gKm9wY29kZTsKLSAgICAgbG9uZyBsb25nIGluc247Ci0gICAgIEZpeHVwcyAqZng7Ci0gICAgIGludCB1c2Vfc2VxdWVudGlhbDsKLXsKLSAgY2hhciAqZiA9IGZyYWdfbW9yZSAoOCk7Ci0gIGludCBpLCB3aGVyZTsKLQotICBpZiAod2Fybl9ub3BzID09IE5PUF9BTEwpCi0gICAgYXNfd2FybiAoXygiJXMgTk9QIGluc2VydGVkIiksIHVzZV9zZXF1ZW50aWFsID8KLQkgICAgIF8oInNlcXVlbnRpYWwiKSA6IF8oInBhcmFsbGVsIikpOwotCi0gIC8qIFRoZSBvdGhlciBjb250YWluZXIgbmVlZHMgdG8gYmUgTk9QLiAqLwotICBpZiAodXNlX3NlcXVlbnRpYWwpCi0gICAgewotICAgICAgLyogVXNlIGEgc2VxdWVudGlhbCBOT1AgcmF0aGVyIHRoYW4gYSBwYXJhbGxlbCBvbmUsCi0JIGFzIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIGlzIGEgRkxBR19NVUwzMiB0eXBlIG9uZQotCSBhbmQgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgYSBsb2FkLiAgKi8KLSAgICAgIAotICAgICAgLyogQWNjb3JkaW5nIHRvIDQuMy4xOiBmb3IgRk09MDEsIHN1Yi1pbnN0cnVjdGlvbnMgcGVyZm9ybWVkCi0JIG9ubHkgYnkgSVUgY2Fubm90IGJlIGVuY29kZWQgaW4gTC1jb250YWluZXIuICovCi0gICAgICAKLSAgICAgIGlmIChvcGNvZGUtPm9wLT51bml0ID09IElVKQotCWluc24gfD0gRk0xMCB8IE5PUF9MRUZUOwkvKiByaWdodCB0aGVuIGxlZnQgKi8KLSAgICAgIGVsc2UKLQlpbnNuID0gRk0wMSB8IChpbnNuIDw8IDMyKSB8IE5PUF9SSUdIVDsJLyogbGVmdCB0aGVuIHJpZ2h0ICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQWNjb3JkaW5nIHRvIDQuMy4xOiBmb3IgRk09MDAsIHN1Yi1pbnN0cnVjdGlvbnMgcGVyZm9ybWVkCi0JIG9ubHkgYnkgSVUgY2Fubm90IGJlIGVuY29kZWQgaW4gTC1jb250YWluZXIuICovCi0gICAgICAKLSAgICAgIGlmIChvcGNvZGUtPm9wLT51bml0ID09IElVKQotCWluc24gfD0gRk0wMCB8IE5PUF9MRUZUOwkJLyogcmlnaHQgY29udGFpbmVyICovCi0gICAgICBlbHNlCi0JaW5zbiA9IEZNMDAgfCAoaW5zbiA8PCAzMikgfCBOT1BfUklHSFQ7CS8qIGxlZnQgY29udGFpbmVyICovCi0gICAgfQotCi0gIGQzMHZfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCA4KTsKLQotICBmb3IgKGk9MDsgaSA8IGZ4LT5mYzsgaSsrKSAKLSAgICB7Ci0gICAgICBpZiAoZngtPmZpeFtpXS5yZWxvYykKLQl7IAotCSAgd2hlcmUgPSBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWw7IAotCSAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICAgICAgd2hlcmUsIAotCQkgICAgICAgZngtPmZpeFtpXS5zaXplLAotCQkgICAgICAgJihmeC0+Zml4W2ldLmV4cCksCi0JCSAgICAgICBmeC0+Zml4W2ldLnBjcmVsLAotCQkgICAgICAgZngtPmZpeFtpXS5yZWxvYyk7Ci0JfQotICAgIH0KLSAgZngtPmZjID0gMDsKLX0KLQotLyogV3JpdGUgb3V0IGEgc2hvcnQgZm9ybSBpbnN0cnVjdGlvbiBpZiBwb3NzaWJsZS4KLSAgIFJldHVybiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIG5vdCB3cml0dGVuIG91dC4gICovCi1zdGF0aWMgaW50Ci13cml0ZV8yX3Nob3J0IChvcGNvZGUxLCBpbnNuMSwgb3Bjb2RlMiwgaW5zbjIsIGV4ZWNfdHlwZSwgZngpIAotICAgICBzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUxLCAqb3Bjb2RlMjsKLSAgICAgbG9uZyBsb25nIGluc24xLCBpbnNuMjsKLSAgICAgZXhlY190eXBlX2VudW0gZXhlY190eXBlOwotICAgICBGaXh1cHMgKmZ4OwotewotICBsb25nIGxvbmcgaW5zbiA9IE5PUDI7Ci0gIGNoYXIgKmY7Ci0gIGludCBpLGosIHdoZXJlOwotCi0gIGlmIChleGVjX3R5cGUgPT0gRVhFQ19TRVEKLSAgICAgICYmIChvcGNvZGUxLT5vcC0+ZmxhZ3NfdXNlZCAmIChGTEFHX0pNUCB8IEZMQUdfSlNSKSkKLSAgICAgICYmICgob3Bjb2RlMS0+b3AtPmZsYWdzX3VzZWQgJiBGTEFHX0RFTEFZKSA9PSAwKQotICAgICAgJiYgKChvcGNvZGUxLT5lY2MgPT0gRUNDX0FMKSB8fCAhIE9wdGltaXppbmcpKQotICAgIHsKLSAgICAgIC8qIFVuY29uZGl0aW9uYWwsIG5vbi1kZWxheWVkIGJyYW5jaGVzIGtpbGwgaW5zdHJ1Y3Rpb25zIGluCi0JIHRoZSByaWdodCBiaW4uICBDb25kaXRpb25hbCBicmFuY2hlcyBkb24ndCBhbHdheXMgYnV0IGlmCi0JIHdlIGFyZSBub3Qgb3B0aW1pemluZywgdGhlbiB3ZSBoYXZlIGJlZW4gYXNrZWQgdG8gcHJvZHVjZQotCSBhbiBlcnJvciBhYm91dCBzdWNoIGNvbnN0cnVjdHMuICBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMKLQkgdGVzdCwgc3Vicm91dGluZSBjYWxscyBhcmUgY29uc2lkZXJlZCB0byBiZSBicmFuY2hlcy4gICovCi0gICAgICB3cml0ZV8xX3Nob3J0IChvcGNvZGUxLCBpbnNuMSwgZngtPm5leHQsIGZhbHNlKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgCi0gIC8qIE5vdGU6IHdlIGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHN1YnJvdXRpbmUgY2FsbHMgb2NjdXJpbmcKLSAgICAgaW4gdGhlIHJpZ2h0IGhhbmQgY29udGFpbmVyLiAgVGhlIHJldHVybiBhZGRyZXNzIGlzIGFsd2F5cwotICAgICBhbGlnbmVkIHRvIHRoZSBuZXh0IDY0IGJpdCBib3VuZGFyeSwgYmUgdGhhdCA2NCBvciAzMiBiaXQgYXdheS4gICovCi0gIAotICBzd2l0Y2ggKGV4ZWNfdHlwZSkgCi0gICAgewotICAgIGNhc2UgRVhFQ19VTktOT1dOOgkvKiBPcmRlciBub3Qgc3BlY2lmaWVkLiAqLwotICAgICAgaWYgKE9wdGltaXppbmcKLQkgICYmIHBhcmFsbGVsX29rIChvcGNvZGUxLCBpbnNuMSwgb3Bjb2RlMiwgaW5zbjIsIGV4ZWNfdHlwZSkKLQkgICYmICEgKCAgIChvcGNvZGUxLT5vcC0+dW5pdCA9PSBFSVRIRVJfQlVUX1BSRUZFUl9NVQotCQkgfHwgb3Bjb2RlMS0+b3AtPnVuaXQgPT0gTVUpCi0JCSYmCi0JCSggICBvcGNvZGUyLT5vcC0+dW5pdCA9PSBFSVRIRVJfQlVUX1BSRUZFUl9NVQotCQkgfHwgb3Bjb2RlMi0+b3AtPnVuaXQgPT0gTVUpKSkKLQl7Ci0JICAvKiBwYXJhbGxlbCAqLwotCSAgZXhlY190eXBlID0gRVhFQ19QQVJBTExFTDsKLQkgIAotCSAgaWYgKG9wY29kZTEtPm9wLT51bml0ID09IElVCi0JICAgICAgfHwgb3Bjb2RlMi0+b3AtPnVuaXQgPT0gTVUKLQkgICAgICB8fCBvcGNvZGUyLT5vcC0+dW5pdCA9PSBFSVRIRVJfQlVUX1BSRUZFUl9NVSkKLQkgICAgaW5zbiA9IEZNMDAgfCAoaW5zbjIgPDwgMzIpIHwgaW5zbjE7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnNuID0gRk0wMCB8IChpbnNuMSA8PCAzMikgfCBpbnNuMjsgIAotCSAgICAgIGZ4ID0gZngtPm5leHQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUxLT5vcC0+ZmxhZ3NfdXNlZCAmIChGTEFHX0pNUCB8IEZMQUdfSlNSKQotCSAgICAgICAmJiAoKG9wY29kZTEtPm9wLT5mbGFnc191c2VkICYgRkxBR19ERUxBWSkgPT0gMCkKLQkgICAgICAgJiYgKChvcGNvZGUxLT5lY2MgPT0gRUNDX0FMKSB8fCAhIE9wdGltaXppbmcpKQotCXsKLQkgIC8qIFdlIG11c3QgZW1pdCAobm9uLWRlbGF5ZWQpIGJyYW5jaCB0eXBlIGluc3RydWN0aW9ucwotCSAgICAgb24gdGhlaXIgb3duIHdpdGggbm90aGluZyBpbiB0aGUgcmlnaHQgY29udGFpbmVyLiAgKi8KLQkgIHdyaXRlXzFfc2hvcnQgKG9wY29kZTEsIGluc24xLCBmeC0+bmV4dCwgZmFsc2UpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgZWxzZSBpZiAocHJldl9sZWZ0X2tpbGxzX3JpZ2h0X3ApCi0JewotCSAgLyogVGhlIGxlZnQgaW5zdHJ1Y3Rpb24ga2lscyB0aGUgcmlnaHQgc2xvdCwgc28gd2UKLQkgICAgIG11c3QgbGVhdmUgaXQgZW1wdHkuICAqLwotCSAgd3JpdGVfMV9zaG9ydCAob3Bjb2RlMSwgaW5zbjEsIGZ4LT5uZXh0LCBmYWxzZSk7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUxLT5vcC0+dW5pdCA9PSBJVQotCSAgICAgICB8fCAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gRUlUSEVSCi0JCSAgICYmIG9wY29kZTItPm9wLT51bml0ID09IEVJVEhFUl9CVVRfUFJFRkVSX01VKSkKLQl7Ci0JICAvKiByZXZlcnNlIHNlcXVlbnRpYWwgKi8KLQkgIGluc24gPSBGTTEwIHwgKGluc24yIDw8IDMyKSB8IGluc24xOwotCSAgZXhlY190eXBlID0gRVhFQ19SRVZTRVE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHNlcXVlbnRpYWwgKi8KLQkgIGluc24gPSBGTTAxIHwgKGluc24xIDw8IDMyKSB8IGluc24yOwotCSAgZnggPSBmeC0+bmV4dDsKLQkgIGV4ZWNfdHlwZSA9IEVYRUNfU0VROwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFWEVDX1BBUkFMTEVMOgkvKiBwYXJhbGxlbCAqLwotICAgICAgZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsID0gZmxhZ194cF9zdGF0ZTsKLSAgICAgIGlmICghIHBhcmFsbGVsX29rIChvcGNvZGUxLCBpbnNuMSwgb3Bjb2RlMiwgaW5zbjIsIGV4ZWNfdHlwZSkpCi0JYXNfYmFkIChfKCJJbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIpKTsKLSAgICAgIGVsc2UgaWYgKG9wY29kZTEtPm9wLT51bml0ID09IElVKQotCXsKLQkgIGlmIChvcGNvZGUyLT5vcC0+dW5pdCA9PSBJVSkKLQkgICAgYXNfYmFkIChfKCJUd28gSVUgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiKSk7Ci0JICBhc193YXJuIChfKCJTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlciIpKTsKLSAJICBpbnNuID0gRk0wMCB8IChpbnNuMiA8PCAzMikgfCBpbnNuMTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUyLT5vcC0+dW5pdCA9PSBNVSkKLQl7Ci0JICBpZiAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gTVUpCi0JICAgIGFzX2JhZCAoXygiVHdvIE1VIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIikpOwotCSAgZWxzZSBpZiAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUpCi0JICAgIGFzX3dhcm4gKF8oIkV4ZWN1dGluZyAlcyBpbiBJVSBtYXkgbm90IHdvcmsiKSwgb3Bjb2RlMS0+b3AtPm5hbWUpOwotCSAgYXNfd2FybiAoXygiU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIiKSk7Ci0JICBpbnNuID0gRk0wMCB8IChpbnNuMiA8PCAzMikgfCBpbnNuMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG9wY29kZTItPm9wLT51bml0ID09IEVJVEhFUl9CVVRfUFJFRkVSX01VKQotCSAgICBhc193YXJuIChfKCJFeGVjdXRpbmcgJXMgaW4gSVUgbWF5IG5vdCB3b3JrIiksIG9wY29kZTItPm9wLT5uYW1lKTsKLQkgIAotCSAgaW5zbiA9IEZNMDAgfCAoaW5zbjEgPDwgMzIpIHwgaW5zbjI7ICAKLQkgIGZ4ID0gZngtPm5leHQ7Ci0JfQotICAgICAgZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFWEVDX1NFUToJLyogc2VxdWVudGlhbCAqLwotICAgICAgaWYgKG9wY29kZTEtPm9wLT51bml0ID09IElVKQotCWFzX2JhZCAoXygiSVUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBpbiB0aGUgbGVmdCBjb250YWluZXIiKSk7Ci0gICAgICBpZiAocHJldl9sZWZ0X2tpbGxzX3JpZ2h0X3ApCi0JYXNfYmFkIChfKCJzcGVjaWFsIGxlZnQgaW5zdHJ1Y3Rpb24gYCVzJyBraWxscyBpbnN0cnVjdGlvbiAiCi0JCSAgICJgJXMnIGluIHJpZ2h0IGNvbnRhaW5lciIpLAotCQkgb3Bjb2RlMS0+b3AtPm5hbWUsIG9wY29kZTItPm9wLT5uYW1lKTsKLSAgICAgIGlmIChvcGNvZGUyLT5vcC0+dW5pdCA9PSBFSVRIRVJfQlVUX1BSRUZFUl9NVSkKLQlhc193YXJuIChfKCJFeGVjdXRpbmcgJXMgaW4gSVUgbWF5IG5vdCB3b3JrIiksIG9wY29kZTItPm9wLT5uYW1lKTsKLSAgICAgIGluc24gPSBGTTAxIHwgKGluc24xIDw8IDMyKSB8IGluc24yOyAgCi0gICAgICBmeCA9IGZ4LT5uZXh0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVYRUNfUkVWU0VROgkvKiByZXZlcnNlIHNlcXVlbnRpYWwgKi8KLSAgICAgIGlmIChvcGNvZGUyLT5vcC0+dW5pdCA9PSBNVSkKLQlhc19iYWQgKF8oIk1VIGluc3RydWN0aW9uIG1heSBub3QgYmUgaW4gdGhlIHJpZ2h0IGNvbnRhaW5lciIpKTsKLSAgICAgIGlmIChvcGNvZGUyLT5vcC0+dW5pdCA9PSBFSVRIRVJfQlVUX1BSRUZFUl9NVSkKLQlhc193YXJuIChfKCJFeGVjdXRpbmcgJXMgaW4gSVUgbWF5IG5vdCB3b3JrIiksIG9wY29kZTItPm9wLT5uYW1lKTsKLSAgICAgIGluc24gPSBGTTEwIHwgKGluc24xIDw8IDMyKSB8IGluc24yOyAgCi0gICAgICBmeCA9IGZ4LT5uZXh0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oInVua25vd24gZXhlY3V0aW9uIHR5cGUgcGFzc2VkIHRvIHdyaXRlXzJfc2hvcnQoKSIpKTsKLSAgICB9Ci0KLSAgLyogIHByaW50ZiAoIndyaXRpbmcgb3V0ICVsbHhcbiIsaW5zbik7ICovCi0gIGYgPSBmcmFnX21vcmUgKDgpOwotICBkMzB2X251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgOCk7Ci0KLSAgLyogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBhIDMyLWJpdCBtdWx0aXBseSBidXQgaXQgaXMgcHV0IGludG8gYQotICAgICBwYXJhbGxlbCBjb250YWluZXIsIG1hcmsgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gYXMgYmVpbmcgYSAzMi1iaXQKLSAgICAgbXVsdGlwbHkuICAqLwotICBpZiAocHJldl9tdWwzMl9wICYmIGV4ZWNfdHlwZSA9PSBFWEVDX1BBUkFMTEVMKQotICAgIGN1cl9tdWwzMl9wID0gMTsKLQotICBmb3IgKGo9MDsgajwyOyBqKyspIAotICAgIHsKLSAgICAgIGZvciAoaT0wOyBpIDwgZngtPmZjOyBpKyspIAotCXsKLQkgIGlmIChmeC0+Zml4W2ldLnJlbG9jKQotCSAgICB7Ci0JICAgICAgd2hlcmUgPSAoZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSArIDQqajsKLQotCSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJCSAgIHdoZXJlLCAKLQkJCSAgIGZ4LT5maXhbaV0uc2l6ZSwKLQkJCSAgICYoZngtPmZpeFtpXS5leHApLAotCQkJICAgZngtPmZpeFtpXS5wY3JlbCwKLQkJCSAgIGZ4LT5maXhbaV0ucmVsb2MpOwotCSAgICB9Ci0JfQotICAgICAgCi0gICAgICBmeC0+ZmMgPSAwOwotICAgICAgZnggPSBmeC0+bmV4dDsKLSAgICB9Ci0gIAotICByZXR1cm4gMDsKLX0KLQotCi0vKiBDaGVjayAyIGluc3RydWN0aW9ucyBhbmQgZGV0ZXJtaW5lIGlmIHRoZXkgY2FuIGJlIHNhZmVseSAqLwotLyogZXhlY3V0ZWQgaW4gcGFyYWxsZWwuICBSZXR1cm5zIDEgaWYgdGhleSBjYW4gYmUuICAgICAgICAgKi8KLXN0YXRpYyBpbnQKLXBhcmFsbGVsX29rIChvcDEsIGluc24xLCBvcDIsIGluc24yLCBleGVjX3R5cGUpCi0gICAgIHN0cnVjdCBkMzB2X2luc24gKm9wMSwgKm9wMjsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuMSwgaW5zbjI7Ci0gICAgIGV4ZWNfdHlwZV9lbnVtIGV4ZWNfdHlwZTsKLXsKLSAgaW50IGksIGosIHNoaWZ0LCByZWdubywgYml0cywgZWNjOwotICB1bnNpZ25lZCBsb25nIGZsYWdzLCBtYXNrLCBmbGFnc19zZXQxLCBmbGFnc19zZXQyLCBmbGFnc191c2VkMSwgZmxhZ3NfdXNlZDI7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zLCBtb2RfcmVnWzJdWzNdLCB1c2VkX3JlZ1syXVszXSwgZmxhZ19yZWdbMl07Ci0gIHN0cnVjdCBkMzB2X2Zvcm1hdCAqZjsKLSAgc3RydWN0IGQzMHZfb3Bjb2RlICpvcDsKLQotICAvKiBzZWN0aW9uIDQuMzogYm90aCBpbnN0cnVjdGlvbnMgbXVzdCBub3QgYmUgSVUgb3IgTVUgb25seSAqLwotICBpZiAoKG9wMS0+b3AtPnVuaXQgPT0gSVUgJiYgb3AyLT5vcC0+dW5pdCA9PSBJVSkKLSAgICAgIHx8IChvcDEtPm9wLT51bml0ID09IE1VICYmIG9wMi0+b3AtPnVuaXQgPT0gTVUpKQotICAgIHJldHVybiAwOwotCi0gIC8qIGZpcnN0IGluc3RydWN0aW9uIG11c3Qgbm90IGJlIGEganVtcCB0byBzYWZlbHkgb3B0aW1pemUsIHVubGVzcyB0aGlzCi0gICAgIGlzIGFuIGV4cGxpY2l0IHBhcmFsbGVsIG9wZXJhdGlvbi4gICovCi0gIGlmIChleGVjX3R5cGUgIT0gRVhFQ19QQVJBTExFTAotICAgICAgJiYgKG9wMS0+b3AtPmZsYWdzX3VzZWQgJiAoRkxBR19KTVAgfCBGTEFHX0pTUikpKQotICAgIHJldHVybiAwOwotCi0gIC8qIElmIG9uZSBpbnN0cnVjdGlvbiBpcyAvVFggb3IgL1hUIGFuZCB0aGUgb3RoZXIgaXMgL0ZYIG9yIC9YRiByZXNwZWN0aXZlbHksCi0gICAgIHRoZW4gaXQgaXMgc2FmZSB0byBhbGxvdyB0aGUgdHdvIHRvIGJlIGRvbmUgYXMgcGFyYWxsZWwgb3BzLCBzaW5jZSBvbmx5Ci0gICAgIG9uZSB3aWxsIGV2ZXIgYmUgZXhlY3V0ZWQgYXQgYSB0aW1lLiAgKi8KLSAgaWYgKChvcDEtPmVjYyA9PSBFQ0NfVFggJiYgb3AyLT5lY2MgPT0gRUNDX0ZYKQotICAgICAgfHwgKG9wMS0+ZWNjID09IEVDQ19GWCAmJiBvcDItPmVjYyA9PSBFQ0NfVFgpCi0gICAgICB8fCAob3AxLT5lY2MgPT0gRUNDX1hUICYmIG9wMi0+ZWNjID09IEVDQ19YRikKLSAgICAgIHx8IChvcDEtPmVjYyA9PSBFQ0NfWEYgJiYgb3AyLT5lY2MgPT0gRUNDX1hUKSkKLSAgICAgcmV0dXJuIDE7Ci0KLSAgLyogWzBdIHIwLXIzMQotICAgICBbMV0gcjMyLXI2MwotICAgICBbMl0gYTAsIGExLCBmbGFnIHJlZ2lzdGVycyAqLwotCi0gIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0gICAgewotICAgICAgaWYgKGogPT0gMCkKLQl7Ci0JICBmID0gb3AxLT5mb3JtOwotCSAgb3AgPSBvcDEtPm9wOwotCSAgZWNjID0gb3AxLT5lY2M7Ci0JICBpbnMgPSBpbnNuMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZiA9IG9wMi0+Zm9ybTsKLQkgIG9wID0gb3AyLT5vcDsKLQkgIGVjYyA9IG9wMi0+ZWNjOwotCSAgaW5zID0gaW5zbjI7Ci0JfQotICAgICAgZmxhZ19yZWdbal0gPSAwOwotICAgICAgbW9kX3JlZ1tqXVswXSA9IG1vZF9yZWdbal1bMV0gPSAwOwotICAgICAgdXNlZF9yZWdbal1bMF0gPSB1c2VkX3JlZ1tqXVsxXSA9IDA7Ci0KLSAgICAgIGlmIChmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwpCi0JewotCSAgLyogRm9yIGh1bWFuIHNwZWNpZmllZCBwYXJhbGxlbCBpbnN0cnVjdGlvbnMgd2UgaGF2ZSBiZWVuIGFza2VkCi0JICAgICB0byBpZ25vcmUgdGhlIHBvc3NpYmlsaXR5IHRoYXQgYm90aCBpbnN0cnVjdGlvbnMgY291bGQgbW9kaWZ5Ci0JICAgICBiaXRzIGluIHRoZSBQU1csIHNvIHdlIGluaXRpYWxpc2UgdGhlIG1vZCAmIHVzZWQgYXJyYXlzIHRvIDAuCi0JICAgICBXZSBoYXZlIGJlZW4gYXNrZWQsIGhvd2V2ZXIsIHRvIHJlZnVzZSB0byBhbGxvdyBwYXJhbGxlbAotCSAgICAgaW5zdHJ1Y3Rpb25zIHdoaWNoIGV4cGxpY2l0bHkgc2V0IHRoZSBzYW1lIGZsYWcgcmVnaXN0ZXIsCi0JICAgICBlZyAiY21wbmUgZjAscjEsMHgxMCB8fCBjbXBlcSBmMCwgcjUsIDB4MiIsIHNvIGZ1cnRoZXIgb24gd2UgdGVzdAotCSAgICAgZm9yIHRoZSB1c2Ugb2YgYSBmbGFnIHJlZ2lzdGVyIGFuZCBzZXQgYSBiaXQgaW4gdGhlIG1vZCBvciB1c2VkCi0JICAgICBhcnJheSBhcHByb3ByaWF0ZWx5LiAgKi8KLQkgICAgIAotCSAgbW9kX3JlZ1tqXVsyXSAgPSAwOwotCSAgdXNlZF9yZWdbal1bMl0gPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtb2RfcmVnW2pdWzJdID0gKG9wLT5mbGFnc19zZXQgJiBGTEFHX0FMTCk7Ci0JICB1c2VkX3JlZ1tqXVsyXSA9IChvcC0+ZmxhZ3NfdXNlZCAmIEZMQUdfQUxMKTsKLQl9Ci0gICAgICAKLSAgICAgIC8qIEJTUi9KU1IgYWx3YXlzIHNldHMgUjYyICovCi0gICAgICBpZiAob3AtPmZsYWdzX3VzZWQgJiBGTEFHX0pTUikKLQltb2RfcmVnW2pdWzFdID0gKDFMIDw8ICg2Mi0zMikpOwotCi0gICAgICAvKiBjb25kaXRpb25hbCBleGVjdXRpb24gYWZmZWN0cyB0aGUgZmxhZ3NfdXNlZCAqLwotICAgICAgc3dpdGNoIChlY2MpCi0JewotCWNhc2UgRUNDX1RYOgotCWNhc2UgRUNDX0ZYOgotCSAgdXNlZF9yZWdbal1bMl0gfD0gZmxhZ19yZWdbal0gPSBGTEFHXzA7Ci0JICBicmVhazsKLQotCWNhc2UgRUNDX1hUOgotCWNhc2UgRUNDX1hGOgotCSAgdXNlZF9yZWdbal1bMl0gfD0gZmxhZ19yZWdbal0gPSBGTEFHXzE7Ci0JICBicmVhazsKLQotCWNhc2UgRUNDX1RUOgotCWNhc2UgRUNDX1RGOgotCSAgdXNlZF9yZWdbal1bMl0gfD0gZmxhZ19yZWdbal0gPSAoRkxBR18wIHwgRkxBR18xKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgZm9yIChpID0gMDsgZi0+b3BlcmFuZHNbaV07IGkrKykKLQl7Ci0JICBmbGFncyA9IGQzMHZfb3BlcmFuZF90YWJsZVtmLT5vcGVyYW5kc1tpXV0uZmxhZ3M7Ci0JICBzaGlmdCA9IDEyIC0gZDMwdl9vcGVyYW5kX3RhYmxlW2YtPm9wZXJhbmRzW2ldXS5wb3NpdGlvbjsKLQkgIGJpdHMgPSBkMzB2X29wZXJhbmRfdGFibGVbZi0+b3BlcmFuZHNbaV1dLmJpdHM7Ci0JICBpZiAoYml0cyA9PSAzMikKLQkgICAgbWFzayA9IDB4ZmZmZmZmZmY7Ci0JICBlbHNlCi0JICAgIG1hc2sgPSAweDdGRkZGRkZGID4+ICgzMSAtIGJpdHMpOwotCi0JICBpZiAoKGZsYWdzICYgT1BFUkFORF9QTFVTKSB8fCAoZmxhZ3MgJiBPUEVSQU5EX01JTlVTKSkKLQkgICAgewotCSAgICAgIC8qIHRoaXMgaXMgYSBwb3N0LWluY3JlbWVudCBvciBwb3N0LWRlY3JlbWVudCAqLwotCSAgICAgIC8qIHRoZSBwcmV2aW91cyByZWdpc3RlciBuZWVkcyB0byBiZSBtYXJrZWQgYXMgbW9kaWZpZWQgKi8KLQotCSAgICAgIHNoaWZ0ID0gMTIgLSBkMzB2X29wZXJhbmRfdGFibGVbZi0+b3BlcmFuZHNbaS0xXV0ucG9zaXRpb247Ci0JICAgICAgcmVnbm8gPSAoaW5zID4+IHNoaWZ0KSAmIDB4M2Y7Ci0JICAgICAgaWYgKHJlZ25vID49IDMyKQotCQltb2RfcmVnW2pdWzFdIHw9IDFMIDw8IChyZWdubyAtIDMyKTsKLQkgICAgICBlbHNlCi0JCW1vZF9yZWdbal1bMF0gfD0gMUwgPDwgcmVnbm87Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGZsYWdzICYgT1BFUkFORF9SRUcpCi0JICAgIHsKLQkgICAgICByZWdubyA9IChpbnMgPj4gc2hpZnQpICYgbWFzazsKLQkgICAgICAvKiB0aGUgbWVtb3J5IHdyaXRlIGZ1bmN0aW9ucyBkb24ndCBoYXZlIGEgZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KLQkgICAgICBpZiAoKGZsYWdzICYgT1BFUkFORF9ERVNUKSAmJiAhKG9wLT5mbGFnc19zZXQgJiBGTEFHX01FTSkpCi0JCXsKLQkJICAvKiBNT0RJRklFRCByZWdpc3RlcnMgYW5kIGZsYWdzICovCi0JCSAgaWYgKGZsYWdzICYgT1BFUkFORF9BQ0MpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChyZWdubyA9PSAwKQotCQkJbW9kX3JlZ1tqXVsyXSB8PSBGTEFHX0EwOwotCQkgICAgICBlbHNlIGlmIChyZWdubyA9PSAxKQotCQkJbW9kX3JlZ1tqXVsyXSB8PSBGTEFHX0ExOwotCQkgICAgICBlbHNlCi0JCQlhYm9ydCAoKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfRkxBRykKLQkJICAgIG1vZF9yZWdbal1bMl0gfD0gMUwgPDwgcmVnbm87Ci0JCSAgZWxzZSBpZiAoIShmbGFncyAmIE9QRVJBTkRfQ09OVFJPTCkpCi0JCSAgICB7Ci0JCSAgICAgIGludCByLCB6OwotCi0JCSAgICAgIC8qIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgYXJlIHR3byBkZXN0aW5hdGlvbiAqLwotCQkgICAgICAvKiByZWdpc3RlcnMsIGZvciBleGFtcGxlIGxkMncgKi8KLQkJICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF8yUkVHKQotCQkJeiA9IDE7Ci0JCSAgICAgIGVsc2UKLQkJCXogPSAwOwotCi0JCSAgICAgIGZvciAociA9IHJlZ25vOyByIDw9IHJlZ25vICsgejsgcisrKQotCQkJeyAKLQkJCSAgaWYgKHIgPj0gMzIpCi0JCQkgICAgbW9kX3JlZ1tqXVsxXSB8PSAxTCA8PCAociAtIDMyKTsKLQkJCSAgZWxzZQotCQkJICAgIG1vZF9yZWdbal1bMF0gfD0gMUwgPDwgcjsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFVTRUQsIGJ1dCBub3QgbW9kaWZpZWQgcmVnaXN0ZXJzIGFuZCBmbGFncyAqLwotCQkgIGlmIChmbGFncyAmIE9QRVJBTkRfQUNDKQotCQkgICAgewotCQkgICAgICBpZiAocmVnbm8gPT0gMCkKLQkJCXVzZWRfcmVnW2pdWzJdIHw9IEZMQUdfQTA7Ci0JCSAgICAgIGVsc2UgaWYgKHJlZ25vID09IDEpCi0JCQl1c2VkX3JlZ1tqXVsyXSB8PSBGTEFHX0ExOwotCQkgICAgICBlbHNlCi0JCQlhYm9ydCAoKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfRkxBRykKLQkJICAgIHVzZWRfcmVnW2pdWzJdIHw9IDFMIDw8IHJlZ25vOwotCQkgIGVsc2UgaWYgKCEoZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wpKQotCQkgICAgewotCQkgICAgICBpbnQgciwgejsKLQotCQkgICAgICAvKiBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSB0d28gc291cmNlICovCi0JCSAgICAgIC8qIHJlZ2lzdGVycywgZm9yIGV4YW1wbGUgc3QydyAqLwotCQkgICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EXzJSRUcpCi0JCQl6ID0gMTsKLQkJICAgICAgZWxzZQotCQkJeiA9IDA7Ci0KLQkJICAgICAgZm9yIChyID0gcmVnbm87IHIgPD0gcmVnbm8gKyB6OyByKyspCi0JCQl7IAotCQkJICBpZiAociA+PSAzMikKLQkJCSAgICB1c2VkX3JlZ1tqXVsxXSB8PSAxTCA8PCAociAtIDMyKTsKLQkJCSAgZWxzZQotCQkJICAgIHVzZWRfcmVnW2pdWzBdIHw9IDFMIDw8IHI7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIAotICBmbGFnc19zZXQxID0gb3AxLT5vcC0+ZmxhZ3Nfc2V0OwotICBmbGFnc19zZXQyID0gb3AyLT5vcC0+ZmxhZ3Nfc2V0OwotICBmbGFnc191c2VkMSA9IG9wMS0+b3AtPmZsYWdzX3VzZWQ7Ci0gIGZsYWdzX3VzZWQyID0gb3AyLT5vcC0+ZmxhZ3NfdXNlZDsKLQotICAvKiBTVDJXL1NUNEhCIGNvbWJpbmVkIHdpdGggQUREcHBwL1NVQnBwcCBpcyBpbGxlZ2FsLiAgKi8KLSAgaWYgKCgoZmxhZ3Nfc2V0MSAmIChGTEFHX01FTSB8IEZMQUdfMldPUkQpKSA9PSAoRkxBR19NRU0gfCBGTEFHXzJXT1JEKQotICAgICAgICYmIChmbGFnc191c2VkMiAmIEZMQUdfQUREU1VCcHBwKSAhPSAwKQotICAgICAgfHwgKChmbGFnc19zZXQyICYgKEZMQUdfTUVNIHwgRkxBR18yV09SRCkpID09IChGTEFHX01FTSB8IEZMQUdfMldPUkQpCi0JICAmJiAoZmxhZ3NfdXNlZDEgJiBGTEFHX0FERFNVQnBwcCkgIT0gMCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogTG9hZCBpbnN0cnVjdGlvbiBjb21iaW5lZCB3aXRoIGhhbGYtd29yZCBtdWx0aXBseSBpcyBpbGxlZ2FsLiAgKi8KLSAgaWYgKCgoZmxhZ3NfdXNlZDEgJiBGTEFHX01FTSkgIT0gMCAmJiAoZmxhZ3NfdXNlZDIgJiBGTEFHX01VTDE2KSkKLSAgICAgIHx8ICgoZmxhZ3NfdXNlZDIgJiBGTEFHX01FTSkgIT0gMCAmJiAoZmxhZ3NfdXNlZDEgJiBGTEFHX01VTDE2KSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogU3BlY2lmaWNhbGx5IGFsbG93IGFkZCB8fCBhZGQgYnkgcmVtb3ZpbmcgY2FycnksIG92ZXJmbG93IGJpdHMgZGVwZW5kZW5jeS4KLSAgICAgVGhpcyBpcyBzYWZlLCBldmVuIGlmIGFuIGFkZGMgZm9sbG93cyBzaW5jZSB0aGUgSVUgdGFrZXMgdGhlIGFyZ3VtZW50IGluCi0gICAgIHRoZSByaWdodCBjb250YWluZXIsIGFuZCBpdCB3cml0ZXMgaXRzIHJlc3VsdHMgbGFzdC4KLSAgICAgSG93ZXZlciwgZG9uJ3QgcGFyYWxlbGxpemUgYWRkIGZvbGxvd2VkIGJ5IGFkZGMgb3Igc3ViIGZvbGxvd2VkIGJ5Ci0gICAgIHN1YmIuICAqLwotCi0gIGlmIChtb2RfcmVnWzBdWzJdID09IEZMQUdfQ1ZWQSAmJiBtb2RfcmVnWzFdWzJdID09IEZMQUdfQ1ZWQQotICAgICAgJiYgKHVzZWRfcmVnWzBdWzJdICYgfmZsYWdfcmVnWzBdKSA9PSAwCi0gICAgICAmJiAodXNlZF9yZWdbMV1bMl0gJiB+ZmxhZ19yZWdbMV0pID09IDAKLSAgICAgICYmIG9wMS0+b3AtPnVuaXQgPT0gRUlUSEVSICYmIG9wMi0+b3AtPnVuaXQgPT0gRUlUSEVSKQotICAgIHsKLSAgICAgIG1vZF9yZWdbMF1bMl0gPSBtb2RfcmVnWzFdWzJdID0gMDsKLSAgICB9Ci0KLSAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgc2Vjb25kIGluc3RydWN0aW9uIGRlcGVuZHMgb24gdGhlIGZpcnN0LCB3ZSBvYnZpb3VzbHkKLQkgY2Fubm90IHBhcmFsbGVsaXplLiAgTm90ZSwgdGhlIG1vZCBmbGFnIGltcGxpZXMgdXNlLCBzbwotCSBjaGVjayB0aGF0IGFzIHdlbGwuICAqLwotICAgICAgLyogSWYgZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsIGlzIHNldCwgdGhlbiB0aGUgY2FzZSBvZiB0aGUgCi0JIHNlY29uZCBpbnN0cnVjdGlvbiB1c2luZyBhIHJlZ2lzdGVyIHRoZSBmaXJzdCBpbnN0cnVjdGlvbgotCSBtb2RpZmllcyBpcyBhc3N1bWVkIHRvIGJlIG9rYXk7IHdlIHRydXN0IHRoZSBodW1hbi4gIFdlCi0JIGRvbid0IHRydXN0IHRoZSBodW1hbiBpZiBib3RoIGluc3RydWN0aW9ucyBtb2RpZnkgdGhlIHNhbWUKLQkgcmVnaXN0ZXIgYnV0IHdlIGRvIHRydXN0IHRoZSBodW1hbiBpZiB0aGV5IG1vZGlmeSB0aGUgc2FtZQotCSBmbGFncy4gKi8KLSAgICAgIC8qIFdlIGhhdmUgbm93IGJlZW4gcmVxdWVzdGVkIG5vdCB0byB0cnVzdCB0aGUgaHVtYW4gaWYgdGhlCi0JIGluc3RydWN0aW9ucyBtb2RpZnkgdGhlIHNhbWUgZmxhZyByZWdpc3RlcnMgZWl0aGVyLiAgKi8KLSAgICAgIGlmIChmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwpCi0JewotCSAgaWYgKChtb2RfcmVnWzBdW2pdICYgbW9kX3JlZ1sxXVtqXSkgIT0gMCkKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgICAgZWxzZQotICAgICAgICBpZiAoKG1vZF9yZWdbMF1bal0gJiAobW9kX3JlZ1sxXVtqXSB8IHVzZWRfcmVnWzFdW2pdKSkgIT0gMCkKLQkgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotCi0vKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgc3RyIHBvaW50cyB0byBhCi0gICBtYWNoaW5lLWRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdCB0aGUgZnJhZ3MvYnl0ZXMgCi0gICBpdCBhc3NlbWJsZXMgdG8uICBGb3IgdGhlIEQzMFYsIGl0IG1vc3RseSBoYW5kbGVzIHRoZSBzcGVjaWFsIFZMSVcgcGFyc2luZyBhbmQgcGFja2luZwotICAgYW5kIGxlYXZlcyB0aGUgZGlmZmljdWx0IHN0dWZmIHRvIGRvX2Fzc2VtYmxlKCkuICAqLwotCi1zdGF0aWMgbG9uZyBsb25nIHByZXZfaW5zbiA9IC0xOwotc3RhdGljIHN0cnVjdCBkMzB2X2luc24gcHJldl9vcGNvZGU7Ci1zdGF0aWMgc3Vic2VnVCBwcmV2X3N1YnNlZzsKLXN0YXRpYyBzZWdUIHByZXZfc2VnID0gMDsKLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBzdHJ1Y3QgZDMwdl9pbnNuIG9wY29kZTsKLSAgbG9uZyBsb25nIGluc247Ci0gIGV4ZWNfdHlwZV9lbnVtIGV4dHlwZSA9IEVYRUNfVU5LTk9XTjsJCS8qIGV4ZWN1dGlvbiB0eXBlOyBwYXJhbGxlbCwgZXRjICovCi0gIHN0YXRpYyBleGVjX3R5cGVfZW51bSBldHlwZSA9IEVYRUNfVU5LTk9XTjsJLyogc2F2ZWQgZXh0eXBlLiAgdXNlZCBmb3IgbXVsdGlsaW5lIGluc3RydWN0aW9ucyAqLwotICBjaGFyICpzdHIyOwotCi0gIGlmICgocHJldl9pbnNuICE9IC0xKSAmJiBwcmV2X3NlZwotICAgICAgICYmICgocHJldl9zZWcgIT0gbm93X3NlZykgfHwgKHByZXZfc3Vic2VnICE9IG5vd19zdWJzZWcpKSkKLSAgICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLQotICBpZiAoZDMwdl9jdXJyZW50X2FsaWduIDwgMykKLSAgICBkMzB2X2FsaWduICgzLCBOVUxMLCBkMzB2X2xhc3RfbGFiZWwpOwotICBlbHNlIGlmIChkMzB2X2N1cnJlbnRfYWxpZ24gPiAzKQotICAgIGQzMHZfY3VycmVudF9hbGlnbiA9IDM7Ci0gIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7Ci0KLSAgZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsID0gMDsKLSAgZmxhZ194cF9zdGF0ZSA9IDA7Ci0gIGlmIChldHlwZSA9PSBFWEVDX1VOS05PV04pCi0gICAgewotICAgICAgLyogbG9vayBmb3IgdGhlIHNwZWNpYWwgbXVsdGlwbGUgaW5zdHJ1Y3Rpb24gc2VwYXJhdG9ycyAqLwotICAgICAgc3RyMiA9IHN0cnN0ciAoc3RyLCAifHwiKTsKLSAgICAgIGlmIChzdHIyKSAKLQl7Ci0JICBleHR5cGUgPSBFWEVDX1BBUkFMTEVMOwotCSAgZmxhZ194cF9zdGF0ZSA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cjIgPSBzdHJzdHIgKHN0ciwgIi0+Iik7Ci0JICBpZiAoc3RyMikgCi0JICAgIGV4dHlwZSA9IEVYRUNfU0VROwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RyMiA9IHN0cnN0ciAoc3RyLCAiPC0iKTsKLQkgICAgICBpZiAoc3RyMikgCi0JCWV4dHlwZSA9IEVYRUNfUkVWU0VROwotCSAgICB9Ci0JfQotICAgICAgLyogc3RyMiBwb2ludHMgdG8gdGhlIHNlcGFyYXRvciwgaWYgb25lICovCi0gICAgICBpZiAoc3RyMikgCi0JewotCSAgKnN0cjIgPSAwOwotCSAgCi0JICAvKiBpZiB0d28gaW5zdHJ1Y3Rpb25zIGFyZSBwcmVzZW50IGFuZCB3ZSBhbHJlYWR5IGhhdmUgb25lIHNhdmVkCi0JICAgICB0aGVuIGZpcnN0IHdyaXRlIGl0IG91dCAqLwotCSAgZDMwdl9jbGVhbnVwIChmYWxzZSk7Ci0JICAKLQkgIC8qIEFzc2VtYmxlIGZpcnN0IGluc3RydWN0aW9uIGFuZCBzYXZlIGl0LiAgKi8KLQkgIHByZXZfaW5zbiA9IGRvX2Fzc2VtYmxlIChzdHIsICZwcmV2X29wY29kZSwgMSwgMCk7Ci0JICBpZiAocHJldl9pbnNuID09IC0xKQotCSAgICBhc19iYWQgKF8oIkNhbm5vdCBhc3NlbWJsZSBpbnN0cnVjdGlvbiIpKTsKLQkgIGlmIChwcmV2X29wY29kZS5mb3JtICE9IE5VTEwgJiYgcHJldl9vcGNvZGUuZm9ybS0+Zm9ybSA+PSBMT05HKQotCSAgICBhc19iYWQgKF8oIkZpcnN0IG9wY29kZSBpcyBsb25nLiAgVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkLiIpKTsgCi0JICBmaXh1cHMgPSBmaXh1cHMtPm5leHQ7Ci0JICBzdHIgPSBzdHIyICsgMjsKLQkgIHByZXZfc2VnID0gbm93X3NlZzsKLQkgIHByZXZfc3Vic2VnID0gbm93X3N1YnNlZzsKLQl9Ci0gICAgfQotCi0gIGluc24gPSBkb19hc3NlbWJsZSAoc3RyLCAmb3Bjb2RlLAotCQkgICAgICAoZXh0eXBlICE9IEVYRUNfVU5LTk9XTiB8fCBldHlwZSAhPSBFWEVDX1VOS05PV04pLAotCQkgICAgICBleHR5cGUgPT0gRVhFQ19QQVJBTExFTCk7Ci0gIGlmIChpbnNuID09IC0xKQotICAgIHsKLSAgICAgIGlmIChleHR5cGUgIT0gRVhFQ19VTktOT1dOKQotCWV0eXBlID0gZXh0eXBlOwotICAgICAgYXNfYmFkIChfKCJDYW5ub3QgYXNzZW1ibGUgaW5zdHJ1Y3Rpb24iKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChldHlwZSAhPSBFWEVDX1VOS05PV04pCi0gICAgewotICAgICAgZXh0eXBlID0gZXR5cGU7Ci0gICAgICBldHlwZSA9IEVYRUNfVU5LTk9XTjsKLSAgICB9Ci0KLSAgLyogV29yZCBtdWx0aXBseSBpbnN0cnVjdGlvbnMgbXVzdCBub3QgYmUgZm9sbG93ZWQgYnkgZWl0aGVyIGEgbG9hZCBvciBhCi0gICAgIDE2LWJpdCBtdWx0aXBseSBpbnN0cnVjdGlvbiBpbiB0aGUgbmV4dCBjeWNsZS4gICovCi0gIGlmICggICAoZXh0eXBlICE9IEVYRUNfUkVWU0VRKQotICAgICAgJiYgcHJldl9tdWwzMl9wCi0gICAgICAmJiAob3Bjb2RlLm9wLT5mbGFnc191c2VkICYgKEZMQUdfTUVNIHwgRkxBR19NVUwxNikpKQotICAgIHsKLSAgICAgIC8qIEhvd2V2ZXIsIGxvYWQgYW5kIG11bHRpcGx5IHNob3VsZCBhYmxlIHRvIGJlIGNvbWJpbmVkIGluIGEgcGFyYWxsZWwKLQkgb3BlcmF0aW9uLCBzbyBjaGVjayBmb3IgdGhhdCBmaXJzdC4gICovCi0gICAgICBpZiAocHJldl9pbnNuICE9IC0xCi0JICAmJiAob3Bjb2RlLm9wLT5mbGFnc191c2VkICYgRkxBR19NRU0pCi0JICAmJiBvcGNvZGUuZm9ybS0+Zm9ybSA8IExPTkcKLQkgICYmIChleHR5cGUgPT0gRVhFQ19QQVJBTExFTCB8fCAoT3B0aW1pemluZyAmJiBleHR5cGUgPT0gRVhFQ19VTktOT1dOKSkKLQkgICYmIHBhcmFsbGVsX29rICgmcHJldl9vcGNvZGUsIChsb25nKXByZXZfaW5zbiwKLQkJCSAgJm9wY29kZSwgKGxvbmcpaW5zbiwgZXh0eXBlKQotCSAgJiYgd3JpdGVfMl9zaG9ydCAoJnByZXZfb3Bjb2RlLCAobG9uZylwcmV2X2luc24sCi0JCQkgICAgJm9wY29kZSwgKGxvbmcpaW5zbiwgZXh0eXBlLCBmaXh1cHMpID09IDApCi0JewotCSAgLyogbm8gaW5zdHJ1Y3Rpb25zIHNhdmVkICovCi0JICBwcmV2X2luc24gPSAtMTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FuJ3QgcGFyYWxsZWxpemUsIGZsdXNoIHByZXZpb3VzIGluc3RydWN0aW9uIGFuZCBlbWl0IGEgd29yZCBvZiBOT1BTLAotCSAgICAgdW5sZXNzIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBhIE5PUCwgaW4gd2hpY2ggY2FzZSBqdXN0IGZsdXNoIGl0LAotCSAgICAgYXMgdGhpcyB3aWxsIGdlbmVyYXRlIGEgd29yZCBvZiBOT1BzIGZvciB1cy4gICovCi0KLQkgIGlmIChwcmV2X2luc24gIT0gLTEgJiYgKHN0cmNtcCAocHJldl9vcGNvZGUub3AtPm5hbWUsICJub3AiKSA9PSAwKSkKLQkgICAgZDMwdl9jbGVhbnVwIChmYWxzZSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICogZjsKLQkgICAgICAKLQkgICAgICBpZiAocHJldl9pbnNuICE9IC0xKQotCQlkMzB2X2NsZWFudXAgKHRydWUpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGYgPSBmcmFnX21vcmUgKDgpOwotCQkgIGQzMHZfbnVtYmVyX3RvX2NoYXJzIChmLCBOT1AyLCA4KTsKLQkJICAKLQkJICBpZiAod2Fybl9ub3BzID09IE5PUF9BTEwgfHwgd2Fybl9ub3BzID09IE5PUF9NVUxUSVBMWSkKLQkJICAgIHsKLQkJICAgICAgaWYgKG9wY29kZS5vcC0+ZmxhZ3NfdXNlZCAmIEZMQUdfTUVNKQotCQkJYXNfd2FybiAoXygid29yZCBvZiBOT1BzIGFkZGVkIGJldHdlZW4gd29yZCBtdWx0aXBseSBhbmQgbG9hZCIpKTsKLQkJICAgICAgZWxzZQotCQkJYXNfd2FybiAoXygid29yZCBvZiBOT1BzIGFkZGVkIGJldHdlZW4gd29yZCBtdWx0aXBseSBhbmQgMTYtYml0IG11bHRpcGx5IikpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIAotCSAgZXh0eXBlID0gRVhFQ19VTktOT1dOOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKCAgIChleHR5cGUgPT0gRVhFQ19SRVZTRVEpCi0JICAgJiYgY3VyX211bDMyX3AKLQkgICAmJiAocHJldl9vcGNvZGUub3AtPmZsYWdzX3VzZWQgJiAoRkxBR19NRU0gfCBGTEFHX01VTDE2KSkpCi0gICAgewotICAgICAgLyogQ2FuJ3QgcGFyYWxsZWxpemUsIGZsdXNoIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gYW5kIGFkZCBhIHNlcXVlbnRpYWwgTk9QLiAqLwotICAgICAgd3JpdGVfMV9zaG9ydCAoJiBvcGNvZGUsIChsb25nKSBpbnNuLCBmaXh1cHMtPm5leHQtPm5leHQsIHRydWUpOwotICAgICAgCi0gICAgICAvKiBNYWtlIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB0aGUgY3VycmVudCBvbmUuICAqLwotICAgICAgZXh0eXBlID0gRVhFQ19VTktOT1dOOwotICAgICAgaW5zbiA9IHByZXZfaW5zbjsKLSAgICAgIG5vd19zZWcgPSBwcmV2X3NlZzsKLSAgICAgIG5vd19zdWJzZWcgPSBwcmV2X3N1YnNlZzsKLSAgICAgIHByZXZfaW5zbiA9IC0xOwotICAgICAgY3VyX211bDMyX3AgPSBwcmV2X211bDMyX3A7Ci0gICAgICBwcmV2X211bDMyX3AgPSAwOwotICAgICAgbWVtY3B5ICgmb3Bjb2RlLCAmcHJldl9vcGNvZGUsIHNpemVvZiAocHJldl9vcGNvZGUpKTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGxvbmcgaW5zdHJ1Y3Rpb24sIHdyaXRlIGl0IGFuZCBhbnkgcHJldmlvdXMgc2hvcnQgaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAob3Bjb2RlLmZvcm0tPmZvcm0gPj0gTE9ORykgCi0gICAgewotICAgICAgaWYgKGV4dHlwZSAhPSBFWEVDX1VOS05PV04pIAotCWFzX2JhZCAoXygiSW5zdHJ1Y3Rpb24gdXNlcyBsb25nIHZlcnNpb24sIHNvIGl0IGNhbm5vdCBiZSBtaXhlZCBhcyBzcGVjaWZpZWQiKSk7Ci0gICAgICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLSAgICAgIHdyaXRlX2xvbmcgKCYgb3Bjb2RlLCBpbnNuLCBmaXh1cHMpOwotICAgICAgcHJldl9pbnNuID0gLTE7Ci0gICAgfQotICBlbHNlIGlmICgocHJldl9pbnNuICE9IC0xKQotCSAgICYmICh3cml0ZV8yX3Nob3J0Ci0JICAgICAgICgmIHByZXZfb3Bjb2RlLCAobG9uZykgcHJldl9pbnNuLCAmIG9wY29kZSwKLQkJKGxvbmcpIGluc24sIGV4dHlwZSwgZml4dXBzKSA9PSAwKSkgCi0gICAgewotICAgICAgLyogTm8gaW5zdHJ1Y3Rpb25zIHNhdmVkLiAgKi8KLSAgICAgIHByZXZfaW5zbiA9IC0xOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChleHR5cGUgIT0gRVhFQ19VTktOT1dOKSAKLQlhc19iYWQgKF8oIlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZCIpKTsKLSAgICAgIAotICAgICAgLyogU2F2ZSBvZmYgbGFzdCBpbnN0cnVjdGlvbiBzbyBpdCBtYXkgYmUgcGFja2VkIG9uIG5leHQgcGFzcy4gICovCi0gICAgICBtZW1jcHkgKCZwcmV2X29wY29kZSwgJm9wY29kZSwgc2l6ZW9mIChwcmV2X29wY29kZSkpOwotICAgICAgcHJldl9pbnNuID0gaW5zbjsKLSAgICAgIHByZXZfc2VnID0gbm93X3NlZzsKLSAgICAgIHByZXZfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgICAgIGZpeHVwcyA9IGZpeHVwcy0+bmV4dDsKLSAgICAgIHByZXZfbXVsMzJfcCA9IGN1cl9tdWwzMl9wOwotICAgIH0KLX0KLQotCi0vKiBkb19hc3NlbWJsZSBhc3NlbWJsZXMgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gYW5kIHJldHVybnMgYW4gb3Bjb2RlICovCi0vKiBpdCByZXR1cm5zIC0xIChhbiBpbnZhbGlkIG9wY29kZSkgb24gZXJyb3IgKi8KLQotI2RlZmluZSBOQU1FX0JVRl9MRU4JMjAKLQotc3RhdGljIGxvbmcgbG9uZwotZG9fYXNzZW1ibGUgKHN0ciwgb3Bjb2RlLCBzaG9ydHAsIGlzX3BhcmFsbGVsKSAKLSAgICAgY2hhciAqc3RyOwotICAgICBzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGU7Ci0gICAgIGludCBzaG9ydHA7Ci0gICAgIGludCBpc19wYXJhbGxlbDsKLXsKLSAgdW5zaWduZWQgY2hhciAqIG9wX3N0YXJ0OwotICB1bnNpZ25lZCBjaGFyICogc2F2ZTsKLSAgdW5zaWduZWQgY2hhciAqIG9wX2VuZDsKLSAgY2hhciAgICAgICAgICAgIG5hbWUgW05BTUVfQlVGX0xFTl07Ci0gIGludCAgICAgICAgICAgICBjbXBfaGFjazsKLSAgaW50ICAgICAgICAgICAgIG5sZW4gPSAwOwotICBpbnQgICAgICAgICAgICAgZnNpemUgPSAoc2hvcnRwID8gRk9SQ0VfU0hPUlQgOiAwKTsKLSAgZXhwcmVzc2lvblMgICAgIG15b3BzIFs2XTsKLSAgbG9uZyBsb25nICAgICAgIGluc247Ci0KLSAgLyogRHJvcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgd2hpbGUgKCogc3RyID09ICcgJykKLSAgICBzdHIgKys7Ci0KLSAgLyogZmluZCB0aGUgb3Bjb2RlIGVuZCAqLwotICBmb3IgKG9wX3N0YXJ0ID0gb3BfZW5kID0gKHVuc2lnbmVkIGNoYXIgKikgKHN0cik7Ci0gICAgICAgKiBvcF9lbmQKLSAgICAgICAmJiBubGVuIDwgKE5BTUVfQlVGX0xFTiAtIDEpCi0gICAgICAgJiYgKiBvcF9lbmQgIT0gJy8nCi0gICAgICAgJiYgIWlzX2VuZF9vZl9saW5lWypvcF9lbmRdICYmICpvcF9lbmQgIT0gJyAnOwotICAgICAgIG9wX2VuZCsrKQotICAgIHsKLSAgICAgIG5hbWVbbmxlbl0gPSB0b2xvd2VyIChvcF9zdGFydFtubGVuXSk7Ci0gICAgICBubGVuKys7Ci0gICAgfQotCi0gIGlmIChubGVuID09IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIG5hbWVbbmxlbl0gPSAwOwotCi0gIC8qIGlmIHRoZXJlIGlzIGFuIGV4ZWN1dGlvbiBjb25kaXRpb24gY29kZSwgaGFuZGxlIGl0ICovCi0gIGlmICgqb3BfZW5kID09ICcvJykKLSAgICB7Ci0gICAgICBpbnQgaSA9IDA7Ci0gICAgICB3aGlsZSAoIChpIDwgRUNDX01BWCkgJiYgc3RybmNhc2VjbXAgKGQzMHZfZWNjX25hbWVzW2ldLCBvcF9lbmQgKyAxLCAyKSkKLQlpKys7Ci0gICAgICAKLSAgICAgIGlmIChpID09IEVDQ19NQVgpCi0JewotCSAgY2hhciB0bXBbNF07Ci0JICBzdHJuY3B5ICh0bXAsIG9wX2VuZCArIDEsIDIpOwotCSAgdG1wWzJdID0gMDsKLQkgIGFzX2JhZCAoXygidW5rbm93biBjb25kaXRpb24gY29kZTogJXMiKSx0bXApOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIC8qICAgICAgcHJpbnRmICgiY29uZGl0aW9uIGNvZGU9JWRcbiIsaSk7ICovCi0gICAgICBvcGNvZGUtPmVjYyA9IGk7Ci0gICAgICBvcF9lbmQgKz0gMzsKLSAgICB9Ci0gIGVsc2UKLSAgICBvcGNvZGUtPmVjYyA9IEVDQ19BTDsKLSAgCi0KLSAgLyogQ01QIGFuZCBDTVBVIGNoYW5nZSB0aGVpciBuYW1lIGJhc2VkIG9uIGNvbmRpdGlvbiBjb2RlcyAqLwotICBpZiAoIXN0cm5jbXAgKG5hbWUsICJjbXAiLCAzKSkKLSAgICB7Ci0gICAgICBpbnQgcCxpOwotICAgICAgY2hhciAqKnN0ciA9IChjaGFyICoqKWQzMHZfY2NfbmFtZXM7Ci0gICAgICBpZiAobmFtZVszXSA9PSAndScpCi0JcCA9IDQ7Ci0gICAgICBlbHNlCi0JcCA9IDM7Ci0KLSAgICAgIGZvciAoaT0xOyAqc3RyICYmIHN0cm5jbXAgKCpzdHIsICYgbmFtZVtwXSwgMik7IGkrKywgc3RyKyspCi0JOwotCi0gICAgICAvKiBjbXB1IG9ubHkgc3VwcG9ydHMgc29tZSBjb25kaXRpb24gY29kZXMgKi8KLSAgICAgIGlmIChwID09IDQpCi0JewotCSAgaWYgKGkgPCAzIHx8IGkgPiA2KQotCSAgICB7Ci0JICAgICAgbmFtZVtwKzJdPTA7Ci0JICAgICAgYXNfYmFkIChfKCJjbXB1IGRvZXNuJ3Qgc3VwcG9ydCBjb25kaXRpb24gY29kZSAlcyIpLCZuYW1lW3BdKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEqc3RyKQotCXsKLQkgIG5hbWVbcCsyXT0wOwotCSAgYXNfYmFkIChfKCJ1bmtub3duIGNvbmRpdGlvbiBjb2RlOiAlcyIpLCZuYW1lW3BdKTsgICAgICAKLQl9Ci0gICAgICAKLSAgICAgIGNtcF9oYWNrID0gaTsKLSAgICAgIG5hbWVbcF0gPSAwOwotICAgIH0KLSAgZWxzZQotICAgIGNtcF9oYWNrID0gMDsKLSAgCi0gIC8qICBwcmludGYoImNtcF9oYWNrPSVkXG4iLGNtcF9oYWNrKTsgKi8KLQotICAvKiBuZWVkIHRvIGxvb2sgZm9yIC5zIG9yIC5sICovCi0gIGlmIChuYW1lW25sZW4tMl0gPT0gJy4nKQotICAgIHsKLSAgICAgIHN3aXRjaCAobmFtZVtubGVuLTFdKQotCXsKLQljYXNlICdzJzoKLQkgIGZzaXplID0gRk9SQ0VfU0hPUlQ7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIGZzaXplID0gRk9SQ0VfTE9ORzsKLQkgIGJyZWFrOwotCX0KLSAgICAgIG5hbWVbbmxlbi0yXSA9IDA7Ci0gICAgfQotCi0gIC8qIGZpbmQgdGhlIGZpcnN0IG9wY29kZSB3aXRoIHRoZSBwcm9wZXIgbmFtZSAqLyAgCi0gIG9wY29kZS0+b3AgPSAoc3RydWN0IGQzMHZfb3Bjb2RlICopaGFzaF9maW5kIChkMzB2X2hhc2gsIG5hbWUpOwotICBpZiAob3Bjb2RlLT5vcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGU6ICVzIiksbmFtZSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IG9wX2VuZDsKLSAgd2hpbGUgKCEob3Bjb2RlLT5mb3JtID0gZmluZF9mb3JtYXQgKG9wY29kZS0+b3AsIG15b3BzLCBmc2l6ZSwgY21wX2hhY2spKSkKLSAgICB7Ci0gICAgICBvcGNvZGUtPm9wKys7Ci0gICAgICBpZiAob3Bjb2RlLT5vcC0+bmFtZSA9PSBOVUxMIHx8IHN0cmNtcCAob3Bjb2RlLT5vcC0+bmFtZSwgbmFtZSkpCi0JewotCSAgYXNfYmFkIChfKCJvcGVyYW5kcyBmb3Igb3Bjb2RlIGAlcycgZG8gbm90IG1hdGNoIGFueSB2YWxpZCBmb3JtYXQiKSwgbmFtZSk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKLQotICBpbnNuID0gYnVpbGRfaW5zbiAob3Bjb2RlLCBteW9wcyk7IAotCi0gIC8qIFByb3BpZ2F0ZSBtdWx0aXBseSBzdGF0dXMgKi8KLSAgaWYgKGluc24gIT0gLTEpCi0gICAgewotICAgICAgaWYgKGlzX3BhcmFsbGVsICYmIHByZXZfbXVsMzJfcCkKLQljdXJfbXVsMzJfcCA9IDE7Ci0gICAgICBlbHNlCi0JewotCSAgcHJldl9tdWwzMl9wID0gY3VyX211bDMyX3A7Ci0JICBjdXJfbXVsMzJfcCAgPSAob3Bjb2RlLT5vcC0+ZmxhZ3NfdXNlZCAmIEZMQUdfTVVMMzIpICE9IDA7Ci0JfQotICAgIH0KLQotICAvKiBQcm9wYWdhdGUgbGVmdF9raWxsc19yaWdodCBzdGF0dXMgKi8KLSAgaWYgKGluc24gIT0gLTEpCi0gICAgewotICAgICAgcHJldl9sZWZ0X2tpbGxzX3JpZ2h0X3AgPSBjdXJfbGVmdF9raWxsc19yaWdodF9wOwotCi0gICAgICBpZiAob3Bjb2RlLT5vcC0+ZmxhZ3Nfc2V0ICYgRkxBR19MS1IpCi0JewotCSAgY3VyX2xlZnRfa2lsbHNfcmlnaHRfcCA9IDE7Ci0JICAKLQkgIGlmIChzdHJjbXAgKG9wY29kZS0+b3AtPm5hbWUsICJtdnRzeXMiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogTGVmdCBraWxscyByaWdodCBmb3Igb25seSBtdnRzeXMgb25seSBmb3IgUFNXL1BTV0gvUFNXTC9mbGFncyB0YXJnZXQuICovCi0JICAgICAgaWYgKChteW9wc1swXS5YX29wID09IE9fcmVnaXN0ZXIpICYmCi0JCSAgKChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9DT05UUk9MKSB8fCAvKiBwc3cgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0NPTlRST0wrTUFYX0NPTlRST0xfUkVHKzIpIHx8IC8qIHBzd2ggKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0NPTlRST0wrTUFYX0NPTlRST0xfUkVHKzEpIHx8IC8qIHBzd2wgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0ZMQUcrMCkgfHwgLyogZjAgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0ZMQUcrMSkgfHwgLyogZjEgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0ZMQUcrMikgfHwgLyogZjIgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0ZMQUcrMykgfHwgLyogZjMgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0ZMQUcrNCkgfHwgLyogZjQgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0ZMQUcrNSkgfHwgLyogZjUgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0ZMQUcrNikgfHwgLyogZjYgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0ZMQUcrNykpKSAvKiBmNyAqLwotCQl7Ci0JCSAgY3VyX2xlZnRfa2lsbHNfcmlnaHRfcCA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBPdGhlciBtdnRzeXMgdGFyZ2V0IHJlZ2lzdGVycyBkb24ndCBraWxsIHJpZ2h0IGluc3RydWN0aW9uLiAqLwotCQkgIGN1cl9sZWZ0X2tpbGxzX3JpZ2h0X3AgPSAwOwotCQl9Ci0JICAgIH0gLyogbXZ0c3lzICovCi0JfQotICAgICAgZWxzZQotCWN1cl9sZWZ0X2tpbGxzX3JpZ2h0X3AgPSAwOwotICAgIH0KLQotICByZXR1cm4gaW5zbjsKLX0KLQotCi0vKiBmaW5kX2Zvcm1hdCgpIGdldHMgYSBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBmb3JtYXQgdGFibGUuCi0gICBJdCBtdXN0IGxvb2sgYXQgYWxsIGZvcm1hdHMgZm9yIGFuIG9wY29kZSBhbmQgdXNlIHRoZSBvcGVyYW5kcwotICAgdG8gY2hvb3NlIHRoZSBjb3JyZWN0IG9uZS4gIFJldHVybnMgTlVMTCBvbiBlcnJvci4gKi8KLQotc3RhdGljIHN0cnVjdCBkMzB2X2Zvcm1hdCAqCi1maW5kX2Zvcm1hdCAob3Bjb2RlLCBteW9wcywgZnNpemUsIGNtcF9oYWNrKQotICAgICBzdHJ1Y3QgZDMwdl9vcGNvZGUgKm9wY29kZTsKLSAgICAgZXhwcmVzc2lvblMgbXlvcHNbXTsKLSAgICAgaW50IGZzaXplOwotICAgICBpbnQgY21wX2hhY2s7Ci17Ci0gIGludCBudW1vcHMsIG1hdGNoLCBpbmRleCwgaT0wLCBqLCBrOwotICBzdHJ1Y3QgZDMwdl9mb3JtYXQgKmZtOwotCi0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgCi0gIC8qIEdldCBhbGwgdGhlIG9wZXJhbmRzIGFuZCBzYXZlIHRoZW0gYXMgZXhwcmVzc2lvbnMuICAqLwotICBudW1vcHMgPSBnZXRfb3BlcmFuZHMgKG15b3BzLCBjbXBfaGFjayk7Ci0KLSAgd2hpbGUgKChpbmRleCA9IG9wY29kZS0+Zm9ybWF0W2krK10pICE9IDApCi0gICAgewotICAgICAgaWYgKGZzaXplID09IEZPUkNFX1NIT1JUICYmIGluZGV4ID49IExPTkcpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChmc2l6ZSA9PSBGT1JDRV9MT05HICYmIGluZGV4IDwgTE9ORykKLQljb250aW51ZTsKLQotICAgICAgZm0gPSAoc3RydWN0IGQzMHZfZm9ybWF0ICopJmQzMHZfZm9ybWF0X3RhYmxlW2luZGV4XTsKLSAgICAgIGsgPSBpbmRleDsKLSAgICAgIHdoaWxlIChmbS0+Zm9ybSA9PSBpbmRleCkKLQl7Ci0JICBtYXRjaCA9IDE7Ci0JICAvKiBOb3cgY2hlY2sgdGhlIG9wZXJhbmRzIGZvciBjb21wYXRpYmlsaXR5LiAgKi8KLQkgIGZvciAoaiA9IDA7IG1hdGNoICYmIGZtLT5vcGVyYW5kc1tqXTsgaisrKQotCSAgICB7Ci0JICAgICAgaW50IGZsYWdzID0gZDMwdl9vcGVyYW5kX3RhYmxlW2ZtLT5vcGVyYW5kc1tqXV0uZmxhZ3M7Ci0JICAgICAgaW50IGJpdHMgPSBkMzB2X29wZXJhbmRfdGFibGVbZm0tPm9wZXJhbmRzW2pdXS5iaXRzOwotCSAgICAgIGludCBYX29wID0gbXlvcHNbal0uWF9vcDsKLQkgICAgICBpbnQgbnVtID0gbXlvcHNbal0uWF9hZGRfbnVtYmVyOwotCSAgICAgIAotCSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfU1BFQ0lBTCkKLQkJYnJlYWs7Ci0JICAgICAgZWxzZSBpZiAoWF9vcCA9PSBPX2lsbGVnYWwpCi0JCW1hdGNoID0gMDsKLQkgICAgICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfUkVHKQotCQl7Ci0JCSAgaWYgKFhfb3AgIT0gT19yZWdpc3RlcgotCQkgICAgICB8fCAoKGZsYWdzICYgT1BFUkFORF9BQ0MpICYmICEobnVtICYgT1BFUkFORF9BQ0MpKQotCQkgICAgICB8fCAoIShmbGFncyAmIE9QRVJBTkRfQUNDKSAmJiAobnVtICYgT1BFUkFORF9BQ0MpKQotCQkgICAgICB8fCAoKGZsYWdzICYgT1BFUkFORF9GTEFHKSAmJiAhKG51bSAmIE9QRVJBTkRfRkxBRykpCi0JCSAgICAgIHx8ICghKGZsYWdzICYgKE9QRVJBTkRfRkxBRyB8IE9QRVJBTkRfQ09OVFJPTCkpICYmIChudW0gJiBPUEVSQU5EX0ZMQUcpKQotCQkgICAgICB8fCAoKGZsYWdzICYgT1BFUkFORF9DT05UUk9MKQotCQkJICAmJiAhKG51bSAmIChPUEVSQU5EX0NPTlRST0wgfCBPUEVSQU5EX0ZMQUcpKSkpCi0JCSAgICB7Ci0JCSAgICAgIG1hdGNoID0gMDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKCgoZmxhZ3MgJiBPUEVSQU5EX01JTlVTKQotCQkgICAgICAgICYmIChYX29wICE9IE9fYWJzZW50IHx8IG51bSAhPSBPUEVSQU5EX01JTlVTKSkKLQkJICAgICAgIHx8ICgoZmxhZ3MgJiBPUEVSQU5EX1BMVVMpCi0JCQkgICAmJiAoWF9vcCAhPSBPX2Fic2VudCB8fCBudW0gIT0gT1BFUkFORF9QTFVTKSkKLQkJICAgICAgIHx8ICgoZmxhZ3MgJiBPUEVSQU5EX0FUTUlOVVMpCi0JCQkgICAmJiAoWF9vcCAhPSBPX2Fic2VudCB8fCBudW0gIT0gT1BFUkFORF9BVE1JTlVTKSkKLQkJICAgICAgIHx8ICgoZmxhZ3MgJiBPUEVSQU5EX0FUUEFSKQotCQkJICAgJiYgKFhfb3AgIT0gT19hYnNlbnQgfHwgbnVtICE9IE9QRVJBTkRfQVRQQVIpKQotCQkgICAgICAgfHwgKChmbGFncyAmIE9QRVJBTkRfQVRTSUdOKQotCQkJICAgJiYgKFhfb3AgIT0gT19hYnNlbnQgfHwgbnVtICE9IE9QRVJBTkRfQVRTSUdOKSkpCi0JCXsKLQkJICBtYXRjaD0wOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX05VTSkKLQkJewotCQkgIC8qIEEgbnVtYmVyIGNhbiBiZSBhIGNvbnN0YW50IG9yIHN5bWJvbCBleHByZXNzaW9uLiAgKi8KLQotCQkgIC8qIElmIHdlIGhhdmUgZm91bmQgYSByZWdpc3RlciBuYW1lLCBidXQgdGhhdCBuYW1lIGFsc28KLQkJICAgICBtYXRjaGVzIGEgc3ltYm9sLCB0aGVuIHJlLXBhcnNlIHRoZSBuYW1lIGFzIGFuIGV4cHJlc3Npb24uICAqLwotCQkgIGlmIChYX29wID09IE9fcmVnaXN0ZXIKLQkJICAgICAgJiYgc3ltYm9sX2ZpbmQgKChjaGFyICopIG15b3BzW2pdLlhfb3Bfc3ltYm9sKSkKLQkJICAgIHsKLQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gKGNoYXIgKikgbXlvcHNbal0uWF9vcF9zeW1ib2w7Ci0JCSAgICAgIGV4cHJlc3Npb24gKCYgbXlvcHNbal0pOwotCQkgICAgfQotCQkgICAgICAKLQkJICAvKiBUdXJuIGFuIGV4cHJlc3Npb24gaW50byBhIHN5bWJvbCBmb3IgbGF0ZXIgcmVzb2x1dGlvbi4gICovCi0JCSAgaWYgKFhfb3AgIT0gT19hYnNlbnQgJiYgWF9vcCAhPSBPX2NvbnN0YW50Ci0JCSAgICAgICYmIFhfb3AgIT0gT19zeW1ib2wgJiYgWF9vcCAhPSBPX3JlZ2lzdGVyCi0JCSAgICAgICYmIFhfb3AgIT0gT19iaWcpCi0JCSAgICB7Ci0JCSAgICAgIHN5bWJvbFMgKnN5bSA9IG1ha2VfZXhwcl9zeW1ib2wgKCZteW9wc1tqXSk7Ci0JCSAgICAgIG15b3BzW2pdLlhfb3AgPSBYX29wID0gT19zeW1ib2w7Ci0JCSAgICAgIG15b3BzW2pdLlhfYWRkX3N5bWJvbCA9IHN5bTsKLQkJICAgICAgbXlvcHNbal0uWF9hZGRfbnVtYmVyID0gbnVtID0gMDsKLQkJICAgIH0KLQotCQkgIGlmIChmbS0+Zm9ybSA+PSBMT05HKQotCQkgICAgewotCQkgICAgICAvKiBJZiB3ZSdyZSB0ZXN0aW5nIGZvciBhIExPTkcgZm9ybWF0LCBlaXRoZXIgZml0cy4gKi8KLQkJICAgICAgaWYgKFhfb3AgIT0gT19jb25zdGFudCAmJiBYX29wICE9IE9fc3ltYm9sKQotCQkJbWF0Y2ggPSAwOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGZtLT5mb3JtIDwgTE9ORwotCQkJICAgJiYgKChmc2l6ZSA9PSBGT1JDRV9TSE9SVCAmJiBYX29wID09IE9fc3ltYm9sKQotCQkJICAgICAgIHx8IChmbS0+Zm9ybSA9PSBTSE9SVF9EMiAmJiBqID09IDApKSkKLQkJICAgIG1hdGNoID0gMTsKLQkJICAvKiBUaGlzIGlzIHRoZSB0cmlja3kgcGFydC4gIFdpbGwgdGhlIGNvbnN0YW50IG9yIHN5bWJvbAotCQkgICAgIGZpdCBpbnRvIHRoZSBzcGFjZSBpbiB0aGUgY3VycmVudCBmb3JtYXQ/ICovCi0JCSAgZWxzZSBpZiAoWF9vcCA9PSBPX2NvbnN0YW50KQotCQkgICAgewotCQkgICAgICBpZiAoY2hlY2tfcmFuZ2UgKG51bSwgYml0cywgZmxhZ3MpKQotCQkJbWF0Y2ggPSAwOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKFhfb3AgPT0gT19zeW1ib2wKLQkJCSAgICYmIFNfSVNfREVGSU5FRCAobXlvcHNbal0uWF9hZGRfc3ltYm9sKQotCQkJICAgJiYgU19HRVRfU0VHTUVOVCAobXlvcHNbal0uWF9hZGRfc3ltYm9sKSA9PSBub3dfc2VnCi0JCQkgICAmJiBvcGNvZGUtPnJlbG9jX2ZsYWcgPT0gUkVMT0NfUENSRUwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgc2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdAotCQkJIGludG8gdGhlIGZvcm0gd2UncmUgY29uc2lkZXJpbmcuICovCi0JCSAgICAgIGZyYWdTICpmOwotCQkgICAgICBsb25nIHZhbHVlOwotCi0JCSAgICAgIC8qIENhbGN1bGF0ZSB0aGUgY3VycmVudCBhZGRyZXNzIGJ5IHJ1bm5pbmcgdGhyb3VnaCB0aGUKLQkJCSBwcmV2aW91cyBmcmFncyBhbmQgYWRkaW5nIG91ciBjdXJyZW50IG9mZnNldC4gICovCi0JCSAgICAgIHZhbHVlID0gMDsKLQkJICAgICAgZm9yIChmID0gZnJjaGFpbl9ub3ctPmZyY2hfcm9vdDsgZjsgZiA9IGYtPmZyX25leHQpCi0JCQl2YWx1ZSArPSBmLT5mcl9maXggKyBmLT5mcl9vZmZzZXQ7Ci0JCSAgICAgIHZhbHVlID0gKFNfR0VUX1ZBTFVFIChteW9wc1tqXS5YX2FkZF9zeW1ib2wpIC0gdmFsdWUKLQkJCSAgICAgICAtIChvYnN0YWNrX25leHRfZnJlZSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spCi0JCQkJICAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSk7Ci0JCSAgICAgIGlmIChjaGVja19yYW5nZSAodmFsdWUsIGJpdHMsIGZsYWdzKSkgCi0JCQltYXRjaCA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgbWF0Y2ggPSAwOwotCQl9Ci0JICAgIH0KLQkgIC8qIHByaW50ZigidGhyb3VnaCB0aGUgbG9vcDogbWF0Y2g9JWRcbiIsbWF0Y2gpOyAgKi8KLQkgIC8qIFdlJ3JlIG9ubHkgZG9uZSBpZiB0aGUgb3BlcmFuZHMgbWF0Y2hlZCBzbyBmYXIgQU5EIHRoZXJlCi0JICAgICBhcmUgbm8gbW9yZSB0byBjaGVjay4gICovCi0JICBpZiAobWF0Y2ggJiYgbXlvcHNbal0uWF9vcCA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogRmluYWwgY2hlY2sgLSBpc3N1ZSBhIHdhcm5pbmcgaWYgYW4gb2RkIG51bWJlcmVkIHJlZ2lzdGVyCi0JCSBpcyB1c2VkIGFzIHRoZSBmaXJzdCByZWdpc3RlciBpbiBhbiBpbnN0cnVjdGlvbiB0aGF0IHJlYWRzCi0JCSBvciB3cml0ZXMgMiByZWdpc3RlcnMuICAqLwotCi0JICAgICAgZm9yIChqID0gMDsgZm0tPm9wZXJhbmRzW2pdOyBqKyspCi0JCWlmIChteW9wc1tqXS5YX29wID09IE9fcmVnaXN0ZXIKLQkJICAgICYmIChteW9wc1tqXS5YX2FkZF9udW1iZXIgJiAxKQotCQkgICAgJiYgKGQzMHZfb3BlcmFuZF90YWJsZVtmbS0+b3BlcmFuZHNbal1dLmZsYWdzICYgT1BFUkFORF8yUkVHKSkKLQkJICBhc193YXJuIChcCi1fKCJPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24iKSk7Ci0JICAgICAgCi0JICAgICAgcmV0dXJuIGZtOwotCSAgICB9Ci0JICBmbSA9IChzdHJ1Y3QgZDMwdl9mb3JtYXQgKikmZDMwdl9mb3JtYXRfdGFibGVbKytrXTsKLQl9Ci0gICAgICAvKiBwcmludGYoInRyeWluZyBhbm90aGVyIGZvcm1hdDogaT0lZFxuIixpKTsgKi8KLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBpZiB3aGlsZSBwcm9jZXNzaW5nIGEgZml4dXAsIGEgcmVsb2MgcmVhbGx5IG5lZWRzIHRvIGJlIGNyZWF0ZWQgKi8KLS8qIHRoZW4gaXQgaXMgZG9uZSBoZXJlICovCi0gICAgICAgICAgICAgICAgIAotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlZywgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9ICZmaXhwLT5meF9hZGRzeS0+YnN5bTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhwLT5meF9yX3R5cGUpOwotICBpZiAocmVsb2MtPmhvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICBfKCJyZWxvYyAlZCBub3Qgc3VwcG9ydGVkIGJ5IG9iamVjdCBmaWxlIGZvcm1hdCIpLCAoaW50KWZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIHJldHVybiByZWxvYzsKLX0KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZykKLSAgICAgZnJhZ1MgKmZyYWdwOwotICAgICBhc2VjdGlvbiAqc2VnOwotewotICBhYm9ydCAoKTsKLSAgcmV0dXJuIDA7Ci19IAotCi1sb25nCi1tZF9wY3JlbF9mcm9tX3NlY3Rpb24gKGZpeHAsIHNlYykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgc2VnVCBzZWM7Ci17Ci0gIGlmIChmaXhwLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKU5VTEwgJiYgKCFTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KSB8fAotICAgICAoU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpICE9IHNlYykpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotfQotCi1pbnQKLW1kX2FwcGx5X2ZpeDMgKGZpeHAsIHZhbHVlcCwgc2VnKQotICAgICBmaXhTICogZml4cDsKLSAgICAgdmFsdWVUICogdmFsdWVwOwotICAgICBzZWdUIHNlZzsKLXsKLSAgY2hhciAqIHdoZXJlOwotICB1bnNpZ25lZCBsb25nIGluc24sIGluc24yOwotICBsb25nIHZhbHVlOwotICAKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ID09IChzeW1ib2xTICopIE5VTEwpCi0gICAgewotICAgICAgdmFsdWUgPSAqIHZhbHVlcDsKLSAgICAgIGZpeHAtPmZ4X2RvbmUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgdmFsdWUgPSAqIHZhbHVlcDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbHVlID0gZml4cC0+Znhfb2Zmc2V0OwotICAgICAgCi0gICAgICBpZiAoZml4cC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoZml4cC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pIAotCSAgICB2YWx1ZSAtPSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UgZG9uJ3QgYWN0dWFsbHkgc3VwcG9ydCBzdWJ0cmFjdGluZyBhIHN5bWJvbC4gICovCi0JICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgIF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAKLSAgLyogRmV0Y2ggdGhlIGluc3RydWN0aW9uLCBpbnNlcnQgdGhlIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmQKLSAgICAgdmFsdWUsIGFuZCBzdHVmZiB0aGUgaW5zdHJ1Y3Rpb24gYmFjayBhZ2Fpbi4gICovCi0gIHdoZXJlID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOwotICBpbnNuID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAKLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzg6ICAvKiBDaGVjayBmb3IgYSBiYWQgLmJ5dGUgZGlyZWN0aXZlLiAgKi8KLSAgICAgIGlmIChmaXhwLT5meF9hZGRzeSAhPSBOVUxMKQotCWFzX2JhZCAoXygibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIGFkZHJlc3Mgb2Ygc3ltYm9sICclcycgaW50byBhIGJ5dGUiKSwKLQkJZml4cC0+ZnhfbGluZSwgU19HRVRfTkFNRSAoZml4cC0+ZnhfYWRkc3kpKTsKLSAgICAgIGVsc2UgaWYgKCgodW5zaWduZWQpdmFsdWUpID4gMHhmZikKLQkgIGFzX2JhZCAoXygibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIHZhbHVlICV4IGludG8gYSBieXRlIiksCi0JCSAgICBmaXhwLT5meF9saW5lLCB2YWx1ZSk7Ci0gICAgICBlbHNlCi0JKiAodW5zaWduZWQgY2hhciAqKSB3aGVyZSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjogIC8qIENoZWNrIGZvciBhIGJhZCAuc2hvcnQgZGlyZWN0aXZlLiAgKi8KLSAgICAgIGlmIChmaXhwLT5meF9hZGRzeSAhPSBOVUxMKQotCWFzX2JhZCAoXygibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIGFkZHJlc3Mgb2Ygc3ltYm9sICclcycgaW50byBhIHNob3J0IiksCi0JCWZpeHAtPmZ4X2xpbmUsIFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KSk7Ci0gICAgICBlbHNlIGlmICgoKHVuc2lnbmVkKXZhbHVlKSA+IDB4ZmZmZikKLQkgIGFzX2JhZCAoXygibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIHZhbHVlICV4IGludG8gYSBzaG9ydCIpLAotCQkgICAgZml4cC0+ZnhfbGluZSwgdmFsdWUpOwotICAgICAgZWxzZQotCWJmZF9wdXRiMTYgKChiZmRfdm1hKSB2YWx1ZSwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEJGRF9SRUxPQ182NDogIC8qIENoZWNrIGZvciBhIGJhZCAucXVhZCBkaXJlY3RpdmUuICAqLwotICAgICAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwpCi0JYXNfYmFkIChfKCJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgYWRkcmVzcyBvZiBzeW1ib2wgJyVzJyBpbnRvIGEgcXVhZCIpLAotCQlmaXhwLT5meF9saW5lLCBTX0dFVF9OQU1FIChmaXhwLT5meF9hZGRzeSkpOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSB2YWx1ZSwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotCSAgYmZkX3B1dGIzMiAoMCwgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKSArIDQpOwotCX0KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBCRkRfUkVMT0NfRDMwVl82OgotICAgICAgY2hlY2tfc2l6ZSAodmFsdWUsIDYsIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICAgICAgaW5zbiB8PSB2YWx1ZSAmIDB4M0Y7Ci0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19EMzBWXzlfUENSRUw6Ci0gICAgICBpZiAoZml4cC0+Znhfd2hlcmUgJiAweDcpCi0JewotCSAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0JICAgIHZhbHVlICs9IDQ7Ci0JICBlbHNlCi0JICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19EMzBWXzlfUENSRUxfUjsKLQl9Ci0gICAgICBjaGVja19zaXplICh2YWx1ZSwgOSwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0gICAgICBpbnNuIHw9ICgodmFsdWUgPj4gMykgJiAweDNGKSA8PCAxMjsKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfMTU6Ci0gICAgICBjaGVja19zaXplICh2YWx1ZSwgMTUsIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICAgICAgaW5zbiB8PSAodmFsdWUgPj4gMykgJiAweEZGRjsKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfMTVfUENSRUw6Ci0gICAgICBpZiAoZml4cC0+Znhfd2hlcmUgJiAweDcpCi0JewotCSAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0JICAgIHZhbHVlICs9IDQ7Ci0JICBlbHNlCi0JICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMX1I7Ci0JfQotICAgICAgY2hlY2tfc2l6ZSAodmFsdWUsIDE1LCBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKLSAgICAgIGluc24gfD0gKHZhbHVlID4+IDMpICYgMHhGRkY7Ci0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19EMzBWXzIxOgotICAgICAgY2hlY2tfc2l6ZSAodmFsdWUsIDIxLCBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKLSAgICAgIGluc24gfD0gKHZhbHVlID4+IDMpICYgMHgzRkZGRjsKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUw6Ci0gICAgICBpZiAoZml4cC0+Znhfd2hlcmUgJiAweDcpCi0JewotCSAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0JICAgIHZhbHVlICs9IDQ7Ci0JICBlbHNlCi0JICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMX1I7Ci0JfQotICAgICAgY2hlY2tfc2l6ZSAodmFsdWUsIDIxLCBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKLSAgICAgIGluc24gfD0gKHZhbHVlID4+IDMpICYgMHgzRkZGRjsKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfMzI6Ci0gICAgICBpbnNuMiA9IGJmZF9nZXRiMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlICsgNCk7Ci0gICAgICBpbnNuIHw9ICh2YWx1ZSA+PiAyNikgJiAweDNGOwkJLyogdG9wIDYgYml0cyAqLwotICAgICAgaW5zbjIgfD0gKCh2YWx1ZSAmIDB4MDNGQzAwMDApIDw8IDIpOwkvKiBuZXh0IDggYml0cyAqLyAKLSAgICAgIGluc24yIHw9IHZhbHVlICYgMHgwMDAzRkZGRjsJCS8qIGJvdHRvbSAxOCBiaXRzICovCi0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24yLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSArIDQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19EMzBWXzMyX1BDUkVMOgotICAgICAgaW5zbjIgPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSArIDQpOwotICAgICAgaW5zbiB8PSAodmFsdWUgPj4gMjYpICYgMHgzRjsJCS8qIHRvcCA2IGJpdHMgKi8KLSAgICAgIGluc24yIHw9ICgodmFsdWUgJiAweDAzRkMwMDAwKSA8PCAyKTsJLyogbmV4dCA4IGJpdHMgKi8gCi0gICAgICBpbnNuMiB8PSB2YWx1ZSAmIDB4MDAwM0ZGRkY7CQkvKiBib3R0b20gMTggYml0cyAqLwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuMiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUgKyA0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgdmFsdWUsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygibGluZSAlZDogdW5rbm93biByZWxvY2F0aW9uIHR5cGU6IDB4JXgiKSwKLQkgICAgICBmaXhwLT5meF9saW5lLGZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgfQotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogZDMwdl9jbGVhbnVwKCkgaXMgY2FsbGVkIGFmdGVyIHRoZSBhc3NlbWJsZXIgaGFzIGZpbmlzaGVkIHBhcnNpbmcgdGhlIGlucHV0IAotICAgZmlsZSBvciBhZnRlciBhIGxhYmVsIGlzIGRlZmluZWQuICBCZWNhdXNlIHRoZSBEMzBWIGFzc2VtYmxlciBzb21ldGltZXMgc2F2ZXMgc2hvcnQgCi0gICBpbnN0cnVjdGlvbnMgdG8gc2VlIGlmIGl0IGNhbiBwYWNrYWdlIHRoZW0gd2l0aCB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgdGhlcmUgbWF5Ci0gICBiZSBhIHNob3J0IGluc3RydWN0aW9uIHRoYXQgc3RpbGwgbmVlZHMgd3JpdHRlbi4gICovCi1pbnQKLWQzMHZfY2xlYW51cCAodXNlX3NlcXVlbnRpYWwpCi0gICAgIGludCB1c2Vfc2VxdWVudGlhbDsKLXsKLSAgc2VnVCBzZWc7Ci0gIHN1YnNlZ1Qgc3Vic2VnOwotCi0gIGlmIChwcmV2X2luc24gIT0gLTEpCi0gICAgewotICAgICAgc2VnID0gbm93X3NlZzsKLSAgICAgIHN1YnNlZyA9IG5vd19zdWJzZWc7Ci0gICAgICBzdWJzZWdfc2V0IChwcmV2X3NlZywgcHJldl9zdWJzZWcpOwotICAgICAgd3JpdGVfMV9zaG9ydCAoJnByZXZfb3Bjb2RlLCAobG9uZylwcmV2X2luc24sIGZpeHVwcy0+bmV4dCwgdXNlX3NlcXVlbnRpYWwpOwotICAgICAgc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpOwotICAgICAgcHJldl9pbnNuID0gLTE7Ci0gICAgICBpZiAodXNlX3NlcXVlbnRpYWwpCi0JcHJldl9tdWwzMl9wID0gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgCi1kMzB2X251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgbikKLSAgICAgY2hhciAqYnVmOwkJCS8qIFJldHVybiAnbmJ5dGVzJyBvZiBjaGFycyBoZXJlLiAqLwotICAgICBsb25nIGxvbmcgdmFsdWU7CQkvKiBUaGUgdmFsdWUgb2YgdGhlIGJpdHMuICovCi0gICAgIGludCBuOwkJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgb3V0cHV0LiAqLwotewotICB3aGlsZSAobi0tKQotICAgIHsKLSAgICAgIGJ1ZltuXSA9IHZhbHVlICYgMHhmZjsKLSAgICAgIHZhbHVlID4+PSA4OwotICAgIH0KLX0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZXZlcnkgbGluZS4gKi8KLS8qIGl0IGNoZWNrcyB0byBzZWUgaWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhICcuJyAqLwotLyogd2hpY2ggaW5kaWNhdGVzIHRoZSBzdGFydCBvZiBhIHBzZXVkby1vcC4gIElmIGl0IGlzLCAqLwotLyogdGhlbiB3cml0ZSBvdXQgYW55IHVud3JpdHRlbiBpbnN0cnVjdGlvbnMgKi8KLQotdm9pZCAKLWQzMHZfc3RhcnRfbGluZSAoKQotewotICBjaGFyICpjID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHdoaWxlIChpc3NwYWNlICgqYykpCi0gICAgYysrOwotCi0gIGlmICgqYyA9PSAnLicpCi0gICAgZDMwdl9jbGVhbnVwIChmYWxzZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIAotY2hlY2tfc2l6ZSAodmFsdWUsIGJpdHMsIGZpbGUsIGxpbmUpCi0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGludCBiaXRzOwotICAgICBjaGFyICpmaWxlOwotICAgICBpbnQgbGluZTsKLXsKLSAgaW50IHRtcCwgbWF4OwotCi0gIGlmICh2YWx1ZSA8IDApCi0gICAgdG1wID0gfnZhbHVlOwotICBlbHNlCi0gICAgdG1wID0gdmFsdWU7Ci0gICAgCi0gIG1heCA9ICgxIDw8IChiaXRzIC0gMSkpIC0gMTsKLQotICBpZiAodG1wID4gbWF4KQotICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgXygidmFsdWUgdG9vIGxhcmdlIHRvIGZpdCBpbiAlZCBiaXRzIiksIGJpdHMpOwotCi0gIHJldHVybjsKLX0KLQotLyogZDMwdl9mcm9iX2xhYmVsKCkgaXMgY2FsbGVkIHdoZW4gYWZ0ZXIgYSBsYWJlbCBpcyByZWNvZ25pemVkLiAgKi8KLQotdm9pZAotZDMwdl9mcm9iX2xhYmVsIChsYWIpCi0gICAgIHN5bWJvbFMgKmxhYjsKLXsKLSAgLyogRW1pdCBhbnkgcGVuZGluZyBpbnN0cnVjdGlvbnMuICAqLwotICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLQotICAvKiBVcGRhdGUgdGhlIGxhYmVsJ3MgYWRkcmVzcyB3aXRoIHRoZSBjdXJyZW50IG91dHB1dCBwb2ludGVyLiAgKi8KLSAgbGFiLT5zeV9mcmFnID0gZnJhZ19ub3c7Ci0gIFNfU0VUX1ZBTFVFIChsYWIsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0KLSAgLyogUmVjb3JkIHRoaXMgbGFiZWwgZm9yIGZ1dHVyZSBhZGp1c3RtZW50IGFmdGVyIHdlIGZpbmQgb3V0IHdoYXQKLSAgICAga2luZCBvZiBkYXRhIGl0IHJlZmVyZW5jZXMsIGFuZCB0aGUgcmVxdWlyZWQgYWxpZ25tZW50IHRoZXJld2l0aC4gICovCi0gIGQzMHZfbGFzdF9sYWJlbCA9IGxhYjsKLX0KLQotLyogSG9vayBpbnRvIGNvbnMgZm9yIGNhcHR1cmluZyBhbGlnbm1lbnQgY2hhbmdlcy4gICovCi0KLXZvaWQKLWQzMHZfY29uc19hbGlnbiAoc2l6ZSkKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBsb2dfc2l6ZTsKLQotICBsb2dfc2l6ZSA9IDA7Ci0gIHdoaWxlICgoc2l6ZSA+Pj0gMSkgIT0gMCkKLSAgICArK2xvZ19zaXplOwotCi0gIGlmIChkMzB2X2N1cnJlbnRfYWxpZ24gPCBsb2dfc2l6ZSkKLSAgICBkMzB2X2FsaWduIChsb2dfc2l6ZSwgKGNoYXIgKikgTlVMTCwgTlVMTCk7Ci0gIGVsc2UgaWYgKGQzMHZfY3VycmVudF9hbGlnbiA+IGxvZ19zaXplKQotICAgIGQzMHZfY3VycmVudF9hbGlnbiA9IGxvZ19zaXplOwotICBkMzB2X2xhc3RfbGFiZWwgPSBOVUxMOwotfQotCi0vKiBDYWxsZWQgaW50ZXJuYWxseSB0byBoYW5kbGUgYWxsIGFsaWdubWVudCBuZWVkcy4gIFRoaXMgdGFrZXMgY2FyZQotICAgb2YgZWxpZGluZyBjYWxscyB0byBmcmFnX2FsaWduIGlmJ24gdGhlIGNhY2hlZCBjdXJyZW50IGFsaWdubWVudAotICAgc2F5cyB3ZSd2ZSBhbHJlYWR5IGdvdCBpdCwgYXMgd2VsbCBhcyB0YWtpbmcgY2FyZSBvZiB0aGUgYXV0by1hbGlnbmluZwotICAgbGFiZWxzIHdydCBjb2RlLiAgKi8KLQotc3RhdGljIHZvaWQKLWQzMHZfYWxpZ24gKG4sIHBmaWxsLCBsYWJlbCkKLSAgICAgaW50IG47Ci0gICAgIGNoYXIgKnBmaWxsOwotICAgICBzeW1ib2xTICpsYWJlbDsKLXsKLSAgLyogVGhlIGZyb250IGVuZCBpcyBwcm9uZSB0byBjaGFuZ2luZyBzZWdtZW50cyBvdXQgZnJvbSB1bmRlciB1cwotICAgICB0ZW1wb3JhcmlseSB3aGVuIC1nIGlzIGluIGVmZmVjdC4gICovCi0gIGludCBzd2l0Y2hlZF9zZWdfcCA9IChkMzB2X2N1cnJlbnRfYWxpZ25fc2VnICE9IG5vd19zZWcpOwotCi0gIC8qIERvIG5vdCBhc3N1bWUgdGhhdCBpZiAnZDMwdl9jdXJyZW50X2FsaWduID49IG4nIGFuZAotICAgICAnISBzd2l0Y2hlZF9zZWdfcCcgdGhhdCBpdCBpcyBzYWZlIHRvIGF2b2lkIHBlcmZvcm1pbmcKLSAgICAgdGhpcyBhbGlnbmVtZW50IHJlcXVlc3QuICBUaGUgYWxpZ25tZW50IG9mIHRoZSBjdXJyZW50IGZyYWcKLSAgICAgY2FuIGJlIGNoYW5nZWQgdW5kZXIgb3VyIGZlZXQsIGZvciBleGFtcGxlIGJ5IGEgLmFzY2lpCi0gICAgIGRpcmVjdGl2ZSBpbiB0aGUgc291cmNlIGNvZGUuICBjZiB0ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MucyAgKi8KLSAgCi0gIGQzMHZfY2xlYW51cCAoZmFsc2UpOwotCi0gIGlmIChwZmlsbCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChuID4gMgotCSAgJiYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBub3dfc2VnKSAmIFNFQ19DT0RFKSAhPSAwKQotCXsKLQkgIHN0YXRpYyBjaGFyIGNvbnN0IG5vcFs0XSA9IHsgMHgwMCwgMHhmMCwgMHgwMCwgMHgwMCB9OwotCi0JICAvKiBGaXJzdCwgbWFrZSBzdXJlIHdlJ3JlIG9uIGEgZm91ci1ieXRlIGJvdW5kYXJ5LCBpbiBjYXNlCi0JICAgICBzb21lb25lIGhhcyBiZWVuIHB1dHRpbmcgLmJ5dGUgdmFsdWVzIHRoZSB0ZXh0IHNlY3Rpb24uICAqLwotCSAgaWYgKGQzMHZfY3VycmVudF9hbGlnbiA8IDIgfHwgc3dpdGNoZWRfc2VnX3ApCi0JICAgIGZyYWdfYWxpZ24gKDIsIDAsIDApOwotCSAgZnJhZ19hbGlnbl9wYXR0ZXJuIChuLCBub3AsIHNpemVvZiBub3AsIDApOwotCX0KLSAgICAgIGVsc2UKLQlmcmFnX2FsaWduIChuLCAwLCAwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBmcmFnX2FsaWduIChuLCAqcGZpbGwsIDApOwotCi0gIGlmICghc3dpdGNoZWRfc2VnX3ApCi0gICAgZDMwdl9jdXJyZW50X2FsaWduID0gbjsKLQotICBpZiAobGFiZWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xTICogICAgIHN5bTsKLSAgICAgIGludCAgICAgICAgICAgbGFiZWxfc2VlbiA9IGZhbHNlOwotICAgICAgc3RydWN0IGZyYWcgKiBvbGRfZnJhZzsKLSAgICAgIHZhbHVlVCAgICAgICAgb2xkX3ZhbHVlOwotICAgICAgdmFsdWVUICAgICAgICBuZXdfdmFsdWU7Ci0gICAgICAKLSAgICAgIGFzc2VydCAoU19HRVRfU0VHTUVOVCAobGFiZWwpID09IG5vd19zZWcpOwotCi0gICAgICBvbGRfZnJhZyAgPSBsYWJlbC0+c3lfZnJhZzsKLSAgICAgIG9sZF92YWx1ZSA9IFNfR0VUX1ZBTFVFIChsYWJlbCk7Ci0gICAgICBuZXdfdmFsdWUgPSAodmFsdWVUKSBmcmFnX25vd19maXggKCk7Ci0gICAgICAKLSAgICAgIC8qIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBsYWJlbCBhdCBhIHBhcnRpY3VsYXIKLQkgYWRkcmVzcywgZXNwZWNpYWxseSBpZiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZCwgc28gd2UgbXVzdAotCSB0YWtlIGNhcmUgdG8gYWRqdXN0IGFsbCB0aGUgbGFiZWxzIGF0IHRoaXMgYWRkcmVzcyBpbiB0aGlzCi0JIGZyYWdtZW50LiAgVG8gc2F2ZSB0aW1lIHdlIHNlYXJjaCBmcm9tIHRoZSBlbmQgb2YgdGhlIHN5bWJvbAotCSBsaXN0LCBiYWNrd2FyZHMsIHNpbmNlIHRoZSBzeW1ib2xzIHdlIGFyZSBpbnRlcmVzdGVkIGluIGFyZQotCSBhbG1vc3QgY2VydGFpbmx5IHRoZSBvbmVzIHRoYXQgd2VyZSBtb3N0IHJlY2VudGx5IGFkZGVkLgotCSBBbHNvIHRvIHNhdmUgdGltZSB3ZSBzdG9wIHNlYXJjaGluZyBvbmNlIHdlIGhhdmUgc2VlbiBhdCBsZWFzdAotCSBvbmUgbWF0Y2hpbmcgbGFiZWwsIGFuZCB3ZSBlbmNvdW50ZXIgYSBsYWJlbCB0aGF0IGlzIG5vIGxvbmdlcgotCSBpbiB0aGUgdGFyZ2V0IGZyYWdtZW50LiAgTm90ZSwgdGhpcyBzZWFyY2ggaXMgZ3VhcmFudGVlZCB0bwotCSBmaW5kIGF0IGxlYXN0IG9uZSBtYXRjaCB3aGVuIHN5bSA9PSBsYWJlbCwgc28gbm8gc3BlY2lhbCBjYXNlCi0JIGNvZGUgaXMgbmVjZXNzYXJ5LiAgKi8KLSAgICAgIGZvciAoc3ltID0gc3ltYm9sX2xhc3RQOyBzeW0gIT0gTlVMTDsgc3ltID0gc3ltLT5zeV9wcmV2aW91cykKLQl7Ci0JICBpZiAoc3ltLT5zeV9mcmFnID09IG9sZF9mcmFnICYmIFNfR0VUX1ZBTFVFIChzeW0pID09IG9sZF92YWx1ZSkKLQkgICAgewotCSAgICAgIGxhYmVsX3NlZW4gPSB0cnVlOwotCSAgICAgIHN5bS0+c3lfZnJhZyA9IGZyYWdfbm93OwotCSAgICAgIFNfU0VUX1ZBTFVFIChzeW0sIG5ld192YWx1ZSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGxhYmVsX3NlZW4gJiYgc3ltLT5zeV9mcmFnICE9IG9sZF9mcmFnKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIG4pOwotfQotCi0vKiBIYW5kbGUgdGhlIC5hbGlnbiBwc2V1ZG8tb3AuICBUaGlzIGFsaWducyB0byBhIHBvd2VyIG9mIHR3by4gIFdlCi0gICBob29rIGhlcmUgdG8gbGF0Y2ggdGhlIGN1cnJlbnQgYWxpZ25tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZDMwdl9hbGlnbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgYWxpZ247Ci0gIGNoYXIgZmlsbCwgKnBmaWxsID0gTlVMTDsKLSAgbG9uZyBtYXhfYWxpZ25tZW50ID0gMTU7Ci0KLSAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKGFsaWduID4gbWF4X2FsaWdubWVudCkKLSAgICB7Ci0gICAgICBhbGlnbiA9IG1heF9hbGlnbm1lbnQ7Ci0gICAgICBhc193YXJuIChfKCJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZCBhc3N1bWVkIiksIGFsaWduKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGFsaWduIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJBbGlnbm1lbnQgbmVnYXRpdmU6IDAgYXNzdW1lZCIpKTsKLSAgICAgIGFsaWduID0gMDsKLSAgICB9Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgcGZpbGwgPSAmZmlsbDsKLSAgICB9Ci0KLSAgZDMwdl9sYXN0X2xhYmVsID0gTlVMTDsKLSAgZDMwdl9hbGlnbiAoYWxpZ24sIHBmaWxsLCBOVUxMKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC50ZXh0IHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyB0aGUgc2F2ZWQgbGFzdCBsYWJlbCBhbmQgcmVzZXRzIGtub3duIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2QzMHZfdGV4dCAoaSkKLSAgICAgaW50IGk7Ci0KLXsKLSAgc190ZXh0IChpKTsKLSAgZDMwdl9sYXN0X2xhYmVsID0gTlVMTDsKLSAgZDMwdl9jdXJyZW50X2FsaWduID0gMDsKLSAgZDMwdl9jdXJyZW50X2FsaWduX3NlZyA9IG5vd19zZWc7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmRhdGEgcHNldWRvLW9wLiAgVGhpcyBpcyBsaWtlIHRoZSB1c3VhbCBvbmUsIGJ1dCBpdAotICAgY2xlYXJzIHRoZSBzYXZlZCBsYXN0IGxhYmVsIGFuZCByZXNldHMga25vd24gYWxpZ25tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZDMwdl9kYXRhIChpKQotICAgICBpbnQgaTsKLXsKLSAgc19kYXRhIChpKTsKLSAgZDMwdl9sYXN0X2xhYmVsID0gTlVMTDsKLSAgZDMwdl9jdXJyZW50X2FsaWduID0gMDsKLSAgZDMwdl9jdXJyZW50X2FsaWduX3NlZyA9IG5vd19zZWc7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLnNlY3Rpb24gcHNldWRvLW9wLiAgVGhpcyBpcyBsaWtlIHRoZSB1c3VhbCBvbmUsIGJ1dCBpdAotICAgY2xlYXJzIHRoZSBzYXZlZCBsYXN0IGxhYmVsIGFuZCByZXNldHMga25vd24gYWxpZ25tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZDMwdl9zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIG9ial9lbGZfc2VjdGlvbiAoaWdub3JlKTsKLSAgZDMwdl9sYXN0X2xhYmVsID0gTlVMTDsKLSAgZDMwdl9jdXJyZW50X2FsaWduID0gMDsKLSAgZDMwdl9jdXJyZW50X2FsaWduX3NlZyA9IG5vd19zZWc7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWQzMHYuaCBiL2dhcy9jb25maWcvdGMtZDMwdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2NlMjg1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtZDMwdi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogdGMtMzEwdi5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1kMzB2LmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50LCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfRDMwVgotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAjZXJyb3IgRDMwViBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9kMzB2Ci0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLWQzMHYiCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotCi0vKiBjYWxsIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiwgbm90IG1kX3BjcmVsX2Zyb20gKi8KLSNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKEZJWFAsIFNFQykgbWRfcGNyZWxfZnJvbV9zZWN0aW9uKEZJWFAsIFNFQykgICAKLQotLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LCQkvKiAuLWZvbyBnZXRzIHR1cm5lZCBpbnRvIFBDIHJlbGF0aXZlIHJlbG9jcyAqLwotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzICAgICAgICAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuCi0KLWludCBkMzB2X2NsZWFudXAgUEFSQU1TICgoaW50KSk7Ci0jZGVmaW5lIG1kX2FmdGVyX3Bhc3NfaG9vaygpCSAgICAgZDMwdl9jbGVhbnVwIChmYWxzZSkKLSNkZWZpbmUgbWRfY2xlYW51cCgpCQkgICAgIGQzMHZfY2xlYW51cCAoZmFsc2UpCi0jZGVmaW5lIFRDX1NUQVJUX0xBQkVMKGNoLCBwdHIpICAgICAgKGNoID09ICc6JyAmJiBkMzB2X2NsZWFudXAgKGZhbHNlKSkKLSNkZWZpbmUgbWRfc3RhcnRfbGluZV9ob29rKCkJICAgICBkMzB2X3N0YXJ0X2xpbmUgKGZhbHNlKQotCi12b2lkIGQzMHZfZnJvYl9sYWJlbCBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICopKTsKLSNkZWZpbmUgdGNfZnJvYl9sYWJlbChzeW0pCSAgICAgZDMwdl9mcm9iX2xhYmVsKHN5bSkKLQotdm9pZCBkMzB2X2NvbnNfYWxpZ24gUEFSQU1TICgoaW50KSk7Ci0jZGVmaW5lIG1kX2NvbnNfYWxpZ24obmJ5dGVzKQkgICAgIGQzMHZfY29uc19hbGlnbihuYnl0ZXMpCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWZyMzAuYyBiL2dhcy9jb25maWcvdGMtZnIzMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTA3NWI3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtZnIzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjY0ICswLDAgQEAKLS8qIHRjLWZyMzAuYyAtLSBBc3NlbWJsZXIgZm9yIHRoZSBGdWppdHN1IEZSMzAuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAib3Bjb2Rlcy9mcjMwLWRlc2MuaCIKLSNpbmNsdWRlICJvcGNvZGVzL2ZyMzAtb3BjLmgiCi0jaW5jbHVkZSAiY2dlbi5oIgotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBhbGwgb2YgdGhlIGRpZmZlcmVudCBjb21wb25lbnRzIGRlc2NyaWJpbmcKLSAgIGFuIGluZGl2aWR1YWwgaW5zdHJ1Y3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY29uc3QgQ0dFTl9JTlNOICoJaW5zbjsKLSAgY29uc3QgQ0dFTl9JTlNOICoJb3JpZ19pbnNuOwotICBDR0VOX0ZJRUxEUwkJZmllbGRzOwotI2lmIENHRU5fSU5UX0lOU05fUAotICBDR0VOX0lOU05fSU5UICAgICAgICAgYnVmZmVyIFsxXTsKLSNkZWZpbmUgSU5TTl9WQUxVRShidWYpICgqKGJ1ZikpCi0jZWxzZQotICB1bnNpZ25lZCBjaGFyICAgICAgICAgYnVmZmVyIFtDR0VOX01BWF9JTlNOX1NJWkVdOwotI2RlZmluZSBJTlNOX1ZBTFVFKGJ1ZikgKGJ1ZikKLSNlbmRpZgotICBjaGFyICoJCWFkZHI7Ci0gIGZyYWdTICoJCWZyYWc7Ci0gIGludCAgICAgICAgICAgICAgICAgICBudW1fZml4dXBzOwotICBmaXhTICogICAgICAgICAgICAgICAgZml4dXBzIFtHQVNfQ0dFTl9NQVhfRklYVVBTXTsKLSAgaW50ICAgICAgICAgICAgICAgICAgIGluZGljZXMgW01BWF9PUEVSQU5EX0lOU1RBTkNFU107Ci19Ci1mcjMwX2luc247Ci0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdICAgICAgICA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gICA9ICIjIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICJ8IjsKLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gICAgICAgICAgICA9ICJlRSI7Ci1jb25zdCBjaGFyIEZMVF9DSEFSU1tdICAgICAgICAgICAgPSAiZEQiOwotDAotI2RlZmluZSBGUjMwX1NIT1JUT1BUUyAiIgotY29uc3QgY2hhciAqIG1kX3Nob3J0b3B0cyA9IEZSMzBfU0hPUlRPUFRTOwotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50ICAgIGM7Ci0gICAgIGNoYXIgKiBhcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgRklMRSAqIHN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgRlIzMCBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9uczpcbiIpKTsKLX0gCi0KLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgIndvcmQiLAljb25zLAkJNCB9LAotICB7IE5VTEwsIAlOVUxMLCAJCTAgfQotfTsKLQotDAotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgZmxhZ3dvcmQgYXBwbGljYWJsZTsKLSAgc2VnVCAgICAgc2VnOwotICBzdWJzZWdUICBzdWJzZWc7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgYGNnZW4nIGludGVyZmFjZS4gICovCi0gIAotICAvKiBTZXQgdGhlIG1hY2hpbmUgbnVtYmVyIGFuZCBlbmRpYW4uICAqLwotICBnYXNfY2dlbl9jcHVfZGVzYyA9IGZyMzBfY2dlbl9jcHVfb3BlbiAoQ0dFTl9DUFVfT1BFTl9NQUNIUywgMCwKLQkJCQkJICBDR0VOX0NQVV9PUEVOX0VORElBTiwKLQkJCQkJICBDR0VOX0VORElBTl9CSUcsCi0JCQkJCSAgQ0dFTl9DUFVfT1BFTl9FTkQpOwotICBmcjMwX2NnZW5faW5pdF9hc20gKGdhc19jZ2VuX2NwdV9kZXNjKTsKLQotICAvKiBUaGlzIGlzIGEgY2FsbGJhY2sgZnJvbSBjZ2VuIHRvIGdhcyB0byBwYXJzZSBvcGVyYW5kcy4gICovCi0gIGNnZW5fc2V0X3BhcnNlX29wZXJhbmRfZm4gKGdhc19jZ2VuX2NwdV9kZXNjLCBnYXNfY2dlbl9wYXJzZV9vcGVyYW5kKTsKLX0KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgc3RhdGljIGludCBsYXN0X2luc25faGFkX2RlbGF5X3Nsb3QgPSAwOwotICBmcjMwX2luc24gaW5zbjsKLSAgY2hhciAqICAgIGVycm1zZzsKLSAgY2hhciAqICAgIHN0cjIgPSBOVUxMOwotCi0gIC8qIEluaXRpYWxpemUgR0FTJ3MgY2dlbiBpbnRlcmZhY2UgZm9yIGEgbmV3IGluc3RydWN0aW9uLiAgKi8KLSAgZ2FzX2NnZW5faW5pdF9wYXJzZSAoKTsKLQotICBpbnNuLmluc24gPSBmcjMwX2NnZW5fYXNzZW1ibGVfaW5zbgotICAgIChnYXNfY2dlbl9jcHVfZGVzYywgc3RyLCAmIGluc24uZmllbGRzLCBpbnNuLmJ1ZmZlciwgJiBlcnJtc2cpOwotICAKLSAgaWYgKCFpbnNuLmluc24pCi0gICAgewotICAgICAgYXNfYmFkIChlcnJtc2cpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBEb2Vzbid0IHJlYWxseSBtYXR0ZXIgd2hhdCB3ZSBwYXNzIGZvciBSRUxBWF9QIGhlcmUuICAqLwotICBnYXNfY2dlbl9maW5pc2hfaW5zbiAoaW5zbi5pbnNuLCBpbnNuLmJ1ZmZlciwKLQkJCUNHRU5fRklFTERTX0JJVFNJWkUgKCYgaW5zbi5maWVsZHMpLCAxLCBOVUxMKTsKLQotICAvKiBXYXJuIGFib3V0IGludmFsaWQgaW5zbnMgaW4gZGVsYXkgc2xvdHMuICAqLwotICBpZiAobGFzdF9pbnNuX2hhZF9kZWxheV9zbG90Ci0gICAgICAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbi5pbnNuLCBDR0VOX0lOU05fTk9UX0lOX0RFTEFZX1NMT1QpKQotICAgIGFzX3dhcm4gKF8oIkluc3RydWN0aW9uICVzIG5vdCBhbGxvd2VkIGluIGEgZGVsYXkgc2xvdC4iKSwKLQkgICAgIENHRU5fSU5TTl9OQU1FIChpbnNuLmluc24pKTsKLQotICBsYXN0X2luc25faGFkX2RlbGF5X3Nsb3QKLSAgICA9IENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLmluc24sIENHRU5fSU5TTl9ERUxBWV9TTE9UKTsKLX0KLQotLyogVGhlIHN5bnRheCBpbiB0aGUgbWFudWFsIHNheXMgY29uc3RhbnRzIGJlZ2luIHdpdGggJyMnLgotICAgV2UganVzdCBpZ25vcmUgaXQuICAqLwotCi12b2lkIAotbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICogZXhwcmVzc2lvblA7Ci17Ci0gIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICsrOwotICAgICAgZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOwotICAgIH0KLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUICAgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnbWVudCk7Ci0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gIGNoYXIgKiBuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQwKLS8qIEludGVyZmFjZSB0byByZWxheF9zZWdtZW50LiAgKi8KLQotLyogRklYTUU6IEJ1aWxkIHRhYmxlIGJ5IGhhbmQsIGdldCBpdCB3b3JraW5nLCB0aGVuIG1hY2hpbmUgZ2VuZXJhdGUuICAqLwotCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLS8qIFRoZSBmaWVsZHMgYXJlOgotICAgMSkgbW9zdCBwb3NpdGl2ZSByZWFjaCBvZiB0aGlzIHN0YXRlLAotICAgMikgbW9zdCBuZWdhdGl2ZSByZWFjaCBvZiB0aGlzIHN0YXRlLAotICAgMykgaG93IG1hbnkgYnl0ZXMgdGhpcyBtb2RlIHdpbGwgYWRkIHRvIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGZyYWcKLSAgIDQpIHdoaWNoIGluZGV4IGludG8gdGhlIHRhYmxlIHRvIHRyeSBpZiB3ZSBjYW4ndCBmaXQgaW50byB0aGlzIG9uZS4gICovCi0KLSAgLyogVGhlIGZpcnN0IGVudHJ5IG11c3QgYmUgdW51c2VkIGJlY2F1c2UgYW4gYHJseF9tb3JlJyB2YWx1ZSBvZiB6ZXJvIGVuZHMKLSAgICAgZWFjaCBsaXN0LiAgKi8KLSAgezEsIDEsIDAsIDB9LAotCi0gIC8qIFRoZSBkaXNwbGFjZW1lbnQgdXNlZCBieSBHQVMgaXMgZnJvbSB0aGUgZW5kIG9mIHRoZSAyIGJ5dGUgaW5zbiwKLSAgICAgc28gd2Ugc3VidHJhY3QgMiBmcm9tIHRoZSBmb2xsb3dpbmcuICAqLwotICAvKiAxNiBiaXQgaW5zbiwgOCBiaXQgZGlzcCAtPiAxMCBiaXQgcmFuZ2UuCi0gICAgIFRoaXMgZG9lc24ndCBoYW5kbGUgYSBicmFuY2ggaW4gdGhlIHJpZ2h0IHNsb3QgYXQgdGhlIGJvcmRlcjoKLSAgICAgdGhlICImIC00IiBpc24ndCB0YWtlbiBpbnRvIGFjY291bnQuICBJdCdzIG5vdCBpbXBvcnRhbnQgZW5vdWdoIHRvCi0gICAgIGNvbXBsaWNhdGUgdGhpbmdzIG92ZXIgaXQsIHNvIHdlIHN1YnRyYWN0IGFuIGV4dHJhIDIgKG9yICsgMiBpbiAtdmUKLSAgICAgY2FzZSkuICAqLwotICB7NTExIC0gMiAtIDIsIC01MTIgLSAyICsgMiwgMCwgMiB9LAotICAvKiAzMiBiaXQgaW5zbiwgMjQgYml0IGRpc3AgLT4gMjYgYml0IHJhbmdlLiAgKi8KLSAgezB4MjAwMDAwMCAtIDEgLSAyLCAtMHgyMDAwMDAwIC0gMiwgMiwgMCB9LAotICAvKiBTYW1lIHRoaW5nLCBidXQgd2l0aCBsZWFkaW5nIG5vcCBmb3IgYWxpZ25tZW50LiAgKi8KLSAgezB4MjAwMDAwMCAtIDEgLSAyLCAtMHgyMDAwMDAwIC0gMiwgNCwgMCB9Ci19OwotCi1sb25nCi1mcjMwX3JlbGF4X2ZyYWcgKGZyYWdQLCBzdHJldGNoKQotICAgICBmcmFnUyAqIGZyYWdQOwotICAgICBsb25nICAgIHN0cmV0Y2g7Ci17Ci0gIC8qIEFkZHJlc3Mgb2YgYnJhbmNoIGluc24uICAqLwotICBsb25nIGFkZHJlc3MgPSBmcmFnUC0+ZnJfYWRkcmVzcyArIGZyYWdQLT5mcl9maXggLSAyOwotICBsb25nIGdyb3d0aCA9IDA7Ci0KLSAgLyogS2VlcCAzMiBiaXQgaW5zbnMgYWxpZ25lZCBvbiAzMiBiaXQgYm91bmRhcmllcy4gICovCi0gIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAyKQotICAgIHsKLSAgICAgIGlmICgoYWRkcmVzcyAmIDMpICE9IDApCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAzOwotCSAgZ3Jvd3RoID0gMjsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAzKQotICAgIHsKLSAgICAgIGlmICgoYWRkcmVzcyAmIDMpID09IDApCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAyOwotCSAgZ3Jvd3RoID0gLTI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGdyb3d0aCA9IHJlbGF4X2ZyYWcgKGZyYWdQLCBzdHJldGNoKTsKLQotICAgICAgLyogTG9uZyBqdW1wIG9uIG9kZCBoYWxmd29yZCBib3VuZGFyeT8gICovCi0gICAgICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMiAmJiAoYWRkcmVzcyAmIDMpICE9IDApCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAzOwotCSAgZ3Jvd3RoICs9IDI7Ci0JfQotICAgIH0KLQotICByZXR1cm4gZ3Jvd3RoOwotfQotCi0vKiBSZXR1cm4gYW4gaW5pdGlhbCBndWVzcyBvZiB0aGUgbGVuZ3RoIGJ5IHdoaWNoIGEgZnJhZ21lbnQgbXVzdCBncm93IHRvCi0gICBob2xkIGEgYnJhbmNoIHRvIHJlYWNoIGl0cyBkZXN0aW5hdGlvbi4KLSAgIEFsc28gdXBkYXRlcyBmcl90eXBlL2ZyX3N1YnR5cGUgYXMgbmVjZXNzYXJ5LgotCi0gICBDYWxsZWQganVzdCBiZWZvcmUgZG9pbmcgcmVsYXhhdGlvbi4KLSAgIEFueSBzeW1ib2wgdGhhdCBpcyBub3cgdW5kZWZpbmVkIHdpbGwgbm90IGJlY29tZSBkZWZpbmVkLgotICAgVGhlIGd1ZXNzIGZvciBmcl92YXIgaXMgQUNUVUFMTFkgdGhlIGdyb3d0aCBiZXlvbmQgZnJfZml4LgotICAgV2hhdGV2ZXIgd2UgZG8gdG8gZ3JvdyBmcl9maXggb3IgZnJfdmFyIGNvbnRyaWJ1dGVzIHRvIG91ciByZXR1cm5lZCB2YWx1ZS4KLSAgIEFsdGhvdWdoIGl0IG1heSBub3QgYmUgZXhwbGljaXQgaW4gdGhlIGZyYWcsIHByZXRlbmQgZnJfdmFyIHN0YXJ0cyB3aXRoIGEKLSAgIDAgdmFsdWUuICAqLwotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKLSAgICAgZnJhZ1MgKiBmcmFnUDsKLSAgICAgc2VnVCAgICBzZWdtZW50OwotewotICBpbnQgICAgb2xkX2ZyX2ZpeCA9IGZyYWdQLT5mcl9maXg7Ci0KLSAgLyogVGhlIG9ubHkgdGhpbmcgd2UgaGF2ZSB0byBoYW5kbGUgaGVyZSBhcmUgc3ltYm9scyBvdXRzaWRlIG9mIHRoZQotICAgICBjdXJyZW50IHNlZ21lbnQuICBUaGV5IG1heSBiZSB1bmRlZmluZWQgb3IgaW4gYSBkaWZmZXJlbnQgc2VnbWVudCBpbgotICAgICB3aGljaCBjYXNlIGxpbmtlciBzY3JpcHRzIG1heSBwbGFjZSB0aGVtIGFueXdoZXJlLgotICAgICBIb3dldmVyLCB3ZSBjYW4ndCBmaW5pc2ggdGhlIGZyYWdtZW50IGhlcmUgYW5kIGVtaXQgdGhlIHJlbG9jIGFzIGluc24KLSAgICAgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBtYXkgbW92ZSB0aGUgaW5zbiBhYm91dC4gICovCi0KLSAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlZ21lbnQpCi0gICAgewotICAgICAgLyogVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQgaW4gdGhpcyBzZWdtZW50LgotCSBDaGFuZ2UgdGhlIHJlbGF4YXRpb24gc3VidHlwZSB0byB0aGUgbWF4IGFsbG93YWJsZSBhbmQgbGVhdmUKLQkgYWxsIGZ1cnRoZXIgaGFuZGxpbmcgdG8gbWRfY29udmVydF9mcmFnLiAgKi8KLSAgICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gMjsKLQotI2lmIDAgLyogQ2FuJ3QgdXNlIHRoaXMsIGJ1dCBsZWF2ZSBpbiBmb3IgaWxsdXN0cmF0aW9uLiAgKi8gICAgIAotICAgICAgLyogQ2hhbmdlIDE2IGJpdCBpbnNuIHRvIDMyIGJpdCBpbnNuLiAgKi8KLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMF0gfD0gMHg4MDsKLQotICAgICAgLyogSW5jcmVhc2Uga25vd24gKGZpeGVkKSBzaXplIG9mIGZyYWdtZW50LiAgKi8KLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLQotICAgICAgLyogQ3JlYXRlIGEgcmVsb2NhdGlvbiBmb3IgaXQuICAqLwotICAgICAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXgsIDQsCi0JICAgICAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEgLyogcGNyZWwgKi8sCi0JICAgICAgIC8qIEZJWE1FOiBDYW4ndCB1c2UgYSByZWFsIEJGRCByZWxvYyBoZXJlLgotCQkgIGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMgY2FuJ3QgaGFuZGxlIGl0LiAgKi8KLQkgICAgICAgQkZEX1JFTE9DX0ZSMzBfMjZfUENSRUwpOwotCi0gICAgICAvKiBNYXJrIHRoaXMgZnJhZ21lbnQgYXMgZmluaXNoZWQuICAqLwotICAgICAgZnJhZ193YW5lIChmcmFnUCk7Ci0jZWxzZQotICAgICAgewotCWNvbnN0IENHRU5fSU5TTiAqIGluc247Ci0JaW50ICAgICAgICAgICAgICAgaTsKLQotCS8qIFVwZGF0ZSB0aGUgcmVjb3JkZWQgaW5zbi4KLQkgICBGb3J0dW5hdGVseSB3ZSBkb24ndCBoYXZlIHRvIGxvb2sgdmVyeSBmYXIuCi0JICAgRklYTUU6IENoYW5nZSB0aGlzIHRvIHJlY29yZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gdGhlIG5leHQgaGlnaGVyCi0JICAgcmVsYXhhYmxlIGluc24gdG8gdXNlLiAgKi8KLQlmb3IgKGkgPSAwLCBpbnNuID0gZnJhZ1AtPmZyX2NnZW4uaW5zbjsgaSA8IDQ7IGkrKywgaW5zbisrKQotCSAgewotCSAgICBpZiAoKHN0cmNtcCAoQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSwKLQkJCSBDR0VOX0lOU05fTU5FTU9OSUMgKGZyYWdQLT5mcl9jZ2VuLmluc24pKQotCQkgPT0gMCkKLQkJJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9SRUxBWCkpCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0JaWYgKGkgPT0gNCkKLQkgIGFib3J0ICgpOwotCi0JZnJhZ1AtPmZyX2NnZW4uaW5zbiA9IGluc247Ci0JcmV0dXJuIDI7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgcmV0dXJuIChmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9mcl9maXgpOwotfSAKLQotLyogKmZyYWdQIGhhcyBiZWVuIHJlbGF4ZWQgdG8gaXRzIGZpbmFsIHNpemUsIGFuZCBub3cgbmVlZHMgdG8gaGF2ZQotICAgdGhlIGJ5dGVzIGluc2lkZSBpdCBtb2RpZmllZCB0byBjb25mb3JtIHRvIHRoZSBuZXcgc2l6ZS4KLQotICAgQ2FsbGVkIGFmdGVyIHJlbGF4YXRpb24gaXMgZmluaXNoZWQuCi0gICBmcmFnUC0+ZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudC4KLSAgIGZyYWdQLT5mcl9zdWJ0eXBlIGlzIHRoZSBzdWJ0eXBlIG9mIHdoYXQgdGhlIGFkZHJlc3MgcmVsYXhlZCB0by4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgYmZkICogICBhYmZkOwotICBzZWdUICAgIHNlYzsKLSAgZnJhZ1MgKiBmcmFnUDsKLXsKLSNpZiAwCi0gIGNoYXIgKiBvcGNvZGU7Ci0gIGNoYXIgKiBkaXNwbGFjZW1lbnQ7Ci0gIGludCAgICB0YXJnZXRfYWRkcmVzczsKLSAgaW50ICAgIG9wY29kZV9hZGRyZXNzOwotICBpbnQgICAgZXh0ZW5zaW9uOwotICBpbnQgICAgYWRkZW5kOwotCi0gIG9wY29kZSA9IGZyYWdQLT5mcl9vcGNvZGU7Ci0KLSAgLyogQWRkcmVzcyBvcGNvZGUgcmVzaWRlcyBhdCBpbiBmaWxlIHNwYWNlLiAgKi8KLSAgb3Bjb2RlX2FkZHJlc3MgPSBmcmFnUC0+ZnJfYWRkcmVzcyArIGZyYWdQLT5mcl9maXggLSAyOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgMSA6Ci0gICAgICBleHRlbnNpb24gPSAwOwotICAgICAgZGlzcGxhY2VtZW50ID0gJiBvcGNvZGVbMV07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDIgOgotICAgICAgb3Bjb2RlWzBdIHw9IDB4ODA7Ci0gICAgICBleHRlbnNpb24gPSAyOwotICAgICAgZGlzcGxhY2VtZW50ID0gJiBvcGNvZGVbMV07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMgOgotICAgICAgb3Bjb2RlWzJdID0gb3Bjb2RlWzBdIHwgMHg4MDsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAob3Bjb2RlLCBQQVJfTk9QX0lOU04sIDIpOwotICAgICAgb3Bjb2RlX2FkZHJlc3MgKz0gMjsKLSAgICAgIGV4dGVuc2lvbiA9IDQ7Ci0gICAgICBkaXNwbGFjZW1lbnQgPSAmIG9wY29kZVszXTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSAhPSBzZWMpCi0gICAgewotICAgICAgLyogc3ltYm9sIG11c3QgYmUgcmVzb2x2ZWQgYnkgbGlua2VyICovCi0gICAgICBpZiAoZnJhZ1AtPmZyX29mZnNldCAmIDMpCi0JYXNfd2FybiAoXygiQWRkZW5kIHRvIHVucmVzb2x2ZWQgc3ltYm9sIG5vdCBvbiB3b3JkIGJvdW5kYXJ5LiIpKTsKLSAgICAgIGFkZGVuZCA9IGZyYWdQLT5mcl9vZmZzZXQgPj4gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBBZGRyZXNzIHdlIHdhbnQgdG8gcmVhY2ggaW4gZmlsZSBzcGFjZS4gICovCi0gICAgICB0YXJnZXRfYWRkcmVzcyA9IFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKSArIGZyYWdQLT5mcl9vZmZzZXQ7Ci0gICAgICB0YXJnZXRfYWRkcmVzcyArPSBmcmFnUC0+ZnJfc3ltYm9sLT5zeV9mcmFnLT5mcl9hZGRyZXNzOwotICAgICAgYWRkZW5kID0gKHRhcmdldF9hZGRyZXNzIC0gKG9wY29kZV9hZGRyZXNzICYgLTQpKSA+PiAyOwotICAgIH0KLQotICAvKiBDcmVhdGUgYSByZWxvY2F0aW9uIGZvciBzeW1ib2xzIHRoYXQgbXVzdCBiZSByZXNvbHZlZCBieSB0aGUgbGlua2VyLgotICAgICBPdGhlcndpc2Ugb3V0cHV0IHRoZSBjb21wbGV0ZWQgaW5zbi4gICovCi0KLSAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlYykKLSAgICB7Ci0gICAgICBhc3NlcnQgKGZyYWdQLT5mcl9zdWJ0eXBlICE9IDEpOwotICAgICAgYXNzZXJ0IChmcmFnUC0+ZnJfY2dlbi5pbnNuICE9IDApOwotICAgICAgZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwIChmcmFnUCwKLQkJCSAgICAgLyogT2Zmc2V0IG9mIGJyYW5jaCBpbnNuIGluIGZyYWcuICAqLwotCQkJICAgICBmcmFnUC0+ZnJfZml4ICsgZXh0ZW5zaW9uIC0gNCwKLQkJCSAgICAgZnJhZ1AtPmZyX2NnZW4uaW5zbiwKLQkJCSAgICAgNCAvKmxlbmd0aCovLAotCQkJICAgICAvKiBGSVhNRTogcXVpY2sgaGFjayAqLwotI2lmIDAKLQkJCSAgICAgQ0dFTl9PUEVSQU5EX0VOVFJZIChmcmFnUC0+ZnJfY2dlbi5vcGluZGV4KSwKLSNlbHNlCi0JCQkgICAgIENHRU5fT1BFUkFORF9FTlRSWSAoRlIzMF9PUEVSQU5EX0RJU1AyNCksCi0jZW5kaWYKLQkJCSAgICAgZnJhZ1AtPmZyX2NnZW4ub3BpbmZvLAotCQkJICAgICBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0KTsKLSAgICB9Ci0KLSNkZWZpbmUgU0laRV9GUk9NX1JFTEFYX1NUQVRFKG4pICgobikgPT0gMSA/IDEgOiAzKQotCi0gIG1kX251bWJlcl90b19jaGFycyAoZGlzcGxhY2VtZW50LCAodmFsdWVUKSBhZGRlbmQsCi0JCSAgICAgIFNJWkVfRlJPTV9SRUxBWF9TVEFURSAoZnJhZ1AtPmZyX3N1YnR5cGUpKTsKLQotICBmcmFnUC0+ZnJfZml4ICs9IGV4dGVuc2lvbjsKLSNlbmRpZgotfQotDAotLyogRnVuY3Rpb25zIGNvbmNlcm5pbmcgcmVsb2NzLiAgKi8KLQotLyogVGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggYSBQQyByZWxhdGl2ZSBqdW1wIHNob3VsZCBiZSBjYWxjdWxhdGVkLAotICAgZ2l2ZW4gYSBQQyByZWxhdGl2ZSByZWxvYy4gICovCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4UCwgc2VjKQotICAgICBmaXhTICogZml4UDsKLSAgICAgc2VnVCAgIHNlYzsKLXsKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmICghIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JICB8fCBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gc2VjKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCAob3IgaXMgZGVmaW5lZCBidXQgbm90IGluIHRoaXMgc2VjdGlvbikuCi0JIExldCB0aGUgbGlua2VyIGZpZ3VyZSBpdCBvdXQuICAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAoZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlKSAmIH4xOwotfQotCi0vKiBSZXR1cm4gdGhlIGJmZCByZWxvYyB0eXBlIGZvciBPUEVSQU5EIG9mIElOU04gYXQgZml4dXAgRklYUC4KLSAgIFJldHVybnMgQkZEX1JFTE9DX05PTkUgaWYgbm8gcmVsb2MgdHlwZSBjYW4gYmUgZm91bmQuCi0gICAqRklYUCBtYXkgYmUgbW9kaWZpZWQgaWYgZGVzaXJlZC4gICovCi0KLWJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotbWRfY2dlbl9sb29rdXBfcmVsb2MgKGluc24sIG9wZXJhbmQsIGZpeFApCi0gICAgIGNvbnN0IENHRU5fSU5TTiAqICAgIGluc247Ci0gICAgIGNvbnN0IENHRU5fT1BFUkFORCAqIG9wZXJhbmQ7Ci0gICAgIGZpeFMgKiAgICAgICAgICAgICAgIGZpeFA7Ci17Ci0gIHN3aXRjaCAob3BlcmFuZC0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5OiAgZml4UC0+ZnhfcGNyZWwgPSAxOyByZXR1cm4gQkZEX1JFTE9DX0ZSMzBfOV9QQ1JFTDsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyOiBmaXhQLT5meF9wY3JlbCA9IDE7IHJldHVybiBCRkRfUkVMT0NfRlIzMF8xMl9QQ1JFTDsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTA6ICByZXR1cm4gQkZEX1JFTE9DX0ZSMzBfMTBfSU5fODsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOTogICByZXR1cm4gQkZEX1JFTE9DX0ZSMzBfOV9JTl84OwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4OiAgIHJldHVybiBCRkRfUkVMT0NfRlIzMF84X0lOXzg7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2OiAgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzZfSU5fNDsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JODogICAgICByZXR1cm4gQkZEX1JFTE9DXzg7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyOiAgICAgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzQ4OwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kyMDogICAgIHJldHVybiBCRkRfUkVMT0NfRlIzMF8yMDsKLSAgICBkZWZhdWx0IDogLyogYXZvaWQgLVdhbGwgd2FybmluZyAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBCRkRfUkVMT0NfTk9ORTsKLX0KLQotLyogU2VlIHdoZXRoZXIgd2UgbmVlZCB0byBmb3JjZSBhIHJlbG9jYXRpb24gaW50byB0aGUgb3V0cHV0IGZpbGUuCi0gICBUaGlzIGlzIHVzZWQgdG8gZm9yY2Ugb3V0IHN3aXRjaCBhbmQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMgd2hlbgotICAgcmVsYXhpbmcuICAqLwotCi1pbnQKLWZyMzBfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotICAgICBmaXhTICogZml4OwotewotICBpZiAoICAgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQotDAotLyogV3JpdGUgYSB2YWx1ZSBvdXQgdG8gdGhlIG9iamVjdCBmaWxlLCB1c2luZyB0aGUgYXBwcm9wcmlhdGUgZW5kaWFubmVzcy4gICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKiBidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCAgICBuOwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSovCi0KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyICAgdHlwZTsKLSAgICAgY2hhciAqIGxpdFA7Ci0gICAgIGludCAqICBzaXplUDsKLXsKLSAgaW50ICAgICAgICAgICAgICBpOwotICBpbnQgICAgICAgICAgICAgIHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFICAgd29yZHMgW01BWF9MSVRUTEVOVU1TXTsKLSAgY2hhciAqICAgICAgICAgICB0OwotICBjaGFyICogICAgICAgICAgIGF0b2ZfaWVlZSAoKTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgLyogRklYTUU6IFNvbWUgdGFyZ2V0cyBhbGxvdyBvdGhlciBmb3JtYXQgY2hhcnMgZm9yIGJpZ2dlciBzaXplcyBoZXJlLiAgKi8KLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqIHNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBtZF9hdG9mKCkiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICogc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLAotCQkJICBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgICAgCi0gIHJldHVybiAwOwotfQotCi0vKiBXb3JrZXIgZnVuY3Rpb24gZm9yIGZyMzBfaXNfY29sb25faW5zbigpLiAgKi8KLXN0YXRpYyBjaGFyCi1yZXN0b3JlX2NvbG9uIChhZHZhbmNlX2lfbF9wX2J5KQotICAgICBpbnQgYWR2YW5jZV9pX2xfcF9ieTsKLXsKLSAgY2hhciBjOwotICAKLSAgLyogUmVzdG9yZSB0aGUgY29sb24sIGFuZCBhZHZhbmNlIGlucHV0X2xpbmVfcG9pbnRlciB0bwotICAgICB0aGUgZW5kIG9mIHRoZSBuZXcgc3ltYm9sLiAgKi8KLSAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSAnOic7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciArPSBhZHZhbmNlX2lfbF9wX2J5OwotICBjID0gKiBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICogaW5wdXRfbGluZV9wb2ludGVyID0gMDsKLSAgCi0gIHJldHVybiBjOwotfQotCi0vKiBEZXRlcm1pbmVzIGlmIHRoZSBzeW1ib2wgc3RhcnRpbmcgYXQgU1RBUlQgYW5kIGVuZGluZyBpbgotICAgYSBjb2xvbiB0aGF0IHdhcyBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSBJTlBVVF9MSU5FX1BPSU5URVIKLSAgIChidXQgd2hpY2ggaGFzIG5vdyBiZWVuIHJlcGxhY2VkIGJ1IGEgTlVMKSBpcyBpbiBmYWN0IGFuCi0gICBMREk6OCwgTERJOjIwLCBMREk6MzIsIENBTEw6RC4gSk1QOkQsIFJFVDpEIG9yIEJjYzpEIGluc3RydWN0aW9uLgotICAgSWYgaXQgaXMsIHRoZW4gaXQgcmVzdG9yZXMgdGhlIGNvbG9uLCBhZHZhbmNlcyBJTlBVVF9MSU5FX1BPSU5URVIKLSAgIHRvIHRoZSByZWFsIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24vc3ltYm9sLCBhbmQgcmV0dXJucyB0aGUgY2hhcmFjdGVyCi0gICB0aGF0IHJlYWxseSB0ZXJtaW5hdGVkIHRoZSBzeW1ib2wuICBPdGhlcndpc2UgaXQgcmV0dXJucyAwLiAgKi8KLWNoYXIKLWZyMzBfaXNfY29sb25faW5zbiAoc3RhcnQpCi0gICAgIGNoYXIgKiAgc3RhcnQ7Ci17Ci0gIGNoYXIgKiBpX2xfcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIHN5bWJvbCBwYXJzZWQgc28gZmFyIGlzICdsZGknICAqLwotICBpZiAoICAgKHN0YXJ0WzBdICE9ICdsJyAmJiBzdGFydFswXSAhPSAnTCcpCi0gICAgICB8fCAoc3RhcnRbMV0gIT0gJ2QnICYmIHN0YXJ0WzFdICE9ICdEJykKLSAgICAgIHx8IChzdGFydFsyXSAhPSAnaScgJiYgc3RhcnRbMl0gIT0gJ0knKQotICAgICAgfHwgc3RhcnRbM10gIT0gMCkKLSAgICB7Ci0gICAgICAvKiBOb3BlIC0gY2hlY2sgdG8gc2VlIGEgJ2QnIGZvbGxvd3MgdGhlIGNvbG9uLiAgKi8KLSAgICAgIGlmICggICAoaV9sX3BbMV0gPT0gJ2QnIHx8IGlfbF9wWzFdID09ICdEJykKLQkgICYmIChpX2xfcFsyXSA9PSAnICcgfHwgaV9sX3BbMl0gPT0gJ1x0JyB8fCBpX2xfcFsyXSA9PSAnXG4nKSkKLQl7Ci0JICAvKiBZdXAgLSBpdCBtaWdodCBiZSBkZWxheSBzbG90IGluc3RydWN0aW9uLiAgKi8KLQkgIGludCAgICAgICAgICAgaTsKLQkgIHN0YXRpYyBjaGFyICogZGVsYXlfaW5zbnMgW10gPQotCSAgewotCSAgICAiY2FsbCIsICJqbXAiLCAicmV0IiwgImJyYSIsICJibm8iLAotCSAgICAiYmVxIiwgICJibmUiLCAiYmMiLCAgImJuYyIsICJibiIsCi0JICAgICJicCIsICAgImJ2IiwgICJibnYiLCAiYmx0IiwgImJnZSIsCi0JICAgICJibGUiLCAgImJndCIsICJibHMiLCAiYmhpIgotCSAgfTsKLQotCSAgZm9yIChpID0gc2l6ZW9mIChkZWxheV9pbnNucykgLyBzaXplb2YgKGRlbGF5X2luc25zWzBdKTsgaS0tOykKLQkgICAgewotCSAgICAgIGNoYXIgKiBpbnNuID0gZGVsYXlfaW5zbnNbaV07Ci0JICAgICAgaW50ICAgIGxlbiAgPSBzdHJsZW4gKGluc24pOwotCi0JICAgICAgaWYgKHN0YXJ0IFtsZW5dICE9IDApCi0JCWNvbnRpbnVlOwotCSAgICAgIAotCSAgICAgIHdoaWxlIChsZW4gLS0pCi0JCWlmICh0b2xvd2VyIChzdGFydCBbbGVuXSkgIT0gaW5zbiBbbGVuXSkKLQkJICBicmVhazsKLQkgICAgICAKLQkgICAgICBpZiAobGVuID09IC0xKQotCQlyZXR1cm4gcmVzdG9yZV9jb2xvbiAoMSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIE5vcGUgLSBpdCBpcyBhIG5vcm1hbCBsYWJlbC4gICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSB0ZXh0IGZvbGxvd2luZyB0aGUgY29sb24gaXMgJzgnICovCi0gIGlmIChpX2xfcFsxXSA9PSAnOCcgJiYgKGlfbF9wWzJdID09ICcgJyB8fCBpX2xfcFsyXSA9PSAnXHQnKSkKLSAgICByZXR1cm4gcmVzdG9yZV9jb2xvbiAoMik7Ci0KLSAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSB0ZXh0IGZvbGxvd2luZyB0aGUgY29sb24gaXMgJzIwJyAqLwotICBlbHNlIGlmIChpX2xfcFsxXSA9PSAnMicgJiYgaV9sX3BbMl0gPT0nMCcgJiYgKGlfbF9wWzNdID09ICcgJyB8fCBpX2xfcFszXSA9PSAnXHQnKSkKLSAgICByZXR1cm4gcmVzdG9yZV9jb2xvbiAoMyk7Ci0KLSAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSB0ZXh0IGZvbGxvd2luZyB0aGUgY29sb24gaXMgJzMyJyAqLwotICBlbHNlIGlmIChpX2xfcFsxXSA9PSAnMycgJiYgaV9sX3BbMl0gPT0nMicgJiYgKGlfbF9wWzNdID09ICcgJyB8fCBpX2xfcFszXSA9PSAnXHQnKSkKLSAgICByZXR1cm4gcmVzdG9yZV9jb2xvbiAoMyk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWJvb2xlYW4KLWZyMzBfZml4X2FkanVzdGFibGUgKGZpeFApCi0gICBmaXhTICogZml4UDsKLXsKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0gIAotI2lmIDAgIAotICAvKiBQcmV2ZW50IGFsbCBhZGp1c3RtZW50cyB0byBnbG9iYWwgc3ltYm9scy4gKi8KLSAgaWYgKFNfSVNfRVhURVJOIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0gIAotICBpZiAoU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgCi0gIC8qIFdlIG5lZWQgdGhlIHN5bWJvbCBuYW1lIGZvciB0aGUgVlRBQkxFIGVudHJpZXMgKi8KLSAgaWYgKCAgIGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1mcjMwLmggYi9nYXMvY29uZmlnL3RjLWZyMzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3MmQ4Yi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWZyMzAuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qIHRjLWZyMzAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtZnIzMC5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfRlIzMAotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLS8qIGxlYWRpbmcgc3BhY2Ugc28gd2lsbCBjb21waWxlIHdpdGggY2MgKi8KLSAjZXJyb3IgRlIzMCBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJGUjMwIEdBUyAiCi0KLS8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX2ZyMzAKLQotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1mcjMwIgotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotLyogY2FsbCBtZF9wY3JlbF9mcm9tX3NlY3Rpb24sIG5vdCBtZF9wY3JlbF9mcm9tICovCi1sb25nIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHNlZ1QpKTsKLSNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKEZJWFAsIFNFQykgbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChGSVhQLCBTRUMpCi0KLS8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jZGVmaW5lIERJRkZfRVhQUl9PSwkJLyogLi1mb28gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLQotLyogV2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgLndvcmQgc3RyYW5nZWx5LiAgKi8KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLSNkZWZpbmUgbWRfYXBwbHlfZml4MyBnYXNfY2dlbl9tZF9hcHBseV9maXgzCi0KLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIGZyMzBfZml4X2FkanVzdGFibGUgKGZpeFApCi1leHRlcm4gYm9vbGVhbiBmcjMwX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0vKiBXaGVuIHJlbGF4aW5nLCB3ZSBuZWVkIHRvIGVtaXQgdmFyaW91cyByZWxvY3Mgd2Ugb3RoZXJ3aXNlIHdvdWxkbid0LiAgKi8KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXgpIGZyMzBfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotZXh0ZXJuIGludCBmcjMwX2ZvcmNlX3JlbG9jYXRpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLSNkZWZpbmUgVENfSEFORExFU19GWF9ET05FCi0KLSNkZWZpbmUgdGNfZ2VuX3JlbG9jIGdhc19jZ2VuX3RjX2dlbl9yZWxvYwotCi0vKiBDYWxsIG1kX3BjcmVsX2Zyb21fc2VjdGlvbigpLCBub3QgbWRfcGNyZWxfZnJvbSgpLiAgKi8KLSNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKEZJWFAsIFNFQykgbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChGSVhQLCBTRUMpCi1leHRlcm4gbG9uZyBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzZWdUKSk7Ci0KLS8qIEZvciA4IHZzIDE2IHZzIDMyIGJpdCBicmFuY2ggc2VsZWN0aW9uLiAgKi8KLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0KLS8qIFdlIG5lZWQgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIFRDX1NUQVJUX0xBQkVMIG1hY3JvIHNvIHRoYXQgd2UKLSAgIGFsbG93IHRoZSBMREk6OCwgTERJOjIwLCBMREk6MzIgYW5kIGRlbGF5IHNsb3QgaW5zdHJ1Y3Rpb25zIHRvIGJlCi0gICBwYXJzZWQgYXMgc3VjaC4gIE5vdGUgLSBpbiBhIEhPUlJJQkxFIEhBQ0ssIHdlIG1ha2UgdXNlIG9mIHRoZQotICAga25vd2xlZGdlIHRoYXQgdGhpcyBtYXJjbyBpcyBvbmx5IGV2ZXIgZXZhbHVhdGVkIGluIG9uZSBwbGFjZQotICAgKHJlYWRfYV9zb3VyY2VfZmlsZSBpbiByZWFkLmMpIHdoZXJlIHdlIGNhbiBhY2Nlc3MgdGhlIGxvY2FsCi0gICB2YXJpYWJsZSAncycgLSB0aGUgc3RhcnQgb2YgdGhlIHN5bWJvbCB0aGF0IHdhcyB0ZXJtaW5hdGVkIGJ5Ci0gICAnY2hhcmFjdGVyJy4gIEFsc28gd2UgbmVlZCB0byBiZSBhYmxlIHRvIGNoYW5nZSB0aGUgY29udGVudHMgb2YKLSAgIHRoZSBsb2NhbCB2YXJpYWJsZSAnYycgd2hpY2ggaXMgcGFzc2VkIHRvIHRoaXMgbWFjcm8gYXMgJ2NoYXJhY3RlcicuICAqLwotI2RlZmluZSBUQ19TVEFSVF9MQUJFTChjaGFyYWN0ZXIsIGlfbF9wKQkJCVwKLSAgKChjaGFyYWN0ZXIpICE9ICc6JyA/IDAgOiAoY2hhcmFjdGVyID0gZnIzMF9pc19jb2xvbl9pbnNuIChzKSkgPyAwIDogKChjaGFyYWN0ZXIgPSAnOicpLCAxKSkKLWV4dGVybiBjaGFyIGZyMzBfaXNfY29sb25faW5zbiBQQVJBTVMgKChjaGFyICopKTsKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtZ2VuZXJpYy5jIGIvZ2FzL2NvbmZpZy90Yy1nZW5lcmljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1nZW5lcmljLmMKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1nZW5lcmljLmggYi9nYXMvY29uZmlnL3RjLWdlbmVyaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJkZjAyMC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWdlbmVyaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1nZW5lcmljLmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MSwgOTIsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICAgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGMtZ2VuZXJpYy5oIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvciB0YXJnZXQgY3B1Ci0gKiBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuICBJdCBpcyBteSBpbnRlbnQgdGhhdCB0aGlzIGZpbGUgY29tcGlsZS4gIEl0IGlzIGFsc28KLSAqIG15IGludGVudCB0aGF0IHRoaXMgZmlsZSBncm93IGludG8gc29tZXRoaW5nIHRoYXQgY2FuIGJlIHVzZWQgYXMgYm90aCBhCi0gKiB0ZW1wbGF0ZSBmb3IgcG9ydGluZywgYW5kIGEgc3R1YiBmb3IgdGVzdGluZy4gIHhveG9yaWNoLgotICovCi0KLSNkZWZpbmUgVENfR0VORVJJQyAxCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2YgdGMtZ2VuZXJpYy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWg4MzAwLmMgYi9nYXMvY29uZmlnL3RjLWg4MzAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNWFkYTEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1oODMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU5NSArMCwwIEBACi0vKiB0Yy1oODMwMC5jIC0tIEFzc2VtYmxlIGNvZGUgZm9yIHRoZSBIaXRhY2hpIEg4LzMwMAotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKgotICBXcml0dGVuIEJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gIHNhY0BjeWdudXMuY29tCi0gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgImJmZC5oIgotI2RlZmluZSBERUZJTkVfVEFCTEUKLSNkZWZpbmUgaDhfb3Bjb2RlcyBvcHMKLSNpbmNsdWRlICJvcGNvZGUvaDgzMDAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9Ci17JzsnLCAwfTsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9Ci17MH07Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KLSAgICovCi0KLXZvaWQgY29ucyAoKTsKLQotaW50IEhtb2RlOwotaW50IFNtb2RlOwotI2RlZmluZSBQU0laRSAoSG1vZGUgPyBMXzMyIDogTF8xNikKLSNkZWZpbmUgRE1PREUgKExfMTYpCi0jZGVmaW5lIERTWU1NT0RFIChIbW9kZSA/IExfMjQgOiBMXzE2KQotaW50IGJzaXplID0gTF84OwkJLyogZGVmYXVsdCBicmFuY2ggZGlzcGxhY2VtZW50ICovCi0KLQotdm9pZAotaDgzMDBobW9kZSAoKQotewotICBIbW9kZSA9IDE7Ci0gIFNtb2RlID0gMDsKLX0KLQotdm9pZAotaDgzMDBzbW9kZSAoKQotewotICBTbW9kZSA9IDE7Ci0gIEhtb2RlID0gMTsKLX0KLXZvaWQKLXNicmFuY2ggKHNpemUpCi0gICAgIGludCBzaXplOwotewotICBic2l6ZSA9IHNpemU7Ci19Ci0KLXN0YXRpYyB2b2lkIHBpbnQgKCkKLXsKLSAgY29ucyAoSG1vZGUgPyA0IDogMik7Ci19Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0KLSAgeyJoODMwMGgiLCBoODMwMGhtb2RlLCAwfSwKLSAgeyJoODMwMHMiLCBoODMwMHNtb2RlLCAwfSwKLSAgeyJzYnJhbmNoIiwgc2JyYW5jaCwgTF84fSwKLSAgeyJsYnJhbmNoIiwgc2JyYW5jaCwgTF8xNn0sCi0KLSAgeyJpbnQiLCBwaW50LCAwfSwKLSAgeyJkYXRhLmIiLCBjb25zLCAxfSwKLSAgeyJkYXRhLnciLCBjb25zLCAyfSwKLSAgeyJkYXRhLmwiLCBjb25zLCA0fSwKLSAgeyJmb3JtIiwgbGlzdGluZ19wc2l6ZSwgMH0sCi0gIHsiaGVhZGluZyIsIGxpc3RpbmdfdGl0bGUsIDB9LAotICB7ImltcG9ydCIsIHNfaWdub3JlLCAwfSwKLSAgeyJwYWdlIiwgbGlzdGluZ19lamVjdCwgMH0sCi0gIHsicHJvZ3JhbSIsIHNfaWdub3JlLCAwfSwKLSAgezAsIDAsIDB9Ci19OwotCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZTsKLQotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wY29kZV9oYXNoX2NvbnRyb2w7CS8qIE9wY29kZSBtbmVtb25pY3MgKi8KLQotLyoKLSAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIFRoaXMgc2hvdWxkCi0gIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjIHRoYXQgdGhlIE1EIHBhcnQgb2YgdGhlIGFzc2VtYmxlciBuZWVkcwotICAqLwotCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIHN0cnVjdCBoOF9vcGNvZGUgKm9wY29kZTsKLSAgY2hhciBwcmV2X2J1ZmZlclsxMDBdOwotICBpbnQgaWR4ID0gMDsKLQotICBvcGNvZGVfaGFzaF9jb250cm9sID0gaGFzaF9uZXcgKCk7Ci0gIHByZXZfYnVmZmVyWzBdID0gMDsKLQotICBmb3IgKG9wY29kZSA9IGg4X29wY29kZXM7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCi0gICAgewotICAgICAgLyogU3RyaXAgb2ZmIGFueSAuIHBhcnQgd2hlbiBpbnNlcnRpbmcgdGhlIG9wY29kZSBhbmQgb25seSBlbnRlcgotICAgICAgICAgdW5pcXVlIGNvZGVzIGludG8gdGhlIGhhc2ggdGFibGUKLSAgICAgICAgICovCi0gICAgICBjaGFyICpzcmMgPSBvcGNvZGUtPm5hbWU7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuID0gc3RybGVuIChzcmMpOwotICAgICAgY2hhciAqZHN0ID0gbWFsbG9jIChsZW4gKyAxKTsKLSAgICAgIGNoYXIgKmJ1ZmZlciA9IGRzdDsKLQotICAgICAgb3Bjb2RlLT5zaXplID0gMDsKLSAgICAgIHdoaWxlICgqc3JjKQotCXsKLQkgIGlmICgqc3JjID09ICcuJykKLQkgICAgewotCSAgICAgIHNyYysrOwotCSAgICAgIG9wY29kZS0+c2l6ZSA9ICpzcmM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgICpkc3QrKyA9ICpzcmMrKzsKLQl9Ci0gICAgICAqZHN0KysgPSAwOwotICAgICAgaWYgKHN0cmNtcCAoYnVmZmVyLCBwcmV2X2J1ZmZlcikpCi0JewotCSAgaGFzaF9pbnNlcnQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIGJ1ZmZlciwgKGNoYXIgKikgb3Bjb2RlKTsKLQkgIHN0cmNweSAocHJldl9idWZmZXIsIGJ1ZmZlcik7Ci0JICBpZHgrKzsKLQl9Ci0gICAgICBvcGNvZGUtPmlkeCA9IGlkeDsKLQotCi0gICAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgKi8KLSAgICAgIG9wY29kZS0+bm9wZXJhbmRzID0gMDsKLSAgICAgIHdoaWxlIChvcGNvZGUtPmFyZ3MubmliW29wY29kZS0+bm9wZXJhbmRzXSAhPSBFKQotCW9wY29kZS0+bm9wZXJhbmRzKys7Ci0gICAgICAvKiBGaW5kIHRoZSBsZW5ndGggb2YgdGhlIG9wY29kZSBpbiBieXRlcyAqLwotICAgICAgb3Bjb2RlLT5sZW5ndGggPSAwOwotICAgICAgd2hpbGUgKG9wY29kZS0+ZGF0YS5uaWJbb3Bjb2RlLT5sZW5ndGggKiAyXSAhPSBFKQotCW9wY29kZS0+bGVuZ3RoKys7Ci0gICAgfQotCi0gIGxpbmtyZWxheCA9IDE7Ci19Ci0KLQotc3RydWN0IGg4X2V4cAotewotICBjaGFyICplX2JlZzsKLSAgY2hhciAqZV9lbmQ7Ci0gIGV4cHJlc3Npb25TIGVfZXhwOwotfTsKLWludCBkaXNwcmVnOwotaW50IG9wc2l6ZTsJCQkvKiBTZXQgd2hlbiBhIHJlZ2lzdGVyIHNpemUgaXMgc2VlbiAqLwotCi0KLXN0cnVjdCBoOF9vcAotewotICBvcF90eXBlIG1vZGU7Ci0gIHVuc2lnbmVkIHJlZzsKLSAgZXhwcmVzc2lvblMgZXhwOwotfTsKLQotLyoKLSAgcGFyc2Ugb3BlcmFuZHMKLSAgV1JFRyByMCxyMSxyMixyMyxyNCxyNSxyNixyNyxmcCxzcAotICByMGwscjBoLC4ucjdsLHI3aAotICBAV1JFRwotICBAV1JFRysKLSAgQC1XUkVHCi0gICNjb25zdAotICBjY3IKLSovCi0KLS8qIHRyeSBhbmQgcGFyc2UgYSByZWcgbmFtZSwgcmV0dXJucyBudW1iZXIgb2YgY2hhcnMgY29uc3VtZWQgKi8KLWludAotcGFyc2VfcmVnIChzcmMsIG1vZGUsIHJlZywgZGlyZWN0aW9uKQotICAgICBjaGFyICpzcmM7Ci0gICAgIG9wX3R5cGUgKm1vZGU7Ci0gICAgIHVuc2lnbmVkIGludCAqcmVnOwotICAgICBpbnQgZGlyZWN0aW9uOwotCi17Ci0gIGNoYXIgKmVuZDsKLSAgaW50IGxlbjsKLQotICAvKiBDcmliYmVkIGZyb20gZ2V0X3N5bWJvbF9lbmQoKS4gICovCi0gIGlmICghaXNfbmFtZV9iZWdpbm5lciAoKnNyYykgfHwgKnNyYyA9PSAnXDAwMScpCi0gICAgcmV0dXJuIDA7Ci0gIGVuZCA9IHNyYysxOwotICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lICgqZW5kKSB8fCAqZW5kID09ICdcMDAxJykKLSAgICBlbmQrKzsKLSAgbGVuID0gZW5kIC0gc3JjOwotCi0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncCcpCi0gICAgewotICAgICAgKm1vZGUgPSBQU0laRSB8IFJFRyB8IGRpcmVjdGlvbjsKLSAgICAgICpyZWcgPSA3OwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMyAmJiBzcmNbMF0gPT0gJ2MnICYmIHNyY1sxXSA9PSAnYycgJiYgc3JjWzJdID09ICdyJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IENDUjsKLSAgICAgICpyZWcgPSAwOwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMyAmJiBzcmNbMF0gPT0gJ2UnICYmIHNyY1sxXSA9PSAneCcgJiYgc3JjWzJdID09ICdyJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IEVYUjsKLSAgICAgICpyZWcgPSAwOwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ2YnICYmIHNyY1sxXSA9PSAncCcpCi0gICAgewotICAgICAgKm1vZGUgPSBQU0laRSB8IFJFRyB8IGRpcmVjdGlvbjsKLSAgICAgICpyZWcgPSA2OwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMyAmJiBzcmNbMF0gPT0gJ2UnICYmIHNyY1sxXSA9PSAncicKLSAgICAgICYmIHNyY1syXSA+PSAnMCcgJiYgc3JjWzJdIDw9ICc3JykKLSAgICB7Ci0gICAgICAqbW9kZSA9IExfMzIgfCBSRUcgfCBkaXJlY3Rpb247Ci0gICAgICAqcmVnID0gc3JjWzJdIC0gJzAnOwotICAgICAgaWYgKCFIbW9kZSkKLQlhc193YXJuIChfKCJSZWcgbm90IHZhbGlkIGZvciBIOC8zMDAiKSk7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAnZScgJiYgc3JjWzFdID49ICcwJyAmJiBzcmNbMV0gPD0gJzcnKQotICAgIHsKLSAgICAgICptb2RlID0gTF8xNiB8IFJFRyB8IGRpcmVjdGlvbjsKLSAgICAgICpyZWcgPSBzcmNbMV0gLSAnMCcgKyA4OwotICAgICAgaWYgKCFIbW9kZSkKLQlhc193YXJuIChfKCJSZWcgbm90IHZhbGlkIGZvciBIOC8zMDAiKSk7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdyJykKLSAgICB7Ci0gICAgICBpZiAoc3JjWzFdID49ICcwJyAmJiBzcmNbMV0gPD0gJzcnKQotCXsKLQkgIGlmIChsZW4gPT0gMyAmJiBzcmNbMl0gPT0gJ2wnKQotCSAgICB7Ci0JICAgICAgKm1vZGUgPSBMXzggfCBSRUcgfCBkaXJlY3Rpb247Ci0JICAgICAgKnJlZyA9IChzcmNbMV0gLSAnMCcpICsgODsKLQkgICAgICByZXR1cm4gbGVuOwotCSAgICB9Ci0JICBpZiAobGVuID09IDMgJiYgc3JjWzJdID09ICdoJykKLQkgICAgewotCSAgICAgICptb2RlID0gTF84IHwgUkVHIHwgZGlyZWN0aW9uOwotCSAgICAgICpyZWcgPSAoc3JjWzFdIC0gJzAnKTsKLQkgICAgICByZXR1cm4gbGVuOwotCSAgICB9Ci0JICBpZiAobGVuID09IDIpCi0JICAgIHsKLQkgICAgICAqbW9kZSA9IExfMTYgfCBSRUcgfCBkaXJlY3Rpb247Ci0JICAgICAgKnJlZyA9IChzcmNbMV0gLSAnMCcpOwotCSAgICAgIHJldHVybiBsZW47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1jaGFyICoKLXBhcnNlX2V4cCAocywgb3ApCi0gICAgIGNoYXIgKnM7Ci0gICAgIGV4cHJlc3Npb25TICogb3A7Ci17Ci0gIGNoYXIgKnNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoYXIgKm5ldzsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotICBleHByZXNzaW9uIChvcCk7Ci0gIGlmIChvcC0+WF9vcCA9PSBPX2Fic2VudCkKLSAgICBhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKLSAgbmV3ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgY2hhciAqCi1za2lwX2NvbG9udGhpbmcgKHB0ciwgZXhwLCBtb2RlKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIGludCAqbW9kZTsKLXsKLSAgaWYgKCpwdHIgPT0gJzonKQotICAgIHsKLSAgICAgIHB0cisrOwotICAgICAgKm1vZGUgJj0gflNJWkU7Ci0gICAgICBpZiAoKnB0ciA9PSAnOCcpCi0JewotCSAgcHRyKys7Ci0JICAvKiBmZiBmaWxsIGFueSA4IGJpdCBxdWFudGl0eSAqLwotCSAvKiBleHAtPlhfYWRkX251bWJlciAtPSAweDEwMDsqLwotCSAgKm1vZGUgfD0gTF84OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKnB0ciA9PSAnMicpCi0JICAgIHsKLQkgICAgICAqbW9kZSB8PSBMXzI0OwotCSAgICB9Ci0JICBlbHNlIGlmICgqcHRyID09ICczJykKLQkgICAgewotCSAgICAgICptb2RlIHw9IExfMzI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpwdHIgPT0gJzEnKQotCSAgICB7Ci0JICAgICAgKm1vZGUgfD0gTF8xNjsKLQkgICAgfQotCSAgd2hpbGUgKGlzZGlnaXQgKCpwdHIpKQotCSAgICBwdHIrKzsKLQl9Ci0gICAgfQotICByZXR1cm4gcHRyOwotfQotCi0vKiBUaGUgbWFueSBmb3JtcyBvZiBvcGVyYW5kOgotCi0gICBSbgkJCVJlZ2lzdGVyIGRpcmVjdAotICAgQFJuCQkJUmVnaXN0ZXIgaW5kaXJlY3QKLSAgIEAoZXhwWzoxNl0sIFJuKQlSZWdpc3RlciBpbmRpcmVjdCB3aXRoIGRpc3BsYWNlbWVudAotICAgQFJuKwotICAgQC1SbgotICAgQGFhOjgJCQlhYnNvbHV0ZSA4IGJpdAotICAgQGFhOjE2CQkJYWJzb2x1dGUgMTYgYml0Ci0gICBAYWEJCQlhYnNvbHV0ZSAxNiBiaXQKLQotICAgI3h4WzpzaXplXQkJaW1tZWRpYXRlIGRhdGEKLSAgIEAoZXhwOls4XSwgcGMpCQlwYyByZWwKLSAgIEBAYWFbOjhdCQltZW1vcnkgaW5kaXJlY3QKLQotICAgKi8KLQotY2hhciAqCi1jb2xvbm1vZDI0IChvcCwgc3JjKQotICAgICBzdHJ1Y3QgaDhfb3AgKm9wOwotICAgICBjaGFyICpzcmM7Ci0KLXsKLSAgaW50IG1vZGUgPSAwOwotICBzcmMgPSBza2lwX2NvbG9udGhpbmcgKHNyYywgJm9wLT5leHAsICZtb2RlKTsKLQotICBpZiAoIW1vZGUpCi0gICAgewotICAgICAgLyogQ2hvb3NlIGEgZGVmYXVsdCBtb2RlICovCi0gICAgICBpZiAob3AtPmV4cC5YX2FkZF9udW1iZXIgPCAtMzI3NjgKLQkgIHx8IG9wLT5leHAuWF9hZGRfbnVtYmVyID4gMzI3NjcpCi0JewotCSAgaWYgKEhtb2RlKQotCSAgICBtb2RlID0gTF8yNDsKLQkgIGVsc2UKLQkgICAgbW9kZSA9IExfMTY7Ci0JfQotICAgICAgZWxzZSBpZiAob3AtPmV4cC5YX2FkZF9zeW1ib2wKLQkgICAgICAgfHwgb3AtPmV4cC5YX29wX3N5bWJvbCkKLQltb2RlID0gRFNZTU1PREU7Ci0gICAgICBlbHNlCi0JbW9kZSA9IERNT0RFOwotICAgIH0KLSAgb3AtPm1vZGUgfD0gbW9kZTsKLSAgcmV0dXJuIHNyYzsKLQotfQotCi0KLXN0YXRpYyB2b2lkCi1nZXRfb3BlcmFuZCAocHRyLCBvcCwgZHN0LCBkaXJlY3Rpb24pCi0gICAgIGNoYXIgKipwdHI7Ci0gICAgIHN0cnVjdCBoOF9vcCAqb3A7Ci0gICAgIHVuc2lnbmVkIGludCBkc3Q7Ci0gICAgIGludCBkaXJlY3Rpb247Ci17Ci0gIGNoYXIgKnNyYyA9ICpwdHI7Ci0gIG9wX3R5cGUgbW9kZTsKLSAgdW5zaWduZWQgaW50IG51bTsKLSAgdW5zaWduZWQgaW50IGxlbjsKLQotICBvcC0+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+bm9wZXJhbmRzOyBhcmduKyspCi0JewotCSAgc3dpdGNoIChvcGNvZGUtPmFyZ3MubmliW2FyZ25dKQotCSAgICB7Ci0JICAgIGNhc2UgUkQxNjoKLQkgICAgICBpZiAob3BlcmFuZFthcmduXS5tb2RlICE9IFJEMTYpCi0JCXsKLQkJICBhc19iYWQgKF8oImRlc3RpbmF0aW9uIG9wZXJhbmQgbXVzdCBiZSAxNiBiaXQgcmVnaXN0ZXIiKSk7Ci0JCSAgcmV0dXJuOwotCi0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJTODoKLQotCSAgICAgIGlmIChvcGVyYW5kW2FyZ25dLm1vZGUgIT0gUlM4KQotCQl7Ci0JCSAgYXNfYmFkIChfKCJzb3VyY2Ugb3BlcmFuZCBtdXN0IGJlIDggYml0IHJlZ2lzdGVyIikpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQUJTMTZEU1Q6Ci0JICAgICAgaWYgKG9wZXJhbmRbYXJnbl0ubW9kZSAhPSBBQlMxNkRTVCkKLQkJewotCQkgIGFzX2JhZCAoXygiZGVzdGluYXRpb24gb3BlcmFuZCBtdXN0IGJlIDE2Yml0IGFic29sdXRlIGFkZHJlc3MiKSk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkQ4OgotCSAgICAgIGlmIChvcGVyYW5kW2FyZ25dLm1vZGUgIT0gUkQ4KQotCQl7Ci0JCSAgYXNfYmFkIChfKCJkZXN0aW5hdGlvbiBvcGVyYW5kIG11c3QgYmUgOCBiaXQgcmVnaXN0ZXIiKSk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQotCSAgICBjYXNlIEFCUzE2U1JDOgotCSAgICAgIGlmIChvcGVyYW5kW2FyZ25dLm1vZGUgIT0gQUJTMTZTUkMpCi0JCXsKLQkJICBhc19iYWQgKF8oInNvdXJjZSBvcGVyYW5kIG11c3QgYmUgMTZiaXQgYWJzb2x1dGUgYWRkcmVzcyIpKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICB9Ci0JfQotICAgIH0KLSAgYXNfYmFkIChfKCJpbnZhbGlkIG9wZXJhbmRzIikpOwotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jaXRvbiBpcyBzdXBwb3NlZCB0byBlbWl0Ci0gICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLgotICAgKi8KLQotCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqb3Bfc3RhcnQ7Ci0gIGNoYXIgKm9wX2VuZDsKLSAgc3RydWN0IGg4X29wIG9wZXJhbmRbMl07Ci0gIHN0cnVjdCBoOF9vcGNvZGUgKm9wY29kZTsKLSAgc3RydWN0IGg4X29wY29kZSAqcHJldl9vcGNvZGU7Ci0KLSAgY2hhciAqZG90ID0gMDsKLSAgY2hhciBjOwotICBpbnQgc2l6ZTsKLQotICAvKiBEcm9wIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgLyogZmluZCB0aGUgb3AgY29kZSBlbmQgKi8KLSAgZm9yIChvcF9zdGFydCA9IG9wX2VuZCA9IHN0cjsKLSAgICAgICAqb3BfZW5kICE9IDAgJiYgKm9wX2VuZCAhPSAnICc7Ci0gICAgICAgb3BfZW5kKyspCi0gICAgewotICAgICAgaWYgKCpvcF9lbmQgPT0gJy4nKQotCXsKLQkgIGRvdCA9IG9wX2VuZCArIDE7Ci0JICAqb3BfZW5kID0gMDsKLQkgIG9wX2VuZCArPSAyOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICA7Ci0KLSAgaWYgKG9wX2VuZCA9PSBvcF9zdGFydCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImNhbid0IGZpbmQgb3Bjb2RlICIpKTsKLSAgICB9Ci0gIGMgPSAqb3BfZW5kOwotCi0gICpvcF9lbmQgPSAwOwotCi0gIG9wY29kZSA9IChzdHJ1Y3QgaDhfb3Bjb2RlICopIGhhc2hfZmluZCAob3Bjb2RlX2hhc2hfY29udHJvbCwKLQkJCQkJICAgb3Bfc3RhcnQpOwotCi0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInVua25vd24gb3Bjb2RlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBXZSB1c2UgdG8gc2V0IGlucHV0X2xpbmVfcG9pbnRlciB0byB0aGUgcmVzdWx0IG9mIGdldF9vcGVyYW5kcywKLSAgICAgYnV0IHRoYXQgaXMgd3JvbmcuICBPdXIgY2FsbGVyIGFzc3VtZXMgd2UgZG9uJ3QgY2hhbmdlIGl0LiAgKi8KLQotICAodm9pZCkgZ2V0X29wZXJhbmRzIChvcGNvZGUtPm5vcGVyYW5kcywgb3BfZW5kLCBvcGVyYW5kKTsKLSAgKm9wX2VuZCA9IGM7Ci0gIHByZXZfb3Bjb2RlID0gb3Bjb2RlOwotCi0gIHNpemUgPSBTTjsKLSAgaWYgKGRvdCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCpkb3QpCi0JewotCWNhc2UgJ2InOgotCSAgc2l6ZSA9IFNCOwotCSAgYnJlYWs7Ci0KLQljYXNlICd3JzoKLQkgIHNpemUgPSBTVzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnbCc6Ci0JICBzaXplID0gU0w7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBvcGNvZGUgPSBnZXRfc3BlY2lmaWMgKG9wY29kZSwgb3BlcmFuZCwgc2l6ZSk7Ci0KLSAgaWYgKG9wY29kZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIENvdWxkbid0IGZpbmQgYW4gb3Bjb2RlIHdoaWNoIG1hdGNoZWQgdGhlIG9wZXJhbmRzICovCi0gICAgICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMik7Ci0KLSAgICAgIHdoZXJlWzBdID0gMHgwOwotICAgICAgd2hlcmVbMV0gPSAweDA7Ci0gICAgICBjbGV2ZXJfbWVzc2FnZSAocHJldl9vcGNvZGUsIG9wZXJhbmQpOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAob3Bjb2RlLT5zaXplICYmIGRvdCkKLSAgICB7Ci0gICAgICBpZiAob3Bjb2RlLT5zaXplICE9ICpkb3QpCi0JewotCSAgYXNfd2FybiAoXygibWlzbWF0Y2ggYmV0d2VlbiBvcGNvZGUgc2l6ZSBhbmQgb3BlcmFuZCBzaXplIikpOwotCX0KLSAgICB9Ci0KLSAgYnVpbGRfYnl0ZXMgKG9wY29kZSwgb3BlcmFuZCk7Ci0KLX0KLQotdm9pZAotdGNfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKQotICAgICBvYmplY3RfaGVhZGVycyAqIGhlYWRlcnM7Ci17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19jcmF3bF9zeW1ib2xfY2hhaW4gXG4iKSk7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLXRjX2hlYWRlcnNfaG9vayAoaGVhZGVycykKLSAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzOwotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfaGVhZGVyc19ob29rIFxuIikpOwotfQotCi0vKiBWYXJpb3VzIHJvdXRpbmVzIHRvIGtpbGwgb25lIGRheSAqLwotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAgICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLSAgY2hhciAqYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotfQotDAotdm9pZAotdGNfYW91dF9maXhfdG9fY2hhcnMgKCkKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2FvdXRfZml4X3RvX2NoYXJzIFxuIikpOwotICBhYm9ydCAoKTsKLX0KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWc7Ci0gICAgIGZyYWdTICpmcmFnUDsKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIG1kX2NvbnZlcnRfZnJhZyBcbiIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLXZhbHVlVCAKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgc2l6ZSkKLSAgICAgc2VnVCBzZWc7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICByZXR1cm4gKChzaXplICsgKDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkgLSAxKSAmICgtMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSk7Ci0KLX0KLQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotewotICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0KLSAgc3dpdGNoIChmaXhQLT5meF9zaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAyNCk7Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDE2KTsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudF90eXBlOwotewotICBwcmludGYgKF8oImNhbGwgdG9tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBcbiIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFB1dCBudW1iZXIgaW50byB0YXJnZXQgYnl0ZSBvcmRlciAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgdXNlLCBuYnl0ZXMpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgdmFsdWVUIHVzZTsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAocHRyLCB1c2UsIG5ieXRlcyk7Ci19Ci1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBhYm9ydCAoKTsKLX0KLQotCi12b2lkCi10Y19yZWxvY19tYW5nbGUgKGZpeF9wdHIsIGludHIsIGJhc2UpCi0gICAgIGZpeFMgKmZpeF9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50cjsKLSAgICAgYmZkX3ZtYSBiYXNlOwotCi17Ci0gIHN5bWJvbFMgKnN5bWJvbF9wdHI7Ci0KLSAgc3ltYm9sX3B0ciA9IGZpeF9wdHItPmZ4X2FkZHN5OwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyBhdHRhY2hlZCB0byBhIHN5bWJvbCB0aGVuIGl0J3Mgb2sKLSAgICAgdG8gb3V0cHV0IGl0ICovCi0gIGlmIChmaXhfcHRyLT5meF9yX3R5cGUgPT0gVENfQ09OU19SRUxPQykKLSAgICB7Ci0gICAgICAvKiBjb25zIGxpa2VzIHRvIGNyZWF0ZSByZWxvYzMyJ3Mgd2hhdGV2ZXIgdGhlIHNpemUgb2YgdGhlIHJlbG9jLi4KLSAgICAgICAqLwotICAgICAgc3dpdGNoIChmaXhfcHRyLT5meF9zaXplKQotCXsKLQljYXNlIDQ6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX1JFTExPTkc7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX1JFTFdPUkQ7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX1JFTEJZVEU7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0KLQl9Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRyLT5yX3R5cGUgPSBmaXhfcHRyLT5meF9yX3R5cGU7Ci0gICAgfQotCi0gIGludHItPnJfdmFkZHIgPSBmaXhfcHRyLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4X3B0ci0+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+Znhfc3Vic3kpCi0jZGVmaW5lIElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTCi0KLSNkZWZpbmUgVENfUkVMT0NfTUFOR0xFKHMsYSxiLGMpIHRjX3JlbG9jX21hbmdsZShhLGIsYykKLWV4dGVybiB2b2lkIHRjX3JlbG9jX21hbmdsZQotICBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBiZmRfdm1hKSk7Ci0KLSNkZWZpbmUgRE9fTk9UX1NUUklQIDAKLSNkZWZpbmUgTElTVElOR19IRUFERVIgIkhpdGFjaGkgSDgvNTAwIEdBUyAiCi0jZGVmaW5lIE5FRURfRlhfUl9UWVBFIDEKLSNkZWZpbmUgUkVMT0NfMzIgMTIzNAotCi0jZGVmaW5lIFRDX1NUQVJUX0xBQkVMKGNoLCBwdHIpICAoY2ggPT0gJzonICYmIHN0YXJ0X2xhYmVsKHB0cikpCi0jZGVmaW5lIFRDX0NPRkZfU0laRU1BQ0hERVAoZnJhZykgdGNfY29mZl9zaXplbWFjaGRlcChmcmFnKQotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotLyogZW5kIG9mIHRjLWg4NTAwLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaHBwYS5jIGIvZ2FzL2NvbmZpZy90Yy1ocHBhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjUzMmMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1ocHBhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzE2ICswLDAgQEAKLS8qIHRjLWhwcGEuYyAtLSBBc3NlbWJsZSBmb3IgdGhlIFBBCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBIUCBQQS1SSVNDIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UKLSAgIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWguICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLSNpbmNsdWRlICJiZmQvbGliaHBwYS5oIgotI2luY2x1ZGUgImJmZC9saWJiZmQuaCIKLQotLyogQmUgY2FyZWZ1bCwgdGhpcyBmaWxlIGluY2x1ZGVzIGRhdGEgKmRlY2xhcmF0aW9ucyouICAqLwotI2luY2x1ZGUgIm9wY29kZS9ocHBhLmgiCi0KLS8qIEEgImNvbnZpZW50IiBwbGFjZSB0byBwdXQgb2JqZWN0IGZpbGUgZGVwZW5kZW5jaWVzIHdoaWNoIGRvCi0gICBub3QgbmVlZCB0byBiZSBzZWVuIG91dHNpZGUgb2YgdGMtaHBwYS5jLiAgKi8KLSNpZmRlZiBPQkpfRUxGCi0vKiBOYW1lcyBvZiB2YXJpb3VzIGRlYnVnZ2luZyBzcGFjZXMvc3Vic3BhY2VzLiAgKi8KLSNkZWZpbmUgR0RCX0RFQlVHX1NQQUNFX05BTUUgIi5zdGFiIgotI2RlZmluZSBHREJfU1RSSU5HU19TVUJTUEFDRV9OQU1FICIuc3RhYnN0ciIKLSNkZWZpbmUgR0RCX1NZTUJPTFNfU1VCU1BBQ0VfTkFNRSAiLnN0YWIiCi0jZGVmaW5lIFVOV0lORF9TRUNUSU9OX05BTUUgIi5QQVJJU0MudW53aW5kIgotLyogTm9uemVybyBpZiBDT0RFIGlzIGEgZml4dXAgY29kZSBuZWVkaW5nIGZ1cnRoZXIgcHJvY2Vzc2luZy4gICovCi0KLS8qIE9iamVjdCBmaWxlIGZvcm1hdHMgc3BlY2lmeSByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLXR5cGVkZWYgZWxmMzJfaHBwYV9yZWxvY190eXBlIHJlbG9jX3R5cGU7Ci0KLS8qIE9iamVjdCBmaWxlIGZvcm1hdHMgc3BlY2lmeSBCRkQgc3ltYm9sIHR5cGVzLiAgKi8KLXR5cGVkZWYgZWxmX3N5bWJvbF90eXBlIG9ial9zeW1ib2xfdHlwZTsKLQotLyogSG93IHRvIGdlbmVyYXRlIGEgcmVsb2NhdGlvbi4gICovCi0jZGVmaW5lIGhwcGFfZ2VuX3JlbG9jX3R5cGUgaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUKLQotLyogRUxGIG9iamVjdHMgY2FuIGhhdmUgdmVyc2lvbnMsIGJ1dCBhcHBhcmVudGx5IGRvIG5vdCBoYXZlIGFueXdoZXJlCi0gICB0byBzdG9yZSBhIGNvcHlyaWdodCBzdHJpbmcuICAqLwotI2RlZmluZSBvYmpfdmVyc2lvbiBvYmpfZWxmX3ZlcnNpb24KLSNkZWZpbmUgb2JqX2NvcHlyaWdodCBvYmpfZWxmX3ZlcnNpb24KLQotLyogVXNlIHNwYWNlIGFsaWFzZXMuICAqLwotI2RlZmluZSBVU0VfQUxJQVNFUyAxCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9TT00KLS8qIE5hbWVzIG9mIHZhcmlvdXMgZGVidWdnaW5nIHNwYWNlcy9zdWJzcGFjZXMuICAqLwotI2RlZmluZSBHREJfREVCVUdfU1BBQ0VfTkFNRSAiJEdEQl9ERUJVRyQiCi0jZGVmaW5lIEdEQl9TVFJJTkdTX1NVQlNQQUNFX05BTUUgIiRHREJfU1RSSU5HUyQiCi0jZGVmaW5lIEdEQl9TWU1CT0xTX1NVQlNQQUNFX05BTUUgIiRHREJfU1lNQk9MUyQiCi0jZGVmaW5lIFVOV0lORF9TRUNUSU9OX05BTUUgIiRVTldJTkQkIgotCi0vKiBPYmplY3QgZmlsZSBmb3JtYXRzIHNwZWNpZnkgcmVsb2NhdGlvbiB0eXBlcy4gICovCi10eXBlZGVmIGludCByZWxvY190eXBlOwotCi0vKiBTT00gb2JqZWN0cyBjYW4gaGF2ZSBib3RoIGEgdmVyc2lvbiBzdHJpbmcgYW5kIGEgY29weXJpZ2h0IHN0cmluZy4gICovCi0jZGVmaW5lIG9ial92ZXJzaW9uIG9ial9zb21fdmVyc2lvbgotI2RlZmluZSBvYmpfY29weXJpZ2h0IG9ial9zb21fY29weXJpZ2h0Ci0KLS8qIERvIG5vdCB1c2Ugc3BhY2UgYWxpYXNlcy4gICovCi0jZGVmaW5lIFVTRV9BTElBU0VTIDAKLQotLyogSG93IHRvIGdlbmVyYXRlIGEgcmVsb2NhdGlvbi4gICovCi0jZGVmaW5lIGhwcGFfZ2VuX3JlbG9jX3R5cGUgaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUKLQotLyogT2JqZWN0IGZpbGUgZm9ybWF0cyBzcGVjaWZ5IEJGRCBzeW1ib2wgdHlwZXMuICAqLwotdHlwZWRlZiBzb21fc3ltYm9sX3R5cGUgb2JqX3N5bWJvbF90eXBlOwotCi0vKiBUaGlzIGFwcGFyZW50bHkgaXNuJ3QgaW4gb2xkZXIgdmVyc2lvbnMgb2YgaHB1eCByZWxvYy5oLiAgKi8KLSNpZm5kZWYgUl9ETFRfUkVMCi0jZGVmaW5lIFJfRExUX1JFTCAweDc4Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFJfTjBTRUwKLSNkZWZpbmUgUl9OMFNFTCAweGQ4Ci0jZW5kaWYKLQotI2lmbmRlZiBSX04xU0VMCi0jZGVmaW5lIFJfTjFTRUwgMHhkOQotI2VuZGlmCi0KLS8qIFZhcmlvdXMgc3RydWN0dXJlcyBhbmQgdHlwZXMgdXNlZCBpbnRlcm5hbGx5IGluIHRjLWhwcGEuYy4gICovCi0KLS8qIFVud2luZCB0YWJsZSBhbmQgZGVzY3JpcHRvci4gIEZJWE1FOiBTeW5jIHRoaXMgd2l0aCBHREIgdmVyc2lvbi4gICovCi0KLXN0cnVjdCB1bndpbmRfZGVzYwotICB7Ci0gICAgdW5zaWduZWQgaW50IGNhbm5vdF91bndpbmQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgbWlsbGljb2RlOjE7Ci0gICAgdW5zaWduZWQgaW50IG1pbGxpY29kZV9zYXZlX3Jlc3Q6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVnaW9uX2Rlc2M6MjsKLSAgICB1bnNpZ25lZCBpbnQgc2F2ZV9zcjoyOwotICAgIHVuc2lnbmVkIGludCBlbnRyeV9mcjo0OwotICAgIHVuc2lnbmVkIGludCBlbnRyeV9ncjo1OwotICAgIHVuc2lnbmVkIGludCBhcmdzX3N0b3JlZDoxOwotICAgIHVuc2lnbmVkIGludCBjYWxsX2ZyOjU7Ci0gICAgdW5zaWduZWQgaW50IGNhbGxfZ3I6NTsKLSAgICB1bnNpZ25lZCBpbnQgc2F2ZV9zcDoxOwotICAgIHVuc2lnbmVkIGludCBzYXZlX3JwOjE7Ci0gICAgdW5zaWduZWQgaW50IHNhdmVfcnBfaW5fZnJhbWU6MTsKLSAgICB1bnNpZ25lZCBpbnQgZXh0bl9wdHJfZGVmaW5lZDoxOwotICAgIHVuc2lnbmVkIGludCBjbGVhbnVwX2RlZmluZWQ6MTsKLQotICAgIHVuc2lnbmVkIGludCBocGVfaW50ZXJydXB0X21hcmtlcjoxOwotICAgIHVuc2lnbmVkIGludCBocHV4X2ludGVycnVwdF9tYXJrZXI6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQ6MzsKLSAgICB1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZToyNzsKLSAgfTsKLQotc3RydWN0IHVud2luZF90YWJsZQotICB7Ci0gICAgLyogU3RhcnRpbmcgYW5kIGVuZGluZyBvZmZzZXRzIG9mIHRoZSByZWdpb24gZGVzY3JpYmVkIGJ5Ci0gICAgICAgZGVzY3JpcHRvci4gICovCi0gICAgdW5zaWduZWQgaW50IHN0YXJ0X29mZnNldDsKLSAgICB1bnNpZ25lZCBpbnQgZW5kX29mZnNldDsKLSAgICBzdHJ1Y3QgdW53aW5kX2Rlc2MgZGVzY3JpcHRvcjsKLSAgfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgLmNhbGxpbmZvLCAuZW50ZXIsIC5sZWF2ZSBwc2V1ZG8tb3BzIHRvCi0gICBjb250cm9sIHRoZSBlbnRyeSBhbmQgZXhpdCBjb2RlIHRoZXkgZ2VuZXJhdGUuIEl0IGlzIGFsc28gdXNlZCBpbgotICAgY3JlYXRpb24gb2YgdGhlIGNvcnJlY3Qgc3RhY2sgdW53aW5kIGRlc2NyaXB0b3JzLgotCi0gICBOT1RFOiAgR0FTIGRvZXMgbm90IHN1cHBvcnQgLmVudGVyIGFuZCAubGVhdmUgZm9yIHRoZSBnZW5lcmF0aW9uIG9mCi0gICBwcm9sb2d1ZXMgYW5kIGVwaWxvZ3Vlcy4gIEZJWE1FLgotCi0gICBUaGUgZmllbGRzIGluIHN0cnVjdHVyZSByb3VnaGx5IGNvcnJlc3BvbmQgdG8gdGhlIGFyZ3VtZW50cyBhdmFpbGFibGUgb24gdGhlCi0gICAuY2FsbGluZm8gcHNldWRvLW9wLiAgKi8KLQotc3RydWN0IGNhbGxfaW5mbwotICB7Ci0gICAgLyogVGhlIHVud2luZCBkZXNjcmlwdG9yIGJlaW5nIGJ1aWx0LiAgKi8KLSAgICBzdHJ1Y3QgdW53aW5kX3RhYmxlIGNpX3Vud2luZDsKLQotICAgIC8qIE5hbWUgb2YgdGhpcyBmdW5jdGlvbi4gICovCi0gICAgc3ltYm9sUyAqc3RhcnRfc3ltYm9sOwotCi0gICAgLyogKHRlbXBvcmFyeSkgc3ltYm9sIHVzZWQgdG8gbWFyayB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24uICAqLwotICAgIHN5bWJvbFMgKmVuZF9zeW1ib2w7Ci0KLSAgICAvKiBOZXh0IGVudHJ5IGluIHRoZSBjaGFpbi4gICovCi0gICAgc3RydWN0IGNhbGxfaW5mbyAqY2lfbmV4dDsKLSAgfTsKLQotLyogT3BlcmFuZCBmb3JtYXRzIGZvciBGUCBpbnN0cnVjdGlvbnMuICAgTm90ZSBub3QgYWxsIEZQIGluc3RydWN0aW9ucwotICAgYWxsb3cgYWxsIGZvdXIgZm9ybWF0cyB0byBiZSB1c2VkIChmb3IgZXhhbXBsZSBmbXB5c3ViIG9ubHkgYWxsb3dzCi0gICBTR0wgYW5kIERCTCkuICAqLwotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBTR0wsIERCTCwgSUxMRUdBTF9GTVQsIFFVQUQsIFcsIFVXLCBEVywgVURXLCBRVywgVVFXCi0gIH0KLWZwX29wZXJhbmRfZm9ybWF0OwotCi0vKiBUaGlzIGZ1bGx5IGRlc2NyaWJlcyB0aGUgc3ltYm9sIHR5cGVzIHdoaWNoIG1heSBiZSBhdHRhY2hlZCB0bwotICAgYW4gRVhQT1JUIG9yIElNUE9SVCBkaXJlY3RpdmUuICBPbmx5IFNPTSB1c2VzIHRoaXMgZm9ybWF0aW9uCi0gICAoRUxGIGhhcyBubyBuZWVkIGZvciBpdCkuICAqLwotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBTWU1CT0xfVFlQRV9VTktOT1dOLAotICAgIFNZTUJPTF9UWVBFX0FCU09MVVRFLAotICAgIFNZTUJPTF9UWVBFX0NPREUsCi0gICAgU1lNQk9MX1RZUEVfREFUQSwKLSAgICBTWU1CT0xfVFlQRV9FTlRSWSwKLSAgICBTWU1CT0xfVFlQRV9NSUxMSUNPREUsCi0gICAgU1lNQk9MX1RZUEVfUExBQkVMLAotICAgIFNZTUJPTF9UWVBFX1BSSV9QUk9HLAotICAgIFNZTUJPTF9UWVBFX1NFQ19QUk9HLAotICB9Ci1wYV9zeW1ib2xfdHlwZTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGFzc2VtYmxlCi0gICBpbmRpdmlkdWFsIGluc3RydWN0aW9ucy4gICovCi1zdHJ1Y3QgcGFfaXQKLSAgewotICAgIC8qIEhvbGRzIHRoZSBvcGNvZGUgYWZ0ZXIgcGFyc2luZyBieSBwYV9pcC4gICovCi0gICAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0KLSAgICAvKiBIb2xkcyBhbiBleHByZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4gICovCi0gICAgZXhwcmVzc2lvblMgZXhwOwotCi0gICAgLyogRG9lcyB0aGlzIGluc3RydWN0aW9uIHVzZSBQQy1yZWxhdGl2ZSBhZGRyZXNzaW5nLiAgKi8KLSAgICBpbnQgcGNyZWw7Ci0KLSAgICAvKiBGbG9hdGluZyBwb2ludCBmb3JtYXRzIGZvciBvcGVyYW5kMSBhbmQgb3BlcmFuZDIuICAqLwotICAgIGZwX29wZXJhbmRfZm9ybWF0IGZwb2YxOwotICAgIGZwX29wZXJhbmRfZm9ybWF0IGZwb2YyOwotCi0KLSAgICAvKiBIb2xkcyB0aGUgZmllbGQgc2VsZWN0b3IgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24KLSAgICAgICAoZm9yIGV4YW1wbGUgTCUsIExSJSwgZXRjKS4gICovCi0gICAgbG9uZyBmaWVsZF9zZWxlY3RvcjsKLQotICAgIC8qIEhvbGRzIGFueSBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgICBpbnN0cnVjdGlvbi4gIChpbnN0cnVjdGlvbiBzaG91bGQgYmUgc29tZSBzb3J0IG9mIGNhbGwpLiAgKi8KLSAgICBsb25nIGFyZ19yZWxvYzsKLQotICAgIC8qIFRoZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCi0gICAgaW50IGZvcm1hdDsKLQotICAgIC8qIFRoZSByZWxvY2F0aW9uIChpZiBhbnkpIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RydWN0aW9uLiAgKi8KLSAgICByZWxvY190eXBlIHJlbG9jOwotICB9OwotCi0vKiBQQS04OSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgYXJlIGFycmFuZ2VkIGxpa2UgdGhpczoKLQotCi0gICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0gICB8ICAgMCBvciAxNkwgICB8ICAxNiBvciAxNlIgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0gICB8ICAgMSBvciAxN0wgICB8ICAxNyBvciAxN1IgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0gICB8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8Ci0KLSAgIC4gICAgICAgICAgICAgIC4gICAgICAgICAgICAgIC4KLSAgIC4gICAgICAgICAgICAgIC4gICAgICAgICAgICAgIC4KLSAgIC4gICAgICAgICAgICAgIC4gICAgICAgICAgICAgIC4KLQotICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKwotICAgfCAgMTQgb3IgMzBMICAgfCAgMzAgb3IgMzBSICAgfAotICAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKwotICAgfCAgMTUgb3IgMzFMICAgfCAgMzEgb3IgMzFSICAgfAotICAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKwotCi0KLSAgIFRoZSBmb2xsb3dpbmcgaXMgYSB2ZXJzaW9uIG9mIHBhX3BhcnNlX251bWJlciB0aGF0Ci0gICBoYW5kbGVzIHRoZSBML1Igbm90YXRpb24gYW5kIHJldHVybnMgdGhlIGNvcnJlY3QKLSAgIHZhbHVlIHRvIHB1dCBpbnRvIHRoZSBpbnN0cnVjdGlvbiByZWdpc3RlciBmaWVsZC4KLSAgIFRoZSBjb3JyZWN0IHZhbHVlIHRvIHB1dCBpbnRvIHRoZSBpbnN0cnVjdGlvbiBpcwotICAgZW5jb2RlZCBpbiB0aGUgc3RydWN0dXJlICdwYV8xMV9mcF9yZWdfc3RydWN0Jy4gICovCi0KLXN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0Ci0gIHsKLSAgICAvKiBUaGUgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLSAgICBjaGFyIG51bWJlcl9wYXJ0OwotCi0gICAgLyogTC9SIHNlbGVjdG9yLiAgKi8KLSAgICBjaGFyIGxfcl9zZWxlY3Q7Ci0gIH07Ci0KLS8qIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGJ1aWxkIGFyZ3VtZW50IHJlbG9jYXRpb24gc3R1YnMuICAqLwotc3RydWN0IGNhbGxfZGVzYwotICB7Ci0gICAgLyogVGhlIGFyZ3VtZW50IHJlbG9jYXRpb24gc3BlY2lmaWNhdGlvbi4gICovCi0gICAgdW5zaWduZWQgaW50IGFyZ19yZWxvYzsKLQotICAgIC8qIE51bWJlciBvZiBhcmd1bWVudHMuICAqLwotICAgIHVuc2lnbmVkIGludCBhcmdfY291bnQ7Ci0gIH07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gZW50cnkgaW4gdGhlIHN1YnNwYWNlIGRpY3Rpb25hcnkKLSAgIGNoYWluLiAgKi8KLQotc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4KLSAgewotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBzcGFjZSBoYXMgYmVlbiBkZWZpbmVkIGJ5IHRoZSB1c2VyIGNvZGUuICAqLwotICAgIHVuc2lnbmVkIGludCBzc2RfZGVmaW5lZDsKLQotICAgIC8qIE5hbWUgb2YgdGhpcyBzdWJzcGFjZS4gICovCi0gICAgY2hhciAqc3NkX25hbWU7Ci0KLSAgICAvKiBHQVMgc2VnbWVudCBhbmQgc3Vic2VnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWJzcGFjZS4gICovCi0gICAgYXNlY3Rpb24gKnNzZF9zZWc7Ci0gICAgaW50IHNzZF9zdWJzZWc7Ci0KLSAgICAvKiBOZXh0IHNwYWNlIGluIHRoZSBzdWJzcGFjZSBkaWN0aW9uYXJ5IGNoYWluLiAgKi8KLSAgICBzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9jaGFpbiAqc3NkX25leHQ7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4gc3NkX2NoYWluX3N0cnVjdDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBlbnRyeSBpbiB0aGUgc3Vic3BhY2UgZGljdGlvbmFyeQotICAgY2hhaW4uICAqLwotCi1zdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9jaGFpbgotICB7Ci0gICAgLyogTm9uemVybyBpZiB0aGlzIHNwYWNlIGhhcyBiZWVuIGRlZmluZWQgYnkgdGhlIHVzZXIgY29kZSBvcgotICAgICAgIGFzIGEgZGVmYXVsdCBzcGFjZS4gICovCi0gICAgdW5zaWduZWQgaW50IHNkX2RlZmluZWQ7Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgc3BhY2VzIGhhcyBiZWVuIGRlZmluZWQgYnkgdGhlIHVzZXIgY29kZS4gICovCi0gICAgdW5zaWduZWQgaW50IHNkX3VzZXJfZGVmaW5lZDsKLQotICAgIC8qIFRoZSBzcGFjZSBudW1iZXIgKG9yIGluZGV4KS4gICovCi0gICAgdW5zaWduZWQgaW50IHNkX3NwbnVtOwotCi0gICAgLyogVGhlIG5hbWUgb2YgdGhpcyBzdWJzcGFjZS4gICovCi0gICAgY2hhciAqc2RfbmFtZTsKLQotICAgIC8qIEdBUyBzZWdtZW50IHRvIHdoaWNoIHRoaXMgc3Vic3BhY2UgY29ycmVzcG9uZHMuICAqLwotICAgIGFzZWN0aW9uICpzZF9zZWc7Ci0KLSAgICAvKiBDdXJyZW50IHN1YnNlZ21lbnQgbnVtYmVyIGJlaW5nIHVzZWQuICAqLwotICAgIGludCBzZF9sYXN0X3N1YnNlZzsKLQotICAgIC8qIFRoZSBjaGFpbiBvZiBzdWJzcGFjZXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIHNwYWNlLiAgKi8KLSAgICBzc2RfY2hhaW5fc3RydWN0ICpzZF9zdWJzcGFjZXM7Ci0KLSAgICAvKiBUaGUgbmV4dCBlbnRyeSBpbiB0aGUgc3BhY2UgZGljdGlvbmFyeSBjaGFpbi4gICovCi0gICAgc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfY2hhaW4gKnNkX25leHQ7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfY2hhaW4gc2RfY2hhaW5fc3RydWN0OwotCi0vKiBTdHJ1Y3R1cmUgZm9yIHByZXZpb3VzIGxhYmVsIHRyYWNraW5nLiAgTmVlZGVkIHNvIHRoYXQgYWxpZ25tZW50cywKLSAgIGNhbGxpbmZvIGRlY2xhcmF0aW9ucywgZXRjIGNhbiBiZSBlYXNpbHkgYXR0YWNoZWQgdG8gYSBwYXJ0aWN1bGFyCi0gICBsYWJlbC4gICovCi10eXBlZGVmIHN0cnVjdCBsYWJlbF9zeW1ib2xfc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3Qgc3ltYm9sICpsc3NfbGFiZWw7Ci0gICAgc2RfY2hhaW5fc3RydWN0ICpsc3Nfc3BhY2U7Ci0gICAgc3RydWN0IGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxzc19uZXh0OwotICB9Ci1sYWJlbF9zeW1ib2xfc3RydWN0OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGF0dHJpYnV0ZXMgb2YgdGhlIGRlZmF1bHQgc3Vic3BhY2UKLSAgIGRpY3Rpb25hcnkgZW50cmllcy4gICovCi0KLXN0cnVjdCBkZWZhdWx0X3N1YnNwYWNlX2RpY3QKLSAgewotICAgIC8qIE5hbWUgb2YgdGhlIHN1YnNwYWNlLiAgKi8KLSAgICBjaGFyICpuYW1lOwotCi0gICAgLyogRklYTUUuICBJcyB0aGlzIHN0aWxsIG5lZWRlZD8gICovCi0gICAgY2hhciBkZWZpbmVkOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHN1YnNwYWNlIGlzIGxvYWRhYmxlLiAgKi8KLSAgICBjaGFyIGxvYWRhYmxlOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHN1YnNwYWNlIGNvbnRhaW5zIG9ubHkgY29kZS4gICovCi0gICAgY2hhciBjb2RlX29ubHk7Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgaXMgYSBjb21tb24gc3Vic3BhY2UuICAqLwotICAgIGNoYXIgY29tbW9uOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEgY29tbW9uIHN1YnNwYWNlIHdoaWNoIGFsbG93cyBzeW1ib2xzCi0gICAgICAgdG8gYmUgbXVsdGlwbHkgZGVmaW5lZC4gICovCi0gICAgY2hhciBkdXBfY29tbW9uOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHN1YnNwYWNlIHNob3VsZCBiZSB6ZXJvIGZpbGxlZC4gICovCi0gICAgY2hhciB6ZXJvOwotCi0gICAgLyogU29ydCBrZXkgZm9yIHRoaXMgc3Vic3BhY2UuICAqLwotICAgIHVuc2lnbmVkIGNoYXIgc29ydDsKLQotICAgIC8qIEFjY2VzcyBjb250cm9sIGJpdHMgZm9yIHRoaXMgc3Vic3BhY2UuICBDYW4gcmVwcmVzZW50IFJXWCBhY2Nlc3MKLSAgICAgICBhcyB3ZWxsIGFzIHByaXZpbGVnZSBsZXZlbCBjaGFuZ2VzIGZvciBnYXRld2F5cy4gICovCi0gICAgaW50IGFjY2VzczsKLQotICAgIC8qIEluZGV4IG9mIGNvbnRhaW5pbmcgc3BhY2UuICAqLwotICAgIGludCBzcGFjZV9pbmRleDsKLQotICAgIC8qIEFsaWdubWVudCAoaW4gYnl0ZXMpIG9mIHRoaXMgc3Vic3BhY2UuICAqLwotICAgIGludCBhbGlnbm1lbnQ7Ci0KLSAgICAvKiBRdWFkcmFudCB3aXRoaW4gc3BhY2Ugd2hlcmUgdGhpcyBzdWJzcGFjZSBzaG91bGQgYmUgbG9hZGVkLiAgKi8KLSAgICBpbnQgcXVhZHJhbnQ7Ci0KLSAgICAvKiBBbiBpbmRleCBpbnRvIHRoZSBkZWZhdWx0IHNwYWNlcyBhcnJheS4gICovCi0gICAgaW50IGRlZl9zcGFjZV9pbmRleDsKLQotICAgIC8qIEFuIGFsaWFzIGZvciB0aGlzIHNlY3Rpb24gKG9yIE5VTEwgaWYgbm8gYWxpYXMgZXhpc3RzKS4gICovCi0gICAgY2hhciAqYWxpYXM7Ci0KLSAgICAvKiBTdWJzZWdtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1YnNwYWNlLiAgKi8KLSAgICBzdWJzZWdUIHN1YnNlZ21lbnQ7Ci0gIH07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYXR0cmlidXRlcyBvZiB0aGUgZGVmYXVsdCBzcGFjZQotICAgZGljdGlvbmFyeSBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGRlZmF1bHRfc3BhY2VfZGljdAotICB7Ci0gICAgLyogTmFtZSBvZiB0aGUgc3BhY2UuICAqLwotICAgIGNoYXIgKm5hbWU7Ci0KLSAgICAvKiBTcGFjZSBudW1iZXIuICBJdCBpcyBwb3NzaWJsZSB0byBpZGVudGlmeSBzcGFjZXMgd2l0aGluCi0gICAgICAgYXNzZW1ibHkgY29kZSBudW1lcmljYWxseSEgICovCi0gICAgaW50IHNwbnVtOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHNwYWNlIGlzIGxvYWRhYmxlLiAgKi8KLSAgICBjaGFyIGxvYWRhYmxlOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHNwYWNlIGlzICJkZWZpbmVkIi4gIEZJWE1FIGlzIHN0aWxsIG5lZWRlZCAqLwotICAgIGNoYXIgZGVmaW5lZDsKLQotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBzcGFjZSBjYW4gbm90IGJlIHNoYXJlZC4gICovCi0gICAgY2hhciBwcml2YXRlOwotCi0gICAgLyogU29ydCBrZXkgZm9yIHRoaXMgc3BhY2UuICAqLwotICAgIHVuc2lnbmVkIGNoYXIgc29ydDsKLQotICAgIC8qIFNlZ21lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3BhY2UuICAqLwotICAgIGFzZWN0aW9uICpzZWdtZW50OwotCi0gICAgLyogQW4gYWxpYXMgZm9yIHRoaXMgc2VjdGlvbiAob3IgTlVMTCBpZiBubyBhbGlhcyBleGlzdHMpLiAgKi8KLSAgICBjaGFyICphbGlhczsKLSAgfTsKLQotLyogRXh0cmEgaW5mb3JtYXRpb24gbmVlZGVkIHRvIHBlcmZvcm0gZml4dXBzIChyZWxvY2F0aW9ucykgb24gdGhlIFBBLiAgKi8KLXN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QKLSAgewotICAgIC8qIFRoZSBmaWVsZCBzZWxlY3Rvci4gICovCi0gICAgZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0IGZ4X3JfZmllbGQ7Ci0KLSAgICAvKiBUeXBlIG9mIGZpeHVwLiAgKi8KLSAgICBpbnQgZnhfcl90eXBlOwotCi0gICAgLyogRm9ybWF0IG9mIGZpeHVwLiAgKi8KLSAgICBpbnQgZnhfcl9mb3JtYXQ7Ci0KLSAgICAvKiBBcmd1bWVudCByZWxvY2F0aW9uIGJpdHMuICAqLwotICAgIGxvbmcgZnhfYXJnX3JlbG9jOwotCi0gICAgLyogVGhlIHNlZ21lbnQgdGhpcyBmaXh1cCBhcHBlYXJzIGluLiAgKi8KLSAgICBzZWdUIHNlZ21lbnQ7Ci0gIH07Ci0KLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KLQotc3RydWN0IHBkX3JlZwotICB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgdmFsdWU7Ci0gIH07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIG1hcHBpbmcgZnJvbSBhIEZQIGNvbmRpdGlvbiBzdHJpbmcKLSAgIHRvIGEgY29uZGl0aW9uIG51bWJlciB3aGljaCBjYW4gYmUgcmVjb3JkZWQgaW4gYW4gaW5zdHJ1Y3Rpb24uICAqLwotc3RydWN0IGZwX2NvbmRfbWFwCi0gIHsKLSAgICBjaGFyICpzdHJpbmc7Ci0gICAgaW50IGNvbmQ7Ci0gIH07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBtYXBwaW5nIGZyb20gYSBmaWVsZCBzZWxlY3RvcgotICAgc3RyaW5nIHRvIGEgZmllbGQgc2VsZWN0b3IgdHlwZS4gICovCi1zdHJ1Y3Qgc2VsZWN0b3JfZW50cnkKLSAgewotICAgIGNoYXIgKnByZWZpeDsKLSAgICBpbnQgZmllbGRfc2VsZWN0b3I7Ci0gIH07Ci0KLS8qIFByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyBsb2NhbCB0byB0Yy1ocHBhLmMuICAqLwotCi1zdGF0aWMgdm9pZCBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgZnBfb3BlcmFuZF9mb3JtYXQgcGFfcGFyc2VfZnBfZm9ybWF0IFBBUkFNUyAoKGNoYXIgKipzKSk7Ci1zdGF0aWMgdm9pZCBwYV9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZGF0YSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2Zsb2F0X2NvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9maWxsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfbGNvbW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9sc3ltIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfc3RyaW5nZXIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV90ZXh0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfdmVyc2lvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBpbnQgcGFfcGFyc2VfZnBfY21wX2NvbmQgUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCBnZXRfZXhwcmVzc2lvbiBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBpbnQgcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gUEFSQU1TICgoc3RydWN0IHBhX2l0ICosIGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgZXZhbHVhdGVfYWJzb2x1dGUgUEFSQU1TICgoc3RydWN0IHBhX2l0ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGFfYnVpbGRfYXJnX3JlbG9jIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBwYV9hbGlnbl9hcmdfcmVsb2MgUEFSQU1TICgodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBpbnQgcGFfcGFyc2VfbnVsbGlmIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgcGFfcGFyc2Vfbm9ubmVnX2NtcHN1Yl9jbXBsdHIgUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX25lZ19jbXBzdWJfY21wbHRyIFBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBwYV9wYXJzZV9uZWdfYWRkX2NtcGx0ciBQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKLXN0YXRpYyBpbnQgcGFfcGFyc2Vfbm9ubmVnX2FkZF9jbXBsdHIgUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9hbGlnbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2Jsb2NrIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfYnJ0YWIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV90cnkgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9jYWxsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfY2FsbF9hcmdzIFBBUkFNUyAoKHN0cnVjdCBjYWxsX2Rlc2MgKikpOwotc3RhdGljIHZvaWQgcGFfY2FsbGluZm8gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9jb2RlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfY29tbSBQQVJBTVMgKChpbnQpKTsKLSNpZmRlZiBPQkpfU09NCi1zdGF0aWMgdm9pZCBwYV9jb21waWxlciBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgcGFfY29weXJpZ2h0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZW5kIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZW50ZXIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9lbnRyeSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2VxdSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2V4aXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9leHBvcnQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV90eXBlX2FyZ3MgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2ltcG9ydCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2xhYmVsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfbGVhdmUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9sZXZlbCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX29yaWdpbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3Byb2MgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9wcm9jZW5kIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfc3BhY2UgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9zcG51bSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3N1YnNwYWNlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfcGFyYW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV91bmRlZmluZV9sYWJlbCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IG5lZWRfcGExMV9vcGNvZGUgUEFSQU1TICgoc3RydWN0IHBhX2l0ICosCi0JCQkJICAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCAqKSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX251bWJlciBQQVJBTVMgKChjaGFyICoqLCBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCAqKSk7Ci1zdGF0aWMgbGFiZWxfc3ltYm9sX3N0cnVjdCAqcGFfZ2V0X2xhYmVsIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKmNyZWF0ZV9uZXdfc3BhY2UgUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCwKLQkJCQkJCSAgaW50LCBpbnQsIGludCwKLQkJCQkJCSAgYXNlY3Rpb24gKiwgaW50KSk7Ci1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqY3JlYXRlX25ld19zdWJzcGFjZSBQQVJBTVMgKChzZF9jaGFpbl9zdHJ1Y3QgKiwKLQkJCQkJCSAgICAgIGNoYXIgKiwgaW50LCBpbnQsCi0JCQkJCQkgICAgICBpbnQsIGludCwgaW50LAotCQkJCQkJICAgICAgaW50LCBpbnQsIGludCwgaW50LAotCQkJCQkJICAgICAgaW50LCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqdXBkYXRlX3N1YnNwYWNlIFBBUkFNUyAoKHNkX2NoYWluX3N0cnVjdCAqLAotCQkJCQkJICBjaGFyICosIGludCwgaW50LCBpbnQsCi0JCQkJCQkgIGludCwgaW50LCBpbnQsIGludCwKLQkJCQkJCSAgaW50LCBpbnQsIGludCwKLQkJCQkJCSAgYXNlY3Rpb24gKikpOwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqaXNfZGVmaW5lZF9zcGFjZSBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICppc19kZWZpbmVkX3N1YnNwYWNlIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqcGFfc2VnbWVudF90b19zcGFjZSBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSBQQVJBTVMgKChhc2VjdGlvbiAqLAotCQkJCQkJCSAgICBzdWJzZWdUKSk7Ci1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICpwYV9maW5kX3NwYWNlX2J5X251bWJlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGFfc3Vic3BhY2Vfc3RhcnQgUEFSQU1TICgoc2RfY2hhaW5fc3RydWN0ICosIGludCkpOwotc3RhdGljIHZvaWQgcGFfaXAgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBmaXhfbmV3X2hwcGEgUEFSQU1TICgoZnJhZ1MgKiwgaW50LCBpbnQsIHN5bWJvbFMgKiwKLQkJCQkgIGxvbmcsIGV4cHJlc3Npb25TICosIGludCwKLQkJCQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwKLQkJCQkgIGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCwKLQkJCQkgIGludCwgbG9uZywgaW50ICopKTsKLXN0YXRpYyBpbnQgaXNfZW5kX29mX3N0YXRlbWVudCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaCBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBpbnQgcGFfY2hrX2ZpZWxkX3NlbGVjdG9yIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgaXNfc2FtZV9mcmFnIFBBUkFNUyAoKGZyYWdTICosIGZyYWdTICopKTsKLXN0YXRpYyB2b2lkIHByb2Nlc3NfZXhpdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICpwYV9wYXJzZV9zcGFjZV9zdG10IFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgaW50IGxvZzIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgaW50IHBhX25leHRfc3Vic2VnIFBBUkFNUyAoKHNkX2NoYWluX3N0cnVjdCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHBhX3N0cmluZ2VyX2F1eCBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIHBhX3NwYWNlc19iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgdm9pZCBocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBwYV9idWlsZF91bndpbmRfc3Vic3BhY2UgUEFSQU1TICgoc3RydWN0IGNhbGxfaW5mbyAqKSk7Ci0jZW5kaWYKLQotLyogRmlsZSBhbmQgZ2xvYWxseSBzY29wZWQgdmFyaWFibGUgZGVjbGFyYXRpb25zLiAgKi8KLQotLyogUm9vdCBhbmQgZmluYWwgZW50cnkgaW4gdGhlIHNwYWNlIGNoYWluLiAgKi8KLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2RpY3Rfcm9vdDsKLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2RpY3RfbGFzdDsKLQotLyogVGhlIGN1cnJlbnQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKmN1cnJlbnRfc3BhY2U7Ci1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqY3VycmVudF9zdWJzcGFjZTsKLQotLyogUm9vdCBvZiB0aGUgY2FsbF9pbmZvIGNoYWluLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY2FsbF9pbmZvICpjYWxsX2luZm9fcm9vdDsKLQotLyogVGhlIGxhc3QgY2FsbF9pbmZvIChmb3IgZnVuY3Rpb25zKSBzdHJ1Y3R1cmUKLSAgIHNlZW4gc28gaXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBmaXh1cHMgYW5kCi0gICBmdW5jdGlvbiBsYWJlbHMuICAqLwotc3RhdGljIHN0cnVjdCBjYWxsX2luZm8gKmxhc3RfY2FsbF9pbmZvOwotCi0vKiBUaGUgbGFzdCBjYWxsIGRlc2NyaXB0aW9uIChmb3IgYWN0dWFsIGNhbGxzKS4gICovCi1zdGF0aWMgc3RydWN0IGNhbGxfZGVzYyBsYXN0X2NhbGxfZGVzYzsKLQotLyogaGFuZGxlIG9mIHRoZSBPUENPREUgaGFzaCB0YWJsZSAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2ggPSBOVUxMOwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bC4gICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICI7IjsKLQotLyogVGFibGUgb2YgcHNldWRvIG9wcyBmb3IgdGhlIFBBLiAgRklYTUUgLS0gaG93IG1hbnkgb2YgdGhlc2UKLSAgIGFyZSBub3cgcmVkdW5kYW50IHdpdGggdGhlIG92ZXJhbGwgR0FTIGFuZCB0aGUgb2JqZWN0IGZpbGUKLSAgIGRlcGVuZGVudCB0YWJsZXM/ICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgLyogYWxpZ24gcHNldWRvLW9wcyBvbiB0aGUgUEEgc3BlY2lmeSB0aGUgYWN0dWFsIGFsaWdubWVudCByZXF1ZXN0ZWQsCi0gICAgIG5vdCB0aGUgbG9nMiBvZiB0aGUgcmVxdWVzdGVkIGFsaWdubWVudC4gICovCi0gIHsiYWxpZ24iLCBwYV9hbGlnbiwgOH0sCi0gIHsiYmVnaW5fYnJ0YWIiLCBwYV9icnRhYiwgMX0sCi0gIHsiYmVnaW5fdHJ5IiwgcGFfdHJ5LCAxfSwKLSAgeyJibG9jayIsIHBhX2Jsb2NrLCAxfSwKLSAgeyJibG9ja3oiLCBwYV9ibG9jaywgMH0sCi0gIHsiYnl0ZSIsIHBhX2NvbnMsIDF9LAotICB7ImNhbGwiLCBwYV9jYWxsLCAwfSwKLSAgeyJjYWxsaW5mbyIsIHBhX2NhbGxpbmZvLCAwfSwKLSAgeyJjb2RlIiwgcGFfY29kZSwgMH0sCi0gIHsiY29tbSIsIHBhX2NvbW0sIDB9LAotI2lmZGVmIE9CSl9TT00KLSAgeyJjb21waWxlciIsIHBhX2NvbXBpbGVyLCAwfSwKLSNlbmRpZgotICB7ImNvcHlyaWdodCIsIHBhX2NvcHlyaWdodCwgMH0sCi0gIHsiZGF0YSIsIHBhX2RhdGEsIDB9LAotICB7ImRvdWJsZSIsIHBhX2Zsb2F0X2NvbnMsICdkJ30sCi0gIHsiZW5kIiwgcGFfZW5kLCAwfSwKLSAgeyJlbmRfYnJ0YWIiLCBwYV9icnRhYiwgMH0sCi0gIHsiZW5kX3RyeSIsIHBhX3RyeSwgMH0sCi0gIHsiZW50ZXIiLCBwYV9lbnRlciwgMH0sCi0gIHsiZW50cnkiLCBwYV9lbnRyeSwgMH0sCi0gIHsiZXF1IiwgcGFfZXF1LCAwfSwKLSAgeyJleGl0IiwgcGFfZXhpdCwgMH0sCi0gIHsiZXhwb3J0IiwgcGFfZXhwb3J0LCAwfSwKLSAgeyJmaWxsIiwgcGFfZmlsbCwgMH0sCi0gIHsiZmxvYXQiLCBwYV9mbG9hdF9jb25zLCAnZid9LAotICB7ImhhbGYiLCBwYV9jb25zLCAyfSwKLSAgeyJpbXBvcnQiLCBwYV9pbXBvcnQsIDB9LAotICB7ImludCIsIHBhX2NvbnMsIDR9LAotICB7ImxhYmVsIiwgcGFfbGFiZWwsIDB9LAotICB7Imxjb21tIiwgcGFfbGNvbW0sIDB9LAotICB7ImxlYXZlIiwgcGFfbGVhdmUsIDB9LAotICB7ImxldmVsIiwgcGFfbGV2ZWwsIDB9LAotICB7ImxvbmciLCBwYV9jb25zLCA0fSwKLSAgeyJsc3ltIiwgcGFfbHN5bSwgMH0sCi0gIHsibnN1YnNwYSIsIHBhX3N1YnNwYWNlLCAxfSwKLSAgeyJvY3RhIiwgcGFfY29ucywgMTZ9LAotICB7Im9yZyIsIHBhX29yaWdpbiwgMH0sCi0gIHsib3JpZ2luIiwgcGFfb3JpZ2luLCAwfSwKLSAgeyJwYXJhbSIsIHBhX3BhcmFtLCAwfSwKLSAgeyJwcm9jIiwgcGFfcHJvYywgMH0sCi0gIHsicHJvY2VuZCIsIHBhX3Byb2NlbmQsIDB9LAotICB7InF1YWQiLCBwYV9jb25zLCA4fSwKLSAgeyJyZWciLCBwYV9lcXUsIDF9LAotICB7InNob3J0IiwgcGFfY29ucywgMn0sCi0gIHsic2luZ2xlIiwgcGFfZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJzcGFjZSIsIHBhX3NwYWNlLCAwfSwKLSAgeyJzcG51bSIsIHBhX3NwbnVtLCAwfSwKLSAgeyJzdHJpbmciLCBwYV9zdHJpbmdlciwgMH0sCi0gIHsic3RyaW5neiIsIHBhX3N0cmluZ2VyLCAxfSwKLSAgeyJzdWJzcGEiLCBwYV9zdWJzcGFjZSwgMH0sCi0gIHsidGV4dCIsIHBhX3RleHQsIDB9LAotICB7InZlcnNpb24iLCBwYV92ZXJzaW9uLCAwfSwKLSAgeyJ3b3JkIiwgcGFfY29ucywgNH0sCi0gIHtOVUxMLCAwLCAwfQotfTsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dC4KLQotICAgTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4KLQotICAgQWxzbyBub3RlIHRoYXQgQyBzdHlsZSBjb21tZW50cyB3aWxsIGFsd2F5cyB3b3JrLiAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcmFjdGVycyB3aGljaCBhY3QgYXMgbGluZSBzZXBhcmF0b3JzLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIhIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LgotICAgQXMgaW4gMGYxMi40NTYgb3IgMGQxLjIzNDVlMTIuCi0KLSAgIEJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYy4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhZSB0byBrbm93IGFib3UgaXQgYXQKLSAgIGFsbCwgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuICAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi1zdGF0aWMgc3RydWN0IHBhX2l0IHRoZV9pbnNuOwotCi0vKiBQb2ludHMgdG8gdGhlIGVuZCBvZiBhbiBleHByZXNzaW9uIGp1c3QgcGFyc2VkIGJ5IGdldF9leHByZXNzb2luCi0gICBhbmQgZnJpZW5kcy4gIEZJWE1FLiAgVGhpcyBzaG91bGRuJ3QgYmUgaGFuZGxlZCB3aXRoIGEgZmlsZS1nbG9iYWwKLSAgIHZhcmlhYmxlLiAgKi8KLXN0YXRpYyBjaGFyICpleHByX2VuZDsKLQotLyogTm9uemVybyBpZiBhIC5jYWxsaW5mbyBhcHBlYXJlZCB3aXRoaW4gdGhlIGN1cnJlbnQgcHJvY2VkdXJlLiAgKi8KLXN0YXRpYyBpbnQgY2FsbGluZm9fZm91bmQ7Ci0KLS8qIE5vbnplcm8gaWYgdGhlIGFzc2VtYmxlciBpcyBjdXJyZW50bHkgd2l0aGluIGEgLmVudHJ5Ly5leGl0IHBhaXIuICAqLwotc3RhdGljIGludCB3aXRoaW5fZW50cnlfZXhpdDsKLQotLyogTm9uemVybyBpZiB0aGUgYXNzZW1ibGVyIGlzIGN1cnJlbnRseSB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbi4gICovCi1zdGF0aWMgaW50IHdpdGhpbl9wcm9jZWR1cmU7Ci0KLS8qIEhhbmRsZSBvbiBzdHJ1Y3V0cmUgd2hpY2gga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBzeW1ib2wKLSAgIHNlZW4gaW4gZWFjaCBzdWJzcGFjZS4gICovCi1zdGF0aWMgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfc3ltYm9sc19yb290cCA9IE5VTEw7Ci0KLS8qIEhvbGRzIHRoZSBsYXN0IGZpZWxkIHNlbGVjdG9yLiAgKi8KLXN0YXRpYyBpbnQgaHBwYV9maWVsZF9zZWxlY3RvcjsKLQotCi0vKiBBIGR1bW15IGJmZCBzeW1ib2wgc28gdGhhdCBhbGwgcmVsb2NhdGlvbnMgaGF2ZSBzeW1ib2xzIG9mIHNvbWUga2luZC4gICovCi1zdGF0aWMgc3ltYm9sUyAqZHVtbXlfc3ltYm9sOwotCi0vKiBOb256ZXJvIGlmIGVycm9ycyBhcmUgdG8gYmUgcHJpbnRlZC4gICovCi1zdGF0aWMgaW50IHByaW50X2Vycm9ycyA9IDE7Ci0KLS8qIExpc3Qgb2YgcmVnaXN0ZXJzIHRoYXQgYXJlIHByZS1kZWZpbmVkOgotCi0gICBFYWNoIGdlbmVyYWwgcmVnaXN0ZXIgaGFzIG9uZSBwcmVkZWZpbmVkIG5hbWUgb2YgdGhlIGZvcm0KLSAgICVyPFJFR05VTT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8UkVHTlVNPi4KLQotICAgU3BhY2UgYW5kIGNvbnRyb2wgcmVnaXN0ZXJzIGFyZSBoYW5kbGVkIGluIGEgc2ltaWxhciBtYW5uZXIsCi0gICBidXQgdXNlICVzcjxSRUdOVU0+IGFuZCAlY3I8UkVHTlVNPiBhcyB0aGVpciBwcmVkZWZpbmVkIG5hbWVzLgotCi0gICBMaWtld2lzZSBmb3IgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycywgYnV0IG9mIHRoZSBmb3JtCi0gICAlZnI8UkVHTlVNPi4gIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBoYXZlIGFkZGl0aW9uYWwgcHJlZGVmaW5lZAotICAgbmFtZXMgd2l0aCAnTCcgYW5kICdSJyBzdWZmaXhlcyAoZS5nLiAlZnIxOUwsICVmcjE5Uikgd2hpY2gKLSAgIGFnYWluIGhhdmUgdGhlIHZhbHVlIDxSRUdOVU0+LgotCi0gICBNYW55IHJlZ2lzdGVycyBhbHNvIGhhdmUgc3lub255bXM6Ci0KLSAgICVyMjYgLSAlcjIzIGhhdmUgJWFyZzAgLSAlYXJnMyBhcyBzeW5vbnltcwotICAgJXIyOCAtICVyMjkgaGF2ZSAlcmV0MCAtICVyZXQxIGFzIHN5bm9ueW1zCi0gICAlcjMwIGhhcyAlc3AgYXMgYSBzeW5vbnltCi0gICAlcjI3IGhhcyAlZHAgYXMgYSBzeW5vbnltCi0gICAlcjIgIGhhcyAlcnAgYXMgYSBzeW5vbnltCi0KLSAgIEFsbW9zdCBldmVyeSBjb250cm9sIHJlZ2lzdGVyIGhhcyBhIHN5bm9ueW07IHRoZXkgYXJlIG5vdCBsaXN0ZWQKLSAgIGhlcmUgZm9yIGJyZXZpdHkuCi0KLSAgIFRoZSB0YWJsZSBpcyBzb3J0ZWQuIFN1aXRhYmxlIGZvciBzZWFyY2hpbmcgYnkgYSBiaW5hcnkgc2VhcmNoLiAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBkX3JlZyBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsiJWFyZzAiLCAyNn0sCi0gIHsiJWFyZzEiLCAyNX0sCi0gIHsiJWFyZzIiLCAyNH0sCi0gIHsiJWFyZzMiLCAyM30sCi0gIHsiJWNyMCIsIDB9LAotICB7IiVjcjEwIiwgMTB9LAotICB7IiVjcjExIiwgMTF9LAotICB7IiVjcjEyIiwgMTJ9LAotICB7IiVjcjEzIiwgMTN9LAotICB7IiVjcjE0IiwgMTR9LAotICB7IiVjcjE1IiwgMTV9LAotICB7IiVjcjE2IiwgMTZ9LAotICB7IiVjcjE3IiwgMTd9LAotICB7IiVjcjE4IiwgMTh9LAotICB7IiVjcjE5IiwgMTl9LAotICB7IiVjcjIwIiwgMjB9LAotICB7IiVjcjIxIiwgMjF9LAotICB7IiVjcjIyIiwgMjJ9LAotICB7IiVjcjIzIiwgMjN9LAotICB7IiVjcjI0IiwgMjR9LAotICB7IiVjcjI1IiwgMjV9LAotICB7IiVjcjI2IiwgMjZ9LAotICB7IiVjcjI3IiwgMjd9LAotICB7IiVjcjI4IiwgMjh9LAotICB7IiVjcjI5IiwgMjl9LAotICB7IiVjcjMwIiwgMzB9LAotICB7IiVjcjMxIiwgMzF9LAotICB7IiVjcjgiLCA4fSwKLSAgeyIlY3I5IiwgOX0sCi0gIHsiJWRwIiwgMjd9LAotICB7IiVlaWVtIiwgMTV9LAotICB7IiVlaXJyIiwgMjN9LAotICB7IiVmcjAiLCAwfSwKLSAgeyIlZnIwbCIsIDB9LAotICB7IiVmcjByIiwgMH0sCi0gIHsiJWZyMSIsIDF9LAotICB7IiVmcjEwIiwgMTB9LAotICB7IiVmcjEwbCIsIDEwfSwKLSAgeyIlZnIxMHIiLCAxMH0sCi0gIHsiJWZyMTEiLCAxMX0sCi0gIHsiJWZyMTFsIiwgMTF9LAotICB7IiVmcjExciIsIDExfSwKLSAgeyIlZnIxMiIsIDEyfSwKLSAgeyIlZnIxMmwiLCAxMn0sCi0gIHsiJWZyMTJyIiwgMTJ9LAotICB7IiVmcjEzIiwgMTN9LAotICB7IiVmcjEzbCIsIDEzfSwKLSAgeyIlZnIxM3IiLCAxM30sCi0gIHsiJWZyMTQiLCAxNH0sCi0gIHsiJWZyMTRsIiwgMTR9LAotICB7IiVmcjE0ciIsIDE0fSwKLSAgeyIlZnIxNSIsIDE1fSwKLSAgeyIlZnIxNWwiLCAxNX0sCi0gIHsiJWZyMTVyIiwgMTV9LAotICB7IiVmcjE2IiwgMTZ9LAotICB7IiVmcjE2bCIsIDE2fSwKLSAgeyIlZnIxNnIiLCAxNn0sCi0gIHsiJWZyMTciLCAxN30sCi0gIHsiJWZyMTdsIiwgMTd9LAotICB7IiVmcjE3ciIsIDE3fSwKLSAgeyIlZnIxOCIsIDE4fSwKLSAgeyIlZnIxOGwiLCAxOH0sCi0gIHsiJWZyMThyIiwgMTh9LAotICB7IiVmcjE5IiwgMTl9LAotICB7IiVmcjE5bCIsIDE5fSwKLSAgeyIlZnIxOXIiLCAxOX0sCi0gIHsiJWZyMWwiLCAxfSwKLSAgeyIlZnIxciIsIDF9LAotICB7IiVmcjIiLCAyfSwKLSAgeyIlZnIyMCIsIDIwfSwKLSAgeyIlZnIyMGwiLCAyMH0sCi0gIHsiJWZyMjByIiwgMjB9LAotICB7IiVmcjIxIiwgMjF9LAotICB7IiVmcjIxbCIsIDIxfSwKLSAgeyIlZnIyMXIiLCAyMX0sCi0gIHsiJWZyMjIiLCAyMn0sCi0gIHsiJWZyMjJsIiwgMjJ9LAotICB7IiVmcjIyciIsIDIyfSwKLSAgeyIlZnIyMyIsIDIzfSwKLSAgeyIlZnIyM2wiLCAyM30sCi0gIHsiJWZyMjNyIiwgMjN9LAotICB7IiVmcjI0IiwgMjR9LAotICB7IiVmcjI0bCIsIDI0fSwKLSAgeyIlZnIyNHIiLCAyNH0sCi0gIHsiJWZyMjUiLCAyNX0sCi0gIHsiJWZyMjVsIiwgMjV9LAotICB7IiVmcjI1ciIsIDI1fSwKLSAgeyIlZnIyNiIsIDI2fSwKLSAgeyIlZnIyNmwiLCAyNn0sCi0gIHsiJWZyMjZyIiwgMjZ9LAotICB7IiVmcjI3IiwgMjd9LAotICB7IiVmcjI3bCIsIDI3fSwKLSAgeyIlZnIyN3IiLCAyN30sCi0gIHsiJWZyMjgiLCAyOH0sCi0gIHsiJWZyMjhsIiwgMjh9LAotICB7IiVmcjI4ciIsIDI4fSwKLSAgeyIlZnIyOSIsIDI5fSwKLSAgeyIlZnIyOWwiLCAyOX0sCi0gIHsiJWZyMjlyIiwgMjl9LAotICB7IiVmcjJsIiwgMn0sCi0gIHsiJWZyMnIiLCAyfSwKLSAgeyIlZnIzIiwgM30sCi0gIHsiJWZyMzAiLCAzMH0sCi0gIHsiJWZyMzBsIiwgMzB9LAotICB7IiVmcjMwciIsIDMwfSwKLSAgeyIlZnIzMSIsIDMxfSwKLSAgeyIlZnIzMWwiLCAzMX0sCi0gIHsiJWZyMzFyIiwgMzF9LAotICB7IiVmcjNsIiwgM30sCi0gIHsiJWZyM3IiLCAzfSwKLSAgeyIlZnI0IiwgNH0sCi0gIHsiJWZyNGwiLCA0fSwKLSAgeyIlZnI0ciIsIDR9LAotICB7IiVmcjUiLCA1fSwKLSAgeyIlZnI1bCIsIDV9LAotICB7IiVmcjVyIiwgNX0sCi0gIHsiJWZyNiIsIDZ9LAotICB7IiVmcjZsIiwgNn0sCi0gIHsiJWZyNnIiLCA2fSwKLSAgeyIlZnI3IiwgN30sCi0gIHsiJWZyN2wiLCA3fSwKLSAgeyIlZnI3ciIsIDd9LAotICB7IiVmcjgiLCA4fSwKLSAgeyIlZnI4bCIsIDh9LAotICB7IiVmcjhyIiwgOH0sCi0gIHsiJWZyOSIsIDl9LAotICB7IiVmcjlsIiwgOX0sCi0gIHsiJWZyOXIiLCA5fSwKLSAgeyIlaHRhIiwgMjV9LAotICB7IiVpaXIiLCAxOX0sCi0gIHsiJWlvciIsIDIxfSwKLSAgeyIlaXBzdyIsIDIyfSwKLSAgeyIlaXNyIiwgMjB9LAotICB7IiVpdG1yIiwgMTZ9LAotICB7IiVpdmEiLCAxNH0sCi0gIHsiJXBjb3EiLCAxOH0sCi0gIHsiJXBjc3EiLCAxN30sCi0gIHsiJXBpZHIxIiwgOH0sCi0gIHsiJXBpZHIyIiwgOX0sCi0gIHsiJXBpZHIzIiwgMTJ9LAotICB7IiVwaWRyNCIsIDEzfSwKLSAgeyIlcHBkYSIsIDI0fSwKLSAgeyIlcjAiLCAwfSwKLSAgeyIlcjEiLCAxfSwKLSAgeyIlcjEwIiwgMTB9LAotICB7IiVyMTEiLCAxMX0sCi0gIHsiJXIxMiIsIDEyfSwKLSAgeyIlcjEzIiwgMTN9LAotICB7IiVyMTQiLCAxNH0sCi0gIHsiJXIxNSIsIDE1fSwKLSAgeyIlcjE2IiwgMTZ9LAotICB7IiVyMTciLCAxN30sCi0gIHsiJXIxOCIsIDE4fSwKLSAgeyIlcjE5IiwgMTl9LAotICB7IiVyMiIsIDJ9LAotICB7IiVyMjAiLCAyMH0sCi0gIHsiJXIyMSIsIDIxfSwKLSAgeyIlcjIyIiwgMjJ9LAotICB7IiVyMjMiLCAyM30sCi0gIHsiJXIyNCIsIDI0fSwKLSAgeyIlcjI1IiwgMjV9LAotICB7IiVyMjYiLCAyNn0sCi0gIHsiJXIyNyIsIDI3fSwKLSAgeyIlcjI4IiwgMjh9LAotICB7IiVyMjkiLCAyOX0sCi0gIHsiJXIzIiwgM30sCi0gIHsiJXIzMCIsIDMwfSwKLSAgeyIlcjMxIiwgMzF9LAotICB7IiVyNCIsIDR9LAotICB7IiVyNSIsIDV9LAotICB7IiVyNiIsIDZ9LAotICB7IiVyNyIsIDd9LAotICB7IiVyOCIsIDh9LAotICB7IiVyOSIsIDl9LAotICB7IiVyY3RyIiwgMH0sCi0gIHsiJXJldDAiLCAyOH0sCi0gIHsiJXJldDEiLCAyOX0sCi0gIHsiJXJwIiwgMn0sCi0gIHsiJXNhciIsIDExfSwKLSAgeyIlc3AiLCAzMH0sCi0gIHsiJXNyMCIsIDB9LAotICB7IiVzcjEiLCAxfSwKLSAgeyIlc3IyIiwgMn0sCi0gIHsiJXNyMyIsIDN9LAotICB7IiVzcjQiLCA0fSwKLSAgeyIlc3I1IiwgNX0sCi0gIHsiJXNyNiIsIDZ9LAotICB7IiVzcjciLCA3fSwKLSAgeyIldHIwIiwgMjR9LAotICB7IiV0cjEiLCAyNX0sCi0gIHsiJXRyMiIsIDI2fSwKLSAgeyIldHIzIiwgMjd9LAotICB7IiV0cjQiLCAyOH0sCi0gIHsiJXRyNSIsIDI5fSwKLSAgeyIldHI2IiwgMzB9LAotICB7IiV0cjciLCAzMX0KLX07Ci0KLS8qIFRoaXMgdGFibGUgaXMgc29ydGVkIGJ5IG9yZGVyIG9mIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4gVGhpcyBpcwotICAgc28gd2UgY2hlY2sgZm9yIDw+IGJlZm9yZSB3ZSBjaGVjayBmb3IgPC4gSWYgd2UgaGFkIGEgPD4gYW5kIGNoZWNrZWQKLSAgIGZvciA8IGZpcnN0LCB3ZSB3b3VsZCBnZXQgYSBmYWxzZSBtYXRjaC4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZwX2NvbmRfbWFwIGZwX2NvbmRfbWFwW10gPQotewotICB7ImZhbHNlPyIsIDB9LAotICB7ImZhbHNlIiwgMX0sCi0gIHsidHJ1ZT8iLCAzMH0sCi0gIHsidHJ1ZSIsIDMxfSwKLSAgeyIhPD0+IiwgM30sCi0gIHsiIT8+PSIsIDh9LAotICB7IiE/PD0iLCAxNn0sCi0gIHsiITw+IiwgN30sCi0gIHsiIT49IiwgMTF9LAotICB7IiE/PiIsIDEyfSwKLSAgeyI/PD0iLCAxNH0sCi0gIHsiITw9IiwgMTl9LAotICB7IiE/PCIsIDIwfSwKLSAgeyI/Pj0iLCAyMn0sCi0gIHsiIT89IiwgMjR9LAotICB7IiE9dCIsIDI3fSwKLSAgeyI8PT4iLCAyOX0sCi0gIHsiPXQiLCA1fSwKLSAgeyI/PSIsIDZ9LAotICB7Ij88IiwgMTB9LAotICB7Ijw9IiwgMTN9LAotICB7IiE+IiwgMTV9LAotICB7Ij8+IiwgMTh9LAotICB7Ij49IiwgMjF9LAotICB7IiE8IiwgMjN9LAotICB7Ijw+IiwgMjV9LAotICB7IiE9IiwgMjZ9LAotICB7IiE/IiwgMjh9LAotICB7Ij8iLCAyfSwKLSAgeyI9IiwgNH0sCi0gIHsiPCIsIDl9LAotICB7Ij4iLCAxN30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VsZWN0b3JfZW50cnkgc2VsZWN0b3JfdGFibGVbXSA9Ci17Ci0gIHsiZiIsIGVfZnNlbH0sCi0gIHsibCIsIGVfbHNlbH0sCi0gIHsibGQiLCBlX2xkc2VsfSwKLSAgeyJscCIsIGVfbHBzZWx9LAotICB7ImxyIiwgZV9scnNlbH0sCi0gIHsibHMiLCBlX2xzc2VsfSwKLSAgeyJsdCIsIGVfbHRzZWx9LAotICB7Im4iLCBlX25zZWx9LAotICB7Im5sIiwgZV9ubHNlbH0sCi0gIHsibmxyIiwgZV9ubHJzZWx9LAotICB7InAiLCBlX3BzZWx9LAotICB7InIiLCBlX3JzZWx9LAotICB7InJkIiwgZV9yZHNlbH0sCi0gIHsicnAiLCBlX3Jwc2VsfSwKLSAgeyJyciIsIGVfcnJzZWx9LAotICB7InJzIiwgZV9yc3NlbH0sCi0gIHsicnQiLCBlX3J0c2VsfSwKLSAgeyJ0IiwgZV90c2VsfSwKLX07Ci0KLS8qIGRlZmF1bHQgc3BhY2UgYW5kIHN1YnNwYWNlIGRpY3Rpb25hcmllcyAqLwotCi0jZGVmaW5lIEdEQl9TWU1CT0xTICAgICAgICAgIEdEQl9TWU1CT0xTX1NVQlNQQUNFX05BTUUKLSNkZWZpbmUgR0RCX1NUUklOR1MgICAgICAgICAgR0RCX1NUUklOR1NfU1VCU1BBQ0VfTkFNRQotCi0vKiBwcmUtZGVmaW5lZCBzdWJzZWdtZW50cyAoc3Vic3BhY2VzKSBmb3IgdGhlIEhQUEEuICAqLwotI2RlZmluZSBTVUJTRUdfQ09ERSAgIDAKLSNkZWZpbmUgU1VCU0VHX0xJVCAgICAxCi0jZGVmaW5lIFNVQlNFR19NSUxMSSAgMgotI2RlZmluZSBTVUJTRUdfREFUQSAgIDAKLSNkZWZpbmUgU1VCU0VHX0JTUyAgICAyCi0jZGVmaW5lIFNVQlNFR19VTldJTkQgMwotI2RlZmluZSBTVUJTRUdfR0RCX1NUUklOR1MgMAotI2RlZmluZSBTVUJTRUdfR0RCX1NZTUJPTFMgMQotCi1zdGF0aWMgc3RydWN0IGRlZmF1bHRfc3Vic3BhY2VfZGljdCBwYV9kZWZfc3Vic3BhY2VzW10gPQotewotICB7IiRDT0RFJCIsIDEsIDEsIDEsIDAsIDAsIDAsIDI0LCAweDJjLCAwLCA4LCAwLCAwLCAiLnRleHQiLCBTVUJTRUdfQ09ERX0sCi0gIHsiJERBVEEkIiwgMSwgMSwgMCwgMCwgMCwgMCwgMjQsIDB4MWYsIDEsIDgsIDEsIDEsICIuZGF0YSIsIFNVQlNFR19EQVRBfSwKLSAgeyIkTElUJCIsIDEsIDEsIDAsIDAsIDAsIDAsIDE2LCAweDJjLCAwLCA4LCAwLCAwLCAiLnRleHQiLCBTVUJTRUdfTElUfSwKLSAgeyIkTUlMTElDT0RFJCIsIDEsIDEsIDAsIDAsIDAsIDAsIDgsIDB4MmMsIDAsIDgsIDAsIDAsICIudGV4dCIsIFNVQlNFR19NSUxMSX0sCi0gIHsiJEJTUyQiLCAxLCAxLCAwLCAwLCAwLCAxLCA4MCwgMHgxZiwgMSwgOCwgMSwgMSwgIi5ic3MiLCBTVUJTRUdfQlNTfSwKLSNpZmRlZiBPQkpfRUxGCi0gIHsiJFVOV0lORCQiLCAxLCAxLCAwLCAwLCAwLCAwLCA2NCwgMHgyYywgMCwgNCwgMCwgMCwgIi5QQVJJU0MudW53aW5kIiwgU1VCU0VHX1VOV0lORH0sCi0jZW5kaWYKLSAge05VTEwsIDAsIDEsIDAsIDAsIDAsIDAsIDI1NSwgMHgxZiwgMCwgNCwgMCwgMCwgMH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGVmYXVsdF9zcGFjZV9kaWN0IHBhX2RlZl9zcGFjZXNbXSA9Ci17Ci0gIHsiJFRFWFQkIiwgMCwgMSwgMSwgMCwgOCwgQVNFQ19OVUxMLCAiLnRleHQifSwKLSAgeyIkUFJJVkFURSQiLCAxLCAxLCAxLCAxLCAxNiwgQVNFQ19OVUxMLCAiLmRhdGEifSwKLSAge05VTEwsIDAsIDAsIDAsIDAsIDAsIEFTRUNfTlVMTCwgTlVMTH0KLX07Ci0KLS8qIE1pc2MgbG9jYWwgZGVmaW5pdGlvbnMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgKi8KLQotLyogUmV0dXJuIG5vbnplcm8gaWYgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IFMgcG90ZW50aWFsbHkgcmVwcmVzZW50cwotICAgYSByaWdodCBvciBsZWZ0IGhhbGYgb2YgYSBGUCByZWdpc3RlciAgKi8KLSNkZWZpbmUgSVNfUl9TRUxFQ1QoUykgICAoKihTKSA9PSAnUicgfHwgKihTKSA9PSAncicpCi0jZGVmaW5lIElTX0xfU0VMRUNUKFMpICAgKCooUykgPT0gJ0wnIHx8ICooUykgPT0gJ2wnKQotCi0vKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgdG8gbWFpbnRhaW4gc3BhY2VzL3N1YnNwYWNlcy4gICovCi0jZGVmaW5lIFNQQUNFX0RFRklORUQoc3BhY2VfY2hhaW4pCShzcGFjZV9jaGFpbiktPnNkX2RlZmluZWQKLSNkZWZpbmUgU1BBQ0VfVVNFUl9ERUZJTkVEKHNwYWNlX2NoYWluKSAoc3BhY2VfY2hhaW4pLT5zZF91c2VyX2RlZmluZWQKLSNkZWZpbmUgU1BBQ0VfU1BOVU0oc3BhY2VfY2hhaW4pCShzcGFjZV9jaGFpbiktPnNkX3NwbnVtCi0jZGVmaW5lIFNQQUNFX05BTUUoc3BhY2VfY2hhaW4pCQkoc3BhY2VfY2hhaW4pLT5zZF9uYW1lCi0KLSNkZWZpbmUgU1VCU1BBQ0VfREVGSU5FRChzc19jaGFpbikJKHNzX2NoYWluKS0+c3NkX2RlZmluZWQKLSNkZWZpbmUgU1VCU1BBQ0VfTkFNRShzc19jaGFpbikJCShzc19jaGFpbiktPnNzZF9uYW1lCi0KLS8qIEluc2VydCBGSUVMRCBpbnRvIE9QQ09ERSBzdGFydGluZyBhdCBiaXQgU1RBUlQuICBDb250aW51ZSBwYV9pcAotICAgbWFpbiBsb29wIGFmdGVyIGluc2VydGlvbi4gICovCi0KLSNkZWZpbmUgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRShPUENPREUsIEZJRUxELCBTVEFSVCkgXAotICB7IFwKLSAgICAoKE9QQ09ERSkgfD0gKEZJRUxEKSA8PCAoU1RBUlQpKTsgXAotICAgIGNvbnRpbnVlOyBcCi0gIH0KLQotLyogU2ltcGxlIHJhbmdlIGNoZWNraW5nIGZvciBGSUVMRCBhZ2FpbnQgSElHSCBhbmQgTE9XIGJvdW5kcy4KLSAgIElHTk9SRSBpcyB1c2VkIHRvIHN1cHByZXNzIHRoZSBlcnJvciBtZXNzYWdlLiAgKi8KLQotI2RlZmluZSBDSEVDS19GSUVMRChGSUVMRCwgSElHSCwgTE9XLCBJR05PUkUpIFwKLSAgeyBcCi0gICAgaWYgKChGSUVMRCkgPiAoSElHSCkgfHwgKEZJRUxEKSA8IChMT1cpKSBcCi0gICAgICB7IFwKLQlpZiAoISBJR05PUkUpIFwKLSAgICAgICAgICBhc19iYWQgKF8oIkZpZWxkIG91dCBvZiByYW5nZSBbJWQuLiVkXSAoJWQpLiIpLCAoTE9XKSwgKEhJR0gpLCBcCi0JCSAgKGludCkgKEZJRUxEKSk7XAotICAgICAgICBicmVhazsgXAotICAgICAgfSBcCi0gIH0KLQotI2RlZmluZSBpc19EUF9yZWxhdGl2ZShleHApCQkJXAotICAoKGV4cCkuWF9vcCA9PSBPX3N1YnRyYWN0CQkJXAotICAgJiYgc3RyY21wKChleHApLlhfb3Bfc3ltYm9sLT5ic3ltLT5uYW1lLCAiJGdsb2JhbCQiKSA9PSAwKQotCi0jZGVmaW5lIGlzX1BDX3JlbGF0aXZlKGV4cCkJCQlcCi0gICgoZXhwKS5YX29wID09IE9fc3VidHJhY3QJCQlcCi0gICAmJiBzdHJjbXAoKGV4cCkuWF9vcF9zeW1ib2wtPmJzeW0tPm5hbWUsICIkUElDX3BjcmVsJDAiKSA9PSAwKQotCi0vKiBXZSBuZWVkIHNvbWUgY29tcGxleCBoYW5kbGluZyBmb3Igc3RhYnMgKHN5bTEgLSBzeW0yKS4gIEx1Y2tpbHksIHdlJ2xsCi0gICBhbHdheXMgYmUgYWJsZSB0byByZWR1Y2UgdGhlIGV4cHJlc3Npb24gdG8gYSBjb25zdGFudCwgc28gd2UgZG9uJ3QKLSAgIG5lZWQgcmVhbCBjb21wbGV4IGhhbmRsaW5nIHlldC4gICovCi0jZGVmaW5lIGlzX2NvbXBsZXgoZXhwKQkJCQlcCi0gICgoZXhwKS5YX29wICE9IE9fY29uc3RhbnQgJiYgKGV4cCkuWF9vcCAhPSBPX3N5bWJvbCkKLQotLyogQWN0dWFsIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgdGhlIFBBIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBhc3NlbWJsZXIuICAqLwotCi0vKiBDYWxsZWQgYmVmb3JlIHdyaXRpbmcgdGhlIG9iamVjdCBmaWxlLiAgTWFrZSBzdXJlIGVudHJ5L2V4aXQgYW5kCi0gICBwcm9jL3Byb2NlbmQgcGFpcnMgbWF0Y2guICAqLwotCi12b2lkCi1wYV9jaGVja19lb2YgKCkKLXsKLSAgaWYgKHdpdGhpbl9lbnRyeV9leGl0KQotICAgIGFzX2ZhdGFsIChfKCJNaXNzaW5nIC5leGl0XG4iKSk7Ci0KLSAgaWYgKHdpdGhpbl9wcm9jZWR1cmUpCi0gICAgYXNfZmF0YWwgKF8oIk1pc3NpbmcgLnByb2NlbmRcbiIpKTsKLX0KLQotLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCkKLXsKLSAgaWYgKGN1cnJlbnRfc3BhY2UgPT0gTlVMTCkKLSAgICBhc19mYXRhbCAoXygiTm90IGluIGEgc3BhY2UuXG4iKSk7Ci0KLSAgaWYgKGN1cnJlbnRfc3Vic3BhY2UgPT0gTlVMTCkKLSAgICBhc19mYXRhbCAoXygiTm90IGluIGEgc3Vic3BhY2UuXG4iKSk7Ci19Ci0KLS8qIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBsYWJlbF9zeW1ib2xfc3RydWN0IGZvciB0aGUgY3VycmVudCBzcGFjZS4KLSAgIG9yIE5VTEwgaWYgbm8gbGFiZWxfc3ltYm9sX3N0cnVjdCBleGlzdHMgZm9yIHRoZSBjdXJyZW50IHNwYWNlLiAgKi8KLQotc3RhdGljIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKgotcGFfZ2V0X2xhYmVsICgpCi17Ci0gIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX2NoYWluOwotICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2NoYWluID0gY3VycmVudF9zcGFjZTsKLQotICBmb3IgKGxhYmVsX2NoYWluID0gbGFiZWxfc3ltYm9sc19yb290cDsKLSAgICAgICBsYWJlbF9jaGFpbjsKLSAgICAgICBsYWJlbF9jaGFpbiA9IGxhYmVsX2NoYWluLT5sc3NfbmV4dCkKLSAgICBpZiAoc3BhY2VfY2hhaW4gPT0gbGFiZWxfY2hhaW4tPmxzc19zcGFjZSAmJiBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsKQotICAgICAgcmV0dXJuIGxhYmVsX2NoYWluOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBEZWZpbmVzIGEgbGFiZWwgZm9yIHRoZSBjdXJyZW50IHNwYWNlLiAgSWYgb25lIGlzIGFscmVhZHkgZGVmaW5lZCwKLSAgIHRoaXMgZnVuY3Rpb24gd2lsbCByZXBsYWNlIGl0IHdpdGggdGhlIG5ldyBsYWJlbC4gICovCi0KLXZvaWQKLXBhX2RlZmluZV9sYWJlbCAoc3ltYm9sKQotICAgICBzeW1ib2xTICpzeW1ib2w7Ci17Ci0gIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX2NoYWluID0gcGFfZ2V0X2xhYmVsICgpOwotICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2NoYWluID0gY3VycmVudF9zcGFjZTsKLQotICBpZiAobGFiZWxfY2hhaW4pCi0gICAgbGFiZWxfY2hhaW4tPmxzc19sYWJlbCA9IHN5bWJvbDsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBhIG5ldyBsYWJlbCBlbnRyeSBhbmQgYWRkIGl0IHRvIHRoZSBoZWFkIG9mIHRoZSBjaGFpbi4gICovCi0gICAgICBsYWJlbF9jaGFpbgotCT0gKGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKikgeG1hbGxvYyAoc2l6ZW9mIChsYWJlbF9zeW1ib2xfc3RydWN0KSk7Ci0gICAgICBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsID0gc3ltYm9sOwotICAgICAgbGFiZWxfY2hhaW4tPmxzc19zcGFjZSA9IHNwYWNlX2NoYWluOwotICAgICAgbGFiZWxfY2hhaW4tPmxzc19uZXh0ID0gTlVMTDsKLQotICAgICAgaWYgKGxhYmVsX3N5bWJvbHNfcm9vdHApCi0JbGFiZWxfY2hhaW4tPmxzc19uZXh0ID0gbGFiZWxfc3ltYm9sc19yb290cDsKLQotICAgICAgbGFiZWxfc3ltYm9sc19yb290cCA9IGxhYmVsX2NoYWluOwotICAgIH0KLX0KLQotLyogUmVtb3ZlcyBhIGxhYmVsIGRlZmluaXRpb24gZm9yIHRoZSBjdXJyZW50IHNwYWNlLgotICAgSWYgdGhlcmUgaXMgbm8gbGFiZWxfc3ltYm9sX3N0cnVjdCBlbnRyeSwgdGhlbiBubyBhY3Rpb24gaXMgdGFrZW4uICAqLwotCi1zdGF0aWMgdm9pZAotcGFfdW5kZWZpbmVfbGFiZWwgKCkKLXsKLSAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfY2hhaW47Ci0gIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKnByZXZfbGFiZWxfY2hhaW4gPSBOVUxMOwotICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2NoYWluID0gY3VycmVudF9zcGFjZTsKLQotICBmb3IgKGxhYmVsX2NoYWluID0gbGFiZWxfc3ltYm9sc19yb290cDsKLSAgICAgICBsYWJlbF9jaGFpbjsKLSAgICAgICBsYWJlbF9jaGFpbiA9IGxhYmVsX2NoYWluLT5sc3NfbmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3BhY2VfY2hhaW4gPT0gbGFiZWxfY2hhaW4tPmxzc19zcGFjZSAmJiBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsKQotCXsKLQkgIC8qIFJlbW92ZSB0aGUgbGFiZWwgZnJvbSB0aGUgY2hhaW4gYW5kIGZyZWUgaXRzIG1lbW9yeS4gICovCi0JICBpZiAocHJldl9sYWJlbF9jaGFpbikKLQkgICAgcHJldl9sYWJlbF9jaGFpbi0+bHNzX25leHQgPSBsYWJlbF9jaGFpbi0+bHNzX25leHQ7Ci0JICBlbHNlCi0JICAgIGxhYmVsX3N5bWJvbHNfcm9vdHAgPSBsYWJlbF9jaGFpbi0+bHNzX25leHQ7Ci0KLQkgIGZyZWUgKGxhYmVsX2NoYWluKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHByZXZfbGFiZWxfY2hhaW4gPSBsYWJlbF9jaGFpbjsKLSAgICB9Ci19Ci0KLQotLyogQW4gSFBQQS1zcGVjaWZpYyB2ZXJzaW9uIG9mIGZpeF9uZXcuICBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgdGhlIEhQUEEKLSAgIGNvZGUgbmVlZHMgdG8ga2VlcCB0cmFjayBvZiBzb21lIGV4dHJhIHN0dWZmLiAgRWFjaCBjYWxsIHRvIGZpeF9uZXdfaHBwYQotICAgcmVzdWx0cyBpbiB0aGUgY3JlYXRpb24gb2YgYW4gaW5zdGFuY2Ugb2YgYW4gaHBwYV9maXhfc3RydWN0LiAgQW4KLSAgIGhwcGFfZml4X3N0cnVjdCBzdG9yZXMgdGhlIGV4dHJhIGluZm9ybWF0aW9uIGFsb25nIHdpdGggYSBwb2ludGVyIHRvIHRoZQotICAgb3JpZ2luYWwgZml4Uy4gIFRoaXMgaXMgYXR0YWNoZWQgdG8gdGhlIG9yaWdpbmFsIGZpeHVwIHZpYSB0aGUKLSAgIHRjX2ZpeF9kYXRhIGZpZWxkLiAgKi8KLQotc3RhdGljIHZvaWQKLWZpeF9uZXdfaHBwYSAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsIG9mZnNldCwgZXhwLCBwY3JlbCwKLQkgICAgICByX3R5cGUsIHJfZmllbGQsIHJfZm9ybWF0LCBhcmdfcmVsb2MsIHVud2luZF9iaXRzKQotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgaW50IHdoZXJlOwotICAgICBpbnQgc2l6ZTsKLSAgICAgc3ltYm9sUyAqYWRkX3N5bWJvbDsKLSAgICAgbG9uZyBvZmZzZXQ7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIGludCBwY3JlbDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZTsKLSAgICAgZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0IHJfZmllbGQ7Ci0gICAgIGludCByX2Zvcm1hdDsKLSAgICAgbG9uZyBhcmdfcmVsb2M7Ci0gICAgIGludCogdW53aW5kX2JpdHM7Ci17Ci0gIGZpeFMgKm5ld19maXg7Ci0KLSAgc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqaHBwYV9maXggPSAoc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqKQotICBvYnN0YWNrX2FsbG9jICgmbm90ZXMsIHNpemVvZiAoc3RydWN0IGhwcGFfZml4X3N0cnVjdCkpOwotCi0gIGlmIChleHAgIT0gTlVMTCkKLSAgICBuZXdfZml4ID0gZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsIHBjcmVsLCByX3R5cGUpOwotICBlbHNlCi0gICAgbmV3X2ZpeCA9IGZpeF9uZXcgKGZyYWcsIHdoZXJlLCBzaXplLCBhZGRfc3ltYm9sLCBvZmZzZXQsIHBjcmVsLCByX3R5cGUpOwotICBuZXdfZml4LT50Y19maXhfZGF0YSA9ICh2b2lkICopIGhwcGFfZml4OwotICBocHBhX2ZpeC0+Znhfcl90eXBlID0gcl90eXBlOwotICBocHBhX2ZpeC0+Znhfcl9maWVsZCA9IHJfZmllbGQ7Ci0gIGhwcGFfZml4LT5meF9yX2Zvcm1hdCA9IHJfZm9ybWF0OwotICBocHBhX2ZpeC0+ZnhfYXJnX3JlbG9jID0gYXJnX3JlbG9jOwotICBocHBhX2ZpeC0+c2VnbWVudCA9IG5vd19zZWc7Ci0jaWZkZWYgT0JKX1NPTQotICBpZiAocl90eXBlID09IFJfRU5UUlkgfHwgcl90eXBlID09IFJfRVhJVCkKLSAgICBuZXdfZml4LT5meF9vZmZzZXQgPSAqdW53aW5kX2JpdHM7Ci0jZW5kaWYKLQotICAvKiBmb28tJGdsb2JhbCQgaXMgdXNlZCB0byBhY2Nlc3Mgbm9uLWF1dG9tYXRpYyBzdG9yYWdlLiAgJGdsb2JhbCQKLSAgICAgaXMgcmVhbGx5IGp1c3QgYSBtYXJrZXIgYW5kIGhhcyBzZXJ2ZWQgaXRzIHB1cnBvc2UsIHNvIGVsaW1pbmF0ZQotICAgICBpdCBub3cgc28gYXMgbm90IHRvIGNvbmZ1c2Ugd3JpdGUuYy4gICovCi0gIGlmIChuZXdfZml4LT5meF9zdWJzeQotICAgICAgJiYgIXN0cmNtcCAoU19HRVRfTkFNRSAobmV3X2ZpeC0+Znhfc3Vic3kpLCAiJGdsb2JhbCQiKSkKLSAgICBuZXdfZml4LT5meF9zdWJzeSA9IE5VTEw7Ci19Ci0KLS8qIFBhcnNlIGEgLmJ5dGUsIC53b3JkLCAubG9uZyBleHByZXNzaW9uIGZvciB0aGUgSFBQQS4gIENhbGxlZCBieQotICAgY29ucyB2aWEgdGhlIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTiBtYWNyby4gICovCi0KLXZvaWQKLXBhcnNlX2NvbnNfZXhwcmVzc2lvbl9ocHBhIChleHApCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIGhwcGFfZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZpbnB1dF9saW5lX3BvaW50ZXIpOwotICBleHByZXNzaW9uIChleHApOwotfQotCi0vKiBUaGlzIGZpeF9uZXcgaXMgY2FsbGVkIGJ5IGNvbnMgdmlhIFRDX0NPTlNfRklYX05FVy4KLSAgIGhwcGFfZmllbGRfc2VsZWN0b3IgaXMgc2V0IGJ5IHRoZSBwYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYS4gICovCi0KLXZvaWQKLWNvbnNfZml4X25ld19ocHBhIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwKQotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgaW50IHdoZXJlOwotICAgICBpbnQgc2l6ZTsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgdW5zaWduZWQgaW50IHJlbF90eXBlOwotCi0gIC8qIEdldCBhIGJhc2UgcmVsb2NhdGlvbiB0eXBlLiAgKi8KLSAgaWYgKGlzX0RQX3JlbGF0aXZlICgqZXhwKSkKLSAgICByZWxfdHlwZSA9IFJfSFBQQV9HT1RPRkY7Ci0gIGVsc2UgaWYgKGlzX2NvbXBsZXggKCpleHApKQotICAgIHJlbF90eXBlID0gUl9IUFBBX0NPTVBMRVg7Ci0gIGVsc2UKLSAgICByZWxfdHlwZSA9IFJfSFBQQTsKLQotICBpZiAoaHBwYV9maWVsZF9zZWxlY3RvciAhPSBlX3BzZWwgJiYgaHBwYV9maWVsZF9zZWxlY3RvciAhPSBlX2ZzZWwpCi0gICAgYXNfd2FybiAoXygiSW52YWxpZCBmaWVsZCBzZWxlY3Rvci4gIEFzc3VtaW5nIEYlJS4iKSk7Ci0KLSAgZml4X25ld19ocHBhIChmcmFnLCB3aGVyZSwgc2l6ZSwKLQkJKHN5bWJvbFMgKikgTlVMTCwgKG9mZnNldFQpIDAsIGV4cCwgMCwgcmVsX3R5cGUsCi0JCWhwcGFfZmllbGRfc2VsZWN0b3IsIDMyLCAwLCBOVUxMKTsKLQotICAvKiBSZXNldCBmaWVsZCBzZWxlY3RvciB0byBpdHMgZGVmYXVsdCBzdGF0ZS4gICovCi0gIGhwcGFfZmllbGRfc2VsZWN0b3IgPSAwOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4gICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNvbnN0IGNoYXIgKnJldHZhbCA9IE5VTEw7Ci0gIGludCBsb3NlID0gMDsKLSAgdW5zaWduZWQgaW50IGkgPSAwOwotCi0gIGxhc3RfY2FsbF9pbmZvID0gTlVMTDsKLSAgY2FsbF9pbmZvX3Jvb3QgPSBOVUxMOwotCi0gIC8qIFNldCB0aGUgZGVmYXVsdCBtYWNoaW5lIHR5cGUuICAqLwotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIDEwKSkKLSAgICBhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLQotICAvKiBGb2xkaW5nIG9mIHRleHQgYW5kIGRhdGEgc2VnbWVudHMgZmFpbHMgbWlzZXJhYmx5IG9uIHRoZSBQQS4KLSAgICAgV2FybiB1c2VyIGFuZCBkaXNhYmxlICItUiIgb3B0aW9uLiAgKi8KLSAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi1SIG9wdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgdGFyZ2V0LiIpKTsKLSAgICAgIGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0ID0gMDsKLSAgICB9Ci0KLSAgcGFfc3BhY2VzX2JlZ2luICgpOwotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICB3aGlsZSAoaSA8IE5VTU9QQ09ERVMpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IHBhX29wY29kZXNbaV0ubmFtZTsKLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBuYW1lLCAoc3RydWN0IHBhX29wY29kZSAqKSAmcGFfb3Bjb2Rlc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsICE9IE5VTEwgJiYgKnJldHZhbCAhPSAnXDAnKQotCXsKLQkgIGFzX2ZhdGFsIChfKCJJbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBgJXMnOiAlc1xuIiksIG5hbWUsIHJldHZhbCk7Ci0JICBsb3NlID0gMTsKLQl9Ci0gICAgICBkbwotCXsKLQkgIGlmICgocGFfb3Bjb2Rlc1tpXS5tYXRjaCAmIHBhX29wY29kZXNbaV0ubWFzaykKLQkgICAgICAhPSBwYV9vcGNvZGVzW2ldLm1hdGNoKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJpbnRlcm5hbCBlcnJvcjogbG9zaW5nIG9wY29kZTogYCVzJyBcIiVzXCJcbiIpLAotCQkgICAgICAgcGFfb3Bjb2Rlc1tpXS5uYW1lLCBwYV9vcGNvZGVzW2ldLmFyZ3MpOwotCSAgICAgIGxvc2UgPSAxOwotCSAgICB9Ci0JICArK2k7Ci0JfQotICAgICAgd2hpbGUgKGkgPCBOVU1PUENPREVTICYmICFzdHJjbXAgKHBhX29wY29kZXNbaV0ubmFtZSwgbmFtZSkpOwotICAgIH0KLQotICBpZiAobG9zZSkKLSAgICBhc19mYXRhbCAoXygiQnJva2VuIGFzc2VtYmxlci4gIE5vIGFzc2VtYmx5IGF0dGVtcHRlZC4iKSk7Ci0KLSAgLyogU09NIHdpbGwgY2hhbmdlIHRleHRfc2VjdGlvbi4gIFRvIG1ha2Ugc3VyZSB3ZSBuZXZlciBwdXQKLSAgICAgYW55dGhpbmcgaW50byB0aGUgb2xkIG9uZSBzd2l0Y2ggdG8gdGhlIG5ldyBvbmUgbm93LiAgKi8KLSAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCAwKTsKLQotICBkdW1teV9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgiTCRkdW1teSIpOwotICBTX1NFVF9TRUdNRU5UIChkdW1teV9zeW1ib2wsIHRleHRfc2VjdGlvbik7Ci19Ci0KLS8qIEFzc2VtYmxlIGEgc2luZ2xlIGluc3RydWN0aW9uIHN0b3JpbmcgaXQgaW50byBhIGZyYWcuICAqLwotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICp0bzsKLQotICAvKiBUaGUgaGFkIGJldHRlciBiZSBzb21ldGhpbmcgdG8gYXNzZW1ibGUuICAqLwotICBhc3NlcnQgKHN0cik7Ci0KLSAgLyogSWYgd2UgYXJlIHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uLCBtYWtlIHN1cmUgd2UndmUKLSAgICAgZGVmaW5lZCBhIGxhYmVsIGZvciB0aGUgcHJvY2VkdXJlOyBoYW5kbGUgY2FzZSB3aGVyZSB0aGUKLSAgICAgbGFiZWwgd2FzIGRlZmluZWQgYWZ0ZXIgdGhlIC5QUk9DIGRpcmVjdGl2ZS4KLQotICAgICBOb3RlIHRoZXJlJ3Mgbm90IG5lZWQgdG8gZGlkZGxlIHdpdGggdGhlIHNlZ21lbnQgb3IgZnJhZ21lbnQKLSAgICAgZm9yIHRoZSBsYWJlbCBzeW1ib2wgaW4gdGhpcyBjYXNlLiAgV2UgaGF2ZSBhbHJlYWR5IHN3aXRjaGVkCi0gICAgIGludG8gdGhlIG5ldyAkQ09ERSQgc3Vic3BhY2UgYXQgdGhpcyBwb2ludC4gICovCi0gIGlmICh3aXRoaW5fcHJvY2VkdXJlICYmIGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9zeW1ib2wgPSBwYV9nZXRfbGFiZWwgKCk7Ci0KLSAgICAgIGlmIChsYWJlbF9zeW1ib2wpCi0JewotCSAgaWYgKGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsKQotCSAgICB7Ci0JICAgICAgbGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOwotCSAgICAgIGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsLT5ic3ltLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0jaWZkZWYgT0JKX1NPTQotCSAgICAgIC8qIEFsc28gaGFuZGxlIGFsbG9jYXRpb24gb2YgYSBmaXh1cCB0byBob2xkIHRoZSB1bndpbmQKLQkJIGluZm9ybWF0aW9uIHdoZW4gdGhlIGxhYmVsIGFwcGVhcnMgYWZ0ZXIgdGhlIHByb2MvcHJvY2VuZC4gICovCi0JICAgICAgaWYgKHdpdGhpbl9lbnRyeV9leGl0KQotCQl7Ci0JCSAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDApOwotCi0JCSAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKLQkJCQlOVUxMLCAob2Zmc2V0VCkgMCwgTlVMTCwKLQkJCQkwLCBSX0hQUEFfRU5UUlksIGVfZnNlbCwgMCwgMCwKLQkJCQkoaW50ICopJmxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvcik7Ci0JCX0KLSNlbmRpZgotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFzX2JhZCAoXygiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyAoY29ycnVwdGVkIGxhYmVsIGNoYWluKSIpKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIikpOwotICAgIH0KLQotICAvKiBBc3NlbWJsZSB0aGUgaW5zdHJ1Y3Rpb24uICBSZXN1bHRzIGFyZSBzYXZlZCBpbnRvICJ0aGVfaW5zbiIuICAqLwotICBwYV9pcCAoc3RyKTsKLQotICAvKiBHZXQgc29tZXdoZXJlIHRvIHB1dCB0aGUgYXNzZW1ibGVkIGluc3RydXRpb24uICAqLwotICB0byA9IGZyYWdfbW9yZSAoNCk7Ci0KLSAgLyogT3V0cHV0IHRoZSBvcGNvZGUuICovCi0gIG1kX251bWJlcl90b19jaGFycyAodG8sIHRoZV9pbnNuLm9wY29kZSwgNCk7Ci0KLSAgLyogSWYgbmVjZXNzYXJ5IG91dHB1dCBtb3JlIHN0dWZmLiAgKi8KLSAgaWYgKHRoZV9pbnNuLnJlbG9jICE9IFJfSFBQQV9OT05FKQotICAgIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csICh0byAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwgNCwgTlVMTCwKLQkJICAob2Zmc2V0VCkgMCwgJnRoZV9pbnNuLmV4cCwgdGhlX2luc24ucGNyZWwsCi0JCSAgdGhlX2luc24ucmVsb2MsIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yLAotCQkgIHRoZV9pbnNuLmZvcm1hdCwgdGhlX2luc24uYXJnX3JlbG9jLCBOVUxMKTsKLX0KLQotLyogRG8gdGhlIHJlYWwgd29yayBmb3IgYXNzZW1ibGluZyBhIHNpbmdsZSBpbnN0cnVjdGlvbi4gIFN0b3JlIHJlc3VsdHMKLSAgIGludG8gdGhlIGdsb2JhbCAidGhlX2luc24iIHZhcmlhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2lwIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqZXJyb3JfbWVzc2FnZSA9ICIiOwotICBjaGFyICpzLCBjLCAqYXJnc3RhcnQsICpuYW1lLCAqc2F2ZV9zOwotICBjb25zdCBjaGFyICphcmdzOwotICBpbnQgbWF0Y2ggPSBGQUxTRTsKLSAgaW50IGNvbW1hID0gMDsKLSAgaW50IGNtcGx0ciwgbnVsbGlmLCBmbGFnLCBjb25kLCBudW07Ci0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICBzdHJ1Y3QgcGFfb3Bjb2RlICppbnNuOwotCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotCi0gIC8qIFNraXAgdG8gc29tZXRoaW5nIGludGVyZXN0aW5nLiAgKi8KLSAgZm9yIChzID0gc3RyOyBpc3VwcGVyICgqcykgfHwgaXNsb3dlciAoKnMpIHx8ICgqcyA+PSAnMCcgJiYgKnMgPD0gJzMnKTsgKytzKQotICAgIDsKLQotICBzd2l0Y2ggKCpzKQotICAgIHsKLQotICAgIGNhc2UgJ1wwJzoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnLCc6Ci0gICAgICBjb21tYSA9IDE7Ci0KLSAgICAgIC8qRkFMTFRIUk9VR0ggKi8KLQotICAgIGNhc2UgJyAnOgotICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiVW5rbm93biBvcGNvZGU6IGAlcyciKSwgc3RyKTsKLSAgICB9Ci0KLSAgc2F2ZV9zID0gc3RyOwotCi0gIC8qIENvbnZlcnQgZXZlcnl0aGluZyBpbnRvIGxvd2VyIGNhc2UuICAqLwotICB3aGlsZSAoKnNhdmVfcykKLSAgICB7Ci0gICAgICBpZiAoaXN1cHBlciAoKnNhdmVfcykpCi0JKnNhdmVfcyA9IHRvbG93ZXIgKCpzYXZlX3MpOwotICAgICAgc2F2ZV9zKys7Ci0gICAgfQotCi0gIC8qIExvb2sgdXAgdGhlIG9wY29kZSBpbiB0aGUgaGFzIHRhYmxlLiAgKi8KLSAgaWYgKChpbnNuID0gKHN0cnVjdCBwYV9vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBzdHIpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoIlVua25vd24gb3Bjb2RlOiBgJXMnIiwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGNvbW1hKQotICAgIHsKLSAgICAgICotLXMgPSAnLCc7Ci0gICAgfQotCi0gIC8qIE1hcmsgdGhlIGxvY2F0aW9uIHdoZXJlIGFyZ3VtZW50cyBmb3IgdGhlIGluc3RydWN0aW9uIHN0YXJ0LCB0aGVuCi0gICAgIHN0YXJ0IHByb2Nlc3NpbmcgdGhlbS4gICovCi0gIGFyZ3N0YXJ0ID0gczsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICAvKiBEbyBzb21lIGluaXRpYWxpemF0aW9uLiAgKi8KLSAgICAgIG9wY29kZSA9IGluc24tPm1hdGNoOwotICAgICAgbWVtc2V0ICgmdGhlX2luc24sIDAsIHNpemVvZiAodGhlX2luc24pKTsKLQotICAgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfTk9ORTsKLQotICAgICAgLyogSWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlLAotCSB0aGVuIHNldCBhIG5ldyBhcmNoaXRlY3R1cmUuICAqLwotICAgICAgLyogQnV0IGRvIG5vdCBhdXRvbWF0aWNhbGx5IHByb21vdGUgdG8gcGEyLjAuICBUaGUgYXV0b21hdGljIHByb21vdGlvbgotCSBjcnVkIGlzIGZvciBjb21wYXRhYmlsaXR5IHdpdGggSFAncyBvbGQgYXNzZW1ibGVycyBvbmx5LiAgKi8KLSAgICAgIGlmIChpbnNuLT5hcmNoIDwgMjAKLQkgICYmIGJmZF9nZXRfbWFjaCAoc3Rkb3V0cHV0KSA8IGluc24tPmFyY2gpCi0JewotCSAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9ocHBhLCBpbnNuLT5hcmNoKSkKLQkgICAgYXNfd2FybiAoXygiY291bGQgbm90IHVwZGF0ZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0JfQotICAgICAgZWxzZSBpZiAoYmZkX2dldF9tYWNoIChzdGRvdXRwdXQpIDwgaW5zbi0+YXJjaCkKLQl7Ci0JICBtYXRjaCA9IEZBTFNFOwotCSAgZ290byBmYWlsZWQ7Ci0JfQotCi0gICAgICAvKiBCdWlsZCB0aGUgb3Bjb2RlLCBjaGVja2luZyBhcyB3ZSBnbyB0byBtYWtlCi0gICAgICAgICBzdXJlIHRoYXQgdGhlIG9wZXJhbmRzIG1hdGNoLiAgKi8KLSAgICAgIGZvciAoYXJncyA9IGluc24tPmFyZ3M7OyArK2FyZ3MpCi0JewotCSAgc3dpdGNoICgqYXJncykKLQkgICAgewotCi0JICAgIC8qIEVuZCBvZiBhcmd1bWVudHMuICAqLwotCSAgICBjYXNlICdcMCc6Ci0JICAgICAgaWYgKCpzID09ICdcMCcpCi0JCW1hdGNoID0gVFJVRTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcrJzoKLQkgICAgICBpZiAoKnMgPT0gJysnKQotCQl7Ci0JCSAgKytzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKCpzID09ICctJykKLQkJY29udGludWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogVGhlc2UgbXVzdCBtYXRjaCBleGFjdGx5LiAgKi8KLQkgICAgY2FzZSAnKCc6Ci0JICAgIGNhc2UgJyknOgotCSAgICBjYXNlICcsJzoKLQkgICAgY2FzZSAnICc6Ci0JICAgICAgaWYgKCpzKysgPT0gKmFyZ3MpCi0JCWNvbnRpbnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IHJlZ2lzdGVyIG9yIGNvbnRyb2wgcmVnaXN0ZXIgZmllbGQgYXQgMTAuICAqLwotCSAgICBjYXNlICdiJzoKLQkgICAgY2FzZSAnXic6Ci0JICAgICAgbnVtID0gcGFfcGFyc2VfbnVtYmVyICgmcywgMCk7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzEsIDAsIDApOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAyMSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgcmVnaXN0ZXIgZmllbGQgYXQgMTUuICAqLwotCSAgICBjYXNlICd4JzoKLQkgICAgICBudW0gPSBwYV9wYXJzZV9udW1iZXIgKCZzLCAwKTsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDE2KTsKLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCByZWdpc3RlciBmaWVsZCBhdCAzMS4gICovCi0JICAgIGNhc2UgJ3knOgotCSAgICBjYXNlICd0JzoKLQkgICAgICBudW0gPSBwYV9wYXJzZV9udW1iZXIgKCZzLCAwKTsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IGZpZWxkIGxlbmd0aCBhdCAzMS4gICovCi0JICAgIGNhc2UgJ1QnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzIsIDEsIDApOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgMzIgLSBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IGltbWVkaWF0ZSBhdCAxNS4gICovCi0JICAgIGNhc2UgJzUnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMTUsIC0xNiwgMCk7Ci0JICAgICAgbG93X3NpZ25fdW5leHQgKG51bSwgNSwgJm51bSk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDE2KTsKLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLwotCSAgICBjYXNlICdWJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDE1LCAtMTYsIDApCi0JICAgICAgbG93X3NpZ25fdW5leHQgKG51bSwgNSwgJm51bSk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhbiB1bnNpZ25lZCA1IGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLwotCSAgICBjYXNlICdyJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGFuIHVuc2lnbmVkIDUgYml0IGltbWVkaWF0ZSBhdCAxNS4gICovCi0JICAgIGNhc2UgJ1InOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzEsIDAsIDApOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAxNik7Ci0KLQkgICAgLyogSGFuZGxlIGEgMiBiaXQgc3BhY2UgaWRlbnRpZmllciBhdCAxNy4gICovCi0JICAgIGNhc2UgJ3MnOgotCSAgICAgIG51bSA9IHBhX3BhcnNlX251bWJlciAoJnMsIDApOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMsIDAsIDEpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAxNCk7Ci0KLQkgICAgLyogSGFuZGxlIGEgMyBiaXQgc3BhY2UgaWRlbnRpZmllciBhdCAxOC4gICovCi0JICAgIGNhc2UgJ1MnOgotCSAgICAgIG51bSA9IHBhX3BhcnNlX251bWJlciAoJnMsIDApOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDcsIDAsIDEpOwotCSAgICAgIGRpc19hc3NlbWJsZV8zIChudW0sICZudW0pOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAxMyk7Ci0KLQkgICAgLyogSGFuZGxlIGEgY29tcGxldGVyIGZvciBhbiBpbmRleGluZyBsb2FkIG9yIHN0b3JlLiAgKi8KLQkgICAgY2FzZSAnYyc6Ci0JICAgICAgewotCQlpbnQgdXUgPSAwOwotCQlpbnQgbSA9IDA7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKCpzID09ICcsJyAmJiBpIDwgMikKLQkJICB7Ci0JCSAgICBzKys7Ci0JCSAgICBpZiAoc3RybmNhc2VjbXAgKHMsICJzbSIsIDIpID09IDApCi0JCSAgICAgIHsKLQkJCXV1ID0gMTsKLQkJCW0gPSAxOwotCQkJcysrOwotCQkJaSsrOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm0iLCAxKSA9PSAwKQotCQkgICAgICBtID0gMTsKLQkJICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAicyIsIDEpID09IDApCi0JCSAgICAgIHV1ID0gMTsKLQkJICAgIGVsc2UKLQkJICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIEluZGV4ZWQgTG9hZCBDb21wbGV0ZXIuIikpOwotCQkgICAgcysrOwotCQkgICAgaSsrOwotCQkgIH0KLQkJaWYgKGkgPiAyKQotCQkgIGFzX2JhZCAoXygiSW52YWxpZCBJbmRleGVkIExvYWQgQ29tcGxldGVyIFN5bnRheC4iKSk7Ci0JCW9wY29kZSB8PSBtIDw8IDU7Ci0JCUlOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgdXUsIDEzKTsKLQkgICAgICB9Ci0KLQkgICAgLyogSGFuZGxlIGEgc2hvcnQgbG9hZC9zdG9yZSBjb21wbGV0ZXIuICAqLwotCSAgICBjYXNlICdDJzoKLQkgICAgICB7Ci0JCWludCBhID0gMDsKLQkJaW50IG0gPSAwOwotCQlpZiAoKnMgPT0gJywnKQotCQkgIHsKLQkJICAgIHMrKzsKLQkJICAgIGlmIChzdHJuY2FzZWNtcCAocywgIm1hIiwgMikgPT0gMCkKLQkJICAgICAgewotCQkJYSA9IDA7Ci0JCQltID0gMTsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJtYiIsIDIpID09IDApCi0JCSAgICAgIHsKLQkJCWEgPSAxOwotCQkJbSA9IDE7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIFNob3J0IExvYWQvU3RvcmUgQ29tcGxldGVyLiIpKTsKLQkJICAgIHMgKz0gMjsKLQkJICB9Ci0KLQkJaWYgKCphcmdzID09ICdDJykKLQkJICB7Ci0JCSAgICBvcGNvZGUgfD0gbSA8PCA1OwotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBhLCAxMyk7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICAvKiBIYW5kbGUgYSBzdGJ5cyBjb21wbGV0ZXIuICAqLwotCSAgICBjYXNlICdZJzoKLQkgICAgICB7Ci0JCWludCBhID0gMDsKLQkJaW50IG0gPSAwOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlICgqcyA9PSAnLCcgJiYgaSA8IDIpCi0JCSAgewotCQkgICAgcysrOwotCQkgICAgaWYgKHN0cm5jYXNlY21wIChzLCAibSIsIDEpID09IDApCi0JCSAgICAgIG0gPSAxOwotCQkgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJiIiwgMSkgPT0gMCkKLQkJICAgICAgYSA9IDA7Ci0JCSAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgImUiLCAxKSA9PSAwKQotCQkgICAgICBhID0gMTsKLQkJICAgIGVsc2UKLQkJICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIFN0b3JlIEJ5dGVzIFNob3J0IENvbXBsZXRlciIpKTsKLQkJICAgIHMrKzsKLQkJICAgIGkrKzsKLQkJICB9Ci0JCWlmIChpID4gMikKLQkJICBhc19iYWQgKF8oIkludmFsaWQgU3RvcmUgQnl0ZXMgU2hvcnQgQ29tcGxldGVyIikpOwotCQlvcGNvZGUgfD0gbSA8PCA1OwotCQlJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGEsIDEzKTsKLQkgICAgICB9Ci0KLQkgICAgLyogSGFuZGxlIGEgbm9uLW5lZ2F0ZWQgY29tcGFyZS9zdHVidHJhY3QgY29uZGl0aW9uLiAgKi8KLQkgICAgY2FzZSAnPCc6Ci0JICAgICAgY21wbHRyID0gcGFfcGFyc2Vfbm9ubmVnX2NtcHN1Yl9jbXBsdHIgKCZzLCAxKTsKLQkgICAgICBpZiAoY21wbHRyIDwgMCkKLQkJewotCQkgIGFzX2JhZCAoXygiSW52YWxpZCBDb21wYXJlL1N1YnRyYWN0IENvbmRpdGlvbjogJWMiKSwgKnMpOwotCQkgIGNtcGx0ciA9IDA7Ci0JCX0KLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTMpOwotCi0JICAgIC8qIEhhbmRsZSBhIG5lZ2F0ZWQgb3Igbm9uLW5lZ2F0ZWQgY29tcGFyZS9zdWJ0cmFjdCBjb25kaXRpb24uICAqLwotCSAgICBjYXNlICc/JzoKLQkgICAgICBzYXZlX3MgPSBzOwotCSAgICAgIGNtcGx0ciA9IHBhX3BhcnNlX25vbm5lZ19jbXBzdWJfY21wbHRyICgmcywgMSk7Ci0JICAgICAgaWYgKGNtcGx0ciA8IDApCi0JCXsKLQkJICBzID0gc2F2ZV9zOwotCQkgIGNtcGx0ciA9IHBhX3BhcnNlX25lZ19jbXBzdWJfY21wbHRyICgmcywgMSk7Ci0JCSAgaWYgKGNtcGx0ciA8IDApCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBDb21wYXJlL1N1YnRyYWN0IENvbmRpdGlvbi4iKSk7Ci0JCSAgICAgIGNtcGx0ciA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBOZWdhdGVkIGNvbmRpdGlvbiByZXF1aXJlcyBhbiBvcGNvZGUgY2hhbmdlLiAgKi8KLQkJICAgICAgb3Bjb2RlIHw9IDEgPDwgMjc7Ci0JCSAgICB9Ci0JCX0KLQkKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTMpOwotCi0JICAgIC8qIEhhbmRsZSBub24tbmVnYXRlZCBhZGQgY29uZGl0aW9uLiAgKi8KLQkgICAgY2FzZSAnISc6Ci0JICAgICAgY21wbHRyID0gcGFfcGFyc2Vfbm9ubmVnX2FkZF9jbXBsdHIgKCZzLCAxKTsKLQkgICAgICBpZiAoY21wbHRyIDwgMCkKLQkJewotCQkgIGFzX2JhZCAoXygiSW52YWxpZCBDb21wYXJlL1N1YnRyYWN0IENvbmRpdGlvbjogJWMiKSwgKnMpOwotCQkgIGNtcGx0ciA9IDA7Ci0JCX0KLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTMpOwotCi0JICAgIC8qIEhhbmRsZSBhIG5lZ2F0ZWQgb3Igbm9uLW5lZ2F0ZWQgYWRkIGNvbmRpdGlvbi4gICovCi0JICAgIGNhc2UgJ0AnOgotCSAgICAgIHNhdmVfcyA9IHM7Ci0JICAgICAgY21wbHRyID0gcGFfcGFyc2Vfbm9ubmVnX2FkZF9jbXBsdHIgKCZzLCAxKTsKLQkgICAgICBpZiAoY21wbHRyIDwgMCkKLQkJewotCQkgIHMgPSBzYXZlX3M7Ci0JCSAgY21wbHRyID0gcGFfcGFyc2VfbmVnX2FkZF9jbXBsdHIgKCZzLCAxKTsKLQkJICBpZiAoY21wbHRyIDwgMCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uIikpOwotCQkgICAgICBjbXBsdHIgPSAwOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogTmVnYXRlZCBjb25kaXRpb24gcmVxdWlyZXMgYW4gb3Bjb2RlIGNoYW5nZS4gICovCi0JCSAgICAgIG9wY29kZSB8PSAxIDw8IDI3OwotCQkgICAgfQotCQl9Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIsIDEzKTsKLQotCSAgICAvKiBIYW5kbGUgYSBjb21wYXJlL3N1YnRyYWN0IGNvbmRpdGlvbi4gICovCi0JICAgIGNhc2UgJ2EnOgotCSAgICAgIGNtcGx0ciA9IDA7Ci0JICAgICAgZmxhZyA9IDA7Ci0JICAgICAgaWYgKCpzID09ICcsJykKLQkJewotCQkgIHMrKzsKLQkJICBuYW1lID0gczsKLQkJICB3aGlsZSAoKnMgIT0gJywnICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKQotCQkgICAgcyArPSAxOwotCQkgIGMgPSAqczsKLQkJICAqcyA9IDB4MDA7Ci0JCSAgaWYgKHN0cmNtcCAobmFtZSwgIj0iKSA9PSAwKQotCQkgICAgY21wbHRyID0gMTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8IikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDI7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD0iKSA9PSAwKQotCQkgICAgY21wbHRyID0gMzsKLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiPDwiKSA9PSAwKQotCQkgICAgY21wbHRyID0gNDsKLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiPDw9IikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDU7Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInN2IikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDY7Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm9kIikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDc7Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInRyIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMDsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD4iKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAxOwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDI7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4iKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAzOwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiPj49IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gNDsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIj4+IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gNTsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm5zdiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDY7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJldiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDc7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFzX2JhZCAoXygiSW52YWxpZCBBZGQgQ29uZGl0aW9uOiAlcyIpLCBuYW1lKTsKLQkJICAqcyA9IGM7Ci0JCX0KLQkgICAgICBvcGNvZGUgfD0gY21wbHRyIDw8IDEzOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTIpOwotCi0JICAgIC8qIEhhbmRsZSBhIG5vbi1uZWdhdGVkIGFkZCBjb25kaXRpb24uICAqLwotCSAgICBjYXNlICdkJzoKLQkgICAgICBjbXBsdHIgPSAwOwotCSAgICAgIGZsYWcgPSAwOwotCSAgICAgIGlmICgqcyA9PSAnLCcpCi0JCXsKLQkJICBzKys7Ci0JCSAgbmFtZSA9IHM7Ci0JCSAgd2hpbGUgKCpzICE9ICcsJyAmJiAqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JykKLQkJICAgIHMgKz0gMTsKLQkJICBjID0gKnM7Ci0JCSAgKnMgPSAweDAwOwotCQkgIGlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPCIpID09IDApCi0JCSAgICBjbXBsdHIgPSAyOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw9IikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDM7Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm51diIpID09IDApCi0JCSAgICBjbXBsdHIgPSA0OwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ6bnYiKSA9PSAwKQotCQkgICAgY21wbHRyID0gNTsKLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAic3YiKSA9PSAwKQotCQkgICAgY21wbHRyID0gNjsKLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAib2QiKSA9PSAwKQotCQkgICAgY21wbHRyID0gNzsKLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAidHIiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAwOwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDE7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj49IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMjsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDM7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ1diIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDQ7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ2bnoiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSA1OwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibnN2IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gNjsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImV2IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gNzsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYXNfYmFkIChfKCJJbnZhbGlkIEFkZCBDb25kaXRpb246ICVzIiksIG5hbWUpOwotCQkgICpzID0gYzsKLQkJfQotCSAgICAgIG9wY29kZSB8PSBjbXBsdHIgPDwgMTM7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMik7Ci0KLQkgICAgLyogSEFORExFIGEgbG9naWNhbCBpbnN0cnVjdGlvbiBjb25kaXRpb24uICAqLwotCSAgICBjYXNlICcmJzoKLQkgICAgICBjbXBsdHIgPSAwOwotCSAgICAgIGZsYWcgPSAwOwotCSAgICAgIGlmICgqcyA9PSAnLCcpCi0JCXsKLQkJICBzKys7Ci0JCSAgbmFtZSA9IHM7Ci0JCSAgd2hpbGUgKCpzICE9ICcsJyAmJiAqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JykKLQkJICAgIHMgKz0gMTsKLQkJICBjID0gKnM7Ci0JCSAgKnMgPSAweDAwOwotCi0KLQkJICBpZiAoc3RyY21wIChuYW1lLCAiPSIpID09IDApCi0JCSAgICBjbXBsdHIgPSAxOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQotCQkgICAgY21wbHRyID0gMjsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PSIpID09IDApCi0JCSAgICBjbXBsdHIgPSAzOwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJvZCIpID09IDApCi0JCSAgICBjbXBsdHIgPSA3OwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ0ciIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDA7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw+IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMTsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPj0iKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAyOwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMzsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImV2IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gNzsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYXNfYmFkIChfKCJJbnZhbGlkIExvZ2ljYWwgSW5zdHJ1Y3Rpb24gQ29uZGl0aW9uLiIpKTsKLQkJICAqcyA9IGM7Ci0JCX0KLQkgICAgICBvcGNvZGUgfD0gY21wbHRyIDw8IDEzOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTIpOwotCi0JICAgIC8qIEhhbmRsZSBhIHVuaXQgaW5zdHJ1Y3Rpb24gY29uZGl0aW9uLiAgKi8KLQkgICAgY2FzZSAnVSc6Ci0JICAgICAgY21wbHRyID0gMDsKLQkgICAgICBmbGFnID0gMDsKLQkgICAgICBpZiAoKnMgPT0gJywnKQotCQl7Ci0JCSAgcysrOwotCi0KLQkJICBpZiAoc3RybmNhc2VjbXAgKHMsICJzYnoiLCAzKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAyOwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzaHoiLCAzKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAzOwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzZGMiLCAzKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSA0OwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzYmMiLCAzKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSA2OwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzaGMiLCAzKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSA3OwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJ0ciIsIDIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDA7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDI7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJuYnoiLCAzKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAyOwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgICAgcyArPSAzOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAibmh6IiwgMykgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMzsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm5kYyIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDQ7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJuYmMiLCAzKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSA2OwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgICAgcyArPSAzOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAibmhjIiwgMykgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gNzsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBhc19iYWQgKF8oIkludmFsaWQgTG9naWNhbCBJbnN0cnVjdGlvbiBDb25kaXRpb24uIikpOwotCQl9Ci0JICAgICAgb3Bjb2RlIHw9IGNtcGx0ciA8PCAxMzsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDEyKTsKLQotCSAgICAvKiBIYW5kbGUgYSBzaGlmdC9leHRyYWN0L2RlcG9zaXQgY29uZGl0aW9uLiAgKi8KLQkgICAgY2FzZSAnfCc6Ci0JICAgIGNhc2UgJz4nOgotCSAgICAgIGNtcGx0ciA9IDA7Ci0JICAgICAgaWYgKCpzID09ICcsJykKLQkJewotCQkgIHNhdmVfcyA9IHMrKzsKLQotCi0JCSAgbmFtZSA9IHM7Ci0JCSAgd2hpbGUgKCpzICE9ICcsJyAmJiAqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JykKLQkJICAgIHMgKz0gMTsKLQkJICBjID0gKnM7Ci0JCSAgKnMgPSAweDAwOwotCQkgIGlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPCIpID09IDApCi0JCSAgICBjbXBsdHIgPSAyOwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJvZCIpID09IDApCi0JCSAgICBjbXBsdHIgPSAzOwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ0ciIpID09IDApCi0JCSAgICBjbXBsdHIgPSA0OwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw+IikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDU7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPj0iKSA9PSAwKQotCQkgICAgY21wbHRyID0gNjsKLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiZXYiKSA9PSAwKQotCQkgICAgY21wbHRyID0gNzsKLQkJICAvKiBIYW5kbGUgbW92YixuLiAgUHV0IHRoaW5ncyBiYWNrIHRoZSB3YXkgdGhleSB3ZXJlLgotCQkgICAgIFRoaXMgaW5jbHVkZXMgbW92aW5nIHMgYmFjayB0byB3aGVyZSBpdCBzdGFydGVkLiAgKi8KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibiIpID09IDAgJiYgKmFyZ3MgPT0gJ3wnKQotCQkgICAgewotCQkgICAgICAqcyA9IGM7Ci0JCSAgICAgIHMgPSBzYXZlX3M7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFzX2JhZCAoXygiSW52YWxpZCBTaGlmdC9FeHRyYWN0L0RlcG9zaXQgQ29uZGl0aW9uLiIpKTsKLQkJICAqcyA9IGM7Ci0JCX0KLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTMpOwotCi0JICAgIC8qIEhhbmRsZSBidmIgYW5kIGJiIGNvbmRpdGlvbnMuICAqLwotCSAgICBjYXNlICd+JzoKLQkgICAgICBjbXBsdHIgPSAwOwotCSAgICAgIGlmICgqcyA9PSAnLCcpCi0JCXsKLQkJICBzKys7Ci0JCSAgaWYgKHN0cm5jbXAgKHMsICI8IiwgMSkgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMDsKLQkJICAgICAgcysrOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cm5jbXAgKHMsICI+PSIsIDIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDE7Ci0JCSAgICAgIHMgKz0gMjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBhc19iYWQgKF8oIkludmFsaWQgQml0IEJyYW5jaCBDb25kaXRpb246ICVjIiksICpzKTsKLQkJfQotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxNSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgc3lzdGVtIGNvbnRyb2wgY29tcGxldGVyLiAgKi8KLQkgICAgY2FzZSAnWic6Ci0JICAgICAgaWYgKCpzID09ICcsJyAmJiAoKihzICsgMSkgPT0gJ20nIHx8ICoocyArIDEpID09ICdNJykpCi0JCXsKLQkJICBmbGFnID0gMTsKLQkJICBzICs9IDI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWZsYWcgPSAwOwotCi0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCA1KTsKLQotCSAgICAvKiBIYW5kbGUgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgYnJhbmNoIGluc3RydWN0aW9ucy4gICovCi0JICAgIGNhc2UgJ24nOgotCSAgICAgIG51bGxpZiA9IHBhX3BhcnNlX251bGxpZiAoJnMpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVsbGlmLCAxKTsKLQotCSAgICAvKiBIYW5kbGUgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgY29wciBhbmQgc3BvcCBpbnNucy4gICovCi0JICAgIGNhc2UgJ04nOgotCSAgICAgIG51bGxpZiA9IHBhX3BhcnNlX251bGxpZiAoJnMpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVsbGlmLCA1KTsKLQotCi0JICAgIC8qIEhhbmRsZSBhIDExIGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLwotCSAgICBjYXNlICdpJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBDSEVDS19GSUVMRCAobnVtLCAxMDIzLCAtMTAyNCwgMCk7Ci0JCSAgbG93X3NpZ25fdW5leHQgKG51bSwgMTEsICZudW0pOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChpc19EUF9yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX0dPVE9GRjsKLQkJICBlbHNlIGlmIChpc19QQ19yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX1BDUkVMX0NBTEw7Ci0JCSAgZWxzZQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEE7Ci0JCSAgdGhlX2luc24uZm9ybWF0ID0gMTE7Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCi0JICAgIC8qIEhhbmRsZSBhIDE0IGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLwotCSAgICBjYXNlICdqJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBDSEVDS19GSUVMRCAobnVtLCA4MTkxLCAtODE5MiwgMCk7Ci0JCSAgbG93X3NpZ25fdW5leHQgKG51bSwgMTQsICZudW0pOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChpc19EUF9yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX0dPVE9GRjsKLQkJICBlbHNlIGlmIChpc19QQ19yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX1BDUkVMX0NBTEw7Ci0JCSAgZWxzZQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEE7Ci0JCSAgdGhlX2luc24uZm9ybWF0ID0gMTQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAvKiBIYW5kbGUgYSAyMSBiaXQgaW1tZWRpYXRlIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAnayc6Ci0JICAgICAgdGhlX2luc24uZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZzKTsKLQkgICAgICBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCQl7Ci0JCSAgbnVtID0gZXZhbHVhdGVfYWJzb2x1dGUgKCZ0aGVfaW5zbik7Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSA+PiAxMSwgMTA0ODU3NSwgLTEwNDg1NzYsIDApOwotCQkgIGRpc19hc3NlbWJsZV8yMSAobnVtLCAmbnVtKTsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoaXNfRFBfcmVsYXRpdmUgKHRoZV9pbnNuLmV4cCkpCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9HT1RPRkY7Ci0JCSAgZWxzZSBpZiAoaXNfUENfcmVsYXRpdmUgKHRoZV9pbnNuLmV4cCkpCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9QQ1JFTF9DQUxMOwotCQkgIGVsc2UKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBOwotCQkgIHRoZV9pbnNuLmZvcm1hdCA9IDIxOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIGEgMTIgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQuICAqLwotCSAgICBjYXNlICd3JzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIGlmICghc3RyY21wIChTX0dFVF9OQU1FICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKSwgIkwkMFwwMDEiKSkKLQkJewotCQkgIHVuc2lnbmVkIGludCB3MSwgdywgcmVzdWx0OwotCi0JCSAgbnVtID0gZXZhbHVhdGVfYWJzb2x1dGUgKCZ0aGVfaW5zbik7Ci0JCSAgaWYgKG51bSAlIDQpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoXygiQnJhbmNoIHRvIHVuYWxpZ25lZCBhZGRyZXNzIikpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBDSEVDS19GSUVMRCAobnVtLCA4MTk5LCAtODE4NCwgMCk7Ci0JCSAgc2lnbl91bmV4dCAoKG51bSAtIDgpID4+IDIsIDEyLCAmcmVzdWx0KTsKLQkJICBkaXNfYXNzZW1ibGVfMTIgKHJlc3VsdCwgJncxLCAmdyk7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCAoKHcxIDw8IDIpIHwgdyksIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxMjsKLQkJICB0aGVfaW5zbi5hcmdfcmVsb2MgPSBsYXN0X2NhbGxfZGVzYy5hcmdfcmVsb2M7Ci0JCSAgbWVtc2V0ICgmbGFzdF9jYWxsX2Rlc2MsIDAsIHNpemVvZiAoc3RydWN0IGNhbGxfZGVzYykpOwotCQkgIHMgPSBleHByX2VuZDsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgIC8qIEhhbmRsZSBhIDE3IGJpdCBicmFuY2ggZGlzcGxhY2VtZW50LiAgKi8KLQkgICAgY2FzZSAnVyc6Ci0JICAgICAgdGhlX2luc24uZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZzKTsKLQkgICAgICBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKLQkgICAgICBpZiAoIXRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wKLQkJICB8fCAhc3RyY21wIChTX0dFVF9OQU1FICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKSwKLQkJCSAgICAgICJMJDBcMDAxIikpCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgdzIsIHcxLCB3LCByZXN1bHQ7Ci0KLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBpZiAobnVtICUgNCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJCcmFuY2ggdG8gdW5hbGlnbmVkIGFkZHJlc3MiKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIENIRUNLX0ZJRUxEIChudW0sIDI2MjE0MywgLTI2MjE0NCwgMCk7Ci0KLQkJICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCkKLQkJICAgIG51bSAtPSA4OwotCi0JCSAgc2lnbl91bmV4dCAobnVtID4+IDIsIDE3LCAmcmVzdWx0KTsKLQkJICBkaXNfYXNzZW1ibGVfMTcgKHJlc3VsdCwgJncxLCAmdzIsICZ3KTsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsCi0JCQkJCSAgICgodzIgPDwgMikgfCAodzEgPDwgMTYpIHwgdyksIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxNzsKLQkJICB0aGVfaW5zbi5hcmdfcmVsb2MgPSBsYXN0X2NhbGxfZGVzYy5hcmdfcmVsb2M7Ci0JCSAgbWVtc2V0ICgmbGFzdF9jYWxsX2Rlc2MsIDAsIHNpemVvZiAoc3RydWN0IGNhbGxfZGVzYykpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIGFuIGFic29sdXRlIDE3IGJpdCBicmFuY2ggdGFyZ2V0LiAgKi8KLQkgICAgY2FzZSAneic6Ci0JICAgICAgdGhlX2luc24uZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZzKTsKLQkgICAgICBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMDsKLQkgICAgICBpZiAoIXRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wKLQkJICB8fCAhc3RyY21wIChTX0dFVF9OQU1FICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKSwKLQkJCSAgICAgICJMJDBcMDAxIikpCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgdzIsIHcxLCB3LCByZXN1bHQ7Ci0KLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBpZiAobnVtICUgNCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJCcmFuY2ggdG8gdW5hbGlnbmVkIGFkZHJlc3MiKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIENIRUNLX0ZJRUxEIChudW0sIDI2MjE0MywgLTI2MjE0NCwgMCk7Ci0KLQkJICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCkKLQkJICAgIG51bSAtPSA4OwotCi0JCSAgc2lnbl91bmV4dCAobnVtID4+IDIsIDE3LCAmcmVzdWx0KTsKLQkJICBkaXNfYXNzZW1ibGVfMTcgKHJlc3VsdCwgJncxLCAmdzIsICZ3KTsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsCi0JCQkJCSAgICgodzIgPDwgMikgfCAodzEgPDwgMTYpIHwgdyksIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfQUJTX0NBTEw7Ci0JCSAgdGhlX2luc24uZm9ybWF0ID0gMTc7Ci0JCSAgdGhlX2luc24uYXJnX3JlbG9jID0gbGFzdF9jYWxsX2Rlc2MuYXJnX3JlbG9jOwotCQkgIG1lbXNldCAoJmxhc3RfY2FsbF9kZXNjLCAwLCBzaXplb2YgKHN0cnVjdCBjYWxsX2Rlc2MpKTsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IHNoaWZ0IGNvdW50IGF0IDI2LiAgKi8KLQkgICAgY2FzZSAncCc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCAzMSAtIG51bSwgNSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgYml0IHBvc2l0aW9uIGF0IDI2LiAgKi8KLQkgICAgY2FzZSAnUCc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDUpOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IGltbWVkaWF0ZSBhdCAxMC4gICovCi0JICAgIGNhc2UgJ1EnOgotCi0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzEsIDAsIDApOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAyMSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgMTMgYml0IGltbWVkaWF0ZSBhdCAxOC4gICovCi0JICAgIGNhc2UgJ0EnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgODE5MSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDEzKTsKLQotCSAgICAvKiBIYW5kbGUgYSAyNiBiaXQgaW1tZWRpYXRlIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAnRCc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA2NzExMDg4NjQsIDAsIDApOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQotCSAgICAvKiBIYW5kbGUgYSAzIGJpdCBTRlUgaWRlbnRpZmllciBhdCAyNS4gICovCi0JICAgIGNhc2UgJ2YnOgotCSAgICAgIGlmICgqcysrICE9ICcsJykKLQkJYXNfYmFkIChfKCJJbnZhbGlkIFNGVSBpZGVudGlmaWVyIikpOwotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgNywgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDYpOwotCi0JICAgIC8qIEhhbmRsZSBhIDIwIGJpdCBTT1AgZmllbGQgZm9yIHNwb3AwLiAgKi8KLQkgICAgY2FzZSAnTyc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAxMDQ4NTc1LCAwLCAwKTsKLQkgICAgICBudW0gPSAobnVtICYgMHgxZikgfCAoKG51bSAmIDB4MDAwZmZmZTApIDw8IDYpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQotCSAgICAvKiBIYW5kbGUgYSAxNWJpdCBTT1AgZmllbGQgZm9yIHNwb3AxLiAgKi8KLQkgICAgY2FzZSAnbyc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMjc2NywgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDExKTsKLQotCSAgICAvKiBIYW5kbGUgYSAxMGJpdCBTT1AgZmllbGQgZm9yIHNwb3AzLiAgKi8KLQkgICAgY2FzZSAnMCc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAxMDIzLCAwLCAwKTsKLQkgICAgICBudW0gPSAobnVtICYgMHgxZikgfCAoKG51bSAmIDB4MDAwMDAzZTApIDw8IDYpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQotCSAgICAvKiBIYW5kbGUgYSAxNSBiaXQgU09QIGZpZWxkIGZvciBzcG9wMi4gICovCi0JICAgIGNhc2UgJzEnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzI3NjcsIDAsIDApOwotCSAgICAgIG51bSA9IChudW0gJiAweDFmKSB8ICgobnVtICYgMHgwMDAwN2ZlMCkgPDwgNik7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDMtYml0IGNvLXByb2Nlc3NvciBJRCBmaWVsZC4gICovCi0JICAgIGNhc2UgJ3UnOgotCSAgICAgIGlmICgqcysrICE9ICcsJykKLQkJYXNfYmFkIChfKCJJbnZhbGlkIENPUFIgaWRlbnRpZmllciIpKTsKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDcsIDAsIDApOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCA2KTsKLQotCSAgICAvKiBIYW5kbGUgYSAyMmJpdCBTT1AgZmllbGQgZm9yIGNvcHIuICAqLwotCSAgICBjYXNlICcyJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDQxOTQzMDMsIDAsIDApOwotCSAgICAgIG51bSA9IChudW0gJiAweDFmKSB8ICgobnVtICYgMHgwMDNmZmZlMCkgPDwgNCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0KLQkgICAgLyogSGFuZGxlIGEgc291cmNlIEZQIG9wZXJhbmQgZm9ybWF0IGNvbXBsZXRlci4gICovCi0JICAgIGNhc2UgJ0YnOgotCSAgICAgIGZsYWcgPSBwYV9wYXJzZV9mcF9mb3JtYXQgKCZzKTsKLQkgICAgICB0aGVfaW5zbi5mcG9mMSA9IGZsYWc7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgZGVzdGluYXRpb24gRlAgb3BlcmFuZCBmb3JtYXQgY29tcGxldGVyLiAgKi8KLQkgICAgY2FzZSAnRyc6Ci0JICAgICAgLyogcGFfcGFyc2VfZm9ybWF0IG5lZWRzIHRoZSAnLCcgcHJlZml4LiAgKi8KLQkgICAgICBzLS07Ci0JICAgICAgZmxhZyA9IHBhX3BhcnNlX2ZwX2Zvcm1hdCAoJnMpOwotCSAgICAgIHRoZV9pbnNuLmZwb2YyID0gZmxhZzsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDEzKTsKLQotCSAgICAvKiBIYW5kbGUgRlAgY29tcGFyZSBjb25kaXRpb25zLiAgKi8KLQkgICAgY2FzZSAnTSc6Ci0JICAgICAgY29uZCA9IHBhX3BhcnNlX2ZwX2NtcF9jb25kICgmcyk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjb25kLCAwKTsKLQotCSAgICAvKiBIYW5kbGUgTC9SIHJlZ2lzdGVyIGhhbHZlcyBsaWtlICd0Jy4gICovCi0JICAgIGNhc2UgJ3YnOgotCSAgICAgIHsKLQkJc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCi0JCXBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQlDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCW9wY29kZSB8PSByZXN1bHQubnVtYmVyX3BhcnQ7Ci0KLQkJLyogMHgzMCBvcGNvZGVzIGFyZSBGUCBhcml0aG1ldGljIG9wZXJhdGlvbiBvcGNvZGVzCi0JCSAgIGFuZCBuZWVkIHRvIGJlIHR1cm5lZCBpbnRvIDB4Mzggb3Bjb2Rlcy4gIFRoaXMKLQkJICAgaXMgbm90IG5lY2Vzc2FyeSBmb3IgbG9hZHMvc3RvcmVzLiAgKi8KLQkJaWYgKG5lZWRfcGExMV9vcGNvZGUgKCZ0aGVfaW5zbiwgJnJlc3VsdCkKLQkJICAgICYmICgob3Bjb2RlICYgMHhmYzAwMDAwMCkgPT0gMHgzMDAwMDAwMCkpCi0JCSAgb3Bjb2RlIHw9IDEgPDwgMjc7Ci0KLQkJSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCByZXN1bHQubF9yX3NlbGVjdCAmIDEsIDYpOwotCSAgICAgIH0KLQotCSAgICAvKiBIYW5kbGUgTC9SIHJlZ2lzdGVyIGhhbHZlcyBsaWtlICdiJy4gICovCi0JICAgIGNhc2UgJ0UnOgotCSAgICAgIHsKLQkJc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCi0JCXBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQlDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCW9wY29kZSB8PSByZXN1bHQubnVtYmVyX3BhcnQgPDwgMjE7Ci0JCWlmIChuZWVkX3BhMTFfb3Bjb2RlICgmdGhlX2luc24sICZyZXN1bHQpKQotCQkgIHsKLQkJICAgIG9wY29kZSB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCA3OwotCQkgICAgb3Bjb2RlIHw9IDEgPDwgMjc7Ci0JCSAgfQotCQljb250aW51ZTsKLQkgICAgICB9Ci0KLQkgICAgLyogSGFuZGxlIEwvUiByZWdpc3RlciBoYWx2ZXMgbGlrZSAnYicuICAqLwotCSAgICBjYXNlICczJzoKLQkgICAgICB7Ci0JCXN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQkJaW50IHJlZ251bTsKLQotCQlwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQlvcGNvZGUgfD0gKHJlc3VsdC5udW1iZXJfcGFydCAmIDB4MWMpIDw8IDExOwotCQlvcGNvZGUgfD0gKHJlc3VsdC5udW1iZXJfcGFydCAmIDB4MykgPDwgOTsKLQkJb3Bjb2RlIHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDg7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQotCSAgICAvKiBIYW5kbGUgTC9SIHJlZ2lzdGVyIGhhbHZlcyBsaWtlICd4Jy4gICovCi0JICAgIGNhc2UgJ2UnOgotCSAgICAgIHsKLQkJc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCi0JCXBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQlDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCW9wY29kZSB8PSAocmVzdWx0Lm51bWJlcl9wYXJ0ICYgMHgxZikgPDwgMTY7Ci0JCWlmIChuZWVkX3BhMTFfb3Bjb2RlICgmdGhlX2luc24sICZyZXN1bHQpKQotCQkgIHsKLQkJICAgIG9wY29kZSB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCAxOwotCQkgIH0KLQkJY29udGludWU7Ci0JICAgICAgfQotCi0JICAgIC8qIEhhbmRsZSBML1IgcmVnaXN0ZXIgaGFsdmVzIGxpa2UgJ3gnLiAgKi8KLQkgICAgY2FzZSAnWCc6Ci0JICAgICAgewotCQlzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCUNIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJb3Bjb2RlIHw9IChyZXN1bHQubnVtYmVyX3BhcnQgJiAweDFmKSA8PCAxNjsKLQkJaWYgKG5lZWRfcGExMV9vcGNvZGUgKCZ0aGVfaW5zbiwgJnJlc3VsdCkpCi0JCSAgewotCQkgICAgb3Bjb2RlIHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDEyOwotCQkgICAgb3Bjb2RlIHw9IDEgPDwgMjc7Ci0JCSAgfQotCQljb250aW51ZTsKLQkgICAgICB9Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgcmVnaXN0ZXIgZmllbGQgYXQgMTAuICAqLwotCSAgICBjYXNlICc0JzoKLQkgICAgICB7Ci0JCXN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQlwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQlpZiAodGhlX2luc24uZnBvZjEgPT0gU0dMKQotCQkgIHsKLQkJICAgIGlmIChyZXN1bHQubnVtYmVyX3BhcnQgPCAxNikKLQkJICAgICAgewotCQkJYXNfYmFkICAoXygiSW52YWxpZCByZWdpc3RlciBmb3Igc2luZ2xlIHByZWNpc2lvbiBmbXB5YWRkIG9yIGZtcHlzdWIiKSk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCi0JCSAgICByZXN1bHQubnVtYmVyX3BhcnQgJj0gMHhGOwotCQkgICAgcmVzdWx0Lm51bWJlcl9wYXJ0IHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDQ7Ci0JCSAgfQotCQlJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHJlc3VsdC5udW1iZXJfcGFydCwgMjEpOwotCSAgICAgIH0KLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCByZWdpc3RlciBmaWVsZCBhdCAxNS4gICovCi0JICAgIGNhc2UgJzYnOgotCSAgICAgIHsKLQkJc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCi0JCXBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQlDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCWlmICh0aGVfaW5zbi5mcG9mMSA9PSBTR0wpCi0JCSAgewotCQkgICAgaWYgKHJlc3VsdC5udW1iZXJfcGFydCA8IDE2KQotCQkgICAgICB7Ci0JCQlhc19iYWQgIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGZvciBzaW5nbGUgcHJlY2lzaW9uIGZtcHlhZGQgb3IgZm1weXN1YiIpKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICByZXN1bHQubnVtYmVyX3BhcnQgJj0gMHhGOwotCQkgICAgcmVzdWx0Lm51bWJlcl9wYXJ0IHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDQ7Ci0JCSAgfQotCQlJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHJlc3VsdC5udW1iZXJfcGFydCwgMTYpOwotCSAgICAgIH0KLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCByZWdpc3RlciBmaWVsZCBhdCAzMS4gICovCi0JICAgIGNhc2UgJzcnOgotCSAgICAgIHsKLQkJc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCi0JCXBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQlDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCWlmICh0aGVfaW5zbi5mcG9mMSA9PSBTR0wpCi0JCSAgewotCQkgICAgaWYgKHJlc3VsdC5udW1iZXJfcGFydCA8IDE2KQotCQkgICAgICB7Ci0JCQlhc19iYWQgIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGZvciBzaW5nbGUgcHJlY2lzaW9uIGZtcHlhZGQgb3IgZm1weXN1YiIpKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICByZXN1bHQubnVtYmVyX3BhcnQgJj0gMHhGOwotCQkgICAgcmVzdWx0Lm51bWJlcl9wYXJ0IHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDQ7Ci0JCSAgfQotCQlJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHJlc3VsdC5udW1iZXJfcGFydCwgMCk7Ci0JICAgICAgfQotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IHJlZ2lzdGVyIGZpZWxkIGF0IDIwLiAgKi8KLQkgICAgY2FzZSAnOCc6Ci0JICAgICAgewotCQlzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCUNIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJaWYgKHRoZV9pbnNuLmZwb2YxID09IFNHTCkKLQkJICB7Ci0JCSAgICBpZiAocmVzdWx0Lm51bWJlcl9wYXJ0IDwgMTYpCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAgKF8oIkludmFsaWQgcmVnaXN0ZXIgZm9yIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZCBvciBmbXB5c3ViIikpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIHJlc3VsdC5udW1iZXJfcGFydCAmPSAweEY7Ci0JCSAgICByZXN1bHQubnVtYmVyX3BhcnQgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNDsKLQkJICB9Ci0JCUlOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgcmVzdWx0Lm51bWJlcl9wYXJ0LCAxMSk7Ci0JICAgICAgfQotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IHJlZ2lzdGVyIGZpZWxkIGF0IDI1LiAgKi8KLQkgICAgY2FzZSAnOSc6Ci0JICAgICAgewotCQlzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCUNIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJaWYgKHRoZV9pbnNuLmZwb2YxID09IFNHTCkKLQkJICB7Ci0JCSAgICBpZiAocmVzdWx0Lm51bWJlcl9wYXJ0IDwgMTYpCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAgKF8oIkludmFsaWQgcmVnaXN0ZXIgZm9yIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZCBvciBmbXB5c3ViIikpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIHJlc3VsdC5udW1iZXJfcGFydCAmPSAweEY7Ci0JCSAgICByZXN1bHQubnVtYmVyX3BhcnQgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNDsKLQkJICB9Ci0JCUlOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgcmVzdWx0Lm51bWJlcl9wYXJ0LCA2KTsKLQkgICAgICB9Ci0KLQkgICAgLyogSGFuZGxlIGEgZmxvYXRpbmcgcG9pbnQgb3BlcmFuZCBmb3JtYXQgYXQgMjYuCi0JICAgICAgIE9ubHkgYWxsb3dzIHNpbmdsZSBhbmQgZG91YmxlIHByZWNpc2lvbi4gICovCi0JICAgIGNhc2UgJ0gnOgotCSAgICAgIGZsYWcgPSBwYV9wYXJzZV9mcF9mb3JtYXQgKCZzKTsKLQkgICAgICBzd2l0Y2ggKGZsYWcpCi0JCXsKLQkJY2FzZSBTR0w6Ci0JCSAgb3Bjb2RlIHw9IDB4MjA7Ci0JCWNhc2UgREJMOgotCQkgIHRoZV9pbnNuLmZwb2YxID0gZmxhZzsKLQkJICBjb250aW51ZTsKLQotCQljYXNlIFFVQUQ6Ci0JCWNhc2UgSUxMRUdBTF9GTVQ6Ci0JCWRlZmF1bHQ6Ci0JCSAgYXNfYmFkIChfKCJJbnZhbGlkIEZsb2F0aW5nIFBvaW50IE9wZXJhbmQgRm9ybWF0LiIpKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotIGZhaWxlZDoKLSAgICAgIC8qIENoZWNrIGlmIHRoZSBhcmdzIG1hdGNoZWQuICAqLwotICAgICAgaWYgKG1hdGNoID09IEZBTFNFKQotCXsKLQkgIGlmICgmaW5zblsxXSAtIHBhX29wY29kZXMgPCAoaW50KSBOVU1PUENPREVTCi0JICAgICAgJiYgIXN0cmNtcCAoaW5zbi0+bmFtZSwgaW5zblsxXS5uYW1lKSkKLQkgICAgewotCSAgICAgICsraW5zbjsKLQkgICAgICBzID0gYXJnc3RhcnQ7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBvcGVyYW5kcyAlcyIpLCBlcnJvcl9tZXNzYWdlKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgdGhlX2luc24ub3Bjb2RlID0gb3Bjb2RlOwotfQotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBpcyByZXR1cm5lZC4gICovCi0KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotCi0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICBmb3IgKHdvcmRQID0gd29yZHM7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFdyaXRlIG91dCBiaWctZW5kaWFuLiAgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotCi0vKiBUcmFuc2xhdGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvIHRvIEJGRCB0YXJnZXQKLSAgIGZvcm1hdC4gICovCi0KLWFyZWxlbnQgKioKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbG9jOwotICBzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICpocHBhX2ZpeHA7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotICBzdGF0aWMgYXJlbGVudCAqbm9fcmVsb2NzID0gTlVMTDsKLSAgYXJlbGVudCAqKnJlbG9jczsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICoqY29kZXM7Ci0gIGludCBuX3JlbG9jczsKLSAgaW50IGk7Ci0KLSAgaHBwYV9maXhwID0gKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKikgZml4cC0+dGNfZml4X2RhdGE7Ci0gIGlmIChmaXhwLT5meF9hZGRzeSA9PSAwKQotICAgIHJldHVybiAmbm9fcmVsb2NzOwotICBhc3NlcnQgKGhwcGFfZml4cCAhPSAwKTsKLSAgYXNzZXJ0IChzZWN0aW9uICE9IDApOwotCi0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gJmZpeHAtPmZ4X2FkZHN5LT5ic3ltOwotICBjb2RlcyA9IChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgKiopIGhwcGFfZ2VuX3JlbG9jX3R5cGUgKHN0ZG91dHB1dCwKLQkJCSAgICAgICBmaXhwLT5meF9yX3R5cGUsCi0JCQkgICAgICAgaHBwYV9maXhwLT5meF9yX2Zvcm1hdCwKLQkJCSAgICAgICBocHBhX2ZpeHAtPmZ4X3JfZmllbGQsCi0JCQkgICAgICAgZml4cC0+Znhfc3Vic3kgIT0gTlVMTCwKLQkJCSAgICAgICBmaXhwLT5meF9hZGRzeS0+YnN5bSk7Ci0KLSAgaWYgKGNvZGVzID09IE5VTEwpCi0gICAgYWJvcnQgKCk7Ci0KLSAgZm9yIChuX3JlbG9jcyA9IDA7IGNvZGVzW25fcmVsb2NzXTsgbl9yZWxvY3MrKykKLSAgICA7Ci0KLSAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCAqKSAqIG5fcmVsb2NzICsgMSk7Ci0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSAqIG5fcmVsb2NzKTsKLSAgZm9yIChpID0gMDsgaSA8IG5fcmVsb2NzOyBpKyspCi0gICAgcmVsb2NzW2ldID0gJnJlbG9jW2ldOwotCi0gIHJlbG9jc1tuX3JlbG9jc10gPSBOVUxMOwotCi0jaWZkZWYgT0JKX0VMRgotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzc2VydCAobl9yZWxvY3MgPT0gMSk7Ci0KLSAgICAgIGNvZGUgPSAqY29kZXNbMF07Ci0KLSAgICAgIHJlbG9jLT5zeW1fcHRyX3B0ciA9ICZmaXhwLT5meF9hZGRzeS0+YnN5bTsKLSAgICAgIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLSAgICAgIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotICAgICAgcmVsb2MtPmFkZGVuZCA9IDA7CS8qIGRlZmF1bHQgKi8KLQotICAgICAgYXNzZXJ0IChyZWxvYy0+aG93dG8gJiYgY29kZSA9PSByZWxvYy0+aG93dG8tPnR5cGUpOwotCi0gICAgICAvKiBOb3csIGRvIGFueSBwcm9jZXNzaW5nIHRoYXQgaXMgZGVwZW5kZW50IG9uIHRoZSByZWxvY2F0aW9uIHR5cGUuICAqLwotICAgICAgc3dpdGNoIChjb2RlKQotCXsKLQljYXNlIFJfUEFSSVNDX0RMVFJFTDIxTDoKLQljYXNlIFJfUEFSSVNDX0RMVFJFTDE0UjoKLQljYXNlIFJfUEFSSVNDX0RMVFJFTDE0RjoKLQljYXNlIFJfUEFSSVNDX1BMQUJFTDMyOgotCWNhc2UgUl9QQVJJU0NfUExBQkVMMjFMOgotCWNhc2UgUl9QQVJJU0NfUExBQkVMMTRSOgotCSAgLyogRm9yIHBsYWJlbCByZWxvY2F0aW9ucywgdGhlIGFkZGVuZCBvZiB0aGUKLQkgICAgIHJlbG9jYXRpb24gc2hvdWxkIGJlIGVpdGhlciAwIChubyBzdGF0aWMgbGluaykgb3IgMgotCSAgICAgKHN0YXRpYyBsaW5rIHJlcXVpcmVkKS4KLQotCSAgICAgRklYTUU6IFdlIGFsd2F5cyBhc3N1bWUgbm8gc3RhdGljIGxpbmshCi0KLQkgICAgIFdlIGFsc28gc2xhbSBhIHplcm8gYWRkZW5kIGludG8gdGhlIERMVCByZWxhdGl2ZSByZWxvY3M7Ci0JICAgICBpdCBkb2Vzbid0IG1ha2UgYSBsb3Qgb2Ygc2Vuc2UgdG8gdXNlIGFueSBhZGRlbmQgc2luY2UKLQkgICAgIGl0IGdldHMgeW91IGEgZGlmZmVyZW50IChlZyB1bmtub3duKSBETFQgZW50cnkuICAqLwotCSAgcmVsb2MtPmFkZGVuZCA9IDA7Ci0JICBicmVhazsKLQotCWNhc2UgUl9QQVJJU0NfUENSRUwyMUw6Ci0JY2FzZSBSX1BBUklTQ19QQ1JFTDE3UjoKLQljYXNlIFJfUEFSSVNDX1BDUkVMMTdGOgotCWNhc2UgUl9QQVJJU0NfUENSRUwxN0M6Ci0JY2FzZSBSX1BBUklTQ19QQ1JFTDE0UjoKLQljYXNlIFJfUEFSSVNDX1BDUkVMMTRGOgotCSAgLyogVGhlIGNvbnN0YW50IGlzIHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgcmVsb2MtPmFkZGVuZCA9IEhQUEFfUl9BRERFTkQgKGhwcGFfZml4cC0+ZnhfYXJnX3JlbG9jLCAwKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotCSAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotI2Vsc2UgLyogT0JKX1NPTSAqLwotCi0gIC8qIFdhbGsgb3ZlciByZWFjaCByZWxvY2F0aW9uIHJldHVybmVkIGJ5IHRoZSBCRkQgYmFja2VuZC4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBuX3JlbG9jczsgaSsrKQotICAgIHsKLSAgICAgIGNvZGUgPSAqY29kZXNbaV07Ci0KLSAgICAgIHJlbG9jc1tpXS0+c3ltX3B0cl9wdHIgPSAmZml4cC0+ZnhfYWRkc3ktPmJzeW07Ci0gICAgICByZWxvY3NbaV0tPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICAgICAgcmVsb2NzW2ldLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCi0gICAgICBzd2l0Y2ggKGNvZGUpCi0JewotCWNhc2UgUl9DT01QMjoKLQkgIC8qIFRoZSBvbmx5IHRpbWUgd2UgZXZlciB1c2UgYSBSX0NPTVAyIGZpeHVwIGlzIGZvciB0aGUgZGlmZmVyZW5jZQotCSAgICAgb2YgdHdvIHN5bWJvbHMuICBXaXRoIHRoYXQgaW4gbWluZCB3ZSBmaWxsIGluIGFsbCBmb3VyCi0JICAgICByZWxvY3Mgbm93IGFuZCBicmVhayBvdXQgb2YgdGhlIGxvb3AuICAqLwotCSAgYXNzZXJ0IChpID09IDEpOwotCSAgcmVsb2NzWzBdLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSAmYmZkX2Fic19zeW1ib2w7Ci0JICByZWxvY3NbMF0tPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsICpjb2Rlc1swXSk7Ci0JICByZWxvY3NbMF0tPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0JICByZWxvY3NbMF0tPmFkZGVuZCA9IDA7Ci0JICByZWxvY3NbMV0tPnN5bV9wdHJfcHRyID0gJmZpeHAtPmZ4X2FkZHN5LT5ic3ltOwotCSAgcmVsb2NzWzFdLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCAqY29kZXNbMV0pOwotCSAgcmVsb2NzWzFdLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCSAgcmVsb2NzWzFdLT5hZGRlbmQgPSAwOwotCSAgcmVsb2NzWzJdLT5zeW1fcHRyX3B0ciA9ICZmaXhwLT5meF9zdWJzeS0+YnN5bTsKLQkgIHJlbG9jc1syXS0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgKmNvZGVzWzJdKTsKLQkgIHJlbG9jc1syXS0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQkgIHJlbG9jc1syXS0+YWRkZW5kID0gMDsKLQkgIHJlbG9jc1szXS0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgJmJmZF9hYnNfc3ltYm9sOwotCSAgcmVsb2NzWzNdLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCAqY29kZXNbM10pOwotCSAgcmVsb2NzWzNdLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCSAgcmVsb2NzWzNdLT5hZGRlbmQgPSAwOwotCSAgcmVsb2NzWzRdLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSAmYmZkX2Fic19zeW1ib2w7Ci0JICByZWxvY3NbNF0tPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsICpjb2Rlc1s0XSk7Ci0JICByZWxvY3NbNF0tPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0JICByZWxvY3NbNF0tPmFkZGVuZCA9IDA7Ci0JICBnb3RvIGRvbmU7Ci0JY2FzZSBSX1BDUkVMX0NBTEw6Ci0JY2FzZSBSX0FCU19DQUxMOgotCSAgcmVsb2NzW2ldLT5hZGRlbmQgPSBIUFBBX1JfQURERU5EIChocHBhX2ZpeHAtPmZ4X2FyZ19yZWxvYywgMCk7Ci0JICBicmVhazsKLQotCWNhc2UgUl9ETFRfUkVMOgotCWNhc2UgUl9EQVRBX1BMQUJFTDoKLQljYXNlIFJfQ09ERV9QTEFCRUw6Ci0JICAvKiBGb3IgcGxhYmVsIHJlbG9jYXRpb25zLCB0aGUgYWRkZW5kIG9mIHRoZQotCSAgICAgcmVsb2NhdGlvbiBzaG91bGQgYmUgZWl0aGVyIDAgKG5vIHN0YXRpYyBsaW5rKSBvciAyCi0JICAgICAoc3RhdGljIGxpbmsgcmVxdWlyZWQpLgotCi0JICAgICBGSVhNRTogV2UgYWx3YXlzIGFzc3VtZSBubyBzdGF0aWMgbGluayEKLQotCSAgICAgV2UgYWxzbyBzbGFtIGEgemVybyBhZGRlbmQgaW50byB0aGUgRExUIHJlbGF0aXZlIHJlbG9jczsKLQkgICAgIGl0IGRvZXNuJ3QgbWFrZSBhIGxvdCBvZiBzZW5zZSB0byB1c2UgYW55IGFkZGVuZCBzaW5jZQotCSAgICAgaXQgZ2V0cyB5b3UgYSBkaWZmZXJlbnQgKGVnIHVua25vd24pIERMVCBlbnRyeS4gICovCi0JICByZWxvY3NbaV0tPmFkZGVuZCA9IDA7Ci0JICBicmVhazsKLQotCWNhc2UgUl9OX01PREU6Ci0JY2FzZSBSX1NfTU9ERToKLQljYXNlIFJfRF9NT0RFOgotCWNhc2UgUl9SX01PREU6Ci0JY2FzZSBSX0ZTRUw6Ci0JY2FzZSBSX0xTRUw6Ci0JY2FzZSBSX1JTRUw6Ci0JY2FzZSBSX0JFR0lOX0JSVEFCOgotCWNhc2UgUl9FTkRfQlJUQUI6Ci0JY2FzZSBSX0JFR0lOX1RSWToKLQljYXNlIFJfTjBTRUw6Ci0JY2FzZSBSX04xU0VMOgotCSAgLyogVGhlcmUgaXMgbm8gc3ltYm9sIG9yIGFkZGVuZCBhc3NvY2lhdGVkIHdpdGggdGhlc2UgZml4dXBzLiAgKi8KLQkgIHJlbG9jc1tpXS0+c3ltX3B0cl9wdHIgPSAmZHVtbXlfc3ltYm9sLT5ic3ltOwotCSAgcmVsb2NzW2ldLT5hZGRlbmQgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfRU5EX1RSWToKLQljYXNlIFJfRU5UUlk6Ci0JY2FzZSBSX0VYSVQ6Ci0JICAvKiBUaGVyZSBpcyBubyBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZXNlIGZpeHVwcy4gICovCi0JICByZWxvY3NbaV0tPnN5bV9wdHJfcHRyID0gJmR1bW15X3N5bWJvbC0+YnN5bTsKLQkgIHJlbG9jc1tpXS0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgcmVsb2NzW2ldLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0JfQotICAgIH0KLQotIGRvbmU6Ci0jZW5kaWYKLQotICByZXR1cm4gcmVsb2NzOwotfQotCi0vKiBQcm9jZXNzIGFueSBtYWNoaW5lIGRlcGVuZGVudCBmcmFnIHR5cGVzLiAgKi8KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICAgICByZWdpc3RlciBiZmQgKmFiZmQ7Ci0gICAgIHJlZ2lzdGVyIGFzZWN0aW9uICpzZWM7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLXsKLSAgdW5zaWduZWQgaW50IGFkZHJlc3M7Ci0KLSAgaWYgKGZyYWdQLT5mcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50KQotICAgIHsKLSAgICAgIHN3aXRjaCAoKGludCkgZnJhZ1AtPmZyX3N1YnR5cGUpCi0JewotCWNhc2UgMDoKLQkgIGZyYWdQLT5mcl90eXBlID0gcnNfZmlsbDsKLQkgIGtub3cgKGZyYWdQLT5mcl92YXIgPT0gMSk7Ci0JICBrbm93IChmcmFnUC0+ZnJfbmV4dCk7Ci0JICBhZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4OwotCSAgaWYgKGFkZHJlc3MgJSBmcmFnUC0+ZnJfb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgZnJhZ1AtPmZyX29mZnNldCA9Ci0JCWZyYWdQLT5mcl9uZXh0LT5mcl9hZGRyZXNzCi0JCS0gZnJhZ1AtPmZyX2FkZHJlc3MKLQkJLSBmcmFnUC0+ZnJfZml4OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGZyYWdQLT5mcl9vZmZzZXQgPSAwOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAqLwotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIGFzZWN0aW9uICpzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWdtZW50KTsKLSAgaW50IGFsaWduMiA9ICgxIDw8IGFsaWduKSAtIDE7Ci0KLSAgcmV0dXJuIChzaXplICsgYWxpZ24yKSAmIH5hbGlnbjI7Ci19Ci0KLS8qIFJldHVybiB0aGUgYXBwcm94aW1hdGUgc2l6ZSBvZiBhIGZyYWcgYmVmb3JlIHJlbGF4YXRpb24gaGFzIG9jY3VycmVkLiAgKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIGFzZWN0aW9uICpzZWdtZW50OwotewotICBpbnQgc2l6ZTsKLQotICBzaXplID0gMDsKLQotICB3aGlsZSAoKGZyYWdQLT5mcl9maXggKyBzaXplKSAlIGZyYWdQLT5mcl9vZmZzZXQpCi0gICAgc2l6ZSsrOwotCi0gIHJldHVybiBzaXplOwotfQotDAotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLX0KLQwKLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotLyogQXBwbHkgYSBmaXh1cCB0byBhbiBpbnN0cnVjdGlvbi4gICovCi0KLWludAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWxwKQotICAgICBmaXhTICpmaXhQOwotICAgICB2YWx1ZVQgKnZhbHA7Ci17Ci0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLSAgc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqaHBwYV9maXhQOwotICBsb25nIG5ld192YWwsIHJlc3VsdCA9IDA7Ci0gIHVuc2lnbmVkIGludCB3MSwgdzIsIHcsIHJlc3VsdGk7Ci0KLSAgaHBwYV9maXhQID0gKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKikgZml4UC0+dGNfZml4X2RhdGE7Ci0gIC8qIFNPTSB1c2VzIFJfSFBQQV9FTlRSWSBhbmQgUl9IUFBBX0VYSVQgcmVsb2NhdGlvbnMgd2hpY2ggY2FuCi0gICAgIG5ldmVyIGJlICJhcHBsaWVkIiAodGhleSBhcmUganVzdCBtYXJrZXJzKS4gIExpa2V3aXNlIGZvcgotICAgICBSX0hQUEFfQkVHSU5fQlJUQUIgYW5kIFJfSFBQQV9FTkRfQlJUQUIuICAqLwotI2lmZGVmIE9CSl9TT00KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRU5UUlkKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRVhJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IFJfSFBQQV9CRUdJTl9CUlRBQgotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IFJfSFBQQV9FTkRfQlJUQUIKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfQkVHSU5fVFJZKQotICAgIHJldHVybiAxOwotCi0gIC8qIERpc2d1c3RpbmcuICBXZSBtdXN0IHNldCBmeF9vZmZzZXQgb3Vyc2VsdmVzIC0tIFJfSFBQQV9FTkRfVFJZCi0gICAgIGZpeHVwcyBhcmUgY29uc2lkZXJlZCBub3QgYWRqdXN0YWJsZSwgd2hpY2ggaW4gdHVybiBjYXVzZXMKLSAgICAgYWRqdXN0X3JlbG9jX3N5bXMgdG8gbm90IHNldCBmeF9vZmZzZXQuICBVZ2guICAqLwotICBpZiAoZml4UC0+Znhfcl90eXBlID09IFJfSFBQQV9FTkRfVFJZKQotICAgIHsKLSAgICAgIGZpeFAtPmZ4X29mZnNldCA9ICp2YWxwOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogVGhlcmUgc2hvdWxkIGhhdmUgYmVlbiBhbiBIUFBBIHNwZWNpZmljIGZpeHVwIGFzc29jaWF0ZWQKLSAgICAgd2l0aCB0aGUgR0FTIGZpeHVwLiAgKi8KLSAgaWYgKGhwcGFfZml4UCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGJ1Zl93ZCA9IGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKTsKLSAgICAgIHVuc2lnbmVkIGNoYXIgZm10ID0gYmZkX2hwcGFfaW5zbjJmbXQgKGJ1Zl93ZCk7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGlzIGEgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpeHVwLCB0aGVuIGl0J3Mgc29tZXRoaW5nCi0JIHdoaWNoIHdpbGwgbmVlZCBhIFNPTSByZWxvY2F0aW9uIChleGNlcHQgZm9yIHNvbWUgUEMtcmVsYXRpdmUgcmVsb2NzKS4KLQkgSW4gc3VjaCBjYXNlcyB3ZSBzaG91bGQgdHJlYXQgdGhlICJ2YWwiIG9yICJhZGRlbmQiIGFzIHplcm8gc2luY2UgaXQKLQkgd2lsbCBiZSBhZGRlZCBpbiBhcyBuZWVkZWQgZnJvbSBmeF9vZmZzZXQgaW4gdGNfZ2VuX3JlbG9jLiAgKi8KLSAgICAgIGlmICgoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotCSAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfTk9ORSkKLSNpZmRlZiBPQkpfU09NCi0JICAmJiBmbXQgIT0gMzIKLSNlbmRpZgotCSAgKQotCW5ld192YWwgPSAoKGZtdCA9PSAxMiB8fCBmbXQgPT0gMTcgfHwgZm10ID09IDIyKSA/IDggOiAwKTsKLSNpZmRlZiBPQkpfU09NCi0gICAgICAvKiBUaGVzZSBmaWVsZCBzZWxlY3RvcnMgaW1wbHkgdGhhdCB3ZSBkbyBub3Qgd2FudCBhbiBhZGRlbmQuICAqLwotICAgICAgZWxzZSBpZiAoaHBwYV9maXhQLT5meF9yX2ZpZWxkID09IGVfcHNlbAotCSAgICAgICB8fCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQgPT0gZV9ycHNlbAotCSAgICAgICB8fCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQgPT0gZV9scHNlbAotCSAgICAgICB8fCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQgPT0gZV90c2VsCi0JICAgICAgIHx8IGhwcGFfZml4UC0+Znhfcl9maWVsZCA9PSBlX3J0c2VsCi0JICAgICAgIHx8IGhwcGFfZml4UC0+Znhfcl9maWVsZCA9PSBlX2x0c2VsKQotCW5ld192YWwgPSAoKGZtdCA9PSAxMiB8fCBmbXQgPT0gMTcgfHwgZm10ID09IDIyKSA/IDggOiAwKTsKLSAgICAgIC8qIFRoaXMgaXMgdHJ1ZWx5IGRpc2d1c3RpbmcuICBUaGUgbWFjaGluZSBpbmRlcGVuZGVudCBjb2RlIGJsaW5kbHkKLQkgYWRkcyBpbiB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBiZWluZyByZWxvY2F0ZWQgYWdhaW5zdC4gIERhbW4hICAqLwotICAgICAgZWxzZSBpZiAoZm10ID09IDMyCi0JICAgICAgICYmIGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IGJmZF9jb21fc2VjdGlvbl9wdHIpCi0JbmV3X3ZhbCA9IGhwcGFfZmllbGRfYWRqdXN0ICgqdmFscCAtIFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSksCi0JCQkJICAgICAwLCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQpOwotI2VuZGlmCi0gICAgICBlbHNlCi0JbmV3X3ZhbCA9IGhwcGFfZmllbGRfYWRqdXN0ICgqdmFscCwgMCwgaHBwYV9maXhQLT5meF9yX2ZpZWxkKTsKLQotICAgICAgLyogSGFuZGxlIHBjLXJlbGF0aXZlIGV4Y2VwdGlvbnMgZnJvbSBhYm92ZS4gICovCi0jZGVmaW5lIGFyZ19yZWxvY19zdHViX25lZWRlZChDQUxMRVIsIENBTExFRSkgXAotICAoKENBTExFRSkgJiYgKENBTExFUikgJiYgKChDQUxMRUUpICE9IChDQUxMRVIpKSkKLSAgICAgIGlmICgoZm10ID09IDEyIHx8IGZtdCA9PSAxNyB8fCBmbXQgPT0gMjIpCi0JICAmJiBmaXhQLT5meF9hZGRzeQotCSAgJiYgZml4UC0+ZnhfcGNyZWwKLQkgICYmICFhcmdfcmVsb2Nfc3R1Yl9uZWVkZWQgKChsb25nKSAoKG9ial9zeW1ib2xfdHlwZSAqKQotCQkJZml4UC0+ZnhfYWRkc3ktPmJzeW0pLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jLAotCQkJCSAgICBocHBhX2ZpeFAtPmZ4X2FyZ19yZWxvYykKLQkgICYmICgoKGludCkoKnZhbHApID4gLTI2MjE0NCAmJiAoaW50KSgqdmFscCkgPCAyNjIxNDMpICYmIGZtdCAhPSAyMikKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSA9PSBocHBhX2ZpeFAtPnNlZ21lbnQKLQkgICYmICEoZml4UC0+Znhfc3Vic3kKLQkgICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+Znhfc3Vic3kpICE9IGhwcGFfZml4UC0+c2VnbWVudCkpCi0JICAgICAgCi0JbmV3X3ZhbCA9IGhwcGFfZmllbGRfYWRqdXN0ICgqdmFscCwgMCwgaHBwYV9maXhQLT5meF9yX2ZpZWxkKTsKLSN1bmRlZiBhcmdfcmVsb2Nfc3R1Yl9uZWVkZWQKLQkKLSAgICAgIHN3aXRjaCAoZm10KQotCXsKLQkvKiBIYW5kbGUgYWxsIG9wY29kZXMgd2l0aCB0aGUgJ2onIG9wZXJhbmQgdHlwZS4gICovCi0JY2FzZSAxNDoKLQkgIENIRUNLX0ZJRUxEIChuZXdfdmFsLCA4MTkxLCAtODE5MiwgMCk7Ci0KLQkgIC8qIE1hc2sgb2ZmIDE0IGJpdHMgdG8gYmUgY2hhbmdlZC4gICovCi0JICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsCi0JCSAgICAgIGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSAmIDB4ZmZmZmMwMDAsCi0JCSAgICAgIGJ1Zik7Ci0JICBsb3dfc2lnbl91bmV4dCAobmV3X3ZhbCwgMTQsICZyZXN1bHRpKTsKLQkgIHJlc3VsdCA9IHJlc3VsdGk7Ci0JICBicmVhazsKLQotCS8qIEhhbmRsZSBhbGwgb3Bjb2RlcyB3aXRoIHRoZSAnaycgb3BlcmFuZCB0eXBlLiAgKi8KLQljYXNlIDIxOgotCSAgQ0hFQ0tfRklFTEQgKG5ld192YWwsIDIwOTcxNTIsIDAsIDApOwotCi0JICAvKiBNYXNrIG9mZiAyMSBiaXRzIHRvIGJlIGNoYW5nZWQuICAqLwotCSAgYmZkX3B1dF8zMiAoc3Rkb3V0cHV0LAotCQkgICAgICBiZmRfZ2V0XzMyIChzdGRvdXRwdXQsIGJ1ZikgJiAweGZmZTAwMDAwLAotCQkgICAgICBidWYpOwotCSAgZGlzX2Fzc2VtYmxlXzIxIChuZXdfdmFsLCAmcmVzdWx0aSk7Ci0JICByZXN1bHQgPSByZXN1bHRpOwotCSAgYnJlYWs7Ci0KLQkvKiBIYW5kbGUgYWxsIHRoZSBvcGNvZGVzIHdpdGggdGhlICdpJyBvcGVyYW5kIHR5cGUuICAqLwotCWNhc2UgMTE6Ci0JICBDSEVDS19GSUVMRCAobmV3X3ZhbCwgMTAyMywgLTEwMjMsIDApOwotCi0JICAvKiBNYXNrIG9mZiAxMSBiaXRzIHRvIGJlIGNoYW5nZWQuICAqLwotCSAgYmZkX3B1dF8zMiAoc3Rkb3V0cHV0LAotCQkgICAgICBiZmRfZ2V0XzMyIChzdGRvdXRwdXQsIGJ1ZikgJiAweGZmZmY4MDAsCi0JCSAgICAgIGJ1Zik7Ci0JICBsb3dfc2lnbl91bmV4dCAobmV3X3ZhbCwgMTEsICZyZXN1bHRpKTsKLQkgIHJlc3VsdCA9IHJlc3VsdGk7Ci0JICBicmVhazsKLQotCS8qIEhhbmRsZSBhbGwgdGhlIG9wY29kZXMgd2l0aCB0aGUgJ3cnIG9wZXJhbmQgdHlwZS4gICovCi0JY2FzZSAxMjoKLQkgIENIRUNLX0ZJRUxEIChuZXdfdmFsLCA4MTk5LCAtODE4NCwgMCk7Ci0KLQkgIC8qIE1hc2sgb2ZmIDExIGJpdHMgdG8gYmUgY2hhbmdlZC4gICovCi0JICBzaWduX3VuZXh0ICgobmV3X3ZhbCAtIDgpID4+IDIsIDEyLCAmcmVzdWx0aSk7Ci0JICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsCi0JCSAgICAgIGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSAmIDB4ZmZmZmUwMDIsCi0JCSAgICAgIGJ1Zik7Ci0KLQkgIGRpc19hc3NlbWJsZV8xMiAocmVzdWx0aSwgJncxLCAmdyk7Ci0JICByZXN1bHQgPSAoKHcxIDw8IDIpIHwgdyk7Ci0JICBicmVhazsKLQotCS8qIEhhbmRsZSBzb21lIG9mIHRoZSBvcGNvZGVzIHdpdGggdGhlICdXJyBvcGVyYW5kIHR5cGUuICAqLwotCWNhc2UgMTc6Ci0JICB7Ci0JICAgIGludCBkaXN0YW5jZSA9ICp2YWxwOwotCi0JICAgIENIRUNLX0ZJRUxEIChuZXdfdmFsLCAyNjIxNDMsIC0yNjIxNDQsIDApOwotCi0JICAgIC8qIElmIHRoaXMgaXMgYW4gYWJzb2x1dGUgYnJhbmNoIChpZSBubyBsaW5rKSB3aXRoIGFuIG91dCBvZgotCSAgICAgICByYW5nZSB0YXJnZXQsIHRoZW4gd2Ugd2FudCB0byBjb21wbGFpbi4gICovCi0JICAgIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX1BDUkVMX0NBTEwKLQkJJiYgKGRpc3RhbmNlID4gMjYyMTQzIHx8IGRpc3RhbmNlIDwgLTI2MjE0NCkKLQkJJiYgKGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSAmIDB4ZmZlMDAwMDApID09IDB4ZTgwMDAwMDApCi0JICAgICAgQ0hFQ0tfRklFTEQgKGRpc3RhbmNlLCAyNjIxNDMsIC0yNjIxNDQsIDApOwotCi0JICAgIC8qIE1hc2sgb2ZmIDE3IGJpdHMgdG8gYmUgY2hhbmdlZC4gICovCi0JICAgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwKLQkJCWJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSAmIDB4ZmZlMGUwMDIsCi0JCQlidWYpOwotCSAgICBzaWduX3VuZXh0ICgobmV3X3ZhbCAtIDgpID4+IDIsIDE3LCAmcmVzdWx0aSk7Ci0JICAgIGRpc19hc3NlbWJsZV8xNyAocmVzdWx0aSwgJncxLCAmdzIsICZ3KTsKLQkgICAgcmVzdWx0ID0gKCh3MiA8PCAyKSB8ICh3MSA8PCAxNikgfCB3KTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQljYXNlIDMyOgotCSAgcmVzdWx0ID0gMDsKLQkgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwgbmV3X3ZhbCwgYnVmKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFzX2JhZCAoXygiVW5rbm93biByZWxvY2F0aW9uIGVuY291bnRlcmVkIGluIG1kX2FwcGx5X2ZpeC4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIEluc2VydCB0aGUgcmVsb2NhdGlvbi4gICovCi0gICAgICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsIGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSB8IHJlc3VsdCwgYnVmKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoXygibm8gaHBwYV9maXh1cCBlbnRyeSBmb3IgdGhpcyBmaXh1cCAoZml4UCA9IDB4JXgsIHR5cGUgPSAweCV4KVxuIiksCi0JICAgICAgKHVuc2lnbmVkIGludCkgZml4UCwgZml4UC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPwotICAgT24gdGhlIFBBLCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBvZmZzZXQuICAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0vKiBSZXR1cm4gbm9uemVybyBpZiB0aGUgaW5wdXQgbGluZSBwb2ludGVyIGlzIGF0IHRoZSBlbmQgb2YKLSAgIGEgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIGludAotaXNfZW5kX29mX3N0YXRlbWVudCAoKQotewotICByZXR1cm4gKCgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JICB8fCAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnOycpCi0JICB8fCAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIScpKTsKLX0KLQotLyogUmVhZCBhIG51bWJlciBmcm9tIFMuICBUaGUgbnVtYmVyIG1pZ2h0IGNvbWUgaW4gb25lIG9mIG1hbnkgZm9ybXMsCi0gICB0aGUgbW9zdCBjb21tb24gd2lsbCBiZSBhIGhleCBvciBkZWNpbWFsIGNvbnN0YW50LCBidXQgaXQgY291bGQgYmUKLSAgIGEgcHJlLWRlZmluZWQgcmVnaXN0ZXIgKFl1ayEpLCBvciBhbiBhYnNvbHV0ZSBzeW1ib2wuCi0KLSAgIFJldHVybiBhIG51bWJlciBvciAtMSBmb3IgZmFpbHVyZS4KLQotICAgV2hlbiBwYXJzaW5nIFBBLTg5IEZQIHJlZ2lzdGVyIG51bWJlcnMgUkVTVUxUIHdpbGwgYmUKLSAgIHRoZSBhZGRyZXNzIG9mIGEgc3RydWN0dXJlIHRvIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dAotICAgTC9SIGhhbGYgb2YgRlAgcmVnaXN0ZXJzLCBzdG9yZSByZXN1bHRzIHRoZXJlIGFzIGFwcHJvcHJpYXRlLgotCi0gICBwYV9wYXJzZV9udW1iZXIgY2FuIG5vdCBoYW5kbGUgbmVnYXRpdmUgY29uc3RhbnRzIGFuZCB3aWxsIGZhaWwKLSAgIGhvcnJpYmx5IGlmIGl0IGlzIHBhc3NlZCBzdWNoIGEgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgaW50Ci1wYV9wYXJzZV9udW1iZXIgKHMsIHJlc3VsdCkKLSAgICAgY2hhciAqKnM7Ci0gICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0ICpyZXN1bHQ7Ci17Ci0gIGludCBudW07Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgc3ltYm9sUyAqc3ltOwotICBpbnQgc3RhdHVzOwotICBjaGFyICpwID0gKnM7Ci0KLSAgLyogU2tpcCB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUgbnVtYmVyLiAgKi8KLSAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQotICAgIHAgPSBwICsgMTsKLQotICAvKiBTdG9yZSBpbmZvIGluIFJFU1VMVCBpZiByZXF1ZXN0ZWQgYnkgY2FsbGVyLiAgKi8KLSAgaWYgKHJlc3VsdCkKLSAgICB7Ci0gICAgICByZXN1bHQtPm51bWJlcl9wYXJ0ID0gLTE7Ci0gICAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAtMTsKLSAgICB9Ci0gIG51bSA9IC0xOwotCi0gIGlmIChpc2RpZ2l0ICgqcCkpCi0gICAgewotICAgICAgLyogTG9va3MgbGlrZSBhIG51bWJlci4gICovCi0gICAgICBudW0gPSAwOwotCi0gICAgICBpZiAoKnAgPT0gJzAnICYmICgqKHAgKyAxKSA9PSAneCcgfHwgKihwICsgMSkgPT0gJ1gnKSkKLQl7Ci0JICAvKiBUaGUgbnVtYmVyIGlzIHNwZWNpZmllZCBpbiBoZXguICAqLwotCSAgcCArPSAyOwotCSAgd2hpbGUgKGlzZGlnaXQgKCpwKSB8fCAoKCpwID49ICdhJykgJiYgKCpwIDw9ICdmJykpCi0JCSB8fCAoKCpwID49ICdBJykgJiYgKCpwIDw9ICdGJykpKQotCSAgICB7Ci0JICAgICAgaWYgKGlzZGlnaXQgKCpwKSkKLQkJbnVtID0gbnVtICogMTYgKyAqcCAtICcwJzsKLQkgICAgICBlbHNlIGlmICgqcCA+PSAnYScgJiYgKnAgPD0gJ2YnKQotCQludW0gPSBudW0gKiAxNiArICpwIC0gJ2EnICsgMTA7Ci0JICAgICAgZWxzZQotCQludW0gPSBudW0gKiAxNiArICpwIC0gJ0EnICsgMTA7Ci0JICAgICAgKytwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoZSBudW1iZXIgaXMgc3BlY2lmaWVkIGluIGRlY2ltYWwuICAqLwotCSAgd2hpbGUgKGlzZGlnaXQgKCpwKSkKLQkgICAgewotCSAgICAgIG51bSA9IG51bSAqIDEwICsgKnAgLSAnMCc7Ci0JICAgICAgKytwOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBTdG9yZSBpbmZvIGluIFJFU1VMVCBpZiByZXF1ZXN0ZWQgYnkgdGhlIGNhbGxlci4gICovCi0gICAgICBpZiAocmVzdWx0KQotCXsKLQkgIHJlc3VsdC0+bnVtYmVyX3BhcnQgPSBudW07Ci0KLQkgIGlmIChJU19SX1NFTEVDVCAocCkpCi0JICAgIHsKLQkgICAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAxOwotCSAgICAgICsrcDsKLQkgICAgfQotCSAgZWxzZSBpZiAoSVNfTF9TRUxFQ1QgKHApKQotCSAgICB7Ci0JICAgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMDsKLQkgICAgICArK3A7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMDsKLQl9Ci0gICAgfQotICBlbHNlIGlmICgqcCA9PSAnJScpCi0gICAgewotICAgICAgLyogVGhlIG51bWJlciBtaWdodCBiZSBhIHByZWRlZmluZWQgcmVnaXN0ZXIuICAqLwotICAgICAgbnVtID0gMDsKLSAgICAgIG5hbWUgPSBwOwotICAgICAgcCsrOwotICAgICAgYyA9ICpwOwotICAgICAgLyogVGVnZSBoYWNrOiBTcGVjaWFsIGNhc2UgZm9yIGdlbmVyYWwgcmVnaXN0ZXJzIGFzIHRoZSBnZW5lcmFsCi0gICAgICAgICBjb2RlIG1ha2VzIGEgYmluYXJ5IHNlYXJjaCB3aXRoIGNhc2UgdHJhbnNsYXRpb24sIGFuZCBpcyBWRVJZCi0gICAgICAgICBzbG93LiAqLwotICAgICAgaWYgKGMgPT0gJ3InKQotCXsKLQkgIHArKzsKLQkgIGlmICgqcCA9PSAnZScgJiYgKihwICsgMSkgPT0gJ3QnCi0JICAgICAgJiYgKCoocCArIDIpID09ICcwJyB8fCAqKHAgKyAyKSA9PSAnMScpKQotCSAgICB7Ci0JICAgICAgcCArPSAyOwotCSAgICAgIG51bSA9ICpwIC0gJzAnICsgMjg7Ci0JICAgICAgcCsrOwotCSAgICB9Ci0JICBlbHNlIGlmICgqcCA9PSAncCcpCi0JICAgIHsKLQkgICAgICBudW0gPSAyOwotCSAgICAgIHArKzsKLQkgICAgfQotCSAgZWxzZSBpZiAoIWlzZGlnaXQgKCpwKSkKLQkgICAgewotCSAgICAgIGlmIChwcmludF9lcnJvcnMpCi0JCWFzX2JhZCAoXygiVW5kZWZpbmVkIHJlZ2lzdGVyOiAnJXMnLiIpLCBuYW1lKTsKLQkgICAgICBudW0gPSAtMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZG8KLQkJbnVtID0gbnVtICogMTAgKyAqcCsrIC0gJzAnOwotCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgqcCkpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIERvIGEgbm9ybWFsIHJlZ2lzdGVyIHNlYXJjaC4gICovCi0JICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lIChjKSkKLQkgICAgewotCSAgICAgIHAgPSBwICsgMTsKLQkgICAgICBjID0gKnA7Ci0JICAgIH0KLQkgICpwID0gMDsKLQkgIHN0YXR1cyA9IHJlZ19uYW1lX3NlYXJjaCAobmFtZSk7Ci0JICBpZiAoc3RhdHVzID49IDApCi0JICAgIG51bSA9IHN0YXR1czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChwcmludF9lcnJvcnMpCi0JCWFzX2JhZCAoXygiVW5kZWZpbmVkIHJlZ2lzdGVyOiAnJXMnLiIpLCBuYW1lKTsKLQkgICAgICBudW0gPSAtMTsKLQkgICAgfQotCSAgKnAgPSBjOwotCX0KLQotICAgICAgLyogU3RvcmUgaW5mbyBpbiBSRVNVTFQgaWYgcmVxdWVzdGVkIGJ5IGNhbGxlci4gICovCi0gICAgICBpZiAocmVzdWx0KQotCXsKLQkgIHJlc3VsdC0+bnVtYmVyX3BhcnQgPSBudW07Ci0JICBpZiAoSVNfUl9TRUxFQ1QgKHAgLSAxKSkKLQkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMTsKLQkgIGVsc2UgaWYgKElTX0xfU0VMRUNUIChwIC0gMSkpCi0JICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDA7Ci0JICBlbHNlCi0JICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFuZCBmaW5hbGx5LCBpdCBjb3VsZCBiZSBhIHN5bWJvbCBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbiB3aGljaAotICAgICAgICAgaXMgZWZmZWN0aXZlbHkgYSBjb25zdGFudC4gICovCi0gICAgICBudW0gPSAwOwotICAgICAgbmFtZSA9IHA7Ci0gICAgICBjID0gKnA7Ci0gICAgICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lIChjKSkKLQl7Ci0JICBwID0gcCArIDE7Ci0JICBjID0gKnA7Ci0JfQotICAgICAgKnAgPSAwOwotICAgICAgaWYgKChzeW0gPSBzeW1ib2xfZmluZCAobmFtZSkpICE9IE5VTEwpCi0JewotCSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gJmJmZF9hYnNfc2VjdGlvbikKLQkgICAgbnVtID0gU19HRVRfVkFMVUUgKHN5bSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAocHJpbnRfZXJyb3JzKQotCQlhc19iYWQgKF8oIk5vbi1hYnNvbHV0ZSBzeW1ib2w6ICclcycuIiksIG5hbWUpOwotCSAgICAgIG51bSA9IC0xOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoZXJlIGlzIHdoZXJlIHdlJ2QgY29tZSBmb3IgYW4gdW5kZWZpbmVkIHN5bWJvbAotCSAgICAgb3IgZm9yIGFuIGVtcHR5IHN0cmluZy4gIEZvciBhbiBlbXB0eSBzdHJpbmcgd2UKLQkgICAgIHdpbGwgcmV0dXJuIHplcm8uICBUaGF0J3MgYSBjb25jZXNzaW9uIG1hZGUgZm9yCi0JICAgICBjb21wYXRhYmlsaXR5IHdpdGggdGhlIGJyYWluZGFtYWdlZCBIUCBhc3NlbWJsZXJzLiAgKi8KLQkgIGlmICgqbmFtZSA9PSAwKQotCSAgICBudW0gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHByaW50X2Vycm9ycykKLQkJYXNfYmFkIChfKCJVbmRlZmluZWQgYWJzb2x1dGUgY29uc3RhbnQ6ICclcycuIiksIG5hbWUpOwotCSAgICAgIG51bSA9IC0xOwotCSAgICB9Ci0JfQotICAgICAgKnAgPSBjOwotCi0gICAgICAvKiBTdG9yZSBpbmZvIGluIFJFU1VMVCBpZiByZXF1ZXN0ZWQgYnkgY2FsbGVyLiAgKi8KLSAgICAgIGlmIChyZXN1bHQpCi0JewotCSAgcmVzdWx0LT5udW1iZXJfcGFydCA9IG51bTsKLQkgIGlmIChJU19SX1NFTEVDVCAocCAtIDEpKQotCSAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAxOwotCSAgZWxzZSBpZiAoSVNfTF9TRUxFQ1QgKHAgLSAxKSkKLQkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMDsKLQkgIGVsc2UKLQkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMDsKLQl9Ci0gICAgfQotCi0gICpzID0gcDsKLSAgcmV0dXJuIG51bTsKLX0KLQotI2RlZmluZSBSRUdfTkFNRV9DTlQJKHNpemVvZihwcmVfZGVmaW5lZF9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCBwZF9yZWcpKQotCi0vKiBHaXZlbiBOQU1FLCBmaW5kIHRoZSByZWdpc3RlciBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoYXQgbmFtZSwgcmV0dXJuCi0gICB0aGUgaW50ZWdlciB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgLTEgb24gZmFpbHVyZS4gICovCi0KLXN0YXRpYyBpbnQKLXJlZ19uYW1lX3NlYXJjaCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaW50IG1pZGRsZSwgbG93LCBoaWdoOwotICBpbnQgY21wOwotCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSBSRUdfTkFNRV9DTlQgLSAxOwotCi0gIGRvCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1ttaWRkbGVdLm5hbWUpOwotICAgICAgaWYgKGNtcCA8IDApCi0JaGlnaCA9IG1pZGRsZSAtIDE7Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCWxvdyA9IG1pZGRsZSArIDE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1ttaWRkbGVdLnZhbHVlOwotICAgIH0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKLQotICByZXR1cm4gLTE7Ci19Ci0KLQotLyogUmV0dXJuIG5vbnplcm8gaWYgdGhlIGdpdmVuIElOU04gYW5kIEwvUiBpbmZvcm1hdGlvbiB3aWxsIHJlcXVpcmUKLSAgIGEgbmV3IFBBLTEuMSBvcGNvZGUuICAqLwotCi1zdGF0aWMgaW50Ci1uZWVkX3BhMTFfb3Bjb2RlIChpbnNuLCByZXN1bHQpCi0gICAgIHN0cnVjdCBwYV9pdCAqaW5zbjsKLSAgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgKnJlc3VsdDsKLXsKLSAgaWYgKHJlc3VsdC0+bF9yX3NlbGVjdCA9PSAxICYmICEoaW5zbi0+ZnBvZjEgPT0gREJMICYmIGluc24tPmZwb2YyID09IERCTCkpCi0gICAgewotICAgICAgLyogSWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlLAotCSB0aGVuIHNldCBhIG5ldyBhcmNoaXRlY3R1cmUuICAqLwotICAgICAgaWYgKGJmZF9nZXRfbWFjaCAoc3Rkb3V0cHV0KSA8IHBhMTEpCi0JewotCSAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9ocHBhLCBwYTExKSkKLQkgICAgYXNfd2FybiAoXygiY291bGQgbm90IHVwZGF0ZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0JfQotICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi0vKiBQYXJzZSBhIGNvbmRpdGlvbiBmb3IgYSBmY21wIGluc3RydWN0aW9uLiAgUmV0dXJuIHRoZSBudW1lcmljYWwKLSAgIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25kaXRpb24uICAqLwotCi1zdGF0aWMgaW50Ci1wYV9wYXJzZV9mcF9jbXBfY29uZCAocykKLSAgICAgY2hhciAqKnM7Ci17Ci0gIGludCBjb25kLCBpOwotCi0gIGNvbmQgPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoKnMsIGZwX2NvbmRfbWFwW2ldLnN0cmluZywKLQkJICAgICAgIHN0cmxlbiAoZnBfY29uZF9tYXBbaV0uc3RyaW5nKSkgPT0gMCkKLQl7Ci0JICBjb25kID0gZnBfY29uZF9tYXBbaV0uY29uZDsKLQkgICpzICs9IHN0cmxlbiAoZnBfY29uZF9tYXBbaV0uc3RyaW5nKTsKLQkgIC8qIElmIG5vdCBhIGNvbXBsZXRlIG1hdGNoLCBiYWNrIHVwIHRoZSBpbnB1dCBzdHJpbmcgYW5kCi0JICAgICByZXBvcnQgYW4gZXJyb3IuICAqLwotCSAgaWYgKCoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCi0JICAgIHsKLQkgICAgICAqcyAtPSBzdHJsZW4gKGZwX2NvbmRfbWFwW2ldLnN0cmluZyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHdoaWxlICgqKnMgPT0gJyAnIHx8ICoqcyA9PSAnXHQnKQotCSAgICAqcyA9ICpzICsgMTsKLQkgIHJldHVybiBjb25kOwotCX0KLSAgICB9Ci0KLSAgYXNfYmFkIChfKCJJbnZhbGlkIEZQIENvbXBhcmUgQ29uZGl0aW9uOiAlcyIpLCAqcyk7Ci0KLSAgLyogQWR2YW5jZSBvdmVyIHRoZSBib2d1cyBjb21wbGV0ZXIuICAqLwotICB3aGlsZSAoKipzICE9ICcsJyAmJiAqKnMgIT0gJyAnICYmICoqcyAhPSAnXHQnKQotICAgICpzICs9IDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogUGFyc2UgYW4gRlAgb3BlcmFuZCBmb3JtYXQgY29tcGxldGVyIHJldHVybmluZyB0aGUgY29tcGxldGVyCi0gICB0eXBlLiAgKi8KLQotc3RhdGljIGZwX29wZXJhbmRfZm9ybWF0Ci1wYV9wYXJzZV9mcF9mb3JtYXQgKHMpCi0gICAgIGNoYXIgKipzOwotewotICBpbnQgZm9ybWF0OwotCi0gIGZvcm1hdCA9IFNHTDsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgKz0gMTsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoKnMsICJzZ2wiLCAzKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFNHTDsKLQkgICpzICs9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAiZGJsIiwgMykgPT0gMCkKLQl7Ci0JICBmb3JtYXQgPSBEQkw7Ci0JICAqcyArPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqcywgInF1YWQiLCA0KSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFFVQUQ7Ci0JICAqcyArPSA1OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmb3JtYXQgPSBJTExFR0FMX0ZNVDsKLQkgIGFzX2JhZCAoXygiSW52YWxpZCBGUCBPcGVyYW5kIEZvcm1hdDogJTNzIiksICpzKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBmb3JtYXQ7Ci19Ci0KLS8qIENvbnZlcnQgZnJvbSBhIHNlbGVjdG9yIHN0cmluZyBpbnRvIGEgc2VsZWN0b3IgdHlwZS4gICovCi0KLXN0YXRpYyBpbnQKLXBhX2Noa19maWVsZF9zZWxlY3RvciAoc3RyKQotICAgICBjaGFyICoqc3RyOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0gIGNoYXIgbmFtZVs0XTsKLQotICAvKiBSZWFkIHBhc3QgYW55IHdoaXRlc3BhY2UuICAqLwotICAvKiBGSVhNRTogc2hvdWxkIHdlIHJlYWQgcGFzdCBuZXdsaW5lcyBhbmQgZm9ybWZlZWRzPz8/ICovCi0gIHdoaWxlICgqKnN0ciA9PSAnICcgfHwgKipzdHIgPT0gJ1x0JyB8fCAqKnN0ciA9PSAnXG4nIHx8ICoqc3RyID09ICdcZicpCi0gICAgKnN0ciA9ICpzdHIgKyAxOwotCi0gIGlmICgoKnN0cilbMV0gPT0gJ1wnJyB8fCAoKnN0cilbMV0gPT0gJyUnKQotICAgIG5hbWVbMF0gPSB0b2xvd2VyICgoKnN0cilbMF0pLAotICAgIG5hbWVbMV0gPSAwOwotICBlbHNlIGlmICgoKnN0cilbMl0gPT0gJ1wnJyB8fCAoKnN0cilbMl0gPT0gJyUnKQotICAgIG5hbWVbMF0gPSB0b2xvd2VyICgoKnN0cilbMF0pLAotICAgIG5hbWVbMV0gPSB0b2xvd2VyICgoKnN0cilbMV0pLAotICAgIG5hbWVbMl0gPSAwOwotI2lmZGVmIE9CSl9TT00KLSAgZWxzZSBpZiAoKCpzdHIpWzNdID09ICdcJycgfHwgKCpzdHIpWzNdID09ICclJykKLSAgICBuYW1lWzBdID0gdG9sb3dlciAoKCpzdHIpWzBdKSwKLSAgICBuYW1lWzFdID0gdG9sb3dlciAoKCpzdHIpWzFdKSwKLSAgICBuYW1lWzJdID0gdG9sb3dlciAoKCpzdHIpWzJdKSwKLSAgICBuYW1lWzNdID0gMDsKLSNlbmRpZgotICBlbHNlCi0gICAgcmV0dXJuIGVfZnNlbDsKLQotICBsb3cgPSAwOwotICBoaWdoID0gc2l6ZW9mIChzZWxlY3Rvcl90YWJsZSkgLyBzaXplb2YgKHN0cnVjdCBzZWxlY3Rvcl9lbnRyeSkgLSAxOwotCi0gIGRvCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNtcCAobmFtZSwgc2VsZWN0b3JfdGFibGVbbWlkZGxlXS5wcmVmaXgpOwotICAgICAgaWYgKGNtcCA8IDApCi0JaGlnaCA9IG1pZGRsZSAtIDE7Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCWxvdyA9IG1pZGRsZSArIDE7Ci0gICAgICBlbHNlCi0JewotCSAgKnN0ciArPSBzdHJsZW4gKG5hbWUpICsgMTsKLSNpZm5kZWYgT0JKX1NPTQotCSAgaWYgKHNlbGVjdG9yX3RhYmxlW21pZGRsZV0uZmllbGRfc2VsZWN0b3IgPT0gZV9uc2VsKQotCSAgICByZXR1cm4gZV9mc2VsOwotI2VuZGlmCi0JICByZXR1cm4gc2VsZWN0b3JfdGFibGVbbWlkZGxlXS5maWVsZF9zZWxlY3RvcjsKLQl9Ci0gICAgfQotICB3aGlsZSAobG93IDw9IGhpZ2gpOwotCi0gIHJldHVybiBlX2ZzZWw7Ci19Ci0KLS8qIE1hcmsgKHZpYSBleHByX2VuZCkgdGhlIGVuZCBvZiBhbiBleHByZXNzaW9uIChJIHRoaW5rKS4gIEZJWE1FLiAgKi8KLQotc3RhdGljIGludAotZ2V0X2V4cHJlc3Npb24gKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzYXZlX2luOwotICBhc2VjdGlvbiAqc2VnOwotCi0gIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLSAgc2VnID0gZXhwcmVzc2lvbiAoJnRoZV9pbnNuLmV4cCk7Ci0gIGlmICghKHNlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uCi0JfHwgc2VnID09IHVuZGVmaW5lZF9zZWN0aW9uCi0JfHwgU0VHX05PUk1BTCAoc2VnKSkpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIHNlZ21lbnQgaW4gZXhwcmVzc2lvbi4iKSk7Ci0gICAgICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICByZXR1cm4gMDsKLX0KLQotLyogTWFyayAodmlhIGV4cHJfZW5kKSB0aGUgZW5kIG9mIGFuIGFic29sdXRlIGV4cHJlc3Npb24uICBGSVhNRS4gKi8KLXN0YXRpYyBpbnQKLXBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uIChpbnNuLCBzdHJwKQotICAgICBzdHJ1Y3QgcGFfaXQgKmluc247Ci0gICAgIGNoYXIgKipzdHJwOwotewotICBjaGFyICpzYXZlX2luOwotCi0gIGluc24tPmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yIChzdHJwKTsKLSAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gKnN0cnA7Ci0gIGV4cHJlc3Npb24gKCZpbnNuLT5leHApOwotICAvKiBUaGlzIGlzIG5vdCBwZXJmZWN0LCBidXQgaXMgYSBodWdlIGltcHJvdmVtZW50IG92ZXIgZG9pbmcgbm90aGluZy4KLQotICAgICBUaGUgUEEgYXNzZW1ibHkgc3ludGF4IGlzIGFtYmlnaW91cyBpbiBhIHZhcmlldHkgb2Ygd2F5cy4gIENvbnNpZGVyCi0gICAgIHRoaXMgc3RyaW5nICI0ICVyNSIgIElzIHRoYXQgdGhlIG51bWJlciA0IGZvbGxvd2VkIGJ5IHRoZSByZWdpc3RlcgotICAgICByNSwgb3IgaXMgdGhhdCA0IE1PRCA1PwotCi0gICAgIElmIHdlIGdldCBhIG1vZHVsbyBleHByZXNpb24gV2hlbiBsb29raW5nIGZvciBhbiBhYnNvbHV0ZSwgd2UgdHJ5Ci0gICAgIGFnYWluIGN1dHRpbmcgb2ZmIHRoZSBpbnB1dCBzdHJpbmcgYXQgdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyLiAgKi8KLSAgaWYgKGluc24tPmV4cC5YX29wID09IE9fbW9kdWx1cykKLSAgICB7Ci0gICAgICBjaGFyICpzLCBjOwotICAgICAgaW50IHJldHZhbDsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gKnN0cnA7Ci0gICAgICBzID0gKnN0cnA7Ci0gICAgICB3aGlsZSAoKnMgIT0gJywnICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKQotICAgICAgICBzKys7Ci0KLSAgICAgIGMgPSAqczsKLSAgICAgICpzID0gMDsKLQotICAgICAgcmV0dmFsID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKGluc24sIHN0cnApOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICAgICAgKnMgPSBjOwotICAgICAgcmV0dXJuIGV2YWx1YXRlX2Fic29sdXRlIChpbnNuKTsKLSAgICB9Ci0gIGlmIChpbnNuLT5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiQmFkIHNlZ21lbnQgKHNob3VsZCBiZSBhYnNvbHV0ZSkuIikpOwotICAgICAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgcmV0dXJuIGV2YWx1YXRlX2Fic29sdXRlIChpbnNuKTsKLX0KLQotLyogRXZhbHVhdGUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiBFWFAgd2hpY2ggbWF5IGJlIG1vZGlmaWVkIGJ5Ci0gICB0aGUgc2VsZWN0b3IgRklFTERfU0VMRUNUT1IuICBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLiAgKi8KLXN0YXRpYyBpbnQKLWV2YWx1YXRlX2Fic29sdXRlIChpbnNuKQotICAgICBzdHJ1Y3QgcGFfaXQgKmluc247Ci17Ci0gIGludCB2YWx1ZTsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBpbnQgZmllbGRfc2VsZWN0b3IgPSBpbnNuLT5maWVsZF9zZWxlY3RvcjsKLQotICBleHAgPSBpbnNuLT5leHA7Ci0gIHZhbHVlID0gZXhwLlhfYWRkX251bWJlcjsKLQotICBzd2l0Y2ggKGZpZWxkX3NlbGVjdG9yKQotICAgIHsKLSAgICAvKiBObyBjaGFuZ2UuICAqLwotICAgIGNhc2UgZV9mc2VsOgotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBJZiBiaXQgMjEgaXMgb24gdGhlbiBhZGQgMHg4MDAgYW5kIGFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEgYml0cy4gICovCi0gICAgY2FzZSBlX2xzc2VsOgotICAgICAgaWYgKHZhbHVlICYgMHgwMDAwMDQwMCkKLQl2YWx1ZSArPSAweDgwMDsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFNpZ24gZXh0ZW5kIGZyb20gYml0IDIxLiAgKi8KLSAgICBjYXNlIGVfcnNzZWw6Ci0gICAgICBpZiAodmFsdWUgJiAweDAwMDAwNDAwKQotCXZhbHVlIHw9IDB4ZmZmZmY4MDA7Ci0gICAgICBlbHNlCi0JdmFsdWUgJj0gMHg3ZmY7Ci0gICAgICBicmVhazsKLQotICAgIC8qIEFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEgYml0cy4gICovCi0gICAgY2FzZSBlX2xzZWw6Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4ZmZmZmY4MDApID4+IDExOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBTZXQgYml0cyAwLTIwIHRvIHplcm8uICAqLwotICAgIGNhc2UgZV9yc2VsOgotICAgICAgdmFsdWUgPSB2YWx1ZSAmIDB4N2ZmOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBBZGQgMHg4MDAgYW5kIGFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEgYml0cy4gICovCi0gICAgY2FzZSBlX2xkc2VsOgotICAgICAgdmFsdWUgKz0gMHg4MDA7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4ZmZmZmY4MDApID4+IDExOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBTZXQgYml0Z3MgMC0yMSB0byBvbmUuICAqLwotICAgIGNhc2UgZV9yZHNlbDoKLSAgICAgIHZhbHVlIHw9IDB4ZmZmZmY4MDA7Ci0gICAgICBicmVhazsKLQotI2RlZmluZSBSU0VMX1JPVU5EKGMpICAoKChjKSArIDB4MTAwMCkgJiB+MHgxZmZmKQotICAgIGNhc2UgZV9ycnNlbDoKLSAgICAgIHZhbHVlID0gKFJTRUxfUk9VTkQgKHZhbHVlKSAmIDB4N2ZmKSArICh2YWx1ZSAtIFJTRUxfUk9VTkQgKHZhbHVlKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9scnNlbDoKLSAgICAgIHZhbHVlID0gKFJTRUxfUk9VTkQgKHZhbHVlKSA+PiAxMSkgJiAweDFmZmZmZjsKLSAgICAgIGJyZWFrOwotI3VuZGVmIFJTRUxfUk9VTkQKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBCQURfQ0FTRSAoZmllbGRfc2VsZWN0b3IpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIEdpdmVuIGFuIGFyZ3VtZW50IGxvY2F0aW9uIHNwZWNpZmljYXRpb24gcmV0dXJuIHRoZSBhc3NvY2lhdGVkCi0gICBhcmd1bWVudCBsb2NhdGlvbiBudW1iZXIuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wYV9idWlsZF9hcmdfcmVsb2MgKHR5cGVfbmFtZSkKLSAgICAgY2hhciAqdHlwZV9uYW1lOwotewotCi0gIGlmIChzdHJuY2FzZWNtcCAodHlwZV9uYW1lLCAibm8iLCAyKSA9PSAwKQotICAgIHJldHVybiAwOwotICBpZiAoc3RybmNhc2VjbXAgKHR5cGVfbmFtZSwgImdyIiwgMikgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHR5cGVfbmFtZSwgImZyIiwgMikgPT0gMCkKLSAgICByZXR1cm4gMjsKLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHR5cGVfbmFtZSwgImZ1IiwgMikgPT0gMCkKLSAgICByZXR1cm4gMzsKLSAgZWxzZQotICAgIGFzX2JhZCAoXygiSW52YWxpZCBhcmd1bWVudCBsb2NhdGlvbjogJXNcbiIpLCB0eXBlX25hbWUpOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBFbmNvZGUgYW5kIHJldHVybiBhbiBhcmd1bWVudCByZWxvY2F0aW9uIHNwZWNpZmljYXRpb24gZm9yCi0gICB0aGUgZ2l2ZW4gcmVnaXN0ZXIgaW4gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSBhcmdfcmVsb2MuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wYV9hbGlnbl9hcmdfcmVsb2MgKHJlZywgYXJnX3JlbG9jKQotICAgICB1bnNpZ25lZCBpbnQgcmVnOwotICAgICB1bnNpZ25lZCBpbnQgYXJnX3JlbG9jOwotewotICB1bnNpZ25lZCBpbnQgbmV3X3JlbG9jOwotCi0gIG5ld19yZWxvYyA9IGFyZ19yZWxvYzsKLSAgc3dpdGNoIChyZWcpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIG5ld19yZWxvYyA8PD0gODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIG5ld19yZWxvYyA8PD0gNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIG5ld19yZWxvYyA8PD0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIG5ld19yZWxvYyA8PD0gMjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oIkludmFsaWQgYXJndW1lbnQgZGVzY3JpcHRpb246ICVkIiksIHJlZyk7Ci0gICAgfQotCi0gIHJldHVybiBuZXdfcmVsb2M7Ci19Ci0KLS8qIFBhcnNlIGEgUEEgbnVsbGlmaWNhdGlvbiBjb21wbGV0ZXIgKCxuKS4gIFJldHVybiBub256ZXJvIGlmIHRoZQotICAgY29tcGxldGVyIHdhcyBmb3VuZDsgcmV0dXJuIHplcm8gaWYgbm8gY29tcGxldGVyIHdhcyBmb3VuZC4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX251bGxpZiAocykKLSAgICAgY2hhciAqKnM7Ci17Ci0gIGludCBudWxsaWY7Ci0KLSAgbnVsbGlmID0gMDsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgPSAqcyArIDE7Ci0gICAgICBpZiAoc3RybmNhc2VjbXAgKCpzLCAibiIsIDEpID09IDApCi0JbnVsbGlmID0gMTsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oIkludmFsaWQgTnVsbGlmaWNhdGlvbjogKCVjKSIpLCAqKnMpOwotCSAgbnVsbGlmID0gMDsKLQl9Ci0gICAgICAqcyA9ICpzICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIG51bGxpZjsKLX0KLQotLyogUGFyc2UgYSBub24tbmVnYXRlZCBjb21wYXJlL3N1YnRyYWN0IGNvbXBsZXRlciByZXR1cm5pbmcgdGhlCi0gICBudW1iZXIgKGZvciBlbmNvZGluZyBpbiBpbnN0cnV0aW9ucykgb2YgdGhlIGdpdmVuIGNvbXBsZXRlci4KLQotICAgSVNCUkFOQ0ggc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgcGFyc2luZyBhIGNvbmRpdGlvbgotICAgY29tcGxldGVyIGZvciBhIGJyYW5jaCAodnMgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgYQotICAgY29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX25vbm5lZ19jbXBzdWJfY21wbHRyIChzLCBpc2JyYW5jaCkKLSAgICAgY2hhciAqKnM7Ci0gICAgIGludCBpc2JyYW5jaDsKLXsKLSAgaW50IGNtcGx0cjsKLSAgY2hhciAqbmFtZSA9ICpzICsgMTsKLSAgY2hhciBjOwotICBjaGFyICpzYXZlX3MgPSAqczsKLSAgaW50IG51bGxpZnkgPSAwOwotCi0gIGNtcGx0ciA9IDA7Ci0gIGlmICgqKnMgPT0gJywnKQotICAgIHsKLSAgICAgICpzICs9IDE7Ci0gICAgICB3aGlsZSAoKipzICE9ICcsJyAmJiAqKnMgIT0gJyAnICYmICoqcyAhPSAnXHQnKQotCSpzICs9IDE7Ci0gICAgICBjID0gKipzOwotICAgICAgKipzID0gMHgwMDsKLQotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiPSIpID09IDApCi0JewotCSAgY21wbHRyID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAzOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw8IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw8PSIpID09IDApCi0JewotCSAgY21wbHRyID0gNTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAic3YiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDY7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm9kIikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA3OwotCX0KLSAgICAgIC8qIElmIHdlIGhhdmUgc29tZXRoaW5nIGxpa2UgYWRkYixuIHRoZW4gdGhlcmUgaXMgbm8gY29uZGl0aW9uCi0gICAgICAgICBjb21wbGV0ZXIuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm4iKSA9PSAwICYmIGlzYnJhbmNoKQotCXsKLQkgIGNtcGx0ciA9IDA7Ci0JICBudWxsaWZ5ID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY21wbHRyID0gLTE7Ci0JfQotICAgICAgKipzID0gYzsKLSAgICB9Ci0KLSAgLyogUmVzZXQgcG9pbnRlcnMgaWYgdGhpcyB3YXMgcmVhbGx5IGEgLG4gZm9yIGEgYnJhbmNoIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKG51bGxpZnkpCi0gICAgKnMgPSBzYXZlX3M7Ci0KLQotICByZXR1cm4gY21wbHRyOwotfQotCi0vKiBQYXJzZSBhIG5lZ2F0ZWQgY29tcGFyZS9zdWJ0cmFjdCBjb21wbGV0ZXIgcmV0dXJuaW5nIHRoZQotICAgbnVtYmVyIChmb3IgZW5jb2RpbmcgaW4gaW5zdHJ1dGlvbnMpIG9mIHRoZSBnaXZlbiBjb21wbGV0ZXIuCi0KLSAgIElTQlJBTkNIIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGlzIHBhcnNpbmcgYSBjb25kaXRpb24KLSAgIGNvbXBsZXRlciBmb3IgYSBicmFuY2ggKHZzIGEgbnVsbGlmaWNhdGlvbiBjb21wbGV0ZXIgZm9yIGEKLSAgIGNvbXB1dGF0aW9uYWwgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgaW50Ci1wYV9wYXJzZV9uZWdfY21wc3ViX2NtcGx0ciAocywgaXNicmFuY2gpCi0gICAgIGNoYXIgKipzOwotICAgICBpbnQgaXNicmFuY2g7Ci17Ci0gIGludCBjbXBsdHI7Ci0gIGNoYXIgKm5hbWUgPSAqcyArIDE7Ci0gIGNoYXIgYzsKLSAgY2hhciAqc2F2ZV9zID0gKnM7Ci0gIGludCBudWxsaWZ5ID0gMDsKLQotICBjbXBsdHIgPSAwOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyArPSAxOwotICAgICAgd2hpbGUgKCoqcyAhPSAnLCcgJiYgKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKLQkqcyArPSAxOwotICAgICAgYyA9ICoqczsKLSAgICAgICoqcyA9IDB4MDA7Ci0KLQotICAgICAgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ0ciIpID09IDApCi0JewotCSAgY21wbHRyID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PiIpID09IDApCi0JewotCSAgY21wbHRyID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCi0JewotCSAgY21wbHRyID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAzOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4+PSIpID09IDApCi0JewotCSAgY21wbHRyID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PiIpID09IDApCi0JewotCSAgY21wbHRyID0gNTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibnN2IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA2OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJldiIpID09IDApCi0JewotCSAgY21wbHRyID0gNzsKLQl9Ci0gICAgICAvKiBJZiB3ZSBoYXZlIHNvbWV0aGluZyBsaWtlIGFkZGIsbiB0aGVuIHRoZXJlIGlzIG5vIGNvbmRpdGlvbgotICAgICAgICAgY29tcGxldGVyLiAgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuIikgPT0gMCAmJiBpc2JyYW5jaCkKLQl7Ci0JICBjbXBsdHIgPSAwOwotCSAgbnVsbGlmeSA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNtcGx0ciA9IC0xOwotCX0KLSAgICAgICoqcyA9IGM7Ci0gICAgfQotCi0gIC8qIFJlc2V0IHBvaW50ZXJzIGlmIHRoaXMgd2FzIHJlYWxseSBhICxuIGZvciBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChudWxsaWZ5KQotICAgICpzID0gc2F2ZV9zOwotCi0KLSAgcmV0dXJuIGNtcGx0cjsKLX0KLQotCi0vKiBQYXJzZSBhIG5vbi1uZWdhdGVkIGFkZGl0aW9uIGNvbXBsZXRlciByZXR1cm5pbmcgdGhlIG51bWJlcgotICAgKGZvciBlbmNvZGluZyBpbiBpbnN0cnV0aW9ucykgb2YgdGhlIGdpdmVuIGNvbXBsZXRlci4KLQotICAgSVNCUkFOQ0ggc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgcGFyc2luZyBhIGNvbmRpdGlvbgotICAgY29tcGxldGVyIGZvciBhIGJyYW5jaCAodnMgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgYQotICAgY29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX25vbm5lZ19hZGRfY21wbHRyIChzLCBpc2JyYW5jaCkKLSAgICAgY2hhciAqKnM7Ci0gICAgIGludCBpc2JyYW5jaDsKLXsKLSAgaW50IGNtcGx0cjsKLSAgY2hhciAqbmFtZSA9ICpzICsgMTsKLSAgY2hhciBjOwotICBjaGFyICpzYXZlX3MgPSAqczsKLQotICBjbXBsdHIgPSAwOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyArPSAxOwotICAgICAgd2hpbGUgKCoqcyAhPSAnLCcgJiYgKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKLQkqcyArPSAxOwotICAgICAgYyA9ICoqczsKLSAgICAgICoqcyA9IDB4MDA7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiPSIpID09IDApCi0JewotCSAgY21wbHRyID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAzOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJudXYiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInpudiIpID09IDApCi0JewotCSAgY21wbHRyID0gNTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAic3YiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDY7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm9kIikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA3OwotCX0KLSAgICAgIC8qIElmIHdlIGhhdmUgc29tZXRoaW5nIGxpa2UgYWRkYixuIHRoZW4gdGhlcmUgaXMgbm8gY29uZGl0aW9uCi0gICAgICAgICBjb21wbGV0ZXIuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm4iKSA9PSAwICYmIGlzYnJhbmNoKQotCXsKLQkgIGNtcGx0ciA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNtcGx0ciA9IC0xOwotCX0KLSAgICAgICoqcyA9IGM7Ci0gICAgfQotCi0gIC8qIFJlc2V0IHBvaW50ZXJzIGlmIHRoaXMgd2FzIHJlYWxseSBhICxuIGZvciBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChjbXBsdHIgPT0gMCAmJiAqbmFtZSA9PSAnbicgJiYgaXNicmFuY2gpCi0gICAgKnMgPSBzYXZlX3M7Ci0KLSAgcmV0dXJuIGNtcGx0cjsKLX0KLQotLyogUGFyc2UgYSBuZWdhdGVkIGFkZGl0aW9uIGNvbXBsZXRlciByZXR1cm5pbmcgdGhlIG51bWJlcgotICAgKGZvciBlbmNvZGluZyBpbiBpbnN0cnV0aW9ucykgb2YgdGhlIGdpdmVuIGNvbXBsZXRlci4KLQotICAgSVNCUkFOQ0ggc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgcGFyc2luZyBhIGNvbmRpdGlvbgotICAgY29tcGxldGVyIGZvciBhIGJyYW5jaCAodnMgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgYQotICAgY29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbikuICAqLwotCi1zdGF0aWMgaW50Ci1wYV9wYXJzZV9uZWdfYWRkX2NtcGx0ciAocywgaXNicmFuY2gpCi0gICAgIGNoYXIgKipzOwotICAgICBpbnQgaXNicmFuY2g7Ci17Ci0gIGludCBjbXBsdHI7Ci0gIGNoYXIgKm5hbWUgPSAqcyArIDE7Ci0gIGNoYXIgYzsKLSAgY2hhciAqc2F2ZV9zID0gKnM7Ci0KLSAgY21wbHRyID0gMDsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgKz0gMTsKLSAgICAgIHdoaWxlICgqKnMgIT0gJywnICYmICoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCi0JKnMgKz0gMTsKLSAgICAgIGMgPSAqKnM7Ci0gICAgICAqKnMgPSAweDAwOwotICAgICAgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ0ciIpID09IDApCi0JewotCSAgY21wbHRyID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PiIpID09IDApCi0JewotCSAgY21wbHRyID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCi0JewotCSAgY21wbHRyID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAzOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ1diIpID09IDApCi0JewotCSAgY21wbHRyID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAidm56IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA1OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuc3YiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDY7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImV2IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA3OwotCX0KLSAgICAgIC8qIElmIHdlIGhhdmUgc29tZXRoaW5nIGxpa2UgYWRkYixuIHRoZW4gdGhlcmUgaXMgbm8gY29uZGl0aW9uCi0gICAgICAgICBjb21wbGV0ZXIuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm4iKSA9PSAwICYmIGlzYnJhbmNoKQotCXsKLQkgIGNtcGx0ciA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNtcGx0ciA9IC0xOwotCX0KLSAgICAgICoqcyA9IGM7Ci0gICAgfQotCi0gIC8qIFJlc2V0IHBvaW50ZXJzIGlmIHRoaXMgd2FzIHJlYWxseSBhICxuIGZvciBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChjbXBsdHIgPT0gMCAmJiAqbmFtZSA9PSAnbicgJiYgaXNicmFuY2gpCi0gICAgKnMgPSBzYXZlX3M7Ci0KLSAgcmV0dXJuIGNtcGx0cjsKLX0KLQotLyogSGFuZGxlIGFuIGFsaWdubWVudCBkaXJlY3RpdmUuICBTcGVjaWFsIHNvIHRoYXQgd2UgY2FuIHVwZGF0ZSB0aGUKLSAgIGFsaWdubWVudCBvZiB0aGUgc3Vic3BhY2UgaWYgbmVjZXNzYXJ5LiAgKi8KLXN0YXRpYyB2b2lkCi1wYV9hbGlnbiAoYnl0ZXMpCi17Ci0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotCi0gIC8qIExldCB0aGUgZ2VuZXJpYyBnYXMgY29kZSBkbyBtb3N0IG9mIHRoZSB3b3JrLiAgKi8KLSAgc19hbGlnbl9ieXRlcyAoYnl0ZXMpOwotCi0gIC8qIElmIGJ5dGVzIGlzIGEgcG93ZXIgb2YgMiwgdGhlbiB1cGRhdGUgdGhlIGN1cnJlbnQgc3Vic3BhY2UncwotICAgICBhbGlnbm1lbnQgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKGxvZzIgKGJ5dGVzKSAhPSAtMSkKLSAgICByZWNvcmRfYWxpZ25tZW50IChjdXJyZW50X3N1YnNwYWNlLT5zc2Rfc2VnLCBsb2cyIChieXRlcykpOwotfQotCi0vKiBIYW5kbGUgYSAuQkxPQ0sgdHlwZSBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfYmxvY2sgKHopCi0gICAgIGludCB6OwotewotICBjaGFyICpwOwotICBsb25nIGludCB0ZW1wX2ZpbGw7Ci0gIHVuc2lnbmVkIGludCB0ZW1wX3NpemU7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotCi0gIHRlbXBfc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIC8qIEFsd2F5cyBmaWxsIHdpdGggemVyb3MsIHRoYXQncyB3aGF0IHRoZSBIUCBhc3NlbWJsZXIgZG9lcy4gICovCi0gIHRlbXBfZmlsbCA9IDA7Ci0KLSAgcCA9IGZyYWdfdmFyIChyc19maWxsLCAoaW50KSB0ZW1wX3NpemUsIChpbnQpIHRlbXBfc2l6ZSwKLQkJKHJlbGF4X3N1YnN0YXRlVCkgMCwgKHN5bWJvbFMgKikgMCwgKG9mZnNldFQpIDEsIE5VTEwpOwotICBtZW1zZXQgKHAsIDAsIHRlbXBfc2l6ZSk7Ci0KLSAgLyogQ29udmVydCAyIGJ5dGVzIGF0IGEgdGltZS4gICovCi0KLSAgZm9yIChpID0gMDsgaSA8IHRlbXBfc2l6ZTsgaSArPSAyKQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCArIGksCi0JCQkgICh2YWx1ZVQpIHRlbXBfZmlsbCwKLQkJCSAgKGludCkgKCh0ZW1wX3NpemUgLSBpKSA+IDIgPyAyIDogKHRlbXBfc2l6ZSAtIGkpKSk7Ci0gICAgfQotCi0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuYmVnaW5fYnJ0YWIgYW5kIC5lbmRfYnJ0YWIgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2JydGFiIChiZWdpbikKLSAgICAgaW50IGJlZ2luOwotewotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBUaGUgQlJUQUIgcmVsb2NhdGlvbnMgYXJlIG9ubHkgYXZhaWxibGUgaW4gU09NICh0byBkZW5vdGUKLSAgICAgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGJyYW5jaCB0YWJsZXMpLiAgKi8KLSAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDApOwotCi0gIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHdoZXJlIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDAsCi0JCU5VTEwsIChvZmZzZXRUKSAwLCBOVUxMLAotCQkwLCBiZWdpbiA/IFJfSFBQQV9CRUdJTl9CUlRBQiA6IFJfSFBQQV9FTkRfQlJUQUIsCi0JCWVfZnNlbCwgMCwgMCwgTlVMTCk7Ci0jZW5kaWYKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuYmVnaW5fdHJ5IGFuZCAuZW5kX3RyeSBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfdHJ5IChiZWdpbikKLSAgICAgaW50IGJlZ2luOwotewotI2lmZGVmIE9CSl9TT00KLSAgZXhwcmVzc2lvblMgZXhwOwotICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMCk7Ci0KLSAgaWYgKCEgYmVnaW4pCi0gICAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0KLSAgLyogVGhlIFRSWSByZWxvY2F0aW9ucyBhcmUgb25seSBhdmFpbGJsZSBpbiBTT00gKHRvIGRlbm90ZQotICAgICB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgZXhjZXB0aW9uIGhhbmRsaW5nIHJlZ2lvbnMpLiAgKi8KLQotICBmaXhfbmV3X2hwcGEgKGZyYWdfbm93LCB3aGVyZSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAwLAotCQlOVUxMLCAob2Zmc2V0VCkgMCwgYmVnaW4gPyBOVUxMIDogJmV4cCwKLQkJMCwgYmVnaW4gPyBSX0hQUEFfQkVHSU5fVFJZIDogUl9IUFBBX0VORF9UUlksCi0JCWVfZnNlbCwgMCwgMCwgTlVMTCk7Ci0jZW5kaWYKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuQ0FMTCBwc2V1ZG8tb3AuICBUaGlzIGludm9sdmVzIHN0b3JpbmcgYXdheSBpbmZvcm1hdGlvbgotICAgYWJvdXQgd2hlcmUgYXJndW1lbnRzIGFyZSB0byBiZSBmb3VuZCBzbyB0aGUgbGlua2VyIGNhbiBkZXRlY3QKLSAgIChhbmQgY29ycmVjdCkgYXJndW1lbnQgbG9jYXRpb24gbWlzbWF0Y2hlcyBiZXR3ZWVuIGNhbGxlciBhbmQgY2FsbGVlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NhbGwgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0KLSAgcGFfY2FsbF9hcmdzICgmbGFzdF9jYWxsX2Rlc2MpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBEbyB0aGUgZGlydHkgd29yayBvZiBidWlsZGluZyBhIGNhbGwgZGVzY3JpcHRvciB3aGljaCBkZXNjcmliZXMKLSAgIHdoZXJlIHRoZSBjYWxsZXIgcGxhY2VkIGFyZ3VtZW50cyB0byBhIGZ1bmN0aW9uIGNhbGwuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY2FsbF9hcmdzIChjYWxsX2Rlc2MpCi0gICAgIHN0cnVjdCBjYWxsX2Rlc2MgKmNhbGxfZGVzYzsKLXsKLSAgY2hhciAqbmFtZSwgYywgKnA7Ci0gIHVuc2lnbmVkIGludCB0ZW1wLCBhcmdfcmVsb2M7Ci0KLSAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICAvKiBQcm9jZXNzIGEgc291cmNlIGFyZ3VtZW50LiAgKi8KLSAgICAgIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJhcmd3IiwgNCkgPT0gMCkpCi0JewotCSAgdGVtcCA9IGF0b2kgKG5hbWUgKyA0KTsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICBhcmdfcmVsb2MgPSBwYV9idWlsZF9hcmdfcmVsb2MgKG5hbWUpOwotCSAgY2FsbF9kZXNjLT5hcmdfcmVsb2MgfD0gcGFfYWxpZ25fYXJnX3JlbG9jICh0ZW1wLCBhcmdfcmVsb2MpOwotCX0KLSAgICAgIC8qIFByb2Nlc3MgYSByZXR1cm4gdmFsdWUuICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAicnRudmFsIiwgNikgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgIGFyZ19yZWxvYyA9IHBhX2J1aWxkX2FyZ19yZWxvYyAobmFtZSk7Ci0JICBjYWxsX2Rlc2MtPmFyZ19yZWxvYyB8PSAoYXJnX3JlbG9jICYgMHgzKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJJbnZhbGlkIC5DQUxMIGFyZ3VtZW50OiAlcyIpLCBuYW1lKTsKLQl9Ci0gICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKnAgPSBjOwotICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLX0KLQotLyogUmV0dXJuIFRSVUUgaWYgRlJBRzEgYW5kIEZSQUcyIGFyZSB0aGUgc2FtZS4gICovCi0KLXN0YXRpYyBpbnQKLWlzX3NhbWVfZnJhZyAoZnJhZzEsIGZyYWcyKQotICAgICBmcmFnUyAqZnJhZzE7Ci0gICAgIGZyYWdTICpmcmFnMjsKLXsKLQotICBpZiAoZnJhZzEgPT0gTlVMTCkKLSAgICByZXR1cm4gKEZBTFNFKTsKLSAgZWxzZSBpZiAoZnJhZzIgPT0gTlVMTCkKLSAgICByZXR1cm4gKEZBTFNFKTsKLSAgZWxzZSBpZiAoZnJhZzEgPT0gZnJhZzIpCi0gICAgcmV0dXJuIChUUlVFKTsKLSAgZWxzZSBpZiAoZnJhZzItPmZyX3R5cGUgPT0gcnNfZmlsbCAmJiBmcmFnMi0+ZnJfZml4ID09IDApCi0gICAgcmV0dXJuIChpc19zYW1lX2ZyYWcgKGZyYWcxLCBmcmFnMi0+ZnJfbmV4dCkpOwotICBlbHNlCi0gICAgcmV0dXJuIChGQUxTRSk7Ci19Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBCdWlsZCBhbiBlbnRyeSBpbiB0aGUgVU5XSU5EIHN1YnNwYWNlIGZyb20gdGhlIGdpdmVuIGZ1bmN0aW9uCi0gICBhdHRyaWJ1dGVzIGluIENBTExfSU5GTy4gIFRoaXMgaXMgbm90IG5lZWRlZCBmb3IgU09NIGFzIHVzaW5nCi0gICBSX0VOVFJZIGFuZCBSX0VYSVQgcmVsb2NhdGlvbnMgYWxsb3cgdGhlIGxpbmtlciB0byBoYW5kbGUgYnVpbGRpbmcKLSAgIG9mIHRoZSB1bndpbmQgc3BhY2VzLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSAoY2FsbF9pbmZvKQotICAgICBzdHJ1Y3QgY2FsbF9pbmZvICpjYWxsX2luZm87Ci17Ci0gIGNoYXIgKnVud2luZDsKLSAgYXNlY3Rpb24gKnNlZywgKnNhdmVfc2VnOwotICBzdWJzZWdUIHN1YnNlZywgc2F2ZV9zdWJzZWc7Ci0gIGludCBpOwotICBjaGFyIGMsICpwOwotCi0gIC8qIEdldCBpbnRvIHRoZSByaWdodCBzZWcvc3Vic2VnLiAgVGhpcyBtYXkgaW52b2x2ZSBjcmVhdGluZwotICAgICB0aGUgc2VnIHRoZSBmaXJzdCB0aW1lIHRocm91Z2guICBNYWtlIHN1cmUgdG8gaGF2ZSB0aGUKLSAgICAgb2xkIHNlZy9zdWJzZWcgc28gdGhhdCB3ZSBjYW4gcmVzZXQgdGhpbmdzIHdoZW4gd2UgYXJlIGRvbmUuICAqLwotICBzdWJzZWcgPSBTVUJTRUdfVU5XSU5EOwotICBzZWcgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rkb3V0cHV0LCBVTldJTkRfU0VDVElPTl9OQU1FKTsKLSAgaWYgKHNlZyA9PSBBU0VDX05VTEwpCi0gICAgewotICAgICAgc2VnID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzdGRvdXRwdXQsIFVOV0lORF9TRUNUSU9OX05BTUUpOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywKLQkJCSAgICAgU0VDX1JFQURPTkxZIHwgU0VDX0hBU19DT05URU5UUwotCQkJICAgICB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKTsKLSAgICB9Ci0KLSAgc2F2ZV9zZWcgPSBub3dfc2VnOwotICBzYXZlX3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIHN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKLQotCi0gIC8qIEdldCBzb21lIHNwYWNlIHRvIGhvbGQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHVud2luZAotICAgICBkZXNjcmlwdG9yLiAgKi8KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgMCwgNCk7Ci0KLSAgLyogUmVsb2NhdGlvbiBpbmZvLiBmb3Igc3RhcnQgb2Zmc2V0IG9mIHRoZSBmdW5jdGlvbi4gICovCi0gIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkJY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkoZXhwcmVzc2lvblMgKikgTlVMTCwgMCwgUl9QQVJJU0NfRElSMzIsIGVfZnNlbCwgMzIsIDAsIE5VTEwpOwotCi0gIHAgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIDAsIDQpOwotCi0gIC8qIFJlbG9jYXRpb24gaW5mby4gZm9yIGVuZCBvZmZzZXQgb2YgdGhlIGZ1bmN0aW9uLgotCi0gICAgIEJlY2F1c2Ugd2UgYWxsb3cgcmVkdWN0aW9ucyBvZiAzMmJpdCByZWxvY2F0aW9ucyBmb3IgRUxGLCB0aGlzIHdpbGwgYmUKLSAgICAgcmVkdWNlZCB0byBzZWN0aW9uX3N5bSArIG9mZnNldCB3aGljaCBhdm9pZHMgcHV0dGluZyB0aGUgdGVtcG9yYXJ5Ci0gICAgIHN5bWJvbCBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICBJdCAoc2hvdWxkKSBlbmQgdXAgZ2l2aW5nIHRoZSBzYW1lCi0gICAgIHZhbHVlIGFzIGNhbGxfaW5mby0+c3RhcnRfc3ltYm9sICsgZnVuY3Rpb24gc2l6ZSBvbmNlIHRoZSBsaW5rZXIgaXMKLSAgICAgZmluaXNoZWQgd2l0aCBpdHMgd29yay4gICovCi0KLSAgZml4X25ld19ocHBhIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA0LAotCQljYWxsX2luZm8tPmVuZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkoZXhwcmVzc2lvblMgKikgTlVMTCwgMCwgUl9QQVJJU0NfRElSMzIsIGVfZnNlbCwgMzIsIDAsIE5VTEwpOwotCi0gIC8qIER1bXAgaXQuICovCi0gIHVud2luZCA9IChjaGFyICopICZjYWxsX2luZm8tPmNpX3Vud2luZDsKLSAgZm9yIChpID0gODsgaSA8IHNpemVvZiAoc3RydWN0IHVud2luZF90YWJsZSk7IGkrKykKLSAgICB7Ci0gICAgICBjID0gKih1bndpbmQgKyBpKTsKLSAgICAgIHsKLQlGUkFHX0FQUEVORF8xX0NIQVIgKGMpOwotICAgICAgfQotICAgIH0KLQotICAvKiBSZXR1cm4gYmFjayB0byB0aGUgb3JpZ2luYWwgc2VnbWVudC9zdWJzZWdtZW50LiAgKi8KLSAgc3Vic2VnX3NldCAoc2F2ZV9zZWcsIHNhdmVfc3Vic2VnKTsKLX0KLSNlbmRpZgotCi0vKiBQcm9jZXNzIGEgLkNBTExJTkZPIHBzZXVkby1vcC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBsYXRlcgotICAgdG8gYnVpbGQgdW53aW5kIGRlc2NyaXB0b3JzIGFuZCBtYXliZSBvbmUgZGF5IHRvIHN1cHBvcnQKLSAgIC5FTlRFUiBhbmQgLkxFQVZFLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NhbGxpbmZvICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpwOwotICBpbnQgdGVtcDsKLQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLQotICAvKiAuQ0FMTElORk8gbXVzdCBhcHBlYXIgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uICAqLwotICBpZiAoIXdpdGhpbl9wcm9jZWR1cmUpCi0gICAgYXNfYmFkIChfKCIuY2FsbGluZm8gaXMgbm90IHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uIikpOwotCi0gIC8qIE1hcmsgdGhlIGZhY3QgdGhhdCB3ZSBmb3VuZCB0aGUgLkNBTExJTkZPIGZvciB0aGUKLSAgICAgY3VycmVudCBwcm9jZWR1cmUuICAqLwotICBjYWxsaW5mb19mb3VuZCA9IFRSVUU7Ci0KLSAgLyogSXRlcmF0ZSBvdmVyIHRoZSAuQ0FMTElORk8gYXJndW1lbnRzLiAgKi8KLSAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICAvKiBGcmFtZSBzaXplIHNwZWNpZmljYXRpb24uICAqLwotICAgICAgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImZyYW1lIiwgNSkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgaWYgKCh0ZW1wICYgMHgzKSAhPSAwKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJGUkFNRSBwYXJhbWV0ZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDg6ICVkXG4iKSwgdGVtcCk7Ci0JICAgICAgdGVtcCA9IDA7Ci0JICAgIH0KLQotCSAgLyogY2FsbGluZm8gaXMgaW4gYnl0ZXMgYW5kIHVud2luZF9kZXNjIGlzIGluIDggYnl0ZSB1bml0cy4gICovCi0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuZnJhbWVfc2l6ZSA9IHRlbXAgLyA4OwotCi0JfQotICAgICAgLyogRW50cnkgcmVnaXN0ZXIgKEdSLCBHUiBhbmQgU1IpIHNwZWNpZmljYXRpb25zLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImVudHJ5X2dyIiwgOCkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgLyogVGhlIEhQIGFzc2VtYmxlciBhY2NlcHRzIDE5IGFzIHRoZSBoaWdoIGJvdW5kIGZvciBFTlRSWV9HUgotCSAgICAgZXZlbiB0aG91Z2ggJXIxOSBpcyBjYWxsZXIgc2F2ZWQuICBJIHRoaW5rIHRoaXMgaXMgYSBidWcgaW4KLQkgICAgIHRoZSBIUCBhc3NlbWJsZXIsIGFuZCB3ZSBhcmUgbm90IGdvaW5nIHRvIGVtdWxhdGUgaXQuICAqLwotCSAgaWYgKHRlbXAgPCAzIHx8IHRlbXAgPiAxOCkKLQkgICAgYXNfYmFkIChfKCJWYWx1ZSBmb3IgRU5UUllfR1IgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMy4uMThcbiIpKTsKLQkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5lbnRyeV9nciA9IHRlbXAgLSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImVudHJ5X2ZyIiwgOCkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgLyogU2ltaWxhcmx5IHRoZSBIUCBhc3NlbWJsZXIgdGFrZXMgMzEgYXMgdGhlIGhpZ2ggYm91bmQgZXZlbgotCSAgICAgdGhvdWdoICVmcjIxIGlzIHRoZSBsYXN0IGNhbGxlZSBzYXZlZCBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gICovCi0JICBpZiAodGVtcCA8IDEyIHx8IHRlbXAgPiAyMSkKLQkgICAgYXNfYmFkIChfKCJWYWx1ZSBmb3IgRU5UUllfRlIgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMTIuLjIxXG4iKSk7Ci0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuZW50cnlfZnIgPSB0ZW1wIC0gMTE7Ci0JfQotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiZW50cnlfc3IiLCA4KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICBpZiAodGVtcCAhPSAzKQotCSAgICBhc19iYWQgKF8oIlZhbHVlIGZvciBFTlRSWV9TUiBtdXN0IGJlIDNcbiIpKTsKLQl9Ci0gICAgICAvKiBOb3RlIHdoZXRoZXIgb3Igbm90IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYW55IGNhbGxzLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImNhbGxzIiwgNSkgPT0gMCkgfHwKLQkgICAgICAgKHN0cm5jYXNlY21wIChuYW1lLCAiY2FsbGVyIiwgNikgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQl9Ci0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJub19jYWxscyIsIDgpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JfQotICAgICAgLyogU2hvdWxkIFJQIGJlIHNhdmVkIGludG8gdGhlIHN0YWNrLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInNhdmVfcnAiLCA3KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLnNhdmVfcnAgPSAxOwotCX0KLSAgICAgIC8qIExpa2V3aXNlIGZvciBTUC4gICovCi0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJzYXZlX3NwIiwgNykgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5zYXZlX3NwID0gMTsKLQl9Ci0gICAgICAvKiBJcyB0aGlzIGFuIHVud2luZGFibGUgcHJvY2VkdXJlLiAgSWYgc28gbWFyayBpdCBzbwotICAgICAgICAgaW4gdGhlIHVud2luZCBkZXNjcmlwdG9yLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgIm5vX3Vud2luZCIsIDkpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuY2Fubm90X3Vud2luZCA9IDE7Ci0JfQotICAgICAgLyogSXMgdGhpcyBhbiBpbnRlcnJ1cHQgcm91dGluZS4gIElmIHNvIG1hcmsgaXQgaW4gdGhlCi0gICAgICAgICB1bndpbmQgZGVzY3JpcHRvci4gICovCi0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJocHV4X2ludCIsIDcpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuaHB1eF9pbnRlcnJ1cHRfbWFya2VyID0gMTsKLQl9Ci0gICAgICAvKiBJcyB0aGlzIGEgbWlsbGljb2RlIHJvdXRpbmUuICAibWlsbGljb2RlIiBpc24ndCBpbiBteQotCSBhc3NlbWJsZXIgbWFudWFsLCBidXQgbXkgY29weSBpcyBvbGQuICBUaGUgSFAgYXNzZW1ibGVyCi0JIGFjY2VwdHMgaXQsIGFuZCB0aGVyZSdzIGEgcGxhY2UgaW4gdGhlIHVud2luZCBkZXNjcmlwdG9yCi0JIHRvIGRyb3AgdGhlIGluZm9ybWF0aW9uLCBzbyB3ZSdsbCBhY2NlcHQgaXQgdG9vLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgIm1pbGxpY29kZSIsIDkpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IubWlsbGljb2RlID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJJbnZhbGlkIC5DQUxMSU5GTyBhcmd1bWVudDogJXMiKSwgbmFtZSk7Ci0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQl9Ci0gICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFN3aXRjaCBpbnRvIHRoZSBjb2RlIHN1YnNwYWNlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NvZGUgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY3VycmVudF9zcGFjZSA9IGlzX2RlZmluZWRfc3BhY2UgKCIkVEVYVCQiKTsKLSAgY3VycmVudF9zdWJzcGFjZQotICAgID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoY3VycmVudF9zcGFjZS0+c2Rfc2VnLCAwKTsKLSAgc190ZXh0ICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIFRoaXMgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHN0YW5kYXJkIEdBUyBzX2NvbW0oKS4gT24gSFA5MDAwLzgwMCBtYWNoaW5lcywKLSAgIHRoZSAuY29tbSBwc2V1ZG8tb3AgaGFzIHRoZSBmb2xsb3dpbmcgc3ltdGF4OgotCi0gICA8bGFiZWw+IC5jb21tIDxsZW5ndGg+Ci0KLSAgIHdoZXJlIDxsYWJlbD4gaXMgb3B0aW9uYWwgYW5kIGlzIGEgc3ltYm9sIHdob3NlIGFkZHJlc3Mgd2lsbCBiZSB0aGUgc3RhcnQgb2YKLSAgIGEgYmxvY2sgb2YgbWVtb3J5IDxsZW5ndGg+IGJ5dGVzIGxvbmcuIDxsZW5ndGg+IG11c3QgYmUgYW4gYWJzb2x1dGUKLSAgIGV4cHJlc3Npb24uICA8bGVuZ3RoPiBieXRlcyB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGUgY3VycmVudCBzcGFjZQotICAgYW5kIHN1YnNwYWNlLgotCi0gICBBbHNvIG5vdGUgdGhlIGxhYmVsIG1heSBub3QgZXZlbiBiZSBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSAuY29tbS4KLQotICAgVGhpcyBkaWZmZXJlbmNlIGluIHN5bnRheCBtZWFucyB0aGUgY29sb24gZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKLSAgIG9uIHRoZSBzeW1ib2wgYmVmb3JlIHdlIGFycml2ZSBpbiBwYV9jb21tLiAgY29sb24gd2lsbCBzZXQgYSBudW1iZXIKLSAgIG9mIGF0dHJpYnV0ZXMgb2YgdGhlIHN5bWJvbCB0aGF0IG5lZWQgdG8gYmUgZml4ZWQgaGVyZS4gIEluIHBhcnRpY3VsYXIKLSAgIHRoZSB2YWx1ZSwgc2VjdGlvbiBwb2ludGVyLCBmcmFnbWVudCBwb2ludGVyLCBmbGFncywgZXRjLiAgV2hhdAotICAgYSBwYWluLgotCi0gICBUaGlzIGFsc28gbWFrZXMgZXJyb3IgZGV0ZWN0aW9uIGFsbCBidXQgaW1wb3NzaWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9jb21tICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBzeW1ib2xTICpzeW1ib2w7Ci0gIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX3N5bWJvbCA9IHBhX2dldF9sYWJlbCAoKTsKLQotICBpZiAobGFiZWxfc3ltYm9sKQotICAgIHN5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOwotICBlbHNlCi0gICAgc3ltYm9sID0gTlVMTDsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBpZiAoc3ltYm9sKQotICAgIHsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2wsIHNpemUpOwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sLCBiZmRfdW5kX3NlY3Rpb25fcHRyKTsKLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2wpOwotCi0gICAgICAvKiBjb2xvbigpIGhhcyBhbHJlYWR5IHNldCB0aGUgZnJhZyB0byB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUKLSAgICAgICAgIGN1cnJlbnQgc3Vic3BhY2U7IHdlIG5lZWQgdG8gcmVzZXQgdGhlIGZyYWdtZW50IHRvIHRoZSB6ZXJvIGFkZHJlc3MKLSAgICAgICAgIGZyYWdtZW50LiAgV2UgYWxzbyBuZWVkIHRvIHJlc2V0IHRoZSBzZWdtZW50IHBvaW50ZXIuICAqLwotICAgICAgc3ltYm9sLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogUHJvY2VzcyBhIC5FTkQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2VuZCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBQcm9jZXNzIGEgLkVOVEVSIHBzZXVkby1vcC4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gICovCi1zdGF0aWMgdm9pZAotcGFfZW50ZXIgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0KLSAgYXNfYmFkIChfKCJUaGUgLkVOVEVSIHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkIikpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBQcm9jZXNzIGEgLkVOVFJZIHBzZXVkby1vcC4gIC5FTlRSWSBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgcHJvY2VzdXJlLiAgKi8KLXN0YXRpYyB2b2lkCi1wYV9lbnRyeSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLQotICBpZiAoIXdpdGhpbl9wcm9jZWR1cmUpCi0gICAgYXNfYmFkIChfKCJNaXNwbGFjZWQgLmVudHJ5LiBJZ25vcmVkLiIpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghY2FsbGluZm9fZm91bmQpCi0JYXNfYmFkIChfKCJNaXNzaW5nIC5jYWxsaW5mby4iKSk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICB3aXRoaW5fZW50cnlfZXhpdCA9IFRSVUU7Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFNPTSBkZWZlcnMgYnVpbGRpbmcgb2YgdW53aW5kIGRlc2NyaXB0b3JzIHVudGlsIHRoZSBsaW5rIHBoYXNlLgotICAgICBUaGUgYXNzZW1ibGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhbiBSX0VOVFJZIHJlbG9jYXRpb24KLSAgICAgdG8gbWFyayB0aGUgYmVnaW5uaW5nIG9mIGEgcmVnaW9uIGFuZCBob2xkIHRoZSB1bndpbmQgYml0cywgYW5kCi0gICAgIGZvciBjcmVhdGluZyBhbiBSX0VYSVQgcmVsb2NhdGlvbiB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIHJlZ2lvbi4KLQotICAgICBGSVhNRS4gIEVMRiBzaG91bGQgYmUgdXNpbmcgdGhlIHNhbWUgY29udmVudGlvbnMhICBUaGUgcHJvYmxlbQotICAgICBpcyBhbiB1bndpbmQgcmVxdWlyZXMgdG9vIG11Y2ggcmVsb2NhdGlvbiBzcGFjZS4gIEhtbW0uICBNYXliZQotICAgICBpZiB3ZSBzcGxpdCB0aGUgdW53aW5kIGJpdHMgdXAgYmV0d2VlbiB0aGUgcmVsb2NhdGlvbnMgd2hpY2gKLSAgICAgZGVub3RlIHRoZSBlbnRyeSBhbmQgZXhpdCBwb2ludHMuICAqLwotICBpZiAobGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgwKTsKLQotICAgICAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKLQkJICAgIE5VTEwsIChvZmZzZXRUKSAwLCBOVUxMLAotCQkgICAgMCwgUl9IUFBBX0VOVFJZLCBlX2ZzZWwsIDAsIDAsCi0JCSAgICAoaW50ICopICZsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IpOwotICAgIH0KLSNlbmRpZgotfQotCi0vKiBIYW5kbGUgYSAuRVFVIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9lcXUgKHJlZykKLSAgICAgaW50IHJlZzsKLXsKLSAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfc3ltYm9sID0gcGFfZ2V0X2xhYmVsICgpOwotICBzeW1ib2xTICpzeW1ib2w7Ci0KLSAgaWYgKGxhYmVsX3N5bWJvbCkKLSAgICB7Ci0gICAgICBzeW1ib2wgPSBsYWJlbF9zeW1ib2wtPmxzc19sYWJlbDsKLSAgICAgIGlmIChyZWcpCi0JU19TRVRfVkFMVUUgKHN5bWJvbCwgcGFfcGFyc2VfbnVtYmVyICgmaW5wdXRfbGluZV9wb2ludGVyLCAwKSk7Ci0gICAgICBlbHNlCi0JU19TRVRfVkFMVUUgKHN5bWJvbCwgKHVuc2lnbmVkIGludCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sLCBiZmRfYWJzX3NlY3Rpb25fcHRyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocmVnKQotCWFzX2JhZCAoXygiLlJFRyBtdXN0IHVzZSBhIGxhYmVsIikpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiLkVRVSBtdXN0IHVzZSBhIGxhYmVsIikpOwotICAgIH0KLQotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGVscGVyIGZ1bmN0aW9uLiAgRG9lcyBwcm9jZXNzaW5nIGZvciB0aGUgZW5kIG9mIGEgZnVuY3Rpb24uICBUaGlzCi0gICB1c3VhbGx5IGludm9sdmVzIGNyZWF0aW5nIHNvbWUgcmVsb2NhdGlvbnMgb3IgYnVpbGRpbmcgc3BlY2lhbAotICAgc3ltYm9scyB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfZXhpdCAoKQotewotICBjaGFyICp3aGVyZTsKLQotICB3aGVyZSA9IGZyYWdfbW9yZSAoMCk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIC8qIE1hcmsgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIHN0dWZmIGF3YXkgdGhlIGxvY2F0aW9uIG9mIHRoZSBmcmFnCi0gICAgIGZvciB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiwgYW5kIGZpbmFsbHkgY2FsbCBwYV9idWlsZF91bndpbmRfc3Vic3BhY2UKLSAgICAgdG8gYWRkIGFuIGVudHJ5IGluIHRoZSB1bndpbmQgdGFibGUuICAqLwotICBocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbiAoKTsKLSAgcGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlIChsYXN0X2NhbGxfaW5mbyk7Ci0jZWxzZQotICAvKiBTT00gZGVmZXJzIGJ1aWxkaW5nIG9mIHVud2luZCBkZXNjcmlwdG9ycyB1bnRpbCB0aGUgbGluayBwaGFzZS4KLSAgICAgVGhlIGFzc2VtYmxlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYW4gUl9FTlRSWSByZWxvY2F0aW9uCi0gICAgIHRvIG1hcmsgdGhlIGJlZ2lubmluZyBvZiBhIHJlZ2lvbiBhbmQgaG9sZCB0aGUgdW53aW5kIGJpdHMsIGFuZAotICAgICBmb3IgY3JlYXRpbmcgYW4gUl9FWElUIHJlbG9jYXRpb24gdG8gbWFyayB0aGUgZW5kIG9mIHRoZSByZWdpb24uCi0KLSAgICAgRklYTUUuICBFTEYgc2hvdWxkIGJlIHVzaW5nIHRoZSBzYW1lIGNvbnZlbnRpb25zISAgVGhlIHByb2JsZW0KLSAgICAgaXMgYW4gdW53aW5kIHJlcXVpcmVzIHRvbyBtdWNoIHJlbG9jYXRpb24gc3BhY2UuICBIbW1tLiAgTWF5YmUKLSAgICAgaWYgd2Ugc3BsaXQgdGhlIHVud2luZCBiaXRzIHVwIGJldHdlZW4gdGhlIHJlbG9jYXRpb25zIHdoaWNoCi0gICAgIGRlbm90ZSB0aGUgZW50cnkgYW5kIGV4aXQgcG9pbnRzLiAgKi8KLSAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKLQkJTlVMTCwgKG9mZnNldFQpIDAsCi0JCU5VTEwsIDAsIFJfSFBQQV9FWElULCBlX2ZzZWwsIDAsIDAsCi0JCShpbnQgKikgJmxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvciArIDEpOwotI2VuZGlmCi19Ci0KLS8qIFByb2Nlc3MgYSAuRVhJVCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfZXhpdCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLQotICBpZiAoIXdpdGhpbl9wcm9jZWR1cmUpCi0gICAgYXNfYmFkIChfKCIuRVhJVCBtdXN0IGFwcGVhciB3aXRoaW4gYSBwcm9jZWR1cmUiKSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIWNhbGxpbmZvX2ZvdW5kKQotCWFzX2JhZCAoXygiTWlzc2luZyAuY2FsbGluZm8iKSk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCF3aXRoaW5fZW50cnlfZXhpdCkKLQkgICAgYXNfYmFkIChfKCJObyAuRU5UUlkgZm9yIHRoaXMgLkVYSVQiKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB3aXRoaW5fZW50cnlfZXhpdCA9IEZBTFNFOwotCSAgICAgIHByb2Nlc3NfZXhpdCAoKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFByb2Nlc3MgYSAuRVhQT1JUIGRpcmVjdGl2ZS4gIFRoaXMgbWFrZXMgZnVuY3Rpb25zIGV4dGVybmFsCi0gICBhbmQgcHJvdmlkZXMgaW5mb3JtYXRpb24gc3VjaCBhcyBhcmd1bWVudCByZWxvY2F0aW9uIGVudHJpZXMKLSAgIHRvIGNhbGxlcnMuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfZXhwb3J0ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpwOwotICBzeW1ib2xTICpzeW1ib2w7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAvKiBNYWtlIHN1cmUgdGhlIGdpdmVuIHN5bWJvbCBleGlzdHMuICAqLwotICBpZiAoKHN5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiQ2Fubm90IGRlZmluZSBleHBvcnQgc3ltYm9sOiAlc1xuIiksIG5hbWUpOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICpwID0gYzsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIE9LLiAgU2V0IHRoZSBleHRlcm5hbCBiaXRzIGFuZCBwcm9jZXNzIGFyZ3VtZW50IHJlbG9jYXRpb25zLiAgKi8KLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2wpOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICpwID0gYzsKLSAgICAgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHBhX3R5cGVfYXJncyAoc3ltYm9sLCAxKTsKLQl9Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhlbHBlciBmdW5jdGlvbiB0byBwcm9jZXNzIGFyZ3VtZW50cyB0byBhIC5FWFBPUlQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3R5cGVfYXJncyAoc3ltYm9sUCwgaXNfZXhwb3J0KQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotICAgICBpbnQgaXNfZXhwb3J0OwotewotICBjaGFyICpuYW1lLCBjLCAqcDsKLSAgdW5zaWduZWQgaW50IHRlbXAsIGFyZ19yZWxvYzsKLSAgcGFfc3ltYm9sX3R5cGUgdHlwZSA9IFNZTUJPTF9UWVBFX1VOS05PV047Ci0gIG9ial9zeW1ib2xfdHlwZSAqc3ltYm9sID0gKG9ial9zeW1ib2xfdHlwZSAqKSBzeW1ib2xQLT5ic3ltOwotCi0gIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiYWJzb2x1dGUiLCA4KSA9PSAwKQotCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDg7Ci0gICAgICBzeW1ib2xQLT5ic3ltLT5mbGFncyAmPSB+QlNGX0ZVTkNUSU9OOwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYmZkX2Fic19zZWN0aW9uX3B0cik7Ci0gICAgICB0eXBlID0gU1lNQk9MX1RZUEVfQUJTT0xVVEU7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiY29kZSIsIDQpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDQ7Ci0gICAgICAvKiBJTVBPUlRpbmcvRVhQT1JUaW5nIENPREUgdHlwZXMgZm9yIGZ1bmN0aW9ucyBpcyBtZWFuaW5nbGVzcyBmb3IgU09NLAotICAgICAgICAgaW5zdGVhZCBvbmUgc2hvdWxkIGJlIElNUE9SVGluZy9FWFBPUlRpbmcgRU5UUlkgdHlwZXMuCi0KLSAgICAgICAgIENvbXBsYWluIGlmIG9uZSB0cmllcyB0byBFWFBPUlQgYSBDT0RFIHR5cGUgc2luY2UgdGhhdCdzIG5ldmVyCi0gICAgICAgICBkb25lLiAgQm90aCBHQ0MgYW5kIEhQIEMgc3RpbGwgdHJ5IHRvIElNUE9SVCBDT0RFIHR5cGVzLCBzbwotICAgICAgICAgc2lsZW50bHkgZml4IHRoZW0gdG8gYmUgRU5UUlkgdHlwZXMuICAqLwotICAgICAgaWYgKHN5bWJvbFAtPmJzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKQotCXsKLQkgIGlmIChpc19leHBvcnQpCi0JICAgIGFzX3Rza3RzayAoXygiVXNpbmcgRU5UUlkgcmF0aGVyIHRoYW4gQ09ERSBpbiBleHBvcnQgZGlyZWN0aXZlIGZvciAlcyIpLCBzeW1ib2xQLT5ic3ltLT5uYW1lKTsKLQotCSAgc3ltYm9sUC0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgdHlwZSA9IFNZTUJPTF9UWVBFX0VOVFJZOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xQLT5ic3ltLT5mbGFncyAmPSB+QlNGX0ZVTkNUSU9OOwotCSAgdHlwZSA9IFNZTUJPTF9UWVBFX0NPREU7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImRhdGEiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA0OwotICAgICAgc3ltYm9sUC0+YnN5bS0+ZmxhZ3MgJj0gfkJTRl9GVU5DVElPTjsKLSAgICAgIHR5cGUgPSBTWU1CT0xfVFlQRV9EQVRBOwotICAgIH0KLSAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJlbnRyeSIsIDUpID09IDApKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA1OwotICAgICAgc3ltYm9sUC0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotICAgICAgdHlwZSA9IFNZTUJPTF9UWVBFX0VOVFJZOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIm1pbGxpY29kZSIsIDkpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDk7Ci0gICAgICBzeW1ib2xQLT5ic3ltLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0gICAgICB0eXBlID0gU1lNQk9MX1RZUEVfTUlMTElDT0RFOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInBsYWJlbCIsIDYpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7Ci0gICAgICBzeW1ib2xQLT5ic3ltLT5mbGFncyAmPSB+QlNGX0ZVTkNUSU9OOwotICAgICAgdHlwZSA9IFNZTUJPTF9UWVBFX1BMQUJFTDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJwcmlfcHJvZyIsIDgpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDg7Ci0gICAgICBzeW1ib2xQLT5ic3ltLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0gICAgICB0eXBlID0gU1lNQk9MX1RZUEVfUFJJX1BST0c7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAic2VjX3Byb2ciLCA4KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA4OwotICAgICAgc3ltYm9sUC0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotICAgICAgdHlwZSA9IFNZTUJPTF9UWVBFX1NFQ19QUk9HOwotICAgIH0KLQotICAvKiBTT00gcmVxdWlyZXMgbXVjaCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHN5bWJvbCB0eXBlcwotICAgICB0aGFuIEJGRCB1bmRlcnN0YW5kcy4gIFRoaXMgaXMgaG93IHdlIGdldCB0aGlzIGluZm9ybWF0aW9uCi0gICAgIHRvIHRoZSBTT00gQkZEIGJhY2tlbmQuICAqLwotI2lmZGVmIG9ial9zZXRfc3ltYm9sX3R5cGUKLSAgb2JqX3NldF9zeW1ib2xfdHlwZSAoc3ltYm9sUC0+YnN5bSwgKGludCkgdHlwZSk7Ci0jZW5kaWYKLQotICAvKiBOb3cgdGhhdCB0aGUgdHlwZSBvZiB0aGUgZXhwb3J0ZWQgc3ltYm9sIGhhcyBiZWVuIGhhbmRsZWQsCi0gICAgIGhhbmRsZSBhbnkgYXJndW1lbnQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIHdoaWxlICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgLyogQXJndW1lbnQgc291cmNlcy4gICovCi0gICAgICBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiYXJndyIsIDQpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHRlbXAgPSBhdG9pIChuYW1lICsgNCk7Ci0JICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCSAgYXJnX3JlbG9jID0gcGFfYWxpZ25fYXJnX3JlbG9jICh0ZW1wLCBwYV9idWlsZF9hcmdfcmVsb2MgKG5hbWUpKTsKLQkgIHN5bWJvbC0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYyB8PSBhcmdfcmVsb2M7Ci0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQl9Ci0gICAgICAvKiBUaGUgcmV0dXJuIHZhbHVlLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInJ0bnZhbCIsIDYpKSA9PSAwKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICBhcmdfcmVsb2MgPSBwYV9idWlsZF9hcmdfcmVsb2MgKG5hbWUpOwotCSAgc3ltYm9sLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jIHw9IGFyZ19yZWxvYzsKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCX0KLSAgICAgIC8qIFByaXZlbGVnZSBsZXZlbC4gICovCi0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJwcml2X2xldiIsIDgpKSA9PSAwKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHRlbXAgPSBhdG9pIChpbnB1dF9saW5lX3BvaW50ZXIpOwotCSAgc3ltYm9sLT50Y19kYXRhLmFwLmhwcGFfcHJpdl9sZXZlbCA9IHRlbXA7Ci0JICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJVbmRlZmluZWQgLkVYUE9SVC8uSU1QT1JUIGFyZ3VtZW50IChpZ25vcmVkKTogJXMiKSwgbmFtZSk7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCX0KLSAgICAgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci19Ci0KLS8qIEhhbmRsZSBhbiAuSU1QT1JUIHBzZXVkby1vcC4gIEFueSBzeW1ib2wgcmVmZXJlbmNlZCBpbiBhIGdpdmVuCi0gICBhc3NlbWJseSBmaWxlIG11c3QgZWl0aGVyIGJlIGRlZmluZWQgaW4gdGhlIGFzc2VtYmx5IGZpbGUsIG9yCi0gICBleHBsaWNpdGx5IElNUE9SVEVEIGZyb20gYW5vdGhlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9pbXBvcnQgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY2hhciAqbmFtZSwgYywgKnA7Ci0gIHN5bWJvbFMgKnN5bWJvbDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgc3ltYm9sID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotICAvKiBVZ2guICBXZSBtaWdodCBiZSBpbXBvcnRpbmcgYSBzeW1ib2wgZGVmaW5lZCBlYXJsaWVyIGluIHRoZSBmaWxlLAotICAgICBpbiB3aGljaCBjYXNlIGFsbCB0aGUgY29kZSBiZWxvdyB3aWxsIHJlYWxseSBzY3JldyB0aGluZ3MgdXAKLSAgICAgKHNldCB0aGUgd3Jvbmcgc2VnbWVudCwgc3ltYm9sIGZsYWdzICYgdHlwZSwgZXRjKS4gICovCi0gIGlmIChzeW1ib2wgPT0gTlVMTCB8fCAhU19JU19ERUZJTkVEIChzeW1ib2wpKQotICAgIHsKLSAgICAgIHN5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICpwID0gYzsKLQotICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgcGFfdHlwZV9hcmdzIChzeW1ib2wsIDApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBTaWdoLiAgVG8gYmUgY29tcGF0YWJsZSB3aXRoIHRoZSBIUCBhc3NlbWJsZXIgYW5kIHRvIGhlbHAKLQkgICAgIHBvb3JseSB3cml0dGVuIGFzc2VtYmx5IGNvZGUsIHdlIGFzc2lnbiBhIHR5cGUgYmFzZWQgb24KLQkgICAgIHRoZSB0aGUgY3VycmVudCBzZWdtZW50LiAgTm90ZSBvbmx5IEJTRl9GVU5DVElPTiByZWFsbHkKLQkgICAgIG1hdHRlcnMsIHdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgZnVsbCBTWU1CT0xfVFlQRV8qIGluZm8uICAqLwotCSAgaWYgKG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uKQotCSAgICBzeW1ib2wtPmJzeW0tPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQotCSAgLyogSWYgdGhlIHNlY3Rpb24gaXMgdW5kZWZpbmVkLCB0aGVuIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkCi0JICAgICBTaW5jZSB0aGlzIGlzIGFuIGltcG9ydCwgbGVhdmUgdGhlIHNlY3Rpb24gdW5kZWZpbmVkLiAgKi8KLQkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbCwgYmZkX3VuZF9zZWN0aW9uX3B0cik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgd2FzIGFscmVhZHkgZGVmaW5lZC4gIEp1c3QgZWF0IGV2ZXJ5dGhpbmcgdXAgdG8KLQkgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzdGF0ZW1lbnQuICAqLwotICAgICAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuTEFCRUwgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2xhYmVsICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpwOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBpZiAoc3RybGVuIChuYW1lKSA+IDApCi0gICAgewotICAgICAgY29sb24gKG5hbWUpOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICpwID0gYzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJNaXNzaW5nIGxhYmVsIG5hbWUgb24gLkxBQkVMIikpOwotICAgIH0KLQotICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiZXh0cmEgLkxBQkVMIGFyZ3VtZW50cyBpZ25vcmVkLiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuTEVBVkUgcHNldWRvLW9wLiAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIHlldC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9sZWF2ZSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLQotICBhc19iYWQgKF8oIlRoZSAuTEVBVkUgcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5MRVZFTCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfbGV2ZWwgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY2hhciAqbGV2ZWw7Ci0KLSAgbGV2ZWwgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlmIChzdHJuY21wIChsZXZlbCwgIjEuMCIsIDMpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDM7Ci0gICAgICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIDEwKSkKLQlhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGxldmVsLCAiMS4xIiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMzsKLSAgICAgIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfaHBwYSwgMTEpKQotCWFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAobGV2ZWwsICIyLjAiLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAzOwotICAgICAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9ocHBhLCAyMCkpCi0JYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbnJlY29nbml6ZWQgLkxFVkVMIGFyZ3VtZW50XG4iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLk9SSUdJTiBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfb3JpZ2luICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotCi0gIHNfb3JnICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5QQVJBTSBwc2V1ZG8tb3AuICBUaGlzIGlzIG11Y2ggbGlrZSBhIC5FWFBPUlQsIGV4Y2VwdCBpdAotICAgaXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICBGSVhNRS4gIFNob3VsZCBzaGFyZSBtb3JlIGNvZGUgd2l0aCAuRVhQT1JULiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3BhcmFtICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpwOwotICBzeW1ib2xTICpzeW1ib2w7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGlmICgoc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSkpID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJDYW5ub3QgZGVmaW5lIHN0YXRpYyBzeW1ib2w6ICVzXG4iKSwgbmFtZSk7Ci0gICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKnAgPSBjOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sKTsKLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBwYV90eXBlX2FyZ3MgKHN5bWJvbCwgMCk7Ci0JfQotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuUFJPQyBwc2V1ZG8tb3AuICBJdCBpcyB1c2VkIHRvIG1hcmsgdGhlIGJlZ2lubmluZwotICAgb2YgYSBwcm9jZWR1cmUgZnJvbSBhIHN5bnRhdGljYWwgcG9pbnQgb2Ygdmlldy4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9wcm9jICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIHN0cnVjdCBjYWxsX2luZm8gKmNhbGxfaW5mbzsKLQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLQotICBpZiAod2l0aGluX3Byb2NlZHVyZSkKLSAgICBhc19mYXRhbCAoXygiTmVzdGVkIHByb2NlZHVyZXMiKSk7Ci0KLSAgLyogUmVzZXQgZ2xvYmFsIHZhcmlhYmxlcyBmb3IgbmV3IHByb2NlZHVyZS4gICovCi0gIGNhbGxpbmZvX2ZvdW5kID0gRkFMU0U7Ci0gIHdpdGhpbl9wcm9jZWR1cmUgPSBUUlVFOwotCi0gIC8qIENyZWF0ZSBhbm90aGVyIGNhbGxfaW5mbyBzdHJ1Y3R1cmUuICAqLwotICBjYWxsX2luZm8gPSAoc3RydWN0IGNhbGxfaW5mbyAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjYWxsX2luZm8pKTsKLQotICBpZiAoIWNhbGxfaW5mbykKLSAgICBhc19mYXRhbCAoXygiQ2Fubm90IGFsbG9jYXRlIHVud2luZCBkZXNjcmlwdG9yXG4iKSk7Ci0KLSAgbWVtc2V0IChjYWxsX2luZm8sIDAsIHNpemVvZiAoc3RydWN0IGNhbGxfaW5mbykpOwotCi0gIGNhbGxfaW5mby0+Y2lfbmV4dCA9IE5VTEw7Ci0KLSAgaWYgKGNhbGxfaW5mb19yb290ID09IE5VTEwpCi0gICAgewotICAgICAgY2FsbF9pbmZvX3Jvb3QgPSBjYWxsX2luZm87Ci0gICAgICBsYXN0X2NhbGxfaW5mbyA9IGNhbGxfaW5mbzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsYXN0X2NhbGxfaW5mby0+Y2lfbmV4dCA9IGNhbGxfaW5mbzsKLSAgICAgIGxhc3RfY2FsbF9pbmZvID0gY2FsbF9pbmZvOwotICAgIH0KLQotICAvKiBzZXQgdXAgZGVmYXVsdHMgb24gY2FsbF9pbmZvIHN0cnVjdHVyZSAqLwotCi0gIGNhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuY2Fubm90X3Vud2luZCA9IDA7Ci0gIGNhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IucmVnaW9uX2Rlc2MgPSAxOwotICBjYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLmhwdXhfaW50ZXJydXB0X21hcmtlciA9IDA7Ci0KLSAgLyogSWYgd2UgZ290IGEgLlBST0MgcHNldWRvLW9wLCB3ZSBrbm93IHRoYXQgdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQKLSAgICAgbG9jYWxseS4gIE1ha2Ugc3VyZSBpdCBnZXRzIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIHsKLSAgICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9zeW1ib2wgPSBwYV9nZXRfbGFiZWwgKCk7Ci0KLSAgICBpZiAobGFiZWxfc3ltYm9sKQotICAgICAgewotCWlmIChsYWJlbF9zeW1ib2wtPmxzc19sYWJlbCkKLQkgIHsKLQkgICAgbGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOwotCSAgICBsYWJlbF9zeW1ib2wtPmxzc19sYWJlbC0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgfQotCWVsc2UKLQkgIGFzX2JhZCAoXygiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyAoY29ycnVwdGVkIGxhYmVsIGNoYWluKSIpKTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICBsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sID0gTlVMTDsKLSAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFByb2Nlc3MgdGhlIHN5bnRhdGljYWwgZW5kIG9mIGEgcHJvY2VkdXJlLiAgTWFrZSBzdXJlIGFsbCB0aGUKLSAgIGFwcHJvcHJpYXRlIHBzZXVkby1vcHMgd2VyZSBmb3VuZCB3aXRoaW4gdGhlIHByb2NlZHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9wcm9jZW5kICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0KLSAgLyogSWYgd2UgYXJlIHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uLCBtYWtlIHN1cmUgd2UndmUKLSAgICAgZGVmaW5lZCBhIGxhYmVsIGZvciB0aGUgcHJvY2VkdXJlOyBoYW5kbGUgY2FzZSB3aGVyZSB0aGUKLSAgICAgbGFiZWwgd2FzIGRlZmluZWQgYWZ0ZXIgdGhlIC5QUk9DIGRpcmVjdGl2ZS4KLQotICAgICBOb3RlIHRoZXJlJ3Mgbm90IG5lZWQgdG8gZGlkZGxlIHdpdGggdGhlIHNlZ21lbnQgb3IgZnJhZ21lbnQKLSAgICAgZm9yIHRoZSBsYWJlbCBzeW1ib2wgaW4gdGhpcyBjYXNlLiAgV2UgaGF2ZSBhbHJlYWR5IHN3aXRjaGVkCi0gICAgIGludG8gdGhlIG5ldyAkQ09ERSQgc3Vic3BhY2UgYXQgdGhpcyBwb2ludC4gICovCi0gIGlmICh3aXRoaW5fcHJvY2VkdXJlICYmIGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9zeW1ib2wgPSBwYV9nZXRfbGFiZWwgKCk7Ci0KLSAgICAgIGlmIChsYWJlbF9zeW1ib2wpCi0JewotCSAgaWYgKGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsKQotCSAgICB7Ci0JICAgICAgbGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOwotCSAgICAgIGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsLT5ic3ltLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0jaWZkZWYgT0JKX1NPTQotCSAgICAgIC8qIEFsc28gaGFuZGxlIGFsbG9jYXRpb24gb2YgYSBmaXh1cCB0byBob2xkIHRoZSB1bndpbmQKLQkJIGluZm9ybWF0aW9uIHdoZW4gdGhlIGxhYmVsIGFwcGVhcnMgYWZ0ZXIgdGhlIHByb2MvcHJvY2VuZC4gICovCi0JICAgICAgaWYgKHdpdGhpbl9lbnRyeV9leGl0KQotCQl7Ci0JCSAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDApOwotCi0JCSAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKLQkJCQlOVUxMLCAob2Zmc2V0VCkgMCwgTlVMTCwKLQkJCQkwLCBSX0hQUEFfRU5UUlksIGVfZnNlbCwgMCwgMCwKLQkJCQkoaW50ICopICZsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IpOwotCQl9Ci0jZW5kaWYKLQkgICAgfQotCSAgZWxzZQotCSAgICBhc19iYWQgKF8oIk1pc3NpbmcgZnVuY3Rpb24gbmFtZSBmb3IgLlBST0MgKGNvcnJ1cHRlZCBsYWJlbCBjaGFpbikiKSk7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyIpKTsKLSAgICB9Ci0KLSAgaWYgKCF3aXRoaW5fcHJvY2VkdXJlKQotICAgIGFzX2JhZCAoXygibWlzcGxhY2VkIC5wcm9jZW5kIikpOwotCi0gIGlmICghY2FsbGluZm9fZm91bmQpCi0gICAgYXNfYmFkIChfKCJNaXNzaW5nIC5jYWxsaW5mbyBmb3IgdGhpcyBwcm9jZWR1cmUiKSk7Ci0KLSAgaWYgKHdpdGhpbl9lbnRyeV9leGl0KQotICAgIGFzX2JhZCAoXygiTWlzc2luZyAuRVhJVCBmb3IgYSAuRU5UUlkiKSk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIC8qIEVMRiBuZWVkcyB0byBtYXJrIHRoZSBlbmQgb2YgZWFjaCBmdW5jdGlvbiBzbyB0aGF0IGl0IGNhbiBjb21wdXRlCi0gICAgIHRoZSBzaXplIG9mIHRoZSBmdW5jdGlvbiAoYXBwYXJlbnRseSBpdHMgbmVlZGVkIGluIHRoZSBzeW1ib2wgdGFibGUpLiAgKi8KLSAgaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24gKCk7Ci0jZW5kaWYKLQotICB3aXRoaW5fcHJvY2VkdXJlID0gRkFMU0U7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBQYXJzZSB0aGUgcGFyYW1ldGVycyB0byBhIC5TUEFDRSBkaXJlY3RpdmU7IGlmIENSRUFURV9GTEFHIGlzIG5vbnplcm8sCi0gICB0aGVuIGNyZWF0ZSBhIG5ldyBzcGFjZSBlbnRyeSB0byBob2xkIHRoZSBpbmZvcm1hdGlvbiBzcGVjaWZpZWQKLSAgIGJ5IHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSAuU1BBQ0UgZGlyZWN0aXZlLiAgKi8KLQotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqCi1wYV9wYXJzZV9zcGFjZV9zdG10IChzcGFjZV9uYW1lLCBjcmVhdGVfZmxhZykKLSAgICAgY2hhciAqc3BhY2VfbmFtZTsKLSAgICAgaW50IGNyZWF0ZV9mbGFnOwotewotICBjaGFyICpuYW1lLCAqcHRlbXAsIGM7Ci0gIGNoYXIgbG9hZGFibGUsIGRlZmluZWQsIHByaXZhdGUsIHNvcnQ7Ci0gIGludCBzcG51bSwgdGVtcDsKLSAgYXNlY3Rpb24gKnNlZyA9IE5VTEw7Ci0gIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Ci0KLSAgLyogbG9hZCBkZWZhdWx0IHZhbHVlcyAqLwotICBzcG51bSA9IDA7Ci0gIHNvcnQgPSAwOwotICBsb2FkYWJsZSA9IFRSVUU7Ci0gIGRlZmluZWQgPSBUUlVFOwotICBwcml2YXRlID0gRkFMU0U7Ci0gIGlmIChzdHJjbXAgKHNwYWNlX25hbWUsICIkVEVYVCQiKSA9PSAwKQotICAgIHsKLSAgICAgIHNlZyA9IHBhX2RlZl9zcGFjZXNbMF0uc2VnbWVudDsKLSAgICAgIGRlZmluZWQgPSBwYV9kZWZfc3BhY2VzWzBdLmRlZmluZWQ7Ci0gICAgICBwcml2YXRlID0gcGFfZGVmX3NwYWNlc1swXS5wcml2YXRlOwotICAgICAgc29ydCA9IHBhX2RlZl9zcGFjZXNbMF0uc29ydDsKLSAgICAgIHNwbnVtID0gcGFfZGVmX3NwYWNlc1swXS5zcG51bTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc3BhY2VfbmFtZSwgIiRQUklWQVRFJCIpID09IDApCi0gICAgewotICAgICAgc2VnID0gcGFfZGVmX3NwYWNlc1sxXS5zZWdtZW50OwotICAgICAgZGVmaW5lZCA9IHBhX2RlZl9zcGFjZXNbMV0uZGVmaW5lZDsKLSAgICAgIHByaXZhdGUgPSBwYV9kZWZfc3BhY2VzWzFdLnByaXZhdGU7Ci0gICAgICBzb3J0ID0gcGFfZGVmX3NwYWNlc1sxXS5zb3J0OwotICAgICAgc3BudW0gPSBwYV9kZWZfc3BhY2VzWzFdLnNwbnVtOwotICAgIH0KLQotICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgcHJpbnRfZXJyb3JzID0gRkFMU0U7Ci0gICAgICBwdGVtcCA9IGlucHV0X2xpbmVfcG9pbnRlciArIDE7Ci0gICAgICAvKiBGaXJzdCBzZWUgaWYgdGhlIHNwYWNlIHdhcyBzcGVjaWZpZWQgYXMgYSBudW1iZXIgcmF0aGVyIHRoYW4KLSAgICAgICAgIGFzIGEgbmFtZS4gIEFjY29yZGluZyB0byB0aGUgUEEgYXNzZW1ibHkgbWFudWFsIHRoZSByZXN0IG9mCi0gICAgICAgICB0aGUgbGluZSBzaG91bGQgYmUgaWdub3JlZC4gICovCi0gICAgICB0ZW1wID0gcGFfcGFyc2VfbnVtYmVyICgmcHRlbXAsIDApOwotICAgICAgaWYgKHRlbXAgPj0gMCkKLQl7Ci0JICBzcG51bSA9IHRlbXA7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwdGVtcDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICAgICAgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInNwbnVtIiwgNSkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJICBzcG51bSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAic29ydCIsIDQpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCSAgc29ydCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAidW5sb2FkYWJsZSIsIDEwKSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGxvYWRhYmxlID0gRkFMU0U7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJub3RkZWZpbmVkIiwgMTApID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgZGVmaW5lZCA9IEZBTFNFOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAicHJpdmF0ZSIsIDcpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgcHJpdmF0ZSA9IFRSVUU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhc19iYWQgKF8oIkludmFsaWQgLlNQQUNFIGFyZ3VtZW50IikpOwotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQkJICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBwcmludF9lcnJvcnMgPSBUUlVFOwotICAgIH0KLQotICBpZiAoY3JlYXRlX2ZsYWcgJiYgc2VnID09IE5VTEwpCi0gICAgc2VnID0gc3Vic2VnX25ldyAoc3BhY2VfbmFtZSwgMCk7Ci0KLSAgLyogSWYgY3JlYXRlX2ZsYWcgaXMgbm9uemVybywgdGhlbiBjcmVhdGUgdGhlIG5ldyBzcGFjZSB3aXRoCi0gICAgIHRoZSBhdHRyaWJ1dGVzIGNvbXB1dGVkIGFib3ZlLiAgRWxzZSBzZXQgdGhlIHZhbHVlcyBpbgotICAgICBhbiBhbHJlYWR5IGV4aXN0aW5nIHNwYWNlIC0tIHRoaXMgY2FuIG9ubHkgaGFwcGVuIGZvcgotICAgICB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIGEgYnVpbHQtaW4gc3BhY2UuICAqLwotICBpZiAoY3JlYXRlX2ZsYWcpCi0gICAgc3BhY2UgPSBjcmVhdGVfbmV3X3NwYWNlIChzcGFjZV9uYW1lLCBzcG51bSwgbG9hZGFibGUsIGRlZmluZWQsCi0JCQkgICAgICBwcml2YXRlLCBzb3J0LCBzZWcsIDEpOwotICBlbHNlCi0gICAgewotICAgICAgc3BhY2UgPSBpc19kZWZpbmVkX3NwYWNlIChzcGFjZV9uYW1lKTsKLSAgICAgIFNQQUNFX1NQTlVNIChzcGFjZSkgPSBzcG51bTsKLSAgICAgIFNQQUNFX0RFRklORUQgKHNwYWNlKSA9IGRlZmluZWQgJiAxOwotICAgICAgU1BBQ0VfVVNFUl9ERUZJTkVEIChzcGFjZSkgPSAxOwotICAgIH0KLQotI2lmZGVmIG9ial9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzCi0gIG9ial9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzIChzZWcsIGRlZmluZWQsIHByaXZhdGUsIHNvcnQsIHNwbnVtKTsKLSNlbmRpZgotCi0gIHJldHVybiBzcGFjZTsKLX0KLQotLyogSGFuZGxlIGEgLlNQQUNFIHBzZXVkby1vcDsgdGhpcyBzd2l0Y2hlcyB0aGUgY3VycmVudCBzcGFjZSB0byB0aGUKLSAgIGdpdmVuIHNwYWNlLCBjcmVhdGluZyB0aGUgbmV3IHNwYWNlIGlmIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9zcGFjZSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpuYW1lLCBjLCAqc3BhY2VfbmFtZSwgKnNhdmVfczsKLSAgaW50IHRlbXA7Ci0gIHNkX2NoYWluX3N0cnVjdCAqc2RfY2hhaW47Ci0KLSAgaWYgKHdpdGhpbl9wcm9jZWR1cmUpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJDYW5cJ3QgY2hhbmdlIHNwYWNlcyB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbi4gSWdub3JlZCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQ2hlY2sgZm9yIHNvbWUgb2YgdGhlIHByZWRlZmluZWQgc3BhY2VzLiAgIEZJWE1FOiBtb3N0IG9mIHRoZSBjb2RlCi0gICAgICAgICBiZWxvdyBpcyByZXBlYXRlZCBzZXZlcmFsIHRpbWVzLCBjYW4gd2UgZXh0cmFjdCB0aGUgY29tbW9uIHBhcnRzCi0gICAgICAgICBhbmQgcGxhY2UgdGhlbSBpbnRvIGEgc3Vicm91dGluZSBvciBzb21ldGhpbmcgc2ltaWxhcj8gICovCi0gICAgICAvKiBGSVhNRSBJcyB0aGlzIChhbmQgdGhlIG5leHQgSUYgc3RtdCkgcmVhbGx5IHJpZ2h0PwotCSBXaGF0IGlmIElOUFVUX0xJTkVfUE9JTlRFUiBwb2ludHMgdG8gIiRURVhUJEZPTyI/ICAqLwotICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIiRURVhUJCIsIDYpID09IDApCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7Ci0JICBzZF9jaGFpbiA9IGlzX2RlZmluZWRfc3BhY2UgKCIkVEVYVCQiKTsKLQkgIGlmIChzZF9jaGFpbiA9PSBOVUxMKQotCSAgICBzZF9jaGFpbiA9IHBhX3BhcnNlX3NwYWNlX3N0bXQgKCIkVEVYVCQiLCAxKTsKLQkgIGVsc2UgaWYgKFNQQUNFX1VTRVJfREVGSU5FRCAoc2RfY2hhaW4pID09IDApCi0JICAgIHNkX2NoYWluID0gcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoIiRURVhUJCIsIDApOwotCi0JICBjdXJyZW50X3NwYWNlID0gc2RfY2hhaW47Ci0JICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0JICBjdXJyZW50X3N1YnNwYWNlCi0JICAgID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAodGV4dF9zZWN0aW9uLAotCQkJCQkgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIiRQUklWQVRFJCIsIDkpID09IDApCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDk7Ci0JICBzZF9jaGFpbiA9IGlzX2RlZmluZWRfc3BhY2UgKCIkUFJJVkFURSQiKTsKLQkgIGlmIChzZF9jaGFpbiA9PSBOVUxMKQotCSAgICBzZF9jaGFpbiA9IHBhX3BhcnNlX3NwYWNlX3N0bXQgKCIkUFJJVkFURSQiLCAxKTsKLQkgIGVsc2UgaWYgKFNQQUNFX1VTRVJfREVGSU5FRCAoc2RfY2hhaW4pID09IDApCi0JICAgIHNkX2NoYWluID0gcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoIiRQUklWQVRFJCIsIDApOwotCi0JICBjdXJyZW50X3NwYWNlID0gc2RfY2hhaW47Ci0JICBzdWJzZWdfc2V0IChkYXRhX3NlY3Rpb24sIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0JICBjdXJyZW50X3N1YnNwYWNlCi0JICAgID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoZGF0YV9zZWN0aW9uLAotCQkJCQkgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKCFzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLAotCQkJR0RCX0RFQlVHX1NQQUNFX05BTUUsCi0JCQlzdHJsZW4gKEdEQl9ERUJVR19TUEFDRV9OQU1FKSkpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IHN0cmxlbiAoR0RCX0RFQlVHX1NQQUNFX05BTUUpOwotCSAgc2RfY2hhaW4gPSBpc19kZWZpbmVkX3NwYWNlIChHREJfREVCVUdfU1BBQ0VfTkFNRSk7Ci0JICBpZiAoc2RfY2hhaW4gPT0gTlVMTCkKLQkgICAgc2RfY2hhaW4gPSBwYV9wYXJzZV9zcGFjZV9zdG10IChHREJfREVCVUdfU1BBQ0VfTkFNRSwgMSk7Ci0JICBlbHNlIGlmIChTUEFDRV9VU0VSX0RFRklORUQgKHNkX2NoYWluKSA9PSAwKQotCSAgICBzZF9jaGFpbiA9IHBhX3BhcnNlX3NwYWNlX3N0bXQgKEdEQl9ERUJVR19TUEFDRV9OQU1FLCAwKTsKLQotCSAgY3VycmVudF9zcGFjZSA9IHNkX2NoYWluOwotCi0JICB7Ci0JICAgIGFzZWN0aW9uICpnZGJfc2VjdGlvbgotCSAgICA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoc3Rkb3V0cHV0LCBHREJfREVCVUdfU1BBQ0VfTkFNRSk7Ci0KLQkgICAgc3Vic2VnX3NldCAoZ2RiX3NlY3Rpb24sIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0JICAgIGN1cnJlbnRfc3Vic3BhY2UKLQkgICAgICA9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKGdkYl9zZWN0aW9uLAotCQkJCQkgICBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotCSAgfQotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIEl0IGNvdWxkIGJlIGEgc3BhY2Ugc3BlY2lmaWVkIGJ5IG51bWJlci4gICovCi0gICAgICBwcmludF9lcnJvcnMgPSAwOwotICAgICAgc2F2ZV9zID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaWYgKCh0ZW1wID0gcGFfcGFyc2VfbnVtYmVyICgmaW5wdXRfbGluZV9wb2ludGVyLCAwKSkgPj0gMCkKLQl7Ci0JICBpZiAoKHNkX2NoYWluID0gcGFfZmluZF9zcGFjZV9ieV9udW1iZXIgKHRlbXApKSkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfc3BhY2UgPSBzZF9jaGFpbjsKLQotCSAgICAgIHN1YnNlZ19zZXQgKHNkX2NoYWluLT5zZF9zZWcsIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0JICAgICAgY3VycmVudF9zdWJzcGFjZQotCQk9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKHNkX2NoYWluLT5zZF9zZWcsCi0JCQkJCSAgICAgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLQkgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogTm90IGEgbnVtYmVyLCBhdHRlbXB0IHRvIGNyZWF0ZSBhIG5ldyBzcGFjZS4gICovCi0gICAgICBwcmludF9lcnJvcnMgPSAxOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9zOwotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHNwYWNlX25hbWUgPSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0gICAgICBzdHJjcHkgKHNwYWNlX25hbWUsIG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgICAgIHNkX2NoYWluID0gcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoc3BhY2VfbmFtZSwgMSk7Ci0gICAgICBjdXJyZW50X3NwYWNlID0gc2RfY2hhaW47Ci0KLSAgICAgIHN1YnNlZ19zZXQgKHNkX2NoYWluLT5zZF9zZWcsIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0gICAgICBjdXJyZW50X3N1YnNwYWNlID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoc2RfY2hhaW4tPnNkX3NlZywKLQkJCQkJCSAgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotfQotCi0vKiBTd2l0Y2ggdG8gYSBuZXcgc3BhY2UuICAoSSB0aGluaykuICBGSVhNRS4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9zcG51bSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzcGFjZSA9IGlzX2RlZmluZWRfc3BhY2UgKG5hbWUpOwotICBpZiAoc3BhY2UpCi0gICAgewotICAgICAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIFNQQUNFX1NQTlVNIChzcGFjZSksIDQpOwotICAgIH0KLSAgZWxzZQotICAgIGFzX3dhcm4gKF8oIlVuZGVmaW5lZCBzcGFjZTogJyVzJyBBc3N1bWluZyBzcGFjZSBudW1iZXIgPSAwLiIpLCBuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSWYgVkFMVUUgaXMgYW4gZXhhY3QgcG93ZXIgb2YgdHdvIGJldHdlZW4gemVybyBhbmQgMl4zMSwgdGhlbgotICAgcmV0dXJuIGxvZzIgKFZBTFVFKS4gIEVsc2UgcmV0dXJuIC0xLiAgKi8KLQotc3RhdGljIGludAotbG9nMiAodmFsdWUpCi0gICAgIGludCB2YWx1ZTsKLXsKLSAgaW50IHNoaWZ0ID0gMDsKLQotICB3aGlsZSAoKDEgPDwgc2hpZnQpICE9IHZhbHVlICYmIHNoaWZ0IDwgMzIpCi0gICAgc2hpZnQrKzsKLQotICBpZiAoc2hpZnQgPj0gMzIpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlCi0gICAgcmV0dXJuIHNoaWZ0OwotfQotCi0vKiBIYW5kbGUgYSAuU1VCU1BBQ0UgcHNldWRvLW9wOyB0aGlzIHN3aXRjaGVzIHRoZSBjdXJyZW50IHN1YnNwYWNlIHRvIHRoZQotICAgZ2l2ZW4gc3Vic3BhY2UsIGNyZWF0aW5nIHRoZSBuZXcgc3Vic3BhY2UgaWYgbmVjZXNzYXJ5LgotCi0gICBGSVhNRS4gIFNob3VsZCBtaXJyb3IgcGFfc3BhY2UgbW9yZSBjbG9zZWx5LCBpbiBwYXJ0aWN1bGFyIGhvdwotICAgdGhleSdyZSBicm9rZW4gdXAgaW50byBzdWJyb3V0aW5lcy4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9zdWJzcGFjZSAoY3JlYXRlX25ldykKLSAgICAgaW50IGNyZWF0ZV9uZXc7Ci17Ci0gIGNoYXIgKm5hbWUsICpzc19uYW1lLCAqYWxpYXMsIGM7Ci0gIGNoYXIgbG9hZGFibGUsIGNvZGVfb25seSwgY29tbW9uLCBkdXBfY29tbW9uLCB6ZXJvLCBzb3J0OwotICBpbnQgaSwgYWNjZXNzLCBzcGFjZV9pbmRleCwgYWxpZ25tZW50LCBxdWFkcmFudCwgYXBwbGljYWJsZSwgZmxhZ3M7Ci0gIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Ci0gIHNzZF9jaGFpbl9zdHJ1Y3QgKnNzZDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgaWYgKGN1cnJlbnRfc3BhY2UgPT0gTlVMTCkKLSAgICBhc19mYXRhbCAoXygiTXVzdCBiZSBpbiBhIHNwYWNlIGJlZm9yZSBjaGFuZ2luZyBvciBkZWNsYXJpbmcgc3Vic3BhY2VzLlxuIikpOwotCi0gIGlmICh3aXRoaW5fcHJvY2VkdXJlKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiQ2FuXCd0IGNoYW5nZSBzdWJzcGFjZXMgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uIElnbm9yZWQiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzc19uYW1lID0geG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotICAgICAgc3RyY3B5IChzc19uYW1lLCBuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gICAgICAvKiBMb2FkIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgICAgIHNvcnQgPSAwOwotICAgICAgYWNjZXNzID0gMHg3ZjsKLSAgICAgIGxvYWRhYmxlID0gMTsKLSAgICAgIGNvbW1vbiA9IDA7Ci0gICAgICBkdXBfY29tbW9uID0gMDsKLSAgICAgIGNvZGVfb25seSA9IDA7Ci0gICAgICB6ZXJvID0gMDsKLSAgICAgIHNwYWNlX2luZGV4ID0gfjA7Ci0gICAgICBhbGlnbm1lbnQgPSAxOwotICAgICAgcXVhZHJhbnQgPSAwOwotICAgICAgYWxpYXMgPSBOVUxMOwotCi0gICAgICBzcGFjZSA9IGN1cnJlbnRfc3BhY2U7Ci0gICAgICBpZiAoY3JlYXRlX25ldykKLQlzc2QgPSBOVUxMOwotICAgICAgZWxzZQotCXNzZCA9IGlzX2RlZmluZWRfc3Vic3BhY2UgKHNzX25hbWUpOwotICAgICAgLyogQWxsb3cgdXNlciB0byBvdmVycmlkZSB0aGUgYnVpbHRpbiBhdHRyaWJ1dGVzIG9mIHN1YnNwYWNlcy4gIEJ1dAotICAgICAgICAgb25seSBhbGxvdyB0aGUgYXR0cmlidXRlcyB0byBiZSBjaGFuZ2VkIG9uY2UhICAqLwotICAgICAgaWYgKHNzZCAmJiBTVUJTUEFDRV9ERUZJTkVEIChzc2QpKQotCXsKLQkgIHN1YnNlZ19zZXQgKHNzZC0+c3NkX3NlZywgc3NkLT5zc2Rfc3Vic2VnKTsKLQkgIGN1cnJlbnRfc3Vic3BhY2UgPSBzc2Q7Ci0JICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JICAgIGFzX3dhcm4gKF8oIlBhcmFtZXRlcnMgb2YgYW4gZXhpc3Rpbmcgc3Vic3BhY2UgY2FuXCd0IGJlIG1vZGlmaWVkIikpOwotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQSBuZXcgc3Vic3BhY2UuICBMb2FkIGRlZmF1bHQgdmFsdWVzIGlmIGl0IG1hdGNoZXMgb25lIG9mCi0JICAgICB0aGUgYnVpbHRpbiBzdWJzcGFjZXMuICAqLwotCSAgaSA9IDA7Ci0JICB3aGlsZSAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNhc2VjbXAgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSwgc3NfbmFtZSkgPT0gMCkKLQkJewotCQkgIGxvYWRhYmxlID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5sb2FkYWJsZTsKLQkJICBjb21tb24gPSBwYV9kZWZfc3Vic3BhY2VzW2ldLmNvbW1vbjsKLQkJICBkdXBfY29tbW9uID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5kdXBfY29tbW9uOwotCQkgIGNvZGVfb25seSA9IHBhX2RlZl9zdWJzcGFjZXNbaV0uY29kZV9vbmx5OwotCQkgIHplcm8gPSBwYV9kZWZfc3Vic3BhY2VzW2ldLnplcm87Ci0JCSAgc3BhY2VfaW5kZXggPSBwYV9kZWZfc3Vic3BhY2VzW2ldLnNwYWNlX2luZGV4OwotCQkgIGFsaWdubWVudCA9IHBhX2RlZl9zdWJzcGFjZXNbaV0uYWxpZ25tZW50OwotCQkgIHF1YWRyYW50ID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5xdWFkcmFudDsKLQkJICBhY2Nlc3MgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLmFjY2VzczsKLQkJICBzb3J0ID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5zb3J0OwotCQkgIGlmIChVU0VfQUxJQVNFUyAmJiBwYV9kZWZfc3Vic3BhY2VzW2ldLmFsaWFzKQotCQkgICAgYWxpYXMgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLmFsaWFzOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgaSsrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXZSBzaG91bGQgYmUgd29ya2luZyB3aXRoIGEgbmV3IHN1YnNwYWNlIG5vdy4gIEZpbGwgaW4KLSAgICAgICAgIGFueSBpbmZvcm1hdGlvbiBhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuICAqLwotICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCSAgICB7Ci0JICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICAgICAgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInF1YWQiLCA0KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkgIHF1YWRyYW50ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJhbGlnbiIsIDUpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCSAgYWxpZ25tZW50ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JCSAgaWYgKGxvZzIgKGFsaWdubWVudCkgPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoXygiQWxpZ25tZW50IG11c3QgYmUgYSBwb3dlciBvZiAyIikpOwotCQkgICAgICBhbGlnbm1lbnQgPSAxOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiYWNjZXNzIiwgNikgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJICBhY2Nlc3MgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInNvcnQiLCA0KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkgIHNvcnQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImNvZGVfb25seSIsIDkpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgY29kZV9vbmx5ID0gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInVubG9hZGFibGUiLCAxMCkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBsb2FkYWJsZSA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJjb21tb24iLCA2KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGNvbW1vbiA9IDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJkdXBfY29tbSIsIDgpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgZHVwX2NvbW1vbiA9IDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJ6ZXJvIiwgNCkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICB6ZXJvID0gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImZpcnN0IiwgNSkgPT0gMCkpCi0JCWFzX2JhZCAoXygiRklSU1Qgbm90IHN1cHBvcnRlZCBhcyBhIC5TVUJTUEFDRSBhcmd1bWVudCIpKTsKLQkgICAgICBlbHNlCi0JCWFzX2JhZCAoXygiSW52YWxpZCAuU1VCU1BBQ0UgYXJndW1lbnQiKSk7Ci0JICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgfQotCX0KLQotICAgICAgLyogQ29tcHV0ZSBhIHJlYXNvbmFibGUgc2V0IG9mIEJGRCBmbGFncyBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24KLSAgICAgICAgIGluIHRoZSAuc3Vic3BhY2UgZGlyZWN0aXZlLiAgKi8KLSAgICAgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotICAgICAgZmxhZ3MgPSAwOwotICAgICAgaWYgKGxvYWRhYmxlKQotCWZsYWdzIHw9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCk7Ci0gICAgICBpZiAoY29kZV9vbmx5KQotCWZsYWdzIHw9IFNFQ19DT0RFOwotICAgICAgaWYgKGNvbW1vbiB8fCBkdXBfY29tbW9uKQotCWZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0KLSAgICAgIGZsYWdzIHw9IFNFQ19SRUxPQyB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSB6ZXJvLWZpbGxlZCBzdWJzcGFjZSAoZWcgQlNTKS4gICovCi0gICAgICBpZiAoemVybykKLQlmbGFncyAmPSB+KFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyk7Ci0KLSAgICAgIGFwcGxpY2FibGUgJj0gZmxhZ3M7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYW4gZXhpc3Rpbmcgc3Vic3BhY2UsIHRoZW4gd2Ugd2FudCB0byB1c2UgdGhlCi0gICAgICAgICBzZWdtZW50IGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzcGFjZS4KLQotICAgICAgICAgRklYTUUgTk9XISAgRUxGIEJGRCBkb2Vzbid0IGFwcGVhciB0byBiZSByZWFkeSB0byBkZWFsIHdpdGgKLSAgICAgICAgIGxvdHMgb2Ygc2VjdGlvbnMuICBJdCBtaWdodCBiZSBhIHByb2JsZW0gaW4gdGhlIFBBIEVMRgotICAgICAgICAgY29kZSwgSSBkbyBub3Qga25vdyB5ZXQuICBGb3Igbm93IGF2b2lkIGNyZWF0aW5nIGFueXRoaW5nCi0gICAgICAgICBidXQgdGhlICJzdGFuZGFyZCIgc2VjdGlvbnMgZm9yIEVMRi4gICovCi0gICAgICBpZiAoY3JlYXRlX25ldykKLQlzZWN0aW9uID0gc3Vic2VnX2ZvcmNlX25ldyAoc3NfbmFtZSwgMCk7Ci0gICAgICBlbHNlIGlmIChzc2QpCi0Jc2VjdGlvbiA9IHNzZC0+c3NkX3NlZzsKLSAgICAgIGVsc2UgaWYgKGFsaWFzKQotCXNlY3Rpb24gPSBzdWJzZWdfbmV3IChhbGlhcywgMCk7Ci0gICAgICBlbHNlIGlmICghYWxpYXMgJiYgVVNFX0FMSUFTRVMpCi0JewotCSAgYXNfd2FybiAoXygiSWdub3Jpbmcgc3Vic3BhY2UgZGVjbCBkdWUgdG8gRUxGIEJGRCBidWdzLiIpKTsKLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXNlY3Rpb24gPSBzdWJzZWdfbmV3IChzc19uYW1lLCAwKTsKLQotICAgICAgaWYgKHplcm8pCi0Jc2VnX2luZm8gKHNlY3Rpb24pLT5ic3MgPSAxOwotCi0gICAgICAvKiBOb3cgc2V0IHRoZSBmbGFncy4gICovCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjdGlvbiwgYXBwbGljYWJsZSk7Ci0KLSAgICAgIC8qIFJlY29yZCBhbnkgYWxpZ25tZW50IHJlcXVlc3QgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICByZWNvcmRfYWxpZ25tZW50IChzZWN0aW9uLCBsb2cyIChhbGlnbm1lbnQpKTsKLQotICAgICAgLyogU2V0IHRoZSBzdGFydGluZyBvZmZzZXQgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fdm1hIChzdGRvdXRwdXQsIHNlY3Rpb24sCi0JCQkgICBwYV9zdWJzcGFjZV9zdGFydCAoc3BhY2UsIHF1YWRyYW50KSk7Ci0KLSAgICAgIC8qIE5vdyB0aGF0IGFsbCB0aGUgZmxhZ3MgYXJlIHNldCwgdXBkYXRlIGFuIGV4aXN0aW5nIHN1YnNwYWNlLAotICAgICAgICAgb3IgY3JlYXRlIGEgbmV3IG9uZS4gICovCi0gICAgICBpZiAoc3NkKQotCi0JY3VycmVudF9zdWJzcGFjZSA9IHVwZGF0ZV9zdWJzcGFjZSAoc3BhY2UsIHNzX25hbWUsIGxvYWRhYmxlLAotCQkJCQkgICAgY29kZV9vbmx5LCBjb21tb24sIGR1cF9jb21tb24sCi0JCQkJCSAgICBzb3J0LCB6ZXJvLCBhY2Nlc3MsIHNwYWNlX2luZGV4LAotCQkJCQkgICAgYWxpZ25tZW50LCBxdWFkcmFudCwKLQkJCQkJICAgIHNlY3Rpb24pOwotICAgICAgZWxzZQotCWN1cnJlbnRfc3Vic3BhY2UgPSBjcmVhdGVfbmV3X3N1YnNwYWNlIChzcGFjZSwgc3NfbmFtZSwgbG9hZGFibGUsCi0JCQkJCQljb2RlX29ubHksIGNvbW1vbiwKLQkJCQkJCWR1cF9jb21tb24sIHplcm8sIHNvcnQsCi0JCQkJCQlhY2Nlc3MsIHNwYWNlX2luZGV4LAotCQkJCQkgICAgICBhbGlnbm1lbnQsIHF1YWRyYW50LCBzZWN0aW9uKTsKLQotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIGN1cnJlbnRfc3Vic3BhY2UtPnNzZF9zZWcgPSBzZWN0aW9uOwotICAgICAgc3Vic2VnX3NldCAoY3VycmVudF9zdWJzcGFjZS0+c3NkX3NlZywgY3VycmVudF9zdWJzcGFjZS0+c3NkX3N1YnNlZyk7Ci0gICAgfQotICBTVUJTUEFDRV9ERUZJTkVEIChjdXJyZW50X3N1YnNwYWNlKSA9IDE7Ci19Ci0KLQotLyogQ3JlYXRlIGRlZmF1bHQgc3BhY2UgYW5kIHN1YnNwYWNlIGRpY3Rpb25hcmllcy4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9zcGFjZXNfYmVnaW4gKCkKLXsKLSAgaW50IGk7Ci0KLSAgc3BhY2VfZGljdF9yb290ID0gTlVMTDsKLSAgc3BhY2VfZGljdF9sYXN0ID0gTlVMTDsKLQotICBpID0gMDsKLSAgd2hpbGUgKHBhX2RlZl9zcGFjZXNbaV0ubmFtZSkKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lOwotCi0gICAgICAvKiBQaWNrIHRoZSByaWdodCBuYW1lIHRvIHVzZSBmb3IgdGhlIG5ldyBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChwYV9kZWZfc3BhY2VzW2ldLmFsaWFzICYmIFVTRV9BTElBU0VTKQotCW5hbWUgPSBwYV9kZWZfc3BhY2VzW2ldLmFsaWFzOwotICAgICAgZWxzZQotCW5hbWUgPSBwYV9kZWZfc3BhY2VzW2ldLm5hbWU7Ci0KLSAgICAgIHBhX2RlZl9zcGFjZXNbaV0uc2VnbWVudCA9IHN1YnNlZ19uZXcgKG5hbWUsIDApOwotICAgICAgY3JlYXRlX25ld19zcGFjZSAocGFfZGVmX3NwYWNlc1tpXS5uYW1lLCBwYV9kZWZfc3BhY2VzW2ldLnNwbnVtLAotCQkJcGFfZGVmX3NwYWNlc1tpXS5sb2FkYWJsZSwgcGFfZGVmX3NwYWNlc1tpXS5kZWZpbmVkLAotCQkJcGFfZGVmX3NwYWNlc1tpXS5wcml2YXRlLCBwYV9kZWZfc3BhY2VzW2ldLnNvcnQsCi0JCQlwYV9kZWZfc3BhY2VzW2ldLnNlZ21lbnQsIDApOwotICAgICAgaSsrOwotICAgIH0KLQotICBpID0gMDsKLSAgd2hpbGUgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSkKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgaW50IGFwcGxpY2FibGUsIHN1YnNlZ21lbnQ7Ci0gICAgICBhc2VjdGlvbiAqc2VnbWVudCA9IE5VTEw7Ci0gICAgICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlOwotCi0gICAgICAvKiBQaWNrIHRoZSByaWdodCBuYW1lIGZvciB0aGUgbmV3IHNlY3Rpb24gYW5kIHBpY2sgdGhlIHJpZ2h0Ci0gICAgICAgICBzdWJzZWdtZW50IG51bWJlci4gICovCi0gICAgICBpZiAocGFfZGVmX3N1YnNwYWNlc1tpXS5hbGlhcyAmJiBVU0VfQUxJQVNFUykKLQl7Ci0JICBuYW1lID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5hbGlhczsKLQkgIHN1YnNlZ21lbnQgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLnN1YnNlZ21lbnQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5hbWUgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWU7Ci0JICBzdWJzZWdtZW50ID0gMDsKLQl9Ci0KLSAgICAgIC8qIENyZWF0ZSB0aGUgbmV3IHNlY3Rpb24uICAqLwotICAgICAgc2VnbWVudCA9IHN1YnNlZ19uZXcgKG5hbWUsIHN1YnNlZ21lbnQpOwotCi0KLSAgICAgIC8qIEZvciBTT00gd2Ugd2FudCB0byByZXBsYWNlIHRoZSBzdGFuZGFyZCAudGV4dCwgLmRhdGEsIGFuZCAuYnNzCi0gICAgICAgICBzZWN0aW9ucyB3aXRoIG91ciBvd24uICAgV2UgYWxzbyB3YW50IHRvIHNldCBCRkQgZmxhZ3MgZm9yCi0JIGFsbCB0aGUgYnVpbHQtaW4gc3Vic3BhY2VzLiAgKi8KLSAgICAgIGlmICghc3RyY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsICIkQ09ERSQiKSAmJiAhVVNFX0FMSUFTRVMpCi0JewotCSAgdGV4dF9zZWN0aW9uID0gc2VnbWVudDsKLQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZ21lbnQsCi0JCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgICAgIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUKLQkJCQkJICAgICAgIHwgU0VDX1JFQURPTkxZCi0JCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsICIkREFUQSQiKSAmJiAhVVNFX0FMSUFTRVMpCi0JewotCSAgZGF0YV9zZWN0aW9uID0gc2VnbWVudDsKLQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZ21lbnQsCi0JCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgICAgIHwgU0VDX1JFTE9DCi0JCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLQotCi0JfQotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lLCAiJEJTUyQiKSAmJiAhVVNFX0FMSUFTRVMpCi0JewotCSAgYnNzX3NlY3Rpb24gPSBzZWdtZW50OwotCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnbWVudCwKLQkJCQkgYXBwbGljYWJsZSAmIFNFQ19BTExPQyk7Ci0JfQotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lLCAiJExJVCQiKSAmJiAhVVNFX0FMSUFTRVMpCi0JewotCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnbWVudCwKLQkJCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRAotCQkJCQkgICAgICAgfCBTRUNfUkVMT0MKLQkJCQkJICAgICAgIHwgU0VDX1JFQURPTkxZCi0JCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsICIkTUlMTElDT0RFJCIpCi0JICAgICAgICYmICFVU0VfQUxJQVNFUykKLQl7Ci0JICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWdtZW50LAotCQkJCSBhcHBsaWNhYmxlICYgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgICAgICB8IFNFQ19SRUxPQwotCQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkKLQkJCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUykpOwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSwgIiRVTldJTkQkIikgJiYgIVVTRV9BTElBU0VTKQotCXsKLQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZ21lbnQsCi0JCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgICAgIHwgU0VDX1JFTE9DCi0JCQkJCSAgICAgICB8IFNFQ19SRUFET05MWQotCQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0JfQotCi0gICAgICAvKiBGaW5kIHRoZSBzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWJzcGFjZS4gICovCi0gICAgICBzcGFjZSA9IHBhX3NlZ21lbnRfdG9fc3BhY2UgKHBhX2RlZl9zcGFjZXNbcGFfZGVmX3N1YnNwYWNlc1tpXS4KLQkJCQkJCSBkZWZfc3BhY2VfaW5kZXhdLnNlZ21lbnQpOwotICAgICAgaWYgKHNwYWNlID09IE5VTEwpCi0JewotCSAgYXNfZmF0YWwgKF8oIkludGVybmFsIGVycm9yOiBVbmFibGUgdG8gZmluZCBjb250YWluaW5nIHNwYWNlIGZvciAlcy4iKSwKLQkJICAgIHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSk7Ci0JfQotCi0gICAgICBjcmVhdGVfbmV3X3N1YnNwYWNlIChzcGFjZSwgbmFtZSwKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0ubG9hZGFibGUsCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLmNvZGVfb25seSwKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0uY29tbW9uLAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5kdXBfY29tbW9uLAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS56ZXJvLAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5zb3J0LAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5hY2Nlc3MsCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLnNwYWNlX2luZGV4LAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5hbGlnbm1lbnQsCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLnF1YWRyYW50LAotCQkJICAgc2VnbWVudCk7Ci0gICAgICBpKys7Ci0gICAgfQotfQotCi0KLQotLyogQ3JlYXRlIGEgbmV3IHNwYWNlIE5BTUUsIHdpdGggdGhlIGFwcHJvcHJpYXRlIGZsYWdzIGFzIGRlZmluZWQKLSAgIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiAgKi8KLQotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqCi1jcmVhdGVfbmV3X3NwYWNlIChuYW1lLCBzcG51bSwgbG9hZGFibGUsIGRlZmluZWQsIHByaXZhdGUsCi0JCSAgc29ydCwgc2VnLCB1c2VyX2RlZmluZWQpCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCBzcG51bTsKLSAgICAgaW50IGxvYWRhYmxlOwotICAgICBpbnQgZGVmaW5lZDsKLSAgICAgaW50IHByaXZhdGU7Ci0gICAgIGludCBzb3J0OwotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICBpbnQgdXNlcl9kZWZpbmVkOwotewotICBzZF9jaGFpbl9zdHJ1Y3QgKmNoYWluX2VudHJ5OwotCi0gIGNoYWluX2VudHJ5ID0gKHNkX2NoYWluX3N0cnVjdCAqKSB4bWFsbG9jIChzaXplb2YgKHNkX2NoYWluX3N0cnVjdCkpOwotICBpZiAoIWNoYWluX2VudHJ5KQotICAgIGFzX2ZhdGFsIChfKCJPdXQgb2YgbWVtb3J5OiBjb3VsZCBub3QgYWxsb2NhdGUgbmV3IHNwYWNlIGNoYWluIGVudHJ5OiAlc1xuIiksCi0JICAgICAgbmFtZSk7Ci0KLSAgU1BBQ0VfTkFNRSAoY2hhaW5fZW50cnkpID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotICBzdHJjcHkgKFNQQUNFX05BTUUgKGNoYWluX2VudHJ5KSwgbmFtZSk7Ci0gIFNQQUNFX0RFRklORUQgKGNoYWluX2VudHJ5KSA9IGRlZmluZWQ7Ci0gIFNQQUNFX1VTRVJfREVGSU5FRCAoY2hhaW5fZW50cnkpID0gdXNlcl9kZWZpbmVkOwotICBTUEFDRV9TUE5VTSAoY2hhaW5fZW50cnkpID0gc3BudW07Ci0KLSAgY2hhaW5fZW50cnktPnNkX3NlZyA9IHNlZzsKLSAgY2hhaW5fZW50cnktPnNkX2xhc3Rfc3Vic2VnID0gLTE7Ci0gIGNoYWluX2VudHJ5LT5zZF9zdWJzcGFjZXMgPSBOVUxMOwotICBjaGFpbl9lbnRyeS0+c2RfbmV4dCA9IE5VTEw7Ci0KLSAgLyogRmluZCBzcG90IGZvciB0aGUgbmV3IHNwYWNlIGJhc2VkIG9uIGl0cyBzb3J0IGtleS4gICovCi0gIGlmICghc3BhY2VfZGljdF9sYXN0KQotICAgIHNwYWNlX2RpY3RfbGFzdCA9IGNoYWluX2VudHJ5OwotCi0gIGlmIChzcGFjZV9kaWN0X3Jvb3QgPT0gTlVMTCkKLSAgICBzcGFjZV9kaWN0X3Jvb3QgPSBjaGFpbl9lbnRyeTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNkX2NoYWluX3N0cnVjdCAqY2hhaW5fcG9pbnRlcjsKLSAgICAgIHNkX2NoYWluX3N0cnVjdCAqcHJldl9jaGFpbl9wb2ludGVyOwotCi0gICAgICBjaGFpbl9wb2ludGVyID0gc3BhY2VfZGljdF9yb290OwotICAgICAgcHJldl9jaGFpbl9wb2ludGVyID0gTlVMTDsKLQotICAgICAgd2hpbGUgKGNoYWluX3BvaW50ZXIpCi0JewotCSAgcHJldl9jaGFpbl9wb2ludGVyID0gY2hhaW5fcG9pbnRlcjsKLQkgIGNoYWluX3BvaW50ZXIgPSBjaGFpbl9wb2ludGVyLT5zZF9uZXh0OwotCX0KLQotICAgICAgLyogQXQgdGhpcyBwb2ludCB3ZSd2ZSBmb3VuZCB0aGUgY29ycmVjdCBwbGFjZSB0byBhZGQgdGhlIG5ldwotICAgICAgICAgZW50cnkuICBTbyBhZGQgaXQgYW5kIHVwZGF0ZSB0aGUgbGlua2VkIGxpc3RzIGFzIGFwcHJvcHJpYXRlLiAgKi8KLSAgICAgIGlmIChwcmV2X2NoYWluX3BvaW50ZXIpCi0JewotCSAgY2hhaW5fZW50cnktPnNkX25leHQgPSBjaGFpbl9wb2ludGVyOwotCSAgcHJldl9jaGFpbl9wb2ludGVyLT5zZF9uZXh0ID0gY2hhaW5fZW50cnk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNwYWNlX2RpY3Rfcm9vdCA9IGNoYWluX2VudHJ5OwotCSAgY2hhaW5fZW50cnktPnNkX25leHQgPSBjaGFpbl9wb2ludGVyOwotCX0KLQotICAgICAgaWYgKGNoYWluX2VudHJ5LT5zZF9uZXh0ID09IE5VTEwpCi0Jc3BhY2VfZGljdF9sYXN0ID0gY2hhaW5fZW50cnk7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgaGVyZSB0byBjYXRjaCBwcmVkZWZpbmVkIHNwYWNlcyB3aGljaCBkbyBub3QgZ2V0Ci0gICAgIG1vZGlmaWVkIGJ5IHRoZSB1c2VyJ3MgaW5wdXQuICBBbm90aGVyIGNhbGwgaXMgZm91bmQgYXQKLSAgICAgdGhlIGJvdHRvbSBvZiBwYV9wYXJzZV9zcGFjZV9zdG10IHRvIGhhbmRsZSBjYXNlcyB3aGVyZQotICAgICB0aGUgdXNlciBtb2RpZmllcyBhIHByZWRlZmluZWQgc3BhY2UuICAqLwotI2lmZGVmIG9ial9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzCi0gIG9ial9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzIChzZWcsIGRlZmluZWQsIHByaXZhdGUsIHNvcnQsIHNwbnVtKTsKLSNlbmRpZgotCi0gIHJldHVybiBjaGFpbl9lbnRyeTsKLX0KLQotLyogQ3JlYXRlIGEgbmV3IHN1YnNwYWNlIE5BTUUsIHdpdGggdGhlIGFwcHJvcHJpYXRlIGZsYWdzIGFzIGRlZmluZWQKLSAgIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgotCi0gICBBZGQgdGhlIG5ldyBzdWJzcGFjZSB0byB0aGUgc3Vic3BhY2UgZGljdGlvbmFyeSBjaGFpbiBpbiBudW1lcmljYWwKLSAgIG9yZGVyIGFzIGRlZmluZWQgYnkgdGhlIFNPUlQgZW50cmllcy4gICovCi0KLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICoKLWNyZWF0ZV9uZXdfc3Vic3BhY2UgKHNwYWNlLCBuYW1lLCBsb2FkYWJsZSwgY29kZV9vbmx5LCBjb21tb24sCi0JCSAgICAgZHVwX2NvbW1vbiwgaXNfemVybywgc29ydCwgYWNjZXNzLCBzcGFjZV9pbmRleCwKLQkJICAgICBhbGlnbm1lbnQsIHF1YWRyYW50LCBzZWcpCi0gICAgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCBsb2FkYWJsZSwgY29kZV9vbmx5LCBjb21tb24sIGR1cF9jb21tb24sIGlzX3plcm87Ci0gICAgIGludCBzb3J0OwotICAgICBpbnQgYWNjZXNzOwotICAgICBpbnQgc3BhY2VfaW5kZXg7Ci0gICAgIGludCBhbGlnbm1lbnQ7Ci0gICAgIGludCBxdWFkcmFudDsKLSAgICAgYXNlY3Rpb24gKnNlZzsKLXsKLSAgc3NkX2NoYWluX3N0cnVjdCAqY2hhaW5fZW50cnk7Ci0KLSAgY2hhaW5fZW50cnkgPSAoc3NkX2NoYWluX3N0cnVjdCAqKSB4bWFsbG9jIChzaXplb2YgKHNzZF9jaGFpbl9zdHJ1Y3QpKTsKLSAgaWYgKCFjaGFpbl9lbnRyeSkKLSAgICBhc19mYXRhbCAoXygiT3V0IG9mIG1lbW9yeTogY291bGQgbm90IGFsbG9jYXRlIG5ldyBzdWJzcGFjZSBjaGFpbiBlbnRyeTogJXNcbiIpLCBuYW1lKTsKLQotICBTVUJTUEFDRV9OQU1FIChjaGFpbl9lbnRyeSkgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0gIHN0cmNweSAoU1VCU1BBQ0VfTkFNRSAoY2hhaW5fZW50cnkpLCBuYW1lKTsKLQotICAvKiBJbml0aWFsaXplIHN1YnNwYWNlX2RlZmluZWQuICBXaGVuIHdlIGhpdCBhIC5zdWJzcGFjZSBkaXJlY3RpdmUKLSAgICAgd2UnbGwgc2V0IGl0IHRvIDEgd2hpY2ggImxvY2tzLWluIiB0aGUgc3Vic3BhY2UgYXR0cmlidXRlcy4gICovCi0gIFNVQlNQQUNFX0RFRklORUQgKGNoYWluX2VudHJ5KSA9IDA7Ci0KLSAgY2hhaW5fZW50cnktPnNzZF9zdWJzZWcgPSBVU0VfQUxJQVNFUyA/IHBhX25leHRfc3Vic2VnIChzcGFjZSkgOiAwOwotICBjaGFpbl9lbnRyeS0+c3NkX3NlZyA9IHNlZzsKLSAgY2hhaW5fZW50cnktPnNzZF9uZXh0ID0gTlVMTDsKLQotICAvKiBGaW5kIHNwb3QgZm9yIHRoZSBuZXcgc3Vic3BhY2UgYmFzZWQgb24gaXRzIHNvcnQga2V5LiAgKi8KLSAgaWYgKHNwYWNlLT5zZF9zdWJzcGFjZXMgPT0gTlVMTCkKLSAgICBzcGFjZS0+c2Rfc3Vic3BhY2VzID0gY2hhaW5fZW50cnk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzc2RfY2hhaW5fc3RydWN0ICpjaGFpbl9wb2ludGVyOwotICAgICAgc3NkX2NoYWluX3N0cnVjdCAqcHJldl9jaGFpbl9wb2ludGVyOwotCi0gICAgICBjaGFpbl9wb2ludGVyID0gc3BhY2UtPnNkX3N1YnNwYWNlczsKLSAgICAgIHByZXZfY2hhaW5fcG9pbnRlciA9IE5VTEw7Ci0KLSAgICAgIHdoaWxlIChjaGFpbl9wb2ludGVyKQotCXsKLQkgIHByZXZfY2hhaW5fcG9pbnRlciA9IGNoYWluX3BvaW50ZXI7Ci0JICBjaGFpbl9wb2ludGVyID0gY2hhaW5fcG9pbnRlci0+c3NkX25leHQ7Ci0JfQotCi0gICAgICAvKiBOb3cgd2UgaGF2ZSBzb21ld2hlcmUgdG8gcHV0IHRoZSBuZXcgZW50cnkuICBJbnNlcnQgaXQgYW5kIHVwZGF0ZQotICAgICAgICAgdGhlIGxpbmtzLiAgKi8KLSAgICAgIGlmIChwcmV2X2NoYWluX3BvaW50ZXIpCi0JewotCSAgY2hhaW5fZW50cnktPnNzZF9uZXh0ID0gY2hhaW5fcG9pbnRlcjsKLQkgIHByZXZfY2hhaW5fcG9pbnRlci0+c3NkX25leHQgPSBjaGFpbl9lbnRyeTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3BhY2UtPnNkX3N1YnNwYWNlcyA9IGNoYWluX2VudHJ5OwotCSAgY2hhaW5fZW50cnktPnNzZF9uZXh0ID0gY2hhaW5fcG9pbnRlcjsKLQl9Ci0gICAgfQotCi0jaWZkZWYgb2JqX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMKLSAgb2JqX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMgKHNlZywgc3BhY2UtPnNkX3NlZywgYWNjZXNzLAotCQkJCSBzb3J0LCBxdWFkcmFudCk7Ci0jZW5kaWYKLQotICByZXR1cm4gY2hhaW5fZW50cnk7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBzdWJzcGFjZSBiYXNlZCB1cG9uIHRoZQotICAgdmFyaW91cyBhcmd1bWVudHMuICAgUmV0dXJuIHRoZSBtb2RpZmllZCBzdWJzcGFjZSBjaGFpbiBlbnRyeS4gICovCi0KLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICoKLXVwZGF0ZV9zdWJzcGFjZSAoc3BhY2UsIG5hbWUsIGxvYWRhYmxlLCBjb2RlX29ubHksIGNvbW1vbiwgZHVwX2NvbW1vbiwgc29ydCwKLQkJIHplcm8sIGFjY2Vzcywgc3BhY2VfaW5kZXgsIGFsaWdubWVudCwgcXVhZHJhbnQsIHNlY3Rpb24pCi0gICAgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCBsb2FkYWJsZTsKLSAgICAgaW50IGNvZGVfb25seTsKLSAgICAgaW50IGNvbW1vbjsKLSAgICAgaW50IGR1cF9jb21tb247Ci0gICAgIGludCB6ZXJvOwotICAgICBpbnQgc29ydDsKLSAgICAgaW50IGFjY2VzczsKLSAgICAgaW50IHNwYWNlX2luZGV4OwotICAgICBpbnQgYWxpZ25tZW50OwotICAgICBpbnQgcXVhZHJhbnQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBzc2RfY2hhaW5fc3RydWN0ICpjaGFpbl9lbnRyeTsKLQotICBjaGFpbl9lbnRyeSA9IGlzX2RlZmluZWRfc3Vic3BhY2UgKG5hbWUpOwotCi0jaWZkZWYgb2JqX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMKLSAgb2JqX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMgKHNlY3Rpb24sIHNwYWNlLT5zZF9zZWcsIGFjY2VzcywKLQkJCQkgc29ydCwgcXVhZHJhbnQpOwotI2VuZGlmCi0KLSAgcmV0dXJuIGNoYWluX2VudHJ5OwotfQotCi0vKiBSZXR1cm4gdGhlIHNwYWNlIGNoYWluIGVudHJ5IGZvciB0aGUgc3BhY2Ugd2l0aCB0aGUgbmFtZSBOQU1FIG9yCi0gICBOVUxMIGlmIG5vIHN1Y2ggc3BhY2UgZXhpc3RzLiAgKi8KLQotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqCi1pc19kZWZpbmVkX3NwYWNlIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBzZF9jaGFpbl9zdHJ1Y3QgKmNoYWluX3BvaW50ZXI7Ci0KLSAgZm9yIChjaGFpbl9wb2ludGVyID0gc3BhY2VfZGljdF9yb290OwotICAgICAgIGNoYWluX3BvaW50ZXI7Ci0gICAgICAgY2hhaW5fcG9pbnRlciA9IGNoYWluX3BvaW50ZXItPnNkX25leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoU1BBQ0VfTkFNRSAoY2hhaW5fcG9pbnRlciksIG5hbWUpID09IDApCi0JcmV0dXJuIGNoYWluX3BvaW50ZXI7Ci0gICAgfQotCi0gIC8qIE5vIG1hcHBpbmcgZnJvbSBzZWdtZW50IHRvIHNwYWNlIHdhcyBmb3VuZC4gIFJldHVybiBOVUxMLiAgKi8KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEZpbmQgYW5kIHJldHVybiB0aGUgc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBzZWcuICBJZiBubyBtYXBwaW5nCi0gICBmcm9tIHRoZSBnaXZlbiBzZWcgdG8gYSBzcGFjZSBpcyBmb3VuZCwgdGhlbiByZXR1cm4gTlVMTC4KLQotICAgVW5saWtlIHN1YnNwYWNlcywgdGhlIG51bWJlciBvZiBzcGFjZXMgaXMgbm90IGV4cGVjdGVkIHRvIGdyb3cgbXVjaCwKLSAgIHNvIGEgbGluZWFyIGV4aGF1c3RpdmUgc2VhcmNoIGlzIE9LIGhlcmUuICAqLwotCi1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICoKLXBhX3NlZ21lbnRfdG9fc3BhY2UgKHNlZykKLSAgICAgYXNlY3Rpb24gKnNlZzsKLXsKLSAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZV9jaGFpbjsKLQotICAvKiBXYWxrIHRocm91Z2ggZWFjaCBzcGFjZSBsb29raW5nIGZvciB0aGUgY29ycmVjdCBtYXBwaW5nLiAgKi8KLSAgZm9yIChzcGFjZV9jaGFpbiA9IHNwYWNlX2RpY3Rfcm9vdDsKLSAgICAgICBzcGFjZV9jaGFpbjsKLSAgICAgICBzcGFjZV9jaGFpbiA9IHNwYWNlX2NoYWluLT5zZF9uZXh0KQotICAgIHsKLSAgICAgIGlmIChzcGFjZV9jaGFpbi0+c2Rfc2VnID09IHNlZykKLQlyZXR1cm4gc3BhY2VfY2hhaW47Ci0gICAgfQotCi0gIC8qIE1hcHBpbmcgd2FzIG5vdCBmb3VuZC4gIFJldHVybiBOVUxMLiAgKi8KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3BhY2UgY2hhaW4gZW50cnkgZm9yIHRoZSBzdWJzcGFjZSB3aXRoIHRoZSBuYW1lIE5BTUUgb3IKLSAgIE5VTEwgaWYgbm8gc3VjaCBzdWJzcGFjZSBleGlzdHMuCi0KLSAgIFVzZXMgYSBsaW5lYXIgc2VhcmNoIHRocm91Z2ggYWxsIHRoZSBzcGFjZXMgYW5kIHN1YnNwYWNlcywgdGhpcyBtYXkKLSAgIG5vdCBiZSBhcHByb3ByaWF0ZSBpZiB3ZSBldmVyIGJlaW5nIHBsYWNpbmcgZWFjaCBmdW5jdGlvbiBpbiBpdHMKLSAgIG93biBzdWJzcGFjZS4gICovCi0KLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICoKLWlzX2RlZmluZWRfc3Vic3BhY2UgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHNkX2NoYWluX3N0cnVjdCAqc3BhY2VfY2hhaW47Ci0gIHNzZF9jaGFpbl9zdHJ1Y3QgKnN1YnNwYWNlX2NoYWluOwotCi0gIC8qIFdhbGsgdGhyb3VnaCBlYWNoIHNwYWNlLiAgKi8KLSAgZm9yIChzcGFjZV9jaGFpbiA9IHNwYWNlX2RpY3Rfcm9vdDsKLSAgICAgICBzcGFjZV9jaGFpbjsKLSAgICAgICBzcGFjZV9jaGFpbiA9IHNwYWNlX2NoYWluLT5zZF9uZXh0KQotICAgIHsKLSAgICAgIC8qIFdhbGsgdGhyb3VnaCBlYWNoIHN1YnNwYWNlIGxvb2tpbmcgZm9yIGEgbmFtZSB3aGljaCBtYXRjaGVzLiAgKi8KLSAgICAgIGZvciAoc3Vic3BhY2VfY2hhaW4gPSBzcGFjZV9jaGFpbi0+c2Rfc3Vic3BhY2VzOwotCSAgIHN1YnNwYWNlX2NoYWluOwotCSAgIHN1YnNwYWNlX2NoYWluID0gc3Vic3BhY2VfY2hhaW4tPnNzZF9uZXh0KQotCWlmIChzdHJjbXAgKFNVQlNQQUNFX05BTUUgKHN1YnNwYWNlX2NoYWluKSwgbmFtZSkgPT0gMCkKLQkgIHJldHVybiBzdWJzcGFjZV9jaGFpbjsKLSAgICB9Ci0KLSAgLyogU3Vic3BhY2Ugd2Fzbid0IGZvdW5kLiAgUmV0dXJuIE5VTEwuICAqLwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRmluZCBhbmQgcmV0dXJuIHRoZSBzdWJzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHNlZy4gIElmIG5vCi0gICBtYXBwaW5nIGZyb20gdGhlIGdpdmVuIHNlZyB0byBhIHN1YnNwYWNlIGlzIGZvdW5kLCB0aGVuIHJldHVybiBOVUxMLgotCi0gICBJZiB3ZSBldmVyIHB1dCBlYWNoIHByb2NlZHVyZS9mdW5jdGlvbiB3aXRoaW4gaXRzIG93biBzdWJzcGFjZQotICAgKHRvIG1ha2UgbGlmZSBlYXNpZXIgb24gdGhlIGNvbXBpbGVyIGFuZCBsaW5rZXIpLCB0aGVuIHRoaXMgd2lsbCBoYXZlCi0gICB0byBiZWNvbWUgbW9yZSBlZmZpY2llbnQuICAqLwotCi1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqCi1wYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIChzZWcsIHN1YnNlZykKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgc3Vic2VnVCBzdWJzZWc7Ci17Ci0gIHNkX2NoYWluX3N0cnVjdCAqc3BhY2VfY2hhaW47Ci0gIHNzZF9jaGFpbl9zdHJ1Y3QgKnN1YnNwYWNlX2NoYWluOwotCi0gIC8qIFdhbGsgdGhyb3VnaCBlYWNoIHNwYWNlLiAgKi8KLSAgZm9yIChzcGFjZV9jaGFpbiA9IHNwYWNlX2RpY3Rfcm9vdDsKLSAgICAgICBzcGFjZV9jaGFpbjsKLSAgICAgICBzcGFjZV9jaGFpbiA9IHNwYWNlX2NoYWluLT5zZF9uZXh0KQotICAgIHsKLSAgICAgIGlmIChzcGFjZV9jaGFpbi0+c2Rfc2VnID09IHNlZykKLQl7Ci0JICAvKiBXYWxrIHRocm91Z2ggZWFjaCBzdWJzcGFjZSB3aXRoaW4gZWFjaCBzcGFjZSBsb29raW5nIGZvcgotCSAgICAgdGhlIGNvcnJlY3QgbWFwcGluZy4gICovCi0JICBmb3IgKHN1YnNwYWNlX2NoYWluID0gc3BhY2VfY2hhaW4tPnNkX3N1YnNwYWNlczsKLQkgICAgICAgc3Vic3BhY2VfY2hhaW47Ci0JICAgICAgIHN1YnNwYWNlX2NoYWluID0gc3Vic3BhY2VfY2hhaW4tPnNzZF9uZXh0KQotCSAgICBpZiAoc3Vic3BhY2VfY2hhaW4tPnNzZF9zdWJzZWcgPT0gKGludCkgc3Vic2VnKQotCSAgICAgIHJldHVybiBzdWJzcGFjZV9jaGFpbjsKLQl9Ci0gICAgfQotCi0gIC8qIE5vIG1hcHBpbmcgZnJvbSBzdWJzZWdtZW50IHRvIHN1YnNwYWNlIGZvdW5kLiAgUmV0dXJuIE5VTEwuICAqLwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogR2l2ZW4gYSBudW1iZXIsIHRyeSBhbmQgZmluZCBhIHNwYWNlIHdpdGggdGhlIG5hbWUgbnVtYmVyLgotCi0gICBSZXR1cm4gYSBwb2ludGVyIHRvIGEgc3BhY2UgZGljdGlvbmFyeSBjaGFpbiBlbnRyeSBmb3IgdGhlIHNwYWNlCi0gICB0aGF0IHdhcyBmb3VuZCBvciBOVUxMIG9uIGZhaWx1cmUuICAqLwotCi1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICoKLXBhX2ZpbmRfc3BhY2VfYnlfbnVtYmVyIChudW1iZXIpCi0gICAgIGludCBudW1iZXI7Ci17Ci0gIHNkX2NoYWluX3N0cnVjdCAqc3BhY2VfY2hhaW47Ci0KLSAgZm9yIChzcGFjZV9jaGFpbiA9IHNwYWNlX2RpY3Rfcm9vdDsKLSAgICAgICBzcGFjZV9jaGFpbjsKLSAgICAgICBzcGFjZV9jaGFpbiA9IHNwYWNlX2NoYWluLT5zZF9uZXh0KQotICAgIHsKLSAgICAgIGlmIChTUEFDRV9TUE5VTSAoc3BhY2VfY2hhaW4pID09ICh1bnNpZ25lZCBpbnQpIG51bWJlcikKLQlyZXR1cm4gc3BhY2VfY2hhaW47Ci0gICAgfQotCi0gIC8qIE5vIGFwcHJvcHJpYXRlIHNwYWNlIGZvdW5kLiAgUmV0dXJuIE5VTEwuICAqLwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogUmV0dXJuIHRoZSBzdGFydGluZyBhZGRyZXNzIGZvciB0aGUgZ2l2ZW4gc3Vic3BhY2UuICBJZiB0aGUgc3RhcnRpbmcKLSAgIGFkZHJlc3MgaXMgdW5rbm93biB0aGVuIHJldHVybiB6ZXJvLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotcGFfc3Vic3BhY2Vfc3RhcnQgKHNwYWNlLCBxdWFkcmFudCkKLSAgICAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZTsKLSAgICAgaW50IHF1YWRyYW50OwotewotI2lmZGVmIE9CSl9TT00KLSAgLyogRklYTUUuICBBc3N1bWVzIGV2ZXJ5b25lIHB1dHMgcmVhZC93cml0ZSBkYXRhIGF0IDB4NDAwMDAwMCwgdGhpcwotICAgICBpcyBub3QgY29ycmVjdCBmb3IgdGhlIFBBIE9TRjEgcG9ydC4gICovCi0gIGlmICgoc3RyY21wIChTUEFDRV9OQU1FIChzcGFjZSksICIkUFJJVkFURSQiKSA9PSAwKSAmJiBxdWFkcmFudCA9PSAxKQotICAgIHJldHVybiAweDQwMDAwMDAwOwotICBlbHNlIGlmIChzcGFjZS0+c2Rfc2VnID09IGRhdGFfc2VjdGlvbiAmJiBxdWFkcmFudCA9PSAxKQotICAgIHJldHVybiAweDQwMDAwMDAwOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEZJWE1FLiAgTmVlZHMgZG9jdW1lbnRhdGlvbi4gICovCi1zdGF0aWMgaW50Ci1wYV9uZXh0X3N1YnNlZyAoc3BhY2UpCi0gICAgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Ci17Ci0KLSAgc3BhY2UtPnNkX2xhc3Rfc3Vic2VnKys7Ci0gIHJldHVybiBzcGFjZS0+c2RfbGFzdF9zdWJzZWc7Ci19Ci0KLS8qIEhlbHBlciBmdW5jdGlvbiBmb3IgcGFfc3RyaW5nZXIuICBVc2VkIHRvIGZpbmQgdGhlIGVuZCBvZgotICAgYSBzdHJpbmcuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wYV9zdHJpbmdlcl9hdXggKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIHVuc2lnbmVkIGludCBjID0gKnMgJiBDSEFSX01BU0s7Ci0KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0KLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICdcIic6Ci0gICAgICBjID0gTk9UX0FfQ0hBUjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBjOwotfQotCi0vKiBIYW5kbGUgYSAuU1RSSU5HIHR5cGUgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3N0cmluZ2VyIChhcHBlbmRfemVybykKLSAgICAgaW50IGFwcGVuZF96ZXJvOwotewotICBjaGFyICpzLCBudW1fYnVmWzRdOwotICB1bnNpZ25lZCBpbnQgYzsKLSAgaW50IGk7Ci0KLSAgLyogUHJlcHJvY2VzcyB0aGUgc3RyaW5nIHRvIGhhbmRsZSBQQS1zcGVjaWZpYyBlc2NhcGUgc2VxdWVuY2VzLgotICAgICBGb3IgZXhhbXBsZSwgXHhERCB3aGVyZSBERCBpcyBhIGhleGlkZWNpbWFsIG51bWJlciBzaG91bGQgYmUKLSAgICAgY2hhbmdlZCB0byBcT09PIHdoZXJlIE9PTyBpcyBhbiBvY3RhbCBudW1iZXIuICAqLwotCi0gIC8qIFNraXAgdGhlIG9wZW5pbmcgcXVvdGUuICAqLwotICBzID0gaW5wdXRfbGluZV9wb2ludGVyICsgMTsKLQotICB3aGlsZSAoaXNfYV9jaGFyIChjID0gcGFfc3RyaW5nZXJfYXV4IChzKyspKSkKLSAgICB7Ci0gICAgICBpZiAoYyA9PSAnXFwnKQotCXsKLQkgIGMgPSAqczsKLQkgIHN3aXRjaCAoYykKLQkgICAgewotCSAgICAgIC8qIEhhbmRsZSBceDxudW0+LiAgKi8KLQkgICAgY2FzZSAneCc6Ci0JICAgICAgewotCQl1bnNpZ25lZCBpbnQgbnVtYmVyOwotCQlpbnQgbnVtX2RpZ2l0OwotCQljaGFyIGRnOwotCQljaGFyICpzX3N0YXJ0ID0gczsKLQotCQkvKiBHZXQgcGFzIHRoZSAneCcuICAqLwotCQlzKys7Ci0JCWZvciAobnVtX2RpZ2l0ID0gMCwgbnVtYmVyID0gMCwgZGcgPSAqczsKLQkJICAgICBudW1fZGlnaXQgPCAyCi0JCSAgICAgJiYgKGlzZGlnaXQgKGRnKSB8fCAoZGcgPj0gJ2EnICYmIGRnIDw9ICdmJykKLQkJCSB8fCAoZGcgPj0gJ0EnICYmIGRnIDw9ICdGJykpOwotCQkgICAgIG51bV9kaWdpdCsrKQotCQkgIHsKLQkJICAgIGlmIChpc2RpZ2l0IChkZykpCi0JCSAgICAgIG51bWJlciA9IG51bWJlciAqIDE2ICsgZGcgLSAnMCc7Ci0JCSAgICBlbHNlIGlmIChkZyA+PSAnYScgJiYgZGcgPD0gJ2YnKQotCQkgICAgICBudW1iZXIgPSBudW1iZXIgKiAxNiArIGRnIC0gJ2EnICsgMTA7Ci0JCSAgICBlbHNlCi0JCSAgICAgIG51bWJlciA9IG51bWJlciAqIDE2ICsgZGcgLSAnQScgKyAxMDsKLQotCQkgICAgcysrOwotCQkgICAgZGcgPSAqczsKLQkJICB9Ci0JCWlmIChudW1fZGlnaXQgPiAwKQotCQkgIHsKLQkJICAgIHN3aXRjaCAobnVtX2RpZ2l0KQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgMToKLQkJCXNwcmludGYgKG51bV9idWYsICIlMDJvIiwgbnVtYmVyKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIDI6Ci0JCQlzcHJpbnRmIChudW1fYnVmLCAiJTAzbyIsIG51bWJlcik7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgZm9yIChpID0gMDsgaSA8PSBudW1fZGlnaXQ7IGkrKykKLQkJICAgICAgc19zdGFydFtpXSA9IG51bV9idWZbaV07Ci0JCSAgfQotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIC8qIFRoaXMgbWlnaHQgYmUgYSAiXCIiLCBza2lwIG92ZXIgdGhlIGVzY2FwZWQgY2hhci4gICovCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcysrOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgc3RyaW5nZXIgKGFwcGVuZF96ZXJvKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5WRVJTSU9OIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV92ZXJzaW9uICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIG9ial92ZXJzaW9uICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLSNpZmRlZiBPQkpfU09NCi0KLS8qIEhhbmRsZSBhIC5DT01QSUxFUiBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY29tcGlsZXIgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgb2JqX3NvbV9jb21waWxlciAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0jZW5kaWYKLQotLyogSGFuZGxlIGEgLkNPUFlSSUdIVCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY29weXJpZ2h0ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIG9ial9jb3B5cmlnaHQgKDApOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogSnVzdCBsaWtlIGEgbm9ybWFsIGNvbnMsIGJ1dCB3aGVuIGZpbmlzaGVkIHdlIGhhdmUgdG8gdW5kZWZpbmUKLSAgIHRoZSBsYXRlc3Qgc3BhY2UgbGFiZWwuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY29ucyAobmJ5dGVzKQotICAgICBpbnQgbmJ5dGVzOwotewotICBjb25zIChuYnl0ZXMpOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogU3dpdGNoIHRvIHRoZSBkYXRhIHNwYWNlLiAgQXMgdXN1YWwgZGVsZXRlIG91ciBsYWJlbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9kYXRhICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGN1cnJlbnRfc3BhY2UgPSBpc19kZWZpbmVkX3NwYWNlICgiJFBSSVZBVEUkIik7Ci0gIGN1cnJlbnRfc3Vic3BhY2UKLSAgICA9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKGN1cnJlbnRfc3BhY2UtPnNkX3NlZywgMCk7Ci0gIHNfZGF0YSAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBMaWtlIGZsb2F0X2NvbnMsIGJ1dCB3ZSBuZWVkIHRvIHVuZGVmaW5lIG91ciBsYWJlbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9mbG9hdF9jb25zIChmbG9hdF90eXBlKQotICAgICBpbnQgZmxvYXRfdHlwZTsKLXsKLSAgZmxvYXRfY29ucyAoZmxvYXRfdHlwZSk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBMaWtlIHNfZmlsbCwgYnV0IGRlbGV0ZSBvdXIgbGFiZWwgd2hlbiBmaW5pc2hlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9maWxsICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotCi0gIHNfZmlsbCAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBMaWtlIGxjb21tLCBidXQgZGVsZXRlIG91ciBsYWJlbCB3aGVuIGZpbmlzaGVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2xjb21tIChuZWVkc19hbGlnbikKLSAgICAgaW50IG5lZWRzX2FsaWduOwotewotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLQotICBzX2xjb21tIChuZWVkc19hbGlnbik7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBMaWtlIGxzeW0sIGJ1dCBkZWxldGUgb3VyIGxhYmVsIHdoZW4gZmluaXNoZWQuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfbHN5bSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLQotICBzX2xzeW0gKDApOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogU3dpdGNoIHRvIHRoZSB0ZXh0IHNwYWNlLiAgTGlrZSBzX3RleHQsIGJ1dCBkZWxldGUgb3VyCi0gICBsYWJlbCB3aGVuIGZpbmlzaGVkLiAgKi8KLXN0YXRpYyB2b2lkCi1wYV90ZXh0ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGN1cnJlbnRfc3BhY2UgPSBpc19kZWZpbmVkX3NwYWNlICgiJFRFWFQkIik7Ci0gIGN1cnJlbnRfc3Vic3BhY2UKLSAgICA9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKGN1cnJlbnRfc3BhY2UtPnNkX3NlZywgMCk7Ci0KLSAgc190ZXh0ICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIE9uIHRoZSBQQSByZWxvY2F0aW9ucyB3aGljaCBpbnZvbHZlIGZ1bmN0aW9uIHN5bWJvbHMgbXVzdCBub3QgYmUKLSAgIGFkanVzdGVkLiAgVGhpcyBzbyB0aGF0IHRoZSBsaW5rZXIgY2FuIGtub3cgd2hlbi9ob3cgdG8gY3JlYXRlIGFyZ3VtZW50Ci0gICByZWxvY2F0aW9uIHN0dWJzIGZvciBpbmRpcmVjdCBjYWxscyBhbmQgY2FsbHMgdG8gc3RhdGljIGZ1bmN0aW9ucy4KLQotICAgIlQiIGZpZWxkIHNlbGVjdG9ycyBjcmVhdGUgRExUIHJlbGF0aXZlIGZpeHVwcyBmb3IgYWNjZXNzaW5nCi0gICBnbG9iYWxzIGFuZCBzdGF0aWNzIGluIFBJQyBjb2RlOyBlYWNoIERMVCByZWxhdGl2ZSBmaXh1cCBjcmVhdGVzCi0gICBhbiBlbnRyeSBpbiB0aGUgRExUIHRhYmxlLiAgVGhlIGVudHJpZXMgY29udGFpbiB0aGUgYWRkcmVzcyBvZgotICAgdGhlIGZpbmFsIHRhcmdldCAoZWcgYWNjZXNzaW5nICJmb28iIHdvdWxkIGNyZWF0ZSBhIERMVCBlbnRyeQotICAgd2l0aCB0aGUgYWRkcmVzcyBvZiAiZm9vIikuCi0KLSAgIFVuZm9ydHVuYXRlbHksIHRoZSBIUCBsaW5rZXIgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCBhbnkgYWRkZW5kCi0gICB3aGVuIGdlbmVyYXRpbmcgdGhlIERMVDsgc28gYWNjZXNzaW5nICRMSVQkKzggcHV0cyB0aGUgYWRkcmVzcyBvZgotICAgJExJVCQgaW50byB0aGUgRExUIHJhdGhlciB0aGFuIHRoZSBhZGRyZXNzIG9mICRMSVQkKzguCi0KLSAgIFRoZSBlbmQgcmVzdWx0IGlzIHdlIGNhbid0IHBlcmZvcm0gcmVsb2NhdGlvbiBzeW1ib2wgcmVkdWN0aW9ucyBmb3IKLSAgIGFueSBmaXh1cCB3aGljaCBjcmVhdGVzIGVudHJpZXMgaW4gdGhlIERMVCAoZWcgdGhleSB1c2UgIlQiIGZpZWxkCi0gICBzZWxlY3RvcnMpLgotCi0gICBSZWplY3QgcmVkdWN0aW9ucyBpbnZvbHZpbmcgc3ltYm9scyB3aXRoIGV4dGVybmFsIHNjb3BlOyBzdWNoCi0gICByZWR1Y3Rpb25zIG1ha2UgbGlmZSBhIGxpdmluZyBoZWxsIGZvciBvYmplY3QgZmlsZSBlZGl0b3JzLiAKLQotICAgRklYTUUuICBBbHNvIHJlamVjdCBSX0hQUEEgcmVsb2NhdGlvbnMgd2hpY2ggYXJlIDMyYml0cyB3aWRlIGluCi0gICB0aGUgY29kZSBzcGFjZS4gIFRoZSBTT00gQkZEIGJhY2tlbmQgZG9lc24ndCBrbm93IGhvdyB0byBwdWxsIHRoZQotICAgcmlnaHQgYml0cyBvdXQgb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1pbnQKLWhwcGFfZml4X2FkanVzdGFibGUgKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4OwotCi0gIGhwcGFfZml4ID0gKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKikgZml4cC0+dGNfZml4X2RhdGE7Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIHN5bWJvbHMgaW4gMzJiaXQgcmVsb2NzLiAgKi8KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEEgJiYgaHBwYV9maXgtPmZ4X3JfZm9ybWF0ID09IDMyKQotICAgIHJldHVybiAwOwotCi0gIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIHN5bWJvbHMgaW4gc3ltMS1zeW0yIGV4cHJlc3Npb25zIHdoZW4KLSAgICAgdGhlIGZpeHVwIHdpbGwgb2NjdXIgaW4gYSBDT0RFIHN1YnNwYWNlLiAKLQotICAgICBYWFggRklYTUU6IExvbmcgdGVybSB3ZSBwcm9iYWJseSB3YW50IHRvIHJlamVjdCBhbGwgb2YgdGhlc2U7Ci0gICAgIGZvciBleGFtcGxlIHJlZHVjaW5nIGluIHRoZSBkZWJ1ZyBzZWN0aW9uIHdvdWxkIGxvc2UgaWYgd2UgZXZlcgotICAgICBzdXBwb3J0ZWQgdXNpbmcgdGhlIG9wdGltaXppbmcgaHAgbGlua2VyLiAgKi8KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5Ci0gICAgICAmJiBmaXhwLT5meF9zdWJzeQotICAgICAgJiYgKGhwcGFfZml4LT5zZWdtZW50LT5mbGFncyAmIFNFQ19DT0RFKSkKLSAgICB7Ci0gICAgICAvKiBBcHBhcmVudGx5IHN5X3VzZWRfaW5fcmVsb2MgbmV2ZXIgZ2V0cyBzZXQgZm9yIHN1YiBzeW1ib2xzLiAgKi8KLSAgICAgIGZpeHAtPmZ4X3N1YnN5LT5zeV91c2VkX2luX3JlbG9jID0gMTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBXZSBjYW4ndCBhZGp1c3QgYW55IHJlbG9jcyB0aGF0IHVzZSBMUiUgYW5kIFJSJSBmaWVsZCBzZWxlY3RvcnMuCi0gICAgIFRoYXQgY29uZnVzZXMgdGhlIEhQIGxpbmtlci4gICovCi0gIGlmIChocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX2xyc2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX3Jyc2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX25scnNlbCkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotCi0gIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIHN5bWJvbHMgaW4gRExUIHJlbGF0aXZlIHJlbG9jcywKLSAgICAgcmVsb2NhdGlvbnMgd2l0aCBwbGFiZWxzLiAgKi8KLSAgaWYgKGhwcGFfZml4LT5meF9yX2ZpZWxkID09IGVfdHNlbAotICAgICAgfHwgaHBwYV9maXgtPmZ4X3JfZmllbGQgPT0gZV9sdHNlbAotICAgICAgfHwgaHBwYV9maXgtPmZ4X3JfZmllbGQgPT0gZV9ydHNlbAotICAgICAgfHwgaHBwYV9maXgtPmZ4X3JfZmllbGQgPT0gZV9wc2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX3Jwc2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX2xwc2VsKQotICAgIHJldHVybiAwOwotCi0gIGlmIChmaXhwLT5meF9hZGRzeSAmJiBmaXhwLT5meF9hZGRzeS0+YnN5bS0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKQotICAgIHJldHVybiAwOwotCi0gIC8qIFJlamVjdCBhYnNvbHV0ZSBjYWxscyAoanVtcHMpLiAgKi8KLSAgaWYgKGhwcGFfZml4LT5meF9yX3R5cGUgPT0gUl9IUFBBX0FCU19DQUxMKQotICAgIHJldHVybiAwOwotCi0gIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIGZ1bmN0aW9uIHN5bWJvbHMuICAqLwotICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gMAotICAgICAgfHwgKGZpeHAtPmZ4X2FkZHN5LT5ic3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikgPT0gMCkKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIG5vbnplcm8gaWYgdGhlIGZpeHVwIGluIEZJWFAgd2lsbCByZXF1aXJlIGEgcmVsb2NhdGlvbiwKLSAgIGV2ZW4gaXQgaWYgYXBwZWFycyB0aGF0IHRoZSBmaXh1cCBjb3VsZCBiZSBjb21wbGV0ZWx5IGhhbmRsZWQKLSAgIHdpdGhpbiBHQVMuICAqLwotCi1pbnQKLWhwcGFfZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqaHBwYV9maXhwOwotICBpbnQgZGlzdGFuY2U7Ci0KLSAgaHBwYV9maXhwID0gKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKikgZml4cC0+dGNfZml4X2RhdGE7Ci0jaWZkZWYgT0JKX1NPTQotICBpZiAoZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9FTlRSWSB8fCBmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VYSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfQkVHSU5fQlJUQUIKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRU5EX0JSVEFCCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX0JFR0lOX1RSWQotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9FTkRfVFJZCi0gICAgICB8fCAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTCAmJiBmaXhwLT5meF9zdWJzeSAhPSBOVUxMCi0JICAmJiAoaHBwYV9maXhwLT5zZWdtZW50LT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKSkKLSAgICByZXR1cm4gMTsKLSNlbmRpZgotCi0jZGVmaW5lIGFyZ19yZWxvY19zdHViX25lZWRlZChDQUxMRVIsIENBTExFRSkgXAotICAoKENBTExFRSkgJiYgKENBTExFUikgJiYgKChDQUxMRUUpICE9IChDQUxMRVIpKSkKLQotICAvKiBJdCBpcyBuZWNlc3NhcnkgdG8gZm9yY2UgUEMtcmVsYXRpdmUgY2FsbHMvanVtcHMgdG8gaGF2ZSBhIHJlbG9jYXRpb24KLSAgICAgZW50cnkgaWYgdGhleSdyZSBnb2luZyB0byBuZWVkIGVpdGhlciBhIGFyZ3VtZW50IHJlbG9jYXRpb24gb3IgbG9uZwotICAgICBjYWxsIHN0dWIuICBGSVhNRS4gIENhbid0IHdlIG5lZWQgdGhlIHNhbWUgZm9yIGFic29sdXRlIGNhbGxzPyAgKi8KLSAgaWYgKGZpeHAtPmZ4X3BjcmVsICYmIGZpeHAtPmZ4X2FkZHN5Ci0gICAgICAmJiAoYXJnX3JlbG9jX3N0dWJfbmVlZGVkICgobG9uZykgKChvYmpfc3ltYm9sX3R5cGUgKikKLQkJCQkgIGZpeHAtPmZ4X2FkZHN5LT5ic3ltKS0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYywKLQotCQkJCSBocHBhX2ZpeHAtPmZ4X2FyZ19yZWxvYykpKQotICAgIHJldHVybiAxOwotICBkaXN0YW5jZSA9IChmaXhwLT5meF9vZmZzZXQgKyBTX0dFVF9WQUxVRSAoZml4cC0+ZnhfYWRkc3kpCi0JICAgICAgLSBtZF9wY3JlbF9mcm9tIChmaXhwKSk7Ci0gIC8qIE5vdyBjaGVjayBhbmQgc2VlIGlmIHdlJ3JlIGdvaW5nIHRvIG5lZWQgYSBsb25nLWJyYW5jaCBzdHViLiAgKi8KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfUENSRUxfQ0FMTAotICAgICAgJiYgKGRpc3RhbmNlID4gMjYyMTQzIHx8IGRpc3RhbmNlIDwgLTI2MjE0NCkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfQUJTX0NBTEwpCi0gICAgcmV0dXJuIDE7Ci0jdW5kZWYgYXJnX3JlbG9jX3N0dWJfbmVlZGVkCi0KLSAgLyogTm8gbmVlZCAoeWV0KSB0byBmb3JjZSBhbm90aGVyIHJlbG9jYXRpb25zIHRvIGJlIGVtaXR0ZWQuICAqLwotICByZXR1cm4gMDsKLX0KLQotLyogTm93IGZvciBzb21lIEVMRiBzcGVjaWZpYyBjb2RlLiAgRklYTUUuICAqLwotI2lmZGVmIE9CSl9FTEYKLS8qIE1hcmsgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uIHNvIHRoYXQgaXQncyBwb3NzaWJsZSB0byBjb21wdXRlCi0gICB0aGUgc2l6ZSBvZiB0aGUgZnVuY3Rpb24gaW4gaHBwYV9lbGZfZmluYWxfcHJvY2Vzc2luZy4gICovCi0KLXN0YXRpYyB2b2lkCi1ocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbiAoKQotewotICAvKiBFTEYgZG9lcyBub3QgaGF2ZSBFWElUIHJlbG9jYXRpb25zLiAgQWxsIHdlIGRvIGlzIGNyZWF0ZSBhCi0gICAgIHRlbXBvcmFyeSBzeW1ib2wgbWFya2luZyB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4gICovCi0gIGNoYXIgKm5hbWUgPSAoY2hhciAqKQotICAgIHhtYWxsb2MgKHN0cmxlbiAoIkwkXDAwMWVuZF8iKSArCi0JICAgICBzdHJsZW4gKFNfR0VUX05BTUUgKGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wpKSArIDEpOwotCi0gIGlmIChuYW1lKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgICAgIHN0cmNweSAobmFtZSwgIkwkXDAwMWVuZF8iKTsKLSAgICAgIHN0cmNhdCAobmFtZSwgU19HRVRfTkFNRSAobGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCkpOwotCi0gICAgICAvKiBJZiB3ZSBoYXZlIGEgLmV4aXQgZm9sbG93ZWQgYnkgYSAucHJvY2VuZCwgdGhlbiB0aGUKLQkgc3ltYm9sIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gZGVmaW5lZC4gICovCi0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotICAgICAgaWYgKHN5bWJvbFApCi0JewotCSAgLyogVGhlIHN5bWJvbCBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQhICBUaGlzIGNhbgotCSAgICAgaGFwcGVuIGlmIHdlIGhhdmUgYSAuZXhpdCBmb2xsb3dlZCBieSBhIC5wcm9jZW5kLgotCi0JICAgICBUaGlzIGlzICpub3QqIGFuIGVycm9yLiAgQWxsIHdlIHdhbnQgdG8gZG8gaXMgZnJlZQotCSAgICAgdGhlIG1lbW9yeSB3ZSBqdXN0IGFsbG9jYXRlZCBmb3IgdGhlIG5hbWUgYW5kIGNvbnRpbnVlLiAgKi8KLQkgIHhmcmVlIChuYW1lKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogc3ltYm9sIHZhbHVlIHNob3VsZCBiZSB0aGUgb2Zmc2V0IG9mIHRoZQotCSAgICAgbGFzdCBpbnN0cnVjdGlvbiBvZiB0aGUgZnVuY3Rpb24gKi8KLQkgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCBub3dfc2VnLCAodmFsdWVUKSAoZnJhZ19ub3dfZml4ICgpIC0gNCksCi0JCQkJZnJhZ19ub3cpOwotCi0JICBhc3NlcnQgKHN5bWJvbFApOwotCSAgc3ltYm9sUC0+YnN5bS0+ZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0JICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xQKTsKLQl9Ci0KLSAgICAgIGlmIChzeW1ib2xQKQotCWxhc3RfY2FsbF9pbmZvLT5lbmRfc3ltYm9sID0gc3ltYm9sUDsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIlN5bWJvbCAnJXMnIGNvdWxkIG5vdCBiZSBjcmVhdGVkLiIpLCBuYW1lKTsKLQotICAgIH0KLSAgZWxzZQotICAgIGFzX2JhZCAoXygiTm8gbWVtb3J5IGZvciBzeW1ib2wgbmFtZS4iKSk7Ci0KLX0KLQotLyogRm9yIEVMRiwgdGhpcyBmdW5jdGlvbiBzZXJ2ZXMgb25lIHB1cnBvc2U6ICB0byBzZXR1cCB0aGUgc3Rfc2l6ZQotICAgZmllbGQgb2YgU1RUX0ZVTkMgc3ltYm9scy4gIFRvIGRvIHRoaXMsIHdlIG5lZWQgdG8gc2NhbiB0aGUKLSAgIGNhbGxfaW5mbyBzdHJ1Y3R1cmUgbGlzdCwgZGV0ZXJtaW5pbmcgc3Rfc2l6ZSBpbiBieSB0YWtpbmcgdGhlCi0gICBkaWZmZXJlbmNlIGluIHRoZSBhZGRyZXNzIG9mIHRoZSBiZWdpbm5pbmcvZW5kIG1hcmtlciBzeW1ib2xzLiAgKi8KLQotdm9pZAotZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyAoKQotewotICBzdHJ1Y3QgY2FsbF9pbmZvICpjYWxsX2luZm9fcG9pbnRlcjsKLQotICBmb3IgKGNhbGxfaW5mb19wb2ludGVyID0gY2FsbF9pbmZvX3Jvb3Q7Ci0gICAgICAgY2FsbF9pbmZvX3BvaW50ZXI7Ci0gICAgICAgY2FsbF9pbmZvX3BvaW50ZXIgPSBjYWxsX2luZm9fcG9pbnRlci0+Y2lfbmV4dCkKLSAgICB7Ci0gICAgICBlbGZfc3ltYm9sX3R5cGUgKmVzeW0KLSAgICAgID0gKGVsZl9zeW1ib2xfdHlwZSAqKSBjYWxsX2luZm9fcG9pbnRlci0+c3RhcnRfc3ltYm9sLT5ic3ltOwotICAgICAgZXN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplID0KLQlTX0dFVF9WQUxVRSAoY2FsbF9pbmZvX3BvaW50ZXItPmVuZF9zeW1ib2wpCi0JLSBTX0dFVF9WQUxVRSAoY2FsbF9pbmZvX3BvaW50ZXItPnN0YXJ0X3N5bWJvbCkgKyA0OwotICAgIH0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1ocHBhLmggYi9nYXMvY29uZmlnL3RjLWhwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE1NDFkOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWhwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKiB0Yy1ocHBhLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRoZSBQQQotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogSFAgUEEtUklTQyBzdXBwb3J0IHdhcyBjb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlCi0gICBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLiAgKi8KLQotLyogUGxlYXNlIHJlZnJhaW4gZnJvbSBleHBvc2luZyB0aGUgd29ybGQgdG8gdGhlIGludGVybmFscyBvZiB0Yy1ocHBhLmMKLSAgIHdoZW4gdGhpcyBmaWxlIGlzIGluY2x1ZGVkLiAgVGhpcyBtZWFucyBvbmx5IGRlY2xhcmluZyBleHBvcnRlZCBmdW5jdGlvbnMsCi0gICAocGxlYXNlIFBBUkFNaXplIHRoZW0hKSBub3QgZXhwb3J0aW5nIHN0cnVjdHVyZXMgYW5kIGRhdGEgaXRlbXMgd2hpY2gKLSAgIGFyZSB1c2VkIHNvbGVseSB3aXRoaW4gdGMtaHBwYS5jLCBldGMuCi0KLSAgIEFsc28gcmVmcmFpbiBmcm9tIGFkZGluZyBhbnkgbW9yZSBvYmplY3QgZmlsZSBkZXBlbmRlbnQgY29kZSwgdGhlcmUgaXMgCi0gICBhbHJlYWR5IGZhciB0b28gbXVjaCBvYmplY3QgZmlsZSBmb3JtYXQgZGVwZW5kZW50IGNvZGUgaW4gdGhpcyBmaWxlLgotICAgSW4gdGhlb3J5IHRoaXMgZmlsZSBzaG91bGQgY29udGFpbiBvbmx5IGV4cG9ydGVkIGZ1bmN0aW9ucywgc3RydWN0dXJlcwotICAgYW5kIGRhdGEgZGVjbGFyYXRpb25zIGNvbW1vbiB0byBhbGwgUEEgYXNzZW1ibGVycy4gICovCi0KLSNpZm5kZWYgX1RDX0hQUEFfSAotI2RlZmluZSBfVENfSFBQQV9ICi0KLSNpZm5kZWYgVENfSFBQQQotI2RlZmluZSBUQ19IUFBBCTEKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9ocHBhCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0vKiBGSVhNRS4gIFRoZSBsYWNrIG9mIGEgcGxhY2UgdG8gcHV0IHRoaW5ncyB3aGljaCBhcmUgYm90aCB0YXJnZXQgY3B1Ci0gICBhbmQgdGFyZ2V0IGZvcm1hdCBkZXBlbmRlbnQgbWFrZXMgaGFja3MgbGlrZSB0aGlzIG5lY2Vzc2FyeS4gICovCi0jaWZkZWYgT0JKX0VMRgotI2luY2x1ZGUgImJmZC9lbGYzMi1ocHBhLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLWhwcGEiCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9TT00KLSNpbmNsdWRlICJiZmQvc29tLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgInNvbSIKLSNlbmRpZgotCi0vKiBGSVhNRS4gIFdoeSBvaCB3aHkgYXJlbid0IHRoZXNlIGRlZmluZWQgc29tZXdoZXJlIGdsb2JhbGx5PyAgKi8KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgICAoMCkKLSNkZWZpbmUgVFJVRSAgICAoIUZBTFNFKQotI2VuZGlmCi0KLSNkZWZpbmUgQVNFQ19OVUxMIChhc2VjdGlvbiAqKTAKLQotLyogTGFiZWxzIGFyZSBub3QgcmVxdWlyZWQgdG8gaGF2ZSBhIGNvbG9uIGZvciBhIHN1ZmZpeC4gICovCi0jZGVmaW5lIExBQkVMU19XSVRIT1VUX0NPTE9OUwotCi0vKiBGSVhNRS4gIFRoaXMgc2hvdWxkIGJlIHN0YXRpYyBhbmQgZGVjbGFyZWQgaW4gdGMtaHBwYS5jLCBidXQgCi0gICBwYV9kZWZpbmVfbGFiZWwgZ2V0cyB1c2VkIG91dHNpZGUgb2YgdGMtaHBwYS5jIHZpYSB0Y19mcm9iX2xhYmVsLgotICAgU2hvdWxkIGFsc28gYmUgUEFSQU1pemVkLCBidXQgc3ltYm9sUyBpc24ndCBhdmFpbGFibGUgaGVyZS4gICovCi1leHRlcm4gdm9pZCBwYV9kZWZpbmVfbGFiZWwgKCk7Ci0KLS8qIEZJWE1FLiAgVHlwZXMgbm90IGF2YWlsYWJsZSBoZXJlLCBzbyB0aGV5IGNhbid0IGJlIFBBUkFNaXplZC4gICovCi1leHRlcm4gdm9pZCBwYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYSAoKTsKLWV4dGVybiB2b2lkIGNvbnNfZml4X25ld19ocHBhICgpOwotZXh0ZXJuIGludCBocHBhX2ZvcmNlX3JlbG9jYXRpb24gKCk7Ci0KLS8qIFRoaXMgZ2V0cyBjYWxsZWQgYmVmb3JlIHdyaXRpbmcgdGhlIG9iamVjdCBmaWxlIHRvIG1ha2Ugc3VyZQotICAgdGhpbmdzIGxpa2UgZW50cnkvZXhpdCBhbmQgcHJvYy9wcm9jZW5kIHBhaXJzIG1hdGNoLiAgKi8KLWV4dGVybiB2b2lkIHBhX2NoZWNrX2VvZiBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIHRjX2Zyb2JfZmlsZSBwYV9jaGVja19lb2YKLQotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgcGFfZGVmaW5lX2xhYmVsIChzeW0pCi0KLS8qIFRoZSBQQSBkb2VzIG5vdCBuZWVkIHN1cHBvcnQgZm9yIGVpdGhlciBvZiB0aGVzZS4gICovCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihoZWFkZXJzKSB7O30KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGhlYWRlcnMpIHs7fQotCi0jZGVmaW5lIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotI2RlZmluZSBNQVhfUkVMT0NfRVhQQU5TSU9OIDYKLQotLyogRklYTUUuICBNb3JlIHRoaW5ncyB3aGljaCBhcmUgYm90aCBIUFBBIGFuZCBFTEYgc3BlY2lmaWMuICBUaGVyZSBpcyAKLSAgIG5vd2hlcmUgdG8gcHV0IHN1Y2ggdGhpbmdzLiAgKi8KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nCWVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcKLXZvaWQgZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotLyogVGhlIFBBIG5lZWRzIHRvIHBhcnNlIGZpZWxkIHNlbGVjdG9ycyBpbiAuYnl0ZSwgZXRjLiAgKi8KLQotI2RlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04oRVhQLCBOQllURVMpIFwKLSAgcGFyc2VfY29uc19leHByZXNzaW9uX2hwcGEgKEVYUCkKLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXIGNvbnNfZml4X25ld19ocHBhCi0KLS8qIE9uIHRoZSBQQSwgYW4gZXF1YWwgc2lnbiBvZnRlbiBhcHBlYXJzIGFzIGEgY29uZGl0aW9uIG9yIG51bGxpZmljYXRpb24KLSAgIGNvbXBsZXRlciBpbiBhbiBpbnN0cnVjdGlvbi4gIFRoaXMgY2FuIGJlIGRldGVjdGVkIGJ5IGNoZWNraW5nIHRoZQotICAgcHJldmlvdXMgY2hhcmFjdGVyLCBpZiB0aGUgY2hhcmFjdGVyIGlzIGEgY29tbWEsIHRoZW4gdGhlIGVxdWFsIGlzCi0gICBiZWluZyB1c2VkIGFzIHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBUQ19FUVVBTF9JTl9JTlNOKEMsIFBUUikJKChDKSA9PSAnLCcpCi0KLS8qIFNpbWlsYXJseSBmb3IgYW4gZXhjbGFtYXRpb24gcG9pbnQuICBJdCBpcyB1c2VkIGluIEZQIGNvbXBhcmlzb24KLSAgIGluc3RydWN0aW9ucyBhbmQgYXMgYW4gZW5kIG9mIGxpbmUgbWFya2VyLiAgV2hlbiB1c2VkIGluIGFuIGluc3RydWN0aW9uCi0gICBpdCB3aWxsIGFsd2F5cyBmb2xsb3cgYSBjb21tYS4gICovCi0jZGVmaW5lIFRDX0VPTF9JTl9JTlNOKFBUUikJKCooUFRSKSA9PSAnIScgJiYgKFBUUilbLTFdID09ICcsJykKLQotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZSBocHBhX2ZpeF9hZGp1c3RhYmxlCi0KLS8qIEJlY2F1c2Ugb2YgdGhlIHN0cmFuZ2UgUEEgY2FsbGluZyBjb252ZW50aW9ucywgaXQgaXMgc29tZXRpbWVzCi0gICBuZWNlc3NhcnkgdG8gZW1pdCBhIHJlbG9jYXRpb24gZm9yIGEgY2FsbCBldmVuIHRob3VnaCBpdCB3b3VsZAotICAgbm9ybWFsbHkgYXBwZWFyIHNhZmUgdG8gaGFuZGxlIGl0IGNvbXBsZXRlbHkgd2l0aGluIEdBUy4gICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkgaHBwYV9mb3JjZV9yZWxvY2F0aW9uIChGSVhQKQotCi0jaWZkZWYgT0JKX1NPTQotLyogSWYgYSBzeW1ib2wgaXMgaW1wb3J0ZWQsIGJ1dCBuZXZlciB1c2VkLCB0aGVuIHRoZSBzeW1ib2wgc2hvdWxkCi0gICAqbm90KiBlbmQgdXAgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIExpa2V3aXNlIGZvciBhYnNvbHV0ZSBzeW1ib2xzCi0gICB3aXRoIGxvY2FsIHNjb3BlLiAgKi8KLSNkZWZpbmUgdGNfZnJvYl9zeW1ib2woc3ltLHB1bnQpIFwKLSAgICBpZiAoKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gJmJmZF91bmRfc2VjdGlvbiAmJiBzeW0tPnN5X3VzZWQgPT0gMCkgXAotCXx8IChTX0dFVF9TRUdNRU5UIChzeW0pID09ICZiZmRfYWJzX3NlY3Rpb24gXAotCSAgICAmJiAoc3ltLT5ic3ltLT5mbGFncyAmIEJTRl9FWFBPUlQpID09IDApKSBcCi0gICAgICBwdW50ID0gMQotCi0vKiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gbWFrZSByZWxvY2F0aW9ucyBpbnZvbHZpbmcgdGhlIGRpZmZlcmVuY2Ugb2YKLSAgIHR3byBzeW1ib2xzLiAgVGhpcyBpbmNsdWRlcyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyB3aGVuCi0gICBvbmUgb2YgdGhlbSBpcyB1bmRlZmluZWQgKHRoaXMgY29tZXMgdXAgaW4gUElDIGNvZGUgZ2VuZXJhdGlvbikuIAotCi0gICBXZSBkb24ndCBkZWZpbmUgRElGRl9FWFBSX09LIGJlY2F1c2UgaXQgZG9lcyB0aGUgd3JvbmcgdGhpbmcgaWYKLSAgIHRoZSBhZGQgc3ltYm9sIGlzIHVuZGVmaW5lZCBhbmQgdGhlIHN1YiBzeW1ib2wgaXMgYSBzeW1ib2wgaW4KLSAgIHRoZSBzYW1lIHNlY3Rpb24gYXMgdGhlIHJlbG9jYXRpb24uICBXZSBhbHNvIG5lZWQgc29tZSB3YXkgdG8KLSAgIHNwZWNpYWxpemUgc29tZSBjb2RlIGluIGFkanVzdF9yZWxvY19zeW1zLiAgKi8KLSNkZWZpbmUgVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0sKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSB0Y19mcm9iX3N5bWJvbChzeW0scHVudCkgXAotICB7IFwKLSAgICBpZiAoKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gJmJmZF91bmRfc2VjdGlvbiAmJiBzeW0tPnN5X3VzZWQgPT0gMCkgXAotCXx8IChTX0dFVF9TRUdNRU5UIChzeW0pID09ICZiZmRfYWJzX3NlY3Rpb24gXAotCSAgICAmJiAoc3ltLT5ic3ltLT5mbGFncyAmIEJTRl9FWFBPUlQpID09IDApKSBcCi0gICAgICBwdW50ID0gMTsgXAotICB9Ci0jZW5kaWYKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLSNkZWZpbmUgVENfRklYX1RZUEUgUFRSCi0jZGVmaW5lIFRDX0lOSVRfRklYX0RBVEEoRklYUCkgKChGSVhQKS0+dGNfZml4X2RhdGEgPSBOVUxMKQotCi0jZW5kaWYgLyogX1RDX0hQUEFfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1pMzg2LmMgYi9nYXMvY29uZmlnL3RjLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2Mjk4ZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWkzODYuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ODcgKzAsMCBAQAotLyogaTM4Ni5jIC0tIEFzc2VtYmxlIGNvZGUgZm9yIHRoZSBJbnRlbCA4MDM4NgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAgSW50ZWwgODAzODYgbWFjaGluZSBzcGVjaWZpYyBnYXMuCi0gIFdyaXR0ZW4gYnkgRWxpb3QgRHJlc3NlbGhhdXMgKGVsaW90QG1nbS5taXQuZWR1KS4KLSAgQnVncyAmIHN1Z2dlc3Rpb25zIGFyZSBjb21wbGV0ZWx5IHdlbGNvbWUuICBUaGlzIGlzIGZyZWUgc29mdHdhcmUuCi0gIFBsZWFzZSBoZWxwIHVzIG1ha2UgaXQgYmV0dGVyLgotICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm9wY29kZS9pMzg2LmgiCi0KLSNpZm5kZWYgVENfUkVMT0MKLSNkZWZpbmUgVENfUkVMT0MoWCxZKSAoWSkKLSNlbmRpZgotCi0jaWZuZGVmIFJFR0lTVEVSX1dBUk5JTkdTCi0jZGVmaW5lIFJFR0lTVEVSX1dBUk5JTkdTIDEKLSNlbmRpZgotCi0jaWZuZGVmIFNDQUxFMV9XSEVOX05PX0lOREVYCi0vKiBTcGVjaWZ5aW5nIGEgc2NhbGUgZmFjdG9yIGJlc2lkZXMgMSB3aGVuIHRoZXJlIGlzIG5vIGluZGV4IGlzCi0gICBmdXRpbGUuICBlZy4gYG1vdiAoJWVieCwyKSwlYWwnIGRvZXMgZXhhY3RseSB0aGUgc2FtZSBhcwotICAgYG1vdiAoJWVieCksJWFsJy4gIFRvIHNsYXZpc2hseSBmb2xsb3cgd2hhdCB0aGUgcHJvZ3JhbW1lcgotICAgc3BlY2lmaWVkLCBzZXQgU0NBTEUxX1dIRU5fTk9fSU5ERVggdG8gMC4gICovCi0jZGVmaW5lIFNDQUxFMV9XSEVOX05PX0lOREVYIDEKLSNlbmRpZgotCi0jZGVmaW5lIHRydWUgMQotI2RlZmluZSBmYWxzZSAwCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbW9kZV9mcm9tX2Rpc3Bfc2l6ZSBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBpbnQgZml0c19pbl9zaWduZWRfYnl0ZSBQQVJBTVMgKChsb25nKSk7Ci1zdGF0aWMgaW50IGZpdHNfaW5fdW5zaWduZWRfYnl0ZSBQQVJBTVMgKChsb25nKSk7Ci1zdGF0aWMgaW50IGZpdHNfaW5fdW5zaWduZWRfd29yZCBQQVJBTVMgKChsb25nKSk7Ci1zdGF0aWMgaW50IGZpdHNfaW5fc2lnbmVkX3dvcmQgUEFSQU1TICgobG9uZykpOwotc3RhdGljIGludCBzbWFsbGVzdF9pbW1fdHlwZSBQQVJBTVMgKChsb25nKSk7Ci1zdGF0aWMgaW50IGFkZF9wcmVmaXggUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBzZXRfMTZiaXRfY29kZV9mbGFnIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc2V0X2ludGVsX3N5bnRheCBQQVJBTVMgKChpbnQpKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2MKLSAgUEFSQU1TICgoaW50LCBpbnQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotI2VuZGlmCi0KLS8qICdtZF9hc3NlbWJsZSAoKScgZ2F0aGVycyB0b2dldGhlciBpbmZvcm1hdGlvbiBhbmQgcHV0cyBpdCBpbnRvIGEKLSAgIGkzODZfaW5zbi4gKi8KLQotc3RydWN0IF9pMzg2X2luc24KLSAgewotICAgIC8qIFRNIGhvbGRzIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGluc24gd2VyZSBjdXJyZW50bHkgYXNzZW1ibGluZy4gKi8KLSAgICB0ZW1wbGF0ZSB0bTsKLQotICAgIC8qIFNVRkZJWCBob2xkcyB0aGUgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IGlmIGdpdmVuLgotICAgICAgIChlLmcuICdsJyBmb3IgJ21vdmwnKSAgKi8KLSAgICBjaGFyIHN1ZmZpeDsKLQotICAgIC8qIE9wZXJhbmRzIGFyZSBjb2RlZCB3aXRoIE9QRVJBTkRTLCBUWVBFUywgRElTUFMsIElNTVMsIGFuZCBSRUdTLiAqLwotCi0gICAgLyogT1BFUkFORFMgZ2l2ZXMgdGhlIG51bWJlciBvZiBnaXZlbiBvcGVyYW5kcy4gKi8KLSAgICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7Ci0KLSAgICAvKiBSRUdfT1BFUkFORFMsIERJU1BfT1BFUkFORFMsIE1FTV9PUEVSQU5EUywgSU1NX09QRVJBTkRTIGdpdmUgdGhlIG51bWJlcgotICAgICAgIG9mIGdpdmVuIHJlZ2lzdGVyLCBkaXNwbGFjZW1lbnQsIG1lbW9yeSBvcGVyYW5kcyBhbmQgaW1tZWRpYXRlCi0gICAgICAgb3BlcmFuZHMuICovCi0gICAgdW5zaWduZWQgaW50IHJlZ19vcGVyYW5kcywgZGlzcF9vcGVyYW5kcywgbWVtX29wZXJhbmRzLCBpbW1fb3BlcmFuZHM7Ci0KLSAgICAvKiBUWVBFUyBbaV0gaXMgdGhlIHR5cGUgKHNlZSBhYm92ZSAjZGVmaW5lcykgd2hpY2ggdGVsbHMgdXMgaG93IHRvCi0gICAgICAgc2VhcmNoIHRocm91Z2ggRElTUFMgW2ldICYgSU1NUyBbaV0gJiBSRUdTIFtpXSBmb3IgdGhlIHJlcXVpcmVkCi0gICAgICAgb3BlcmFuZC4gICovCi0gICAgdW5zaWduZWQgaW50IHR5cGVzW01BWF9PUEVSQU5EU107Ci0KLSAgICAvKiBEaXNwbGFjZW1lbnRzIChpZiBnaXZlbikgZm9yIGVhY2ggb3BlcmFuZC4gKi8KLSAgICBleHByZXNzaW9uUyAqZGlzcHNbTUFYX09QRVJBTkRTXTsKLQotICAgIC8qIFJlbG9jYXRpb24gdHlwZSBmb3Igb3BlcmFuZCAqLwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICBlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwgZGlzcF9yZWxvY1tNQVhfT1BFUkFORFNdOwotI2Vsc2UKLSAgICBpbnQgZGlzcF9yZWxvY1tNQVhfT1BFUkFORFNdOwotI2VuZGlmCi0KLSAgICAvKiBJbW1lZGlhdGUgb3BlcmFuZHMgKGlmIGdpdmVuKSBmb3IgZWFjaCBvcGVyYW5kLiAqLwotICAgIGV4cHJlc3Npb25TICppbW1zW01BWF9PUEVSQU5EU107Ci0KLSAgICAvKiBSZWdpc3RlciBvcGVyYW5kcyAoaWYgZ2l2ZW4pIGZvciBlYWNoIG9wZXJhbmQuICovCi0gICAgY29uc3QgcmVnX2VudHJ5ICpyZWdzW01BWF9PUEVSQU5EU107Ci0KLSAgICAvKiBCQVNFX1JFRywgSU5ERVhfUkVHLCBhbmQgTE9HMl9TQ0FMRV9GQUNUT1IgYXJlIHVzZWQgdG8gZW5jb2RlCi0gICAgICAgdGhlIGJhc2UgaW5kZXggYnl0ZSBiZWxvdy4gICovCi0gICAgY29uc3QgcmVnX2VudHJ5ICpiYXNlX3JlZzsKLSAgICBjb25zdCByZWdfZW50cnkgKmluZGV4X3JlZzsKLSAgICB1bnNpZ25lZCBpbnQgbG9nMl9zY2FsZV9mYWN0b3I7Ci0KLSAgICAvKiBTRUcgZ2l2ZXMgdGhlIHNlZ19lbnRyaWVzIG9mIHRoaXMgaW5zbi4gIFRoZXkgYXJlIHplcm8gdW5sZXNzCi0gICAgICAgZXhwbGljaXQgc2VnbWVudCBvdmVycmlkZXMgYXJlIGdpdmVuLiAqLwotICAgIGNvbnN0IHNlZ19lbnRyeSAqc2VnWzJdOwkvKiBzZWdtZW50cyBmb3IgbWVtb3J5IG9wZXJhbmRzIChpZiBnaXZlbikgKi8KLQotICAgIC8qIFBSRUZJWCBob2xkcyBhbGwgdGhlIGdpdmVuIHByZWZpeCBvcGNvZGVzICh1c3VhbGx5IG51bGwpLgotICAgICAgIFBSRUZJWEVTIGlzIHRoZSBudW1iZXIgb2YgcHJlZml4IG9wY29kZXMuICAqLwotICAgIHVuc2lnbmVkIGludCBwcmVmaXhlczsKLSAgICB1bnNpZ25lZCBjaGFyIHByZWZpeFtNQVhfUFJFRklYRVNdOwotCi0gICAgLyogUk0gYW5kIFNJQiBhcmUgdGhlIG1vZHJtIGJ5dGUgYW5kIHRoZSBzaWIgYnl0ZSB3aGVyZSB0aGUKLSAgICAgICBhZGRyZXNzaW5nIG1vZGVzIG9mIHRoaXMgaW5zbiBhcmUgZW5jb2RlZC4gICovCi0KLSAgICBtb2RybV9ieXRlIHJtOwotICAgIHNpYl9ieXRlIHNpYjsKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX2kzODZfaW5zbiBpMzg2X2luc247Ci0KLS8qIExpc3Qgb2YgY2hhcnMgYmVzaWRlcyB0aG9zZSBpbiBhcHAuYzpzeW1ib2xfY2hhcnMgdGhhdCBjYW4gc3RhcnQgYW4KLSAgIG9wZXJhbmQuICBVc2VkIHRvIHByZXZlbnQgdGhlIHNjcnViYmVyIGVhdGluZyB2aXRhbCB3aGl0ZS1zcGFjZS4gICovCi0jaWZkZWYgTEVYX0FUCi1jb25zdCBjaGFyIGV4dHJhX3N5bWJvbF9jaGFyc1tdID0gIiolLShAIjsKLSNlbHNlCi1jb25zdCBjaGFyIGV4dHJhX3N5bWJvbF9jaGFyc1tdID0gIiolLSgiOwotI2VuZGlmCi0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsICovCi0jaWYgZGVmaW5lZCAoVEVfSTM4NkFJWCkgfHwgKChkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKSkgJiYgISBkZWZpbmVkIChURV9MSU5VWCkpCi0vKiBQdXR0aW5nICcvJyBoZXJlIG1ha2VzIGl0IGltcG9zc2libGUgdG8gdXNlIHRoZSBkaXZpZGUgb3BlcmF0b3IuCi0gICBIb3dldmVyLCB3ZSBuZWVkIGl0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggU1ZSNCBzeXN0ZW1zLiAgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMvIjsKLSNkZWZpbmUgUFJFRklYX1NFUEFSQVRPUiAnXFwnCi0jZWxzZQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0jZGVmaW5lIFBSRUZJWF9TRVBBUkFUT1IgJy8nCi0jZW5kaWYKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dCAqLwotLyogTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4gKi8KLS8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIHN0YXJ0ZWQgbGlrZSB0aGlzIG9uZSB3aWxsIGFsd2F5cyB3b3JrIGlmCi0gICAnLycgaXNuJ3Qgb3RoZXJ3aXNlIGRlZmluZWQuICAqLwotI2lmIGRlZmluZWQgKFRFX0kzODZBSVgpIHx8ICgoZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikpICYmICEgZGVmaW5lZCAoVEVfTElOVVgpKQotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIiOwotI2Vsc2UKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiLyI7Ci0jZW5kaWYKLQotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJmRmREeFgiOwotCi0vKiB0YWJsZXMgZm9yIGxleGljYWwgYW5hbHlzaXMgKi8KLXN0YXRpYyBjaGFyIG1uZW1vbmljX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciByZWdpc3Rlcl9jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgb3BlcmFuZF9jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgaWRlbnRpZmllcl9jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgZGlnaXRfY2hhcnNbMjU2XTsKLQotLyogbGV4aWNhbCBtYWNyb3MgKi8KLSNkZWZpbmUgaXNfbW5lbW9uaWNfY2hhcih4KSAobW5lbW9uaWNfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19vcGVyYW5kX2NoYXIoeCkgKG9wZXJhbmRfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19yZWdpc3Rlcl9jaGFyKHgpIChyZWdpc3Rlcl9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX3NwYWNlX2NoYXIoeCkgKCh4KSA9PSAnICcpCi0jZGVmaW5lIGlzX2lkZW50aWZpZXJfY2hhcih4KSAoaWRlbnRpZmllcl9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX2RpZ2l0X2NoYXIoeCkgKGRpZ2l0X2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLQotLyogcHV0IGhlcmUgYWxsIG5vbi1kaWdpdCBub24tbGV0dGVyIGNoYXJjdGVycyB0aGF0IG1heSBvY2N1ciBpbiBhbiBvcGVyYW5kICovCi1zdGF0aWMgY2hhciBvcGVyYW5kX3NwZWNpYWxfY2hhcnNbXSA9ICIlJC0rKCwpKi5ffi88PnwmXiE6W0BdIjsKLQotLyogbWRfYXNzZW1ibGUoKSBhbHdheXMgbGVhdmVzIHRoZSBzdHJpbmdzIGl0J3MgcGFzc2VkIHVuYWx0ZXJlZC4gIFRvCi0gICBlZmZlY3QgdGhpcyB3ZSBtYWludGFpbiBhIHN0YWNrIG9mIHNhdmVkIGNoYXJhY3RlcnMgdGhhdCB3ZSd2ZSBzbWFzaGVkCi0gICB3aXRoICdcMCdzIChpbmRpY2F0aW5nIGVuZCBvZiBzdHJpbmdzIGZvciB2YXJpb3VzIHN1Yi1maWVsZHMgb2YgdGhlCi0gICBhc3NlbWJsZXIgaW5zdHJ1Y3Rpb24pLiAqLwotc3RhdGljIGNoYXIgc2F2ZV9zdGFja1szMl07Ci1zdGF0aWMgY2hhciAqc2F2ZV9zdGFja19wOwkvKiBzdGFjayBwb2ludGVyICovCi0jZGVmaW5lIEVORF9TVFJJTkdfQU5EX1NBVkUocykgXAotCWRvIHsgKnNhdmVfc3RhY2tfcCsrID0gKihzKTsgKihzKSA9ICdcMCc7IH0gd2hpbGUgKDApCi0jZGVmaW5lIFJFU1RPUkVfRU5EX1NUUklORyhzKSBcCi0JZG8geyAqKHMpID0gKi0tc2F2ZV9zdGFja19wOyB9IHdoaWxlICgwKQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gd2UncmUgYXNzZW1ibGluZy4gKi8KLXN0YXRpYyBpMzg2X2luc24gaTsKLQotLyogUG9zc2libGUgdGVtcGxhdGVzIGZvciBjdXJyZW50IGluc24uICAqLwotc3RhdGljIGNvbnN0IHRlbXBsYXRlcyAqY3VycmVudF90ZW1wbGF0ZXM7Ci0KLS8qIFBlciBpbnN0cnVjdGlvbiBleHByZXNzaW9uUyBidWZmZXJzOiAyIGRpc3BsYWNlbWVudHMgJiAyIGltbWVkaWF0ZSBtYXguICovCi1zdGF0aWMgZXhwcmVzc2lvblMgZGlzcF9leHByZXNzaW9uc1syXSwgaW1fZXhwcmVzc2lvbnNbMl07Ci0KLXN0YXRpYyBpbnQgdGhpc19vcGVyYW5kOwkvKiBjdXJyZW50IG9wZXJhbmQgd2UgYXJlIHdvcmtpbmcgb24gKi8KLQotc3RhdGljIGludCBmbGFnX2RvX2xvbmdfanVtcDsJLyogRklYTUUgd2hhdCBkb2VzIHRoaXMgZG8/ICovCi0KLXN0YXRpYyBpbnQgZmxhZ18xNmJpdF9jb2RlOwkvKiAxIGlmIHdlJ3JlIHdyaXRpbmcgMTYtYml0IGNvZGUsIDAgaWYgMzItYml0ICovCi0KLXN0YXRpYyBpbnQgaW50ZWxfc3ludGF4ID0gMDsJLyogMSBmb3IgaW50ZWwgc3ludGF4LCAwIGlmIGF0dCBzeW50YXggKi8KLQotc3RhdGljIGludCBhbGxvd19uYWtlZF9yZWcgPSAwOyAgLyogMSBpZiByZWdpc3RlciBwcmVmaXggJSBub3QgcmVxdWlyZWQgKi8KLQotLyogSW50ZXJmYWNlIHRvIHJlbGF4X3NlZ21lbnQuCi0gICBUaGVyZSBhcmUgMiByZWxheCBzdGF0ZXMgZm9yIDM4NiBqdW1wIGluc25zOiBvbmUgZm9yIGNvbmRpdGlvbmFsICYKLSAgIG9uZSBmb3IgdW5jb25kaXRpb25hbCBqdW1wcy4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgdGhlc2UgdHdvIHR5cGVzCi0gICBvZiBqdW1wcyBhZGQgZGlmZmVyZW50IHNpemVzIHRvIGZyYWdzIHdoZW4gd2UncmUgZmlndXJpbmcgb3V0IHdoYXQKLSAgIHNvcnQgb2YganVtcCB0byBjaG9vc2UgdG8gcmVhY2ggYSBnaXZlbiBsYWJlbC4gICovCi0KLS8qIHR5cGVzICovCi0jZGVmaW5lIENPTkRfSlVNUCAxCQkvKiBjb25kaXRpb25hbCBqdW1wICovCi0jZGVmaW5lIFVOQ09ORF9KVU1QIDIJCS8qIHVuY29uZGl0aW9uYWwganVtcCAqLwotLyogc2l6ZXMgKi8KLSNkZWZpbmUgQ09ERTE2CTEKLSNkZWZpbmUgU01BTEwJMAotI2RlZmluZSBTTUFMTDE2IChTTUFMTHxDT0RFMTYpCi0jZGVmaW5lIEJJRwkyCi0jZGVmaW5lIEJJRzE2CShCSUd8Q09ERTE2KQotCi0jaWZuZGVmIElOTElORQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIElOTElORSBfX2lubGluZV9fCi0jZWxzZQotI2RlZmluZSBJTkxJTkUKLSNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgRU5DT0RFX1JFTEFYX1NUQVRFKHR5cGUsc2l6ZSkgXAotICAoKHJlbGF4X3N1YnN0YXRlVCkoKHR5cGU8PDIpIHwgKHNpemUpKSkKLSNkZWZpbmUgU0laRV9GUk9NX1JFTEFYX1NUQVRFKHMpIFwKLSAgICAoICgoKHMpICYgMHgzKSA9PSBCSUcgPyA0IDogKCgocykgJiAweDMpID09IEJJRzE2ID8gMiA6IDEpKSApCi0KLS8qIFRoaXMgdGFibGUgaXMgdXNlZCBieSByZWxheF9mcmFnIHRvIHByb21vdGUgc2hvcnQganVtcHMgdG8gbG9uZwotICAgb25lcyB3aGVyZSBuZWNlc3NhcnkuICBTTUFMTCAoc2hvcnQpIGp1bXBzIG1heSBiZSBwcm9tb3RlZCB0byBCSUcKLSAgICgzMiBiaXQgbG9uZykgb25lcywgYW5kIFNNQUxMMTYganVtcHMgdG8gQklHMTYgKDE2IGJpdCBsb25nKS4gIFdlCi0gICBkb24ndCBhbGxvdyBhIHNob3J0IGp1bXAgaW4gYSAzMiBiaXQgY29kZSBzZWdtZW50IHRvIGJlIHByb21vdGVkIHRvCi0gICBhIDE2IGJpdCBvZmZzZXQganVtcCBiZWNhdXNlIGl0J3Mgc2xvd2VyIChyZXF1aXJlcyBkYXRhIHNpemUKLSAgIHByZWZpeCksIGFuZCBkb2Vzbid0IHdvcmssIHVubGVzcyB0aGUgZGVzdGluYXRpb24gaXMgaW4gdGhlIGJvdHRvbQotICAgNjRrIG9mIHRoZSBjb2RlIHNlZ21lbnQgKFRoZSB0b3AgMTYgYml0cyBvZiBlaXAgYXJlIHplcm9lZCkuICAqLwotCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLS8qIFRoZSBmaWVsZHMgYXJlOgotICAgMSkgbW9zdCBwb3NpdGl2ZSByZWFjaCBvZiB0aGlzIHN0YXRlLAotICAgMikgbW9zdCBuZWdhdGl2ZSByZWFjaCBvZiB0aGlzIHN0YXRlLAotICAgMykgaG93IG1hbnkgYnl0ZXMgdGhpcyBtb2RlIHdpbGwgYWRkIHRvIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGZyYWcKLSAgIDQpIHdoaWNoIGluZGV4IGludG8gdGhlIHRhYmxlIHRvIHRyeSBpZiB3ZSBjYW4ndCBmaXQgaW50byB0aGlzIG9uZS4KLSAgICovCi0gIHsxLCAxLCAwLCAwfSwKLSAgezEsIDEsIDAsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLQotICB7MTI3ICsgMSwgLTEyOCArIDEsIDAsIEVOQ09ERV9SRUxBWF9TVEFURSAoQ09ORF9KVU1QLCBCSUcpfSwKLSAgezEyNyArIDEsIC0xMjggKyAxLCAwLCBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgQklHMTYpfSwKLSAgLyogZHdvcmQgY29uZGl0aW9uYWxzIGFkZHMgNCBieXRlcyB0byBmcmFnOgotICAgICAxIGV4dHJhIG9wY29kZSBieXRlLCAzIGV4dHJhIGRpc3BsYWNlbWVudCBieXRlcy4gICovCi0gIHswLCAwLCA0LCAwfSwKLSAgLyogd29yZCBjb25kaXRpb25hbHMgYWRkIDIgYnl0ZXMgdG8gZnJhZzoKLSAgICAgMSBleHRyYSBvcGNvZGUgYnl0ZSwgMSBleHRyYSBkaXNwbGFjZW1lbnQgYnl0ZS4gICovCi0gIHswLCAwLCAyLCAwfSwKLQotICB7MTI3ICsgMSwgLTEyOCArIDEsIDAsIEVOQ09ERV9SRUxBWF9TVEFURSAoVU5DT05EX0pVTVAsIEJJRyl9LAotICB7MTI3ICsgMSwgLTEyOCArIDEsIDAsIEVOQ09ERV9SRUxBWF9TVEFURSAoVU5DT05EX0pVTVAsIEJJRzE2KX0sCi0gIC8qIGR3b3JkIGptcCBhZGRzIDMgYnl0ZXMgdG8gZnJhZzoKLSAgICAgMCBleHRyYSBvcGNvZGUgYnl0ZXMsIDMgZXh0cmEgZGlzcGxhY2VtZW50IGJ5dGVzLiAgKi8KLSAgezAsIDAsIDMsIDB9LAotICAvKiB3b3JkIGptcCBhZGRzIDEgYnl0ZSB0byBmcmFnOgotICAgICAwIGV4dHJhIG9wY29kZSBieXRlcywgMSBleHRyYSBkaXNwbGFjZW1lbnQgYnl0ZS4gICovCi0gIHswLCAwLCAxLCAwfQotCi19OwotCi0KLXZvaWQKLWkzODZfYWxpZ25fY29kZSAoZnJhZ1AsIGNvdW50KQotICAgICBmcmFnUyAqZnJhZ1A7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgLyogVmFyaW91cyBlZmZpY2llbnQgbm8tb3AgcGF0dGVybnMgZm9yIGFsaWduaW5nIGNvZGUgbGFiZWxzLiAgKi8KLSAgLyogTm90ZTogRG9uJ3QgdHJ5IHRvIGFzc2VtYmxlIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIGNvbW1lbnRzLiAqLwotICAvKiAgICAgICAwTCBhbmQgMHcgYXJlIG5vdCBsZWdhbCAqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfMVtdID0KLSAgICB7MHg5MH07CQkJCQkvKiBub3AJCQkqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfMltdID0KLSAgICB7MHg4OSwweGY2fTsJCQkJLyogbW92bCAlZXNpLCVlc2kJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzNbXSA9Ci0gICAgezB4OGQsMHg3NiwweDAwfTsJCQkJLyogbGVhbCAwKCVlc2kpLCVlc2kJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzRbXSA9Ci0gICAgezB4OGQsMHg3NCwweDI2LDB4MDB9OwkJCS8qIGxlYWwgMCglZXNpLDEpLCVlc2kJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzVbXSA9Ci0gICAgezB4OTAsCQkJCQkvKiBub3AJCQkqLwotICAgICAweDhkLDB4NzQsMHgyNiwweDAwfTsJCQkvKiBsZWFsIDAoJWVzaSwxKSwlZXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl82W10gPQotICAgIHsweDhkLDB4YjYsMHgwMCwweDAwLDB4MDAsMHgwMH07CQkvKiBsZWFsIDBMKCVlc2kpLCVlc2kJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzdbXSA9Ci0gICAgezB4OGQsMHhiNCwweDI2LDB4MDAsMHgwMCwweDAwLDB4MDB9OwkvKiBsZWFsIDBMKCVlc2ksMSksJWVzaSAqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfOFtdID0KLSAgICB7MHg5MCwJCQkJCS8qIG5vcAkJCSovCi0gICAgIDB4OGQsMHhiNCwweDI2LDB4MDAsMHgwMCwweDAwLDB4MDB9OwkvKiBsZWFsIDBMKCVlc2ksMSksJWVzaSAqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfOVtdID0KLSAgICB7MHg4OSwweGY2LAkJCQkJLyogbW92bCAlZXNpLCVlc2kJKi8KLSAgICAgMHg4ZCwweGJjLDB4MjcsMHgwMCwweDAwLDB4MDAsMHgwMH07CS8qIGxlYWwgMEwoJWVkaSwxKSwlZWRpICovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xMFtdID0KLSAgICB7MHg4ZCwweDc2LDB4MDAsCQkJCS8qIGxlYWwgMCglZXNpKSwlZXNpCSovCi0gICAgIDB4OGQsMHhiYywweDI3LDB4MDAsMHgwMCwweDAwLDB4MDB9OwkvKiBsZWFsIDBMKCVlZGksMSksJWVkaSAqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfMTFbXSA9Ci0gICAgezB4OGQsMHg3NCwweDI2LDB4MDAsCQkJLyogbGVhbCAwKCVlc2ksMSksJWVzaQkqLwotICAgICAweDhkLDB4YmMsMHgyNywweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZWRpLDEpLCVlZGkgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzEyW10gPQotICAgIHsweDhkLDB4YjYsMHgwMCwweDAwLDB4MDAsMHgwMCwJCS8qIGxlYWwgMEwoJWVzaSksJWVzaQkqLwotICAgICAweDhkLDB4YmYsMHgwMCwweDAwLDB4MDAsMHgwMH07CQkvKiBsZWFsIDBMKCVlZGkpLCVlZGkJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzEzW10gPQotICAgIHsweDhkLDB4YjYsMHgwMCwweDAwLDB4MDAsMHgwMCwJCS8qIGxlYWwgMEwoJWVzaSksJWVzaQkqLwotICAgICAweDhkLDB4YmMsMHgyNywweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZWRpLDEpLCVlZGkgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzE0W10gPQotICAgIHsweDhkLDB4YjQsMHgyNiwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBsZWFsIDBMKCVlc2ksMSksJWVzaSAqLwotICAgICAweDhkLDB4YmMsMHgyNywweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZWRpLDEpLCVlZGkgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzE1W10gPQotICAgIHsweGViLDB4MGQsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLAkvKiBqbXAgLisxNTsgbG90c2Egbm9wcwkqLwotICAgICAweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTB9OwotICBzdGF0aWMgY29uc3QgY2hhciBmMTZfNFtdID0KLSAgICB7MHg4ZCwweGI0LDB4MDAsMHgwMH07CQkJLyogbGVhIDB3KCVzaSksJXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYxNl81W10gPQotICAgIHsweDkwLAkJCQkJLyogbm9wCQkJKi8KLSAgICAgMHg4ZCwweGI0LDB4MDAsMHgwMH07CQkJLyogbGVhIDB3KCVzaSksJXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYxNl82W10gPQotICAgIHsweDg5LDB4ZjYsCQkJCQkvKiBtb3YgJXNpLCVzaQkJKi8KLSAgICAgMHg4ZCwweGJkLDB4MDAsMHgwMH07CQkJLyogbGVhIDB3KCVkaSksJWRpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYxNl83W10gPQotICAgIHsweDhkLDB4NzQsMHgwMCwJCQkJLyogbGVhIDAoJXNpKSwlc2kJKi8KLSAgICAgMHg4ZCwweGJkLDB4MDAsMHgwMH07CQkJLyogbGVhIDB3KCVkaSksJWRpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYxNl84W10gPQotICAgIHsweDhkLDB4YjQsMHgwMCwweDAwLAkJCS8qIGxlYSAwdyglc2kpLCVzaQkqLwotICAgICAweDhkLDB4YmQsMHgwMCwweDAwfTsJCQkvKiBsZWEgMHcoJWRpKSwlZGkJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGYzMl9wYXR0W10gPSB7Ci0gICAgZjMyXzEsIGYzMl8yLCBmMzJfMywgZjMyXzQsIGYzMl81LCBmMzJfNiwgZjMyXzcsIGYzMl84LAotICAgIGYzMl85LCBmMzJfMTAsIGYzMl8xMSwgZjMyXzEyLCBmMzJfMTMsIGYzMl8xNCwgZjMyXzE1Ci0gIH07Ci0gIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmMTZfcGF0dFtdID0gewotICAgIGYzMl8xLCBmMzJfMiwgZjMyXzMsIGYxNl80LCBmMTZfNSwgZjE2XzYsIGYxNl83LCBmMTZfOCwKLSAgICBmMzJfMTUsIGYzMl8xNSwgZjMyXzE1LCBmMzJfMTUsIGYzMl8xNSwgZjMyXzE1LCBmMzJfMTUKLSAgfTsKLQotICBpZiAoY291bnQgPiAwICYmIGNvdW50IDw9IDE1KQotICAgIHsKLSAgICAgIGlmIChmbGFnXzE2Yml0X2NvZGUpCi0JewotCSAgbWVtY3B5KGZyYWdQLT5mcl9saXRlcmFsICsgZnJhZ1AtPmZyX2ZpeCwKLQkJIGYxNl9wYXR0W2NvdW50IC0gMV0sIGNvdW50KTsKLQkgIGlmIChjb3VudCA+IDgpIC8qIGFkanVzdCBqdW1wIG9mZnNldCAqLwotCSAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtmcmFnUC0+ZnJfZml4ICsgMV0gPSBjb3VudCAtIDI7Ci0JfQotICAgICAgZWxzZQotCW1lbWNweShmcmFnUC0+ZnJfbGl0ZXJhbCArIGZyYWdQLT5mcl9maXgsCi0JICAgICAgIGYzMl9wYXR0W2NvdW50IC0gMV0sIGNvdW50KTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSBjb3VudDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICpvdXRwdXRfaW52YWxpZCBQQVJBTVMgKChpbnQgYykpOwotc3RhdGljIGludCBpMzg2X29wZXJhbmQgUEFSQU1TICgoY2hhciAqb3BlcmFuZF9zdHJpbmcpKTsKLXN0YXRpYyBpbnQgaTM4Nl9pbnRlbF9vcGVyYW5kIFBBUkFNUyAoKGNoYXIgKm9wZXJhbmRfc3RyaW5nLCBpbnQgZ290X2FfZmxvYXQpKTsKLXN0YXRpYyBjb25zdCByZWdfZW50cnkgKnBhcnNlX3JlZ2lzdGVyIFBBUkFNUyAoKGNoYXIgKnJlZ19zdHJpbmcsCi0JCQkJCQljaGFyICoqZW5kX29wKSk7Ci0KLSNpZm5kZWYgSTM4NkNPRkYKLXN0YXRpYyB2b2lkIHNfYnNzIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0KLXN5bWJvbFMgKkdPVF9zeW1ib2w7CQkvKiBQcmUtZGVmaW5lZCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIiAqLwotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotbW9kZV9mcm9tX2Rpc3Bfc2l6ZSAodCkKLSAgICAgdW5zaWduZWQgaW50IHQ7Ci17Ci0gIHJldHVybiAodCAmIERpc3A4KSA/IDEgOiAodCAmIChEaXNwMTZ8RGlzcDMyKSkgPyAyIDogMDsKLX0KLQotc3RhdGljIElOTElORSBpbnQKLWZpdHNfaW5fc2lnbmVkX2J5dGUgKG51bSkKLSAgICAgbG9uZyBudW07Ci17Ci0gIHJldHVybiAobnVtID49IC0xMjgpICYmIChudW0gPD0gMTI3KTsKLX0JCQkJLyogZml0c19pbl9zaWduZWRfYnl0ZSgpICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1maXRzX2luX3Vuc2lnbmVkX2J5dGUgKG51bSkKLSAgICAgbG9uZyBudW07Ci17Ci0gIHJldHVybiAobnVtICYgMHhmZikgPT0gbnVtOwotfQkJCQkvKiBmaXRzX2luX3Vuc2lnbmVkX2J5dGUoKSAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotZml0c19pbl91bnNpZ25lZF93b3JkIChudW0pCi0gICAgIGxvbmcgbnVtOwotewotICByZXR1cm4gKG51bSAmIDB4ZmZmZikgPT0gbnVtOwotfQkJCQkvKiBmaXRzX2luX3Vuc2lnbmVkX3dvcmQoKSAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotZml0c19pbl9zaWduZWRfd29yZCAobnVtKQotICAgICBsb25nIG51bTsKLXsKLSAgcmV0dXJuICgtMzI3NjggPD0gbnVtKSAmJiAobnVtIDw9IDMyNzY3KTsKLX0JCQkJLyogZml0c19pbl9zaWduZWRfd29yZCgpICovCi0KLXN0YXRpYyBpbnQKLXNtYWxsZXN0X2ltbV90eXBlIChudW0pCi0gICAgIGxvbmcgbnVtOwotewotI2lmIDAKLSAgLyogVGhpcyBjb2RlIGlzIGRpc2FibGVkIGJlY2F1c2UgYWxsIHRoZSBJbW0xIGZvcm1zIGluIHRoZSBvcGNvZGUgdGFibGUKLSAgICAgYXJlIHNsb3dlciBvbiB0aGUgaTQ4NiwgYW5kIHRoZXkncmUgdGhlIHZlcnNpb25zIHdpdGggdGhlIGltcGxpY2l0bHkKLSAgICAgc3BlY2lmaWVkIHNpbmdsZS1wb3NpdGlvbiBkaXNwbGFjZW1lbnQsIHdoaWNoIGhhcyBhbm90aGVyIHN5bnRheCBpZgotICAgICB5b3UgcmVhbGx5IHdhbnQgdG8gdXNlIHRoYXQgZm9ybS4gIElmIHlvdSByZWFsbHkgcHJlZmVyIHRvIGhhdmUgdGhlCi0gICAgIG9uZS1ieXRlLXNob3J0ZXIgSW1tMSBmb3JtIGRlc3BpdGUgdGhlc2UgcHJvYmxlbXMsIHJlLWVuYWJsZSB0aGlzCi0gICAgIGNvZGUuICAqLwotICBpZiAobnVtID09IDEpCi0gICAgcmV0dXJuIEltbTEgfCBJbW04IHwgSW1tOFMgfCBJbW0xNiB8IEltbTMyOwotI2VuZGlmCi0gIHJldHVybiAoZml0c19pbl9zaWduZWRfYnl0ZSAobnVtKQotCSAgPyAoSW1tOFMgfCBJbW04IHwgSW1tMTYgfCBJbW0zMikKLQkgIDogZml0c19pbl91bnNpZ25lZF9ieXRlIChudW0pCi0JICA/IChJbW04IHwgSW1tMTYgfCBJbW0zMikKLQkgIDogKGZpdHNfaW5fc2lnbmVkX3dvcmQgKG51bSkgfHwgZml0c19pbl91bnNpZ25lZF93b3JkIChudW0pKQotCSAgPyAoSW1tMTYgfCBJbW0zMikKLQkgIDogKEltbTMyKSk7Ci19CQkJCS8qIHNtYWxsZXN0X2ltbV90eXBlKCkgKi8KLQotLyogUmV0dXJucyAwIGlmIGF0dGVtcHRpbmcgdG8gYWRkIGEgcHJlZml4IHdoZXJlIG9uZSBmcm9tIHRoZSBzYW1lCi0gICBjbGFzcyBhbHJlYWR5IGV4aXN0cywgMSBpZiBub24gcmVwL3JlcG5lIGFkZGVkLCAyIGlmIHJlcC9yZXBuZQotICAgYWRkZWQuICAqLwotc3RhdGljIGludAotYWRkX3ByZWZpeCAocHJlZml4KQotICAgICB1bnNpZ25lZCBpbnQgcHJlZml4OwotewotICBpbnQgcmV0ID0gMTsKLSAgaW50IHE7Ci0KLSAgc3dpdGNoIChwcmVmaXgpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIGNhc2UgQ1NfUFJFRklYX09QQ09ERToKLSAgICBjYXNlIERTX1BSRUZJWF9PUENPREU6Ci0gICAgY2FzZSBFU19QUkVGSVhfT1BDT0RFOgotICAgIGNhc2UgRlNfUFJFRklYX09QQ09ERToKLSAgICBjYXNlIEdTX1BSRUZJWF9PUENPREU6Ci0gICAgY2FzZSBTU19QUkVGSVhfT1BDT0RFOgotICAgICAgcSA9IFNFR19QUkVGSVg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVQTkVfUFJFRklYX09QQ09ERToKLSAgICBjYXNlIFJFUEVfUFJFRklYX09QQ09ERToKLSAgICAgIHJldCA9IDI7Ci0gICAgICAvKiBmYWxsIHRocnUgKi8KLSAgICBjYXNlIExPQ0tfUFJFRklYX09QQ09ERToKLSAgICAgIHEgPSBMT0NLUkVQX1BSRUZJWDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGV0FJVF9PUENPREU6Ci0gICAgICBxID0gV0FJVF9QUkVGSVg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUREUl9QUkVGSVhfT1BDT0RFOgotICAgICAgcSA9IEFERFJfUFJFRklYOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERBVEFfUFJFRklYX09QQ09ERToKLSAgICAgIHEgPSBEQVRBX1BSRUZJWDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoaS5wcmVmaXhbcV0pCi0gICAgewotICAgICAgYXNfYmFkIChfKCJzYW1lIHR5cGUgb2YgcHJlZml4IHVzZWQgdHdpY2UiKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaS5wcmVmaXhlcyArPSAxOwotICBpLnByZWZpeFtxXSA9IHByZWZpeDsKLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQKLXNldF8xNmJpdF9jb2RlX2ZsYWcgKG5ld18xNmJpdF9jb2RlX2ZsYWcpCi0JaW50IG5ld18xNmJpdF9jb2RlX2ZsYWc7Ci17Ci0gIGZsYWdfMTZiaXRfY29kZSA9IG5ld18xNmJpdF9jb2RlX2ZsYWc7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfaW50ZWxfc3ludGF4IChzeW50YXhfZmxhZykKLQlpbnQgc3ludGF4X2ZsYWc7Ci17Ci0gIC8qIEZpbmQgb3V0IGlmIHJlZ2lzdGVyIHByZWZpeGluZyBpcyBzcGVjaWZpZWQuICAqLwotICBpbnQgYXNrX25ha2VkX3JlZyA9IDA7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgY2hhciAqc3RyaW5nID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW50IGUgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgICAgaWYgKHN0cmNtcChzdHJpbmcsICJwcmVmaXgiKSA9PSAwKQotCWFza19uYWtlZF9yZWcgPSAxOwotICAgICAgZWxzZSBpZiAoc3RyY21wKHN0cmluZywgIm5vcHJlZml4IikgPT0gMCkKLQlhc2tfbmFrZWRfcmVnID0gLTE7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJCYWQgYXJndW1lbnQgdG8gc3ludGF4IGRpcmVjdGl2ZS4iKSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gZTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIAotICBpbnRlbF9zeW50YXggPSBzeW50YXhfZmxhZzsKLQotICBpZiAoYXNrX25ha2VkX3JlZyA9PSAwKQotICAgIHsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBhbGxvd19uYWtlZF9yZWcgPSAoaW50ZWxfc3ludGF4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoc3Rkb3V0cHV0KSAhPSAnXDAnKSk7IAotI2Vsc2UKLSAgICAgIGFsbG93X25ha2VkX3JlZyA9IDA7IC8qIGNvbnNlcnZhdGl2ZSBkZWZhdWx0ICovCi0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICBhbGxvd19uYWtlZF9yZWcgPSAoYXNrX25ha2VkX3JlZyA8IDApOwotfQotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotI2lmbmRlZiBJMzg2Q09GRgotICB7ImJzcyIsIHNfYnNzLCAwfSwKLSNlbmRpZgotI2lmICFkZWZpbmVkKE9CSl9BT1VUKSAmJiAhZGVmaW5lZChVU0VfQUxJR05fUFRXTykKLSAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDB9LAotI2Vsc2UKLSAgeyJhbGlnbiIsIHNfYWxpZ25fcHR3bywgMH0sCi0jZW5kaWYKLSAgeyJmZmxvYXQiLCBmbG9hdF9jb25zLCAnZid9LAotICB7ImRmbG9hdCIsIGZsb2F0X2NvbnMsICdkJ30sCi0gIHsidGZsb2F0IiwgZmxvYXRfY29ucywgJ3gnfSwKLSAgeyJ2YWx1ZSIsIGNvbnMsIDJ9LAotICB7Im5vb3B0Iiwgc19pZ25vcmUsIDB9LAotICB7Im9wdGltIiwgc19pZ25vcmUsIDB9LAotICB7ImNvZGUxNiIsIHNldF8xNmJpdF9jb2RlX2ZsYWcsIDF9LAotICB7ImNvZGUzMiIsIHNldF8xNmJpdF9jb2RlX2ZsYWcsIDB9LAotICB7ImludGVsX3N5bnRheCIsIHNldF9pbnRlbF9zeW50YXgsIDF9LAotICB7ImF0dF9zeW50YXgiLCBzZXRfaW50ZWxfc3ludGF4LCAwfSwKLSAgezAsIDAsIDB9Ci19OwotCi0vKiBmb3IgaW50ZXJmYWNlIHdpdGggZXhwcmVzc2lvbiAoKSAqLwotZXh0ZXJuIGNoYXIgKmlucHV0X2xpbmVfcG9pbnRlcjsKLQotLyogaGFzaCB0YWJsZSBmb3IgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgbG9va3VwICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaDsKLS8qIGhhc2ggdGFibGUgZm9yIHJlZ2lzdGVyIGxvb2t1cCAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnJlZ19oYXNoOwotDAotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjb25zdCBjaGFyICpoYXNoX2VycjsKLQotICAvKiBpbml0aWFsaXplIG9wX2hhc2ggaGFzaCB0YWJsZSAqLwotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgewotICAgIHJlZ2lzdGVyIGNvbnN0IHRlbXBsYXRlICpvcHRhYjsKLSAgICByZWdpc3RlciB0ZW1wbGF0ZXMgKmNvcmVfb3B0YWI7Ci0KLSAgICBvcHRhYiA9IGkzODZfb3B0YWI7CQkvKiBzZXR1cCBmb3IgbG9vcCAqLwotICAgIGNvcmVfb3B0YWIgPSAodGVtcGxhdGVzICopIHhtYWxsb2MgKHNpemVvZiAodGVtcGxhdGVzKSk7Ci0gICAgY29yZV9vcHRhYi0+c3RhcnQgPSBvcHRhYjsKLQotICAgIHdoaWxlICgxKQotICAgICAgewotCSsrb3B0YWI7Ci0JaWYgKG9wdGFiLT5uYW1lID09IE5VTEwKLQkgICAgfHwgc3RyY21wIChvcHRhYi0+bmFtZSwgKG9wdGFiIC0gMSktPm5hbWUpICE9IDApCi0JICB7Ci0JICAgIC8qIGRpZmZlcmVudCBuYW1lIC0tPiBzaGlwIG91dCBjdXJyZW50IHRlbXBsYXRlIGxpc3Q7Ci0JICAgICAgIGFkZCB0byBoYXNoIHRhYmxlOyAmIGJlZ2luIGFuZXcgKi8KLQkgICAgY29yZV9vcHRhYi0+ZW5kID0gb3B0YWI7Ci0JICAgIGhhc2hfZXJyID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsCi0JCQkJICAgIChvcHRhYiAtIDEpLT5uYW1lLAotCQkJCSAgICAoUFRSKSBjb3JlX29wdGFiKTsKLQkgICAgaWYgKGhhc2hfZXJyKQotCSAgICAgIHsKLQkgICAgICBoYXNoX2Vycm9yOgotCQlhc19mYXRhbCAoXygiSW50ZXJuYWwgRXJyb3I6ICBDYW4ndCBoYXNoICVzOiAlcyIpLAotCQkJICAob3B0YWIgLSAxKS0+bmFtZSwKLQkJCSAgaGFzaF9lcnIpOwotCSAgICAgIH0KLQkgICAgaWYgKG9wdGFiLT5uYW1lID09IE5VTEwpCi0JICAgICAgYnJlYWs7Ci0JICAgIGNvcmVfb3B0YWIgPSAodGVtcGxhdGVzICopIHhtYWxsb2MgKHNpemVvZiAodGVtcGxhdGVzKSk7Ci0JICAgIGNvcmVfb3B0YWItPnN0YXJ0ID0gb3B0YWI7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBpbml0aWFsaXplIHJlZ19oYXNoIGhhc2ggdGFibGUgKi8KLSAgcmVnX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgewotICAgIHJlZ2lzdGVyIGNvbnN0IHJlZ19lbnRyeSAqcmVndGFiOwotCi0gICAgZm9yIChyZWd0YWIgPSBpMzg2X3JlZ3RhYjsKLQkgcmVndGFiIDwgaTM4Nl9yZWd0YWIgKyBzaXplb2YgKGkzODZfcmVndGFiKSAvIHNpemVvZiAoaTM4Nl9yZWd0YWJbMF0pOwotCSByZWd0YWIrKykKLSAgICAgIHsKLQloYXNoX2VyciA9IGhhc2hfaW5zZXJ0IChyZWdfaGFzaCwgcmVndGFiLT5yZWdfbmFtZSwgKFBUUikgcmVndGFiKTsKLQlpZiAoaGFzaF9lcnIpCi0JICBnb3RvIGhhc2hfZXJyb3I7Ci0gICAgICB9Ci0gIH0KLQotICAvKiBmaWxsIGluIGxleGljYWwgdGFibGVzOiAgbW5lbW9uaWNfY2hhcnMsIG9wZXJhbmRfY2hhcnMuICAqLwotICB7Ci0gICAgcmVnaXN0ZXIgaW50IGM7Ci0gICAgcmVnaXN0ZXIgY2hhciAqcDsKLQotICAgIGZvciAoYyA9IDA7IGMgPCAyNTY7IGMrKykKLSAgICAgIHsKLQlpZiAoaXNkaWdpdCAoYykpCi0JICB7Ci0JICAgIGRpZ2l0X2NoYXJzW2NdID0gYzsKLQkgICAgbW5lbW9uaWNfY2hhcnNbY10gPSBjOwotCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IGM7Ci0JICAgIG9wZXJhbmRfY2hhcnNbY10gPSBjOwotCSAgfQotCWVsc2UgaWYgKGlzbG93ZXIgKGMpKQotCSAgewotCSAgICBtbmVtb25pY19jaGFyc1tjXSA9IGM7Ci0JICAgIHJlZ2lzdGVyX2NoYXJzW2NdID0gYzsKLQkgICAgb3BlcmFuZF9jaGFyc1tjXSA9IGM7Ci0JICB9Ci0JZWxzZSBpZiAoaXN1cHBlciAoYykpCi0JICB7Ci0JICAgIG1uZW1vbmljX2NoYXJzW2NdID0gdG9sb3dlciAoYyk7Ci0JICAgIHJlZ2lzdGVyX2NoYXJzW2NdID0gbW5lbW9uaWNfY2hhcnNbY107Ci0JICAgIG9wZXJhbmRfY2hhcnNbY10gPSBjOwotCSAgfQotCi0JaWYgKGlzYWxwaGEgKGMpIHx8IGlzZGlnaXQgKGMpKQotCSAgaWRlbnRpZmllcl9jaGFyc1tjXSA9IGM7Ci0JZWxzZSBpZiAoYyA+PSAxMjgpCi0JICB7Ci0JICAgIGlkZW50aWZpZXJfY2hhcnNbY10gPSBjOwotCSAgICBvcGVyYW5kX2NoYXJzW2NdID0gYzsKLQkgIH0KLSAgICAgIH0KLQotI2lmZGVmIExFWF9BVAotICAgIGlkZW50aWZpZXJfY2hhcnNbJ0AnXSA9ICdAJzsKLSNlbmRpZgotICAgIHJlZ2lzdGVyX2NoYXJzWycpJ10gPSAnKSc7Ci0gICAgcmVnaXN0ZXJfY2hhcnNbJygnXSA9ICcoJzsKLSAgICBkaWdpdF9jaGFyc1snLSddID0gJy0nOwotICAgIGlkZW50aWZpZXJfY2hhcnNbJ18nXSA9ICdfJzsKLSAgICBpZGVudGlmaWVyX2NoYXJzWycuJ10gPSAnLic7Ci0KLSAgICBmb3IgKHAgPSBvcGVyYW5kX3NwZWNpYWxfY2hhcnM7ICpwICE9ICdcMCc7IHArKykKLSAgICAgIG9wZXJhbmRfY2hhcnNbKHVuc2lnbmVkIGNoYXIpICpwXSA9ICpwOwotICB9Ci0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHsKLSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKHRleHRfc2VjdGlvbiwgMik7Ci0gICAgICByZWNvcmRfYWxpZ25tZW50IChkYXRhX3NlY3Rpb24sIDIpOwotICAgICAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIDIpOwotICAgIH0KLSNlbmRpZgotfQotCi12b2lkCi1pMzg2X3ByaW50X3N0YXRpc3RpY3MgKGZpbGUpCi0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGhhc2hfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSwgImkzODYgb3Bjb2RlIiwgb3BfaGFzaCk7Ci0gIGhhc2hfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSwgImkzODYgcmVnaXN0ZXIiLCByZWdfaGFzaCk7Ci19Ci0MCi0KLSNpZmRlZiBERUJVRzM4NgotCi0vKiBkZWJ1Z2dpbmcgcm91dGluZXMgZm9yIG1kX2Fzc2VtYmxlICovCi1zdGF0aWMgdm9pZCBwaSBQQVJBTVMgKChjaGFyICosIGkzODZfaW5zbiAqKSk7Ci1zdGF0aWMgdm9pZCBwdGUgUEFSQU1TICgodGVtcGxhdGUgKikpOwotc3RhdGljIHZvaWQgcHQgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBwZSBQQVJBTVMgKChleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgdm9pZCBwcyBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotc3RhdGljIHZvaWQKLXBpIChsaW5lLCB4KQotICAgICBjaGFyICpsaW5lOwotICAgICBpMzg2X2luc24gKng7Ci17Ci0gIHJlZ2lzdGVyIHRlbXBsYXRlICpwOwotICBpbnQgaTsKLQotICBmcHJpbnRmIChzdGRvdXQsICIlczogdGVtcGxhdGUgIiwgbGluZSk7Ci0gIHB0ZSAoJngtPnRtKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiICBtb2RybTogIG1vZGUgJXggIHJlZyAleCAgcmVnL21lbSAleCIsCi0JICAgeC0+cm0ubW9kZSwgeC0+cm0ucmVnLCB4LT5ybS5yZWdtZW0pOwotICBmcHJpbnRmIChzdGRvdXQsICIgYmFzZSAleCAgaW5kZXggJXggIHNjYWxlICV4XG4iLAotCSAgIHgtPmJpLmJhc2UsIHgtPmJpLmluZGV4LCB4LT5iaS5zY2FsZSk7Ci0gIGZvciAoaSA9IDA7IGkgPCB4LT5vcGVyYW5kczsgaSsrKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZG91dCwgIiAgICAjJWQ6ICAiLCBpICsgMSk7Ci0gICAgICBwdCAoeC0+dHlwZXNbaV0pOwotICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKLSAgICAgIGlmICh4LT50eXBlc1tpXQotCSAgJiAoUmVnIHwgU1JlZzIgfCBTUmVnMyB8IENvbnRyb2wgfCBEZWJ1ZyB8IFRlc3QgfCBSZWdNTVggfCBSZWdYTU0pKQotCWZwcmludGYgKHN0ZG91dCwgIiVzXG4iLCB4LT5yZWdzW2ldLT5yZWdfbmFtZSk7Ci0gICAgICBpZiAoeC0+dHlwZXNbaV0gJiBJbW0pCi0JcGUgKHgtPmltbXNbaV0pOwotICAgICAgaWYgKHgtPnR5cGVzW2ldICYgRGlzcCkKLQlwZSAoeC0+ZGlzcHNbaV0pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXB0ZSAodCkKLSAgICAgdGVtcGxhdGUgKnQ7Ci17Ci0gIGludCBpOwotICBmcHJpbnRmIChzdGRvdXQsICIgJWQgb3BlcmFuZHMgIiwgdC0+b3BlcmFuZHMpOwotICBmcHJpbnRmIChzdGRvdXQsICJvcGNvZGUgJXggIiwKLQkgICB0LT5iYXNlX29wY29kZSk7Ci0gIGlmICh0LT5leHRlbnNpb25fb3Bjb2RlICE9IE5vbmUpCi0gICAgZnByaW50ZiAoc3Rkb3V0LCAiZXh0ICV4ICIsIHQtPmV4dGVuc2lvbl9vcGNvZGUpOwotICBpZiAodC0+b3Bjb2RlX21vZGlmaWVyICYgRCkKLSAgICBmcHJpbnRmIChzdGRvdXQsICJEIik7Ci0gIGlmICh0LT5vcGNvZGVfbW9kaWZpZXIgJiBXKQotICAgIGZwcmludGYgKHN0ZG91dCwgIlciKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKLSAgZm9yIChpID0gMDsgaSA8IHQtPm9wZXJhbmRzOyBpKyspCi0gICAgewotICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiICAgICMlZCB0eXBlICIsIGkgKyAxKTsKLSAgICAgIHB0ICh0LT5vcGVyYW5kX3R5cGVzW2ldKTsKLSAgICAgIGZwcmludGYgKHN0ZG91dCwgIlxuIik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcGUgKGUpCi0gICAgIGV4cHJlc3Npb25TICplOwotewotICBmcHJpbnRmIChzdGRvdXQsICIgICAgb3BlcmF0aW9uICAgICAgICVkXG4iLCBlLT5YX29wKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiICAgIGFkZF9udW1iZXIgICAgJWQgKCV4KVxuIiwKLQkgICBlLT5YX2FkZF9udW1iZXIsIGUtPlhfYWRkX251bWJlcik7Ci0gIGlmIChlLT5YX2FkZF9zeW1ib2wpCi0gICAgewotICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiICAgIGFkZF9zeW1ib2wgICAgIik7Ci0gICAgICBwcyAoZS0+WF9hZGRfc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKHN0ZG91dCwgIlxuIik7Ci0gICAgfQotICBpZiAoZS0+WF9vcF9zeW1ib2wpCi0gICAgewotICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiICAgIG9wX3N5bWJvbCAgICAiKTsKLSAgICAgIHBzIChlLT5YX29wX3N5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChzdGRvdXQsICJcbiIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXBzIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBmcHJpbnRmIChzdGRvdXQsICIlcyB0eXBlICVzJXMiLAotCSAgIFNfR0VUX05BTUUgKHMpLAotCSAgIFNfSVNfRVhURVJOQUwgKHMpID8gIkVYVEVSTkFMICIgOiAiIiwKLQkgICBzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKHMpKSk7Ci19Ci0KLXN0cnVjdCB0eXBlX25hbWUKLSAgewotICAgIHVuc2lnbmVkIGludCBtYXNrOwotICAgIGNoYXIgKnRuYW1lOwotICB9Ci0KLXR5cGVfbmFtZXNbXSA9Ci17Ci0gIHsgUmVnOCwgInI4IiB9LAotICB7IFJlZzE2LCAicjE2IiB9LAotICB7IFJlZzMyLCAicjMyIiB9LAotICB7IEltbTgsICJpOCIgfSwKLSAgeyBJbW04UywgImk4cyIgfSwKLSAgeyBJbW0xNiwgImkxNiIgfSwKLSAgeyBJbW0zMiwgImkzMiIgfSwKLSAgeyBJbW0xLCAiaTEiIH0sCi0gIHsgQmFzZUluZGV4LCAiQmFzZUluZGV4IiB9LAotICB7IERpc3A4LCAiZDgiIH0sCi0gIHsgRGlzcDE2LCAiZDE2IiB9LAotICB7IERpc3AzMiwgImQzMiIgfSwKLSAgeyBJbk91dFBvcnRSZWcsICJJbk91dFBvcnRSZWciIH0sCi0gIHsgU2hpZnRDb3VudCwgIlNoaWZ0Q291bnQiIH0sCi0gIHsgQ29udHJvbCwgImNvbnRyb2wgcmVnIiB9LAotICB7IFRlc3QsICJ0ZXN0IHJlZyIgfSwKLSAgeyBEZWJ1ZywgImRlYnVnIHJlZyIgfSwKLSAgeyBGbG9hdFJlZywgIkZSZWciIH0sCi0gIHsgRmxvYXRBY2MsICJGQWNjIiB9LAotICB7IFNSZWcyLCAiU1JlZzIiIH0sCi0gIHsgU1JlZzMsICJTUmVnMyIgfSwKLSAgeyBBY2MsICJBY2MiIH0sCi0gIHsgSnVtcEFic29sdXRlLCAiSnVtcCBBYnNvbHV0ZSIgfSwKLSAgeyBSZWdNTVgsICJyTU1YIiB9LAotICB7IFJlZ1hNTSwgInJYTU0iIH0sCi0gIHsgRXNTZWcsICJlcyIgfSwKLSAgeyAwLCAiIiB9Ci19OwotCi1zdGF0aWMgdm9pZAotcHQgKHQpCi0gICAgIHVuc2lnbmVkIGludCB0OwotewotICByZWdpc3RlciBzdHJ1Y3QgdHlwZV9uYW1lICp0eTsKLQotICBpZiAodCA9PSBVbmtub3duKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZG91dCwgXygiVW5rbm93biIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKHR5ID0gdHlwZV9uYW1lczsgdHktPm1hc2s7IHR5KyspCi0JaWYgKHQgJiB0eS0+bWFzaykKLQkgIGZwcmludGYgKHN0ZG91dCwgIiVzLCAiLCB0eS0+dG5hbWUpOwotICAgIH0KLSAgZmZsdXNoIChzdGRvdXQpOwotfQotCi0jZW5kaWYgLyogREVCVUczODYgKi8KLQwKLWludAotdGNfaTM4Nl9mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQotICAgICBzdHJ1Y3QgZml4ICpmaXhwOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLSNlbHNlCi0gIC8qIEZvciBDT0ZGICovCi0gIHJldHVybiBmaXhwLT5meF9yX3R5cGU9PTc7Ci0jZW5kaWYKLX0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2MKLSAgUEFSQU1TICgoaW50LCBpbnQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1yZWxvYyAoc2l6ZSwgcGNyZWwsIG90aGVyKQotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IHBjcmVsOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgb3RoZXI7Ci17Ci0gIGlmIChvdGhlciAhPSBOT19SRUxPQykgcmV0dXJuIG90aGVyOwotCi0gIGlmIChwY3JlbCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHNpemUpCi0JewotCWNhc2UgMTogcmV0dXJuIEJGRF9SRUxPQ184X1BDUkVMOwotCWNhc2UgMjogcmV0dXJuIEJGRF9SRUxPQ18xNl9QQ1JFTDsKLQljYXNlIDQ6IHJldHVybiBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JfQotICAgICAgYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbiIpLCBzaXplKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHNpemUpCi0JewotCWNhc2UgMTogcmV0dXJuIEJGRF9SRUxPQ184OwotCWNhc2UgMjogcmV0dXJuIEJGRF9SRUxPQ18xNjsKLQljYXNlIDQ6IHJldHVybiBCRkRfUkVMT0NfMzI7Ci0JfQotICAgICAgYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgcmVsb2NhdGlvbiIpLCBzaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuIEJGRF9SRUxPQ19OT05FOwotfQotCi0vKgotICogSGVyZSB3ZSBkZWNpZGUgd2hpY2ggZml4dXBzIGNhbiBiZSBhZGp1c3RlZCB0byBtYWtlIHRoZW0gcmVsYXRpdmUgdG8KLSAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY3Rpb24gaW5zdGVhZCBvZiB0aGUgc3ltYm9sLiAgQmFzaWNhbGx5IHdlIG5lZWQKLSAqIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBkeW5hbWljIHJlbG9jYXRpb25zIGFyZSBkb25lIGNvcnJlY3RseSwgc28gaW4KLSAqIHNvbWUgY2FzZXMgd2UgZm9yY2UgdGhlIG9yaWdpbmFsIHN5bWJvbCB0byBiZSB1c2VkLgotICovCi1pbnQKLXRjX2kzODZfZml4X2FkanVzdGFibGUoZml4UCkKLSAgICAgZml4UyAqIGZpeFA7Ci17Ci0jaWZkZWYgT0JKX0VMRgotICAvKiBQcmV2ZW50IGFsbCBhZGp1c3RtZW50cyB0byBnbG9iYWwgc3ltYm9scy4gKi8KLSAgaWYgKFNfSVNfRVhURVJOIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotICAvKiBhZGp1c3RfcmVsb2Nfc3ltcyBkb2Vzbid0IGtub3cgYWJvdXQgdGhlIEdPVCAqLwotICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zODZfR09UT0ZGCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzM4Nl9QTFQzMgotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zODZfR09UMzIKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLSNlbHNlCi0jZGVmaW5lIHJlbG9jKFNJWkUsUENSRUwsT1RIRVIpCTAKLSNkZWZpbmUgQkZEX1JFTE9DXzE2CQkwCi0jZGVmaW5lIEJGRF9SRUxPQ18zMgkJMAotI2RlZmluZSBCRkRfUkVMT0NfMTZfUENSRUwJMAotI2RlZmluZSBCRkRfUkVMT0NfMzJfUENSRUwJMAotI2RlZmluZSBCRkRfUkVMT0NfMzg2X1BMVDMyCTAKLSNkZWZpbmUgQkZEX1JFTE9DXzM4Nl9HT1QzMgkwCi0jZGVmaW5lIEJGRF9SRUxPQ18zODZfR09UT0ZGCTAKLSNlbmRpZgotCi1pbnQKLWludGVsX2Zsb2F0X29wZXJhbmQgKG1uZW1vbmljKQotICAgICBjaGFyICptbmVtb25pYzsKLXsKLSAgaWYgKG1uZW1vbmljWzBdID09ICdmJyAmJiBtbmVtb25pY1sxXSA9PSdpJykKLSAgICByZXR1cm4gMDsKLQotICBpZiAobW5lbW9uaWNbMF0gPT0gJ2YnKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBMSU5FIHBvaW50cyB0byBhCi0gICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdAotICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChsaW5lKQotICAgICBjaGFyICpsaW5lOwotewotICAvKiBQb2ludHMgdG8gdGVtcGxhdGUgb25jZSB3ZSd2ZSBmb3VuZCBpdC4gKi8KLSAgY29uc3QgdGVtcGxhdGUgKnQ7Ci0KLSAgLyogQ291bnQgdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uIGdlbmVyYXRlZC4gICovCi0gIGludCBpbnNuX3NpemUgPSAwOwotCi0gIGludCBqOwotCi0gIGNoYXIgbW5lbW9uaWNbTUFYX01ORU1fU0laRV07Ci0KLSAgLyogSW5pdGlhbGl6ZSBnbG9iYWxzLiAqLwotICBtZW1zZXQgKCZpLCAnXDAnLCBzaXplb2YgKGkpKTsKLSAgZm9yIChqID0gMDsgaiA8IE1BWF9PUEVSQU5EUzsgaisrKQotICAgIGkuZGlzcF9yZWxvY1tqXSA9IE5PX1JFTE9DOwotICBtZW1zZXQgKGRpc3BfZXhwcmVzc2lvbnMsICdcMCcsIHNpemVvZiAoZGlzcF9leHByZXNzaW9ucykpOwotICBtZW1zZXQgKGltX2V4cHJlc3Npb25zLCAnXDAnLCBzaXplb2YgKGltX2V4cHJlc3Npb25zKSk7Ci0gIHNhdmVfc3RhY2tfcCA9IHNhdmVfc3RhY2s7CS8qIHJlc2V0IHN0YWNrIHBvaW50ZXIgKi8KLQotICAvKiBGaXJzdCBwYXJzZSBhbiBpbnN0cnVjdGlvbiBtbmVtb25pYyAmIGNhbGwgaTM4Nl9vcGVyYW5kIGZvciB0aGUgb3BlcmFuZHMuCi0gICAgIFdlIGFzc3VtZSB0aGF0IHRoZSBzY3J1YmJlciBoYXMgYXJyYW5nZWQgaXQgc28gdGhhdCBsaW5lWzBdIGlzIHRoZSB2YWxpZAotICAgICBzdGFydCBvZiBhIChwb3NzaWJseSBwcmVmaXhlZCkgbW5lbW9uaWMuICovCi0gIHsKLSAgICBjaGFyICpsID0gbGluZTsKLSAgICBjaGFyICp0b2tlbl9zdGFydCA9IGw7Ci0gICAgY2hhciAqbW5lbV9wOwotCi0gICAgLyogTm9uLXplcm8gaWYgd2UgZm91bmQgYSBwcmVmaXggb25seSBhY2NlcHRhYmxlIHdpdGggc3RyaW5nIGluc25zLiAqLwotICAgIGNvbnN0IGNoYXIgKmV4cGVjdGluZ19zdHJpbmdfaW5zdHJ1Y3Rpb24gPSBOVUxMOwotCi0gICAgd2hpbGUgKDEpCi0gICAgICB7Ci0JbW5lbV9wID0gbW5lbW9uaWM7Ci0Jd2hpbGUgKCgqbW5lbV9wID0gbW5lbW9uaWNfY2hhcnNbKHVuc2lnbmVkIGNoYXIpICpsXSkgIT0gMCkKLQkgIHsKLQkgICAgbW5lbV9wKys7Ci0JICAgIGlmIChtbmVtX3AgPj0gbW5lbW9uaWMgKyBzaXplb2YgKG1uZW1vbmljKSkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygibm8gc3VjaCAzODYgaW5zdHJ1Y3Rpb246IGAlcyciKSwgdG9rZW5fc3RhcnQpOwotCQlyZXR1cm47Ci0JICAgICAgfQotCSAgICBsKys7Ci0JICB9Ci0JaWYgKCFpc19zcGFjZV9jaGFyICgqbCkKLQkgICAgJiYgKmwgIT0gRU5EX09GX0lOU04KLQkgICAgJiYgKmwgIT0gUFJFRklYX1NFUEFSQVRPUikKLQkgIHsKLQkgICAgYXNfYmFkIChfKCJpbnZhbGlkIGNoYXJhY3RlciAlcyBpbiBtbmVtb25pYyIpLAotCQkgICAgb3V0cHV0X2ludmFsaWQgKCpsKSk7Ci0JICAgIHJldHVybjsKLQkgIH0KLQlpZiAodG9rZW5fc3RhcnQgPT0gbCkKLQkgIHsKLQkgICAgaWYgKCpsID09IFBSRUZJWF9TRVBBUkFUT1IpCi0JICAgICAgYXNfYmFkIChfKCJleHBlY3RpbmcgcHJlZml4OyBnb3Qgbm90aGluZyIpKTsKLQkgICAgZWxzZQotCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIG1uZW1vbmljOyBnb3Qgbm90aGluZyIpKTsKLQkgICAgcmV0dXJuOwotCSAgfQotCi0JLyogTG9vayB1cCBpbnN0cnVjdGlvbiAob3IgcHJlZml4KSB2aWEgaGFzaCB0YWJsZS4gICovCi0JY3VycmVudF90ZW1wbGF0ZXMgPSBoYXNoX2ZpbmQgKG9wX2hhc2gsIG1uZW1vbmljKTsKLQotCWlmICgqbCAhPSBFTkRfT0ZfSU5TTgotCSAgICAmJiAoISBpc19zcGFjZV9jaGFyICgqbCkgfHwgbFsxXSAhPSBFTkRfT0ZfSU5TTikKLQkgICAgJiYgY3VycmVudF90ZW1wbGF0ZXMKLQkgICAgJiYgKGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+b3Bjb2RlX21vZGlmaWVyICYgSXNQcmVmaXgpKQotCSAgewotCSAgICAvKiBJZiB3ZSBhcmUgaW4gMTYtYml0IG1vZGUsIGRvIG5vdCBhbGxvdyBhZGRyMTYgb3IgZGF0YTE2LgotCSAgICAgICBTaW1pbGFybHksIGluIDMyLWJpdCBtb2RlLCBkbyBub3QgYWxsb3cgYWRkcjMyIG9yIGRhdGEzMi4gICovCi0JICAgIGlmICgoY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5vcGNvZGVfbW9kaWZpZXIgJiAoU2l6ZTE2IHwgU2l6ZTMyKSkKLQkJJiYgKCgoY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5vcGNvZGVfbW9kaWZpZXIgJiBTaXplMzIpICE9IDApCi0JCSAgICBeIGZsYWdfMTZiaXRfY29kZSkpCi0JICAgICAgewotCQlhc19iYWQgKF8oInJlZHVuZGFudCAlcyBwcmVmaXgiKSwKLQkJCWN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+bmFtZSk7Ci0JCXJldHVybjsKLQkgICAgICB9Ci0JICAgIC8qIEFkZCBwcmVmaXgsIGNoZWNraW5nIGZvciByZXBlYXRlZCBwcmVmaXhlcy4gICovCi0JICAgIHN3aXRjaCAoYWRkX3ByZWZpeCAoY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5iYXNlX29wY29kZSkpCi0JICAgICAgewotCSAgICAgIGNhc2UgMDoKLQkJcmV0dXJuOwotCSAgICAgIGNhc2UgMjoKLQkJZXhwZWN0aW5nX3N0cmluZ19pbnN0cnVjdGlvbiA9Ci0JCSAgY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5uYW1lOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIC8qIFNraXAgcGFzdCBQUkVGSVhfU0VQQVJBVE9SIGFuZCByZXNldCB0b2tlbl9zdGFydC4gICovCi0JICAgIHRva2VuX3N0YXJ0ID0gKytsOwotCSAgfQotCWVsc2UKLQkgIGJyZWFrOwotICAgICAgfQotCi0gICAgaWYgKCFjdXJyZW50X3RlbXBsYXRlcykKLSAgICAgIHsKLQkvKiBTZWUgaWYgd2UgY2FuIGdldCBhIG1hdGNoIGJ5IHRyaW1taW5nIG9mZiBhIHN1ZmZpeC4JKi8KLQlzd2l0Y2ggKG1uZW1fcFstMV0pCi0JICB7Ci0JICBjYXNlIERXT1JEX01ORU1fU1VGRklYOgotCSAgY2FzZSBXT1JEX01ORU1fU1VGRklYOgotCSAgY2FzZSBCWVRFX01ORU1fU1VGRklYOgotCSAgY2FzZSBTSE9SVF9NTkVNX1NVRkZJWDoKLSNpZiBMT05HX01ORU1fU1VGRklYICE9IERXT1JEX01ORU1fU1VGRklYCi0JICBjYXNlIExPTkdfTU5FTV9TVUZGSVg6Ci0jZW5kaWYKLQkgICAgaS5zdWZmaXggPSBtbmVtX3BbLTFdOwotCSAgICBtbmVtX3BbLTFdID0gJ1wwJzsKLQkgICAgY3VycmVudF90ZW1wbGF0ZXMgPSBoYXNoX2ZpbmQgKG9wX2hhc2gsIG1uZW1vbmljKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgLyogSW50ZWwgU3ludGF4ICovCi0gICAgICAgICAgY2FzZSBJTlRFTF9EV09SRF9NTkVNX1NVRkZJWDoKLSAgICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpLnN1ZmZpeCA9IG1uZW1fcFstMV07Ci0gICAgICAgICAgICAgICAgbW5lbV9wWy0xXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgY3VycmVudF90ZW1wbGF0ZXMgPSBoYXNoX2ZpbmQgKG9wX2hhc2gsIG1uZW1vbmljKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotCSAgfQotCWlmICghY3VycmVudF90ZW1wbGF0ZXMpCi0JICB7Ci0JICAgIGFzX2JhZCAoXygibm8gc3VjaCAzODYgaW5zdHJ1Y3Rpb246IGAlcyciKSwgdG9rZW5fc3RhcnQpOwotCSAgICByZXR1cm47Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAvKiBjaGVjayBmb3IgcmVwL3JlcG5lIHdpdGhvdXQgYSBzdHJpbmcgaW5zdHJ1Y3Rpb24gKi8KLSAgICBpZiAoZXhwZWN0aW5nX3N0cmluZ19pbnN0cnVjdGlvbgotCSYmICEoY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5vcGNvZGVfbW9kaWZpZXIgJiBJc1N0cmluZykpCi0gICAgICB7Ci0JYXNfYmFkIChfKCJleHBlY3Rpbmcgc3RyaW5nIGluc3RydWN0aW9uIGFmdGVyIGAlcyciKSwKLQkJZXhwZWN0aW5nX3N0cmluZ19pbnN0cnVjdGlvbik7Ci0JcmV0dXJuOwotICAgICAgfQotCi0gICAgLyogVGhlcmUgbWF5IGJlIG9wZXJhbmRzIHRvIHBhcnNlLiAqLwotICAgIGlmICgqbCAhPSBFTkRfT0ZfSU5TTikKLSAgICAgIHsKLQkvKiBwYXJzZSBvcGVyYW5kcyAqLwotCi0JLyogMSBpZiBvcGVyYW5kIGlzIHBlbmRpbmcgYWZ0ZXIgJywnLiAqLwotCXVuc2lnbmVkIGludCBleHBlY3Rpbmdfb3BlcmFuZCA9IDA7Ci0KLQkvKiBOb24temVybyBpZiBvcGVyYW5kIHBhcmVucyBub3QgYmFsYW5jZWQuICovCi0JdW5zaWduZWQgaW50IHBhcmVuX25vdF9iYWxhbmNlZDsKLQotCWRvCi0JICB7Ci0JICAgIC8qIHNraXAgb3B0aW9uYWwgd2hpdGUgc3BhY2UgYmVmb3JlIG9wZXJhbmQgKi8KLQkgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpsKSkKLQkgICAgICArK2w7Ci0JICAgIGlmICghaXNfb3BlcmFuZF9jaGFyICgqbCkgJiYgKmwgIT0gRU5EX09GX0lOU04pCi0JICAgICAgewotCQlhc19iYWQgKF8oImludmFsaWQgY2hhcmFjdGVyICVzIGJlZm9yZSBvcGVyYW5kICVkIiksCi0JCQlvdXRwdXRfaW52YWxpZCAoKmwpLAotCQkJaS5vcGVyYW5kcyArIDEpOwotCQlyZXR1cm47Ci0JICAgICAgfQotCSAgICB0b2tlbl9zdGFydCA9IGw7CS8qIGFmdGVyIHdoaXRlIHNwYWNlICovCi0JICAgIHBhcmVuX25vdF9iYWxhbmNlZCA9IDA7Ci0JICAgIHdoaWxlIChwYXJlbl9ub3RfYmFsYW5jZWQgfHwgKmwgIT0gJywnKQotCSAgICAgIHsKLQkJaWYgKCpsID09IEVORF9PRl9JTlNOKQotCQkgIHsKLQkJICAgIGlmIChwYXJlbl9ub3RfYmFsYW5jZWQpCi0JCSAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW50ZWxfc3ludGF4KQotCQkJICBhc19iYWQgKF8oInVuYmFsYW5jZWQgcGFyZW50aGVzaXMgaW4gb3BlcmFuZCAlZC4iKSwKLQkJCQkgIGkub3BlcmFuZHMgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLQkJCSAgYXNfYmFkIChfKCJ1bmJhbGFuY2VkIGJyYWNrZXRzIGluIG9wZXJhbmQgJWQuIiksCi0JCQkJICBpLm9wZXJhbmRzICsgMSk7Ci0JCQlyZXR1cm47Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgYnJlYWs7CS8qIHdlIGFyZSBkb25lICovCi0JCSAgfQotCQllbHNlIGlmICghaXNfb3BlcmFuZF9jaGFyICgqbCkgJiYgIWlzX3NwYWNlX2NoYXIgKCpsKSkKLQkJICB7Ci0JCSAgICBhc19iYWQgKF8oImludmFsaWQgY2hhcmFjdGVyICVzIGluIG9wZXJhbmQgJWQiKSwKLQkJCSAgICBvdXRwdXRfaW52YWxpZCAoKmwpLAotCQkJICAgIGkub3BlcmFuZHMgKyAxKTsKLQkJICAgIHJldHVybjsKLQkJICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICAgICAgICB7Ci0JCSAgICBpZiAoKmwgPT0gJygnKQotCQkgICAgICArK3BhcmVuX25vdF9iYWxhbmNlZDsKLQkJICAgIGlmICgqbCA9PSAnKScpCi0JCSAgICAgIC0tcGFyZW5fbm90X2JhbGFuY2VkOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHsKLQkJICAgIGlmICgqbCA9PSAnWycpCi0JCSAgICAgICsrcGFyZW5fbm90X2JhbGFuY2VkOwotCQkgICAgaWYgKCpsID09ICddJykKLQkJICAgICAgLS1wYXJlbl9ub3RfYmFsYW5jZWQ7Ci0gICAgICAgICAgICAgICAgICB9Ci0JCWwrKzsKLQkgICAgICB9Ci0JICAgIGlmIChsICE9IHRva2VuX3N0YXJ0KQotCSAgICAgIHsJCQkvKiB5ZXMsIHdlJ3ZlIHJlYWQgaW4gYW5vdGhlciBvcGVyYW5kICovCi0JCXVuc2lnbmVkIGludCBvcGVyYW5kX29rOwotCQl0aGlzX29wZXJhbmQgPSBpLm9wZXJhbmRzKys7Ci0JCWlmIChpLm9wZXJhbmRzID4gTUFYX09QRVJBTkRTKQotCQkgIHsKLQkJICAgIGFzX2JhZCAoXygic3B1cmlvdXMgb3BlcmFuZHM7ICglZCBvcGVyYW5kcy9pbnN0cnVjdGlvbiBtYXgpIiksCi0JCQkgICAgTUFYX09QRVJBTkRTKTsKLQkJICAgIHJldHVybjsKLQkJICB9Ci0JCS8qIG5vdyBwYXJzZSBvcGVyYW5kIGFkZGluZyBpbmZvIHRvICdpJyBhcyB3ZSBnbyBhbG9uZyAqLwotCQlFTkRfU1RSSU5HX0FORF9TQVZFIChsKTsKLQotICAgICAgICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICAgICAgICBvcGVyYW5kX29rID0gaTM4Nl9pbnRlbF9vcGVyYW5kICh0b2tlbl9zdGFydCwgaW50ZWxfZmxvYXRfb3BlcmFuZCAobW5lbW9uaWMpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBvcGVyYW5kX29rID0gaTM4Nl9vcGVyYW5kICh0b2tlbl9zdGFydCk7Ci0KLQkJUkVTVE9SRV9FTkRfU1RSSU5HIChsKTsJLyogcmVzdG9yZSBvbGQgY29udGVudHMgKi8KLQkJaWYgKCFvcGVyYW5kX29rKQotCQkgIHJldHVybjsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWlmIChleHBlY3Rpbmdfb3BlcmFuZCkKLQkJICB7Ci0JCSAgZXhwZWN0aW5nX29wZXJhbmRfYWZ0ZXJfY29tbWE6Ci0JCSAgICBhc19iYWQgKF8oImV4cGVjdGluZyBvcGVyYW5kIGFmdGVyICcsJzsgZ290IG5vdGhpbmciKSk7Ci0JCSAgICByZXR1cm47Ci0JCSAgfQotCQlpZiAoKmwgPT0gJywnKQotCQkgIHsKLQkJICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIG9wZXJhbmQgYmVmb3JlICcsJzsgZ290IG5vdGhpbmciKSk7Ci0JCSAgICByZXR1cm47Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICAvKiBub3cgKmwgbXVzdCBiZSBlaXRoZXIgJywnIG9yIEVORF9PRl9JTlNOICovCi0JICAgIGlmICgqbCA9PSAnLCcpCi0JICAgICAgewotCQlpZiAoKisrbCA9PSBFTkRfT0ZfSU5TTikKLQkJICB7CQkvKiBqdXN0IHNraXAgaXQsIGlmIGl0J3MgXG4gY29tcGxhaW4gKi8KLQkJICAgIGdvdG8gZXhwZWN0aW5nX29wZXJhbmRfYWZ0ZXJfY29tbWE7Ci0JCSAgfQotCQlleHBlY3Rpbmdfb3BlcmFuZCA9IDE7Ci0JICAgICAgfQotCSAgfQotCXdoaWxlICgqbCAhPSBFTkRfT0ZfSU5TTik7CS8qIHVudGlsIHdlIGdldCBlbmQgb2YgaW5zbiAqLwotICAgICAgfQotICB9Ci0KLSAgLyogTm93IHdlJ3ZlIHBhcnNlZCB0aGUgbW5lbW9uaWMgaW50byBhIHNldCBvZiB0ZW1wbGF0ZXMsIGFuZCBoYXZlIHRoZQotICAgICBvcGVyYW5kcyBhdCBoYW5kLgotCi0gICAgIE5leHQsIHdlIGZpbmQgYSB0ZW1wbGF0ZSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGluc24sCi0gICAgIG1ha2luZyBzdXJlIHRoZSBvdmVybGFwIG9mIHRoZSBnaXZlbiBvcGVyYW5kcyB0eXBlcyBpcyBjb25zaXN0ZW50Ci0gICAgIHdpdGggdGhlIHRlbXBsYXRlIG9wZXJhbmQgdHlwZXMuICovCi0KLSNkZWZpbmUgTUFUQ0gob3ZlcmxhcCwgZ2l2ZW4sIHRlbXBsYXRlKSBcCi0gICgob3ZlcmxhcCkgXAotICAgJiYgKChnaXZlbikgJiBCYXNlSW5kZXgpID09ICgob3ZlcmxhcCkgJiBCYXNlSW5kZXgpIFwKLSAgICYmICgoZ2l2ZW4pICYgSnVtcEFic29sdXRlKSA9PSAoKHRlbXBsYXRlKSAmIEp1bXBBYnNvbHV0ZSkpCi0KLSAgLyogSWYgZ2l2ZW4gdHlwZXMgcjAgYW5kIHIxIGFyZSByZWdpc3RlcnMgdGhleSBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUKLSAgICAgdW5sZXNzIHRoZSBleHBlY3RlZCBvcGVyYW5kIHR5cGUgcmVnaXN0ZXIgb3ZlcmxhcCBpcyBudWxsLgotICAgICBOb3RlIHRoYXQgQWNjIGluIGEgdGVtcGxhdGUgbWF0Y2hlcyBldmVyeSBzaXplIG9mIHJlZy4gICovCi0jZGVmaW5lIENPTlNJU1RFTlRfUkVHSVNURVJfTUFUQ0gobTAsIGcwLCB0MCwgbTEsIGcxLCB0MSkgXAotICAoICgoZzApICYgUmVnKSA9PSAwIHx8ICgoZzEpICYgUmVnKSA9PSAwIHx8IFwKLSAgICAoKGcwKSAmIFJlZykgPT0gKChnMSkgJiBSZWcpIHx8IFwKLSAgICAoKCgobTApICYgQWNjKSA/IFJlZyA6ICh0MCkpICYgKCgobTEpICYgQWNjKSA/IFJlZyA6ICh0MSkpICYgUmVnKSA9PSAwICkKLQotICB7Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IG92ZXJsYXAwLCBvdmVybGFwMTsKLSAgICBleHByZXNzaW9uUyAqZXhwOwotICAgIHVuc2lnbmVkIGludCBvdmVybGFwMjsKLSAgICB1bnNpZ25lZCBpbnQgZm91bmRfcmV2ZXJzZV9tYXRjaDsKLSAgICBpbnQgc3VmZml4X2NoZWNrOwotCi0gICAgLyogQWxsIGludGVsIG9wY29kZXMgaGF2ZSByZXZlcnNlZCBvcGVyYW5kcyBleGNlcHQgZm9yIEJPVU5EIGFuZCBFTlRFUiAqLwotICAgIGlmIChpbnRlbF9zeW50YXgKLSAgICAgICAgJiYgKHN0cmNtcCAobW5lbW9uaWMsICJlbnRlciIpICE9IDApCi0gICAgICAgICYmIChzdHJjbXAgKG1uZW1vbmljLCAiYm91bmQiKSAhPSAwKQotICAgICAgICAmJiAoc3RybmNtcCAobW5lbW9uaWMsICJmc3ViIiwgNCkgIT0wKQotICAgICAgICAmJiAoc3RybmNtcCAobW5lbW9uaWMsICJmZGl2IiwgNCkgIT0wKSkKLSAgICAgIHsKLSAgICAgICAgY29uc3QgcmVnX2VudHJ5ICp0ZW1wX3JlZzsKLSAgICAgICAgZXhwcmVzc2lvblMgKnRlbXBfZGlzcDsKLSAgICAgICAgZXhwcmVzc2lvblMgKnRlbXBfaW1tOwotICAgICAgICB1bnNpZ25lZCBpbnQgdGVtcF90eXBlOwotICAgICAgICBpbnQgeGNoZzEsIHhjaGcyOwotCi0gICAgICAgIGlmIChpLm9wZXJhbmRzID09IDIpCi0gICAgICAgICAgewotICAgICAgICAgICAgeGNoZzEgPSAwOwotICAgICAgICAgICAgeGNoZzIgPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaS5vcGVyYW5kcyA9PSAzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhjaGcxID0gMDsKLSAgICAgICAgICAgIHhjaGcyID0gMjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGkub3BlcmFuZHMgPiAxKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRlbXBfdHlwZSA9IGkudHlwZXNbeGNoZzJdOwotICAgICAgICAgICAgaWYgKHRlbXBfdHlwZSAmIChSZWcgfCBGbG9hdFJlZykpCi0gICAgICAgICAgICAgIHRlbXBfcmVnID0gaS5yZWdzW3hjaGcyXTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRlbXBfdHlwZSAmIEltbSkKLSAgICAgICAgICAgICAgdGVtcF9pbW0gPSBpLmltbXNbeGNoZzJdOwotICAgICAgICAgICAgZWxzZSBpZiAodGVtcF90eXBlICYgRGlzcCkKLSAgICAgICAgICAgICAgdGVtcF9kaXNwID0gaS5kaXNwc1t4Y2hnMl07Ci0gICAgICAgICAgIAotICAgICAgICAgICAgaS50eXBlc1t4Y2hnMl0gPSBpLnR5cGVzW3hjaGcxXTsKLQotICAgICAgICAgICAgaWYgKGkudHlwZXNbeGNoZzFdICYgKFJlZyB8IEZsb2F0UmVnKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkucmVnc1t4Y2hnMl0gPSBpLnJlZ3NbeGNoZzFdOwotICAgICAgICAgICAgICAgIGkucmVnc1t4Y2hnMV0gPSBOVUxMOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChpLnR5cGVzW3hjaGcyXSAmIEltbSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkuaW1tc1t4Y2hnMl0gPSBpLmltbXNbeGNoZzFdOwotICAgICAgICAgICAgICAgIGkuaW1tc1t4Y2hnMV0gPSBOVUxMOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChpLnR5cGVzW3hjaGcyXSAmIERpc3ApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpLmRpc3BzW3hjaGcyXSA9IGkuZGlzcHNbeGNoZzFdOwotICAgICAgICAgICAgICAgIGkuZGlzcHNbeGNoZzFdID0gTlVMTDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGVtcF90eXBlICYgKFJlZyB8IEZsb2F0UmVnKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkucmVnc1t4Y2hnMV0gPSB0ZW1wX3JlZzsKLSAgICAgICAgICAgICAgICBpZiAoISAoaS50eXBlc1t4Y2hnMV0gJiAoUmVnIHwgRmxvYXRSZWcpKSkKLSAgICAgICAgICAgICAgICAgIGkucmVnc1t4Y2hnMl0gPSBOVUxMOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0ZW1wX3R5cGUgJiBJbW0pCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpLmltbXNbeGNoZzFdID0gdGVtcF9pbW07Ci0gICAgICAgICAgICAgICAgaWYgKCEgKGkudHlwZXNbeGNoZzFdICYgSW1tKSkKLSAgICAgICAgICAgICAgICAgIGkuaW1tc1t4Y2hnMl0gPSBOVUxMOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0ZW1wX3R5cGUgJiBEaXNwKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaS5kaXNwc1t4Y2hnMV0gPSB0ZW1wX2Rpc3A7Ci0gICAgICAgICAgICAgICAgaWYgKCEgKGkudHlwZXNbeGNoZzFdICYgRGlzcCkpCi0gICAgICAgICAgICAgICAgICBpLmRpc3BzW3hjaGcyXSA9IE5VTEw7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICBpLnR5cGVzW3hjaGcxXSA9IHRlbXBfdHlwZTsKLSAgICAgICAgICAgfQotICAgICAgIGlmICghc3RyY21wKG1uZW1vbmljLCJqbXAiKQotICAgICAgICAgICB8fCAhc3RyY21wIChtbmVtb25pYywgImNhbGwiKSkKLSAgICAgICAgIGlmICgoaS50eXBlc1swXSAmIFJlZykgfHwgaS50eXBlc1swXSAmIEJhc2VJbmRleCkKLSAgICAgICAgICAgaS50eXBlc1swXSB8PSBKdW1wQWJzb2x1dGU7Ci0gICAgICAgICAKLSAgICAgICB9Ci0gICAgb3ZlcmxhcDAgPSAwOwotICAgIG92ZXJsYXAxID0gMDsKLSAgICBvdmVybGFwMiA9IDA7Ci0gICAgZm91bmRfcmV2ZXJzZV9tYXRjaCA9IDA7Ci0gICAgc3VmZml4X2NoZWNrID0gKGkuc3VmZml4ID09IEJZVEVfTU5FTV9TVUZGSVgKLQkJICAgID8gTm9fYlN1ZgotCQkgICAgOiAoaS5zdWZmaXggPT0gV09SRF9NTkVNX1NVRkZJWAotCQkgICAgICAgPyBOb193U3VmCi0JCSAgICAgICA6IChpLnN1ZmZpeCA9PSBTSE9SVF9NTkVNX1NVRkZJWAotCQkJICA/IE5vX3NTdWYKLQkJCSAgOiAoaS5zdWZmaXggPT0gTE9OR19NTkVNX1NVRkZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE5vX2xTdWYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGkuc3VmZml4ID09IElOVEVMX0RXT1JEX01ORU1fU1VGRklYIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE5vX2RTdWYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGkuc3VmZml4ID09IExPTkdfRE9VQkxFX01ORU1fU1VGRklYID8gTm9feFN1ZiA6IDApKSkpKSk7Ci0KLSAgICBmb3IgKHQgPSBjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQ7Ci0JIHQgPCBjdXJyZW50X3RlbXBsYXRlcy0+ZW5kOwotCSB0KyspCi0gICAgICB7Ci0JLyogTXVzdCBoYXZlIHJpZ2h0IG51bWJlciBvZiBvcGVyYW5kcy4gKi8KLQlpZiAoaS5vcGVyYW5kcyAhPSB0LT5vcGVyYW5kcykKLQkgIGNvbnRpbnVlOwotCi0gICAgICAgIC8qIEZvciBzb21lIG9wY29kZXMsIGRvbid0IGNoZWNrIHRoZSBzdWZmaXggKi8KLSAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RyY21wICh0LT5uYW1lLCAiZm5zdGN3IikKLSAgICAgICAgICAgICAgICAmJiBzdHJjbXAgKHQtPm5hbWUsICJmbGRjdyIpCi0gICAgICAgICAgICAgICAgJiYgKHQtPm9wY29kZV9tb2RpZmllciAmIHN1ZmZpeF9jaGVjaykpCi0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgLyogTXVzdCBub3QgaGF2ZSBkaXNhbGxvd2VkIHN1ZmZpeC4gKi8gCi0gICAgICAgIGVsc2UgaWYgKCh0LT5vcGNvZGVfbW9kaWZpZXIgJiBzdWZmaXhfY2hlY2spKQotICAgICAgICAgICAgY29udGludWU7Ci0KLQllbHNlIGlmICghdC0+b3BlcmFuZHMpCi0JICBicmVhazsJCS8qIDAgb3BlcmFuZHMgYWx3YXlzIG1hdGNoZXMgKi8KLQotCW92ZXJsYXAwID0gaS50eXBlc1swXSAmIHQtPm9wZXJhbmRfdHlwZXNbMF07Ci0Jc3dpdGNoICh0LT5vcGVyYW5kcykKLQkgIHsKLQkgIGNhc2UgMToKLQkgICAgaWYgKCFNQVRDSCAob3ZlcmxhcDAsIGkudHlwZXNbMF0sIHQtPm9wZXJhbmRfdHlwZXNbMF0pKQotCSAgICAgIGNvbnRpbnVlOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkgIGNhc2UgMzoKLQkgICAgb3ZlcmxhcDEgPSBpLnR5cGVzWzFdICYgdC0+b3BlcmFuZF90eXBlc1sxXTsKLQkgICAgaWYgKCFNQVRDSCAob3ZlcmxhcDAsIGkudHlwZXNbMF0sIHQtPm9wZXJhbmRfdHlwZXNbMF0pCi0JCXx8ICFNQVRDSCAob3ZlcmxhcDEsIGkudHlwZXNbMV0sIHQtPm9wZXJhbmRfdHlwZXNbMV0pCi0JCXx8ICFDT05TSVNURU5UX1JFR0lTVEVSX01BVENIIChvdmVybGFwMCwgaS50eXBlc1swXSwKLQkJCQkJICAgICAgIHQtPm9wZXJhbmRfdHlwZXNbMF0sCi0JCQkJCSAgICAgICBvdmVybGFwMSwgaS50eXBlc1sxXSwKLQkJCQkJICAgICAgIHQtPm9wZXJhbmRfdHlwZXNbMV0pKQotCSAgICAgIHsKLQotCQkvKiBjaGVjayBpZiBvdGhlciBkaXJlY3Rpb24gaXMgdmFsaWQgLi4uICovCi0JCWlmICgodC0+b3Bjb2RlX21vZGlmaWVyICYgKER8RmxvYXREKSkgPT0gMCkKLQkJICBjb250aW51ZTsKLQotCQkvKiB0cnkgcmV2ZXJzaW5nIGRpcmVjdGlvbiBvZiBvcGVyYW5kcyAqLwotCQlvdmVybGFwMCA9IGkudHlwZXNbMF0gJiB0LT5vcGVyYW5kX3R5cGVzWzFdOwotCQlvdmVybGFwMSA9IGkudHlwZXNbMV0gJiB0LT5vcGVyYW5kX3R5cGVzWzBdOwotCQlpZiAoIU1BVENIIChvdmVybGFwMCwgaS50eXBlc1swXSwgdC0+b3BlcmFuZF90eXBlc1sxXSkKLQkJICAgIHx8ICFNQVRDSCAob3ZlcmxhcDEsIGkudHlwZXNbMV0sIHQtPm9wZXJhbmRfdHlwZXNbMF0pCi0JCSAgICB8fCAhQ09OU0lTVEVOVF9SRUdJU1RFUl9NQVRDSCAob3ZlcmxhcDAsIGkudHlwZXNbMF0sCi0JCQkJCQkgICB0LT5vcGVyYW5kX3R5cGVzWzFdLAotCQkJCQkJICAgb3ZlcmxhcDEsIGkudHlwZXNbMV0sCi0JCQkJCQkgICB0LT5vcGVyYW5kX3R5cGVzWzBdKSkKLQkJICB7Ci0JCSAgICAvKiBkb2VzIG5vdCBtYXRjaCBlaXRoZXIgZGlyZWN0aW9uICovCi0JCSAgICBjb250aW51ZTsKLQkJICB9Ci0JCS8qIGZvdW5kX3JldmVyc2VfbWF0Y2ggaG9sZHMgd2hpY2ggb2YgRCBvciBGbG9hdERSCi0JCSAgIHdlJ3ZlIGZvdW5kLiAgKi8KLQkJZm91bmRfcmV2ZXJzZV9tYXRjaCA9IHQtPm9wY29kZV9tb2RpZmllciAmIChEfEZsb2F0RFIpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIC8qIGZvdW5kIGEgZm9yd2FyZCAyIG9wZXJhbmQgbWF0Y2ggaGVyZSAqLwotCSAgICBpZiAodC0+b3BlcmFuZHMgPT0gMykKLQkgICAgICB7Ci0JCS8qIEhlcmUgd2UgbWFrZSB1c2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGVyZSBhcmUgbm8KLQkJICAgcmV2ZXJzZSBtYXRjaCAzIG9wZXJhbmQgaW5zdHJ1Y3Rpb25zLCBhbmQgYWxsIDMKLQkJICAgb3BlcmFuZCBpbnN0cnVjdGlvbnMgb25seSBuZWVkIHRvIGJlIGNoZWNrZWQgZm9yCi0JCSAgIHJlZ2lzdGVyIGNvbnNpc3RlbmN5IGJldHdlZW4gb3BlcmFuZHMgMiBhbmQgMy4gICovCi0JCW92ZXJsYXAyID0gaS50eXBlc1syXSAmIHQtPm9wZXJhbmRfdHlwZXNbMl07Ci0JCWlmICghTUFUQ0ggKG92ZXJsYXAyLCBpLnR5cGVzWzJdLCB0LT5vcGVyYW5kX3R5cGVzWzJdKQotCQkgICAgfHwgIUNPTlNJU1RFTlRfUkVHSVNURVJfTUFUQ0ggKG92ZXJsYXAxLCBpLnR5cGVzWzFdLAotCQkJCQkJICAgdC0+b3BlcmFuZF90eXBlc1sxXSwKLQkJCQkJCSAgIG92ZXJsYXAyLCBpLnR5cGVzWzJdLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5vcGVyYW5kX3R5cGVzWzJdKSkKLQotICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0JICAgICAgfQotCSAgICAvKiBmb3VuZCBlaXRoZXIgZm9yd2FyZC9yZXZlcnNlIDIgb3IgMyBvcGVyYW5kIG1hdGNoIGhlcmU6Ci0JICAgICAgIHNsaXAgdGhyb3VnaCB0byBicmVhayAqLwotCSAgfQotCWJyZWFrOwkJCS8qIHdlJ3ZlIGZvdW5kIGEgbWF0Y2g7IGJyZWFrIG91dCBvZiBsb29wICovCi0gICAgICB9CQkJCS8qIGZvciAodCA9IC4uLiAqLwotICAgIGlmICh0ID09IGN1cnJlbnRfdGVtcGxhdGVzLT5lbmQpCi0gICAgICB7CQkJCS8qIHdlIGZvdW5kIG5vIG1hdGNoICovCi0JYXNfYmFkIChfKCJzdWZmaXggb3Igb3BlcmFuZHMgaW52YWxpZCBmb3IgYCVzJyIpLAotCQljdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm5hbWUpOwotCXJldHVybjsKLSAgICAgIH0KLQotICAgIGlmICgodC0+b3Bjb2RlX21vZGlmaWVyICYgKElzUHJlZml4fElnbm9yZVNpemUpKSA9PSAoSXNQcmVmaXh8SWdub3JlU2l6ZSkpCi0gICAgICB7Ci0JLyogV2FybiB0aGVtIHRoYXQgYSBkYXRhIG9yIGFkZHJlc3Mgc2l6ZSBwcmVmaXggZG9lc24ndCBhZmZlY3QKLQkgICBhc3NlbWJseSBvZiB0aGUgbmV4dCBsaW5lIG9mIGNvZGUuICAqLwotCWFzX3dhcm4gKF8oInN0YW5kLWFsb25lIGAlcycgcHJlZml4IiksIHQtPm5hbWUpOwotICAgICAgfQotCi0gICAgLyogQ29weSB0aGUgdGVtcGxhdGUgd2UgZm91bmQuICAqLwotICAgIGkudG0gPSAqdDsKLSAgICBpZiAoZm91bmRfcmV2ZXJzZV9tYXRjaCkKLSAgICAgIHsKLQlpLnRtLm9wZXJhbmRfdHlwZXNbMF0gPSB0LT5vcGVyYW5kX3R5cGVzWzFdOwotCWkudG0ub3BlcmFuZF90eXBlc1sxXSA9IHQtPm9wZXJhbmRfdHlwZXNbMF07Ci0gICAgICB9Ci0KLQotICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIEZXYWl0KQotICAgICAgaWYgKCEgYWRkX3ByZWZpeCAoRldBSVRfT1BDT0RFKSkKLQlyZXR1cm47Ci0KLSAgICAvKiBDaGVjayBzdHJpbmcgaW5zdHJ1Y3Rpb24gc2VnbWVudCBvdmVycmlkZXMgKi8KLSAgICBpZiAoKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgSXNTdHJpbmcpICE9IDAgJiYgaS5tZW1fb3BlcmFuZHMgIT0gMCkKLSAgICAgIHsKLQlpbnQgbWVtX29wID0gKGkudHlwZXNbMF0gJiBBbnlNZW0pID8gMCA6IDE7Ci0JaWYgKChpLnRtLm9wZXJhbmRfdHlwZXNbbWVtX29wXSAmIEVzU2VnKSAhPSAwKQotCSAgewotCSAgICBpZiAoaS5zZWdbMF0gIT0gTlVMTCAmJiBpLnNlZ1swXSAhPSAmZXMpCi0JICAgICAgewotCQlhc19iYWQgKF8oImAlcycgb3BlcmFuZCAlZCBtdXN0IHVzZSBgJSVlcycgc2VnbWVudCIpLAotCQkJaS50bS5uYW1lLAotCQkJbWVtX29wICsgMSk7Ci0JCXJldHVybjsKLQkgICAgICB9Ci0JICAgIC8qIFRoZXJlJ3Mgb25seSBldmVyIG9uZSBzZWdtZW50IG92ZXJyaWRlIGFsbG93ZWQgcGVyIGluc3RydWN0aW9uLgotCSAgICAgICBUaGlzIGluc3RydWN0aW9uIHBvc3NpYmx5IGhhcyBhIGxlZ2FsIHNlZ21lbnQgb3ZlcnJpZGUgb24gdGhlCi0JICAgICAgIHNlY29uZCBvcGVyYW5kLCBzbyBjb3B5IHRoZSBzZWdtZW50IHRvIHdoZXJlIG5vbi1zdHJpbmcKLQkgICAgICAgaW5zdHJ1Y3Rpb25zIHN0b3JlIGl0LCBhbGxvd2luZyBjb21tb24gY29kZS4gICovCi0JICAgIGkuc2VnWzBdID0gaS5zZWdbMV07Ci0JICB9Ci0JZWxzZSBpZiAoKGkudG0ub3BlcmFuZF90eXBlc1ttZW1fb3AgKyAxXSAmIEVzU2VnKSAhPSAwKQotCSAgewotCSAgICBpZiAoaS5zZWdbMV0gIT0gTlVMTCAmJiBpLnNlZ1sxXSAhPSAmZXMpCi0JICAgICAgewotCQlhc19iYWQgKF8oImAlcycgb3BlcmFuZCAlZCBtdXN0IHVzZSBgJSVlcycgc2VnbWVudCIpLAotCQkJaS50bS5uYW1lLAotCQkJbWVtX29wICsgMik7Ci0JCXJldHVybjsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAvKiBJZiBtYXRjaGVkIGluc3RydWN0aW9uIHNwZWNpZmllcyBhbiBleHBsaWNpdCBpbnN0cnVjdGlvbiBtbmVtb25pYwotICAgICAgIHN1ZmZpeCwgdXNlIGl0LiAgKi8KLSAgICBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiAoU2l6ZTE2IHwgU2l6ZTMyKSkKLSAgICAgIHsKLQlpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBTaXplMTYpCi0JICBpLnN1ZmZpeCA9IFdPUkRfTU5FTV9TVUZGSVg7Ci0JZWxzZQotCSAgaS5zdWZmaXggPSBEV09SRF9NTkVNX1NVRkZJWDsKLSAgICAgIH0KLSAgICBlbHNlIGlmIChpLnJlZ19vcGVyYW5kcykKLSAgICAgIHsKLQkvKiBJZiB0aGVyZSdzIG5vIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCB3ZSB0cnkgdG8gaW52ZW50IG9uZQotCSAgIGJhc2VkIG9uIHJlZ2lzdGVyIG9wZXJhbmRzLiAqLwotCWlmICghaS5zdWZmaXgpCi0JICB7Ci0JICAgIC8qIFdlIHRha2UgaS5zdWZmaXggZnJvbSB0aGUgbGFzdCByZWdpc3RlciBvcGVyYW5kIHNwZWNpZmllZCwKLQkgICAgICAgRGVzdGluYXRpb24gcmVnaXN0ZXIgdHlwZSBpcyBtb3JlIHNpZ25pZmljYW50IHRoYW4gc291cmNlCi0JICAgICAgIHJlZ2lzdGVyIHR5cGUuICAqLwotCSAgICBpbnQgb3A7Ci0JICAgIGZvciAob3AgPSBpLm9wZXJhbmRzOyAtLW9wID49IDA7ICkKLQkgICAgICBpZiAoaS50eXBlc1tvcF0gJiBSZWcpCi0JCXsKLQkJICBpLnN1ZmZpeCA9ICgoaS50eXBlc1tvcF0gJiBSZWc4KSA/IEJZVEVfTU5FTV9TVUZGSVggOgotCQkJICAgICAgKGkudHlwZXNbb3BdICYgUmVnMTYpID8gV09SRF9NTkVNX1NVRkZJWCA6Ci0JCQkgICAgICBEV09SRF9NTkVNX1NVRkZJWCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgIH0KLQllbHNlIGlmIChpLnN1ZmZpeCA9PSBCWVRFX01ORU1fU1VGRklYKQotCSAgewotCSAgICBpbnQgb3A7Ci0JICAgIGZvciAob3AgPSBpLm9wZXJhbmRzOyAtLW9wID49IDA7ICkKLQkgICAgICB7Ci0JCS8qIElmIHRoaXMgaXMgYW4gZWlnaHQgYml0IHJlZ2lzdGVyLCBpdCdzIE9LLiAgSWYgaXQncwotCQkgICB0aGUgMTYgb3IgMzIgYml0IHZlcnNpb24gb2YgYW4gZWlnaHQgYml0IHJlZ2lzdGVyLAotCQkgICB3ZSB3aWxsIGp1c3QgdXNlIHRoZSBsb3cgcG9ydGlvbiwgYW5kIHRoYXQncyBPSyB0b28uICovCi0JCWlmIChpLnR5cGVzW29wXSAmIFJlZzgpCi0JCSAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICAvKiBtb3Z6eCBhbmQgbW92c3ggc2hvdWxkIG5vdCBnZW5lcmF0ZSB0aGlzIHdhcm5pbmcuICovCi0gICAgICAgICAgICAgICAgaWYgKGludGVsX3N5bnRheAotICAgICAgICAgICAgICAgICAgICAmJiAoaS50bS5iYXNlX29wY29kZSA9PSAweGZiNwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgaS50bS5iYXNlX29wY29kZSA9PSAweGZiNgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgaS50bS5iYXNlX29wY29kZSA9PSAweGZiZQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgaS50bS5iYXNlX29wY29kZSA9PSAweGZiZikpCi0gICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotCQlpZiAoKGkudHlwZXNbb3BdICYgV29yZFJlZykgJiYgaS5yZWdzW29wXS0+cmVnX251bSA8IDQKLSNpZiAwCi0JCSAgICAvKiBDaGVjayB0aGF0IHRoZSB0ZW1wbGF0ZSBhbGxvd3MgZWlnaHQgYml0IHJlZ3MKLQkJICAgICAgIFRoaXMga2lsbHMgaW5zbnMgc3VjaCBhcyBgb3JiICQxLCVlZHgnLCB3aGljaAotCQkgICAgICAgbWF5YmUgc2hvdWxkIGJlIGFsbG93ZWQuICAqLwotCQkgICAgJiYgKGkudG0ub3BlcmFuZF90eXBlc1tvcF0gJiAoUmVnOHxJbk91dFBvcnRSZWcpKQotI2VuZGlmCi0JCSAgICApCi0JCSAgewotI2lmIFJFR0lTVEVSX1dBUk5JTkdTCi0JCSAgICBpZiAoKGkudG0ub3BlcmFuZF90eXBlc1tvcF0gJiBJbk91dFBvcnRSZWcpID09IDApCi0JCSAgICAgIGFzX3dhcm4gKF8oInVzaW5nIGAlJSVzJyBpbnN0ZWFkIG9mIGAlJSVzJyBkdWUgdG8gYCVjJyBzdWZmaXgiKSwKLQkJCSAgICAgICAoaS5yZWdzW29wXSAtIChpLnR5cGVzW29wXSAmIFJlZzE2ID8gOCA6IDE2KSktPnJlZ19uYW1lLAotCQkJICAgICAgIGkucmVnc1tvcF0tPnJlZ19uYW1lLAotCQkJICAgICAgIGkuc3VmZml4KTsKLSNlbmRpZgotCQkgICAgY29udGludWU7Ci0JCSAgfQotCQkvKiBBbnkgb3RoZXIgcmVnaXN0ZXIgaXMgYmFkICovCi0JCWlmIChpLnR5cGVzW29wXSAmIChSZWcgfCBSZWdNTVggfCBSZWdYTU0KLQkJCQkgICB8IFNSZWcyIHwgU1JlZzMKLQkJCQkgICB8IENvbnRyb2wgfCBEZWJ1ZyB8IFRlc3QKLQkJCQkgICB8IEZsb2F0UmVnIHwgRmxvYXRBY2MpKQotCQkgIHsKLQkJICAgIGFzX2JhZCAoXygiYCUlJXMnIG5vdCBhbGxvd2VkIHdpdGggYCVzJWMnIiksCi0JCQkgICAgaS5yZWdzW29wXS0+cmVnX25hbWUsCi0JCQkgICAgaS50bS5uYW1lLAotCQkJICAgIGkuc3VmZml4KTsKLQkJICAgIHJldHVybjsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCWVsc2UgaWYgKGkuc3VmZml4ID09IERXT1JEX01ORU1fU1VGRklYKQotCSAgewotCSAgICBpbnQgb3A7Ci0JICAgIGZvciAob3AgPSBpLm9wZXJhbmRzOyAtLW9wID49IDA7ICkKLQkgICAgICAvKiBSZWplY3QgZWlnaHQgYml0IHJlZ2lzdGVycywgZXhjZXB0IHdoZXJlIHRoZSB0ZW1wbGF0ZQotCQkgcmVxdWlyZXMgdGhlbS4gKGVnLiBtb3Z6YikgICovCi0JICAgICAgaWYgKChpLnR5cGVzW29wXSAmIFJlZzgpICE9IDAKLQkJICAmJiAoaS50bS5vcGVyYW5kX3R5cGVzW29wXSAmIChSZWcxNnxSZWczMnxBY2MpKSAhPSAwKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJgJSUlcycgbm90IGFsbG93ZWQgd2l0aCBgJXMlYyciKSwKLQkJCSAgaS5yZWdzW29wXS0+cmVnX25hbWUsCi0JCQkgIGkudG0ubmFtZSwKLQkJCSAgaS5zdWZmaXgpOwotCQkgIHJldHVybjsKLQkJfQotI2lmIFJFR0lTVEVSX1dBUk5JTkdTCi0JICAgICAgLyogV2FybiBpZiB0aGUgZSBwcmVmaXggb24gYSBnZW5lcmFsIHJlZyBpcyBtaXNzaW5nLiAgKi8KLQkgICAgICBlbHNlIGlmICgoaS50eXBlc1tvcF0gJiBSZWcxNikgIT0gMAotCQkgICAgICAgJiYgKGkudG0ub3BlcmFuZF90eXBlc1tvcF0gJiAoUmVnMzJ8QWNjKSkgIT0gMCkKLQkJewotCQkgIGFzX3dhcm4gKF8oInVzaW5nIGAlJSVzJyBpbnN0ZWFkIG9mIGAlJSVzJyBkdWUgdG8gYCVjJyBzdWZmaXgiKSwKLQkJCSAgIChpLnJlZ3Nbb3BdICsgOCktPnJlZ19uYW1lLAotCQkJICAgaS5yZWdzW29wXS0+cmVnX25hbWUsCi0JCQkgICBpLnN1ZmZpeCk7Ci0JCX0KLSNlbmRpZgotCSAgfQotCWVsc2UgaWYgKGkuc3VmZml4ID09IFdPUkRfTU5FTV9TVUZGSVgpCi0JICB7Ci0JICAgIGludCBvcDsKLQkgICAgZm9yIChvcCA9IGkub3BlcmFuZHM7IC0tb3AgPj0gMDsgKQotCSAgICAgIC8qIFJlamVjdCBlaWdodCBiaXQgcmVnaXN0ZXJzLCBleGNlcHQgd2hlcmUgdGhlIHRlbXBsYXRlCi0JCSByZXF1aXJlcyB0aGVtLiAoZWcuIG1vdnpiKSAgKi8KLQkgICAgICBpZiAoKGkudHlwZXNbb3BdICYgUmVnOCkgIT0gMAotCQkgICYmIChpLnRtLm9wZXJhbmRfdHlwZXNbb3BdICYgKFJlZzE2fFJlZzMyfEFjYykpICE9IDApCi0JCXsKLQkJICBhc19iYWQgKF8oImAlJSVzJyBub3QgYWxsb3dlZCB3aXRoIGAlcyVjJyIpLAotCQkJICBpLnJlZ3Nbb3BdLT5yZWdfbmFtZSwKLQkJCSAgaS50bS5uYW1lLAotCQkJICBpLnN1ZmZpeCk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0jaWYgUkVHSVNURVJfV0FSTklOR1MKLQkgICAgICAvKiBXYXJuIGlmIHRoZSBlIHByZWZpeCBvbiBhIGdlbmVyYWwgcmVnIGlzIHByZXNlbnQuICAqLwotCSAgICAgIGVsc2UgaWYgKChpLnR5cGVzW29wXSAmIFJlZzMyKSAhPSAwCi0JCSAgICAgICAmJiAoaS50bS5vcGVyYW5kX3R5cGVzW29wXSAmIChSZWcxNnxBY2MpKSAhPSAwKQotCQl7Ci0JCSAgYXNfd2FybiAoXygidXNpbmcgYCUlJXMnIGluc3RlYWQgb2YgYCUlJXMnIGR1ZSB0byBgJWMnIHN1ZmZpeCIpLAotCQkJICAgKGkucmVnc1tvcF0gLSA4KS0+cmVnX25hbWUsCi0JCQkgICBpLnJlZ3Nbb3BdLT5yZWdfbmFtZSwKLQkJCSAgIGkuc3VmZml4KTsKLQkJfQotI2VuZGlmCi0JICB9Ci0JZWxzZQotCSAgYWJvcnQoKTsKLSAgICAgIH0KLQotICAgIC8qIE1ha2Ugc3RpbGwgdW5yZXNvbHZlZCBpbW1lZGlhdGUgbWF0Y2hlcyBjb25mb3JtIHRvIHNpemUgb2YgaW1tZWRpYXRlCi0gICAgICAgZ2l2ZW4gaW4gaS5zdWZmaXguICBOb3RlOiBvdmVybGFwMiBjYW5ub3QgYmUgYW4gaW1tZWRpYXRlISAgKi8KLSAgICBpZiAoKG92ZXJsYXAwICYgKEltbTggfCBJbW04UyB8IEltbTE2IHwgSW1tMzIpKQotCSYmIG92ZXJsYXAwICE9IEltbTggJiYgb3ZlcmxhcDAgIT0gSW1tOFMKLQkmJiBvdmVybGFwMCAhPSBJbW0xNiAmJiBvdmVybGFwMCAhPSBJbW0zMikKLSAgICAgIHsKLQlpZiAoaS5zdWZmaXgpCi0JICB7Ci0JICAgb3ZlcmxhcDAgJj0gKGkuc3VmZml4ID09IEJZVEVfTU5FTV9TVUZGSVggPyAoSW1tOCB8IEltbThTKSA6Ci0JCQkoaS5zdWZmaXggPT0gV09SRF9NTkVNX1NVRkZJWCA/IEltbTE2IDogSW1tMzIpKTsKLQkgIH0KLQllbHNlIGlmIChvdmVybGFwMCA9PSAoSW1tMTYgfCBJbW0zMikpCi0JICB7Ci0JICAgb3ZlcmxhcDAgPQotCSAgICAgIChmbGFnXzE2Yml0X2NvZGUgXiAoaS5wcmVmaXhbREFUQV9QUkVGSVhdICE9IDApKSA/IEltbTE2IDogSW1tMzI7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBhc19iYWQgKF8oIm5vIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBnaXZlbjsgY2FuJ3QgZGV0ZXJtaW5lIGltbWVkaWF0ZSBzaXplIikpOwotCSAgICByZXR1cm47Ci0JICB9Ci0gICAgICB9Ci0gICAgaWYgKChvdmVybGFwMSAmIChJbW04IHwgSW1tOFMgfCBJbW0xNiB8IEltbTMyKSkKLQkmJiBvdmVybGFwMSAhPSBJbW04ICYmIG92ZXJsYXAxICE9IEltbThTCi0JJiYgb3ZlcmxhcDEgIT0gSW1tMTYgJiYgb3ZlcmxhcDEgIT0gSW1tMzIpCi0gICAgICB7Ci0JaWYgKGkuc3VmZml4KQotCSAgewotCSAgIG92ZXJsYXAxICY9IChpLnN1ZmZpeCA9PSBCWVRFX01ORU1fU1VGRklYID8gKEltbTggfCBJbW04UykgOgotCQkJKGkuc3VmZml4ID09IFdPUkRfTU5FTV9TVUZGSVggPyBJbW0xNiA6IEltbTMyKSk7Ci0JICB9Ci0JZWxzZSBpZiAob3ZlcmxhcDEgPT0gKEltbTE2IHwgSW1tMzIpKQotCSAgewotCSAgIG92ZXJsYXAxID0KLQkgICAgICAoZmxhZ18xNmJpdF9jb2RlIF4gKGkucHJlZml4W0RBVEFfUFJFRklYXSAhPSAwKSkgPyBJbW0xNiA6IEltbTMyOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgYXNfYmFkIChfKCJubyBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggZ2l2ZW47IGNhbid0IGRldGVybWluZSBpbW1lZGlhdGUgc2l6ZSIpKTsKLQkgICAgcmV0dXJuOwotCSAgfQotICAgICAgfQotICAgIGFzc2VydCAoKG92ZXJsYXAyICYgSW1tKSA9PSAwKTsKLQotICAgIGkudHlwZXNbMF0gPSBvdmVybGFwMDsKLSAgICBpZiAob3ZlcmxhcDAgJiBJbXBsaWNpdFJlZ2lzdGVyKQotICAgICAgaS5yZWdfb3BlcmFuZHMtLTsKLSAgICBpZiAob3ZlcmxhcDAgJiBJbW0xKQotICAgICAgaS5pbW1fb3BlcmFuZHMgPSAwOwkvKiBrbHVkZ2UgZm9yIHNoaWZ0IGluc25zICovCi0KLSAgICBpLnR5cGVzWzFdID0gb3ZlcmxhcDE7Ci0gICAgaWYgKG92ZXJsYXAxICYgSW1wbGljaXRSZWdpc3RlcikKLSAgICAgIGkucmVnX29wZXJhbmRzLS07Ci0KLSAgICBpLnR5cGVzWzJdID0gb3ZlcmxhcDI7Ci0gICAgaWYgKG92ZXJsYXAyICYgSW1wbGljaXRSZWdpc3RlcikKLSAgICAgIGkucmVnX29wZXJhbmRzLS07Ci0KLSAgICAvKiBGaW5hbGl6ZSBvcGNvZGUuICBGaXJzdCwgd2UgY2hhbmdlIHRoZSBvcGNvZGUgYmFzZWQgb24gdGhlIG9wZXJhbmQKLSAgICAgICBzaXplIGdpdmVuIGJ5IGkuc3VmZml4OiAgV2UgbmVlZCBub3QgY2hhbmdlIHRoaW5ncyBmb3IgYnl0ZSBpbnNucy4gICovCi0KLSAgICBpZiAoIWkuc3VmZml4ICYmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIFcpKQotICAgICAgewotCWFzX2JhZCAoXygibm8gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IGdpdmVuIGFuZCBubyByZWdpc3RlciBvcGVyYW5kczsgY2FuJ3Qgc2l6ZSBpbnN0cnVjdGlvbiIpKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0KLSAgICAvKiBGb3IgbW92enggYW5kIG1vdnN4LCBuZWVkIHRvIGNoZWNrIHRoZSByZWdpc3RlciB0eXBlICovCi0gICAgaWYgKGludGVsX3N5bnRheAotICAgICAgICAmJiAoaS50bS5iYXNlX29wY29kZSA9PSAweGZiNiB8fCBpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZmJlKSkKLSAgICAgIGlmIChpLnN1ZmZpeCAmJiBpLnN1ZmZpeCA9PSBCWVRFX01ORU1fU1VGRklYKQotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgaW50IHByZWZpeCA9IERBVEFfUFJFRklYX09QQ09ERTsKLQotICAgICAgICAgIGlmICgoaS5yZWdzWzFdLT5yZWdfdHlwZSAmIFJlZzE2KSAhPSAwKQotICAgICAgICAgICAgaWYgKCFhZGRfcHJlZml4IChwcmVmaXgpKQotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgIGlmIChpLnN1ZmZpeCAmJiBpLnN1ZmZpeCAhPSBCWVRFX01ORU1fU1VGRklYKQotICAgICAgewotCS8qIEl0J3Mgbm90IGEgYnl0ZSwgc2VsZWN0IHdvcmQvZHdvcmQgb3BlcmF0aW9uLiAgKi8KLQlpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBXKQotCSAgewotCSAgICBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBTaG9ydEZvcm0pCi0JICAgICAgaS50bS5iYXNlX29wY29kZSB8PSA4OwotCSAgICBlbHNlCi0JICAgICAgaS50bS5iYXNlX29wY29kZSB8PSAxOwotCSAgfQotCS8qIE5vdyBzZWxlY3QgYmV0d2VlbiB3b3JkICYgZHdvcmQgb3BlcmF0aW9ucyB2aWEgdGhlIG9wZXJhbmQKLQkgICBzaXplIHByZWZpeCwgZXhjZXB0IGZvciBpbnN0cnVjdGlvbnMgdGhhdCB3aWxsIGlnbm9yZSB0aGlzCi0JICAgcHJlZml4IGFueXdheS4gICovCi0JaWYgKCgoaW50ZWxfc3ludGF4ICYmIChpLnN1ZmZpeCA9PSBJTlRFTF9EV09SRF9NTkVNX1NVRkZJWCkpCi0gICAgICAgICAgICAgfHwgaS5zdWZmaXggPT0gRFdPUkRfTU5FTV9TVUZGSVgKLQkgICAgIHx8IGkuc3VmZml4ID09IExPTkdfTU5FTV9TVUZGSVgpID09IGZsYWdfMTZiaXRfY29kZQotCSAgICAmJiAhKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgSWdub3JlU2l6ZSkpCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBwcmVmaXggPSBEQVRBX1BSRUZJWF9PUENPREU7Ci0JICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIEp1bXBCeXRlKSAvKiBqY3h6LCBsb29wICovCi0JICAgICAgcHJlZml4ID0gQUREUl9QUkVGSVhfT1BDT0RFOwotCi0JICAgIGlmICghIGFkZF9wcmVmaXggKHByZWZpeCkpCi0JICAgICAgcmV0dXJuOwotCSAgfQotCS8qIFNpemUgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24uICAqLwotCWlmIChpLnN1ZmZpeCA9PSBMT05HX01ORU1fU1VGRklYCi0gICAgICAgICAgICB8fCAoaW50ZWxfc3ludGF4ICYmIGkuc3VmZml4ID09IElOVEVMX0RXT1JEX01ORU1fU1VGRklYKSkKLQkgIHsKLQkgICAgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgRmxvYXRNRikKLQkgICAgICBpLnRtLmJhc2Vfb3Bjb2RlIF49IDQ7Ci0JICB9Ci0KLSAgICAgICAgaWYgKGludGVsX3N5bnRheCAmJiBpLnN1ZmZpeCA9PSBMT05HX0RPVUJMRV9NTkVNX1NVRkZJWCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBGbG9hdE1GKQotICAgICAgICAgICAgICBpLnRtLmJhc2Vfb3Bjb2RlIF49IDI7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgSW1tRXh0KQotICAgICAgewotCS8qIFRoZXNlIEFNRCAzRE5vdyEgYW5kIEludGVsIEthdG1haSBOZXcgSW5zdHJ1Y3Rpb25zIGhhdmUgYW4KLQkgICBvcGNvZGUgc3VmZml4IHdoaWNoIGlzIGNvZGVkIGluIHRoZSBzYW1lIHBsYWNlIGFzIGFuIDgtYml0Ci0JICAgaW1tZWRpYXRlIGZpZWxkIHdvdWxkIGJlLiAgSGVyZSB3ZSBmYWtlIGFuIDgtYml0IGltbWVkaWF0ZQotCSAgIG9wZXJhbmQgZnJvbSB0aGUgb3Bjb2RlIHN1ZmZpeCBzdG9yZWQgaW4gdG0uZXh0ZW5zaW9uX29wY29kZS4gICovCi0KLQlleHByZXNzaW9uUyAqZXhwOwotCi0JYXNzZXJ0KGkuaW1tX29wZXJhbmRzID09IDAgJiYgaS5vcGVyYW5kcyA8PSAyKTsKLQotCWV4cCA9ICZpbV9leHByZXNzaW9uc1tpLmltbV9vcGVyYW5kcysrXTsKLQlpLmltbXNbaS5vcGVyYW5kc10gPSBleHA7Ci0JaS50eXBlc1tpLm9wZXJhbmRzKytdID0gSW1tODsKLQlleHAtPlhfb3AgPSBPX2NvbnN0YW50OwotCWV4cC0+WF9hZGRfbnVtYmVyID0gaS50bS5leHRlbnNpb25fb3Bjb2RlOwotCWkudG0uZXh0ZW5zaW9uX29wY29kZSA9IE5vbmU7Ci0gICAgICB9Ci0KLSAgICAvKiBGb3IgaW5zbnMgd2l0aCBvcGVyYW5kcyB0aGVyZSBhcmUgbW9yZSBkaWRkbGVzIHRvIGRvIHRvIHRoZSBvcGNvZGUuICovCi0gICAgaWYgKGkub3BlcmFuZHMpCi0gICAgICB7Ci0gICAgICAgIC8qIERlZmF1bHQgc2VnbWVudCByZWdpc3RlciB0aGlzIGluc3RydWN0aW9uIHdpbGwgdXNlCi0JICAgZm9yIG1lbW9yeSBhY2Nlc3Nlcy4gIDAgbWVhbnMgdW5rbm93bi4KLQkgICBUaGlzIGlzIG9ubHkgZm9yIG9wdGltaXppbmcgb3V0IHVubmVjZXNzYXJ5IHNlZ21lbnQgb3ZlcnJpZGVzLiAgKi8KLQljb25zdCBzZWdfZW50cnkgKmRlZmF1bHRfc2VnID0gMDsKLQotCS8qIElmIHdlIGZvdW5kIGEgcmV2ZXJzZSBtYXRjaCB3ZSBtdXN0IGFsdGVyIHRoZSBvcGNvZGUKLQkgICBkaXJlY3Rpb24gYml0LiAgZm91bmRfcmV2ZXJzZV9tYXRjaCBob2xkcyBiaXRzIHRvIGNoYW5nZQotCSAgIChkaWZmZXJlbnQgZm9yIGludCAmIGZsb2F0IGluc25zKS4gICovCi0KLQlpLnRtLmJhc2Vfb3Bjb2RlIF49IGZvdW5kX3JldmVyc2VfbWF0Y2g7Ci0KLQkvKiBUaGUgaW11bCAkaW1tLCAlcmVnIGluc3RydWN0aW9uIGlzIGNvbnZlcnRlZCBpbnRvCi0JICAgaW11bCAkaW1tLCAlcmVnLCAlcmVnLCBhbmQgdGhlIGNsciAlcmVnIGluc3RydWN0aW9uCi0JICAgaXMgY29udmVydGVkIGludG8geG9yICVyZWcsICVyZWcuICAqLwotCWlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIHJlZ0tsdWRnZSkKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IGZpcnN0X3JlZ19vcCA9IChpLnR5cGVzWzBdICYgUmVnKSA/IDAgOiAxOwotCSAgICAvKiBQcmV0ZW5kIHdlIHNhdyB0aGUgZXh0cmEgcmVnaXN0ZXIgb3BlcmFuZC4gKi8KLQkgICAgaS5yZWdzW2ZpcnN0X3JlZ19vcCsxXSA9IGkucmVnc1tmaXJzdF9yZWdfb3BdOwotCSAgICBpLnJlZ19vcGVyYW5kcyA9IDI7Ci0JICB9Ci0KLQlpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBTaG9ydEZvcm0pCi0JICB7Ci0JICAgIC8qIFRoZSByZWdpc3RlciBvciBmbG9hdCByZWdpc3RlciBvcGVyYW5kIGlzIGluIG9wZXJhbmQgMCBvciAxLiAqLwotCSAgICB1bnNpZ25lZCBpbnQgb3AgPSAoaS50eXBlc1swXSAmIChSZWcgfCBGbG9hdFJlZykpID8gMCA6IDE7Ci0JICAgIC8qIFJlZ2lzdGVyIGdvZXMgaW4gbG93IDMgYml0cyBvZiBvcGNvZGUuICovCi0JICAgIGkudG0uYmFzZV9vcGNvZGUgfD0gaS5yZWdzW29wXS0+cmVnX251bTsKLQkgICAgaWYgKChpLnRtLm9wY29kZV9tb2RpZmllciAmIFVnaCkgIT0gMCkKLQkgICAgICB7Ci0JCS8qIFdhcm4gYWJvdXQgc29tZSBjb21tb24gZXJyb3JzLCBidXQgcHJlc3Mgb24gcmVnYXJkbGVzcy4KLQkJICAgVGhlIGZpcnN0IGNhc2UgY2FuIGJlIGdlbmVyYXRlZCBieSBnY2MgKDw9IDIuOC4xKS4gICovCi0JCWlmIChpLm9wZXJhbmRzID09IDIpCi0JCSAgewotCQkgICAgLyogcmV2ZXJzZWQgYXJndW1lbnRzIG9uIGZhZGRwLCBmc3VicCwgZXRjLiAqLwotCQkgICAgYXNfd2FybiAoXygidHJhbnNsYXRpbmcgdG8gYCVzICUlJXMsJSUlcyciKSwgaS50bS5uYW1lLAotCQkJICAgICBpLnJlZ3NbMV0tPnJlZ19uYW1lLAotCQkJICAgICBpLnJlZ3NbMF0tPnJlZ19uYW1lKTsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICAvKiBleHRyYW5lb3VzIGBsJyBzdWZmaXggb24gZnAgaW5zbiAqLwotCQkgICAgYXNfd2FybiAoXygidHJhbnNsYXRpbmcgdG8gYCVzICUlJXMnIiksIGkudG0ubmFtZSwKLQkJCSAgICAgaS5yZWdzWzBdLT5yZWdfbmFtZSk7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQllbHNlIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIE1vZHJtKQotCSAgewotCSAgICAvKiBUaGUgb3Bjb2RlIGlzIGNvbXBsZXRlZCAobW9kdWxvIGkudG0uZXh0ZW5zaW9uX29wY29kZSB3aGljaAotCSAgICAgICBtdXN0IGJlIHB1dCBpbnRvIHRoZSBtb2RybSBieXRlKS4KLQkgICAgICAgTm93LCB3ZSBtYWtlIHRoZSBtb2RybSAmIGluZGV4IGJhc2UgYnl0ZXMgYmFzZWQgb24gYWxsIHRoZQotCSAgICAgICBpbmZvIHdlJ3ZlIGNvbGxlY3RlZC4gKi8KLQotCSAgICAvKiBpLnJlZ19vcGVyYW5kcyBNVVNUIGJlIHRoZSBudW1iZXIgb2YgcmVhbCByZWdpc3RlciBvcGVyYW5kczsKLQkgICAgICAgaW1wbGljaXQgcmVnaXN0ZXJzIGRvIG5vdCBjb3VudC4gKi8KLQkgICAgaWYgKGkucmVnX29wZXJhbmRzID09IDIpCi0JICAgICAgewotCQl1bnNpZ25lZCBpbnQgc291cmNlLCBkZXN0OwotCQlzb3VyY2UgPSAoKGkudHlwZXNbMF0KLQkJCSAgICYgKFJlZyB8IFJlZ01NWCB8IFJlZ1hNTQotCQkJICAgICAgfCBTUmVnMiB8IFNSZWczCi0JCQkgICAgICB8IENvbnRyb2wgfCBEZWJ1ZyB8IFRlc3QpKQotCQkJICA/IDAgOiAxKTsKLQkJZGVzdCA9IHNvdXJjZSArIDE7Ci0KLQkJaS5ybS5tb2RlID0gMzsKLQkJLyogT25lIG9mIHRoZSByZWdpc3RlciBvcGVyYW5kcyB3aWxsIGJlIGVuY29kZWQgaW4gdGhlCi0JCSAgIGkudG0ucmVnIGZpZWxkLCB0aGUgb3RoZXIgaW4gdGhlIGNvbWJpbmVkIGkudG0ubW9kZQotCQkgICBhbmQgaS50bS5yZWdtZW0gZmllbGRzLiAgSWYgbm8gZm9ybSBvZiB0aGlzCi0JCSAgIGluc3RydWN0aW9uIHN1cHBvcnRzIGEgbWVtb3J5IGRlc3RpbmF0aW9uIG9wZXJhbmQsCi0JCSAgIHRoZW4gd2UgYXNzdW1lIHRoZSBzb3VyY2Ugb3BlcmFuZCBtYXkgc29tZXRpbWVzIGJlCi0JCSAgIGEgbWVtb3J5IG9wZXJhbmQgYW5kIHNvIHdlIG5lZWQgdG8gc3RvcmUgdGhlCi0JCSAgIGRlc3RpbmF0aW9uIGluIHRoZSBpLnJtLnJlZyBmaWVsZC4gICovCi0JCWlmICgoaS50bS5vcGVyYW5kX3R5cGVzW2Rlc3RdICYgQW55TWVtKSA9PSAwKQotCQkgIHsKLQkJICAgIGkucm0ucmVnID0gaS5yZWdzW2Rlc3RdLT5yZWdfbnVtOwotCQkgICAgaS5ybS5yZWdtZW0gPSBpLnJlZ3Nbc291cmNlXS0+cmVnX251bTsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBpLnJtLnJlZyA9IGkucmVnc1tzb3VyY2VdLT5yZWdfbnVtOwotCQkgICAgaS5ybS5yZWdtZW0gPSBpLnJlZ3NbZGVzdF0tPnJlZ19udW07Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsJCQkvKiBpZiBpdCdzIG5vdCAyIHJlZyBvcGVyYW5kcy4uLiAqLwotCQlpZiAoaS5tZW1fb3BlcmFuZHMpCi0JCSAgewotCQkgICAgdW5zaWduZWQgaW50IGZha2VfemVyb19kaXNwbGFjZW1lbnQgPSAwOwotCQkgICAgdW5zaWduZWQgaW50IG9wID0gKChpLnR5cGVzWzBdICYgQW55TWVtKQotCQkJCSAgICAgICA/IDAKLQkJCQkgICAgICAgOiAoaS50eXBlc1sxXSAmIEFueU1lbSkgPyAxIDogMik7Ci0KLQkJICAgIGRlZmF1bHRfc2VnID0gJmRzOwotCi0JCSAgICBpZiAoISBpLmJhc2VfcmVnKQotCQkgICAgICB7Ci0JCQlpLnJtLm1vZGUgPSAwOwotCQkJaWYgKCEgaS5kaXNwX29wZXJhbmRzKQotCQkJICBmYWtlX3plcm9fZGlzcGxhY2VtZW50ID0gMTsKLQkJCWlmICghIGkuaW5kZXhfcmVnKQotCQkJICB7Ci0JCQkgICAgLyogT3BlcmFuZCBpcyBqdXN0IDxkaXNwPiAqLwotCQkJICAgIGlmIChmbGFnXzE2Yml0X2NvZGUgXiAoaS5wcmVmaXhbQUREUl9QUkVGSVhdICE9IDApKQotCQkJICAgICAgewotCQkJCWkucm0ucmVnbWVtID0gTk9fQkFTRV9SRUdJU1RFUl8xNjsKLQkJCQlpLnR5cGVzW29wXSAmPSB+RGlzcDsKLQkJCQlpLnR5cGVzW29wXSB8PSBEaXNwMTY7Ci0JCQkgICAgICB9Ci0JCQkgICAgZWxzZQotCQkJICAgICAgewotCQkJCWkucm0ucmVnbWVtID0gTk9fQkFTRV9SRUdJU1RFUjsKLQkJCQlpLnR5cGVzW29wXSAmPSB+RGlzcDsKLQkJCQlpLnR5cGVzW29wXSB8PSBEaXNwMzI7Ci0JCQkgICAgICB9Ci0JCQkgIH0KLQkJCWVsc2UgLyogISBpLmJhc2VfcmVnICYmIGkuaW5kZXhfcmVnICovCi0JCQkgIHsKLQkJCSAgICBpLnNpYi5pbmRleCA9IGkuaW5kZXhfcmVnLT5yZWdfbnVtOwotCQkJICAgIGkuc2liLmJhc2UgPSBOT19CQVNFX1JFR0lTVEVSOwotCQkJICAgIGkuc2liLnNjYWxlID0gaS5sb2cyX3NjYWxlX2ZhY3RvcjsKLQkJCSAgICBpLnJtLnJlZ21lbSA9IEVTQ0FQRV9UT19UV09fQllURV9BRERSRVNTSU5HOwotCQkJICAgIGkudHlwZXNbb3BdICY9IH5EaXNwOwotCQkJICAgIGkudHlwZXNbb3BdIHw9IERpc3AzMjsJLyogTXVzdCBiZSAzMiBiaXQgKi8KLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChpLmJhc2VfcmVnLT5yZWdfdHlwZSAmIFJlZzE2KQotCQkgICAgICB7Ci0JCQlzd2l0Y2ggKGkuYmFzZV9yZWctPnJlZ19udW0pCi0JCQkgIHsKLQkJCSAgY2FzZSAzOiAvKiAoJWJ4KSAqLwotCQkJICAgIGlmICghIGkuaW5kZXhfcmVnKQotCQkJICAgICAgaS5ybS5yZWdtZW0gPSA3OwotCQkJICAgIGVsc2UgLyogKCVieCwlc2kpIC0+IDAsIG9yICglYngsJWRpKSAtPiAxICovCi0JCQkgICAgICBpLnJtLnJlZ21lbSA9IGkuaW5kZXhfcmVnLT5yZWdfbnVtIC0gNjsKLQkJCSAgICBicmVhazsKLQkJCSAgY2FzZSA1OiAvKiAoJWJwKSAqLwotCQkJICAgIGRlZmF1bHRfc2VnID0gJnNzOwotCQkJICAgIGlmICghIGkuaW5kZXhfcmVnKQotCQkJICAgICAgewotCQkJCWkucm0ucmVnbWVtID0gNjsKLQkJCQlpZiAoKGkudHlwZXNbb3BdICYgRGlzcCkgPT0gMCkKLQkJCQkgIHsKLQkJCQkgICAgLyogZmFrZSAoJWJwKSBpbnRvIDAoJWJwKSAqLwotCQkJCSAgICBpLnR5cGVzW29wXSB8PSBEaXNwODsKLQkJCQkgICAgZmFrZV96ZXJvX2Rpc3BsYWNlbWVudCA9IDE7Ci0JCQkJICB9Ci0JCQkgICAgICB9Ci0JCQkgICAgZWxzZSAvKiAoJWJwLCVzaSkgLT4gMiwgb3IgKCVicCwlZGkpIC0+IDMgKi8KLQkJCSAgICAgIGkucm0ucmVnbWVtID0gaS5pbmRleF9yZWctPnJlZ19udW0gLSA2ICsgMjsKLQkJCSAgICBicmVhazsKLQkJCSAgZGVmYXVsdDogLyogKCVzaSkgLT4gNCBvciAoJWRpKSAtPiA1ICovCi0JCQkgICAgaS5ybS5yZWdtZW0gPSBpLmJhc2VfcmVnLT5yZWdfbnVtIC0gNiArIDQ7Ci0JCQkgIH0KLQkJCWkucm0ubW9kZSA9IG1vZGVfZnJvbV9kaXNwX3NpemUgKGkudHlwZXNbb3BdKTsKLQkJICAgICAgfQotCQkgICAgZWxzZSAvKiBpLmJhc2VfcmVnIGFuZCAzMiBiaXQgbW9kZSAqLwotCQkgICAgICB7Ci0JCQlpLnJtLnJlZ21lbSA9IGkuYmFzZV9yZWctPnJlZ19udW07Ci0JCQlpLnNpYi5iYXNlID0gaS5iYXNlX3JlZy0+cmVnX251bTsKLQkJCWlmIChpLmJhc2VfcmVnLT5yZWdfbnVtID09IEVCUF9SRUdfTlVNKQotCQkJICB7Ci0JCQkgICAgZGVmYXVsdF9zZWcgPSAmc3M7Ci0JCQkgICAgaWYgKGkuZGlzcF9vcGVyYW5kcyA9PSAwKQotCQkJICAgICAgewotCQkJCWZha2VfemVyb19kaXNwbGFjZW1lbnQgPSAxOwotCQkJCWkudHlwZXNbb3BdIHw9IERpc3A4OwotCQkJICAgICAgfQotCQkJICB9Ci0JCQllbHNlIGlmIChpLmJhc2VfcmVnLT5yZWdfbnVtID09IEVTUF9SRUdfTlVNKQotCQkJICB7Ci0JCQkgICAgZGVmYXVsdF9zZWcgPSAmc3M7Ci0JCQkgIH0KLQkJCWkuc2liLnNjYWxlID0gaS5sb2cyX3NjYWxlX2ZhY3RvcjsKLQkJCWlmICghIGkuaW5kZXhfcmVnKQotCQkJICB7Ci0JCQkgICAgLyogPGRpc3A+KCVlc3ApIGJlY29tZXMgdHdvIGJ5dGUgbW9kcm0KLQkJCSAgICAgICB3aXRoIG5vIGluZGV4IHJlZ2lzdGVyLiAgV2UndmUgYWxyZWFkeQotCQkJICAgICAgIHN0b3JlZCB0aGUgY29kZSBmb3IgZXNwIGluIGkucm0ucmVnbWVtCi0JCQkgICAgICAgaWUuIEVTQ0FQRV9UT19UV09fQllURV9BRERSRVNTSU5HLiAgQW55Ci0JCQkgICAgICAgYmFzZSByZWdpc3RlciBiZXNpZGVzICVlc3Agd2lsbCBub3QgdXNlCi0JCQkgICAgICAgdGhlIGV4dHJhIG1vZHJtIGJ5dGUuICAqLwotCQkJICAgIGkuc2liLmluZGV4ID0gTk9fSU5ERVhfUkVHSVNURVI7Ci0jaWYgISBTQ0FMRTFfV0hFTl9OT19JTkRFWAotCQkJICAgIC8qIEFub3RoZXIgY2FzZSB3aGVyZSB3ZSBmb3JjZSB0aGUgc2Vjb25kCi0JCQkgICAgICAgbW9kcm0gYnl0ZS4gICovCi0JCQkgICAgaWYgKGkubG9nMl9zY2FsZV9mYWN0b3IpCi0JCQkgICAgICBpLnJtLnJlZ21lbSA9IEVTQ0FQRV9UT19UV09fQllURV9BRERSRVNTSU5HOwotI2VuZGlmCi0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGkuc2liLmluZGV4ID0gaS5pbmRleF9yZWctPnJlZ19udW07Ci0JCQkgICAgaS5ybS5yZWdtZW0gPSBFU0NBUEVfVE9fVFdPX0JZVEVfQUREUkVTU0lORzsKLQkJCSAgfQotCQkJaS5ybS5tb2RlID0gbW9kZV9mcm9tX2Rpc3Bfc2l6ZSAoaS50eXBlc1tvcF0pOwotCQkgICAgICB9Ci0KLQkJICAgIGlmIChmYWtlX3plcm9fZGlzcGxhY2VtZW50KQotCQkgICAgICB7Ci0JCQkvKiBGYWtlcyBhIHplcm8gZGlzcGxhY2VtZW50IGFzc3VtaW5nIHRoYXQgaS50eXBlc1tvcF0KLQkJCSAgIGhvbGRzIHRoZSBjb3JyZWN0IGRpc3BsYWNlbWVudCBzaXplLiAqLwotCQkJZXhwID0gJmRpc3BfZXhwcmVzc2lvbnNbaS5kaXNwX29wZXJhbmRzKytdOwotCQkJaS5kaXNwc1tvcF0gPSBleHA7Ci0JCQlleHAtPlhfb3AgPSBPX2NvbnN0YW50OwotCQkJZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotCQkJZXhwLT5YX2FkZF9zeW1ib2wgPSAoc3ltYm9sUyAqKSAwOwotCQkJZXhwLT5YX29wX3N5bWJvbCA9IChzeW1ib2xTICopIDA7Ci0JCSAgICAgIH0KLQkJICB9Ci0KLQkJLyogRmlsbCBpbiBpLnJtLnJlZyBvciBpLnJtLnJlZ21lbSBmaWVsZCB3aXRoIHJlZ2lzdGVyCi0JCSAgIG9wZXJhbmQgKGlmIGFueSkgYmFzZWQgb24gaS50bS5leHRlbnNpb25fb3Bjb2RlLgotCQkgICBBZ2Fpbiwgd2UgbXVzdCBiZSBjYXJlZnVsIHRvIG1ha2Ugc3VyZSB0aGF0Ci0JCSAgIHNlZ21lbnQvY29udHJvbC9kZWJ1Zy90ZXN0L01NWCByZWdpc3RlcnMgYXJlIGNvZGVkCi0JCSAgIGludG8gdGhlIGkucm0ucmVnIGZpZWxkLiAqLwotCQlpZiAoaS5yZWdfb3BlcmFuZHMpCi0JCSAgewotCQkgICAgdW5zaWduZWQgaW50IG9wID0KLQkJICAgICAgKChpLnR5cGVzWzBdCi0JCQkmIChSZWcgfCBSZWdNTVggfCBSZWdYTU0KLQkJCSAgIHwgU1JlZzIgfCBTUmVnMwotCQkJICAgfCBDb250cm9sIHwgRGVidWcgfCBUZXN0KSkKLQkJICAgICAgID8gMAotCQkgICAgICAgOiAoKGkudHlwZXNbMV0KLQkJCSAgICYgKFJlZyB8IFJlZ01NWCB8IFJlZ1hNTQotCQkJICAgICAgfCBTUmVnMiB8IFNSZWczCi0JCQkgICAgICB8IENvbnRyb2wgfCBEZWJ1ZyB8IFRlc3QpKQotCQkJICA/IDEKLQkJCSAgOiAyKSk7Ci0JCSAgICAvKiBJZiB0aGVyZSBpcyBhbiBleHRlbnNpb24gb3Bjb2RlIHRvIHB1dCBoZXJlLCB0aGUKLQkJICAgICAgIHJlZ2lzdGVyIG51bWJlciBtdXN0IGJlIHB1dCBpbnRvIHRoZSByZWdtZW0gZmllbGQuICovCi0JCSAgICBpZiAoaS50bS5leHRlbnNpb25fb3Bjb2RlICE9IE5vbmUpCi0JCSAgICAgIGkucm0ucmVnbWVtID0gaS5yZWdzW29wXS0+cmVnX251bTsKLQkJICAgIGVsc2UKLQkJICAgICAgaS5ybS5yZWcgPSBpLnJlZ3Nbb3BdLT5yZWdfbnVtOwotCi0JCSAgICAvKiBOb3csIGlmIG5vIG1lbW9yeSBvcGVyYW5kIGhhcyBzZXQgaS5ybS5tb2RlID0gMCwgMSwgMgotCQkgICAgICAgd2UgbXVzdCBzZXQgaXQgdG8gMyB0byBpbmRpY2F0ZSB0aGlzIGlzIGEgcmVnaXN0ZXIKLQkJICAgICAgIG9wZXJhbmQgaW4gdGhlIHJlZ21lbSBmaWVsZC4gICovCi0JCSAgICBpZiAoIWkubWVtX29wZXJhbmRzKQotCQkgICAgICBpLnJtLm1vZGUgPSAzOwotCQkgIH0KLQotCQkvKiBGaWxsIGluIGkucm0ucmVnIGZpZWxkIHdpdGggZXh0ZW5zaW9uIG9wY29kZSAoaWYgYW55KS4gKi8KLQkJaWYgKGkudG0uZXh0ZW5zaW9uX29wY29kZSAhPSBOb25lKQotCQkgIGkucm0ucmVnID0gaS50bS5leHRlbnNpb25fb3Bjb2RlOwotCSAgICAgIH0KLQkgIH0KLQllbHNlIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIChTZWcyU2hvcnRGb3JtIHwgU2VnM1Nob3J0Rm9ybSkpCi0JICB7Ci0JICAgIGlmIChpLnRtLmJhc2Vfb3Bjb2RlID09IFBPUF9TRUdfU0hPUlQgJiYgaS5yZWdzWzBdLT5yZWdfbnVtID09IDEpCi0JICAgICAgewotCQlhc19iYWQgKF8oInlvdSBjYW4ndCBgcG9wICUlY3MnIikpOwotCQlyZXR1cm47Ci0JICAgICAgfQotCSAgICBpLnRtLmJhc2Vfb3Bjb2RlIHw9IChpLnJlZ3NbMF0tPnJlZ19udW0gPDwgMyk7Ci0JICB9Ci0JZWxzZSBpZiAoKGkudG0uYmFzZV9vcGNvZGUgJiB+KER8VykpID09IE1PVl9BWF9ESVNQMzIpCi0JICB7Ci0JICAgIGRlZmF1bHRfc2VnID0gJmRzOwotCSAgfQotCWVsc2UgaWYgKChpLnRtLm9wY29kZV9tb2RpZmllciAmIElzU3RyaW5nKSAhPSAwKQotCSAgewotCSAgICAvKiBGb3IgdGhlIHN0cmluZyBpbnN0cnVjdGlvbnMgdGhhdCBhbGxvdyBhIHNlZ21lbnQgb3ZlcnJpZGUKLQkgICAgICAgb24gb25lIG9mIHRoZWlyIG9wZXJhbmRzLCB0aGUgZGVmYXVsdCBzZWdtZW50IGlzIGRzLiAgKi8KLQkgICAgZGVmYXVsdF9zZWcgPSAmZHM7Ci0JICB9Ci0KLQkvKiBJZiBhIHNlZ21lbnQgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLAotCSAgIGFuZCB0aGUgc3BlY2lmaWVkIHNlZ21lbnQgaXMgbm90IHRoZSBkZWZhdWx0LAotCSAgIHVzZSBhbiBvcGNvZGUgcHJlZml4IHRvIHNlbGVjdCBpdC4KLQkgICBJZiB3ZSBuZXZlciBmaWd1cmVkIG91dCB3aGF0IHRoZSBkZWZhdWx0IHNlZ21lbnQgaXMsCi0JICAgdGhlbiBkZWZhdWx0X3NlZyB3aWxsIGJlIHplcm8gYXQgdGhpcyBwb2ludCwKLQkgICBhbmQgdGhlIHNwZWNpZmllZCBzZWdtZW50IHByZWZpeCB3aWxsIGFsd2F5cyBiZSB1c2VkLiAgKi8KLQlpZiAoKGkuc2VnWzBdKSAmJiAoaS5zZWdbMF0gIT0gZGVmYXVsdF9zZWcpKQotCSAgewotCSAgICBpZiAoISBhZGRfcHJlZml4IChpLnNlZ1swXS0+c2VnX3ByZWZpeCkpCi0JICAgICAgcmV0dXJuOwotCSAgfQotICAgICAgfQotICAgIGVsc2UgaWYgKChpLnRtLm9wY29kZV9tb2RpZmllciAmIFVnaCkgIT0gMCkKLSAgICAgIHsKLSAgICAgICAvKiBVbml4V2FyZSBmc3ViIG5vIGFyZ3MgaXMgYWxpYXMgZm9yIGZzdWJwLCBmYWRkIC0+IGZhZGRwLCBldGMgKi8KLSAgICAgICBhc193YXJuIChfKCJ0cmFuc2xhdGluZyB0byBgJXNwJyIpLCBpLnRtLm5hbWUpOwotICAgICAgfQotICB9Ci0KLSAgLyogSGFuZGxlIGNvbnZlcnNpb24gb2YgJ2ludCAkMycgLS0+IHNwZWNpYWwgaW50MyBpbnNuLiAqLwotICBpZiAoaS50bS5iYXNlX29wY29kZSA9PSBJTlRfT1BDT0RFICYmIGkuaW1tc1swXS0+WF9hZGRfbnVtYmVyID09IDMpCi0gICAgewotICAgICAgaS50bS5iYXNlX29wY29kZSA9IElOVDNfT1BDT0RFOwotICAgICAgaS5pbW1fb3BlcmFuZHMgPSAwOwotICAgIH0KLQotICAvKiBXZSBhcmUgcmVhZHkgdG8gb3V0cHV0IHRoZSBpbnNuLiAqLwotICB7Ci0gICAgcmVnaXN0ZXIgY2hhciAqcDsKLQotICAgIC8qIE91dHB1dCBqdW1wcy4gKi8KLSAgICBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBKdW1wKQotICAgICAgewotCWxvbmcgbiA9IChsb25nKSBpLmRpc3BzWzBdLT5YX2FkZF9udW1iZXI7Ci0JaW50IHByZWZpeCA9IChpLnByZWZpeFtEQVRBX1BSRUZJWF0gIT0gMCk7Ci0JaW50IGNvZGUxNiA9IDA7Ci0KLQlpZiAocHJlZml4KQotCSAgewotCSAgICBpLnByZWZpeGVzIC09IDE7Ci0JICAgIGNvZGUxNiA9IENPREUxNjsKLQkgIH0KLQlpZiAoZmxhZ18xNmJpdF9jb2RlKQotCSAgY29kZTE2IF49IENPREUxNjsKLQotCWlmICghaW50ZWxfc3ludGF4ICYmIChpLnByZWZpeGVzICE9IDApKQotCSAgYXNfd2FybiAoXygic2tpcHBpbmcgcHJlZml4ZXMgb24gdGhpcyBpbnN0cnVjdGlvbiIpKTsKLQotCWlmIChpLmRpc3BzWzBdLT5YX29wID09IE9fY29uc3RhbnQpCi0JICB7Ci0JICAgIGlmIChmaXRzX2luX3NpZ25lZF9ieXRlIChuKSkKLQkgICAgICB7Ci0JCWluc25fc2l6ZSArPSAyOwotCQlwID0gZnJhZ19tb3JlICgyKTsKLQkJcFswXSA9IGkudG0uYmFzZV9vcGNvZGU7Ci0JCXBbMV0gPSBuOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkgICAgICAgIC8qIFVzZSAxNi1iaXQganVtcHMgb25seSBmb3IgMTYtYml0IGNvZGUsCi0JCSAgIGJlY2F1c2UgdGV4dCBzZWdtZW50cyBhcmUgbGltaXRlZCB0byA2NEsgYW55d2F5OwotCSAgICAgICAgICAgVXNlIDMyLWJpdCBqdW1wcyBmb3IgMzItYml0IGNvZGUsIGJlY2F1c2UgdGhleSdyZSBmYXN0ZXIsCi0JCSAgIGFuZCBhIDE2LWJpdCBqdW1wIHdpbGwgY2xlYXIgdGhlIHRvcCAxNiBiaXRzIG9mICVlaXAuICAqLwotCQlpbnQgam1wX3NpemUgPSBjb2RlMTYgPyAyIDogNDsKLQkgICAgICAJaWYgKGNvZGUxNiAmJiAhZml0c19pbl9zaWduZWRfd29yZCAobikpCi0JCSAgewotCQkgICAgYXNfYmFkIChfKCIxNi1iaXQganVtcCBvdXQgb2YgcmFuZ2UiKSk7Ci0JCSAgICByZXR1cm47Ci0JCSAgfQotCi0JCWlmIChpLnRtLmJhc2Vfb3Bjb2RlID09IEpVTVBfUENfUkVMQVRJVkUpCi0JCSAgewkJLyogcGFjZSAqLwotCQkgICAgLyogdW5jb25kaXRpb25hbCBqdW1wICovCi0JCSAgICBpbnNuX3NpemUgKz0gcHJlZml4ICsgMSArIGptcF9zaXplOwotCQkgICAgcCA9IGZyYWdfbW9yZSAocHJlZml4ICsgMSArIGptcF9zaXplKTsKLQkJICAgIGlmIChwcmVmaXgpCi0JCSAgICAgICpwKysgPSBEQVRBX1BSRUZJWF9PUENPREU7Ci0JCSAgICAqcCsrID0gKGNoYXIpIDB4ZTk7Ci0JCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIG4sIGptcF9zaXplKTsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICAvKiBjb25kaXRpb25hbCBqdW1wICovCi0JCSAgICBpbnNuX3NpemUgKz0gcHJlZml4ICsgMiArIGptcF9zaXplOwotCQkgICAgcCA9IGZyYWdfbW9yZSAocHJlZml4ICsgMiArIGptcF9zaXplKTsKLQkJICAgIGlmIChwcmVmaXgpCi0JCSAgICAgICpwKysgPSBEQVRBX1BSRUZJWF9PUENPREU7Ci0JCSAgICAqcCsrID0gVFdPX0JZVEVfT1BDT0RFX0VTQ0FQRTsKLQkJICAgICpwKysgPSBpLnRtLmJhc2Vfb3Bjb2RlICsgMHgxMDsKLQkJICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgbiwgam1wX3NpemUpOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpbnQgc2l6ZSA9IGNvZGUxNiA/IDIgOiA0OwotCi0JICAgIC8qIEl0J3MgYSBzeW1ib2w7IGVuZCBmcmFnICYgc2V0dXAgZm9yIHJlbGF4LgotCSAgICAgICBNYWtlIHN1cmUgdGhlcmUgYXJlIG1vcmUgdGhhbiA2IGNoYXJzIGxlZnQgaW4gdGhlIGN1cnJlbnQgZnJhZzsKLQkgICAgICAgaWYgbm90IHdlJ2xsIGhhdmUgdG8gc3RhcnQgYSBuZXcgb25lLiAqLwotCSAgICBmcmFnX2dyb3cgKHByZWZpeCArIDEgKyAyICsgc2l6ZSk7Ci0JICAgIGluc25fc2l6ZSArPSAxICsgcHJlZml4OwotCSAgICBwID0gZnJhZ19tb3JlICgxICsgcHJlZml4KTsKLQkgICAgaWYgKHByZWZpeCkKLQkgICAgICAqcCsrID0gREFUQV9QUkVGSVhfT1BDT0RFOwotCSAgICAqcCA9IGkudG0uYmFzZV9vcGNvZGU7Ci0JICAgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJICAgICAgcHJlZml4ICsgMiArIHNpemUsIC8qIDIgb3Bjb2RlL3ByZWZpeCArIGRpc3BsYWNlbWVudCAqLwotCQkgICAgICAxLAotCQkgICAgICAoKHVuc2lnbmVkIGNoYXIpICpwID09IEpVTVBfUENfUkVMQVRJVkUKLQkJICAgICAgID8gRU5DT0RFX1JFTEFYX1NUQVRFIChVTkNPTkRfSlVNUCwgU01BTEwpIHwgY29kZTE2Ci0JCSAgICAgICA6IEVOQ09ERV9SRUxBWF9TVEFURSAoQ09ORF9KVU1QLCBTTUFMTCkgfCBjb2RlMTYpLAotCQkgICAgICBpLmRpc3BzWzBdLT5YX2FkZF9zeW1ib2wsCi0JCSAgICAgIChvZmZzZXRUKSBuLCBwKTsKLQkgIH0KLSAgICAgIH0KLSAgICBlbHNlIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIChKdW1wQnl0ZSB8IEp1bXBEd29yZCkpCi0gICAgICB7Ci0JaW50IHNpemUgPSAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBKdW1wQnl0ZSkgPyAxIDogNDsKLQlsb25nIG4gPSAobG9uZykgaS5kaXNwc1swXS0+WF9hZGRfbnVtYmVyOwotCi0JaWYgKHNpemUgPT0gMSkgLyogdGhlbiB0aGlzIGlzIGEgbG9vcCBvciBqZWN4eiB0eXBlIGluc3RydWN0aW9uICovCi0JICB7Ci0JICAgIGlmIChpLnByZWZpeFtBRERSX1BSRUZJWF0pCi0JICAgICAgewotCQlpbnNuX3NpemUgKz0gMTsKLQkJRlJBR19BUFBFTkRfMV9DSEFSIChBRERSX1BSRUZJWF9PUENPREUpOwotCQlpLnByZWZpeGVzIC09IDE7Ci0JICAgICAgfQotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaW50IGNvZGUxNiA9IDA7Ci0KLQkgICAgaWYgKGkucHJlZml4W0RBVEFfUFJFRklYXSkKLQkgICAgICB7Ci0JCWluc25fc2l6ZSArPSAxOwotCQlGUkFHX0FQUEVORF8xX0NIQVIgKERBVEFfUFJFRklYX09QQ09ERSk7Ci0JCWkucHJlZml4ZXMgLT0gMTsKLQkJY29kZTE2ID0gQ09ERTE2OwotCSAgICAgIH0KLQkgICAgaWYgKGZsYWdfMTZiaXRfY29kZSkKLQkgICAgICBjb2RlMTYgXj0gQ09ERTE2OwotCi0JICAgIGlmIChjb2RlMTYpCi0JICAgICAgc2l6ZSA9IDI7Ci0JICB9Ci0KLQlpZiAoIWludGVsX3N5bnRheCAmJiAoaS5wcmVmaXhlcyAhPSAwKSkKLQkgIGFzX3dhcm4gKF8oInNraXBwaW5nIHByZWZpeGVzIG9uIHRoaXMgaW5zdHJ1Y3Rpb24iKSk7Ci0KLQlpZiAoZml0c19pbl91bnNpZ25lZF9ieXRlIChpLnRtLmJhc2Vfb3Bjb2RlKSkKLQkgIHsKLQkgICAgaW5zbl9zaXplICs9IDEgKyBzaXplOwotCSAgICBwID0gZnJhZ19tb3JlICgxICsgc2l6ZSk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpbnNuX3NpemUgKz0gMiArIHNpemU7CS8qIG9wY29kZSBjYW4gYmUgYXQgbW9zdCB0d28gYnl0ZXMgKi8KLQkgICAgcCA9IGZyYWdfbW9yZSAoMiArIHNpemUpOwotCSAgICAqcCsrID0gKGkudG0uYmFzZV9vcGNvZGUgPj4gOCkgJiAweGZmOwotCSAgfQotCSpwKysgPSBpLnRtLmJhc2Vfb3Bjb2RlICYgMHhmZjsKLQotCWlmIChpLmRpc3BzWzBdLT5YX29wID09IE9fY29uc3RhbnQpCi0JICB7Ci0JICAgIGlmIChzaXplID09IDEgJiYgIWZpdHNfaW5fc2lnbmVkX2J5dGUgKG4pKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCJgJXMnIG9ubHkgdGFrZXMgYnl0ZSBkaXNwbGFjZW1lbnQ7ICVsZCBzaG9ydGVuZWQgdG8gJWQiKSwKLQkJCWkudG0ubmFtZSwgbiwgKnApOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoc2l6ZSA9PSAyICYmICFmaXRzX2luX3NpZ25lZF93b3JkIChuKSkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygiMTYtYml0IGp1bXAgb3V0IG9mIHJhbmdlIikpOwotCQlyZXR1cm47Ci0JICAgICAgfQotCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIG4sIHNpemUpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIHNpemUsCi0JCQkgaS5kaXNwc1swXSwgMSwgcmVsb2MgKHNpemUsIDEsIGkuZGlzcF9yZWxvY1swXSkpOwotCi0JICB9Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBKdW1wSW50ZXJTZWdtZW50KQotICAgICAgewotCWludCBzaXplOwotCWludCByZWxvY190eXBlOwotCWludCBwcmVmaXggPSBpLnByZWZpeFtEQVRBX1BSRUZJWF0gIT0gMDsKLQlpbnQgY29kZTE2ID0gMDsKLQotCWlmIChwcmVmaXgpCi0JICB7Ci0JICAgIGNvZGUxNiA9IENPREUxNjsKLQkgICAgaS5wcmVmaXhlcyAtPSAxOwotCSAgfQotCWlmIChmbGFnXzE2Yml0X2NvZGUpCi0JICBjb2RlMTYgXj0gQ09ERTE2OwotCi0Jc2l6ZSA9IDQ7Ci0JcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ18zMjsKLQlpZiAoY29kZTE2KQotCSAgewotCSAgICBzaXplID0gMjsKLQkgICAgcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ18xNjsKLQkgIH0KLQotCWlmICghaW50ZWxfc3ludGF4ICYmIChpLnByZWZpeGVzICE9IDApKQotCSAgYXNfd2FybiAoXygic2tpcHBpbmcgcHJlZml4ZXMgb24gdGhpcyBpbnN0cnVjdGlvbiIpKTsKLQotCWluc25fc2l6ZSArPSBwcmVmaXggKyAxICsgMiArIHNpemU7ICAvKiAxIG9wY29kZTsgMiBzZWdtZW50OyBvZmZzZXQgKi8KLQlwID0gZnJhZ19tb3JlIChwcmVmaXggKyAxICsgMiArIHNpemUpOwotCWlmIChwcmVmaXgpCi0JICAqcCsrID0gREFUQV9QUkVGSVhfT1BDT0RFOwotCSpwKysgPSBpLnRtLmJhc2Vfb3Bjb2RlOwotCWlmIChpLmltbXNbMV0tPlhfb3AgPT0gT19jb25zdGFudCkKLQkgIHsKLQkgICAgbG9uZyBuID0gKGxvbmcpIGkuaW1tc1sxXS0+WF9hZGRfbnVtYmVyOwotCi0JICAgIGlmIChzaXplID09IDIgJiYgIWZpdHNfaW5fdW5zaWduZWRfd29yZCAobikpCi0JICAgICAgewotCQlhc19iYWQgKF8oIjE2LWJpdCBqdW1wIG91dCBvZiByYW5nZSIpKTsKLQkJcmV0dXJuOwotCSAgICAgIH0KLQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBuLCBzaXplKTsKLQkgIH0KLQllbHNlCi0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgc2l6ZSwKLQkJICAgICAgIGkuaW1tc1sxXSwgMCwgcmVsb2NfdHlwZSk7Ci0JaWYgKGkuaW1tc1swXS0+WF9vcCAhPSBPX2NvbnN0YW50KQotCSAgYXNfYmFkIChfKCJjYW4ndCBoYW5kbGUgbm9uIGFic29sdXRlIHNlZ21lbnQgaW4gYCVzJyIpLAotCQkgIGkudG0ubmFtZSk7Ci0JbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgc2l6ZSwgKHZhbHVlVCkgaS5pbW1zWzBdLT5YX2FkZF9udW1iZXIsIDIpOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQkvKiBPdXRwdXQgbm9ybWFsIGluc3RydWN0aW9ucyBoZXJlLiAqLwotCXVuc2lnbmVkIGNoYXIgKnE7Ci0KLQkvKiBUaGUgcHJlZml4IGJ5dGVzLiAqLwotCWZvciAocSA9IGkucHJlZml4OwotCSAgICAgcSA8IGkucHJlZml4ICsgc2l6ZW9mIChpLnByZWZpeCkgLyBzaXplb2YgKGkucHJlZml4WzBdKTsKLQkgICAgIHErKykKLQkgIHsKLQkgICAgaWYgKCpxKQotCSAgICAgIHsKLQkJaW5zbl9zaXplICs9IDE7Ci0JCXAgPSBmcmFnX21vcmUgKDEpOwotCQltZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpICpxLCAxKTsKLQkgICAgICB9Ci0JICB9Ci0KLQkvKiBOb3cgdGhlIG9wY29kZTsgYmUgY2FyZWZ1bCBhYm91dCB3b3JkIG9yZGVyIGhlcmUhICovCi0JaWYgKGZpdHNfaW5fdW5zaWduZWRfYnl0ZSAoaS50bS5iYXNlX29wY29kZSkpCi0JICB7Ci0JICAgIGluc25fc2l6ZSArPSAxOwotCSAgICBGUkFHX0FQUEVORF8xX0NIQVIgKGkudG0uYmFzZV9vcGNvZGUpOwotCSAgfQotCWVsc2UgaWYgKGZpdHNfaW5fdW5zaWduZWRfd29yZCAoaS50bS5iYXNlX29wY29kZSkpCi0JICB7Ci0JICAgIGluc25fc2l6ZSArPSAyOwotCSAgICBwID0gZnJhZ19tb3JlICgyKTsKLQkgICAgLyogcHV0IG91dCBoaWdoIGJ5dGUgZmlyc3Q6IGNhbid0IHVzZSBtZF9udW1iZXJfdG9fY2hhcnMhICovCi0JICAgICpwKysgPSAoaS50bS5iYXNlX29wY29kZSA+PiA4KSAmIDB4ZmY7Ci0JICAgICpwID0gaS50bS5iYXNlX29wY29kZSAmIDB4ZmY7Ci0JICB9Ci0JZWxzZQotCSAgewkJCS8qIG9wY29kZSBpcyBlaXRoZXIgMyBvciA0IGJ5dGVzICovCi0JICAgIGlmIChpLnRtLmJhc2Vfb3Bjb2RlICYgMHhmZjAwMDAwMCkKLQkgICAgICB7Ci0JCWluc25fc2l6ZSArPSA0OwotCQlwID0gZnJhZ19tb3JlICg0KTsKLQkJKnArKyA9IChpLnRtLmJhc2Vfb3Bjb2RlID4+IDI0KSAmIDB4ZmY7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlpbnNuX3NpemUgKz0gMzsKLQkJcCA9IGZyYWdfbW9yZSAoMyk7Ci0JICAgICAgfQotCSAgICAqcCsrID0gKGkudG0uYmFzZV9vcGNvZGUgPj4gMTYpICYgMHhmZjsKLQkgICAgKnArKyA9IChpLnRtLmJhc2Vfb3Bjb2RlID4+IDgpICYgMHhmZjsKLQkgICAgKnAgPSAoaS50bS5iYXNlX29wY29kZSkgJiAweGZmOwotCSAgfQotCi0JLyogTm93IHRoZSBtb2RybSBieXRlIGFuZCBzaWIgYnl0ZSAoaWYgcHJlc2VudCkuICAqLwotCWlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIE1vZHJtKQotCSAgewotCSAgICBpbnNuX3NpemUgKz0gMTsKLQkgICAgcCA9IGZyYWdfbW9yZSAoMSk7Ci0JICAgIG1kX251bWJlcl90b19jaGFycyAocCwKLQkJCQkodmFsdWVUKSAoaS5ybS5yZWdtZW0gPDwgMAotCQkJCQkgIHwgaS5ybS5yZWcgPDwgMwotCQkJCQkgIHwgaS5ybS5tb2RlIDw8IDYpLAotCQkJCTEpOwotCSAgICAvKiBJZiBpLnJtLnJlZ21lbSA9PSBFU1AgKDQpCi0JICAgICAgICYmIGkucm0ubW9kZSAhPSAoUmVnaXN0ZXIgbW9kZSkKLQkgICAgICAgJiYgbm90IDE2IGJpdAotCSAgICAgICA9PT4gbmVlZCBzZWNvbmQgbW9kcm0gYnl0ZS4gICovCi0JICAgIGlmIChpLnJtLnJlZ21lbSA9PSBFU0NBUEVfVE9fVFdPX0JZVEVfQUREUkVTU0lORwotCQkmJiBpLnJtLm1vZGUgIT0gMwotCQkmJiAhKGkuYmFzZV9yZWcgJiYgKGkuYmFzZV9yZWctPnJlZ190eXBlICYgUmVnMTYpICE9IDApKQotCSAgICAgIHsKLQkJaW5zbl9zaXplICs9IDE7Ci0JCXAgPSBmcmFnX21vcmUgKDEpOwotCQltZF9udW1iZXJfdG9fY2hhcnMgKHAsCi0JCQkJICAgICh2YWx1ZVQpIChpLnNpYi5iYXNlIDw8IDAKLQkJCQkJICAgICAgfCBpLnNpYi5pbmRleCA8PCAzCi0JCQkJCSAgICAgIHwgaS5zaWIuc2NhbGUgPDwgNiksCi0JCQkJICAgIDEpOwotCSAgICAgIH0KLQkgIH0KLQotCWlmIChpLmRpc3Bfb3BlcmFuZHMpCi0JICB7Ci0JICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBuOwotCi0JICAgIGZvciAobiA9IDA7IG4gPCBpLm9wZXJhbmRzOyBuKyspCi0JICAgICAgewotCQlpZiAoaS5kaXNwc1tuXSkKLQkJICB7Ci0JCSAgICBpZiAoaS5kaXNwc1tuXS0+WF9vcCA9PSBPX2NvbnN0YW50KQotCQkgICAgICB7Ci0JCQlpZiAoaS50eXBlc1tuXSAmIERpc3A4KQotCQkJICB7Ci0JCQkgICAgaW5zbl9zaXplICs9IDE7Ci0JCQkgICAgcCA9IGZyYWdfbW9yZSAoMSk7Ci0JCQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLAotCQkJCQkJKHZhbHVlVCkgaS5kaXNwc1tuXS0+WF9hZGRfbnVtYmVyLAotCQkJCQkJMSk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKGkudHlwZXNbbl0gJiBEaXNwMTYpCi0JCQkgIHsKLQkJCSAgICBpbnNuX3NpemUgKz0gMjsKLQkJCSAgICBwID0gZnJhZ19tb3JlICgyKTsKLQkJCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsCi0JCQkJCQkodmFsdWVUKSBpLmRpc3BzW25dLT5YX2FkZF9udW1iZXIsCi0JCQkJCQkyKTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICB7CS8qIERpc3AzMiAqLwotCQkJICAgIGluc25fc2l6ZSArPSA0OwotCQkJICAgIHAgPSBmcmFnX21vcmUgKDQpOwotCQkJICAgIG1kX251bWJlcl90b19jaGFycyAocCwKLQkJCQkJCSh2YWx1ZVQpIGkuZGlzcHNbbl0tPlhfYWRkX251bWJlciwKLQkJCQkJCTQpOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKGkudHlwZXNbbl0gJiBEaXNwMzIpCi0JCSAgICAgIHsKLQkJCWluc25fc2l6ZSArPSA0OwotCQkJcCA9IGZyYWdfbW9yZSAoNCk7Ci0JCQlmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkJCQkgICAgIGkuZGlzcHNbbl0sIDAsCi0JCQkJICAgICBUQ19SRUxPQyAoaS5kaXNwX3JlbG9jW25dLCBCRkRfUkVMT0NfMzIpKTsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7IC8qIG11c3QgYmUgRGlzcDE2ICovCi0JCQlpbnNuX3NpemUgKz0gMjsKLQkJCXAgPSBmcmFnX21vcmUgKDIpOwotCQkJZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDIsCi0JCQkJICAgICBpLmRpc3BzW25dLCAwLAotCQkJCSAgICAgVENfUkVMT0MgKGkuZGlzcF9yZWxvY1tuXSwgQkZEX1JFTE9DXzE2KSk7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgfQkJCS8qIGVuZCBkaXNwbGFjZW1lbnQgb3V0cHV0ICovCi0KLQkvKiBvdXRwdXQgaW1tZWRpYXRlICovCi0JaWYgKGkuaW1tX29wZXJhbmRzKQotCSAgewotCSAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgbjsKLQotCSAgICBmb3IgKG4gPSAwOyBuIDwgaS5vcGVyYW5kczsgbisrKQotCSAgICAgIHsKLQkJaWYgKGkuaW1tc1tuXSkKLQkJICB7Ci0JCSAgICBpZiAoaS5pbW1zW25dLT5YX29wID09IE9fY29uc3RhbnQpCi0JCSAgICAgIHsKLQkJCWlmIChpLnR5cGVzW25dICYgKEltbTggfCBJbW04UykpCi0JCQkgIHsKLQkJCSAgICBpbnNuX3NpemUgKz0gMTsKLQkJCSAgICBwID0gZnJhZ19tb3JlICgxKTsKLQkJCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsCi0JCQkJCQkodmFsdWVUKSBpLmltbXNbbl0tPlhfYWRkX251bWJlciwKLQkJCQkJCTEpOwotCQkJICB9Ci0JCQllbHNlIGlmIChpLnR5cGVzW25dICYgSW1tMTYpCi0JCQkgIHsKLQkJCSAgICBpbnNuX3NpemUgKz0gMjsKLQkJCSAgICBwID0gZnJhZ19tb3JlICgyKTsKLQkJCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsCi0JCQkJCQkodmFsdWVUKSBpLmltbXNbbl0tPlhfYWRkX251bWJlciwKLQkJCQkJCTIpOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBpbnNuX3NpemUgKz0gNDsKLQkJCSAgICBwID0gZnJhZ19tb3JlICg0KTsKLQkJCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsCi0JCQkJCQkodmFsdWVUKSBpLmltbXNbbl0tPlhfYWRkX251bWJlciwKLQkJCQkJCTQpOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewkJLyogbm90IGFic29sdXRlX3NlY3Rpb24gKi8KLQkJCS8qIE5lZWQgYSAzMi1iaXQgZml4dXAgKGRvbid0IHN1cHBvcnQgOGJpdAotCQkJICAgbm9uLWFic29sdXRlIGltcykuICBUcnkgdG8gc3VwcG9ydCBvdGhlcgotCQkJICAgc2l6ZXMgLi4uICovCi0JCQlpbnQgcl90eXBlOwotCQkJaW50IHNpemU7Ci0JCQlpbnQgcGNyZWwgPSAwOwotCi0JCQlpZiAoaS50eXBlc1tuXSAmIChJbW04IHwgSW1tOFMpKQotCQkJICBzaXplID0gMTsKLQkJCWVsc2UgaWYgKGkudHlwZXNbbl0gJiBJbW0xNikKLQkJCSAgc2l6ZSA9IDI7Ci0JCQllbHNlCi0JCQkgIHNpemUgPSA0OwotCQkJaW5zbl9zaXplICs9IHNpemU7Ci0JCQlwID0gZnJhZ19tb3JlIChzaXplKTsKLQkJCXJfdHlwZSA9IHJlbG9jIChzaXplLCAwLCBpLmRpc3BfcmVsb2NbMF0pOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkJCWlmIChyX3R5cGUgPT0gQkZEX1JFTE9DXzMyCi0JCQkgICAgJiYgR09UX3N5bWJvbAotCQkJICAgICYmIEdPVF9zeW1ib2wgPT0gaS5pbW1zW25dLT5YX2FkZF9zeW1ib2wKLQkJCSAgICAmJiAoaS5pbW1zW25dLT5YX29wID09IE9fc3ltYm9sCi0JCQkJfHwgKGkuaW1tc1tuXS0+WF9vcCA9PSBPX2FkZAotCQkJCSAgICAmJiAoaS5pbW1zW25dLT5YX29wX3N5bWJvbC0+c3lfdmFsdWUuWF9vcAotCQkJCQk9PSBPX3N1YnRyYWN0KSkpKQotCQkJICB7Ci0JCQkgICAgcl90eXBlID0gQkZEX1JFTE9DXzM4Nl9HT1RQQzsKLQkJCSAgICBpLmltbXNbbl0tPlhfYWRkX251bWJlciArPSAzOwotCQkJICB9Ci0jZW5kaWYKLQkJCWZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBzaXplLAotCQkJCSAgICAgaS5pbW1zW25dLCBwY3JlbCwgcl90eXBlKTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICB9CQkJLyogZW5kIGltbWVkaWF0ZSBvdXRwdXQgKi8KLSAgICAgIH0KLQotI2lmZGVmIERFQlVHMzg2Ci0gICAgaWYgKGZsYWdfZGVidWcpCi0gICAgICB7Ci0JcGkgKGxpbmUsICZpKTsKLSAgICAgIH0KLSNlbmRpZiAvKiBERUJVRzM4NiAqLwotICB9Ci19Ci0MCi1zdGF0aWMgaW50IGkzODZfaXNfcmVnIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgaW50Ci1pMzg2X2lzX3JlZyAocmVnX3N0cmluZykKLSAgICAgY2hhciAqcmVnX3N0cmluZzsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqcyA9IHJlZ19zdHJpbmc7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIGNoYXIgcmVnX25hbWVfZ2l2ZW5bTUFYX1JFR19OQU1FX1NJWkUgKyAxXTsKLQotICBpZiAoaXNfc3BhY2VfY2hhciAoKnMpKQotICAgICsrczsKLQotICBwID0gcmVnX25hbWVfZ2l2ZW47Ci0gIHdoaWxlICgoKnArKyA9IHJlZ2lzdGVyX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSAqcysrXSkgIT0gJ1wwJykKLSAgICBpZiAocCA+PSByZWdfbmFtZV9naXZlbiArIE1BWF9SRUdfTkFNRV9TSVpFKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgaWYgKCFoYXNoX2ZpbmQgKHJlZ19oYXNoLCByZWdfbmFtZV9naXZlbikpCi0gICAgcmV0dXJuIDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gMTsKLX0KLSAKLXN0YXRpYyBpbnQgaTM4Nl9pbW1lZGlhdGUgUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyBpbnQKLWkzODZfaW1tZWRpYXRlIChpbW1fc3RhcnQpCi0gICAgIGNoYXIgKmltbV9zdGFydDsKLXsKLSAgY2hhciAqc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHNlZ1QgZXhwX3NlZyA9IDA7Ci0gIGV4cHJlc3Npb25TICogZXhwOwotCi0gIGlmIChpLmltbV9vcGVyYW5kcyA9PSBNQVhfSU1NRURJQVRFX09QRVJBTkRTKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiT25seSAxIG9yIDIgaW1tZWRpYXRlIG9wZXJhbmRzIGFyZSBhbGxvd2VkIikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGV4cCA9ICZpbV9leHByZXNzaW9uc1tpLmltbV9vcGVyYW5kcysrXTsKLSAgaS5pbW1zW3RoaXNfb3BlcmFuZF0gPSBleHA7Ci0KLSAgaWYgKGlzX3NwYWNlX2NoYXIgKCppbW1fc3RhcnQpKQotICAgICsraW1tX3N0YXJ0OwotCi0gIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBpbW1fc3RhcnQ7Ci0KLSNpZm5kZWYgTEVYX0FUCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIFdlIGNhbiBoYXZlIG9wZXJhbmRzIG9mIHRoZSBmb3JtCi0gICAgICAgKiAgIDxzeW1ib2w+QEdPVE9GRis8bm5uPgotICAgICAgICogVGFrZSB0aGUgZWFzeSB3YXkgb3V0IGhlcmUgYW5kIGNvcHkgZXZlcnl0aGluZwotICAgICAgICogaW50byBhIHRlbXBvcmFyeSBidWZmZXIuLi4KLSAgICAgICAqLwotICAgICAgcmVnaXN0ZXIgY2hhciAqY3A7Ci0KLSAgICAgIGNwID0gc3RyY2hyIChpbnB1dF9saW5lX3BvaW50ZXIsICdAJyk7Ci0gICAgICBpZiAoY3AgIT0gTlVMTCkKLSAgICAgICAgewotCSAgY2hhciAqdG1wYnVmOwotCSAgaW50IGxlbiwgZmlyc3Q7Ci0KLQkgIC8qIEdPVCByZWxvY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiAxNiBiaXQgbW9kZSAqLwotCSAgaWYgKGZsYWdfMTZiaXRfY29kZSkKLQkgICAgYXNfYmFkIChfKCJHT1QgcmVsb2NhdGlvbnMgbm90IHN1cHBvcnRlZCBpbiAxNiBiaXQgbW9kZSIpKTsKLQotCSAgaWYgKEdPVF9zeW1ib2wgPT0gTlVMTCkKLQkgICAgR09UX3N5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSk7Ci0KLQkgIGlmIChzdHJuY21wIChjcCArIDEsICJQTFQiLCAzKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaS5kaXNwX3JlbG9jW3RoaXNfb3BlcmFuZF0gPSBCRkRfUkVMT0NfMzg2X1BMVDMyOwotCSAgICAgIGxlbiA9IDM7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cm5jbXAgKGNwICsgMSwgIkdPVE9GRiIsIDYpID09IDApCi0JICAgIHsKLQkgICAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zODZfR09UT0ZGOwotCSAgICAgIGxlbiA9IDY7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cm5jbXAgKGNwICsgMSwgIkdPVCIsIDMpID09IDApCi0JICAgIHsKLQkgICAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zODZfR09UMzI7Ci0JICAgICAgbGVuID0gMzsKLQkgICAgfQotCSAgZWxzZQotCSAgICBhc19iYWQgKF8oIkJhZCByZWxvYyBzcGVjaWZpZXIgaW4gZXhwcmVzc2lvbiIpKTsKLQotCSAgLyogUmVwbGFjZSB0aGUgcmVsb2NhdGlvbiB0b2tlbiB3aXRoICcgJywgc28gdGhhdCBlcnJvcnMgbGlrZQotCSAgICAgZm9vQEdPVE9GRjEgd2lsbCBiZSBkZXRlY3RlZC4gICovCi0JICBmaXJzdCA9IGNwIC0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgdG1wYnVmID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4oaW5wdXRfbGluZV9wb2ludGVyKSk7Ci0JICBtZW1jcHkgKHRtcGJ1ZiwgaW5wdXRfbGluZV9wb2ludGVyLCBmaXJzdCk7Ci0JICB0bXBidWZbZmlyc3RdID0gJyAnOwotCSAgc3RyY3B5ICh0bXBidWYgKyBmaXJzdCArIDEsIGNwICsgMSArIGxlbik7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0bXBidWY7Ci0JfQotICAgIH0KLSNlbmRpZgotCi0gIGV4cF9zZWcgPSBleHByZXNzaW9uIChleHApOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIpCi0gICAgYXNfYmFkIChfKCJJZ25vcmluZyBqdW5rIGAlcycgYWZ0ZXIgZXhwcmVzc2lvbiIpLCBpbnB1dF9saW5lX3BvaW50ZXIpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmIChleHAtPlhfb3AgPT0gT19hYnNlbnQpCi0gICAgewotICAgICAgLyogbWlzc2luZyBvciBiYWQgZXhwciBiZWNvbWVzIGFic29sdXRlIDAgKi8KLSAgICAgIGFzX2JhZCAoXygiTWlzc2luZyBvciBpbnZhbGlkIGltbWVkaWF0ZSBleHByZXNzaW9uIGAlcycgdGFrZW4gYXMgMCIpLAotICAgICAgICAgICAgICBpbW1fc3RhcnQpOwotICAgICAgZXhwLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIGV4cC0+WF9hZGRfc3ltYm9sID0gKHN5bWJvbFMgKikgMDsKLSAgICAgIGV4cC0+WF9vcF9zeW1ib2wgPSAoc3ltYm9sUyAqKSAwOwotICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IEltbTsKLSAgICB9Ci0gIGVsc2UgaWYgKGV4cC0+WF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PQotCXNtYWxsZXN0X2ltbV90eXBlICgobG9uZykgZXhwLT5YX2FkZF9udW1iZXIpOwotICAKLSAgICAgIC8qIElmIGEgc3VmZml4IGlzIGdpdmVuLCB0aGlzIG9wZXJhbmQgbWF5IGJlIHNob3J0ZW5kZWQuICovCi0gICAgICBzd2l0Y2ggKGkuc3VmZml4KQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgV09SRF9NTkVNX1NVRkZJWDoKLSAgICAgICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gSW1tMTY7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQllURV9NTkVNX1NVRkZJWDoKLSAgICAgICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gSW1tMTYgfCBJbW04IHwgSW1tOFM7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0jaWZkZWYgT0JKX0FPVVQKLSAgZWxzZSBpZiAoZXhwX3NlZyAhPSB0ZXh0X3NlY3Rpb24KLSAgICAgICAgICAgJiYgZXhwX3NlZyAhPSBkYXRhX3NlY3Rpb24KLSAgICAgICAgICAgJiYgZXhwX3NlZyAhPSBic3Nfc2VjdGlvbgotICAgICAgICAgICAmJiBleHBfc2VnICE9IHVuZGVmaW5lZF9zZWN0aW9uCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgICAgICAmJiAhYmZkX2lzX2NvbV9zZWN0aW9uIChleHBfc2VnKQotI2VuZGlmCi0gICAgICAgICAgKQotICAgIHsKLSAgICBzZWdfdW5pbXBsZW1lbnRlZDoKLSAgICAgIGFzX2JhZCAoXygiVW5pbXBsZW1lbnRlZCBzZWdtZW50IHR5cGUgJWQgaW4gb3BlcmFuZCIpLCBleHBfc2VnKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSNlbmRpZgotICBlbHNlCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhbiBhZGRyZXNzLiAgVGhlIHNpemUgb2YgdGhlIGFkZHJlc3Mgd2lsbCBiZQotICAgICAgICAgZGV0ZXJtaW5lZCBsYXRlciwgZGVwZW5kaW5nIG9uIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLAotICAgICAgICAgc3VmZml4LCBvciB0aGUgZGVmYXVsdCBmb3IgdGhlIHNlY3Rpb24uICBXZSBleGNsdWRlCi0gICAgICAgICBJbW04UyBoZXJlIHNvIHRoYXQgYHB1c2ggJGZvbycgYW5kIG90aGVyIGluc3RydWN0aW9ucwotICAgICAgICAgd2l0aCBhbiBJbW04UyBmb3JtIHdpbGwgdXNlIEltbTE2IG9yIEltbTMyLiAgKi8KLSAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSAoSW1tOCB8IEltbTE2IHwgSW1tMzIpOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBpMzg2X3NjYWxlIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgaW50Ci1pMzg2X3NjYWxlIChzY2FsZSkKLSAgICAgY2hhciAqc2NhbGU7Ci17Ci0gIGlmICghaXNkaWdpdCAoKnNjYWxlKSkKLSAgICBnb3RvIGJhZF9zY2FsZTsKLQotICBzd2l0Y2ggKCpzY2FsZSkKLSAgICB7Ci0gICAgY2FzZSAnMCc6Ci0gICAgY2FzZSAnMSc6Ci0gICAgICBpLmxvZzJfc2NhbGVfZmFjdG9yID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzInOgotICAgICAgaS5sb2cyX3NjYWxlX2ZhY3RvciA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICc0JzoKLSAgICAgIGkubG9nMl9zY2FsZV9mYWN0b3IgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnOCc6Ci0gICAgICBpLmxvZzJfc2NhbGVfZmFjdG9yID0gMzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgYmFkX3NjYWxlOgotICAgICAgYXNfYmFkIChfKCJleHBlY3Rpbmcgc2NhbGUgZmFjdG9yIG9mIDEsIDIsIDQsIG9yIDg6IGdvdCBgJXMnIiksCi0gICAgICAgICAgICAgIHNjYWxlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKGkubG9nMl9zY2FsZV9mYWN0b3IgIT0gMCAmJiAhIGkuaW5kZXhfcmVnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oInNjYWxlIGZhY3RvciBvZiAlZCB3aXRob3V0IGFuIGluZGV4IHJlZ2lzdGVyIiksCi0gICAgICAgICAgICAgICAxIDw8IGkubG9nMl9zY2FsZV9mYWN0b3IpOwotI2lmIFNDQUxFMV9XSEVOX05PX0lOREVYCi0gICAgICBpLmxvZzJfc2NhbGVfZmFjdG9yID0gMDsKLSNlbmRpZgotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgaTM4Nl9kaXNwbGFjZW1lbnQgUEFSQU1TICgoY2hhciAqLCBjaGFyICopKTsKLQotc3RhdGljIGludAotaTM4Nl9kaXNwbGFjZW1lbnQgKGRpc3Bfc3RhcnQsIGRpc3BfZW5kKQotICAgICBjaGFyICpkaXNwX3N0YXJ0OwotICAgICBjaGFyICpkaXNwX2VuZDsKLXsKLSAgcmVnaXN0ZXIgZXhwcmVzc2lvblMgKmV4cDsKLSAgc2VnVCBleHBfc2VnID0gMDsKLSAgY2hhciAqc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGludCBiaWdkaXNwID0gRGlzcDMyOwotCi0gIC8qICBBbGwgb2YgdGhlIHBpZWNlcyBvZiB0aGUgZGlzcGxhY2VtZW50IGV4cHJlc3Npb24gYXJlIGhhbmRsZWQgdG9nZXRoZXIuICovCi0gIGlmIChpbnRlbF9zeW50YXggJiYgaS5kaXNwX29wZXJhbmRzICE9IDApCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKGZsYWdfMTZiaXRfY29kZSBeIChpLnByZWZpeFtBRERSX1BSRUZJWF0gIT0gMCkpCi0gICAgYmlnZGlzcCA9IERpc3AxNjsKLSAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IGJpZ2Rpc3A7Ci0KLSAgZXhwID0gJmRpc3BfZXhwcmVzc2lvbnNbaS5kaXNwX29wZXJhbmRzXTsKLSAgaS5kaXNwc1t0aGlzX29wZXJhbmRdID0gZXhwOwotICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IE5PX1JFTE9DOwotICBpLmRpc3Bfb3BlcmFuZHMrKzsKLSAgc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGRpc3Bfc3RhcnQ7Ci0gIEVORF9TVFJJTkdfQU5EX1NBVkUgKGRpc3BfZW5kKTsKLQotI2lmbmRlZiBHQ0NfQVNNX09fSEFDSwotI2RlZmluZSBHQ0NfQVNNX09fSEFDSyAwCi0jZW5kaWYKLSNpZiBHQ0NfQVNNX09fSEFDSwotICBFTkRfU1RSSU5HX0FORF9TQVZFIChkaXNwX2VuZCArIDEpOwotICBpZiAoKGkudHlwZXNbdGhpc19vcGVyYW5kXSAmIEJhc2VJbmRleCkgIT0gMAotICAgICAgICYmIGRpc3BsYWNlbWVudF9zdHJpbmdfZW5kWy0xXSA9PSAnKycpCi0gICAgewotICAgICAgLyogVGhpcyBoYWNrIGlzIHRvIGF2b2lkIGEgd2FybmluZyB3aGVuIHVzaW5nIHRoZSAibyIKLSAgICAgICAgIGNvbnN0cmFpbnQgd2l0aGluIGdjYyBhc20gc3RhdGVtZW50cy4KLSAgICAgICAgIEZvciBpbnN0YW5jZToKLQotICAgICAgICAjZGVmaW5lIF9zZXRfdHNzbGR0X2Rlc2MobixhZGRyLGxpbWl0LHR5cGUpIFwKLSAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCBcCi0gICAgICAgICJtb3Z3ICV3MiwlMFxuXHQiIFwKLSAgICAgICAgIm1vdncgJXcxLDIrJTBcblx0IiBcCi0gICAgICAgICJyb3JsICQxNiwlMVxuXHQiIFwKLSAgICAgICAgIm1vdmIgJWIxLDQrJTBcblx0IiBcCi0gICAgICAgICJtb3ZiICU0LDUrJTBcblx0IiBcCi0gICAgICAgICJtb3ZiICQwLDYrJTBcblx0IiBcCi0gICAgICAgICJtb3ZiICVoMSw3KyUwXG5cdCIgXAotICAgICAgICAicm9ybCAkMTYsJTEiIFwKLSAgICAgICAgOiAiPW8iKCoobikpIDogInEiIChhZGRyKSwgInJpIihsaW1pdCksICJpIih0eXBlKSkKLQotICAgICAgICBUaGlzIHdvcmtzIGdyZWF0IGV4Y2VwdCB0aGF0IHRoZSBvdXRwdXQgYXNzZW1ibGVyIGVuZHMKLSAgICAgICAgdXAgbG9va2luZyBhIGJpdCB3ZWlyZCBpZiBpdCB0dXJucyBvdXQgdGhhdCB0aGVyZSBpcwotICAgICAgICBubyBvZmZzZXQuICBZb3UgZW5kIHVwIHByb2R1Y2luZyBjb2RlIHRoYXQgbG9va3MgbGlrZToKLQotICAgICAgICAjQVBQCi0gICAgICAgICAgICAgICBtb3Z3ICQyMzUsKCVlYXgpCi0gICAgICAgICAgICAgICBtb3Z3ICVkeCwyKyglZWF4KQotICAgICAgICAgICAgICAgcm9ybCAkMTYsJWVkeAotICAgICAgICAgICAgICAgbW92YiAlZGwsNCsoJWVheCkKLSAgICAgICAgICAgICAgIG1vdmIgJDEzNyw1KyglZWF4KQotICAgICAgICAgICAgICAgbW92YiAkMCw2KyglZWF4KQotICAgICAgICAgICAgICAgbW92YiAlZGgsNysoJWVheCkKLSAgICAgICAgICAgICAgIHJvcmwgJDE2LCVlZHgKLSAgICAgICAgI05PX0FQUAotCi0gICAgICAgIFNvIGhlcmUgd2UgcHJvdmlkZSB0aGUgbWlzc2luZyB6ZXJvLgotICAgICovCi0KLSAgICAqZGlzcGxhY2VtZW50X3N0cmluZ19lbmQgPSAnMCc7Ci0gICAgfQotI2VuZGlmCi0jaWZuZGVmIExFWF9BVAotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBXZSBjYW4gaGF2ZSBvcGVyYW5kcyBvZiB0aGUgZm9ybQotICAgICAgICogICA8c3ltYm9sPkBHT1RPRkYrPG5ubj4KLSAgICAgICAqIFRha2UgdGhlIGVhc3kgd2F5IG91dCBoZXJlIGFuZCBjb3B5IGV2ZXJ5dGhpbmcKLSAgICAgICAqIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyLi4uCi0gICAgICAgKi8KLSAgICAgIHJlZ2lzdGVyIGNoYXIgKmNwOwotCi0gICAgICBjcCA9IHN0cmNociAoaW5wdXRfbGluZV9wb2ludGVyLCAnQCcpOwotICAgICAgaWYgKGNwICE9IE5VTEwpCi0gICAgICAgIHsKLQkgIGNoYXIgKnRtcGJ1ZjsKLQkgIGludCBsZW4sIGZpcnN0OwotCi0JIC8qIEdPVCByZWxvY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiAxNiBiaXQgbW9kZSAqLwotCSBpZiAoZmxhZ18xNmJpdF9jb2RlKQotCSAgIGFzX2JhZCAoXygiR09UIHJlbG9jYXRpb25zIG5vdCBzdXBwb3J0ZWQgaW4gMTYgYml0IG1vZGUiKSk7Ci0KLQkgIGlmIChHT1Rfc3ltYm9sID09IE5VTEwpCi0JICAgIEdPVF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpOwotCi0JICBpZiAoc3RybmNtcCAoY3AgKyAxLCAiUExUIiwgMykgPT0gMCkKLQkgICAgewotCSAgICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzM4Nl9QTFQzMjsKLQkgICAgICBsZW4gPSAzOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJuY21wIChjcCArIDEsICJHT1RPRkYiLCA2KSA9PSAwKQotCSAgICB7Ci0JICAgICAgaS5kaXNwX3JlbG9jW3RoaXNfb3BlcmFuZF0gPSBCRkRfUkVMT0NfMzg2X0dPVE9GRjsKLQkgICAgICBsZW4gPSA2OwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJuY21wIChjcCArIDEsICJHT1QiLCAzKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaS5kaXNwX3JlbG9jW3RoaXNfb3BlcmFuZF0gPSBCRkRfUkVMT0NfMzg2X0dPVDMyOwotCSAgICAgIGxlbiA9IDM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgYXNfYmFkIChfKCJCYWQgcmVsb2Mgc3BlY2lmaWVyIGluIGV4cHJlc3Npb24iKSk7Ci0KLQkgIC8qIFJlcGxhY2UgdGhlIHJlbG9jYXRpb24gdG9rZW4gd2l0aCAnICcsIHNvIHRoYXQgZXJyb3JzIGxpa2UKLQkgICAgIGZvb0BHT1RPRkYxIHdpbGwgYmUgZGV0ZWN0ZWQuICAqLwotCSAgZmlyc3QgPSBjcCAtIGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHRtcGJ1ZiA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuKGlucHV0X2xpbmVfcG9pbnRlcikpOwotCSAgbWVtY3B5ICh0bXBidWYsIGlucHV0X2xpbmVfcG9pbnRlciwgZmlyc3QpOwotCSAgdG1wYnVmW2ZpcnN0XSA9ICcgJzsKLQkgIHN0cmNweSAodG1wYnVmICsgZmlyc3QgKyAxLCBjcCArIDEgKyBsZW4pOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gdG1wYnVmOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICAgIGV4cF9zZWcgPSBleHByZXNzaW9uIChleHApOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgIC8qIFdlIGRvIHRoaXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHNlY3Rpb24gc3ltYm9sIGlzIGluCi0gICAgICAgdGhlIHN5bWJvbCB0YWJsZS4gIFdlIHdpbGwgdWx0aW1hdGVseSBjaGFuZ2UgdGhlIHJlbG9jYXRpb24KLSAgICAgICB0byBiZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uICovCi0gICAgaWYgKGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID09IEJGRF9SRUxPQ18zODZfR09UT0ZGKQotICAgICAgewotICAgICAgICBpZiAoU19JU19MT0NBTChleHAtPlhfYWRkX3N5bWJvbCkKLSAgICAgICAgICAgICYmIFNfR0VUX1NFR01FTlQgKGV4cC0+WF9hZGRfc3ltYm9sKSAhPSB1bmRlZmluZWRfc2VjdGlvbikKLSAgICAgICAgICBzZWN0aW9uX3N5bWJvbChleHAtPlhfYWRkX3N5bWJvbC0+YnN5bS0+c2VjdGlvbik7Ci0gICAgICAgIGFzc2VydCAoZXhwLT5YX29wID09IE9fc3ltYm9sKTsKLSAgICAgICAgZXhwLT5YX29wID0gT19zdWJ0cmFjdDsKLSAgICAgICAgZXhwLT5YX29wX3N5bWJvbCA9IEdPVF9zeW1ib2w7Ci0gICAgICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzMyOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcikKLSAgICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGp1bmsgYCVzJyBhZnRlciBleHByZXNzaW9uIiksCi0gICAgICAgICAgICAgICBpbnB1dF9saW5lX3BvaW50ZXIpOwotI2lmIEdDQ19BU01fT19IQUNLCi0gICAgIFJFU1RPUkVfRU5EX1NUUklORyAoZGlzcF9lbmQgKyAxKTsKLSNlbmRpZgotICAgICBSRVNUT1JFX0VORF9TVFJJTkcgKGRpc3BfZW5kKTsKLSAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgaWYgKGV4cC0+WF9vcCA9PSBPX2NvbnN0YW50KQotICAgICAgIHsKLSAgICAgICAgIGlmIChmaXRzX2luX3NpZ25lZF9ieXRlIChleHAtPlhfYWRkX251bWJlcikpCi0gICAgICAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBEaXNwODsKLSAgICAgICB9Ci0jaWZkZWYgT0JKX0FPVVQKLSAgICAgZWxzZSBpZiAoZXhwX3NlZyAhPSB0ZXh0X3NlY3Rpb24KLSAgICAgICAgICAgICAgJiYgZXhwX3NlZyAhPSBkYXRhX3NlY3Rpb24KLSAgICAgICAgICAgICAgJiYgZXhwX3NlZyAhPSBic3Nfc2VjdGlvbgotICAgICAgICAgICAgICAmJiBleHBfc2VnICE9IHVuZGVmaW5lZF9zZWN0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhc19iYWQgKF8gKCJVbmltcGxlbWVudGVkIHNlZ21lbnQgdHlwZSAlZCBpbiBvcGVyYW5kIiksIGV4cF9zZWcpOwotICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBpMzg2X29wZXJhbmRfbW9kaWZpZXIgUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci0KLXN0YXRpYyBpbnQKLWkzODZfb3BlcmFuZF9tb2RpZmllciAob3Bfc3RyaW5nLCBnb3RfYV9mbG9hdCkKLSAgICAgY2hhciAqKm9wX3N0cmluZzsKLSAgICAgaW50IGdvdF9hX2Zsb2F0OwotewotICAgIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJCWVRFIFBUUiIsIDgpKQotICAgICAgewotICAgICAgICBpLnN1ZmZpeCA9IEJZVEVfTU5FTV9TVUZGSVg7Ci0gICAgICAgICpvcF9zdHJpbmcgKz0gODsKLSAgICAgICAgcmV0dXJuIEJZVEVfUFRSOwotCi0gICAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiV09SRCBQVFIiLCA4KSkKLSAgICAgIHsKLSAgICAgICAgaS5zdWZmaXggPSBXT1JEX01ORU1fU1VGRklYOwotICAgICAgICAqb3Bfc3RyaW5nICs9IDg7Ci0gICAgICAgIHJldHVybiBXT1JEX1BUUjsKLSAgICAgIH0KLQotICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAoKm9wX3N0cmluZywgIkRXT1JEIFBUUiIsIDkpKQotICAgICAgewotICAgICAgICBpZiAoZ290X2FfZmxvYXQpCi0gICAgICAgICAgaS5zdWZmaXggPSBTSE9SVF9NTkVNX1NVRkZJWDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGkuc3VmZml4ID0gRFdPUkRfTU5FTV9TVUZGSVg7Ci0gICAgICAgICpvcF9zdHJpbmcgKz0gOTsKLSAgICAgICAgcmV0dXJuIERXT1JEX1BUUjsKLSAgICAgIH0KLQotICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAoKm9wX3N0cmluZywgIlFXT1JEIFBUUiIsIDkpKQotICAgICAgewotICAgICAgICBpLnN1ZmZpeCA9IElOVEVMX0RXT1JEX01ORU1fU1VGRklYOwotICAgICAgICAqb3Bfc3RyaW5nICs9IDk7Ci0gICAgICAgIHJldHVybiBRV09SRF9QVFI7Ci0gICAgICB9Ci0KLSAgICBlbHNlIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJYV09SRCBQVFIiLCA5KSkKLSAgICAgIHsKLSAgICAgICAgaS5zdWZmaXggPSBMT05HX0RPVUJMRV9NTkVNX1NVRkZJWDsKLSAgICAgICAgKm9wX3N0cmluZyArPSA5OwotICAgICAgICByZXR1cm4gWFdPUkRfUFRSOwotICAgICAgfQotCi0gICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiU0hPUlQiLCA1KSkKLSAgICAgIHsKLSAgICAgICAgKm9wX3N0cmluZyArPSA1OwotICAgICAgICByZXR1cm4gU0hPUlQ7Ci0gICAgICB9Ci0KLSAgICBlbHNlIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJPRkZTRVQgRkxBVDoiLCAxMikpCi0gICAgICB7Ci0gICAgICAgICpvcF9zdHJpbmcgKz0gMTI7Ci0gICAgICAgIHJldHVybiBPRkZTRVRfRkxBVDsKLSAgICAgIH0KLQotICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAoKm9wX3N0cmluZywgIkZMQVQiLCA0KSkKLSAgICAgIHsKLSAgICAgICAgKm9wX3N0cmluZyArPSA0OwotICAgICAgICByZXR1cm4gRkxBVDsKLSAgICAgIH0KLQotICAgIGVsc2UgcmV0dXJuIE5PTkVfRk9VTkQ7Ci19IAotCi1zdGF0aWMgY2hhciAqIGJ1aWxkX2Rpc3BsYWNlbWVudF9zdHJpbmcgUEFSQU1TICgoaW50LCBjaGFyICopKTsKLQotc3RhdGljIGNoYXIgKgotYnVpbGRfZGlzcGxhY2VtZW50X3N0cmluZyAoaW5pdGlhbF9kaXNwLCBvcF9zdHJpbmcpCi0gICAgIGludCBpbml0aWFsX2Rpc3A7Ci0gICAgIGNoYXIgKm9wX3N0cmluZzsKLXsKLSAgY2hhciAqdGVtcF9zdHJpbmcgPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAob3Bfc3RyaW5nKSArIDEpOwotICBjaGFyICplbmRfb2Zfb3BlcmFuZF9zdHJpbmc7Ci0gIGNoYXIgKnRjOwotICBjaGFyICp0ZW1wX2Rpc3A7Ci0KLSAgdGVtcF9zdHJpbmdbMF0gPSAnXDAnOwotICB0YyA9IGVuZF9vZl9vcGVyYW5kX3N0cmluZyA9IHN0cmNociAob3Bfc3RyaW5nLCAnWycpOwotICBpZiAoIGluaXRpYWxfZGlzcCAmJiAhZW5kX29mX29wZXJhbmRfc3RyaW5nKQotICAgIHsKLSAgICAgIHN0cmNweSAodGVtcF9zdHJpbmcsIG9wX3N0cmluZyk7Ci0gICAgICByZXR1cm4gKHRlbXBfc3RyaW5nKTsKLSAgICB9Ci0KLSAgLyogQnVpbGQgdGhlIHdob2xlIGRpc3BsYWNlbWVudCBzdHJpbmcgKi8KLSAgaWYgKGluaXRpYWxfZGlzcCkKLSAgICB7Ci0gICAgICBzdHJuY3B5ICh0ZW1wX3N0cmluZywgb3Bfc3RyaW5nLCBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgLSBvcF9zdHJpbmcpOwotICAgICAgdGVtcF9zdHJpbmdbZW5kX29mX29wZXJhbmRfc3RyaW5nIC0gb3Bfc3RyaW5nXSA9ICdcMCc7Ci0gICAgICB0ZW1wX2Rpc3AgPSB0YzsKLSAgICB9Ci0gIGVsc2UgCi0gICAgdGVtcF9kaXNwID0gb3Bfc3RyaW5nOwotCi0gIHdoaWxlICgqdGVtcF9kaXNwICE9ICdcMCcpCi0gICAgewotICAgICAgaW50IGFkZF9taW51cyA9ICgqdGVtcF9kaXNwID09ICctJyk7Ci0KLSAgICAgIGlmICgqdGVtcF9kaXNwID09ICcrJyB8fCAqdGVtcF9kaXNwID09ICctJyB8fCAqdGVtcF9kaXNwID09ICdbJykKLSAgICAgICAgdGVtcF9kaXNwKys7Ci0KLSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqdGVtcF9kaXNwKSkKLSAgICAgICAgdGVtcF9kaXNwKys7Ci0KLSAgICAgIC8qIERvbid0IGNvbnNpZGVyIHJlZ2lzdGVycyAqLwotICAgICAgaWYgKCp0ZW1wX2Rpc3AgIT0gUkVHSVNURVJfUFJFRklYCi0gICAgICAgICAgJiYgIShhbGxvd19uYWtlZF9yZWcgJiYgaTM4Nl9pc19yZWcgKHRlbXBfZGlzcCkpKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhciAqc3RyaW5nX3N0YXJ0ID0gdGVtcF9kaXNwOwotCi0gICAgICAgICAgd2hpbGUgKCp0ZW1wX2Rpc3AgIT0gJ10nCi0gICAgICAgICAgICAgICAgICYmICp0ZW1wX2Rpc3AgIT0gJysnCi0gICAgICAgICAgICAgICAgICYmICp0ZW1wX2Rpc3AgIT0gJy0nCi0gICAgICAgICAgICAgICAgICYmICp0ZW1wX2Rpc3AgIT0gJyonKQotICAgICAgICAgICAgKyt0ZW1wX2Rpc3A7Ci0KLSAgICAgICAgICBpZiAoYWRkX21pbnVzKQotICAgICAgICAgICAgc3RyY2F0ICh0ZW1wX3N0cmluZywgIi0iKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdHJjYXQgKHRlbXBfc3RyaW5nLCAiKyIpOwotCi0gICAgICAgICAgc3RybmNhdCAodGVtcF9zdHJpbmcsIHN0cmluZ19zdGFydCwgdGVtcF9kaXNwIC0gc3RyaW5nX3N0YXJ0KTsKLSAgICAgICAgICBpZiAoKnRlbXBfZGlzcCA9PSAnKycgfHwgKnRlbXBfZGlzcCA9PSAnLScpCi0gICAgICAgICAgICAtLXRlbXBfZGlzcDsKLSAgICAgICAgfQotCi0gICAgICB3aGlsZSAoKnRlbXBfZGlzcCAhPSAnXDAnCi0gICAgICAgICAgICAgJiYgKnRlbXBfZGlzcCAhPSAnKycKLSAgICAgICAgICAgICAmJiAqdGVtcF9kaXNwICE9ICctJykKLSAgICAgICAgKyt0ZW1wX2Rpc3A7Ci0gICAgfQotCi0gIHJldHVybiB0ZW1wX3N0cmluZzsKLX0KLQotc3RhdGljIGludCBpMzg2X3BhcnNlX3NlZyBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIGludAotaTM4Nl9wYXJzZV9zZWcgKG9wX3N0cmluZykKLSAgICAgY2hhciAqb3Bfc3RyaW5nOwotewotICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0gICAgKytvcF9zdHJpbmc7Ci0KLSAgLyogU2hvdWxkIGJlIG9uZSBvZiBlcywgY3MsIHNzLCBkcyBmcyBvciBncyAqLwotICBzd2l0Y2ggKCpvcF9zdHJpbmcrKykKLSAgICB7Ci0gICAgY2FzZSAnZSc6Ci0gICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZXM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdjJzoKLSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZjczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3MnOgotICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJnNzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZHM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdmJzoKLSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZmczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2cnOgotICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmdzOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygiYmFkIHNlZ21lbnQgbmFtZSBgJXMnIiksIG9wX3N0cmluZyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKCpvcF9zdHJpbmcrKyAhPSAncycpCi0gICAgewotICAgICAgIGFzX2JhZCAoXygiYmFkIHNlZ21lbnQgbmFtZSBgJXMnIiksIG9wX3N0cmluZyk7Ci0gICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKLSAgICArK29wX3N0cmluZzsKLQotICBpZiAoKm9wX3N0cmluZyAhPSAnOicpCi0gICAgewotICAgICAgIGFzX2JhZCAoXygiYmFkIHNlZ21lbnQgbmFtZSBgJXMnIiksIG9wX3N0cmluZyk7Ci0gICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOyAKLSAgCi19Ci0KLXN0YXRpYyBpbnQgaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIGludAotaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCAob3Bfc3RyaW5nKQotICAgICBjaGFyICpvcF9zdHJpbmc7Ci17Ci0KLSAgY2hhciAqZW5kX29mX29wZXJhbmRfc3RyaW5nOwotCi0gIGlmIChpc19kaWdpdF9jaGFyICgqb3Bfc3RyaW5nKQotICAgICAgJiYgc3RyY2hyIChvcF9zdHJpbmcsICdbJykgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoIWkzODZfaW1tZWRpYXRlIChvcF9zdHJpbmcpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIExvb2sgZm9yIGRpc3BsYWNlbWVudCBwcmVjZWRpbmcgb3BlbiBicmFja2V0ICovCi0gIGlmICgqb3Bfc3RyaW5nICE9ICdbJykKLSAgICB7Ci0gICAgICBjaGFyICplbmRfc2VnOwotICAgICAgY2hhciAqdGVtcF9zdHJpbmc7Ci0KLSAgICAgIGVuZF9zZWcgPSBzdHJjaHIgKG9wX3N0cmluZywgJzonKTsKLSAgICAgIGlmIChlbmRfc2VnKQotICAgICAgICB7Ci0gICAgICAgICAgIGlmICghaTM4Nl9wYXJzZV9zZWcgKG9wX3N0cmluZykpCi0gICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgIG9wX3N0cmluZyA9IGVuZF9zZWcgKyAxOwotICAgICAgICB9Ci0KLSAgICAgIHRlbXBfc3RyaW5nID0gYnVpbGRfZGlzcGxhY2VtZW50X3N0cmluZyAodHJ1ZSwgb3Bfc3RyaW5nKTsKLSAgICAgIGlmICghaTM4Nl9kaXNwbGFjZW1lbnQgKHRlbXBfc3RyaW5nLCB0ZW1wX3N0cmluZyArIHN0cmxlbiAodGVtcF9zdHJpbmcpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgIGVuZF9vZl9vcGVyYW5kX3N0cmluZyA9IHN0cmNociAob3Bfc3RyaW5nLCAnWycpOwotICAgICAgaWYgKCFlbmRfb2Zfb3BlcmFuZF9zdHJpbmcpCi0gICAgICAgIGVuZF9vZl9vcGVyYW5kX3N0cmluZyA9IG9wX3N0cmluZyArIHN0cmxlbiAob3Bfc3RyaW5nKTsKLQotICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCplbmRfb2Zfb3BlcmFuZF9zdHJpbmcpKQotICAgICAgICAtLWVuZF9vZl9vcGVyYW5kX3N0cmluZzsKLQotICAgICAgb3Bfc3RyaW5nID0gZW5kX29mX29wZXJhbmRfc3RyaW5nOwotICAgICB9Ci0KLSAgaWYgKCpvcF9zdHJpbmcgPT0gJ1snKQotICAgIHsKLSAgICAgICsrb3Bfc3RyaW5nOwotCi0gICAgICAvKiBQaWNrIG9mZiBlYWNoIGNvbXBvbmVudCBhbmQgZmlndXJlIG91dCB3aGVyZSBpdCBiZWxvbmdzICovCi0KLSAgICAgIGVuZF9vZl9vcGVyYW5kX3N0cmluZyA9IG9wX3N0cmluZzsKLQotICAgICAgd2hpbGUgKCpvcF9zdHJpbmcgIT0gJ10nKQotICAgICAgICB7Ci0KLSAgICAgICAgICB3aGlsZSAoKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnKycKLSAgICAgICAgICAgICAgICAgJiYgKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnLScKLSAgICAgICAgICAgICAgICAgJiYgKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnKicKLSAgICAgICAgICAgICAgICAgJiYgKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnXScpCi0gICAgICAgICAgICBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcrKzsKLQotICAgICAgICAgIGlmICgqb3Bfc3RyaW5nID09ICcrJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2hhciAqdGVtcF9zdHJpbmcgPSBvcF9zdHJpbmcgKyAxOwotICAgICAgICAgICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKnRlbXBfc3RyaW5nKSkKLSAgICAgICAgICAgICAgICArK3RlbXBfc3RyaW5nOwotICAgICAgICAgICAgICBpZiAoKnRlbXBfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWAotICAgICAgICAgICAgICAgICAgfHwgKGFsbG93X25ha2VkX3JlZyAmJiBpMzg2X2lzX3JlZyAodGVtcF9zdHJpbmcpKSkKLSAgICAgICAgICAgICAgICArK29wX3N0cmluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICgqb3Bfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWAotICAgICAgICAgICAgICB8fCAoYWxsb3dfbmFrZWRfcmVnICYmIGkzODZfaXNfcmVnIChvcF9zdHJpbmcpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY29uc3QgcmVnX2VudHJ5ICp0ZW1wX3JlZzsKLSAgICAgICAgICAgICAgY2hhciAqZW5kX29wOwotCi0gICAgICAgICAgICAgIEVORF9TVFJJTkdfQU5EX1NBVkUgKGVuZF9vZl9vcGVyYW5kX3N0cmluZyk7Ci0gICAgICAgICAgICAgIHRlbXBfcmVnID0gcGFyc2VfcmVnaXN0ZXIgKG9wX3N0cmluZywgJmVuZF9vcCk7Ci0gICAgICAgICAgICAgIFJFU1RPUkVfRU5EX1NUUklORyAoZW5kX29mX29wZXJhbmRfc3RyaW5nKTsKLQotICAgICAgICAgICAgICBpZiAodGVtcF9yZWcgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgICBpZiAoaS5iYXNlX3JlZyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGkuYmFzZV9yZWcgPSB0ZW1wX3JlZzsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGkuaW5kZXhfcmVnID0gdGVtcF9yZWc7Ci0KLSAgICAgICAgICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IEJhc2VJbmRleDsKLQotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGlzX2RpZ2l0X2NoYXIgKCpvcF9zdHJpbmcpIHx8ICpvcF9zdHJpbmcgPT0gJysnIHx8ICpvcF9zdHJpbmcgPT0gJy0nKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgIGNoYXIgKnRlbXBfc3RyaW5nID0gYnVpbGRfZGlzcGxhY2VtZW50X3N0cmluZyAoZmFsc2UsIG9wX3N0cmluZyk7Ci0KLSAgICAgICAgICAgICAgaWYgKCp0ZW1wX3N0cmluZyA9PSAnKycpCi0gICAgICAgICAgICAgICAgKyt0ZW1wX3N0cmluZzsKLQotICAgICAgICAgICAgICBpZiAoIWkzODZfZGlzcGxhY2VtZW50ICh0ZW1wX3N0cmluZywgdGVtcF9zdHJpbmcgKyBzdHJsZW4gKHRlbXBfc3RyaW5nKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgCi0gICAgICAgICAgICAgICsrb3Bfc3RyaW5nOwotICAgICAgICAgICAgICBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgPSBvcF9zdHJpbmc7Ci0gICAgICAgICAgICAgIHdoaWxlICgqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICddJwotICAgICAgICAgICAgICAgICAgICAgJiYgKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnKycKLSAgICAgICAgICAgICAgICAgICAgICYmICplbmRfb2Zfb3BlcmFuZF9zdHJpbmcgIT0gJy0nCi0gICAgICAgICAgICAgICAgICAgICAmJiAqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICcqJykKLSAgICAgICAgICAgICAgICsrZW5kX29mX29wZXJhbmRfc3RyaW5nOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCpvcF9zdHJpbmcgPT0gJyonKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICArK29wX3N0cmluZzsKLQotICAgICAgICAgICAgICBpZiAoaS5iYXNlX3JlZyAmJiAhaS5pbmRleF9yZWcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaS5pbmRleF9yZWcgPSBpLmJhc2VfcmVnOwotICAgICAgICAgICAgICAgICAgaS5iYXNlX3JlZyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGlmICghaTM4Nl9zY2FsZSAob3Bfc3RyaW5nKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBvcF9zdHJpbmcgPSBlbmRfb2Zfb3BlcmFuZF9zdHJpbmc7Ci0gICAgICAgICAgKytlbmRfb2Zfb3BlcmFuZF9zdHJpbmc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgaTM4Nl9pbnRlbF9vcGVyYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyBpbnQKLWkzODZfaW50ZWxfb3BlcmFuZCAob3BlcmFuZF9zdHJpbmcsIGdvdF9hX2Zsb2F0KQotICAgICBjaGFyICpvcGVyYW5kX3N0cmluZzsKLSAgICAgaW50IGdvdF9hX2Zsb2F0OwotewotICBjaGFyICpvcF9zdHJpbmcgPSBvcGVyYW5kX3N0cmluZzsKLQotICBpbnQgb3BlcmFuZF9tb2RpZmllciA9IGkzODZfb3BlcmFuZF9tb2RpZmllciAoJm9wX3N0cmluZywgZ290X2FfZmxvYXQpOwotICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0gICAgKytvcF9zdHJpbmc7Ci0KLSAgc3dpdGNoIChvcGVyYW5kX21vZGlmaWVyKQotICAgIHsKLSAgICBjYXNlIEJZVEVfUFRSOgotICAgIGNhc2UgV09SRF9QVFI6Ci0gICAgY2FzZSBEV09SRF9QVFI6Ci0gICAgY2FzZSBRV09SRF9QVFI6Ci0gICAgY2FzZSBYV09SRF9QVFI6Ci0gICAgICBpZiAoKGkubWVtX29wZXJhbmRzID09IDEKLSAgICAgICAgICAgJiYgKGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+b3Bjb2RlX21vZGlmaWVyICYgSXNTdHJpbmcpID09IDApCi0gICAgICAgICAgfHwgaS5tZW1fb3BlcmFuZHMgPT0gMikKLSAgICAgICAgewotICAgICAgICAgIGFzX2JhZCAoXygidG9vIG1hbnkgbWVtb3J5IHJlZmVyZW5jZXMgZm9yIGAlcyciKSwKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+bmFtZSk7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKCFpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kIChvcF9zdHJpbmcpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgICAgaS5tZW1fb3BlcmFuZHMrKzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGTEFUOgotCi0gICAgY2FzZSBPRkZTRVRfRkxBVDoKLSAgICAgIGlmICghaTM4Nl9pbW1lZGlhdGUgKG9wX3N0cmluZykpCi0gICAgICAgIHJldHVybiAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNIT1JUOgotCi0gICAgY2FzZSBOT05FX0ZPVU5EOgotICAgIC8qIFNob3VsZCBiZSByZWdpc3RlciBvciBpbW1lZGlhdGUgKi8KLSAgICBpZiAoaXNfZGlnaXRfY2hhciAoKm9wX3N0cmluZykKLSAgICAgICAgJiYgc3RyY2hyIChvcF9zdHJpbmcsICdbJykgPT0gMCkKLSAgICAgIHsKLSAgICAgIGlmICghaTM4Nl9pbW1lZGlhdGUgKG9wX3N0cmluZykpCi0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgIGVsc2UgaWYgKCpvcF9zdHJpbmcgPT0gUkVHSVNURVJfUFJFRklYCi0gICAgICAgICAgICAgfHwgKGFsbG93X25ha2VkX3JlZwotCSAgICAgICAgICYmIGkzODZfaXNfcmVnIChvcF9zdHJpbmcpKSkKLSAgICAgIHsKLQotICAgICAgICByZWdpc3RlciBjb25zdCByZWdfZW50cnkgKiByOwotICAgICAgICBjaGFyICplbmRfb3A7Ci0KLSAgICAgICAgciA9IHBhcnNlX3JlZ2lzdGVyIChvcF9zdHJpbmcsICZlbmRfb3ApOwotICAgICAgICBpZiAociA9PSBOVUxMKQotICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIC8qIENoZWNrIGZvciBhIHNlZ21lbnQgb3ZlcnJpZGUgYnkgc2VhcmNoaW5nIGZvciAnOicgYWZ0ZXIgYQotICAgICAgICAgICBzZWdtZW50IHJlZ2lzdGVyLiAgKi8KLSAgICAgICAgb3Bfc3RyaW5nID0gZW5kX29wOwotICAgICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0gICAgICAgICAgKytvcF9zdHJpbmc7Ci0gICAgICAgIGlmICgqb3Bfc3RyaW5nID09ICc6JyAmJiAoci0+cmVnX3R5cGUgJiAoU1JlZzIgfCBTUmVnMykpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoci0+cmVnX251bSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmVzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmNzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJnNzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmRzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmZzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmdzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICB9Ci0gICAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSByLT5yZWdfdHlwZSAmIH5CYXNlSW5kZXg7Ci0gICAgICAgIGkucmVnc1t0aGlzX29wZXJhbmRdID0gcjsKLSAgICAgICAgaS5yZWdfb3BlcmFuZHMrKzsKLSAgICAgIH0KLQotICAgIGVsc2UgCi0gICAgICB7Ci0KLSAgICAgICAgaWYgKCFpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kIChvcF9zdHJpbmcpKQotICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGkubWVtX29wZXJhbmRzKys7Ci0gICAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgfSAgLyogZW5kIHN3aXRjaCAqLwotICAvKiBTcGVjaWFsIGNhc2UgZm9yICglZHgpIHdoaWxlIGRvaW5nIGlucHV0L291dHB1dCBvcC4gICovCi0gIGlmIChpLmJhc2VfcmVnCi0gICAgICAmJiBpLmJhc2VfcmVnLT5yZWdfdHlwZSA9PSAoUmVnMTYgfCBJbk91dFBvcnRSZWcpCi0gICAgICAmJiBpLmluZGV4X3JlZyA9PSAwCi0gICAgICAmJiBpLmxvZzJfc2NhbGVfZmFjdG9yID09IDAKLSAgICAgICYmIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9PSAwCi0gICAgICAmJiAoaS50eXBlc1t0aGlzX29wZXJhbmRdICYgRGlzcCkgPT0gMCkKLSAgICAgewotICAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSA9IEluT3V0UG9ydFJlZzsKLSAgICAgICByZXR1cm4gMTsKLSAgICAgfQotICAvKiBNYWtlIHN1cmUgdGhlIG1lbW9yeSBvcGVyYW5kIHdlJ3ZlIGJlZW4gZGVhbHQgaXMgdmFsaWQuICAqLwotICBpZiAoZmxhZ18xNmJpdF9jb2RlIF4gKGkucHJlZml4W0FERFJfUFJFRklYXSAhPSAwKSkKLSAgICB7Ci0gICAgICBpZiAoKGkuYmFzZV9yZWcKLQkgICAmJiAoKGkuYmFzZV9yZWctPnJlZ190eXBlICYgKFJlZzE2fEJhc2VJbmRleCkpCi0JCSE9IChSZWcxNnxCYXNlSW5kZXgpKSkKLQkgICAgICB8fCAoaS5pbmRleF9yZWcKLQkJICAmJiAoKChpLmluZGV4X3JlZy0+cmVnX3R5cGUgJiAoUmVnMTZ8QmFzZUluZGV4KSkKLQkJICAgICAgICE9IChSZWcxNnxCYXNlSW5kZXgpKQotCQkgICAgICB8fCAhIChpLmJhc2VfcmVnCi0JCQkgICAgJiYgaS5iYXNlX3JlZy0+cmVnX251bSA8IDYKLQkJCSAgICAmJiBpLmluZGV4X3JlZy0+cmVnX251bSA+PSA2Ci0JCQkgICAgJiYgaS5sb2cyX3NjYWxlX2ZhY3RvciA9PSAwKSkpKQotCSB7Ci0JICAgYXNfYmFkIChfKCJgJXMnIGlzIG5vdCBhIHZhbGlkICVzIGJpdCBiYXNlL2luZGV4IGV4cHJlc3Npb24iKSwKLSAgICAgICAgICAgICAgICAgICBvcGVyYW5kX3N0cmluZywgIjE2Iik7Ci0gICAgICAgICAgIHJldHVybiAwOwotCSB9Ci0gICAgfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgoaS5iYXNlX3JlZwotCSAgICAgICAmJiAoaS5iYXNlX3JlZy0+cmVnX3R5cGUgJiBSZWczMikgPT0gMCkKLQkgICAgICB8fCAoaS5pbmRleF9yZWcKLQkJICAmJiAoKGkuaW5kZXhfcmVnLT5yZWdfdHlwZSAmIChSZWczMnxCYXNlSW5kZXgpKQotCQkgICAgICAhPSAoUmVnMzJ8QmFzZUluZGV4KSkpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJgJXMnIGlzIG5vdCBhIHZhbGlkICVzIGJpdCBiYXNlL2luZGV4IGV4cHJlc3Npb24iKSwKLQkJICAgICAgb3BlcmFuZF9zdHJpbmcsICIzMiIpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotICByZXR1cm4gMTsKLX0KLQotLyogUGFyc2UgT1BFUkFORF9TVFJJTkcgaW50byB0aGUgaTM4Nl9pbnNuIHN0cnVjdHVyZSBJLiAgUmV0dXJucyBub24temVybwotICAgb24gZXJyb3IuICovCi0KLXN0YXRpYyBpbnQgaTM4Nl9vcGVyYW5kIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgaW50Ci1pMzg2X29wZXJhbmQgKG9wZXJhbmRfc3RyaW5nKQotICAgICBjaGFyICpvcGVyYW5kX3N0cmluZzsKLXsKLSAgY2hhciAqb3Bfc3RyaW5nID0gb3BlcmFuZF9zdHJpbmc7Ci0KLSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQotICAgICsrb3Bfc3RyaW5nOwotCi0gIC8qIFdlIGNoZWNrIGZvciBhbiBhYnNvbHV0ZSBwcmVmaXggKGRpZmZlcmVudGlhdGluZywKLSAgICAgZm9yIGV4YW1wbGUsICdqbXAgcGNfcmVsYXRpdmVfbGFiZWwnIGZyb20gJ2ptcCAqYWJzb2x1dGVfbGFiZWwnLiAqLwotICBpZiAoKm9wX3N0cmluZyA9PSBBQlNPTFVURV9QUkVGSVgpCi0gICAgewotICAgICAgKytvcF9zdHJpbmc7Ci0gICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0gICAgICAgICsrb3Bfc3RyaW5nOwotICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IEp1bXBBYnNvbHV0ZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgaWYgb3BlcmFuZCBpcyBhIHJlZ2lzdGVyLiAqLwotICBpZiAoKm9wX3N0cmluZyA9PSBSRUdJU1RFUl9QUkVGSVgKLSAgICAgIHx8IChhbGxvd19uYWtlZF9yZWcgJiYgaTM4Nl9pc19yZWcgKG9wX3N0cmluZykpKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGNvbnN0IHJlZ19lbnRyeSAqcjsKLSAgICAgIGNoYXIgKmVuZF9vcDsKLQotICAgICAgciA9IHBhcnNlX3JlZ2lzdGVyIChvcF9zdHJpbmcsICZlbmRfb3ApOwotICAgICAgaWYgKHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgIC8qIENoZWNrIGZvciBhIHNlZ21lbnQgb3ZlcnJpZGUgYnkgc2VhcmNoaW5nIGZvciAnOicgYWZ0ZXIgYQotCSBzZWdtZW50IHJlZ2lzdGVyLiAgKi8KLSAgICAgIG9wX3N0cmluZyA9IGVuZF9vcDsKLSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKLSAgICAgICAgKytvcF9zdHJpbmc7Ci0gICAgICBpZiAoKm9wX3N0cmluZyA9PSAnOicgJiYgKHItPnJlZ190eXBlICYgKFNSZWcyIHwgU1JlZzMpKSkKLSAgICAgICAgewotICAgICAgICAgIHN3aXRjaCAoci0+cmVnX251bSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZXM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMToKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmY3M7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjoKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmc3M7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMzoKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZHM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgNDoKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZnM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgNToKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZ3M7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogU2tpcCB0aGUgJzonIGFuZCB3aGl0ZXNwYWNlLiAgKi8KLQkgICsrb3Bfc3RyaW5nOwotCSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQotCSAgICArK29wX3N0cmluZzsKLQotCSAgLyogUHJldGVuZCBnaXZlbiBzdHJpbmcgc3RhcnRzIGhlcmUuICovCi0JICBvcGVyYW5kX3N0cmluZyA9IG9wX3N0cmluZzsKLQkgIGlmICghaXNfZGlnaXRfY2hhciAoKm9wX3N0cmluZykKLQkgICAgICAmJiAhaXNfaWRlbnRpZmllcl9jaGFyICgqb3Bfc3RyaW5nKQotCSAgICAgICYmICpvcF9zdHJpbmcgIT0gJygnCi0JICAgICAgJiYgKm9wX3N0cmluZyAhPSBBQlNPTFVURV9QUkVGSVgpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImJhZCBtZW1vcnkgb3BlcmFuZCBgJXMnIiksIG9wX3N0cmluZyk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQkgIC8qIEhhbmRsZSBjYXNlIG9mICVlczoqZm9vLiAqLwotCSAgaWYgKCpvcF9zdHJpbmcgPT0gQUJTT0xVVEVfUFJFRklYKQotCSAgICB7Ci0JICAgICAgKytvcF9zdHJpbmc7Ci0JICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQotCQkrK29wX3N0cmluZzsKLQkgICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gSnVtcEFic29sdXRlOwotCSAgICB9Ci0JICBnb3RvIGRvX21lbW9yeV9yZWZlcmVuY2U7Ci0JfQotICAgICAgaWYgKCpvcF9zdHJpbmcpCi0JewotCSAgYXNfYmFkIChfKCJKdW5rIGAlcycgYWZ0ZXIgcmVnaXN0ZXIiKSwgb3Bfc3RyaW5nKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSByLT5yZWdfdHlwZSAmIH5CYXNlSW5kZXg7Ci0gICAgICBpLnJlZ3NbdGhpc19vcGVyYW5kXSA9IHI7Ci0gICAgICBpLnJlZ19vcGVyYW5kcysrOwotICAgIH0KLSAgZWxzZSBpZiAoKm9wX3N0cmluZyA9PSBJTU1FRElBVEVfUFJFRklYKQotICAgIHsJCQkJLyogLi4uIG9yIGFuIGltbWVkaWF0ZSAqLwotICAgICAgKytvcF9zdHJpbmc7Ci0gICAgICBpZiAoIWkzODZfaW1tZWRpYXRlIChvcF9zdHJpbmcpKQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGlzX2RpZ2l0X2NoYXIgKCpvcF9zdHJpbmcpIAotICAgICAgICAgICB8fCBpc19pZGVudGlmaWVyX2NoYXIgKCpvcF9zdHJpbmcpCi0JICAgfHwgKm9wX3N0cmluZyA9PSAnKCcgKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBtZW1vcnkgcmVmZXJlbmNlIG9mIHNvbWUgc29ydC4gKi8KLSAgICAgIGNoYXIgKmVuZF9vZl9vcGVyYW5kX3N0cmluZzsKLSAgICAgIHJlZ2lzdGVyIGNoYXIgKmJhc2Vfc3RyaW5nOwotICAgICAgaW50IGZvdW5kX2Jhc2VfaW5kZXhfZm9ybTsKLQotICAgICAgLyogU3RhcnQgYW5kIGVuZCBvZiBkaXNwbGFjZW1lbnQgc3RyaW5nIGV4cHJlc3Npb24gKGlmIGZvdW5kKS4gKi8KLSAgICAgIGNoYXIgKmRpc3BsYWNlbWVudF9zdHJpbmdfc3RhcnQ7Ci0gICAgICBjaGFyICpkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZDsKLQotICAgIGRvX21lbW9yeV9yZWZlcmVuY2U6Ci0KLSAgICAgIGlmICgoaS5tZW1fb3BlcmFuZHMgPT0gMQotCSAgICYmIChjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm9wY29kZV9tb2RpZmllciAmIElzU3RyaW5nKSA9PSAwKQotCSAgfHwgaS5tZW1fb3BlcmFuZHMgPT0gMikKLQl7Ci0JICBhc19iYWQgKF8oInRvbyBtYW55IG1lbW9yeSByZWZlcmVuY2VzIGZvciBgJXMnIiksCi0JCSAgY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5uYW1lKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogQ2hlY2sgZm9yIGJhc2UgaW5kZXggZm9ybS4gIFdlIGRldGVjdCB0aGUgYmFzZSBpbmRleCBmb3JtIGJ5Ci0JIGxvb2tpbmcgZm9yIGFuICcpJyBhdCB0aGUgZW5kIG9mIHRoZSBvcGVyYW5kLCBzZWFyY2hpbmcKLQkgZm9yIHRoZSAnKCcgbWF0Y2hpbmcgaXQsIGFuZCBmaW5kaW5nIGEgUkVHSVNURVJfUFJFRklYIG9yICcsJwotCSBhZnRlciB0aGUgJygnLiAgKi8KLSAgICAgIGZvdW5kX2Jhc2VfaW5kZXhfZm9ybSA9IDA7Ci0gICAgICBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgPSBvcF9zdHJpbmcgKyBzdHJsZW4gKG9wX3N0cmluZyk7Ci0KLSAgICAgIC0tZW5kX29mX29wZXJhbmRfc3RyaW5nOwotICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCplbmRfb2Zfb3BlcmFuZF9zdHJpbmcpKQotCS0tZW5kX29mX29wZXJhbmRfc3RyaW5nOwotCi0gICAgICBiYXNlX3N0cmluZyA9IGVuZF9vZl9vcGVyYW5kX3N0cmluZzsKLQotICAgICAgaWYgKCpiYXNlX3N0cmluZyA9PSAnKScpCi0JewotCSAgdW5zaWduZWQgaW50IHBhcmVuc19iYWxhbmNlZCA9IDE7Ci0JICAvKiBXZSd2ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGUgbnVtYmVyIG9mIGxlZnQgJiByaWdodCAoKSdzIGFyZQotCSAgICAgZXF1YWwsIHNvIHRoaXMgbG9vcCB3aWxsIG5vdCBiZSBpbmZpbml0ZS4gKi8KLQkgIGRvCi0JICAgIHsKLQkgICAgICBiYXNlX3N0cmluZy0tOwotCSAgICAgIGlmICgqYmFzZV9zdHJpbmcgPT0gJyknKQotCQlwYXJlbnNfYmFsYW5jZWQrKzsKLQkgICAgICBpZiAoKmJhc2Vfc3RyaW5nID09ICcoJykKLQkJcGFyZW5zX2JhbGFuY2VkLS07Ci0JICAgIH0KLQkgIHdoaWxlIChwYXJlbnNfYmFsYW5jZWQpOwotCi0JICAvKiBJZiB0aGVyZSBpcyBhIGRpc3BsYWNlbWVudCBzZXQtdXAgZm9yIGl0IHRvIGJlIHBhcnNlZCBsYXRlci4gKi8KLQkgIGRpc3BsYWNlbWVudF9zdHJpbmdfc3RhcnQgPSBvcF9zdHJpbmc7Ci0JICBkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCA9IGJhc2Vfc3RyaW5nOwotCi0JICAvKiBTa2lwIHBhc3QgJygnIGFuZCB3aGl0ZXNwYWNlLiAgKi8KLQkgICsrYmFzZV9zdHJpbmc7Ci0JICBpZiAoaXNfc3BhY2VfY2hhciAoKmJhc2Vfc3RyaW5nKSkKLQkgICAgKytiYXNlX3N0cmluZzsKLQotCSAgaWYgKCpiYXNlX3N0cmluZyA9PSBSRUdJU1RFUl9QUkVGSVgKLQkgICAgICB8fCAoYWxsb3dfbmFrZWRfcmVnICYmIGkzODZfaXNfcmVnIChiYXNlX3N0cmluZykpCi0JICAgICAgfHwgKmJhc2Vfc3RyaW5nID09ICcsJykKLQkgICAgZm91bmRfYmFzZV9pbmRleF9mb3JtID0gMTsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGNhbid0IHBhcnNlIGEgYmFzZSBpbmRleCByZWdpc3RlciBleHByZXNzaW9uLCB3ZSd2ZSBmb3VuZAotCSBhIHB1cmUgZGlzcGxhY2VtZW50IGV4cHJlc3Npb24uICBXZSBzZXQgdXAgZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydAotCSBhbmQgZGlzcGxhY2VtZW50X3N0cmluZ19lbmQgZm9yIHRoZSBjb2RlIGJlbG93LiAqLwotICAgICAgaWYgKCFmb3VuZF9iYXNlX2luZGV4X2Zvcm0pCi0JewotCSAgZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydCA9IG9wX3N0cmluZzsKLQkgIGRpc3BsYWNlbWVudF9zdHJpbmdfZW5kID0gZW5kX29mX29wZXJhbmRfc3RyaW5nICsgMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IEJhc2VJbmRleDsKLQotCSAgLyogRmluZCBiYXNlIHJlZ2lzdGVyIChpZiBhbnkpLiAqLwotCSAgaWYgKCpiYXNlX3N0cmluZyAhPSAnLCcpCi0JICAgIHsKLQkgICAgICBjaGFyICplbmRfb3A7Ci0KLQkgICAgICAvKiBUcmltIG9mZiB0aGUgY2xvc2luZyAnKScgc28gdGhhdCBwYXJzZV9yZWdpc3RlciB3b24ndAotCQkgc2VlIGl0LiAgKi8KLQkgICAgICBFTkRfU1RSSU5HX0FORF9TQVZFIChlbmRfb2Zfb3BlcmFuZF9zdHJpbmcpOwotCSAgICAgIGkuYmFzZV9yZWcgPSBwYXJzZV9yZWdpc3RlciAoYmFzZV9zdHJpbmcsICZlbmRfb3ApOwotCSAgICAgIFJFU1RPUkVfRU5EX1NUUklORyAoZW5kX29mX29wZXJhbmRfc3RyaW5nKTsKLQotCSAgICAgIGlmIChpLmJhc2VfcmVnID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JICAgICAgYmFzZV9zdHJpbmcgPSBlbmRfb3A7Ci0JICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpiYXNlX3N0cmluZykpCi0JCSsrYmFzZV9zdHJpbmc7Ci0JICAgIH0KLQotCSAgLyogVGhlcmUgbWF5IGJlIGFuIGluZGV4IHJlZyBvciBzY2FsZSBmYWN0b3IgaGVyZS4gICovCi0JICBpZiAoKmJhc2Vfc3RyaW5nID09ICcsJykKLQkgICAgewotCSAgICAgICsrYmFzZV9zdHJpbmc7Ci0JICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpiYXNlX3N0cmluZykpCi0JCSsrYmFzZV9zdHJpbmc7Ci0KLQkgICAgICBpZiAoKmJhc2Vfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWAotCQkgIHx8IChhbGxvd19uYWtlZF9yZWcgJiYgaTM4Nl9pc19yZWcgKGJhc2Vfc3RyaW5nKSkpCi0JCXsKLQkJICBjaGFyICplbmRfb3A7Ci0KLQkJICBFTkRfU1RSSU5HX0FORF9TQVZFIChlbmRfb2Zfb3BlcmFuZF9zdHJpbmcpOwotCQkgIGkuaW5kZXhfcmVnID0gcGFyc2VfcmVnaXN0ZXIgKGJhc2Vfc3RyaW5nLCAmZW5kX29wKTsKLQkJICBSRVNUT1JFX0VORF9TVFJJTkcgKGVuZF9vZl9vcGVyYW5kX3N0cmluZyk7Ci0KLQkJICBpZiAoaS5pbmRleF9yZWcgPT0gTlVMTCkKLQkJICAgIHJldHVybiAwOwotCi0JCSAgYmFzZV9zdHJpbmcgPSBlbmRfb3A7Ci0JCSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpiYXNlX3N0cmluZykpCi0JCSAgICArK2Jhc2Vfc3RyaW5nOwotCQkgIGlmICgqYmFzZV9zdHJpbmcgPT0gJywnKQotCQkgICAgewotCQkgICAgICArK2Jhc2Vfc3RyaW5nOwotCQkgICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKmJhc2Vfc3RyaW5nKSkKLQkJCSsrYmFzZV9zdHJpbmc7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKmJhc2Vfc3RyaW5nICE9ICcpJyApCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIGAsJyBvciBgKScgYWZ0ZXIgaW5kZXggcmVnaXN0ZXIgaW4gYCVzJyIpLAotCQkJICAgICAgb3BlcmFuZF9zdHJpbmcpOwotCQkgICAgICByZXR1cm4gMDsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogQ2hlY2sgZm9yIHNjYWxlIGZhY3Rvci4gKi8KLQkgICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpiYXNlX3N0cmluZykpCi0JCXsKLSAgICAgICAgICAgICAgICAgIGlmICghaTM4Nl9zY2FsZSAoYmFzZV9zdHJpbmcpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotCQkgICsrYmFzZV9zdHJpbmc7Ci0JCSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpiYXNlX3N0cmluZykpCi0JCSAgICArK2Jhc2Vfc3RyaW5nOwotCQkgIGlmICgqYmFzZV9zdHJpbmcgIT0gJyknKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oImV4cGVjdGluZyBgKScgYWZ0ZXIgc2NhbGUgZmFjdG9yIGluIGAlcyciKSwKLQkJCSAgICAgIG9wZXJhbmRfc3RyaW5nKTsKLQkJICAgICAgcmV0dXJuIDA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmICghaS5pbmRleF9yZWcpCi0JCXsKLQkJICBhc19iYWQgKF8oImV4cGVjdGluZyBpbmRleCByZWdpc3RlciBvciBzY2FsZSBmYWN0b3IgYWZ0ZXIgYCwnOyBnb3QgJyVjJyIpLAotCQkJICAqYmFzZV9zdHJpbmcpOwotCQkgIHJldHVybiAwOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpiYXNlX3N0cmluZyAhPSAnKScpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdGluZyBgLCcgb3IgYCknIGFmdGVyIGJhc2UgcmVnaXN0ZXIgaW4gYCVzJyIpLAotCQkgICAgICBvcGVyYW5kX3N0cmluZyk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIHRoZXJlJ3MgYW4gZXhwcmVzc2lvbiBiZWdpbm5pbmcgdGhlIG9wZXJhbmQsIHBhcnNlIGl0LAotCSBhc3N1bWluZyBkaXNwbGFjZW1lbnRfc3RyaW5nX3N0YXJ0IGFuZAotCSBkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCBhcmUgbWVhbmluZ2Z1bC4gICovCi0gICAgICBpZiAoZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydCAhPSBkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCkKLQl7Ci0gICAgICAgICAgaWYgKCFpMzg2X2Rpc3BsYWNlbWVudCAoZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50X3N0cmluZ19lbmQpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yICglZHgpIHdoaWxlIGRvaW5nIGlucHV0L291dHB1dCBvcC4gICovCi0gICAgICBpZiAoaS5iYXNlX3JlZwotCSAgJiYgaS5iYXNlX3JlZy0+cmVnX3R5cGUgPT0gKFJlZzE2IHwgSW5PdXRQb3J0UmVnKQotCSAgJiYgaS5pbmRleF9yZWcgPT0gMAotCSAgJiYgaS5sb2cyX3NjYWxlX2ZhY3RvciA9PSAwCi0JICAmJiBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPT0gMAotCSAgJiYgKGkudHlwZXNbdGhpc19vcGVyYW5kXSAmIERpc3ApID09IDApCi0JewotCSAgaS50eXBlc1t0aGlzX29wZXJhbmRdID0gSW5PdXRQb3J0UmVnOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgLyogTWFrZSBzdXJlIHRoZSBtZW1vcnkgb3BlcmFuZCB3ZSd2ZSBiZWVuIGRlYWx0IGlzIHZhbGlkLiAgKi8KLSAgICAgIGlmIChmbGFnXzE2Yml0X2NvZGUgXiAoaS5wcmVmaXhbQUREUl9QUkVGSVhdICE9IDApKQotCXsKLQkgIGlmICgoaS5iYXNlX3JlZwotCSAgICAgICAmJiAoKGkuYmFzZV9yZWctPnJlZ190eXBlICYgKFJlZzE2fEJhc2VJbmRleCkpCi0JCSAgICE9IChSZWcxNnxCYXNlSW5kZXgpKSkKLQkgICAgICB8fCAoaS5pbmRleF9yZWcKLQkJICAmJiAoKChpLmluZGV4X3JlZy0+cmVnX3R5cGUgJiAoUmVnMTZ8QmFzZUluZGV4KSkKLQkJICAgICAgICE9IChSZWcxNnxCYXNlSW5kZXgpKQotCQkgICAgICB8fCAhIChpLmJhc2VfcmVnCi0JCQkgICAgJiYgaS5iYXNlX3JlZy0+cmVnX251bSA8IDYKLQkJCSAgICAmJiBpLmluZGV4X3JlZy0+cmVnX251bSA+PSA2Ci0JCQkgICAgJiYgaS5sb2cyX3NjYWxlX2ZhY3RvciA9PSAwKSkpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJgJXMnIGlzIG5vdCBhIHZhbGlkICVzIGJpdCBiYXNlL2luZGV4IGV4cHJlc3Npb24iKSwKLQkJICAgICAgb3BlcmFuZF9zdHJpbmcsICIxNiIpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgoaS5iYXNlX3JlZwotCSAgICAgICAmJiAoaS5iYXNlX3JlZy0+cmVnX3R5cGUgJiBSZWczMikgPT0gMCkKLQkgICAgICB8fCAoaS5pbmRleF9yZWcKLQkJICAmJiAoKGkuaW5kZXhfcmVnLT5yZWdfdHlwZSAmIChSZWczMnxCYXNlSW5kZXgpKQotCQkgICAgICAhPSAoUmVnMzJ8QmFzZUluZGV4KSkpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJgJXMnIGlzIG5vdCBhIHZhbGlkICVzIGJpdCBiYXNlL2luZGV4IGV4cHJlc3Npb24iKSwKLQkJICAgICAgb3BlcmFuZF9zdHJpbmcsICIzMiIpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotICAgICAgaS5tZW1fb3BlcmFuZHMrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7CQkJCS8qIGl0J3Mgbm90IGEgbWVtb3J5IG9wZXJhbmQ7IGFyZ2ghICovCi0gICAgICBhc19iYWQgKF8oImludmFsaWQgY2hhciAlcyBiZWdpbm5pbmcgb3BlcmFuZCAlZCBgJXMnIiksCi0JICAgICAgb3V0cHV0X2ludmFsaWQgKCpvcF9zdHJpbmcpLAotCSAgICAgIHRoaXNfb3BlcmFuZCArIDEsCi0JICAgICAgb3Bfc3RyaW5nKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7CQkJLyogbm9ybWFsIHJldHVybiAqLwotfQotDAotLyoKLSAqCQkJbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKQotICoKLSAqIENhbGxlZCBqdXN0IGJlZm9yZSByZWxheCgpLgotICogQW55IHN5bWJvbCB0aGF0IGlzIG5vdyB1bmRlZmluZWQgd2lsbCBub3QgYmVjb21lIGRlZmluZWQuCi0gKiBSZXR1cm4gdGhlIGNvcnJlY3QgZnJfc3VidHlwZSBpbiB0aGUgZnJhZy4KLSAqIFJldHVybiB0aGUgaW5pdGlhbCAiZ3Vlc3MgZm9yIGZyX3ZhciIgdG8gY2FsbGVyLgotICogVGhlIGd1ZXNzIGZvciBmcl92YXIgaXMgQUNUVUFMTFkgdGhlIGdyb3d0aCBiZXlvbmQgZnJfZml4LgotICogV2hhdGV2ZXIgd2UgZG8gdG8gZ3JvdyBmcl9maXggb3IgZnJfdmFyIGNvbnRyaWJ1dGVzIHRvIG91ciByZXR1cm5lZCB2YWx1ZS4KLSAqIEFsdGhvdWdoIGl0IG1heSBub3QgYmUgZXhwbGljaXQgaW4gdGhlIGZyYWcsIHByZXRlbmQgZnJfdmFyIHN0YXJ0cyB3aXRoIGEKLSAqIDAgdmFsdWUuCi0gKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudDsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqb3Bjb2RlOwotICByZWdpc3RlciBpbnQgb2xkX2ZyX2ZpeDsKLQotICBvbGRfZnJfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgb3Bjb2RlID0gKHVuc2lnbmVkIGNoYXIgKikgZnJhZ1AtPmZyX29wY29kZTsKLSAgLyogV2UndmUgYWxyZWFkeSBnb3QgZnJhZ1AtPmZyX3N1YnR5cGUgcmlnaHQ7ICBhbGwgd2UgaGF2ZSB0byBkbyBpcwotICAgICBjaGVjayBmb3IgdW4tcmVsYXhhYmxlIHN5bWJvbHMuICAqLwotICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VnbWVudCkKLSAgICB7Ci0gICAgICAvKiBzeW1ib2wgaXMgdW5kZWZpbmVkIGluIHRoaXMgc2VnbWVudCAqLwotICAgICAgaW50IGNvZGUxNiA9IGZyYWdQLT5mcl9zdWJ0eXBlICYgQ09ERTE2OwotICAgICAgaW50IHNpemUgPSBjb2RlMTYgPyAyIDogNDsKLSAgICAgIGludCBwY3JlbF9yZWxvYyA9IGNvZGUxNiA/IEJGRF9SRUxPQ18xNl9QQ1JFTCA6IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQotICAgICAgc3dpdGNoIChvcGNvZGVbMF0pCi0JewotCWNhc2UgSlVNUF9QQ19SRUxBVElWRToJLyogbWFrZSBqbXAgKDB4ZWIpIGEgZHdvcmQgZGlzcGxhY2VtZW50IGp1bXAgKi8KLQkgIG9wY29kZVswXSA9IDB4ZTk7CS8qIGR3b3JkIGRpc3Agam1wICovCi0JICBmcmFnUC0+ZnJfZml4ICs9IHNpemU7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCwgc2l6ZSwKLQkJICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgMSwKLQkJICAgKEdPVF9zeW1ib2wgJiYgLyogTm90IHF1aXRlIHJpZ2h0IC0gd2Ugc2hvdWxkIHN3aXRjaCBvbgotCQkJCSAgICAgcHJlc2VuY2Ugb2YgQFBMVCwgYnV0IEkgY2Fubm90IHNlZSBob3cKLQkJCQkgICAgIHRvIGdldCB0byB0aGF0IGZyb20gaGVyZS4gIFdlIHNob3VsZCBoYXZlCi0JCQkJICAgICBkb25lIHRoaXMgaW4gbWRfYXNzZW1ibGUgdG8gcmVhbGx5Ci0JCQkJICAgICBnZXQgaXQgcmlnaHQgYWxsIG9mIHRoZSB0aW1lLCBidXQgSQotCQkJCSAgICAgdGhpbmsgaXQgZG9lcyBub3QgbWF0dGVyIHRoYXQgbXVjaCwgYXMKLQkJCQkgICAgIHRoaXMgd2lsbCBiZSByaWdodCBtb3N0IG9mIHRoZSB0aW1lLiBFUlkqLwotCQkgICAgU19HRVRfU0VHTUVOVChmcmFnUC0+ZnJfc3ltYm9sKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkJICAgPyBCRkRfUkVMT0NfMzg2X1BMVDMyIDogcGNyZWxfcmVsb2MpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgLyogVGhpcyBjaGFuZ2VzIHRoZSBieXRlLWRpc3BsYWNlbWVudCBqdW1wIDB4N04gLS0+Ci0JCQkgICB0aGUgZHdvcmQtZGlzcGxhY2VtZW50IGp1bXAgMHgwZjhOICovCi0JICBvcGNvZGVbMV0gPSBvcGNvZGVbMF0gKyAweDEwOwotCSAgb3Bjb2RlWzBdID0gVFdPX0JZVEVfT1BDT0RFX0VTQ0FQRTsJLyogdHdvLWJ5dGUgZXNjYXBlICovCi0JICBmcmFnUC0+ZnJfZml4ICs9IDEgKyBzaXplOwkvKiB3ZSd2ZSBhZGRlZCBhbiBvcGNvZGUgYnl0ZSAqLwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyAxLCBzaXplLAotCQkgICBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLAotCQkgICAoR09UX3N5bWJvbCAmJiAgLyogTm90IHF1aXRlIHJpZ2h0IC0gd2Ugc2hvdWxkIHN3aXRjaCBvbgotCQkJCSAgICAgcHJlc2VuY2Ugb2YgQFBMVCwgYnV0IEkgY2Fubm90IHNlZSBob3cKLQkJCQkgICAgIHRvIGdldCB0byB0aGF0IGZyb20gaGVyZS4gIEVSWSAqLwotCQkgICAgU19HRVRfU0VHTUVOVChmcmFnUC0+ZnJfc3ltYm9sKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkJICAgPyBCRkRfUkVMT0NfMzg2X1BMVDMyIDogcGNyZWxfcmVsb2MpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZnJhZ193YW5lIChmcmFnUCk7Ci0gICAgfQotICByZXR1cm4gKGZyYWdQLT5mcl92YXIgKyBmcmFnUC0+ZnJfZml4IC0gb2xkX2ZyX2ZpeCk7Ci19CQkJCS8qIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KCkgKi8KLQwKLS8qCi0gKgkJCW1kX2NvbnZlcnRfZnJhZygpOwotICoKLSAqIENhbGxlZCBhZnRlciByZWxheCgpIGlzIGZpbmlzaGVkLgotICogSW46CUFkZHJlc3Mgb2YgZnJhZy4KLSAqCWZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQuCi0gKglmcl9zdWJ0eXBlIGlzIHdoYXQgdGhlIGFkZHJlc3MgcmVsYXhlZCB0by4KLSAqCi0gKiBPdXQ6CUFueSBmaXhTcyBhbmQgY29uc3RhbnRzIGFyZSBzZXQgdXAuCi0gKglDYWxsZXIgd2lsbCB0dXJuIGZyYWcgaW50byBhICIuc3BhY2UgMCIuCi0gKi8KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWMsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSNlbHNlCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSNlbmRpZgotewotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpvcGNvZGU7Ci0gIHVuc2lnbmVkIGNoYXIgKndoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2FkZHJlc3M7Ci0gIHVuc2lnbmVkIGludCBvcGNvZGVfYWRkcmVzczsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbiA9IDA7Ci0gIGludCBkaXNwbGFjZW1lbnRfZnJvbV9vcGNvZGVfc3RhcnQ7Ci0KLSAgb3Bjb2RlID0gKHVuc2lnbmVkIGNoYXIgKikgZnJhZ1AtPmZyX29wY29kZTsKLQotICAvKiBBZGRyZXNzIHdlIHdhbnQgdG8gcmVhY2ggaW4gZmlsZSBzcGFjZS4gKi8KLSAgdGFyZ2V0X2FkZHJlc3MgPSBTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgKyBmcmFnUC0+ZnJfb2Zmc2V0OwotI2lmZGVmIEJGRF9BU1NFTUJMRVIgLyogbm90IG5lZWRlZCBvdGhlcndpc2U/ICovCi0gIHRhcmdldF9hZGRyZXNzICs9IGZyYWdQLT5mcl9zeW1ib2wtPnN5X2ZyYWctPmZyX2FkZHJlc3M7Ci0jZW5kaWYKLQotICAvKiBBZGRyZXNzIG9wY29kZSByZXNpZGVzIGF0IGluIGZpbGUgc3BhY2UuICovCi0gIG9wY29kZV9hZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4OwotCi0gIC8qIERpc3BsYWNlbWVudCBmcm9tIG9wY29kZSBzdGFydCB0byBmaWxsIGludG8gaW5zdHJ1Y3Rpb24uICovCi0gIGRpc3BsYWNlbWVudF9mcm9tX29wY29kZV9zdGFydCA9IHRhcmdldF9hZGRyZXNzIC0gb3Bjb2RlX2FkZHJlc3M7Ci0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgU01BTEwpOgotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChDT05EX0pVTVAsIFNNQUxMMTYpOgotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChVTkNPTkRfSlVNUCwgU01BTEwpOgotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChVTkNPTkRfSlVNUCwgU01BTEwxNik6Ci0gICAgICAvKiBkb24ndCBoYXZlIHRvIGNoYW5nZSBvcGNvZGUgKi8KLSAgICAgIGV4dGVuc2lvbiA9IDE7CQkvKiAxIG9wY29kZSArIDEgZGlzcGxhY2VtZW50ICovCi0gICAgICB3aGVyZV90b19wdXRfZGlzcGxhY2VtZW50ID0gJm9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgQklHKToKLSAgICAgIGV4dGVuc2lvbiA9IDU7CQkvKiAyIG9wY29kZSArIDQgZGlzcGxhY2VtZW50ICovCi0gICAgICBvcGNvZGVbMV0gPSBvcGNvZGVbMF0gKyAweDEwOwotICAgICAgb3Bjb2RlWzBdID0gVFdPX0JZVEVfT1BDT0RFX0VTQ0FQRTsKLSAgICAgIHdoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSAmb3Bjb2RlWzJdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWF9TVEFURSAoVU5DT05EX0pVTVAsIEJJRyk6Ci0gICAgICBleHRlbnNpb24gPSA0OwkJLyogMSBvcGNvZGUgKyA0IGRpc3BsYWNlbWVudCAqLwotICAgICAgb3Bjb2RlWzBdID0gMHhlOTsKLSAgICAgIHdoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSAmb3Bjb2RlWzFdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWF9TVEFURSAoQ09ORF9KVU1QLCBCSUcxNik6Ci0gICAgICBleHRlbnNpb24gPSAzOwkJLyogMiBvcGNvZGUgKyAyIGRpc3BsYWNlbWVudCAqLwotICAgICAgb3Bjb2RlWzFdID0gb3Bjb2RlWzBdICsgMHgxMDsKLSAgICAgIG9wY29kZVswXSA9IFRXT19CWVRFX09QQ09ERV9FU0NBUEU7Ci0gICAgICB3aGVyZV90b19wdXRfZGlzcGxhY2VtZW50ID0gJm9wY29kZVsyXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKFVOQ09ORF9KVU1QLCBCSUcxNik6Ci0gICAgICBleHRlbnNpb24gPSAyOwkJLyogMSBvcGNvZGUgKyAyIGRpc3BsYWNlbWVudCAqLwotICAgICAgb3Bjb2RlWzBdID0gMHhlOTsKLSAgICAgIHdoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSAmb3Bjb2RlWzFdOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQkFEX0NBU0UgKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgLyogbm93IHB1dCBkaXNwbGFjZW1lbnQgYWZ0ZXIgb3Bjb2RlICovCi0gIG1kX251bWJlcl90b19jaGFycyAoKGNoYXIgKikgd2hlcmVfdG9fcHV0X2Rpc3BsYWNlbWVudCwKLQkJICAgICAgKHZhbHVlVCkgKGRpc3BsYWNlbWVudF9mcm9tX29wY29kZV9zdGFydCAtIGV4dGVuc2lvbiksCi0JCSAgICAgIFNJWkVfRlJPTV9SRUxBWF9TVEFURSAoZnJhZ1AtPmZyX3N1YnR5cGUpKTsKLSAgZnJhZ1AtPmZyX2ZpeCArPSBleHRlbnNpb247Ci19Ci0MCi0KLWludCBtZF9zaG9ydF9qdW1wX3NpemUgPSAyOwkvKiBzaXplIG9mIGJ5dGUgZGlzcGxhY2VtZW50IGptcCAqLwotaW50IG1kX2xvbmdfanVtcF9zaXplID0gNTsJLyogc2l6ZSBvZiBkd29yZCBkaXNwbGFjZW1lbnQgam1wICovCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDg7CS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotdm9pZAotbWRfY3JlYXRlX3Nob3J0X2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICBsb25nIG9mZnNldDsKLQotICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDIpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHhlYiwgMSk7CS8qIG9wY29kZSBmb3IgYnl0ZS1kaXNwIGp1bXAgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIgKyAxLCAodmFsdWVUKSBvZmZzZXQsIDEpOwotfQotCi12b2lkCi1tZF9jcmVhdGVfbG9uZ19qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgbG9uZyBvZmZzZXQ7Ci0KLSAgaWYgKGZsYWdfZG9fbG9uZ19qdW1wKQotICAgIHsKLSAgICAgIG9mZnNldCA9IHRvX2FkZHIgLSBTX0dFVF9WQUxVRSAodG9fc3ltYm9sKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyLCAodmFsdWVUKSAweGU5LCAxKTsvKiBvcGNvZGUgZm9yIGxvbmcgam1wICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciArIDEsICh2YWx1ZVQpIG9mZnNldCwgNCk7Ci0gICAgICBmaXhfbmV3IChmcmFnLCAocHRyICsgMSkgLSBmcmFnLT5mcl9saXRlcmFsLCA0LAotCSAgICAgICB0b19zeW1ib2wsIChvZmZzZXRUKSAwLCAwLCBCRkRfUkVMT0NfMzIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG9mZnNldCA9IHRvX2FkZHIgLSAoZnJvbV9hZGRyICsgNSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHhlOSwgMSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciArIDEsICh2YWx1ZVQpIG9mZnNldCwgNCk7Ci0gICAgfQotfQotDAotLyogQXBwbHkgYSBmaXh1cCAoZml4UykgdG8gc2VnbWVudCBkYXRhLCBvbmNlIGl0IGhhcyBiZWVuIGRldGVybWluZWQKLSAgIGJ5IG91ciBjYWxsZXIgdGhhdCB3ZSBoYXZlIGFsbCB0aGUgaW5mbyB3ZSBuZWVkIHRvIGZpeCBpdCB1cC4KLQotICAgT24gdGhlIDM4NiwgaW1tZWRpYXRlcywgZGlzcGxhY2VtZW50cywgYW5kIGRhdGEgcG9pbnRlcnMgYXJlIGFsbCBpbgotICAgdGhlIHNhbWUgKGxpdHRsZS1lbmRpYW4pIGZvcm1hdCwgc28gd2UgZG9uJ3QgbmVlZCB0byBjYXJlIGFib3V0IHdoaWNoCi0gICB3ZSBhcmUgaGFuZGxpbmcuICAqLwotCi1pbnQKLW1kX2FwcGx5X2ZpeDMgKGZpeFAsIHZhbHAsIHNlZykKLSAgICAgZml4UyAqZml4UDsJCS8qIFRoZSBmaXggd2UncmUgdG8gcHV0IGluLiAgKi8KLSAgICAgdmFsdWVUICp2YWxwOwkJLyogUG9pbnRlciB0byB0aGUgdmFsdWUgb2YgdGhlIGJpdHMuICAqLwotICAgICBzZWdUIHNlZzsJCQkvKiBTZWdtZW50IGZpeCBpcyBmcm9tLiAgKi8KLXsKLSAgcmVnaXN0ZXIgY2hhciAqcCA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLSAgdmFsdWVUIHZhbHVlID0gKnZhbHA7Ci0KLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAmJiAhZGVmaW5lZCAoVEVfTWFjaCkKLSAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotCXsKLQljYXNlIEJGRF9SRUxPQ18zMjoKLQkgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzE2OgotCSAgZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzE2X1BDUkVMOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfODoKLQkgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ184X1BDUkVMOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKgotICAgKiBUaGlzIGlzIGEgaGFjay4gIFRoZXJlIHNob3VsZCBiZSBhIGJldHRlciB3YXkgdG8KLSAgICogaGFuZGxlIHRoaXMuCi0gICAqLwotICBpZiAoKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzJfUENSRUwKLSAgICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzE2X1BDUkVMCi0gICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ184X1BDUkVMKQotICAgICAgJiYgZml4UC0+ZnhfYWRkc3kpCi0gICAgewotI2lmbmRlZiBPQkpfQU9VVAotICAgICAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotI2lmZGVmIFRFX1BFCi0JICB8fCBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0jZW5kaWYKLQkgICkKLQl2YWx1ZSArPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotICAgICAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCSAgJiYgKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSA9PSBzZWcKLQkgICAgICB8fCAoZml4UC0+ZnhfYWRkc3ktPmJzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotCSAgJiYgISBTX0lTX0VYVEVSTkFMIChmaXhQLT5meF9hZGRzeSkKLQkgICYmICEgU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkKLQkgICYmIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JICAmJiAhIFNfSVNfQ09NTU9OIChmaXhQLT5meF9hZGRzeSkpCi0JewotCSAgLyogWWVzLCB3ZSBhZGQgdGhlIHZhbHVlcyBpbiB0d2ljZS4gIFRoaXMgaXMgYmVjYXVzZQotCSAgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBzdWJ0cmFjdHMgdGhlbSBvdXQgYWdhaW4uICBJIHRoaW5rCi0JICAgICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGlzIGJyb2tlbiwgYnV0IEkgZG9uJ3QgZGFyZSBjaGFuZ2UKLQkgICAgIGl0LiAgRklYTUUuICAqLwotCSAgdmFsdWUgKz0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotCX0KLSNlbmRpZgotI2lmIGRlZmluZWQgKE9CSl9DT0ZGKSAmJiBkZWZpbmVkIChURV9QRSkKLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFBFIGZvcm1hdCBkb2VzIG5vdCBzdG9yZSBhIHNlY3Rpb24KLSAgICAgICAgIGFkZHJlc3Mgb2Zmc2V0IGZvciBhIFBDIHJlbGF0aXZlIHN5bWJvbC4gICovCi0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IHNlZykKLQl2YWx1ZSArPSBtZF9wY3JlbF9mcm9tIChmaXhQKTsKLSNlbmRpZgotICAgIH0KLQotICAvKiBGaXggYSBmZXcgdGhpbmdzIC0gdGhlIGR5bmFtaWMgbGlua2VyIGV4cGVjdHMgY2VydGFpbiB2YWx1ZXMgaGVyZSwKLSAgICAgYW5kIHdlIG11c3Qgbm90IGRpc3NhcHBvaW50IGl0LiAqLwotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgICYmIGZpeFAtPmZ4X2FkZHN5KQotICAgIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKSB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X1BMVDMyOgotICAgICAgLyogTWFrZSB0aGUganVtcCBpbnN0cnVjdGlvbiBwb2ludCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb3BlcmFuZC4gIEF0Ci0JIHJ1bnRpbWUgd2UgbWVyZWx5IGFkZCB0aGUgb2Zmc2V0IHRvIHRoZSBhY3R1YWwgUExUIGVudHJ5LiAqLwotICAgICAgdmFsdWUgPSAweGZmZmZmZmZjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVFBDOgotLyoKLSAqICBUaGlzIGlzIHRvdWdoIHRvIGV4cGxhaW4uICBXZSBlbmQgdXAgd2l0aCB0aGlzIG9uZSBpZiB3ZSBoYXZlCi0gKiBvcGVyYW5kcyB0aGF0IGxvb2sgbGlrZSAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfK1suLS5MMjg0XSIuICBUaGUgZ29hbAotICogaGVyZSBpcyB0byBvYnRhaW4gdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YgdGhlIEdPVCwgYW5kIGl0IGlzIHN0cm9uZ2x5Ci0gKiBwcmVmZXJhYmxlIGZyb20gYSBwZXJmb3JtYW5jZSBwb2ludCBvZiB2aWV3IHRvIGF2b2lkIHVzaW5nIGEgcnVudGltZQotICogcmVsb2NhdGlvbiBmb3IgdGhpcy4gIFRoZSBhY3R1YWwgc2VxdWVuY2Ugb2YgaW5zdHJ1Y3Rpb25zIG9mdGVuIGxvb2sgCi0gKiBzb21ldGhpbmcgbGlrZToKLSAqIAotICogCWNhbGwJLkw2NgotICogLkw2NjoKLSAqIAlwb3BsCSVlYngKLSAqIAlhZGRsCSRfR0xPQkFMX09GRlNFVF9UQUJMRV8rWy4tLkw2Nl0sJWVieAotICogCi0gKiAJVGhlIGNhbGwgYW5kIHBvcCBlc3NlbnRpYWxseSByZXR1cm4gdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YKLSAqIHRoZSBsYWJlbCAuTDY2IGFuZCBzdG9yZSBpdCBpbiAlZWJ4LiAgVGhlIGxpbmtlciBpdHNlbGYgd2lsbAotICogdWx0aW1hdGVseSBjaGFuZ2UgdGhlIGZpcnN0IG9wZXJhbmQgb2YgdGhlIGFkZGwgc28gdGhhdCAlZWJ4IHBvaW50cyB0bwotICogdGhlIEdPVCwgYnV0IHRvIGtlZXAgdGhpbmdzIHNpbXBsZSwgdGhlIC5vIGZpbGUgbXVzdCBoYXZlIHRoaXMgb3BlcmFuZAotICogc2V0IHNvIHRoYXQgaXQgZ2VuZXJhdGVzIG5vdCB0aGUgYWJzb2x1dGUgYWRkcmVzcyBvZiAuTDY2LCBidXQgdGhlCi0gKiBhYnNvbHV0ZSBhZGRyZXNzIG9mIGl0c2VsZi4gIFRoaXMgYWxsb3dzIHRoZSBsaW5rZXIgaXRzZWxmIHNpbXBseQotICogdHJlYXQgYSBHT1RQQyByZWxvY2F0aW9uIGFzIGFza2luZyBmb3IgYSBwY3JlbCBvZmZzZXQgdG8gdGhlIEdPVCB0byBiZQotICogYWRkZWQgaW4sIGFuZCB0aGUgYWRkZW5kIG9mIHRoZSByZWxvY2F0aW9uIGlzIHN0b3JlZCBpbiB0aGUgb3BlcmFuZAotICogZmllbGQgZm9yIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYuCi0gKiAKLSAqIAlPdXIgam9iIGhlcmUgaXMgdG8gZml4IHRoZSBvcGVyYW5kIHNvIHRoYXQgaXQgd291bGQgYWRkIHRoZSBjb3JyZWN0Ci0gKiBvZmZzZXQgc28gdGhhdCAlZWJ4IHdvdWxkIHBvaW50IHRvIGl0c2VsZi4gIFRoZSB0aGluZyB0aGF0IGlzIHRyaWNreSBpcwotICogdGhhdCAuLS5MNjYgd2lsbCBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnN0cnVjdGlvbiwgc28gd2UgbmVlZAotICogdG8gZnVydGhlciBtb2RpZnkgdGhlIG9wZXJhbmQgc28gdGhhdCBpdCB3aWxsIHBvaW50IHRvIGl0c2VsZi4KLSAqIFRoZXJlIGFyZSBvdGhlciBjYXNlcyB3aGVyZSB5b3UgaGF2ZSBzb21ldGhpbmcgbGlrZToKLSAqIAotICogCS5sb25nCSRfR0xPQkFMX09GRlNFVF9UQUJMRV8rWy4tLkw2Nl0KLSAqIAotICogYW5kIGhlcmUgbm8gY29ycmVjdGlvbiB3b3VsZCBiZSByZXF1aXJlZC4gIEludGVybmFsbHkgaW4gdGhlIGFzc2VtYmxlcgotICogd2UgdHJlYXQgb3BlcmFuZHMgb2YgdGhpcyBmb3JtIGFzIG5vdCBiZWluZyBwY3JlbCBzaW5jZSB0aGUgJy4nIGlzIAotICogZXhwbGljaXRseSBtZW50aW9uZWQsIGFuZCBJIHdvbmRlciB3aGV0aGVyIGl0IHdvdWxkIHNpbXBsaWZ5IG1hdHRlcnMKLSAqIHRvIGRvIGl0IHRoaXMgd2F5LiAgV2hvIGtub3dzLiAgSW4gZWFybGllciB2ZXJzaW9ucyBvZiB0aGUgUElDIHBhdGNoZXMsCi0gKiB0aGUgcGNyZWxfYWRqdXN0IGZpZWxkIHdhcyB1c2VkIHRvIHN0b3JlIHRoZSBjb3JyZWN0aW9uLCBidXQgc2luY2UgdGhlCi0gKiBleHByZXNzaW9uIGlzIG5vdCBwY3JlbCwgSSBmZWx0IGl0IHdvdWxkIGJlIGNvbmZ1c2luZyB0byBkbyBpdCB0aGlzIHdheS4KLSAqLwotICAgICAgdmFsdWUgLT0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1QzMjoKLSAgICAgIHZhbHVlID0gMDsgLyogRnVsbHkgcmVzb2x2ZWQgYXQgcnVudGltZS4gIE5vIGFkZGVuZC4gKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1RPRkY6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOwotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotI2VuZGlmIC8qIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpICovCi0gICp2YWxwID0gdmFsdWU7Ci0jZW5kaWYgLyogZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgIWRlZmluZWQgKFRFX01hY2gpICovCi0gIG1kX251bWJlcl90b19jaGFycyAocCwgdmFsdWUsIGZpeFAtPmZ4X3NpemUpOwotCi0gIHJldHVybiAxOwotfQotCi0jaWYgMAotLyogVGhpcyBpcyBuZXZlciB1c2VkLiAgKi8KLWxvbmcJCQkJLyogS25vd3MgYWJvdXQgdGhlIGJ5dGUgb3JkZXIgaW4gYSB3b3JkLiAqLwotbWRfY2hhcnNfdG9fbnVtYmVyIChjb24sIG5ieXRlcykKLSAgICAgdW5zaWduZWQgY2hhciBjb25bXTsJLyogTG93IG9yZGVyIGJ5dGUgMXN0LiAqLwotICAgICBpbnQgbmJ5dGVzOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBpbnB1dC4gKi8KLXsKLSAgbG9uZyByZXR2YWw7Ci0gIGZvciAocmV0dmFsID0gMCwgY29uICs9IG5ieXRlcyAtIDE7IG5ieXRlcy0tOyBjb24tLSkKLSAgICB7Ci0gICAgICByZXR2YWwgPDw9IEJJVFNfUEVSX0NIQVI7Ci0gICAgICByZXR2YWwgfD0gKmNvbjsKLSAgICB9Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0jZW5kaWYgLyogMCAqLwotDAotCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgbGl0UCBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIGVtaXQgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQKLSAgIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4gICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIG1kX2F0b2YgKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgLyogVGhpcyBsb29wcyBvdXRwdXRzIHRoZSBMSVRUTEVOVU1zIGluIFJFVkVSU0Ugb3JkZXI7IGluIGFjY29yZCB3aXRoCi0gICAgIHRoZSBiaWdlbmRpYW4gMzg2LiAgKi8KLSAgZm9yICh3b3JkUCA9IHdvcmRzICsgcHJlYyAtIDE7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSAoKndvcmRQLS0pLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0MCi1jaGFyIG91dHB1dF9pbnZhbGlkX2J1Zls4XTsKLQotc3RhdGljIGNoYXIgKiBvdXRwdXRfaW52YWxpZCBQQVJBTVMgKChpbnQpKTsKLQotc3RhdGljIGNoYXIgKgotb3V0cHV0X2ludmFsaWQgKGMpCi0gICAgIGludCBjOwotewotICBpZiAoaXNwcmludCAoYykpCi0gICAgc3ByaW50ZiAob3V0cHV0X2ludmFsaWRfYnVmLCAiJyVjJyIsIGMpOwotICBlbHNlCi0gICAgc3ByaW50ZiAob3V0cHV0X2ludmFsaWRfYnVmLCAiKDB4JXgpIiwgKHVuc2lnbmVkKSBjKTsKLSAgcmV0dXJuIG91dHB1dF9pbnZhbGlkX2J1ZjsKLX0KLQotLyogUkVHX1NUUklORyBzdGFydHMgKmJlZm9yZSogUkVHSVNURVJfUFJFRklYLiAgKi8KLQotc3RhdGljIGNvbnN0IHJlZ19lbnRyeSAqIHBhcnNlX3JlZ2lzdGVyIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgY29uc3QgcmVnX2VudHJ5ICoKLXBhcnNlX3JlZ2lzdGVyIChyZWdfc3RyaW5nLCBlbmRfb3ApCi0gICAgIGNoYXIgKnJlZ19zdHJpbmc7Ci0gICAgIGNoYXIgKiplbmRfb3A7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnMgPSByZWdfc3RyaW5nOwotICByZWdpc3RlciBjaGFyICpwOwotICBjaGFyIHJlZ19uYW1lX2dpdmVuW01BWF9SRUdfTkFNRV9TSVpFICsgMV07Ci0gIGNvbnN0IHJlZ19lbnRyeSAqcjsKLQotICAvKiBTa2lwIHBvc3NpYmxlIFJFR0lTVEVSX1BSRUZJWCBhbmQgcG9zc2libGUgd2hpdGVzcGFjZS4gICovCi0gIGlmICgqcyA9PSBSRUdJU1RFUl9QUkVGSVgpCi0gICAgKytzOwotCi0gIGlmIChpc19zcGFjZV9jaGFyICgqcykpCi0gICAgKytzOwotCi0gIHAgPSByZWdfbmFtZV9naXZlbjsKLSAgd2hpbGUgKCgqcCsrID0gcmVnaXN0ZXJfY2hhcnNbKHVuc2lnbmVkIGNoYXIpICpzKytdKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGlmIChwID49IHJlZ19uYW1lX2dpdmVuICsgTUFYX1JFR19OQU1FX1NJWkUpCi0JewotICAgICAgICAgIGlmICghYWxsb3dfbmFrZWRfcmVnKQotICAgICAgICAgICAgewotCSAgICAgICpwID0gJ1wwJzsKLQkgICAgICBhc19iYWQgKF8oImJhZCByZWdpc3RlciBuYW1lIGAlcyciKSwgcmVnX25hbWVfZ2l2ZW4pOwotICAgICAgICAgICAgfQotCSAgcmV0dXJuIChjb25zdCByZWdfZW50cnkgKikgTlVMTDsKLQl9Ci0gICAgfQotCi0gICplbmRfb3AgPSBzIC0gMTsKLQotICByID0gKGNvbnN0IHJlZ19lbnRyeSAqKSBoYXNoX2ZpbmQgKHJlZ19oYXNoLCByZWdfbmFtZV9naXZlbik7Ci0KLSAgaWYgKHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoIWFsbG93X25ha2VkX3JlZykKLSAgICAgICAgYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbmFtZSBgJXMnIiksIHJlZ19uYW1lX2dpdmVuKTsKLSAgICAgIHJldHVybiAoY29uc3QgcmVnX2VudHJ5ICopIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiByOwotfQotDAotI2lmZGVmIE9CSl9FTEYKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJrbVZROiI7Ci0jZWxzZQotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIm0iOwotI2VuZGlmCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ20nOgotICAgICAgZmxhZ19kb19sb25nX2p1bXAgPSAxOwotICAgICAgYnJlYWs7Ci0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotICAgICAgLyogLWs6IElnbm9yZSBmb3IgRnJlZUJTRCBjb21wYXRpYmlsaXR5LiAgKi8KLSAgICBjYXNlICdrJzoKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAtVjogU1ZSNCBhcmd1bWVudCB0byBwcmludCB2ZXJzaW9uIElELiAgKi8KLSAgICBjYXNlICdWJzoKLSAgICAgIHByaW50X3ZlcnNpb25faWQgKCk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogLVF5LCAtUW46IFNWUjQgYXJndW1lbnRzIGNvbnRyb2xsaW5nIHdoZXRoZXIgYSAuY29tbWVudCBzZWN0aW9uCi0JIHNob3VsZCBiZSBlbWl0dGVkIG9yIG5vdC4gIEZJWE1FOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICAgIGNhc2UgJ1EnOgotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0tbQkJCWRvIGxvbmcganVtcFxuIikpOwotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2lmZGVmIE9CSl9NQVlCRV9FTEYKLSNpZmRlZiBPQkpfTUFZQkVfQ09GRgotCi0vKiBQaWNrIHRoZSB0YXJnZXQgZm9ybWF0IHRvIHVzZS4gICovCi0KLWNvbnN0IGNoYXIgICoKLWkzODZfdGFyZ2V0X2Zvcm1hdCAoKQotewotICBzd2l0Y2ggKE9VVFBVVF9GTEFWT1IpCi0gICAgewotICAgIGNhc2UgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXI6Ci0gICAgICByZXR1cm4gImNvZmYtaTM4NiI7Ci0gICAgY2FzZSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyOgotICAgICAgcmV0dXJuICJlbGYzMi1pMzg2IjsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBPQkpfTUFZQkVfQ09GRiAqLwotI2VuZGlmIC8qIE9CSl9NQVlCRV9FTEYgKi8KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0MCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotCWlmICgqbmFtZSA9PSAnXycgJiYgKihuYW1lKzEpID09ICdHJwotCSAgICAmJiBzdHJjbXAobmFtZSwgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKSA9PSAwKQotCSAgewotCSAgICBpZiAoIUdPVF9zeW1ib2wpCi0JICAgICAgewotCQlpZiAoc3ltYm9sX2ZpbmQgKG5hbWUpKQotCQkgIGFzX2JhZCAoXygiR09UIGFscmVhZHkgaW4gc3ltYm9sIHRhYmxlIikpOwotCQlHT1Rfc3ltYm9sID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sCi0JCQkJCSAodmFsdWVUKSAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCSAgICAgIH07Ci0JICAgIHJldHVybiBHT1Rfc3ltYm9sOwotCSAgfQotICByZXR1cm4gMDsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSNpZmRlZiBPQkpfQU9VVAotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogRm9yIGEub3V0LCBmb3JjZSB0aGUgc2VjdGlvbiBzaXplIHRvIGJlIGFsaWduZWQuICBJZiB3ZSBkb24ndCBkbwotICAgICB0aGlzLCBCRkQgd2lsbCBhbGlnbiBpdCBmb3IgdXMsIGJ1dCBpdCB3aWxsIG5vdCB3cml0ZSBvdXQgdGhlCi0gICAgIGZpbmFsIGJ5dGVzIG9mIHRoZSBzZWN0aW9uLiAgVGhpcyBtYXkgYmUgYSBidWcgaW4gQkZELCBidXQgaXQgaXMKLSAgICAgZWFzaWVyIHRvIGZpeCBpdCBoZXJlIHNpbmNlIHRoYXQgaXMgaG93IHRoZSBvdGhlciBhLm91dCB0YXJnZXRzCi0gICAgIHdvcmsuICAqLwotICBpbnQgYWxpZ247Ci0KLSAgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpOwotICBzaXplID0gKChzaXplICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoKHZhbHVlVCkgLTEgPDwgYWxpZ24pKTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qIE9uIHRoZSBpMzg2LCBQQy1yZWxhdGl2ZSBvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlCi0gICBuZXh0IGluc3RydWN0aW9uLiAgVGhhdCBpcywgdGhlIGFkZHJlc3Mgb2YgdGhlIG9mZnNldCwgcGx1cyBpdHMKLSAgIHNpemUsIHNpbmNlIHRoZSBvZmZzZXQgaXMgYWx3YXlzIHRoZSBsYXN0IHBhcnQgb2YgdGhlIGluc24uICAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gZml4UC0+Znhfc2l6ZSArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotI2lmbmRlZiBJMzg2Q09GRgotCi1zdGF0aWMgdm9pZAotc19ic3MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgKHN1YnNlZ1QpIHRlbXApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0jZW5kaWYKLQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi12b2lkCi1pMzg2X3ZhbGlkYXRlX2ZpeCAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgaWYgKGZpeHAtPmZ4X3N1YnN5ICYmIGZpeHAtPmZ4X3N1YnN5ID09IEdPVF9zeW1ib2wpCi0gICAgewotICAgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzM4Nl9HT1RPRkY7Ci0gICAgICBmaXhwLT5meF9zdWJzeSA9IDA7Ci0gICAgfQotfQotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0KLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9QTFQzMjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVE9GRjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UUEM6Ci0gICAgY2FzZSBCRkRfUkVMT0NfUlZBOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCXsKLQkgIHN3aXRjaCAoZml4cC0+Znhfc2l6ZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24iKSwKLQkJICAgICAgZml4cC0+Znhfc2l6ZSk7Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxOiBjb2RlID0gQkZEX1JFTE9DXzhfUENSRUw7ICBicmVhazsKLQkgICAgY2FzZSAyOiBjb2RlID0gQkZEX1JFTE9DXzE2X1BDUkVMOyBicmVhazsKLQkgICAgY2FzZSA0OiBjb2RlID0gQkZEX1JFTE9DXzMyX1BDUkVMOyBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKGZpeHAtPmZ4X3NpemUpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSByZWxvY2F0aW9uIiksIGZpeHAtPmZ4X3NpemUpOwotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMTogY29kZSA9IEJGRF9SRUxPQ184OyAgYnJlYWs7Ci0JICAgIGNhc2UgMjogY29kZSA9IEJGRF9SRUxPQ18xNjsgYnJlYWs7Ci0JICAgIGNhc2UgNDogY29kZSA9IEJGRF9SRUxPQ18zMjsgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DXzMyCi0gICAgICAmJiBHT1Rfc3ltYm9sCi0gICAgICAmJiBmaXhwLT5meF9hZGRzeSA9PSBHT1Rfc3ltYm9sKQotICAgIGNvZGUgPSBCRkRfUkVMT0NfMzg2X0dPVFBDOwotCi0gIHJlbCA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWwtPnN5bV9wdHJfcHRyID0gJmZpeHAtPmZ4X2FkZHN5LT5ic3ltOwotCi0gIHJlbC0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgLyogSEFDSzogU2luY2UgaTM4NiBFTEYgdXNlcyBSZWwgaW5zdGVhZCBvZiBSZWxhLCBlbmNvZGUgdGhlCi0gICAgIHZ0YWJsZSBlbnRyeSB0byBiZSB1c2VkIGluIHRoZSByZWxvY2F0aW9uJ3Mgc2VjdGlvbiBvZmZzZXQuICAqLwotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmVsLT5hZGRyZXNzID0gZml4cC0+Znhfb2Zmc2V0OwotCi0gIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgZWxzZQotICAgIHJlbC0+YWRkZW5kID0gMDsKLQotICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICBpZiAocmVsLT5ob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oIkNhbm5vdCByZXByZXNlbnQgcmVsb2NhdGlvbiB0eXBlICVzIiksCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkpOwotICAgICAgLyogU2V0IGhvd3RvIHRvIGEgZ2FyYmFnZSB2YWx1ZSBzbyB0aGF0IHdlIGNhbiBrZWVwIGdvaW5nLiAgKi8KLSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgQkZEX1JFTE9DXzMyKTsKLSAgICAgIGFzc2VydCAocmVsLT5ob3d0byAhPSBOVUxMKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlbDsKLX0KLQotI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLSNpZiAoZGVmaW5lZChPQkpfQU9VVCkgfCBkZWZpbmVkKE9CSl9CT1VUKSkKLXZvaWQKLXRjX2FvdXRfZml4X3RvX2NoYXJzICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgLyoKLSAgICogSW46IGxlbmd0aCBvZiByZWxvY2F0aW9uIChvciBvZiBhZGRyZXNzKSBpbiBjaGFyczogMSwgMiBvciA0LgotICAgKiBPdXQ6IEdOVSBMRCByZWxvY2F0aW9uIGxlbmd0aCBjb2RlOiAwLCAxLCBvciAyLgotICAgKi8KLQotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBuYnl0ZXNfcl9sZW5ndGhbXSA9IHs0MiwgMCwgMSwgNDIsIDJ9OwotICBsb25nIHJfc3ltYm9sbnVtOwotCi0gIGtub3cgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwpOwotCi0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsCi0JCSAgICAgICh2YWx1ZVQpIChmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzCi0JCQkJKyBmaXhQLT5meF93aGVyZSAtIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKSwKLQkJICAgICAgNCk7Ci0KLSAgcl9zeW1ib2xudW0gPSAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkJID8gU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpCi0JCSA6IGZpeFAtPmZ4X2FkZHN5LT5zeV9udW1iZXIpOwotCi0gIHdoZXJlWzZdID0gKHJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB3aGVyZVs1XSA9IChyX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB3aGVyZVs0XSA9IHJfc3ltYm9sbnVtICYgMHgwZmY7Ci0gIHdoZXJlWzddID0gKCgoKCFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkgPDwgMykgJiAweDA4KQotCSAgICAgIHwgKChuYnl0ZXNfcl9sZW5ndGhbZml4UC0+Znhfc2l6ZV0gPDwgMSkgJiAweDA2KQotCSAgICAgIHwgKCgoZml4UC0+ZnhfcGNyZWwgPDwgMCkgJiAweDAxKSAmIDB4MGYpKTsKLX0KLQotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0KLSNpZiBkZWZpbmVkIChJMzg2Q09GRikKLQotc2hvcnQKLXRjX2NvZmZfZml4MnJ0eXBlIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBpZiAoZml4UC0+Znhfcl90eXBlID09IFJfSU1BR0VCQVNFKQotICAgIHJldHVybiBSX0lNQUdFQkFTRTsKLQotICByZXR1cm4gKGZpeFAtPmZ4X3BjcmVsID8KLQkgIChmaXhQLT5meF9zaXplID09IDEgPyBSX1BDUkJZVEUgOgotCSAgIGZpeFAtPmZ4X3NpemUgPT0gMiA/IFJfUENSV09SRCA6Ci0JICAgUl9QQ1JMT05HKSA6Ci0JICAoZml4UC0+Znhfc2l6ZSA9PSAxID8gUl9SRUxCWVRFIDoKLQkgICBmaXhQLT5meF9zaXplID09IDIgPyBSX1JFTFdPUkQgOgotCSAgIFJfRElSMzIpKTsKLX0KLQotaW50Ci10Y19jb2ZmX3NpemVtYWNoZGVwIChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgaWYgKGZyYWctPmZyX25leHQpCi0gICAgcmV0dXJuIChmcmFnLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZy0+ZnJfYWRkcmVzcyk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIEkzODZDT0ZGICovCi0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQwKLS8qIGVuZCBvZiB0Yy1pMzg2LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaTM4Ni5oIGIvZ2FzL2NvbmZpZy90Yy1pMzg2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMmU0YmMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1pMzg2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NzggKzAsMCBAQAotLyogdGMtaTM4Ni5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1pMzg2LmMKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgVENfSTM4NgotI2RlZmluZSBUQ19JMzg2IDEKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGZpeDsKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCTAKLQotI2lmZGVmIFRFX0xZTlgKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImNvZmYtaTM4Ni1seW54IgotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0vKiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHJlbG9jYXRpb24gdHlwZXMgaW4gdGMtaTM4Ni5jLiAgVGhlIGZpcnN0Ci0gICBwYXJhbWV0ZXIgaXMgdGhlIGN1cnJlbnQgcmVsb2NhdGlvbiB0eXBlLCB0aGUgc2Vjb25kIG9uZSBpcyB0aGUgZGVzaXJlZAotICAgdHlwZS4gIFRoZSBpZGVhIGlzIHRoYXQgaWYgdGhlIG9yaWdpbmFsIHR5cGUgaXMgYWxyZWFkeSBzb21lIGtpbmQgb2YgUElDCi0gICByZWxvY2F0aW9uLCB3ZSBsZWF2ZSBpdCBhbG9uZSwgb3RoZXJ3aXNlIHdlIGdpdmUgaXQgdGhlIGRlc2lyZWQgdHlwZSAqLwotCi0jZGVmaW5lIFRDX1JFTE9DKFgsWSkgKCgoWCkgIT0gQkZEX1JFTE9DXzM4Nl9QTFQzMiAmJiBcCi0JICAgKFgpICE9IEJGRF9SRUxPQ18zODZfR09UT0ZGICYmIFwKLQkgICAoWCkgIT0gQkZEX1JFTE9DXzM4Nl9HT1QzMiAmJiBcCi0JICAgKFgpICE9IEJGRF9SRUxPQ18zODZfR09UUEMpID8gWSA6IFgpCi0KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoWCkgIHRjX2kzODZfZml4X2FkanVzdGFibGUoWCkKLWV4dGVybiBpbnQgdGNfaTM4Nl9maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotLyogVGhpcyBpcyB0aGUgcmVsb2NhdGlvbiB0eXBlIGZvciBkaXJlY3QgcmVmZXJlbmNlcyB0byBHTE9CQUxfT0ZGU0VUX1RBQkxFLgotICogSXQgY29tZXMgdXAgaW4gY29tcGxpY2F0ZWQgZXhwcmVzc2lvbnMgc3VjaCBhcyAKLSAqIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXytbLi0uTDI4NF0sIHdoaWNoIGNhbm5vdCBiZSBleHByZXNzZWQgbm9ybWFsbHkgd2l0aAotICogdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBUaGUgZml4dXAgc3BlY2lmaWVkIGhlcmUgd2hlbiB1c2VkIGF0IHJ1bnRpbWUgCi0gKiBpbXBsaWVzIHRoYXQgd2Ugc2hvdWxkIGFkZCB0aGUgYWRkcmVzcyBvZiB0aGUgR09UIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24sCi0gKiBhbmQgYXMgYSByZXN1bHQgd2UgaGF2ZSBzaW1wbGlmaWVkIHRoZSBleHByZXNzaW9uIGludG8gc29tZXRoaW5nIHdlIGNhbiB1c2UuCi0gKi8KLSNkZWZpbmUgVENfUkVMT0NfR0xPQkFMX09GRlNFVF9UQUJMRSBCRkRfUkVMT0NfMzg2X0dPVFBDCi0KLS8qIFRoaXMgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UgaWYgdGhlIHJlbG9jYXRpb24gaXMgZm9yIGEgbG9jYWwgb2JqZWN0Ci0gICBmb3Igd2hpY2ggd2Ugc3RpbGwgd2FudCB0byBkbyB0aGUgcmVsb2NhdGlvbiBhdCBydW50aW1lLiAgVHJ1ZSBpZiB3ZQotICAgYXJlIHdpbGxpbmcgdG8gcGVyZm9ybSB0aGlzIHJlbG9jYXRpb24gd2hpbGUgYnVpbGRpbmcgdGhlIC5vIGZpbGUuCi0gICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgcGNyZWwgcmVsb2NhdGlvbnMsIHNvIEdPVE9GRiBkb2VzIG5vdCBuZWVkIHRvIGJlCi0gICBjaGVja2VkIGhlcmUuICBJIGFtIG5vdCBzdXJlIGlmIHNvbWUgb2YgdGhlIG90aGVycyBhcmUgZXZlciB1c2VkIHdpdGgKLSAgIHBjcmVsLCBidXQgaXQgaXMgZWFzaWVyIHRvIGJlIHNhZmUgdGhhbiBzb3JyeS4gKi8KLQotI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoRklYKQkJCQlcCi0gICgoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zODZfUExUMzIJCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zODZfR09UMzIJCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zODZfR09UUEMJCQlcCi0gICAmJiAoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwJCQkJCVwKLSAgICAgICB8fCAoISBTX0lTX0VYVEVSTkFMICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotCSAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotCSAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KQkJCVwKLQkgICAmJiAhIFNfSVNfQ09NTU9OICgoRklYKS0+ZnhfYWRkc3kpKSkpCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0gJCWJmZF9hcmNoX2kzODYKLQotI2lmZGVmIE9CSl9BT1VUCi0jaWZkZWYgVEVfTmV0QlNECi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJhLm91dC1pMzg2LW5ldGJzZCIKLSNlbmRpZgotI2lmZGVmIFRFXzM4NkJTRAotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtaTM4Ni1ic2QiCi0jZW5kaWYKLSNpZmRlZiBURV9MSU5VWAotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtaTM4Ni1saW51eCIKLSNlbmRpZgotI2lmZGVmIFRFX01hY2gKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LW1hY2gzIgotI2VuZGlmCi0jaWZkZWYgVEVfRFlOSVgKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LWkzODYtZHluaXgiCi0jZW5kaWYKLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtaTM4NiIKLSNlbmRpZgotI2VuZGlmIC8qIE9CSl9BT1VUICovCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJlbGYzMi1pMzg2IgotI2VuZGlmCi0KLSNpZmRlZiBPQkpfTUFZQkVfRUxGCi0jaWZkZWYgT0JKX01BWUJFX0NPRkYKLWV4dGVybiBjb25zdCBjaGFyICppMzg2X3RhcmdldF9mb3JtYXQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBUQVJHRVRfRk9STUFUIGkzODZfdGFyZ2V0X2Zvcm1hdCAoKQotI2VuZGlmCi0jZW5kaWYKLQotI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLS8qIENPRkYgU1RVRkYgKi8KLQotI2RlZmluZSBDT0ZGX01BR0lDIEkzODZNQUdJQwotI2RlZmluZSBCRkRfQVJDSCBiZmRfYXJjaF9pMzg2Ci0jZGVmaW5lIENPRkZfRkxBR1MgRl9BUjMyV1IKLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoeCkgKCh4KS0+ZnhfYWRkc3kgfHwgKHgpLT5meF9yX3R5cGU9PTcpCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeFApIHRjX2NvZmZfZml4MnJ0eXBlKGZpeFApCi1leHRlcm4gc2hvcnQgdGNfY29mZl9maXgycnR5cGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0jZGVmaW5lIFRDX0NPRkZfU0laRU1BQ0hERVAoZnJhZykgdGNfY29mZl9zaXplbWFjaGRlcChmcmFnKQotZXh0ZXJuIGludCB0Y19jb2ZmX3NpemVtYWNoZGVwIFBBUkFNUyAoKGZyYWdTICpmcmFnKSk7Ci0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykgMgotI2RlZmluZSBUQ19SVkFfUkVMT0MgNwotLyogTmVlZCB0aGlzIGZvciBQSUMgcmVsb2NhdGlvbnMgKi8KLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUKLQotCi0jaWZkZWYgVEVfMzg2QlNECi0vKiBUaGUgQlNESSBsaW5rZXIgYXBwYXJlbnRseSByZWplY3RzIG9iamVjdHMgd2l0aCBhIG1hY2hpbmUgdHlwZSBvZgotICAgTV8zODYgKDEwMCkuICAqLwotI2RlZmluZSBBT1VUX01BQ0hUWVBFIDAKLSNlbHNlCi0jZGVmaW5lIEFPVVRfTUFDSFRZUEUgMTAwCi0jZW5kaWYKLQotI3VuZGVmIFJFVkVSU0VfU09SVF9SRUxPQ1MKLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4cCkgdGNfaTM4Nl9mb3JjZV9yZWxvY2F0aW9uKGZpeHApCi1leHRlcm4gaW50IHRjX2kzODZfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgTk9fUkVMT0MgQkZEX1JFTE9DX05PTkUKLSNlbHNlCi0jZGVmaW5lIE5PX1JFTE9DIDAKLSNlbmRpZgotI2RlZmluZSB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2soYSkJOwkvKiBub3QgdXNlZCAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZm5kZWYgT0JKX0FPVVQKLSNpZm5kZWYgVEVfUEUKLSNpZm5kZWYgVEVfR08zMgotLyogTG9jYWwgbGFiZWxzIHN0YXJ0cyB3aXRoIC5MICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMKG5hbWUpIChuYW1lWzBdID09ICcuJyBcCi0JCSAmJiAobmFtZVsxXSA9PSAnTCcgfHwgbmFtZVsxXSA9PSAnWCcgfHwgbmFtZVsxXSA9PSAnLicpKQotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKHgpCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19jcmF3bF9zeW1ib2xfY2hhaW4oYSkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJezt9CS8qIG5vdCB1c2VkICovCi0KLWV4dGVybiBjb25zdCBjaGFyIGV4dHJhX3N5bWJvbF9jaGFyc1tdOwotI2RlZmluZSB0Y19zeW1ib2xfY2hhcnMgZXh0cmFfc3ltYm9sX2NoYXJzCi0KLSNkZWZpbmUgTUFYX09QRVJBTkRTIDMJCS8qIG1heCBvcGVyYW5kcyBwZXIgaW5zbiAqLwotI2RlZmluZSBNQVhfSU1NRURJQVRFX09QRVJBTkRTIDIvKiBtYXggaW1tZWRpYXRlcyBwZXIgaW5zbiAobGNhbGwsIGxqbXApICovCi0jZGVmaW5lIE1BWF9NRU1PUllfT1BFUkFORFMgMgkvKiBtYXggbWVtb3J5IHJlZnMgcGVyIGluc24gKHN0cmluZyBvcHMpICovCi0KLS8qIFByZWZpeGVzIHdpbGwgYmUgZW1pdHRlZCBpbiB0aGUgb3JkZXIgZGVmaW5lZCBiZWxvdy4KLSAgIFdBSVRfUFJFRklYIG11c3QgYmUgdGhlIGZpcnN0IHByZWZpeCBzaW5jZSBGV0FJVCBpcyByZWFsbHkgaXMgYW4KLSAgIGluc3RydWN0aW9uLCBhbmQgc28gbXVzdCBjb21lIGJlZm9yZSBhbnkgcHJlZml4ZXMuICovCi0jZGVmaW5lIFdBSVRfUFJFRklYCTAKLSNkZWZpbmUgTE9DS1JFUF9QUkVGSVgJMQotI2RlZmluZSBBRERSX1BSRUZJWAkyCi0jZGVmaW5lIERBVEFfUFJFRklYCTMKLSNkZWZpbmUgU0VHX1BSRUZJWAk0Ci0jZGVmaW5lIE1BWF9QUkVGSVhFUwk1CS8qIG1heCBwcmVmaXhlcyBwZXIgb3Bjb2RlICovCi0KLS8qIHdlIGRlZmluZSB0aGUgc3ludGF4IGhlcmUgKG1vZHVsbyBiYXNlLGluZGV4LHNjYWxlIHN5bnRheCkgKi8KLSNkZWZpbmUgUkVHSVNURVJfUFJFRklYICclJwotI2RlZmluZSBJTU1FRElBVEVfUFJFRklYICckJwotI2RlZmluZSBBQlNPTFVURV9QUkVGSVggJyonCi0KLSNkZWZpbmUgVFdPX0JZVEVfT1BDT0RFX0VTQ0FQRSAweDBmCi0jZGVmaW5lIE5PUF9PUENPREUgKGNoYXIpIDB4OTAKLQotLyogcmVnaXN0ZXIgbnVtYmVycyAqLwotI2RlZmluZSBFQlBfUkVHX05VTSA1Ci0jZGVmaW5lIEVTUF9SRUdfTlVNIDQKLQotLyogbW9kcm1fYnl0ZS5yZWdtZW0gZm9yIHR3b2J5dGUgZXNjYXBlICovCi0jZGVmaW5lIEVTQ0FQRV9UT19UV09fQllURV9BRERSRVNTSU5HIEVTUF9SRUdfTlVNCi0vKiBpbmRleF9iYXNlX2J5dGUuaW5kZXggZm9yIG5vIGluZGV4IHJlZ2lzdGVyIGFkZHJlc3NpbmcgKi8KLSNkZWZpbmUgTk9fSU5ERVhfUkVHSVNURVIgRVNQX1JFR19OVU0KLS8qIGluZGV4X2Jhc2VfYnl0ZS5iYXNlIGZvciBubyBiYXNlIHJlZ2lzdGVyIGFkZHJlc3NpbmcgKi8KLSNkZWZpbmUgTk9fQkFTRV9SRUdJU1RFUiBFQlBfUkVHX05VTQotI2RlZmluZSBOT19CQVNFX1JFR0lTVEVSXzE2IDYKLQotLyogdGhlc2UgYXJlIHRoZSBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcy4gICovCi0jZGVmaW5lIERXT1JEX01ORU1fU1VGRklYICdsJwotI2RlZmluZSBXT1JEX01ORU1fU1VGRklYICAndycKLSNkZWZpbmUgQllURV9NTkVNX1NVRkZJWCAgJ2InCi0jZGVmaW5lIFNIT1JUX01ORU1fU1VGRklYICdzJwotI2RlZmluZSBMT05HX01ORU1fU1VGRklYICAnbCcKLS8qIEludGVsIFN5bnRheCAqLwotI2RlZmluZSBMT05HX0RPVUJMRV9NTkVNX1NVRkZJWCAneCcKLS8qIEludGVsIFN5bnRheCAqLwotI2RlZmluZSBJTlRFTF9EV09SRF9NTkVNX1NVRkZJWCAnZCcKLQotLyogbW9kcm0ubW9kZSA9IFJFR01FTV9GSUVMRF9IQVNfUkVHIHdoZW4gYSByZWdpc3RlciBpcyBpbiB0aGVyZSAqLwotI2RlZmluZSBSRUdNRU1fRklFTERfSEFTX1JFRyAweDMvKiBhbHdheXMgPSAweDMgKi8KLSNkZWZpbmUgUkVHTUVNX0ZJRUxEX0hBU19NRU0gKH5SRUdNRU1fRklFTERfSEFTX1JFRykKLQotI2RlZmluZSBFTkRfT0ZfSU5TTiAnXDAnCi0KLS8qIEludGVsIFN5bnRheCAqLwotLyogVmFsdWVzIDAtNCBtYXAgb250byBzY2FsZSBmYWN0b3IgKi8KLSNkZWZpbmUgQllURV9QVFIgICAgIDAKLSNkZWZpbmUgV09SRF9QVFIgICAgIDEKLSNkZWZpbmUgRFdPUkRfUFRSICAgIDIKLSNkZWZpbmUgUVdPUkRfUFRSICAgIDMKLSNkZWZpbmUgWFdPUkRfUFRSICAgIDQKLSNkZWZpbmUgU0hPUlQgICAgICAgIDUKLSNkZWZpbmUgT0ZGU0VUX0ZMQVQgIDYKLSNkZWZpbmUgRkxBVCAgICAgICAgIDcKLSNkZWZpbmUgTk9ORV9GT1VORCAgIDgKLS8qCi0gIFdoZW4gYW4gb3BlcmFuZCBpcyByZWFkIGluIGl0IGlzIGNsYXNzaWZpZWQgYnkgaXRzIHR5cGUuICBUaGlzIHR5cGUgaW5jbHVkZXMKLSAgYWxsIHRoZSBwb3NzaWJsZSB3YXlzIGFuIG9wZXJhbmQgY2FuIGJlIHVzZWQuICBUaHVzLCAnJWVheCcgaXMgYm90aCAncmVnaXN0ZXIKLSAgIyAwJyBhbmQgJ1RoZSBBY2N1bXVsYXRvcicuICBJbiBvdXIgbGFuZ3VhZ2UgdGhpcyBpcyBleHByZXNzZWQgYnkgT1InaW5nCi0gICdSZWczMicgKGFueSAzMiBiaXQgcmVnaXN0ZXIpIGFuZCAnQWNjJyAodGhlIGFjY3VtdWxhdG9yKS4KLSAgT3BlcmFuZHMgYXJlIGNsYXNzaWZpZWQgc28gdGhhdCB3ZSBjYW4gbWF0Y2ggZ2l2ZW4gb3BlcmFuZCB0eXBlcyB3aXRoCi0gIHRoZSBvcGNvZGUgdGFibGUgaW4gb3Bjb2RlL2kzODYuaC4KLSAgKi8KLS8qIHJlZ2lzdGVyICovCi0jZGVmaW5lIFJlZzgJCSAgIDB4MQkvKiA4IGJpdCByZWcgKi8KLSNkZWZpbmUgUmVnMTYJCSAgIDB4MgkvKiAxNiBiaXQgcmVnICovCi0jZGVmaW5lIFJlZzMyCQkgICAweDQJLyogMzIgYml0IHJlZyAqLwotLyogaW1tZWRpYXRlICovCi0jZGVmaW5lIEltbTgJCSAgIDB4OAkvKiA4IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgSW1tOFMJCSAgMHgxMAkvKiA4IGJpdCBpbW1lZGlhdGUgc2lnbiBleHRlbmRlZCAqLwotI2RlZmluZSBJbW0xNgkJICAweDIwCS8qIDE2IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgSW1tMzIJCSAgMHg0MAkvKiAzMiBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIEltbTEJCSAgMHg4MAkvKiAxIGJpdCBpbW1lZGlhdGUgKi8KLS8qIG1lbW9yeSAqLwotI2RlZmluZSBCYXNlSW5kZXgJIDB4MTAwCi0vKiBEaXNwOCwxNiwzMiBhcmUgdXNlZCBpbiBkaWZmZXJlbnQgd2F5cywgZGVwZW5kaW5nIG9uIHRoZQotICAgaW5zdHJ1Y3Rpb24uICBGb3IganVtcHMsIHRoZXkgc3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgUEMgcmVsYXRpdmUKLSAgIGRpc3BsYWNlbWVudCwgZm9yIGJhc2VpbmRleCB0eXBlIGluc3RydWN0aW9ucywgdGhleSBzcGVjaWZ5IHRoZQotICAgc2l6ZSBvZiB0aGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBiYXNlIHJlZ2lzdGVyLCBhbmQgZm9yIG1lbW9yeQotICAgb2Zmc2V0IGluc3RydWN0aW9ucyBzdWNoIGFzIGBtb3YgMTIzNCwlYWwnIHRoZXkgc3BlY2lmeSB0aGUgc2l6ZSBvZgotICAgdGhlIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgc2VnbWVudCBiYXNlLiAgKi8KLSNkZWZpbmUgRGlzcDgJCSAweDIwMAkvKiA4IGJpdCBkaXNwbGFjZW1lbnQgKi8KLSNkZWZpbmUgRGlzcDE2CQkgMHg0MDAJLyogMTYgYml0IGRpc3BsYWNlbWVudCAqLwotI2RlZmluZSBEaXNwMzIJCSAweDgwMAkvKiAzMiBiaXQgZGlzcGxhY2VtZW50ICovCi0vKiBzcGVjaWFscyAqLwotI2RlZmluZSBJbk91dFBvcnRSZWcJMHgxMDAwCS8qIHJlZ2lzdGVyIHRvIGhvbGQgaW4vb3V0IHBvcnQgYWRkciA9IGR4ICovCi0jZGVmaW5lIFNoaWZ0Q291bnQJMHgyMDAwCS8qIHJlZ2lzdGVyIHRvIGhvbGQgc2hpZnQgY291bmQgPSBjbCAqLwotI2RlZmluZSBDb250cm9sCSAgICAgICAgMHg0MDAwCS8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRGVidWcJICAgICAgICAweDgwMDAJLyogRGVidWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVGVzdAkgICAgICAgMHgxMDAwMAkvKiBUZXN0IHJlZ2lzdGVyICovCi0jZGVmaW5lIEZsb2F0UmVnICAgICAgIDB4MjAwMDAJLyogRmxvYXQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRmxvYXRBY2MgICAgICAgMHg0MDAwMAkvKiBGbG9hdCBzdGFjayB0b3AgJXN0KDApICovCi0jZGVmaW5lIFNSZWcyCSAgICAgICAweDgwMDAwCS8qIDIgYml0IHNlZ21lbnQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU1JlZzMJICAgICAgMHgxMDAwMDAJLyogMyBiaXQgc2VnbWVudCByZWdpc3RlciAqLwotI2RlZmluZSBBY2MJICAgICAgMHgyMDAwMDAJLyogQWNjdW11bGF0b3IgJWFsIG9yICVheCBvciAlZWF4ICovCi0jZGVmaW5lIEp1bXBBYnNvbHV0ZSAgMHg0MDAwMDAKLSNkZWZpbmUgUmVnTU1YCSAgICAgIDB4ODAwMDAwCS8qIE1NWCByZWdpc3RlciAqLwotI2RlZmluZSBSZWdYTU0JICAgICAweDEwMDAwMDAJLyogWE1NIHJlZ2lzdGVycyBpbiBQSUlJICovCi0jZGVmaW5lIEVzU2VnCSAgICAgMHgyMDAwMDAwCS8qIFN0cmluZyBpbnNuIG9wZXJhbmQgd2l0aCBmaXhlZCBlcyBzZWdtZW50ICovCi0vKiBJbnZNZW0gaXMgZm9yIGluc3RydWN0aW9ucyB3aXRoIGEgbW9kcm0gYnl0ZSB0aGF0IG9ubHkgYWxsb3cgYQotICAgZ2VuZXJhbCByZWdpc3RlciBlbmNvZGluZyBpbiB0aGUgaS50bS5tb2RlIGFuZCBpLnRtLnJlZ21lbSBmaWVsZHMsCi0gICBlZy4gY29udHJvbCByZWcgbW92ZXMuICBUaGV5IHJlYWxseSBvdWdodCB0byBzdXBwb3J0IGEgbWVtb3J5IGZvcm0sCi0gICBidXQgZG9uJ3QsIHNvIHdlIGFkZCBhbiBJbnZNZW0gZmxhZyB0byB0aGUgcmVnaXN0ZXIgb3BlcmFuZCB0bwotICAgaW5kaWNhdGUgdGhhdCBpdCBzaG91bGQgYmUgZW5jb2RlZCBpbiB0aGUgaS50bS5yZWdtZW0gZmllbGQuICAqLwotI2RlZmluZSBJbnZNZW0JICAgICAweDQwMDAwMDAKLQotI2RlZmluZSBSZWcJKFJlZzh8UmVnMTZ8UmVnMzIpCS8qIGdlbidsIHJlZ2lzdGVyICovCi0jZGVmaW5lIFdvcmRSZWcgKFJlZzE2fFJlZzMyKQotI2RlZmluZSBJbXBsaWNpdFJlZ2lzdGVyIChJbk91dFBvcnRSZWd8U2hpZnRDb3VudHxBY2N8RmxvYXRBY2MpCi0jZGVmaW5lIEltbQkoSW1tOHxJbW04U3xJbW0xNnxJbW0zMikgLyogZ2VuJ2wgaW1tZWRpYXRlICovCi0jZGVmaW5lIERpc3AJKERpc3A4fERpc3AxNnxEaXNwMzIpCS8qIEdlbmVyYWwgZGlzcGxhY2VtZW50ICovCi0jZGVmaW5lIEFueU1lbQkoRGlzcHxCYXNlSW5kZXh8SW52TWVtKQkvKiBHZW5lcmFsIG1lbW9yeSAqLwotLyogVGhlIGZvbGxvd2luZyBhbGlhc2VzIGFyZSBkZWZpbmVkIGJlY2F1c2UgdGhlIG9wY29kZSB0YWJsZQotICAgY2FyZWZ1bGx5IHNwZWNpZmllcyB0aGUgYWxsb3dlZCBtZW1vcnkgdHlwZXMgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24uCi0gICBBdCB0aGUgbW9tZW50IHdlIGNhbiBvbmx5IHRlbGwgYSBtZW1vcnkgcmVmZXJlbmNlIHNpemUgYnkgdGhlCi0gICBpbnN0cnVjdGlvbiBzdWZmaXgsIHNvIHRoZXJlJ3Mgbm90IG11Y2ggcG9pbnQgaW4gZGVmaW5pbmcgTWVtOCwKLSAgIE1lbTE2LCBNZW0zMiBhbmQgTWVtNjQgb3Bjb2RlIG1vZGlmaWVycyAtIFdlIG1pZ2h0IGFzIHdlbGwganVzdCB1c2UKLSAgIHRoZSBzdWZmaXggZGlyZWN0bHkgdG8gY2hlY2sgbWVtb3J5IG9wZXJhbmRzLiAgKi8KLSNkZWZpbmUgTExvbmdNZW0gQW55TWVtCQkvKiA2NCBiaXRzIChvciBtb3JlKSAqLwotI2RlZmluZSBMb25nTWVtIEFueU1lbQkJLyogMzIgYml0IG1lbW9yeSByZWYgKi8KLSNkZWZpbmUgU2hvcnRNZW0gQW55TWVtCQkvKiAxNiBiaXQgbWVtb3J5IHJlZiAqLwotI2RlZmluZSBXb3JkTWVtIEFueU1lbQkJLyogMTYgb3IgMzIgYml0IG1lbW9yeSByZWYgKi8KLSNkZWZpbmUgQnl0ZU1lbSBBbnlNZW0JCS8qIDggYml0IG1lbW9yeSByZWYgKi8KLQotI2RlZmluZSBTTUFMTEVTVF9ESVNQX1RZUEUobnVtKSBcCi0gICAgKGZpdHNfaW5fc2lnbmVkX2J5dGUobnVtKSA/IChEaXNwOHxEaXNwMzIpIDogRGlzcDMyKQotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBpbnN0cnVjdGlvbiBuYW1lIHNhbnMgd2lkdGggc3VmZml4ICgibW92IiBmb3IgbW92bCBpbnNucykgKi8KLSAgY2hhciAqbmFtZTsKLQotICAvKiBob3cgbWFueSBvcGVyYW5kcyAqLwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7Ci0KLSAgLyogYmFzZV9vcGNvZGUgaXMgdGhlIGZ1bmRhbWVudGFsIG9wY29kZSBieXRlIHdpdGhvdXQgb3B0aW9uYWwKLSAgICAgcHJlZml4KGVzKS4gICovCi0gIHVuc2lnbmVkIGludCBiYXNlX29wY29kZTsKLQotICAvKiBleHRlbnNpb25fb3Bjb2RlIGlzIHRoZSAzIGJpdCBleHRlbnNpb24gZm9yIGdyb3VwIDxuPiBpbnNucy4KLSAgICAgVGhpcyBmaWVsZCBpcyBhbHNvIHVzZWQgdG8gc3RvcmUgdGhlIDgtYml0IG9wY29kZSBzdWZmaXggZm9yIHRoZQotICAgICBBTUQgM0ROb3chIGluc3RydWN0aW9ucy4KLSAgICAgSWYgdGhpcyB0ZW1wbGF0ZSBoYXMgbm8gZXh0ZW5zaW9uIG9wY29kZSAodGhlIHVzdWFsIGNhc2UpIHVzZSBOb25lICovCi0gIHVuc2lnbmVkIGludCBleHRlbnNpb25fb3Bjb2RlOwotI2RlZmluZSBOb25lIDB4ZmZmZgkJLyogSWYgbm8gZXh0ZW5zaW9uX29wY29kZSBpcyBwb3NzaWJsZS4gKi8KLQotICAvKiB0aGUgYml0cyBpbiBvcGNvZGVfbW9kaWZpZXIgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGZpbmFsIG9wY29kZSBmcm9tCi0gICAgIHRoZSBiYXNlX29wY29kZS4gIFRoZXNlIGJpdHMgYWxzbyBhcmUgdXNlZCB0byBkZXRlY3QgYWx0ZXJuYXRlIGZvcm1zIG9mCi0gICAgIHRoZSBzYW1lIGluc3RydWN0aW9uICovCi0gIHVuc2lnbmVkIGludCBvcGNvZGVfbW9kaWZpZXI7Ci0KLSAgLyogb3Bjb2RlX21vZGlmaWVyIGJpdHM6ICovCi0jZGVmaW5lIFcJCSAgIDB4MQkvKiBzZXQgaWYgb3BlcmFuZHMgY2FuIGJlIHdvcmRzIG9yIGR3b3JkcwotCQkJCSAgIGVuY29kZWQgdGhlIGNhbm9uaWNhbCB3YXkgKi8KLSNkZWZpbmUgRAkJICAgMHgyCS8qIEQgPSAwIGlmIFJlZyAtLT4gUmVnbWVtOwotCQkJCSAgIEQgPSAxIGlmIFJlZ21lbSAtLT4gUmVnOiAgICBNVVNUIEJFIDB4MiAqLwotI2RlZmluZSBNb2RybQkJICAgMHg0Ci0jZGVmaW5lIEZsb2F0UgkJICAgMHg4CS8qIHNyYy9kZXN0IHN3YXAgZm9yIGZsb2F0czogICBNVVNUIEJFIDB4OCAqLwotI2RlZmluZSBTaG9ydEZvcm0JICAweDEwCS8qIHJlZ2lzdGVyIGlzIGluIGxvdyAzIGJpdHMgb2Ygb3Bjb2RlICovCi0jZGVmaW5lIEZsb2F0TUYJCSAgMHgyMAkvKiBGUCBpbnNuIG1lbW9yeSBmb3JtYXQgYml0LCBzaXplZCBieSAweDQgKi8KLSNkZWZpbmUgSnVtcAkJICAweDQwCS8qIHNwZWNpYWwgY2FzZSBmb3IganVtcCBpbnNucy4gKi8KLSNkZWZpbmUgSnVtcER3b3JkCSAgMHg4MCAgLyogY2FsbCBhbmQganVtcCAqLwotI2RlZmluZSBKdW1wQnl0ZQkgMHgxMDAgIC8qIGxvb3AgYW5kIGplY3h6ICovCi0jZGVmaW5lIEp1bXBJbnRlclNlZ21lbnQgMHgyMDAJLyogc3BlY2lhbCBjYXNlIGZvciBpbnRlcnNlZ21lbnQgbGVhcHMvY2FsbHMgKi8KLSNkZWZpbmUgRmxvYXRECQkgMHg0MDAJLyogZGlyZWN0aW9uIGZvciBmbG9hdCBpbnNuczogIE1VU1QgQkUgMHg0MDAgKi8KLSNkZWZpbmUgU2VnMlNob3J0Rm9ybQkgMHg4MDAJLyogZW5jb2Rpbmcgb2YgbG9hZCBzZWdtZW50IHJlZyBpbnNucyAqLwotI2RlZmluZSBTZWczU2hvcnRGb3JtCTB4MTAwMAkvKiBmcy9ncyBzZWdtZW50IHJlZ2lzdGVyIGluc25zLiAqLwotI2RlZmluZSBTaXplMTYJCTB4MjAwMAkvKiBuZWVkcyBzaXplIHByZWZpeCBpZiBpbiAzMi1iaXQgbW9kZSAqLwotI2RlZmluZSBTaXplMzIJCTB4NDAwMAkvKiBuZWVkcyBzaXplIHByZWZpeCBpZiBpbiAxNi1iaXQgbW9kZSAqLwotI2RlZmluZSBJZ25vcmVTaXplCTB4ODAwMCAgLyogaW5zdHJ1Y3Rpb24gaWdub3JlcyBvcGVyYW5kIHNpemUgcHJlZml4ICovCi0jZGVmaW5lIE5vX2JTdWYJICAgICAgIDB4MTAwMDAJLyogYiBzdWZmaXggb24gaW5zdHJ1Y3Rpb24gaWxsZWdhbCAqLwotI2RlZmluZSBOb193U3VmCSAgICAgICAweDIwMDAwCS8qIHcgc3VmZml4IG9uIGluc3RydWN0aW9uIGlsbGVnYWwgKi8KLSNkZWZpbmUgTm9fbFN1ZgkgICAgICAgMHg0MDAwMAkvKiBsIHN1ZmZpeCBvbiBpbnN0cnVjdGlvbiBpbGxlZ2FsICovCi0jZGVmaW5lIE5vX3NTdWYJICAgICAgIDB4ODAwMDAJLyogcyBzdWZmaXggb24gaW5zdHJ1Y3Rpb24gaWxsZWdhbCAqLwotI2RlZmluZSBOb19kU3VmICAgICAgIDB4MTAwMDAwICAvKiBkIHN1ZmZpeCBvbiBpbnN0cnVjdGlvbiBpbGxlZ2FsICovCi0jZGVmaW5lIE5vX3hTdWYgICAgICAgMHgyMDAwMDAgIC8qIHggc3VmZml4IG9uIGluc3RydWN0aW9uIGlsbGVnYWwgKi8KLSNkZWZpbmUgRldhaXQJICAgICAgMHg0MDAwMDAJLyogaW5zdHJ1Y3Rpb24gbmVlZHMgRldBSVQgKi8KLSNkZWZpbmUgSXNTdHJpbmcgICAgICAweDgwMDAwMAkvKiBxdWljayB0ZXN0IGZvciBzdHJpbmcgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIHJlZ0tsdWRnZSAgICAweDEwMDAwMDAJLyogZmFrZSBhbiBleHRyYSByZWcgb3BlcmFuZCBmb3IgY2xyLCBpbXVsICovCi0jZGVmaW5lIElzUHJlZml4ICAgICAweDIwMDAwMDAJLyogb3Bjb2RlIGlzIGEgcHJlZml4ICovCi0jZGVmaW5lIEltbUV4dAkgICAgIDB4NDAwMDAwMAkvKiBpbnN0cnVjdGlvbiBoYXMgZXh0ZW5zaW9uIGluIDggYml0IGltbSAqLwotI2RlZmluZSBVZ2gJICAgIDB4ODAwMDAwMDAJLyogZGVwcmVjYXRlZCBmcCBpbnNuLCBnZXRzIGEgd2FybmluZyAqLwotCi0gIC8qIG9wZXJhbmRfdHlwZXNbaV0gZGVzY3JpYmVzIHRoZSB0eXBlIG9mIG9wZXJhbmQgaS4gIFRoaXMgaXMgbWFkZQotICAgICBieSBPUidpbmcgdG9nZXRoZXIgYWxsIG9mIHRoZSBwb3NzaWJsZSB0eXBlIG1hc2tzLiAgKGUuZy4KLSAgICAgJ29wZXJhbmRfdHlwZXNbaV0gPSBSZWd8SW1tJyBzcGVjaWZpZXMgdGhhdCBvcGVyYW5kIGkgY2FuIGJlCi0gICAgIGVpdGhlciBhIHJlZ2lzdGVyIG9yIGFuIGltbWVkaWF0ZSBvcGVyYW5kICovCi0gIHVuc2lnbmVkIGludCBvcGVyYW5kX3R5cGVzWzNdOwotfQotdGVtcGxhdGU7Ci0KLS8qCi0gICd0ZW1wbGF0ZXMnIGlzIGZvciBncm91cGluZyB0b2dldGhlciAndGVtcGxhdGUnIHN0cnVjdHVyZXMgZm9yIG9wY29kZXMKLSAgb2YgdGhlIHNhbWUgbmFtZS4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBzdG9yaW5nIHRoZSBpbnNucyBpbiB0aGUgZ3JhbmQKLSAgb2xlIGhhc2ggdGFibGUgb2YgaW5zbnMuCi0gIFRoZSB0ZW1wbGF0ZXMgdGhlbXNlbHZlcyBzdGFydCBhdCBTVEFSVCBhbmQgcmFuZ2UgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKQotICBFTkQuCi0gICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgY29uc3QgdGVtcGxhdGUgKnN0YXJ0OwotICAgIGNvbnN0IHRlbXBsYXRlICplbmQ7Ci0gIH0gdGVtcGxhdGVzOwotCi0vKiB0aGVzZSBhcmUgZm9yIHJlZ2lzdGVyIG5hbWUgLS0+IG51bWJlciAmIHR5cGUgaGFzaCBsb29rdXAgKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBjaGFyICpyZWdfbmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgcmVnX3R5cGU7Ci0gICAgdW5zaWduZWQgaW50IHJlZ19udW07Ci0gIH0KLXJlZ19lbnRyeTsKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGNoYXIgKnNlZ19uYW1lOwotICAgIHVuc2lnbmVkIGludCBzZWdfcHJlZml4OwotICB9Ci1zZWdfZW50cnk7Ci0KLS8qIDM4NiBvcGVyYW5kIGVuY29kaW5nIGJ5dGVzOiAgc2VlIDM4NiBib29rIGZvciBkZXRhaWxzIG9mIHRoaXMuICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgaW50IHJlZ21lbTsJLyogY29kZXMgcmVnaXN0ZXIgb3IgbWVtb3J5IG9wZXJhbmQgKi8KLSAgICB1bnNpZ25lZCBpbnQgcmVnOwkJLyogY29kZXMgcmVnaXN0ZXIgb3BlcmFuZCAob3IgZXh0ZW5kZWQgb3Bjb2RlKSAqLwotICAgIHVuc2lnbmVkIGludCBtb2RlOwkJLyogaG93IHRvIGludGVycHJldCByZWdtZW0gJiByZWcgKi8KLSAgfQotbW9kcm1fYnl0ZTsKLQotLyogMzg2IG9wY29kZSBieXRlIHRvIGNvZGUgaW5kaXJlY3QgYWRkcmVzc2luZy4gKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBiYXNlOwotICAgIHVuc2lnbmVkIGluZGV4OwotICAgIHVuc2lnbmVkIHNjYWxlOwotICB9Ci1zaWJfYnl0ZTsKLQotLyogVGhlIG5hbWUgb2YgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlci4gQWxsb3cKLSAgIHRoaXMgdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkIGJlLiAqLwotI2lmbmRlZiBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUKLSNkZWZpbmUgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0jZW5kaWYKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXZvaWQgaTM4Nl92YWxpZGF0ZV9maXggUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0jZGVmaW5lIFRDX1ZBTElEQVRFX0ZJWChGSVhQLFNFR1RZUEUsU0tJUCkgaTM4Nl92YWxpZGF0ZV9maXgoRklYUCkKLSNlbmRpZgotCi0jZW5kaWYgLyogVENfSTM4NiAqLwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotCi1leHRlcm4gaW50IGZsYWdfMTZiaXRfY29kZTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgbWRfbWF5YmVfdGV4dCgpIFwKLSAgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZykgJiBTRUNfQ09ERSkgIT0gMCkKLSNlbHNlCi0jZGVmaW5lIG1kX21heWJlX3RleHQoKSBcCi0gIChub3dfc2VnICE9IGRhdGFfc2VjdGlvbiAmJiBub3dfc2VnICE9IGJzc19zZWN0aW9uKQotI2VuZGlmCi0KLSNkZWZpbmUgbWRfZG9fYWxpZ24obiwgZmlsbCwgbGVuLCBtYXgsIGFyb3VuZCkJCQkJXAotaWYgKChuKSAmJiAhbmVlZF9wYXNzXzIJCQkJCQkJXAotICAgICYmICghKGZpbGwpIHx8ICgoY2hhcikqKGZpbGwpID09IChjaGFyKTB4OTAgJiYgKGxlbikgPT0gMSkpCQlcCi0gICAgJiYgbWRfbWF5YmVfdGV4dCAoKSkJCQkJCQlcCi0gIHsJCQkJCQkJCQlcCi0gICAgY2hhciAqcDsJCQkJCQkJCVwKLSAgICBwID0gZnJhZ192YXIgKHJzX2FsaWduX2NvZGUsIDE1LCAxLCAocmVsYXhfc3Vic3RhdGVUKSBtYXgsCQlcCi0JCSAgKHN5bWJvbFMgKikgMCwgKG9mZnNldFQpIChuKSwgKGNoYXIgKikgMCk7CQlcCi0gICAgKnAgPSAweDkwOwkJCQkJCQkJXAotICAgIGdvdG8gYXJvdW5kOwkJCQkJCQlcCi0gIH0KLQotZXh0ZXJuIHZvaWQgaTM4Nl9hbGlnbl9jb2RlIFBBUkFNUyAoKGZyYWdTICosIGludCkpOwotCi0jZGVmaW5lIEhBTkRMRV9BTElHTihmcmFnUCkJCQkJCQlcCi1pZiAoZnJhZ1AtPmZyX3R5cGUgPT0gcnNfYWxpZ25fY29kZSkgCQkJCQlcCi0gIGkzODZfYWxpZ25fY29kZSAoZnJhZ1AsIChmcmFnUC0+ZnJfbmV4dC0+ZnJfYWRkcmVzcwkJCVwKLQkJCSAgIC0gZnJhZ1AtPmZyX2FkZHJlc3MJCQkJXAotCQkJICAgLSBmcmFnUC0+ZnJfZml4KSk7Ci0KLS8qIGNhbGwgbWRfYXBwbHlfZml4MyB3aXRoIHNlZ21lbnQgaW5zdGVhZCBvZiBtZF9hcHBseV9maXggKi8KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotCi12b2lkIGkzODZfcHJpbnRfc3RhdGlzdGljcyBQQVJBTVMgKChGSUxFICopKTsKLSNkZWZpbmUgdGNfcHJpbnRfc3RhdGlzdGljcyBpMzg2X3ByaW50X3N0YXRpc3RpY3MKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbgotCi0jaWZkZWYgU0NPX0VMRgotI2RlZmluZSB0Y19pbml0X2FmdGVyX2FyZ3MoKSBzY29faWQgKCkKLWV4dGVybiB2b2lkIHNjb19pZCBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotI2RlZmluZSBESUZGX0VYUFJfT0sgICAgLyogZm9vLS4gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLQotLyogZW5kIG9mIHRjLWkzODYuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1pODYwLmMgYi9nYXMvY29uZmlnL3RjLWk4NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJlMmIxOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWk4NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNjMgKzAsMCBAQAotLyogdGMtaTg2MC5jIC0tIEFzc2VtYmxlIGZvciB0aGUgSTg2MAotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MiwgOTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2luY2x1ZGUgIm9wY29kZS9pODYwLmgiCi0KLXZvaWQgbWRfYmVnaW4gKCk7Ci12b2lkIG1kX251bWJlcl90b19jaGFycyAoKTsKLXZvaWQgbWRfYXNzZW1ibGUgKCk7Ci1jaGFyICptZF9hdG9mICgpOwotdm9pZCBtZF9jb252ZXJ0X2ZyYWcgKCk7Ci1pbnQgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKCk7Ci12b2lkIG1kX251bWJlcl90b19pbW0gKCk7Ci12b2lkIG1kX251bWJlcl90b19kaXNwICgpOwotdm9pZCBtZF9udW1iZXJfdG9fZmllbGQgKCk7Ci12b2lkIG1kX3JpX3RvX2NoYXJzICgpOwotc3RhdGljIHZvaWQgaTg2MF9pcCAoKTsKLS8qIHZvaWQgZW1pdF9tYWNoaW5lX3JlbG9jKCk7ICovCi0KLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKTsKLQotLyogdm9pZCAoKm1kX2VtaXRfcmVsb2NhdGlvbnMpKCkgPSBlbWl0X21hY2hpbmVfcmVsb2M7ICovCi0KLS8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoID0gTlVMTDsKLQotc3RhdGljIHZvaWQgc19kdWFsICgpLCBzX2VuZGR1YWwgKCk7Ci1zdGF0aWMgdm9pZCBzX2F0bXAgKCk7Ci0KLWNvbnN0IHBzZXVkb190eXBlUwotICBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiZHVhbCIsIHNfZHVhbCwgNH0sCi0gIHsiZW5kZHVhbCIsIHNfZW5kZHVhbCwgNH0sCi0gIHsiYXRtcCIsIHNfYXRtcCwgNH0sCi0gIHtOVUxMLCAwLCAwfSwKLX07Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIhLyI7CS8qIEpGIHJlbW92ZWQgJ3wnIGZyb20gY29tbWVudF9jaGFycyAqLwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJwotICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0ICovCi0vKiBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKLSAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LiAqLwotLyogQWxzbyBub3RlIHRoYXQgY29tbWVudHMgbGlrZSB0aGlzIG9uZSB3aWxsIGFsd2F5cyB3b3JrLiAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjLyI7Ci0KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotLyogQWxzbyBiZSBhd2FyZSB0aGF0IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCBtYXkgaGF2ZSB0byBiZQotICAgY2hhbmdlZCBpbiByZWFkLmMgLiAgSWRlYWxseSBpdCBzaG91bGRuJ3QgaGF2ZSB0byBrbm93IGFib3V0IGl0IGF0IGFsbCwKLSAgIGJ1dCBub3RoaW5nIGlzIGlkZWFsIGFyb3VuZCBoZXJlLgotICAgKi8KLWludCBzaXplX3JlbG9jX2luZm8gPSBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pOwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBvY3RhbFsyNTZdOwotI2RlZmluZSBpc29jdGFsKGMpICBvY3RhbFtjXQotc3RhdGljIHVuc2lnbmVkIGNoYXIgdG9IZXhbMjU2XTsKLQotc3RydWN0IGk4NjBfaXQKLSAgewotICAgIGNoYXIgKmVycm9yOwotICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICAgIHN0cnVjdCBubGlzdCAqbmxpc3RwOwotICAgIGV4cHJlc3Npb25TIGV4cDsKLSAgICBpbnQgcGNyZWw7Ci0gICAgZW51bSBleHBhbmRfdHlwZSBleHBhbmQ7Ci0gICAgZW51bSBoaWdobG93X3R5cGUgaGlnaGxvdzsKLSAgICBlbnVtIHJlbG9jX3R5cGUgcmVsb2M7Ci0gIH0gdGhlX2luc247Ci0KLSNpZiBfX1NURENfXyA9PSAxCi0KLXN0YXRpYyB2b2lkIHByaW50X2luc24gKHN0cnVjdCBpODYwX2l0ICppbnNuKTsKLXN0YXRpYyBpbnQgZ2V0RXhwcmVzc2lvbiAoY2hhciAqc3RyKTsKLQotI2Vsc2UgLyogbm90IF9fU1REQ19fICovCi0KLXN0YXRpYyB2b2lkIHByaW50X2luc24gKCk7Ci1zdGF0aWMgaW50IGdldEV4cHJlc3Npb24gKCk7Ci0KLSNlbmRpZiAvKiBub3QgX19TVERDX18gKi8KLQotc3RhdGljIGNoYXIgKmV4cHJfZW5kOwotc3RhdGljIGNoYXIgbGFzdF9leHBhbmQ7CS8qIGVycm9yIGlmIGV4cGFuc2lvbiBhZnRlciBicmFuY2ggKi8KLQotZW51bSBkdWFsCi17Ci0gIERVQUxfT0ZGID0gMCwgRFVBTF9PTiwgRFVBTF9ERE9ULCBEVUFMX09ORERPVCwKLX07Ci1zdGF0aWMgZW51bSBkdWFsIGR1YWxfbW9kZSA9IERVQUxfT0ZGOwkvKiBkdWFsLWluc3RydWN0aW9uIG1vZGUgKi8KLQotc3RhdGljIHZvaWQKLXNfZHVhbCAoKQkJCS8qIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyBoYXZlIGR1YWwgc2V0ICovCi17Ci0gIGR1YWxfbW9kZSA9IERVQUxfT047Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2VuZGR1YWwgKCkJCQkvKiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgaGF2ZSBkdWFsIHNldCAqLwotewotICBkdWFsX21vZGUgPSBEVUFMX09GRjsKLX0KLQotc3RhdGljIGludCBhdG1wID0gMzE7CQkvKiB0ZW1wb3JhcnkgcmVnaXN0ZXIgZm9yIHBzZXVkbydzICovCi0KLXN0YXRpYyB2b2lkCi1zX2F0bXAgKCkKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJzcCIsIDIpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0gICAgICBhdG1wID0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImZwIiwgMikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLSAgICAgIGF0bXAgPSAzOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiciIsIDEpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDE7Ci0gICAgICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAodGVtcCA+PSAwICYmIHRlbXAgPD0gMzEpCi0JYXRtcCA9IHRlbXA7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJVbmtub3duIHRlbXBvcmFyeSBwc2V1ZG8gcmVnaXN0ZXIiKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbmtub3duIHRlbXBvcmFyeSBwc2V1ZG8gcmVnaXN0ZXIiKSk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4gICovCi12b2lkCi1tZF9iZWdpbiAoKQotewotICByZWdpc3RlciBjaGFyICpyZXR2YWwgPSBOVUxMOwotICBpbnQgbG9zZSA9IDA7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpID0gMDsKLQotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgd2hpbGUgKGkgPCBOVU1PUENPREVTKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBpODYwX29wY29kZXNbaV0ubmFtZTsKLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBuYW1lLCAmaTg2MF9vcGNvZGVzW2ldKTsKLSAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIGAlcyc6ICVzXG4iKSwKLQkJICAgaTg2MF9vcGNvZGVzW2ldLm5hbWUsIHJldHZhbCk7Ci0JICBsb3NlID0gMTsKLQl9Ci0gICAgICBkbwotCXsKLQkgIGlmIChpODYwX29wY29kZXNbaV0ubWF0Y2ggJiBpODYwX29wY29kZXNbaV0ubG9zZSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiaW50ZXJuYWwgZXJyb3I6IGxvc2luZyBvcGNvZGU6IGAlcycgXCIlc1wiXG4iKSwKLQkJICAgICAgIGk4NjBfb3Bjb2Rlc1tpXS5uYW1lLCBpODYwX29wY29kZXNbaV0uYXJncyk7Ci0JICAgICAgbG9zZSA9IDE7Ci0JICAgIH0KLQkgICsraTsKLQl9Ci0gICAgICB3aGlsZSAoaSA8IE5VTU9QQ09ERVMKLQkgICAgICYmICFzdHJjbXAgKGk4NjBfb3Bjb2Rlc1tpXS5uYW1lLCBuYW1lKSk7Ci0gICAgfQotCi0gIGlmIChsb3NlKQotICAgIGFzX2ZhdGFsIChfKCJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIpKTsKLQotICBmb3IgKGkgPSAnMCc7IGkgPCAnOCc7ICsraSkKLSAgICBvY3RhbFtpXSA9IDE7Ci0gIGZvciAoaSA9ICcwJzsgaSA8PSAnOSc7ICsraSkKLSAgICB0b0hleFtpXSA9IGkgLSAnMCc7Ci0gIGZvciAoaSA9ICdhJzsgaSA8PSAnZic7ICsraSkKLSAgICB0b0hleFtpXSA9IGkgKyAxMCAtICdhJzsKLSAgZm9yIChpID0gJ0EnOyBpIDw9ICdGJzsgKytpKQotICAgIHRvSGV4W2ldID0gaSArIDEwIC0gJ0EnOwotfQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnRvUDsKLSAgaW50IHJzZDsKLSAgaW50IG5vX29wY29kZXMgPSAxOwotICBpbnQgaTsKLSAgc3RydWN0IGk4NjBfaXQgcHNldWRvWzNdOwotCi0gIGFzc2VydCAoc3RyKTsKLSAgaTg2MF9pcCAoc3RyKTsKLQotICAvKiBjaGVjayBmb3IgZXhwYW5kYWJsZSBmbGFnIHRvIHByb2R1Y2UgcHNldWRvLWluc3RydWN0aW9ucyAqLwotICBpZiAodGhlX2luc24uZXhwYW5kICE9IDAgJiYgdGhlX2luc24uaGlnaGxvdyA9PSBOT19TUEVDKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0JcHNldWRvW2ldID0gdGhlX2luc247Ci0KLSAgICAgIHN3aXRjaCAodGhlX2luc24uZXhwYW5kKQotCXsKLQotCWNhc2UgRV9ERUxBWToKLQkgIG5vX29wY29kZXMgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfTU9WOgotCSAgaWYgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgIHRoZV9pbnNuLmV4cC5YX29wX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPCAoMSA8PCAxNSkgJiYKLQkgICAgICAgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA+PSAtKDEgPDwgMTUpKSkKLQkgICAgYnJlYWs7Ci0JICAvKiBvciBsJWNvbnN0LHIwLGlyZWdfZGVzdCAqLwotCSAgcHNldWRvWzBdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweDAwMWYwMDAwKSB8IDB4ZTQwMDAwMDA7Ci0JICBwc2V1ZG9bMF0uaGlnaGxvdyA9IFBBSVI7Ci0JICAvKiBvcmggaCVjb25zdCxpcmVnX2Rlc3QsaXJlZ19kZXN0ICovCi0JICBwc2V1ZG9bMV0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4MDNmZmZmZmYpIHwgMHhlYzAwMDAwMCB8Ci0JICAgICgodGhlX2luc24ub3Bjb2RlICYgMHgwMDFmMDAwMCkgPDwgNSk7Ci0JICBwc2V1ZG9bMV0uaGlnaGxvdyA9IEhJR0g7Ci0JICBub19vcGNvZGVzID0gMjsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX0FERFI6Ci0JICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgdGhlX2luc24uZXhwLlhfb3Bfc3ltYm9sID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgLyogb3JoIGhhJWFkZHJfZXhwcixyMCxyMzEgKi8KLQkgIHBzZXVkb1swXS5vcGNvZGUgPSAweGVjMDAwMDAwIHwgKGF0bXAgPDwgMTYpOwotCSAgcHNldWRvWzBdLmhpZ2hsb3cgPSBISUdIQURKOwotCSAgcHNldWRvWzBdLnJlbG9jID0gTE9XMDsJLyogbXVzdCBvdmVyd3JpdGUgKi8KLQkgIC8qIGwlYWRkcl9leHByKHIzMSksaXJlZ19kZXN0ICovCi0JICBwc2V1ZG9bMV0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIH4weDAwM2UwMDAwKSB8IChhdG1wIDw8IDIxKTsKLQkgIHBzZXVkb1sxXS5oaWdobG93ID0gUEFJUjsKLQkgIG5vX29wY29kZXMgPSAyOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfVTMyOgkJLyogMm5kIHZlcnNpb24gZW11bGF0ZXMgSW50ZWwgYXMsIG5vdCBkb2MuICovCi0JICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgdGhlX2luc24uZXhwLlhfb3Bfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8ICgxIDw8IDE2KSAmJgotCSAgICAgICB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID49IDApKQotCSAgICBicmVhazsKLQkgIC8qICQob3Bjb2RlKWggaCVjb25zdCxpcmVnX3NyYzIsaXJlZ19kZXN0Ci0JCQkgICBwc2V1ZG9bMF0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4ZjNmZmZmZmYpIHwgMHgwYzAwMDAwMDsgKi8KLQkgIC8qICQob3Bjb2RlKWggaCVjb25zdCxpcmVnX3NyYzIscjMxICovCi0JICBwc2V1ZG9bMF0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4ZjNlMGZmZmYpIHwgMHgwYzAwMDAwMCB8Ci0JICAgIChhdG1wIDw8IDE2KTsKLQkgIHBzZXVkb1swXS5oaWdobG93ID0gSElHSDsKLQkgIC8qICQob3Bjb2RlKSBsJWNvbnN0LGlyZWdfZGVzdCxpcmVnX2Rlc3QKLQkJCSAgIHBzZXVkb1sxXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHhmMDFmMDAwMCkgfCAweDA0MDAwMDAwIHwKLQkJCSAgICgodGhlX2luc24ub3Bjb2RlICYgMHgwMDFmMDAwMCkgPDwgNSk7ICovCi0JICAvKiAkKG9wY29kZSkgbCVjb25zdCxyMzEsaXJlZ19kZXN0ICovCi0JICBwc2V1ZG9bMV0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4ZjAxZjAwMDApIHwgMHgwNDAwMDAwMCB8Ci0JICAgIChhdG1wIDw8IDIxKTsKLQkgIHBzZXVkb1sxXS5oaWdobG93ID0gUEFJUjsKLQkgIG5vX29wY29kZXMgPSAyOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfQU5EOgkJLyogMm5kIHZlcnNpb24gZW11bGF0ZXMgSW50ZWwgYXMsIG5vdCBkb2MuICovCi0JICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgdGhlX2luc24uZXhwLlhfb3Bfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8ICgxIDw8IDE2KSAmJgotCSAgICAgICB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID49IDApKQotCSAgICBicmVhazsKLQkgIC8qIGFuZG5vdCBoJWNvbnN0LGlyZWdfc3JjMixpcmVnX2Rlc3QKLQkJCSAgIHBzZXVkb1swXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHgwM2ZmZmZmZikgfCAweGQ0MDAwMDAwOyAqLwotCSAgLyogYW5kbm90IGglY29uc3QsaXJlZ19zcmMyLHIzMSAqLwotCSAgcHNldWRvWzBdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweDAzZTBmZmZmKSB8IDB4ZDQwMDAwMDAgfAotCSAgICAoYXRtcCA8PCAxNik7Ci0JICBwc2V1ZG9bMF0uaGlnaGxvdyA9IEhJR0g7Ci0JICBwc2V1ZG9bMF0uZXhwLlhfYWRkX251bWJlciA9IC0xIC0gdGhlX2luc24uZXhwLlhfYWRkX251bWJlcjsKLQkgIC8qIGFuZG5vdCBsJWNvbnN0LGlyZWdfZGVzdCxpcmVnX2Rlc3QKLQkJCSAgIHBzZXVkb1sxXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHgwMDFmMDAwMCkgfCAweGQ0MDAwMDAwIHwKLQkJCSAgICgodGhlX2luc24ub3Bjb2RlICYgMHgwMDFmMDAwMCkgPDwgNSk7ICovCi0JICAvKiBhbmRub3QgbCVjb25zdCxyMzEsaXJlZ19kZXN0ICovCi0JICBwc2V1ZG9bMV0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4MDAxZjAwMDApIHwgMHhkNDAwMDAwMCB8Ci0JICAgIChhdG1wIDw8IDIxKTsKLQkgIHBzZXVkb1sxXS5oaWdobG93ID0gUEFJUjsKLQkgIHBzZXVkb1sxXS5leHAuWF9hZGRfbnVtYmVyID0gLTEgLSB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyOwotCSAgbm9fb3Bjb2RlcyA9IDI7Ci0JICBicmVhazsKLQotCWNhc2UgRV9TMzI6Ci0JICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgdGhlX2luc24uZXhwLlhfb3Bfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8ICgxIDw8IDE1KSAmJgotCSAgICAgICB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID49IC0oMSA8PCAxNSkpKQotCSAgICBicmVhazsKLQkgIC8qIG9yaCBoJWNvbnN0LHIwLHIzMSAqLwotCSAgcHNldWRvWzBdLm9wY29kZSA9IDB4ZWMwMDAwMDAgfCAoYXRtcCA8PCAxNik7Ci0JICBwc2V1ZG9bMF0uaGlnaGxvdyA9IEhJR0g7Ci0JICAvKiBvciBsJWNvbnN0LHIzMSxyMzEgKi8KLQkgIHBzZXVkb1sxXS5vcGNvZGUgPSAweGU0MDAwMDAwIHwgKGF0bXAgPDwgMjEpIHwgKGF0bXAgPDwgMTYpOwotCSAgcHNldWRvWzFdLmhpZ2hsb3cgPSBQQUlSOwotCSAgLyogcjMxLGlyZWdfc3JjMixpcmVnX2Rlc3QgKi8KLQkgIHBzZXVkb1syXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgfjB4MDQwMGZmZmYpIHwgKGF0bXAgPDwgMTEpOwotCSAgcHNldWRvWzJdLnJlbG9jID0gTk9fUkVMT0M7Ci0JICBub19vcGNvZGVzID0gMzsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKLQl9Ci0KLSAgICAgIHRoZV9pbnNuID0gcHNldWRvWzBdOwotICAgICAgLyogY2hlY2sgZm9yIGV4cGFuZGVkIG9wY29kZSBhZnRlciBicmFuY2ggb3IgaW4gZHVhbCAqLwotICAgICAgaWYgKG5vX29wY29kZXMgPiAxICYmIGxhc3RfZXhwYW5kID09IDEpCi0JYXNfd2FybiAoXygiRXhwYW5kZWQgb3Bjb2RlIGFmdGVyIGRlbGF5ZWQgYnJhbmNoOiBgJXMnIiksIHN0cik7Ci0gICAgICBpZiAobm9fb3Bjb2RlcyA+IDEgJiYgZHVhbF9tb2RlICE9IERVQUxfT0ZGKQotCWFzX3dhcm4gKF8oIkV4cGFuZGVkIG9wY29kZSBpbiBkdWFsIG1vZGU6IGAlcyciKSwgc3RyKTsKLSAgICB9Ci0KLSAgaSA9IDA7Ci0gIGRvCi0gICAgewkJCQkvKiBhbHdheXMgcHJvZHVjZSBhdCBsZWFzdCBvbmUgb3Bjb2RlICovCi0gICAgICB0b1AgPSBmcmFnX21vcmUgKDQpOwotICAgICAgLyogcHV0IG91dCB0aGUgb3Bjb2RlICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvUCwgdGhlX2luc24ub3Bjb2RlLCA0KTsKLQotICAgICAgLyogY2hlY2sgZm9yIGV4cGFuZGVkIG9wY29kZSBhZnRlciBicmFuY2ggb3IgaW4gZHVhbCAqLwotICAgICAgbGFzdF9leHBhbmQgPSB0aGVfaW5zbi5wY3JlbDsKLQotICAgICAgLyogcHV0IG91dCB0aGUgc3ltYm9sLWRlcGVuZGVudCBzdHVmZiAqLwotICAgICAgaWYgKHRoZV9pbnNuLnJlbG9jICE9IE5PX1JFTE9DKQotCXsKLQkgIGZpeF9uZXcgKGZyYWdfbm93LAkvKiB3aGljaCBmcmFnICovCi0JCSAgICh0b1AgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCksCS8qIHdoZXJlICovCi0JCSAgIDQsCQkvKiBzaXplICovCi0JCSAgICZ0aGVfaW5zbi5leHAsCi0JCSAgIHRoZV9pbnNuLnBjcmVsLAotCSAgLyogbWVyZ2UgYml0IGZpZWxkcyBpbnRvIG9uZSBhcmd1bWVudCAqLwotCSAgKGludCkgKCgodGhlX2luc24uaGlnaGxvdyAmIDB4MykgPDwgNCkgfCAodGhlX2luc24ucmVsb2MgJiAweGYpKSk7Ci0JfQotICAgICAgdGhlX2luc24gPSBwc2V1ZG9bKytpXTsKLSAgICB9Ci0gIHdoaWxlICgtLW5vX29wY29kZXMgPiAwKTsKLQotfQotCi1zdGF0aWMgdm9pZAotaTg2MF9pcCAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnM7Ci0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIGNoYXIgYzsKLSAgdW5zaWduZWQgbG9uZyBpOwotICBzdHJ1Y3QgaTg2MF9vcGNvZGUgKmluc247Ci0gIGNoYXIgKmFyZ3NTdGFydDsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIHVuc2lnbmVkIGludCBtYXNrOwotICBpbnQgbWF0Y2ggPSAwOwotICBpbnQgY29tbWEgPSAwOwotCi0KLSAgZm9yIChzID0gc3RyOyBpc2xvd2VyICgqcykgfHwgKnMgPT0gJy4nIHx8ICpzID09ICczJzsgKytzKQotICAgIDsKLSAgc3dpdGNoICgqcykKLSAgICB7Ci0KLSAgICBjYXNlICdcMCc6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJywnOgotICAgICAgY29tbWEgPSAxOwotCi0gICAgICAvKkZBTExUSFJPVUdIKi8KLQotICAgIGNhc2UgJyAnOgotICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiVW5rbm93biBvcGNvZGU6IGAlcyciKSwgc3RyKTsKLSAgICB9Ci0KLSAgaWYgKHN0cm5jbXAgKHN0ciwgImQuIiwgMikgPT0gMCkKLSAgICB7CQkJCS8qIGNoZWNrIGZvciBkLiBvcGNvZGUgcHJlZml4ICovCi0gICAgICBpZiAoZHVhbF9tb2RlID09IERVQUxfT04pCi0JZHVhbF9tb2RlID0gRFVBTF9PTkRET1Q7Ci0gICAgICBlbHNlCi0JZHVhbF9tb2RlID0gRFVBTF9ERE9UOwotICAgICAgc3RyICs9IDI7Ci0gICAgfQotCi0gIGlmICgoaW5zbiA9IChzdHJ1Y3QgaTg2MF9vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBzdHIpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChkdWFsX21vZGUgPT0gRFVBTF9ERE9UIHx8IGR1YWxfbW9kZSA9PSBEVUFMX09ORERPVCkKLQlzdHIgLT0gMjsKLSAgICAgIGFzX2JhZCAoXygiVW5rbm93biBvcGNvZGU6IGAlcyciKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChjb21tYSkKLSAgICB7Ci0gICAgICAqLS1zID0gJywnOwotICAgIH0KLSAgYXJnc1N0YXJ0ID0gczsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBvcGNvZGUgPSBpbnNuLT5tYXRjaDsKLSAgICAgIG1lbXNldCAoJnRoZV9pbnNuLCAnXDAnLCBzaXplb2YgKHRoZV9pbnNuKSk7Ci0gICAgICB0aGVfaW5zbi5yZWxvYyA9IE5PX1JFTE9DOwotCi0gICAgICAvKgotCQkgKiBCdWlsZCB0aGUgb3Bjb2RlLCBjaGVja2luZyBhcyB3ZSBnbyB0byBtYWtlCi0JCSAqIHN1cmUgdGhhdCB0aGUgb3BlcmFuZHMgbWF0Y2gKLQkJICovCi0gICAgICBmb3IgKGFyZ3MgPSBpbnNuLT5hcmdzOzsgKythcmdzKQotCXsKLQkgIHN3aXRjaCAoKmFyZ3MpCi0JICAgIHsKLQotCSAgICBjYXNlICdcMCc6CQkvKiBlbmQgb2YgYXJncyAqLwotCSAgICAgIGlmICgqcyA9PSAnXDAnKQotCQl7Ci0JCSAgbWF0Y2ggPSAxOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnKyc6Ci0JICAgIGNhc2UgJygnOgkJLyogdGhlc2UgbXVzdCBtYXRjaCBleGFjdGx5ICovCi0JICAgIGNhc2UgJyknOgotCSAgICBjYXNlICcsJzoKLQkgICAgY2FzZSAnICc6Ci0JICAgICAgaWYgKCpzKysgPT0gKmFyZ3MpCi0JCWNvbnRpbnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJyMnOgkJLyogbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgKi8KLQkgICAgICBpZiAoaXNkaWdpdCAoKnMrKykpCi0JCXsKLQkJICB3aGlsZSAoaXNkaWdpdCAoKnMpKQotCQkgICAgewotCQkgICAgICArK3M7Ci0JCSAgICB9Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcxJzoJCS8qIG5leHQgb3BlcmFuZCBtdXN0IGJlIGEgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnMic6Ci0JICAgIGNhc2UgJ2QnOgotCSAgICAgIHN3aXRjaCAoKnMpCi0JCXsKLQotCQljYXNlICdmJzoJLyogZnJhbWUgcG9pbnRlciAqLwotCQkgIHMrKzsKLQkJICBpZiAoKnMrKyA9PSAncCcpCi0JCSAgICB7Ci0JCSAgICAgIG1hc2sgPSAweDM7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGdvdG8gZXJyb3I7Ci0KLQkJY2FzZSAncyc6CS8qIHN0YWNrIHBvaW50ZXIgKi8KLQkJICBzKys7Ci0JCSAgaWYgKCpzKysgPT0gJ3AnKQotCQkgICAgewotCQkgICAgICBtYXNrID0gMHgyOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBnb3RvIGVycm9yOwotCi0JCWNhc2UgJ3InOgkvKiBhbnkgcmVnaXN0ZXIgKi8KLQkJICBzKys7Ci0JCSAgaWYgKCFpc2RpZ2l0IChjID0gKnMrKykpCi0JCSAgICB7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0JCSAgaWYgKGlzZGlnaXQgKCpzKSkKLQkJICAgIHsKLQkJICAgICAgaWYgKChjID0gMTAgKiAoYyAtICcwJykgKyAoKnMrKyAtICcwJykpID49IDMyKQotCQkJewotCQkJICBnb3RvIGVycm9yOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYyAtPSAnMCc7Ci0JCSAgICB9Ci0JCSAgbWFzayA9IGM7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoJLyogbm90IHRoaXMgb3Bjb2RlICovCi0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgIC8qCi0JCQkJICogR290IHRoZSByZWdpc3Rlciwgbm93IGZpZ3VyZSBvdXQgd2hlcmUKLQkJCQkgKiBpdCBnb2VzIGluIHRoZSBvcGNvZGUuCi0JCQkJICovCi0JICAgICAgc3dpdGNoICgqYXJncykKLQkJewotCi0JCWNhc2UgJzEnOgotCQkgIG9wY29kZSB8PSBtYXNrIDw8IDExOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJzInOgotCQkgIG9wY29kZSB8PSBtYXNrIDw8IDIxOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ2QnOgotCQkgIG9wY29kZSB8PSBtYXNrIDw8IDE2OwotCQkgIGNvbnRpbnVlOwotCi0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdlJzoJCS8qIG5leHQgb3BlcmFuZCBpcyBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ2YnOgotCSAgICBjYXNlICdnJzoKLQkgICAgICBpZiAoKnMrKyA9PSAnZicgJiYgaXNkaWdpdCAoKnMpKQotCQl7Ci0JCSAgbWFzayA9ICpzKys7Ci0JCSAgaWYgKGlzZGlnaXQgKCpzKSkKLQkJICAgIHsKLQkJICAgICAgbWFzayA9IDEwICogKG1hc2sgLSAnMCcpICsgKCpzKysgLSAnMCcpOwotCQkgICAgICBpZiAobWFzayA+PSAzMikKLQkJCXsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBtYXNrIC09ICcwJzsKLQkJICAgIH0KLQkJICBzd2l0Y2ggKCphcmdzKQotCQkgICAgewotCi0JCSAgICBjYXNlICdlJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMTE7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICdmJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMjE7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICdnJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMTY7Ci0JCSAgICAgIGlmIChkdWFsX21vZGUgIT0gRFVBTF9PRkYpCi0JCQlvcGNvZGUgfD0gKDEgPDwgOSk7CS8qIGR1YWwgbW9kZSBpbnN0cnVjdGlvbiAqLwotCQkgICAgICBpZiAoZHVhbF9tb2RlID09IERVQUxfRERPVCkKLQkJCWR1YWxfbW9kZSA9IERVQUxfT0ZGOwotCQkgICAgICBpZiAoZHVhbF9tb2RlID09IERVQUxfT05ERE9UKQotCQkJZHVhbF9tb2RlID0gRFVBTF9PTjsKLQkJICAgICAgaWYgKChvcGNvZGUgJiAoMSA8PCAxMCkpICYmIChtYXNrID09ICgob3Bjb2RlID4+IDExKSAmIDB4MWYpKSkKLQkJCWFzX3dhcm4gKF8oIkZzcjEgZXF1YWxzIGZkZXN0IHdpdGggUGlwZWxpbmluZyIpKTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdjJzoJCS8qIG5leHQgb3BlcmFuZCBtdXN0IGJlIGEgY29udHJvbCByZWdpc3RlciAqLwotCSAgICAgIGlmIChzdHJuY21wIChzLCAiZmlyIiwgMykgPT0gMCkKLQkJewotCQkgIG9wY29kZSB8PSAweDAgPDwgMjE7Ci0JCSAgcyArPSAzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICJwc3IiLCAzKSA9PSAwKQotCQl7Ci0JCSAgb3Bjb2RlIHw9IDB4MSA8PCAyMTsKLQkJICBzICs9IDM7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBpZiAoc3RybmNtcCAocywgImRpcmJhc2UiLCA3KSA9PSAwKQotCQl7Ci0JCSAgb3Bjb2RlIHw9IDB4MiA8PCAyMTsKLQkJICBzICs9IDc7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBpZiAoc3RybmNtcCAocywgImRiIiwgMikgPT0gMCkKLQkJewotCQkgIG9wY29kZSB8PSAweDMgPDwgMjE7Ci0JCSAgcyArPSAyOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICJmc3IiLCAzKSA9PSAwKQotCQl7Ci0JCSAgb3Bjb2RlIHw9IDB4NCA8PCAyMTsKLQkJICBzICs9IDM7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBpZiAoc3RybmNtcCAocywgImVwc3IiLCA0KSA9PSAwKQotCQl7Ci0JCSAgb3Bjb2RlIHw9IDB4NSA8PCAyMTsKLQkJICBzICs9IDQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc1JzoJCS8qIDUgYml0IGltbWVkaWF0ZSBpbiBzcmMxICovCi0JICAgICAgbWVtc2V0ICgmdGhlX2luc24sICdcMCcsIHNpemVvZiAodGhlX2luc24pKTsKLQkgICAgICBpZiAoIWdldEV4cHJlc3Npb24gKHMpKQotCQl7Ci0JCSAgcyA9IGV4cHJfZW5kOwotCQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyICYgfjB4MWYpCi0JCSAgICBhc19iYWQgKF8oIjUtYml0IGltbWVkaWF0ZSB0b28gbGFyZ2UiKSk7Ci0JCSAgb3Bjb2RlIHw9ICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyICYgMHgxZikgPDwgMTE7Ci0JCSAgbWVtc2V0ICgmdGhlX2luc24sICdcMCcsIHNpemVvZiAodGhlX2luc24pKTsKLQkJICB0aGVfaW5zbi5yZWxvYyA9IE5PX1JFTE9DOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnbCc6CQkvKiAyNiBiaXQgaW1tZWRpYXRlLCByZWxhdGl2ZSBicmFuY2ggKi8KLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJSQUREUjsKLQkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7Ci0JICAgICAgZ290byBpbW1lZGlhdGU7Ci0KLQkgICAgY2FzZSAncyc6CQkvKiAxNiBiaXQgaW1tZWRpYXRlLCBzcGxpdCByZWxhdGl2ZSBicmFuY2ggKi8KLQkgICAgICAvKiB1cHBlciA1IGJpdHMgb2Ygb2Zmc2V0IGluIGRlc3QgZmllbGQgKi8KLQkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7Ci0JICAgICAgdGhlX2luc24ucmVsb2MgPSBTUExJVDA7Ci0JICAgICAgZ290byBpbW1lZGlhdGU7Ci0KLQkgICAgY2FzZSAnUyc6CQkvKiAxNiBiaXQgaW1tZWRpYXRlLCBzcGxpdCAoc3QpLCBhbGlnbmVkICovCi0JICAgICAgaWYgKG9wY29kZSAmICgxIDw8IDI4KSkKLQkJaWYgKG9wY29kZSAmIDB4MSkKLQkJICB0aGVfaW5zbi5yZWxvYyA9IFNQTElUMjsKLQkJZWxzZQotCQkgIHRoZV9pbnNuLnJlbG9jID0gU1BMSVQxOwotCSAgICAgIGVsc2UKLQkJdGhlX2luc24ucmVsb2MgPSBTUExJVDA7Ci0JICAgICAgZ290byBpbW1lZGlhdGU7Ci0KLQkgICAgY2FzZSAnSSc6CQkvKiAxNiBiaXQgaW1tZWRpYXRlLCBhbGlnbmVkICovCi0JICAgICAgaWYgKG9wY29kZSAmICgxIDw8IDI4KSkKLQkJaWYgKG9wY29kZSAmIDB4MSkKLQkJICB0aGVfaW5zbi5yZWxvYyA9IExPVzI7Ci0JCWVsc2UKLQkJICB0aGVfaW5zbi5yZWxvYyA9IExPVzE7Ci0JICAgICAgZWxzZQotCQl0aGVfaW5zbi5yZWxvYyA9IExPVzA7Ci0JICAgICAgZ290byBpbW1lZGlhdGU7Ci0KLQkgICAgY2FzZSAnaSc6CQkvKiAxNiBiaXQgaW1tZWRpYXRlICovCi0JICAgICAgdGhlX2luc24ucmVsb2MgPSBMT1cwOwotCi0JICAgICAgLypGQUxMVEhST1VHSCovCi0KLQkgICAgaW1tZWRpYXRlOgotCSAgICAgIGlmICgqcyA9PSAnICcpCi0JCXMrKzsKLQkgICAgICBpZiAoc3RybmNtcCAocywgImhhJSIsIDMpID09IDApCi0JCXsKLQkJICB0aGVfaW5zbi5oaWdobG93ID0gSElHSEFESjsKLQkJICBzICs9IDM7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJuY21wIChzLCAiaCUiLCAyKSA9PSAwKQotCQl7Ci0JCSAgdGhlX2luc24uaGlnaGxvdyA9IEhJR0g7Ci0JCSAgcyArPSAyOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywgImwlIiwgMikgPT0gMCkKLQkJewotCQkgIHRoZV9pbnNuLmhpZ2hsb3cgPSBQQUlSOwotCQkgIHMgKz0gMjsKLQkJfQotCSAgICAgIHRoZV9pbnNuLmV4cGFuZCA9IGluc24tPmV4cGFuZDsKLQotCSAgICAgIC8qIE5vdGUgdGhhdCBpZiB0aGUgZ2V0RXhwcmVzc2lvbigpIGZhaWxzLCB3ZSB3aWxsIHN0aWxsIGhhdmUKLQkJCQkgICBjcmVhdGVkIFUgZW50cmllcyBpbiB0aGUgc3ltYm9sIHRhYmxlIGZvciB0aGUgJ3N5bWJvbHMnCi0JCQkJICAgaW4gdGhlIGlucHV0IHN0cmluZy4gIFRyeSBub3QgdG8gY3JlYXRlIFUgc3ltYm9scyBmb3IKLQkJCQkgICByZWdpc3RlcnMsIGV0Yy4gKi8KLQotCSAgICAgIGlmICghZ2V0RXhwcmVzc2lvbiAocykpCi0JCXsKLQkJICBzID0gZXhwcl9lbmQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgIGVycm9yOgotICAgICAgaWYgKG1hdGNoID09IDApCi0JewotCSAgLyogQXJncyBkb24ndCBtYXRjaC4gICovCi0JICBpZiAoJmluc25bMV0gLSBpODYwX29wY29kZXMgPCBOVU1PUENPREVTCi0JICAgICAgJiYgIXN0cmNtcCAoaW5zbi0+bmFtZSwgaW5zblsxXS5uYW1lKSkKLQkgICAgewotCSAgICAgICsraW5zbjsKLQkgICAgICBzID0gYXJnc1N0YXJ0OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIklsbGVnYWwgb3BlcmFuZHMiKSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHRoZV9pbnNuLm9wY29kZSA9IG9wY29kZTsKLX0KLQotc3RhdGljIGludAotZ2V0RXhwcmVzc2lvbiAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnNhdmVfaW47Ci0gIHNlZ1Qgc2VnOwotCi0gIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLSAgc2VnID0gZXhwcmVzc2lvbiAoJnRoZV9pbnNuLmV4cCk7Ci0gIGlmIChzZWcgIT0gYWJzb2x1dGVfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IHVuZGVmaW5lZF9zZWN0aW9uCi0gICAgICAmJiAhIFNFR19OT1JNQUwgKHNlZykpCi0gICAgewotICAgICAgdGhlX2luc24uZXJyb3IgPSBfKCJiYWQgc2VnbWVudCIpOwotICAgICAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAgVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIG1kX2F0b2YgaW4gbTY4ay5jLiAgSSB0aGluayB0aGlzIGlzIHJpZ2h0LAotICBidXQgSSdtIG5vdCBzdXJlLgotCi0gIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gICovCi0KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLSAgY2hhciAqYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBXcml0ZSBvdXQgYmlnLWVuZGlhbi4KLSAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotCi12b2lkCi1tZF9udW1iZXJfdG9faW1tIChidWYsIHZhbCwgbiwgZml4UCkKLSAgICAgY2hhciAqYnVmOwotICAgICBsb25nIHZhbDsKLSAgICAgaW50IG47Ci0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGVudW0gcmVsb2NfdHlwZSByZWxvYyA9IGZpeFAtPmZ4X3JfdHlwZSAmIDB4ZjsKLSAgZW51bSBoaWdobG93X3R5cGUgaGlnaGxvdyA9IChmaXhQLT5meF9yX3R5cGUgPj4gNCkgJiAweDM7Ci0KLSAgYXNzZXJ0IChidWYpOwotICBhc3NlcnQgKG4gPT0gNCk7CQkvKiBhbHdheXMgb24gaTg2MCAqLwotCi0gIHN3aXRjaCAoaGlnaGxvdykKLSAgICB7Ci0KLSAgICBjYXNlIEhJR0hBREo6CQkvKiBhZGp1c3RzIHRoZSBoaWdoLW9yZGVyIDE2LWJpdHMgKi8KLSAgICAgIGlmICh2YWwgJiAoMSA8PCAxNSkpCi0JdmFsICs9ICgxIDw8IDE2KTsKLQotICAgICAgLypGQUxMVEhST1VHSCovCi0KLSAgICBjYXNlIEhJR0g6CQkJLyogc2VsZWN0cyB0aGUgaGlnaC1vcmRlciAxNi1iaXRzICovCi0gICAgICB2YWwgPj49IDE2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBBSVI6CQkJLyogc2VsZWN0cyB0aGUgbG93LW9yZGVyIDE2LWJpdHMgKi8KLSAgICAgIHZhbCA9IHZhbCAmIDB4ZmZmZjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBzd2l0Y2ggKHJlbG9jKQotICAgIHsKLQotICAgIGNhc2UgQlJBRERSOgkJLyogYnIsY2FsbCxiYyxiYy50LGJuYyxibmMudCB3LzI2LWJpdCBpbW1lZGlhdGUgKi8KLSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCAhPSAxKQotCWFzX2JhZCAoXygiMjYtYml0IGJyYW5jaCB3L28gcGMgcmVsYXRpdmUgc2V0OiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIHZhbCA+Pj0gMjsJCS8qIGFsaWduIHBjcmVsIG9mZnNldCwgc2VlIG1hbnVhbCAqLwotCi0gICAgICBpZiAodmFsID49ICgxIDw8IDI1KSB8fCB2YWwgPCAtKDEgPDwgMjUpKQkvKiBjaGVjayBmb3Igb3ZlcmZsb3cgKi8KLQlhc19iYWQgKF8oIjI2LWJpdCBicmFuY2ggb2Zmc2V0IG92ZXJmbG93OiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIGJ1ZlswXSA9IChidWZbMF0gJiAweGZjKSB8ICgodmFsID4+IDI0KSAmIDB4Myk7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMTY7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTUExJVDI6CQkvKiAxNiBiaXQgaW1tZWRpYXRlLCA0LWJ5dGUgYWxpZ25lZCAqLwotICAgICAgaWYgKHZhbCAmIDB4MykKLQlhc19iYWQgKF8oIjE2LWJpdCBpbW1lZGlhdGUgNC1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IiksIHZhbCk7Ci0gICAgICB2YWwgJj0gfjB4MzsJCS8qIDQtYnl0ZSBhbGlnbiB2YWx1ZSAqLwotICAgICAgLypGQUxMVEhST1VHSCovCi0gICAgY2FzZSBTUExJVDE6CQkvKiAxNiBiaXQgaW1tZWRpYXRlLCAyLWJ5dGUgYWxpZ25lZCAqLwotICAgICAgaWYgKHZhbCAmIDB4MSkKLQlhc19iYWQgKF8oIjE2LWJpdCBpbW1lZGlhdGUgMi1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IiksIHZhbCk7Ci0gICAgICB2YWwgJj0gfjB4MTsJCS8qIDItYnl0ZSBhbGlnbiB2YWx1ZSAqLwotICAgICAgLypGQUxMVEhST1VHSCovCi0gICAgY2FzZSBTUExJVDA6CQkvKiBzdCxibGEsYnRlLGJ0bmUgdy8xNi1iaXQgaW1tZWRpYXRlICovCi0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMSkKLQl2YWwgPj49IDI7CQkvKiBhbGlnbiBwY3JlbCBvZmZzZXQsIHNlZSBtYW51YWwgKi8KLSAgICAgIC8qIGNoZWNrIGZvciBib3VuZHMgKi8KLSAgICAgIGlmIChoaWdobG93ICE9IFBBSVIgJiYgKHZhbCA+PSAoMSA8PCAxNikgfHwgdmFsIDwgLSgxIDw8IDE1KSkpCi0JYXNfYmFkIChfKCIxNi1iaXQgYnJhbmNoIG9mZnNldCBvdmVyZmxvdzogMHglMDh4IiksIHZhbCk7Ci0gICAgICBidWZbMV0gPSAoYnVmWzFdICYgfjB4MWYpIHwgKCh2YWwgPj4gMTEpICYgMHgxZik7Ci0gICAgICBidWZbMl0gPSAoYnVmWzJdICYgfjB4NykgfCAoKHZhbCA+PiA4KSAmIDB4Nyk7Ci0gICAgICBidWZbM10gfD0gdmFsOwkJLyogcGVyc2VydmUgYm90dG9tIG9wY29kZSBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgTE9XNDoJCQkvKiBmbGQscGZsZCxwc3QsZmx1c2ggMTYtYnl0ZSBhbGlnbmVkICovCi0gICAgICBpZiAodmFsICYgMHhmKQotCWFzX2JhZCAoXygiMTYtYml0IGltbWVkaWF0ZSAxNi1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IiksIHZhbCk7Ci0gICAgICB2YWwgJj0gfjB4ZjsJCS8qIDE2LWJ5dGUgYWxpZ24gdmFsdWUgKi8KLSAgICAgIC8qRkFMTFRIUk9VR0gqLwotICAgIGNhc2UgTE9XMzoJCQkvKiBmbGQscGZsZCxwc3QsZmx1c2ggOC1ieXRlIGFsaWduZWQgKi8KLSAgICAgIGlmICh2YWwgJiAweDcpCi0JYXNfYmFkIChfKCIxNi1iaXQgaW1tZWRpYXRlIDgtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgdmFsICY9IH4weDc7CQkvKiA4LWJ5dGUgYWxpZ24gdmFsdWUgKi8KLSAgICAgIC8qRkFMTFRIUk9VR0gqLwotICAgIGNhc2UgTE9XMjoJCQkvKiAxNiBiaXQgaW1tZWRpYXRlLCA0LWJ5dGUgYWxpZ25lZCAqLwotICAgICAgaWYgKHZhbCAmIDB4MykKLQlhc19iYWQgKF8oIjE2LWJpdCBpbW1lZGlhdGUgNC1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IiksIHZhbCk7Ci0gICAgICB2YWwgJj0gfjB4MzsJCS8qIDQtYnl0ZSBhbGlnbiB2YWx1ZSAqLwotICAgICAgLypGQUxMVEhST1VHSCovCi0gICAgY2FzZSBMT1cxOgkJCS8qIDE2IGJpdCBpbW1lZGlhdGUsIDItYnl0ZSBhbGlnbmVkICovCi0gICAgICBpZiAodmFsICYgMHgxKQotCWFzX2JhZCAoXygiMTYtYml0IGltbWVkaWF0ZSAyLWJ5dGUgYWxpZ25tZW50IGVycm9yOiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIHZhbCAmPSB+MHgxOwkJLyogMi1ieXRlIGFsaWduIHZhbHVlICovCi0gICAgICAvKkZBTExUSFJPVUdIKi8KLSAgICBjYXNlIExPVzA6CQkJLyogMTYgYml0IGltbWVkaWF0ZSwgYnl0ZSBhbGlnbmVkICovCi0gICAgICAvKiBjaGVjayBmb3IgYm91bmRzICovCi0gICAgICBpZiAoaGlnaGxvdyAhPSBQQUlSICYmICh2YWwgPj0gKDEgPDwgMTYpIHx8IHZhbCA8IC0oMSA8PCAxNSkpKQotCWFzX2JhZCAoXygiMTYtYml0IGltbWVkaWF0ZSBvdmVyZmxvdzogMHglMDh4IiksIHZhbCk7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlszXSB8PSB2YWw7CQkvKiBwZXJzZXJ2ZSBib3R0b20gb3Bjb2RlIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOT19SRUxPQzoKLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJiYWQgcmVsb2NhdGlvbiB0eXBlOiAweCUwMngiKSwgcmVsb2MpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciBpODYwICovCi12b2lkCi1tZF9udW1iZXJfdG9fZGlzcCAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGFzX2ZhdGFsIChfKCJtZF9udW1iZXJfdG9fZGlzcFxuIikpOwotfQotCi0vKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciBpODYwICovCi12b2lkCi1tZF9udW1iZXJfdG9fZmllbGQgKGJ1ZiwgdmFsLCBmaXgpCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgbG9uZyB2YWw7Ci0gICAgIHZvaWQgKmZpeDsKLXsKLSAgYXNfZmF0YWwgKF8oImk4NjBfbnVtYmVyX3RvX2ZpZWxkXG4iKSk7Ci19Ci0KLS8qIHRoZSBiaXQtZmllbGQgZW50cmllcyBpbiB0aGUgcmVsb2NhdGlvbl9pbmZvIHN0cnVjdCBwbGF5cyBoZWxsCi0gICB3aXRoIHRoZSBieXRlLW9yZGVyIHByb2JsZW1zIG9mIGNyb3NzLWFzc2VtYmx5LiAgU28gYXMgYSBoYWNrLAotICAgSSBhZGRlZCB0aGlzIG1hY2guIGRlcGVuZGVudCByaSB0d2lkZGxlci4gIFVnbHksIGJ1dCBpdCBnZXRzCi0gICB5b3UgdGhlcmUuIC1LV0sgKi8KLS8qIG9uIGk4NjA6IGZpcnN0IDQgYnl0ZXMgYXJlIG5vcm1hbCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIG5leHQgdGhyZWUKLSAgIGJ5dGVzIGFyZSBpbmRleCwgbW9zdCBzaWcuIGJ5dGUgZmlyc3QuICBCeXRlIDcgaXMgYnJva2VuIHVwIHdpdGgKLSAgIGJpdCA3IGFzIHBjcmVsLCBiaXQgNiBhcyBleHRlcm4sIGFuZCB0aGUgbG93ZXIgc2l4IGJpdHMgYXMKLSAgIHJlbG9jYXRpb24gdHlwZSAoaGlnaGxvdyA1LTQpLiAgTmV4dCA0IGJ5dGVzIGFyZSBsb25nIGFkZGVuZC4gKi8KLS8qIFRoYW54IGFuZCBhIHRpcCBvZiB0aGUgaGF0IHRvIE1pY2hhZWwgQmxvb20sIG1iQHR0aWRjYS50dGkuY29tICovCi12b2lkCi1tZF9yaV90b19jaGFycyAocmlfcCwgcmkpCi0gICAgIHN0cnVjdCByZWxvY2F0aW9uX2luZm8gKnJpX3AsIHJpOwotewotI2lmIDAKLSAgdW5zaWduZWQgY2hhciB0aGVfYnl0ZXNbc2l6ZW9mICgqcmlfcCldOwotCi0gIC8qIHRoaXMgaXMgZWFzeSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHRoZV9ieXRlcywgcmkucl9hZGRyZXNzLCBzaXplb2YgKHJpLnJfYWRkcmVzcykpOwotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICB0aGVfYnl0ZXNbNF0gPSAocmkucl9pbmRleCA+PiAxNikgJiAweDBmZjsKLSAgdGhlX2J5dGVzWzVdID0gKHJpLnJfaW5kZXggPj4gOCkgJiAweDBmZjsKLSAgdGhlX2J5dGVzWzZdID0gcmkucl9pbmRleCAmIDB4MGZmOwotICB0aGVfYnl0ZXNbN10gPSAoKHJpLnJfZXh0ZXJuIDw8IDcpICYgMHg4MCkgfCAoMCAmIDB4NjApIHwgKHJpLnJfdHlwZSAmIDB4MUYpOwotICAvKiBBbHNvIGVhc3kgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgmdGhlX2J5dGVzWzhdLCByaS5yX2FkZGVuZCwgc2l6ZW9mIChyaS5yX2FkZGVuZCkpOwotICAvKiBub3cgcHV0IGl0IGJhY2sgd2hlcmUgeW91IGZvdW5kIGl0LCBKdW5pb3IuLi4gKi8KLSAgbWVtY3B5ICgoY2hhciAqKSByaV9wLCB0aGVfYnl0ZXMsIHNpemVvZiAoKnJpX3ApKTsKLSNlbmRpZgotfQotCi0vKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciBpODYwICovCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotewotICBhc19mYXRhbCAoXygiaTg2MF9jb252ZXJ0X2ZyYWdcbiIpKTsKLX0KLQotLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmb3IgaTg2MCAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWd0eXBlOwotewotICBhc19mYXRhbCAoXygiaTg2MF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheFxuIikpOwotfQotCi0vKiBmb3IgZGVidWdnaW5nIG9ubHksIG11c3QgbWF0Y2ggZW51bSByZWxvY190eXBlICovCi1zdGF0aWMgY2hhciAqUmVsb2NbXSA9Ci17Ci0gICJOT19SRUxPQyIsCi0gICJCUkFERFIiLAotICAiTE9XMCIsCi0gICJMT1cxIiwKLSAgIkxPVzIiLAotICAiTE9XMyIsCi0gICJMT1c0IiwKLSAgIlNQTElUMCIsCi0gICJTUExJVDEiLAotICAiU1BMSVQyIiwKLSAgIlJFTE9DXzMyIiwKLX07Ci1zdGF0aWMgY2hhciAqSGlnaGxvd1tdID0KLXsKLSAgIk5PX1NQRUMiLAotICAiUEFJUiIsCi0gICJISUdIIiwKLSAgIkhJR0hBREoiLAotfTsKLXN0YXRpYyB2b2lkCi1wcmludF9pbnNuIChpbnNuKQotICAgICBzdHJ1Y3QgaTg2MF9pdCAqaW5zbjsKLXsKLSAgaWYgKGluc24tPmVycm9yKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiAlc1xuIik7Ci0gICAgfQotICBmcHJpbnRmIChzdGRlcnIsICJvcGNvZGU9MHglMDh4XHQiLCBpbnNuLT5vcGNvZGUpOwotICBmcHJpbnRmIChzdGRlcnIsICJleHBhbmQ9MHglMDh4XHQiLCBpbnNuLT5leHBhbmQpOwotICBmcHJpbnRmIChzdGRlcnIsICJyZWxvYyA9ICVzXHQiLCBSZWxvY1tpbnNuLT5yZWxvY10pOwotICBmcHJpbnRmIChzdGRlcnIsICJoaWdobG93ID0gJXNcbiIsIEhpZ2hsb3dbaW5zbi0+aGlnaGxvd10pOwotICBmcHJpbnRmIChzdGRlcnIsICJleHAgPSAge1xuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlx0XHRYX2FkZF9zeW1ib2wgPSAlc1xuIiwKLQkgICBpbnNuLT5leHAuWF9hZGRfc3ltYm9sID8KLQkgICAoU19HRVRfTkFNRSAoaW5zbi0+ZXhwLlhfYWRkX3N5bWJvbCkgPwotCSAgICBTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9hZGRfc3ltYm9sKSA6ICI/Pz8iKSA6ICIwIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlx0XHRYX29wX3N5bWJvbCA9ICVzXG4iLAotCSAgIGluc24tPmV4cC5YX29wX3N5bWJvbCA/Ci0JICAgKFNfR0VUX05BTUUgKGluc24tPmV4cC5YX29wX3N5bWJvbCkgPwotCSAgICBTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9vcF9zeW1ib2wpIDogIj8/PyIpIDogIjAiKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXHRcdFhfYWRkX251bWJlciA9ICVkXG4iLAotCSAgIGluc24tPmV4cC5YX2FkZF9udW1iZXIpOwotICBmcHJpbnRmIChzdGRlcnIsICJ9XG4iKTsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci19Ci0MCi0jaWZkZWYgY29tbWVudAotLyoKLSAqIEk4NjAgcmVsb2NhdGlvbnMgYXJlIGNvbXBsZXRlbHkgZGlmZmVyZW50LCBzbyBpdCBuZWVkcwotICogdGhpcyBtYWNoaW5lIGRlcGVuZGVudCByb3V0aW5lIHRvIGVtaXQgdGhlbS4KLSAqLwotdm9pZAotZW1pdF9tYWNoaW5lX3JlbG9jIChmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgcmVnaXN0ZXIgZml4UyAqZml4UDsKLSAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci17Ci0gIHN0cnVjdCByZWxvY19pbmZvX2k4NjAgcmk7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGV4dGVybiBjaGFyICpuZXh0X29iamVjdF9maWxlX2NoYXJQOwotICBsb25nIGFkZF9udW1iZXI7Ci0KLSAgbWVtc2V0ICgoY2hhciAqKSAmcmksICdcMCcsIHNpemVvZiAocmkpKTsKLSAgZm9yICg7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotICAgIHsKLQotICAgICAgaWYgKGZpeFAtPmZ4X3JfdHlwZSAmIH4weDNmKQotCXsKLQkgIGFzX2ZhdGFsICgiZml4UC0+Znhfcl90eXBlID0gJWRcbiIsIGZpeFAtPmZ4X3JfdHlwZSk7Ci0JfQotICAgICAgcmkucl9wY3JlbCA9IGZpeFAtPmZ4X3BjcmVsOwotICAgICAgcmkucl90eXBlID0gZml4UC0+Znhfcl90eXBlOwotCi0gICAgICBpZiAoKHN5bWJvbFAgPSBmaXhQLT5meF9hZGRzeSkgIT0gTlVMTCkKLQl7Ci0JICByaS5yX2FkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsKLQkgICAgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLQkgIGlmICghU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQkgICAgewotCSAgICAgIHJpLnJfZXh0ZXJuID0gMTsKLQkgICAgICByaS5yX3N5bWJvbG51bSA9IHN5bWJvbFAtPnN5X251bWJlcjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmkucl9leHRlcm4gPSAwOwotCSAgICAgIHJpLnJfc3ltYm9sbnVtID0gU19HRVRfVFlQRSAoc3ltYm9sUCk7Ci0JICAgIH0KLQkgIGlmIChzeW1ib2xQICYmIHN5bWJvbFAtPnN5X2ZyYWcpCi0JICAgIHsKLQkgICAgICByaS5yX2FkZGVuZCA9IHN5bWJvbFAtPnN5X2ZyYWctPmZyX2FkZHJlc3M7Ci0JICAgIH0KLQkgIHJpLnJfdHlwZSA9IGZpeFAtPmZ4X3JfdHlwZTsKLQkgIGlmIChmaXhQLT5meF9wY3JlbCkKLQkgICAgewotCSAgICAgIC8qIHByZXNlcnZlIGFjdHVhbCBvZmZzZXQgdnMuIHBjICsgNCAqLwotCSAgICAgIHJpLnJfYWRkZW5kIC09IChyaS5yX2FkZHJlc3MgKyA0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmkucl9hZGRlbmQgPSBmaXhQLT5meF9hZGRudW1iZXI7Ci0JICAgIH0KLQotCSAgbWRfcmlfdG9fY2hhcnMgKChjaGFyICopICZyaSwgcmkpOwotCSAgYXBwZW5kICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgKGNoYXIgKikgJnJpLCBzaXplb2YgKHJpKSk7Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmIC8qIGNvbW1lbnQgKi8KLQotI2lmZGVmIE9CSl9BT1VUCi0KLS8qIG9uIGk4NjA6IGZpcnN0IDQgYnl0ZXMgYXJlIG5vcm1hbCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIG5leHQgdGhyZWUKLSAgIGJ5dGVzIGFyZSBpbmRleCwgbW9zdCBzaWcuIGJ5dGUgZmlyc3QuICBCeXRlIDcgaXMgYnJva2VuIHVwIHdpdGgKLSAgIGJpdCA3IGFzIHBjcmVsLCBiaXQgNiBhcyBleHRlcm4sIGFuZCB0aGUgbG93ZXIgc2l4IGJpdHMgYXMKLSAgIHJlbG9jYXRpb24gdHlwZSAoaGlnaGxvdyA1LTQpLiAgTmV4dCA0IGJ5dGVzIGFyZSBsb25nIGFkZGVuZC4gKi8KLQotdm9pZAotdGNfYW91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICBsb25nIHJfaW5kZXg7Ci0gIGxvbmcgcl9leHRlcm47Ci0gIGxvbmcgcl9hZGRlbmQgPSAwOwotICBsb25nIHJfYWRkcmVzczsKLQotICBrbm93IChmaXhQLT5meF9hZGRzeSk7Ci0gIGtub3cgKCEoZml4UC0+Znhfcl90eXBlICYgfjB4M2YpKTsKLQotICBpZiAoIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIHJfZXh0ZXJuID0gMTsKLSAgICAgIHJfaW5kZXggPSBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSBTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSk7Ci0gICAgfQotCi0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsCi0JCSAgICAgIHJfYWRkcmVzcyA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSAtIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlLAotCQkgICAgICA0KTsKLQotICB3aGVyZVs0XSA9IChyX2luZGV4ID4+IDE2KSAmIDB4MGZmOwotICB3aGVyZVs1XSA9IChyX2luZGV4ID4+IDgpICYgMHgwZmY7Ci0gIHdoZXJlWzZdID0gcl9pbmRleCAmIDB4MGZmOwotICB3aGVyZVs3XSA9ICgoKGZpeFAtPmZ4X3BjcmVsIDw8IDcpICYgMHg4MCkKLQkgICAgICB8ICgocl9leHRlcm4gPDwgNikgJiAweDQwKQotCSAgICAgIHwgKGZpeFAtPmZ4X3JfdHlwZSAmIDB4M0YpKTsKLQotICBpZiAoZml4UC0+ZnhfYWRkc3ktPnN5X2ZyYWcpCi0gICAgewotICAgICAgcl9hZGRlbmQgPSBmaXhQLT5meF9hZGRzeS0+c3lfZnJhZy0+ZnJfYWRkcmVzczsKLSAgICB9Ci0KLSAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotICAgIHsKLSAgICAgIC8qIHByZXNlcnZlIGFjdHVhbCBvZmZzZXQgdnMuIHBjICsgNCAqLwotICAgICAgcl9hZGRlbmQgLT0gKHJfYWRkcmVzcyArIDQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJfYWRkZW5kID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotICAgIH0KLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKCZ3aGVyZVs4XSwgcl9hZGRlbmQsIDQpOwotfQotCi0jZW5kaWYgLyogT0JKX0FPVVQgKi8KLQotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgcmV0dXJuIHNpemU7CQkJLyogQnl0ZSBhbGlnbm1lbnQgaXMgZmluZSAqLwotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgaTg2MCwgdGhleSdyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb2Zmc2V0LCBwbHVzCi0gICBpdHMgc2l6ZS4gKD8/PyBJcyB0aGlzIHJpZ2h0PyAgRklYTUUtU09PTiEpICovCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gZml4UC0+Znhfc2l6ZSArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotewotICBjaGFyICpwbGFjZSA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLQotICAvKiBsb29rcyB0byBtZSBsaWtlIGk4NjAgbmV2ZXIgaGFzIGJpdCBmaXhlcy4gTGV0J3Mgc2VlLiB4b3hvcmljaC4gKi8KLSAga25vdyAoZml4UC0+ZnhfYml0X2ZpeFAgPT0gTlVMTCk7Ci0gIGlmICghZml4UC0+ZnhfYml0X2ZpeFApCi0gICAgewotICAgICAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsOwotICAgICAgbWRfbnVtYmVyX3RvX2ltbSAocGxhY2UsIHZhbCwgZml4UC0+Znhfc2l6ZSwgZml4UCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2ZpZWxkIChwbGFjZSwgdmFsLCBmaXhQLT5meF9iaXRfZml4UCk7Ci0gICAgfQotfQotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogZmlsbC1jb2x1bW46IDEzMQotICogY29tbWVudC1jb2x1bW46IDAKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2YgdGMtaTg2MC5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWk4NjAuaCBiL2dhcy9jb25maWcvdGMtaTg2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmIyMWMxLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaTg2MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogdGMtaTg2MC5oIC0tIEhlYWRlciBmaWxlIGZvciB0aGUgSTg2MAotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19JODYwIDEKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihhKQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfYW91dF9wcmVfd3JpdGVfaG9vayh4KQl7O30JLyogbm90IHVzZWQgKi8KLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiB0Yy1pODYwLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaTk2MC5jIGIvZ2FzL2NvbmZpZy90Yy1pOTYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNmI2NjIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1pOTYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMxICswLDAgQEAKLS8qIHRjLWk5NjAuYyAtIEFsbCB0aGUgaTgwOTYwLXNwZWNpZmljIHN0dWZmCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogU2VlIGNvbW1lbnQgb24gbWRfcGFyc2Vfb3B0aW9uIGZvciA4MDk2MC1zcGVjaWZpYyBpbnZvY2F0aW9uIG9wdGlvbnMuICovCi0KLS8qIFRoZXJlIGFyZSA0IGRpZmZlcmVudCBsZW5ndGhzIG9mIChwb3RlbnRpYWxseSkgc3ltYm9sLWJhc2VkIGRpc3BsYWNlbWVudHMKLSAgIGluIHRoZSA4MDk2MCBpbnN0cnVjdGlvbiBzZXQsIGVhY2ggb2Ygd2hpY2ggY291bGQgcmVxdWlyZSBhZGRyZXNzIGZpeC11cHMKLSAgIGFuZCAoaW4gdGhlIGNhc2Ugb2YgZXh0ZXJuYWwgc3ltYm9scykgZW1pc3Npb24gb2YgcmVsb2NhdGlvbiBkaXJlY3RpdmVzOgotCi0gICAzMi1iaXQgKE1FTUIpCi0gICAgICAgIFRoaXMgaXMgYSBzdGFuZGFyZCBsZW5ndGggZm9yIHRoZSBiYXNlIGFzc2VtYmxlciBhbmQgcmVxdWlyZXMgbm8KLSAgICAgICAgc3BlY2lhbCBhY3Rpb24uCi0KLSAgIDEzLWJpdCAoQ09CUikKLSAgICAgICAgVGhpcyBpcyBhIG5vbi1zdGFuZGFyZCBsZW5ndGgsIGJ1dCB0aGUgYmFzZSBhc3NlbWJsZXIgaGFzIGEKLSAgICAgICAgaG9vayBmb3IgYml0IGZpZWxkIGFkZHJlc3MgZml4dXBzOiB0aGUgZml4UyBzdHJ1Y3R1cmUgY2FuCi0gICAgICAgIHBvaW50IHRvIGEgZGVzY3JpcHRvciBvZiB0aGUgZmllbGQsIGluIHdoaWNoIGNhc2Ugb3VyCi0gICAgICAgIG1kX251bWJlcl90b19maWVsZCgpIHJvdXRpbmUgZ2V0cyBjYWxsZWQgdG8gcHJvY2VzcyBpdC4KLQotICAgICAgICBJIG1hZGUgdGhlIGhvb2sgYSBsaXR0bGUgY2xlYW5lciBieSBoYXZpbmcgZml4X25ldygpIChpbiB0aGUgYmFzZQotICAgICAgICBhc3NlbWJsZXIpIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpeFMgaW4gcXVlc3Rpb24uICBBbmQgSSBtYWRlIGl0IGEKLSAgICAgICAgbGl0dGxlIHNpbXBsZXIgYnkgc3RvcmluZyB0aGUgZmllbGQgc2l6ZSAoaW4gdGhpcyBjYXNlIDEzKSBpbnN0ZWFkIG9mCi0gICAgICAgIG9mIGEgcG9pbnRlciB0byBhbm90aGVyIHN0cnVjdHVyZTogIDgwOTYwIGRpc3BsYWNlbWVudHMgYXJlIEFMV0FZUwotICAgICAgICBzdG9yZWQgaW4gdGhlIGxvdy1vcmRlciBiaXRzIG9mIGEgNC1ieXRlIHdvcmQuCi0KLSAgICAgICAgU2luY2UgdGhlIHRhcmdldCBvZiBhIENPQlIgY2Fubm90IGJlIGV4dGVybmFsLCBubyByZWxvY2F0aW9uCi0gICAgICAgIGRpcmVjdGl2ZXMgZm9yIHRoaXMgc2l6ZSBkaXNwbGFjZW1lbnQgaGF2ZSB0byBiZSBnZW5lcmF0ZWQuCi0gICAgICAgIEJ1dCB0aGUgYmFzZSBhc3NlbWJsZXIgaGFkIHRvIGJlIG1vZGlmaWVkIHRvIGlzc3VlIGVycm9yCi0gICAgICAgIG1lc3NhZ2VzIGlmIHRoZSBzeW1ib2wgZGlkIHR1cm4gb3V0IHRvIGJlIGV4dGVybmFsLgotCi0gICAyNC1iaXQgKENUUkwpCi0gICAgICAgIEZpeHVwcyBhcmUgaGFuZGxlZCBhcyBmb3IgdGhlIDEzLWJpdCBjYXNlIChleGNlcHQgdGhhdCAyNCBpcyBzdG9yZWQKLSAgICAgICAgaW4gdGhlIGZpeFMpLgotCi0gICAgICAgIFRoZSByZWxvY2F0aW9uIGRpcmVjdGl2ZSBnZW5lcmF0ZWQgaXMgdGhlIHNhbWUgYXMgdGhhdCBmb3IgdGhlIDMyLWJpdAotICAgICAgICBkaXNwbGFjZW1lbnQsIGV4Y2VwdCB0aGF0IGl0J3MgUEMtcmVsYXRpdmUgKHRoZSAzMi1iaXQgZGlzcGxhY2VtZW50Ci0gICAgICAgIG5ldmVyIGlzKS4gICBUaGUgaTgwOTYwIHZlcnNpb24gb2YgdGhlIGxpbmtlciBuZWVkcyBhIG1vZCB0bwotICAgICAgICBkaXN0aW5ndWlzaCBhbmQgaGFuZGxlIHRoZSAyNC1iaXQgY2FzZS4KLQotICAgMTItYml0IChNRU1BKQotICAgICAgICBNRU1BIGZvcm1hdHMgYXJlIGFsd2F5cyBwcm9tb3RlZCB0byBNRU1CICgzMi1iaXQpIGlmIHRoZSBkaXNwbGFjZW1lbnQKLSAgICAgICAgaXMgYmFzZWQgb24gYSBzeW1ib2wsIGJlY2F1c2UgaXQgY291bGQgYmUgcmVsb2NhdGVkIGF0IGxpbmsgdGltZS4KLSAgICAgICAgVGhlIG9ubHkgdGltZSB3ZSB1c2UgdGhlIDEyLWJpdCBmb3JtYXQgaXMgaWYgYW4gYWJzb2x1dGUgdmFsdWUgb2YKLSAgICAgICAgbGVzcyB0aGFuIDQwOTYgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgbmVpdGhlciBhIGZpeHVwIG5vcgotICAgICAgICBhIHJlbG9jYXRpb24gZGlyZWN0aXZlLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvaTk2MC5oIgotCi0jaWYgZGVmaW5lZCAoT0JKX0FPVVQpIHx8IGRlZmluZWQgKE9CSl9CT1VUKQotCi0jZGVmaW5lIFRDX1NfSVNfU1lTUFJPQyhzKQkoKDE8PVNfR0VUX09USEVSKHMpKSAmJiAoU19HRVRfT1RIRVIocyk8PTMyKSkKLSNkZWZpbmUgVENfU19JU19CQUxOQU1FKHMpCShTX0dFVF9PVEhFUihzKSA9PSBOX0JBTE5BTUUpCi0jZGVmaW5lIFRDX1NfSVNfQ0FMTE5BTUUocykJKFNfR0VUX09USEVSKHMpID09IE5fQ0FMTE5BTUUpCi0jZGVmaW5lIFRDX1NfSVNfQkFEUFJPQyhzKQkoKFNfR0VUX09USEVSKHMpICE9IDApICYmICFUQ19TX0lTX0NBTExOQU1FKHMpICYmICFUQ19TX0lTX0JBTE5BTUUocykgJiYgIVRDX1NfSVNfU1lTUFJPQyhzKSkKLQotI2RlZmluZSBUQ19TX1NFVF9TWVNQUk9DKHMsIHApCShTX1NFVF9PVEhFUigocyksIChwKSsxKSkKLSNkZWZpbmUgVENfU19HRVRfU1lTUFJPQyhzKQkoU19HRVRfT1RIRVIocyktMSkKLQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX0JBTE5BTUUocykJKFNfU0VUX09USEVSKChzKSwgTl9CQUxOQU1FKSkKLSNkZWZpbmUgVENfU19GT1JDRV9UT19DQUxMTkFNRShzKQkoU19TRVRfT1RIRVIoKHMpLCBOX0NBTExOQU1FKSkKLSNkZWZpbmUgVENfU19GT1JDRV9UT19TWVNQUk9DKHMpCXs7fQotCi0jZWxzZSAvKiAhIE9CSl9BL0JPVVQgKi8KLSNpZmRlZiBPQkpfQ09GRgotCi0jZGVmaW5lIFRDX1NfSVNfU1lTUFJPQyhzKQkoU19HRVRfU1RPUkFHRV9DTEFTUyhzKSA9PSBDX1NDQUxMKQotI2RlZmluZSBUQ19TX0lTX0JBTE5BTUUocykJKFNGX0dFVF9CQUxOQU1FKHMpKQotI2RlZmluZSBUQ19TX0lTX0NBTExOQU1FKHMpCShTRl9HRVRfQ0FMTE5BTUUocykpCi0jZGVmaW5lIFRDX1NfSVNfQkFEUFJPQyhzKQkoVENfU19JU19TWVNQUk9DKHMpICYmIFRDX1NfR0VUX1NZU1BST0MocykgPCAwICYmIDMxIDwgVENfU19HRVRfU1lTUFJPQyhzKSkKLQotI2RlZmluZSBUQ19TX1NFVF9TWVNQUk9DKHMsIHApCSgocyktPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzFdLnhfc2MueF9zdGluZHggPSAocCkpCi0jZGVmaW5lIFRDX1NfR0VUX1NZU1BST0MocykJKChzKS0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMV0ueF9zYy54X3N0aW5keCkKLQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX0JBTE5BTUUocykJKFNGX1NFVF9CQUxOQU1FKHMpKQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX0NBTExOQU1FKHMpCShTRl9TRVRfQ0FMTE5BTUUocykpCi0jZGVmaW5lIFRDX1NfRk9SQ0VfVE9fU1lTUFJPQyhzKQkoU19TRVRfU1RPUkFHRV9DTEFTUygocyksIENfU0NBTEwpKQotCi0jZWxzZSAvKiAhIE9CSl9DT0ZGICovCi15b3UgbG9zZTsKLSNlbmRpZiAvKiAhIE9CSl9DT0ZGICovCi0jZW5kaWYgLyogISBPQkpfQS9CT1VUICovCi0KLWV4dGVybiBjaGFyICppbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSNpZiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgIWRlZmluZWQgKEJGRCkKLSNpZmRlZiBPQkpfQ09GRgotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSBzaXplb2YgKHN0cnVjdCByZWxvYyk7Ci0jZWxzZSAvKiBPQkpfQ09GRiAqLwotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pOwotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0jZW5kaWYKLQotLyogTG9jYWwgaTgwOTYwIHJvdXRpbmVzLiAgKi8KLQotc3RhdGljIHZvaWQgYnJjbnRfZW1pdCAoKTsJLyogRW1pdCBicmFuY2gtcHJlZGljdGlvbiBpbnN0cnVtZW50YXRpb24gY29kZSAqLwotc3RhdGljIGNoYXIgKmJybGFiX25leHQgKCk7CS8qIFJldHVybiBuZXh0IGJyYW5jaCBsb2NhbCBsYWJlbCAqLwotdm9pZCBicnRhYl9lbWl0ICgpOwkJLyogRW1pdCBici1wcmVkaWN0IGluc3RydW1lbnRhdGlvbiB0YWJsZSAqLwotc3RhdGljIHZvaWQgY29icl9mbXQgKCk7CS8qIEdlbmVyYXRlIENPQlIgaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyB2b2lkIGN0cmxfZm10ICgpOwkvKiBHZW5lcmF0ZSBDVFJMIGluc3RydWN0aW9uICovCi1zdGF0aWMgY2hhciAqZW1pdCAoKTsJCS8qIEVtaXQgKGludGVybmFsbHkpIGJpbmFyeSAqLwotc3RhdGljIGludCBnZXRfYXJncyAoKTsJCS8qIEJyZWFrIGFyZ3VtZW50cyBvdXQgb2YgY29tbWEtc2VwYXJhdGVkIGxpc3QgKi8KLXN0YXRpYyB2b2lkIGdldF9jZGlzcCAoKTsJLyogSGFuZGxlIENPQlIgb3IgQ1RSTCBkaXNwbGFjZW1lbnQgKi8KLXN0YXRpYyBjaGFyICpnZXRfaXNwZWMgKCk7CS8qIEZpbmQgaW5kZXggc3BlY2lmaWNhdGlvbiBzdHJpbmcgKi8KLXN0YXRpYyBpbnQgZ2V0X3JlZ251bSAoKTsJLyogVHJhbnNsYXRlIHRleHQgdG8gcmVnaXN0ZXIgbnVtYmVyICovCi1zdGF0aWMgaW50IGlfc2NhbiAoKTsJCS8qIExleGljYWwgc2NhbiBvZiBpbnN0cnVjdGlvbiBzb3VyY2UgKi8KLXN0YXRpYyB2b2lkIG1lbV9mbXQgKCk7CQkvKiBHZW5lcmF0ZSBNRU1BIG9yIE1FTUIgaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyB2b2lkIG1lbWFfdG9fbWVtYiAoKTsJLyogQ29udmVydCBNRU1BIGluc3RydWN0aW9uIHRvIE1FTUIgZm9ybWF0ICovCi1zdGF0aWMgdm9pZCBwYXJzZV9leHByICgpOwkvKiBQYXJzZSBhbiBleHByZXNzaW9uICovCi1zdGF0aWMgaW50IHBhcnNlX2xkY29uc3QgKCk7CS8qIFBhcnNlIGFuZCByZXBsYWNlIGEgJ2xkY29uc3QnIHBzZXVkby1vcCAqLwotc3RhdGljIHZvaWQgcGFyc2VfbWVtb3AgKCk7CS8qIFBhcnNlIGEgbWVtb3J5IG9wZXJhbmQgKi8KLXN0YXRpYyB2b2lkIHBhcnNlX3BvICgpOwkvKiBQYXJzZSBtYWNoaW5lLWRlcGVuZGVudCBwc2V1ZG8tb3AgKi8KLXN0YXRpYyB2b2lkIHBhcnNlX3JlZ29wICgpOwkvKiBQYXJzZSBhIHJlZ2lzdGVyIG9wZXJhbmQgKi8KLXN0YXRpYyB2b2lkIHJlZ19mbXQgKCk7CQkvKiBHZW5lcmF0ZSBhIFJFRyBmb3JtYXQgaW5zdHJ1Y3Rpb24gKi8KLXZvaWQgcmVsb2NfY2FsbGogKCk7CQkvKiBSZWxvY2F0ZSBhICdjYWxsaicgaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyB2b2lkIHJlbGF4X2NvYnIgKCk7CS8qICJEZS1vcHRpbWl6ZSIgY29iciBpbnRvIGNvbXBhcmUvYnJhbmNoICovCi1zdGF0aWMgdm9pZCBzX2xlYWZwcm9jICgpOwkvKiBQcm9jZXNzICcubGVhZnByb2MnIHBzZXVkby1vcCAqLwotc3RhdGljIHZvaWQgc19zeXNwcm9jICgpOwkvKiBQcm9jZXNzICcuc3lzcHJvYycgcHNldWRvLW9wICovCi1zdGF0aWMgaW50IHNoaWZ0X29rICgpOwkJLyogV2lsbCBhICdzaGxvJyBzdWJzdGl0dXJlIGZvciBhICdsZGNvbnN0Jz8gKi8KLXN0YXRpYyB2b2lkIHN5bnRheCAoKTsJCS8qIEdpdmUgc3ludGF4IGVycm9yICovCi1zdGF0aWMgaW50IHRhcmdfaGFzX3NmciAoKTsJLyogVGFyZ2V0IGNoaXAgc3VwcG9ydHMgc3BlYy1mdW5jIHJlZ2lzdGVyPyAqLwotc3RhdGljIGludCB0YXJnX2hhc19pY2xhc3MgKCk7CS8qIFRhcmdldCBjaGlwIHN1cHBvcnRzIGluc3RydWN0aW9uIHNldD8gKi8KLQotLyogU2VlIG1kX3BhcnNlX29wdGlvbigpIGZvciBtZWFuaW5ncyBvZiB0aGVzZSBvcHRpb25zICovCi1zdGF0aWMgY2hhciBub3JlbGF4OwkJLyogVHJ1ZSBpZiAtbm9yZWxheCBzd2l0Y2ggc2VlbiAqLwotc3RhdGljIGNoYXIgaW5zdHJ1bWVudF9icmFuY2hlczsJLyogVHJ1ZSBpZiAtYiBzd2l0Y2ggc2VlbiAqLwotCi0vKiBDaGFyYWN0ZXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4KLSAgIElmIHRoZSBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwuCi0gKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBDaGFyYWN0ZXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQuCi0KLSAgIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuCi0gKi8KLQotLyogQWxzbyBub3RlIHRoYXQgY29tbWVudHMgc3RhcnRlZCBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzIHdvcmsuICovCi0KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzWzFdOwotCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzWzFdOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LAotICAgYXMgaW4gMGYxMi40NTYgb3IgMGQxLjIzNDVlMTIKLSAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJmRmREdFQiOwotCi0KLS8qIFRhYmxlIHVzZWQgYnkgYmFzZSBhc3NlbWJsZXIgdG8gcmVsYXggYWRkcmVzc2VzIGJhc2VkIG9uIHZhcnlpbmcgbGVuZ3RoCi0gICBpbnN0cnVjdGlvbnMuICBUaGUgZmllbGRzIGFyZToKLSAgICAgMSkgbW9zdCBwb3NpdGl2ZSByZWFjaCBvZiB0aGlzIHN0YXRlLAotICAgICAyKSBtb3N0IG5lZ2F0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAgIDMpIGhvdyBtYW55IGJ5dGVzIHRoaXMgbW9kZSB3aWxsIGFkZCB0byB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBmcmFnCi0gICAgIDQpIHdoaWNoIGluZGV4IGludG8gdGhlIHRhYmxlIHRvIHRyeSBpZiB3ZSBjYW4ndCBmaXQgaW50byB0aGlzIG9uZS4KLQotICAgRm9yIGk4MDk2MCwgdGhlIG9ubHkgYXBwbGljYXRpb24gaXMgdGhlIChkZS0pb3B0aW1pemF0aW9uIG9mIGNvYnIKLSAgIGluc3RydWN0aW9ucyBpbnRvIHNlcGFyYXRlIGNvbXBhcmUgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMgd2hlbiBhIDEzLWJpdAotICAgZGlzcGxhY2VtZW50IHdvbid0IGhhY2sgaXQuCi0gKi8KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotICB7MCwgMCwgMCwgMH0sCQkJLyogU3RhdGUgMCA9PiBubyBtb3JlIHJlbGF4YXRpb24gcG9zc2libGUgKi8KLSAgezQwODgsIC00MDk2LCAwLCAyfSwJCS8qIFN0YXRlIDE6IGNvbmRpdGlvbmFsIGJyYW5jaCAoY29icikgKi8KLSAgezB4ODAwMDAwIC0gOCwgLTB4ODAwMDAwLCA0LCAwfSwJLyogU3RhdGUgMjogY29tcGFyZSAocmVnKSAmIGJyYW5jaCAoY3RybCkgKi8KLX07Ci0KLXN0YXRpYyB2b2lkIHNfZW5kaWFuIFBBUkFNUyAoKGludCkpOwotCi0vKiBUaGVzZSBhcmUgdGhlIG1hY2hpbmUgZGVwZW5kZW50IHBzZXVkby1vcHMuCi0KLSAgIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0gICAgICAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICAgICAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgICAgICBpbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgotICovCi0jZGVmaW5lIFNfTEVBRlBST0MJMQotI2RlZmluZSBTX1NZU1BST0MJMgotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImJzcyIsIHNfbGNvbW0sIDF9LAotICB7ImVuZGlhbiIsIHNfZW5kaWFuLCAwfSwKLSAgeyJleHRlbmRlZCIsIGZsb2F0X2NvbnMsICd0J30sCi0gIHsibGVhZnByb2MiLCBwYXJzZV9wbywgU19MRUFGUFJPQ30sCi0gIHsic3lzcHJvYyIsIHBhcnNlX3BvLCBTX1NZU1BST0N9LAotCi0gIHsid29yZCIsIGNvbnMsIDR9LAotICB7InF1YWQiLCBjb25zLCAxNn0sCi0KLSAgezAsIDAsIDB9Ci19OwotDAotLyogTWFjcm9zIHRvIGV4dHJhY3QgaW5mbyBmcm9tIGFuICdleHByZXNzaW9uUycgc3RydWN0dXJlICdlJyAqLwotI2RlZmluZSBhZGRzKGUpCWUuWF9hZGRfc3ltYm9sCi0jZGVmaW5lIG9mZnMoZSkJZS5YX2FkZF9udW1iZXIKLQotCi0vKiBCcmFuY2gtcHJlZGljdGlvbiBiaXRzIGZvciBDVFJML0NPQlIgZm9ybWF0IG9wY29kZXMgKi8KLSNkZWZpbmUgQlBfTUFTSwkJMHgwMDAwMDAwMgkvKiBNYXNrIGZvciBicmFuY2gtcHJlZGljdGlvbiBiaXQgKi8KLSNkZWZpbmUgQlBfVEFLRU4JMHgwMDAwMDAwMAkvKiBWYWx1ZSB0byBPUiBpbiB0byBwcmVkaWN0IGJyYW5jaCAqLwotI2RlZmluZSBCUF9OT1RfVEFLRU4JMHgwMDAwMDAwMgkvKiBWYWx1ZSB0byBPUiBpbiB0byBwcmVkaWN0IG5vIGJyYW5jaCAqLwotCi0KLS8qIFNvbWUgaW5zdHJ1Y3Rpb24gb3Bjb2RlcyB0aGF0IHdlIG5lZWQgZXhwbGljaXRseSAqLwotI2RlZmluZSBCRQkweDEyMDAwMDAwCi0jZGVmaW5lIEJHCTB4MTEwMDAwMDAKLSNkZWZpbmUgQkdFCTB4MTMwMDAwMDAKLSNkZWZpbmUgQkwJMHgxNDAwMDAwMAotI2RlZmluZSBCTEUJMHgxNjAwMDAwMAotI2RlZmluZSBCTkUJMHgxNTAwMDAwMAotI2RlZmluZSBCTk8JMHgxMDAwMDAwMAotI2RlZmluZSBCTwkweDE3MDAwMDAwCi0jZGVmaW5lIENIS0JJVAkweDVhMDAyNzAwCi0jZGVmaW5lIENNUEkJMHg1YTAwMjA4MAotI2RlZmluZSBDTVBPCTB4NWEwMDIwMDAKLQotI2RlZmluZSBCCTB4MDgwMDAwMDAKLSNkZWZpbmUgQkFMCTB4MGIwMDAwMDAKLSNkZWZpbmUgQ0FMTAkweDA5MDAwMDAwCi0jZGVmaW5lIENBTExTCTB4NjYwMDM4MDAKLSNkZWZpbmUgUkVUCTB4MGEwMDAwMDAKLQotCi0vKiBUaGVzZSBtYXNrcyBhcmUgdXNlZCB0byBidWlsZCB1cCBhIHNldCBvZiBNRU1CIG1vZGUgYml0cy4gKi8KLSNkZWZpbmUJQV9CSVQJCTB4MDQwMAotI2RlZmluZQlJX0JJVAkJMHgwODAwCi0jZGVmaW5lIE1FTUJfQklUCTB4MTAwMAotI2RlZmluZQlEX0JJVAkJMHgyMDAwCi0KLQotLyogTWFzayBmb3IgdGhlIG9ubHkgbW9kZSBiaXQgaW4gYSBNRU1BIGluc3RydWN0aW9uIChpZiBzZXQsIGFiYXNlIHJlZyBpcwotICAgdXNlZCkuICAqLwotI2RlZmluZSBNRU1BX0FCQVNFCTB4MjAwMAotCi0vKiBJbmZvIGZyb20gd2hpY2ggYSBNRU1BIG9yIE1FTUIgZm9ybWF0IGluc3RydWN0aW9uIGNhbiBiZSBnZW5lcmF0ZWQgKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICAvKiAoRmlyc3QpIDMyIGJpdHMgb2YgaW5zdHJ1Y3Rpb24gKi8KLSAgICBsb25nIG9wY29kZTsKLSAgICAvKiAwLShub25lKSwgMTItIG9yLCAzMi1iaXQgZGlzcGxhY2VtZW50IG5lZWRlZCAqLwotICAgIGludCBkaXNwOwotICAgIC8qIFRoZSBleHByZXNzaW9uIGluIHRoZSBzb3VyY2UgaW5zdHJ1Y3Rpb24gZnJvbSB3aGljaCB0aGUKLSAgICAgICBkaXNwbGFjZW1lbnQgc2hvdWxkIGJlIGRldGVybWluZWQuICAqLwotICAgIGNoYXIgKmU7Ci0gIH0KLQotbWVtUzsKLQotCi0vKiBUaGUgdHdvIHBpZWNlcyBvZiBpbmZvIHdlIG5lZWQgdG8gZ2VuZXJhdGUgYSByZWdpc3RlciBvcGVyYW5kICovCi1zdHJ1Y3QgcmVnb3AKLSAgewotICAgIGludCBtb2RlOwkJCS8qIDAgPT5sb2NhbC9nbG9iYWwvc3BlYyByZWc7IDE9PiBsaXRlcmFsIG9yIGZwIHJlZyAqLwotICAgIGludCBzcGVjaWFsOwkJLyogMCA9Pm5vdCBhIHNmcjsgIDE9PiBpcyBhIHNmciAobm90IHZhbGlkIHcvbW9kZT0wKSAqLwotICAgIGludCBuOwkJCS8qIFJlZ2lzdGVyIG51bWJlciBvciBsaXRlcmFsIHZhbHVlICovCi0gIH07Ci0KLQotLyogTnVtYmVyIGFuZCBhc3NlbWJsZXIgbW5lbW9uaWMgZm9yIGFsbCByZWdpc3RlcnMgdGhhdCBjYW4gYXBwZWFyIGluCi0gICBvcGVyYW5kcy4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0Ci0gIHsKLSAgICBjaGFyICpyZWdfbmFtZTsKLSAgICBpbnQgcmVnX251bTsKLSAgfQotcmVnbmFtZXNbXSA9Ci17Ci0gIHsgInBmcCIsIDAgfSwKLSAgeyAic3AiLCAxIH0sCi0gIHsgInJpcCIsIDIgfSwKLSAgeyAicjMiLCAzIH0sCi0gIHsgInI0IiwgNCB9LAotICB7ICJyNSIsIDUgfSwKLSAgeyAicjYiLCA2IH0sCi0gIHsgInI3IiwgNyB9LAotICB7ICJyOCIsIDggfSwKLSAgeyAicjkiLCA5IH0sCi0gIHsgInIxMCIsIDEwIH0sCi0gIHsgInIxMSIsIDExIH0sCi0gIHsgInIxMiIsIDEyIH0sCi0gIHsgInIxMyIsIDEzIH0sCi0gIHsgInIxNCIsIDE0IH0sCi0gIHsgInIxNSIsIDE1IH0sCi0gIHsgImcwIiwgMTYgfSwKLSAgeyAiZzEiLCAxNyB9LAotICB7ICJnMiIsIDE4IH0sCi0gIHsgImczIiwgMTkgfSwKLSAgeyAiZzQiLCAyMCB9LAotICB7ICJnNSIsIDIxIH0sCi0gIHsgImc2IiwgMjIgfSwKLSAgeyAiZzciLCAyMyB9LAotICB7ICJnOCIsIDI0IH0sCi0gIHsgImc5IiwgMjUgfSwKLSAgeyAiZzEwIiwgMjYgfSwKLSAgeyAiZzExIiwgMjcgfSwKLSAgeyAiZzEyIiwgMjggfSwKLSAgeyAiZzEzIiwgMjkgfSwKLSAgeyAiZzE0IiwgMzAgfSwKLSAgeyAiZnAiLCAzMSB9LAotCi0gIC8qIE51bWJlcnMgZm9yIHNwZWNpYWwtZnVuY3Rpb24gcmVnaXN0ZXJzIGFyZSBmb3IgYXNzZW1ibGVyIGludGVybmFsCi0gICAgIHVzZSBvbmx5OiB0aGV5IGFyZSBzY2FsZWQgYmFjayB0byByYW5nZSBbMC0zMV0gZm9yIGJpbmFyeSBvdXRwdXQuICAqLwotI2RlZmluZSBTRjAJMzIKLQotICB7ICJzZjAiLCAzMiB9LAotICB7ICJzZjEiLCAzMyB9LAotICB7ICJzZjIiLCAzNCB9LAotICB7ICJzZjMiLCAzNSB9LAotICB7ICJzZjQiLCAzNiB9LAotICB7ICJzZjUiLCAzNyB9LAotICB7ICJzZjYiLCAzOCB9LAotICB7ICJzZjciLCAzOSB9LAotICB7ICJzZjgiLCA0MCB9LAotICB7ICJzZjkiLCA0MSB9LAotICB7ICJzZjEwIiwgNDIgfSwKLSAgeyAic2YxMSIsIDQzIH0sCi0gIHsgInNmMTIiLCA0NCB9LAotICB7ICJzZjEzIiwgNDUgfSwKLSAgeyAic2YxNCIsIDQ2IH0sCi0gIHsgInNmMTUiLCA0NyB9LAotICB7ICJzZjE2IiwgNDggfSwKLSAgeyAic2YxNyIsIDQ5IH0sCi0gIHsgInNmMTgiLCA1MCB9LAotICB7ICJzZjE5IiwgNTEgfSwKLSAgeyAic2YyMCIsIDUyIH0sCi0gIHsgInNmMjEiLCA1MyB9LAotICB7ICJzZjIyIiwgNTQgfSwKLSAgeyAic2YyMyIsIDU1IH0sCi0gIHsgInNmMjQiLCA1NiB9LAotICB7ICJzZjI1IiwgNTcgfSwKLSAgeyAic2YyNiIsIDU4IH0sCi0gIHsgInNmMjciLCA1OSB9LAotICB7ICJzZjI4IiwgNjAgfSwKLSAgeyAic2YyOSIsIDYxIH0sCi0gIHsgInNmMzAiLCA2MiB9LAotICB7ICJzZjMxIiwgNjMgfSwKLQotICAvKiBOdW1iZXJzIGZvciBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgYXJlIGZvciBhc3NlbWJsZXIgaW50ZXJuYWwKLSAgICAgdXNlIG9ubHk6IHRoZXkgYXJlIHNjYWxlZCBiYWNrIHRvIFswLTNdIGZvciBiaW5hcnkgb3V0cHV0LiAgKi8KLSNkZWZpbmUgRlAwCTY0Ci0KLSAgeyAiZnAwIiwgNjQgfSwKLSAgeyAiZnAxIiwgNjUgfSwKLSAgeyAiZnAyIiwgNjYgfSwKLSAgeyAiZnAzIiwgNjcgfSwKLQotICB7IE5VTEwsIDAgfSwJCQkJLyogRU5EIE9GIExJU1QgKi8KLX07Ci0KLSNkZWZpbmUJSVNfUkdfUkVHKG4pCSgoMCA8PSAobikpICYmICgobikgPCBTRjApKQotI2RlZmluZQlJU19TRl9SRUcobikJKChTRjAgPD0gKG4pKSAmJiAoKG4pIDwgRlAwKSkKLSNkZWZpbmUJSVNfRlBfUkVHKG4pCSgobikgPj0gRlAwKQotCi0vKiBOdW1iZXIgYW5kIGFzc2VtYmxlciBtbmVtb25pYyBmb3IgYWxsIHJlZ2lzdGVycyB0aGF0IGNhbiBhcHBlYXIgYXMKLSAgICdhYmFzZScgKGluZGlyZWN0IGFkZHJlc3NpbmcpIHJlZ2lzdGVycy4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0Ci0gIHsKLSAgICBjaGFyICphcmVnX25hbWU7Ci0gICAgaW50IGFyZWdfbnVtOwotICB9Ci1hcmVnc1tdID0KLXsKLSAgeyAiKHBmcCkiLCAwIH0sCi0gIHsgIihzcCkiLCAxIH0sCi0gIHsgIihyaXApIiwgMiB9LAotICB7ICIocjMpIiwgMyB9LAotICB7ICIocjQpIiwgNCB9LAotICB7ICIocjUpIiwgNSB9LAotICB7ICIocjYpIiwgNiB9LAotICB7ICIocjcpIiwgNyB9LAotICB7ICIocjgpIiwgOCB9LAotICB7ICIocjkpIiwgOSB9LAotICB7ICIocjEwKSIsIDEwIH0sCi0gIHsgIihyMTEpIiwgMTEgfSwKLSAgeyAiKHIxMikiLCAxMiB9LAotICB7ICIocjEzKSIsIDEzIH0sCi0gIHsgIihyMTQpIiwgMTQgfSwKLSAgeyAiKHIxNSkiLCAxNSB9LAotICB7ICIoZzApIiwgMTYgfSwKLSAgeyAiKGcxKSIsIDE3IH0sCi0gIHsgIihnMikiLCAxOCB9LAotICB7ICIoZzMpIiwgMTkgfSwKLSAgeyAiKGc0KSIsIDIwIH0sCi0gIHsgIihnNSkiLCAyMSB9LAotICB7ICIoZzYpIiwgMjIgfSwKLSAgeyAiKGc3KSIsIDIzIH0sCi0gIHsgIihnOCkiLCAyNCB9LAotICB7ICIoZzkpIiwgMjUgfSwKLSAgeyAiKGcxMCkiLCAyNiB9LAotICB7ICIoZzExKSIsIDI3IH0sCi0gIHsgIihnMTIpIiwgMjggfSwKLSAgeyAiKGcxMykiLCAyOSB9LAotICB7ICIoZzE0KSIsIDMwIH0sCi0gIHsgIihmcCkiLCAzMSB9LAotCi0jZGVmaW5lIElQUkVMCTMyCi0gIC8qIEZvciBhc3NlbWJsZXIgaW50ZXJuYWwgdXNlIG9ubHk6IHRoaXMgbnVtYmVyIG5ldmVyIGFwcGVhcnMgaW4gYmluYXJ5Ci0gICAgIG91dHB1dC4gICovCi0gIHsgIihpcCkiLCBJUFJFTCB9LAotCi0gIHsgTlVMTCwgMCB9LAkJCQkvKiBFTkQgT0YgTElTVCAqLwotfTsKLQotCi0vKiBIYXNoIHRhYmxlcyAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2g7CS8qIE9wY29kZSBtbmVtb25pY3MgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpyZWdfaGFzaDsJLyogUmVnaXN0ZXIgbmFtZSBoYXNoIHRhYmxlICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqYXJlZ19oYXNoOwkvKiBBYmFzZSByZWdpc3RlciBoYXNoIHRhYmxlICovCi0KLQotLyogQXJjaGl0ZWN0dXJlIGZvciB3aGljaCB3ZSBhcmUgYXNzZW1ibGluZyAqLwotI2RlZmluZSBBUkNIX0FOWQkwCS8qIERlZmF1bHQ6IG5vIGFyY2hpdGVjdHVyZSBjaGVja2luZyBkb25lICovCi0jZGVmaW5lIEFSQ0hfS0EJCTEKLSNkZWZpbmUgQVJDSF9LQgkJMgotI2RlZmluZSBBUkNIX01DCQkzCi0jZGVmaW5lIEFSQ0hfQ0EJCTQKLSNkZWZpbmUgQVJDSF9KWAkJNQotI2RlZmluZSBBUkNIX0hYCQk2Ci1pbnQgYXJjaGl0ZWN0dXJlID0gQVJDSF9BTlk7CS8qIEFyY2hpdGVjdHVyZSByZXF1ZXN0ZWQgb24gaW52b2NhdGlvbiBsaW5lICovCi1pbnQgaWNsYXNzZXNfc2VlbjsJCS8qIE9SIG9mIGluc3RydWN0aW9uIGNsYXNzZXMgKElfKiBjb25zdGFudHMpCi0JCQkJICogICAgZm9yIHdoaWNoIHdlJ3ZlIGFjdHVhbGx5IGFzc2VtYmxlZAotCQkJCSAqICAgICAgaW5zdHJ1Y3Rpb25zLgotCQkJCSAqLwotCi0KLS8qIEJSQU5DSC1QUkVESUNUSU9OIElOU1RSVU1FTlRBVElPTgotCi0gICAgICAgIFRoZSBmb2xsb3dpbmcgc3VwcG9ydHMgZ2VuZXJhdGlvbiBvZiBicmFuY2gtcHJlZGljdGlvbiBpbnN0cnVtZW50YXRpb24KLSAgICAgICAgKHR1cm5lZCBvbiBieSAtYiBzd2l0Y2gpLiAgVGhlIGluc3RydW1lbnRhdGlvbiBjb2xsZWN0cyBjb3VudHMKLSAgICAgICAgb2YgYnJhbmNoZXMgdGFrZW4vbm90LXRha2VuIGZvciBsYXRlciBpbnB1dCB0byBhIHV0aWxpdHkgdGhhdCB3aWxsCi0gICAgICAgIHNldCB0aGUgYnJhbmNoIHByZWRpY3Rpb24gYml0cyBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGluIGFjY29yZGFuY2Ugd2l0aAotICAgICAgICB0aGUgYmVoYXZpb3Igb2JzZXJ2ZWQuICAoTm90ZSB0aGF0IHRoZSBLWCBzZXJpZXMgZG9lcyBub3QgaGF2ZQotICAgICAgICBicmFjaC1wcmVkaWN0aW9uLikKLQotICAgICAgICBUaGUgaW5zdHJ1bWVudGF0aW9uIGNvbnNpc3RzIG9mOgotCi0gICAgICAgICgxKSBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggY29uZGl0aW9uYWwgYnJhbmNoLCBhIGNhbGwgdG8gYW4gZXh0ZXJuYWwKLSAgICAgICAgICAgIHJvdXRpbmUgdGhhdCBpbmNyZW1lbnRzIGFuZCBzdGVwcyBvdmVyIGFuIGlubGluZSBjb3VudGVyLiAgVGhlCi0gICAgICAgICAgICBjb3VudGVyIGl0c2VsZiwgaW5pdGlhbGl6ZWQgdG8gMCwgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgY2FsbAotICAgICAgICAgICAgaW5zdHJ1Y3Rpb24uICBGb3IgZWFjaCBicmFuY2gsIHRoZSBjb3VudGVyIGZvbGxvd2luZyB0aGUgYnJhbmNoCi0gICAgICAgICAgICBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBicmFuY2ggd2FzIG5vdCB0YWtlbiwgYW5kIHRoZSBkaWZmZXJlbmNlCi0gICAgICAgICAgICBiZXR3ZWVuIHRoZSBjb3VudGVycyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIGl0IHdhcyB0YWtlbi4gIEFuCi0gICAgICAgICAgICBleGFtcGxlIG9mIGFuIGluc3RydW1lbnRlZCBjb25kaXRpb25hbCBicmFuY2g6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCAgICBCUl9DTlRfRlVOQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud29yZCAgIDAKLSAgICAgICAgICAgICAgICBMQlJBTkNIMjM6ICAgICAgYmUgICAgICBsYWJlbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsICAgIEJSX0NOVF9GVU5DCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53b3JkICAgMAotCi0gICAgICAgICgyKSBhIHRhYmxlIG9mIHBvaW50ZXJzIHRvIHRoZSBpbnN0cnVtZW50ZWQgYnJhbmNoZXMsIHNvIHRoYXQgYW4KLSAgICAgICAgICAgIGV4dGVybmFsIHBvc3Rwcm9jZXNzaW5nIHJvdXRpbmUgY2FuIGxvY2F0ZSBhbGwgb2YgdGhlIGNvdW50ZXJzLgotICAgICAgICAgICAgdGhlIHRhYmxlIGJlZ2lucyB3aXRoIGEgMi13b3JkIGhlYWRlcjogYSBwb2ludGVyIHRvIHRoZSBuZXh0IGluCi0gICAgICAgICAgICBhIGxpbmtlZCBsaXN0IG9mIHN1Y2ggdGFibGVzIChpbml0aWFsaXplZCB0byAwKTsgIGFuZCBhIGNvdW50Ci0gICAgICAgICAgICBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHRhYmxlIChleGNsdXNpdmUgb2YgdGhlIGhlYWRlci4KLQotICAgICAgICAgICAgTm90ZSB0aGF0IGlucHV0IHNvdXJjZSBjb2RlIGlzIGV4cGVjdGVkIHRvIGFscmVhZHkgY29udGFpbiBjYWxscwotICAgICAgICAgICAgYW4gZXh0ZXJuYWwgcm91dGluZSB0aGF0IHdpbGwgbGluayB0aGUgYnJhbmNoIGxvY2FsIHRhYmxlIGludG8gYQotICAgICAgICAgICAgbGlzdCBvZiBzdWNoIHRhYmxlcy4KLSAqLwotCi0vKiBOdW1iZXIgb2YgYnJhbmNoZXMgaW5zdHJ1bWVudGVkIHNvIGZhci4gIEFsc28gdXNlZCB0byBnZW5lcmF0ZQotICAgdW5pcXVlIGxvY2FsIGxhYmVscyBmb3IgZWFjaCBpbnN0cnVtZW50ZWQgYnJhbmNoLiAgKi8KLXN0YXRpYyBpbnQgYnJfY250OwotCi0jZGVmaW5lIEJSX0xBQkVMX0JBU0UJIkxCUkFOQ0giCi0vKiBCYXNlbmFtZSBvZiBsb2NhbCBsYWJlbHMgb24gaW5zdHJ1bWVudGVkIGJyYW5jaGVzLCB0byBhdm9pZAotICAgY29uZmxpY3Qgd2l0aCBjb21waWxlci0gZ2VuZXJhdGVkIGxvY2FsIGxhYmVscy4gICovCi0KLSNkZWZpbmUgQlJfQ05UX0ZVTkMJIl9faW5jX2JyYW5jaCIKLS8qIE5hbWUgb2YgdGhlIGV4dGVybmFsIHJvdXRpbmUgdGhhdCB3aWxsIGluY3JlbWVudCAoYW5kIHN0ZXAgb3ZlcikgYW4KLSAgIGlubGluZSBjb3VudGVyLiAgKi8KLQotI2RlZmluZSBCUl9UQUJfTkFNRQkiX19CUkFOQ0hfVEFCTEVfXyIKLS8qIE5hbWUgb2YgdGhlIHRhYmxlIG9mIHBvaW50ZXJzIHRvIGJyYW5jaGVzLiAgQSBsb2NhbCAoaS5lLiwKLSAgIG5vbi1leHRlcm5hbCkgc3ltYm9sLiAgKi8KLQwKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfYmVnaW46ICBPbmUtdGltZSBpbml0aWFsaXphdGlvbi4KLQotICAJU2V0IHVwIGhhc2ggdGFibGVzLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgaW50IGk7CQkJLyogTG9vcCBjb3VudGVyICovCi0gIGNvbnN0IHN0cnVjdCBpOTYwX29wY29kZSAqb1A7CS8qIFBvaW50ZXIgaW50byBvcGNvZGUgdGFibGUgKi8KLSAgY29uc3QgY2hhciAqcmV0dmFsOwkJLyogVmFsdWUgcmV0dXJuZWQgYnkgaGFzaCBmdW5jdGlvbnMgKi8KLQotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIHJlZ19oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIGFyZWdfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIGJhc2UgYXNzZW1ibGVyIHVzZXMgYW4gZW1wdHkgc3RyaW5nIGZvciAibm8KLSAgICAgZXJyb3IgbWVzc2FnZSIsIGluc3RlYWQgb2YgYSBOVUxMIHBvaW50ZXIuICAqLwotICByZXR2YWwgPSAwOwotCi0gIGZvciAob1AgPSBpOTYwX29wY29kZXM7IG9QLT5uYW1lICYmICFyZXR2YWw7IG9QKyspCi0gICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIG9QLT5uYW1lLCAoUFRSKSBvUCk7Ci0KLSAgZm9yIChpID0gMDsgcmVnbmFtZXNbaV0ucmVnX25hbWUgJiYgIXJldHZhbDsgaSsrKQotICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChyZWdfaGFzaCwgcmVnbmFtZXNbaV0ucmVnX25hbWUsCi0JCQkgIChjaGFyICopICZyZWduYW1lc1tpXS5yZWdfbnVtKTsKLQotICBmb3IgKGkgPSAwOyBhcmVnc1tpXS5hcmVnX25hbWUgJiYgIXJldHZhbDsgaSsrKQotICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChhcmVnX2hhc2gsIGFyZWdzW2ldLmFyZWdfbmFtZSwKLQkJCSAgKGNoYXIgKikgJmFyZWdzW2ldLmFyZWdfbnVtKTsKLQotICBpZiAocmV0dmFsKQotICAgIGFzX2ZhdGFsIChfKCJIYXNoaW5nIHJldHVybmVkIFwiJXNcIi4iKSwgcmV0dmFsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9hc3NlbWJsZTogIEFzc2VtYmxlIGFuIGluc3RydWN0aW9uCi0KLSAgIEFzc3VtcHRpb25zIGFib3V0IHRoZSBwYXNzZWQtaW4gdGV4dDoKLSAgCS0gYWxsIGNvbW1lbnRzLCBsYWJlbHMgcmVtb3ZlZAotICAJLSB0ZXh0IGlzIGFuIGluc3RydWN0aW9uCi0gIAktIGFsbCB3aGl0ZSBzcGFjZSBjb21wcmVzc2VkIHRvIHNpbmdsZSBibGFua3MKLSAgCS0gYWxsIGNoYXJhY3RlciBjb25zdGFudHMgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggZGVjaW1hbAotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotdm9pZAotbWRfYXNzZW1ibGUgKHRleHRQKQotICAgICBjaGFyICp0ZXh0UDsJCS8qIFNvdXJjZSB0ZXh0IG9mIGluc3RydWN0aW9uICovCi17Ci0gIC8qIFBhcnNlZCBpbnN0cnVjdGlvbiB0ZXh0LCBjb250YWluaW5nIE5PIHdoaXRlc3BhY2U6IGFyZ1swXS0+b3Bjb2RlCi0gICAgIG1uZW1vbmljIGFyZ1sxLTNdLT5vcGVyYW5kcywgd2l0aCBjaGFyIGNvbnN0YW50cyByZXBsYWNlZCBieQotICAgICBkZWNpbWFsIG51bWJlcnMuICAqLwotICBjaGFyICphcmdzWzRdOwotCi0gIGludCBuX29wczsJCQkvKiBOdW1iZXIgb2YgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMgKi8KLSAgLyogUG9pbnRlciB0byBpbnN0cnVjdGlvbiBkZXNjcmlwdGlvbiAqLwotICBzdHJ1Y3QgaTk2MF9vcGNvZGUgKm9QOwotICAvKiBUUlVFIGlmZiBvcGNvZGUgbW5lbW9uaWMgaW5jbHVkZWQgYnJhbmNoLXByZWRpY3Rpb24gc3VmZml4ICgiLmYiCi0gICAgIG9yICIudCIpLiAgKi8KLSAgaW50IGJyYW5jaF9wcmVkaWN0OwotICAvKiBTZXR0aW5nIG9mIGJyYW5jaC1wcmVkaWN0aW9uIGJpdChzKSB0byBiZSBPUidkIGludG8gaW5zdHJ1Y3Rpb24KLSAgICAgb3Bjb2RlIG9mIENUUkwvQ09CUiBmb3JtYXQgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgbG9uZyBicF9iaXRzOwotCi0gIGludCBuOwkJCS8qIE9mZnNldCBvZiBsYXN0IGNoYXJhY3RlciBpbiBvcGNvZGUgbW5lbW9uaWMgKi8KLQotICBjb25zdCBjaGFyICpicF9lcnJvcl9tc2cgPSBfKCJicmFuY2ggcHJlZGljdGlvbiBpbnZhbGlkIG9uIHRoaXMgb3Bjb2RlIik7Ci0KLQotICAvKiBQYXJzZSBpbnN0cnVjdGlvbiBpbnRvIG9wY29kZSBhbmQgb3BlcmFuZHMgKi8KLSAgbWVtc2V0IChhcmdzLCAnXDAnLCBzaXplb2YgKGFyZ3MpKTsKLSAgbl9vcHMgPSBpX3NjYW4gKHRleHRQLCBhcmdzKTsKLSAgaWYgKG5fb3BzID09IC0xKQotICAgIHsKLSAgICAgIHJldHVybjsJCQkvKiBFcnJvciBtZXNzYWdlIGFscmVhZHkgaXNzdWVkICovCi0gICAgfQotCi0gIC8qIERvICJtYWNybyBzdWJzdGl0dXRpb24iIChzb3J0IG9mKSBvbiAnbGRjb25zdCcgcHNldWRvLWluc3RydWN0aW9uICovCi0gIGlmICghc3RyY21wIChhcmdzWzBdLCAibGRjb25zdCIpKQotICAgIHsKLSAgICAgIG5fb3BzID0gcGFyc2VfbGRjb25zdCAoYXJncyk7Ci0gICAgICBpZiAobl9vcHMgPT0gLTEpCi0JewotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLQotCi0gIC8qIENoZWNrIGZvciBicmFuY2gtcHJlZGljdGlvbiBzdWZmaXggb24gb3Bjb2RlIG1uZW1vbmljLCBzdHJpcCBpdCBvZmYgKi8KLSAgbiA9IHN0cmxlbiAoYXJnc1swXSkgLSAxOwotICBicmFuY2hfcHJlZGljdCA9IDA7Ci0gIGJwX2JpdHMgPSAwOwotICBpZiAoYXJnc1swXVtuIC0gMV0gPT0gJy4nICYmIChhcmdzWzBdW25dID09ICd0JyB8fCBhcmdzWzBdW25dID09ICdmJykpCi0gICAgewotICAgICAgLyogV2UgY291bGQgY2hlY2sgaGVyZSB0byBzZWUgaWYgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUKLQkgc3VwcG9ydHMgYnJhbmNoIHByZWRpY3Rpb24sIGJ1dCB3aHkgYm90aGVyPyAgVGhlIGJpdCB3aWxsCi0JIGp1c3QgYmUgaWdub3JlZCBieSBwcm9jZXNzb3JzIHRoYXQgZG9uJ3QgdXNlIGl0LiAgKi8KLSAgICAgIGJyYW5jaF9wcmVkaWN0ID0gMTsKLSAgICAgIGJwX2JpdHMgPSAoYXJnc1swXVtuXSA9PSAndCcpID8gQlBfVEFLRU4gOiBCUF9OT1RfVEFLRU47Ci0gICAgICBhcmdzWzBdW24gLSAxXSA9ICdcMCc7CS8qIFN0cmlwIHN1ZmZpeCBmcm9tIG9wY29kZSBtbmVtb25pYyAqLwotICAgIH0KLQotICAvKiBMb29rIHVwIG9wY29kZSBtbmVtb25pYyBpbiB0YWJsZSBhbmQgY2hlY2sgbnVtYmVyIG9mIG9wZXJhbmRzLgotICAgICBDaGVjayB0aGF0IG9wY29kZSBpcyBsZWdhbCBmb3IgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuICBJZiBhbGwKLSAgICAgbG9va3MgZ29vZCwgYXNzZW1ibGUgaW5zdHJ1Y3Rpb24uICAqLwotICBvUCA9IChzdHJ1Y3QgaTk2MF9vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBhcmdzWzBdKTsKLSAgaWYgKCFvUCB8fCAhdGFyZ19oYXNfaWNsYXNzIChvUC0+aWNsYXNzKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgb3Bjb2RlLCBcIiVzXCIuIiksIGFyZ3NbMF0pOwotCi0gICAgfQotICBlbHNlIGlmIChuX29wcyAhPSBvUC0+bnVtX29wcykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImltcHJvcGVyIG51bWJlciBvZiBvcGVyYW5kcy4gIGV4cGVjdGluZyAlZCwgZ290ICVkIiksCi0JICAgICAgb1AtPm51bV9vcHMsIG5fb3BzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9QLT5mb3JtYXQpCi0JewotCWNhc2UgRkJSQToKLQljYXNlIENUUkw6Ci0JICBjdHJsX2ZtdCAoYXJnc1sxXSwgb1AtPm9wY29kZSB8IGJwX2JpdHMsIG9QLT5udW1fb3BzKTsKLQkgIGlmIChvUC0+Zm9ybWF0ID09IEZCUkEpCi0JICAgIHsKLQkgICAgICAvKiBOb3cgZ2VuZXJhdGUgYSAnYm5vJyB0byBzYW1lIGFyZyAqLwotCSAgICAgIGN0cmxfZm10IChhcmdzWzFdLCBCTk8gfCBicF9iaXRzLCAxKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDT0JSOgotCWNhc2UgQ09KOgotCSAgY29icl9mbXQgKGFyZ3MsIG9QLT5vcGNvZGUgfCBicF9iaXRzLCBvUCk7Ci0JICBicmVhazsKLQljYXNlIFJFRzoKLQkgIGlmIChicmFuY2hfcHJlZGljdCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKGJwX2Vycm9yX21zZyk7Ci0JICAgIH0KLQkgIHJlZ19mbXQgKGFyZ3MsIG9QKTsKLQkgIGJyZWFrOwotCWNhc2UgTUVNMToKLQkgIGlmIChhcmdzWzBdWzBdID09ICdjJyAmJiBhcmdzWzBdWzFdID09ICdhJykKLQkgICAgewotCSAgICAgIGlmIChicmFuY2hfcHJlZGljdCkKLQkJewotCQkgIGFzX3dhcm4gKGJwX2Vycm9yX21zZyk7Ci0JCX0KLQkgICAgICBtZW1fZm10IChhcmdzLCBvUCwgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQljYXNlIE1FTTI6Ci0JY2FzZSBNRU00OgotCWNhc2UgTUVNODoKLQljYXNlIE1FTTEyOgotCWNhc2UgTUVNMTY6Ci0JICBpZiAoYnJhbmNoX3ByZWRpY3QpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChicF9lcnJvcl9tc2cpOwotCSAgICB9Ci0JICBtZW1fZm10IChhcmdzLCBvUCwgMCk7Ci0JICBicmVhazsKLQljYXNlIENBTExKOgotCSAgaWYgKGJyYW5jaF9wcmVkaWN0KQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoYnBfZXJyb3JfbXNnKTsKLQkgICAgfQotCSAgLyogT3V0cHV0IG9wY29kZSAmIHNldCB1cCAiZml4dXAiIChyZWxvY2F0aW9uKTsgZmxhZwotCSAgICAgcmVsb2NhdGlvbiBhcyAnY2FsbGonIHR5cGUuICAqLwotCSAga25vdyAob1AtPm51bV9vcHMgPT0gMSk7Ci0JICBnZXRfY2Rpc3AgKGFyZ3NbMV0sICJDVFJMIiwgb1AtPm9wY29kZSwgMjQsIDAsIDEpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIEJBRF9DQVNFIChvUC0+Zm9ybWF0KTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19CQkJCS8qIG1kX2Fzc2VtYmxlKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9udW1iZXJfdG9fY2hhcnM6ICBjb252ZXJ0IGEgbnVtYmVyIHRvIHRhcmdldCBieXRlIG9yZGVyCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbHVlOwotICAgICBpbnQgbjsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoYnVmLCB2YWx1ZSwgbik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfY2hhcnNfdG9fbnVtYmVyOiAgY29udmVydCBmcm9tIHRhcmdldCBieXRlIG9yZGVyIHRvIGhvc3QgYnl0ZSBvcmRlci4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLWludAotbWRfY2hhcnNfdG9fbnVtYmVyICh2YWwsIG4pCi0gICAgIHVuc2lnbmVkIGNoYXIgKnZhbDsJLyogVmFsdWUgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICAgaW50IG47CQkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBpbnB1dCAqLwotewotICBpbnQgcmV0dmFsOwotCi0gIGZvciAocmV0dmFsID0gMDsgbi0tOykKLSAgICB7Ci0gICAgICByZXR2YWwgPDw9IDg7Ci0gICAgICByZXR2YWwgfD0gdmFsW25dOwotICAgIH0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TCTYKLSNkZWZpbmUgTE5VTV9TSVpFCXNpemVvZihMSVRUTEVOVU1fVFlQRSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9hdG9mOgljb252ZXJ0IGFzY2lpIHRvIGZsb2F0aW5nIHBvaW50Ci0KLSAgIFR1cm4gYSBzdHJpbmcgYXQgaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICAndHlwZScsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgYXQgKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgcmV0dXJuZWQgYXQgJ3NpemVQJy4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIGEgcG9pbnRlcgotICAgdG8gYW4gZW1wdHkgbWVzc2FnZSBpZiBPSy4KLQotICAgTm90ZSB3ZSBjYWxsIHRoZSBpMzg2IGZsb2F0aW5nIHBvaW50IHJvdXRpbmUsIHJhdGhlciB0aGFuIGNvbXBsaWNhdGluZwotICAgdGhpbmdzIHdpdGggbW9yZSBmaWxlcyBvciBzeW1ib2xpYyBsaW5rcy4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgaW50IHByZWM7Ci0gIGNoYXIgKnQ7Ci0gIGNoYXIgKmF0b2ZfaWVlZSAoKTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3QnOgotICAgIGNhc2UgJ1QnOgotICAgICAgcHJlYyA9IDU7Ci0gICAgICB0eXBlID0gJ3gnOwkJLyogVGhhdCdzIHdoYXQgYXRvZl9pZWVlKCkgdW5kZXJzdGFuZHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gbWRfYXRvZigpIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAgIH0KLQotICAqc2l6ZVAgPSBwcmVjICogTE5VTV9TSVpFOwotCi0gIC8qIE91dHB1dCB0aGUgTElUVExFTlVNcyBpbiBSRVZFUlNFIG9yZGVyIGluIGFjY29yZCB3aXRoIGk4MDk2MAotICAgICB3b3JkLW9yZGVyLiAgKER1bm5vIHdoeSBhdG9mX2llZWUgZG9lc24ndCBkbyBpdCBpbiB0aGUgcmlnaHQKLSAgICAgb3JkZXIgaW4gdGhlIGZpcnN0IHBsYWNlIC0tIHByb2JhYmx5IGJlY2F1c2UgaXQncyBhIGhhY2sgb2YKLSAgICAgYXRvZl9tNjhrLikgICovCi0KLSAgZm9yICh3b3JkUCA9IHdvcmRzICsgcHJlYyAtIDE7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAobG9uZykgKCp3b3JkUC0tKSwgTE5VTV9TSVpFKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfbnVtYmVyX3RvX2ltbQotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2ltbSAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgbG9uZyB2YWw7Ci0gICAgIGludCBuOwotewotICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX251bWJlcl90b19kaXNwCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1tZF9udW1iZXJfdG9fZGlzcCAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgbG9uZyB2YWw7Ci0gICAgIGludCBuOwotewotICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9udW1iZXJfdG9fZmllbGQ6Ci0KLSAgCVN0aWNrIGEgdmFsdWUgKGFuIGFkZHJlc3MgZml4dXApIGludG8gYSBiaXQgZmllbGQgb2YKLSAgCXByZXZpb3VzbHktZ2VuZXJhdGVkIGluc3RydWN0aW9uLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2ZpZWxkIChpbnN0clAsIHZhbCwgYmZpeFApCi0gICAgIGNoYXIgKmluc3RyUDsJCS8qIFBvaW50ZXIgdG8gaW5zdHJ1Y3Rpb24gdG8gYmUgZml4ZWQgKi8KLSAgICAgbG9uZyB2YWw7CQkJLyogQWRkcmVzcyBmaXh1cCB2YWx1ZSAqLwotICAgICBiaXRfZml4UyAqYmZpeFA7CQkvKiBEZXNjcmlwdGlvbiBvZiBiaXQgZmllbGQgdG8gYmUgZml4ZWQgdXAgKi8KLXsKLSAgaW50IG51bWJpdHM7CQkJLyogTGVuZ3RoIG9mIGJpdCBmaWVsZCB0byBiZSBmaXhlZCAqLwotICBsb25nIGluc3RyOwkJCS8qIDMyLWJpdCBpbnN0cnVjdGlvbiB0byBiZSBmaXhlZC11cCAqLwotICBsb25nIHNpZ247CQkJLyogMCBvciAtMSwgYWNjb3JkaW5nIHRvIHNpZ24gYml0IG9mICd2YWwnICovCi0KLSAgLyogQ29udmVydCBpbnN0cnVjdGlvbiBiYWNrIHRvIGhvc3QgYnl0ZSBvcmRlci4gICovCi0gIGluc3RyID0gbWRfY2hhcnNfdG9fbnVtYmVyIChpbnN0clAsIDQpOwotCi0gIC8qIFN1cnByaXNlISAtLSB3ZSBzdG9yZWQgdGhlIG51bWJlciBvZiBiaXRzIHRvIGJlIG1vZGlmaWVkIHJhdGhlcgotICAgICB0aGFuIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZS4gICovCi0gIG51bWJpdHMgPSAoaW50KSBiZml4UDsKLSAgaWYgKG51bWJpdHMgPT0gMSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgbm8tb3AsIHN0dWNrIGhlcmUgYnkgcmVsb2NfY2FsbGooKSAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBrbm93ICgobnVtYml0cyA9PSAxMykgfHwgKG51bWJpdHMgPT0gMjQpKTsKLQotICAvKiBQcm9wYWdhdGUgc2lnbiBiaXQgb2YgJ3ZhbCcgZm9yIHRoZSBnaXZlbiBudW1iZXIgb2YgYml0cy4gIFJlc3VsdAotICAgICBzaG91bGQgYmUgYWxsIDAgb3IgYWxsIDEuICAqLwotICBzaWduID0gdmFsID4+ICgoaW50KSBudW1iaXRzIC0gMSk7Ci0gIGlmICgoKHZhbCA8IDApICYmIChzaWduICE9IC0xKSkKLSAgICAgIHx8ICgodmFsID4gMCkgJiYgKHNpZ24gIT0gMCkpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRml4dXAgb2YgJWxkIHRvbyBsYXJnZSBmb3IgZmllbGQgd2lkdGggb2YgJWQiKSwKLQkgICAgICB2YWwsIG51bWJpdHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFB1dCBiaXQgZmllbGQgaW50byBpbnN0cnVjdGlvbiBhbmQgd3JpdGUgYmFjayBpbiB0YXJnZXQKLSAgICAgICAgICogYnl0ZSBvcmRlci4KLSAgICAgICAqLwotICAgICAgdmFsICY9IH4oLTEgPDwgKGludCkgbnVtYml0cyk7CS8qIENsZWFyIHVudXNlZCBzaWduIGJpdHMgKi8KLSAgICAgIGluc3RyIHw9IHZhbDsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoaW5zdHJQLCBpbnN0ciwgNCk7Ci0gICAgfQotfQkJCQkvKiBtZF9udW1iZXJfdG9fZmllbGQoKSAqLwotDAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX3BhcnNlX29wdGlvbgotICAJSW52b2NhdGlvbiBsaW5lIGluY2x1ZGVzIGEgc3dpdGNoIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBiYXNlIGFzc2VtYmxlci4KLSAgCVNlZSBpZiBpdCdzIGEgcHJvY2Vzc29yLXNwZWNpZmljIG9wdGlvbi4gIEZvciB0aGUgOTYwLCB0aGVzZSBhcmU6Ci0KLSAgCS1ub3JlbGF4OgotICAJCUNvbmRpdGlvbmFsIGJyYW5jaCBpbnN0cnVjdGlvbnMgdGhhdCByZXF1aXJlIGRpc3BsYWNlbWVudHMKLSAgCQlncmVhdGVyIHRoYW4gMTMgYml0cyAob3IgdGhhdCBoYXZlIGV4dGVybmFsIHRhcmdldHMpIHNob3VsZAotICAJCWdlbmVyYXRlIGVycm9ycy4gIFRoZSBkZWZhdWx0IGlzIHRvIHJlcGxhY2UgZWFjaCBzdWNoCi0gIAkJaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgY29ycmVzcG9uZGluZyBjb21wYXJlIChvciBjaGtiaXQpIGFuZAotICAJCWJyYW5jaCBpbnN0cnVjdGlvbnMuICBOb3RlIHRoYXQgdGhlIEludGVsICJqIiBjb2JyIGRpcmVjdGl2ZXMKLSAgCQlhcmUgQUxXQVlTICJkZS1vcHRpbWl6ZWQiIGluIHRoaXMgd2F5IHdoZW4gbmVjZXNzYXJ5LAotICAJCXJlZ2FyZGxlc3Mgb2YgdGhlIHNldHRpbmcgb2YgdGhpcyBvcHRpb24uCi0KLSAgCS1iOgotICAJCUFkZCBjb2RlIHRvIGNvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQgYnJhbmNoZXMgdGFrZW4sIGZvcgotICAJCWxhdGVyIG9wdGltaXphdGlvbiBvZiBicmFuY2ggcHJlZGljdGlvbiBiaXRzIGJ5IGEgc2VwYXJhdGUKLSAgCQl0b29sLiAgQ09CUiBhbmQgQ05UTCBmb3JtYXQgaW5zdHJ1Y3Rpb25zIGhhdmUgYnJhbmNoCi0gIAkJcHJlZGljdGlvbiBiaXRzIChpbiB0aGUgQ1ggYXJjaGl0ZWN0dXJlKTsgIGlmICJCUiIgcmVwcmVzZW50cwotICAJCWFuIGluc3RydWN0aW9uIGluIG9uZSBvZiB0aGVzZSBjbGFzc2VzLCB0aGUgZm9sbG93aW5nIHJlcC0KLSAgCQlyZXNlbnRzIHRoZSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyOgotCi0gIAkJCWNhbGwJPGluY3JlbWVudCByb3V0aW5lPgotICAJCQkud29yZAkwCSMgcHJlLWNvdW50ZXIKLSAgCQlMYWJlbDogIEJSCi0gIAkJCWNhbGwJPGluY3JlbWVudCByb3V0aW5lPgotICAJCQkud29yZAkwCSMgcG9zdC1jb3VudGVyCi0KLSAgCQlBIHRhYmxlIG9mIGFsbCBzdWNoICJMYWJlbHMiIGlzIGFsc28gZ2VuZXJhdGVkLgotCi0KLSAgCS1BS0EsIC1BS0IsIC1BS0MsIC1BU0EsIC1BU0IsIC1BTUMsIC1BQ0E6Ci0gIAkJU2VsZWN0IHRoZSA4MDk2MCBhcmNoaXRlY3R1cmUuICBJbnN0cnVjdGlvbnMgb3IgZmVhdHVyZXMgbm90Ci0gIAkJc3VwcG9ydGVkIGJ5IHRoZSBzZWxlY3RlZCBhcmNoaXRlY3R1cmUgY2F1c2UgZmF0YWwgZXJyb3JzLgotICAJCVRoZSBkZWZhdWx0IGlzIHRvIGdlbmVyYXRlIGNvZGUgZm9yIGFueSBpbnN0cnVjdGlvbiBvciBmZWF0dXJlCi0gIAkJdGhhdCBpcyBzdXBwb3J0ZWQgYnkgU09NRSB2ZXJzaW9uIG9mIHRoZSA5NjAgKGV2ZW4gaWYgdGhpcwotICAJCW1lYW5zIG1peGluZyBhcmNoaXRlY3R1cmVzISkuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIkE6YiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotI2RlZmluZSBPUFRJT05fTElOS1JFTEFYIChPUFRJT05fTURfQkFTRSkKLSAgeyJsaW5rcmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJTktSRUxBWH0sCi0gIHsibGluay1yZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElOS1JFTEFYfSwKLSNkZWZpbmUgT1BUSU9OX05PUkVMQVggKE9QVElPTl9NRF9CQVNFICsgMSkKLSAgeyJub3JlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT1JFTEFYfSwKLSAgeyJuby1yZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9SRUxBWH0sCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOwotCi1zdHJ1Y3QgdGFiZW50cnkKLSAgewotICAgIGNoYXIgKmZsYWc7Ci0gICAgaW50IGFyY2g7Ci0gIH07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHRhYmVudHJ5IGFyY2hfdGFiW10gPQotewotICB7IktBIiwgQVJDSF9LQX0sCi0gIHsiS0IiLCBBUkNIX0tCfSwKLSAgeyJTQSIsIEFSQ0hfS0F9LAkJLyogU3lub255bSBmb3IgS0EgKi8KLSAgeyJTQiIsIEFSQ0hfS0J9LAkJLyogU3lub255bSBmb3IgS0IgKi8KLSAgeyJLQyIsIEFSQ0hfTUN9LAkJLyogU3lub255bSBmb3IgTUMgKi8KLSAgeyJNQyIsIEFSQ0hfTUN9LAotICB7IkNBIiwgQVJDSF9DQX0sCi0gIHsiSlgiLCBBUkNIX0pYfSwKLSAgeyJIWCIsIEFSQ0hfSFh9LAotICB7TlVMTCwgMH0KLX07Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSBPUFRJT05fTElOS1JFTEFYOgotICAgICAgbGlua3JlbGF4ID0gMTsKLSAgICAgIGZsYWdfa2VlcF9sb2NhbHMgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT1JFTEFYOgotICAgICAgbm9yZWxheCA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2InOgotICAgICAgaW5zdHJ1bWVudF9icmFuY2hlcyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0EnOgotICAgICAgewotCWNvbnN0IHN0cnVjdCB0YWJlbnRyeSAqdHA7Ci0JY2hhciAqcCA9IGFyZzsKLQotCWZvciAodHAgPSBhcmNoX3RhYjsgdHAtPmZsYWcgIT0gTlVMTDsgdHArKykKLQkgIGlmICghc3RyY21wIChwLCB0cC0+ZmxhZykpCi0JICAgIGJyZWFrOwotCi0JaWYgKHRwLT5mbGFnID09IE5VTEwpCi0JICB7Ci0JICAgIGFzX2JhZCAoXygiaW52YWxpZCBhcmNoaXRlY3R1cmUgJXMiKSwgcCk7Ci0JICAgIHJldHVybiAwOwotCSAgfQotCWVsc2UKLQkgIGFyY2hpdGVjdHVyZSA9IHRwLT5hcmNoOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgaW50IGk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiSTk2MCBvcHRpb25zOlxuIikpOwotICBmb3IgKGkgPSAwOyBhcmNoX3RhYltpXS5mbGFnOyBpKyspCi0gICAgZnByaW50ZiAoc3RyZWFtLCAiJXMtQSVzIiwgaSA/ICIgfCAiIDogIiIsIGFyY2hfdGFiW2ldLmZsYWcpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlxuXAotCQkJc3BlY2lmeSB2YXJpYW50IG9mIDk2MCBhcmNoaXRlY3R1cmVcblwKLS1iCQkJYWRkIGNvZGUgdG8gY29sbGVjdCBzdGF0aXN0aWNzIGFib3V0IGJyYW5jaGVzIHRha2VuXG5cCi0tbGluay1yZWxheAkJcHJlc2VydmUgaW5kaXZpZHVhbCBhbGlnbm1lbnQgZGlyZWN0aXZlcyBzbyBsaW5rZXJcblwKLQkJCWNhbiBkbyByZWxheGluZyAoYi5vdXQgZm9ybWF0IG9ubHkpXG5cCi0tbm8tcmVsYXgJCWRvbid0IGFsdGVyIGNvbXBhcmUtYW5kLWJyYW5jaCBpbnN0cnVjdGlvbnMgZm9yXG5cCi0JCQlsb25nIGRpc3BsYWNlbWVudHNcbiIpKTsKLX0KLQwKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX2NvbnZlcnRfZnJhZzoKLSAgCUNhbGxlZCBieSBiYXNlIGFzc2VtYmxlciBhZnRlciBhZGRyZXNzIHJlbGF4YXRpb24gaXMgZmluaXNoZWQ6ICBtb2RpZnkKLSAgCXZhcmlhYmxlIGZyYWdtZW50cyBhY2NvcmRpbmcgdG8gaG93IG11Y2ggcmVsYXhhdGlvbiB3YXMgZG9uZS4KLQotICAJSWYgdGhlIGZyYWdtZW50IHN1YnN0YXRlIGlzIHN0aWxsIDEsIGEgMTMtYml0IGRpc3BsYWNlbWVudCB3YXMgZW5vdWdoCi0gIAl0byByZWFjaCB0aGUgc3ltYm9sIGluIHF1ZXN0aW9uLiAgU2V0IHVwIGFuIGFkZHJlc3MgZml4dXAsIGJ1dCBvdGhlcndpc2UKLSAgCWxlYXZlIHRoZSBjb2JyIGluc3RydWN0aW9uIGFsb25lLgotCi0gIAlJZiB0aGUgZnJhZ21lbnQgc3Vic3RhdGUgaXMgMiwgYSAxMy1iaXQgZGlzcGxhY2VtZW50IHdhcyBub3QgZW5vdWdoLgotICAJUmVwbGFjZSB0aGUgY29iciB3aXRoIGEgdHdvIGluc3RydWN0aW9ucyAoYSBjb21wYXJlIGFuZCBhIGJyYW5jaCkuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBmaXhTICpmaXhQOwkJCS8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIG5lZWRlZCBhZGRyZXNzIGZpeCAqLwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIC8qIExFQVZFIFNJTkdMRSBDT0JSIElOU1RSVUNUSU9OICovCi0gICAgICBmaXhQID0gZml4X25ldyAoZnJhZ1AsCi0JCSAgICAgIGZyYWdQLT5mcl9vcGNvZGUgLSBmcmFnUC0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgNCwKLQkJICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICAgZnJhZ1AtPmZyX29mZnNldCwKLQkJICAgICAgMSwKLQkJICAgICAgTk9fUkVMT0MpOwotCi0gICAgICBmaXhQLT5meF9iaXRfZml4UCA9IChiaXRfZml4UyAqKSAxMzsJLyogc2l6ZSBvZiBiaXQgZmllbGQgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIC8qIFJFUExBQ0UgQ09CUiBXSVRIIENPTVBBUkUvQlJBTkNIIElOU1RSVUNUSU9OUyAqLwotICAgICAgcmVsYXhfY29iciAoZnJhZ1ApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEJBRF9DQVNFIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXg6ICBIb3cgbXVjaCBkb2VzIGl0IGxvb2sgbGlrZSAqZnJhZ1Agd2lsbCBncm93PwotCi0gIAlDYWxsZWQgYnkgYmFzZSBhc3NlbWJsZXIganVzdCBiZWZvcmUgYWRkcmVzcyByZWxheGF0aW9uLgotICAJUmV0dXJuIHRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIGZyYWdtZW50IHdpbGwgZ3Jvdy4KLQotICAJQW55IHN5bWJvbCB0aGF0IGlzIG5vdyB1bmRlZmluZWQgd2lsbCBub3QgYmVjb21lIGRlZmluZWQ7IGNvYnIncwotICAJYmFzZWQgb24gdW5kZWZpbmVkIHN5bWJvbHMgd2lsbCBoYXZlIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBjb21wYXJlCi0gIAlpbnN0cnVjdGlvbiBhbmQgYSBicmFuY2ggaW5zdHJ1Y3Rpb24sIGFuZCB0aGUgY29kZSBmcmFnbWVudCB3aWxsIGdyb3cKLSAgCWJ5IDQgYnl0ZXMuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudF90eXBlOwotewotICAvKiBJZiBzeW1ib2wgaXMgdW5kZWZpbmVkIGluIHRoaXMgc2VnbWVudCwgZ28gdG8gInJlbGF4ZWQiIHN0YXRlCi0gICAgIChjb21wYXJlIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zIGluc3RlYWQgb2YgY29icikgcmlnaHQgbm93LiAgKi8KLSAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlZ21lbnRfdHlwZSkKLSAgICB7Ci0gICAgICByZWxheF9jb2JyIChmcmFnUCk7Ci0gICAgICByZXR1cm4gNDsKLSAgICB9Ci0gIHJldHVybiAwOwotfQkJCQkvKiBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9yaV90b19jaGFyczoKLSAgCVRoaXMgcm91dGluZSBleGlzdHMgaW4gb3JkZXIgdG8gb3ZlcmNvbWUgbWFjaGluZSBieXRlLW9yZGVyIHByb2JsZW1zCi0gIAl3aGVuIGRlYWxpbmcgd2l0aCBiaXQtZmllbGQgZW50cmllcyBpbiB0aGUgcmVsb2NhdGlvbl9pbmZvIHN0cnVjdC4KLQotICAJQnV0IHJlbG9jYXRpb24gaW5mbyB3aWxsIGJlIHVzZWQgb24gdGhlIGhvc3QgbWFjaGluZSBvbmx5IChvbmx5Ci0gIAlleGVjdXRhYmxlIGNvZGUgaXMgYWN0dWFsbHkgZG93bmxvYWRlZCB0byB0aGUgaTgwOTYwKS4gIFRoZXJlZm9yZSwKLSAgCXdlIGxlYXZlIGl0IGluIGhvc3QgYnl0ZSBvcmRlci4KLQotICAJVGhlIGFib3ZlIGNvbW1lbnQgaXMgbm8gbG9uZ2VyIHRydWUuICBUaGlzIHJvdXRpbmUgbm93IHJlYWxseQotICAJZG9lcyBkbyB0aGUgcmVvcmRlcmluZyAoSWFuIFRheWxvciAyOCBBdWcgOTIpLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotdm9pZAotbWRfcmlfdG9fY2hhcnMgKHdoZXJlLCByaSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIHN0cnVjdCByZWxvY2F0aW9uX2luZm8gKnJpOwotewotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLCByaS0+cl9hZGRyZXNzLAotCQkgICAgICBzaXplb2YgKHJpLT5yX2FkZHJlc3MpKTsKLSAgd2hlcmVbNF0gPSByaS0+cl9pbmRleCAmIDB4MGZmOwotICB3aGVyZVs1XSA9IChyaS0+cl9pbmRleCA+PiA4KSAmIDB4MGZmOwotICB3aGVyZVs2XSA9IChyaS0+cl9pbmRleCA+PiAxNikgJiAweDBmZjsKLSAgd2hlcmVbN10gPSAoKHJpLT5yX3BjcmVsIDw8IDApCi0JICAgICAgfCAocmktPnJfbGVuZ3RoIDw8IDEpCi0JICAgICAgfCAocmktPnJfZXh0ZXJuIDw8IDMpCi0JICAgICAgfCAocmktPnJfYnNyIDw8IDQpCi0JICAgICAgfCAocmktPnJfZGlzcCA8PCA1KQotCSAgICAgIHwgKHJpLT5yX2NhbGxqIDw8IDYpKTsKLX0KLQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQwKLS8qIEZPTExPV0lORyBBUkUgVEhFIExPQ0FMIFJPVVRJTkVTLCBJTiBBTFBIQUJFVElDQUwgT1JERVIgICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgYnJjbnRfZW1pdDoJRW1pdCBjb2RlIHRvIGluY3JlbWVudCBpbmxpbmUgYnJhbmNoIGNvdW50ZXIuCi0KLSAgCVNlZSB0aGUgY29tbWVudHMgYWJvdmUgdGhlIGRlY2xhcmF0aW9uIG9mICdicl9jbnQnIGZvciBkZXRhaWxzIG9uCi0gIAlicmFuY2gtcHJlZGljdGlvbiBpbnN0cnVtZW50YXRpb24uCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIHZvaWQKLWJyY250X2VtaXQgKCkKLXsKLSAgY3RybF9mbXQgKEJSX0NOVF9GVU5DLCBDQUxMLCAxKTsJLyogRW1pdCBjYWxsIHRvICJpbmNyZW1lbnQiIHJvdXRpbmUgKi8KLSAgZW1pdCAoMCk7CQkJLyogRW1pdCBpbmxpbmUgY291bnRlciB0byBiZSBpbmNyZW1lbnRlZCAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGJybGFiX25leHQ6CWdlbmVyYXRlIHRoZSBuZXh0IGJyYW5jaCBsb2NhbCBsYWJlbAotCi0gIAlTZWUgdGhlIGNvbW1lbnRzIGFib3ZlIHRoZSBkZWNsYXJhdGlvbiBvZiAnYnJfY250JyBmb3IgZGV0YWlscyBvbgotICAJYnJhbmNoLXByZWRpY3Rpb24gaW5zdHJ1bWVudGF0aW9uLgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyBjaGFyICoKLWJybGFiX25leHQgKCkKLXsKLSAgc3RhdGljIGNoYXIgYnVmWzIwXTsKLQotICBzcHJpbnRmIChidWYsICIlcyVkIiwgQlJfTEFCRUxfQkFTRSwgYnJfY250KyspOwotICByZXR1cm4gYnVmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGJydGFiX2VtaXQ6CWdlbmVyYXRlIHRoZSBmZXRjaC1wcmVkaWN0aW9uIGJyYW5jaCB0YWJsZS4KLQotICAJU2VlIHRoZSBjb21tZW50cyBhYm92ZSB0aGUgZGVjbGFyYXRpb24gb2YgJ2JyX2NudCcgZm9yIGRldGFpbHMgb24KLSAgCWJyYW5jaC1wcmVkaWN0aW9uIGluc3RydW1lbnRhdGlvbi4KLQotICAJVGhlIGNvZGUgZW1pdHRlZCBoZXJlIHdvdWxkIGJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcKLSAgCWV4YW1wbGUgYXNzZW1ibGVyIHNvdXJjZS4KLQotICAJCQkuZGF0YQotICAJCQkuYWxpZ24JMgotICAJICAgQlJfVEFCX05BTUU6Ci0gIAkJCS53b3JkCTAJCSMgbGluayB0byBuZXh0IHRhYmxlCi0gIAkJCS53b3JkCTMJCSMgbGVuZ3RoIG9mIHRhYmxlCi0gIAkJCS53b3JkCUxCUkFOQ0gwCSMgMXN0IGVudHJ5IGluIHRhYmxlIHByb3BlcgotICAJCQkud29yZAlMQlJBTkNIMQotICAJCQkud29yZAlMQlJBTkNIMgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1icnRhYl9lbWl0ICgpCi17Ci0gIGludCBpOwotICBjaGFyIGJ1ZlsyMF07Ci0gIGNoYXIgKnA7CQkJLyogV2hlcmUgdGhlIGJpbmFyeSB3YXMgb3V0cHV0IHRvICovCi0gIC8qIFBvaW50ZXIgdG8gZGVzY3JpcHRpb24gb2YgZGVmZXJyZWQgYWRkcmVzcyBmaXh1cC4gICovCi0gIGZpeFMgKmZpeFA7Ci0KLSAgaWYgKCFpbnN0cnVtZW50X2JyYW5jaGVzKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCAwKTsJLyogICAgICAuZGF0YSAqLwotICBmcmFnX2FsaWduICgyLCAwLCAwKTsJCS8qICAgICAgLmFsaWduIDIgKi8KLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMik7Ci0gIGNvbG9uIChCUl9UQUJfTkFNRSk7CQkvKiBCUl9UQUJfTkFNRTogKi8KLSAgZW1pdCAoMCk7CQkJLyogICAgICAud29yZCAwICNsaW5rIHRvIG5leHQgdGFibGUgKi8KLSAgZW1pdCAoYnJfY250KTsJCS8qICAgICAgLndvcmQgbiAjbGVuZ3RoIG9mIHRhYmxlICovCi0KLSAgZm9yIChpID0gMDsgaSA8IGJyX2NudDsgaSsrKQotICAgIHsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVzJWQiLCBCUl9MQUJFTF9CQVNFLCBpKTsKLSAgICAgIHAgPSBlbWl0ICgwKTsKLSAgICAgIGZpeFAgPSBmaXhfbmV3IChmcmFnX25vdywKLQkJICAgICAgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkgICAgICA0LAotCQkgICAgICBzeW1ib2xfZmluZCAoYnVmKSwKLQkJICAgICAgMCwKLQkJICAgICAgMCwKLQkJICAgICAgTk9fUkVMT0MpOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBjb2JyX2ZtdDoJZ2VuZXJhdGUgYSBDT0JSLWZvcm1hdCBpbnN0cnVjdGlvbgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi12b2lkCi1jb2JyX2ZtdCAoYXJnLCBvcGNvZGUsIG9QKQotICAgICAvKiBhcmdbMF0tPm9wY29kZSBtbmVtb25pYywgYXJnWzEtM10tPm9wZXJhbmRzIChhc2NpaSkgKi8KLSAgICAgY2hhciAqYXJnW107Ci0gICAgIC8qIE9wY29kZSwgd2l0aCBicmFuY2gtcHJlZGljdGlvbiBiaXRzIGFscmVhZHkgc2V0IGlmIG5lY2Vzc2FyeS4gICovCi0gICAgIGxvbmcgb3Bjb2RlOwotICAgICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0aW9uIG9mIGluc3RydWN0aW9uLiAgKi8KLSAgICAgc3RydWN0IGk5NjBfb3Bjb2RlICpvUDsKLXsKLSAgbG9uZyBpbnN0cjsJCQkvKiAzMi1iaXQgaW5zdHJ1Y3Rpb24gKi8KLSAgc3RydWN0IHJlZ29wIHJlZ29wOwkJLyogRGVzY3JpcHRpb24gb2YgcmVnaXN0ZXIgb3BlcmFuZCAqLwotICBpbnQgbjsJCQkvKiBOdW1iZXIgb2Ygb3BlcmFuZHMgKi8KLSAgaW50IHZhcl9mcmFnOwkJCS8qIDEgaWYgdmFyeWluZyBsZW5ndGggY29kZSBmcmFnbWVudCBzaG91bGQKLQkJCQkgKiAgICBiZSBlbWl0dGVkOyAgMCBpZiBhbiBhZGRyZXNzIGZpeAotCQkJCSAqICAgICAgc2hvdWxkIGJlIGVtaXR0ZWQuCi0JCQkJICovCi0KLSAgaW5zdHIgPSBvcGNvZGU7Ci0gIG4gPSBvUC0+bnVtX29wczsKLQotICBpZiAobiA+PSAxKQotICAgIHsKLSAgICAgIC8qIEZpcnN0IG9wZXJhbmQgKGlmIGFueSkgb2YgYSBDT0JSIGlzIGFsd2F5cyBhIHJlZ2lzdGVyCi0JIG9wZXJhbmQuICBQYXJzZSBpdC4gICovCi0gICAgICBwYXJzZV9yZWdvcCAoJnJlZ29wLCBhcmdbMV0sIG9QLT5vcGVyYW5kWzBdKTsKLSAgICAgIGluc3RyIHw9IChyZWdvcC5uIDw8IDE5KSB8IChyZWdvcC5tb2RlIDw8IDEzKTsKLSAgICB9Ci0gIGlmIChuID49IDIpCi0gICAgewotICAgICAgLyogU2Vjb25kIG9wZXJhbmQgKGlmIGFueSkgb2YgYSBDT0JSIGlzIGFsd2F5cyBhIHJlZ2lzdGVyCi0JIG9wZXJhbmQuICBQYXJzZSBpdC4gICovCi0gICAgcGFyc2VfcmVnb3AgKCZyZWdvcCwgYXJnWzJdLCBvUC0+b3BlcmFuZFsxXSk7Ci0gICAgICBpbnN0ciB8PSAocmVnb3AubiA8PCAxNCkgfCByZWdvcC5zcGVjaWFsOwotICAgIH0KLQotCi0gIGlmIChuIDwgMykKLSAgICB7Ci0gICAgICBlbWl0IChpbnN0cik7Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaW5zdHJ1bWVudF9icmFuY2hlcykKLQl7Ci0JICBicmNudF9lbWl0ICgpOwotCSAgY29sb24gKGJybGFiX25leHQgKCkpOwotCX0KLQotICAgICAgLyogQSB0aGlyZCBvcGVyYW5kIHRvIGEgQ09CUiBpcyBhbHdheXMgYSBkaXNwbGFjZW1lbnQuICBQYXJzZQotICAgICAgICAgaXQ7IGlmIGl0J3MgcmVsYXhhYmxlIChhIGNvYnIgImoiIGRpcmVjdGl2ZSwgb3IgYW55IGNvYnIKLSAgICAgICAgIG90aGVyIHRoYW4gYmJzL2JiYyB3aGVuIHRoZSAiLW5vcmVsYXgiIG9wdGlvbiBpcyBub3QgaW4gdXNlKQotICAgICAgICAgc2V0IHVwIGEgdmFyaWFibGUgY29kZSBmcmFnbWVudDsgb3RoZXJ3aXNlIHNldCB1cCBhbiBhZGRyZXNzCi0gICAgICAgICBmaXguICAqLwotICAgICAgdmFyX2ZyYWcgPSAhbm9yZWxheCB8fCAob1AtPmZvcm1hdCA9PSBDT0opOwkvKiBUUlVFIG9yIEZBTFNFICovCi0gICAgICBnZXRfY2Rpc3AgKGFyZ1szXSwgIkNPQlIiLCBpbnN0ciwgMTMsIHZhcl9mcmFnLCAwKTsKLQotICAgICAgaWYgKGluc3RydW1lbnRfYnJhbmNoZXMpCi0JewotCSAgYnJjbnRfZW1pdCAoKTsKLQl9Ci0gICAgfQotfQkJCQkvKiBjb2JyX2ZtdCgpICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBjdHJsX2ZtdDoJZ2VuZXJhdGUgYSBDVFJMLWZvcm1hdCBpbnN0cnVjdGlvbgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi12b2lkCi1jdHJsX2ZtdCAodGFyZ1AsIG9wY29kZSwgbnVtX29wcykKLSAgICAgY2hhciAqdGFyZ1A7CQkvKiBQb2ludGVyIHRvIHRleHQgb2YgbG9uZSBvcGVyYW5kIChpZiBhbnkpICovCi0gICAgIGxvbmcgb3Bjb2RlOwkJLyogVGVtcGxhdGUgb2YgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgaW50IG51bV9vcHM7CQkvKiBOdW1iZXIgb2Ygb3BlcmFuZHMgKi8KLXsKLSAgaW50IGluc3RydW1lbnQ7CQkvKiBUUlVFIGlmZiB3ZSBzaG91bGQgYWRkIGluc3RydW1lbnRhdGlvbiB0byB0cmFjawotCQkJCSAgICogaG93IG9mdGVuIHRoZSBicmFuY2ggaXMgdGFrZW4KLQkJCQkgKi8KLQotCi0gIGlmIChudW1fb3BzID09IDApCi0gICAgewotICAgICAgZW1pdCAob3Bjb2RlKTsJCS8qIE91dHB1dCBvcGNvZGUgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0KLSAgICAgIGluc3RydW1lbnQgPSBpbnN0cnVtZW50X2JyYW5jaGVzICYmIChvcGNvZGUgIT0gQ0FMTCkKLQkmJiAob3Bjb2RlICE9IEIpICYmIChvcGNvZGUgIT0gUkVUKSAmJiAob3Bjb2RlICE9IEJBTCk7Ci0KLSAgICAgIGlmIChpbnN0cnVtZW50KQotCXsKLQkgIGJyY250X2VtaXQgKCk7Ci0JICBjb2xvbiAoYnJsYWJfbmV4dCAoKSk7Ci0JfQotCi0gICAgICAvKiBUaGUgb3BlcmFuZCBNVVNUIGJlIGFuIGlwLXJlbGF0aXZlIGRpc3BsYWNtZW50LiBQYXJzZSBpdAotICAgICAgICAgKiBhbmQgc2V0IHVwIGFkZHJlc3MgZml4IGZvciB0aGUgaW5zdHJ1Y3Rpb24gd2UganVzdCBvdXRwdXQuCi0gICAgICAgKi8KLSAgICAgIGdldF9jZGlzcCAodGFyZ1AsICJDVFJMIiwgb3Bjb2RlLCAyNCwgMCwgMCk7Ci0KLSAgICAgIGlmIChpbnN0cnVtZW50KQotCXsKLQkgIGJyY250X2VtaXQgKCk7Ci0JfQotICAgIH0KLQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgZW1pdDoJb3V0cHV0IGluc3RydWN0aW9uIGJpbmFyeQotCi0gIAlPdXRwdXQgaW5zdHJ1Y3Rpb24gYmluYXJ5LCBpbiB0YXJnZXQgYnl0ZSBvcmRlciwgNCBieXRlcyBhdCBhIHRpbWUuCi0gIAlSZXR1cm4gcG9pbnRlciB0byB3aGVyZSBpdCB3YXMgcGxhY2VkLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi1jaGFyICoKLWVtaXQgKGluc3RyKQotICAgICBsb25nIGluc3RyOwkJLyogV29yZCB0byBiZSBvdXRwdXQsIGhvc3QgYnl0ZSBvcmRlciAqLwotewotICBjaGFyICp0b1A7CQkJLyogV2hlcmUgdG8gb3V0cHV0IGl0ICovCi0KLSAgdG9QID0gZnJhZ19tb3JlICg0KTsJCS8qIEFsbG9jYXRlIHN0b3JhZ2UgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0b1AsIGluc3RyLCA0KTsJLyogQ29udmVydCB0byB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICByZXR1cm4gdG9QOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgZ2V0X2FyZ3M6CWJyZWFrIGluZGl2aWR1YWwgYXJndW1lbnRzIG91dCBvZiBjb21tYS1zZXBhcmF0ZWQgbGlzdAotCi0gICBJbnB1dCBhc3N1bXB0aW9uczoKLSAgCS0gYWxsIGNvbW1lbnRzIGFuZCBsYWJlbHMgaGF2ZSBiZWVuIHJlbW92ZWQKLSAgCS0gYWxsIHN0cmluZ3Mgb2Ygd2hpdGVzcGFjZSBoYXZlIGJlZW4gY29sbGFwc2VkIHRvIGEgc2luZ2xlIGJsYW5rLgotICAJLSBhbGwgY2hhcmFjdGVyIGNvbnN0YW50cyAoJ3gnKSBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBkZWNpbWFsCi0KLSAgIE91dHB1dDoKLSAgCWFyZ3NbMF0gaXMgdW50b3VjaGVkLiBhcmdzWzFdIHBvaW50cyB0byBmaXJzdCBvcGVyYW5kLCBldGMuIEFsbCBhcmdzOgotICAJLSBhcmUgTlVMTC10ZXJtaW5hdGVkCi0gIAktIGNvbnRhaW4gbm8gd2hpdGVzcGFjZQotCi0gICBSZXR1cm4gdmFsdWU6Ci0gIAlOdW1iZXIgb2Ygb3BlcmFuZHMgKDAsMSwyLCBvciAzKSBvciAtMSBvbiBlcnJvci4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyBpbnQKLWdldF9hcmdzIChwLCBhcmdzKQotICAgICAvKiBQb2ludGVyIHRvIGNvbW1hLXNlcGFyYXRlZCBvcGVyYW5kczsgTVVDS0VEIEJZIFVTICovCi0gICAgIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gICAgIC8qIE91dHB1dCBhcmc6IHBvaW50ZXJzIHRvIG9wZXJhbmRzIHBsYWNlZCBpbiBhcmdzWzEtM10uICBNVVNUCi0gICAgICAgIEFDQ09NTU9EQVRFIDQgRU5UUklFUyAoYXJnc1swLTNdKS4gICovCi0gICAgIGNoYXIgKmFyZ3NbXTsKLXsKLSAgcmVnaXN0ZXIgaW50IG47CQkvKiBOdW1iZXIgb2Ygb3BlcmFuZHMgKi8KLSAgcmVnaXN0ZXIgY2hhciAqdG87Ci0KLSAgLyogU2tpcCBsZWFkIHdoaXRlIHNwYWNlICovCi0gIHdoaWxlICgqcCA9PSAnICcpCi0gICAgewotICAgICAgcCsrOwotICAgIH0KLQotICBpZiAoKnAgPT0gJ1wwJykKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgbiA9IDE7Ci0gIGFyZ3NbMV0gPSBwOwotCi0gIC8qIFNxdWV6ZSBibGFua3Mgb3V0IGJ5IG1vdmluZyBub24tYmxhbmtzIHRvd2FyZCBzdGFydCBvZiBzdHJpbmcuCi0gICAgICogSXNvbGF0ZSBvcGVyYW5kcywgd2hlbmV2ZXIgY29tbWEgaXMgZm91bmQuCi0gICAqLwotICB0byA9IHA7Ci0gIHdoaWxlICgqcCAhPSAnXDAnKQotICAgIHsKLQotICAgICAgaWYgKCpwID09ICcgJwotCSAgJiYgKCEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHBbMV0pCi0JICAgICAgfHwgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgcFstMV0pKSkKLQl7Ci0JICBwKys7Ci0KLQl9Ci0gICAgICBlbHNlIGlmICgqcCA9PSAnLCcpCi0JewotCi0JICAvKiBTdGFydCBvZiBvcGVyYW5kICovCi0JICBpZiAobiA9PSAzKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJ0b28gbWFueSBvcGVyYW5kcyIpKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQkgICp0bysrID0gJ1wwJzsJCS8qIFRlcm1pbmF0ZSBhcmd1bWVudCAqLwotCSAgYXJnc1srK25dID0gdG87CS8qIFN0YXJ0IG5leHQgYXJndW1lbnQgKi8KLQkgIHArKzsKLQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqdG8rKyA9ICpwKys7Ci0JfQotICAgIH0KLSAgKnRvID0gJ1wwJzsKLSAgcmV0dXJuIG47Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBnZXRfY2Rpc3A6CWhhbmRsZSBkaXNwbGFjZW1lbnQgZm9yIGEgQ09CUiBvciBDVFJMIGluc3RydWN0aW9uLgotCi0gIAlQYXJzZSBkaXNwbGFjZW1lbnQgZm9yIGEgQ09CUiBvciBDVFJMIGluc3RydWN0aW9uLgotCi0gIAlJZiBzdWNjZXNzZnVsLCBvdXRwdXQgdGhlIGluc3RydWN0aW9uIG9wY29kZSBhbmQgc2V0IHVwIGZvciBpdCwKLSAgCWRlcGVuZGluZyBvbiB0aGUgYXJnICd2YXJfZnJhZycsIGVpdGhlcjoKLSAgCSAgICBvIGFuIGFkZHJlc3MgZml4dXAgdG8gYmUgZG9uZSB3aGVuIGFsbCBzeW1ib2wgdmFsdWVzIGFyZSBrbm93biwgb3IKLSAgCSAgICBvIGEgdmFyeWluZyBsZW5ndGggY29kZSBmcmFnbWVudCwgd2l0aCBhZGRyZXNzIGZpeHVwIGluZm8uICBUaGlzCi0gIAkJd2lsbCBiZSBkb25lIGZvciBjb2JyIGluc3RydWN0aW9ucyB0aGF0IG1heSBoYXZlIHRvIGJlIHJlbGF4ZWQKLSAgCQlpbiB0byBjb21wYXJlL2JyYW5jaCBpbnN0cnVjdGlvbnMgKDggYnl0ZXMpIGlmIHRoZSBmaW5hbAotICAJCWFkZHJlc3MgZGlzcGxhY2VtZW50IGlzIGdyZWF0ZXIgdGhhbiAxMyBiaXRzLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMKLXZvaWQKLWdldF9jZGlzcCAoZGlzcFAsIGlmbXRQLCBpbnN0ciwgbnVtYml0cywgdmFyX2ZyYWcsIGNhbGxqKQotICAgICAvKiBkaXNwbGFjZW1lbnQgYXMgc3BlY2lmaWVkIGluIHNvdXJjZSBpbnN0cnVjdGlvbiAqLwotICAgICBjaGFyICpkaXNwUDsKLSAgICAgLyogIkNPQlIiIG9yICJDVFJMIiAoZm9yIHVzZSBpbiBlcnJvciBtZXNzYWdlKSAqLwotICAgICBjaGFyICppZm10UDsKLSAgICAgLyogSW5zdHJ1Y3Rpb24gbmVlZGluZyB0aGUgZGlzcGxhY2VtZW50ICovCi0gICAgIGxvbmcgaW5zdHI7Ci0gICAgIC8qICMgYml0cyBvZiBkaXNwbGFjZW1lbnQgKDEzIGZvciBDT0JSLCAyNCBmb3IgQ1RSTCkgKi8KLSAgICAgaW50IG51bWJpdHM7Ci0gICAgIC8qIDEgaWYgdmFyeWluZyBsZW5ndGggY29kZSBmcmFnbWVudCBzaG91bGQgYmUgZW1pdHRlZDsKLSAgICAgICogICAgICAgMCBpZiBhbiBhZGRyZXNzIGZpeCBzaG91bGQgYmUgZW1pdHRlZC4KLSAgICAgICovCi0gICAgIGludCB2YXJfZnJhZzsKLSAgICAgLyogMSBpZiBjYWxsaiByZWxvY2F0aW9uIHNob3VsZCBiZSBkb25lOyBlbHNlIDAgKi8KLSAgICAgaW50IGNhbGxqOwotewotICBleHByZXNzaW9uUyBlOwkJLyogUGFyc2VkIGV4cHJlc3Npb24gKi8KLSAgZml4UyAqZml4UDsJCQkvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBuZWVkZWQgYWRkcmVzcyBmaXggKi8KLSAgY2hhciAqb3V0UDsJCQkvKiBXaGVyZSBpbnN0cnVjdGlvbiBiaW5hcnkgaXMgb3V0cHV0IHRvICovCi0KLSAgZml4UCA9IE5VTEw7Ci0KLSAgcGFyc2VfZXhwciAoZGlzcFAsICZlKTsKLSAgc3dpdGNoIChlLlhfb3ApCi0gICAgewotICAgIGNhc2UgT19pbGxlZ2FsOgotICAgICAgYXNfYmFkIChfKCJleHByZXNzaW9uIHN5bnRheCBlcnJvciIpKTsKLQotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZS5YX2FkZF9zeW1ib2wpID09IG5vd19zZWcKLQkgIHx8IFNfR0VUX1NFR01FTlQgKGUuWF9hZGRfc3ltYm9sKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQl7Ci0JICBpZiAodmFyX2ZyYWcpCi0JICAgIHsKLQkgICAgICBvdXRQID0gZnJhZ19tb3JlICg4KTsJLyogQWxsb2NhdGUgd29yc3QtY2FzZSBzdG9yYWdlICovCi0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChvdXRQLCBpbnN0ciwgNCk7Ci0JICAgICAgZnJhZ192YXJpYW50IChyc19tYWNoaW5lX2RlcGVuZGVudCwgNCwgNCwgMSwKLQkJCSAgICBhZGRzIChlKSwgb2ZmcyAoZSksIG91dFApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBTZXQgdXAgYSBuZXcgZml4IHN0cnVjdHVyZSwgc28gYWRkcmVzcyBjYW4gYmUgdXBkYXRlZAotCSAgICAgICAqIHdoZW4gYWxsIHN5bWJvbCB2YWx1ZXMgYXJlIGtub3duLgotCSAgICAgICAqLwotCSAgICAgIG91dFAgPSBlbWl0IChpbnN0cik7Ci0JICAgICAgZml4UCA9IGZpeF9uZXcgKGZyYWdfbm93LAotCQkJICAgICAgb3V0UCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgNCwKLQkJCSAgICAgIGFkZHMgKGUpLAotCQkJICAgICAgb2ZmcyAoZSksCi0JCQkgICAgICAxLAotCQkJICAgICAgTk9fUkVMT0MpOwotCi0JICAgICAgZml4UC0+ZnhfdGNiaXQgPSBjYWxsajsKLQotCSAgICAgIC8qIFdlIHdhbnQgdG8gbW9kaWZ5IGEgYml0IGZpZWxkIHdoZW4gdGhlIGFkZHJlc3MgaXMKLQkgICAgICAgKiBrbm93bi4gIEJ1dCB3ZSBkb24ndCBuZWVkIGFsbCB0aGUgZ2FyYmFnZSBpbiB0aGUKLQkgICAgICAgKiBiaXRfZml4IHN0cnVjdHVyZS4gIFNvIHdlJ3JlIGdvaW5nIHRvIGxpZSBhbmQgc3RvcmUKLQkgICAgICAgKiB0aGUgbnVtYmVyIG9mIGJpdHMgYWZmZWN0ZWQgaW5zdGVhZCBvZiBhIHBvaW50ZXIuCi0JICAgICAgICovCi0JICAgICAgZml4UC0+ZnhfYml0X2ZpeFAgPSAoYml0X2ZpeFMgKikgbnVtYml0czsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImF0dGVtcHQgdG8gYnJhbmNoIGludG8gZGlmZmVyZW50IHNlZ21lbnQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oInRhcmdldCBvZiAlcyBpbnN0cnVjdGlvbiBtdXN0IGJlIGEgbGFiZWwiKSwgaWZtdFApOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgZ2V0X2lzcGVjOglwYXJzZSBhIG1lbW9yeSBvcGVyYW5kIGZvciBhbiBpbmRleCBzcGVjaWZpY2F0aW9uCi0KLSAgCUhlcmUsIGFuICJpbmRleCBzcGVjaWZpY2F0aW9uIiBpcyB0YWtlbiB0byBiZSBhbnl0aGluZyBzdXJyb3VuZGVkCi0gIAlieSBzcXVhcmUgYnJhY2tldHMgYW5kIE5PVCBmb2xsb3dlZCBieSBhbnl0aGluZyBlbHNlLgotCi0gIAlJZiBpdCdzIGZvdW5kLCBkZXRhY2ggaXQgZnJvbSB0aGUgaW5wdXQgc3RyaW5nLCByZW1vdmUgdGhlIHN1cnJvdW5kaW5nCi0gIAlzcXVhcmUgYnJhY2tldHMsIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LiAgT3RoZXJ3aXNlLCByZXR1cm4gTlVMTC4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYwotY2hhciAqCi1nZXRfaXNwZWMgKHRleHRQKQotICAgICAvKiBQb2ludGVyIHRvIG1lbW9yeSBvcGVyYW5kIGZyb20gc291cmNlIGluc3RydWN0aW9uLCBubyB3aGl0ZSBzcGFjZS4gICovCi0gICAgIGNoYXIgKnRleHRQOwotewotICAvKiBQb2ludHMgdG8gc3RhcnQgb2YgaW5kZXggc3BlY2lmaWNhdGlvbi4gICovCi0gIGNoYXIgKnN0YXJ0OwotICAvKiBQb2ludHMgdG8gZW5kIG9mIGluZGV4IHNwZWNpZmljYXRpb24uICAqLwotICBjaGFyICplbmQ7Ci0KLSAgLyogRmluZCBvcGVuaW5nIHNxdWFyZSBicmFja2V0LCBpZiBhbnkuICAqLwotICBzdGFydCA9IHN0cmNociAodGV4dFAsICdbJyk7Ci0KLSAgaWYgKHN0YXJ0ICE9IE5VTEwpCi0gICAgewotCi0gICAgICAvKiBFbGltaW5hdGUgJ1snLCBkZXRhY2ggZnJvbSByZXN0IG9mIG9wZXJhbmQgKi8KLSAgICAgICpzdGFydCsrID0gJ1wwJzsKLQotICAgICAgZW5kID0gc3RyY2hyIChzdGFydCwgJ10nKTsKLQotICAgICAgaWYgKGVuZCA9PSBOVUxMKQotCXsKLQkgIGFzX2JhZCAoXygidW5tYXRjaGVkICdbJyIpKTsKLQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBFbGltaW5hdGUgJ10nIGFuZCBtYWtlIHN1cmUgaXQgd2FzIHRoZSBsYXN0IHRoaW5nCi0JICAgICAqIGluIHRoZSBzdHJpbmcuCi0JICAgKi8KLQkgICplbmQgPSAnXDAnOwotCSAgaWYgKCooZW5kICsgMSkgIT0gJ1wwJykKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiZ2FyYmFnZSBhZnRlciBpbmRleCBzcGVjIGlnbm9yZWQiKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gc3RhcnQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgZ2V0X3JlZ251bToKLQotICAJTG9vayB1cCBhIChzdXNwZWN0ZWQpIHJlZ2lzdGVyIG5hbWUgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlIGFuZCByZXR1cm4gdGhlCi0gIAlhc3NvY2lhdGVkIHJlZ2lzdGVyIG51bWJlciAob3IgLTEgaWYgbm90IGZvdW5kKS4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYwotaW50Ci1nZXRfcmVnbnVtIChyZWduYW1lKQotICAgICBjaGFyICpyZWduYW1lOwkJLyogU3VzcGVjdGVkIHJlZ2lzdGVyIG5hbWUgKi8KLXsKLSAgaW50ICpyUDsKLQotICByUCA9IChpbnQgKikgaGFzaF9maW5kIChyZWdfaGFzaCwgcmVnbmFtZSk7Ci0gIHJldHVybiAoclAgPT0gTlVMTCkgPyAtMSA6ICpyUDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGlfc2NhbjoJcGVyZm9ybSBsZXhpY2FsIHNjYW4gb2YgYXNjaWkgYXNzZW1ibGVyIGluc3RydWN0aW9uLgotCi0gICBJbnB1dCBhc3N1bXB0aW9uczoKLSAgCS0gaW5wdXQgc3RyaW5nIGlzIGFuIGk4MDk2MCBpbnN0cnVjdGlvbiAobm90IGEgcHNldWRvLW9wKQotICAJLSBhbGwgY29tbWVudHMgYW5kIGxhYmVscyBoYXZlIGJlZW4gcmVtb3ZlZAotICAJLSBhbGwgc3RyaW5ncyBvZiB3aGl0ZXNwYWNlIGhhdmUgYmVlbiBjb2xsYXBzZWQgdG8gYSBzaW5nbGUgYmxhbmsuCi0KLSAgIE91dHB1dDoKLSAgCWFyZ3NbMF0gcG9pbnRzIHRvIG9wY29kZSwgb3RoZXIgZW50cmllcyBwb2ludCB0byBvcGVyYW5kcy4gQWxsIHN0cmluZ3M6Ci0gIAktIGFyZSBOVUxMLXRlcm1pbmF0ZWQKLSAgCS0gY29udGFpbiBubyB3aGl0ZXNwYWNlCi0gIAktIGhhdmUgY2hhcmFjdGVyIGNvbnN0YW50cyAoJ3gnKSByZXBsYWNlZCB3aXRoIGEgZGVjaW1hbCBudW1iZXIKLQotICAgUmV0dXJuIHZhbHVlOgotICAJTnVtYmVyIG9mIG9wZXJhbmRzICgwLDEsMiwgb3IgMykgb3IgLTEgb24gZXJyb3IuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgaW50Ci1pX3NjYW4gKGlQLCBhcmdzKQotICAgICAvKiBQb2ludGVyIHRvIGFzY2lpIGluc3RydWN0aW9uOyAgTVVDS0VEIEJZIFVTLiAqLwotICAgICByZWdpc3RlciBjaGFyICppUDsKLSAgICAgLyogT3V0cHV0IGFyZzogcG9pbnRlcnMgdG8gb3Bjb2RlIGFuZCBvcGVyYW5kcyBwbGFjZWQgaGVyZS4gIE1VU1QKLQlBQ0NPTU1PREFURSA0IEVOVFJJRVMuICAqLwotICAgICBjaGFyICphcmdzW107Ci17Ci0KLSAgLyogSXNvbGF0ZSBvcGNvZGUgKi8KLSAgaWYgKCooaVApID09ICcgJykKLSAgICB7Ci0gICAgICBpUCsrOwotICAgIH0JCQkJLyogU2tpcCBsZWFkIHNwYWNlLCBpZiBhbnkgKi8KLSAgYXJnc1swXSA9IGlQOwotICBmb3IgKDsgKmlQICE9ICcgJzsgaVArKykKLSAgICB7Ci0gICAgICBpZiAoKmlQID09ICdcMCcpCi0JewotCSAgLyogVGhlcmUgYXJlIG5vIG9wZXJhbmRzICovCi0JICBpZiAoYXJnc1swXSA9PSBpUCkKLQkgICAgewotCSAgICAgIC8qIFdlIG5ldmVyIG1vdmVkOiB0aGVyZSB3YXMgbm8gb3Bjb2RlIGVpdGhlciEgKi8KLQkgICAgICBhc19iYWQgKF8oIm1pc3Npbmcgb3Bjb2RlIikpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCSAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLSAgKmlQKysgPSAnXDAnOwkJCS8qIFRlcm1pbmF0ZSBvcGNvZGUgKi8KLSAgcmV0dXJuIChnZXRfYXJncyAoaVAsIGFyZ3MpKTsKLX0JCQkJLyogaV9zY2FuKCkgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1lbV9mbXQ6CWdlbmVyYXRlIGEgTUVNQS0gb3IgTUVNQi1mb3JtYXQgaW5zdHJ1Y3Rpb24KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyB2b2lkCi1tZW1fZm10IChhcmdzLCBvUCwgY2FsbHgpCi0gICAgIGNoYXIgKmFyZ3NbXTsJCS8qIGFyZ3NbMF0tPm9wY29kZSBtbmVtb25pYywgYXJnc1sxLTNdLT5vcGVyYW5kcyAqLwotICAgICBzdHJ1Y3QgaTk2MF9vcGNvZGUgKm9QOwkvKiBQb2ludGVyIHRvIGRlc2NyaXB0aW9uIG9mIGluc3RydWN0aW9uICovCi0gICAgIGludCBjYWxseDsJCQkvKiBJcyB0aGlzIGEgY2FsbHggb3Bjb2RlICovCi17Ci0gIGludCBpOwkJCS8qIExvb3AgY291bnRlciAqLwotICBzdHJ1Y3QgcmVnb3AgcmVnb3A7CQkvKiBEZXNjcmlwdGlvbiBvZiByZWdpc3RlciBvcGVyYW5kICovCi0gIGNoYXIgb3BkZXNjOwkJCS8qIE9wZXJhbmQgZGVzY3JpcHRvciBieXRlICovCi0gIG1lbVMgaW5zdHI7CQkJLyogRGVzY3JpcHRpb24gb2YgYmluYXJ5IHRvIGJlIG91dHB1dCAqLwotICBjaGFyICpvdXRQOwkJCS8qIFdoZXJlIHRoZSBiaW5hcnkgd2FzIG91dHB1dCB0byAqLwotICBleHByZXNzaW9uUyBleHByOwkJLyogUGFyc2VkIGV4cHJlc3Npb24gKi8KLSAgLyogLT5kZXNjcmlwdGlvbiBvZiBkZWZlcnJlZCBhZGRyZXNzIGZpeHVwICovCi0gIGZpeFMgKmZpeFA7Ci0KLSNpZmRlZiBPQkpfQ09GRgotICAvKiBDT0ZGIHN1cHBvcnQgaXNuJ3QgaW4gcGxhY2UgeWV0IGZvciBjYWxseCByZWxheGluZy4gICovCi0gIGNhbGx4ID0gMDsKLSNlbmRpZgotCi0gIG1lbXNldCAoJmluc3RyLCAnXDAnLCBzaXplb2YgKG1lbVMpKTsKLSAgaW5zdHIub3Bjb2RlID0gb1AtPm9wY29kZTsKLQotICAvKiBQcm9jZXNzIG9wZXJhbmRzLiAqLwotICBmb3IgKGkgPSAxOyBpIDw9IG9QLT5udW1fb3BzOyBpKyspCi0gICAgewotICAgICAgb3BkZXNjID0gb1AtPm9wZXJhbmRbaSAtIDFdOwotCi0gICAgICBpZiAoTUVNT1AgKG9wZGVzYykpCi0JewotCSAgcGFyc2VfbWVtb3AgKCZpbnN0ciwgYXJnc1tpXSwgb1AtPmZvcm1hdCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHBhcnNlX3JlZ29wICgmcmVnb3AsIGFyZ3NbaV0sIG9wZGVzYyk7Ci0JICBpbnN0ci5vcGNvZGUgfD0gcmVnb3AubiA8PCAxOTsKLQl9Ci0gICAgfQotCi0gIC8qIFBhcnNlIHRoZSBkaXNwbGFjZW1lbnQ7IHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSBlbWl0dGluZyB0aGUKLSAgICAgb3Bjb2RlLCBpbiBjYXNlIGl0IGlzIGFuIGV4cHJlc3Npb24gdXNpbmcgYC4nLiAgKi8KLSAgcGFyc2VfZXhwciAoaW5zdHIuZSwgJmV4cHIpOwotCi0gIC8qIE91dHB1dCBvcGNvZGUgKi8KLSAgb3V0UCA9IGVtaXQgKGluc3RyLm9wY29kZSk7Ci0KLSAgaWYgKGluc3RyLmRpc3AgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFByb2Nlc3MgdGhlIGRpc3BsYWNlbWVudCAqLwotICBzd2l0Y2ggKGV4cHIuWF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2lsbGVnYWw6Ci0gICAgICBhc19iYWQgKF8oImV4cHJlc3Npb24gc3ludGF4IGVycm9yIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgICBpZiAoaW5zdHIuZGlzcCA9PSAzMikKLQl7Ci0JICAodm9pZCkgZW1pdCAob2ZmcyAoZXhwcikpOwkvKiBPdXRwdXQgZGlzcGxhY2VtZW50ICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIDEyLWJpdCBkaXNwbGFjZW1lbnQgKi8KLQkgIGlmIChvZmZzIChleHByKSAmIH4weGZmZikKLQkgICAgewotCSAgICAgIC8qIFdvbid0IGZpdCBpbiAxMiBiaXRzOiBjb252ZXJ0IGFscmVhZHktb3V0cHV0Ci0JICAgICAgICogaW5zdHJ1Y3Rpb24gdG8gTUVNQiBmb3JtYXQsIG91dHB1dAotCSAgICAgICAqIGRpc3BsYWNlbWVudC4KLQkgICAgICAgKi8KLQkgICAgICBtZW1hX3RvX21lbWIgKG91dFApOwotCSAgICAgICh2b2lkKSBlbWl0IChvZmZzIChleHByKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdJTEwgZml0IGluIDEyIGJpdHM6ICBPUiBpbnRvIG9wY29kZSBhbmQKLQkgICAgICAgKiBvdmVyd3JpdGUgdGhlIGJpbmFyeSB3ZSBhbHJlYWR5IHB1dCBvdXQKLQkgICAgICAgKi8KLQkgICAgICBpbnN0ci5vcGNvZGUgfD0gb2ZmcyAoZXhwcik7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChvdXRQLCBpbnN0ci5vcGNvZGUsIDQpOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKGluc3RyLmRpc3AgPT0gMTIpCi0JewotCSAgLyogRGlzcGxhY2VtZW50IGlzIGRlcGVuZGVudCBvbiBhIHN5bWJvbCwgd2hvc2UgdmFsdWUKLQkgICAqIG1heSBjaGFuZ2UgYXQgbGluayB0aW1lLiAgV2UgSEFWRSB0byByZXNlcnZlIDMyIGJpdHMuCi0JICAgKiBDb252ZXJ0IGFscmVhZHktb3V0cHV0IG9wY29kZSB0byBNRU1CIGZvcm1hdC4KLQkgICAqLwotCSAgbWVtYV90b19tZW1iIChvdXRQKTsKLQl9Ci0KLSAgICAgIC8qIE91dHB1dCAwIGRpc3BsYWNlbWVudCBhbmQgc2V0IHVwIGFkZHJlc3MgZml4dXAgZm9yIHdoZW4KLSAgICAgICAqIHRoaXMgc3ltYm9sJ3MgdmFsdWUgYmVjb21lcyBrbm93bi4KLSAgICAgICAqLwotICAgICAgb3V0UCA9IGVtaXQgKChsb25nKSAwKTsKLSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCQkgIG91dFAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgNCwKLQkJCSAgJmV4cHIsCi0JCQkgIDAsCi0JCQkgIE5PX1JFTE9DKTsKLSAgICAgIC8qIFN0ZXZlJ3MgbGlua2VyIHJlbGF4aW5nIGhhY2suICBNYXJrIHRoaXMgMzItYml0IHJlbG9jYXRpb24gYXMKLSAgICAgICAgIGJlaW5nIGluIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0sIHNwZWNpZmljYWxseSBhcyBwYXJ0IG9mIGEgY2FsbHgKLSAgICAgICAgIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGZpeFAtPmZ4X2JzciA9IGNhbGx4OwotICAgICAgYnJlYWs7Ci0gICAgfQotfQkJCQkvKiBtZW1mbXQoKSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWVtYV90b19tZW1iOgljb252ZXJ0IGEgTUVNQS1mb3JtYXQgb3Bjb2RlIHRvIGEgTUVNQi1mb3JtYXQgb3Bjb2RlLgotCi0gICBUaGVyZSBhcmUgMiBwb3NzaWJsZSBNRU1BIGZvcm1hdHM6Ci0gIAktIGRpc3BsYWNlbWVudCBvbmx5Ci0gIAktIGRpc3BsYWNlbWVudCArIGFiYXNlCi0KLSAgIFRoZXkgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIHNldHRpbmcgb2YgdGhlIE1FTUFfQUJBU0UgYml0LgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIHZvaWQKLW1lbWFfdG9fbWVtYiAob3Bjb2RlUCkKLSAgICAgY2hhciAqb3Bjb2RlUDsJCS8qIFdoZXJlIHRvIGZpbmQgdGhlIG9wY29kZSwgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLXsKLSAgbG9uZyBvcGNvZGU7CQkJLyogT3Bjb2RlIGluIGhvc3QgYnl0ZSBvcmRlciAqLwotICBsb25nIG1vZGU7CQkJLyogTW9kZSBiaXRzIGZvciBNRU1CIGluc3RydWN0aW9uICovCi0KLSAgb3Bjb2RlID0gbWRfY2hhcnNfdG9fbnVtYmVyIChvcGNvZGVQLCA0KTsKLSAga25vdyAoIShvcGNvZGUgJiBNRU1CX0JJVCkpOwotCi0gIG1vZGUgPSBNRU1CX0JJVCB8IERfQklUOwotICBpZiAob3Bjb2RlICYgTUVNQV9BQkFTRSkKLSAgICB7Ci0gICAgICBtb2RlIHw9IEFfQklUOwotICAgIH0KLQotICBvcGNvZGUgJj0gMHhmZmZmYzAwMDsJCS8qIENsZWFyIE1FTUEgb2Zmc2V0IGFuZCBtb2RlIGJpdHMgKi8KLSAgb3Bjb2RlIHw9IG1vZGU7CQkvKiBTZXQgTUVNQiBtb2RlIGJpdHMgKi8KLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKG9wY29kZVAsIG9wY29kZSwgNCk7Ci19CQkJCS8qIG1lbWFfdG9fbWVtYigpICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBwYXJzZV9leHByOgkJcGFyc2UgYW4gZXhwcmVzc2lvbgotCi0gIAlVc2UgYmFzZSBhc3NlbWJsZXIncyBleHByZXNzaW9uIHBhcnNlciB0byBwYXJzZSBhbiBleHByZXNzaW9uLgotICAJSXQsIHVuZm9ydHVuYXRlbHksIHJ1bnMgb2ZmIGEgZ2xvYmFsIHdoaWNoIHdlIGhhdmUgdG8gc2F2ZS9yZXN0b3JlCi0gIAlpbiBvcmRlciB0byBtYWtlIGl0IHdvcmsgZm9yIHVzLgotCi0gIAlBbiBlbXB0eSBleHByZXNzaW9uIHN0cmluZyBpcyB0cmVhdGVkIGFzIGFuIGFic29sdXRlIDAuCi0KLSAgCVNldHMgT19pbGxlZ2FsIHJlZ2FyZGxlc3Mgb2YgZXhwcmVzc2lvbiBldmFsdWF0aW9uIGlmIGVudGlyZSBpbnB1dAotICAJc3RyaW5nIGlzIG5vdCBjb25zdW1lZCBpbiB0aGUgZXZhbHVhdGlvbiAtLSB0b2xlcmF0ZSBubyBkYW5nbGluZyBqdW5rIQotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIHZvaWQKLXBhcnNlX2V4cHIgKHRleHRQLCBleHBQKQotICAgICBjaGFyICp0ZXh0UDsJCS8qIFRleHQgb2YgZXhwcmVzc2lvbiB0byBiZSBwYXJzZWQgKi8KLSAgICAgZXhwcmVzc2lvblMgKmV4cFA7CQkvKiBXaGVyZSB0byBwdXQgdGhlIHJlc3VsdHMgb2YgcGFyc2luZyAqLwotewotICBjaGFyICpzYXZlX2luOwkJLyogU2F2ZSBnbG9iYWwgaGVyZSAqLwotICBzeW1ib2xTICpzeW1QOwotCi0gIGtub3cgKHRleHRQKTsKLQotICBpZiAoKnRleHRQID09ICdcMCcpCi0gICAgewotICAgICAgLyogVHJlYXQgZW1wdHkgc3RyaW5nIGFzIGFic29sdXRlIDAgKi8KLSAgICAgIGV4cFAtPlhfYWRkX3N5bWJvbCA9IGV4cFAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cFAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBleHBQLT5YX29wID0gT19jb25zdGFudDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzYXZlX2luID0gaW5wdXRfbGluZV9wb2ludGVyOwkvKiBTYXZlIGdsb2JhbCAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gdGV4dFA7CS8qIE1ha2UgcGFyc2VyIHdvcmsgZm9yIHVzICovCi0KLSAgICAgICh2b2lkKSBleHByZXNzaW9uIChleHBQKTsKLSAgICAgIGlmICgoc2l6ZV90KSAoaW5wdXRfbGluZV9wb2ludGVyIC0gdGV4dFApICE9IHN0cmxlbiAodGV4dFApKQotCXsKLQkgIC8qIERpZCBub3QgY29uc3VtZSBhbGwgb2YgdGhlIGlucHV0ICovCi0JICBleHBQLT5YX29wID0gT19pbGxlZ2FsOwotCX0KLSAgICAgIHN5bVAgPSBleHBQLT5YX2FkZF9zeW1ib2w7Ci0gICAgICBpZiAoc3ltUCAmJiAoaGFzaF9maW5kIChyZWdfaGFzaCwgU19HRVRfTkFNRSAoc3ltUCkpKSkKLQl7Ci0JICAvKiBSZWdpc3RlciBuYW1lIGluIGFuIGV4cHJlc3Npb24gKi8KLQkgIC8qIEZJWE1FOiB0aGlzIGlzbid0IG11Y2ggb2YgYSBjaGVjayBhbnkgbW9yZS4gICovCi0JICBleHBQLT5YX29wID0gT19pbGxlZ2FsOwotCX0KLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsJLyogUmVzdG9yZSBnbG9iYWwgKi8KLSAgICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBwYXJzZV9sZGNvbnQ6Ci0gIAlQYXJzZSBhbmQgcmVwbGFjZSBhICdsZGNvbnN0JyBwc2V1ZG8taW5zdHJ1Y3Rpb24gd2l0aCBhbiBhcHByb3ByaWF0ZQotICAJaTgwOTYwIGluc3RydWN0aW9uLgotCi0gIAlBc3N1bWVzIHRoZSBpbnB1dCBjb25zaXN0cyBvZjoKLSAgCQlhcmdbMF0Jb3Bjb2RlIG1uZW1vbmljICgnbGRjb25zdCcpCi0gIAkJYXJnWzFdICBmaXJzdCBvcGVyYW5kIChjb25zdGFudCkKLSAgCQlhcmdbMl0JbmFtZSBvZiByZWdpc3RlciB0byBiZSBsb2FkZWQKLQotICAJUmVwbGFjZXMgb3Bjb2RlIGFuZC9vciBvcGVyYW5kcyBhcyBhcHByb3ByaWF0ZS4KLQotICAJUmV0dXJucyB0aGUgbmV3IG51bWJlciBvZiBhcmd1bWVudHMsIG9yIC0xIG9uIGZhaWx1cmUuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMKLWludAotcGFyc2VfbGRjb25zdCAoYXJnKQotICAgICBjaGFyICphcmdbXTsJCS8qIFNlZSBhYm92ZSAqLwotewotICBpbnQgbjsJCQkvKiBDb25zdGFudCB0byBiZSBsb2FkZWQgKi8KLSAgaW50IHNoaWZ0OwkJCS8qIFNoaWZ0IGNvdW50IGZvciAic2hsbyIgaW5zdHJ1Y3Rpb24gKi8KLSAgc3RhdGljIGNoYXIgYnVmWzVdOwkJLyogTGl0ZXJhbCBmb3IgZmlyc3Qgb3BlcmFuZCAqLwotICBzdGF0aWMgY2hhciBidWYyWzVdOwkJLyogTGl0ZXJhbCBmb3Igc2Vjb25kIG9wZXJhbmQgKi8KLSAgZXhwcmVzc2lvblMgZTsJCS8qIFBhcnNlZCBleHByZXNzaW9uICovCi0KLQotICBhcmdbM10gPSBOVUxMOwkJLyogU28gd2UgY2FuIHRlbGwgYXQgdGhlIGVuZCBpZiBpdCBnb3QgdXNlZCBvciBub3QgKi8KLQotICBwYXJzZV9leHByIChhcmdbMV0sICZlKTsKLSAgc3dpdGNoIChlLlhfb3ApCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBXZSdyZSBkZXBlbmRlbnQgb24gb25lIG9yIG1vcmUgc3ltYm9scyAtLSB1c2UgImxkYSIgKi8KLSAgICAgIGFyZ1swXSA9ICJsZGEiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgICAvKiBUcnkgdGhlIGZvbGxvd2luZyBtYXBwaW5nczoKLSAgICAgICAqICAgICAgbGRjb25zdCAwLDxyZWc+ICAtPm1vdiAgMCw8cmVnPgotICAgICAgICogICAgICAgIGxkY29uc3QgMzEsPHJlZz4gLT5tb3YgIDMxLDxyZWc+Ci0gICAgICAgKiAgICAgICAgbGRjb25zdCAzMiw8cmVnPiAtPmFkZG8gMSwzMSw8cmVnPgotICAgICAgICogICAgICAgIGxkY29uc3QgNjIsPHJlZz4gLT5hZGRvIDMxLDMxLDxyZWc+Ci0gICAgICAgKiAgICAgICAgbGRjb25zdCA2NCw8cmVnPiAtPnNobG8gOCwzLDxyZWc+Ci0gICAgICAgKiAgICAgICAgbGRjb25zdCAtMSw8cmVnPiAtPnN1Ym8gMSwwLDxyZWc+Ci0gICAgICAgKiAgICAgICAgbGRjb25zdCAtMzEsPHJlZz4tPnN1Ym8gMzEsMCw8cmVnPgotICAgICAgICoKLSAgICAgICAqIGFudGhpbmcgZWxzZSBiZWNvbWVzOgotICAgICAgICogICAgICAgIGxkYSB4eHgsPHJlZz4KLSAgICAgICAqLwotICAgICAgbiA9IG9mZnMgKGUpOwotICAgICAgaWYgKCgwIDw9IG4pICYmIChuIDw9IDMxKSkKLQl7Ci0JICBhcmdbMF0gPSAibW92IjsKLQotCX0KLSAgICAgIGVsc2UgaWYgKCgtMzEgPD0gbikgJiYgKG4gPD0gLTEpKQotCXsKLQkgIGFyZ1swXSA9ICJzdWJvIjsKLQkgIGFyZ1szXSA9IGFyZ1syXTsKLQkgIHNwcmludGYgKGJ1ZiwgIiVkIiwgLW4pOwotCSAgYXJnWzFdID0gYnVmOwotCSAgYXJnWzJdID0gIjAiOwotCi0JfQotICAgICAgZWxzZSBpZiAoKDMyIDw9IG4pICYmIChuIDw9IDYyKSkKLQl7Ci0JICBhcmdbMF0gPSAiYWRkbyI7Ci0JICBhcmdbM10gPSBhcmdbMl07Ci0JICBhcmdbMV0gPSAiMzEiOwotCSAgc3ByaW50ZiAoYnVmLCAiJWQiLCBuIC0gMzEpOwotCSAgYXJnWzJdID0gYnVmOwotCi0JfQotICAgICAgZWxzZSBpZiAoKHNoaWZ0ID0gc2hpZnRfb2sgKG4pKSAhPSAwKQotCXsKLQkgIGFyZ1swXSA9ICJzaGxvIjsKLQkgIGFyZ1szXSA9IGFyZ1syXTsKLQkgIHNwcmludGYgKGJ1ZiwgIiVkIiwgc2hpZnQpOwotCSAgYXJnWzFdID0gYnVmOwotCSAgc3ByaW50ZiAoYnVmMiwgIiVkIiwgbiA+PiBzaGlmdCk7Ci0JICBhcmdbMl0gPSBidWYyOwotCi0JfQotICAgICAgZWxzZQotCXsKLQkgIGFyZ1swXSA9ICJsZGEiOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX2lsbGVnYWw6Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgY29uc3RhbnQiKSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAoYXJnWzNdID09IDApID8gMiA6IDM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgcGFyc2VfbWVtb3A6CXBhcnNlIGEgbWVtb3J5IG9wZXJhbmQKLQotICAJVGhpcyByb3V0aW5lIGlzIGJhc2VkIG9uIHRoZSBvYnNlcnZhdGlvbiB0aGF0IHRoZSA0IG1vZGUgYml0cyBvZiB0aGUKLSAgCU1FTUIgZm9ybWF0LCB0YWtlbiBpbmRpdmlkdWFsbHksIGhhdmUgZmFpcmx5IGNvbnNpc3RlbnQgbWVhbmluZzoKLQotICAJCSBNMyAoYml0IDEzKTogMSBpZiBkaXNwbGFjZW1lbnQgaXMgcHJlc2VudCAoRF9CSVQpCi0gIAkJIE0yIChiaXQgMTIpOiAxIGZvciBNRU1CIGluc3RydWN0aW9ucyAoTUVNQl9CSVQpCi0gIAkJIE0xIChiaXQgMTEpOiAxIGlmIGluZGV4IGlzIHByZXNlbnQgKElfQklUKQotICAJCSBNMCAoYml0IDEwKTogMSBpZiBhYmFzZSBpcyBwcmVzZW50IChBX0JJVCkKLQotICAJU28gd2UgcGFyc2UgdGhlIG1lbW9yeSBvcGVyYW5kIGFuZCBzZXQgYml0cyBpbiB0aGUgbW9kZSBhcyB3ZSBmaW5kCi0gIAl0aGluZ3MuICBUaGVuIGF0IHRoZSBlbmQsIGlmIHdlIGdvIHRvIE1FTUIgZm9ybWF0LCB3ZSBuZWVkIG9ubHkgc2V0Ci0gIAl0aGUgTUVNQiBiaXQgKE0yKSBhbmQgb3VyIG1vZGUgaXMgYnVpbHQgZm9yIHVzLgotCi0gIAlVbmZvcnR1bmF0ZWx5LCBJIHNhaWQgImZhaXJseSBjb25zaXN0ZW50Ii4gIFRoZSBleGNlcHRpb25zOgotCi0gIAkJIERCSUEKLSAgCQkgMDEwMAlXb3VsZCBzZWVtIGlsbGVnYWwsIGJ1dCBtZWFucyAiYWJhc2Utb25seSIuCi0KLSAgCQkgMDEwMQlXb3VsZCBzZWVtIHRvIG1lYW4gImFiYXNlLW9ubHkiIC0tIGl0IG1lYW5zIElQLXJlbGF0aXZlLgotICAJCQlNdXN0IGJlIGNvbnZlcnRlZCB0byAwMTAwLgotCi0gIAkJIDAxMTAJV291bGQgc2VlbSB0byBtZWFuICJpbmRleC1vbmx5IiwgYnV0IGlzIHJlc2VydmVkLgotICAJCQlXZSB0dXJuIG9uIHRoZSBEIGJpdCBhbmQgcHJvdmlkZSBhIDAgZGlzcGxhY2VtZW50LgotCi0gIAlUaGUgb3RoZXIgdGhpbmcgdG8gb2JzZXJ2ZSBpcyB0aGF0IHdlIHBhcnNlIGZyb20gdGhlIHJpZ2h0LCBwZWVsaW5nCi0gIAl0aGluZ3MgKiBvZmYgYXMgd2UgZ286ICBmaXJzdCBhbnkgaW5kZXggc3BlYywgdGhlbiBhbnkgYWJhc2UsIHRoZW4KLSAgCXRoZSBkaXNwbGFjZW1lbnQuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMKLXZvaWQKLXBhcnNlX21lbW9wIChtZW1QLCBhcmdQLCBvcHR5cGUpCi0gICAgIG1lbVMgKm1lbVA7CQkvKiBXaGVyZSB0byBwdXQgdGhlIHJlc3VsdHMgKi8KLSAgICAgY2hhciAqYXJnUDsJCS8qIFRleHQgb2YgdGhlIG9wZXJhbmQgdG8gYmUgcGFyc2VkICovCi0gICAgIGludCBvcHR5cGU7CQkvKiBNRU0xLCBNRU0yLCBNRU00LCBNRU04LCBNRU0xMiwgb3IgTUVNMTYgKi8KLXsKLSAgY2hhciAqaW5kZXhQOwkJCS8qIFBvaW50ZXIgdG8gaW5kZXggc3BlY2lmaWNhdGlvbiB3aXRoICJbXSIgcmVtb3ZlZCAqLwotICBjaGFyICpwOwkJCS8qIFRlbXAgY2hhciBwb2ludGVyICovCi0gIGNoYXIgaXByZWxfZmxhZzsJCS8qIFRydWUgaWYgdGhpcyBpcyBhbiBJUC1yZWxhdGl2ZSBvcGVyYW5kICovCi0gIGludCByZWdudW07CQkJLyogUmVnaXN0ZXIgbnVtYmVyICovCi0gIC8qIFNjYWxlIGZhY3RvcjogMSwyLDQsOCwgb3IgMTYuICBMYXRlciBjb252ZXJ0ZWQgdG8gaW50ZXJuYWwgZm9ybWF0Ci0gICAgICgwLDEsMiwzLDQgcmVzcGVjdGl2ZWx5KS4gICovCi0gIGludCBzY2FsZTsKLSAgaW50IG1vZGU7CQkJLyogTUVNQiBtb2RlIGJpdHMgKi8KLSAgaW50ICppbnRQOwkJCS8qIFBvaW50ZXIgdG8gcmVnaXN0ZXIgbnVtYmVyICovCi0KLSAgLyogVGhlIGZvbGxvd2luZyB0YWJsZSBjb250YWlucyB0aGUgZGVmYXVsdCBzY2FsZSBmYWN0b3JzIGZvciBlYWNoCi0gICAgIHR5cGUgb2YgbWVtb3J5IGluc3RydWN0aW9uLiAgSXQgaXMgYWNjZXNzZWQgdXNpbmcgKG9wdHlwZS1NRU0xKQotICAgICBhcyBhbiBpbmRleCAtLSB0aHVzIGl0IGFzc3VtZXMgdGhlICdvcHR5cGUnIGNvbnN0YW50cyBhcmUKLSAgICAgYXNzaWduZWQgY29uc2VjdXRpdmUgdmFsdWVzLCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhpcwotICAgICB0YWJsZS4gICovCi0gIHN0YXRpYyBjb25zdCBpbnQgZGVmX3NjYWxlW10gPQotICB7Ci0gICAgMSwJCQkJLyogTUVNMSAqLwotICAgIDIsCQkJCS8qIE1FTTIgKi8KLSAgICA0LAkJCQkvKiBNRU00ICovCi0gICAgOCwJCQkJLyogTUVNOCAqLwotICAgIC0xLAkJCQkvKiBNRU0xMiAtLSBubyB2YWxpZCBkZWZhdWx0ICovCi0gICAgMTYJCQkJLyogTUVNMTYgKi8KLSAgfTsKLQotCi0gIGlwcmVsX2ZsYWcgPSBtb2RlID0gMDsKLQotICAvKiBBbnkgaW5kZXggcHJlc2VudD8gKi8KLSAgaW5kZXhQID0gZ2V0X2lzcGVjIChhcmdQKTsKLSAgaWYgKGluZGV4UCkKLSAgICB7Ci0gICAgICBwID0gc3RyY2hyIChpbmRleFAsICcqJyk7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCXsKLQkgIC8qIE5vIGV4cGxpY2l0IHNjYWxlIC0tIHVzZSBkZWZhdWx0IGZvciB0aGlzIGluc3RydWN0aW9uCi0JICAgICB0eXBlIGFuZCBhc3NlbWJsZXIgbW9kZS4gICovCi0JICBpZiAoZmxhZ19tcmkpCi0JICAgIHNjYWxlID0gMTsKLQkgIGVsc2UKLQkgICAgLyogR05VOTYwIGNvbXBhdGliaWxpdHkgKi8KLQkgICAgc2NhbGUgPSBkZWZfc2NhbGVbb3B0eXBlIC0gTUVNMV07Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICpwKysgPSAnXDAnOwkJLyogRWxpbWluYXRlICcqJyAqLwotCi0JICAvKiBOb3cgaW5kZXhQLT5hICdcMCctdGVybWluYXRlZCByZWdpc3RlciBuYW1lLAotCSAgICAgKiBhbmQgcC0+YSBzY2FsZSBmYWN0b3IuCi0JICAgKi8KLQotCSAgaWYgKCFzdHJjbXAgKHAsICIxNiIpKQotCSAgICB7Ci0JICAgICAgc2NhbGUgPSAxNjsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY2hyICgiMTI0OCIsICpwKSAmJiAocFsxXSA9PSAnXDAnKSkKLQkgICAgewotCSAgICAgIHNjYWxlID0gKnAgLSAnMCc7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNjYWxlID0gLTE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHJlZ251bSA9IGdldF9yZWdudW0gKGluZGV4UCk7CS8qIEdldCBpbmRleCByZWcuICMgKi8KLSAgICAgIGlmICghSVNfUkdfUkVHIChyZWdudW0pKQotCXsKLQkgIGFzX2JhZCAoXygiaW52YWxpZCBpbmRleCByZWdpc3RlciIpKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIENvbnZlcnQgc2NhbGUgdG8gaXRzIGJpbmFyeSBlbmNvZGluZyAqLwotICAgICAgc3dpdGNoIChzY2FsZSkKLQl7Ci0JY2FzZSAxOgotCSAgc2NhbGUgPSAwIDw8IDc7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBzY2FsZSA9IDEgPDwgNzsKLQkgIGJyZWFrOwotCWNhc2UgNDoKLQkgIHNjYWxlID0gMiA8PCA3OwotCSAgYnJlYWs7Ci0JY2FzZSA4OgotCSAgc2NhbGUgPSAzIDw8IDc7Ci0JICBicmVhazsKLQljYXNlIDE2OgotCSAgc2NhbGUgPSA0IDw8IDc7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYXNfYmFkIChfKCJpbnZhbGlkIHNjYWxlIGZhY3RvciIpKTsKLQkgIHJldHVybjsKLQl9OwotCi0gICAgICBtZW1QLT5vcGNvZGUgfD0gc2NhbGUgfCByZWdudW07CS8qIFNldCBpbmRleCBiaXRzIGluIG9wY29kZSAqLwotICAgICAgbW9kZSB8PSBJX0JJVDsJCS8qIEZvdW5kIGEgdmFsaWQgaW5kZXggc3BlYyAqLwotICAgIH0KLQotICAvKiBBbnkgYWJhc2UgKFJlZ2lzdGVyIEluZGlyZWN0KSBzcGVjaWZpY2F0aW9uIHByZXNlbnQ/ICovCi0gIGlmICgocCA9IHN0cnJjaHIgKGFyZ1AsICcoJykpICE9IE5VTEwpCi0gICAgewotICAgICAgLyogIigiIGlzIHRoZXJlIC0tIGRvZXMgaXQgc3RhcnQgYSBsZWdhbCBhYmFzZSBzcGVjPyAgSWYgbm90LCBpdAotICAgICAgICAgY291bGQgYmUgcGFydCBvZiBhIGRpc3BsYWNlbWVudCBleHByZXNzaW9uLiAgKi8KLSAgICAgIGludFAgPSAoaW50ICopIGhhc2hfZmluZCAoYXJlZ19oYXNoLCBwKTsKLSAgICAgIGlmIChpbnRQICE9IE5VTEwpCi0JewotCSAgLyogR290IGFuIGFiYXNlIGhlcmUgKi8KLQkgIHJlZ251bSA9ICppbnRQOwotCSAgKnAgPSAnXDAnOwkJLyogZGlzY2FyZCByZWdpc3RlciBzcGVjICovCi0JICBpZiAocmVnbnVtID09IElQUkVMKQotCSAgICB7Ci0JICAgICAgLyogV2UgaGF2ZSB0byBzcGVjaWFsY2FzZSBpcC1yZWwgbW9kZSAqLwotCSAgICAgIGlwcmVsX2ZsYWcgPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtZW1QLT5vcGNvZGUgfD0gcmVnbnVtIDw8IDE0OwotCSAgICAgIG1vZGUgfD0gQV9CSVQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFueSBleHByZXNzaW9uIHByZXNlbnQ/ICovCi0gIG1lbVAtPmUgPSBhcmdQOwotICBpZiAoKmFyZ1AgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBtb2RlIHw9IERfQklUOwotICAgIH0KLQotICAvKiBTcGVjaWFsLWNhc2UgaXAtcmVsYXRpdmUgYWRkcmVzc2luZyAqLwotICBpZiAoaXByZWxfZmxhZykKLSAgICB7Ci0gICAgICBpZiAobW9kZSAmIElfQklUKQotCXsKLQkgIHN5bnRheCAoKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWVtUC0+b3Bjb2RlIHw9IDUgPDwgMTA7CS8qIElQLXJlbGF0aXZlIG1vZGUgKi8KLQkgIG1lbVAtPmRpc3AgPSAzMjsKLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEhhbmRsZSBhbGwgb3RoZXIgbW9kZXMgKi8KLSAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICBjYXNlIERfQklUIHwgQV9CSVQ6Ci0gICAgICAvKiBHbyB3aXRoIE1FTUEgaW5zdHJ1Y3Rpb24gZm9ybWF0IGZvciBub3cgKGdyb3cgdG8gTUVNQiBsYXRlcgotICAgICAgICAgaWYgMTIgYml0cyBpcyBub3QgZW5vdWdoIGZvciB0aGUgZGlzcGxhY2VtZW50KS4gIE1FTUEgZm9ybWF0Ci0gICAgICAgICBoYXMgYSBzaW5nbGUgbW9kZSBiaXQ6IHNldCBpdCB0byBpbmRpY2F0ZSB0aGF0IGFiYXNlIGlzCi0gICAgICAgICBwcmVzZW50LiAgKi8KLSAgICAgIG1lbVAtPm9wY29kZSB8PSBNRU1BX0FCQVNFOwotICAgICAgbWVtUC0+ZGlzcCA9IDEyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERfQklUOgotICAgICAgLyogR28gd2l0aCBNRU1BIGluc3RydWN0aW9uIGZvcm1hdCBmb3Igbm93IChncm93IHRvIE1FTUIgbGF0ZXIKLSAgICAgICAgIGlmIDEyIGJpdHMgaXMgbm90IGVub3VnaCBmb3IgdGhlIGRpc3BsYWNlbWVudCkuICAqLwotICAgICAgbWVtUC0+ZGlzcCA9IDEyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFfQklUOgotICAgICAgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgYml0IHN0cmluZyBmb3IgdGhpcyBtb2RlIGlzIG5vdAotICAgICAgICAgY29uc2lzdGVudDogaXQgc2hvdWxkIGJlIDAgKGV4Y2x1c2l2ZSBvZiB0aGUgTUVNQiBiaXQpLCBzbyB3ZQotICAgICAgICAgc2V0IGl0ICJieSBoYW5kIiBoZXJlLiAgKi8KLSAgICAgIG1lbVAtPm9wY29kZSB8PSBNRU1CX0JJVDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBX0JJVCB8IElfQklUOgotICAgICAgLyogc2V0IE1FTUIgYml0IGluIG1vZGUsIGFuZCBPUiBpbiBtb2RlIGJpdHMgKi8KLSAgICAgIG1lbVAtPm9wY29kZSB8PSBtb2RlIHwgTUVNQl9CSVQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSV9CSVQ6Ci0gICAgICAvKiBUcmVhdCBtaXNzaW5nIGRpc3BsYWNlbWVudCBhcyBkaXNwbGFjZW1lbnQgb2YgMC4gICovCi0gICAgICBtb2RlIHw9IERfQklUOwotICAgICAgLyogRmFsbCBpbnRvIG5leHQgY2FzZS4gICovCi0gICAgY2FzZSBEX0JJVCB8IEFfQklUIHwgSV9CSVQ6Ci0gICAgY2FzZSBEX0JJVCB8IElfQklUOgotICAgICAgLyogc2V0IE1FTUIgYml0IGluIG1vZGUsIGFuZCBPUiBpbiBtb2RlIGJpdHMgKi8KLSAgICAgIG1lbVAtPm9wY29kZSB8PSBtb2RlIHwgTUVNQl9CSVQ7Ci0gICAgICBtZW1QLT5kaXNwID0gMzI7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzeW50YXggKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgcGFyc2VfcG86CXBhcnNlIG1hY2hpbmUtZGVwZW5kZW50IHBzZXVkby1vcAotCi0gIAlUaGlzIGlzIGEgdG9wLWxldmVsIHJvdXRpbmUgZm9yIG1hY2hpbmUtZGVwZW5kZW50IHBzZXVkby1vcHMuICBJdCBzbHVycHMKLSAgCXVwIHRoZSByZXN0IG9mIHRoZSBpbnB1dCBsaW5lLCBicmVha3Mgb3V0IHRoZSBpbmRpdmlkdWFsIGFyZ3VtZW50cywKLSAgCWFuZCBkaXNwYXRjaGVzIHRoZW0gdG8gdGhlIGNvcnJlY3QgaGFuZGxlci4KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMKLXZvaWQKLXBhcnNlX3BvIChwb19udW0pCi0gICAgIGludCBwb19udW07CQkvKiBQc2V1ZG8tb3AgbnVtYmVyOiAgY3VycmVudGx5IFNfTEVBRlBST0Mgb3IgU19TWVNQUk9DICovCi17Ci0gIC8qIFBvaW50ZXJzIG9wZXJhbmRzLCB3aXRoIG5vIGVtYmVkZGVkIHdoaXRlc3BhY2UuCi0gICAgIGFyZ1swXSB1bnVzZWQsIGFyZ1sxLTNdLT5vcGVyYW5kcyAqLwotICBjaGFyICphcmdzWzRdOwotICBpbnQgbl9vcHM7CQkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCi0gIGNoYXIgKnA7CQkJLyogUG9pbnRlciB0byBiZWdpbm5pbmcgb2YgdW5wYXJzZWQgYXJndW1lbnQgc3RyaW5nICovCi0gIGNoYXIgZW9sOwkJCS8qIENoYXJhY3RlciB0aGF0IGluZGljYXRlZCBlbmQgb2YgbGluZSAqLwotCi0gIGV4dGVybiBjaGFyIGlzX2VuZF9vZl9saW5lW107Ci0KLSAgLyogQWR2YW5jZSBpbnB1dCBwb2ludGVyIHRvIGVuZCBvZiBsaW5lLiAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gIGVvbCA9ICppbnB1dF9saW5lX3BvaW50ZXI7CS8qIFNhdmUgZW5kLW9mLWxpbmUgY2hhciAqLwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsJLyogVGVybWluYXRlIGFyZ3VtZW50IGxpc3QgKi8KLQotICAvKiBQYXJzZSBvdXQgb3BlcmFuZHMgKi8KLSAgbl9vcHMgPSBnZXRfYXJncyAocCwgYXJncyk7Ci0gIGlmIChuX29wcyA9PSAtMSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIERpc3BhdGNoIHRvIGNvcnJlY3QgaGFuZGxlciAqLwotICBzd2l0Y2ggKHBvX251bSkKLSAgICB7Ci0gICAgY2FzZSBTX1NZU1BST0M6Ci0gICAgICBzX3N5c3Byb2MgKG5fb3BzLCBhcmdzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU19MRUFGUFJPQzoKLSAgICAgIHNfbGVhZnByb2MgKG5fb3BzLCBhcmdzKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBCQURfQ0FTRSAocG9fbnVtKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBSZXN0b3JlIGVvbCwgc28gbGluZSBudW1iZXJzIGdldCB1cGRhdGVkIGNvcnJlY3RseS4gIEJhc2UKLSAgICAgYXNzZW1ibGVyIGFzc3VtZXMgd2UgbGVhdmUgaW5wdXQgcG9pbnRlciBwb2ludGluZyBhdCBjaGFyCi0gICAgIGZvbGxvd2luZyB0aGUgZW9sLiAgKi8KLSAgKmlucHV0X2xpbmVfcG9pbnRlcisrID0gZW9sOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIHBhcnNlX3JlZ29wOiBwYXJzZSBhIHJlZ2lzdGVyIG9wZXJhbmQuCi0KLSAgCUluIGNhc2Ugb2YgaWxsZWdhbCBvcGVyYW5kLCBpc3N1ZSBhIG1lc3NhZ2UgYW5kIHJldHVybiBzb21lIHZhbGlkCi0gIAlpbmZvcm1hdGlvbiBzbyBpbnN0cnVjdGlvbiBwcm9jZXNzaW5nIGNhbiBjb250aW51ZS4KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMKLXZvaWQKLXBhcnNlX3JlZ29wIChyZWdvcFAsIG9wdGV4dCwgb3BkZXNjKQotICAgICBzdHJ1Y3QgcmVnb3AgKnJlZ29wUDsJLyogV2hlcmUgdG8gcHV0IGRlc2NyaXB0aW9uIG9mIHJlZ2lzdGVyIG9wZXJhbmQgKi8KLSAgICAgY2hhciAqb3B0ZXh0OwkJLyogVGV4dCBvZiBvcGVyYW5kICovCi0gICAgIGNoYXIgb3BkZXNjOwkJLyogRGVzY3JpcHRvciBieXRlOiAgd2hhdCdzIGxlZ2FsIGZvciB0aGlzIG9wZXJhbmQgKi8KLXsKLSAgaW50IG47CQkJLyogUmVnaXN0ZXIgbnVtYmVyICovCi0gIGV4cHJlc3Npb25TIGU7CQkvKiBQYXJzZWQgZXhwcmVzc2lvbiAqLwotCi0gIC8qIFNlZSBpZiBvcGVyYW5kIGlzIGEgcmVnaXN0ZXIgKi8KLSAgbiA9IGdldF9yZWdudW0gKG9wdGV4dCk7Ci0gIGlmIChuID49IDApCi0gICAgewotICAgICAgaWYgKElTX1JHX1JFRyAobikpCi0JewotCSAgLyogZ2xvYmFsIG9yIGxvY2FsIHJlZ2lzdGVyICovCi0JICBpZiAoIVJFR19BTElHTiAob3BkZXNjLCBuKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygidW5hbGlnbmVkIHJlZ2lzdGVyIikpOwotCSAgICB9Ci0JICByZWdvcFAtPm4gPSBuOwotCSAgcmVnb3BQLT5tb2RlID0gMDsKLQkgIHJlZ29wUC0+c3BlY2lhbCA9IDA7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZSBpZiAoSVNfRlBfUkVHIChuKSAmJiBGUF9PSyAob3BkZXNjKSkKLQl7Ci0JICAvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlciwgYW5kIGl0J3MgYWxsb3dlZCAqLwotCSAgcmVnb3BQLT5uID0gbiAtIEZQMDsKLQkgIHJlZ29wUC0+bW9kZSA9IDE7Ci0JICByZWdvcFAtPnNwZWNpYWwgPSAwOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKElTX1NGX1JFRyAobikgJiYgU0ZSX09LIChvcGRlc2MpKQotCXsKLQkgIC8qIFNwZWNpYWwtZnVuY3Rpb24gcmVnaXN0ZXIsIGFuZCBpdCdzIGFsbG93ZWQgKi8KLQkgIHJlZ29wUC0+biA9IG4gLSBTRjA7Ci0JICByZWdvcFAtPm1vZGUgPSAwOwotCSAgcmVnb3BQLT5zcGVjaWFsID0gMTsKLQkgIGlmICghdGFyZ19oYXNfc2ZyIChyZWdvcFAtPm4pKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJubyBzdWNoIHNmciBpbiB0aGlzIGFyY2hpdGVjdHVyZSIpKTsKLQkgICAgfQotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKExJVF9PSyAob3BkZXNjKSkKLSAgICB7Ci0gICAgICAvKiBIb3cgYWJvdXQgYSBsaXRlcmFsPyAgKi8KLSAgICAgIHJlZ29wUC0+bW9kZSA9IDE7Ci0gICAgICByZWdvcFAtPnNwZWNpYWwgPSAwOwotICAgICAgaWYgKEZQX09LIChvcGRlc2MpKQotCXsJCQkvKiBmbG9hdGluZyBwb2ludCBsaXRlcmFsIGFjY2VwdGFibGUgKi8KLQkgIC8qIFNraXAgb3ZlciAwZiwgMGQsIG9yIDBlIHByZWZpeCAqLwotCSAgaWYgKChvcHRleHRbMF0gPT0gJzAnKQotCSAgICAgICYmIChvcHRleHRbMV0gPj0gJ2QnKQotCSAgICAgICYmIChvcHRleHRbMV0gPD0gJ2YnKSkKLQkgICAgewotCSAgICAgIG9wdGV4dCArPSAyOwotCSAgICB9Ci0KLQkgIGlmICghc3RyY21wIChvcHRleHQsICIwLjAiKSB8fCAhc3RyY21wIChvcHRleHQsICIwIikpCi0JICAgIHsKLQkgICAgICByZWdvcFAtPm4gPSAweDEwOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgaWYgKCFzdHJjbXAgKG9wdGV4dCwgIjEuMCIpIHx8ICFzdHJjbXAgKG9wdGV4dCwgIjEiKSkKLQkgICAgewotCSAgICAgIHJlZ29wUC0+biA9IDB4MTY7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQl9Ci0gICAgICBlbHNlCi0JewkJCS8qIGZpeGVkIHBvaW50IGxpdGVyYWwgYWNjZXB0YWJsZSAqLwotCSAgcGFyc2VfZXhwciAob3B0ZXh0LCAmZSk7Ci0JICBpZiAoZS5YX29wICE9IE9fY29uc3RhbnQKLQkgICAgICB8fCAob2ZmcyAoZSkgPCAwKSB8fCAob2ZmcyAoZSkgPiAzMSkpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImlsbGVnYWwgbGl0ZXJhbCIpKTsKLQkgICAgICBvZmZzIChlKSA9IDA7Ci0JICAgIH0KLQkgIHJlZ29wUC0+biA9IG9mZnMgKGUpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogTm90aGluZyB3b3JrZWQgKi8KLSAgc3ludGF4ICgpOwotICByZWdvcFAtPm1vZGUgPSAwOwkJLyogUmVnaXN0ZXIgcjAgaXMgYWx3YXlzIGEgZ29vZCBvbmUgKi8KLSAgcmVnb3BQLT5uID0gMDsKLSAgcmVnb3BQLT5zcGVjaWFsID0gMDsKLX0JCQkJLyogcGFyc2VfcmVnb3AoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIHJlZ19mbXQ6CWdlbmVyYXRlIGEgUkVHLWZvcm1hdCBpbnN0cnVjdGlvbgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIHZvaWQKLXJlZ19mbXQgKGFyZ3MsIG9QKQotICAgICBjaGFyICphcmdzW107CQkvKiBhcmdzWzBdLT5vcGNvZGUgbW5lbW9uaWMsIGFyZ3NbMS0zXS0+b3BlcmFuZHMgKi8KLSAgICAgc3RydWN0IGk5NjBfb3Bjb2RlICpvUDsJLyogUG9pbnRlciB0byBkZXNjcmlwdGlvbiBvZiBpbnN0cnVjdGlvbiAqLwotewotICBsb25nIGluc3RyOwkJCS8qIEJpbmFyeSB0byBiZSBvdXRwdXQgKi8KLSAgc3RydWN0IHJlZ29wIHJlZ29wOwkJLyogRGVzY3JpcHRpb24gb2YgcmVnaXN0ZXIgb3BlcmFuZCAqLwotICBpbnQgbl9vcHM7CQkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCi0KLQotICBpbnN0ciA9IG9QLT5vcGNvZGU7Ci0gIG5fb3BzID0gb1AtPm51bV9vcHM7Ci0KLSAgaWYgKG5fb3BzID49IDEpCi0gICAgewotICAgICAgcGFyc2VfcmVnb3AgKCZyZWdvcCwgYXJnc1sxXSwgb1AtPm9wZXJhbmRbMF0pOwotCi0gICAgICBpZiAoKG5fb3BzID09IDEpICYmICEoaW5zdHIgJiBNMykpCi0JewotCSAgLyogMS1vcGVyYW5kIGluc3RydWN0aW9uIGluIHdoaWNoIHRoZSBkc3QgZmllbGQgc2hvdWxkCi0JICAgICAqIGJlIHVzZWQgKGluc3RlYWQgb2Ygc3JjMSkuCi0JICAgKi8KLQkgIHJlZ29wLm4gPDw9IDE5OwotCSAgaWYgKHJlZ29wLnNwZWNpYWwpCi0JICAgIHsKLQkgICAgICByZWdvcC5tb2RlID0gcmVnb3Auc3BlY2lhbDsKLQkgICAgfQotCSAgcmVnb3AubW9kZSA8PD0gMTM7Ci0JICByZWdvcC5zcGVjaWFsID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogcmVnb3AubiBnb2VzIGluIGJpdCAwLCBuZWVkcyBubyBzaGlmdGluZyAqLwotCSAgcmVnb3AubW9kZSA8PD0gMTE7Ci0JICByZWdvcC5zcGVjaWFsIDw8PSA1OwotCX0KLSAgICAgIGluc3RyIHw9IHJlZ29wLm4gfCByZWdvcC5tb2RlIHwgcmVnb3Auc3BlY2lhbDsKLSAgICB9Ci0KLSAgaWYgKG5fb3BzID49IDIpCi0gICAgewotICAgICAgcGFyc2VfcmVnb3AgKCZyZWdvcCwgYXJnc1syXSwgb1AtPm9wZXJhbmRbMV0pOwotCi0gICAgICBpZiAoKG5fb3BzID09IDIpICYmICEoaW5zdHIgJiBNMykpCi0JewotCSAgLyogMi1vcGVyYW5kIGluc3RydWN0aW9uIGluIHdoaWNoIHRoZSBkc3QgZmllbGQgc2hvdWxkCi0JICAgICAqIGJlIHVzZWQgaW5zdGVhZCBvZiBzcmMyKS4KLQkgICAqLwotCSAgcmVnb3AubiA8PD0gMTk7Ci0JICBpZiAocmVnb3Auc3BlY2lhbCkKLQkgICAgewotCSAgICAgIHJlZ29wLm1vZGUgPSByZWdvcC5zcGVjaWFsOwotCSAgICB9Ci0JICByZWdvcC5tb2RlIDw8PSAxMzsKLQkgIHJlZ29wLnNwZWNpYWwgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByZWdvcC5uIDw8PSAxNDsKLQkgIHJlZ29wLm1vZGUgPDw9IDEyOwotCSAgcmVnb3Auc3BlY2lhbCA8PD0gNjsKLQl9Ci0gICAgICBpbnN0ciB8PSByZWdvcC5uIHwgcmVnb3AubW9kZSB8IHJlZ29wLnNwZWNpYWw7Ci0gICAgfQotICBpZiAobl9vcHMgPT0gMykKLSAgICB7Ci0gICAgICBwYXJzZV9yZWdvcCAoJnJlZ29wLCBhcmdzWzNdLCBvUC0+b3BlcmFuZFsyXSk7Ci0gICAgICBpZiAocmVnb3Auc3BlY2lhbCkKLQl7Ci0JICByZWdvcC5tb2RlID0gcmVnb3Auc3BlY2lhbDsKLQl9Ci0gICAgICBpbnN0ciB8PSAocmVnb3AubiA8PD0gMTkpIHwgKHJlZ29wLm1vZGUgPDw9IDEzKTsKLSAgICB9Ci0gIGVtaXQgKGluc3RyKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIHJlbGF4X2NvYnI6Ci0gIAlSZXBsYWNlIGNvYnIgaW5zdHJ1Y3Rpb24gaW4gYSBjb2RlIGZyYWdtZW50IHdpdGggZXF1aXZhbGVudCBicmFuY2ggYW5kCi0gIAljb21wYXJlIGluc3RydWN0aW9ucywgc28gaXQgY2FuIHJlYWNoIGJleW9uZCBhIDEzLWJpdCBkaXNwbGFjZW1lbnQuCi0gIAlTZXQgdXAgYW4gYWRkcmVzcyBmaXgvcmVsb2NhdGlvbiBmb3IgdGhlIG5ldyBicmFuY2ggaW5zdHJ1Y3Rpb24uCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIFRoaXMgImNvbmRpdGlvbmFsIGp1bXAiIHRhYmxlIG1hcHMgY29iciBpbnN0cnVjdGlvbnMgaW50bwotICAgZXF1aXZhbGVudCBjb21wYXJlIGFuZCBicmFuY2ggb3Bjb2Rlcy4gICovCi1zdGF0aWMgY29uc3QKLXN0cnVjdAotewotICBsb25nIGNvbXBhcmU7Ci0gIGxvbmcgYnJhbmNoOwotfQotCi1jb2pbXSA9Ci17CQkJCS8qIENPQlIgT1BDT0RFOiAqLwotICB7IENIS0JJVCwgQk5PIH0sCQkvKiAgICAgIDB4MzAgLSBiYmMgKi8KLSAgeyBDTVBPLCBCRyB9LAkJCS8qICAgICAgMHgzMSAtIGNtcG9iZyAqLwotICB7IENNUE8sIEJFIH0sCQkJLyogICAgICAweDMyIC0gY21wb2JlICovCi0gIHsgQ01QTywgQkdFIH0sCQkvKiAgICAgIDB4MzMgLSBjbXBvYmdlICovCi0gIHsgQ01QTywgQkwgfSwJCQkvKiAgICAgIDB4MzQgLSBjbXBvYmwgKi8KLSAgeyBDTVBPLCBCTkUgfSwJCS8qICAgICAgMHgzNSAtIGNtcG9ibmUgKi8KLSAgeyBDTVBPLCBCTEUgfSwJCS8qICAgICAgMHgzNiAtIGNtcG9ibGUgKi8KLSAgeyBDSEtCSVQsIEJPIH0sCQkvKiAgICAgIDB4MzcgLSBiYnMgKi8KLSAgeyBDTVBJLCBCTk8gfSwJCS8qICAgICAgMHgzOCAtIGNtcGlibm8gKi8KLSAgeyBDTVBJLCBCRyB9LAkJCS8qICAgICAgMHgzOSAtIGNtcGliZyAqLwotICB7IENNUEksIEJFIH0sCQkJLyogICAgICAweDNhIC0gY21waWJlICovCi0gIHsgQ01QSSwgQkdFIH0sCQkvKiAgICAgIDB4M2IgLSBjbXBpYmdlICovCi0gIHsgQ01QSSwgQkwgfSwJCQkvKiAgICAgIDB4M2MgLSBjbXBpYmwgKi8KLSAgeyBDTVBJLCBCTkUgfSwJCS8qICAgICAgMHgzZCAtIGNtcGlibmUgKi8KLSAgeyBDTVBJLCBCTEUgfSwJCS8qICAgICAgMHgzZSAtIGNtcGlibGUgKi8KLSAgeyBDTVBJLCBCTyB9LAkJCS8qICAgICAgMHgzZiAtIGNtcGlibyAqLwotfTsKLQotc3RhdGljCi12b2lkCi1yZWxheF9jb2JyIChmcmFnUCkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwkvKiBmcmFnUC0+ZnJfb3Bjb2RlIGlzIGFzc3VtZWQgdG8gcG9pbnQgdG8KLQkJCQkgKiB0aGUgY29iciBpbnN0cnVjdGlvbiwgd2hpY2ggY29tZXMgYXQgdGhlCi0JCQkJICogZW5kIG9mIHRoZSBjb2RlIGZyYWdtZW50LgotCQkJCSAqLwotewotICBpbnQgb3Bjb2RlLCBzcmMxLCBzcmMyLCBtMSwgczI7Ci0gIC8qIEJpdCBmaWVsZHMgZnJvbSBjb2JyIGluc3RydWN0aW9uICovCi0gIGxvbmcgYnBfYml0czsJCQkvKiBCcmFuY2ggcHJlZGljdGlvbiBiaXRzIGZyb20gY29iciBpbnN0cnVjdGlvbiAqLwotICBsb25nIGluc3RyOwkJCS8qIEEgc2luZ2xlIGk5NjAgaW5zdHJ1Y3Rpb24gKi8KLSAgLyogLT5pbnN0cnVjdGlvbiB0byBiZSByZXBsYWNlZCAqLwotICBjaGFyICppUDsKLSAgZml4UyAqZml4UDsJCQkvKiBSZWxvY2F0aW9uIHRoYXQgY2FuIGJlIGRvbmUgYXQgYXNzZW1ibHkgdGltZSAqLwotCi0gIC8qIFBJQ0sgVVAgJiBQQVJTRSBDT0JSIElOU1RSVUNUSU9OICovCi0gIGlQID0gZnJhZ1AtPmZyX29wY29kZTsKLSAgaW5zdHIgPSBtZF9jaGFyc190b19udW1iZXIgKGlQLCA0KTsKLSAgb3Bjb2RlID0gKChpbnN0ciA+PiAyNCkgJiAweGZmKSAtIDB4MzA7CS8qICItMHgzMCIgZm9yIHRhYmxlIGluZGV4ICovCi0gIHNyYzEgPSAoaW5zdHIgPj4gMTkpICYgMHgxZjsKLSAgbTEgPSAoaW5zdHIgPj4gMTMpICYgMTsKLSAgczIgPSBpbnN0ciAmIDE7Ci0gIHNyYzIgPSAoaW5zdHIgPj4gMTQpICYgMHgxZjsKLSAgYnBfYml0cyA9IGluc3RyICYgQlBfTUFTSzsKLQotICAvKiBHRU5FUkFURSBBTkQgT1VUUFVUIENPTVBBUkUgSU5TVFJVQ1RJT04gKi8KLSAgaW5zdHIgPSBjb2pbb3Bjb2RlXS5jb21wYXJlCi0gICAgfCBzcmMxIHwgKG0xIDw8IDExKSB8IChzMiA8PCA2KSB8IChzcmMyIDw8IDE0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChpUCwgaW5zdHIsIDQpOwotCi0gIC8qIE9VVFBVVCBCUkFOQ0ggSU5TVFJVQ1RJT04gKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChpUCArIDQsIGNvaltvcGNvZGVdLmJyYW5jaCB8IGJwX2JpdHMsIDQpOwotCi0gIC8qIFNFVCBVUCBBRERSRVNTIEZJWFVQL1JFTE9DQVRJT04gKi8KLSAgZml4UCA9IGZpeF9uZXcgKGZyYWdQLAotCQkgIGlQICsgNCAtIGZyYWdQLT5mcl9saXRlcmFsLAotCQkgIDQsCi0JCSAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICBmcmFnUC0+ZnJfb2Zmc2V0LAotCQkgIDEsCi0JCSAgTk9fUkVMT0MpOwotCi0gIGZpeFAtPmZ4X2JpdF9maXhQID0gKGJpdF9maXhTICopIDI0OwkvKiBTdG9yZSBzaXplIG9mIGJpdCBmaWVsZCAqLwotCi0gIGZyYWdQLT5mcl9maXggKz0gNDsKLSAgZnJhZ193YW5lIChmcmFnUCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICByZWxvY19jYWxsajoJUmVsb2NhdGUgYSAnY2FsbGonIGluc3RydWN0aW9uCi0KLSAgCVRoaXMgaXMgYSAibm9uLShHTlUpLXN0YW5kYXJkIiBtYWNoaW5lLWRlcGVuZGVudCBob29rLiAgVGhlIGJhc2UKLSAgCWFzc2VtYmxlciBjYWxscyBpdCB3aGVuIGl0IGRlY2lkZXMgaXQgY2FuIHJlbG9jYXRlIGFuIGFkZHJlc3MgYXQKLSAgCWFzc2VtYmx5IHRpbWUgaW5zdGVhZCBvZiBlbWl0dGluZyBhIHJlbG9jYXRpb24gZGlyZWN0aXZlLgotCi0gIAlDaGVjayB0byBzZWUgaWYgdGhlIHJlbG9jYXRpb24gaW52b2x2ZXMgYSAnY2FsbGonIGluc3RydWN0aW9uIHRvIGE6Ci0gIAkgICAgc3lzcHJvYzoJUmVwbGFjZSB0aGUgZGVmYXVsdCAnY2FsbCcgaW5zdHJ1Y3Rpb24gd2l0aCBhICdjYWxscycKLSAgCSAgICBsZWFmcHJvYzoJUmVwbGFjZSB0aGUgZGVmYXVsdCAnY2FsbCcgaW5zdHJ1Y3Rpb24gd2l0aCBhICdiYWwnLgotICAJICAgIG90aGVyIHByb2M6CURvIG5vdGhpbmcuCi0KLSAgCVNlZSBiLm91dC5oIGZvciBkZXRhaWxzIG9uIHRoZSAnbl9vdGhlcicgZmllbGQgaW4gYSBzeW1ib2wgc3RydWN0dXJlLgotCi0gICBJTVBPUlRBTlQhOgotICAJQXNzdW1lcyB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGZpZ3VyZWQgb3V0LCBpbiB0aGUgY2FzZSBvZiBhIGxlYWZwcm9jLAotICAJdG8gdXNlIHRoZSAnYmFsJyBlbnRyeSBwb2ludCwgYW5kIGhhcyBzdWJzdGl0dXRlZCB0aGF0IHN5bWJvbCBpbnRvIHRoZQotICAJcGFzc2VkIGZpeHVwIHN0cnVjdHVyZS4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXZvaWQKLXJlbG9jX2NhbGxqIChmaXhQKQotICAgICAvKiBSZWxvY2F0aW9uIHRoYXQgY2FuIGJlIGRvbmUgYXQgYXNzZW1ibHkgdGltZSAqLwotICAgICBmaXhTICpmaXhQOwotewotICAvKiBQb2ludHMgdG8gdGhlIGJpbmFyeSBmb3IgdGhlIGluc3RydWN0aW9uIGJlaW5nIHJlbG9jYXRlZC4gICovCi0gIGNoYXIgKndoZXJlOwotCi0gIGlmICghZml4UC0+ZnhfdGNiaXQpCi0gICAgewotICAgICAgLyogVGhpcyB3YXNuJ3QgYSBjYWxsaiBpbnN0cnVjdGlvbiBpbiB0aGUgZmlyc3QgcGxhY2UgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgd2hlcmUgPSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0KLSAgaWYgKFRDX1NfSVNfU1lTUFJPQyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIC8qIFN5bWJvbCBpcyBhIC5zeXNwcm9jOiByZXBsYWNlICdjYWxsJyB3aXRoICdjYWxscycuICBTeXN0ZW0KLSAgICAgICAgIHByb2NlZHVyZSBudW1iZXIgaXMgKG90aGVyLTEpLiAgKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsIENBTExTIHwgVENfU19HRVRfU1lTUFJPQyAoZml4UC0+ZnhfYWRkc3kpLCA0KTsKLQotICAgICAgLyogTm90aGluZyBlbHNlIG5lZWRzIHRvIGJlIGRvbmUgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uICBNYWtlCi0gICAgICAgICBzdXJlICdtZF9udW1iZXJfdG9fZmllbGQoKScgd2lsbCBwZXJmb3JtIGEgbm8tb3AuICAqLwotICAgICAgZml4UC0+ZnhfYml0X2ZpeFAgPSAoYml0X2ZpeFMgKikgMTsKLQotICAgIH0KLSAgZWxzZSBpZiAoVENfU19JU19DQUxMTkFNRSAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIC8qIFNob3VsZCBub3QgaGFwcGVuOiBzZWUgYmxvY2sgY29tbWVudCBhYm92ZSAqLwotICAgICAgYXNfZmF0YWwgKF8oIlRyeWluZyB0byAnYmFsJyB0byAlcyIpLCBTX0dFVF9OQU1FIChmaXhQLT5meF9hZGRzeSkpOwotICAgIH0KLSAgZWxzZSBpZiAoVENfU19JU19CQUxOQU1FIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgLyogUmVwbGFjZSAnY2FsbCcgd2l0aCAnYmFsJzsgYm90aCBpbnN0cnVjdGlvbnMgaGF2ZSB0aGUgc2FtZQotICAgICAgICAgZm9ybWF0LCBzbyBjYWxsaW5nIGNvZGUgc2hvdWxkIGNvbXBsZXRlIHJlbG9jYXRpb24gYXMgaWYKLSAgICAgICAgIG5vdGhpbmcgaGFwcGVuZWQgaGVyZS4gICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLCBCQUwsIDQpOwotICAgIH0KLSAgZWxzZSBpZiAoVENfU19JU19CQURQUk9DIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJMb29rcyBsaWtlIGEgcHJvYywgYnV0IGNhbid0IHRlbGwgd2hhdCBraW5kLlxuIikpOwotICAgIH0JCQkJLyogc3dpdGNoIG9uIHByb2MgdHlwZSAqLwotCi0gIC8qIGVsc2UgU3ltYm9sIGlzIG5laXRoZXIgYSBzeXNwcm9jIG5vciBhIGxlYWZwcm9jICovCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBzX2xlYWZwcm9jOglwcm9jZXNzIC5sZWFmcHJvYyBwc2V1ZG8tb3AKLQotICAJLmxlYWZwcm9jIHRha2VzIHR3byBhcmd1bWVudHMsIHRoZSBzZWNvbmQgb25lIGlzIG9wdGlvbmFsOgotICAJCWFyZ1sxXTogbmFtZSBvZiAnY2FsbCcgZW50cnkgcG9pbnQgdG8gbGVhZiBwcm9jZWR1cmUKLSAgCQlhcmdbMl06IG5hbWUgb2YgJ2JhbCcgZW50cnkgcG9pbnQgdG8gbGVhZiBwcm9jZWR1cmUKLQotICAJSWYgdGhlIHR3byBhcmd1bWVudHMgYXJlIGlkZW50aWNhbCwgb3IgaWYgdGhlIHNlY29uZCBvbmUgaXMgbWlzc2luZywKLSAgCXRoZSBmaXJzdCBhcmd1bWVudCBpcyB0YWtlbiB0byBiZSB0aGUgJ2JhbCcgZW50cnkgcG9pbnQuCi0KLSAgCUlmIHRoZXJlIGFyZSAyIGRpc3RpbmN0IGFyZ3VtZW50cywgd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgJ2JhbCcKLSAgCWVudHJ5IHBvaW50IGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlICdjYWxsJyBlbnRyeSBwb2ludCBpbiB0aGUgbGlua2VkCi0gIAlsaXN0IG9mIHN5bWJvbHMuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgdm9pZAotc19sZWFmcHJvYyAobl9vcHMsIGFyZ3MpCi0gICAgIGludCBuX29wczsJCQkvKiBOdW1iZXIgb2Ygb3BlcmFuZHMgKi8KLSAgICAgY2hhciAqYXJnc1tdOwkJLyogYXJnc1sxXS0+MXN0IG9wZXJhbmQsIGFyZ3NbMl0tPjJuZCBvcGVyYW5kICovCi17Ci0gIHN5bWJvbFMgKmNhbGxQOwkJLyogUG9pbnRlciB0byBsZWFmcHJvYyAnY2FsbCcgZW50cnkgcG9pbnQgc3ltYm9sICovCi0gIHN5bWJvbFMgKmJhbFA7CQkvKiBQb2ludGVyIHRvIGxlYWZwcm9jICdiYWwnIGVudHJ5IHBvaW50IHN5bWJvbCAqLwotCi0gIGlmICgobl9vcHMgIT0gMSkgJiYgKG5fb3BzICE9IDIpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygic2hvdWxkIGhhdmUgMSBvciAyIG9wZXJhbmRzIikpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogQ2hlY2sgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwotCi0gIC8qIEZpbmQgb3IgY3JlYXRlIHN5bWJvbCBmb3IgJ2NhbGwnIGVudHJ5IHBvaW50LiAqLwotICBjYWxsUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKGFyZ3NbMV0pOwotCi0gIGlmIChUQ19TX0lTX0NBTExOQU1FIChjYWxsUCkpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiUmVkZWZpbmluZyBsZWFmcHJvYyAlcyIpLCBTX0dFVF9OQU1FIChjYWxsUCkpOwotICAgIH0JCQkJLyogaXMgbGVhZnByb2MgKi8KLQotICAvKiBJZiB0aGF0IHdhcyB0aGUgb25seSBhcmd1bWVudCwgdXNlIGl0IGFzIHRoZSAnYmFsJyBlbnRyeSBwb2ludC4KLSAgICAgKiBPdGhlcndpc2UsIG1hcmsgaXQgYXMgdGhlICdjYWxsJyBlbnRyeSBwb2ludCBhbmQgZmluZCBvciBjcmVhdGUKLSAgICAgKiBhbm90aGVyIHN5bWJvbCBmb3IgdGhlICdiYWwnIGVudHJ5IHBvaW50LgotICAgKi8KLSAgaWYgKChuX29wcyA9PSAxKSB8fCAhc3RyY21wIChhcmdzWzFdLCBhcmdzWzJdKSkKLSAgICB7Ci0gICAgICBUQ19TX0ZPUkNFX1RPX0JBTE5BTUUgKGNhbGxQKTsKLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFRDX1NfRk9SQ0VfVE9fQ0FMTE5BTUUgKGNhbGxQKTsKLQotICAgICAgYmFsUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKGFyZ3NbMl0pOwotICAgICAgaWYgKFRDX1NfSVNfQ0FMTE5BTUUgKGJhbFApKQotCXsKLQkgIGFzX3dhcm4gKF8oIlJlZGVmaW5pbmcgbGVhZnByb2MgJXMiKSwgU19HRVRfTkFNRSAoYmFsUCkpOwotCX0KLSAgICAgIFRDX1NfRk9SQ0VfVE9fQkFMTkFNRSAoYmFsUCk7Ci0KLSAgICAgIHRjX3NldF9iYWxfb2ZfY2FsbCAoY2FsbFAsIGJhbFApOwotICAgIH0JCQkJLyogaWYgb25seSBvbmUgYXJnLCBvciB0aGUgYXJncyBhcmUgdGhlIHNhbWUgKi8KLX0KLQotCi0vKgotICAgc19zeXNwcm9jOiBwcm9jZXNzIC5zeXNwcm9jIHBzZXVkby1vcAotCi0gICAgICAgIC5zeXNwcm9jIHRha2VzIHR3byBhcmd1bWVudHM6Ci0gICAgICAgICAgICAgICAgYXJnWzFdOiBuYW1lIG9mIGVudHJ5IHBvaW50IHRvIHN5c3RlbSBwcm9jZWR1cmUKLSAgICAgICAgICAgICAgICBhcmdbMl06ICdlbnRyeV9udW0nIChpbmRleCkgb2Ygc3lzdGVtIHByb2NlZHVyZSBpbiB0aGUgcmFuZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIFswLDMxXSBpbmNsdXNpdmUuCi0KLSAgICAgICAgRm9yIFthYl0ub3V0LCB3ZSBzdG9yZSB0aGUgJ2VudHJ5bnVtJyBpbiB0aGUgJ25fb3RoZXInIGZpZWxkIG9mCi0gICAgICAgIHRoZSBzeW1ib2wuICBTaW5jZSB0aGF0IGVudHJ5IGlzIG5vcm1hbGx5IDAsIHdlIGJpYXMgJ2VudHJ5bnVtJwotICAgICAgICBieSBhZGRpbmcgMSB0byBpdC4gIEl0IG11c3QgYmUgdW5iaWFzZWQgYmVmb3JlIGl0IGlzIHVzZWQuICAqLwotc3RhdGljIHZvaWQKLXNfc3lzcHJvYyAobl9vcHMsIGFyZ3MpCi0gICAgIGludCBuX29wczsJCQkvKiBOdW1iZXIgb2Ygb3BlcmFuZHMgKi8KLSAgICAgY2hhciAqYXJnc1tdOwkJLyogYXJnc1sxXS0+MXN0IG9wZXJhbmQsIGFyZ3NbMl0tPjJuZCBvcGVyYW5kICovCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgc3ltYm9sUyAqc3ltUDsKLQotICBpZiAobl9vcHMgIT0gMikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInNob3VsZCBoYXZlIHR3byBvcGVyYW5kcyIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGJhZCBhcmcgY291bnQgKi8KLQotICAvKiBQYXJzZSAiZW50cnlfbnVtIiBhcmd1bWVudCBhbmQgY2hlY2sgaXQgZm9yIHZhbGlkaXR5LiAqLwotICBwYXJzZV9leHByIChhcmdzWzJdLCAmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQKLSAgICAgIHx8IChvZmZzIChleHApIDwgMCkKLSAgICAgIHx8IChvZmZzIChleHApID4gMzEpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiJ2VudHJ5X251bScgbXVzdCBiZSBhYnNvbHV0ZSBudW1iZXIgaW4gWzAsMzFdIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBGaW5kL21ha2Ugc3ltYm9sIGFuZCBzdGljayBlbnRyeSBudW1iZXIgKGJpYXNlZCBieSArMSkgaW50byBpdCAqLwotICBzeW1QID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoYXJnc1sxXSk7Ci0KLSAgaWYgKFRDX1NfSVNfU1lTUFJPQyAoc3ltUCkpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiUmVkZWZpbmluZyBlbnRyeW51bSBmb3Igc3lzcHJvYyAlcyIpLCBTX0dFVF9OQU1FIChzeW1QKSk7Ci0gICAgfQkJCQkvKiByZWRlZmluaW5nICovCi0KLSAgVENfU19TRVRfU1lTUFJPQyAoc3ltUCwgb2ZmcyAoZXhwKSk7CS8qIGVuY29kZSBlbnRyeSBudW1iZXIgKi8KLSAgVENfU19GT1JDRV9UT19TWVNQUk9DIChzeW1QKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIHNoaWZ0X29rOgotICAJRGV0ZXJtaW5lIGlmIGEgInNobG8iIGluc3RydWN0aW9uIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBhICJsZGNvbnN0Ii4KLSAgCVRoaXMgbWVhbnMgdGhhdCBzb21lIG51bWJlciBYIDwgMzIgY2FuIGJlIHNoaWZ0ZWQgbGVmdCB0byBwcm9kdWNlIHRoZQotICAJY29uc3RhbnQgb2YgaW50ZXJlc3QuCi0KLSAgCVJldHVybiB0aGUgc2hpZnQgY291bnQsIG9yIDAgaWYgd2UgY2FuJ3QgZG8gaXQuCi0gIAlDYWxsZXIgY2FsY3VsYXRlcyBYIGJ5IHNoaWZ0aW5nIG9yaWdpbmFsIGNvbnN0YW50IHJpZ2h0ICdzaGlmdCcgcGxhY2VzLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi1pbnQKLXNoaWZ0X29rIChuKQotICAgICBpbnQgbjsJCQkvKiBUaGUgY29uc3RhbnQgb2YgaW50ZXJlc3QgKi8KLXsKLSAgaW50IHNoaWZ0OwkJCS8qIFRoZSBzaGlmdCBjb3VudCAqLwotCi0gIGlmIChuIDw9IDApCi0gICAgewotICAgICAgLyogQ2FuJ3QgZG8gaXQgZm9yIG5lZ2F0aXZlIG51bWJlcnMgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBTaGlmdCAnbicgcmlnaHQgdW50aWwgYSAxIGlzIGFib3V0IHRvIGJlIGxvc3QgKi8KLSAgZm9yIChzaGlmdCA9IDA7IChuICYgMSkgPT0gMDsgc2hpZnQrKykKLSAgICB7Ci0gICAgICBuID4+PSAxOwotICAgIH0KLQotICBpZiAobiA+PSAzMikKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiBzaGlmdDsKLX0KLQotCi0vKiBzeW50YXg6IGlzc3VlIHN5bnRheCBlcnJvciAqLwotCi1zdGF0aWMgdm9pZAotc3ludGF4ICgpCi17Ci0gIGFzX2JhZCAoXygic3ludGF4IGVycm9yIikpOwotfQkJCQkvKiBzeW50YXgoKSAqLwotCi0KLS8qIHRhcmdfaGFzX3NmcjoKLQotICAgUmV0dXJuIFRSVUUgaWZmIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQKLSAgIHNwZWNpYWwtZnVuY3Rpb24gcmVnaXN0ZXIgKHNmcikuICAqLwotCi1zdGF0aWMKLWludAotdGFyZ19oYXNfc2ZyIChuKQotICAgICBpbnQgbjsJCQkvKiBOdW1iZXIgKDAtMzEpIG9mIHNmciAqLwotewotICBzd2l0Y2ggKGFyY2hpdGVjdHVyZSkKLSAgICB7Ci0gICAgY2FzZSBBUkNIX0tBOgotICAgIGNhc2UgQVJDSF9LQjoKLSAgICBjYXNlIEFSQ0hfTUM6Ci0gICAgY2FzZSBBUkNIX0pYOgotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBBUkNIX0hYOgotICAgICAgcmV0dXJuICgoMCA8PSBuKSAmJiAobiA8PSA0KSk7Ci0gICAgY2FzZSBBUkNIX0NBOgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKCgwIDw9IG4pICYmIChuIDw9IDIpKTsKLSAgICB9Ci19Ci0KLQotLyogdGFyZ19oYXNfaWNsYXNzOgotCi0gICBSZXR1cm4gVFJVRSBpZmYgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgc3VwcG9ydHMgdGhlIGluZGljYXRlZAotICAgY2xhc3Mgb2YgaW5zdHJ1Y3Rpb25zLiAgKi8KLXN0YXRpYwotaW50Ci10YXJnX2hhc19pY2xhc3MgKGljKQotICAgICAvKiBJbnN0cnVjdGlvbiBjbGFzczsgIG9uZSBvZjoKLSAgICAgICAgSV9CQVNFLCBJX0NYLCBJX0RFQywgSV9LWCwgSV9GUCwgSV9NSUwsIElfQ0FTSU0sIElfQ1gyLCBJX0hYLCBJX0hYMgotICAgICAgKi8KLSAgICAgaW50IGljOwotewotICBpY2xhc3Nlc19zZWVuIHw9IGljOwotICBzd2l0Y2ggKGFyY2hpdGVjdHVyZSkKLSAgICB7Ci0gICAgY2FzZSBBUkNIX0tBOgotICAgICAgcmV0dXJuIGljICYgKElfQkFTRSB8IElfS1gpOwotICAgIGNhc2UgQVJDSF9LQjoKLSAgICAgIHJldHVybiBpYyAmIChJX0JBU0UgfCBJX0tYIHwgSV9GUCB8IElfREVDKTsKLSAgICBjYXNlIEFSQ0hfTUM6Ci0gICAgICByZXR1cm4gaWMgJiAoSV9CQVNFIHwgSV9LWCB8IElfRlAgfCBJX0RFQyB8IElfTUlMKTsKLSAgICBjYXNlIEFSQ0hfQ0E6Ci0gICAgICByZXR1cm4gaWMgJiAoSV9CQVNFIHwgSV9DWCB8IElfQ1gyIHwgSV9DQVNJTSk7Ci0gICAgY2FzZSBBUkNIX0pYOgotICAgICAgcmV0dXJuIGljICYgKElfQkFTRSB8IElfQ1gyIHwgSV9KWCk7Ci0gICAgY2FzZSBBUkNIX0hYOgotICAgICAgcmV0dXJuIGljICYgKElfQkFTRSB8IElfQ1gyIHwgSV9KWCB8IElfSFgpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoKGljbGFzc2VzX3NlZW4gJiAoSV9LWCB8IElfRlAgfCBJX0RFQyB8IElfTUlMKSkKLQkgICYmIChpY2xhc3Nlc19zZWVuICYgKElfQ1ggfCBJX0NYMikpKQotCXsKLQkgIGFzX3dhcm4gKF8oImFyY2hpdGVjdHVyZSBvZiBvcGNvZGUgY29uZmxpY3RzIHdpdGggdGhhdCBvZiBlYXJsaWVyIGluc3RydWN0aW9uKHMpIikpOwotCSAgaWNsYXNzZXNfc2VlbiAmPSB+aWM7Ci0JfQotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSAuZW5kaWFuIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2VuZGlhbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImxpdHRsZSIpID09IDApCi0gICAgOwotICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiYmlnIikgPT0gMCkKLSAgICBhc19iYWQgKF8oImJpZyBlbmRpYW4gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIikpOwotICBlbHNlCi0gICAgYXNfd2FybiAoXygiaWdub3JpbmcgdW5yZWNvZ25pemVkIC5lbmRpYW4gdHlwZSBgJXMnIiksIG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPwotICAgT24gdGhlIGk5NjAsIHRoZXkncmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uLAotICAgd2hpY2ggd2UgaGF2ZSBzZXQgdXAgYXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpeHVwIHRvby4gKi8KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci19Ci0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqcGxhY2UgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0KLSAgaWYgKCFmaXhQLT5meF9iaXRfZml4UCkKLSAgICB7Ci0gICAgICAvKiBGb3IgY2FsbHgsIHdlIGFsd2F5cyB3YW50IHRvIHdyaXRlIG91dCB6ZXJvLCBhbmQgZW1pdCBhCi0JIHN5bWJvbGljIHJlbG9jYXRpb24uICAqLwotICAgICAgaWYgKGZpeFAtPmZ4X2JzcikKLQl2YWwgPSAwOwotCi0gICAgICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWw7Ci0gICAgICBtZF9udW1iZXJfdG9faW1tIChwbGFjZSwgdmFsLCBmaXhQLT5meF9zaXplLCBmaXhQKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBtZF9udW1iZXJfdG9fZmllbGQgKHBsYWNlLCB2YWwsIGZpeFAtPmZ4X2JpdF9maXhQKTsKLX0KLQotI2lmIGRlZmluZWQoT0JKX0FPVVQpIHwgZGVmaW5lZChPQkpfQk9VVCkKLXZvaWQKLXRjX2JvdXRfZml4X3RvX2NoYXJzICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbmJ5dGVzX3JfbGVuZ3RoW10gPSB7NDIsIDAsIDEsIDQyLCAyfTsKLSAgc3RydWN0IHJlbG9jYXRpb25faW5mbyByaTsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBtZW1zZXQgKChjaGFyICopICZyaSwgJ1wwJywgc2l6ZW9mIChyaSkpOwotICBzeW1ib2xQID0gZml4UC0+ZnhfYWRkc3k7Ci0gIGtub3cgKHN5bWJvbFAgIT0gMCB8fCBmaXhQLT5meF9yX3R5cGUgIT0gTk9fUkVMT0MpOwotICByaS5yX2JzciA9IGZpeFAtPmZ4X2JzcjsJLypTQUMgTEQgUkVMQVggSEFDSyAqLwotICAvKiBUaGVzZSB0d28gJ2N1eiBvZiBOUzMySyAqLwotICByaS5yX2NhbGxqID0gZml4UC0+ZnhfdGNiaXQ7Ci0gIGlmIChmaXhQLT5meF9iaXRfZml4UCkKLSAgICByaS5yX2xlbmd0aCA9IDI7Ci0gIGVsc2UKLSAgICByaS5yX2xlbmd0aCA9IG5ieXRlc19yX2xlbmd0aFtmaXhQLT5meF9zaXplXTsKLSAgcmkucl9wY3JlbCA9IGZpeFAtPmZ4X3BjcmVsOwotICByaS5yX2FkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLQotICBpZiAoZml4UC0+Znhfcl90eXBlICE9IE5PX1JFTE9DKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotCXsKLQljYXNlIHJzX2FsaWduOgotCSAgcmkucl9pbmRleCA9IC0yOwotCSAgcmkucl9wY3JlbCA9IDE7Ci0JICByaS5yX2xlbmd0aCA9IGZpeFAtPmZ4X3NpemUgLSAxOwotCSAgYnJlYWs7Ci0JY2FzZSByc19vcmc6Ci0JICByaS5yX2luZGV4ID0gLTI7Ci0JICByaS5yX3BjcmVsID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgcnNfZmlsbDoKLQkgIHJpLnJfaW5kZXggPSAtMTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICByaS5yX2V4dGVybiA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChsaW5rcmVsYXggfHwgIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkgfHwgZml4UC0+ZnhfYnNyKQotICAgIHsKLSAgICAgIHJpLnJfZXh0ZXJuID0gMTsKLSAgICAgIHJpLnJfaW5kZXggPSBzeW1ib2xQLT5zeV9udW1iZXI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmkucl9leHRlcm4gPSAwOwotICAgICAgcmkucl9pbmRleCA9IFNfR0VUX1RZUEUgKHN5bWJvbFApOwotICAgIH0KLQotICAvKiBPdXRwdXQgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gaW4gbWFjaGluZS1kZXBlbmRlbnQgZm9ybS4gKi8KLSAgbWRfcmlfdG9fY2hhcnMgKHdoZXJlLCAmcmkpOwotfQotCi0jZW5kaWYgLyogT0JKX0FPVVQgb3IgT0JKX0JPVVQgKi8KLQotI2lmIGRlZmluZWQgKE9CSl9DT0ZGKSAmJiBkZWZpbmVkIChCRkQpCi1zaG9ydAotdGNfY29mZl9maXgycnR5cGUgKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGlmIChmaXhQLT5meF9ic3IpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGZpeFAtPmZ4X3BjcmVsID09IDAgJiYgZml4UC0+Znhfc2l6ZSA9PSA0KQotICAgIHJldHVybiBSX1JFTExPTkc7Ci0KLSAgaWYgKGZpeFAtPmZ4X3BjcmVsICE9IDAgJiYgZml4UC0+Znhfc2l6ZSA9PSA0KQotICAgIHJldHVybiBSX0lQUk1FRDsKLQotICBhYm9ydCAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIGlmIChmcmFnLT5mcl9uZXh0KQotICAgIHJldHVybiBmcmFnLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZy0+ZnJfYWRkcmVzczsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KLS8qIEFsaWduIGFuIGFkZHJlc3MgYnkgcm91bmRpbmcgaXQgdXAgdG8gdGhlIHNwZWNpZmllZCBib3VuZGFyeS4gICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgYWRkcikKLSAgICAgc2VnVCBzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwkJLyogQWRkcmVzcyB0byBiZSByb3VuZGVkIHVwICovCi17Ci0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSAtIDEpICYgKC0xIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pKTsKLX0JCQkJLyogbWRfc2VjdGlvbl9hbGlnbigpICovCi0KLWV4dGVybiBpbnQgY29mZl9mbGFnczsKLQotI2lmZGVmIE9CSl9DT0ZGCi12b2lkCi10Y19oZWFkZXJzX2hvb2sgKGhlYWRlcnMpCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICBzd2l0Y2ggKGFyY2hpdGVjdHVyZSkKLSAgICB7Ci0gICAgY2FzZSBBUkNIX0tBOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBLQTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkNIX0tCOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBLQjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkNIX01DOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBNQzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkNIX0NBOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBDQTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkNIX0pYOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBKWDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkNIX0hYOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBIWDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChpY2xhc3Nlc19zZWVuID09IElfQkFTRSkKLQljb2ZmX2ZsYWdzIHw9IEZfSTk2MENPUkU7Ci0gICAgICBlbHNlIGlmIChpY2xhc3Nlc19zZWVuICYgSV9DWCkKLQljb2ZmX2ZsYWdzIHw9IEZfSTk2MENBOwotICAgICAgZWxzZSBpZiAoaWNsYXNzZXNfc2VlbiAmIElfSFgpCi0JY29mZl9mbGFncyB8PSBGX0k5NjBIWDsKLSAgICAgIGVsc2UgaWYgKGljbGFzc2VzX3NlZW4gJiBJX0pYKQotCWNvZmZfZmxhZ3MgfD0gRl9JOTYwSlg7Ci0gICAgICBlbHNlIGlmIChpY2xhc3Nlc19zZWVuICYgSV9DWDIpCi0JY29mZl9mbGFncyB8PSBGX0k5NjBDQTsKLSAgICAgIGVsc2UgaWYgKGljbGFzc2VzX3NlZW4gJiBJX01JTCkKLQljb2ZmX2ZsYWdzIHw9IEZfSTk2ME1DOwotICAgICAgZWxzZSBpZiAoaWNsYXNzZXNfc2VlbiAmIChJX0RFQyB8IElfRlApKQotCWNvZmZfZmxhZ3MgfD0gRl9JOTYwS0I7Ci0gICAgICBlbHNlCi0JY29mZl9mbGFncyB8PSBGX0k5NjBLQTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpCi0gICAgewotICAgICAgaGVhZGVycy0+ZmlsZWhkci5mX21hZ2ljID0gSTk2MFJXTUFHSUM7Ci0gICAgICBoZWFkZXJzLT5hb3V0aGRyLm1hZ2ljID0gT01BR0lDOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGhlYWRlcnMtPmZpbGVoZHIuZl9tYWdpYyA9IEk5NjBST01BR0lDOwotICAgICAgaGVhZGVycy0+YW91dGhkci5tYWdpYyA9IE5NQUdJQzsKLSAgICB9CQkJCS8qIHNldCBtYWdpYyBudW1iZXJzICovCi19Ci0KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCi0vKiBUaGluZ3MgZ29pbmcgb24gaGVyZToKLQotICAgRm9yIGJvdXQsIFdlIG5lZWQgdG8gYXNzdXJlIGEgY291cGxlIG9mIHNpbXBsaWZ5aW5nCi0gICBhc3N1bXB0aW9ucyBhYm91dCBsZWFmcHJvY3MgZm9yIHRoZSBsaW5rZXI6IHRoZSBsZWFmcHJvYwotICAgZW50cnkgc3ltYm9scyB3aWxsIGJlIGRlZmluZWQgaW4gdGhlIHNhbWUgYXNzZW1ibHkgaW4KLSAgIHdoaWNoIHRoZXkncmUgZGVjbGFyZWQgd2l0aCB0aGUgJy5sZWFmcHJvYycgZGlyZWN0aXZlOwotICAgYW5kIGlmIGEgbGVhZnByb2MgaGFzIGJvdGggJ2NhbGwnIGFuZCAnYmFsJyBlbnRyeSBwb2ludHMKLSAgIHRoZXkgYXJlIGJvdGggZ2xvYmFsIG9yIGJvdGggbG9jYWwuCi0KLSAgIEZvciBjb2ZmLCB0aGUgY2FsbCBzeW1ib2wgaGFzIGEgc2Vjb25kIGF1eCBlbnRyeSB0aGF0Ci0gICBjb250YWlucyB0aGUgYmFsIGVudHJ5IHBvaW50LiAgVGhlIGJhbCBzeW1ib2wgYmVjb21lcyBhCi0gICBsYWJlbC4KLQotICAgRm9yIGNvZmYgcmVwcmVzZW50YXRpb24sIHRoZSBjYWxsIHN5bWJvbCBoYXMgYSBzZWNvbmQgYXV4IGVudHJ5IHRoYXQKLSAgIGNvbnRhaW5zIHRoZSBiYWwgZW50cnkgcG9pbnQuICBUaGUgYmFsIHN5bWJvbCBiZWNvbWVzIGEgbGFiZWwuICAqLwotCi12b2lkCi10Y19jcmF3bF9zeW1ib2xfY2hhaW4gKGhlYWRlcnMpCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0jaWZkZWYgT0JKX0NPRkYKLSAgICAgIGlmIChUQ19TX0lTX1NZU1BST0MgKHN5bWJvbFApKQotCXsKLQkgIC8qIHNlY29uZCBhdXggZW50cnkgYWxyZWFkeSBjb250YWlucyB0aGUgc3lzcHJvYyBudW1iZXIgKi8KLQkgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDIpOwotCSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19TQ0FMTCk7Ci0JICBTX1NFVF9EQVRBX1RZUEUgKHN5bWJvbFAsIFNfR0VUX0RBVEFfVFlQRSAoc3ltYm9sUCkgfCAoRFRfRkNOIDw8IE5fQlRTSEZUKSk7Ci0JICBjb250aW51ZTsKLQl9CQkJLyogcmV3cml0ZSBzeXNwcm9jICovCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotICAgICAgaWYgKCFUQ19TX0lTX0JBTE5BTUUgKHN5bWJvbFApICYmICFUQ19TX0lTX0NBTExOQU1FIChzeW1ib2xQKSkKLQl7Ci0JICBjb250aW51ZTsKLQl9CQkJLyogTm90IGEgbGVhZnByb2Mgc3ltYm9sICovCi0KLSAgICAgIGlmICghU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQl7Ci0JICBhc19iYWQgKF8oImxlYWZwcm9jIHN5bWJvbCAnJXMnIHVuZGVmaW5lZCIpLCBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0JfQkJCS8qIHVuZGVmaW5lZCBsZWFmICovCi0KLSAgICAgIGlmIChUQ19TX0lTX0NBTExOQU1FIChzeW1ib2xQKSkKLQl7Ci0JICBzeW1ib2xTICpiYWxQID0gdGNfZ2V0X2JhbF9vZl9jYWxsIChzeW1ib2xQKTsKLQkgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1ib2xQKSAhPSBTX0lTX0VYVEVSTkFMIChiYWxQKSkKLQkgICAgewotCSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgICAgICBTX1NFVF9FWFRFUk5BTCAoYmFsUCk7Ci0JICAgICAgYXNfd2FybiAoXygiV2FybmluZzogbWFraW5nIGxlYWZwcm9jIGVudHJpZXMgJXMgYW5kICVzIGJvdGggZ2xvYmFsXG4iKSwKLQkJICAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApLCBTX0dFVF9OQU1FIChiYWxQKSk7Ci0JICAgIH0JCQkvKiBleHRlcm5hbGl0eSBtaXNtYXRjaCAqLwotCX0JCQkvKiBpZiBjYWxsbmFtZSAqLwotICAgIH0JCQkJLyogd2FsayB0aGUgc3ltYm9sIGNoYWluICovCi19Ci0KLS8qIEZvciBhb3V0IG9yIGJvdXQsIHRoZSBiYWwgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgY2FsbC4KLQotICAgRm9yIGNvZmYsIHdlIGNoZWF0IGFuZCBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIGJhbCBzeW1ib2wgaW4gdGhlCi0gICBzZWNvbmQgYXV4IGVudHJ5IG9mIHRoZSBjYWxsLiAgKi8KLQotI3VuZGVmIE9CSl9BQk9VVAotI2lmZGVmIE9CSl9BT1VUCi0jZGVmaW5lIE9CSl9BQk9VVAotI2VuZGlmCi0jaWZkZWYgT0JKX0JPVVQKLSNkZWZpbmUgT0JKX0FCT1VUCi0jZW5kaWYKLQotdm9pZAotdGNfc2V0X2JhbF9vZl9jYWxsIChjYWxsUCwgYmFsUCkKLSAgICAgc3ltYm9sUyAqY2FsbFA7Ci0gICAgIHN5bWJvbFMgKmJhbFA7Ci17Ci0gIGtub3cgKFRDX1NfSVNfQ0FMTE5BTUUgKGNhbGxQKSk7Ci0gIGtub3cgKFRDX1NfSVNfQkFMTkFNRSAoYmFsUCkpOwotCi0jaWZkZWYgT0JKX0NPRkYKLQotICBjYWxsUC0+c3lfdGMgPSBiYWxQOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChjYWxsUCwgMik7Ci0KLSNlbHNlIC8qICEgT0JKX0NPRkYgKi8KLSNpZmRlZiBPQkpfQUJPVVQKLQotICAvKiBJZiB0aGUgJ2JhbCcgZW50cnkgZG9lc24ndCBpbW1lZGlhdGVseSBmb2xsb3cgdGhlICdjYWxsJwotICAgICAqIHN5bWJvbCwgdW5saW5rIGl0IGZyb20gdGhlIHN5bWJvbCBsaXN0IGFuZCByZS1pbnNlcnQgaXQuCi0gICAqLwotICBpZiAoc3ltYm9sX25leHQgKGNhbGxQKSAhPSBiYWxQKQotICAgIHsKLSAgICAgIHN5bWJvbF9yZW1vdmUgKGJhbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgc3ltYm9sX2FwcGVuZCAoYmFsUCwgY2FsbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgIH0JCQkJLyogaWYgbm90IGluIG9yZGVyICovCi0KLSNlbHNlIC8qICEgT0JKX0FCT1VUICovCi0gIChhcyB5ZXQgdW53cml0dGVuLik7Ci0jZW5kaWYgLyogISBPQkpfQUJPVVQgKi8KLSNlbmRpZiAvKiAhIE9CSl9DT0ZGICovCi19Ci0KLXN5bWJvbFMgKgotdGNfZ2V0X2JhbF9vZl9jYWxsIChjYWxsUCkKLSAgICAgc3ltYm9sUyAqY2FsbFA7Ci17Ci0gIHN5bWJvbFMgKnJldHZhbDsKLQotICBrbm93IChUQ19TX0lTX0NBTExOQU1FIChjYWxsUCkpOwotCi0jaWZkZWYgT0JKX0NPRkYKLSAgcmV0dmFsID0gY2FsbFAtPnN5X3RjOwotI2Vsc2UKLSNpZmRlZiBPQkpfQUJPVVQKLSAgcmV0dmFsID0gc3ltYm9sX25leHQgKGNhbGxQKTsKLSNlbHNlCi0gIChhcyB5ZXQgdW53cml0dGVuLik7Ci0jZW5kaWYgLyogISBPQkpfQUJPVVQgKi8KLSNlbmRpZiAvKiAhIE9CSl9DT0ZGICovCi0KLSAga25vdyAoVENfU19JU19CQUxOQU1FIChyZXR2YWwpKTsKLSAgcmV0dXJuIHJldHZhbDsKLX0JCQkJLyogX3RjX2dldF9iYWxfb2ZfY2FsbCgpICovCi0KLXZvaWQKLXRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoc3ltYm9sUCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgaWYgKFRDX1NfSVNfQ0FMTE5BTUUgKHN5bWJvbFApKQotICAgIHsKLSNpZmRlZiBPQkpfQ09GRgotICAgICAgc3ltYm9sUyAqYmFsUCA9IHRjX2dldF9iYWxfb2ZfY2FsbCAoc3ltYm9sUCk7Ci0KLSNpZiAwCi0gICAgICAvKiBzZWNvbmQgYXV4IGVudHJ5IGNvbnRhaW5zIHRoZSBiYWwgZW50cnkgcG9pbnQgKi8KLSAgICAgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDIpOwotI2VuZGlmCi0gICAgICBzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2F1eGVudFsxXS54X2JhbC54X2JhbG50cnkgPSBTX0dFVF9WQUxVRSAoYmFsUCk7Ci0gICAgICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19FWFQpCi0JU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19MRUFGRVhUKTsKLSAgICAgIGVsc2UKLQlTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX0xFQUZTVEFUKTsKLSAgICAgIFNfU0VUX0RBVEFfVFlQRSAoc3ltYm9sUCwgU19HRVRfREFUQV9UWVBFIChzeW1ib2xQKSB8IChEVF9GQ04gPDwgTl9CVFNIRlQpKTsKLSAgICAgIC8qIGZpeCB1cCB0aGUgYmFsIHN5bWJvbCAqLwotICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoYmFsUCwgQ19MQUJFTCk7Ci0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLSAgICB9CQkJCS8qIG9ubHkgb24gY2FsbHMgKi8KLX0KLQotdm9pZAotaTk2MF9oYW5kbGVfYWxpZ24gKGZyYWdwKQotICAgICBmcmFnUyAqZnJhZ3A7Ci17Ci0gIGlmICghbGlua3JlbGF4KQotICAgIHJldHVybjsKLQotI2lmbmRlZiBPQkpfQk9VVAotCi0gIGFzX2JhZCAoXygib3B0aW9uIC0tbGluay1yZWxheCBpcyBvbmx5IHN1cHBvcnRlZCBpbiBiLm91dCBmb3JtYXQiKSk7Ci0gIGxpbmtyZWxheCA9IDA7Ci0gIHJldHVybjsKLQotI2Vsc2UKLQotICAvKiBUaGUgdGV4dCBzZWN0aW9uICJlbmRzIiB3aXRoIGFub3RoZXIgYWxpZ25tZW50IHJlbG9jLCB0byB3aGljaCB3ZQotICAgICBhcmVuJ3QgYWRkaW5nIHBhZGRpbmcuICAqLwotICBpZiAoZnJhZ3AtPmZyX25leHQgPT0gdGV4dF9sYXN0X2ZyYWcKLSAgICAgIHx8IGZyYWdwLT5mcl9uZXh0ID09IGRhdGFfbGFzdF9mcmFnKQotICAgIHJldHVybjsKLQotICAvKiBhbGlnbm1lbnQgZGlyZWN0aXZlICovCi0gIGZpeF9uZXcgKGZyYWdwLCBmcmFncC0+ZnJfZml4LCBmcmFncC0+ZnJfb2Zmc2V0LCAwLCAwLCAwLAotCSAgIChpbnQpIGZyYWdwLT5mcl90eXBlKTsKLSNlbmRpZiAvKiBPQkpfQk9VVCAqLwotfQotCi1pbnQKLWk5NjBfdmFsaWRhdGVfZml4IChmaXhQLCB0aGlzX3NlZ21lbnRfdHlwZSwgYWRkX3N5bWJvbFBQKQotICAgICBmaXhTICpmaXhQOwotICAgICBzZWdUIHRoaXNfc2VnbWVudF90eXBlOwotICAgICBzeW1ib2xTICoqYWRkX3N5bWJvbFBQOwotewotI2RlZmluZSBhZGRfc3ltYm9sUCAoKmFkZF9zeW1ib2xQUCkKLSAgaWYgKGZpeFAtPmZ4X3RjYml0ICYmIFRDX1NfSVNfQ0FMTE5BTUUgKGFkZF9zeW1ib2xQKSkKLSAgICB7Ci0gICAgICAvKiBSZWxvY2F0aW9uIHNob3VsZCBiZSBkb25lIHZpYSB0aGUgYXNzb2NpYXRlZCAnYmFsJwotICAgICAgICAgZW50cnkgcG9pbnQgc3ltYm9sLiAqLwotCi0gICAgICBpZiAoIVRDX1NfSVNfQkFMTkFNRSAodGNfZ2V0X2JhbF9vZl9jYWxsIChhZGRfc3ltYm9sUCkpKQotCXsKLQkgIGFzX2JhZCAoXygiTm8gJ2JhbCcgZW50cnkgcG9pbnQgZm9yIGxlYWZwcm9jICVzIiksCi0JCSAgU19HRVRfTkFNRSAoYWRkX3N5bWJvbFApKTsKLQkgIHJldHVybiAxOwotCX0KLSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gYWRkX3N5bWJvbFAgPSB0Y19nZXRfYmFsX29mX2NhbGwgKGFkZF9zeW1ib2xQKTsKLSAgICB9Ci0jaWYgMAotICAvKiBTdGlsbCBoYXZlIHRvIHdvcmsgb3V0IG90aGVyIGNvbmRpdGlvbnMgZm9yIHRoZXNlIHRlc3RzLiAgKi8KLSAgewotICAgIGlmIChmaXhQLT5meF90Y2JpdCkKLSAgICAgIHsKLQlhc19iYWQgKF8oImNhbGxqIHRvIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMiKSk7Ci0JcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgcmVsb2NfY2FsbGogKGZpeFApOwotICAgIGlmICgoaW50KSBmaXhQLT5meF9iaXRfZml4UCA9PSAxMykKLSAgICAgIHsKLQkvKiBUaGlzIGlzIGEgQ09CUiBpbnN0cnVjdGlvbi4gIFRoZXkgaGF2ZSBvbmx5IGEgMTMtYml0Ci0JICAgZGlzcGxhY2VtZW50IGFuZCBhcmUgb25seSB0byBiZSB1c2VkIGZvciBsb2NhbCBicmFuY2hlczoKLQkgICBmbGFnIGFzIGVycm9yLCBkb24ndCBnZW5lcmF0ZSByZWxvY2F0aW9uLiAgKi8KLQlhc19iYWQgKF8oImNhbid0IHVzZSBDT0JSIGZvcm1hdCB3aXRoIGV4dGVybmFsIGxhYmVsIikpOwotCWZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsJLyogTm8gcmVsb2NhdGlvbnMgcGxlYXNlLiAqLwotCXJldHVybiAxOwotICAgICAgfQotICB9Ci0jZW5kaWYKLSN1bmRlZiBhZGRfc3ltYm9sUAotICByZXR1cm4gMDsKLX0KLQotLyogZW5kIG9mIHRjLWk5NjAuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1pOTYwLmggYi9nYXMvY29uZmlnL3RjLWk5NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwNjk2Ny4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWk5NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKiB0Yy1pOTYwLmggLSBCYXNpYyA4MDk2MCBpbnN0cnVjdGlvbiBmb3JtYXRzLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpZm5kZWYgVENfSTk2MAotI2RlZmluZSBUQ19JOTYwIDEKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0vKgotICogVGhlICdDT0onIGluc3RydWN0aW9ucyBhcmUgYWN0dWFsbHkgQ09CUiBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgJ2InIGluCi0gKiB0aGUgbW5lbW9uaWMgcmVwbGFjZWQgYnkgYSAnaic7ICB0aGV5IGFyZSBBTFdBWVMgImRlLW9wdGltaXplZCIgaWYgbmVjZXNzYXJ5OgotICogaWYgdGhlIGRpc3BsYWNlbWVudCB3aWxsIG5vdCBmaXQgaW4gMTMgYml0cywgdGhlIGFzc2VtYmxlciB3aWxsIHJlcGxhY2UgdGhlbQotICogd2l0aCB0aGUgY29ycmVzcG9uZGluZyBjb21wYXJlIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zLgotICoKLSAqIEFsbCBvZiB0aGUgJ01FTW4nIGluc3RydWN0aW9ucyBhcmUgdGhlIHNhbWUgZm9ybWF0OyB0aGUgJ24nIGluIHRoZSBuYW1lCi0gKiBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQgaW5kZXggc2NhbGUgZmFjdG9yICh0aGUgc2l6ZSBvZiB0aGUgZGF0dW0gb3BlcmF0ZWQgb24pLgotICoKLSAqIFRoZSBGQlJBIGZvcm1hdHMgYXJlIG5vdCBhY3R1YWxseSBhbiBpbnN0cnVjdGlvbiBmb3JtYXQuICBUaGV5IGFyZSB0aGUKLSAqICJjb252ZW5pZW5jZSBkaXJlY3RpdmVzIiBmb3IgYnJhbmNoaW5nIG9uIGZsb2F0aW5nLXBvaW50IGNvbXBhcmlzb25zLAotICogZWFjaCBvZiB3aGljaCBnZW5lcmF0ZXMgMiBpbnN0cnVjdGlvbnMgKGEgJ2JubycgYW5kIG9uZSBvdGhlciBicmFuY2gpLgotICoKLSAqIFRoZSBDQUxMSiBmb3JtYXQgaXMgbm90IGFjdHVhbGx5IGFuIGluc3RydWN0aW9uIGZvcm1hdC4gIEl0IGluZGljYXRlcyB0aGF0Ci0gKiB0aGUgaW5zdHJ1Y3Rpb24gZ2VuZXJhdGVkIChhIENUUkwtZm9ybWF0ICdjYWxsJykgc2hvdWxkIGhhdmUgaXRzIHJlbG9jYXRpb24KLSAqIHNwZWNpYWxseSBmbGFnZ2VkIGZvciBsaW5rLXRpbWUgcmVwbGFjZW1lbnQgd2l0aCBhICdiYWwnIG9yICdjYWxscycgaWYKLSAqIGFwcHJvcHJpYXRlLgotICovCi0KLS8qIHRhaWxvciBnYXMgKi8KLSNkZWZpbmUgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotI2RlZmluZSBCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TCi0KLS8qIHRhaWxvciB0aGUgY29mZiBmb3JtYXQgKi8KLSNkZWZpbmUgQkZEX0FSQ0gJCQkJYmZkX2FyY2hfaTk2MAotI2RlZmluZSBDT0ZGX0ZMQUdTCQkJCUZfQVIzMldSCi0jZGVmaW5lIENPRkZfTUFHSUMJCQkJSTk2MFJPTUFHSUMKLSNkZWZpbmUgT0JKX0NPRkZfU0VDVElPTl9IRUFERVJfSEFTX0FMSUdOTUVOVAotI2RlZmluZSBPQkpfQ09GRl9NQVhfQVVYRU5UUklFUwkJCSgyKQotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyhGSVhQKQkJCSghKEZJWFApLT5meF9kb25lKQotI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShGSVhQKQkJCXRjX2NvZmZfZml4MnJ0eXBlKEZJWFApCi0jZGVmaW5lIFRDX0NPRkZfU0laRU1BQ0hERVAoRlJBR1ApCQl0Y19jb2ZmX3NpemVtYWNoZGVwKEZSQUdQKQotI2RlZmluZSBUQ19DT0ZGX1NFVF9NQUNISU5FKEhEUlMpCQl0Y19oZWFkZXJzX2hvb2sgKEhEUlMpCi1leHRlcm4gdm9pZCB0Y19oZWFkZXJzX2hvb2sgKCk7Ci1leHRlcm4gc2hvcnQgdGNfY29mZl9maXgycnR5cGUgKCk7Ci1leHRlcm4gaW50IHRjX2NvZmZfc2l6ZW1hY2hkZXAgKCk7Ci0KLS8qIE1FQU5JTkcgT0YgJ25fb3RoZXInIGluIHRoZSBzeW1ib2wgcmVjb3JkLgotICoKLSAqIElmIG5vbi16ZXJvLCB0aGUgJ25fb3RoZXInIGZpZWxkcyBpbmRpY2F0ZXMgZWl0aGVyIGEgbGVhZiBwcm9jZWR1cmUgb3IKLSAqIGEgc3lzdGVtIHByb2NlZHVyZSwgYXMgZm9sbG93czoKLSAqCi0gKgkxIDw9IG5fb3RoZXIgPD0gMzIgOgotICoJCVRoZSBzeW1ib2wgaXMgdGhlIGVudHJ5IHBvaW50IHRvIGEgc3lzdGVtIHByb2NlZHVyZS4KLSAqCQknbl92YWx1ZScgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGVudHJ5LCBhcyBmb3IgYW55IG90aGVyCi0gKgkJcHJvY2VkdXJlLiAgVGhlIHN5c3RlbSBwcm9jZWR1cmUgbnVtYmVyICh3aGljaCBjYW4gYmUgdXNlZCBpbgotICoJCWEgJ2NhbGxzJyBpbnN0cnVjdGlvbikgaXMgKG5fb3RoZXItMSkuICBUaGVzZSBlbnRyaWVzIGNvbWUgZnJvbQotICoJCScuc3lzcHJvYycgZGlyZWN0aXZlcy4KLSAqCi0gKgluX290aGVyID09IE5fQ0FMTE5BTUUKLSAqCQl0aGUgc3ltYm9sIGlzIHRoZSAnY2FsbCcgZW50cnkgcG9pbnQgdG8gYSBsZWFmIHByb2NlZHVyZS4KLSAqCQlUaGUgKm5leHQqIHN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlIG11c3QgYmUgdGhlIGNvcnJlc3BvbmRpbmcKLSAqCQknYmFsJyBlbnRyeSBwb2ludCB0byB0aGUgcHJvY2VkdXJlIChzZWUgZm9sbG93aW5nKS4gIFRoZXNlCi0gKgkJZW50cmllcyBjb21lIGZyb20gJy5sZWFmcHJvYycgZGlyZWN0aXZlcyBpbiB3aGljaCB0d28gZGlmZmVyZW50Ci0gKgkJc3ltYm9scyBhcmUgc3BlY2lmaWVkICh0aGUgZmlyc3Qgb25lIGlzIHJlcHJlc2VudGVkIGhlcmUpLgotICoKLSAqCi0gKgluX290aGVyID09IE5fQkFMTkFNRQotICoJCXRoZSBzeW1ib2wgaXMgdGhlICdiYWwnIGVudHJ5IHBvaW50IHRvIGEgbGVhZiBwcm9jZWR1cmUuCi0gKgkJVGhlc2UgZW50cmllcyByZXN1bHQgZnJvbSAnLmxlYWZwcm9jJyBkaXJlY3RpdmVzIGluIHdoaWNoIG9ubHkKLSAqCQlvbmUgc3ltYm9sIGlzIHNwZWNpZmllZCwgb3IgaW4gd2hpY2ggdGhlIHNhbWUgc3ltYm9sIGlzCi0gKgkJc3BlY2lmaWVkIHR3aWNlLgotICoKLSAqIE5vdGUgdGhhdCBhbiBOX0NBTExOQU1FIGVudHJ5ICptdXN0KiBoYXZlIGEgY29ycmVzcG9uZGluZyBOX0JBTE5BTUUgZW50cnksCi0gKiBidXQgbm90IGV2ZXJ5IE5fQkFMTkFNRSBlbnRyeSBtdXN0IGhhdmUgYW4gTl9DQUxMTkFNRSBlbnRyeS4KLSAqLwotI2RlZmluZQlOX0NBTExOQU1FCSgoY2hhciktMSkKLSNkZWZpbmUJTl9CQUxOQU1FCSgoY2hhciktMikKLQotLyogaTk2MCB1c2VzIGEgY3VzdG9tIHJlbG9jYXRpb24gcmVjb3JkLiAqLwotCi0vKiBsZXQgb2JqLWFvdXQuaCBrbm93ICovCi0jZGVmaW5lIENVU1RPTV9SRUxPQ19GT1JNQVQgMQotLyogbGV0IGFvdXRfZ251Lmgga25vdyAqLwotI2RlZmluZSBOX1JFTE9DQVRJT05fSU5GT19ERUNMQVJFRCAxCi1zdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvCi0gIHsKLSAgICBpbnQgcl9hZGRyZXNzOwkJLyogRmlsZSBhZGRyZXNzIG9mIGl0ZW0gdG8gYmUgcmVsb2NhdGVkCSovCi0gICAgdW5zaWduZWQKLSAgICAgIHJfaW5kZXg6MjQsCQkvKiBJbmRleCBvZiBzeW1ib2wgb24gd2hpY2ggcmVsb2NhdGlvbiBpcyBiYXNlZCovCi0gICAgICByX3BjcmVsOjEsCQkvKiAxID0+IHJlbG9jYXRlIFBDLXJlbGF0aXZlOyBlbHNlIGFic29sdXRlCi0JCQkJICoJT24gaTk2MCwgcGMtcmVsYXRpdmUgaW1wbGllcyAyNC1iaXQKLQkJCQkgKglhZGRyZXNzLCBhYnNvbHV0ZSBpbXBsaWVzIDMyLWJpdC4KLQkJCQkgKi8KLSAgICAgIHJfbGVuZ3RoOjIsCQkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVsb2NhdGU6Ci0JCQkJICoJMCA9PiAxIGJ5dGUKLQkJCQkgKgkxID0+IDIgYnl0ZXMKLQkJCQkgKgkyID0+IDQgYnl0ZXMgLS0gb25seSB2YWx1ZSB1c2VkIGZvciBpOTYwCi0JCQkJICovCi0gICAgICByX2V4dGVybjoxLCByX2JzcjoxLAkvKiBTb21ldGhpbmcgZm9yIHRoZSBHTlUgTlMzMksgYXNzZW1ibGVyICovCi0gICAgICByX2Rpc3A6MSwJCQkvKiBTb21ldGhpbmcgZm9yIHRoZSBHTlUgTlMzMksgYXNzZW1ibGVyICovCi0gICAgICByX2NhbGxqOjEsCQkvKiAxIGlmIHJlbG9jYXRpb24gdGFyZ2V0IGlzIGFuIGk5NjAgJ2NhbGxqJyAqLwotICAgICAgbnV0aGluOjE7CQkJLyogVW51c2VkCQkJCSovCi0gIH07Ci0KLSNpZmRlZiBPQkpfQ09GRgotCi0vKiBXZSBzdG9yZSB0aGUgYmFsIGluZm9ybWF0aW9uIGluIHRoZSBzeV90YyBmaWVsZC4gICovCi0jZGVmaW5lIFRDX1NZTUZJRUxEX1RZUEUgc3RydWN0IHN5bWJvbCAqCi0KLSNkZWZpbmUgVENfQURKVVNUX1JFTE9DX0NPVU5UKEZJWFAsQ09VTlQpIFwKLSAgeyBmaXhTICp0Y2ZpeHAgPSAoRklYUCk7IFwKLSAgICBmb3IgKDt0Y2ZpeHA7dGNmaXhwPXRjZml4cC0+ZnhfbmV4dCkgXAotICAgICAgaWYgKHRjZml4cC0+ZnhfdGNiaXQgJiYgdGNmaXhwLT5meF9hZGRzeSAhPSAwKSBcCi0gICAgICAgICsrKENPVU5UKTsgXAotICB9Ci0jZW5kaWYKLQotZXh0ZXJuIGludCBpOTYwX3ZhbGlkYXRlX2ZpeCBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHNlZ1QsIHN0cnVjdCBzeW1ib2wgKiopKTsKLSNkZWZpbmUgVENfVkFMSURBVEVfRklYKEZJWFAsU0VHVFlQRSxMQUJFTCkgXAotCWlmIChpOTYwX3ZhbGlkYXRlX2ZpeCAoRklYUCwgU0VHVFlQRSwgJmFkZF9zeW1ib2xQKSAhPSAwKSBnb3RvIExBQkVMCi0KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYUCkJCSgoRklYUCktPmZ4X2JzciA9PSAwKQotCi1leHRlcm4gdm9pZCBicnRhYl9lbWl0IFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfZW5kKCkJYnJ0YWJfZW1pdCAoKQotCi1leHRlcm4gdm9pZCByZWxvY19jYWxsaiAoKTsKLQotZXh0ZXJuIHZvaWQgdGNfc2V0X2JhbF9vZl9jYWxsIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKiwgc3RydWN0IHN5bWJvbCAqKSk7Ci0KLWV4dGVybiBzdHJ1Y3Qgc3ltYm9sICp0Y19nZXRfYmFsX29mX2NhbGwgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqKSk7Ci0KLWV4dGVybiB2b2lkIGk5NjBfaGFuZGxlX2FsaWduICgpOwotI2RlZmluZSBIQU5ETEVfQUxJR04oRlJBRykJaTk2MF9oYW5kbGVfYWxpZ24gKEZSQUcpCi0jZGVmaW5lIE5FRURfRlhfUl9UWVBFCi0jZGVmaW5lIE5PX1JFTE9DIC0xCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0jZGVmaW5lIExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkKLQotI2RlZmluZSBUQ19GSVhfVFlQRSBzdHJ1Y3QgeyB1bnNpZ25lZCBic3IgOiAxOyB9Ci0jZGVmaW5lIGZ4X2JzciB0Y19maXhfZGF0YS5ic3IKLSNkZWZpbmUgVENfSU5JVF9GSVhfREFUQShGKQkoKEYpLT50Y19maXhfZGF0YS5ic3IgPSAwKQotCi0jZW5kaWYKLQotLyogZW5kIG9mIHRjLWk5NjAuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tMzJyLmMgYi9nYXMvY29uZmlnL3RjLW0zMnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3ZTYyMy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW0zMnIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMDAgKzAsMCBAQAotLyogdGMtbTMyci5jIC0tIEFzc2VtYmxlciBmb3IgdGhlIE1pdHN1YmlzaGkgTTMyUi4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiICAgICAKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJvcGNvZGVzL20zMnItZGVzYy5oIgotI2luY2x1ZGUgIm9wY29kZXMvbTMyci1vcGMuaCIKLSNpbmNsdWRlICJjZ2VuLmgiCi0KLS8qIExpbmtlZCBsaXN0IG9mIHN5bWJvbHMgdGhhdCBhcmUgZGVidWdnaW5nIHN5bWJvbHMgdG8gYmUgZGVmaW5lZCBhcyB0aGUKLSAgIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdCBzeW1fbGluawotewotICBzdHJ1Y3Qgc3ltX2xpbmsgKm5leHQ7Ci0gIHN5bWJvbFMJICAqc3ltYm9sOwotfSBzeW1fbGlua1M7Ci0KLXN0YXRpYyBzeW1fbGlua1MgKmRlYnVnX3N5bV9saW5rID0gKHN5bV9saW5rUyAqKTA7Ci0gIAotLyogU3RydWN0dXJlIHRvIGhvbGQgYWxsIG9mIHRoZSBkaWZmZXJlbnQgY29tcG9uZW50cyBkZXNjcmliaW5nCi0gICBhbiBpbmRpdmlkdWFsIGluc3RydWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNvbnN0IENHRU5fSU5TTiAqCWluc247Ci0gIGNvbnN0IENHRU5fSU5TTiAqCW9yaWdfaW5zbjsKLSAgQ0dFTl9GSUVMRFMJCWZpZWxkczsKLSNpZiBDR0VOX0lOVF9JTlNOX1AKLSAgQ0dFTl9JTlNOX0lOVCAgICAgICAgIGJ1ZmZlciBbMV07Ci0jZGVmaW5lIElOU05fVkFMVUUoYnVmKSAoKihidWYpKQotI2Vsc2UKLSAgdW5zaWduZWQgY2hhciAgICAgICAgIGJ1ZmZlciBbQ0dFTl9NQVhfSU5TTl9TSVpFXTsKLSNkZWZpbmUgSU5TTl9WQUxVRShidWYpIChidWYpCi0jZW5kaWYKLSAgY2hhciAqCQlhZGRyOwotICBmcmFnUyAqCQlmcmFnOwotICBpbnQgICAgICAgICAgICAgICAgICAgbnVtX2ZpeHVwczsKLSAgZml4UyAqICAgICAgICAgICAgICAgIGZpeHVwcyBbR0FTX0NHRU5fTUFYX0ZJWFVQU107Ci0gIGludCAgICAgICAgICAgICAgICAgICBpbmRpY2VzIFtNQVhfT1BFUkFORF9JTlNUQU5DRVNdOwotICBzeW1fbGlua1MJCSpkZWJ1Z19zeW1fbGluazsKLX0KLW0zMnJfaW5zbjsKLQotLyogcHJldl9pbnNuLmluc24gaXMgbm9uLW51bGwgaWYgbGFzdCBpbnNuIHdhcyBhIDE2IGJpdCBpbnNuIG9uIGEgMzIgYml0Ci0gICBib3VuZGFyeSAoaS5lLiB3YXMgdGhlIGZpcnN0IG9mIHR3byAxNiBiaXQgaW5zbnMpLiAgKi8KLXN0YXRpYyBtMzJyX2luc24JcHJldl9pbnNuOwotCi0vKiBOb24temVybyBpZiB3ZSd2ZSBzZWVuIGEgcmVsYXhhYmxlIGluc24gc2luY2UgdGhlIGxhc3QgMzIgYml0Ci0gICBhbGlnbm1lbnQgcmVxdWVzdC4gICovCi1zdGF0aWMgaW50IHNlZW5fcmVsYXhhYmxlX3AgPSAwOwotCi0vKiBOb24temVybyBpZiAtcmVsYXggc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHN1ZmZpY2llbnQgcmVsb2NzIGFyZSBvdXRwdXQKLSAgIGZvciB0aGUgbGlua2VyIHRvIGRvIHJlbGF4aW5nLgotICAgV2UgZG8gc2ltcGxlIGZvcm1zIG9mIHJlbGF4aW5nIGludGVybmFsbHksIGJ1dCB0aGV5IGFyZSBhbHdheXMgZG9uZS4KLSAgIFRoaXMgZmxhZyBkb2VzIG5vdCBhcHBseSB0byB0aGVtLiAgKi8KLXN0YXRpYyBpbnQgbTMycl9yZWxheDsKLQotI2lmIDAgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KLS8qIElmIG5vbi1OVUxMLCBwb2ludGVyIHRvIGNwdSBkZXNjcmlwdGlvbiBmaWxlIHRvIHJlYWQuCi0gICBUaGlzIGFsbG93cyBydW50aW1lIGFkZGl0aW9ucyB0byB0aGUgYXNzZW1ibGVyLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICogbTMycl9jcHVfZGVzYzsKLSNlbmRpZgotCi0vKiBOb24temVybyBpZiB3YXJuIHdoZW4gYSBoaWdoL3NoaWdoIHJlbG9jIGhhcyBubyBtYXRjaGluZyBsb3cgcmVsb2MuCi0gICBFYWNoIGhpZ2gvc2hpZ2ggcmVsb2MgbXVzdCBiZSBwYWlyZWQgd2l0aCBpdCdzIGxvdyBjb3VzaW4gaW4gb3JkZXIgdG8KLSAgIHByb3Blcmx5IGNhbGN1bGF0ZSB0aGUgYWRkZW5kIGluIGEgcmVsb2NhdGFibGUgbGluayAoc2luY2UgdGhlcmUgaXMgYQotICAgcG90ZW50aWFsIGNhcnJ5IGZyb20gdGhlIGxvdyB0byB0aGUgaGlnaC9zaGlnaCkuCi0gICBUaGlzIG9wdGlvbiBpcyBvZmYgYnkgZGVmYXVsdCB0aG91Z2ggZm9yIHVzZXItd3JpdHRlbiBhc3NlbWJsZXIgY29kZSBpdAotICAgbWlnaHQgbWFrZSBzZW5zZSB0byBtYWtlIHRoZSBkZWZhdWx0IGJlIG9uIChpLmUuIGhhdmUgZ2NjIHBhc3MgYSBmbGFnCi0gICB0byB0dXJuIGl0IG9mZikuICBUaGlzIHdhcm5pbmcgbXVzdCBub3QgYmUgb24gZm9yIEdDQyBjcmVhdGVkIGNvZGUgYXMKLSAgIG9wdGltaXphdGlvbiBtYXkgZGVsZXRlIHRoZSBsb3cgYnV0IG5vdCB0aGUgaGlnaC9zaGlnaCAoYXQgbGVhc3Qgd2UKLSAgIHNob3VsZG4ndCBhc3N1bWUgb3IgcmVxdWlyZSBpdCB0bykuICAqLwotc3RhdGljIGludCB3YXJuX3VubWF0Y2hlZF9oaWdoID0gMDsKLQotCi0vKiBzdHVmZiBmb3IgLnNjb21tIHN5bWJvbHMuICAqLwotc3RhdGljIHNlZ1QgICAgIHNic3Nfc2VjdGlvbjsKLXN0YXRpYyBhc2VjdGlvbiBzY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCAgc2NvbV9zeW1ib2w7Ci0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdICAgICAgICA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gICA9ICIjIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSAgICAgICAgICAgID0gImVFIjsKLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gICAgICAgICAgICA9ICJkRCI7Ci0KLS8qIFJlbG9jYXRpb25zIGFnYWluc3Qgc3ltYm9scyBhcmUgZG9uZSBpbiB0d28KLSAgIHBhcnRzLCB3aXRoIGEgSEkgcmVsb2NhdGlvbiBhbmQgYSBMTyByZWxvY2F0aW9uLiAgRWFjaCByZWxvY2F0aW9uCi0gICBoYXMgb25seSAxNiBiaXRzIG9mIHNwYWNlIHRvIHN0b3JlIGFuIGFkZGVuZC4gIFRoaXMgbWVhbnMgdGhhdCBpbgotICAgb3JkZXIgZm9yIHRoZSBsaW5rZXIgdG8gaGFuZGxlIGNhcnJpZXMgY29ycmVjdGx5LCBpdCBtdXN0IGJlIGFibGUKLSAgIHRvIGxvY2F0ZSBib3RoIHRoZSBISSBhbmQgdGhlIExPIHJlbG9jYXRpb24uICBUaGlzIG1lYW5zIHRoYXQgdGhlCi0gICByZWxvY2F0aW9ucyBtdXN0IGFwcGVhciBpbiBvcmRlciBpbiB0aGUgcmVsb2NhdGlvbiB0YWJsZS4KLQotICAgSW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoaXMsIHdlIGtlZXAgdHJhY2sgb2YgZWFjaCB1bm1hdGNoZWQgSEkKLSAgIHJlbG9jYXRpb24uICBXZSB0aGVuIHNvcnQgdGhlbSBzbyB0aGF0IHRoZXkgaW1tZWRpYXRlbHkgcHJlY2VkZSB0aGUKLSAgIGNvcnJlc3BvbmRpbmcgTE8gcmVsb2NhdGlvbi4gKi8KLQotc3RydWN0IG0zMnJfaGlfZml4dXAKLXsKLSAgc3RydWN0IG0zMnJfaGlfZml4dXAgKiBuZXh0OyAgLyogTmV4dCBISSBmaXh1cC4gICovCi0gIGZpeFMgKiAgICAgICAgICAgICAgICAgZml4cDsgIC8qIFRoaXMgZml4dXAuICAqLwotICBzZWdUICAgICAgICAgICAgICAgICAgIHNlZzsgICAvKiBUaGUgc2VjdGlvbiB0aGlzIGZpeHVwIGlzIGluLiAgKi8KLQotfTsKLQotLyogVGhlIGxpc3Qgb2YgdW5tYXRjaGVkIEhJIHJlbG9jcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbTMycl9oaV9maXh1cCAqIG0zMnJfaGlfZml4dXBfbGlzdDsKLQotDAotDAotI2RlZmluZSBNMzJSX1NIT1JUT1BUUyAiIgotY29uc3QgY2hhciAqIG1kX3Nob3J0b3B0cyA9IE0zMlJfU0hPUlRPUFRTOwotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotCi0gIC8qIFNpZ2guICBJIGd1ZXNzIGFsbCB3YXJuaW5ncyBtdXN0IG5vdyBoYXZlIGJvdGggdmFyaWFudHMuICAqLwotI2RlZmluZSBPUFRJT05fV0FSTl9VTk1BVENIRUQgKE9QVElPTl9NRF9CQVNFICsgNCkKLSAgeyJ3YXJuLXVubWF0Y2hlZC1oaWdoIiwgT1BUSU9OX1dBUk5fVU5NQVRDSEVEfSwKLSAgeyJXdWgiLCBPUFRJT05fV0FSTl9VTk1BVENIRUR9LAotI2RlZmluZSBPUFRJT05fTk9fV0FSTl9VTk1BVENIRUQgKE9QVElPTl9NRF9CQVNFICsgNSkKLSAgeyJuby13YXJuLXVubWF0Y2hlZC1oaWdoIiwgT1BUSU9OX1dBUk5fVU5NQVRDSEVEfSwKLSAgeyJXbnVoIiwgT1BUSU9OX1dBUk5fVU5NQVRDSEVEfSwKLQotI2lmIDAgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KLSNkZWZpbmUgT1BUSU9OX1JFTEFYICAoT1BUSU9OX01EX0JBU0UgKyA2KQotICB7InJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SRUxBWH0sCi0jZGVmaW5lIE9QVElPTl9DUFVfREVTQyAoT1BUSU9OX01EX0JBU0UgKyA3KQotICB7ImNwdS1kZXNjIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DUFVfREVTQ30sCi0jZW5kaWYKLQotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50ICAgIGM7Ci0gICAgIGNoYXIgKiBhcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0KLSAgICBjYXNlIE9QVElPTl9XQVJOX1VOTUFUQ0hFRDoKLSAgICAgIHdhcm5fdW5tYXRjaGVkX2hpZ2ggPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT19XQVJOX1VOTUFUQ0hFRDoKLSAgICAgIHdhcm5fdW5tYXRjaGVkX2hpZ2ggPSAwOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSNpZiAwIC8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCi0gICAgY2FzZSBPUFRJT05fUkVMQVg6Ci0gICAgICBtMzJyX3JlbGF4ID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0NQVV9ERVNDOgotICAgICAgbTMycl9jcHVfZGVzYyA9IGFyZzsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICBGSUxFICogc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIiBNMzJSIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb25zOlxuIikpOwotCi0KLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC13YXJuLXVubWF0Y2hlZC1oaWdoICAgIHdhcm4gd2hlbiBhbiAocyloaWdoIHJlbG9jIGhhcyBubyBtYXRjaGluZyBsb3cgcmVsb2NcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1uby13YXJuLXVubWF0Y2hlZC1oaWdoIGRvIG5vdCB3YXJuIGFib3V0IG1pc3NpbmcgbG93IHJlbG9jc1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLVd1aCAgICAgICAgICAgICAgICAgICAgc3lub255bSBmb3IgLXdhcm4tdW5tYXRjaGVkLWhpZ2hcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1XbnVoICAgICAgICAgICAgICAgICAgIHN5bm9ueW0gZm9yIC1uby13YXJuLXVubWF0Y2hlZC1oaWdoXG4iKSk7Ci0KLSNpZiAwCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtcmVsYXggICAgICAgICAgICAgICAgIGNyZWF0ZSBsaW5rZXIgcmVsYXhhYmxlIGNvZGVcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1jcHUtZGVzYyAgICAgICAgICAgICAgcHJvdmlkZSBydW50aW1lIGNwdSBkZXNjcmlwdGlvbiBmaWxlXG4iKSk7Ci0jZW5kaWYKLX0gCi0KLXN0YXRpYyB2b2lkIGZpbGxfaW5zbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG0zMnJfc2NvbW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWJ1Z19zeW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBleHBhbmRfZGVidWdfc3ltcyBQQVJBTVMgKChzeW1fbGlua1MgKiwgaW50KSk7Ci0KLS8qIFNldCBieSBtZF9hc3NlbWJsZSBmb3IgdXNlIGJ5IG0zMnJfZmlsbF9pbnNuLiAgKi8KLXN0YXRpYyBzdWJzZWdUIHByZXZfc3Vic2VnOwotc3RhdGljIHNlZ1QgcHJldl9zZWc7Ci0KLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgIndvcmQiLAljb25zLAkJNCB9LAotICB7ICJmaWxsaW5zbiIsIGZpbGxfaW5zbiwJMCB9LAotICB7ICJzY29tbSIsCW0zMnJfc2NvbW0sCTAgfSwKLSAgeyAiZGVidWdzeW0iLAlkZWJ1Z19zeW0sCTAgfSwKLSAgeyBOVUxMLCBOVUxMLCAwIH0KLX07Ci0KLS8qIEZJWE1FOiBTaG91bGQgYmUgbWFjaGluZSBnZW5lcmF0ZWQuICAqLwotI2RlZmluZSBOT1BfSU5TTiAweDcwMDAKLSNkZWZpbmUgUEFSX05PUF9JTlNOIDB4ZjAwMCAvKiBjYW4gb25seSBiZSB1c2VkIGluIDJuZCBzbG90ICovCi0KLS8qIFdoZW4gd2UgYWxpZ24gdGhlIC50ZXh0IHNlY3Rpb24sIGluc2VydCB0aGUgY29ycmVjdCBOT1AgcGF0dGVybi4KLSAgIE4gaXMgdGhlIHBvd2VyIG9mIDIgYWxpZ25tZW50LiAgTEVOIGlzIHRoZSBsZW5ndGggb2YgcGF0dGVybiBGSUxMLgotICAgTUFYIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAgd2hlbiBkb2luZyB0aGUgYWxpZ25tZW50LAotICAgb3IgMCBpZiB0aGVyZSBpcyBubyBtYXhpbXVtLiAgKi8KLQotaW50Ci1tMzJyX2RvX2FsaWduIChuLCBmaWxsLCBsZW4sIG1heCkKLSAgICAgaW50ICAgICAgICAgIG47Ci0gICAgIGNvbnN0IGNoYXIgKiBmaWxsOwotICAgICBpbnQgICAgICAgICAgbGVuOwotICAgICBpbnQgICAgICAgICAgbWF4OwotewotICAvKiBPbmx5IGRvIHRoaXMgaWYgdGhlIGZpbGwgcGF0dGVybiB3YXNuJ3Qgc3BlY2lmaWVkLiAgKi8KLSAgaWYgKGZpbGwgPT0gTlVMTAotICAgICAgJiYgKG5vd19zZWctPmZsYWdzICYgU0VDX0NPREUpICE9IDAKLSAgICAgIC8qIE9ubHkgZG8gdGhpcyBzcGVjaWFsIGhhbmRsaW5nIGlmIGFsaWduaW5nIHRvIGF0IGxlYXN0IGEKLQkgNCBieXRlIGJvdW5kYXJ5LiAgKi8KLSAgICAgICYmIG4gPiAxCi0gICAgIC8qIE9ubHkgZG8gdGhpcyBzcGVjaWFsIGhhbmRsaW5nIGlmIHdlJ3JlIGFsbG93ZWQgdG8gZW1pdCBhdAotCSBsZWFzdCB0d28gYnl0ZXMuICAqLwotICAgICAgJiYgKG1heCA9PSAwIHx8IG1heCA+IDEpKQotICAgIHsKLSAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5vcF9wYXR0ZXJuW10gPSB7IDB4ZjAsIDB4MDAgfTsKLQotI2lmIDAKLSAgICAgIC8qIEZpcnN0IGFsaWduIHRvIGEgMiBieXRlIGJvdW5kYXJ5LCBpbiBjYXNlIHRoZXJlIGlzIGFuIG9kZCAuYnl0ZS4gICovCi0gICAgICAvKiBGSVhNRTogSG93IG11Y2ggbWVtb3J5IHdpbGwgY2F1c2UgZ2FzIHRvIHVzZSB3aGVuIGFzc2VtYmxpbmcgYSBiaWcKLQkgcHJvZ3JhbT8gIFBlcmhhcHMgd2UgY2FuIGF2b2lkIHRoZSBmcmFnX2FsaWduIGNhbGw/ICAqLwotICAgICAgZnJhZ19hbGlnbiAoMSwgMCwgMCk7Ci0jZW5kaWYKLSAgICAgIC8qIE5leHQgYWxpZ24gdG8gYSA0IGJ5dGUgYm91bmRhcnkgKHdlIGtub3cgbiA+PSAyKSB1c2luZyBhIHBhcmFsbGVsCi0JIG5vcC4gICovCi0gICAgICBmcmFnX2FsaWduX3BhdHRlcm4gKDIsIG5vcF9wYXR0ZXJuLCBzaXplb2Ygbm9wX3BhdHRlcm4sIDApOwotICAgICAgLyogSWYgZG9pbmcgbGFyZ2VyIGFsaWdubWVudHMgdXNlIGEgcmVwZWF0aW5nIHNlcXVlbmNlIG9mIGFwcHJvcHJpYXRlCi0JIG5vcHMuICAqLwotICAgICAgaWYgKG4gPiAyKQotCXsKLQkgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG11bHRpX25vcF9wYXR0ZXJuW10gPQotCSAgeyAweDcwLCAweDAwLCAweGYwLCAweDAwIH07Ci0JICBmcmFnX2FsaWduX3BhdHRlcm4gKG4sIG11bHRpX25vcF9wYXR0ZXJuLCBzaXplb2YgbXVsdGlfbm9wX3BhdHRlcm4sCi0JCQkgICAgICBtYXggPyBtYXggLSAyIDogMCk7Ci0JfQotICAgICAgCi0gICAgICBwcmV2X2luc24uaW5zbiA9IE5VTEw7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIElmIHRoZSBsYXN0IGluc3RydWN0aW9uIHdhcyB0aGUgZmlyc3Qgb2YgMiAxNiBiaXQgaW5zbnMsCi0gICBvdXRwdXQgYSBub3AgdG8gbW92ZSB0aGUgUEMgdG8gYSAzMiBiaXQgYm91bmRhcnkuCi0KLSAgIFRoaXMgaXMgZG9uZSB2aWEgYW4gYWxpZ25tZW50IHNwZWNpZmljYXRpb24gc2luY2UgYnJhbmNoIHJlbGF4aW5nCi0gICBtYXkgbWFrZSBpdCB1bm5lY2Vzc2FyeS4KLQotICAgSW50ZXJuYWxseSwgd2UgbmVlZCB0byBvdXRwdXQgb25lIG9mIHRoZXNlIGVhY2ggdGltZSBhIDMyIGJpdCBpbnNuIGlzCi0gICBzZWVuIGFmdGVyIGFuIGluc24gdGhhdCBpcyByZWxheGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotZmlsbF9pbnNuIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gICh2b2lkKSBtMzJyX2RvX2FsaWduICgyLCBOVUxMLCAwLCAwKTsKLSAgcHJldl9pbnNuLmluc24gPSBOVUxMOwotICBzZWVuX3JlbGF4YWJsZV9wID0gMDsKLX0KLQotLyogUmVjb3JkIHRoZSBzeW1ib2wgc28gdGhhdCB3aGVuIHdlIG91dHB1dCB0aGUgaW5zbiwgd2UgY2FuIGNyZWF0ZQotICAgYSBzeW1ib2wgdGhhdCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGluc3RydWN0aW9uLiAgVGhpcyBpcyB1c2VkCi0gICB0byBlbWl0IHRoZSBsYWJlbCBmb3IgdGhlIHN0YXJ0IG9mIGEgYnJlYWtwb2ludCB3aXRob3V0IGNhdXNpbmcKLSAgIHRoZSBhc3NlbWJsZXIgdG8gZW1pdCBhIE5PUCBpZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGEKLSAgIDE2IGJpdCBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1kZWJ1Z19zeW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciBkZWxpbTsKLSAgcmVnaXN0ZXIgY2hhciAqZW5kX25hbWU7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHJlZ2lzdGVyIHN5bV9saW5rUyAqbGluazsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBkZWxpbSA9IGdldF9zeW1ib2xfZW5kICgpOwotICBlbmRfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAKLSAgaWYgKChzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpKSA9PSBOVUxMCi0gICAgICAmJiAoc3ltYm9sUCA9IG1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICB9Ci0KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCk7Ci0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmIFNfR0VUX1NFR01FTlQgKHN5bWJvbFApICE9IHJlZ19zZWN0aW9uKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgYXNfYmFkIChfKCJzeW1ib2wgYCVzJyBhbHJlYWR5IGRlZmluZWQiKSwgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCi0gIGVsc2UKLSAgICB7Ci0gICAgICBsaW5rID0gKHN5bV9saW5rUyAqKSB4bWFsbG9jIChzaXplb2YgKHN5bV9saW5rUykpOwotICAgICAgbGluay0+c3ltYm9sID0gc3ltYm9sUDsKLSAgICAgIGxpbmstPm5leHQgPSBkZWJ1Z19zeW1fbGluazsKLSAgICAgIGRlYnVnX3N5bV9saW5rID0gbGluazsKLSAgICAgIHN5bWJvbFAtPmxvY2FsID0gMTsKLSAgICB9Ci0KLSAgKmVuZF9uYW1lID0gZGVsaW07Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFNlY29uZCBwYXNzIHRvIGV4cGFuZGluZyB0aGUgZGVidWcgc3ltYm9scywgZ28gdGhyb3VnaCBsaW5rZWQKLSAgIGxpc3Qgb2Ygc3ltYm9scyBhbmQgcmVhc3NpZ24gdGhlIGFkZHJlc3MuICAqLwotCi1zdGF0aWMgdm9pZAotZXhwYW5kX2RlYnVnX3N5bXMgKHN5bXMsIGFsaWduKQotICAgICBzeW1fbGlua1MgKnN5bXM7Ci0gICAgIGludCBhbGlnbjsKLXsKLSAgY2hhciAqc2F2ZV9pbnB1dF9saW5lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBzeW1fbGlua1MgKm5leHRfc3ltczsKLQotICBpZiAoIXN5bXMpCi0gICAgcmV0dXJuOwotCi0gICh2b2lkKSBtMzJyX2RvX2FsaWduIChhbGlnbiwgTlVMTCwgMCwgMCk7Ci0gIGZvciAoOyBzeW1zICE9IChzeW1fbGlua1MgKikwOyBzeW1zID0gbmV4dF9zeW1zKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5bWJvbFAgPSBzeW1zLT5zeW1ib2w7Ci0gICAgICBuZXh0X3N5bXMgPSBzeW1zLT5uZXh0OwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gIi5cbiI7Ci0gICAgICBwc2V1ZG9fc2V0IChzeW1ib2xQKTsKLSAgICAgIGZyZWUgKChjaGFyICopc3ltcyk7Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW5wdXRfbGluZTsKLX0KLQotLyogQ292ZXIgZnVuY3Rpb24gdG8gZmlsbF9pbnNuIGNhbGxlZCBhZnRlciBhIGxhYmVsIGFuZCBhdCBlbmQgb2YgYXNzZW1ibHkuCi0gICBUaGUgcmVzdWx0IGlzIGFsd2F5cyAxOiB3ZSdyZSBjYWxsZWQgaW4gYSBjb25kaXRpb25hbCB0byBzZWUgaWYgdGhlCi0gICBjdXJyZW50IGxpbmUgaXMgYSBsYWJlbC4gICovCi0KLWludAotbTMycl9maWxsX2luc24gKGRvbmUpCi0gICAgIGludCBkb25lOwotewotICBpZiAocHJldl9zZWcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZWdUICAgIHNlZyAgICA9IG5vd19zZWc7Ci0gICAgICBzdWJzZWdUIHN1YnNlZyA9IG5vd19zdWJzZWc7Ci0KLSAgICAgIHN1YnNlZ19zZXQgKHByZXZfc2VnLCBwcmV2X3N1YnNlZyk7Ci0gICAgICAKLSAgICAgIGZpbGxfaW5zbiAoMCk7Ci0KLSAgICAgIHN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKLSAgICB9Ci0KLSAgaWYgKGRvbmUgJiYgZGVidWdfc3ltX2xpbmspCi0gICAgewotICAgICAgZXhwYW5kX2RlYnVnX3N5bXMgKGRlYnVnX3N5bV9saW5rLCAxKTsKLSAgICAgIGRlYnVnX3N5bV9saW5rID0gKHN5bV9saW5rUyAqKTA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotDAotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgZmxhZ3dvcmQgYXBwbGljYWJsZTsKLSAgc2VnVCAgICAgc2VnOwotICBzdWJzZWdUICBzdWJzZWc7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgYGNnZW4nIGludGVyZmFjZS4gICovCi0gIAotICAvKiBTZXQgdGhlIG1hY2hpbmUgbnVtYmVyIGFuZCBlbmRpYW4uICAqLwotICBnYXNfY2dlbl9jcHVfZGVzYyA9IG0zMnJfY2dlbl9jcHVfb3BlbiAoQ0dFTl9DUFVfT1BFTl9NQUNIUywgMCwKLQkJCQkJICBDR0VOX0NQVV9PUEVOX0VORElBTiwKLQkJCQkJICBDR0VOX0VORElBTl9CSUcsCi0JCQkJCSAgQ0dFTl9DUFVfT1BFTl9FTkQpOwotICBtMzJyX2NnZW5faW5pdF9hc20gKGdhc19jZ2VuX2NwdV9kZXNjKTsKLQotICAvKiBUaGUgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZSBpcyB1c2VkIGR1cmluZyBvcHRpbWl6YXRpb24gdG8gZGV0ZXJtaW5lCi0gICAgIHdoaWNoIGluc25zIGNhbiBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbC4gIEl0IGlzIGFsc28gdXNlZCB0byBnaXZlCi0gICAgIHdhcm5pbmdzIHJlZ2FyZGluZyBvcGVyYW5kIGludGVyZmVyZW5jZSBpbiBwYXJhbGxlbCBpbnNucy4gICovCi0gIG0zMnJfY2dlbl9pbml0X29waW5zdF90YWJsZSAoZ2FzX2NnZW5fY3B1X2Rlc2MpOwotCi0gIC8qIFRoaXMgaXMgYSBjYWxsYmFjayBmcm9tIGNnZW4gdG8gZ2FzIHRvIHBhcnNlIG9wZXJhbmRzLiAgKi8KLSAgY2dlbl9zZXRfcGFyc2Vfb3BlcmFuZF9mbiAoZ2FzX2NnZW5fY3B1X2Rlc2MsIGdhc19jZ2VuX3BhcnNlX29wZXJhbmQpOwotCi0jaWYgMCAvKiBub3Qgc3VwcG9ydGVkIHlldCAqLwotICAvKiBJZiBhIHJ1bnRpbWUgY3B1IGRlc2NyaXB0aW9uIGZpbGUgd2FzIHByb3ZpZGVkLCBwYXJzZSBpdC4gICovCi0gIGlmIChtMzJyX2NwdV9kZXNjICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqIGVycm1zZzsKLQotICAgICAgZXJybXNnID0gY2dlbl9yZWFkX2NwdV9maWxlIChnYXNfY2dlbl9jcHVfZGVzYywgbTMycl9jcHVfZGVzYyk7Ci0gICAgICBpZiAoZXJybXNnICE9IE5VTEwpCi0JYXNfYmFkICgiJXM6ICVzIiwgbTMycl9jcHVfZGVzYywgZXJybXNnKTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBTYXZlIHRoZSBjdXJyZW50IHN1YnNlZyBzbyB3ZSBjYW4gcmVzdG9yZSBpdCBbaXQncyB0aGUgZGVmYXVsdCBvbmUgYW5kCi0gICAgIHdlIGRvbid0IHdhbnQgdGhlIGluaXRpYWwgc2VjdGlvbiB0byBiZSAuc2Jzc10uICAqLwotICBzZWcgICAgPSBub3dfc2VnOwotICBzdWJzZWcgPSBub3dfc3Vic2VnOwotCi0gIC8qIFRoZSBzYnNzIHNlY3Rpb24gaXMgZm9yIGxvY2FsIC5zY29tbSBzeW1ib2xzLiAgKi8KLSAgc2Jzc19zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5zYnNzIiwgMCk7Ci0gIAotICAvKiBUaGlzIGlzIGNvcGllZCBmcm9tIHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcy4gICovCi0gIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2Jzc19zZWN0aW9uLCBhcHBsaWNhYmxlICYgU0VDX0FMTE9DKTsKLSAgCi0jaWYgMCAvKiBXaGF0IGRvZXMgdGhpcyBkbz8gW3NlZSBwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3NdICAqLwotICBzZWdfaW5mbyAoYnNzX3NlY3Rpb24pLT5ic3MgPSAxOwotI2VuZGlmCi0KLSAgc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpOwotCi0gIC8qIFdlIG11c3QgY29uc3RydWN0IGEgZmFrZSBzZWN0aW9uIHNpbWlsYXIgdG8gYmZkX2NvbV9zZWN0aW9uCi0gICAgIGJ1dCB3aXRoIHRoZSBuYW1lIC5zY29tbW9uLiAgKi8KLSAgc2NvbV9zZWN0aW9uICAgICAgICAgICAgICAgID0gYmZkX2NvbV9zZWN0aW9uOwotICBzY29tX3NlY3Rpb24ubmFtZSAgICAgICAgICAgPSAiLnNjb21tb24iOwotICBzY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmIHNjb21fc2VjdGlvbjsKLSAgc2NvbV9zZWN0aW9uLnN5bWJvbCAgICAgICAgID0gJiBzY29tX3N5bWJvbDsKLSAgc2NvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJiBzY29tX3NlY3Rpb24uc3ltYm9sOwotICBzY29tX3N5bWJvbCAgICAgICAgICAgICAgICAgPSAqIGJmZF9jb21fc2VjdGlvbi5zeW1ib2w7Ci0gIHNjb21fc3ltYm9sLm5hbWUgICAgICAgICAgICA9ICIuc2NvbW1vbiI7Ci0gIHNjb21fc3ltYm9sLnNlY3Rpb24gICAgICAgICA9ICYgc2NvbV9zZWN0aW9uOwotCi19Ci0KLQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBtMzJyX2luc24gaW5zbjsKLSAgY2hhciAqICAgIGVycm1zZzsKLSAgY2hhciAqICAgIHN0cjIgPSBOVUxMOwotCi0gIC8qIEluaXRpYWxpemUgR0FTJ3MgY2dlbiBpbnRlcmZhY2UgZm9yIGEgbmV3IGluc3RydWN0aW9uLiAgKi8KLSAgZ2FzX2NnZW5faW5pdF9wYXJzZSAoKTsKLQotICAKLSAgaW5zbi5kZWJ1Z19zeW1fbGluayA9IGRlYnVnX3N5bV9saW5rOwotICBkZWJ1Z19zeW1fbGluayA9IChzeW1fbGlua1MgKikwOwotCi0gIGluc24uaW5zbiA9IG0zMnJfY2dlbl9hc3NlbWJsZV9pbnNuCi0gICAgKGdhc19jZ2VuX2NwdV9kZXNjLCBzdHIsICYgaW5zbi5maWVsZHMsIGluc24uYnVmZmVyLCAmIGVycm1zZyk7Ci0gIAotICBpZiAoIWluc24uaW5zbikKLSAgICB7Ci0gICAgICBhc19iYWQgKGVycm1zZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIAotICBpZiAoQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24uaW5zbikgPT0gMzIpCi0gICAgewotICAgICAgLyogMzIgYml0IGluc25zIG11c3QgbGl2ZSBvbiAzMiBiaXQgYm91bmRhcmllcy4gICovCi0gICAgICBpZiAocHJldl9pbnNuLmluc24gfHwgc2Vlbl9yZWxheGFibGVfcCkKLQl7Ci0JICAvKiA/Pz8gSWYgY2FsbGluZyBmaWxsX2luc24gdG9vIG1hbnkgdGltZXMgdHVybnMgdXMgaW50byBhIG1lbW9yeQotCSAgICAgcGlnLCBjYW4gd2UgY2FsbCBhIGZuIHRvIGFzc2VtYmxlIGEgbm9wIGluc3RlYWQgb2YKLQkgICAgICFzZWVuX3JlbGF4YWJsZV9wPyAgKi8KLQkgIGZpbGxfaW5zbiAoMCk7Ci0JfQotCi0gICAgICBleHBhbmRfZGVidWdfc3ltcyAoaW5zbi5kZWJ1Z19zeW1fbGluaywgMik7Ci0KLSAgICAgIC8qIERvZXNuJ3QgcmVhbGx5IG1hdHRlciB3aGF0IHdlIHBhc3MgZm9yIFJFTEFYX1AgaGVyZS4gICovCi0gICAgICBnYXNfY2dlbl9maW5pc2hfaW5zbiAoaW5zbi5pbnNuLCBpbnNuLmJ1ZmZlciwKLQkJCSAgICBDR0VOX0ZJRUxEU19CSVRTSVpFICgmIGluc24uZmllbGRzKSwgMSwgTlVMTCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IG9uXzMyYml0X2JvdW5kYXJ5X3A7Ci0KLSAgICAgIGlmIChDR0VOX0lOU05fQklUU0laRSAoaW5zbi5pbnNuKSAhPSAxNikKLQlhYm9ydCgpOwotCi0gICAgICBpbnNuLm9yaWdfaW5zbiA9IGluc24uaW5zbjsKLQotICAgICAgLyogQ29tcHV0ZSB3aGV0aGVyIHdlJ3JlIG9uIGEgMzIgYml0IGJvdW5kYXJ5IG9yIG5vdC4KLQkgcHJldl9pbnNuLmluc24gaXMgTlVMTCB3aGVuIHdlJ3JlIG9uIGEgMzIgYml0IGJvdW5kYXJ5LiAgKi8KLSAgICAgIG9uXzMyYml0X2JvdW5kYXJ5X3AgPSBwcmV2X2luc24uaW5zbiA9PSBOVUxMOwotCi0KLSAgICAgIGV4cGFuZF9kZWJ1Z19zeW1zIChpbnNuLmRlYnVnX3N5bV9saW5rLCAxKTsKLQotICAgICAgewotCWludCBpOwotCWZpbmlzaGVkX2luc25TIGZpOwotCi0JLyogRW5zdXJlIGVhY2ggcGFpciBvZiAxNiBiaXQgaW5zbnMgaXMgaW4gdGhlIHNhbWUgZnJhZy4gICovCi0JZnJhZ19ncm93ICg0KTsKLQotCWdhc19jZ2VuX2ZpbmlzaF9pbnNuIChpbnNuLm9yaWdfaW5zbiwgaW5zbi5idWZmZXIsCi0JCQkgICAgICBDR0VOX0ZJRUxEU19CSVRTSVpFICgmIGluc24uZmllbGRzKSwKLQkJCSAgICAgIDEgLypyZWxheF9wKi8sICZmaSk7Ci0JaW5zbi5hZGRyID0gZmkuYWRkcjsKLQlpbnNuLmZyYWcgPSBmaS5mcmFnOwotCWluc24ubnVtX2ZpeHVwcyA9IGZpLm51bV9maXh1cHM7Ci0JZm9yIChpID0gMDsgaSA8IGZpLm51bV9maXh1cHM7ICsraSkKLQkgIGluc24uZml4dXBzW2ldID0gZmkuZml4dXBzW2ldOwotICAgICAgfQotCi0KLSAgICAgIC8qIEtlZXAgdHJhY2sgb2Ygd2hldGhlciB3ZSd2ZSBzZWVuIGEgcGFpciBvZiAxNiBiaXQgaW5zbnMuCi0JIHByZXZfaW5zbi5pbnNuIGlzIE5VTEwgd2hlbiB3ZSdyZSBvbiBhIDMyIGJpdCBib3VuZGFyeS4gICovCi0gICAgICBpZiAob25fMzJiaXRfYm91bmRhcnlfcCkKLQlwcmV2X2luc24gPSBpbnNuOwotICAgICAgZWxzZQotCXByZXZfaW5zbi5pbnNuID0gTlVMTDsKLSAgICAgIAotICAgICAgLyogSWYgdGhlIGluc24gbmVlZHMgdGhlIGZvbGxvd2luZyBvbmUgdG8gYmUgb24gYSAzMiBiaXQgYm91bmRhcnkKLQkgKGUuZy4gc3Vicm91dGluZSBjYWxscyksIGZpbGwgdGhpcyBpbnNuJ3Mgc2xvdC4gICovCi0gICAgICBpZiAob25fMzJiaXRfYm91bmRhcnlfcAotCSAgJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24ub3JpZ19pbnNuLCBDR0VOX0lOU05fRklMTF9TTE9UKSAhPSAwKQotCWZpbGxfaW5zbiAoMCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSByZWxheGFibGUgaW5zbiAoY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBsYXJnZXIgdmVyc2lvbikKLQkgbWFyayB0aGUgZmFjdCBzbyB0aGF0IHdlIGNhbiBlbWl0IGFuIGFsaWdubWVudCBkaXJlY3RpdmUgZm9yIGEKLQkgZm9sbG93aW5nIDMyIGJpdCBpbnNuIGlmIHdlIHNlZSBvbmUuICAgKi8KLSAgICAgIGlmIChDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbi5vcmlnX2luc24sIENHRU5fSU5TTl9SRUxBWEFCTEUpICE9IDApCi0Jc2Vlbl9yZWxheGFibGVfcCA9IDE7Ci0gICAgfQotCi0gIC8qIFNldCB0aGVzZSBzbyBtMzJyX2ZpbGxfaW5zbiBjYW4gdXNlIHRoZW0uICAqLwotICBwcmV2X3NlZyAgICA9IG5vd19zZWc7Ci0gIHByZXZfc3Vic2VnID0gbm93X3N1YnNlZzsKLX0KLQotLyogVGhlIHN5bnRheCBpbiB0aGUgbWFudWFsIHNheXMgY29uc3RhbnRzIGJlZ2luIHdpdGggJyMnLgotICAgV2UganVzdCBpZ25vcmUgaXQuICAqLwotCi12b2lkIAotbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICogZXhwcmVzc2lvblA7Ci17Ci0gIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICsrOwotICAgICAgZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOwotICAgIH0KLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUICAgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnbWVudCk7Ci0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gIGNoYXIgKiBuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQwKLS8qIC5zY29tbSBwc2V1ZG8tb3AgaGFuZGxlci4KLQotICAgVGhpcyBpcyBhIG5ldyBwc2V1ZG8tb3AgdG8gaGFuZGxlIHB1dHRpbmcgb2JqZWN0cyBpbiAuc2NvbW1vbi4KLSAgIEJ5IGRvaW5nIHRoaXMgdGhlIGxpbmtlciB3b24ndCBuZWVkIHRvIGRvIGFueSB3b3JrIGFuZCBtb3JlIGltcG9ydGFudGx5Ci0gICBpdCByZW1vdmVzIHRoZSBpbXBsaWNpdCAtRyBhcmcgbmVjZXNzYXJ5IHRvIGNvcnJlY3RseSBsaW5rIHRoZSBvYmplY3QgZmlsZS4KLSovCi0KLXN0YXRpYyB2b2lkCi1tMzJyX3Njb21tIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKiAgICBuYW1lOwotICByZWdpc3RlciBjaGFyICAgICAgYzsKLSAgcmVnaXN0ZXIgY2hhciAqICAgIHA7Ci0gIG9mZnNldFQgICAgICAgICAgICBzaXplOwotICByZWdpc3RlciBzeW1ib2xTICogc3ltYm9sUDsKLSAgb2Zmc2V0VCAgICAgICAgICAgIGFsaWduOwotICBpbnQgICAgICAgICAgICAgICAgYWxpZ24yOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAvKiBqdXN0IGFmdGVyIG5hbWUgaXMgbm93ICdcMCcgKi8KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKiBwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWU6IHJlc3Qgb2YgbGluZSBpZ25vcmVkLiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlciArKzsJCS8qIHNraXAgJywnICovCi0gIGlmICgoc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX3dhcm4gKF8oIi5TQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIiksIChsb25nKSBzaXplKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFRoZSB0aGlyZCBhcmd1bWVudCB0byAuc2NvbW0gaXMgdGhlIGFsaWdubWVudC4gICovCi0gIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgYWxpZ24gPSA4OwotICBlbHNlCi0gICAgewotICAgICAgKysgaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmIChhbGlnbiA8PSAwKQotCXsKLQkgIGFzX3dhcm4gKF8oImlnbm9yaW5nIGJhZCBhbGlnbm1lbnQiKSk7Ci0JICBhbGlnbiA9IDg7Ci0JfQotICAgIH0KLSAgLyogQ29udmVydCB0byBhIHBvd2VyIG9mIDIgYWxpZ25tZW50LiAgKi8KLSAgaWYgKGFsaWduKQotICAgIHsKLSAgICAgIGZvciAoYWxpZ24yID0gMDsgKGFsaWduICYgMSkgPT0gMDsgYWxpZ24gPj49IDEsICsrIGFsaWduMikKLQljb250aW51ZTsKLSAgICAgIGlmIChhbGlnbiAhPSAxKQotCXsKLQkgIGFzX2JhZCAoXygiQ29tbW9uIGFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgYWxpZ24yID0gMDsKLQotICAqIHAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICogcCA9IGM7Ci0KLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIGAlcycuIiksCi0JICAgICAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAmJiBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gKHZhbHVlVCkgc2l6ZSkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfYmFkIChfKCJMZW5ndGggb2YgLnNjb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIpLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApLAotCSAgICAgIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksCi0JICAgICAgKGxvbmcpIHNpemUpOwotCi0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc3ltYm9sUC0+bG9jYWwpCi0gICAgewotICAgICAgc2VnVCAgIG9sZF9zZWMgICAgPSBub3dfc2VnOwotICAgICAgaW50ICAgIG9sZF9zdWJzZWMgPSBub3dfc3Vic2VnOwotICAgICAgY2hhciAqIHBmcmFnOwotCi0gICAgICByZWNvcmRfYWxpZ25tZW50IChzYnNzX3NlY3Rpb24sIGFsaWduMik7Ci0gICAgICBzdWJzZWdfc2V0IChzYnNzX3NlY3Rpb24sIDApOwotICAgICAgCi0gICAgICBpZiAoYWxpZ24yKQotCWZyYWdfYWxpZ24gKGFsaWduMiwgMCwgMCk7Ci0gICAgICAKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBzYnNzX3NlY3Rpb24pCi0Jc3ltYm9sUC0+c3lfZnJhZy0+ZnJfc3ltYm9sID0gMDsKLSAgICAgIAotICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWdfbm93OwotICAgICAgCi0gICAgICBwZnJhZyA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIHN5bWJvbFAsIHNpemUsCi0JCQkoY2hhciAqKSAwKTsKLSAgICAgICogcGZyYWcgPSAwOwotICAgICAgU19TRVRfU0laRSAoc3ltYm9sUCwgc2l6ZSk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBzYnNzX3NlY3Rpb24pOwotICAgICAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0gICAgICBzdWJzZWdfc2V0IChvbGRfc2VjLCBvbGRfc3Vic2VjKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgc2l6ZSk7Ci0gICAgICBTX1NFVF9BTElHTiAoc3ltYm9sUCwgYWxpZ24yKTsKLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsICYgc2NvbV9zZWN0aW9uKTsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIEludGVyZmFjZSB0byByZWxheF9zZWdtZW50LiAgKi8KLQotLyogRklYTUU6IEJ1aWxkIHRhYmxlIGJ5IGhhbmQsIGdldCBpdCB3b3JraW5nLCB0aGVuIG1hY2hpbmUgZ2VuZXJhdGUuICAqLwotCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLS8qIFRoZSBmaWVsZHMgYXJlOgotICAgMSkgbW9zdCBwb3NpdGl2ZSByZWFjaCBvZiB0aGlzIHN0YXRlLAotICAgMikgbW9zdCBuZWdhdGl2ZSByZWFjaCBvZiB0aGlzIHN0YXRlLAotICAgMykgaG93IG1hbnkgYnl0ZXMgdGhpcyBtb2RlIHdpbGwgYWRkIHRvIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGZyYWcKLSAgIDQpIHdoaWNoIGluZGV4IGludG8gdGhlIHRhYmxlIHRvIHRyeSBpZiB3ZSBjYW4ndCBmaXQgaW50byB0aGlzIG9uZS4gICovCi0KLSAgLyogVGhlIGZpcnN0IGVudHJ5IG11c3QgYmUgdW51c2VkIGJlY2F1c2UgYW4gYHJseF9tb3JlJyB2YWx1ZSBvZiB6ZXJvIGVuZHMKLSAgICAgZWFjaCBsaXN0LiAgKi8KLSAgezEsIDEsIDAsIDB9LAotCi0gIC8qIFRoZSBkaXNwbGFjZW1lbnQgdXNlZCBieSBHQVMgaXMgZnJvbSB0aGUgZW5kIG9mIHRoZSAyIGJ5dGUgaW5zbiwKLSAgICAgc28gd2Ugc3VidHJhY3QgMiBmcm9tIHRoZSBmb2xsb3dpbmcuICAqLwotICAvKiAxNiBiaXQgaW5zbiwgOCBiaXQgZGlzcCAtPiAxMCBiaXQgcmFuZ2UuCi0gICAgIFRoaXMgZG9lc24ndCBoYW5kbGUgYSBicmFuY2ggaW4gdGhlIHJpZ2h0IHNsb3QgYXQgdGhlIGJvcmRlcjoKLSAgICAgdGhlICImIC00IiBpc24ndCB0YWtlbiBpbnRvIGFjY291bnQuICBJdCdzIG5vdCBpbXBvcnRhbnQgZW5vdWdoIHRvCi0gICAgIGNvbXBsaWNhdGUgdGhpbmdzIG92ZXIgaXQsIHNvIHdlIHN1YnRyYWN0IGFuIGV4dHJhIDIgKG9yICsgMiBpbiAtdmUKLSAgICAgY2FzZSkuICAqLwotICB7NTExIC0gMiAtIDIsIC01MTIgLSAyICsgMiwgMCwgMiB9LAotICAvKiAzMiBiaXQgaW5zbiwgMjQgYml0IGRpc3AgLT4gMjYgYml0IHJhbmdlLiAgKi8KLSAgezB4MjAwMDAwMCAtIDEgLSAyLCAtMHgyMDAwMDAwIC0gMiwgMiwgMCB9LAotICAvKiBTYW1lIHRoaW5nLCBidXQgd2l0aCBsZWFkaW5nIG5vcCBmb3IgYWxpZ25tZW50LiAgKi8KLSAgezB4MjAwMDAwMCAtIDEgLSAyLCAtMHgyMDAwMDAwIC0gMiwgNCwgMCB9Ci19OwotCi1sb25nCi1tMzJyX3JlbGF4X2ZyYWcgKGZyYWdQLCBzdHJldGNoKQotICAgICBmcmFnUyAqIGZyYWdQOwotICAgICBsb25nICAgIHN0cmV0Y2g7Ci17Ci0gIC8qIEFkZHJlc3Mgb2YgYnJhbmNoIGluc24uICAqLwotICBsb25nIGFkZHJlc3MgPSBmcmFnUC0+ZnJfYWRkcmVzcyArIGZyYWdQLT5mcl9maXggLSAyOwotICBsb25nIGdyb3d0aCA9IDA7Ci0KLSAgLyogS2VlcCAzMiBiaXQgaW5zbnMgYWxpZ25lZCBvbiAzMiBiaXQgYm91bmRhcmllcy4gICovCi0gIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAyKQotICAgIHsKLSAgICAgIGlmICgoYWRkcmVzcyAmIDMpICE9IDApCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAzOwotCSAgZ3Jvd3RoID0gMjsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAzKQotICAgIHsKLSAgICAgIGlmICgoYWRkcmVzcyAmIDMpID09IDApCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAyOwotCSAgZ3Jvd3RoID0gLTI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGdyb3d0aCA9IHJlbGF4X2ZyYWcgKGZyYWdQLCBzdHJldGNoKTsKLQotICAgICAgLyogTG9uZyBqdW1wIG9uIG9kZCBoYWxmd29yZCBib3VuZGFyeT8gICovCi0gICAgICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMiAmJiAoYWRkcmVzcyAmIDMpICE9IDApCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAzOwotCSAgZ3Jvd3RoICs9IDI7Ci0JfQotICAgIH0KLQotICByZXR1cm4gZ3Jvd3RoOwotfQotCi0vKiBSZXR1cm4gYW4gaW5pdGlhbCBndWVzcyBvZiB0aGUgbGVuZ3RoIGJ5IHdoaWNoIGEgZnJhZ21lbnQgbXVzdCBncm93IHRvCi0gICBob2xkIGEgYnJhbmNoIHRvIHJlYWNoIGl0cyBkZXN0aW5hdGlvbi4KLSAgIEFsc28gdXBkYXRlcyBmcl90eXBlL2ZyX3N1YnR5cGUgYXMgbmVjZXNzYXJ5LgotCi0gICBDYWxsZWQganVzdCBiZWZvcmUgZG9pbmcgcmVsYXhhdGlvbi4KLSAgIEFueSBzeW1ib2wgdGhhdCBpcyBub3cgdW5kZWZpbmVkIHdpbGwgbm90IGJlY29tZSBkZWZpbmVkLgotICAgVGhlIGd1ZXNzIGZvciBmcl92YXIgaXMgQUNUVUFMTFkgdGhlIGdyb3d0aCBiZXlvbmQgZnJfZml4LgotICAgV2hhdGV2ZXIgd2UgZG8gdG8gZ3JvdyBmcl9maXggb3IgZnJfdmFyIGNvbnRyaWJ1dGVzIHRvIG91ciByZXR1cm5lZCB2YWx1ZS4KLSAgIEFsdGhvdWdoIGl0IG1heSBub3QgYmUgZXhwbGljaXQgaW4gdGhlIGZyYWcsIHByZXRlbmQgZnJfdmFyIHN0YXJ0cyB3aXRoIGEKLSAgIDAgdmFsdWUuICAqLwotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKLSAgICAgZnJhZ1MgKiBmcmFnUDsKLSAgICAgc2VnVCAgICBzZWdtZW50OwotewotICBpbnQgICAgb2xkX2ZyX2ZpeCA9IGZyYWdQLT5mcl9maXg7Ci0KLSAgLyogVGhlIG9ubHkgdGhpbmcgd2UgaGF2ZSB0byBoYW5kbGUgaGVyZSBhcmUgc3ltYm9scyBvdXRzaWRlIG9mIHRoZQotICAgICBjdXJyZW50IHNlZ21lbnQuICBUaGV5IG1heSBiZSB1bmRlZmluZWQgb3IgaW4gYSBkaWZmZXJlbnQgc2VnbWVudCBpbgotICAgICB3aGljaCBjYXNlIGxpbmtlciBzY3JpcHRzIG1heSBwbGFjZSB0aGVtIGFueXdoZXJlLgotICAgICBIb3dldmVyLCB3ZSBjYW4ndCBmaW5pc2ggdGhlIGZyYWdtZW50IGhlcmUgYW5kIGVtaXQgdGhlIHJlbG9jIGFzIGluc24KLSAgICAgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBtYXkgbW92ZSB0aGUgaW5zbiBhYm91dC4gICovCi0KLSAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlZ21lbnQpCi0gICAgewotICAgICAgLyogVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQgaW4gdGhpcyBzZWdtZW50LgotCSBDaGFuZ2UgdGhlIHJlbGF4YXRpb24gc3VidHlwZSB0byB0aGUgbWF4IGFsbG93YWJsZSBhbmQgbGVhdmUKLQkgYWxsIGZ1cnRoZXIgaGFuZGxpbmcgdG8gbWRfY29udmVydF9mcmFnLiAgKi8KLSAgICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gMjsKLQotI2lmIDAgLyogQ2FuJ3QgdXNlIHRoaXMsIGJ1dCBsZWF2ZSBpbiBmb3IgaWxsdXN0cmF0aW9uLiAgKi8gICAgIAotICAgICAgLyogQ2hhbmdlIDE2IGJpdCBpbnNuIHRvIDMyIGJpdCBpbnNuLiAgKi8KLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMF0gfD0gMHg4MDsKLQotICAgICAgLyogSW5jcmVhc2Uga25vd24gKGZpeGVkKSBzaXplIG9mIGZyYWdtZW50LiAgKi8KLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLQotICAgICAgLyogQ3JlYXRlIGEgcmVsb2NhdGlvbiBmb3IgaXQuICAqLwotICAgICAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXgsIDQsCi0JICAgICAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEgLyogcGNyZWwgKi8sCi0JICAgICAgIC8qIEZJWE1FOiBDYW4ndCB1c2UgYSByZWFsIEJGRCByZWxvYyBoZXJlLgotCQkgIGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMgY2FuJ3QgaGFuZGxlIGl0LiAgKi8KLQkgICAgICAgQkZEX1JFTE9DX00zMlJfMjZfUENSRUwpOwotCi0gICAgICAvKiBNYXJrIHRoaXMgZnJhZ21lbnQgYXMgZmluaXNoZWQuICAqLwotICAgICAgZnJhZ193YW5lIChmcmFnUCk7Ci0jZWxzZQotICAgICAgewotCWNvbnN0IENHRU5fSU5TTiAqIGluc247Ci0JaW50ICAgICAgICAgICAgICAgaTsKLQotCS8qIFVwZGF0ZSB0aGUgcmVjb3JkZWQgaW5zbi4KLQkgICBGb3J0dW5hdGVseSB3ZSBkb24ndCBoYXZlIHRvIGxvb2sgdmVyeSBmYXIuCi0JICAgRklYTUU6IENoYW5nZSB0aGlzIHRvIHJlY29yZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gdGhlIG5leHQgaGlnaGVyCi0JICAgcmVsYXhhYmxlIGluc24gdG8gdXNlLiAgKi8KLQlmb3IgKGkgPSAwLCBpbnNuID0gZnJhZ1AtPmZyX2NnZW4uaW5zbjsgaSA8IDQ7IGkrKywgaW5zbisrKQotCSAgewotCSAgICBpZiAoKHN0cmNtcCAoQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSwKLQkJCSBDR0VOX0lOU05fTU5FTU9OSUMgKGZyYWdQLT5mcl9jZ2VuLmluc24pKQotCQkgPT0gMCkKLQkJJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9SRUxBWCkpCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0JaWYgKGkgPT0gNCkKLQkgIGFib3J0ICgpOwotCi0JZnJhZ1AtPmZyX2NnZW4uaW5zbiA9IGluc247Ci0JcmV0dXJuIDI7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgcmV0dXJuIChmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9mcl9maXgpOwotfSAKLQotLyogKmZyYWdQIGhhcyBiZWVuIHJlbGF4ZWQgdG8gaXRzIGZpbmFsIHNpemUsIGFuZCBub3cgbmVlZHMgdG8gaGF2ZQotICAgdGhlIGJ5dGVzIGluc2lkZSBpdCBtb2RpZmllZCB0byBjb25mb3JtIHRvIHRoZSBuZXcgc2l6ZS4KLQotICAgQ2FsbGVkIGFmdGVyIHJlbGF4YXRpb24gaXMgZmluaXNoZWQuCi0gICBmcmFnUC0+ZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudC4KLSAgIGZyYWdQLT5mcl9zdWJ0eXBlIGlzIHRoZSBzdWJ0eXBlIG9mIHdoYXQgdGhlIGFkZHJlc3MgcmVsYXhlZCB0by4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgYmZkICogICBhYmZkOwotICBzZWdUICAgIHNlYzsKLSAgZnJhZ1MgKiBmcmFnUDsKLXsKLSAgY2hhciAqIG9wY29kZTsKLSAgY2hhciAqIGRpc3BsYWNlbWVudDsKLSAgaW50ICAgIHRhcmdldF9hZGRyZXNzOwotICBpbnQgICAgb3Bjb2RlX2FkZHJlc3M7Ci0gIGludCAgICBleHRlbnNpb247Ci0gIGludCAgICBhZGRlbmQ7Ci0KLSAgb3Bjb2RlID0gZnJhZ1AtPmZyX29wY29kZTsKLQotICAvKiBBZGRyZXNzIG9wY29kZSByZXNpZGVzIGF0IGluIGZpbGUgc3BhY2UuICAqLwotICBvcGNvZGVfYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCAtIDI7Ci0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSAxIDoKLSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0gICAgICBkaXNwbGFjZW1lbnQgPSAmIG9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMiA6Ci0gICAgICBvcGNvZGVbMF0gfD0gMHg4MDsKLSAgICAgIGV4dGVuc2lvbiA9IDI7Ci0gICAgICBkaXNwbGFjZW1lbnQgPSAmIG9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMyA6Ci0gICAgICBvcGNvZGVbMl0gPSBvcGNvZGVbMF0gfCAweDgwOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChvcGNvZGUsIFBBUl9OT1BfSU5TTiwgMik7Ci0gICAgICBvcGNvZGVfYWRkcmVzcyArPSAyOwotICAgICAgZXh0ZW5zaW9uID0gNDsKLSAgICAgIGRpc3BsYWNlbWVudCA9ICYgb3Bjb2RlWzNdOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlYykKLSAgICB7Ci0gICAgICAvKiBzeW1ib2wgbXVzdCBiZSByZXNvbHZlZCBieSBsaW5rZXIgKi8KLSAgICAgIGlmIChmcmFnUC0+ZnJfb2Zmc2V0ICYgMykKLQlhc193YXJuIChfKCJBZGRlbmQgdG8gdW5yZXNvbHZlZCBzeW1ib2wgbm90IG9uIHdvcmQgYm91bmRhcnkuIikpOwotICAgICAgYWRkZW5kID0gZnJhZ1AtPmZyX29mZnNldCA+PiAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFkZHJlc3Mgd2Ugd2FudCB0byByZWFjaCBpbiBmaWxlIHNwYWNlLiAgKi8KLSAgICAgIHRhcmdldF9hZGRyZXNzID0gU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpICsgZnJhZ1AtPmZyX29mZnNldDsKLSAgICAgIHRhcmdldF9hZGRyZXNzICs9IGZyYWdQLT5mcl9zeW1ib2wtPnN5X2ZyYWctPmZyX2FkZHJlc3M7Ci0gICAgICBhZGRlbmQgPSAodGFyZ2V0X2FkZHJlc3MgLSAob3Bjb2RlX2FkZHJlc3MgJiAtNCkpID4+IDI7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhIHJlbG9jYXRpb24gZm9yIHN5bWJvbHMgdGhhdCBtdXN0IGJlIHJlc29sdmVkIGJ5IHRoZSBsaW5rZXIuCi0gICAgIE90aGVyd2lzZSBvdXRwdXQgdGhlIGNvbXBsZXRlZCBpbnNuLiAgKi8KLQotICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VjKQotICAgIHsKLSAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX3N1YnR5cGUgIT0gMSk7Ci0gICAgICBhc3NlcnQgKGZyYWdQLT5mcl9jZ2VuLmluc24gIT0gMCk7Ci0gICAgICBnYXNfY2dlbl9yZWNvcmRfZml4dXAgKGZyYWdQLAotCQkJICAgICAvKiBPZmZzZXQgb2YgYnJhbmNoIGluc24gaW4gZnJhZy4gICovCi0JCQkgICAgIGZyYWdQLT5mcl9maXggKyBleHRlbnNpb24gLSA0LAotCQkJICAgICBmcmFnUC0+ZnJfY2dlbi5pbnNuLAotCQkJICAgICA0IC8qbGVuZ3RoKi8sCi0JCQkgICAgIC8qIEZJWE1FOiBxdWljayBoYWNrICovCi0jaWYgMAotCQkJICAgICBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSAoZ2FzX2NnZW5fY3B1X2Rlc2MsCi0JCQkJCQkJIGZyYWdQLT5mcl9jZ2VuLm9waW5kZXgpLAotI2Vsc2UKLQkJCSAgICAgY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9udW0gKGdhc19jZ2VuX2NwdV9kZXNjLAotCQkJCQkJCSBNMzJSX09QRVJBTkRfRElTUDI0KSwKLSNlbmRpZgotCQkJICAgICBmcmFnUC0+ZnJfY2dlbi5vcGluZm8sCi0JCQkgICAgIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQpOwotICAgIH0KLQotI2RlZmluZSBTSVpFX0ZST01fUkVMQVhfU1RBVEUobikgKChuKSA9PSAxID8gMSA6IDMpCi0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChkaXNwbGFjZW1lbnQsICh2YWx1ZVQpIGFkZGVuZCwKLQkJICAgICAgU0laRV9GUk9NX1JFTEFYX1NUQVRFIChmcmFnUC0+ZnJfc3VidHlwZSkpOwotCi0gIGZyYWdQLT5mcl9maXggKz0gZXh0ZW5zaW9uOwotfQotDAotLyogRnVuY3Rpb25zIGNvbmNlcm5pbmcgcmVsb2NzLiAgKi8KLQotLyogVGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggYSBQQyByZWxhdGl2ZSBqdW1wIHNob3VsZCBiZSBjYWxjdWxhdGVkLAotICAgZ2l2ZW4gYSBQQyByZWxhdGl2ZSByZWxvYy4gICovCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4UCwgc2VjKQotICAgICBmaXhTICogZml4UDsKLSAgICAgc2VnVCAgIHNlYzsKLXsKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmICghIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JICB8fCBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gc2VjKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCAob3IgaXMgZGVmaW5lZCBidXQgbm90IGluIHRoaXMgc2VjdGlvbikuCi0JIExldCB0aGUgbGlua2VyIGZpZ3VyZSBpdCBvdXQuICAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAoZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlKSAmIC00TDsKLX0KLQotLyogUmV0dXJuIHRoZSBiZmQgcmVsb2MgdHlwZSBmb3IgT1BFUkFORCBvZiBJTlNOIGF0IGZpeHVwIEZJWFAuCi0gICBSZXR1cm5zIEJGRF9SRUxPQ19OT05FIGlmIG5vIHJlbG9jIHR5cGUgY2FuIGJlIGZvdW5kLgotICAgKkZJWFAgbWF5IGJlIG1vZGlmaWVkIGlmIGRlc2lyZWQuICAqLwotCi1iZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLW1kX2NnZW5fbG9va3VwX3JlbG9jIChpbnNuLCBvcGVyYW5kLCBmaXhQKQotICAgICBjb25zdCBDR0VOX0lOU04gKiAgICBpbnNuOwotICAgICBjb25zdCBDR0VOX09QRVJBTkQgKiBvcGVyYW5kOwotICAgICBmaXhTICogICAgICAgICAgICAgICBmaXhQOwotewotICBzd2l0Y2ggKG9wZXJhbmQtPnR5cGUpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDogcmV0dXJuICBCRkRfUkVMT0NfTTMyUl8xMF9QQ1JFTDsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOiByZXR1cm4gQkZEX1JFTE9DX00zMlJfMThfUENSRUw7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDogcmV0dXJuIEJGRF9SRUxPQ19NMzJSXzI2X1BDUkVMOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6IHJldHVybiBCRkRfUkVMT0NfTTMyUl8yNDsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgLyogSWYgbG93L2hpZ2gvc2hpZ2gvc2RhIHdhcyB1c2VkLCBpdCBpcyByZWNvcmRlZCBpbiBgb3BpbmZvJy4gICovCi0gICAgICBpZiAoZml4UC0+ZnhfY2dlbi5vcGluZm8gIT0gMCkKLQlyZXR1cm4gZml4UC0+ZnhfY2dlbi5vcGluZm87Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDogLyogYXZvaWQgLVdhbGwgd2FybmluZyAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gQkZEX1JFTE9DX05PTkU7Ci19Ci0KLS8qIFJlY29yZCBhIEhJMTYgcmVsb2MgZm9yIGxhdGVyIG1hdGNoaW5nIHdpdGggaXRzIExPMTYgY291c2luLiAgKi8KLQotc3RhdGljIHZvaWQKLW0zMnJfcmVjb3JkX2hpMTYgKHJlbG9jX3R5cGUsIGZpeFAsIHNlZykKLSAgICAgaW50ICAgIHJlbG9jX3R5cGU7Ci0gICAgIGZpeFMgKiBmaXhQOwotICAgICBzZWdUICAgc2VnOwotewotICBzdHJ1Y3QgbTMycl9oaV9maXh1cCAqIGhpX2ZpeHVwOwotCi0gIGFzc2VydCAocmVsb2NfdHlwZSA9PSBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTwotCSAgfHwgcmVsb2NfdHlwZSA9PSBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTyk7Ci0KLSAgaGlfZml4dXAgPSAoKHN0cnVjdCBtMzJyX2hpX2ZpeHVwICopCi0JICAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbTMycl9oaV9maXh1cCkpKTsKLSAgaGlfZml4dXAtPmZpeHAgPSBmaXhQOwotICBoaV9maXh1cC0+c2VnICA9IG5vd19zZWc7Ci0gIGhpX2ZpeHVwLT5uZXh0ID0gbTMycl9oaV9maXh1cF9saXN0OwotICAKLSAgbTMycl9oaV9maXh1cF9saXN0ID0gaGlfZml4dXA7Ci19Ci0KLS8qIENhbGxlZCB3aGlsZSBwYXJzaW5nIGFuIGluc3RydWN0aW9uIHRvIGNyZWF0ZSBhIGZpeHVwLgotICAgV2UgbmVlZCB0byBjaGVjayBmb3IgSEkxNiByZWxvY3MgYW5kIHF1ZXVlIHRoZW0gdXAgZm9yIGxhdGVyIHNvcnRpbmcuICAqLwotCi1maXhTICoKLW0zMnJfY2dlbl9yZWNvcmRfZml4dXBfZXhwIChmcmFnLCB3aGVyZSwgaW5zbiwgbGVuZ3RoLCBvcGVyYW5kLCBvcGluZm8sIGV4cCkKLSAgICAgZnJhZ1MgKiAgICAgICAgICAgICAgZnJhZzsKLSAgICAgaW50ICAgICAgICAgICAgICAgICAgd2hlcmU7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqICAgIGluc247Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLSAgICAgY29uc3QgQ0dFTl9PUEVSQU5EICogb3BlcmFuZDsKLSAgICAgaW50ICAgICAgICAgICAgICAgICAgb3BpbmZvOwotICAgICBleHByZXNzaW9uUyAqICAgICAgICBleHA7Ci17Ci0gIGZpeFMgKiBmaXhQID0gZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCAoZnJhZywgd2hlcmUsIGluc24sIGxlbmd0aCwKLQkJCQkJICAgb3BlcmFuZCwgb3BpbmZvLCBleHApOwotCi0gIHN3aXRjaCAob3BlcmFuZC0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICAvKiBJZiBsb3cvaGlnaC9zaGlnaC9zZGEgd2FzIHVzZWQsIGl0IGlzIHJlY29yZGVkIGluIGBvcGluZm8nLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9jZ2VuLm9waW5mbyA9PSBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTwotCSAgfHwgZml4UC0+ZnhfY2dlbi5vcGluZm8gPT0gQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8pCi0JbTMycl9yZWNvcmRfaGkxNiAoZml4UC0+ZnhfY2dlbi5vcGluZm8sIGZpeFAsIG5vd19zZWcpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6IC8qIGF2b2lkIC1XYWxsIHdhcm5pbmcgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gZml4UDsKLX0KLQotLyogUmV0dXJuIEJGRCByZWxvYyB0eXBlIGZyb20gb3BpbmZvIGZpZWxkIGluIGEgZml4Uy4KLSAgIEl0J3MgdHJpY2t5IHVzaW5nIGZ4X3JfdHlwZSBpbiBtMzJyX2Zyb2JfZmlsZSBiZWNhdXNlIHRoZSB2YWx1ZXMKLSAgIGFyZSBCRkRfUkVMT0NfVU5VU0VEICsgb3BlcmFuZCBudW1iZXIuICAqLwotI2RlZmluZSBGWF9PUElORk9fUl9UWVBFKGYpICgoZiktPmZ4X2NnZW4ub3BpbmZvKQotCi0vKiBTb3J0IGFueSB1bm1hdGNoZWQgSEkxNiByZWxvY3Mgc28gdGhhdCB0aGV5IGltbWVkaWF0ZWx5IHByZWNlZGUKLSAgIHRoZSBjb3JyZXNwb25kaW5nIExPMTYgcmVsb2MuICBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgbWRfYXBwbHlfZml4IGFuZAotICAgdGNfZ2VuX3JlbG9jLiAgKi8KLQotdm9pZAotbTMycl9mcm9iX2ZpbGUgKCkKLXsKLSAgc3RydWN0IG0zMnJfaGlfZml4dXAgKiBsOwotCi0gIGZvciAobCA9IG0zMnJfaGlfZml4dXBfbGlzdDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzZWdtZW50X2luZm9fdHlwZSAqIHNlZ2luZm87Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgIHBhc3M7Ci0KLSAgICAgIGFzc2VydCAoRlhfT1BJTkZPX1JfVFlQRSAobC0+Zml4cCkgPT0gQkZEX1JFTE9DX00zMlJfSEkxNl9TTE8KLQkgICAgICB8fCBGWF9PUElORk9fUl9UWVBFIChsLT5maXhwKSA9PSBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTyk7Ci0KLSAgICAgIC8qIENoZWNrIHF1aWNrbHkgd2hldGhlciB0aGUgbmV4dCBmaXh1cCBoYXBwZW5zIHRvIGJlIGEgbWF0Y2hpbmcgbG93LiAgKi8KLSAgICAgIGlmIChsLT5maXhwLT5meF9uZXh0ICE9IE5VTEwKLQkgICYmIEZYX09QSU5GT19SX1RZUEUgKGwtPmZpeHAtPmZ4X25leHQpID09IEJGRF9SRUxPQ19NMzJSX0xPMTYKLQkgICYmIGwtPmZpeHAtPmZ4X2FkZHN5ID09IGwtPmZpeHAtPmZ4X25leHQtPmZ4X2FkZHN5Ci0JICAmJiBsLT5maXhwLT5meF9vZmZzZXQgPT0gbC0+Zml4cC0+ZnhfbmV4dC0+Znhfb2Zmc2V0KQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBMb29rIHRocm91Z2ggdGhlIGZpeHVwcyBmb3IgdGhpcyBzZWdtZW50IGZvciBhIG1hdGNoaW5nIGBsb3cnLgotICAgICAgICAgV2hlbiB3ZSBmaW5kIG9uZSwgbW92ZSB0aGUgaGlnaC9zaGlnaCBqdXN0IGluIGZyb250IG9mIGl0LiAgV2UgZG8KLSAgICAgICAgIHRoaXMgaW4gdHdvIHBhc3Nlcy4gIEluIHRoZSBmaXJzdCBwYXNzLCB3ZSB0cnkgdG8gZmluZCBhCi0gICAgICAgICB1bmlxdWUgYGxvdycuICBJbiB0aGUgc2Vjb25kIHBhc3MsIHdlIHBlcm1pdCBtdWx0aXBsZSBoaWdoJ3MKLSAgICAgICAgIHJlbG9jcyBmb3IgYSBzaW5nbGUgYGxvdycuICAqLwotICAgICAgc2VnaW5mbyA9IHNlZ19pbmZvIChsLT5zZWcpOwotICAgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IDI7IHBhc3MrKykKLQl7Ci0JICBmaXhTICogZjsKLQkgIGZpeFMgKiBwcmV2OwotCi0JICBwcmV2ID0gTlVMTDsKLQkgIGZvciAoZiA9IHNlZ2luZm8tPmZpeF9yb290OyBmICE9IE5VTEw7IGYgPSBmLT5meF9uZXh0KQotCSAgICB7Ci0JICAgICAgLyogQ2hlY2sgd2hldGhlciB0aGlzIGlzIGEgYGxvdycgZml4dXAgd2hpY2ggbWF0Y2hlcyBsLT5maXhwLiAgKi8KLQkgICAgICBpZiAoRlhfT1BJTkZPX1JfVFlQRSAoZikgPT0gQkZEX1JFTE9DX00zMlJfTE8xNgotCQkgICYmIGYtPmZ4X2FkZHN5ID09IGwtPmZpeHAtPmZ4X2FkZHN5Ci0JCSAgJiYgZi0+Znhfb2Zmc2V0ID09IGwtPmZpeHAtPmZ4X29mZnNldAotCQkgICYmIChwYXNzID09IDEKLQkJICAgICAgfHwgcHJldiA9PSBOVUxMCi0JCSAgICAgIHx8IChGWF9PUElORk9fUl9UWVBFIChwcmV2KSAhPSBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTwotCQkJICAmJiBGWF9PUElORk9fUl9UWVBFIChwcmV2KSAhPSBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTykKLQkJICAgICAgfHwgcHJldi0+ZnhfYWRkc3kgIT0gZi0+ZnhfYWRkc3kKLQkJICAgICAgfHwgcHJldi0+Znhfb2Zmc2V0ICE9ICBmLT5meF9vZmZzZXQpKQotCQl7Ci0JCSAgZml4UyAqKiBwZjsKLQotCQkgIC8qIE1vdmUgbC0+Zml4cCBiZWZvcmUgZi4gICovCi0JCSAgZm9yIChwZiA9ICZzZWdpbmZvLT5maXhfcm9vdDsKLQkJICAgICAgICogcGYgIT0gbC0+Zml4cDsKLQkJICAgICAgIHBmID0gJiAoKiBwZiktPmZ4X25leHQpCi0JCSAgICBhc3NlcnQgKCogcGYgIT0gTlVMTCk7Ci0KLQkJICAqIHBmID0gbC0+Zml4cC0+ZnhfbmV4dDsKLQotCQkgIGwtPmZpeHAtPmZ4X25leHQgPSBmOwotCQkgIGlmIChwcmV2ID09IE5VTEwpCi0JCSAgICBzZWdpbmZvLT5maXhfcm9vdCA9IGwtPmZpeHA7Ci0JCSAgZWxzZQotCQkgICAgcHJldi0+ZnhfbmV4dCA9IGwtPmZpeHA7Ci0KLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgcHJldiA9IGY7Ci0JICAgIH0KLQotCSAgaWYgKGYgIT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmIChwYXNzID09IDEKLQkgICAgICAmJiB3YXJuX3VubWF0Y2hlZF9oaWdoKQotCSAgICBhc193YXJuX3doZXJlIChsLT5maXhwLT5meF9maWxlLCBsLT5maXhwLT5meF9saW5lLAotCQkJICAgXygiVW5tYXRjaGVkIGhpZ2gvc2hpZ2ggcmVsb2MiKSk7Ci0JfQotICAgIH0KLX0KLQotLyogU2VlIHdoZXRoZXIgd2UgbmVlZCB0byBmb3JjZSBhIHJlbG9jYXRpb24gaW50byB0aGUgb3V0cHV0IGZpbGUuCi0gICBUaGlzIGlzIHVzZWQgdG8gZm9yY2Ugb3V0IHN3aXRjaCBhbmQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMgd2hlbgotICAgcmVsYXhpbmcuICAqLwotCi1pbnQKLW0zMnJfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotICAgICBmaXhTICogZml4OwotewotICBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotCi0gIGlmICghIG0zMnJfcmVsYXgpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIChmaXgtPmZ4X3BjcmVsCi0JICB8fCAwIC8qID8/PyAqLyk7Ci19Ci0MCi0vKiBXcml0ZSBhIHZhbHVlIG91dCB0byB0aGUgb2JqZWN0IGZpbGUsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBlbmRpYW5uZXNzLiAgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqIGJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50ICAgIG47Ci17Ci0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci0gIGVsc2UKLSAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSovCi0KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCAgICAgICAgICAgICAgaTsKLSAgaW50ICAgICAgICAgICAgICBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSAgIHdvcmRzIFtNQVhfTElUVExFTlVNU107Ci0gIGNoYXIgKiAgICAgICAgICAgdDsKLSAgY2hhciAqICAgICAgICAgICBhdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgIC8qIEZJWE1FOiBTb21lIHRhcmdldHMgYWxsb3cgb3RoZXIgZm9ybWF0IGNoYXJzIGZvciBiaWdnZXIgc2l6ZXMgaGVyZS4gICovCi0KLSAgICBkZWZhdWx0OgotICAgICAgKiBzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gbWRfYXRvZigpIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqIHNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCi0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sCi0JCQkgICAgICBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwKLQkJCSAgICAgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0JfQotICAgIH0KLSAgICAgCi0gIHJldHVybiAwOwotfQotCi12b2lkCi1tMzJyX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpCi17Ci0gIC8qIElmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIGEgc2VjdGlvbiBhbmQgd2UgaGF2ZSBqdXN0IGVtaXR0ZWQgYQotICAgICAxNiBiaXQgaW5zbiwgdGhlbiBlbWl0IGEgbm9wIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZWN0aW9uIGVuZHMgb24KLSAgICAgYSAzMiBiaXQgYm91bmRhcnkuICAqLwotICAKLSAgaWYgKHByZXZfaW5zbi5pbnNuIHx8IHNlZW5fcmVsYXhhYmxlX3ApCi0gICAgKHZvaWQpIG0zMnJfZmlsbF9pbnNuICgwKTsKLX0KLQotYm9vbGVhbgotbTMycl9maXhfYWRqdXN0YWJsZSAoZml4UCkKLSAgIGZpeFMgKmZpeFA7Ci17Ci0KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0gIAotICAvKiBQcmV2ZW50IGFsbCBhZGp1c3RtZW50cyB0byBnbG9iYWwgc3ltYm9scy4gKi8KLSAgaWYgKFNfSVNfRVhURVJOIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgCi0gIC8qIFdlIG5lZWQgdGhlIHN5bWJvbCBuYW1lIGZvciB0aGUgVlRBQkxFIGVudHJpZXMgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tMzJyLmggYi9nYXMvY29uZmlnL3RjLW0zMnIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjZmNhMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW0zMnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKiB0Yy1tMzJyLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLW0zMnIuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIFRDX00zMlIKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0vKiBsZWFkaW5nIHNwYWNlIHNvIHdpbGwgY29tcGlsZSB3aXRoIGNjICovCi0gI2Vycm9yIE0zMlIgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCi0jZW5kaWYKLQotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiTTMyUiBHQVMgIgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9tMzJyCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItbTMyciIKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLS8qIGNhbGwgbWRfcGNyZWxfZnJvbV9zZWN0aW9uLCBub3QgbWRfcGNyZWxfZnJvbSAqLwotbG9uZyBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzZWdUKSk7Ci0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbihGSVhQLCBTRUMpICAgCi0KLS8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jZGVmaW5lIERJRkZfRVhQUl9PSwkJLyogLi1mb28gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLQotLyogV2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgLndvcmQgc3RyYW5nZWx5LiAgKi8KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0vKiBGb3IgOCB2cyAxNiB2cyAzMiBiaXQgYnJhbmNoIHNlbGVjdGlvbi4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotI2lmIDAKLWV4dGVybiB2b2lkIG0zMnJfcHJlcGFyZV9yZWxheF9zY2FuICgpOwotI2RlZmluZSBtZF9wcmVwYXJlX3JlbGF4X3NjYW4oZnJhZ1AsIGFkZHJlc3MsIGFpbSwgdGhpc19zdGF0ZSwgdGhpc190eXBlKSBcCi1tMzJyX3ByZXBhcmVfcmVsYXhfc2NhbiAoZnJhZ1AsIGFkZHJlc3MsIGFpbSwgdGhpc19zdGF0ZSwgdGhpc190eXBlKQotI2Vsc2UKLWV4dGVybiBsb25nIG0zMnJfcmVsYXhfZnJhZyBQQVJBTVMgKChmcmFnUyAqLCBsb25nKSk7Ci0jZGVmaW5lIG1kX3JlbGF4X2ZyYWcoZnJhZ1AsIHN0cmV0Y2gpIFwKLW0zMnJfcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpCi0jZW5kaWYKLS8qIEFjY291bnQgZm9yIG5vcCBpZiAzMiBiaXQgaW5zbiBmYWxscyBvbiBvZGQgaGFsZndvcmQgYm91bmRhcnkuICAqLwotI2RlZmluZSBUQ19DR0VOX01BWF9SRUxBWChpbnNuLCBsZW4pICg2KQotCi0vKiBBbGlnbm1lbnRzIGFyZSB1c2VkIHRvIGVuc3VyZSAzMiBiaXQgaW5zbnMgbGl2ZSBvbiAzMiBiaXQgYm91bmRhcmllcywgc28KLSAgIHdlIHVzZSBhIHNwZWNpYWwgYWxpZ25tZW50IGZ1bmN0aW9uIHRvIGluc2VydCB0aGUgY29ycmVjdCBub3AgcGF0dGVybi4gICovCi1leHRlcm4gaW50IG0zMnJfZG9fYWxpZ24gUEFSQU1TICgoaW50LCBjb25zdCBjaGFyICosIGludCwgaW50KSk7Ci0jZGVmaW5lIG1kX2RvX2FsaWduKG4sIGZpbGwsIGxlbiwgbWF4LCBsKSBcCi1pZiAobTMycl9kb19hbGlnbiAobiwgZmlsbCwgbGVuLCBtYXgpKSBnb3RvIGwKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0jZGVmaW5lIG1kX2FwcGx5X2ZpeDMgZ2FzX2NnZW5fbWRfYXBwbHlfZml4MwotCi0jZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSBtMzJyX2ZpeF9hZGp1c3RhYmxlKGZpeFApCi0KLS8qIEFmdGVyIGNyZWF0aW5nIGEgZml4dXAgZm9yIGFuIGluc3RydWN0aW9uIG9wZXJhbmQsIHdlIG5lZWQgdG8gY2hlY2sgZm9yCi0gICBISTE2IHJlbG9jcyBhbmQgcXVldWUgdGhlbSB1cCBmb3IgbGF0ZXIgc29ydGluZy4gICovCi0jZGVmaW5lIG1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCBtMzJyX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cAotCi0jZGVmaW5lIFRDX0hBTkRMRVNfRlhfRE9ORQotCi0jZGVmaW5lIHRjX2dlbl9yZWxvYyBnYXNfY2dlbl90Y19nZW5fcmVsb2MKLQotI2RlZmluZSB0Y19mcm9iX2ZpbGUoKSBtMzJyX2Zyb2JfZmlsZSAoKQotZXh0ZXJuIHZvaWQgbTMycl9mcm9iX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotCi0vKiBXaGVuIHJlbGF4aW5nLCB3ZSBuZWVkIHRvIGVtaXQgdmFyaW91cyByZWxvY3Mgd2Ugb3RoZXJ3aXNlIHdvdWxkbid0LiAgKi8KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXgpIG0zMnJfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotZXh0ZXJuIGludCBtMzJyX2ZvcmNlX3JlbG9jYXRpb24gKCk7Ci0KLS8qIEVuc3VyZSBpbnNucyBhdCBsYWJlbHMgYXJlIGFsaWduZWQgdG8gMzIgYml0IGJvdW5kYXJpZXMuICAqLwotaW50IG0zMnJfZmlsbF9pbnNuIFBBUkFNUyAoKGludCkpOwotI2RlZmluZSBtZF9hZnRlcl9wYXNzX2hvb2soKQltMzJyX2ZpbGxfaW5zbiAoMSkKLSNkZWZpbmUgVENfU1RBUlRfTEFCRUwoY2gsIHB0cikJKGNoID09ICc6JyAmJiBtMzJyX2ZpbGxfaW5zbiAoMCkpCi0KLS8qIEFkZCBleHRyYSBNMzJSIHNlY3Rpb25zLiAgKi8KLSNkZWZpbmUgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMgXAotICB7ICIuc2RhdGEiLAkJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgfSwgXAotICB7ICIuc2JzcyIsCQlTSFRfTk9CSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgfSwKLQotI2RlZmluZSBtZF9jbGVhbnVwICAgICAgICAgICAgICAgICBtMzJyX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0jZGVmaW5lIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rIG0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sKLWV4dGVybiB2b2lkIG0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7ICAgIApkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tNjg4NTEuaCBiL2dhcy9jb25maWcvdGMtbTY4ODUxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNmQ3NDEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tNjg4NTEuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtbTY4ODUxLmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0gICAKLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0gICAKLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIHBtbXUuaAotICovCi0KLS8qIEkgc3VwcG9zZSB3ZSBoYXZlIHRvIGNvcHlyaWdodCB0aGlzIGZpbGUuICBTb21lb25lIG9uIHRoZSBuZXQgc2VudCBpdAotICAgdG8gdXMgYXMgcGFydCBvZiB0aGUgY2hhbmdlcyBmb3IgdGhlIG02ODg1MSBNZW1vcnkgTWFuYWdlbWVudCBVbml0ICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk4NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR2FzLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgVGhlIEdOVSBhc3NlbWJsZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0gICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWS4gIE5vIGF1dGhvciBvciBkaXN0cmlidXRvcgotICAgYWNjZXB0cyByZXNwb25zaWJpbGl0eSB0byBhbnlvbmUgZm9yIHRoZSBjb25zZXF1ZW5jZXMgb2YgdXNpbmcgaXQKLSAgIG9yIGZvciB3aGV0aGVyIGl0IHNlcnZlcyBhbnkgcGFydGljdWxhciBwdXJwb3NlIG9yIHdvcmtzIGF0IGFsbCwKLSAgIHVubGVzcyBoZSBzYXlzIHNvIGluIHdyaXRpbmcuICBSZWZlciB0byB0aGUgR05VIEFzc2VtYmxlciBHZW5lcmFsCi0gICBQdWJsaWMgTGljZW5zZSBmb3IgZnVsbCBkZXRhaWxzLgotICAgCi0gICBFdmVyeW9uZSBpcyBncmFudGVkIHBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUKLSAgIHRoZSBHTlUgQXNzZW1ibGVyLCBidXQgb25seSB1bmRlciB0aGUgY29uZGl0aW9ucyBkZXNjcmliZWQgaW4gdGhlCi0gICBHTlUgQXNzZW1ibGVyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBIGNvcHkgb2YgdGhpcyBsaWNlbnNlIGlzCi0gICBzdXBwb3NlZCB0byBoYXZlIGJlZW4gZ2l2ZW4gdG8geW91IGFsb25nIHdpdGggdGhlIEdOVSBBc3NlbWJsZXIKLSAgIHNvIHlvdSBjYW4ga25vdyB5b3VyIHJpZ2h0cyBhbmQgcmVzcG9uc2liaWxpdGllcy4gIEl0IHNob3VsZCBiZQotICAgaW4gYSBmaWxlIG5hbWVkIENPUFlJTkcuICBBbW9uZyBvdGhlciB0aGluZ3MsIHRoZSBjb3B5cmlnaHQKLSAgIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgbXVzdCBiZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4gICovCi0KLSNpZmRlZiBtNjg4NTEKLQotLyoKLSAgSSBkaWRuJ3QgdXNlIG11Y2ggaW1hZ2luYXRpb24gaW4gY2hvb3NpbmcgdGhlIAotICBmb2xsb3dpbmcgY29kZXMsIHNvIG1hbnkgb2YgdGhlbSBhcmVuJ3QgdmVyeQotICBtbmVtb25pYy4gLXJhYgotICAKLSAgUCAgcG1tdSByZWdpc3RlcgotICBQb3NzaWJsZSB2YWx1ZXM6Ci0gIDAwMAlUQwlUcmFuc2xhdGlvbiBDb250cm9sIHJlZwotICAxMDAJQ0FMCUN1cnJlbnQgQWNjZXNzIExldmVsCi0gIDEwMQlWQUwJVmFsaWRhdGUgQWNjZXNzIExldmVsCi0gIDExMAlTQ0MJU3RhY2sgQ2hhbmdlIENvbnRyb2wKLSAgMTExCUFDCUFjY2VzcyBDb250cm9sCi0gIAotICBXICB3aWRlIHBtbXUgcmVnaXN0ZXJzCi0gIFBvc3NpYmxlIHZhbHVlczoKLSAgMDAxCURSUAlEbWEgUm9vdCBQb2ludGVyCi0gIDAxMAlTUlAJU3VwZXJ2aXNvciBSb290IFBvaW50ZXIKLSAgMDExCUNSUAlDcHUgUm9vdCBQb2ludGVyCi0gIAotICBmCWZ1bmN0aW9uIGNvZGUgcmVnaXN0ZXIKLSAgMAlTRkMKLSAgMQlERkMKLSAgCi0gIFYJVkFMIHJlZ2lzdGVyIG9ubHkKLSAgCi0gIFgJQkFEeCwgQkFDeAotICAxMDAJQkFECUJyZWFrcG9pbnQgQWNrbm93bGVkZ2UgRGF0YQotICAxMDEJQkFDCUJyZWFrcG9pbnQgQWNrbm93bGVkZ2UgQ29udHJvbAotICAKLSAgWQlQU1IKLSAgWglQQ1NSCi0gIAotICB8CW1lbW9yeSAJCShtb2RlcyAyLTYsIDcuKikKLSAgCi0gICovCi0KLS8qCi0gKiB0aGVzZSBkZWZpbmVzIHNob3VsZCBiZSBpbiBtNjhrLmMgYnV0Ci0gKiBpIHB1dCB0aGVtIGhlcmUgdG8ga2VlcCBhbGwgdGhlIG02ODg1MSBzdHVmZgotICogdG9nZXRoZXIgLXJhYgotICogSkYtLU1ha2Ugc3VyZSB0aGVzZSAjcyBkb24ndCBjbGFzaCB3aXRoIHRoZSBvbmVzIGluIG02OGsuYwotICogVGhhdCB3b3VsZCBiZSBCQUQuCi0gKi8KLSNkZWZpbmUgVEMJKEZQUysxKQkJLyogNDggKi8KLSNkZWZpbmUgRFJQCShUQysxKQkJLyogNDkgKi8KLSNkZWZpbmUgU1JQCShEUlArMSkJCS8qIDUwICovCi0jZGVmaW5lIENSUAkoU1JQKzEpCQkvKiA1MSAqLwotI2RlZmluZSBDQUwJKENSUCsxKQkJLyogNTIgKi8KLSNkZWZpbmUgVkFMCShDQUwrMSkJCS8qIDUzICovCi0jZGVmaW5lIFNDQwkoVkFMKzEpCQkvKiA1NCAqLwotI2RlZmluZSBBQwkoU0NDKzEpCQkvKiA1NSAqLwotI2RlZmluZSBCQUQJKEFDKzEpCQkvKiA1Niw1Nyw1OCw1OSwgNjAsNjEsNjIsNjMgKi8KLSNkZWZpbmUgQkFDCShCQUQrOCkJCS8qIDY0LDY1LDY2LDY3LCA2OCw2OSw3MCw3MSAqLwotI2RlZmluZSBQU1IJKEJBQys4KQkJLyogNzIgKi8KLSNkZWZpbmUgUENTUgkoUFNSKzEpCQkvKiA3MyAqLwotCi0vKiBuYW1lICovCS8qIG9wY29kZSAqLwkJLyogbWF0Y2ggKi8JCS8qIGFyZ3MgKi8KLQoteyJwYmFjIiwJb25lKDB4ZjBjNyksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmFjdyIsCW9uZSgweGYwODcpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJhcyIsCW9uZSgweGYwYzYpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJhc3ciLAlvbmUoMHhmMDg2KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiYmMiLAlvbmUoMHhmMGMxKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiYmN3IiwJb25lKDB4ZjA4MSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmJzIiwJb25lKDB4ZjBjMCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmJzdyIsCW9uZSgweGYwODApLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJjYyIsCW9uZSgweGYwY2YpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJjY3ciLAlvbmUoMHhmMDhmKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiY3MiLAlvbmUoMHhmMGNlKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiY3N3IiwJb25lKDB4ZjA4ZSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmdjIiwJb25lKDB4ZjBjZCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmdjdyIsCW9uZSgweGYwOGQpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJncyIsCW9uZSgweGYwY2MpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJnc3ciLAlvbmUoMHhmMDhjKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiaWMiLAlvbmUoMHhmMGNiKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiaWN3IiwJb25lKDB4ZjA4YiksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmlzIiwJb25lKDB4ZjBjYSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmlzdyIsCW9uZSgweGYwOGEpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJsYyIsCW9uZSgweGYwYzMpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJsY3ciLAlvbmUoMHhmMDgzKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBibHMiLAlvbmUoMHhmMGMyKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBibHN3IiwJb25lKDB4ZjA4MiksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYnNjIiwJb25lKDB4ZjBjNSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYnNjdyIsCW9uZSgweGYwODUpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJzcyIsCW9uZSgweGYwYzQpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJzc3ciLAlvbmUoMHhmMDg0KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBid2MiLAlvbmUoMHhmMGM5KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBid2N3IiwJb25lKDB4ZjA4OSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYndzIiwJb25lKDB4ZjBjOCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYndzdyIsCW9uZSgweGYwODgpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLSAgICAKLSAgICAKLXsicGRiYWMiLAl0d28oMHhmMDQ4LCAweDAwMDcpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJhcyIsCXR3bygweGYwNDgsIDB4MDAwNiksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmJjIiwJdHdvKDB4ZjA0OCwgMHgwMDAxKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiYnMiLAl0d28oMHhmMDQ4LCAweDAwMDApLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJjYyIsCXR3bygweGYwNDgsIDB4MDAwZiksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmNzIiwJdHdvKDB4ZjA0OCwgMHgwMDBlKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiZ2MiLAl0d28oMHhmMDQ4LCAweDAwMGQpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJncyIsCXR3bygweGYwNDgsIDB4MDAwYyksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmljIiwJdHdvKDB4ZjA0OCwgMHgwMDBiKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiaXMiLAl0d28oMHhmMDQ4LCAweDAwMGEpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJsYyIsCXR3bygweGYwNDgsIDB4MDAwMyksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmxzIiwJdHdvKDB4ZjA0OCwgMHgwMDAyKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRic2MiLAl0d28oMHhmMDQ4LCAweDAwMDUpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJzcyIsCXR3bygweGYwNDgsIDB4MDAwNCksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYndjIiwJdHdvKDB4ZjA0OCwgMHgwMDA5KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRid3MiLAl0d28oMHhmMDQ4LCAweDAwMDgpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAotICAgIAoteyJwZmx1c2hhIiwJdHdvKDB4ZjAwMCwgMHgyNDAwKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiIgfSwKLSAgICAKLXsicGZsdXNoIiwJdHdvKDB4ZjAwMCwgMHgzMDEwKSwJdHdvKDB4ZmZjMCwgMHhmZTEwKSwJIlQzVDkiIH0sCi17InBmbHVzaCIsCXR3bygweGYwMDAsIDB4MzgxMCksCXR3bygweGZmYzAsIDB4ZmUxMCksCSJUM1Q5JnMiIH0sCi17InBmbHVzaCIsCXR3bygweGYwMDAsIDB4MzAwOCksCXR3bygweGZmYzAsIDB4ZmUxOCksCSJEM1Q5IiB9LAoteyJwZmx1c2giLAl0d28oMHhmMDAwLCAweDM4MDgpLAl0d28oMHhmZmMwLCAweGZlMTgpLAkiRDNUOSZzIiB9LAoteyJwZmx1c2giLAl0d28oMHhmMDAwLCAweDMwMDApLAl0d28oMHhmZmMwLCAweGZlMWUpLAkiZjNUOSIgfSwKLXsicGZsdXNoIiwJdHdvKDB4ZjAwMCwgMHgzODAwKSwJdHdvKDB4ZmZjMCwgMHhmZTFlKSwJImYzVDkmcyIgfSwKLSAgICAKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQxMCksCXR3bygweGZmZjgsIDB4ZmUxMCksCSJUM1Q5IiB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzAwKSwJdHdvKDB4ZmZmOCwgMHhmZTAwKSwJIlQzVDkmcyIgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQwOCksCXR3bygweGZmZjgsIDB4ZmUxOCksCSJEM1Q5IiB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzA4KSwJdHdvKDB4ZmZmOCwgMHhmZTE4KSwJIkQzVDkmcyIgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQwMCksCXR3bygweGZmZjgsIDB4ZmUxZSksCSJmM1Q5IiB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzAwKSwJdHdvKDB4ZmZmOCwgMHhmZTFlKSwJImYzVDkmcyJ9LAotICAgIAoteyJwZmx1c2hyIiwJdHdvKDB4ZjAwMCwgMHhhMDAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJInxzIiB9LAotICAgIAoteyJwbG9hZHIiLAl0d28oMHhmMDAwLCAweDIyMTApLAl0d28oMHhmZmMwLCAweGZmZjApLAkiVDMmcyIgfSwKLXsicGxvYWRyIiwJdHdvKDB4ZjAwMCwgMHgyMjA4KSwJdHdvKDB4ZmZjMCwgMHhmZmY4KSwJIkQzJnMiIH0sCi17InBsb2FkciIsCXR3bygweGYwMDAsIDB4MjIwMCksCXR3bygweGZmYzAsIDB4ZmZmZSksCSJmMyZzIiB9LAoteyJwbG9hZHciLAl0d28oMHhmMDAwLCAweDIwMTApLAl0d28oMHhmZmMwLCAweGZmZjApLAkiVDMmcyIgfSwKLXsicGxvYWR3IiwJdHdvKDB4ZjAwMCwgMHgyMDA4KSwJdHdvKDB4ZmZjMCwgMHhmZmY4KSwJIkQzJnMiIH0sCi17InBsb2FkdyIsCXR3bygweGYwMDAsIDB4MjAwMCksCXR3bygweGZmYzAsIDB4ZmZmZSksCSJmMyZzIiB9LAotICAgIAotICAgIC8qIFRDLCBDUlAsIERSUCwgU1JQLCBDQUwsIFZBTCwgU0NDLCBBQyAqLwoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NDAwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksCSIqc1A4IiB9LAoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NDIwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksCSJQOCVzIiB9LAoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NDAwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksCSJ8c1c4IiB9LAoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NDIwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksCSJXOH5zIiB9LAotICAgIAotICAgIC8qIEJBRHgsIEJBQ3ggKi8KLXsicG1vdmUiLAl0d28oMHhmMDAwLCAweDYyMDApLAl0d28oMHhmZmMwLCAweGUzZTMpLAkiKnNYMyIgfSwKLXsicG1vdmUiLAl0d28oMHhmMDAwLCAweDYwMDApLAl0d28oMHhmZmMwLCAweGUzZTMpLAkiWDMlcyIgfSwKLSAgICAKLSAgICAvKiBQU1IsIFBDU1IgKi8KLSAgICAvKiB7InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2MTAwKSwJdHdvKG94ZmZjMCwgb3hmZmZmKSwJIipzWjgiIH0sICovCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2MDAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIipzWTgiIH0sCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2MjAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIlk4JXMiIH0sCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2NjAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIlo4JXMiIH0sCi0gICAgCi17InByZXN0b3JlIiwJb25lKDB4ZjE0MCksCQlvbmUoMHhmZmMwKSwJCSImcyJ9LAoteyJwcmVzdG9yZSIsCW9uZSgweGYxNTgpLAkJb25lKDB4ZmZmOCksCQkiK3MifSwKLXsicHNhdmUiLAlvbmUoMHhmMTAwKSwJCW9uZSgweGZmYzApLAkJIiZzIn0sCi17InBzYXZlIiwJb25lKDB4ZjEwMCksCQlvbmUoMHhmZmMwKSwJCSIrcyJ9LAotICAgIAoteyJwc2FjIiwJdHdvKDB4ZjA0MCwgMHgwMDA3KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzYXMiLAl0d28oMHhmMDQwLCAweDAwMDYpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNiYyIsCXR3bygweGYwNDAsIDB4MDAwMSksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2JzIiwJdHdvKDB4ZjA0MCwgMHgwMDAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzY2MiLAl0d28oMHhmMDQwLCAweDAwMGYpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNjcyIsCXR3bygweGYwNDAsIDB4MDAwZSksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2djIiwJdHdvKDB4ZjA0MCwgMHgwMDBkKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzZ3MiLAl0d28oMHhmMDQwLCAweDAwMGMpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNpYyIsCXR3bygweGYwNDAsIDB4MDAwYiksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2lzIiwJdHdvKDB4ZjA0MCwgMHgwMDBhKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzbGMiLAl0d28oMHhmMDQwLCAweDAwMDMpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNscyIsCXR3bygweGYwNDAsIDB4MDAwMiksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc3NjIiwJdHdvKDB4ZjA0MCwgMHgwMDA1KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzc3MiLAl0d28oMHhmMDQwLCAweDAwMDQpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHN3YyIsCXR3bygweGYwNDAsIDB4MDAwOSksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc3dzIiwJdHdvKDB4ZjA0MCwgMHgwMDA4KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi0gICAgCi17InB0ZXN0ciIsCXR3bygweGYwMDAsIDB4ODIxMCksCXR3bygweGZmYzAsIDB4ZTNmMCksCSJUMyZzUTgiIH0sCi17InB0ZXN0ciIsCXR3bygweGYwMDAsIDB4ODMxMCksCXR3bygweGZmYzAsIDB4ZTMxMCksCSJUMyZzUThBOSIgfSwKLXsicHRlc3RyIiwJdHdvKDB4ZjAwMCwgMHg4MjA4KSwJdHdvKDB4ZmZjMCwgMHhlM2Y4KSwJIkQzJnNROCIgfSwKLXsicHRlc3RyIiwJdHdvKDB4ZjAwMCwgMHg4MzA4KSwJdHdvKDB4ZmZjMCwgMHhlMzE4KSwJIkQzJnNROEE5IiB9LAoteyJwdGVzdHIiLAl0d28oMHhmMDAwLCAweDgyMDApLAl0d28oMHhmZmMwLCAweGUzZmUpLAkiZjMmc1E4IiB9LAoteyJwdGVzdHIiLAl0d28oMHhmMDAwLCAweDgzMDApLAl0d28oMHhmZmMwLCAweGUzMWUpLAkiZjMmc1E4QTkiIH0sCi0gICAgCi17InB0ZXN0dyIsCXR3bygweGYwMDAsIDB4ODAxMCksCXR3bygweGZmYzAsIDB4ZTNmMCksCSJUMyZzUTgiIH0sCi17InB0ZXN0dyIsCXR3bygweGYwMDAsIDB4ODExMCksCXR3bygweGZmYzAsIDB4ZTMxMCksCSJUMyZzUThBOSIgfSwKLXsicHRlc3R3IiwJdHdvKDB4ZjAwMCwgMHg4MDA4KSwJdHdvKDB4ZmZjMCwgMHhlM2Y4KSwJIkQzJnNROCIgfSwKLXsicHRlc3R3IiwJdHdvKDB4ZjAwMCwgMHg4MTA4KSwJdHdvKDB4ZmZjMCwgMHhlMzE4KSwJIkQzJnNROEE5IiB9LAoteyJwdGVzdHciLAl0d28oMHhmMDAwLCAweDgwMDApLAl0d28oMHhmZmMwLCAweGUzZmUpLAkiZjMmc1E4IiB9LAoteyJwdGVzdHciLAl0d28oMHhmMDAwLCAweDgxMDApLAl0d28oMHhmZmMwLCAweGUzMWUpLAkiZjMmc1E4QTkiIH0sCi0gICAgCi17InB0cmFwYWN3IiwJdHdvKDB4ZjA3YSwgMHgwMDA3KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwYWNsIiwJdHdvKDB4ZjA3YiwgMHgwMDA3KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwYWMiLAl0d28oMHhmMDdjLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwYXN3IiwJdHdvKDB4ZjA3YSwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwYXNsIiwJdHdvKDB4ZjA3YiwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwYXMiLAl0d28oMHhmMDdjLCAweDAwMDYpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwYmN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAxKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwYmNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAxKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwYmMiLAl0d28oMHhmMDdjLCAweDAwMDEpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwYnN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAwKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwYnNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAwKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwYnMiLAl0d28oMHhmMDdjLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwY2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwY2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwY2MiLAl0d28oMHhmMDdjLCAweDAwMGYpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwY3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBlKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwY3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBlKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwY3MiLAl0d28oMHhmMDdjLCAweDAwMGUpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwZ2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBkKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwZ2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBkKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwZ2MiLAl0d28oMHhmMDdjLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwZ3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwZ3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwZ3MiLAl0d28oMHhmMDdjLCAweDAwMGMpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwaWN3IiwJdHdvKDB4ZjA3YSwgMHgwMDBiKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwaWNsIiwJdHdvKDB4ZjA3YiwgMHgwMDBiKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwaWMiLAl0d28oMHhmMDdjLCAweDAwMGIpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwaXN3IiwJdHdvKDB4ZjA3YSwgMHgwMDBhKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwaXNsIiwJdHdvKDB4ZjA3YiwgMHgwMDBhKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwaXMiLAl0d28oMHhmMDdjLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwbGN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwbGNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwbGMiLAl0d28oMHhmMDdjLCAweDAwMDMpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwbHN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAyKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwbHNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAyKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwbHMiLAl0d28oMHhmMDdjLCAweDAwMDIpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwc2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA1KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwc2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA1KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwc2MiLAl0d28oMHhmMDdjLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwc3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwc3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwc3MiLAl0d28oMHhmMDdjLCAweDAwMDQpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwd2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA5KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwd2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA5KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwd2MiLAl0d28oMHhmMDdjLCAweDAwMDkpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwd3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA4KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwd3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA4KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwd3MiLAl0d28oMHhmMDdjLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB2YWxpZCIsCXR3bygweGYwMDAsIDB4MjgwMCksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJWcyZzIn0sCi17InB2YWxpZCIsCXR3bygweGYwMDAsIDB4MmMwMCksCXR3bygweGZmYzAsIDB4ZmZmOCksCSJBMyZzIiB9LAotICAgIAotI2VuZGlmIC8qIG02ODg1MSAqLwotCi0vKiBlbmQgb2YgdGMtbTY4ODUxLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbTY4ay5jIGIvZ2FzL2NvbmZpZy90Yy1tNjhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZmFmNTQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tNjhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MDIwICswLDAgQEAKLS8qIHRjLW02OGsuYyAtLSBBc3NlbWJsZSBmb3IgdGhlIG02OGsgZmFtaWx5Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0jaW5jbHVkZSAib3Bjb2RlL202OGsuaCIKLSNpbmNsdWRlICJtNjhrLXBhcnNlLmgiCi0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKQotI2luY2x1ZGUgImVsZi9tNjhrLmgiCi0jZW5kaWYKLQotLyogVGhpcyBzdHJpbmcgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsLiAgVGhlIG1hY3JvCi0gICB0Y19jb21tZW50X2NoYXJzIHBvaW50cyB0byB0aGlzLiAgV2UgdXNlIHRoaXMsIHJhdGhlciB0aGFuIHRoZQotICAgdXN1YWwgY29tbWVudF9jaGFycywgc28gdGhhdCB0aGUgLS1iaXR3aXNlLW9yIG9wdGlvbiB3aWxsIHdvcmsuICAqLwotI2lmIGRlZmluZWQgKFRFX1NWUjQpIHx8IGRlZmluZWQgKFRFX0RFTFRBKQotY29uc3QgY2hhciAqbTY4a19jb21tZW50X2NoYXJzID0gInwjIjsKLSNlbHNlCi1jb25zdCBjaGFyICptNjhrX2NvbW1lbnRfY2hhcnMgPSAifCI7Ci0jZW5kaWYKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dCAqLwotLyogTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4gKi8KLS8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMgd29yay4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyoiOwotCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLUNPTlNUIGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwgYXMKLSAgIGluICIwZjEyLjQ1NiIgb3IgIjBkMS4yMzQ1ZTEyIi4gICovCi0KLUNPTlNUIGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WGVFcFAiOwotCi0vKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYyAuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQgYWxsLAotICAgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuICAqLwotCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDg7CS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotLyogQXJlIHdlIHRyeWluZyB0byBnZW5lcmF0ZSBQSUMgY29kZT8gIElmIHNvLCBhYnNvbHV0ZSByZWZlcmVuY2VzCi0gICBvdWdodCB0byBiZSBtYWRlIGludG8gbGlua2FnZSB0YWJsZSByZWZlcmVuY2VzIG9yIHBjLXJlbGF0aXZlCi0gICByZWZlcmVuY2VzLiAgTm90IGltcGxlbWVudGVkLiAgRm9yIEVMRiB0aGVyZSBhcmUgb3RoZXIgbWVhbnMgCi0gICB0byBkZW5vdGUgcGljIHJlbG9jYXRpb25zLiAgKi8KLWludCBmbGFnX3dhbnRfcGljOwotCi1zdGF0aWMgaW50IGZsYWdfc2hvcnRfcmVmczsJLyogLWwgb3B0aW9uICovCi1zdGF0aWMgaW50IGZsYWdfbG9uZ19qdW1wczsJLyogLVMgb3B0aW9uICovCi0KLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwKLWludCBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgPSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUw7Ci0jZWxzZQotaW50IGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbDsKLSNlbmRpZgotCi0vKiBXaGV0aGVyIC0tcmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsIHdhcyB1c2VkIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotc3RhdGljIGludCByZWdfcHJlZml4X29wdGlvbmFsX3NlZW47Ci0KLS8qIFRoZSBmbG9hdGluZyBwb2ludCBjb3Byb2Nlc3NvciB0byB1c2UgYnkgZGVmYXVsdC4gICovCi1zdGF0aWMgZW51bSBtNjhrX3JlZ2lzdGVyIG02OGtfZmxvYXRfY29wbnVtID0gQ09QMTsKLQotLyogSWYgdGhpcyBpcyBub24temVybywgdGhlbiByZWZlcmVuY2VzIHRvIG51bWJlciglcGMpIHdpbGwgYmUgdGFrZW4KLSAgIHRvIHJlZmVyIHRvIG51bWJlciwgcmF0aGVyIHRoYW4gdG8gJXBjICsgbnVtYmVyLiAgKi8KLXN0YXRpYyBpbnQgbTY4a19hYnNwY2FkZDsKLQotLyogSWYgdGhpcyBpcyBub24temVybywgdGhlbiB0aGUgcXVpY2sgZm9ybXMgb2YgdGhlIG1vdmUsIGFkZCwgYW5kIHN1YgotICAgaW5zdHJ1Y3Rpb25zIGFyZSB1c2VkIHdoZW4gcG9zc2libGUuICAqLwotc3RhdGljIGludCBtNjhrX3F1aWNrID0gMTsKLQotLyogSWYgdGhpcyBpcyBub24temVybywgdGhlbiBpZiB0aGUgc2l6ZSBpcyBub3Qgc3BlY2lmaWVkIGZvciBhIGJhc2UKLSAgIG9yIG91dGVyIGRpc3BsYWNlbWVudCwgdGhlIGFzc2VtYmxlciBhc3N1bWVzIHRoYXQgdGhlIHNpemUgc2hvdWxkCi0gICBiZSAzMiBiaXRzLiAgKi8KLXN0YXRpYyBpbnQgbTY4a19yZWwzMiA9IDE7Ci0KLS8qIFRoaXMgaXMgbm9uLXplcm8gaWYgbTY4a19yZWwzMiB3YXMgc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICovCi1zdGF0aWMgaW50IG02OGtfcmVsMzJfZnJvbV9jbWRsaW5lOwotCi0vKiBUaGUgZGVmYXVsdCB3aWR0aCB0byB1c2UgZm9yIGFuIGluZGV4IHJlZ2lzdGVyIHdoZW4gdXNpbmcgYSBiYXNlCi0gICBkaXNwbGFjZW1lbnQuICAqLwotc3RhdGljIGVudW0gbTY4a19zaXplIG02OGtfaW5kZXhfd2lkdGhfZGVmYXVsdCA9IFNJWkVfTE9ORzsKLQotLyogV2Ugd2FudCB0byB3YXJuIGlmIGFueSB0ZXh0IGxhYmVscyBhcmUgbWlzYWxpZ25lZC4gIEluIG9yZGVyIHRvIGdldAotICAgdGhlIHJpZ2h0IGxpbmUgbnVtYmVyLCB3ZSBuZWVkIHRvIHJlY29yZCB0aGUgbGluZSBudW1iZXIgZm9yIGVhY2gKLSAgIGxhYmVsLiAgKi8KLQotc3RydWN0IGxhYmVsX2xpbmUKLXsKLSAgc3RydWN0IGxhYmVsX2xpbmUgKm5leHQ7Ci0gIHN5bWJvbFMgKmxhYmVsOwotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgaW50IHRleHQ7Ci19OwotCi0vKiBUaGUgbGlzdCBvZiBsYWJlbHMuICAqLwotCi1zdGF0aWMgc3RydWN0IGxhYmVsX2xpbmUgKmxhYmVsczsKLQotLyogVGhlIGN1cnJlbnQgbGFiZWwuICAqLwotCi1zdGF0aWMgc3RydWN0IGxhYmVsX2xpbmUgKmN1cnJlbnRfbGFiZWw7Ci0KLS8qIEl0cyBhbiBhcmJpdHJhcnkgbmFtZTogIFRoaXMgbWVhbnMgSSBkb24ndCBhcHByb3ZlIG9mIGl0ICovCi0vKiBTZWUgZmxhbWVzIGJlbG93ICovCi1zdGF0aWMgc3RydWN0IG9ic3RhY2sgcm9ieW47Ci0KLSNkZWZpbmUgVEFCKHgseSkJKCgoeCk8PDIpKyh5KSkKLSNkZWZpbmUgVEFCVFlQRSh4eSkgICAgICgoeHkpID4+IDIpCi0jZGVmaW5lIEJZVEUJCTAKLSNkZWZpbmUgU0hPUlQJCTEKLSNkZWZpbmUgTE9ORwkJMgotI2RlZmluZSBTWl9VTkRFRgkzCi0jdW5kZWYgQlJBTkNICi0vKiBDYXNlIGBnJyBleGNlcHQgd2hlbiBCQ0M2ODAwMCBpcyBhcHBsaWNhYmxlLiAgKi8KLSNkZWZpbmUgQUJSQU5DSAkJMQotLyogQ29wcm9jZXNzb3IgYnJhbmNoZXMuICAqLwotI2RlZmluZSBGQlJBTkNICQkyCi0vKiBNb2RlIDcuMiAtLSBwcm9ncmFtIGNvdW50ZXIgaW5kaXJlY3Qgd2l0aCAoMTYtYml0KSBkaXNwbGFjZW1lbnQsCi0gICBzdXBwb3J0ZWQgb24gYWxsIGNwdXMuICBXaWRlbnMgdG8gMzItYml0IGFic29sdXRlLiAgKi8KLSNkZWZpbmUgUENSRUwJCTMKLS8qIEZvciBpbnNlcnRpbmcgYW4gZXh0cmEgam1wIGluc3RydWN0aW9uIHdpdGggbG9uZyBvZmZzZXQgb24gNjgwMDAsCi0gICBmb3IgZXhwYW5kaW5nIGNvbmRpdGlvbmFsIGJyYW5jaGVzLiAgKE5vdCBic3Igb3IgYnJhLikgIFNpbmNlIHRoZQotICAgNjgwMDAgZG9lc24ndCBzdXBwb3J0IDMyLWJpdCBkaXNwbGFjZW1lbnRzIGZvciBjb25kaXRpb25hbAotICAgYnJhbmNoZXMsIHdlIGZha2UgaXQgYnkgcmV2ZXJzaW5nIHRoZSBjb25kaXRpb24gYW5kIGJyYW5jaGluZwotICAgYXJvdW5kIGEgam1wIHdpdGggYW4gYWJzb2x1dGUgbG9uZyBvcGVyYW5kLiAgKi8KLSNkZWZpbmUgQkNDNjgwMDAgICAgICAgIDQKLS8qIEZvciB0aGUgREJjYyAiaW5zdHJ1Y3Rpb25zIi4gIElmIHRoZSBkaXNwbGFjZW1lbnQgcmVxdWlyZXMgMzIgYml0cywKLSAgIHRoZSBicmFuY2gtYXJvdW5kLWEtanVtcCBnYW1lIGlzIHBsYXllZCBoZXJlIHRvby4gICovCi0jZGVmaW5lIERCQ0MgICAgICAgICAgICA1Ci0vKiBOb3QgY3VycmVudGx5IHVzZWQ/ICAqLwotI2RlZmluZSBQQ0xFQQkJNgotLyogTW9kZSBBSU5EWCAoYXBjLXJlbGF0aXZlKSB1c2luZyBQQywgd2l0aCB2YXJpYWJsZSB0YXJnZXQsIG1pZ2h0IGZpdAotICAgaW4gMTYgb3IgOCBiaXRzLiAgKi8KLSNkZWZpbmUgUENJTkRFWAkJNwotCi1zdHJ1Y3QgbTY4a19pbmNhbnQKLSAgewotICAgIGNvbnN0IGNoYXIgKm1fb3BlcmFuZHM7Ci0gICAgdW5zaWduZWQgbG9uZyBtX29wY29kZTsKLSAgICBzaG9ydCBtX29wbnVtOwotICAgIHNob3J0IG1fY29kZW51bTsKLSAgICBpbnQgbV9hcmNoOwotICAgIHN0cnVjdCBtNjhrX2luY2FudCAqbV9uZXh0OwotICB9OwotCi0jZGVmaW5lIGdldG9uZSh4KQkoKCgoeCktPm1fb3Bjb2RlKT4+MTYpJjB4ZmZmZikKLSNkZWZpbmUgZ2V0dHdvKHgpCSgoKHgpLT5tX29wY29kZSkmMHhmZmZmKQotCi1zdGF0aWMgY29uc3QgZW51bSBtNjhrX3JlZ2lzdGVyIG02ODAwMF9jb250cm9sX3JlZ3NbXSA9IHsgMCB9Owotc3RhdGljIGNvbnN0IGVudW0gbTY4a19yZWdpc3RlciBtNjgwMTBfY29udHJvbF9yZWdzW10gPSB7Ci0gIFNGQywgREZDLCBVU1AsIFZCUiwKLSAgMAotfTsKLXN0YXRpYyBjb25zdCBlbnVtIG02OGtfcmVnaXN0ZXIgbTY4MDIwX2NvbnRyb2xfcmVnc1tdID0gewotICBTRkMsIERGQywgVVNQLCBWQlIsIENBQ1IsIENBQVIsIE1TUCwgSVNQLAotICAwCi19Owotc3RhdGljIGNvbnN0IGVudW0gbTY4a19yZWdpc3RlciBtNjgwNDBfY29udHJvbF9yZWdzW10gPSB7Ci0gIFNGQywgREZDLCBDQUNSLCBUQywgSVRUMCwgSVRUMSwgRFRUMCwgRFRUMSwKLSAgVVNQLCBWQlIsIE1TUCwgSVNQLCBNTVVTUiwgVVJQLCBTUlAsCi0gIDAKLX07Ci1zdGF0aWMgY29uc3QgZW51bSBtNjhrX3JlZ2lzdGVyIG02ODA2MF9jb250cm9sX3JlZ3NbXSA9IHsKLSAgU0ZDLCBERkMsIENBQ1IsIFRDLCBJVFQwLCBJVFQxLCBEVFQwLCBEVFQxLCBCVVNDUiwKLSAgVVNQLCBWQlIsIFVSUCwgU1JQLCBQQ1IsCi0gIDAKLX07Ci1zdGF0aWMgY29uc3QgZW51bSBtNjhrX3JlZ2lzdGVyIG1jZjUyMDBfY29udHJvbF9yZWdzW10gPSB7Ci0gIENBQ1IsIFRDLCBJVFQwLCBJVFQxLCBEVFQwLCBEVFQxLCBWQlIsIFJPTUJBUiwgCi0gIFJBTUJBUjAsIFJBTUJBUjEsIE1CQVIsCi0gIDAKLX07Ci0jZGVmaW5lIGNwdTMyX2NvbnRyb2xfcmVncyBtNjgwMTBfY29udHJvbF9yZWdzCi0KLXN0YXRpYyBjb25zdCBlbnVtIG02OGtfcmVnaXN0ZXIgKmNvbnRyb2xfcmVnczsKLQotLyogaW50ZXJuYWwgZm9ybSBvZiBhIDY4MDIwIGluc3RydWN0aW9uICovCi1zdHJ1Y3QgbTY4a19pdAotewotICBjb25zdCBjaGFyICplcnJvcjsKLSAgY29uc3QgY2hhciAqYXJnczsJCS8qIGxpc3Qgb2Ygb3Bjb2RlIGluZm8gKi8KLSAgaW50IG51bWFyZ3M7Ci0KLSAgaW50IG51bW87CQkJLyogTnVtYmVyIG9mIHNob3J0cyBpbiBvcGNvZGUgKi8KLSAgc2hvcnQgb3Bjb2RlWzExXTsKLQotICBzdHJ1Y3QgbTY4a19vcCBvcGVyYW5kc1s2XTsKLQotICBpbnQgbmV4cDsJCQkvKiBudW1iZXIgb2YgZXhwcnMgaW4gdXNlICovCi0gIHN0cnVjdCBtNjhrX2V4cCBleHByc1s0XTsKLQotICBpbnQgbmZyYWc7CQkJLyogTnVtYmVyIG9mIGZyYWdzIHdlIGhhdmUgdG8gcHJvZHVjZSAqLwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBpbnQgZnJhZ29mZjsJCS8qIFdoZXJlIGluIHRoZSBjdXJyZW50IG9wY29kZSB0aGUgZnJhZyBlbmRzICovCi0gICAgICBzeW1ib2xTICpmYWRkOwotICAgICAgb2Zmc2V0VCBmb2ZmOwotICAgICAgaW50IGZyYWd0eTsKLSAgICB9Ci0gIGZyYWdiWzRdOwotCi0gIGludCBucmVsOwkJCS8qIE51bSBvZiByZWxvYyBzdHJ1Y3MgaW4gdXNlICovCi0gIHN0cnVjdAotICAgIHsKLSAgICAgIGludCBuOwotICAgICAgZXhwcmVzc2lvblMgZXhwOwotICAgICAgY2hhciB3aWQ7Ci0gICAgICBjaGFyIHBjcmVsOwotICAgICAgLyogSW4gYSBwYyByZWxhdGl2ZSBhZGRyZXNzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFkZHJlc3MKLQkgb2YgdGhlIG9mZnNldCBhbmQgdGhlIGFkZHJlc3MgdGhhdCB0aGUgb2Zmc2V0IGlzIHJlbGF0aXZlCi0JIHRvLiAgVGhpcyBkZXBlbmRzIG9uIHRoZSBhZGRyZXNzaW5nIG1vZGUuICBCYXNpY2FsbHkgdGhpcwotCSBpcyB0aGUgdmFsdWUgdG8gcHV0IGluIHRoZSBvZmZzZXQgZmllbGQgdG8gYWRkcmVzcyB0aGUKLQkgZmlyc3QgYnl0ZSBvZiB0aGUgb2Zmc2V0LCB3aXRob3V0IHJlZ2FyZGluZyB0aGUgc3BlY2lhbAotCSBzaWduaWZpY2FuY2Ugb2Ygc29tZSB2YWx1ZXMgKGluIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24sIGZvcgotCSBleGFtcGxlKS4gICovCi0gICAgICBpbnQgcGNyZWxfZml4OwotI2lmZGVmIE9CSl9FTEYKLSAgICAgIC8qIFdoZXRoZXIgdGhpcyBleHByZXNzaW9uIG5lZWRzIHNwZWNpYWwgcGljIHJlbG9jYXRpb24sIGFuZCBpZgotCSBzbywgd2hpY2guICAqLwotICAgICAgZW51bSBwaWNfcmVsb2NhdGlvbiBwaWNfcmVsb2M7Ci0jZW5kaWYKLSAgICB9Ci0gIHJlbG9jWzVdOwkJCS8qIEZpdmUgaXMgZW5vdWdoPz8/ICovCi19OwotCi0jZGVmaW5lIGNwdV9vZl9hcmNoKHgpCQkoKHgpICYgKG02ODAwMHVwfG1jZjUyMDApKQotI2RlZmluZSBmbG9hdF9vZl9hcmNoKHgpCSgoeCkgJiBtZmxvYXQpCi0jZGVmaW5lIG1tdV9vZl9hcmNoKHgpCQkoKHgpICYgbW1tdSkKLQotLyogTWFjcm9zIGZvciBkZXRlcm1pbmluZyBpZiBjcHUgc3VwcG9ydHMgYSBzcGVjaWZpYyBhZGRyZXNzaW5nIG1vZGUgKi8KLSNkZWZpbmUgSEFWRV9MT05HX0JSQU5DSCh4KQkoKHgpICYgKG02ODAyMHxtNjgwMzB8bTY4MDQwfG02ODA2MHxjcHUzMikpCi0KLXN0YXRpYyBzdHJ1Y3QgbTY4a19pdCB0aGVfaW5zOwkvKiB0aGUgaW5zdHJ1Y3Rpb24gYmVpbmcgYXNzZW1ibGVkICovCi0KLSNkZWZpbmUgb3AoZXgpCQkoKGV4KS0+ZXhwLlhfb3ApCi0jZGVmaW5lIGFkZHMoZXgpCSgoZXgpLT5leHAuWF9hZGRfc3ltYm9sKQotI2RlZmluZSBzdWJzKGV4KQkoKGV4KS0+ZXhwLlhfb3Bfc3ltYm9sKQotI2RlZmluZSBvZmZzKGV4KQkoKGV4KS0+ZXhwLlhfYWRkX251bWJlcikKLQotLyogTWFjcm9zIGZvciBhZGRpbmcgdGhpbmdzIHRvIHRoZSBtNjhrX2l0IHN0cnVjdCAqLwotCi0jZGVmaW5lIGFkZHdvcmQodykJdGhlX2lucy5vcGNvZGVbdGhlX2lucy5udW1vKytdPSh3KQotCi0vKiBTdGF0aWMgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQgaW5zb3AgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3QgbTY4a19pbmNhbnQgKikpOwotc3RhdGljIHZvaWQgYWRkX2ZpeCBQQVJBTVMgKChpbnQsIHN0cnVjdCBtNjhrX2V4cCAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgYWRkX2ZyYWcgUEFSQU1TICgoc3ltYm9sUyAqLCBvZmZzZXRULCBpbnQpKTsKLQotLyogTGlrZSBhZGR3b3JkLCBidXQgZ29lcyBCRUZPUkUgZ2VuZXJhbCBvcGVyYW5kcyAqLwotc3RhdGljIHZvaWQKLWluc29wICh3LCBvcGNvZGUpCi0gICAgIGludCB3OwotICAgICBjb25zdCBzdHJ1Y3QgbTY4a19pbmNhbnQgKm9wY29kZTsKLXsKLSAgaW50IHo7Ci0gIGZvcih6PXRoZV9pbnMubnVtbzt6Pm9wY29kZS0+bV9jb2RlbnVtOy0teikKLSAgICB0aGVfaW5zLm9wY29kZVt6XT10aGVfaW5zLm9wY29kZVt6LTFdOwotICBmb3Ioej0wO3o8dGhlX2lucy5ucmVsO3orKykKLSAgICB0aGVfaW5zLnJlbG9jW3pdLm4rPTI7Ci0gIGZvciAoeiA9IDA7IHogPCB0aGVfaW5zLm5mcmFnOyB6KyspCi0gICAgdGhlX2lucy5mcmFnYlt6XS5mcmFnb2ZmKys7Ci0gIHRoZV9pbnMub3Bjb2RlW29wY29kZS0+bV9jb2RlbnVtXT13OwotICB0aGVfaW5zLm51bW8rKzsKLX0KLQotLyogVGhlIG51bW8rMSBrbHVkZ2UgaXMgc28gd2UgY2FuIGhpdCB0aGUgbG93IG9yZGVyIGJ5dGUgb2YgdGhlIHByZXYgd29yZC4KLSAgIEJsZWNjaC4gICovCi1zdGF0aWMgdm9pZAotYWRkX2ZpeCAod2lkdGgsIGV4cCwgcGNfcmVsLCBwY19maXgpCi0gICAgIGludCB3aWR0aDsKLSAgICAgc3RydWN0IG02OGtfZXhwICpleHA7Ci0gICAgIGludCBwY19yZWw7Ci0gICAgIGludCBwY19maXg7Ci17Ci0gIHRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsXS5uID0gKCh3aWR0aCA9PSAnQicgfHwgd2lkdGggPT0gJzMnKQotCQkJCSAgID8gKHRoZV9pbnMubnVtbyoyLTEpCi0JCQkJICAgOiAoKCh3aWR0aCk9PSdiJykKLQkJCQkgICAgICA/ICh0aGVfaW5zLm51bW8qMisxKQotCQkJCSAgICAgIDogKHRoZV9pbnMubnVtbyoyKSkpOwotICB0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbF0uZXhwID0gZXhwLT5leHA7Ci0gIHRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsXS53aWQgPSB3aWR0aDsKLSAgdGhlX2lucy5yZWxvY1t0aGVfaW5zLm5yZWxdLnBjcmVsX2ZpeCA9IHBjX2ZpeDsKLSNpZmRlZiBPQkpfRUxGCi0gIHRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsXS5waWNfcmVsb2MgPSBleHAtPnBpY19yZWxvYzsKLSNlbmRpZgotICB0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbCsrXS5wY3JlbCA9IHBjX3JlbDsKLX0KLQotLyogQ2F1c2UgYW4gZXh0cmEgZnJhZyB0byBiZSBnZW5lcmF0ZWQgaGVyZSwgaW5zZXJ0aW5nIHVwIHRvIDEwIGJ5dGVzCi0gICAodGhhdCB2YWx1ZSBpcyBjaG9zZW4gaW4gdGhlIGZyYWdfdmFyIGNhbGwgaW4gbWRfYXNzZW1ibGUpLiAgVFlQRQotICAgaXMgdGhlIHN1YnR5cGUgb2YgdGhlIGZyYWcgdG8gYmUgZ2VuZXJhdGVkOyBpdHMgcHJpbWFyeSB0eXBlIGlzCi0gICByc19tYWNoaW5lX2RlcGVuZGVudC4KLQotICAgVGhlIFRZUEUgcGFyYW1ldGVyIGlzIGFsc28gdXNlZCBieSBtZF9jb252ZXJ0X2ZyYWdfMSBhbmQKLSAgIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LiAgVGhlIGFwcHJvcHJpYXRlIHR5cGUgb2YgZml4dXAgd2lsbAotICAgYmUgZW1pdHRlZCBieSBtZF9jb252ZXJ0X2ZyYWdfMS4KLQotICAgQUREIGJlY29tZXMgdGhlIEZSX1NZTUJPTCBmaWVsZCBvZiB0aGUgZnJhZywgYW5kIE9GRiB0aGUgRlJfT0ZGU0VULiAgKi8KLXN0YXRpYyB2b2lkCi1hZGRfZnJhZyAoYWRkLCBvZmYsIHR5cGUpCi0gICAgIHN5bWJvbFMgKmFkZDsKLSAgICAgb2Zmc2V0VCBvZmY7Ci0gICAgIGludCB0eXBlOwotewotICB0aGVfaW5zLmZyYWdiW3RoZV9pbnMubmZyYWddLmZyYWdvZmY9dGhlX2lucy5udW1vOwotICB0aGVfaW5zLmZyYWdiW3RoZV9pbnMubmZyYWddLmZhZGQ9YWRkOwotICB0aGVfaW5zLmZyYWdiW3RoZV9pbnMubmZyYWddLmZvZmY9b2ZmOwotICB0aGVfaW5zLmZyYWdiW3RoZV9pbnMubmZyYWcrK10uZnJhZ3R5PXR5cGU7Ci19Ci0KLSNkZWZpbmUgaXN2YXIoZXgpIFwKLSAgKG9wIChleCkgIT0gT19jb25zdGFudCAmJiBvcCAoZXgpICE9IE9fYmlnKQotCi1zdGF0aWMgY2hhciAqY3JhY2tfb3BlcmFuZCBQQVJBTVMgKChjaGFyICpzdHIsIHN0cnVjdCBtNjhrX29wICpvcFApKTsKLXN0YXRpYyBpbnQgZ2V0X251bSBQQVJBTVMgKChzdHJ1Y3QgbTY4a19leHAgKmV4cCwgaW50IG9rKSk7Ci1zdGF0aWMgdm9pZCBtNjhrX2lwIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgaW5zZXJ0X3JlZyBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgc2VsZWN0X2NvbnRyb2xfcmVncyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBpbml0X3JlZ3RhYmxlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgcmV2ZXJzZV8xNl9iaXRzIFBBUkFNUyAoKGludCBpbikpOwotc3RhdGljIGludCByZXZlcnNlXzhfYml0cyBQQVJBTVMgKChpbnQgaW4pKTsKLXN0YXRpYyB2b2lkIGluc3RhbGxfZ2VuX29wZXJhbmQgUEFSQU1TICgoaW50IG1vZGUsIGludCB2YWwpKTsKLXN0YXRpYyB2b2lkIGluc3RhbGxfb3BlcmFuZCBQQVJBTVMgKChpbnQgbW9kZSwgaW50IHZhbCkpOwotc3RhdGljIHZvaWQgc19ic3MgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2RhdGExIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19kYXRhMiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZXZlbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfcHJvYyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG1yaV9jaGlwIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHNfY2hpcCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZm9wdCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfb3B0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19yZWcgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3Jlc3RvcmUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3NhdmUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV9pZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbXJpX2Vsc2UgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV9lbmRpIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfYnJlYWsgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV9uZXh0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfZm9yIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfZW5kZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbXJpX3JlcGVhdCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbXJpX3VudGlsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfd2hpbGUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV9lbmR3IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbWRfYXBwbHlfZml4XzIgUEFSQU1TICgoZml4UyAqLCBvZmZzZXRUKSk7Ci1zdGF0aWMgdm9pZCBtZF9jb252ZXJ0X2ZyYWdfMSBQQVJBTVMgKChmcmFnUyAqKSk7Ci0KLXN0YXRpYyBpbnQgY3VycmVudF9hcmNoaXRlY3R1cmU7Ci0KLXN0cnVjdCBtNjhrX2NwdSB7Ci0gIHVuc2lnbmVkIGxvbmcgYXJjaDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgaW50IGFsaWFzOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtNjhrX2NwdSBhcmNoc1tdID0gewotICB7IG02ODAwMCwgIjY4MDAwIiwgMCB9LAotICB7IG02ODAxMCwgIjY4MDEwIiwgMCB9LAotICB7IG02ODAyMCwgIjY4MDIwIiwgMCB9LAotICB7IG02ODAzMCwgIjY4MDMwIiwgMCB9LAotICB7IG02ODA0MCwgIjY4MDQwIiwgMCB9LAotICB7IG02ODA2MCwgIjY4MDYwIiwgMCB9LAotICB7IGNwdTMyLCAgImNwdTMyIiwgMCB9LAotICB7IG02ODg4MSwgIjY4ODgxIiwgMCB9LAotICB7IG02ODg1MSwgIjY4ODUxIiwgMCB9LAotICB7IG1jZjUyMDAsICI1MjAwIiwgMCB9LAotICAvKiBBbGlhc2VzIChlZmZlY3RpdmVseSwgc28gZmFyIGFzIGdhcyBpcyBjb25jZXJuZWQpIGZvciB0aGUgYWJvdmUKLSAgICAgY3B1cy4gICovCi0gIHsgbTY4MDIwLCAiNjhrIiwgMSB9LAotICB7IG02ODAwMCwgIjY4MDA4IiwgMSB9LAotICB7IG02ODAwMCwgIjY4MzAyIiwgMSB9LAotICB7IG02ODAwMCwgIjY4MzA2IiwgMSB9LAotICB7IG02ODAwMCwgIjY4MzA3IiwgMSB9LAotICB7IG02ODAwMCwgIjY4MzIyIiwgMSB9LAotICB7IG02ODAwMCwgIjY4MzU2IiwgMSB9LAotICB7IG02ODAwMCwgIjY4ZWMwMDAiLCAxIH0sCi0gIHsgbTY4MDAwLCAiNjhoYzAwMCIsIDEgfSwKLSAgeyBtNjgwMDAsICI2OGhjMDAxIiwgMSB9LAotICB7IG02ODAyMCwgIjY4ZWMwMjAiLCAxIH0sCi0gIHsgbTY4MDMwLCAiNjhlYzAzMCIsIDEgfSwKLSAgeyBtNjgwNDAsICI2OGVjMDQwIiwgMSB9LAotICB7IG02ODA2MCwgIjY4ZWMwNjAiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzMzAiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzMzEiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzMzIiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzMzMiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzMzQiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzMzYiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzNDAiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzNDEiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzNDkiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzNjAiLCAxIH0sCi0gIHsgbTY4ODgxLCAiNjg4ODIiLCAxIH0sCi19OwotCi1zdGF0aWMgY29uc3QgaW50IG5fYXJjaHMgPSBzaXplb2YgKGFyY2hzKSAvIHNpemVvZiAoYXJjaHNbMF0pOwotCi0vKiBCQ0M2ODAwMCBpcyBmb3IgcGF0Y2hpbmcgaW4gYW4gZXh0cmEgam1wIGluc3RydWN0aW9uIGZvciBsb25nIG9mZnNldHMKLSAgIG9uIHRoZSA2ODAwMC4gIFRoZSA2ODAwMCBkb2Vzbid0IHN1cHBvcnQgbG9uZyBicmFuY2hlcyB3aXRoIGJyYW5jaHMgKi8KLQotLyogVGhpcyB0YWJsZSBkZXNyaWJlcyBob3cgeW91IGNoYW5nZSBzaXplcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgdmFyaWFibGUKLSAgIHNpemUgZXhwcmVzc2lvbnMuICBUaGlzIHZlcnNpb24gb25seSBzdXBwb3J0cyB0d28ga2luZHMuICovCi0KLS8qIE5vdGUgdGhhdCBjYWxscyB0byBmcmFnX3ZhciBuZWVkIHRvIHNwZWNpZnkgdGhlIG1heGltdW0gZXhwYW5zaW9uCi0gICBuZWVkZWQ7IHRoaXMgaXMgY3VycmVudGx5IDEwIGJ5dGVzIGZvciBEQkNDLiAgKi8KLQotLyogVGhlIGZpZWxkcyBhcmU6Ci0gICBIb3cgZmFyIEZvcndhcmQgdGhpcyBtb2RlIHdpbGwgcmVhY2g6Ci0gICBIb3cgZmFyIEJhY2t3YXJkIHRoaXMgbW9kZSB3aWxsIHJlYWNoOgotICAgSG93IG1hbnkgYnl0ZXMgdGhpcyBtb2RlIHdpbGwgYWRkIHRvIHRoZSBzaXplIG9mIHRoZSBmcmFnCi0gICBXaGljaCBtb2RlIHRvIGdvIHRvIGlmIHRoZSBvZmZzZXQgd29uJ3QgZml0IGluIHRoaXMgb25lCi0gICAqLwotcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci0gIHsxLCAxLCAwLCAwfSwJCQkvKiBGaXJzdCBlbnRyaWVzIGFyZW4ndCB1c2VkICovCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiBGb3Igbm8gZ29vZCByZWFzb24gZXhjZXB0ICovCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiB0aGF0IHRoZSBWQVggZG9lc24ndCBlaXRoZXIgKi8KLSAgezEsIDEsIDAsIDB9LAotCi0gIHsoMTI3KSwgKC0xMjgpLCAwLCBUQUIgKEFCUkFOQ0gsIFNIT1JUKX0sCi0gIHsoMzI3NjcpLCAoLTMyNzY4KSwgMiwgVEFCIChBQlJBTkNILCBMT05HKX0sCi0gIHswLCAwLCA0LCAwfSwKLSAgezEsIDEsIDAsIDB9LAotCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiBGQlJBTkNIIGRvZXNuJ3QgY29tZSBCWVRFICovCi0gIHsoMzI3NjcpLCAoLTMyNzY4KSwgMiwgVEFCIChGQlJBTkNILCBMT05HKX0sCi0gIHswLCAwLCA0LCAwfSwKLSAgezEsIDEsIDAsIDB9LAotCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiBQQ1JFTCBkb2Vzbid0IGNvbWUgQllURSAqLwotICB7KDMyNzY3KSwgKC0zMjc2OCksIDIsIFRBQiAoUENSRUwsIExPTkcpfSwKLSAgezAsIDAsIDQsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0KLSAgeygxMjcpLCAoLTEyOCksIDAsIFRBQiAoQkNDNjgwMDAsIFNIT1JUKX0sCi0gIHsoMzI3NjcpLCAoLTMyNzY4KSwgMiwgVEFCIChCQ0M2ODAwMCwgTE9ORyl9LAotICB7MCwgMCwgNiwgMH0sCQkJLyogam1wIGxvbmcgc3BhY2UgKi8KLSAgezEsIDEsIDAsIDB9LAotCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiBEQkNDIGRvZXNuJ3QgY29tZSBCWVRFICovCi0gIHsoMzI3NjcpLCAoLTMyNzY4KSwgMiwgVEFCIChEQkNDLCBMT05HKX0sCi0gIHswLCAwLCAxMCwgMH0sCQkvKiBicmEvam1wIGxvbmcgc3BhY2UgKi8KLSAgezEsIDEsIDAsIDB9LAotCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiBQQ0xFQSBkb2Vzbid0IGNvbWUgQllURSAqLwotICB7MzI3NjcsIC0zMjc2OCwgMiwgVEFCIChQQ0xFQSwgTE9ORyl9LAotICB7MCwgMCwgNiwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLQotICAvKiBGb3IsIGUuZy4sIGptcCBwY3JlbCBpbmRleGVkLiAgKi8KLSAgezEyNSwgLTEzMCwgMCwgVEFCIChQQ0lOREVYLCBTSE9SVCl9LAotICB7MzI3NjUsIC0zMjc3MCwgMiwgVEFCIChQQ0lOREVYLCBMT05HKX0sCi0gIHswLCAwLCA0LCAwfSwKLSAgezEsIDEsIDAsIDB9LAotfTsKLQotLyogVGhlc2UgYXJlIHRoZSBtYWNoaW5lIGRlcGVuZGVudCBwc2V1ZG8tb3BzLiAgVGhlc2UgYXJlIGluY2x1ZGVkIHNvCi0gICB0aGUgYXNzZW1ibGVyIGNhbiB3b3JrIG9uIHRoZSBvdXRwdXQgZnJvbSB0aGUgU1VOIEMgY29tcGlsZXIsIHdoaWNoCi0gICBnZW5lcmF0ZXMgdGhlc2UuCi0gICAqLwotCi0vKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KLSAgICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImRhdGExIiwgc19kYXRhMSwgMH0sCi0gIHsiZGF0YTIiLCBzX2RhdGEyLCAwfSwKLSAgeyJic3MiLCBzX2JzcywgMH0sCi0gIHsiZXZlbiIsIHNfZXZlbiwgMH0sCi0gIHsic2tpcCIsIHNfc3BhY2UsIDB9LAotICB7InByb2MiLCBzX3Byb2MsIDB9LAotI2lmIGRlZmluZWQgKFRFX1NVTjMpIHx8IGRlZmluZWQgKE9CSl9FTEYpCi0gIHsiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCAwfSwKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgeyJzd2JlZyIsIHNfaWdub3JlLCAwfSwKLSNlbmRpZgotICB7ImV4dGVuZCIsIGZsb2F0X2NvbnMsICd4J30sCi0gIHsibGRvdWJsZSIsIGZsb2F0X2NvbnMsICd4J30sCi0KLSAgLyogVGhlIGZvbGxvd2luZyBwc2V1ZG8tb3BzIGFyZSBzdXBwb3J0ZWQgZm9yIE1SSSBjb21wYXRpYmlsaXR5LiAgKi8KLSAgeyJjaGlwIiwgc19jaGlwLCAwfSwKLSAgeyJjb21saW5lIiwgc19zcGFjZSwgMX0sCi0gIHsiZm9wdCIsIHNfZm9wdCwgMH0sCi0gIHsibWFzazIiLCBzX2lnbm9yZSwgMH0sCi0gIHsib3B0Iiwgc19vcHQsIDB9LAotICB7InJlZyIsIHNfcmVnLCAwfSwKLSAgeyJyZXN0b3JlIiwgc19yZXN0b3JlLCAwfSwKLSAgeyJzYXZlIiwgc19zYXZlLCAwfSwKLQotICB7ImlmIiwgc19tcmlfaWYsIDB9LAotICB7ImlmLmIiLCBzX21yaV9pZiwgJ2InfSwKLSAgeyJpZi53Iiwgc19tcmlfaWYsICd3J30sCi0gIHsiaWYubCIsIHNfbXJpX2lmLCAnbCd9LAotICB7ImVsc2UiLCBzX21yaV9lbHNlLCAwfSwKLSAgeyJlbHNlLnMiLCBzX21yaV9lbHNlLCAncyd9LAotICB7ImVsc2UubCIsIHNfbXJpX2Vsc2UsICdsJ30sCi0gIHsiZW5kaSIsIHNfbXJpX2VuZGksIDB9LAotICB7ImJyZWFrIiwgc19tcmlfYnJlYWssIDB9LAotICB7ImJyZWFrLnMiLCBzX21yaV9icmVhaywgJ3MnfSwKLSAgeyJicmVhay5sIiwgc19tcmlfYnJlYWssICdsJ30sCi0gIHsibmV4dCIsIHNfbXJpX25leHQsIDB9LAotICB7Im5leHQucyIsIHNfbXJpX25leHQsICdzJ30sCi0gIHsibmV4dC5sIiwgc19tcmlfbmV4dCwgJ2wnfSwKLSAgeyJmb3IiLCBzX21yaV9mb3IsIDB9LAotICB7ImZvci5iIiwgc19tcmlfZm9yLCAnYid9LAotICB7ImZvci53Iiwgc19tcmlfZm9yLCAndyd9LAotICB7ImZvci5sIiwgc19tcmlfZm9yLCAnbCd9LAotICB7ImVuZGYiLCBzX21yaV9lbmRmLCAwfSwKLSAgeyJyZXBlYXQiLCBzX21yaV9yZXBlYXQsIDB9LAotICB7InVudGlsIiwgc19tcmlfdW50aWwsIDB9LAotICB7InVudGlsLmIiLCBzX21yaV91bnRpbCwgJ2InfSwKLSAgeyJ1bnRpbC53Iiwgc19tcmlfdW50aWwsICd3J30sCi0gIHsidW50aWwubCIsIHNfbXJpX3VudGlsLCAnbCd9LAotICB7IndoaWxlIiwgc19tcmlfd2hpbGUsIDB9LAotICB7IndoaWxlLmIiLCBzX21yaV93aGlsZSwgJ2InfSwKLSAgeyJ3aGlsZS53Iiwgc19tcmlfd2hpbGUsICd3J30sCi0gIHsid2hpbGUubCIsIHNfbXJpX3doaWxlLCAnbCd9LAotICB7ImVuZHciLCBzX21yaV9lbmR3LCAwfSwKLQotICB7MCwgMCwgMH0KLX07Ci0KLQotLyogVGhlIG1vdGUgcHNldWRvIG9wcyBhcmUgcHV0IGludG8gdGhlIG9wY29kZSB0YWJsZSwgc2luY2UgdGhleQotICAgZG9uJ3Qgc3RhcnQgd2l0aCBhIC4gdGhleSBsb29rIGxpa2Ugb3Bjb2RlcyB0byBnYXMuCi0gICAqLwotCi0jaWZkZWYgTTY4S0NPRkYKLWV4dGVybiB2b2lkIG9ial9jb2ZmX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQotQ09OU1QgcHNldWRvX3R5cGVTIG1vdGVfcHNldWRvX3RhYmxlW10gPQotewotCi0gIHsiZGNsIiwgY29ucywgNH0sCi0gIHsiZGMiLCBjb25zLCAyfSwKLSAgeyJkY3ciLCBjb25zLCAyfSwKLSAgeyJkY2IiLCBjb25zLCAxfSwKLQotICB7ImRzbCIsIHNfc3BhY2UsIDR9LAotICB7ImRzIiwgc19zcGFjZSwgMn0sCi0gIHsiZHN3Iiwgc19zcGFjZSwgMn0sCi0gIHsiZHNiIiwgc19zcGFjZSwgMX0sCi0KLSAgeyJ4ZGVmIiwgc19nbG9ibCwgMH0sCi0jaWZkZWYgT0JKX0VMRgotICB7ImFsaWduIiwgc19hbGlnbl9ieXRlcywgMH0sCi0jZWxzZQotICB7ImFsaWduIiwgc19hbGlnbl9wdHdvLCAwfSwKLSNlbmRpZgotI2lmZGVmIE02OEtDT0ZGCi0gIHsic2VjdCIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAotICB7InNlY3Rpb24iLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSNlbmRpZgotICB7MCwgMCwgMH0KLX07Ci0KLSNkZWZpbmUgaXNzYnl0ZSh4KQkoKHgpPj0tMTI4ICYmICh4KTw9MTI3KQotI2RlZmluZSBpc3VieXRlKHgpCSgoeCk+PTAgJiYgKHgpPD0yNTUpCi0jZGVmaW5lIGlzc3dvcmQoeCkJKCh4KT49LTMyNzY4ICYmICh4KTw9MzI3NjcpCi0jZGVmaW5lIGlzdXdvcmQoeCkJKCh4KT49MCAmJiAoeCk8PTY1NTM1KQotCi0jZGVmaW5lIGlzYnl0ZSh4KQkoKHgpPj0gLTI1NSAmJiAoeCk8PTI1NSkKLSNkZWZpbmUgaXN3b3JkKHgpCSgoeCk+PS02NTUzNiAmJiAoeCk8PTY1NTM1KQotI2RlZmluZSBpc2xvbmcoeCkJKDEpCi0KLWV4dGVybiBjaGFyICppbnB1dF9saW5lX3BvaW50ZXI7Ci0KLXN0YXRpYyBjaGFyIG1rbG93ZXJfdGFibGVbMjU2XTsKLSNkZWZpbmUgbWtsb3dlcihjKSAobWtsb3dlcl90YWJsZVsodW5zaWduZWQgY2hhcikoYyldKQotc3RhdGljIGNoYXIgbm90ZW5kX3RhYmxlWzI1Nl07Ci1zdGF0aWMgY2hhciBhbHRfbm90ZW5kX3RhYmxlWzI1Nl07Ci0jZGVmaW5lIG5vdGVuZChzKQkJCQkJCVwKLSAgKCEgKG5vdGVuZF90YWJsZVsodW5zaWduZWQgY2hhcikgKnNdCQkJCVwKLSAgICAgIHx8ICgqcyA9PSAnOicJCQkJCQlcCi0JICAmJiBhbHRfbm90ZW5kX3RhYmxlWyh1bnNpZ25lZCBjaGFyKSBzWzFdXSkpKQotCi0jaWYgZGVmaW5lZCAoTTY4S0NPRkYpICYmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotCi0jaWZkZWYgTk9fUENSRUxfUkVMT0NTCi0KLWludAotbWFrZV9wY3JlbF9hYnNvbHV0ZShmaXhQLCBhZGRfbnVtYmVyKQotICAgIGZpeFMgKmZpeFA7Ci0gICAgbG9uZyAqYWRkX251bWJlcjsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqb3Bjb2RlID0gZml4UC0+ZnhfZnJhZy0+ZnJfb3Bjb2RlOwotCi0gIC8qIHJld3JpdGUgdGhlIFBDIHJlbGF0aXZlIGluc3RydWN0aW9ucyB0byBhYnNvbHV0ZSBhZGRyZXNzIG9uZXMuCi0gICAqIHRoZXNlIGFyZSBydW1vdXJlZCB0byBiZSBmYXN0ZXIsIGFuZCB0aGUgYXBvbGxvIGxpbmtlciByZWZ1c2VzCi0gICAqIHRvIGRlYWwgd2l0aCB0aGUgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0gICAqLwotICBpZiAob3Bjb2RlWzBdID09IDB4NjAgJiYgb3Bjb2RlWzFdID09IDB4ZmYpIC8qIEJSQSAtPiBKTVAgKi8KLSAgICB7Ci0gICAgICBvcGNvZGVbMF0gPSAweDRlOwotICAgICAgb3Bjb2RlWzFdID0gMHhmOTsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wY29kZVswXSA9PSAweDYxICYmIG9wY29kZVsxXSA9PSAweGZmKSAvKiBCU1IgLT4gSlNSICovCi0gICAgewotICAgICAgb3Bjb2RlWzBdID0gMHg0ZTsKLSAgICAgIG9wY29kZVsxXSA9IDB4Yjk7Ci0gICAgfQotICBlbHNlCi0gICAgYXNfZmF0YWwgKF8oIlVua25vd24gUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24iKSk7Ci0gICphZGRfbnVtYmVyIC09IDQ7Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYgLyogTk9fUENSRUxfUkVMT0NTICovCi0KLXNob3J0Ci10Y19jb2ZmX2ZpeDJydHlwZSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgaWYgKGZpeFAtPmZ4X3RjYml0ICYmIGZpeFAtPmZ4X3NpemUgPT0gNCkKLSAgICByZXR1cm4gUl9SRUxMT05HX05FRzsKLSNpZmRlZiBOT19QQ1JFTF9SRUxPQ1MKLSAga25vdyAoZml4UC0+ZnhfcGNyZWwgPT0gMCk7Ci0gIHJldHVybiAoZml4UC0+Znhfc2l6ZSA9PSAxID8gUl9SRUxCWVRFCi0JICA6IGZpeFAtPmZ4X3NpemUgPT0gMiA/IFJfRElSMTYKLQkgIDogUl9ESVIzMik7Ci0jZWxzZQotICByZXR1cm4gKGZpeFAtPmZ4X3BjcmVsID8KLQkgIChmaXhQLT5meF9zaXplID09IDEgPyBSX1BDUkJZVEUgOgotCSAgIGZpeFAtPmZ4X3NpemUgPT0gMiA/IFJfUENSV09SRCA6Ci0JICAgUl9QQ1JMT05HKSA6Ci0JICAoZml4UC0+Znhfc2l6ZSA9PSAxID8gUl9SRUxCWVRFIDoKLQkgICBmaXhQLT5meF9zaXplID09IDIgPyBSX1JFTFdPUkQgOgotCSAgIFJfUkVMTE9ORykpOwotI2VuZGlmCi19Ci0KLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotCi0vKiBDb21wdXRlIHRoZSByZWxvY2F0aW9uIGNvZGUgZm9yIGEgZml4dXAgb2YgU0laRSBieXRlcywgdXNpbmcgcGMKLSAgIHJlbGF0aXZlIHJlbG9jYXRpb24gaWYgUENSRUwgaXMgbm9uLXplcm8uICBQSUMgc2F5cyB3aGV0aGVyIGEgc3BlY2lhbAotICAgcGljIHJlbG9jYXRpb24gd2FzIHJlcXVlc3RlZC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgZ2V0X3JlbG9jX2NvZGUKLSAgUEFSQU1TICgoaW50LCBpbnQsIGVudW0gcGljX3JlbG9jYXRpb24pKTsKLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotZ2V0X3JlbG9jX2NvZGUgKHNpemUsIHBjcmVsLCBwaWMpCi0gICAgIGludCBzaXplOwotICAgICBpbnQgcGNyZWw7Ci0gICAgIGVudW0gcGljX3JlbG9jYXRpb24gcGljOwotewotICBzd2l0Y2ggKHBpYykKLSAgICB7Ci0gICAgY2FzZSBwaWNfZ290X3BjcmVsOgotICAgICAgc3dpdGNoIChzaXplKQotCXsKLQljYXNlIDE6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzhfR09UX1BDUkVMOwotCWNhc2UgMjoKLQkgIHJldHVybiBCRkRfUkVMT0NfMTZfR09UX1BDUkVMOwotCWNhc2UgNDoKLQkgIHJldHVybiBCRkRfUkVMT0NfMzJfR09UX1BDUkVMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBwaWNfZ290X29mZjoKLSAgICAgIHN3aXRjaCAoc2l6ZSkKLQl7Ci0JY2FzZSAxOgotCSAgcmV0dXJuIEJGRF9SRUxPQ184X0dPVE9GRjsKLQljYXNlIDI6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzE2X0dPVE9GRjsKLQljYXNlIDQ6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzMyX0dPVE9GRjsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcGljX3BsdF9wY3JlbDoKLSAgICAgIHN3aXRjaCAoc2l6ZSkKLQl7Ci0JY2FzZSAxOgotCSAgcmV0dXJuIEJGRF9SRUxPQ184X1BMVF9QQ1JFTDsKLQljYXNlIDI6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTDsKLQljYXNlIDQ6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcGljX3BsdF9vZmY6Ci0gICAgICBzd2l0Y2ggKHNpemUpCi0JewotCWNhc2UgMToKLQkgIHJldHVybiBCRkRfUkVMT0NfOF9QTFRPRkY7Ci0JY2FzZSAyOgotCSAgcmV0dXJuIEJGRF9SRUxPQ18xNl9QTFRPRkY7Ci0JY2FzZSA0OgotCSAgcmV0dXJuIEJGRF9SRUxPQ18zMl9QTFRPRkY7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHBpY19ub25lOgotICAgICAgaWYgKHBjcmVsKQotCXsKLQkgIHN3aXRjaCAoc2l6ZSkKLQkgICAgewotCSAgICBjYXNlIDE6Ci0JICAgICAgcmV0dXJuIEJGRF9SRUxPQ184X1BDUkVMOwotCSAgICBjYXNlIDI6Ci0JICAgICAgcmV0dXJuIEJGRF9SRUxPQ18xNl9QQ1JFTDsKLQkgICAgY2FzZSA0OgotCSAgICAgIHJldHVybiBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChzaXplKQotCSAgICB7Ci0JICAgIGNhc2UgMToKLQkgICAgICByZXR1cm4gQkZEX1JFTE9DXzg7Ci0JICAgIGNhc2UgMjoKLQkgICAgICByZXR1cm4gQkZEX1JFTE9DXzE2OwotCSAgICBjYXNlIDQ6Ci0JICAgICAgcmV0dXJuIEJGRF9SRUxPQ18zMjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKHBjcmVsKQotICAgIHsKLSAgICAgIGlmIChwaWMgPT0gcGljX25vbmUpCi0JYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbiIpLCBzaXplKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSBwaWMgcmVsb2NhdGlvbiIpLCBzaXplKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocGljID09IHBpY19ub25lKQotCWFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHJlbG9jYXRpb24iKSwgc2l6ZSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgcGljIHJlbG9jYXRpb24iKSwgc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiBCRkRfUkVMT0NfTk9ORTsKLX0KLQotLyogSGVyZSB3ZSBkZWNpZGUgd2hpY2ggZml4dXBzIGNhbiBiZSBhZGp1c3RlZCB0byBtYWtlIHRoZW0gcmVsYXRpdmUKLSAgIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY3Rpb24gaW5zdGVhZCBvZiB0aGUgc3ltYm9sLiAgQmFzaWNhbGx5Ci0gICB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBkeW5hbWljIHJlbG9jYXRpb25zIGFyZSBkb25lCi0gICBjb3JyZWN0bHksIHNvIGluIHNvbWUgY2FzZXMgd2UgZm9yY2UgdGhlIG9yaWdpbmFsIHN5bWJvbCB0byBiZQotICAgdXNlZC4gICovCi1pbnQKLXRjX202OGtfZml4X2FkanVzdGFibGUgKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLwotICBpZiAoU19JU19FWFRFUk5BTCAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICB8fCBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBhZGp1c3RfcmVsb2Nfc3ltcyBkb2Vzbid0IGtub3cgYWJvdXQgdGhlIEdPVCAqLwotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfOF9HT1RfUENSRUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UX1BDUkVMOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTDoKLSAgICBjYXNlIEJGRF9SRUxPQ184X0dPVE9GRjoKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9HT1RPRkY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfR09UT0ZGOgotICAgIGNhc2UgQkZEX1JFTE9DXzhfUExUX1BDUkVMOgotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTDoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QTFRfUENSRUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfOF9QTFRPRkY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUExUT0ZGOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BMVE9GRjoKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotfQotCi0jZWxzZSAvKiAhT0JKX0VMRiAqLwotCi0jZGVmaW5lIGdldF9yZWxvY19jb2RlKFNJWkUsUENSRUwsT1RIRVIpIE5PX1JFTE9DCi0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotCi0gIGlmIChmaXhwLT5meF90Y2JpdCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19OT05FKQotICAgIHsKLSAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0KLSAgICAgIC8qIFNpbmNlIERJRkZfRVhQUl9PSyBpcyBkZWZpbmVkIGluIHRjLW02OGsuaCwgaXQgaXMgcG9zc2libGUKLSAgICAgICAgIHRoYXQgZml4dXBfc2VnbWVudCBjb252ZXJ0ZWQgYSBub24tUEMgcmVsYXRpdmUgcmVsb2MgaW50byBhCi0gICAgICAgICBQQyByZWxhdGl2ZSByZWxvYy4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlCi0gICAgICAgICByZWxvYyBjb2RlLiAgKi8KLSAgICAgIGlmIChmaXhwLT5meF9wY3JlbCkKLQl7Ci0JICBzd2l0Y2ggKGNvZGUpCi0JICAgIHsKLQkgICAgY2FzZSBCRkRfUkVMT0NfODoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzhfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMTZfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzhfUENSRUw6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOgotCSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKLQkgICAgY2FzZSBCRkRfUkVMT0NfOF9HT1RfUENSRUw6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTDoKLQkgICAgY2FzZSBCRkRfUkVMT0NfMzJfR09UX1BDUkVMOgotCSAgICBjYXNlIEJGRF9SRUxPQ184X0dPVE9GRjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UT0ZGOgotCSAgICBjYXNlIEJGRF9SRUxPQ18zMl9HT1RPRkY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzhfUExUX1BDUkVMOgotCSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QTFRfUENSRUw6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTDoKLQkgICAgY2FzZSBCRkRfUkVMT0NfOF9QTFRPRkY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BMVE9GRjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfMzJfUExUT0ZGOgotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICBfKCJDYW5ub3QgbWFrZSAlcyByZWxvY2F0aW9uIFBDIHJlbGF0aXZlIiksCi0JCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jZGVmaW5lIEYoU1osUENSRUwpCQkoKChTWikgPDwgMSkgKyAoUENSRUwpKQotICAgICAgc3dpdGNoIChGIChmaXhwLT5meF9zaXplLCBmaXhwLT5meF9wY3JlbCkpCi0JewotI2RlZmluZSBNQVAoU1osUENSRUwsVFlQRSkJY2FzZSBGKFNaLFBDUkVMKTogY29kZSA9IChUWVBFKTsgYnJlYWsKLQkgIE1BUCAoMSwgMCwgQkZEX1JFTE9DXzgpOwotCSAgTUFQICgyLCAwLCBCRkRfUkVMT0NfMTYpOwotCSAgTUFQICg0LCAwLCBCRkRfUkVMT0NfMzIpOwotCSAgTUFQICgxLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0JICBNQVAgKDIsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0JICBNQVAgKDQsIDEsIEJGRF9SRUxPQ18zMl9QQ1JFTCk7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0jdW5kZWYgRgotI3VuZGVmIE1BUAotCi0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9ICZmaXhwLT5meF9hZGRzeS0+YnN5bTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+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+bW9kZSAhPSBEUkVHKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnRic6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBGUFJFRykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0knOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAotCQkgICAgICB8fCBvcFAtPnJlZyA8IENPUDAKLQkJICAgICAgfHwgb3BQLT5yZWcgPiBDT1A3KQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnSic6Ci0JCSAgaWYgKG9wUC0+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+bW9kZSAhPSBBQlNMKQotCQkgICAgKytsb3Npbmc7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJfQkJLyogc3dpdGNoIG9uIHR5cGUgb2Ygb3BlcmFuZCAqLwotCi0JICAgICAgaWYgKGxvc2luZykKLQkJYnJlYWs7Ci0JICAgIH0JCQkvKiBmb3IgZWFjaCBvcGVyYW5kICovCi0JfQkJCS8qIGlmIGltbWVkaWF0ZWx5IHdyb25nICovCi0KLSAgICAgIGlmICghbG9zaW5nKQotCXsKLQkgIGJyZWFrOwotCX0JCQkvKiBnb3QgaXQuICovCi0KLSAgICAgIG9wY29kZSA9IG9wY29kZS0+bV9uZXh0OwotCi0gICAgICBpZiAoIW9wY29kZSkKLQl7Ci0JICBpZiAob2tfYXJjaAotCSAgICAgICYmICEob2tfYXJjaCAmIGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKLQkgICAgewotCSAgICAgIGNoYXIgYnVmWzIwMF0sICpjcDsKLQotCSAgICAgIHN0cmNweSAoYnVmLAotCQkgICAgICBfKCJpbnZhbGlkIGluc3RydWN0aW9uIGZvciB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgIikpOwotCSAgICAgIGNwID0gYnVmICsgc3RybGVuIChidWYpOwotCSAgICAgIHN3aXRjaCAob2tfYXJjaCkKLQkJewotCQljYXNlIG1mbG9hdDoKLQkJICBzdHJjcHkgKGNwLCBfKCJmcHUgKDY4MDQwLCA2ODA2MCBvciA2ODg4MS82ODg4MikiKSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgbW1tdToKLQkJICBzdHJjcHkgKGNwLCBfKCJtbXUgKDY4MDMwIG9yIDY4ODUxKSIpKTsKLQkJICBicmVhazsKLQkJY2FzZSBtNjgwMjB1cDoKLQkJICBzdHJjcHkgKGNwLCBfKCI2ODAyMCBvciBoaWdoZXIiKSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgbTY4MDAwdXA6Ci0JCSAgc3RyY3B5IChjcCwgXygiNjgwMDAgb3IgaGlnaGVyIikpOwotCQkgIGJyZWFrOwotCQljYXNlIG02ODAxMHVwOgotCQkgIHN0cmNweSAoY3AsIF8oIjY4MDEwIG9yIGhpZ2hlciIpKTsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICB7Ci0JCSAgICBpbnQgZ290X29uZSA9IDAsIGlkeDsKLQkJICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgc2l6ZW9mIChhcmNocykgLyBzaXplb2YgKGFyY2hzWzBdKTsKLQkJCSBpZHgrKykKLQkJICAgICAgewotCQkJaWYgKChhcmNoc1tpZHhdLmFyY2ggJiBva19hcmNoKQotCQkJICAgICYmICEgYXJjaHNbaWR4XS5hbGlhcykKLQkJCSAgewotCQkJICAgIGlmIChnb3Rfb25lKQotCQkJICAgICAgewotCQkJCXN0cmNweSAoY3AsICIgb3IgIik7Ci0JCQkJY3AgKz0gc3RybGVuIChjcCk7Ci0JCQkgICAgICB9Ci0JCQkgICAgZ290X29uZSA9IDE7Ci0JCQkgICAgc3RyY3B5IChjcCwgYXJjaHNbaWR4XS5uYW1lKTsKLQkJCSAgICBjcCArPSBzdHJsZW4gKGNwKTsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgfQotCQl9Ci0JICAgICAgY3AgPSB4bWFsbG9jIChzdHJsZW4gKGJ1ZikgKyAxKTsKLQkgICAgICBzdHJjcHkgKGNwLCBidWYpOwotCSAgICAgIHRoZV9pbnMuZXJyb3IgPSBjcDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB0aGVfaW5zLmVycm9yID0gXygib3BlcmFuZHMgbWlzbWF0Y2giKTsKLQkgIHJldHVybjsKLQl9CQkJLyogRmVsbCBvZmYgdGhlIGVuZCAqLwotCi0gICAgICBsb3NpbmcgPSAwOwotICAgIH0KLQotICAvKiBub3cgYXNzZW1ibGUgaXQgKi8KLQotICB0aGVfaW5zLmFyZ3MgPSBvcGNvZGUtPm1fb3BlcmFuZHM7Ci0gIHRoZV9pbnMubnVtYXJncyA9IG9wY29kZS0+bV9vcG51bTsKLSAgdGhlX2lucy5udW1vID0gb3Bjb2RlLT5tX2NvZGVudW07Ci0gIHRoZV9pbnMub3Bjb2RlWzBdID0gZ2V0b25lIChvcGNvZGUpOwotICB0aGVfaW5zLm9wY29kZVsxXSA9IGdldHR3byAob3Bjb2RlKTsKLQotICBmb3IgKHMgPSB0aGVfaW5zLmFyZ3MsIG9wUCA9ICZ0aGVfaW5zLm9wZXJhbmRzWzBdOyAqczsgcyArPSAyLCBvcFArKykKLSAgICB7Ci0gICAgICAvKiBUaGlzIHN3aXRjaCBpcyBhIGRvb3p5LgotICAgICAgIFdhdGNoIHRoZSBmaXJzdCBzdGVwOyBpdHMgYSBiaWcgb25lISAqLwotICAgICAgc3dpdGNoIChzWzBdKQotCXsKLQotCWNhc2UgJyonOgotCWNhc2UgJ34nOgotCWNhc2UgJyUnOgotCWNhc2UgJzsnOgotCWNhc2UgJ0AnOgotCWNhc2UgJyEnOgotCWNhc2UgJyYnOgotCWNhc2UgJyQnOgotCWNhc2UgJz8nOgotCWNhc2UgJy8nOgotCWNhc2UgJzwnOgotCWNhc2UgJz4nOgotCWNhc2UgJ20nOgotCWNhc2UgJ24nOgotCWNhc2UgJ28nOgotCWNhc2UgJ3AnOgotCWNhc2UgJ3EnOgotCWNhc2UgJ3YnOgotI2lmbmRlZiBOT182ODg1MQotCWNhc2UgJ3wnOgotI2VuZGlmCi0JICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkgICAgewotCSAgICBjYXNlIElNTUVEOgotCSAgICAgIHRtcHJlZyA9IDB4M2M7CS8qIDcuNCAqLwotCSAgICAgIGlmIChzdHJjaHIgKCJid2wiLCBzWzFdKSkKLQkJbmV4dHdvcmQgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCA4MCk7Ci0JICAgICAgZWxzZQotCQluZXh0d29yZCA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDApOwotCSAgICAgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCWFkZF9maXggKHNbMV0sICZvcFAtPmRpc3AsIDAsIDApOwotCSAgICAgIHN3aXRjaCAoc1sxXSkKLQkJewotCQljYXNlICdiJzoKLQkJICBpZiAoIWlzYnl0ZSAobmV4dHdvcmQpKQotCQkgICAgb3BQLT5lcnJvciA9IF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlIik7Ci0JCSAgYWRkd29yZCAobmV4dHdvcmQpOwotCQkgIGJhc2VvID0gMDsKLQkJICBicmVhazsKLQkJY2FzZSAndyc6Ci0JCSAgaWYgKCFpc3dvcmQgKG5leHR3b3JkKSkKLQkJICAgIG9wUC0+ZXJyb3IgPSBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSIpOwotCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKLQkJICBiYXNlbyA9IDA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1cnOgotCQkgIGlmICghaXNzd29yZCAobmV4dHdvcmQpKQotCQkgICAgb3BQLT5lcnJvciA9IF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlIik7Ci0JCSAgYWRkd29yZCAobmV4dHdvcmQpOwotCQkgIGJhc2VvID0gMDsKLQkJICBicmVhazsKLQkJY2FzZSAnbCc6Ci0JCSAgYWRkd29yZCAobmV4dHdvcmQgPj4gMTYpOwotCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKLQkJICBiYXNlbyA9IDA7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnZic6Ci0JCSAgYmFzZW8gPSAyOwotCQkgIG91dHJvID0gODsKLQkJICBicmVhazsKLQkJY2FzZSAnRic6Ci0JCSAgYmFzZW8gPSA0OwotCQkgIG91dHJvID0gMTE7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3gnOgotCQkgIGJhc2VvID0gNjsKLQkJICBvdXRybyA9IDE1OwotCQkgIGJyZWFrOwotCQljYXNlICdwJzoKLQkJICBiYXNlbyA9IDY7Ci0JCSAgb3V0cm8gPSAtMTsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGlmICghYmFzZW8pCi0JCWJyZWFrOwotCi0JICAgICAgLyogV2UgZ290dGEgcHV0IG91dCBzb21lIGZsb2F0ICovCi0JICAgICAgaWYgKG9wICgmb3BQLT5kaXNwKSAhPSBPX2JpZykKLQkJewotCQkgIHZhbHVlVCB2YWw7Ci0JCSAgaW50IGdlbmNudDsKLQotCQkgIC8qIENhbiBvdGhlciBjYXNlcyBoYXBwZW4gaGVyZT8gICovCi0JCSAgaWYgKG9wICgmb3BQLT5kaXNwKSAhPSBPX2NvbnN0YW50KQotCQkgICAgYWJvcnQgKCk7Ci0KLQkJICB2YWwgPSAodmFsdWVUKSBvZmZzICgmb3BQLT5kaXNwKTsKLQkJICBnZW5jbnQgPSAwOwotCQkgIGRvCi0JCSAgICB7Ci0JCSAgICAgIGdlbmVyaWNfYmlnbnVtW2dlbmNudF0gPSAoTElUVExFTlVNX1RZUEUpIHZhbDsKLQkJICAgICAgdmFsID4+PSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JCSAgICAgICsrZ2VuY250OwotCQkgICAgfQotCQkgIHdoaWxlICh2YWwgIT0gMCk7Ci0JCSAgb2ZmcyAoJm9wUC0+ZGlzcCkgPSBnZW5jbnQ7Ci0JCX0KLQkgICAgICBpZiAob2ZmcyAoJm9wUC0+ZGlzcCkgPiAwKQotCQl7Ci0JCSAgaWYgKG9mZnMgKCZvcFAtPmRpc3ApID4gYmFzZW8pCi0JCSAgICB7Ci0JCSAgICAgIGFzX3dhcm4gKF8oIkJpZ251bSB0b28gYmlnIGZvciAlYyBmb3JtYXQ7IHRydW5jYXRlZCIpLAotCQkJICAgICAgIHNbMV0pOwotCQkgICAgICBvZmZzICgmb3BQLT5kaXNwKSA9IGJhc2VvOwotCQkgICAgfQotCQkgIGJhc2VvIC09IG9mZnMgKCZvcFAtPmRpc3ApOwotCQkgIHdoaWxlIChiYXNlby0tKQotCQkgICAgYWRkd29yZCAoMCk7Ci0JCSAgZm9yICh3b3JkcCA9IGdlbmVyaWNfYmlnbnVtICsgb2ZmcyAoJm9wUC0+ZGlzcCkgLSAxOwotCQkgICAgICAgb2ZmcyAoJm9wUC0+ZGlzcCktLTsKLQkJICAgICAgIC0td29yZHApCi0JCSAgICBhZGR3b3JkICgqd29yZHApOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgZ2VuX3RvX3dvcmRzICh3b3JkcywgYmFzZW8sIChsb25nKSBvdXRybyk7Ci0JICAgICAgZm9yICh3b3JkcCA9IHdvcmRzOyBiYXNlby0tOyB3b3JkcCsrKQotCQlhZGR3b3JkICgqd29yZHApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERSRUc6Ci0JICAgICAgdG1wcmVnID0gb3BQLT5yZWcgLSBEQVRBOwkvKiAwLmRyZWcgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkVHOgotCSAgICAgIHRtcHJlZyA9IDB4MDggKyBvcFAtPnJlZyAtIEFERFI7CS8qIDEuYXJlZyAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFJTkRSOgotCSAgICAgIHRtcHJlZyA9IDB4MTAgKyBvcFAtPnJlZyAtIEFERFI7CS8qIDIuYXJlZyAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFERUM6Ci0JICAgICAgdG1wcmVnID0gMHgyMCArIG9wUC0+cmVnIC0gQUREUjsJLyogNC5hcmVnICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUlOQzoKLQkgICAgICB0bXByZWcgPSAweDE4ICsgb3BQLT5yZWcgLSBBRERSOwkvKiAzLmFyZWcgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBESVNQOgotCi0JICAgICAgbmV4dHdvcmQgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCA4MCk7Ci0KLQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMKLQkJICAmJiAhIGlzdmFyICgmb3BQLT5kaXNwKQotCQkgICYmIG02OGtfYWJzcGNhZGQpCi0JCXsKLQkJICBvcFAtPmRpc3AuZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotCQkgIG9wUC0+ZGlzcC5leHAuWF9hZGRfc3ltYm9sID0gJmFic19zeW1ib2w7Ci0jZWxzZQotCQkgIG9wUC0+ZGlzcC5leHAuWF9hZGRfc3ltYm9sID0KLQkJICAgIHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKTsKLSNlbmRpZgotCQl9Ci0KLQkgICAgICAvKiBGb3JjZSBpbnRvIGluZGV4IG1vZGUuICBIb3BlIHRoaXMgd29ya3MgKi8KLQotCSAgICAgIC8qIFdlIGRvIHRoZSBmaXJzdCBiaXQgZm9yIDMyLWJpdCBkaXNwbGFjZW1lbnRzLCBhbmQgdGhlCi0JCSBzZWNvbmQgYml0IGZvciAxNiBiaXQgb25lcy4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgd2UKLQkJIHNob3VsZCBtYWtlIHRoZSBkZWZhdWx0IGJlIFdPUkQgaW5zdGVhZCBvZiBMT05HLCBidXQKLQkJIEkgdGhpbmsgdGhhdCdkIGJyZWFrIEdDQywgc28gd2UgcHV0IHVwIHdpdGggYSBsaXR0bGUKLQkJIGluZWZmaWNpZW5jeSBmb3IgdGhlIHNha2Ugb2Ygd29ya2luZyBvdXRwdXQuICAqLwotCi0JICAgICAgaWYgKCFpc3N3b3JkIChuZXh0d29yZCkKLQkJICB8fCAoaXN2YXIgKCZvcFAtPmRpc3ApCi0JCSAgICAgICYmICgob3BQLT5kaXNwLnNpemUgPT0gU0laRV9VTlNQRUMKLQkJCSAgICYmIGZsYWdfc2hvcnRfcmVmcyA9PSAwCi0JCQkgICAmJiBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpID49IG02ODAyMAotCQkJICAgJiYgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSAhPSBtY2Y1MjAwKQotCQkJICB8fCBvcFAtPmRpc3Auc2l6ZSA9PSBTSVpFX0xPTkcpKSkKLQkJewotCQkgIGlmIChjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpIDwgbTY4MDIwCi0JCSAgICAgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gbWNmNTIwMCkKLQkJICAgIG9wUC0+ZXJyb3IgPQotCQkgICAgICBfKCJkaXNwbGFjZW1lbnQgdG9vIGxhcmdlIGZvciB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgNjgwMjAgb3IgaGlnaGVyIik7Ci0JCSAgaWYgKG9wUC0+cmVnID09IFBDKQotCQkgICAgdG1wcmVnID0gMHgzQjsJLyogNy4zICovCi0JCSAgZWxzZQotCQkgICAgdG1wcmVnID0gMHgzMCArIG9wUC0+cmVnIC0gQUREUjsJLyogNi5hcmVnICovCi0JCSAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkJICAgIHsKLQkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDKQotCQkJewotCQkJICBpZiAob3BQLT5kaXNwLnNpemUgPT0gU0laRV9MT05HCi0jaWZkZWYgT0JKX0VMRgotCQkJICAgICAgLyogSWYgdGhlIGRpc3BsYWNlbWVudCBuZWVkcyBwaWMKLQkJCQkgcmVsb2NhdGlvbiBpdCBjYW5ub3QgYmUgcmVsYXhlZC4gICovCi0JCQkgICAgICB8fCBvcFAtPmRpc3AucGljX3JlbG9jICE9IHBpY19ub25lCi0jZW5kaWYKLQkJCSAgICAgICkKLQkJCSAgICB7Ci0JCQkgICAgICBhZGR3b3JkICgweDAxNzApOwotCQkJICAgICAgYWRkX2ZpeCAoJ2wnLCAmb3BQLT5kaXNwLCAxLCAyKTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBhZGRfZnJhZyAoYWRkcyAoJm9wUC0+ZGlzcCksCi0JCQkJCW9mZnMgKCZvcFAtPmRpc3ApLAotCQkJCQlUQUIgKFBDTEVBLCBTWl9VTkRFRikpOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGFkZHdvcmQgKDB4MDE3MCk7Ci0JCQkgIGFkZF9maXggKCdsJywgJm9wUC0+ZGlzcCwgMCwgMCk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYWRkd29yZCAoMHgwMTcwKTsKLQkJICBhZGR3b3JkIChuZXh0d29yZCA+PiAxNik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAob3BQLT5yZWcgPT0gUEMpCi0JCSAgICB0bXByZWcgPSAweDNBOwkvKiA3LjIgKi8KLQkJICBlbHNlCi0JCSAgICB0bXByZWcgPSAweDI4ICsgb3BQLT5yZWcgLSBBRERSOwkvKiA1LmFyZWcgKi8KLQotCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQykKLQkJCXsKLQkJCSAgYWRkX2ZpeCAoJ3cnLCAmb3BQLT5kaXNwLCAxLCAwKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJYWRkX2ZpeCAoJ3cnLCAmb3BQLT5kaXNwLCAwLCAwKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGFkZHdvcmQgKG5leHR3b3JkKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFBPU1Q6Ci0JICAgIGNhc2UgUFJFOgotCSAgICBjYXNlIEJBU0U6Ci0JICAgICAgbmV4dHdvcmQgPSAwOwotCSAgICAgIGJhc2VvID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgODApOwotCSAgICAgIGlmIChvcFAtPm1vZGUgPT0gUE9TVCB8fCBvcFAtPm1vZGUgPT0gUFJFKQotCQlvdXRybyA9IGdldF9udW0gKCZvcFAtPm9kaXNwLCA4MCk7Ci0JICAgICAgLyogRmlndXJlIG91dCB0aGUgYGFkZHJlc3NpbmcgbW9kZScuCi0JCSBBbHNvIHR1cm4gb24gdGhlIEJBU0VfRElTQUJMRSBiaXQsIGlmIG5lZWRlZC4gICovCi0JICAgICAgaWYgKG9wUC0+cmVnID09IFBDIHx8IG9wUC0+cmVnID09IFpQQykKLQkJewotCQkgIHRtcHJlZyA9IDB4M2I7CS8qIDcuMyAqLwotCQkgIGlmIChvcFAtPnJlZyA9PSBaUEMpCi0JCSAgICBuZXh0d29yZCB8PSAweDgwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAob3BQLT5yZWcgPT0gMCkKLQkJewotCQkgIG5leHR3b3JkIHw9IDB4ODA7Ci0JCSAgdG1wcmVnID0gMHgzMDsJLyogNi5nYXJiYWdlICovCi0JCX0KLQkgICAgICBlbHNlIGlmIChvcFAtPnJlZyA+PSBaQUREUjAgJiYgb3BQLT5yZWcgPD0gWkFERFI3KQotCQl7Ci0JCSAgbmV4dHdvcmQgfD0gMHg4MDsKLQkJICB0bXByZWcgPSAweDMwICsgb3BQLT5yZWcgLSBaQUREUjA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXRtcHJlZyA9IDB4MzAgKyBvcFAtPnJlZyAtIEFERFI7CS8qIDYuYXJlZyAqLwotCi0JICAgICAgc2l6MSA9IG9wUC0+ZGlzcC5zaXplOwotCSAgICAgIGlmIChvcFAtPm1vZGUgPT0gUE9TVCB8fCBvcFAtPm1vZGUgPT0gUFJFKQotCQlzaXoyID0gb3BQLT5vZGlzcC5zaXplOwotCSAgICAgIGVsc2UKLQkJc2l6MiA9IFNJWkVfVU5TUEVDOwotCi0JICAgICAgLyogSW5kZXggcmVnaXN0ZXIgc3R1ZmYgKi8KLQkgICAgICBpZiAob3BQLT5pbmRleC5yZWcgIT0gMAotCQkgICYmIG9wUC0+aW5kZXgucmVnID49IERBVEEKLQkJICAmJiBvcFAtPmluZGV4LnJlZyA8PSBBRERSNykKLQkJewotCQkgIG5leHR3b3JkIHw9IChvcFAtPmluZGV4LnJlZyAtIERBVEEpIDw8IDEyOwotCi0JCSAgaWYgKG9wUC0+aW5kZXguc2l6ZSA9PSBTSVpFX0xPTkcKLQkJICAgICAgfHwgKG9wUC0+aW5kZXguc2l6ZSA9PSBTSVpFX1VOU1BFQwotCQkJICAmJiBtNjhrX2luZGV4X3dpZHRoX2RlZmF1bHQgPT0gU0laRV9MT05HKSkKLQkJICAgIG5leHR3b3JkIHw9IDB4ODAwOwotCi0JCSAgaWYgKChvcFAtPmluZGV4LnNjYWxlICE9IDEgCi0JCSAgICAgICAmJiBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpIDwgbTY4MDIwKQotCQkgICAgICB8fCAob3BQLT5pbmRleC5zY2FsZSA9PSA4IAotCQkJICAmJiBjdXJyZW50X2FyY2hpdGVjdHVyZSA9PSBtY2Y1MjAwKSkKLQkJICAgIHsKLQkJICAgICAgb3BQLT5lcnJvciA9Ci0JCQlfKCJzY2FsZSBmYWN0b3IgaW52YWxpZCBvbiB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgY3B1MzIgb3IgNjgwMjAgb3IgaGlnaGVyIik7Ci0JCSAgICB9Ci0KLQkJICBzd2l0Y2ggKG9wUC0+aW5kZXguc2NhbGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIDE6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAyOgotCQkgICAgICBuZXh0d29yZCB8PSAweDIwMDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDQ6Ci0JCSAgICAgIG5leHR3b3JkIHw9IDB4NDAwOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgODoKLQkJICAgICAgbmV4dHdvcmQgfD0gMHg2MDA7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYWJvcnQgKCk7Ci0JCSAgICB9Ci0JCSAgLyogSUYgaXRzIHNpbXBsZSwKLQkJICAgICBHRVQgVVMgT1VUIE9GIEhFUkUhICovCi0KLQkJICAvKiBNdXN0IGJlIElOREVYLCB3aXRoIGFuIGluZGV4IHJlZ2lzdGVyLiAgQWRkcmVzcwotCQkgICAgIHJlZ2lzdGVyIGNhbm5vdCBiZSBaRVJPLVBDLCBhbmQgZWl0aGVyIDpiIHdhcwotCQkgICAgIGZvcmNlZCwgb3Igd2Uga25vdyBpdCB3aWxsIGZpdC4gIEZvciBhIDY4MDAwIG9yCi0JCSAgICAgNjgwMTAsIGZvcmNlIHRoaXMgbW9kZSBhbnl3YXlzLCBiZWNhdXNlIHRoZQotCQkgICAgIGxhcmdlciBtb2RlcyBhcmVuJ3Qgc3VwcG9ydGVkLiAgKi8KLQkJICBpZiAob3BQLT5tb2RlID09IEJBU0UKLQkJICAgICAgJiYgKChvcFAtPnJlZyA+PSBBRERSMAotCQkJICAgJiYgb3BQLT5yZWcgPD0gQUREUjcpCi0JCQkgIHx8IG9wUC0+cmVnID09IFBDKSkKLQkJICAgIHsKLQkJICAgICAgaWYgKHNpejEgPT0gU0laRV9CWVRFCi0JCQkgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKLQkJCSAgfHwgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA9PSBtY2Y1MjAwCi0JCQkgIHx8IChzaXoxID09IFNJWkVfVU5TUEVDCi0JCQkgICAgICAmJiAhIGlzdmFyICgmb3BQLT5kaXNwKQotCQkJICAgICAgJiYgaXNzYnl0ZSAoYmFzZW8pKSkKLQkJCXsKLSAJCQkgIG5leHR3b3JkICs9IGJhc2VvICYgMHhmZjsKLSAJCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKLSAJCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCQkgICAgewotCQkJICAgICAgLyogRG8gYSBieXRlIHJlbG9jYXRpb24uICBJZiBpdCBkb2Vzbid0Ci0JCQkJIGZpdCAocG9zc2libGUgb24gbTY4MDAwKSBsZXQgdGhlCi0JCQkJIGZpeHVwIHByb2Nlc3NpbmcgY29tcGxhaW4gbGF0ZXIuICAqLwotCQkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDKQotCQkJCWFkZF9maXggKCdCJywgJm9wUC0+ZGlzcCwgMSwgMSk7Ci0JCQkgICAgICBlbHNlCi0JCQkJYWRkX2ZpeCAoJ0InLCAmb3BQLT5kaXNwLCAwLCAwKTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UgaWYgKHNpejEgIT0gU0laRV9CWVRFKQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChzaXoxICE9IFNJWkVfVU5TUEVDKQotCQkJCWFzX3dhcm4gKF8oIkZvcmNpbmcgYnl0ZSBkaXNwbGFjZW1lbnQiKSk7Ci0JCQkgICAgICBpZiAoISBpc3NieXRlIChiYXNlbykpCi0JCQkJb3BQLT5lcnJvciA9IF8oImJ5dGUgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZSIpOwotCQkJICAgIH0KLQotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc2l6MSA9PSBTSVpFX1VOU1BFQwotCQkJICAgICAgICYmIG9wUC0+cmVnID09IFBDCi0JCQkgICAgICAgJiYgaXN2YXIgKCZvcFAtPmRpc3ApCi0JCQkgICAgICAgJiYgc3VicyAoJm9wUC0+ZGlzcCkgPT0gTlVMTAotI2lmZGVmIE9CSl9FTEYKLQkJCSAgICAgICAvKiBJZiB0aGUgZGlzcGxhY2VtZW50IG5lZWRzIHBpYwotCQkJCSAgcmVsb2NhdGlvbiBpdCBjYW5ub3QgYmUgcmVsYXhlZC4gICovCi0JCQkgICAgICAgJiYgb3BQLT5kaXNwLnBpY19yZWxvYyA9PSBwaWNfbm9uZQotI2VuZGlmCi0JCQkgICAgICAgKQotCQkJewotCQkJICAvKiBUaGUgY29kZSBpbiBtZF9jb252ZXJ0X2ZyYWdfMSBuZWVkcyB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYmxlIHRvIGFkanVzdCBuZXh0d29yZC4gIENhbGwgZnJhZ19ncm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUgZW5vdWdoIHNwYWNlIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmcmFnIG9ic3RhY2sgdG8gbWFrZSBhbGwgdGhlIGJ5dGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpZ3VvdXMuICAqLwotCQkJICBmcmFnX2dyb3cgKDE0KTsKLSAJCQkgIG5leHR3b3JkICs9IGJhc2VvICYgMHhmZjsKLSAJCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKLSAJCQkgIGFkZF9mcmFnIChhZGRzICgmb3BQLT5kaXNwKSwgb2ZmcyAoJm9wUC0+ZGlzcCksCi0gCQkJCSAgICBUQUIgKFBDSU5ERVgsIFNaX1VOREVGKSk7Ci0KLQkJCSAgYnJlYWs7Ci0gCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbmV4dHdvcmQgfD0gMHg0MDsJLyogTm8gaW5kZXggcmVnICovCi0JCSAgaWYgKG9wUC0+aW5kZXgucmVnID49IFpEQVRBMAotCQkgICAgICAmJiBvcFAtPmluZGV4LnJlZyA8PSBaREFUQTcpCi0JCSAgICBuZXh0d29yZCB8PSAob3BQLT5pbmRleC5yZWcgLSBaREFUQTApIDw8IDEyOwotCQkgIGVsc2UgaWYgKG9wUC0+aW5kZXgucmVnID49IFpBRERSMAotCQkJICAgfHwgb3BQLT5pbmRleC5yZWcgPD0gWkFERFI3KQotCQkgICAgbmV4dHdvcmQgfD0gKG9wUC0+aW5kZXgucmVnIC0gWkFERFIwICsgOCkgPDwgMTI7Ci0JCX0KLQotCSAgICAgIC8qIEl0IGlzbid0IHNpbXBsZS4gICovCi0KLQkgICAgICBpZiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA8IG02ODAyMAotCQkgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gbWNmNTIwMCkKLQkJb3BQLT5lcnJvciA9Ci0JCSAgXygiaW52YWxpZCBvcGVyYW5kIG1vZGUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyA2ODAyMCBvciBoaWdoZXIiKTsKLQotCSAgICAgIG5leHR3b3JkIHw9IDB4MTAwOwotCSAgICAgIC8qIElmIHRoZSBndXkgc3BlY2lmaWVkIGEgd2lkdGgsIHdlIGFzc3VtZSB0aGF0IGl0IGlzCi0JCSB3aWRlIGVub3VnaC4gIE1heWJlIGl0IGlzbid0LiAgSWYgc28sIHdlIGxvc2UuICAqLwotCSAgICAgIHN3aXRjaCAoc2l6MSkKLQkJewotCQljYXNlIFNJWkVfVU5TUEVDOgotCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkKLQkJICAgICAgPyBtNjhrX3JlbDMyCi0JCSAgICAgIDogISBpc3N3b3JkIChiYXNlbykpCi0JCSAgICB7Ci0JCSAgICAgIHNpejEgPSBTSVpFX0xPTkc7Ci0JCSAgICAgIG5leHR3b3JkIHw9IDB4MzA7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoISBpc3ZhciAoJm9wUC0+ZGlzcCkgJiYgYmFzZW8gPT0gMCkKLQkJICAgIG5leHR3b3JkIHw9IDB4MTA7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBuZXh0d29yZCB8PSAweDIwOwotCQkgICAgICBzaXoxID0gU0laRV9XT1JEOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQljYXNlIFNJWkVfQllURToKLQkJICBhc193YXJuIChfKCI6YiBub3QgcGVybWl0dGVkOyBkZWZhdWx0aW5nIHRvIDp3IikpOwotCQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JCWNhc2UgU0laRV9XT1JEOgotCQkgIG5leHR3b3JkIHw9IDB4MjA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgU0laRV9MT05HOgotCQkgIG5leHR3b3JkIHw9IDB4MzA7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIEZpZ3VyZSBvdXQgaW5ubmVyIGRpc3BsYWNlbWVudCBzdHVmZiAqLwotCSAgICAgIGlmIChvcFAtPm1vZGUgPT0gUE9TVCB8fCBvcFAtPm1vZGUgPT0gUFJFKQotCQl7Ci0JCSAgaWYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgJiBjcHUzMikKLQkJICAgIG9wUC0+ZXJyb3IgPSBfKCJpbnZhbGlkIG9wZXJhbmQgbW9kZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmU7IG5lZWRzIDY4MDIwIG9yIGhpZ2hlciIpOwotCQkgIHN3aXRjaCAoc2l6MikKLQkJICAgIHsKLQkJICAgIGNhc2UgU0laRV9VTlNQRUM6Ci0JCSAgICAgIGlmIChpc3ZhciAoJm9wUC0+b2Rpc3ApCi0JCQkgID8gbTY4a19yZWwzMgotCQkJICA6ICEgaXNzd29yZCAob3V0cm8pKQotCQkJewotCQkJICBzaXoyID0gU0laRV9MT05HOwotCQkJICBuZXh0d29yZCB8PSAweDM7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKCEgaXN2YXIgKCZvcFAtPm9kaXNwKSAmJiBvdXRybyA9PSAwKQotCQkJbmV4dHdvcmQgfD0gMHgxOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIG5leHR3b3JkIHw9IDB4MjsKLQkJCSAgc2l6MiA9IFNJWkVfV09SRDsKLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDE6Ci0JCSAgICAgIGFzX3dhcm4gKF8oIjpiIG5vdCBwZXJtaXR0ZWQ7IGRlZmF1bHRpbmcgdG8gOnciKSk7Ci0JCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JCSAgICBjYXNlIDI6Ci0JCSAgICAgIG5leHR3b3JkIHw9IDB4MjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDM6Ci0JCSAgICAgIG5leHR3b3JkIHw9IDB4MzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgaWYgKG9wUC0+bW9kZSA9PSBQT1NUCi0JCSAgICAgICYmIChuZXh0d29yZCAmIDB4NDApID09IDApCi0JCSAgICBuZXh0d29yZCB8PSAweDA0OwotCQl9Ci0JICAgICAgYWRkd29yZCAobmV4dHdvcmQpOwotCi0JICAgICAgaWYgKHNpejEgIT0gU0laRV9VTlNQRUMgJiYgaXN2YXIgKCZvcFAtPmRpc3ApKQotCQl7Ci0JCSAgaWYgKG9wUC0+cmVnID09IFBDIHx8IG9wUC0+cmVnID09IFpQQykKLQkJICAgIGFkZF9maXggKHNpejEgPT0gU0laRV9MT05HID8gJ2wnIDogJ3cnLCAmb3BQLT5kaXNwLCAxLCAyKTsKLQkJICBlbHNlCi0JCSAgICBhZGRfZml4IChzaXoxID09IFNJWkVfTE9ORyA/ICdsJyA6ICd3JywgJm9wUC0+ZGlzcCwgMCwgMCk7Ci0JCX0KLQkgICAgICBpZiAoc2l6MSA9PSBTSVpFX0xPTkcpCi0JCWFkZHdvcmQgKGJhc2VvID4+IDE2KTsKLQkgICAgICBpZiAoc2l6MSAhPSBTSVpFX1VOU1BFQykKLQkJYWRkd29yZCAoYmFzZW8pOwotCi0JICAgICAgaWYgKHNpejIgIT0gU0laRV9VTlNQRUMgJiYgaXN2YXIgKCZvcFAtPm9kaXNwKSkKLQkJYWRkX2ZpeCAoc2l6MiA9PSBTSVpFX0xPTkcgPyAnbCcgOiAndycsICZvcFAtPm9kaXNwLCAwLCAwKTsKLQkgICAgICBpZiAoc2l6MiA9PSBTSVpFX0xPTkcpCi0JCWFkZHdvcmQgKG91dHJvID4+IDE2KTsKLQkgICAgICBpZiAoc2l6MiAhPSBTSVpFX1VOU1BFQykKLQkJYWRkd29yZCAob3V0cm8pOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBQlNMOgotCSAgICAgIG5leHR3b3JkID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgODApOwotCSAgICAgIHN3aXRjaCAob3BQLT5kaXNwLnNpemUpCi0JCXsKLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJY2FzZSBTSVpFX1VOU1BFQzoKLQkJICBpZiAoIWlzdmFyICgmb3BQLT5kaXNwKSAmJiBpc3N3b3JkIChvZmZzICgmb3BQLT5kaXNwKSkpCi0JCSAgICB7Ci0JCSAgICAgIHRtcHJlZyA9IDB4Mzg7CS8qIDcuMCAqLwotCQkgICAgICBhZGR3b3JkIChuZXh0d29yZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIC8qIERvbid0IGdlbmVyYXRlIHBjIHJlbGF0aXZlIGNvZGUgb24gNjgwMTAgYW5kCi0JCSAgICAgNjgwMDAuICAqLwotCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkKLQkJICAgICAgJiYgIXN1YnMgKCZvcFAtPmRpc3ApCi0JCSAgICAgICYmIGFkZHMgKCZvcFAtPmRpc3ApCi0jaWZkZWYgT0JKX0VMRgotCQkgICAgICAvKiBJZiB0aGUgZGlzcGxhY2VtZW50IG5lZWRzIHBpYyByZWxvY2F0aW9uIGl0Ci0JCQkgY2Fubm90IGJlIHJlbGF4ZWQuICAqLwotCQkgICAgICAmJiBvcFAtPmRpc3AucGljX3JlbG9jID09IHBpY19ub25lCi0jZW5kaWYKLQkJICAgICAgJiYgU19HRVRfU0VHTUVOVCAoYWRkcyAoJm9wUC0+ZGlzcCkpID09IG5vd19zZWcKLQkJICAgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoYWRkcyAoJm9wUC0+ZGlzcCkpCi0JCSAgICAgICYmIEhBVkVfTE9OR19CUkFOQ0goY3VycmVudF9hcmNoaXRlY3R1cmUpCi0JCSAgICAgICYmICFmbGFnX2xvbmdfanVtcHMKLQkJICAgICAgJiYgIXN0cmNociAoIn4lJiQ/Iiwgc1swXSkpCi0JCSAgICB7Ci0JCSAgICAgIHRtcHJlZyA9IDB4M0E7CS8qIDcuMiAqLwotCQkgICAgICBhZGRfZnJhZyAoYWRkcyAoJm9wUC0+ZGlzcCksCi0JCQkJb2ZmcyAoJm9wUC0+ZGlzcCksCi0JCQkJVEFCIChQQ1JFTCwgU1pfVU5ERUYpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgLyogRmFsbCB0aHJvdWdoIGludG8gbG9uZyAqLwotCQljYXNlIFNJWkVfTE9ORzoKLQkJICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQkgICAgYWRkX2ZpeCAoJ2wnLCAmb3BQLT5kaXNwLCAwLCAwKTsKLQotCQkgIHRtcHJlZyA9IDB4Mzk7LyogNy4xIG1vZGUgKi8KLQkJICBhZGR3b3JkIChuZXh0d29yZCA+PiAxNik7Ci0JCSAgYWRkd29yZCAobmV4dHdvcmQpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgU0laRV9CWVRFOgotCQkgIGFzX2JhZCAoXygidW5zdXBwb3J0ZWQgYnl0ZSB2YWx1ZTsgdXNlIGEgZGlmZmVyZW50IHN1ZmZpeCIpKTsKLQkJICAvKiBGYWxsIHRocm91Z2guICAqLwotCQljYXNlIFNJWkVfV09SRDoJLyogV29yZCAqLwotCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCSAgICBhZGRfZml4ICgndycsICZvcFAtPmRpc3AsIDAsIDApOwotCi0JCSAgdG1wcmVnID0gMHgzODsvKiA3LjAgbW9kZSAqLwotCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENPTlRST0w6Ci0JICAgIGNhc2UgRlBSRUc6Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfYmFkIChfKCJ1bmtub3duL2luY29ycmVjdCBvcGVyYW5kIikpOwotCSAgICAgIC8qIGFib3J0KCk7ICovCi0JICAgIH0KLQkgIGluc3RhbGxfZ2VuX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJyMnOgotCWNhc2UgJ14nOgotCSAgc3dpdGNoIChzWzFdKQotCSAgICB7CQkJLyogSkY6IEkgaGF0ZSBmbG9hdGluZyBwb2ludCEgKi8KLQkgICAgY2FzZSAnaic6Ci0JICAgICAgdG1wcmVnID0gNzA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJzgnOgotCSAgICAgIHRtcHJlZyA9IDIwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdDJzoKLQkgICAgICB0bXByZWcgPSA1MDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnMyc6Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgdG1wcmVnID0gODA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIHRtcHJlZyk7Ci0JICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCSAgICBhZGRfZml4IChzWzFdLCAmb3BQLT5kaXNwLCAwLCAwKTsKLQkgIHN3aXRjaCAoc1sxXSkKLQkgICAgewotCSAgICBjYXNlICdiJzoJCS8qIERhbmdlcjogIFRoZXNlIGRvIG5vIGNoZWNrIGZvcgotCQkJCSAgIGNlcnRhaW4gdHlwZXMgb2Ygb3ZlcmZsb3cuCi0JCQkJICAgdXNlciBiZXdhcmUhICovCi0JICAgICAgaWYgKCFpc2J5dGUgKHRtcHJlZykpCi0JCW9wUC0+ZXJyb3IgPSBfKCJvdXQgb2YgcmFuZ2UiKTsKLQkgICAgICBpbnNvcCAodG1wcmVnLCBvcGNvZGUpOwotCSAgICAgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCXRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsIC0gMV0ubiA9Ci0JCSAgKG9wY29kZS0+bV9jb2RlbnVtKSAqIDIgKyAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdCJzoKLQkgICAgICBpZiAoIWlzc2J5dGUgKHRtcHJlZykpCi0JCW9wUC0+ZXJyb3IgPSBfKCJvdXQgb2YgcmFuZ2UiKTsKLQkgICAgICB0aGVfaW5zLm9wY29kZVt0aGVfaW5zLm51bW8gLSAxXSB8PSB0bXByZWcgJiAweGZmOwotCSAgICAgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCXRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsIC0gMV0ubiA9IG9wY29kZS0+bV9jb2RlbnVtICogMiAtIDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3cnOgotCSAgICAgIGlmICghaXN3b3JkICh0bXByZWcpKQotCQlvcFAtPmVycm9yID0gXygib3V0IG9mIHJhbmdlIik7Ci0JICAgICAgaW5zb3AgKHRtcHJlZywgb3Bjb2RlKTsKLQkgICAgICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQl0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbCAtIDFdLm4gPSAob3Bjb2RlLT5tX2NvZGVudW0pICogMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnVyc6Ci0JICAgICAgaWYgKCFpc3N3b3JkICh0bXByZWcpKQotCQlvcFAtPmVycm9yID0gXygib3V0IG9mIHJhbmdlIik7Ci0JICAgICAgaW5zb3AgKHRtcHJlZywgb3Bjb2RlKTsKLQkgICAgICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQl0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbCAtIDFdLm4gPSAob3Bjb2RlLT5tX2NvZGVudW0pICogMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnbCc6Ci0JICAgICAgLyogQmVjYXVzZSBvZiB0aGUgd2F5IGluc29wIHdvcmtzLCB3ZSBwdXQgdGhlc2UgdHdvIG91dAotCQkgYmFja3dhcmRzLiAgKi8KLQkgICAgICBpbnNvcCAodG1wcmVnLCBvcGNvZGUpOwotCSAgICAgIGluc29wICh0bXByZWcgPj4gMTYsIG9wY29kZSk7Ci0JICAgICAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkJdGhlX2lucy5yZWxvY1t0aGVfaW5zLm5yZWwgLSAxXS5uID0gKG9wY29kZS0+bV9jb2RlbnVtKSAqIDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJzMnOgotCSAgICAgIHRtcHJlZyAmPSAweEZGOwotCSAgICBjYXNlICc4JzoKLQkgICAgY2FzZSAnQyc6Ci0JICAgIGNhc2UgJ2onOgotCSAgICAgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICcrJzoKLQljYXNlICctJzoKLQljYXNlICdBJzoKLQljYXNlICdhJzoKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgb3BQLT5yZWcgLSBBRERSKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnQic6Ci0JICB0bXByZWcgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCA4MCk7Ci0JICBzd2l0Y2ggKHNbMV0pCi0JICAgIHsKLQkgICAgY2FzZSAnQic6Ci0JICAgICAgLyogVGhlIHBjX2ZpeCBhcmd1bWVudCB3aW5kcyB1cCBpbiBmeF9wY3JlbF9hZGp1c3QsCi0gICAgICAgICAgICAgICAgIHdoaWNoIGlzIGEgY2hhciwgYW5kIG1heSB0aGVyZWZvcmUgYmUgdW5zaWduZWQuICBXZQotICAgICAgICAgICAgICAgICB3YW50IHRvIHBhc3MgLTEsIGJ1dCB3ZSBwYXNzIDY0IGluc3RlYWQsIGFuZCBjb252ZXJ0Ci0gICAgICAgICAgICAgICAgIGJhY2sgaW4gbWRfcGNyZWxfZnJvbS4gICovCi0JICAgICAgYWRkX2ZpeCAoJ0InLCAmb3BQLT5kaXNwLCAxLCA2NCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ1cnOgotCSAgICAgIGFkZF9maXggKCd3JywgJm9wUC0+ZGlzcCwgMSwgMCk7Ci0JICAgICAgYWRkd29yZCAoMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0wnOgotCSAgICBsb25nX2JyYW5jaDoKLQkgICAgICBpZiAoIUhBVkVfTE9OR19CUkFOQ0goY3VycmVudF9hcmNoaXRlY3R1cmUpKQotCQlhc193YXJuIChfKCJDYW4ndCB1c2UgbG9uZyBicmFuY2hlcyBvbiA2ODAwMC82ODAxMC81MjAwIikpOwotCSAgICAgIHRoZV9pbnMub3Bjb2RlW3RoZV9pbnMubnVtbyAtIDFdIHw9IDB4ZmY7Ci0JICAgICAgYWRkX2ZpeCAoJ2wnLCAmb3BQLT5kaXNwLCAxLCAwKTsKLQkgICAgICBhZGR3b3JkICgwKTsKLQkgICAgICBhZGR3b3JkICgwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnZyc6Ci0JICAgICAgaWYgKHN1YnMgKCZvcFAtPmRpc3ApKQkvKiBXZSBjYW4ndCByZWxheCBpdCAqLwotCQlnb3RvIGxvbmdfYnJhbmNoOwotCi0jaWZkZWYgT0JKX0VMRgotCSAgICAgIC8qIElmIHRoZSBkaXNwbGFjZW1lbnQgbmVlZHMgcGljIHJlbG9jYXRpb24gaXQgY2Fubm90IGJlCi0JCSByZWxheGVkLiAgKi8KLQkgICAgICBpZiAob3BQLT5kaXNwLnBpY19yZWxvYyAhPSBwaWNfbm9uZSkKLQkJZ290byBsb25nX2JyYW5jaDsKLSNlbmRpZgotCi0JICAgICAgLyogVGhpcyBjb3VsZCBlaXRoZXIgYmUgYSBzeW1ib2wsIG9yIGFuIGFic29sdXRlCi0JCSBhZGRyZXNzLiAgTm8gbWF0dGVyLCB0aGUgZnJhZyBoYWNraW5nIHdpbGwgZmluZ2VyIGl0Ci0JCSBvdXQuICBOb3QgcXVpdGU6IGl0IGNhbid0IHN3aXRjaCBmcm9tIEJSQU5DSCB0bwotCQkgQkNDNjgwMDAgZm9yIHRoZSBjYXNlIHdoZXJlIG9wbmQgaXMgYWJzb2x1dGUgKGl0Ci0JCSBuZWVkcyB0byB1c2UgdGhlIDY4MDAwIGhhY2sgc2luY2Ugbm8gY29uZGl0aW9uYWwgYWJzCi0JCSBqdW1wcykuICAqLwotCSAgICAgIGlmICgoICFIQVZFX0xPTkdfQlJBTkNIKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKQotCQkgICB8fCAoMCA9PSBhZGRzICgmb3BQLT5kaXNwKSkpCi0JCSAgJiYgKHRoZV9pbnMub3Bjb2RlWzBdID49IDB4NjIwMCkKLQkJICAmJiAodGhlX2lucy5vcGNvZGVbMF0gPD0gMHg2ZjAwKSkKLQkJYWRkX2ZyYWcgKGFkZHMgKCZvcFAtPmRpc3ApLCBvZmZzICgmb3BQLT5kaXNwKSwKLQkJCSAgVEFCIChCQ0M2ODAwMCwgU1pfVU5ERUYpKTsKLQkgICAgICBlbHNlCi0JCWFkZF9mcmFnIChhZGRzICgmb3BQLT5kaXNwKSwgb2ZmcyAoJm9wUC0+ZGlzcCksCi0JCQkgIFRBQiAoQUJSQU5DSCwgU1pfVU5ERUYpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAndyc6Ci0JICAgICAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkJewotI2lmIDEKLQkJICAvKiBjaGVjayBmb3IgREJjYyBpbnN0cnVjdGlvbiAqLwotCQkgIGlmICgodGhlX2lucy5vcGNvZGVbMF0gJiAweGYwZjgpID09IDB4NTBjOCkKLQkJICAgIHsKLQkJICAgICAgLyogc2l6ZSB2YXJpZXMgaWYgcGF0Y2ggKi8KLQkJICAgICAgLyogbmVlZGVkIGZvciBsb25nIGZvcm0gKi8KLQkJICAgICAgYWRkX2ZyYWcgKGFkZHMgKCZvcFAtPmRpc3ApLCBvZmZzICgmb3BQLT5kaXNwKSwKLQkJCQlUQUIgKERCQ0MsIFNaX1VOREVGKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotI2VuZGlmCi0JCSAgYWRkX2ZpeCAoJ3cnLCAmb3BQLT5kaXNwLCAxLCAwKTsKLQkJfQotCSAgICAgIGFkZHdvcmQgKDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdDJzoJCS8qIEZpeGVkIHNpemUgTE9ORyBjb3Byb2MgYnJhbmNoZXMgKi8KLQkgICAgICBhZGRfZml4ICgnbCcsICZvcFAtPmRpc3AsIDEsIDApOwotCSAgICAgIGFkZHdvcmQgKDApOwotCSAgICAgIGFkZHdvcmQgKDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdjJzoJCS8qIFZhciBzaXplIENvcHJvY2Vzc3NvciBicmFuY2hlcyAqLwotCSAgICAgIGlmIChzdWJzICgmb3BQLT5kaXNwKSkKLQkJewotCQkgIGFkZF9maXggKCdsJywgJm9wUC0+ZGlzcCwgMSwgMCk7Ci0JCSAgYWRkX2ZyYWcgKChzeW1ib2xTICopIDAsIChvZmZzZXRUKSAwLCBUQUIgKEZCUkFOQ0gsIExPTkcpKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGFkZHMgKCZvcFAtPmRpc3ApKQotCQlhZGRfZnJhZyAoYWRkcyAoJm9wUC0+ZGlzcCksIG9mZnMgKCZvcFAtPmRpc3ApLAotCQkJICBUQUIgKEZCUkFOQ0gsIFNaX1VOREVGKSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogYWRkX2ZyYWcgKChzeW1ib2xTICopIDAsIG9mZnMgKCZvcFAtPmRpc3ApLAotCQkgICAgIAkgICAgICAgVEFCKEZCUkFOQ0gsU0hPUlQpKTsgKi8KLQkJICB0aGVfaW5zLm9wY29kZVt0aGVfaW5zLm51bW8gLSAxXSB8PSAweDQwOwotCQkgIGFkZF9maXggKCdsJywgJm9wUC0+ZGlzcCwgMSwgMCk7Ci0JCSAgYWRkd29yZCAoMCk7Ci0JCSAgYWRkd29yZCAoMCk7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdDJzoJCS8qIElnbm9yZSBpdCAqLwotCSAgYnJlYWs7Ci0KLQljYXNlICdkJzoJCS8qIEpGIHRoaXMgaXMgYSBrbHVkZ2UgKi8KLQkgIGluc3RhbGxfb3BlcmFuZCAoJ3MnLCBvcFAtPnJlZyAtIEFERFIpOwotCSAgdG1wcmVnID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgODApOwotCSAgaWYgKCFpc3N3b3JkICh0bXByZWcpKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiRXhwcmVzc2lvbiBvdXQgb2YgcmFuZ2UsIHVzaW5nIDAiKSk7Ci0JICAgICAgdG1wcmVnID0gMDsKLQkgICAgfQotCSAgYWRkd29yZCAodG1wcmVnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnRCc6Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIG9wUC0+cmVnIC0gREFUQSk7Ci0JICBicmVhazsKLQotCWNhc2UgJ0YnOgotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBvcFAtPnJlZyAtIEZQMCk7Ci0JICBicmVhazsKLQotCWNhc2UgJ0knOgotCSAgdG1wcmVnID0gb3BQLT5yZWcgLSBDT1AwOwotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdKJzoJCS8qIEpGIGZvbyAqLwotCSAgc3dpdGNoIChvcFAtPnJlZykKLQkgICAgewotCSAgICBjYXNlIFNGQzoKLQkgICAgICB0bXByZWcgPSAweDAwMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBERkM6Ci0JICAgICAgdG1wcmVnID0gMHgwMDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0FDUjoKLQkgICAgICB0bXByZWcgPSAweDAwMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBUQzoKLQkgICAgICB0bXByZWcgPSAweDAwMzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJVFQwOgotCSAgICAgIHRtcHJlZyA9IDB4MDA0OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElUVDE6Ci0JICAgICAgdG1wcmVnID0gMHgwMDU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFRUMDoKLQkgICAgICB0bXByZWcgPSAweDAwNjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEVFQxOgotCSAgICAgIHRtcHJlZyA9IDB4MDA3OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEJVU0NSOgotCSAgICAgIHRtcHJlZyA9IDB4MDA4OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgVVNQOgotCSAgICAgIHRtcHJlZyA9IDB4ODAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFZCUjoKLQkgICAgICB0bXByZWcgPSAweDgwMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDQUFSOgotCSAgICAgIHRtcHJlZyA9IDB4ODAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE1TUDoKLQkgICAgICB0bXByZWcgPSAweDgwMzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJU1A6Ci0JICAgICAgdG1wcmVnID0gMHg4MDQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTU1VU1I6Ci0JICAgICAgdG1wcmVnID0gMHg4MDU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgVVJQOgotCSAgICAgIHRtcHJlZyA9IDB4ODA2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNSUDoKLQkgICAgICB0bXByZWcgPSAweDgwNzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ1I6Ci0JICAgICAgdG1wcmVnID0gMHg4MDg7Ci0JICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJPTUJBUjoKLQkgICAgICB0bXByZWcgPSAweEMwMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSQU1CQVIwOgotCSAgICAgIHRtcHJlZyA9IDB4QzA0OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJBTUJBUjE6Ci0JICAgICAgdG1wcmVnID0gMHhDMDU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTUJBUjoKLQkgICAgICB0bXByZWcgPSAweEMwRjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdrJzoKLQkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDU1KTsKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnICYgMHg3Zik7Ci0JICBicmVhazsKLQotCWNhc2UgJ2wnOgotCSAgdG1wcmVnID0gb3BQLT5tYXNrOwotCSAgaWYgKHNbMV0gPT0gJ3cnKQotCSAgICB7Ci0JICAgICAgaWYgKHRtcHJlZyAmIDB4N0ZGMDAwMCkKLQkJYXNfYmFkIChfKCJGbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiByZWdpc3RlciBsaXN0IikpOwotCSAgICAgIGluc29wIChyZXZlcnNlXzE2X2JpdHMgKHRtcHJlZyksIG9wY29kZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICh0bXByZWcgJiAweDcwMEZGRkYpCi0JCWFzX2JhZCAoXygiV3JvbmcgcmVnaXN0ZXIgaW4gZmxvYXRpbmctcG9pbnQgcmVnbGlzdCIpKTsKLQkgICAgICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHJldmVyc2VfOF9iaXRzICh0bXByZWcgPj4gMTYpKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdMJzoKLQkgIHRtcHJlZyA9IG9wUC0+bWFzazsKLQkgIGlmIChzWzFdID09ICd3JykKLQkgICAgewotCSAgICAgIGlmICh0bXByZWcgJiAweDdGRjAwMDApCi0JCWFzX2JhZCAoXygiRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gcmVnaXN0ZXIgbGlzdCIpKTsKLQkgICAgICBpbnNvcCAodG1wcmVnLCBvcGNvZGUpOwotCSAgICB9Ci0JICBlbHNlIGlmIChzWzFdID09ICc4JykKLQkgICAgewotCSAgICAgIGlmICh0bXByZWcgJiAweDBGRkZGRkYpCi0JCWFzX2JhZCAoXygiaW5jb3JyZWN0IHJlZ2lzdGVyIGluIHJlZ2xpc3QiKSk7Ci0JICAgICAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcgPj4gMjQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAodG1wcmVnICYgMHg3MDBGRkZGKQotCQlhc19iYWQgKF8oIndyb25nIHJlZ2lzdGVyIGluIGZsb2F0aW5nLXBvaW50IHJlZ2xpc3QiKSk7Ci0JICAgICAgZWxzZQotCQlpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyA+PiAxNik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnTSc6Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIGdldF9udW0gKCZvcFAtPmRpc3AsIDYwKSk7Ci0JICBicmVhazsKLQotCWNhc2UgJ08nOgotCSAgdG1wcmVnID0gKChvcFAtPm1vZGUgPT0gRFJFRykKLQkJICAgID8gMHgyMCArIG9wUC0+cmVnIC0gREFUQQotCQkgICAgOiAoZ2V0X251bSAoJm9wUC0+ZGlzcCwgNDApICYgMHgxRikpOwotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdRJzoKLQkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDEwKTsKLQkgIGlmICh0bXByZWcgPT0gOCkKLQkgICAgdG1wcmVnID0gMDsKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnUic6Ci0JICAvKiBUaGlzIGRlcGVuZHMgb24gdGhlIGZhY3QgdGhhdCBBRERSIHJlZ2lzdGVycyBhcmUgZWlnaHQKLQkgICAgIG1vcmUgdGhhbiB0aGVpciBjb3JyZXNwb25kaW5nIERBVEEgcmVncywgc28gdGhlIHJlc3VsdAotCSAgICAgd2lsbCBoYXZlIHRoZSBBRERSX1JFRyBiaXQgc2V0ICovCi0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIG9wUC0+cmVnIC0gREFUQSk7Ci0JICBicmVhazsKLQotCWNhc2UgJ3InOgotCSAgaWYgKG9wUC0+bW9kZSA9PSBBSU5EUikKLQkgICAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBvcFAtPnJlZyAtIERBVEEpOwotCSAgZWxzZQotCSAgICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIG9wUC0+aW5kZXgucmVnIC0gREFUQSk7Ci0JICBicmVhazsKLQotCWNhc2UgJ3MnOgotCSAgaWYgKG9wUC0+cmVnID09IEZQSSkKLQkgICAgdG1wcmVnID0gMHgxOwotCSAgZWxzZSBpZiAob3BQLT5yZWcgPT0gRlBTKQotCSAgICB0bXByZWcgPSAweDI7Ci0JICBlbHNlIGlmIChvcFAtPnJlZyA9PSBGUEMpCi0JICAgIHRtcHJlZyA9IDB4NDsKLQkgIGVsc2UKLQkgICAgYWJvcnQgKCk7Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ1MnOgkJLyogSWdub3JlIGl0ICovCi0JICBicmVhazsKLQotCWNhc2UgJ1QnOgotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBnZXRfbnVtICgmb3BQLT5kaXNwLCAzMCkpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdVJzoJCS8qIElnbm9yZSBpdCAqLwotCSAgYnJlYWs7Ci0KLQljYXNlICdjJzoKLQkgIHN3aXRjaCAob3BQLT5yZWcpCi0JICAgIHsKLQkgICAgY2FzZSBOQzoKLQkgICAgICB0bXByZWcgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERDOgotCSAgICAgIHRtcHJlZyA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSUM6Ci0JICAgICAgdG1wcmVnID0gMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBCQzoKLQkgICAgICB0bXByZWcgPSAzOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrIikpOwotCSAgICB9CQkJLyogc3dpdGNoIG9uIGNhY2hlIHRva2VuICovCi0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLSNpZm5kZWYgTk9fNjg4NTEKLQkgIC8qIEpGOiBUaGVzZSBhcmUgb3V0IG9mIG9yZGVyLCBJIGZlYXIuICovCi0JY2FzZSAnZic6Ci0JICBzd2l0Y2ggKG9wUC0+cmVnKQotCSAgICB7Ci0JICAgIGNhc2UgU0ZDOgotCSAgICAgIHRtcHJlZyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgREZDOgotCSAgICAgIHRtcHJlZyA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnMCc6Ci0JY2FzZSAnMSc6Ci0JY2FzZSAnMic6Ci0JICBzd2l0Y2ggKG9wUC0+cmVnKQotCSAgICB7Ci0JICAgIGNhc2UgVEM6Ci0JICAgICAgdG1wcmVnID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDQUw6Ci0JICAgICAgdG1wcmVnID0gNDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBWQUw6Ci0JICAgICAgdG1wcmVnID0gNTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTQ0M6Ci0JICAgICAgdG1wcmVnID0gNjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQzoKLQkgICAgICB0bXByZWcgPSA3OwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ1YnOgotCSAgaWYgKG9wUC0+cmVnID09IFZBTCkKLQkgICAgYnJlYWs7Ci0JICBhYm9ydCAoKTsKLQotCWNhc2UgJ1cnOgotCSAgc3dpdGNoIChvcFAtPnJlZykKLQkgICAgewotCSAgICBjYXNlIERSUDoKLQkgICAgICB0bXByZWcgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNSUDoKLQkgICAgICB0bXByZWcgPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENSUDoKLQkgICAgICB0bXByZWcgPSAzOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ1gnOgotCSAgc3dpdGNoIChvcFAtPnJlZykKLQkgICAgewotCSAgICBjYXNlIEJBRDoKLQkgICAgY2FzZSBCQUQgKyAxOgotCSAgICBjYXNlIEJBRCArIDI6Ci0JICAgIGNhc2UgQkFEICsgMzoKLQkgICAgY2FzZSBCQUQgKyA0OgotCSAgICBjYXNlIEJBRCArIDU6Ci0JICAgIGNhc2UgQkFEICsgNjoKLQkgICAgY2FzZSBCQUQgKyA3OgotCSAgICAgIHRtcHJlZyA9ICg0IDw8IDEwKSB8ICgob3BQLT5yZWcgLSBCQUQpIDw8IDIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQkFDOgotCSAgICBjYXNlIEJBQyArIDE6Ci0JICAgIGNhc2UgQkFDICsgMjoKLQkgICAgY2FzZSBCQUMgKyAzOgotCSAgICBjYXNlIEJBQyArIDQ6Ci0JICAgIGNhc2UgQkFDICsgNToKLQkgICAgY2FzZSBCQUMgKyA2OgotCSAgICBjYXNlIEJBQyArIDc6Ci0JICAgICAgdG1wcmVnID0gKDUgPDwgMTApIHwgKChvcFAtPnJlZyAtIEJBQykgPDwgMik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnWSc6Ci0JICBrbm93IChvcFAtPnJlZyA9PSBQU1IpOwotCSAgYnJlYWs7Ci0JY2FzZSAnWic6Ci0JICBrbm93IChvcFAtPnJlZyA9PSBQQ1NSKTsKLQkgIGJyZWFrOwotI2VuZGlmIC8qIG02ODg1MSAqLwotCWNhc2UgJzMnOgotCSAgc3dpdGNoIChvcFAtPnJlZykKLQkgICAgewotCSAgICBjYXNlIFRUMDoKLQkgICAgICB0bXByZWcgPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFRUMToKLQkgICAgICB0bXByZWcgPSAzOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQljYXNlICd0JzoKLQkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDIwKTsKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ18nOgkvKiB1c2VkIG9ubHkgZm9yIG1vdmUxNiBhYnNvbHV0ZSAzMi1iaXQgYWRkcmVzcyAqLwotCSAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkgICAgYWRkX2ZpeCAoJ2wnLCAmb3BQLT5kaXNwLCAwLCAwKTsKLQkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDgwKTsKLQkgIGFkZHdvcmQgKHRtcHJlZyA+PiAxNik7Ci0JICBhZGR3b3JkICh0bXByZWcgJiAweEZGRkYpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgLyogQnkgdGhlIHRpbWUgd2hlIGdldCBoZXJlIChGSU5BTExZKSB0aGVfaW5zIGNvbnRhaW5zIHRoZSBjb21wbGV0ZQotICAgICBpbnN0cnVjdGlvbiwgcmVhZHkgdG8gYmUgZW1pdHRlZC4gLiAuICovCi19Ci0KLXN0YXRpYyBpbnQKLXJldmVyc2VfMTZfYml0cyAoaW4pCi0gICAgIGludCBpbjsKLXsKLSAgaW50IG91dCA9IDA7Ci0gIGludCBuOwotCi0gIHN0YXRpYyBpbnQgbWFza1sxNl0gPQotICB7Ci0gICAgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCi0gICAgMHgwMTAwLCAweDAyMDAsIDB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwLCAweDgwMDAKLSAgfTsKLSAgZm9yIChuID0gMDsgbiA8IDE2OyBuKyspCi0gICAgewotICAgICAgaWYgKGluICYgbWFza1tuXSkKLQlvdXQgfD0gbWFza1sxNSAtIG5dOwotICAgIH0KLSAgcmV0dXJuIG91dDsKLX0JCQkJLyogcmV2ZXJzZV8xNl9iaXRzKCkgKi8KLQotc3RhdGljIGludAotcmV2ZXJzZV84X2JpdHMgKGluKQotICAgICBpbnQgaW47Ci17Ci0gIGludCBvdXQgPSAwOwotICBpbnQgbjsKLQotICBzdGF0aWMgaW50IG1hc2tbOF0gPQotICB7Ci0gICAgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCi0gIH07Ci0KLSAgZm9yIChuID0gMDsgbiA8IDg7IG4rKykKLSAgICB7Ci0gICAgICBpZiAoaW4gJiBtYXNrW25dKQotCW91dCB8PSBtYXNrWzcgLSBuXTsKLSAgICB9Ci0gIHJldHVybiBvdXQ7Ci19CQkJCS8qIHJldmVyc2VfOF9iaXRzKCkgKi8KLQotLyogQ2F1c2UgYW4gZXh0cmEgZnJhZyB0byBiZSBnZW5lcmF0ZWQgaGVyZSwgaW5zZXJ0aW5nIHVwIHRvIDEwIGJ5dGVzCi0gICAodGhhdCB2YWx1ZSBpcyBjaG9zZW4gaW4gdGhlIGZyYWdfdmFyIGNhbGwgaW4gbWRfYXNzZW1ibGUpLiAgVFlQRQotICAgaXMgdGhlIHN1YnR5cGUgb2YgdGhlIGZyYWcgdG8gYmUgZ2VuZXJhdGVkOyBpdHMgcHJpbWFyeSB0eXBlIGlzCi0gICByc19tYWNoaW5lX2RlcGVuZGVudC4KLQotICAgVGhlIFRZUEUgcGFyYW1ldGVyIGlzIGFsc28gdXNlZCBieSBtZF9jb252ZXJ0X2ZyYWdfMSBhbmQKLSAgIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LiAgVGhlIGFwcHJvcHJpYXRlIHR5cGUgb2YgZml4dXAgd2lsbAotICAgYmUgZW1pdHRlZCBieSBtZF9jb252ZXJ0X2ZyYWdfMS4KLQotICAgQUREIGJlY29tZXMgdGhlIEZSX1NZTUJPTCBmaWVsZCBvZiB0aGUgZnJhZywgYW5kIE9GRiB0aGUgRlJfT0ZGU0VULiAgKi8KLXN0YXRpYyB2b2lkCi1pbnN0YWxsX29wZXJhbmQgKG1vZGUsIHZhbCkKLSAgICAgaW50IG1vZGU7Ci0gICAgIGludCB2YWw7Ci17Ci0gIHN3aXRjaCAobW9kZSkKLSAgICB7Ci0gICAgY2FzZSAncyc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSB2YWwgJiAweEZGOwkvKiBKRiBGRiBpcyBmb3IgTSBrbHVkZ2UgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2QnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gdmFsIDw8IDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICcxJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbCA8PCAxMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzInOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsIDw8IDY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICczJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzQnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMl0gfD0gdmFsIDw8IDEyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnNSc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsyXSB8PSB2YWwgPDwgNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzYnOgotICAgICAgLyogREFOR0VSISAgVGhpcyBpcyBhIGhhY2sgdG8gZm9yY2UgY2FzMmwgYW5kIGNhczJ3IGNtZHMgdG8gYmUKLQkgdGhyZWUgd29yZHMgbG9uZyEgKi8KLSAgICAgIHRoZV9pbnMubnVtbysrOwotICAgICAgdGhlX2lucy5vcGNvZGVbMl0gfD0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnNyc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWwgPDwgNzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzgnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsIDw8IDEwOwotICAgICAgYnJlYWs7Ci0jaWZuZGVmIE5PXzY4ODUxCi0gICAgY2FzZSAnOSc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWwgPDwgNTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlICd0JzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9ICh2YWwgPDwgMTApIHwgKHZhbCA8PCA3KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0QnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gKHZhbCA8PCAxMikgfCB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdnJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9IHZhbCA9IDB4ZmY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdpJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9IHZhbCA8PCA5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnQyc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdqJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbDsKLSAgICAgIHRoZV9pbnMubnVtbysrOwkJLyogV2hhdCBhIGhhY2sgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2snOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsIDw8IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdiJzoKLSAgICBjYXNlICd3JzoKLSAgICBjYXNlICdXJzoKLSAgICBjYXNlICdsJzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2UnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gKHZhbCA8PCA2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0wnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gPSAodmFsID4+IDE2KTsKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzJdID0gdmFsICYgMHhmZmZmOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYyc6Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKLSAgICB9Ci19CQkJCS8qIGluc3RhbGxfb3BlcmFuZCgpICovCi0KLXN0YXRpYyB2b2lkCi1pbnN0YWxsX2dlbl9vcGVyYW5kIChtb2RlLCB2YWwpCi0gICAgIGludCBtb2RlOwotICAgICBpbnQgdmFsOwotewotICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgIGNhc2UgJ3MnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICAvKiBUaGlzIGlzIGEga2x1ZGdlISEhICovCi0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSAodmFsICYgMHgwNykgPDwgOSB8ICh2YWwgJiAweDM4KSA8PCAzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYic6Ci0gICAgY2FzZSAndyc6Ci0gICAgY2FzZSAnbCc6Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAncCc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSB2YWw7Ci0gICAgICBicmVhazsKLSAgICAgIC8qIG1vcmUgc3R1ZmYgZ29lcyBoZXJlICovCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKLSAgICB9Ci19CQkJCS8qIGluc3RhbGxfZ2VuX29wZXJhbmQoKSAqLwotCi0vKgotICogdmVyaWZ5IHRoYXQgd2UgaGF2ZSBzb21lIG51bWJlciBvZiBwYXJlbiBwYWlycywgZG8gbTY4a19pcF9vcCgpLCBhbmQKLSAqIHRoZW4gZGVhbCB3aXRoIHRoZSBiaXRmaWVsZCBoYWNrLgotICovCi0KLXN0YXRpYyBjaGFyICoKLWNyYWNrX29wZXJhbmQgKHN0ciwgb3BQKQotICAgICByZWdpc3RlciBjaGFyICpzdHI7Ci0gICAgIHJlZ2lzdGVyIHN0cnVjdCBtNjhrX29wICpvcFA7Ci17Ci0gIHJlZ2lzdGVyIGludCBwYXJlbnM7Ci0gIHJlZ2lzdGVyIGludCBjOwotICByZWdpc3RlciBjaGFyICpiZWdfc3RyOwotICBpbnQgaW5xdW90ZSA9IDA7Ci0KLSAgaWYgKCFzdHIpCi0gICAgewotICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci0gIGJlZ19zdHIgPSBzdHI7Ci0gIGZvciAocGFyZW5zID0gMDsgKnN0ciAmJiAocGFyZW5zID4gMCB8fCBpbnF1b3RlIHx8IG5vdGVuZCAoc3RyKSk7IHN0cisrKQotICAgIHsKLSAgICAgIGlmICghIGlucXVvdGUpCi0JewotCSAgaWYgKCpzdHIgPT0gJygnKQotCSAgICBwYXJlbnMrKzsKLQkgIGVsc2UgaWYgKCpzdHIgPT0gJyknKQotCSAgICB7Ci0JICAgICAgaWYgKCFwYXJlbnMpCi0JCXsJCQkvKiBFUlJPUiAqLwotCQkgIG9wUC0+ZXJyb3IgPSBfKCJFeHRyYSApIik7Ci0JCSAgcmV0dXJuIHN0cjsKLQkJfQotCSAgICAgIC0tcGFyZW5zOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGZsYWdfbXJpICYmICpzdHIgPT0gJ1wnJykKLQlpbnF1b3RlID0gISBpbnF1b3RlOwotICAgIH0KLSAgaWYgKCEqc3RyICYmIHBhcmVucykKLSAgICB7CQkJCS8qIEVSUk9SICovCi0gICAgICBvcFAtPmVycm9yID0gXygiTWlzc2luZyApIik7Ci0gICAgICByZXR1cm4gc3RyOwotICAgIH0KLSAgYyA9ICpzdHI7Ci0gICpzdHIgPSAnXDAnOwotICBpZiAobTY4a19pcF9vcCAoYmVnX3N0ciwgb3BQKSAhPSAwKQotICAgIHsKLSAgICAgICpzdHIgPSBjOwotICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci0gICpzdHIgPSBjOwotICBpZiAoYyA9PSAnfScpCi0gICAgYyA9ICorK3N0cjsJCQkvKiBKRiBiaXRmaWVsZCBoYWNrICovCi0gIGlmIChjKQotICAgIHsKLSAgICAgIGMgPSAqKytzdHI7Ci0gICAgICBpZiAoIWMpCi0JYXNfYmFkIChfKCJNaXNzaW5nIG9wZXJhbmQiKSk7Ci0gICAgfQotCi0gIC8qIERldGVjdCBNUkkgUkVHIHN5bWJvbHMgYW5kIGNvbnZlcnQgdGhlbSB0byBSRUdMU1RzLiAgKi8KLSAgaWYgKG9wUC0+bW9kZSA9PSBDT05UUk9MICYmIChpbnQpb3BQLT5yZWcgPCAwKQotICAgIHsKLSAgICAgIG9wUC0+bW9kZSA9IFJFR0xTVDsKLSAgICAgIG9wUC0+bWFzayA9IH4oaW50KW9wUC0+cmVnOwotICAgICAgb3BQLT5yZWcgPSAwOwotICAgIH0KLQotICByZXR1cm4gc3RyOwotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0Ci0gICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLgotICAgKi8KLQotc3RhdGljIHZvaWQKLWluc2VydF9yZWcgKHJlZ25hbWUsIHJlZ251bSkKLSAgICAgY29uc3QgY2hhciAqcmVnbmFtZTsKLSAgICAgaW50IHJlZ251bTsKLXsKLSAgY2hhciBidWZbMTAwXTsKLSAgaW50IGk7Ci0KLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVgKLSAgaWYgKCFmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwpCi0gICAgewotICAgICAgYnVmWzBdID0gUkVHSVNURVJfUFJFRklYOwotICAgICAgc3RyY3B5IChidWYgKyAxLCByZWduYW1lKTsKLSAgICAgIHJlZ25hbWUgPSBidWY7Ci0gICAgfQotI2VuZGlmCi0KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAocmVnbmFtZSwgcmVnX3NlY3Rpb24sIHJlZ251bSwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLQotICBmb3IgKGkgPSAwOyByZWduYW1lW2ldOyBpKyspCi0gICAgYnVmW2ldID0gaXNsb3dlciAocmVnbmFtZVtpXSkgPyB0b3VwcGVyIChyZWduYW1lW2ldKSA6IHJlZ25hbWVbaV07Ci0gIGJ1ZltpXSA9ICdcMCc7Ci0KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoYnVmLCByZWdfc2VjdGlvbiwgcmVnbnVtLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotfQotCi1zdHJ1Y3QgaW5pdF9lbnRyeQotICB7Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICBpbnQgbnVtYmVyOwotICB9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGluaXRfZW50cnkgaW5pdF90YWJsZVtdID0KLXsKLSAgeyAiZDAiLCBEQVRBMCB9LAotICB7ICJkMSIsIERBVEExIH0sCi0gIHsgImQyIiwgREFUQTIgfSwKLSAgeyAiZDMiLCBEQVRBMyB9LAotICB7ICJkNCIsIERBVEE0IH0sCi0gIHsgImQ1IiwgREFUQTUgfSwKLSAgeyAiZDYiLCBEQVRBNiB9LAotICB7ICJkNyIsIERBVEE3IH0sCi0gIHsgImEwIiwgQUREUjAgfSwKLSAgeyAiYTEiLCBBRERSMSB9LAotICB7ICJhMiIsIEFERFIyIH0sCi0gIHsgImEzIiwgQUREUjMgfSwKLSAgeyAiYTQiLCBBRERSNCB9LAotICB7ICJhNSIsIEFERFI1IH0sCi0gIHsgImE2IiwgQUREUjYgfSwKLSAgeyAiZnAiLCBBRERSNiB9LAotICB7ICJhNyIsIEFERFI3IH0sCi0gIHsgInNwIiwgQUREUjcgfSwKLSAgeyAic3NwIiwgQUREUjcgfSwKLSAgeyAiZnAwIiwgRlAwIH0sCi0gIHsgImZwMSIsIEZQMSB9LAotICB7ICJmcDIiLCBGUDIgfSwKLSAgeyAiZnAzIiwgRlAzIH0sCi0gIHsgImZwNCIsIEZQNCB9LAotICB7ICJmcDUiLCBGUDUgfSwKLSAgeyAiZnA2IiwgRlA2IH0sCi0gIHsgImZwNyIsIEZQNyB9LAotICB7ICJmcGkiLCBGUEkgfSwKLSAgeyAiZnBpYXIiLCBGUEkgfSwKLSAgeyAiZnBjIiwgRlBJIH0sCi0gIHsgImZwcyIsIEZQUyB9LAotICB7ICJmcHNyIiwgRlBTIH0sCi0gIHsgImZwYyIsIEZQQyB9LAotICB7ICJmcGNyIiwgRlBDIH0sCi0gIHsgImNvbnRyb2wiLCBGUEMgfSwKLSAgeyAic3RhdHVzIiwgRlBTIH0sCi0gIHsgImlhZGRyIiwgRlBJIH0sCi0KLSAgeyAiY29wMCIsIENPUDAgfSwKLSAgeyAiY29wMSIsIENPUDEgfSwKLSAgeyAiY29wMiIsIENPUDIgfSwKLSAgeyAiY29wMyIsIENPUDMgfSwKLSAgeyAiY29wNCIsIENPUDQgfSwKLSAgeyAiY29wNSIsIENPUDUgfSwKLSAgeyAiY29wNiIsIENPUDYgfSwKLSAgeyAiY29wNyIsIENPUDcgfSwKLSAgeyAicGMiLCBQQyB9LAotICB7ICJ6cGMiLCBaUEMgfSwKLSAgeyAic3IiLCBTUiB9LAotCi0gIHsgImNjciIsIENDUiB9LAotICB7ICJjYyIsIENDUiB9LAotCi0gIC8qIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0gIHsgInNmYyIsIFNGQyB9LAkJLyogU291cmNlIEZ1bmN0aW9uIENvZGUgKi8KLSAgeyAic2ZjciIsIFNGQyB9LAotICB7ICJkZmMiLCBERkMgfSwJCS8qIERlc3RpbmF0aW9uIEZ1bmN0aW9uIENvZGUgKi8KLSAgeyAiZGZjciIsIERGQyB9LAotICB7ICJjYWNyIiwgQ0FDUiB9LAkJLyogQ2FjaGUgQ29udHJvbCBSZWdpc3RlciAqLwotICB7ICJjYWFyIiwgQ0FBUiB9LAkJLyogQ2FjaGUgQWRkcmVzcyBSZWdpc3RlciAqLwotCi0gIHsgInVzcCIsIFVTUCB9LAkJLyogVXNlciBTdGFjayBQb2ludGVyICovCi0gIHsgInZiciIsIFZCUiB9LAkJLyogVmVjdG9yIEJhc2UgUmVnaXN0ZXIgKi8KLSAgeyAibXNwIiwgTVNQIH0sCQkvKiBNYXN0ZXIgU3RhY2sgUG9pbnRlciAqLwotICB7ICJpc3AiLCBJU1AgfSwJCS8qIEludGVycnVwdCBTdGFjayBQb2ludGVyICovCi0KLSAgeyAiaXR0MCIsIElUVDAgfSwJCS8qIEluc3RydWN0aW9uIFRyYW5zcGFyZW50IFRyYW5zbGF0aW9uIFJlZyAwICovCi0gIHsgIml0dDEiLCBJVFQxIH0sCQkvKiBJbnN0cnVjdGlvbiBUcmFuc3BhcmVudCBUcmFuc2xhdGlvbiBSZWcgMSAqLwotICB7ICJkdHQwIiwgRFRUMCB9LAkJLyogRGF0YSBUcmFuc3BhcmVudCBUcmFuc2xhdGlvbiBSZWdpc3RlciAwICovCi0gIHsgImR0dDEiLCBEVFQxIH0sCQkvKiBEYXRhIFRyYW5zcGFyZW50IFRyYW5zbGF0aW9uIFJlZ2lzdGVyIDEgKi8KLQotICAvKiA2OGVjMDQwIHZlcnNpb25zIG9mIHNhbWUgKi8KLSAgeyAiaWFjcjAiLCBJVFQwIH0sCQkvKiBJbnN0cnVjdGlvbiBBY2Nlc3MgQ29udHJvbCBSZWdpc3RlciAwICovCi0gIHsgImlhY3IxIiwgSVRUMSB9LAkJLyogSW5zdHJ1Y3Rpb24gQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIgMCAqLwotICB7ICJkYWNyMCIsIERUVDAgfSwJCS8qIERhdGEgQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIgMCAqLwotICB7ICJkYWNyMSIsIERUVDEgfSwJCS8qIERhdGEgQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIgMCAqLwotCi0gIC8qIG1jZjUyMDAgdmVyc2lvbnMgb2Ygc2FtZS4gIFRoZSBDb2xkRmlyZSBwcm9ncmFtbWVyJ3MgcmVmZXJlbmNlCi0gICAgIG1hbnVhbCBpbmRpY2F0ZWQgdGhhdCB0aGUgb3JkZXIgaXMgMiwzLDAsMSwgYnV0IEtlbiBSb3NlCi0gICAgIDxyb3NlQG5ldGNvbS5jb20+IHNheXMgdGhhdCAwLDEsMiwzIGlzIHRoZSBjb3JyZWN0IG9yZGVyLiAgKi8KLSAgeyAiYWNyMCIsIElUVDAgfSwJCS8qIEFjY2VzcyBDb250cm9sIFVuaXQgMCAqLwotICB7ICJhY3IxIiwgSVRUMSB9LAkJLyogQWNjZXNzIENvbnRyb2wgVW5pdCAxICovCi0gIHsgImFjcjIiLCBEVFQwIH0sCQkvKiBBY2Nlc3MgQ29udHJvbCBVbml0IDIgKi8KLSAgeyAiYWNyMyIsIERUVDEgfSwJCS8qIEFjY2VzcyBDb250cm9sIFVuaXQgMyAqLwotCi0gIHsgInRjIiwgVEMgfSwJCQkvKiBNTVUgVHJhbnNsYXRpb24gQ29udHJvbCBSZWdpc3RlciAqLwotICB7ICJ0Y3IiLCBUQyB9LAotCi0gIHsgIm1tdXNyIiwgTU1VU1IgfSwJCS8qIE1NVSBTdGF0dXMgUmVnaXN0ZXIgKi8KLSAgeyAic3JwIiwgU1JQIH0sCQkvKiBVc2VyIFJvb3QgUG9pbnRlciAqLwotICB7ICJ1cnAiLCBVUlAgfSwJCS8qIFN1cGVydmlzb3IgUm9vdCBQb2ludGVyICovCi0KLSAgeyAiYnVzY3IiLCBCVVNDUiB9LAotICB7ICJwY3IiLCBQQ1IgfSwKLQotICB7ICJyb21iYXIiLCBST01CQVIgfSwJCS8qIFJPTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSAgeyAicmFtYmFyMCIsIFJBTUJBUjAgfSwJLyogUk9NIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAqLwotICB7ICJyYW1iYXIxIiwgUkFNQkFSMSB9LAkvKiBST00gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyICovCi0gIHsgIm1iYXIiLCBNQkFSIH0sCQkvKiBNb2R1bGUgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyICovCi0gIC8qIGVuZCBvZiBjb250cm9sIHJlZ2lzdGVycyAqLwotCi0gIHsgImFjIiwgQUMgfSwKLSAgeyAiYmMiLCBCQyB9LAotICB7ICJjYWwiLCBDQUwgfSwKLSAgeyAiY3JwIiwgQ1JQIH0sCi0gIHsgImRycCIsIERSUCB9LAotICB7ICJwY3NyIiwgUENTUiB9LAotICB7ICJwc3IiLCBQU1IgfSwKLSAgeyAic2NjIiwgU0NDIH0sCi0gIHsgInZhbCIsIFZBTCB9LAotICB7ICJiYWQwIiwgQkFEMCB9LAotICB7ICJiYWQxIiwgQkFEMSB9LAotICB7ICJiYWQyIiwgQkFEMiB9LAotICB7ICJiYWQzIiwgQkFEMyB9LAotICB7ICJiYWQ0IiwgQkFENCB9LAotICB7ICJiYWQ1IiwgQkFENSB9LAotICB7ICJiYWQ2IiwgQkFENiB9LAotICB7ICJiYWQ3IiwgQkFENyB9LAotICB7ICJiYWMwIiwgQkFDMCB9LAotICB7ICJiYWMxIiwgQkFDMSB9LAotICB7ICJiYWMyIiwgQkFDMiB9LAotICB7ICJiYWMzIiwgQkFDMyB9LAotICB7ICJiYWM0IiwgQkFDNCB9LAotICB7ICJiYWM1IiwgQkFDNSB9LAotICB7ICJiYWM2IiwgQkFDNiB9LAotICB7ICJiYWM3IiwgQkFDNyB9LAotCi0gIHsgImljIiwgSUMgfSwKLSAgeyAiZGMiLCBEQyB9LAotICB7ICJuYyIsIE5DIH0sCi0KLSAgeyAidHQwIiwgVFQwIH0sCi0gIHsgInR0MSIsIFRUMSB9LAotICAvKiA2OGVjMDMwIHZlcnNpb25zIG9mIHNhbWUgKi8KLSAgeyAiYWMwIiwgVFQwIH0sCi0gIHsgImFjMSIsIFRUMSB9LAotICAvKiA2OGVjMDMwIGFjY2VzcyBjb250cm9sIHVuaXQsIGlkZW50aWNhbCB0byAwMzAgTU1VIHN0YXR1cyByZWcgKi8KLSAgeyAiYWN1c3IiLCBQU1IgfSwKLQotICAvKiBTdXBwcmVzc2VkIGRhdGEgYW5kIGFkZHJlc3MgcmVnaXN0ZXJzLiAgKi8KLSAgeyAiemQwIiwgWkRBVEEwIH0sCi0gIHsgInpkMSIsIFpEQVRBMSB9LAotICB7ICJ6ZDIiLCBaREFUQTIgfSwKLSAgeyAiemQzIiwgWkRBVEEzIH0sCi0gIHsgInpkNCIsIFpEQVRBNCB9LAotICB7ICJ6ZDUiLCBaREFUQTUgfSwKLSAgeyAiemQ2IiwgWkRBVEE2IH0sCi0gIHsgInpkNyIsIFpEQVRBNyB9LAotICB7ICJ6YTAiLCBaQUREUjAgfSwKLSAgeyAiemExIiwgWkFERFIxIH0sCi0gIHsgInphMiIsIFpBRERSMiB9LAotICB7ICJ6YTMiLCBaQUREUjMgfSwKLSAgeyAiemE0IiwgWkFERFI0IH0sCi0gIHsgInphNSIsIFpBRERSNSB9LAotICB7ICJ6YTYiLCBaQUREUjYgfSwKLSAgeyAiemE3IiwgWkFERFI3IH0sCi0KLSAgeyAwLCAwIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1pbml0X3JlZ3RhYmxlICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpbml0X3RhYmxlW2ldLm5hbWU7IGkrKykKLSAgICBpbnNlcnRfcmVnIChpbml0X3RhYmxlW2ldLm5hbWUsIGluaXRfdGFibGVbaV0ubnVtYmVyKTsKLX0KLQotc3RhdGljIGludCBub182ODg1MSwgbm9fNjg4ODE7Ci0KLSNpZmRlZiBPQkpfQU9VVAotLyogYS5vdXQgbWFjaGluZSB0eXBlLiAgRGVmYXVsdCB0byA2ODAyMC4gICovCi1pbnQgbTY4a19hb3V0X21hY2h0eXBlID0gMjsKLSNlbmRpZgotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNvbnN0IGNoYXIgKmVyOwotICBzaG9ydCAqZnJvbVA7Ci0gIGNoYXIgKnRvUCA9IE5VTEw7Ci0gIGludCBtLCBuID0gMDsKLSAgY2hhciAqdG9fYmVnX1A7Ci0gIGludCBzaG9ydHNfdGhpc19mcmFnOwotICBmaXhTICpmaXhQOwotCi0gIC8qIEluIE1SSSBtb2RlLCB0aGUgaW5zdHJ1Y3Rpb24gYW5kIG9wZXJhbmRzIGFyZSBzZXBhcmF0ZWQgYnkgYQotICAgICBzcGFjZS4gIEFueXRoaW5nIGZvbGxvd2luZyB0aGUgb3BlcmFuZHMgaXMgYSBjb21tZW50LiAgVGhlIGxhYmVsCi0gICAgIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZC4gICovCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICBjaGFyICpzOwotICAgICAgaW50IGZpZWxkcyA9IDA7Ci0gICAgICBpbnQgaW5maWVsZCA9IDA7Ci0gICAgICBpbnQgaW5xdW90ZSA9IDA7Ci0KLSAgICAgIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJzsgcysrKQotCXsKLQkgIGlmICgoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcpICYmICEgaW5xdW90ZSkKLQkgICAgewotCSAgICAgIGlmIChpbmZpZWxkKQotCQl7Ci0JCSAgKytmaWVsZHM7Ci0JCSAgaWYgKGZpZWxkcyA+PSAyKQotCQkgICAgewotCQkgICAgICAqcyA9ICdcMCc7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGluZmllbGQgPSAwOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIGluZmllbGQpCi0JCWluZmllbGQgPSAxOwotCSAgICAgIGlmICgqcyA9PSAnXCcnKQotCQlpbnF1b3RlID0gISBpbnF1b3RlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBtZW1zZXQgKChjaGFyICopICgmdGhlX2lucyksICdcMCcsIHNpemVvZiAodGhlX2lucykpOwotICBtNjhrX2lwIChzdHIpOwotICBlciA9IHRoZV9pbnMuZXJyb3I7Ci0gIGlmICghZXIpCi0gICAgewotICAgICAgZm9yIChuID0gMDsgbiA8IHRoZV9pbnMubnVtYXJnczsgbisrKQotCWlmICh0aGVfaW5zLm9wZXJhbmRzW25dLmVycm9yKQotCSAgewotCSAgICBlciA9IHRoZV9pbnMub3BlcmFuZHNbbl0uZXJyb3I7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgIH0KLSAgaWYgKGVyKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiJXMgLS0gc3RhdGVtZW50IGAlcycgaWdub3JlZCIpLCBlciwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSWYgdGhlcmUgaXMgYSBjdXJyZW50IGxhYmVsLCByZWNvcmQgdGhhdCBpdCBtYXJrcyBhbiBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChjdXJyZW50X2xhYmVsICE9IE5VTEwpCi0gICAgewotICAgICAgY3VycmVudF9sYWJlbC0+dGV4dCA9IDE7Ci0gICAgICBjdXJyZW50X2xhYmVsID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKHRoZV9pbnMubmZyYWcgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBObyBmcmFnIGhhY2tpbmcgaW52b2x2ZWQ7IGp1c3QgcHV0IGl0IG91dCAqLwotICAgICAgdG9QID0gZnJhZ19tb3JlICgyICogdGhlX2lucy5udW1vKTsKLSAgICAgIGZyb21QID0gJnRoZV9pbnMub3Bjb2RlWzBdOwotICAgICAgZm9yIChtID0gdGhlX2lucy5udW1vOyBtOyAtLW0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0b1AsIChsb25nKSAoKmZyb21QKSwgMik7Ci0JICB0b1AgKz0gMjsKLQkgIGZyb21QKys7Ci0JfQotICAgICAgLyogcHV0IG91dCBzeW1ib2wtZGVwZW5kZW50IGluZm8gKi8KLSAgICAgIGZvciAobSA9IDA7IG0gPCB0aGVfaW5zLm5yZWw7IG0rKykKLQl7Ci0JICBzd2l0Y2ggKHRoZV9pbnMucmVsb2NbbV0ud2lkKQotCSAgICB7Ci0JICAgIGNhc2UgJ0InOgotCSAgICAgIG4gPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdiJzoKLQkgICAgICBuID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnMyc6Ci0JICAgICAgbiA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3cnOgotCSAgICBjYXNlICdXJzoKLQkgICAgICBuID0gMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnbCc6Ci0JICAgICAgbiA9IDQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfZmF0YWwgKF8oIkRvbid0IGtub3cgaG93IHRvIGZpZ3VyZSB3aWR0aCBvZiAlYyBpbiBtZF9hc3NlbWJsZSgpIiksCi0JCQl0aGVfaW5zLnJlbG9jW21dLndpZCk7Ci0JICAgIH0KLQotCSAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJCSAgICAgICgodG9QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpCi0JCQkgICAgICAgLSB0aGVfaW5zLm51bW8gKiAyICsgdGhlX2lucy5yZWxvY1ttXS5uKSwKLQkJCSAgICAgIG4sCi0JCQkgICAgICAmdGhlX2lucy5yZWxvY1ttXS5leHAsCi0JCQkgICAgICB0aGVfaW5zLnJlbG9jW21dLnBjcmVsLAotCQkJICAgICAgZ2V0X3JlbG9jX2NvZGUgKG4sIHRoZV9pbnMucmVsb2NbbV0ucGNyZWwsCi0JCQkJCSAgICAgIHRoZV9pbnMucmVsb2NbbV0ucGljX3JlbG9jKSk7Ci0JICBmaXhQLT5meF9wY3JlbF9hZGp1c3QgPSB0aGVfaW5zLnJlbG9jW21dLnBjcmVsX2ZpeDsKLQkgIGlmICh0aGVfaW5zLnJlbG9jW21dLndpZCA9PSAnQicpCi0JICAgIGZpeFAtPmZ4X3NpZ25lZCA9IDE7Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBUaGVyZSdzIHNvbWUgZnJhZyBoYWNraW5nICovCi0gIGZvciAobiA9IDAsIGZyb21QID0gJnRoZV9pbnMub3Bjb2RlWzBdOyBuIDwgdGhlX2lucy5uZnJhZzsgbisrKQotICAgIHsKLSAgICAgIGludCB3aWQ7Ci0KLSAgICAgIGlmIChuID09IDApCi0Jd2lkID0gMiAqIHRoZV9pbnMuZnJhZ2Jbbl0uZnJhZ29mZjsKLSAgICAgIGVsc2UKLQl3aWQgPSAyICogKHRoZV9pbnMubnVtbyAtIHRoZV9pbnMuZnJhZ2JbbiAtIDFdLmZyYWdvZmYpOwotICAgICAgdG9QID0gZnJhZ19tb3JlICh3aWQpOwotICAgICAgdG9fYmVnX1AgPSB0b1A7Ci0gICAgICBzaG9ydHNfdGhpc19mcmFnID0gMDsKLSAgICAgIGZvciAobSA9IHdpZCAvIDI7IG07IC0tbSkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvUCwgKGxvbmcpICgqZnJvbVApLCAyKTsKLQkgIHRvUCArPSAyOwotCSAgZnJvbVArKzsKLQkgIHNob3J0c190aGlzX2ZyYWcrKzsKLQl9Ci0gICAgICBmb3IgKG0gPSAwOyBtIDwgdGhlX2lucy5ucmVsOyBtKyspCi0JewotCSAgaWYgKCh0aGVfaW5zLnJlbG9jW21dLm4pID49IDIgKiBzaG9ydHNfdGhpc19mcmFnKQotCSAgICB7Ci0JICAgICAgdGhlX2lucy5yZWxvY1ttXS5uIC09IDIgKiBzaG9ydHNfdGhpc19mcmFnOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICB3aWQgPSB0aGVfaW5zLnJlbG9jW21dLndpZDsKLQkgIGlmICh3aWQgPT0gMCkKLQkgICAgY29udGludWU7Ci0JICB0aGVfaW5zLnJlbG9jW21dLndpZCA9IDA7Ci0JICB3aWQgPSAod2lkID09ICdiJykgPyAxIDogKHdpZCA9PSAndycpID8gMiA6ICh3aWQgPT0gJ2wnKSA/IDQgOiA0MDAwOwotCi0JICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LAotCQkJICAgICAgKCh0b1AgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkKLQkJCSAgICAgICAtIHRoZV9pbnMubnVtbyAqIDIgKyB0aGVfaW5zLnJlbG9jW21dLm4pLAotCQkJICAgICAgd2lkLAotCQkJICAgICAgJnRoZV9pbnMucmVsb2NbbV0uZXhwLAotCQkJICAgICAgdGhlX2lucy5yZWxvY1ttXS5wY3JlbCwKLQkJCSAgICAgIGdldF9yZWxvY19jb2RlICh3aWQsIHRoZV9pbnMucmVsb2NbbV0ucGNyZWwsCi0JCQkJCSAgICAgIHRoZV9pbnMucmVsb2NbbV0ucGljX3JlbG9jKSk7Ci0JICBmaXhQLT5meF9wY3JlbF9hZGp1c3QgPSB0aGVfaW5zLnJlbG9jW21dLnBjcmVsX2ZpeDsKLQl9Ci0gICAgICAodm9pZCkgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMCwgMCwKLQkJICAgICAgIChyZWxheF9zdWJzdGF0ZVQpICh0aGVfaW5zLmZyYWdiW25dLmZyYWd0eSksCi0JCSAgICAgICB0aGVfaW5zLmZyYWdiW25dLmZhZGQsIHRoZV9pbnMuZnJhZ2Jbbl0uZm9mZiwgdG9fYmVnX1ApOwotICAgIH0KLSAgbiA9ICh0aGVfaW5zLm51bW8gLSB0aGVfaW5zLmZyYWdiW24gLSAxXS5mcmFnb2ZmKTsKLSAgc2hvcnRzX3RoaXNfZnJhZyA9IDA7Ci0gIGlmIChuKQotICAgIHsKLSAgICAgIHRvUCA9IGZyYWdfbW9yZSAobiAqIHNpemVvZiAoc2hvcnQpKTsKLSAgICAgIHdoaWxlIChuLS0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0b1AsIChsb25nKSAoKmZyb21QKSwgMik7Ci0JICB0b1AgKz0gMjsKLQkgIGZyb21QKys7Ci0JICBzaG9ydHNfdGhpc19mcmFnKys7Ci0JfQotICAgIH0KLSAgZm9yIChtID0gMDsgbSA8IHRoZV9pbnMubnJlbDsgbSsrKQotICAgIHsKLSAgICAgIGludCB3aWQ7Ci0KLSAgICAgIHdpZCA9IHRoZV9pbnMucmVsb2NbbV0ud2lkOwotICAgICAgaWYgKHdpZCA9PSAwKQotCWNvbnRpbnVlOwotICAgICAgdGhlX2lucy5yZWxvY1ttXS53aWQgPSAwOwotICAgICAgd2lkID0gKHdpZCA9PSAnYicpID8gMSA6ICh3aWQgPT0gJ3cnKSA/IDIgOiAod2lkID09ICdsJykgPyA0IDogNDAwMDsKLQotICAgICAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJCSAgKCh0aGVfaW5zLnJlbG9jW21dLm4gKyB0b1AgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkKLQkJCSAgIC0gc2hvcnRzX3RoaXNfZnJhZyAqIDIpLAotCQkJICB3aWQsCi0JCQkgICZ0aGVfaW5zLnJlbG9jW21dLmV4cCwKLQkJCSAgdGhlX2lucy5yZWxvY1ttXS5wY3JlbCwKLQkJCSAgZ2V0X3JlbG9jX2NvZGUgKHdpZCwgdGhlX2lucy5yZWxvY1ttXS5wY3JlbCwKLQkJCQkJICB0aGVfaW5zLnJlbG9jW21dLnBpY19yZWxvYykpOwotICAgICAgZml4UC0+ZnhfcGNyZWxfYWRqdXN0ID0gdGhlX2lucy5yZWxvY1ttXS5wY3JlbF9maXg7Ci0gICAgfQotfQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICAvKgotICAgKiBtZF9iZWdpbiAtLSBzZXQgdXAgaGFzaCB0YWJsZXMgd2l0aCA2ODAwMCBpbnN0cnVjdGlvbnMuCi0gICAqIHNpbWlsYXIgdG8gd2hhdCB0aGUgdmF4IGFzc2VtYmxlciBkb2VzLiAgLS0tcGhyCi0gICAqLwotICAvKiBSTVMgY2xhaW1zIHRoZSB0aGluZyB0byBkbyBpcyB0YWtlIHRoZSBtNjhrLW9wY29kZS5oIHRhYmxlLCBhbmQgbWFrZQotICAgICBhIGNvcHkgb2YgaXQgYXQgcnVudGltZSwgYWRkaW5nIGluIHRoZSBpbmZvcm1hdGlvbiB3ZSB3YW50IGJ1dCBpc24ndAotICAgICB0aGVyZS4gIEkgdGhpbmsgaXQnZCBiZSBiZXR0ZXIgdG8gaGF2ZSBhbiBhd2sgc2NyaXB0IGhhY2sgdGhlIHRhYmxlCi0gICAgIGF0IGNvbXBpbGUgdGltZS4gIE9yIGV2ZW4ganVzdCB4c3RyIHRoZSB0YWJsZSBhbmQgdXNlIGl0IGFzLWlzLiAgQnV0Ci0gICAgIG15IGxvcmQgZ2hvZCBoYXRoIHNwb2tlbiwgc28gd2UgZG8gaXQgdGhpcyB3YXkuICBFeGN1c2UgdGhlIHVnbHkgdmFyCi0gICAgIG5hbWVzLiAgKi8KLQotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgKmluczsKLSAgcmVnaXN0ZXIgc3RydWN0IG02OGtfaW5jYW50ICpoYWNrLCAqc2xhazsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcmV0dmFsID0gMDsJLyogZW1wdHkgc3RyaW5nLCBvciBlcnJvciBtc2cgdGV4dCAqLwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKLSAgcmVnaXN0ZXIgY2hhciBjOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgPSAxOwotICAgICAgbTY4a19hYnNwY2FkZCA9IDE7Ci0gICAgICBpZiAoISBtNjhrX3JlbDMyX2Zyb21fY21kbGluZSkKLQltNjhrX3JlbDMyID0gMDsKLSAgICB9Ci0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIG9ic3RhY2tfYmVnaW4gKCZyb2J5biwgNDAwMCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBtNjhrX251bW9wY29kZXM7IGkrKykKLSAgICB7Ci0gICAgICBoYWNrID0gc2xhayA9IChzdHJ1Y3QgbTY4a19pbmNhbnQgKikgb2JzdGFja19hbGxvYyAoJnJvYnluLCBzaXplb2YgKHN0cnVjdCBtNjhrX2luY2FudCkpOwotICAgICAgZG8KLQl7Ci0JICBpbnMgPSAmbTY4a19vcGNvZGVzW2ldOwotCSAgLyogV2UgKmNvdWxkKiBpZ25vcmUgaW5zbnMgdGhhdCBkb24ndCBtYXRjaCBvdXIgYXJjaCBoZXJlCi0JICAgICBidXQganVzdCBsZWF2aW5nIHRoZW0gb3V0IG9mIHRoZSBoYXNoLiAqLwotCSAgc2xhay0+bV9vcGVyYW5kcyA9IGlucy0+YXJnczsKLQkgIHNsYWstPm1fb3BudW0gPSBzdHJsZW4gKHNsYWstPm1fb3BlcmFuZHMpIC8gMjsKLQkgIHNsYWstPm1fYXJjaCA9IGlucy0+YXJjaDsKLQkgIHNsYWstPm1fb3Bjb2RlID0gaW5zLT5vcGNvZGU7Ci0JICAvKiBUaGlzIGlzIGtsdWRnZXkgKi8KLQkgIHNsYWstPm1fY29kZW51bSA9ICgoaW5zLT5tYXRjaCkgJiAweGZmZmZMKSA/IDIgOiAxOwotCSAgaWYgKGkgKyAxICE9IG02OGtfbnVtb3Bjb2RlcwotCSAgICAgICYmICFzdHJjbXAgKGlucy0+bmFtZSwgbTY4a19vcGNvZGVzW2kgKyAxXS5uYW1lKSkKLQkgICAgewotCSAgICAgIHNsYWstPm1fbmV4dCA9IChzdHJ1Y3QgbTY4a19pbmNhbnQgKikgb2JzdGFja19hbGxvYyAoJnJvYnluLCBzaXplb2YgKHN0cnVjdCBtNjhrX2luY2FudCkpOwotCSAgICAgIGkrKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICBzbGFrLT5tX25leHQgPSAwOwotCSAgc2xhayA9IHNsYWstPm1fbmV4dDsKLQl9Ci0gICAgICB3aGlsZSAoc2xhayk7Ci0KLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBpbnMtPm5hbWUsIChjaGFyICopIGhhY2spOwotICAgICAgaWYgKHJldHZhbCkKLQlhc19mYXRhbCAoXygiSW50ZXJuYWwgRXJyb3I6ICBDYW4ndCBoYXNoICVzOiAlcyIpLCBpbnMtPm5hbWUsIHJldHZhbCk7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBtNjhrX251bWFsaWFzZXM7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gbTY4a19vcGNvZGVfYWxpYXNlc1tpXS5wcmltYXJ5OwotICAgICAgY29uc3QgY2hhciAqYWxpYXMgPSBtNjhrX29wY29kZV9hbGlhc2VzW2ldLmFsaWFzOwotICAgICAgUFRSIHZhbCA9IGhhc2hfZmluZCAob3BfaGFzaCwgbmFtZSk7Ci0gICAgICBpZiAoIXZhbCkKLQlhc19mYXRhbCAoXygiSW50ZXJuYWwgRXJyb3I6IENhbid0IGZpbmQgJXMgaW4gaGFzaCB0YWJsZSIpLCBuYW1lKTsKLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBhbGlhcywgdmFsKTsKLSAgICAgIGlmIChyZXR2YWwpCi0JYXNfZmF0YWwgKF8oIkludGVybmFsIEVycm9yOiBDYW4ndCBoYXNoICVzOiAlcyIpLCBhbGlhcywgcmV0dmFsKTsKLSAgICB9Ci0KLSAgLyogSW4gTVJJIG1vZGUsIGFsbCB1bnNpemVkIGJyYW5jaGVzIGFyZSB2YXJpYWJsZSBzaXplZC4gIE5vcm1hbGx5LAotICAgICB0aGV5IGFyZSB3b3JkIHNpemVkLiAgKi8KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHN0YXRpYyBzdHJ1Y3QgbTY4a19vcGNvZGVfYWxpYXMgbXJpX2FsaWFzZXNbXSA9Ci0JewotCSAgeyAiYmhpIiwJImpoaSIsIH0sCi0JICB7ICJibHMiLAkiamxzIiwgfSwKLQkgIHsgImJjYyIsCSJqY2MiLCB9LAotCSAgeyAiYmNzIiwJImpjcyIsIH0sCi0JICB7ICJibmUiLAkiam5lIiwgfSwKLQkgIHsgImJlcSIsCSJqZXEiLCB9LAotCSAgeyAiYnZjIiwJImp2YyIsIH0sCi0JICB7ICJidnMiLAkianZzIiwgfSwKLQkgIHsgImJwbCIsCSJqcGwiLCB9LAotCSAgeyAiYm1pIiwJImptaSIsIH0sCi0JICB7ICJiZ2UiLAkiamdlIiwgfSwKLQkgIHsgImJsdCIsCSJqbHQiLCB9LAotCSAgeyAiYmd0IiwJImpndCIsIH0sCi0JICB7ICJibGUiLAkiamxlIiwgfSwKLQkgIHsgImJyYSIsCSJqcmEiLCB9LAotCSAgeyAiYnNyIiwJImpic3IiLCB9LAotCX07Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgbXJpX2FsaWFzZXMgLyBzaXplb2YgbXJpX2FsaWFzZXNbMF07IGkrKykKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lID0gbXJpX2FsaWFzZXNbaV0ucHJpbWFyeTsKLQkgIGNvbnN0IGNoYXIgKmFsaWFzID0gbXJpX2FsaWFzZXNbaV0uYWxpYXM7Ci0JICBQVFIgdmFsID0gaGFzaF9maW5kIChvcF9oYXNoLCBuYW1lKTsKLQkgIGlmICghdmFsKQotCSAgICBhc19mYXRhbCAoXygiSW50ZXJuYWwgRXJyb3I6IENhbid0IGZpbmQgJXMgaW4gaGFzaCB0YWJsZSIpLCBuYW1lKTsKLQkgIHJldHZhbCA9IGhhc2hfamFtIChvcF9oYXNoLCBhbGlhcywgdmFsKTsKLQkgIGlmIChyZXR2YWwpCi0JICAgIGFzX2ZhdGFsIChfKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgaGFzaCAlczogJXMiKSwgYWxpYXMsIHJldHZhbCk7Ci0JfQotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChta2xvd2VyX3RhYmxlKTsgaSsrKQotICAgIG1rbG93ZXJfdGFibGVbaV0gPSAoaXN1cHBlciAoYyA9IChjaGFyKSBpKSkgPyB0b2xvd2VyIChjKSA6IGM7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAobm90ZW5kX3RhYmxlKTsgaSsrKQotICAgIHsKLSAgICAgIG5vdGVuZF90YWJsZVtpXSA9IDA7Ci0gICAgICBhbHRfbm90ZW5kX3RhYmxlW2ldID0gMDsKLSAgICB9Ci0gIG5vdGVuZF90YWJsZVsnLCddID0gMTsKLSAgbm90ZW5kX3RhYmxlWyd7J10gPSAxOwotICBub3RlbmRfdGFibGVbJ30nXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJ2EnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJ0EnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJ2QnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJ0QnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJyMnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJyYnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJ2YnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJ0YnXSA9IDE7Ci0jaWZkZWYgUkVHSVNURVJfUFJFRklYCi0gIGFsdF9ub3RlbmRfdGFibGVbUkVHSVNURVJfUFJFRklYXSA9IDE7Ci0jZW5kaWYKLQotICAvKiBXZSBuZWVkIHRvIHB1dCAnKCcgaW4gYWx0X25vdGVuZF90YWJsZSB0byBoYW5kbGUKLSAgICAgICBjYXMyICVkMDolZDIsJWQzOiVkNCwoJWEwKTooJWExKQotICAgICAqLwotICBhbHRfbm90ZW5kX3RhYmxlWycoJ10gPSAxOwotCi0gIC8qIFdlIG5lZWQgdG8gcHV0ICdAJyBpbiBhbHRfbm90ZW5kX3RhYmxlIHRvIGhhbmRsZQotICAgICAgIGNhczIgJWQwOiVkMiwlZDM6JWQ0LEAoJWQwKTpAKCVkMSkKLSAgICAgKi8KLSAgYWx0X25vdGVuZF90YWJsZVsnQCddID0gMTsKLQotICAvKiBXZSBuZWVkIHRvIHB1dCBkaWdpdHMgaW4gYWx0X25vdGVuZF90YWJsZSB0byBoYW5kbGUKLSAgICAgICBiZmV4dHUgJWQwezI0OjF9LCVkMAotICAgICAqLwotICBhbHRfbm90ZW5kX3RhYmxlWycwJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWycxJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWycyJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWyczJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWyc0J10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWyc1J10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWyc2J10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWyc3J10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWyc4J10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWyc5J10gPSAxOwotCi0jaWZuZGVmIE1JVF9TWU5UQVhfT05MWQotICAvKiBJbnNlcnQgcHNldWRvIG9wcywgdGhlc2UgaGF2ZSB0byBnbyBpbnRvIHRoZSBvcGNvZGUgdGFibGUgc2luY2UKLSAgICAgZ2FzIGV4cGVjdHMgcHNldWRvIG9wcyB0byBzdGFydCB3aXRoIGEgZG90ICovCi0gIHsKLSAgICBpbnQgbiA9IDA7Ci0gICAgd2hpbGUgKG1vdGVfcHNldWRvX3RhYmxlW25dLnBvY19uYW1lKQotICAgICAgewotCWhhY2sgPSAoc3RydWN0IG02OGtfaW5jYW50ICopCi0JICBvYnN0YWNrX2FsbG9jICgmcm9ieW4sIHNpemVvZiAoc3RydWN0IG02OGtfaW5jYW50KSk7Ci0JaGFzaF9pbnNlcnQgKG9wX2hhc2gsCi0JCSAgICAgbW90ZV9wc2V1ZG9fdGFibGVbbl0ucG9jX25hbWUsIChjaGFyICopIGhhY2spOwotCWhhY2stPm1fb3BlcmFuZHMgPSAwOwotCWhhY2stPm1fb3BudW0gPSBuOwotCW4rKzsKLSAgICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgaW5pdF9yZWd0YWJsZSAoKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgcmVjb3JkX2FsaWdubWVudCAodGV4dF9zZWN0aW9uLCAyKTsKLSAgcmVjb3JkX2FsaWdubWVudCAoZGF0YV9zZWN0aW9uLCAyKTsKLSAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIDIpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1zZWxlY3RfY29udHJvbF9yZWdzICgpCi17Ci0gIC8qIE5vdGUgd2hpY2ggc2V0IG9mICJtb3ZlYyIgY29udHJvbCByZWdpc3RlcnMgaXMgYXZhaWxhYmxlLiAgKi8KLSAgc3dpdGNoIChjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpKQotICAgIHsKLSAgICBjYXNlIG02ODAwMDoKLSAgICAgIGNvbnRyb2xfcmVncyA9IG02ODAwMF9jb250cm9sX3JlZ3M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG02ODAxMDoKLSAgICAgIGNvbnRyb2xfcmVncyA9IG02ODAxMF9jb250cm9sX3JlZ3M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG02ODAyMDoKLSAgICBjYXNlIG02ODAzMDoKLSAgICAgIGNvbnRyb2xfcmVncyA9IG02ODAyMF9jb250cm9sX3JlZ3M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG02ODA0MDoKLSAgICAgIGNvbnRyb2xfcmVncyA9IG02ODA0MF9jb250cm9sX3JlZ3M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG02ODA2MDoKLSAgICAgIGNvbnRyb2xfcmVncyA9IG02ODA2MF9jb250cm9sX3JlZ3M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNwdTMyOgotICAgICAgY29udHJvbF9yZWdzID0gY3B1MzJfY29udHJvbF9yZWdzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtY2Y1MjAwOgotICAgICAgY29udHJvbF9yZWdzID0gbWNmNTIwMF9jb250cm9sX3JlZ3M7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi12b2lkCi1tNjhrX2luaXRfYWZ0ZXJfYXJncyAoKQotewotICBpZiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA9PSAwKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgY29uc3QgY2hhciAqZGVmYXVsdF9jcHUgPSBUQVJHRVRfQ1BVOwotCi0gICAgICBpZiAoKmRlZmF1bHRfY3B1ID09ICdtJykKLQlkZWZhdWx0X2NwdSsrOwotICAgICAgZm9yIChpID0gMDsgaSA8IG5fYXJjaHM7IGkrKykKLQlpZiAoc3RyY2FzZWNtcCAoZGVmYXVsdF9jcHUsIGFyY2hzW2ldLm5hbWUpID09IDApCi0JICBicmVhazsKLSAgICAgIGlmIChpID09IG5fYXJjaHMpCi0JewotCSAgYXNfYmFkIChfKCJ1bnJlY29nbml6ZWQgZGVmYXVsdCBjcHUgYCVzJyA/Pz8iKSwgVEFSR0VUX0NQVSk7Ci0JICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBtNjgwMjA7Ci0JfQotICAgICAgZWxzZQotCWN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IGFyY2hzW2ldLmFyY2g7Ci0gICAgfQotICAvKiBQZXJtaXQgbTY4ODgxIHNwZWNpZmljYXRpb24gd2l0aCBhbGwgY3B1czsgdGhvc2UgdGhhdCBjYW4ndCB3b3JrCi0gICAgIHdpdGggYSBjb3Byb2Nlc3NvciBjb3VsZCBiZSBkb2luZyBlbXVsYXRpb24uICAqLwotICBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjg4NTEpCi0gICAgewotICAgICAgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlICYgbTY4MDQwKQotCXsKLQkgIGFzX3dhcm4gKF8oIjY4MDQwIGFuZCA2ODg1MSBzcGVjaWZpZWQ7IG1tdSBpbnN0cnVjdGlvbnMgbWF5IGFzc2VtYmxlIGluY29ycmVjdGx5IikpOwotCX0KLSAgICB9Ci0gIC8qIFdoYXQgb3RoZXIgaW5jb21wYXRpYmlsaXRpZXMgY291bGQgd2UgY2hlY2sgZm9yPyAgKi8KLQotICAvKiBUb3NzIGluIHNvbWUgZGVmYXVsdCBhc3N1bXB0aW9ucyBhYm91dCBjb3Byb2Nlc3NvcnMuICAqLwotICBpZiAoIW5vXzY4ODgxCi0gICAgICAmJiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKQotCSAgLyogQ2FuIENQVTMyIGhhdmUgYSA2ODg4MSBjb3Byb2Nlc3Nvcj8/ICAqLwotCSAgJiAobTY4MDIwIHwgbTY4MDMwIHwgY3B1MzIpKSkKLSAgICB7Ci0gICAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBtNjg4ODE7Ci0gICAgfQotICBpZiAoIW5vXzY4ODUxCi0gICAgICAmJiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSAmIG02ODAyMHVwKSAhPSAwCi0gICAgICAmJiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSAmIG02ODA0MHVwKSA9PSAwKQotICAgIHsKLSAgICAgIGN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IG02ODg1MTsKLSAgICB9Ci0gIGlmIChub182ODg4MSAmJiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjg4ODEpKQotICAgIGFzX2JhZCAoXygib3B0aW9ucyBmb3IgNjg4ODEgYW5kIG5vLTY4ODgxIGJvdGggZ2l2ZW4iKSk7Ci0gIGlmIChub182ODg1MSAmJiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjg4NTEpKQotICAgIGFzX2JhZCAoXygib3B0aW9ucyBmb3IgNjg4NTEgYW5kIG5vLTY4ODUxIGJvdGggZ2l2ZW4iKSk7Ci0KLSNpZmRlZiBPQkpfQU9VVAotICAvKiBXb3JrIG91dCB0aGUgbWFnaWMgbnVtYmVyLiAgVGhpcyBpc24ndCB2ZXJ5IGdlbmVyYWwuICAqLwotICBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjgwMDApCi0gICAgbTY4a19hb3V0X21hY2h0eXBlID0gMDsKLSAgZWxzZSBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjgwMTApCi0gICAgbTY4a19hb3V0X21hY2h0eXBlID0gMTsKLSAgZWxzZSBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjgwMjApCi0gICAgbTY4a19hb3V0X21hY2h0eXBlID0gMjsKLSAgZWxzZQotICAgIG02OGtfYW91dF9tYWNodHlwZSA9IDI7Ci0jZW5kaWYKLQotICAvKiBOb3RlIHdoaWNoIHNldCBvZiAibW92ZWMiIGNvbnRyb2wgcmVnaXN0ZXJzIGlzIGF2YWlsYWJsZS4gICovCi0gIHNlbGVjdF9jb250cm9sX3JlZ3MgKCk7Ci0KLSAgaWYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKLSAgICAgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gbWNmNTIwMCkKLSAgICBtZF9yZWxheF90YWJsZVtUQUIgKFBDSU5ERVgsIEJZVEUpXS5ybHhfbW9yZSA9IDA7Ci19Ci0MCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgbGFiZWwgaXMgZGVmaW5lZC4gICovCi0KLXZvaWQKLW02OGtfZnJvYl9sYWJlbCAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHN0cnVjdCBsYWJlbF9saW5lICpuOwotCi0gIG4gPSAoc3RydWN0IGxhYmVsX2xpbmUgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLSAgbi0+bmV4dCA9IGxhYmVsczsKLSAgbi0+bGFiZWwgPSBzeW07Ci0gIGFzX3doZXJlICgmbi0+ZmlsZSwgJm4tPmxpbmUpOwotICBuLT50ZXh0ID0gMDsKLSAgbGFiZWxzID0gbjsKLSAgY3VycmVudF9sYWJlbCA9IG47Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSB2YWx1ZSB0aGF0IGlzIG5vdCBhbiBpbnN0cnVjdGlvbiBpcyBlbWl0dGVkLiAgKi8KLQotdm9pZAotbTY4a19mbHVzaF9wZW5kaW5nX291dHB1dCAoKQotewotICBjdXJyZW50X2xhYmVsID0gTlVMTDsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHksIHdoZW4gdGhlIGZpbmFsIHZhbHVlIG9mCi0gICB0aGUgbGFiZWwgaXMga25vd24uICBXZSB3YXJuIGlmIHRoaXMgaXMgYSB0ZXh0IHN5bWJvbCBhbGlnbmVkIGF0IGFuCi0gICBvZGQgbG9jYXRpb24uICAqLwotCi12b2lkCi1tNjhrX2Zyb2Jfc3ltYm9sIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gcmVnX3NlY3Rpb24KLSAgICAgICYmIChpbnQpIFNfR0VUX1ZBTFVFIChzeW0pIDwgMCkKLSAgICB7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW0sIGFic29sdXRlX3NlY3Rpb24pOwotICAgICAgU19TRVRfVkFMVUUgKHN5bSwgfihpbnQpU19HRVRfVkFMVUUgKHN5bSkpOwotICAgIH0KLSAgZWxzZSBpZiAoKFNfR0VUX1ZBTFVFIChzeW0pICYgMSkgIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbGFiZWxfbGluZSAqbDsKLQotICAgICAgZm9yIChsID0gbGFiZWxzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCXsKLQkgIGlmIChsLT5sYWJlbCA9PSBzeW0pCi0JICAgIHsKLQkgICAgICBpZiAobC0+dGV4dCkKLQkJYXNfd2Fybl93aGVyZSAobC0+ZmlsZSwgbC0+bGluZSwKLQkJCSAgICAgICBfKCJ0ZXh0IGxhYmVsIGAlcycgYWxpZ25lZCB0byBvZGQgYm91bmRhcnkiKSwKLQkJCSAgICAgICBTX0dFVF9OQU1FIChzeW0pKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0MCi0vKiBUaGlzIGlzIGNhbGxlZCBpZiB3ZSBnbyBpbiBvciBvdXQgb2YgTVJJIG1vZGUgYmVjYXVzZSBvZiB0aGUgLm1yaQotICAgcHNldWRvLW9wLiAgKi8KLQotdm9pZAotbTY4a19tcmlfbW9kZV9jaGFuZ2UgKG9uKQotICAgICBpbnQgb247Ci17Ci0gIGlmIChvbikKLSAgICB7Ci0gICAgICBpZiAoISBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwpCi0JewotCSAgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsID0gMTsKLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVgKLQkgIGluaXRfcmVndGFibGUgKCk7Ci0jZW5kaWYKLQl9Ci0gICAgICBtNjhrX2Fic3BjYWRkID0gMTsKLSAgICAgIGlmICghIG02OGtfcmVsMzJfZnJvbV9jbWRsaW5lKQotCW02OGtfcmVsMzIgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIHJlZ19wcmVmaXhfb3B0aW9uYWxfc2VlbikKLQl7Ci0jaWZkZWYgUkVHSVNURVJfUFJFRklYX09QVElPTkFMCi0JICBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgPSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUw7Ci0jZWxzZQotCSAgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsID0gMDsKLSNlbmRpZgotI2lmZGVmIFJFR0lTVEVSX1BSRUZJWAotCSAgaW5pdF9yZWd0YWJsZSAoKTsKLSNlbmRpZgotCX0KLSAgICAgIG02OGtfYWJzcGNhZGQgPSAwOwotICAgICAgaWYgKCEgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmUpCi0JbTY4a19yZWwzMiA9IDE7Ci0gICAgfQotfQotCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICBvZiB0eXBlIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyCi0gICBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzCi0gICByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4gICovCi0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQotc3RhdGljIHZvaWQKLW1kX2FwcGx5X2ZpeF8yIChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIG9mZnNldFQgdmFsOwotewotICBhZGRyZXNzVCB1cHBlcl9saW1pdDsKLSAgb2Zmc2V0VCBsb3dlcl9saW1pdDsKLQotICAvKiBUaGlzIGlzIHVubmVjZXNzYXJ5IGJ1dCBpdCBjb252aW5jZXMgdGhlIG5hdGl2ZSByczYwMDAgY29tcGlsZXIKLSAgICAgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgd2Ugd2FudC4gICovCi0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIGJ1ZiArPSBmaXhQLT5meF93aGVyZTsKLSAgLyogZW5kIGlibSBjb21waWxlciB3b3JrYXJvdW5kICovCi0KLSAgaWYgKHZhbCAmIDB4ODAwMDAwMDApCi0gICAgdmFsIHw9IH4oYWRkcmVzc1QpMHg3ZmZmZmZmZjsKLSAgZWxzZQotICAgIHZhbCAmPSAweDdmZmZmZmZmOwotCi0jaWZkZWYgT0JKX0VMRgotICBpZiAoZml4UC0+ZnhfYWRkc3kpCi0gICAgewotICAgICAgbWVtc2V0IChidWYsIDAsIGZpeFAtPmZ4X3NpemUpOwotICAgICAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsOwkvKiBSZW1lbWJlciB2YWx1ZSBmb3IgZW1pdF9yZWxvYyAqLwotCi0gICAgICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotCSAgJiYgIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JICAmJiAhU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0JU19TRVRfV0VBSyAoZml4UC0+ZnhfYWRkc3kpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuOwotI2VuZGlmCi0KLSAgc3dpdGNoIChmaXhQLT5meF9zaXplKQotICAgIHsKLSAgICAgIC8qIFRoZSBjYXN0IHRvIG9mZnNldFQgYmVsb3cgYXJlIG5lY2Vzc2FyeSB0byBtYWtlIGNvZGUgY29ycmVjdCBmb3IKLQkgbWFjaGluZXMgd2hlcmUgaW50cyBhcmUgc21hbGxlciB0aGFuIG9mZnNldFQgKi8KLSAgICBjYXNlIDE6Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICB1cHBlcl9saW1pdCA9IDB4N2Y7Ci0gICAgICBsb3dlcl9saW1pdCA9IC0gKG9mZnNldFQpIDB4ODA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgdXBwZXJfbGltaXQgPSAweDdmZmY7Ci0gICAgICBsb3dlcl9saW1pdCA9IC0gKG9mZnNldFQpIDB4ODAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMjQpOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAxNik7Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgdXBwZXJfbGltaXQgPSAweDdmZmZmZmZmOwotICAgICAgbG93ZXJfbGltaXQgPSAtIChvZmZzZXRUKSAweDdmZmZmZmZmIC0gMTsJLyogYXZvaWQgY29uc3RhbnQgb3ZlcmZsb3cgKi8KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBCQURfQ0FTRSAoZml4UC0+Znhfc2l6ZSk7Ci0gICAgfQotCi0gIC8qIEZpeCB1cCBhIG5lZ2F0aXZlIHJlbG9jLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwgJiYgZml4UC0+Znhfc3Vic3kgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmaXhQLT5meF9hZGRzeSA9IGZpeFAtPmZ4X3N1YnN5OwotICAgICAgZml4UC0+Znhfc3Vic3kgPSBOVUxMOwotICAgICAgZml4UC0+ZnhfdGNiaXQgPSAxOwotICAgIH0KLQotICAvKiBGb3Igbm9uLXBjLXJlbGF0aXZlIHZhbHVlcywgaXQncyBjb25jZWl2YWJsZSB3ZSBtaWdodCBnZXQgc29tZXRoaW5nCi0gICAgIGxpa2UgIjB4ZmYiIGZvciBhIGJ5dGUgZmllbGQuICBTbyBleHRlbmQgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIHJhbmdlCi0gICAgIHRvIGFjY2VwdCBzdWNoIG51bWJlcnMuICBXZSBhcmJpdHJhcmlseSBkaXNhbGxvdyAiLTB4ZmYiIG9yICIweGZmKzB4ZmYiLAotICAgICBzbyB0aGF0IHdlIGNhbiBkbyBhbnkgcmFuZ2UgY2hlY2tpbmcgYXQgYWxsLiAgKi8KLSAgaWYgKCEgZml4UC0+ZnhfcGNyZWwgJiYgISBmaXhQLT5meF9zaWduZWQpCi0gICAgdXBwZXJfbGltaXQgPSB1cHBlcl9saW1pdCAqIDIgKyAxOwotCi0gIGlmICgoYWRkcmVzc1QpIHZhbCA+IHVwcGVyX2xpbWl0Ci0gICAgICAmJiAodmFsID4gMCB8fCB2YWwgPCBsb3dlcl9saW1pdCkpCi0gICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfKCJ2YWx1ZSBvdXQgb2YgcmFuZ2UiKSk7Ci0KLSAgLyogQSBvbmUgYnl0ZSBQQy1yZWxhdGl2ZSByZWxvYyBtZWFucyBhIHNob3J0IGJyYW5jaC4gIFdlIGNhbid0IHVzZQotICAgICBhIHNob3J0IGJyYW5jaCB3aXRoIGEgdmFsdWUgb2YgMCBvciAtMSwgYmVjYXVzZSB0aG9zZSBpbmRpY2F0ZQotICAgICBkaWZmZXJlbnQgb3Bjb2RlcyAoYnJhbmNoZXMgd2l0aCBsb25nZXIgb2Zmc2V0cykuICBmaXh1cF9zZWdtZW50Ci0gICAgIGluIHdyaXRlLmMgbWF5IGhhdmUgY2xvYmJlcmVkIGZ4X3BjcmVsLCBzbyB3ZSBuZWVkIHRvIGV4YW1pbmUgdGhlCi0gICAgIHJlbG9jIHR5cGUuICAqLwotICBpZiAoKGZpeFAtPmZ4X3BjcmVsCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfOF9QQ1JFTAotI2VuZGlmCi0gICAgICAgKQotICAgICAgJiYgZml4UC0+Znhfc2l6ZSA9PSAxCi0gICAgICAmJiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTAotCSAgfHwgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpCi0gICAgICAmJiAodmFsID09IDAgfHwgdmFsID09IC0xKSkKLSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIF8oImludmFsaWQgYnl0ZSBicmFuY2ggb2Zmc2V0IikpOwotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotaW50Ci1tZF9hcHBseV9maXggKGZpeFAsIHZhbHApCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFscDsKLXsKLSAgbWRfYXBwbHlfZml4XzIgKGZpeFAsIChhZGRyZXNzVCkgKnZhbHApOwotICByZXR1cm4gMTsKLX0KLSNlbHNlCi12b2lkIG1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgbWRfYXBwbHlfZml4XzIgKGZpeFAsIChhZGRyZXNzVCkgdmFsKTsKLX0KLSNlbmRpZgotCi0vKiAqZnJhZ1AgaGFzIGJlZW4gcmVsYXhlZCB0byBpdHMgZmluYWwgc2l6ZSwgYW5kIG5vdyBuZWVkcyB0byBoYXZlCi0gICB0aGUgYnl0ZXMgaW5zaWRlIGl0IG1vZGlmaWVkIHRvIGNvbmZvcm0gdG8gdGhlIG5ldyBzaXplICBUaGVyZSBpcyBVR0xZCi0gICBNQUdJQyBoZXJlLiAuLgotICAgKi8KLXN0YXRpYyB2b2lkCi1tZF9jb252ZXJ0X2ZyYWdfMSAoZnJhZ1ApCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLXsKLSAgbG9uZyBkaXNwOwotICBsb25nIGV4dCA9IDA7Ci0gIGZpeFMgKmZpeFA7Ci0KLSAgLyogQWRkcmVzcyBpbiBvYmplY3QgY29kZSBvZiB0aGUgZGlzcGxhY2VtZW50LiAgKi8KLSAgcmVnaXN0ZXIgaW50IG9iamVjdF9hZGRyZXNzID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9hZGRyZXNzOwotCi0gIC8qIEFkZHJlc3MgaW4gZ2FzIGNvcmUgb2YgdGhlIHBsYWNlIHRvIHN0b3JlIHRoZSBkaXNwbGFjZW1lbnQuICAqLwotICAvKiBUaGlzIGNvbnZpbmNlcyB0aGUgbmF0aXZlIHJzNjAwMCBjb21waWxlciB0byBnZW5lcmF0ZSB0aGUgY29kZSB3ZQotICAgICB3YW50LiAqLwotICByZWdpc3RlciBjaGFyICpidWZmZXJfYWRkcmVzcyA9IGZyYWdQLT5mcl9saXRlcmFsOwotICBidWZmZXJfYWRkcmVzcyArPSBmcmFnUC0+ZnJfZml4OwotICAvKiBlbmQgaWJtIGNvbXBpbGVyIHdvcmthcm91bmQgKi8KLQotICAvKiBUaGUgZGlzcGxhY2VtZW50IG9mIHRoZSBhZGRyZXNzLCBmcm9tIGN1cnJlbnQgbG9jYXRpb24uICAqLwotICBkaXNwID0gZnJhZ1AtPmZyX3N5bWJvbCA/IFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKSA6IDA7Ci0gIGRpc3AgPSAoZGlzcCArIGZyYWdQLT5mcl9vZmZzZXQpIC0gb2JqZWN0X2FkZHJlc3M7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGRpc3AgKz0gZnJhZ1AtPmZyX3N5bWJvbC0+c3lfZnJhZy0+ZnJfYWRkcmVzczsKLSNlbmRpZgotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgVEFCIChCQ0M2ODAwMCwgQllURSk6Ci0gICAgY2FzZSBUQUIgKEFCUkFOQ0gsIEJZVEUpOgotICAgICAga25vdyAoaXNzYnl0ZSAoZGlzcCkpOwotICAgICAgaWYgKGRpc3AgPT0gMCkKLQlhc19iYWQgKF8oInNob3J0IGJyYW5jaCB3aXRoIHplcm8gb2Zmc2V0OiB1c2UgOnciKSk7Ci0gICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gZGlzcDsKLSAgICAgIGV4dCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoREJDQywgU0hPUlQpOgotICAgICAga25vdyAoaXNzd29yZCAoZGlzcCkpOwotICAgICAgZXh0ID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChCQ0M2ODAwMCwgU0hPUlQpOgotICAgIGNhc2UgVEFCIChBQlJBTkNILCBTSE9SVCk6Ci0gICAgICBrbm93IChpc3N3b3JkIChkaXNwKSk7Ci0gICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gMHgwMDsKLSAgICAgIGV4dCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoQUJSQU5DSCwgTE9ORyk6Ci0gICAgICBpZiAoIUhBVkVfTE9OR19CUkFOQ0goY3VycmVudF9hcmNoaXRlY3R1cmUpKQotCXsKLQkgIGlmIChmcmFnUC0+ZnJfb3Bjb2RlWzBdID09IDB4NjEpCi0JICAgIC8qIEJTUiAqLwotCSAgICB7Ci0JICAgICAgZnJhZ1AtPmZyX29wY29kZVswXSA9IDB4NEU7Ci0JICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IChjaGFyKSAweEI5OyAvKiBKQlNSIHdpdGggQUJTTCBMT05HIG9mZnNldCAqLwotCi0JICAgICAgZml4X25ldyAoZnJhZ1AsCi0JCSAgICAgICBmcmFnUC0+ZnJfZml4LAotCQkgICAgICAgNCwKLQkJICAgICAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LAotCQkgICAgICAgMCwKLQkJICAgICAgIE5PX1JFTE9DKTsKLQotCSAgICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLQkgICAgICBleHQgPSAwOwotCSAgICB9Ci0JICAvKiBCUkEgKi8KLQkgIGVsc2UgaWYgKGZyYWdQLT5mcl9vcGNvZGVbMF0gPT0gMHg2MCkKLQkgICAgewotCSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMF0gPSAweDRFOwotCSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSAoY2hhcikgMHhGOTsgLyogSk1QICB3aXRoIEFCU0wgTE9ORyBvZmZzZXQgKi8KLQkgICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDAsIE5PX1JFTE9DKTsKLQkgICAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JICAgICAgZXh0ID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJMb25nIGJyYW5jaCBvZmZzZXQgbm90IHN1cHBvcnRlZC4iKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IChjaGFyKSAweGZmOwotCSAgZXh0ID0gNDsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoQkNDNjgwMDAsIExPTkcpOgotICAgICAgLyogb25seSBCY2MgNjgwMDAgaW5zdHJ1Y3Rpb25zIGNhbiBjb21lIGhlcmUgKi8KLSAgICAgIC8qIGNoYW5nZSBiY2MgaW50byBiIWNjL2ptcCBhYnNsIGxvbmcgKi8KLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMF0gXj0gMHgwMTsJLyogaW52ZXJ0IGJjYyAqLwotICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IDB4NjsvKiBicmFuY2ggb2Zmc2V0ID0gNiAqLwotCi0gICAgICAvKiBKRjogdGhlc2UgdXNlZCB0byBiZSBmcl9vcGNvZGVbMiwzXSwgYnV0IHRoZXkgbWF5IGJlIGluIGEKLQkgICBkaWZmZXJlbnQgZnJhZywgaW4gd2hpY2ggY2FzZSByZWZlcmluZyB0byB0aGVtIGlzIGEgbm8tbm8uCi0JICAgT25seSBmcl9vcGNvZGVbMCwxXSBhcmUgZ3VhcmFudGVlZCB0byB3b3JrLiAqLwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDRlOwkvKiBwdXQgaW4gam1wIGxvbmcgKDB4NGVmOSkgKi8KLSAgICAgICpidWZmZXJfYWRkcmVzcysrID0gKGNoYXIpIDB4Zjk7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7CS8qIGFjY291bnQgZm9yIGptcCBpbnN0cnVjdGlvbiAqLwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDAsIE5PX1JFTE9DKTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLSAgICAgIGV4dCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoREJDQywgTE9ORyk6Ci0gICAgICAvKiBvbmx5IERCY2MgNjgwMDAgaW5zdHJ1Y3Rpb25zIGNhbiBjb21lIGhlcmUgKi8KLSAgICAgIC8qIGNoYW5nZSBkYmNjIGludG8gZGJjYy9qbXAgYWJzbCBsb25nICovCi0gICAgICAvKiBKRjogdGhlc2UgdXNlZCB0byBiZSBmcl9vcGNvZGVbMi03XSwgYnV0IHRoYXQncyB3cm9uZyAqLwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDAwOwkvKiBicmFuY2ggb2Zmc2V0ID0gNCAqLwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDA0OwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDYwOwkvKiBwdXQgaW4gYnJhIHBjKzYgKi8KLSAgICAgICpidWZmZXJfYWRkcmVzcysrID0gMHgwNjsKLSAgICAgICpidWZmZXJfYWRkcmVzcysrID0gMHg0ZTsJLyogcHV0IGluIGptcCBsb25nICgweDRlZjkpICovCi0gICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IChjaGFyKSAweGY5OwotCi0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDY7CS8qIGFjY291bnQgZm9yIGJyYS9qbXAgaW5zdHJ1Y3Rpb25zICovCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotICAgICAgZXh0ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChGQlJBTkNILCBTSE9SVCk6Ci0gICAgICBrbm93ICgoZnJhZ1AtPmZyX29wY29kZVsxXSAmIDB4NDApID09IDApOwotICAgICAgZXh0ID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChGQlJBTkNILCBMT05HKToKLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gfD0gMHg0MDsJLyogVHVybiBvbiBMT05HIGJpdCAqLwotICAgICAgZXh0ID0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChQQ1JFTCwgU0hPUlQpOgotICAgICAgZXh0ID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChQQ1JFTCwgTE9ORyk6Ci0gICAgICAvKiBUaGUgdGhpbmcgdG8gZG8gaGVyZSBpcyBmb3JjZSBpdCB0byBBQlNPTFVURSBMT05HLCBzaW5jZQotCVBDUkVMIGlzIHJlYWxseSB0cnlpbmcgdG8gc2hvcnRlbiBhbiBBQlNPTFVURSBhZGRyZXNzIGFueXdheSAqLwotICAgICAgLyogSkYgRk9PIFRoaXMgY29kZSBoYXMgbm90IGJlZW4gdGVzdGVkICovCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwKLQkgICAgICAgMCwgTk9fUkVMT0MpOwotICAgICAgaWYgKChmcmFnUC0+ZnJfb3Bjb2RlWzFdICYgMHgzRikgIT0gMHgzQSkKLQlhc19iYWQgKF8oIkludGVybmFsIGVycm9yIChsb25nIFBDLXJlbGF0aXZlIG9wZXJhbmQpIGZvciBpbnNuIDB4JTA0eCBhdCAweCVseCIpLAotCQkodW5zaWduZWQpIGZyYWdQLT5mcl9vcGNvZGVbMF0sCi0JCSh1bnNpZ25lZCBsb25nKSBmcmFnUC0+ZnJfYWRkcmVzcyk7Ci0gICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdICY9IH4weDNGOwotICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSB8PSAweDM5OwkvKiBNb2RlIDcuMSAqLwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotICAgICAgZXh0ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChQQ0xFQSwgU0hPUlQpOgotICAgICAgZml4X25ldyAoZnJhZ1AsIChpbnQpIChmcmFnUC0+ZnJfZml4KSwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgTk9fUkVMT0MpOwotICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSAmPSB+MHgzRjsKLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gfD0gMHgzQTsgLyogMDcyIC0gbW9kZSA3LjIgKi8KLSAgICAgIGV4dCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoUENMRUEsIExPTkcpOgotICAgICAgZml4UCA9IGZpeF9uZXcgKGZyYWdQLCAoaW50KSAoZnJhZ1AtPmZyX2ZpeCkgKyAyLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7Ci0gICAgICBmaXhQLT5meF9wY3JlbF9hZGp1c3QgPSAyOwotICAgICAgLyogQWxyZWFkeSBzZXQgdG8gbW9kZSA3LjM7IHRoaXMgaW5kaWNhdGVzOiBQQyBpbmRpcmVjdCB3aXRoCi0JIHN1cHByZXNzZWQgaW5kZXgsIDMyLWJpdCBkaXNwbGFjZW1lbnQuICAqLwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDAxOwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDcwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotICAgICAgZXh0ID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUQUIgKFBDSU5ERVgsIEJZVEUpOgotICAgICAgZGlzcCArPSAyOwotICAgICAgaWYgKCFpc3NieXRlIChkaXNwKSkKLQl7Ci0JICBhc19iYWQgKF8oImRpc3BsYWNlbWVudCBkb2Vzbid0IGZpdCBpbiBvbmUgYnl0ZSIpKTsKLQkgIGRpc3AgPSAwOwotCX0KLSAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX2ZpeCA+PSAyKTsKLSAgICAgIGJ1ZmZlcl9hZGRyZXNzWy0yXSAmPSB+MTsKLSAgICAgIGJ1ZmZlcl9hZGRyZXNzWy0xXSA9IGRpc3A7Ci0gICAgICBleHQgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKFBDSU5ERVgsIFNIT1JUKToKLSAgICAgIGRpc3AgKz0gMjsKLSAgICAgIGFzc2VydCAoaXNzd29yZCAoZGlzcCkpOwotICAgICAgYXNzZXJ0IChmcmFnUC0+ZnJfZml4ID49IDIpOwotICAgICAgYnVmZmVyX2FkZHJlc3NbLTJdIHw9IDB4MTsKLSAgICAgIGJ1ZmZlcl9hZGRyZXNzWy0xXSA9IDB4MjA7Ci0gICAgICBmaXhQID0gZml4X25ldyAoZnJhZ1AsIChpbnQpIChmcmFnUC0+ZnJfZml4KSwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICAgZnJhZ1AtPmZyX29mZnNldCwgKGZyYWdQLT5mcl9vcGNvZGVbMV0gJiAwNzcpID09IDA3MywKLQkJICAgICAgTk9fUkVMT0MpOwotICAgICAgZml4UC0+ZnhfcGNyZWxfYWRqdXN0ID0gMjsKLSAgICAgIGV4dCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoUENJTkRFWCwgTE9ORyk6Ci0gICAgICBkaXNwICs9IDI7Ci0gICAgICBmaXhQID0gZml4X25ldyAoZnJhZ1AsIChpbnQpIChmcmFnUC0+ZnJfZml4KSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICAgZnJhZ1AtPmZyX29mZnNldCwgKGZyYWdQLT5mcl9vcGNvZGVbMV0gJiAwNzcpID09IDA3MywKLQkJICAgICAgTk9fUkVMT0MpOwotICAgICAgZml4UC0+ZnhfcGNyZWxfYWRqdXN0ID0gMjsKLSAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX2ZpeCA+PSAyKTsKLSAgICAgIGJ1ZmZlcl9hZGRyZXNzWy0yXSB8PSAweDE7Ci0gICAgICBidWZmZXJfYWRkcmVzc1stMV0gPSAweDMwOwotICAgICAgZXh0ID0gNDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoZXh0KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmZmVyX2FkZHJlc3MsIChsb25nKSBkaXNwLCAoaW50KSBleHQpOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSBleHQ7Ci0gICAgfQotfQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWMsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGZyYWdTICpmcmFnUDsKLXsKLSAgbWRfY29udmVydF9mcmFnXzEgKGZyYWdQKTsKLX0KLQotI2Vsc2UKLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIG1kX2NvbnZlcnRfZnJhZ18xIChmcmFnUCk7Ci19Ci0jZW5kaWYKLQotLyogRm9yY2UgdHJ1bHkgdW5kZWZpbmVkIHN5bWJvbHMgdG8gdGhlaXIgbWF4aW11bSBzaXplLCBhbmQgZ2VuZXJhbGx5IHNldCB1cAotICAgdGhlIGZyYWcgbGlzdCB0byBiZSByZWxheGVkCi0gICAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnQpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWdtZW50OwotewotICBpbnQgb2xkX2ZpeDsKLSAgcmVnaXN0ZXIgY2hhciAqYnVmZmVyX2FkZHJlc3MgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWw7Ci0KLSAgb2xkX2ZpeCA9IGZyYWdQLT5mcl9maXg7Ci0KLSAgLyogaGFuZGxlIFNaX1VOREVGIGZpcnN0LCBpdCBjYW4gYmUgY2hhbmdlZCB0byBCWVRFIG9yIFNIT1JUICovCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotCi0gICAgY2FzZSBUQUIgKEFCUkFOQ0gsIFNaX1VOREVGKToKLSAgICAgIHsKLQlpZiAoKGZyYWdQLT5mcl9zeW1ib2wgIT0gTlVMTCkJLyogTm90IGFic29sdXRlICovCi0JICAgICYmIFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQKLQkgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChUQUJUWVBFIChmcmFnUC0+ZnJfc3VidHlwZSksIEJZVEUpOwotCSAgICBicmVhazsKLQkgIH0KLQllbHNlIGlmICgoZnJhZ1AtPmZyX3N5bWJvbCA9PSAwKSB8fCAhSEFWRV9MT05HX0JSQU5DSChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0JICB7Ci0JICAgIC8qIE9uIDY4MDAwLCBvciBmb3IgYWJzb2x1dGUgdmFsdWUsIHN3aXRjaCB0byBhYnMgbG9uZyAqLwotCSAgICAvKiBGSVhNRSwgd2Ugc2hvdWxkIGNoZWNrIGFicyB2YWwsIHBpY2sgc2hvcnQgb3IgbG9uZyAqLwotCSAgICBpZiAoZnJhZ1AtPmZyX29wY29kZVswXSA9PSAweDYxKQotCSAgICAgIHsKLQkJZnJhZ1AtPmZyX29wY29kZVswXSA9IDB4NEU7Ci0JCWZyYWdQLT5mcl9vcGNvZGVbMV0gPSAoY2hhcikgMHhCOTsgLyogSkJTUiB3aXRoIEFCU0wgTE9ORyBvZmZzZXQgKi8KLQkJZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsCi0JCQkgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOwotCQlmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JCWZyYWdfd2FuZSAoZnJhZ1ApOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoZnJhZ1AtPmZyX29wY29kZVswXSA9PSAweDYwKQotCSAgICAgIHsKLQkJZnJhZ1AtPmZyX29wY29kZVswXSA9IDB4NEU7Ci0JCWZyYWdQLT5mcl9vcGNvZGVbMV0gPSAoY2hhcikgMHhGOTsgLyogSk1QICB3aXRoIEFCU0wgTE9ORyBvZmZzZXQgKi8KLQkJZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsCi0JCQkgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOwotCQlmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JCWZyYWdfd2FuZSAoZnJhZ1ApOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYXNfd2FybiAoXygiTG9uZyBicmFuY2ggb2Zmc2V0IHRvIGV4dGVybiBzeW1ib2wgbm90IHN1cHBvcnRlZC4iKSk7Ci0JICAgICAgfQotCSAgfQotCWVsc2UKLQkgIHsJCQkvKiBTeW1ib2wgaXMgc3RpbGwgdW5kZWZpbmVkLiAgTWFrZSBpdCBzaW1wbGUgKi8KLQkgICAgZml4X25ldyAoZnJhZ1AsIChpbnQpIChmcmFnUC0+ZnJfZml4KSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLQkgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IChjaGFyKSAweGZmOwotCSAgICBmcmFnX3dhbmUgKGZyYWdQKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQlicmVhazsKLSAgICAgIH0JCQkJLyogY2FzZSBUQUIoQUJSQU5DSCxTWl9VTkRFRikgKi8KLQotICAgIGNhc2UgVEFCIChGQlJBTkNILCBTWl9VTkRFRik6Ci0gICAgICB7Ci0JaWYgKChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50Ci0JICAgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQkgICAgfHwgZmxhZ19zaG9ydF9yZWZzKQotCSAgewotCSAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoRkJSQU5DSCwgU0hPUlQpOwotCSAgICBmcmFnUC0+ZnJfdmFyICs9IDI7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBmaXhfbmV3IChmcmFnUCwgKGludCkgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLQkgICAgZnJhZ1AtPmZyX29wY29kZVsxXSB8PSAweDQwOyAvKiBUdXJuIG9uIExPTkcgYml0ICovCi0JICAgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCSAgfQotCWJyZWFrOwotICAgICAgfQkJCQkvKiBUQUIoRkJSQU5DSCxTWl9VTkRFRikgKi8KLQotICAgIGNhc2UgVEFCIChQQ1JFTCwgU1pfVU5ERUYpOgotICAgICAgewotCWlmICgoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudAotCSAgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JICAgIHx8IGZsYWdfc2hvcnRfcmVmcwotCSAgICB8fCBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpIDwgbTY4MDIwCi0JICAgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gbWNmNTIwMCkKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFBDUkVMLCBTSE9SVCk7Ci0JICAgIGZyYWdQLT5mcl92YXIgKz0gMjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChQQ1JFTCwgTE9ORyk7Ci0JICAgIGZyYWdQLT5mcl92YXIgKz0gNDsKLQkgIH0KLQlicmVhazsKLSAgICAgIH0JCQkJLyogVEFCKFBDUkVMLFNaX1VOREVGKSAqLwotCi0gICAgY2FzZSBUQUIgKEJDQzY4MDAwLCBTWl9VTkRFRik6Ci0gICAgICB7Ci0JaWYgKChmcmFnUC0+ZnJfc3ltYm9sICE9IE5VTEwpCi0JICAgICYmIFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQKLQkgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChCQ0M2ODAwMCwgQllURSk7Ci0JICAgIGJyZWFrOwotCSAgfQotCS8qIG9ubHkgQmNjIDY4MDAwIGluc3RydWN0aW9ucyBjYW4gY29tZSBoZXJlICovCi0JLyogY2hhbmdlIGJjYyBpbnRvIGIhY2Mvam1wIGFic2wgbG9uZyAqLwotCWZyYWdQLT5mcl9vcGNvZGVbMF0gXj0gMHgwMTsJLyogaW52ZXJ0IGJjYyAqLwotCWlmIChmbGFnX3Nob3J0X3JlZnMpCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSAweDA0OwkvKiBicmFuY2ggb2Zmc2V0ID0gNiAqLwotCSAgICAvKiBKRjogdGhlc2Ugd2VyZSBmcl9vcGNvZGVbMiwzXSAqLwotCSAgICBidWZmZXJfYWRkcmVzc1swXSA9IDB4NGU7CS8qIHB1dCBpbiBqbXAgbG9uZyAoMHg0ZWY5KSAqLwotCSAgICBidWZmZXJfYWRkcmVzc1sxXSA9IChjaGFyKSAweGY4OwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IDI7CS8qIGFjY291bnQgZm9yIGptcCBpbnN0cnVjdGlvbiAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSAweDA2OwkvKiBicmFuY2ggb2Zmc2V0ID0gNiAqLwotCSAgICAvKiBKRjogdGhlc2Ugd2VyZSBmcl9vcGNvZGVbMiwzXSAqLwotCSAgICBidWZmZXJfYWRkcmVzc1swXSA9IDB4NGU7CS8qIHB1dCBpbiBqbXAgbG9uZyAoMHg0ZWY5KSAqLwotCSAgICBidWZmZXJfYWRkcmVzc1sxXSA9IChjaGFyKSAweGY5OwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IDI7CS8qIGFjY291bnQgZm9yIGptcCBpbnN0cnVjdGlvbiAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLQkgIH0KLQlmcmFnX3dhbmUgKGZyYWdQKTsKLQlicmVhazsKLSAgICAgIH0JCQkJLyogY2FzZSBUQUIoQkNDNjgwMDAsU1pfVU5ERUYpICovCi0KLSAgICBjYXNlIFRBQiAoREJDQywgU1pfVU5ERUYpOgotICAgICAgewotCWlmIChmcmFnUC0+ZnJfc3ltYm9sICE9IE5VTEwKLQkgICAgJiYgU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudAotCSAgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKERCQ0MsIFNIT1JUKTsKLQkgICAgZnJhZ1AtPmZyX3ZhciArPSAyOwotCSAgICBicmVhazsKLQkgIH0KLQkvKiBvbmx5IERCY2MgNjgwMDAgaW5zdHJ1Y3Rpb25zIGNhbiBjb21lIGhlcmUgKi8KLQkvKiBjaGFuZ2UgZGJjYyBpbnRvIGRiY2Mvam1wIGFic2wgbG9uZyAqLwotCS8qIEpGOiB0aGVzZSB1c2VkIHRvIGJlIGZyX29wY29kZVsyLTRdLCB3aGljaCBpcyB3cm9uZy4gKi8KLQlidWZmZXJfYWRkcmVzc1swXSA9IDB4MDA7CS8qIGJyYW5jaCBvZmZzZXQgPSA0ICovCi0JYnVmZmVyX2FkZHJlc3NbMV0gPSAweDA0OwotCWJ1ZmZlcl9hZGRyZXNzWzJdID0gMHg2MDsJLyogcHV0IGluIGJyYSBwYyArIC4uLiAqLwotCi0JaWYgKGZsYWdfc2hvcnRfcmVmcykKLQkgIHsKLQkgICAgLyogSkY6IHRoZXNlIHdlcmUgZnJfb3Bjb2RlWzUtN10gKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbM10gPSAweDA0OwkvKiBwbHVzIDQgKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbNF0gPSAweDRlOwkvKiBQdXQgaW4gSnVtcCBXb3JkICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzVdID0gKGNoYXIpIDB4Zjg7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNjsJLyogYWNjb3VudCBmb3IgYnJhL2ptcCBpbnN0cnVjdGlvbiAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIC8qIEpGOiB0aGVzZSB3ZXJlIGZyX29wY29kZVs1LTddICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzNdID0gMHgwNjsJLyogUGx1cyA2ICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzRdID0gMHg0ZTsJLyogcHV0IGluIGptcCBsb25nICgweDRlZjkpICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzVdID0gKGNoYXIpIDB4Zjk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNjsJLyogYWNjb3VudCBmb3IgYnJhL2ptcCBpbnN0cnVjdGlvbiAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLQkgIH0KLQotCWZyYWdfd2FuZSAoZnJhZ1ApOwotCWJyZWFrOwotICAgICAgfQkJCQkvKiBjYXNlIFRBQihEQkNDLFNaX1VOREVGKSAqLwotCi0gICAgY2FzZSBUQUIgKFBDTEVBLCBTWl9VTkRFRik6Ci0gICAgICB7Ci0JaWYgKCgoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkpID09IHNlZ21lbnQKLQkgICAgICYmIHJlbGF4YWJsZV9zeW1ib2wgKGZyYWdQLT5mcl9zeW1ib2wpKQotCSAgICB8fCBmbGFnX3Nob3J0X3JlZnMKLQkgICAgfHwgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA8IG02ODAyMAotCSAgICB8fCBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpID09IG1jZjUyMDApCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChQQ0xFQSwgU0hPUlQpOwotCSAgICBmcmFnUC0+ZnJfdmFyICs9IDI7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoUENMRUEsIExPTkcpOwotCSAgICBmcmFnUC0+ZnJfdmFyICs9IDY7Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICB9CQkJCS8qIFRBQihQQ0xFQSxTWl9VTkRFRikgKi8KLQotICAgIGNhc2UgVEFCIChQQ0lOREVYLCBTWl9VTkRFRik6Ci0gICAgICBpZiAoKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQKLQkgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQkgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKLQkgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gbWNmNTIwMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoUENJTkRFWCwgQllURSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChQQ0lOREVYLCBMT05HKTsKLQkgIGZyYWdQLT5mcl92YXIgKz0gNDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogbm93IHRoYXQgU1pfVU5ERUYgYXJlIHRha2VuIGNhcmUgb2YsIGNoZWNrIG90aGVycyAqLwotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIFRBQiAoQkNDNjgwMDAsIEJZVEUpOgotICAgIGNhc2UgVEFCIChBQlJBTkNILCBCWVRFKToKLSAgICAgIC8qIFdlIGNhbid0IGRvIGEgc2hvcnQganVtcCB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgc28gaW4gdGhhdAotCSBjYXNlIHdlIGZvcmNlIHdvcmQgbW9kZS4gIEF0IHRoaXMgcG9pbnQgU19HRVRfVkFMVUUgc2hvdWxkCi0JIHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBzeW1ib2wgd2l0aGluIGl0cyBmcmFnLiAgSWYgdGhlCi0JIHN5bWJvbCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBmcmFnLCBhbmQgaXQgaXMgdGhlIG5leHQgZnJhZwotCSB3aXRoIGFueSBkYXRhIGluIGl0ICh1c3VhbGx5IHRoaXMgaXMganVzdCB0aGUgbmV4dCBmcmFnLCBidXQKLQkgYXNzZW1ibGVyIGxpc3RpbmdzIG1heSBpbnRyb2R1Y2UgZW1wdHkgZnJhZ3MpLCB3ZSBtdXN0IHVzZQotCSB3b3JkIG1vZGUuICAqLwotICAgICAgaWYgKGZyYWdQLT5mcl9zeW1ib2wgJiYgU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpID09IDApCi0JewotCSAgZnJhZ1MgKmw7Ci0KLQkgIGZvciAobCA9IGZyYWdQLT5mcl9uZXh0OwotCSAgICAgICBsICE9IGZyYWdQLT5mcl9zeW1ib2wtPnN5X2ZyYWc7Ci0JICAgICAgIGwgPSBsLT5mcl9uZXh0KQotCSAgICBpZiAobC0+ZnJfZml4ICsgbC0+ZnJfdmFyICE9IDApCi0JICAgICAgYnJlYWs7Ci0JICBpZiAobCA9PSBmcmFnUC0+ZnJfc3ltYm9sLT5zeV9mcmFnKQotCSAgICB7Ci0JICAgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFRBQlRZUEUgKGZyYWdQLT5mcl9zdWJ0eXBlKSwgU0hPUlQpOwotCSAgICAgIGZyYWdQLT5mcl92YXIgKz0gMjsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9maXg7Ci19Ci0KLSNpZiBkZWZpbmVkKE9CSl9BT1VUKSB8IGRlZmluZWQoT0JKX0JPVVQpCi0vKiB0aGUgYml0LWZpZWxkIGVudHJpZXMgaW4gdGhlIHJlbG9jYXRpb25faW5mbyBzdHJ1Y3QgcGxheXMgaGVsbAotICAgd2l0aCB0aGUgYnl0ZS1vcmRlciBwcm9ibGVtcyBvZiBjcm9zcy1hc3NlbWJseS4gIFNvIGFzIGEgaGFjaywKLSAgIEkgYWRkZWQgdGhpcyBtYWNoLiBkZXBlbmRlbnQgcmkgdHdpZGRsZXIuICBVZ2x5LCBidXQgaXQgZ2V0cwotICAgeW91IHRoZXJlLiAtS1dLICovCi0vKiBvbiBtNjhrOiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgbG9uZywgbmV4dCB0aHJlZSBieXRlcwotICAgYXJlIHN5bWJvbG51bSwgbW9zdCBzaWcuIGJ5dGUgZmlyc3QuICBMYXN0IGJ5dGUgaXMgYnJva2VuIHVwIHdpdGgKLSAgIGJpdCA3IGFzIHBjcmVsLCBiaXRzIDYgJiA1IGFzIGxlbmd0aCwgYml0IDQgYXMgcGNyZWwsIGFuZCB0aGUgbG93ZXIKLSAgIG5pYmJsZSBhcyBudXRoaW4uIChvbiBTdW4gMyBhdCBsZWFzdCkgKi8KLS8qIFRyYW5zbGF0ZSB0aGUgaW50ZXJuYWwgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBpbnRvIHRhcmdldC1zcGVjaWZpYwotICAgZm9ybWF0LiAqLwotI2lmZGVmIGNvbW1lbnQKLXZvaWQKLW1kX3JpX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpKQotICAgICBjaGFyICp0aGVfYnl0ZXM7Ci0gICAgIHN0cnVjdCByZWxvY19pbmZvX2dlbmVyaWMgKnJpOwotewotICAvKiB0aGlzIGlzIGVhc3kgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpLT5yX2FkZHJlc3MsIDQpOwotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICB0aGVfYnl0ZXNbNF0gPSAocmktPnJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbNV0gPSAocmktPnJfc3ltYm9sbnVtID4+IDgpICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s2XSA9IHJpLT5yX3N5bWJvbG51bSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbN10gPSAoKChyaS0+cl9wY3JlbCA8PCA3KSAmIDB4ODApIHwgKChyaS0+cl9sZW5ndGggPDwgNSkgJiAweDYwKSB8Ci0JCSAgKChyaS0+cl9leHRlcm4gPDwgNCkgJiAweDEwKSk7Ci19Ci0KLSNlbmRpZiAvKiBjb21tZW50ICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotdm9pZAotdGNfYW91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICAvKgotICAgKiBJbjogbGVuZ3RoIG9mIHJlbG9jYXRpb24gKG9yIG9mIGFkZHJlc3MpIGluIGNoYXJzOiAxLCAyIG9yIDQuCi0gICAqIE91dDogR05VIExEIHJlbG9jYXRpb24gbGVuZ3RoIGNvZGU6IDAsIDEsIG9yIDIuCi0gICAqLwotCi0gIHN0YXRpYyBDT05TVCB1bnNpZ25lZCBjaGFyIG5ieXRlc19yX2xlbmd0aFtdID0gezQyLCAwLCAxLCA0MiwgMn07Ci0gIGxvbmcgcl9zeW1ib2xudW07Ci0KLSAga25vdyAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCk7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwKLSAgICAgICBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSwKLQkJICAgICAgNCk7Ci0KLSAgcl9zeW1ib2xudW0gPSAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkJID8gU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpCi0JCSA6IGZpeFAtPmZ4X2FkZHN5LT5zeV9udW1iZXIpOwotCi0gIHdoZXJlWzRdID0gKHJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB3aGVyZVs1XSA9IChyX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB3aGVyZVs2XSA9IHJfc3ltYm9sbnVtICYgMHgwZmY7Ci0gIHdoZXJlWzddID0gKCgoZml4UC0+ZnhfcGNyZWwgPDwgNykgJiAweDgwKSB8ICgobmJ5dGVzX3JfbGVuZ3RoW2ZpeFAtPmZ4X3NpemVdIDw8IDUpICYgMHg2MCkgfAotCSAgICAgICgoKCFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkgPDwgNCkgJiAweDEwKSk7Ci19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotQ09OU1QgaW50IG1kX3Nob3J0X2p1bXBfc2l6ZSA9IDQ7Ci1DT05TVCBpbnQgbWRfbG9uZ19qdW1wX3NpemUgPSA2OwotCi12b2lkCi1tZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIChmcm9tX2FkZHIgKyAyKTsKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHg2MDAwLCAyKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIgKyAyLCAodmFsdWVUKSBvZmZzZXQsIDIpOwotfQotCi12b2lkCi1tZF9jcmVhdGVfbG9uZ19qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgdmFsdWVUIG9mZnNldDsKLQotICBpZiAoIUhBVkVfTE9OR19CUkFOQ0goY3VycmVudF9hcmNoaXRlY3R1cmUpKQotICAgIHsKLSAgICAgIG9mZnNldCA9IHRvX2FkZHIgLSBTX0dFVF9WQUxVRSAodG9fc3ltYm9sKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyLCAodmFsdWVUKSAweDRFRjksIDIpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIgKyAyLCAodmFsdWVUKSBvZmZzZXQsIDQpOwotICAgICAgZml4X25ldyAoZnJhZywgKHB0ciArIDIpIC0gZnJhZy0+ZnJfbGl0ZXJhbCwgNCwgdG9fc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkgICAgICAgMCwgTk9fUkVMT0MpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG9mZnNldCA9IHRvX2FkZHIgLSAoZnJvbV9hZGRyICsgMik7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHg2MGZmLCAyKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyICsgMiwgKHZhbHVlVCkgb2Zmc2V0LCA0KTsKLSAgICB9Ci19Ci0KLSNlbmRpZgotCi0vKiBEaWZmZXJlbnQgdmFsdWVzIG9mIE9LIHRlbGwgd2hhdCBpdHMgT0sgdG8gcmV0dXJuLiAgVGhpbmdzIHRoYXQKLSAgIGFyZW4ndCBPSyBhcmUgYW4gZXJyb3IgKHdoYXQgYSBzaG9jaywgbm8/KQotCi0gICAwOiAgRXZlcnl0aGluZyBpcyBPSwotICAgMTA6ICBBYnNvbHV0ZSAxOjgJb25seQotICAgMjA6ICBBYnNvbHV0ZSAwOjcJb25seQotICAgMzA6ICBhYnNvbHV0ZSAwOjE1CW9ubHkKLSAgIDQwOiAgQWJzb2x1dGUgMDozMQlvbmx5Ci0gICA1MDogIGFic29sdXRlIDA6MTI3CW9ubHkKLSAgIDU1OiAgYWJzb2x1dGUgLTY0OjYzICAgIG9ubHkKLSAgIDYwOiAgYWJzb2x1dGUgLTEyODoxMjcJb25seQotICAgNzA6ICBhYnNvbHV0ZSAwOjQwOTUJb25seQotICAgODA6ICBObyBiaWdudW1zCi0KLSAgICovCi0KLXN0YXRpYyBpbnQKLWdldF9udW0gKGV4cCwgb2spCi0gICAgIHN0cnVjdCBtNjhrX2V4cCAqZXhwOwotICAgICBpbnQgb2s7Ci17Ci0gIGlmIChleHAtPmV4cC5YX29wID09IE9fYWJzZW50KQotICAgIHsKLSAgICAgIC8qIERvIHRoZSBzYW1lIHRoaW5nIHRoZSBWQVggYXNtIGRvZXMgKi8KLSAgICAgIG9wIChleHApID0gT19jb25zdGFudDsKLSAgICAgIGFkZHMgKGV4cCkgPSAwOwotICAgICAgc3VicyAoZXhwKSA9IDA7Ci0gICAgICBvZmZzIChleHApID0gMDsKLSAgICAgIGlmIChvayA9PSAxMCkKLQl7Ci0JICBhc193YXJuIChfKCJleHByZXNzaW9uIG91dCBvZiByYW5nZTogZGVmYXVsdGluZyB0byAxIikpOwotCSAgb2ZmcyAoZXhwKSA9IDE7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZXhwLT5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIHN3aXRjaCAob2spCi0JewotCWNhc2UgMTA6Ci0JICBpZiAob2ZmcyAoZXhwKSA8IDEgfHwgb2ZmcyAoZXhwKSA+IDgpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJleHByZXNzaW9uIG91dCBvZiByYW5nZTogZGVmYXVsdGluZyB0byAxIikpOwotCSAgICAgIG9mZnMgKGV4cCkgPSAxOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIDIwOgotCSAgaWYgKG9mZnMgKGV4cCkgPCAwIHx8IG9mZnMgKGV4cCkgPiA3KQotCSAgICBnb3RvIG91dHJhbmdlOwotCSAgYnJlYWs7Ci0JY2FzZSAzMDoKLQkgIGlmIChvZmZzIChleHApIDwgMCB8fCBvZmZzIChleHApID4gMTUpCi0JICAgIGdvdG8gb3V0cmFuZ2U7Ci0JICBicmVhazsKLQljYXNlIDQwOgotCSAgaWYgKG9mZnMgKGV4cCkgPCAwIHx8IG9mZnMgKGV4cCkgPiAzMikKLQkgICAgZ290byBvdXRyYW5nZTsKLQkgIGJyZWFrOwotCWNhc2UgNTA6Ci0JICBpZiAob2ZmcyAoZXhwKSA8IDAgfHwgb2ZmcyAoZXhwKSA+IDEyNykKLQkgICAgZ290byBvdXRyYW5nZTsKLQkgIGJyZWFrOwotCWNhc2UgNTU6Ci0JICBpZiAob2ZmcyAoZXhwKSA8IC02NCB8fCBvZmZzIChleHApID4gNjMpCi0JICAgIGdvdG8gb3V0cmFuZ2U7Ci0JICBicmVhazsKLQljYXNlIDYwOgotCSAgaWYgKG9mZnMgKGV4cCkgPCAtMTI4IHx8IG9mZnMgKGV4cCkgPiAxMjcpCi0JICAgIGdvdG8gb3V0cmFuZ2U7Ci0JICBicmVhazsKLQljYXNlIDcwOgotCSAgaWYgKG9mZnMgKGV4cCkgPCAwIHx8IG9mZnMgKGV4cCkgPiA0MDk1KQotCSAgICB7Ci0JICAgIG91dHJhbmdlOgotCSAgICAgIGFzX3dhcm4gKF8oImV4cHJlc3Npb24gb3V0IG9mIHJhbmdlOiBkZWZhdWx0aW5nIHRvIDAiKSk7Ci0JICAgICAgb2ZmcyAoZXhwKSA9IDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChleHAtPmV4cC5YX29wID09IE9fYmlnKQotICAgIHsKLSAgICAgIGlmIChvZmZzIChleHApIDw9IDAJLyogZmxvbnVtICovCi0JICAmJiAob2sgPT0gODAJCS8qIG5vIGJpZ251bXMgKi8KLQkgICAgICB8fCAob2sgPiAxMAkvKiBzbWFsbC1pbnQgcmFuZ2VzIGluY2x1ZGluZyAwIG9rICovCi0JCSAgLyogSWYgd2UgaGF2ZSBhIGZsb251bSB6ZXJvLCBhIHplcm8gaW50ZWdlciBzaG91bGQKLQkJICAgICBkbyBhcyB3ZWxsIChlLmcuLCBpbiBtb3ZlcSkuICAqLwotCQkgICYmIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmV4cG9uZW50ID09IDAKLQkJICAmJiBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sb3dbMF0gPT0gMCkpKQotCXsKLQkgIC8qIEhBQ0shIFR1cm4gaXQgaW50byBhIGxvbmcgKi8KLQkgIExJVFRMRU5VTV9UWVBFIHdvcmRzWzZdOwotCi0JICBnZW5fdG9fd29yZHMgKHdvcmRzLCAyLCA4TCk7CS8qIFRoZXNlIG51bWJlcnMgYXJlIG1hZ2ljISAqLwotCSAgb3AgKGV4cCkgPSBPX2NvbnN0YW50OwotCSAgYWRkcyAoZXhwKSA9IDA7Ci0JICBzdWJzIChleHApID0gMDsKLQkgIG9mZnMgKGV4cCkgPSB3b3Jkc1sxXSB8ICh3b3Jkc1swXSA8PCAxNik7Ci0JfQotICAgICAgZWxzZSBpZiAob2sgIT0gMCkKLQl7Ci0JICBvcCAoZXhwKSA9IE9fY29uc3RhbnQ7Ci0JICBhZGRzIChleHApID0gMDsKLQkgIHN1YnMgKGV4cCkgPSAwOwotCSAgb2ZmcyAoZXhwKSA9IChvayA9PSAxMCkgPyAxIDogMDsKLQkgIGFzX3dhcm4gKF8oIkNhbid0IGRlYWwgd2l0aCBleHByZXNzaW9uOyBkZWZhdWx0aW5nIHRvICVsZCIpLAotCQkgICBvZmZzIChleHApKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG9rID49IDEwICYmIG9rIDw9IDcwKQotCXsKLQkgIG9wIChleHApID0gT19jb25zdGFudDsKLQkgIGFkZHMgKGV4cCkgPSAwOwotCSAgc3VicyAoZXhwKSA9IDA7Ci0JICBvZmZzIChleHApID0gKG9rID09IDEwKSA/IDEgOiAwOwotCSAgYXNfd2FybiAoXygiQ2FuJ3QgZGVhbCB3aXRoIGV4cHJlc3Npb247IGRlZmF1bHRpbmcgdG8gJWxkIiksCi0JCSAgIG9mZnMgKGV4cCkpOwotCX0KLSAgICB9Ci0KLSAgaWYgKGV4cC0+c2l6ZSAhPSBTSVpFX1VOU1BFQykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGV4cC0+c2l6ZSkKLQl7Ci0JY2FzZSBTSVpFX1VOU1BFQzoKLQljYXNlIFNJWkVfTE9ORzoKLQkgIGJyZWFrOwotCWNhc2UgU0laRV9CWVRFOgotCSAgaWYgKCFpc2J5dGUgKG9mZnMgKGV4cCkpKQotCSAgICBhc193YXJuIChfKCJleHByZXNzaW9uIGRvZXNuJ3QgZml0IGluIEJZVEUiKSk7Ci0JICBicmVhazsKLQljYXNlIFNJWkVfV09SRDoKLQkgIGlmICghaXN3b3JkIChvZmZzIChleHApKSkKLQkgICAgYXNfd2FybiAoXygiZXhwcmVzc2lvbiBkb2Vzbid0IGZpdCBpbiBXT1JEIikpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gb2ZmcyAoZXhwKTsKLX0KLQotLyogVGhlc2UgYXJlIHRoZSBiYWNrLWVuZHMgZm9yIHRoZSB2YXJpb3VzIG1hY2hpbmUgZGVwZW5kZW50IHBzZXVkby1vcHMuICAqLwotCi1zdGF0aWMgdm9pZAotc19kYXRhMSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzdWJzZWdfc2V0IChkYXRhX3NlY3Rpb24sIDEpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19kYXRhMiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzdWJzZWdfc2V0IChkYXRhX3NlY3Rpb24sIDIpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19ic3MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBwdXR0aW5nIGZyYWdzIGluIHRoZSBCU1Mgc2VnbWVudCwgd2UgZmFrZSBpdAotICAgICBieSBtYXJraW5nIGluX2JzcywgdGhlbiBsb29raW5nIGF0IHNfc2tpcCBmb3IgY2x1ZXMuICAqLwotCi0gIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZXZlbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICByZWdpc3RlciBpbnQgdGVtcDsKLSAgcmVnaXN0ZXIgbG9uZyB0ZW1wX2ZpbGw7Ci0KLSAgdGVtcCA9IDE7CQkJLyogSkYgc2hvdWxkIGJlIDI/ICovCi0gIHRlbXBfZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoIW5lZWRfcGFzc18yKQkJLyogTmV2ZXIgbWFrZSBmcmFnIGlmIGV4cGVjdCBleHRyYSBwYXNzLiAqLwotICAgIGZyYWdfYWxpZ24gKHRlbXAsIChpbnQpIHRlbXBfZmlsbCwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIHRlbXApOwotfQotCi1zdGF0aWMgdm9pZAotc19wcm9jIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKiBQc2V1ZG8tb3BzIGhhbmRsZWQgZm9yIE1SSSBjb21wYXRpYmlsaXR5LiAgKi8KLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBhcmd1bWVudCBpcyBhIGNvbmRpdGlvbmFsCi0gICBwc2V1ZG8tb3AuICBUaGlzIGlzIGNhbGxlZCB3aGVuIGNoZWNraW5nIHdoZXRoZXIgYSBwZW5kaW5nCi0gICBhbGlnbm1lbnQgaXMgbmVlZGVkLiAgKi8KLQotaW50Ci1tNjhrX2NvbmRpdGlvbmFsX3BzZXVkb29wIChwb3ApCi0gICAgIHBzZXVkb190eXBlUyAqcG9wOwotewotICByZXR1cm4gKHBvcC0+cG9jX2hhbmRsZXIgPT0gc19tcmlfaWYKLQkgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19tcmlfZWxzZSk7Ci19Ci0KLS8qIEhhbmRsZSBhbiBNUkkgc3R5bGUgY2hpcCBzcGVjaWZpY2F0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW1yaV9jaGlwICgpCi17Ci0gIGNoYXIgKnM7Ci0gIGNoYXIgYzsKLSAgaW50IGk7Ci0KLSAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgLyogV2UgY2FuJ3QgdXNlIGdldF9zeW1ib2xfZW5kIHNpbmNlIHRoZSBwcm9jZXNzb3IgbmFtZXMgYXJlIG5vdCBwcm9wZXIKLSAgICAgc3ltYm9scy4gICovCi0gIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspKQotICAgIDsKLSAgKi0taW5wdXRfbGluZV9wb2ludGVyID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IG5fYXJjaHM7IGkrKykKLSAgICBpZiAoc3RyY2FzZWNtcCAocywgYXJjaHNbaV0ubmFtZSkgPT0gMCkKLSAgICAgIGJyZWFrOwotICBpZiAoaSA+PSBuX2FyY2hzKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiJXM6IHVucmVjb2duaXplZCBwcm9jZXNzb3IgbmFtZSIpLCBzKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcvJykKLSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSA9IDA7Ci0gIGVsc2UKLSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSAmPSBtNjg4ODEgfCBtNjg4NTE7Ci0gIGN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IGFyY2hzW2ldLmFyY2g7Ci0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy8nKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIC8qIFdlIGNhbid0IHVzZSBnZXRfc3ltYm9sX2VuZCBzaW5jZSB0aGUgcHJvY2Vzc29yIG5hbWVzIGFyZSBub3QKLQkgcHJvcGVyIHN5bWJvbHMuICAqLwotICAgICAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykpCi0JOwotICAgICAgKi0taW5wdXRfbGluZV9wb2ludGVyID0gMDsKLSAgICAgIGlmIChzdHJjbXAgKHMsICI2ODg4MSIpID09IDApCi0JY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gbTY4ODgxOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAiNjg4NTEiKSA9PSAwKQotCWN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IG02ODg1MTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgIH0KLQotICAvKiBVcGRhdGUgaW5mbyBhYm91dCBhdmFpbGFibGUgY29udHJvbCByZWdpc3RlcnMuICAqLwotICBzZWxlY3RfY29udHJvbF9yZWdzICgpOwotfQotCi0vKiBUaGUgTVJJIENISVAgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfY2hpcCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotICBtcmlfY2hpcCAoKTsKLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgTVJJIEZPUFQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZm9wdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJJRD0iLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIGludCB0ZW1wOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMzsKLSAgICAgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmICh0ZW1wIDwgMCB8fCB0ZW1wID4gNykKLQlhc19iYWQgKF8oImJhZCBjb3Byb2Nlc3NvciBpZCIpKTsKLSAgICAgIGVsc2UKLQltNjhrX2Zsb2F0X2NvcG51bSA9IENPUDAgKyB0ZW1wOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW5yZWNvZ25pemVkIGZvcHQgb3B0aW9uIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIHN0cnVjdHVyZSB1c2VkIHRvIGhhbmRsZSB0aGUgTVJJIE9QVCBwc2V1ZG8tb3AuICAqLwotCi1zdHJ1Y3Qgb3B0X2FjdGlvbgotewotICAvKiBUaGUgbmFtZSBvZiB0aGUgb3B0aW9uLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBJZiB0aGlzIGlzIG5vdCBOVUxMLCBqdXN0IGNhbGwgdGhpcyBmdW5jdGlvbi4gIFRoZSBmaXJzdCBhcmd1bWVudAotICAgICBpcyB0aGUgQVJHIGZpZWxkIG9mIHRoaXMgc3RydWN0dXJlLCB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzCi0gICAgIHdoZXRoZXIgdGhlIG9wdGlvbiB3YXMgbmVnYXRlZC4gICovCi0gIHZvaWQgKCpwZm4pIFBBUkFNUyAoKGludCBhcmcsIGludCBvbikpOwotCi0gIC8qIElmIHRoaXMgaXMgbm90IE5VTEwsIGFuZCB0aGUgUEZOIGZpZWxkIGlzIE5VTEwsIHNldCB0aGUgdmFyaWFibGUKLSAgICAgdGhpcyBwb2ludHMgdG8uICBTZXQgaXQgdG8gdGhlIEFSRyBmaWVsZCBpZiB0aGUgb3B0aW9uIHdhcyBub3QKLSAgICAgbmVnYXRlZCwgYW5kIHRoZSBOT1RBUkcgZmllbGQgb3RoZXJ3aXNlLiAgKi8KLSAgaW50ICpwdmFyOwotCi0gIC8qIFRoZSB2YWx1ZSB0byBwYXNzIHRvIFBGTiBvciB0byBhc3NpZ24gdG8gKlBWQVIuICAqLwotICBpbnQgYXJnOwotCi0gIC8qIFRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gKlBWQVIgaWYgdGhlIG9wdGlvbiBpcyBuZWdhdGVkLiAgSWYgUEZOIGlzCi0gICAgIE5VTEwsIGFuZCBQVkFSIGlzIG5vdCBOVUxMLCBhbmQgQVJHIGFuZCBOT1RBUkcgYXJlIHRoZSBzYW1lLCB0aGVuCi0gICAgIHRoZSBvcHRpb24gbWF5IG5vdCBiZSBuZWdhdGVkLiAgKi8KLSAgaW50IG5vdGFyZzsKLX07Ci0KLS8qIFRoZSB0YWJsZSB1c2VkIHRvIGhhbmRsZSB0aGUgTVJJIE9QVCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZCBza2lwX3RvX2NvbW1hIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBvcHRfbmVzdCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgb3B0X2NoaXAgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIG9wdF9saXN0IFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBvcHRfbGlzdF9zeW1ib2xzIFBBUkFNUyAoKGludCwgaW50KSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0X2FjdGlvbiBvcHRfdGFibGVbXSA9Ci17Ci0gIHsgImFic3BjYWRkIiwgMCwgJm02OGtfYWJzcGNhZGQsIDEsIDAgfSwKLQotICAvKiBXZSBkbyByZWxheGluZywgc28gdGhlcmUgaXMgbGl0dGxlIHVzZSBmb3IgdGhlc2Ugb3B0aW9ucy4gICovCi0gIHsgImIiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImJycyIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiYnJiIiwgMCwgMCwgMCwgMCB9LAotICB7ICJicmwiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImJydyIsIDAsIDAsIDAsIDAgfSwKLQotICB7ICJjIiwgMCwgMCwgMCwgMCB9LAotICB7ICJjZXgiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImNhc2UiLCAwLCAmc3ltYm9sc19jYXNlX3NlbnNpdGl2ZSwgMSwgMCB9LAotICB7ICJjbCIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiY3JlIiwgMCwgMCwgMCwgMCB9LAotICB7ICJkIiwgMCwgJmZsYWdfa2VlcF9sb2NhbHMsIDEsIDAgfSwKLSAgeyAiZSIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiZiIsIDAsICZmbGFnX3Nob3J0X3JlZnMsIDEsIDAgfSwKLSAgeyAiZnJzIiwgMCwgJmZsYWdfc2hvcnRfcmVmcywgMSwgMCB9LAotICB7ICJmcmwiLCAwLCAmZmxhZ19zaG9ydF9yZWZzLCAwLCAxIH0sCi0gIHsgImciLCAwLCAwLCAwLCAwIH0sCi0gIHsgImkiLCAwLCAwLCAwLCAwIH0sCi0gIHsgIm0iLCAwLCAwLCAwLCAwIH0sCi0gIHsgIm1leCIsIDAsIDAsIDAsIDAgfSwKLSAgeyAibWMiLCAwLCAwLCAwLCAwIH0sCi0gIHsgIm1kIiwgMCwgMCwgMCwgMCB9LAotICB7ICJuZXN0Iiwgb3B0X25lc3QsIDAsIDAsIDAgfSwKLSAgeyAibmV4dCIsIHNraXBfdG9fY29tbWEsIDAsIDAsIDAgfSwKLSAgeyAibyIsIDAsIDAsIDAsIDAgfSwKLSAgeyAib2xkIiwgMCwgMCwgMCwgMCB9LAotICB7ICJvcCIsIHNraXBfdG9fY29tbWEsIDAsIDAsIDAgfSwKLSAgeyAicGNvIiwgMCwgMCwgMCwgMCB9LAotICB7ICJwIiwgb3B0X2NoaXAsIDAsIDAsIDAgfSwKLSAgeyAicGNyIiwgMCwgMCwgMCwgMCB9LAotICB7ICJwY3MiLCAwLCAwLCAwLCAwIH0sCi0gIHsgInIiLCAwLCAwLCAwLCAwIH0sCi0gIHsgInF1aWNrIiwgMCwgJm02OGtfcXVpY2ssIDEsIDAgfSwKLSAgeyAicmVsMzIiLCAwLCAmbTY4a19yZWwzMiwgMSwgMCB9LAotICB7ICJzIiwgb3B0X2xpc3QsIDAsIDAsIDAgfSwKLSAgeyAidCIsIG9wdF9saXN0X3N5bWJvbHMsIDAsIDAsIDAgfSwKLSAgeyAidyIsIDAsICZmbGFnX25vX3dhcm5pbmdzLCAwLCAxIH0sCi0gIHsgIngiLCAwLCAwLCAwLCAwIH0KLX07Ci0KLSNkZWZpbmUgT1BUQ09VTlQgKHNpemVvZiBvcHRfdGFibGUgLyBzaXplb2Ygb3B0X3RhYmxlWzBdKQotCi0vKiBUaGUgTVJJIE9QVCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19vcHQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZG8KLSAgICB7Ci0gICAgICBpbnQgdDsKLSAgICAgIGNoYXIgKnM7Ci0gICAgICBjaGFyIGM7Ci0gICAgICBpbnQgaTsKLSAgICAgIGNvbnN0IHN0cnVjdCBvcHRfYWN0aW9uICpvOwotCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgICAgIHQgPSAxOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgdCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIk5PIiwgMikgPT0gMCkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQkgIHQgPSAwOwotCX0KLQotICAgICAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgICAgZm9yIChpID0gMCwgbyA9IG9wdF90YWJsZTsgaSA8IE9QVENPVU5UOyBpKyssIG8rKykKLQl7Ci0JICBpZiAoc3RyY2FzZWNtcCAocywgby0+bmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChvLT5wZm4pCi0JCXsKLQkJICAvKiBSZXN0b3JlIGlucHV0X2xpbmVfcG9pbnRlciBub3cgaW4gY2FzZSB0aGUgb3B0aW9uCi0JCSAgICAgdGFrZXMgYXJndW1lbnRzLiAgKi8KLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAoKm8tPnBmbikgKG8tPmFyZywgdCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChvLT5wdmFyICE9IE5VTEwpCi0JCXsKLQkJICBpZiAoISB0ICYmIG8tPmFyZyA9PSBvLT5ub3RhcmcpCi0JCSAgICBhc19iYWQgKF8oIm9wdGlvbiBgJXMnIG1heSBub3QgYmUgbmVnYXRlZCIpLCBzKTsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAqby0+cHZhciA9IHQgPyBvLT5hcmcgOiBvLT5ub3Rhcmc7Ci0JCX0KLQkgICAgICBlbHNlCi0JCSppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGkgPj0gT1BUQ09VTlQpCi0JewotCSAgYXNfYmFkIChfKCJvcHRpb24gYCVzJyBub3QgcmVjb2duaXplZCIpLCBzKTsKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCX0KLSAgICB9Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICAvKiBNb3ZlIGJhY2sgdG8gdGVybWluYXRpbmcgY2hhcmFjdGVyLiAgKi8KLSAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFNraXAgYWhlYWQgdG8gYSBjb21tYS4gIFRoaXMgaXMgdXNlZCBmb3IgT1BUIG9wdGlvbnMgd2hpY2ggd2UgZG8KLSAgIG5vdCBzdXBwb3IgdGFuZCB3aGljaCB0YWtlIGFyZ3VtZW50cy4gICovCi0KLXN0YXRpYyB2b2lkCi1za2lwX3RvX2NvbW1hIChhcmcsIG9uKQotICAgICBpbnQgYXJnOwotICAgICBpbnQgb247Ci17Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJwotCSAmJiAhIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLX0KLQotLyogSGFuZGxlIHRoZSBPUFQgTkVTVD1kZXB0aCBvcHRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotb3B0X25lc3QgKGFyZywgb24pCi0gICAgIGludCBhcmc7Ci0gICAgIGludCBvbjsKLXsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz0nKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYmFkIGZvcm1hdCBvZiBPUFQgTkVTVD1kZXB0aCIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG1heF9tYWNyb19uZXN0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgT1BUIFA9Y2hpcCBvcHRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotb3B0X2NoaXAgKGFyZywgb24pCi0gICAgIGludCBhcmc7Ci0gICAgIGludCBvbjsKLXsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz0nKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMganVzdCBPUFQgUCwgd2hpY2ggd2UgZG8gbm90IHN1cHBvcnQuICAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgbXJpX2NoaXAgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgT1BUIFMgb3B0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW9wdF9saXN0IChhcmcsIG9uKQotICAgICBpbnQgYXJnOwotICAgICBpbnQgb247Ci17Ci0gIGxpc3RpbmdfbGlzdCAob24pOwotfQotCi0vKiBIYW5kbGUgdGhlIE9QVCBUIG9wdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1vcHRfbGlzdF9zeW1ib2xzIChhcmcsIG9uKQotICAgICBpbnQgYXJnOwotICAgICBpbnQgb247Ci17Ci0gIGlmIChvbikKLSAgICBsaXN0aW5nIHw9IExJU1RJTkdfU1lNQk9MUzsKLSAgZWxzZQotICAgIGxpc3RpbmcgJj1+IExJU1RJTkdfU1lNQk9MUzsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgUkVHIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX3JlZyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpzOwotICBpbnQgYzsKLSAgc3RydWN0IG02OGtfb3Agcm9wOwotICBpbnQgbWFzazsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGxpbmVfbGFiZWwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgbGFiZWwiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICB3aGlsZSAoaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpCi0jaWZkZWYgUkVHSVNURVJfUFJFRklYCi0JIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gUkVHSVNURVJfUFJFRklYCi0jZW5kaWYKLQkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLycKLQkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLQotICBpZiAobTY4a19pcF9vcCAocywgJnJvcCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAocm9wLmVycm9yID09IE5VTEwpCi0JYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbGlzdCIpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImJhZCByZWdpc3RlciBsaXN0OiAlcyIpLCByb3AuZXJyb3IpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBpZiAocm9wLm1vZGUgPT0gUkVHTFNUKQotICAgIG1hc2sgPSByb3AubWFzazsKLSAgZWxzZSBpZiAocm9wLm1vZGUgPT0gRFJFRykKLSAgICBtYXNrID0gMSA8PCAocm9wLnJlZyAtIERBVEEwKTsKLSAgZWxzZSBpZiAocm9wLm1vZGUgPT0gQVJFRykKLSAgICBtYXNrID0gMSA8PCAocm9wLnJlZyAtIEFERFIwICsgOCk7Ci0gIGVsc2UgaWYgKHJvcC5tb2RlID09IEZQUkVHKQotICAgIG1hc2sgPSAxIDw8IChyb3AucmVnIC0gRlAwICsgMTYpOwotICBlbHNlIGlmIChyb3AubW9kZSA9PSBDT05UUk9MCi0JICAgJiYgcm9wLnJlZyA9PSBGUEkpCi0gICAgbWFzayA9IDEgPDwgMjQ7Ci0gIGVsc2UgaWYgKHJvcC5tb2RlID09IENPTlRST0wKLQkgICAmJiByb3AucmVnID09IEZQUykKLSAgICBtYXNrID0gMSA8PCAyNTsKLSAgZWxzZSBpZiAocm9wLm1vZGUgPT0gQ09OVFJPTAotCSAgICYmIHJvcC5yZWcgPT0gRlBDKQotICAgIG1hc2sgPSAxIDw8IDI2OwotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbGlzdCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNfU0VUX1NFR01FTlQgKGxpbmVfbGFiZWwsIHJlZ19zZWN0aW9uKTsKLSAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIH5tYXNrKTsKLSAgbGluZV9sYWJlbC0+c3lfZnJhZyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgdGhlIE1SSSBTQVZFIGFuZCBSRVNUT1JFIHBzZXVkby1vcHMuICAqLwotCi1zdHJ1Y3Qgc2F2ZV9vcHRzCi17Ci0gIHN0cnVjdCBzYXZlX29wdHMgKm5leHQ7Ci0gIGludCBhYnNwY2FkZDsKLSAgaW50IHN5bWJvbHNfY2FzZV9zZW5zaXRpdmU7Ci0gIGludCBrZWVwX2xvY2FsczsKLSAgaW50IHNob3J0X3JlZnM7Ci0gIGludCBhcmNoaXRlY3R1cmU7Ci0gIGludCBxdWljazsKLSAgaW50IHJlbDMyOwotICBpbnQgbGlzdGluZzsKLSAgaW50IG5vX3dhcm5pbmdzOwotICAvKiBGSVhNRTogV2UgZG9uJ3Qgc2F2ZSBPUFQgUy4gICovCi19OwotCi0vKiBUaGlzIHZhcmlhYmxlIGhvbGRzIHRoZSBzdGFjayBvZiBzYXZlZCBvcHRpb25zLiAgKi8KLQotc3RhdGljIHN0cnVjdCBzYXZlX29wdHMgKnNhdmVfc3RhY2s7Ci0KLS8qIFRoZSBNUkkgU0FWRSBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19zYXZlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN0cnVjdCBzYXZlX29wdHMgKnM7Ci0KLSAgcyA9IChzdHJ1Y3Qgc2F2ZV9vcHRzICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNhdmVfb3B0cykpOwotICBzLT5hYnNwY2FkZCA9IG02OGtfYWJzcGNhZGQ7Ci0gIHMtPnN5bWJvbHNfY2FzZV9zZW5zaXRpdmUgPSBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlOwotICBzLT5rZWVwX2xvY2FscyA9IGZsYWdfa2VlcF9sb2NhbHM7Ci0gIHMtPnNob3J0X3JlZnMgPSBmbGFnX3Nob3J0X3JlZnM7Ci0gIHMtPmFyY2hpdGVjdHVyZSA9IGN1cnJlbnRfYXJjaGl0ZWN0dXJlOwotICBzLT5xdWljayA9IG02OGtfcXVpY2s7Ci0gIHMtPnJlbDMyID0gbTY4a19yZWwzMjsKLSAgcy0+bGlzdGluZyA9IGxpc3Rpbmc7Ci0gIHMtPm5vX3dhcm5pbmdzID0gZmxhZ19ub193YXJuaW5nczsKLQotICBzLT5uZXh0ID0gc2F2ZV9zdGFjazsKLSAgc2F2ZV9zdGFjayA9IHM7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIE1SSSBSRVNUT1JFIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX3Jlc3RvcmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3RydWN0IHNhdmVfb3B0cyAqczsKLQotICBpZiAoc2F2ZV9zdGFjayA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygicmVzdG9yZSB3aXRob3V0IHNhdmUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzID0gc2F2ZV9zdGFjazsKLSAgc2F2ZV9zdGFjayA9IHMtPm5leHQ7Ci0KLSAgbTY4a19hYnNwY2FkZCA9IHMtPmFic3BjYWRkOwotICBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlID0gcy0+c3ltYm9sc19jYXNlX3NlbnNpdGl2ZTsKLSAgZmxhZ19rZWVwX2xvY2FscyA9IHMtPmtlZXBfbG9jYWxzOwotICBmbGFnX3Nob3J0X3JlZnMgPSBzLT5zaG9ydF9yZWZzOwotICBjdXJyZW50X2FyY2hpdGVjdHVyZSA9IHMtPmFyY2hpdGVjdHVyZTsKLSAgbTY4a19xdWljayA9IHMtPnF1aWNrOwotICBtNjhrX3JlbDMyID0gcy0+cmVsMzI7Ci0gIGxpc3RpbmcgPSBzLT5saXN0aW5nOwotICBmbGFnX25vX3dhcm5pbmdzID0gcy0+bm9fd2FybmluZ3M7Ci0KLSAgZnJlZSAocyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVHlwZXMgb2YgTVJJIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmVzLiAgKi8KLQotZW51bSBtcmlfY29udHJvbF90eXBlCi17Ci0gIG1yaV9mb3IsCi0gIG1yaV9pZiwKLSAgbXJpX3JlcGVhdCwKLSAgbXJpX3doaWxlCi19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0YWNrIHRoZSBNUkkgc3RydWN0dXJlZCBjb250cm9sCi0gICBkaXJlY3RpdmVzLiAgKi8KLQotc3RydWN0IG1yaV9jb250cm9sX2luZm8KLXsKLSAgLyogVGhlIGRpcmVjdGl2ZSB3aXRoaW4gd2hpY2ggdGhpcyBvbmUgaXMgZW5jbG9zZWQuICAqLwotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqb3V0ZXI7Ci0KLSAgLyogVGhlIHR5cGUgb2YgZGlyZWN0aXZlLiAgKi8KLSAgZW51bSBtcmlfY29udHJvbF90eXBlIHR5cGU7Ci0KLSAgLyogV2hldGhlciBhbiBFTFNFIGhhcyBiZWVuIGluIGFuIElGLiAgKi8KLSAgaW50IGVsc2Vfc2VlbjsKLQotICAvKiBUaGUgYWRkIG9yIHN1YiBzdGF0ZW1lbnQgYXQgdGhlIGVuZCBvZiBhIEZPUi4gICovCi0gIGNoYXIgKmluY3I7Ci0KLSAgLyogVGhlIGxhYmVsIG9mIHRoZSB0b3Agb2YgYSBGT1Igb3IgUkVQRUFUIGxvb3AuICAqLwotICBjaGFyICp0b3A7Ci0KLSAgLyogVGhlIGxhYmVsIHRvIGp1bXAgdG8gZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbiwgb3IgdGhlIGVsc2UKLSAgICAgZXhwcmVzc2lvbiBvZiBhIGNvbmRpdGlvbmFsLiAgKi8KLSAgY2hhciAqbmV4dDsKLQotICAvKiBUaGUgbGFiZWwgdG8ganVtcCB0byB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AsIG9yIHRoZSBsYWJlbCBwYXN0Ci0gICAgIHRoZSBlbmQgb2YgYSBjb25kaXRpb25hbC4gICovCi0gIGNoYXIgKmJvdHRvbTsKLX07Ci0KLS8qIFRoZSBzdGFjayBvZiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZXMuICAqLwotCi1zdGF0aWMgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm1yaV9jb250cm9sX3N0YWNrOwotCi0vKiBUaGUgY3VycmVudCBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZSBpbmRleCBudW1iZXIsIHVzZWQgdG8KLSAgIGdlbmVyYXRlIGxhYmVsIG5hbWVzLiAgKi8KLQotc3RhdGljIGludCBtcmlfY29udHJvbF9pbmRleDsKLQotLyogU29tZSBmdW5jdGlvbiBwcm90b3R5cGVzLiAgKi8KLQotc3RhdGljIHZvaWQgbXJpX2Fzc2VtYmxlIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGNoYXIgKm1yaV9jb250cm9sX2xhYmVsIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqcHVzaF9tcmlfY29udHJvbAotICBQQVJBTVMgKChlbnVtIG1yaV9jb250cm9sX3R5cGUpKTsKLXN0YXRpYyB2b2lkIHBvcF9tcmlfY29udHJvbCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHBhcnNlX21yaV9jb25kaXRpb24gUEFSQU1TICgoaW50ICopKTsKLXN0YXRpYyBpbnQgcGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZAotICBQQVJBTVMgKChpbnQgKiwgY2hhciAqKiwgY2hhciAqKiwgY2hhciAqKiwgY2hhciAqKikpOwotc3RhdGljIGludCBzd2FwX21yaV9jb25kaXRpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgaW50IHJldmVyc2VfbXJpX2NvbmRpdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQKLSAgUEFSQU1TICgoaW50LCBpbnQsIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY29uc3QgY2hhciAqLAotCSAgIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwYXJzZV9tcmlfY29udHJvbF9leHByZXNzaW9uCi0gIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLS8qIEFzc2VtYmxlIGFuIGluc3RydWN0aW9uIGZvciBhbiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1tcmlfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzOwotCi0gIC8qIG1kX2Fzc2VtYmxlIGV4cGVjdHMgdGhlIG9wY29kZSB0byBiZSBpbiBsb3dlciBjYXNlLiAgKi8KLSAgZm9yIChzID0gc3RyOyAqcyAhPSAnICcgJiYgKnMgIT0gJ1wwJzsgcysrKQotICAgIHsKLSAgICAgIGlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgKnMpKQotCSpzID0gdG9sb3dlciAoKHVuc2lnbmVkIGNoYXIpICpzKTsKLSAgICB9Ci0KLSAgbWRfYXNzZW1ibGUgKHN0cik7Ci19Ci0KLS8qIEdlbmVyYXRlIGEgbmV3IE1SSSBsYWJlbCBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIGxhYmVsIG5hbWUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1tcmlfY29udHJvbF9sYWJlbCAoKQotewotICBjaGFyICpuOwotCi0gIG4gPSAoY2hhciAqKSB4bWFsbG9jICgyMCk7Ci0gIHNwcmludGYgKG4sICIlc21jJWQiLCBGQUtFX0xBQkVMX05BTUUsIG1yaV9jb250cm9sX2luZGV4KTsKLSAgKyttcmlfY29udHJvbF9pbmRleDsKLSAgcmV0dXJuIG47Ci19Ci0KLS8qIENyZWF0ZSBhIG5ldyBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqCi1wdXNoX21yaV9jb250cm9sICh0eXBlKQotICAgICBlbnVtIG1yaV9jb250cm9sX3R5cGUgdHlwZTsKLXsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0KLSAgbiA9IChzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBtcmlfY29udHJvbF9pbmZvKSk7Ci0KLSAgbi0+dHlwZSA9IHR5cGU7Ci0gIG4tPmVsc2Vfc2VlbiA9IDA7Ci0gIGlmICh0eXBlID09IG1yaV9pZiB8fCB0eXBlID09IG1yaV93aGlsZSkKLSAgICBuLT50b3AgPSBOVUxMOwotICBlbHNlCi0gICAgbi0+dG9wID0gbXJpX2NvbnRyb2xfbGFiZWwgKCk7Ci0gIG4tPm5leHQgPSBtcmlfY29udHJvbF9sYWJlbCAoKTsKLSAgbi0+Ym90dG9tID0gbXJpX2NvbnRyb2xfbGFiZWwgKCk7Ci0KLSAgbi0+b3V0ZXIgPSBtcmlfY29udHJvbF9zdGFjazsKLSAgbXJpX2NvbnRyb2xfc3RhY2sgPSBuOwotCi0gIHJldHVybiBuOwotfQotCi0vKiBQb3Agb2ZmIHRoZSBzdGFjayBvZiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZXMuICAqLwotCi1zdGF0aWMgdm9pZAotcG9wX21yaV9jb250cm9sICgpCi17Ci0gIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpuOwotCi0gIG4gPSBtcmlfY29udHJvbF9zdGFjazsKLSAgbXJpX2NvbnRyb2xfc3RhY2sgPSBuLT5vdXRlcjsKLSAgaWYgKG4tPnRvcCAhPSBOVUxMKQotICAgIGZyZWUgKG4tPnRvcCk7Ci0gIGZyZWUgKG4tPm5leHQpOwotICBmcmVlIChuLT5ib3R0b20pOwotICBmcmVlIChuKTsKLX0KLQotLyogUmVjb2duaXplIGEgY29uZGl0aW9uIGNvZGUgaW4gYW4gTVJJIHN0cnVjdHVyZWQgY29udHJvbCBleHByZXNzaW9uLiAgKi8KLQotc3RhdGljIGludAotcGFyc2VfbXJpX2NvbmRpdGlvbiAocGNjKQotICAgICBpbnQgKnBjYzsKLXsKLSAgY2hhciBjMSwgYzI7Ci0KLSAga25vdyAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnPCcpOwotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBjMSA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgYzIgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz4nKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUiKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBpZiAoaXN1cHBlciAoYzEpKQotICAgIGMxID0gdG9sb3dlciAoYzEpOwotICBpZiAoaXN1cHBlciAoYzIpKQotICAgIGMyID0gdG9sb3dlciAoYzIpOwotCi0gICpwY2MgPSAoYzEgPDwgOCkgfCBjMjsKLQotICByZXR1cm4gMTsKLX0KLQotLyogUGFyc2UgYSBzaW5nbGUgb3BlcmFuZCBpbiBhbiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGV4cHJlc3Npb24uICAqLwotCi1zdGF0aWMgaW50Ci1wYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kIChwY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsIHJpZ2h0c3RvcCkKLSAgICAgaW50ICpwY2M7Ci0gICAgIGNoYXIgKipsZWZ0c3RhcnQ7Ci0gICAgIGNoYXIgKipsZWZ0c3RvcDsKLSAgICAgY2hhciAqKnJpZ2h0c3RhcnQ7Ci0gICAgIGNoYXIgKipyaWdodHN0b3A7Ci17Ci0gIGNoYXIgKnM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICpwY2MgPSAtMTsKLSAgKmxlZnRzdGFydCA9IE5VTEw7Ci0gICpsZWZ0c3RvcCA9IE5VTEw7Ci0gICpyaWdodHN0YXJ0ID0gTlVMTDsKLSAgKnJpZ2h0c3RvcCA9IE5VTEw7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJzwnKQotICAgIHsKLSAgICAgIC8qIEl0J3MganVzdCBhIGNvbmRpdGlvbiBjb2RlLiAgKi8KLSAgICAgIHJldHVybiBwYXJzZV9tcmlfY29uZGl0aW9uIChwY2MpOwotICAgIH0KLQotICAvKiBMb29rIGFoZWFkIGZvciB0aGUgY29uZGl0aW9uIGNvZGUuICAqLwotICBmb3IgKHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7ICpzICE9ICdcMCc7ICsrcykKLSAgICB7Ci0gICAgICBpZiAoKnMgPT0gJzwnICYmIHNbMV0gIT0gJ1wwJyAmJiBzWzJdICE9ICdcMCcgJiYgc1szXSA9PSAnPicpCi0JYnJlYWs7Ci0gICAgfQotICBpZiAoKnMgPT0gJ1wwJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgY29uZGl0aW9uIGNvZGUgaW4gc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZSIpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAqbGVmdHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqbGVmdHN0b3AgPSBzOwotICBpZiAoKmxlZnRzdG9wID4gKmxlZnRzdGFydAotICAgICAgJiYgKCgqbGVmdHN0b3ApWy0xXSA9PSAnICcgfHwgKCpsZWZ0c3RvcClbLTFdID09ICdcdCcpKQotICAgIC0tKmxlZnRzdG9wOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0gIGlmICghIHBhcnNlX21yaV9jb25kaXRpb24gKHBjYykpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogTG9vayBhaGVhZCBmb3IgQU5EIG9yIE9SIG9yIGVuZCBvZiBsaW5lLiAgKi8KLSAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyOyAqcyAhPSAnXDAnOyArK3MpCi0gICAgewotICAgICAgaWYgKChzdHJuY2FzZWNtcCAocywgIkFORCIsIDMpID09IDAKLQkgICAmJiAoc1szXSA9PSAnLicgfHwgISBpc19wYXJ0X29mX25hbWUgKHNbM10pKSkKLQkgIHx8IChzdHJuY2FzZWNtcCAocywgIk9SIiwgMikgPT0gMAotCSAgICAgICYmIChzWzJdID09ICcuJyB8fCAhIGlzX3BhcnRfb2ZfbmFtZSAoc1syXSkpKSkKLQlicmVhazsKLSAgICB9Ci0KLSAgKnJpZ2h0c3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpyaWdodHN0b3AgPSBzOwotICBpZiAoKnJpZ2h0c3RvcCA+ICpyaWdodHN0YXJ0Ci0gICAgICAmJiAoKCpyaWdodHN0b3ApWy0xXSA9PSAnICcgfHwgKCpyaWdodHN0b3ApWy0xXSA9PSAnXHQnKSkKLSAgICAtLSpyaWdodHN0b3A7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLQotICByZXR1cm4gMTsKLX0KLQotI2RlZmluZSBNQ0MoYjEsIGIyKSAoKChiMSkgPDwgOCkgfCAoYjIpKQotCi0vKiBTd2FwIHRoZSBzZW5zZSBvZiBhIGNvbmRpdGlvbi4gIFRoaXMgY2hhbmdlcyB0aGUgY29uZGl0aW9uIHNvIHRoYXQKLSAgIGl0IGdlbmVyYXRlcyB0aGUgc2FtZSByZXN1bHQgd2hlbiB0aGUgb3BlcmFuZHMgYXJlIHN3YXBwZWQuICAqLwotCi1zdGF0aWMgaW50Ci1zd2FwX21yaV9jb25kaXRpb24gKGNjKQotICAgICBpbnQgY2M7Ci17Ci0gIHN3aXRjaCAoY2MpCi0gICAgewotICAgIGNhc2UgTUNDICgnaCcsICdpJyk6IHJldHVybiBNQ0MgKCdjJywgJ3MnKTsKLSAgICBjYXNlIE1DQyAoJ2wnLCAncycpOiByZXR1cm4gTUNDICgnYycsICdjJyk7Ci0gICAgY2FzZSBNQ0MgKCdjJywgJ2MnKTogcmV0dXJuIE1DQyAoJ2wnLCAncycpOwotICAgIGNhc2UgTUNDICgnYycsICdzJyk6IHJldHVybiBNQ0MgKCdoJywgJ2knKTsKLSAgICBjYXNlIE1DQyAoJ3AnLCAnbCcpOiByZXR1cm4gTUNDICgnbScsICdpJyk7Ci0gICAgY2FzZSBNQ0MgKCdtJywgJ2knKTogcmV0dXJuIE1DQyAoJ3AnLCAnbCcpOwotICAgIGNhc2UgTUNDICgnZycsICdlJyk6IHJldHVybiBNQ0MgKCdsJywgJ2UnKTsKLSAgICBjYXNlIE1DQyAoJ2wnLCAndCcpOiByZXR1cm4gTUNDICgnZycsICd0Jyk7Ci0gICAgY2FzZSBNQ0MgKCdnJywgJ3QnKTogcmV0dXJuIE1DQyAoJ2wnLCAndCcpOwotICAgIGNhc2UgTUNDICgnbCcsICdlJyk6IHJldHVybiBNQ0MgKCdnJywgJ2UnKTsKLSAgICB9Ci0gIHJldHVybiBjYzsKLX0KLQotLyogUmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgYSBjb25kaXRpb24uICAqLwotCi1zdGF0aWMgaW50Ci1yZXZlcnNlX21yaV9jb25kaXRpb24gKGNjKQotICAgICBpbnQgY2M7Ci17Ci0gIHN3aXRjaCAoY2MpCi0gICAgewotICAgIGNhc2UgTUNDICgnaCcsICdpJyk6IHJldHVybiBNQ0MgKCdsJywgJ3MnKTsKLSAgICBjYXNlIE1DQyAoJ2wnLCAncycpOiByZXR1cm4gTUNDICgnaCcsICdpJyk7Ci0gICAgY2FzZSBNQ0MgKCdjJywgJ2MnKTogcmV0dXJuIE1DQyAoJ2MnLCAncycpOwotICAgIGNhc2UgTUNDICgnYycsICdzJyk6IHJldHVybiBNQ0MgKCdjJywgJ2MnKTsKLSAgICBjYXNlIE1DQyAoJ24nLCAnZScpOiByZXR1cm4gTUNDICgnZScsICdxJyk7Ci0gICAgY2FzZSBNQ0MgKCdlJywgJ3EnKTogcmV0dXJuIE1DQyAoJ24nLCAnZScpOwotICAgIGNhc2UgTUNDICgndicsICdjJyk6IHJldHVybiBNQ0MgKCd2JywgJ3MnKTsKLSAgICBjYXNlIE1DQyAoJ3YnLCAncycpOiByZXR1cm4gTUNDICgndicsICdjJyk7Ci0gICAgY2FzZSBNQ0MgKCdwJywgJ2wnKTogcmV0dXJuIE1DQyAoJ20nLCAnaScpOwotICAgIGNhc2UgTUNDICgnbScsICdpJyk6IHJldHVybiBNQ0MgKCdwJywgJ2wnKTsKLSAgICBjYXNlIE1DQyAoJ2cnLCAnZScpOiByZXR1cm4gTUNDICgnbCcsICd0Jyk7Ci0gICAgY2FzZSBNQ0MgKCdsJywgJ3QnKTogcmV0dXJuIE1DQyAoJ2cnLCAnZScpOwotICAgIGNhc2UgTUNDICgnZycsICd0Jyk6IHJldHVybiBNQ0MgKCdsJywgJ2UnKTsKLSAgICBjYXNlIE1DQyAoJ2wnLCAnZScpOiByZXR1cm4gTUNDICgnZycsICd0Jyk7Ci0gICAgfQotICByZXR1cm4gY2M7Ci19Ci0KLS8qIEJ1aWxkIGFuIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZXhwcmVzc2lvbi4gIFRoaXMgZ2VuZXJhdGVzIHRlc3QKLSAgIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgSXQgZ29lcyB0byBUUlVFTEFCIGlmIHRoZSBjb25kaXRpb24gaXMKLSAgIHRydWUsIGFuZCB0byBGQUxTRUxBQiBpZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlLiAgRXhhY3RseSBvbmUgb2YKLSAgIFRSVUVMQUIgYW5kIEZBTFNFTEFCIHdpbGwgYmUgTlVMTCwgbWVhbmluZyB0byBmYWxsIHRocm91Z2guICBRVUFMCi0gICBpcyB0aGUgc2l6ZSBxdWFsaWZpZXIgZm9yIHRoZSBleHByZXNzaW9uLiAgRVhURU5UIGlzIHRoZSBzaXplIHRvCi0gICB1c2UgZm9yIHRoZSBicmFuY2guICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCAocXVhbCwgY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsCi0JCQkgICByaWdodHN0b3AsIHRydWVsYWIsIGZhbHNlbGFiLCBleHRlbnQpCi0gICAgIGludCBxdWFsOwotICAgICBpbnQgY2M7Ci0gICAgIGNoYXIgKmxlZnRzdGFydDsKLSAgICAgY2hhciAqbGVmdHN0b3A7Ci0gICAgIGNoYXIgKnJpZ2h0c3RhcnQ7Ci0gICAgIGNoYXIgKnJpZ2h0c3RvcDsKLSAgICAgY29uc3QgY2hhciAqdHJ1ZWxhYjsKLSAgICAgY29uc3QgY2hhciAqZmFsc2VsYWI7Ci0gICAgIGludCBleHRlbnQ7Ci17Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciAqczsKLQotICBpZiAobGVmdHN0YXJ0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG02OGtfb3AgbGVmdG9wLCByaWdodG9wOwotICAgICAgY2hhciBjOwotCi0gICAgICAvKiBTd2FwIHRoZSBjb21wYXJlIG9wZXJhbmRzLCBpZiBuZWNlc3NhcnksIHRvIHByb2R1Y2UgYSBsZWdhbAotCSBtNjhrIGNvbXBhcmUgaW5zdHJ1Y3Rpb24uICBDb21wYXJpbmcgYSByZWdpc3RlciBvcGVyYW5kIHdpdGgKLQkgYSBub24tcmVnaXN0ZXIgb3BlcmFuZCByZXF1aXJlcyB0aGUgcmVnaXN0ZXIgdG8gYmUgb24gdGhlCi0JIHJpZ2h0IChjbXAsIGNtcGEpLiAgQ29tcGFyaW5nIGFuIGltbWVkaWF0ZSB2YWx1ZSB3aXRoCi0JIGFueXRoaW5nIHJlcXVpcmVzIHRoZSBpbW1lZGlhdGUgdmFsdWUgdG8gYmUgb24gdGhlIGxlZnQKLQkgKGNtcGkpLiAgKi8KLQotICAgICAgYyA9ICpsZWZ0c3RvcDsKLSAgICAgICpsZWZ0c3RvcCA9ICdcMCc7Ci0gICAgICAodm9pZCkgbTY4a19pcF9vcCAobGVmdHN0YXJ0LCAmbGVmdG9wKTsKLSAgICAgICpsZWZ0c3RvcCA9IGM7Ci0KLSAgICAgIGMgPSAqcmlnaHRzdG9wOwotICAgICAgKnJpZ2h0c3RvcCA9ICdcMCc7Ci0gICAgICAodm9pZCkgbTY4a19pcF9vcCAocmlnaHRzdGFydCwgJnJpZ2h0b3ApOwotICAgICAgKnJpZ2h0c3RvcCA9IGM7Ci0KLSAgICAgIGlmIChyaWdodG9wLm1vZGUgPT0gSU1NRUQKLQkgIHx8ICgobGVmdG9wLm1vZGUgPT0gRFJFRyB8fCBsZWZ0b3AubW9kZSA9PSBBUkVHKQotCSAgICAgICYmIChyaWdodG9wLm1vZGUgIT0gRFJFRyAmJiByaWdodG9wLm1vZGUgIT0gQVJFRykpKQotCXsKLQkgIGNoYXIgKnRlbXA7Ci0KLQkgIGNjID0gc3dhcF9tcmlfY29uZGl0aW9uIChjYyk7Ci0JICB0ZW1wID0gbGVmdHN0YXJ0OwotCSAgbGVmdHN0YXJ0ID0gcmlnaHRzdGFydDsKLQkgIHJpZ2h0c3RhcnQgPSB0ZW1wOwotCSAgdGVtcCA9IGxlZnRzdG9wOwotCSAgbGVmdHN0b3AgPSByaWdodHN0b3A7Ci0JICByaWdodHN0b3AgPSB0ZW1wOwotCX0KLSAgICB9Ci0KLSAgaWYgKHRydWVsYWIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjYyA9IHJldmVyc2VfbXJpX2NvbmRpdGlvbiAoY2MpOwotICAgICAgdHJ1ZWxhYiA9IGZhbHNlbGFiOwotICAgIH0KLSAgICAgIAotICBpZiAobGVmdHN0YXJ0ICE9IE5VTEwpCi0gICAgewotICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAKLQkJCSAgICAgICsgKGxlZnRzdG9wIC0gbGVmdHN0YXJ0KQotCQkJICAgICAgKyAocmlnaHRzdG9wIC0gcmlnaHRzdGFydCkpOwotICAgICAgcyA9IGJ1ZjsKLSAgICAgICpzKysgPSAnYyc7Ci0gICAgICAqcysrID0gJ20nOwotICAgICAgKnMrKyA9ICdwJzsKLSAgICAgIGlmIChxdWFsICE9ICdcMCcpCi0JKnMrKyA9IHF1YWw7Ci0gICAgICAqcysrID0gJyAnOwotICAgICAgbWVtY3B5IChzLCBsZWZ0c3RhcnQsIGxlZnRzdG9wIC0gbGVmdHN0YXJ0KTsKLSAgICAgIHMgKz0gbGVmdHN0b3AgLSBsZWZ0c3RhcnQ7Ci0gICAgICAqcysrID0gJywnOwotICAgICAgbWVtY3B5IChzLCByaWdodHN0YXJ0LCByaWdodHN0b3AgLSByaWdodHN0YXJ0KTsKLSAgICAgIHMgKz0gcmlnaHRzdG9wIC0gcmlnaHRzdGFydDsKLSAgICAgICpzID0gJ1wwJzsKLSAgICAgIG1yaV9hc3NlbWJsZSAoYnVmKTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgfQotICAgICAgCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDIwICsgc3RybGVuICh0cnVlbGFiKSk7Ci0gIHMgPSBidWY7Ci0gICpzKysgPSAnYic7Ci0gICpzKysgPSBjYyA+PiA4OwotICAqcysrID0gY2MgJiAweGZmOwotICBpZiAoZXh0ZW50ICE9ICdcMCcpCi0gICAgKnMrKyA9IGV4dGVudDsKLSAgKnMrKyA9ICcgJzsKLSAgc3RyY3B5IChzLCB0cnVlbGFiKTsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotICBmcmVlIChidWYpOwotfQotCi0vKiBQYXJzZSBhbiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGV4cHJlc3Npb24uICBUaGlzIGdlbmVyYXRlcyB0ZXN0Ci0gICBhbmQgYnJhbmNoIGluc3RydWN0aW9ucy4gIFNUT1AgaXMgd2hlcmUgdGhlIGV4cHJlc3Npb24gZW5kcy4gIEl0Ci0gICBnb2VzIHRvIFRSVUVMQUIgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLCBhbmQgdG8gRkFMU0VMQUIgaWYgdGhlCi0gICBjb25kaXRpb24gaXMgZmFsc2UuICBFeGFjdGx5IG9uZSBvZiBUUlVFTEFCIGFuZCBGQUxTRUxBQiB3aWxsIGJlCi0gICBOVUxMLCBtZWFuaW5nIHRvIGZhbGwgdGhyb3VnaC4gIFFVQUwgaXMgdGhlIHNpemUgcXVhbGlmaWVyIGZvciB0aGUKLSAgIGV4cHJlc3Npb24uICBFWFRFTlQgaXMgdGhlIHNpemUgdG8gdXNlIGZvciB0aGUgYnJhbmNoLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24gKHN0b3AsIHF1YWwsIHRydWVsYWIsIGZhbHNlbGFiLCBleHRlbnQpCi0gICAgIGNoYXIgKnN0b3A7Ci0gICAgIGludCBxdWFsOwotICAgICBjb25zdCBjaGFyICp0cnVlbGFiOwotICAgICBjb25zdCBjaGFyICpmYWxzZWxhYjsKLSAgICAgaW50IGV4dGVudDsKLXsKLSAgaW50IGM7Ci0gIGludCBjYzsKLSAgY2hhciAqbGVmdHN0YXJ0OwotICBjaGFyICpsZWZ0c3RvcDsKLSAgY2hhciAqcmlnaHRzdGFydDsKLSAgY2hhciAqcmlnaHRzdG9wOwotCi0gIGMgPSAqc3RvcDsKLSAgKnN0b3AgPSAnXDAnOwotCi0gIGlmICghIHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQgKCZjYywgJmxlZnRzdGFydCwgJmxlZnRzdG9wLAotCQkJCSAgICZyaWdodHN0YXJ0LCAmcmlnaHRzdG9wKSkKLSAgICB7Ci0gICAgICAqc3RvcCA9IGM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiQU5EIiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpmbGFiOwotCi0gICAgICBpZiAoZmFsc2VsYWIgIT0gTlVMTCkKLQlmbGFiID0gZmFsc2VsYWI7Ci0gICAgICBlbHNlCi0JZmxhYiA9IG1yaV9jb250cm9sX2xhYmVsICgpOwotCi0gICAgICBidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kIChxdWFsLCBjYywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCwgcmlnaHRzdGFydCwKLQkJCQkgcmlnaHRzdG9wLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmbGFiLCBleHRlbnQpOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMzsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcuJwotCSAgfHwgaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICdcMCcpCi0JcXVhbCA9ICdcMCc7Ci0gICAgICBlbHNlCi0JewotCSAgcXVhbCA9IGlucHV0X2xpbmVfcG9pbnRlclsxXTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCX0KLQotICAgICAgaWYgKCEgcGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZCAoJmNjLCAmbGVmdHN0YXJ0LCAmbGVmdHN0b3AsCi0JCQkJICAgICAgICZyaWdodHN0YXJ0LCAmcmlnaHRzdG9wKSkKLQl7Ci0JICAqc3RvcCA9IGM7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kIChxdWFsLCBjYywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCwgcmlnaHRzdGFydCwKLQkJCQkgcmlnaHRzdG9wLCB0cnVlbGFiLCBmYWxzZWxhYiwgZXh0ZW50KTsKLQotICAgICAgaWYgKGZhbHNlbGFiID09IE5VTEwpCi0JY29sb24gKGZsYWIpOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIk9SIiwgMikgPT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICp0bGFiOwotCi0gICAgICBpZiAodHJ1ZWxhYiAhPSBOVUxMKQotCXRsYWIgPSB0cnVlbGFiOwotICAgICAgZWxzZQotCXRsYWIgPSBtcmlfY29udHJvbF9sYWJlbCAoKTsKLQotICAgICAgYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCAocXVhbCwgY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsCi0JCQkJIHJpZ2h0c3RvcCwgdGxhYiwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZXh0ZW50KTsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLicKLQkgIHx8IGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnXDAnKQotCXF1YWwgPSAnXDAnOwotICAgICAgZWxzZQotCXsKLQkgIHF1YWwgPSBpbnB1dF9saW5lX3BvaW50ZXJbMV07Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQl9Ci0KLSAgICAgIGlmICghIHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQgKCZjYywgJmxlZnRzdGFydCwgJmxlZnRzdG9wLAotCQkJCSAgICAgICAmcmlnaHRzdGFydCwgJnJpZ2h0c3RvcCkpCi0JewotCSAgKnN0b3AgPSBjOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCAocXVhbCwgY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsCi0JCQkJIHJpZ2h0c3RvcCwgdHJ1ZWxhYiwgZmFsc2VsYWIsIGV4dGVudCk7Ci0KLSAgICAgIGlmICh0cnVlbGFiID09IE5VTEwpCi0JY29sb24gKHRsYWIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQgKHF1YWwsIGNjLCBsZWZ0c3RhcnQsIGxlZnRzdG9wLCByaWdodHN0YXJ0LAotCQkJCSByaWdodHN0b3AsIHRydWVsYWIsIGZhbHNlbGFiLCBleHRlbnQpOwotICAgIH0KLQotICAqc3RvcCA9IGM7Ci0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXIgIT0gc3RvcCkKLSAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBpbiBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIikpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBJRiBwc2V1ZG8tb3AuICBUaGlzIG1heSBiZSBhIHN0cnVjdHVyZWQgY29udHJvbAotICAgZGlyZWN0aXZlLCBvciBpdCBtYXkgYmUgYSByZWd1bGFyIGFzc2VtYmxlciBjb25kaXRpb25hbCwgZGVwZW5kaW5nCi0gICBvbiBpdHMgb3BlcmFuZHMuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfaWYgKHF1YWwpCi0gICAgIGludCBxdWFsOwotewotICBjaGFyICpzOwotICBpbnQgYzsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0KLSAgLyogQSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIG11c3QgZW5kIHdpdGggVEhFTiB3aXRoIGFuCi0gICAgIG9wdGlvbmFsIHF1YWxpZmllci4gICovCi0gIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqc10KLQkgJiYgKCEgZmxhZ19tcmkgfHwgKnMgIT0gJyonKSkKLSAgICArK3M7Ci0gIC0tczsKLSAgd2hpbGUgKHMgPiBpbnB1dF9saW5lX3BvaW50ZXIgJiYgKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKSkKLSAgICAtLXM7Ci0KLSAgaWYgKHMgLSBpbnB1dF9saW5lX3BvaW50ZXIgPiAxCi0gICAgICAmJiBzWy0xXSA9PSAnLicpCi0gICAgcyAtPSAyOwotCi0gIGlmIChzIC0gaW5wdXRfbGluZV9wb2ludGVyIDwgMwotICAgICAgfHwgc3RybmNhc2VjbXAgKHMgLSAzLCAiVEhFTiIsIDQpICE9IDApCi0gICAgewotICAgICAgaWYgKHF1YWwgIT0gJ1wwJykKLQl7Ci0JICBhc19iYWQgKF8oIm1pc3NpbmcgdGhlbiIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBJdCdzIGEgY29uZGl0aW9uYWwuICAqLwotICAgICAgc19pZiAoT19uZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFNpbmNlIHRoaXMgbWlnaHQgYmUgYSBjb25kaXRpb25hbCBpZiwgdGhpcyBwc2V1ZG8tb3Agd2lsbCBiZQotICAgICBjYWxsZWQgZXZlbiBpZiB3ZSBhcmUgc3VwcG9ydGVkIHRvIGJlIGlnbm9yaW5nIGlucHV0LiAgRG91YmxlCi0gICAgIGNoZWNrIG5vdy4gIENsb2JiZXIgKmlucHV0X2xpbmVfcG9pbnRlciBzbyB0aGF0IGlnbm9yZV9pbnB1dAotICAgICB0aGlua3MgdGhhdCB0aGlzIGlzIG5vdCBhIHNwZWNpYWwgcHNldWRvLW9wLiAgKi8KLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSAwOwotICBpZiAoaWdub3JlX2lucHV0ICgpKQotICAgIHsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIG4gPSBwdXNoX21yaV9jb250cm9sIChtcmlfaWYpOwotCi0gIHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24gKHMgLSAzLCBxdWFsLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCW4tPm5leHQsIHNbMV0gPT0gJy4nID8gc1syXSA6ICdcMCcpOwotCi0gIGlmIChzWzFdID09ICcuJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzICsgMzsKLSAgZWxzZQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHMgKyAxOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIGVsc2UgcHNldWRvLW9wLiAgSWYgd2UgYXJlIGN1cnJlbnRseSBkb2luZyBhbiBNUkkKLSAgIHN0cnVjdHVyZWQgSUYsIGFzc29jaWF0ZSB0aGUgRUxTRSB3aXRoIHRoZSBJRi4gIE90aGVyd2lzZSwgYXNzdW1lCi0gICBpdCBpcyBhIGNvbmRpdGlvbmFsIGVsc2UuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfZWxzZSAocXVhbCkKLSAgICAgaW50IHF1YWw7Ci17Ci0gIGludCBjOwotICBjaGFyICpidWY7Ci0gIGNoYXIgcVsyXTsKLQotICBpZiAocXVhbCA9PSAnXDAnCi0gICAgICAmJiAobXJpX2NvbnRyb2xfc3RhY2sgPT0gTlVMTAotCSAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPnR5cGUgIT0gbXJpX2lmCi0JICB8fCBtcmlfY29udHJvbF9zdGFjay0+ZWxzZV9zZWVuKSkKLSAgICB7Ci0gICAgICBzX2Vsc2UgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IDA7Ci0gIGlmIChpZ25vcmVfaW5wdXQgKCkpCi0gICAgewotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgaWYgKG1yaV9jb250cm9sX3N0YWNrID09IE5VTEwKLSAgICAgIHx8IG1yaV9jb250cm9sX3N0YWNrLT50eXBlICE9IG1yaV9pZgotICAgICAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPmVsc2Vfc2VlbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImVsc2Ugd2l0aG91dCBtYXRjaGluZyBpZiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG1yaV9jb250cm9sX3N0YWNrLT5lbHNlX3NlZW4gPSAxOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDIwICsgc3RybGVuIChtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKSk7Ci0gIHFbMF0gPSBxdWFsOwotICBxWzFdID0gJ1wwJzsKLSAgc3ByaW50ZiAoYnVmLCAiYnJhJXMgJXMiLCBxLCBtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKTsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotICBmcmVlIChidWYpOwotCi0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+bmV4dCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgRU5ESSBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfZW5kaSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAobXJpX2NvbnRyb2xfc3RhY2sgPT0gTlVMTAotICAgICAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPnR5cGUgIT0gbXJpX2lmKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZW5kaSB3aXRob3V0IG1hdGNoaW5nIGlmIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogaWdub3JlX2lucHV0IHdpbGwgbm90IHJldHVybiB0cnVlIGZvciBFTkRJLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0gICAgIHdvcnJ5IGFib3V0IGNoZWNraW5nIGl0IGFnYWluIGhlcmUuICAqLwotCi0gIGlmICghIG1yaV9jb250cm9sX3N0YWNrLT5lbHNlX3NlZW4pCi0gICAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KTsKLSAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5ib3R0b20pOwotCi0gIHBvcF9tcmlfY29udHJvbCAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBCUkVBSyBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfYnJlYWsgKGV4dGVudCkKLSAgICAgaW50IGV4dGVudDsKLXsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciBleFsyXTsKLQotICBuID0gbXJpX2NvbnRyb2xfc3RhY2s7Ci0gIHdoaWxlIChuICE9IE5VTEwKLQkgJiYgbi0+dHlwZSAhPSBtcmlfZm9yCi0JICYmIG4tPnR5cGUgIT0gbXJpX3JlcGVhdAotCSAmJiBuLT50eXBlICE9IG1yaV93aGlsZSkKLSAgICBuID0gbi0+b3V0ZXI7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJicmVhayBvdXRzaWRlIG9mIHN0cnVjdHVyZWQgbG9vcCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDIwICsgc3RybGVuIChuLT5ib3R0b20pKTsKLSAgZXhbMF0gPSBleHRlbnQ7Ci0gIGV4WzFdID0gJ1wwJzsKLSAgc3ByaW50ZiAoYnVmLCAiYnJhJXMgJXMiLCBleCwgbi0+Ym90dG9tKTsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotICBmcmVlIChidWYpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIE5FWFQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX25leHQgKGV4dGVudCkKLSAgICAgaW50IGV4dGVudDsKLXsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciBleFsyXTsKLQotICBuID0gbXJpX2NvbnRyb2xfc3RhY2s7Ci0gIHdoaWxlIChuICE9IE5VTEwKLQkgJiYgbi0+dHlwZSAhPSBtcmlfZm9yCi0JICYmIG4tPnR5cGUgIT0gbXJpX3JlcGVhdAotCSAmJiBuLT50eXBlICE9IG1yaV93aGlsZSkKLSAgICBuID0gbi0+b3V0ZXI7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJuZXh0IG91dHNpZGUgb2Ygc3RydWN0dXJlZCBsb29wIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAgKyBzdHJsZW4gKG4tPm5leHQpKTsKLSAgZXhbMF0gPSBleHRlbnQ7Ci0gIGV4WzFdID0gJ1wwJzsKLSAgc3ByaW50ZiAoYnVmLCAiYnJhJXMgJXMiLCBleCwgbi0+bmV4dCk7Ci0gIG1yaV9hc3NlbWJsZSAoYnVmKTsKLSAgZnJlZSAoYnVmKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBGT1IgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX2ZvciAocXVhbCkKLSAgICAgaW50IHF1YWw7Ci17Ci0gIGNvbnN0IGNoYXIgKnZhcnN0YXJ0LCAqdmFyc3RvcDsKLSAgY29uc3QgY2hhciAqaW5pdHN0YXJ0LCAqaW5pdHN0b3A7Ci0gIGNvbnN0IGNoYXIgKmVuZHN0YXJ0LCAqZW5kc3RvcDsKLSAgY29uc3QgY2hhciAqYnlzdGFydCwgKmJ5c3RvcDsKLSAgaW50IHVwOwotICBpbnQgYnk7Ci0gIGludCBleHRlbnQ7Ci0gIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpuOwotICBjaGFyICpidWY7Ci0gIGNoYXIgKnM7Ci0gIGNoYXIgZXhbMl07Ci0KLSAgLyogVGhlIHN5bnRheCBpcwotICAgICAgIEZPUi5xIHZhciA9IGluaXQgeyBUTyB8IERPV05UTyB9IGVuZCBbIEJZIGJ5IF0gRE8uZQotICAgICAqLwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgdmFyc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgLyogTG9vayBmb3IgdGhlICc9Jy4gICovCi0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXQotCSAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICc9JykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz0nKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyA9IikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdmFyc3RvcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKHZhcnN0b3AgPiB2YXJzdGFydAotICAgICAgJiYgKHZhcnN0b3BbLTFdID09ICcgJyB8fCB2YXJzdG9wWy0xXSA9PSAnXHQnKSkKLSAgICAtLXZhcnN0b3A7Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgaW5pdHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIC8qIExvb2sgZm9yIFRPIG9yIERPV05UTy4gICovCi0gIHVwID0gMTsKLSAgaW5pdHN0b3AgPSBOVUxMOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJUTyIsIDIpID09IDAKLQkgICYmICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbMl0pKQotCXsKLQkgIGluaXRzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkRPV05UTyIsIDYpID09IDAKLQkgICYmICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbNl0pKQotCXsKLQkgIGluaXRzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgdXAgPSAwOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7Ci0JICBicmVhazsKLQl9Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGlmIChpbml0c3RvcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyB0byBvciBkb3dudG8iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKGluaXRzdG9wID4gaW5pdHN0YXJ0Ci0gICAgICAmJiAoaW5pdHN0b3BbLTFdID09ICcgJyB8fCBpbml0c3RvcFstMV0gPT0gJ1x0JykpCi0gICAgLS1pbml0c3RvcDsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGVuZHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIC8qIExvb2sgZm9yIEJZIG9yIERPLiAgKi8KLSAgYnkgPSAwOwotICBlbmRzdG9wID0gTlVMTDsKLSAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiQlkiLCAyKSA9PSAwCi0JICAmJiAhIGlzX3BhcnRfb2ZfbmFtZSAoaW5wdXRfbGluZV9wb2ludGVyWzJdKSkKLQl7Ci0JICBlbmRzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgYnkgPSAxOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkRPIiwgMikgPT0gMAotCSAgJiYgKGlucHV0X2xpbmVfcG9pbnRlclsyXSA9PSAnLicKLQkgICAgICB8fCAhIGlzX3BhcnRfb2ZfbmFtZSAoaW5wdXRfbGluZV9wb2ludGVyWzJdKSkpCi0JewotCSAgZW5kc3RvcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCSAgYnJlYWs7Ci0JfQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBpZiAoZW5kc3RvcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyBkbyIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoZW5kc3RvcCA+IGVuZHN0YXJ0Ci0gICAgICAmJiAoZW5kc3RvcFstMV0gPT0gJyAnIHx8IGVuZHN0b3BbLTFdID09ICdcdCcpKQotICAgIC0tZW5kc3RvcDsKLQotICBpZiAoISBieSkKLSAgICB7Ci0gICAgICBieXN0YXJ0ID0gIiMxIjsKLSAgICAgIGJ5c3RvcCA9IGJ5c3RhcnQgKyAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGJ5c3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgIC8qIExvb2sgZm9yIERPLiAgKi8KLSAgICAgIGJ5c3RvcCA9IE5VTEw7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JewotCSAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJETyIsIDIpID09IDAKLQkgICAgICAmJiAoaW5wdXRfbGluZV9wb2ludGVyWzJdID09ICcuJwotCQkgIHx8ICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbMl0pKSkKLQkgICAgewotCSAgICAgIGJ5c3RvcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgICAgaWYgKGJ5c3RvcCA9PSBOVUxMKQotCXsKLQkgIGFzX2JhZCAoXygibWlzc2luZyBkbyIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGJ5c3RvcCA+IGJ5c3RhcnQKLQkgICYmIChieXN0b3BbLTFdID09ICcgJyB8fCBieXN0b3BbLTFdID09ICdcdCcpKQotCS0tYnlzdG9wOwotICAgIH0KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLicpCi0gICAgZXh0ZW50ID0gJ1wwJzsKLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dGVudCA9IGlucHV0X2xpbmVfcG9pbnRlclsxXTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotICAgIH0KLQotICAvKiBXZSBoYXZlIGZ1bGx5IHBhcnNlZCB0aGUgRk9SIG9wZXJhbmRzLiAgTm93IGJ1aWxkIHRoZSBsb29wLiAgKi8KLQotICBuID0gcHVzaF9tcmlfY29udHJvbCAobXJpX2Zvcik7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoNTAgKyAoaW5wdXRfbGluZV9wb2ludGVyIC0gdmFyc3RhcnQpKTsKLQotICAvKiBtb3ZlIGluaXQsdmFyICovCi0gIHMgPSBidWY7Ci0gICpzKysgPSAnbSc7Ci0gICpzKysgPSAnbyc7Ci0gICpzKysgPSAndic7Ci0gICpzKysgPSAnZSc7Ci0gIGlmIChxdWFsICE9ICdcMCcpCi0gICAgKnMrKyA9IHF1YWw7Ci0gICpzKysgPSAnICc7Ci0gIG1lbWNweSAocywgaW5pdHN0YXJ0LCBpbml0c3RvcCAtIGluaXRzdGFydCk7Ci0gIHMgKz0gaW5pdHN0b3AgLSBpbml0c3RhcnQ7Ci0gICpzKysgPSAnLCc7Ci0gIG1lbWNweSAocywgdmFyc3RhcnQsIHZhcnN0b3AgLSB2YXJzdGFydCk7Ci0gIHMgKz0gdmFyc3RvcCAtIHZhcnN0YXJ0OwotICAqcyA9ICdcMCc7Ci0gIG1yaV9hc3NlbWJsZSAoYnVmKTsKLQotICBjb2xvbiAobi0+dG9wKTsKLQotICAvKiBjbXAgZW5kLHZhciAqLwotICBzID0gYnVmOwotICAqcysrID0gJ2MnOwotICAqcysrID0gJ20nOwotICAqcysrID0gJ3AnOwotICBpZiAocXVhbCAhPSAnXDAnKQotICAgICpzKysgPSBxdWFsOwotICAqcysrID0gJyAnOwotICBtZW1jcHkgKHMsIGVuZHN0YXJ0LCBlbmRzdG9wIC0gZW5kc3RhcnQpOwotICBzICs9IGVuZHN0b3AgLSBlbmRzdGFydDsKLSAgKnMrKyA9ICcsJzsKLSAgbWVtY3B5IChzLCB2YXJzdGFydCwgdmFyc3RvcCAtIHZhcnN0YXJ0KTsKLSAgcyArPSB2YXJzdG9wIC0gdmFyc3RhcnQ7Ci0gICpzID0gJ1wwJzsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotCi0gIC8qIGJjYyBib3R0b20gKi8KLSAgZXhbMF0gPSBleHRlbnQ7Ci0gIGV4WzFdID0gJ1wwJzsKLSAgaWYgKHVwKQotICAgIHNwcmludGYgKGJ1ZiwgImJsdCVzICVzIiwgZXgsIG4tPmJvdHRvbSk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChidWYsICJiZ3QlcyAlcyIsIGV4LCBuLT5ib3R0b20pOwotICBtcmlfYXNzZW1ibGUgKGJ1Zik7Ci0KLSAgLyogUHV0IHRvZ2V0aGVyIHRoZSBhZGQgb3Igc3ViIGluc3RydWN0aW9uIHVzZWQgYnkgRU5ERi4gICovCi0gIHMgPSBidWY7Ci0gIGlmICh1cCkKLSAgICBzdHJjcHkgKHMsICJhZGQiKTsKLSAgZWxzZQotICAgIHN0cmNweSAocywgInN1YiIpOwotICBzICs9IDM7Ci0gIGlmIChxdWFsICE9ICdcMCcpCi0gICAgKnMrKyA9IHF1YWw7Ci0gICpzKysgPSAnICc7Ci0gIG1lbWNweSAocywgYnlzdGFydCwgYnlzdG9wIC0gYnlzdGFydCk7Ci0gIHMgKz0gYnlzdG9wIC0gYnlzdGFydDsKLSAgKnMrKyA9ICcsJzsKLSAgbWVtY3B5IChzLCB2YXJzdGFydCwgdmFyc3RvcCAtIHZhcnN0YXJ0KTsKLSAgcyArPSB2YXJzdG9wIC0gdmFyc3RhcnQ7Ci0gICpzID0gJ1wwJzsKLSAgbi0+aW5jciA9IGJ1ZjsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBFTkRGIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9lbmRmIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChtcmlfY29udHJvbF9zdGFjayA9PSBOVUxMCi0gICAgICB8fCBtcmlfY29udHJvbF9zdGFjay0+dHlwZSAhPSBtcmlfZm9yKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZW5kZiB3aXRob3V0IGZvciIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+bmV4dCk7Ci0KLSAgbXJpX2Fzc2VtYmxlIChtcmlfY29udHJvbF9zdGFjay0+aW5jcik7Ci0KLSAgc3ByaW50ZiAobXJpX2NvbnRyb2xfc3RhY2stPmluY3IsICJicmEgJXMiLCBtcmlfY29udHJvbF9zdGFjay0+dG9wKTsKLSAgbXJpX2Fzc2VtYmxlIChtcmlfY29udHJvbF9zdGFjay0+aW5jcik7Ci0KLSAgZnJlZSAobXJpX2NvbnRyb2xfc3RhY2stPmluY3IpOwotCi0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKTsKLQotICBwb3BfbXJpX2NvbnRyb2wgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgUkVQRUFUIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9yZXBlYXQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0KLSAgbiA9IHB1c2hfbXJpX2NvbnRyb2wgKG1yaV9yZXBlYXQpOwotICBjb2xvbiAobi0+dG9wKTsKLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIFVOVElMIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV91bnRpbCAocXVhbCkKLSAgICAgaW50IHF1YWw7Ci17Ci0gIGNoYXIgKnM7Ci0KLSAgaWYgKG1yaV9jb250cm9sX3N0YWNrID09IE5VTEwKLSAgICAgIHx8IG1yaV9jb250cm9sX3N0YWNrLT50eXBlICE9IG1yaV9yZXBlYXQpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ1bnRpbCB3aXRob3V0IHJlcGVhdCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+bmV4dCk7Ci0KLSAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyOyAhIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqc107IHMrKykKLSAgICA7Ci0KLSAgcGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbiAocywgcXVhbCwgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQltcmlfY29udHJvbF9zdGFjay0+dG9wLCAnXDAnKTsKLQotICBjb2xvbiAobXJpX2NvbnRyb2xfc3RhY2stPmJvdHRvbSk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLQotICBwb3BfbXJpX2NvbnRyb2wgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgV0hJTEUgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX3doaWxlIChxdWFsKQotICAgICBpbnQgcXVhbDsKLXsKLSAgY2hhciAqczsKLQotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbjsKLQotICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnNdCi0JICYmICghIGZsYWdfbXJpIHx8ICpzICE9ICcqJykpCi0gICAgcysrOwotICAtLXM7Ci0gIHdoaWxlICgqcyA9PSAnICcgfHwgKnMgPT0gJ1x0JykKLSAgICAtLXM7Ci0gIGlmIChzIC0gaW5wdXRfbGluZV9wb2ludGVyID4gMQotICAgICAgJiYgc1stMV0gPT0gJy4nKQotICAgIHMgLT0gMjsKLSAgaWYgKHMgLSBpbnB1dF9saW5lX3BvaW50ZXIgPCAyCi0gICAgICB8fCBzdHJuY2FzZWNtcCAocyAtIDEsICJETyIsIDIpICE9IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIGRvIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbiA9IHB1c2hfbXJpX2NvbnRyb2wgKG1yaV93aGlsZSk7Ci0KLSAgY29sb24gKG4tPm5leHQpOwotCi0gIHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24gKHMgLSAxLCBxdWFsLCAoY29uc3QgY2hhciAqKSBOVUxMLCBuLT5ib3R0b20sCi0JCQkJc1sxXSA9PSAnLicgPyBzWzJdIDogJ1wwJyk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gcyArIDE7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcuJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBFTkRXIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9lbmR3IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKmJ1ZjsKLQotICBpZiAobXJpX2NvbnRyb2xfc3RhY2sgPT0gTlVMTAotICAgICAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPnR5cGUgIT0gbXJpX3doaWxlKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZW5kdyB3aXRob3V0IHdoaWxlIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAgKyBzdHJsZW4gKG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KSk7Ci0gIHNwcmludGYgKGJ1ZiwgImJyYSAlcyIsIG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KTsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotICBmcmVlIChidWYpOwotCi0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKTsKLQotICBwb3BfbXJpX2NvbnRyb2wgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qCi0gKiBtZF9wYXJzZV9vcHRpb24KLSAqCUludm9jYXRpb24gbGluZSBpbmNsdWRlcyBhIHN3aXRjaCBub3QgcmVjb2duaXplZCBieSB0aGUgYmFzZSBhc3NlbWJsZXIuCi0gKglTZWUgaWYgaXQncyBhIHByb2Nlc3Nvci1zcGVjaWZpYyBvcHRpb24uICBUaGVzZSBhcmU6Ci0gKgotICoJLVtBXW1bY102ODAwMCwgLVtBXW1bY102ODAwOCwgLVtBXW1bY102ODAxMCwgLVtBXW1bY102ODAyMCwgLVtBXW1bY102ODAzMCwgLVtBXW1bY102ODA0MAotICoJLVtBXW1bY102ODg4MSwgLVtBXW1bY102ODg4MiwgLVtBXW1bY102ODg1MQotICoJCVNlbGVjdCB0aGUgYXJjaGl0ZWN0dXJlLiAgSW5zdHJ1Y3Rpb25zIG9yIGZlYXR1cmVzIG5vdAotICoJCXN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQgYXJjaGl0ZWN0dXJlIGNhdXNlIGZhdGFsCi0gKgkJZXJyb3JzLiAgTW9yZSB0aGFuIG9uZSBtYXkgYmUgc3BlY2lmaWVkLiAgVGhlIGRlZmF1bHQgaXMKLSAqCQktbTY4MDIwIC1tNjg4NTEgLW02ODg4MS4gIE5vdGUgdGhhdCAtbTY4MDA4IGlzIGEgc3lub255bQotICoJCWZvciAtbTY4MDAwLCBhbmQgLW02ODg4MiBpcyBhIHN5bm9ueW0gZm9yIC1tNjg4ODEuCi0gKgktW0FdbVtjXW5vLTY4ODUxLCAtW0FdbVtjXW5vLTY4ODgxCi0gKgkJRG9uJ3QgYWNjZXB0IDY4OD8xIGluc3RydWN0aW9ucy4gIChUaGUgImMiIGlzIGtpbmQgb2Ygc2lsbHksCi0gKgkJc28gZG9uJ3QgdXNlIG9yIGRvY3VtZW50IGl0LCBidXQgdGhhdCdzIHRoZSB3YXkgdGhlIHBhcnNpbmcKLSAqCQl3b3JrcykuCi0gKgotICoJLXBpYwlJbmRpY2F0ZXMgUElDLgotICoJLWsJSW5kaWNhdGVzIFBJQy4gIChTdW4gMyBvbmx5LikKLSAqCi0gKgktLWJpdHdpc2Utb3IKLSAqCQlQZXJtaXQgYHwnIHRvIGJlIHVzZWQgaW4gZXhwcmVzc2lvbnMuCi0gKgotICovCi0KLSNpZmRlZiBPQkpfRUxGCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAibFNBOm06a1E6ViI7Ci0jZWxzZQotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gImxTQTptOmsiOwotI2VuZGlmCi0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSNkZWZpbmUgT1BUSU9OX1BJQyAoT1BUSU9OX01EX0JBU0UpCi0gIHsicGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QSUN9LAotI2RlZmluZSBPUFRJT05fUkVHSVNURVJfUFJFRklYX09QVElPTkFMIChPUFRJT05fTURfQkFTRSArIDEpCi0gIHsicmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsIiwgbm9fYXJndW1lbnQsIE5VTEwsCi0gICAgIE9QVElPTl9SRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUx9LAotI2RlZmluZSBPUFRJT05fQklUV0lTRV9PUiAoT1BUSU9OX01EX0JBU0UgKyAyKQotICB7ImJpdHdpc2Utb3IiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JJVFdJU0VfT1J9LAotI2RlZmluZSBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMTYgKE9QVElPTl9NRF9CQVNFICsgMykKLSAgeyJiYXNlLXNpemUtZGVmYXVsdC0xNiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMTZ9LAotI2RlZmluZSBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMzIgKE9QVElPTl9NRF9CQVNFICsgNCkKLSAgeyJiYXNlLXNpemUtZGVmYXVsdC0zMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMzJ9LAotI2RlZmluZSBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMTYgKE9QVElPTl9NRF9CQVNFICsgNSkKLSAgeyJkaXNwLXNpemUtZGVmYXVsdC0xNiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMTZ9LAotI2RlZmluZSBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMzIgKE9QVElPTl9NRF9CQVNFICsgNikKLSAgeyJkaXNwLXNpemUtZGVmYXVsdC0zMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMzJ9LAotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ2wnOgkJCS8qIC1sIG1lYW5zIGtlZXAgZXh0ZXJuYWwgdG8gMiBiaXQgb2Zmc2V0Ci0JCQkJICAgcmF0aGVyIHRoYW4gMTYgYml0IG9uZSAqLwotICAgICAgZmxhZ19zaG9ydF9yZWZzID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUyc6CQkJLyogLVMgbWVhbnMgdGhhdCBqYnNyJ3MgYWx3YXlzIHR1cm4gaW50bwotCQkJCSAgIGpzcidzLiAgKi8KLSAgICAgIGZsYWdfbG9uZ19qdW1wcyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0EnOgotICAgICAgaWYgKCphcmcgPT0gJ20nKQotIAlhcmcrKzsKLSAgICAgIC8qIGludGVudGlvbmFsIGZhbGwtdGhyb3VnaCAqLwotICAgIGNhc2UgJ20nOgotCi0gICAgICBpZiAoYXJnWzBdID09ICduJyAmJiBhcmdbMV0gPT0gJ28nICYmIGFyZ1syXSA9PSAnLScpCi0JewotCSAgaW50IGk7Ci0JICB1bnNpZ25lZCBsb25nIGFyY2g7Ci0JICBjb25zdCBjaGFyICpvYXJnID0gYXJnOwotCi0JICBhcmcgKz0gMzsKLQkgIGlmICgqYXJnID09ICdtJykKLQkgICAgewotCSAgICAgIGFyZysrOwotCSAgICAgIGlmIChhcmdbMF0gPT0gJ2MnICYmIGFyZ1sxXSA9PSAnNicpCi0JCWFyZysrOwotCSAgICB9Ci0JICBmb3IgKGkgPSAwOyBpIDwgbl9hcmNoczsgaSsrKQotCSAgICBpZiAoIXN0cmNtcCAoYXJnLCBhcmNoc1tpXS5uYW1lKSkKLQkgICAgICBicmVhazsKLQkgIGlmIChpID09IG5fYXJjaHMpCi0JICAgIHsKLQkgICAgdW5rbm93bjoKLQkgICAgICBhc19iYWQgKF8oInVucmVjb2duaXplZCBvcHRpb24gYCVzJyIpLCBvYXJnKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCSAgYXJjaCA9IGFyY2hzW2ldLmFyY2g7Ci0JICBpZiAoYXJjaCA9PSBtNjg4ODEpCi0JICAgIG5vXzY4ODgxID0gMTsKLQkgIGVsc2UgaWYgKGFyY2ggPT0gbTY4ODUxKQotCSAgICBub182ODg1MSA9IDE7Ci0JICBlbHNlCi0JICAgIGdvdG8gdW5rbm93bjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50IGk7Ci0KLQkgIGlmIChhcmdbMF0gPT0gJ2MnICYmIGFyZ1sxXSA9PSAnNicpCi0JICAgIGFyZysrOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgbl9hcmNoczsgaSsrKQotCSAgICBpZiAoIXN0cmNtcCAoYXJnLCBhcmNoc1tpXS5uYW1lKSkKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGxvbmcgYXJjaCA9IGFyY2hzW2ldLmFyY2g7Ci0JCWlmIChjcHVfb2ZfYXJjaCAoYXJjaCkpCi0JCSAgLyogSXQncyBhIGNwdSBzcGVjLiAgKi8KLQkJICB7Ci0JCSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSAmPSB+bTY4MDAwdXA7Ci0JCSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBhcmNoOwotCQkgIH0KLQkJZWxzZSBpZiAoYXJjaCA9PSBtNjg4ODEpCi0JCSAgewotCQkgICAgY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gbTY4ODgxOwotCQkgICAgbm9fNjg4ODEgPSAwOwotCQkgIH0KLQkJZWxzZSBpZiAoYXJjaCA9PSBtNjg4NTEpCi0JCSAgewotCQkgICAgY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gbTY4ODUxOwotCQkgICAgbm9fNjg4NTEgPSAwOwotCQkgIH0KLQkJZWxzZQotCQkgIC8qID8/PyAqLwotCQkgIGFib3J0ICgpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICBpZiAoaSA9PSBuX2FyY2hzKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJ1bnJlY29nbml6ZWQgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gYCVzJyIpLCBhcmcpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9QSUM6Ci0gICAgY2FzZSAnayc6Ci0gICAgICBmbGFnX3dhbnRfcGljID0gMTsKLSAgICAgIGJyZWFrOwkJCS8qIC1waWMsIFBvc2l0aW9uIEluZGVwZW5kZW50IENvZGUgKi8KLQotICAgIGNhc2UgT1BUSU9OX1JFR0lTVEVSX1BSRUZJWF9PUFRJT05BTDoKLSAgICAgIGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCA9IDE7Ci0gICAgICByZWdfcHJlZml4X29wdGlvbmFsX3NlZW4gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIC1WOiBTVlI0IGFyZ3VtZW50IHRvIHByaW50IHZlcnNpb24gSUQuICAqLwotICAgIGNhc2UgJ1YnOgotICAgICAgcHJpbnRfdmVyc2lvbl9pZCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAtUXksIC1RbjogU1ZSNCBhcmd1bWVudHMgY29udHJvbGxpbmcgd2hldGhlciBhIC5jb21tZW50IHNlY3Rpb24KLQkgc2hvdWxkIGJlIGVtaXR0ZWQgb3Igbm90LiAgRklYTUU6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gICAgY2FzZSAnUSc6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0JJVFdJU0VfT1I6Ci0gICAgICB7Ci0JY2hhciAqbiwgKnQ7Ci0JY29uc3QgY2hhciAqczsKLQotCW4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG02OGtfY29tbWVudF9jaGFycykgKyAxKTsKLQl0ID0gbjsKLQlmb3IgKHMgPSBtNjhrX2NvbW1lbnRfY2hhcnM7ICpzICE9ICdcMCc7IHMrKykKLQkgIGlmICgqcyAhPSAnfCcpCi0JICAgICp0KysgPSAqczsKLQkqdCA9ICdcMCc7Ci0JbTY4a19jb21tZW50X2NoYXJzID0gbjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMTY6Ci0gICAgICBtNjhrX2luZGV4X3dpZHRoX2RlZmF1bHQgPSBTSVpFX1dPUkQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0JBU0VfU0laRV9ERUZBVUxUXzMyOgotICAgICAgbTY4a19pbmRleF93aWR0aF9kZWZhdWx0ID0gU0laRV9MT05HOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9ESVNQX1NJWkVfREVGQVVMVF8xNjoKLSAgICAgIG02OGtfcmVsMzIgPSAwOwotICAgICAgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9ESVNQX1NJWkVfREVGQVVMVF8zMjoKLSAgICAgIG02OGtfcmVsMzIgPSAxOwotICAgICAgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLTY4MFgwIG9wdGlvbnM6XG5cCi0tbAkJCXVzZSAxIHdvcmQgZm9yIHJlZnMgdG8gdW5kZWZpbmVkIHN5bWJvbHMgW2RlZmF1bHQgMl1cblwKLS1tNjgwMDAgfCAtbTY4MDA4IHwgLW02ODAxMCB8IC1tNjgwMjAgfCAtbTY4MDMwIHwgLW02ODA0MCB8IC1tNjgwNjBcblwKLSB8IC1tNjgzMDIgfCAtbTY4MzMxIHwgLW02ODMzMiB8IC1tNjgzMzMgfCAtbTY4MzQwIHwgLW02ODM2MFxuXAotIHwgLW1jcHUzMiB8IC1tNTIwMFxuXAotCQkJc3BlY2lmeSB2YXJpYW50IG9mIDY4MFgwIGFyY2hpdGVjdHVyZSBbZGVmYXVsdCA2ODAyMF1cblwKLS1tNjg4ODEgfCAtbTY4ODgyIHwgLW1uby02ODg4MSB8IC1tbm8tNjg4ODJcblwKLQkJCXRhcmdldCBoYXMvbGFja3MgZmxvYXRpbmctcG9pbnQgY29wcm9jZXNzb3JcblwKLQkJCVtkZWZhdWx0IHllcyBmb3IgNjgwMjAsIDY4MDMwLCBhbmQgY3B1MzJdXG4iKSk7Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi0tbTY4ODUxIHwgLW1uby02ODg1MVxuXAotCQkJdGFyZ2V0IGhhcy9sYWNrcyBtZW1vcnktbWFuYWdlbWVudCB1bml0IGNvcHJvY2Vzc29yXG5cCi0JCQlbZGVmYXVsdCB5ZXMgZm9yIDY4MDIwIGFuZCB1cF1cblwKLS1waWMsIC1rCQlnZW5lcmF0ZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlXG5cCi0tUwkJCXR1cm4gamJzciBpbnRvIGpzclxuXAotLS1yZWdpc3Rlci1wcmVmaXgtb3B0aW9uYWxcblwKLQkJCXJlY29nbml6ZSByZWdpc3RlciBuYW1lcyB3aXRob3V0IHByZWZpeCBjaGFyYWN0ZXJcblwKLS0tYml0d2lzZS1vcgkJZG8gbm90IHRyZWF0IGB8JyBhcyBhIGNvbW1lbnQgY2hhcmFjdGVyXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotLS1iYXNlLXNpemUtZGVmYXVsdC0xNgliYXNlIHJlZyB3aXRob3V0IHNpemUgaXMgMTYgYml0c1xuXAotLS1iYXNlLXNpemUtZGVmYXVsdC0zMgliYXNlIHJlZyB3aXRob3V0IHNpemUgaXMgMzIgYml0cyAoZGVmYXVsdClcblwKLS0tZGlzcC1zaXplLWRlZmF1bHQtMTYJZGlzcGxhY2VtZW50IHdpdGggdW5rbm93biBzaXplIGlzIDE2IGJpdHNcblwKLS0tZGlzcC1zaXplLWRlZmF1bHQtMzIJZGlzcGxhY2VtZW50IHdpdGggdW5rbm93biBzaXplIGlzIDMyIGJpdHMgKGRlZmF1bHQpXG4iKSk7Ci19Ci0MCi0jaWZkZWYgVEVTVDIKLQotLyogVEVTVDI6ICBUZXN0IG1kX2Fzc2VtYmxlKCkgKi8KLS8qIFdhcm5pbmcsIHRoaXMgcm91dGluZSBwcm9iYWJseSBkb2Vzbid0IHdvcmsgYW55bW9yZSAqLwotCi1tYWluICgpCi17Ci0gIHN0cnVjdCBtNjhrX2l0IHRoZV9pbnM7Ci0gIGNoYXIgYnVmWzEyMF07Ci0gIGNoYXIgKmNwOwotICBpbnQgbjsKLQotICBtNjhrX2lwX2JlZ2luICgpOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGlmICghZ2V0cyAoYnVmKSB8fCAhKmJ1ZikKLQlicmVhazsKLSAgICAgIGlmIChidWZbMF0gPT0gJ3wnIHx8IGJ1ZlsxXSA9PSAnLicpCi0JY29udGludWU7Ci0gICAgICBmb3IgKGNwID0gYnVmOyAqY3A7IGNwKyspCi0JaWYgKCpjcCA9PSAnXHQnKQotCSAgKmNwID0gJyAnOwotICAgICAgaWYgKGlzX2xhYmVsIChidWYpKQotCWNvbnRpbnVlOwotICAgICAgbWVtc2V0ICgmdGhlX2lucywgJ1wwJywgc2l6ZW9mICh0aGVfaW5zKSk7Ci0gICAgICBtNjhrX2lwICgmdGhlX2lucywgYnVmKTsKLSAgICAgIGlmICh0aGVfaW5zLmVycm9yKQotCXsKLQkgIHByaW50ZiAoXygiRXJyb3IgJXMgaW4gJXNcbiIpLCB0aGVfaW5zLmVycm9yLCBidWYpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKF8oIk9wY29kZSglZC4lcyk6ICIpLCB0aGVfaW5zLm51bW8sIHRoZV9pbnMuYXJncyk7Ci0JICBmb3IgKG4gPSAwOyBuIDwgdGhlX2lucy5udW1vOyBuKyspCi0JICAgIHByaW50ZiAoIiAweCV4IiwgdGhlX2lucy5vcGNvZGVbbl0gJiAweGZmZmYpOwotCSAgcHJpbnRmICgiICAgICIpOwotCSAgcHJpbnRfdGhlX2luc24gKCZ0aGVfaW5zLm9wY29kZVswXSwgc3Rkb3V0KTsKLQkgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLQl9Ci0gICAgICBmb3IgKG4gPSAwOyBuIDwgc3RybGVuICh0aGVfaW5zLmFyZ3MpIC8gMjsgbisrKQotCXsKLQkgIGlmICh0aGVfaW5zLm9wZXJhbmRzW25dLmVycm9yKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgib3AlZCBFcnJvciAlcyBpbiAlc1xuIiwgbiwgdGhlX2lucy5vcGVyYW5kc1tuXS5lcnJvciwgYnVmKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgcHJpbnRmICgibW9kZSAlZCwgcmVnICVkLCAiLCB0aGVfaW5zLm9wZXJhbmRzW25dLm1vZGUsIHRoZV9pbnMub3BlcmFuZHNbbl0ucmVnKTsKLQkgIGlmICh0aGVfaW5zLm9wZXJhbmRzW25dLmJfY29uc3QpCi0JICAgIHByaW50ZiAoIkNvbnN0YW50OiAnJS4qcycsICIsIDEgKyB0aGVfaW5zLm9wZXJhbmRzW25dLmVfY29uc3QgLSB0aGVfaW5zLm9wZXJhbmRzW25dLmJfY29uc3QsIHRoZV9pbnMub3BlcmFuZHNbbl0uYl9jb25zdCk7Ci0JICBwcmludGYgKCJpcmVnICVkLCBpc2l6ICVkLCBpbXVsICVkLCAiLCB0aGVfaW5zLm9wZXJhbmRzW25dLmlyZWcsIHRoZV9pbnMub3BlcmFuZHNbbl0uaXNpeiwgdGhlX2lucy5vcGVyYW5kc1tuXS5pbXVsKTsKLQkgIGlmICh0aGVfaW5zLm9wZXJhbmRzW25dLmJfaWFkZCkKLQkgICAgcHJpbnRmICgiSWFkZDogJyUuKnMnLCIsIDEgKyB0aGVfaW5zLm9wZXJhbmRzW25dLmVfaWFkZCAtIHRoZV9pbnMub3BlcmFuZHNbbl0uYl9pYWRkLCB0aGVfaW5zLm9wZXJhbmRzW25dLmJfaWFkZCk7Ci0JICAodm9pZCkgcHV0Y2hhciAoJ1xuJyk7Ci0JfQotICAgIH0KLSAgbTY4a19pcF9lbmQgKCk7Ci0gIHJldHVybiAwOwotfQotCi1pc19sYWJlbCAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLSAgd2hpbGUgKCpzdHIgJiYgKnN0ciAhPSAnICcpCi0gICAgc3RyKys7Ci0gIGlmIChzdHJbLTFdID09ICc6JyB8fCBzdHJbMV0gPT0gJz0nKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCi0KLS8qIFBvc3NpYmxlIHN0YXRlcyBmb3IgcmVsYXhhdGlvbjoKLQotICAgMCAwCWJyYW5jaCBvZmZzZXQJYnl0ZQkoYnJhLCBldGMpCi0gICAwIDEJCQl3b3JkCi0gICAwIDIJCQlsb25nCi0KLSAgIDEgMAlpbmRleGVkIG9mZnNldHMJYnl0ZQlhMEAoMzIsZDQ6dzoxKSBldGMKLSAgIDEgMQkJCXdvcmQKLSAgIDEgMgkJCWxvbmcKLQotICAgMiAwCXR3by1vZmZzZXQgaW5kZXggd29yZC13b3JkIGEwQCgzMixkNClAKDQ1KSBldGMKLSAgIDIgMQkJCXdvcmQtbG9uZwotICAgMiAyCQkJbG9uZy13b3JkCi0gICAyIDMJCQlsb25nLWxvbmcKLQotICAgKi8KLQotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSNpZmRlZiBPQkpfQU9VVAotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogRm9yIGEub3V0LCBmb3JjZSB0aGUgc2VjdGlvbiBzaXplIHRvIGJlIGFsaWduZWQuICBJZiB3ZSBkb24ndCBkbwotICAgICB0aGlzLCBCRkQgd2lsbCBhbGlnbiBpdCBmb3IgdXMsIGJ1dCBpdCB3aWxsIG5vdCB3cml0ZSBvdXQgdGhlCi0gICAgIGZpbmFsIGJ5dGVzIG9mIHRoZSBzZWN0aW9uLiAgVGhpcyBtYXkgYmUgYSBidWcgaW4gQkZELCBidXQgaXQgaXMKLSAgICAgZWFzaWVyIHRvIGZpeCBpdCBoZXJlIHNpbmNlIHRoYXQgaXMgaG93IHRoZSBvdGhlciBhLm91dCB0YXJnZXRzCi0gICAgIHdvcmsuICAqLwotICBpbnQgYWxpZ247Ci0KLSAgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpOwotICBzaXplID0gKChzaXplICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoKHZhbHVlVCkgLTEgPDwgYWxpZ24pKTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8KLSAgIE9uIHRoZSA2OGssIGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBleHRlbnNpb24KLSAgIHdvcmQuICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzZXMgb2YgdGhlIG9mZnNldCBhbmQgdGhlCi0gICBmaXJzdCBleHRlbnNpb24gd29yZCBpcyBzdG9yZWQgaW4gZnhfcGNyZWxfYWRqdXN0LiAqLwotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgaW50IGFkanVzdDsKLQotICAvKiBCZWNhdXNlIGZ4X3BjcmVsX2FkanVzdCBpcyBhIGNoYXIsIGFuZCBtYXkgYmUgdW5zaWduZWQsIHdlIHN0b3JlCi0gICAgIC0xIGFzIDY0LiAgKi8KLSAgYWRqdXN0ID0gZml4UC0+ZnhfcGNyZWxfYWRqdXN0OwotICBpZiAoYWRqdXN0ID09IDY0KQotICAgIGFkanVzdCA9IC0xOwotICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzIC0gYWRqdXN0OwotfQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBPQkpfQ09GRgotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLXRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoaWdub3JlKQotICAgICBzeW1ib2xTICppZ25vcmU7Ci17Ci19Ci0KLWludAotdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIHN3aXRjaCAoZnJhZy0+ZnJfc3VidHlwZSAmIDB4MykKLSAgICB7Ci0gICAgY2FzZSBCWVRFOgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBTSE9SVDoKLSAgICAgIHJldHVybiAyOwotICAgIGNhc2UgTE9ORzoKLSAgICAgIHJldHVybiA0OwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi12b2lkIG02OGtfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcoKQotewotICAgLyogU2V0IGZpbGUtc3BlY2lmaWMgZmxhZ3MgaWYgdGhpcyBpcyBhIGNwdTMyIHByb2Nlc3NvciAqLwotICAgaWYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgJiBjcHUzMikKLSAgICAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9DUFUzMjsKLX0KLSNlbmRpZgotLyogZW5kIG9mIHRjLW02OGsuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tNjhrLmggYi9nYXMvY29uZmlnL3RjLW02OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhNWVmOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW02OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtbTY4ay5oCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX002OEsgMQotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3Qgc3ltYm9sOwotc3RydWN0IGZpeDsKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2lmZGVmIE9CSl9BT1VUCi0jaWZkZWYgVEVfU1VOMwotI2RlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC1zdW5vcy1iaWciCi0jZW5kaWYKLSNpZmRlZiBURV9OZXRCU0QKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtbTY4ay1uZXRic2QiCi0jZW5kaWYKLSNpZmRlZiBURV9MSU5VWAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC1tNjhrLWxpbnV4IgotI2VuZGlmCi0jaWZuZGVmIFRBUkdFVF9GT1JNQVQKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtemVyby1iaWciCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1tNjhrIgotI2VuZGlmCi0KLSNpZmRlZiBURV9BUE9MTE8KLSNkZWZpbmUgQ09GRl9NQUdJQwkJQVBPTExPTTY4S01BR0lDCi0jZGVmaW5lIENPRkZfQU9VVEhEUl9NQUdJQwlBUE9MTE9fQ09GRl9WRVJTSU9OX05VTUJFUgotI3VuZGVmIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0jZW5kaWYKLQotI2lmZGVmIFRFX0xZTlgKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImNvZmYtbTY4ay1seW54IgotI2VuZGlmCi0jaWZkZWYgVEVfQVVYCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJjb2ZmLW02OGstYXV4IgotI2VuZGlmCi0jaWZkZWYgVEVfREVMVEEKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImNvZmYtbTY4ay1zeXN2IgotI2VuZGlmCi0KLSNpZm5kZWYgQ09GRl9NQUdJQwotI2RlZmluZSBDT0ZGX01BR0lDIE1DNjhNQUdJQwotI2VuZGlmCi0jZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX202OGsgLyogZm9yIG5vbi1CRkRfQVNTRU1CTEVSICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX202OGsgLyogQkZEX0FTU0VNQkxFUiAqLwotI2RlZmluZSBDT0ZGX0ZMQUdTIEZfQVIzMlcKLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoeCkgKCh4KS0+ZnhfYWRkc3l8fCh4KS0+Znhfc3Vic3kpCi0KLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgdGNfY29mZl9maXgycnR5cGUoZml4UCkKLSNkZWZpbmUgVENfQ09GRl9TSVpFTUFDSERFUChmcmFnKSB0Y19jb2ZmX3NpemVtYWNoZGVwKGZyYWcpCi1leHRlcm4gaW50IHRjX2NvZmZfc2l6ZW1hY2hkZXAgUEFSQU1TICgoc3RydWN0IGZyYWcgKikpOwotI2lmZGVmIFRFX1NVTjMKLS8qIFRoaXMgdmFyaWFibGUgY29udGFpbnMgdGhlIHZhbHVlIHRvIHdyaXRlIG91dCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICB0aGUgYS5vdXQgZmlsZS4gIFRoZSAyPDwxNiBtZWFucyB0aGF0IHRoaXMgaXMgYSA2ODAyMCBmaWxlIGluc3RlYWQKLSAgIG9mIGFuIG9sZC1zdHlsZSA2ODAwMCBmaWxlICovCi0KLSNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFICgyPDwxNnxPTUFHSUMpOwkvKiBNYWdpYyBieXRlIGZvciBmaWxlIGhlYWRlciAqLwotI2VuZGlmIC8qIFRFX1NVTjMgKi8KLQotI2lmbmRlZiBBT1VUX01BQ0hUWVBFCi0jZGVmaW5lIEFPVVRfTUFDSFRZUEUgbTY4a19hb3V0X21hY2h0eXBlCi1leHRlcm4gaW50IG02OGtfYW91dF9tYWNodHlwZTsKLSNlbmRpZgotCi0jZGVmaW5lIHRjX2NvbW1lbnRfY2hhcnMgbTY4a19jb21tZW50X2NoYXJzCi1leHRlcm4gY29uc3QgY2hhciAqbTY4a19jb21tZW50X2NoYXJzOwotCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihhKQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfYW91dF9wcmVfd3JpdGVfaG9vayh4KQl7O30JLyogbm90IHVzZWQgKi8KLQotI2RlZmluZSBMSVNUSU5HX1dPUkRfU0laRSAyCS8qIEEgd29yZCBpcyAyIGJ5dGVzICovCi0jZGVmaW5lIExJU1RJTkdfTEhTX1dJRFRIIDIJLyogT25lIHdvcmQgb24gdGhlIGZpcnN0IGxpbmUgKi8KLSNkZWZpbmUgTElTVElOR19MSFNfV0lEVEhfU0VDT05EIDIJLyogT25lIHdvcmQgb24gdGhlIHNlY29uZCBsaW5lICovCi0jZGVmaW5lIExJU1RJTkdfTEhTX0NPTlRfTElORVMgNC8qIEFuZCA0IGxpbmVzIG1heCAqLwotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiNjhLIEdBUyAiCi0KLSNpZm5kZWYgUkVHSVNURVJfUFJFRklYCi0jZGVmaW5lIFJFR0lTVEVSX1BSRUZJWCAnJScKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCkKLSNpZiBkZWZpbmVkIChNNjhLQ09GRikgfHwgZGVmaW5lZCAoT0JKX0VMRikKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBMT0NBTF9MQUJFTChuYW1lKSAobmFtZVswXSA9PSAnLicgXAotCQkJICAgJiYgKG5hbWVbMV0gPT0gJ0wnIHx8IG5hbWVbMV0gPT0gJy4nKSkKLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLSNkZWZpbmUgUkVHSVNURVJfUFJFRklYX09QVElPTkFMIDAKLSNlbHNlIC8qICEgKENPRkYgfHwgRUxGKSAqLwotI2RlZmluZSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwgMQotI2VuZGlmIC8qICEgKENPRkYgfHwgRUxGKSAqLwotI2VuZGlmIC8qIG5vdCBkZWYgUkVHSVNURVJfUFJFRklYIGFuZCBub3QgZGVmIE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCAqLwotCi0jaWZkZWYgVEVfREVMVEEKLS8qIE9uIHRoZSBEZWx0YSwgYCUnIGNhbiBvY2N1ciB3aXRoaW4gYSBsYWJlbCBuYW1lLCBidXQgbm90IGFzIHRoZQotICAgaW5pdGlhbCBjaGFyYWN0ZXIuICAqLwotI2RlZmluZSBMRVhfUENUIExFWF9OQU1FCi0vKiBPbiB0aGUgRGVsdGEsIGB+JyBjYW4gc3RhcnQgYSBsYWJlbCBuYW1lLCBidXQgaXMgY29udmVydGVkIHRvICcuJy4gKi8KLSNkZWZpbmUgTEVYX1RJTERFIExFWF9CRUdJTl9OQU1FCi0jZGVmaW5lIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZShzKSAoKCoocykgPT0gJ34nID8gKihzKSA9ICcuJyA6ICcuJyksIHMpCi0vKiBPbiB0aGUgRGVsdGEsIGRvdHMgYXJlIG5vdCByZXF1aXJlZCBiZWZvcmUgcHNldWRvLW9wcy4gICovCi0jZGVmaW5lIE5PX1BTRVVET19ET1QKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI3VuZGVmIExPQ0FMX0xBQkVMCi0jZGVmaW5lIExPQ0FMX0xBQkVMKG5hbWUpIFwKLSAgKG5hbWVbMF0gPT0gJy4nIHx8IChuYW1lWzBdID09ICdMJyAmJiBuYW1lWzFdID09ICclJykpCi0jZW5kaWYKLSNlbmRpZgotCi1leHRlcm4gdm9pZCBtNjhrX21yaV9tb2RlX2NoYW5nZSBQQVJBTVMgKChpbnQpKTsKLSNkZWZpbmUgTVJJX01PREVfQ0hBTkdFKGkpIG02OGtfbXJpX21vZGVfY2hhbmdlIChpKQotCi1leHRlcm4gaW50IG02OGtfY29uZGl0aW9uYWxfcHNldWRvb3AgUEFSQU1TICgocHNldWRvX3R5cGVTICopKTsKLSNkZWZpbmUgdGNfY29uZGl0aW9uYWxfcHNldWRvb3AocG9wKSBtNjhrX2NvbmRpdGlvbmFsX3BzZXVkb29wIChwb3ApCi0KLWV4dGVybiB2b2lkIG02OGtfZnJvYl9sYWJlbCBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICopKTsKLSNkZWZpbmUgdGNfZnJvYl9sYWJlbChzeW0pIG02OGtfZnJvYl9sYWJlbCAoc3ltKQotCi1leHRlcm4gdm9pZCBtNjhrX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQoKSBtNjhrX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpCi0KLWV4dGVybiB2b2lkIG02OGtfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqKSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNkZWZpbmUgdGNfZnJvYl9zeW1ib2woc3ltLHB1bnQpCQkJCVwKLWRvCQkJCQkJCQlcCi0gIHsJCQkJCQkJCVwKLSAgICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSByZWdfc2VjdGlvbikJCQlcCi0gICAgICBwdW50ID0gMTsJCQkJCQkJXAotICAgIG02OGtfZnJvYl9zeW1ib2wgKHN5bSk7CQkJCQlcCi0gIH0JCQkJCQkJCVwKLXdoaWxlICgwKQotCi0jZGVmaW5lIE5PX1JFTE9DIEJGRF9SRUxPQ19OT05FCi0KLSNpZmRlZiBPQkpfRUxGCi0KLS8qIFRoaXMgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UgaWYgdGhlIHJlbG9jYXRpb24gaXMgZm9yIGEgbG9jYWwgb2JqZWN0Ci0gICBmb3Igd2hpY2ggd2Ugc3RpbGwgd2FudCB0byBkbyB0aGUgcmVsb2NhdGlvbiBhdCBydW50aW1lLiAgVHJ1ZSBpZiB3ZQotICAgYXJlIHdpbGxpbmcgdG8gcGVyZm9ybSB0aGlzIHJlbG9jYXRpb24gd2hpbGUgYnVpbGRpbmcgdGhlIC5vIGZpbGUuICBJZgotICAgdGhlIHJlbG9jIGlzIGFnYWluc3QgYW4gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbCwgdGhlbiB0aGUgYXNzZW1ibGVyCi0gICBzaG91bGQgbmV2ZXIgZG8gdGhlIHJlbG9jYXRpb24uICAqLwotCi0jZGVmaW5lIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUChGSVgpCQkJXAotCSgoRklYKS0+ZnhfYWRkc3kgPT0gTlVMTAkJCVwKLQkgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KQkJXAotCSAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkJCVwKLQkgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KQkJXAotCSAgICAgJiYgISBTX0lTX0NPTU1PTiAoKEZJWCktPmZ4X2FkZHN5KSkpCi0KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoWCkgdGNfbTY4a19maXhfYWRqdXN0YWJsZShYKQotZXh0ZXJuIGludCB0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotI2RlZmluZSBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyBtNjhrX2VsZl9maW5hbF9wcm9jZXNzaW5nCi1leHRlcm4gdm9pZCBtNjhrX2VsZl9maW5hbF9wcm9jZXNzaW5nIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYKQkJCVwKLQkoKEZJWCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQJXAotCSB8fCAoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0KLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jZGVmaW5lIHRjX2Zyb2JfY29mZl9zeW1ib2woc3ltKSBtNjhrX2Zyb2Jfc3ltYm9sIChzeW0pCi0KLSNkZWZpbmUgTk9fUkVMT0MgMAotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LCi0KLWV4dGVybiB2b2lkIG02OGtfaW5pdF9hZnRlcl9hcmdzIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgdGNfaW5pdF9hZnRlcl9hcmdzIG02OGtfaW5pdF9hZnRlcl9hcmdzCi0KLWV4dGVybiBpbnQgbTY4a19wYXJzZV9sb25nX29wdGlvbiBQQVJBTVMgKChjaGFyICopKTsKLSNkZWZpbmUgbWRfcGFyc2VfbG9uZ19vcHRpb24gbTY4a19wYXJzZV9sb25nX29wdGlvbgotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotI2RlZmluZSBUQVJHRVRfV09SRF9TSVpFIDMyCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX202OGsKLQotZXh0ZXJuIHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotLyogQ29waWVkIGZyb20gd3JpdGUuYyAqLwotLyogVGhpcyB3YXMgZm9ybWVybHkgY2FsbGVkIE02OEtfQUlNX0tMVURHRS4gICovCi0jZGVmaW5lIG1kX3ByZXBhcmVfcmVsYXhfc2NhbihmcmFnUCwgYWRkcmVzcywgYWltLCB0aGlzX3N0YXRlLCB0aGlzX3R5cGUpIFwKLSAgaWYgKGFpbT09MCAmJiB0aGlzX3N0YXRlPT0gNCkgeyAvKiBoYXJkIGVuY29kZWQgZnJvbSB0Yy1tNjhrLmMgKi8gXAotICAgIGFpbT10aGlzX3R5cGUtPnJseF9mb3J3YXJkKzE7IC8qIEZvcmNlIHJlbGF4YXRpb24gaW50byB3b3JkIG1vZGUgKi8gXAotICB9Ci0KLS8qIGVuZCBvZiB0Yy1tNjhrLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbTg4ay5jIGIvZ2FzL2NvbmZpZy90Yy1tODhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMWE0OTZhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbTg4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1MiArMCwwIEBACi0vKiBtODhrLmMgLS0gQXNzZW1ibGVyIGZvciB0aGUgTW90b3JvbGEgODgwMDAKLSAgIENvbnRyaWJ1dGVkIGJ5IERldm9uIEJvd2VuIG9mIEJ1ZmZhbG8gVW5pdmVyc2l0eQotICAgYW5kIFRvcmJqb3JuIEdyYW5sdW5kIG9mIHRoZSBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NwotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm04OGstb3Bjb2RlLmgiCi0KLXN0cnVjdCBmaWVsZF92YWxfYXNzb2MKLXsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgdmFsOwotfTsKLQotc3RydWN0IGZpZWxkX3ZhbF9hc3NvYyBjcl9yZWdzW10gPQotewotICB7IlBJRCIsIDB9LAotICB7IlBTUiIsIDF9LAotICB7IkVQU1IiLCAyfSwKLSAgeyJTU0JSIiwgM30sCi0gIHsiU1hJUCIsIDR9LAotICB7IlNOSVAiLCA1fSwKLSAgeyJTRklQIiwgNn0sCi0gIHsiVkJSIiwgN30sCi0gIHsiRE1UMCIsIDh9LAotICB7IkRNRDAiLCA5fSwKLSAgeyJETUEwIiwgMTB9LAotICB7IkRNVDEiLCAxMX0sCi0gIHsiRE1EMSIsIDEyfSwKLSAgeyJETUExIiwgMTN9LAotICB7IkRNVDIiLCAxNH0sCi0gIHsiRE1EMiIsIDE1fSwKLSAgeyJETUEyIiwgMTZ9LAotICB7IlNSMCIsIDE3fSwKLSAgeyJTUjEiLCAxOH0sCi0gIHsiU1IyIiwgMTl9LAotICB7IlNSMyIsIDIwfSwKLQotICB7TlVMTCwgMH0sCi19OwotCi1zdHJ1Y3QgZmllbGRfdmFsX2Fzc29jIGZjcl9yZWdzW10gPQotewotICB7IkZQRUNSIiwgMH0sCi0gIHsiRlBIUzEiLCAxfSwKLSAgeyJGUExTMSIsIDJ9LAotICB7IkZQSFMyIiwgM30sCi0gIHsiRlBMUzIiLCA0fSwKLSAgeyJGUFBUIiwgNX0sCi0gIHsiRlBSSCIsIDZ9LAotICB7IkZQUkwiLCA3fSwKLSAgeyJGUElUIiwgOH0sCi0KLSAgeyJGUFNSIiwgNjJ9LAotICB7IkZQQ1IiLCA2M30sCi0KLSAge05VTEwsIDB9LAotfTsKLQotc3RydWN0IGZpZWxkX3ZhbF9hc3NvYyBjbXBzbG90W10gPQotewotLyogSW50ZWdlcglGbG9hdGluZyBwb2ludCAqLwotICB7Im5jIiwgMH0sCi0gIHsiY3AiLCAxfSwKLSAgeyJlcSIsIDJ9LAotICB7Im5lIiwgM30sCi0gIHsiZ3QiLCA0fSwKLSAgeyJsZSIsIDV9LAotICB7Imx0IiwgNn0sCi0gIHsiZ2UiLCA3fSwKLSAgeyJoaSIsIDh9LAl7Im91IiwgOH0sCi0gIHsibHMiLCA5fSwJeyJpYiIsIDl9LAotICB7ImxvIiwgMTB9LAl7ImluIiwgMTB9LAotICB7ImhzIiwgMTF9LAl7Im9iIiwgMTF9LAotICB7ImJlIiwgMTJ9LAl7InVlIiwgMTJ9LAotICB7Im5iIiwgMTN9LAl7ImxnIiwgMTN9LAotICB7ImhlIiwgMTR9LAl7InVnIiwgMTR9LAotICB7Im5oIiwgMTV9LAl7InVsZSIsIDE1fSwKLQkJeyJ1bCIsIDE2fSwKLQkJeyJ1Z2UiLCAxN30sCi0KLSAge05VTEwsIDB9LAotfTsKLQotc3RydWN0IGZpZWxkX3ZhbF9hc3NvYyBjbmRtc2tbXSA9Ci17Ci0gIHsiZ3QwIiwgMX0sCi0gIHsiZXEwIiwgMn0sCi0gIHsiZ2UwIiwgM30sCi0gIHsibHQwIiwgMTJ9LAotICB7Im5lMCIsIDEzfSwKLSAgeyJsZTAiLCAxNH0sCi0KLSAge05VTEwsIDB9LAotfTsKLQotc3RydWN0IG04OGtfaW5zbgotewotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBlbnVtIHJlbG9jX3R5cGUgcmVsb2M7Ci19OwotCi1zdGF0aWMgY2hhciAqZ2V0X2JmIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqdmFscCkpOwotc3RhdGljIGNoYXIgKmdldF9jbXAgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICp2YWxwKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X2NuZCBQQVJBTVMgKChjaGFyICpwYXJhbSwgdW5zaWduZWQgKnZhbHApKTsKLXN0YXRpYyBjaGFyICpnZXRfY3IgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICpyZWdub3ApKTsKLXN0YXRpYyBjaGFyICpnZXRfZmNyIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqcmVnbm9wKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X2ltbTE2IFBBUkFNUyAoKGNoYXIgKnBhcmFtLCBzdHJ1Y3QgbTg4a19pbnNuICppbnNuKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X282IFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqdmFscCkpOwotc3RhdGljIGNoYXIgKmdldF9yZWcgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICpyZWdub3AsIGludCByZWdfcHJlZml4KSk7Ci1zdGF0aWMgY2hhciAqZ2V0X3ZlYzkgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICp2YWxwKSk7Ci1zdGF0aWMgY2hhciAqZ2V0dmFsIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCBpbnQgKnZhbHApKTsKLQotc3RhdGljIGNoYXIgKmdldF9wY3IgUEFSQU1TICgoY2hhciAqcGFyYW0sIHN0cnVjdCBtODhrX2luc24gKmluc24sCi0JCSAgICAgIGVudW0gcmVsb2NfdHlwZSByZWxvYykpOwotCi1zdGF0aWMgaW50IGNhbGNvcCBQQVJBTVMgKChzdHJ1Y3QgbTg4a19vcGNvZGUgKmZvcm1hdCwKLQkJCSAgIGNoYXIgKnBhcmFtLCBzdHJ1Y3QgbTg4a19pbnNuICppbnNuKSk7Ci0KLQotZXh0ZXJuIGNoYXIgKm15bmFtZTsKLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoID0gTlVMTDsKLQotLyogVGhlc2UgYml0cyBzaG91bGQgYmUgdHVybmVkIG9mZiBpbiB0aGUgZmlyc3QgYWRkcmVzcyBvZiBldmVyeSBzZWdtZW50ICovCi1pbnQgbWRfc2VnX2FsaWduID0gNzsKLQotLyogVGhlc2UgY2hhcnMgc3RhcnQgYSBjb21tZW50IGFueXdoZXJlIGluIGEgc291cmNlIGZpbGUgKGV4Y2VwdCBpbnNpZGUKLSAgIGFub3RoZXIgY29tbWVudCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7Ci0KLS8qIFRoZXNlIGNoYXJzIG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIGFzIGluIDBmMTIzLjQ1NiAqLwotLyogb3IgICAgMEgxLjIzNEUtMTIgKHNlZSBleHAgY2hhcnMgYWJvdmUpICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREZkYiOwotCi1leHRlcm4gdm9pZCBmbG9hdF9jb25zICgpLCBjb25zICgpLCBzX2dsb2JsICgpLCBzX3NwYWNlICgpLAotICBzX3NldCAoKSwgc19sY29tbSAoKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDR9LAotICB7ImRlZiIsIHNfc2V0LCAwfSwKLSAgeyJkZmxvYXQiLCBmbG9hdF9jb25zLCAnZCd9LAotICB7ImZmbG9hdCIsIGZsb2F0X2NvbnMsICdmJ30sCi0gIHsiZ2xvYmFsIiwgc19nbG9ibCwgMH0sCi0gIHsiaGFsZiIsIGNvbnMsIDJ9LAotICB7ImJzcyIsIHNfbGNvbW0sIDF9LAotICB7InN0cmluZyIsIHN0cmluZ2VyLCAwfSwKLSAgeyJ3b3JkIiwgY29ucywgNH0sCi0gIC8qIEZvcmNlIHNldCB0byBiZSB0cmVhdGVkIGFzIGFuIGluc3RydWN0aW9uLiAgKi8KLSAgeyJzZXQiLCBOVUxMLCAwfSwKLSAgeyIuc2V0Iiwgc19zZXQsIDB9LAotICB7MH0KLX07Ci0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNvbnN0IGNoYXIgKnJldHZhbCA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBpID0gMDsKLQotICAvKiBpbml0aWFsaXplIGhhc2ggdGFibGUgKi8KLQotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgLyogbG9vcCB1bnRpbCB5b3Ugc2VlIHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KLQotICB3aGlsZSAoKm04OGtfb3Bjb2Rlc1tpXS5uYW1lKQotICAgIHsKLSAgICAgIGNoYXIgKm5hbWUgPSBtODhrX29wY29kZXNbaV0ubmFtZTsKLQotICAgICAgLyogaGFzaCBlYWNoIG1uZW1vbmljIGFuZCByZWNvcmQgaXRzIHBvc2l0aW9uICovCi0KLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBuYW1lLCAmbTg4a19vcGNvZGVzW2ldKTsKLQotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQotCWFzX2ZhdGFsIChfKCJDYW4ndCBoYXNoIGluc3RydWN0aW9uICclcyc6JXMiKSwKLQkJICBtODhrX29wY29kZXNbaV0ubmFtZSwgcmV0dmFsKTsKLQotICAgICAgLyogc2tpcCB0byBuZXh0IHVuaXF1ZSBtbmVtb25pYyBvciBlbmQgb2YgbGlzdCAqLwotCi0gICAgICBmb3IgKGkrKzsgIXN0cmNtcCAobTg4a19vcGNvZGVzW2ldLm5hbWUsIG5hbWUpOyBpKyspCi0JOwotICAgIH0KLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci19Ci0MCi12b2lkCi1tZF9hc3NlbWJsZSAob3ApCi0gICAgIGNoYXIgKm9wOwotewotICBjaGFyICpwYXJhbSwgKnRoaXNmcmFnOwotICBjaGFyIGM7Ci0gIHN0cnVjdCBtODhrX29wY29kZSAqZm9ybWF0OwotICBzdHJ1Y3QgbTg4a19pbnNuIGluc247Ci0KLSAgYXNzZXJ0IChvcCk7Ci0KLSAgLyogc2tpcCBvdmVyIGluc3RydWN0aW9uIHRvIGZpbmQgcGFyYW1ldGVycyAqLwotCi0gIGZvciAocGFyYW0gPSBvcDsgKnBhcmFtICE9IDAgJiYgIWlzc3BhY2UgKCpwYXJhbSk7IHBhcmFtKyspCi0gICAgOwotICBjID0gKnBhcmFtOwotICAqcGFyYW0rKyA9ICdcMCc7Ci0KLSAgLyogdHJ5IHRvIGZpbmQgdGhlIGluc3RydWN0aW9uIGluIHRoZSBoYXNoIHRhYmxlICovCi0KLSAgaWYgKChmb3JtYXQgPSAoc3RydWN0IG04OGtfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgb3ApKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBtbmVtb25pYyAnJXMnIiksIG9wKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogdHJ5IHBhcnNpbmcgdGhpcyBpbnN0cnVjdGlvbiBpbnRvIGluc24gKi8KLQotICBpbnNuLmV4cC5YX2FkZF9zeW1ib2wgPSAwOwotICBpbnNuLmV4cC5YX29wX3N5bWJvbCA9IDA7Ci0gIGluc24uZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gIGluc24uZXhwLlhfb3AgPSBPX2lsbGVnYWw7Ci0gIGluc24ucmVsb2MgPSBOT19SRUxPQzsKLQotICB3aGlsZSAoIWNhbGNvcCAoZm9ybWF0LCBwYXJhbSwgJmluc24pKQotICAgIHsKLSAgICAgIC8qIGlmIGl0IGRvZXNuJ3QgcGFyc2UgdHJ5IHRoZSBuZXh0IGluc3RydWN0aW9uICovCi0KLSAgICAgIGlmICghc3RyY21wIChmb3JtYXRbMF0ubmFtZSwgZm9ybWF0WzFdLm5hbWUpKQotCWZvcm1hdCsrOwotICAgICAgZWxzZQotCXsKLQkgIGFzX2ZhdGFsIChfKCJQYXJhbWV0ZXIgc3ludGF4IGVycm9yIikpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogZ3JvdyB0aGUgY3VycmVudCBmcmFnIGFuZCBwbG9wIGluIHRoZSBvcGNvZGUgKi8KLQotICB0aGlzZnJhZyA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAodGhpc2ZyYWcsIGluc24ub3Bjb2RlLCA0KTsKLQotICAvKiBpZiB0aGlzIGluc3RydWN0aW9uIHJlcXVpcmVzIGxhYmVscyBtYXJrIGl0IGZvciBsYXRlciAqLwotCi0gIHN3aXRjaCAoaW5zbi5yZWxvYykKLSAgICB7Ci0gICAgY2FzZSBOT19SRUxPQzoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19MTzE2OgotICAgIGNhc2UgUkVMT0NfSEkxNjoKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgdGhpc2ZyYWcgLSBmcmFnX25vdy0+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+c3lfbnVtYmVyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByaS5yX2V4dGVybiA9IDA7Ci0JICAgICAgcmkucl9zeW1ib2xudW0gPSBzeW1ib2xQLT5zeV90eXBlICYgTl9UWVBFOwotCSAgICB9Ci0JICBpZiAoc3ltYm9sUCAmJiBzeW1ib2xQLT5zeV9mcmFnKQotCSAgICB7Ci0JICAgICAgcmkucl9hZGRlbmQgPSBzeW1ib2xQLT5zeV9mcmFnLT5mcl9hZGRyZXNzOwotCSAgICB9Ci0JICByaS5yX3R5cGUgPSBmaXhQLT5meF9yX3R5cGU7Ci0JICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JICAgIHsKLQkgICAgICByaS5yX2FkZGVuZCAtPSByaS5yX2FkZHJlc3M7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJpLnJfYWRkZW5kID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotCSAgICB9Ci0KLQkgIGFwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIChjaGFyICopICZyaSwgc2l6ZW9mIChyaSkpOwotCX0KLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAwICovCi0KLSNpZiAwCi0KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgc3Vic3VtZWQgYnkgc19sY29tbSBpbiByZWFkLmMuCi0gICBJYW4gVGF5bG9yLCBDeWdudXMgU3VwcG9ydCAxMyBKdWwgMTk5MyAqLwotCi0KLXN0YXRpYyB2b2lkCi1zX2JzcyAoKQotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIGludCB0ZW1wLCBic3NfYWxpZ247Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQlNTIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgYnNzX2FsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgYnNzX2FsaWduID0gMDsKLQotICBpZiAoIVNfSVNfREVGSU5FRChzeW1ib2xQKQotICAgICAgfHwgU19HRVRfU0VHTUVOVChzeW1ib2xQKSA9PSBTRUdfQlNTKQotICAgIHsKLSAgICAgIGlmICghIG5lZWRfcGFzc18yKQotCXsKLQkgIGNoYXIgKnA7Ci0JICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsKLQkgIHN1YnNlZ1QgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOwotCi0JICBzdWJzZWdfc2V0IChTRUdfQlNTLCAxKTsgLyogc3dpdGNoIHRvIGJzcwkqLwotCi0JICBpZiAoYnNzX2FsaWduKQotCSAgICBmcmFnX2FsaWduIChic3NfYWxpZ24sIDAsIDApOwotCi0JICAvKiBkZXRhY2ggZnJvbSBvbGQgZnJhZyAqLwotCSAgaWYgKHN5bWJvbFAtPnN5X3R5cGUgPT0gTl9CU1MgJiYgc3ltYm9sUC0+c3lfZnJhZyAhPSBOVUxMKQotCSAgICBzeW1ib2xQLT5zeV9mcmFnLT5mcl9zeW1ib2wgPSBOVUxMOwotCi0JICBzeW1ib2xQLT5zeV9mcmFnICA9IGZyYWdfbm93OwotCSAgcCA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpMCwgc3ltYm9sUCwKLQkJCShvZmZzZXRUKSB0ZW1wLCAoY2hhciAqKTApOwotCSAgKnAgPSAwOwotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgU0VHX0JTUyk7Ci0KLQkgIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VnLCBjdXJyZW50X3N1YnNlZyk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCAlcy4iKSwgbmFtZSk7Ci0gICAgfQotCi0gIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogMCAqLwotCi0jaWZkZWYgTTg4S0NPRkYKLQotLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBuZWVkZWQgaWYgd2UgYXJlIGxpbmtpbmcgd2l0aCBvYmotY29mZmJmZC5jLgotICAgVGhhdCBmaWxlIG1heSBiZSByZXBsYWNlZCBieSBhIG1vcmUgQkZEIG9yaWVudGVkIHZlcnNpb24gYXQgc29tZQotICAgcG9pbnQuICBJZiB0aGF0IGhhcHBlbnMsIHRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgcmV4YW1pbmVkLgotCi0gICBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgMTMgSnVseSAxOTkzLiAgKi8KLQotLyogR2l2ZW4gYSBmaXhTIHN0cnVjdHVyZSAoY3JlYXRlZCBieSBhIGNhbGwgdG8gZml4X25ldywgYWJvdmUpLAotICAgcmV0dXJuIHRoZSBCRkQgcmVsb2NhdGlvbiB0eXBlIHRvIHVzZSBmb3IgaXQuICAqLwotCi1zaG9ydAotdGNfY29mZl9maXgycnR5cGUgKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJFTE9DX0xPMTY6Ci0gICAgICByZXR1cm4gUl9MVlJUMTY7Ci0gICAgY2FzZSBSRUxPQ19ISTE2OgotICAgICAgcmV0dXJuIFJfSFZSVDE2OwotICAgIGNhc2UgUkVMT0NfUEMxNjoKLSAgICAgIHJldHVybiBSX1BDUjE2TDsKLSAgICBjYXNlIFJFTE9DX1BDMjY6Ci0gICAgICByZXR1cm4gUl9QQ1IyNkw7Ci0gICAgY2FzZSBSRUxPQ18zMjoKLSAgICAgIHJldHVybiBSX1ZSVDMyOwotICAgIGNhc2UgUkVMT0NfSVcxNjoKLSAgICAgIHJldHVybiBSX1ZSVDE2OwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLS8qIEFwcGx5IGEgZml4UyB0byB0aGUgb2JqZWN0IGZpbGUuICBTaW5jZSBDT0ZGIGRvZXMgbm90IHVzZSBhZGRlbmRzCi0gICBpbiByZWxvY3MsIHRoZSBhZGRlbmQgaXMgYWN0dWFsbHkgc3RvcmVkIGRpcmVjdGx5IGluIHRoZSBvYmplY3QKLSAgIGZpbGUgaXRzZWxmLiAgKi8KLQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhwLCB2YWwpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIGxvbmcgdmFsOwotewotICBjaGFyICpidWY7Ci0KLSAgYnVmID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOwotICBmaXhwLT5meF9vZmZzZXQgPSAwOwotCi0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJFTE9DX0lXMTY6Ci0gICAgICBmaXhwLT5meF9vZmZzZXQgPSB2YWwgPj4gMTY7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19MTzE2OgotICAgICAgZml4cC0+Znhfb2Zmc2V0ID0gdmFsID4+IDE2OwotICAgICAgYnVmWzBdID0gdmFsID4+IDg7Ci0gICAgICBidWZbMV0gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfSEkxNjoKLSAgICAgIGZpeHAtPmZ4X29mZnNldCA9IHZhbCA+PiAxNjsKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzFdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX1BDMTY6Ci0gICAgICBidWZbMF0gPSB2YWwgPj4gMTA7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19QQzI2OgotICAgICAgYnVmWzBdIHw9ICh2YWwgPj4gMjYpICYgMHgwMzsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAxODsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiAxMDsKLSAgICAgIGJ1ZlszXSA9IHZhbCA+PiAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DXzMyOgotICAgICAgYnVmWzBdID0gdmFsID4+IDI0OwotICAgICAgYnVmWzFdID0gdmFsID4+IDE2OwotICAgICAgYnVmWzJdID0gdmFsID4+IDg7Ci0gICAgICBidWZbM10gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLS8qIFdoZXJlIGEgUEMgcmVsYXRpdmUgb2Zmc2V0IGlzIGNhbGN1bGF0ZWQgZnJvbS4gIE9uIHRoZSBtODhrIHRoZXkKLSAgIGFyZSBjYWxjdWxhdGVkIGZyb20ganVzdCBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhwKQotICAgICBmaXhTICpmaXhwOwotewotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSRUxPQ19QQzE2OgotICAgICAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZSAtIDI7Ci0gICAgY2FzZSBSRUxPQ19QQzI2OgotICAgICAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBXaGVuIHdlIGFsaWduIHRoZSAuaW5pdCBzZWN0aW9uLCBpbnNlcnQgdGhlIGNvcnJlY3QgTk9QIHBhdHRlcm4uICAqLwotCi1pbnQKLW04OGtfZG9fYWxpZ24gKG4sIGZpbGwsIG1heCwgbGVuKQotICAgICBpbnQgbjsKLSAgICAgY29uc3QgY2hhciAqZmlsbDsKLSAgICAgaW50IGxlbjsKLSAgICAgaW50IG1heDsKLXsKLSAgaWYgKGZpbGwgPT0gTlVMTAotICAgICAgJiYgc3RyY21wIChvYmpfc2VnbWVudF9uYW1lIChub3dfc2VnKSwgIi5pbml0IikgPT0gMCkKLSAgICB7Ci0gICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBub3BfcGF0dGVybltdID0geyAweGY0LCAweDAwLCAweDU4LCAweDAwIH07Ci0gICAgICBmcmFnX2FsaWduX3BhdHRlcm4gKG4sIG5vcF9wYXR0ZXJuLCBzaXplb2YgKG5vcF9wYXR0ZXJuKSwgbWF4KTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBNODhLQ09GRiAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tODhrLmggYi9nYXMvY29uZmlnL3RjLW04OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI2YjY5Ny4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW04OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKiBtODhrLmggLS0gQXNzZW1ibGVyIGZvciB0aGUgTW90b3JvbGEgODgwMDAKLSAgIENvbnRyaWJ1dGVkIGJ5IERldm9uIEJvd2VuIG9mIEJ1ZmZhbG8gVW5pdmVyc2l0eQotICAgYW5kIFRvcmJqb3JuIEdyYW5sdW5kIG9mIHRoZSBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NwotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfTTg4SwotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2lmZGVmIE04OEtDT0ZGCi0jZGVmaW5lIENPRkZfTUFHSUMgTUM4OE9NQUdJQwotI2RlZmluZSBCRkRfQVJDSCBiZmRfYXJjaF9tODhrCi0jZGVmaW5lIENPRkZfRkxBR1MgRl9BUjMyVwotI2VuZGlmCi0KLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUKLSNkZWZpbmUgVENfS0VFUF9GWF9PRkZTRVQKLSNkZWZpbmUgVENfQ09OU19SRUxPQyBSRUxPQ18zMgotCi0vKiBkaWZmZXJlbnQgdHlwZSBvZiByZWxvY2F0aW9uIGF2YWlsYWJsZSBpbiB0aGUgbTg4ayAqLwotCi1lbnVtIHJlbG9jX3R5cGUKLXsKLSAgUkVMT0NfTE8xNiwJCQkvKiBsbzE2KHN5bSkgKi8KLSAgUkVMT0NfSEkxNiwJCQkvKiBoaTE2KHN5bSkgKi8KLSAgUkVMT0NfUEMxNiwJCQkvKiBiYjAsIGJiMSwgYmNuZCAqLwotICBSRUxPQ19QQzI2LAkJCS8qIGJyLCBic3IgKi8KLSAgUkVMT0NfMzIsCQkJLyoganVtcCB0YWJsZXMsIGV0YyAqLwotICBSRUxPQ19JVzE2LAkJCS8qIGdsb2JhbCBhY2Nlc3MgdGhyb3VnaCBsaW5rZXIgcmVncyAyOCAqLwotICBOT19SRUxPQwotfTsKLQotc3RydWN0IHJlbG9jX2luZm9fbTg4awotewotICB1bnNpZ25lZCBsb25nIGludCByX2FkZHJlc3M7Ci0gIHVuc2lnbmVkIGludCByX3N5bWJvbG51bToyNDsKLSAgdW5zaWduZWQgaW50IHJfZXh0ZXJuOjE7Ci0gIHVuc2lnbmVkIGludCByX3BhZDozOwotICBlbnVtIHJlbG9jX3R5cGUgcl90eXBlOjQ7Ci0gIGxvbmcgaW50IHJfYWRkZW5kOwotfTsKLQotI2RlZmluZSByZWxvY2F0aW9uX2luZm8gcmVsb2NfaW5mb19tODhrCi0KLS8qIFRoZSBtODhrIHVzZXMgJ0AnIHRvIHN0YXJ0IGxvY2FsIGxhYmVscy4gICovCi0jZGVmaW5lIExFWF9BVCAoTEVYX0JFR0lOX05BTUUgfCBMRVhfTkFNRSkKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIExPQ0FMX0xBQkVMKG5hbWUpIFwKLSAgKChuYW1lWzBdID09J0AnICYmIChuYW1lIFsxXSA9PSAnTCcgfHwgbmFtZSBbMV0gPT0gJy4nKSkgXAotICAgfHwgKG5hbWVbMF0gPT0gJ0wnICYmIG5hbWVbMV0gPT0gJzAnICYmIG5hbWVbMl0gPT0gJ1wwMDEnKSkKLSNlbmRpZgotCi0vKiBUaGUgbTg4ayB1c2VzIHBzZXVkby1vcHMgd2l0aCBubyBsZWFkaW5nIHBlcmlvZC4gICovCi0jZGVmaW5lIE5PX1BTRVVET19ET1QKLQotLyogRG9uJ3Qgd2FybiBvbiB3b3JkIG92ZXJmbG93OyBpdCBoYXBwZW5zIG9uICVoaSByZWxvY3MuICAqLwotI3VuZGVmIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQKLQotI2RlZmluZSBtZF9jb252ZXJ0X2ZyYWcoYixzLGYpCQl7YXNfZmF0YWwgKF8oIm04OGsgY29udmVydF9mcmFnXG4iKSk7fQotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgZm9yIHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgbWRfdW5kZWZpbmVkX3N5bWJvbChzKSAwCi0KLS8qIFdlIGhhdmUgbm8gc3BlY2lhbCBvcGVyYW5kIGhhbmRsaW5nLiAgKi8KLSNkZWZpbmUgbWRfb3BlcmFuZChlKQotCi0jaWZkZWYgTTg4S0NPRkYKLQotLyogV2hldGhlciBhIHJlbG9jIHNob3VsZCBiZSBvdXRwdXQuICAqLwotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyhmaXhwKSAoKGZpeHApLT5meF9hZGRzeSAhPSBOVUxMKQotCi0vKiBHZXQgdGhlIEJGRCByZWxvYyB0eXBlIHRvIHVzZSBmb3IgYSBnYXMgZml4UyBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShmaXhwKSB0Y19jb2ZmX2ZpeDJydHlwZSAoZml4cCkKLQotLyogTm8gc3BlY2lhbCBob29rIG5lZWRlZCBmb3Igc3ltYm9scy4gICovCi0jZGVmaW5lIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayhzKQotCi0vKiBBbGlnbiBzZWN0aW9ucyB0byBhIGZvdXIgYnl0ZSBib3VuZGFyeS4gICovCi0jaWZuZGVmIG1heAotI2RlZmluZSBtYXgoYSxiKQkoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCi0jZW5kaWYKLSNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKQltYXggKHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIChTRUcpXSwgNCkKLQotLyogV2UgdXNlIGEgc3BlY2lhbCBhbGlnbm1lbnQgZnVuY3Rpb24gdG8gaW5zZXJ0IHRoZSBjb3JyZWN0IG5vcAotICAgcGF0dGVybiBpbiAuaW5pdC4gICovCi1leHRlcm4gaW50IG04OGtfZG9fYWxpZ24gUEFSQU1TICgoaW50LCBjb25zdCBjaGFyICosIGludCwgaW50KSk7Ci0jZGVmaW5lIG1kX2RvX2FsaWduKG4sZmlsbCxsZW4sbWF4LGwpIGlmIChtODhrX2RvX2FsaWduKG4sZmlsbCxtYXgsbGVuKSkgZ290byBsCi0KLSNlbmRpZiAvKiBNODhLQ09GRiAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tY29yZS5jIGIvZ2FzL2NvbmZpZy90Yy1tY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzEyZjk5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDIxODMgKzAsMCBAQAotLyogdGMtbWNvcmUuYyAtLSBBc3NlbWJsZSBjb2RlIGZvciBNKkNvcmUKLQotICAgQ29weXJpZ2h0IChDKSAxOTkzLDE5OTQsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0jaW5jbHVkZSAiLi4vb3Bjb2Rlcy9tY29yZS1vcGMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaWZkZWYgT0JKX0VMRgotI2luY2x1ZGUgImVsZi9tY29yZS5oIgotI2VuZGlmCi0KLSNpZm5kZWYgc3RyZXEKLSNkZWZpbmUgc3RyZXEoYSxiKSAoc3RyY21wIChhLCBiKSA9PSAwKQotI2VuZGlmCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBkdW1iIGNvbXBpbGVycy4gICovCi1zdGF0aWMgdm9pZCAgIG1jb3JlX3NfbGl0ZXJhbHMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX2NvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX2Zsb2F0X2NvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX3N0cmluZ2VyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGludCAgICBsb2cyIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNoYXIgKiBwYXJzZV9yZWcgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCAqKSk7Ci1zdGF0aWMgY2hhciAqIHBhcnNlX2NyZWcgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCAqKSk7Ci1zdGF0aWMgY2hhciAqIHBhcnNlX2V4cCBQQVJBTVMgKChjaGFyICosIGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyB2b2lkICAgbWFrZV9uYW1lIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgICAgZW50ZXJfbGl0ZXJhbCBQQVJBTVMgKChleHByZXNzaW9uUyAqLCBpbnQpKTsKLXN0YXRpYyBjaGFyICogcGFyc2VfcnQgUEFSQU1TICgoY2hhciAqLCBjaGFyICoqLCBpbnQsIGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyBjaGFyICogcGFyc2VfaW1tIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgKiwgdW5zaWduZWQsIHVuc2lnbmVkKSk7Ci1zdGF0aWMgY2hhciAqIHBhcnNlX21lbSBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkICosIHVuc2lnbmVkICosIHVuc2lnbmVkKSk7Ci1zdGF0aWMgdm9pZCAgIGR1bXBfbGl0ZXJhbHMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIGNoZWNrX2xpdGVyYWxzIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX3NfdGV4dCAgICBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkICAgbWNvcmVfc19kYXRhICAgIFBBUkFNUyAoKGludCkpOwotI2lmZGVmIE9CSl9FTEYKLXN0YXRpYyB2b2lkICAgbWNvcmVfc19zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0KLS8qIFNldmVyYWwgcGxhY2VzIGluIHRoaXMgZmlsZSBpbnNlcnQgcmF3IGluc3RydWN0aW9ucyBpbnRvIHRoZQotICAgb2JqZWN0LiBUaGV5IHNob3VsZCB1c2UgTUNPUkVfSU5TVF9YWFggbWFjcm9zIHRvIGdldCB0aGUgb3Bjb2RlcwotICAgYW5kIHRoZW4gdXNlIHRoZXNlIHR3byBtYWNyb3MgdG8gY3JhY2sgdGhlIE1DT1JFX0lOU1QgdmFsdWUgaW50bwotICAgdGhlIGFwcHJvcHJpYXRlIGJ5dGUgdmFsdWVzLiAgKi8KLSNkZWZpbmUJSU5TVF9CWVRFMCh4KSAgKCgoeCkgPj4gOCkgJiAweEZGKQotI2RlZmluZQlJTlNUX0JZVEUxKHgpICAoKHgpICYgMHhGRikKLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIy8iOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjLyI7Ci0KLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gODsKLQotc3RhdGljIGludCBkb19qc3JpMmJzciA9IDA7CS8qIGNoYW5nZSBoZXJlIGZyb20gMSBieSBDcnVlc3MgMTkgQXVndXN0IDk3ICovCi1zdGF0aWMgaW50IHNpZmlsdGVyX21vZGUgPSAwOwotCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0jZGVmaW5lIEMod2hhdCxsZW5ndGgpICgoKHdoYXQpIDw8IDIpICsgKGxlbmd0aCkpCi0jZGVmaW5lIEdFVF9XSEFUKHgpICAgICgoeCA+PiAyKSkKLQotLyogVGhlc2UgYXJlIHRoZSB0d28gdHlwZXMgb2YgcmVsYXhhYmxlIGluc3RydWN0aW9uICovCi0jZGVmaW5lIENPTkRfSlVNUCAgMQotI2RlZmluZSBVTkNEX0pVTVAgIDIKLQotI2RlZmluZSBVTkRFRl9ESVNQICAgICAgMAotI2RlZmluZSBDT05EMTIgICAgICAgICAgMQotI2RlZmluZSBDT05EMzIgICAgICAgICAgMgotI2RlZmluZSBVTkNEMTIgICAgICAgICAgMQotI2RlZmluZSBVTkNEMzIgICAgICAgICAgMgotI2RlZmluZSBVTkRFRl9XT1JEX0RJU1AgNAotI2RlZmluZSBFTkQgICAgICAgICAgICAgNQotCi0jZGVmaW5lIEMxMl9MRU4JICAgICAgICAyCi0jZGVmaW5lIEMzMl9MRU4JICAgICAgIDEwCS8qIGFsbG93IGZvciBhbGlnbiAqLwotI2RlZmluZSBVMTJfTEVOCSAgICAgICAgMgotI2RlZmluZSBVMzJfTEVOCSAgICAgICAgOAkvKiBhbGxvdyBmb3IgYWxpZ24gKi8KLQotCi0vKiBJbml0aWFsaXplIHRoZSByZWxheCB0YWJsZSAqLwotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci17ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKiAwOiB1bnVzZWQgKi8gIAoteyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyogMTogdW51c2VkICovICAKLXsgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qIDI6IHVudXNlZCAqLyAgCi17ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKiAzOiB1bnVzZWQgKi8gIAoteyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyogNDogdW51c2VkICovICAKLXsgMjA0OCwgLTIwNDYsIEMxMl9MRU4sIEMoQ09ORF9KVU1QLCBDT05EMzIpIH0sCS8qIDU6IEMoQ09ORF9KVU1QLCBDT05EMTIpICovCi17ICAgIDAsICAgICAwLCBDMzJfTEVOLCAwIH0sCQkJLyogNjogQyhDT05EX0pVTVAsIENPTkQzMikgKi8KLXsgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qIDc6IHVudXNlZCAqLyAgCi17ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKiA4OiB1bnVzZWQgKi8gIAoteyAyMDQ4LCAtMjA0NiwgVTEyX0xFTiwgQyhVTkNEX0pVTVAsIFVOQ0QzMikgfSwJLyogOTogQyhVTkNEX0pVTVAsIFVOQ0QxMikgKi8KLXsgICAgMCwgICAgIDAsIFUzMl9MRU4sIDAgfSwJCQkvKjEwOiBDKFVOQ0RfSlVNUCwgVU5DRDMyKSAqLwoteyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyoxMTogdW51c2VkICovICAKLXsgICAgMCwgICAgIDAsCSAgICAgMCwgMCB9CQkJLyoxMjogdW51c2VkICovICAKLX07Ci0KLS8qIExJVEVSQUwgUE9PTCBEQVRBIFNUUlVDVFVSRVMgKi8KLXN0cnVjdCBsaXRlcmFsCi17Ci0gIHVuc2lnbmVkIHNob3J0ICByZWZjbnQ7Ci0gIHVuc2lnbmVkIGNoYXIJICBpc3BjcmVsOwotICB1bnNpZ25lZCBjaGFyCSAgdW51c2VkOwotICBleHByZXNzaW9uUwkgIGU7Ci19OwotCi0jZGVmaW5lIE1BWF9QT09MX1NJWkUJKDEwMjQvNCkKLXN0YXRpYyBzdHJ1Y3QgbGl0ZXJhbCBsaXRwb29sIFtNQVhfUE9PTF9TSVpFXTsKLXN0YXRpYyB1bnNpZ25lZCBwb29sc2l6ZTsKLXN0YXRpYyB1bnNpZ25lZCBwb29sbnVtYmVyOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcG9vbHNwYW47Ci0KLS8qIFNQQU5QQU5JQzogdGhlIHBvaW50IGF0IHdoaWNoIHdlIGdldCB0b28gc2NhcmVkIGFuZCBmb3JjZSBhIGR1bXAKLSAgIG9mIHRoZSBsaXRlcmFsIHBvb2wsIGFuZCBwZXJoYXBzIHB1dCBhIGJyYW5jaCBpbiBwbGFjZS4KLSAgIENhbGN1bGF0ZWQgYXM6Ci0gIAkJIDEwMjQJc3BhbiBvZiBscncvam1waS9qc3JpIGluc24gKGFjdHVhbGx5IHNwYW4rMSkKLSAgCQktMglwb3NzaWJsZSBhbGlnbm1lbnQgYXQgdGhlIGluc24uCi0gIAkJLTIJcG9zc2libGUgYWxpZ25tZW50IHRvIGdldCB0aGUgdGFibGUgYWxpZ25lZC4KLSAgCQktMglhbiBpbnNlcnRlZCBicmFuY2ggYXJvdW5kIHRoZSB0YWJsZS4KLSAgCSAgICAgPT0gMTAxOAotICAgYXQgMTAxOCwgd2UgbWlnaHQgYmUgaW4gdHJvdWJsZS4KLSAgIC0tIHNvIHdlIGhhdmUgdG8gYmUgc21hbGxlciB0aGFuIDEwMTggYW5kIHNpbmNlIHdlIGRlYWwgd2l0aCAyLWJ5dGUKLSAgIGluc3RydWN0aW9ucywgdGhlIG5leHQgZ29vZCBjaG9pY2UgaXMgMTAxNi4KLSAgIC0tIE5vdGUgd2UgaGF2ZSBhIHRlc3QgY2FzZSB0aGF0IGZhaWxzIHdoZW4gd2UndmUgZ290IDEwMTggaGVyZS4gICovCi0jZGVmaW5lIFNQQU5QQU5JQwkoMTAxNikJCS8qIDEwMjQgLSAxIGVudHJ5IC0gMiBieXRlIHJvdW5kaW5nICovCi0jZGVmaW5lIFNQQU5DTE9TRQkoOTAwKQotI2RlZmluZSBTUEFORVhJVAkoNjAwKQotc3RhdGljIHN5bWJvbFMgKiBwb29sc3ltOwkJLyogbGFiZWwgZm9yIGN1cnJlbnQgcG9vbCAqLwotc3RhdGljIGNoYXIgcG9vbG5hbWVbOF07Ci1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqIG9wY29kZV9oYXNoX2NvbnRyb2w7CS8qIE9wY29kZSBtbmVtb25pY3MgKi8KLQotLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLSAgICAgUHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgICAgRnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICAgIEludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uICAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgImV4cG9ydCIsICAgc19nbG9ibCwgICAgICAgICAgMCB9LAotICB7ICJpbXBvcnQiLCAgIHNfaWdub3JlLCAgICAgICAgIDAgfSwKLSAgeyAibGl0ZXJhbHMiLCBtY29yZV9zX2xpdGVyYWxzLCAwIH0sCi0gIHsgInBhZ2UiLCAgICAgbGlzdGluZ19lamVjdCwgICAgMCB9LAotICB7ICJic3MiLCAgICAgIHNfbGNvbW1fYnl0ZXMsICAgIDEgfSwKLQotICAvKiBUaGUgZm9sbG93aW5nIGFyZSB0byBpbnRlcmNlcHQgdGhlIHBsYWNlbWVudCBvZiBkYXRhIGludG8gdGhlIHRleHQKLSAgICAgc2VjdGlvbiAoZWcgYWRkcmVzc2VzIGZvciBhIHN3aXRjaCB0YWJsZSksIHNvIHRoYXQgdGhlIHNwYWNlIHRoZXkKLSAgICAgb2NjdXB5IGNhbiBiZSB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBkZWNpZGluZyB3aGV0aGVyIG9yIG5vdCB0bwotICAgICBkdW1wIHRoZSBjdXJyZW50IGxpdGVyYWwgcG9vbC4KLSAgICAgWFhYIC0gY3VycmVudGx5IHdlIGRvIG5vdCBjb3BlIHdpdGggdGhlIC5zcGFjZSBhbmQgLmRjYi5kIGRpcmVjdGl2ZXMuICAqLwotICB7ICJhc2NpaSIsICAgIG1jb3JlX3N0cmluZ2VyLCAgICAgICAwIH0sCi0gIHsgImFzY2l6IiwgICAgbWNvcmVfc3RyaW5nZXIsICAgICAgIDEgfSwKLSAgeyAiYnl0ZSIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgMSB9LAotICB7ICJkYyIsICAgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICAyIH0sCi0gIHsgImRjLmIiLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDEgfSwKLSAgeyAiZGMuZCIsICAgICBtY29yZV9mbG9hdF9jb25zLCAgICAnZCcgfSwKLSAgeyAiZGMubCIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgNCB9LAotICB7ICJkYy5zIiwgICAgIG1jb3JlX2Zsb2F0X2NvbnMsICAgICdmJyB9LAotICB7ICJkYy53IiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICAyIH0sCi0gIHsgImRjLngiLCAgICAgbWNvcmVfZmxvYXRfY29ucywgICAgJ3gnIH0sCi0gIHsgImRvdWJsZSIsICAgbWNvcmVfZmxvYXRfY29ucywgICAgJ2QnfSwKLSAgeyAiZmxvYXQiLCAgICBtY29yZV9mbG9hdF9jb25zLCAgICAnZid9LAotICB7ICJod29yZCIsICAgIG1jb3JlX2NvbnMsICAgICAgICAgICAyIH0sCi0gIHsgImludCIsICAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDQgfSwKLSAgeyAibG9uZyIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgNCB9LAotICB7ICJvY3RhIiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgIDE2IH0sCi0gIHsgInF1YWQiLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDggfSwKLSAgeyAic2hvcnQiLCAgICBtY29yZV9jb25zLCAgICAgICAgICAgMiB9LAotICB7ICJzaW5nbGUiLCAgIG1jb3JlX2Zsb2F0X2NvbnMsICAgICdmJ30sCi0gIHsgInN0cmluZyIsICAgbWNvcmVfc3RyaW5nZXIsICAgICAgIDEgfSwKLSAgeyAid29yZCIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgMiB9LAotCi0gIC8qIEFsbG93IGZvciB0aGUgZWZmZWN0IG9mIHNlY3Rpb24gY2hhbmdlcy4gICovCi0gIHsgInRleHQiLCAgICAgIG1jb3JlX3NfdGV4dCwgICAgMCB9LAotICB7ICJkYXRhIiwgICAgICBtY29yZV9zX2RhdGEsICAgIDAgfSwKLSAgCi0jaWZkZWYgT0JKX0VMRgotICB7ICJzZWN0aW9uIiwgICBtY29yZV9zX3NlY3Rpb24sIDAgfSwKLSAgeyAic2VjdGlvbi5zIiwgbWNvcmVfc19zZWN0aW9uLCAwIH0sCi0gIHsgInNlY3QiLCAgICAgIG1jb3JlX3Nfc2VjdGlvbiwgMCB9LAotICB7ICJzZWN0LnMiLCAgICBtY29yZV9zX3NlY3Rpb24sIDAgfSwKLSNlbmRpZiAgCi0gIHsgMCwgICAgICAgICAgMCwgICAgICAgICAgICAgICAgMCB9Ci19OwotCi1zdGF0aWMgdm9pZAotbWNvcmVfc19saXRlcmFscyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBkdW1wX2xpdGVyYWxzICgwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotbWNvcmVfY29ucyAobmJ5dGVzKQotICAgICBpbnQgbmJ5dGVzOwotewotICBpZiAobm93X3NlZyA9PSB0ZXh0X3NlY3Rpb24pCi0gICAgewotICAgICAgY2hhciAqIHB0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGludCAgICBjb21tYXMgPSAxOwotICAgICAgCi0gICAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGNvbW1hcyBvbiB0aGUgbGluZS4gICovCi0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZSBbKiBwdHJdKQotCWNvbW1hcyArPSAqIHB0ciArKyA9PSAnLCc7Ci0gICAgICAKLSAgICAgIHBvb2xzcGFuICs9IG5ieXRlcyAqIGNvbW1hczsKLSAgICB9Ci0gIAotICBjb25zIChuYnl0ZXMpOwotCi0gIC8qIEluIHRoZW9yeSB3ZSBvdWdodCB0byBjYWxsIGNoZWNrX2xpdGVyYWxzICgyLDApIGhlcmUgaW4gY2FzZQotICAgICB3ZSBuZWVkIHRvIGR1bXAgdGhlIGxpdGVyYWwgdGFibGUuICBXZSBjYW5ub3QgZG8gdGhpcyBob3dldmVyLAotICAgICBhcyB0aGUgZGlyZWN0aXZlcyB0aGF0IHdlIGFyZSBpbnRlcmNlcHRpbmcgbWF5IGJlIGJlaW5nIHVzZWQKLSAgICAgdG8gYnVpbGQgYSBzd2l0Y2ggdGFibGUsIGFuZCB3ZSBtdXN0IG5vdCBpbnRlcmZlcmUgd2l0aCBpdHMKLSAgICAgY29udGVudHMuICBJbnN0ZWFkIHdlIGNyb3NzIG91ciBmaW5nZXJzIGFuZCBwcmF5Li4uICovCi19Ci0KLXN0YXRpYyB2b2lkCi1tY29yZV9mbG9hdF9jb25zIChmbG9hdF90eXBlKQotICAgICBpbnQgZmxvYXRfdHlwZTsKLXsKLSAgaWYgKG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGNoYXIgKiBwdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnQgICAgY29tbWFzID0gMTsKLQotI2lmZGVmIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TCi0jZXJyb3IgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMgbm90IGhhbmRsZWQKLSNlbmRpZgotICAgICAgCi0gICAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGNvbW1hcyBvbiB0aGUgbGluZS4gICovCi0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZSBbKiBwdHJdKQotCWNvbW1hcyArPSAqIHB0ciArKyA9PSAnLCc7Ci0KLSAgICAgIC8qIFdlIHdvdWxkIGxpa2UgdG8gY29tcHV0ZSAiaGV4X2Zsb2F0IChmbG9hdF90eXBlKSAqIGNvbW1hcyIKLQkgYnV0IGhleF9mbG9hdCBpcyBub3QgZXhwb3J0ZWQgZnJvbSByZWFkLmMgICovCi0gICAgICBmbG9hdF90eXBlID09ICdmJyA/IDQgOiAoZmxvYXRfdHlwZSA9PSAnZCcgPyA4IDogMTIpOwotICAgICAgcG9vbHNwYW4gKz0gZmxvYXRfdHlwZSAqIGNvbW1hczsKLSAgICB9Ci0KLSAgZmxvYXRfY29ucyAoZmxvYXRfdHlwZSk7Ci0gIAotICAvKiBTZWUgdGhlIGNvbW1lbnQgaW4gbWNvcmVfY29ucyAoKSBhYm91dCBjYWxsaW5nIGNoZWNrX2xpdGVyYWxzLgotICAgICBJdCBpcyB1bmxpa2VseSB0aGF0IGEgc3dpdGNoIHRhYmxlIHdpbGwgYmUgY29uc3RydWN0ZWQgdXNpbmcKLSAgICAgZmxvYXRpbmcgcG9pbnQgdmFsdWVzLCBidXQgaXQgaXMgc3RpbGwgbGlrZWx5IHRoYXQgYW4gaW5kZXhlZAotICAgICB0YWJsZSBvZiBmbG9hdGluZyBwb2ludCBjb25zdGFudHMgaXMgYmVpbmcgY3JlYXRlZCBieSB0aGVzZQotICAgICBkaXJlY3RpdmVzLCBzbyBhZ2FpbiB3ZSBtdXN0IG5vdCBpbnRlcmZlcmUgd2l0aCB0aGVpciBwbGFjZW1lbnQuICAqLwotfQotCi1zdGF0aWMgdm9pZAotbWNvcmVfc3RyaW5nZXIgKGFwcGVuZF96ZXJvKQotICAgICBpbnQgYXBwZW5kX3plcm87Ci17Ci0gIGlmIChub3dfc2VnID09IHRleHRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBjaGFyICogcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgCi0gICAgICAvKiBJbiB0aGVvcnkgd2Ugc2hvdWxkIGNvbXB1dGUgaG93IG1hbnkgYnl0ZXMgYXJlIGdvaW5nIHRvCi0JIGJlIG9jY3VwaWVkIGJ5IHRoZSBzdHJpbmcocykgYW5kIGFkZCB0aGlzIHRvIHRoZSBwb29sc3Bhbi4KLQkgVG8ga2VlcCB0aGluZ3Mgc2ltcGxlIGhvd2V2ZXIsIHdlIGp1c3QgYWRkIHRoZSBudW1iZXIgb2YKLQkgYnl0ZXMgbGVmdCBvbiB0aGUgY3VycmVudCBsaW5lLiAgVGhpcyB3aWxsIGJlIGFuIG92ZXItCi0JIGVzdGltYXRlLCB3aGljaCBpcyBPSywgYW5kIGF1dG9tYXRpY2FsbHkgYWxsb3dzIGZvciB0aGUKLQkgYXBwZW5kaW5nIGEgemVybyBieXRlLCBzaW5jZSB0aGUgcmVhbCBzdHJpbmcocykgaXMvYXJlCi0JIHJlcXVpcmVkIHRvIGJlIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMuICAqLwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmUgWyogcHRyXSkKLQlwdHIgKys7Ci0KLSAgICAgIHBvb2xzcGFuICs9IHB0ciAtIGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIAotICBzdHJpbmdlciAoYXBwZW5kX3plcm8pOwotCi0gIC8qIFdlIGNhbGwgY2hlY2tfbGl0ZXJhbHMgaGVyZSBpbiBjYXNlIGEgbGFyZ2UgbnVtYmVyIG9mIHN0cmluZ3MgYXJlCi0gICAgIGJlaW5nIHBsYWNlZCBpbnRvIHRoZSB0ZXh0IHNlY3Rpb24gd2l0aCBhIHNlcXVlbmNlIG9mIHN0cmluZ2VyCi0gICAgIGRpcmVjdGl2ZXMuICBJbiB0aGVvcnkgd2UgY291bGQgYmUgdXBzZXR0aW5nIHNvbWV0aGluZyBpZiB0aGVzZQotICAgICBzdHJpbmdzIGFyZSBhY3R1YWxseSBpbiBhbiBpbmRleGVkIHRhYmxlIGluc3RlYWQgb2YgcmVmZXJlbmNlZCBieQotICAgICBpbmRpdmlkdWFsIGxhYmVscy4gIExldCB1cyBob3BlIHRoYXQgdGhhdCBuZXZlciBoYXBwZW5zLiAgKi8KLSAgY2hlY2tfbGl0ZXJhbHMgKDIsIDApOwotfQotCi1zdGF0aWMgdm9pZAotbWNvcmVfc190ZXh0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGR1bXBfbGl0ZXJhbHMgKDApOwotICAKLSAgc190ZXh0IChpZ25vcmUpOwotfQotCi1zdGF0aWMgdm9pZAotbWNvcmVfc19kYXRhIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGR1bXBfbGl0ZXJhbHMgKDApOwotICAKLSAgc19kYXRhIChpZ25vcmUpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgVGhpcyBzaG91bGQKLSAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMgdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIG5lZWRzLiAgKi8KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIG1jb3JlX29wY29kZV9pbmZvICogb3Bjb2RlOwotICBjaGFyICogcHJldl9uYW1lID0gIiI7Ci0KLSAgb3Bjb2RlX2hhc2hfY29udHJvbCA9IGhhc2hfbmV3ICgpOwotCi0gIC8qIEluc2VydCB1bmlxdWUgbmFtZXMgaW50byBoYXNoIHRhYmxlICovCi0gIGZvciAob3Bjb2RlID0gbWNvcmVfdGFibGU7IG9wY29kZS0+bmFtZTsgb3Bjb2RlICsrKQotICAgIHsKLSAgICAgIGlmIChzdHJlcSAocHJldl9uYW1lLCBvcGNvZGUtPm5hbWUpKQotCXsKLQkgIC8qIE1ha2UgYWxsIHRoZSBvcGNvZGVzIHdpdGggdGhlIHNhbWUgbmFtZSBwb2ludCB0byB0aGUgc2FtZQotCSAgICAgc3RyaW5nLiAgKi8KLQkgIG9wY29kZS0+bmFtZSA9IHByZXZfbmFtZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJldl9uYW1lID0gb3Bjb2RlLT5uYW1lOwotCSAgaGFzaF9pbnNlcnQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG9wY29kZS0+bmFtZSwgKGNoYXIgKikgb3Bjb2RlKTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IHJlZ19tOwotc3RhdGljIGludCByZWdfbjsKLXN0YXRpYyBleHByZXNzaW9uUyBpbW1lZGlhdGU7CS8qIGFic29sdXRlIGV4cHJlc3Npb24gKi8KLQotLyogR2V0IGEgbG9nMih2YWwpLiAgKi8KLXN0YXRpYyBpbnQKLWxvZzIgKHZhbCkKLSAgICB1bnNpZ25lZCBpbnQgdmFsOwotewotICAgIGludCBsb2cgPSAtMTsKLSAgICB3aGlsZSAodmFsICE9IDApCi0gICAgICB7Ci0gICAgICAgIGxvZyArKzsKLSAgICAgICAgdmFsID4+PSAxOwotICAgICAgfQotICAgIAotICAgIHJldHVybiBsb2c7Ci19Ci0KLS8qIFRyeSB0byBwYXJzZSBhIHJlZyBuYW1lLiAgKi8KLXN0YXRpYyBjaGFyICoKLXBhcnNlX3JlZyAocywgcmVnKQotICAgICBjaGFyICogczsKLSAgICAgdW5zaWduZWQgKiByZWc7Ci17Ci0gIC8qIFN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZS4gICovCi0gIHdoaWxlIChpc3NwYWNlICgqIHMpKQotICAgICsrIHM7Ci0gIAotICBpZiAodG9sb3dlciAoc1swXSkgPT0gJ3InKQotICAgIHsKLSAgICAgIGlmIChzWzFdID09ICcxJyAmJiBzWzJdID49ICcwJyAmJiBzWzJdIDw9ICc1JykKLQl7Ci0JICAqcmVnID0gMTAgKyBzWzJdIC0gJzAnOwotCSAgcmV0dXJuIHMgKyAzOwotCX0KLSAgICAgIAotICAgICAgaWYgKHNbMV0gPj0gJzAnICYmIHNbMV0gPD0gJzknKQotCXsKLQkgICpyZWcgPSBzWzFdIC0gJzAnOwotCSAgcmV0dXJuIHMgKyAyOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKCAgIHRvbG93ZXIgKHNbMF0pID09ICdzJwotCSAgICYmIHRvbG93ZXIgKHNbMV0pID09ICdwJwotCSAgICYmICEgaXNhbG51bSAoc1syXSkpCi0gICAgewotICAgICAgKiByZWcgPSAwOwotICAgICAgcmV0dXJuIHMgKyAyOwotICAgIH0KLSAgCi0gIGFzX2JhZCAoXygicmVnaXN0ZXIgZXhwZWN0ZWQsIGJ1dCBzYXcgJyUuNnMnIiksIHMpOwotICByZXR1cm4gczsKLX0KLQotc3RhdGljIHN0cnVjdCBDcmVncwotewotICBjaGFyICogbmFtZTsKLSAgdW5zaWduZWQgaW50IGNybnVtOwotfQotY3JlZ3NbXSA9Ci17Ci0gIHsgInBzciIsCSAwfSwKLSAgeyAidmJyIiwJIDF9LAotICB7ICJlcHNyIiwJIDJ9LAotICB7ICJmcHNyIiwJIDN9LAotICB7ICJlcGMiLAkgNH0sCi0gIHsgImZwYyIsCSA1fSwKLSAgeyAic3MwIiwJIDZ9LAotICB7ICJzczEiLAkgN30sCi0gIHsgInNzMiIsCSA4fSwKLSAgeyAic3MzIiwJIDl9LAotICB7ICJzczQiLAkxMH0sCi0gIHsgImdjciIsCTExfSwKLSAgeyAiZ3NyIiwJMTJ9LAotICB7ICIiLAkJIDB9Ci19OwotCi1zdGF0aWMgY2hhciAqCi1wYXJzZV9jcmVnIChzLCByZWcpCi0gICAgIGNoYXIgKiBzOwotICAgICB1bnNpZ25lZCAqIHJlZzsKLXsKLSAgaW50IGk7Ci0KLSAgLyogU3RyaXAgbGVhZGluZyB3aGl0ZXNwYWNlLiAgKi8KLSAgd2hpbGUgKGlzc3BhY2UgKCogcykpCi0gICAgKytzOwotICAKLSAgaWYgKCh0b2xvd2VyIChzWzBdKSA9PSAnYycgJiYgdG9sb3dlciAoc1sxXSkgPT0gJ3InKSkKLSAgICB7Ci0gICAgICBpZiAoc1syXSA9PSAnMycgJiYgc1szXSA+PSAnMCcgJiYgc1szXSA8PSAnMScpCi0JewotCSAgKnJlZyA9IDMwICsgc1szXSAtICcwJzsKLQkgIHJldHVybiBzICsgNDsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChzWzJdID09ICcyJyAmJiBzWzNdID49ICcwJyAmJiBzWzNdIDw9ICc5JykKLQl7Ci0JICAqcmVnID0gMjAgKyBzWzNdIC0gJzAnOwotCSAgcmV0dXJuIHMgKyA0OwotCX0KLSAgICAgIAotICAgICAgaWYgKHNbMl0gPT0gJzEnICYmIHNbM10gPj0gJzAnICYmIHNbM10gPD0gJzknKQotCXsKLQkgICpyZWcgPSAxMCArIHNbM10gLSAnMCc7Ci0JICByZXR1cm4gcyArIDQ7Ci0JfQotICAgICAgCi0gICAgICBpZiAoc1syXSA+PSAnMCcgJiYgc1syXSA8PSAnOScpCi0JewotCSAgKnJlZyA9IHNbMl0gLSAnMCc7Ci0JICByZXR1cm4gcyArIDM7Ci0JfQotICAgIH0KLSAgCi0gIC8qIExvb2sgYXQgYWx0ZXJuYXRlIGNyZWcgbmFtZXMgYmVmb3JlIGdpdmluZyBlcnJvci4gICovCi0gIGZvciAoaSA9IDA7IGNyZWdzW2ldLm5hbWVbMF0gIT0gJ1wwJzsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgYnVmIFsxMF07Ci0gICAgICBpbnQgIGxlbmd0aDsKLSAgICAgIGludCAgajsKLSAgICAgIAotICAgICAgbGVuZ3RoID0gc3RybGVuIChjcmVnc1tpXS5uYW1lKTsKLSAgICAgIAotICAgICAgZm9yIChqID0gMDsgaiA8IGxlbmd0aDsgaisrKQotCWJ1ZltqXSA9IHRvbG93ZXIgKHNbal0pOwotICAgICAgCi0gICAgICBpZiAoc3RybmNtcCAoY3JlZ3NbaV0ubmFtZSwgYnVmLCBsZW5ndGgpID09IDApCi0JewotCSAgKnJlZyA9IGNyZWdzW2ldLmNybnVtOwotCSAgcmV0dXJuIHMgKyBsZW5ndGg7Ci0JfQotICAgIH0KLSAgCi0gIGFzX2JhZCAoXygiY29udHJvbCByZWdpc3RlciBleHBlY3RlZCwgYnV0IHNhdyAnJS42cyciKSwgcyk7Ci0gIAotICByZXR1cm4gczsKLX0KLQotc3RhdGljIGNoYXIgKgotcGFyc2VfZXhwIChzLCBlKQotICAgICBjaGFyICogczsKLSAgICAgZXhwcmVzc2lvblMgKiBlOwotewotICBjaGFyICogc2F2ZTsKLSAgY2hhciAqIG5ldzsKLQotICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICB3aGlsZSAoaXNzcGFjZSAoKiBzKSkKLSAgICArKyBzOwotICAKLSAgc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLQotICBleHByZXNzaW9uIChlKTsKLSAgCi0gIGlmIChlLT5YX29wID09IE9fYWJzZW50KQotICAgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotICAKLSAgbmV3ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICAKLSAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIHZvaWQKLW1ha2VfbmFtZSAocywgcCwgbikKLSAgICAgY2hhciAqIHM7Ci0gICAgIGNoYXIgKiBwOwotICAgICBpbnQgbjsKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgaGV4W10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Ci0KLSAgc1swXSA9IHBbMF07Ci0gIHNbMV0gPSBwWzFdOwotICBzWzJdID0gcFsyXTsKLSAgc1szXSA9IGhleFsobiA+PiAxMikgJiAweEZdOwotICBzWzRdID0gaGV4WyhuID4+ICA4KSAmIDB4Rl07Ci0gIHNbNV0gPSBoZXhbKG4gPj4gIDQpICYgMHhGXTsKLSAgc1s2XSA9IGhleFsobikgICAgICAgJiAweEZdOwotICBzWzddID0gMDsKLX0KLQotI2RlZmluZSBQT09MX0VORF9MQUJFTCAgICIuTEUiCi0jZGVmaW5lIFBPT0xfU1RBUlRfTEFCRUwgIi5MUyIKLQotc3RhdGljIHZvaWQKLWR1bXBfbGl0ZXJhbHMgKGlzZm9yY2UpCi0gICAgIGludCBpc2ZvcmNlOwotewotICBpbnQgaTsKLSAgc3RydWN0IGxpdGVyYWwgKiBwOwotICBzdHJ1Y3Qgc3ltYm9sICogYnJhcnN5bTsKLSAgCi0gIGlmIChwb29sc2l6ZSA9PSAwKQotICAgIHJldHVybjsKLQotICAvKiBNdXN0IHdlIGJyYW5jaCBhcm91bmQgdGhlIGxpdGVyYWwgdGFibGU/ICovCi0gIGlmIChpc2ZvcmNlKQotICAgIHsKLSAgICAgIGNoYXIgKiBvdXRwdXQ7Ci0gICAgICBjaGFyIGJyYXJuYW1lWzhdOwotICAgICAgCi0gICAgICBtYWtlX25hbWUgKGJyYXJuYW1lLCBQT09MX0VORF9MQUJFTCwgcG9vbG51bWJlcik7Ci0gICAgICAKLSAgICAgIGJyYXJzeW0gPSBzeW1ib2xfbWFrZSAoYnJhcm5hbWUpOwotICAgICAgCi0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChicmFyc3ltKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQkJIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDMyKV0ucmx4X2xlbmd0aCwKLQkJCSBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QxMildLnJseF9sZW5ndGgsCi0JCQkgQyAoVU5DRF9KVU1QLCAwKSwgYnJhcnN5bSwgMCwgMCk7Ci0gICAgICBvdXRwdXRbMF0gPSBJTlNUX0JZVEUwIChNQ09SRV9JTlNUX0JSKTsJLyogYnIgLit4eHggKi8KLSAgICAgIG91dHB1dFsxXSA9IElOU1RfQllURTEgKE1DT1JFX0lOU1RfQlIpOwotICAgIH0KLSAgICAgIAotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc2VjdGlvbiBpcyBzdWZmaWNpZW50bHkgYWxpZ25lZCBhbmQgdGhhdAotICAgICB0aGUgbGl0ZXJhbCB0YWJsZSBpcyBhbGlnbmVkIHdpdGhpbiBpdC4gICovCi0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDIpOwotICBmcmFnX2FsaWduICgyLCAwLCAwKTsKLSAgCi0gIGNvbG9uIChTX0dFVF9OQU1FIChwb29sc3ltKSk7Ci0gIAotICBmb3IgKGkgPSAwLCBwID0gbGl0cG9vbDsgaSA8IHBvb2xzaXplOyBpKyssIHArKykKLSAgICBlbWl0X2V4cHIgKCYgcC0+ZSwgNCk7Ci0gIAotICBpZiAoaXNmb3JjZSkKLSAgICBjb2xvbiAoU19HRVRfTkFNRSAoYnJhcnN5bSkpOwotICAKLSAgIHBvb2xzaXplID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLWNoZWNrX2xpdGVyYWxzIChraW5kLCBvZmZzZXQpCi0gICAgIGludCBraW5kOwotICAgICBpbnQgb2Zmc2V0OwotewotICBwb29sc3BhbiArPSBvZmZzZXQ7Ci0gICAgCi0gIC8qIFNQQU5DTE9TRSBhbmQgU1BBTkVYSVQgYXJlIHNtYWxsZXIgbnVtYmVycyB0aGFuIFNQQU5QQU5JQy4KLSAgICAgU1BBTlBBTklDIG1lYW5zIHRoYXQgd2UgbXVzdCBkdW1wIG5vdy4KLSAgICAga2luZCA9PSAwIGlzIGFueSBvbGQgaW5zdHJ1Y3Rpb24uCi0gICAgIGtpbmQgID4gMCBtZWFucyB3ZSBqdXN0IGhhZCBhIGNvbnRyb2wgdHJhbnNmZXIgaW5zdHJ1Y3Rpb24uCi0gICAgIGtpbmQgPT0gMSBtZWFucyB3aXRoaW4gYSBmdW5jdGlvbgotICAgICBraW5kID09IDIgbWVhbnMgd2UganVzdCBsZWZ0IGEgZnVuY3Rpb24KLSAgICAKLSAgICAgVGhlIGR1bXBfbGl0ZXJhbHMgKDEpIGNhbGwgaW5zZXJ0cyBhIGJyYW5jaCBhcm91bmQgdGhlIHRhYmxlLCBzbwotICAgICB3ZSBmaXJzdCBsb29rIHRvIHNlZSBpZiBpdHMgYSBzaXR1YXRpb24gd2hlcmUgd2Ugd29uJ3QgaGF2ZSB0bwotICAgICBpbnNlcnQgYSBicmFuY2ggKGUuZy4sIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgYW4gdW5jb25kaXRpb25hbAotICAgICBicmFuY2gpLgotICAgIAotICAgICBTUEFOUEFOSUMgaXMgdGhlIHBvaW50IHdoZXJlIHdlIG11c3QgZHVtcCBhIHNpbmdsZS1lbnRyeSBwb29sLgotICAgICBpdCBhY2NvdW50cyBmb3IgYWxpZ25tZW50cyBhbmQgYW4gaW5zZXJ0ZWQgYnJhbmNoLgotICAgICB0aGUgJ3Bvb2xzaXplKjInIGFjY291bnRzIGZvciB0aGUgc2NlbmFyaW8gd2hlcmUgd2UgZG86Ci0gICAgICAgbHJ3IHIxLGxpdDE7IGxydyByMixsaXQyOyBscncgcjMsbGl0MwotICAgICBOb3RlIHRoYXQgdGhlICdsaXQyJyByZWZlcmVuY2UgaXMgMiBieXRlcyBmdXJ0aGVyIGFsb25nCi0gICAgIGJ1dCB0aGUgbGl0ZXJhbCBpdCByZWZlcmVuY2VzIHdpbGwgYmUgNCBieXRlcyBmdXJ0aGVyIGFsb25nLAotICAgICBzbyB3ZSBtdXN0IGNvbnNpZGVyIHRoZSBwb29sc2l6ZSBpbnRvIHRoaXMgZXF1YXRpb24uCi0gICAgIFRoaXMgaXMgc2xpZ2h0bHkgb3Zlci1jYXV0aW91cywgYnV0IGd1YXJhbnRlZXMgdGhhdCB3ZSB3b24ndAotICAgICBwYW5pYyBiZWNhdXNlIGEgcmVsb2NhdGlvbiBpcyB0b28gZGlzdGFudC4gICovCi0gIAotICBpZiAocG9vbHNwYW4gPiBTUEFOQ0xPU0UgJiYga2luZCA+IDApCi0gICAgZHVtcF9saXRlcmFscyAoMCk7Ci0gIGVsc2UgaWYgKHBvb2xzcGFuID4gU1BBTkVYSVQgJiYga2luZCA+IDEpCi0gICAgZHVtcF9saXRlcmFscyAoMCk7Ci0gIGVsc2UgaWYgKHBvb2xzcGFuID49IChTUEFOUEFOSUMgLSBwb29sc2l6ZSAqIDIpKQotICAgIGR1bXBfbGl0ZXJhbHMgKDEpOwotfQotCi1zdGF0aWMgaW50Ci1lbnRlcl9saXRlcmFsIChlLCBpc3BjcmVsKQotICAgICBleHByZXNzaW9uUyAqIGU7Ci0gICAgIGludCBpc3BjcmVsOwotewotICBpbnQgaTsKLSAgc3RydWN0IGxpdGVyYWwgKiBwOwotCi0gIGlmIChwb29sc2l6ZSA+PSBNQVhfUE9PTF9TSVpFIC0gMikKLSAgICB7Ci0gICAgICAvKiBUaGUgbGl0ZXJhbCBwb29sIGlzIGFzIGZ1bGwgYXMgd2UgY2FuIGhhbmRsZS4gV2UgaGF2ZQotICAgICAgICAgdG8gYmUgMiBlbnRyaWVzIHNoeSBvZiB0aGUgMTAyNC80PTI1NiBlbnRyaWVzIGJlY2F1c2Ugd2UKLSAgICAgICAgIGhhdmUgdG8gYWxsb3cgZm9yIHRoZSBicmFuY2ggKDIgYnl0ZXMpIGFuZCB0aGUgYWxpZ25tZW50Ci0gICAgICAgICAoMiBieXRlcyBiZWZvcmUgdGhlIGZpcnN0IGluc24gcmVmZXJlbmNpbmcgdGhlIHBvb2wgYW5kCi0gICAgICAgICAyIGJ5dGVzIGJlZm9yZSB0aGUgcG9vbCBpdHNlbGYpID09IDYgYnl0ZXMsIHJvdW5kcyB1cAotICAgICAgICAgdG8gMiBlbnRyaWVzLiAgKi8gCi0gICAgICBkdW1wX2xpdGVyYWxzICgxKTsKLSAgICB9Ci0KLSAgaWYgKHBvb2xzaXplID09IDApCi0gICAgewotICAgICAgLyogQ3JlYXRlIG5ldyBsaXRlcmFsIHBvb2wuICAqLwotICAgICAgaWYgKCsrIHBvb2xudW1iZXIgPiAweEZGRkYpCi0JYXNfZmF0YWwgKF8oIm1vcmUgdGhhbiA2NUsgbGl0ZXJhbCBwb29scyIpKTsKLSAgICAgIAotICAgICAgbWFrZV9uYW1lIChwb29sbmFtZSwgUE9PTF9TVEFSVF9MQUJFTCwgcG9vbG51bWJlcik7Ci0gICAgICBwb29sc3ltID0gc3ltYm9sX21ha2UgKHBvb2xuYW1lKTsKLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHBvb2xzeW0pOwotICAgICAgcG9vbHNwYW4gPSAwOwotICAgIH0KLSAgCi0gIC8qIFNlYXJjaCBwb29sIGZvciB2YWx1ZSBzbyB3ZSBkb24ndCBoYXZlIGR1cGxpY2F0ZXMuICAqLwotICBmb3IgKHAgPSBsaXRwb29sLCBpID0gMDsgaSA8IHBvb2xzaXplOyBpKyssIHArKykKLSAgICB7Ci0gICAgICBpZiAoZS0+WF9vcCA9PSBwLT5lLlhfb3AKLQkgICYmIGUtPlhfYWRkX3N5bWJvbCA9PSBwLT5lLlhfYWRkX3N5bWJvbAotCSAgJiYgZS0+WF9hZGRfbnVtYmVyID09IHAtPmUuWF9hZGRfbnVtYmVyCi0JICAmJiBpc3BjcmVsID09IHAtPmlzcGNyZWwpCi0JewotCSAgcC0+cmVmY250ICsrOwotCSAgcmV0dXJuIGk7Ci0JfQotICAgIH0KLQotICBwLT5yZWZjbnQgID0gMTsKLSAgcC0+aXNwY3JlbCA9IGlzcGNyZWw7Ci0gIHAtPmUgICAgICAgPSAqIGU7Ci0gIAotICBwb29sc2l6ZSArKzsKLQotICByZXR1cm4gaTsgICAKLX0KLQotLyogUGFyc2UgYSBsaXRlcmFsIHNwZWNpZmljYXRpb24uIC0tIGVpdGhlciBuZXcgb3Igb2xkIHN5bnRheC4KLSAgIG9sZCBzeW50YXg6IHRoZSB1c2VyIHN1cHBsaWVzIHRoZSBsYWJlbCBhbmQgcGxhY2VzIHRoZSBsaXRlcmFsLgotICAgbmV3IHN5bnRheDogd2UgcHV0IGl0IGludG8gdGhlIGxpdGVyYWwgcG9vbC4gICovCi1zdGF0aWMgY2hhciAqCi1wYXJzZV9ydCAocywgb3V0cHV0cCwgaXNwY3JlbCwgZXApCi0gICAgIGNoYXIgKiBzOwotICAgICBjaGFyICoqIG91dHB1dHA7Ci0gICAgIGludCBpc3BjcmVsOwotICAgICBleHByZXNzaW9uUyAqIGVwOwotewotICBleHByZXNzaW9uUyBlOwotICBpbnQgbjsKLSAgCi0gIGlmIChlcCkKLSAgICAvKiBJbmRpY2F0ZSBub3RoaW5nIHRoZXJlLiAgKi8KLSAgICBlcC0+WF9vcCA9IE9fYWJzZW50OwotICAKLSAgaWYgKCpzID09ICdbJykKLSAgICB7Ci0gICAgICBzID0gcGFyc2VfZXhwIChzICsgMSwgJiBlKTsKLSAgICAgIAotICAgICAgaWYgKCpzID09ICddJykKLQlzKys7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJtaXNzaW5nICddJyIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzID0gcGFyc2VfZXhwIChzLCAmIGUpOwotICAgICAgCi0gICAgICBuID0gZW50ZXJfbGl0ZXJhbCAoJiBlLCBpc3BjcmVsKTsKLSAgICAgIAotICAgICAgaWYgKGVwKQotCSplcCA9IGU7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIHJlZmVyZW5jZSB0byBwb29sIGVudHJ5LiAgKi8KLSAgICAgIGUuWF9vcCAgICAgICAgID0gT19zeW1ib2w7Ci0gICAgICBlLlhfYWRkX3N5bWJvbCA9IHBvb2xzeW07Ci0gICAgICBlLlhfYWRkX251bWJlciA9IG4gPDwgMjsKLSAgICB9Ci0gIAotICAqIG91dHB1dHAgPSBmcmFnX21vcmUgKDIpOwotCi0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywgKCpvdXRwdXRwKSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAyLCAmIGUsIDEsCi0JICAgICAgIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0KTsKLQotICByZXR1cm4gczsKLX0KLQotc3RhdGljIGNoYXIgKgotcGFyc2VfaW1tIChzLCB2YWwsIG1pbiwgbWF4KQotICAgICBjaGFyICogczsKLSAgICAgdW5zaWduZWQgKiB2YWw7Ci0gICAgIHVuc2lnbmVkIG1pbjsKLSAgICAgdW5zaWduZWQgbWF4OwotewotICBjaGFyICogbmV3OwotICBleHByZXNzaW9uUyBlOwotICAKLSAgbmV3ID0gcGFyc2VfZXhwIChzLCAmIGUpOwotICAKLSAgaWYgKGUuWF9vcCA9PSBPX2Fic2VudCkKLSAgICA7IC8qIEFuIGVycm9yIG1lc3NhZ2UgaGFzIGFscmVhZHkgYmVlbiBlbWl0dGVkLiAgKi8KLSAgZWxzZSBpZiAoZS5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgYXNfYmFkIChfKCJvcGVyYW5kIG11c3QgYmUgYSBjb25zdGFudCIpKTsKLSAgZWxzZSBpZiAoZS5YX2FkZF9udW1iZXIgPCBtaW4gfHwgZS5YX2FkZF9udW1iZXIgPiBtYXgpCi0gICAgYXNfYmFkIChfKCJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkLCBub3QgJWQiKSwKLQkgICAgbWluLCBtYXgsIGUuWF9hZGRfbnVtYmVyKTsKLQotICAqIHZhbCA9IGUuWF9hZGRfbnVtYmVyOwotICAKLSAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGNoYXIgKgotcGFyc2VfbWVtIChzLCByZWcsIG9mZiwgc2l6KQotICAgICBjaGFyICogczsKLSAgICAgdW5zaWduZWQgKiByZWc7Ci0gICAgIHVuc2lnbmVkICogb2ZmOwotICAgICB1bnNpZ25lZCBzaXo7Ci17Ci0gIGNoYXIgKiBuZXc7Ci0KLSAgKiBvZmYgPSAwOwotICAKLSAgd2hpbGUgKGlzc3BhY2UgKCogcykpCi0gICAgKysgczsKLSAgICAgIAotICBpZiAoKiBzID09ICcoJykKLSAgICB7Ci0gICAgICBzID0gcGFyc2VfcmVnIChzICsgMSwgcmVnKTsKLQotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogcykpCi0JKysgczsKLSAgICAgIAotICAgICAgaWYgKCogcyA9PSAnLCcpCi0JewotCSAgcyA9IHBhcnNlX2ltbSAocyArIDEsIG9mZiwgMCwgNjMpOwotCSAgCi0JICBpZiAoc2l6ID4gMSkKLQkgICAgewotCSAgICAgIGlmIChzaXogPiAyKQotCQl7Ci0JCSAgaWYgKCogb2ZmICYgMHgzKQotCQkgICAgYXNfYmFkIChfKCJvcGVyYW5kIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IikpOwotCQkgIAotCQkgICogb2ZmID4+PSAyOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKCogb2ZmICYgMHgxKQotCQkgICAgYXNfYmFkIChfKCJvcGVyYW5kIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyIikpOwotCQkgIAotCQkgICogb2ZmID4+PSAxOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICAKLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIHMpKQotCSsrIHM7Ci0gICAgICAKLSAgICAgIGlmICgqIHMgPT0gJyknKQotCXMgKys7Ci0gICAgfQotICBlbHNlCi0gICAgYXNfYmFkIChfKCJiYXNlIHJlZ2lzdGVyIGV4cGVjdGVkIikpOwotICAKLSAgcmV0dXJuIHM7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIGd1dHMgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlci4gIFNUUiBwb2ludHMgdG8gYQotICAgbWFjaGluZSBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGVtaXQKLSAgIHRoZSBmcmFncy9ieXRlcyBpdCBhc3NlbWJsZXMgdG8uICAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBjaGFyICogb3Bfc3RhcnQ7Ci0gIGNoYXIgKiBvcF9lbmQ7Ci0gIG1jb3JlX29wY29kZV9pbmZvICogb3Bjb2RlOwotICBjaGFyICogb3V0cHV0OwotICBpbnQgbmxlbiA9IDA7Ci0gIHVuc2lnbmVkIHNob3J0IGluc3Q7Ci0gIHVuc2lnbmVkIHJlZzsKLSAgdW5zaWduZWQgb2ZmOwotICB1bnNpZ25lZCBpc2l6ZTsKLSAgZXhwcmVzc2lvblMgZTsKLSAgY2hhciBuYW1lWzIwXTsKLQotICAvKiBEcm9wIGxlYWRpbmcgd2hpdGVzcGFjZS4gICovCi0gIHdoaWxlIChpc3NwYWNlICgqIHN0cikpCi0gICAgc3RyICsrOwotCi0gIC8qIEZpbmQgdGhlIG9wIGNvZGUgZW5kLiAgKi8KLSAgZm9yIChvcF9zdGFydCA9IG9wX2VuZCA9IHN0cjsKLSAgICAgICAqIG9wX2VuZCAmJiBubGVuIDwgMjAgJiYgIWlzX2VuZF9vZl9saW5lIFsqb3BfZW5kXSAmJiAqb3BfZW5kICE9ICcgJzsKLSAgICAgICBvcF9lbmQrKykKLSAgICB7Ci0gICAgICBuYW1lW25sZW5dID0gb3Bfc3RhcnRbbmxlbl07Ci0gICAgICBubGVuKys7Ci0gICAgfQotICAKLSAgbmFtZSBbbmxlbl0gPSAwOwotICAKLSAgaWYgKG5sZW4gPT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImNhbid0IGZpbmQgb3Bjb2RlICIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgb3Bjb2RlID0gKG1jb3JlX29wY29kZV9pbmZvICopIGhhc2hfZmluZCAob3Bjb2RlX2hhc2hfY29udHJvbCwgbmFtZSk7Ci0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInVua25vd24gb3Bjb2RlIFwiJXNcIiIpLCBuYW1lKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIAotICBpbnN0ID0gb3Bjb2RlLT5pbnN0OwotICBpc2l6ZSA9IDI7Ci0gIAotICBzd2l0Y2ggKG9wY29kZS0+b3BjbGFzcykKLSAgICB7Ci0gICAgY2FzZSBPMDoKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1Q6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAwLCAzKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPMToKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEpNUDoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgLyogSW4gYSBzaWZpbHRlciBtb2RlLCB3ZSBlbWl0IHRoaXMgaW5zbiAyIHRpbWVzLAotICAgICAgICAgZml4ZXMgcHJvYmxlbSBvZiBhbiBpbnRlcnJ1cHQgZHVyaW5nIGEgam1wLi4gKi8KLSAgICAgIGlmIChzaWZpbHRlcl9tb2RlKQotCXsKLQkgIG91dHB1dFswXSA9IElOU1RfQllURTAgKGluc3QpOwotCSAgb3V0cHV0WzFdID0gSU5TVF9CWVRFMSAoaW5zdCk7Ci0JICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotCX0KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBKU1I6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIAotICAgICAgaWYgKHJlZyA9PSAxNSkKLQlhc19iYWQgKF8oImludmFsaWQgcmVnaXN0ZXI6IHIxNSBpbGxlZ2FsIikpOwotICAgICAgCi0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICAKLSAgICAgIGlmIChzaWZpbHRlcl9tb2RlKQotCXsKLQkgIC8qIFJlcGxhY2Ugd2l0aDogIGJzciAuKzIgOyBhZGRpIHIxNSw2OyBqbXAgcnggOyBqbXAgcnggKi8KLQkgIGluc3QgPSBNQ09SRV9JTlNUX0JTUjsJLyogd2l0aCAwIGRpc3BsYWNlbWVudCAqLwotCSAgb3V0cHV0WzBdID0gSU5TVF9CWVRFMCAoaW5zdCk7Ci0JICBvdXRwdXRbMV0gPSBJTlNUX0JZVEUxIChpbnN0KTsKLQotCSAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLQkgIGluc3QgPSBNQ09SRV9JTlNUX0FEREk7Ci0JICBpbnN0IHw9IDE1OwkJCS8qIGFkZGkgcjE1LDYgKi8KLQkgIGluc3QgfD0gKDYgLSAxKSA8PCA0OwkJLyogb3ZlciB0aGUgam1wJ3MgKi8KLQkgIG91dHB1dFswXSA9IElOU1RfQllURTAgKGluc3QpOwotCSAgb3V0cHV0WzFdID0gSU5TVF9CWVRFMSAoaW5zdCk7Ci0KLQkgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0JICBpbnN0ID0gTUNPUkVfSU5TVF9KTVAgfCByZWc7Ci0JICBvdXRwdXRbMF0gPSBJTlNUX0JZVEUwIChpbnN0KTsKLQkgIG91dHB1dFsxXSA9IElOU1RfQllURTEgKGluc3QpOwotCi0JICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwkJLyogMm5kIGVtaXR0ZWQgaW4gZmFsbHRocnUgKi8KLQl9Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT0M6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCpvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2NyZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE8yOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgWDE6CS8qIEhhbmRsZSBib3RoIHN5bnRheC0+IHh0cmItIHIxLHJ4IE9SIHh0cmItIHJ4ICovCi0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCS8qIHh0cmItIHIxLHJ4ICovCi0JewotCSAgaWYgKHJlZyAhPSAxKQotCSAgICBhc19iYWQgKF8oImRlc3RpbmF0aW9uIHJlZ2lzdGVyIG11c3QgYmUgcjEiKSk7Ci0JICAKLQkgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotCX0KLSAgICAgIAotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE8xUjE6ICAvKiBkaXYtIHJ4LHIxICovCi0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLQkgIGlmIChyZWcgIT0gMSkKLQkgICAgYXNfYmFkIChfKCJzb3VyY2UgcmVnaXN0ZXIgbXVzdCBiZSByMSIpKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9JOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMzIpOwotCSAgaW5zdCB8PSAocmVnIC0gMSkgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9COgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMCwgMzEpOwotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9CMjoJCS8qIGxpa2UgT0IsIGJ1dCBhcmcgaXMgMl5uIGluc3RlYWQgb2YgbiAqLwotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMSA8PCAzMSk7Ci0JICAvKiBGdXJ0aGVyIHJlc3RyaWN0IHRoZSBpbW1lZGlhdGUgdG8gYSBwb3dlciBvZiB0d28uICovCi0JICBpZiAoKHJlZyAmIChyZWcgLSAxKSkgPT0gMCkKLQkgICAgcmVnID0gbG9nMiAocmVnKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlZyA9IDA7Ci0JICAgICAgYXNfYmFkIChfKCJpbW1lZGlhdGUgaXMgbm90IGEgcG93ZXIgb2YgdHdvIikpOwotCSAgICB9Ci0JICBpbnN0IHw9IChyZWcpIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPQlJhOgkvKiBTcGVjaWZpYyBmb3IgYmdlbmk6IGltbSBvZiAwLT42IHRyYW5zbGF0ZSB0byBtb3ZpLiAqLwotICAgIGNhc2UgT0JSYjoKLSAgICBjYXNlIE9CUmM6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAwLCAzMSk7Ci0JICAvKiBpbW1lZGlhdGUgdmFsdWVzIG9mIDAgLT4gNiB0cmFuc2xhdGUgdG8gbW92aSAqLwotCSAgaWYgKHJlZyA8PSA2KQotCSAgICB7Ci0JICAgICAgaW5zdCA9IChpbnN0ICYgMHhGKSB8IE1DT1JFX0lOU1RfQkdFTklfQUxUOwotCSAgICAgIHJlZyA9IDB4MSA8PCByZWc7Ci0JICAgICAgYXNfd2FybiAoXygidHJhbnNsYXRpbmcgYmdlbmkgdG8gbW92aSIpKTsKLQkgICAgfQotCSAgaW5zdCAmPSB+IDB4MDFmMDsKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPQlIyOgkvKiBsaWtlIE9CUiwgYnV0IGFyZyBpcyAyXm4gaW5zdGVhZCBvZiBuICovCi0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAxIDw8IDMxKTsKLQkgIAotCSAgLyogRnVydGhlciByZXN0cmljdCB0aGUgaW1tZWRpYXRlIHRvIGEgcG93ZXIgb2YgdHdvLiAgKi8KLQkgIGlmICgocmVnICYgKHJlZyAtIDEpKSA9PSAwKQotCSAgICByZWcgPSBsb2cyIChyZWcpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVnID0gMDsKLQkgICAgICBhc19iYWQgKF8oImltbWVkaWF0ZSBpcyBub3QgYSBwb3dlciBvZiB0d28iKSk7Ci0JICAgIH0KLQkgIAotCSAgLyogSW1tZWRpYXRlIHZhbHVlcyBvZiAwIC0+IDYgdHJhbnNsYXRlIHRvIG1vdmkuICovCi0JICBpZiAocmVnIDw9IDYpCi0JICAgIHsKLQkgICAgICBpbnN0ID0gKGluc3QgJiAweEYpIHwgTUNPUkVfSU5TVF9CR0VOSV9BTFQ7Ci0JICAgICAgcmVnID0gMHgxIDw8IHJlZzsKLQkgICAgICBhc193YXJuIChfKCJ0cmFuc2xhdGluZyBtZ2VuaSB0byBtb3ZpIikpOwotCSAgICB9Ci0JICAKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPTWE6CS8qIFNwZWNpZmljIGZvciBibWFza2k6IGltbSAxLT43IHRyYW5zbGF0ZSB0byBtb3ZpLiAgKi8KLSAgICBjYXNlIE9NYjoKLSAgICBjYXNlIE9NYzoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDMyKTsKLQkgIAotCSAgLyogSW1tZWRpYXRlIHZhbHVlcyBvZiAxIC0+IDcgdHJhbnNsYXRlIHRvIG1vdmkuICovCi0JICBpZiAocmVnIDw9IDcpCi0JICAgIHsKLQkgICAgICBpbnN0ID0gKGluc3QgJiAweEYpIHwgTUNPUkVfSU5TVF9CTUFTS0lfQUxUOwotCSAgICAgIHJlZyA9ICgweDEgPDwgcmVnKSAtIDE7Ci0JICAgICAgaW5zdCB8PSByZWcgPDwgNDsKLQkgICAgICAKLQkgICAgICBhc193YXJuIChfKCJ0cmFuc2xhdGluZyBibWFza2kgdG8gbW92aSIpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW5zdCAmPSB+IDB4MDFGMDsKLQkgICAgICBpbnN0IHw9IChyZWcgJiAweDFGKSA8PCA0OwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBTSToKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDMxKTsKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBJNzoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDAsIDB4N0YpOwotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIExTOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZyA8PCA4OwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBpbnQgc2l6ZTsKLQkgIAotCSAgaWYgKChpbnN0ICYgMHg2MDAwKSA9PSAwKQotCSAgICBzaXplID0gNDsKLQkgIGVsc2UgaWYgKChpbnN0ICYgMHg2MDAwKSA9PSAweDQwMDApCi0JICAgIHNpemUgPSAyOwotCSAgZWxzZSBpZiAoKGluc3QgJiAweDYwMDApID09IDB4MjAwMCkKLQkgICAgc2l6ZSA9IDE7Ci0JICAKLQkgIG9wX2VuZCA9IHBhcnNlX21lbSAob3BfZW5kICsgMSwgJiByZWcsICYgb2ZmLCBzaXplKTsKLQkgIAotCSAgaWYgKG9mZiA+IDE2KQotCSAgICBhc19iYWQgKF8oImRpc3BsYWNlbWVudCB0b28gbGFyZ2UgKCVkKSIpLCBvZmYpOwotCSAgZWxzZQotCSAgICBpbnN0IHw9IChyZWcpIHwgKG9mZiA8PCA0KTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIExSOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICAKLSAgICAgIGlmIChyZWcgPT0gMCB8fCByZWcgPT0gMTUpCi0JYXNfYmFkIChfKCJJbnZhbGlkIHJlZ2lzdGVyOiByMCBhbmQgcjE1IGlsbGVnYWwiKSk7Ci0gICAgICAKLSAgICAgIGluc3QgfD0gKHJlZyA8PCA4KTsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JLyogcGFyc2VfcnQgY2FsbHMgZnJhZ19tb3JlKCkgZm9yIHVzLiAgKi8KLQlpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJzZV9ydCAob3BfZW5kICsgMSwgJiBvdXRwdXQsIDAsIDApOwotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLQkgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7CQkvKiBzYXZlIGl0cyBzcGFjZSAqLwotCX0KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBMSjoKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcnNlX3J0IChvcF9lbmQgKyAxLCAmIG91dHB1dCwgMSwgMCk7Ci0gICAgICAvKiBwYXJzZV9ydCgpIGNhbGxzIGZyYWdfbW9yZSgpIGZvciB1cy4gICovCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUk06Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIAotICAgICAgaWYgKHJlZyA9PSAwIHx8IHJlZyA9PSAxNSkKLQlhc19iYWQgKF8oImJhZCBzdGFydGluZyByZWdpc3RlcjogcjAgYW5kIHIxNSBpbnZhbGlkIikpOwotICAgICAgCi0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLScpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0JICAKLQkgIGlmIChyZWcgIT0gMTUpCi0JICAgIGFzX2JhZCAoXygiZW5kaW5nIHJlZ2lzdGVyIG11c3QgYmUgcjE1IikpOwotCSAgCi0JICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotCSAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkgICAgKysgb3BfZW5kOwotCX0KLSAgICAgIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgKys7Ci0JICAKLQkgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0JICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSAgICArKyBvcF9lbmQ7Ci0gIAotCSAgaWYgKCogb3BfZW5kID09ICcoJykKLQkgICAgewotCSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotCSAgICAgIAotCSAgICAgIGlmIChyZWcgIT0gMCkKLQkJYXNfYmFkIChfKCJiYWQgYmFzZSByZWdpc3RlcjogbXVzdCBiZSByMCIpKTsKLQkgICAgICAKLQkgICAgICBpZiAoKiBvcF9lbmQgPT0gJyknKQotCQlvcF9lbmQgKys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgYXNfYmFkIChfKCJiYXNlIHJlZ2lzdGVyIGV4cGVjdGVkIikpOwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUlE6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIAotICAgICAgaWYgKHJlZyAhPSA0KQotCWFzX2ZhdGFsIChfKCJmaXJzdCByZWdpc3RlciBtdXN0IGJlIHI0IikpOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICctJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLQkgIAotCSAgaWYgKHJlZyAhPSA3KQotCSAgICBhc19mYXRhbCAoXygibGFzdCByZWdpc3RlciBtdXN0IGJlIHI3IikpOwotCSAgCi0JICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotCSAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkgICAgKysgb3BfZW5kOwotICAKLQkgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JICAgIHsKLQkgICAgICBvcF9lbmQgKys7Ci0JICAgICAgCi0JICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLQkgICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCQkrKyBvcF9lbmQ7Ci0gIAotCSAgICAgIGlmICgqIG9wX2VuZCA9PSAnKCcpCi0JCXsKLQkJICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLQkJICAKLQkJICBpZiAocmVnID49IDQgJiYgcmVnIDw9IDcpCi0JCSAgICBhc19mYXRhbCAoImJhc2UgcmVnaXN0ZXIgY2Fubm90IGJlIHI0LCByNSwgcjYsIG9yIHI3Iik7Ci0JCSAgCi0JCSAgaW5zdCB8PSByZWc7Ci0JCSAgCi0JCSAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLQkJICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCQkgICAgKysgb3BfZW5kOwotCQkgIAotCQkgIGlmICgqIG9wX2VuZCA9PSAnKScpCi0JCSAgICBvcF9lbmQgKys7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWFzX2JhZCAoXygiYmFzZSByZWdpc3RlciBleHBlY3RlZCIpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygicmVnLXJlZyBleHBlY3RlZCIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBCUjoKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcnNlX2V4cCAob3BfZW5kICsgMSwgJiBlKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIAotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBvdXRwdXQtZnJhZ19ub3ctPmZyX2xpdGVyYWwsIAotCQkgICAyLCAmIGUsIDEsIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQkw6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnIDw8IDQ7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2V4cCAob3BfZW5kICsgMSwgJiBlKTsKLQkgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0JICAKLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgb3V0cHV0LWZyYWdfbm93LT5mcl9saXRlcmFsLCAKLQkJICAgICAgIDIsICYgZSwgMSwgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0JICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotCX0KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBKQzoKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcnNlX2V4cCAob3BfZW5kICsgMSwgJiBlKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQkJIG1kX3JlbGF4X3RhYmxlW0MgKENPTkRfSlVNUCwgQ09ORDMyKV0ucmx4X2xlbmd0aCwKLQkJCSBtZF9yZWxheF90YWJsZVtDIChDT05EX0pVTVAsIENPTkQxMildLnJseF9sZW5ndGgsCi0JCQkgQyAoQ09ORF9KVU1QLCAwKSwgZS5YX2FkZF9zeW1ib2wsIGUuWF9hZGRfbnVtYmVyLCAwKTsKLSAgICAgIGlzaXplID0gQzMyX0xFTjsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBKVToKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcnNlX2V4cCAob3BfZW5kICsgMSwgJiBlKTsKLSAgICAgIG91dHB1dCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJCSBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QzMildLnJseF9sZW5ndGgsCi0JCQkgbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMTIpXS5ybHhfbGVuZ3RoLAotCQkJIEMgKFVOQ0RfSlVNUCwgMCksIGUuWF9hZGRfc3ltYm9sLCBlLlhfYWRkX251bWJlciwgMCk7Ci0gICAgICBpc2l6ZSA9IFUzMl9MRU47Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSkw6Ci0gICAgICBpbnN0ID0gTUNPUkVfSU5TVF9KU1JJOwkJLyoganNyaSAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyc2VfcnQgKG9wX2VuZCArIDEsICYgb3V0cHV0LCAxLCAmIGUpOwotICAgICAgLyogcGFyc2VfcnQoKSBjYWxscyBmcmFnX21vcmUgZm9yIHVzICovCi0gICAgICAKLSAgICAgIC8qIE9ubHkgZG8gdGhpcyBpZiB3ZSBrbm93IGhvdyB0byBkbyBpdCAuLi4gKi8KLSAgICAgIGlmIChlLlhfb3AgIT0gT19hYnNlbnQgJiYgZG9fanNyaTJic3IpCi0JewotCSAgLyogTG9vayBhdCBhZGRpbmcgdGhlIFJfUENSRUxfSlNSSU1NMTFCWTIuICAqLwotCSAgZml4X25ld19leHAgKGZyYWdfbm93LCBvdXRwdXQtZnJhZ19ub3ctPmZyX2xpdGVyYWwsIAotCQkgICAgICAgMiwgJiBlLCAxLCBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUlNJOgkJCQkvKiBTSSwgYnV0IGltbSBiZWNvbWVzIDMyLWltbSAqLwotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMzEpOwotCSAgCi0JICByZWcgPSAzMiAtIHJlZzsKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBETzIxOgkJCS8qIE8yLCBkdXAgcmQsIGxpdCBtdXN0IGJlIDEgKi8KLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICBpbnN0IHw9IHJlZyA8PCA0OwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAzMSk7Ci0JICAKLQkgIGlmIChyZWcgIT0gMSkKLQkgICAgYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtdXN0IGJlIDEiKSk7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBTSWE6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAzMSk7Ci0KLQkgIGlmIChyZWcgPT0gMCkKLQkgICAgYXNfYmFkIChfKCJ6ZXJvIHVzZWQgYXMgaW1tZWRpYXRlIHZhbHVlIikpOwotCSAgCi0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oInVuaW1wbGVtZW50ZWQgb3Bjb2RlIFwiJXNcIiIpLCBuYW1lKTsKLSAgICB9Ci0gIAotICBvdXRwdXRbMF0gPSBJTlNUX0JZVEUwIChpbnN0KTsKLSAgb3V0cHV0WzFdID0gSU5TVF9CWVRFMSAoaW5zdCk7Ci0gIAotICBjaGVja19saXRlcmFscyAob3Bjb2RlLT50cmFuc2ZlciwgaXNpemUpOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgICAgY2hhciAqIG5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1tZF9tY29yZV9lbmQgKCkKLXsKLSAgZHVtcF9saXRlcmFscyAoMCk7Ci0gIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgMCk7Ci19Ci0KLS8qIFZhcmlvdXMgcm91dGluZXMgdG8ga2lsbCBvbmUgZGF5LiAgKi8KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4qLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKiBsaXRQOwotICAgICBpbnQgKiBzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgaW50ICAgIGk7Ci0gIGNoYXIgKiB0OwotICBjaGFyICogYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfTlRPRigpIik7Ci0gICAgfQotICAKLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIAotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgCi0gICAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLSAgICAgIHsKLQltZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLAotCQkJICAgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQlsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgICAgfQotICAKLSAgcmV0dXJuIDA7Ci19Ci0MCi1DT05TVCBjaGFyICogbWRfc2hvcnRvcHRzID0gIiI7Ci0KLSNkZWZpbmUgT1BUSU9OX0pTUkkyQlNSX09OCShPUFRJT05fTURfQkFTRSArIDApCi0jZGVmaW5lIE9QVElPTl9KU1JJMkJTUl9PRkYJKE9QVElPTl9NRF9CQVNFICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NJRklMVEVSX09OCShPUFRJT05fTURfQkFTRSArIDIpCi0jZGVmaW5lIE9QVElPTl9TSUZJTFRFUl9PRkYJKE9QVElPTl9NRF9CQVNFICsgMykKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KLXsKLSAgeyAibm8tanNyaTJic3IiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0pTUkkyQlNSX09GRn0sCi0gIHsgImpzcmkyYnNyIiwgICAgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9KU1JJMkJTUl9PTn0sCi0gIHsgInNpZmlsdGVyIiwgICAgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TSUZJTFRFUl9PTn0sCi0gIHsgIm5vLXNpZmlsdGVyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TSUZJTFRFUl9PRkZ9LAotICB7IE5VTEwsICAgICAgICAgIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLQotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKiBhcmc7Ci17Ci0gIGludCBpOwotICBjaGFyICogcDsKLQotICBzd2l0Y2ggKGMpCi0gICAgewotICAgICAgCi0gICAgY2FzZSBPUFRJT05fSlNSSTJCU1JfT046ICBkb19qc3JpMmJzciA9IDE7ICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fSlNSSTJCU1JfT0ZGOiBkb19qc3JpMmJzciA9IDA7ICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU0lGSUxURVJfT046ICBzaWZpbHRlcl9tb2RlID0gMTsgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU0lGSUxURVJfT0ZGOiBzaWZpbHRlcl9tb2RlID0gMDsgYnJlYWs7Ci0gICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqIHN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1NQ09SRSBzcGVjaWZpYyBvcHRpb25zOlxuXAotICAte25vLX1qc3JpMmJzcgkgIHtkaXN9YWJsZSBqc3JpIHRvIGJzciB0cmFuc2Zvcm1hdGlvbiAoZGVmOiBkaXMpXG5cCi0gIC17bm8tfXNpZmlsdGVyCSAge2Rpc31hYmxlIHNpbGljb24gZmlsdGVyIGJlaGF2aW9yIChkZWY6IGRpcykiKSk7Ci19Ci0MCi1pbnQgbWRfc2hvcnRfanVtcF9zaXplOwotCi12b2lkCi1tZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX05kZHIsIHRvX05kZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqIHB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9OZGRyOwotICAgICBhZGRyZXNzVCB0b19OZGRyOwotICAgICBmcmFnUyAqIGZyYWc7Ci0gICAgIHN5bWJvbFMgKiB0b19zeW1ib2w7Ci17Ci0gIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrOiBzaG9ydF9qdW1wIikpOwotfQotCi12b2lkCi1tZF9jcmVhdGVfbG9uZ19qdW1wIChwdHIsIGZyb21fTmRkciwgdG9fTmRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICogcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX05kZHI7Ci0gICAgIGFkZHJlc3NUIHRvX05kZHI7Ci0gICAgIGZyYWdTICogZnJhZzsKLSAgICAgc3ltYm9sUyAqIHRvX3N5bWJvbDsKLXsKLSAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2s6IGxvbmdfanVtcCIpKTsKLX0KLQotLyogQ2FsbGVkIGFmdGVyIHJlbGF4aW5nLCBjaGFuZ2UgdGhlIGZyYWdzIHNvIHRoZXkga25vdyBob3cgYmlnIHRoZXkgYXJlLiAgKi8KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICogZnJhZ1A7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKiBidWZmZXI7Ci0gIGludCB0YXJnX2FkZHIgPSBTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgKyBmcmFnUC0+ZnJfb2Zmc2V0OwotICAKLSAgYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgKGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfbGl0ZXJhbCk7Ci0gIHRhcmdfYWRkciArPSBmcmFnUC0+ZnJfc3ltYm9sLT5zeV9mcmFnLT5mcl9hZGRyZXNzOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBDT05EMTIpOgotICAgIGNhc2UgQyAoVU5DRF9KVU1QLCBVTkNEMTIpOgotICAgICAgewotCS8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbiAqLwotCWludCBuZXh0X2luc3QgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2FkZHJlc3MgKyAyOwotCXVuc2lnbmVkIGNoYXIgdDA7Ci0JaW50IGRpc3AgPSB0YXJnX2FkZHIgLSBuZXh0X2luc3Q7Ci0JCi0JaWYgKGRpc3AgJiAxKQotCSAgYXNfYmFkIChfKCJvZGQgZGlzcGxhY2VtZW50IGF0ICV4IiksIG5leHRfaW5zdCAtIDIpOwotCQotCWRpc3AgPj49IDE7Ci0JICB7Ci0JICAgIHQwID0gYnVmZmVyWzBdICYgMHhGODsKLQkKLQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWZmZXIsIGRpc3AsIDIpOwotCQotCSAgICBidWZmZXJbMF0gPSAoYnVmZmVyWzBdICYgMHgwNykgfCB0MDsKLQkgIH0KLQkKLQlmcmFnUC0+ZnJfZml4ICs9IDI7Ci0JZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBDT05EMzIpOgotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBVTkRFRl9XT1JEX0RJU1ApOgotICAgICAgewotCS8qIEEgY29uZGl0aW9uYWwgYnJhbmNoIHdvbnQgZml0IGludG8gMTIgYml0cyBzbzoKLQkgKgliIWNvbmQJMWYKLQkgKglqbXBpCTBmCi0JICoJLmFsaWduIDIKLQkgKiAwOgkubG9uZyBkaXNwCi0JICogMToKLQkgKgotCSAqIGlmIHRoZSBiIWNvbmQgaXMgNCBieXRlIGFsaWduZWQsIHRoZSBsaXRlcmFsIHdoaWNoIHdvdWxkCi0JICogZ28gYXQgeCs0IHdpbGwgYWxzbyBiZSBhbGlnbmVkLgotCSAqLwotCWludCBmaXJzdF9pbnN0ID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9hZGRyZXNzOwotCWludCBuZWVkcGFkID0gKGZpcnN0X2luc3QgJiAzKTsKLQotCSAgYnVmZmVyWzBdIF49IDB4MDg7CS8qIFRvZ2dsZSBUL0YgYml0ICovCi0KLQlidWZmZXJbMl0gPSBJTlNUX0JZVEUwIChNQ09SRV9JTlNUX0pNUEkpOwkvKiBCdWlsZCBqbXBpICovCi0JYnVmZmVyWzNdID0gSU5TVF9CWVRFMSAoTUNPUkVfSU5TVF9KTVBJKTsKLSAKLQlpZiAobmVlZHBhZCkKLQkgIHsKLQkgICAgICB7Ci0JCWJ1ZmZlclsxXSA9IDQ7CS8qIGJyYW5jaCBvdmVyIGptcGksIHBhZCwgYW5kIHB0ciAqLwotCQlidWZmZXJbM10gPSAxOwkvKiBqbXBpIG9mZnNldCBvZiAxIGdldHMgdGhlIHBvaW50ZXIgKi8KLQkgICAgICB9Ci0JICAgIAotCSAgICBidWZmZXJbNF0gPSAwOwkvKiBhbGlnbm1lbnQvcGFkICovCi0JICAgIGJ1ZmZlcls1XSA9IDA7Ci0JICAgIGJ1ZmZlcls2XSA9IDA7CS8qIHNwYWNlIGZvciAzMiBiaXQgYWRkcmVzcyAqLwotCSAgICBidWZmZXJbN10gPSAwOwotCSAgICBidWZmZXJbOF0gPSAwOwotCSAgICBidWZmZXJbOV0gPSAwOwotCSAgICAKLQkgICAgLyogTWFrZSByZWxvYyBmb3IgdGhlIGxvbmcgZGlzcCAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDYsIDQsCi0JCSAgICAgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwgMCwgQkZEX1JFTE9DXzMyKTsKLQkgICAgCi0JICAgIGZyYWdQLT5mcl9maXggKz0gQzMyX0xFTjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIC8qIFNlZSBjb21tZW50IGJlbG93IGFib3V0IHRoaXMgZ2l2ZW4gZ2FzJyBsaW1pdGF0aW9ucyBmb3IKLQkgICAgICAgc2hyaW5raW5nIHRoZSBmcmFnbWVudC4gJzMnIGlzIHRoZSBhbW91bnQgb2YgY29kZSB0aGF0Ci0JICAgICAgIHdlIGluc2VydGVkIGhlcmUsIGJ1dCAnNCcgaXMgcmlnaHQgZm9yIHRoZSBzcGFjZSB3ZSByZXNlcnZlZAotCSAgICAgICBmb3IgdGhpcyBmcmFnbWVudC4gKi8KLQkgICAgICB7Ci0JCWJ1ZmZlclsxXSA9IDM7CS8qIGJyYW5jaCBvdmVyIGptcGksIGFuZCBwdHIgKi8KLQkJYnVmZmVyWzNdID0gMDsJLyogam1waSBvZmZzZXQgb2YgMCBnZXRzIHRoZSBwb2ludGVyICovCi0JICAgICAgfQotCSAgICAKLQkgICAgYnVmZmVyWzRdID0gMDsJLyogc3BhY2UgZm9yIDMyIGJpdCBhZGRyZXNzICovCi0JICAgIGJ1ZmZlcls1XSA9IDA7Ci0JICAgIGJ1ZmZlcls2XSA9IDA7Ci0JICAgIGJ1ZmZlcls3XSA9IDA7Ci0JICAgIAotCSAgICAvKiBNYWtlIHJlbG9jIGZvciB0aGUgbG9uZyBkaXNwLiAgKi8KLQkgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyA0LCA0LAotCQkgICAgIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQsIDAsIEJGRF9SRUxPQ18zMik7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gQzMyX0xFTjsKLQotCSAgICAvKiBGcmFnIGlzIGFjdHVhbGx5IHNob3J0ZXIgKHNlZSB0aGUgb3RoZXIgc2lkZSBvZiB0aGlzIGlmZGVmKQotCSAgICAgICBidXQgZ2FzIGlzbid0IHByZXBhcmVkIGZvciB0aGF0LiAgV2UgaGF2ZSB0byByZS1hZGp1c3QKLQkgICAgICAgdGhlIGJyYW5jaCBkaXNwbGFjZW1lbnQgc28gdGhhdCBpdCBnb2VzIGJleW9uZCB0aGUgCi0JICAgICAgIGZ1bGwgbGVuZ3RoIG9mIHRoZSBmcmFnbWVudCwgbm90IGp1c3Qgd2hhdCB3ZSBhY3R1YWxseQotCSAgICAgICBmaWxsZWQgaW4uICAqLwotCSAgICAgIGJ1ZmZlclsxXSA9IDQ7CS8qIGptcGksIHB0ciwgYW5kIHRoZSAndGFpbCBwYWQnICovCi0JICB9Ci0JCi0JZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQyAoVU5DRF9KVU1QLCBVTkNEMzIpOgotICAgIGNhc2UgQyAoVU5DRF9KVU1QLCBVTkRFRl9XT1JEX0RJU1ApOgotICAgICAgewotCS8qIEFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIHdpbGwgbm90IGZpdCBpbiAxMiBiaXRzLCBtYWtlIGNvZGUgd2hpY2gKLQkgICBsb29rcyBsaWtlOgotCSAgCWptcGkJMGYKLQkgIAkuYWxpZ24gMgotCSAgICAgMDoJLmxvbmcgZGlzcAotCSAgIHdlIG5lZWQgYSBwYWQgaWYgImZpcnN0X2luc3QiIGlzIDQgYnl0ZSBhbGlnbmVkLgotCSAgIFtiZWNhdXNlIHRoZSBuYXR1cmFsIGxpdGVyYWwgcGxhY2UgaXMgeCArIDJdICAqLwotCWludCBmaXJzdF9pbnN0ID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9hZGRyZXNzOwotCWludCBuZWVkcGFkID0gIShmaXJzdF9pbnN0ICYgMyk7Ci0KLQlidWZmZXJbMF0gPSBJTlNUX0JZVEUwIChNQ09SRV9JTlNUX0pNUEkpOwkvKiBCdWlsZCBqbXBpICovCi0JYnVmZmVyWzFdID0gSU5TVF9CWVRFMSAoTUNPUkVfSU5TVF9KTVBJKTsKLQotCWlmIChuZWVkcGFkKQotCSAgewotCSAgICAgIGJ1ZmZlclsxXSA9IDE7CS8qIGptcGkgb2Zmc2V0IG9mIDEgc2luY2UgcGFkZGVkICovCi0JICAgIGJ1ZmZlclsyXSA9IDA7CS8qIGFsaWdubWVudCAqLwotCSAgICBidWZmZXJbM10gPSAwOwotCSAgICBidWZmZXJbNF0gPSAwOwkvKiBzcGFjZSBmb3IgMzIgYml0IGFkZHJlc3MgKi8KLQkgICAgYnVmZmVyWzVdID0gMDsKLQkgICAgYnVmZmVyWzZdID0gMDsKLQkgICAgYnVmZmVyWzddID0gMDsKLQkgICAgCi0JICAgIC8qIE1ha2UgcmVsb2MgZm9yIHRoZSBsb25nIGRpc3AgKi8KLQkgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyA0LCA0LAotCQkgICAgIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQsIDAsIEJGRF9SRUxPQ18zMik7Ci0JICAgIAotCSAgICBmcmFnUC0+ZnJfZml4ICs9IFUzMl9MRU47Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAgIGJ1ZmZlclsxXSA9IDA7CS8qIGptcGkgb2Zmc2V0IG9mIDAgaWYgbm8gcGFkICovCi0JICAgIGJ1ZmZlclsyXSA9IDA7CS8qIHNwYWNlIGZvciAzMiBiaXQgYWRkcmVzcyAqLwotCSAgICBidWZmZXJbM10gPSAwOwotCSAgICBidWZmZXJbNF0gPSAwOwotCSAgICBidWZmZXJbNV0gPSAwOwotCSAgICAKLQkgICAgLyogTWFrZSByZWxvYyBmb3IgdGhlIGxvbmcgZGlzcCAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDQsCi0JCSAgICAgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwgMCwgQkZEX1JFTE9DXzMyKTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSBVMzJfTEVOOwotCSAgfQotCi0JZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLS8qIEFwcGxpZXMgdGhlIGRlc2lyZWQgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KLSAgIEFsc28gc2V0cyB1cCBhZGRlbmRzIGZvciAncmVsYScgdHlwZSByZWxvY2F0aW9ucy4gICovCi1pbnQKLW1kX2FwcGx5X2ZpeDMgKGZpeFAsIHZhbHAsIHNlZ21lbnQpCi0gICAgIGZpeFMgKiAgIGZpeFA7Ci0gICAgIHZhbHVlVCAqIHZhbHA7Ci0gICAgIHNlZ1QgICAgIHNlZ21lbnQ7Ci17Ci0gIGNoYXIgKiAgICAgICBidWYgID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotICBjaGFyICogICAgICAgZmlsZSA9IGZpeFAtPmZ4X2ZpbGUgPyBmaXhQLT5meF9maWxlIDogXygidW5rbm93biIpOwotICBjb25zdCBjaGFyICogc3ltbmFtZTsKLSAgLyogTm90ZTogdXNlIG9mZnNldFQgYmVjYXVzZSBpdCBpcyBzaWduZWQsIHZhbHVlVCBpcyB1bnNpZ25lZC4gICovCi0gIG9mZnNldFQgICAgICB2YWwgID0gKG9mZnNldFQpICogdmFscDsgCi0gIAotICBzeW1uYW1lID0gZml4UC0+ZnhfYWRkc3kgPyBTX0dFVF9OQU1FIChmaXhQLT5meF9hZGRzeSkgOiBfKCI8dW5rbm93bj4iKTsKLSAgLyogU2F2ZSB0aGlzIGZvciB0aGUgYWRkZW5kIGluIHRoZSByZWxvY2F0aW9uIHJlY29yZC4gICovCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbDsKLQotICAvKiBJZiB0aGUgZml4IGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHdoaWNoIGlzIG5vdCBkZWZpbmVkLCBvciBub3QKLSAgICAgaW4gdGhlIHNhbWUgc2VnbWVudCBhcyB0aGUgZml4LCB3ZSBjYW5ub3QgcmVzb2x2ZSBpdCBoZXJlLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLSAgICAgICYmICggICAhIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JICB8fCAoU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IHNlZ21lbnQpKSkKLSAgICB7Ci0gICAgICBmaXhQLT5meF9kb25lID0gMDsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICAvKiBGb3IgRUxGIHdlIGNhbiBqdXN0IHJldHVybiBhbmQgbGV0IHRoZSByZWxvYyB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkCi0JIHRha2UgY2FyZSBvZiBldmVyeXRoaW5nLiAgRm9yIENPRkYgd2Ugc3RpbGwgaGF2ZSB0byBpbnNlcnQgJ3ZhbCcKLQkgaW50byB0aGUgaW5zbiBzaW5jZSB0aGUgYWRkZW5kIGZpZWxkIHdpbGwgYmUgaWdub3JlZC4gICovCi0gICAgICByZXR1cm4gMDsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotICAKLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyOiAgICAgLyogc2Vjb25kIGJ5dGUgb2YgMiBieXRlIG9wY29kZSAqLwotICAgICAgaWYgKCh2YWwgJiAxKSAhPSAwKQotCWFzX2JhZF93aGVyZSAoZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygib2RkIGRpc3RhbmNlIGJyYW5jaCAoMHgleCBieXRlcykiKSwgdmFsKTsKLSAgICAgIHZhbCAvPSAyOwotICAgICAgaWYgKCgodmFsICYgfjB4M2ZmKSAhPSAwKSAmJiAoKHZhbCB8IDB4M2ZmKSAhPSAtMSkpCi0JYXNfYmFkX3doZXJlIChmaWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgICBfKCJwY3JlbCBmb3IgYnJhbmNoIHRvICVzIHRvbyBmYXIgKDB4JXgpIiksCi0JCSAgICAgIHN5bW5hbWUsIHZhbCk7Ci0gICAgICAgIGJ1ZlswXSB8PSAoKHZhbCA+PiA4KSAmIDB4Nyk7Ci0gICAgICAgIGJ1ZlsxXSB8PSAodmFsICYgMHhmZik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQ6CS8qIGxvd2VyIDggYml0cyBvZiAyIGJ5dGUgb3Bjb2RlICovCi0gICAgICB2YWwgKz0gMzsKLSAgICAgIHZhbCAvPSA0OwotICAgICAgaWYgKHZhbCAmIH4weGZmKQotCWFzX2JhZF93aGVyZSAoZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygicGNyZWwgZm9yIGxydy9qbXBpL2pzcmkgdG8gJXMgdG9vIGZhciAoMHgleCkiKSwKLQkJICAgICAgc3ltbmFtZSwgdmFsKTsKLSAgICAgIGVsc2UKLQlidWZbMV0gfD0gKHZhbCAmIDB4ZmYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyOgkvKiBsb29wdCBpbnN0cnVjdGlvbiAqLwotICAgICAgaWYgKCh2YWwgPCAtMzIpIHx8ICh2YWwgPiAtMikpCi0JYXNfYmFkX3doZXJlIChmaWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgICBfKCJwY3JlbCBmb3IgbG9vcHQgdG9vIGZhciAoMHgleCkiKSwgdmFsKTsKLSAgICAgIHZhbCAvPSAyOwotICAgICAgICBidWZbMV0gfD0gKHZhbCAmIDB4Zik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMjoKLSAgICAgIC8qIENvbmRpdGlvbmFsIGxpbmtlciBtYXAganNyaSB0byBic3IuICAqLwotICAgICAgLyogSWYgaXRzIGEgbG9jYWwgdGFyZ2V0IGFuZCBjbG9zZSBlbm91Z2gsIGZpeCBpdC4gCi0gICAgICAgICBOQjogPj0gLTJrIGZvciBiYWNrd2FyZHMgYnNyOyA8IDJrIGZvciBmb3J3YXJkcy4uLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9hZGRzeSA9PSAwICYmIHZhbCA+PSAtMjA0OCAgJiYgdmFsIDwgMjA0OCkKLQl7Ci0JICBsb25nIG52YWwgPSAodmFsIC8gMikgJiAweDdmZjsKLQkgIG52YWwgfD0gTUNPUkVfSU5TVF9CU1I7Ci0JICAKLQkgIC8qIFJFUExBQ0UgdGhlIGluc3RydWN0aW9uLCBkb24ndCBqdXN0IG1vZGlmeSBpdC4gICovCi0JICBidWZbMF0gPSBJTlNUX0JZVEUwIChudmFsKTsKLQkgIGJ1ZlsxXSA9IElOU1RfQllURTEgKG52YWwpOwotCX0KLSAgICAgIGVsc2UKLQlmaXhQLT5meF9kb25lID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCkKLQl7Ci0JICAvKiBJZiB0aGUgZml4IGlzIGFuIGFic29sdXRlIHJlbG9jIGJhc2VkIG9uIGEgc3ltYm9sJ3MKLQkgICAgIGFkZHJlc3MsIHRoZW4gaXQgY2Fubm90IGJlIHJlc29sdmVkIHVudGlsIHRoZSBmaW5hbCBsaW5rLiAgKi8KLQkgIGZpeFAtPmZ4X2RvbmUgPSAwOwotCX0KLSNpZmRlZiBPQkpfRUxGICAgICAgCi0gICAgICBlbHNlCi0jZW5kaWYKLQl7Ci0JICBpZiAoZml4UC0+Znhfc2l6ZSA9PSA0KQotCSAgICA7Ci0JICBlbHNlIGlmIChmaXhQLT5meF9zaXplID09IDIgJiYgdmFsID49IC0zMjc2OCAmJiB2YWwgPD0gMzI3NjcpCi0JICAgIDsKLQkgIGVsc2UgaWYgKGZpeFAtPmZ4X3NpemUgPT0gMSAmJiB2YWwgPj0gLTI1NiAmJiB2YWwgPD0gMjU1KQotCSAgICA7Ci0JICBlbHNlCi0JICAgIGFib3J0ICgpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgZml4UC0+Znhfc2l6ZSk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiAwOyAvKiBSZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4gICovCi19Ci0KLXZvaWQKLW1kX29wZXJhbmQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOwotewotICAvKiBJZ25vcmUgbGVhZGluZyBoYXNoIHN5bWJvbCwgaWYgcG9yZXNlbnQuICAqLwotICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArKzsKLSAgICAgIGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgICB9Ci19Ci0KLWludCBtZF9sb25nX2p1bXBfc2l6ZTsKLQotLyogQ2FsbGVkIGp1c3QgYmVmb3JlIGFkZHJlc3MgcmVsYXhhdGlvbiwgcmV0dXJuIHRoZSBsZW5ndGgKLSAgIGJ5IHdoaWNoIGEgZnJhZ21lbnQgbXVzdCBncm93IHRvIHJlYWNoIGl0J3MgZGVzdGluYXRpb24uICAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKiBmcmFnUDsKLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgQyAoVU5DRF9KVU1QLCBVTkRFRl9ESVNQKToKLSAgICAgIC8qIFVzZWQgdG8gYmUgYSBicmFuY2ggdG8gc29tZXdoZXJlIHdoaWNoIHdhcyB1bmtub3duLiAgKi8KLSAgICAgIGlmICghZnJhZ1AtPmZyX3N5bWJvbCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKFVOQ0RfSlVNUCwgVU5DRDEyKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QxMildLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoVU5DRF9KVU1QLCBVTkNEMTIpOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDEyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChVTkNEX0pVTVAsIFVOREVGX1dPUkRfRElTUCk7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMzIpXS5ybHhfbGVuZ3RoOwotCSAgcmV0dXJuIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDMyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIAotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBVTkRFRl9ESVNQKToKLSAgICAgIC8qIFVzZWQgdG8gYmUgYSBicmFuY2ggdG8gc29tZXdoZXJlIHdoaWNoIHdhcyB1bmtub3duLiAqLwotICAgICAgaWYgKGZyYWdQLT5mcl9zeW1ib2wKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICAvKiBHb3QgYSBzeW1ib2wgYW5kIGl0J3MgZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQsIGJlY29tZSBieXRlCi0JICAgICBzaXplZCAtIG1heWJlIGl0IHdpbGwgZml4IHVwICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKENPTkRfSlVNUCwgQ09ORDEyKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChDT05EX0pVTVAsIENPTkQxMildLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N5bWJvbCkKLQl7Ci0JICAvKiBJdHMgZ290IGEgc2VnbWVudCwgYnV0IGl0cyBub3Qgb3Vycywgc28gaXQgd2lsbCBhbHdheXMgYmUgbG9uZy4gICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKENPTkRfSlVNUCwgVU5ERUZfV09SRF9ESVNQKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChDT05EX0pVTVAsIENPTkQzMildLnJseF9sZW5ndGg7Ci0JICByZXR1cm4gbWRfcmVsYXhfdGFibGVbQyAoQ09ORF9KVU1QLCBDT05EMzIpXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBrbm93IHRoZSBhYnMgdmFsdWUuICAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChDT05EX0pVTVAsIENPTkQxMik7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoQ09ORF9KVU1QLCBDT05EMTIpXS5ybHhfbGVuZ3RoOwotCX0KLQotICAgICAgYnJlYWs7Ci0gICAgfQotICAKLSAgcmV0dXJuIGZyYWdQLT5mcl92YXI7Ci19Ci0KLS8qIFB1dCBudW1iZXIgaW50byB0YXJnZXQgYnl0ZSBvcmRlciAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIHVzZSwgbmJ5dGVzKQotICAgICBjaGFyICogcHRyOwotICAgICB2YWx1ZVQgdXNlOwotICAgICBpbnQgbmJ5dGVzOwotewotICAgIHN3aXRjaCAobmJ5dGVzKQotICAgICAgewotICAgICAgY2FzZSA0OiAqcHRyKysgPSAodXNlID4+IDI0KSAmIDB4ZmY7IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAzOiAqcHRyKysgPSAodXNlID4+IDE2KSAmIDB4ZmY7IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyOiAqcHRyKysgPSAodXNlID4+ICA4KSAmIDB4ZmY7IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxOiAqcHRyKysgPSAodXNlID4+ICAwKSAmIDB4ZmY7ICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0gICAgICB9Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIHJldHVybiBzaXplOwkJCS8qIEJ5dGUgYWxpZ25tZW50IGlzIGZpbmUgKi8KLX0KLQotCi0vKiBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCBhIFBDIHJlbGF0aXZlIGp1bXAgc2hvdWxkIGJlIGNhbGN1bGF0ZWQsCi0gICBnaXZlbiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KLWxvbmcKLW1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4cCwgc2VjKQotICAgICBmaXhTICogZml4cDsKLSAgICAgc2VnVCBzZWM7Ci17Ci0jaWZkZWYgT0JKX0VMRgotICAvKiBJZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBvciBkZWZpbmVkIGluIGFub3RoZXIgc2VjdGlvbgotICAgICB3ZSBsZWF2ZSB0aGUgYWRkIG51bWJlciBhbG9uZSBmb3IgdGhlIGxpbmtlciB0byBmaXggaXQgbGF0ZXIuCi0gICAgIE9ubHkgYWNjb3VudCBmb3IgdGhlIFBDIHByZS1idW1wICh3aGljaCBpcyAyIGJ5dGVzIG9uIHRoZSBNQ29yZSkuICovCi0gIGlmIChmaXhwLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiAoISBTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KQotCSAgfHwgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBzZWMpKSkKLSAgICAgIAotICB7Ci0gICAgYXNzZXJ0IChmaXhwLT5meF9zaXplID09IDIpOwkvKiBtdXN0IGJlIGFuIGluc24gKi8KLSAgICByZXR1cm4gZml4cC0+Znhfc2l6ZTsKLSAgfQotI2VuZGlmCi0KLSAgLyogVGhlIGNhc2Ugd2hlcmUgd2UgYXJlIGdvaW5nIHRvIHJlc29sdmUgdGhpbmdzLi4uICovCi0gIHJldHVybiAgZml4cC0+Znhfc2l6ZSArIGZpeHAtPmZ4X3doZXJlICsgZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotI2RlZmluZSBGKFNaLFBDUkVMKQkJKCgoU1opIDw8IDEpICsgKFBDUkVMKSkKLSNkZWZpbmUgTUFQKFNaLFBDUkVMLFRZUEUpCWNhc2UgRiAoU1osIFBDUkVMKTogY29kZSA9IChUWVBFKTsgYnJlYWsKLQotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCi0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLSAgICAgZml4UyAqIGZpeHA7Ci17Ci0gIGFyZWxlbnQgKiByZWw7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotICBpbnQgaGFuZGxlZCA9IDA7Ci0KLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgICAgLyogVGhlc2UgY29uZnVzZSB0aGUgc2l6ZS9wY3JlbCBtYWNybyBhcHByb2FjaC4gKi8KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0OgotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyOgotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMjoKLSAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICAKLSAgICBkZWZhdWx0OgotICAgICAgc3dpdGNoIChGIChmaXhwLT5meF9zaXplLCBmaXhwLT5meF9wY3JlbCkpCi0gICAgICAgIHsKLSAgICAgICAgICBNQVAgKDEsIDAsIEJGRF9SRUxPQ184KTsKLSAgICAgICAgICBNQVAgKDIsIDAsIEJGRF9SRUxPQ18xNik7Ci0gICAgICAgICAgTUFQICg0LCAwLCBCRkRfUkVMT0NfMzIpOwotICAgICAgICAgIE1BUCAoMSwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotICAgICAgICAgIE1BUCAoMiwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgICAgICBNQVAgKDQsIDEsIEJGRF9SRUxPQ18zMl9QQ1JFTCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0JICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotICAgICAgICAgIGFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlICVzcmVsb2NhdGlvbiIpLAotCQkgIGZpeHAtPmZ4X3NpemUsCi0JICAgICAgICAgIGZpeHAtPmZ4X3BjcmVsID8gXygicGMtcmVsYXRpdmUiKSA6ICIiKTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZWwgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsLT5zeW1fcHRyX3B0ciA9ICYgZml4cC0+ZnhfYWRkc3ktPmJzeW07Ci0gIHJlbC0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgLyogQWx3YXlzIHBhc3MgdGhlIGFkZGVuZCBhbG9uZyEgICovCi0gIHJlbC0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotCi0gIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgY29kZSk7Ci0gIAotICBpZiAocmVsLT5ob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgXygiQ2Fubm90IHJlcHJlc2VudCByZWxvY2F0aW9uIHR5cGUgJXMiKSwKLSAgICAgICAgICAgICAgICAgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLSAgICAgIAotICAgICAgLyogU2V0IGhvd3RvIHRvIGEgZ2FyYmFnZSB2YWx1ZSBzbyB0aGF0IHdlIGNhbiBrZWVwIGdvaW5nLiAgKi8KLSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgQkZEX1JFTE9DXzMyKTsKLSAgICAgIGFzc2VydCAocmVsLT5ob3d0byAhPSBOVUxMKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlbDsKLX0KLQotI2lmZGVmIE9CSl9FTEYKLS8qIFNlZSB3aGV0aGVyIHdlIG5lZWQgdG8gZm9yY2UgYSByZWxvY2F0aW9uIGludG8gdGhlIG91dHB1dCBmaWxlLgotICAgVGhpcyBpcyB1c2VkIHRvIGZvcmNlIG91dCBzd2l0Y2ggYW5kIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zIHdoZW4KLSAgIHJlbGF4aW5nLiAgKi8KLWludAotbWNvcmVfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotICAgICBmaXhTICogZml4OwotewotICBpZiAoICAgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZml4IGNhbiBiZSBoYW5kbGVkIGJ5IEdBUywgZmFsc2UgaWYgaXQgbXVzdAotICAgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGxpbmtlci4gICovCi1ib29sZWFuCi1tY29yZV9maXhfYWRqdXN0YWJsZSAoZml4UCkKLSAgIGZpeFMgKiBmaXhQOwotewotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSAgCi0gIC8qIFdlIG5lZWQgdGhlIHN5bWJvbCBuYW1lIGZvciB0aGUgVlRBQkxFIGVudHJpZXMuICAqLwotICBpZiAoICAgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLnNlY3Rpb24gcHNldWRvLW9wLiAgVGhpcyBpcyBsaWtlIHRoZSB1c3VhbCBvbmUsIGJ1dCBpdAotICAgZHVtcHMgdGhlIGxpdGVyYWwgcG9vbCBiZWZvcmUgY2hhbmdpbmcgdGhlIHNlY3Rpb24uICAqLwotc3RhdGljIHZvaWQKLW1jb3JlX3Nfc2VjdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBkdW1wX2xpdGVyYWxzICgwKTsKLQotICBvYmpfZWxmX3NlY3Rpb24gKGlnbm9yZSk7Ci19Ci0jZW5kaWYgLyogT0JKX0VMRiAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tY29yZS5oIGIvZ2FzL2NvbmZpZy90Yy1tY29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTQ4N2M5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbWNvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtbWNvcmUuaAotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCi0KLSNpZm5kZWYJVENfTUNPUkUKLSNkZWZpbmUgVENfTUNPUkUgMQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAjZXJyb3IgTUNPUkUgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCi0jZW5kaWYKLQotI2RlZmluZSBUQVJHRVRfQVJDSAliZmRfYXJjaF9tY29yZQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLS8qIERvbid0IHdyaXRlIG91dCByZWxvY3MgZm9yIHBjcmVsIHN0dWZmLiAgKi8KLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoeCkgKCgoeCktPmZ4X2FkZHN5IHx8ICh4KS0+Znhfc3Vic3kpICYmIFwKLQkJCSAgICh4KS0+Znhfcl90eXBlIDwgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQpCi0KLSNkZWZpbmUgSUdOT1JFX05PTlNUQU5EQVJEX0VTQ0FQRVMKLQotI2RlZmluZSBUQ19SRUxPQ19NQU5HTEUoYSxiLGMpIHRjX3JlbG9jX21hbmdsZSAoYSwgYiwgYykKLQotLyogU29tZSBwc2V1ZG8tb3Agc2VtYW50aWMgZXh0ZW5zaW9ucy4gICovCi0jZGVmaW5lCVBTRVVET19MQ09NTV9PUFRJT05BTF9BTElHTgotCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICAgICAgICAJIk0uQ09SRSBHQVMgVmVyc2lvbiAyLjkuNCIKLSNkZWZpbmUgTElTVElOR19MSFNfQ09OVF9MSU5FUwk0Ci0KLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUJMQotI2RlZmluZSBDT0ZGX0ZMQUdTIAkxCi0KLS8qIFdlIHdhbnQgbG9jYWwgbGFiZWwgc3VwcG9ydC4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0gICAgIAotI2RlZmluZSBUQ19DT0ZGX1NJWkVNQUNIREVQKGZyYWcpIHRjX2NvZmZfc2l6ZW1hY2hkZXAgKGZyYWcpCi0gIAotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLSNkZWZpbmUgbWRfZW5kCW1kX21jb3JlX2VuZAotCi0vKiBXYW50IHRoZSBzZWN0aW9uIGluZm9ybWF0aW9uIHRvby4uLiAqLwotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gKEZJWFAsIFNFQykKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzICAvKiBXZSB3YW50IHRoZSBzZWdtZW50IGFzIHdlbGwuICAqLwotCi0KLQotI2lmZGVmICBPQkpfQ09GRgotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJKHRhcmdldF9iaWdfZW5kaWFuID8gInBlLW1jb3JlLWJpZyIgOiAicGUtbWNvcmUtbGl0dGxlIikKLQotI2RlZmluZSBUQVJHRVRfU1lNQk9MX0ZJRUxEUyAgaW50IHN5X2ZsYWdzIDsKLQotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0KLQotI2lmZGVmIE9CSl9FTEYKLQotI2RlZmluZSBUQVJHRVRfRk9STUFUICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJlbGYzMi1tY29yZS1iaWciIDogImVsZjMyLW1jb3JlLWxpdHRsZSIpCi0KLSNkZWZpbmUgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMgXAotICB7ICIuY3RvcnMiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSB9LCBcCi0gIHsgIi5kdG9ycyIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sIFwKLS8qIE90aGVyIHNwZWNpYWwgc2VjdGlvbnMgbm90IGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyOiAucmVnaW5mbywKLSAgIC5saWJsaXN0LCAuY29uZmxpY3QsIC5ncHRhYiwgLmdvdCwgLmR5bmFtaWMsIC5yZWwuZHluLiAgKi8KLQotLyogV2hlbiByZWxheGluZywgd2UgbmVlZCB0byBlbWl0IHZhcmlvdXMgcmVsb2NzIHdlIG90aGVyd2lzZSB3b3VsZG4ndC4gICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4KSBtY29yZV9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi1leHRlcm4gaW50IG1jb3JlX2ZvcmNlX3JlbG9jYXRpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIG1jb3JlX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotZXh0ZXJuIGJvb2xlYW4gbWNvcmVfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0KLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAotIyBlcnJvciBObyB0YXJnZXQgZm9ybWF0IHNwZWNpZmllZC4KLSNlbmRpZgotCi0jaW5jbHVkZSAic3RydWMtc3ltYm9sLmgiIC8qIEZvciBkZWZpbml0aW9uIG9mIHN5bWJvbFMgKi8KLSNpbmNsdWRlICJ3cml0ZS5oIiAgICAgICAgLyogRm9yIGRlZmluaXRpb24gb2YgZml4UyAqLwotICAKLWV4dGVybiB2b2lkICAgICAgbWRfYmVnaW4gICAgICAgICAgICBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX2Fzc2VtYmxlICAgICAgICAgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gc3ltYm9sUyAqIG1kX3VuZGVmaW5lZF9zeW1ib2wgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX21jb3JlX2VuZCAgICAgICAgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIGNoYXIgKiAgICBtZF9hdG9mICAgICAgICAgICAgIFBBUkFNUyAoKGludCwgY2hhciAqLCBpbnQgKikpOwotZXh0ZXJuIGludCAgICAgICBtZF9wYXJzZV9vcHRpb24gICAgIFBBUkFNUyAoKGludCwgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX3Nob3dfdXNhZ2UgICAgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX2NyZWF0ZV9zaG9ydF9qdW1wIAotICBQQVJBTVMgKChjaGFyICosIGFkZHJlc3NULCBhZGRyZXNzVCwgZnJhZ1MgKiwgc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX2NyZWF0ZV9sb25nX2p1bXAKLSAgUEFSQU1TICgoY2hhciAqLCBhZGRyZXNzVCwgYWRkcmVzc1QsIGZyYWdTICosIHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9jb252ZXJ0X2ZyYWcgICAgICAgICAgICAgICBQQVJBTVMgKChiZmQgKiwgc2VnVCwgZnJhZ1MgKikpOwotZXh0ZXJuIGludCAgICAgICBtZF9hcHBseV9maXgzICAgICAgICAgICAgICAgICBQQVJBTVMgKChmaXhTICosIHZhbHVlVCAqLCBzZWdUKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX29wZXJhbmQgICAgICAgICAgICAgICAgICAgIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLWV4dGVybiBpbnQgICAgICAgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggUEFSQU1TICgoZnJhZ1MgKiwgc2VnVCkpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgICAgICAgICAgICBQQVJBTVMgKChjaGFyICosIHZhbHVlVCwgaW50KSk7Ci1leHRlcm4gdmFsdWVUICAgIG1kX3NlY3Rpb25fYWxpZ24gICAgICAgICAgICAgIFBBUkFNUyAoKHNlZ1QsIHZhbHVlVCkpOwotZXh0ZXJuIGxvbmcgICAgICBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gICAgICAgICBQQVJBTVMgKChmaXhTICosIHNlZ1QpKTsKLWV4dGVybiBhcmVsZW50ICogdGNfZ2VuX3JlbG9jICAgICAgICAgICAgICAgICAgUEFSQU1TICgoYXNlY3Rpb24gKiwgZml4UyAqKSk7Ci0KLSNlbmRpZiAvKiBUQ19NQ09SRSAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1taXBzLmMgYi9nYXMvY29uZmlnL3RjLW1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4NjVmZC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1pcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDExNzgzICswLDAgQEAKLS8qIHRjLW1pcHMuYyAtLSBhc3NlbWJsZSBjb2RlIGZvciBhIE1JUFMgY2hpcC4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSB0aGUgT1NGIGFuZCBSYWxwaCBDYW1wYmVsbC4KLSAgIFdyaXR0ZW4gYnkgS2VpdGggS25vd2xlcyBhbmQgUmFscGggQ2FtcGJlbGwsIHdvcmtpbmcgaW5kZXBlbmRlbnRseS4KLSAgIE1vZGlmaWVkIGZvciBFQ09GRiBhbmQgUjQwMDAgc3VwcG9ydCBieSBJYW4gTGFuY2UgVGF5bG9yIG9mIEN5Z251cwotICAgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaWZkZWYgVVNFX1NUREFSRwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2VuZGlmCi0jaWZkZWYgVVNFX1ZBUkFSR1MKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIm9wY29kZS9taXBzLmgiCi0jaW5jbHVkZSAiaXRibC1vcHMuaCIKLQotI2lmZGVmIERFQlVHCi0jZGVmaW5lIERCRyh4KSBwcmludGYgeAotI2Vsc2UKLSNkZWZpbmUgREJHKHgpCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9NQVlCRV9FTEYKLS8qIENsZWFuIHVwIG5hbWVzcGFjZSBzbyB3ZSBjYW4gaW5jbHVkZSBvYmotZWxmLmggdG9vLiAgKi8KLXN0YXRpYyBpbnQgbWlwc19vdXRwdXRfZmxhdm9yIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgbWlwc19vdXRwdXRfZmxhdm9yICgpIHsgcmV0dXJuIE9VVFBVVF9GTEFWT1I7IH0KLSN1bmRlZiBPQkpfUFJPQ0VTU19TVEFCCi0jdW5kZWYgT1VUUFVUX0ZMQVZPUgotI3VuZGVmIFNfR0VUX0FMSUdOCi0jdW5kZWYgU19HRVRfU0laRQotI3VuZGVmIFNfU0VUX0FMSUdOCi0jdW5kZWYgU19TRVRfU0laRQotI3VuZGVmIFRBUkdFVF9TWU1CT0xfRklFTERTCi0jdW5kZWYgb2JqX2Zyb2JfZmlsZQotI3VuZGVmIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzCi0jdW5kZWYgb2JqX2Zyb2Jfc3ltYm9sCi0jdW5kZWYgb2JqX3BvcF9pbnNlcnQKLSN1bmRlZiBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MKLSN1bmRlZiBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUwotCi0jaW5jbHVkZSAib2JqLWVsZi5oIgotLyogRml4IGFueSBvZiB0aGVtIHRoYXQgd2UgYWN0dWFsbHkgY2FyZSBhYm91dC4gICovCi0jdW5kZWYgT1VUUFVUX0ZMQVZPUgotI2RlZmluZSBPVVRQVVRfRkxBVk9SIG1pcHNfb3V0cHV0X2ZsYXZvcigpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpCi0jaW5jbHVkZSAiZWxmL21pcHMuaCIKLSNlbmRpZgotCi0jaWZuZGVmIEVDT0ZGX0RFQlVHR0lORwotI2RlZmluZSBOT19FQ09GRl9ERUJVR0dJTkcKLSNkZWZpbmUgRUNPRkZfREVCVUdHSU5HIDAKLSNlbmRpZgotCi0jaW5jbHVkZSAiZWNvZmYuaCIKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi1zdGF0aWMgY2hhciAqbWlwc19yZWdtYXNrX2ZyYWc7Ci0jZW5kaWYKLQotI2RlZmluZSBBVCAgMQotI2RlZmluZSBUUkVHIDI0Ci0jZGVmaW5lIFBJQ19DQUxMX1JFRyAyNQotI2RlZmluZSBLVDAgMjYKLSNkZWZpbmUgS1QxIDI3Ci0jZGVmaW5lIEdQICAyOAotI2RlZmluZSBTUCAgMjkKLSNkZWZpbmUgRlAgIDMwCi0jZGVmaW5lIFJBICAzMQotCi0jZGVmaW5lIElMTEVHQUxfUkVHICgzMikKLQotLyogQWxsb3cgb3ZlcnJpZGUgb2Ygc3RhbmRhcmQgbGl0dGxlLWVuZGlhbiBFQ09GRiBmb3JtYXQuICAqLwotCi0jaWZuZGVmIEVDT0ZGX0xJVFRMRV9GT1JNQVQKLSNkZWZpbmUgRUNPRkZfTElUVExFX0ZPUk1BVCAiZWNvZmYtbGl0dGxlbWlwcyIKLSNlbmRpZgotCi1leHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOwotCi0vKiAxIGlzIHdlIHNob3VsZCB1c2UgdGhlIDY0IGJpdCBNSVBTIEVMRiBBQkksIDAgaWYgd2Ugc2hvdWxkIHVzZSB0aGUKLSAgIDMyIGJpdCBBQkkuICBUaGlzIGhhcyBubyBtZWFuaW5nIGZvciBFQ09GRi4KLSAgIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBpcyBhbHdheXMgMzIgYml0LCBldmVuIGlmICJjb25maWd1cmVkIiBmb3IKLSAgIDY0IGJpdCBbZS5nLiAtLXRhcmdldD1taXBzNjQtZWxmXS4gICovCi1zdGF0aWMgaW50IG1pcHNfNjQ7Ci0KLS8qIFRoZSBkZWZhdWx0IHRhcmdldCBmb3JtYXQgdG8gdXNlLiAgKi8KLWNvbnN0IGNoYXIgKgotbWlwc190YXJnZXRfZm9ybWF0ICgpCi17Ci0gIHN3aXRjaCAoT1VUUFVUX0ZMQVZPUikKLSAgICB7Ci0gICAgY2FzZSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cjoKLSAgICAgIHJldHVybiB0YXJnZXRfYmlnX2VuZGlhbiA/ICJhLm91dC1taXBzLWJpZyIgOiAiYS5vdXQtbWlwcy1saXR0bGUiOwotICAgIGNhc2UgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyOgotICAgICAgcmV0dXJuIHRhcmdldF9iaWdfZW5kaWFuID8gImVjb2ZmLWJpZ21pcHMiIDogRUNPRkZfTElUVExFX0ZPUk1BVDsKLSAgICBjYXNlIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXI6Ci0gICAgICByZXR1cm4gKHRhcmdldF9iaWdfZW5kaWFuCi0JICAgICAgPyAobWlwc182NCA/ICJlbGY2NC1iaWdtaXBzIiA6ICJlbGYzMi1iaWdtaXBzIikKLQkgICAgICA6IChtaXBzXzY0ID8gImVsZjY0LWxpdHRsZW1pcHMiIDogImVsZjMyLWxpdHRsZW1pcHMiKSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0vKiBUaGUgbmFtZSBvZiB0aGUgcmVhZG9ubHkgZGF0YSBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgUkRBVEFfU0VDVElPTl9OQU1FIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyIFwKLQkJCSAgICA/ICIuZGF0YSIgXAotCQkJICAgIDogT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIgXAotCQkJICAgID8gIi5yZGF0YSIgXAotCQkJICAgIDogT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyIFwKLQkJCSAgICA/ICIucm9kYXRhIiBcCi0JCQkgICAgOiAoYWJvcnQgKCksICIiKSkKLQotLyogVGhpcyBpcyB0aGUgc2V0IG9mIG9wdGlvbnMgd2hpY2ggbWF5IGJlIG1vZGlmaWVkIGJ5IHRoZSAuc2V0Ci0gICBwc2V1ZG8tb3AuICBXZSB1c2UgYSBzdHJ1Y3Qgc28gdGhhdCAuc2V0IHB1c2ggYW5kIC5zZXQgcG9wIGFyZSBtb3JlCi0gICByZWxpYWJsZS4gICovCi0KLXN0cnVjdCBtaXBzX3NldF9vcHRpb25zCi17Ci0gIC8qIE1JUFMgSVNBIChJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlKSBsZXZlbC4gIFRoaXMgaXMgc2V0IHRvIC0xCi0gICAgIGlmIGl0IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gIENoYW5nZWQgYnkgYC5zZXQgbWlwc04nLCBhbmQgdGhlCi0gICAgIC1taXBzTiBjb21tYW5kIGxpbmUgb3B0aW9uLCBhbmQgdGhlIGRlZmF1bHQgQ1BVLiAgKi8KLSAgaW50IGlzYTsKLSAgLyogV2hldGhlciB3ZSBhcmUgYXNzZW1ibGluZyBmb3IgdGhlIG1pcHMxNiBwcm9jZXNzb3IuICAwIGlmIHdlIGFyZQotICAgICBub3QsIDEgaWYgd2UgYXJlLCBhbmQgLTEgaWYgdGhlIHZhbHVlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4KLSAgICAgQ2hhbmdlZCBieSBgLnNldCBtaXBzMTYnIGFuZCBgLnNldCBub21pcHMxNicsIGFuZCB0aGUgLW1pcHMxNiBhbmQKLSAgICAgLW5vbWlwczE2IGNvbW1hbmQgbGluZSBvcHRpb25zLCBhbmQgdGhlIGRlZmF1bHQgQ1BVLiAgKi8KLSAgaW50IG1pcHMxNjsKLSAgLyogTm9uLXplcm8gaWYgd2Ugc2hvdWxkIG5vdCByZW9yZGVyIGluc3RydWN0aW9ucy4gIENoYW5nZWQgYnkgYC5zZXQKLSAgICAgcmVvcmRlcicgYW5kIGAuc2V0IG5vcmVvcmRlcicuICAqLwotICBpbnQgbm9yZW9yZGVyOwotICAvKiBOb24temVybyBpZiB3ZSBzaG91bGQgbm90IHBlcm1pdCB0aGUgJGF0ICgkMSkgcmVnaXN0ZXIgdG8gYmUgdXNlZAotICAgICBpbiBpbnN0cnVjdGlvbnMuICBDaGFuZ2VkIGJ5IGAuc2V0IGF0JyBhbmQgYC5zZXQgbm9hdCcuICAqLwotICBpbnQgbm9hdDsKLSAgLyogTm9uLXplcm8gaWYgd2Ugc2hvdWxkIHdhcm4gd2hlbiBhIG1hY3JvIGluc3RydWN0aW9uIGV4cGFuZHMgaW50bwotICAgICBtb3JlIHRoYW4gb25lIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uICBDaGFuZ2VkIGJ5IGAuc2V0IG5vbWFjcm8nIGFuZAotICAgICBgLnNldCBtYWNybycuICAqLwotICBpbnQgd2Fybl9hYm91dF9tYWNyb3M7Ci0gIC8qIE5vbi16ZXJvIGlmIHdlIHNob3VsZCBub3QgbW92ZSBpbnN0cnVjdGlvbnMuICBDaGFuZ2VkIGJ5IGAuc2V0Ci0gICAgIG1vdmUnLCBgLnNldCB2b2xhdGlsZScsIGAuc2V0IG5vbW92ZScsIGFuZCBgLnNldCBub3ZvbGF0aWxlJy4gICovCi0gIGludCBub21vdmU7Ci0gIC8qIE5vbi16ZXJvIGlmIHdlIHNob3VsZCBub3Qgb3B0aW1pemUgYnJhbmNoZXMgYnkgbW92aW5nIHRoZSB0YXJnZXQKLSAgICAgb2YgdGhlIGJyYW5jaCBpbnRvIHRoZSBkZWxheSBzbG90LiAgQWN0dWFsbHksIHdlIGRvbid0IHBlcmZvcm0KLSAgICAgdGhpcyBvcHRpbWl6YXRpb24gYW55aG93LiAgQ2hhbmdlZCBieSBgLnNldCBib3B0JyBhbmQgYC5zZXQKLSAgICAgbm9ib3B0Jy4gICovCi0gIGludCBub2JvcHQ7Ci0gIC8qIE5vbi16ZXJvIGlmIHdlIHNob3VsZCBub3QgYXV0b2V4dGVuZCBtaXBzMTYgaW5zdHJ1Y3Rpb25zLgotICAgICBDaGFuZ2VkIGJ5IGAuc2V0IGF1dG9leHRlbmQnIGFuZCBgLnNldCBub2F1dG9leHRlbmQnLiAgKi8KLSAgaW50IG5vYXV0b2V4dGVuZDsKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIHN0cnVjdCB3ZSB1c2UgdG8gaG9sZCB0aGUgY3VycmVudCBzZXQgb2Ygb3B0aW9ucy4gIE5vdGUKLSAgIHRoYXQgd2UgbXVzdCBzZXQgdGhlIGlzYSBhbmQgbWlwczE2IGZpZWxkcyB0byAtMSB0byBpbmRpY2F0ZSB0aGF0Ci0gICB0aGV5IGhhdmUgbm90IGJlZW4gaW5pdGlhbGl6ZWQuICAqLwotCi1zdGF0aWMgc3RydWN0IG1pcHNfc2V0X29wdGlvbnMgbWlwc19vcHRzID0geyAtMSwgLTEgfTsKLQotLyogVGhlc2UgdmFyaWFibGVzIGFyZSBmaWxsZWQgaW4gd2l0aCB0aGUgbWFza3Mgb2YgcmVnaXN0ZXJzIHVzZWQuCi0gICBUaGUgb2JqZWN0IGZvcm1hdCBjb2RlIHJlYWRzIHRoZW0gYW5kIHB1dHMgdGhlbSBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgIHBsYWNlLiAgKi8KLXVuc2lnbmVkIGxvbmcgbWlwc19ncHJtYXNrOwotdW5zaWduZWQgbG9uZyBtaXBzX2Nwcm1hc2tbNF07Ci0KLS8qIE1JUFMgSVNBIHdlIGFyZSB1c2luZyBmb3IgdGhpcyBvdXRwdXQgZmlsZS4gICovCi1zdGF0aWMgaW50IGZpbGVfbWlwc19pc2E7Ci0KLS8qIFRoZSBDUFUgdHlwZSBhcyBhIG51bWJlcjogMjAwMCwgMzAwMCwgNDAwMCwgNDQwMCwgZXRjLiAgKi8KLXN0YXRpYyBpbnQgbWlwc19jcHUgPSAtMTsKLQotLyogVGhlIGFyZ3VtZW50IG9mIHRoZSAtbWFiaT0gZmxhZy4gKi8KLXN0YXRpYyBjaGFyKiBtaXBzX2FiaV9zdHJpbmcgPSAwOwotCi0vKiBXZXRoZXIgd2Ugc2hvdWxkIG1hcmsgdGhlIGZpbGUgRUFCSTY0IG9yIEVBQkkzMi4gKi8KLXN0YXRpYyBpbnQgbWlwc19lYWJpNjQgPSAwOwotCi0vKiBJZiB0aGV5IGFza2VkIGZvciBtaXBzMSBvciBtaXBzMiBhbmQgYSBjcHUgdGhhdCBpcwotICAgbWlwczMgb3IgZ3JlYXRlciwgdGhlbiBtYXJrIHRoZSBvYmplY3QgZmlsZSAzMkJJVE1PREUuICovCi1zdGF0aWMgaW50IG1pcHNfMzJiaXRtb2RlID0gMDsKLQotLyogV2hldGhlciB0aGUgcHJvY2Vzc29yIHVzZXMgaGFyZHdhcmUgaW50ZXJsb2NrcyB0byBwcm90ZWN0IAotICAgcmVhZHMgZnJvbSB0aGUgSEkgYW5kIExPIHJlZ2lzdGVycywgYW5kIHRodXMgZG9lcyBub3QKLSAgIHJlcXVpcmUgbm9wcyB0byBiZSBpbnNlcnRlZC4KLQotICAgRklYTUU6IEdDQyBtYWtlcyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gLW1jcHU9Rk9PIGFuZCAtbUZPTzoKLSAgIC1tY3B1PUZPTyBzY2hlZHVsZXMgZm9yIEZPTywgYnV0IHN0aWxsIHByb2R1Y2VzIGNvZGUgdGhhdCBtZWV0cyB0aGUKLSAgIHJlcXVpcmVtZW50cyBvZiBNSVBTIElTQSBJLiAgRm9yIGV4YW1wbGUsIGl0IHdvbid0IGdlbmVyYXRlIGFueQotICAgRk9PLXNwZWNpZmljIGluc3RydWN0aW9ucywgYW5kIGl0IHdpbGwgc3RpbGwgYXNzdW1lIHRoYXQgYW55Ci0gICBzY2hlZHVsaW5nIGhhemFyZHMgZGVzY3JpYmVkIGluIE1JUFMgSVNBIEkgYXJlIHRoZXJlLCBldmVuIGlmIEZPTwotICAgaGFzIGludGVybG9ja3MuICAtbUZPTyBnaXZlcyBHQ0MgcGVybWlzc2lvbiB0byBnZW5lcmF0ZSBjb2RlIHRoYXQKLSAgIHdpbGwgb25seSBydW4gb24gYSBGT087IGl0IHdpbGwgZ2VuZXJhdGUgRk9PLXNwZWNpZmljIGluc3RydWN0aW9ucywKLSAgIGFuZCBhc3N1bWUgaW50ZXJsb2NrcyBwcm92aWRlZCBieSBhIEZPTy4KLQotICAgSG93ZXZlciwgR0FTIGN1cnJlbnRseSBkb2Vzbid0IG1ha2UgdGhpcyBkaXN0aW5jdGlvbjsgYmVmb3JlIEphbiAyOAotICAgMTk5OSwgR0FTJ3MgLW1jcHU9Rk9PIGltcGxpZWQgLW1GT08sIHdoaWNoIHZpb2xhdGVzIEdDQydzCi0gICBhc3N1bXB0aW9ucy4gIFRoZSBHQ0MgZHJpdmVyIHBhc3NlcyB0aGVzZSBmbGFncyB0aHJvdWdoIHRvIEdBUywgc28KLSAgIGlmIEdBUyBhY3R1YWxseSBkb2VzIGFueXRoaW5nIHRoYXQgZG9lc24ndCBtZWV0IE1JUFMgSVNBIEkgd2l0aAotICAgLW1GT08sIHRoZW4gR0NDJ3MgLW1jcHU9Rk9PIGZsYWcgaXNuJ3QgZ29pbmcgdG8gd29yay4KLQotICAgQW5kIGZ1cnRoZXJtb3JlLCBpdCBkaWQgbm90IGFzc3VtZSB0aGF0IC1tRk9PIGltcGxpZWQgLW1jcHU9Rk9PLAotICAgd2hpY2ggc2VlbXMgc2Vuc2VsZXNzIC0tLSB3aHkgZ2VuZXJhdGUgY29kZSB3aGljaCB3aWxsIG9ubHkgcnVuIG9uCi0gICBhIEZPTywgYnV0IHNjaGVkdWxlIGZvciBzb21ldGhpbmcgZWxzZT8KLQotICAgU28gbm93LCBhdCBsZWFzdCwgLW1jcHU9Rk9PIGFuZCAtbUZPTyBhcmUgZXhhY3RseSBlcXVpdmFsZW50LgotCi0gICAtLSBKaW0gQmxhbmR5IDxqaW1iQGN5Z251cy5jb20+ICovCi0KLSNkZWZpbmUgaGlsb19pbnRlcmxvY2tzIChtaXBzX2NwdSA9PSA0MDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICkKLQotLyogV2hldGhlciB0aGUgcHJvY2Vzc29yIHVzZXMgaGFyZHdhcmUgaW50ZXJsb2NrcyB0byBwcm90ZWN0IHJlYWRzCi0gICBmcm9tIHRoZSBHUFJzLCBhbmQgdGh1cyBkb2VzIG5vdCByZXF1aXJlIG5vcHMgdG8gYmUgaW5zZXJ0ZWQuICAqLwotI2RlZmluZSBncHJfaW50ZXJsb2NrcyBcCi0gIChtaXBzX29wdHMuaXNhID49IDIgIFwKLSAgIHx8IG1pcHNfY3B1ID09IDM5MDApCi0KLS8qIEFzIHdpdGggb3RoZXIgImludGVybG9ja3MiIHRoaXMgaXMgdXNlZCBieSBoYXJkd2FyZSB0aGF0IGhhcyBGUAotICAgKGNvLXByb2Nlc3NvcikgaW50ZXJsb2Nrcy4gICovCi0vKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0jZGVmaW5lIGNvcF9pbnRlcmxvY2tzIChtaXBzX2NwdSA9PSA0MzAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSkKLQotLyogTUlQUyBQSUMgbGV2ZWwuICAqLwotCi1lbnVtIG1pcHNfcGljX2xldmVsCi17Ci0gIC8qIERvIG5vdCBnZW5lcmF0ZSBQSUMgY29kZS4gICovCi0gIE5PX1BJQywKLQotICAvKiBHZW5lcmF0ZSBQSUMgY29kZSBhcyBpbiBJcml4IDQuICBUaGlzIGlzIG5vdCBpbXBsZW1lbnRlZCwgYW5kIEknbQotICAgICBub3Qgc3VyZSB3aGF0IGl0IGlzIHN1cHBvc2VkIHRvIGRvLiAgKi8KLSAgSVJJWDRfUElDLAotCi0gIC8qIEdlbmVyYXRlIFBJQyBjb2RlIGFzIGluIHRoZSBTVlI0IE1JUFMgQUJJLiAgKi8KLSAgU1ZSNF9QSUMsCi0KLSAgLyogR2VuZXJhdGUgUElDIGNvZGUgd2l0aG91dCB1c2luZyBhIGdsb2JhbCBvZmZzZXQgdGFibGU6IHRoZSBkYXRhCi0gICAgIHNlZ21lbnQgaGFzIGEgbWF4aW11bSBzaXplIG9mIDY0SywgYWxsIGRhdGEgcmVmZXJlbmNlcyBhcmUgb2ZmCi0gICAgIHRoZSAkZ3AgcmVnaXN0ZXIsIGFuZCBhbGwgdGV4dCByZWZlcmVuY2VzIGFyZSBQQyByZWxhdGl2ZS4gIFRoaXMKLSAgICAgaXMgdXNlZCBvbiBzb21lIGVtYmVkZGVkIHN5c3RlbXMuICAqLwotICBFTUJFRERFRF9QSUMKLX07Ci0KLXN0YXRpYyBlbnVtIG1pcHNfcGljX2xldmVsIG1pcHNfcGljOwotCi0vKiAxIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSAzMiBiaXQgb2Zmc2V0cyBmcm9tIHRoZSBHUCByZWdpc3RlciBpbgotICAgU1ZSNF9QSUMgbW9kZS4gIEN1cnJlbnRseSBoYXMgbm8gbWVhbmluZyBpbiBvdGhlciBtb2Rlcy4gICovCi1zdGF0aWMgaW50IG1pcHNfYmlnX2dvdDsKLQotLyogMSBpZiB0cmFwIGluc3RydWN0aW9ucyBzaG91bGQgdXNlZCBmb3Igb3ZlcmZsb3cgcmF0aGVyIHRoYW4gYnJlYWsKLSAgIGluc3RydWN0aW9ucy4gICovCi1zdGF0aWMgaW50IG1pcHNfdHJhcDsKLQotLyogTm9uLXplcm8gaWYgYW55IC5zZXQgbm9yZW9yZGVyIGRpcmVjdGl2ZXMgd2VyZSB1c2VkLiAgKi8KLQotc3RhdGljIGludCBtaXBzX2FueV9ub3Jlb3JkZXI7Ci0KLS8qIFRoZSBzaXplIG9mIHRoZSBzbWFsbCBkYXRhIHNlY3Rpb24uICAqLwotc3RhdGljIGludCBnX3N3aXRjaF92YWx1ZSA9IDg7Ci0vKiBXaGV0aGVyIHRoZSAtRyBvcHRpb24gd2FzIHVzZWQuICAqLwotc3RhdGljIGludCBnX3N3aXRjaF9zZWVuID0gMDsKLQotI2RlZmluZSBOX1JNQVNLIDB4YzQKLSNkZWZpbmUgTl9WRlAgICAweGQ0Ci0KLS8qIElmIHdlIGNhbiBkZXRlcm1pbmUgaW4gYWR2YW5jZSB0aGF0IEdQIG9wdGltaXphdGlvbiB3b24ndCBiZQotICAgcG9zc2libGUsIHdlIGNhbiBza2lwIHRoZSByZWxheGF0aW9uIHN0dWZmIHRoYXQgdHJpZXMgdG8gcHJvZHVjZQotICAgR1AtcmVsYXRpdmUgcmVmZXJlbmNlcy4gIFRoaXMgbWFrZXMgZGVsYXkgc2xvdCBvcHRpbWl6YXRpb24gd29yawotICAgYmV0dGVyLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IHByb3ZpZGUgYSBndWVzcywgYnV0IGl0IHNlZW1zIHRvIHdvcmsgZm9yCi0gICBnY2Mgb3V0cHV0LiAgSWYgaXQgZ3Vlc3NlcyB3cm9uZywgdGhlIG9ubHkgbG9zcyBzaG91bGQgYmUgaW4KLSAgIGVmZmljaWVuY3k7IGl0IHNob3VsZG4ndCBpbnRyb2R1Y2UgYW55IGJ1Z3MuCi0KLSAgIEkgZG9uJ3Qga25vdyBpZiBhIGZpeCBpcyBuZWVkZWQgZm9yIHRoZSBTVlI0X1BJQyBtb2RlLiAgSSd2ZSBvbmx5Ci0gICBmaXhlZCBpdCBmb3IgdGhlIG5vbi1QSUMgbW9kZS4gIEtSIDk1LzA0LzA3ICAqLwotc3RhdGljIGludCBub3BpY19uZWVkX3JlbGF4IFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50KSk7Ci0KLS8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoID0gTlVMTDsKLQotLyogVGhlIG9wY29kZSBoYXNoIHRhYmxlIHdlIHVzZSBmb3IgdGhlIG1pcHMxNi4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqbWlwczE2X29wX2hhc2ggPSBOVUxMOwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJwotICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0ICovCi0vKiBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKLSAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LiAqLwotLyogQWxzbyBub3RlIHRoYXQgQyBzdHlsZSBjb21tZW50cyBhcmUgYWx3YXlzIHN1cHBvcnRlZC4gICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIG1hY2hpbmUgc3BlY2lmaWMgbGluZSBzZXBhcmF0b3IgY2hhcmFjdGVycy4gKi8KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotLyogQWxzbyBiZSBhd2FyZSB0aGF0IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCBtYXkgaGF2ZSB0byBiZQotICAgY2hhbmdlZCBpbiByZWFkLmMgLiAgSWRlYWxseSBpdCBzaG91bGRuJ3QgaGF2ZSB0byBrbm93IGFib3V0IGl0IGF0IGFsbCwKLSAgIGJ1dCBub3RoaW5nIGlzIGlkZWFsIGFyb3VuZCBoZXJlLgotICovCi0KLXN0YXRpYyBjaGFyICppbnNuX2Vycm9yOwotCi1zdGF0aWMgaW50IGF1dG9fYWxpZ24gPSAxOwotCi0vKiBXaGVuIG91dHB1dHRpbmcgU1ZSNCBQSUMgY29kZSwgdGhlIGFzc2VtYmxlciBuZWVkcyB0byBrbm93IHRoZQotICAgb2Zmc2V0IGluIHRoZSBzdGFjayBmcmFtZSBmcm9tIHdoaWNoIHRvIHJlc3RvcmUgdGhlICRncCByZWdpc3Rlci4KLSAgIFRoaXMgaXMgc2V0IGJ5IHRoZSAuY3ByZXN0b3JlIHBzZXVkby1vcCwgYW5kIHNhdmVkIGluIHRoaXMKLSAgIHZhcmlhYmxlLiAgKi8KLXN0YXRpYyBvZmZzZXRUIG1pcHNfY3ByZXN0b3JlX29mZnNldCA9IC0xOwotCi0vKiBUaGlzIGlzIHRoZSByZWdpc3RlciB3aGljaCBob2xkcyB0aGUgc3RhY2sgZnJhbWUsIGFzIHNldCBieSB0aGUKLSAgIC5mcmFtZSBwc2V1ZG8tb3AuICBUaGlzIGlzIG5lZWRlZCB0byBpbXBsZW1lbnQgLmNwcmVzdG9yZS4gICovCi1zdGF0aWMgaW50IG1pcHNfZnJhbWVfcmVnID0gU1A7Ci0KLS8qIFRvIG91dHB1dCBOT1AgaW5zdHJ1Y3Rpb25zIGNvcnJlY3RseSwgd2UgbmVlZCB0byBrZWVwIGluZm9ybWF0aW9uCi0gICBhYm91dCB0aGUgcHJldmlvdXMgdHdvIGluc3RydWN0aW9ucy4gICovCi0KLS8qIFdoZXRoZXIgd2UgYXJlIG9wdGltaXppbmcuICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiAyIG1lYW5zIHRvIHJlbW92ZQotICAgdW5uZWVkZWQgTk9QcyBhbmQgc3dhcCBicmFuY2ggaW5zdHJ1Y3Rpb25zIHdoZW4gcG9zc2libGUuICBBIHZhbHVlCi0gICBvZiAxIG1lYW5zIHRvIG5vdCBzd2FwIGJyYW5jaGVzLiAgQSB2YWx1ZSBvZiAwIG1lYW5zIHRvIGFsd2F5cwotICAgaW5zZXJ0IE5PUHMuICAqLwotc3RhdGljIGludCBtaXBzX29wdGltaXplID0gMjsKLQotLyogRGVidWdnaW5nIGxldmVsLiAgLWcgc2V0cyB0aGlzIHRvIDIuICAtZ04gc2V0cyB0aGlzIHRvIE4uICAtZzAgaXMKLSAgIGVxdWl2YWxlbnQgdG8gc2VlaW5nIG5vIC1nIG9wdGlvbiBhdCBhbGwuICAqLwotc3RhdGljIGludCBtaXBzX2RlYnVnID0gMDsKLQotLyogVGhlIHByZXZpb3VzIGluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbWlwc19jbF9pbnNuIHByZXZfaW5zbjsKLQotLyogVGhlIGluc3RydWN0aW9uIGJlZm9yZSBwcmV2X2luc24uICAqLwotc3RhdGljIHN0cnVjdCBtaXBzX2NsX2luc24gcHJldl9wcmV2X2luc247Ci0KLS8qIElmIHdlIGRvbid0IHdhbnQgaW5mb3JtYXRpb24gZm9yIHByZXZfaW5zbiBvciBwcmV2X3ByZXZfaW5zbiwgd2UKLSAgIHBvaW50IHRoZSBpbnNuX21vIGZpZWxkIGF0IHRoaXMgZHVtbXkgaW50ZWdlci4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlIGR1bW15X29wY29kZSA9IHsgMCB9OwotCi0vKiBOb24temVybyBpZiBwcmV2X2luc24gaXMgdmFsaWQuICAqLwotc3RhdGljIGludCBwcmV2X2luc25fdmFsaWQ7Ci0KLS8qIFRoZSBmcmFnIGZvciB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIHN0cnVjdCBmcmFnICpwcmV2X2luc25fZnJhZzsKLQotLyogVGhlIG9mZnNldCBpbnRvIHByZXZfaW5zbl9mcmFnIGZvciB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIGxvbmcgcHJldl9pbnNuX3doZXJlOwotCi0vKiBUaGUgcmVsb2MgdHlwZSBmb3IgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLCBpZiBhbnkuICAqLwotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBwcmV2X2luc25fcmVsb2NfdHlwZTsKLQotLyogVGhlIHJlbG9jIGZvciB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24sIGlmIGFueS4gICovCi1zdGF0aWMgZml4UyAqcHJldl9pbnNuX2ZpeHA7Ci0KLS8qIE5vbi16ZXJvIGlmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgaW4gYSBkZWxheSBzbG90LiAgKi8KLXN0YXRpYyBpbnQgcHJldl9pbnNuX2lzX2RlbGF5X3Nsb3Q7Ci0KLS8qIE5vbi16ZXJvIGlmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgaW4gYSAuc2V0IG5vcmVvcmRlci4gICovCi1zdGF0aWMgaW50IHByZXZfaW5zbl91bnJlb3JkZXJlZDsKLQotLyogTm9uLXplcm8gaWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHVzZXMgYW4gZXh0ZW5kIG9wY29kZSAoaWYKLSAgIG1pcHMxNikuICAqLwotc3RhdGljIGludCBwcmV2X2luc25fZXh0ZW5kZWQ7Ci0KLS8qIE5vbi16ZXJvIGlmIHRoZSBwcmV2aW91cyBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgaW4gYSAuc2V0Ci0gICBub3Jlb3JkZXIuICAqLwotc3RhdGljIGludCBwcmV2X3ByZXZfaW5zbl91bnJlb3JkZXJlZDsKLQotLyogSWYgdGhpcyBpcyBzZXQsIGl0IHBvaW50cyB0byBhIGZyYWcgaG9sZGluZyBub3AgaW5zdHJ1Y3Rpb25zIHdoaWNoCi0gICB3ZXJlIGluc2VydGVkIGJlZm9yZSB0aGUgc3RhcnQgb2YgYSBub3Jlb3JkZXIgc2VjdGlvbi4gIElmIHRob3NlCi0gICBub3BzIHR1cm4gb3V0IHRvIGJlIHVubmVjZXNzYXJ5LCB0aGUgc2l6ZSBvZiB0aGUgZnJhZyBjYW4gYmUKLSAgIGRlY3JlYXNlZC4gICovCi1zdGF0aWMgZnJhZ1MgKnByZXZfbm9wX2ZyYWc7Ci0KLS8qIFRoZSBudW1iZXIgb2Ygbm9wIGluc3RydWN0aW9ucyB3ZSBjcmVhdGVkIGluIHByZXZfbm9wX2ZyYWcuICAqLwotc3RhdGljIGludCBwcmV2X25vcF9mcmFnX2hvbGRzOwotCi0vKiBUaGUgbnVtYmVyIG9mIG5vcCBpbnN0cnVjdGlvbnMgdGhhdCB3ZSBrbm93IHdlIG5lZWQgaW4KLSAgIHByZXZfbm9wX2ZyYWcuICovCi1zdGF0aWMgaW50IHByZXZfbm9wX2ZyYWdfcmVxdWlyZWQ7Ci0KLS8qIFRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHdlJ3ZlIHNlZW4gc2luY2UgcHJldl9ub3BfZnJhZy4gICovCi1zdGF0aWMgaW50IHByZXZfbm9wX2ZyYWdfc2luY2U7Ci0KLS8qIEZvciBFQ09GRiBhbmQgRUxGLCByZWxvY2F0aW9ucyBhZ2FpbnN0IHN5bWJvbHMgYXJlIGRvbmUgaW4gdHdvCi0gICBwYXJ0cywgd2l0aCBhIEhJIHJlbG9jYXRpb24gYW5kIGEgTE8gcmVsb2NhdGlvbi4gIEVhY2ggcmVsb2NhdGlvbgotICAgaGFzIG9ubHkgMTYgYml0cyBvZiBzcGFjZSB0byBzdG9yZSBhbiBhZGRlbmQuICBUaGlzIG1lYW5zIHRoYXQgaW4KLSAgIG9yZGVyIGZvciB0aGUgbGlua2VyIHRvIGhhbmRsZSBjYXJyaWVzIGNvcnJlY3RseSwgaXQgbXVzdCBiZSBhYmxlCi0gICB0byBsb2NhdGUgYm90aCB0aGUgSEkgYW5kIHRoZSBMTyByZWxvY2F0aW9uLiAgVGhpcyBtZWFucyB0aGF0IHRoZQotICAgcmVsb2NhdGlvbnMgbXVzdCBhcHBlYXIgaW4gb3JkZXIgaW4gdGhlIHJlbG9jYXRpb24gdGFibGUuCi0KLSAgIEluIG9yZGVyIHRvIGltcGxlbWVudCB0aGlzLCB3ZSBrZWVwIHRyYWNrIG9mIGVhY2ggdW5tYXRjaGVkIEhJCi0gICByZWxvY2F0aW9uLiAgV2UgdGhlbiBzb3J0IHRoZW0gc28gdGhhdCB0aGV5IGltbWVkaWF0ZWx5IHByZWNlZGUgdGhlCi0gICBjb3JyZXNwb25kaW5nIExPIHJlbG9jYXRpb24uICovCi0KLXN0cnVjdCBtaXBzX2hpX2ZpeHVwCi17Ci0gIC8qIE5leHQgSEkgZml4dXAuICAqLwotICBzdHJ1Y3QgbWlwc19oaV9maXh1cCAqbmV4dDsKLSAgLyogVGhpcyBmaXh1cC4gICovCi0gIGZpeFMgKmZpeHA7Ci0gIC8qIFRoZSBzZWN0aW9uIHRoaXMgZml4dXAgaXMgaW4uICAqLwotICBzZWdUIHNlZzsKLX07Ci0KLS8qIFRoZSBsaXN0IG9mIHVubWF0Y2hlZCBISSByZWxvY3MuICAqLwotCi1zdGF0aWMgc3RydWN0IG1pcHNfaGlfZml4dXAgKm1pcHNfaGlfZml4dXBfbGlzdDsKLQotLyogTWFwIG5vcm1hbCBNSVBTIHJlZ2lzdGVyIG51bWJlcnMgdG8gbWlwczE2IHJlZ2lzdGVyIG51bWJlcnMuICAqLwotCi0jZGVmaW5lIFggSUxMRUdBTF9SRUcKLXN0YXRpYyBjb25zdCBpbnQgbWlwczMyX3RvXzE2X3JlZ19tYXBbXSA9Ci17Ci0gIFgsIFgsIDIsIDMsIDQsIDUsIDYsIDcsCi0gIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCi0gIDAsIDEsIFgsIFgsIFgsIFgsIFgsIFgsCi0gIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgKLX07Ci0jdW5kZWYgWAotCi0vKiBNYXAgbWlwczE2IHJlZ2lzdGVyIG51bWJlcnMgdG8gbm9ybWFsIE1JUFMgcmVnaXN0ZXIgbnVtYmVycy4gICovCi0KLXN0YXRpYyBjb25zdCBpbnQgbWlwczE2X3RvXzMyX3JlZ19tYXBbXSA9Ci17Ci0gIDE2LCAxNywgMiwgMywgNCwgNSwgNiwgNwotfTsKLQwKLS8qIFNpbmNlIHRoZSBNSVBTIGRvZXMgbm90IGhhdmUgbXVsdGlwbGUgZm9ybXMgb2YgUEMgcmVsYXRpdmUKLSAgIGluc3RydWN0aW9ucywgd2UgZG8gbm90IGhhdmUgdG8gZG8gcmVsYXhpbmcgYXMgaXMgZG9uZSBvbiBvdGhlcgotICAgcGxhdGZvcm1zLiAgSG93ZXZlciwgd2UgZG8gaGF2ZSB0byBoYW5kbGUgR1AgcmVsYXRpdmUgYWRkcmVzc2luZwotICAgY29ycmVjdGx5LCB3aGljaCB0dXJucyBvdXQgdG8gYmUgYSBzaW1pbGFyIHByb2JsZW0uCi0KLSAgIEV2ZXJ5IG1hY3JvIHRoYXQgcmVmZXJzIHRvIGEgc3ltYm9sIGNhbiBvY2N1ciBpbiAoYXQgbGVhc3QpIHR3bwotICAgZm9ybXMsIG9uZSB3aXRoIEdQIHJlbGF0aXZlIGFkZHJlc3NpbmcgYW5kIG9uZSB3aXRob3V0LiAgRm9yCi0gICBleGFtcGxlLCBsb2FkaW5nIGEgZ2xvYmFsIHZhcmlhYmxlIGludG8gYSByZWdpc3RlciBnZW5lcmFsbHkgdXNlcwotICAgYSBtYWNybyBpbnN0cnVjdGlvbiBsaWtlIHRoaXM6Ci0gICAgIGx3ICQ0LGkKLSAgIElmIGkgY2FuIGJlIGFkZHJlc3NlZCBvZmYgdGhlIEdQIHJlZ2lzdGVyICh0aGlzIGlzIHRydWUgaWYgaXQgaXMgaW4KLSAgIHRoZSAuc2JzcyBvciAuc2RhdGEgc2VjdGlvbiwgb3IgaWYgaXQgaXMga25vd24gdG8gYmUgc21hbGxlciB0aGFuCi0gICB0aGUgLUcgYXJndW1lbnQpIHRoaXMgd2lsbCBnZW5lcmF0ZSB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uOgotICAgICBsdyAkNCxpKCRncCkKLSAgIFRoaXMgaW5zdHJ1Y3Rpb24gd2lsbCB1c2UgYSBHUFJFTCByZWxvYy4gIElmIGkgY2FuIG5vdCBiZSBhZGRyZXNzZWQKLSAgIG9mZiB0aGUgR1AgcmVnaXN0ZXIsIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24gc2VxdWVuY2Ugd2lsbCBiZSB1c2VkOgotICAgICBsdWkgJGF0LGkKLSAgICAgbHcgJDQsaSgkYXQpCi0gICBJbiB0aGlzIGNhc2UgdGhlIGZpcnN0IGluc3RydWN0aW9uIHdpbGwgaGF2ZSBhIEhJMTYgcmVsb2MsIGFuZCB0aGUKLSAgIHNlY29uZCByZWxvYyB3aWxsIGhhdmUgYSBMTzE2IHJlbG9jLiAgQm90aCByZWxvY3Mgd2lsbCBiZSBhZ2FpbnN0Ci0gICB0aGUgc3ltYm9sIGkuCi0KLSAgIFRoZSBpc3N1ZSBoZXJlIGlzIHRoYXQgd2UgbWF5IG5vdCBrbm93IHdoZXRoZXIgaSBpcyBHUCBhZGRyZXNzYWJsZQotICAgdW50aWwgYWZ0ZXIgd2Ugc2VlIHRoZSBpbnN0cnVjdGlvbiB0aGF0IHVzZXMgaXQuICBUaGVyZWZvcmUsIHdlCi0gICB3YW50IHRvIGJlIGFibGUgdG8gY2hvb3NlIHRoZSBmaW5hbCBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBvbmx5IGF0Ci0gICB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseS4gIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgd2F5IG90aGVyCi0gICBwbGF0Zm9ybXMgY2hvb3NlIHRoZSBzaXplIG9mIGEgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24gb25seSBhdCB0aGUKLSAgIGVuZCBvZiBhc3NlbWJseS4KLQotICAgV2hlbiBnZW5lcmF0aW5nIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgd2UgZG8gbm90IHVzZSBHUAotICAgYWRkcmVzc2luZyBpbiBxdWl0ZSB0aGUgc2FtZSB3YXksIGJ1dCB0aGUgaXNzdWUgc3RpbGwgYXJpc2VzIGFzCi0gICBleHRlcm5hbCBzeW1ib2xzIGFuZCBsb2NhbCBzeW1ib2xzIG11c3QgYmUgaGFuZGxlZCBkaWZmZXJlbnRseS4KLQotICAgV2UgaGFuZGxlIHRoZXNlIGlzc3VlcyBieSBhY3R1YWxseSBnZW5lcmF0aW5nIGJvdGggcG9zc2libGUKLSAgIGluc3RydWN0aW9uIHNlcXVlbmNlcy4gIFRoZSBsb25nZXIgb25lIGlzIHB1dCBpbiBhIGZyYWdfdmFyIHdpdGgKLSAgIHR5cGUgcnNfbWFjaGluZV9kZXBlbmRlbnQuICBXZSBlbmNvZGUgd2hhdCB0byBkbyB3aXRoIHRoZSBmcmFnIGluCi0gICB0aGUgc3VidHlwZSBmaWVsZC4gIFdlIGVuY29kZSAoMSkgdGhlIG51bWJlciBvZiBleGlzdGluZyBieXRlcyB0bwotICAgcmVwbGFjZSwgKDIpIHRoZSBudW1iZXIgb2YgbmV3IGJ5dGVzIHRvIHVzZSwgKDMpIHRoZSBvZmZzZXQgZnJvbQotICAgdGhlIHN0YXJ0IG9mIHRoZSBleGlzdGluZyBieXRlcyB0byB0aGUgZmlyc3QgcmVsb2Mgd2UgbXVzdCBnZW5lcmF0ZQotICAgKHRoYXQgaXMsIHRoZSBvZmZzZXQgaXMgYXBwbGllZCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZXhpc3RpbmcKLSAgIGJ5dGVzIGFmdGVyIHRoZXkgYXJlIHJlcGxhY2VkIGJ5IHRoZSBuZXcgYnl0ZXMsIGlmIGFueSksICg0KSB0aGUKLSAgIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZXhpc3RpbmcgYnl0ZXMgdG8gdGhlIHNlY29uZCByZWxvYywKLSAgICg1KSB3aGV0aGVyIGEgdGhpcmQgcmVsb2MgaXMgbmVlZGVkICh0aGUgdGhpcmQgcmVsb2MgaXMgYWx3YXlzIGZvdXIKLSAgIGJ5dGVzIGFmdGVyIHRoZSBzZWNvbmQgcmVsb2MpLCBhbmQgKDYpIHdoZXRoZXIgdG8gd2FybiBpZiB0aGlzCi0gICB2YXJpYW50IGlzIHVzZWQgKHRoaXMgaXMgc29tZXRpbWVzIG5lZWRlZCBpZiAuc2V0IG5vbWFjcm8gb3IgLnNldAotICAgbm9hdCBpcyBpbiBlZmZlY3QpLiAgQWxsIHRoZXNlIG51bWJlcnMgYXJlIHJlYXNvbmFibHkgc21hbGwuCi0KLSAgIEdlbmVyYXRpbmcgdHdvIGluc3RydWN0aW9uIHNlcXVlbmNlcyBtdXN0IGJlIGhhbmRsZWQgY2FyZWZ1bGx5IHRvCi0gICBlbnN1cmUgdGhhdCBkZWxheSBzbG90cyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuICBGb3J0dW5hdGVseSwgdGhlcmUKLSAgIGFyZSBhIGxpbWl0ZWQgbnVtYmVyIG9mIGNhc2VzLiAgV2hlbiB0aGUgc2Vjb25kIGluc3RydWN0aW9uCi0gICBzZXF1ZW5jZSBpcyBnZW5lcmF0ZWQsIGFwcGVuZF9pbnNuIGlzIGRpcmVjdGVkIHRvIG1haW50YWluIHRoZQotICAgZXhpc3RpbmcgZGVsYXkgc2xvdCBpbmZvcm1hdGlvbiwgc28gaXQgY29udGludWVzIHRvIGFwcGx5IHRvIGFueQotICAgY29kZSBhZnRlciB0aGUgc2Vjb25kIGluc3RydWN0aW9uIHNlcXVlbmNlLiAgVGhpcyBtZWFucyB0aGF0IHRoZQotICAgc2Vjb25kIGluc3RydWN0aW9uIHNlcXVlbmNlIG11c3Qgbm90IGltcG9zZSBhbnkgcmVxdWlyZW1lbnRzIG5vdAotICAgcmVxdWlyZWQgYnkgdGhlIGZpcnN0IGluc3RydWN0aW9uIHNlcXVlbmNlLgotCi0gICBUaGVzZSB2YXJpYW50IGZyYWdzIGFyZSB0aGVuIGhhbmRsZWQgaW4gZnVuY3Rpb25zIGNhbGxlZCBieSB0aGUKLSAgIG1hY2hpbmUgaW5kZXBlbmRlbnQgY29kZS4gIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IHJldHVybnMKLSAgIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBmcmFnLiAgbWRfY29udmVydF9mcmFnIHNldHMgdXAgdGhlIGZpbmFsIGZvcm0KLSAgIG9mIHRoZSBmcmFnLiAgdGNfZ2VuX3JlbG9jIGFkanVzdCB0aGUgZmlyc3QgcmVsb2MgYW5kIGFkZHMgYSBzZWNvbmQKLSAgIG9uZSBpZiBuZWVkZWQuICAqLwotI2RlZmluZSBSRUxBWF9FTkNPREUob2xkLCBuZXcsIHJlbG9jMSwgcmVsb2MyLCByZWxvYzMsIHdhcm4pIFwKLSAgKChyZWxheF9zdWJzdGF0ZVQpIFwKLSAgICgoKG9sZCkgPDwgMjMpIFwKLSAgICB8ICgobmV3KSA8PCAxNikgXAotICAgIHwgKCgocmVsb2MxKSArIDY0KSA8PCA5KSBcCi0gICAgfCAoKChyZWxvYzIpICsgNjQpIDw8IDIpIFwKLSAgICB8ICgocmVsb2MzKSA/ICgxIDw8IDEpIDogMCkgXAotICAgIHwgKCh3YXJuKSA/IDEgOiAwKSkpCi0jZGVmaW5lIFJFTEFYX09MRChpKSAoKChpKSA+PiAyMykgJiAweDdmKQotI2RlZmluZSBSRUxBWF9ORVcoaSkgKCgoaSkgPj4gMTYpICYgMHg3ZikKLSNkZWZpbmUgUkVMQVhfUkVMT0MxKGkpICgoYmZkX3ZtYSkoKChpKSA+PiA5KSAmIDB4N2YpIC0gNjQpCi0jZGVmaW5lIFJFTEFYX1JFTE9DMihpKSAoKGJmZF92bWEpKCgoaSkgPj4gMikgJiAweDdmKSAtIDY0KQotI2RlZmluZSBSRUxBWF9SRUxPQzMoaSkgKCgoaSkgPj4gMSkgJiAxKQotI2RlZmluZSBSRUxBWF9XQVJOKGkpICgoaSkgJiAxKQotCi0vKiBGb3IgbWlwczE2IGNvZGUsIHdlIHVzZSBhbiBlbnRpcmVseSBkaWZmZXJlbnQgZm9ybSBvZiByZWxheGF0aW9uLgotICAgbWlwczE2IHN1cHBvcnRzIHR3byB2ZXJzaW9ucyBvZiBtb3N0IGluc3RydWN0aW9ucyB3aGljaCB0YWtlCi0gICBpbW1lZGlhdGUgdmFsdWVzOiBhIHNtYWxsIG9uZSB3aGljaCB0YWtlcyBzb21lIHNtYWxsIHZhbHVlLCBhbmQgYQotICAgbGFyZ2VyIG9uZSB3aGljaCB0YWtlcyBhIDE2IGJpdCB2YWx1ZS4gIFNpbmNlIGJyYW5jaGVzIGFsc28gZm9sbG93Ci0gICB0aGlzIHBhdHRlcm4sIHJlbGF4aW5nIHRoZXNlIHZhbHVlcyBpcyByZXF1aXJlZC4KLQotICAgV2UgY2FuIGFzc2VtYmxlIGJvdGggbWlwczE2IGFuZCBub3JtYWwgTUlQUyBjb2RlIGluIGEgc2luZ2xlCi0gICBvYmplY3QuICBUaGVyZWZvcmUsIHdlIG5lZWQgdG8gc3VwcG9ydCB0aGlzIHR5cGUgb2YgcmVsYXhhdGlvbiBhdAotICAgdGhlIHNhbWUgdGltZSB0aGF0IHdlIHN1cHBvcnQgdGhlIHJlbGF4YXRpb24gZGVzY3JpYmVkIGFib3ZlLiAgV2UKLSAgIHVzZSB0aGUgaGlnaCBiaXQgb2YgdGhlIHN1YnR5cGUgZmllbGQgdG8gZGlzdGluZ3Vpc2ggdGhlc2UgY2FzZXMuCi0KLSAgIFRoZSBpbmZvcm1hdGlvbiB3ZSBzdG9yZSBmb3IgdGhpcyB0eXBlIG9mIHJlbGF4YXRpb24gaXMgdGhlCi0gICBhcmd1bWVudCBjb2RlIGZvdW5kIGluIHRoZSBvcGNvZGUgZmlsZSBmb3IgdGhpcyByZWxvY2F0aW9uLCB3aGV0aGVyCi0gICB0aGUgdXNlciBleHBsaWNpdGx5IHJlcXVlc3RlZCBhIHNtYWxsIG9yIGV4dGVuZGVkIGZvcm0sIGFuZCB3aGV0aGVyCi0gICB0aGUgcmVsb2NhdGlvbiBpcyBpbiBhIGp1bXAgb3IgamFsIGRlbGF5IHNsb3QuICBUaGF0IHRlbGxzIHVzIHRoZQotICAgc2l6ZSBvZiB0aGUgdmFsdWUsIGFuZCBob3cgaXQgc2hvdWxkIGJlIHN0b3JlZC4gIFdlIGFsc28gc3RvcmUKLSAgIHdoZXRoZXIgdGhlIGZyYWdtZW50IGlzIGNvbnNpZGVyZWQgdG8gYmUgZXh0ZW5kZWQgb3Igbm90LiAgV2UgYWxzbwotICAgc3RvcmUgd2hldGhlciB0aGlzIGlzIGtub3duIHRvIGJlIGEgYnJhbmNoIHRvIGEgZGlmZmVyZW50IHNlY3Rpb24sCi0gICB3aGV0aGVyIHdlIGhhdmUgdHJpZWQgdG8gcmVsYXggdGhpcyBmcmFnIHlldCwgYW5kIHdoZXRoZXIgd2UgaGF2ZQotICAgZXZlciBleHRlbmRlZCBhIFBDIHJlbGF0aXZlIGZyYWdtZW50IGJlY2F1c2Ugb2YgYSBzaGlmdCBjb3VudC4gICovCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9FTkNPREUodHlwZSwgc21hbGwsIGV4dCwgZHNsb3QsIGphbF9kc2xvdCkJXAotICAoMHg4MDAwMDAwMAkJCQkJCQlcCi0gICB8ICgodHlwZSkgJiAweGZmKQkJCQkJCVwKLSAgIHwgKChzbWFsbCkgPyAweDEwMCA6IDApCQkJCQlcCi0gICB8ICgoZXh0KSA/IDB4MjAwIDogMCkJCQkJCVwKLSAgIHwgKChkc2xvdCkgPyAweDQwMCA6IDApCQkJCQlcCi0gICB8ICgoamFsX2RzbG90KSA/IDB4ODAwIDogMCkpCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9QKGkpICgoKGkpICYgMHg4MDAwMDAwMCkgIT0gMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X1RZUEUoaSkgKChpKSAmIDB4ZmYpCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9VU0VSX1NNQUxMKGkpICgoKGkpICYgMHgxMDApICE9IDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9VU0VSX0VYVChpKSAoKChpKSAmIDB4MjAwKSAhPSAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfRFNMT1QoaSkgKCgoaSkgJiAweDQwMCkgIT0gMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X0pBTF9EU0xPVChpKSAoKChpKSAmIDB4ODAwKSAhPSAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfRVhURU5ERUQoaSkgKCgoaSkgJiAweDEwMDApICE9IDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9NQVJLX0VYVEVOREVEKGkpICgoaSkgfCAweDEwMDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9DTEVBUl9FWFRFTkRFRChpKSAoKGkpICZ+IDB4MTAwMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X0xPTkdfQlJBTkNIKGkpICgoKGkpICYgMHgyMDAwKSAhPSAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfTUFSS19MT05HX0JSQU5DSChpKSAoKGkpIHwgMHgyMDAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfQ0xFQVJfTE9OR19CUkFOQ0goaSkgKChpKSAmfiAweDIwMDApCi0MCi0vKiBQcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jZGVmaW5lIGludGVybmFsRXJyb3IoKSBcCi0gICAgYXNfZmF0YWwgKF8oImludGVybmFsIEVycm9yLCBsaW5lICVkLCAlcyIpLCBfX0xJTkVfXywgX19GSUxFX18pCi0jZWxzZQotI2RlZmluZSBpbnRlcm5hbEVycm9yKCkgYXNfZmF0YWwgKF8oIk1JUFMgaW50ZXJuYWwgRXJyb3IiKSk7Ci0jZW5kaWYKLQotZW51bSBtaXBzX3JlZ2NsYXNzIHsgTUlQU19HUl9SRUcsIE1JUFNfRlBfUkVHLCBNSVBTMTZfUkVHIH07Ci0KLXN0YXRpYyBpbnQgaW5zbl91c2VzX3JlZyBQQVJBTVMgKChzdHJ1Y3QgbWlwc19jbF9pbnNuICppcCwKLQkJCQkgIHVuc2lnbmVkIGludCByZWcsIGVudW0gbWlwc19yZWdjbGFzcyBjbGFzcykpOwotc3RhdGljIGludCByZWdfbmVlZHNfZGVsYXkgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBtaXBzMTZfbWFya19sYWJlbHMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgYXBwZW5kX2luc24gUEFSQU1TICgoY2hhciAqcGxhY2UsCi0JCQkJIHN0cnVjdCBtaXBzX2NsX2luc24gKiBpcCwKLQkJCQkgZXhwcmVzc2lvblMgKiBwLAotCQkJCSBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgciwKLQkJCQkgYm9vbGVhbikpOwotc3RhdGljIHZvaWQgbWlwc19ub19wcmV2X2luc24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VtaXRfZGVsYXlzIFBBUkFNUyAoKGJvb2xlYW4pKTsKLSNpZmRlZiBVU0VfU1REQVJHCi1zdGF0aWMgdm9pZCBtYWNyb19idWlsZCBQQVJBTVMgKChjaGFyICpwbGFjZSwgaW50ICpjb3VudGVyLCBleHByZXNzaW9uUyAqIGVwLAotCQkJCSBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpmbXQsCi0JCQkJIC4uLikpOwotI2Vsc2UKLXN0YXRpYyB2b2lkIG1hY3JvX2J1aWxkICgpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBtaXBzMTZfbWFjcm9fYnVpbGQgUEFSQU1TICgoY2hhciAqLCBpbnQgKiwgZXhwcmVzc2lvblMgKiwKLQkJCQkJY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCi0JCQkJCXZhX2xpc3QpKTsKLXN0YXRpYyB2b2lkIG1hY3JvX2J1aWxkX2x1aSBQQVJBTVMgKChjaGFyICpwbGFjZSwgaW50ICpjb3VudGVyLAotCQkJCSAgICAgZXhwcmVzc2lvblMgKiBlcCwgaW50IHJlZ251bSkpOwotc3RhdGljIHZvaWQgc2V0X2F0IFBBUkFNUyAoKGludCAqY291bnRlciwgaW50IHJlZywgaW50IHVuc2lnbmVkcCkpOwotc3RhdGljIHZvaWQgY2hlY2tfYWJzb2x1dGVfZXhwciBQQVJBTVMgKChzdHJ1Y3QgbWlwc19jbF9pbnNuICogaXAsCi0JCQkJCSBleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgdm9pZCBsb2FkX3JlZ2lzdGVyIFBBUkFNUyAoKGludCAqLCBpbnQsIGV4cHJlc3Npb25TICosIGludCkpOwotc3RhdGljIHZvaWQgbG9hZF9hZGRyZXNzIFBBUkFNUyAoKGludCAqY291bnRlciwgaW50IHJlZywgZXhwcmVzc2lvblMgKmVwKSk7Ci1zdGF0aWMgdm9pZCBtYWNybyBQQVJBTVMgKChzdHJ1Y3QgbWlwc19jbF9pbnNuICogaXApKTsKLXN0YXRpYyB2b2lkIG1pcHMxNl9tYWNybyBQQVJBTVMgKChzdHJ1Y3QgbWlwc19jbF9pbnNuICogaXApKTsKLSNpZmRlZiBMT1NJTkdfQ09NUElMRVIKLXN0YXRpYyB2b2lkIG1hY3JvMiBQQVJBTVMgKChzdHJ1Y3QgbWlwc19jbF9pbnNuICogaXApKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgbWlwc19pcCBQQVJBTVMgKChjaGFyICpzdHIsIHN0cnVjdCBtaXBzX2NsX2luc24gKiBpcCkpOwotc3RhdGljIHZvaWQgbWlwczE2X2lwIFBBUkFNUyAoKGNoYXIgKnN0ciwgc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwKSk7Ci1zdGF0aWMgdm9pZCBtaXBzMTZfaW1tZWQgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBpbnQsIGludCwgb2Zmc2V0VCwgYm9vbGVhbiwKLQkJCQkgIGJvb2xlYW4sIGJvb2xlYW4sIHVuc2lnbmVkIGxvbmcgKiwKLQkJCQkgIGJvb2xlYW4gKiwgdW5zaWduZWQgc2hvcnQgKikpOwotc3RhdGljIGludCBteV9nZXRTbWFsbEV4cHJlc3Npb24gUEFSQU1TICgoZXhwcmVzc2lvblMgKiBlcCwgY2hhciAqc3RyKSk7Ci1zdGF0aWMgdm9pZCBteV9nZXRFeHByZXNzaW9uIFBBUkFNUyAoKGV4cHJlc3Npb25TICogZXAsIGNoYXIgKnN0cikpOwotc3RhdGljIHN5bWJvbFMgKmdldF9zeW1ib2wgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgbWlwc19hbGlnbiBQQVJBTVMgKChpbnQgdG8sIGludCBmaWxsLCBzeW1ib2xTICpsYWJlbCkpOwotc3RhdGljIHZvaWQgc19hbGlnbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfY2hhbmdlX3NlYyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfY29ucyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZmxvYXRfY29ucyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbWlwc19nbG9ibCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfb3B0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19taXBzc2V0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hYmljYWxscyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfY3Bsb2FkIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jcHJlc3RvcmUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2dwd29yZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfY3BhZGQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2luc24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBtZF9vYmpfYmVnaW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgbWRfb2JqX2VuZCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgbG9uZyBnZXRfbnVtYmVyIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHNfbWlwc19lbnQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21pcHNfZW5kIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19taXBzX2ZyYW1lIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19taXBzX21hc2sgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21pcHNfc3RhYiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbWlwc193ZWFrZXh0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19maWxlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGludCBtaXBzMTZfZXh0ZW5kZWRfZnJhZyBQQVJBTVMgKChmcmFnUyAqLCBhc2VjdGlvbiAqLCBsb25nKSk7Ci0KLQotc3RhdGljIGludCB2YWxpZGF0ZV9taXBzX2luc24gUEFSQU1TICgoY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICopKTsKLQwKLS8qIFBzZXVkby1vcCB0YWJsZS4KLQotICAgVGhlIGZvbGxvd2luZyBwc2V1ZG8tb3BzIGZyb20gdGhlIEthbmUgYW5kIEhlaW5yaWNoIE1JUFMgYm9vawotICAgc2hvdWxkIGJlIGRlZmluZWQgaGVyZSwgYnV0IGFyZSBjdXJyZW50bHkgdW5zdXBwb3J0ZWQ6IC5hbGlhcywKLSAgIC5nYWxpdmUsIC5namFsZGVmLCAuZ2pybGl2ZSwgLmxpdmVyZWcsIC5ub2FsaWFzLgotCi0gICBUaGUgZm9sbG93aW5nIHBzZXVkby1vcHMgZnJvbSB0aGUgS2FuZSBhbmQgSGVpbnJpY2ggTUlQUyBib29rIGFyZQotICAgc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uIGJlaW5nIGdlbmVyYXRlZCwgYW5kCi0gICBzaG91bGQgYmUgZGVmaW5lZCBieSB0aGUgb2JqZWN0IGZvcm1hdDogLmFlbnQsIC5iZWdpbiwgLmJlbmQsCi0gICAuYmduYiwgLmVuZCwgLmVuZGIsIC5lbnQsIC5mbWFzaywgLmZyYW1lLCAubG9jLCAubWFzaywgLnZlcnN0YW1wLAotICAgLnZyZWcuCi0KLSAgIFRoZSBmb2xsb3dpbmcgcHNldWRvLW9wcyBmcm9tIHRoZSBLYW5lIGFuZCBIZWlucmljaCBNSVBTIGJvb2sgYXJlCi0gICBub3QgTUlQUyBDUFUgc3BlY2lmaWMsIGJ1dCBhcmUgYWxzbyBub3Qgc3BlY2lmaWMgdG8gdGhlIG9iamVjdCBmaWxlCi0gICBmb3JtYXQuICBUaGlzIGZpbGUgaXMgcHJvYmFibHkgdGhlIGJlc3QgcGxhY2UgdG8gZGVmaW5lIHRoZW0sIGJ1dAotICAgdGhleSBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQ6IC5hc20wLCAuZW5kciwgLmxhYiwgLnJlcGVhdCwKLSAgIC5zdHJ1Y3QuICAqLwotCi1zdGF0aWMgY29uc3QgcHNldWRvX3R5cGVTIG1pcHNfcHNldWRvX3RhYmxlW10gPQotewotIC8qIE1JUFMgc3BlY2lmaWMgcHNldWRvLW9wcy4gICovCi0gIHsib3B0aW9uIiwgc19vcHRpb24sIDB9LAotICB7InNldCIsIHNfbWlwc3NldCwgMH0sCi0gIHsicmRhdGEiLCBzX2NoYW5nZV9zZWMsICdyJ30sCi0gIHsic2RhdGEiLCBzX2NoYW5nZV9zZWMsICdzJ30sCi0gIHsibGl2ZXJlZyIsIHNfaWdub3JlLCAwfSwKLSAgeyJhYmljYWxscyIsIHNfYWJpY2FsbHMsIDB9LAotICB7ImNwbG9hZCIsIHNfY3Bsb2FkLCAwfSwKLSAgeyJjcHJlc3RvcmUiLCBzX2NwcmVzdG9yZSwgMH0sCi0gIHsiZ3B3b3JkIiwgc19ncHdvcmQsIDB9LAotICB7ImNwYWRkIiwgc19jcGFkZCwgMH0sCi0gIHsiaW5zbiIsIHNfaW5zbiwgMH0sCi0KLSAvKiBSZWxhdGl2ZWx5IGdlbmVyaWMgcHNldWRvLW9wcyB0aGF0IGhhcHBlbiB0byBiZSB1c2VkIG9uIE1JUFMKLSAgICAgY2hpcHMuICAqLwotICB7ImFzY2lpeiIsIHN0cmluZ2VyLCAxfSwKLSAgeyJic3MiLCBzX2NoYW5nZV9zZWMsICdiJ30sCi0gIHsiZXJyIiwgc19lcnIsIDB9LAotICB7ImhhbGYiLCBzX2NvbnMsIDF9LAotICB7ImR3b3JkIiwgc19jb25zLCAzfSwKLSAgeyJ3ZWFrZXh0Iiwgc19taXBzX3dlYWtleHQsIDB9LAotCi0gLyogVGhlc2UgcHNldWRvLW9wcyBhcmUgZGVmaW5lZCBpbiByZWFkLmMsIGJ1dCBtdXN0IGJlIG92ZXJyaWRkZW4KLSAgICAgaGVyZSBmb3Igb25lIHJlYXNvbiBvciBhbm90aGVyLiAgKi8KLSAgeyJhbGlnbiIsIHNfYWxpZ24sIDB9LAotICB7ImJ5dGUiLCBzX2NvbnMsIDB9LAotICB7ImRhdGEiLCBzX2NoYW5nZV9zZWMsICdkJ30sCi0gIHsiZG91YmxlIiwgc19mbG9hdF9jb25zLCAnZCd9LAotICB7ImZsb2F0Iiwgc19mbG9hdF9jb25zLCAnZid9LAotICB7Imdsb2JsIiwgc19taXBzX2dsb2JsLCAwfSwKLSAgeyJnbG9iYWwiLCBzX21pcHNfZ2xvYmwsIDB9LAotICB7Imh3b3JkIiwgc19jb25zLCAxfSwKLSAgeyJpbnQiLCBzX2NvbnMsIDJ9LAotICB7ImxvbmciLCBzX2NvbnMsIDJ9LAotICB7Im9jdGEiLCBzX2NvbnMsIDR9LAotICB7InF1YWQiLCBzX2NvbnMsIDN9LAotICB7InNob3J0Iiwgc19jb25zLCAxfSwKLSAgeyJzaW5nbGUiLCBzX2Zsb2F0X2NvbnMsICdmJ30sCi0gIHsic3RhYm4iLCBzX21pcHNfc3RhYiwgJ24nfSwKLSAgeyJ0ZXh0Iiwgc19jaGFuZ2Vfc2VjLCAndCd9LAotICB7IndvcmQiLCBzX2NvbnMsIDJ9LAotICB7IDAgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBwc2V1ZG9fdHlwZVMgbWlwc19ub25lY29mZl9wc2V1ZG9fdGFibGVbXSA9IHsKLSAvKiBUaGVzZSBwc2V1ZG8tb3BzIHNob3VsZCBiZSBkZWZpbmVkIGJ5IHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuCi0gICAgSG93ZXZlciwgYS5vdXQgZG9lc24ndCBzdXBwb3J0IHRoZW0sIHNvIHdlIGhhdmUgdmVyc2lvbnMgaGVyZS4gICovCi0gIHsiYWVudCIsIHNfbWlwc19lbnQsIDF9LAotICB7ImJnbmIiLCBzX2lnbm9yZSwgMH0sCi0gIHsiZW5kIiwgc19taXBzX2VuZCwgMH0sCi0gIHsiZW5kYiIsIHNfaWdub3JlLCAwfSwKLSAgeyJlbnQiLCBzX21pcHNfZW50LCAwfSwKLSAgeyJmaWxlIiwgc19maWxlLCAwfSwKLSAgeyJmbWFzayIsIHNfbWlwc19tYXNrLCAnRid9LAotICB7ImZyYW1lIiwgc19taXBzX2ZyYW1lLCAwfSwKLSAgeyJsb2MiLCBzX2lnbm9yZSwgMH0sCi0gIHsibWFzayIsIHNfbWlwc19tYXNrLCAnUid9LAotICB7InZlcnN0YW1wIiwgc19pZ25vcmUsIDB9LAotICB7IDAgfSwKLX07Ci0KLWV4dGVybiB2b2lkIHBvcF9pbnNlcnQgUEFSQU1TICgoY29uc3QgcHNldWRvX3R5cGVTICopKTsKLQotdm9pZAotbWlwc19wb3BfaW5zZXJ0ICgpCi17Ci0gIHBvcF9pbnNlcnQgKG1pcHNfcHNldWRvX3RhYmxlKTsKLSAgaWYgKCEgRUNPRkZfREVCVUdHSU5HKQotICAgIHBvcF9pbnNlcnQgKG1pcHNfbm9uZWNvZmZfcHNldWRvX3RhYmxlKTsKLX0KLQwKLS8qIFN5bWJvbHMgbGFiZWxsaW5nIHRoZSBjdXJyZW50IGluc24uICAqLwotCi1zdHJ1Y3QgaW5zbl9sYWJlbF9saXN0Ci17Ci0gIHN0cnVjdCBpbnNuX2xhYmVsX2xpc3QgKm5leHQ7Ci0gIHN5bWJvbFMgKmxhYmVsOwotfTsKLQotc3RhdGljIHN0cnVjdCBpbnNuX2xhYmVsX2xpc3QgKmluc25fbGFiZWxzOwotc3RhdGljIHN0cnVjdCBpbnNuX2xhYmVsX2xpc3QgKmZyZWVfaW5zbl9sYWJlbHM7Ci0KLXN0YXRpYyB2b2lkIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLW1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgKCkKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqKnBsOwotCi0gIGZvciAocGwgPSAmZnJlZV9pbnNuX2xhYmVsczsgKnBsICE9IE5VTEw7IHBsID0gJigqcGwpLT5uZXh0KQotICAgIDsKLSAgKnBsID0gaW5zbl9sYWJlbHM7Ci0gIGluc25fbGFiZWxzID0gTlVMTDsKLX0KLQwKLXN0YXRpYyBjaGFyICpleHByX2VuZDsKLQotLyogRXhwcmVzc2lvbnMgd2hpY2ggYXBwZWFyIGluIGluc3RydWN0aW9ucy4gIFRoZXNlIGFyZSBzZXQgYnkKLSAgIG1pcHNfaXAuICAqLwotCi1zdGF0aWMgZXhwcmVzc2lvblMgaW1tX2V4cHI7Ci1zdGF0aWMgZXhwcmVzc2lvblMgb2Zmc2V0X2V4cHI7Ci0KLS8qIFJlbG9jcyBhc3NvY2lhdGVkIHdpdGggaW1tX2V4cHIgYW5kIG9mZnNldF9leHByLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBpbW1fcmVsb2M7Ci1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIG9mZnNldF9yZWxvYzsKLQotLyogVGhpcyBpcyBzZXQgYnkgbWlwc19pcCBpZiBpbW1fcmVsb2MgaXMgYW4gdW5tYXRjaGVkIEhJMTZfUyByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuIGltbV91bm1hdGNoZWRfaGk7Ci0KLS8qIFRoZXNlIGFyZSBzZXQgYnkgbWlwczE2X2lwIGlmIGFuIGV4cGxpY2l0IGV4dGVuc2lvbiBpcyB1c2VkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gbWlwczE2X3NtYWxsLCBtaXBzMTZfZXh0OwotCi0jaWZkZWYgTUlQU19TVEFCU19FTEYKLS8qIFRoZSBwZHIgc2VnbWVudCBmb3IgcGVyIHByb2NlZHVyZSBmcmFtZS9yZWdtYXNrIGluZm8gKi8KLQotc3RhdGljIHNlZ1QgcGRyX3NlZzsKLSNlbmRpZgotCi0vKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIEl0IHNob3VsZAotICogc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMuIHRoYXQgdGhlIE1EIHBhcnQgb2YgdGhlIGFzc2VtYmxlciB3aWxsIG5lZWQuCi0gKi8KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGJvb2xlYW4gb2sgPSBmYWxzZTsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcmV0dmFsID0gTlVMTDsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGkgPSAwOwotICBjb25zdCBjaGFyICpjcHU7Ci0gIGNoYXIgKmEgPSBOVUxMOwotICBpbnQgYnJva2VuID0gMDsKLSAgaW50IG1pcHNfaXNhX2Zyb21fY3B1OwotCi0gIGNwdSA9IFRBUkdFVF9DUFU7Ci0gIGlmIChzdHJjbXAgKGNwdSArIChzaXplb2YgVEFSR0VUX0NQVSkgLSAzLCAiZWwiKSA9PSAwKQotICAgIHsKLSAgICAgIGEgPSB4bWFsbG9jIChzaXplb2YgVEFSR0VUX0NQVSk7Ci0gICAgICBzdHJjcHkgKGEsIFRBUkdFVF9DUFUpOwotICAgICAgYVsoc2l6ZW9mIFRBUkdFVF9DUFUpIC0gM10gPSAnXDAnOwotICAgICAgY3B1ID0gYTsKLSAgICB9Ci0KLSAgaWYgKG1pcHNfY3B1IDwgMCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbWlwc19jcHUgYmFzZWQgb24gVEFSR0VUX0NQVSwgdW5sZXNzIFRBUkdFVF9DUFUgaXMKLSAgICAgICAgIGp1c3QgdGhlIGdlbmVyaWMgJ21pcHMnLCBpbiB3aGljaCBjYXNlIHNldCBtaXBzX2NwdSBiYXNlZAotICAgICAgICAgb24gdGhlIGdpdmVuIElTQSwgaWYgYW55LiAqLwotCi0gICAgICBpZiAoc3RyY21wIChjcHUsICJtaXBzIikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChtaXBzX29wdHMuaXNhIDwgMCkKLSAgICAgICAgICAgIG1pcHNfY3B1ID0gMzAwMDsgICAKLQotICAgICAgICAgIGVsc2UgaWYgKG1pcHNfb3B0cy5pc2EgPT0gMikKLSAgICAgICAgICAgIG1pcHNfY3B1ID0gNjAwMDsKLQotICAgICAgICAgIGVsc2UgaWYgKG1pcHNfb3B0cy5pc2EgPT0gMykKLSAgICAgICAgICAgIG1pcHNfY3B1ID0gNDAwMDsKLQotICAgICAgICAgIGVsc2UgaWYgKG1pcHNfb3B0cy5pc2EgPT0gNCkKLSAgICAgICAgICAgIG1pcHNfY3B1ID0gODAwMDsKLQotICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICBtaXBzX2NwdSA9IDMwMDA7Ci0gICAgICAgIH0KLSAgICAgIAotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyMzkwMCIpID09IDAKLSAgICAgICAgICAgICAgIHx8IHN0cmNtcCAoY3B1LCAibWlwc3R4MzkiKSA9PSAwCi0gICAgICAgICAgICAgICApCi0gICAgICAgIG1pcHNfY3B1ID0gMzkwMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyNjAwMCIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChjcHUsICJtaXBzMiIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNjAwMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJtaXBzNjQiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoY3B1LCAicjQwMDAiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoY3B1LCAibWlwczMiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDQwMDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjQ0MDAiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDQ0MDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAibWlwczY0b3Jpb24iKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoY3B1LCAicjQ2MDAiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDQ2MDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjQ2NTAiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDQ2NTA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAibWlwczY0dnI0MzAwIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA0MzAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgIm1pcHM2NHZyNDExMSIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNDExMTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJtaXBzNjR2cjQxMDAiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDQxMDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjQwMTAiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDQwMTA7Ci0KLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyNTAwMCIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChjcHUsICJtaXBzNjR2cjUwMDAiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDUwMDA7Ci0KLQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInI4MDAwIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGNwdSwgIm1pcHM0IikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA4MDAwOwotICAgICAgCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInIxMDAwMCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gMTAwMDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAibWlwczE2IikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSAwOyAvKiBGSVhNRSAqLwotCi0gICAgICBlbHNlCi0gICAgICAgIG1pcHNfY3B1ID0gMzAwMDsKLSAgICB9Ci0KLSAgaWYgKG1pcHNfY3B1ID09IDMwMDAKLSAgICAgIHx8IG1pcHNfY3B1ID09IDM5MDApCi0gICAgbWlwc19pc2FfZnJvbV9jcHUgPSAxOwotCi0gIGVsc2UgaWYgKG1pcHNfY3B1ID09IDYwMDAKLQkgICB8fCBtaXBzX2NwdSA9PSA0MDEwKQotICAgIG1pcHNfaXNhX2Zyb21fY3B1ID0gMjsKLQotICBlbHNlIGlmIChtaXBzX2NwdSA9PSA0MDAwCi0JICAgfHwgbWlwc19jcHUgPT0gNDEwMAotCSAgIHx8IG1pcHNfY3B1ID09IDQxMTEKLQkgICB8fCBtaXBzX2NwdSA9PSA0NDAwCi0JICAgfHwgbWlwc19jcHUgPT0gNDMwMAotCSAgIHx8IG1pcHNfY3B1ID09IDQ2MDAKLQkgICB8fCBtaXBzX2NwdSA9PSA0NjUwKQotICAgIG1pcHNfaXNhX2Zyb21fY3B1ID0gMzsKLQotICBlbHNlIGlmIChtaXBzX2NwdSA9PSA1MDAwCi0JICAgfHwgbWlwc19jcHUgPT0gODAwMAotICAgICAgICAgICAgICAgfHwgbWlwc19jcHUgPT0gMTAwMDApCi0gICAgbWlwc19pc2FfZnJvbV9jcHUgPSA0OwotCi0gIGVsc2UKLSAgICBtaXBzX2lzYV9mcm9tX2NwdSA9IC0xOwotCi0gIGlmIChtaXBzX29wdHMuaXNhID09IC0xKQotICAgIHsKLSAgICAgIGlmIChtaXBzX2lzYV9mcm9tX2NwdSAhPSAtMSkKLQltaXBzX29wdHMuaXNhID0gbWlwc19pc2FfZnJvbV9jcHU7Ci0gICAgICBlbHNlCi0JbWlwc19vcHRzLmlzYSA9IDE7Ci0gICAgfQotCi0gIGlmIChtaXBzX29wdHMubWlwczE2IDwgMCkKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAoVEFSR0VUX0NQVSwgIm1pcHMxNiIsIHNpemVvZiAibWlwczE2IiAtIDEpID09IDApCi0JbWlwc19vcHRzLm1pcHMxNiA9IDE7Ci0gICAgICBlbHNlCi0JbWlwc19vcHRzLm1pcHMxNiA9IDA7Ci0gICAgfQotCi0gIC8qIEVuZCBvZiBUQVJHRVRfQ1BVIHByb2Nlc3NpbmcsIGdldCByaWQgb2YgbWFsbG9jZWQgbWVtb3J5Ci0gICAgIGlmIG5lY2Vzc2FyeS4gKi8KLSAgY3B1ID0gTlVMTDsKLSAgaWYgKGEgIT0gTlVMTCkKLSAgICB7Ci0gICAgZnJlZSAoYSk7Ci0gICAgYSA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChtaXBzX29wdHMuaXNhIDwgMiAmJiBtaXBzX3RyYXApCi0gICAgYXNfYmFkIChfKCJ0cmFwIGV4Y2VwdGlvbiBub3Qgc3VwcG9ydGVkIGF0IElTQSAxIikpOwotCi0gIC8qIFNldCB0aGUgRUFCSSBraW5kIGJhc2VkIG9uIHRoZSBJU0EgYmVmb3JlIHRoZSB1c2VyIGdldHMKLSAgICAgdG8gY2hhbmdlIHRoZSBJU0Egd2l0aCBkaXJlY3RpdmVzLiAgVGhpcyBpc24ndCByZWFsbHkKLSAgICAgdGhlIGJlc3QsIGJ1dCB0aGVuIG5laXRoZXIgaXMgYmFzaW5nIHRoZSBhYmkgb24gdGhlIGlzYS4gKi8gICAgIAotICBpZiAobWlwc19vcHRzLmlzYSA+IDIgCi0gICAgICAmJiBtaXBzX2FiaV9zdHJpbmcKLSAgICAgICYmIDAgPT0gc3RyY21wIChtaXBzX2FiaV9zdHJpbmcsImVhYmkiKSkKLSAgICBtaXBzX2VhYmk2NCA9IDE7Ci0KLSAgaWYgKG1pcHNfY3B1ICE9IDAgJiYgbWlwc19jcHUgIT0gLTEpCi0gICAgewotICAgICAgb2sgPSBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9taXBzLCBtaXBzX2NwdSk7Ci0KLSAgICAgIC8qIElmIHRoZXkgYXNrZWQgZm9yIG1pcHMxIG9yIG1pcHMyIGFuZCBhIGNwdSB0aGF0IGlzCi0JIG1pcHMzIG9yIGdyZWF0ZXIsIHRoZW4gbWFyayB0aGUgb2JqZWN0IGZpbGUgMzJCSVRNT0RFLiAqLwotICAgICAgaWYgKG1pcHNfaXNhX2Zyb21fY3B1ICE9IC0xCi0JICAmJiBtaXBzX29wdHMuaXNhIDw9IDIgJiYgbWlwc19pc2FfZnJvbV9jcHUgPiAyKQotCW1pcHNfMzJiaXRtb2RlID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG1pcHNfb3B0cy5pc2EpCi0JewotCWNhc2UgMToKLQkgIG9rID0gYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfbWlwcywgMzAwMCk7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBvayA9IGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21pcHMsIDYwMDApOwotCSAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgb2sgPSBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9taXBzLCA0MDAwKTsKLQkgIGJyZWFrOwotCWNhc2UgNDoKLQkgIG9rID0gYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfbWlwcywgODAwMCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmICghIG9rKQotICAgIGFzX3dhcm4gKF8oIkNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotCi0gIGZpbGVfbWlwc19pc2EgPSBtaXBzX29wdHMuaXNhOwotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNT1BDT0RFUzspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IG1pcHNfb3Bjb2Rlc1tpXS5uYW1lOwotCi0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgbmFtZSwgKFBUUikgJm1pcHNfb3Bjb2Rlc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsICE9IE5VTEwpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBgJXMnOiAlc1xuIiksCi0JCSAgIG1pcHNfb3Bjb2Rlc1tpXS5uYW1lLCByZXR2YWwpOwotCSAgLyogUHJvYmFibHkgYSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9ibGVtPyAgR2l2ZSB1cCBub3cuICAqLwotCSAgYXNfZmF0YWwgKF8oIkJyb2tlbiBhc3NlbWJsZXIuICBObyBhc3NlbWJseSBhdHRlbXB0ZWQuIikpOwotCX0KLSAgICAgIGRvCi0JewotCSAgaWYgKG1pcHNfb3Bjb2Rlc1tpXS5waW5mbyAhPSBJTlNOX01BQ1JPKQotCSAgICB7Ci0JICAgICAgaWYgKCF2YWxpZGF0ZV9taXBzX2luc24gKCZtaXBzX29wY29kZXNbaV0pKQotCQlicm9rZW4gPSAxOwotCSAgICB9Ci0JICArK2k7Ci0JfQotICAgICAgd2hpbGUgKChpIDwgTlVNT1BDT0RFUykgJiYgIXN0cmNtcCAobWlwc19vcGNvZGVzW2ldLm5hbWUsIG5hbWUpKTsKLSAgICB9Ci0KLSAgbWlwczE2X29wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBpID0gMDsKLSAgd2hpbGUgKGkgPCBiZmRfbWlwczE2X251bV9vcGNvZGVzKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtaXBzMTZfb3Bjb2Rlc1tpXS5uYW1lOwotCi0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAobWlwczE2X29wX2hhc2gsIG5hbWUsIChQVFIpICZtaXBzMTZfb3Bjb2Rlc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsICE9IE5VTEwpCi0JYXNfZmF0YWwgKF8oImludGVybmFsOiBjYW4ndCBoYXNoIGAlcyc6ICVzIiksCi0JCSAgbWlwczE2X29wY29kZXNbaV0ubmFtZSwgcmV0dmFsKTsKLSAgICAgIGRvCi0JewotCSAgaWYgKG1pcHMxNl9vcGNvZGVzW2ldLnBpbmZvICE9IElOU05fTUFDUk8KLQkgICAgICAmJiAoKG1pcHMxNl9vcGNvZGVzW2ldLm1hdGNoICYgbWlwczE2X29wY29kZXNbaV0ubWFzaykKLQkJICAhPSBtaXBzMTZfb3Bjb2Rlc1tpXS5tYXRjaCkpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oImludGVybmFsIGVycm9yOiBiYWQgbWlwczE2IG9wY29kZTogJXMgJXNcbiIpLAotCQkgICAgICAgbWlwczE2X29wY29kZXNbaV0ubmFtZSwgbWlwczE2X29wY29kZXNbaV0uYXJncyk7Ci0JICAgICAgYnJva2VuID0gMTsKLQkgICAgfQotCSAgKytpOwotCX0KLSAgICAgIHdoaWxlIChpIDwgYmZkX21pcHMxNl9udW1fb3Bjb2RlcwotCSAgICAgJiYgc3RyY21wIChtaXBzMTZfb3Bjb2Rlc1tpXS5uYW1lLCBuYW1lKSA9PSAwKTsKLSAgICB9Ci0KLSAgaWYgKGJyb2tlbikKLSAgICBhc19mYXRhbCAoXygiQnJva2VuIGFzc2VtYmxlci4gIE5vIGFzc2VtYmx5IGF0dGVtcHRlZC4iKSk7Ci0KLSAgLyogV2UgYWRkIGFsbCB0aGUgZ2VuZXJhbCByZWdpc3RlciBuYW1lcyB0byB0aGUgc3ltYm9sIHRhYmxlLiAgVGhpcwotICAgICBoZWxwcyB1cyBkZXRlY3QgaW52YWxpZCB1c2VzIG9mIHRoZW0uICAqLwotICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIGJ1Zls1XTsKLQotICAgICAgc3ByaW50ZiAoYnVmLCAiJCVkIiwgaSk7Ci0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3IChidWYsIHJlZ19zZWN0aW9uLCBpLAotCQkJCSAgICAgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgICB9Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKCIkZnAiLCByZWdfc2VjdGlvbiwgRlAsCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKCIkc3AiLCByZWdfc2VjdGlvbiwgU1AsCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKCIkZ3AiLCByZWdfc2VjdGlvbiwgR1AsCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKCIkYXQiLCByZWdfc2VjdGlvbiwgQVQsCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKCIka3QwIiwgcmVnX3NlY3Rpb24sIEtUMCwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoIiRrdDEiLCByZWdfc2VjdGlvbiwgS1QxLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJHBjIiwgcmVnX3NlY3Rpb24sIC0xLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotCi0gIG1pcHNfbm9fcHJldl9pbnNuIChmYWxzZSk7Ci0KLSAgbWlwc19ncHJtYXNrID0gMDsKLSAgbWlwc19jcHJtYXNrWzBdID0gMDsKLSAgbWlwc19jcHJtYXNrWzFdID0gMDsKLSAgbWlwc19jcHJtYXNrWzJdID0gMDsKLSAgbWlwc19jcHJtYXNrWzNdID0gMDsKLQotICAvKiBzZXQgdGhlIGRlZmF1bHQgYWxpZ25tZW50IGZvciB0aGUgdGV4dCBzZWN0aW9uICgyKioyKSAqLwotICByZWNvcmRfYWxpZ25tZW50ICh0ZXh0X3NlY3Rpb24sIDIpOwotCi0gIGlmIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUKQotICAgIGJmZF9zZXRfZ3Bfc2l6ZSAoc3Rkb3V0cHV0LCBnX3N3aXRjaF92YWx1ZSk7Ci0KLSAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICB7Ci0gICAgICAvKiBPbiBhIG5hdGl2ZSBzeXN0ZW0sIHNlY3Rpb25zIG11c3QgYmUgYWxpZ25lZCB0byAxNiBieXRlCi0JIGJvdW5kYXJpZXMuICBXaGVuIGNvbmZpZ3VyZWQgZm9yIGFuIGVtYmVkZGVkIEVMRiB0YXJnZXQsIHdlCi0JIGRvbid0IGJvdGhlci4gICovCi0gICAgICBpZiAoc3RyY21wIChUQVJHRVRfT1MsICJlbGYiKSAhPSAwKQotCXsKLQkgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHRleHRfc2VjdGlvbiwgNCk7Ci0JICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBkYXRhX3NlY3Rpb24sIDQpOwotCSAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgYnNzX3NlY3Rpb24sIDQpOwotCX0KLQotICAgICAgLyogQ3JlYXRlIGEgLnJlZ2luZm8gc2VjdGlvbiBmb3IgcmVnaXN0ZXIgbWFza3MgYW5kIGEgLm1kZWJ1ZwotCSBzZWN0aW9uIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgewotCXNlZ1Qgc2VnOwotCXN1YnNlZ1Qgc3Vic2VnOwotCWZsYWd3b3JkIGZsYWdzOwotCXNlZ1Qgc2VjOwotCi0Jc2VnID0gbm93X3NlZzsKLQlzdWJzZWcgPSBub3dfc3Vic2VnOwotCi0JLyogVGhlIEFCSSBzYXlzIHRoaXMgc2VjdGlvbiBzaG91bGQgYmUgbG9hZGVkIHNvIHRoYXQgdGhlCi0JICAgcnVubmluZyBwcm9ncmFtIGNhbiBhY2Nlc3MgaXQuICBIb3dldmVyLCB3ZSBkb24ndCBsb2FkIGl0Ci0JICAgaWYgd2UgYXJlIGNvbmZpZ3VyZWQgZm9yIGFuIGVtYmVkZGVkIHRhcmdldCAqLwotCWZsYWdzID0gU0VDX1JFQURPTkxZIHwgU0VDX0RBVEE7Ci0JaWYgKHN0cmNtcCAoVEFSR0VUX09TLCAiZWxmIikgIT0gMCkKLQkgIGZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCi0JaWYgKCEgbWlwc182NCkKLQkgIHsKLQkgICAgc2VjID0gc3Vic2VnX25ldyAoIi5yZWdpbmZvIiwgKHN1YnNlZ1QpIDApOwotCi0KLQkgICAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWMsIGZsYWdzKTsKLQkgICAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VjLCAyKTsKLQkKLSNpZmRlZiBPQkpfRUxGCi0JICAgIG1pcHNfcmVnbWFza19mcmFnID0gZnJhZ19tb3JlIChzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pKTsKLSNlbmRpZgotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgLyogVGhlIDY0LWJpdCBBQkkgdXNlcyBhIC5NSVBTLm9wdGlvbnMgc2VjdGlvbiByYXRoZXIgdGhhbgotICAgICAgICAgICAgICAgLnJlZ2luZm8gc2VjdGlvbi4gICovCi0JICAgIHNlYyA9IHN1YnNlZ19uZXcgKCIuTUlQUy5vcHRpb25zIiwgKHN1YnNlZ1QpIDApOwotCSAgICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYywgZmxhZ3MpOwotCSAgICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWMsIDMpOwotCi0jaWZkZWYgT0JKX0VMRgotCSAgICAvKiBTZXQgdXAgdGhlIG9wdGlvbiBoZWFkZXIuICAqLwotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX09wdGlvbnMgb3B0aGRyOwotCSAgICAgIGNoYXIgKmY7Ci0KLQkgICAgICBvcHRoZHIua2luZCA9IE9ES19SRUdJTkZPOwotCSAgICAgIG9wdGhkci5zaXplID0gKHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpCi0JCQkgICAgICsgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKSk7Ci0JICAgICAgb3B0aGRyLnNlY3Rpb24gPSAwOwotCSAgICAgIG9wdGhkci5pbmZvID0gMDsKLQkgICAgICBmID0gZnJhZ19tb3JlIChzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKSk7Ci0JICAgICAgYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19vdXQgKHN0ZG91dHB1dCwgJm9wdGhkciwKLQkJCQkJICAgICAoRWxmX0V4dGVybmFsX09wdGlvbnMgKikgZik7Ci0KLQkgICAgICBtaXBzX3JlZ21hc2tfZnJhZyA9IGZyYWdfbW9yZSAoc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKSk7Ci0JICAgIH0KLSNlbmRpZgotCSAgfQotCi0JaWYgKEVDT0ZGX0RFQlVHR0lORykKLQkgIHsKLQkgICAgc2VjID0gc3Vic2VnX25ldyAoIi5tZGVidWciLCAoc3Vic2VnVCkgMCk7Ci0JICAgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLAotCQkJCQkgIFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkpOwotCSAgICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWMsIDIpOwotCSAgfQotCi0jaWZkZWYgTUlQU19TVEFCU19FTEYKLQlwZHJfc2VnID0gc3Vic2VnX25ldyAoIi5wZHIiLCAoc3Vic2VnVCkgMCk7Ci0JKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBwZHJfc2VnLAotCQkJICAgICBTRUNfUkVBRE9OTFkgfCBTRUNfUkVMT0MgfCBTRUNfREVCVUdHSU5HKTsKLQkodm9pZCkgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBwZHJfc2VnLCAyKTsKLSNlbmRpZgotCi0Jc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpOwotICAgICAgfQotICAgIH0KLQotICBpZiAoISBFQ09GRl9ERUJVR0dJTkcpCi0gICAgbWRfb2JqX2JlZ2luICgpOwotfQotCi12b2lkCi1tZF9taXBzX2VuZCAoKQotewotICBpZiAoISBFQ09GRl9ERUJVR0dJTkcpCi0gICAgbWRfb2JqX2VuZCAoKTsKLX0KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBzdHJ1Y3QgbWlwc19jbF9pbnNuIGluc247Ci0KLSAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotICBpbW1fdW5tYXRjaGVkX2hpID0gZmFsc2U7Ci0gIG9mZnNldF9leHByLlhfb3AgPSBPX2Fic2VudDsKLSAgb2Zmc2V0X3JlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKLQotICBpZiAobWlwc19vcHRzLm1pcHMxNikKLSAgICBtaXBzMTZfaXAgKHN0ciwgJmluc24pOwotICBlbHNlCi0gICAgewotICAgICAgbWlwc19pcCAoc3RyLCAmaW5zbik7Ci0gICAgICBEQkcoKF8oInJldHVybmVkIGZyb20gbWlwc19pcCglcykgaW5zbl9vcGNvZGUgPSAweCV4XG4iKSwgCi0JCXN0ciwgaW5zbi5pbnNuX29wY29kZSkpOwotICAgIH0KLQotICBpZiAoaW5zbl9lcnJvcikKLSAgICB7Ci0gICAgICBhc19iYWQgKCIlcyBgJXMnIiwgaW5zbl9lcnJvciwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGluc24uaW5zbl9tby0+cGluZm8gPT0gSU5TTl9NQUNSTykKLSAgICB7Ci0gICAgICBpZiAobWlwc19vcHRzLm1pcHMxNikKLQltaXBzMTZfbWFjcm8gKCZpbnNuKTsKLSAgICAgIGVsc2UKLQltYWNybyAoJmluc24pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fYWJzZW50KQotCWFwcGVuZF9pbnNuICgoY2hhciAqKSBOVUxMLCAmaW5zbiwgJmltbV9leHByLCBpbW1fcmVsb2MsCi0JCSAgICAgaW1tX3VubWF0Y2hlZF9oaSk7Ci0gICAgICBlbHNlIGlmIChvZmZzZXRfZXhwci5YX29wICE9IE9fYWJzZW50KQotCWFwcGVuZF9pbnNuICgoY2hhciAqKSBOVUxMLCAmaW5zbiwgJm9mZnNldF9leHByLCBvZmZzZXRfcmVsb2MsIGZhbHNlKTsKLSAgICAgIGVsc2UKLQlhcHBlbmRfaW5zbiAoKGNoYXIgKikgTlVMTCwgJmluc24sIE5VTEwsIEJGRF9SRUxPQ19VTlVTRUQsIGZhbHNlKTsKLSAgICB9Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIGluc3RydWN0aW9uIElQIHJlYWRzIHJlZ2lzdGVyIFJFRy4gIENMQVNTIGlzIHRoZSB0eXBlCi0gICBvZiByZWdpc3Rlci4gICovCi0KLXN0YXRpYyBpbnQKLWluc25fdXNlc19yZWcgKGlwLCByZWcsIGNsYXNzKQotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLSAgICAgdW5zaWduZWQgaW50IHJlZzsKLSAgICAgZW51bSBtaXBzX3JlZ2NsYXNzIGNsYXNzOwotewotICBpZiAoY2xhc3MgPT0gTUlQUzE2X1JFRykKLSAgICB7Ci0gICAgICBhc3NlcnQgKG1pcHNfb3B0cy5taXBzMTYpOwotICAgICAgcmVnID0gbWlwczE2X3RvXzMyX3JlZ19tYXBbcmVnXTsKLSAgICAgIGNsYXNzID0gTUlQU19HUl9SRUc7Ci0gICAgfQotCi0gIC8qIERvbid0IHJlcG9ydCBvbiBnZW5lcmFsIHJlZ2lzdGVyIDAsIHNpbmNlIGl0IG5ldmVyIGNoYW5nZXMuICAqLwotICBpZiAoY2xhc3MgPT0gTUlQU19HUl9SRUcgJiYgcmVnID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGNsYXNzID09IE1JUFNfRlBfUkVHKQotICAgIHsKLSAgICAgIGFzc2VydCAoISBtaXBzX29wdHMubWlwczE2KTsKLSAgICAgIC8qIElmIHdlIGFyZSBjYWxsZWQgd2l0aCBlaXRoZXIgJGYwIG9yICRmMSwgd2UgbXVzdCBjaGVjayAkZjAuCi0JIFRoaXMgaXMgbm90IG9wdGltYWwsIGJlY2F1c2UgaXQgd2lsbCBpbnRyb2R1Y2UgYW4gdW5uZWNlc3NhcnkKLQkgTk9QIGJldHdlZW4gImx3YzEgJGYwIiBhbmQgInN3YzEgJGYxIi4gIFRvIGZpeCB0aGlzIHdlIHdvdWxkCi0JIG5lZWQgdG8gZGlzdGluZ3Vpc2ggcmVhZGluZyBib3RoICRmMCBhbmQgJGYxIG9yIGp1c3Qgb25lIG9mCi0JIHRoZW0uICBOb3RlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGUgb3RoZXIgd2F5LAotCSBiZWNhdXNlIHRoZXJlIGlzIG5vIGluc3RydWN0aW9uIHRoYXQgc2V0cyBib3RoICRmMCBhbmQgJGYxCi0JIGFuZCByZXF1aXJlcyBhIGRlbGF5LiAgKi8KLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0ZQUl9TKQotCSAgJiYgKCgoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9GUykgJiBPUF9NQVNLX0ZTKSAmfih1bnNpZ25lZCkxKQotCSAgICAgID09IChyZWcgJn4gKHVuc2lnbmVkKSAxKSkpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9GUFJfVCkKLQkgICYmICgoKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfRlQpICYgT1BfTUFTS19GVCkgJn4odW5zaWduZWQpMSkKLQkgICAgICA9PSAocmVnICZ+ICh1bnNpZ25lZCkgMSkpKQotCXJldHVybiAxOwotICAgIH0KLSAgZWxzZSBpZiAoISBtaXBzX29wdHMubWlwczE2KQotICAgIHsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0dQUl9TKQotCSAgJiYgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUlMpICYgT1BfTUFTS19SUykgPT0gcmVnKQotCXJldHVybiAxOwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfR1BSX1QpCi0JICAmJiAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9SVCkgJiBPUF9NQVNLX1JUKSA9PSByZWcpCi0JcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX1gpCi0JICAmJiAobWlwczE2X3RvXzMyX3JlZ19tYXBbKChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUlgpCi0JCQkJICAgICYgTUlQUzE2T1BfTUFTS19SWCldCi0JICAgICAgPT0gcmVnKSkKLQlyZXR1cm4gMTsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9ZKQotCSAgJiYgKG1pcHMxNl90b18zMl9yZWdfbWFwWygoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JZKQotCQkJCSAgICAmIE1JUFMxNk9QX01BU0tfUlkpXQotCSAgICAgID09IHJlZykpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfWikKLQkgICYmIChtaXBzMTZfdG9fMzJfcmVnX21hcFsoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9NT1ZFMzJaKQotCQkJCSAgICAmIE1JUFMxNk9QX01BU0tfTU9WRTMyWildCi0JICAgICAgPT0gcmVnKSkKLQlyZXR1cm4gMTsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9UKSAmJiByZWcgPT0gVFJFRykKLQlyZXR1cm4gMTsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9TUCkgJiYgcmVnID09IFNQKQotCXJldHVybiAxOwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEXzMxKSAmJiByZWcgPT0gUkEpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfR1BSX1gpCi0JICAmJiAoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SRUdSMzIpCi0JICAgICAgJiBNSVBTMTZPUF9NQVNLX1JFR1IzMikgPT0gcmVnKQotCXJldHVybiAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgbW9kaWZ5aW5nIGEgcmVnaXN0ZXIgcmVxdWlyZXMgYQotICAgZGVsYXkuICAqLwotCi1zdGF0aWMgaW50Ci1yZWdfbmVlZHNfZGVsYXkgKHJlZykKLSAgICAgaW50IHJlZzsKLXsKLSAgdW5zaWduZWQgbG9uZyBwcmV2X3BpbmZvOwotCi0gIHByZXZfcGluZm8gPSBwcmV2X2luc24uaW5zbl9tby0+cGluZm87Ci0gIGlmICghIG1pcHNfb3B0cy5ub3Jlb3JkZXIKLSAgICAgICYmIG1pcHNfb3B0cy5pc2EgPCA0Ci0gICAgICAmJiAoKHByZXZfcGluZm8gJiBJTlNOX0xPQURfQ09QUk9DX0RFTEFZKQotCSAgfHwgKCEgZ3ByX2ludGVybG9ja3MKLQkgICAgICAmJiAocHJldl9waW5mbyAmIElOU05fTE9BRF9NRU1PUllfREVMQVkpKSkpCi0gICAgewotICAgICAgLyogQSBsb2FkIGZyb20gYSBjb3Byb2Nlc3NvciBvciBmcm9tIG1lbW9yeS4gIEFsbCBsb2FkCi0JIGRlbGF5cyBkZWxheSB0aGUgdXNlIG9mIGdlbmVyYWwgcmVnaXN0ZXIgcnQgZm9yIG9uZQotCSBpbnN0cnVjdGlvbiBvbiB0aGUgcjMwMDAuICBUaGUgcjYwMDAgYW5kIHI0MDAwIHVzZQotCSBpbnRlcmxvY2tzLiAgKi8KLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGtub3cgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0dQUl9UKTsKLSAgICAgIGlmIChyZWcgPT0gKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUlQpICYgT1BfTUFTS19SVCkpCi0JcmV0dXJuIDE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBNYXJrIGluc3RydWN0aW9uIGxhYmVscyBpbiBtaXBzMTYgbW9kZS4gIFRoaXMgcGVybWl0cyB0aGUgbGlua2VyIHRvCi0gICBoYW5kbGUgdGhlbSBzcGVjaWFsbHksIHN1Y2ggYXMgZ2VuZXJhdGluZyBqYWx4IGluc3RydWN0aW9ucyB3aGVuCi0gICBuZWVkZWQuICBXZSBhbHNvIG1ha2UgdGhlbSBvZGQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgYXNzZW1ibHksIGluCi0gICBvcmRlciB0byBnZW5lcmF0ZSB0aGUgcmlnaHQgc29ydCBvZiBjb2RlLiAgV2Ugd2lsbCBtYWtlIHRoZW0gZXZlbgotICAgaW4gdGhlIGFkanVzdF9zeW10YWIgcm91dGluZSwgd2hpbGUgbGVhdmluZyB0aGVtIG1hcmtlZC4gIFRoaXMgaXMKLSAgIGNvbnZlbmllbnQgZm9yIHRoZSBkZWJ1Z2dlciBhbmQgdGhlIGRpc2Fzc2VtYmxlci4gIFRoZSBsaW5rZXIga25vd3MKLSAgIHRvIG1ha2UgdGhlbSBvZGQgYWdhaW4uICAqLwotCi1zdGF0aWMgdm9pZAotbWlwczE2X21hcmtfbGFiZWxzICgpCi17Ci0gIGlmIChtaXBzX29wdHMubWlwczE2KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnNuX2xhYmVsX2xpc3QgKmw7Ci0KLSAgICAgIGZvciAobCA9IGluc25fbGFiZWxzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCXsKLSNpZmRlZiBPQkpfRUxGCi0JICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCSAgICBTX1NFVF9PVEhFUiAobC0+bGFiZWwsIFNUT19NSVBTMTYpOwotI2VuZGlmCi0JICBpZiAoKGwtPmxhYmVsLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIgJiAxKSA9PSAwKQotCSAgICArK2wtPmxhYmVsLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7Ci0JfQotICAgIH0KLX0KLQotLyogT3V0cHV0IGFuIGluc3RydWN0aW9uLiAgUExBQ0UgaXMgd2hlcmUgdG8gcHV0IHRoZSBpbnN0cnVjdGlvbjsgaWYKLSAgIGl0IGlzIE5VTEwsIHRoaXMgdXNlcyBmcmFnX21vcmUgdG8gZ2V0IHJvb20uICBJUCBpcyB0aGUgaW5zdHJ1Y3Rpb24KLSAgIGluZm9ybWF0aW9uLiAgQUREUkVTU19FWFBSIGlzIGFuIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uIHRvIGJlCi0gICB1c2VkIHdpdGggUkVMT0NfVFlQRS4gICovCi0KLXN0YXRpYyB2b2lkCi1hcHBlbmRfaW5zbiAocGxhY2UsIGlwLCBhZGRyZXNzX2V4cHIsIHJlbG9jX3R5cGUsIHVubWF0Y2hlZF9oaSkKLSAgICAgY2hhciAqcGxhY2U7Ci0gICAgIHN0cnVjdCBtaXBzX2NsX2luc24gKmlwOwotICAgICBleHByZXNzaW9uUyAqYWRkcmVzc19leHByOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2NfdHlwZTsKLSAgICAgYm9vbGVhbiB1bm1hdGNoZWRfaGk7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcHJldl9waW5mbywgcGluZm87Ci0gIGNoYXIgKmY7Ci0gIGZpeFMgKmZpeHA7Ci0gIGludCBub3BzID0gMDsKLQotICAvKiBNYXJrIGluc3RydWN0aW9uIGxhYmVscyBpbiBtaXBzMTYgbW9kZS4gICovCi0gIGlmIChtaXBzX29wdHMubWlwczE2KQotICAgIG1pcHMxNl9tYXJrX2xhYmVscyAoKTsKLQotICBwcmV2X3BpbmZvID0gcHJldl9pbnNuLmluc25fbW8tPnBpbmZvOwotICBwaW5mbyA9IGlwLT5pbnNuX21vLT5waW5mbzsKLQotICBpZiAocGxhY2UgPT0gTlVMTCAmJiAoISBtaXBzX29wdHMubm9yZW9yZGVyIHx8IHByZXZfbm9wX2ZyYWcgIT0gTlVMTCkpCi0gICAgewotICAgICAgaW50IHByZXZfcHJldl9ub3A7Ci0KLSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBpbnNuIHJlcXVpcmVkIGFueSBkZWxheSBzbG90cywgc2VlIGlmIHdlIG5lZWQKLQkgdG8gaW5zZXJ0IGEgTk9QIG9yIHR3by4gIFRoZXJlIGFyZSBlaWdodCBraW5kcyBvZiBwb3NzaWJsZQotCSBoYXphcmRzLCBvZiB3aGljaCBhbiBpbnN0cnVjdGlvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSB0eXBlLgotCSAoMSkgYSBsb2FkIGZyb20gbWVtb3J5IGRlbGF5Ci0JICgyKSBhIGxvYWQgZnJvbSBhIGNvcHJvY2Vzc29yIGRlbGF5Ci0JICgzKSBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCBkZWxheQotCSAoNCkgYSBjb25kaXRpb25hbCBicmFuY2ggZGVsYXkKLQkgKDUpIGEgbW92ZSB0byBjb3Byb2Nlc3NvciByZWdpc3RlciBkZWxheQotCSAoNikgYSBsb2FkIGNvcHJvY2Vzc29yIHJlZ2lzdGVyIGZyb20gbWVtb3J5IGRlbGF5Ci0JICg3KSBhIGNvcHJvY2Vzc29yIGNvbmRpdGlvbiBjb2RlIGRlbGF5Ci0JICg4KSBhIEhJL0xPIHNwZWNpYWwgcmVnaXN0ZXIgZGVsYXkKLQotCSBUaGVyZSBhcmUgYSBsb3Qgb2Ygb3B0aW1pemF0aW9ucyB3ZSBjb3VsZCBkbyB0aGF0IHdlIGRvbid0LgotCSBJbiBwYXJ0aWN1bGFyLCB3ZSBkbyBub3QsIGluIGdlbmVyYWwsIHJlb3JkZXIgaW5zdHJ1Y3Rpb25zLgotCSBJZiB5b3UgdXNlIGdjYyB3aXRoIG9wdGltaXphdGlvbiwgaXQgd2lsbCByZW9yZGVyCi0JIGluc3RydWN0aW9ucyBhbmQgZ2VuZXJhbGx5IGRvIG11Y2ggbW9yZSBvcHRpbWl6YXRpb24gdGhlbiB3ZQotCSBkbyBoZXJlOyByZXBlYXRpbmcgYWxsIHRoYXQgd29yayBpbiB0aGUgYXNzZW1ibGVyIHdvdWxkIG9ubHkKLQkgYmVuZWZpdCBoYW5kIHdyaXR0ZW4gYXNzZW1ibHkgY29kZSwgYW5kIGRvZXMgbm90IHNlZW0gd29ydGgKLQkgaXQuICAqLwotCi0gICAgICAvKiBUaGlzIGlzIGhvdyBhIE5PUCBpcyBlbWl0dGVkLiAgKi8KLSNkZWZpbmUgZW1pdF9ub3AoKQkJCQkJXAotICAobWlwc19vcHRzLm1pcHMxNgkJCQkJXAotICAgPyBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdfbW9yZSAoMiksIDB4NjUwMCwgMikJXAotICAgOiBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdfbW9yZSAoNCksIDAsIDQpKQotCi0gICAgICAvKiBUaGUgcHJldmlvdXMgaW5zbiBtaWdodCByZXF1aXJlIGEgZGVsYXkgc2xvdCwgZGVwZW5kaW5nIHVwb24KLQkgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGluc24uICAqLwotICAgICAgaWYgKCEgbWlwc19vcHRzLm1pcHMxNgotCSAgJiYgbWlwc19vcHRzLmlzYSA8IDQKLQkgICYmICgoKHByZXZfcGluZm8gJiBJTlNOX0xPQURfQ09QUk9DX0RFTEFZKQotICAgICAgICAgICAgICAgJiYgISBjb3BfaW50ZXJsb2NrcykKLQkgICAgICB8fCAoISBncHJfaW50ZXJsb2NrcwotCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSkpKSkKLQl7Ci0JICAvKiBBIGxvYWQgZnJvbSBhIGNvcHJvY2Vzc29yIG9yIGZyb20gbWVtb3J5LiAgQWxsIGxvYWQKLQkgICAgIGRlbGF5cyBkZWxheSB0aGUgdXNlIG9mIGdlbmVyYWwgcmVnaXN0ZXIgcnQgZm9yIG9uZQotCSAgICAgaW5zdHJ1Y3Rpb24gb24gdGhlIHIzMDAwLiAgVGhlIHI2MDAwIGFuZCByNDAwMCB1c2UKLQkgICAgIGludGVybG9ja3MuICAqLwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIGtub3cgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0dQUl9UKTsKLQkgIGlmIChtaXBzX29wdGltaXplID09IDAKLQkgICAgICB8fCBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SVCkKLQkJCQkgJiBPUF9NQVNLX1JUKSwKLQkJCQlNSVBTX0dSX1JFRykpCi0JICAgICsrbm9wczsKLQl9Ci0gICAgICBlbHNlIGlmICghIG1pcHNfb3B0cy5taXBzMTYKLQkgICAgICAgJiYgbWlwc19vcHRzLmlzYSA8IDQKLQkgICAgICAgJiYgKCgocHJldl9waW5mbyAmIElOU05fQ09QUk9DX01PVkVfREVMQVkpCi0gICAgICAgICAgICAgICAgICAgICYmICEgY29wX2ludGVybG9ja3MpCi0JCSAgIHx8IChtaXBzX29wdHMuaXNhIDwgMgotCQkgICAgICAgJiYgKHByZXZfcGluZm8gJiBJTlNOX0NPUFJPQ19NRU1PUllfREVMQVkpKSkpCi0JewotCSAgLyogQSBnZW5lcmljIGNvcHJvY2Vzc29yIGRlbGF5LiAgVGhlIHByZXZpb3VzIGluc3RydWN0aW9uCi0JICAgICBtb2RpZmllZCBhIGNvcHJvY2Vzc29yIGdlbmVyYWwgb3IgY29udHJvbCByZWdpc3Rlci4gIElmCi0JICAgICBpdCBtb2RpZmllZCBhIGNvbnRyb2wgcmVnaXN0ZXIsIHdlIG5lZWQgdG8gYXZvaWQgYW55Ci0JICAgICBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiAodGhpcyBpcyBwcm9iYWJseSBub3QgYWx3YXlzCi0JICAgICByZXF1aXJlZCwgYnV0IGl0IHNvbWV0aW1lcyBpcykuICBJZiBpdCBtb2RpZmllZCBhIGdlbmVyYWwKLQkgICAgIHJlZ2lzdGVyLCB3ZSBhdm9pZCB1c2luZyB0aGF0IHJlZ2lzdGVyLgotCi0JICAgICBPbiB0aGUgcjYwMDAgYW5kIHI0MDAwIGxvYWRpbmcgYSBjb3Byb2Nlc3NvciByZWdpc3RlcgotCSAgICAgZnJvbSBtZW1vcnkgaXMgaW50ZXJsb2NrZWQsIGFuZCBkb2VzIG5vdCByZXF1aXJlIGEgZGVsYXkuCi0KLQkgICAgIFRoaXMgY2FzZSBpcyBub3QgaGFuZGxlZCB2ZXJ5IHdlbGwuICBUaGVyZSBpcyBubyBzcGVjaWFsCi0JICAgICBrbm93bGVkZ2Ugb2YgQ1AwIGhhbmRsaW5nLCBhbmQgdGhlIGNvcHJvY2Vzc29ycyBvdGhlcgotCSAgICAgdGhhbiB0aGUgZmxvYXRpbmcgcG9pbnQgdW5pdCBhcmUgbm90IGRpc3Rpbmd1aXNoZWQgYXQKLQkgICAgIGFsbC4gICovCi0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiBGSVhNRSEKLSAgICAgICAgICAgICBOZWVkIHRvIG1vZGlmeSB0aGlzIHRvIGluY2x1ZGUga25vd2xlZGdlIGFib3V0IAotICAgICAgICAgICAgIHVzZXIgc3BlY2lmaWVkIGRlbGF5cyEgICovCi0JICBpZiAocHJldl9waW5mbyAmIElOU05fV1JJVEVfRlBSX1QpCi0JICAgIHsKLQkgICAgICBpZiAobWlwc19vcHRpbWl6ZSA9PSAwCi0JCSAgfHwgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJICAgICgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX0ZUKQotCQkJCSAgICAgJiBPUF9NQVNLX0ZUKSwKLQkJCQkgICAgTUlQU19GUF9SRUcpKQotCQkrK25vcHM7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0ZQUl9TKQotCSAgICB7Ci0JICAgICAgaWYgKG1pcHNfb3B0aW1pemUgPT0gMAotCQkgIHx8IGluc25fdXNlc19yZWcgKGlwLAotCQkJCSAgICAoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9GUykKLQkJCQkgICAgICYgT1BfTUFTS19GUyksCi0JCQkJICAgIE1JUFNfRlBfUkVHKSkKLQkJKytub3BzOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBkb24ndCBrbm93IGV4YWN0bHkgd2hhdCB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KLQkJIGRvZXMuICBJZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiB1c2VzIGEgY29wcm9jZXNzb3IKLQkJIHJlZ2lzdGVyLCB3ZSBtdXN0IGluc2VydCBhIE5PUC4gIElmIHByZXZpb3VzCi0JCSBpbnN0cnVjdGlvbiBtYXkgc2V0IHRoZSBjb25kaXRpb24gY29kZXMsIGFuZCB0aGUKLQkJIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gdXNlcyB0aGVtLCB3ZSBtdXN0IGluc2VydCB0d28KLQkJIE5PUFMuICAqLwotICAgICAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICAgICAgaWYgKG1pcHNfb3B0aW1pemUgPT0gMAotCQkgIHx8ICgocHJldl9waW5mbyAmIElOU05fV1JJVEVfQ09ORF9DT0RFKQotCQkgICAgICAmJiAocGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKSkpCi0JCW5vcHMgKz0gMjsKLQkgICAgICBlbHNlIGlmIChwaW5mbyAmIElOU05fQ09QKQotCQkrK25vcHM7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICghIG1pcHNfb3B0cy5taXBzMTYKLQkgICAgICAgJiYgbWlwc19vcHRzLmlzYSA8IDQKLQkgICAgICAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkKLSAgICAgICAgICAgICAgICYmICEgY29wX2ludGVybG9ja3MpCi0JewotCSAgLyogVGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHNldHMgdGhlIGNvcHJvY2Vzc29yIGNvbmRpdGlvbgotCSAgICAgY29kZXMsIGJ1dCBkb2VzIG5vdCByZXF1aXJlIGEgZ2VuZXJhbCBjb3Byb2Nlc3NvciBkZWxheQotCSAgICAgKHRoaXMgbWVhbnMgaXQgaXMgYSBmbG9hdGluZyBwb2ludCBjb21wYXJpc29uCi0JICAgICBpbnN0cnVjdGlvbikuICBJZiB0aGlzIGluc3RydWN0aW9uIHVzZXMgdGhlIGNvbmRpdGlvbgotCSAgICAgY29kZXMsIHdlIG5lZWQgdG8gaW5zZXJ0IGEgc2luZ2xlIE5PUC4gICovCi0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgaWYgKG1pcHNfb3B0aW1pemUgPT0gMAotCSAgICAgIHx8IChwaW5mbyAmIElOU05fUkVBRF9DT05EX0NPREUpKQotCSAgICArK25vcHM7Ci0JfQotICAgICAgZWxzZSBpZiAocHJldl9waW5mbyAmIElOU05fUkVBRF9MTykKLQl7Ci0JICAvKiBUaGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gcmVhZHMgdGhlIExPIHJlZ2lzdGVyOyBpZiB0aGUKLQkgICAgIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gd3JpdGVzIHRvIHRoZSBMTyByZWdpc3Rlciwgd2UgbXVzdAotCSAgICAgaW5zZXJ0IHR3byBOT1BTLiAgU29tZSBuZXdlciBwcm9jZXNzb3JzIGhhdmUgaW50ZXJsb2Nrcy4gCi0JICAgICBBbHNvIHRoZSB0eDM5J3MgbXVsdGlwbHkgaW5zdHJ1Y3Rpb25zIGNhbiBiZSBleGVjdHV0ZWQgCi0gICAgICAgICAgICAgaW1tZWRpYXRseSBhZnRlciBhIHJlYWQgZnJvbSBISS9MTyAod2l0aG91dCB0aGUgZGVsYXkpLAotICAgICAgICAgICAgIHRob3VnaCB0aGUgdHgzOSdzIGRpdmlkZSBpbnNucyBzdGlsbCBkbyByZXF1aXJlIHRoZSAKLQkgICAgIGRlbGF5LiAqLwotCSAgaWYgKCEgKGhpbG9faW50ZXJsb2NrcwotCQkgfHwgKG1pcHNfY3B1ID09IDM5MDAgJiYgKHBpbmZvICYgSU5TTl9NVUxUKSkpCi0JICAgICAgJiYgKG1pcHNfb3B0aW1pemUgPT0gMAotCQkgIHx8IChwaW5mbyAmIElOU05fV1JJVEVfTE8pKSkKLQkgICAgbm9wcyArPSAyOwotCSAgLyogTW9zdCBtaXBzMTYgYnJhbmNoIGluc25zIGRvbid0IGhhdmUgYSBkZWxheSBzbG90LgotCSAgICAgSWYgYSByZWFkIGZyb20gTE8gaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBicmFuY2gKLQkgICAgIHRvIGEgd3JpdGUgdG8gTE8gd2UgaGF2ZSBhIHJlYWQgZm9sbG93ZWQgYnkgYSB3cml0ZQotCSAgICAgbGVzcyB0aGFuIDIgaW5zbnMgYXdheS4gIFdlIGFzc3VtZSB0aGUgdGFyZ2V0IG9mCi0JICAgICBhIGJyYW5jaCBtaWdodCBiZSBhIHdyaXRlIHRvIExPLCBhbmQgaW5zZXJ0IGEgbm9wCi0JICAgICBiZXR3ZWVuIGEgcmVhZCBhbmQgYW4gaW1tZWRpYXRlbHkgZm9sbG93aW5nIGJyYW5jaC4gKi8KLQkgIGVsc2UgaWYgKG1pcHNfb3B0cy5taXBzMTYKLQkJICAgJiYgKG1pcHNfb3B0aW1pemUgPT0gMAotCQkgICAgICAgfHwgKHBpbmZvICYgTUlQUzE2X0lOU05fQlJBTkNIKSkpCi0JICAgIG5vcHMgKz0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChwcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfSEkpCi0JewotCSAgLyogVGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHJlYWRzIHRoZSBISSByZWdpc3RlcjsgaWYgdGhlCi0JICAgICBjdXJyZW50IGluc3RydWN0aW9uIHdyaXRlcyB0byB0aGUgSEkgcmVnaXN0ZXIsIHdlIG11c3QKLQkgICAgIGluc2VydCBhIE5PUC4gIFNvbWUgbmV3ZXIgcHJvY2Vzc29ycyBoYXZlIGludGVybG9ja3MuCi0JICAgICBBbHNvIHRoZSBub3RlIHR4MzkncyBtdWx0aXBseSBhYm92ZS4gKi8KLQkgIGlmICghIChoaWxvX2ludGVybG9ja3MKLQkJIHx8IChtaXBzX2NwdSA9PSAzOTAwICYmIChwaW5mbyAmIElOU05fTVVMVCkpKQotCSAgICAgICYmIChtaXBzX29wdGltaXplID09IDAKLQkJICB8fCAocGluZm8gJiBJTlNOX1dSSVRFX0hJKSkpCi0JICAgIG5vcHMgKz0gMjsKLQkgIC8qIE1vc3QgbWlwczE2IGJyYW5jaCBpbnNucyBkb24ndCBoYXZlIGEgZGVsYXkgc2xvdC4KLQkgICAgIElmIGEgcmVhZCBmcm9tIEhJIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgYnJhbmNoCi0JICAgICB0byBhIHdyaXRlIHRvIEhJIHdlIGhhdmUgYSByZWFkIGZvbGxvd2VkIGJ5IGEgd3JpdGUKLQkgICAgIGxlc3MgdGhhbiAyIGluc25zIGF3YXkuICBXZSBhc3N1bWUgdGhlIHRhcmdldCBvZgotCSAgICAgYSBicmFuY2ggbWlnaHQgYmUgYSB3cml0ZSB0byBISSwgYW5kIGluc2VydCBhIG5vcAotCSAgICAgYmV0d2VlbiBhIHJlYWQgYW5kIGFuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBicmFuY2guICovCi0JICBlbHNlIGlmIChtaXBzX29wdHMubWlwczE2Ci0JCSAgICYmIChtaXBzX29wdGltaXplID09IDAKLQkJICAgICAgIHx8IChwaW5mbyAmIE1JUFMxNl9JTlNOX0JSQU5DSCkpKQotCSAgICBub3BzICs9IDE7Ci0JfQotCi0gICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGluIGEgbm9yZW9yZGVyIHNlY3Rpb24sIHRoZW4KLSAgICAgICAgIHdlIGRvbid0IHdhbnQgdG8gaW5zZXJ0IHRoZSBub3AgYWZ0ZXIgYWxsLiAgKi8KLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGlmIChwcmV2X2luc25fdW5yZW9yZGVyZWQpCi0Jbm9wcyA9IDA7Ci0KLSAgICAgIC8qIFRoZXJlIGFyZSB0d28gY2FzZXMgd2hpY2ggcmVxdWlyZSB0d28gaW50ZXJ2ZW5pbmcKLQkgaW5zdHJ1Y3Rpb25zOiAxKSBzZXR0aW5nIHRoZSBjb25kaXRpb24gY29kZXMgdXNpbmcgYSBtb3ZlIHRvCi0JIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uIHdoaWNoIHJlcXVpcmVzIGEgZ2VuZXJhbCBjb3Byb2Nlc3NvcgotCSBkZWxheSBhbmQgdGhlbiByZWFkaW5nIHRoZSBjb25kaXRpb24gY29kZXMgMikgcmVhZGluZyB0aGUgSEkKLQkgb3IgTE8gcmVnaXN0ZXIgYW5kIHRoZW4gd3JpdGluZyB0byBpdCAoZXhjZXB0IG9uIHByb2Nlc3NvcnMKLQkgd2hpY2ggaGF2ZSBpbnRlcmxvY2tzKS4gIElmIHdlIGFyZSBub3QgYWxyZWFkeSBlbWl0dGluZyBhIE5PUAotCSBpbnN0cnVjdGlvbiwgd2UgbXVzdCBjaGVjayBmb3IgdGhlc2UgY2FzZXMgY29tcGFyZWQgdG8gdGhlCi0JIGluc3RydWN0aW9uIHByZXZpb3VzIHRvIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4gICovCi0gICAgICBpZiAoKCEgbWlwc19vcHRzLm1pcHMxNgotCSAgICYmIG1pcHNfb3B0cy5pc2EgPCA0Ci0JICAgJiYgKHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9DT1BST0NfTU9WRV9ERUxBWSkKLQkgICAmJiAocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkKLQkgICAmJiAocGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKQotCSAgICYmICEgY29wX2ludGVybG9ja3MpCi0JICB8fCAoKHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0xPKQotCSAgICAgICYmIChwaW5mbyAmIElOU05fV1JJVEVfTE8pCi0JICAgICAgJiYgISAoaGlsb19pbnRlcmxvY2tzCi0JCSAgICB8fCAobWlwc19jcHUgPT0gMzkwMCAmJiAocGluZm8gJiBJTlNOX01VTFQpKSkpCi0JICB8fCAoKHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0hJKQotCSAgICAgICYmIChwaW5mbyAmIElOU05fV1JJVEVfSEkpCi0JICAgICAgJiYgISAoaGlsb19pbnRlcmxvY2tzCi0JCSAgICB8fCAobWlwc19jcHUgPT0gMzkwMCAmJiAocGluZm8gJiBJTlNOX01VTFQpKSkpKQotCXByZXZfcHJldl9ub3AgPSAxOwotICAgICAgZWxzZQotCXByZXZfcHJldl9ub3AgPSAwOwotCi0gICAgICBpZiAocHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQpCi0JcHJldl9wcmV2X25vcCA9IDA7Ci0KLSAgICAgIGlmIChwcmV2X3ByZXZfbm9wICYmIG5vcHMgPT0gMCkKLQkrK25vcHM7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBiZWluZyBnaXZlbiBhIG5vcCBpbnN0cnVjdGlvbiwgZG9uJ3QgYm90aGVyIHdpdGgKLQkgb25lIG9mIHRoZSBub3BzIHdlIHdvdWxkIG90aGVyd2lzZSBvdXRwdXQuICBUaGlzIHdpbGwgb25seQotCSBoYXBwZW4gd2hlbiBhIG5vcCBpbnN0cnVjdGlvbiBpcyB1c2VkIHdpdGggbWlwc19vcHRpbWl6ZSBzZXQKLQkgdG8gMC4gICovCi0gICAgICBpZiAobm9wcyA+IDAKLQkgICYmICEgbWlwc19vcHRzLm5vcmVvcmRlcgotCSAgJiYgaXAtPmluc25fb3Bjb2RlID09IChtaXBzX29wdHMubWlwczE2ID8gMHg2NTAwIDogMCkpCi0JLS1ub3BzOwotCi0gICAgICAvKiBOb3cgZW1pdCB0aGUgcmlnaHQgbnVtYmVyIG9mIE5PUCBpbnN0cnVjdGlvbnMuICAqLwotICAgICAgaWYgKG5vcHMgPiAwICYmICEgbWlwc19vcHRzLm5vcmVvcmRlcikKLQl7Ci0JICBmcmFnUyAqb2xkX2ZyYWc7Ci0JICB1bnNpZ25lZCBsb25nIG9sZF9mcmFnX29mZnNldDsKLQkgIGludCBpOwotCSAgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqbDsKLQotCSAgb2xkX2ZyYWcgPSBmcmFnX25vdzsKLQkgIG9sZF9mcmFnX29mZnNldCA9IGZyYWdfbm93X2ZpeCAoKTsKLQotCSAgZm9yIChpID0gMDsgaSA8IG5vcHM7IGkrKykKLQkgICAgZW1pdF9ub3AgKCk7Ci0KLQkgIGlmIChsaXN0aW5nKQotCSAgICB7Ci0JICAgICAgbGlzdGluZ19wcmV2X2xpbmUgKCk7Ci0JICAgICAgLyogV2UgbWF5IGJlIGF0IHRoZSBzdGFydCBvZiBhIHZhcmlhbnQgZnJhZy4gIEluIGNhc2Ugd2UKLSAgICAgICAgICAgICAgICAgYXJlLCBtYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGZvciB0aGUgZnJhZwotICAgICAgICAgICAgICAgICBhZnRlciB0aGUgZnJhZ3MgY3JlYXRlZCBieSBsaXN0aW5nX3ByZXZfbGluZS4gIFRoZQotICAgICAgICAgICAgICAgICBhcmd1bWVudCB0byBmcmFnX2dyb3cgaGVyZSBtdXN0IGJlIGF0IGxlYXN0IGFzIGxhcmdlCi0gICAgICAgICAgICAgICAgIGFzIHRoZSBhcmd1bWVudCB0byBhbGwgb3RoZXIgY2FsbHMgdG8gZnJhZ19ncm93IGluCi0gICAgICAgICAgICAgICAgIHRoaXMgZmlsZS4gIFdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYmVpbmcgaW4gdGhlCi0gICAgICAgICAgICAgICAgIG1pZGRsZSBvZiBhIHZhcmlhbnQgZnJhZywgYmVjYXVzZSB0aGUgdmFyaWFudHMgaW5zZXJ0Ci0gICAgICAgICAgICAgICAgIGFsbCBuZWVkZWQgbm9wIGluc3RydWN0aW9ucyB0aGVtc2VsdmVzLiAgKi8KLQkgICAgICBmcmFnX2dyb3cgKDQwKTsKLQkgICAgfQotCi0JICBmb3IgKGwgPSBpbnNuX2xhYmVsczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLQkgICAgewotCSAgICAgIGFzc2VydCAoU19HRVRfU0VHTUVOVCAobC0+bGFiZWwpID09IG5vd19zZWcpOwotCSAgICAgIGwtPmxhYmVsLT5zeV9mcmFnID0gZnJhZ19ub3c7Ci0JICAgICAgU19TRVRfVkFMVUUgKGwtPmxhYmVsLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCSAgICAgIC8qIG1pcHMxNiB0ZXh0IGxhYmVscyBhcmUgc3RvcmVkIGFzIG9kZC4gICovCi0JICAgICAgaWYgKG1pcHNfb3B0cy5taXBzMTYpCi0JCSsrbC0+bGFiZWwtPnN5X3ZhbHVlLlhfYWRkX251bWJlcjsKLQkgICAgfQotCi0jaWZuZGVmIE5PX0VDT0ZGX0RFQlVHR0lORwotCSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLQkgICAgZWNvZmZfZml4X2xvYyAob2xkX2ZyYWcsIG9sZF9mcmFnX29mZnNldCk7Ci0jZW5kaWYKLQl9Ci0gICAgICBlbHNlIGlmIChwcmV2X25vcF9mcmFnICE9IE5VTEwpCi0JewotCSAgLyogV2UgaGF2ZSBhIGZyYWcgaG9sZGluZyBub3BzIHdlIG1heSBiZSBhYmxlIHRvIHJlbW92ZS4gIElmCi0gICAgICAgICAgICAgd2UgZG9uJ3QgbmVlZCBhbnkgbm9wcywgd2UgY2FuIGRlY3JlYXNlIHRoZSBzaXplIG9mCi0gICAgICAgICAgICAgcHJldl9ub3BfZnJhZyBieSB0aGUgc2l6ZSBvZiBvbmUgaW5zdHJ1Y3Rpb24uICBJZiB3ZSBkbwotICAgICAgICAgICAgIG5lZWQgc29tZSBub3BzLCB3ZSBjb3VudCB0aGVtIGluIHByZXZfbm9wc19yZXF1aXJlZC4gKi8KLQkgIGlmIChwcmV2X25vcF9mcmFnX3NpbmNlID09IDApCi0JICAgIHsKLQkgICAgICBpZiAobm9wcyA9PSAwKQotCQl7Ci0JCSAgcHJldl9ub3BfZnJhZy0+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+ZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudCkKLQkgICAgICAvKiBJZiB0aGUgYnJhbmNoIHJlYWRzIHRoZSBjb25kaXRpb24gY29kZXMsIHdlIGRvbid0Ci0JCSBldmVuIHRyeSB0byBzd2FwLCBiZWNhdXNlIGluIHRoZSBzZXF1ZW5jZQotCQkgICBjdGMxICRYLCQzMQotCQkgICBJTlNOCi0JCSAgIElOU04KLQkJICAgYmMxdCBMQUJFTAotCQkgd2UgY2FuIG5vdCBzd2FwLCBhbmQgSSBkb24ndCBmZWVsIGxpa2UgaGFuZGxpbmcgdGhhdAotCQkgY2FzZS4gICovCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIG1pcHNfb3B0cy5pc2EgPCA0Ci0JCSAgJiYgKHBpbmZvICYgSU5TTl9SRUFEX0NPTkRfQ09ERSkpCi0JICAgICAgLyogV2UgY2FuIG5vdCBzd2FwIHdpdGggYW4gaW5zdHJ1Y3Rpb24gdGhhdCByZXF1aXJlcyBhCi0JCSBkZWxheSBzbG90LCBiZWNhc2UgdGhlIHRhcmdldCBvZiB0aGUgYnJhbmNoIG1pZ2h0Ci0JCSBpbnRlcmZlcmUgd2l0aCB0aGF0IGluc3RydWN0aW9uLiAgKi8KLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgbWlwc19vcHRzLmlzYSA8IDQKLQkJICAmJiAocHJldl9waW5mbwotICAgICAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JCSAgICAgICYgKElOU05fTE9BRF9DT1BST0NfREVMQVkKLQkJCSB8IElOU05fQ09QUk9DX01PVkVfREVMQVkKLQkJCSB8IElOU05fV1JJVEVfQ09ORF9DT0RFKSkpCi0JICAgICAgfHwgKCEgKGhpbG9faW50ZXJsb2NrcwotCQkgICAgIHx8IChtaXBzX2NwdSA9PSAzOTAwICYmIChwaW5mbyAmIElOU05fTVVMVCkpKQotCQkgICYmIChwcmV2X3BpbmZvCi0JCSAgICAgICYgKElOU05fUkVBRF9MTwotCQkJIHwgSU5TTl9SRUFEX0hJKSkpCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmICEgZ3ByX2ludGVybG9ja3MKLQkJICAmJiAocHJldl9waW5mbyAmIElOU05fTE9BRF9NRU1PUllfREVMQVkpKQotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiBtaXBzX29wdHMuaXNhIDwgMgotICAgICAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9DT1BST0NfTUVNT1JZX0RFTEFZKSkKLQkgICAgICAvKiBXZSBjYW4gbm90IHN3YXAgd2l0aCBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgfHwgKHByZXZfcGluZm8KLQkJICAmIChJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkKLQkJICAgICB8IElOU05fQ09ORF9CUkFOQ0hfREVMQVkKLQkJICAgICB8IElOU05fQ09ORF9CUkFOQ0hfTElLRUxZKSkKLQkgICAgICAvKiBXZSBkbyBub3Qgc3dhcCB3aXRoIGEgdHJhcCBpbnN0cnVjdGlvbiwgc2luY2UgaXQKLQkJIGNvbXBsaWNhdGVzIHRyYXAgaGFuZGxlcnMgdG8gaGF2ZSB0aGUgdHJhcAotCQkgaW5zdHJ1Y3Rpb24gYmUgaW4gYSBkZWxheSBzbG90LiAgKi8KLQkgICAgICB8fCAocHJldl9waW5mbyAmIElOU05fVFJBUCkKLQkgICAgICAvKiBJZiB0aGUgYnJhbmNoIHJlYWRzIGEgcmVnaXN0ZXIgdGhhdCB0aGUgcHJldmlvdXMKLQkJIGluc3RydWN0aW9uIHNldHMsIHdlIGNhbiBub3Qgc3dhcC4gICovCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9HUFJfVCkKLQkJICAmJiBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkgICAgKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUlQpCi0JCQkJICAgICAmIE9QX01BU0tfUlQpLAotCQkJCSAgICBNSVBTX0dSX1JFRykpCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9HUFJfRCkKLQkJICAmJiBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkgICAgKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUkQpCi0JCQkJICAgICAmIE9QX01BU0tfUkQpLAotCQkJCSAgICBNSVBTX0dSX1JFRykpCi0JICAgICAgfHwgKG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAoKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfWCkKLQkJICAgICAgICYmIGluc25fdXNlc19yZWcgKGlwLAotCQkJCQkgKChwcmV2X2luc24uaW5zbl9vcGNvZGUKLQkJCQkJICAgPj4gTUlQUzE2T1BfU0hfUlgpCi0JCQkJCSAgJiBNSVBTMTZPUF9NQVNLX1JYKSwKLQkJCQkJIE1JUFMxNl9SRUcpKQotCQkgICAgICB8fCAoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9ZKQotCQkJICAmJiBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkJICAgICgocHJldl9pbnNuLmluc25fb3Bjb2RlCi0JCQkJCSAgICAgID4+IE1JUFMxNk9QX1NIX1JZKQotCQkJCQkgICAgICYgTUlQUzE2T1BfTUFTS19SWSksCi0JCQkJCSAgICBNSVBTMTZfUkVHKSkKLQkJICAgICAgfHwgKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfWikKLQkJCSAgJiYgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJCSAgICAoKHByZXZfaW5zbi5pbnNuX29wY29kZQotCQkJCQkgICAgICA+PiBNSVBTMTZPUF9TSF9SWikKLQkJCQkJICAgICAmIE1JUFMxNk9QX01BU0tfUlopLAotCQkJCQkgICAgTUlQUzE2X1JFRykpCi0JCSAgICAgIHx8ICgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFX1QpCi0JCQkgICYmIGluc25fdXNlc19yZWcgKGlwLCBUUkVHLCBNSVBTX0dSX1JFRykpCi0JCSAgICAgIHx8ICgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFXzMxKQotCQkJICAmJiBpbnNuX3VzZXNfcmVnIChpcCwgUkEsIE1JUFNfR1JfUkVHKSkKLQkJICAgICAgfHwgKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfR1BSX1kpCi0JCQkgICYmIGluc25fdXNlc19yZWcgKGlwLAotCQkJCQkgICAgTUlQUzE2T1BfRVhUUkFDVF9SRUczMlIgKHByZXZfaW5zbi4KLQkJCQkJCQkJICAgICBpbnNuX29wY29kZSksCi0JCQkJCSAgICBNSVBTX0dSX1JFRykpKSkKLQkgICAgICAvKiBJZiB0aGUgYnJhbmNoIHdyaXRlcyBhIHJlZ2lzdGVyIHRoYXQgdGhlIHByZXZpb3VzCi0JCSBpbnN0cnVjdGlvbiBzZXRzLCB3ZSBjYW4gbm90IHN3YXAgKHdlIGtub3cgdGhhdAotCQkgYnJhbmNoZXMgd3JpdGUgb25seSB0byBSRCBvciB0byAkMzEpLiAgKi8KLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0dQUl9UKQotCQkgICYmICgoKHBpbmZvICYgSU5TTl9XUklURV9HUFJfRCkKLQkJICAgICAgICYmICgoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SVCkgJiBPUF9NQVNLX1JUKQotCQkJICAgPT0gKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUkQpICYgT1BfTUFTS19SRCkpKQotCQkgICAgICB8fCAoKHBpbmZvICYgSU5TTl9XUklURV9HUFJfMzEpCi0JCQkgICYmICgoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SVCkKLQkJCSAgICAgICAmIE9QX01BU0tfUlQpCi0JCQkgICAgICA9PSAzMSkpKSkKLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0dQUl9EKQotCQkgICYmICgoKHBpbmZvICYgSU5TTl9XUklURV9HUFJfRCkKLQkJICAgICAgICYmICgoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEKQotCQkJICAgPT0gKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUkQpICYgT1BfTUFTS19SRCkpKQotCQkgICAgICB8fCAoKHBpbmZvICYgSU5TTl9XUklURV9HUFJfMzEpCi0JCQkgICYmICgoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkKLQkJCSAgICAgICAmIE9QX01BU0tfUkQpCi0JCQkgICAgICA9PSAzMSkpKSkKLQkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwaW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFXzMxKQotCQkgICYmICgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFXzMxKQotCQkgICAgICB8fCAoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9HUFJfWSkKLQkJCSAgJiYgKE1JUFMxNk9QX0VYVFJBQ1RfUkVHMzJSIChwcmV2X2luc24uaW5zbl9vcGNvZGUpCi0JCQkgICAgICA9PSBSQSkpKSkKLQkgICAgICAvKiBJZiB0aGUgYnJhbmNoIHdyaXRlcyBhIHJlZ2lzdGVyIHRoYXQgdGhlIHByZXZpb3VzCi0JCSBpbnN0cnVjdGlvbiByZWFkcywgd2UgY2FuIG5vdCBzd2FwICh3ZSBrbm93IHRoYXQKLQkJIGJyYW5jaGVzIG9ubHkgd3JpdGUgdG8gUkQgb3IgdG8gJDMxKS4gICovCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwaW5mbyAmIElOU05fV1JJVEVfR1BSX0QpCi0JCSAgJiYgaW5zbl91c2VzX3JlZyAoJnByZXZfaW5zbiwKLQkJCQkgICAgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUkQpCi0JCQkJICAgICAmIE9QX01BU0tfUkQpLAotCQkJCSAgICBNSVBTX0dSX1JFRykpCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwaW5mbyAmIElOU05fV1JJVEVfR1BSXzMxKQotCQkgICYmIGluc25fdXNlc19yZWcgKCZwcmV2X2luc24sIDMxLCBNSVBTX0dSX1JFRykpCi0JICAgICAgfHwgKG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAocGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV8zMSkKLQkJICAmJiBpbnNuX3VzZXNfcmVnICgmcHJldl9pbnNuLCBSQSwgTUlQU19HUl9SRUcpKQotCSAgICAgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlLCB0aGUgYnJhbmNoCi0JCSBtaWdodCBiZSBleHBhbmRlZCBpbnRvIGEgc2VxdWVuY2Ugd2hpY2ggdXNlcyAkYXQsIHNvCi0JCSB3ZSBjYW4ndCBzd2FwIHdpdGggYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggcmVhZHMgaXQuICAqLwotCSAgICAgIHx8IChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMKLQkJICAmJiBpbnNuX3VzZXNfcmVnICgmcHJldl9pbnNuLCBBVCwgTUlQU19HUl9SRUcpKQotCSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBwcmV2aW91cyBpbnN0cnVjdGlvbiBoYXMgYSBsb2FkCi0JCSBkZWxheSwgYW5kIHNldHMgYSByZWdpc3RlciB0aGF0IHRoZSBicmFuY2ggcmVhZHMsIHdlCi0JCSBjYW4gbm90IHN3YXAuICAqLwotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiBtaXBzX29wdHMuaXNhIDwgNAotICAgICAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JCSAgJiYgKChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fTE9BRF9DT1BST0NfREVMQVkpCi0JCSAgICAgIHx8ICghIGdwcl9pbnRlcmxvY2tzCi0JCQkgICYmIChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbwotCQkJICAgICAgJiBJTlNOX0xPQURfTUVNT1JZX0RFTEFZKSkpCi0JCSAgJiYgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJICAgICgocHJldl9wcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUlQpCi0JCQkJICAgICAmIE9QX01BU0tfUlQpLAotCQkJCSAgICBNSVBTX0dSX1JFRykpCi0JICAgICAgLyogSWYgb25lIGluc3RydWN0aW9uIHNldHMgYSBjb25kaXRpb24gY29kZSBhbmQgdGhlCi0gICAgICAgICAgICAgICAgIG90aGVyIG9uZSB1c2VzIGEgY29uZGl0aW9uIGNvZGUsIHdlIGNhbiBub3Qgc3dhcC4gICovCi0JICAgICAgfHwgKChwaW5mbyAmIElOU05fUkVBRF9DT05EX0NPREUpCi0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkpCi0JICAgICAgfHwgKChwaW5mbyAmIElOU05fV1JJVEVfQ09ORF9DT0RFKQotCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9SRUFEX0NPTkRfQ09ERSkpCi0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHVzZXMgdGhlIFBDLCB3ZSBjYW4gbm90Ci0gICAgICAgICAgICAgICAgIHN3YXAuICAqLwotCSAgICAgIHx8IChtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX1BDKSkKLQkgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGV4dGVuZGVkLCB3ZSBjYW4gbm90Ci0gICAgICAgICAgICAgICAgIHN3YXAuICAqLwotCSAgICAgIHx8IChtaXBzX29wdHMubWlwczE2ICYmIHByZXZfaW5zbl9leHRlbmRlZCkKLQkgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaGFkIGEgZml4dXAgaW4gbWlwczE2Ci0gICAgICAgICAgICAgICAgIG1vZGUsIHdlIGNhbiBub3Qgc3dhcC4gIFRoaXMgbm9ybWFsbHkgbWVhbnMgdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGEgNCBieXRlIGJyYW5jaCBhbnlob3cuICAqLwotCSAgICAgIHx8IChtaXBzX29wdHMubWlwczE2ICYmIHByZXZfaW5zbl9maXhwKQotCSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBhIHN5bmMsIHN5bmMubCwgb3IgCi0JCSBzeW5jLnAsIHdlIGNhbiBub3Qgc3dhcC4gKi8KLQkgICAgICB8fCAocHJldl9waW5mbyAmJiBJTlNOX1NZTkMpKQotCSAgICB7Ci0JICAgICAgLyogV2UgY291bGQgZG8gZXZlbiBiZXR0ZXIgZm9yIHVuY29uZGl0aW9uYWwgYnJhbmNoZXMgdG8KLQkJIHBvcnRpb25zIG9mIHRoaXMgb2JqZWN0IGZpbGU7IHdlIGNvdWxkIHBpY2sgdXAgdGhlCi0JCSBpbnN0cnVjdGlvbiBhdCB0aGUgZGVzdGluYXRpb24sIHB1dCBpdCBpbiB0aGUgZGVsYXkKLQkJIHNsb3QsIGFuZCBidW1wIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzLiAgKi8KLQkgICAgICBlbWl0X25vcCAoKTsKLQkgICAgICAvKiBVcGRhdGUgdGhlIHByZXZpb3VzIGluc24gaW5mb3JtYXRpb24uICAqLwotCSAgICAgIHByZXZfcHJldl9pbnNuID0gKmlwOwotCSAgICAgIHByZXZfaW5zbi5pbnNuX21vID0gJmR1bW15X29wY29kZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogSXQgbG9va3MgbGlrZSB3ZSBjYW4gYWN0dWFsbHkgZG8gdGhlIHN3YXAuICAqLwotCSAgICAgIGlmICghIG1pcHNfb3B0cy5taXBzMTYpCi0JCXsKLQkJICBjaGFyICpwcmV2X2Y7Ci0JCSAgY2hhciB0ZW1wWzRdOwotCi0JCSAgcHJldl9mID0gcHJldl9pbnNuX2ZyYWctPmZyX2xpdGVyYWwgKyBwcmV2X2luc25fd2hlcmU7Ci0JCSAgbWVtY3B5ICh0ZW1wLCBwcmV2X2YsIDQpOwotCQkgIG1lbWNweSAocHJldl9mLCBmLCA0KTsKLQkJICBtZW1jcHkgKGYsIHRlbXAsIDQpOwotCQkgIGlmIChwcmV2X2luc25fZml4cCkKLQkJICAgIHsKLQkJICAgICAgcHJldl9pbnNuX2ZpeHAtPmZ4X2ZyYWcgPSBmcmFnX25vdzsKLQkJICAgICAgcHJldl9pbnNuX2ZpeHAtPmZ4X3doZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOwotCQkgICAgfQotCQkgIGlmIChmaXhwKQotCQkgICAgewotCQkgICAgICBmaXhwLT5meF9mcmFnID0gcHJldl9pbnNuX2ZyYWc7Ci0JCSAgICAgIGZpeHAtPmZ4X3doZXJlID0gcHJldl9pbnNuX3doZXJlOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY2hhciAqcHJldl9mOwotCQkgIGNoYXIgdGVtcFsyXTsKLQotCQkgIGFzc2VydCAocHJldl9pbnNuX2ZpeHAgPT0gTlVMTCk7Ci0JCSAgcHJldl9mID0gcHJldl9pbnNuX2ZyYWctPmZyX2xpdGVyYWwgKyBwcmV2X2luc25fd2hlcmU7Ci0JCSAgbWVtY3B5ICh0ZW1wLCBwcmV2X2YsIDIpOwotCQkgIG1lbWNweSAocHJldl9mLCBmLCAyKTsKLQkJICBpZiAocmVsb2NfdHlwZSAhPSBCRkRfUkVMT0NfTUlQUzE2X0pNUCkKLQkJICAgIHsKLQkJICAgICAgYXNzZXJ0IChyZWxvY190eXBlID09IEJGRF9SRUxPQ19VTlVTRUQpOwotCQkgICAgICBtZW1jcHkgKGYsIHRlbXAsIDIpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbWVtY3B5IChmLCBmICsgMiwgMik7Ci0JCSAgICAgIG1lbWNweSAoZiArIDIsIHRlbXAsIDIpOwotCQkgICAgfQotCQkgIGlmIChmaXhwKQotCQkgICAgewotCQkgICAgICBmaXhwLT5meF9mcmFnID0gcHJldl9pbnNuX2ZyYWc7Ci0JCSAgICAgIGZpeHAtPmZ4X3doZXJlID0gcHJldl9pbnNuX3doZXJlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBVcGRhdGUgdGhlIHByZXZpb3VzIGluc24gaW5mb3JtYXRpb247IGxlYXZlIHByZXZfaW5zbgotCQkgdW5jaGFuZ2VkLiAgKi8KLQkgICAgICBwcmV2X3ByZXZfaW5zbiA9ICppcDsKLQkgICAgfQotCSAgcHJldl9pbnNuX2lzX2RlbGF5X3Nsb3QgPSAxOwotCi0JICAvKiBJZiB0aGF0IHdhcyBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCwgZm9yZ2V0IHRoZSBwcmV2aW91cwotCSAgICAgaW5zbiBpbmZvcm1hdGlvbi4gICovCi0JICBpZiAocGluZm8gJiBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkpCi0JICAgIHsKLQkgICAgICBwcmV2X3ByZXZfaW5zbi5pbnNuX21vID0gJmR1bW15X29wY29kZTsKLQkgICAgICBwcmV2X2luc24uaW5zbl9tbyA9ICZkdW1teV9vcGNvZGU7Ci0JICAgIH0KLQotCSAgcHJldl9pbnNuX2ZpeHAgPSBOVUxMOwotCSAgcHJldl9pbnNuX3JlbG9jX3R5cGUgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgcHJldl9pbnNuX2V4dGVuZGVkID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChwaW5mbyAmIElOU05fQ09ORF9CUkFOQ0hfTElLRUxZKQotCXsKLQkgIC8qIFdlIGRvbid0IHlldCBvcHRpbWl6ZSBhIGJyYW5jaCBsaWtlbHkuICBXaGF0IHdlIHNob3VsZCBkbwotCSAgICAgaXMgbG9vayBhdCB0aGUgdGFyZ2V0LCBjb3B5IHRoZSBpbnN0cnVjdGlvbiBmb3VuZCB0aGVyZQotCSAgICAgaW50byB0aGUgZGVsYXkgc2xvdCwgYW5kIGluY3JlbWVudCB0aGUgYnJhbmNoIHRvIGp1bXAgdG8KLQkgICAgIHRoZSBuZXh0IGluc3RydWN0aW9uLiAgKi8KLQkgIGVtaXRfbm9wICgpOwotCSAgLyogVXBkYXRlIHRoZSBwcmV2aW91cyBpbnNuIGluZm9ybWF0aW9uLiAgKi8KLQkgIHByZXZfcHJldl9pbnNuID0gKmlwOwotCSAgcHJldl9pbnNuLmluc25fbW8gPSAmZHVtbXlfb3Bjb2RlOwotCSAgcHJldl9pbnNuX2ZpeHAgPSBOVUxMOwotCSAgcHJldl9pbnNuX3JlbG9jX3R5cGUgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgcHJldl9pbnNuX2V4dGVuZGVkID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVXBkYXRlIHRoZSBwcmV2aW91cyBpbnNuIGluZm9ybWF0aW9uLiAgKi8KLQkgIGlmIChub3BzID4gMCkKLQkgICAgcHJldl9wcmV2X2luc24uaW5zbl9tbyA9ICZkdW1teV9vcGNvZGU7Ci0JICBlbHNlCi0JICAgIHByZXZfcHJldl9pbnNuID0gcHJldl9pbnNuOwotCSAgcHJldl9pbnNuID0gKmlwOwotCi0JICAvKiBBbnkgdGltZSB3ZSBzZWUgYSBicmFuY2gsIHdlIGFsd2F5cyBmaWxsIHRoZSBkZWxheSBzbG90Ci0JICAgICBpbW1lZGlhdGVseTsgc2luY2UgdGhpcyBpbnNuIGlzIG5vdCBhIGJyYW5jaCwgd2Uga25vdyBpdAotCSAgICAgaXMgbm90IGluIGEgZGVsYXkgc2xvdC4gICovCi0JICBwcmV2X2luc25faXNfZGVsYXlfc2xvdCA9IDA7Ci0KLQkgIHByZXZfaW5zbl9maXhwID0gZml4cDsKLQkgIHByZXZfaW5zbl9yZWxvY190eXBlID0gcmVsb2NfdHlwZTsKLQkgIGlmIChtaXBzX29wdHMubWlwczE2KQotCSAgICBwcmV2X2luc25fZXh0ZW5kZWQgPSAoaXAtPnVzZV9leHRlbmQKLQkJCQkgIHx8IHJlbG9jX3R5cGUgPiBCRkRfUkVMT0NfVU5VU0VEKTsKLQl9Ci0KLSAgICAgIHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkID0gcHJldl9pbnNuX3VucmVvcmRlcmVkOwotICAgICAgcHJldl9pbnNuX3VucmVvcmRlcmVkID0gMDsKLSAgICAgIHByZXZfaW5zbl9mcmFnID0gZnJhZ19ub3c7Ci0gICAgICBwcmV2X2luc25fd2hlcmUgPSBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWw7Ci0gICAgICBwcmV2X2luc25fdmFsaWQgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAocGxhY2UgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHRvIHJlY29yZCBhIGJpdCBvZiBpbmZvcm1hdGlvbiBldmVuIHdoZW4gd2UgYXJlIG5vdAotICAgICAgICAgcmVvcmRlcmluZywgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHRoZSBiYXNlIGFkZHJlc3MgZm9yIG1pcHMxNgotICAgICAgICAgUEMgcmVsYXRpdmUgcmVsb2NzLiAgKi8KLSAgICAgIHByZXZfcHJldl9pbnNuID0gcHJldl9pbnNuOwotICAgICAgcHJldl9pbnNuID0gKmlwOwotICAgICAgcHJldl9pbnNuX3JlbG9jX3R5cGUgPSByZWxvY190eXBlOwotICAgICAgcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQgPSBwcmV2X2luc25fdW5yZW9yZGVyZWQ7Ci0gICAgICBwcmV2X2luc25fdW5yZW9yZGVyZWQgPSAxOwotICAgIH0KLQotICAvKiBXZSBqdXN0IG91dHB1dCBhbiBpbnNuLCBzbyB0aGUgbmV4dCBvbmUgZG9lc24ndCBoYXZlIGEgbGFiZWwuICAqLwotICBtaXBzX2NsZWFyX2luc25fbGFiZWxzICgpOwotCi0gIC8qIFdlIG11c3QgZW5zdXJlIHRoYXQgYSBmaXh1cCBhc3NvY2lhdGVkIHdpdGggYW4gdW5tYXRjaGVkICVoaQotICAgICByZWxvYyBkb2VzIG5vdCBiZWNvbWUgYSB2YXJpYW50IGZyYWcuICBPdGhlcndpc2UsIHRoZQotICAgICByZWFycmFuZ2VtZW50IG9mICVoaSByZWxvY3MgaW4gZnJvYl9maWxlIG1heSBjb25mdXNlCi0gICAgIHRjX2dlbl9yZWxvYy4gICovCi0gIGlmICh1bm1hdGNoZWRfaGkpCi0gICAgewotICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gICAgICBmcmFnX25ldyAoMCk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGZvcmdldHMgdGhhdCB0aGVyZSB3YXMgYW55IHByZXZpb3VzIGluc3RydWN0aW9uIG9yCi0gICBsYWJlbC4gIElmIFBSRVNFUlZFIGlzIG5vbi16ZXJvLCBpdCByZW1lbWJlcnMgZW5vdWdoIGluZm9ybWF0aW9uIHRvCi0gICBrbm93IHdoZXRoZXIgbm9wcyBhcmUgbmVlZGVkIGJlZm9yZSBhIG5vcmVvcmRlciBzZWN0aW9uLiAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19ub19wcmV2X2luc24gKHByZXNlcnZlKQotICAgICBpbnQgcHJlc2VydmU7Ci17Ci0gIGlmICghIHByZXNlcnZlKQotICAgIHsKLSAgICAgIHByZXZfaW5zbi5pbnNuX21vID0gJmR1bW15X29wY29kZTsKLSAgICAgIHByZXZfcHJldl9pbnNuLmluc25fbW8gPSAmZHVtbXlfb3Bjb2RlOwotICAgICAgcHJldl9ub3BfZnJhZyA9IE5VTEw7Ci0gICAgICBwcmV2X25vcF9mcmFnX2hvbGRzID0gMDsKLSAgICAgIHByZXZfbm9wX2ZyYWdfcmVxdWlyZWQgPSAwOwotICAgICAgcHJldl9ub3BfZnJhZ19zaW5jZSA9IDA7Ci0gICAgfQotICBwcmV2X2luc25fdmFsaWQgPSAwOwotICBwcmV2X2luc25faXNfZGVsYXlfc2xvdCA9IDA7Ci0gIHByZXZfaW5zbl91bnJlb3JkZXJlZCA9IDA7Ci0gIHByZXZfaW5zbl9leHRlbmRlZCA9IDA7Ci0gIHByZXZfaW5zbl9yZWxvY190eXBlID0gQkZEX1JFTE9DX1VOVVNFRDsKLSAgcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQgPSAwOwotICBtaXBzX2NsZWFyX2luc25fbGFiZWxzICgpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW5ldmVyIHdlIHR1cm4gb24gbm9yZW9yZGVyIG9yIGVtaXQKLSAgIHNvbWV0aGluZyBvdGhlciB0aGFuIGluc3RydWN0aW9ucy4gIEl0IGluc2VydHMgYW55IE5PUFMgd2hpY2ggbWlnaHQKLSAgIGJlIG5lZWRlZCBieSB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24sIGFuZCBjbGVhcnMgdGhlIGluZm9ybWF0aW9uCi0gICBrZXB0IGZvciB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb25zLiAgVGhlIElOU05TIHBhcmFtZXRlciBpcyB0cnVlIGlmCi0gICBpbnN0cnVjdGlvbnMgYXJlIHRvIGZvbGxvdy4gKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZW1pdF9kZWxheXMgKGluc25zKQotICAgICBib29sZWFuIGluc25zOwotewotICBpZiAoISBtaXBzX29wdHMubm9yZW9yZGVyKQotICAgIHsKLSAgICAgIGludCBub3BzOwotCi0gICAgICBub3BzID0gMDsKLSAgICAgIGlmICgoISBtaXBzX29wdHMubWlwczE2Ci0JICAgJiYgbWlwc19vcHRzLmlzYSA8IDQKLQkgICAmJiAoISBjb3BfaW50ZXJsb2NrcwotICAgICAgICAgICAgICAgJiYgKHByZXZfaW5zbi5pbnNuX21vLT5waW5mbwotICAgICAgICAgICAgICAgICAgICYgKElOU05fTE9BRF9DT1BST0NfREVMQVkKLSAgICAgICAgICAgICAgICAgICAgICB8IElOU05fQ09QUk9DX01PVkVfREVMQVkKLSAgICAgICAgICAgICAgICAgICAgICB8IElOU05fV1JJVEVfQ09ORF9DT0RFKSkpKQotCSAgfHwgKCEgaGlsb19pbnRlcmxvY2tzCi0JICAgICAgJiYgKHByZXZfaW5zbi5pbnNuX21vLT5waW5mbwotCQkgICYgKElOU05fUkVBRF9MTwotCQkgICAgIHwgSU5TTl9SRUFEX0hJKSkpCi0JICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JICAgICAgJiYgISBncHJfaW50ZXJsb2NrcwotCSAgICAgICYmIChwcmV2X2luc24uaW5zbl9tby0+cGluZm8gCi0gICAgICAgICAgICAgICAgICAmIElOU05fTE9BRF9NRU1PUllfREVMQVkpKQotCSAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCSAgICAgICYmIG1pcHNfb3B0cy5pc2EgPCAyCi0JICAgICAgJiYgKHByZXZfaW5zbi5pbnNuX21vLT5waW5mbwotCQkgICYgSU5TTl9DT1BST0NfTUVNT1JZX0RFTEFZKSkpCi0JewotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgICsrbm9wczsKLQkgIGlmICgoISBtaXBzX29wdHMubWlwczE2Ci0JICAgICAgICYmIG1pcHNfb3B0cy5pc2EgPCA0Ci0JICAgICAgICYmICghIGNvcF9pbnRlcmxvY2tzCi0gICAgICAgICAgICAgICAgICAgJiYgcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpKQotCSAgICAgIHx8ICghIGhpbG9faW50ZXJsb2NrcwotCQkgICYmICgocHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0hJKQotCQkgICAgICB8fCAocHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0xPKSkpKQotCSAgICArK25vcHM7Ci0KLQkgIGlmIChwcmV2X2luc25fdW5yZW9yZGVyZWQpCi0JICAgIG5vcHMgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKCghIG1pcHNfb3B0cy5taXBzMTYKLQkJJiYgbWlwc19vcHRzLmlzYSA8IDQKLQkJJiYgKCEgY29wX2ludGVybG9ja3MKLSAgICAgICAgICAgICAgICAgICAgJiYgcHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkpCi0JICAgICAgIHx8ICghIGhpbG9faW50ZXJsb2NrcwotCQkgICAmJiAoKHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0hJKQotCQkgICAgICAgfHwgKHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0xPKSkpKQotCXsKLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBpZiAoISBwcmV2X3ByZXZfaW5zbl91bnJlb3JkZXJlZCkKLQkgICAgKytub3BzOwotCX0KLQotICAgICAgaWYgKG5vcHMgPiAwKQotCXsKLQkgIHN0cnVjdCBpbnNuX2xhYmVsX2xpc3QgKmw7Ci0KLQkgIGlmIChpbnNucykKLQkgICAgewotCSAgICAgIC8qIFJlY29yZCB0aGUgZnJhZyB3aGljaCBob2xkcyB0aGUgbm9wIGluc3RydWN0aW9ucywgc28KLSAgICAgICAgICAgICAgICAgdGhhdCB3ZSBjYW4gcmVtb3ZlIHRoZW0gaWYgd2UgZG9uJ3QgbmVlZCB0aGVtLiAgKi8KLQkgICAgICBmcmFnX2dyb3cgKG1pcHNfb3B0cy5taXBzMTYgPyBub3BzICogMiA6IG5vcHMgKiA0KTsKLQkgICAgICBwcmV2X25vcF9mcmFnID0gZnJhZ19ub3c7Ci0JICAgICAgcHJldl9ub3BfZnJhZ19ob2xkcyA9IG5vcHM7Ci0JICAgICAgcHJldl9ub3BfZnJhZ19yZXF1aXJlZCA9IDA7Ci0JICAgICAgcHJldl9ub3BfZnJhZ19zaW5jZSA9IDA7Ci0JICAgIH0KLQotCSAgZm9yICg7IG5vcHMgPiAwOyAtLW5vcHMpCi0JICAgIGVtaXRfbm9wICgpOwotCi0JICBpZiAoaW5zbnMpCi0JICAgIHsKLQkgICAgICAvKiBNb3ZlIG9uIHRvIGEgbmV3IGZyYWcsIHNvIHRoYXQgaXQgaXMgc2FmZSB0byBzaW1wbHkKLSAgICAgICAgICAgICAgICAgZGVjcmVhc2UgdGhlIHNpemUgb2YgcHJldl9ub3BfZnJhZy4gKi8KLQkgICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLQkgICAgICBmcmFnX25ldyAoMCk7Ci0JICAgIH0KLQotCSAgZm9yIChsID0gaW5zbl9sYWJlbHM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc3NlcnQgKFNfR0VUX1NFR01FTlQgKGwtPmxhYmVsKSA9PSBub3dfc2VnKTsKLQkgICAgICBsLT5sYWJlbC0+c3lfZnJhZyA9IGZyYWdfbm93OwotCSAgICAgIFNfU0VUX1ZBTFVFIChsLT5sYWJlbCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLQkgICAgICAvKiBtaXBzMTYgdGV4dCBsYWJlbHMgYXJlIHN0b3JlZCBhcyBvZGQuICAqLwotCSAgICAgIGlmIChtaXBzX29wdHMubWlwczE2KQotCQkrK2wtPmxhYmVsLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIE1hcmsgaW5zdHJ1Y3Rpb24gbGFiZWxzIGluIG1pcHMxNiBtb2RlLiAgKi8KLSAgaWYgKG1pcHNfb3B0cy5taXBzMTYgJiYgaW5zbnMpCi0gICAgbWlwczE2X21hcmtfbGFiZWxzICgpOwotCi0gIG1pcHNfbm9fcHJldl9pbnNuIChpbnNucyk7Ci19Ci0KLS8qIEJ1aWxkIGFuIGluc3RydWN0aW9uIGNyZWF0ZWQgYnkgYSBtYWNybyBleHBhbnNpb24uICBUaGlzIGlzIHBhc3NlZAotICAgYSBwb2ludGVyIHRvIHRoZSBjb3VudCBvZiBpbnN0cnVjdGlvbnMgY3JlYXRlZCBzbyBmYXIsIGFuCi0gICBleHByZXNzaW9uLCB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gdG8gYnVpbGQsIGFuIG9wZXJhbmQgZm9ybWF0Ci0gICBzdHJpbmcsIGFuZCBjb3JyZXNwb25kaW5nIGFyZ3VtZW50cy4gICovCi0KLSNpZmRlZiBVU0VfU1REQVJHCi1zdGF0aWMgdm9pZAotbWFjcm9fYnVpbGQgKGNoYXIgKnBsYWNlLAotCSAgICAgaW50ICpjb3VudGVyLAotCSAgICAgZXhwcmVzc2lvblMgKiBlcCwKLQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JICAgICBjb25zdCBjaGFyICpmbXQsCi0JICAgICAuLi4pCi0jZWxzZQotc3RhdGljIHZvaWQKLW1hY3JvX2J1aWxkIChwbGFjZSwgY291bnRlciwgZXAsIG5hbWUsIGZtdCwgdmFfYWxpc3QpCi0gICAgIGNoYXIgKnBsYWNlOwotICAgICBpbnQgKmNvdW50ZXI7Ci0gICAgIGV4cHJlc3Npb25TICplcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqZm10OwotICAgICB2YV9kY2wKLSNlbmRpZgotewotICBzdHJ1Y3QgbWlwc19jbF9pbnNuIGluc247Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOwotICB2YV9saXN0IGFyZ3M7Ci0gIGludCBpbnNuX2lzYTsKLQotI2lmZGVmIFVTRV9TVERBUkcKLSAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJncyk7Ci0jZW5kaWYKLQotICAvKgotICAgKiBJZiB0aGUgbWFjcm8gaXMgYWJvdXQgdG8gZXhwYW5kIGludG8gYSBzZWNvbmQgaW5zdHJ1Y3Rpb24sCi0gICAqIHByaW50IGEgd2FybmluZyBpZiBuZWVkZWQuIFdlIG5lZWQgdG8gcGFzcyBpcCBhcyBhIHBhcmFtZXRlcgotICAgKiB0byBnZW5lcmF0ZSBhIGJldHRlciB3YXJuaW5nIG1lc3NhZ2UgaGVyZS4uLgotICAgKi8KLSAgaWYgKG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyAmJiBwbGFjZSA9PSBOVUxMICYmICpjb3VudGVyID09IDEpCi0gICAgYXNfd2FybiAoXygiTWFjcm8gaW5zdHJ1Y3Rpb24gZXhwYW5kZWQgaW50byBtdWx0aXBsZSBpbnN0cnVjdGlvbnMiKSk7Ci0KLSAgaWYgKHBsYWNlID09IE5VTEwpCi0gICAgKmNvdW50ZXIgKz0gMTsJCS8qIGJ1bXAgaW5zdHJ1Y3Rpb24gY291bnRlciAqLwotCi0gIGlmIChtaXBzX29wdHMubWlwczE2KQotICAgIHsKLSAgICAgIG1pcHMxNl9tYWNyb19idWlsZCAocGxhY2UsIGNvdW50ZXIsIGVwLCBuYW1lLCBmbXQsIGFyZ3MpOwotICAgICAgdmFfZW5kIChhcmdzKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgciA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0gIGluc24uaW5zbl9tbyA9IChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBuYW1lKTsKLSAgYXNzZXJ0IChpbnNuLmluc25fbW8pOwotICBhc3NlcnQgKHN0cmNtcCAobmFtZSwgaW5zbi5pbnNuX21vLT5uYW1lKSA9PSAwKTsKLQotICAvKiBTZWFyY2ggdW50aWwgd2UgZ2V0IGEgbWF0Y2ggZm9yIE5BTUUuICAqLwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAoKGluc24uaW5zbl9tby0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTEpCi0JaW5zbl9pc2EgPSAxOwotICAgICAgZWxzZSBpZiAoKGluc24uaW5zbl9tby0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTIpCi0JaW5zbl9pc2EgPSAyOwotICAgICAgZWxzZSBpZiAoKGluc24uaW5zbl9tby0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTMpCi0JaW5zbl9pc2EgPSAzOwotICAgICAgZWxzZSBpZiAoKGluc24uaW5zbl9tby0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTQpCi0JaW5zbl9pc2EgPSA0OwotICAgICAgZWxzZQotCWluc25faXNhID0gMTU7Ci0KLSAgICAgIGlmIChzdHJjbXAgKGZtdCwgaW5zbi5pbnNuX21vLT5hcmdzKSA9PSAwCi0JICAmJiBpbnNuLmluc25fbW8tPnBpbmZvICE9IElOU05fTUFDUk8KLQkgICYmIChpbnNuX2lzYSA8PSBtaXBzX29wdHMuaXNhCi0JICAgICAgfHwgKG1pcHNfY3B1ID09IDQ2NTAKLQkJICAmJiAoaW5zbi5pbnNuX21vLT5tZW1iZXJzaGlwICYgSU5TTl80NjUwKSAhPSAwKQotCSAgICAgIHx8IChtaXBzX2NwdSA9PSA0MDEwCi0JCSAgJiYgKGluc24uaW5zbl9tby0+bWVtYmVyc2hpcCAmIElOU05fNDAxMCkgIT0gMCkKLQkgICAgICB8fCAoKG1pcHNfY3B1ID09IDQxMDAKLQkJICAgfHwgbWlwc19jcHUgPT0gNDExMQotCQkgICApCi0JCSAgJiYgKGluc24uaW5zbl9tby0+bWVtYmVyc2hpcCAmIElOU05fNDEwMCkgIT0gMCkKLQkgICAgICB8fCAobWlwc19jcHUgPT0gMzkwMAotCQkgICYmIChpbnNuLmluc25fbW8tPm1lbWJlcnNoaXAgJiBJTlNOXzM5MDApICE9IDApKQotCSAgJiYgKG1pcHNfY3B1ICE9IDQ2NTAgfHwgKGluc24uaW5zbl9tby0+cGluZm8gJiBGUF9EKSA9PSAwKSkKLQlicmVhazsKLQotICAgICAgKytpbnNuLmluc25fbW87Ci0gICAgICBhc3NlcnQgKGluc24uaW5zbl9tby0+bmFtZSk7Ci0gICAgICBhc3NlcnQgKHN0cmNtcCAobmFtZSwgaW5zbi5pbnNuX21vLT5uYW1lKSA9PSAwKTsKLSAgICB9Ci0KLSAgaW5zbi5pbnNuX29wY29kZSA9IGluc24uaW5zbl9tby0+bWF0Y2g7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgc3dpdGNoICgqZm10KyspCi0JewotCWNhc2UgJ1wwJzoKLQkgIGJyZWFrOwotCi0JY2FzZSAnLCc6Ci0JY2FzZSAnKCc6Ci0JY2FzZSAnKSc6Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ3QnOgotCWNhc2UgJ3cnOgotCWNhc2UgJ0UnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgMTY7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ2MnOgotCWNhc2UgJ1QnOgotCWNhc2UgJ1cnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgMTY7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ2QnOgotCWNhc2UgJ0cnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgMTE7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ1YnOgotCWNhc2UgJ1MnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgMTE7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ3onOgotCSAgY29udGludWU7Ci0KLQljYXNlICc8JzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDY7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ0QnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgNjsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnQic6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCA2OwotCSAgY29udGludWU7Ci0KLQljYXNlICdxJzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDY7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ2InOgotCWNhc2UgJ3MnOgotCWNhc2UgJ3InOgotCWNhc2UgJ3YnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgMjE7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ2knOgotCWNhc2UgJ2onOgotCWNhc2UgJ28nOgotCSAgciA9IChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpIHZhX2FyZyAoYXJncywgaW50KTsKLQkgIGFzc2VydCAociA9PSBCRkRfUkVMT0NfTUlQU19HUFJFTAotCQkgIHx8IHIgPT0gQkZEX1JFTE9DX01JUFNfTElURVJBTAotCQkgIHx8IHIgPT0gQkZEX1JFTE9DX0xPMTYKLQkJICB8fCByID09IEJGRF9SRUxPQ19NSVBTX0dPVDE2Ci0JCSAgfHwgciA9PSBCRkRfUkVMT0NfTUlQU19DQUxMMTYKLQkJICB8fCByID09IEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2Ci0JCSAgfHwgciA9PSBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYKLQkJICB8fCAoZXAtPlhfb3AgPT0gT19zdWJ0cmFjdAotCQkgICAgICAmJiBub3dfc2VnID09IHRleHRfc2VjdGlvbgotCQkgICAgICAmJiByID09IEJGRF9SRUxPQ19QQ1JFTF9MTzE2KSk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ3UnOgotCSAgciA9IChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpIHZhX2FyZyAoYXJncywgaW50KTsKLQkgIGFzc2VydCAoZXAgIT0gTlVMTAotCQkgICYmIChlcC0+WF9vcCA9PSBPX2NvbnN0YW50Ci0JCSAgICAgIHx8IChlcC0+WF9vcCA9PSBPX3N5bWJvbAotCQkJICAmJiAociA9PSBCRkRfUkVMT0NfSEkxNl9TCi0JCQkgICAgICB8fCByID09IEJGRF9SRUxPQ19ISTE2Ci0JCQkgICAgICB8fCByID09IEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2Ci0JCQkgICAgICB8fCByID09IEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNikpCi0JCSAgICAgIHx8IChlcC0+WF9vcCA9PSBPX3N1YnRyYWN0Ci0JCQkgICYmIG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uCi0JCQkgICYmIHIgPT0gQkZEX1JFTE9DX1BDUkVMX0hJMTZfUykpKTsKLQkgIGlmIChlcC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgaW5zbi5pbnNuX29wY29kZSB8PSAoZXAtPlhfYWRkX251bWJlciA+PiAxNikgJiAweGZmZmY7Ci0JICAgICAgZXAgPSBOVUxMOwotCSAgICAgIHIgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgICB9Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ3AnOgotCSAgYXNzZXJ0IChlcCAhPSBOVUxMKTsKLQkgIC8qCi0JICAgKiBUaGlzIGFsbG93cyBtYWNybygpIHRvIHBhc3MgYW4gaW1tZWRpYXRlIGV4cHJlc3Npb24gZm9yCi0JICAgKiBjcmVhdGluZyBzaG9ydCBicmFuY2hlcyB3aXRob3V0IGNyZWF0aW5nIGEgc3ltYm9sLgotCSAgICogTm90ZSB0aGF0IHRoZSBleHByZXNzaW9uIHN0aWxsIG1pZ2h0IGNvbWUgZnJvbSB0aGUgYXNzZW1ibHkKLQkgICAqIGlucHV0LCBpbiB3aGljaCBjYXNlIHRoZSB2YWx1ZSBpcyBub3QgY2hlY2tlZCBmb3IgcmFuZ2Ugbm9yCi0JICAgKiBpcyBhIHJlbG9jYXRpb24gZW50cnkgZ2VuZXJhdGVkICh5dWNrKS4KLQkgICAqLwotCSAgaWYgKGVwLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBpbnNuLmluc25fb3Bjb2RlIHw9IChlcC0+WF9hZGRfbnVtYmVyID4+IDIpICYgMHhmZmZmOwotCSAgICAgIGVwID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICByID0gQkZEX1JFTE9DXzE2X1BDUkVMX1MyOwotCSAgY29udGludWU7Ci0KLQljYXNlICdhJzoKLQkgIGFzc2VydCAoZXAgIT0gTlVMTCk7Ci0JICByID0gQkZEX1JFTE9DX01JUFNfSk1QOwotCSAgY29udGludWU7Ci0KLQljYXNlICdDJzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBsb25nKTsKLQkgIGNvbnRpbnVlOwotCi0JZGVmYXVsdDoKLQkgIGludGVybmFsRXJyb3IgKCk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotICB2YV9lbmQgKGFyZ3MpOwotICBhc3NlcnQgKHIgPT0gQkZEX1JFTE9DX1VOVVNFRCA/IGVwID09IE5VTEwgOiBlcCAhPSBOVUxMKTsKLQotICBhcHBlbmRfaW5zbiAocGxhY2UsICZpbnNuLCBlcCwgciwgZmFsc2UpOwotfQotCi1zdGF0aWMgdm9pZAotbWlwczE2X21hY3JvX2J1aWxkIChwbGFjZSwgY291bnRlciwgZXAsIG5hbWUsIGZtdCwgYXJncykKLSAgICAgY2hhciAqcGxhY2U7Ci0gICAgIGludCAqY291bnRlcjsKLSAgICAgZXhwcmVzc2lvblMgKmVwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpmbXQ7Ci0gICAgIHZhX2xpc3QgYXJnczsKLXsKLSAgc3RydWN0IG1pcHNfY2xfaW5zbiBpbnNuOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcjsKLQotICByID0gQkZEX1JFTE9DX1VOVVNFRDsKLSAgaW5zbi5pbnNuX21vID0gKHN0cnVjdCBtaXBzX29wY29kZSAqKSBoYXNoX2ZpbmQgKG1pcHMxNl9vcF9oYXNoLCBuYW1lKTsKLSAgYXNzZXJ0IChpbnNuLmluc25fbW8pOwotICBhc3NlcnQgKHN0cmNtcCAobmFtZSwgaW5zbi5pbnNuX21vLT5uYW1lKSA9PSAwKTsKLQotICB3aGlsZSAoc3RyY21wIChmbXQsIGluc24uaW5zbl9tby0+YXJncykgIT0gMAotCSB8fCBpbnNuLmluc25fbW8tPnBpbmZvID09IElOU05fTUFDUk8pCi0gICAgewotICAgICAgKytpbnNuLmluc25fbW87Ci0gICAgICBhc3NlcnQgKGluc24uaW5zbl9tby0+bmFtZSk7Ci0gICAgICBhc3NlcnQgKHN0cmNtcCAobmFtZSwgaW5zbi5pbnNuX21vLT5uYW1lKSA9PSAwKTsKLSAgICB9Ci0KLSAgaW5zbi5pbnNuX29wY29kZSA9IGluc24uaW5zbl9tby0+bWF0Y2g7Ci0gIGluc24udXNlX2V4dGVuZCA9IGZhbHNlOwotCi0gIGZvciAoOzspCi0gICAgewotICAgICAgaW50IGM7Ci0KLSAgICAgIGMgPSAqZm10Kys7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJ1wwJzoKLQkgIGJyZWFrOwotCi0JY2FzZSAnLCc6Ci0JY2FzZSAnKCc6Ci0JY2FzZSAnKSc6Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ3knOgotCWNhc2UgJ3cnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgTUlQUzE2T1BfU0hfUlk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ3gnOgotCWNhc2UgJ3YnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgTUlQUzE2T1BfU0hfUlg7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ3onOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgTUlQUzE2T1BfU0hfUlo7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ1onOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgTUlQUzE2T1BfU0hfTU9WRTMyWjsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnMCc6Ci0JY2FzZSAnUyc6Ci0JY2FzZSAnUCc6Ci0JY2FzZSAnUic6Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ1gnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgTUlQUzE2T1BfU0hfUkVHUjMyOwotCSAgY29udGludWU7Ci0KLQljYXNlICdZJzoKLQkgIHsKLQkgICAgaW50IHJlZ25vOwotCi0JICAgIHJlZ25vID0gdmFfYXJnIChhcmdzLCBpbnQpOwotCSAgICByZWdubyA9ICgocmVnbm8gJiA3KSA8PCAyKSB8ICgocmVnbm8gJiAweDE4KSA+PiAzKTsKLQkgICAgaW5zbi5pbnNuX29wY29kZSB8PSByZWdubyA8PCBNSVBTMTZPUF9TSF9SRUczMlI7Ci0JICB9Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJzwnOgotCWNhc2UgJz4nOgotCWNhc2UgJzQnOgotCWNhc2UgJzUnOgotCWNhc2UgJ0gnOgotCWNhc2UgJ1cnOgotCWNhc2UgJ0QnOgotCWNhc2UgJ2onOgotCWNhc2UgJzgnOgotCWNhc2UgJ1YnOgotCWNhc2UgJ0MnOgotCWNhc2UgJ1UnOgotCWNhc2UgJ2snOgotCWNhc2UgJ0snOgotCWNhc2UgJ3AnOgotCWNhc2UgJ3EnOgotCSAgewotCSAgICBhc3NlcnQgKGVwICE9IE5VTEwpOwotCi0JICAgIGlmIChlcC0+WF9vcCAhPSBPX2NvbnN0YW50KQotCSAgICAgIHIgPSBCRkRfUkVMT0NfVU5VU0VEICsgYzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbWlwczE2X2ltbWVkICgoY2hhciAqKSBOVUxMLCAwLCBjLCBlcC0+WF9hZGRfbnVtYmVyLCBmYWxzZSwKLQkJCSAgICAgIGZhbHNlLCBmYWxzZSwgJmluc24uaW5zbl9vcGNvZGUsCi0JCQkgICAgICAmaW5zbi51c2VfZXh0ZW5kLCAmaW5zbi5leHRlbmQpOwotCQllcCA9IE5VTEw7Ci0JCXIgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgICAgIH0KLQkgIH0KLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnNic6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCBNSVBTMTZPUF9TSF9JTU02OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgYXNzZXJ0IChyID09IEJGRF9SRUxPQ19VTlVTRUQgPyBlcCA9PSBOVUxMIDogZXAgIT0gTlVMTCk7Ci0KLSAgYXBwZW5kX2luc24gKHBsYWNlLCAmaW5zbiwgZXAsIHIsIGZhbHNlKTsKLX0KLQotLyoKLSAqIEdlbmVyYXRlIGEgImx1aSIgaW5zdHJ1Y3Rpb24uCi0gKi8KLXN0YXRpYyB2b2lkCi1tYWNyb19idWlsZF9sdWkgKHBsYWNlLCBjb3VudGVyLCBlcCwgcmVnbnVtKQotICAgICBjaGFyICpwbGFjZTsKLSAgICAgaW50ICpjb3VudGVyOwotICAgICBleHByZXNzaW9uUyAqZXA7Ci0gICAgIGludCByZWdudW07Ci17Ci0gIGV4cHJlc3Npb25TIGhpZ2hfZXhwcjsKLSAgc3RydWN0IG1pcHNfY2xfaW5zbiBpbnNuOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcjsKLSAgQ09OU1QgY2hhciAqbmFtZSA9ICJsdWkiOwotICBDT05TVCBjaGFyICpmbXQgPSAidCx1IjsKLQotICBhc3NlcnQgKCEgbWlwc19vcHRzLm1pcHMxNik7Ci0KLSAgaWYgKHBsYWNlID09IE5VTEwpCi0gICAgaGlnaF9leHByID0gKmVwOwotICBlbHNlCi0gICAgewotICAgICAgaGlnaF9leHByLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgaGlnaF9leHByLlhfYWRkX251bWJlciA9IGVwLT5YX2FkZF9udW1iZXI7Ci0gICAgfQotCi0gIGlmIChoaWdoX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIC8qIHdlIGNhbiBjb21wdXRlIHRoZSBpbnN0cnVjdGlvbiBub3cgd2l0aG91dCBhIHJlbG9jYXRpb24gZW50cnkgKi8KLSAgICAgIGlmIChoaWdoX2V4cHIuWF9hZGRfbnVtYmVyICYgMHg4MDAwKQotCWhpZ2hfZXhwci5YX2FkZF9udW1iZXIgKz0gMHgxMDAwMDsKLSAgICAgIGhpZ2hfZXhwci5YX2FkZF9udW1iZXIgPQotCSgodW5zaWduZWQgbG9uZykgaGlnaF9leHByLlhfYWRkX251bWJlciA+PiAxNikgJiAweGZmZmY7Ci0gICAgICByID0gQkZEX1JFTE9DX1VOVVNFRDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc3NlcnQgKGVwLT5YX29wID09IE9fc3ltYm9sKTsKLSAgICAgIC8qIF9ncF9kaXNwIGlzIGEgc3BlY2lhbCBjYXNlLCB1c2VkIGZyb20gc19jcGxvYWQuICAqLwotICAgICAgYXNzZXJ0IChtaXBzX3BpYyA9PSBOT19QSUMKLQkgICAgICB8fCBzdHJjbXAgKFNfR0VUX05BTUUgKGVwLT5YX2FkZF9zeW1ib2wpLCAiX2dwX2Rpc3AiKSA9PSAwKTsKLSAgICAgIHIgPSBCRkRfUkVMT0NfSEkxNl9TOwotICAgIH0KLQotICAvKgotICAgKiBJZiB0aGUgbWFjcm8gaXMgYWJvdXQgdG8gZXhwYW5kIGludG8gYSBzZWNvbmQgaW5zdHJ1Y3Rpb24sCi0gICAqIHByaW50IGEgd2FybmluZyBpZiBuZWVkZWQuIFdlIG5lZWQgdG8gcGFzcyBpcCBhcyBhIHBhcmFtZXRlcgotICAgKiB0byBnZW5lcmF0ZSBhIGJldHRlciB3YXJuaW5nIG1lc3NhZ2UgaGVyZS4uLgotICAgKi8KLSAgaWYgKG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyAmJiBwbGFjZSA9PSBOVUxMICYmICpjb3VudGVyID09IDEpCi0gICAgYXNfd2FybiAoXygiTWFjcm8gaW5zdHJ1Y3Rpb24gZXhwYW5kZWQgaW50byBtdWx0aXBsZSBpbnN0cnVjdGlvbnMiKSk7Ci0KLSAgaWYgKHBsYWNlID09IE5VTEwpCi0gICAgKmNvdW50ZXIgKz0gMTsJCS8qIGJ1bXAgaW5zdHJ1Y3Rpb24gY291bnRlciAqLwotCi0gIGluc24uaW5zbl9tbyA9IChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBuYW1lKTsKLSAgYXNzZXJ0IChpbnNuLmluc25fbW8pOwotICBhc3NlcnQgKHN0cmNtcCAobmFtZSwgaW5zbi5pbnNuX21vLT5uYW1lKSA9PSAwKTsKLSAgYXNzZXJ0IChzdHJjbXAgKGZtdCwgaW5zbi5pbnNuX21vLT5hcmdzKSA9PSAwKTsKLQotICBpbnNuLmluc25fb3Bjb2RlID0gaW5zbi5pbnNuX21vLT5tYXRjaCB8IChyZWdudW0gPDwgT1BfU0hfUlQpOwotICBpZiAociA9PSBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIGluc24uaW5zbl9vcGNvZGUgfD0gaGlnaF9leHByLlhfYWRkX251bWJlcjsKLSAgICAgIGFwcGVuZF9pbnNuIChwbGFjZSwgJmluc24sIE5VTEwsIHIsIGZhbHNlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhcHBlbmRfaW5zbiAocGxhY2UsICZpbnNuLCAmaGlnaF9leHByLCByLCBmYWxzZSk7Ci19Ci0KLS8qCQkJc2V0X2F0KCkKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIHNldCB0aGUgJGF0IHJlZ2lzdGVyIHRvIHRydWUgKG9uZSkKLSAqIGlmIHJlZyBpcyBsZXNzIHRoYW4gdGhlIGltbWVkaWF0ZSBleHByZXNzaW9uLgotICovCi1zdGF0aWMgdm9pZAotc2V0X2F0IChjb3VudGVyLCByZWcsIHVuc2lnbmVkcCkKLSAgICAgaW50ICpjb3VudGVyOwotICAgICBpbnQgcmVnOwotICAgICBpbnQgdW5zaWduZWRwOwotewotICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0gICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotICAgICAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmaW1tX2V4cHIsCi0JCSB1bnNpZ25lZHAgPyAic2x0aXUiIDogInNsdGkiLAotCQkgInQscixqIiwgQVQsIHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICBlbHNlCi0gICAgewotICAgICAgbG9hZF9yZWdpc3RlciAoY291bnRlciwgQVQsICZpbW1fZXhwciwgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgTlVMTCwKLQkJICAgdW5zaWduZWRwID8gInNsdHUiIDogInNsdCIsCi0JCSAgICJkLHYsdCIsIEFULCByZWcsIEFUKTsKLSAgICB9Ci19Ci0KLS8qIFdhcm4gaWYgYW4gZXhwcmVzc2lvbiBpcyBub3QgYSBjb25zdGFudC4gICovCi0KLXN0YXRpYyB2b2lkCi1jaGVja19hYnNvbHV0ZV9leHByIChpcCwgZXgpCi0gICAgIHN0cnVjdCBtaXBzX2NsX2luc24gKmlwOwotICAgICBleHByZXNzaW9uUyAqZXg7Ci17Ci0gIGlmIChleC0+WF9vcCA9PSBPX2JpZykKLSAgICBhc19iYWQgKF8oInVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICBlbHNlIGlmIChleC0+WF9vcCAhPSBPX2NvbnN0YW50KQotICAgIGFzX2JhZCAoXygiSW5zdHJ1Y3Rpb24gJXMgcmVxdWlyZXMgYWJzb2x1dGUgZXhwcmVzc2lvbiIpLCBpcC0+aW5zbl9tby0+bmFtZSk7Ci19Ci0KLS8qIENvdW50IHRoZSBsZWFkaW5nIHplcm9lcyBieSBwZXJmb3JtaW5nIGEgYmluYXJ5IGNob3AuIFRoaXMgaXMgYQotICAgYnVsa3kgYml0IG9mIHNvdXJjZSwgYnV0IHBlcmZvcm1hbmNlIGlzIGEgTE9UIGJldHRlciBmb3IgdGhlCi0gICBtYWpvcml0eSBvZiB2YWx1ZXMgdGhhbiBhIHNpbXBsZSBsb29wIHRvIGNvdW50IHRoZSBiaXRzOgotICAgICAgIGZvciAobGNudCA9IDA7IChsY250IDwgMzIpOyBsY250KyspCi0gICAgICAgICBpZiAoKHYpICYgKDEgPDwgKDMxIC0gbGNudCkpKQotICAgICAgICAgICBicmVhazsKLSAgSG93ZXZlciBpdCBpcyBub3QgY29kZSBzaXplIGZyaWVuZGx5LCBhbmQgdGhlIGdhaW4gd2lsbCBkcm9wIGEgYml0Ci0gIG9uIGNlcnRhaW4gY2FjaGVkIHN5c3RlbXMuCi0qLwotI2RlZmluZSBDT1VOVF9UT1BfWkVST0VTKHYpICAgICAgICAgICAgIFwKLSAgKCgodikgJiB+MHhmZmZmKSA9PSAwICAgICAgICAgICAgICAgICBcCi0gICA/ICgodikgJiB+MHhmZikgPT0gMCAgICAgICAgICAgICAgICAgXAotICAgICA/ICgodikgJiB+MHhmKSA9PSAwICAgICAgICAgICAgICAgIFwKLSAgICAgICA/ICgodikgJiB+MHgzKSA9PSAwICAgICAgICAgICAgICBcCi0gICAgICAgICA/ICgodikgJiB+MHgxKSA9PSAwICAgICAgICAgICAgXAotICAgICAgICAgICA/ICEodikgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICA/IDMyICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgOiAzMSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDMwICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIDogKCh2KSAmIH4weDcpID09IDAgICAgICAgICAgICBcCi0gICAgICAgICAgID8gMjkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDI4ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICA6ICgodikgJiB+MHgzZikgPT0gMCAgICAgICAgICAgICBcCi0gICAgICAgICA/ICgodikgJiB+MHgxZikgPT0gMCAgICAgICAgICAgXAotICAgICAgICAgICA/IDI3ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAyNiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICA6ICgodikgJiB+MHg3ZikgPT0gMCAgICAgICAgICAgXAotICAgICAgICAgICA/IDI1ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAyNCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIDogKCh2KSAmIH4weGZmZikgPT0gMCAgICAgICAgICAgICAgXAotICAgICAgID8gKCh2KSAmIH4weDNmZikgPT0gMCAgICAgICAgICAgIFwKLSAgICAgICAgID8gKCh2KSAmIH4weDFmZikgPT0gMCAgICAgICAgICBcCi0gICAgICAgICAgID8gMjMgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDIyICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIDogKCh2KSAmIH4weDdmZikgPT0gMCAgICAgICAgICBcCi0gICAgICAgICAgID8gMjEgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDIwICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICA6ICgodikgJiB+MHgzZmZmKSA9PSAwICAgICAgICAgICBcCi0gICAgICAgICA/ICgodikgJiB+MHgxZmZmKSA9PSAwICAgICAgICAgXAotICAgICAgICAgICA/IDE5ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAxOCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICA6ICgodikgJiB+MHg3ZmZmKSA9PSAwICAgICAgICAgXAotICAgICAgICAgICA/IDE3ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAxNiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICA6ICgodikgJiB+MHhmZmZmZmYpID09IDAgICAgICAgICAgICAgXAotICAgICA/ICgodikgJiB+MHhmZmZmZikgPT0gMCAgICAgICAgICAgIFwKLSAgICAgICA/ICgodikgJiB+MHgzZmZmZikgPT0gMCAgICAgICAgICBcCi0gICAgICAgICA/ICgodikgJiB+MHgxZmZmZikgPT0gMCAgICAgICAgXAotICAgICAgICAgICA/IDE1ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAxNCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICA6ICgodikgJiB+MHg3ZmZmZikgPT0gMCAgICAgICAgXAotICAgICAgICAgICA/IDEzICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAxMiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgOiAoKHYpICYgfjB4M2ZmZmZmKSA9PSAwICAgICAgICAgXAotICAgICAgICAgPyAoKHYpICYgfjB4MWZmZmZmKSA9PSAwICAgICAgIFwKLSAgICAgICAgICAgPyAxMSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMTAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgOiAoKHYpICYgfjB4N2ZmZmZmKSA9PSAwICAgICAgIFwKLSAgICAgICAgICAgPyA5ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogOCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICA6ICgodikgJiB+MHhmZmZmZmZmKSA9PSAwICAgICAgICAgIFwKLSAgICAgICA/ICgodikgJiB+MHgzZmZmZmZmKSA9PSAwICAgICAgICBcCi0gICAgICAgICA/ICgodikgJiB+MHgxZmZmZmZmKSA9PSAwICAgICAgXAotICAgICAgICAgICA/IDcgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiA2ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICA6ICgodikgJiB+MHg3ZmZmZmZmKSA9PSAwICAgICAgXAotICAgICAgICAgICA/IDUgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiA0ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgOiAoKHYpICYgfjB4M2ZmZmZmZmYpID09IDAgICAgICAgXAotICAgICAgICAgPyAoKHYpICYgfjB4MWZmZmZmZmYpID09IDAgICAgIFwKLSAgICAgICAgICAgPyAzICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgOiAoKHYpICYgfjB4N2ZmZmZmZmYpID09IDAgICAgIFwKLSAgICAgICAgICAgPyAxICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMCkKLQotLyoJCQlsb2FkX3JlZ2lzdGVyKCkKLSAqICBUaGlzIHJvdXRpbmUgZ2VuZXJhdGVzIHRoZSBsZWFzdCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIG5lY2Nlc3NhcnkgdG8gbG9hZAotICogIGFuIGFic29sdXRlIGV4cHJlc3Npb24gdmFsdWUgaW50byBhIHJlZ2lzdGVyLgotICovCi1zdGF0aWMgdm9pZAotbG9hZF9yZWdpc3RlciAoY291bnRlciwgcmVnLCBlcCwgZGJsKQotICAgICBpbnQgKmNvdW50ZXI7Ci0gICAgIGludCByZWc7Ci0gICAgIGV4cHJlc3Npb25TICplcDsKLSAgICAgaW50IGRibDsKLXsKLSAgaW50IGZyZWc7Ci0gIGV4cHJlc3Npb25TIGhpMzIsIGxvMzI7Ci0KLSAgaWYgKGVwLT5YX29wICE9IE9fYmlnKQotICAgIHsKLSAgICAgIGFzc2VydCAoZXAtPlhfb3AgPT0gT19jb25zdGFudCk7Ci0gICAgICBpZiAoZXAtPlhfYWRkX251bWJlciA8IDB4ODAwMAotCSAgJiYgKGVwLT5YX2FkZF9udW1iZXIgPj0gMAotCSAgICAgIHx8IChlcC0+WF9hZGRfbnVtYmVyID49IC0weDgwMDAKLQkJICAmJiAoISBkYmwKLQkJICAgICAgfHwgISBlcC0+WF91bnNpZ25lZAotCQkgICAgICB8fCBzaXplb2YgKGVwLT5YX2FkZF9udW1iZXIpID4gNCkpKSkKLQl7Ci0JICAvKiBXZSBjYW4gaGFuZGxlIDE2IGJpdCBzaWduZWQgdmFsdWVzIHdpdGggYW4gYWRkaXUgdG8KLQkgICAgICR6ZXJvLiAgTm8gbmVlZCB0byBldmVyIHVzZSBkYWRkaXUgaGVyZSwgc2luY2UgJHplcm8gYW5kCi0JICAgICB0aGUgcmVzdWx0IGFyZSBhbHdheXMgY29ycmVjdCBpbiAzMiBiaXQgbW9kZS4gICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsICJhZGRpdSIsICJ0LHIsaiIsIHJlZywgMCwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmIChlcC0+WF9hZGRfbnVtYmVyID49IDAgJiYgZXAtPlhfYWRkX251bWJlciA8IDB4MTAwMDApCi0JewotCSAgLyogV2UgY2FuIGhhbmRsZSAxNiBiaXQgdW5zaWduZWQgdmFsdWVzIHdpdGggYW4gb3JpIHRvCi0gICAgICAgICAgICAgJHplcm8uICAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLCAib3JpIiwgInQscixpIiwgcmVnLCAwLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKCgoKGVwLT5YX2FkZF9udW1iZXIgJn4gKG9mZnNldFQpIDB4N2ZmZmZmZmYpID09IDAKLQkJIHx8ICgoZXAtPlhfYWRkX251bWJlciAmfiAob2Zmc2V0VCkgMHg3ZmZmZmZmZikKLQkJICAgICA9PSB+IChvZmZzZXRUKSAweDdmZmZmZmZmKSkKLQkJJiYgKCEgZGJsCi0JCSAgICB8fCAhIGVwLT5YX3Vuc2lnbmVkCi0JCSAgICB8fCBzaXplb2YgKGVwLT5YX2FkZF9udW1iZXIpID4gNAotCQkgICAgfHwgKGVwLT5YX2FkZF9udW1iZXIgJiAweDgwMDAwMDAwKSA9PSAwKSkKLQkgICAgICAgfHwgKChtaXBzX29wdHMuaXNhIDwgMyB8fCAhIGRibCkKLQkJICAgJiYgKGVwLT5YX2FkZF9udW1iZXIgJn4gKG9mZnNldFQpIDB4ZmZmZmZmZmYpID09IDApCi0JICAgICAgIHx8IChtaXBzX29wdHMuaXNhIDwgMwotCQkgICAmJiAhIGRibAotCQkgICAmJiAoKGVwLT5YX2FkZF9udW1iZXIgJn4gKG9mZnNldFQpIDB4ZmZmZmZmZmYpCi0JCSAgICAgICA9PSB+IChvZmZzZXRUKSAweGZmZmZmZmZmKSkpCi0JewotCSAgLyogMzIgYml0IHZhbHVlcyByZXF1aXJlIGFuIGx1aS4gICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsICJsdWkiLCAidCx1IiwgcmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0hJMTYpOwotCSAgaWYgKChlcC0+WF9hZGRfbnVtYmVyICYgMHhmZmZmKSAhPSAwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsICJvcmkiLCAidCxyLGkiLCByZWcsIHJlZywKLQkJCSAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBUaGUgdmFsdWUgaXMgbGFyZ2VyIHRoYW4gMzIgYml0cy4gICovCi0KLSAgaWYgKG1pcHNfb3B0cy5pc2EgPCAzKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiTnVtYmVyIGxhcmdlciB0aGFuIDMyIGJpdHMiKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsICJhZGRpdSIsICJ0LHIsaiIsIHJlZywgMCwKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZXAtPlhfb3AgIT0gT19iaWcpCi0gICAgewotICAgICAgaGkzMiA9ICplcDsKLSAgICAgIGhpMzIuWF9hZGRfbnVtYmVyID0gKHZhbHVlVCkgaGkzMi5YX2FkZF9udW1iZXIgPj4gMTY7Ci0gICAgICBoaTMyLlhfYWRkX251bWJlciA9ICh2YWx1ZVQpIGhpMzIuWF9hZGRfbnVtYmVyID4+IDE2OwotICAgICAgaGkzMi5YX2FkZF9udW1iZXIgJj0gMHhmZmZmZmZmZjsKLSAgICAgIGxvMzIgPSAqZXA7Ci0gICAgICBsbzMyLlhfYWRkX251bWJlciAmPSAweGZmZmZmZmZmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzc2VydCAoZXAtPlhfYWRkX251bWJlciA+IDIpOwotICAgICAgaWYgKGVwLT5YX2FkZF9udW1iZXIgPT0gMykKLQlnZW5lcmljX2JpZ251bVszXSA9IDA7Ci0gICAgICBlbHNlIGlmIChlcC0+WF9hZGRfbnVtYmVyID4gNCkKLQlhc19iYWQgKF8oIk51bWJlciBsYXJnZXIgdGhhbiA2NCBiaXRzIikpOwotICAgICAgbG8zMi5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGxvMzIuWF9hZGRfbnVtYmVyID0gZ2VuZXJpY19iaWdudW1bMF0gKyAoZ2VuZXJpY19iaWdudW1bMV0gPDwgMTYpOwotICAgICAgaGkzMi5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGhpMzIuWF9hZGRfbnVtYmVyID0gZ2VuZXJpY19iaWdudW1bMl0gKyAoZ2VuZXJpY19iaWdudW1bM10gPDwgMTYpOwotICAgIH0KLQotICBpZiAoaGkzMi5YX2FkZF9udW1iZXIgPT0gMCkKLSAgICBmcmVnID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBzaGlmdCwgYml0OwotICAgICAgdW5zaWduZWQgbG9uZyBoaSwgbG87Ci0KLSAgICAgIGlmIChoaTMyLlhfYWRkX251bWJlciA9PSAweGZmZmZmZmZmKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKChsbzMyLlhfYWRkX251bWJlciAmIDB4ZmZmZjgwMDApID09IDB4ZmZmZjgwMDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmbG8zMiwgImFkZGl1IiwgInQscixqIiwKLQkJCSAgIHJlZywgMCwgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGxvMzIuWF9hZGRfbnVtYmVyICYgMHg4MDAwMDAwMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZsbzMyLCAibHVpIiwgInQsdSIsIHJlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIEJGRF9SRUxPQ19ISTE2KTsKLQkgICAgICBpZiAobG8zMi5YX2FkZF9udW1iZXIgJiAweGZmZmYpCi0JCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmbG8zMiwgIm9yaSIsICJ0LHIsaSIsCi0JCQkgICAgIHJlZywgcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAvKiBDaGVjayBmb3IgMTZiaXQgc2hpZnRlZCBjb25zdGFudC4gIFdlIGtub3cgdGhhdCBoaTMyIGlzCi0gICAgICAgICBub24temVybywgc28gc3RhcnQgdGhlIG1hc2sgb24gdGhlIGZpcnN0IGJpdCBvZiB0aGUgaGkzMgotICAgICAgICAgdmFsdWUuICAqLwotICAgICAgc2hpZnQgPSAxNzsKLSAgICAgIGRvCi0gICAgICAgewotCSB1bnNpZ25lZCBsb25nIGhpbWFzaywgbG9tYXNrOwotCi0JIGlmIChzaGlmdCA8IDMyKQotCSAgIHsKLQkgICAgIGhpbWFzayA9IDB4ZmZmZiA+PiAoMzIgLSBzaGlmdCk7Ci0JICAgICBsb21hc2sgPSAoMHhmZmZmIDw8IHNoaWZ0KSAmIDB4ZmZmZmZmZmY7Ci0JICAgfQotCSBlbHNlCi0JICAgewotCSAgICAgaGltYXNrID0gMHhmZmZmIDw8IChzaGlmdCAtIDMyKTsKLQkgICAgIGxvbWFzayA9IDA7Ci0JICAgfQotCSBpZiAoKGhpMzIuWF9hZGRfbnVtYmVyICYgfiAob2Zmc2V0VCkgaGltYXNrKSA9PSAwCi0JICAgICAmJiAobG8zMi5YX2FkZF9udW1iZXIgJiB+IChvZmZzZXRUKSBsb21hc2spID09IDApCi0JICAgewotCSAgICAgZXhwcmVzc2lvblMgdG1wOwotCi0JICAgICB0bXAuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICAgICBpZiAoc2hpZnQgPCAzMikKLQkgICAgICAgdG1wLlhfYWRkX251bWJlciA9ICgoaGkzMi5YX2FkZF9udW1iZXIgPDwgKDMyIC0gc2hpZnQpKQotCQkJCSAgIHwgKGxvMzIuWF9hZGRfbnVtYmVyID4+IHNoaWZ0KSk7Ci0JICAgICBlbHNlCi0JICAgICAgIHRtcC5YX2FkZF9udW1iZXIgPSBoaTMyLlhfYWRkX251bWJlciA+PiAoc2hpZnQgLSAzMik7Ci0JICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJnRtcCwgIm9yaSIsICJ0LHIsaSIsIHJlZywgMCwKLQkJCSAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsCi0JCQkgIChzaGlmdCA+PSAzMikgPyAiZHNsbDMyIiA6ICJkc2xsIiwKLQkJCSAgImQsdyw8IiwgcmVnLCByZWcsCi0JCQkgIChzaGlmdCA+PSAzMikgPyBzaGlmdCAtIDMyIDogc2hpZnQpOwotCSAgICAgcmV0dXJuOwotCSAgIH0KLSAgICAgICAgIHNoaWZ0Kys7Ci0gICAgICAgfSB3aGlsZSAoc2hpZnQgPD0gKDY0IC0gMTYpKTsKLQotICAgICAgLyogRmluZCB0aGUgYml0IG51bWJlciBvZiB0aGUgbG93ZXN0IG9uZSBiaXQsIGFuZCBzdG9yZSB0aGUKLSAgICAgICAgIHNoaWZ0ZWQgdmFsdWUgaW4gaGkvbG8uICAqLwotICAgICAgaGkgPSAodW5zaWduZWQgbG9uZykgKGhpMzIuWF9hZGRfbnVtYmVyICYgMHhmZmZmZmZmZik7Ci0gICAgICBsbyA9ICh1bnNpZ25lZCBsb25nKSAobG8zMi5YX2FkZF9udW1iZXIgJiAweGZmZmZmZmZmKTsKLSAgICAgIGlmIChsbyAhPSAwKQotCXsKLQkgIGJpdCA9IDA7Ci0JICB3aGlsZSAoKGxvICYgMSkgPT0gMCkKLQkgICAgewotCSAgICAgIGxvID4+PSAxOwotCSAgICAgICsrYml0OwotCSAgICB9Ci0JICBsbyB8PSAoaGkgJiAoKCh1bnNpZ25lZCBsb25nKSAxIDw8IGJpdCkgLSAxKSkgPDwgKDMyIC0gYml0KTsKLQkgIGhpID4+PSBiaXQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJpdCA9IDMyOwotCSAgd2hpbGUgKChoaSAmIDEpID09IDApCi0JICAgIHsKLQkgICAgICBoaSA+Pj0gMTsKLQkgICAgICArK2JpdDsKLQkgICAgfQotCSAgbG8gPSBoaTsKLQkgIGhpID0gMDsKLQl9Ci0KLSAgICAgIC8qIE9wdGltaXplIGlmIHRoZSBzaGlmdGVkIHZhbHVlIGlzIGEgKHBvd2VyIG9mIDIpIC0gMS4gICovCi0gICAgICBpZiAoKGhpID09IDAgJiYgKChsbyArIDEpICYgbG8pID09IDApCi0JICB8fCAobG8gPT0gMHhmZmZmZmZmZiAmJiAoKGhpICsgMSkgJiBoaSkgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICBzaGlmdCA9IENPVU5UX1RPUF9aRVJPRVMgKCh1bnNpZ25lZCBpbnQpIGhpMzIuWF9hZGRfbnVtYmVyKTsKLQkgIGlmIChzaGlmdCAhPSAwKQotICAgICAgICAgICAgewotCSAgICAgIGV4cHJlc3Npb25TIHRtcDsKLQotCSAgICAgIC8qIFRoaXMgaW5zdHJ1Y3Rpb24gd2lsbCBzZXQgdGhlIHJlZ2lzdGVyIHRvIGJlIGFsbAotICAgICAgICAgICAgICAgICBvbmVzLiAgKi8KLSAgICAgICAgICAgICAgdG1wLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgICAgICAgICB0bXAuWF9hZGRfbnVtYmVyID0gKG9mZnNldFQpIC0xOwotICAgICAgICAgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJnRtcCwgImFkZGl1IiwgInQscixqIiwKLQkJCSAgIHJlZywgMCwgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgICAgICAgICBpZiAoYml0ICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYml0ICs9IHNoaWZ0OwotICAgICAgICAgICAgICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCA+PSAzMikgPyAiZHNsbDMyIiA6ICJkc2xsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZCx3LDwiLCByZWcsIHJlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYml0ID49IDMyKSA/IGJpdCAtIDMyIDogYml0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBOVUxMLAotCQkJICAgKHNoaWZ0ID49IDMyKSA/ICJkc3JsMzIiIDogImRzcmwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImQsdyw8IiwgcmVnLCByZWcsCi0JCQkgICAoc2hpZnQgPj0gMzIpID8gc2hpZnQgLSAzMiA6IHNoaWZ0KTsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIC8qIFNpZ24gZXh0ZW5kIGhpMzIgYmVmb3JlIGNhbGxpbmcgbG9hZF9yZWdpc3RlciwgYmVjYXVzZSB3ZSBjYW4KLSAgICAgICAgIGdlbmVyYWxseSBnZXQgYmV0dGVyIGNvZGUgd2hlbiB3ZSBsb2FkIGEgc2lnbiBleHRlbmRlZCB2YWx1ZS4gICovCi0gICAgICBpZiAoKGhpMzIuWF9hZGRfbnVtYmVyICYgMHg4MDAwMDAwMCkgIT0gMCkKLQloaTMyLlhfYWRkX251bWJlciB8PSB+IChvZmZzZXRUKSAweGZmZmZmZmZmOwotICAgICAgbG9hZF9yZWdpc3RlciAoY291bnRlciwgcmVnLCAmaGkzMiwgMCk7Ci0gICAgICBmcmVnID0gcmVnOwotICAgIH0KLSAgaWYgKChsbzMyLlhfYWRkX251bWJlciAmIDB4ZmZmZjAwMDApID09IDApCi0gICAgewotICAgICAgaWYgKGZyZWcgIT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgTlVMTCwgImRzbGwzMiIsICJkLHcsPCIsIHJlZywKLQkJICAgICAgIGZyZWcsIDApOwotCSAgZnJlZyA9IHJlZzsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZXhwcmVzc2lvblMgbWlkMTY7Ci0KLSAgICAgIGlmICgoZnJlZyA9PSAwKSAmJiAobG8zMi5YX2FkZF9udW1iZXIgPT0gMHhmZmZmZmZmZikpCi0gICAgICAgIHsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmbG8zMiwgImx1aSIsICJ0LHUiLCByZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfSEkxNik7Ci0gICAgICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsICJkc3JsMzIiLCAiZCx3LDwiLCByZWcsCi0gICAgICAgICAgICAgICAgICAgICAgIHJlZywgMCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgIGlmIChmcmVnICE9IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsICJkc2xsIiwgImQsdyw8IiwgcmVnLAotCQkgICAgICAgZnJlZywgMTYpOwotCSAgZnJlZyA9IHJlZzsKLQl9Ci0gICAgICBtaWQxNiA9IGxvMzI7Ci0gICAgICBtaWQxNi5YX2FkZF9udW1iZXIgPj49IDE2OwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZtaWQxNiwgIm9yaSIsICJ0LHIsaSIsIHJlZywKLQkJICAgZnJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsICJkc2xsIiwgImQsdyw8IiwgcmVnLAotCQkgICByZWcsIDE2KTsKLSAgICAgIGZyZWcgPSByZWc7Ci0gICAgfQotICBpZiAoKGxvMzIuWF9hZGRfbnVtYmVyICYgMHhmZmZmKSAhPSAwKQotICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmbG8zMiwgIm9yaSIsICJ0LHIsaSIsIHJlZywgZnJlZywKLQkJIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLX0KLQotLyogTG9hZCBhbiBhZGRyZXNzIGludG8gYSByZWdpc3Rlci4gICovCi0KLXN0YXRpYyB2b2lkCi1sb2FkX2FkZHJlc3MgKGNvdW50ZXIsIHJlZywgZXApCi0gICAgIGludCAqY291bnRlcjsKLSAgICAgaW50IHJlZzsKLSAgICAgZXhwcmVzc2lvblMgKmVwOwotewotICBjaGFyICpwOwotCi0gIGlmIChlcC0+WF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICAmJiBlcC0+WF9vcCAhPSBPX3N5bWJvbCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0gICAgICBlcC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotCi0gIGlmIChlcC0+WF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGxvYWRfcmVnaXN0ZXIgKGNvdW50ZXIsIHJlZywgZXAsIDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAobWlwc19waWMgPT0gTk9fUElDKQotICAgIHsKLSAgICAgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBHUCByZWxhdGl2ZSBzeW1ib2wsIHdlIHdhbnQKLQkgICBhZGRpdQkkcmVnLCRncCw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSBPdGhlcndpc2Ugd2Ugd2FudAotCSAgIGx1aQkJJHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19ISTE2X1MpCi0JICAgYWRkaXUJJHJlZywkcmVnLDxzeW0+CQkoQkZEX1JFTE9DX0xPMTYpCi0JIElmIHdlIGhhdmUgYW4gYWRkZW5kLCB3ZSBhbHdheXMgdXNlIHRoZSBsYXR0ZXIgZm9ybS4gICovCi0gICAgICBpZiAoKHZhbHVlVCkgZXAtPlhfYWRkX251bWJlciA+PSBNQVhfR1BSRUxfT0ZGU0VUCi0gICAgICAgICAgfHwgbm9waWNfbmVlZF9yZWxheCAoZXAtPlhfYWRkX3N5bWJvbCwgMSkpCi0JcCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgZnJhZ19ncm93ICgyMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCByZWcsIEdQLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCk7Ci0JICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4LCAwLAotCQkJUkVMQVhfRU5DT0RFICg0LCA4LCAwLCA0LCAwLAotCQkJCSAgICAgIG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyksCi0JCQllcC0+WF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwgKGNoYXIgKikgTlVMTCk7Ci0JfQotICAgICAgbWFjcm9fYnVpbGRfbHVpIChwLCBjb3VudGVyLCBlcCwgcmVnKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JcCArPSA0OwotICAgICAgbWFjcm9fYnVpbGQgKHAsIGNvdW50ZXIsIGVwLAotCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgInQscixqIiwgcmVnLCByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICB9Ci0gIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDICYmICEgbWlwc19iaWdfZ290KQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25TIGV4OwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgIGx3CQkkcmVnLDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgT3RoZXJ3aXNlIHdlIHdhbnQKLQkgICBsdwkJJHJlZyw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgbm9wCi0JICAgYWRkaXUJJHJlZywkcmVnLDxzeW0+CQkoQkZEX1JFTE9DX0xPMTYpCi0JIElmIHRoZXJlIGlzIGEgY29uc3RhbnQsIGl0IG11c3QgYmUgYWRkZWQgaW4gYWZ0ZXIuICAqLwotICAgICAgZXguWF9hZGRfbnVtYmVyID0gZXAtPlhfYWRkX251bWJlcjsKLSAgICAgIGVwLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgZnJhZ19ncm93ICgyMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgIDwgMykKLQkJICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAidCxvKGIpIiwgcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNCwgMCwKLQkJICAgIFJFTEFYX0VOQ09ERSAoMCwgNCwgLTgsIDAsIDAsIG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyksCi0JCSAgICBlcC0+WF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwgKGNoYXIgKikgTlVMTCk7Ci0gICAgICBtYWNyb19idWlsZCAocCwgY291bnRlciwgZXAsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgIDwgMykKLQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgInQscixqIiwgcmVnLCByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGlmIChleC5YX2FkZF9udW1iZXIgIT0gMCkKLQl7Ci0JICBpZiAoZXguWF9hZGRfbnVtYmVyIDwgLTB4ODAwMCB8fCBleC5YX2FkZF9udW1iZXIgPj0gMHg4MDAwKQotCSAgICBhc19iYWQgKF8oIlBJQyBjb2RlIG9mZnNldCBvdmVyZmxvdyAobWF4IDE2IHNpZ25lZCBiaXRzKSIpKTsKLQkgIGV4Llhfb3AgPSBPX2NvbnN0YW50OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZleCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgIDwgMykKLQkJCT8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHJlZywgcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0gICAgewotICAgICAgZXhwcmVzc2lvblMgZXg7Ci0gICAgICBpbnQgb2ZmOwotCi0gICAgICAvKiBUaGlzIGlzIHRoZSBsYXJnZSBHT1QgY2FzZS4gIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4KLQkgZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgbHVpCQkkcmVnLDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpCi0JICAgYWRkdQkJJHJlZywkcmVnLCRncAotCSAgIGx3CQkkcmVnLDxzeW0+KCRyZWcpCShCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKLQkgT3RoZXJ3aXNlLCBmb3IgYSByZWZlcmVuY2UgdG8gYSBsb2NhbCBzeW1ib2wsIHdlIHdhbnQKLQkgICBsdwkJJHJlZyw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgbm9wCi0JICAgYWRkaXUJJHJlZywkcmVnLDxzeW0+CQkoQkZEX1JFTE9DX0xPMTYpCi0JIElmIHRoZXJlIGlzIGEgY29uc3RhbnQsIGl0IG11c3QgYmUgYWRkZWQgaW4gYWZ0ZXIuICAqLwotICAgICAgZXguWF9hZGRfbnVtYmVyID0gZXAtPlhfYWRkX251bWJlcjsKLSAgICAgIGVwLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgaWYgKHJlZ19uZWVkc19kZWxheSAoR1ApKQotCW9mZiA9IDQ7Ci0gICAgICBlbHNlCi0Jb2ZmID0gMDsKLSAgICAgIGZyYWdfZ3JvdyAoMzIpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLCAibHVpIiwgInQsdSIsIHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICB8fCBtaXBzX29wdHMuaXNhICA8IDMpCi0JCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAiZCx2LHQiLCByZWcsIHJlZywgR1ApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLAotCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICB8fCBtaXBzX29wdHMuaXNhICA8IDMpCi0JCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgInQsbyhiKSIsIHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsIHJlZyk7Ci0gICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMiArIG9mZiwgMCwKLQkJICAgIFJFTEFYX0VOQ09ERSAoMTIsIDEyICsgb2ZmLCBvZmYsIDggKyBvZmYsIDAsCi0JCQkJICBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MpLAotCQkgICAgZXAtPlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsIChjaGFyICopIE5VTEwpOwotICAgICAgaWYgKG9mZiA+IDApCi0JewotCSAgLyogV2UgbmVlZCBhIG5vcCBiZWZvcmUgbG9hZGluZyBmcm9tICRncC4gIFRoaXMgc3BlY2lhbAotICAgICAgICAgICAgIGNoZWNrIGlzIHJlcXVpcmVkIGJlY2F1c2UgdGhlIGx1aSB3aGljaCBzdGFydHMgdGhlIG1haW4KLSAgICAgICAgICAgICBpbnN0cnVjdGlvbiBzdHJlYW0gZG9lcyBub3QgcmVmZXIgdG8gJGdwLCBhbmQgc28gd2lsbCBub3QKLSAgICAgICAgICAgICBpbnNlcnQgdGhlIG5vcCB3aGljaCBtYXkgYmUgcmVxdWlyZWQuICAqLwotCSAgbWFjcm9fYnVpbGQgKHAsIGNvdW50ZXIsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgcCArPSA0OwotCX0KLSAgICAgIG1hY3JvX2J1aWxkIChwLCBjb3VudGVyLCBlcCwKLQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgfHwgbWlwc19vcHRzLmlzYSAgPCAzKQotCQkgICAgPyAibHciIDogImxkIiksCi0JCSAgICJ0LG8oYikiLCByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0gICAgICBwICs9IDQ7Ci0gICAgICBtYWNyb19idWlsZCAocCwgY291bnRlciwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0gICAgICBwICs9IDQ7Ci0gICAgICBtYWNyb19idWlsZCAocCwgY291bnRlciwgZXAsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgIDwgMykKLQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgInQscixqIiwgcmVnLCByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGlmIChleC5YX2FkZF9udW1iZXIgIT0gMCkKLQl7Ci0JICBpZiAoZXguWF9hZGRfbnVtYmVyIDwgLTB4ODAwMCB8fCBleC5YX2FkZF9udW1iZXIgPj0gMHg4MDAwKQotCSAgICBhc19iYWQgKF8oIlBJQyBjb2RlIG9mZnNldCBvdmVyZmxvdyAobWF4IDE2IHNpZ25lZCBiaXRzKSIpKTsKLQkgIGV4Llhfb3AgPSBPX2NvbnN0YW50OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZleCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgICAgICB8fCBtaXBzX29wdHMuaXNhICA8IDMpCi0JCQk/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCByZWcsIHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLSAgICB7Ci0gICAgICAvKiBXZSBhbHdheXMgZG8KLQkgICBhZGRpdQkkcmVnLCRncCw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAqLwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLAotCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICB8fCBtaXBzX29wdHMuaXNhICA8IDMpCi0JCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICJ0LHIsaiIsIHJlZywgR1AsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLX0KLQotLyoKLSAqCQkJQnVpbGQgbWFjcm9zCi0gKiAgIFRoaXMgcm91dGluZSBpbXBsZW1lbnRzIHRoZSBzZWVtaW5nbHkgZW5kbGVzcyBtYWNybyBvciBzeW50aGVzaXplZAotICogaW5zdHJ1Y3Rpb25zIGFuZCBhZGRyZXNzaW5nIG1vZGVzIGluIHRoZSBtaXBzIGFzc2VtYmx5IGxhbmd1YWdlLiBNYW55Ci0gKiBvZiB0aGVzZSBtYWNyb3MgYXJlIHNpbXBsZSBhbmQgYXJlIHNpbWlsYXIgdG8gZWFjaCBvdGhlci4gVGhlc2UgY291bGQKLSAqIHByb2JhYmx5IGJlIGhhbmRsZWQgYnkgc29tZSBraW5kIG9mIHRhYmxlIG9yIGdyYW1tZXIgYXByb2FjaCBpbnN0ZWFkIG9mCi0gKiB0aGlzIHZlcmJvc2UgbWV0aG9kLiBPdGhlcnMgYXJlIG5vdCBzaW1wbGUgbWFjcm9zIGJ1dCBhcmUgbW9yZSBsaWtlCi0gKiBvcHRpbWl6aW5nIGNvZGUgZ2VuZXJhdGlvbi4KLSAqICAgT25lIGludGVyZXN0aW5nIG9wdGltaXphdGlvbiBpcyB3aGVuIHNldmVyYWwgc3RvcmUgbWFjcm9zIGFwcGVhcgotICogY29uc2VjdXRpdmx5IHRoYXQgd291bGQgbG9hZCBBVCB3aXRoIHRoZSB1cHBlciBoYWxmIG9mIHRoZSBzYW1lIGFkZHJlc3MuCi0gKiBUaGUgZW5zdWluZyBsb2FkIHVwcGVyIGluc3RydWN0aW9ucyBhcmUgb21taXRlZC4gVGhpcyBpbXBsaWVzIHNvbWUga2luZAotICogb2YgZ2xvYmFsIG9wdGltaXphdGlvbi4gV2UgY3VycmVudGx5IG9ubHkgb3B0aW1pemUgd2l0aGluIGEgc2luZ2xlIG1hY3JvLgotICogICBGb3IgbWFueSBvZiB0aGUgbG9hZCBhbmQgc3RvcmUgbWFjcm9zIGlmIHRoZSBhZGRyZXNzIGlzIHNwZWNpZmllZCBhcyBhCi0gKiBjb25zdGFudCBleHByZXNzaW9uIGluIHRoZSBmaXJzdCA2NGsgb2YgbWVtb3J5IChpZSBsZCAkMiwweDQwMDBjKSB3ZQotICogZmlyc3QgbG9hZCByZWdpc3RlciAnYXQnIHdpdGggemVybyBhbmQgdXNlIGl0IGFzIHRoZSBiYXNlIHJlZ2lzdGVyLiBUaGUKLSAqIG1pcHMgYXNzZW1ibGVyIHNpbXBseSB1c2VzIHJlZ2lzdGVyICR6ZXJvLiBKdXN0IG9uZSB0aW55IG9wdGltaXphdGlvbgotICogd2UncmUgbWlzc2luZy4KLSAqLwotc3RhdGljIHZvaWQKLW1hY3JvIChpcCkKLSAgICAgc3RydWN0IG1pcHNfY2xfaW5zbiAqaXA7Ci17Ci0gIHJlZ2lzdGVyIGludCB0cmVnLCBzcmVnLCBkcmVnLCBicmVnOwotICBpbnQgdGVtcHJlZzsKLSAgaW50IG1hc2s7Ci0gIGludCBpY250ID0gMDsKLSAgaW50IHVzZWRfYXQ7Ci0gIGV4cHJlc3Npb25TIGV4cHIxOwotICBjb25zdCBjaGFyICpzOwotICBjb25zdCBjaGFyICpzMjsKLSAgY29uc3QgY2hhciAqZm10OwotICBpbnQgbGlrZWx5ID0gMDsKLSAgaW50IGRibCA9IDA7Ci0gIGludCBjb3Byb2MgPSAwOwotICBpbnQgbHIgPSAwOwotICBpbnQgaW1tID0gMDsKLSAgb2Zmc2V0VCBtYXhudW07Ci0gIGludCBvZmY7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOwotICBjaGFyICpwOwotICBpbnQgaG9sZF9taXBzX29wdGltaXplOwotCi0gIGFzc2VydCAoISBtaXBzX29wdHMubWlwczE2KTsKLQotICB0cmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAxNikgJiAweDFmOwotICBkcmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAxMSkgJiAweDFmOwotICBzcmVnID0gYnJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMjEpICYgMHgxZjsKLSAgbWFzayA9IGlwLT5pbnNuX21vLT5tYXNrOwotCi0gIGV4cHIxLlhfb3AgPSBPX2NvbnN0YW50OwotICBleHByMS5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gIGV4cHIxLlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gIGV4cHIxLlhfYWRkX251bWJlciA9IDE7Ci0KLSAgc3dpdGNoIChtYXNrKQotICAgIHsKLSAgICBjYXNlIE1fREFCUzoKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX0FCUzoKLSAgICAgIC8qIGJnZXogJGEwLC4rMTIKLQkgbW92ZSB2MCwkYTAKLQkgc3ViIHYwLCR6ZXJvLCRhMAotCSAqLwotCi0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0KLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDg7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJnZXoiLCAicyxwIiwgc3JlZyk7Ci0gICAgICBpZiAoZHJlZyA9PSBzcmVnKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiLCAwKTsKLSAgICAgIGVsc2UKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtb3ZlIiwgImQscyIsIGRyZWcsIHNyZWcsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICBkYmwgPyAiZHN1YiIgOiAic3ViIiwKLQkJICAgImQsdix0IiwgZHJlZywgMCwgc3JlZyk7Ci0KLSAgICAgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9BRERfSToKLSAgICAgIHMgPSAiYWRkaSI7Ci0gICAgICBzMiA9ICJhZGQiOwotICAgICAgZ290byBkb19hZGRpOwotICAgIGNhc2UgTV9BRERVX0k6Ci0gICAgICBzID0gImFkZGl1IjsKLSAgICAgIHMyID0gImFkZHUiOwotICAgICAgZ290byBkb19hZGRpOwotICAgIGNhc2UgTV9EQUREX0k6Ci0gICAgICBkYmwgPSAxOwotICAgICAgcyA9ICJkYWRkaSI7Ci0gICAgICBzMiA9ICJkYWRkIjsKLSAgICAgIGdvdG8gZG9fYWRkaTsKLSAgICBjYXNlIE1fREFERFVfSToKLSAgICAgIGRibCA9IDE7Ci0gICAgICBzID0gImRhZGRpdSI7Ci0gICAgICBzMiA9ICJkYWRkdSI7Ci0gICAgZG9fYWRkaToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAweDgwMDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsIHMsICJ0LHIsaiIsIHRyZWcsIHNyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMyLCAiZCx2LHQiLCB0cmVnLCBzcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9BTkRfSToKLSAgICAgIHMgPSAiYW5kaSI7Ci0gICAgICBzMiA9ICJhbmQiOwotICAgICAgZ290byBkb19iaXQ7Ci0gICAgY2FzZSBNX09SX0k6Ci0gICAgICBzID0gIm9yaSI7Ci0gICAgICBzMiA9ICJvciI7Ci0gICAgICBnb3RvIGRvX2JpdDsKLSAgICBjYXNlIE1fTk9SX0k6Ci0gICAgICBzID0gIiI7Ci0gICAgICBzMiA9ICJub3IiOwotICAgICAgZ290byBkb19iaXQ7Ci0gICAgY2FzZSBNX1hPUl9JOgotICAgICAgcyA9ICJ4b3JpIjsKLSAgICAgIHMyID0gInhvciI7Ci0gICAgZG9fYml0OgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4MTAwMDApCi0JewotCSAgaWYgKG1hc2sgIT0gTV9OT1JfSSkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsIHMsICJ0LHIsaSIsIHRyZWcsCi0JCQkgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJvcmkiLCAidCxyLGkiLAotCQkJICAgdHJlZywgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vciIsICJkLHYsdCIsCi0JCQkgICB0cmVnLCB0cmVnLCAwKTsKLQkgICAgfQotCSAgcmV0dXJuOwotCX0KLQotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzMiwgImQsdix0IiwgdHJlZywgc3JlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkVRX0k6Ci0gICAgICBzID0gImJlcSI7Ci0gICAgICBnb3RvIGJlcV9pOwotICAgIGNhc2UgTV9CRVFMX0k6Ci0gICAgICBzID0gImJlcWwiOwotICAgICAgbGlrZWx5ID0gMTsKLSAgICAgIGdvdG8gYmVxX2k7Ci0gICAgY2FzZSBNX0JORV9JOgotICAgICAgcyA9ICJibmUiOwotICAgICAgZ290byBiZXFfaTsKLSAgICBjYXNlIE1fQk5FTF9JOgotICAgICAgcyA9ICJibmVsIjsKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgYmVxX2k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCAicyx0LHAiLCBzcmVnLAotCQkgICAgICAgMCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJzLHQscCIsIHNyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JHRUw6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CR0U6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJnZXpsIiA6ICJiZ2V6IiwKLQkJICAgICAgICJzLHAiLCBzcmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJsZXpsIiA6ICJibGV6IiwKLQkJICAgICAgICJzLHAiLCB0cmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHQiLCAiZCx2LHQiLCBBVCwgc3JlZywgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JHVExfSToKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JHVF9JOgotICAgICAgLyogY2hlY2sgZm9yID4gbWF4IGludGVnZXIgKi8KLSAgICAgIG1heG51bSA9IDB4N2ZmZmZmZmY7Ci0gICAgICBpZiAobWlwc19vcHRzLmlzYSA+PSAzICYmIHNpemVvZiAobWF4bnVtKSA+IDQpCi0JewotCSAgbWF4bnVtIDw8PSAxNjsKLQkgIG1heG51bSB8PSAweGZmZmY7Ci0JICBtYXhudW0gPDw9IDE2OwotCSAgbWF4bnVtIHw9IDB4ZmZmZjsKLQl9Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gbWF4bnVtCi0JICAmJiAobWlwc19vcHRzLmlzYSA8IDMgfHwgc2l6ZW9mIChtYXhudW0pID4gNCkpCi0JewotCWRvX2ZhbHNlOgotCSAgLyogcmVzdWx0IGlzIGFsd2F5cyBmYWxzZSAqLwotCSAgaWYgKCEgbGlrZWx5KQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiQnJhbmNoICVzIGlzIGFsd2F5cyBmYWxzZSAobm9wKSIpLCBpcC0+aW5zbl9tby0+bmFtZSk7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIsIDApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJCcmFuY2ggbGlrZWx5ICVzIGlzIGFsd2F5cyBmYWxzZSIpLCBpcC0+aW5zbl9tby0+bmFtZSk7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJibmVsIiwKLQkJCSAgICJzLHQscCIsIDAsIDApOwotCSAgICB9Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKys7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgTV9CR0VfSToKLSAgICBjYXNlIE1fQkdFTF9JOgotICAgICAgaWYgKG1hc2sgPT0gTV9CR0VMX0kpCi0JbGlrZWx5ID0gMTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmdlemwiIDogImJnZXoiLAotCQkgICAgICAgInMscCIsIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDEpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmd0emwiIDogImJndHoiLAotCQkgICAgICAgInMscCIsIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIG1heG51bSA9IDB4N2ZmZmZmZmY7Ci0gICAgICBpZiAobWlwc19vcHRzLmlzYSA+PSAzICYmIHNpemVvZiAobWF4bnVtKSA+IDQpCi0JewotCSAgbWF4bnVtIDw8PSAxNjsKLQkgIG1heG51bSB8PSAweGZmZmY7Ci0JICBtYXhudW0gPDw9IDE2OwotCSAgbWF4bnVtIHw9IDB4ZmZmZjsKLQl9Ci0gICAgICBtYXhudW0gPSAtIG1heG51bSAtIDE7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPD0gbWF4bnVtCi0JICAmJiAobWlwc19vcHRzLmlzYSA8IDMgfHwgc2l6ZW9mIChtYXhudW0pID4gNCkpCi0JewotCWRvX3RydWU6Ci0JICAvKiByZXN1bHQgaXMgYWx3YXlzIHRydWUgKi8KLQkgIGFzX3dhcm4gKF8oIkJyYW5jaCAlcyBpcyBhbHdheXMgdHJ1ZSIpLCBpcC0+aW5zbl9tby0+bmFtZSk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImIiLCAicCIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHNldF9hdCAoJmljbnQsIHNyZWcsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CR0VVTDoKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JHRVU6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCWdvdG8gZG9fdHJ1ZTsKLSAgICAgIGlmIChzcmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKLQkJICAgICAgICJzLHQscCIsIDAsIHRyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBBVCwgc3JlZywKLQkJICAgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JHVFVMX0k6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CR1RVX0k6Ci0gICAgICBpZiAoc3JlZyA9PSAwCi0JICB8fCAobWlwc19vcHRzLmlzYSA8IDMKLQkgICAgICAmJiBpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMHhmZmZmZmZmZikpCi0JZ290byBkb19mYWxzZTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKLSAgICAgIGltbV9leHByLlhfYWRkX251bWJlcisrOwotICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIE1fQkdFVV9JOgotICAgIGNhc2UgTV9CR0VVTF9JOgotICAgICAgaWYgKG1hc2sgPT0gTV9CR0VVTF9JKQotCWxpa2VseSA9IDE7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQotCWdvdG8gZG9fdHJ1ZTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDEpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKLQkJICAgICAgICJzLHQscCIsIHNyZWcsIDApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHNldF9hdCAoJmljbnQsIHNyZWcsIDEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CR1RMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkdUOgotICAgICAgaWYgKHRyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZ3R6bCIgOiAiYmd0eiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKHNyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibHR6bCIgOiAiYmx0eiIsCi0JCSAgICAgICAicyxwIiwgdHJlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0IiwgImQsdix0IiwgQVQsIHRyZWcsIHNyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CR1RVTDoKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JHVFU6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICAgICAicyx0LHAiLCBzcmVnLCAwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCWdvdG8gZG9fZmFsc2U7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgQVQsIHRyZWcsCi0JCSAgIHNyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CTEVMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkxFOgotICAgICAgaWYgKHRyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibGV6bCIgOiAiYmxleiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKHNyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZ2V6bCIgOiAiYmdleiIsCi0JCSAgICAgICAicyxwIiwgdHJlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0IiwgImQsdix0IiwgQVQsIHRyZWcsIHNyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CTEVMX0k6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CTEVfSToKLSAgICAgIG1heG51bSA9IDB4N2ZmZmZmZmY7Ci0gICAgICBpZiAobWlwc19vcHRzLmlzYSA+PSAzICYmIHNpemVvZiAobWF4bnVtKSA+IDQpCi0JewotCSAgbWF4bnVtIDw8PSAxNjsKLQkgIG1heG51bSB8PSAweGZmZmY7Ci0JICBtYXhudW0gPDw9IDE2OwotCSAgbWF4bnVtIHw9IDB4ZmZmZjsKLQl9Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gbWF4bnVtCi0JICAmJiAobWlwc19vcHRzLmlzYSA8IDMgfHwgc2l6ZW9mIChtYXhudW0pID4gNCkpCi0JZ290byBkb190cnVlOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKys7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgTV9CTFRfSToKLSAgICBjYXNlIE1fQkxUTF9JOgotICAgICAgaWYgKG1hc2sgPT0gTV9CTFRMX0kpCi0JbGlrZWx5ID0gMTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmx0emwiIDogImJsdHoiLAotCQkgICAgICAgInMscCIsIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDEpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmxlemwiIDogImJsZXoiLAotCQkgICAgICAgInMscCIsIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHNldF9hdCAoJmljbnQsIHNyZWcsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CTEVVTDoKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JMRVU6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICAgICAicyx0LHAiLCBzcmVnLCAwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCWdvdG8gZG9fdHJ1ZTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBBVCwgdHJlZywKLQkJICAgc3JlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JMRVVMX0k6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CTEVVX0k6Ci0gICAgICBpZiAoc3JlZyA9PSAwCi0JICB8fCAobWlwc19vcHRzLmlzYSA8IDMKLQkgICAgICAmJiBpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMHhmZmZmZmZmZikpCi0JZ290byBkb190cnVlOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKys7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgTV9CTFRVX0k6Ci0gICAgY2FzZSBNX0JMVFVMX0k6Ci0gICAgICBpZiAobWFzayA9PSBNX0JMVFVMX0kpCi0JbGlrZWx5ID0gMTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JZ290byBkb19mYWxzZTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDEpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKLQkJICAgICAgICJzLHQscCIsIHNyZWcsIDApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHNldF9hdCAoJmljbnQsIHNyZWcsIDEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CTFRMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkxUOgotICAgICAgaWYgKHRyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibHR6bCIgOiAiYmx0eiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKHNyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZ3R6bCIgOiAiYmd0eiIsCi0JCSAgICAgICAicyxwIiwgdHJlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0IiwgImQsdix0IiwgQVQsIHNyZWcsIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CTFRVTDoKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JMVFU6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCWdvdG8gZG9fZmFsc2U7Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICAgICAicyx0LHAiLCAwLCB0cmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgQVQsIHNyZWcsCi0JCSAgIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ERElWXzM6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9ESVZfMzoKLSAgICAgIHMgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2RpdjM7Ci0gICAgY2FzZSBNX0RSRU1fMzoKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX1JFTV8zOgotICAgICAgcyA9ICJtZmhpIjsKLSAgICBkb19kaXYzOgotICAgICAgaWYgKHRyZWcgPT0gMCkKLQl7Ci0JICBhc193YXJuIChfKCJEaXZpZGUgYnkgemVyby4iKSk7Ci0JICBpZiAobWlwc190cmFwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0ZXEiLCAicyx0IiwgMCwgMCk7Ci0JICBlbHNlCi0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDcpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotICAgICAgaWYgKG1pcHNfdHJhcCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0ZXEiLCAicyx0IiwgdHJlZywgMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgICAgICBkYmwgPyAiZGRpdiIgOiAiZGl2IiwKLQkJICAgICAgICJ6LHMsdCIsIHNyZWcsIHRyZWcpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSA4OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJibmUiLCAicyx0LHAiLCB0cmVnLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgICAgIGRibCA/ICJkZGl2IiA6ICJkaXYiLAotCQkgICAgICAgInoscyx0Iiwgc3JlZywgdHJlZyk7Ci0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgImMiLCA3KTsKLQl9Ci0gICAgICBleHByMS5YX2FkZF9udW1iZXIgPSAtMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkgICBkYmwgPyAiZGFkZGl1IiA6ICJhZGRpdSIsCi0JCSAgICJ0LHIsaiIsIEFULCAwLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBleHByMS5YX2FkZF9udW1iZXIgPSBtaXBzX3RyYXAgPyAoZGJsID8gMTIgOiA4KSA6IChkYmwgPyAyMCA6IDE2KTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYm5lIiwgInMsdCxwIiwgdHJlZywgQVQpOwotICAgICAgaWYgKGRibCkKLQl7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSAxOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJkYWRkaXUiLCAidCxyLGoiLCBBVCwgMCwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImRzbGwzMiIsICJkLHcsPCIsIEFULCBBVCwKLQkJICAgICAgIDMxKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMHg4MDAwMDAwMDsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAibHVpIiwgInQsdSIsIEFULAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0hJMTYpOwotCX0KLSAgICAgIGlmIChtaXBzX3RyYXApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAidGVxIiwgInMsdCIsIHNyZWcsIEFUKTsKLQkgIC8qIFdlIHdhbnQgdG8gY2xvc2UgdGhlIG5vcmVvcmRlciBibG9jayBhcyBzb29uIGFzIHBvc3NpYmxlLCBzbwotCSAgICAgdGhhdCBsYXRlciBpbnNucyBhcmUgYXZhaWxhYmxlIGZvciBkZWxheSBzbG90IGZpbGxpbmcuICAqLwotCSAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSA4OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJibmUiLCAicyx0LHAiLCBzcmVnLCBBVCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIiwgMCk7Ci0KLQkgIC8qIFdlIHdhbnQgdG8gY2xvc2UgdGhlIG5vcmVvcmRlciBibG9jayBhcyBzb29uIGFzIHBvc3NpYmxlLCBzbwotCSAgICAgdGhhdCBsYXRlciBpbnNucyBhcmUgYXZhaWxhYmxlIGZvciBkZWxheSBzbG90IGZpbGxpbmcuICAqLwotCSAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgImMiLCA2KTsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJkIiwgZHJlZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ESVZfM0k6Ci0gICAgICBzID0gImRpdiI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2aTsKLSAgICBjYXNlIE1fRElWVV8zSToKLSAgICAgIHMgPSAiZGl2dSI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2aTsKLSAgICBjYXNlIE1fUkVNXzNJOgotICAgICAgcyA9ICJkaXYiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgICBnb3RvIGRvX2Rpdmk7Ci0gICAgY2FzZSBNX1JFTVVfM0k6Ci0gICAgICBzID0gImRpdnUiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgICBnb3RvIGRvX2Rpdmk7Ci0gICAgY2FzZSBNX0RESVZfM0k6Ci0gICAgICBkYmwgPSAxOwotICAgICAgcyA9ICJkZGl2IjsKLSAgICAgIHMyID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXZpOwotICAgIGNhc2UgTV9ERElWVV8zSToKLSAgICAgIGRibCA9IDE7Ci0gICAgICBzID0gImRkaXZ1IjsKLSAgICAgIHMyID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXZpOwotICAgIGNhc2UgTV9EUkVNXzNJOgotICAgICAgZGJsID0gMTsKLSAgICAgIHMgPSAiZGRpdiI7Ci0gICAgICBzMiA9ICJtZmhpIjsKLSAgICAgIGdvdG8gZG9fZGl2aTsKLSAgICBjYXNlIE1fRFJFTVVfM0k6Ci0gICAgICBkYmwgPSAxOwotICAgICAgcyA9ICJkZGl2dSI7Ci0gICAgICBzMiA9ICJtZmhpIjsKLSAgICBkb19kaXZpOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQl7Ci0JICBhc193YXJuIChfKCJEaXZpZGUgYnkgemVyby4iKSk7Ci0JICBpZiAobWlwc190cmFwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0ZXEiLCAicyx0IiwgMCwgMCk7Ci0JICBlbHNlCi0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDEpCi0JewotCSAgaWYgKHN0cmNtcCAoczIsICJtZmxvIikgPT0gMCkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibW92ZSIsICJkLHMiLCBkcmVnLAotCQkJIHNyZWcpOwotCSAgZWxzZQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtb3ZlIiwgImQscyIsIGRyZWcsIDApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAtMQotCSAgJiYgc1tzdHJsZW4gKHMpIC0gMV0gIT0gJ3UnKQotCXsKLQkgIGlmIChzdHJjbXAgKHMyLCAibWZsbyIpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoZGJsKQotCQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJkbmVnIiwgImQsdyIsIGRyZWcsCi0JCQkgICAgIHNyZWcpOwotCSAgICAgIGVsc2UKLQkJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibmVnIiwgImQsdyIsIGRyZWcsCi0JCQkgICAgIHNyZWcpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1vdmUiLCAiZCxzIiwgZHJlZywgMCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgInoscyx0Iiwgc3JlZywgQVQpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzMiwgImQiLCBkcmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RJVlVfMzoKLSAgICAgIHMgPSAiZGl2dSI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2dTM7Ci0gICAgY2FzZSBNX1JFTVVfMzoKLSAgICAgIHMgPSAiZGl2dSI7Ci0gICAgICBzMiA9ICJtZmhpIjsKLSAgICAgIGdvdG8gZG9fZGl2dTM7Ci0gICAgY2FzZSBNX0RESVZVXzM6Ci0gICAgICBzID0gImRkaXZ1IjsKLSAgICAgIHMyID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXZ1MzsKLSAgICBjYXNlIE1fRFJFTVVfMzoKLSAgICAgIHMgPSAiZGRpdnUiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgZG9fZGl2dTM6Ci0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgICBpZiAobWlwc190cmFwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInRlcSIsICJzLHQiLCB0cmVnLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgInoscyx0Iiwgc3JlZywgdHJlZyk7Ci0JICAvKiBXZSB3YW50IHRvIGNsb3NlIHRoZSBub3Jlb3JkZXIgYmxvY2sgYXMgc29vbiBhcyBwb3NzaWJsZSwgc28KLQkgICAgIHRoYXQgbGF0ZXIgaW5zbnMgYXJlIGF2YWlsYWJsZSBmb3IgZGVsYXkgc2xvdCBmaWxsaW5nLiAgKi8KLQkgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gODsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYm5lIiwgInMsdCxwIiwgdHJlZywgMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJ6LHMsdCIsIHNyZWcsIHRyZWcpOwotCi0JICAvKiBXZSB3YW50IHRvIGNsb3NlIHRoZSBub3Jlb3JkZXIgYmxvY2sgYXMgc29vbiBhcyBwb3NzaWJsZSwgc28KLQkgICAgIHRoYXQgbGF0ZXIgaW5zbnMgYXJlIGF2YWlsYWJsZSBmb3IgZGVsYXkgc2xvdCBmaWxsaW5nLiAgKi8KLQkgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDcpOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgczIsICJkIiwgZHJlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fRExBX0FCOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fTEFfQUI6Ci0gICAgICAvKiBMb2FkIHRoZSBhZGRyZXNzIG9mIGEgc3ltYm9sIGludG8gYSByZWdpc3Rlci4gIElmIGJyZWcgaXMgbm90Ci0JIHplcm8sIHdlIHRoZW4gYWRkIGEgYmFzZSByZWdpc3RlciB0byBpdC4gICovCi0KLSAgICAgIC8qIFdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSwgd2UgcGVybWl0IGV4cHJlc3Npb25zIG9mCi0JIHRoZSBmb3JtCi0JICAgbGEJJDQsZm9vLWJhcgotCSB3aGVyZSBiYXIgaXMgYW4gYWRkcmVzcyBpbiB0aGUgLnRleHQgc2VjdGlvbi4gIFRoZXNlIGFyZSB1c2VkCi0JIHdoZW4gZ2V0dGluZyB0aGUgYWRkcmVzc2VzIG9mIGZ1bmN0aW9ucy4gIFdlIGRvbid0IHBlcm1pdAotCSBYX2FkZF9udW1iZXIgdG8gYmUgbm9uLXplcm8sIGJlY2F1c2UgaWYgdGhlIHN5bWJvbCBpcwotCSBleHRlcm5hbCB0aGUgcmVsYXhpbmcgY29kZSBuZWVkcyB0byBrbm93IHRoYXQgYW55IGFkZGVuZCBpcwotCSBwdXJlbHkgdGhlIG9mZnNldCB0byBYX29wX3N5bWJvbC4gICovCi0gICAgICBpZiAobWlwc19waWMgPT0gRU1CRURERURfUElDCi0JICAmJiBvZmZzZXRfZXhwci5YX29wID09IE9fc3VidHJhY3QKLQkgICYmIG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uCi0JICAmJiAob2Zmc2V0X2V4cHIuWF9vcF9zeW1ib2wtPnN5X3ZhbHVlLlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgID8gU19HRVRfU0VHTUVOVCAob2Zmc2V0X2V4cHIuWF9vcF9zeW1ib2wpID09IHRleHRfc2VjdGlvbgotCSAgICAgIDogKG9mZnNldF9leHByLlhfb3Bfc3ltYm9sLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JCSAmJiAoU19HRVRfU0VHTUVOVCAob2Zmc2V0X2V4cHIuWF9vcF9zeW1ib2wKLQkJCQkgICAgLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wpCi0JCSAgICAgPT0gdGV4dF9zZWN0aW9uKSkpCi0JICAmJiBicmVnID09IDAKLQkgICYmIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHVpIiwgInQsdSIsCi0JCSAgICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfUENSRUxfSEkxNl9TKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgICAgIHx8IG1pcHNfb3B0cy5pc2EgIDwgMykKLQkJCT8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHRyZWcsIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19QQ1JFTF9MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChvZmZzZXRfZXhwci5YX29wICE9IE9fc3ltYm9sCi0JICAmJiBvZmZzZXRfZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JewotCSAgYXNfYmFkIChfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOwotCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JfQotCi0gICAgICBpZiAodHJlZyA9PSBicmVnKQotCXsKLQkgIHRlbXByZWcgPSBBVDsKLQkgIHVzZWRfYXQgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB0ZW1wcmVnID0gdHJlZzsKLQkgIHVzZWRfYXQgPSAwOwotCX0KLQotICAgICAgaWYgKG9mZnNldF9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQlsb2FkX3JlZ2lzdGVyICgmaWNudCwgdGVtcHJlZywgJm9mZnNldF9leHByLCBkYmwpOwotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gTk9fUElDKQotCXsKLQkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4gR1AgcmVsYXRpdmUgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCRncCw8c3ltPgkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICBPdGhlcndpc2Ugd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfSEkxNl9TKQotCSAgICAgICBhZGRpdQkkdGVtcHJlZywkdGVtcHJlZyw8c3ltPgkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICBJZiB3ZSBoYXZlIGEgY29uc3RhbnQsIHdlIG5lZWQgdHdvIGluc3RydWN0aW9ucyBhbnlob3csCi0JICAgICBzbyB3ZSBtYXkgYXMgd2VsbCBhbHdheXMgdXNlIHRoZSBsYXR0ZXIgZm9ybS4gICovCi0JICBpZiAoKHZhbHVlVCkgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IE1BWF9HUFJFTF9PRkZTRVQKLQkgICAgICB8fCBub3BpY19uZWVkX3JlbGF4IChvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIDEpKQotCSAgICBwID0gTlVMTDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZyYWdfZ3JvdyAoMjApOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgCSAgICAgfHwgbWlwc19vcHRzLmlzYSAgPCAzKQotCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJCSAgICJ0LHIsaiIsIHRlbXByZWcsIEdQLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCk7Ci0JICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgOCwgMCwKLQkJCSAgICBSRUxBWF9FTkNPREUgKDQsIDgsIDAsIDQsIDAsCi0JCQkJCSAgbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zKSwKLQkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJICAgIChjaGFyICopIE5VTEwpOwotCSAgICB9Ci0JICBtYWNyb19idWlsZF9sdWkgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsIHRlbXByZWcpOwotCSAgaWYgKHAgIT0gTlVMTCkKLQkgICAgcCArPSA0OwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhICA8IDMpCi0JCQk/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCB0ZW1wcmVnLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMgJiYgISBtaXBzX2JpZ19nb3QpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzeW1ib2wsIGFuZCB0aGVyZQotCSAgICAgaXMgbm8gY29uc3RhbnQsIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICBGb3IgYSBsb2NhbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICBhZGRpdQkkdGVtcHJlZywkdGVtcHJlZyw8c3ltPgkoQkZEX1JFTE9DX0xPMTYpCi0KLQkgICAgIElmIHdlIGhhdmUgYSBzbWFsbCBjb25zdGFudCwgYW5kIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8KLQkgICAgIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxjb25zdGFudD4KLQkgICAgIEZvciBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudCB0aGUgc2FtZSBpbnN0cnVjdGlvbgotCSAgICAgc2VxdWVuY2UsIGJ1dCB3ZSBvdXRwdXQgYSBCRkRfUkVMT0NfTE8xNiByZWxvYyBvbiB0aGUKLQkgICAgIGFkZGl1IGluc3RydWN0aW9uLgotCi0JICAgICBJZiB3ZSBoYXZlIGEgbGFyZ2UgY29uc3RhbnQsIGFuZCB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvCi0JICAgICBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIGx1aQkkYXQsPGhpY29uc3RhbnQ+Ci0JICAgICAgIGFkZGl1CSRhdCwkYXQsPGxvY29uc3RhbnQ+Ci0JICAgICAgIGFkZHUJJHRlbXByZWcsJHRlbXByZWcsJGF0Ci0JICAgICBGb3IgYSBsb2NhbCBzeW1ib2wsIHdlIHdhbnQgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24KLQkgICAgIHNlcXVlbmNlLCBidXQgd2Ugb3V0cHV0IGEgQkZEX1JFTE9DX0xPMTYgcmVsb2Mgb24gdGhlCi0JICAgICBhZGRpdSBpbnN0cnVjdGlvbi4gICovCi0JICBleHByMS5YX2FkZF9udW1iZXIgPSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXI7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCSAgZnJhZ19ncm93ICgzMik7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGRibCA/ICJsZCIgOiAibHciLAotCQkgICAgICAgInQsbyhiKSIsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0JICBpZiAoZXhwcjEuWF9hZGRfbnVtYmVyID09IDApCi0JICAgIHsKLQkgICAgICBpbnQgb2ZmOwotCi0JICAgICAgaWYgKGJyZWcgPT0gMCkKLQkJb2ZmID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBXZSdyZSBnb2luZyB0byBwdXQgaW4gYW4gYWRkdSBpbnN0cnVjdGlvbiB1c2luZwotCQkgICAgIHRlbXByZWcsIHNvIHdlIG1heSBhcyB3ZWxsIGluc2VydCB0aGUgbm9wIHJpZ2h0Ci0JCSAgICAgbm93LiAgKi8KLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICJub3AiLCAiIik7Ci0JCSAgb2ZmID0gNDsKLQkJfQotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDggLSBvZmYsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgwLCA4IC0gb2ZmLCAtNCAtIG9mZiwgNCAtIG9mZiwgMCwKLQkJCQkJICAoYnJlZyA9PSAwCi0JCQkJCSAgID8gbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zCi0JCQkJCSAgIDogMCkpLAotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgICAgaWYgKGJyZWcgPT0gMCkKLQkJewotCQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JCSAgcCArPSA0OwotCQl9Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmZXhwcjEsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgIC8qIEZJWE1FOiBJZiBicmVnID09IDAsIGFuZCB0aGUgbmV4dCBpbnN0cnVjdGlvbiB1c2VzCi0JCSAkdGVtcHJlZywgdGhlbiBpZiB0aGlzIHZhcmlhbnQgY2FzZSBpcyB1c2VkIGFuIGV4dHJhCi0JCSBub3Agd2lsbCBiZSBnZW5lcmF0ZWQuICAqLwotCSAgICB9Ci0JICBlbHNlIGlmIChleHByMS5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotCQkgICAmJiBleHByMS5YX2FkZF9udW1iZXIgPCAweDgwMDApCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgIm5vcCIsICIiKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCQkgICAidCxyLGoiLCB0ZW1wcmVnLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICAgKHZvaWQpIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMCwgMCwKLQkJCSAgICAgICBSRUxBWF9FTkNPREUgKDAsIDAsIC0xMiwgLTQsIDAsIDApLAotCQkJICAgICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBvZmYxOwotCi0JICAgICAgLyogSWYgd2UgYXJlIGdvaW5nIHRvIGFkZCBpbiBhIGJhc2UgcmVnaXN0ZXIsIGFuZCB0aGUKLQkJIHRhcmdldCByZWdpc3RlciBhbmQgdGhlIGJhc2UgcmVnaXN0ZXIgYXJlIHRoZSBzYW1lLAotCQkgdGhlbiB3ZSBhcmUgdXNpbmcgQVQgYXMgYSB0ZW1wb3JhcnkgcmVnaXN0ZXIuICBTaW5jZQotCQkgd2Ugd2FudCB0byBsb2FkIHRoZSBjb25zdGFudCBpbnRvIEFULCB3ZSBhZGQgb3VyCi0JCSBjdXJyZW50IEFUIChmcm9tIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlKSBhbmQgdGhlCi0JCSByZWdpc3RlciBpbnRvIHRoZSByZWdpc3RlciBub3csIGFuZCBwcmV0ZW5kIHdlIHdlcmUKLQkJIG5vdCB1c2luZyBhIGJhc2UgcmVnaXN0ZXIuICAqLwotCSAgICAgIGlmIChicmVnICE9IHRyZWcpCi0JCW9mZjEgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgIm5vcCIsICIiKTsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCQk/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgICAgICJkLHYsdCIsIHRyZWcsIEFULCBicmVnKTsKLQkJICBicmVnID0gMDsKLQkJICB0ZW1wcmVnID0gdHJlZzsKLQkJICBvZmYxID0gLTg7Ci0JCX0KLQotCSAgICAgIC8qIFNldCBtaXBzX29wdGltaXplIGFyb3VuZCB0aGUgbHVpIGluc3RydWN0aW9uIHRvIGF2b2lkCi0JCSBpbnNlcnRpbmcgYW4gdW5uZWNlc3Nhcnkgbm9wIGFmdGVyIHRoZSBsdy4gICovCi0JICAgICAgaG9sZF9taXBzX29wdGltaXplID0gbWlwc19vcHRpbWl6ZTsKLQkgICAgICBtaXBzX29wdGltaXplID0gMjsKLQkgICAgICBtYWNyb19idWlsZF9sdWkgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIEFUKTsKLQkgICAgICBtaXBzX29wdGltaXplID0gaG9sZF9taXBzX29wdGltaXplOwotCi0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgQVQsIEFULCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgQVQpOwotCSAgICAgICh2b2lkKSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDAsIDAsCi0JCQkgICAgICAgUkVMQVhfRU5DT0RFICgwLCAwLCAtMTYgKyBvZmYxLCAtOCwgMCwgMCksCi0JCQkgICAgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgICB1c2VkX2F0ID0gMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQotCXsKLQkgIGludCBncGRlbDsKLQotCSAgLyogVGhpcyBpcyB0aGUgbGFyZ2UgR09UIGNhc2UuICBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuCi0JICAgICBleHRlcm5hbCBzeW1ib2wsIGFuZCB0aGVyZSBpcyBubyBjb25zdGFudCwgd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HT1RfSEkxNikKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkZ3AKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJHRlbXByZWcpIChCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKLQkgICAgIEZvciBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxzeW0+CShCRkRfUkVMT0NfTE8xNikKLQotCSAgICAgSWYgd2UgaGF2ZSBhIHNtYWxsIGNvbnN0YW50LCBhbmQgdGhpcyBpcyBhIHJlZmVyZW5jZSB0bwotCSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx1aQkkdGVtcHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KQotCSAgICAgICBhZGR1CSR0ZW1wcmVnLCR0ZW1wcmVnLCRncAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkdGVtcHJlZykgKEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2KQotCSAgICAgICBub3AKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJHRlbXByZWcsPGNvbnN0YW50PgotCSAgICAgRm9yIGEgbG9jYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJHRlbXByZWcsPGNvbnN0YW50PiAoQkZEX1JFTE9DX0xPMTYpCi0KLQkgICAgIElmIHdlIGhhdmUgYSBsYXJnZSBjb25zdGFudCwgYW5kIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8KLQkgICAgIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HT1RfSEkxNikKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkZ3AKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJHRlbXByZWcpIChCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKLQkgICAgICAgbHVpCSRhdCw8aGljb25zdGFudD4KLQkgICAgICAgYWRkaXUJJGF0LCRhdCw8bG9jb25zdGFudD4KLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkYXQKLQkgICAgIEZvciBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbHVpCSRhdCw8aGljb25zdGFudD4KLQkgICAgICAgYWRkaXUJJGF0LCRhdCw8bG9jb25zdGFudD4JKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgICBhZGR1CSR0ZW1wcmVnLCR0ZW1wcmVnLCRhdAotCSAgICAgKi8KLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IG9mZnNldF9leHByLlhfYWRkX251bWJlcjsKLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IDA7Ci0JICBmcmFnX2dyb3cgKDUyKTsKLQkgIGlmIChyZWdfbmVlZHNfZGVsYXkgKEdQKSkKLQkgICAgZ3BkZWwgPSA0OwotCSAgZWxzZQotCSAgICBncGRlbCA9IDA7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx1aSIsICJ0LHUiLAotCQkgICAgICAgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgICAgICJkLHYsdCIsIHRlbXByZWcsIHRlbXByZWcsIEdQKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgZGJsID8gImxkIiA6ICJsdyIsCi0JCSAgICAgICAidCxvKGIpIiwgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsCi0JCSAgICAgICB0ZW1wcmVnKTsKLQkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPT0gMCkKLQkgICAgewotCSAgICAgIGludCBvZmY7Ci0KLQkgICAgICBpZiAoYnJlZyA9PSAwKQotCQlvZmYgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFdlJ3JlIGdvaW5nIHRvIHB1dCBpbiBhbiBhZGR1IGluc3RydWN0aW9uIHVzaW5nCi0JCSAgICAgdGVtcHJlZywgc28gd2UgbWF5IGFzIHdlbGwgaW5zZXJ0IHRoZSBub3AgcmlnaHQKLQkJICAgICBub3cuICAqLwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgIm5vcCIsICIiKTsKLQkJICBvZmYgPSA0OwotCQl9Ci0KLQkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMiArIGdwZGVsLCAwLAotCQkJICAgIFJFTEFYX0VOQ09ERSAoMTIgKyBvZmYsIDEyICsgZ3BkZWwsIGdwZGVsLAotCQkJCQkgIDggKyBncGRlbCwgMCwKLQkJCQkJICAoYnJlZyA9PSAwCi0JCQkJCSAgID8gbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zCi0JCQkJCSAgIDogMCkpLAotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGV4cHIxLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0JCSAgICYmIGV4cHIxLlhfYWRkX251bWJlciA8IDB4ODAwMCkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAibm9wIiwgIiIpOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJCSAgICJ0LHIsaiIsIHRlbXByZWcsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyICsgZ3BkZWwsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgyMCwgMTIgKyBncGRlbCwgZ3BkZWwsIDggKyBncGRlbCwgMCwKLQkJCQkJICAoYnJlZyA9PSAwCi0JCQkJCSAgID8gbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zCi0JCQkJCSAgIDogMCkpLAotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBhZGosIGRyZWc7Ci0KLQkgICAgICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gYWRkIGluIGEgYmFzZSByZWdpc3RlciwgYW5kIHRoZQotCQkgdGFyZ2V0IHJlZ2lzdGVyIGFuZCB0aGUgYmFzZSByZWdpc3RlciBhcmUgdGhlIHNhbWUsCi0JCSB0aGVuIHdlIGFyZSB1c2luZyBBVCBhcyBhIHRlbXBvcmFyeSByZWdpc3Rlci4gIFNpbmNlCi0JCSB3ZSB3YW50IHRvIGxvYWQgdGhlIGNvbnN0YW50IGludG8gQVQsIHdlIGFkZCBvdXIKLQkJIGN1cnJlbnQgQVQgKGZyb20gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUpIGFuZCB0aGUKLQkJIHJlZ2lzdGVyIGludG8gdGhlIHJlZ2lzdGVyIG5vdywgYW5kIHByZXRlbmQgd2Ugd2VyZQotCQkgbm90IHVzaW5nIGEgYmFzZSByZWdpc3Rlci4gICovCi0JICAgICAgaWYgKGJyZWcgIT0gdHJlZykKLQkJewotCQkgIGFkaiA9IDA7Ci0JCSAgZHJlZyA9IHRlbXByZWc7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhc3NlcnQgKHRlbXByZWcgPT0gQVQpOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgIm5vcCIsICIiKTsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCQk/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgICAgICJkLHYsdCIsIHRyZWcsIEFULCBicmVnKTsKLQkJICBkcmVnID0gdHJlZzsKLQkJICBhZGogPSA4OwotCQl9Ci0KLQkgICAgICAvKiBTZXQgbWlwc19vcHRpbWl6ZSBhcm91bmQgdGhlIGx1aSBpbnN0cnVjdGlvbiB0byBhdm9pZAotCQkgaW5zZXJ0aW5nIGFuIHVubmVjZXNzYXJ5IG5vcCBhZnRlciB0aGUgbHcuICAqLwotCSAgICAgIGhvbGRfbWlwc19vcHRpbWl6ZSA9IG1pcHNfb3B0aW1pemU7Ci0JICAgICAgbWlwc19vcHRpbWl6ZSA9IDI7Ci0JICAgICAgbWFjcm9fYnVpbGRfbHVpICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBBVCk7Ci0JICAgICAgbWlwc19vcHRpbWl6ZSA9IGhvbGRfbWlwc19vcHRpbWl6ZTsKLQotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJCSAgICJ0LHIsaiIsIEFULCBBVCwgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIGRyZWcsIGRyZWcsIEFUKTsKLQotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDE2ICsgZ3BkZWwgKyBhZGosIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgyNCArIGFkaiwgMTYgKyBncGRlbCArIGFkaiwgZ3BkZWwsCi0JCQkJCSAgOCArIGdwZGVsLCAwLAotCQkJCQkgIChicmVnID09IDAKLQkJCQkJICAgPyBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MKLQkJCQkJICAgOiAwKSksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQotCSAgICAgIHVzZWRfYXQgPSAxOwotCSAgICB9Ci0KLQkgIGlmIChncGRlbCA+IDApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyAkZ3AsIGJ1dAotICAgICAgICAgICAgICAgICB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb24gdGhlIG1haW4gc3RyZWFtIGRvZXMgbm90LiAgKi8KLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgfQotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBkYmwgPyAibGQiIDogImx3IiwKLQkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgcCArPSA0OwotCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0JICAgICAgJiYgZXhwcjEuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmZXhwcjEsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgIC8qIEZJWE1FOiBJZiBhZGRfbnVtYmVyIGlzIDAsIGFuZCB0aGVyZSB3YXMgbm8gYmFzZQotICAgICAgICAgICAgICAgICByZWdpc3RlciwgdGhlIGV4dGVybmFsIHN5bWJvbCBjYXNlIGVuZGVkIHdpdGggYSBsb2FkLAotICAgICAgICAgICAgICAgICBzbyBpZiB0aGUgc3ltYm9sIHR1cm5zIG91dCB0byBub3QgYmUgZXh0ZXJuYWwsIGFuZAotICAgICAgICAgICAgICAgICB0aGUgbmV4dCBpbnN0cnVjdGlvbiB1c2VzIHRlbXByZWcsIGFuIHVubmVjZXNzYXJ5IG5vcAotICAgICAgICAgICAgICAgICB3aWxsIGJlIGluc2VydGVkLiAgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGJyZWcgPT0gdHJlZykKLQkJewotCQkgIC8qIFdlIG11c3QgYWRkIGluIHRoZSBiYXNlIHJlZ2lzdGVyIG5vdywgYXMgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBzeW1ib2wgY2FzZS4gICovCi0JCSAgYXNzZXJ0ICh0ZW1wcmVnID09IEFUKTsKLQkJICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCQkgIHAgKz0gNDsKLQkJICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCQk/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgICAgICJkLHYsdCIsIHRyZWcsIEFULCBicmVnKTsKLQkJICBwICs9IDQ7Ci0JCSAgdGVtcHJlZyA9IHRyZWc7Ci0JCSAgLyogV2Ugc2V0IGJyZWcgdG8gMCBiZWNhdXNlIHdlIGhhdmUgYXJyYW5nZWQgdG8gYWRkCi0gICAgICAgICAgICAgICAgICAgICBpdCBpbiBpbiBib3RoIGNhc2VzLiAgKi8KLQkJICBicmVnID0gMDsKLQkJfQotCi0JICAgICAgbWFjcm9fYnVpbGRfbHVpIChwLCAmaWNudCwgJmV4cHIxLCBBVCk7Ci0JICAgICAgcCArPSA0OwotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJmV4cHIxLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJCSAgICJ0LHIsaiIsIEFULCBBVCwgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAiZCx2LHQiLCB0ZW1wcmVnLCB0ZW1wcmVnLCBBVCk7Ci0JICAgICAgcCArPSA0OwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gRU1CRURERURfUElDKQotCXsKLQkgIC8qIFdlIHVzZQotCSAgICAgICBhZGRpdQkkdGVtcHJlZywkZ3AsPHN5bT4JKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQk/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCB0ZW1wcmVnLCBHUCwgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwpOwotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQotICAgICAgaWYgKGJyZWcgIT0gMCkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCSAgICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCSAgICAgImQsdix0IiwgdHJlZywgdGVtcHJlZywgYnJlZyk7Ci0KLSAgICAgIGlmICghIHVzZWRfYXQpCi0JcmV0dXJuOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9KX0E6Ci0gICAgICAvKiBUaGUgaiBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIHVzZWQgaW4gUElDIGNvZGUsIHNpbmNlIGl0Ci0JIHJlcXVpcmVzIGFuIGFic29sdXRlIGFkZHJlc3MuICBXZSBjb252ZXJ0IGl0IHRvIGEgYgotCSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBpZiAobWlwc19waWMgPT0gTk9fUElDKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAiaiIsICJhIik7Ci0gICAgICBlbHNlCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJiIiwgInAiKTsKLSAgICAgIHJldHVybjsKLQotICAgICAgLyogVGhlIGphbCBpbnN0cnVjdGlvbnMgbXVzdCBiZSBoYW5kbGVkIGFzIG1hY3JvcyBiZWNhdXNlIHdoZW4KLQkgZ2VuZXJhdGluZyBQSUMgY29kZSB0aGV5IGV4cGFuZCB0byBtdWx0aS1pbnN0cnVjdGlvbgotCSBzZXF1ZW5jZXMuICBOb3JtYWxseSB0aGV5IGFyZSBzaW1wbGUgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgICBjYXNlIE1fSkFMXzE6Ci0gICAgICBkcmVnID0gUkE7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgTV9KQUxfMjoKLSAgICAgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMKLQkgIHx8IG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAiamFsciIsCi0JCSAgICAgImQscyIsIGRyZWcsIHNyZWcpOwotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgaWYgKHNyZWcgIT0gUElDX0NBTExfUkVHKQotCSAgICBhc193YXJuIChfKCJNSVBTIFBJQyBjYWxsIHRvIHJlZ2lzdGVyIG90aGVyIHRoYW4gJDI1IikpOwotICAgICAgCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAiamFsciIsCi0JCSAgICAgICAiZCxzIiwgZHJlZywgc3JlZyk7Ci0JICBpZiAobWlwc19jcHJlc3RvcmVfb2Zmc2V0IDwgMCkKLQkgICAgYXNfd2FybiAoXygiTm8gLmNwcmVzdG9yZSBwc2V1ZG8tb3AgdXNlZCBpbiBQSUMgY29kZSIpKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IG1pcHNfY3ByZXN0b3JlX29mZnNldDsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJCSAgICJ0LG8oYikiLCBHUCwgKGludCkgQkZEX1JFTE9DX0xPMTYsIG1pcHNfZnJhbWVfcmVnKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX0pBTF9BOgotICAgICAgaWYgKG1pcHNfcGljID09IE5PX1BJQykKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImphbCIsICJhIik7Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgYW5kIHdlIGFyZQotCSAgICAgdXNpbmcgYSBzbWFsbCBHT1QsIHdlIHdhbnQKLQkgICAgICAgbHcJJDI1LDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19DQUxMMTYpCi0JICAgICAgIG5vcAotCSAgICAgICBqYWxyCSQyNQotCSAgICAgICBub3AKLQkgICAgICAgbHcJJGdwLGNwcmVzdG9yZSgkc3ApCi0JICAgICBUaGUgY3ByZXN0b3JlIHZhbHVlIGlzIHNldCB1c2luZyB0aGUgLmNwcmVzdG9yZQotCSAgICAgcHNldWRvLW9wLiAgSWYgd2UgYXJlIHVzaW5nIGEgYmlnIEdPVCwgd2Ugd2FudAotCSAgICAgICBsdWkJJDI1LDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2KQotCSAgICAgICBhZGR1CSQyNSwkMjUsJGdwCi0JICAgICAgIGx3CSQyNSw8c3ltPigkMjUpCQkoQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2KQotCSAgICAgICBub3AKLQkgICAgICAgamFscgkkMjUKLQkgICAgICAgbm9wCi0JICAgICAgIGx3CSRncCxjcHJlc3RvcmUoJHNwKQotCSAgICAgSWYgdGhlIHN5bWJvbCBpcyBub3QgZXh0ZXJuYWwsIHdlIHdhbnQKLQkgICAgICAgbHcJJDI1LDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSQyNSwkMjUsPHN5bT4JCShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgamFscgkkMjUKLQkgICAgICAgbm9wCi0JICAgICAgIGx3ICRncCxjcHJlc3RvcmUoJHNwKSAqLwotCSAgZnJhZ19ncm93ICg0MCk7Ci0JICBpZiAoISBtaXBzX2JpZ19nb3QpCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJCSAgICJ0LG8oYikiLCBQSUNfQ0FMTF9SRUcsCi0JCQkgICAoaW50KSBCRkRfUkVMT0NfTUlQU19DQUxMMTYsIEdQKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgIm5vcCIsICIiKTsKLQkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA0LCAwLAotCQkJICAgIFJFTEFYX0VOQ09ERSAoMCwgNCwgLTgsIDAsIDAsIDApLAotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBncGRlbDsKLQotCSAgICAgIGlmIChyZWdfbmVlZHNfZGVsYXkgKEdQKSkKLQkJZ3BkZWwgPSA0OwotCSAgICAgIGVsc2UKLQkJZ3BkZWwgPSAwOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHVpIiwgInQsdSIsCi0JCQkgICBQSUNfQ0FMTF9SRUcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNik7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgUElDX0NBTExfUkVHLCBQSUNfQ0FMTF9SRUcsIEdQKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJCSAgICJ0LG8oYikiLCBQSUNfQ0FMTF9SRUcsCi0JCQkgICAoaW50KSBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYsIFBJQ19DQUxMX1JFRyk7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICJub3AiLCAiIik7Ci0JICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTIgKyBncGRlbCwgMCwKLQkJCSAgICBSRUxBWF9FTkNPREUgKDE2LCAxMiArIGdwZGVsLCBncGRlbCwgOCArIGdwZGVsLAotCQkJCQkgIDAsIDApLAotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgICAgaWYgKGdwZGVsID4gMCkKLQkJewotCQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JCSAgcCArPSA0OwotCQl9Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAibHciIDogImxkIiksCi0JCQkgICAidCxvKGIpIiwgUElDX0NBTExfUkVHLAotCQkJICAgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgIH0JCQkgICAKLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQk/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCBQSUNfQ0FMTF9SRUcsIFBJQ19DQUxMX1JFRywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgICAiamFsciIsICJzIiwgUElDX0NBTExfUkVHKTsKLQkgIGlmIChtaXBzX2NwcmVzdG9yZV9vZmZzZXQgPCAwKQotCSAgICBhc193YXJuIChfKCJObyAuY3ByZXN0b3JlIHBzZXVkby1vcCB1c2VkIGluIFBJQyBjb2RlIikpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKG1pcHNfb3B0cy5ub3Jlb3JkZXIpCi0JCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICJub3AiLCAiIik7Ci0JICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gbWlwc19jcHJlc3RvcmVfb2Zmc2V0OwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImx3IiA6ICJsZCIpLAotCQkJICAgInQsbyhiKSIsIEdQLCAoaW50KSBCRkRfUkVMT0NfTE8xNiwKLQkJCSAgIG1pcHNfZnJhbWVfcmVnKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImJhbCIsICJwIik7Ci0JICAvKiBUaGUgbGlua2VyIG1heSBleHBhbmQgdGhlIGNhbGwgdG8gYSBsb25nZXIgc2VxdWVuY2Ugd2hpY2gKLQkgICAgIHVzZXMgJGF0LCBzbyB3ZSBtdXN0IGJyZWFrIHJhdGhlciB0aGFuIHJldHVybi4gICovCi0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9MQl9BQjoKLSAgICAgIHMgPSAibGIiOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTEJVX0FCOgotICAgICAgcyA9ICJsYnUiOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTEhfQUI6Ci0gICAgICBzID0gImxoIjsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xIVV9BQjoKLSAgICAgIHMgPSAibGh1IjsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xXX0FCOgotICAgICAgcyA9ICJsdyI7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV0MwX0FCOgotICAgICAgcyA9ICJsd2MwIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV0MxX0FCOgotICAgICAgcyA9ICJsd2MxIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV0MyX0FCOgotICAgICAgcyA9ICJsd2MyIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV0MzX0FCOgotICAgICAgcyA9ICJsd2MzIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV0xfQUI6Ci0gICAgICBzID0gImx3bCI7Ci0gICAgICBsciA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV1JfQUI6Ci0gICAgICBzID0gImx3ciI7Ci0gICAgICBsciA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MREMxX0FCOgotICAgICAgaWYgKG1pcHNfY3B1ID09IDQ2NTApCi0JewotCSAgYXNfYmFkIChfKCJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBzID0gImxkYzEiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xEQzJfQUI6Ci0gICAgICBzID0gImxkYzIiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xEQzNfQUI6Ci0gICAgICBzID0gImxkYzMiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xETF9BQjoKLSAgICAgIHMgPSAibGRsIjsKLSAgICAgIGxyID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xEUl9BQjoKLSAgICAgIHMgPSAibGRyIjsKLSAgICAgIGxyID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xMX0FCOgotICAgICAgcyA9ICJsbCI7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MTERfQUI6Ci0gICAgICBzID0gImxsZCI7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV1VfQUI6Ci0gICAgICBzID0gImx3dSI7Ci0gICAgbGQ6Ci0gICAgICBpZiAoYnJlZyA9PSB0cmVnIHx8IGNvcHJvYyB8fCBscikKLQl7Ci0JICB0ZW1wcmVnID0gQVQ7Ci0JICB1c2VkX2F0ID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdGVtcHJlZyA9IHRyZWc7Ci0JICB1c2VkX2F0ID0gMDsKLQl9Ci0gICAgICBnb3RvIGxkX3N0OwotICAgIGNhc2UgTV9TQl9BQjoKLSAgICAgIHMgPSAic2IiOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0hfQUI6Ci0gICAgICBzID0gInNoIjsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NXX0FCOgotICAgICAgcyA9ICJzdyI7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV0MwX0FCOgotICAgICAgcyA9ICJzd2MwIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV0MxX0FCOgotICAgICAgcyA9ICJzd2MxIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV0MyX0FCOgotICAgICAgcyA9ICJzd2MyIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV0MzX0FCOgotICAgICAgcyA9ICJzd2MzIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV0xfQUI6Ci0gICAgICBzID0gInN3bCI7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV1JfQUI6Ci0gICAgICBzID0gInN3ciI7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TQ19BQjoKLSAgICAgIHMgPSAic2MiOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0NEX0FCOgotICAgICAgcyA9ICJzY2QiOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0RDMV9BQjoKLSAgICAgIGlmIChtaXBzX2NwdSA9PSA0NjUwKQotCXsKLQkgIGFzX2JhZCAoXygib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3IiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgcyA9ICJzZGMxIjsKLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TREMyX0FCOgotICAgICAgcyA9ICJzZGMyIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TREMzX0FCOgotICAgICAgcyA9ICJzZGMzIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TRExfQUI6Ci0gICAgICBzID0gInNkbCI7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TRFJfQUI6Ci0gICAgICBzID0gInNkciI7Ci0gICAgc3Q6Ci0gICAgICB0ZW1wcmVnID0gQVQ7Ci0gICAgICB1c2VkX2F0ID0gMTsKLSAgICBsZF9zdDoKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGlmIChtYXNrID09IE1fTFdDMV9BQgotCSAgfHwgbWFzayA9PSBNX1NXQzFfQUIKLQkgIHx8IG1hc2sgPT0gTV9MREMxX0FCCi0JICB8fCBtYXNrID09IE1fU0RDMV9BQgotCSAgfHwgbWFzayA9PSBNX0xfREFCCi0JICB8fCBtYXNrID09IE1fU19EQUIpCi0JZm10ID0gIlQsbyhiKSI7Ci0gICAgICBlbHNlIGlmIChjb3Byb2MpCi0JZm10ID0gIkUsbyhiKSI7Ci0gICAgICBlbHNlCi0JZm10ID0gInQsbyhiKSI7Ci0KLSAgICAgIGlmIChvZmZzZXRfZXhwci5YX29wICE9IE9fY29uc3RhbnQKLQkgICYmIG9mZnNldF9leHByLlhfb3AgIT0gT19zeW1ib2wpCi0JewotCSAgYXNfYmFkIChfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOwotCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JfQotCi0gICAgICAvKiBBIGNvbnN0YW50IGV4cHJlc3Npb24gaW4gUElDIGNvZGUgY2FuIGJlIGhhbmRsZWQganVzdCBhcyBpdAotCSBpcyBpbiBub24gUElDIGNvZGUuICAqLwotICAgICAgaWYgKG1pcHNfcGljID09IE5PX1BJQwotCSAgfHwgb2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBHUCByZWxhdGl2ZSBzeW1ib2wsIGFuZCB0aGVyZQotCSAgICAgaXMgbm8gYmFzZSByZWdpc3Rlciwgd2Ugd2FudAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgT3RoZXJ3aXNlLCBpZiB0aGVyZSBpcyBubyBiYXNlIHJlZ2lzdGVyLCB3ZSB3YW50Ci0JICAgICAgIGx1aQkkdGVtcHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19ISTE2X1MpCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJHRlbXByZWcpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgIElmIHdlIGhhdmUgYSBjb25zdGFudCwgd2UgbmVlZCB0d28gaW5zdHJ1Y3Rpb25zIGFueWhvdywKLQkgICAgIHNvIHdlIGFsd2F5cyB1c2UgdGhlIGxhdHRlciBmb3JtLgotCi0JICAgICBJZiB3ZSBoYXZlIGEgYmFzZSByZWdpc3RlciwgYW5kIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYQotCSAgICAgR1AgcmVsYXRpdmUgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGFkZHUJJHRlbXByZWcsJGJyZWcsJGdwCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJHRlbXByZWcpCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgIE90aGVyd2lzZSB3ZSB3YW50Ci0JICAgICAgIGx1aQkkdGVtcHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19ISTE2X1MpCi0JICAgICAgIGFkZHUJJHRlbXByZWcsJHRlbXByZWcsJGJyZWcKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkdGVtcHJlZykJKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgV2l0aCBhIGNvbnN0YW50IHdlIGFsd2F5cyB1c2UgdGhlIGxhdHRlciBjYXNlLiAgKi8KLQkgIGlmIChicmVnID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoKHZhbHVlVCkgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IE1BWF9HUFJFTF9PRkZTRVQKLQkJICB8fCBub3BpY19uZWVkX3JlbGF4IChvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIDEpKQotCQlwID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBmcmFnX2dyb3cgKDIwKTsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkJICAgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCBHUCk7Ci0JCSAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgOCwgMCwKLQkJCQlSRUxBWF9FTkNPREUgKDQsIDgsIDAsIDQsIDAsCi0JCQkJCSAgICAgIChtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MKLQkJCQkJICAgICAgIHx8ICh1c2VkX2F0Ci0JCQkJCQkgICAmJiBtaXBzX29wdHMubm9hdCkpKSwKLQkJCQlvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJCShjaGFyICopIE5VTEwpOwotCQkgIHVzZWRfYXQgPSAwOwotCQl9Ci0JICAgICAgbWFjcm9fYnVpbGRfbHVpIChwLCAmaWNudCwgJm9mZnNldF9leHByLCB0ZW1wcmVnKTsKLQkgICAgICBpZiAocCAhPSBOVUxMKQotCQlwICs9IDQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwgdHJlZywKLQkJCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCB0ZW1wcmVnKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCh2YWx1ZVQpIG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSBNQVhfR1BSRUxfT0ZGU0VUCi0JCSAgfHwgbm9waWNfbmVlZF9yZWxheCAob2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAxKSkKLQkJcCA9IE5VTEw7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZnJhZ19ncm93ICgyOCk7Ci0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkJPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICAgICAiZCx2LHQiLCB0ZW1wcmVnLCBicmVnLCBHUCk7Ci0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJCSAgICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCwgdGVtcHJlZyk7Ci0JCSAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTIsIDAsCi0JCQkJUkVMQVhfRU5DT0RFICg4LCAxMiwgMCwgOCwgMCwgMCksCi0JCQkJb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCQkoY2hhciAqKSBOVUxMKTsKLQkJfQotCSAgICAgIG1hY3JvX2J1aWxkX2x1aSAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgdGVtcHJlZyk7Ci0JICAgICAgaWYgKHAgIT0gTlVMTCkKLQkJcCArPSA0OwotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIHRlbXByZWcsIHRlbXByZWcsIGJyZWcpOwotCSAgICAgIGlmIChwICE9IE5VTEwpCi0JCXAgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LCB0cmVnLAotCQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIHRlbXByZWcpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMgJiYgISBtaXBzX2JpZ19nb3QpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICA8b3A+CSR0cmVnLDAoJHRlbXByZWcpCi0JICAgICBPdGhlcndpc2Ugd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxzeW0+CShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZywwKCR0ZW1wcmVnKQotCSAgICAgSWYgdGhlcmUgaXMgYSBiYXNlIHJlZ2lzdGVyLCB3ZSBhZGQgaXQgdG8gJHRlbXByZWcgYmVmb3JlCi0JICAgICB0aGUgPG9wPi4gIElmIHRoZXJlIGlzIGEgY29uc3RhbnQsIHdlIHN0aWNrIGl0IGluIHRoZQotCSAgICAgPG9wPiBpbnN0cnVjdGlvbi4gIFdlIGRvbid0IGhhbmRsZSBjb25zdGFudHMgbGFyZ2VyIHRoYW4KLQkgICAgIDE2IGJpdHMsIGJlY2F1c2Ugd2UgaGF2ZSBubyB3YXkgdG8gbG9hZCB0aGUgdXBwZXIgMTYgYml0cwotCSAgICAgKGFjdHVhbGx5LCB3ZSBjb3VsZCBoYW5kbGUgdGhlbSBmb3IgdGhlIHN1YnNldCBvZiBjYXNlcwotCSAgICAgaW4gd2hpY2ggd2UgYXJlIG5vdCB1c2luZyAkYXQpLiAgKi8KLQkgIGFzc2VydCAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX3N5bWJvbCk7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXI7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA8IC0weDgwMDAKLQkgICAgICB8fCBleHByMS5YX2FkZF9udW1iZXIgPj0gMHg4MDAwKQotCSAgICBhc19iYWQgKF8oIlBJQyBjb2RlIG9mZnNldCBvdmVyZmxvdyAobWF4IDE2IHNpZ25lZCBiaXRzKSIpKTsKLQkgIGZyYWdfZ3JvdyAoMjApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDQsIDAsIAotCQkJUkVMQVhfRU5DT0RFICgwLCA0LCAtOCwgMCwgMCwgMCksCi0JCQlvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJKGNoYXIgKikgTlVMTCk7Ci0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHRlbXByZWcsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIGlmIChicmVnICE9IDApCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAiZCx2LHQiLCB0ZW1wcmVnLCB0ZW1wcmVnLCBicmVnKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsIHRyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgdGVtcHJlZyk7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgaW50IGdwZGVsOwotCi0JICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HT1RfSEkxNikKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkZ3AKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJHRlbXByZWcpIChCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZywwKCR0ZW1wcmVnKQotCSAgICAgT3RoZXJ3aXNlIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICBhZGRpdQkkdGVtcHJlZywkdGVtcHJlZyw8c3ltPgkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICAgIDxvcD4JJHRyZWcsMCgkdGVtcHJlZykKLQkgICAgIElmIHRoZXJlIGlzIGEgYmFzZSByZWdpc3Rlciwgd2UgYWRkIGl0IHRvICR0ZW1wcmVnIGJlZm9yZQotCSAgICAgdGhlIDxvcD4uICBJZiB0aGVyZSBpcyBhIGNvbnN0YW50LCB3ZSBzdGljayBpdCBpbiB0aGUKLQkgICAgIDxvcD4gaW5zdHJ1Y3Rpb24uICBXZSBkb24ndCBoYW5kbGUgY29uc3RhbnRzIGxhcmdlciB0aGFuCi0JICAgICAxNiBiaXRzLCBiZWNhdXNlIHdlIGhhdmUgbm8gd2F5IHRvIGxvYWQgdGhlIHVwcGVyIDE2IGJpdHMKLQkgICAgIChhY3R1YWxseSwgd2UgY291bGQgaGFuZGxlIHRoZW0gZm9yIHRoZSBzdWJzZXQgb2YgY2FzZXMKLQkgICAgIGluIHdoaWNoIHdlIGFyZSBub3QgdXNpbmcgJGF0KS4gICovCi0JICBhc3NlcnQgKG9mZnNldF9leHByLlhfb3AgPT0gT19zeW1ib2wpOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPCAtMHg4MDAwCi0JICAgICAgfHwgZXhwcjEuWF9hZGRfbnVtYmVyID49IDB4ODAwMCkKLQkgICAgYXNfYmFkIChfKCJQSUMgY29kZSBvZmZzZXQgb3ZlcmZsb3cgKG1heCAxNiBzaWduZWQgYml0cykiKSk7Ci0JICBpZiAocmVnX25lZWRzX2RlbGF5IChHUCkpCi0JICAgIGdwZGVsID0gNDsKLQkgIGVsc2UKLQkgICAgZ3BkZWwgPSAwOwotCSAgZnJhZ19ncm93ICgzNik7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx1aSIsICJ0LHUiLAotCQkgICAgICAgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCSAgICAgICAiZCx2LHQiLCB0ZW1wcmVnLCB0ZW1wcmVnLCBHUCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAgICAgInQsbyhiKSIsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2LAotCQkgICAgICAgdGVtcHJlZyk7Ci0JICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMiArIGdwZGVsLCAwLAotCQkJUkVMQVhfRU5DT0RFICgxMiwgMTIgKyBncGRlbCwgZ3BkZWwsIDggKyBncGRlbCwgMCwgMCksCi0JCQlvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLCAoY2hhciAqKSBOVUxMKTsKLQkgIGlmIChncGRlbCA+IDApCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgfQotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgcCArPSA0OwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgIHAgKz0gNDsKLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCSAgICAgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgaWYgKGJyZWcgIT0gMCkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICJkLHYsdCIsIHRlbXByZWcsIHRlbXByZWcsIGJyZWcpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsIGZtdCwgdHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCB0ZW1wcmVnKTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMpCi0JewotCSAgLyogSWYgdGhlcmUgaXMgbm8gYmFzZSByZWdpc3Rlciwgd2Ugd2FudAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgSWYgdGhlcmUgaXMgYSBiYXNlIHJlZ2lzdGVyLCB3ZSB3YW50Ci0JICAgICAgIGFkZHUJJHRlbXByZWcsJGJyZWcsJGdwCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJHRlbXByZWcpCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgICovCi0JICBhc3NlcnQgKG9mZnNldF9leHByLlhfb3AgPT0gT19zeW1ib2wpOwotCSAgaWYgKGJyZWcgPT0gMCkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCi0JCQkgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCwgR1ApOwotCSAgICAgIHVzZWRfYXQgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAiZCx2LHQiLCB0ZW1wcmVnLCBicmVnLCBHUCk7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJCSAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCB0ZW1wcmVnKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQotICAgICAgaWYgKCEgdXNlZF9hdCkKLQlyZXR1cm47Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0xJOgotICAgIGNhc2UgTV9MSV9TOgotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIHRyZWcsICZpbW1fZXhwciwgMCk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fRExJOgotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIHRyZWcsICZpbW1fZXhwciwgMSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fTElfU1M6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgICAibXRjMSIsICJ0LEciLCBBVCwgdHJlZyk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNzZXJ0IChvZmZzZXRfZXhwci5YX29wID09IE9fc3ltYm9sCi0JCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQKLQkJCQkJICAgKG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCkpLAotCQkJICAgICAiLmxpdDQiKSA9PSAwCi0JCSAgJiYgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID09IDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsd2MxIiwgIlQsbyhiKSIsCi0JCSAgICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMLCBHUCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgY2FzZSBNX0xJX0Q6Ci0gICAgICAvKiBJZiB3ZSBoYXZlIGEgY29uc3RhbnQgaW4gSU1NX0VYUFIsIHRoZW4gaW4gbWlwczMgbW9kZSBpdCBpcwotICAgICAgICAgdGhlIGVudGlyZSB2YWx1ZSwgYW5kIGluIG1pcHMxIG1vZGUgaXQgaXMgdGhlIGhpZ2ggb3JkZXIgMzIKLSAgICAgICAgIGJpdHMgb2YgdGhlIHZhbHVlIGFuZCB0aGUgbG93IG9yZGVyIDMyIGJpdHMgYXJlIGVpdGhlciB6ZXJvCi0gICAgICAgICBvciBpbiBvZmZzZXRfZXhwci4gICovCi0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50IHx8IGltbV9leHByLlhfb3AgPT0gT19iaWcpCi0JewotCSAgaWYgKG1pcHNfb3B0cy5pc2EgPj0gMykKLQkgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIHRyZWcsICZpbW1fZXhwciwgMSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnQgaHJlZywgbHJlZzsKLQotCSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQkJewotCQkgIGhyZWcgPSB0cmVnOwotCQkgIGxyZWcgPSB0cmVnICsgMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGhyZWcgPSB0cmVnICsgMTsKLQkJICBscmVnID0gdHJlZzsKLQkJfQotCi0JICAgICAgaWYgKGhyZWcgPD0gMzEpCi0JCWxvYWRfcmVnaXN0ZXIgKCZpY250LCBocmVnLCAmaW1tX2V4cHIsIDApOwotCSAgICAgIGlmIChscmVnIDw9IDMxKQotCQl7Ci0JCSAgaWYgKG9mZnNldF9leHByLlhfb3AgPT0gT19hYnNlbnQpCi0JCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtb3ZlIiwgImQscyIsCi0JCQkJIGxyZWcsIDApOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYXNzZXJ0IChvZmZzZXRfZXhwci5YX29wID09IE9fY29uc3RhbnQpOwotCQkgICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgbHJlZywgJm9mZnNldF9leHByLCAwKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBXZSBrbm93IHRoYXQgc3ltIGlzIGluIHRoZSAucmRhdGEgc2VjdGlvbi4gIEZpcnN0IHdlIGdldCB0aGUKLQkgdXBwZXIgMTYgYml0cyBvZiB0aGUgYWRkcmVzcy4gICovCi0gICAgICBpZiAobWlwc19waWMgPT0gTk9fUElDKQotCXsKLQkgIC8qIEZJWE1FOiBUaGlzIHdvbid0IHdvcmsgZm9yIGEgNjQgYml0IGFkZHJlc3MuICAqLwotCSAgbWFjcm9fYnVpbGRfbHVpICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBBVCk7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgICAgICJ0LG8oYikiLCBBVCwgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMpCi0JewotCSAgLyogRm9yIGVtYmVkZGVkIFBJQyB3ZSBwaWNrIHVwIHRoZSBlbnRpcmUgYWRkcmVzcyBvZmYgJGdwIGluCi0JICAgICBhIHNpbmdsZSBpbnN0cnVjdGlvbi4gICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIEFULCBHUCwgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwpOwotCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQkKLSAgICAgIC8qIE5vdyB3ZSBsb2FkIHRoZSByZWdpc3RlcihzKS4gICovCi0gICAgICBpZiAobWlwc19vcHRzLmlzYSA+PSAzKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibGQiLCAidCxvKGIpIiwKLQkJICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotICAgICAgZWxzZQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHciLCAidCxvKGIpIiwKLQkJICAgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBpZiAodHJlZyAhPSAzMSkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBIb3cgaW4gdGhlIHdvcmxkIGRvIHdlIGRlYWwgd2l0aCB0aGUgcG9zc2libGUKLQkJIG92ZXJmbG93IGhlcmU/ICAqLwotCSAgICAgIG9mZnNldF9leHByLlhfYWRkX251bWJlciArPSA0OwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHciLCAidCxvKGIpIiwKLQkJCSAgIHRyZWcgKyAxLCAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUbyBhdm9pZCBjb25mdXNpb24gaW4gdGNfZ2VuX3JlbG9jLCB3ZSBtdXN0IGVuc3VyZSB0aGF0IHRoaXMKLQkgZG9lcyBub3QgYmVjb21lIGEgdmFyaWFudCBmcmFnLiAgKi8KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19uZXcgKDApOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9MSV9ERDoKLSAgICAgIC8qIElmIHdlIGhhdmUgYSBjb25zdGFudCBpbiBJTU1fRVhQUiwgdGhlbiBpbiBtaXBzMyBtb2RlIGl0IGlzCi0gICAgICAgICB0aGUgZW50aXJlIHZhbHVlLCBhbmQgaW4gbWlwczEgbW9kZSBpdCBpcyB0aGUgaGlnaCBvcmRlciAzMgotICAgICAgICAgYml0cyBvZiB0aGUgdmFsdWUgYW5kIHRoZSBsb3cgb3JkZXIgMzIgYml0cyBhcmUgZWl0aGVyIHplcm8KLSAgICAgICAgIG9yIGluIG9mZnNldF9leHByLiAgKi8KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgfHwgaW1tX2V4cHIuWF9vcCA9PSBPX2JpZykKLQl7Ci0JICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgbWlwc19vcHRzLmlzYSA+PSAzKTsKLQkgIGlmIChtaXBzX29wdHMuaXNhID49IDMpCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgImRtdGMxIiwgInQsUyIsIEFULCB0cmVnKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAibXRjMSIsICJ0LEciLCBBVCwgdHJlZyArIDEpOwotCSAgICAgIGlmIChvZmZzZXRfZXhwci5YX29wID09IE9fYWJzZW50KQotCQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAibXRjMSIsICJ0LEciLCAwLCB0cmVnKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBhc3NlcnQgKG9mZnNldF9leHByLlhfb3AgPT0gT19jb25zdGFudCk7Ci0JCSAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmb2Zmc2V0X2V4cHIsIDApOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgIm10YzEiLCAidCxHIiwgQVQsIHRyZWcpOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgYXNzZXJ0IChvZmZzZXRfZXhwci5YX29wID09IE9fc3ltYm9sCi0JICAgICAgJiYgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID09IDApOwotICAgICAgcyA9IHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAob2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sKSk7Ci0gICAgICBpZiAoc3RyY21wIChzLCAiLmxpdDgiKSA9PSAwKQotCXsKLQkgIGlmIChtaXBzX29wdHMuaXNhID49IDIpCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImxkYzEiLAotCQkJICAgIlQsbyhiKSIsIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIEdQKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGJyZWcgPSBHUDsKLQkgIHIgPSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMOwotCSAgZ290byBkb2I7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzc2VydCAoc3RyY21wIChzLCBSREFUQV9TRUNUSU9OX05BTUUpID09IDApOwotCSAgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJCSAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICA/ICJsdyIgOiAibGQiKSwKLQkJCSAidCxvKGIpIiwgQVQsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogVGhpcyB3b24ndCB3b3JrIGZvciBhIDY0IGJpdCBhZGRyZXNzLiAgKi8KLQkgICAgICBtYWNyb19idWlsZF9sdWkgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIEFUKTsKLQkgICAgfQotCSAgICAgIAotCSAgaWYgKG1pcHNfb3B0cy5pc2EgPj0gMikKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibGRjMSIsCi0JCQkgICAiVCxvKGIpIiwgdHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQotCSAgICAgIC8qIFRvIGF2b2lkIGNvbmZ1c2lvbiBpbiB0Y19nZW5fcmVsb2MsIHdlIG11c3QgZW5zdXJlCi0JCSB0aGF0IHRoaXMgZG9lcyBub3QgYmVjb21lIGEgdmFyaWFudCBmcmFnLiAgKi8KLQkgICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLQkgICAgICBmcmFnX25ldyAoMCk7Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgYnJlZyA9IEFUOwotCSAgciA9IEJGRF9SRUxPQ19MTzE2OwotCSAgZ290byBkb2I7Ci0JfQotCi0gICAgY2FzZSBNX0xfRE9COgotICAgICAgaWYgKG1pcHNfY3B1ID09IDQ2NTApCi0JewotCSAgYXNfYmFkIChfKCJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICAvKiBFdmVuIG9uIGEgYmlnIGVuZGlhbiBtYWNoaW5lICRmbiBjb21lcyBiZWZvcmUgJGZuKzEuICBXZSBoYXZlCi0JIHRvIGFkanVzdCB3aGVuIGxvYWRpbmcgZnJvbSBtZW1vcnkuICAqLwotICAgICAgciA9IEJGRF9SRUxPQ19MTzE2OwotICAgIGRvYjoKLSAgICAgIGFzc2VydCAobWlwc19vcHRzLmlzYSA8IDIpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsd2MxIiwgIlQsbyhiKSIsCi0JCSAgIHRhcmdldF9iaWdfZW5kaWFuID8gdHJlZyArIDEgOiB0cmVnLAotCQkgICAoaW50KSByLCBicmVnKTsKLSAgICAgIC8qIEZJWE1FOiBBIHBvc3NpYmxlIG92ZXJmbG93IHdoaWNoIEkgZG9uJ3Qga25vdyBob3cgdG8gZGVhbAotCSB3aXRoLiAgKi8KLSAgICAgIG9mZnNldF9leHByLlhfYWRkX251bWJlciArPSA0OwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsd2MxIiwgIlQsbyhiKSIsCi0JCSAgIHRhcmdldF9iaWdfZW5kaWFuID8gdHJlZyA6IHRyZWcgKyAxLAotCQkgICAoaW50KSByLCBicmVnKTsKLQotICAgICAgLyogVG8gYXZvaWQgY29uZnVzaW9uIGluIHRjX2dlbl9yZWxvYywgd2UgbXVzdCBlbnN1cmUgdGhhdCB0aGlzCi0JIGRvZXMgbm90IGJlY29tZSBhIHZhcmlhbnQgZnJhZy4gICovCi0gICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLSAgICAgIGZyYWdfbmV3ICgwKTsKLQotICAgICAgaWYgKGJyZWcgIT0gQVQpCi0JcmV0dXJuOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fTF9EQUI6Ci0gICAgICAvKgotICAgICAgICogVGhlIE1JUFMgYXNzZW1ibGVyIHNlZW1zIHRvIGNoZWNrIGZvciBYX2FkZF9udW1iZXIgbm90Ci0gICAgICAgKiBiZWluZyBkb3VibGUgYWxpZ25lZCBhbmQgZ2VuZXJhdGluZzoKLSAgICAgICAqCWx1aQlhdCwlaGkoZm9vKzEpCi0gICAgICAgKglhZGR1CWF0LGF0LHYxCi0gICAgICAgKglhZGRpdQlhdCxhdCwlbG8oZm9vKzEpCi0gICAgICAgKglsd2MxCWYyLDAoYXQpCi0gICAgICAgKglsd2MxCWYzLDQoYXQpCi0gICAgICAgKiBCdXQsIHRoZSByZXN1bHRpbmcgYWRkcmVzcyBpcyB0aGUgc2FtZSBhZnRlciByZWxvY2F0aW9uIHNvIHdoeQotICAgICAgICogZ2VuZXJhdGUgdGhlIGV4dHJhIGluc3RydWN0aW9uPwotICAgICAgICovCi0gICAgICBpZiAobWlwc19jcHUgPT0gNDY1MCkKLQl7Ci0JICBhc19iYWQgKF8oIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yIikpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBpZiAobWlwc19vcHRzLmlzYSA+PSAyKQotCXsKLQkgIHMgPSAibGRjMSI7Ci0JICBnb3RvIGxkOwotCX0KLQotICAgICAgcyA9ICJsd2MxIjsKLSAgICAgIGZtdCA9ICJULG8oYikiOwotICAgICAgZ290byBsZGRfc3RkOwotCi0gICAgY2FzZSBNX1NfREFCOgotICAgICAgaWYgKG1pcHNfY3B1ID09IDQ2NTApCi0JewotCSAgYXNfYmFkIChfKCJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIpKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChtaXBzX29wdHMuaXNhID49IDIpCi0JewotCSAgcyA9ICJzZGMxIjsKLQkgIGdvdG8gc3Q7Ci0JfQotCi0gICAgICBzID0gInN3YzEiOwotICAgICAgZm10ID0gIlQsbyhiKSI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBsZGRfc3RkOwotCi0gICAgY2FzZSBNX0xEX0FCOgotICAgICAgaWYgKG1pcHNfb3B0cy5pc2EgPj0gMykKLQl7Ci0JICBzID0gImxkIjsKLQkgIGdvdG8gbGQ7Ci0JfQotCi0gICAgICBzID0gImx3IjsKLSAgICAgIGZtdCA9ICJ0LG8oYikiOwotICAgICAgZ290byBsZGRfc3RkOwotCi0gICAgY2FzZSBNX1NEX0FCOgotICAgICAgaWYgKG1pcHNfb3B0cy5pc2EgPj0gMykKLQl7Ci0JICBzID0gInNkIjsKLQkgIGdvdG8gc3Q7Ci0JfQotCi0gICAgICBzID0gInN3IjsKLSAgICAgIGZtdCA9ICJ0LG8oYikiOwotCi0gICAgbGRkX3N0ZDoKLSAgICAgIGlmIChvZmZzZXRfZXhwci5YX29wICE9IE9fc3ltYm9sCi0JICAmJiBvZmZzZXRfZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JewotCSAgYXNfYmFkIChfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOwotCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JfQotCi0gICAgICAvKiBFdmVuIG9uIGEgYmlnIGVuZGlhbiBtYWNoaW5lICRmbiBjb21lcyBiZWZvcmUgJGZuKzEuICBXZSBoYXZlCi0JIHRvIGFkanVzdCB3aGVuIGxvYWRpbmcgZnJvbSBtZW1vcnkuICBXZSBzZXQgY29wcm9jIGlmIHdlIG11c3QKLQkgbG9hZCAkZm4rMSBmaXJzdC4gICovCi0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQljb3Byb2MgPSAwOwotCi0gICAgICBpZiAobWlwc19waWMgPT0gTk9fUElDCi0JICB8fCBvZmZzZXRfZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIEdQIHJlbGF0aXZlIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgICA8b3A+CSR0cmVnKzEsPHN5bT4rNCgkZ3ApCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgIElmIHdlIGhhdmUgYSBiYXNlIHJlZ2lzdGVyLCB3ZSB1c2UgdGhpcwotCSAgICAgICBhZGR1CSRhdCwkYnJlZywkZ3AKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkYXQpCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGF0KQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICBJZiB0aGlzIGlzIG5vdCBhIEdQIHJlbGF0aXZlIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdWkJJGF0LDxzeW0+CQkoQkZEX1JFTE9DX0hJMTZfUykKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkYXQpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGF0KQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICBJZiB0aGVyZSBpcyBhIGJhc2UgcmVnaXN0ZXIsIHdlIGFkZCBpdCB0byAkYXQgYWZ0ZXIgdGhlCi0JICAgICBsdWkgaW5zdHJ1Y3Rpb24uICBJZiB0aGVyZSBpcyBhIGNvbnN0YW50LCB3ZSBhbHdheXMgdXNlCi0JICAgICB0aGUgbGFzdCBjYXNlLiAgKi8KLQkgIGlmICgodmFsdWVUKSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gTUFYX0dQUkVMX09GRlNFVAotCSAgICAgIHx8IG5vcGljX25lZWRfcmVsYXggKG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgMSkpCi0JICAgIHsKLQkgICAgICBwID0gTlVMTDsKLQkgICAgICB1c2VkX2F0ID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IG9mZjsKLQotCSAgICAgIGlmIChicmVnID09IDApCi0JCXsKLQkJICBmcmFnX2dyb3cgKDI4KTsKLQkJICB0ZW1wcmVnID0gR1A7Ci0JCSAgb2ZmID0gMDsKLQkJICB1c2VkX2F0ID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGZyYWdfZ3JvdyAoMzYpOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJCT8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAgICAgImQsdix0IiwgQVQsIGJyZWcsIEdQKTsKLQkJICB0ZW1wcmVnID0gQVQ7Ci0JCSAgb2ZmID0gNDsKLQkJICB1c2VkX2F0ID0gMTsKLQkJfQotCi0gICAgICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkJICAgY29wcm9jID8gdHJlZyArIDEgOiB0cmVnLAotCQkJICAgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwsIHRlbXByZWcpOwotCSAgICAgIG9mZnNldF9leHByLlhfYWRkX251bWJlciArPSA0OwotCi0JICAgICAgLyogU2V0IG1pcHNfb3B0aW1pemUgdG8gMiB0byBhdm9pZCBpbnNlcnRpbmcgYW4KLSAgICAgICAgICAgICAgICAgdW5kZXNpcmVkIG5vcC4gICovCi0JICAgICAgaG9sZF9taXBzX29wdGltaXplID0gbWlwc19vcHRpbWl6ZTsKLQkgICAgICBtaXBzX29wdGltaXplID0gMjsKLSAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCi0JCQkgICBjb3Byb2MgPyB0cmVnIDogdHJlZyArIDEsCi0JCQkgICAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCwgdGVtcHJlZyk7Ci0JICAgICAgbWlwc19vcHRpbWl6ZSA9IGhvbGRfbWlwc19vcHRpbWl6ZTsKLQotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyICsgb2ZmLCAwLAotCQkJICAgIFJFTEFYX0VOQ09ERSAoOCArIG9mZiwgMTIgKyBvZmYsIDAsIDQgKyBvZmYsIDEsCi0JCQkJCSAgdXNlZF9hdCAmJiBtaXBzX29wdHMubm9hdCksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQotCSAgICAgIC8qIFdlIGp1c3QgZ2VuZXJhdGVkIHR3byByZWxvY3MuICBXaGVuIHRjX2dlbl9yZWxvYwotCQkgaGFuZGxlcyB0aGlzIGNhc2UsIGl0IHdpbGwgc2tpcCB0aGUgZmlyc3QgcmVsb2MgYW5kCi0JCSBoYW5kbGUgdGhlIHNlY29uZC4gIFRoZSBzZWNvbmQgcmVsb2MgYWxyZWFkeSBoYXMgYW4KLQkJIGV4dHJhIGFkZGVuZCBvZiA0LCB3aGljaCB3ZSBhZGRlZCBhYm92ZS4gIFdlIG11c3QKLQkJIHN1YnRyYWN0IGl0IG91dCwgYW5kIHRoZW4gc3VidHJhY3QgYW5vdGhlciA0IHRvIG1ha2UKLQkJIHRoZSBmaXJzdCByZWxvYyBjb21lIG91dCByaWdodC4gIFRoZSBzZWNvbmQgcmVsb2MKLQkJIHdpbGwgY29tZSBvdXQgcmlnaHQgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gYWRkIDQgdG8KLQkJIG9mZnNldF9leHByIHdoZW4gd2UgYnVpbGQgaXRzIGluc3RydWN0aW9uIGJlbG93LgotCi0JCSBJZiB3ZSBoYXZlIGEgc3ltYm9sLCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZQotCQkgdGhlIG9mZnNldCwgYmVjYXVzZSBpdCB3aWxsIHdpbmQgdXAgYmVpbmcgaW5jbHVkZWQKLQkJIHdoZW4gd2UgZ2VuZXJhdGUgdGhlIHJlbG9jLiAgKi8KLQotCSAgICAgIGlmIChvZmZzZXRfZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JCW9mZnNldF9leHByLlhfYWRkX251bWJlciAtPSA4OwotCSAgICAgIGVsc2UKLQkJewotCQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IC00OwotCQkgIG9mZnNldF9leHByLlhfb3AgPSBPX2NvbnN0YW50OwotCQl9Ci0JICAgIH0KLQkgIG1hY3JvX2J1aWxkX2x1aSAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgQVQpOwotCSAgaWYgKHAgIT0gTlVMTCkKLQkgICAgcCArPSA0OwotCSAgaWYgKGJyZWcgIT0gMCkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIEFULCBicmVnLCBBVCk7Ci0JICAgICAgaWYgKHAgIT0gTlVMTCkKLQkJcCArPSA0OwotCSAgICB9Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgKyAxIDogdHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBpZiAocCAhPSBOVUxMKQotCSAgICBwICs9IDQ7Ci0JICAvKiBGSVhNRTogSG93IGRvIHdlIGhhbmRsZSBvdmVyZmxvdyBoZXJlPyAgKi8KLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciArPSA0OwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnIDogdHJlZyArIDEsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCX0JICAKLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDICYmICEgbWlwc19iaWdfZ290KQotCXsKLQkgIGludCBvZmY7Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx3CSRhdCw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICA8b3A+CSR0cmVnLDAoJGF0KQotCSAgICAgICA8b3A+CSR0cmVnKzEsNCgkYXQpCi0JICAgICBPdGhlcndpc2Ugd2Ugd2FudAotCSAgICAgICBsdwkkYXQsPHN5bT4oJGdwKQkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkYXQpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGF0KQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICBJZiB0aGVyZSBpcyBhIGJhc2UgcmVnaXN0ZXIgd2UgYWRkIGl0IHRvICRhdCBiZWZvcmUgdGhlCi0JICAgICBsd2MxIGluc3RydWN0aW9ucy4gIElmIHRoZXJlIGlzIGEgY29uc3RhbnQgd2UgaW5jbHVkZSBpdAotCSAgICAgaW4gdGhlIGx3YzEgaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgIHVzZWRfYXQgPSAxOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPCAtMHg4MDAwCi0JICAgICAgfHwgZXhwcjEuWF9hZGRfbnVtYmVyID49IDB4ODAwMCAtIDQpCi0JICAgIGFzX2JhZCAoXygiUElDIGNvZGUgb2Zmc2V0IG92ZXJmbG93IChtYXggMTYgc2lnbmVkIGJpdHMpIikpOwotCSAgaWYgKGJyZWcgPT0gMCkKLQkgICAgb2ZmID0gMDsKLQkgIGVsc2UKLQkgICAgb2ZmID0gNDsKLQkgIGZyYWdfZ3JvdyAoMjQgKyBvZmYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgICAgICJ0LG8oYikiLCBBVCwgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JICBpZiAoYnJlZyAhPSAwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgImQsdix0IiwgQVQsIGJyZWcsIEFUKTsKLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgZm10LAotCQkgICAgICAgY29wcm9jID8gdHJlZyArIDEgOiB0cmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQkgIGV4cHIxLlhfYWRkX251bWJlciArPSA0OwotCi0JICAvKiBTZXQgbWlwc19vcHRpbWl6ZSB0byAyIHRvIGF2b2lkIGluc2VydGluZyBhbiB1bmRlc2lyZWQKLSAgICAgICAgICAgICBub3AuICAqLwotCSAgaG9sZF9taXBzX29wdGltaXplID0gbWlwc19vcHRpbWl6ZTsKLQkgIG1pcHNfb3B0aW1pemUgPSAyOwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnIDogdHJlZyArIDEsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgbWlwc19vcHRpbWl6ZSA9IGhvbGRfbWlwc19vcHRpbWl6ZTsKLQotCSAgKHZvaWQpIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMCwgMCwKLQkJCSAgIFJFTEFYX0VOQ09ERSAoMCwgMCwgLTE2IC0gb2ZmLCAtOCwgMSwgMCksCi0JCQkgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJICAgKGNoYXIgKikgTlVMTCk7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgaW50IGdwZGVsLCBvZmY7Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx1aQkkYXQsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HT1RfSEkxNikKLQkgICAgICAgYWRkdQkkYXQsJGF0LCRncAotCSAgICAgICBsdwkkYXQsPHN5bT4oJGF0KQkJKEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2KQotCSAgICAgICBub3AKLQkgICAgICAgPG9wPgkkdHJlZywwKCRhdCkKLQkgICAgICAgPG9wPgkkdHJlZysxLDQoJGF0KQotCSAgICAgT3RoZXJ3aXNlIHdlIHdhbnQKLQkgICAgICAgbHcJJGF0LDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGF0KQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICAgIDxvcD4JJHRyZWcrMSw8c3ltPis0KCRhdCkJKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgSWYgdGhlcmUgaXMgYSBiYXNlIHJlZ2lzdGVyIHdlIGFkZCBpdCB0byAkYXQgYmVmb3JlIHRoZQotCSAgICAgbHdjMSBpbnN0cnVjdGlvbnMuICBJZiB0aGVyZSBpcyBhIGNvbnN0YW50IHdlIGluY2x1ZGUgaXQKLQkgICAgIGluIHRoZSBsd2MxIGluc3RydWN0aW9ucy4gICovCi0JICB1c2VkX2F0ID0gMTsKLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IG9mZnNldF9leHByLlhfYWRkX251bWJlcjsKLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IDA7Ci0JICBpZiAoZXhwcjEuWF9hZGRfbnVtYmVyIDwgLTB4ODAwMAotCSAgICAgIHx8IGV4cHIxLlhfYWRkX251bWJlciA+PSAweDgwMDAgLSA0KQotCSAgICBhc19iYWQgKF8oIlBJQyBjb2RlIG9mZnNldCBvdmVyZmxvdyAobWF4IDE2IHNpZ25lZCBiaXRzKSIpKTsKLQkgIGlmIChyZWdfbmVlZHNfZGVsYXkgKEdQKSkKLQkgICAgZ3BkZWwgPSA0OwotCSAgZWxzZQotCSAgICBncGRlbCA9IDA7Ci0JICBpZiAoYnJlZyA9PSAwKQotCSAgICBvZmYgPSAwOwotCSAgZWxzZQotCSAgICBvZmYgPSA0OwotCSAgZnJhZ19ncm93ICg1Nik7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx1aSIsICJ0LHUiLAotCQkgICAgICAgQVQsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAgICAgImQsdix0IiwgQVQsIEFULCBHUCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAgICAgInQsbyhiKSIsIEFULCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwgQVQpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgIGlmIChicmVnICE9IDApCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAiZCx2LHQiLCBBVCwgYnJlZywgQVQpOwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnICsgMSA6IHRyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyICs9IDQ7Ci0KLQkgIC8qIFNldCBtaXBzX29wdGltaXplIHRvIDIgdG8gYXZvaWQgaW5zZXJ0aW5nIGFuIHVuZGVzaXJlZAotICAgICAgICAgICAgIG5vcC4gICovCi0JICBob2xkX21pcHNfb3B0aW1pemUgPSBtaXBzX29wdGltaXplOwotCSAgbWlwc19vcHRpbWl6ZSA9IDI7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgOiB0cmVnICsgMSwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBtaXBzX29wdGltaXplID0gaG9sZF9taXBzX29wdGltaXplOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyIC09IDQ7Ci0KLQkgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDE2ICsgZ3BkZWwgKyBvZmYsIDAsCi0JCQlSRUxBWF9FTkNPREUgKDI0ICsgb2ZmLCAxNiArIGdwZGVsICsgb2ZmLCBncGRlbCwKLQkJCQkgICAgICA4ICsgZ3BkZWwgKyBvZmYsIDEsIDApLAotCQkJb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCShjaGFyICopIE5VTEwpOwotCSAgaWYgKGdwZGVsID4gMCkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JICAgICAgcCArPSA0OwotCSAgICB9Ci0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAgICAgInQsbyhiKSIsIEFULCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgcCArPSA0OwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgIHAgKz0gNDsKLQkgIGlmIChicmVnICE9IDApCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAiZCx2LHQiLCBBVCwgYnJlZywgQVQpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgfQotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnICsgMSA6IHRyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgcCArPSA0OwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyICs9IDQ7Ci0KLQkgIC8qIFNldCBtaXBzX29wdGltaXplIHRvIDIgdG8gYXZvaWQgaW5zZXJ0aW5nIGFuIHVuZGVzaXJlZAotICAgICAgICAgICAgIG5vcC4gICovCi0JICBob2xkX21pcHNfb3B0aW1pemUgPSBtaXBzX29wdGltaXplOwotCSAgbWlwc19vcHRpbWl6ZSA9IDI7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmZXhwcjEsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgOiB0cmVnICsgMSwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBtaXBzX29wdGltaXplID0gaG9sZF9taXBzX29wdGltaXplOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQl7Ci0JICAvKiBJZiB0aGVyZSBpcyBubyBiYXNlIHJlZ2lzdGVyLCB3ZSB1c2UKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGdwKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICBJZiB3ZSBoYXZlIGEgYmFzZSByZWdpc3Rlciwgd2UgdXNlCi0JICAgICAgIGFkZHUJJGF0LCRicmVnLCRncAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRhdCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgICA8b3A+CSR0cmVnKzEsPHN5bT4rNCgkYXQpCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgICovCi0JICBpZiAoYnJlZyA9PSAwKQotCSAgICB7Ci0JICAgICAgdGVtcHJlZyA9IEdQOwotCSAgICAgIHVzZWRfYXQgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAiZCx2LHQiLCBBVCwgYnJlZywgR1ApOwotCSAgICAgIHRlbXByZWcgPSBBVDsKLQkgICAgICB1c2VkX2F0ID0gMTsKLQkgICAgfQotCi0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgKyAxIDogdHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCB0ZW1wcmVnKTsKLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciArPSA0OwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnIDogdHJlZyArIDEsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCwgdGVtcHJlZyk7Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotCi0gICAgICBpZiAoISB1c2VkX2F0KQotCXJldHVybjsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fTERfT0I6Ci0gICAgICBzID0gImx3IjsKLSAgICAgIGdvdG8gc2Rfb2I7Ci0gICAgY2FzZSBNX1NEX09COgotICAgICAgcyA9ICJzdyI7Ci0gICAgc2Rfb2I6Ci0gICAgICBhc3NlcnQgKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIgfHwgbWlwc19vcHRzLmlzYSA8IDMpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gNDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCAidCxvKGIpIiwgdHJlZyArIDEsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgLyogTmV3IGNvZGUgYWRkZWQgdG8gc3VwcG9ydCBDT1BaIGluc3RydWN0aW9ucy4KLSAgICAgIFRoaXMgY29kZSBidWlsZHMgdGFibGUgZW50cmllcyBvdXQgb2YgdGhlIG1hY3JvcyBpbiBtaXBfb3Bjb2Rlcy4KLSAgICAgIFI0MDAwIHVzZXMgaW50ZXJsb2NrcyB0byBoYW5kbGUgY29wcm9jIGRlbGF5cy4KLSAgICAgIE90aGVyIGNoaXBzIChsaWtlIHRoZSBSMzAwMCkgcmVxdWlyZSBub3BzIHRvIGJlIGluc2VydGVkIGZvciBkZWxheXMuCi0KLSAgICAgIEZJWE1FOiBDdXJyZW50bHksIHdlIHJlcXVpcmUgdGhhdCB0aGUgdXNlciBoYW5kbGUgZGVsYXlzLgotICAgICAgSW4gb3JkZXIgdG8gZmlsbCBkZWxheSBzbG90cyBmb3Igbm9uLWludGVybG9ja2VkIGNoaXBzLAotICAgICAgd2UgbXVzdCBoYXZlIGEgd2F5IHRvIHNwZWNpZnkgZGVsYXlzIGJhc2VkIG9uIHRoZSBjb3Byb2Nlc3Nvci4KLSAgICAgIEVnLiA0IGN5Y2xlcyBpZiBsb2FkIGNvcHJvYyByZWcgZnJvbSBtZW1vcnksIDEgaWYgaW4gY2FjaGUsIGV0Yy4KLSAgICAgIFdoYXQgYXJlIHRoZSBzaWRlLWVmZmVjdHMgb2YgdGhlIGNvcCBpbnN0cnVjdGlvbj8KLSAgICAgIFdoYXQgY2FjaGUgc3VwcG9ydCBtaWdodCB3ZSBoYXZlIGFuZCB3aGF0IGFyZSBpdHMgZWZmZWN0cz8KLSAgICAgIEJvdGggY29wcm9jZXNzb3IgJiBtZW1vcnkgcmVxdWlyZSBkZWxheXMuIGhvdyBsb25nPz8/Ci0gICAgICBXaGF0IHJlZ2lzdGVycyBhcmUgcmVhZC9zZXQvbW9kaWZpZWQ/IAotCi0gICAgICBJZiBhbiBpdGJsIGlzIHByb3ZpZGVkIHRvIGludGVycHJldCBjb3AgaW5zdHJ1Y3Rpb25zLAotICAgICAgdGhpcyBrbm93bGVkZ2UgY2FuIGJlIGVuY29kZWQgaW4gdGhlIGl0Ymwgc3BlYy4gKi8KLQotICAgIGNhc2UgTV9DT1AwOgotICAgICAgcyA9ICJjMCI7Ci0gICAgICBnb3RvIGNvcHo7Ci0gICAgY2FzZSBNX0NPUDE6Ci0gICAgICBzID0gImMxIjsKLSAgICAgIGdvdG8gY29wejsKLSAgICBjYXNlIE1fQ09QMjoKLSAgICAgIHMgPSAiYzIiOwotICAgICAgZ290byBjb3B6OwotICAgIGNhc2UgTV9DT1AzOgotICAgICAgcyA9ICJjMyI7Ci0gICAgY29wejoKLSAgICAgIC8qIEZvciBub3cgd2UganVzdCBkbyBDIChzYW1lIGFzIEN6KS4gIFRoZSBwYXJhbWV0ZXIgd2lsbCBiZQotICAgICAgICAgc3RvcmVkIGluIGluc25fb3Bjb2RlIGJ5IG1pcHNfaXAuICAqLwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgcywgIkMiLAotCQkgICBpcC0+aW5zbl9vcGNvZGUpOwotICAgICAgcmV0dXJuOwotCi0jaWZkZWYgTE9TSU5HX0NPTVBJTEVSCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFRyeSBhbmQgc2VlIGlmIHRoaXMgaXMgYSBuZXcgaXRibCBpbnN0cnVjdGlvbi4KLSAgICAgICAgIFRoaXMgY29kZSBidWlsZHMgdGFibGUgZW50cmllcyBvdXQgb2YgdGhlIG1hY3JvcyBpbiBtaXBfb3Bjb2Rlcy4KLSAgICAgICAgIEZJWE1FOiBGb3Igbm93IHdlIGp1c3QgYXNzZW1ibGUgdGhlIGV4cHJlc3Npb24gYW5kIHBhc3MgaXQncwotICAgICAgICAgdmFsdWUgYWxvbmcgYXMgYSAzMi1iaXQgaW1tZWRpYXRlLgotICAgICAgICAgV2UgbWF5IHdhbnQgdG8gaGF2ZSB0aGUgYXNzZW1ibGVyIGFzc2VtYmxlIHRoaXMgdmFsdWUsIAotICAgICAgICAgc28gdGhhdCB3ZSBnYWluIHRoZSBhc3NlbWJsZXIncyBrbm93bGVkZ2Ugb2YgZGVsYXkgc2xvdHMsCi0gICAgICAgICBzeW1ib2xzLCBldGMuCi0gICAgICAgICBXb3VsZCBpdCBiZSBtb3JlIGVmZmljaWVudCB0byB1c2UgbWFzayAoaWQpIGhlcmU/ICovCi0gICAgICBpZiAoaXRibF9oYXZlX2VudHJpZXMgCi0JICAmJiAoaW1tZWRfZXhwciA9IGl0YmxfYXNzZW1ibGUgKGlwLT5pbnNuX21vLT5uYW1lLCAiIikpKQotICAgICAgICB7Ci0JICBzID0gaXAtPmluc25fbW8tPm5hbWU7Ci0JICBzMiA9ICJjb3AzIjsKLQkgIGNvcHJvYyA9IElUQkxfREVDT0RFX1BOVU0gKGltbWVkX2V4cHIpOzsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbWVkX2V4cHIsIHMsICJDIik7Ci0JICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIG1hY3JvMiAoaXApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG1pcHNfb3B0cy5ub2F0KQotICAgIGFzX3dhcm4gKF8oIk1hY3JvIHVzZWQgJGF0IGFmdGVyIFwiLnNldCBub2F0XCIiKSk7Ci19Ci0gICAgICAgICAgCi1zdGF0aWMgdm9pZAotbWFjcm8yIChpcCkKLSAgICAgc3RydWN0IG1pcHNfY2xfaW5zbiAqaXA7Ci17Ci0gIHJlZ2lzdGVyIGludCB0cmVnLCBzcmVnLCBkcmVnLCBicmVnOwotICBpbnQgdGVtcHJlZzsKLSAgaW50IG1hc2s7Ci0gIGludCBpY250ID0gMDsKLSAgaW50IHVzZWRfYXQ7Ci0gIGV4cHJlc3Npb25TIGV4cHIxOwotICBjb25zdCBjaGFyICpzOwotICBjb25zdCBjaGFyICpzMjsKLSAgY29uc3QgY2hhciAqZm10OwotICBpbnQgbGlrZWx5ID0gMDsKLSAgaW50IGRibCA9IDA7Ci0gIGludCBjb3Byb2MgPSAwOwotICBpbnQgbHIgPSAwOwotICBpbnQgaW1tID0gMDsKLSAgaW50IG9mZjsKLSAgb2Zmc2V0VCBtYXhudW07Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOwotICBjaGFyICpwOwotICAgICAgICAgIAotICB0cmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAxNikgJiAweDFmOwotICBkcmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAxMSkgJiAweDFmOwotICBzcmVnID0gYnJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMjEpICYgMHgxZjsKLSAgbWFzayA9IGlwLT5pbnNuX21vLT5tYXNrOwotICAgICAgICAgIAotICBleHByMS5YX29wID0gT19jb25zdGFudDsKLSAgZXhwcjEuWF9vcF9zeW1ib2wgPSBOVUxMOwotICBleHByMS5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICBleHByMS5YX2FkZF9udW1iZXIgPSAxOwotICAgICAgICAgIAotICBzd2l0Y2ggKG1hc2spCi0gICAgewotI2VuZGlmIC8qIExPU0lOR19DT01QSUxFUiAqLwotCi0gICAgY2FzZSBNX0RNVUw6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUw6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkbXVsdHUiIDogIm11bHR1IiwKLQkJICAgInMsdCIsIHNyZWcsIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZsbyIsICJkIiwgZHJlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fRE1VTF9JOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fTVVMX0k6Ci0gICAgICAvKiBUaGUgTUlQUyBhc3NlbWJsZXIgc29tZSB0aW1lcyBnZW5lcmF0ZXMgc2hpZnRzIGFuZCBhZGRzLiAgSSdtCi0JIG5vdCB0cnlpbmcgdG8gYmUgdGhhdCBmYW5jeS4gR0NDIHNob3VsZCBkbyB0aGlzIGZvciB1cwotCSBhbnl3YXkuICAqLwotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkbXVsdCIgOiAibXVsdCIsCi0JCSAgICJzLHQiLCBzcmVnLCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmxvIiwgImQiLCBkcmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RNVUxPX0k6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUxPX0k6Ci0gICAgICBpbW0gPSAxOwotICAgICAgZ290byBkb19tdWxvOwotCi0gICAgY2FzZSBNX0RNVUxPOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fTVVMTzoKLSAgICBkb19tdWxvOgotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotICAgICAgaWYgKGltbSkKLQlsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRtdWx0IiA6ICJtdWx0IiwKLQkJICAgInMsdCIsIHNyZWcsIGltbSA/IEFUIDogdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmxvIiwgImQiLCBkcmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRzcmEzMiIgOiAic3JhIiwKLQkJICAgImQsdyw8IiwgZHJlZywgZHJlZywgMzEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZoaSIsICJkIiwgQVQpOwotICAgICAgaWYgKG1pcHNfdHJhcCkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0bmUiLCAicyx0IiwgZHJlZywgQVQpOwotICAgICAgZWxzZQotCXsKLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IDg7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJlcSIsICJzLHQscCIsIGRyZWcsIEFUKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiLCAwKTsKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDYpOwotCX0KLSAgICAgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1mbG8iLCAiZCIsIGRyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRE1VTE9VX0k6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUxPVV9JOgotICAgICAgaW1tID0gMTsKLSAgICAgIGdvdG8gZG9fbXVsb3U7Ci0KLSAgICBjYXNlIE1fRE1VTE9VOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fTVVMT1U6Ci0gICAgZG9fbXVsb3U6Ci0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgICBpZiAoaW1tKQotCWxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCBkYmwpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICBkYmwgPyAiZG11bHR1IiA6ICJtdWx0dSIsCi0JCSAgICJzLHQiLCBzcmVnLCBpbW0gPyBBVCA6IHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZoaSIsICJkIiwgQVQpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZsbyIsICJkIiwgZHJlZyk7Ci0gICAgICBpZiAobWlwc190cmFwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInRuZSIsICJzLHQiLCBBVCwgMCk7Ci0gICAgICBlbHNlCi0JewotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gODsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYmVxIiwgInMsdCxwIiwgQVQsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIsIDApOwotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICJjIiwgNik7Ci0JfQotICAgICAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fUk9MOgotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic3VidSIsICJkLHYsdCIsIEFULCAwLCB0cmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNybHYiLCAiZCx0LHMiLCBBVCwgc3JlZywgQVQpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsdiIsICJkLHQscyIsIGRyZWcsIHNyZWcsCi0JCSAgIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAib3IiLCAiZCx2LHQiLCBkcmVnLCBkcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ST0xfSToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJyb3RhdGUgY291bnQgdG9vIGxhcmdlIikpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsIiwgImQsdyw8IiwgQVQsIHNyZWcsCi0JCSAgIChpbnQpIChpbW1fZXhwci5YX2FkZF9udW1iZXIgJiAweDFmKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzcmwiLCAiZCx3LDwiLCBkcmVnLCBzcmVnLAotCQkgICAoaW50KSAoKDAgLSBpbW1fZXhwci5YX2FkZF9udW1iZXIpICYgMHgxZikpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAib3IiLCAiZCx2LHQiLCBkcmVnLCBkcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ST1I6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzdWJ1IiwgImQsdix0IiwgQVQsIDAsIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsdiIsICJkLHQscyIsIEFULCBzcmVnLCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzcmx2IiwgImQsdCxzIiwgZHJlZywgc3JlZywKLQkJICAgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJvciIsICJkLHYsdCIsIGRyZWcsIGRyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1JPUl9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oInJvdGF0ZSBjb3VudCB0b28gbGFyZ2UiKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzcmwiLCAiZCx3LDwiLCBBVCwgc3JlZywKLQkJICAgKGludCkgKGltbV9leHByLlhfYWRkX251bWJlciAmIDB4MWYpKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsbCIsICJkLHcsPCIsIGRyZWcsIHNyZWcsCi0JCSAgIChpbnQpICgoMCAtIGltbV9leHByLlhfYWRkX251bWJlcikgJiAweDFmKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJvciIsICJkLHYsdCIsIGRyZWcsIGRyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NfRE9COgotICAgICAgaWYgKG1pcHNfY3B1ID09IDQ2NTApCi0JewotCSAgYXNfYmFkIChfKCJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBhc3NlcnQgKG1pcHNfb3B0cy5pc2EgPCAyKTsKLSAgICAgIC8qIEV2ZW4gb24gYSBiaWcgZW5kaWFuIG1hY2hpbmUgJGZuIGNvbWVzIGJlZm9yZSAkZm4rMS4gIFdlIGhhdmUKLQkgdG8gYWRqdXN0IHdoZW4gc3RvcmluZyB0byBtZW1vcnkuICAqLwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJzd2MxIiwgIlQsbyhiKSIsCi0JCSAgIHRhcmdldF9iaWdfZW5kaWFuID8gdHJlZyArIDEgOiB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gNDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAic3djMSIsICJULG8oYikiLAotCQkgICB0YXJnZXRfYmlnX2VuZGlhbiA/IHRyZWcgOiB0cmVnICsgMSwKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NFUToKLSAgICAgIGlmIChzcmVnID09IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzbHRpdSIsICJ0LHIsaiIsIGRyZWcsCi0JCSAgICAgdHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgZWxzZSBpZiAodHJlZyA9PSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2x0aXUiLCAidCxyLGoiLCBkcmVnLAotCQkgICAgIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ4b3IiLCAiZCx2LHQiLCBkcmVnLAotCQkgICAgICAgc3JlZywgdHJlZyk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInNsdGl1IiwgInQscixqIiwgZHJlZywKLQkJICAgICAgIGRyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQl9Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fU0VRX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2x0aXUiLCAidCxyLGoiLCBkcmVnLAotCQkgICAgICAgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChzcmVnID09IDApCi0JewotCSAgYXNfd2FybiAoXygiSW5zdHJ1Y3Rpb24gJXM6IHJlc3VsdCBpcyBhbHdheXMgZmFsc2UiKSwKLQkJICAgaXAtPmluc25fbW8tPm5hbWUpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibW92ZSIsICJkLHMiLCBkcmVnLCAwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHgxMDAwMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgInhvcmkiLCAidCxyLGkiLCBkcmVnLAotCQkgICAgICAgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgdXNlZF9hdCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+IC0weDgwMDAKLQkgICAgICAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMCkKLQl7Ci0JICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAtaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCBkcmVnLCBzcmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgdXNlZF9hdCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInhvciIsICJkLHYsdCIsIGRyZWcsCi0JCSAgICAgICBzcmVnLCBBVCk7Ci0JICB1c2VkX2F0ID0gMTsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInNsdGl1IiwgInQscixqIiwgZHJlZywgZHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgaWYgKHVzZWRfYXQpCi0JYnJlYWs7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fU0dFOgkJLyogc3JlZyA+PSB0cmVnIDw9PT4gbm90IChzcmVnIDwgdHJlZykgKi8KLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIGdvdG8gc2dlOwotICAgIGNhc2UgTV9TR0VVOgotICAgICAgcyA9ICJzbHR1IjsKLSAgICBzZ2U6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJkLHYsdCIsIGRyZWcsIHNyZWcsIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJ4b3JpIiwgInQscixpIiwgZHJlZywgZHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NHRV9JOgkJLyogc3JlZyA+PSBJIDw9PT4gbm90IChzcmVnIDwgSSkgKi8KLSAgICBjYXNlIE1fU0dFVV9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IC0weDgwMDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4ODAwMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwKLQkJICAgICAgIG1hc2sgPT0gTV9TR0VfSSA/ICJzbHRpIiA6ICJzbHRpdSIsCi0JCSAgICAgICAidCxyLGoiLCBkcmVnLCBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICB1c2VkX2F0ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICAgICAgbWFzayA9PSBNX1NHRV9JID8gInNsdCIgOiAic2x0dSIsCi0JCSAgICAgICAiZCx2LHQiLCBkcmVnLCBzcmVnLCBBVCk7Ci0JICB1c2VkX2F0ID0gMTsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInhvcmkiLCAidCxyLGkiLCBkcmVnLCBkcmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBpZiAodXNlZF9hdCkKLQlicmVhazsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9TR1Q6CQkvKiBzcmVnID4gdHJlZyAgPD09PiAgdHJlZyA8IHNyZWcgKi8KLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIGdvdG8gc2d0OwotICAgIGNhc2UgTV9TR1RVOgotICAgICAgcyA9ICJzbHR1IjsKLSAgICBzZ3Q6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJkLHYsdCIsIGRyZWcsIHRyZWcsIHNyZWcpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NHVF9JOgkJLyogc3JlZyA+IEkgIDw9PT4gIEkgPCBzcmVnICovCi0gICAgICBzID0gInNsdCI7Ci0gICAgICBnb3RvIHNndGk7Ci0gICAgY2FzZSBNX1NHVFVfSToKLSAgICAgIHMgPSAic2x0dSI7Ci0gICAgc2d0aToKLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgImQsdix0IiwgZHJlZywgQVQsIHNyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU0xFOgkJLyogc3JlZyA8PSB0cmVnICA8PT0+ICB0cmVnID49IHNyZWcgIDw9PT4gIG5vdCAodHJlZyA8IHNyZWcpICovCi0gICAgICBzID0gInNsdCI7Ci0gICAgICBnb3RvIHNsZTsKLSAgICBjYXNlIE1fU0xFVToKLSAgICAgIHMgPSAic2x0dSI7Ci0gICAgc2xlOgotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiZCx2LHQiLCBkcmVnLCB0cmVnLCBzcmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAieG9yaSIsICJ0LHIsaSIsIGRyZWcsIGRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9TTEVfSToJCS8qIHNyZWcgPD0gSSA8PT0+IEkgPj0gc3JlZyA8PT0+IG5vdCAoSSA8IHNyZWcpICovCi0gICAgICBzID0gInNsdCI7Ci0gICAgICBnb3RvIHNsZWk7Ci0gICAgY2FzZSBNX1NMRVVfSToKLSAgICAgIHMgPSAic2x0dSI7Ci0gICAgc2xlaToKLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgImQsdix0IiwgZHJlZywgQVQsIHNyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJ4b3JpIiwgInQscixpIiwgZHJlZywgZHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU0xUX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCAic2x0aSIsICJ0LHIsaiIsCi0JCSAgICAgICBkcmVnLCBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0IiwgImQsdix0IiwgZHJlZywgc3JlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU0xUVV9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IC0weDgwMDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4ODAwMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgInNsdGl1IiwgInQscixqIiwKLQkJICAgICAgIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgZHJlZywgc3JlZywKLQkJICAgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU05FOgotICAgICAgaWYgKHNyZWcgPT0gMCkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgZHJlZywgMCwKLQkJICAgICB0cmVnKTsKLSAgICAgIGVsc2UgaWYgKHRyZWcgPT0gMCkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgZHJlZywgMCwKLQkJICAgICBzcmVnKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ4b3IiLCAiZCx2LHQiLCBkcmVnLAotCQkgICAgICAgc3JlZywgdHJlZyk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgZHJlZywgMCwKLQkJICAgICAgIGRyZWcpOwotCX0KLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9TTkVfSToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIGRyZWcsIDAsCi0JCSAgICAgICBzcmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCXsKLQkgIGFzX3dhcm4gKF8oIkluc3RydWN0aW9uICVzOiByZXN1bHQgaXMgYWx3YXlzIHRydWUiKSwKLQkJICAgaXAtPmluc25fbW8tPm5hbWUpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCBkcmVnLCAwLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4MTAwMDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJ4b3JpIiwgInQscixpIiwKLQkJICAgICAgIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHVzZWRfYXQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAtMHg4MDAwCi0JICAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDApCi0JewotCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCSAgICAgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgZHJlZywgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgdXNlZF9hdCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInhvciIsICJkLHYsdCIsIGRyZWcsCi0JCSAgICAgICBzcmVnLCBBVCk7Ci0JICB1c2VkX2F0ID0gMTsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgZHJlZywgMCwgZHJlZyk7Ci0gICAgICBpZiAodXNlZF9hdCkKLQlicmVhazsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9EU1VCX0k6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9TVUJfSToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+IC0weDgwMDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8PSAweDgwMDApCi0JewotCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAotCQkgICAgICAgZGJsID8gImRhZGRpIiA6ICJhZGRpIiwKLQkJICAgICAgICJ0LHIsaiIsIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRzdWIiIDogInN1YiIsCi0JCSAgICJkLHYsdCIsIGRyZWcsIHNyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RTVUJVX0k6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9TVUJVX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAtMHg4MDAwCi0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPD0gMHg4MDAwKQotCXsKLQkgIGltbV9leHByLlhfYWRkX251bWJlciA9IC1pbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwKLQkJICAgICAgIGRibCA/ICJkYWRkaXUiIDogImFkZGl1IiwKLQkJICAgICAgICJ0LHIsaiIsIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRzdWJ1IiA6ICJzdWJ1IiwKLQkJICAgImQsdix0IiwgZHJlZywgc3JlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fVEVRX0k6Ci0gICAgICBzID0gInRlcSI7Ci0gICAgICBnb3RvIHRyYXA7Ci0gICAgY2FzZSBNX1RHRV9JOgotICAgICAgcyA9ICJ0Z2UiOwotICAgICAgZ290byB0cmFwOwotICAgIGNhc2UgTV9UR0VVX0k6Ci0gICAgICBzID0gInRnZXUiOwotICAgICAgZ290byB0cmFwOwotICAgIGNhc2UgTV9UTFRfSToKLSAgICAgIHMgPSAidGx0IjsKLSAgICAgIGdvdG8gdHJhcDsKLSAgICBjYXNlIE1fVExUVV9JOgotICAgICAgcyA9ICJ0bHR1IjsKLSAgICAgIGdvdG8gdHJhcDsKLSAgICBjYXNlIE1fVE5FX0k6Ci0gICAgICBzID0gInRuZSI7Ci0gICAgdHJhcDoKLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgInMsdCIsIHNyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1RSVU5DV0Q6Ci0gICAgY2FzZSBNX1RSVU5DV1M6Ci0gICAgICBhc3NlcnQgKG1pcHNfb3B0cy5pc2EgPCAyKTsKLSAgICAgIHNyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IDExKSAmIDB4MWY7CS8qIGZsb2F0aW5nIHJlZyAqLwotICAgICAgZHJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMDYpICYgMHgxZjsJLyogZmxvYXRpbmcgcmVnICovCi0KLSAgICAgIC8qCi0gICAgICAgKiBJcyB0aGUgZG91YmxlIGNmYzEgaW5zdHJ1Y3Rpb24gYSBidWcgaW4gdGhlIG1pcHMgYXNzZW1ibGVyOwotICAgICAgICogb3IgaXMgdGhlcmUgYSByZWFzb24gZm9yIGl0PwotICAgICAgICovCi0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJjZmMxIiwgInQsRyIsIHRyZWcsIDMxKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImNmYzEiLCAidCxHIiwgdHJlZywgMzEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIpOwotICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMzsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAib3JpIiwgInQscixpIiwgQVQsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInhvcmkiLCAidCxyLGkiLCBBVCwgQVQsCi0JCSAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiY3RjMSIsICJ0LEciLCBBVCwgMzEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCSAgICAgIG1hc2sgPT0gTV9UUlVOQ1dEID8gImN2dC53LmQiIDogImN2dC53LnMiLCAiRCxTIiwgZHJlZywgc3JlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJjdGMxIiwgInQsRyIsIHRyZWcsIDMxKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiKTsKLSAgICAgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1VMSDoKLSAgICAgIHMgPSAibGIiOwotICAgICAgZ290byB1bGg7Ci0gICAgY2FzZSBNX1VMSFU6Ci0gICAgICBzID0gImxidSI7Ci0gICAgdWxoOgotICAgICAgaWYgKG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSAweDdmZmYpCi0JYXNfYmFkIChfKCJvcGVyYW5kIG92ZXJmbG93IikpOwotICAgICAgLyogYXZvaWQgbG9hZCBkZWxheSAqLwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDE7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciAtPSAxOwotICAgICAgZWxzZQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSAxOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsYnUiLCAidCxvKGIpIiwgQVQsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsbCIsICJkLHcsPCIsIHRyZWcsIHRyZWcsIDgpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAib3IiLCAiZCx2LHQiLCB0cmVnLCB0cmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9VTEQ6Ci0gICAgICBzID0gImxkbCI7Ci0gICAgICBzMiA9ICJsZHIiOwotICAgICAgb2ZmID0gNzsKLSAgICAgIGdvdG8gdWx3OwotICAgIGNhc2UgTV9VTFc6Ci0gICAgICBzID0gImx3bCI7Ci0gICAgICBzMiA9ICJsd3IiOwotICAgICAgb2ZmID0gMzsKLSAgICB1bHc6Ci0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IDB4ODAwMCAtIG9mZikKLQlhc19iYWQgKF8oIm9wZXJhbmQgb3ZlcmZsb3ciKSk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gb2ZmOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgLT0gb2ZmOwotICAgICAgZWxzZQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSBvZmY7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgczIsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fVUxEX0E6Ci0gICAgICBzID0gImxkbCI7Ci0gICAgICBzMiA9ICJsZHIiOwotICAgICAgb2ZmID0gNzsKLSAgICAgIGdvdG8gdWx3YTsKLSAgICBjYXNlIE1fVUxXX0E6Ci0gICAgICBzID0gImx3bCI7Ci0gICAgICBzMiA9ICJsd3IiOwotICAgICAgb2ZmID0gMzsKLSAgICB1bHdhOgotICAgICAgbG9hZF9hZGRyZXNzICgmaWNudCwgQVQsICZvZmZzZXRfZXhwcik7Ci0gICAgICBpZiAoYnJlZyAhPSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgICAiZCx2LHQiLCBBVCwgQVQsIGJyZWcpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gb2ZmOwotICAgICAgZWxzZQotCWV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgZWxzZQotCWV4cHIxLlhfYWRkX251bWJlciA9IG9mZjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzMiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9VTEhfQToKLSAgICBjYXNlIE1fVUxIVV9BOgotICAgICAgbG9hZF9hZGRyZXNzICgmaWNudCwgQVQsICZvZmZzZXRfZXhwcik7Ci0gICAgICBpZiAoYnJlZyAhPSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgICAiZCx2LHQiLCBBVCwgQVQsIGJyZWcpOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJICAgbWFzayA9PSBNX1VMSF9BID8gImxiIiA6ICJsYnUiLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSAxOwotICAgICAgZWxzZQotCWV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImxidSIsICJ0LG8oYikiLCBBVCwKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsbCIsICJkLHcsPCIsIHRyZWcsCi0JCSAgIHRyZWcsIDgpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAib3IiLCAiZCx2LHQiLCB0cmVnLAotCQkgICB0cmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9VU0g6Ci0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IDB4N2ZmZikKLQlhc19iYWQgKF8oIm9wZXJhbmQgb3ZlcmZsb3ciKSk7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDE7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgInNiIiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNybCIsICJkLHcsPCIsIEFULCB0cmVnLCA4KTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgLT0gMTsKLSAgICAgIGVsc2UKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAic2IiLCAidCxvKGIpIiwgQVQsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1VTRDoKLSAgICAgIHMgPSAic2RsIjsKLSAgICAgIHMyID0gInNkciI7Ci0gICAgICBvZmYgPSA3OwotICAgICAgZ290byB1c3c7Ci0gICAgY2FzZSBNX1VTVzoKLSAgICAgIHMgPSAic3dsIjsKLSAgICAgIHMyID0gInN3ciI7Ci0gICAgICBvZmYgPSAzOwotICAgIHVzdzoKLSAgICAgIGlmIChvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gMHg4MDAwIC0gb2ZmKQotCWFzX2JhZCAoXygib3BlcmFuZCBvdmVyZmxvdyIpKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSBvZmY7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciAtPSBvZmY7Ci0gICAgICBlbHNlCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IG9mZjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzMiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9VU0RfQToKLSAgICAgIHMgPSAic2RsIjsKLSAgICAgIHMyID0gInNkciI7Ci0gICAgICBvZmYgPSA3OwotICAgICAgZ290byB1c3dhOwotICAgIGNhc2UgTV9VU1dfQToKLSAgICAgIHMgPSAic3dsIjsKLSAgICAgIHMyID0gInN3ciI7Ci0gICAgICBvZmYgPSAzOwotICAgIHVzd2E6Ci0gICAgICBsb2FkX2FkZHJlc3MgKCZpY250LCBBVCwgJm9mZnNldF9leHByKTsKLSAgICAgIGlmIChicmVnICE9IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAgICJkLHYsdCIsIEFULCBBVCwgYnJlZyk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSBvZmY7Ci0gICAgICBlbHNlCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCWV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBlbHNlCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gb2ZmOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMyLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1VTSF9BOgotICAgICAgbG9hZF9hZGRyZXNzICgmaWNudCwgQVQsICZvZmZzZXRfZXhwcik7Ci0gICAgICBpZiAoYnJlZyAhPSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgICAiZCx2LHQiLCBBVCwgQVQsIGJyZWcpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2IiLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNybCIsICJkLHcsPCIsIHRyZWcsCi0JCSAgIHRyZWcsIDgpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMTsKLSAgICAgIGVsc2UKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzYiIsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIGVsc2UKLQlleHByMS5YX2FkZF9udW1iZXIgPSAxOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJsYnUiLCAidCxvKGIpIiwgQVQsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbGwiLCAiZCx3LDwiLCB0cmVnLAotCQkgICB0cmVnLCA4KTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm9yIiwgImQsdix0IiwgdHJlZywKLQkJICAgdHJlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogRklYTUU6IENoZWNrIGlmIHRoaXMgaXMgb25lIG9mIHRoZSBpdGJsIG1hY3Jvcywgc2luY2UgdGhleQotCSBhcmUgYWRkZWQgZHluYW1pY2FsbHkuICovCi0gICAgICBhc19iYWQgKF8oIk1hY3JvICVzIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKSwgaXAtPmluc25fbW8tPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBpZiAobWlwc19vcHRzLm5vYXQpCi0gICAgYXNfd2FybiAoXygiTWFjcm8gdXNlZCAkYXQgYWZ0ZXIgXCIuc2V0IG5vYXRcIiIpKTsKLX0KLQotLyogSW1wbGVtZW50IG1hY3JvcyBpbiBtaXBzMTYgbW9kZS4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzMTZfbWFjcm8gKGlwKQotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLXsKLSAgaW50IG1hc2s7Ci0gIGludCB4cmVnLCB5cmVnLCB6cmVnLCB0bXA7Ci0gIGludCBpY250OwotICBleHByZXNzaW9uUyBleHByMTsKLSAgaW50IGRibDsKLSAgY29uc3QgY2hhciAqcywgKnMyLCAqczM7Ci0KLSAgbWFzayA9IGlwLT5pbnNuX21vLT5tYXNrOwotCi0gIHhyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JYKSAmIE1JUFMxNk9QX01BU0tfUlg7Ci0gIHlyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JZKSAmIE1JUFMxNk9QX01BU0tfUlk7Ci0gIHpyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JaKSAmIE1JUFMxNk9QX01BU0tfUlo7Ci0KLSAgaWNudCA9IDA7Ci0KLSAgZXhwcjEuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGV4cHIxLlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgZXhwcjEuWF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMTsKLQotICBkYmwgPSAwOwotCi0gIHN3aXRjaCAobWFzaykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGludGVybmFsRXJyb3IgKCk7Ci0KLSAgICBjYXNlIE1fRERJVl8zOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fRElWXzM6Ci0gICAgICBzID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXYzOwotICAgIGNhc2UgTV9EUkVNXzM6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9SRU1fMzoKLSAgICAgIHMgPSAibWZoaSI7Ci0gICAgZG9fZGl2MzoKLSAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotICAgICAgKyttaXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRkaXYiIDogImRpdiIsCi0JCSAgICIwLHgseSIsIHhyZWcsIHlyZWcpOwotICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYm5leiIsICJ4LHAiLCB5cmVnKTsKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICI2IiwgNyk7Ci0gICAgICAKLSAgICAgIC8qIEZJWE1FOiBUaGUgbm9ybWFsIGNvZGUgY2hlY2tzIGZvciBvZiAtMSAvIC0weDgwMDAwMDAwIGhlcmUsCi0gICAgICAgICBzaW5jZSB0aGF0IGNhdXNlcyBhbiBvdmVyZmxvdy4gIFdlIHNob3VsZCBkbyB0aGF0IGFzIHdlbGwsCi0gICAgICAgICBidXQgSSBkb24ndCBzZWUgaG93IHRvIGRvIHRoZSBjb21wYXJpc29ucyB3aXRob3V0IGEgdGVtcG9yYXJ5Ci0gICAgICAgICByZWdpc3Rlci4gICovCi0gICAgICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJ4IiwgenJlZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ESVZVXzM6Ci0gICAgICBzID0gImRpdnUiOwotICAgICAgczIgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2RpdnUzOwotICAgIGNhc2UgTV9SRU1VXzM6Ci0gICAgICBzID0gImRpdnUiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgICBnb3RvIGRvX2RpdnUzOwotICAgIGNhc2UgTV9ERElWVV8zOgotICAgICAgcyA9ICJkZGl2dSI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2dTM7Ci0gICAgY2FzZSBNX0RSRU1VXzM6Ci0gICAgICBzID0gImRkaXZ1IjsKLSAgICAgIHMyID0gIm1maGkiOwotICAgIGRvX2RpdnUzOgotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiMCx4LHkiLCB4cmVnLCB5cmVnKTsKLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJuZXoiLCAieCxwIiwgeXJlZyk7Ci0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiNiIsIDcpOwotICAgICAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzMiwgIngiLCB6cmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RNVUw6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUw6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkbXVsdHUiIDogIm11bHR1IiwKLQkJICAgIngseSIsIHhyZWcsIHlyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZsbyIsICJ4IiwgenJlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fRFNVQlVfSToKLSAgICAgIGRibCA9IDE7Ci0gICAgICBnb3RvIGRvX3N1YnU7Ci0gICAgY2FzZSBNX1NVQlVfSToKLSAgICBkb19zdWJ1OgotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAotCQkgICBkYmwgPyAiZGFkZGl1IiA6ICJhZGRpdSIsCi0JCSAgICJ5LHgsNCIsIHlyZWcsIHhyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU1VCVV9JXzI6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7Ci0gICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAtaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJhZGRpdSIsCi0JCSAgICJ4LGsiLCB4cmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RTVUJVX0lfMjoKLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKLSAgICAgIGltbV9leHByLlhfYWRkX251bWJlciA9IC1pbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgImRhZGRpdSIsCi0JCSAgICJ5LGoiLCB5cmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JFUToKLSAgICAgIHMgPSAiY21wIjsKLSAgICAgIHMyID0gImJ0ZXF6IjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoOwotICAgIGNhc2UgTV9CTkU6Ci0gICAgICBzID0gImNtcCI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaDsKLSAgICBjYXNlIE1fQkxUOgotICAgICAgcyA9ICJzbHQiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JMVFU6Ci0gICAgICBzID0gInNsdHUiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JMRToKLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIHMyID0gImJ0ZXF6IjsKLSAgICAgIGdvdG8gZG9fcmV2ZXJzZV9icmFuY2g7Ci0gICAgY2FzZSBNX0JMRVU6Ci0gICAgICBzID0gInNsdHUiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgZ290byBkb19yZXZlcnNlX2JyYW5jaDsKLSAgICBjYXNlIE1fQkdFOgotICAgICAgcyA9ICJzbHQiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JHRVU6Ci0gICAgICBzID0gInNsdHUiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JHVDoKLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIGdvdG8gZG9fcmV2ZXJzZV9icmFuY2g7Ci0gICAgY2FzZSBNX0JHVFU6Ci0gICAgICBzID0gInNsdHUiOwotICAgICAgczIgPSAiYnRuZXoiOwotCi0gICAgZG9fcmV2ZXJzZV9icmFuY2g6Ci0gICAgICB0bXAgPSB4cmVnOwotICAgICAgeHJlZyA9IHlyZWc7Ci0gICAgICB5cmVnID0gdG1wOwotCi0gICAgZG9fYnJhbmNoOgotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgcywgIngseSIsCi0JCSAgIHhyZWcsIHlyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMyLCAicCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkVRX0k6Ci0gICAgICBzID0gImNtcGkiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgczMgPSAieCxVIjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoX2k7Ci0gICAgY2FzZSBNX0JORV9JOgotICAgICAgcyA9ICJjbXBpIjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIHMzID0gIngsVSI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaF9pOwotICAgIGNhc2UgTV9CTFRfSToKLSAgICAgIHMgPSAic2x0aSI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotICAgICAgZ290byBkb19icmFuY2hfaTsKLSAgICBjYXNlIE1fQkxUVV9JOgotICAgICAgcyA9ICJzbHRpdSI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotICAgICAgZ290byBkb19icmFuY2hfaTsKLSAgICBjYXNlIE1fQkxFX0k6Ci0gICAgICBzID0gInNsdGkiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgczMgPSAieCw4IjsKLSAgICAgIGdvdG8gZG9fYWRkb25lX2JyYW5jaF9pOwotICAgIGNhc2UgTV9CTEVVX0k6Ci0gICAgICBzID0gInNsdGl1IjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIHMzID0gIngsOCI7Ci0gICAgICBnb3RvIGRvX2FkZG9uZV9icmFuY2hfaTsKLSAgICBjYXNlIE1fQkdFX0k6Ci0gICAgICBzID0gInNsdGkiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgczMgPSAieCw4IjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoX2k7Ci0gICAgY2FzZSBNX0JHRVVfSToKLSAgICAgIHMgPSAic2x0aXUiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgczMgPSAieCw4IjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoX2k7Ci0gICAgY2FzZSBNX0JHVF9JOgotICAgICAgcyA9ICJzbHRpIjsKLSAgICAgIHMyID0gImJ0ZXF6IjsKLSAgICAgIHMzID0gIngsOCI7Ci0gICAgICBnb3RvIGRvX2FkZG9uZV9icmFuY2hfaTsKLSAgICBjYXNlIE1fQkdUVV9JOgotICAgICAgcyA9ICJzbHRpdSI7Ci0gICAgICBzMiA9ICJidGVxeiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotCi0gICAgZG9fYWRkb25lX2JyYW5jaF9pOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgKytpbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0KLSAgICBkb19icmFuY2hfaToKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCBzLCBzMywgeHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgczIsICJwIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9BQlM6Ci0gICAgICBleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzbHRpIiwgIngsOCIsICB5cmVnKTsKLSAgICAgIGlmICh4cmVnICE9IHlyZWcpCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAibW92ZSIsICJ5LFgiLCB4cmVnLCB5cmVnKTsKLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJ0ZXF6IiwgInAiKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICJuZWciLCAieCx3IiwgeHJlZywgeHJlZyk7Ci0gICAgfQotfQotCi0vKiBGb3IgY29uc2lzdGVuY3kgY2hlY2tpbmcsIHZlcmlmeSB0aGF0IGFsbCBiaXRzIGFyZSBzcGVjaWZpZWQgZWl0aGVyCi0gICBieSB0aGUgbWF0Y2gvbWFzayBwYXJ0IG9mIHRoZSBpbnN0cnVjdGlvbiBkZWZpbml0aW9uLCBvciBieSB0aGUKLSAgIG9wZXJhbmQgbGlzdC4gICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9taXBzX2luc24gKG9wYykKLSAgICAgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICpvcGM7Ci17Ci0gIGNvbnN0IGNoYXIgKnAgPSBvcGMtPmFyZ3M7Ci0gIGNoYXIgYzsKLSAgdW5zaWduZWQgbG9uZyB1c2VkX2JpdHMgPSBvcGMtPm1hc2s7Ci0KLSAgaWYgKCh1c2VkX2JpdHMgJiBvcGMtPm1hdGNoKSAhPSBvcGMtPm1hdGNoKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiaW50ZXJuYWw6IGJhZCBtaXBzIG9wY29kZSAobWFzayBlcnJvcik6ICVzICVzIiksCi0JICAgICAgb3BjLT5uYW1lLCBvcGMtPmFyZ3MpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotI2RlZmluZSBVU0VfQklUUyhtYXNrLHNoaWZ0KQkodXNlZF9iaXRzIHw9ICgobWFzaykgPDwgKHNoaWZ0KSkpCi0gIHdoaWxlICgqcCkKLSAgICBzd2l0Y2ggKGMgPSAqcCsrKQotICAgICAgewotICAgICAgY2FzZSAnLCc6IGJyZWFrOwotICAgICAgY2FzZSAnKCc6IGJyZWFrOwotICAgICAgY2FzZSAnKSc6IGJyZWFrOwotICAgICAgY2FzZSAnPCc6IFVTRV9CSVRTIChPUF9NQVNLX1NIQU1ULAlPUF9TSF9TSEFNVCk7CWJyZWFrOwotICAgICAgY2FzZSAnPic6CVVTRV9CSVRTIChPUF9NQVNLX1NIQU1ULAlPUF9TSF9TSEFNVCk7CWJyZWFrOwotICAgICAgY2FzZSAnQSc6IGJyZWFrOwotICAgICAgY2FzZSAnQic6CVVTRV9CSVRTIChPUF9NQVNLX1NZU0NBTEwsCU9QX1NIX1NZU0NBTEwpOwlicmVhazsKLSAgICAgIGNhc2UgJ0MnOglVU0VfQklUUyAoT1BfTUFTS19DT1BaLAkJT1BfU0hfQ09QWik7CWJyZWFrOwotICAgICAgY2FzZSAnRCc6CVVTRV9CSVRTIChPUF9NQVNLX0ZELAkJT1BfU0hfRkQpOwlicmVhazsKLSAgICAgIGNhc2UgJ0UnOglVU0VfQklUUyAoT1BfTUFTS19SVCwJCU9QX1NIX1JUKTsJYnJlYWs7Ci0gICAgICBjYXNlICdGJzogYnJlYWs7Ci0gICAgICBjYXNlICdHJzoJVVNFX0JJVFMgKE9QX01BU0tfUkQsCQlPUF9TSF9SRCk7CWJyZWFrOwotICAgICAgY2FzZSAnSSc6IGJyZWFrOwotICAgICAgY2FzZSAnTCc6IGJyZWFrOwotICAgICAgY2FzZSAnTSc6CVVTRV9CSVRTIChPUF9NQVNLX0NDQywJCU9QX1NIX0NDQyk7CWJyZWFrOwotICAgICAgY2FzZSAnTic6CVVTRV9CSVRTIChPUF9NQVNLX0JDQywJCU9QX1NIX0JDQyk7CWJyZWFrOwotICAgICAgY2FzZSAnUic6CVVTRV9CSVRTIChPUF9NQVNLX0ZSLAkJT1BfU0hfRlIpOwlicmVhazsKLSAgICAgIGNhc2UgJ1MnOglVU0VfQklUUyAoT1BfTUFTS19GUywJCU9QX1NIX0ZTKTsJYnJlYWs7Ci0gICAgICBjYXNlICdUJzoJVVNFX0JJVFMgKE9QX01BU0tfRlQsCQlPUF9TSF9GVCk7CWJyZWFrOwotICAgICAgY2FzZSAnVic6CVVTRV9CSVRTIChPUF9NQVNLX0ZTLAkJT1BfU0hfRlMpOwlicmVhazsKLSAgICAgIGNhc2UgJ1cnOglVU0VfQklUUyAoT1BfTUFTS19GVCwJCU9QX1NIX0ZUKTsJYnJlYWs7Ci0gICAgICBjYXNlICdhJzoJVVNFX0JJVFMgKE9QX01BU0tfVEFSR0VULAlPUF9TSF9UQVJHRVQpOwlicmVhazsKLSAgICAgIGNhc2UgJ2InOglVU0VfQklUUyAoT1BfTUFTS19SUywJCU9QX1NIX1JTKTsJYnJlYWs7Ci0gICAgICBjYXNlICdjJzoJVVNFX0JJVFMgKE9QX01BU0tfQ09ERSwJCU9QX1NIX0NPREUpOwlicmVhazsKLSAgICAgIGNhc2UgJ2QnOglVU0VfQklUUyAoT1BfTUFTS19SRCwJCU9QX1NIX1JEKTsJYnJlYWs7Ci0gICAgICBjYXNlICdmJzogYnJlYWs7Ci0gICAgICBjYXNlICdoJzoJVVNFX0JJVFMgKE9QX01BU0tfUFJFRlgsCU9QX1NIX1BSRUZYKTsJYnJlYWs7Ci0gICAgICBjYXNlICdpJzoJVVNFX0JJVFMgKE9QX01BU0tfSU1NRURJQVRFLAlPUF9TSF9JTU1FRElBVEUpOyBicmVhazsKLSAgICAgIGNhc2UgJ2onOglVU0VfQklUUyAoT1BfTUFTS19ERUxUQSwJT1BfU0hfREVMVEEpOwlicmVhazsKLSAgICAgIGNhc2UgJ2snOglVU0VfQklUUyAoT1BfTUFTS19DQUNIRSwJT1BfU0hfQ0FDSEUpOwlicmVhazsKLSAgICAgIGNhc2UgJ2wnOiBicmVhazsKLSAgICAgIGNhc2UgJ28nOiBVU0VfQklUUyAoT1BfTUFTS19ERUxUQSwJT1BfU0hfREVMVEEpOwlicmVhazsKLSAgICAgIGNhc2UgJ3AnOglVU0VfQklUUyAoT1BfTUFTS19ERUxUQSwJT1BfU0hfREVMVEEpOwlicmVhazsKLSAgICAgIGNhc2UgJ3EnOglVU0VfQklUUyAoT1BfTUFTS19DT0RFMiwJT1BfU0hfQ09ERTIpOwlicmVhazsKLSAgICAgIGNhc2UgJ3InOiBVU0VfQklUUyAoT1BfTUFTS19SUywJCU9QX1NIX1JTKTsJYnJlYWs7Ci0gICAgICBjYXNlICdzJzoJVVNFX0JJVFMgKE9QX01BU0tfUlMsCQlPUF9TSF9SUyk7CWJyZWFrOwotICAgICAgY2FzZSAndCc6CVVTRV9CSVRTIChPUF9NQVNLX1JULAkJT1BfU0hfUlQpOwlicmVhazsKLSAgICAgIGNhc2UgJ3UnOglVU0VfQklUUyAoT1BfTUFTS19JTU1FRElBVEUsCU9QX1NIX0lNTUVESUFURSk7IGJyZWFrOwotICAgICAgY2FzZSAndic6CVVTRV9CSVRTIChPUF9NQVNLX1JTLAkJT1BfU0hfUlMpOwlicmVhazsKLSAgICAgIGNhc2UgJ3cnOglVU0VfQklUUyAoT1BfTUFTS19SVCwJCU9QX1NIX1JUKTsJYnJlYWs7Ci0gICAgICBjYXNlICd4JzogYnJlYWs7Ci0gICAgICBjYXNlICd6JzogYnJlYWs7Ci0gICAgICBjYXNlICdQJzogVVNFX0JJVFMgKE9QX01BU0tfUEVSRlJFRywJT1BfU0hfUEVSRlJFRyk7CWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlhc19iYWQgKF8oImludGVybmFsOiBiYWQgbWlwcyBvcGNvZGUgKHVua25vd24gb3BlcmFuZCB0eXBlIGAlYycpOiAlcyAlcyIpLAotCQljLCBvcGMtPm5hbWUsIG9wYy0+YXJncyk7Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0jdW5kZWYgVVNFX0JJVFMKLSAgaWYgKHVzZWRfYml0cyAhPSAweGZmZmZmZmZmKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiaW50ZXJuYWw6IGJhZCBtaXBzIG9wY29kZSAoYml0cyAweCVseCB1bmRlZmluZWQpOiAlcyAlcyIpLAotCSAgICAgIH51c2VkX2JpdHMgJiAweGZmZmZmZmZmLCBvcGMtPm5hbWUsIG9wYy0+YXJncyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi0vKiBUaGlzIHJvdXRpbmUgYXNzZW1ibGVzIGFuIGluc3RydWN0aW9uIGludG8gaXRzIGJpbmFyeSBmb3JtYXQuICBBcyBhCi0gICBzaWRlIGVmZmVjdCwgaXQgc2V0cyBvbmUgb2YgdGhlIGdsb2JhbCB2YXJpYWJsZXMgaW1tX3JlbG9jIG9yCi0gICBvZmZzZXRfcmVsb2MgdG8gdGhlIHR5cGUgb2YgcmVsb2NhdGlvbiB0byBkbyBpZiBvbmUgb2YgdGhlIG9wZXJhbmRzCi0gICBpcyBhbiBhZGRyZXNzIGV4cHJlc3Npb24uICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19pcCAoc3RyLCBpcCkKLSAgICAgY2hhciAqc3RyOwotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLXsKLSAgY2hhciAqczsKLSAgY29uc3QgY2hhciAqYXJnczsKLSAgY2hhciBjOwotICBzdHJ1Y3QgbWlwc19vcGNvZGUgKmluc247Ci0gIGNoYXIgKmFyZ3NTdGFydDsKLSAgdW5zaWduZWQgaW50IHJlZ25vOwotICB1bnNpZ25lZCBpbnQgbGFzdHJlZ25vID0gMDsKLSAgY2hhciAqc19yZXNldDsKLSAgY2hhciBzYXZlX2MgPSAwOwotICBpbnQgZnVsbF9vcGNvZGVfbWF0Y2ggPSAxOwotCi0gIGluc25fZXJyb3IgPSBOVUxMOwotCi0gIC8qIElmIHRoZSBpbnN0cnVjdGlvbiBjb250YWlucyBhICcuJywgd2UgZmlyc3QgdHJ5IHRvIG1hdGNoIGFuIGluc3RydWN0aW9uCi0gICAgIGluY2x1ZGluZyB0aGUgJy4nLiAgVGhlbiB3ZSB0cnkgYWdhaW4gd2l0aG91dCB0aGUgJy4nLiAgKi8KLSAgaW5zbiA9IE5VTEw7Ci0gIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJyAmJiAhaXNzcGFjZSgqcyk7ICsrcykKLSAgICBjb250aW51ZTsKLQotICAvKiBJZiB3ZSBzdG9wcGVkIG9uIHdoaXRlc3BhY2UsIHRoZW4gcmVwbGFjZSB0aGUgd2hpdGVzcGFjZSB3aXRoIG51bGwgZm9yCi0gICAgIHRoZSBjYWxsIHRvIGhhc2hfZmluZC4gIFNhdmUgdGhlIGNoYXJhY3RlciB3ZSByZXBsYWNlZCBqdXN0IGluIGNhc2Ugd2UKLSAgICAgaGF2ZSB0byByZS1wYXJzZSB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAoaXNzcGFjZSAoKnMpKQotICAgIHsKLSAgICAgIHNhdmVfYyA9ICpzOwotICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgfQotCQotICBpbnNuID0gKHN0cnVjdCBtaXBzX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIHN0cik7Ci0KLSAgLyogSWYgd2UgZGlkbid0IGZpbmQgdGhlIGluc3RydWN0aW9uIGluIHRoZSBvcGNvZGUgdGFibGUsIHRyeSBhZ2FpbiwgYnV0Ci0gICAgIHRoaXMgdGltZSB3aXRoIGp1c3QgdGhlIGluc3RydWN0aW9uIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZyB0aGUKLSAgICAgZmlyc3QgJy4nLiAgKi8KLSAgaWYgKGluc24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBSZXN0b3JlIHRoZSBjaGFyYWN0ZXIgd2Ugb3ZlcndyaXRlIGFib3ZlIChpZiBhbnkpLiAgKi8gCi0gICAgICBpZiAoc2F2ZV9jKQotCSooLS1zKSA9IHNhdmVfYzsKLQotICAgICAgLyogU2NhbiB1cCB0byB0aGUgZmlyc3QgJy4nIG9yIHdoaXRlc3BhY2UuICAqLwotICAgICAgZm9yIChzID0gc3RyOyAqcyAhPSAnXDAnICYmICpzICE9ICcuJyAmJiAhaXNzcGFjZSAoKnMpOyArK3MpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIHdlIGRpZCBub3QgZmluZCBhICcuJywgdGhlbiB3ZSBjYW4gcXVpdCBub3cuICAqLwotICAgICAgaWYgKCpzICE9ICcuJykKLQl7Ci0JICBpbnNuX2Vycm9yID0gInVucmVjb2duaXplZCBvcGNvZGUiOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgLyogTG9va3VwIHRoZSBpbnN0cnVjdGlvbiBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gICAgICAqcysrID0gJ1wwJzsKLSAgICAgIGlmICgoaW5zbiA9IChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBzdHIpKSA9PSBOVUxMKQotCXsKLQkgIGluc25fZXJyb3IgPSAidW5yZWNvZ25pemVkIG9wY29kZSI7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBmdWxsX29wY29kZV9tYXRjaCA9IDA7Ci0gICAgfQotCi0gIGFyZ3NTdGFydCA9IHM7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgaW50IGluc25faXNhOwotICAgICAgYm9vbGVhbiBvazsKLQotICAgICAgYXNzZXJ0IChzdHJjbXAgKGluc24tPm5hbWUsIHN0cikgPT0gMCk7Ci0KLSAgICAgIGlmICgoaW5zbi0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTEpCi0JaW5zbl9pc2EgPSAxOwotICAgICAgZWxzZSBpZiAoKGluc24tPm1lbWJlcnNoaXAgJiBJTlNOX0lTQSkgPT0gSU5TTl9JU0EyKQotCWluc25faXNhID0gMjsKLSAgICAgIGVsc2UgaWYgKChpbnNuLT5tZW1iZXJzaGlwICYgSU5TTl9JU0EpID09IElOU05fSVNBMykKLQlpbnNuX2lzYSA9IDM7Ci0gICAgICBlbHNlIGlmICgoaW5zbi0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTQpCi0JaW5zbl9pc2EgPSA0OwotICAgICAgZWxzZQotCWluc25faXNhID0gMTU7Ci0KLSAgICAgIGlmIChpbnNuX2lzYSA8PSBtaXBzX29wdHMuaXNhKQotCW9rID0gdHJ1ZTsKLSAgICAgIGVsc2UgaWYgKGluc24tPnBpbmZvID09IElOU05fTUFDUk8pCi0Jb2sgPSBmYWxzZTsKLSAgICAgIGVsc2UgaWYgKChtaXBzX2NwdSA9PSA0NjUwICYmIChpbnNuLT5tZW1iZXJzaGlwICYgSU5TTl80NjUwKSAhPSAwKQotCSAgICAgICB8fCAobWlwc19jcHUgPT0gNDAxMCAmJiAoaW5zbi0+bWVtYmVyc2hpcCAmIElOU05fNDAxMCkgIT0gMCkKLQkgICAgICAgfHwgKChtaXBzX2NwdSA9PSA0MTAwCi0JCSAgICB8fCBtaXBzX2NwdSA9PSA0MTExCi0JCSAgICApCi0JCSAgICYmIChpbnNuLT5tZW1iZXJzaGlwICYgSU5TTl80MTAwKSAhPSAwKQotCSAgICAgICB8fCAobWlwc19jcHUgPT0gMzkwMCAmJiAoaW5zbi0+bWVtYmVyc2hpcCAmIElOU05fMzkwMCkgIT0gMCkpCi0Jb2sgPSB0cnVlOwotICAgICAgZWxzZQotCW9rID0gZmFsc2U7Ci0KLSAgICAgIGlmIChpbnNuLT5waW5mbyAhPSBJTlNOX01BQ1JPKQotCXsKLQkgIGlmIChtaXBzX2NwdSA9PSA0NjUwICYmIChpbnNuLT5waW5mbyAmIEZQX0QpICE9IDApCi0JICAgIG9rID0gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBvaykKLQl7Ci0JICBpZiAoaW5zbiArIDEgPCAmbWlwc19vcGNvZGVzW05VTU9QQ09ERVNdCi0JICAgICAgJiYgc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpID09IDApCi0JICAgIHsKLQkgICAgICArK2luc247Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGlmIChpbnNuX2lzYSA9PSAxNSAKLSAgICAgICAgICAgICAgfHwgaW5zbl9pc2EgPD0gbWlwc19vcHRzLmlzYSkKLQkgICAgaW5zbl9lcnJvciA9IF8oIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yIik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdGF0aWMgY2hhciBidWZbMTAwXTsKLQotCSAgICAgIHNwcmludGYgKGJ1ZiwgXygib3Bjb2RlIHJlcXVpcmVzIC1taXBzJWQgb3IgZ3JlYXRlciIpLCBpbnNuX2lzYSk7Ci0JICAgICAgaW5zbl9lcnJvciA9IGJ1ZjsKLQkgICAgfQotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaXAtPmluc25fbW8gPSBpbnNuOwotICAgICAgaXAtPmluc25fb3Bjb2RlID0gaW5zbi0+bWF0Y2g7Ci0gICAgICBmb3IgKGFyZ3MgPSBpbnNuLT5hcmdzOzsgKythcmdzKQotCXsKLQkgIGlmICgqcyA9PSAnICcpCi0JICAgICsrczsKLQkgIHN3aXRjaCAoKmFyZ3MpCi0JICAgIHsKLQkgICAgY2FzZSAnXDAnOgkJLyogZW5kIG9mIGFyZ3MgKi8KLQkgICAgICBpZiAoKnMgPT0gJ1wwJykKLQkJcmV0dXJuOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJywnOgotCSAgICAgIGlmICgqcysrID09ICphcmdzKQotCQljb250aW51ZTsKLQkgICAgICBzLS07Ci0JICAgICAgc3dpdGNoICgqKythcmdzKQotCQl7Ci0JCWNhc2UgJ3InOgotCQljYXNlICd2JzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IDIxOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ3cnOgotCQljYXNlICdXJzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IDE2OwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ1YnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgMTE7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcoJzoKLQkgICAgICAvKiBIYW5kbGUgb3B0aW9uYWwgYmFzZSByZWdpc3Rlci4KLQkJIEVpdGhlciB0aGUgYmFzZSByZWdpc3RlciBpcyBvbWl0dGVkIG9yCi0JCSB3ZSBtdXN0IGhhdmUgYSBsZWZ0IHBhcmVuLiAqLwotCSAgICAgIC8qIFRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSBuZXh0IG9wZXJhbmQgc3BlY2lmaWVyCi0JCSBpcyBhIGJhc2UgcmVnaXN0ZXIgc3BlY2lmaWNhdGlvbi4gICovCi0JICAgICAgYXNzZXJ0IChhcmdzWzFdID09ICdiJyB8fCBhcmdzWzFdID09ICc1JwotCQkgICAgICB8fCBhcmdzWzFdID09ICctJyB8fCBhcmdzWzFdID09ICc0Jyk7Ci0JICAgICAgaWYgKCpzID09ICdcMCcpCi0JCXJldHVybjsKLQotCSAgICBjYXNlICcpJzoJCS8qIHRoZXNlIG11c3QgbWF0Y2ggZXhhY3RseSAqLwotCSAgICAgIGlmICgqcysrID09ICphcmdzKQotCQljb250aW51ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc8JzoJCS8qIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0ICovCi0JICAgICAgLyoKLQkgICAgICAgKiBBY2NvcmRpbmcgdG8gdGhlIG1hbnVhbCwgaWYgdGhlIHNoaWZ0IGFtb3VudCBpcyBncmVhdGVyCi0JICAgICAgICogdGhhbiAzMSBvciBsZXNzIHRoYW4gMCB0aGUgdGhlIHNoaWZ0IGFtb3VudCBzaG91bGQgYmUKLQkgICAgICAgKiBtb2QgMzIuIEluIHJlYWxpdHkgdGhlIG1pcHMgYXNzZW1ibGVyIGlzc3VlcyBhbiBlcnJvci4KLQkgICAgICAgKiBXZSBpc3N1ZSBhIHdhcm5pbmcgYW5kIG1hc2sgb3V0IGFsbCBidXQgdGhlIGxvdyA1IGJpdHMuCi0JICAgICAgICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlciA+IDMxKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiSW1wcm9wZXIgc2hpZnQgYW1vdW50ICglbGQpIiksCi0JCQkgICAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSBpbW1fZXhwci5YX2FkZF9udW1iZXIgJiAweDFmOwotCQl9Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGltbV9leHByLlhfYWRkX251bWJlciA8PCA2OwotCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnPic6CQkvKiBzaGlmdCBhbW91bnQgbWludXMgMzIgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMzIKLQkJICB8fCAodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gNjMpCi0JCWJyZWFrOwotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyIC0gMzIpIDw8IDY7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCi0JICAgIGNhc2UgJ2snOgkJLyogY2FjaGUgY29kZSAqLwotCSAgICBjYXNlICdoJzoJCS8qIHByZWZ4IGNvZGUgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gMzEpCi0JCXsKLQkJICBhc193YXJuIChfKCJJbnZhbGlkIHZhbHVlIGZvciBgJXMnICglbHUpIiksCi0JCQkgICBpcC0+aW5zbl9tby0+bmFtZSwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCQkgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweDFmOwotCQl9Ci0JICAgICAgaWYgKCphcmdzID09ICdrJykKLQkJaXAtPmluc25fb3Bjb2RlIHw9IGltbV9leHByLlhfYWRkX251bWJlciA8PCBPUF9TSF9DQUNIRTsKLQkgICAgICBlbHNlCi0JCWlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgT1BfU0hfUFJFRlg7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdjJzoJCS8qIGJyZWFrIGNvZGUgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQpIGltbV9leHByLlhfYWRkX251bWJlciA+IDEwMjMpCi0JCXsKLQkJICBhc193YXJuIChfKCJJbGxlZ2FsIGJyZWFrIGNvZGUgKCVsZCkiKSwKLQkJCSAgIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCQkgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweDNmZjsKLQkJfQotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgMTY7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdxJzoJCS8qIGxvd2VyIGJyZWFrIGNvZGUgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQpIGltbV9leHByLlhfYWRkX251bWJlciA+IDEwMjMpCi0JCXsKLQkJICBhc193YXJuIChfKCJJbGxlZ2FsIGxvd2VyIGJyZWFrIGNvZGUgKCVsZCkiKSwKLQkJCSAgIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCQkgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweDNmZjsKLQkJfQotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgNjsKLQkgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ0InOgkJLyogc3lzY2FsbCBjb2RlICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAweGZmZmZmKQotCQlhc193YXJuIChfKCJJbGxlZ2FsIHN5c2NhbGwgY29kZSAoJWxkKSIpLAotCQkJIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgNjsKLQkgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBjYXNlICdDJzogICAgICAgICAgIC8qIENvcHJvY2Vzc29yIGNvZGUgKi8KLSAgICAgICAgICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLSAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gKDE8PDI1KSkKLQkJewotICAgICAgICAgICAgICAgICAgYXNfd2FybiAoXygiQ29wcm9jY2Vzb3IgY29kZSA+IDI1IGJpdHMgKCVsZCkiKSwKLQkJCSAgIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotICAgICAgICAgICAgICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyICY9ICgoMTw8MjUpIC0gMSk7Ci0JCX0KLSAgICAgICAgICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGltbV9leHByLlhfYWRkX251bWJlcjsKLSAgICAgICAgICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotICAgICAgICAgICAgICBzID0gZXhwcl9lbmQ7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ1AnOgkJLyogUGVyZm9ybWFuY2UgcmVnaXN0ZXIgKi8KLSAgICAgICAgICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLSAgICAgICAgICAgICAgaWYgKGltbV9leHByLlhfYWRkX251bWJlciAhPSAwICYmIGltbV9leHByLlhfYWRkX251bWJlciAhPSAxKQotCQl7Ci0gICAgICAgICAgICAgICAgICBhc193YXJuIChfKCJJbnZhbGlkYXRlIHBlcmZvcm1hbmNlIHJlZ3N0ZXIgKCVsZCkiKSwKLQkJCSAgIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotICAgICAgICAgICAgICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyICY9IDE7Ci0JCX0KLSAgICAgICAgICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IChpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgMSk7Ci0gICAgICAgICAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLSAgICAgICAgICAgICAgcyA9IGV4cHJfZW5kOwotICAgICAgICAgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdiJzoJCS8qIGJhc2UgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnZCc6CQkvKiBkZXN0aW5hdGlvbiByZWdpc3RlciAqLwotCSAgICBjYXNlICdzJzoJCS8qIHNvdXJjZSByZWdpc3RlciAqLwotCSAgICBjYXNlICd0JzoJCS8qIHRhcmdldCByZWdpc3RlciAqLwotCSAgICBjYXNlICdyJzoJCS8qIGJvdGggdGFyZ2V0IGFuZCBzb3VyY2UgKi8KLQkgICAgY2FzZSAndic6CQkvKiBib3RoIGRlc3QgYW5kIHNvdXJjZSAqLwotCSAgICBjYXNlICd3JzoJCS8qIGJvdGggZGVzdCBhbmQgdGFyZ2V0ICovCi0JICAgIGNhc2UgJ0UnOgkJLyogY29wcm9jZXNzb3IgdGFyZ2V0IHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ0cnOgkJLyogY29wcm9jZXNzb3IgZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAneCc6CQkvKiBpZ25vcmUgcmVnaXN0ZXIgbmFtZSAqLwotCSAgICBjYXNlICd6JzoJCS8qIG11c3QgYmUgemVybyByZWdpc3RlciAqLwotCSAgICAgIHNfcmVzZXQgPSBzOwotCSAgICAgIGlmIChzWzBdID09ICckJykKLQkJewotCi0JCSAgaWYgKGlzZGlnaXQgKHNbMV0pKQotCQkgICAgewotCQkgICAgICArK3M7Ci0JCSAgICAgIHJlZ25vID0gMDsKLQkJICAgICAgZG8KLQkJCXsKLQkJCSAgcmVnbm8gKj0gMTA7Ci0JCQkgIHJlZ25vICs9ICpzIC0gJzAnOwotCQkJICArK3M7Ci0JCQl9Ci0JCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgqcykpOwotCQkgICAgICBpZiAocmVnbm8gPiAzMSkKLQkJCWFzX2JhZCAoXygiSW52YWxpZCByZWdpc3RlciBudW1iZXIgKCVkKSIpLCByZWdubyk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKmFyZ3MgPT0gJ0UnIHx8ICphcmdzID09ICdHJykKLQkJICAgIGdvdG8gbm90cmVnOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKHNbMV0gPT0gJ2YnICYmIHNbMl0gPT0gJ3AnKQotCQkJewotCQkJICBzICs9IDM7Ci0JCQkgIHJlZ25vID0gRlA7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ3MnICYmIHNbMl0gPT0gJ3AnKQotCQkJewotCQkJICBzICs9IDM7Ci0JCQkgIHJlZ25vID0gU1A7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ2cnICYmIHNbMl0gPT0gJ3AnKQotCQkJewotCQkJICBzICs9IDM7Ci0JCQkgIHJlZ25vID0gR1A7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ2EnICYmIHNbMl0gPT0gJ3QnKQotCQkJewotCQkJICBzICs9IDM7Ci0JCQkgIHJlZ25vID0gQVQ7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ2snICYmIHNbMl0gPT0gJ3QnICYmIHNbM10gPT0gJzAnKQotCQkJewotCQkJICBzICs9IDQ7Ci0JCQkgIHJlZ25vID0gS1QwOwotCQkJfQotCQkgICAgICBlbHNlIGlmIChzWzFdID09ICdrJyAmJiBzWzJdID09ICd0JyAmJiBzWzNdID09ICcxJykKLQkJCXsKLQkJCSAgcyArPSA0OwotCQkJICByZWdubyA9IEtUMTsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoaXRibF9oYXZlX2VudHJpZXMpCi0JCQl7Ci0JCQkgIGNoYXIgKnAsICpuOwotCQkJICBpbnQgcjsKLQotCQkJICBwID0gcysxOyAJLyogYWR2YW5jZSBwYXN0ICckJyAqLwotCQkJICBuID0gaXRibF9nZXRfZmllbGQgKCZwKTsgIC8qIG4gaXMgbmFtZSAqLwotCi0JCQkgIC8qIFNlZSBpZiB0aGlzIGlzIGEgcmVnaXN0ZXIgZGVmaW5lZCBpbiBhbiAKLQkJCSAgICAgaXRibCBlbnRyeSAqLwotCQkJICByID0gaXRibF9nZXRfcmVnX3ZhbCAobik7Ci0JCQkgIGlmIChyKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIEdldF9maWVsZCBhZHZhbmNlcyB0byB0aGUgc3RhcnQgb2YKLQkJCQkgdGhlIG5leHQgZmllbGQsIHNvIHdlIG5lZWQgdG8gYmFjawotCQkJCSByYWNrIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3QgZmllbGQuICovCi0JCQkgICAgICBpZiAocCkgCi0JCQkJcyA9IHAgLSAxOwotCQkJICAgICAgZWxzZSAKLQkJCQlzID0gc3RyY2hyIChzLCdcMCcpOwotCQkJICAgICAgcmVnbm8gPSByOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIGdvdG8gbm90cmVnOwotCQkJICB9Ci0JCSAgICAgIGVsc2UKLQkJCWdvdG8gbm90cmVnOwotCQkgICAgfQotCQkgIGlmIChyZWdubyA9PSBBVAotCQkgICAgICAmJiAhIG1pcHNfb3B0cy5ub2F0Ci0JCSAgICAgICYmICphcmdzICE9ICdFJwotCQkgICAgICAmJiAqYXJncyAhPSAnRycpCi0JCSAgICBhc193YXJuIChfKCJVc2VkICRhdCB3aXRob3V0IFwiLnNldCBub2F0XCIiKSk7Ci0JCSAgYyA9ICphcmdzOwotCQkgIGlmICgqcyA9PSAnICcpCi0JCSAgICBzKys7Ci0JCSAgaWYgKGFyZ3NbMV0gIT0gKnMpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjID09ICdyJyB8fCBjID09ICd2JyB8fCBjID09ICd3JykKLQkJCXsKLQkJCSAgcmVnbm8gPSBsYXN0cmVnbm87Ci0JCQkgIHMgPSBzX3Jlc2V0OwotCQkJICBhcmdzKys7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgLyogJ3onIG9ubHkgbWF0Y2hlcyAkMC4gICovCi0JCSAgaWYgKGMgPT0gJ3onICYmIHJlZ25vICE9IDApCi0JCSAgICBicmVhazsKLQotCS8qIE5vdyB0aGF0IHdlIGhhdmUgYXNzZW1ibGVkIG9uZSBvcGVyYW5kLCB3ZSB1c2UgdGhlIGFyZ3Mgc3RyaW5nIAotCSAqIHRvIGZpZ3VyZSBvdXQgd2hlcmUgaXQgZ29lcyBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0JCSAgc3dpdGNoIChjKQotCQkgICAgewotCQkgICAgY2FzZSAncic6Ci0JCSAgICBjYXNlICdzJzoKLQkJICAgIGNhc2UgJ3YnOgotCQkgICAgY2FzZSAnYic6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCAyMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdkJzoKLQkJICAgIGNhc2UgJ0cnOgotCQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgMTE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAndyc6Ci0JCSAgICBjYXNlICd0JzoKLQkJICAgIGNhc2UgJ0UnOgotCQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgMTY7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAneCc6Ci0JCSAgICAgIC8qIFRoaXMgY2FzZSBleGlzdHMgYmVjYXVzZSBvbiB0aGUgcjMwMDAgdHJ1bmMKLQkJCSBleHBhbmRzIGludG8gYSBtYWNybyB3aGljaCByZXF1aXJlcyBhIGdwCi0JCQkgcmVnaXN0ZXIuICBPbiB0aGUgcjYwMDAgb3IgcjQwMDAgaXQgaXMKLQkJCSBhc3NlbWJsZWQgaW50byBhIHNpbmdsZSBpbnN0cnVjdGlvbiB3aGljaAotCQkJIGlnbm9yZXMgdGhlIHJlZ2lzdGVyLiAgVGh1cyB0aGUgaW5zbiB2ZXJzaW9uCi0JCQkgaXMgTUlQU19JU0EyIGFuZCB1c2VzICd4JywgYW5kIHRoZSBtYWNybwotCQkJIHZlcnNpb24gaXMgTUlQU19JU0ExIGFuZCB1c2VzICd0Jy4gICovCi0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAneic6Ci0JCSAgICAgIC8qIFRoaXMgY2FzZSBpcyBmb3IgdGhlIGRpdiBpbnN0cnVjdGlvbiwgd2hpY2gKLQkJCSBhY3RzIGRpZmZlcmVudGx5IGlmIHRoZSBkZXN0aW5hdGlvbiBhcmd1bWVudAotCQkJIGlzICQwLiAgVGhpcyBvbmx5IG1hdGNoZXMgJDAsIGFuZCBpcyBjaGVja2VkCi0JCQkgb3V0c2lkZSB0aGUgc3dpdGNoLiAgKi8KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdEJzoKLQkJICAgICAgLyogSXRibCBvcGVyYW5kOyBub3QgeWV0IGltcGxlbWVudGVkLiBGSVhNRSA/PyAqLwotCQkgICAgICBicmVhazsKLQkJICAgICAgLyogV2hhdCBhYm91dCBhbGwgb3RoZXIgb3BlcmFuZHMgbGlrZSAnaScsIHdoaWNoCi0JCQkgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgb3Bjb2RlIHRhYmxlPyAqLwotCQkgICAgfQotCQkgIGxhc3RyZWdubyA9IHJlZ25vOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIG5vdHJlZzoKLQkgICAgICBzd2l0Y2ggKCphcmdzKyspCi0JCXsKLQkJY2FzZSAncic6Ci0JCWNhc2UgJ3YnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgMjE7Ci0JCSAgY29udGludWU7Ci0JCWNhc2UgJ3cnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgMTY7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdEJzoJCS8qIGZsb2F0aW5nIHBvaW50IGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ1MnOgkJLyogZmxvYXRpbmcgcG9pbnQgc291cmNlIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ1QnOgkJLyogZmxvYXRpbmcgcG9pbnQgdGFyZ2V0IHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ1InOgkJLyogZmxvYXRpbmcgcG9pbnQgc291cmNlIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ1YnOgotCSAgICBjYXNlICdXJzoKLQkgICAgICBzX3Jlc2V0ID0gczsKLQkgICAgICBpZiAoc1swXSA9PSAnJCcgJiYgc1sxXSA9PSAnZicgJiYgaXNkaWdpdCAoc1syXSkpCi0JCXsKLQkJICBzICs9IDI7Ci0JCSAgcmVnbm8gPSAwOwotCQkgIGRvCi0JCSAgICB7Ci0JCSAgICAgIHJlZ25vICo9IDEwOwotCQkgICAgICByZWdubyArPSAqcyAtICcwJzsKLQkJICAgICAgKytzOwotCQkgICAgfQotCQkgIHdoaWxlIChpc2RpZ2l0ICgqcykpOwotCi0JCSAgaWYgKHJlZ25vID4gMzEpCi0JCSAgICBhc19iYWQgKF8oIkludmFsaWQgZmxvYXQgcmVnaXN0ZXIgbnVtYmVyICglZCkiKSwgcmVnbm8pOwotCi0JCSAgaWYgKChyZWdubyAmIDEpICE9IDAKLQkJICAgICAgJiYgbWlwc19vcHRzLmlzYSA8IDMKLQkJICAgICAgJiYgISAoc3RyY21wIChzdHIsICJtdGMxIikgPT0gMAotCQkJICAgIHx8IHN0cmNtcCAoc3RyLCAibWZjMSIpID09IDAKLQkJCSAgICB8fCBzdHJjbXAgKHN0ciwgImx3YzEiKSA9PSAwCi0JCQkgICAgfHwgc3RyY21wIChzdHIsICJzd2MxIikgPT0gMAotCQkJICAgIHx8IHN0cmNtcCAoc3RyLCAibC5zIikgPT0gMAotCQkJICAgIHx8IHN0cmNtcCAoc3RyLCAicy5zIikgPT0gMCkpCi0JCSAgICBhc193YXJuIChfKCJGbG9hdCByZWdpc3RlciBzaG91bGQgYmUgZXZlbiwgd2FzICVkIiksCi0JCQkgICAgIHJlZ25vKTsKLQotCQkgIGMgPSAqYXJnczsKLQkJICBpZiAoKnMgPT0gJyAnKQotCQkgICAgcysrOwotCQkgIGlmIChhcmdzWzFdICE9ICpzKQotCQkgICAgewotCQkgICAgICBpZiAoYyA9PSAnVicgfHwgYyA9PSAnVycpCi0JCQl7Ci0JCQkgIHJlZ25vID0gbGFzdHJlZ25vOwotCQkJICBzID0gc19yZXNldDsKLQkJCSAgYXJncysrOwotCQkJfQotCQkgICAgfQotCQkgIHN3aXRjaCAoYykKLQkJICAgIHsKLQkJICAgIGNhc2UgJ0QnOgotCQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgNjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdWJzoKLQkJICAgIGNhc2UgJ1MnOgotCQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgMTE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnVyc6Ci0JCSAgICBjYXNlICdUJzoKLQkJICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IDE2OwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ1InOgotCQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgMjE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGxhc3RyZWdubyA9IHJlZ25vOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQotCSAgICAgIHN3aXRjaCAoKmFyZ3MrKykKLQkJewotCQljYXNlICdWJzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IDExOwotCQkgIGNvbnRpbnVlOwotCQljYXNlICdXJzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IDE2OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnSSc6Ci0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2JpZwotCQkgICYmIGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQkJaW5zbl9lcnJvciA9IF8oImFic29sdXRlIGV4cHJlc3Npb24gcmVxdWlyZWQiKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnQSc6Ci0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJm9mZnNldF9leHByLCBzKTsKLQkgICAgICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfMzI7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ0YnOgotCSAgICBjYXNlICdMJzoKLQkgICAgY2FzZSAnZic6Ci0JICAgIGNhc2UgJ2wnOgotCSAgICAgIHsKLQkJaW50IGY2NDsKLQkJY2hhciAqc2F2ZV9pbjsKLQkJY2hhciAqZXJyOwotCQl1bnNpZ25lZCBjaGFyIHRlbXBbOF07Ci0JCWludCBsZW47Ci0JCXVuc2lnbmVkIGludCBsZW5ndGg7Ci0JCXNlZ1Qgc2VnOwotCQlzdWJzZWdUIHN1YnNlZzsKLQkJY2hhciAqcDsKLQotCQkvKiBUaGVzZSBvbmx5IGFwcGVhciBhcyB0aGUgbGFzdCBvcGVyYW5kIGluIGFuCi0JCSAgIGluc3RydWN0aW9uLCBhbmQgZXZlcnkgaW5zdHJ1Y3Rpb24gdGhhdCBhY2NlcHRzCi0JCSAgIHRoZW0gaW4gYW55IHZhcmlhbnQgYWNjZXB0cyB0aGVtIGluIGFsbCB2YXJpYW50cy4KLQkJICAgVGhpcyBtZWFucyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGJhY2tpbmcgb3V0Ci0JCSAgIGFueSBjaGFuZ2VzIGlmIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtYXRjaC4KLQotCQkgICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0gaXMgdGhlIHNpemUgb2YgdGhlCi0JCSAgIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IGFuZCB3aGVyZSBpdCBnb2VzLiAgRm9yICdGJwotCQkgICBhbmQgJ0wnIHRoZSBjb25zdGFudCBpcyA2NCBiaXRzOyBmb3IgJ2YnIGFuZCAnbCcgaXQKLQkJICAgaXMgMzIgYml0cy4gIFdoZXJlIHRoZSBjb25zdGFudCBpcyBwbGFjZWQgaXMgYmFzZWQKLQkJICAgb24gaG93IHRoZSBNSVBTIGFzc2VtYmxlciBkb2VzIHRoaW5nczoKLQkJICAgIEYgLS0gLnJkYXRhCi0JCSAgICBMIC0tIC5saXQ4Ci0JCSAgICBmIC0tIGltbWVkaWF0ZSB2YWx1ZQotCQkgICAgbCAtLSAubGl0NAotCi0JCSAgICBUaGUgLmxpdDQgYW5kIC5saXQ4IHNlY3Rpb25zIGFyZSBvbmx5IHVzZWQgaWYKLQkJICAgIHBlcm1pdHRlZCBieSB0aGUgLUcgYXJndW1lbnQuCi0KLQkJICAgIFdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSwgd2UgdXNlIHRoZQotCQkgICAgLmxpdDggc2VjdGlvbiBidXQgbm90IHRoZSAubGl0NCBzZWN0aW9uICh3ZSBjYW4gZG8KLQkJICAgIC5saXQ0IGlubGluZSBlYXNpbHk7IHdlIG5lZWQgdG8gcHV0IC5saXQ4Ci0JCSAgICBzb21ld2hlcmUgaW4gdGhlIGRhdGEgc2VnbWVudCwgYW5kIHVzaW5nIC5saXQ4Ci0JCSAgICBwZXJtaXRzIHRoZSBsaW5rZXIgdG8gZXZlbnR1YWxseSBjb21iaW5lIGlkZW50aWNhbAotCQkgICAgLmxpdDggZW50cmllcykuICAqLwotCi0JCWY2NCA9ICphcmdzID09ICdGJyB8fCAqYXJncyA9PSAnTCc7Ci0KLQkJc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJaW5wdXRfbGluZV9wb2ludGVyID0gczsKLQkJZXJyID0gbWRfYXRvZiAoZjY0ID8gJ2QnIDogJ2YnLCAoY2hhciAqKSB0ZW1wLCAmbGVuKTsKLQkJbGVuZ3RoID0gbGVuOwotCQlzID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQlpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotCQlpZiAoZXJyICE9IE5VTEwgJiYgKmVyciAhPSAnXDAnKQotCQkgIHsKLQkJICAgIGFzX2JhZCAoXygiQmFkIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50OiAlcyIpLCBlcnIpOwotCQkgICAgbWVtc2V0ICh0ZW1wLCAnXDAnLCBzaXplb2YgdGVtcCk7Ci0JCSAgICBsZW5ndGggPSBmNjQgPyA4IDogNDsKLQkJICB9Ci0KLQkJYXNzZXJ0IChsZW5ndGggPT0gKGY2NCA/IDggOiA0KSk7Ci0KLQkJaWYgKCphcmdzID09ICdmJwotCQkgICAgfHwgKCphcmdzID09ICdsJwotCQkJJiYgKCEgVVNFX0dMT0JBTF9QT0lOVEVSX09QVAotCQkJICAgIHx8IG1pcHNfcGljID09IEVNQkVEREVEX1BJQwotCQkJICAgIHx8IGdfc3dpdGNoX3ZhbHVlIDwgNAotCQkJICAgIHx8ICh0ZW1wWzBdID09IDAgJiYgdGVtcFsxXSA9PSAwKQotCQkJICAgIHx8ICh0ZW1wWzJdID09IDAgJiYgdGVtcFszXSA9PSAwKSkpKQotCQkgIHsKLQkJICAgIGltbV9leHByLlhfb3AgPSBPX2NvbnN0YW50OwotCQkgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JCSAgICAgIGltbV9leHByLlhfYWRkX251bWJlciA9IGJmZF9nZXRsMzIgKHRlbXApOwotCQkgICAgZWxzZQotCQkgICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0YjMyICh0ZW1wKTsKLQkJICB9Ci0JCWVsc2UgaWYgKGxlbmd0aCA+IDQKLQkJCSAmJiAoKHRlbXBbMF0gPT0gMCAmJiB0ZW1wWzFdID09IDApCi0JCQkgICAgIHx8ICh0ZW1wWzJdID09IDAgJiYgdGVtcFszXSA9PSAwKSkKLQkJCSAmJiAoKHRlbXBbNF0gPT0gMCAmJiB0ZW1wWzVdID09IDApCi0JCQkgICAgIHx8ICh0ZW1wWzZdID09IDAgJiYgdGVtcFs3XSA9PSAwKSkpCi0JCSAgewotCQkgICAgLyogVGhlIHZhbHVlIGlzIHNpbXBsZSBlbm91Z2ggdG8gbG9hZCB3aXRoIGEKLSAgICAgICAgICAgICAgICAgICAgICAgY291cGxlIG9mIGluc3RydWN0aW9ucy4gIEluIG1pcHMxIG1vZGUsIHNldAotICAgICAgICAgICAgICAgICAgICAgICBpbW1fZXhwciB0byB0aGUgaGlnaCBvcmRlciAzMiBiaXRzIGFuZAotICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfZXhwciB0byB0aGUgbG93IG9yZGVyIDMyIGJpdHMuCi0gICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgc2V0IGltbV9leHByIHRvIHRoZSBlbnRpcmUgNjQgYml0Ci0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50LiAgKi8KLQkJICAgIGlmIChtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgewotCQkJaW1tX2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JCQlvZmZzZXRfZXhwci5YX29wID0gT19jb25zdGFudDsKLQkJCWlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCQkJICB7Ci0JCQkgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGwzMiAodGVtcCArIDQpOwotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IGJmZF9nZXRsMzIgKHRlbXApOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0YjMyICh0ZW1wKTsKLQkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0YjMyICh0ZW1wICsgNCk7Ci0JCQkgIH0KLQkJCWlmIChvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQkJCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChzaXplb2YgKGltbV9leHByLlhfYWRkX251bWJlcikgPiA0KQotCQkgICAgICB7Ci0JCQlpbW1fZXhwci5YX29wID0gT19jb25zdGFudDsKLQkJCWlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCQkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0bDY0ICh0ZW1wKTsKLQkJCWVsc2UKLQkJCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGI2NCAodGVtcCk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJaW1tX2V4cHIuWF9vcCA9IE9fYmlnOwotCQkJaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gNDsKLQkJCWlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCQkJICB7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bMF0gPSBiZmRfZ2V0bDE2ICh0ZW1wKTsKLQkJCSAgICBnZW5lcmljX2JpZ251bVsxXSA9IGJmZF9nZXRsMTYgKHRlbXAgKyAyKTsKLQkJCSAgICBnZW5lcmljX2JpZ251bVsyXSA9IGJmZF9nZXRsMTYgKHRlbXAgKyA0KTsKLQkJCSAgICBnZW5lcmljX2JpZ251bVszXSA9IGJmZF9nZXRsMTYgKHRlbXAgKyA2KTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bMF0gPSBiZmRfZ2V0YjE2ICh0ZW1wICsgNik7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bMV0gPSBiZmRfZ2V0YjE2ICh0ZW1wICsgNCk7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bMl0gPSBiZmRfZ2V0YjE2ICh0ZW1wICsgMik7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bM10gPSBiZmRfZ2V0YjE2ICh0ZW1wKTsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgY29uc3QgY2hhciAqbmV3bmFtZTsKLQkJICAgIHNlZ1QgbmV3X3NlZzsKLQotCQkgICAgLyogU3dpdGNoIHRvIHRoZSByaWdodCBzZWN0aW9uLiAgKi8KLQkJICAgIHNlZyA9IG5vd19zZWc7Ci0JCSAgICBzdWJzZWcgPSBub3dfc3Vic2VnOwotCQkgICAgc3dpdGNoICgqYXJncykKLQkJICAgICAgewotCQkgICAgICBkZWZhdWx0OiAvKiB1bnVzZWQgZGVmYXVsdCBjYXNlIGF2b2lkcyB3YXJuaW5ncy4gICovCi0JCSAgICAgIGNhc2UgJ0wnOgotCQkJbmV3bmFtZSA9IFJEQVRBX1NFQ1RJT05fTkFNRTsKLQkJCWlmIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUICYmIGdfc3dpdGNoX3ZhbHVlID49IDgpCi0JCQkgIG5ld25hbWUgPSAiLmxpdDgiOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ0YnOgotCQkJbmV3bmFtZSA9IFJEQVRBX1NFQ1RJT05fTkFNRTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdsJzoKLQkJCWFzc2VydCAoIVVTRV9HTE9CQUxfUE9JTlRFUl9PUFQKLQkJCQl8fCBnX3N3aXRjaF92YWx1ZSA+PSA0KTsKLQkJCW5ld25hbWUgPSAiLmxpdDQiOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIG5ld19zZWcgPSBzdWJzZWdfbmV3IChuZXduYW1lLCAoc3Vic2VnVCkgMCk7Ci0JCSAgICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCQkgICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbmV3X3NlZywKLQkJCQkJICAgICAoU0VDX0FMTE9DCi0JCQkJCSAgICAgIHwgU0VDX0xPQUQKLQkJCQkJICAgICAgfCBTRUNfUkVBRE9OTFkKLQkJCQkJICAgICAgfCBTRUNfREFUQSkpOwotCQkgICAgZnJhZ19hbGlnbiAoKmFyZ3MgPT0gJ2wnID8gMiA6IDMsIDAsIDApOwotCQkgICAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCQkJJiYgc3RyY21wIChUQVJHRVRfT1MsICJlbGYiKSAhPSAwKQotCQkgICAgICByZWNvcmRfYWxpZ25tZW50IChuZXdfc2VnLCA0KTsKLQkJICAgIGVsc2UKLQkJICAgICAgcmVjb3JkX2FsaWdubWVudCAobmV3X3NlZywgKmFyZ3MgPT0gJ2wnID8gMiA6IDMpOwotCQkgICAgaWYgKHNlZyA9PSBub3dfc2VnKQotCQkgICAgICBhc19iYWQgKF8oIkNhbid0IHVzZSBmbG9hdGluZyBwb2ludCBpbnNuIGluIHRoaXMgc2VjdGlvbiIpKTsKLQotCQkgICAgLyogU2V0IHRoZSBhcmd1bWVudCB0byB0aGUgY3VycmVudCBhZGRyZXNzIGluIHRoZQotCQkgICAgICAgc2VjdGlvbi4gICovCi0JCSAgICBvZmZzZXRfZXhwci5YX29wID0gT19zeW1ib2w7Ci0JCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wgPQotCQkgICAgICBzeW1ib2xfbmV3ICgiTDBcMDAxIiwgbm93X3NlZywKLQkJCQkgICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwgZnJhZ19ub3cpOwotCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQotCQkgICAgLyogUHV0IHRoZSBmbG9hdGluZyBwb2ludCBudW1iZXIgaW50byB0aGUgc2VjdGlvbi4gICovCi0JCSAgICBwID0gZnJhZ19tb3JlICgoaW50KSBsZW5ndGgpOwotCQkgICAgbWVtY3B5IChwLCB0ZW1wLCBsZW5ndGgpOwotCi0JCSAgICAvKiBTd2l0Y2ggYmFjayB0byB0aGUgb3JpZ2luYWwgc2VjdGlvbi4gICovCi0JCSAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdpJzoJCS8qIDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLQkgICAgY2FzZSAnaic6CQkvKiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqLwotCSAgICAgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ19MTzE2OwotCSAgICAgIGMgPSBteV9nZXRTbWFsbEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgaWYgKGMgIT0gJ1wwJykKLQkJewotCQkgIGlmIChjICE9ICdsJykKLQkJICAgIHsKLQkJICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkJCWltbV9leHByLlhfYWRkX251bWJlciA9Ci0JCQkgIChpbW1fZXhwci5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOwotCQkgICAgICBlbHNlIGlmIChjID09ICdoJykKLQkJCXsKLQkJCSAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX0hJMTZfUzsKLQkJCSAgaW1tX3VubWF0Y2hlZF9oaSA9IHRydWU7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCWltbV9yZWxvYyA9IEJGRF9SRUxPQ19ISTE2OwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkJICAgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweGZmZmY7Ci0JCX0KLQkgICAgICBpZiAoKmFyZ3MgPT0gJ2knKQotCQl7Ci0JCSAgaWYgKChjID09ICdcMCcgJiYgaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCQkgICAgICB8fCAoKGltbV9leHByLlhfYWRkX251bWJlciA8IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGltbV9leHByLlhfYWRkX251bWJlciA+PSAweDEwMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpKQotCQkgICAgewotCQkgICAgICBpZiAoaW5zbiArIDEgPCAmbWlwc19vcGNvZGVzW05VTU9QQ09ERVNdICYmCi0JCQkgICFzdHJjbXAgKGluc24tPm5hbWUsIGluc25bMV0ubmFtZSkpCi0JCQlicmVhazsKLQkJICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudAotCQkJICAmJiBpbW1fZXhwci5YX29wICE9IE9fYmlnKQotCQkJaW5zbl9lcnJvciA9IF8oImFic29sdXRlIGV4cHJlc3Npb24gcmVxdWlyZWQiKTsKLQkJICAgICAgZWxzZQotCQkJYXNfYmFkIChfKCIxNiBiaXQgZXhwcmVzc2lvbiBub3QgaW4gcmFuZ2UgMC4uNjU1MzUiKSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnQgbW9yZTsKLQkJICBvZmZzZXRUIG1heDsKLQotCQkgIC8qIFRoZSB1cHBlciBib3VuZCBzaG91bGQgYmUgMHg4MDAwLCBidXQKLQkJICAgICB1bmZvcnR1bmF0ZWx5IHRoZSBNSVBTIGFzc2VtYmxlciBhY2NlcHRzIG51bWJlcnMKLQkJICAgICBmcm9tIDB4ODAwMCB0byAweGZmZmYgYW5kIHNpZ24gZXh0ZW5kcyB0aGVtLCBhbmQKLQkJICAgICB3ZSB3YW50IHRvIGJlIGNvbXBhdGlibGUuICBXZSBvbmx5IHBlcm1pdCB0aGlzCi0JCSAgICAgZXh0ZW5kZWQgcmFuZ2UgZm9yIGFuIGluc3RydWN0aW9uIHdoaWNoIGRvZXMgbm90Ci0JCSAgICAgcHJvdmlkZSBhbnkgZnVydGhlciBhbHRlcm5hdGVzLCBzaW5jZSB0aG9zZQotCQkgICAgIGFsdGVybmF0ZXMgbWF5IGhhbmRsZSBvdGhlciBjYXNlcy4gIFBlb3BsZSBzaG91bGQKLQkJICAgICB1c2UgdGhlIG51bWJlcnMgdGhleSBtZWFuLCByYXRoZXIgdGhhbiByZWx5aW5nIG9uCi0JCSAgICAgYSBteXN0ZXJpb3VzIHNpZ24gZXh0ZW5zaW9uLiAgKi8KLQkJICBtb3JlID0gKGluc24gKyAxIDwgJm1pcHNfb3Bjb2Rlc1tOVU1PUENPREVTXSAmJgotCQkJICBzdHJjbXAgKGluc24tPm5hbWUsIGluc25bMV0ubmFtZSkgPT0gMCk7Ci0JCSAgaWYgKG1vcmUpCi0JCSAgICBtYXggPSAweDgwMDA7Ci0JCSAgZWxzZQotCQkgICAgbWF4ID0gMHgxMDAwMDsKLQkJICBpZiAoKGMgPT0gJ1wwJyAmJiBpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JCSAgICAgIHx8ICgoaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgLTB4ODAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IG1heCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCQkgICAgICB8fCAobW9yZQotCQkJICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAwCi0JCQkgICYmIG1pcHNfb3B0cy5pc2EgPj0gMwotCQkJICAmJiBpbW1fZXhwci5YX3Vuc2lnbmVkCi0JCQkgICYmIHNpemVvZiAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyKSA8PSA0KSkKLQkJICAgIHsKLQkJICAgICAgaWYgKG1vcmUpCi0JCQlicmVhazsKLQkJICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudAotCQkJICAmJiBpbW1fZXhwci5YX29wICE9IE9fYmlnKQotCQkJaW5zbl9lcnJvciA9IF8oImFic29sdXRlIGV4cHJlc3Npb24gcmVxdWlyZWQiKTsKLQkJICAgICAgZWxzZQotCQkJYXNfYmFkIChfKCIxNiBiaXQgZXhwcmVzc2lvbiBub3QgaW4gcmFuZ2UgLTMyNzY4Li4zMjc2NyIpKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdvJzoJCS8qIDE2IGJpdCBvZmZzZXQgKi8KLQkgICAgICBjID0gbXlfZ2V0U21hbGxFeHByZXNzaW9uICgmb2Zmc2V0X2V4cHIsIHMpOwotCi0JICAgICAgLyogSWYgdGhpcyB2YWx1ZSB3b24ndCBmaXQgaW50byBhIDE2IGJpdCBvZmZzZXQsIHRoZW4gZ28KLQkJIGZpbmQgYSBtYWNybyB0aGF0IHdpbGwgZ2VuZXJhdGUgdGhlIDMyIGJpdCBvZmZzZXQKLQkJIGNvZGUgcGF0dGVybi4gIEFzIGEgc3BlY2lhbCBoYWNrLCB3ZSBhY2NlcHQgdGhlCi0JCSBkaWZmZXJlbmNlIG9mIHR3byBsb2NhbCBzeW1ib2xzIGFzIGEgY29uc3RhbnQuICBUaGlzCi0JCSBpcyByZXF1aXJlZCB0byBzdXBwb3NlIGVtYmVkZGVkIFBJQyBzd2l0Y2hlcywgd2hpY2gKLQkJIHVzZSBhbiBpbnN0cnVjdGlvbiB3aGljaCBsb29rcyBsaWtlCi0JCSAgICAgbHcgJDQsJEwxMi0kTFMxMigkNCkKLQkJIFRoZSBwcm9ibGVtIHdpdGggaGFuZGxpbmcgdGhpcyBpbiBhIG1vcmUgZ2VuZXJhbAotCQkgZmFzaGlvbiBpcyB0aGF0IHRoZSBtYWNybyBmdW5jdGlvbiBkb2Vzbid0IGV4cGVjdCB0bwotCQkgc2VlIGFueXRoaW5nIHdoaWNoIGNhbiBiZSBoYW5kbGVkIGluIGEgc2luZ2xlCi0JCSBjb25zdGFudCBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgaWYgKGMgPT0gMAotCQkgICYmIChvZmZzZXRfZXhwci5YX29wICE9IE9fY29uc3RhbnQKLQkJICAgICAgfHwgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IDB4ODAwMAotCQkgICAgICB8fCBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPCAtMHg4MDAwKQotCQkgICYmIChtaXBzX3BpYyAhPSBFTUJFRERFRF9QSUMKLQkJICAgICAgfHwgb2Zmc2V0X2V4cHIuWF9vcCAhPSBPX3N1YnRyYWN0Ci0JCSAgICAgIHx8IG5vd19zZWcgIT0gdGV4dF9zZWN0aW9uCi0JCSAgICAgIHx8IChTX0dFVF9TRUdNRU5UIChvZmZzZXRfZXhwci5YX29wX3N5bWJvbCkKLQkJCSAgIT0gdGV4dF9zZWN0aW9uKSkpCi0JCWJyZWFrOwotCi0JICAgICAgaWYgKGMgPT0gJ2gnIHx8IGMgPT0gJ0gnKQotCQl7Ci0JCSAgaWYgKG9mZnNldF9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQkJICAgIGJyZWFrOwotCQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9Ci0JCSAgICAob2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID4+IDE2KSAmIDB4ZmZmZjsKLQkJfQotCSAgICAgIG9mZnNldF9yZWxvYyA9IEJGRF9SRUxPQ19MTzE2OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdwJzoJCS8qIHBjIHJlbGF0aXZlIG9mZnNldCAqLwotCSAgICAgIG9mZnNldF9yZWxvYyA9IEJGRF9SRUxPQ18xNl9QQ1JFTF9TMjsKLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmb2Zmc2V0X2V4cHIsIHMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICd1JzoJCS8qIHVwcGVyIDE2IGJpdHMgKi8KLQkgICAgICBjID0gbXlfZ2V0U21hbGxFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ19MTzE2OwotCSAgICAgIGlmIChjKQotCQl7Ci0JCSAgaWYgKGMgIT0gJ2wnKQotCQkgICAgewotCQkgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCQkJaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0KLQkJCSAgKGltbV9leHByLlhfYWRkX251bWJlciA+PiAxNikgJiAweGZmZmY7Ci0JCSAgICAgIGVsc2UgaWYgKGMgPT0gJ2gnKQotCQkJewotCQkJICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfSEkxNl9TOwotCQkJICBpbW1fdW5tYXRjaGVkX2hpID0gdHJ1ZTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJaW1tX3JlbG9jID0gQkZEX1JFTE9DX0hJMTY7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCQkgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyICY9IDB4ZmZmZjsKLQkJfQotCSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkJICAmJiAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMAotCQkgICAgICB8fCBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gMHgxMDAwMCkpCi0JCWFzX2JhZCAoXygibHVpIGV4cHJlc3Npb24gbm90IGluIHJhbmdlIDAuLjY1NTM1IikpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdhJzoJCS8qIDI2IGJpdCBhZGRyZXNzICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJm9mZnNldF9leHByLCBzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgb2Zmc2V0X3JlbG9jID0gQkZEX1JFTE9DX01JUFNfSk1QOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ04nOgkJLyogMyBiaXQgYnJhbmNoIGNvbmRpdGlvbiBjb2RlICovCi0JICAgIGNhc2UgJ00nOgkJLyogMyBiaXQgY29tcGFyZSBjb25kaXRpb24gY29kZSAqLwotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJGZjYyIsIDQpICE9IDApCi0JCWJyZWFrOwotCSAgICAgIHMgKz0gNDsKLQkgICAgICByZWdubyA9IDA7Ci0JICAgICAgZG8KLQkJewotCQkgIHJlZ25vICo9IDEwOwotCQkgIHJlZ25vICs9ICpzIC0gJzAnOwotCQkgICsrczsKLQkJfQotCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgqcykpOwotCSAgICAgIGlmIChyZWdubyA+IDcpCi0JCWFzX2JhZCAoXygiaW52YWxpZCBjb25kaXRpb24gY29kZSByZWdpc3RlciAkZmNjJWQiKSwgcmVnbm8pOwotCSAgICAgIGlmICgqYXJncyA9PSAnTicpCi0JCWlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBPUF9TSF9CQ0M7Ci0JICAgICAgZWxzZQotCQlpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgT1BfU0hfQ0NDOwotICAgICAgICAgICAgICBjb250aW51ZTsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2JhZCAoXygiYmFkIGNoYXIgPSAnJWMnXG4iKSwgKmFyZ3MpOwotCSAgICAgIGludGVybmFsRXJyb3IgKCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIC8qIEFyZ3MgZG9uJ3QgbWF0Y2guICAqLwotICAgICAgaWYgKGluc24gKyAxIDwgJm1pcHNfb3Bjb2Rlc1tOVU1PUENPREVTXSAmJgotCSAgIXN0cmNtcCAoaW5zbi0+bmFtZSwgaW5zblsxXS5uYW1lKSkKLQl7Ci0JICArK2luc247Ci0JICBzID0gYXJnc1N0YXJ0OwotCSAgY29udGludWU7Ci0JfQotICAgICAgaW5zbl9lcnJvciA9IF8oImlsbGVnYWwgb3BlcmFuZHMiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgcm91dGluZSBhc3NlbWJsZXMgYW4gaW5zdHJ1Y3Rpb24gaW50byBpdHMgYmluYXJ5IGZvcm1hdCB3aGVuCi0gICBhc3NlbWJsaW5nIGZvciB0aGUgbWlwczE2LiAgQXMgYSBzaWRlIGVmZmVjdCwgaXQgc2V0cyBvbmUgb2YgdGhlCi0gICBnbG9iYWwgdmFyaWFibGVzIGltbV9yZWxvYyBvciBvZmZzZXRfcmVsb2MgdG8gdGhlIHR5cGUgb2YKLSAgIHJlbG9jYXRpb24gdG8gZG8gaWYgb25lIG9mIHRoZSBvcGVyYW5kcyBpcyBhbiBhZGRyZXNzIGV4cHJlc3Npb24uCi0gICBJdCBhbHNvIHNldHMgbWlwczE2X3NtYWxsIGFuZCBtaXBzMTZfZXh0IGlmIHRoZSB1c2VyIGV4cGxpY2l0bHkKLSAgIHJlcXVlc3RlZCBhIHNtYWxsIG9yIGV4dGVuZGVkIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHMxNl9pcCAoc3RyLCBpcCkKLSAgICAgY2hhciAqc3RyOwotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLXsKLSAgY2hhciAqczsKLSAgY29uc3QgY2hhciAqYXJnczsKLSAgc3RydWN0IG1pcHNfb3Bjb2RlICppbnNuOwotICBjaGFyICphcmdzc3RhcnQ7Ci0gIHVuc2lnbmVkIGludCByZWdubzsKLSAgdW5zaWduZWQgaW50IGxhc3RyZWdubyA9IDA7Ci0gIGNoYXIgKnNfcmVzZXQ7Ci0KLSAgaW5zbl9lcnJvciA9IE5VTEw7Ci0KLSAgbWlwczE2X3NtYWxsID0gZmFsc2U7Ci0gIG1pcHMxNl9leHQgPSBmYWxzZTsKLQotICBmb3IgKHMgPSBzdHI7IGlzbG93ZXIgKCpzKTsgKytzKQotICAgIDsKLSAgc3dpdGNoICgqcykKLSAgICB7Ci0gICAgY2FzZSAnXDAnOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcgJzoKLSAgICAgICpzKysgPSAnXDAnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcuJzoKLSAgICAgIGlmIChzWzFdID09ICd0JyAmJiBzWzJdID09ICcgJykKLQl7Ci0JICAqcyA9ICdcMCc7Ci0JICBtaXBzMTZfc21hbGwgPSB0cnVlOwotCSAgcyArPSAzOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZWxzZSBpZiAoc1sxXSA9PSAnZScgJiYgc1syXSA9PSAnICcpCi0JewotCSAgKnMgPSAnXDAnOwotCSAgbWlwczE2X2V4dCA9IHRydWU7Ci0JICBzICs9IDM7Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICBpbnNuX2Vycm9yID0gXygidW5rbm93biBvcGNvZGUiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKG1pcHNfb3B0cy5ub2F1dG9leHRlbmQgJiYgISBtaXBzMTZfZXh0KQotICAgIG1pcHMxNl9zbWFsbCA9IHRydWU7Ci0KLSAgaWYgKChpbnNuID0gKHN0cnVjdCBtaXBzX29wY29kZSAqKSBoYXNoX2ZpbmQgKG1pcHMxNl9vcF9oYXNoLCBzdHIpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluc25fZXJyb3IgPSBfKCJ1bnJlY29nbml6ZWQgb3Bjb2RlIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGFyZ3NzdGFydCA9IHM7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgYXNzZXJ0IChzdHJjbXAgKGluc24tPm5hbWUsIHN0cikgPT0gMCk7Ci0KLSAgICAgIGlwLT5pbnNuX21vID0gaW5zbjsKLSAgICAgIGlwLT5pbnNuX29wY29kZSA9IGluc24tPm1hdGNoOwotICAgICAgaXAtPnVzZV9leHRlbmQgPSBmYWxzZTsKLSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLSAgICAgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0gICAgICBvZmZzZXRfZXhwci5YX29wID0gT19hYnNlbnQ7Ci0gICAgICBvZmZzZXRfcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotICAgICAgZm9yIChhcmdzID0gaW5zbi0+YXJnczsgMTsgKythcmdzKQotCXsKLQkgIGludCBjOwotCi0JICBpZiAoKnMgPT0gJyAnKQotCSAgICArK3M7Ci0KLQkgIC8qIEluIHRoaXMgc3dpdGNoIHN0YXRlbWVudCB3ZSBjYWxsIGJyZWFrIGlmIHdlIGRpZCBub3QgZmluZAotICAgICAgICAgICAgIGEgbWF0Y2gsIGNvbnRpbnVlIGlmIHdlIGRpZCBmaW5kIGEgbWF0Y2gsIG9yIHJldHVybiBpZiB3ZQotICAgICAgICAgICAgIGFyZSBkb25lLiAgKi8KLQotCSAgYyA9ICphcmdzOwotCSAgc3dpdGNoIChjKQotCSAgICB7Ci0JICAgIGNhc2UgJ1wwJzoKLQkgICAgICBpZiAoKnMgPT0gJ1wwJykKLQkJewotCQkgIC8qIFN0dWZmIHRoZSBpbW1lZGlhdGUgdmFsdWUgaW4gbm93LCBpZiB3ZSBjYW4uICAqLwotCQkgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkJICAgICAgJiYgaW1tX3JlbG9jID4gQkZEX1JFTE9DX1VOVVNFRAotCQkgICAgICAmJiBpbnNuLT5waW5mbyAhPSBJTlNOX01BQ1JPKQotCQkgICAgewotCQkgICAgICBtaXBzMTZfaW1tZWQgKChjaGFyICopIE5VTEwsIDAsCi0JCQkJICAgIGltbV9yZWxvYyAtIEJGRF9SRUxPQ19VTlVTRUQsCi0JCQkJICAgIGltbV9leHByLlhfYWRkX251bWJlciwgdHJ1ZSwgbWlwczE2X3NtYWxsLAotCQkJCSAgICBtaXBzMTZfZXh0LCAmaXAtPmluc25fb3Bjb2RlLAotCQkJCSAgICAmaXAtPnVzZV9leHRlbmQsICZpcC0+ZXh0ZW5kKTsKLQkJICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCQkgICAgICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotCQkgICAgfQotCi0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnLCc6Ci0JICAgICAgaWYgKCpzKysgPT0gYykKLQkJY29udGludWU7Ci0JICAgICAgcy0tOwotCSAgICAgIHN3aXRjaCAoKisrYXJncykKLQkJewotCQljYXNlICd2JzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JYOwotCQkgIGNvbnRpbnVlOwotCQljYXNlICd3JzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JZOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnKCc6Ci0JICAgIGNhc2UgJyknOgotCSAgICAgIGlmICgqcysrID09IGMpCi0JCWNvbnRpbnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3YnOgotCSAgICBjYXNlICd3JzoKLQkgICAgICBpZiAoc1swXSAhPSAnJCcpCi0JCXsKLQkJICBpZiAoYyA9PSAndicpCi0JCSAgICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JYOwotCQkgIGVsc2UKLQkJICAgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgTUlQUzE2T1BfU0hfUlk7Ci0JCSAgKythcmdzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgY2FzZSAneCc6Ci0JICAgIGNhc2UgJ3knOgotCSAgICBjYXNlICd6JzoKLQkgICAgY2FzZSAnWic6Ci0JICAgIGNhc2UgJzAnOgotCSAgICBjYXNlICdTJzoKLQkgICAgY2FzZSAnUic6Ci0JICAgIGNhc2UgJ1gnOgotCSAgICBjYXNlICdZJzoKLQkgICAgICBpZiAoc1swXSAhPSAnJCcpCi0JCWJyZWFrOwotCSAgICAgIHNfcmVzZXQgPSBzOwotCSAgICAgIGlmIChpc2RpZ2l0IChzWzFdKSkKLQkJewotCQkgICsrczsKLQkJICByZWdubyA9IDA7Ci0JCSAgZG8KLQkJICAgIHsKLQkJICAgICAgcmVnbm8gKj0gMTA7Ci0JCSAgICAgIHJlZ25vICs9ICpzIC0gJzAnOwotCQkgICAgICArK3M7Ci0JCSAgICB9Ci0JCSAgd2hpbGUgKGlzZGlnaXQgKCpzKSk7Ci0JCSAgaWYgKHJlZ25vID4gMzEpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCByZWdpc3RlciBudW1iZXIgKCVkKSIpLCByZWdubyk7Ci0JCSAgICAgIHJlZ25vID0gMjsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChzWzFdID09ICdmJyAmJiBzWzJdID09ICdwJykKLQkJICAgIHsKLQkJICAgICAgcyArPSAzOwotCQkgICAgICByZWdubyA9IEZQOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ3MnICYmIHNbMl0gPT0gJ3AnKQotCQkgICAgewotCQkgICAgICBzICs9IDM7Ci0JCSAgICAgIHJlZ25vID0gU1A7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAnZycgJiYgc1syXSA9PSAncCcpCi0JCSAgICB7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgICAgcmVnbm8gPSBHUDsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzWzFdID09ICdhJyAmJiBzWzJdID09ICd0JykKLQkJICAgIHsKLQkJICAgICAgcyArPSAzOwotCQkgICAgICByZWdubyA9IEFUOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ2snICYmIHNbMl0gPT0gJ3QnICYmIHNbM10gPT0gJzAnKQotCQkgICAgewotCQkgICAgICBzICs9IDQ7Ci0JCSAgICAgIHJlZ25vID0gS1QwOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ2snICYmIHNbMl0gPT0gJ3QnICYmIHNbM10gPT0gJzEnKQotCQkgICAgewotCQkgICAgICBzICs9IDQ7Ci0JCSAgICAgIHJlZ25vID0gS1QxOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQkrK3M7Ci0JICAgICAgaWYgKGFyZ3NbMV0gIT0gKnMpCi0JCXsKLQkJICBpZiAoYyA9PSAndicgfHwgYyA9PSAndycpCi0JCSAgICB7Ci0JCSAgICAgIHJlZ25vID0gbWlwczE2X3RvXzMyX3JlZ19tYXBbbGFzdHJlZ25vXTsKLQkJICAgICAgcyA9IHNfcmVzZXQ7Ci0JCSAgICAgIGFyZ3MrKzsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3dpdGNoIChjKQotCQl7Ci0JCWNhc2UgJ3gnOgotCQljYXNlICd5JzoKLQkJY2FzZSAneic6Ci0JCWNhc2UgJ3YnOgotCQljYXNlICd3JzoKLQkJY2FzZSAnWic6Ci0JCSAgcmVnbm8gPSBtaXBzMzJfdG9fMTZfcmVnX21hcFtyZWdub107Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnMCc6Ci0JCSAgaWYgKHJlZ25vICE9IDApCi0JCSAgICByZWdubyA9IElMTEVHQUxfUkVHOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1MnOgotCQkgIGlmIChyZWdubyAhPSBTUCkKLQkJICAgIHJlZ25vID0gSUxMRUdBTF9SRUc7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnUic6Ci0JCSAgaWYgKHJlZ25vICE9IFJBKQotCQkgICAgcmVnbm8gPSBJTExFR0FMX1JFRzsKLQkJICBicmVhazsKLQotCQljYXNlICdYJzoKLQkJY2FzZSAnWSc6Ci0JCSAgaWYgKHJlZ25vID09IEFUICYmICEgbWlwc19vcHRzLm5vYXQpCi0JCSAgICBhc193YXJuIChfKCJ1c2VkICRhdCB3aXRob3V0IFwiLnNldCBub2F0XCIiKSk7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBpbnRlcm5hbEVycm9yICgpOwotCQl9Ci0KLQkgICAgICBpZiAocmVnbm8gPT0gSUxMRUdBTF9SRUcpCi0JCWJyZWFrOwotCi0JICAgICAgc3dpdGNoIChjKQotCQl7Ci0JCWNhc2UgJ3gnOgotCQljYXNlICd2JzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgTUlQUzE2T1BfU0hfUlg7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3knOgotCQljYXNlICd3JzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgTUlQUzE2T1BfU0hfUlk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3onOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBNSVBTMTZPUF9TSF9SWjsKLQkJICBicmVhazsKLQkJY2FzZSAnWic6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IE1JUFMxNk9QX1NIX01PVkUzMlo7Ci0JCWNhc2UgJzAnOgotCQljYXNlICdTJzoKLQkJY2FzZSAnUic6Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1gnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBNSVBTMTZPUF9TSF9SRUdSMzI7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1knOgotCQkgIHJlZ25vID0gKChyZWdubyAmIDcpIDw8IDIpIHwgKChyZWdubyAmIDB4MTgpID4+IDMpOwotCQkgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBNSVBTMTZPUF9TSF9SRUczMlI7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgaW50ZXJuYWxFcnJvciAoKTsKLQkJfQotCi0JICAgICAgbGFzdHJlZ25vID0gcmVnbm87Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnUCc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIkcGMiLCAzKSA9PSAwKQotCQl7Ci0JCSAgcyArPSAzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnPCc6Ci0JICAgIGNhc2UgJz4nOgotCSAgICBjYXNlICdbJzoKLQkgICAgY2FzZSAnXSc6Ci0JICAgIGNhc2UgJzQnOgotCSAgICBjYXNlICc1JzoKLQkgICAgY2FzZSAnSCc6Ci0JICAgIGNhc2UgJ1cnOgotCSAgICBjYXNlICdEJzoKLQkgICAgY2FzZSAnaic6Ci0JICAgIGNhc2UgJzgnOgotCSAgICBjYXNlICdWJzoKLQkgICAgY2FzZSAnQyc6Ci0JICAgIGNhc2UgJ1UnOgotCSAgICBjYXNlICdrJzoKLQkgICAgY2FzZSAnSyc6Ci0JICAgICAgaWYgKHNbMF0gPT0gJyUnCi0JCSAgJiYgc3RybmNtcCAocyArIDEsICJncHJlbCgiLCBzaXplb2YgImdwcmVsKCIgLSAxKSA9PSAwKQotCQl7Ci0JCSAgLyogVGhpcyBpcyAlZ3ByZWwoU1lNQk9MKS4gIFdlIG5lZWQgdG8gcmVhZCBTWU1CT0wsCi0gICAgICAgICAgICAgICAgICAgICBhbmQgZ2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIHJlbG9jLiAgSWYgdGhlIHRleHQKLSAgICAgICAgICAgICAgICAgICAgIGluc2lkZSAlZ3ByZWwgaXMgbm90IGEgc3ltYm9sIG5hbWUgd2l0aCBhbgotICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgb2Zmc2V0LCB0aGVuIHdlIGdlbmVyYXRlIGEgbm9ybWFsIHJlbG9jCi0gICAgICAgICAgICAgICAgICAgICBhbmQgd2lsbCBwcm9iYWJseSBmYWlsIGxhdGVyLiAgKi8KLQkJICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMgKyBzaXplb2YgIiVncHJlbCIgLSAxKTsKLQkJICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX3N5bWJvbCkKLQkJICAgIHsKLQkJICAgICAgbWlwczE2X2V4dCA9IHRydWU7Ci0JCSAgICAgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ19NSVBTMTZfR1BSRUw7Ci0JCSAgICAgIHMgPSBleHByX2VuZDsKLQkJICAgICAgaXAtPnVzZV9leHRlbmQgPSB0cnVlOwotCQkgICAgICBpcC0+ZXh0ZW5kID0gMDsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBKdXN0IHBpY2sgdXAgYSBub3JtYWwgZXhwcmVzc2lvbi4gICovCi0JCSAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkJfQotCi0JICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19yZWdpc3RlcikKLQkJewotCQkgIC8qIFdoYXQgd2UgdGhvdWdodCB3YXMgYW4gZXhwcmVzc2lvbiB0dXJuZWQgb3V0IHRvCi0gICAgICAgICAgICAgICAgICAgICBiZSBhIHJlZ2lzdGVyLiAgKi8KLQotCQkgIGlmIChzWzBdID09ICcoJyAmJiBhcmdzWzFdID09ICcoJykKLQkJICAgIHsKLQkJICAgICAgLyogSXQgbG9va3MgbGlrZSB0aGUgZXhwcmVzc2lvbiB3YXMgb21pdHRlZAotCQkJIGJlZm9yZSBhIHJlZ2lzdGVyIGluZGlyZWN0aW9uLCB3aGljaCBtZWFucwotCQkJIHRoYXQgdGhlIGV4cHJlc3Npb24gaXMgaW1wbGljaXRseSB6ZXJvLiAgV2UKLQkJCSBzdGlsbCBzZXQgdXAgaW1tX2V4cHIsIHNvIHRoYXQgd2UgaGFuZGxlCi0JCQkgZXhwbGljaXQgZXh0ZW5zaW9ucyBjb3JyZWN0bHkuICAqLwotCQkgICAgICBpbW1fZXhwci5YX29wID0gT19jb25zdGFudDsKLQkJICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQkJICAgICAgaW1tX3JlbG9jID0gKGludCkgQkZEX1JFTE9DX1VOVVNFRCArIGM7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCi0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIFdlIG5lZWQgdG8gcmVsYXggdGhpcyBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgaW1tX3JlbG9jID0gKGludCkgQkZEX1JFTE9DX1VOVVNFRCArIGM7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3AnOgotCSAgICBjYXNlICdxJzoKLQkgICAgY2FzZSAnQSc6Ci0JICAgIGNhc2UgJ0InOgotCSAgICBjYXNlICdFJzoKLQkgICAgICAvKiBXZSB1c2Ugb2Zmc2V0X3JlbG9jIHJhdGhlciB0aGFuIGltbV9yZWxvYyBmb3IgdGhlIFBDCi0gICAgICAgICAgICAgICAgIHJlbGF0aXZlIG9wZXJhbmRzLiAgVGhpcyBsZXRzIG1hY3JvcyB3aXRoIGJvdGgKLSAgICAgICAgICAgICAgICAgaW1tZWRpYXRlIGFuZCBhZGRyZXNzIG9wZXJhbmRzIHdvcmsgY29ycmVjdGx5LiAgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmb2Zmc2V0X2V4cHIsIHMpOwotCi0JICAgICAgaWYgKG9mZnNldF9leHByLlhfb3AgPT0gT19yZWdpc3RlcikKLQkJYnJlYWs7Ci0KLQkgICAgICAvKiBXZSBuZWVkIHRvIHJlbGF4IHRoaXMgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIG9mZnNldF9yZWxvYyA9IChpbnQpIEJGRF9SRUxPQ19VTlVTRUQgKyBjOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICc2JzoJCS8qIGJyZWFrIGNvZGUgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gNjMpCi0JCXsKLQkJICBhc193YXJuIChfKCJJbnZhbGlkIHZhbHVlIGZvciBgJXMnICglbHUpIiksCi0JCQkgICBpcC0+aW5zbl9tby0+bmFtZSwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCQkgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweDNmOwotCQl9Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGltbV9leHByLlhfYWRkX251bWJlciA8PCBNSVBTMTZPUF9TSF9JTU02OwotCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnYSc6CQkvKiAyNiBiaXQgYWRkcmVzcyAqLwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZvZmZzZXRfZXhwciwgcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIG9mZnNldF9yZWxvYyA9IEJGRF9SRUxPQ19NSVBTMTZfSk1QOwotCSAgICAgIGlwLT5pbnNuX29wY29kZSA8PD0gMTY7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnbCc6CQkvKiByZWdpc3RlciBsaXN0IGZvciBlbnRyeSBtYWNybyAqLwotCSAgICBjYXNlICdMJzoJCS8qIHJlZ2lzdGVyIGxpc3QgZm9yIGV4aXQgbWFjcm8gKi8KLQkgICAgICB7Ci0JCWludCBtYXNrOwotCi0JCWlmIChjID09ICdsJykKLQkJICBtYXNrID0gMDsKLQkJZWxzZQotCQkgIG1hc2sgPSA3IDw8IDM7Ci0JCXdoaWxlICgqcyAhPSAnXDAnKQotCQkgIHsKLQkJICAgIGludCBmcmVnLCByZWcxLCByZWcyOwotCi0JCSAgICB3aGlsZSAoKnMgPT0gJyAnIHx8ICpzID09ICcsJykKLQkJICAgICAgKytzOwotCQkgICAgaWYgKCpzICE9ICckJykKLQkJICAgICAgewotCQkJYXNfYmFkIChfKCJjYW4ndCBwYXJzZSByZWdpc3RlciBsaXN0IikpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgICsrczsKLQkJICAgIGlmICgqcyAhPSAnZicpCi0JCSAgICAgIGZyZWcgPSAwOwotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQlmcmVnID0gMTsKLQkJCSsrczsKLQkJICAgICAgfQotCQkgICAgcmVnMSA9IDA7Ci0JCSAgICB3aGlsZSAoaXNkaWdpdCAoKnMpKQotCQkgICAgICB7Ci0JCQlyZWcxICo9IDEwOwotCQkJcmVnMSArPSAqcyAtICcwJzsKLQkJCSsrczsKLQkJICAgICAgfQotCQkgICAgaWYgKCpzID09ICcgJykKLQkJICAgICAgKytzOwotCQkgICAgaWYgKCpzICE9ICctJykKLQkJICAgICAgcmVnMiA9IHJlZzE7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCSsrczsKLQkJCWlmICgqcyAhPSAnJCcpCi0JCQkgIGJyZWFrOwotCQkJKytzOwotCQkJaWYgKGZyZWcpCi0JCQkgIHsKLQkJCSAgICBpZiAoKnMgPT0gJ2YnKQotCQkJICAgICAgKytzOwotCQkJICAgIGVsc2UKLQkJCSAgICAgIHsKLQkJCQlhc19iYWQgKF8oImludmFsaWQgcmVnaXN0ZXIgbGlzdCIpKTsKLQkJCQlicmVhazsKLQkJCSAgICAgIH0KLQkJCSAgfQotCQkJcmVnMiA9IDA7Ci0JCQl3aGlsZSAoaXNkaWdpdCAoKnMpKQotCQkJICB7Ci0JCQkgICAgcmVnMiAqPSAxMDsKLQkJCSAgICByZWcyICs9ICpzIC0gJzAnOwotCQkJICAgICsrczsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgICBpZiAoZnJlZyAmJiByZWcxID09IDAgJiYgcmVnMiA9PSAwICYmIGMgPT0gJ0wnKQotCQkgICAgICB7Ci0JCQltYXNrICY9IH4gKDcgPDwgMyk7Ci0JCQltYXNrIHw9IDUgPDwgMzsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoZnJlZyAmJiByZWcxID09IDAgJiYgcmVnMiA9PSAxICYmIGMgPT0gJ0wnKQotCQkgICAgICB7Ci0JCQltYXNrICY9IH4gKDcgPDwgMyk7Ci0JCQltYXNrIHw9IDYgPDwgMzsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAocmVnMSA9PSA0ICYmIHJlZzIgPj0gNCAmJiByZWcyIDw9IDcgJiYgYyAhPSAnTCcpCi0JCSAgICAgIG1hc2sgfD0gKHJlZzIgLSAzKSA8PCAzOwotCQkgICAgZWxzZSBpZiAocmVnMSA9PSAxNiAmJiByZWcyID49IDE2ICYmIHJlZzIgPD0gMTcpCi0JCSAgICAgIG1hc2sgfD0gKHJlZzIgLSAxNSkgPDwgMTsKLQkJICAgIGVsc2UgaWYgKHJlZzEgPT0gMzEgJiYgcmVnMiA9PSAzMSkKLQkJICAgICAgbWFzayB8PSAxOwotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQlhc19iYWQgKF8oImludmFsaWQgcmVnaXN0ZXIgbGlzdCIpKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgfQotCQkvKiBUaGUgbWFzayBpcyBmaWxsZWQgaW4gaW4gdGhlIG9wY29kZSB0YWJsZSBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgYmVuZWZpdCBvZiB0aGUgZGlzYXNzZW1ibGVyLiAgV2UgcmVtb3ZlIGl0IGJlZm9yZQotICAgICAgICAgICAgICAgICAgIGFwcGx5aW5nIHRoZSBhY3R1YWwgbWFzay4gICovCi0JCWlwLT5pbnNuX29wY29kZSAmPSB+ICgoNyA8PCAzKSA8PCBNSVBTMTZPUF9TSF9JTU02KTsKLQkJaXAtPmluc25fb3Bjb2RlIHw9IG1hc2sgPDwgTUlQUzE2T1BfU0hfSU1NNjsKLQkgICAgICB9Ci0JICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ2UnOgkJLyogZXh0ZW5kIGNvZGUgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gMHg3ZmYpCi0JCXsKLQkJICBhc193YXJuIChfKCJJbnZhbGlkIHZhbHVlIGZvciBgJXMnICglbHUpIiksCi0JCQkgICBpcC0+aW5zbl9tby0+bmFtZSwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCQkgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweDdmZjsKLQkJfQotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGludGVybmFsRXJyb3IgKCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogQXJncyBkb24ndCBtYXRjaC4gICovCi0gICAgICBpZiAoaW5zbiArIDEgPCAmbWlwczE2X29wY29kZXNbYmZkX21pcHMxNl9udW1fb3Bjb2Rlc10gJiYKLQkgIHN0cmNtcCAoaW5zbi0+bmFtZSwgaW5zblsxXS5uYW1lKSA9PSAwKQotCXsKLQkgICsraW5zbjsKLQkgIHMgPSBhcmdzc3RhcnQ7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGluc25fZXJyb3IgPSBfKCJpbGxlZ2FsIG9wZXJhbmRzIik7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIHdlIGtub3cgYWJvdXQgYSBtaXBzMTYgaW1tZWRpYXRlCi0gICBhcmd1bWVudCB0eXBlLiAgKi8KLQotc3RydWN0IG1pcHMxNl9pbW1lZF9vcGVyYW5kCi17Ci0gIC8qIFRoZSB0eXBlIGNvZGUgdXNlZCBpbiB0aGUgYXJndW1lbnQgc3RyaW5nIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLwotICBpbnQgdHlwZTsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBzaG9ydCBmb3JtIG9mIHRoZSBvcGNvZGUuICAqLwotICBpbnQgbmJpdHM7Ci0gIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgZXh0ZW5kZWQgZm9ybSBvZiB0aGUgb3Bjb2RlLiAgKi8KLSAgaW50IGV4dGJpdHM7Ci0gIC8qIFRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIHNob3J0IGZvcm0gaXMgc2hpZnRlZCB3aGVuIGl0IGlzIHVzZWQ7Ci0gICAgIGZvciBleGFtcGxlLCB0aGUgc3cgaW5zdHJ1Y3Rpb24gaGFzIGEgc2hpZnQgY291bnQgb2YgMi4gICovCi0gIGludCBzaGlmdDsKLSAgLyogVGhlIGFtb3VudCBieSB3aGljaCB0aGUgc2hvcnQgZm9ybSBpcyBzaGlmdGVkIHdoZW4gaXQgaXMgc3RvcmVkCi0gICAgIGludG8gdGhlIGluc3RydWN0aW9uIGNvZGUuICAqLwotICBpbnQgb3Bfc2hpZnQ7Ci0gIC8qIE5vbi16ZXJvIGlmIHRoZSBzaG9ydCBmb3JtIGlzIHVuc2lnbmVkLiAgKi8KLSAgaW50IHVuc3A7Ci0gIC8qIE5vbi16ZXJvIGlmIHRoZSBleHRlbmRlZCBmb3JtIGlzIHVuc2lnbmVkLiAgKi8KLSAgaW50IGV4dHU7Ci0gIC8qIE5vbi16ZXJvIGlmIHRoZSB2YWx1ZSBpcyBQQyByZWxhdGl2ZS4gICovCi0gIGludCBwY3JlbDsKLX07Ci0KLS8qIFRoZSBtaXBzMTYgaW1tZWRpYXRlIG9wZXJhbmQgdHlwZXMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1pcHMxNl9pbW1lZF9vcGVyYW5kIG1pcHMxNl9pbW1lZF9vcGVyYW5kc1tdID0KLXsKLSAgeyAnPCcsICAzLCAgNSwgMCwgTUlQUzE2T1BfU0hfUlosICAgMSwgMSwgMCB9LAotICB7ICc+JywgIDMsICA1LCAwLCBNSVBTMTZPUF9TSF9SWCwgICAxLCAxLCAwIH0sCi0gIHsgJ1snLCAgMywgIDYsIDAsIE1JUFMxNk9QX1NIX1JaLCAgIDEsIDEsIDAgfSwKLSAgeyAnXScsICAzLCAgNiwgMCwgTUlQUzE2T1BfU0hfUlgsICAgMSwgMSwgMCB9LAotICB7ICc0JywgIDQsIDE1LCAwLCBNSVBTMTZPUF9TSF9JTU00LCAwLCAwLCAwIH0sCi0gIHsgJzUnLCAgNSwgMTYsIDAsIE1JUFMxNk9QX1NIX0lNTTUsIDEsIDAsIDAgfSwKLSAgeyAnSCcsICA1LCAxNiwgMSwgTUlQUzE2T1BfU0hfSU1NNSwgMSwgMCwgMCB9LAotICB7ICdXJywgIDUsIDE2LCAyLCBNSVBTMTZPUF9TSF9JTU01LCAxLCAwLCAwIH0sCi0gIHsgJ0QnLCAgNSwgMTYsIDMsIE1JUFMxNk9QX1NIX0lNTTUsIDEsIDAsIDAgfSwKLSAgeyAnaicsICA1LCAxNiwgMCwgTUlQUzE2T1BfU0hfSU1NNSwgMCwgMCwgMCB9LAotICB7ICc4JywgIDgsIDE2LCAwLCBNSVBTMTZPUF9TSF9JTU04LCAxLCAwLCAwIH0sCi0gIHsgJ1YnLCAgOCwgMTYsIDIsIE1JUFMxNk9QX1NIX0lNTTgsIDEsIDAsIDAgfSwKLSAgeyAnQycsICA4LCAxNiwgMywgTUlQUzE2T1BfU0hfSU1NOCwgMSwgMCwgMCB9LAotICB7ICdVJywgIDgsIDE2LCAwLCBNSVBTMTZPUF9TSF9JTU04LCAxLCAxLCAwIH0sCi0gIHsgJ2snLCAgOCwgMTYsIDAsIE1JUFMxNk9QX1NIX0lNTTgsIDAsIDAsIDAgfSwKLSAgeyAnSycsICA4LCAxNiwgMywgTUlQUzE2T1BfU0hfSU1NOCwgMCwgMCwgMCB9LAotICB7ICdwJywgIDgsIDE2LCAwLCBNSVBTMTZPUF9TSF9JTU04LCAwLCAwLCAxIH0sCi0gIHsgJ3EnLCAxMSwgMTYsIDAsIE1JUFMxNk9QX1NIX0lNTTgsIDAsIDAsIDEgfSwKLSAgeyAnQScsICA4LCAxNiwgMiwgTUlQUzE2T1BfU0hfSU1NOCwgMSwgMCwgMSB9LAotICB7ICdCJywgIDUsIDE2LCAzLCBNSVBTMTZPUF9TSF9JTU01LCAxLCAwLCAxIH0sCi0gIHsgJ0UnLCAgNSwgMTYsIDIsIE1JUFMxNk9QX1NIX0lNTTUsIDEsIDAsIDEgfQotfTsKLQotI2RlZmluZSBNSVBTMTZfTlVNX0lNTUVEIFwKLSAgKHNpemVvZiBtaXBzMTZfaW1tZWRfb3BlcmFuZHMgLyBzaXplb2YgbWlwczE2X2ltbWVkX29wZXJhbmRzWzBdKQotCi0vKiBIYW5kbGUgYSBtaXBzMTYgaW5zdHJ1Y3Rpb24gd2l0aCBhbiBpbW1lZGlhdGUgdmFsdWUuICBUaGlzIG9yJ3MgdGhlCi0gICBzbWFsbCBpbW1lZGlhdGUgdmFsdWUgaW50byAqSU5TTi4gIEl0IHNldHMgKlVTRV9FWFRFTkQgdG8gaW5kaWNhdGUKLSAgIHdoZXRoZXIgYW4gZXh0ZW5kZWQgdmFsdWUgaXMgbmVlZGVkOyBpZiBvbmUgaXMgbmVlZGVkLCBpdCBzZXRzCi0gICAqRVhURU5EIHRvIHRoZSB2YWx1ZS4gIFRoZSBhcmd1bWVudCB0eXBlIGlzIFRZUEUuICBUaGUgdmFsdWUgaXMgVkFMLgotICAgSWYgU01BTEwgaXMgdHJ1ZSwgYW4gdW5leHRlbmRlZCBvcGNvZGUgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLgotICAgSWYgRVhUIGlzIHRydWUsIGFuIGV4dGVuZGVkIG9wY29kZSB3YXMgZXhwbGljaXRseSByZXF1ZXN0ZWQuICBJZgotICAgV0FSTiBpcyB0cnVlLCB3YXJuIGlmIEVYVCBkb2VzIG5vdCBtYXRjaCByZWFsaXR5LiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHMxNl9pbW1lZCAoZmlsZSwgbGluZSwgdHlwZSwgdmFsLCB3YXJuLCBzbWFsbCwgZXh0LCBpbnNuLCB1c2VfZXh0ZW5kLAotCSAgICAgIGV4dGVuZCkKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgIGludCB0eXBlOwotICAgICBvZmZzZXRUIHZhbDsKLSAgICAgYm9vbGVhbiB3YXJuOwotICAgICBib29sZWFuIHNtYWxsOwotICAgICBib29sZWFuIGV4dDsKLSAgICAgdW5zaWduZWQgbG9uZyAqaW5zbjsKLSAgICAgYm9vbGVhbiAqdXNlX2V4dGVuZDsKLSAgICAgdW5zaWduZWQgc2hvcnQgKmV4dGVuZDsKLXsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1pcHMxNl9pbW1lZF9vcGVyYW5kICpvcDsKLSAgaW50IG1pbnRpbnksIG1heHRpbnk7Ci0gIGJvb2xlYW4gbmVlZGV4dDsKLQotICBvcCA9IG1pcHMxNl9pbW1lZF9vcGVyYW5kczsKLSAgd2hpbGUgKG9wLT50eXBlICE9IHR5cGUpCi0gICAgewotICAgICAgKytvcDsKLSAgICAgIGFzc2VydCAob3AgPCBtaXBzMTZfaW1tZWRfb3BlcmFuZHMgKyBNSVBTMTZfTlVNX0lNTUVEKTsKLSAgICB9Ci0KLSAgaWYgKG9wLT51bnNwKQotICAgIHsKLSAgICAgIGlmICh0eXBlID09ICc8JyB8fCB0eXBlID09ICc+JyB8fCB0eXBlID09ICdbJyB8fCB0eXBlID09ICddJykKLQl7Ci0JICBtaW50aW55ID0gMTsKLQkgIG1heHRpbnkgPSAxIDw8IG9wLT5uYml0czsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWludGlueSA9IDA7Ci0JICBtYXh0aW55ID0gKDEgPDwgb3AtPm5iaXRzKSAtIDE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG1pbnRpbnkgPSAtICgxIDw8IChvcC0+bmJpdHMgLSAxKSk7Ci0gICAgICBtYXh0aW55ID0gKDEgPDwgKG9wLT5uYml0cyAtIDEpKSAtIDE7Ci0gICAgfQotCi0gIC8qIEJyYW5jaCBvZmZzZXRzIGhhdmUgYW4gaW1wbGljaXQgMCBpbiB0aGUgbG93ZXN0IGJpdC4gICovCi0gIGlmICh0eXBlID09ICdwJyB8fCB0eXBlID09ICdxJykKLSAgICB2YWwgLz0gMjsKLQotICBpZiAoKHZhbCAmICgoMSA8PCBvcC0+c2hpZnQpIC0gMSkpICE9IDAKLSAgICAgIHx8IHZhbCA8IChtaW50aW55IDw8IG9wLT5zaGlmdCkKLSAgICAgIHx8IHZhbCA+IChtYXh0aW55IDw8IG9wLT5zaGlmdCkpCi0gICAgbmVlZGV4dCA9IHRydWU7Ci0gIGVsc2UKLSAgICBuZWVkZXh0ID0gZmFsc2U7Ci0KLSAgaWYgKHdhcm4gJiYgZXh0ICYmICEgbmVlZGV4dCkKLSAgICBhc193YXJuX3doZXJlIChmaWxlLCBsaW5lLCBfKCJleHRlbmRlZCBvcGVyYW5kIHJlcXVlc3RlZCBidXQgbm90IHJlcXVpcmVkIikpOwotICBpZiAoc21hbGwgJiYgbmVlZGV4dCkKLSAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsIF8oImludmFsaWQgdW5leHRlbmRlZCBvcGVyYW5kIHZhbHVlIikpOwotCi0gIGlmIChzbWFsbCB8fCAoISBleHQgJiYgISBuZWVkZXh0KSkKLSAgICB7Ci0gICAgICBpbnQgaW5zbnZhbDsKLQotICAgICAgKnVzZV9leHRlbmQgPSBmYWxzZTsKLSAgICAgIGluc252YWwgPSAoKHZhbCA+PiBvcC0+c2hpZnQpICYgKCgxIDw8IG9wLT5uYml0cykgLSAxKSk7Ci0gICAgICBpbnNudmFsIDw8PSBvcC0+b3Bfc2hpZnQ7Ci0gICAgICAqaW5zbiB8PSBpbnNudmFsOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgbWluZXh0LCBtYXhleHQ7Ci0gICAgICBpbnQgZXh0dmFsOwotCi0gICAgICBpZiAob3AtPmV4dHUpCi0JewotCSAgbWluZXh0ID0gMDsKLQkgIG1heGV4dCA9ICgxIDw8IG9wLT5leHRiaXRzKSAtIDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1pbmV4dCA9IC0gKDEgPDwgKG9wLT5leHRiaXRzIC0gMSkpOwotCSAgbWF4ZXh0ID0gKDEgPDwgKG9wLT5leHRiaXRzIC0gMSkpIC0gMTsKLQl9Ci0gICAgICBpZiAodmFsIDwgbWluZXh0IHx8IHZhbCA+IG1heGV4dCkKLQlhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsCi0JCSAgICAgIF8oIm9wZXJhbmQgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciBpbnN0cnVjdGlvbiIpKTsKLQotICAgICAgKnVzZV9leHRlbmQgPSB0cnVlOwotICAgICAgaWYgKG9wLT5leHRiaXRzID09IDE2KQotCXsKLQkgIGV4dHZhbCA9ICgodmFsID4+IDExKSAmIDB4MWYpIHwgKHZhbCAmIDB4N2UwKTsKLQkgIHZhbCAmPSAweDFmOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wLT5leHRiaXRzID09IDE1KQotCXsKLQkgIGV4dHZhbCA9ICgodmFsID4+IDExKSAmIDB4ZikgfCAodmFsICYgMHg3ZjApOwotCSAgdmFsICY9IDB4ZjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXh0dmFsID0gKCh2YWwgJiAweDFmKSA8PCA2KSB8ICh2YWwgJiAweDIwKTsKLQkgIHZhbCA9IDA7Ci0JfQotCi0gICAgICAqZXh0ZW5kID0gKHVuc2lnbmVkIHNob3J0KSBleHR2YWw7Ci0gICAgICAqaW5zbiB8PSB2YWw7Ci0gICAgfQotfQotDAotI2RlZmluZSBMUCAnKCcKLSNkZWZpbmUgUlAgJyknCi0KLXN0YXRpYyBpbnQKLW15X2dldFNtYWxsRXhwcmVzc2lvbiAoZXAsIHN0cikKLSAgICAgZXhwcmVzc2lvblMgKmVwOwotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnNwOwotICBpbnQgYyA9IDA7Ci0KLSAgaWYgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotICBpZiAoKnN0ciA9PSBMUAotICAgICAgfHwgKCpzdHIgPT0gJyUnICYmCi0JICAoKHN0clsxXSA9PSAnaCcgJiYgc3RyWzJdID09ICdpJykKLQkgICB8fCAoc3RyWzFdID09ICdIJyAmJiBzdHJbMl0gPT0gJ0knKQotCSAgIHx8IChzdHJbMV0gPT0gJ2wnICYmIHN0clsyXSA9PSAnbycpKQotCSAgJiYgc3RyWzNdID09IExQKSkKLSAgICB7Ci0gICAgICBpZiAoKnN0ciA9PSBMUCkKLQljID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBjID0gc3RyWzFdOwotCSAgc3RyICs9IDM7Ci0JfQotCi0gICAgICAvKgotICAgICAgICogQSBzbWFsbCBleHByZXNzaW9uIG1heSBiZSBmb2xsb3dlZCBieSBhIGJhc2UgcmVnaXN0ZXIuCi0gICAgICAgKiBTY2FuIHRvIHRoZSBlbmQgb2YgdGhpcyBvcGVyYW5kLCBhbmQgdGhlbiBiYWNrIG92ZXIgYSBwb3NzaWJsZQotICAgICAgICogYmFzZSByZWdpc3Rlci4gIFRoZW4gc2NhbiB0aGUgc21hbGwgZXhwcmVzc2lvbiB1cCB0byB0aGF0Ci0gICAgICAgKiBwb2ludC4gIChCYXNlZCBvbiBjb2RlIGluIHNwYXJjLmMuLi4pCi0gICAgICAgKi8KLSAgICAgIGZvciAoc3AgPSBzdHI7ICpzcCAmJiAqc3AgIT0gJywnOyBzcCsrKQotCTsKLSAgICAgIGlmIChzcCAtIDQgPj0gc3RyICYmIHNwWy0xXSA9PSBSUCkKLQl7Ci0JICBpZiAoaXNkaWdpdCAoc3BbLTJdKSkKLQkgICAgewotCSAgICAgIGZvciAoc3AgLT0gMzsgc3AgPj0gc3RyICYmIGlzZGlnaXQgKCpzcCk7IHNwLS0pCi0JCTsKLQkgICAgICBpZiAoKnNwID09ICckJyAmJiBzcCA+IHN0ciAmJiBzcFstMV0gPT0gTFApCi0JCXsKLQkJICBzcC0tOwotCQkgIGdvdG8gZG9faXQ7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoc3AgLSA1ID49IHN0cgotCQkgICAmJiBzcFstNV0gPT0gTFAKLQkJICAgJiYgc3BbLTRdID09ICckJwotCQkgICAmJiAoKHNwWy0zXSA9PSAnZicgJiYgc3BbLTJdID09ICdwJykKLQkJICAgICAgIHx8IChzcFstM10gPT0gJ3MnICYmIHNwWy0yXSA9PSAncCcpCi0JCSAgICAgICB8fCAoc3BbLTNdID09ICdnJyAmJiBzcFstMl0gPT0gJ3AnKQotCQkgICAgICAgfHwgKHNwWy0zXSA9PSAnYScgJiYgc3BbLTJdID09ICd0JykpKQotCSAgICB7Ci0JICAgICAgc3AgLT0gNTsKLQkgICAgZG9faXQ6Ci0JICAgICAgaWYgKHNwID09IHN0cikKLQkJewotCQkgIC8qIG5vIGV4cHJlc3Npb24gbWVhbnMgemVybyBvZmZzZXQgKi8KLQkJICBpZiAoYykKLQkJICAgIHsKLQkJICAgICAgLyogJXh4KHJlZykgaXMgYW4gZXJyb3IgKi8KLQkJICAgICAgZXAtPlhfb3AgPSBPX2Fic2VudDsKLQkJICAgICAgZXhwcl9lbmQgPSBzdHIgLSAzOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgZXAtPlhfb3AgPSBPX2NvbnN0YW50OwotCQkgICAgICBleHByX2VuZCA9IHNwOwotCQkgICAgfQotCQkgIGVwLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotCQkgIGVwLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JCSAgZXAtPlhfYWRkX251bWJlciA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAqc3AgPSAnXDAnOwotCQkgIG15X2dldEV4cHJlc3Npb24gKGVwLCBzdHIpOwotCQkgICpzcCA9IExQOwotCQl9Ci0JICAgICAgcmV0dXJuIGM7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBteV9nZXRFeHByZXNzaW9uIChlcCwgc3RyKTsKLSAgcmV0dXJuIGM7CQkJLyogPT4gJWhpIG9yICVsbyBlbmNvdW50ZXJlZCAqLwotfQotCi1zdGF0aWMgdm9pZAotbXlfZ2V0RXhwcmVzc2lvbiAoZXAsIHN0cikKLSAgICAgZXhwcmVzc2lvblMgKmVwOwotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnNhdmVfaW47Ci0KLSAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotICBleHByZXNzaW9uIChlcCk7Ci0gIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotCi0gIC8qIElmIHdlIGFyZSBpbiBtaXBzMTYgbW9kZSwgYW5kIHRoaXMgaXMgYW4gZXhwcmVzc2lvbiBiYXNlZCBvbiBgLicsCi0gICAgIHRoZW4gd2UgYnVtcCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBieSAxIHNpbmNlIHRoYXQgaXMgaG93IG90aGVyCi0gICAgIHRleHQgc3ltYm9scyBhcmUgaGFuZGxlZC4gIFdlIGRvbid0IGJvdGhlciB0byBoYW5kbGUgY29tcGxleAotICAgICBleHByZXNzaW9ucywganVzdCBgLicgcGx1cyBvciBtaW51cyBhIGNvbnN0YW50LiAgKi8KLSAgaWYgKG1pcHNfb3B0cy5taXBzMTYKLSAgICAgICYmIGVwLT5YX29wID09IE9fc3ltYm9sCi0gICAgICAmJiBzdHJjbXAgKFNfR0VUX05BTUUgKGVwLT5YX2FkZF9zeW1ib2wpLCBGQUtFX0xBQkVMX05BTUUpID09IDAKLSAgICAgICYmIFNfR0VUX1NFR01FTlQgKGVwLT5YX2FkZF9zeW1ib2wpID09IG5vd19zZWcKLSAgICAgICYmIGVwLT5YX2FkZF9zeW1ib2wtPnN5X2ZyYWcgPT0gZnJhZ19ub3cKLSAgICAgICYmIGVwLT5YX2FkZF9zeW1ib2wtPnN5X3ZhbHVlLlhfb3AgPT0gT19jb25zdGFudAotICAgICAgJiYgZXAtPlhfYWRkX3N5bWJvbC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyID09IGZyYWdfbm93X2ZpeCAoKSkKLSAgICArK2VwLT5YX2FkZF9zeW1ib2wtPnN5X3ZhbHVlLlhfYWRkX251bWJlcjsKLX0KLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICBvZiB0eXBlIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyCi0gICBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzCi0gICByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4gICovCi0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07Ci0gIGNoYXIgKnQ7Ci0gIGludCBpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogMjsKLQotICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRQICs9IDI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRQICs9IDI7Ci0JfQotICAgIH0KLSAgICAgCi0gIHJldHVybiBOVUxMOwotfQotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotICBlbHNlCi0gICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotDAotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIk86Omc6Okc6IjsKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotI2RlZmluZSBPUFRJT05fTUlQUzEgKE9QVElPTl9NRF9CQVNFICsgMSkKLSAgeyJtaXBzMCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlQUzF9LAotICB7Im1pcHMxIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSVBTMX0sCi0jZGVmaW5lIE9QVElPTl9NSVBTMiAoT1BUSU9OX01EX0JBU0UgKyAyKQotICB7Im1pcHMyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSVBTMn0sCi0jZGVmaW5lIE9QVElPTl9NSVBTMyAoT1BUSU9OX01EX0JBU0UgKyAzKQotICB7Im1pcHMzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSVBTM30sCi0jZGVmaW5lIE9QVElPTl9NSVBTNCAoT1BUSU9OX01EX0JBU0UgKyA0KQotICB7Im1pcHM0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSVBTNH0sCi0jZGVmaW5lIE9QVElPTl9NQ1BVIChPUFRJT05fTURfQkFTRSArIDUpCi0gIHsibWNwdSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUNQVX0sCi0jZGVmaW5lIE9QVElPTl9NRU1CRURERURfUElDIChPUFRJT05fTURfQkFTRSArIDYpCi0gIHsibWVtYmVkZGVkLXBpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUVNQkVEREVEX1BJQ30sCi0jZGVmaW5lIE9QVElPTl9UUkFQIChPUFRJT05fTURfQkFTRSArIDkpCi0gIHsidHJhcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBUH0sCi0gIHsibm8tYnJlYWsiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RSQVB9LAotI2RlZmluZSBPUFRJT05fQlJFQUsgKE9QVElPTl9NRF9CQVNFICsgMTApCi0gIHsiYnJlYWsiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JSRUFLfSwKLSAgeyJuby10cmFwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CUkVBS30sCi0jZGVmaW5lIE9QVElPTl9FQiAoT1BUSU9OX01EX0JBU0UgKyAxMSkKLSAgeyJFQiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRUJ9LAotI2RlZmluZSBPUFRJT05fRUwgKE9QVElPTl9NRF9CQVNFICsgMTIpCi0gIHsiRUwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VMfSwKLSNkZWZpbmUgT1BUSU9OX000NjUwIChPUFRJT05fTURfQkFTRSArIDEzKQotICB7Im00NjUwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NNDY1MH0sCi0jZGVmaW5lIE9QVElPTl9OT19NNDY1MCAoT1BUSU9OX01EX0JBU0UgKyAxNCkKLSAgeyJuby1tNDY1MCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fTTQ2NTB9LAotI2RlZmluZSBPUFRJT05fTTQwMTAgKE9QVElPTl9NRF9CQVNFICsgMTUpCi0gIHsibTQwMTAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX000MDEwfSwKLSNkZWZpbmUgT1BUSU9OX05PX000MDEwIChPUFRJT05fTURfQkFTRSArIDE2KQotICB7Im5vLW00MDEwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19NNDAxMH0sCi0jZGVmaW5lIE9QVElPTl9NNDEwMCAoT1BUSU9OX01EX0JBU0UgKyAxNykKLSAgeyJtNDEwMCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTTQxMDB9LAotI2RlZmluZSBPUFRJT05fTk9fTTQxMDAgKE9QVElPTl9NRF9CQVNFICsgMTgpCi0gIHsibm8tbTQxMDAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX000MTAwfSwKLSNkZWZpbmUgT1BUSU9OX01JUFMxNiAoT1BUSU9OX01EX0JBU0UgKyAyMikKLSAgeyJtaXBzMTYiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JUFMxNn0sCi0jZGVmaW5lIE9QVElPTl9OT19NSVBTMTYgKE9QVElPTl9NRF9CQVNFICsgMjMpCi0gIHsibm8tbWlwczE2Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19NSVBTMTZ9LAotI2RlZmluZSBPUFRJT05fTTM5MDAgKE9QVElPTl9NRF9CQVNFICsgMjYpCi0gIHsibTM5MDAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX00zOTAwfSwKLSNkZWZpbmUgT1BUSU9OX05PX00zOTAwIChPUFRJT05fTURfQkFTRSArIDI3KQotICB7Im5vLW0zOTAwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19NMzkwMH0sCi0KLQotI2RlZmluZSBPUFRJT05fTUFCSSAoT1BUSU9OX01EX0JBU0UgKyAzOCkKLSAgeyJtYWJpIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUJJfSwKLQotI2RlZmluZSBPUFRJT05fQ0FMTF9TSEFSRUQgKE9QVElPTl9NRF9CQVNFICsgNykKLSNkZWZpbmUgT1BUSU9OX05PTl9TSEFSRUQgKE9QVElPTl9NRF9CQVNFICsgOCkKLSNkZWZpbmUgT1BUSU9OX1hHT1QgKE9QVElPTl9NRF9CQVNFICsgMTkpCi0jZGVmaW5lIE9QVElPTl8zMiAoT1BUSU9OX01EX0JBU0UgKyAyMCkKLSNkZWZpbmUgT1BUSU9OXzY0IChPUFRJT05fTURfQkFTRSArIDIxKQotI2lmZGVmIE9CSl9FTEYKLSAgeyJLUElDIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DQUxMX1NIQVJFRH0sCi0gIHsieGdvdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fWEdPVH0sCi0gIHsiY2FsbF9zaGFyZWQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NBTExfU0hBUkVEfSwKLSAgeyJub25fc2hhcmVkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT05fU0hBUkVEfSwKLSAgeyIzMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fMzJ9LAotICB7IjY0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl82NH0sCi0jZW5kaWYKLQotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgT1BUSU9OX1RSQVA6Ci0gICAgICBtaXBzX3RyYXAgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9CUkVBSzoKLSAgICAgIG1pcHNfdHJhcCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0VCOgotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9FTDoKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTyc6Ci0gICAgICBpZiAoYXJnICYmIGFyZ1sxXSA9PSAnMCcpCi0JbWlwc19vcHRpbWl6ZSA9IDE7Ci0gICAgICBlbHNlCi0JbWlwc19vcHRpbWl6ZSA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2cnOgotICAgICAgaWYgKGFyZyA9PSBOVUxMKQotCW1pcHNfZGVidWcgPSAyOwotICAgICAgZWxzZQotCW1pcHNfZGVidWcgPSBhdG9pIChhcmcpOwotICAgICAgLyogV2hlbiB0aGUgTUlQUyBhc3NlbWJsZXIgc2VlcyAtZyBvciAtZzIsIGl0IGRvZXMgbm90IGRvCi0gICAgICAgICBvcHRpbWl6YXRpb25zIHdoaWNoIGxpbWl0IGZ1bGwgc3ltYm9saWMgZGVidWdnaW5nLiAgV2UgdGFrZQotICAgICAgICAgdGhhdCB0byBiZSBlcXVpdmFsZW50IHRvIC1PMC4gICovCi0gICAgICBpZiAobWlwc19kZWJ1ZyA9PSAyKQotCW1pcHNfb3B0aW1pemUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NSVBTMToKLSAgICAgIG1pcHNfb3B0cy5pc2EgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NSVBTMjoKLSAgICAgIG1pcHNfb3B0cy5pc2EgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NSVBTMzoKLSAgICAgIG1pcHNfb3B0cy5pc2EgPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NSVBTNDoKLSAgICAgIG1pcHNfb3B0cy5pc2EgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NQ1BVOgotICAgICAgewotCWNoYXIgKnA7Ci0KLQkvKiBJZGVudGlmeSB0aGUgcHJvY2Vzc29yIHR5cGUgKi8KLQlwID0gYXJnOwotCWlmIChzdHJjbXAgKHAsICJkZWZhdWx0IikgPT0gMAotCSAgICB8fCBzdHJjbXAgKHAsICJERUZBVUxUIikgPT0gMCkKLQkgIG1pcHNfY3B1ID0gLTE7Ci0JZWxzZQotCSAgewotCSAgICBpbnQgc3YgPSAwOwotCi0JICAgIC8qIFdlIG5lZWQgdG8gY29wZSB3aXRoIHRoZSB2YXJpb3VzICJ2ciIgcHJlZml4ZXMgZm9yIHRoZSA0MzAwCi0JICAgICAgIHByb2Nlc3Nvci4gICovCi0JICAgIGlmICgqcCA9PSAndicgfHwgKnAgPT0gJ1YnKQotCSAgICAgIHsKLQkJc3YgPSAxOwotCQlwKys7Ci0JICAgICAgfQotCi0JICAgIGlmICgqcCA9PSAncicgfHwgKnAgPT0gJ1InKQotCSAgICAgIHArKzsKLQotCSAgICBtaXBzX2NwdSA9IC0xOwotCSAgICBzd2l0Y2ggKCpwKQotCSAgICAgIHsKLQkgICAgICBjYXNlICcxJzoKLQkJaWYgKHN0cmNtcCAocCwgIjEwMDAwIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiMTBrIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiMTBLIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDEwMDAwOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzInOgotCQlpZiAoc3RyY21wIChwLCAiMjAwMCIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjJrIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiMksiKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gMjAwMDsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlICczJzoKLQkJaWYgKHN0cmNtcCAocCwgIjMwMDAiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICIzayIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjNLIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDMwMDA7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChwLCAiMzkwMCIpID09IDApCi0gICAgICAgICAgICAgICAgICBtaXBzX2NwdSA9IDM5MDA7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnNCc6Ci0JCWlmIChzdHJjbXAgKHAsICI0MDAwIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiNGsiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICI0SyIpID09IDApCi0JCSAgbWlwc19jcHUgPSA0MDAwOwotCQllbHNlIGlmIChzdHJjbXAgKHAsICI0MTAwIikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgbWlwc19jcHUgPSA0MTAwOwotCQllbHNlIGlmIChzdHJjbXAgKHAsICI0MTExIikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgbWlwc19jcHUgPSA0MTExOwotCQllbHNlIGlmIChzdHJjbXAgKHAsICI0MzAwIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDQzMDA7Ci0JCWVsc2UgaWYgKHN0cmNtcCAocCwgIjQ0MDAiKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gNDQwMDsKLQkJZWxzZSBpZiAoc3RyY21wIChwLCAiNDYwMCIpID09IDApCi0JCSAgbWlwc19jcHUgPSA0NjAwOwotCQllbHNlIGlmIChzdHJjbXAgKHAsICI0NjUwIikgPT0gMCkKLQkJICAgIG1pcHNfY3B1ID0gNDY1MDsKLQkJZWxzZSBpZiAoc3RyY21wIChwLCAiNDAxMCIpID09IDApCi0gICAgICAgICAgICAgICAgICBtaXBzX2NwdSA9IDQwMTA7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnNSc6Ci0JCWlmIChzdHJjbXAgKHAsICI1MDAwIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiNWsiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICI1SyIpID09IDApCi0JCSAgbWlwc19jcHUgPSA1MDAwOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzYnOgotCQlpZiAoc3RyY21wIChwLCAiNjAwMCIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjZrIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiNksiKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gNjAwMDsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlICc4JzoKLQkJaWYgKHN0cmNtcCAocCwgIjgwMDAiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICI4ayIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjhLIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDgwMDA7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnbyc6Ci0JCWlmIChzdHJjbXAgKHAsICJvcmlvbiIpID09IDApCi0JCSAgbWlwc19jcHUgPSA0NjAwOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgaWYgKHN2Ci0JCSYmIChtaXBzX2NwdSAhPSA0MzAwCi0JCSAgICAmJiBtaXBzX2NwdSAhPSA0MTAwCi0JCSAgICAmJiBtaXBzX2NwdSAhPSA0MTExCi0JCSAgICAmJiBtaXBzX2NwdSAhPSA1MDAwKSkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygiaWdub3JpbmcgaW52YWxpZCBsZWFkaW5nICd2JyBpbiAtbWNwdT0lcyBzd2l0Y2giKSwgYXJnKTsKLQkJcmV0dXJuIDA7Ci0JICAgICAgfQotCi0JICAgIGlmIChtaXBzX2NwdSA9PSAtMSkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygiaW52YWxpZCBhcmNoaXRlY3R1cmUgLW1jcHU9JXMiKSwgYXJnKTsKLQkJcmV0dXJuIDA7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NNDY1MDoKLSAgICAgIG1pcHNfY3B1ID0gNDY1MDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9fTTQ2NTA6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX000MDEwOgotICAgICAgbWlwc19jcHUgPSA0MDEwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT19NNDAxMDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTTQxMDA6Ci0gICAgICBtaXBzX2NwdSA9IDQxMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PX000MTAwOgotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgT1BUSU9OX00zOTAwOgotICAgICAgbWlwc19jcHUgPSAzOTAwOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9QVElPTl9OT19NMzkwMDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUlQUzE2OgotICAgICAgbWlwc19vcHRzLm1pcHMxNiA9IDE7Ci0gICAgICBtaXBzX25vX3ByZXZfaW5zbiAoZmFsc2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT19NSVBTMTY6Ci0gICAgICBtaXBzX29wdHMubWlwczE2ID0gMDsKLSAgICAgIG1pcHNfbm9fcHJldl9pbnNuIChmYWxzZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01FTUJFRERFRF9QSUM6Ci0gICAgICBtaXBzX3BpYyA9IEVNQkVEREVEX1BJQzsKLSAgICAgIGlmIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUICYmIGdfc3dpdGNoX3NlZW4pCi0JewotCSAgYXNfYmFkIChfKCItRyBtYXkgbm90IGJlIHVzZWQgd2l0aCBlbWJlZGRlZCBQSUMgY29kZSIpKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGdfc3dpdGNoX3ZhbHVlID0gMHg3ZmZmZmZmZjsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgRUxGIGNvZGUsIHdlIHBlcm1pdCAtS1BJQyBhbmQgLWNhbGxfc2hhcmVkIHRvCi0JIHNlbGVjdCBTVlI0X1BJQywgYW5kIC1ub25fc2hhcmVkIHRvIHNlbGVjdCBubyBQSUMuICBUaGlzIGlzCi0JIGludGVuZGVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBJcml4IDUuICAqLwotICAgIGNhc2UgT1BUSU9OX0NBTExfU0hBUkVEOgotICAgICAgaWYgKE9VVFBVVF9GTEFWT1IgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQl7Ci0JICBhc19iYWQgKF8oIi1jYWxsX3NoYXJlZCBpcyBzdXBwb3J0ZWQgb25seSBmb3IgRUxGIGZvcm1hdCIpKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIG1pcHNfcGljID0gU1ZSNF9QSUM7Ci0gICAgICBpZiAoZ19zd2l0Y2hfc2VlbiAmJiBnX3N3aXRjaF92YWx1ZSAhPSAwKQotCXsKLQkgIGFzX2JhZCAoXygiLUcgbWF5IG5vdCBiZSB1c2VkIHdpdGggU1ZSNCBQSUMgY29kZSIpKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGdfc3dpdGNoX3ZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9OX1NIQVJFRDoKLSAgICAgIGlmIChPVVRQVVRfRkxBVk9SICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JewotCSAgYXNfYmFkIChfKCItbm9uX3NoYXJlZCBpcyBzdXBwb3J0ZWQgb25seSBmb3IgRUxGIGZvcm1hdCIpKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIG1pcHNfcGljID0gTk9fUElDOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFRoZSAteGdvdCBvcHRpb24gdGVsbHMgdGhlIGFzc2VtYmxlciB0byB1c2UgMzIgb2Zmc2V0cyB3aGVuCi0gICAgICAgICBhY2Nlc3NpbmcgdGhlIGdvdCBpbiBTVlI0X1BJQyBtb2RlLiAgSXQgaXMgZm9yIElyaXgKLSAgICAgICAgIGNvbXBhdGliaWxpdHkuICAqLwotICAgIGNhc2UgT1BUSU9OX1hHT1Q6Ci0gICAgICBtaXBzX2JpZ19nb3QgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdHJzoKLSAgICAgIGlmICghIFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQpCi0JewotCSAgYXNfYmFkIChfKCItRyBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQyB8fCBtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMpCi0JewotCSAgYXNfYmFkIChfKCItRyBtYXkgbm90IGJlIHVzZWQgd2l0aCBTVlI0IG9yIGVtYmVkZGVkIFBJQyBjb2RlIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgZWxzZQotCWdfc3dpdGNoX3ZhbHVlID0gYXRvaSAoYXJnKTsKLSAgICAgIGdfc3dpdGNoX3NlZW4gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFRoZSAtMzIgYW5kIC02NCBvcHRpb25zIHRlbGwgdGhlIGFzc2VtYmxlciB0byBvdXRwdXQgdGhlIDMyCi0gICAgICAgICBiaXQgb3IgdGhlIDY0IGJpdCBNSVBTIEVMRiBmb3JtYXQuICAqLwotICAgIGNhc2UgT1BUSU9OXzMyOgotICAgICAgbWlwc182NCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OXzY0OgotICAgICAgewotCWNvbnN0IGNoYXIgKipsaXN0LCAqKmw7Ci0KLQlsaXN0ID0gYmZkX3RhcmdldF9saXN0ICgpOwotCWZvciAobCA9IGxpc3Q7ICpsICE9IE5VTEw7IGwrKykKLQkgIGlmIChzdHJjbXAgKCpsLCAiZWxmNjQtYmlnbWlwcyIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKCpsLCAiZWxmNjQtbGl0dGxlbWlwcyIpID09IDApCi0JICAgIGJyZWFrOwotCWlmICgqbCA9PSBOVUxMKQotCSAgYXNfZmF0YWwgKF8oIk5vIGNvbXBpbGVkIGluIHN1cHBvcnQgZm9yIDY0IGJpdCBvYmplY3QgZmlsZSBmb3JtYXQiKSk7Ci0JZnJlZSAobGlzdCk7Ci0JbWlwc182NCA9IDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSBPUFRJT05fTUFCSToKLSAgICAgIGlmIChzdHJjbXAgKGFyZywiMzIiKSA9PSAwCi0JICB8fCBzdHJjbXAgKGFyZywibjMyIikgPT0gMAotCSAgfHwgc3RyY21wIChhcmcsIjY0IikgPT0gMAotCSAgfHwgc3RyY21wIChhcmcsIm82NCIpID09IDAKLQkgIHx8IHN0cmNtcCAoYXJnLCJlYWJpIikgPT0gMCkKLQltaXBzX2FiaV9zdHJpbmcgPSBhcmc7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNob3cgKHN0cmVhbSwgc3RyaW5nLCBjb2xfcCwgZmlyc3RfcCkKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBjaGFyICpzdHJpbmc7Ci0gICAgIGludCAqY29sX3A7Ci0gICAgIGludCAqZmlyc3RfcDsKLXsKLSAgaWYgKCpmaXJzdF9wKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0cmVhbSwgIiUyNHMiLCAiIik7Ci0gICAgICAqY29sX3AgPSAyNDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdHJlYW0sICIsICIpOwotICAgICAgKmNvbF9wICs9IDI7Ci0gICAgfQotCi0gIGlmICgqY29sX3AgKyBzdHJsZW4gKHN0cmluZykgPiA3MikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdHJlYW0sICJcbiUyNHMiLCAiIik7Ci0gICAgICAqY29sX3AgPSAyNDsKLSAgICB9Ci0KLSAgZnByaW50ZiAoc3RyZWFtLCAiJXMiLCBzdHJpbmcpOwotICAqY29sX3AgKz0gc3RybGVuIChzdHJpbmcpOwotCi0gICpmaXJzdF9wID0gMDsKLX0KLQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgaW50IGNvbHVtbiwgZmlyc3Q7Ci0KLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLU1JUFMgb3B0aW9uczpcblwKLS1tZW1iZWRkZWQtcGljCQlnZW5lcmF0ZSBlbWJlZGRlZCBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlXG5cCi0tRUIJCQlnZW5lcmF0ZSBiaWcgZW5kaWFuIG91dHB1dFxuXAotLUVMCQkJZ2VuZXJhdGUgbGl0dGxlIGVuZGlhbiBvdXRwdXRcblwKLS1nLCAtZzIJCQlkbyBub3QgcmVtb3ZlIHVuZWVkZWQgTk9QcyBvciBzd2FwIGJyYW5jaGVzXG5cCi0tRyBOVU0JCQlhbGxvdyByZWZlcmVuY2luZyBvYmplY3RzIHVwIHRvIE5VTSBieXRlc1xuXAotCQkJaW1wbGljaXRseSB3aXRoIHRoZSBncCByZWdpc3RlciBbZGVmYXVsdCA4XVxuIikpOwotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotLW1pcHMxCQkJZ2VuZXJhdGUgTUlQUyBJU0EgSSBpbnN0cnVjdGlvbnNcblwKLS1taXBzMgkJCWdlbmVyYXRlIE1JUFMgSVNBIElJIGluc3RydWN0aW9uc1xuXAotLW1pcHMzCQkJZ2VuZXJhdGUgTUlQUyBJU0EgSUlJIGluc3RydWN0aW9uc1xuXAotLW1pcHM0CQkJZ2VuZXJhdGUgTUlQUyBJU0EgSVYgaW5zdHJ1Y3Rpb25zXG5cCi0tbWNwdT1DUFUJCWdlbmVyYXRlIGNvZGUgZm9yIENQVSwgd2hlcmUgQ1BVIGlzIG9uZSBvZjpcbiIpKTsKLQotICBmaXJzdCA9IDE7Ci0KLSAgc2hvdyAoc3RyZWFtLCAiMjAwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjMwMDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICIzOTAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDAwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQwMTAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0MTAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDExMSIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQzMDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0NDAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDYwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQ2NTAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI1MDAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNjAwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjgwMDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICIxMDAwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIGZwdXRjICgnXG4nLCBzdHJlYW0pOwotCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotLW1DUFUJCQllcXVpdmFsZW50IHRvIC1tY3B1PUNQVS5cblwKLS1uby1tQ1BVCQlkb24ndCBnZW5lcmF0ZSBjb2RlIHNwZWNpZmljIHRvIENQVS5cblwKLQkJCUZvciAtbUNQVSBhbmQgLW5vLW1DUFUsIENQVSBtdXN0IGJlIG9uZSBvZjpcbiIpKTsKLQotICBmaXJzdCA9IDE7Ci0KLSAgc2hvdyAoc3RyZWFtLCAiMzkwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQwMTAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0MTAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDY1MCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIGZwdXRjICgnXG4nLCBzdHJlYW0pOwotCi0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi0tbWlwczE2CQkJZ2VuZXJhdGUgbWlwczE2IGluc3RydWN0aW9uc1xuXAotLW5vLW1pcHMxNgkJZG8gbm90IGdlbmVyYXRlIG1pcHMxNiBpbnN0cnVjdGlvbnNcbiIpKTsKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLS1PMAkJCXJlbW92ZSB1bm5lZWRlZCBOT1BzLCBkbyBub3Qgc3dhcCBicmFuY2hlc1xuXAotLU8JCQlyZW1vdmUgdW5uZWVkZWQgTk9QcyBhbmQgc3dhcCBicmFuY2hlc1xuXAotLS10cmFwLCAtLW5vLWJyZWFrCXRyYXAgZXhjZXB0aW9uIG9uIGRpdiBieSAwIGFuZCBtdWx0IG92ZXJmbG93XG5cCi0tLWJyZWFrLCAtLW5vLXRyYXAJYnJlYWsgZXhjZXB0aW9uIG9uIGRpdiBieSAwIGFuZCBtdWx0IG92ZXJmbG93XG4iKSk7Ci0jaWZkZWYgT0JKX0VMRgotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotLUtQSUMsIC1jYWxsX3NoYXJlZAlnZW5lcmF0ZSBTVlI0IHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGVcblwKLS1ub25fc2hhcmVkCQlkbyBub3QgZ2VuZXJhdGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZVxuXAotLXhnb3QJCQlhc3N1bWUgYSAzMiBiaXQgR09UXG5cCi0tMzIJCQljcmVhdGUgMzIgYml0IG9iamVjdCBmaWxlIChkZWZhdWx0KVxuXAotLTY0CQkJY3JlYXRlIDY0IGJpdCBvYmplY3QgZmlsZVxuIikpOwotI2VuZGlmCi19Ci0MCi12b2lkCi1taXBzX2luaXRfYWZ0ZXJfYXJncyAoKQotewotICAvKiBpbml0aWFsaXplIG9wY29kZXMgKi8KLSAgYmZkX21pcHNfbnVtX29wY29kZXMgPSBiZmRfbWlwc19udW1fYnVpbHRpbl9vcGNvZGVzOwotICBtaXBzX29wY29kZXMgPSAoc3RydWN0IG1pcHNfb3Bjb2RlKikgbWlwc19idWlsdGluX29wY29kZXM7Ci19Ci0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGlmIChPVVRQVVRfRkxBVk9SICE9IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyCi0gICAgICAmJiBmaXhQLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiAhIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIC8qIFRoaXMgbWFrZXMgYSBicmFuY2ggdG8gYW4gdW5kZWZpbmVkIHN5bWJvbCBiZSBhIGJyYW5jaCB0byB0aGUKLQkgY3VycmVudCBsb2NhdGlvbi4gICovCi0gICAgICByZXR1cm4gNDsKLSAgICB9Ci0KLSAgLyogcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBkZWxheSBzbG90ICovCi0gIHJldHVybiBmaXhQLT5meF9zaXplICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSBlbWl0X2V4cHIgdmlhIFRDX0NPTlNfRklYX05FVyB3aGVuIGNyZWF0aW5nIGEKLSAgIHJlbG9jIGZvciBhIGNvbnMuICBXZSBjb3VsZCB1c2UgdGhlIGRlZmluaXRpb24gdGhlcmUsIGV4Y2VwdCB0aGF0Ci0gICB3ZSB3YW50IHRvIGhhbmRsZSA2NCBiaXQgcmVsb2NzIHNwZWNpYWxseS4gICovCi0KLXZvaWQKLWNvbnNfZml4X25ld19taXBzIChmcmFnLCB3aGVyZSwgbmJ5dGVzLCBleHApCi0gICAgIGZyYWdTICpmcmFnOwotICAgICBpbnQgd2hlcmU7Ci0gICAgIHVuc2lnbmVkIGludCBuYnl0ZXM7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0jaWZuZGVmIE9CSl9FTEYKLSAgLyogSWYgd2UgYXJlIGFzc2VtYmxpbmcgaW4gMzIgYml0IG1vZGUsIHR1cm4gYW4gOCBieXRlIHJlbG9jIGludG8gYQotICAgICA0IGJ5dGUgcmVsb2MuICAqLwotICBpZiAobmJ5dGVzID09IDggJiYgISBtaXBzXzY0KQotICAgIHsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQl3aGVyZSArPSA0OwotICAgICAgbmJ5dGVzID0gNDsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAobmJ5dGVzICE9IDIgJiYgbmJ5dGVzICE9IDQgJiYgbmJ5dGVzICE9IDgpCi0gICAgYXNfYmFkIChfKCJVbnN1cHBvcnRlZCByZWxvYyBzaXplICVkIiksIG5ieXRlcyk7Ci0KLSAgZml4X25ld19leHAgKGZyYWdfbm93LCB3aGVyZSwgKGludCkgbmJ5dGVzLCBleHAsIDAsCi0JICAgICAgIChuYnl0ZXMgPT0gMgotCQk/IEJGRF9SRUxPQ18xNgotCQk6IChuYnl0ZXMgPT0gNCA/IEJGRF9SRUxPQ18zMiA6IEJGRF9SRUxPQ182NCkpKTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHRoZSBzeW1ib2wgdGFibGUgaXMgcHJvY2Vzc2VkLiAgSW4gb3JkZXIgdG8KLSAgIHdvcmsgd2l0aCBnY2Mgd2hlbiB1c2luZyBtaXBzLXRmaWxlLCB3ZSBtdXN0IGtlZXAgYWxsIGxvY2FsIGxhYmVscy4KLSAgIEhvd2V2ZXIsIGluIG90aGVyIGNhc2VzLCB3ZSB3YW50IHRvIGRpc2NhcmQgdGhlbS4gIElmIHdlIHdlcmUKLSAgIGNhbGxlZCB3aXRoIC1nLCBidXQgd2UgZGlkbid0IHNlZSBhbnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBpdCBtYXkKLSAgIG1lYW4gdGhhdCBnY2MgaXMgc211Z2dsaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0aHJvdWdoIHRvCi0gICBtaXBzLXRmaWxlLCBpbiB3aGljaCBjYXNlIHdlIG11c3QgZ2VuZXJhdGUgYWxsIGxvY2FsIGxhYmVscy4gICovCi0KLXZvaWQKLW1pcHNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgKCkKLXsKLSNpZm5kZWYgTk9fRUNPRkZfREVCVUdHSU5HCi0gIGlmIChFQ09GRl9ERUJVR0dJTkcKLSAgICAgICYmIG1pcHNfZGVidWcgIT0gMAotICAgICAgJiYgISBlY29mZl9kZWJ1Z2dpbmdfc2VlbikKLSAgICBmbGFnX2tlZXBfbG9jYWxzID0gMTsKLSNlbmRpZgotfQotCi0vKiBTb3J0IGFueSB1bm1hdGNoZWQgSEkxNl9TIHJlbG9jcyBzbyB0aGF0IHRoZXkgaW1tZWRpYXRlbHkgcHJlY2VkZQotICAgdGhlIGNvcnJlc3BvbmRpbmcgTE8gcmVsb2MuICBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgbWRfYXBwbHlfZml4IGFuZAotICAgdGNfZ2VuX3JlbG9jLiAgVW5tYXRjaGVkIEhJMTZfUyByZWxvY3MgY2FuIG9ubHkgYmUgZ2VuZXJhdGVkIGJ5Ci0gICBleHBsaWNpdCB1c2Ugb2YgdGhlICVoaSBtb2RpZmllci4gICovCi0KLXZvaWQKLW1pcHNfZnJvYl9maWxlICgpCi17Ci0gIHN0cnVjdCBtaXBzX2hpX2ZpeHVwICpsOwotCi0gIGZvciAobCA9IG1pcHNfaGlfZml4dXBfbGlzdDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbzsKLSAgICAgIGludCBwYXNzOwotCi0gICAgICBhc3NlcnQgKGwtPmZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfSEkxNl9TKTsKLQotICAgICAgLyogQ2hlY2sgcXVpY2tseSB3aGV0aGVyIHRoZSBuZXh0IGZpeHVwIGhhcHBlbnMgdG8gYmUgYSBtYXRjaGluZwotICAgICAgICAgJWxvLiAgKi8KLSAgICAgIGlmIChsLT5maXhwLT5meF9uZXh0ICE9IE5VTEwKLQkgICYmIGwtPmZpeHAtPmZ4X25leHQtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTE8xNgotCSAgJiYgbC0+Zml4cC0+ZnhfYWRkc3kgPT0gbC0+Zml4cC0+ZnhfbmV4dC0+ZnhfYWRkc3kKLQkgICYmIGwtPmZpeHAtPmZ4X29mZnNldCA9PSBsLT5maXhwLT5meF9uZXh0LT5meF9vZmZzZXQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIExvb2sgdGhyb3VnaCB0aGUgZml4dXBzIGZvciB0aGlzIHNlZ21lbnQgZm9yIGEgbWF0Y2hpbmcgJWxvLgotICAgICAgICAgV2hlbiB3ZSBmaW5kIG9uZSwgbW92ZSB0aGUgJWhpIGp1c3QgaW4gZnJvbnQgb2YgaXQuICBXZSBkbwotICAgICAgICAgdGhpcyBpbiB0d28gcGFzc2VzLiAgSW4gdGhlIGZpcnN0IHBhc3MsIHdlIHRyeSB0byBmaW5kIGEKLSAgICAgICAgIHVuaXF1ZSAlbG8uICBJbiB0aGUgc2Vjb25kIHBhc3MsIHdlIHBlcm1pdCBtdWx0aXBsZSAlaGkKLSAgICAgICAgIHJlbG9jcyBmb3IgYSBzaW5nbGUgJWxvICh0aGlzIGlzIGEgR05VIGV4dGVuc2lvbikuICAqLwotICAgICAgc2VnaW5mbyA9IHNlZ19pbmZvIChsLT5zZWcpOwotICAgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IDI7IHBhc3MrKykKLQl7Ci0JICBmaXhTICpmLCAqcHJldjsKLQotCSAgcHJldiA9IE5VTEw7Ci0JICBmb3IgKGYgPSBzZWdpbmZvLT5maXhfcm9vdDsgZiAhPSBOVUxMOyBmID0gZi0+ZnhfbmV4dCkKLQkgICAgewotCSAgICAgIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhICVsbyBmaXh1cCB3aGljaCBtYXRjaGVzIGwtPmZpeHAuICAqLwotCSAgICAgIGlmIChmLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0xPMTYKLQkJICAmJiBmLT5meF9hZGRzeSA9PSBsLT5maXhwLT5meF9hZGRzeQotCQkgICYmIGYtPmZ4X29mZnNldCA9PSBsLT5maXhwLT5meF9vZmZzZXQKLQkJICAmJiAocGFzcyA9PSAxCi0JCSAgICAgIHx8IHByZXYgPT0gTlVMTAotCQkgICAgICB8fCBwcmV2LT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0hJMTZfUwotCQkgICAgICB8fCBwcmV2LT5meF9hZGRzeSAhPSBmLT5meF9hZGRzeQotCQkgICAgICB8fCBwcmV2LT5meF9vZmZzZXQgIT0gIGYtPmZ4X29mZnNldCkpCi0JCXsKLQkJICBmaXhTICoqcGY7Ci0KLQkJICAvKiBNb3ZlIGwtPmZpeHAgYmVmb3JlIGYuICAqLwotCQkgIGZvciAocGYgPSAmc2VnaW5mby0+Zml4X3Jvb3Q7Ci0JCSAgICAgICAqcGYgIT0gbC0+Zml4cDsKLQkJICAgICAgIHBmID0gJigqcGYpLT5meF9uZXh0KQotCQkgICAgYXNzZXJ0ICgqcGYgIT0gTlVMTCk7Ci0KLQkJICAqcGYgPSBsLT5maXhwLT5meF9uZXh0OwotCi0JCSAgbC0+Zml4cC0+ZnhfbmV4dCA9IGY7Ci0JCSAgaWYgKHByZXYgPT0gTlVMTCkKLQkJICAgIHNlZ2luZm8tPmZpeF9yb290ID0gbC0+Zml4cDsKLQkJICBlbHNlCi0JCSAgICBwcmV2LT5meF9uZXh0ID0gbC0+Zml4cDsKLQotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBwcmV2ID0gZjsKLQkgICAgfQotCi0JICBpZiAoZiAhPSBOVUxMKQotCSAgICBicmVhazsKLQotI2lmIDAgLyogR0NDIGNvZGUgbW90aW9uIHBsdXMgaW5jb21wbGV0ZSBkZWFkIGNvZGUgZWxpbWluYXRpb24KLQkgY2FuIGxlYXZlIGEgJWhpIHdpdGhvdXQgYSAlbG8uICAqLwotCSAgaWYgKHBhc3MgPT0gMSkKLQkgICAgYXNfd2Fybl93aGVyZSAobC0+Zml4cC0+ZnhfZmlsZSwgbC0+Zml4cC0+ZnhfbGluZSwKLQkJCSAgIF8oIlVubWF0Y2hlZCAlJWhpIHJlbG9jIikpOwotI2VuZGlmCi0JfQotICAgIH0KLX0KLQotLyogV2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlIHdlIG5lZWQgdG8gdXNlIGEgc3BlY2lhbAotICAgcmVsb2NhdGlvbiB0byByZXByZXNlbnQgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaW4gdGhlIC50ZXh0Ci0gICBzZWN0aW9uIChzd2l0Y2ggdGFibGVzIHVzZSBhIGRpZmZlcmVuY2Ugb2YgdGhpcyBzb3J0KS4gIFNlZQotICAgaW5jbHVkZS9jb2ZmL21pcHMuaCBmb3IgZGV0YWlscy4gIFRoaXMgbWFjcm8gY2hlY2tzIHdoZXRoZXIgdGhpcwotICAgZml4dXAgcmVxdWlyZXMgdGhlIHNwZWNpYWwgcmVsb2MuICAqLwotI2RlZmluZSBTV0lUQ0hfVEFCTEUoZml4cCkgXAotICAoKGZpeHApLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyIFwKLSAgICYmIChmaXhwKS0+ZnhfYWRkc3kgIT0gTlVMTCBcCi0gICAmJiAoZml4cCktPmZ4X3N1YnN5ICE9IE5VTEwgXAotICAgJiYgU19HRVRfU0VHTUVOVCAoKGZpeHApLT5meF9hZGRzeSkgPT0gdGV4dF9zZWN0aW9uIFwKLSAgICYmIFNfR0VUX1NFR01FTlQgKChmaXhwKS0+Znhfc3Vic3kpID09IHRleHRfc2VjdGlvbikKLQotLyogV2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlIHdlIG11c3Qga2VlcCBhbGwgUEMgcmVsYXRpdmUKLSAgIHJlbG9jYXRpb25zLCBpbiBjYXNlIHRoZSBsaW5rZXIgaGFzIHRvIHJlbGF4IGEgY2FsbC4gIFdlIGFsc28gbmVlZAotICAgdG8ga2VlcCByZWxvY2F0aW9ucyBmb3Igc3dpdGNoIHRhYmxlIGVudHJpZXMuICAqLwotCi0vKkFSR1NVU0VEKi8KLWludAotbWlwc19mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQotICAgICBmaXhTICpmaXhwOwotewotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMKLQkgICYmIChmaXhwLT5meF9wY3JlbAotCSAgICAgIHx8IFNXSVRDSF9UQUJMRSAoZml4cCkKLQkgICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BDUkVMX0hJMTZfUwotCSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfUENSRUxfTE8xNikpOwotfQotCi0vKiBBcHBseSBhIGZpeHVwIHRvIHRoZSBvYmplY3QgZmlsZS4gICovCi0KLWludAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWx1ZVApCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFsdWVQOwotewotICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gIGxvbmcgaW5zbiwgdmFsdWU7Ci0KLSAgYXNzZXJ0IChmaXhQLT5meF9zaXplID09IDQKLQkgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMTYKLQkgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfNjQKLQkgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLQkgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKTsKLQotICB2YWx1ZSA9ICp2YWx1ZVA7Ci0KLSAgLyogSWYgd2UgYXJlbid0IGFkanVzdGluZyB0aGlzIGZpeHVwIHRvIGJlIGFnYWluc3QgdGhlIHNlY3Rpb24KLSAgICAgc3ltYm9sLCB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgdmFsdWUuICAqLwotI2lmZGVmIE9CSl9FTEYKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwgJiYgT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIGlmIChTX0dFVF9PVEhFUiAoZml4UC0+ZnhfYWRkc3kpID09IFNUT19NSVBTMTYgCi0gICAgICAgIHx8IFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICAgIHx8IChmaXhQLT5meF9hZGRzeS0+c3lfdXNlZF9pbl9yZWxvYwotICAgICAgICAgICAgJiYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpKQotICAgICAgICAgICAgICAgICYgU0VDX0xJTktfT05DRSAhPSAwKQotICAgICAgICAgICAgICAgfHwgIXN0cm5jbXAgKHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmdudS5saW5rb25jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICgiLmdudS5saW5rb25jZSIpIC0gMSkpKQotCi0gICAgICB7Ci0gICAgICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSk7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSAwICYmICEgZml4UC0+ZnhfcGNyZWwpCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogSW4gdGhpcyBjYXNlLCB0aGUgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiByb3V0aW5lIHdpbGwKLSAgICAgICAgICAgICAgIGluY29ycmVjdGx5IGFkZCB0aGUgc3ltYm9sIHZhbHVlIGJhY2sgaW4uICBXZSBqdXN0IHdhbnQKLSAgICAgICAgICAgICAgIHRoZSBhZGRlbmQgdG8gYXBwZWFyIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gICAgICAgICAgICB2YWx1ZSAtPSBTX0dFVF9WQUxVRSAoZml4UC0+ZnhfYWRkc3kpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSNlbmRpZgotCi0KLSAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsdWU7CS8qIFJlbWVtYmVyIHZhbHVlIGZvciB0Y19nZW5fcmVsb2MgKi8KLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCAmJiAhIGZpeFAtPmZ4X3BjcmVsKQotICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0pNUDoKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0dQUkVMOgotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfTElURVJBTDoKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0NBTEwxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0dPVDE2OgotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR1BSRUwzMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2OgotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR09UX0xPMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQUzE2X0dQUkVMOgotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygiSW52YWxpZCBQQyByZWxhdGl2ZSByZWxvYyIpKTsKLSAgICAgIC8qIE5vdGhpbmcgbmVlZGVkIHRvIGRvLiBUaGUgdmFsdWUgY29tZXMgZnJvbSB0aGUgcmVsb2MgZW50cnkgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfTUlQUzE2X0pNUDoKLSAgICAgIC8qIFdlIGN1cnJlbnRseSBhbHdheXMgZ2VuZXJhdGUgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sLCB3aGljaAotICAgICAgICAgbWVhbnMgdGhhdCB3ZSBkb24ndCB3YW50IGFuIGFkZGVuZCBldmVuIGlmIHRoZSBzeW1ib2wgaXMKLSAgICAgICAgIGRlZmluZWQuICAqLwotICAgICAgZml4UC0+ZnhfYWRkbnVtYmVyID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfUENSRUxfSEkxNl9TOgotICAgICAgLyogVGhlIGFkZGVuZCBmb3IgdGhpcyBpcyB0cmlja3kgaWYgaXQgaXMgaW50ZXJuYWwsIHNvIHdlIGp1c3QKLQkgZG8gZXZlcnl0aGluZyBoZXJlIHJhdGhlciB0aGFuIGluIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICAqLwotICAgICAgaWYgKChmaXhQLT5meF9hZGRzeS0+YnN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JewotCSAgLyogRm9yIGFuIGV4dGVybmFsIHN5bWJvbCBhZGp1c3QgYnkgdGhlIGFkZHJlc3MgdG8gbWFrZSBpdAotCSAgICAgcGNyZWxfb2Zmc2V0LiAgV2UgdXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBSRUxMTyByZWxvYwotCSAgICAgd2hpY2ggZm9sbG93cyB0aGlzIG9uZS4gICovCi0JICB2YWx1ZSArPSAoZml4UC0+ZnhfbmV4dC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcwotCQkgICAgKyBmaXhQLT5meF9uZXh0LT5meF93aGVyZSk7Ci0JfQotICAgICAgaWYgKHZhbHVlICYgMHg4MDAwKQotCXZhbHVlICs9IDB4MTAwMDA7Ci0gICAgICB2YWx1ZSA+Pj0gMTY7Ci0gICAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JYnVmICs9IDI7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19QQ1JFTF9MTzE2OgotICAgICAgLyogVGhlIGFkZGVuZCBmb3IgdGhpcyBpcyB0cmlja3kgaWYgaXQgaXMgaW50ZXJuYWwsIHNvIHdlIGp1c3QKLQkgZG8gZXZlcnl0aGluZyBoZXJlIHJhdGhlciB0aGFuIGluIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICAqLwotICAgICAgaWYgKChmaXhQLT5meF9hZGRzeS0+YnN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JdmFsdWUgKz0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlOwotICAgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWJ1ZiArPSAyOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfNjQ6Ci0gICAgICAvKiBUaGlzIGlzIGhhbmRsZWQgbGlrZSBCRkRfUkVMT0NfMzIsIGJ1dCB3ZSBvdXRwdXQgYSBzaWduCi0gICAgICAgICBleHRlbmRlZCB2YWx1ZSBpZiB3ZSBhcmUgb25seSAzMiBiaXRzLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9kb25lCi0JICB8fCAobWlwc19waWMgPT0gRU1CRURERURfUElDICYmIFNXSVRDSF9UQUJMRSAoZml4UCkpKQotCXsKLQkgIGlmICg4IDw9IHNpemVvZiAodmFsdWVUKSkKLQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmUsCi0JCQkJdmFsdWUsIDgpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbG9uZyB3MSwgdzI7Ci0JICAgICAgbG9uZyBoaXY7Ci0KLQkgICAgICB3MSA9IHcyID0gZml4UC0+Znhfd2hlcmU7Ci0JICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCQl3MSArPSA0OwotCSAgICAgIGVsc2UKLQkJdzIgKz0gNDsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyB3MSwgdmFsdWUsIDQpOwotCSAgICAgIGlmICgodmFsdWUgJiAweDgwMDAwMDAwKSAhPSAwKQotCQloaXYgPSAweGZmZmZmZmZmOwotCSAgICAgIGVsc2UKLQkJaGl2ID0gMDsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyB3MiwgaGl2LCA0KTsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICAvKiBJZiB3ZSBhcmUgZGVsZXRpbmcgdGhpcyByZWxvYyBlbnRyeSwgd2UgbXVzdCBmaWxsIGluIHRoZQotCSB2YWx1ZSBub3cuICBUaGlzIGNhbiBoYXBwZW4gaWYgd2UgaGF2ZSBhIC53b3JkIHdoaWNoIGlzIG5vdAotCSByZXNvbHZlZCB3aGVuIGl0IGFwcGVhcnMgYnV0IGlzIGxhdGVyIGRlZmluZWQuICBXZSBhbHNvIG5lZWQKLQkgdG8gZmlsbCBpbiB0aGUgdmFsdWUgaWYgdGhpcyBpcyBhbiBlbWJlZGRlZCBQSUMgc3dpdGNoIHRhYmxlCi0JIGVudHJ5LiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9kb25lCi0JICB8fCAobWlwc19waWMgPT0gRU1CRURERURfUElDICYmIFNXSVRDSF9UQUJMRSAoZml4UCkpKQotCW1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAotCQkJICAgIHZhbHVlLCA0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICAvKiBJZiB3ZSBhcmUgZGVsZXRpbmcgdGhpcyByZWxvYyBlbnRyeSwgd2UgbXVzdCBmaWxsIGluIHRoZQotICAgICAgICAgdmFsdWUgbm93LiAgKi8KLSAgICAgIGFzc2VydCAoZml4UC0+Znhfc2l6ZSA9PSAyKTsKLSAgICAgIGlmIChmaXhQLT5meF9kb25lKQotCW1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAotCQkJICAgIHZhbHVlLCAyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLSAgICAgIC8qIFdoZW4gaGFuZGxpbmcgYW4gZW1iZWRkZWQgUElDIHN3aXRjaCBzdGF0ZW1lbnQsIHdlIGNhbiB3aW5kCi0JIHVwIGRlbGV0aW5nIGEgTE8xNiByZWxvYy4gIFNlZSB0aGUgJ28nIGNhc2UgaW4gbWlwc19pcC4gICovCi0gICAgICBpZiAoZml4UC0+ZnhfZG9uZSkKLQl7Ci0JICBpZiAodmFsdWUgPCAtMHg4MDAwIHx8IHZhbHVlID4gMHg3ZmZmKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICBidWYgPSAodW5zaWduZWQgY2hhciAqKSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0JICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JICAgIGJ1ZiArPSAyOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAyKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMX1MyOgotICAgICAgLyoKLSAgICAgICAqIFdlIG5lZWQgdG8gc2F2ZSB0aGUgYml0cyBpbiB0aGUgaW5zdHJ1Y3Rpb24gc2luY2UgZml4dXBfc2VnbWVudCgpCi0gICAgICAgKiBtaWdodCBiZSBkZWxldGluZyB0aGUgcmVsb2NhdGlvbiBlbnRyeSAoaS5lLiwgYSBicmFuY2ggd2l0aGluCi0gICAgICAgKiB0aGUgY3VycmVudCBzZWdtZW50KS4KLSAgICAgICAqLwotICAgICAgaWYgKCh2YWx1ZSAmIDB4MykgIT0gMCkKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIkJyYW5jaCB0byBvZGQgYWRkcmVzcyAoJWx4KSIpLCB2YWx1ZSk7Ci0gICAgICB2YWx1ZSA+Pj0gMjsKLQotICAgICAgLyogdXBkYXRlIG9sZCBpbnN0cnVjdGlvbiBkYXRhICovCi0gICAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKSAoZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsKTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlpbnNuID0gKGJ1ZlswXSA8PCAyNCkgfCAoYnVmWzFdIDw8IDE2KSB8IChidWZbMl0gPDwgOCkgfCBidWZbM107Ci0gICAgICBlbHNlCi0JaW5zbiA9IChidWZbM10gPDwgMjQpIHwgKGJ1ZlsyXSA8PCAxNikgfCAoYnVmWzFdIDw8IDgpIHwgYnVmWzBdOwotCi0gICAgICBpZiAodmFsdWUgPj0gLTB4ODAwMCAmJiB2YWx1ZSA8IDB4ODAwMCkKLQlpbnNuIHw9IHZhbHVlICYgMHhmZmZmOwotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoZSBicmFuY2ggb2Zmc2V0IGlzIHRvbyBsYXJnZS4gIElmIHRoaXMgaXMgYW4KLSAgICAgICAgICAgICB1bmNvbmRpdGlvbmFsIGJyYW5jaCwgYW5kIHdlIGFyZSBub3QgZ2VuZXJhdGluZyBQSUMgY29kZSwKLSAgICAgICAgICAgICB3ZSBjYW4gY29udmVydCBpdCB0byBhbiBhYnNvbHV0ZSBqdW1wIGluc3RydWN0aW9uLiAgKi8KLQkgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMKLQkgICAgICAmJiBmaXhQLT5meF9kb25lCi0JICAgICAgJiYgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyA+PSB0ZXh0X3NlY3Rpb24tPnZtYQotCSAgICAgICYmIChmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzCi0JCSAgPCB0ZXh0X3NlY3Rpb24tPnZtYSArIHRleHRfc2VjdGlvbi0+X3Jhd19zaXplKQotCSAgICAgICYmICgoaW5zbiAmIDB4ZmZmZjAwMDApID09IDB4MTAwMDAwMDAJIC8qIGJlcSAkMCwkMCAqLwotCQkgIHx8IChpbnNuICYgMHhmZmZmMDAwMCkgPT0gMHgwNDAxMDAwMAkgLyogYmdleiAkMCAqLwotCQkgIHx8IChpbnNuICYgMHhmZmZmMDAwMCkgPT0gMHgwNDExMDAwMCkpIC8qIGJnZXphbCAkMCAqLwotCSAgICB7Ci0JICAgICAgaWYgKChpbnNuICYgMHhmZmZmMDAwMCkgPT0gMHgwNDExMDAwMCkJIC8qIGJnZXphbCAkMCAqLwotCQlpbnNuID0gMHgwYzAwMDAwMDsJLyogamFsICovCi0JICAgICAgZWxzZQotCQlpbnNuID0gMHgwODAwMDAwMDsJLyogaiAqLwotCSAgICAgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19NSVBTX0pNUDsKLQkgICAgICBmaXhQLT5meF9kb25lID0gMDsKLQkgICAgICBmaXhQLT5meF9hZGRzeSA9IHNlY3Rpb25fc3ltYm9sICh0ZXh0X3NlY3Rpb24pOwotCSAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciA9ICh2YWx1ZSA8PCAyKSArIG1kX3BjcmVsX2Zyb20gKGZpeFApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRS4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIGluIHByaW5jaXBsZSB0byBoYW5kbGUKLSAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWwgYnJhbmNoZXMgd2hpY2ggb3ZlcmZsb3cuICBUaGV5IGNvdWxkIGJlCi0gICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkIGludG8gYSBicmFuY2ggYXJvdW5kIGEganVtcC4gIFRoaXMgd291bGQKLSAgICAgICAgICAgICAgICAgcmVxdWlyZSBzZXR0aW5nIHVwIHZhcmlhbnQgZnJhZ3MgZm9yIGVhY2ggZGlmZmVyZW50Ci0gICAgICAgICAgICAgICAgIGJyYW5jaCB0eXBlLiAgVGhlIG5hdGl2ZSBNSVBTIGFzc2VtYmxlciBhdHRlbXB0cyB0bwotICAgICAgICAgICAgICAgICBoYW5kbGUgdGhlc2UgY2FzZXMsIGJ1dCBpdCBhcHBlYXJzIHRvIGRvIGl0Ci0gICAgICAgICAgICAgICAgIGluY29ycmVjdGx5LiAgKi8KLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICAgXygiQnJhbmNoIG91dCBvZiByYW5nZSIpKTsKLQkgICAgfQotCX0KLQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSBidWYsICh2YWx1ZVQpIGluc24sIDQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOwotICAgICAgaWYgKGZpeFAtPmZ4X2FkZHN5Ci0gICAgICAgICAgJiYgIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICAgICAgJiYgIVNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgICAgICBTX1NFVF9XRUFLIChmaXhQLT5meF9hZGRzeSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaW50ZXJuYWxFcnJvciAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLSNpZiAwCi12b2lkCi1wcmludEluc24gKG9jKQotICAgICB1bnNpZ25lZCBsb25nIG9jOwotewotICBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKnA7Ci0gIGludCB0cmVnLCBzcmVnLCBkcmVnLCBzaGFtdDsKLSAgc2hvcnQgaW1tOwotICBjb25zdCBjaGFyICphcmdzOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNT1BDT0RFUzsgKytpKQotICAgIHsKLSAgICAgIHAgPSAmbWlwc19vcGNvZGVzW2ldOwotICAgICAgaWYgKCgob2MgJiBwLT5tYXNrKSA9PSBwLT5tYXRjaCkgJiYgKHAtPnBpbmZvICE9IElOU05fTUFDUk8pKQotCXsKLQkgIHByaW50ZiAoIiUwOGx4ICVzXHQiLCBvYywgcC0+bmFtZSk7Ci0JICB0cmVnID0gKG9jID4+IDE2KSAmIDB4MWY7Ci0JICBzcmVnID0gKG9jID4+IDIxKSAmIDB4MWY7Ci0JICBkcmVnID0gKG9jID4+IDExKSAmIDB4MWY7Ci0JICBzaGFtdCA9IChvYyA+PiA2KSAmIDB4MWY7Ci0JICBpbW0gPSBvYzsKLQkgIGZvciAoYXJncyA9IHAtPmFyZ3M7OyArK2FyZ3MpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKCphcmdzKQotCQl7Ci0JCWNhc2UgJ1wwJzoKLQkJICBwcmludGYgKCJcbiIpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJywnOgotCQljYXNlICcoJzoKLQkJY2FzZSAnKSc6Ci0JCSAgcHJpbnRmICgiJWMiLCAqYXJncyk7Ci0JCSAgY29udGludWU7Ci0KLQkJY2FzZSAncic6Ci0JCSAgYXNzZXJ0ICh0cmVnID09IHNyZWcpOwotCQkgIHByaW50ZiAoIiQlZCwkJWQiLCB0cmVnLCBzcmVnKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICdkJzoKLQkJY2FzZSAnRyc6Ci0JCSAgcHJpbnRmICgiJCVkIiwgZHJlZyk7Ci0JCSAgY29udGludWU7Ci0KLQkJY2FzZSAndCc6Ci0JCWNhc2UgJ0UnOgotCQkgIHByaW50ZiAoIiQlZCIsIHRyZWcpOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ2snOgotCQkgIHByaW50ZiAoIjB4JXgiLCB0cmVnKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICdiJzoKLQkJY2FzZSAncyc6Ci0JCSAgcHJpbnRmICgiJCVkIiwgc3JlZyk7Ci0JCSAgY29udGludWU7Ci0KLQkJY2FzZSAnYSc6Ci0JCSAgcHJpbnRmICgiMHglMDhseCIsIG9jICYgMHgxZmZmZmZmKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICdpJzoKLQkJY2FzZSAnaic6Ci0JCWNhc2UgJ28nOgotCQljYXNlICd1JzoKLQkJICBwcmludGYgKCIlZCIsIGltbSk7Ci0JCSAgY29udGludWU7Ci0KLQkJY2FzZSAnPCc6Ci0JCWNhc2UgJz4nOgotCQkgIHByaW50ZiAoIiQlZCIsIHNoYW10KTsKLQkJICBjb250aW51ZTsKLQotCQlkZWZhdWx0OgotCQkgIGludGVybmFsRXJyb3IgKCk7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIHByaW50ZiAoXygiJTA4bHggIFVOREVGSU5FRFxuIiksIG9jKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgc3ltYm9sUyAqCi1nZXRfc3ltYm9sICgpCi17Ci0gIGludCBjOwotICBjaGFyICpuYW1lOwotICBzeW1ib2xTICpwOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcCA9IChzeW1ib2xTICopIHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgcmV0dXJuIHA7Ci19Ci0KLS8qIEFsaWduIHRoZSBjdXJyZW50IGZyYWcgdG8gYSBnaXZlbiBwb3dlciBvZiB0d28uICBUaGUgTUlQUyBhc3NlbWJsZXIKLSAgIGFsc28gYXV0b21hdGljYWxseSBhZGp1c3RzIGFueSBwcmVjZWRpbmcgbGFiZWwuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19hbGlnbiAodG8sIGZpbGwsIGxhYmVsKQotICAgICBpbnQgdG87Ci0gICAgIGludCBmaWxsOwotICAgICBzeW1ib2xTICpsYWJlbDsKLXsKLSAgbWlwc19lbWl0X2RlbGF5cyAoZmFsc2UpOwotICBmcmFnX2FsaWduICh0bywgZmlsbCwgMCk7Ci0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIHRvKTsKLSAgaWYgKGxhYmVsICE9IE5VTEwpCi0gICAgewotICAgICAgYXNzZXJ0IChTX0dFVF9TRUdNRU5UIChsYWJlbCkgPT0gbm93X3NlZyk7Ci0gICAgICBsYWJlbC0+c3lfZnJhZyA9IGZyYWdfbm93OwotICAgICAgU19TRVRfVkFMVUUgKGxhYmVsLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotICAgIH0KLX0KLQotLyogQWxpZ24gdG8gYSBnaXZlbiBwb3dlciBvZiB0d28uICAuYWxpZ24gMCB0dXJucyBvZmYgdGhlIGF1dG9tYXRpYwotICAgYWxpZ25tZW50IHVzZWQgYnkgdGhlIGRhdGEgY3JlYXRpbmcgcHNldWRvLW9wcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FsaWduICh4KQotICAgICBpbnQgeDsKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gIHJlZ2lzdGVyIGxvbmcgdGVtcF9maWxsOwotICBsb25nIG1heF9hbGlnbm1lbnQgPSAxNTsKLQotICAvKgotCi0gICAgbyAgTm90ZSB0aGF0IHRoZSBhc3NlbWJsZXIgcHVsbHMgZG93biBhbnkgaW1tZWRpYXRlbHkgcHJlY2VlZGluZyBsYWJlbAotICAgICAgIHRvIHRoZSBhbGlnbmVkIGFkZHJlc3MuCi0gICAgbyAgSXQncyBub3QgZG9jdW1lbnRlZCBidXQgYXV0byBhbGlnbm1lbnQgaXMgcmVpbnN0YXRlZCBieQotICAgICAgIGEgLmFsaWduIHBzZXVkbyBpbnN0cnVjdGlvbi4KLSAgICBvICBOb3RlIGFsc28gdGhhdCBhZnRlciBhdXRvIGFsaWdubWVudCBpcyB0dXJuZWQgb2ZmIHRoZSBtaXBzIGFzc2VtYmxlcgotICAgICAgIGlzc3VlcyBhbiBlcnJvciBvbiBhdHRlbXB0IHRvIGFzc2VtYmxlIGFuIGltcHJvcGVybHkgYWxpZ25lZCBkYXRhIGl0ZW0uCi0gICAgICAgV2UgZG9uJ3QuCi0KLSAgICAqLwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKHRlbXAgPiBtYXhfYWxpZ25tZW50KQotICAgIGFzX2JhZCAoXygiQWxpZ25tZW50IHRvbyBsYXJnZTogJWQuIGFzc3VtZWQuIiksIHRlbXAgPSBtYXhfYWxpZ25tZW50KTsKLSAgZWxzZSBpZiAodGVtcCA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQWxpZ25tZW50IG5lZ2F0aXZlOiAwIGFzc3VtZWQuIikpOwotICAgICAgdGVtcCA9IDA7Ci0gICAgfQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICB0ZW1wX2ZpbGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB0ZW1wX2ZpbGwgPSAwOwotICBpZiAodGVtcCkKLSAgICB7Ci0gICAgICBhdXRvX2FsaWduID0gMTsKLSAgICAgIG1pcHNfYWxpZ24gKHRlbXAsIChpbnQpIHRlbXBfZmlsbCwKLQkJICBpbnNuX2xhYmVscyAhPSBOVUxMID8gaW5zbl9sYWJlbHMtPmxhYmVsIDogTlVMTCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXV0b19hbGlnbiA9IDA7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLW1pcHNfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCkKLXsKLSAgbWlwc19lbWl0X2RlbGF5cyAoZmFsc2UpOwotICBtaXBzX2NsZWFyX2luc25fbGFiZWxzICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19jaGFuZ2Vfc2VjIChzZWMpCi0gICAgIGludCBzZWM7Ci17Ci0gIHNlZ1Qgc2VnOwotCi0gIC8qIFdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSwgd2Ugb25seSB1c2UgdGhlIC50ZXh0LCAubGl0OCwKLSAgICAgLnNkYXRhIGFuZCAuc2JzcyBzZWN0aW9ucy4gIFdlIGNoYW5nZSB0aGUgLmRhdGEgYW5kIC5yZGF0YQotICAgICBwc2V1ZG8tb3BzIHRvIHVzZSAuc2RhdGEuICAqLwotICBpZiAobWlwc19waWMgPT0gRU1CRURERURfUElDCi0gICAgICAmJiAoc2VjID09ICdkJyB8fCBzZWMgPT0gJ3InKSkKLSAgICBzZWMgPSAncyc7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIC8qIFRoZSBFTEYgYmFja2VuZCBuZWVkcyB0byBrbm93IHRoYXQgd2UgYXJlIGNoYW5naW5nIHNlY3Rpb25zLCBzbwotICAgICB0aGF0IC5wcmV2aW91cyB3b3JrcyBjb3JyZWN0bHkuICBXZSBjb3VsZCBkbyBzb21ldGhpbmcgbGlrZSBjaGVjawotICAgICBmb3IgYSBvYmpfc2VjdGlvbl9jaGFuZ2VfaG9vayBtYWNybywgYnV0IHRoYXQgbWlnaHQgYmUgY29uZnVzaW5nCi0gICAgIGFzIGl0IHdvdWxkIG5vdCBiZSBhcHByb3ByaWF0ZSB0byB1c2UgaXQgaW4gdGhlIHNlY3Rpb24gY2hhbmdpbmcKLSAgICAgZnVuY3Rpb25zIGluIHJlYWQuYywgc2luY2Ugb2JqLWVsZi5jIGludGVyY2VwdHMgdGhvc2UuICBGSVhNRToKLSAgICAgVGhpcyBzaG91bGQgYmUgY2xlYW5lciwgc29tZWhvdy4gICovCi0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKLSNlbmRpZgotCi0gIG1pcHNfZW1pdF9kZWxheXMgKGZhbHNlKTsKLSAgc3dpdGNoIChzZWMpCi0gICAgewotICAgIGNhc2UgJ3QnOgotICAgICAgc190ZXh0ICgwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2QnOgotICAgICAgc19kYXRhICgwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2InOgotICAgICAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdyJzoKLSAgICAgIGlmIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUKQotCXsKLQkgIHNlZyA9IHN1YnNlZ19uZXcgKFJEQVRBX1NFQ1RJT05fTkFNRSwKLQkJCSAgICAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotCSAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQkgICAgewotCSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWcsCi0JCQkJICAgICAoU0VDX0FMTE9DCi0JCQkJICAgICAgfCBTRUNfTE9BRAotCQkJCSAgICAgIHwgU0VDX1JFQURPTkxZCi0JCQkJICAgICAgfCBTRUNfUkVMT0MKLQkJCQkgICAgICB8IFNFQ19EQVRBKSk7Ci0JICAgICAgaWYgKHN0cmNtcCAoVEFSR0VUX09TLCAiZWxmIikgIT0gMCkKLQkJYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcsIDQpOwotCSAgICB9Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oIk5vIHJlYWQgb25seSBkYXRhIHNlY3Rpb24gaW4gdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQiKSk7Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncyc6Ci0gICAgICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCkKLQl7Ci0JICBzZWcgPSBzdWJzZWdfbmV3ICgiLnNkYXRhIiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQkgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnLAotCQkJCSAgICAgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MKLQkJCQkgICAgIHwgU0VDX0RBVEEpOwotCSAgICAgIGlmIChzdHJjbXAgKFRBUkdFVF9PUywgImVsZiIpICE9IDApCi0JCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnLCA0KTsKLQkgICAgfQotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oIkdsb2JhbCBwb2ludGVycyBub3Qgc3VwcG9ydGVkOyByZWNvbXBpbGUgLUcgMCIpKTsKLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBhdXRvX2FsaWduID0gMTsKLX0KLQotdm9pZAotbWlwc19lbmFibGVfYXV0b19hbGlnbiAoKQotewotICBhdXRvX2FsaWduID0gMTsKLX0KLQotc3RhdGljIHZvaWQKLXNfY29ucyAobG9nX3NpemUpCi0gICAgIGludCBsb2dfc2l6ZTsKLXsKLSAgc3ltYm9sUyAqbGFiZWw7Ci0KLSAgbGFiZWwgPSBpbnNuX2xhYmVscyAhPSBOVUxMID8gaW5zbl9sYWJlbHMtPmxhYmVsIDogTlVMTDsKLSAgbWlwc19lbWl0X2RlbGF5cyAoZmFsc2UpOwotICBpZiAobG9nX3NpemUgPiAwICYmIGF1dG9fYWxpZ24pCi0gICAgbWlwc19hbGlnbiAobG9nX3NpemUsIDAsIGxhYmVsKTsKLSAgbWlwc19jbGVhcl9pbnNuX2xhYmVscyAoKTsKLSAgY29ucyAoMSA8PCBsb2dfc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2Zsb2F0X2NvbnMgKHR5cGUpCi0gICAgIGludCB0eXBlOwotewotICBzeW1ib2xTICpsYWJlbDsKLQotICBsYWJlbCA9IGluc25fbGFiZWxzICE9IE5VTEwgPyBpbnNuX2xhYmVscy0+bGFiZWwgOiBOVUxMOwotCi0gIG1pcHNfZW1pdF9kZWxheXMgKGZhbHNlKTsKLQotICBpZiAoYXV0b19hbGlnbikKLSAgICBpZiAodHlwZSA9PSAnZCcpCi0gICAgICBtaXBzX2FsaWduICgzLCAwLCBsYWJlbCk7Ci0gICAgZWxzZQotICAgICAgbWlwc19hbGlnbiAoMiwgMCwgbGFiZWwpOwotCi0gIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgKCk7Ci0KLSAgZmxvYXRfY29ucyAodHlwZSk7Ci19Ci0KLS8qIEhhbmRsZSAuZ2xvYmwuICBXZSBuZWVkIHRvIG92ZXJyaWRlIGl0IGJlY2F1c2Ugb24gSXJpeCA1IHlvdSBhcmUKLSAgIHBlcm1pdHRlZCB0byBzYXkKLSAgICAgICAuZ2xvYmwgZm9vIC50ZXh0Ci0gICB3aGVyZSBmb28gaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgdG8gbWVhbiB0aGF0IGZvbyBzaG91bGQgYmUKLSAgIGNvbnNpZGVyZWQgdG8gYmUgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfZ2xvYmwgKHgpCi0gICAgIGludCB4OwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgZmxhZ3dvcmQgZmxhZzsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAvKiBPbiBJcml4IDUsIGV2ZXJ5IGdsb2JhbCBzeW1ib2wgdGhhdCBpcyBub3QgZXhwbGljaXRseSBsYWJlbGxlZCBhcwotICAgICBiZWluZyBhIGZ1bmN0aW9uIGlzIGFwcGFyZW50bHkgbGFiZWxsZWQgYXMgYmVpbmcgYW4gb2JqZWN0LiAgKi8KLSAgZmxhZyA9IEJTRl9PQkpFQ1Q7Ci0KLSAgaWYgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGNoYXIgKnNlY25hbWU7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotCi0gICAgICBzZWNuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0ZG91dHB1dCwgc2VjbmFtZSk7Ci0gICAgICBpZiAoc2VjID09IE5VTEwpCi0JYXNfYmFkIChfKCIlczogbm8gc3VjaCBzZWN0aW9uIiksIHNlY25hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgICAgIGlmIChzZWMgIT0gTlVMTCAmJiAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotCWZsYWcgPSBCU0ZfRlVOQ1RJT047Ci0gICAgfQotCi0gIHN5bWJvbFAtPmJzeW0tPmZsYWdzIHw9IGZsYWc7Ci0KLSAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19vcHRpb24gKHgpCi0gICAgIGludCB4OwotewotICBjaGFyICpvcHQ7Ci0gIGNoYXIgYzsKLQotICBvcHQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBpZiAoKm9wdCA9PSAnTycpCi0gICAgewotICAgICAgLyogRklYTUU6IFdoYXQgZG9lcyB0aGlzIG1lYW4/ICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAob3B0LCAicGljIiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgaSA9IGF0b2kgKG9wdCArIDMpOwotICAgICAgaWYgKGkgPT0gMCkKLQltaXBzX3BpYyA9IE5PX1BJQzsKLSAgICAgIGVsc2UgaWYgKGkgPT0gMikKLQltaXBzX3BpYyA9IFNWUjRfUElDOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiLm9wdGlvbiBwaWMlZCBub3Qgc3VwcG9ydGVkIiksIGkpOwotCi0gICAgICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCAmJiBtaXBzX3BpYyA9PSBTVlI0X1BJQykKLQl7Ci0JICBpZiAoZ19zd2l0Y2hfc2VlbiAmJiBnX3N3aXRjaF92YWx1ZSAhPSAwKQotCSAgICBhc193YXJuIChfKCItRyBtYXkgbm90IGJlIHVzZWQgd2l0aCBTVlI0IFBJQyBjb2RlIikpOwotCSAgZ19zd2l0Y2hfdmFsdWUgPSAwOwotCSAgYmZkX3NldF9ncF9zaXplIChzdGRvdXRwdXQsIDApOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBhc193YXJuIChfKCJVbnJlY29nbml6ZWQgb3B0aW9uIFwiJXNcIiIpLCBvcHQpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgYSBzdGFjayBvZiAuc2V0IHZhbHVlcy4gICovCi0KLXN0cnVjdCBtaXBzX29wdGlvbl9zdGFjawotewotICBzdHJ1Y3QgbWlwc19vcHRpb25fc3RhY2sgKm5leHQ7Ci0gIHN0cnVjdCBtaXBzX3NldF9vcHRpb25zIG9wdGlvbnM7Ci19OwotCi1zdGF0aWMgc3RydWN0IG1pcHNfb3B0aW9uX3N0YWNrICptaXBzX29wdHNfc3RhY2s7Ci0KLS8qIEhhbmRsZSB0aGUgLnNldCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19taXBzc2V0ICh4KQotICAgICBpbnQgeDsKLXsKLSAgY2hhciAqbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlciwgY2g7Ci0KLSAgd2hpbGUgKCFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGNoID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgInJlb3JkZXIiKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChtaXBzX29wdHMubm9yZW9yZGVyICYmIHByZXZfbm9wX2ZyYWcgIT0gTlVMTCkKLQl7Ci0JICAvKiBJZiB3ZSBzdGlsbCBoYXZlIHBlbmRpbmcgbm9wcywgd2UgY2FuIGRpc2NhcmQgdGhlbS4gIFRoZQotCSAgICAgdXN1YWwgbm9wIGhhbmRsaW5nIHdpbGwgaW5zZXJ0IGFueSB0aGF0IGFyZSBzdGlsbAotCSAgICAgbmVlZGVkLiAqLwotCSAgcHJldl9ub3BfZnJhZy0+ZnJfZml4IC09IChwcmV2X25vcF9mcmFnX2hvbGRzCi0JCQkJICAgICogKG1pcHNfb3B0cy5taXBzMTYgPyAyIDogNCkpOwotCSAgcHJldl9ub3BfZnJhZyA9IE5VTEw7Ci0JfQotICAgICAgbWlwc19vcHRzLm5vcmVvcmRlciA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJub3Jlb3JkZXIiKSA9PSAwKQotICAgIHsKLSAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotICAgICAgbWlwc19vcHRzLm5vcmVvcmRlciA9IDE7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXQiKSA9PSAwKQotICAgIHsKLSAgICAgIG1pcHNfb3B0cy5ub2F0ID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm5vYXQiKSA9PSAwKQotICAgIHsKLSAgICAgIG1pcHNfb3B0cy5ub2F0ID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1hY3JvIikgPT0gMCkKLSAgICB7Ci0gICAgICBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibm9tYWNybyIpID09IDApCi0gICAgewotICAgICAgaWYgKG1pcHNfb3B0cy5ub3Jlb3JkZXIgPT0gMCkKLQlhc19iYWQgKF8oImBub3Jlb3JkZXInIG11c3QgYmUgc2V0IGJlZm9yZSBgbm9tYWNybyciKSk7Ci0gICAgICBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibW92ZSIpID09IDAgfHwgc3RyY21wIChuYW1lLCAibm92b2xhdGlsZSIpID09IDApCi0gICAgewotICAgICAgbWlwc19vcHRzLm5vbW92ZSA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJub21vdmUiKSA9PSAwIHx8IHN0cmNtcCAobmFtZSwgInZvbGF0aWxlIikgPT0gMCkKLSAgICB7Ci0gICAgICBtaXBzX29wdHMubm9tb3ZlID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImJvcHQiKSA9PSAwKQotICAgIHsKLSAgICAgIG1pcHNfb3B0cy5ub2JvcHQgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibm9ib3B0IikgPT0gMCkKLSAgICB7Ci0gICAgICBtaXBzX29wdHMubm9ib3B0ID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1pcHMxNiIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICJNSVBTLTE2IikgPT0gMCkKLSAgICBtaXBzX29wdHMubWlwczE2ID0gMTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibm9taXBzMTYiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAibm9NSVBTLTE2IikgPT0gMCkKLSAgICBtaXBzX29wdHMubWlwczE2ID0gMDsKLSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIm1pcHMiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIGludCBpc2E7Ci0KLSAgICAgIC8qIFBlcm1pdCB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIElTQSBvbiB0aGUgZmx5LiAgTmVlZGxlc3MgdG8KLQkgc2F5LCBtaXN1c2UgY2FuIGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMuICAqLwotICAgICAgaXNhID0gYXRvaSAobmFtZSArIDQpOwotICAgICAgaWYgKGlzYSA9PSAwKQotCW1pcHNfb3B0cy5pc2EgPSBmaWxlX21pcHNfaXNhOwotICAgICAgZWxzZSBpZiAoaXNhIDwgMSB8fCBpc2EgPiA0KQotCWFzX2JhZCAoXygidW5rbm93biBJU0EgbGV2ZWwiKSk7Ci0gICAgICBlbHNlCi0JbWlwc19vcHRzLmlzYSA9IGlzYTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImF1dG9leHRlbmQiKSA9PSAwKQotICAgIG1pcHNfb3B0cy5ub2F1dG9leHRlbmQgPSAwOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJub2F1dG9leHRlbmQiKSA9PSAwKQotICAgIG1pcHNfb3B0cy5ub2F1dG9leHRlbmQgPSAxOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJwdXNoIikgPT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbWlwc19vcHRpb25fc3RhY2sgKnM7Ci0KLSAgICAgIHMgPSAoc3RydWN0IG1pcHNfb3B0aW9uX3N0YWNrICopIHhtYWxsb2MgKHNpemVvZiAqcyk7Ci0gICAgICBzLT5uZXh0ID0gbWlwc19vcHRzX3N0YWNrOwotICAgICAgcy0+b3B0aW9ucyA9IG1pcHNfb3B0czsKLSAgICAgIG1pcHNfb3B0c19zdGFjayA9IHM7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJwb3AiKSA9PSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBtaXBzX29wdGlvbl9zdGFjayAqczsKLQotICAgICAgcyA9IG1pcHNfb3B0c19zdGFjazsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JYXNfYmFkIChfKCIuc2V0IHBvcCB3aXRoIG5vIC5zZXQgcHVzaCIpKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJZiB3ZSdyZSBjaGFuZ2luZyB0aGUgcmVvcmRlciBtb2RlIHdlIG5lZWQgdG8gaGFuZGxlCi0gICAgICAgICAgICAgZGVsYXkgc2xvdHMgY29ycmVjdGx5LiAgKi8KLQkgIGlmIChzLT5vcHRpb25zLm5vcmVvcmRlciAmJiAhIG1pcHNfb3B0cy5ub3Jlb3JkZXIpCi0JICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotCSAgZWxzZSBpZiAoISBzLT5vcHRpb25zLm5vcmVvcmRlciAmJiBtaXBzX29wdHMubm9yZW9yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKHByZXZfbm9wX2ZyYWcgIT0gTlVMTCkKLQkJewotCQkgIHByZXZfbm9wX2ZyYWctPmZyX2ZpeCAtPSAocHJldl9ub3BfZnJhZ19ob2xkcwotCQkJCQkgICAgKiAobWlwc19vcHRzLm1pcHMxNiA/IDIgOiA0KSk7Ci0JCSAgcHJldl9ub3BfZnJhZyA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCi0JICBtaXBzX29wdHMgPSBzLT5vcHRpb25zOwotCSAgbWlwc19vcHRzX3N0YWNrID0gcy0+bmV4dDsKLQkgIGZyZWUgKHMpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJUcmllZCB0byBzZXQgdW5yZWNvZ25pemVkIHN5bWJvbDogJXNcbiIpLCBuYW1lKTsKLSAgICB9Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjaDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYWJpY2FsbHMgcHNldWRvLW9wLiAgSSBiZWxpZXZlIHRoaXMgaXMgZXF1aXZhbGVudCB0bwotICAgLm9wdGlvbiBwaWMyLiAgSXQgbWVhbnMgdG8gZ2VuZXJhdGUgU1ZSNCBQSUMgY2FsbHMuICAqLwotCi1zdGF0aWMgdm9pZAotc19hYmljYWxscyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBtaXBzX3BpYyA9IFNWUjRfUElDOwotICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCkKLSAgICB7Ci0gICAgICBpZiAoZ19zd2l0Y2hfc2VlbiAmJiBnX3N3aXRjaF92YWx1ZSAhPSAwKQotCWFzX3dhcm4gKF8oIi1HIG1heSBub3QgYmUgdXNlZCB3aXRoIFNWUjQgUElDIGNvZGUiKSk7Ci0gICAgICBnX3N3aXRjaF92YWx1ZSA9IDA7Ci0gICAgfQotICBiZmRfc2V0X2dwX3NpemUgKHN0ZG91dHB1dCwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmNwbG9hZCBwc2V1ZG8tb3AuICBUaGlzIGlzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIFNWUjQKLSAgIFBJQyBjb2RlLiAgSXQgc2V0cyB0aGUgJGdwIHJlZ2lzdGVyIGZvciB0aGUgZnVuY3Rpb24gYmFzZWQgb24gdGhlCi0gICBmdW5jdGlvbiBhZGRyZXNzLCB3aGljaCBpcyBpbiB0aGUgcmVnaXN0ZXIgbmFtZWQgaW4gdGhlIGFyZ3VtZW50LgotICAgVGhpcyB1c2VzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IF9ncF9kaXNwLCB3aGljaCBpcyBoYW5kbGVkIHNwZWNpYWxseQotICAgYnkgdGhlIGxpbmtlci4gIFRoZSByZXN1bHQgaXM6Ci0JbHVpCSRncCwlaGkoX2dwX2Rpc3ApCi0JYWRkaXUJJGdwLCRncCwlbG8oX2dwX2Rpc3ApCi0JYWRkdQkkZ3AsJGdwLC5jcGxvYWQgYXJndW1lbnQKLSAgIFRoZSAuY3Bsb2FkIGFyZ3VtZW50IGlzIG5vcm1hbGx5ICQyNSA9PSAkdDkuICAqLwotCi1zdGF0aWMgdm9pZAotc19jcGxvYWQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZXhwcmVzc2lvblMgZXg7Ci0gIGludCBpY250ID0gMDsKLQotICAvKiBJZiB3ZSBhcmUgbm90IGdlbmVyYXRpbmcgU1ZSNCBQSUMgY29kZSwgLmNwbG9hZCBpcyBpZ25vcmVkLiAgKi8KLSAgaWYgKG1pcHNfcGljICE9IFNWUjRfUElDKQotICAgIHsKLSAgICAgIHNfaWdub3JlICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogLmNwbG9hZCBzaG91bGQgYmUgYSBpbiAuc2V0IG5vcmVvcmRlciBzZWN0aW9uLiAgKi8KLSAgaWYgKG1pcHNfb3B0cy5ub3Jlb3JkZXIgPT0gMCkKLSAgICBhc193YXJuIChfKCIuY3Bsb2FkIG5vdCBpbiBub3Jlb3JkZXIgc2VjdGlvbiIpKTsKLQotICBleC5YX29wID0gT19zeW1ib2w7Ci0gIGV4LlhfYWRkX3N5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKCJfZ3BfZGlzcCIpOwotICBleC5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gIGV4LlhfYWRkX251bWJlciA9IDA7Ci0KLSAgLyogSW4gRUxGLCB0aGlzIHN5bWJvbCBpcyBpbXBsaWNpdGx5IGFuIFNUVF9PQkpFQ1Qgc3ltYm9sLiAgKi8KLSAgZXguWF9hZGRfc3ltYm9sLT5ic3ltLT5mbGFncyB8PSBCU0ZfT0JKRUNUOwotCi0gIG1hY3JvX2J1aWxkX2x1aSAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleCwgR1ApOwotICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleCwgImFkZGl1IiwgInQscixqIiwgR1AsIEdQLAotCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0KLSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgImFkZHUiLCAiZCx2LHQiLAotCSAgICAgICBHUCwgR1AsIHRjX2dldF9yZWdpc3RlciAoMCkpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmNwcmVzdG9yZSBwc2V1ZG8tb3AuICBUaGlzIHN0b3JlcyAkZ3AgaW50byBhIGdpdmVuCi0gICBvZmZzZXQgZnJvbSAkc3AuICBUaGUgb2Zmc2V0IGlzIHJlbWVtYmVyZWQsIGFuZCBhZnRlciBtYWtpbmcgYSBQSUMKLSAgIGNhbGwgJGdwIGlzIHJlc3RvcmVkIGZyb20gdGhhdCBsb2NhdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2NwcmVzdG9yZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBleHByZXNzaW9uUyBleDsKLSAgaW50IGljbnQgPSAwOwotCi0gIC8qIElmIHdlIGFyZSBub3QgZ2VuZXJhdGluZyBTVlI0IFBJQyBjb2RlLCAuY3ByZXN0b3JlIGlzIGlnbm9yZWQuICAqLwotICBpZiAobWlwc19waWMgIT0gU1ZSNF9QSUMpCi0gICAgewotICAgICAgc19pZ25vcmUgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBtaXBzX2NwcmVzdG9yZV9vZmZzZXQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBleC5YX29wID0gT19jb25zdGFudDsKLSAgZXguWF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgZXguWF9vcF9zeW1ib2wgPSBOVUxMOwotICBleC5YX2FkZF9udW1iZXIgPSBtaXBzX2NwcmVzdG9yZV9vZmZzZXQ7Ci0KLSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXgsCi0JICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCT8gInN3IiA6ICJzZCIpLAotCSAgICAgICAidCxvKGIpIiwgR1AsIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBTUCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuZ3B3b3JkIHBzZXVkby1vcC4gIFRoaXMgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgUElDCi0gICBjb2RlLiAgSXQgZ2VuZXJhdGVzIGEgMzIgYml0IEdQIHJlbGF0aXZlIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZ3B3b3JkIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKmxhYmVsOwotICBleHByZXNzaW9uUyBleDsKLSAgY2hhciAqcDsKLQotICAvKiBXaGVuIG5vdCBnZW5lcmF0aW5nIFBJQyBjb2RlLCB0aGlzIGlzIHRyZWF0ZWQgYXMgLndvcmQuICAqLwotICBpZiAobWlwc19waWMgIT0gU1ZSNF9QSUMpCi0gICAgewotICAgICAgc19jb25zICgyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbGFiZWwgPSBpbnNuX2xhYmVscyAhPSBOVUxMID8gaW5zbl9sYWJlbHMtPmxhYmVsIDogTlVMTDsKLSAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gIGlmIChhdXRvX2FsaWduKQotICAgIG1pcHNfYWxpZ24gKDIsIDAsIGxhYmVsKTsKLSAgbWlwc19jbGVhcl9pbnNuX2xhYmVscyAoKTsKLQotICBleHByZXNzaW9uICgmZXgpOwotCi0gIGlmIChleC5YX29wICE9IE9fc3ltYm9sIHx8IGV4LlhfYWRkX251bWJlciAhPSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgdXNlIG9mIC5ncHdvcmQiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLQotICBwID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSAwLCA0KTsKLSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDQsICZleCwgMCwKLQkgICAgICAgQkZEX1JFTE9DX01JUFNfR1BSRUwzMik7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuY3BhZGQgcHNldWRvLW9wLiAgVGhpcyBpcyB1c2VkIHdoZW4gZGVhbGluZyB3aXRoIHN3aXRjaAotICAgdGFibGVzIGluIFNWUjQgUElDIGNvZGUuICAqLwotCi1zdGF0aWMgdm9pZAotc19jcGFkZCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgaWNudCA9IDA7Ci0gIGludCByZWc7Ci0KLSAgLyogVGhpcyBpcyBpZ25vcmVkIHdoZW4gbm90IGdlbmVyYXRpbmcgU1ZSNCBQSUMgY29kZS4gICovCi0gIGlmIChtaXBzX3BpYyAhPSBTVlI0X1BJQykKLSAgICB7Ci0gICAgICBzX2lnbm9yZSAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEFkZCAkZ3AgdG8gdGhlIHJlZ2lzdGVyIG5hbWVkIGFzIGFuIGFyZ3VtZW50LiAgKi8KLSAgcmVnID0gdGNfZ2V0X3JlZ2lzdGVyICgwKTsKLSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkgICAgICAgImQsdix0IiwgcmVnLCByZWcsIEdQKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOyAgCi19Ci0KLS8qIEhhbmRsZSB0aGUgLmluc24gcHNldWRvLW9wLiAgVGhpcyBtYXJrcyBpbnN0cnVjdGlvbiBsYWJlbHMgaW4KLSAgIG1pcHMxNiBtb2RlLiAgVGhpcyBwZXJtaXRzIHRoZSBsaW5rZXIgdG8gaGFuZGxlIHRoZW0gc3BlY2lhbGx5LAotICAgc3VjaCBhcyBnZW5lcmF0aW5nIGphbHggaW5zdHJ1Y3Rpb25zIHdoZW4gbmVlZGVkLiAgV2UgYWxzbyBtYWtlCi0gICB0aGVtIG9kZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBhc3NlbWJseSwgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlCi0gICByaWdodCBzb3J0IG9mIGNvZGUuICBXZSB3aWxsIG1ha2UgdGhlbSBldmVuIGluIHRoZSBhZGp1c3Rfc3ltdGFiCi0gICByb3V0aW5lLCB3aGlsZSBsZWF2aW5nIHRoZW0gbWFya2VkLiAgVGhpcyBpcyBjb252ZW5pZW50IGZvciB0aGUKLSAgIGRlYnVnZ2VyIGFuZCB0aGUgZGlzYXNzZW1ibGVyLiAgVGhlIGxpbmtlciBrbm93cyB0byBtYWtlIHRoZW0gb2RkCi0gICBhZ2Fpbi4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2luc24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKG1pcHNfb3B0cy5taXBzMTYpCi0gICAgbWlwczE2X21hcmtfbGFiZWxzICgpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5zdGFibiBkaXJlY3RpdmUuICBXZSBuZWVkIHRoZXNlIGluIG9yZGVyIHRvIG1hcmsgYSBsYWJlbAotICAgYXMgYmVpbmcgYSBtaXBzMTYgdGV4dCBsYWJlbCBjb3JyZWN0bHkuICBTb21ldGltZXMgdGhlIGNvbXBpbGVyCi0gICB3aWxsIGVtaXQgYSBsYWJlbCwgZm9sbG93ZWQgYnkgYSAuc3RhYm4sIGFuZCB0aGVuIHN3aXRjaCBzZWN0aW9ucy4KLSAgIElmIHRoZSBsYWJlbCBhbmQgLnN0YWJuIGFyZSBpbiBtaXBzMTYgbW9kZSwgdGhlbiB0aGUgbGFiZWwgaXMKLSAgIHJlYWxseSBhIG1pcHMxNiB0ZXh0IGxhYmVsLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbWlwc19zdGFiICh0eXBlKQotICAgICBpbnQgdHlwZTsKLXsKLSAgaWYgKHR5cGUgPT0gJ24nICYmIG1pcHNfb3B0cy5taXBzMTYpCi0gICAgbWlwczE2X21hcmtfbGFiZWxzICgpOwotCi0gIHNfc3RhYiAodHlwZSk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLndlYWtleHQgcHNldWRvLW9wIGFzIGRlZmluZWQgaW4gS2FuZSBhbmQgSGVpbnJpY2guCi0gKi8KLQotc3RhdGljIHZvaWQKLXNfbWlwc193ZWFrZXh0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gIFNfU0VUX1dFQUsgKHN5bWJvbFApOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApKQotCXsKLQkgIGFzX2JhZCAoIklnbm9yaW5nIGF0dGVtcHQgdG8gcmVkZWZpbmUgc3ltYm9sIGAlcycuIiwKLQkJICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIAotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCX0KLSAgICAgIAotICAgICAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gICAgICBpZiAoZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0JewotCSAgYXNfYmFkICgiYmFkIC53ZWFrZXh0IGRpcmVjdGl2ZSIpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHN5bWJvbFAtPnN5X3ZhbHVlID0gZXhwOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBQYXJzZSBhIHJlZ2lzdGVyIHN0cmluZyBpbnRvIGEgbnVtYmVyLiAgQ2FsbGVkIGZyb20gdGhlIEVDT0ZGIGNvZGUKLSAgIHRvIHBhcnNlIC5mcmFtZS4gIFRoZSBhcmd1bWVudCBpcyBub24temVybyBpZiB0aGlzIGlzIHRoZSBmcmFtZQotICAgcmVnaXN0ZXIsIHNvIHRoYXQgd2UgY2FuIHJlY29yZCBpdCBpbiBtaXBzX2ZyYW1lX3JlZy4gICovCi0KLWludAotdGNfZ2V0X3JlZ2lzdGVyIChmcmFtZSkKLSAgICAgaW50IGZyYW1lOwotewotICBpbnQgcmVnOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnJCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiZXhwZWN0ZWQgYCQnIikpOwotICAgICAgcmVnID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLSAgICB7Ci0gICAgICByZWcgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmIChyZWcgPCAwIHx8IHJlZyA+PSAzMikKLQl7Ci0JICBhc193YXJuIChfKCJCYWQgcmVnaXN0ZXIgbnVtYmVyIikpOwotCSAgcmVnID0gMDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImZwIiwgMikgPT0gMCkKLQlyZWcgPSBGUDsKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInNwIiwgMikgPT0gMCkKLQlyZWcgPSBTUDsKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImdwIiwgMikgPT0gMCkKLQlyZWcgPSBHUDsKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImF0IiwgMikgPT0gMCkKLQlyZWcgPSBBVDsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc193YXJuIChfKCJVbnJlY29nbml6ZWQgcmVnaXN0ZXIgbmFtZSIpKTsKLQkgIHJlZyA9IDA7Ci0JfQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0gICAgfQotICBpZiAoZnJhbWUpCi0gICAgbWlwc19mcmFtZV9yZWcgPSByZWcgIT0gMCA/IHJlZyA6IFNQOwotICByZXR1cm4gcmVnOwotfQotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgYWRkcikKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgdmFsdWVUIGFkZHI7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogV2UgZG9uJ3QgbmVlZCB0byBhbGlnbiBFTEYgc2VjdGlvbnMgdG8gdGhlIGZ1bGwgYWxpZ25tZW50LgotICAgICBIb3dldmVyLCBJcml4IDUgbWF5IHByZWZlciB0aGF0IHdlIGFsaWduIHRoZW0gYXQgbGVhc3QgdG8gYSAxNgotICAgICBieXRlIGJvdW5kYXJ5LiAgV2UgZG9uJ3QgYm90aGVyIHRvIGFsaWduIHRoZSBzZWN0aW9ucyBpZiB3ZSBhcmUKLSAgICAgdGFyZ2V0ZWQgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbS4gICovCi0gIGlmIChzdHJjbXAgKFRBUkdFVF9PUywgImVsZiIpID09IDApCi0gICAgcmV0dXJuIGFkZHI7Ci0gIGlmIChhbGlnbiA+IDQpCi0gICAgYWxpZ24gPSA0OwotI2VuZGlmCi0KLSAgcmV0dXJuICgoYWRkciArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLS8qIFV0aWxpdHkgcm91dGluZSwgY2FsbGVkIGZyb20gYWJvdmUgYXMgd2VsbC4gIElmIGNhbGxlZCB3aGlsZSB0aGUKLSAgIGlucHV0IGZpbGUgaXMgc3RpbGwgYmVpbmcgcmVhZCwgaXQncyBvbmx5IGFuIGFwcHJveGltYXRpb24uICAoRm9yCi0gICBleGFtcGxlLCBhIHN5bWJvbCBtYXkgbGF0ZXIgYmVjb21lIGRlZmluZWQgd2hpY2ggYXBwZWFyZWQgdG8gYmUKLSAgIHVuZGVmaW5lZCBlYXJsaWVyLikgICovCi0KLXN0YXRpYyBpbnQKLW5vcGljX25lZWRfcmVsYXggKHN5bSwgYmVmb3JlX3JlbGF4aW5nKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIGludCBiZWZvcmVfcmVsYXhpbmc7Ci17Ci0gIGlmIChzeW0gPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzeW1uYW1lOwotICAgICAgaW50IGNoYW5nZTsKLQotICAgICAgLyogRmluZCBvdXQgd2hldGhlciB0aGlzIHN5bWJvbCBjYW4gYmUgcmVmZXJlbmNlZCBvZmYgdGhlIEdQCi0JIHJlZ2lzdGVyLiAgSXQgY2FuIGJlIGlmIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgLUcgc2l6ZSBvciBpZgotCSBpdCBpcyBpbiB0aGUgLnNkYXRhIG9yIC5zYnNzIHNlY3Rpb24uICBDZXJ0YWluIHN5bWJvbHMgY2FuCi0JIG5vdCBiZSByZWZlcmVuY2VkIG9mZiB0aGUgR1AsIGFsdGhvdWdoIGl0IGFwcGVhcnMgYXMgdGhvdWdoCi0JIHRoZXkgY2FuLiAgKi8KLSAgICAgIHN5bW5hbWUgPSBTX0dFVF9OQU1FIChzeW0pOwotICAgICAgaWYgKHN5bW5hbWUgIT0gKGNvbnN0IGNoYXIgKikgTlVMTAotCSAgJiYgKHN0cmNtcCAoc3ltbmFtZSwgImVwcm9sIikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgImV0ZXh0IikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgIl9ncCIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJlZGF0YSIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJfZmJzcyIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJfZmRhdGEiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChzeW1uYW1lLCAiX2Z0ZXh0IikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgImVuZCIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJfZ3BfZGlzcCIpID09IDApKQotCWNoYW5nZSA9IDE7Ci0gICAgICBlbHNlIGlmICgoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpCi0JICAgICAgICYmICgwCi0jaWZuZGVmIE5PX0VDT0ZGX0RFQlVHR0lORwotCQkgICB8fCAoc3ltLT5lY29mZl9leHRlcm5fc2l6ZSAhPSAwCi0JCSAgICAgICAmJiBzeW0tPmVjb2ZmX2V4dGVybl9zaXplIDw9IGdfc3dpdGNoX3ZhbHVlKQotI2VuZGlmCi0JCSAgIC8qIFdlIG11c3QgZGVmZXIgdGhpcyBkZWNpc2lvbiB1bnRpbCBhZnRlciB0aGUgd2hvbGUKLQkJICAgICAgZmlsZSBoYXMgYmVlbiByZWFkLCBzaW5jZSB0aGVyZSBtaWdodCBiZSBhIC5leHRlcm4KLQkJICAgICAgYWZ0ZXIgdGhlIGZpcnN0IHVzZSBvZiB0aGlzIHN5bWJvbC4gICovCi0JCSAgIHx8IChiZWZvcmVfcmVsYXhpbmcKLSNpZm5kZWYgTk9fRUNPRkZfREVCVUdHSU5HCi0JCSAgICAgICAmJiBzeW0tPmVjb2ZmX2V4dGVybl9zaXplID09IDAKLSNlbmRpZgotCQkgICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bSkgPT0gMCkKLQkJICAgfHwgKFNfR0VUX1ZBTFVFIChzeW0pICE9IDAKLQkJICAgICAgICYmIFNfR0VUX1ZBTFVFIChzeW0pIDw9IGdfc3dpdGNoX3ZhbHVlKSkpCi0JY2hhbmdlID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICpzZWduYW1lOwotCi0JICBzZWduYW1lID0gc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzeW0pKTsKLQkgIGFzc2VydCAoc3RyY21wIChzZWduYW1lLCAiLmxpdDgiKSAhPSAwCi0JCSAgJiYgc3RyY21wIChzZWduYW1lLCAiLmxpdDQiKSAhPSAwKTsKLQkgIGNoYW5nZSA9IChzdHJjbXAgKHNlZ25hbWUsICIuc2RhdGEiKSAhPSAwCi0JCSAgICAmJiBzdHJjbXAgKHNlZ25hbWUsICIuc2JzcyIpICE9IDApOwotCX0KLSAgICAgIHJldHVybiBjaGFuZ2U7Ci0gICAgfQotICBlbHNlCi0gICAgLyogV2UgYXJlIG5vdCBvcHRpbWl6aW5nIGZvciB0aGUgR1AgcmVnaXN0ZXIuICAqLwotICAgIHJldHVybiAxOwotfQotCi0vKiBHaXZlbiBhIG1pcHMxNiB2YXJpYW50IGZyYWcgRlJBR1AsIHJldHVybiBub24temVybyBpZiBpdCBuZWVkcyBhbgotICAgZXh0ZW5kZWQgb3Bjb2RlLiAgU0VDIGlzIHRoZSBzZWN0aW9uIHRoZSBmcmFnIGlzIGluLiAgKi8KLQotc3RhdGljIGludAotbWlwczE2X2V4dGVuZGVkX2ZyYWcgKGZyYWdwLCBzZWMsIHN0cmV0Y2gpCi0gICAgIGZyYWdTICpmcmFncDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgbG9uZyBzdHJldGNoOwotewotICBpbnQgdHlwZTsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1pcHMxNl9pbW1lZF9vcGVyYW5kICpvcDsKLSAgb2Zmc2V0VCB2YWw7Ci0gIGludCBtaW50aW55LCBtYXh0aW55OwotICBzZWdUIHN5bXNlYzsKLQotICBpZiAoUkVMQVhfTUlQUzE2X1VTRVJfU01BTEwgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKFJFTEFYX01JUFMxNl9VU0VSX0VYVCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotICAgIHJldHVybiAxOwotCi0gIHR5cGUgPSBSRUxBWF9NSVBTMTZfVFlQRSAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotICBvcCA9IG1pcHMxNl9pbW1lZF9vcGVyYW5kczsKLSAgd2hpbGUgKG9wLT50eXBlICE9IHR5cGUpCi0gICAgewotICAgICAgKytvcDsKLSAgICAgIGFzc2VydCAob3AgPCBtaXBzMTZfaW1tZWRfb3BlcmFuZHMgKyBNSVBTMTZfTlVNX0lNTUVEKTsKLSAgICB9Ci0KLSAgaWYgKG9wLT51bnNwKQotICAgIHsKLSAgICAgIGlmICh0eXBlID09ICc8JyB8fCB0eXBlID09ICc+JyB8fCB0eXBlID09ICdbJyB8fCB0eXBlID09ICddJykKLQl7Ci0JICBtaW50aW55ID0gMTsKLQkgIG1heHRpbnkgPSAxIDw8IG9wLT5uYml0czsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWludGlueSA9IDA7Ci0JICBtYXh0aW55ID0gKDEgPDwgb3AtPm5iaXRzKSAtIDE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG1pbnRpbnkgPSAtICgxIDw8IChvcC0+bmJpdHMgLSAxKSk7Ci0gICAgICBtYXh0aW55ID0gKDEgPDwgKG9wLT5uYml0cyAtIDEpKSAtIDE7Ci0gICAgfQotCi0gIC8qIFdlIGNhbid0IGNhbGwgU19HRVRfVkFMVUUgaGVyZSwgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGxvY2sgaW4KLSAgICAgYSBwYXJ0aWN1bGFyIGZyYWcgYWRkcmVzcy4gICovCi0gIGlmIChmcmFncC0+ZnJfc3ltYm9sLT5zeV92YWx1ZS5YX29wID09IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgdmFsID0gKGZyYWdwLT5mcl9zeW1ib2wtPnN5X3ZhbHVlLlhfYWRkX251bWJlcgotCSAgICAgKyBmcmFncC0+ZnJfc3ltYm9sLT5zeV9mcmFnLT5mcl9hZGRyZXNzKTsKLSAgICAgIHN5bXNlYyA9IFNfR0VUX1NFR01FTlQgKGZyYWdwLT5mcl9zeW1ib2wpOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ3AtPmZyX3N5bWJvbC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCSAgICYmIChmcmFncC0+ZnJfc3ltYm9sLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wtPnN5X3ZhbHVlLlhfb3AKLQkgICAgICAgPT0gT19jb25zdGFudCkpCi0gICAgewotICAgICAgdmFsID0gKGZyYWdwLT5mcl9zeW1ib2wtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyCi0JICAgICArIGZyYWdwLT5mcl9zeW1ib2wtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbC0+c3lfZnJhZy0+ZnJfYWRkcmVzcwotCSAgICAgKyBmcmFncC0+ZnJfc3ltYm9sLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIKLQkgICAgICsgZnJhZ3AtPmZyX3N5bWJvbC0+c3lfZnJhZy0+ZnJfYWRkcmVzcyk7Ci0gICAgICBzeW1zZWMgPSBTX0dFVF9TRUdNRU5UIChmcmFncC0+ZnJfc3ltYm9sLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAxOwotCi0gIGlmIChvcC0+cGNyZWwpCi0gICAgewotICAgICAgYWRkcmVzc1QgYWRkcjsKLQotICAgICAgLyogV2Ugd29uJ3QgaGF2ZSB0aGUgc2VjdGlvbiB3aGVuIHdlIGFyZSBjYWxsZWQgZnJvbQotICAgICAgICAgbWlwc19yZWxheF9mcmFnLiAgSG93ZXZlciwgd2Ugd2lsbCBhbHdheXMgaGF2ZSBiZWVuIGNhbGxlZAotICAgICAgICAgZnJvbSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBmaXJzdC4gIElmIHRoaXMgaXMgYQotICAgICAgICAgYnJhbmNoIHRvIGEgZGlmZmVyZW50IHNlY3Rpb24sIHdlIG1hcmsgaXQgYXMgc3VjaC4gIElmIFNFQyBpcwotICAgICAgICAgTlVMTCwgYW5kIHRoZSBmcmFnIGlzIG5vdCBtYXJrZWQsIHRoZW4gaXQgbXVzdCBiZSBhIGJyYW5jaCB0bwotICAgICAgICAgdGhlIHNhbWUgc2VjdGlvbi4gICovCi0gICAgICBpZiAoc2VjID09IE5VTEwpCi0JewotCSAgaWYgKFJFTEFYX01JUFMxNl9MT05HX0JSQU5DSCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCSAgICByZXR1cm4gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHN5bXNlYyAhPSBzZWMpCi0JICAgIHsKLQkgICAgICBmcmFncC0+ZnJfc3VidHlwZSA9Ci0JCVJFTEFYX01JUFMxNl9NQVJLX0xPTkdfQlJBTkNIIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0KLQkgICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIHN1cHBvcnQgdGhpcywgYW5kIGxldCB0aGUgbGlua2VyCi0gICAgICAgICAgICAgICAgIGNhdGNoIGJyYW5jaGVzIGFuZCBsb2FkcyB0aGF0IGFyZSBvdXQgb2YgcmFuZ2UuICAqLwotCSAgICAgIGFzX2JhZF93aGVyZSAoZnJhZ3AtPmZyX2ZpbGUsIGZyYWdwLT5mcl9saW5lLAotCQkJICAgIF8oInVuc3VwcG9ydGVkIFBDIHJlbGF0aXZlIHJlZmVyZW5jZSB0byBkaWZmZXJlbnQgc2VjdGlvbiIpKTsKLQotCSAgICAgIHJldHVybiAxOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJbiB0aGlzIGNhc2UsIHdlIGtub3cgZm9yIHN1cmUgdGhhdCB0aGUgc3ltYm9sIGZyYWdtZW50IGlzIGluCi0JIHRoZSBzYW1lIHNlY3Rpb24uICBJZiB0aGUgZnJfYWRkcmVzcyBvZiB0aGUgc3ltYm9sIGZyYWdtZW50Ci0JIGlzIGdyZWF0ZXIgdGhlbiB0aGUgYWRkcmVzcyBvZiB0aGlzIGZyYWdtZW50IHdlIHdhbnQgdG8gYWRkCi0JIGluIFNUUkVUQ0ggaW4gb3JkZXIgdG8gZ2V0IGEgYmV0dGVyIGVzdGltYXRlIG9mIHRoZSBhZGRyZXNzLgotCSBUaGlzIHBhcnRpY3VsYXJseSBtYXR0ZXJzIGJlY2F1c2Ugb2YgdGhlIHNoaWZ0IGJpdHMuICAqLwotICAgICAgaWYgKHN0cmV0Y2ggIT0gMAotCSAgJiYgZnJhZ3AtPmZyX3N5bWJvbC0+c3lfZnJhZy0+ZnJfYWRkcmVzcyA+PSBmcmFncC0+ZnJfYWRkcmVzcykKLQl7Ci0JICBmcmFnUyAqZjsKLQotCSAgLyogQWRqdXN0IHN0cmV0Y2ggZm9yIGFueSBhbGlnbm1lbnQgZnJhZy4gIE5vdGUgdGhhdCBpZiBoYXZlCi0gICAgICAgICAgICAgYmVlbiBleHBhbmRpbmcgdGhlIGVhcmxpZXIgY29kZSwgdGhlIHN5bWJvbCBtYXkgYmUKLSAgICAgICAgICAgICBkZWZpbmVkIGluIHdoYXQgYXBwZWFycyB0byBiZSBhbiBlYXJsaWVyIGZyYWcuICBGSVhNRToKLSAgICAgICAgICAgICBUaGlzIGRvZXNuJ3QgaGFuZGxlIHRoZSBmcl9zdWJ0eXBlIGZpZWxkLCB3aGljaCBzcGVjaWZpZXMKLSAgICAgICAgICAgICBhIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgd2hlbiBkb2luZyBhbgotICAgICAgICAgICAgIGFsaWdubWVudC4gICovCi0JICBmb3IgKGYgPSBmcmFncDsKLQkgICAgICAgZiAhPSBOVUxMICYmIGYgIT0gZnJhZ3AtPmZyX3N5bWJvbC0+c3lfZnJhZzsKLQkgICAgICAgZiA9IGYtPmZyX25leHQpCi0JICAgIHsKLQkgICAgICBpZiAoZi0+ZnJfdHlwZSA9PSByc19hbGlnbiB8fCBmLT5mcl90eXBlID09IHJzX2FsaWduX2NvZGUpCi0JCXsKLQkJICBpZiAoc3RyZXRjaCA8IDApCi0JCSAgICBzdHJldGNoID0gLSAoKC0gc3RyZXRjaCkKLQkJCQkgJiB+ICgoMSA8PCAoaW50KSBmLT5mcl9vZmZzZXQpIC0gMSkpOwotCQkgIGVsc2UKLQkJICAgIHN0cmV0Y2ggJj0gfiAoKDEgPDwgKGludCkgZi0+ZnJfb2Zmc2V0KSAtIDEpOwotCQkgIGlmIChzdHJldGNoID09IDApCi0JCSAgICBicmVhazsKLQkJfQotCSAgICB9Ci0JICBpZiAoZiAhPSBOVUxMKQotCSAgICB2YWwgKz0gc3RyZXRjaDsKLQl9Ci0KLSAgICAgIGFkZHIgPSBmcmFncC0+ZnJfYWRkcmVzcyArIGZyYWdwLT5mcl9maXg7Ci0KLSAgICAgIC8qIFRoZSBiYXNlIGFkZHJlc3MgcnVsZXMgYXJlIGNvbXBsaWNhdGVkLiAgVGhlIGJhc2UgYWRkcmVzcyBvZgotICAgICAgICAgYSBicmFuY2ggaXMgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbi4gIFRoZSBiYXNlIGFkZHJlc3Mgb2YgYQotICAgICAgICAgUEMgcmVsYXRpdmUgbG9hZCBvciBhZGQgaXMgdGhlIGluc3RydWN0aW9uIGl0c2VsZiwgYnV0IGlmIGl0Ci0gICAgICAgICBpcyBpbiBhIGRlbGF5IHNsb3QgKGluIHdoaWNoIGNhc2UgaXQgY2FuIG5vdCBiZSBleHRlbmRlZCkgdXNlCi0gICAgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gd2hvc2UgZGVsYXkgc2xvdCBpdCBpcyBpbi4gICovCi0gICAgICBpZiAodHlwZSA9PSAncCcgfHwgdHlwZSA9PSAncScpCi0JewotCSAgYWRkciArPSAyOwotCi0JICAvKiBJZiB3ZSBhcmUgY3VycmVudGx5IGFzc3VtaW5nIHRoYXQgdGhpcyBmcmFnIHNob3VsZCBiZQotCSAgICAgZXh0ZW5kZWQsIHRoZW4sIHRoZSBjdXJyZW50IGFkZHJlc3MgaXMgdHdvIGJ5dGVzCi0JICAgICBoaWdoZXIuICovCi0JICBpZiAoUkVMQVhfTUlQUzE2X0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JICAgIGFkZHIgKz0gMjsKLQotCSAgLyogSWdub3JlIHRoZSBsb3cgYml0IGluIHRoZSB0YXJnZXQsIHNpbmNlIGl0IHdpbGwgYmUgc2V0Ci0gICAgICAgICAgICAgZm9yIGEgdGV4dCBsYWJlbC4gICovCi0JICBpZiAoKHZhbCAmIDEpICE9IDApCi0JICAgIC0tdmFsOwotCX0KLSAgICAgIGVsc2UgaWYgKFJFTEFYX01JUFMxNl9KQUxfRFNMT1QgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQlhZGRyIC09IDQ7Ci0gICAgICBlbHNlIGlmIChSRUxBWF9NSVBTMTZfRFNMT1QgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQlhZGRyIC09IDI7Ci0KLSAgICAgIHZhbCAtPSBhZGRyICYgfiAoKDEgPDwgb3AtPnNoaWZ0KSAtIDEpOwotCi0gICAgICAvKiBCcmFuY2ggb2Zmc2V0cyBoYXZlIGFuIGltcGxpY2l0IDAgaW4gdGhlIGxvd2VzdCBiaXQuICAqLwotICAgICAgaWYgKHR5cGUgPT0gJ3AnIHx8IHR5cGUgPT0gJ3EnKQotCXZhbCAvPSAyOwotCi0gICAgICAvKiBJZiBhbnkgb2YgdGhlIHNoaWZ0ZWQgYml0cyBhcmUgc2V0LCB3ZSBtdXN0IHVzZSBhbiBleHRlbmRlZAotICAgICAgICAgb3Bjb2RlLiAgSWYgdGhlIGFkZHJlc3MgZGVwZW5kcyBvbiB0aGUgc2l6ZSBvZiB0aGlzCi0gICAgICAgICBpbnN0cnVjdGlvbiwgdGhpcyBjYW4gbGVhZCB0byBhIGxvb3AsIHNvIHdlIGFycmFuZ2UgdG8gYWx3YXlzCi0gICAgICAgICB1c2UgYW4gZXh0ZW5kZWQgb3Bjb2RlLiAgV2Ugb25seSBjaGVjayB0aGlzIHdoZW4gd2UgYXJlIGluCi0gICAgICAgICB0aGUgbWFpbiByZWxheGF0aW9uIGxvb3AsIHdoZW4gU0VDIGlzIE5VTEwuICAqLwotICAgICAgaWYgKCh2YWwgJiAoKDEgPDwgb3AtPnNoaWZ0KSAtIDEpKSAhPSAwICYmIHNlYyA9PSBOVUxMKQotCXsKLQkgIGZyYWdwLT5mcl9zdWJ0eXBlID0KLQkgICAgUkVMQVhfTUlQUzE2X01BUktfTE9OR19CUkFOQ0ggKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLQkgIHJldHVybiAxOwotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIGFib3V0IHRvIG1hcmsgYSBmcmFnIGFzIGV4dGVuZGVkIGJlY2F1c2UgdGhlIHZhbHVlCi0gICAgICAgICBpcyBwcmVjaXNlbHkgbWF4dGlueSArIDEsIHRoZW4gdGhlcmUgaXMgYSBjaGFuY2Ugb2YgYW4KLSAgICAgICAgIGluZmluaXRlIGxvb3AgYXMgaW4gdGhlIGZvbGxvd2luZyBjb2RlOgotCSAgICAgbGEJJDQsZm9vCi0JICAgICAuc2tpcAkxMDIwCi0JICAgICAuYWxpZ24JMgotCSAgIGZvbzoKLQkgSW4gdGhpcyBjYXNlIHdoZW4gdGhlIGxhIGlzIGV4dGVuZGVkLCBmb28gaXMgMHgzZmMgYnl0ZXMKLQkgYXdheSwgc28gdGhlIGxhIGNhbiBiZSBzaHJ1bmssIGJ1dCB0aGVuIGZvbyBpcyAweDQwMCBhd2F5LCBzbwotCSB0aGUgbGEgbXVzdCBiZSBleHRlbmRlZC4gIFRvIGF2b2lkIHRoaXMgbG9vcCwgd2UgbWFyayB0aGUKLQkgZnJhZyBhcyBleHRlbmRlZCBpZiBpdCB3YXMgc21hbGwsIGFuZCBpcyBhYm91dCB0byBiZWNvbWUKLQkgZXh0ZW5kZWQgd2l0aCBhIHZhbHVlIG9mIG1heHRpbnkgKyAxLiAgKi8KLSAgICAgIGlmICh2YWwgPT0gKChtYXh0aW55ICsgMSkgPDwgb3AtPnNoaWZ0KQotCSAgJiYgISBSRUxBWF9NSVBTMTZfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKQotCSAgJiYgc2VjID09IE5VTEwpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPQotCSAgICBSRUxBWF9NSVBTMTZfTUFSS19MT05HX0JSQU5DSCAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3ltc2VjICE9IGFic29sdXRlX3NlY3Rpb24gJiYgc2VjICE9IE5VTEwpCi0gICAgYXNfYmFkX3doZXJlIChmcmFncC0+ZnJfZmlsZSwgZnJhZ3AtPmZyX2xpbmUsIF8oInVuc3VwcG9ydGVkIHJlbG9jYXRpb24iKSk7Ci0KLSAgaWYgKCh2YWwgJiAoKDEgPDwgb3AtPnNoaWZ0KSAtIDEpKSAhPSAwCi0gICAgICB8fCB2YWwgPCAobWludGlueSA8PCBvcC0+c2hpZnQpCi0gICAgICB8fCB2YWwgPiAobWF4dGlueSA8PCBvcC0+c2hpZnQpKQotICAgIHJldHVybiAxOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEVzdGltYXRlIHRoZSBzaXplIG9mIGEgZnJhZyBiZWZvcmUgcmVsYXhpbmcuICBVbmxlc3MgdGhpcyBpcyB0aGUKLSAgIG1pcHMxNiwgd2UgYXJlIG5vdCByZWFsbHkgcmVsYXhpbmcgaGVyZSwgYW5kIHRoZSBmaW5hbCBzaXplIGlzCi0gICBlbmNvZGVkIGluIHRoZSBzdWJ0eXBlIGluZm9ybWF0aW9uLiAgRm9yIHRoZSBtaXBzMTYsIHdlIGhhdmUgdG8KLSAgIGRlY2lkZSB3aGV0aGVyIHdlIGFyZSB1c2luZyBhbiBleHRlbmRlZCBvcGNvZGUgb3Igbm90LiAgKi8KLQotLypBUkdTVVNFRCovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VndHlwZSkKLSAgICAgZnJhZ1MgKmZyYWdwOwotICAgICBhc2VjdGlvbiAqc2VndHlwZTsKLXsKLSAgaW50IGNoYW5nZTsKLQotICBpZiAoUkVMQVhfTUlQUzE2X1AgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLSAgICB7Ci0gICAgICBpZiAobWlwczE2X2V4dGVuZGVkX2ZyYWcgKGZyYWdwLCBzZWd0eXBlLCAwKSkKLQl7Ci0JICBmcmFncC0+ZnJfc3VidHlwZSA9IFJFTEFYX01JUFMxNl9NQVJLX0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0JICByZXR1cm4gNDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSBSRUxBWF9NSVBTMTZfQ0xFQVJfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLQkgIHJldHVybiAyOwotCX0KLSAgICB9Ci0KLSAgaWYgKG1pcHNfcGljID09IE5PX1BJQykKLSAgICB7Ci0gICAgICBjaGFuZ2UgPSBub3BpY19uZWVkX3JlbGF4IChmcmFncC0+ZnJfc3ltYm9sLCAwKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzeW1zZWM7Ci0KLSAgICAgIHN5bSA9IGZyYWdwLT5mcl9zeW1ib2w7Ci0KLSAgICAgIC8qIEhhbmRsZSB0aGUgY2FzZSBvZiBhIHN5bWJvbCBlcXVhdGVkIHRvIGFub3RoZXIgc3ltYm9sLiAgKi8KLSAgICAgIHdoaWxlIChzeW0tPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wKLQkgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltKSB8fCBTX0lTX0NPTU1PTiAoc3ltKSkpCi0JewotCSAgc3ltYm9sUyAqbjsKLQotCSAgLyogSXQncyBwb3NzaWJsZSB0byBnZXQgYSBsb29wIGhlcmUgaW4gYSBiYWRseSB3cml0dGVuCi0gICAgICAgICAgICAgcHJvZ3JhbS4gICovCi0JICBuID0gc3ltLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2w7Ci0JICBpZiAobiA9PSBzeW0pCi0JICAgIGJyZWFrOwotCSAgc3ltID0gbjsKLQl9Ci0KLSAgICAgIHN5bXNlYyA9IFNfR0VUX1NFR01FTlQgKHN5bSk7Ci0KLSAgICAgIC8qIFRoaXMgbXVzdCBkdXBsaWNhdGUgdGhlIHRlc3QgaW4gYWRqdXN0X3JlbG9jX3N5bXMuICAqLwotICAgICAgY2hhbmdlID0gKHN5bXNlYyAhPSAmYmZkX3VuZF9zZWN0aW9uCi0JCSYmIHN5bXNlYyAhPSAmYmZkX2Fic19zZWN0aW9uCi0JCSYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1zZWMpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoY2hhbmdlKQotICAgIHsKLSAgICAgIC8qIFJlY29yZCB0aGUgb2Zmc2V0IHRvIHRoZSBmaXJzdCByZWxvYyBpbiB0aGUgZnJfb3Bjb2RlIGZpZWxkLgotCSBUaGlzIGxldHMgbWRfY29udmVydF9mcmFnIGFuZCB0Y19nZW5fcmVsb2Mga25vdyB0aGF0IHRoZSBjb2RlCi0JIG11c3QgYmUgZXhwYW5kZWQuICAqLwotICAgICAgZnJhZ3AtPmZyX29wY29kZSA9IChmcmFncC0+ZnJfbGl0ZXJhbAotCQkJICArIGZyYWdwLT5mcl9maXgKLQkJCSAgLSBSRUxBWF9PTEQgKGZyYWdwLT5mcl9zdWJ0eXBlKQotCQkJICArIFJFTEFYX1JFTE9DMSAoZnJhZ3AtPmZyX3N1YnR5cGUpKTsKLSAgICAgIC8qIEZJWE1FOiBUaGlzIHJlYWxseSBuZWVkcyBhc193YXJuX3doZXJlLiAgKi8KLSAgICAgIGlmIChSRUxBWF9XQVJOIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JYXNfd2FybiAoXygiQVQgdXNlZCBhZnRlciBcIi5zZXQgbm9hdFwiIG9yIG1hY3JvIHVzZWQgYWZ0ZXIgXCIuc2V0IG5vbWFjcm9cIiIpKTsKLSAgICB9Ci0KLSAgaWYgKCEgY2hhbmdlKQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgcmV0dXJuIFJFTEFYX05FVyAoZnJhZ3AtPmZyX3N1YnR5cGUpIC0gUkVMQVhfT0xEIChmcmFncC0+ZnJfc3VidHlwZSk7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHRvIHNlZSB3aGV0aGVyIGEgcmVsb2MgYWdhaW5zdCBhIGRlZmluZWQgc3ltYm9sCi0gICBzaG91bGQgYmUgY29udmVydGVkIGludG8gYSByZWxvYyBhZ2FpbnN0IGEgc2VjdGlvbi4gIERvbid0IGFkanVzdAotICAgTUlQUzE2IGp1bXAgcmVsb2NhdGlvbnMsIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGZvcm1hdAotICAgb2YgdGhlIG9mZnNldCBpbiB0aGUgLm8gZmlsZS4gIERvbid0IGFkanVzdCByZWxvY2F0aW9ucyBhZ2FpbnN0Ci0gICBtaXBzMTYgc3ltYm9scywgc28gdGhhdCB0aGUgbGlua2VyIGNhbiBmaW5kIHRoZW0gaWYgaXQgbmVlZHMgdG8gc2V0Ci0gICB1cCBhIHN0dWIuICAqLwotCi1pbnQKLW1pcHNfZml4X2FkanVzdGFibGUgKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFMxNl9KTVApCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0jaWZkZWYgT0JKX0VMRgotICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICAmJiBTX0dFVF9PVEhFUiAoZml4cC0+ZnhfYWRkc3kpID09IFNUT19NSVBTMTYKLSAgICAgICYmIGZpeHAtPmZ4X3N1YnN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldAotICAgZm9ybWF0LiAgKi8KLQotYXJlbGVudCAqKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgc3RhdGljIGFyZWxlbnQgKnJldHZhbFs0XTsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotCi0gIHJlbG9jID0gcmV0dmFsWzBdID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJldHZhbFsxXSA9IE5VTEw7Ci0KLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gJmZpeHAtPmZ4X2FkZHN5LT5ic3ltOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICBpZiAobWlwc19waWMgPT0gRU1CRURERURfUElDCi0gICAgICAmJiBTV0lUQ0hfVEFCTEUgKGZpeHApKQotICAgIHsKLSAgICAgIC8qIEZvciBhIHN3aXRjaCB0YWJsZSBlbnRyeSB3ZSB1c2UgYSBzcGVjaWFsIHJlbG9jLiAgVGhlIGFkZGVuZAotCSBpcyBhY3R1YWxseSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZWxvYyBhZGRyZXNzIGFuZCB0aGUKLQkgc3VidHJhaGVuZC4gICovCi0gICAgICByZWxvYy0+YWRkZW5kID0gcmVsb2MtPmFkZHJlc3MgLSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpOwotICAgICAgaWYgKE9VVFBVVF9GTEFWT1IgIT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyKQotCWFzX2ZhdGFsIChfKCJEb3VibGUgY2hlY2sgZnhfcl90eXBlIGluIHRjLW1pcHMuYzp0Y19nZW5fcmVsb2MiKSk7Ci0gICAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfR1BSRUwzMjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfUENSRUxfTE8xNikKLSAgICB7Ci0gICAgICAvKiBXZSB1c2UgYSBzcGVjaWFsIGFkZGVuZCBmb3IgYW4gaW50ZXJuYWwgUkVMTE8gcmVsb2MuICAqLwotICAgICAgaWYgKGZpeHAtPmZ4X2FkZHN5LT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQlyZWxvYy0+YWRkZW5kID0gcmVsb2MtPmFkZHJlc3MgLSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpOwotICAgICAgZWxzZQotCXJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXIgKyByZWxvYy0+YWRkcmVzczsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfUENSRUxfSEkxNl9TKQotICAgIHsKLSAgICAgIGFzc2VydCAoZml4cC0+ZnhfbmV4dCAhPSBOVUxMCi0JICAgICAgJiYgZml4cC0+ZnhfbmV4dC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QQ1JFTF9MTzE2KTsKLSAgICAgIC8qIFdlIHVzZSBhIHNwZWNpYWwgYWRkZW5kIGZvciBhbiBpbnRlcm5hbCBSRUxISSByZWxvYy4gIFRoZQotCSByZWxvYyBpcyByZWxhdGl2ZSB0byB0aGUgUkVMTE87IGFkanVzdCB0aGUgYWRkZW5kCi0JIGFjY29yZGluZ2x5LiAgKi8KLSAgICAgIGlmIChmaXhwLT5meF9hZGRzeS0+YnN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0JcmVsb2MtPmFkZGVuZCA9IChmaXhwLT5meF9uZXh0LT5meF9mcmFnLT5mcl9hZGRyZXNzCi0JCQkgKyBmaXhwLT5meF9uZXh0LT5meF93aGVyZQotCQkJIC0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KSk7Ci0gICAgICBlbHNlCi0JcmVsb2MtPmFkZGVuZCA9IChmaXhwLT5meF9hZGRudW1iZXIKLQkJCSArIGZpeHAtPmZ4X25leHQtPmZ4X2ZyYWctPmZyX2FkZHJlc3MKLQkJCSArIGZpeHAtPmZ4X25leHQtPmZ4X3doZXJlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeHAtPmZ4X3BjcmVsID09IDApCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChPVVRQVVRfRkxBVk9SICE9IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKQotCS8qIEEgZ3J1ZXNvbWUgaGFjayB3aGljaCBpcyBhIHJlc3VsdCBvZiB0aGUgZ3J1ZXNvbWUgZ2FzIHJlbG9jCi0JICAgaGFuZGxpbmcuICAqLwotCXJlbG9jLT5hZGRlbmQgPSByZWxvYy0+YWRkcmVzczsKLSAgICAgIGVsc2UKLQlyZWxvYy0+YWRkZW5kID0gLXJlbG9jLT5hZGRyZXNzOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgdmFyaWFudCBmcmFnLCB3ZSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlIGV4aXN0aW5nCi0gICAgIHJlbG9jIGFuZCBnZW5lcmF0ZSBhIG5ldyBvbmUuICAqLwotICBpZiAoZml4cC0+ZnhfZnJhZy0+ZnJfb3Bjb2RlICE9IE5VTEwKLSAgICAgICYmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR1BSRUwKLQkgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HT1QxNgotCSAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0NBTEwxNgotCSAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2Ci0JICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR09UX0xPMTYKLQkgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYKLQkgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYpKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnJlbG9jMjsKLQotICAgICAgYXNzZXJ0ICghIFJFTEFYX01JUFMxNl9QIChmaXhwLT5meF9mcmFnLT5mcl9zdWJ0eXBlKSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgbm90IHRoZSBsYXN0IHJlbG9jIGluIHRoaXMgZnJhZywgdGhlbiB3ZSBoYXZlIHR3bwotCSBHUFJFTCByZWxvY3MsIG9yIGEgR09UX0hJMTYvR09UX0xPMTYgcGFpciwgb3IgYQotCSBDQUxMX0hJMTYvQ0FMTF9MTzE2LCBib3RoIG9mIHdoaWNoIGFyZSBiZWluZyByZXBsYWNlZC4gIExldAotCSB0aGUgc2Vjb25kIG9uZSBoYW5kbGUgYWxsIG9mIHRoZW0uICAqLwotICAgICAgaWYgKGZpeHAtPmZ4X25leHQgIT0gTlVMTAotCSAgJiYgZml4cC0+ZnhfZnJhZyA9PSBmaXhwLT5meF9uZXh0LT5meF9mcmFnKQotCXsKLQkgIGFzc2VydCAoKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HUFJFTAotCQkgICAmJiBmaXhwLT5meF9uZXh0LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JCSAgfHwgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNgotCQkgICAgICAmJiAoZml4cC0+ZnhfbmV4dC0+Znhfcl90eXBlCi0JCQkgID09IEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2KSkKLQkJICB8fCAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNgotCQkgICAgICAmJiAoZml4cC0+ZnhfbmV4dC0+Znhfcl90eXBlCi0JCQkgID09IEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNikpKTsKLQkgIHJldHZhbFswXSA9IE5VTEw7Ci0JICByZXR1cm4gcmV0dmFsOwotCX0KLQotICAgICAgZml4cC0+Znhfd2hlcmUgPSBmaXhwLT5meF9mcmFnLT5mcl9vcGNvZGUgLSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsOwotICAgICAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gICAgICByZWxvYzIgPSByZXR2YWxbMV0gPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgICAgIHJldHZhbFsyXSA9IE5VTEw7Ci0gICAgICByZWxvYzItPnN5bV9wdHJfcHRyID0gJmZpeHAtPmZ4X2FkZHN5LT5ic3ltOwotICAgICAgcmVsb2MyLT5hZGRyZXNzID0gKHJlbG9jLT5hZGRyZXNzCi0JCQkgKyAoUkVMQVhfUkVMT0MyIChmaXhwLT5meF9mcmFnLT5mcl9zdWJ0eXBlKQotCQkJICAgIC0gUkVMQVhfUkVMT0MxIChmaXhwLT5meF9mcmFnLT5mcl9zdWJ0eXBlKSkpOwotICAgICAgcmVsb2MyLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gICAgICByZWxvYzItPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGFzc2VydCAocmVsb2MyLT5ob3d0byAhPSBOVUxMKTsKLQotICAgICAgaWYgKFJFTEFYX1JFTE9DMyAoZml4cC0+ZnhfZnJhZy0+ZnJfc3VidHlwZSkpCi0JewotCSAgYXJlbGVudCAqcmVsb2MzOwotCi0JICByZWxvYzMgPSByZXR2YWxbMl0gPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkgIHJldHZhbFszXSA9IE5VTEw7Ci0JICAqcmVsb2MzID0gKnJlbG9jMjsKLQkgIHJlbG9jMy0+YWRkcmVzcyArPSA0OwotCX0KLQotICAgICAgaWYgKG1pcHNfcGljID09IE5PX1BJQykKLQl7Ci0JICBhc3NlcnQgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HUFJFTCk7Ci0JICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfSEkxNl9TOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQotCXsKLQkgIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR09UMTY6Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfQ0FMTDE2OgotCSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2OgotCSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNjoKLQkgICAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfTUlQU19HT1QxNjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogU2luY2UgTUlQUyBFTEYgdXNlcyBSZWwgaW5zdGVhZCBvZiBSZWxhLCBlbmNvZGUgdGhlIHZ0YWJsZSBlbnRyeQotICAgICB0byBiZSB1c2VkIGluIHRoZSByZWxvY2F0aW9uJ3Mgc2VjdGlvbiBvZmZzZXQuICAqLwotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgewotICAgICAgcmVsb2MtPmFkZHJlc3MgPSByZWxvYy0+YWRkZW5kOwotICAgICAgcmVsb2MtPmFkZGVuZCA9IDA7Ci0gICAgfQotCi0gIC8qIFNpbmNlIERJRkZfRVhQUl9PSyBpcyBkZWZpbmVkIGluIHRjLW1pcHMuaCwgaXQgaXMgcG9zc2libGUgdGhhdAotICAgICBmaXh1cF9zZWdtZW50IGNvbnZlcnRlZCBhIG5vbi1QQyByZWxhdGl2ZSByZWxvYyBpbnRvIGEgUEMKLSAgICAgcmVsYXRpdmUgcmVsb2MuICBJbiBzdWNoIGEgY2FzZSwgd2UgbmVlZCB0byBjb252ZXJ0IHRoZSByZWxvYwotICAgICBjb2RlLiAgKi8KLSAgY29kZSA9IGZpeHAtPmZ4X3JfdHlwZTsKLSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIHsKLSAgICAgIHN3aXRjaCAoY29kZSkKLQl7Ci0JY2FzZSBCRkRfUkVMT0NfODoKLQkgIGNvZGUgPSBCRkRfUkVMT0NfOF9QQ1JFTDsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzE2OgotCSAgY29kZSA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzMyOgotCSAgY29kZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzY0OgotCSAgY29kZSA9IEJGRF9SRUxPQ182NF9QQ1JFTDsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzhfUENSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfNjRfUENSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfMTZfUENSRUxfUzI6Ci0JY2FzZSBCRkRfUkVMT0NfUENSRUxfSEkxNl9TOgotCWNhc2UgQkZEX1JFTE9DX1BDUkVMX0xPMTY6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJXygiQ2Fubm90IG1ha2UgJXMgcmVsb2NhdGlvbiBQQyByZWxhdGl2ZSIpLAotCQkJYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLQl9Ci0gICAgfQotCi0gIC8qIFRvIHN1cHBvcnQgYSBQQyByZWxhdGl2ZSByZWxvYyB3aGVuIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUKLSAgICAgZm9yIEVDT0ZGLCB3ZSB1c2UgYSBDeWdudXMgZXh0ZW5zaW9uLiAgV2UgY2hlY2sgZm9yIHRoYXQgaGVyZSB0bwotICAgICBtYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBsZXQgc3VjaCBhIHJlbG9jIGVzY2FwZSBub3JtYWxseS4gICovCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgJiYgY29kZSA9PSBCRkRfUkVMT0NfMTZfUENSRUxfUzIKLSAgICAgICYmIG1pcHNfcGljICE9IEVNQkVEREVEX1BJQykKLSAgICByZWxvYy0+aG93dG8gPSBOVUxMOwotICBlbHNlCi0gICAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotCi0gIGlmIChyZWxvYy0+aG93dG8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJDYW4gbm90IHJlcHJlc2VudCAlcyByZWxvY2F0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkpOwotICAgICAgcmV0dmFsWzBdID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyogUmVsYXggYSBtYWNoaW5lIGRlcGVuZGVudCBmcmFnLiAgVGhpcyByZXR1cm5zIHRoZSBhbW91bnQgYnkgd2hpY2gKLSAgIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGZyYWcgc2hvdWxkIGNoYW5nZS4gICovCi0KLWludAotbWlwc19yZWxheF9mcmFnIChmcmFncCwgc3RyZXRjaCkKLSAgICAgZnJhZ1MgKmZyYWdwOwotICAgICBsb25nIHN0cmV0Y2g7Ci17Ci0gIGlmICghIFJFTEFYX01JUFMxNl9QIChmcmFncC0+ZnJfc3VidHlwZSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKG1pcHMxNl9leHRlbmRlZF9mcmFnIChmcmFncCwgKGFzZWN0aW9uICopIE5VTEwsIHN0cmV0Y2gpKQotICAgIHsKLSAgICAgIGlmIChSRUxBWF9NSVBTMTZfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQlyZXR1cm4gMDsKLSAgICAgIGZyYWdwLT5mcl9zdWJ0eXBlID0gUkVMQVhfTUlQUzE2X01BUktfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIFJFTEFYX01JUFMxNl9FWFRFTkRFRCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCXJldHVybiAwOwotICAgICAgZnJhZ3AtPmZyX3N1YnR5cGUgPSBSRUxBWF9NSVBTMTZfQ0xFQVJfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLSAgICAgIHJldHVybiAtMjsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIENvbnZlcnQgYSBtYWNoaW5lIGRlcGVuZGVudCBmcmFnLiAgKi8KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBhc2VjLCBmcmFncCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWdUIGFzZWM7Ci0gICAgIGZyYWdTICpmcmFncDsKLXsKLSAgaW50IG9sZCwgbmV3OwotICBjaGFyICpmaXhwdHI7Ci0KLSAgaWYgKFJFTEFYX01JUFMxNl9QIChmcmFncC0+ZnJfc3VidHlwZSkpCi0gICAgewotICAgICAgaW50IHR5cGU7Ci0gICAgICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgbWlwczE2X2ltbWVkX29wZXJhbmQgKm9wOwotICAgICAgYm9vbGVhbiBzbWFsbCwgZXh0OwotICAgICAgb2Zmc2V0VCB2YWw7Ci0gICAgICBiZmRfYnl0ZSAqYnVmOwotICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICAgYm9vbGVhbiB1c2VfZXh0ZW5kOwotICAgICAgdW5zaWduZWQgc2hvcnQgZXh0ZW5kOwotCi0gICAgICB0eXBlID0gUkVMQVhfTUlQUzE2X1RZUEUgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLSAgICAgIG9wID0gbWlwczE2X2ltbWVkX29wZXJhbmRzOwotICAgICAgd2hpbGUgKG9wLT50eXBlICE9IHR5cGUpCi0JKytvcDsKLQotICAgICAgaWYgKFJFTEFYX01JUFMxNl9FWFRFTkRFRCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCXsKLQkgIHNtYWxsID0gZmFsc2U7Ci0JICBleHQgPSB0cnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzbWFsbCA9IHRydWU7Ci0JICBleHQgPSBmYWxzZTsKLQl9Ci0KLSAgICAgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChmcmFncC0+ZnJfc3ltYm9sLCAxKTsKLSAgICAgIHZhbCA9IFNfR0VUX1ZBTFVFIChmcmFncC0+ZnJfc3ltYm9sKTsKLSAgICAgIGlmIChvcC0+cGNyZWwpCi0JewotCSAgYWRkcmVzc1QgYWRkcjsKLQotCSAgYWRkciA9IGZyYWdwLT5mcl9hZGRyZXNzICsgZnJhZ3AtPmZyX2ZpeDsKLQotCSAgLyogVGhlIHJ1bGVzIGZvciB0aGUgYmFzZSBhZGRyZXNzIG9mIGEgUEMgcmVsYXRpdmUgcmVsb2MgYXJlCi0gICAgICAgICAgICAgY29tcGxpY2F0ZWQ7IHNlZSBtaXBzMTZfZXh0ZW5kZWRfZnJhZy4gICovCi0JICBpZiAodHlwZSA9PSAncCcgfHwgdHlwZSA9PSAncScpCi0JICAgIHsKLQkgICAgICBhZGRyICs9IDI7Ci0JICAgICAgaWYgKGV4dCkKLQkJYWRkciArPSAyOwotCSAgICAgIC8qIElnbm9yZSB0aGUgbG93IGJpdCBpbiB0aGUgdGFyZ2V0LCBzaW5jZSBpdCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgIHNldCBmb3IgYSB0ZXh0IGxhYmVsLiAgKi8KLQkgICAgICBpZiAoKHZhbCAmIDEpICE9IDApCi0JCS0tdmFsOwotCSAgICB9Ci0JICBlbHNlIGlmIChSRUxBWF9NSVBTMTZfSkFMX0RTTE9UIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JICAgIGFkZHIgLT0gNDsKLQkgIGVsc2UgaWYgKFJFTEFYX01JUFMxNl9EU0xPVCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCSAgICBhZGRyIC09IDI7Ci0KLQkgIGFkZHIgJj0gfiAoYWRkcmVzc1QpICgoMSA8PCBvcC0+c2hpZnQpIC0gMSk7Ci0JICB2YWwgLT0gYWRkcjsKLQotCSAgLyogTWFrZSBzdXJlIHRoZSBzZWN0aW9uIHdpbmRzIHVwIHdpdGggdGhlIGFsaWdubWVudCB3ZSBoYXZlCi0gICAgICAgICAgICAgYXNzdW1lZC4gICovCi0JICBpZiAob3AtPnNoaWZ0ID4gMCkKLQkgICAgcmVjb3JkX2FsaWdubWVudCAoYXNlYywgb3AtPnNoaWZ0KTsKLQl9Ci0KLSAgICAgIGlmIChleHQKLQkgICYmIChSRUxBWF9NSVBTMTZfSkFMX0RTTE9UIChmcmFncC0+ZnJfc3VidHlwZSkKLQkgICAgICB8fCBSRUxBWF9NSVBTMTZfRFNMT1QgKGZyYWdwLT5mcl9zdWJ0eXBlKSkpCi0JYXNfd2Fybl93aGVyZSAoZnJhZ3AtPmZyX2ZpbGUsIGZyYWdwLT5mcl9saW5lLAotCQkgICAgICAgXygiZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gaW4gZGVsYXkgc2xvdCIpKTsKLQotICAgICAgYnVmID0gKGJmZF9ieXRlICopIChmcmFncC0+ZnJfbGl0ZXJhbCArIGZyYWdwLT5mcl9maXgpOwotCi0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JaW5zbiA9IGJmZF9nZXRiMTYgKGJ1Zik7Ci0gICAgICBlbHNlCi0JaW5zbiA9IGJmZF9nZXRsMTYgKGJ1Zik7Ci0KLSAgICAgIG1pcHMxNl9pbW1lZCAoZnJhZ3AtPmZyX2ZpbGUsIGZyYWdwLT5mcl9saW5lLCB0eXBlLCB2YWwsCi0JCSAgICBSRUxBWF9NSVBTMTZfVVNFUl9FWFQgKGZyYWdwLT5mcl9zdWJ0eXBlKSwKLQkJICAgIHNtYWxsLCBleHQsICZpbnNuLCAmdXNlX2V4dGVuZCwgJmV4dGVuZCk7Ci0KLSAgICAgIGlmICh1c2VfZXh0ZW5kKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCAweGYwMDAgfCBleHRlbmQsIDIpOwotCSAgZnJhZ3AtPmZyX2ZpeCArPSAyOwotCSAgYnVmICs9IDI7Ci0JfQotCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgaW5zbiwgMik7Ci0gICAgICBmcmFncC0+ZnJfZml4ICs9IDI7Ci0gICAgICBidWYgKz0gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZnJhZ3AtPmZyX29wY29kZSA9PSBOVUxMKQotCXJldHVybjsKLQotICAgICAgb2xkID0gUkVMQVhfT0xEIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0gICAgICBuZXcgPSBSRUxBWF9ORVcgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLSAgICAgIGZpeHB0ciA9IGZyYWdwLT5mcl9saXRlcmFsICsgZnJhZ3AtPmZyX2ZpeDsKLQotICAgICAgaWYgKG5ldyA+IDApCi0JbWVtY3B5IChmaXhwdHIgLSBvbGQsIGZpeHB0ciwgbmV3KTsKLQotICAgICAgZnJhZ3AtPmZyX2ZpeCArPSBuZXcgLSBvbGQ7Ci0gICAgfQotfQotCi0jaWZkZWYgT0JKX0VMRgotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgcmVsb2NzIGhhdmUgYmVlbiBnZW5lcmF0ZWQuCi0gICBXZSd2ZSBiZWVuIHN0b3JpbmcgbWlwczE2IHRleHQgbGFiZWxzIGFzIG9kZC4gIEhlcmUgd2UgY29udmVydCB0aGVtCi0gICBiYWNrIHRvIGV2ZW4gZm9yIHRoZSBjb252ZW5pZW5jZSBvZiB0aGUgZGVidWdnZXIuICAqLwotCi12b2lkCi1taXBzX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKCkKLXsKLSAgYXN5bWJvbCAqKnN5bXM7Ci0gIHVuc2lnbmVkIGludCBjb3VudCwgaTsKLQotICBpZiAoT1VUUFVUX0ZMQVZPUiAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybjsKLQotICBzeW1zID0gYmZkX2dldF9vdXRzeW1ib2xzIChzdGRvdXRwdXQpOwotICBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKHN0ZG91dHB1dCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBzeW1zKyspCi0gICAgewotICAgICAgaWYgKGVsZl9zeW1ib2wgKCpzeW1zKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlciA9PSBTVE9fTUlQUzE2Ci0JICAmJiAoKCpzeW1zKS0+dmFsdWUgJiAxKSAhPSAwKQotCXsKLQkgICgqc3ltcyktPnZhbHVlICY9IH4xOwotCSAgLyogSWYgdGhlIHN5bWJvbCBoYXMgYW4gb2RkIHNpemUsIGl0IHdhcyBwcm9iYWJseSBjb21wdXRlZAotCSAgICAgaW5jb3JyZWN0bHksIHNvIGFkanVzdCB0aGF0IGFzIHdlbGwuICAqLwotCSAgaWYgKChlbGZfc3ltYm9sICgqc3ltcyktPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZSAmIDEpICE9IDApCi0JICAgICsrZWxmX3N5bWJvbCAoKnN5bXMpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemU7Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGEgbGFiZWwgaXMgZGVmaW5lZC4gIEl0IGlzIHVzZWQKLSAgIHdoZW4gaGFuZGxpbmcgYnJhbmNoIGRlbGF5czsgaWYgYSBicmFuY2ggaGFzIGEgbGFiZWwsIHdlIGFzc3VtZSB3ZQotICAgY2FuIG5vdCBtb3ZlIGl0LiAgKi8KLQotdm9pZAotbWlwc19kZWZpbmVfbGFiZWwgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICpsOwotCi0gIGlmIChmcmVlX2luc25fbGFiZWxzID09IE5VTEwpCi0gICAgbCA9IChzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICopIHhtYWxsb2MgKHNpemVvZiAqbCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsID0gZnJlZV9pbnNuX2xhYmVsczsKLSAgICAgIGZyZWVfaW5zbl9sYWJlbHMgPSBsLT5uZXh0OwotICAgIH0KLQotICBsLT5sYWJlbCA9IHN5bTsKLSAgbC0+bmV4dCA9IGluc25fbGFiZWxzOwotICBpbnNuX2xhYmVscyA9IGw7Ci19Ci0MCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikKLQotLyogU29tZSBzcGVjaWFsIHByb2Nlc3NpbmcgZm9yIGEgTUlQUyBFTEYgZmlsZS4gICovCi0KLXZvaWQKLW1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcgKCkKLXsKLSAgLyogV3JpdGUgb3V0IHRoZSByZWdpc3RlciBpbmZvcm1hdGlvbi4gICovCi0gIGlmICghIG1pcHNfNjQpCi0gICAgewotICAgICAgRWxmMzJfUmVnSW5mbyBzOwotCi0gICAgICBzLnJpX2dwcm1hc2sgPSBtaXBzX2dwcm1hc2s7Ci0gICAgICBzLnJpX2Nwcm1hc2tbMF0gPSBtaXBzX2Nwcm1hc2tbMF07Ci0gICAgICBzLnJpX2Nwcm1hc2tbMV0gPSBtaXBzX2Nwcm1hc2tbMV07Ci0gICAgICBzLnJpX2Nwcm1hc2tbMl0gPSBtaXBzX2Nwcm1hc2tbMl07Ci0gICAgICBzLnJpX2Nwcm1hc2tbM10gPSBtaXBzX2Nwcm1hc2tbM107Ci0gICAgICAvKiBUaGUgZ3BfdmFsdWUgZmllbGQgaXMgc2V0IGJ5IHRoZSBNSVBTIEVMRiBiYWNrZW5kLiAgKi8KLQotICAgICAgYmZkX21pcHNfZWxmMzJfc3dhcF9yZWdpbmZvX291dCAoc3Rkb3V0cHV0LCAmcywKLQkJCQkgICAgICAgKChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvICopCi0JCQkJCW1pcHNfcmVnbWFza19mcmFnKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRWxmNjRfSW50ZXJuYWxfUmVnSW5mbyBzOwotCi0gICAgICBzLnJpX2dwcm1hc2sgPSBtaXBzX2dwcm1hc2s7Ci0gICAgICBzLnJpX3BhZCA9IDA7Ci0gICAgICBzLnJpX2Nwcm1hc2tbMF0gPSBtaXBzX2Nwcm1hc2tbMF07Ci0gICAgICBzLnJpX2Nwcm1hc2tbMV0gPSBtaXBzX2Nwcm1hc2tbMV07Ci0gICAgICBzLnJpX2Nwcm1hc2tbMl0gPSBtaXBzX2Nwcm1hc2tbMl07Ci0gICAgICBzLnJpX2Nwcm1hc2tbM10gPSBtaXBzX2Nwcm1hc2tbM107Ci0gICAgICAvKiBUaGUgZ3BfdmFsdWUgZmllbGQgaXMgc2V0IGJ5IHRoZSBNSVBTIEVMRiBiYWNrZW5kLiAgKi8KLQotICAgICAgYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX291dCAoc3Rkb3V0cHV0LCAmcywKLQkJCQkgICAgICAgKChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvICopCi0JCQkJCW1pcHNfcmVnbWFza19mcmFnKSk7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgTUlQUyBFTEYgZmxhZyBiaXRzLiAgRklYTUU6IFRoZXJlIHNob3VsZCBwcm9iYWJseSBiZSBzb21lCi0gICAgIHNvcnQgb2YgQkZEIGludGVyZmFjZSBmb3IgdGhpcy4gICovCi0gIGlmIChtaXBzX2FueV9ub3Jlb3JkZXIpCi0gICAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9NSVBTX05PUkVPUkRFUjsKLSAgaWYgKG1pcHNfcGljICE9IE5PX1BJQykKLSAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVGX01JUFNfUElDOwotCi0gIC8qIFNldCB0aGUgTUlQUyBFTEYgQUJJIGZsYWdzLiAqLwotICBpZiAobWlwc19hYmlfc3RyaW5nID09IDApCi0gICAgOwotICBlbHNlIGlmIChzdHJjbXAgKG1pcHNfYWJpX3N0cmluZywiMzIiKSA9PSAwKQotICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRV9NSVBTX0FCSV9PMzI7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobWlwc19hYmlfc3RyaW5nLCJvNjQiKSA9PSAwKQotICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRV9NSVBTX0FCSV9PNjQ7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobWlwc19hYmlfc3RyaW5nLCJlYWJpIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobWlwc19lYWJpNjQpCi0JZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFX01JUFNfQUJJX0VBQkk2NDsKLSAgICAgIGVsc2UKLQllbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVfTUlQU19BQklfRUFCSTMyOwotICAgIH0KLQotICBpZiAobWlwc18zMmJpdG1vZGUpCi0gICAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9NSVBTXzMyQklUTU9ERTsKLX0KLQotI2VuZGlmIC8qIE9CSl9FTEYgfHwgT0JKX01BWUJFX0VMRiAqLwotDAotdHlwZWRlZiBzdHJ1Y3QgcHJvYwotICB7Ci0gICAgc3RydWN0IHN5bWJvbCAqaXN5bTsKLSAgICB1bnNpZ25lZCBsb25nIHJlZ19tYXNrOwotICAgIHVuc2lnbmVkIGxvbmcgcmVnX29mZnNldDsKLSAgICB1bnNpZ25lZCBsb25nIGZwcmVnX21hc2s7Ci0gICAgdW5zaWduZWQgbG9uZyBmcHJlZ19vZmZzZXQ7Ci0gICAgdW5zaWduZWQgbG9uZyBmcmFtZV9vZmZzZXQ7Ci0gICAgdW5zaWduZWQgbG9uZyBmcmFtZV9yZWc7Ci0gICAgdW5zaWduZWQgbG9uZyBwY19yZWc7Ci0gIH0KLXByb2NTOwotCi1zdGF0aWMgcHJvY1MgY3VyX3Byb2M7Ci1zdGF0aWMgcHJvY1MgKmN1cl9wcm9jX3B0cjsKLXN0YXRpYyBpbnQgbnVtcHJvY3M7Ci0KLXN0YXRpYyB2b2lkCi1tZF9vYmpfYmVnaW4gKCkKLXsKLX0KLQotc3RhdGljIHZvaWQKLW1kX29ial9lbmQgKCkKLXsKLSAgLyogY2hlY2sgZm9yIHByZW1hdHVyZSBlbmQsIG5lc3RpbmcgZXJyb3JzLCBldGMgKi8KLSAgaWYgKGN1cl9wcm9jX3B0cikKLSAgICBhc193YXJuIChfKCJtaXNzaW5nIGAuZW5kJyBhdCBlbmQgb2YgYXNzZW1ibHkiKSk7Ci19Ci0KLXN0YXRpYyBsb25nCi1nZXRfbnVtYmVyICgpCi17Ci0gIGludCBuZWdhdGl2ZSA9IDA7Ci0gIGxvbmcgdmFsID0gMDsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBuZWdhdGl2ZSA9IDE7Ci0gICAgfQotICBpZiAoIWlzZGlnaXQgKCppbnB1dF9saW5lX3BvaW50ZXIpKQotICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgc2ltcGxlIG51bWJlci4iKSk7Ci0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJzAnKQotICAgIHsKLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJ3gnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCSAgd2hpbGUgKGlzeGRpZ2l0ICgqaW5wdXRfbGluZV9wb2ludGVyKSkKLQkgICAgewotCSAgICAgIHZhbCA8PD0gNDsKLQkgICAgICB2YWwgfD0gaGV4X3ZhbHVlICgqaW5wdXRfbGluZV9wb2ludGVyKyspOwotCSAgICB9Ci0JICByZXR1cm4gbmVnYXRpdmUgPyAtdmFsIDogdmFsOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHdoaWxlIChpc2RpZ2l0ICgqaW5wdXRfbGluZV9wb2ludGVyKSkKLQkgICAgewotCSAgICAgIHZhbCA8PD0gMzsKLQkgICAgICB2YWwgfD0gKmlucHV0X2xpbmVfcG9pbnRlcisrIC0gJzAnOwotCSAgICB9Ci0JICByZXR1cm4gbmVnYXRpdmUgPyAtdmFsIDogdmFsOwotCX0KLSAgICB9Ci0gIGlmICghaXNkaWdpdCAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0gICAgewotICAgICAgcHJpbnRmIChfKCIgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJWMnIDB4JTAyeFxuIiksCi0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciwgKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0gICAgICBhc193YXJuIChfKCJJbnZhbGlkIG51bWJlciIpKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHdoaWxlIChpc2RpZ2l0ICgqaW5wdXRfbGluZV9wb2ludGVyKSkKLSAgICB7Ci0gICAgICB2YWwgKj0gMTA7Ci0gICAgICB2YWwgKz0gKmlucHV0X2xpbmVfcG9pbnRlcisrIC0gJzAnOwotICAgIH0KLSAgcmV0dXJuIG5lZ2F0aXZlID8gLXZhbCA6IHZhbDsKLX0KLQotLyogVGhlIC5maWxlIGRpcmVjdGl2ZTsganVzdCBsaWtlIHRoZSB1c3VhbCAuZmlsZSBkaXJlY3RpdmUsIGJ1dCB0aGVyZQotICAgaXMgYW4gaW5pdGlhbCBudW1iZXIgd2hpY2ggaXMgdGhlIEVDT0ZGIGZpbGUgaW5kZXguICAqLwotCi1zdGF0aWMgdm9pZAotc19maWxlICh4KQotICAgICBpbnQgeDsKLXsKLSAgaW50IGxpbmU7Ci0KLSAgbGluZSA9IGdldF9udW1iZXIgKCk7Ci0gIHNfYXBwX2ZpbGUgKDApOwotfQotCi0KLS8qIFRoZSAuZW5kIGRpcmVjdGl2ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfZW5kICh4KQotICAgICBpbnQgeDsKLXsKLSAgc3ltYm9sUyAqcDsKLSAgaW50IG1heWJlX3RleHQ7Ci0KLSAgaWYgKCFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgcCA9IGdldF9zeW1ib2wgKCk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgZWxzZQotICAgIHAgPSBOVUxMOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBub3dfc2VnKSAmIFNFQ19DT0RFKSAhPSAwKQotICAgIG1heWJlX3RleHQgPSAxOwotICBlbHNlCi0gICAgbWF5YmVfdGV4dCA9IDA7Ci0jZWxzZQotICBpZiAobm93X3NlZyAhPSBkYXRhX3NlY3Rpb24gJiYgbm93X3NlZyAhPSBic3Nfc2VjdGlvbikKLSAgICBtYXliZV90ZXh0ID0gMTsKLSAgZWxzZQotICAgIG1heWJlX3RleHQgPSAwOwotI2VuZGlmCi0KLSAgaWYgKCFtYXliZV90ZXh0KQotICAgIGFzX3dhcm4gKF8oIi5lbmQgbm90IGluIHRleHQgc2VjdGlvbiIpKTsKLQotICBpZiAoIWN1cl9wcm9jX3B0cikKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5lbnQgZGlyZWN0aXZlLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChwICE9IE5VTEwpCi0gICAgewotICAgICAgYXNzZXJ0IChTX0dFVF9OQU1FIChwKSk7Ci0gICAgICBpZiAoc3RyY21wIChTX0dFVF9OQU1FIChwKSwgU19HRVRfTkFNRSAoY3VyX3Byb2NfcHRyLT5pc3ltKSkpCi0JYXNfd2FybiAoXygiLmVuZCBzeW1ib2wgZG9lcyBub3QgbWF0Y2ggLmVudCBzeW1ib2wuIikpOwotICAgIH0KLSAgZWxzZQotICAgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIG1pc3Npbmcgb3IgdW5rbm93biBzeW1ib2wiKSk7Ci0KLSNpZmRlZiBNSVBTX1NUQUJTX0VMRgotICB7Ci0gICAgc2VnVCBzYXZlZF9zZWcgPSBub3dfc2VnOwotICAgIHN1YnNlZ1Qgc2F2ZWRfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgICBmcmFnUyAqc2F2ZWRfZnJhZyA9IGZyYWdfbm93OwotICAgIHZhbHVlVCBkb3Q7Ci0gICAgc2VnVCBzZWc7Ci0gICAgZXhwcmVzc2lvblMgZXhwOwotICAgIGNoYXIgKmZyYWdwOwotCi0gICAgZG90ID0gZnJhZ19ub3dfZml4ICgpOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gICAgYXNzZXJ0IChwZHJfc2VnKTsKLSAgICBzdWJzZWdfc2V0IChwZHJfc2VnLCAwKTsKLQotICAgIC8qIFdyaXRlIHRoZSBzeW1ib2wgKi8KLSAgICBleHAuWF9vcCA9IE9fc3ltYm9sOwotICAgIGV4cC5YX2FkZF9zeW1ib2wgPSBwOwotICAgIGV4cC5YX2FkZF9udW1iZXIgPSAwOwotICAgIGVtaXRfZXhwciAoJmV4cCwgNCk7Ci0KLSAgICBmcmFncCA9IGZyYWdfbW9yZSAoNyo0KTsKLQotICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZ3AsICAgICAodmFsdWVUKSBjdXJfcHJvY19wdHItPnJlZ19tYXNrLCA0KTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwICsgNCwgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5yZWdfb2Zmc2V0LCA0KTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwICsgOCwgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5mcHJlZ19tYXNrLCA0KTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwICsxMiwgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5mcHJlZ19vZmZzZXQsIDQpOwotICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZ3AgKzE2LCAodmFsdWVUKSBjdXJfcHJvY19wdHItPmZyYW1lX29mZnNldCwgNCk7Ci0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFncCArMjAsICh2YWx1ZVQpIGN1cl9wcm9jX3B0ci0+ZnJhbWVfcmVnLCA0KTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwICsyNCwgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5wY19yZWcsIDQpOwotCi0gICAgc3Vic2VnX3NldCAoc2F2ZWRfc2VnLCBzYXZlZF9zdWJzZWcpOwotICB9Ci0jZW5kaWYKLQotICBjdXJfcHJvY19wdHIgPSBOVUxMOwotfQotCi0vKiBUaGUgLmFlbnQgYW5kIC5lbnQgZGlyZWN0aXZlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfZW50IChhZW50KQotICAgICBpbnQgYWVudDsKLXsKLSAgaW50IG51bWJlciA9IDA7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGludCBtYXliZV90ZXh0OwotCi0gIHN5bWJvbFAgPSBnZXRfc3ltYm9sICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKGlzZGlnaXQgKCppbnB1dF9saW5lX3BvaW50ZXIpIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQotICAgIG51bWJlciA9IGdldF9udW1iZXIgKCk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5vd19zZWcpICYgU0VDX0NPREUpICE9IDApCi0gICAgbWF5YmVfdGV4dCA9IDE7Ci0gIGVsc2UKLSAgICBtYXliZV90ZXh0ID0gMDsKLSNlbHNlCi0gIGlmIChub3dfc2VnICE9IGRhdGFfc2VjdGlvbiAmJiBub3dfc2VnICE9IGJzc19zZWN0aW9uKQotICAgIG1heWJlX3RleHQgPSAxOwotICBlbHNlCi0gICAgbWF5YmVfdGV4dCA9IDA7Ci0jZW5kaWYKLQotICBpZiAoIW1heWJlX3RleHQpCi0gICAgYXNfd2FybiAoXygiLmVudCBvciAuYWVudCBub3QgaW4gdGV4dCBzZWN0aW9uLiIpKTsKLQotICBpZiAoIWFlbnQgJiYgY3VyX3Byb2NfcHRyKQotICAgIGFzX3dhcm4gKF8oIm1pc3NpbmcgYC5lbmQnIikpOwotCi0gIGlmICghYWVudCkKLSAgICB7Ci0gICAgICBjdXJfcHJvY19wdHIgPSAmY3VyX3Byb2M7Ci0gICAgICBtZW1zZXQgKGN1cl9wcm9jX3B0ciwgJ1wwJywgc2l6ZW9mIChwcm9jUykpOwotCi0gICAgICBjdXJfcHJvY19wdHItPmlzeW0gPSBzeW1ib2xQOwotCi0gICAgICBzeW1ib2xQLT5ic3ltLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0KLSAgICAgIG51bXByb2NzKys7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuZnJhbWUgZGlyZWN0aXZlLiBJZiB0aGUgbWRlYnVnIHNlY3Rpb24gaXMgcHJlc2VudCAoSVJJWCA1IG5hdGl2ZSkKLSAgIHRoZW4gZWNvZmYuYyAoZWNvZmZfZGlyZWN0aXZlX2ZyYW1lKSBpcyB1c2VkLiBGb3IgZW1iZWRkZWQgdGFyZ2V0cywgCi0gICBzX21pcHNfZnJhbWUgaXMgdXNlZCBzbyB0aGF0IHdlIGNhbiBzZXQgdGhlIFBEUiBpbmZvcm1hdGlvbiBjb3JyZWN0bHkuCi0gICBXZSBjYW4ndCB1c2UgdGhlIGVjb2ZmIHJvdXRpbmVzIGJlY2F1c2UgdGhleSBtYWtlIHJlZmVyZW5jZSB0byB0aGUgZWNvZmYgCi0gICBzeW1ib2wgdGFibGUgKGluIHRoZSBtZGVidWcgc2VjdGlvbikuICAqLwotCi1zdGF0aWMgdm9pZAotc19taXBzX2ZyYW1lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0jaWZkZWYgTUlQU19TVEFCU19FTEYKLQotICBsb25nIHZhbDsKLQotICBpZiAoY3VyX3Byb2NfcHRyID09ICAocHJvY1MgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZnJhbWUgb3V0c2lkZSBvZiAuZW50IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY3VyX3Byb2NfcHRyLT5mcmFtZV9yZWcgPSB0Y19nZXRfcmVnaXN0ZXIgKDEpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnLCcKLSAgICAgIHx8IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmdmFsKSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5mcmFtZSBkaXJlY3RpdmUiKSk7Ci0gICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGN1cl9wcm9jX3B0ci0+ZnJhbWVfb2Zmc2V0ID0gdmFsOwotICBjdXJfcHJvY19wdHItPnBjX3JlZyA9IHRjX2dldF9yZWdpc3RlciAoMCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSNlbHNlCi0gIHNfaWdub3JlIChpZ25vcmUpOwotI2VuZGlmIC8qIE1JUFNfU1RBQlNfRUxGICovCi19Ci0KLS8qIFRoZSAuZm1hc2sgYW5kIC5tYXNrIGRpcmVjdGl2ZXMuIElmIHRoZSBtZGVidWcgc2VjdGlvbiBpcyBwcmVzZW50IAotICAgKElSSVggNSBuYXRpdmUpIHRoZW4gZWNvZmYuYyAoZWNvZmZfZGlyZWN0aXZlX21hc2spIGlzIHVzZWQuIEZvciAKLSAgIGVtYmVkZGVkIHRhcmdldHMsIHNfbWlwc19tYXNrIGlzIHVzZWQgc28gdGhhdCB3ZSBjYW4gc2V0IHRoZSBQRFIKLSAgIGluZm9ybWF0aW9uIGNvcnJlY3RseS4gV2UgY2FuJ3QgdXNlIHRoZSBlY29mZiByb3V0aW5lcyBiZWNhdXNlIHRoZXkgCi0gICBtYWtlIHJlZmVyZW5jZSB0byB0aGUgZWNvZmYgc3ltYm9sIHRhYmxlIChpbiB0aGUgbWRlYnVnIHNlY3Rpb24pLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbWlwc19tYXNrIChyZWdfdHlwZSkKLSAgICAgY2hhciByZWdfdHlwZTsKLXsKLSNpZmRlZiBNSVBTX1NUQUJTX0VMRgotICBsb25nIG1hc2ssIG9mZjsKLSAgCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NTICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLm1hc2svLmZtYXNrIG91dHNpZGUgb2YgLmVudCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJm1hc2spICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgLm1hc2svLmZtYXNrIGRpcmVjdGl2ZSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgb2ZmID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgaWYgKHJlZ190eXBlID09ICdGJykKLSAgICB7Ci0gICAgICBjdXJfcHJvY19wdHItPmZwcmVnX21hc2sgPSBtYXNrOwotICAgICAgY3VyX3Byb2NfcHRyLT5mcHJlZ19vZmZzZXQgPSBvZmY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY3VyX3Byb2NfcHRyLT5yZWdfbWFzayA9IG1hc2s7Ci0gICAgICBjdXJfcHJvY19wdHItPnJlZ19vZmZzZXQgPSBvZmY7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0jZWxzZQotICBzX2lnbm9yZSAocmVnX3R5cGUpOwotI2VuZGlmIC8qIE1JUFNfU1RBQlNfRUxGICovCi19Ci0KLS8qIFRoZSAubG9jIGRpcmVjdGl2ZS4gICovCi0KLSNpZiAwCi1zdGF0aWMgdm9pZAotc19sb2MgKHgpCi0gICAgIGludCB4OwotewotICBzeW1ib2xTICpzeW1ib2xQOwotICBpbnQgbGluZW5vOwotICBpbnQgYWRkcm9mZjsKLQotICBhc3NlcnQgKG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uKTsKLQotICBsaW5lbm8gPSBnZXRfbnVtYmVyICgpOwotICBhZGRyb2ZmID0gZnJhZ19ub3dfZml4ICgpOwotCi0gIHN5bWJvbFAgPSBzeW1ib2xfbmV3ICgiIiwgTl9TTElORSwgYWRkcm9mZiwgZnJhZ19ub3cpOwotICBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1NMSU5FKTsKLSAgU19TRVRfT1RIRVIgKHN5bWJvbFAsIDApOwotICBTX1NFVF9ERVNDIChzeW1ib2xQLCBsaW5lbm8pOwotICBzeW1ib2xQLT5zeV9zZWdtZW50ID0gbm93X3NlZzsKLX0KLSNlbmRpZgotCi0KLSAgCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1pcHMuaCBiL2dhcy9jb25maWcvdGMtbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjhhZWRlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbWlwcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qIHRjLW1pcHMuaCAtLSBoZWFkZXIgZmlsZSBmb3IgdGMtbWlwcy5jLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgdGhlIE9TRiBhbmQgUmFscGggQ2FtcGJlbGwuCi0gICBXcml0dGVuIGJ5IEtlaXRoIEtub3dsZXMgYW5kIFJhbHBoIENhbXBiZWxsLCB3b3JraW5nIGluZGVwZW5kZW50bHkuCi0gICBNb2RpZmllZCBmb3IgRUNPRkYgc3VwcG9ydCBieSBJYW4gTGFuY2UgVGF5bG9yIG9mIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgVENfTUlQUwotCi0jZGVmaW5lIFRDX01JUFMKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGZyYWc7Ci1zdHJ1Y3QgZXhwcmVzc2lvblM7Ci0jZW5kaWYKLQotLyogRGVmYXVsdCB0byBiaWcgZW5kaWFuLiAgKi8KLSNpZm5kZWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4JCTEKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX21pcHMKLQotI2RlZmluZSBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMKLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAkxCi0jZGVmaW5lIE9MRF9GTE9BVF9SRUFEUwotI2RlZmluZSBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUwotI2RlZmluZSBSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUKLSNkZWZpbmUgTUFYX1JFTE9DX0VYUEFOU0lPTiAzCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLS8qIE1heGltdW0gc3ltYm9sIG9mZnNldCB0aGF0IGNhbiBiZSBlbmNvZGVkIGluIGEgQkZEX1JFTE9DX01JUFNfR1BSRUwKLSAgIHJlbG9jYXRpb246ICovCi0jZGVmaW5lIE1BWF9HUFJFTF9PRkZTRVQgKDB4N0ZGNCkKLQotI2RlZmluZSBtZF9yZWxheF9mcmFnKGZyYWdwLCBzdHJldGNoKSBtaXBzX3JlbGF4X2ZyYWcoZnJhZ3AsIHN0cmV0Y2gpCi1leHRlcm4gaW50IG1pcHNfcmVsYXhfZnJhZyBQQVJBTVMgKChzdHJ1Y3QgZnJhZyAqLCBsb25nKSk7Ci0KLSNkZWZpbmUgbWRfdW5kZWZpbmVkX3N5bWJvbChuYW1lKQkoMCkKLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0vKiBXZSBwZXJtaXQgUEMgcmVsYXRpdmUgZGlmZmVyZW5jZSBleHByZXNzaW9ucyB3aGVuIGdlbmVyYXRpbmcKLSAgIGVtYmVkZGVkIFBJQyBjb2RlLiAgKi8KLSNkZWZpbmUgRElGRl9FWFBSX09LCi0KLS8qIFRlbGwgYXNzZW1ibGVyIHRoYXQgd2UgaGF2ZSBhbiBpdGJsX21pcHMuaCBoZWFkZXIgZmlsZSB0byBpbmNsdWRlLiAqLwotI2RlZmluZSBIQVZFX0lUQkxfQ1BVCi0KLS8qIFRoZSBlbmRpYW5uZXNzIG9mIHRoZSB0YXJnZXQgZm9ybWF0IG1heSBjaGFuZ2UgYmFzZWQgb24gY29tbWFuZAotICAgbGluZSBhcmd1bWVudHMuICAqLwotI2RlZmluZSBUQVJHRVRfRk9STUFUIG1pcHNfdGFyZ2V0X2Zvcm1hdCgpCi1leHRlcm4gY29uc3QgY2hhciAqbWlwc190YXJnZXRfZm9ybWF0IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RydWN0IG1pcHNfY2xfaW5zbgotewotICB1bnNpZ25lZCBsb25nIGluc25fb3Bjb2RlOwotICBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKmluc25fbW87Ci0gIC8qIFRoZSBuZXh0IHR3byBmaWVsZHMgYXJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIG1pcHMxNiBjb2RlLiAgKi8KLSAgYm9vbGVhbiB1c2VfZXh0ZW5kOwotICB1bnNpZ25lZCBzaG9ydCBleHRlbmQ7Ci19OwotCi1leHRlcm4gaW50IHRjX2dldF9yZWdpc3RlciBQQVJBTVMgKChpbnQgZnJhbWUpKTsKLQotI2RlZmluZSB0Y19pbml0X2FmdGVyX2FyZ3MoKSBtaXBzX2luaXRfYWZ0ZXJfYXJncygpCi1leHRlcm4gdm9pZCBtaXBzX2luaXRfYWZ0ZXJfYXJncyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgbWRfcGFyc2VfbG9uZ19vcHRpb24oYXJnKSBtaXBzX3BhcnNlX2xvbmdfb3B0aW9uIChhcmcpCi1leHRlcm4gaW50IG1pcHNfcGFyc2VfbG9uZ19vcHRpb24gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLSNkZWZpbmUgdGNfZnJvYl9sYWJlbChzeW0pIG1pcHNfZGVmaW5lX2xhYmVsIChzeW0pCi1leHRlcm4gdm9pZCBtaXBzX2RlZmluZV9sYWJlbCBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICopKTsKLQotI2RlZmluZSB0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCgpIG1pcHNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgKCkKLWV4dGVybiB2b2lkIG1pcHNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIHRjX2Zyb2JfZmlsZSgpIG1pcHNfZnJvYl9maWxlICgpCi1leHRlcm4gdm9pZCBtaXBzX2Zyb2JfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotI2RlZmluZSB0Y19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIG1pcHNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcwotZXh0ZXJuIHZvaWQgbWlwc19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi0jZGVmaW5lIFRDX0NPTlNfRklYX05FVyBjb25zX2ZpeF9uZXdfbWlwcwotZXh0ZXJuIHZvaWQgY29uc19maXhfbmV3X21pcHMKLSAgUEFSQU1TICgoc3RydWN0IGZyYWcgKiwgaW50LCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBleHByZXNzaW9uUyAqKSk7Ci0KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoZml4cCkgbWlwc19maXhfYWRqdXN0YWJsZSAoZml4cCkKLWV4dGVybiBpbnQgbWlwc19maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotLyogV2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlIHdlIG11c3Qga2VlcCBQQyByZWxhdGl2ZQotICAgcmVsb2NhdGlvbnMuICAqLwotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeHApIG1pcHNfZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKLWV4dGVybiBpbnQgbWlwc19mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0vKiBtZF9hcHBseV9maXggc2V0cyBmeF9kb25lIGNvcnJlY3RseS4gICovCi0jZGVmaW5lIFRDX0hBTkRMRV9GWF9ET05FIDEKLQotLyogUmVnaXN0ZXIgbWFzayB2YXJpYWJsZXMuICBUaGVzZSBhcmUgc2V0IGJ5IHRoZSBNSVBTIGFzc2VtYmx5IGNvZGUKLSAgIGFuZCB1c2VkIGJ5IEVDT0ZGIGFuZCBwb3NzaWJseSBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLiAgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIG1pcHNfZ3BybWFzazsKLWV4dGVybiB1bnNpZ25lZCBsb25nIG1pcHNfY3BybWFza1s0XTsKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0KLSNkZWZpbmUgZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcgbWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZwotZXh0ZXJuIHZvaWQgbWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMgXAotICB7ICIuc2RhdGEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9NSVBTX0dQUkVMCX0sIFwKLSAgeyAiLnNic3MiLAlTSFRfTk9CSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfTUlQU19HUFJFTAl9LCBcCi0gIHsgIi5saXQ0IiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfTUlQU19HUFJFTAl9LCBcCi0gIHsgIi5saXQ4IiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfTUlQU19HUFJFTAl9LCBcCi0gIHsgIi51Y29kZSIsCVNIVF9NSVBTX1VDT0RFLAkwCQkJCQl9LCBcCi0gIHsgIi5tZGVidWciLAlTSFRfTUlQU19ERUJVRywJMAkJCQkJfSwKLS8qIE90aGVyIHNwZWNpYWwgc2VjdGlvbnMgbm90IGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyOiAucmVnaW5mbywKLSAgIC5saWJsaXN0LCAuY29uZmxpY3QsIC5ncHRhYiwgLmdvdCwgLmR5bmFtaWMsIC5yZWwuZHluLiAgKi8KLQotI2VuZGlmCi0KLWV4dGVybiB2b2lkIG1kX21pcHNfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfZW5kKCkJbWRfbWlwc19lbmQoKQotCi0jZGVmaW5lIFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQJKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyIFwKLQkJCQkgfHwgT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCi1leHRlcm4gdm9pZCBtaXBzX3BvcF9pbnNlcnQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9wb3BfaW5zZXJ0KCkJCW1pcHNfcG9wX2luc2VydCgpCi0KLWV4dGVybiB2b2lkIG1pcHNfZmx1c2hfcGVuZGluZ19vdXRwdXQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCBtaXBzX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0KLWV4dGVybiB2b2lkIG1pcHNfZW5hYmxlX2F1dG9fYWxpZ24gUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpCW1pcHNfZW5hYmxlX2F1dG9fYWxpZ24oKQotCi0jZW5kaWYgLyogVENfTUlQUyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tbjEwMjAwLmMgYi9nYXMvY29uZmlnL3RjLW1uMTAyMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4MDkxNS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1uMTAyMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MTQgKzAsMCBAQAotLyogdGMtbW4xMDIwMC5jIC0tIEFzc2VtYmxlciBjb2RlIGZvciB0aGUgTWF0c3VzaGl0YSAxMDIwMAotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCi0jaW5jbHVkZSAib3Bjb2RlL21uMTAyMDAuaCIKLQwKLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KLXN0cnVjdCByZWdfbmFtZQotewotICBjb25zdCBjaGFyICpuYW1lOwotICBpbnQgdmFsdWU7Ci19OwotCi0vKiBHZW5lcmljIGFzc2VtYmxlciBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIG11c3QgYmUgZGVmaW5lZCBieSBhbGwgdGFyZ2V0cy4gKi8KLQotLyogQ2hhcmFjdGVycyB3aGljaCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiOyMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1heSBiZSB1c2VkIHRvIHNlcGFyYXRlIG11bHRpcGxlIGNvbW1hbmRzIG9uIGEgCi0gICBzaW5nbGUgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYXJlIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXhwb25lbnQgaW4gYSBmbG9hdGluZyAKLSAgIHBvaW50IG51bWJlci4gICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtZWFuIHRoYXQgYSBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwgCi0gICBhcyBpbiAwZDEuMC4gICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKLQwKLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9IHsKLSAgLyogYkNDIHJlbGF4aW5nICovCi0gIHsweDgxLCAtMHg3ZSwgMiwgMX0sCi0gIHsweDgwMDQsIC0weDdmZmIsIDUsIDJ9LAotICB7MHg4MDAwMDYsIC0weDdmZmZmOSwgNywgMH0sCi0gIC8qIGJDQ3ggcmVsYXhpbmcgKi8KLSAgezB4ODEsIC0weDdlLCAzLCA0fSwKLSAgezB4ODAwNCwgLTB4N2ZmYiwgNiwgNX0sCi0gIHsweDgwMDAwNiwgLTB4N2ZmZmY5LCA4LCAwfSwKLSAgLyoganNyIHJlbGF4aW5nICovCi0gIHsweDgwMDQsIC0weDdmZmIsIDMsIDd9LAotICB7MHg4MDAwMDYsIC0weDdmZmZmOSwgNSwgMH0sCi0gIC8qIGptcCByZWxheGluZyAqLwotICB7MHg4MSwgLTB4N2UsIDIsIDl9LAotICB7MHg4MDA0LCAtMHg3ZmZiLCAzLCAxMH0sCi0gIHsweDgwMDAwNiwgLTB4N2ZmZmY5LCA1LCAwfSwKLQotfTsKLS8qIGxvY2FsIGZ1bmN0aW9ucyAqLwotc3RhdGljIHZvaWQgbW4xMDIwMF9pbnNlcnRfb3BlcmFuZCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKiwKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgKiwKLQkJCQkJICAgIG9mZnNldFQsIGNoYXIgKiwgdW5zaWduZWQsCi0JCQkJCSAgICB1bnNpZ25lZCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hlY2tfb3BlcmFuZCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCAqLAotCQkJCQkgICAgb2Zmc2V0VCkpOwotc3RhdGljIGludCByZWdfbmFtZV9zZWFyY2ggUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlZ19uYW1lICosIGludCwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkYXRhX3JlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgYm9vbGVhbiBhZGRyZXNzX3JlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgYm9vbGVhbiBvdGhlcl9yZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHByZXNzaW9uUCkpOwotCi0KLS8qIGZpeHVwcyAqLwotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgKDUpCi1zdHJ1Y3QgbW4xMDIwMF9maXh1cAotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGludCBvcGluZGV4OwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci19Owotc3RydWN0IG1uMTAyMDBfZml4dXAgZml4dXBzW01BWF9JTlNOX0ZJWFVQU107Ci1zdGF0aWMgaW50IGZjOwotDAotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7IAotCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7IE5VTEwsICAgICAgIE5VTEwsICAgICAgICAgICAwIH0KLX07Ci0KLS8qIE9wY29kZSBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICptbjEwMjAwX2hhc2g7Ci0KLS8qIFRoaXMgdGFibGUgaXMgc29ydGVkLiBTdWl0YWJsZSBmb3Igc2VhcmNoaW5nIGJ5IGEgYmluYXJ5IHNlYXJjaC4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgZGF0YV9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImQwIiwgMCB9LAotICB7ICJkMSIsIDEgfSwKLSAgeyAiZDIiLCAyIH0sCi0gIHsgImQzIiwgMyB9LAotfTsKLSNkZWZpbmUgREFUQV9SRUdfTkFNRV9DTlQJKHNpemVvZihkYXRhX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHJlZ19uYW1lKSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBhZGRyZXNzX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiYTAiLCAwIH0sCi0gIHsgImExIiwgMSB9LAotICB7ICJhMiIsIDIgfSwKLSAgeyAiYTMiLCAzIH0sCi19OwotI2RlZmluZSBBRERSRVNTX1JFR19OQU1FX0NOVAkoc2l6ZW9mKGFkZHJlc3NfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcmVnX25hbWUpKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIG90aGVyX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAibWRyIiwgMCB9LAotICB7ICJwc3ciLCAwIH0sCi19OwotI2RlZmluZSBPVEhFUl9SRUdfTkFNRV9DTlQJKHNpemVvZihvdGhlcl9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCByZWdfbmFtZSkpCi0KLS8qIHJlZ19uYW1lX3NlYXJjaCBkb2VzIGEgYmluYXJ5IHNlYXJjaCBvZiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgdGFibGUKLSAgIHRvIHNlZSBpZiAibmFtZSIgaXMgYSB2YWxpZCByZWdpdGVyIG5hbWUuICBSZXR1cm5zIHRoZSByZWdpc3RlcgotICAgbnVtYmVyIGZyb20gdGhlIGFycmF5IG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUuICovCi0KLXN0YXRpYyBpbnQKLXJlZ19uYW1lX3NlYXJjaCAocmVncywgcmVnY291bnQsIG5hbWUpCi0gICAgIGNvbnN0IHN0cnVjdCByZWdfbmFtZSAqcmVnczsKLSAgICAgaW50IHJlZ2NvdW50OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0KLSAgbG93ID0gMDsKLSAgaGlnaCA9IHJlZ2NvdW50IC0gMTsKLQotICBkbwotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCByZWdzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+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+YWRkZW5kID0gKFNfR0VUX1ZBTFVFIChmaXhwLT5meF9hZGRzeSkKLQkJICAgICAgIC0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KSArIGZpeHAtPmZ4X29mZnNldCk7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIHJlbG9jLT5zeW1fcHRyX3B0ciA9ICZmaXhwLT5meF9hZGRzeS0+YnN5bTsKLSAgICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gICAgfQotICByZXR1cm4gcmVsb2M7Ci19Ci0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdwLCBzZWcpCi0gICAgIGZyYWdTICpmcmFncDsKLSAgICAgYXNlY3Rpb24gKnNlZzsKLXsKLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDApCi0gICAgcmV0dXJuIDI7Ci0gIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSAzKQotICAgIHJldHVybiAzOwotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gNikKLSAgICB7Ci0gICAgICBpZiAoIVNfSVNfREVGSU5FRCAoZnJhZ3AtPmZyX3N5bWJvbCkKLQkgIHx8IHNlZyAhPSBTX0dFVF9TRUdNRU5UIChmcmFncC0+ZnJfc3ltYm9sKSkKLQl7Ci0JICBmcmFncC0+ZnJfc3VidHlwZSA9IDc7Ci0JICByZXR1cm4gNTsKLQl9Ci0gICAgICByZXR1cm4gMzsKLSAgICB9Ci0gIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSA4KQotICAgIHsKLSAgICAgIGlmICghU19JU19ERUZJTkVEIChmcmFncC0+ZnJfc3ltYm9sKSkKLQl7Ci0JICBmcmFncC0+ZnJfc3VidHlwZSA9IDEwOwotCSAgcmV0dXJuIDU7Ci0JfQotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotfSAKLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0jaWYgMAotICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTCAmJiAhIFNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgTGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0jZW5kaWYKLX0KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhwLCB2YWx1ZXAsIHNlZykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgdmFsdWVUICp2YWx1ZXA7Ci0gICAgIHNlZ1Qgc2VnOwotewotICAvKiBXZSBzaG91bGRuJ3QgZXZlciBnZXQgaGVyZSBiZWNhdXNlIGxpbmtyZWxheCBpcyBub256ZXJvLiAgKi8KLSAgYWJvcnQgKCk7Ci0gIGZpeHAtPmZ4X2RvbmUgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLyogSW5zZXJ0IGFuIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1tbjEwMjAwX2luc2VydF9vcGVyYW5kIChpbnNucCwgZXh0ZW5zaW9ucCwgb3BlcmFuZCwgdmFsLCBmaWxlLCBsaW5lLCBzaGlmdCkKLSAgICAgdW5zaWduZWQgbG9uZyAqaW5zbnA7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmV4dGVuc2lvbnA7Ci0gICAgIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgdmFsOwotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgdW5zaWduZWQgaW50IHNoaWZ0OwotewotICAvKiBObyBuZWVkIHRvIGNoZWNrIDI0IG9yIDMyYml0IG9wZXJhbmRzIGZvciBhIGJpdC4gICovCi0gIGlmIChvcGVyYW5kLT5iaXRzIDwgMjQKLSAgICAgICYmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9OT0NIRUNLKSA9PSAwKQotICAgIHsKLSAgICAgIGxvbmcgbWluLCBtYXg7Ci0gICAgICBvZmZzZXRUIHRlc3Q7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCXsKLQkgIG1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSk7Ci0JfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotICAgICAgICAgIG1pbiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgdGVzdCA9IHZhbDsKLQotCi0gICAgICBpZiAodGVzdCA8IChvZmZzZXRUKSBtaW4gfHwgdGVzdCA+IChvZmZzZXRUKSBtYXgpCi0gICAgICAgIHsKLSAgICAgICAgICBjb25zdCBjaGFyICplcnIgPQotICAgICAgICAgICAgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVzIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIpOwotICAgICAgICAgIGNoYXIgYnVmWzEwMF07Ci0KLSAgICAgICAgICBzcHJpbnRfdmFsdWUgKGJ1ZiwgdGVzdCk7Ci0gICAgICAgICAgaWYgKGZpbGUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICAgICAgICAgIGFzX3dhcm4gKGVyciwgYnVmLCBtaW4sIG1heCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgZXJyLCBidWYsIG1pbiwgbWF4KTsKLSAgICAgICAgfQotICAgIH0KLQotICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEKSA9PSAwKQotICAgIHsKLSAgICAgICppbnNucCB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkJIDw8IChvcGVyYW5kLT5zaGlmdCArIHNoaWZ0KSk7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUkVQRUFURUQpICE9IDApCi0JKmluc25wIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCQkgICA8PCAob3BlcmFuZC0+c2hpZnQgKyBzaGlmdCArIDIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqZXh0ZW5zaW9ucCB8PSAodmFsID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAqaW5zbnAgfD0gdmFsICYgMHhmZmZmOwotICAgIH0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWNoZWNrX29wZXJhbmQgKGluc24sIG9wZXJhbmQsIHZhbCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kICpvcGVyYW5kOwotICAgICBvZmZzZXRUIHZhbDsKLXsKLSAgLyogTm8gbmVlZCB0byBjaGVjayAyNGJpdCBvciAzMmJpdCBvcGVyYW5kcyBmb3IgYSBiaXQuICAqLwotICBpZiAob3BlcmFuZC0+Yml0cyA8IDI0Ci0gICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfTk9DSEVDSykgPT0gMCkKLSAgICB7Ci0gICAgICBsb25nIG1pbiwgbWF4OwotICAgICAgb2Zmc2V0VCB0ZXN0OwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCkgIT0gMCkKLQl7Ci0JICBtYXggPSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSAtIDE7Ci0JICBtaW4gPSAtICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOwotCX0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLSAgICAgICAgICBtaW4gPSAwOwotICAgICAgICB9Ci0KLSAgICAgIHRlc3QgPSB2YWw7Ci0KLQotICAgICAgaWYgKHRlc3QgPCAob2Zmc2V0VCkgbWluIHx8IHRlc3QgPiAob2Zmc2V0VCkgbWF4KQotCXJldHVybiAwOwotICAgICAgZWxzZQotCXJldHVybiAxOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1uMTAyMDAuaCBiL2dhcy9jb25maWcvdGMtbW4xMDIwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTNlNTY5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbW4xMDIwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogdGMtbW4xMDIwMC5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1tbjEwMjAwLmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19NTjEwMjAwCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAjZXJyb3IgTU4xMDIwMCBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9tbjEwMjAwCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItbW4xMDIwMCIKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbgotCi0vKiBEb24ndCBib3RoZXIgdG8gYWRqdXN0IHJlbG9jcy4gICovCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKEZJWCkgMAotCi0vKiBXZSBkbyByZWxheGluZyBpbiB0aGUgYXNzZW1ibGVyIGFzIHdlbGwgYXMgdGhlIGxpbmtlci4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1uMTAzMDAuYyBiL2dhcy9jb25maWcvdGMtbW4xMDMwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjllOWNlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbW4xMDMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY0OSArMCwwIEBACi0vKiB0Yy1tbjEwMzAwLmMgLS0gQXNzZW1ibGVyIGNvZGUgZm9yIHRoZSBNYXRzdXNoaXRhIDEwMzAwCi0KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiICAgICAKLSNpbmNsdWRlICJvcGNvZGUvbW4xMDMwMC5oIgotDAotLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLwotc3RydWN0IHJlZ19uYW1lCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGludCB2YWx1ZTsKLX07Ci0KLS8qIEdlbmVyaWMgYXNzZW1ibGVyIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggbXVzdCBiZSBkZWZpbmVkIGJ5IGFsbCB0YXJnZXRzLiAqLwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICI7IyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHVzZWQgdG8gc2VwYXJhdGUgbXVsdGlwbGUgY29tbWFuZHMgb24gYSAKLSAgIHNpbmdsZSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBhcmUgdXNlZCB0byBpbmRpY2F0ZSBhbiBleHBvbmVudCBpbiBhIGZsb2F0aW5nIAotICAgcG9pbnQgbnVtYmVyLiAgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1lYW4gdGhhdCBhIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LCAKLSAgIGFzIGluIDBkMS4wLiAgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZEQiOwotDAotCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0gewotICAvKiBiQ0MgcmVsYXhpbmcgKi8KLSAgezB4N2YsIC0weDgwLCAyLCAxfSwKLSAgezB4N2ZmZiwgLTB4ODAwMCwgNSwgMn0sCi0gIHsweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCwgNywgMH0sCi0KLSAgLyogYkNDIHJlbGF4aW5nICh1bmNvbW1vbiBjYXNlcykgKi8KLSAgezB4N2YsIC0weDgwLCAzLCA0fSwKLSAgezB4N2ZmZiwgLTB4ODAwMCwgNiwgNX0sCi0gIHsweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCwgOCwgMH0sCi0KLSAgLyogY2FsbCByZWxheGluZyAqLwotICB7MHg3ZmZmLCAtMHg4MDAwLCA1LCA3fSwKLSAgezB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCA3LCAwfSwKLQotICAvKiBjYWxscyByZWxheGluZyAqLwotICB7MHg3ZmZmLCAtMHg4MDAwLCA0LCA5fSwKLSAgezB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCA2LCAwfSwKLQotICAvKiBqbXAgcmVsYXhpbmcgKi8KLSAgezB4N2YsIC0weDgwLCAyLCAxMX0sCi0gIHsweDdmZmYsIC0weDgwMDAsIDMsIDEyfSwKLSAgezB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCA1LCAwfSwKLQotfTsKLQotLyogbG9jYWwgZnVuY3Rpb25zICovCi1zdGF0aWMgdm9pZCBtbjEwMzAwX2luc2VydF9vcGVyYW5kIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZyAqLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IG1uMTAzMDBfb3BlcmFuZCAqLAotCQkJCQkgICAgb2Zmc2V0VCwgY2hhciAqLCB1bnNpZ25lZCwKLQkJCQkJICAgIHVuc2lnbmVkKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBjaGVja19vcGVyYW5kIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsCi0JCQkJCSAgICBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kICosCi0JCQkJCSAgICBvZmZzZXRUKSk7Ci1zdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVnX25hbWUgKiwgaW50LCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGRhdGFfcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKLXN0YXRpYyBib29sZWFuIGFkZHJlc3NfcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKLXN0YXRpYyBib29sZWFuIG90aGVyX3JlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgdm9pZCBzZXRfYXJjaF9tYWNoIFBBUkFNUyAoKGludCkpOwotCi1zdGF0aWMgaW50IGN1cnJlbnRfbWFjaGluZTsKLQotLyogZml4dXBzICovCi0jZGVmaW5lIE1BWF9JTlNOX0ZJWFVQUyAoNSkKLXN0cnVjdCBtbjEwMzAwX2ZpeHVwCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgaW50IG9waW5kZXg7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLX07Ci1zdHJ1Y3QgbW4xMDMwMF9maXh1cCBmaXh1cHNbTUFYX0lOU05fRklYVVBTXTsKLXN0YXRpYyBpbnQgZmM7Ci0KLS8qIFdlIG11c3Qgc3RvcmUgdGhlIHZhbHVlIG9mIGVhY2ggcmVnaXN0ZXIgb3BlcmFuZCBzbyB0aGF0IHdlIGNhbgotICAgdmVyaWZ5IHRoYXQgY2VydGFpbiByZWdpc3RlcnMgZG8gbm90IG1hdGNoLiAgKi8KLWludCBtbjEwMzAwX3JlZ19vcGVyYW5kc1tNTjEwMzAwX01BWF9PUEVSQU5EU107Ci0MCi1jb25zdCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsgCi0KLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgImFtMzAiLAlzZXRfYXJjaF9tYWNoLAkJMzAwIH0sCi0gIHsgIm1uMTAzMDAiLAlzZXRfYXJjaF9tYWNoLAkJMzAwIH0sCi0gIHtOVUxMLCAwLCAwfQotfTsKLQotLyogT3Bjb2RlIGhhc2ggdGFibGUuICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm1uMTAzMDBfaGFzaDsKLQotLyogVGhpcyB0YWJsZSBpcyBzb3J0ZWQuIFN1aXRhYmxlIGZvciBzZWFyY2hpbmcgYnkgYSBiaW5hcnkgc2VhcmNoLiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBkYXRhX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiZDAiLCAwIH0sCi0gIHsgImQxIiwgMSB9LAotICB7ICJkMiIsIDIgfSwKLSAgeyAiZDMiLCAzIH0sCi19OwotI2RlZmluZSBEQVRBX1JFR19OQU1FX0NOVAkoc2l6ZW9mKGRhdGFfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcmVnX25hbWUpKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIGFkZHJlc3NfcmVnaXN0ZXJzW10gPQotewotICB7ICJhMCIsIDAgfSwKLSAgeyAiYTEiLCAxIH0sCi0gIHsgImEyIiwgMiB9LAotICB7ICJhMyIsIDMgfSwKLX07Ci0jZGVmaW5lIEFERFJFU1NfUkVHX05BTUVfQ05UCShzaXplb2YoYWRkcmVzc19yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCByZWdfbmFtZSkpCi0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBvdGhlcl9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgIm1kciIsIDAgfSwKLSAgeyAicHN3IiwgMCB9LAotICB7ICJzcCIsIDAgfSwKLX07Ci0jZGVmaW5lIE9USEVSX1JFR19OQU1FX0NOVAkoc2l6ZW9mKG90aGVyX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHJlZ19uYW1lKSkKLQotLyogcmVnX25hbWVfc2VhcmNoIGRvZXMgYSBiaW5hcnkgc2VhcmNoIG9mIHRoZSBnaXZlbiByZWdpc3RlciB0YWJsZQotICAgdG8gc2VlIGlmICJuYW1lIiBpcyBhIHZhbGlkIHJlZ2l0ZXIgbmFtZS4gIFJldHVybnMgdGhlIHJlZ2lzdGVyCi0gICBudW1iZXIgZnJvbSB0aGUgYXJyYXkgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4gKi8KLQotc3RhdGljIGludAotcmVnX25hbWVfc2VhcmNoIChyZWdzLCByZWdjb3VudCwgbmFtZSkKLSAgICAgY29uc3Qgc3RydWN0IHJlZ19uYW1lICpyZWdzOwotICAgICBpbnQgcmVnY291bnQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBtaWRkbGUsIGxvdywgaGlnaDsKLSAgaW50IGNtcDsKLQotICBsb3cgPSAwOwotICBoaWdoID0gcmVnY291bnQgLSAxOwotCi0gIGRvCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHJlZ3NbbWlkZGxlXS5uYW1lKTsKLSAgICAgIGlmIChjbXAgPCAwKQotCWhpZ2ggPSBtaWRkbGUgLSAxOwotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQlsb3cgPSBtaWRkbGUgKyAxOwotICAgICAgZWxzZSAKLQkgIHJldHVybiByZWdzW21pZGRsZV0udmFsdWU7Ci0gICAgfQotICB3aGlsZSAobG93IDw9IGhpZ2gpOwotICByZXR1cm4gLTE7Ci19Ci0KLQotCi0vKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1kYXRhX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGRhdGFfcmVnaXN0ZXJzLCBEQVRBX1JFR19OQU1FX0NOVCwgbmFtZSk7Ci0KLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CS8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotYWRkcmVzc19yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBpbnQgcmVnX251bWJlcjsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqc3RhcnQ7Ci0gIGNoYXIgYzsKLQotICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChhZGRyZXNzX3JlZ2lzdGVycywgQUREUkVTU19SRUdfTkFNRV9DTlQsIG5hbWUpOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLW90aGVyX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKG90aGVyX3JlZ2lzdGVycywgT1RIRVJfUkVHX05BTUVfQ05ULCBuYW1lKTsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsJLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZihzdHJlYW0sIF8oIk1OMTAzMDAgb3B0aW9uczpcblwKLW5vbmUgeWV0XG4iKSk7Ci19IAotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRwLCBzaXplcCkKLSAgaW50IHR5cGU7Ci0gIGNoYXIgKmxpdHA7Ci0gIGludCAqc2l6ZXA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVwID0gMDsKLSAgICAgIHJldHVybiAiYmFkIGNhbGwgdG8gbWRfYXRvZiI7Ci0gICAgfQotICAKLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVwID0gcHJlYyAqIDI7Ci0KLSAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0cCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotICAgICAgbGl0cCArPSAyOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gIGJmZCAqYWJmZDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgZnJhZ1MgKmZyYWdQOwotewotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBsYWJlbF9jb3VudCA9IDA7Ci0gIGNoYXIgYnVmWzQwXTsKLQotICBzdWJzZWdfY2hhbmdlIChzZWMsIDApOwotICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMCkKLSAgICB7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDEpCi0gICAgewotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4Yzg6Ci0JICBvcGNvZGUgPSAweGM5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGM5OgotCSAgb3Bjb2RlID0gMHhjODsKLQkgIGJyZWFrOwotCWNhc2UgMHhjMDoKLQkgIG9wY29kZSA9IDB4YzI7Ci0JICBicmVhazsKLQljYXNlIDB4YzI6Ci0JICBvcGNvZGUgPSAweGMwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGMzOgotCSAgb3Bjb2RlID0gMHhjMTsKLQkgIGJyZWFrOwotCWNhc2UgMHhjMToKLQkgIG9wY29kZSA9IDB4YzM7Ci0JICBicmVhazsKLQljYXNlIDB4YzQ6Ci0JICBvcGNvZGUgPSAweGM2OwotCSAgYnJlYWs7Ci0JY2FzZSAweGM2OgotCSAgb3Bjb2RlID0gMHhjNDsKLQkgIGJyZWFrOwotCWNhc2UgMHhjNzoKLQkgIG9wY29kZSA9IDB4YzU7Ci0JICBicmVhazsKLQljYXNlIDB4YzU6Ci0JICBvcGNvZGUgPSAweGM3OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSBvcGNvZGU7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsCi0JICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCi0JIGZpbmFsIHRhcmdldC4gICovCi0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAyXSA9IDB4Y2M7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDMsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDU7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAyKQotICAgIHsKLSAgICAgIC8qIFJldmVyc2UgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZmlyc3QgYnJhbmNoLiAgKi8KLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgaW50IG9wY29kZSA9IGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gJiAweGZmOwotCi0gICAgICBzd2l0Y2ggKG9wY29kZSkKLQl7Ci0JY2FzZSAweGM4OgotCSAgb3Bjb2RlID0gMHhjOTsKLQkgIGJyZWFrOwotCWNhc2UgMHhjOToKLQkgIG9wY29kZSA9IDB4Yzg7Ci0JICBicmVhazsKLQljYXNlIDB4YzA6Ci0JICBvcGNvZGUgPSAweGMyOwotCSAgYnJlYWs7Ci0JY2FzZSAweGMyOgotCSAgb3Bjb2RlID0gMHhjMDsKLQkgIGJyZWFrOwotCWNhc2UgMHhjMzoKLQkgIG9wY29kZSA9IDB4YzE7Ci0JICBicmVhazsKLQljYXNlIDB4YzE6Ci0JICBvcGNvZGUgPSAweGMzOwotCSAgYnJlYWs7Ci0JY2FzZSAweGM0OgotCSAgb3Bjb2RlID0gMHhjNjsKLQkgIGJyZWFrOwotCWNhc2UgMHhjNjoKLQkgIG9wY29kZSA9IDB4YzQ7Ci0JICBicmVhazsKLQljYXNlIDB4Yzc6Ci0JICBvcGNvZGUgPSAweGM1OwotCSAgYnJlYWs7Ci0JY2FzZSAweGM1OgotCSAgb3Bjb2RlID0gMHhjNzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gb3Bjb2RlOwotCi0gICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAxLAotCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotCi0gICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZQotCSBmaW5hbCB0YXJnZXQuICAqLwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMl0gPSAweGRjOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAzLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzMyX1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA3OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMykKLSAgICB7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDEsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAyLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMzsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDQpCi0gICAgewotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gJiAweGZmOwotCi0gICAgICBzd2l0Y2ggKG9wY29kZSkKLQl7Ci0JY2FzZSAweGU4OgotCSAgb3Bjb2RlID0gMHhlOTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlOToKLQkgIG9wY29kZSA9IDB4ZTg7Ci0JICBicmVhazsKLQljYXNlIDB4ZWE6Ci0JICBvcGNvZGUgPSAweGViOwotCSAgYnJlYWs7Ci0JY2FzZSAweGViOgotCSAgb3Bjb2RlID0gMHhlYTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSA9IG9wY29kZTsKLQotICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoZSByZXZlcnNlZCBjb25kaXRpb25hbCBicmFuY2guICAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiLiVzXyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCsrKTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMSwKLQkgICAgICAgc3ltYm9sX25ldyAoYnVmLCBzZWMsIDAsIGZyYWdQLT5mcl9uZXh0KSwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDIsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLQotICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUKLQkgZmluYWwgdGFyZ2V0LiAgKi8KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDNdID0gMHhjYzsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDUpCi0gICAgewotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gJiAweGZmOwotCi0gICAgICBzd2l0Y2ggKG9wY29kZSkKLQl7Ci0JY2FzZSAweGU4OgotCSAgb3Bjb2RlID0gMHhlOTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlYToKLQkgIG9wY29kZSA9IDB4ZWI7Ci0JICBicmVhazsKLQljYXNlIDB4ZWI6Ci0JICBvcGNvZGUgPSAweGVhOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gb3Bjb2RlOwotCi0gICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAxLAotCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMiwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotCi0gICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZQotCSBmaW5hbCB0YXJnZXQuICAqLwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgM10gPSAweGRjOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyA0LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzMyX1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA4OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNikKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGNkOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA1OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNykKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGRkOwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgNV0gPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAzXTsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDZdID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgNF07Ci0KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18zMl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNzsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDgpCi0gICAgewotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gMHhmYTsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gMHhmZjsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDIsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDkpCi0gICAgewotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gMHhmYzsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gMHhmZjsKLQotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMiwgMSwgQkZEX1JFTE9DXzMyX1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMTApCi0gICAgewotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbZnJhZ1AtPmZyX2ZpeF0gPSAweGNhOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAxLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxMSkKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGNjOwotCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDM7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxMikKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGRjOwotCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMzJfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDU7Ci0gICAgfQotICBlbHNlCi0gICAgYWJvcnQgKCk7Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICB2YWx1ZVQgYWRkcjsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOwotICByZXR1cm4gKChhZGRyICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKLX0KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY2hhciAqcHJldl9uYW1lID0gIiI7Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wY29kZSAqb3A7Ci0KLSAgbW4xMDMwMF9oYXNoID0gaGFzaF9uZXcoKTsKLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZS4gIFRoZSBNTjEwMzAwIGluc3RydWN0aW9uIHNldAotICAgICBoYXMgbWFueSBpZGVudGljYWwgb3Bjb2RlIG5hbWVzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgb3Bjb2RlcyBiYXNlZAotICAgICBvbiB0aGUgb3BlcmFuZHMuICBUaGlzIGhhc2ggdGFibGUgdGhlbiBwcm92aWRlcyBhIHF1aWNrIGluZGV4IHRvCi0gICAgIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQotICBvcCA9IG1uMTAzMDBfb3Bjb2RlczsKLSAgd2hpbGUgKG9wLT5uYW1lKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHByZXZfbmFtZSwgb3AtPm5hbWUpKSAKLQl7Ci0JICBwcmV2X25hbWUgPSAoY2hhciAqKSBvcC0+bmFtZTsKLQkgIGhhc2hfaW5zZXJ0IChtbjEwMzAwX2hhc2gsIG9wLT5uYW1lLCAoY2hhciAqKSBvcCk7Ci0JfQotICAgICAgb3ArKzsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBib3RoIGEgc2ltcGxpZmljYXRpb24gKHdlIGRvbid0IGhhdmUgdG8gd3JpdGUgbWRfYXBwbHlfZml4KQotICAgICBhbmQgc3VwcG9ydCBmb3IgZnV0dXJlIG9wdGltaXphdGlvbnMgKGJyYW5jaCBzaG9ydGVuaW5nIGFuZCBzaW1pbGFyCi0gICAgIHN0dWZmIGluIHRoZSBsaW5rZXIpLiAgKi8KLSAgbGlua3JlbGF4ID0gMTsKLQotICAvKiBTZXQgdGhlIGRlZmF1bHQgbWFjaGluZSB0eXBlLiAgKi8KLSAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9tbjEwMzAwLCAzMDApKQotICAgIGFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotCi0gIGN1cnJlbnRfbWFjaGluZSA9IDMwMDsKLX0KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikgCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqczsKLSAgc3RydWN0IG1uMTAzMDBfb3Bjb2RlICpvcGNvZGU7Ci0gIHN0cnVjdCBtbjEwMzAwX29wY29kZSAqbmV4dF9vcGNvZGU7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXhfcHRyOwotICBpbnQgbmV4dF9vcGluZGV4LCByZWxheGFibGU7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uLCBzaXplID0gMDsKLSAgY2hhciAqZjsKLSAgaW50IGk7Ci0gIGludCBtYXRjaDsKLQotICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0gIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJyAmJiAhIGlzc3BhY2UgKCpzKTsgcysrKQotICAgIDsKLSAgaWYgKCpzICE9ICdcMCcpCi0gICAgKnMrKyA9ICdcMCc7Ci0KLSAgLyogZmluZCB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggdGhlIHByb3BlciBuYW1lICovCi0gIG9wY29kZSA9IChzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKiloYXNoX2ZpbmQgKG1uMTAzMDBfaGFzaCwgc3RyKTsKLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiVW5yZWNvZ25pemVkIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdHIgPSBzOwotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgKytzdHI7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0gIGZvcig7OykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0gICAgICBpbnQgb3BfaWR4OwotICAgICAgY2hhciAqaG9sZDsKLSAgICAgIGludCBleHRyYV9zaGlmdCA9IDA7Ci0KLQotICAgICAgZXJybXNnID0gXygiSW52YWxpZCBvcGNvZGUvb3BlcmFuZHMiKTsKLQotICAgICAgLyogUmVzZXQgdGhlIGFycmF5IG9mIHJlZ2lzdGVyIG9wZXJhbmRzLiAgKi8KLSAgICAgIG1lbXNldCAobW4xMDMwMF9yZWdfb3BlcmFuZHMsIC0xLCBzaXplb2YgKG1uMTAzMDBfcmVnX29wZXJhbmRzKSk7Ci0KLSAgICAgIHJlbGF4YWJsZSA9IDA7Ci0gICAgICBmYyA9IDA7Ci0gICAgICBtYXRjaCA9IDA7Ci0gICAgICBuZXh0X29waW5kZXggPSAwOwotICAgICAgaW5zbiA9IG9wY29kZS0+b3Bjb2RlOwotICAgICAgZXh0ZW5zaW9uID0gMDsKLQotICAgICAgLyogSWYgdGhlIGluc3RydWN0aW9uIGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIGN1cnJlbnQgbWFjaGluZQotCSB0aGVuIGl0IGNhbiBub3QgcG9zc2libHkgbWF0Y2guICAqLwotICAgICAgaWYgKG9wY29kZS0+bWFjaGluZQotCSAgJiYgKG9wY29kZS0+bWFjaGluZSAhPSBjdXJyZW50X21hY2hpbmUpKQotCWdvdG8gZXJyb3I7Ci0KLSAgICAgIGZvciAob3BfaWR4ID0gMSwgb3BpbmRleF9wdHIgPSBvcGNvZGUtPm9wZXJhbmRzOwotCSAgICpvcGluZGV4X3B0ciAhPSAwOwotCSAgIG9waW5kZXhfcHRyKyssIG9wX2lkeCsrKQotCXsKLQkgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0JICBleHByZXNzaW9uUyBleDsKLQotCSAgaWYgKG5leHRfb3BpbmRleCA9PSAwKQotCSAgICB7Ci0JICAgICAgb3BlcmFuZCA9ICZtbjEwMzAwX29wZXJhbmRzWypvcGluZGV4X3B0cl07Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG9wZXJhbmQgPSAmbW4xMDMwMF9vcGVyYW5kc1tuZXh0X29waW5kZXhdOwotCSAgICAgIG5leHRfb3BpbmRleCA9IDA7Ci0JICAgIH0KLQotCSAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJywnKQotCSAgICArK3N0cjsKLQotCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1JFTEFYKQotCSAgICByZWxheGFibGUgPSAxOwotCi0JICAvKiBHYXRoZXIgdGhlIG9wZXJhbmQuICovCi0JICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUEFSRU4pCi0JICAgIHsKLQkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnKScgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnKCcpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKLQkgICAgfQotCSAgLyogU2VlIGlmIHdlIGNhbiBtYXRjaCB0aGUgb3BlcmFuZHMuICAqLwotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfRFJFRykKLQkgICAgewotCSAgICAgIGlmICghZGF0YV9yZWdpc3Rlcl9uYW1lICgmZXgpKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfQVJFRykKLQkgICAgewotCSAgICAgIGlmICghYWRkcmVzc19yZWdpc3Rlcl9uYW1lICgmZXgpKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1ApCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdGFydCwgInNwIikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QU1cpCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdGFydCwgInBzdyIpICE9IDApCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfTURSKQotCSAgICB7Ci0JICAgICAgY2hhciAqc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgY2hhciBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkgICAgICBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJtZHIiKSAhPSAwKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNUKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IHZhbHVlID0gMDsKLQkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnWycpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCi0JICAgICAgLyogRWF0IHRoZSAnWycuICAqLwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICAgCi0JICAgICAgLyogV2UgdXNlZCB0byByZWplY3QgYSBudWxsIHJlZ2lzdGVyIGxpc3QgaGVyZTsgaG93ZXZlciwKLQkJIHdlIGFjY2VwdCBpdCBub3cgc28gdGhlIGNvbXBpbGVyIGNhbiBlbWl0ICJjYWxsIiBpbnN0cnVjdGlvbnMKLQkJIGZvciBhbGwgY2FsbHMgdG8gbmFtZWQgZnVuY3Rpb25zLgotCi0JCSBUaGUgbGlua2VyIGNhbiB0aGVuIGZpbGwgaW4gdGhlIGFwcHJvcHJpYXRlIGJpdHMgZm9yIHRoZQotCQkgcmVnaXN0ZXIgbGlzdCBhbmQgc3RhY2sgc2l6ZSBvciBjaGFuZ2UgdGhlIGluc3RydWN0aW9uCi0JCSBpbnRvIGEgImNhbGxzIiBpZiB1c2luZyAiY2FsbCIgaXMgbm90IHByb2ZpdGFibGUuICAqLwotCSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICddJykKLQkJewotCQkgIGNoYXIgKnN0YXJ0OwotCQkgIGNoYXIgYzsKLQotCQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQkJICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCi0JCSAgc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JCSAgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAiZDIiKSA9PSAwKQotCQkgICAgewotCQkgICAgICB2YWx1ZSB8PSAweDgwOwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChzdGFydCwgImQzIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdmFsdWUgfD0gMHg0MDsKLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJhMiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHZhbHVlIHw9IDB4MjA7Ci0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAiYTMiKSA9PSAwKQotCQkgICAgewotCQkgICAgICB2YWx1ZSB8PSAweDEwOwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChzdGFydCwgIm90aGVyIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdmFsdWUgfD0gMHgwODsKLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgICAgICBzdHIgPSBob2xkOwotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCQl9Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAgICAgICAgIG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQgKCZpbnNuLCAmZXh0ZW5zaW9uLCBvcGVyYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgKGNoYXIgKikgTlVMTCwgMCwgMCk7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCi0JICAgIH0KLQkgIGVsc2UgaWYgKGRhdGFfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgc3RyID0gaG9sZDsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICB9Ci0JICBlbHNlIGlmIChhZGRyZXNzX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIHN0ciA9IGhvbGQ7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgfQotCSAgZWxzZSBpZiAob3RoZXJfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgc3RyID0gaG9sZDsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICB9Ci0JICBlbHNlIGlmICgqc3RyID09ICcpJyB8fCAqc3RyID09ICcoJykKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgc3RyID0gaG9sZDsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBleHByZXNzaW9uICgmZXgpOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAoZXguWF9vcCkgCi0JICAgIHsKLQkgICAgY2FzZSBPX2lsbGVnYWw6Ci0JICAgICAgZXJybXNnID0gXygiaWxsZWdhbCBvcGVyYW5kIik7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgY2FzZSBPX2Fic2VudDoKLQkgICAgICBlcnJtc2cgPSBfKCJtaXNzaW5nIG9wZXJhbmQiKTsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICBjYXNlIE9fcmVnaXN0ZXI6Ci0JICAgICAgewotCQlpbnQgbWFzazsKLQotCQltYXNrID0gTU4xMDMwMF9PUEVSQU5EX0RSRUcgfCBNTjEwMzAwX09QRVJBTkRfQVJFRzsKLQkJaWYgKChvcGVyYW5kLT5mbGFncyAmIG1hc2spID09IDApCi0JCSAgewotCQkgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICAgIHN0ciA9IGhvbGQ7Ci0JCSAgICBnb3RvIGVycm9yOwotCQkgIH0KLQkJCi0JCWlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDEgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MxKQotCQkgIGV4dHJhX3NoaWZ0ID0gODsKLQkJZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QyCi0JCQkgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q0Ci0JCQkgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MyCi0JCQkgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M0Ci0JCQkgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M2Ci0JCQkgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q1KQotCQkgIGV4dHJhX3NoaWZ0ID0gMTY7Ci0JCWVsc2UKLQkJICBleHRyYV9zaGlmdCA9IDA7Ci0JICAgICAgCi0JCW1uMTAzMDBfaW5zZXJ0X29wZXJhbmQgKCZpbnNuLCAmZXh0ZW5zaW9uLCBvcGVyYW5kLAotCQkJCQlleC5YX2FkZF9udW1iZXIsIChjaGFyICopIE5VTEwsCi0JCQkJCTAsIGV4dHJhX3NoaWZ0KTsKLQotCi0JCS8qIEFuZCBub3RlIHRoZSByZWdpc3RlciBudW1iZXIgaW4gdGhlIHJlZ2lzdGVyIGFycmF5LiAgKi8KLQkJbW4xMDMwMF9yZWdfb3BlcmFuZHNbb3BfaWR4IC0gMV0gPSBleC5YX2FkZF9udW1iZXI7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0JICAgICAgLyogSWYgdGhpcyBvcGVyYW5kIGNhbiBiZSBwcm9tb3RlZCwgYW5kIGl0IGRvZXNuJ3QKLQkJIGZpdCBpbnRvIHRoZSBhbGxvY2F0ZWQgYml0ZmllbGQgZm9yIHRoaXMgaW5zbiwKLQkJIHRoZW4gcHJvbW90ZSBpdCAoaWUgdGhpcyBvcGNvZGUgZG9lcyBub3QgbWF0Y2gpLiAgKi8KLQkgICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MKLQkJICAmIChNTjEwMzAwX09QRVJBTkRfUFJPTU9URSB8IE1OMTAzMDBfT1BFUkFORF9SRUxBWCkKLQkJICAmJiAhIGNoZWNrX29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlcikpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCi0JICAgICAgbW4xMDMwMF9pbnNlcnRfb3BlcmFuZCAoJmluc24sICZleHRlbnNpb24sIG9wZXJhbmQsCi0JCQkJICAgICAgZXguWF9hZGRfbnVtYmVyLCAoY2hhciAqKSBOVUxMLAotCQkJCSAgICAgIDAsIDApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogSWYgdGhpcyBvcGVyYW5kIGNhbiBiZSBwcm9tb3RlZCwgdGhlbiB0aGlzIG9wY29kZSBkaWRuJ3QKLQkJIG1hdGNoIHNpbmNlIHdlIGNhbid0IGtub3cgaWYgaXQgbmVlZGVkIHByb21vdGlvbiEgICovCi0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BST01PVEUpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCi0JICAgICAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciB0aGlzIGV4cHJlc3Npb24uICAqLwotCSAgICAgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JCWFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0JICAgICAgZml4dXBzW2ZjXS5leHAgPSBleDsKLQkgICAgICBmaXh1cHNbZmNdLm9waW5kZXggPSAqb3BpbmRleF9wdHI7Ci0JICAgICAgZml4dXBzW2ZjXS5yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0JICAgICAgKytmYzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi1rZWVwX2dvaW5nOgotCSAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQotCSAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJywnKQotCSAgICArK3N0cjsKLQotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHdlIHVzZWQgYWxsIHRoZSBvcGVyYW5kcyEgICovCi0gICAgICBpZiAoKnN0ciAhPSAnLCcpCi0JbWF0Y2ggPSAxOwotCi0gICAgICAvKiBJZiB0aGlzIGluc3RydWN0aW9uIGhhcyByZWdpc3RlcnMgdGhhdCBtdXN0IG5vdCBtYXRjaCwgdmVyaWZ5Ci0JIHRoYXQgdGhleSBkbyBpbmRlZWQgbm90IG1hdGNoLiAgKi8KLSAgICAgIGlmIChvcGNvZGUtPm5vX21hdGNoX29wZXJhbmRzKQotCXsKLQkgIGludCBpOwotCi0JICAvKiBMb29rIGF0IGVhY2ggb3BlcmFuZCB0byBzZWUgaWYgaXQncyBtYXJrZWQuICAqLwotCSAgZm9yIChpID0gMDsgaSA8IE1OMTAzMDBfTUFYX09QRVJBTkRTOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoKDEgPDwgaSkgJiBvcGNvZGUtPm5vX21hdGNoX29wZXJhbmRzKQotCQl7Ci0JCSAgaW50IGo7Ci0KLQkJICAvKiBvcGVyYW5kIEkgaXMgbWFya2VkLiAgQ2hlY2sgdGhhdCBpdCBkb2VzIG5vdCBtYXRjaCBhbnkKLQkJICAgICBvcGVyYW5kcyA+IEkgd2hpY2ggYXJlIG1hcmtlZC4gICovCi0JCSAgZm9yIChqID0gaSArIDE7IGogPCBNTjEwMzAwX01BWF9PUEVSQU5EUzsgaisrKQotCQkgICAgewotCQkgICAgICBpZiAoKCgxIDw8IGopICYgb3Bjb2RlLT5ub19tYXRjaF9vcGVyYW5kcykKLQkJCSAgJiYgbW4xMDMwMF9yZWdfb3BlcmFuZHNbaV0gPT0gbW4xMDMwMF9yZWdfb3BlcmFuZHNbal0pCi0JCQl7Ci0JCQkgIGVycm1zZyA9IF8oIkludmFsaWQgcmVnaXN0ZXIgc3BlY2lmaWNhdGlvbi4iKTsKLQkJCSAgbWF0Y2ggPSAwOwotCQkJICBnb3RvIGVycm9yOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICBlcnJvcjoKLSAgICAgIGlmIChtYXRjaCA9PSAwKQotICAgICAgICB7Ci0JICBuZXh0X29wY29kZSA9IG9wY29kZSArIDE7Ci0JICBpZiAoIXN0cmNtcChuZXh0X29wY29kZS0+bmFtZSwgb3Bjb2RlLT5uYW1lKSkKLQkgICAgewotCSAgICAgIG9wY29kZSA9IG5leHRfb3Bjb2RlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICAKLQkgIGFzX2JhZCAoIiVzIiwgZXJybXNnKTsKLQkgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgICAgCi0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICArK3N0cjsKLQotICBpZiAoKnN0ciAhPSAnXDAnKQotICAgIGFzX2JhZCAoXygianVuayBhdCBlbmQgb2YgbGluZTogYCVzJyIpLCBzdHIpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotICAvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMCkKLSAgICBzaXplID0gMTsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MxIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMCkKLSAgICBzaXplID0gMjsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MyIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMSkKLSAgICBzaXplID0gMzsKLQotCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzQpCi0gICAgc2l6ZSA9IDU7Ci0KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TNiB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDUpCi0gICAgc2l6ZSA9IDc7Ci0KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMikKLSAgICBzaXplID0gNDsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q0KQotICAgIHNpemUgPSA2OwotCi0gIGlmIChyZWxheGFibGUgJiYgZmMgPiAwKQotICAgIHsKLSAgICAgIGludCB0eXBlOwotCi0gICAgICAvKiBiQ0MgKi8KLSAgICAgIGlmIChzaXplID09IDIpCi0JewotCSAgLyogSGFuZGxlIGJyYSBzcGVjaWFsbHkuICBCYXNpY2FsbHkgdHJlYXQgaXQgbGlrZSBqbXAgc28KLQkgICAgIHRoYXQgd2UgYXV0b21hdGljYWxseSBoYW5kbGUgOCwgMTYgYW5kIDMyIGJpdCBvZmZzZXRzCi0JICAgICBjb3JyZWN0bHkgYXMgd2VsbCBhcyBqdW1wcyB0byBhbiB1bmRlZmluZWQgYWRkcmVzcy4KLQotCSAgICAgSXQgaXMgYWxzbyBpbXBvcnRhbnQgdG8gbm90IHRyZWF0IGl0IGxpa2Ugb3RoZXIgYkNDCi0JICAgICBpbnN0cnVjdGlvbnMgc2luY2UgdGhlIGxvbmcgZm9ybXMgb2YgYnJhIGlzIGRpZmZlcmVudAotCSAgICAgZnJvbSBvdGhlciBiQ0MgaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgIGlmIChvcGNvZGUtPm9wY29kZSA9PSAweGNhMDApCi0JICAgIHR5cGUgPSAxMDsKLQkgIGVsc2UKLQkgICAgdHlwZSA9IDA7Ci0JfQotICAgICAgLyogY2FsbCAqLwotICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA1KQotICAgICAgICB0eXBlID0gNjsKLSAgICAgIC8qIGNhbGxzICovCi0gICAgICBlbHNlIGlmIChzaXplID09IDQpCi0JdHlwZSA9IDg7Ci0gICAgICAvKiBqbXAgKi8KLSAgICAgIGVsc2UgaWYgKHNpemUgPT0gMyAmJiBvcGNvZGUtPm9wY29kZSA9PSAweGNjMDAwMCkKLQl0eXBlID0gMTA7Ci0gICAgICAvKiBiQ0MgKHVuY29tbW9uIGNhc2VzKSAqLwotICAgICAgZWxzZQotCXR5cGUgPSAzOwotCi0gICAgICBmID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4LCA4IC0gc2l6ZSwgdHlwZSwKLQkJICAgIGZpeHVwc1swXS5leHAuWF9hZGRfc3ltYm9sLAotCQkgICAgZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIsCi0JCSAgICAoY2hhciAqKWZpeHVwc1swXS5vcGluZGV4KTsKLSAgICAgIAotICAgICAgLyogVGhpcyBpcyBwcmV0dHkgaG9rZXkuICBXZSBiYXNpY2FsbHkganVzdCBjYXJlIGFib3V0IHRoZQotCSBvcGNvZGUsIHNvIHdlIGhhdmUgdG8gd3JpdGUgb3V0IHRoZSBmaXJzdCB3b3JkIGJpZyBlbmRpYW4uCi0KLQkgVGhlIGV4Y2VwdGlvbiBpcyAiY2FsbCIsIHdoaWNoIGhhcyB0d28gb3BlcmFuZHMgdGhhdCB3ZQotCSBjYXJlIGFib3V0LgotCi0JIFRoZSBmaXJzdCBvcGVyYW5kICh0aGUgcmVnaXN0ZXIgbGlzdCkgaGFwcGVucyB0byBiZSBpbiB0aGUKLQkgZmlyc3QgaW5zdHJ1Y3Rpb24gd29yZCwgYW5kIHdpbGwgYmUgaW4gdGhlIHJpZ2h0IHBsYWNlIGlmCi0JIHdlIG91dHB1dCB0aGUgZmlyc3Qgd29yZCBpbiBiaWcgZW5kaWFuIG1vZGUuCi0KLQkgVGhlIHNlY29uZCBvcGVyYW5kIChzdGFjayBzaXplKSBpcyBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQsCi0JIGFuZCB3ZSB3YW50IGl0IHRvIGFwcGVhciBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBleHRlbnNpb24KLQkgd29yZCAoYXMgaXQgYXBwZWFycyBpbiBtZW1vcnkpLiAgTHVja2lseSwgd3JpdGluZyB0aGUgZXh0ZW5zaW9uCi0JIHdvcmQgaW4gYmlnIGVuZGlhbiBmb3JtYXQgd2lsbCBkbyB3aGF0IHdlIHdhbnQuICAqLwotICAgICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgc2l6ZSA+IDQgPyA0IDogc2l6ZSk7Ci0gICAgICBpZiAoc2l6ZSA+IDgpCi0JewotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDQsIGV4dGVuc2lvbiwgNCk7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgOCwgMCwgc2l6ZSAtIDgpOwotCX0KLSAgICAgIGVsc2UgaWYgKHNpemUgPiA0KQotCW51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyA0LCBleHRlbnNpb24sIHNpemUgLSA0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGYgPSBmcmFnX21vcmUgKHNpemUpOwotCi0gICAgICAvKiBGaWxsIGluIGJ5dGVzIGZvciB0aGUgaW5zdHJ1Y3Rpb24uICBOb3RlIHRoYXQgb3Bjb2RlIGZpZWxkcwotCSBhcmUgd3JpdHRlbiBiaWctZW5kaWFuLCAxNiAmIDMyYml0IGltbWVkaWF0ZXMgYXJlIHdyaXR0ZW4KLQkgbGl0dGxlIGVuZGlhbi4gIEVnYWQuICAqLwotICAgICAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMAotCSAgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MxCi0JICB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDAKLQkgIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMSkKLQl7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCBzaXplKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzIKLQkgICAgICAgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhkZjAwMDAKLQkgICAgICAgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhkZTAwMDApCi0JewotCSAgLyogQSBmb3JtYXQgUzIgaW5zdHJ1Y3Rpb24gdGhhdCBpcyBfbm90XyAicmV0IiBhbmQgInJldGYiLiAgKi8KLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDEsIGluc24gJiAweGZmZmYsIDIpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMikKLQl7Ci0JICAvKiBUaGlzIG11c3QgYmUgYSByZXQgb3IgcmV0Ziwgd2hpY2ggaXMgd3JpdHRlbiBlbnRpcmVseSBpbgotCSAgICAgYmlnLWVuZGlhbiBmb3JtYXQuICAqLwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgMyk7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M0Ci0JICAgICAgICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZGMwMDAwMDApCi0JewotCSAgLyogVGhpcyBtdXN0IGJlIGEgZm9ybWF0IFM0ICJjYWxsIiBpbnN0cnVjdGlvbi4gIFdoYXQgYSBwYWluLiAgKi8KLQkgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IChpbnNuID4+IDgpICYgMHhmZmZmOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMjQpICYgMHhmZiwgMSk7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMSwgdGVtcCwgMik7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgMywgaW5zbiAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDQsIGV4dGVuc2lvbiAmIDB4ZmYsIDEpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TNCkKLQl7Ci0JICAvKiBUaGlzIG11c3QgYmUgYSBmb3JtYXQgUzQgImptcCIgaW5zdHJ1Y3Rpb24uICAqLwotCSAgdW5zaWduZWQgbG9uZyB0ZW1wID0gKChpbnNuICYgMHhmZmZmZmYpIDw8IDgpIHwgKGV4dGVuc2lvbiAmIDB4ZmYpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMjQpICYgMHhmZiwgMSk7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMSwgdGVtcCwgNCk7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M2KQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgdGVtcCA9ICgoaW5zbiAmIDB4ZmZmZmZmKSA8PCA4KQotCSAgICB8ICgoZXh0ZW5zaW9uID4+IDE2KSAmIDB4ZmYpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMjQpICYgMHhmZiwgMSk7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMSwgdGVtcCwgNCk7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgNSwgKGV4dGVuc2lvbiA+PiA4KSAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDYsIGV4dGVuc2lvbiAmIDB4ZmYsIDEpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMgotCSAgICAgICAmJiBvcGNvZGUtPm9wY29kZSAhPSAweGZhZjgwMDAwCi0JICAgICAgICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZmFmMDAwMDAKLQkgICAgICAgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhmYWY0MDAwMCkKLQl7Ci0JICAvKiBBIGZvcm1hdCBEMiBpbnN0cnVjdGlvbiB3aGVyZSB0aGUgMTZiaXQgaW1tZWRpYXRlIGlzCi0JICAgICByZWFsbHkgYSBzaW5nbGUgMTZiaXQgdmFsdWUsIG5vdCB0d28gOGJpdCB2YWx1ZXMuICAqLwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMTYpICYgMHhmZmZmLCAyKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAyLCBpbnNuICYgMHhmZmZmLCAyKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDIpCi0JewotCSAgLyogQSBmb3JtYXQgRDIgaW5zdHJ1Y3Rpb24gd2hlcmUgdGhlIDE2Yml0IGltbWVkaWF0ZQotCSAgICAgaXMgcmVhbGx5IHR3byA4Yml0IGltbWVkaWF0ZXMuICAqLwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgNCk7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q0KQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgdGVtcCA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpIHwgKGV4dGVuc2lvbiAmIDB4ZmZmZik7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiAxNikgJiAweGZmZmYsIDIpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDIsIHRlbXAsIDQpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9ENSkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHRlbXAgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KQotCSAgICAJCQl8ICgoZXh0ZW5zaW9uID4+IDgpICYgMHhmZmZmKTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmZmZiwgMik7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMiwgdGVtcCwgNCk7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgNiwgZXh0ZW5zaW9uICYgMHhmZiwgMSk7Ci0JfQotCi0gICAgICAvKiBDcmVhdGUgYW55IGZpeHVwcy4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgZmM7IGkrKykKLQl7Ci0JICBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kICpvcGVyYW5kOwotCi0JICBvcGVyYW5kID0gJm1uMTAzMDBfb3BlcmFuZHNbZml4dXBzW2ldLm9waW5kZXhdOwotCSAgaWYgKGZpeHVwc1tpXS5yZWxvYyAhPSBCRkRfUkVMT0NfVU5VU0VEKQotCSAgICB7Ci0JICAgICAgcmVsb2NfaG93dG9fdHlwZSAqcmVsb2NfaG93dG87Ci0JICAgICAgaW50IHNpemU7Ci0JICAgICAgaW50IG9mZnNldDsKLQkgICAgICBmaXhTICpmaXhQOwotCi0JICAgICAgcmVsb2NfaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4dXBzW2ldLnJlbG9jKTsKLQotCSAgICAgIGlmICghcmVsb2NfaG93dG8pCi0JCWFib3J0KCk7Ci0JICAKLQkgICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyZWxvY19ob3d0byk7Ci0KLQkgICAgICBpZiAoc2l6ZSA8IDEgfHwgc2l6ZSA+IDQpCi0JCWFib3J0KCk7Ci0KLQkgICAgICBvZmZzZXQgPSA0IC0gc2l6ZTsKLQkgICAgICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsCi0JCQkJICBzaXplLCAmZml4dXBzW2ldLmV4cCwKLQkJCQkgIHJlbG9jX2hvd3RvLT5wY19yZWxhdGl2ZSwKLQkJCQkgIGZpeHVwc1tpXS5yZWxvYyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCByZWxvYywgcGNyZWwsIHJlbG9jX3NpemUsIG9mZnNldDsKLQkgICAgICBmaXhTICpmaXhQOwotCi0JICAgICAgcmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKLQkgICAgICAvKiBIb3cgYmlnIGlzIHRoZSByZWxvYz8gIFJlbWVtYmVyIFNQTElUIHJlbG9jcyBhcmUKLQkJIGltcGxpY2l0bHkgMzJiaXRzLiAgKi8KLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NQTElUKSAhPSAwKQotCQlyZWxvY19zaXplID0gMzI7Ci0JICAgICAgZWxzZQotCQlyZWxvY19zaXplID0gb3BlcmFuZC0+Yml0czsKLQotCSAgICAgIC8qIElzIHRoZSByZWxvYyBwYy1yZWxhdGl2ZT8gICovCi0JICAgICAgcGNyZWwgPSAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUENSRUwpICE9IDA7Ci0KLQkgICAgICAvKiBHcm9zcy4gIFRoaXMgZGlzZ3VzdGluZyBoYWNrIGlzIHRvIG1ha2Ugc3VyZSB3ZQotCQkgZ2V0IHRoZSByaWdodCBvZmZzZXQgZm9yIHRoZSAxNi8zMiBiaXQgcmVsb2MgaW4gCi0JCSAiY2FsbCIgaW5zdHJ1Y3Rpb25zLiAgQmFzaWNhbGx5IHRoZXkncmUgYSBwYWluCi0JCSBiZWNhdXNlIHRoZSByZWxvYyBpc24ndCBhdCB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgaWYgKChzaXplID09IDUgfHwgc2l6ZSA9PSA3KQotCQkgICYmICgoKGluc24gPj4gMjQpICYgMHhmZikgPT0gMHhjZAotCQkgICAgICB8fCAoKGluc24gPj4gMjQpICYgMHhmZikgPT0gMHhkZCkpCi0JCXNpemUgLT0gMjsKLQotCSAgICAgIC8qIFNpbWlsYXJseSBmb3IgY2VydGFpbiBiaXQgaW5zdHJ1Y3Rpb25zIHdoaWNoIGRvbid0Ci0JCSBoYXYgdGhlaXIgMzJiaXQgcmVsb2MgYXQgdGhlIHRhaWwgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpZiAoc2l6ZSA9PSA3Ci0JCSAgJiYgKCgoaW5zbiA+PiAxNikgJiAweGZmZmYpID09IDB4ZmUwMAotCQkgICAgICB8fCAoKGluc24gPj4gMTYpICYgMHhmZmZmKSA9PSAweGZlMDEKLQkJICAgICAgfHwgKChpbnNuID4+IDE2KSAmIDB4ZmZmZikgPT0gMHhmZTAyKSkKLQkJc2l6ZSAtPSAxOwotCQotCSAgICAgIG9mZnNldCA9IHNpemUgLSByZWxvY19zaXplIC8gODsKLQotCSAgICAgIC8qIENob29zZSBhIHByb3BlciBCRkQgcmVsb2NhdGlvbiB0eXBlLiAgKi8KLQkgICAgICBpZiAocGNyZWwpCi0JCXsKLQkJICBpZiAocmVsb2Nfc2l6ZSA9PSAzMikKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotCQkgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMTYpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsKLQkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDgpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ184X1BDUkVMOwotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHJlbG9jX3NpemUgPT0gMzIpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ18zMjsKLQkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDE2KQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfMTY7Ci0JCSAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSA4KQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfODsKLQkJICBlbHNlCi0JCSAgICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgLyogQ29udmVydCB0aGUgc2l6ZSBvZiB0aGUgcmVsb2MgaW50byB3aGF0IGZpeF9uZXdfZXhwIHdhbnRzLiAgKi8KLQkgICAgICByZWxvY19zaXplID0gcmVsb2Nfc2l6ZSAvIDg7Ci0JICAgICAgaWYgKHJlbG9jX3NpemUgPT0gOCkKLQkJcmVsb2Nfc2l6ZSA9IDA7Ci0JICAgICAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAxNikKLQkJcmVsb2Nfc2l6ZSA9IDE7Ci0JICAgICAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAzMikKLQkJcmVsb2Nfc2l6ZSA9IDI7Ci0KLQkgICAgICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsCi0JCQkJICByZWxvY19zaXplLCAmZml4dXBzW2ldLmV4cCwgcGNyZWwsCi0JCQkJICAoKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgcmVsb2MpKTsKLQotCSAgICAgIGlmIChwY3JlbCkKLQkJZml4UC0+Znhfb2Zmc2V0ICs9IG9mZnNldDsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLQotLyogaWYgd2hpbGUgcHJvY2Vzc2luZyBhIGZpeHVwLCBhIHJlbG9jIHJlYWxseSBuZWVkcyB0byBiZSBjcmVhdGVkICovCi0vKiB0aGVuIGl0IGlzIGRvbmUgaGVyZSAqLwotICAgICAgICAgICAgICAgICAKLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWcsIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbG9jOwotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCi0gIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhwLT5meF9yX3R5cGUpOwotICBpZiAocmVsb2MtPmhvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICBfKCJyZWxvYyAlZCBub3Qgc3VwcG9ydGVkIGJ5IG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCQkgICAgKGludClmaXhwLT5meF9yX3R5cGUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICBpZiAoZml4cC0+ZnhfYWRkc3kgJiYgZml4cC0+Znhfc3Vic3kpCi0gICAgewotICAgIAotICAgICAgaWYgKChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gU19HRVRfU0VHTUVOVCAoZml4cC0+Znhfc3Vic3kpKQotCSAgfHwgU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCXsKLQkgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSJEaWZmZXJlbmNlIG9mIHN5bWJvbHMgaW4gZGlmZmVyZW50IHNlY3Rpb25zIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLQotICAgICAgcmVsb2MtPnN5bV9wdHJfcHRyID0gJmJmZF9hYnNfc3ltYm9sOwotICAgICAgcmVsb2MtPmFkZGVuZCA9IChTX0dFVF9WQUxVRSAoZml4cC0+ZnhfYWRkc3kpCi0JCSAgICAgICAtIFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSkgKyBmaXhwLT5meF9vZmZzZXQpOwotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICByZWxvYy0+c3ltX3B0cl9wdHIgPSAmZml4cC0+ZnhfYWRkc3ktPmJzeW07Ci0gICAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotICAgIH0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSAwKQotICAgIHJldHVybiAyOwotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMykKLSAgICByZXR1cm4gMzsKLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDYpCi0gICAgewotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKGZyYWdwLT5mcl9zeW1ib2wpCi0JICB8fCBzZWcgIT0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSA3OwotCSAgcmV0dXJuIDc7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiA1OwotICAgIH0KLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDgpCi0gICAgewotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKGZyYWdwLT5mcl9zeW1ib2wpCi0JICB8fCBzZWcgIT0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSA5OwotCSAgcmV0dXJuIDY7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiA0OwotICAgIH0KLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDEwKQotICAgIHsKLSAgICAgIGlmICghU19JU19ERUZJTkVEIChmcmFncC0+ZnJfc3ltYm9sKQotCSAgfHwgc2VnICE9IFNfR0VUX1NFR01FTlQgKGZyYWdwLT5mcl9zeW1ib2wpKQotCXsKLQkgIGZyYWdwLT5mcl9zdWJ0eXBlID0gMTI7Ci0JICByZXR1cm4gNTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIDI7Ci0gICAgfQotfSAKLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0jaWYgMAotICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTCAmJiAhIFNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgTGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0jZW5kaWYKLX0KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhwLCB2YWx1ZXAsIHNlZykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgdmFsdWVUICp2YWx1ZXA7Ci0gICAgIHNlZ1Qgc2VnOwotewotICAvKiBXZSBzaG91bGRuJ3QgZXZlciBnZXQgaGVyZSBiZWNhdXNlIGxpbmtyZWxheCBpcyBub256ZXJvLiAgKi8KLSAgYWJvcnQgKCk7Ci0gIGZpeHAtPmZ4X2RvbmUgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLyogSW5zZXJ0IGFuIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1tbjEwMzAwX2luc2VydF9vcGVyYW5kIChpbnNucCwgZXh0ZW5zaW9ucCwgb3BlcmFuZCwgdmFsLCBmaWxlLCBsaW5lLCBzaGlmdCkKLSAgICAgdW5zaWduZWQgbG9uZyAqaW5zbnA7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmV4dGVuc2lvbnA7Ci0gICAgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgdmFsOwotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgdW5zaWduZWQgaW50IHNoaWZ0OwotewotICAvKiBObyBuZWVkIHRvIGNoZWNrIDMyYml0IG9wZXJhbmRzIGZvciBhIGJpdC4gIE5vdGUgdGhhdAotICAgICBNTjEwMzAwX09QRVJBTkRfU1BMSVQgaXMgYW4gaW1wbGljaXQgMzJiaXQgb3BlcmFuZC4gICovCi0gIGlmIChvcGVyYW5kLT5iaXRzICE9IDMyCi0gICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpID09IDApCi0gICAgewotICAgICAgbG9uZyBtaW4sIG1heDsKLSAgICAgIG9mZnNldFQgdGVzdDsKLSAgICAgIGludCBiaXRzOwotCi0gICAgICBiaXRzID0gb3BlcmFuZC0+Yml0czsKLQotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TSUdORUQpICE9IDApCi0JewotCSAgbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSkgLSAxOwotCSAgbWluID0gLSAoMSA8PCAoYml0cyAtIDEpKTsKLQl9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtYXggPSAoMSA8PCBiaXRzKSAtIDE7Ci0gICAgICAgICAgbWluID0gMDsKLSAgICAgICAgfQotCi0gICAgICB0ZXN0ID0gdmFsOwotCi0KLSAgICAgIGlmICh0ZXN0IDwgKG9mZnNldFQpIG1pbiB8fCB0ZXN0ID4gKG9mZnNldFQpIG1heCkKLSAgICAgICAgewotICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciA9Ci0gICAgICAgICAgICBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIik7Ci0gICAgICAgICAgY2hhciBidWZbMTAwXTsKLQotICAgICAgICAgIHNwcmludF92YWx1ZSAoYnVmLCB0ZXN0KTsKLSAgICAgICAgICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQotICAgICAgICAgICAgYXNfd2FybiAoZXJyLCBidWYsIG1pbiwgbWF4KTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBhc193YXJuX3doZXJlIChmaWxlLCBsaW5lLCBlcnIsIGJ1ZiwgbWluLCBtYXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpICE9IDApCi0gICAgewotICAgICAgKmluc25wIHw9ICh2YWwgPj4gKDMyIC0gb3BlcmFuZC0+Yml0cykpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0gICAgICAqZXh0ZW5zaW9ucCB8PSAoKHZhbCAmICgoMSA8PCAoMzIgLSBvcGVyYW5kLT5iaXRzKSkgLSAxKSkKLQkJICAgICAgPDwgb3BlcmFuZC0+c2hpZnQpOwotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX0VYVEVOREVEKSA9PSAwKQotICAgIHsKLSAgICAgICppbnNucCB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkJIDw8IChvcGVyYW5kLT5zaGlmdCArIHNoaWZ0KSk7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUkVQRUFURUQpICE9IDApCi0JKmluc25wIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCQkgICA8PCAob3BlcmFuZC0+c2hpZnQgKyBzaGlmdCArIG9wZXJhbmQtPmJpdHMpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqZXh0ZW5zaW9ucCB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkJICAgICAgPDwgKG9wZXJhbmQtPnNoaWZ0ICsgc2hpZnQpKTsKLQotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRCkgIT0gMCkKLQkqZXh0ZW5zaW9ucCB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkJCTw8IChvcGVyYW5kLT5zaGlmdCArIHNoaWZ0ICsgb3BlcmFuZC0+Yml0cykpOwotICAgIH0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWNoZWNrX29wZXJhbmQgKGluc24sIG9wZXJhbmQsIHZhbCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kICpvcGVyYW5kOwotICAgICBvZmZzZXRUIHZhbDsKLXsKLSAgLyogTm8gbmVlZCB0byBjaGVjayAzMmJpdCBvcGVyYW5kcyBmb3IgYSBiaXQuICBOb3RlIHRoYXQKLSAgICAgTU4xMDMwMF9PUEVSQU5EX1NQTElUIGlzIGFuIGltcGxpY2l0IDMyYml0IG9wZXJhbmQuICAqLwotICBpZiAob3BlcmFuZC0+Yml0cyAhPSAzMgotICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NQTElUKSA9PSAwKQotICAgIHsKLSAgICAgIGxvbmcgbWluLCBtYXg7Ci0gICAgICBvZmZzZXRUIHRlc3Q7Ci0gICAgICBpbnQgYml0czsKLQotICAgICAgYml0cyA9IG9wZXJhbmQtPmJpdHM7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCXsKLQkgIG1heCA9ICgxIDw8IChiaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0gKDEgPDwgKGJpdHMgLSAxKSk7Ci0JfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWF4ID0gKDEgPDwgYml0cykgLSAxOwotICAgICAgICAgIG1pbiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgdGVzdCA9IHZhbDsKLQotCi0gICAgICBpZiAodGVzdCA8IChvZmZzZXRUKSBtaW4gfHwgdGVzdCA+IChvZmZzZXRUKSBtYXgpCi0JcmV0dXJuIDA7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDE7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9hcmNoX21hY2ggKG1hY2gpCi0gICAgIGludCBtYWNoOwotewotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21uMTAzMDAsIG1hY2gpKQotICAgIGFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotCi0gIGN1cnJlbnRfbWFjaGluZSA9IG1hY2g7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1uMTAzMDAuaCBiL2dhcy9jb25maWcvdGMtbW4xMDMwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmNiMjI3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbW4xMDMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyogdGMtbW4xMDMwMC5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1tbjEwMzAwLmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19NTjEwMzAwCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAjZXJyb3IgTU4xMDMwMCBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9tbjEwMzAwCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItbW4xMDMwMCIKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbgotCi0vKiBEb24ndCBib3RoZXIgdG8gYWRqdXN0IHJlbG9jcy4gICovCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKEZJWCkgMAotCi0vKiBXZSBkbyByZWxheGluZyBpbiB0aGUgYXNzZW1ibGVyIGFzIHdlbGwgYXMgdGhlIGxpbmtlci4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1uczMyay5jIGIvZ2FzL2NvbmZpZy90Yy1uczMyay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmRjNTI4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbnMzMmsuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMjggKzAsMCBAQAotLyogbnMzMmsuYyAgLS0gQXNzZW1ibGUgb24gdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgMzJrIHNlcmllcwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qI2RlZmluZSBTSE9XX05VTSAxKi8vKiB1bmNvbW1lbnQgZm9yIGRlYnVnZ2luZyAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvcGNvZGUvbnMzMmsuaCIKLQotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotLyogTWFjcm9zICovCi0jZGVmaW5lIElJRl9FTlRSSUVTIDEzCQkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBpaWYgKi8KLSNkZWZpbmUgUFJJVkFURV9TSVpFIDI1NgkvKiBzaXplIG9mIG15IGdhcmJhZ2UgbWVtb3J5ICovCi0jZGVmaW5lIE1BWF9BUkdTIDQKLSNkZWZpbmUgREVGQVVMVAktMQkJLyogYWRkcl9tb2RlIHJldHVybnMgdGhpcyB2YWx1ZSB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWluIGNvbnN0YW50IG9yIGxhYmVsIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY291bnRlcmVkICovCi0KLSNkZWZpbmUgSUlGKHB0cixhMSxjMSxlMSxnMSxpMSxrMSxtMSxvMSxxMSxzMSx1MSkJXAotICAgIGlpZi5paWZQW3B0cl0udHlwZT0gYTE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLnNpemU9IGMxOwkJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5vYmplY3Q9IGUxOwkJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5vYmplY3RfYWRqdXN0PSBnMTsJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5wY3JlbD0gaTE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLnBjcmVsX2FkanVzdD0gazE7CQkJXAotICAgIGlpZi5paWZQW3B0cl0uaW1fZGlzcD0gbTE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLnJlbGF4X3N1YnN0YXRlPSBvMTsJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5iaXRfZml4UD0gcTE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLmFkZHJfbW9kZT0gczE7CQkJXAotICAgIGlpZi5paWZQW3B0cl0uYnNyPSB1MTsKLQotI2lmZGVmIFNFUVVFTlRfQ09NUEFUQUJJTElUWQotI2RlZmluZSBMSU5FX0NPTU1FTlRfQ0hBUlMgInwiCi0jZGVmaW5lIEFCU09MVVRFX1BSRUZJWCAnQCcKLSNkZWZpbmUgSU1NRURJQVRFX1BSRUZJWCAnIycKLSNlbmRpZgotCi0jaWZuZGVmIExJTkVfQ09NTUVOVF9DSEFSUwotI2RlZmluZSBMSU5FX0NPTU1FTlRfQ0hBUlMgIiMiCi0jZW5kaWYKLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gTElORV9DT01NRU5UX0NIQVJTOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0jaWYgIWRlZmluZWQoQUJTT0xVVEVfUFJFRklYKSAmJiAhZGVmaW5lZChJTU1FRElBVEVfUFJFRklYKQotI2RlZmluZSBBQlNPTFVURV9QUkVGSVggJ0AnCS8qIE9uZSBvciB0aGUgb3RoZXIgTVVTVCBiZSBkZWZpbmVkICovCi0jZW5kaWYKLQotc3RydWN0IGFkZHJfbW9kZQotICB7Ci0gICAgY2hhciBtb2RlOwkJCS8qIGFkZHJlc3NpbmcgbW9kZSBvZiBvcGVyYW5kICgwLTMxKSAqLwotICAgIGNoYXIgc2NhbGVkX21vZGU7CQkvKiBtb2RlIGNvbWJpbmVkIHdpdGggc2NhbGVkIG1vZGUgKi8KLSAgICBjaGFyIHNjYWxlZF9yZWc7CQkvKiByZWdpc3RlciB1c2VkIGluIHNjYWxlZCsxICgxLTgpICovCi0gICAgY2hhciBmbG9hdF9mbGFnOwkJLyogc2V0IGlmIFIwLi5SNyB3YXMgRjAuLkY3IGllIGEKLQkJCQkgICBmbG9hdGluZy1wb2ludC1yZWdpc3RlciAqLwotICAgIGNoYXIgYW1fc2l6ZTsJCS8qIGVzdGltYXRlZCBtYXggc2l6ZSBvZiBnZW5lcmFsIGFkZHItbW9kZQotCQkJCSAgIHBhcnRzICovCi0gICAgY2hhciBpbV9kaXNwOwkJLyogaWYgaW1fZGlzcD09MSB3ZSBoYXZlIGEgZGlzcGxhY2VtZW50ICovCi0gICAgY2hhciBwY3JlbDsJCQkvKiAxIGlmIHBjcmVsLCB0aGlzIGlzIHJlYWxseSByZWR1bmRhbnQgaW5mbyAqLwotICAgIGNoYXIgZGlzcF9zdWZmaXhbMl07CS8qIGxlbmd0aCBvZiBkaXNwbGFjZW1lbnQocyksIDA9dW5kZWZpbmVkICovCi0gICAgY2hhciAqZGlzcFsyXTsJCS8qIHBvaW50ZXIocykgYXQgZGlzcGxhY2VtZW50KHMpCi0JCQkJICAgb3IgaW1tZWRpYXRlcyhzKSAgICAgKGFzY2lpKSAqLwotICAgIGNoYXIgaW5kZXhfYnl0ZTsJCS8qIGluZGV4IGJ5dGUgKi8KLSAgfTsKLXR5cGVkZWYgc3RydWN0IGFkZHJfbW9kZSBhZGRyX21vZGVTOwotCi0KLWNoYXIgKmZyZWVwdHIsICpmcmVlcHRyX3N0YXRpYzsJLyogcG9pbnRzIGF0IHNvbWUgbnVtYmVyIG9mIGZyZWUgYnl0ZXMgKi8KLXN0cnVjdCBoYXNoX2NvbnRyb2wgKmluc3RfaGFzaF9oYW5kbGU7Ci0KLXN0cnVjdCBuczMya19vcGNvZGUgKmRlc2M7CS8qIHBvaW50ZXIgYXQgZGVzY3JpcHRpb24gb2YgaW5zdHJ1Y3Rpb24gKi8KLWFkZHJfbW9kZVMgYWRkcl9tb2RlUDsKLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJmZCI7CS8qIHdlIGRvbid0IHdhbnQgdG8gc3VwcG9ydCBsb3dlcmNhc2UsIGRvIHdlICovCi0KLS8qIFVQUEVSQ0FTRSBkZW5vdGVzIGxpdmUgbmFtZXMgd2hlbiBhbiBpbnN0cnVjdGlvbiBpcyBidWlsdCwgSUlGIGlzCi0gKiB1c2VkIGFzIGFuIGludGVybWVkaWF0ZSBmb3JtIHRvIHN0b3JlIHRoZSBhY3R1YWwgcGFydHMgb2YgdGhlCi0gKiBpbnN0cnVjdGlvbi4gQSBuczMyayBtYWNoaW5lIGluc3RydWN0aW9uIGNhbiBiZSBkaXZpZGVkIGludG8gYQotICogY291cGxlIG9mIHN1YiBQQVJUcy4gV2hlbiBhbiBpbnN0cnVjdGlvbiBpcyBhc3NlbWJsZWQgdGhlCi0gKiBhcHByb3ByaWF0ZSBQQVJUIGdldCBhbiBhc3NpZ25tZW50LiBXaGVuIGFuIElJRiBoYXMgYmVlbiBjb21wbGV0ZWQKLSAqIGl0IGlzIGNvbnZlcnRlZCB0byBhIEZSQUdtZW50IGFzIHNwZWNpZmllZCBpbiBBUy5IICovCi0KLS8qIGludGVybmFsIHN0cnVjdHMgKi8KLXN0cnVjdCBuczMya19vcHRpb24KLSAgewotICAgIGNoYXIgKnBhdHRlcm47Ci0gICAgdW5zaWduZWQgbG9uZyBvcjsKLSAgICB1bnNpZ25lZCBsb25nIGFuZDsKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGludCB0eXBlOwkJCS8qIGhvdyB0byBpbnRlcnByZXQgb2JqZWN0ICovCi0gICAgaW50IHNpemU7CQkJLyogRXN0aW1hdGVkIG1heCBzaXplIG9mIG9iamVjdCAqLwotICAgIHVuc2lnbmVkIGxvbmcgb2JqZWN0OwkvKiBiaW5hcnkgZGF0YSAqLwotICAgIGludCBvYmplY3RfYWRqdXN0OwkJLyogbnVtYmVyIGFkZGVkIHRvIG9iamVjdCAqLwotICAgIGludCBwY3JlbDsJCQkvKiBUcnVlIGlmIG9iamVjdCBpcyBwY3JlbCAqLwotICAgIGludCBwY3JlbF9hZGp1c3Q7CQkvKiBsZW5ndGggaW4gYnl0ZXMgZnJvbSB0aGUKLQkJCQkJICAgaW5zdHJ1Y3Rpb24gc3RhcnQgdG8gdGhlCi0JCQkJCSAgIGRpc3BsYWNlbWVudCAqLwotICAgIGludCBpbV9kaXNwOwkJLyogVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgZGlzcGxhY2VtZW50ICovCi0gICAgcmVsYXhfc3Vic3RhdGVUIHJlbGF4X3N1YnN0YXRlOwkvKiBJbml0aWFsIHJlbGF4c3Vic3RhdGUgKi8KLSAgICBiaXRfZml4UyAqYml0X2ZpeFA7CQkvKiBQb2ludGVyIGF0IGJpdF9maXggc3RydWN0ICovCi0gICAgaW50IGFkZHJfbW9kZTsJCS8qIFdoYXQgYWRkcm1vZGUgZG8gd2UgYXNzb2NpYXRlIHdpdGggdGhpcwotCQkJCSAgIGlpZi1lbnRyeSAqLwotICAgIGNoYXIgYnNyOwkJCS8qIFNlcXVlbnQgaGFjayAqLwotICB9IGlpZl9lbnRyeVQ7CQkJLyogSW50ZXJuYWwgSW5zdHJ1Y3Rpb24gRm9ybWF0ICovCi0KLXN0cnVjdCBpbnRfaW5zX2Zvcm0KLSAgewotICAgIGludCBpbnN0cl9zaXplOwkJLyogTWF4IHNpemUgb2YgaW5zdHJ1Y3Rpb24gaW4gYnl0ZXMuICovCi0gICAgaWlmX2VudHJ5VCBpaWZQW0lJRl9FTlRSSUVTICsgMV07Ci0gIH07Ci1zdHJ1Y3QgaW50X2luc19mb3JtIGlpZjsKLWV4cHJlc3Npb25TIGV4cHJQOwotY2hhciAqaW5wdXRfbGluZV9wb2ludGVyOwotLyogZGVzY3JpcHRpb24gb2YgdGhlIFBBUlRzIGluIElJRgotICpvYmplY3Rbbl06Ci0gKiAwCXRvdGFsIGxlbmd0aCBpbiBieXRlcyBvZiBlbnRyaWVzIGluIGlpZgotICogMQlvcGNvZGUKLSAqIDIJaW5kZXhfYnl0ZV9hCi0gKiAzCWluZGV4X2J5dGVfYgotICogNAlkaXNwX2FfMQotICogNQlkaXNwX2FfMgotICogNglkaXNwX2JfMQotICogNwlkaXNwX2JfMgotICogOAlpbW1fYQotICogOQlpbW1fYgotICogMTAJaW1wbGllZDEKLSAqIDExCWltcGxpZWQyCi0gKgotICogRm9yIGV2ZXJ5IGVudHJ5IHRoZXJlIGlzIGEgZGF0YWxlbmd0aCBpbiBieXRlcy4gVGhpcyBpcyBzdG9yZWQgaW4gc2l6ZVtuXS4KLSAqCSAwLAl0aGUgb2JqZWN0bGVuZ3RoIGlzIG5vdCBleHBsaWNpdGx5IGdpdmVuIGJ5IHRoZSBpbnN0cnVjdGlvbgotICoJCWFuZCB0aGUgb3BlcmFuZCBpcyB1bmRlZmluZWQuIFRoaXMgaXMgYSBjYXNlIGZvciByZWxheGF0aW9uLgotICoJCVJlc2VydmUgNCBieXRlcyBmb3IgdGhlIGZpbmFsIG9iamVjdC4KLSAqCi0gKgkgMSwJdGhlIGVudHJ5IGNvbnRhaW5zIG9uZSBieXRlCi0gKgkgMiwJdGhlIGVudHJ5IGNvbnRhaW5zIHR3byBieXRlcwotICoJIDMsCXRoZSBlbnRyeSBjb250YWlucyB0aHJlZSBieXRlcwotICoJIDQsCXRoZSBlbnRyeSBjb250YWlucyBmb3VyIGJ5dGVzCi0gKglldGMKLSAqCi0gKiBGdXJ0aGVybW9yZSwgZXZlcnkgZW50cnkgaGFzIGEgZGF0YSB0eXBlIGlkZW50aWZpZXIgaW4gdHlwZVtuXS4KLSAqCi0gKiAJIDAsCXRoZSBlbnRyeSBpcyB2b2lkLCBpZ25vcmUgaXQuCi0gKiAJIDEsCXRoZSBlbnRyeSBpcyBhIGJpbmFyeSBudW1iZXIuCi0gKgkgMiwJdGhlIGVudHJ5IGlzIGEgcG9pbnRlciBhdCBhbiBleHByZXNzaW9uLgotICoJCVdoZXJlIGV4cHJlc3Npb24gbWF5IGJlIGFzIHNpbXBsZSBhcyBhIHNpbmdsZSAnMScsCi0gKgkJYW5kIGFzIGNvbXBsaWNhdGVkIGFzICBmb28tYmFyKzEyLAotICogCQlmb28gYW5kIGJhciBtYXkgYmUgdW5kZWZpbmVkIGJ1dCBzdWZmaXhlZCBieSA6e2J8d3xkfSB0bwotICoJCWNvbnRyb2wgdGhlIGxlbmd0aCBvZiB0aGUgb2JqZWN0LgotICoKLSAqCSAzLAl0aGUgZW50cnkgaXMgYSBwb2ludGVyIGF0IGEgYmlnbnVtIHN0cnVjdAotICoKLSAqCi0gKiBUaGUgbG93LW9yZGVyLWJ5dGUgY29yZXNwb25kcyB0byBsb3cgcGh5c2ljYWwgbWVtb3J5LgotICogT2J2aW91c2x5IGEgRlJBR21lbnQgbXVzdCBiZSBjcmVhdGVkIGZvciBlYWNoIHZhbGlkIGRpc3AgaW4gUEFSVCB3aG9zZQotICogZGF0YWxlbmd0aCBpcyB1bmRlZmluZWQgKHRvIGJhZCkgLgotICogVGhlIGNhc2Ugd2hlcmUganVzdCB0aGUgZXhwcmVzc2lvbiBpcyB1bmRlZmluZWQgaXMgbGVzcyBzZXZlcmUgYW5kIGlzCi0gKiBoYW5kbGVkIGJ5IGZpeC4gSGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvYmplY3RmaWxlIGlzIGtub3duLgotICogV2l0aCB0aGlzIHJlcHJlc2VudGF0aW9uIHdlIHNpbXBsaWZ5IHRoZSBhc3NlbWJseSBhbmQgc2VwYXJhdGVzIHRoZQotICogbWFjaGluZSBkZXBlbmRlbnQvaW5kZXBlbmRlbnQgcGFydHMgaW4gYSBtb3JlIGNsZWFuIHdheSAoc2FpZCBPRSkKLSAqLwotDAotc3RydWN0IG5zMzJrX29wdGlvbiBvcHQxW10gPQkJLyogcmVzdG9yZSwgZXhpdCAqLwotewotICB7InIwIiwgMHg4MCwgMHhmZn0sCi0gIHsicjEiLCAweDQwLCAweGZmfSwKLSAgeyJyMiIsIDB4MjAsIDB4ZmZ9LAotICB7InIzIiwgMHgxMCwgMHhmZn0sCi0gIHsicjQiLCAweDA4LCAweGZmfSwKLSAgeyJyNSIsIDB4MDQsIDB4ZmZ9LAotICB7InI2IiwgMHgwMiwgMHhmZn0sCi0gIHsicjciLCAweDAxLCAweGZmfSwKLSAgezAsIDB4MDAsIDB4ZmZ9Ci19Owotc3RydWN0IG5zMzJrX29wdGlvbiBvcHQyW10gPQkJLyogc2F2ZSwgZW50ZXIgKi8KLXsKLSAgeyJyMCIsIDB4MDEsIDB4ZmZ9LAotICB7InIxIiwgMHgwMiwgMHhmZn0sCi0gIHsicjIiLCAweDA0LCAweGZmfSwKLSAgeyJyMyIsIDB4MDgsIDB4ZmZ9LAotICB7InI0IiwgMHgxMCwgMHhmZn0sCi0gIHsicjUiLCAweDIwLCAweGZmfSwKLSAgeyJyNiIsIDB4NDAsIDB4ZmZ9LAotICB7InI3IiwgMHg4MCwgMHhmZn0sCi0gIHswLCAweDAwLCAweGZmfQotfTsKLXN0cnVjdCBuczMya19vcHRpb24gb3B0M1tdID0JCS8qIHNldGNmZyAqLwotewotICB7ImMiLCAweDgsIDB4ZmZ9LAotICB7Im0iLCAweDQsIDB4ZmZ9LAotICB7ImYiLCAweDIsIDB4ZmZ9LAotICB7ImkiLCAweDEsIDB4ZmZ9LAotICB7MCwgMHgwLCAweGZmfQotfTsKLXN0cnVjdCBuczMya19vcHRpb24gb3B0NFtdID0JCS8qIGNpbnYgKi8KLXsKLSAgeyJhIiwgMHg0LCAweGZmfSwKLSAgeyJpIiwgMHgyLCAweGZmfSwKLSAgeyJkIiwgMHgxLCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdDVbXSA9CQkvKiBzdHJpbmcgaW5zdCAqLwotewotICB7ImIiLCAweDIsIDB4ZmZ9LAotICB7InUiLCAweGMsIDB4ZmZ9LAotICB7InciLCAweDQsIDB4ZmZ9LAotICB7MCwgMHgwLCAweGZmfQotfTsKLXN0cnVjdCBuczMya19vcHRpb24gb3B0NltdID0JCS8qIHBsYWluIHJlZyBleHQsY3Z0cCBldGMgKi8KLXsKLSAgeyJyMCIsIDB4MDAsIDB4ZmZ9LAotICB7InIxIiwgMHgwMSwgMHhmZn0sCi0gIHsicjIiLCAweDAyLCAweGZmfSwKLSAgeyJyMyIsIDB4MDMsIDB4ZmZ9LAotICB7InI0IiwgMHgwNCwgMHhmZn0sCi0gIHsicjUiLCAweDA1LCAweGZmfSwKLSAgeyJyNiIsIDB4MDYsIDB4ZmZ9LAotICB7InI3IiwgMHgwNywgMHhmZn0sCi0gIHswLCAweDAwLCAweGZmfQotfTsKLQotI2lmICFkZWZpbmVkKE5TMzIwMzIpICYmICFkZWZpbmVkKE5TMzI1MzIpCi0jZGVmaW5lIE5TMzI1MzIKLSNlbmRpZgotCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uIGNwdXJlZ181MzJbXSA9CS8qIGxwciBzcHIgKi8KLXsKLSAgeyJ1cyIsIDB4MCwgMHhmZn0sCi0gIHsiZGNyIiwgMHgxLCAweGZmfSwKLSAgeyJicGMiLCAweDIsIDB4ZmZ9LAotICB7ImRzciIsIDB4MywgMHhmZn0sCi0gIHsiY2FyIiwgMHg0LCAweGZmfSwKLSAgeyJmcCIsIDB4OCwgMHhmZn0sCi0gIHsic3AiLCAweDksIDB4ZmZ9LAotICB7InNiIiwgMHhhLCAweGZmfSwKLSAgeyJ1c3AiLCAweGIsIDB4ZmZ9LAotICB7ImNmZyIsIDB4YywgMHhmZn0sCi0gIHsicHNyIiwgMHhkLCAweGZmfSwKLSAgeyJpbnRiYXNlIiwgMHhlLCAweGZmfSwKLSAgeyJtb2QiLCAweGYsIDB4ZmZ9LAotICB7MCwgMHgwMCwgMHhmZn0KLX07Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uIG1tdXJlZ181MzJbXSA9CS8qIGxtciBzbXIgKi8KLXsKLSAgeyJtY3IiLCAweDksIDB4ZmZ9LAotICB7Im1zciIsIDB4YSwgMHhmZn0sCi0gIHsidGVhciIsIDB4YiwgMHhmZn0sCi0gIHsicHRiMCIsIDB4YywgMHhmZn0sCi0gIHsicHRiMSIsIDB4ZCwgMHhmZn0sCi0gIHsiaXZhcjAiLCAweGUsIDB4ZmZ9LAotICB7Iml2YXIxIiwgMHhmLCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci0KLXN0cnVjdCBuczMya19vcHRpb24gY3B1cmVnXzAzMltdID0JLyogbHByIHNwciAqLwotewotICB7InVwc3IiLCAweDAsIDB4ZmZ9LAotICB7ImZwIiwgMHg4LCAweGZmfSwKLSAgeyJzcCIsIDB4OSwgMHhmZn0sCi0gIHsic2IiLCAweGEsIDB4ZmZ9LAotICB7InBzciIsIDB4ZCwgMHhmZn0sCi0gIHsiaW50YmFzZSIsIDB4ZSwgMHhmZn0sCi0gIHsibW9kIiwgMHhmLCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uIG1tdXJlZ18wMzJbXSA9CS8qIGxtciBzbXIgKi8KLXsKLSAgeyJicHIwIiwgMHgwLCAweGZmfSwKLSAgeyJicHIxIiwgMHgxLCAweGZmfSwKLSAgeyJwZjAiLCAweDQsIDB4ZmZ9LAotICB7InBmMSIsIDB4NSwgMHhmZn0sCi0gIHsic2MiLCAweDgsIDB4ZmZ9LAotICB7Im1zciIsIDB4YSwgMHhmZn0sCi0gIHsiYmNudCIsIDB4YiwgMHhmZn0sCi0gIHsicHRiMCIsIDB4YywgMHhmZn0sCi0gIHsicHRiMSIsIDB4ZCwgMHhmZn0sCi0gIHsiZWlhIiwgMHhmLCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci0KLSNpZiBkZWZpbmVkKE5TMzI1MzIpCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uICpjcHVyZWcgPSBjcHVyZWdfNTMyOwotc3RydWN0IG5zMzJrX29wdGlvbiAqbW11cmVnID0gbW11cmVnXzUzMjsKLSNlbHNlCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uICpjcHVyZWcgPSBjcHVyZWdfMDMyOwotc3RydWN0IG5zMzJrX29wdGlvbiAqbW11cmVnID0gbW11cmVnXzAzMjsKLSNlbmRpZgotDAotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewkJCQkJLyogc28gZmFyIGVtcHR5ICovCi0gIHswLCAwLCAwfQotfTsKLQotI2RlZmluZSBJTkQoeCx5KQkoKCh4KTw8MikrKHkpKQotCi0vKiB0aG9zZSBhcmUgaW5kZXgncyB0byByZWxheCBncm91cHMgaW4gbWRfcmVsYXhfdGFibGUgaWUgaXQgbXVzdCBiZQotICAgbXVsdGlwbGllZCBieSA0IHRvIHBvaW50IGF0IGEgZ3JvdXAgc3RhcnQuIFZpeiBJTkQoeCx5KSBTZSBmdW5jdGlvbgotICAgcmVsYXhfc2VnbWVudCBpbiB3cml0ZS5jIGZvciBtb3JlIGluZm8gKi8KLQotI2RlZmluZSBCUkFOQ0gJCTEKLSNkZWZpbmUgUENSRUwJCTIKLQotLyogdGhvc2UgYXJlIGluZGV4J3MgdG8gZW50cmllcyBpbiBhIHJlbGF4IGdyb3VwICovCi0KLSNkZWZpbmUgQllURQkJMAotI2RlZmluZSBXT1JECQkxCi0jZGVmaW5lIERPVUJMRQkJMgotI2RlZmluZSBVTkRFRiAgICAgICAgICAgMwotLyogVGhvc2UgbGltaXRzIGFyZSBjYWxjdWxhdGVkIGZyb20gdGhlIGRpc3BsYWNlbWVudCBzdGFydCBpbiBtZW1vcnkuCi0gICBUaGUgbnMzMmsgdXNlcyB0aGUgYmVnaW5pbmcgb2YgdGhlIGluc3RydWN0aW9uIGFzIGRpc3BsYWNlbWVudAotICAgYmFzZS4gIFRoaXMgdHlwZSBvZiBkaXNwbGFjZW1lbnRzIGNvdWxkIGJlIGhhbmRsZWQgaGVyZSBieSBtb3ZpbmcKLSAgIHRoZSBsaW1pdCB3aW5kb3cgdXAgb3IgZG93bi4gSSBjaG9vc2UgdG8gdXNlIGFuIGludGVybmFsCi0gICBkaXNwbGFjZW1lbnQgYmFzZS1hZGp1c3QgYXMgdGhlcmUgYXJlIG90aGVyIHJvdXRpbmVzIHRoYXQgbXVzdAotICAgY29uc2lkZXIgdGhpcy4gQWxzbywgYXMgd2UgaGF2ZSB0d28gdmFyaW91cyBvZmZzZXQtYWRqdXN0cyBpbiB0aGUKLSAgIG5zMzJrIChhY2IgdmVyc3VzIGJyL2Jycy9qc3IvYmNvbmQpLCB0d28gc2V0IG9mIGxpbWl0cyB3b3VsZCBoYXZlCi0gICBoYWQgdG8gYmUgdXNlZC4gIE5vdyB3ZSBkb250IGhhdmUgdG8gdGhpbmsgYWJvdXQgdGhhdC4gKi8KLQotCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLSAgezEsIDEsIDAsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLSAgezEsIDEsIDAsIDB9LAotCi0gIHsoNjMpLCAoLTY0KSwgMSwgSU5EIChCUkFOQ0gsIFdPUkQpfSwKLSAgeyg4MTkyKSwgKC04MTkyKSwgMiwgSU5EIChCUkFOQ0gsIERPVUJMRSl9LAotICB7MCwgMCwgNCwgMH0sCi0gIHsxLCAxLCAwLCAwfQotfTsKLQotLyogQXJyYXkgdXNlZCB0byB0ZXN0IGlmIG1vZGUgY29udGFpbnMgZGlzcGxhY2VtZW50cy4KLSAgIFZhbHVlIGlzIHRydWUgaWYgbW9kZSBjb250YWlucyBkaXNwbGFjZW1lbnQuICovCi0KLWNoYXIgZGlzcF90ZXN0W10gPQotezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAxLCAxLCAxLCAwLCAwLCAxLCAxLCAwLAotIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9OwotCi0vKiBBcnJheSB1c2VkIHRvIGNhbGN1bGF0ZSBtYXggc2l6ZSBvZiBkaXNwbGFjZW1lbnRzICovCi0KLWNoYXIgZGlzcF9zaXplW10gPQotezQsIDEsIDIsIDAsIDR9OwotDAotc3RhdGljIHZvaWQgZXZhbHVhdGVfZXhwciBQQVJBTVMgKChleHByZXNzaW9uUyAqIHJlc3VsdFAsIGNoYXIgKnB0cikpOwotc3RhdGljIHZvaWQgbWRfbnVtYmVyX3RvX2Rpc3AgUEFSQU1TICgoY2hhciAqYnVmLCBsb25nIHZhbCwgaW50IG4pKTsKLXN0YXRpYyB2b2lkIG1kX251bWJlcl90b19pbW0gUEFSQU1TICgoY2hhciAqYnVmLCBsb25nIHZhbCwgaW50IG4pKTsKLQotLyogUGFyc2VzIGEgZ2VuZXJhbCBvcGVyYW5kIGludG8gYW4gYWRkcmVzc2luZ21vZGUgc3RydWN0Ci0KLSAgIGluOiAgcG9pbnRlciBhdCBvcGVyYW5kIGluIGFzY2lpIGZvcm0KLSAgIHBvaW50ZXIgYXQgYWRkcl9tb2RlIHN0cnVjdCBmb3IgcmVzdWx0Ci0gICB0aGUgbGV2ZWwgb2YgcmVjdXJzaW9uLiAoYWx3YXlzIDAgb3IgMSkKLQotICAgb3V0OiBkYXRhIGluIGFkZHJfbW9kZSBzdHJ1Y3QKLSAgICovCi1pbnQKLWFkZHJfbW9kZSAob3BlcmFuZCwgYWRkcl9tb2RlUCwgcmVjdXJzaXZlX2xldmVsKQotICAgICBjaGFyICpvcGVyYW5kOwotICAgICByZWdpc3RlciBhZGRyX21vZGVTICphZGRyX21vZGVQOwotICAgICBpbnQgcmVjdXJzaXZlX2xldmVsOwotewotICByZWdpc3RlciBjaGFyICpzdHI7Ci0gIHJlZ2lzdGVyIGludCBpOwotICByZWdpc3RlciBpbnQgc3RybDsKLSAgcmVnaXN0ZXIgaW50IG1vZGU7Ci0gIGludCBqOwotICBtb2RlID0gREVGQVVMVDsJCS8qIGRlZmF1bHQgKi8KLSAgYWRkcl9tb2RlUC0+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+ZnJfb2Zmc2V0KSAtIG9iamVjdF9hZGRyZXNzOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZGlzcCArPSBmcmFnUC0+ZnJfc3ltYm9sLT5zeV9mcmFnLT5mcl9hZGRyZXNzOwotI2VuZGlmCi0gIGRpc3AgKz0gbWRfcGNyZWxfYWRqdXN0KGZyYWdQKTsKLQotICBtZF9udW1iZXJfdG9fZGlzcCAoYnVmZmVyX2FkZHJlc3MsIChsb25nKSBkaXNwLCAoaW50KSBleHQpOwotICBmcmFnUC0+ZnJfZml4ICs9IGV4dDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBlc3RpbWF0ZWQgc2l6ZSBhIHZhcmlhYmxlIG9iamVjdCB3aWxsIG9jY3VweSwKLSAgIG9uZSBjYW4gc2F5IHRoYXQgd2UgdHJpZXMgdG8gZ3Vlc3MgdGhlIHNpemUgb2YgdGhlIG9iamVjdHMgYmVmb3JlIHdlCi0gICBhY3R1YWxseSBrbm93IGl0ICovCi0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHNlZ1Qgc2VnbWVudDsKLXsKLSAgaW50IG9sZF9maXg7Ci0gIG9sZF9maXggPSBmcmFnUC0+ZnJfZml4OwotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIElORCAoQlJBTkNILCBVTkRFRik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudCkKLQl7Ci0JICAvKiB0aGUgc3ltYm9sIGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUgKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gSU5EIChCUkFOQ0gsIEJZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiB3ZSBkb24ndCByZWxheCBzeW1ib2xzIGRlZmluZWQgaW4gYW4gb3RoZXIgc2VnbWVudCB0aGUKLQkgICAgIHRoaW5nIHRvIGRvIGlzIHRvIGFzc3VtZSB0aGUgb2JqZWN0IHdpbGwgb2NjdXB5IDQgYnl0ZXMgKi8KLQkgIGZpeF9uZXdfbnMzMmsgKGZyYWdQLAotCQkJIChpbnQpIChmcmFnUC0+ZnJfZml4KSwKLQkJCSA0LAotCQkJIGZyYWdQLT5mcl9zeW1ib2wsCi0JCQkgZnJhZ1AtPmZyX29mZnNldCwKLQkJCSAxLAotCQkJIDEsCi0JCQkgMCwKLQkJCSBmcmFnX2JzcihmcmFnUCksIC8qc2VxdWVudCBoYWNrICovCi0JCQkgZnJhZ19vcGNvZGVfZnJhZyhmcmFnUCksCi0JCQkgZnJhZ19vcGNvZGVfb2Zmc2V0KGZyYWdQKSk7Ci0JICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JICAvKiBmcmFnUC0+ZnJfb3Bjb2RlWzFdPTB4ZmY7ICovCi0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQkgIGJyZWFrOwotCX0KLSAgICBjYXNlIElORCAoQlJBTkNILCBCWVRFKToKLSAgICAgIGZyYWdQLT5mcl92YXIgKz0gMTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9maXg7Ci19Ci0KLWludCBtZF9zaG9ydF9qdW1wX3NpemUgPSAzOwotaW50IG1kX2xvbmdfanVtcF9zaXplID0gNTsKLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gODsJLyogU2l6ZSBvZiByZWxvY2F0aW9uIHJlY29yZCAqLwotCi12b2lkCi1tZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIGZyb21fYWRkcjsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4RUEsIDEpOwotICBtZF9udW1iZXJfdG9fZGlzcCAocHRyICsgMSwgKHZhbHVlVCkgb2Zmc2V0LCAyKTsKLX0KLQotdm9pZAotbWRfY3JlYXRlX2xvbmdfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIGZyb21fYWRkcjsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4RUEsIDEpOwotICBtZF9udW1iZXJfdG9fZGlzcCAocHRyICsgMSwgKHZhbHVlVCkgb2Zmc2V0LCA0KTsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJtOiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnbSc6Ci0gICAgICBpZiAoIXN0cmNtcCAoYXJnLCAiMzIwMzIiKSkKLQl7Ci0JICBjcHVyZWcgPSBjcHVyZWdfMDMyOwotCSAgbW11cmVnID0gbW11cmVnXzAzMjsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChhcmcsICIzMjUzMiIpKQotCXsKLQkgIGNwdXJlZyA9IGNwdXJlZ181MzI7Ci0JICBtbXVyZWcgPSBtbXVyZWdfNTMyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlIG9wdGlvbiAtbSVzIiksIGFyZyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotTlMzMksgb3B0aW9uczpcblwKLS1tMzIwMzIgfCAtbTMyNTMyCXNlbGVjdCB2YXJpYW50IG9mIE5TMzJLIGFyY2hpdGVjdHVyZVxuIikpOwotfQotCi0MCi0vKgotICoJCQliaXRfZml4X25ldygpCi0gKgotICogQ3JlYXRlIGEgYml0X2ZpeFMgaW4gb2JzdGFjayAnbm90ZXMnLgotICogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwcm9maWxlIHRoZSBub3JtYWwgZml4LiBJZiB0aGUgYml0X2ZpeFAgaXMgYQotICogdmFsaWQgcG9pbnRlciAobm90IE5VTEwpIHRoZSBiaXRfZml4IGRhdGEgd2lsbCBiZSB1c2VkIHRvIGZvcm1hdCB0aGUgZml4LgotICovCi1iaXRfZml4UyAqCi1iaXRfZml4X25ldyAoc2l6ZSwgb2Zmc2V0LCBtaW4sIG1heCwgYWRkLCBiYXNlX3R5cGUsIGJhc2VfYWRqKQotICAgICBjaGFyIHNpemU7CQkJLyogTGVuZ3RoIG9mIGJpdGZpZWxkCQkqLwotICAgICBjaGFyIG9mZnNldDsJCS8qIEJpdCBvZmZzZXQgdG8gYml0ZmllbGQJKi8KLSAgICAgbG9uZyBtaW47CQkJLyogU2lnbmV4dGVuZGVkIG1pbiBmb3IgYml0ZmllbGQgKi8KLSAgICAgbG9uZyBtYXg7CQkJLyogU2lnbmV4dGVuZGVkIG1heCBmb3IgYml0ZmllbGQgKi8KLSAgICAgbG9uZyBhZGQ7CQkJLyogQWRkIG1hc2ssIHVzZWQgZm9yIGh1ZmZtYW4gcHJlZml4ICovCi0gICAgIGxvbmcgYmFzZV90eXBlOwkJLyogMCBvciAxLCBpZiAxIGl0J3MgZXhwbG9kZWQgdG8gb3Bjb2RlIHB0ciAqLwotICAgICBsb25nIGJhc2VfYWRqOwotewotICByZWdpc3RlciBiaXRfZml4UyAqYml0X2ZpeFA7Ci0KLSAgYml0X2ZpeFAgPSAoYml0X2ZpeFMgKikgb2JzdGFja19hbGxvYyAoJm5vdGVzLCBzaXplb2YgKGJpdF9maXhTKSk7Ci0KLSAgYml0X2ZpeFAtPmZ4X2JpdF9zaXplID0gc2l6ZTsKLSAgYml0X2ZpeFAtPmZ4X2JpdF9vZmZzZXQgPSBvZmZzZXQ7Ci0gIGJpdF9maXhQLT5meF9iaXRfYmFzZSA9IGJhc2VfdHlwZTsKLSAgYml0X2ZpeFAtPmZ4X2JpdF9iYXNlX2FkaiA9IGJhc2VfYWRqOwotICBiaXRfZml4UC0+ZnhfYml0X21heCA9IG1heDsKLSAgYml0X2ZpeFAtPmZ4X2JpdF9taW4gPSBtaW47Ci0gIGJpdF9maXhQLT5meF9iaXRfYWRkID0gYWRkOwotCi0gIHJldHVybiAoYml0X2ZpeFApOwotfQotCi12b2lkCi1maXhfbmV3X25zMzJrIChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwgb2Zmc2V0LCBwY3JlbCwKLQkgICAgICAgaW1fZGlzcCwgYml0X2ZpeFAsIGJzciwgb3Bjb2RlX2ZyYWcsIG9wY29kZV9vZmZzZXQpCi0gICAgIGZyYWdTICpmcmFnOwkJLyogV2hpY2ggZnJhZz8gKi8KLSAgICAgaW50IHdoZXJlOwkJCS8qIFdoZXJlIGluIHRoYXQgZnJhZz8gKi8KLSAgICAgaW50IHNpemU7CQkJLyogMSwgMiAgb3IgNCB1c3VhbGx5LiAqLwotICAgICBzeW1ib2xTICphZGRfc3ltYm9sOwkvKiBYX2FkZF9zeW1ib2wuICovCi0gICAgIGxvbmcgb2Zmc2V0OwkJLyogWF9hZGRfbnVtYmVyLiAqLwotICAgICBpbnQgcGNyZWw7CQkJLyogVFJVRSBpZiBQQy1yZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotICAgICBjaGFyIGltX2Rpc3A7CQkvKiB0cnVlIGlmIHRoZSB2YWx1ZSB0byB3cml0ZSBpcyBhCi0JCQkJICAgZGlzcGxhY2VtZW50ICovCi0gICAgIGJpdF9maXhTICpiaXRfZml4UDsJLyogcG9pbnRlciBhdCBzdHJ1Y3Qgb2YgYml0X2ZpeCdzLCBpZ25vcmVkIGlmCi0JCQkJICAgTlVMTCAqLwotICAgICBjaGFyIGJzcjsJCQkvKiBzZXF1ZW50LWxpbmtlci1oYWNrOiAxIHdoZW4gcmVsb2NvYmplY3QgaXMKLQkJCQkgICBhIGJzciAqLwotICAgICBmcmFnUyAqb3Bjb2RlX2ZyYWc7Ci0gICAgIHVuc2lnbmVkIGludCBvcGNvZGVfb2Zmc2V0OwotCi17Ci0gIGZpeFMgKmZpeFAgPSBmaXhfbmV3IChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwKLQkJCW9mZnNldCwgcGNyZWwsCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCQkJYml0X2ZpeFA/IE5PX1JFTE9DOiByZWxvYyhzaXplLCBwY3JlbCwgaW1fZGlzcCkKLSNlbHNlCi0JCQlOT19SRUxPQwotI2VuZGlmCi0JCQkpOwotCi0gIGZpeF9vcGNvZGVfZnJhZyhmaXhQKSA9IG9wY29kZV9mcmFnOwotICBmaXhfb3Bjb2RlX29mZnNldChmaXhQKSA9IG9wY29kZV9vZmZzZXQ7Ci0gIGZpeF9pbV9kaXNwKGZpeFApID0gaW1fZGlzcDsKLSAgZml4X2JzcihmaXhQKSA9IGJzcjsKLSAgZml4X2JpdF9maXhQKGZpeFApID0gYml0X2ZpeFA7Ci19CQkJCS8qIGZpeF9uZXdfbnMzMmsoKSAqLwotCi12b2lkCi1maXhfbmV3X25zMzJrX2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNyZWwsCi0JCSAgIGltX2Rpc3AsIGJpdF9maXhQLCBic3IsIG9wY29kZV9mcmFnLCBvcGNvZGVfb2Zmc2V0KQotICAgICBmcmFnUyAqZnJhZzsJCS8qIFdoaWNoIGZyYWc/ICovCi0gICAgIGludCB3aGVyZTsJCQkvKiBXaGVyZSBpbiB0aGF0IGZyYWc/ICovCi0gICAgIGludCBzaXplOwkJCS8qIDEsIDIgIG9yIDQgdXN1YWxseS4gKi8KLSAgICAgZXhwcmVzc2lvblMgKmV4cDsJCS8qIEV4cHJlc3Npb24uICovCi0gICAgIGludCBwY3JlbDsJCQkvKiBUUlVFIGlmIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0gICAgIGNoYXIgaW1fZGlzcDsJCS8qIHRydWUgaWYgdGhlIHZhbHVlIHRvIHdyaXRlIGlzIGEKLQkJCQkgICBkaXNwbGFjZW1lbnQgKi8KLSAgICAgYml0X2ZpeFMgKmJpdF9maXhQOwkvKiBwb2ludGVyIGF0IHN0cnVjdCBvZiBiaXRfZml4J3MsIGlnbm9yZWQgaWYKLQkJCQkgICBOVUxMICovCi0gICAgIGNoYXIgYnNyOwkJCS8qIHNlcXVlbnQtbGlua2VyLWhhY2s6IDEgd2hlbiByZWxvY29iamVjdCBpcwotCQkJCSAgIGEgYnNyICovCi0gICAgIGZyYWdTICpvcGNvZGVfZnJhZzsKLSAgICAgdW5zaWduZWQgaW50IG9wY29kZV9vZmZzZXQ7Ci17Ci0gIGZpeFMgKmZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNyZWwsCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCQkJICAgIGJpdF9maXhQPyBOT19SRUxPQzogcmVsb2Moc2l6ZSwgcGNyZWwsIGltX2Rpc3ApCi0jZWxzZQotCQkJICAgIE5PX1JFTE9DCi0jZW5kaWYKLQkJCSAgICApOwotCi0gIGZpeF9vcGNvZGVfZnJhZyhmaXhQKSA9IG9wY29kZV9mcmFnOwotICBmaXhfb3Bjb2RlX29mZnNldChmaXhQKSA9IG9wY29kZV9vZmZzZXQ7Ci0gIGZpeF9pbV9kaXNwKGZpeFApID0gaW1fZGlzcDsKLSAgZml4X2JzcihmaXhQKSA9IGJzcjsKLSAgZml4X2JpdF9maXhQKGZpeFApID0gYml0X2ZpeFA7Ci19CQkJCS8qIGZpeF9uZXdfbnMzMmsoKSAqLwotCi0vKiBUaGlzIGlzIFRDX0NPTlNfRklYX05FVywgY2FsbGVkIGJ5IGVtaXRfZXhwciBpbiByZWFkLmMuICAqLwotCi12b2lkCi1jb25zX2ZpeF9uZXdfbnMzMmsgKGZyYWcsIHdoZXJlLCBzaXplLCBleHApCi0gICAgIGZyYWdTICpmcmFnOwkJLyogV2hpY2ggZnJhZz8gKi8KLSAgICAgaW50IHdoZXJlOwkJCS8qIFdoZXJlIGluIHRoYXQgZnJhZz8gKi8KLSAgICAgaW50IHNpemU7CQkJLyogMSwgMiAgb3IgNCB1c3VhbGx5LiAqLwotICAgICBleHByZXNzaW9uUyAqZXhwOwkJLyogRXhwcmVzc2lvbi4gKi8KLXsKLSAgZml4X25ld19uczMya19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsCi0JCSAgICAgMCwgMiwgMCwgMCwgMCwgMCk7Ci19Ci0KLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgcmV0dXJuIHNpemU7CQkJLyogQnl0ZSBhbGlnbm1lbnQgaXMgZmluZSAqLwotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/ICBPbiB0aGUKLSAgIG5zMzJrLCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICovCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBsb25nIHJlczsKLSAgcmVzID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotI2lmZGVmIFNFUVVFTlRfQ09NUEFUQUJJTElUWQotICBpZiAoZnJhZ19ic3IoZml4UC0+ZnhfZnJhZykpCi0gICAgcmVzICs9IDB4MTIJCQkvKiBGT08gS2x1ZGdlIGFsZXJ0ISAqLwotI2VuZGlmCi0gICAgICByZXR1cm4gcmVzOwotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0KLSAgY29kZSA9IHJlbG9jKGZpeHAtPmZ4X3NpemUsIGZpeHAtPmZ4X3BjcmVsLCBmaXhfaW1fZGlzcChmaXhwKSk7Ci0KLSAgcmVsID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbC0+c3ltX3B0cl9wdHIgPSAmZml4cC0+ZnhfYWRkc3ktPmJzeW07Ci0gIHJlbC0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIHJlbC0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlCi0gICAgcmVsLT5hZGRlbmQgPSAwOwotCi0gIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgY29kZSk7Ci0gIGlmICghcmVsLT5ob3d0bykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICBuYW1lID0gU19HRVRfTkFNRSAoZml4cC0+ZnhfYWRkc3kpOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQluYW1lID0gXygiPHVua25vd24+Iik7Ci0gICAgICBhc19mYXRhbCAoXygiQ2Fubm90IGZpbmQgcmVsb2NhdGlvbiB0eXBlIGZvciBzeW1ib2wgJXMsIGNvZGUgJWQiKSwKLQkJbmFtZSwgKGludCkgY29kZSk7Ci0gICAgfQotCi0gIHJldHVybiByZWw7Ci19Ci0jZWxzZSAvKiBCRkRfQVNTRU1CTEVSICovCi0KLSNpZmRlZiBPQkpfQU9VVAotdm9pZAotY29uc19maXhfbmV3X25zMzJrICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBzdHJ1Y3QgZml4ICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgLyoKLSAgICogSW46IGxlbmd0aCBvZiByZWxvY2F0aW9uIChvciBvZiBhZGRyZXNzKSBpbiBjaGFyczogMSwgMiBvciA0LgotICAgKiBPdXQ6IEdOVSBMRCByZWxvY2F0aW9uIGxlbmd0aCBjb2RlOiAwLCAxLCBvciAyLgotICAgKi8KLQotICBzdGF0aWMgdW5zaWduZWQgY2hhciBuYnl0ZXNfcl9sZW5ndGhbXSA9IHs0MiwgMCwgMSwgNDIsIDJ9OwotICBsb25nIHJfc3ltYm9sbnVtOwotCi0gIGtub3cgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwpOwotCi0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsCi0gICAgICAgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUsCi0JCSAgICAgIDQpOwotCi0gIHJfc3ltYm9sbnVtID0gKFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JCSA/IFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KQotCQkgOiBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyKTsKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlICsgNCwKLQkJICAgICAgKChsb25nKSAocl9zeW1ib2xudW0pCi0JCSAgICAgICB8IChsb25nKSAoZml4UC0+ZnhfcGNyZWwgPDwgMjQpCi0JCSAgICAgICB8IChsb25nKSAobmJ5dGVzX3JfbGVuZ3RoW2ZpeFAtPmZ4X3NpemVdIDw8IDI1KQotCQkgICAgICAgfCAobG9uZykgKCghU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpIDw8IDI3KQotCQkgICAgICAgfCAobG9uZykgKGZpeF9ic3IoZml4UCkgPDwgMjgpCi0JCSAgICAgICB8IChsb25nKSAoZml4X2ltX2Rpc3AoZml4UCkgPDwgMjkpKSwKLQkJICAgICAgNCk7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfQU9VVCAqLwotI2VuZGlmIC8qIEJGRF9BU1NNRUJMRVIgKi8KLQotLyogZW5kIG9mIHRjLW5zMzJrLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbnMzMmsuaCBiL2dhcy9jb25maWcvdGMtbnMzMmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIwMzhlYi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW5zMzJrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyogdGMtbnMzMmsuaCAtLSBPcGNvZGUgdGFibGUgZm9yIE5hdGlvbmFsIFNlbWkgMzJrIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19OUzMySwotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCTAKLQotI2RlZmluZSBUQ19QQ1JFTF9BREpVU1QoRikgbWRfcGNyZWxfYWRqdXN0KEYpCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIE5PX1JFTE9DIEJGRF9SRUxPQ19OT05FCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0gJCWJmZF9hcmNoX25zMzJrCi0KLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAkJLyogTWF5YmUgZGVmaW5lZCBpbiB0ZS0qLmggKi8KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LXBjNTMyLW1hY2giCi0jZW5kaWYKLSNlbHNlCi0jZGVmaW5lIE5PX1JFTE9DIDAKLSNlbmRpZgotCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNpbmNsdWRlICJiaXRfZml4LmgiCi0KLSNkZWZpbmUgdGNfYW91dF9wcmVfd3JpdGVfaG9vayh4KQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfY3Jhd2xfc3ltYm9sX2NoYWluKGEpCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soYSkJCXs7fQkvKiBub3QgdXNlZCAqLwotCi0jaWZkZWYgU0VRVUVOVF9DT01QQVRBQklMSVRZCi0jZGVmaW5lIERFRl9NT0RFQyAyMAotI2RlZmluZSBERUZfTU9ERUwgMjEKLSNlbmRpZgotCi0jaWZuZGVmIERFRl9NT0RFQwotI2RlZmluZSBERUZfTU9ERUMgMjAKLSNlbmRpZgotCi0jaWZuZGVmIERFRl9NT0RFTAotI2RlZmluZSBERUZfTU9ERUwgMjAKLSNlbmRpZgotCi0jZGVmaW5lIE1BWF9BUkdTIDQKLSNkZWZpbmUgQVJHX0xFTiA1MAotCi0jZGVmaW5lIFRDX0NPTlNfRklYX05FVyBjb25zX2ZpeF9uZXdfbnMzMmsKLWV4dGVybiB2b2lkIGZpeF9uZXdfbnMzMmtfZXhwIFBBUkFNUygoZnJhZ1MgKmZyYWcsCi0JCQkJICAgaW50IHdoZXJlLAotCQkJCSAgIGludCBzaXplLAotCQkJCSAgIGV4cHJlc3Npb25TICpleHAsCi0JCQkJICAgaW50IHBjcmVsLAotCQkJCSAgIGludCBpbV9kaXNwLAotCQkJCSAgIGJpdF9maXhTICpiaXRfZml4UCwJLyogcmVhbGx5IGJpdF9maXhTICovCi0JCQkJICAgaW50IGJzciwKLQkJCQkgICBmcmFnUyAqb3Bjb2RlX2ZyYWcsCi0JCQkJICAgdW5zaWduZWQgaW50IG9wY29kZV9vZmZzZXQpKTsKLQotCi1leHRlcm4gdm9pZCBmaXhfbmV3X25zMzJrIFBBUkFNUyAoKGZyYWdTICpmcmFnLAotCQkJCSAgIGludCB3aGVyZSwKLQkJCQkgICBpbnQgc2l6ZSwKLQkJCQkgICBzdHJ1Y3Qgc3ltYm9sICphZGRfc3ltYm9sLAotCQkJCSAgIGxvbmcgb2Zmc2V0LAotCQkJCSAgIGludCBwY3JlbCwKLQkJCQkgICBpbnQgaW1fZGlzcCwKLQkJCQkgICBiaXRfZml4UyAqYml0X2ZpeFAsCS8qIHJlYWxseSBiaXRfZml4UyAqLwotCQkJCSAgIGludCBic3IsCi0JCQkJICAgZnJhZ1MgKm9wY29kZV9mcmFnLAotCQkJCSAgIHVuc2lnbmVkIGludCBvcGNvZGVfb2Zmc2V0KSk7Ci0KLWV4dGVybiB2b2lkIGNvbnNfZml4X25ld19uczMyayBQQVJBTVMgKChmcmFnUyAqZnJhZywKLQkJCQkJaW50IHdoZXJlLAotCQkJCQlpbnQgc2l6ZSwKLQkJCQkJZXhwcmVzc2lvblMgKmV4cCkpOwotCi0vKiB0aGUgTlMzMngzMiBoYXMgYSBub24gMCBub3AgaW5zdHJ1Y3Rpb24gd2hpY2ggc2hvdWxkIGJlIHVzZWQgaW4gYWxpZ25zICovCi0jZGVmaW5lIE5PUF9PUENPREUgMHhhMgotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotI2RlZmluZSBUQ19GUkFHX1RZUEUJCQkJXAotc3RydWN0IHsJCQkJCVwKLSAgZnJhZ1MgKmZyX29wY29kZV9mcmFnUDsJCQlcCi0gIHVuc2lnbmVkIGludCBmcl9vcGNvZGVfb2Zmc2V0OwkJXAotICBjaGFyIGZyX2JzcjsJCQkJCVwKLX0KLQotI2RlZmluZSBUQ19GUkFHX0lOSVQoWCkJCQkJXAotICBkbwkJCQkJCVwKLSAgICAgewkJCQkJCVwKLSAgICAgICBmcmFnX29wY29kZV9mcmFnIChYKSA9IE5VTEw7CQlcCi0gICAgICAgZnJhZ19vcGNvZGVfb2Zmc2V0IChYKSA9IDA7CQlcCi0gICAgICAgZnJhZ19ic3IgKFgpID0gMDsJCQkJXAotICAgICB9CQkJCQkJXAotICB3aGlsZSgwKQotCi0vKiBBY2Nlc3NvciBtYWNyb3MgZm9yIHRoaW5ncyB3aGljaCBtYXkgbW92ZSBhcm91bmQgKi8KLSNkZWZpbmUgZnJhZ19vcGNvZGVfZnJhZyhYKSAgIChYKS0+dGNfZnJhZ19kYXRhLmZyX29wY29kZV9mcmFnUAotI2RlZmluZSBmcmFnX29wY29kZV9vZmZzZXQoWCkgKFgpLT50Y19mcmFnX2RhdGEuZnJfb3Bjb2RlX29mZnNldAotI2RlZmluZSBmcmFnX2JzcihYKSAgICAgICAgICAgKFgpLT50Y19mcmFnX2RhdGEuZnJfYnNyCi0KLSNkZWZpbmUgVENfRklYX1RZUEUJCQkJXAotc3RydWN0CQkJCQkJXAotewkJCQkJCVwKLSAgZnJhZ1MgKm9wY29kZV9mcmFnUDsJCQkJXAotICB1bnNpZ25lZCBpbnQgb3Bjb2RlX29mZnNldDsJCQlcCi0gIHVuc2lnbmVkIGludCBic3IgOiAxOwkJCQlcCi19Ci0KLS8qIEFjY2Vzc29yIG1hY3JvcyBmb3IgdGhpbmdzIHdoaWNoIG1heSBtb3ZlIGFyb3VuZC4KLSAgIFNlZSBjb21tZW50cyBpbiB3cml0ZS5oLiAgKi8KLSNkZWZpbmUgZml4X2ltX2Rpc3AoWCkgICAgICAgKFgpLT5meF9pbV9kaXNwCi0jZGVmaW5lIGZpeF9iaXRfZml4UChYKSAgICAgIChYKS0+ZnhfYml0X2ZpeFAKLSNkZWZpbmUgZml4X29wY29kZV9mcmFnKFgpICAgKFgpLT50Y19maXhfZGF0YS5vcGNvZGVfZnJhZ1AKLSNkZWZpbmUgZml4X29wY29kZV9vZmZzZXQoWCkgKFgpLT50Y19maXhfZGF0YS5vcGNvZGVfb2Zmc2V0Ci0jZGVmaW5lIGZpeF9ic3IoWCkgICAgICAgICAgIChYKS0+dGNfZml4X2RhdGEuYnNyCi0KLSNkZWZpbmUgVENfSU5JVF9GSVhfREFUQShYKQkJCVwKLSAgZG8JCQkJCQlcCi0gICAgIHsJCQkJCQlcCi0gICAgICAgZml4X29wY29kZV9mcmFnKFgpID0gTlVMTDsJCVwKLSAgICAgICBmaXhfb3Bjb2RlX29mZnNldChYKSA9IDA7CQlcCi0gICAgICAgZml4X2JzcihYKSA9IDA7CQkJCVwKLSAgICAgfQkJCQkJCVwKLSAgd2hpbGUoMCkKLQotI2RlZmluZSBUQ19GSVhfREFUQV9QUklOVChGSUxFLCBGSVhQKQkJCQkJXAotICBkbwkJCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgZnByaW50ZigoRklMRSksICJvcGNvZGVfZnJhZz0lbGQsIG9wZXJhbmQgb2Zmc2V0PSVkLCBic3I9JWRcbiIsCVwKLQkgICAgICAodW5zaWduZWQgbG9uZykgZml4X29wY29kZV9mcmFnIChGSVhQKSwJCQlcCi0JICAgICAgZml4X29wY29kZV9vZmZzZXQgKEZJWFApLAkJCQkJXAotCSAgICAgIGZpeF9ic3IgKEZJWFApKTsJCQkJCQlcCi0gICAgfQkJCQkJCQkJCVwKLSAgd2hpbGUoMCkKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtcHBjLmMgYi9nYXMvY29uZmlnL3RjLXBwYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjcwY2ViLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtcHBjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDA5ICswLDAgQEAKLS8qIHRjLXBwYy5jIC0tIEFzc2VtYmxlIGZvciB0aGUgUG93ZXJQQyBvciBQT1dFUiAoUlMvNjAwMCkKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2luY2x1ZGUgIm9wY29kZS9wcGMuaCIKLQotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJlbGYvcHBjLmgiCi0jZW5kaWYKLQotI2lmZGVmIFRFX1BFCi0jaW5jbHVkZSAiY29mZi9wZS5oIgotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdGhlIGFzc2VtYmxlciBmb3IgdGhlIFBvd2VyUEMgb3IgUE9XRVIgKFJTLzYwMDApIGNoaXBzLiAgKi8KLQotLyogVGVsbCB0aGUgbWFpbiBjb2RlIHdoYXQgdGhlIGVuZGlhbm5lc3MgaXMuICAqLwotZXh0ZXJuIGludCB0YXJnZXRfYmlnX2VuZGlhbjsKLQotLyogV2hldGhlciBvciBub3QsIHdlJ3ZlIHNldCB0YXJnZXRfYmlnX2VuZGlhbi4gICovCi1zdGF0aWMgaW50IHNldF90YXJnZXRfZW5kaWFuID0gMDsKLQotLyogV2hldGhlciB0byB1c2UgdXNlciBmcmllbmRseSByZWdpc3RlciBuYW1lcy4gICovCi0jaWZuZGVmIFRBUkdFVF9SRUdfTkFNRVNfUAotI2lmZGVmIFRFX1BFCi0jZGVmaW5lIFRBUkdFVF9SRUdfTkFNRVNfUCB0cnVlCi0jZWxzZQotI2RlZmluZSBUQVJHRVRfUkVHX05BTUVTX1AgZmFsc2UKLSNlbmRpZgotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIHJlZ19uYW1lc19wID0gVEFSR0VUX1JFR19OQU1FU19QOwotCi1zdGF0aWMgYm9vbGVhbiByZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyB2b2lkIHBwY19zZXRfY3B1IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBwY19pbnNlcnRfb3BlcmFuZAotICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc24sIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgKm9wZXJhbmQsCi0JICAgb2Zmc2V0VCB2YWwsIGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lKSk7Ci1zdGF0aWMgdm9pZCBwcGNfbWFjcm8gUEFSQU1TICgoY2hhciAqc3RyLCBjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyAqbWFjcm8pKTsKLXN0YXRpYyB2b2lkIHBwY19ieXRlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGludCBwcGNfaXNfdG9jX3N5bSBQQVJBTVMgKChzeW1ib2xTICpzeW0pKTsKLXN0YXRpYyB2b2lkIHBwY190YyBQQVJBTVMgKChpbnQpKTsKLQotI2lmZGVmIE9CSl9YQ09GRgotc3RhdGljIHZvaWQgcHBjX2NvbW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfYmIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfYmMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfYmYgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfYmllaSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19icyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lYiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lYyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lcyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19jc2VjdCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19jaGFuZ2VfY3NlY3QgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1zdGF0aWMgdm9pZCBwcGNfZnVuY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZXh0ZXJuIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2xnbG9ibCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX25hbWVkX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfc3RhYnggUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcmVuYW1lIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3RvYyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY194Y29mZl9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3ZieXRlIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHBwY19lbGZfc3VmZml4IFBBUkFNUyAoKGNoYXIgKiosIGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyB2b2lkIHBwY19lbGZfY29ucyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lbGZfcmRhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZWxmX2xjb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2VsZl92YWxpZGF0ZV9maXggUEFSQU1TICgoZml4UyAqLCBzZWdUKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFRFX1BFCi1zdGF0aWMgdm9pZCBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbiBQQVJBTVMgKChzZWdUKSk7Ci1zdGF0aWMgdm9pZCBwcGNfcHJldmlvdXMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcGRhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfeWRhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcmVsZGF0YSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19yZGF0YSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY191YWxvbmcgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfem5vcCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19wZV9jb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3BlX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcGVfZnVuY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcGVfdG9jZCBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotDAotLyogR2VuZXJpYyBhc3NlbWJsZXIgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBtdXN0IGJlIGRlZmluZWQgYnkgYWxsCi0gICB0YXJnZXRzLiAgKi8KLQotI2lmZGVmIE9CSl9FTEYKLS8qIFRoaXMgc3RyaW5nIGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bC4gIFRoZSBtYWNybwotICAgdGNfY29tbWVudF9jaGFycyBwb2ludHMgdG8gdGhpcy4gIFdlIHVzZSB0aGlzLCByYXRoZXIgdGhhbiB0aGUKLSAgIHVzdWFsIGNvbW1lbnRfY2hhcnMsIHNvIHRoYXQgd2UgY2FuIHN3aXRjaCBmb3IgU29sYXJpcyBjb252ZW50aW9ucy4gICovCi1zdGF0aWMgY29uc3QgY2hhciBwcGNfc29sYXJpc19jb21tZW50X2NoYXJzW10gPSAiIyEiOwotc3RhdGljIGNvbnN0IGNoYXIgcHBjX2VhYmlfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0jaWZkZWYgVEFSR0VUX1NPTEFSSVNfQ09NTUVOVAotY29uc3QgY2hhciAqcHBjX2NvbW1lbnRfY2hhcnMgPSBwcGNfc29sYXJpc19jb21tZW50X2NoYXJzOwotI2Vsc2UKLWNvbnN0IGNoYXIgKnBwY19jb21tZW50X2NoYXJzID0gcHBjX2VhYmlfY29tbWVudF9jaGFyczsKLSNlbmRpZgotI2Vsc2UKLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotI2VuZGlmCi0KLS8qIENoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHVzZWQgdG8gc2VwYXJhdGUgbXVsdGlwbGUgY29tbWFuZHMgb24gYQotICAgc2luZ2xlIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFyZSB1c2VkIHRvIGluZGljYXRlIGFuIGV4cG9uZW50IGluIGEgZmxvYXRpbmcKLSAgIHBvaW50IG51bWJlci4gICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtZWFuIHRoYXQgYSBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwKLSAgIGFzIGluIDBkMS4wLiAgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZEQiOwotDAotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICAvKiBQc2V1ZG8tb3BzIHdoaWNoIG11c3QgYmUgb3ZlcnJpZGRlbi4gICovCi0gIHsgImJ5dGUiLAlwcGNfYnl0ZSwJMCB9LAotCi0jaWZkZWYgT0JKX1hDT0ZGCi0gIC8qIFBzZXVkby1vcHMgc3BlY2lmaWMgdG8gdGhlIFJTLzYwMDAgWENPRkYgZm9ybWF0LiAgU29tZSBvZiB0aGVzZQotICAgICBsZWdpdGltYXRlbHkgYmVsb25nIGluIHRoZSBvYmotKi5jIGZpbGUuICBIb3dldmVyLCBYQ09GRiBpcyBiYXNlZAotICAgICBvbiBDT0ZGLCBhbmQgaXMgb25seSBpbXBsZW1lbnRlZCBmb3IgdGhlIFJTLzYwMDAuICBXZSBqdXN0IHVzZQotICAgICBvYmotY29mZi5jLCBhbmQgYWRkIHdoYXQgd2UgbmVlZCBoZXJlLiAgKi8KLSAgeyAiY29tbSIsCXBwY19jb21tLAkwIH0sCi0gIHsgImxjb21tIiwJcHBjX2NvbW0sCTEgfSwKLSAgeyAiYmIiLAlwcGNfYmIsCQkwIH0sCi0gIHsgImJjIiwJcHBjX2JjLAkJMCB9LAotICB7ICJiZiIsCXBwY19iZiwJCTAgfSwKLSAgeyAiYmkiLAlwcGNfYmllaSwJMCB9LAotICB7ICJicyIsCXBwY19icywJCTAgfSwKLSAgeyAiY3NlY3QiLAlwcGNfY3NlY3QsCTAgfSwKLSAgeyAiZGF0YSIsCXBwY19zZWN0aW9uLAknZCcgfSwKLSAgeyAiZWIiLAlwcGNfZWIsCQkwIH0sCi0gIHsgImVjIiwJcHBjX2VjLAkJMCB9LAotICB7ICJlZiIsCXBwY19lZiwJCTAgfSwKLSAgeyAiZWkiLAlwcGNfYmllaSwJMSB9LAotICB7ICJlcyIsCXBwY19lcywJCTAgfSwKLSAgeyAiZXh0ZXJuIiwJcHBjX2V4dGVybiwJMCB9LAotICB7ICJmdW5jdGlvbiIsCXBwY19mdW5jdGlvbiwJMCB9LAotICB7ICJsZ2xvYmwiLAlwcGNfbGdsb2JsLAkwIH0sCi0gIHsgInJlbmFtZSIsCXBwY19yZW5hbWUsCTAgfSwKLSAgeyAic2VjdGlvbiIsCXBwY19uYW1lZF9zZWN0aW9uLCAwIH0sCi0gIHsgInN0YWJ4IiwJcHBjX3N0YWJ4LAkwIH0sCi0gIHsgInRleHQiLAlwcGNfc2VjdGlvbiwJJ3QnIH0sCi0gIHsgInRvYyIsCXBwY190b2MsCTAgfSwKLSAgeyAibG9uZyIsCXBwY194Y29mZl9jb25zLAkyIH0sCi0gIHsgIndvcmQiLAlwcGNfeGNvZmZfY29ucywJMSB9LAotICB7ICJzaG9ydCIsCXBwY194Y29mZl9jb25zLAkxIH0sCi0gIHsgInZieXRlIiwgICAgcHBjX3ZieXRlLAkwIH0sCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSAgeyAibG9uZyIsCXBwY19lbGZfY29ucywJNCB9LAotICB7ICJ3b3JkIiwJcHBjX2VsZl9jb25zLAkyIH0sCi0gIHsgInNob3J0IiwJcHBjX2VsZl9jb25zLAkyIH0sCi0gIHsgInJkYXRhIiwJcHBjX2VsZl9yZGF0YSwJMCB9LAotICB7ICJyb2RhdGEiLAlwcGNfZWxmX3JkYXRhLAkwIH0sCi0gIHsgImxjb21tIiwJcHBjX2VsZl9sY29tbSwJMCB9LAotI2VuZGlmCi0KLSNpZmRlZiBURV9QRQotICAvKiBQc2V1ZG8tb3BzIHNwZWNpZmljIHRvIHRoZSBXaW5kb3dzIE5UIFBvd2VyUEMgUEUgKGNvZmYpIGZvcm1hdCAqLwotICB7ICJwcmV2aW91cyIsIHBwY19wcmV2aW91cywgICAwIH0sCi0gIHsgInBkYXRhIiwgICAgcHBjX3BkYXRhLCAgICAgIDAgfSwKLSAgeyAieWRhdGEiLCAgICBwcGNfeWRhdGEsICAgICAgMCB9LAotICB7ICJyZWxkYXRhIiwgIHBwY19yZWxkYXRhLCAgICAwIH0sCi0gIHsgInJkYXRhIiwgICAgcHBjX3JkYXRhLCAgICAgIDAgfSwKLSAgeyAidWFsb25nIiwgICBwcGNfdWFsb25nLCAgICAgMCB9LAotICB7ICJ6bm9wIiwgICAgIHBwY196bm9wLCAgICAgICAwIH0sCi0gIHsgImNvbW0iLAlwcGNfcGVfY29tbSwJMCB9LAotICB7ICJsY29tbSIsCXBwY19wZV9jb21tLAkxIH0sCi0gIHsgInNlY3Rpb24iLCAgcHBjX3BlX3NlY3Rpb24sIDAgfSwKLSAgeyAiZnVuY3Rpb24iLAlwcGNfcGVfZnVuY3Rpb24sMCB9LAotICB7ICJ0b2NkIiwgICAgIHBwY19wZV90b2NkLCAgICAwIH0sCi0jZW5kaWYKLQotICAvKiBUaGlzIHBzZXVkby1vcCBpcyB1c2VkIGV2ZW4gd2hlbiBub3QgZ2VuZXJhdGluZyBYQ09GRiBvdXRwdXQuICAqLwotICB7ICJ0YyIsCXBwY190YywJCTAgfSwKLQotICB7IE5VTEwsCU5VTEwsCQkwIH0KLX07Ci0KLQwKLS8qIFByZWRlZmluZWQgcmVnaXN0ZXIgbmFtZXMgaWYgLW1yZWduYW1lcyAob3IgZGVmYXVsdCBmb3IgV2luZG93cyBOVCkuICAqLwotLyogSW4gZ2VuZXJhbCwgdGhlcmUgYXJlIGxvdHMgb2YgdGhlbSwgaW4gYW4gYXR0ZW1wdCB0byBiZSBjb21wYXRpYmxlICovCi0vKiB3aXRoIGEgbnVtYmVyIG9mIG90aGVyIFdpbmRvd3MgTlQgYXNzZW1ibGVycy4gICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLwotc3RydWN0IHBkX3JlZwotICB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgdmFsdWU7Ci0gIH07Ci0KLS8qIExpc3Qgb2YgcmVnaXN0ZXJzIHRoYXQgYXJlIHByZS1kZWZpbmVkOgotCi0gICBFYWNoIGdlbmVyYWwgcmVnaXN0ZXIgaGFzIHByZWRlZmluZWQgbmFtZXMgb2YgdGhlIGZvcm06Ci0gICAxLiByPHJlZ19udW0+IHdoaWNoIGhhcyB0aGUgdmFsdWUgPHJlZ19udW0+LgotICAgMi4gci48cmVnX251bT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8cmVnX251bT4uCi0KLQotICAgRWFjaCBmbG9hdGluZyBwb2ludCByZWdpc3RlciBoYXMgcHJlZGVmaW5lZCBuYW1lcyBvZiB0aGUgZm9ybToKLSAgIDEuIGY8cmVnX251bT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8cmVnX251bT4uCi0gICAyLiBmLjxyZWdfbnVtPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxyZWdfbnVtPi4KLQotICAgRWFjaCBjb25kaXRpb24gcmVnaXN0ZXIgaGFzIHByZWRlZmluZWQgbmFtZXMgb2YgdGhlIGZvcm06Ci0gICAxLiBjcjxyZWdfbnVtPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxyZWdfbnVtPi4KLSAgIDIuIGNyLjxyZWdfbnVtPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxyZWdfbnVtPi4KLQotICAgVGhlcmUgYXJlIGluZGl2aWR1YWwgcmVnaXN0ZXJzIGFzIHdlbGw6Ci0gICBzcCBvciByLnNwICAgICBoYXMgdGhlIHZhbHVlIDEKLSAgIHJ0b2Mgb3Igci50b2MgIGhhcyB0aGUgdmFsdWUgMgotICAgZnBzY3IgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAwCi0gICB4ZXIgICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDEKLSAgIGxyICAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgOAotICAgY3RyICAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSA5Ci0gICBwbXIgICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDAKLSAgIGRhciAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMTkKLSAgIGRzaXNyICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMTgKLSAgIGRlYyAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMjIKLSAgIHNkcjEgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMjUKLSAgIHNycjAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMjYKLSAgIHNycjEgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMjcKLQotICAgVGhlIHRhYmxlIGlzIHNvcnRlZC4gU3VpdGFibGUgZm9yIHNlYXJjaGluZyBieSBhIGJpbmFyeSBzZWFyY2guICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGRfcmVnIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiY3IuMCIsIDAgfSwgICAgLyogQ29uZGl0aW9uIFJlZ2lzdGVycyAqLwotICB7ICJjci4xIiwgMSB9LAotICB7ICJjci4yIiwgMiB9LAotICB7ICJjci4zIiwgMyB9LAotICB7ICJjci40IiwgNCB9LAotICB7ICJjci41IiwgNSB9LAotICB7ICJjci42IiwgNiB9LAotICB7ICJjci43IiwgNyB9LAotCi0gIHsgImNyMCIsIDAgfSwKLSAgeyAiY3IxIiwgMSB9LAotICB7ICJjcjIiLCAyIH0sCi0gIHsgImNyMyIsIDMgfSwKLSAgeyAiY3I0IiwgNCB9LAotICB7ICJjcjUiLCA1IH0sCi0gIHsgImNyNiIsIDYgfSwKLSAgeyAiY3I3IiwgNyB9LAotCi0gIHsgImN0ciIsIDkgfSwKLQotICB7ICJkYXIiLCAxOSB9LCAgICAvKiBEYXRhIEFjY2VzcyBSZWdpc3RlciAqLwotICB7ICJkZWMiLCAyMiB9LCAgICAvKiBEZWNyZW1lbnRlciAqLwotICB7ICJkc2lzciIsIDE4IH0sICAvKiBEYXRhIFN0b3JhZ2UgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLwotCi0gIHsgImYuMCIsIDAgfSwgICAgIC8qIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAqLwotICB7ICJmLjEiLCAxIH0sIAotICB7ICJmLjEwIiwgMTAgfSwgCi0gIHsgImYuMTEiLCAxMSB9LCAKLSAgeyAiZi4xMiIsIDEyIH0sIAotICB7ICJmLjEzIiwgMTMgfSwgCi0gIHsgImYuMTQiLCAxNCB9LCAKLSAgeyAiZi4xNSIsIDE1IH0sIAotICB7ICJmLjE2IiwgMTYgfSwgCi0gIHsgImYuMTciLCAxNyB9LCAKLSAgeyAiZi4xOCIsIDE4IH0sIAotICB7ICJmLjE5IiwgMTkgfSwgCi0gIHsgImYuMiIsIDIgfSwgCi0gIHsgImYuMjAiLCAyMCB9LCAKLSAgeyAiZi4yMSIsIDIxIH0sIAotICB7ICJmLjIyIiwgMjIgfSwgCi0gIHsgImYuMjMiLCAyMyB9LCAKLSAgeyAiZi4yNCIsIDI0IH0sIAotICB7ICJmLjI1IiwgMjUgfSwgCi0gIHsgImYuMjYiLCAyNiB9LCAKLSAgeyAiZi4yNyIsIDI3IH0sIAotICB7ICJmLjI4IiwgMjggfSwgCi0gIHsgImYuMjkiLCAyOSB9LCAKLSAgeyAiZi4zIiwgMyB9LCAKLSAgeyAiZi4zMCIsIDMwIH0sCi0gIHsgImYuMzEiLCAzMSB9LAotICB7ICJmLjQiLCA0IH0sIAotICB7ICJmLjUiLCA1IH0sIAotICB7ICJmLjYiLCA2IH0sIAotICB7ICJmLjciLCA3IH0sIAotICB7ICJmLjgiLCA4IH0sIAotICB7ICJmLjkiLCA5IH0sIAotCi0gIHsgImYwIiwgMCB9LCAKLSAgeyAiZjEiLCAxIH0sIAotICB7ICJmMTAiLCAxMCB9LCAKLSAgeyAiZjExIiwgMTEgfSwgCi0gIHsgImYxMiIsIDEyIH0sIAotICB7ICJmMTMiLCAxMyB9LCAKLSAgeyAiZjE0IiwgMTQgfSwgCi0gIHsgImYxNSIsIDE1IH0sIAotICB7ICJmMTYiLCAxNiB9LCAKLSAgeyAiZjE3IiwgMTcgfSwgCi0gIHsgImYxOCIsIDE4IH0sIAotICB7ICJmMTkiLCAxOSB9LCAKLSAgeyAiZjIiLCAyIH0sIAotICB7ICJmMjAiLCAyMCB9LCAKLSAgeyAiZjIxIiwgMjEgfSwgCi0gIHsgImYyMiIsIDIyIH0sIAotICB7ICJmMjMiLCAyMyB9LCAKLSAgeyAiZjI0IiwgMjQgfSwgCi0gIHsgImYyNSIsIDI1IH0sIAotICB7ICJmMjYiLCAyNiB9LCAKLSAgeyAiZjI3IiwgMjcgfSwgCi0gIHsgImYyOCIsIDI4IH0sIAotICB7ICJmMjkiLCAyOSB9LCAKLSAgeyAiZjMiLCAzIH0sIAotICB7ICJmMzAiLCAzMCB9LAotICB7ICJmMzEiLCAzMSB9LAotICB7ICJmNCIsIDQgfSwgCi0gIHsgImY1IiwgNSB9LCAKLSAgeyAiZjYiLCA2IH0sIAotICB7ICJmNyIsIDcgfSwgCi0gIHsgImY4IiwgOCB9LCAKLSAgeyAiZjkiLCA5IH0sIAotCi0gIHsgImZwc2NyIiwgMCB9LAotCi0gIHsgImxyIiwgOCB9LCAgICAgLyogTGluayBSZWdpc3RlciAqLwotCi0gIHsgInBtciIsIDAgfSwKLQotICB7ICJyLjAiLCAwIH0sICAgIC8qIEdlbmVyYWwgUHVycG9zZSBSZWdpc3RlcnMgKi8KLSAgeyAici4xIiwgMSB9LAotICB7ICJyLjEwIiwgMTAgfSwKLSAgeyAici4xMSIsIDExIH0sCi0gIHsgInIuMTIiLCAxMiB9LAotICB7ICJyLjEzIiwgMTMgfSwKLSAgeyAici4xNCIsIDE0IH0sCi0gIHsgInIuMTUiLCAxNSB9LAotICB7ICJyLjE2IiwgMTYgfSwKLSAgeyAici4xNyIsIDE3IH0sCi0gIHsgInIuMTgiLCAxOCB9LAotICB7ICJyLjE5IiwgMTkgfSwKLSAgeyAici4yIiwgMiB9LAotICB7ICJyLjIwIiwgMjAgfSwKLSAgeyAici4yMSIsIDIxIH0sCi0gIHsgInIuMjIiLCAyMiB9LAotICB7ICJyLjIzIiwgMjMgfSwKLSAgeyAici4yNCIsIDI0IH0sCi0gIHsgInIuMjUiLCAyNSB9LAotICB7ICJyLjI2IiwgMjYgfSwKLSAgeyAici4yNyIsIDI3IH0sCi0gIHsgInIuMjgiLCAyOCB9LAotICB7ICJyLjI5IiwgMjkgfSwKLSAgeyAici4zIiwgMyB9LAotICB7ICJyLjMwIiwgMzAgfSwKLSAgeyAici4zMSIsIDMxIH0sCi0gIHsgInIuNCIsIDQgfSwKLSAgeyAici41IiwgNSB9LAotICB7ICJyLjYiLCA2IH0sCi0gIHsgInIuNyIsIDcgfSwKLSAgeyAici44IiwgOCB9LAotICB7ICJyLjkiLCA5IH0sCi0KLSAgeyAici5zcCIsIDEgfSwgICAvKiBTdGFjayBQb2ludGVyICovCi0KLSAgeyAici50b2MiLCAyIH0sICAvKiBQb2ludGVyIHRvIHRoZSB0YWJsZSBvZiBjb250ZW50cyAqLwotCi0gIHsgInIwIiwgMCB9LCAgICAgLyogTW9yZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzICovCi0gIHsgInIxIiwgMSB9LAotICB7ICJyMTAiLCAxMCB9LAotICB7ICJyMTEiLCAxMSB9LAotICB7ICJyMTIiLCAxMiB9LAotICB7ICJyMTMiLCAxMyB9LAotICB7ICJyMTQiLCAxNCB9LAotICB7ICJyMTUiLCAxNSB9LAotICB7ICJyMTYiLCAxNiB9LAotICB7ICJyMTciLCAxNyB9LAotICB7ICJyMTgiLCAxOCB9LAotICB7ICJyMTkiLCAxOSB9LAotICB7ICJyMiIsIDIgfSwKLSAgeyAicjIwIiwgMjAgfSwKLSAgeyAicjIxIiwgMjEgfSwKLSAgeyAicjIyIiwgMjIgfSwKLSAgeyAicjIzIiwgMjMgfSwKLSAgeyAicjI0IiwgMjQgfSwKLSAgeyAicjI1IiwgMjUgfSwKLSAgeyAicjI2IiwgMjYgfSwKLSAgeyAicjI3IiwgMjcgfSwKLSAgeyAicjI4IiwgMjggfSwKLSAgeyAicjI5IiwgMjkgfSwKLSAgeyAicjMiLCAzIH0sCi0gIHsgInIzMCIsIDMwIH0sCi0gIHsgInIzMSIsIDMxIH0sCi0gIHsgInI0IiwgNCB9LAotICB7ICJyNSIsIDUgfSwKLSAgeyAicjYiLCA2IH0sCi0gIHsgInI3IiwgNyB9LAotICB7ICJyOCIsIDggfSwKLSAgeyAicjkiLCA5IH0sCi0KLSAgeyAicnRvYyIsIDIgfSwgIC8qIFRhYmxlIG9mIGNvbnRlbnRzICovCi0KLSAgeyAic2RyMSIsIDI1IH0sIC8qIFN0b3JhZ2UgRGVzY3JpcHRpb24gUmVnaXN0ZXIgMSAqLwotCi0gIHsgInNwIiwgMSB9LAotCi0gIHsgInNycjAiLCAyNiB9LCAvKiBNYWNoaW5lIFN0YXR1cyBTYXZlL1Jlc3RvcmUgUmVnaXN0ZXIgMCAqLwotICB7ICJzcnIxIiwgMjcgfSwgLyogTWFjaGluZSBTdGF0dXMgU2F2ZS9SZXN0b3JlIFJlZ2lzdGVyIDEgKi8KLQotICB7ICJ4ZXIiLCAxIH0sCi0KLX07Ci0KLSNkZWZpbmUgUkVHX05BTUVfQ05UCShzaXplb2YocHJlX2RlZmluZWRfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcGRfcmVnKSkKLQotLyogR2l2ZW4gTkFNRSwgZmluZCB0aGUgcmVnaXN0ZXIgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGF0IG5hbWUsIHJldHVybgotICAgdGhlIGludGVnZXIgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIC0xIG9uIGZhaWx1cmUuICAqLwotCi1zdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaAotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcGRfcmVnICosIGludCwgY29uc3QgY2hhciAqIG5hbWUpKTsKLQotc3RhdGljIGludAotcmVnX25hbWVfc2VhcmNoIChyZWdzLCByZWdjb3VudCwgbmFtZSkKLSAgICAgY29uc3Qgc3RydWN0IHBkX3JlZyAqcmVnczsKLSAgICAgaW50IHJlZ2NvdW50OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0KLSAgbG93ID0gMDsKLSAgaGlnaCA9IHJlZ2NvdW50IC0gMTsKLQotICBkbwotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCByZWdzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gcmVnc1ttaWRkbGVdLnZhbHVlOwotICAgIH0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKLQotICByZXR1cm4gLTE7Ci19Ci0KLS8qCi0gKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjoJSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDoJQSBleHByZXNzaW9uUy4KLSAqICAgICAgVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqICAgICAgWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbiBpdHMKLSAqICAgICAgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLQotc3RhdGljIGJvb2xlYW4KLXJlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKG5hbWVbMF0gPT0gJyUnICYmIGlzYWxwaGEgKG5hbWVbMV0pKQotICAgIG5hbWUgPSArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBlbHNlIGlmICghcmVnX25hbWVzX3AgfHwgIWlzYWxwaGEgKG5hbWVbMF0pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKHByZV9kZWZpbmVkX3JlZ2lzdGVycywgUkVHX05BTUVfQ05ULCBuYW1lKTsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLSAgICAgIAotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0MCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBzeW1ib2wgc2VlbiBpbiBhbiBleHByZXNzaW9uLiAgSXQKLSAgIGhhbmRsZXMgdGhlIHNwZWNpYWwgcGFyc2luZyB3aGljaCBQb3dlclBDIGFzc2VtYmxlcnMgYXJlIHN1cHBvc2VkCi0gICB0byB1c2UgZm9yIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0KLS8qIFdoZXRoZXIgdG8gZG8gdGhlIHNwZWNpYWwgcGFyc2luZy4gICovCi1zdGF0aWMgYm9vbGVhbiBjcl9vcGVyYW5kOwotCi0vKiBOYW1lcyB0byByZWNvZ25pemUgaW4gYSBjb25kaXRpb24gY29kZS4gIFRoaXMgdGFibGUgaXMgc29ydGVkLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGRfcmVnIGNyX25hbWVzW10gPQotewotICB7ICJjcjAiLCAwIH0sCi0gIHsgImNyMSIsIDEgfSwKLSAgeyAiY3IyIiwgMiB9LAotICB7ICJjcjMiLCAzIH0sCi0gIHsgImNyNCIsIDQgfSwKLSAgeyAiY3I1IiwgNSB9LAotICB7ICJjcjYiLCA2IH0sCi0gIHsgImNyNyIsIDcgfSwKLSAgeyAiZXEiLCAyIH0sCi0gIHsgImd0IiwgMSB9LAotICB7ICJsdCIsIDAgfSwKLSAgeyAic28iLCAzIH0sCi0gIHsgInVuIiwgMyB9Ci19OwotCi0vKiBQYXJzaW5nIGZ1bmN0aW9uLiAgVGhpcyByZXR1cm5zIG5vbi16ZXJvIGlmIGl0IHJlY29nbml6ZWQgYW4KLSAgIGV4cHJlc3Npb24uICAqLwotCi1pbnQKLXBwY19wYXJzZV9uYW1lIChuYW1lLCBleHByKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBleHByZXNzaW9uUyAqZXhwcjsKLXsKLSAgaW50IHZhbDsKLQotICBpZiAoISBjcl9vcGVyYW5kKQotICAgIHJldHVybiAwOwotCi0gIHZhbCA9IHJlZ19uYW1lX3NlYXJjaCAoY3JfbmFtZXMsIHNpemVvZiBjcl9uYW1lcyAvIHNpemVvZiBjcl9uYW1lc1swXSwKLQkJCSBuYW1lKTsKLSAgaWYgKHZhbCA8IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgZXhwci0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGV4cHItPlhfYWRkX251bWJlciA9IHZhbDsKLQotICByZXR1cm4gMTsKLX0KLQwKLS8qIExvY2FsIHZhcmlhYmxlcy4gICovCi0KLS8qIFRoZSB0eXBlIG9mIHByb2Nlc3NvciB3ZSBhcmUgYXNzZW1ibGluZyBmb3IuICBUaGlzIGlzIG9uZSBvciBtb3JlCi0gICBvZiB0aGUgUFBDX09QQ09ERSBmbGFncyBkZWZpbmVkIGluIG9wY29kZS9wcGMuaC4gICovCi1zdGF0aWMgaW50IHBwY19jcHUgPSAwOwotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yIHdlIGFyZSBhc3NlbWJsaW5nIGZvci4gIFRoaXMgaXMgZWl0aGVyCi0gICBQUENfT1BDT0RFXzMyIG9yIFBQQ19PUENPREVfNjQuICAqLwotc3RhdGljIGludCBwcGNfc2l6ZSA9IFBQQ19PUENPREVfMzI7Ci0KLS8qIE9wY29kZSBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpwcGNfaGFzaDsKLQotLyogTWFjcm8gaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqcHBjX21hY3JvX2hhc2g7Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBXaGF0IHR5cGUgb2Ygc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCB0byB1c2UgKi8KLXN0YXRpYyBlbnVtIHsgU0hMSUJfTk9ORSwgU0hMSUJfUElDLCBTSElMQl9NUkVMT0NBVEFCTEUgfSBzaGxpYiA9IFNITElCX05PTkU7Ci0KLS8qIEZsYWdzIHRvIHNldCBpbiB0aGUgZWxmIGhlYWRlciAqLwotc3RhdGljIGZsYWd3b3JkIHBwY19mbGFncyA9IDA7Ci0KLS8qIFdoZXRoZXIgdGhpcyBpcyBTb2xhcmlzIG9yIG5vdC4gICovCi0jaWZkZWYgVEFSR0VUX1NPTEFSSVNfQ09NTUVOVAotI2RlZmluZSBTT0xBUklTX1AgdHJ1ZQotI2Vsc2UKLSNkZWZpbmUgU09MQVJJU19QIGZhbHNlCi0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gbXNvbGFyaXMgPSBTT0xBUklTX1A7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9YQ09GRgotCi0vKiBUaGUgUlMvNjAwMCBhc3NlbWJsZXIgdXNlcyB0aGUgLmNzZWN0IHBzZXVkby1vcCB0byBnZW5lcmF0ZSBjb2RlCi0gICB1c2luZyBhIGJ1bmNoIG9mIGRpZmZlcmVudCBzZWN0aW9ucy4gIFRoZXNlIGFzc2VtYmxlciBzZWN0aW9ucywKLSAgIGhvd2V2ZXIsIGFyZSBhbGwgZW5jb21wYXNzZWQgd2l0aGluIHRoZSAudGV4dCBvciAuZGF0YSBzZWN0aW9ucyBvZgotICAgdGhlIGZpbmFsIG91dHB1dCBmaWxlLiAgV2UgaGFuZGxlIHRoaXMgYnkgdXNpbmcgZGlmZmVyZW50Ci0gICBzdWJzZWdtZW50cyB3aXRoaW4gdGhlc2UgbWFpbiBzZWdtZW50cy4gICovCi0KLS8qIE5leHQgc3Vic2VnbWVudCB0byBhbGxvY2F0ZSB3aXRoaW4gdGhlIC50ZXh0IHNlZ21lbnQuICAqLwotc3RhdGljIHN1YnNlZ1QgcHBjX3RleHRfc3Vic2VnbWVudCA9IDI7Ci0KLS8qIExpbmtlZCBsaXN0IG9mIGNzZWN0cyBpbiB0aGUgdGV4dCBzZWN0aW9uLiAgKi8KLXN0YXRpYyBzeW1ib2xTICpwcGNfdGV4dF9jc2VjdHM7Ci0KLS8qIE5leHQgc3Vic2VnbWVudCB0byBhbGxvY2F0ZSB3aXRoaW4gdGhlIC5kYXRhIHNlZ21lbnQuICAqLwotc3RhdGljIHN1YnNlZ1QgcHBjX2RhdGFfc3Vic2VnbWVudCA9IDI7Ci0KLS8qIExpbmtlZCBsaXN0IG9mIGNzZWN0cyBpbiB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLXN0YXRpYyBzeW1ib2xTICpwcGNfZGF0YV9jc2VjdHM7Ci0KLS8qIFRoZSBjdXJyZW50IGNzZWN0LiAgKi8KLXN0YXRpYyBzeW1ib2xTICpwcGNfY3VycmVudF9jc2VjdDsKLQotLyogVGhlIFJTLzYwMDAgYXNzZW1ibGVyIHVzZXMgYSBUT0Mgd2hpY2ggaG9sZHMgYWRkcmVzc2VzIG9mIGZ1bmN0aW9ucwotICAgYW5kIHZhcmlhYmxlcy4gIFN5bWJvbHMgYXJlIHB1dCBpbiB0aGUgVE9DIHdpdGggdGhlIC50YyBwc2V1ZG8tb3AuCi0gICBBIHNwZWNpYWwgcmVsb2NhdGlvbiBpcyB1c2VkIHdoZW4gYWNjZXNzaW5nIFRPQyBlbnRyaWVzLiAgV2UgaGFuZGxlCi0gICB0aGUgVE9DIGFzIGEgc3Vic2VnbWVudCB3aXRoaW4gdGhlIC5kYXRhIHNlZ21lbnQuICBXZSBzZXQgaXQgdXAgaWYKLSAgIHdlIHNlZSBhIC50b2MgcHNldWRvLW9wLCBhbmQgc2F2ZSB0aGUgY3NlY3Qgc3ltYm9sIGhlcmUuICAqLwotc3RhdGljIHN5bWJvbFMgKnBwY190b2NfY3NlY3Q7Ci0KLS8qIFRoZSBmaXJzdCBmcmFnIGluIHRoZSBUT0Mgc3Vic2VnbWVudC4gICovCi1zdGF0aWMgZnJhZ1MgKnBwY190b2NfZnJhZzsKLQotLyogVGhlIGZpcnN0IGZyYWcgaW4gdGhlIGZpcnN0IHN1YnNlZ21lbnQgYWZ0ZXIgdGhlIFRPQyBpbiB0aGUgLmRhdGEKLSAgIHNlZ21lbnQuICBOVUxMIGlmIHRoZXJlIGFyZSBubyBzdWJzZWdtZW50cyBhZnRlciB0aGUgVE9DLiAgKi8KLXN0YXRpYyBmcmFnUyAqcHBjX2FmdGVyX3RvY19mcmFnOwotCi0vKiBUaGUgY3VycmVudCBzdGF0aWMgYmxvY2suICAqLwotc3RhdGljIHN5bWJvbFMgKnBwY19jdXJyZW50X2Jsb2NrOwotCi0vKiBUaGUgQ09GRiBkZWJ1Z2dpbmcgc2VjdGlvbjsgc2V0IGJ5IG1kX2JlZ2luLiAgVGhpcyBpcyBub3QgdGhlCi0gICAuZGVidWcgc2VjdGlvbiwgYnV0IGlzIGluc3RlYWQgdGhlIHNlY3JldCBCRkQgc2VjdGlvbiB3aGljaCB3aWxsCi0gICBjYXVzZSBCRkQgdG8gc2V0IHRoZSBzZWN0aW9uIG51bWJlciBvZiBhIHN5bWJvbCB0byBOX0RFQlVHLiAgKi8KLXN0YXRpYyBhc2VjdGlvbiAqcHBjX2NvZmZfZGVidWdfc2VjdGlvbjsKLQotI2VuZGlmIC8qIE9CSl9YQ09GRiAqLwotCi0jaWZkZWYgVEVfUEUKLQotLyogVmFyaW91cyBzZWN0aW9ucyB0aGF0IHdlIG5lZWQgZm9yIFBFIGNvZmYgc3VwcG9ydC4gICovCi1zdGF0aWMgc2VnVCB5ZGF0YV9zZWN0aW9uOwotc3RhdGljIHNlZ1QgcGRhdGFfc2VjdGlvbjsKLXN0YXRpYyBzZWdUIHJlbGRhdGFfc2VjdGlvbjsKLXN0YXRpYyBzZWdUIHJkYXRhX3NlY3Rpb247Ci1zdGF0aWMgc2VnVCB0b2NkYXRhX3NlY3Rpb247Ci0KLS8qIFRoZSBjdXJyZW50IHNlY3Rpb24gYW5kIHRoZSBwcmV2aW91cyBzZWN0aW9uLiBTZWUgcHBjX3ByZXZpb3VzLiAqLwotc3RhdGljIHNlZ1QgcHBjX3ByZXZpb3VzX3NlY3Rpb247Ci1zdGF0aWMgc2VnVCBwcGNfY3VycmVudF9zZWN0aW9uOwotCi0jZW5kaWYgLyogVEVfUEUgKi8KLQotI2lmZGVmIE9CSl9FTEYKLXN5bWJvbFMgKkdPVF9zeW1ib2w7CQkvKiBQcmUtZGVmaW5lZCAiX0dMT0JBTF9PRkZTRVRfVEFCTEUiICovCi0jZW5kaWYgLyogT0JKX0VMRiAqLwotDAotI2lmZGVmIE9CSl9FTEYKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJiOmw6dXNtOks6VlE6IjsKLSNlbHNlCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAidW06IjsKLSNlbmRpZgotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ3UnOgotICAgICAgLyogLXUgbWVhbnMgdGhhdCBhbnkgdW5kZWZpbmVkIHN5bWJvbHMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMKLQkgZXh0ZXJuYWwsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IGZvciBnYXMgYW55aG93LiAgKi8KLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgJ2wnOgotICAgICAgLyogU29sYXJpcyBhcyB0YWtlcyAtbGUgKHByZXN1bWFibHkgZm9yIGxpdHRsZSBlbmRpYW4pLiAgRm9yIGNvbXBsZXRlbmVzcwotICAgICAgICAgc2FrZSwgcmVjb2duaXplIC1iZSBhbHNvLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGFyZywgImUiKSA9PSAwKQotCXsKLQkgIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKLQkgIHNldF90YXJnZXRfZW5kaWFuID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIDA7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYic6Ci0gICAgICBpZiAoc3RyY21wIChhcmcsICJlIikgPT0gMCkKLQl7Ci0JICB0YXJnZXRfYmlnX2VuZGlhbiA9IDE7Ci0JICBzZXRfdGFyZ2V0X2VuZGlhbiA9IDE7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiAwOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0snOgotICAgICAgLyogUmVjb2duaXplIC1LIFBJQyAqLwotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiUElDIikgPT0gMCB8fCBzdHJjbXAgKGFyZywgInBpYyIpID09IDApCi0JewotCSAgc2hsaWIgPSBTSExJQl9QSUM7Ci0JICBwcGNfZmxhZ3MgfD0gRUZfUFBDX1JFTE9DQVRBQkxFX0xJQjsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIDA7Ci0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlICdtJzoKLSAgICAgIC8qIC1tcHdyeCBhbmQgLW1wd3IyIG1lYW4gdG8gYXNzZW1ibGUgZm9yIHRoZSBJQk0gUE9XRVIvMgotICAgICAgICAgKFJJT1MyKS4gICovCi0gICAgICBpZiAoc3RyY21wIChhcmcsICJwd3J4IikgPT0gMCB8fCBzdHJjbXAgKGFyZywgInB3cjIiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QT1dFUjI7Ci0gICAgICAvKiAtbXB3ciBtZWFucyB0byBhc3NlbWJsZSBmb3IgdGhlIElCTSBQT1dFUiAoUklPUzEpLiAgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAicHdyIikgPT0gMCkKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9QT1dFUjsKLSAgICAgIC8qIC1tNjAxIG1lYW5zIHRvIGFzc2VtYmxlIGZvciB0aGUgTW90b3JvbGEgUG93ZXJQQyA2MDEsIHdoaWNoIGluY2x1ZGVzCi0gICAgICAgICBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgaG9sZG92ZXJzIGZyb20gdGhlIFBvd2VyLiAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICI2MDEiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfNjAxOwotICAgICAgLyogLW1wcGMsIC1tcHBjMzIsIC1tNjAzLCBhbmQgLW02MDQgbWVhbiB0byBhc3NlbWJsZSBmb3IgdGhlCi0gICAgICAgICBNb3Rvcm9sYSBQb3dlclBDIDYwMy82MDQuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJwcGMiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoYXJnLCAicHBjMzIiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoYXJnLCAiNDAzIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGFyZywgIjYwMyIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChhcmcsICI2MDQiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX1BQQzsKLSAgICAgIC8qIC1tcHBjNjQgYW5kIC1tNjIwIG1lYW4gdG8gYXNzZW1ibGUgZm9yIHRoZSA2NC1iaXQgUG93ZXJQQwotICAgICAgICAgNjIwLiAgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAicHBjNjQiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAiNjIwIikgPT0gMCkKLQl7Ci0JICBwcGNfY3B1ID0gUFBDX09QQ09ERV9QUEM7Ci0JICBwcGNfc2l6ZSA9IFBQQ19PUENPREVfNjQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJwcGM2NGJyaWRnZSIpID09IDApCi0JewotCSAgcHBjX2NwdSA9IFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82NF9CUklER0U7Ci0JICBwcGNfc2l6ZSA9IFBQQ19PUENPREVfNjQ7Ci0JfQotICAgICAgLyogLW1jb20gbWVhbnMgYXNzZW1ibGUgZm9yIHRoZSBjb21tb24gaW50ZXJzZWN0aW9uIGJldHdlZW4gUG93ZXIKLQkgYW5kIFBvd2VyUEMuICBBdCBwcmVzZW50LCB3ZSBqdXN0IGFsbG93IHRoZSB1bmlvbiwgcmF0aGVyCi0JIHRoYW4gdGhlIGludGVyc2VjdGlvbi4gICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImNvbSIpID09IDApCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfQ09NTU9OOwotICAgICAgLyogLW1hbnkgbWVhbnMgdG8gYXNzZW1ibGUgZm9yIGFueSBhcmNoaXRlY3R1cmUgKFBXUi9QV1JYL1BQQykuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJhbnkiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX0FOWTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJyZWduYW1lcyIpID09IDApCi0JcmVnX25hbWVzX3AgPSB0cnVlOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIm5vLXJlZ25hbWVzIikgPT0gMCkKLQlyZWdfbmFtZXNfcCA9IGZhbHNlOwotCi0jaWZkZWYgT0JKX0VMRgotICAgICAgLyogLW1yZWxvY2F0YWJsZS8tbXJlbG9jYXRhYmxlLWxpYiAtLSB3YXJuIGFib3V0IGluaXRpYWxpemF0aW9ucyB0aGF0IHJlcXVpcmUgcmVsb2NhdGlvbiAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJyZWxvY2F0YWJsZSIpID09IDApCi0JewotCSAgc2hsaWIgPSBTSElMQl9NUkVMT0NBVEFCTEU7Ci0JICBwcGNfZmxhZ3MgfD0gRUZfUFBDX1JFTE9DQVRBQkxFOwotCX0KLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJyZWxvY2F0YWJsZS1saWIiKSA9PSAwKQotCXsKLQkgIHNobGliID0gU0hJTEJfTVJFTE9DQVRBQkxFOwotCSAgcHBjX2ZsYWdzIHw9IEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUI7Ci0JfQotCi0gICAgICAvKiAtbWVtYiwgc2V0IGVtYmVkZGVkIGJpdCAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJlbWIiKSA9PSAwKQotCXBwY19mbGFncyB8PSBFRl9QUENfRU1COwotCi0gICAgICAvKiAtbWxpdHRsZS8tbWJpZyBzZXQgdGhlIGVuZGlhbmVzcyAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJsaXR0bGUiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAibGl0dGxlLWVuZGlhbiIpID09IDApCi0JewotCSAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotCSAgc2V0X3RhcmdldF9lbmRpYW4gPSAxOwotCX0KLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJiaWciKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAiYmlnLWVuZGlhbiIpID09IDApCi0JewotCSAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAxOwotCSAgc2V0X3RhcmdldF9lbmRpYW4gPSAxOwotCX0KLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJzb2xhcmlzIikgPT0gMCkKLQl7Ci0JICBtc29sYXJpcyA9IHRydWU7Ci0JICBwcGNfY29tbWVudF9jaGFycyA9IHBwY19zb2xhcmlzX2NvbW1lbnRfY2hhcnM7Ci0JfQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIm5vLXNvbGFyaXMiKSA9PSAwKQotCXsKLQkgIG1zb2xhcmlzID0gZmFsc2U7Ci0JICBwcGNfY29tbWVudF9jaGFycyA9IHBwY19lYWJpX2NvbW1lbnRfY2hhcnM7Ci0JfQotI2VuZGlmCi0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJpbnZhbGlkIHN3aXRjaCAtbSVzIiksIGFyZyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBicmVhazsKLQotI2lmZGVmIE9CSl9FTEYKLSAgICAgIC8qIC1WOiBTVlI0IGFyZ3VtZW50IHRvIHByaW50IHZlcnNpb24gSUQuICAqLwotICAgIGNhc2UgJ1YnOgotICAgICAgcHJpbnRfdmVyc2lvbl9pZCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAtUXksIC1RbjogU1ZSNCBhcmd1bWVudHMgY29udHJvbGxpbmcgd2hldGhlciBhIC5jb21tZW50IHNlY3Rpb24KLQkgc2hvdWxkIGJlIGVtaXR0ZWQgb3Igbm90LiAgRklYTUU6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gICAgY2FzZSAnUSc6Ci0gICAgICBicmVhazsKLQotICAgICAgLyogU29sYXJpcyB0YWtlcyAtcyB0byBzcGVjaWZ5IHRoYXQgLnN0YWJzIGdvIGluIGEgLnN0YWJzIHNlY3Rpb24sCi0JIHJhdGhlciB0aGFuIC5zdGFicy5leGNsLCB3aGljaCBpcyBpZ25vcmVkIGJ5IHRoZSBsaW5rZXIuCi0JIEZJWE1FOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICAgIGNhc2UgJ3MnOgotICAgICAgaWYgKGFyZykKLQlyZXR1cm4gMDsKLQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotUG93ZXJQQyBvcHRpb25zOlxuXAotLXUJCQlpZ25vcmVkXG5cCi0tbXB3cngsIC1tcHdyMgkJZ2VuZXJhdGUgY29kZSBmb3IgSUJNIFBPV0VSLzIgKFJJT1MyKVxuXAotLW1wd3IJCQlnZW5lcmF0ZSBjb2RlIGZvciBJQk0gUE9XRVIgKFJJT1MxKVxuXAotLW02MDEJCQlnZW5lcmF0ZSBjb2RlIGZvciBNb3Rvcm9sYSBQb3dlclBDIDYwMVxuXAotLW1wcGMsIC1tcHBjMzIsIC1tNDAzLCAtbTYwMywgLW02MDRcblwKLQkJCWdlbmVyYXRlIGNvZGUgZm9yIE1vdG9yb2xhIFBvd2VyUEMgNjAzLzYwNFxuXAotLW1wcGM2NCwgLW02MjAJCWdlbmVyYXRlIGNvZGUgZm9yIE1vdG9yb2xhIFBvd2VyUEMgNjIwXG5cCi0tbXBwYzY0YnJpZGdlCQlnZW5lcmF0ZSBjb2RlIGZvciBQb3dlclBDIDY0LCBpbmNsdWRpbmcgYnJpZGdlIGluc25zXG5cCi0tbWNvbQkJCWdlbmVyYXRlIGNvZGUgUG93ZXIvUG93ZXJQQyBjb21tb24gaW5zdHJ1Y3Rpb25zXG5cCi0tbWFueQkJCWdlbmVyYXRlIGNvZGUgZm9yIGFueSBhcmNoaXRlY3R1cmUgKFBXUi9QV1JYL1BQQylcblwKLS1tcmVnbmFtZXMJCUFsbG93IHN5bWJvbGljIG5hbWVzIGZvciByZWdpc3RlcnNcblwKLS1tbm8tcmVnbmFtZXMJCURvIG5vdCBhbGxvdyBzeW1ib2xpYyBuYW1lcyBmb3IgcmVnaXN0ZXJzXG4iKSk7Ci0jaWZkZWYgT0JKX0VMRgotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotLW1yZWxvY2F0YWJsZQkJc3VwcG9ydCBmb3IgR0NDJ3MgLW1yZWxvY2F0YmxlIG9wdGlvblxuXAotLW1yZWxvY2F0YWJsZS1saWIJc3VwcG9ydCBmb3IgR0NDJ3MgLW1yZWxvY2F0YmxlLWxpYiBvcHRpb25cblwKLS1tZW1iCQkJc2V0IFBQQ19FTUIgYml0IGluIEVMRiBmbGFnc1xuXAotLW1saXR0bGUsIC1tbGl0dGxlLWVuZGlhblxuXAotCQkJZ2VuZXJhdGUgY29kZSBmb3IgYSBsaXR0bGUgZW5kaWFuIG1hY2hpbmVcblwKLS1tYmlnLCAtbWJpZy1lbmRpYW4JZ2VuZXJhdGUgY29kZSBmb3IgYSBiaWcgZW5kaWFuIG1hY2hpbmVcblwKLS1tc29sYXJpcwkJZ2VuZXJhdGUgY29kZSBmb3IgU29sYXJpc1xuXAotLW1uby1zb2xhcmlzCQlkbyBub3QgZ2VuZXJhdGUgY29kZSBmb3IgU29sYXJpc1xuXAotLVYJCQlwcmludCBhc3NlbWJsZXIgdmVyc2lvbiBudW1iZXJcblwKLS1ReSwgLVFuCQlpZ25vcmVkXG4iKSk7Ci0jZW5kaWYKLX0KLQwKLS8qIFNldCBwcGNfY3B1IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfc2V0X2NwdSAoKQotewotICBjb25zdCBjaGFyICpkZWZhdWx0X29zICA9IFRBUkdFVF9PUzsKLSAgY29uc3QgY2hhciAqZGVmYXVsdF9jcHUgPSBUQVJHRVRfQ1BVOwotCi0gIGlmIChwcGNfY3B1ID09IDApCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKGRlZmF1bHRfb3MsICJhaXgiLCAzKSA9PSAwCi0JICAmJiBkZWZhdWx0X29zWzNdID49ICc0JyAmJiBkZWZhdWx0X29zWzNdIDw9ICc5JykKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9DT01NT047Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChkZWZhdWx0X29zLCAiYWl4MyIsIDQpID09IDApCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfUE9XRVI7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGRlZmF1bHRfY3B1LCAicnM2MDAwIikgPT0gMCkKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9QT1dFUjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZGVmYXVsdF9jcHUsICJwb3dlcnBjIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGRlZmF1bHRfY3B1LCAicG93ZXJwY2xlIikgPT0gMCkKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9QUEM7Ci0gICAgICBlbHNlCi0JYXNfZmF0YWwgKF8oIlVua25vd24gZGVmYXVsdCBjcHUgPSAlcywgb3MgPSAlcyIpLCBkZWZhdWx0X2NwdSwgZGVmYXVsdF9vcyk7Ci0gICAgfQotfQotCi0vKiBGaWd1cmUgb3V0IHRoZSBCRkQgYXJjaGl0ZWN0dXJlIHRvIHVzZS4gICovCi0KLWVudW0gYmZkX2FyY2hpdGVjdHVyZQotcHBjX2FyY2ggKCkKLXsKLSAgY29uc3QgY2hhciAqZGVmYXVsdF9jcHUgPSBUQVJHRVRfQ1BVOwotICBwcGNfc2V0X2NwdSAoKTsKLQotICBpZiAoKHBwY19jcHUgJiBQUENfT1BDT0RFX1BQQykgIT0gMCkKLSAgICByZXR1cm4gYmZkX2FyY2hfcG93ZXJwYzsKLSAgZWxzZSBpZiAoKHBwY19jcHUgJiBQUENfT1BDT0RFX1BPV0VSKSAhPSAwKQotICAgIHJldHVybiBiZmRfYXJjaF9yczYwMDA7Ci0gIGVsc2UgaWYgKChwcGNfY3B1ICYgKFBQQ19PUENPREVfQ09NTU9OIHwgUFBDX09QQ09ERV9BTlkpKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKGRlZmF1bHRfY3B1LCAicnM2MDAwIikgPT0gMCkKLQlyZXR1cm4gYmZkX2FyY2hfcnM2MDAwOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChkZWZhdWx0X2NwdSwgInBvd2VycGMiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoZGVmYXVsdF9jcHUsICJwb3dlcnBjbGUiKSA9PSAwKQotCXJldHVybiBiZmRfYXJjaF9wb3dlcnBjOwotICAgIH0KLQotICBhc19mYXRhbCAoXygiTmVpdGhlciBQb3dlciBub3IgUG93ZXJQQyBvcGNvZGVzIHdlcmUgc2VsZWN0ZWQuIikpOwotICByZXR1cm4gYmZkX2FyY2hfdW5rbm93bjsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgYXNzZW1ibGVyIHN0YXJ0cyB1cC4gIEl0IGlzIGNhbGxlZAotICAgYWZ0ZXIgdGhlIG9wdGlvbnMgaGF2ZSBiZWVuIHBhcnNlZCBhbmQgdGhlIG91dHB1dCBmaWxlIGhhcyBiZWVuCi0gICBvcGVuZWQuICAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wX2VuZDsKLSAgY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gKm1hY3JvOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyAqbWFjcm9fZW5kOwotICBib29sZWFuIGR1cF9pbnNuID0gZmFsc2U7Ci0KLSAgcHBjX3NldF9jcHUgKCk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIC8qIFNldCB0aGUgRUxGIGZsYWdzIGlmIGRlc2lyZWQuICovCi0gIGlmIChwcGNfZmxhZ3MgJiYgIW1zb2xhcmlzKQotICAgIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyAoc3Rkb3V0cHV0LCBwcGNfZmxhZ3MpOwotI2VuZGlmCi0KLSAgLyogSW5zZXJ0IHRoZSBvcGNvZGVzIGludG8gYSBoYXNoIHRhYmxlLiAgKi8KLSAgcHBjX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBvcF9lbmQgPSBwb3dlcnBjX29wY29kZXMgKyBwb3dlcnBjX251bV9vcGNvZGVzOwotICBmb3IgKG9wID0gcG93ZXJwY19vcGNvZGVzOyBvcCA8IG9wX2VuZDsgb3ArKykKLSAgICB7Ci0gICAgICBrbm93ICgob3AtPm9wY29kZSAmIG9wLT5tYXNrKSA9PSBvcC0+b3Bjb2RlKTsKLQotICAgICAgaWYgKChvcC0+ZmxhZ3MgJiBwcGNfY3B1KSAhPSAwCi0JICAmJiAoKG9wLT5mbGFncyAmIChQUENfT1BDT0RFXzMyIHwgUFBDX09QQ09ERV82NCkpID09IDAKLQkgICAgICB8fCAob3AtPmZsYWdzICYgKFBQQ19PUENPREVfMzIgfCBQUENfT1BDT0RFXzY0KSkgPT0gcHBjX3NpemUKLQkgICAgICB8fCAocHBjX2NwdSAmIFBQQ19PUENPREVfNjRfQlJJREdFKSAhPSAwKSkKLQl7Ci0JICBjb25zdCBjaGFyICpyZXR2YWw7Ci0KLQkgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChwcGNfaGFzaCwgb3AtPm5hbWUsIChQVFIpIG9wKTsKLQkgIGlmIChyZXR2YWwgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQkgICAgewotCSAgICAgIC8qIElnbm9yZSBQb3dlciBkdXBsaWNhdGVzIGZvciAtbTYwMSAqLwotCSAgICAgIGlmICgocHBjX2NwdSAmIFBQQ19PUENPREVfNjAxKSAhPSAwCi0JCSAgJiYgKG9wLT5mbGFncyAmIFBQQ19PUENPREVfUE9XRVIpICE9IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgYXNfYmFkIChfKCJJbnRlcm5hbCBhc3NlbWJsZXIgZXJyb3IgZm9yIGluc3RydWN0aW9uICVzIiksIG9wLT5uYW1lKTsKLQkgICAgICBkdXBfaW5zbiA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEluc2VydCB0aGUgbWFjcm9zIGludG8gYSBoYXNoIHRhYmxlLiAgKi8KLSAgcHBjX21hY3JvX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBtYWNyb19lbmQgPSBwb3dlcnBjX21hY3JvcyArIHBvd2VycGNfbnVtX21hY3JvczsKLSAgZm9yIChtYWNybyA9IHBvd2VycGNfbWFjcm9zOyBtYWNybyA8IG1hY3JvX2VuZDsgbWFjcm8rKykKLSAgICB7Ci0gICAgICBpZiAoKG1hY3JvLT5mbGFncyAmIHBwY19jcHUpICE9IDApCi0JewotCSAgY29uc3QgY2hhciAqcmV0dmFsOwotCi0JICByZXR2YWwgPSBoYXNoX2luc2VydCAocHBjX21hY3JvX2hhc2gsIG1hY3JvLT5uYW1lLCAoUFRSKSBtYWNybyk7Ci0JICBpZiAocmV0dmFsICE9IChjb25zdCBjaGFyICopIE5VTEwpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkludGVybmFsIGFzc2VtYmxlciBlcnJvciBmb3IgbWFjcm8gJXMiKSwgbWFjcm8tPm5hbWUpOwotCSAgICAgIGR1cF9pbnNuID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGR1cF9pbnNuKQotICAgIGFib3J0ICgpOwotCi0gIC8qIFRlbGwgdGhlIG1haW4gY29kZSB3aGF0IHRoZSBlbmRpYW5uZXNzIGlzIGlmIGl0IGlzIG5vdCBvdmVyaWRkZW4gYnkgdGhlIHVzZXIuICAqLwotICBpZiAoIXNldF90YXJnZXRfZW5kaWFuKQotICAgIHsKLSAgICAgIHNldF90YXJnZXRfZW5kaWFuID0gMTsKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gUFBDX0JJR19FTkRJQU47Ci0gICAgfQotCi0jaWZkZWYgT0JKX1hDT0ZGCi0gIHBwY19jb2ZmX2RlYnVnX3NlY3Rpb24gPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKHN0ZG91dHB1dCwgTl9ERUJVRyk7Ci0KLSAgLyogQ3JlYXRlIGR1bW15IHN5bWJvbHMgdG8gc2VydmUgYXMgaW5pdGlhbCBjc2VjdHMuICBUaGlzIGZvcmNlcyB0aGUKLSAgICAgdGV4dCBjc2VjdHMgdG8gcHJlY2VkZSB0aGUgZGF0YSBjc2VjdHMuICBUaGVzZSBzeW1ib2xzIHdpbGwgbm90Ci0gICAgIGJlIG91dHB1dC4gICovCi0gIHBwY190ZXh0X2NzZWN0cyA9IHN5bWJvbF9tYWtlICgiZHVtbXlcMDAxIik7Ci0gIHBwY190ZXh0X2NzZWN0cy0+c3lfdGMud2l0aGluID0gcHBjX3RleHRfY3NlY3RzOwotICBwcGNfZGF0YV9jc2VjdHMgPSBzeW1ib2xfbWFrZSAoImR1bW15XDAwMSIpOwotICBwcGNfZGF0YV9jc2VjdHMtPnN5X3RjLndpdGhpbiA9IHBwY19kYXRhX2NzZWN0czsKLSNlbmRpZgotCi0jaWZkZWYgVEVfUEUKLQotICBwcGNfY3VycmVudF9zZWN0aW9uID0gdGV4dF9zZWN0aW9uOwotICBwcGNfcHJldmlvdXNfc2VjdGlvbiA9IDA7ICAKLQotI2VuZGlmCi19Ci0KLS8qIEluc2VydCBhbiBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotcHBjX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCB2YWwsIGZpbGUsIGxpbmUpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgb2Zmc2V0VCB2YWw7Ci0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotewotICBpZiAob3BlcmFuZC0+Yml0cyAhPSAzMikKLSAgICB7Ci0gICAgICBsb25nIG1pbiwgbWF4OwotICAgICAgb2Zmc2V0VCB0ZXN0OwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCXsKLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9TSUdOT1BUKSAhPSAwKQotCSAgICBtYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7Ci0JICBlbHNlCi0JICAgIG1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSk7Ci0KLQkgIGlmIChwcGNfc2l6ZSA9PSBQUENfT1BDT0RFXzMyKQotCSAgICB7Ci0JICAgICAgLyogU29tZSBwZW9wbGUgd3JpdGUgMzIgYml0IGhleCBjb25zdGFudHMgd2l0aCB0aGUgc2lnbgotCQkgZXh0ZW5zaW9uIGRvbmUgYnkgaGFuZC4gIFRoaXMgc2hvdWxkbid0IHJlYWxseSBiZQotCQkgdmFsaWQsIGJ1dCwgdG8gcGVybWl0IHRoaXMgY29kZSB0byBhc3NlbWJsZSBvbiBhIDY0Ci0JCSBiaXQgaG9zdCwgd2Ugc2lnbiBleHRlbmQgdGhlIDMyIGJpdCB2YWx1ZS4gICovCi0JICAgICAgaWYgKHZhbCA+IDAKLQkJICAmJiAodmFsICYgMHg4MDAwMDAwMCkgIT0gMAotCQkgICYmICh2YWwgJiAweGZmZmZmZmZmKSA9PSB2YWwpCi0JCXsKLQkJICB2YWwgLT0gMHg4MDAwMDAwMDsKLQkJICB2YWwgLT0gMHg4MDAwMDAwMDsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQkgIG1pbiA9IDA7Ci0JfQotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfTkVHQVRJVkUpICE9IDApCi0JdGVzdCA9IC0gdmFsOwotICAgICAgZWxzZQotCXRlc3QgPSB2YWw7Ci0KLSAgICAgIGlmICh0ZXN0IDwgKG9mZnNldFQpIG1pbiB8fCB0ZXN0ID4gKG9mZnNldFQpIG1heCkKLQl7Ci0JICBjb25zdCBjaGFyICplcnIgPQotCSAgICBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIik7Ci0JICBjaGFyIGJ1ZlsxMDBdOwotCi0JICBzcHJpbnRfdmFsdWUgKGJ1ZiwgdGVzdCk7Ci0JICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQotCSAgICBhc19iYWQgKGVyciwgYnVmLCBtaW4sIG1heCk7Ci0JICBlbHNlCi0JICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgZXJyLCBidWYsIG1pbiwgbWF4KTsKLQl9Ci0gICAgfQotCi0gIGlmIChvcGVyYW5kLT5pbnNlcnQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZXJybXNnOwotCi0gICAgICBlcnJtc2cgPSBOVUxMOwotICAgICAgaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgKGxvbmcpIHZhbCwgJmVycm1zZyk7Ci0gICAgICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICopIE5VTEwpCi0JYXNfYmFkIChlcnJtc2cpOwotICAgIH0KLSAgZWxzZQotICAgIGluc24gfD0gKCgobG9uZykgdmFsICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpCi0JICAgICA8PCBvcGVyYW5kLT5zaGlmdCk7Ci0KLSAgcmV0dXJuIGluc247Ci19Ci0KLQwKLSNpZmRlZiBPQkpfRUxGCi0vKiBQYXJzZSBAZ290LCBldGMuIGFuZCByZXR1cm4gdGhlIGRlc2lyZWQgcmVsb2NhdGlvbi4gICovCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1wcGNfZWxmX3N1ZmZpeCAoc3RyX3AsIGV4cF9wKQotICAgICBjaGFyICoqc3RyX3A7Ci0gICAgIGV4cHJlc3Npb25TICpleHBfcDsKLXsKLSAgc3RydWN0IG1hcF9iZmQgewotICAgIGNoYXIgKnN0cmluZzsKLSAgICBpbnQgbGVuZ3RoOwotICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLSAgfTsKLQotICBjaGFyIGlkZW50WzIwXTsKLSAgY2hhciAqc3RyID0gKnN0cl9wOwotICBjaGFyICpzdHIyOwotICBpbnQgY2g7Ci0gIGludCBsZW47Ci0gIHN0cnVjdCBtYXBfYmZkICpwdHI7Ci0KLSNkZWZpbmUgTUFQKHN0cixyZWxvYykgeyBzdHIsIHNpemVvZihzdHIpLTEsIHJlbG9jIH0KLQotICBzdGF0aWMgc3RydWN0IG1hcF9iZmQgbWFwcGluZ1tdID0gewotICAgIE1BUCAoImwiLAkJQkZEX1JFTE9DX0xPMTYpLAotICAgIE1BUCAoImgiLAkJQkZEX1JFTE9DX0hJMTYpLAotICAgIE1BUCAoImhhIiwJCUJGRF9SRUxPQ19ISTE2X1MpLAotICAgIE1BUCAoImJydGFrZW4iLAlCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOKSwKLSAgICBNQVAgKCJicm50YWtlbiIsCUJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOKSwKLSAgICBNQVAgKCJnb3QiLAkJQkZEX1JFTE9DXzE2X0dPVE9GRiksCi0gICAgTUFQICgiZ290QGwiLAlCRkRfUkVMT0NfTE8xNl9HT1RPRkYpLAotICAgIE1BUCAoImdvdEBoIiwJQkZEX1JFTE9DX0hJMTZfR09UT0ZGKSwKLSAgICBNQVAgKCJnb3RAaGEiLAlCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRiksCi0gICAgTUFQICgiZml4dXAiLAlCRkRfUkVMT0NfQ1RPUiksCQkvKiB3YXJuaW5ncyB3aXRoIC1tcmVsb2NhdGFibGUgKi8KLSAgICBNQVAgKCJwbHQiLAkJQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTCksCi0gICAgTUFQICgicGx0cmVsMjQiLAlCRkRfUkVMT0NfMjRfUExUX1BDUkVMKSwKLSAgICBNQVAgKCJjb3B5IiwJQkZEX1JFTE9DX1BQQ19DT1BZKSwKLSAgICBNQVAgKCJnbG9iZGF0IiwJQkZEX1JFTE9DX1BQQ19HTE9CX0RBVCksCi0gICAgTUFQICgibG9jYWwyNHBjIiwJQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEMpLAotICAgIE1BUCAoImxvY2FsIiwJQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEMpLAotICAgIE1BUCAoInBsdHJlbCIsCUJGRF9SRUxPQ18zMl9QTFRfUENSRUwpLAotICAgIE1BUCAoInBsdEBsIiwJQkZEX1JFTE9DX0xPMTZfUExUT0ZGKSwKLSAgICBNQVAgKCJwbHRAaCIsCUJGRF9SRUxPQ19ISTE2X1BMVE9GRiksCi0gICAgTUFQICgicGx0QGhhIiwJQkZEX1JFTE9DX0hJMTZfU19QTFRPRkYpLAotICAgIE1BUCAoInNkYXJlbCIsCUJGRF9SRUxPQ19HUFJFTDE2KSwKLSAgICBNQVAgKCJzZWN0b2ZmIiwJQkZEX1JFTE9DXzMyX0JBU0VSRUwpLAotICAgIE1BUCAoInNlY3RvZmZAbCIsCUJGRF9SRUxPQ19MTzE2X0JBU0VSRUwpLAotICAgIE1BUCAoInNlY3RvZmZAaCIsCUJGRF9SRUxPQ19ISTE2X0JBU0VSRUwpLAotICAgIE1BUCAoInNlY3RvZmZAaGEiLAlCRkRfUkVMT0NfSEkxNl9TX0JBU0VSRUwpLAotICAgIE1BUCAoIm5hZGRyIiwJQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMiksCi0gICAgTUFQICgibmFkZHIxNiIsCUJGRF9SRUxPQ19QUENfRU1CX05BRERSMTYpLAotICAgIE1BUCAoIm5hZGRyQGwiLAlCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0xPKSwKLSAgICBNQVAgKCJuYWRkckBoIiwJQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9ISSksCi0gICAgTUFQICgibmFkZHJAaGEiLAlCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hBKSwKLSAgICBNQVAgKCJzZGFpMTYiLAlCRkRfUkVMT0NfUFBDX0VNQl9TREFJMTYpLAotICAgIE1BUCAoInNkYTJyZWwiLAlCRkRfUkVMT0NfUFBDX0VNQl9TREEyUkVMKSwKLSAgICBNQVAgKCJzZGEyaTE2IiwJQkZEX1JFTE9DX1BQQ19FTUJfU0RBMkkxNiksCi0gICAgTUFQICgic2RhMjEiLAlCRkRfUkVMT0NfUFBDX0VNQl9TREEyMSksCi0gICAgTUFQICgibXJrcmVmIiwJQkZEX1JFTE9DX1BQQ19FTUJfTVJLUkVGKSwKLSAgICBNQVAgKCJyZWxzZWN0IiwJQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0VDMTYpLAotICAgIE1BUCAoInJlbHNlY3RAbCIsCUJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPKSwKLSAgICBNQVAgKCJyZWxzZWN0QGgiLAlCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9ISSksCi0gICAgTUFQICgicmVsc2VjdEBoYSIsCUJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBKSwKLSAgICBNQVAgKCJiaXRmbGQiLAlCRkRfUkVMT0NfUFBDX0VNQl9CSVRfRkxEKSwKLSAgICBNQVAgKCJyZWxzZGEiLAlCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREEpLAotICAgIE1BUCAoInhnb3QiLAlCRkRfUkVMT0NfUFBDX1RPQzE2KSwKLQotICAgIHsgKGNoYXIgKikwLAkwLAlCRkRfUkVMT0NfVU5VU0VEIH0KLSAgfTsKLQotICBpZiAoKnN0cisrICE9ICdAJykKLSAgICByZXR1cm4gQkZEX1JFTE9DX1VOVVNFRDsKLQotICBmb3IgKGNoID0gKnN0ciwgc3RyMiA9IGlkZW50OwotICAgICAgIChzdHIyIDwgaWRlbnQgKyBzaXplb2YgKGlkZW50KSAtIDEKLQkmJiAoaXNhbG51bSAoY2gpIHx8IGNoID09ICdAJykpOwotICAgICAgIGNoID0gKisrc3RyKQotICAgIHsKLSAgICAgICpzdHIyKysgPSAoaXNsb3dlciAoY2gpKSA/IGNoIDogdG9sb3dlciAoY2gpOwotICAgIH0KLQotICAqc3RyMiA9ICdcMCc7Ci0gIGxlbiA9IHN0cjIgLSBpZGVudDsKLQotICBjaCA9IGlkZW50WzBdOwotICBmb3IgKHB0ciA9ICZtYXBwaW5nWzBdOyBwdHItPmxlbmd0aCA+IDA7IHB0cisrKQotICAgIGlmIChjaCA9PSBwdHItPnN0cmluZ1swXQotCSYmIGxlbiA9PSBwdHItPmxlbmd0aAotCSYmIG1lbWNtcCAoaWRlbnQsIHB0ci0+c3RyaW5nLCBwdHItPmxlbmd0aCkgPT0gMCkKLSAgICAgIHsKLQlpZiAoZXhwX3AtPlhfYWRkX251bWJlciAhPSAwCi0JICAgICYmIChwdHItPnJlbG9jID09IEJGRF9SRUxPQ18xNl9HT1RPRkYKLQkJfHwgcHRyLT5yZWxvYyA9PSBCRkRfUkVMT0NfTE8xNl9HT1RPRkYKLQkJfHwgcHRyLT5yZWxvYyA9PSBCRkRfUkVMT0NfSEkxNl9HT1RPRkYKLQkJfHwgcHRyLT5yZWxvYyA9PSBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRikpCi0JICBhc193YXJuIChfKCJpZGVudGlmaWVyK2NvbnN0YW50QGdvdCBtZWFucyBpZGVudGlmaWVyQGdvdCtjb25zdGFudCIpKTsKLQotCS8qIE5vdyBjaGVjayBmb3IgaWRlbnRpZmllckBzdWZmaXgrY29uc3RhbnQgKi8KLQlpZiAoKnN0ciA9PSAnLScgfHwgKnN0ciA9PSAnKycpCi0JICB7Ci0JICAgIGNoYXIgKm9yaWdfbGluZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgZXhwcmVzc2lvblMgbmV3X2V4cDsKLQotCSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0JICAgIGV4cHJlc3Npb24gKCZuZXdfZXhwKTsKLQkgICAgaWYgKG5ld19leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICAgIHsKLQkJZXhwX3AtPlhfYWRkX251bWJlciArPSBuZXdfZXhwLlhfYWRkX251bWJlcjsKLQkJc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIH0KLQotCSAgICBpZiAoJmlucHV0X2xpbmVfcG9pbnRlciAhPSBzdHJfcCkKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvcmlnX2xpbmU7Ci0JICB9Ci0KLQkqc3RyX3AgPSBzdHI7Ci0JcmV0dXJuIHB0ci0+cmVsb2M7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIEJGRF9SRUxPQ19VTlVTRUQ7Ci19Ci0KLS8qIExpa2Ugbm9ybWFsIC5sb25nLy5zaG9ydC8ud29yZCwgZXhjZXB0IHN1cHBvcnQgQGdvdCwgZXRjLiAqLwotLyogY2xvYmJlcnMgaW5wdXRfbGluZV9wb2ludGVyLCBjaGVja3MgKi8KLS8qIGVuZC1vZi1saW5lLiAqLwotc3RhdGljIHZvaWQKLXBwY19lbGZfY29ucyAobmJ5dGVzKQotICAgICByZWdpc3RlciBpbnQgbmJ5dGVzOwkvKiAxPS5ieXRlLCAyPS53b3JkLCA0PS5sb25nICovCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotCi0gIGlmIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRvCi0gICAgewotICAgICAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gICAgICBpZiAoZXhwLlhfb3AgPT0gT19zeW1ib2wKLQkgICYmICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ0AnCi0JICAmJiAocmVsb2MgPSBwcGNfZWxmX3N1ZmZpeCAoJmlucHV0X2xpbmVfcG9pbnRlciwgJmV4cCkpICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0JewotCSAgcmVsb2NfaG93dG9fdHlwZSAqcmVsb2NfaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgcmVsb2MpOwotCSAgaW50IHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvKTsKLQotCSAgaWYgKHNpemUgPiBuYnl0ZXMpCi0JICAgIGFzX2JhZCAoXygiJXMgcmVsb2NhdGlvbnMgZG8gbm90IGZpdCBpbiAlZCBieXRlc1xuIiksIHJlbG9jX2hvd3RvLT5uYW1lLCBuYnl0ZXMpOwotCi0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZWdpc3RlciBjaGFyICpwID0gZnJhZ19tb3JlICgoaW50KSBuYnl0ZXMpOwotCSAgICAgIGludCBvZmZzZXQgPSBuYnl0ZXMgLSBzaXplOwotCi0JICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsIHNpemUsICZleHAsIDAsIHJlbG9jKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQllbWl0X2V4cHIgKCZleHAsICh1bnNpZ25lZCBpbnQpIG5ieXRlcyk7Ci0gICAgfQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICcsJyk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyLS07CQkvKiBQdXQgdGVybWluYXRvciBiYWNrIGludG8gc3RyZWFtLiAqLwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBTb2xhcmlzIHBzZWR1byBvcCB0byBjaGFuZ2UgdG8gdGhlIC5yb2RhdGEgc2VjdGlvbi4gICovCi1zdGF0aWMgdm9pZAotcHBjX2VsZl9yZGF0YSAoeHh4KQotICAgICBpbnQgeHh4OwotewotICBjaGFyICpzYXZlX2xpbmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHN0YXRpYyBjaGFyIHNlY3Rpb25bXSA9ICIucm9kYXRhXG4iOwotCi0gIC8qIEp1c3QgcHJldGVuZCB0aGlzIGlzIC5zZWN0aW9uIC5yb2RhdGEgKi8KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2VjdGlvbjsKLSAgb2JqX2VsZl9zZWN0aW9uICh4eHgpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfbGluZTsKLX0KLQotLyogUHNldWRvIG9wIHRvIG1ha2UgZmlsZSBzY29wZSBic3MgaXRlbXMgKi8KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX2xjb21tKHh4eCkKLSAgICAgaW50IHh4eDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciBjOwotICByZWdpc3RlciBjaGFyICpwOwotICBvZmZzZXRUIHNpemU7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIG9mZnNldFQgYWxpZ247Ci0gIHNlZ1Qgb2xkX3NlYzsKLSAgaW50IG9sZF9zdWJzZWM7Ci0gIGNoYXIgKnBmcmFnOwotICBpbnQgYWxpZ24yOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAvKiBqdXN0IGFmdGVyIG5hbWUgaXMgbm93ICdcMCcgKi8KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lOiByZXN0IG9mIGxpbmUgaWdub3JlZC4iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJCS8qIHNraXAgJywnICovCi0gIGlmICgoc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLkNPTU1vbiBsZW5ndGggKCVsZC4pIDwwISBJZ25vcmVkLiIpLCAobG9uZykgc2l6ZSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBUaGUgdGhpcmQgYXJndW1lbnQgdG8gLmxjb21tIGlzIHRoZSBhbGlnbm1lbnQuICAqLwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgYWxpZ24gPSA4OwotICBlbHNlCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKGFsaWduIDw9IDApCi0JewotCSAgYXNfd2FybiAoXygiaWdub3JpbmcgYmFkIGFsaWdubWVudCIpKTsKLQkgIGFsaWduID0gODsKLQl9Ci0gICAgfQotCi0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0KLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgISBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgYCVzJy4iKSwKLQkgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICYmIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAodmFsdWVUKSBzaXplKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiTGVuZ3RoIG9mIC5sY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iKSwKLQkgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSwKLQkgICAgICAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLAotCSAgICAgIChsb25nKSBzaXplKTsKLQotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogYWxsb2NhdGVfYnNzOiAqLwotICBvbGRfc2VjID0gbm93X3NlZzsKLSAgb2xkX3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0gIGlmIChhbGlnbikKLSAgICB7Ci0gICAgICAvKiBjb252ZXJ0IHRvIGEgcG93ZXIgb2YgMiBhbGlnbm1lbnQgKi8KLSAgICAgIGZvciAoYWxpZ24yID0gMDsgKGFsaWduICYgMSkgPT0gMDsgYWxpZ24gPj49IDEsICsrYWxpZ24yKTsKLSAgICAgIGlmIChhbGlnbiAhPSAxKQotCXsKLQkgIGFzX2JhZCAoXygiQ29tbW9uIGFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgYWxpZ24yID0gMDsKLQotICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VjdGlvbiwgYWxpZ24yKTsKLSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIDApOwotICBpZiAoYWxpZ24yKQotICAgIGZyYWdfYWxpZ24gKGFsaWduMiwgMCwgMCk7Ci0gIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VjdGlvbikKLSAgICBzeW1ib2xQLT5zeV9mcmFnLT5mcl9zeW1ib2wgPSAwOwotICBzeW1ib2xQLT5zeV9mcmFnID0gZnJhZ19ub3c7Ci0gIHBmcmFnID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgc3ltYm9sUCwgc2l6ZSwKLQkJICAgIChjaGFyICopIDApOwotICAqcGZyYWcgPSAwOwotICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYnNzX3NlY3Rpb24pOwotICBzdWJzZWdfc2V0IChvbGRfc2VjLCBvbGRfc3Vic2VjKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVmFsaWRhdGUgYW55IHJlbG9jYXRpb25zIGVtaXR0ZWQgZm9yIC1tcmVsb2NhdGFibGUsIHBvc3NpYmx5IGFkZGluZwotICAgZml4dXBzIGZvciB3b3JkIHJlbG9jYXRpb25zIGluIHdyaXRhYmxlIHNlZ21lbnRzLCBzbyB3ZSBjYW4gYWRqdXN0Ci0gICB0aGVtIGF0IHJ1bnRpbWUuICAqLwotc3RhdGljIHZvaWQKLXBwY19lbGZfdmFsaWRhdGVfZml4IChmaXhwLCBzZWcpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIHNlZ1Qgc2VnOwotewotICBpZiAoZml4cC0+ZnhfZG9uZSB8fCBmaXhwLT5meF9wY3JlbCkKLSAgICByZXR1cm47Ci0KLSAgc3dpdGNoIChzaGxpYikKLSAgICB7Ci0gICAgY2FzZSBTSExJQl9OT05FOgotICAgIGNhc2UgU0hMSUJfUElDOgotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBTSElMQl9NUkVMT0NBVEFCTEU6Ci0gICAgICBpZiAoZml4cC0+Znhfcl90eXBlIDw9IEJGRF9SRUxPQ19VTlVTRUQKLQkgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfMTZfR09UT0ZGCi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0hJMTZfR09UT0ZGCi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0xPMTZfR09UT0ZGCi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYKLQkgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfMzJfQkFTRVJFTAotCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19MTzE2X0JBU0VSRUwKLQkgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkxNl9CQVNFUkVMCi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMCi0JICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5nb3QyIikgIT0gMAotCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuZHRvcnMiKSAhPSAwCi0JICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5jdG9ycyIpICE9IDAKLQkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLmZpeHVwIikgIT0gMAotCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuc3RhYiIpICE9IDAKLQkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLmdjY19leGNlcHRfdGFibGUiKSAhPSAwCi0JICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5laF9mcmFtZSIpICE9IDAKLQkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLmV4X3NoYXJlZCIpICE9IDApCi0JewotCSAgaWYgKChzZWctPmZsYWdzICYgKFNFQ19SRUFET05MWSB8IFNFQ19DT0RFKSkgIT0gMAotCSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfQ1RPUikKLQkgICAgewotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICBfKCJSZWxvY2F0aW9uIGNhbm5vdCBiZSBkb25lIHdoZW4gdXNpbmcgLW1yZWxvY2F0YWJsZSIpKTsKLQkgICAgfQotCX0KLSAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0jZW5kaWYgLyogT0JKX0VMRiAqLwotDAotI2lmZGVmIFRFX1BFCi0KLS8qCi0gKiBTdW1tYXJ5IG9mIHBhcnNlX3RvY19lbnRyeSgpLgotICoKLSAqIGluOglJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIHRoZSAnWycgaW4gb25lIG9mOgotICoKLSAqICAgICAgICBbdG9jXSBbdG9jdl0gW3RvYzMyXSBbdG9jNjRdCi0gKgotICogICAgICBBbnl0aGluZyBlbHNlIGlzIGFuIGVycm9yIG9mIG9uZSBraW5kIG9yIGFub3RoZXIuCi0gKgotICogb3V0OgkKLSAqICAgcmV0dXJuIHZhbHVlOiBzdWNjZXNzIG9yIGZhaWx1cmUKLSAqICAgdG9jX2tpbmQ6ICAgICBraW5kIG9mIHRvYyByZWZlcmVuY2UKLSAqICAgaW5wdXRfbGluZV9wb2ludGVyOgotICogICAgIHN1Y2Nlc3M6IGZpcnN0IGNoYXIgYWZ0ZXIgdGhlICddJwotICogICAgIGZhaWx1cmU6IHVuY2hhbmdlZAotICoKLSAqIHNldHRpbmdzOgotICoKLSAqICAgICBbdG9jXSAgIC0gcnYgPT0gc3VjY2VzcywgdG9jX2tpbmQgPSBkZWZhdWx0X3RvYwotICogICAgIFt0b2N2XSAgLSBydiA9PSBzdWNjZXNzLCB0b2Nfa2luZCA9IGRhdGFfaW5fdG9jCi0gKiAgICAgW3RvYzMyXSAtIHJ2ID09IHN1Y2Nlc3MsIHRvY19raW5kID0gbXVzdF9iZV8zMgotICogICAgIFt0b2M2NF0gLSBydiA9PSBzdWNjZXNzLCB0b2Nfa2luZCA9IG11c3RfYmVfNjQKLSAqCi0gKi8KLQotZW51bSB0b2Nfc2l6ZV9xdWFsaWZpZXIgCi17IAotICBkZWZhdWx0X3RvYywgLyogVGhlIHRvYyBjZWxsIGNvbnN0cnVjdGVkIHNob3VsZCBiZSB0aGUgc3lzdGVtIGRlZmF1bHQgc2l6ZSAqLwotICBkYXRhX2luX3RvYywgLyogVGhpcyBpcyBhIGRpcmVjdCByZWZlcmVuY2UgdG8gYSB0b2MgY2VsbCAgICAgICAgICAgICAgICAgICAqLwotICBtdXN0X2JlXzMyLCAgLyogVGhlIHRvYyBjZWxsIGNvbnN0cnVjdGVkIG11c3QgYmUgMzIgYml0cyB3aWRlICAgICAgICAgICAgICAqLwotICBtdXN0X2JlXzY0ICAgLyogVGhlIHRvYyBjZWxsIGNvbnN0cnVjdGVkIG11c3QgYmUgNjQgYml0cyB3aWRlICAgICAgICAgICAgICAqLwotfTsKLQotc3RhdGljIGludAotcGFyc2VfdG9jX2VudHJ5KHRvY19raW5kKQotICAgICBlbnVtIHRvY19zaXplX3F1YWxpZmllciAqdG9jX2tpbmQ7Ci17Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyICp0b2Nfc3BlYzsKLSAgY2hhciBjOwotICBlbnVtIHRvY19zaXplX3F1YWxpZmllciB0OwotCi0gIC8qIHNhdmUgdGhlIGlucHV0X2xpbmVfcG9pbnRlciAqLwotICBzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAvKiBza2lwIG92ZXIgdGhlICdbJyAsIGFuZCB3aGl0ZXNwYWNlICovCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIAotICAvKiBmaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICB0b2Nfc3BlYyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGlmIChzdHJjbXAodG9jX3NwZWMsICJ0b2MiKSA9PSAwKSAKLSAgICB7Ci0gICAgICB0ID0gZGVmYXVsdF90b2M7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAodG9jX3NwZWMsICJ0b2N2IikgPT0gMCkgCi0gICAgewotICAgICAgdCA9IGRhdGFfaW5fdG9jOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wKHRvY19zcGVjLCAidG9jMzIiKSA9PSAwKSAKLSAgICB7Ci0gICAgICB0ID0gbXVzdF9iZV8zMjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCh0b2Nfc3BlYywgInRvYzY0IikgPT0gMCkgCi0gICAgewotICAgICAgdCA9IG11c3RfYmVfNjQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3I6IGludmFsaWQgdG9jIHNwZWNpZmllciBgJXMnIiksIHRvY19zcGVjKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBub3cgZmluZCB0aGUgJ10nICovCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7CSAgICAgLyogbGVhZGluZyB3aGl0ZXNwYWNlIGNvdWxkIGJlIHRoZXJlLiAqLwotICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOyAvKiBpbnB1dF9saW5lX3BvaW50ZXItPnBhc3QgY2hhciBpbiBjLiAqLwotCi0gIGlmIChjICE9ICddJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvcjogZXhwZWN0ZWQgYF0nLCBmb3VuZCAgYCVjJyIpLCBjKTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAqdG9jX2tpbmQgPSB0OyAgICAgICAgICAgICAvKiBzZXQgcmV0dXJuIHZhbHVlICovCi0gIHJldHVybiAxOwotfQotI2VuZGlmCi0MCi0KLS8qIFdlIG5lZWQgdG8ga2VlcCBhIGxpc3Qgb2YgZml4dXBzLiAgV2UgY2FuJ3Qgc2ltcGx5IGdlbmVyYXRlIHRoZW0gYXMKLSAgIHdlIGdvLCBiZWNhdXNlIHRoYXQgd291bGQgcmVxdWlyZSB1cyB0byBmaXJzdCBjcmVhdGUgdGhlIGZyYWcsIGFuZAotICAgdGhhdCB3b3VsZCBzY3JldyB1cCByZWZlcmVuY2VzIHRvIGBgLicnLiAgKi8KLQotc3RydWN0IHBwY19maXh1cAotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGludCBvcGluZGV4OwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci19OwotCi0jZGVmaW5lIE1BWF9JTlNOX0ZJWFVQUyAoNSkKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmb3IgZWFjaCBpbnN0cnVjdGlvbiB0byBiZSBhc3NlbWJsZWQuICAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnM7Ci0gIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSAqb3Bjb2RlOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXhfcHRyOwotICBpbnQgc2tpcF9vcHRpb25hbDsKLSAgaW50IG5lZWRfcGFyZW47Ci0gIGludCBuZXh0X29waW5kZXg7Ci0gIHN0cnVjdCBwcGNfZml4dXAgZml4dXBzW01BWF9JTlNOX0ZJWFVQU107Ci0gIGludCBmYzsKLSAgY2hhciAqZjsKLSAgaW50IGk7Ci0jaWZkZWYgT0JKX0VMRgotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0jZW5kaWYKLQotICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0gIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJyAmJiAhIGlzc3BhY2UgKCpzKTsgcysrKQotICAgIDsKLSAgaWYgKCpzICE9ICdcMCcpCi0gICAgKnMrKyA9ICdcMCc7Ci0KLSAgLyogTG9vayB1cCB0aGUgb3Bjb2RlIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgb3Bjb2RlID0gKGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSAqKSBoYXNoX2ZpbmQgKHBwY19oYXNoLCBzdHIpOwotICBpZiAob3Bjb2RlID09IChjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyAqbWFjcm87Ci0KLSAgICAgIG1hY3JvID0gKGNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvICopIGhhc2hfZmluZCAocHBjX21hY3JvX2hhc2gsIHN0cik7Ci0gICAgICBpZiAobWFjcm8gPT0gKGNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvICopIE5VTEwpCi0JYXNfYmFkIChfKCJVbnJlY29nbml6ZWQgb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgICBlbHNlCi0JcHBjX21hY3JvIChzLCBtYWNybyk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zbiA9IG9wY29kZS0+b3Bjb2RlOwotCi0gIHN0ciA9IHM7Ci0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICArK3N0cjsKLQotICAvKiBQb3dlclBDIG9wZXJhbmRzIGFyZSBqdXN0IGV4cHJlc3Npb25zLiAgVGhlIG9ubHkgcmVhbCBpc3N1ZSBpcwotICAgICB0aGF0IGEgZmV3IG9wZXJhbmQgdHlwZXMgYXJlIG9wdGlvbmFsLiAgQWxsIGNhc2VzIHdoaWNoIG1pZ2h0IHVzZQotICAgICBhbiBvcHRpb25hbCBvcGVyYW5kIHNlcGFyYXRlIHRoZSBvcGVyYW5kcyBvbmx5IHdpdGggY29tbWFzIChpbgotICAgICBzb21lIGNhc2VzIHBhcmVudGhlc2VzIGFyZSB1c2VkLCBhcyBpbiBgYGx3eiAxLDAoMSknJyBidXQgc3VjaAotICAgICBjYXNlcyBuZXZlciBoYXZlIG9wdGlvbmFsIG9wZXJhbmRzKS4gIFRoZXJlIGlzIG5ldmVyIG1vcmUgdGhhbgotICAgICBvbmUgb3B0aW9uYWwgb3BlcmFuZCBmb3IgYW4gaW5zdHJ1Y3Rpb24uICBTbywgYmVmb3JlIHdlIHN0YXJ0Ci0gICAgIHNlcmlvdXNseSBwYXJzaW5nIHRoZSBvcGVyYW5kcywgd2UgY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW4KLSAgICAgb3B0aW9uYWwgb3BlcmFuZCwgYW5kLCBpZiB3ZSBkbywgd2UgY291bnQgdGhlIG51bWJlciBvZiBjb21tYXMgdG8KLSAgICAgc2VlIHdoZXRoZXIgdGhlIG9wZXJhbmQgc2hvdWxkIGJlIG9taXR0ZWQuICAqLwotICBza2lwX29wdGlvbmFsID0gMDsKLSAgZm9yIChvcGluZGV4X3B0ciA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGluZGV4X3B0ciAhPSAwOyBvcGluZGV4X3B0cisrKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgKm9wZXJhbmQ7Ci0KLSAgICAgIG9wZXJhbmQgPSAmcG93ZXJwY19vcGVyYW5kc1sqb3BpbmRleF9wdHJdOwotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX09QVElPTkFMKSAhPSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBvcGNvdW50OwotCi0JICAvKiBUaGVyZSBpcyBhbiBvcHRpb25hbCBvcGVyYW5kLiAgQ291bnQgdGhlIG51bWJlciBvZgotCSAgICAgY29tbWFzIGluIHRoZSBpbnB1dCBsaW5lLiAgKi8KLQkgIGlmICgqc3RyID09ICdcMCcpCi0JICAgIG9wY291bnQgPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3Bjb3VudCA9IDE7Ci0JICAgICAgcyA9IHN0cjsKLQkgICAgICB3aGlsZSAoKHMgPSBzdHJjaHIgKHMsICcsJykpICE9IChjaGFyICopIE5VTEwpCi0JCXsKLQkJICArK29wY291bnQ7Ci0JCSAgKytzOwotCQl9Ci0JICAgIH0KLQotCSAgLyogSWYgdGhlcmUgYXJlIGZld2VyIG9wZXJhbmRzIGluIHRoZSBsaW5lIHRoZW4gYXJlIGNhbGxlZAotCSAgICAgZm9yIGJ5IHRoZSBpbnN0cnVjdGlvbiwgd2Ugd2FudCB0byBza2lwIHRoZSBvcHRpb25hbAotCSAgICAgb3BlcmFuZC4gICovCi0JICBpZiAob3Bjb3VudCA8IHN0cmxlbiAob3Bjb2RlLT5vcGVyYW5kcykpCi0JICAgIHNraXBfb3B0aW9uYWwgPSAxOwotCi0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIEdhdGhlciB0aGUgb3BlcmFuZHMuICAqLwotICBuZWVkX3BhcmVuID0gMDsKLSAgbmV4dF9vcGluZGV4ID0gMDsKLSAgZmMgPSAwOwotICBmb3IgKG9waW5kZXhfcHRyID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXhfcHRyICE9IDA7IG9waW5kZXhfcHRyKyspCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgICAgIGNoYXIgKmhvbGQ7Ci0gICAgICBleHByZXNzaW9uUyBleDsKLSAgICAgIGNoYXIgZW5kYzsKLQotICAgICAgaWYgKG5leHRfb3BpbmRleCA9PSAwKQotCW9wZXJhbmQgPSAmcG93ZXJwY19vcGVyYW5kc1sqb3BpbmRleF9wdHJdOwotICAgICAgZWxzZQotCXsKLQkgIG9wZXJhbmQgPSAmcG93ZXJwY19vcGVyYW5kc1tuZXh0X29waW5kZXhdOwotCSAgbmV4dF9vcGluZGV4ID0gMDsKLQl9Ci0KLSAgICAgIGVycm1zZyA9IE5VTEw7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBmYWtlIG9wZXJhbmQsIHRoZW4gd2UgZG8gbm90IGV4cGVjdCBhbnl0aGluZwotCSBmcm9tIHRoZSBpbnB1dC4gICovCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfRkFLRSkgIT0gMCkKLQl7Ci0JICBpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCAwTCwgJmVycm1zZyk7Ci0JICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICopIE5VTEwpCi0JICAgIGFzX2JhZCAoZXJybXNnKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBpcyBhbiBvcHRpb25hbCBvcGVyYW5kLCBhbmQgd2UgYXJlIHNraXBwaW5nIGl0LCBqdXN0Ci0JIGluc2VydCBhIHplcm8uICAqLwotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX09QVElPTkFMKSAhPSAwCi0JICAmJiBza2lwX29wdGlvbmFsKQotCXsKLQkgIGlmIChvcGVyYW5kLT5pbnNlcnQpCi0JICAgIHsKLQkgICAgICBpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCAwTCwgJmVycm1zZyk7Ci0JICAgICAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQotCQlhc19iYWQgKGVycm1zZyk7Ci0JICAgIH0KLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9ORVhUKSAhPSAwKQotCSAgICBuZXh0X29waW5kZXggPSAqb3BpbmRleF9wdHIgKyAxOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHYXRoZXIgdGhlIG9wZXJhbmQuICAqLwotICAgICAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotI2lmZGVmIFRFX1BFCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnWycpIAotCXsKLQkgIC8qIFdlIGFyZSBleHBlY3Rpbmcgc29tZXRoaW5nIGxpa2UgdGhlIHNlY29uZCBhcmd1bWVudCBoZXJlOgotCi0JICAgICAgICBsd3ogcjQsW3RvY10uR1MuMC5zdGF0aWNfaW50KHJ0b2MpCi0gICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgotCSAgICAgVGhlIGFyZ3VtZW50IGZvbGxvd2luZyB0aGUgYF0nIG11c3QgYmUgYSBzeW1ib2wgbmFtZSwgYW5kIHRoZSAKLSAgICAgICAgICAgICByZWdpc3RlciBtdXN0IGJlIHRoZSB0b2MgcmVnaXN0ZXI6ICdydG9jJyBvciAnMicKLQotCSAgICAgVGhlIGVmZmVjdCBpcyB0byAwIGFzIHRoZSBkaXNwbGFjZW1lbnQgZmllbGQKLQkgICAgIGluIHRoZSBpbnN0cnVjdGlvbiwgYW5kIGlzc3VlIGFuIElNQUdFX1JFTF9QUENfVE9DUkVMMTYgKG9yCi0JICAgICB0aGUgYXBwcm9wcmlhdGUgdmFyaWF0aW9uKSByZWxvYyBhZ2FpbnN0IGl0IGJhc2VkIG9uIHRoZSBzeW1ib2wuCi0JICAgICBUaGUgbGlua2VyIHdpbGwgYnVpbGQgdGhlIHRvYywgYW5kIGluc2VydCB0aGUgcmVzb2x2ZWQgdG9jIG9mZnNldC4KLQotCSAgICAgTm90ZToKLQkgICAgIG8gVGhlIHNpemUgb2YgdGhlIHRvYyBlbnRyeSBpcyBjdXJyZW50bHkgYXNzdW1lZCB0byBiZQotCSAgICAgICAzMiBiaXRzLiBUaGlzIHNob3VsZCBub3QgYmUgYXNzdW1lZCB0byBiZSBhIGhhcmQgY29kZWQKLQkgICAgICAgbnVtYmVyLgotCSAgICAgbyBJbiBhbiBlZmZvcnQgdG8gY29wZSB3aXRoIGEgY2hhbmdlIGZyb20gMzIgdG8gNjQgYml0cywKLQkgICAgICAgdGhlcmUgYXJlIGFsc28gdG9jIGVudHJpZXMgdGhhdCBhcmUgc3BlY2lmaWVkIHRvIGJlCi0JICAgICAgIGVpdGhlciAzMiBvciA2NCBiaXRzOgotICAgICAgICAgICAgICAgICBsd3ogcjQsW3RvYzMyXS5HUy4wLnN0YXRpY19pbnQocnRvYykKLQkgICAgICAgICBsd3ogcjQsW3RvYzY0XS5HUy4wLnN0YXRpY19pbnQocnRvYykKLQkgICAgICAgVGhlc2UgZGVtYW5kIHRvYyBlbnRyaWVzIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSwgYW5kIHRoZQotCSAgICAgICBpbnN0cnVjdGlvbiBwcm9iYWJseSByZXF1aXJlcyBpdC4KLSAgICAgICAgICAqLwotCi0JICBpbnQgdmFsaWRfdG9jOwotCSAgZW51bSB0b2Nfc2l6ZV9xdWFsaWZpZXIgdG9jX2tpbmQ7Ci0JICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgdG9jX3JlbG9jOwotCi0JICAvKiBnbyBwYXJzZSBvZmYgdGhlIFt0b2NYWF0gcGFydCAqLwotCSAgdmFsaWRfdG9jID0gcGFyc2VfdG9jX2VudHJ5KCZ0b2Nfa2luZCk7Ci0KLQkgIGlmICghdmFsaWRfdG9jKSAKLQkgICAgewotCSAgICAgIC8qIE5vdGU6IG1lc3NhZ2UgaGFzIGFscmVhZHkgYmVlbiBpc3N1ZWQuICAgICAqLwotCSAgICAgIC8qIEZJWE1FOiB3aGF0IHNvcnQgb2YgcmVjb3Zlcnkgc2hvdWxkIHdlIGRvPyAqLwotCSAgICAgIC8qICAgICAgICBkZW1hbmRfcmVzdF9vZl9saW5lKCk7IHJldHVybjsgPyAgICAqLwotCSAgICB9Ci0KLQkgIC8qIE5vdyBnZXQgdGhlIHN5bWJvbCBmb2xsb3dpbmcgdGhlICddJyAqLwotCSAgZXhwcmVzc2lvbigmZXgpOwotCi0JICBzd2l0Y2ggKHRvY19raW5kKQotCSAgICB7Ci0JICAgIGNhc2UgZGVmYXVsdF90b2M6Ci0JICAgICAgLyogSW4gdGhpcyBjYXNlLCB3ZSBtYXkgbm90IGhhdmUgc2VlbiB0aGUgc3ltYm9sIHlldCwgc2luY2UgICovCi0JICAgICAgLyogaXQgaXMgYWxsb3dlZCB0byBhcHBlYXIgb24gYSAuZXh0ZXJuIG9yIC5nbG9ibCBvciBqdXN0IGJlICovCi0JICAgICAgLyogYSBsYWJlbCBpbiB0aGUgLmRhdGEgc2VjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JICAgICAgdG9jX3JlbG9jID0gQkZEX1JFTE9DX1BQQ19UT0MxNjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBkYXRhX2luX3RvYzoKLQkgICAgICAvKiAxLiBUaGUgc3ltYm9sIG11c3QgYmUgZGVmaW5lZCBhbmQgZWl0aGVyIGluIHRoZSB0b2MgICAgICAgICovCi0JICAgICAgLyogICAgc2VjdGlvbiwgb3IgYSBnbG9iYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgICAgIC8qIDIuIFRoZSByZWxvYyBnZW5lcmF0ZWQgbXVzdCBoYXZlIHRoZSBUT0NERUZOIGZsYWcgc2V0IGluICAgKi8KLQkgICAgICAvKiAgICB1cHBlciBiaXQgbWVzcyBvZiB0aGUgcmVsb2MgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0JICAgICAgLyogRklYTUU6IEl0J3MgYSBsaXR0bGUgY29uZnVzaW5nIHdoYXQgdGhlIHRvY3YgcXVhbGlmaWVyIGNhbiAqLwotCSAgICAgIC8qICAgICAgICBiZSB1c2VkIGZvci4gQXQgdGhlIHZlcnkgbGVhc3QsIEkndmUgc2VlbiB0aHJlZSAgICAgKi8KLQkgICAgICAvKiAgICAgICAgdXNlcywgb25seSBvbmUgb2Ygd2hpY2ggSSdtIHN1cmUgSSBjYW4gZXhwbGFpbi4gICAgICovCi0JICAgICAgaWYgKGV4Llhfb3AgPT0gT19zeW1ib2wpIAotCQl7CQkgIAotCQkgIGFzc2VydCAoZXguWF9hZGRfc3ltYm9sICE9IE5VTEwpOwotCQkgIGlmIChleC5YX2FkZF9zeW1ib2wtPmJzeW0tPnNlY3Rpb24gIT0gdG9jZGF0YV9zZWN0aW9uKQotCQkgICAgewotCQkgICAgICBhc19iYWQoXygiW3RvY3ZdIHN5bWJvbCBpcyBub3QgYSB0b2Mgc3ltYm9sIikpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICB0b2NfcmVsb2MgPSBCRkRfUkVMT0NfUFBDX1RPQzE2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIG11c3RfYmVfMzI6Ci0JICAgICAgLyogRklYTUU6IHRoZXNlIG5leHQgdHdvIHNwZWNpZmljYWxseSBzcGVjaWZ5IDMyLzY0IGJpdCB0b2MgICAqLwotCSAgICAgIC8qICAgICAgICBlbnRyaWVzLiBXZSBkb24ndCBzdXBwb3J0IHRoZW0gdG9kYXkuIElzIHRoaXMgdGhlICAgKi8KLQkgICAgICAvKiAgICAgICAgcmlnaHQgd2F5IHRvIHNheSB0aGF0PyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JICAgICAgdG9jX3JlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKLQkgICAgICBhc19iYWQgKF8oIlVuaW1wbGVtZW50ZWQgdG9jMzIgZXhwcmVzc2lvbiBtb2RpZmllciIpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBtdXN0X2JlXzY0OgotCSAgICAgIC8qIEZJWE1FOiBzZWUgYWJvdmUgKi8KLQkgICAgICB0b2NfcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgICAgIGFzX2JhZCAoXygiVW5pbXBsZW1lbnRlZCB0b2M2NCBleHByZXNzaW9uIG1vZGlmaWVyIikpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGZwcmludGYoc3RkZXJyLCAKLQkJICAgICAgXygiVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgWyVkXSBmcm9tIHBhcnNlX3RvY19lbnRyeSFcbiIpLAotCQkgICAgICB0b2Nfa2luZCk7Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIHRoaXMgZXhwcmVzc2lvbi4gICovCi0JICBpZiAoZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCi0JICBmaXh1cHNbZmNdLnJlbG9jID0gdG9jX3JlbG9jOwotCSAgZml4dXBzW2ZjXS5leHAgPSBleDsKLQkgIGZpeHVwc1tmY10ub3BpbmRleCA9ICpvcGluZGV4X3B0cjsKLQkgICsrZmM7Ci0KLSAgICAgICAgICAvKiBPay4gV2UndmUgc2V0IHVwIHRoZSBmaXh1cCBmb3IgdGhlIGluc3RydWN0aW9uLiBOb3cgbWFrZSBpdAotCSAgICAgbG9vayBsaWtlIHRoZSBjb25zdGFudCAwIHdhcyBmb3VuZCBoZXJlICovCi0JICBleC5YX3Vuc2lnbmVkID0gMTsKLQkgIGV4Llhfb3AgPSBPX2NvbnN0YW50OwotCSAgZXguWF9hZGRfbnVtYmVyID0gMDsKLQkgIGV4LlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICBleC5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JfQotCi0gICAgICBlbHNlCi0jZW5kaWYJCS8qIFRFX1BFICovCi0JewotCSAgaWYgKCEgcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkgICAgewotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9DUikgIT0gMCkKLQkJY3Jfb3BlcmFuZCA9IHRydWU7Ci0JICAgICAgZXhwcmVzc2lvbiAoJmV4KTsKLQkgICAgICBjcl9vcGVyYW5kID0gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0KLSAgICAgIGlmIChleC5YX29wID09IE9faWxsZWdhbCkKLQlhc19iYWQgKF8oImlsbGVnYWwgb3BlcmFuZCIpKTsKLSAgICAgIGVsc2UgaWYgKGV4Llhfb3AgPT0gT19hYnNlbnQpCi0JYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0gICAgICBlbHNlIGlmIChleC5YX29wID09IE9fcmVnaXN0ZXIpCi0JewotCSAgaW5zbiA9IHBwY19pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgZXguWF9hZGRfbnVtYmVyLAotCQkJCSAgICAgKGNoYXIgKikgTlVMTCwgMCk7Ci0JfQotICAgICAgZWxzZSBpZiAoZXguWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLSNpZmRlZiBPQkpfRUxGCi0JICAvKiBBbGxvdyBASEEsIEBMLCBASCBvbiBjb25zdGFudHMuICovCi0JICBjaGFyICpvcmlnX3N0ciA9IHN0cjsKLQotCSAgaWYgKChyZWxvYyA9IHBwY19lbGZfc3VmZml4ICgmc3RyLCAmZXgpKSAhPSBCRkRfUkVMT0NfVU5VU0VEKQotCSAgICBzd2l0Y2ggKHJlbG9jKQotCSAgICAgIHsKLQkgICAgICBkZWZhdWx0OgotCQlzdHIgPSBvcmlnX3N0cjsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIEJGRF9SRUxPQ19MTzE2OgotCQkvKiBYX3Vuc2lnbmVkIGlzIHRoZSBkZWZhdWx0LCBzbyBpZiB0aGUgdXNlciBoYXMgZG9uZQotICAgICAgICAgICAgICAgICAgIHNvbWV0aGluZyB3aGljaCBjbGVhcmVkIGl0LCB3ZSBhbHdheXMgcHJvZHVjZSBhCi0gICAgICAgICAgICAgICAgICAgc2lnbmVkIHZhbHVlLiAgKi8KLQkJaWYgKGV4LlhfdW5zaWduZWQKLQkJICAgICYmIChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1NJR05FRCkgPT0gMCkKLQkJICBleC5YX2FkZF9udW1iZXIgJj0gMHhmZmZmOwotCQllbHNlCi0JCSAgZXguWF9hZGRfbnVtYmVyID0gKCgoZXguWF9hZGRfbnVtYmVyICYgMHhmZmZmKQotCQkJCSAgICAgIF4gMHg4MDAwKQotCQkJCSAgICAgLSAweDgwMDApOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQkZEX1JFTE9DX0hJMTY6Ci0JCWV4LlhfYWRkX251bWJlciA9IChleC5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKLQkJZXguWF9hZGRfbnVtYmVyID0gKCgoZXguWF9hZGRfbnVtYmVyID4+IDE2KSAmIDB4ZmZmZikKLQkJCQkgICArICgoZXguWF9hZGRfbnVtYmVyID4+IDE1KSAmIDEpKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotI2VuZGlmCi0JICBpbnNuID0gcHBjX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCBleC5YX2FkZF9udW1iZXIsCi0JCQkJICAgICAoY2hhciAqKSBOVUxMLCAwKTsKLQl9Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgZWxzZSBpZiAoKHJlbG9jID0gcHBjX2VsZl9zdWZmaXggKCZzdHIsICZleCkpICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0JewotCSAgLyogRm9yIHRoZSBhYnNvdWx0ZSBmb3JtcyBvZiBicmFuY2hzLCBjb252ZXJ0IHRoZSBQQyByZWxhdGl2ZSBmb3JtIGJhY2sgaW50bwotCSAgICAgdGhlIGFic29sdXRlLiAgKi8KLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9BQlNPTFVURSkgIT0gMCkKLQkgICAgewotCSAgICAgIHN3aXRjaCAocmVsb2MpCi0JCXsKLQkJY2FzZSBCRkRfUkVMT0NfUFBDX0IyNjoKLQkJICByZWxvYyA9IEJGRF9SRUxPQ19QUENfQkEyNjsKLQkJICBicmVhazsKLQkJY2FzZSBCRkRfUkVMT0NfUFBDX0IxNjoKLQkJICByZWxvYyA9IEJGRF9SRUxPQ19QUENfQkExNjsKLQkJICBicmVhazsKLQkJY2FzZSBCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOOgotCQkgIHJlbG9jID0gQkZEX1JFTE9DX1BQQ19CQTE2X0JSVEFLRU47Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU46Ci0JCSAgcmVsb2MgPSBCRkRfUkVMT0NfUFBDX0JBMTZfQlJOVEFLRU47Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIHRoaXMgZXhwcmVzc2lvbi4gICovCi0JICBpZiAoZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCSAgZml4dXBzW2ZjXS5leHAgPSBleDsKLQkgIGZpeHVwc1tmY10ub3BpbmRleCA9IDA7Ci0JICBmaXh1cHNbZmNdLnJlbG9jID0gcmVsb2M7Ci0JICArK2ZjOwotCX0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIHRoaXMgZXhwcmVzc2lvbi4gICovCi0JICBpZiAoZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCSAgZml4dXBzW2ZjXS5leHAgPSBleDsKLQkgIGZpeHVwc1tmY10ub3BpbmRleCA9ICpvcGluZGV4X3B0cjsKLQkgIGZpeHVwc1tmY10ucmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgKytmYzsKLQl9Ci0KLSAgICAgIGlmIChuZWVkX3BhcmVuKQotCXsKLQkgIGVuZGMgPSAnKSc7Ci0JICBuZWVkX3BhcmVuID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9QQVJFTlMpICE9IDApCi0JewotCSAgZW5kYyA9ICcoJzsKLQkgIG5lZWRfcGFyZW4gPSAxOwotCX0KLSAgICAgIGVsc2UKLQllbmRjID0gJywnOwotCi0gICAgICAvKiBUaGUgY2FsbCB0byBleHByZXNzaW9uIHNob3VsZCBoYXZlIGFkdmFuY2VkIHN0ciBwYXN0IGFueQotCSB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIGlmICgqc3RyICE9IGVuZGMKLQkgICYmIChlbmRjICE9ICcsJyB8fCAqc3RyICE9ICdcMCcpKQotCXsKLQkgIGFzX2JhZCAoXygic3ludGF4IGVycm9yOyBmb3VuZCBgJWMnIGJ1dCBleHBlY3RlZCBgJWMnIiksICpzdHIsIGVuZGMpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoKnN0ciAhPSAnXDAnKQotCSsrc3RyOwotICAgIH0KLQotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgKytzdHI7Ci0KLSAgaWYgKCpzdHIgIT0gJ1wwJykKLSAgICBhc19iYWQgKF8oImp1bmsgYXQgZW5kIG9mIGxpbmU6IGAlcyciKSwgc3RyKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgZiA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgNCk7Ci0KLSAgLyogQ3JlYXRlIGFueSBmaXh1cHMuICBBdCB0aGlzIHBvaW50IHdlIGRvIG5vdCB1c2UgYQotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUsIGJ1dCBpbnN0ZWFkIGp1c3QgdXNlIHRoZQotICAgICBCRkRfUkVMT0NfVU5VU0VEIHBsdXMgdGhlIG9wZXJhbmQgaW5kZXguICBUaGlzIGxldHMgdXMgZWFzaWx5Ci0gICAgIGhhbmRsZSBmaXh1cHMgZm9yIGFueSBvcGVyYW5kIHR5cGUsIGFsdGhvdWdoIHRoYXQgaXMgYWRtaXR0ZWRseQotICAgICBub3QgYSB2ZXJ5IGV4Y2l0aW5nIGZlYXR1cmUuICBXZSBwaWNrIGEgQkZEIHJlbG9jIHR5cGUgaW4KLSAgICAgbWRfYXBwbHlfZml4LiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGZjOyBpKyspCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCAqb3BlcmFuZDsKLQotICAgICAgb3BlcmFuZCA9ICZwb3dlcnBjX29wZXJhbmRzW2ZpeHVwc1tpXS5vcGluZGV4XTsKLSAgICAgIGlmIChmaXh1cHNbaV0ucmVsb2MgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLQl7Ci0JICByZWxvY19ob3d0b190eXBlICpyZWxvY19ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXh1cHNbaV0ucmVsb2MpOwotCSAgaW50IHNpemU7Ci0JICBpbnQgb2Zmc2V0OwotCSAgZml4UyAqZml4UDsKLQotCSAgaWYgKCFyZWxvY19ob3d0bykKLQkgICAgYWJvcnQgKCk7Ci0KLQkgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvKTsKLQkgIG9mZnNldCA9IHRhcmdldF9iaWdfZW5kaWFuID8gKDQgLSBzaXplKSA6IDA7Ci0KLQkgIGlmIChzaXplIDwgMSB8fCBzaXplID4gNCkKLQkgICAgYWJvcnQoKTsKLQotCSAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgb2Zmc2V0LCBzaXplLAotCQkJICAgICAgJmZpeHVwc1tpXS5leHAsIHJlbG9jX2hvd3RvLT5wY19yZWxhdGl2ZSwKLQkJCSAgICAgIGZpeHVwc1tpXS5yZWxvYyk7Ci0KLQkgIC8qIFR1cm4gb2ZmIGNvbXBsYWludHMgdGhhdCB0aGUgYWRkZW5kIGlzIHRvbyBsYXJnZSBmb3IgdGhpbmdzIGxpa2UKLQkgICAgIGZvbysxMDAwMDBAaGEuICAqLwotCSAgc3dpdGNoIChmaXh1cHNbaV0ucmVsb2MpCi0JICAgIHsKLQkgICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UT0ZGOgotCSAgICBjYXNlIEJGRF9SRUxPQ19QUENfVE9DMTY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX0hJMTY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKLQkgICAgICBmaXhQLT5meF9ub19vdmVyZmxvdyA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDQsCi0JCSAgICAgJmZpeHVwc1tpXS5leHAsCi0JCSAgICAgKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUkVMQVRJVkUpICE9IDAsCi0JCSAgICAgKChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpCi0JCSAgICAgICAoZml4dXBzW2ldLm9waW5kZXggKyAoaW50KSBCRkRfUkVMT0NfVU5VU0VEKSkpOwotICAgIH0KLX0KLQotLyogSGFuZGxlIGEgbWFjcm8uICBHYXRoZXIgYWxsIHRoZSBvcGVyYW5kcywgdHJhbnNmb3JtIHRoZW0gYXMKLSAgIGRlc2NyaWJlZCBieSB0aGUgbWFjcm8sIGFuZCBjYWxsIG1kX2Fzc2VtYmxlIHJlY3Vyc2l2ZWx5LiAgQWxsIHRoZQotICAgb3BlcmFuZHMgYXJlIHNlcGFyYXRlZCBieSBjb21tYXM7IHdlIGRvbid0IGFjY2VwdCBwYXJlbnRoZXNlcwotICAgYXJvdW5kIG9wZXJhbmRzIGhlcmUuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX21hY3JvIChzdHIsIG1hY3JvKQotICAgICBjaGFyICpzdHI7Ci0gICAgIGNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvICptYWNybzsKLXsKLSAgY2hhciAqb3BlcmFuZHNbMTBdOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGNoYXIgKnM7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0gIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgaW50IGFyZzsKLSAgY2hhciAqc2VuZDsKLSAgY2hhciAqY29tcGxldGU7Ci0KLSAgLyogR2F0aGVyIHRoZSB1c2VycyBvcGVyYW5kcyBpbnRvIHRoZSBvcGVyYW5kcyBhcnJheS4gICovCi0gIGNvdW50ID0gMDsKLSAgcyA9IHN0cjsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaWYgKGNvdW50ID49IHNpemVvZiBvcGVyYW5kcyAvIHNpemVvZiBvcGVyYW5kc1swXSkKLQlicmVhazsKLSAgICAgIG9wZXJhbmRzW2NvdW50KytdID0gczsKLSAgICAgIHMgPSBzdHJjaHIgKHMsICcsJyk7Ci0gICAgICBpZiAocyA9PSAoY2hhciAqKSBOVUxMKQotCWJyZWFrOwotICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgfSAgCi0KLSAgaWYgKGNvdW50ICE9IG1hY3JvLT5vcGVyYW5kcykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIndyb25nIG51bWJlciBvZiBvcGVyYW5kcyIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogV29yayBvdXQgaG93IGxhcmdlIHRoZSBzdHJpbmcgbXVzdCBiZSAodGhlIHNpemUgaXMgdW5ib3VuZGVkCi0gICAgIGJlY2F1c2UgaXQgaW5jbHVkZXMgdXNlciBpbnB1dCkuICAqLwotICBsZW4gPSAwOwotICBmb3JtYXQgPSBtYWNyby0+Zm9ybWF0OwotICB3aGlsZSAoKmZvcm1hdCAhPSAnXDAnKQotICAgIHsKLSAgICAgIGlmICgqZm9ybWF0ICE9ICclJykKLQl7Ci0JICArK2xlbjsKLQkgICsrZm9ybWF0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhcmcgPSBzdHJ0b2wgKGZvcm1hdCArIDEsICZzZW5kLCAxMCk7Ci0JICBrbm93IChzZW5kICE9IGZvcm1hdCAmJiBhcmcgPj0gMCAmJiBhcmcgPCBjb3VudCk7Ci0JICBsZW4gKz0gc3RybGVuIChvcGVyYW5kc1thcmddKTsKLQkgIGZvcm1hdCA9IHNlbmQ7Ci0JfQotICAgIH0KLQotICAvKiBQdXQgdGhlIHN0cmluZyB0b2dldGhlci4gICovCi0gIGNvbXBsZXRlID0gcyA9IChjaGFyICopIGFsbG9jYSAobGVuICsgMSk7Ci0gIGZvcm1hdCA9IG1hY3JvLT5mb3JtYXQ7Ci0gIHdoaWxlICgqZm9ybWF0ICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKCpmb3JtYXQgIT0gJyUnKQotCSpzKysgPSAqZm9ybWF0Kys7Ci0gICAgICBlbHNlCi0JewotCSAgYXJnID0gc3RydG9sIChmb3JtYXQgKyAxLCAmc2VuZCwgMTApOwotCSAgc3RyY3B5IChzLCBvcGVyYW5kc1thcmddKTsKLQkgIHMgKz0gc3RybGVuIChzKTsKLQkgIGZvcm1hdCA9IHNlbmQ7Ci0JfQotICAgIH0KLSAgKnMgPSAnXDAnOwotCi0gIC8qIEFzc2VtYmxlIHRoZSBjb25zdHJ1Y3RlZCBpbnN0cnVjdGlvbi4gICovCi0gIG1kX2Fzc2VtYmxlIChjb21wbGV0ZSk7Ci19ICAKLQwKLSNpZmRlZiBPQkpfRUxGCi0vKiBGb3IgRUxGLCBhZGQgc3VwcG9ydCBmb3IgU0hGX0VYQ0xVREUgYW5kIFNIVF9PUkRFUkVEICovCi0KLWludAotcHBjX3NlY3Rpb25fbGV0dGVyIChsZXR0ZXIsIHB0cl9tc2cpCi0gICAgIGludCBsZXR0ZXI7Ci0gICAgIGNoYXIgKipwdHJfbXNnOwotewotICBpZiAobGV0dGVyID09ICdlJykKLSAgICByZXR1cm4gU0hGX0VYQ0xVREU7Ci0KLSAgKnB0cl9tc2cgPSBfKCJCYWQgLnNlY3Rpb24gZGlyZWN0aXZlOiB3YW50IGEsdyx4LGUgaW4gc3RyaW5nIik7Ci0gIHJldHVybiAwOwotfQotCi1pbnQKLXBwY19zZWN0aW9uX3dvcmQgKHB0cl9zdHIpCi0gICAgIGNoYXIgKipwdHJfc3RyOwotewotICBpZiAoc3RybmNtcCAoKnB0cl9zdHIsICJleGNsdWRlIiwgc2l6ZW9mICgiZXhjbHVkZSIpLTEpID09IDApCi0gICAgewotICAgICAgKnB0cl9zdHIgKz0gc2l6ZW9mICgiZXhjbHVkZSIpLTE7Ci0gICAgICByZXR1cm4gU0hGX0VYQ0xVREU7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1pbnQKLXBwY19zZWN0aW9uX3R5cGUgKHB0cl9zdHIpCi0gICAgIGNoYXIgKipwdHJfc3RyOwotewotICBpZiAoc3RybmNtcCAoKnB0cl9zdHIsICJvcmRlcmVkIiwgc2l6ZW9mICgib3JkZXJlZCIpLTEpID09IDApCi0gICAgewotICAgICAgKnB0cl9zdHIgKz0gc2l6ZW9mICgib3JkZXJlZCIpLTE7Ci0gICAgICByZXR1cm4gU0hUX09SREVSRUQ7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1pbnQKLXBwY19zZWN0aW9uX2ZsYWdzIChmbGFncywgYXR0ciwgdHlwZSkKLSAgICAgaW50IGZsYWdzOwotICAgICBpbnQgYXR0cjsKLSAgICAgaW50IHR5cGU7Ci17Ci0gIGlmICh0eXBlID09IFNIVF9PUkRFUkVEKQotICAgIGZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1NPUlRfRU5UUklFUzsKLQotICBpZiAoYXR0ciAmIFNIRl9FWENMVURFKQotICAgIGZsYWdzIHw9IFNFQ19FWENMVURFOwotCi0gIHJldHVybiBmbGFnczsKLX0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0KLQwKLS8qIFBzZXVkby1vcCBoYW5kbGluZy4gICovCi0KLS8qIFRoZSAuYnl0ZSBwc2V1ZG8tb3AuICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIG5vcm1hbCAuYnl0ZQotICAgcHNldWRvLW9wLCBidXQgaXQgY2FuIGFsc28gdGFrZSBhIHNpbmdsZSBBU0NJSSBzdHJpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2J5dGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wiJykKLSAgICB7Ci0gICAgICBjb25zICgxKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogR2F0aGVyIGNoYXJhY3RlcnMuICBBIHJlYWwgZG91YmxlIHF1b3RlIGlzIGRvdWJsZWQuICBVbnVzdWFsCi0gICAgIGNoYXJhY3RlcnMgYXJlIG5vdCBwZXJtaXR0ZWQuICAqLwotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY2hhciBjOwotCi0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCi0gICAgICBpZiAoYyA9PSAnXCInKQotCXsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcIicpCi0JICAgIGJyZWFrOwotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotCi0gICAgICBGUkFHX0FQUEVORF8xX0NIQVIgKGMpOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotI2lmZGVmIE9CSl9YQ09GRgotCi0vKiBYQ09GRiBzcGVjaWZpYyBwc2V1ZG8tb3AgaGFuZGxpbmcuICAqLwotCi0vKiBUaGlzIGlzIHNldCBpZiB3ZSBhcmUgY3JlYXRpbmcgYSAuc3RhYnggc3ltYm9sLCBzaW5jZSB3ZSBkb24ndCB3YW50Ci0gICB0byBoYW5kbGUgc3ltYm9sIHN1ZmZpeGVzIGZvciBzdWNoIHN5bWJvbHMuICAqLwotc3RhdGljIGJvb2xlYW4gcHBjX3N0YWJfc3ltYm9sOwotCi0vKiBUaGUgLmNvbW0gYW5kIC5sY29tbSBwc2V1ZG8tb3BzIGZvciBYQ09GRi4gIFhDT0ZGIHB1dHMgY29tbW9uCi0gICBzeW1ib2xzIGluIHRoZSAuYnNzIHNlZ21lbnQgYXMgdGhvdWdoIHRoZXkgd2VyZSBsb2NhbCBjb21tb24KLSAgIHN5bWJvbHMsIGFuZCB1c2VzIGEgZGlmZmVyZW50IHNtY2xhcy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfY29tbSAobGNvbW0pCi0gICAgIGludCBsY29tbTsKLXsKLSAgYXNlY3Rpb24gKmN1cnJlbnRfc2VnID0gbm93X3NlZzsKLSAgc3Vic2VnVCBjdXJyZW50X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgZW5kYzsKLSAgY2hhciAqZW5kX25hbWU7Ci0gIG9mZnNldFQgc2l6ZTsKLSAgb2Zmc2V0VCBhbGlnbjsKLSAgc3ltYm9sUyAqbGNvbW1fc3ltID0gTlVMTDsKLSAgc3ltYm9sUyAqc3ltOwotICBjaGFyICpwZnJhZzsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIGVuZF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqZW5kX25hbWUgPSBlbmRjOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3Npbmcgc2l6ZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBzaXplID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmIChzaXplIDwgMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm5lZ2F0aXZlIHNpemUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoISBsY29tbSkKLSAgICB7Ci0gICAgICAvKiBUaGUgdGhpcmQgYXJndW1lbnQgdG8gLmNvbW0gaXMgdGhlIGFsaWdubWVudC4gICovCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0JYWxpZ24gPSAzOwotICAgICAgZWxzZQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIGlmIChhbGlnbiA8PSAwKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiaWdub3JpbmcgYmFkIGFsaWdubWVudCIpKTsKLQkgICAgICBhbGlnbiA9IDM7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqbGNvbW1fbmFtZTsKLSAgICAgIGNoYXIgbGNvbW1fZW5kYzsKLQotICAgICAgaWYgKHNpemUgPD0gMSkKLQlhbGlnbiA9IDA7Ci0gICAgICBlbHNlIGlmIChzaXplIDw9IDIpCi0JYWxpZ24gPSAxOwotICAgICAgZWxzZSBpZiAoc2l6ZSA8PSA0KQotCWFsaWduID0gMjsKLSAgICAgIGVsc2UKLQlhbGlnbiA9IDM7Ci0KLSAgICAgIC8qIFRoZSB0aGlyZCBhcmd1bWVudCB0byAubGNvbW0gYXBwZWFycyB0byBiZSB0aGUgcmVhbCBsb2NhbAotCSBjb21tb24gc3ltYm9sIHRvIGNyZWF0ZS4gIFJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBuYW1lZCBpbgotCSB0aGUgZmlyc3QgYXJndW1lbnQgYXJlIHR1cm5lZCBpbnRvIHJlZmVyZW5jZXMgdG8gdGhlIHRoaXJkCi0JIGFyZ3VtZW50LiAgKi8KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQl7Ci0JICBhc19iYWQgKF8oIm1pc3NpbmcgcmVhbCBzeW1ib2wgbmFtZSIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgIGxjb21tX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBsY29tbV9lbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICAKLSAgICAgIGxjb21tX3N5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKGxjb21tX25hbWUpOwotCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gbGNvbW1fZW5kYzsKLSAgICB9Ci0KLSAgKmVuZF9uYW1lID0gJ1wwJzsKLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICplbmRfbmFtZSA9IGVuZGM7Ci0KLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltKQotICAgICAgfHwgU19HRVRfVkFMVUUgKHN5bSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImF0dGVtcHQgdG8gcmVkZWZpbmUgc3ltYm9sIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCBhbGlnbik7Ci0JICAKLSAgaWYgKCEgbGNvbW0KLSAgICAgIHx8ICEgU19JU19ERUZJTkVEIChsY29tbV9zeW0pKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKmRlZl9zeW07Ci0gICAgICBvZmZzZXRUIGRlZl9zaXplOwotCi0gICAgICBpZiAoISBsY29tbSkKLQl7Ci0JICBkZWZfc3ltID0gc3ltOwotCSAgZGVmX3NpemUgPSBzaXplOwotCSAgU19TRVRfRVhURVJOQUwgKHN5bSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxjb21tX3N5bS0+c3lfdGMub3V0cHV0ID0gMTsKLQkgIGRlZl9zeW0gPSBsY29tbV9zeW07Ci0JICBkZWZfc2l6ZSA9IDA7Ci0JfQotCi0gICAgICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMSk7Ci0gICAgICBmcmFnX2FsaWduIChhbGlnbiwgMCwgMCk7Ci0gIAotICAgICAgZGVmX3N5bS0+c3lfZnJhZyA9IGZyYWdfbm93OwotICAgICAgcGZyYWcgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBkZWZfc3ltLAotCQkJZGVmX3NpemUsIChjaGFyICopIE5VTEwpOwotICAgICAgKnBmcmFnID0gMDsKLSAgICAgIFNfU0VUX1NFR01FTlQgKGRlZl9zeW0sIGJzc19zZWN0aW9uKTsKLSAgICAgIGRlZl9zeW0tPnN5X3RjLmFsaWduID0gYWxpZ247Ci0gICAgfQotICBlbHNlIGlmIChsY29tbSkKLSAgICB7Ci0gICAgICAvKiBBbGlnbiB0aGUgc2l6ZSBvZiBsY29tbV9zeW0uICAqLwotICAgICAgbGNvbW1fc3ltLT5zeV9mcmFnLT5mcl9vZmZzZXQgPQotCSgobGNvbW1fc3ltLT5zeV9mcmFnLT5mcl9vZmZzZXQgKyAoMSA8PCBhbGlnbikgLSAxKQotCSAmfiAoKDEgPDwgYWxpZ24pIC0gMSkpOwotICAgICAgaWYgKGFsaWduID4gbGNvbW1fc3ltLT5zeV90Yy5hbGlnbikKLQlsY29tbV9zeW0tPnN5X3RjLmFsaWduID0gYWxpZ247Ci0gICAgfQotCi0gIGlmIChsY29tbSkKLSAgICB7Ci0gICAgICAvKiBNYWtlIHN5bSBhbiBvZmZzZXQgZnJvbSBsY29tbV9zeW0uICAqLwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltLCBic3Nfc2VjdGlvbik7Ci0gICAgICBzeW0tPnN5X2ZyYWcgPSBsY29tbV9zeW0tPnN5X2ZyYWc7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltLCBsY29tbV9zeW0tPnN5X2ZyYWctPmZyX29mZnNldCk7Ci0gICAgICBsY29tbV9zeW0tPnN5X2ZyYWctPmZyX29mZnNldCArPSBzaXplOwotICAgIH0KLQotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuY3NlY3QgcHNldWRvLW9wLiAgVGhpcyBzd2l0Y2hlcyB1cyBpbnRvIGEgZGlmZmVyZW50Ci0gICBzdWJzZWdtZW50LiAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgc3ltYm9sIHdob3NlIHZhbHVlIGlzIHRoZQotICAgc3RhcnQgb2YgdGhlIC5jc2VjdC4gIEluIENPRkYsIGNzZWN0IHN5bWJvbHMgZ2V0IHNwZWNpYWwgYXV4Ci0gICBlbnRyaWVzIGRlZmluZWQgYnkgdGhlIHhfY3NlY3QgZmllbGQgb2YgdW5pb24gaW50ZXJuYWxfYXV4ZW50LiAgVGhlCi0gICBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIGFsaWdubWVudCAodGhlIGRlZmF1bHQgaXMgMikuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2NzZWN0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgZW5kYzsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOwotCi0gIGlmIChTX0dFVF9OQU1FIChzeW0pWzBdID09ICdcMCcpCi0gICAgewotICAgICAgLyogQW4gdW5uYW1lZCBjc2VjdCBpcyBhc3N1bWVkIHRvIGJlIFtQUl0uICAqLwotICAgICAgc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19QUjsKLSAgICB9Ci0KLSAgcHBjX2NoYW5nZV9jc2VjdCAoc3ltKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBzeW0tPnN5X3RjLmFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIENoYW5nZSB0byBhIGRpZmZlcmVudCBjc2VjdC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfY2hhbmdlX2NzZWN0IChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltKSkKLSAgICBzdWJzZWdfc2V0IChTX0dFVF9TRUdNRU5UIChzeW0pLCBzeW0tPnN5X3RjLnN1YnNlZyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW1ib2xTICoqbGlzdF9wdHI7Ci0gICAgICBpbnQgYWZ0ZXJfdG9jOwotICAgICAgaW50IGhvbGRfY2h1bmtzaXplOwotICAgICAgc3ltYm9sUyAqbGlzdDsKLQotICAgICAgLyogVGhpcyBpcyBhIG5ldyBjc2VjdC4gIFdlIG5lZWQgdG8gbG9vayBhdCB0aGUgc3ltYm9sIGNsYXNzIHRvCi0JIGZpZ3VyZSBvdXQgd2hldGhlciBpdCBzaG91bGQgZ28gaW4gdGhlIHRleHQgc2VjdGlvbiBvciB0aGUKLQkgZGF0YSBzZWN0aW9uLiAgKi8KLSAgICAgIGFmdGVyX3RvYyA9IDA7Ci0gICAgICBzd2l0Y2ggKHN5bS0+c3lfdGMuY2xhc3MpCi0JewotCWNhc2UgWE1DX1BSOgotCWNhc2UgWE1DX1JPOgotCWNhc2UgWE1DX0RCOgotCWNhc2UgWE1DX0dMOgotCWNhc2UgWE1DX1hPOgotCWNhc2UgWE1DX1NWOgotCWNhc2UgWE1DX1RJOgotCWNhc2UgWE1DX1RCOgotCSAgU19TRVRfU0VHTUVOVCAoc3ltLCB0ZXh0X3NlY3Rpb24pOwotCSAgc3ltLT5zeV90Yy5zdWJzZWcgPSBwcGNfdGV4dF9zdWJzZWdtZW50OwotCSAgKytwcGNfdGV4dF9zdWJzZWdtZW50OwotCSAgbGlzdF9wdHIgPSAmcHBjX3RleHRfY3NlY3RzOwotCSAgYnJlYWs7Ci0JY2FzZSBYTUNfUlc6Ci0JY2FzZSBYTUNfVEMwOgotCWNhc2UgWE1DX1RDOgotCWNhc2UgWE1DX0RTOgotCWNhc2UgWE1DX1VBOgotCWNhc2UgWE1DX0JTOgotCWNhc2UgWE1DX1VDOgotCSAgaWYgKHBwY190b2NfY3NlY3QgIT0gTlVMTAotCSAgICAgICYmIHBwY190b2NfY3NlY3QtPnN5X3RjLnN1YnNlZyArIDEgPT0gcHBjX2RhdGFfc3Vic2VnbWVudCkKLQkgICAgYWZ0ZXJfdG9jID0gMTsKLQkgIFNfU0VUX1NFR01FTlQgKHN5bSwgZGF0YV9zZWN0aW9uKTsKLQkgIHN5bS0+c3lfdGMuc3Vic2VnID0gcHBjX2RhdGFfc3Vic2VnbWVudDsKLQkgICsrcHBjX2RhdGFfc3Vic2VnbWVudDsKLQkgIGxpc3RfcHRyID0gJnBwY19kYXRhX2NzZWN0czsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIFdlIHNldCB0aGUgb2JzdGFjayBjaHVuayBzaXplIHRvIGEgc21hbGwgdmFsdWUgYmVmb3JlCi0gICAgICAgICBjaGFuZ2luZyBzdWJzZWdtZW50cywgc28gdGhhdCB3ZSBkb24ndCB1c2UgYSBsb3Qgb2YgbWVtb3J5Ci0gICAgICAgICBzcGFjZSBmb3Igd2hhdCBtYXkgYmUgYSBzbWFsbCBzZWN0aW9uLiAgKi8KLSAgICAgIGhvbGRfY2h1bmtzaXplID0gY2h1bmtzaXplOwotICAgICAgY2h1bmtzaXplID0gNjQ7Ci0KLSAgICAgIHN1YnNlZ19uZXcgKHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltKSksIHN5bS0+c3lfdGMuc3Vic2VnKTsKLQotICAgICAgY2h1bmtzaXplID0gaG9sZF9jaHVua3NpemU7Ci0KLSAgICAgIGlmIChhZnRlcl90b2MpCi0JcHBjX2FmdGVyX3RvY19mcmFnID0gZnJhZ19ub3c7Ci0KLSAgICAgIHN5bS0+c3lfZnJhZyA9IGZyYWdfbm93OwotICAgICAgU19TRVRfVkFMVUUgKHN5bSwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLQotICAgICAgc3ltLT5zeV90Yy5hbGlnbiA9IDI7Ci0gICAgICBzeW0tPnN5X3RjLm91dHB1dCA9IDE7Ci0gICAgICBzeW0tPnN5X3RjLndpdGhpbiA9IHN5bTsKLQkgIAotICAgICAgZm9yIChsaXN0ID0gKmxpc3RfcHRyOwotCSAgIGxpc3QtPnN5X3RjLm5leHQgIT0gKHN5bWJvbFMgKikgTlVMTDsKLQkgICBsaXN0ID0gbGlzdC0+c3lfdGMubmV4dCkKLQk7Ci0gICAgICBsaXN0LT5zeV90Yy5uZXh0ID0gc3ltOwotCSAgCi0gICAgICBzeW1ib2xfcmVtb3ZlIChzeW0sICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgc3ltYm9sX2FwcGVuZCAoc3ltLCBsaXN0LT5zeV90Yy53aXRoaW4sICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgIH0KLQotICBwcGNfY3VycmVudF9jc2VjdCA9IHN5bTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSAudGV4dCBhbmQgLmRhdGEgcHNldWRvLW9wcy4gIFRoZXNlCi0gICBwc2V1ZG8tb3BzIGFyZW4ndCByZWFsbHkgdXNlZCBieSBYQ09GRjsgd2UgaW1wbGVtZW50IHRoZW0gZm9yIHRoZQotICAgY29udmVuaWVuY2Ugb2YgcGVvcGxlIHdobyBhcmVuJ3QgdXNlZCB0byBYQ09GRi4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfc2VjdGlvbiAodHlwZSkKLSAgICAgaW50IHR5cGU7Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBpZiAodHlwZSA9PSAndCcpCi0gICAgbmFtZSA9ICIudGV4dFtQUl0iOwotICBlbHNlIGlmICh0eXBlID09ICdkJykKLSAgICBuYW1lID0gIi5kYXRhW1JXXSI7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLQotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICBwcGNfY2hhbmdlX2NzZWN0IChzeW0pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgLnNlY3Rpb24gcHNldWRvLW9wLiAgVGhpcyBpcyBtb3N0bHkgdG8KLSAgIGdpdmUgYW4gZXJyb3IsIHNpbmNlIFhDT0ZGIG9ubHkgc3VwcG9ydHMgLnRleHQsIC5kYXRhIGFuZCAuYnNzLCBidXQKLSAgIHdlIGRvIHBlcm1pdCB0aGUgdXNlciB0byBuYW1lIHRoZSB0ZXh0IG9yIGRhdGEgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfbmFtZWRfc2VjdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICp1c2VyX25hbWU7Ci0gIGNvbnN0IGNoYXIgKnJlYWxfbmFtZTsKLSAgY2hhciBjOwotICBzeW1ib2xTICpzeW07Ci0KLSAgdXNlcl9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgaWYgKHN0cmNtcCAodXNlcl9uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIHJlYWxfbmFtZSA9ICIudGV4dFtQUl0iOwotICBlbHNlIGlmIChzdHJjbXAgKHVzZXJfbmFtZSwgIi5kYXRhIikgPT0gMCkKLSAgICByZWFsX25hbWUgPSAiLmRhdGFbUlddIjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiVGhlIFhDT0ZGIGZpbGUgZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgYXJiaXRyYXJ5IHNlY3Rpb25zIikpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChyZWFsX25hbWUpOwotCi0gIHBwY19jaGFuZ2VfY3NlY3QgKHN5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5leHRlcm4gcHNldWRvLW9wLiAgV2UgY3JlYXRlIGFuIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2V4dGVybiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGVuZGM7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gICh2b2lkKSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmxnbG9ibCBwc2V1ZG8tb3AuICBLZWVwIHRoZSBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfbGdsb2JsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgZW5kYzsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKLQotICBzeW0tPnN5X3RjLm91dHB1dCA9IDE7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5yZW5hbWUgcHNldWRvLW9wLiAgVGhlIFJTLzYwMDAgYXNzZW1ibGVyIGNhbiByZW5hbWUgc3ltYm9scywKLSAgIGFsdGhvdWdoIEkgZG9uJ3Qga25vdyB3aHkgaXQgYm90aGVycy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfcmVuYW1lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgZW5kYzsKLSAgc3ltYm9sUyAqc3ltOwotICBpbnQgbGVuOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHJlbmFtZSBzdHJpbmciKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgc3ltLT5zeV90Yy5yZWFsX25hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbik7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5zdGFieCBwc2V1ZG8tb3AuICBUaGlzIGlzIHNpbWlsYXIgdG8gYSBub3JtYWwgLnN0YWJzCi0gICBwc2V1ZG8tb3AsIGJ1dCBzbGlnaHRseSBkaWZmZXJlbnQuICBBIHNhbXBsZSBpcwotICAgICAgIC5zdGFieCAibWFpbjpGLTEiLC5tYWluLDE0MiwwCi0gICBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIHN5bWJvbCBuYW1lIHRvIGNyZWF0ZS4gIFRoZSBzZWNvbmQgaXMgdGhlCi0gICB2YWx1ZSwgYW5kIHRoZSB0aGlyZCBpcyB0aGUgc3RvcmFnZSBjbGFzcy4gIFRoZSBmb3VydGggc2VlbXMgdG8gYmUKLSAgIGFsd2F5cyB6ZXJvLCBhbmQgSSBhbSBhc3N1bWluZyBpdCBpcyB0aGUgdHlwZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfc3RhYnggKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGxlbjsKLSAgc3ltYm9sUyAqc3ltOwotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgbmFtZSA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHZhbHVlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgcHBjX3N0YWJfc3ltYm9sID0gdHJ1ZTsKLSAgc3ltID0gc3ltYm9sX21ha2UgKG5hbWUpOwotICBwcGNfc3RhYl9zeW1ib2wgPSBmYWxzZTsKLQotICBzeW0tPnN5X3RjLnJlYWxfbmFtZSA9IG5hbWU7Ci0KLSAgKHZvaWQpIGV4cHJlc3Npb24gKCZleHApOwotCi0gIHN3aXRjaCAoZXhwLlhfb3ApCi0gICAgewotICAgIGNhc2UgT19pbGxlZ2FsOgotICAgIGNhc2UgT19hYnNlbnQ6Ci0gICAgY2FzZSBPX2JpZzoKLSAgICAgIGFzX2JhZCAoXygiaWxsZWdhbCAuc3RhYnggZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIikpOwotICAgICAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW0sICh2YWx1ZVQpIGV4cC5YX2FkZF9udW1iZXIpOwotICAgICAgc3ltLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fc3ltYm9sOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGV4cC5YX2FkZF9zeW1ib2wpID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCXN5bS0+c3lfdmFsdWUgPSBleHA7Ci0gICAgICBlbHNlCi0JewotCSAgU19TRVRfVkFMVUUgKHN5bSwKLQkJICAgICAgIGV4cC5YX2FkZF9udW1iZXIgKyBTX0dFVF9WQUxVRSAoZXhwLlhfYWRkX3N5bWJvbCkpOwotCSAgc3ltLT5zeV9mcmFnID0gZXhwLlhfYWRkX3N5bWJvbC0+c3lfZnJhZzsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBUaGUgdmFsdWUgaXMgc29tZSBjb21wbGV4IGV4cHJlc3Npb24uICBUaGlzIHdpbGwgcHJvYmFibHkKLSAgICAgICAgIGZhaWwgYXQgc29tZSBsYXRlciBwb2ludCwgYnV0IHRoaXMgaXMgcHJvYmFibHkgdGhlIHJpZ2h0Ci0gICAgICAgICB0aGluZyB0byBkbyBoZXJlLiAgKi8KLSAgICAgIHN5bS0+c3lfdmFsdWUgPSBleHA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgU19TRVRfU0VHTUVOVCAoc3ltLCBwcGNfY29mZl9kZWJ1Z19zZWN0aW9uKTsKLSAgc3ltLT5ic3ltLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgY2xhc3MiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHR5cGUiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBTX1NFVF9EQVRBX1RZUEUgKHN5bSwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotCi0gIHN5bS0+c3lfdGMub3V0cHV0ID0gMTsKLQotICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX1NUU1lNKQotICAgIHN5bS0+c3lfdGMud2l0aGluID0gcHBjX2N1cnJlbnRfYmxvY2s7Ci0KLSAgaWYgKGV4cC5YX29wICE9IE9fc3ltYm9sCi0gICAgICB8fCAhIFNfSVNfRVhURVJOQUwgKGV4cC5YX2FkZF9zeW1ib2wpCi0gICAgICB8fCBTX0dFVF9TRUdNRU5UIChleHAuWF9hZGRfc3ltYm9sKSAhPSBic3Nfc2VjdGlvbikKLSAgICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bSwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfYXBwZW5kIChzeW0sIGV4cC5YX2FkZF9zeW1ib2wsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgaWYgKHBwY19jdXJyZW50X2NzZWN0LT5zeV90Yy53aXRoaW4gPT0gZXhwLlhfYWRkX3N5bWJvbCkKLQlwcGNfY3VycmVudF9jc2VjdC0+c3lfdGMud2l0aGluID0gc3ltOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmZ1bmN0aW9uIHBzZXVkby1vcC4gIFRoaXMgdGFrZXMgc2V2ZXJhbCBhcmd1bWVudHMuICBUaGUgZmlyc3QKLSAgIGFyZ3VtZW50IHNlZW1zIHRvIGJlIHRoZSBleHRlcm5hbCBuYW1lIG9mIHRoZSBzeW1ib2wuICBUaGUgc2Vjb25kCi0gICBhcmdtZW50IHNlZW1zIHRvIGJlIHRoZSBsYWJlbCBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4gIGdjYwotICAgdXNlcyB0aGUgc2FtZSBuYW1lIGZvciBib3RoLiAgSSBoYXZlIG5vIGlkZWEgd2hhdCB0aGUgdGhpcmQgYW5kCi0gICBmb3VydGggYXJndW1lbnRzIGFyZSBtZWFudCB0byBiZS4gIFRoZSBvcHRpb25hbCBmaWZ0aCBhcmd1bWVudCBpcwotICAgYW4gZXhwcmVzc2lvbiBmb3IgdGhlIHNpemUgb2YgdGhlIGZ1bmN0aW9uLiAgSW4gQ09GRiB0aGlzIHN5bWJvbAotICAgZ2V0cyBhbiBhdXggZW50cnkgbGlrZSB0aGF0IHVzZWQgZm9yIGEgY3NlY3QuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2Z1bmN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgZW5kYzsKLSAgY2hhciAqczsKLSAgc3ltYm9sUyAqZXh0X3N5bTsKLSAgc3ltYm9sUyAqbGFiX3N5bTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgLyogSWdub3JlIGFueSBbUFJdIHN1ZmZpeC4gICovCi0gIG5hbWUgPSBwcGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChuYW1lKTsKLSAgcyA9IHN0cmNociAobmFtZSwgJ1snKTsKLSAgaWYgKHMgIT0gKGNoYXIgKikgTlVMTAotICAgICAgJiYgc3RyY21wIChzICsgMSwgIlBSXSIpID09IDApCi0gICAgKnMgPSAnXDAnOwotCi0gIGV4dF9zeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHN5bWJvbCBuYW1lIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBsYWJfc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGVuZGM7Ci0KLSAgaWYgKGV4dF9zeW0gIT0gbGFiX3N5bSkKLSAgICB7Ci0gICAgICBleHRfc3ltLT5zeV92YWx1ZS5YX29wID0gT19zeW1ib2w7Ci0gICAgICBleHRfc3ltLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wgPSBsYWJfc3ltOwotICAgICAgZXh0X3N5bS0+c3lfdmFsdWUuWF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXh0X3N5bS0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyID0gMDsKLSAgICB9Ci0KLSAgaWYgKGV4dF9zeW0tPnN5X3RjLmNsYXNzID09IC0xKQotICAgIGV4dF9zeW0tPnN5X3RjLmNsYXNzID0gWE1DX1BSOwotICBleHRfc3ltLT5zeV90Yy5vdXRwdXQgPSAxOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBpZ25vcmU7Ci0KLSAgICAgIC8qIElnbm9yZSB0aGUgdGhpcmQgYXJndW1lbnQuICAqLwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBleHByZXNzaW9uICgmaWdub3JlKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQl7Ci0JICAvKiBJZ25vcmUgdGhlIGZvdXJ0aCBhcmd1bWVudC4gICovCi0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGV4cHJlc3Npb24gKCZpZ25vcmUpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCSAgICB7Ci0JICAgICAgLyogVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSBmdW5jdGlvbiBzaXplLiAgKi8KLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBleHRfc3ltLT5zeV90Yy5zaXplID0gc3ltYm9sX25ldyAoIkwwXDAwMSIsCi0JCQkJCQlhYnNvbHV0ZV9zZWN0aW9uLAotCQkJCQkJKHZhbHVlVCkgMCwKLQkJCQkJCSZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0JICAgICAgcHNldWRvX3NldCAoZXh0X3N5bS0+c3lfdGMuc2l6ZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIFNfU0VUX0RBVEFfVFlQRSAoZXh0X3N5bSwgRFRfRkNOIDw8IE5fQlRTSEZUKTsKLSAgU0ZfU0VUX0ZVTkNUSU9OIChleHRfc3ltKTsKLSAgU0ZfU0VUX1BST0NFU1MgKGV4dF9zeW0pOwotICBjb2ZmX2FkZF9saW5lc3ltIChleHRfc3ltKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmJmIHBzZXVkby1vcC4gIFRoaXMgaXMganVzdCBsaWtlIGEgQ09GRiBDX0ZDTiBzeW1ib2wgbmFtZWQKLSAgICIuYmYiLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19iZiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICpzeW07Ci0KLSAgc3ltID0gc3ltYm9sX21ha2UgKCIuYmYiKTsKLSAgU19TRVRfU0VHTUVOVCAoc3ltLCB0ZXh0X3NlY3Rpb24pOwotICBzeW0tPnN5X2ZyYWcgPSBmcmFnX25vdzsKLSAgU19TRVRfVkFMVUUgKHN5bSwgZnJhZ19ub3dfZml4ICgpKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0ZDTik7Ci0KLSAgY29mZl9saW5lX2Jhc2UgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW0sIDEpOwotICBTQV9TRVRfU1lNX0xOTk8gKHN5bSwgY29mZl9saW5lX2Jhc2UpOwotCi0gIHN5bS0+c3lfdGMub3V0cHV0ID0gMTsKLQotICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmVmIHBzZXVkby1vcC4gIFRoaXMgaXMganVzdCBsaWtlIGEgQ09GRiBDX0ZDTiBzeW1ib2wgbmFtZWQKLSAgICIuZWYiLCBleGNlcHQgdGhhdCB0aGUgbGluZSBudW1iZXIgaXMgYWJzb2x1dGUsIG5vdCByZWxhdGl2ZSB0byB0aGUKLSAgIG1vc3QgcmVjZW50ICIuYmYiIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZWYgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIHN5bSA9IHN5bWJvbF9tYWtlICgiLmVmIik7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bSwgdGV4dF9zZWN0aW9uKTsKLSAgc3ltLT5zeV9mcmFnID0gZnJhZ19ub3c7Ci0gIFNfU0VUX1ZBTFVFIChzeW0sIGZyYWdfbm93X2ZpeCAoKSk7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19GQ04pOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW0sIDEpOwotICBTQV9TRVRfU1lNX0xOTk8gKHN5bSwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICBzeW0tPnN5X3RjLm91dHB1dCA9IDE7Ci0KLSAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5iaSBhbmQgLmVpIHBzZXVkby1vcHMuICBUaGVzZSB0YWtlIGEgc3RyaW5nIGFyZ3VtZW50IGFuZAotICAgZ2VuZXJhdGVzIGEgQ19CSU5DTCBvciBDX0VJTkNMIHN5bWJvbCwgd2hpY2ggZ29lcyBhdCB0aGUgc3RhcnQgb2YKLSAgIHRoZSBzeW1ib2wgbGlzdC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfYmllaSAoZWkpCi0gICAgIGludCBlaTsKLXsKLSAgc3RhdGljIHN5bWJvbFMgKmxhc3RfYmllaTsKLQotICBjaGFyICpuYW1lOwotICBpbnQgbGVuOwotICBzeW1ib2xTICpzeW07Ci0gIHN5bWJvbFMgKmxvb2s7Ci0KLSAgbmFtZSA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuKTsKLQotICAvKiBUaGUgdmFsdWUgb2YgdGhlc2Ugc3ltYm9scyBpcyBhY3R1YWxseSBmaWxlIG9mZnNldC4gIEhlcmUgd2Ugc2V0Ci0gICAgIHRoZSB2YWx1ZSB0byB0aGUgaW5kZXggaW50byB0aGUgbGluZSBudW1iZXIgZW50cmllcy4gIEluCi0gICAgIHBwY19mcm9iX3N5bWJvbHMgd2Ugc2V0IHRoZSBmaXhfbGluZSBmaWVsZCwgd2hpY2ggd2lsbCBjYXVzZSBCRkQKLSAgICAgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nLiAgKi8KLQotICBzeW0gPSBzeW1ib2xfbWFrZSAobmFtZSk7Ci0gIC8qIG9iai1jb2ZmLmMgY3VycmVudGx5IG9ubHkgaGFuZGxlcyBsaW5lIG51bWJlcnMgY29ycmVjdGx5IGluIHRoZQotICAgICAudGV4dCBzZWN0aW9uLiAgKi8KLSAgU19TRVRfU0VHTUVOVCAoc3ltLCB0ZXh0X3NlY3Rpb24pOwotICBTX1NFVF9WQUxVRSAoc3ltLCBjb2ZmX25fbGluZV9ub3MpOwotICBzeW0tPmJzeW0tPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0KLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBlaSA/IENfRUlOQ0wgOiBDX0JJTkNMKTsKLSAgc3ltLT5zeV90Yy5vdXRwdXQgPSAxOwotICAKLSAgZm9yIChsb29rID0gbGFzdF9iaWVpID8gbGFzdF9iaWVpIDogc3ltYm9sX3Jvb3RQOwotICAgICAgIChsb29rICE9IChzeW1ib2xTICopIE5VTEwKLQkmJiAoU19HRVRfU1RPUkFHRV9DTEFTUyAobG9vaykgPT0gQ19GSUxFCi0JICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGxvb2spID09IENfQklOQ0wKLQkgICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAobG9vaykgPT0gQ19FSU5DTCkpOwotICAgICAgIGxvb2sgPSBzeW1ib2xfbmV4dCAobG9vaykpCi0gICAgOwotICBpZiAobG9vayAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bSwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfaW5zZXJ0IChzeW0sIGxvb2ssICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgbGFzdF9iaWVpID0gc3ltOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmJzIHBzZXVkby1vcC4gIFRoaXMgZ2VuZXJhdGVzIGEgQ19CU1RBVCBzeW1ib2wgbmFtZWQgIi5icyIuCi0gICBUaGVyZSBpcyBvbmUgYXJndW1lbnQsIHdoaWNoIGlzIGEgY3NlY3Qgc3ltYm9sLiAgVGhlIHZhbHVlIG9mIHRoZQotICAgLmJzIHN5bWJvbCBpcyB0aGUgaW5kZXggb2YgdGhpcyBjc2VjdCBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2JzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgZW5kYzsKLSAgc3ltYm9sUyAqY3NlY3Q7Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBpZiAocHBjX2N1cnJlbnRfYmxvY2sgIT0gTlVMTCkKLSAgICBhc19iYWQgKF8oIm5lc3RlZCAuYnMgYmxvY2tzIikpOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBjc2VjdCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOwotCi0gIHN5bSA9IHN5bWJvbF9tYWtlICgiLmJzIik7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bSwgbm93X3NlZyk7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19CU1RBVCk7Ci0gIHN5bS0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLSAgc3ltLT5zeV90Yy5vdXRwdXQgPSAxOwotCi0gIHN5bS0+c3lfdGMud2l0aGluID0gY3NlY3Q7Ci0KLSAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0KLSAgcHBjX2N1cnJlbnRfYmxvY2sgPSBzeW07Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5lcyBwc2V1ZG8tb3AuICBHZW5lcmF0ZSBhIENfRVNUQVJUIHN5bWJvbCBuYW1lZCAuZXMuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2VzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBpZiAocHBjX2N1cnJlbnRfYmxvY2sgPT0gTlVMTCkKLSAgICBhc19iYWQgKF8oIi5lcyB3aXRob3V0IHByZWNlZGluZyAuYnMiKSk7Ci0KLSAgc3ltID0gc3ltYm9sX21ha2UgKCIuZXMiKTsKLSAgU19TRVRfU0VHTUVOVCAoc3ltLCBub3dfc2VnKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0VTVEFUKTsKLSAgc3ltLT5ic3ltLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotICBzeW0tPnN5X3RjLm91dHB1dCA9IDE7Ci0KLSAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0KLSAgcHBjX2N1cnJlbnRfYmxvY2sgPSBOVUxMOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuYmIgcHNldWRvLW9wLiAgR2VuZXJhdGUgYSBDX0JMT0NLIHN5bWJvbCBuYW1lZCAuYmIsIHdpdGggYQotICAgbGluZSBudW1iZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2JiIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBzeW0gPSBzeW1ib2xfbWFrZSAoIi5iYiIpOwotICBTX1NFVF9TRUdNRU5UIChzeW0sIHRleHRfc2VjdGlvbik7Ci0gIHN5bS0+c3lfZnJhZyA9IGZyYWdfbm93OwotICBTX1NFVF9WQUxVRSAoc3ltLCBmcmFnX25vd19maXggKCkpOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfQkxPQ0spOwotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bSwgMSk7Ci0gIFNBX1NFVF9TWU1fTE5OTyAoc3ltLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0KLSAgc3ltLT5zeV90Yy5vdXRwdXQgPSAxOwotCi0gIFNGX1NFVF9QUk9DRVNTIChzeW0pOwotCi0gIHBwY19mcm9iX2xhYmVsIChzeW0pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuZWIgcHNldWRvLW9wLiAgR2VuZXJhdGUgYSBDX0JMT0NLIHN5bWJvbCBuYW1lZCAuZWIsIHdpdGggYQotICAgbGluZSBudW1iZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2ViIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBzeW0gPSBzeW1ib2xfbWFrZSAoIi5lYiIpOwotICBTX1NFVF9TRUdNRU5UIChzeW0sIHRleHRfc2VjdGlvbik7Ci0gIHN5bS0+c3lfZnJhZyA9IGZyYWdfbm93OwotICBTX1NFVF9WQUxVRSAoc3ltLCBmcmFnX25vd19maXggKCkpOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfQkxPQ0spOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW0sIDEpOwotICBTQV9TRVRfU1lNX0xOTk8gKHN5bSwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICBzeW0tPnN5X3RjLm91dHB1dCA9IDE7Ci0KLSAgU0ZfU0VUX1BST0NFU1MgKHN5bSk7Ci0KLSAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5iYyBwc2V1ZG8tb3AuICBUaGlzIGp1c3QgY3JlYXRlcyBhIENfQkNPTU0gc3ltYm9sIHdpdGggYQotICAgc3BlY2lmaWVkIG5hbWUuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2JjIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBsZW47Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBuYW1lID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4pOwotICBzeW0gPSBzeW1ib2xfbWFrZSAobmFtZSk7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bSwgcHBjX2NvZmZfZGVidWdfc2VjdGlvbik7Ci0gIHN5bS0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0JDT01NKTsKLSAgU19TRVRfVkFMVUUgKHN5bSwgMCk7Ci0gIHN5bS0+c3lfdGMub3V0cHV0ID0gMTsKLQotICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmVjIHBzZXVkby1vcC4gIFRoaXMganVzdCBjcmVhdGVzIGEgQ19FQ09NTSBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2VjIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBzeW0gPSBzeW1ib2xfbWFrZSAoIi5lYyIpOwotICBTX1NFVF9TRUdNRU5UIChzeW0sIHBwY19jb2ZmX2RlYnVnX3NlY3Rpb24pOwotICBzeW0tPmJzeW0tPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19FQ09NTSk7Ci0gIFNfU0VUX1ZBTFVFIChzeW0sIDApOwotICBzeW0tPnN5X3RjLm91dHB1dCA9IDE7Ci0KLSAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC50b2MgcHNldWRvLW9wLiAgU3dpdGNoIHRvIHRoZSAudG9jIHN1YnNlZ21lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX3RvYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAocHBjX3RvY19jc2VjdCAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHN1YnNlZ19zZXQgKGRhdGFfc2VjdGlvbiwgcHBjX3RvY19jc2VjdC0+c3lfdGMuc3Vic2VnKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN1YnNlZ1Qgc3Vic2VnOwotICAgICAgc3ltYm9sUyAqc3ltOwotICAgICAgc3ltYm9sUyAqbGlzdDsKLSAgICAKLSAgICAgIHN1YnNlZyA9IHBwY19kYXRhX3N1YnNlZ21lbnQ7Ci0gICAgICArK3BwY19kYXRhX3N1YnNlZ21lbnQ7Ci0KLSAgICAgIHN1YnNlZ19uZXcgKHNlZ21lbnRfbmFtZSAoZGF0YV9zZWN0aW9uKSwgc3Vic2VnKTsKLSAgICAgIHBwY190b2NfZnJhZyA9IGZyYWdfbm93OwotCi0gICAgICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlICgiVE9DW1RDMF0iKTsKLSAgICAgIHN5bS0+c3lfZnJhZyA9IGZyYWdfbm93OwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltLCBkYXRhX3NlY3Rpb24pOwotICAgICAgU19TRVRfVkFMVUUgKHN5bSwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLSAgICAgIHN5bS0+c3lfdGMuc3Vic2VnID0gc3Vic2VnOwotICAgICAgc3ltLT5zeV90Yy5vdXRwdXQgPSAxOwotICAgICAgc3ltLT5zeV90Yy53aXRoaW4gPSBzeW07Ci0KLSAgICAgIHBwY190b2NfY3NlY3QgPSBzeW07Ci0JICAKLSAgICAgIGZvciAobGlzdCA9IHBwY19kYXRhX2NzZWN0czsKLQkgICBsaXN0LT5zeV90Yy5uZXh0ICE9IChzeW1ib2xTICopIE5VTEw7Ci0JICAgbGlzdCA9IGxpc3QtPnN5X3RjLm5leHQpCi0JOwotICAgICAgbGlzdC0+c3lfdGMubmV4dCA9IHN5bTsKLQotICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIHN5bWJvbF9hcHBlbmQgKHN5bSwgbGlzdC0+c3lfdGMud2l0aGluLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICB9Ci0KLSAgcHBjX2N1cnJlbnRfY3NlY3QgPSBwcGNfdG9jX2NzZWN0OwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSBBSVggYXNzZW1ibGVyIGF1dG9tYXRpY2FsbHkgYWxpZ25zIHRoZSBvcGVyYW5kcyBvZiBhIC5sb25nIG9yCi0gICAuc2hvcnQgcHNldWRvLW9wLCBhbmQgd2Ugd2FudCB0byBiZSBjb21wYXRpYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY194Y29mZl9jb25zIChsb2dfc2l6ZSkKLSAgICAgaW50IGxvZ19zaXplOwotewotICBmcmFnX2FsaWduIChsb2dfc2l6ZSwgMCwgMCk7Ci0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIGxvZ19zaXplKTsKLSAgY29ucyAoMSA8PCBsb2dfc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcGNfdmJ5dGUgKGR1bW15KQotICAgICBpbnQgZHVtbXk7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgaW50IGJ5dGVfY291bnQ7Ci0KLSAgKHZvaWQpIGV4cHJlc3Npb24gKCZleHApOwotCi0gIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibm9uLWNvbnN0YW50IGJ5dGUgY291bnQiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGJ5dGVfY291bnQgPSBleHAuWF9hZGRfbnVtYmVyOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgdmFsdWUiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBjb25zIChieXRlX2NvdW50KTsKLX0KLQotI2VuZGlmIC8qIE9CSl9YQ09GRiAqLwotDAotLyogVGhlIC50YyBwc2V1ZG8tb3AuICBUaGlzIGlzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIGVpdGhlciBYQ09GRiBvcgotICAgRUxGLiAgVGhpcyB0YWtlcyB0d28gb3IgbW9yZSBhcmd1bWVudHMuCi0KLSAgIFdoZW4gZ2VuZXJhdGluZyBYQ09GRiBvdXRwdXQsIHRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgbmFtZSB0bwotICAgZ2l2ZSB0byB0aGlzIGxvY2F0aW9uIGluIHRoZSB0b2M7IHRoaXMgd2lsbCBiZSBhIHN5bWJvbCB3aXRoIGNsYXNzCi0gICBUQy4gIFRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMgYXJlIDQgYnl0ZSB2YWx1ZXMgdG8gYWN0dWFsbHkgcHV0IGF0Ci0gICB0aGlzIGxvY2F0aW9uIGluIHRoZSBUT0M7IG9mdGVuIHRoZXJlIGlzIGp1c3Qgb25lIG1vcmUgYXJndW1lbnQsIGEKLSAgIHJlbG9jYXRlYWJsZSBzeW1ib2wgcmVmZXJlbmNlLgotCi0gICBXaGVuIG5vdCBnZW5lcmF0aW5nIFhDT0ZGIG91dHB1dCwgdGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUsIGJ1dAotICAgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHNpbXBseSBpZ25vcmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY190YyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotI2lmZGVmIE9CSl9YQ09GRgotCi0gIC8qIERlZmluZSB0aGUgVE9DIHN5bWJvbCBuYW1lLiAgKi8KLSAgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgY2hhciBlbmRjOwotICAgIHN5bWJvbFMgKnN5bTsKLQotICAgIGlmIChwcGNfdG9jX2NzZWN0ID09IChzeW1ib2xTICopIE5VTEwKLQl8fCBwcGNfdG9jX2NzZWN0ICE9IHBwY19jdXJyZW50X2NzZWN0KQotICAgICAgewotCWFzX2JhZCAoXygiLnRjIG5vdCBpbiAudG9jIHNlY3Rpb24iKSk7Ci0JaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0KLSAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGVuZGM7Ci0KLSAgICBpZiAoU19JU19ERUZJTkVEIChzeW0pKQotICAgICAgewotCXN5bWJvbFMgKmxhYmVsOwotCi0JbGFiZWwgPSBwcGNfY3VycmVudF9jc2VjdC0+c3lfdGMud2l0aGluOwotCWlmIChsYWJlbC0+c3lfdGMuY2xhc3MgIT0gWE1DX1RDMCkKLQkgIHsKLQkgICAgYXNfYmFkIChfKCIudGMgd2l0aCBubyBsYWJlbCIpKTsKLQkgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgICAgcmV0dXJuOwotCSAgfQotCi0JU19TRVRfU0VHTUVOVCAobGFiZWwsIFNfR0VUX1NFR01FTlQgKHN5bSkpOwotCWxhYmVsLT5zeV9mcmFnID0gc3ltLT5zeV9mcmFnOwotCVNfU0VUX1ZBTFVFIChsYWJlbCwgU19HRVRfVkFMVUUgKHN5bSkpOwotCi0Jd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLQlyZXR1cm47Ci0gICAgICB9Ci0KLSAgICBTX1NFVF9TRUdNRU5UIChzeW0sIG5vd19zZWcpOwotICAgIHN5bS0+c3lfZnJhZyA9IGZyYWdfbm93OwotICAgIFNfU0VUX1ZBTFVFIChzeW0sICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0gICAgc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19UQzsKLSAgICBzeW0tPnN5X3RjLm91dHB1dCA9IDE7Ci0KLSAgICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKLSAgfQotCi0jZWxzZSAvKiAhIGRlZmluZWQgKE9CSl9YQ09GRikgKi8KLQotICAvKiBTa2lwIHRoZSBUT0Mgc3ltYm9sIG5hbWUuICAqLwotICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lICgqaW5wdXRfbGluZV9wb2ludGVyKQotCSB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICdbJwotCSB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICddJwotCSB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICd7JwotCSB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICd9JykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICAvKiBBbGlnbiB0byBhIGZvdXIgYnl0ZSBib3VuZGFyeS4gICovCi0gIGZyYWdfYWxpZ24gKDIsIDAsIDApOwotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAyKTsKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoT0JKX1hDT0ZGKSAqLwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBlbHNlCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjb25zICg0KTsKLSAgICB9Ci19Ci0MCi0jaWZkZWYgVEVfUEUKLQotLyogUHNldWRvLW9wcyBzcGVjaWZpYyB0byB0aGUgV2luZG93cyBOVCBQb3dlclBDIFBFIChjb2ZmKSBmb3JtYXQgKi8KLQotLyogU2V0IHRoZSBjdXJyZW50IHNlY3Rpb24uICAqLwotc3RhdGljIHZvaWQKLXBwY19zZXRfY3VycmVudF9zZWN0aW9uIChuZXcpCi0gICAgIHNlZ1QgbmV3OwotewotICBwcGNfcHJldmlvdXNfc2VjdGlvbiA9IHBwY19jdXJyZW50X3NlY3Rpb247Ci0gIHBwY19jdXJyZW50X3NlY3Rpb24gPSBuZXc7Ci19Ci0KLS8qIHBzZXVkby1vcDogLnByZXZpb3VzCi0gICBiZWhhdmlvdXI6IHRvZ2dsZXMgdGhlIGN1cnJlbnQgc2VjdGlvbiB3aXRoIHRoZSBwcmV2aW91cyBzZWN0aW9uLgotICAgZXJyb3JzOiAgICBOb25lCi0gICB3YXJuaW5nczogICJObyBwcmV2aW91cyBzZWN0aW9uIgotKi8KLXN0YXRpYyB2b2lkCi1wcGNfcHJldmlvdXMoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICp0bXA7Ci0KLSAgaWYgKHBwY19wcmV2aW91c19zZWN0aW9uID09IE5VTEwpIAotICAgIHsKLSAgICAgIGFzX3dhcm4oXygiTm8gcHJldmlvdXMgc2VjdGlvbiB0byByZXR1cm4gdG8uIERpcmVjdGl2ZSBpZ25vcmVkLiIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3Vic2VnX3NldChwcGNfcHJldmlvdXNfc2VjdGlvbiwgMCk7Ci0KLSAgcHBjX3NldF9jdXJyZW50X3NlY3Rpb24ocHBjX3ByZXZpb3VzX3NlY3Rpb24pOwotfQotCi0vKiBwc2V1ZG8tb3A6IC5wZGF0YQotICAgYmVoYXZpb3VyOiBwcmVkZWZpbmVkIHJlYWQgb25seSBkYXRhIHNlY3Rpb24KLSAgICAgICAgICAgICAgZG91YmxlIHdvcmQgYWxpZ25lZAotICAgZXJyb3JzOiAgICBOb25lCi0gICB3YXJuaW5nczogIE5vbmUKLSAgIGluaXRpYWw6ICAgLnNlY3Rpb24gLnBkYXRhICJhZHIzIgotICAgICAgICAgICAgICBhIC0gZG9uJ3Qga25vdyAtLSBtYXliZSBhIG1pc3ByaW50Ci0JICAgICAgZCAtIGluaXRpYWxpemVkIGRhdGEKLQkgICAgICByIC0gcmVhZGFibGUKLQkgICAgICAzIC0gZG91YmxlIHdvcmQgYWxpZ25lZCAodGhhdCB3b3VsZCBiZSA0IGJ5dGUgYm91bmRhcnkpCi0KLSAgIGNvbW1lbnRhcnk6Ci0gICBUYWcgaW5kZXggdGFibGVzIChhbHNvIGtub3duIGFzIHRoZSBmdW5jdGlvbiB0YWJsZSkgZm9yIGV4Y2VwdGlvbgotICAgaGFuZGxpbmcsIGRlYnVnZ2luZywgZXRjLgotCi0qLwotc3RhdGljIHZvaWQKLXBwY19wZGF0YShpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChwZGF0YV9zZWN0aW9uID09IDApIAotICAgIHsKLSAgICAgIHBkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnBkYXRhIiwgMCk7Ci0gICAgICAKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBwZGF0YV9zZWN0aW9uLAotCQkJICAgICAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MKLQkJCSAgICAgIHwgU0VDX1JFQURPTkxZIHwgU0VDX0RBVEEgKSk7Ci0gICAgICAKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgcGRhdGFfc2VjdGlvbiwgMik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcGRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcoIi5wZGF0YSIsIDApOwotICAgIH0KLSAgcHBjX3NldF9jdXJyZW50X3NlY3Rpb24ocGRhdGFfc2VjdGlvbik7Ci19Ci0KLS8qIHBzZXVkby1vcDogLnlkYXRhCi0gICBiZWhhdmlvdXI6IHByZWRlZmluZWQgcmVhZCBvbmx5IGRhdGEgc2VjdGlvbgotICAgICAgICAgICAgICBkb3VibGUgd29yZCBhbGlnbmVkCi0gICBlcnJvcnM6ICAgIE5vbmUKLSAgIHdhcm5pbmdzOiAgTm9uZQotICAgaW5pdGlhbDogICAuc2VjdGlvbiAueWRhdGEgImRydzMiCi0gICAgICAgICAgICAgIGEgLSBkb24ndCBrbm93IC0tIG1heWJlIGEgbWlzcHJpbnQKLQkgICAgICBkIC0gaW5pdGlhbGl6ZWQgZGF0YQotCSAgICAgIHIgLSByZWFkYWJsZQotCSAgICAgIDMgLSBkb3VibGUgd29yZCBhbGlnbmVkICh0aGF0IHdvdWxkIGJlIDQgYnl0ZSBib3VuZGFyeSkKLSAgIGNvbW1lbnRhcnk6Ci0gICBUYWcgdGFibGVzIChhbHNvIGtub3duIGFzIHRoZSBzY29wZSB0YWJsZSkgZm9yIGV4Y2VwdGlvbiBoYW5kbGluZywKLSAgIGRlYnVnZ2luZywgZXRjLgotKi8KLXN0YXRpYyB2b2lkCi1wcGNfeWRhdGEoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoeWRhdGFfc2VjdGlvbiA9PSAwKSAKLSAgICB7Ci0gICAgICB5ZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi55ZGF0YSIsIDApOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHlkYXRhX3NlY3Rpb24sCi0JCQkgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0JCQkJICAgICAgIHwgU0VDX1JFQURPTkxZIHwgU0VDX0RBVEEgKSk7Ci0KLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgeWRhdGFfc2VjdGlvbiwgMyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgeWRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIueWRhdGEiLCAwKTsKLSAgICB9Ci0gIHBwY19zZXRfY3VycmVudF9zZWN0aW9uKHlkYXRhX3NlY3Rpb24pOwotfQotCi0vKiBwc2V1ZG8tb3A6IC5yZWxkYXRhCi0gICBiZWhhdmlvdXI6IHByZWRlZmluZWQgcmVhZCB3cml0ZSBkYXRhIHNlY3Rpb24KLSAgICAgICAgICAgICAgZG91YmxlIHdvcmQgYWxpZ25lZCAoNC1ieXRlKQotCSAgICAgIEZJWE1FOiByZWxvY2F0aW9uIGlzIGFwcGxpZWQgdG8gaXQKLQkgICAgICBGSVhNRTogd2hhdCdzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgLmRhdGE/Ci0gICBlcnJvcnM6ICAgIE5vbmUKLSAgIHdhcm5pbmdzOiAgTm9uZQotICAgaW5pdGlhbDogICAuc2VjdGlvbiAucmVsZGF0YSAiZHJ3MyIKLQkgICAgICBkIC0gaW5pdGlhbGl6ZWQgZGF0YQotCSAgICAgIHIgLSByZWFkYWJsZQotCSAgICAgIHcgLSB3cml0ZWFibGUKLQkgICAgICAzIC0gZG91YmxlIHdvcmQgYWxpZ25lZCAodGhhdCB3b3VsZCBiZSA4IGJ5dGUgYm91bmRhcnkpCi0KLSAgIGNvbW1lbnRhcnk6Ci0gICBMaWtlIC5kYXRhLCBidXQgaW50ZW5kZWQgdG8gaG9sZCBkYXRhIHN1YmplY3QgdG8gcmVsb2NhdGlvbiwgc3VjaCBhcwotICAgZnVuY3Rpb24gZGVzY3JpcHRvcnMsIGV0Yy4KLSovCi1zdGF0aWMgdm9pZAotcHBjX3JlbGRhdGEoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAocmVsZGF0YV9zZWN0aW9uID09IDApCi0gICAgewotICAgICAgcmVsZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5yZWxkYXRhIiwgMCk7Ci0KLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCByZWxkYXRhX3NlY3Rpb24sCi0JCQkgICAgICggU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgCi0JCQkgICAgICB8IFNFQ19EQVRBICkpOwotCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHJlbGRhdGFfc2VjdGlvbiwgMik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5yZWxkYXRhIiwgMCk7Ci0gICAgfQotICBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbihyZWxkYXRhX3NlY3Rpb24pOwotfQotCi0vKiBwc2V1ZG8tb3A6IC5yZGF0YQotICAgYmVoYXZpb3VyOiBwcmVkZWZpbmVkIHJlYWQgb25seSBkYXRhIHNlY3Rpb24KLSAgICAgICAgICAgICAgZG91YmxlIHdvcmQgYWxpZ25lZAotICAgZXJyb3JzOiAgICBOb25lCi0gICB3YXJuaW5nczogIE5vbmUKLSAgIGluaXRpYWw6ICAgLnNlY3Rpb24gLnJkYXRhICJkcjMiCi0JICAgICAgZCAtIGluaXRpYWxpemVkIGRhdGEKLQkgICAgICByIC0gcmVhZGFibGUKLQkgICAgICAzIC0gZG91YmxlIHdvcmQgYWxpZ25lZCAodGhhdCB3b3VsZCBiZSA0IGJ5dGUgYm91bmRhcnkpCi0qLwotc3RhdGljIHZvaWQKLXBwY19yZGF0YShpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChyZGF0YV9zZWN0aW9uID09IDApCi0gICAgewotICAgICAgcmRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIucmRhdGEiLCAwKTsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCByZGF0YV9zZWN0aW9uLAotCQkJICAgICAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MKLQkJCSAgICAgIHwgU0VDX1JFQURPTkxZIHwgU0VDX0RBVEEgKSk7Ci0KLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgcmRhdGFfc2VjdGlvbiwgMik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIucmRhdGEiLCAwKTsKLSAgICB9Ci0gIHBwY19zZXRfY3VycmVudF9zZWN0aW9uKHJkYXRhX3NlY3Rpb24pOwotfQotCi0vKiBwc2V1ZG8tb3A6IC51YWxvbmcKLSAgIGJlaGF2aW91cjogbXVjaCBsaWtlIC5pbnQsIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IG5vIGFsaWdubWVudCBpcyAKLSAgICAgICAgICAgICAgcGVyZm9ybWVkLgotCSAgICAgIEZJWE1FOiB0ZXN0IHRoZSBhbGlnbm1lbnQgc3RhdGVtZW50Ci0gICBlcnJvcnM6ICAgIE5vbmUKLSAgIHdhcm5pbmdzOiAgTm9uZQotKi8KLXN0YXRpYyB2b2lkCi1wcGNfdWFsb25nKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogdHJ5IGZvciBsb25nICovCi0gIGNvbnMgKCA0ICk7Ci19Ci0KLS8qIHBzZXVkby1vcDogLnpub3AgIDxzeW1ib2wgbmFtZT4KLSAgIGJlaGF2aW91cjogSXNzdWUgYSBub3AgaW5zdHJ1Y3Rpb24KLSAgICAgICAgICAgICAgSXNzdWUgYSBJTUFHRV9SRUxfUFBDX0lGR0xVRSByZWxvY2F0aW9uIGFnYWluc3QgaXQsIHVzaW5nCi0JICAgICAgdGhlIHN1cHBsaWVkIHN5bWJvbCBuYW1lLgotICAgZXJyb3JzOiAgICBOb25lCi0gICB3YXJuaW5nczogIE1pc3Npbmcgc3ltYm9sIG5hbWUKLSovCi1zdGF0aWMgdm9pZAotcHBjX3pub3AoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSAqb3Bjb2RlOwotICBleHByZXNzaW9uUyBleDsKLSAgY2hhciAqZjsKLQotICBzeW1ib2xTICpzeW07Ci0KLSAgLyogU3RyaXAgb3V0IHRoZSBzeW1ib2wgbmFtZSAqLwotICBjaGFyICpzeW1ib2xfbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgZXhwOwotICBmbGFnd29yZCBmbGFnczsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICBzeW1ib2xfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIG5hbWUgPSB4bWFsbG9jIChpbnB1dF9saW5lX3BvaW50ZXIgLSBzeW1ib2xfbmFtZSArIDEpOwotICBzdHJjcHkgKG5hbWUsIHN5bWJvbF9uYW1lKTsKLQotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgLyogTG9vayB1cCB0aGUgb3Bjb2RlIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgb3Bjb2RlID0gKGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSAqKSBoYXNoX2ZpbmQgKHBwY19oYXNoLCAibm9wIik7Ci0KLSAgLyogc3RpY2sgaW4gdGhlIG5vcCAqLwotICBpbnNuID0gb3Bjb2RlLT5vcGNvZGU7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGYgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIDQpOwotICBmaXhfbmV3IChmcmFnX25vdywKLQkgICBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JICAgNCwKLQkgICBzeW0sCi0JICAgMCwKLQkgICAwLAotCSAgIEJGRF9SRUxPQ18xNl9HT1RfUENSRUwpOwotCi19Ci0KLS8qIHBzZXVkby1vcDogCi0gICBiZWhhdmlvdXI6IAotICAgZXJyb3JzOiAgICAKLSAgIHdhcm5pbmdzOiAgCi0qLwotc3RhdGljIHZvaWQKLXBwY19wZV9jb21tKGxjb21tKQotICAgICBpbnQgbGNvbW07Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKm5hbWU7Ci0gIHJlZ2lzdGVyIGNoYXIgYzsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgb2Zmc2V0VCB0ZW1wOwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICBvZmZzZXRUIGFsaWduOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAvKiBqdXN0IGFmdGVyIG5hbWUgaXMgbm93ICdcMCcgKi8KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lOiByZXN0IG9mIGxpbmUgaWdub3JlZC4iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJCS8qIHNraXAgJywnICovCi0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLkNPTU1vbiBsZW5ndGggKCVsZC4pIDwwISBJZ25vcmVkLiIpLCAobG9uZykgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoISBsY29tbSkKLSAgICB7Ci0gICAgICAvKiBUaGUgdGhpcmQgYXJndW1lbnQgdG8gLmNvbW0gaXMgdGhlIGFsaWdubWVudC4gICovCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0JYWxpZ24gPSAzOwotICAgICAgZWxzZQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIGlmIChhbGlnbiA8PSAwKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiaWdub3JpbmcgYmFkIGFsaWdubWVudCIpKTsKLQkgICAgICBhbGlnbiA9IDM7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICpwID0gYzsKLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgISBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgYCVzJy4iKSwKLQkgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gKHZhbHVlVCkgdGVtcCkKLQlhc19iYWQgKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iKSwKLQkJU19HRVRfTkFNRSAoc3ltYm9sUCksCi0JCShsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksCi0JCShsb25nKSB0ZW1wKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgdGVtcCk7Ci0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qCi0gKiBpbXBsZW1lbnQgdGhlIC5zZWN0aW9uIHBzZXVkbyBvcDoKLSAqCS5zZWN0aW9uIG5hbWUgeywgImZsYWdzIn0KLSAqICAgICAgICAgICAgICAgIF4gICAgICAgICBeCi0gKiAgICAgICAgICAgICAgICB8ICAgICAgICAgKy0tLSBvcHRpb25hbCBmbGFnczogJ2InIGZvciBic3MKLSAqICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScgZm9yIGluZm8KLSAqICAgICAgICAgICAgICAgICstLSBzZWN0aW9uIG5hbWUgICAgICAgICAgICAgICAnbCcgZm9yIGxpYgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJyBmb3Igbm9sb2FkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nIGZvciBvdmVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnIGZvciBkYXRhCi0gKgkJCQkJCSAnZCcgKGFwcGFyZW50bHkgbTg4ayBmb3IgZGF0YSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcgZm9yIHRleHQKLSAqIEJ1dCBpZiB0aGUgYXJndW1lbnQgaXMgbm90IGEgcXVvdGVkIHN0cmluZywgdHJlYXQgaXQgYXMgYQotICogc3Vic2VnbWVudCBudW1iZXIuCi0gKgotICogRklYTUU6IHRoaXMgaXMgYSBjb3B5IG9mIHRoZSBzZWN0aW9uIHByb2Nlc3NpbmcgZnJvbSBvYmotY29mZi5jLCB3aXRoCi0gKiBhZGRpdGlvbnMvY2hhbmdlcyBmb3IgdGhlIG1vdG8tcGFzIGFzc2VtYmxlciBzdXBwb3J0LiBUaGVyZSBhcmUgdGhyZWUKLSAqIGNhdGVnb3JpZXM6Ci0gKgotICogRklYTUU6IEkganVzdCBub3RpY2VkIHRoaXMuIFRoaXMgZG9lc24ndCB3b3JrIGF0IGFsbCByZWFsbHkuIEl0IGl0IAotICogICAgICAgIHNldHRpbmcgYml0cyB0aGF0IGJmZCBwcm9iYWJseSBuZWl0aGVyIHVuZGVyc3RhbmRzIG9yIHVzZXMuIFRoZQotICogICAgICAgIGNvcnJlY3QgYXBwcm9hY2ggKD8pIHdpbGwgaGF2ZSB0byBpbmNvcnBvcmF0ZSBleHRyYSBmaWVsZHMgYXR0YWNoZWQKLSAqICAgICAgICB0byB0aGUgc2VjdGlvbiB0byBob2xkIHRoZSBzeXN0ZW0gc3BlY2lmaWMgc3R1ZmYuIChrcmspCi0gKgotICogU2VjdGlvbiBDb250ZW50czoKLSAqICdhJyAtIHVua25vd24gLSByZWZlcnJlZCB0byBpbiBkb2N1bWVudGF0aW9uLCBidXQgbm8gZGVmaW5pdGlvbiBzdXBwbGllZAotICogJ2MnIC0gc2VjdGlvbiBoYXMgY29kZQotICogJ2QnIC0gc2VjdGlvbiBoYXMgaW5pdGlhbGl6ZWQgZGF0YQotICogJ3UnIC0gc2VjdGlvbiBoYXMgdW5pbml0aWFsaXplZCBkYXRhCi0gKiAnaScgLSBzZWN0aW9uIGNvbnRhaW5zIGRpcmVjdGl2ZXMgKGluZm8pCi0gKiAnbicgLSBzZWN0aW9uIGNhbiBiZSBkaXNjYXJkZWQKLSAqICdSJyAtIHJlbW92ZSBzZWN0aW9uIGF0IGxpbmsgdGltZQotICoKLSAqIFNlY3Rpb24gUHJvdGVjdGlvbjoKLSAqICdyJyAtIHNlY3Rpb24gaXMgcmVhZGFibGUKLSAqICd3JyAtIHNlY3Rpb24gaXMgd3JpdGVhYmxlCi0gKiAneCcgLSBzZWN0aW9uIGlzIGV4ZWN1dGFibGUKLSAqICdzJyAtIHNlY3Rpb24gaXMgc2hhcmFibGUKLSAqCi0gKiBTZWN0aW9uIEFsaWdubWVudDoKLSAqICcwJyAtIGFsaWduIHRvIGJ5dGUgYm91bmRhcnkKLSAqICcxJyAtIGFsaWduIHRvIGhhbGZ3b3JkIHVuZGFyeQotICogJzInIC0gYWxpZ24gdG8gd29yZCBib3VuZGFyeQotICogJzMnIC0gYWxpZ24gdG8gZG91Ymxld29yZCBib3VuZGFyeQotICogJzQnIC0gYWxpZ24gdG8gcXVhZHdvcmQgYm91bmRhcnkKLSAqICc1JyAtIGFsaWduIHRvIDMyIGJ5dGUgYm91bmRhcnkKLSAqICc2JyAtIGFsaWduIHRvIDY0IGJ5dGUgYm91bmRhcnkKLSAqCi0gKi8KLQotdm9pZAotcHBjX3BlX3NlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogU3RyaXAgb3V0IHRoZSBzZWN0aW9uIG5hbWUgKi8KLSAgY2hhciAqc2VjdGlvbl9uYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGludCBleHA7Ci0gIGZsYWd3b3JkIGZsYWdzOwotICBzZWdUIHNlYzsKLSAgaW50IGFsaWduOwotCi0gIHNlY3Rpb25fbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIG5hbWUgPSB4bWFsbG9jIChpbnB1dF9saW5lX3BvaW50ZXIgLSBzZWN0aW9uX25hbWUgKyAxKTsKLSAgc3RyY3B5IChuYW1lLCBzZWN0aW9uX25hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBleHAgPSAwOwotICBmbGFncyA9IFNFQ19OT19GTEFHUzsKLQotICBpZiAoc3RyY21wIChuYW1lLCAiLmlkYXRhJDIiKSA9PSAwKQotICAgIHsKLSAgICAgIGFsaWduID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pZGF0YSQzIikgPT0gMCkKLSAgICB7Ci0gICAgICBhbGlnbiA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaWRhdGEkNCIpID09IDApCi0gICAgewotICAgICAgYWxpZ24gPSAyOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmlkYXRhJDUiKSA9PSAwKQotICAgIHsKLSAgICAgIGFsaWduID0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pZGF0YSQ2IikgPT0gMCkKLSAgICB7Ci0gICAgICBhbGlnbiA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgYWxpZ24gPSA0OyAvKiBkZWZhdWx0IGFsaWdubWVudCB0byAxNiBieXRlIGJvdW5kYXJ5ICovCi0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotCWV4cCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgZWxzZQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInCi0JCSAmJiAhIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoKmlucHV0X2xpbmVfcG9pbnRlcikKLQkJewotCQkgIC8qIFNlY3Rpb24gQ29udGVudHMgKi8KLQkJY2FzZSAnYSc6IC8qIHVua25vd24gKi8KLQkJICBhc19iYWQgKF8oIlVuc3VwcG9ydGVkIHNlY3Rpb24gYXR0cmlidXRlIC0tICdhJyIpKTsKLQkJICBicmVhazsKLQkJY2FzZSAnYyc6IC8qIGNvZGUgc2VjdGlvbiAqLwotCQkgIGZsYWdzIHw9IFNFQ19DT0RFOyAKLQkJICBicmVhazsKLQkJY2FzZSAnZCc6IC8qIHNlY3Rpb24gaGFzIGluaXRpYWxpemVkIGRhdGEgKi8KLQkJICBmbGFncyB8PSBTRUNfREFUQTsKLQkJICBicmVhazsKLQkJY2FzZSAndSc6IC8qIHNlY3Rpb24gaGFzIHVuaW5pdGlhbGl6ZWQgZGF0YSAqLwotCQkgIC8qIEZJWE1FOiBUaGlzIGlzIElNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBCi0JCSAgICAgaW4gd2lubnQuaCAqLwotCQkgIGZsYWdzIHw9IFNFQ19ST007Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2knOiAvKiBzZWN0aW9uIGNvbnRhaW5zIGRpcmVjdGl2ZXMgKGluZm8pICovCi0JCSAgLyogRklYTUU6IFRoaXMgaXMgSU1BR0VfU0NOX0xOS19JTkZPCi0JCSAgICAgaW4gd2lubnQuaCAqLwotCQkgIGZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ24nOiAvKiBzZWN0aW9uIGNhbiBiZSBkaXNjYXJkZWQgKi8KLQkJICBmbGFncyAmPX4gU0VDX0xPQUQ7IAotCQkgIGJyZWFrOwotCQljYXNlICdSJzogLyogUmVtb3ZlIHNlY3Rpb24gYXQgbGluayB0aW1lICovCi0JCSAgZmxhZ3MgfD0gU0VDX05FVkVSX0xPQUQ7Ci0JCSAgYnJlYWs7Ci0KLQkJICAvKiBTZWN0aW9uIFByb3RlY3Rpb24gKi8KLQkJY2FzZSAncic6IC8qIHNlY3Rpb24gaXMgcmVhZGFibGUgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fTUVNX1JFQUQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3cnOiAvKiBzZWN0aW9uIGlzIHdyaXRlYWJsZSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fV1JJVEU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3gnOiAvKiBzZWN0aW9uIGlzIGV4ZWN1dGFibGUgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fTUVNX0VYRUNVVEU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3MnOiAvKiBzZWN0aW9uIGlzIHNoYXJhYmxlICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9TSEFSRUQ7Ci0JCSAgYnJlYWs7Ci0KLQkJICAvKiBTZWN0aW9uIEFsaWdubWVudCAqLwotCQljYXNlICcwJzogLyogYWxpZ24gdG8gYnl0ZSBib3VuZGFyeSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9BTElHTl8xQllURVM7Ci0JCSAgYWxpZ24gPSAwOwotCQkgIGJyZWFrOwotCQljYXNlICcxJzogIC8qIGFsaWduIHRvIGhhbGZ3b3JkIGJvdW5kYXJ5ICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX0FMSUdOXzJCWVRFUzsKLQkJICBhbGlnbiA9IDE7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzInOiAgLyogYWxpZ24gdG8gd29yZCBib3VuZGFyeSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9BTElHTl80QllURVM7Ci0JCSAgYWxpZ24gPSAyOwotCQkgIGJyZWFrOwotCQljYXNlICczJzogIC8qIGFsaWduIHRvIGRvdWJsZXdvcmQgYm91bmRhcnkgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fQUxJR05fOEJZVEVTOwotCQkgIGFsaWduID0gMzsKLQkJICBicmVhazsKLQkJY2FzZSAnNCc6ICAvKiBhbGlnbiB0byBxdWFkd29yZCBib3VuZGFyeSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9BTElHTl8xNkJZVEVTOwotCQkgIGFsaWduID0gNDsKLQkJICBicmVhazsKLQkJY2FzZSAnNSc6ICAvKiBhbGlnbiB0byAzMiBieXRlIGJvdW5kYXJ5ICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX0FMSUdOXzMyQllURVM7Ci0JCSAgYWxpZ24gPSA1OwotCQkgIGJyZWFrOwotCQljYXNlICc2JzogIC8qIGFsaWduIHRvIDY0IGJ5dGUgYm91bmRhcnkgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fQUxJR05fNjRCWVRFUzsKLQkJICBhbGlnbiA9IDY7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBhc19iYWQoXygidW5rbm93biBzZWN0aW9uIGF0dHJpYnV0ZSAnJWMnIiksCi0JCQkgKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgfQotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQotCSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0gICAgfQotCi0gIHNlYyA9IHN1YnNlZ19uZXcgKG5hbWUsIChzdWJzZWdUKSBleHApOwotCi0gIHBwY19zZXRfY3VycmVudF9zZWN0aW9uKHNlYyk7Ci0KLSAgaWYgKGZsYWdzICE9IFNFQ19OT19GTEFHUykKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLCBmbGFncykpCi0JYXNfYmFkIChfKCJlcnJvciBzZXR0aW5nIGZsYWdzIGZvciBcIiVzXCI6ICVzIiksCi0JCWJmZF9zZWN0aW9uX25hbWUgKHN0ZG91dHB1dCwgc2VjKSwKLQkJYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgIH0KLQotICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50KHN0ZG91dHB1dCwgc2VjLCBhbGlnbik7Ci0KLX0KLQotc3RhdGljIHZvaWQKLXBwY19wZV9mdW5jdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGVuZGM7Ci0gIHN5bWJvbFMgKmV4dF9zeW07Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGV4dF9zeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKLQotICBTX1NFVF9EQVRBX1RZUEUgKGV4dF9zeW0sIERUX0ZDTiA8PCBOX0JUU0hGVCk7Ci0gIFNGX1NFVF9GVU5DVElPTiAoZXh0X3N5bSk7Ci0gIFNGX1NFVF9QUk9DRVNTIChleHRfc3ltKTsKLSAgY29mZl9hZGRfbGluZXN5bSAoZXh0X3N5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXBwY19wZV90b2NkIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmICh0b2NkYXRhX3NlY3Rpb24gPT0gMCkKLSAgICB7Ci0gICAgICB0b2NkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnRvY2QiLCAwKTsKLSAgICAgIC8qIEZJWE1FOiBzZWN0aW9uIGZsYWdzIHdvbid0IHdvcmsgKi8KLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCB0b2NkYXRhX3NlY3Rpb24sCi0JCQkgICAgIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotCQkJICAgICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfREFUQSApKTsKLQotICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCB0b2NkYXRhX3NlY3Rpb24sIDIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnRvY2QiLCAwKTsKLSAgICB9Ci0KLSAgcHBjX3NldF9jdXJyZW50X3NlY3Rpb24odG9jZGF0YV9zZWN0aW9uKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBEb24ndCBhZGp1c3QgVE9DIHJlbG9jcyB0byB1c2UgdGhlIHNlY3Rpb24gc3ltYm9sLiAgKi8KLQotaW50Ci1wcGNfcGVfZml4X2FkanVzdGFibGUgKGZpeCkKLSAgICAgZml4UyAqZml4OwotewotICByZXR1cm4gZml4LT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1BQQ19UT0MxNjsKLX0KLQotI2VuZGlmCi0MCi0jaWZkZWYgT0JKX1hDT0ZGCi0KLS8qIFhDT0ZGIHNwZWNpZmljIHN5bWJvbCBhbmQgZmlsZSBoYW5kbGluZy4gICovCi0KLS8qIENhbm9uaWNhbGl6ZSB0aGUgc3ltYm9sIG5hbWUuICBXZSB1c2UgdGhlIHRvIGZvcmNlIHRoZSBzdWZmaXgsIGlmCi0gICBhbnksIHRvIHVzZSBzcXVhcmUgYnJhY2tldHMsIGFuZCB0byBiZSBpbiB1cHBlciBjYXNlLiAgKi8KLQotY2hhciAqCi1wcGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBjaGFyICpzOwotCi0gIGlmIChwcGNfc3RhYl9zeW1ib2wpCi0gICAgcmV0dXJuIG5hbWU7Ci0KLSAgZm9yIChzID0gbmFtZTsgKnMgIT0gJ1wwJyAmJiAqcyAhPSAneycgJiYgKnMgIT0gJ1snOyBzKyspCi0gICAgOwotICBpZiAoKnMgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBjaGFyIGJyYWM7Ci0KLSAgICAgIGlmICgqcyA9PSAnWycpCi0JYnJhYyA9ICddJzsKLSAgICAgIGVsc2UKLQl7Ci0JICAqcyA9ICdbJzsKLQkgIGJyYWMgPSAnfSc7Ci0JfQotCi0gICAgICBmb3IgKHMrKzsgKnMgIT0gJ1wwJyAmJiAqcyAhPSBicmFjOyBzKyspCi0JaWYgKGlzbG93ZXIgKCpzKSkKLQkgICpzID0gdG91cHBlciAoKnMpOwotCi0gICAgICBpZiAoKnMgPT0gJ1wwJyB8fCBzWzFdICE9ICdcMCcpCi0JYXNfYmFkIChfKCJiYWQgc3ltYm9sIHN1ZmZpeCIpKTsKLQotICAgICAgKnMgPSAnXSc7Ci0gICAgfQotCi0gIHJldHVybiBuYW1lOwotfQotCi0vKiBTZXQgdGhlIGNsYXNzIG9mIGEgc3ltYm9sIGJhc2VkIG9uIHRoZSBzdWZmaXgsIGlmIGFueS4gIFRoaXMgaXMKLSAgIGNhbGxlZCB3aGVuZXZlciBhIG5ldyBzeW1ib2wgaXMgY3JlYXRlZC4gICovCi0KLXZvaWQKLXBwY19zeW1ib2xfbmV3X2hvb2sgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBjb25zdCBjaGFyICpzOwotCi0gIHN5bS0+c3lfdGMubmV4dCA9IE5VTEw7Ci0gIHN5bS0+c3lfdGMub3V0cHV0ID0gMDsKLSAgc3ltLT5zeV90Yy5jbGFzcyA9IC0xOwotICBzeW0tPnN5X3RjLnJlYWxfbmFtZSA9IE5VTEw7Ci0gIHN5bS0+c3lfdGMuc3Vic2VnID0gMDsKLSAgc3ltLT5zeV90Yy5hbGlnbiA9IDA7Ci0gIHN5bS0+c3lfdGMuc2l6ZSA9IE5VTEw7Ci0gIHN5bS0+c3lfdGMud2l0aGluID0gTlVMTDsKLQotICBpZiAocHBjX3N0YWJfc3ltYm9sKQotICAgIHJldHVybjsKLQotICBzID0gc3RyY2hyIChTX0dFVF9OQU1FIChzeW0pLCAnWycpOwotICBpZiAocyA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGlzIG5vIHN1ZmZpeC4gICovCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsrczsKLQotICBzd2l0Y2ggKHNbMF0pCi0gICAgewotICAgIGNhc2UgJ0InOgotICAgICAgaWYgKHN0cmNtcCAocywgIkJTXSIpID09IDApCi0Jc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19CUzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0QnOgotICAgICAgaWYgKHN0cmNtcCAocywgIkRCXSIpID09IDApCi0Jc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19EQjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIkRTXSIpID09IDApCi0Jc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19EUzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0cnOgotICAgICAgaWYgKHN0cmNtcCAocywgIkdMXSIpID09IDApCi0Jc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19HTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1AnOgotICAgICAgaWYgKHN0cmNtcCAocywgIlBSXSIpID09IDApCi0Jc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19QUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1InOgotICAgICAgaWYgKHN0cmNtcCAocywgIlJPXSIpID09IDApCi0Jc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19STzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIlJXXSIpID09IDApCi0Jc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19SVzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1MnOgotICAgICAgaWYgKHN0cmNtcCAocywgIlNWXSIpID09IDApCi0Jc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19TVjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1QnOgotICAgICAgaWYgKHN0cmNtcCAocywgIlRDXSIpID09IDApCi0Jc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19UQzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIlRJXSIpID09IDApCi0Jc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19USTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIlRCXSIpID09IDApCi0Jc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19UQjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIlRDMF0iKSA9PSAwIHx8IHN0cmNtcCAocywgIlQwXSIpID09IDApCi0Jc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19UQzA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdVJzoKLSAgICAgIGlmIChzdHJjbXAgKHMsICJVQV0iKSA9PSAwKQotCXN5bS0+c3lfdGMuY2xhc3MgPSBYTUNfVUE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHMsICJVQ10iKSA9PSAwKQotCXN5bS0+c3lfdGMuY2xhc3MgPSBYTUNfVUM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdYJzoKLSAgICAgIGlmIChzdHJjbXAgKHMsICJYT10iKSA9PSAwKQotCXN5bS0+c3lfdGMuY2xhc3MgPSBYTUNfWE87Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKHN5bS0+c3lfdGMuY2xhc3MgPT0gLTEpCi0gICAgYXNfYmFkIChfKCJVbnJlY29nbml6ZWQgc3ltYm9sIHN1ZmZpeCIpKTsKLX0KLQotLyogU2V0IHRoZSBjbGFzcyBvZiBhIGxhYmVsIGJhc2VkIG9uIHdoZXJlIGl0IGlzIGRlZmluZWQuICBUaGlzCi0gICBoYW5kbGVzIHN5bWJvbHMgd2l0aG91dCBzdWZmaXhlcy4gIEFsc28sIG1vdmUgdGhlIHN5bWJvbCBzbyB0aGF0IGl0Ci0gICBmb2xsb3dzIHRoZSBjc2VjdCBzeW1ib2wuICAqLwotCi12b2lkCi1wcGNfZnJvYl9sYWJlbCAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIGlmIChwcGNfY3VycmVudF9jc2VjdCAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzeW0tPnN5X3RjLmNsYXNzID09IC0xKQotCXN5bS0+c3lfdGMuY2xhc3MgPSBwcGNfY3VycmVudF9jc2VjdC0+c3lfdGMuY2xhc3M7Ci0KLSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bSwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfYXBwZW5kIChzeW0sIHBwY19jdXJyZW50X2NzZWN0LT5zeV90Yy53aXRoaW4sICZzeW1ib2xfcm9vdFAsCi0JCSAgICAgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBwcGNfY3VycmVudF9jc2VjdC0+c3lfdGMud2l0aGluID0gc3ltOwotICAgIH0KLX0KLQotLyogVGhpcyB2YXJpYWJsZSBpcyBzZXQgYnkgcHBjX2Zyb2Jfc3ltYm9sIGlmIGFueSBhYnNvbHV0ZSBzeW1ib2xzIGFyZQotICAgc2Vlbi4gIEl0IHRlbGxzIHBwY19hZGp1c3Rfc3ltdGFiIHdoZXRoZXIgaXQgbmVlZHMgdG8gbG9vayB0aHJvdWdoCi0gICB0aGUgc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuIHBwY19zYXdfYWJzOwotCi0vKiBDaGFuZ2UgdGhlIG5hbWUgb2YgYSBzeW1ib2wganVzdCBiZWZvcmUgd3JpdGluZyBpdCBvdXQuICBTZXQgdGhlCi0gICByZWFsIG5hbWUgaWYgdGhlIC5yZW5hbWUgcHNldWRvLW9wIHdhcyB1c2VkLiAgT3RoZXJ3aXNlLCByZW1vdmUgYW55Ci0gICBjbGFzcyBzdWZmaXguICBSZXR1cm4gMSBpZiB0aGUgc3ltYm9sIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlCi0gICBzeW1ib2wgdGFibGUuICAqLwotCi1pbnQKLXBwY19mcm9iX3N5bWJvbCAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHN0YXRpYyBzeW1ib2xTICpwcGNfbGFzdF9mdW5jdGlvbjsKLSAgc3RhdGljIHN5bWJvbFMgKnNldF9lbmQ7Ci0KLSAgLyogRGlzY2FyZCBzeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IHN5bWJvbAotICAgICB0YWJsZS4gICovCi0gIGlmICghIHN5bS0+c3lfdXNlZF9pbl9yZWxvYwotICAgICAgJiYgKChzeW0tPmJzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwCi0JICB8fCAoISBTX0lTX0VYVEVSTkFMIChzeW0pCi0JICAgICAgJiYgISBzeW0tPnN5X3RjLm91dHB1dAotCSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgIT0gQ19GSUxFKSkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKHN5bS0+c3lfdGMucmVhbF9uYW1lICE9IChjaGFyICopIE5VTEwpCi0gICAgU19TRVRfTkFNRSAoc3ltLCBzeW0tPnN5X3RjLnJlYWxfbmFtZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY29uc3QgY2hhciAqczsKLQotICAgICAgbmFtZSA9IFNfR0VUX05BTUUgKHN5bSk7Ci0gICAgICBzID0gc3RyY2hyIChuYW1lLCAnWycpOwotICAgICAgaWYgKHMgIT0gKGNoYXIgKikgTlVMTCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbGVuOwotCSAgY2hhciAqc25ldzsKLQotCSAgbGVuID0gcyAtIG5hbWU7Ci0JICBzbmV3ID0geG1hbGxvYyAobGVuICsgMSk7Ci0JICBtZW1jcHkgKHNuZXcsIG5hbWUsIGxlbik7Ci0JICBzbmV3W2xlbl0gPSAnXDAnOwotCi0JICBTX1NFVF9OQU1FIChzeW0sIHNuZXcpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNldF9lbmQgIT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICBTQV9TRVRfU1lNX0VORE5EWCAoc2V0X2VuZCwgc3ltKTsKLSAgICAgIHNldF9lbmQgPSBOVUxMOwotICAgIH0KLQotICBpZiAoU0ZfR0VUX0ZVTkNUSU9OIChzeW0pKQotICAgIHsKLSAgICAgIGlmIChwcGNfbGFzdF9mdW5jdGlvbiAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCWFzX2JhZCAoXygidHdvIC5mdW5jdGlvbiBwc2V1ZG8tb3BzIHdpdGggbm8gaW50ZXJ2ZW5pbmcgLmVmIikpOwotICAgICAgcHBjX2xhc3RfZnVuY3Rpb24gPSBzeW07Ci0gICAgICBpZiAoc3ltLT5zeV90Yy5zaXplICE9IChzeW1ib2xTICopIE5VTEwpCi0JewotCSAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bS0+c3lfdGMuc2l6ZSwgMSk7Ci0JICBTQV9TRVRfU1lNX0ZTSVpFIChzeW0sIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltLT5zeV90Yy5zaXplKSk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX0ZDTgotCSAgICYmIHN0cmNtcCAoU19HRVRfTkFNRSAoc3ltKSwgIi5lZiIpID09IDApCi0gICAgewotICAgICAgaWYgKHBwY19sYXN0X2Z1bmN0aW9uID09IChzeW1ib2xTICopIE5VTEwpCi0JYXNfYmFkIChfKCIuZWYgd2l0aCBubyBwcmVjZWRpbmcgLmZ1bmN0aW9uIikpOwotICAgICAgZWxzZQotCXsKLQkgIHNldF9lbmQgPSBwcGNfbGFzdF9mdW5jdGlvbjsKLQkgIHBwY19sYXN0X2Z1bmN0aW9uID0gTlVMTDsKLQotCSAgLyogV2UgZG9uJ3QgaGF2ZSBhIENfRUZDTiBzeW1ib2wsIGJ1dCB3ZSBuZWVkIHRvIGZvcmNlIHRoZQotCSAgICAgQ09GRiBiYWNrZW5kIHRvIGJlbGlldmUgdGhhdCBpdCBoYXMgc2VlbiBvbmUuICAqLwotCSAgY29mZl9sYXN0X2Z1bmN0aW9uID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIGlmICghIFNfSVNfRVhURVJOQUwgKHN5bSkKLSAgICAgICYmIChzeW0tPmJzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pICE9IENfRklMRQotICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSAhPSBDX0ZDTgotICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSAhPSBDX0JMT0NLCi0gICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pICE9IENfQlNUQVQKLSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgIT0gQ19FU1RBVAotICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSAhPSBDX0JJTkNMCi0gICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pICE9IENfRUlOQ0wKLSAgICAgICYmIFNfR0VUX1NFR01FTlQgKHN5bSkgIT0gcHBjX2NvZmZfZGVidWdfc2VjdGlvbikKLSAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfSElERVhUKTsKLQotICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX0VYVAotICAgICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX0hJREVYVCkKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYTsKLQotICAgICAgLyogQ3JlYXRlIGEgY3NlY3QgYXV4LiAgKi8KLSAgICAgIGkgPSBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW0pOwotICAgICAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltLCBpICsgMSk7Ci0gICAgICBhID0gJmNvZmZzeW1ib2wgKHN5bS0+YnN5bSktPm5hdGl2ZVtpICsgMV0udS5hdXhlbnQ7Ci0gICAgICBpZiAoc3ltLT5zeV90Yy5jbGFzcyA9PSBYTUNfVEMwKQotCXsKLQkgIC8qIFRoaXMgaXMgdGhlIFRPQyB0YWJsZS4gICovCi0JICBrbm93IChzdHJjbXAgKFNfR0VUX05BTUUgKHN5bSksICJUT0MiKSA9PSAwKTsKLQkgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IDA7Ci0JICBhLT54X2NzZWN0Lnhfc210eXAgPSAoMiA8PCAzKSB8IFhUWV9TRDsKLQl9Ci0gICAgICBlbHNlIGlmIChzeW0tPnN5X3RjLnN1YnNlZyAhPSAwKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBjc2VjdCBzeW1ib2wuICB4X3NjbmxlbiBpcyB0aGUgc2l6ZSBvZiB0aGUKLQkgICAgIGNzZWN0LiAgKi8KLQkgIGlmIChzeW0tPnN5X3RjLm5leHQgPT0gKHN5bWJvbFMgKikgTlVMTCkKLQkgICAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gKGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwKLQkJCQkJCSAgICAgICBTX0dFVF9TRUdNRU5UIChzeW0pKQotCQkJCSAgICAgLSBTX0dFVF9WQUxVRSAoc3ltKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltLT5zeV90Yy5uZXh0LCAxKTsKLQkgICAgICBhLT54X2NzZWN0Lnhfc2NubGVuLmwgPSAoU19HRVRfVkFMVUUgKHN5bS0+c3lfdGMubmV4dCkKLQkJCQkgICAgICAgLSBTX0dFVF9WQUxVRSAoc3ltKSk7Ci0JICAgIH0KLQkgIGEtPnhfY3NlY3QueF9zbXR5cCA9IChzeW0tPnN5X3RjLmFsaWduIDw8IDMpIHwgWFRZX1NEOwotCX0KLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gYnNzX3NlY3Rpb24pCi0JewotCSAgLyogVGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wuICAqLwotCSAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gc3ltLT5zeV9mcmFnLT5mcl9vZmZzZXQ7Ci0JICBhLT54X2NzZWN0Lnhfc210eXAgPSAoc3ltLT5zeV90Yy5hbGlnbiA8PCAzKSB8IFhUWV9DTTsKLQkgIGlmIChTX0lTX0VYVEVSTkFMIChzeW0pKQotCSAgICBzeW0tPnN5X3RjLmNsYXNzID0gWE1DX1JXOwotCSAgZWxzZQotCSAgICBzeW0tPnN5X3RjLmNsYXNzID0gWE1DX0JTOwotCX0KLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQl7Ci0JICAvKiBUaGlzIGlzIGFuIGFic29sdXRlIHN5bWJvbC4gIFRoZSBjc2VjdCB3aWxsIGJlIGNyZWF0ZWQgYnkKLSAgICAgICAgICAgICBwcGNfYWRqdXN0X3N5bXRhYi4gICovCi0JICBwcGNfc2F3X2FicyA9IHRydWU7Ci0JICBhLT54X2NzZWN0Lnhfc210eXAgPSBYVFlfTEQ7Ci0JICBpZiAoc3ltLT5zeV90Yy5jbGFzcyA9PSAtMSkKLQkgICAgc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19YTzsKLQl9Ci0gICAgICBlbHNlIGlmICghIFNfSVNfREVGSU5FRCAoc3ltKSkKLQl7Ci0JICAvKiBUaGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0JICBhLT54X2NzZWN0Lnhfc2NubGVuLmwgPSAwOwotCSAgYS0+eF9jc2VjdC54X3NtdHlwID0gWFRZX0VSOwotCX0KLSAgICAgIGVsc2UgaWYgKHN5bS0+c3lfdGMuY2xhc3MgPT0gWE1DX1RDKQotCXsKLQkgIHN5bWJvbFMgKm5leHQ7Ci0KLQkgIC8qIFRoaXMgaXMgYSBUT0MgZGVmaW5pdGlvbi4gIHhfc2NubGVuIGlzIHRoZSBzaXplIG9mIHRoZQotCSAgICAgVE9DIGVudHJ5LiAgKi8KLQkgIG5leHQgPSBzeW1ib2xfbmV4dCAoc3ltKTsKLQkgIHdoaWxlIChuZXh0LT5zeV90Yy5jbGFzcyA9PSBYTUNfVEMwKQotCSAgICBuZXh0ID0gc3ltYm9sX25leHQgKG5leHQpOwotCSAgaWYgKG5leHQgPT0gKHN5bWJvbFMgKikgTlVMTAotCSAgICAgIHx8IG5leHQtPnN5X3RjLmNsYXNzICE9IFhNQ19UQykKLQkgICAgewotCSAgICAgIGlmIChwcGNfYWZ0ZXJfdG9jX2ZyYWcgPT0gKGZyYWdTICopIE5VTEwpCi0JCWEtPnhfY3NlY3QueF9zY25sZW4ubCA9IChiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsCi0JCQkJCQkJICAgZGF0YV9zZWN0aW9uKQotCQkJCQkgLSBTX0dFVF9WQUxVRSAoc3ltKSk7Ci0JICAgICAgZWxzZQotCQlhLT54X2NzZWN0Lnhfc2NubGVuLmwgPSAocHBjX2FmdGVyX3RvY19mcmFnLT5mcl9hZGRyZXNzCi0JCQkJCSAtIFNfR0VUX1ZBTFVFIChzeW0pKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKG5leHQsIDEpOwotCSAgICAgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IChTX0dFVF9WQUxVRSAobmV4dCkKLQkJCQkgICAgICAgLSBTX0dFVF9WQUxVRSAoc3ltKSk7Ci0JICAgIH0KLQkgIGEtPnhfY3NlY3QueF9zbXR5cCA9ICgyIDw8IDMpIHwgWFRZX1NEOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xTICpjc2VjdDsKLQotCSAgLyogVGhpcyBpcyBhIG5vcm1hbCBzeW1ib2wgZGVmaW5pdGlvbi4gIHhfc2NubGVuIGlzIHRoZQotCSAgICAgc3ltYm9sIGluZGV4IG9mIHRoZSBjb250YWluaW5nIGNzZWN0LiAgKi8KLQkgIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pID09IHRleHRfc2VjdGlvbikKLQkgICAgY3NlY3QgPSBwcGNfdGV4dF9jc2VjdHM7Ci0JICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pID09IGRhdGFfc2VjdGlvbikKLQkgICAgY3NlY3QgPSBwcGNfZGF0YV9jc2VjdHM7Ci0JICBlbHNlCi0JICAgIGFib3J0ICgpOwotCi0JICAvKiBTa2lwIHRoZSBpbml0aWFsIGR1bW15IHN5bWJvbC4gICovCi0JICBjc2VjdCA9IGNzZWN0LT5zeV90Yy5uZXh0OwotCi0JICBpZiAoY3NlY3QgPT0gKHN5bWJvbFMgKikgTlVMTCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oIndhcm5pbmc6IHN5bWJvbCAlcyBoYXMgbm8gY3NlY3QiKSwgU19HRVRfTkFNRSAoc3ltKSk7Ci0JICAgICAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgd2hpbGUgKGNzZWN0LT5zeV90Yy5uZXh0ICE9IChzeW1ib2xTICopIE5VTEwpCi0JCXsKLQkJICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoY3NlY3QtPnN5X3RjLm5leHQsIDEpOwotCQkgIGlmIChTX0dFVF9WQUxVRSAoY3NlY3QtPnN5X3RjLm5leHQpID4gU19HRVRfVkFMVUUgKHN5bSkpCi0JCSAgICBicmVhazsKLQkJICBjc2VjdCA9IGNzZWN0LT5zeV90Yy5uZXh0OwotCQl9Ci0KLQkgICAgICBhLT54X2NzZWN0Lnhfc2NubGVuLnAgPSBjb2Zmc3ltYm9sIChjc2VjdC0+YnN5bSktPm5hdGl2ZTsKLQkgICAgICBjb2Zmc3ltYm9sIChzeW0tPmJzeW0pLT5uYXRpdmVbaSArIDFdLmZpeF9zY25sZW4gPSAxOwotCSAgICB9Ci0JICBhLT54X2NzZWN0Lnhfc210eXAgPSBYVFlfTEQ7Ci0JfQotCQotICAgICAgYS0+eF9jc2VjdC54X3Bhcm1oYXNoID0gMDsKLSAgICAgIGEtPnhfY3NlY3QueF9zbmhhc2ggPSAwOwotICAgICAgaWYgKHN5bS0+c3lfdGMuY2xhc3MgPT0gLTEpCi0JYS0+eF9jc2VjdC54X3NtY2xhcyA9IFhNQ19QUjsKLSAgICAgIGVsc2UKLQlhLT54X2NzZWN0Lnhfc21jbGFzID0gc3ltLT5zeV90Yy5jbGFzczsKLSAgICAgIGEtPnhfY3NlY3QueF9zdGFiID0gMDsKLSAgICAgIGEtPnhfY3NlY3QueF9zbnN0YWIgPSAwOwotCi0gICAgICAvKiBEb24ndCBsZXQgdGhlIENPRkYgYmFja2VuZCByZXNvcnQgdGhlc2Ugc3ltYm9scy4gICovCi0gICAgICBzeW0tPmJzeW0tPmZsYWdzIHw9IEJTRl9OT1RfQVRfRU5EOwotICAgIH0KLSAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX0JTVEFUKQotICAgIHsKLSAgICAgIC8qIFdlIHdhbnQgdGhlIHZhbHVlIHRvIGJlIHRoZSBzeW1ib2wgaW5kZXggb2YgdGhlIHJlZmVyZW5jZWQKLQkgY3NlY3Qgc3ltYm9sLiAgQkZEIHdpbGwgZG8gdGhhdCBmb3IgdXMgaWYgd2Ugc2V0IHRoZSByaWdodAotCSBmbGFncy4gICovCi0gICAgICBTX1NFVF9WQUxVRSAoc3ltLAotCQkgICAodmFsdWVUKSBjb2Zmc3ltYm9sIChzeW0tPnN5X3RjLndpdGhpbi0+YnN5bSktPm5hdGl2ZSk7Ci0gICAgICBjb2Zmc3ltYm9sIChzeW0tPmJzeW0pLT5uYXRpdmUtPmZpeF92YWx1ZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfU1RTWU0pCi0gICAgewotICAgICAgc3ltYm9sUyAqYmxvY2s7Ci0gICAgICBzeW1ib2xTICpjc2VjdDsKLQotICAgICAgLyogVGhlIHZhbHVlIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUgZW5jbG9zaW5nIGNzZWN0LiAgKi8KLSAgICAgIGJsb2NrID0gc3ltLT5zeV90Yy53aXRoaW47Ci0gICAgICBjc2VjdCA9IGJsb2NrLT5zeV90Yy53aXRoaW47Ci0gICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoY3NlY3QsIDEpOwotICAgICAgU19TRVRfVkFMVUUgKHN5bSwgU19HRVRfVkFMVUUgKHN5bSkgLSBTX0dFVF9WQUxVRSAoY3NlY3QpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19CSU5DTAotCSAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19FSU5DTCkKLSAgICB7Ci0gICAgICAvKiBXZSB3YW50IHRoZSB2YWx1ZSB0byBiZSBhIGZpbGUgb2Zmc2V0IGludG8gdGhlIGxpbmUgbnVtYmVycy4KLSAgICAgICAgIEJGRCB3aWxsIGRvIHRoYXQgZm9yIHVzIGlmIHdlIHNldCB0aGUgcmlnaHQgZmxhZ3MuICBXZSBoYXZlCi0gICAgICAgICBhbHJlYWR5IHNldCB0aGUgdmFsdWUgY29ycmVjdGx5LiAgKi8KLSAgICAgIGNvZmZzeW1ib2wgKHN5bS0+YnN5bSktPm5hdGl2ZS0+Zml4X2xpbmUgPSAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogQWRqdXN0IHRoZSBzeW1ib2wgdGFibGUuICBUaGlzIGNyZWF0ZXMgY3NlY3Qgc3ltYm9scyBmb3IgYWxsCi0gICBhYnNvbHV0ZSBzeW1ib2xzLiAgKi8KLQotdm9pZAotcHBjX2FkanVzdF9zeW10YWIgKCkKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIGlmICghIHBwY19zYXdfYWJzKQotICAgIHJldHVybjsKLQotICBmb3IgKHN5bSA9IHN5bWJvbF9yb290UDsgc3ltICE9IE5VTEw7IHN5bSA9IHN5bWJvbF9uZXh0IChzeW0pKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKmNzZWN0OwotICAgICAgaW50IGk7Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmE7Ci0KLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pICE9IGFic29sdXRlX3NlY3Rpb24pCi0JY29udGludWU7Ci0KLSAgICAgIGNzZWN0ID0gc3ltYm9sX2NyZWF0ZSAoIi5hYnNbWE9dIiwgYWJzb2x1dGVfc2VjdGlvbiwKLQkJCSAgICAgU19HRVRfVkFMVUUgKHN5bSksICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgICBjc2VjdC0+YnN5bS0+dmFsdWUgPSBTX0dFVF9WQUxVRSAoc3ltKTsKLSAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKGNzZWN0LCBDX0hJREVYVCk7Ci0gICAgICBpID0gU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoY3NlY3QpOwotICAgICAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoY3NlY3QsIGkgKyAxKTsKLSAgICAgIGEgPSAmY29mZnN5bWJvbCAoY3NlY3QtPmJzeW0pLT5uYXRpdmVbaSArIDFdLnUuYXV4ZW50OwotICAgICAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gMDsKLSAgICAgIGEtPnhfY3NlY3QueF9zbXR5cCA9IFhUWV9TRDsKLSAgICAgIGEtPnhfY3NlY3QueF9wYXJtaGFzaCA9IDA7Ci0gICAgICBhLT54X2NzZWN0Lnhfc25oYXNoID0gMDsKLSAgICAgIGEtPnhfY3NlY3QueF9zbWNsYXMgPSBYTUNfWE87Ci0gICAgICBhLT54X2NzZWN0Lnhfc3RhYiA9IDA7Ci0gICAgICBhLT54X2NzZWN0Lnhfc25zdGFiID0gMDsKLQotICAgICAgc3ltYm9sX2luc2VydCAoY3NlY3QsIHN5bSwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0KLSAgICAgIGkgPSBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW0pOwotICAgICAgYSA9ICZjb2Zmc3ltYm9sIChzeW0tPmJzeW0pLT5uYXRpdmVbaV0udS5hdXhlbnQ7Ci0gICAgICBhLT54X2NzZWN0Lnhfc2NubGVuLnAgPSBjb2Zmc3ltYm9sIChjc2VjdC0+YnN5bSktPm5hdGl2ZTsKLSAgICAgIGNvZmZzeW1ib2wgKHN5bS0+YnN5bSktPm5hdGl2ZVtpXS5maXhfc2NubGVuID0gMTsKLSAgICB9Ci0KLSAgcHBjX3Nhd19hYnMgPSBmYWxzZTsKLX0KLQotLyogU2V0IHRoZSBWTUEgZm9yIGEgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIG9uIGFsbCB0aGUgc2VjdGlvbnMgaW4KLSAgIHR1cm4uICAqLwotCi12b2lkCi1wcGNfZnJvYl9zZWN0aW9uIChzZWMpCi0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHN0YXRpYyBiZmRfc2l6ZV90eXBlIHZtYSA9IDA7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LCBzZWMsIHZtYSk7Ci0gIHZtYSArPSBiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIHNlYyk7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfWENPRkYgKi8KLQwKLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudAotICAgb2YgdHlwZSB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRwLiAgVGhlIG51bWJlcgotICAgb2YgTElUVExFTlVNUyBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZXAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcwotICAgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLwotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdHAsIHNpemVwKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqbGl0cDsKLSAgICAgaW50ICpzaXplcDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICp0OwotICBpbnQgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZXAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVwID0gcHJlYyAqIDI7Ci0KLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRwLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRwICs9IDI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaSA9IHByZWMgLSAxOyBpID49IDA7IGktLSkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdHAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdHAgKz0gMjsKLQl9Ci0gICAgfQotICAgICAKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFdyaXRlIGEgdmFsdWUgb3V0IHRvIHRoZSBvYmplY3QgZmlsZSwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCi0gICBlbmRpYW5uZXNzLiAgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLSAgZWxzZQotICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQotLyogQWxpZ24gYSBzZWN0aW9uIChJIGRvbid0IGtub3cgd2h5IHRoaXMgaXMgbWFjaGluZSBkZXBlbmRlbnQpLiAgKi8KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0KLSAgcmV0dXJuICgoYWRkciArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLS8qIFdlIGRvbid0IGhhdmUgYW55IGZvcm0gb2YgcmVsYXhpbmcuICAqLwotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gMDsKLX0KLQotLyogQ29udmVydCBhIG1hY2hpbmUgZGVwZW5kZW50IGZyYWcuICBXZSBuZXZlciBnZW5lcmF0ZSB0aGVzZS4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFncCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBmcmFnUyAqZnJhZ3A7Ci17Ci0gIGFib3J0ICgpOwotfQotCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBjb25jZXJuaW5nIHJlbG9jcy4gICovCi0KLS8qIFRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIGEgUEMgcmVsYXRpdmUganVtcCBzaG91bGQgYmUgY2FsY3VsYXRlZCwKLSAgIGdpdmVuIGEgUEMgcmVsYXRpdmUgcmVsb2MuICAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tX3NlY3Rpb24gKGZpeHAsIHNlYykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgc2VnVCBzZWM7Ci17Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci19Ci0KLSNpZmRlZiBPQkpfWENPRkYKLQotLyogVGhpcyBpcyBjYWxsZWQgdG8gc2VlIHdoZXRoZXIgYSBmaXh1cCBzaG91bGQgYmUgYWRqdXN0ZWQgdG8gdXNlIGEKLSAgIHNlY3Rpb24gc3ltYm9sLiAgV2UgdGFrZSB0aGUgb3Bwb3J0dW5pdHkgdG8gY2hhbmdlIGEgZml4dXAgYWdhaW5zdAotICAgYSBzeW1ib2wgaW4gdGhlIFRPQyBzdWJzZWdtZW50IGludG8gYSByZWxvYyBhZ2FpbnN0IHRoZQotICAgY29ycmVzcG9uZGluZyAudGMgc3ltYm9sLiAgKi8KLQotaW50Ci1wcGNfZml4X2FkanVzdGFibGUgKGZpeCkKLSAgICAgZml4UyAqZml4OwotewotICB2YWx1ZVQgdmFsOwotCi0gIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChmaXgtPmZ4X2FkZHN5LCAxKTsKLSAgdmFsID0gU19HRVRfVkFMVUUgKGZpeC0+ZnhfYWRkc3kpOwotICBpZiAocHBjX3RvY19jc2VjdCAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiBmaXgtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmIGZpeC0+ZnhfYWRkc3kgIT0gcHBjX3RvY19jc2VjdAotICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4LT5meF9hZGRzeSkgPT0gZGF0YV9zZWN0aW9uCi0gICAgICAmJiB2YWwgPj0gcHBjX3RvY19mcmFnLT5mcl9hZGRyZXNzCi0gICAgICAmJiAocHBjX2FmdGVyX3RvY19mcmFnID09IChmcmFnUyAqKSBOVUxMCi0JICB8fCB2YWwgPCBwcGNfYWZ0ZXJfdG9jX2ZyYWctPmZyX2FkZHJlc3MpKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5OwotCi0gICAgICBmb3IgKHN5ID0gc3ltYm9sX25leHQgKHBwY190b2NfY3NlY3QpOwotCSAgIHN5ICE9IChzeW1ib2xTICopIE5VTEw7Ci0JICAgc3kgPSBzeW1ib2xfbmV4dCAoc3kpKQotCXsKLQkgIGlmIChzeS0+c3lfdGMuY2xhc3MgPT0gWE1DX1RDMCkKLQkgICAgY29udGludWU7Ci0JICBpZiAoc3ktPnN5X3RjLmNsYXNzICE9IFhNQ19UQykKLQkgICAgYnJlYWs7Ci0JICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ksIDEpOwotCSAgaWYgKHZhbCA9PSBTX0dFVF9WQUxVRSAoc3kpKQotCSAgICB7Ci0JICAgICAgZml4LT5meF9hZGRzeSA9IHN5OwotCSAgICAgIGZpeC0+ZnhfYWRkbnVtYmVyID0gdmFsIC0gcHBjX3RvY19mcmFnLT5mcl9hZGRyZXNzOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotCi0gICAgICBhc19iYWRfd2hlcmUgKGZpeC0+ZnhfZmlsZSwgZml4LT5meF9saW5lLAotCQkgICAgXygic3ltYm9sIGluIC50b2MgZG9lcyBub3QgbWF0Y2ggYW55IC50YyIpKTsKLSAgICB9Ci0KLSAgLyogUG9zc2libHkgYWRqdXN0IHRoZSByZWxvYyB0byBiZSBhZ2FpbnN0IHRoZSBjc2VjdC4gICovCi0gIGlmIChmaXgtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmIGZpeC0+ZnhfYWRkc3ktPnN5X3RjLnN1YnNlZyA9PSAwCi0gICAgICAmJiBmaXgtPmZ4X2FkZHN5LT5zeV90Yy5jbGFzcyAhPSBYTUNfVEMwCi0gICAgICAmJiBmaXgtPmZ4X2FkZHN5LT5zeV90Yy5jbGFzcyAhPSBYTUNfVEMKLSAgICAgICYmIFNfR0VUX1NFR01FTlQgKGZpeC0+ZnhfYWRkc3kpICE9IGJzc19zZWN0aW9uCi0gICAgICAvKiBEb24ndCBhZGp1c3QgaWYgdGhpcyBpcyBhIHJlbG9jIGluIHRoZSB0b2Mgc2VjdGlvbi4gICovCi0gICAgICAmJiAoU19HRVRfU0VHTUVOVCAoZml4LT5meF9hZGRzeSkgIT0gZGF0YV9zZWN0aW9uCi0JICB8fCBwcGNfdG9jX2NzZWN0ID09IE5VTEwKLQkgIHx8IHZhbCA8IHBwY190b2NfZnJhZy0+ZnJfYWRkcmVzcwotCSAgfHwgKHBwY19hZnRlcl90b2NfZnJhZyAhPSBOVUxMCi0JICAgICAgJiYgdmFsID49IHBwY19hZnRlcl90b2NfZnJhZy0+ZnJfYWRkcmVzcykpKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKmNzZWN0OwotCi0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZml4LT5meF9hZGRzeSkgPT0gdGV4dF9zZWN0aW9uKQotCWNzZWN0ID0gcHBjX3RleHRfY3NlY3RzOwotICAgICAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoZml4LT5meF9hZGRzeSkgPT0gZGF0YV9zZWN0aW9uKQotCWNzZWN0ID0gcHBjX2RhdGFfY3NlY3RzOwotICAgICAgZWxzZQotCWFib3J0ICgpOwotCi0gICAgICAvKiBTa2lwIHRoZSBpbml0aWFsIGR1bW15IHN5bWJvbC4gICovCi0gICAgICBjc2VjdCA9IGNzZWN0LT5zeV90Yy5uZXh0OwotCi0gICAgICBpZiAoY3NlY3QgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICB3aGlsZSAoY3NlY3QtPnN5X3RjLm5leHQgIT0gKHN5bWJvbFMgKikgTlVMTAotCQkgJiYgKGNzZWN0LT5zeV90Yy5uZXh0LT5zeV9mcmFnLT5mcl9hZGRyZXNzCi0JCSAgICAgPD0gZml4LT5meF9hZGRzeS0+c3lfZnJhZy0+ZnJfYWRkcmVzcykpCi0JICAgIHsKLQkgICAgICAvKiBJZiB0aGUgY3NlY3QgYWRkcmVzcyBlcXVhbHMgdGhlIHN5bWJvbCB2YWx1ZSwgdGhlbiB3ZQotICAgICAgICAgICAgICAgICBoYXZlIHRvIGxvb2sgdGhyb3VnaCB0aGUgZnVsbCBzeW1ib2wgdGFibGUgdG8gc2VlCi0gICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhpcyBpcyB0aGUgY3NlY3Qgd2Ugd2FudC4gIE5vdGUgdGhhdCB3ZSB3aWxsCi0gICAgICAgICAgICAgICAgIG9ubHkgZ2V0IGhlcmUgaWYgdGhlIGNzZWN0IGhhcyB6ZXJvIGxlbmd0aC4gICovCi0JICAgICAgaWYgKChjc2VjdC0+c3lfZnJhZy0+ZnJfYWRkcmVzcwotCQkgICA9PSBmaXgtPmZ4X2FkZHN5LT5zeV9mcmFnLT5mcl9hZGRyZXNzKQotCQkgICYmIFNfR0VUX1ZBTFVFIChjc2VjdCkgPT0gU19HRVRfVkFMVUUgKGZpeC0+ZnhfYWRkc3kpKQotCQl7Ci0JCSAgc3ltYm9sUyAqc2NhbjsKLQotCQkgIGZvciAoc2NhbiA9IGNzZWN0LT5zeV9uZXh0OwotCQkgICAgICAgc2NhbiAhPSBOVUxMOwotCQkgICAgICAgc2NhbiA9IHNjYW4tPnN5X25leHQpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzY2FuLT5zeV90Yy5zdWJzZWcgIT0gMCkKLQkJCWJyZWFrOwotCQkgICAgICBpZiAoc2NhbiA9PSBmaXgtPmZ4X2FkZHN5KQotCQkJYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICAvKiBJZiB3ZSBmb3VuZCB0aGUgc3ltYm9sIGJlZm9yZSB0aGUgbmV4dCBjc2VjdAotICAgICAgICAgICAgICAgICAgICAgc3ltYm9sLCB0aGVuIHRoaXMgaXMgdGhlIGNzZWN0IHdlIHdhbnQuICAqLwotCQkgIGlmIChzY2FuID09IGZpeC0+ZnhfYWRkc3kpCi0JCSAgICBicmVhazsKLQkJfQotCi0JICAgICAgY3NlY3QgPSBjc2VjdC0+c3lfdGMubmV4dDsKLQkgICAgfQotCi0JICBmaXgtPmZ4X29mZnNldCArPSAoU19HRVRfVkFMVUUgKGZpeC0+ZnhfYWRkc3kpCi0JCQkgICAgIC0gY3NlY3QtPnN5X2ZyYWctPmZyX2FkZHJlc3MpOwotCSAgZml4LT5meF9hZGRzeSA9IGNzZWN0OwotCX0KLSAgICB9Ci0KLSAgLyogQWRqdXN0IGEgcmVsb2MgYWdhaW5zdCBhIC5sY29tbSBzeW1ib2wgdG8gYmUgYWdhaW5zdCB0aGUgYmFzZQotICAgICAubGNvbW0uICAqLwotICBpZiAoZml4LT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiBTX0dFVF9TRUdNRU5UIChmaXgtPmZ4X2FkZHN5KSA9PSBic3Nfc2VjdGlvbgotICAgICAgJiYgISBTX0lTX0VYVEVSTkFMIChmaXgtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoZml4LT5meF9hZGRzeS0+c3lfZnJhZy0+ZnJfc3ltYm9sLCAxKTsKLSAgICAgIGZpeC0+Znhfb2Zmc2V0ICs9IChTX0dFVF9WQUxVRSAoZml4LT5meF9hZGRzeSkKLQkJCSAtIFNfR0VUX1ZBTFVFIChmaXgtPmZ4X2FkZHN5LT5zeV9mcmFnLT5mcl9zeW1ib2wpKTsKLSAgICAgIGZpeC0+ZnhfYWRkc3kgPSBmaXgtPmZ4X2FkZHN5LT5zeV9mcmFnLT5mcl9zeW1ib2w7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBBIHJlbG9jIGZyb20gb25lIGNzZWN0IHRvIGFub3RoZXIgbXVzdCBiZSBrZXB0LiAgVGhlIGFzc2VtYmxlcgotICAgd2lsbCwgb2YgY291cnNlLCBrZWVwIHJlbG9jcyBiZXR3ZWVuIHNlY3Rpb25zLCBhbmQgaXQgd2lsbCBrZWVwCi0gICBhYnNvbHV0ZSByZWxvY3MsIGJ1dCB3ZSBuZWVkIHRvIGZvcmNlIGl0IHRvIGtlZXAgUEMgcmVsYXRpdmUgcmVsb2NzCi0gICBiZXR3ZWVuIHR3byBjc2VjdHMgaW4gdGhlIHNhbWUgc2VjdGlvbi4gICovCi0KLWludAotcHBjX2ZvcmNlX3JlbG9jYXRpb24gKGZpeCkKLSAgICAgZml4UyAqZml4OwotewotICAvKiBBdCB0aGlzIHBvaW50IGZpeC0+ZnhfYWRkc3kgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGNvbnZlcnRlZCB0bwotICAgICBhIGNzZWN0IHN5bWJvbC4gIElmIHRoZSBjc2VjdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBmcmFnbWVudCwgdGhlbgotICAgICB3ZSBuZWVkIHRvIGZvcmNlIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgaWYgKGZpeC0+ZnhfcGNyZWwKLSAgICAgICYmIGZpeC0+ZnhfYWRkc3kgIT0gTlVMTAotICAgICAgJiYgZml4LT5meF9hZGRzeS0+c3lfdGMuc3Vic2VnICE9IDAKLSAgICAgICYmIChmaXgtPmZ4X2FkZHN5LT5zeV9mcmFnLT5mcl9hZGRyZXNzID4gZml4LT5meF9mcmFnLT5mcl9hZGRyZXNzCi0JICB8fCAoZml4LT5meF9hZGRzeS0+c3lfdGMubmV4dCAhPSBOVUxMCi0JICAgICAgJiYgKGZpeC0+ZnhfYWRkc3ktPnN5X3RjLm5leHQtPnN5X2ZyYWctPmZyX2FkZHJlc3MKLQkJICA8PSBmaXgtPmZ4X2ZyYWctPmZyX2FkZHJlc3MpKSkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfWENPRkYgKi8KLQotLyogU2VlIHdoZXRoZXIgYSBzeW1ib2wgaXMgaW4gdGhlIFRPQyBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGludAotcHBjX2lzX3RvY19zeW0gKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotI2lmZGVmIE9CSl9YQ09GRgotICByZXR1cm4gc3ltLT5zeV90Yy5jbGFzcyA9PSBYTUNfVEM7Ci0jZWxzZQotICByZXR1cm4gc3RyY21wIChzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKHN5bSkpLCAiLmdvdCIpID09IDA7Ci0jZW5kaWYKLX0KLQotLyogQXBwbHkgYSBmaXh1cCB0byB0aGUgb2JqZWN0IGNvZGUuICBUaGlzIGlzIGNhbGxlZCBmb3IgYWxsIHRoZQotICAgZml4dXBzIHdlIGdlbmVyYXRlZCBieSB0aGUgY2FsbCB0byBmaXhfbmV3X2V4cCwgYWJvdmUuICBJbiB0aGUgY2FsbAotICAgYWJvdmUgd2UgdXNlZCBhIHJlbG9jIGNvZGUgd2hpY2ggd2FzIHRoZSBsYXJnZXN0IGxlZ2FsIHJlbG9jIGNvZGUKLSAgIHBsdXMgdGhlIG9wZXJhbmQgaW5kZXguICBIZXJlIHdlIHVuZG8gdGhhdCB0byByZWNvdmVyIHRoZSBvcGVyYW5kCi0gICBpbmRleC4gIEF0IHRoaXMgcG9pbnQgYWxsIHN5bWJvbCB2YWx1ZXMgc2hvdWxkIGJlIGZ1bGx5IHJlc29sdmVkLAotICAgYW5kIHdlIGF0dGVtcHQgdG8gY29tcGxldGVseSByZXNvbHZlIHRoZSByZWxvYy4gIElmIHdlIGNhbiBub3QgZG8KLSAgIHRoYXQsIHdlIGRldGVybWluZSB0aGUgY29ycmVjdCByZWxvYyBjb2RlIGFuZCBwdXQgaXQgYmFjayBpbiB0aGUKLSAgIGZpeHVwLiAgKi8KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhwLCB2YWx1ZXAsIHNlZykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgdmFsdWVUICp2YWx1ZXA7Ci0gICAgIHNlZ1Qgc2VnOwotewotICB2YWx1ZVQgdmFsdWU7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIHZhbHVlID0gKnZhbHVlcDsKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogYCp2YWx1ZXAnIG1heSBjb250YWluIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIG9uIHdoaWNoIHRoZSByZWxvYwotCSB3aWxsIGJlIGJhc2VkOyB3ZSBoYXZlIHRvIHJlbW92ZSBpdC4gICovCi0gICAgICBpZiAoZml4cC0+ZnhfYWRkc3ktPnN5X3VzZWRfaW5fcmVsb2MKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBhYnNvbHV0ZV9zZWN0aW9uCi0JICAmJiBTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gdW5kZWZpbmVkX3NlY3Rpb24KLQkgICYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkpKQotCXZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhwLT5meF9hZGRzeSk7Ci0KLSAgICAgIC8qIEZJWE1FOiBXaHkgJysnPyAgQmV0dGVyIHlldCwgd2hhdCBleGFjdGx5IGlzICcqdmFsdWVwJwotCSBzdXBwb3NlZCB0byBiZT8gIEkgdGhpbmsgdGhpcyBpcyByZWxhdGVkIHRvIHZhcmlvdXMgc2ltaWxhcgotCSBGSVhNRXMgaW4gdGMtaTM4Ni5jIGFuZCB0Yy1zcGFyYy5jLiAgKi8KLSAgICAgIGlmIChmaXhwLT5meF9wY3JlbCkKLQl2YWx1ZSArPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gICAgfQotI2Vsc2UKLSAgLyogRklYTUUgRklYTUUgRklYTUU6IFRoZSB2YWx1ZSB3ZSBhcmUgcGFzc2VkIGluICp2YWx1ZXAgaW5jbHVkZXMKLSAgICAgdGhlIHN5bWJvbCB2YWx1ZXMuICBTaW5jZSB3ZSBhcmUgdXNpbmcgQkZEX0FTU0VNQkxFUiwgaWYgd2UgYXJlCi0gICAgIGRvaW5nIHRoaXMgcmVsb2NhdGlvbiB0aGUgY29kZSBpbiB3cml0ZS5jIGlzIGdvaW5nIHRvIGNhbGwKLSAgICAgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiwgd2hpY2ggaXMgYWxzbyBnb2luZyB0byB1c2UgdGhlIHN5bWJvbAotICAgICB2YWx1ZS4gIFRoYXQgbWVhbnMgdGhhdCBpZiB0aGUgcmVsb2MgaXMgZnVsbHkgcmVzb2x2ZWQgd2Ugd2FudCB0bwotICAgICB1c2UgKnZhbHVlcCBzaW5jZSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIGlzIG5vdCBiZWluZyB1c2VkLgotICAgICBIb3dldmVyLCBpZiB0aGUgcmVsb2MgaXMgbm90IGZ1bGx5IHJlc29sdmVkIHdlIGRvIG5vdCB3YW50IHRvIHVzZQotICAgICAqdmFsdWVwLCBhbmQgbXVzdCB1c2UgZnhfb2Zmc2V0IGluc3RlYWQuICBIb3dldmVyLCBpZiB0aGUgcmVsb2MKLSAgICAgaXMgUEMgcmVsYXRpdmUsIHdlIGRvIHdhbnQgdG8gdXNlICp2YWx1ZXAgc2luY2UgaXQgaW5jbHVkZXMgdGhlCi0gICAgIHJlc3VsdCBvZiBtZF9wY3JlbF9mcm9tLiAgVGhpcyBpcyBjb25mdXNpbmcuICAqLwotICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICp2YWx1ZXA7Ci0gICAgICBmaXhwLT5meF9kb25lID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIHZhbHVlID0gKnZhbHVlcDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbHVlID0gZml4cC0+Znhfb2Zmc2V0OwotICAgICAgaWYgKGZpeHAtPmZ4X3N1YnN5ICE9IChzeW1ib2xTICopIE5VTEwpCi0JewotCSAgaWYgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X3N1YnN5KSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICB2YWx1ZSAtPSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UgY2FuJ3QgYWN0dWFsbHkgc3VwcG9ydCBzdWJ0cmFjdGluZyBhIHN5bWJvbC4gICovCi0JICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgIF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKChpbnQpIGZpeHAtPmZ4X3JfdHlwZSA+PSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIGludCBvcGluZGV4OwotICAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgIGNoYXIgKndoZXJlOwotICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotCi0gICAgICBvcGluZGV4ID0gKGludCkgZml4cC0+Znhfcl90eXBlIC0gKGludCkgQkZEX1JFTE9DX1VOVVNFRDsKLQotICAgICAgb3BlcmFuZCA9ICZwb3dlcnBjX29wZXJhbmRzW29waW5kZXhdOwotCi0jaWZkZWYgT0JKX1hDT0ZGCi0gICAgICAvKiBJdCBhcHBlYXJzIHRoYXQgYW4gaW5zdHJ1Y3Rpb24gbGlrZQotCSAgICAgbCA5LExDLi4xKDMwKQotCSB3aGVuIExDLi4xIGlzIG5vdCBhIFRPQyBzeW1ib2wgZG9lcyBub3QgZ2VuZXJhdGUgYSByZWxvYy4gIEl0Ci0JIHVzZXMgdGhlIG9mZnNldCBvZiBMQy4uMSB3aXRoaW4gaXRzIGNzZWN0LiAgSG93ZXZlciwgLmxvbmcKLQkgTEMuLjEgd2lsbCBnZW5lcmF0ZSBhIHJlbG9jLiAgSSBjYW4ndCBmaW5kIGFueSBkb2N1bWVudGF0aW9uCi0JIG9uIGhvdyB0aGVzZSBjYXNlcyBhcmUgdG8gYmUgZGlzdGluZ3Vpc2hlZCwgc28gdGhpcyBpcyBhIHdpbGQKLQkgZ3Vlc3MuICBUaGVzZSBjYXNlcyBhcmUgZ2VuZXJhdGVkIGJ5IGdjYyAtbW1pbmltYWwtdG9jLiAgKi8KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9QQVJFTlMpICE9IDAKLQkgICYmIG9wZXJhbmQtPmJpdHMgPT0gMTYKLQkgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDAKLQkgICYmIG9wZXJhbmQtPmluc2VydCA9PSBOVUxMCi0JICAmJiBmaXhwLT5meF9hZGRzeSAhPSBOVUxMCi0JICAmJiBmaXhwLT5meF9hZGRzeS0+c3lfdGMuc3Vic2VnICE9IDAKLQkgICYmIGZpeHAtPmZ4X2FkZHN5LT5zeV90Yy5jbGFzcyAhPSBYTUNfVEMKLQkgICYmIGZpeHAtPmZ4X2FkZHN5LT5zeV90Yy5jbGFzcyAhPSBYTUNfVEMwCi0JICAmJiBTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gYnNzX3NlY3Rpb24pCi0JewotCSAgdmFsdWUgPSBmaXhwLT5meF9vZmZzZXQ7Ci0JICBmaXhwLT5meF9kb25lID0gMTsKLQl9Ci0jZW5kaWYKLQotICAgICAgLyogRmV0Y2ggdGhlIGluc3RydWN0aW9uLCBpbnNlcnQgdGhlIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmQKLQkgdmFsdWUsIGFuZCBzdHVmZiB0aGUgaW5zdHJ1Y3Rpb24gYmFjayBhZ2Fpbi4gICovCi0gICAgICB3aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlpbnNuID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgZWxzZQotCWluc24gPSBiZmRfZ2V0bDMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBpbnNuID0gcHBjX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCAob2Zmc2V0VCkgdmFsdWUsCi0JCQkJIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLQotICAgICAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0JewotCSAgLyogTm90aGluZyBlbHNlIHRvIGRvIGhlcmUuICAqLwotCSAgcmV0dXJuIDE7Ci0JfQotCi0gICAgICAvKiBEZXRlcm1pbmUgYSBCRkQgcmVsb2MgdmFsdWUgYmFzZWQgb24gdGhlIG9wZXJhbmQgaW5mb3JtYXRpb24uCi0JIFdlIGFyZSBvbmx5IHByZXBhcmVkIHRvIHR1cm4gYSBmZXcgb2YgdGhlIG9wZXJhbmRzIGludG8KLQkgcmVsb2NzLgotCSBGSVhNRTogV2UgbmVlZCB0byBoYW5kbGUgdGhlIERTIGZpZWxkIGF0IHRoZSB2ZXJ5IGxlYXN0LgotCSBGSVhNRTogU2VsZWN0aW5nIHRoZSByZWxvYyB0eXBlIGlzIGEgYml0IGhhcGhhemFyZDsgcGVyaGFwcwotCSB0aGVyZSBzaG91bGQgYmUgYSBuZXcgZmllbGQgaW4gdGhlIG9wZXJhbmQgdGFibGUuICAqLwotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1JFTEFUSVZFKSAhPSAwCi0JICAmJiBvcGVyYW5kLT5iaXRzID09IDI2Ci0JICAmJiBvcGVyYW5kLT5zaGlmdCA9PSAwKQotCWZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19QUENfQjI2OwotICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUkVMQVRJVkUpICE9IDAKLQkgICYmIG9wZXJhbmQtPmJpdHMgPT0gMTYKLQkgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDApCi0JZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1BQQ19CMTY7Ci0gICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9BQlNPTFVURSkgIT0gMAotCSAgICAgICAmJiBvcGVyYW5kLT5iaXRzID09IDI2Ci0JICAgICAgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDApCi0JZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1BQQ19CQTI2OwotICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfQUJTT0xVVEUpICE9IDAKLQkgICAgICAgJiYgb3BlcmFuZC0+Yml0cyA9PSAxNgotCSAgICAgICAmJiBvcGVyYW5kLT5zaGlmdCA9PSAwKQotCWZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19QUENfQkExNjsKLSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1BBUkVOUykgIT0gMAotCSAgICAgICAmJiBvcGVyYW5kLT5iaXRzID09IDE2Ci0JICAgICAgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDAKLQkgICAgICAgJiYgb3BlcmFuZC0+aW5zZXJ0ID09IE5VTEwKLQkgICAgICAgJiYgZml4cC0+ZnhfYWRkc3kgIT0gTlVMTAotCSAgICAgICAmJiBwcGNfaXNfdG9jX3N5bSAoZml4cC0+ZnhfYWRkc3kpKQotCXsKLQkgIGZpeHAtPmZ4X3NpemUgPSAyOwotCSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCSAgICBmaXhwLT5meF93aGVyZSArPSAyOwotCSAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1BQQ19UT0MxNjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqc2ZpbGU7Ci0JICB1bnNpZ25lZCBpbnQgc2xpbmU7Ci0KLQkgIC8qIFVzZSBleHByX3N5bWJvbF93aGVyZSB0byBzZWUgaWYgdGhpcyBpcyBhbiBleHByZXNzaW9uCi0gICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgIGlmIChleHByX3N5bWJvbF93aGVyZSAoZml4cC0+ZnhfYWRkc3ksICZzZmlsZSwgJnNsaW5lKSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICBfKCJ1bnJlc29sdmVkIGV4cHJlc3Npb24gdGhhdCBtdXN0IGJlIHJlc29sdmVkIikpOwotCSAgZWxzZQotCSAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgIF8oInVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSIpKTsKLQkgIGZpeHAtPmZ4X2RvbmUgPSAxOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBwcGNfZWxmX3ZhbGlkYXRlX2ZpeCAoZml4cCwgc2VnKTsKLSNlbmRpZgotICAgICAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0JewotCWNhc2UgQkZEX1JFTE9DXzMyOgotCWNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0JICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQkJCQkJLyogZmFsbCB0aHJvdWdoICovCi0KLQljYXNlIEJGRF9SRUxPQ19SVkE6Ci0JY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfMzJfQkFTRVJFTDoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMzI6Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZSwKLQkJCSAgICAgIHZhbHVlLCA0KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfTE8xNjoKLQljYXNlIEJGRF9SRUxPQ18xNjoKLQljYXNlIEJGRF9SRUxPQ19HUFJFTDE2OgotCWNhc2UgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTDoKLQljYXNlIEJGRF9SRUxPQ18xNl9HT1RPRkY6Ci0JY2FzZSBCRkRfUkVMT0NfTE8xNl9HT1RPRkY6Ci0JY2FzZSBCRkRfUkVMT0NfSEkxNl9HT1RPRkY6Ci0JY2FzZSBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRjoKLQljYXNlIEJGRF9SRUxPQ19MTzE2X0JBU0VSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfSEkxNl9CQVNFUkVMOgotCWNhc2UgQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMOgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNjoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE86Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hJOgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9IQToKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNjoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2OgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0VDMTY6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9MTzoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJOgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEE6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREE6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX1RPQzE2OgotCSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCSAgICB7Ci0JICAgICAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwpCi0JCWFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICAgIF8oImNhbm5vdCBlbWl0IFBDIHJlbGF0aXZlICVzIHJlbG9jYXRpb24gYWdhaW5zdCAlcyIpLAotCQkJICAgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeHAtPmZ4X3JfdHlwZSksCi0JCQkgICAgICBTX0dFVF9OQU1FIChmaXhwLT5meF9hZGRzeSkpOwotCSAgICAgIGVsc2UKLQkJYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgICAgXygiY2Fubm90IGVtaXQgUEMgcmVsYXRpdmUgJXMgcmVsb2NhdGlvbiIpLAotCQkJICAgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeHAtPmZ4X3JfdHlwZSkpOwotCSAgICB9Ci0KLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUsIDIpOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgY2FzZSBoYXBwZW5zIHdoZW4geW91IHdyaXRlLCBmb3IgZXhhbXBsZSwKLQkgICAgIGxpcyAlcjMsKEwxLUwyKUBoYQotCSAgICAgd2hlcmUgTDEgYW5kIEwyIGFyZSBkZWZpbmVkIGxhdGVyLiAgKi8KLQljYXNlIEJGRF9SRUxPQ19ISTE2OgotCSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCSAgICBhYm9ydCAoKTsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUgPj4gMTYsIDIpOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotCSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCSAgICBhYm9ydCAoKTsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUgKyAweDgwMDAgPj4gMTYsIDIpOwotCSAgYnJlYWs7Ci0KLQkgIC8qIEJlY2F1c2UgU0RBMjEgbW9kaWZpZXMgdGhlIHJlZ2lzdGVyIGZpZWxkLCB0aGUgc2l6ZSBpcyBzZXQgdG8gNAotCSAgICAgYnl0ZXMsIHJhdGhlciB0aGFuIDIsIHNvIG9mZnNldCBpdCBoZXJlIGFwcHJvcHJpYXRlbHkgKi8KLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQTIxOgotCSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCSAgICBhYm9ydCAoKTsKLQotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmUKLQkJCSAgICAgICsgKCh0YXJnZXRfYmlnX2VuZGlhbikgPyAyIDogMCksCi0JCQkgICAgICB2YWx1ZSwgMik7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DXzg6Ci0JICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JICAgIGFib3J0ICgpOwotCi0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZSwKLQkJCSAgICAgIHZhbHVlLCAxKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfMjRfUExUX1BDUkVMOgotCWNhc2UgQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEM6Ci0JICBpZiAoIWZpeHAtPmZ4X3BjcmVsICYmICFmaXhwLT5meF9kb25lKQotCSAgICBhYm9ydCAoKTsKLQotCSAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0JICB7Ci0JICAgIGNoYXIgKndoZXJlOwotCSAgICB1bnNpZ25lZCBsb25nIGluc247Ci0JICAgIAotCSAgICAvKiBGZXRjaCB0aGUgaW5zdHJ1Y3Rpb24sIGluc2VydCB0aGUgZnVsbHkgcmVzb2x2ZWQgb3BlcmFuZAotCSAgICAgICB2YWx1ZSwgYW5kIHN0dWZmIHRoZSBpbnN0cnVjdGlvbiBiYWNrIGFnYWluLiAgKi8KLQkgICAgd2hlcmUgPSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmU7Ci0JICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQkgICAgICBpbnNuID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotCSAgICBlbHNlCi0JICAgICAgaW5zbiA9IGJmZF9nZXRsMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLQkgICAgaWYgKCh2YWx1ZSAmIDMpICE9IDApCi0JICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgIF8oIm11c3QgYnJhbmNoIHRvIGFuIGFkZHJlc3MgYSBtdWx0aXBsZSBvZiA0IikpOwotCSAgICBpZiAoKG9mZnNldFQpIHZhbHVlIDwgLTB4NDAwMDAwMDAKLQkJfHwgKG9mZnNldFQpIHZhbHVlID49IDB4NDAwMDAwMDApCi0JICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgIF8oIkBsb2NhbCBvciBAcGx0IGJyYW5jaCBkZXN0aW5hdGlvbiBpcyB0b28gZmFyIGF3YXksICVsZCBieXRlcyIpLAotCQkJICAgIHZhbHVlKTsKLQkgICAgaW5zbiA9IGluc24gfCAodmFsdWUgJiAweDAzZmZmZmZjKTsKLQkgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0JICAgIGVsc2UKLQkgICAgICBiZmRfcHV0bDMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLQkgIGZpeHAtPmZ4X2RvbmUgPSAwOwotCSAgaWYgKGZpeHAtPmZ4X2FkZHN5Ci0JICAgICAgJiYgIVNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpCi0JICAgICAgJiYgIVNfSVNfV0VBSyAoZml4cC0+ZnhfYWRkc3kpKQotCSAgICBTX1NFVF9XRUFLIChmaXhwLT5meF9hZGRzeSk7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLQkgIGZpeHAtPmZ4X2RvbmUgPSAwOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgZnByaW50ZihzdGRlcnIsCi0JCSAgXygiR2FzIGZhaWx1cmUsIHJlbG9jIHZhbHVlICVkXG4iKSwgZml4cC0+Znhfcl90eXBlKTsKLQkgIGZmbHVzaChzdGRlcnIpOwotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotI2lmZGVmIE9CSl9FTEYKLSAgZml4cC0+ZnhfYWRkbnVtYmVyID0gdmFsdWU7Ci0jZWxzZQotICBpZiAoZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19QUENfVE9DMTYpCi0gICAgZml4cC0+ZnhfYWRkbnVtYmVyID0gMDsKLSAgZWxzZQotICAgIHsKLSNpZmRlZiBURV9QRQotICAgICAgZml4cC0+ZnhfYWRkbnVtYmVyID0gMDsKLSNlbHNlCi0gICAgICAvKiBXZSB3YW50IHRvIHVzZSB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgZGF0YSBzZWdtZW50IG9mIHRoZQotCSBzeW1ib2wsIG5vdCB0aGUgYWN0dWFsIFZNQSBvZiB0aGUgc3ltYm9sLiAgKi8KLSAgICAgIGZpeHAtPmZ4X2FkZG51bWJlciA9Ci0JLSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChzdGRvdXRwdXQsIFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSk7Ci0jZW5kaWYKLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gMTsKLX0KLQotLyogR2VuZXJhdGUgYSByZWxvYyBmb3IgYSBmaXh1cC4gICovCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWcsIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbG9jOwotCi0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gJmZpeHAtPmZ4X2FkZHN5LT5ic3ltOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJyZWxvYyAlZCBub3Qgc3VwcG9ydGVkIGJ5IG9iamVjdCBmaWxlIGZvcm1hdCIpLCAoaW50KWZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0KLSAgcmV0dXJuIHJlbG9jOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1wcGMuaCBiL2dhcy9jb25maWcvdGMtcHBjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NzFkMTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1wcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKiB0Yy1wcGMuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtcHBjLmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfUFBDCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBmaXg7Ci0jZW5kaWYKLQotLyogU2V0IHRoZSBlbmRpYW5uZXNzIHdlIGFyZSB1c2luZy4gIERlZmF1bHQgdG8gYmlnIGVuZGlhbi4gICovCi0jaWZuZGVmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLSNlbmRpZgotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAjZXJyb3IgUG93ZXJQQyBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0vKiBJZiBPQkpfQ09GRiBpcyBkZWZpbmVkLCBhbmQgVEVfUEUgaXMgbm90IGRlZmluZWQsIHdlIGFyZSBhc3NlbWJsaW5nCi0gICBYQ09GRiBmb3IgQUlYIG9yIFBvd2VyTWFjLiAgSWYgVEVfUEUgaXMgZGVmaW5lZCwgd2UgYXJlIGFzc2VtYmxpbmcKLSAgIENPRkYgZm9yIFdpbmRvd3MgTlQuICAqLwotCi0jaWZkZWYgT0JKX0NPRkYKLSNpZm5kZWYgVEVfUEUKLSNkZWZpbmUgT0JKX1hDT0ZGCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCAocHBjX2FyY2ggKCkpCi1leHRlcm4gZW51bSBiZmRfYXJjaGl0ZWN0dXJlIHBwY19hcmNoIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogV2hldGhlciBvciBub3QgdGhlIHRhcmdldCBpcyBiaWcgZW5kaWFuICovCi1leHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOwotCi0vKiBUaGUgdGFyZ2V0IEJGRCBmb3JtYXQuICAqLwotI2lmZGVmIE9CSl9DT0ZGCi0jaWZkZWYgVEVfUEUKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAodGFyZ2V0X2JpZ19lbmRpYW4gPyAicGUtcG93ZXJwYyIgOiAicGUtcG93ZXJwY2xlIikKLSNlbHNlCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImFpeGNvZmYtcnM2MDAwIgotI2VuZGlmCi0jZW5kaWYKLQotLyogUG93ZXJNYWMgaGFzIGEgQkZEIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIEFJWCdzLiAgKi8KLSNpZmRlZiBURV9QT1dFUk1BQwotI2lmZGVmIFRBUkdFVF9GT1JNQVQKLSN1bmRlZiBUQVJHRVRfRk9STUFUCi0jZW5kaWYKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAieGNvZmYtcG93ZXJtYWMiCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAodGFyZ2V0X2JpZ19lbmRpYW4gPyAiZWxmMzItcG93ZXJwYyIgOiAiZWxmMzItcG93ZXJwY2xlIikKLSNlbmRpZgotCi0vKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogJCBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uLiAgKi8KLSNkZWZpbmUgRE9MTEFSX0RPVAotCi0vKiBTdHJpbmdzIGRvIG5vdCB1c2UgYmFja3NsYXNoIGVzY2FwZXMgdW5kZXIgQ09GRi4gICovCi0jaWZkZWYgT0JKX0NPRkYKLSNkZWZpbmUgTk9fU1RSSU5HX0VTQ0FQRVMKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBESUZGX0VYUFJfT0sJCS8qIGZvby0uIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCi0jZW5kaWYKLQotI2lmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0jZGVmaW5lIFBQQ19CSUdfRU5ESUFOIDEKLSNlbHNlCi0jZGVmaW5lIFBQQ19CSUdfRU5ESUFOIDAKLSNlbmRpZgotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qIFdlIHNldCB0aGUgZnhfZG9uZSBmaWVsZCBhcHByb3ByaWF0ZWx5IGluIG1kX2FwcGx5X2ZpeC4gICovCi0jZGVmaW5lIFRDX0hBTkRMRVNfRlhfRE9ORQotDAotI2lmZGVmIFRFX1BFCi0KLS8qIFF1ZXN0aW9uIG1hcmtzIGFyZSBwZXJtaXR0ZWQgaW4gc3ltYm9sIG5hbWVzLiAgKi8KLSNkZWZpbmUgTEVYX1FNIDEKLQotLyogRG9uJ3QgYWRqdXN0IFRPQyByZWxvY3MuICAqLwotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShmaXhwKSBwcGNfcGVfZml4X2FkanVzdGFibGUgKGZpeHApCi1leHRlcm4gaW50IHBwY19wZV9maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotI2VuZGlmCi0KLSNpZmRlZiBPQkpfWENPRkYKLQotLyogRGVjbGFyYXRpb25zIG5lZWRlZCB3aGVuIGdlbmVyYXRpbmcgWENPRkYgY29kZS4gIFhDT0ZGIGlzIGFuCi0gICBleHRlbnNpb24gb2YgQ09GRiwgdXNlZCBvbmx5IG9uIHRoZSBSUy82MDAwLiAgUmF0aGVyIHRoYW4gY3JlYXRlIGFuCi0gICBvYmoteGNvZmYsIHdlIGp1c3QgdXNlIG9iai1jb2ZmLCBhbmQgaGFuZGxlIHRoZSBleHRlbnNpb25zIGhlcmUgaW4KLSAgIHRjLXBwYy4gICovCi0KLS8qIFdlIG5lZWQgdG8ga2VlcCBzb21lIGluZm9ybWF0aW9uIGZvciBzeW1ib2xzLiAgKi8KLXN0cnVjdCBwcGNfdGNfc3kKLXsKLSAgLyogV2Uga2VlcCBhIGZldyBsaW5rZWQgbGlzdHMgb2Ygc3ltYm9scy4gICovCi0gIHN0cnVjdCBzeW1ib2wgKm5leHQ7Ci0gIC8qIE5vbi16ZXJvIGlmIHRoZSBzeW1ib2wgc2hvdWxkIGJlIG91dHB1dC4gIFRoZSBSUy82MDAwIGFzc2VtYmxlcgotICAgICBvbmx5IG91dHB1dHMgc3ltYm9scyB0aGF0IGFyZSBleHRlcm5hbCBvciBhcmUgbWVudGlvbmVkIGluIGEKLSAgICAgLmdsb2JsIG9yIC5sZ2xvYmwgc3RhdGVtZW50LiAgKi8KLSAgaW50IG91dHB1dDsKLSAgLyogVGhlIHN5bWJvbCBjbGFzcy4gICovCi0gIGludCBjbGFzczsKLSAgLyogVGhlIHJlYWwgbmFtZSwgaWYgdGhlIHN5bWJvbCB3YXMgcmVuYW1lZC4gICovCi0gIGNoYXIgKnJlYWxfbmFtZTsKLSAgLyogRm9yIGEgY3NlY3Qgc3ltYm9sLCB0aGUgc3Vic2VnbWVudCB3ZSBhcmUgdXNpbmcuICBUaGlzIGlzIHplcm8KLSAgICAgZm9yIHN5bWJvbHMgdGhhdCBhcmUgbm90IGNzZWN0cy4gICovCi0gIHN1YnNlZ1Qgc3Vic2VnOwotICAvKiBGb3IgYSBjc2VjdCBvciBjb21tb24gc3ltYm9sLCB0aGUgYWxpZ25tZW50IHRvIHVzZS4gICovCi0gIGludCBhbGlnbjsKLSAgLyogRm9yIGEgZnVuY3Rpb24gc3ltYm9sLCBhIHN5bWJvbCB3aG9zZSB2YWx1ZSBpcyB0aGUgc2l6ZS4gIFRoZQotICAgICBmaWVsZCBpcyBOVUxMIGlmIHRoZXJlIGlzIG5vIHNpemUuICAqLwotICBzdHJ1Y3Qgc3ltYm9sICpzaXplOwotICAvKiBGb3IgYSBjc2VjdCBzeW1ib2wsIHRoZSBsYXN0IHN5bWJvbCB3aGljaCBoYXMgYmVlbiBkZWZpbmVkIGluCi0gICAgIHRoaXMgY3NlY3QsIG9yIE5VTEwgaWYgbm9uZSBoYXZlIGJlZW4gZGVmaW5lZCBzbyBmYXIuICBGb3IgYSAuYnMKLSAgICAgc3ltYm9sLCB0aGUgcmVmZXJlbmNlZCBjc2VjdCBzeW1ib2wuICAqLwotICBzdHJ1Y3Qgc3ltYm9sICp3aXRoaW47Ci19OwotCi0jZGVmaW5lIFRDX1NZTUZJRUxEX1RZUEUgc3RydWN0IHBwY190Y19zeQotCi0vKiBXZSBuZWVkIGFuIGFkZGl0aW9uYWwgYXV4ZW50IGZvciBmdW5jdGlvbiBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMgMgotCi0vKiBTcXVhcmUgYW5kIGN1cmx5IGJyYWNrZXRzIGFyZSBwZXJtaXR0ZWQgaW4gc3ltYm9sIG5hbWVzLiAgKi8KLSNkZWZpbmUgTEVYX0JSIDMKLQotLyogQ2Fub25pY2FsaXplIHRoZSBzeW1ib2wgbmFtZS4gICovCi0jZGVmaW5lIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZShuYW1lKSBwcGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChuYW1lKQotZXh0ZXJuIGNoYXIgKnBwY19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgUEFSQU1TICgoY2hhciAqKSk7Ci0KLS8qIEdldCB0aGUgc3ltYm9sIGNsYXNzIGZyb20gdGhlIG5hbWUuICAqLwotI2RlZmluZSB0Y19zeW1ib2xfbmV3X2hvb2soc3ltKSBwcGNfc3ltYm9sX25ld19ob29rIChzeW0pCi1leHRlcm4gdm9pZCBwcGNfc3ltYm9sX25ld19ob29rIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOwotCi0vKiBTZXQgdGhlIHN5bWJvbCBjbGFzcyBvZiBhIGxhYmVsIGJhc2VkIG9uIHRoZSBjc2VjdC4gICovCi0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKSBwcGNfZnJvYl9sYWJlbCAoc3ltKQotZXh0ZXJuIHZvaWQgcHBjX2Zyb2JfbGFiZWwgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqKSk7Ci0KLS8qIFRPQyByZWxvY3MgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZy4gICovCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKGZpeHApIHBwY19maXhfYWRqdXN0YWJsZSAoZml4cCkKLWV4dGVybiBpbnQgcHBjX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0vKiBBIHJlbG9jYXRpb24gZnJvbSBvbmUgY3NlY3QgdG8gYW5vdGhlciBtdXN0IGJlIGtlcHQuICAqLwotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKEZJWFApIHBwY19mb3JjZV9yZWxvY2F0aW9uIChGSVhQKQotZXh0ZXJuIGludCBwcGNfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotLyogV2UgbmVlZCB0byBzZXQgdGhlIHNlY3Rpb24gVk1BLiAgKi8KLSNkZWZpbmUgdGNfZnJvYl9zZWN0aW9uKHNlYykgcHBjX2Zyb2Jfc2VjdGlvbiAoc2VjKQotZXh0ZXJuIHZvaWQgcHBjX2Zyb2Jfc2VjdGlvbiBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci0KLS8qIEZpbmlzaCB1cCB0aGUgc3ltYm9sLiAgKi8KLSNkZWZpbmUgdGNfZnJvYl9zeW1ib2woc3ltLCBwdW50KSBwdW50ID0gcHBjX2Zyb2Jfc3ltYm9sIChzeW0pCi1leHRlcm4gaW50IHBwY19mcm9iX3N5bWJvbCBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICopKTsKLQotLyogRmluaXNoIHVwIHRoZSBlbnRpcmUgc3ltdGFiLiAgKi8KLSNkZWZpbmUgdGNfYWRqdXN0X3N5bXRhYigpIHBwY19hZGp1c3Rfc3ltdGFiICgpCi1leHRlcm4gdm9pZCBwcGNfYWRqdXN0X3N5bXRhYiBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIE5pY2xhcyBBbmRlcnNzb24gPG5pY2FuQGlkYS5saXUuc2U+IHNheXMgdGhpcyBpcyBuZWVkZWQuICAqLwotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpIDIKLQotI2VuZGlmIC8qIE9CSl9YQ09GRiAqLwotCi0jaWZkZWYgT0JKX0VMRgotCi0vKiBCcmFuY2ggcHJlZGljdGlvbiByZWxvY2F0aW9ucyBtdXN0IGZvcmNlIHJlbG9jYXRpb24sIGFzIG11c3QKLSAgIHRoZSB2dGFibGUgZGVzY3JpcHRpb24gcmVsb2NzLiAgKi8KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKQkJCQkJXAotKChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU4JCQkJXAotIHx8IChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOCQkJXAotIHx8IChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOCQkJXAotIHx8IChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTgkJCVwKLSB8fCAoRklYUCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQJCQlcCi0gfHwgKEZJWFApLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLQotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04oRklYUCxTRUMpCQkJCVwKLShUQ19GT1JDRV9SRUxPQ0FUSU9OIChGSVhQKQkJCQkJCVwKLSB8fCAoKEZJWFApLT5meF9hZGRzeSAmJiAhKEZJWFApLT5meF9zdWJzeSAmJiAoRklYUCktPmZ4X2FkZHN5LT5ic3ltCVwKLSAgICAgJiYgKEZJWFApLT5meF9hZGRzeS0+YnN5bS0+c2VjdGlvbiAhPSBTRUMpKQotCi0vKiBTdXBwb3J0IGZvciBTSEZfRVhDTFVERSBhbmQgU0hUX09SREVSRUQgKi8KLWV4dGVybiBpbnQgcHBjX3NlY3Rpb25fbGV0dGVyIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotZXh0ZXJuIGludCBwcGNfc2VjdGlvbl90eXBlIFBBUkFNUyAoKGNoYXIgKiopKTsKLWV4dGVybiBpbnQgcHBjX3NlY3Rpb25fd29yZCBQQVJBTVMgKChjaGFyICoqKSk7Ci1leHRlcm4gaW50IHBwY19zZWN0aW9uX2ZsYWdzIFBBUkFNUyAoKGludCwgaW50LCBpbnQpKTsKLQotI2RlZmluZSBtZF9lbGZfc2VjdGlvbl9sZXR0ZXIoTEVUVEVSLCBQVFJfTVNHKQlwcGNfc2VjdGlvbl9sZXR0ZXIgKExFVFRFUiwgUFRSX01TRykKLSNkZWZpbmUgbWRfZWxmX3NlY3Rpb25fdHlwZShQVFJfU1RSKQkJcHBjX3NlY3Rpb25fdHlwZSAoUFRSX1NUUikKLSNkZWZpbmUgbWRfZWxmX3NlY3Rpb25fd29yZChQVFJfU1RSKQkJcHBjX3NlY3Rpb25fd29yZCAoUFRSX1NUUikKLSNkZWZpbmUgbWRfZWxmX3NlY3Rpb25fZmxhZ3MoRkxBR1MsIEFUVFIsIFRZUEUpCXBwY19zZWN0aW9uX2ZsYWdzIChGTEFHUywgQVRUUiwgVFlQRSkKLQotLyogQWRkIGV4dHJhIFBQQyBzZWN0aW9ucyAtLSBOb3RlLCBmb3Igbm93LCBtYWtlIC5zYnNzMiBhbmQgLlBQQy5FTUIuc2JzczAgYQotICAgbm9ybWFsIHNlY3Rpb24sIGFuZCBub3QgYSBic3Mgc2VjdGlvbiBzbyB0aGF0IHRoZSBsaW5rZXIgZG9lc24ndCBjcmF0ZXIKLSAgIHdoZW4gdHJ5aW5nIHRvIG1ha2UgbW9yZSB0aGFuIDIgc2VjdGlvbnMuICAqLwotI2RlZmluZSBFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyBcCi0gIHsgIi50YWdzIiwJCVNIVF9PUkRFUkVELAlTSEZfQUxMT0MgfSwgXAotICB7ICIuc2RhdGEiLAkJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgfSwgXAotICB7ICIuc2JzcyIsCQlTSFRfTk9CSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgfSwgXAotICB7ICIuc2RhdGEyIiwJCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DIH0sIFwKLSAgeyAiLnNic3MyIiwJCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DIH0sIFwKLSAgeyAiLlBQQy5FTUIuc2RhdGEwIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgfSwgXAotICB7ICIuUFBDLkVNQi5zYnNzMCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DIH0sCi0KLSNkZWZpbmUgdGNfY29tbWVudF9jaGFycyBwcGNfY29tbWVudF9jaGFycwotZXh0ZXJuIGNvbnN0IGNoYXIgKnBwY19jb21tZW50X2NoYXJzOwotCi0vKiBLZWVwIHJlbG9jYXRpb25zIHJlbGF0aXZlIHRvIHRoZSBHT1QsIG9yIG5vbi1QQyByZWxhdGl2ZS4gKi8KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYKSAgICAgICAgICAgICAgICAgICAgICAgICAgCQlcCi0gICgoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18xNl9HT1RPRkYgICAgICAgICAgICAgIAkJXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfTE8xNl9HT1RPRkYgICAgICAgICAJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0hJMTZfR09UT0ZGICAgICAgICAgCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGICAgICAgIAkJXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfR1BSRUwxNiAgICAgICAgICAgICAJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCQkJXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZCQkJXAotICAgJiYgISBTX0lTX0VYVEVSTkFMICgoRklYKS0+ZnhfYWRkc3kpCQkJCQlcCi0gICAmJiAhIFNfSVNfV0VBSyAoKEZJWCktPmZ4X2FkZHN5KQkJCQkJXAotICAgJiYgKChGSVgpLT5meF9wY3JlbAkJCQkgICAgICAgIAkJXAotICAgICAgIHx8ICgoRklYKS0+Znhfc3Vic3kgIT0gTlVMTAkJCQkJXAotCSAgICYmIChTX0dFVF9TRUdNRU5UICgoRklYKS0+Znhfc3Vic3kpCQkJCVwKLQkgICAgICAgPT0gU19HRVRfU0VHTUVOVCAoKEZJWCktPmZ4X2FkZHN5KSkpCQkJXAotICAgICAgIHx8IHN0cmNociAoU19HRVRfTkFNRSAoKEZJWCktPmZ4X2FkZHN5KSwgJ1wwMDEnKSAhPSBOVUxMCQlcCi0gICAgICAgfHwgc3RyY2hyIChTX0dFVF9OQU1FICgoRklYKS0+ZnhfYWRkc3kpLCAnXDAwMicpICE9IE5VTEwpKQotCi0vKiBXZSBtdXN0IG5ldmVyIGV2ZXIgdHJ5IHRvIHJlc29sdmUgcmVmZXJlbmNlcyB0byBleHRlcm5hbGx5IHZpc2libGUKLSAgIHN5bWJvbHMgaW4gdGhlIGFzc2VtYmxlciwgYmVjYXVzZSB0aGUgLm8gZmlsZSBtaWdodCBnbyBpbnRvIGEgc2hhcmVkCi0gICBsaWJyYXJ5LCBhbmQgc29tZSBvdGhlciBzaGFyZWQgbGlicmFyeSBtaWdodCBvdmVycmlkZSB0aGF0IHN5bWJvbC4gICovCi0jZGVmaW5lIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUChGSVgpICBcCi0gICgoRklYKS0+ZnhfYWRkc3kgPT0gTlVMTCBcCi0gICB8fCAoISBTX0lTX0VYVEVSTkFMICgoRklYKS0+ZnhfYWRkc3kpIFwKLSAgICAgICAmJiAhIFNfSVNfV0VBSyAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgU19JU19ERUZJTkVEICgoRklYKS0+ZnhfYWRkc3kpIFwKLSAgICAgICAmJiAhIFNfSVNfQ09NTU9OICgoRklYKS0+ZnhfYWRkc3kpKSkKLQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQotLyogY2FsbCBtZF9hcHBseV9maXgzIHdpdGggc2VnbWVudCBpbnN0ZWFkIG9mIG1kX2FwcGx5X2ZpeCAqLwotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0KLS8qIGNhbGwgbWRfcGNyZWxfZnJvbV9zZWN0aW9uLCBub3QgbWRfcGNyZWxfZnJvbSAqLwotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24oRklYUCwgU0VDKQotZXh0ZXJuIGxvbmcgbWRfcGNyZWxfZnJvbV9zZWN0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKiwgc2VnVCkpOwotCi0jZGVmaW5lIG1kX3BhcnNlX25hbWUobmFtZSwgZXhwKSBwcGNfcGFyc2VfbmFtZSAobmFtZSwgZXhwKQotZXh0ZXJuIGludCBwcGNfcGFyc2VfbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICosIHN0cnVjdCBleHByZXNzaW9uUyAqKSk7Ci0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXNoLmMgYi9nYXMvY29uZmlnL3RjLXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOGNhODEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1zaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQyNSArMCwwIEBACi0vKiB0Yy1zaC5jIC0tIEFzc2VtYmxlIGNvZGUgZm9yIHRoZSBIaXRhY2hpIFN1cGVyLUgKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICAgV3JpdHRlbiBCeSBTdGV2ZSBDaGFtYmVybGFpbgotICAgc2FjQGN5Z251cy5jb20KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0jaW5jbHVkZSAib3Bjb2Rlcy9zaC1vcGMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiISI7Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiEjIjsKLQotc3RhdGljIHZvaWQgc191c2VzIFBBUkFNUyAoKGludCkpOwotCi1zdGF0aWMgdm9pZCBzaF9jb3VudF9yZWxvY3MgUEFSQU1TICgoYmZkICosIHNlZ1QsIFBUUikpOwotc3RhdGljIHZvaWQgc2hfZnJvYl9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBzZWdULCBQVFIpKTsKLQotLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLSAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgIEludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCi0gKi8KLQotdm9pZCBjb25zICgpOwotdm9pZCBzX2FsaWduX2J5dGVzICgpOwotc3RhdGljIHZvaWQgc191YWNvbnMgUEFSQU1TICgoaW50KSk7Ci0KLWludCBzaGwgPSAwOwotCi1zdGF0aWMgdm9pZAotbGl0dGxlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHNobCA9IDE7Ci0gIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKLX0KLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJpbnQiLCBjb25zLCA0fSwKLSAgeyJ3b3JkIiwgY29ucywgMn0sCi0gIHsiZm9ybSIsIGxpc3RpbmdfcHNpemUsIDB9LAotICB7ImxpdHRsZSIsIGxpdHRsZSwgMH0sCi0gIHsiaGVhZGluZyIsIGxpc3RpbmdfdGl0bGUsIDB9LAotICB7ImltcG9ydCIsIHNfaWdub3JlLCAwfSwKLSAgeyJwYWdlIiwgbGlzdGluZ19lamVjdCwgMH0sCi0gIHsicHJvZ3JhbSIsIHNfaWdub3JlLCAwfSwKLSAgeyJ1c2VzIiwgc191c2VzLCAwfSwKLSAgeyJ1YXdvcmQiLCBzX3VhY29ucywgMn0sCi0gIHsidWFsb25nIiwgc191YWNvbnMsIDR9LAotICB7MCwgMCwgMH0KLX07Ci0KLS8qaW50IG1kX3JlbG9jX3NpemU7ICovCi0KLWludCBzaF9yZWxheDsJCS8qIHNldCBpZiAtcmVsYXggc2VlbiAqLwotCi0vKiBXaGV0aGVyIC1zbWFsbCB3YXMgc2Vlbi4gICovCi0KLWludCBzaF9zbWFsbDsKLQotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotI2RlZmluZSBDKGEsYikgRU5DT0RFX1JFTEFYKGEsYikKLQotI2RlZmluZSBKUkVHIDE0CQkJLyogUmVnaXN0ZXIgdXNlZCBhcyBhIHRlbXAgd2hlbiByZWxheGluZyAqLwotI2RlZmluZSBFTkNPREVfUkVMQVgod2hhdCxsZW5ndGgpICgoKHdoYXQpIDw8IDQpICsgKGxlbmd0aCkpCi0jZGVmaW5lIEdFVF9XSEFUKHgpICgoeD4+NCkpCi0KLS8qIFRoZXNlIGFyZSB0aGUgdGhyZWUgdHlwZXMgb2YgcmVsYXhhYmxlIGluc3RyY3Rpb24gKi8KLSNkZWZpbmUgQ09ORF9KVU1QIDEKLSNkZWZpbmUgQ09ORF9KVU1QX0RFTEFZIDIKLSNkZWZpbmUgVU5DT05EX0pVTVAgIDMKLSNkZWZpbmUgRU5EIDQKLQotI2RlZmluZSBVTkRFRl9ESVNQIDAKLSNkZWZpbmUgQ09ORDggIDEKLSNkZWZpbmUgQ09ORDEyIDIKLSNkZWZpbmUgQ09ORDMyIDMKLSNkZWZpbmUgVU5DT05EMTIgMQotI2RlZmluZSBVTkNPTkQzMiAyCi0jZGVmaW5lIFVOREVGX1dPUkRfRElTUCA0Ci0KLSNkZWZpbmUgVU5DT05EMTIgMQotI2RlZmluZSBVTkNPTkQzMiAyCi0KLS8qIEJyYW5jaCBkaXNwbGFjZW1lbnRzIGFyZSBmcm9tIHRoZSBhZGRyZXNzIG9mIHRoZSBicmFuY2ggcGx1cwotICAgZm91ciwgdGh1cyBhbGwgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgaGF2ZSA0IGFkZGVkIHRvIHRoZW0uICAqLwotI2RlZmluZSBDT05EOF9GIDI1OAotI2RlZmluZSBDT05EOF9NIC0yNTIKLSNkZWZpbmUgQ09ORDhfTEVOR1RIIDIKLQotLyogVGhlcmUgaXMgb25lIGV4dHJhIGluc3RydWN0aW9uIGJlZm9yZSB0aGUgYnJhbmNoLCBzbyB3ZSBtdXN0IGFkZAotICAgdHdvIG1vcmUgYnl0ZXMgdG8gYWNjb3VudCBmb3IgaXQuICAqLwotI2RlZmluZSBDT05EMTJfRiA0MTAwCi0jZGVmaW5lIENPTkQxMl9NIC00MDkwCi0jZGVmaW5lIENPTkQxMl9MRU5HVEggNgotCi0jZGVmaW5lIENPTkQxMl9ERUxBWV9MRU5HVEggNAotCi0vKiA/Pz8gVGhlIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGFyZSB3cm9uZywgYnV0IHRoaXMgZG9lcyBub3QgbWF0dGVyCi0gICBzaW5jZSB0aGlzIHJlbG9jYXRpb24gdHlwZSBpcyBub3Qgc3VwcG9ydGVkIHlldC4gICovCi0jZGVmaW5lIENPTkQzMl9GICgxPDwzMCkKLSNkZWZpbmUgQ09ORDMyX00gLSgxPDwzMCkKLSNkZWZpbmUgQ09ORDMyX0xFTkdUSCAxNAotCi0jZGVmaW5lIFVOQ09ORDEyX0YgNDA5OAotI2RlZmluZSBVTkNPTkQxMl9NIC00MDkyCi0jZGVmaW5lIFVOQ09ORDEyX0xFTkdUSCAyCi0KLS8qID8/PyBUaGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYXJlIHdyb25nLCBidXQgdGhpcyBkb2VzIG5vdCBtYXR0ZXIKLSAgIHNpbmNlIHRoaXMgcmVsb2NhdGlvbiB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiAgKi8KLSNkZWZpbmUgVU5DT05EMzJfRiAoMTw8MzApCi0jZGVmaW5lIFVOQ09ORDMyX00gLSgxPDwzMCkKLSNkZWZpbmUgVU5DT05EMzJfTEVOR1RIIDE0Ci0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW0MgKEVORCwgMCldID0gewotICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sCi0gIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKLQotICB7IDAgfSwKLSAgLyogQyAoQ09ORF9KVU1QLCBDT05EOCkgKi8KLSAgeyBDT05EOF9GLCBDT05EOF9NLCBDT05EOF9MRU5HVEgsIEMgKENPTkRfSlVNUCwgQ09ORDEyKSB9LAotICAvKiBDIChDT05EX0pVTVAsIENPTkQxMikgKi8KLSAgeyBDT05EMTJfRiwgQ09ORDEyX00sIENPTkQxMl9MRU5HVEgsIEMgKENPTkRfSlVNUCwgQ09ORDMyKSwgfSwKLSAgLyogQyAoQ09ORF9KVU1QLCBDT05EMzIpICovCi0gIHsgQ09ORDMyX0YsIENPTkQzMl9NLCBDT05EMzJfTEVOR1RILCAwLCB9LAotICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKLSAgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAotCi0gIHsgMCB9LAotICAvKiBDIChDT05EX0pVTVBfREVMQVksIENPTkQ4KSAqLwotICB7IENPTkQ4X0YsIENPTkQ4X00sIENPTkQ4X0xFTkdUSCwgQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMTIpIH0sCi0gIC8qIEMgKENPTkRfSlVNUF9ERUxBWSwgQ09ORDEyKSAqLwotICB7IENPTkQxMl9GLCBDT05EMTJfTSwgQ09ORDEyX0RFTEFZX0xFTkdUSCwgQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMzIpLCB9LAotICAvKiBDIChDT05EX0pVTVBfREVMQVksIENPTkQzMikgKi8KLSAgeyBDT05EMzJfRiwgQ09ORDMyX00sIENPTkQzMl9MRU5HVEgsIDAsIH0sCi0gIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAotICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sCi0KLSAgeyAwIH0sCi0gIC8qIEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMikgKi8KLSAgeyBVTkNPTkQxMl9GLCBVTkNPTkQxMl9NLCBVTkNPTkQxMl9MRU5HVEgsIEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQzMiksIH0sCi0gIC8qIEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQzMikgKi8KLSAgeyBVTkNPTkQzMl9GLCBVTkNPTkQzMl9NLCBVTkNPTkQzMl9MRU5HVEgsIDAsIH0sCi0gIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKLSAgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wY29kZV9oYXNoX2NvbnRyb2w7CS8qIE9wY29kZSBtbmVtb25pY3MgKi8KLQotLyoKLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBUaGlzIHNob3VsZAotICAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMgdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIG5lZWRzCi0gKi8KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgc2hfb3Bjb2RlX2luZm8gKm9wY29kZTsKLSAgY2hhciAqcHJldl9uYW1lID0gIiI7Ci0KLSAgaWYgKCEgc2hsKQotICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMTsKLQotICBvcGNvZGVfaGFzaF9jb250cm9sID0gaGFzaF9uZXcgKCk7Ci0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUgKi8KLSAgZm9yIChvcGNvZGUgPSBzaF90YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChwcmV2X25hbWUsIG9wY29kZS0+bmFtZSkpCi0JewotCSAgcHJldl9uYW1lID0gb3Bjb2RlLT5uYW1lOwotCSAgaGFzaF9pbnNlcnQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG9wY29kZS0+bmFtZSwgKGNoYXIgKikgb3Bjb2RlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTWFrZSBhbGwgdGhlIG9wY29kZXMgd2l0aCB0aGUgc2FtZSBuYW1lIHBvaW50IHRvIHRoZSBzYW1lCi0JICAgICBzdHJpbmcgKi8KLQkgIG9wY29kZS0+bmFtZSA9IHByZXZfbmFtZTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IHJlZ19tOwotc3RhdGljIGludCByZWdfbjsKLXN0YXRpYyBpbnQgcmVnX2I7Ci0KLXN0YXRpYyBleHByZXNzaW9uUyBpbW1lZGlhdGU7CS8qIGFic29sdXRlIGV4cHJlc3Npb24gKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHNoX2FyZ190eXBlIHR5cGU7Ci0gICAgaW50IHJlZzsKLSAgfQotCi1zaF9vcGVyYW5kX2luZm87Ci0KLS8qIHRyeSBhbmQgcGFyc2UgYSByZWcgbmFtZSwgcmV0dXJucyBudW1iZXIgb2YgY2hhcnMgY29uc3VtZWQgKi8KLXN0YXRpYyBpbnQKLXBhcnNlX3JlZyAoc3JjLCBtb2RlLCByZWcpCi0gICAgIGNoYXIgKnNyYzsKLSAgICAgaW50ICptb2RlOwotICAgICBpbnQgKnJlZzsKLXsKLSAgLyogV2UgdXNlICFpc2FsbnVtIGZvciB0aGUgbmV4dCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIHJlZ2lzdGVyIG5hbWUsIHRvCi0gICAgIG1ha2Ugc3VyZSB0aGF0IHdlIHdvbid0IGFjY2lkZW50YWxseSByZWNvZ25pemUgYSBzeW1ib2wgbmFtZSBzdWNoIGFzCi0gICAgICdzcmFtJyBhcyBiZWluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVnaXN0ZXIgJ3NyJy4gICovCi0KLSAgaWYgKHNyY1swXSA9PSAncicpCi0gICAgewotICAgICAgaWYgKHNyY1sxXSA+PSAnMCcgJiYgc3JjWzFdIDw9ICc3JyAmJiBzdHJuY21wKCZzcmNbMl0sICJfYmFuayIsIDUpID09IDAKLQkgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s3XSkpCi0JewotCSAgKm1vZGUgPSBBX1JFR19COwotCSAgKnJlZyAgPSAoc3JjWzFdIC0gJzAnKTsKLQkgIHJldHVybiA3OwotCX0KLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAncicpCi0gICAgewotICAgICAgaWYgKHNyY1sxXSA9PSAnMScpCi0JewotCSAgaWYgKHNyY1syXSA+PSAnMCcgJiYgc3JjWzJdIDw9ICc1JwotCSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0JICAgIHsKLQkgICAgICAqbW9kZSA9IEFfUkVHX047Ci0JICAgICAgKnJlZyA9IDEwICsgc3JjWzJdIC0gJzAnOwotCSAgICAgIHJldHVybiAzOwotCSAgICB9Ci0JfQotICAgICAgaWYgKHNyY1sxXSA+PSAnMCcgJiYgc3JjWzFdIDw9ICc5JwotCSAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzJdKSkKLQl7Ci0JICAqbW9kZSA9IEFfUkVHX047Ci0JICAqcmVnID0gKHNyY1sxXSAtICcwJyk7Ci0JICByZXR1cm4gMjsKLQl9Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3MnCi0gICAgICAmJiBzcmNbMV0gPT0gJ3MnCi0gICAgICAmJiBzcmNbMl0gPT0gJ3InICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX1NTUjsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ3AnICYmIHNyY1syXSA9PSAnYycKLSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX1NQQzsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ2cnICYmIHNyY1syXSA9PSAncicKLSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX1NHUjsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdkJyAmJiBzcmNbMV0gPT0gJ2InICYmIHNyY1syXSA9PSAncicKLSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX0RCUjsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ3InICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1syXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX1NSOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncCcgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzJdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEFfUkVHX047Ci0gICAgICAqcmVnID0gMTU7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAncCcgJiYgc3JjWzFdID09ICdyJyAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbMl0pKQotICAgIHsKLSAgICAgICptb2RlID0gQV9QUjsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLSAgaWYgKHNyY1swXSA9PSAncCcgJiYgc3JjWzFdID09ICdjJyAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbMl0pKQotICAgIHsKLSAgICAgICptb2RlID0gQV9ESVNQX1BDOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICdnJyAmJiBzcmNbMV0gPT0gJ2InICYmIHNyY1syXSA9PSAncicKLSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX0dCUjsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLSAgaWYgKHNyY1swXSA9PSAndicgJiYgc3JjWzFdID09ICdiJyAmJiBzcmNbMl0gPT0gJ3InCi0gICAgICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbM10pKQotICAgIHsKLSAgICAgICptb2RlID0gQV9WQlI7Ci0gICAgICByZXR1cm4gMzsKLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAnbScgJiYgc3JjWzFdID09ICdhJyAmJiBzcmNbMl0gPT0gJ2MnCi0gICAgICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbNF0pKQotICAgIHsKLSAgICAgIGlmIChzcmNbM10gPT0gJ2wnKQotCXsKLQkgICptb2RlID0gQV9NQUNMOwotCSAgcmV0dXJuIDQ7Ci0JfQotICAgICAgaWYgKHNyY1szXSA9PSAnaCcpCi0JewotCSAgKm1vZGUgPSBBX01BQ0g7Ci0JICByZXR1cm4gNDsKLQl9Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICdmJyAmJiBzcmNbMV0gPT0gJ3InKQotICAgIHsKLSAgICAgIGlmIChzcmNbMl0gPT0gJzEnKQotCXsKLQkgIGlmIChzcmNbM10gPj0gJzAnICYmIHNyY1szXSA8PSAnNScKLQkgICAgICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbNF0pKQotCSAgICB7Ci0JICAgICAgKm1vZGUgPSBGX1JFR19OOwotCSAgICAgICpyZWcgPSAxMCArIHNyY1szXSAtICcwJzsKLQkgICAgICByZXR1cm4gNDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzcmNbMl0gPj0gJzAnICYmIHNyY1syXSA8PSAnOScKLQkgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0JewotCSAgKm1vZGUgPSBGX1JFR19OOwotCSAgKnJlZyA9IChzcmNbMl0gLSAnMCcpOwotCSAgcmV0dXJuIDM7Ci0JfQotICAgIH0KLSAgaWYgKHNyY1swXSA9PSAnZCcgJiYgc3JjWzFdID09ICdyJykKLSAgICB7Ci0gICAgICBpZiAoc3JjWzJdID09ICcxJykKLQl7Ci0JICBpZiAoc3JjWzNdID49ICcwJyAmJiBzcmNbM10gPD0gJzQnICYmICEgKChzcmNbM10gLSAnMCcpICYgMSkKLQkgICAgICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbNF0pKQotCSAgICB7Ci0JICAgICAgKm1vZGUgPSBEX1JFR19OOwotCSAgICAgICpyZWcgPSAxMCArIHNyY1szXSAtICcwJzsKLQkgICAgICByZXR1cm4gNDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzcmNbMl0gPj0gJzAnICYmIHNyY1syXSA8PSAnOCcgJiYgISAoKHNyY1syXSAtICcwJykgJiAxKQotCSAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLQl7Ci0JICAqbW9kZSA9IERfUkVHX047Ci0JICAqcmVnID0gKHNyY1syXSAtICcwJyk7Ci0JICByZXR1cm4gMzsKLQl9Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICd4JyAmJiBzcmNbMV0gPT0gJ2QnKQotICAgIHsKLSAgICAgIGlmIChzcmNbMl0gPT0gJzEnKQotCXsKLQkgIGlmIChzcmNbM10gPj0gJzAnICYmIHNyY1szXSA8PSAnNCcgJiYgISAoKHNyY1szXSAtICcwJykgJiAxKQotCSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s0XSkpCi0JICAgIHsKLQkgICAgICAqbW9kZSA9IFhfUkVHX047Ci0JICAgICAgKnJlZyA9IDExICsgc3JjWzNdIC0gJzAnOwotCSAgICAgIHJldHVybiA0OwotCSAgICB9Ci0JfQotICAgICAgaWYgKHNyY1syXSA+PSAnMCcgJiYgc3JjWzJdIDw9ICc4JyAmJiAhICgoc3JjWzJdIC0gJzAnKSAmIDEpCi0JICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbM10pKQotCXsKLQkgICptb2RlID0gWF9SRUdfTjsKLQkgICpyZWcgPSAoc3JjWzJdIC0gJzAnKSArIDE7Ci0JICByZXR1cm4gMzsKLQl9Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICdmJyAmJiBzcmNbMV0gPT0gJ3YnKQotICAgIHsKLSAgICAgIGlmIChzcmNbMl0gPT0gJzEnJiYgc3JjWzNdID09ICcyJyAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbNF0pKQotCXsKLQkgICptb2RlID0gVl9SRUdfTjsKLQkgICpyZWcgPSAxMjsKLQkgIHJldHVybiA0OwotCX0KLSAgICAgIGlmICgoc3JjWzJdID09ICcwJyB8fCBzcmNbMl0gPT0gJzQnIHx8IHNyY1syXSA9PSAnOCcpCi0JICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbM10pKQotCXsKLQkgICptb2RlID0gVl9SRUdfTjsKLQkgICpyZWcgPSAoc3JjWzJdIC0gJzAnKTsKLQkgIHJldHVybiAzOwotCX0KLSAgICB9Ci0gIGlmIChzcmNbMF0gPT0gJ2YnICYmIHNyY1sxXSA9PSAncCcgJiYgc3JjWzJdID09ICd1JyAmJiBzcmNbM10gPT0gJ2wnCi0gICAgICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbNF0pKQotICAgIHsKLSAgICAgICptb2RlID0gRlBVTF9OOwotICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ2YnICYmIHNyY1sxXSA9PSAncCcgJiYgc3JjWzJdID09ICdzJyAmJiBzcmNbM10gPT0gJ2MnCi0gICAgICAmJiBzcmNbNF0gPT0gJ3InICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s1XSkpCi0gICAgewotICAgICAgKm1vZGUgPSBGUFNDUl9OOwotICAgICAgcmV0dXJuIDU7Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3gnICYmIHNyY1sxXSA9PSAnbScgJiYgc3JjWzJdID09ICd0JyAmJiBzcmNbM10gPT0gJ3InCi0gICAgICAmJiBzcmNbNF0gPT0gJ3gnICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s1XSkpCi0gICAgewotICAgICAgKm1vZGUgPSBYTVRSWF9NNDsKLSAgICAgIHJldHVybiA1OwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHN5bWJvbFMgKmRvdCgpCi17Ci0gIGNvbnN0IGNoYXIgKmZha2U7Ci0KLSAgLyogSkY6ICcuJyBpcyBwc2V1ZG8gc3ltYm9sIHdpdGggdmFsdWUgb2YgY3VycmVudCBsb2NhdGlvbgotICAgICBpbiBjdXJyZW50IHNlZ21lbnQuICAqLwotICBmYWtlID0gRkFLRV9MQUJFTF9OQU1FOwotICByZXR1cm4gIHN5bWJvbF9uZXcgKGZha2UsCi0JCSAgICAgIG5vd19zZWcsCi0JCSAgICAgICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwKLQkJICAgICAgZnJhZ19ub3cpOwotCi19Ci0KLQotc3RhdGljCi1jaGFyICoKLXBhcnNlX2V4cCAocykKLSAgICAgY2hhciAqczsKLXsKLSAgY2hhciAqc2F2ZTsKLSAgY2hhciAqbmV3OwotCi0gIHNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0gIGV4cHJlc3Npb24gKCZpbW1lZGlhdGUpOwotICBpZiAoaW1tZWRpYXRlLlhfb3AgPT0gT19hYnNlbnQpCi0gICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0gIG5ldyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotCi0vKiBUaGUgbWFueSBmb3JtcyBvZiBvcGVyYW5kOgotCi0gICBSbiAgICAgICAgICAgICAgICAgICBSZWdpc3RlciBkaXJlY3QKLSAgIEBSbiAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIGluZGlyZWN0Ci0gICBAUm4rICAgICAgICAgICAgICAgICBBdXRvaW5jcmVtZW50Ci0gICBALVJuICAgICAgICAgICAgICAgICBBdXRvZGVjcmVtZW50Ci0gICBAKGRpc3A6NCxSbikKLSAgIEAoZGlzcDo4LEdCUikKLSAgIEAoZGlzcDo4LFBDKQotCi0gICBAKFIwLFJuKQotICAgQChSMCxHQlIpCi0KLSAgIGRpc3A6OAotICAgZGlzcDoxMgotICAgI2ltbTgKLSAgIHByLCBnYnIsIHZiciwgbWFjbCwgbWFjaAotCi0gKi8KLQotc3RhdGljCi1jaGFyICoKLXBhcnNlX2F0IChzcmMsIG9wKQotICAgICBjaGFyICpzcmM7Ci0gICAgIHNoX29wZXJhbmRfaW5mbyAqb3A7Ci17Ci0gIGludCBsZW47Ci0gIGludCBtb2RlOwotICBzcmMrKzsKLSAgaWYgKHNyY1swXSA9PSAnLScpCi0gICAgewotICAgICAgLyogTXVzdCBiZSBwcmVkZWNyZW1lbnQgKi8KLSAgICAgIHNyYysrOwotCi0gICAgICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICYob3AtPnJlZykpOwotICAgICAgaWYgKG1vZGUgIT0gQV9SRUdfTikKLQlhc19iYWQgKF8oImlsbGVnYWwgcmVnaXN0ZXIgYWZ0ZXIgQC0iKSk7Ci0KLSAgICAgIG9wLT50eXBlID0gQV9ERUNfTjsKLSAgICAgIHNyYyArPSBsZW47Ci0gICAgfQotICBlbHNlIGlmIChzcmNbMF0gPT0gJygnKQotICAgIHsKLSAgICAgIC8qIENvdWxkIGJlIEAoZGlzcCwgcm4pLCBAKGRpc3AsIGdiciksIEAoZGlzcCwgcGMpLCAgQChyMCwgZ2JyKSBvcgotICAgICAgICAgQChyMCwgcm4pICovCi0gICAgICBzcmMrKzsKLSAgICAgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJihvcC0+cmVnKSk7Ci0gICAgICBpZiAobGVuICYmIG1vZGUgPT0gQV9SRUdfTikKLQl7Ci0JICBzcmMgKz0gbGVuOwotCSAgaWYgKG9wLT5yZWcgIT0gMCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygibXVzdCBiZSBAKHIwLC4uLikiKSk7Ci0JICAgIH0KLQkgIGlmIChzcmNbMF0gPT0gJywnKQotCSAgICBzcmMrKzsKLQkgIC8qIE5vdyBjYW4gYmUgcm4gb3IgZ2JyICovCi0JICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICYob3AtPnJlZykpOwotCSAgaWYgKG1vZGUgPT0gQV9HQlIpCi0JICAgIHsKLQkgICAgICBvcC0+dHlwZSA9IEFfUjBfR0JSOwotCSAgICB9Ci0JICBlbHNlIGlmIChtb2RlID09IEFfUkVHX04pCi0JICAgIHsKLQkgICAgICBvcC0+dHlwZSA9IEFfSU5EX1IwX1JFR19OOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBpbiBAKHIwLC4uLikiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTXVzdCBiZSBhbiBAKGRpc3AsLi4gdGhpbmcpICovCi0JICBzcmMgPSBwYXJzZV9leHAgKHNyYyk7Ci0JICBpZiAoc3JjWzBdID09ICcsJykKLQkgICAgc3JjKys7Ci0JICAvKiBOb3cgY2FuIGJlIHJuLCBnYnIgb3IgcGMgKi8KLQkgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJm9wLT5yZWcpOwotCSAgaWYgKGxlbikKLQkgICAgewotCSAgICAgIGlmIChtb2RlID09IEFfUkVHX04pCi0JCXsKLQkJICBvcC0+dHlwZSA9IEFfRElTUF9SRUdfTjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG1vZGUgPT0gQV9HQlIpCi0JCXsKLQkJICBvcC0+dHlwZSA9IEFfRElTUF9HQlI7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChtb2RlID09IEFfRElTUF9QQykKLQkJewotCQkgIC8qIFR1cm4gYSBwbGFpbiBAKDQscGMpIGludG8gQCguKzQscGMpICovCi0JCSAgaWYgKGltbWVkaWF0ZS5YX29wID09IE9fY29uc3RhbnQpIHsgCi0JCSAgICBpbW1lZGlhdGUuWF9hZGRfc3ltYm9sID0gZG90KCk7Ci0JCSAgICBpbW1lZGlhdGUuWF9vcCA9IE9fc3ltYm9sOwotCQkgIH0KLQkJICBvcC0+dHlwZSA9IEFfRElTUF9QQzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIEAoZGlzcCxbUm4sIGdiciwgcGNdKSIpKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBpbiBAKGRpc3AsW1JuLCBnYnIsIHBjXSkiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBzcmMgKz0gbGVuOwotICAgICAgaWYgKHNyY1swXSAhPSAnKScpCi0JYXNfYmFkIChfKCJleHBlY3RpbmcgKSIpKTsKLSAgICAgIGVsc2UKLQlzcmMrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzcmMgKz0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmKG9wLT5yZWcpKTsKLSAgICAgIGlmIChtb2RlICE9IEFfUkVHX04pCi0JewotCSAgYXNfYmFkIChfKCJpbGxlZ2FsIHJlZ2lzdGVyIGFmdGVyIEAiKSk7Ci0JfQotICAgICAgaWYgKHNyY1swXSA9PSAnKycpCi0JewotCSAgb3AtPnR5cGUgPSBBX0lOQ19OOwotCSAgc3JjKys7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9wLT50eXBlID0gQV9JTkRfTjsKLQl9Ci0gICAgfQotICByZXR1cm4gc3JjOwotfQotCi1zdGF0aWMgdm9pZAotZ2V0X29wZXJhbmQgKHB0ciwgb3ApCi0gICAgIGNoYXIgKipwdHI7Ci0gICAgIHNoX29wZXJhbmRfaW5mbyAqb3A7Ci17Ci0gIGNoYXIgKnNyYyA9ICpwdHI7Ci0gIGludCBtb2RlID0gLTE7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0KLSAgaWYgKHNyY1swXSA9PSAnIycpCi0gICAgewotICAgICAgc3JjKys7Ci0gICAgICAqcHRyID0gcGFyc2VfZXhwIChzcmMpOwotICAgICAgb3AtPnR5cGUgPSBBX0lNTTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZWxzZSBpZiAoc3JjWzBdID09ICdAJykKLSAgICB7Ci0gICAgICAqcHRyID0gcGFyc2VfYXQgKHNyYywgb3ApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmKG9wLT5yZWcpKTsKLSAgaWYgKGxlbikKLSAgICB7Ci0gICAgICAqcHRyID0gc3JjICsgbGVuOwotICAgICAgb3AtPnR5cGUgPSBtb2RlOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIE5vdCBhIHJlZywgdGhlIG9ubHkgdGhpbmcgbGVmdCBpcyBhIGRpc3BsYWNlbWVudCAqLwotICAgICAgKnB0ciA9IHBhcnNlX2V4cCAoc3JjKTsKLSAgICAgIG9wLT50eXBlID0gQV9ESVNQX1BDOwotICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotc3RhdGljCi1jaGFyICoKLWdldF9vcGVyYW5kcyAoaW5mbywgYXJncywgb3BlcmFuZCkKLSAgICAgc2hfb3Bjb2RlX2luZm8gKmluZm87Ci0gICAgIGNoYXIgKmFyZ3M7Ci0gICAgIHNoX29wZXJhbmRfaW5mbyAqb3BlcmFuZDsKLQotewotICBjaGFyICpwdHIgPSBhcmdzOwotICBpZiAoaW5mby0+YXJnWzBdKQotICAgIHsKLSAgICAgIHB0cisrOwotCi0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDApOwotICAgICAgaWYgKGluZm8tPmFyZ1sxXSkKLQl7Ci0JICBpZiAoKnB0ciA9PSAnLCcpCi0JICAgIHsKLQkgICAgICBwdHIrKzsKLQkgICAgfQotCSAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxKTsKLQkgIGlmIChpbmZvLT5hcmdbMl0pCi0JICAgIHsKLQkgICAgICBpZiAoKnB0ciA9PSAnLCcpCi0JCXsKLQkJICBwdHIrKzsKLQkJfQotCSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG9wZXJhbmRbMl0udHlwZSA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3BlcmFuZFsxXS50eXBlID0gMDsKLQkgIG9wZXJhbmRbMl0udHlwZSA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG9wZXJhbmRbMF0udHlwZSA9IDA7Ci0gICAgICBvcGVyYW5kWzFdLnR5cGUgPSAwOwotICAgICAgb3BlcmFuZFsyXS50eXBlID0gMDsKLSAgICB9Ci0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIFBhc3NlZCBhIHBvaW50ZXIgdG8gYSBsaXN0IG9mIG9wY29kZXMgd2hpY2ggdXNlIGRpZmZlcmVudAotICAgYWRkcmVzc2luZyBtb2RlcywgcmV0dXJuIHRoZSBvcGNvZGUgd2hpY2ggbWF0Y2hlcyB0aGUgb3Bjb2RlcwotICAgcHJvdmlkZWQKLSAqLwotCi1zdGF0aWMKLXNoX29wY29kZV9pbmZvICoKLWdldF9zcGVjaWZpYyAob3Bjb2RlLCBvcGVyYW5kcykKLSAgICAgc2hfb3Bjb2RlX2luZm8gKm9wY29kZTsKLSAgICAgc2hfb3BlcmFuZF9pbmZvICpvcGVyYW5kczsKLXsKLSAgc2hfb3Bjb2RlX2luZm8gKnRoaXNfdHJ5ID0gb3Bjb2RlOwotICBjaGFyICpuYW1lID0gb3Bjb2RlLT5uYW1lOwotICBpbnQgbiA9IDA7Ci0gIHdoaWxlIChvcGNvZGUtPm5hbWUpCi0gICAgewotICAgICAgdGhpc190cnkgPSBvcGNvZGUrKzsKLSAgICAgIGlmICh0aGlzX3RyeS0+bmFtZSAhPSBuYW1lKQotCXsKLQkgIC8qIFdlJ3ZlIGxvb2tlZCBzbyBmYXIgZG93biB0aGUgdGFibGUgdGhhdCB3ZSd2ZSBydW4gb3V0IG9mCi0JICAgICBvcGNvZGVzIHdpdGggdGhlIHNhbWUgbmFtZSAqLwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgLyogbG9vayBhdCBib3RoIG9wZXJhbmRzIG5lZWRlZCBieSB0aGUgb3Bjb2RlcyBhbmQgcHJvdmlkZWQgYnkKLSAgICAgICAgIHRoZSB1c2VyIC0gc2luY2UgYW4gYXJnIHRlc3Qgd2lsbCBvZnRlbiBmYWlsIG9uIHRoZSBzYW1lIGFyZwotICAgICAgICAgYWdhaW4gYW5kIGFnYWluLCB3ZSdsbCB0cnkgYW5kIHRlc3QgdGhlIGxhc3QgZmFpbGluZyBhcmcgdGhlCi0gICAgICAgICBmaXJzdCBvbiBlYWNoIG9wY29kZSB0cnkgKi8KLQotICAgICAgZm9yIChuID0gMDsgdGhpc190cnktPmFyZ1tuXTsgbisrKQotCXsKLQkgIHNoX29wZXJhbmRfaW5mbyAqdXNlciA9IG9wZXJhbmRzICsgbjsKLQkgIHNoX2FyZ190eXBlIGFyZyA9IHRoaXNfdHJ5LT5hcmdbbl07Ci0JICBzd2l0Y2ggKGFyZykKLQkgICAgewotCSAgICBjYXNlIEFfSU1NOgotCSAgICBjYXNlIEFfQkRJU1AxMjoKLQkgICAgY2FzZSBBX0JESVNQODoKLQkgICAgY2FzZSBBX0RJU1BfR0JSOgotCSAgICBjYXNlIEFfRElTUF9QQzoKLQkgICAgY2FzZSBBX01BQ0g6Ci0JICAgIGNhc2UgQV9QUjoKLQkgICAgY2FzZSBBX01BQ0w6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gYXJnKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9SMDoKLQkgICAgICAvKiBvcGNvZGUgbmVlZHMgcjAgKi8KLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBBX1JFR19OIHx8IHVzZXItPnJlZyAhPSAwKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9SMF9HQlI6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gQV9SMF9HQlIgfHwgdXNlci0+cmVnICE9IDApCi0JCWdvdG8gZmFpbDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBGX0ZSMDoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBGX1JFR19OIHx8IHVzZXItPnJlZyAhPSAwKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBX1JFR19OOgotCSAgICBjYXNlIEFfSU5DX046Ci0JICAgIGNhc2UgQV9ERUNfTjoKLQkgICAgY2FzZSBBX0lORF9OOgotCSAgICBjYXNlIEFfSU5EX1IwX1JFR19OOgotCSAgICBjYXNlIEFfRElTUF9SRUdfTjoKLQkgICAgY2FzZSBGX1JFR19OOgotCSAgICBjYXNlIERfUkVHX046Ci0JICAgIGNhc2UgWF9SRUdfTjoKLQkgICAgY2FzZSBWX1JFR19OOgotCSAgICBjYXNlIEZQVUxfTjoKLQkgICAgY2FzZSBGUFNDUl9OOgotCSAgICAgIC8qIE9wY29kZSBuZWVkcyBybiAqLwotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IGFyZykKLQkJZ290byBmYWlsOwotCSAgICAgIHJlZ19uID0gdXNlci0+cmVnOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZEX1JFR19OOgotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IEZfUkVHX04gJiYgdXNlci0+dHlwZSAhPSBEX1JFR19OKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgcmVnX24gPSB1c2VyLT5yZWc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFhfUkVHX046Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gRF9SRUdfTiAmJiB1c2VyLT50eXBlICE9IFhfUkVHX04pCi0JCWdvdG8gZmFpbDsKLQkgICAgICByZWdfbiA9IHVzZXItPnJlZzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0dCUjoKLQkgICAgY2FzZSBBX1NSOgotCSAgICBjYXNlIEFfVkJSOgotCSAgICBjYXNlIEFfU1NSOgotCSAgICBjYXNlIEFfU1BDOgotCSAgICBjYXNlIEFfU0dSOgotCSAgICBjYXNlIEFfREJSOgotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IGFyZykKLQkJZ290byBmYWlsOwotCSAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEFfUkVHX0I6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gYXJnKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgcmVnX2IgPSB1c2VyLT5yZWc7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBX1JFR19NOgotCSAgICBjYXNlIEFfSU5DX006Ci0JICAgIGNhc2UgQV9ERUNfTToKLQkgICAgY2FzZSBBX0lORF9NOgotCSAgICBjYXNlIEFfSU5EX1IwX1JFR19NOgotCSAgICBjYXNlIEFfRElTUF9SRUdfTToKLQkgICAgICAvKiBPcGNvZGUgbmVlZHMgcm4gKi8KLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBhcmcgLSBBX1JFR19NICsgQV9SRUdfTikKLQkJZ290byBmYWlsOwotCSAgICAgIHJlZ19tID0gdXNlci0+cmVnOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRl9SRUdfTToKLQkgICAgY2FzZSBEX1JFR19NOgotCSAgICBjYXNlIFhfUkVHX006Ci0JICAgIGNhc2UgVl9SRUdfTToKLQkgICAgY2FzZSBGUFVMX006Ci0JICAgIGNhc2UgRlBTQ1JfTToKLQkgICAgICAvKiBPcGNvZGUgbmVlZHMgcm4gKi8KLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBhcmcgLSBGX1JFR19NICsgRl9SRUdfTikKLQkJZ290byBmYWlsOwotCSAgICAgIHJlZ19tID0gdXNlci0+cmVnOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERYX1JFR19NOgotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IERfUkVHX04gJiYgdXNlci0+dHlwZSAhPSBYX1JFR19OKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgcmVnX20gPSB1c2VyLT5yZWc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgWE1UUlhfTTQ6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gWE1UUlhfTTQpCi0JCWdvdG8gZmFpbDsKLQkgICAgICByZWdfbSA9IDQ7Ci0JICAgICAgYnJlYWs7Ci0JCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcHJpbnRmIChfKCJ1bmhhbmRsZWQgJWRcbiIpLCBhcmcpOwotCSAgICAgIGdvdG8gZmFpbDsKLQkgICAgfQotCX0KLSAgICAgIHJldHVybiB0aGlzX3RyeTsKLSAgICBmYWlsOjsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotY2hlY2sgKG9wZXJhbmQsIGxvdywgaGlnaCkKLSAgICAgZXhwcmVzc2lvblMgKm9wZXJhbmQ7Ci0gICAgIGludCBsb3c7Ci0gICAgIGludCBoaWdoOwotewotICBpZiAob3BlcmFuZC0+WF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCBsb3cKLSAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlciA+IGhpZ2gpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkIiksIGxvdywgaGlnaCk7Ci0gICAgfQotICByZXR1cm4gb3BlcmFuZC0+WF9hZGRfbnVtYmVyOwotfQotCi0KLXN0YXRpYyB2b2lkCi1pbnNlcnQgKHdoZXJlLCBob3csIHBjcmVsKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgaW50IGhvdzsKLSAgICAgaW50IHBjcmVsOwotewotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JICAgICAgIHdoZXJlIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JICAgICAgIDIsCi0JICAgICAgICZpbW1lZGlhdGUsCi0JICAgICAgIHBjcmVsLAotCSAgICAgICBob3cpOwotfQotCi1zdGF0aWMgdm9pZAotYnVpbGRfcmVsYXggKG9wY29kZSkKLSAgICAgc2hfb3Bjb2RlX2luZm8gKm9wY29kZTsKLXsKLSAgaW50IGhpZ2hfYnl0ZSA9IHRhcmdldF9iaWdfZW5kaWFuID8gMCA6IDE7Ci0gIGNoYXIgKnA7Ci0KLSAgaWYgKG9wY29kZS0+YXJnWzBdID09IEFfQkRJU1A4KQotICAgIHsKLSAgICAgIGludCB3aGF0ID0gKG9wY29kZS0+bmliYmxlc1sxXSAmIDQpID8gQ09ORF9KVU1QX0RFTEFZIDogQ09ORF9KVU1QOwotICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJICAgIG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIENPTkQzMildLnJseF9sZW5ndGgsCi0JCSAgICBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBDT05EOCldLnJseF9sZW5ndGgsCi0JCSAgICBDICh3aGF0LCAwKSwKLQkJICAgIGltbWVkaWF0ZS5YX2FkZF9zeW1ib2wsCi0JCSAgICBpbW1lZGlhdGUuWF9hZGRfbnVtYmVyLAotCQkgICAgMCk7Ci0gICAgICBwW2hpZ2hfYnl0ZV0gPSAob3Bjb2RlLT5uaWJibGVzWzBdIDw8IDQpIHwgKG9wY29kZS0+bmliYmxlc1sxXSk7Ci0gICAgfQotICBlbHNlIGlmIChvcGNvZGUtPmFyZ1swXSA9PSBBX0JESVNQMTIpCi0gICAgewotICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJICAgIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ09ORF9KVU1QLCBVTkNPTkQzMildLnJseF9sZW5ndGgsCi0JCSAgICBtZF9yZWxheF90YWJsZVtDIChVTkNPTkRfSlVNUCwgVU5DT05EMTIpXS5ybHhfbGVuZ3RoLAotCQkgICAgQyAoVU5DT05EX0pVTVAsIDApLAotCQkgICAgaW1tZWRpYXRlLlhfYWRkX3N5bWJvbCwKLQkJICAgIGltbWVkaWF0ZS5YX2FkZF9udW1iZXIsCi0JCSAgICAwKTsKLSAgICAgIHBbaGlnaF9ieXRlXSA9IChvcGNvZGUtPm5pYmJsZXNbMF0gPDwgNCk7Ci0gICAgfQotCi19Ci0KLS8qIE5vdyB3ZSBrbm93IHdoYXQgc29ydCBvZiBvcGNvZGVzIGl0IGlzLCBsZXRzIGJ1aWxkIHRoZSBieXRlcyAtCi0gKi8KLXN0YXRpYyB2b2lkCi1idWlsZF9NeXRlcyAob3Bjb2RlLCBvcGVyYW5kKQotICAgICBzaF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICAgICBzaF9vcGVyYW5kX2luZm8gKm9wZXJhbmQ7Ci0KLXsKLSAgaW50IGluZGV4OwotICBjaGFyIG5idWZbNF07Ci0gIGNoYXIgKm91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gIGludCBsb3dfYnl0ZSA9IHRhcmdldF9iaWdfZW5kaWFuID8gMSA6IDA7Ci0gIG5idWZbMF0gPSAwOwotICBuYnVmWzFdID0gMDsKLSAgbmJ1ZlsyXSA9IDA7Ci0gIG5idWZbM10gPSAwOwotCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspCi0gICAgewotICAgICAgc2hfbmliYmxlX3R5cGUgaSA9IG9wY29kZS0+bmliYmxlc1tpbmRleF07Ci0gICAgICBpZiAoaSA8IDE2KQotCXsKLQkgIG5idWZbaW5kZXhdID0gaTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChpKQotCSAgICB7Ci0JICAgIGNhc2UgUkVHX046Ci0JICAgICAgbmJ1ZltpbmRleF0gPSByZWdfbjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRUdfTToKLQkgICAgICBuYnVmW2luZGV4XSA9IHJlZ19tOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJFR19OTToKLQkgICAgICBuYnVmW2luZGV4XSA9IHJlZ19uIHwgKHJlZ19tID4+IDIpOwotCSAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBSRUdfQjoKLQkgICAgICBuYnVmW2luZGV4XSA9IHJlZ19iIHwgMHgwODsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBESVNQXzQ6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQgKyBsb3dfYnl0ZSwgQkZEX1JFTE9DX1NIX0lNTTQsIDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTV80Qlk0OgotCSAgICAgIGluc2VydCAob3V0cHV0ICsgbG93X2J5dGUsIEJGRF9SRUxPQ19TSF9JTU00Qlk0LCAwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU1fNEJZMjoKLQkgICAgICBpbnNlcnQgKG91dHB1dCArIGxvd19ieXRlLCBCRkRfUkVMT0NfU0hfSU1NNEJZMiwgMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NXzQ6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQgKyBsb3dfYnl0ZSwgQkZEX1JFTE9DX1NIX0lNTTQsIDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTV84Qlk0OgotCSAgICAgIGluc2VydCAob3V0cHV0ICsgbG93X2J5dGUsIEJGRF9SRUxPQ19TSF9JTU04Qlk0LCAwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU1fOEJZMjoKLQkgICAgICBpbnNlcnQgKG91dHB1dCArIGxvd19ieXRlLCBCRkRfUkVMT0NfU0hfSU1NOEJZMiwgMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NXzg6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQgKyBsb3dfYnl0ZSwgQkZEX1JFTE9DX1NIX0lNTTgsIDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBDUkVMSU1NXzhCWTQ6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQsIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTQsIDEpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBDUkVMSU1NXzhCWTI6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQsIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTIsIDEpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHByaW50ZiAoXygiZmFpbGVkIGZvciAlZFxuIiksIGkpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pIHsKLSAgICBvdXRwdXRbMV0gPSAobmJ1ZlswXSA8PCA0KSB8IChuYnVmWzFdKTsKLSAgICBvdXRwdXRbMF0gPSAobmJ1ZlsyXSA8PCA0KSB8IChuYnVmWzNdKTsKLSAgfQotICBlbHNlIHsKLSAgICBvdXRwdXRbMF0gPSAobmJ1ZlswXSA8PCA0KSB8IChuYnVmWzFdKTsKLSAgICBvdXRwdXRbMV0gPSAobmJ1ZlsyXSA8PCA0KSB8IChuYnVmWzNdKTsKLSAgfQotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0Ci0gICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLgotICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgdW5zaWduZWQgY2hhciAqb3Bfc3RhcnQ7Ci0gIHVuc2lnbmVkIGNoYXIgKm9wX2VuZDsKLSAgc2hfb3BlcmFuZF9pbmZvIG9wZXJhbmRbM107Ci0gIHNoX29wY29kZV9pbmZvICpvcGNvZGU7Ci0gIGNoYXIgbmFtZVsyMF07Ci0gIGludCBubGVuID0gMDsKLSAgLyogRHJvcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIC8qIGZpbmQgdGhlIG9wIGNvZGUgZW5kICovCi0gIGZvciAob3Bfc3RhcnQgPSBvcF9lbmQgPSAodW5zaWduZWQgY2hhciAqKSAoc3RyKTsKLSAgICAgICAqb3BfZW5kCi0gICAgICAgJiYgbmxlbiA8IDIwCi0gICAgICAgJiYgIWlzX2VuZF9vZl9saW5lWypvcF9lbmRdICYmICpvcF9lbmQgIT0gJyAnOwotICAgICAgIG9wX2VuZCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IG9wX3N0YXJ0W25sZW5dOwotCi0gICAgICAvKiBUaGUgbWFjaGluZSBpbmRlcGVuZGVudCBjb2RlIHdpbGwgY29udmVydCBDTVAvRVEgaW50byBjbXAvRVEKLQkgYmVjYXVzZSBpdCB0aGlua3MgdGhlICcvJyBpcyB0aGUgZW5kIG9mIHRoZSBzeW1ib2wuICBJbnN0ZWFkIG9mCi0JIGhhY2tpbmcgdXAgdGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQgY29kZSwgd2UganVzdCBkZWFsIHdpdGggaXQKLQkgaGVyZS4gICovCi0gICAgICBjID0gaXN1cHBlciAoYykgPyB0b2xvd2VyIChjKSA6IGM7Ci0gICAgICBuYW1lW25sZW5dID0gYzsKLSAgICAgIG5sZW4rKzsKLSAgICB9Ci0gIG5hbWVbbmxlbl0gPSAwOwotCi0gIGlmIChubGVuID09IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJjYW4ndCBmaW5kIG9wY29kZSAiKSk7Ci0gICAgfQotCi0gIG9wY29kZSA9IChzaF9vcGNvZGVfaW5mbyAqKSBoYXNoX2ZpbmQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG5hbWUpOwotCi0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInVua25vd24gb3Bjb2RlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2hfcmVsYXgKLSAgICAgICYmICEgc2VnX2luZm8gKG5vd19zZWcpLT50Y19zZWdtZW50X2luZm9fZGF0YS5pbl9jb2RlKQotICAgIHsKLSAgICAgIC8qIE91dHB1dCBhIENPREUgcmVsb2MgdG8gdGVsbCB0aGUgbGlua2VyIHRoYXQgdGhlIGZvbGxvd2luZwotICAgICAgICAgYnl0ZXMgYXJlIGluc3RydWN0aW9ucywgbm90IGRhdGEuICAqLwotICAgICAgZml4X25ldyAoZnJhZ19ub3csIGZyYWdfbm93X2ZpeCAoKSwgMiwgJmFic19zeW1ib2wsIDAsIDAsCi0JICAgICAgIEJGRF9SRUxPQ19TSF9DT0RFKTsKLSAgICAgIHNlZ19pbmZvIChub3dfc2VnKS0+dGNfc2VnbWVudF9pbmZvX2RhdGEuaW5fY29kZSA9IDE7Ci0gICAgfQotCi0gIGlmIChvcGNvZGUtPmFyZ1swXSA9PSBBX0JESVNQMTIKLSAgICAgIHx8IG9wY29kZS0+YXJnWzBdID09IEFfQkRJU1A4KQotICAgIHsKLSAgICAgIHBhcnNlX2V4cCAob3BfZW5kICsgMSk7Ci0gICAgICBidWlsZF9yZWxheCAob3Bjb2RlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAob3Bjb2RlLT5hcmdbMF0gIT0gQV9FTkQpCi0JewotCSAgZ2V0X29wZXJhbmRzIChvcGNvZGUsIG9wX2VuZCwgb3BlcmFuZCk7Ci0JfQotICAgICAgb3Bjb2RlID0gZ2V0X3NwZWNpZmljIChvcGNvZGUsIG9wZXJhbmQpOwotCi0gICAgICBpZiAob3Bjb2RlID09IDApCi0JewotCSAgLyogQ291bGRuJ3QgZmluZCBhbiBvcGNvZGUgd2hpY2ggbWF0Y2hlZCB0aGUgb3BlcmFuZHMgKi8KLQkgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgyKTsKLQotCSAgd2hlcmVbMF0gPSAweDA7Ci0JICB3aGVyZVsxXSA9IDB4MDsKLQkgIGFzX2JhZCAoXygiaW52YWxpZCBvcGVyYW5kcyBmb3Igb3Bjb2RlIikpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgYnVpbGRfTXl0ZXMgKG9wY29kZSwgb3BlcmFuZCk7Ci0gICAgfQotCi19Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZWFjaCB0aW1lIGEgbGFiZWwgZGVmaW5pdGlvbiBpcyBzZWVuLiAgSXQKLSAgIGVtaXRzIGEgQkZEX1JFTE9DX1NIX0xBQkVMIHJlbG9jIGlmIG5lY2Vzc2FyeS4gICovCi0KLXZvaWQKLXNoX2Zyb2JfbGFiZWwgKCkKLXsKLSAgc3RhdGljIGZyYWdTICpsYXN0X2xhYmVsX2ZyYWc7Ci0gIHN0YXRpYyBpbnQgbGFzdF9sYWJlbF9vZmZzZXQ7Ci0KLSAgaWYgKHNoX3JlbGF4Ci0gICAgICAmJiBzZWdfaW5mbyAobm93X3NlZyktPnRjX3NlZ21lbnRfaW5mb19kYXRhLmluX2NvZGUpCi0gICAgewotICAgICAgaW50IG9mZnNldDsKLQotICAgICAgb2Zmc2V0ID0gZnJhZ19ub3dfZml4ICgpOwotICAgICAgaWYgKGZyYWdfbm93ICE9IGxhc3RfbGFiZWxfZnJhZwotCSAgfHwgb2Zmc2V0ICE9IGxhc3RfbGFiZWxfb2Zmc2V0KQotCXsJCi0JICBmaXhfbmV3IChmcmFnX25vdywgb2Zmc2V0LCAyLCAmYWJzX3N5bWJvbCwgMCwgMCwgQkZEX1JFTE9DX1NIX0xBQkVMKTsKLQkgIGxhc3RfbGFiZWxfZnJhZyA9IGZyYWdfbm93OwotCSAgbGFzdF9sYWJlbF9vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotICAgIH0KLX0KLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgaXMgYWJvdXQgdG8gb3V0cHV0IHNvbWUKLSAgIGRhdGEuICBJdCBlbWl0cyBhIEJGRF9SRUxPQ19TSF9EQVRBIHJlbG9jIGlmIG5lY2Vzc2FyeS4gICovCi0KLXZvaWQKLXNoX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpCi17Ci0gIGlmIChzaF9yZWxheAotICAgICAgJiYgc2VnX2luZm8gKG5vd19zZWcpLT50Y19zZWdtZW50X2luZm9fZGF0YS5pbl9jb2RlKQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBmcmFnX25vd19maXggKCksIDIsICZhYnNfc3ltYm9sLCAwLCAwLAotCSAgICAgICBCRkRfUkVMT0NfU0hfREFUQSk7Ci0gICAgICBzZWdfaW5mbyAobm93X3NlZyktPnRjX3NlZ21lbnRfaW5mb19kYXRhLmluX2NvZGUgPSAwOwotICAgIH0KLX0KLQotc3ltYm9sUyAqCi1ERUZVTiAobWRfdW5kZWZpbmVkX3N5bWJvbCwgKG5hbWUpLAotICAgICAgIGNoYXIgKm5hbWUpCi17Ci0gIHJldHVybiAwOwotfQotCi0jaWZkZWYgT0JKX0NPRkYKLQotdm9pZAotREVGVU4gKHRjX2NyYXdsX3N5bWJvbF9jaGFpbiwgKGhlYWRlcnMpLAotICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIpKTsKLX0KLQotdm9pZAotREVGVU4gKHRjX2hlYWRlcnNfaG9vaywgKGhlYWRlcnMpLAotICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2hlYWRlcnNfaG9vayBcbiIpKTsKLX0KLQotI2VuZGlmCi0KLS8qIFZhcmlvdXMgcm91dGluZXMgdG8ga2lsbCBvbmUgZGF5ICovCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICp0OwotICBpbnQgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIDI7Ci0KLSAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgewotICAgICAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0UCArPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0UCArPSAyOwotCX0KLSAgICB9Ci0gICAgIAotICByZXR1cm4gTlVMTDsKLX0KLQotLyogSGFuZGxlIHRoZSAudXNlcyBwc2V1ZG8tb3AuICBUaGlzIHBzZXVkby1vcCBpcyB1c2VkIGp1c3QgYmVmb3JlIGEKLSAgIGNhbGwgaW5zdHJ1Y3Rpb24uICBJdCByZWZlcnMgdG8gYSBsYWJlbCBvZiB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2gKLSAgIGxvYWRzIHRoZSByZWdpc3RlciB3aGljaCB0aGUgY2FsbCB1c2VzLiAgV2UgdXNlIGl0IHRvIGdlbmVyYXRlIGEKLSAgIHNwZWNpYWwgcmVsb2MgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1zdGF0aWMgdm9pZAotc191c2VzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4cHJlc3Npb25TIGV4OwotCi0gIGlmICghIHNoX3JlbGF4KQotICAgIGFzX3dhcm4gKF8oIi51c2VzIHBzZXVkby1vcCBzZWVuIHdoZW4gbm90IHJlbGF4aW5nIikpOwotCi0gIGV4cHJlc3Npb24gKCZleCk7Ci0KLSAgaWYgKGV4Llhfb3AgIT0gT19zeW1ib2wgfHwgZXguWF9hZGRfbnVtYmVyICE9IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgLnVzZXMgZm9ybWF0IikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZml4X25ld19leHAgKGZyYWdfbm93LCBmcmFnX25vd19maXggKCksIDIsICZleCwgMSwgQkZEX1JFTE9DX1NIX1VTRVMpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLQotI2RlZmluZSBPUFRJT05fUkVMQVggIChPUFRJT05fTURfQkFTRSkKLSNkZWZpbmUgT1BUSU9OX0xJVFRMRSAoT1BUSU9OX01EX0JBU0UgKyAxKQotI2RlZmluZSBPUFRJT05fU01BTEwgKE9QVElPTl9MSVRUTEUgKyAxKQotCi0gIHsicmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JFTEFYfSwKLSAgeyJsaXR0bGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJVFRMRX0sCi0gIHsic21hbGwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NNQUxMfSwKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9SRUxBWDoKLSAgICAgIHNoX3JlbGF4ID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTElUVExFOgotICAgICAgc2hsID0gMTsKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fU01BTEw6Ci0gICAgICBzaF9zbWFsbCA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotU0ggb3B0aW9uczpcblwKLS1saXR0bGUJCQlnZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIGNvZGVcblwKLS1yZWxheAkJCWFsdGVyIGp1bXAgaW5zdHJ1Y3Rpb25zIGZvciBsb25nIGRpc3BsYWNlbWVudHNcblwKLS1zbWFsbAkJCWFsaWduIHNlY3Rpb25zIHRvIDQgYnl0ZSBib3VuZGFyaWVzLCBub3QgMTZcbiIpKTsKLX0KLQwKLXZvaWQKLXRjX05vdXRfZml4X3RvX2NoYXJzICgpCi17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19Ob3V0X2ZpeF90b19jaGFycyBcbiIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gcGFzcyBhcmd1bWVudHMgdG8gc2hfY291bnRfcmVsb2NzIHRocm91Z2gKLSAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLXN0cnVjdCBzaF9jb3VudF9yZWxvY3MKLXsKLSAgLyogU3ltYm9sIHdlIGFyZSBsb29raW5nIGZvci4gICovCi0gIHN5bWJvbFMgKnN5bTsKLSAgLyogQ291bnQgb2YgcmVsb2NzIGZvdW5kLiAgKi8KLSAgaW50IGNvdW50OwotfTsKLQotLyogQ291bnQgdGhlIG51bWJlciBvZiBmaXh1cHMgaW4gYSBzZWN0aW9uIHdoaWNoIHJlZmVyIHRvIGEgcGFydGljdWxhcgotICAgc3ltYm9sLiAgV2hlbiB1c2luZyBCRkRfQVNTRU1CTEVSLCB0aGlzIGlzIGNhbGxlZCB2aWEKLSAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLXNoX2NvdW50X3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IHNoX2NvdW50X3JlbG9jcyAqaW5mbyA9IChzdHJ1Y3Qgc2hfY291bnRfcmVsb2NzICopIGRhdGE7Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotICBzeW1ib2xTICpzeW07Ci0gIGZpeFMgKmZpeDsKLQotICBzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGlmIChzZWdpbmZvID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIHN5bSA9IGluZm8tPnN5bTsKLSAgZm9yIChmaXggPSBzZWdpbmZvLT5maXhfcm9vdDsgZml4ICE9IE5VTEw7IGZpeCA9IGZpeC0+ZnhfbmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZml4LT5meF9hZGRzeSA9PSBzeW0pCi0JewotCSAgKytpbmZvLT5jb3VudDsKLQkgIGZpeC0+ZnhfdGNiaXQgPSAxOwotCX0KLSAgICB9Ci19Ci0KLS8qIEhhbmRsZSB0aGUgY291bnQgcmVsb2NzIGZvciBhIHBhcnRpY3VsYXIgc2VjdGlvbi4gIFdoZW4gdXNpbmcKLSAgIEJGRF9BU1NFTUJMRVIsIHRoaXMgaXMgY2FsbGVkIHZpYSBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1zaF9mcm9iX3NlY3Rpb24gKGFiZmQsIHNlYywgaWdub3JlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICBQVFIgaWdub3JlOwotewotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbzsKLSAgZml4UyAqZml4OwotCi0gIHNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgaWYgKHNlZ2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChmaXggPSBzZWdpbmZvLT5maXhfcm9vdDsgZml4ICE9IE5VTEw7IGZpeCA9IGZpeC0+ZnhfbmV4dCkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeW07Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIGZpeFMgKmZzY2FuOwotICAgICAgc3RydWN0IHNoX2NvdW50X3JlbG9jcyBpbmZvOwotCi0gICAgICBpZiAoZml4LT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1NIX1VTRVMpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFRoZSBCRkRfUkVMT0NfU0hfVVNFUyByZWxvYyBzaG91bGQgcmVmZXIgdG8gYSBkZWZpbmVkIGxvY2FsCi0JIHN5bWJvbCBpbiB0aGUgc2FtZSBzZWN0aW9uLiAgKi8KLSAgICAgIHN5bSA9IGZpeC0+ZnhfYWRkc3k7Ci0gICAgICBpZiAoc3ltID09IE5VTEwKLQkgIHx8IGZpeC0+Znhfc3Vic3kgIT0gTlVMTAotCSAgfHwgZml4LT5meF9hZGRudW1iZXIgIT0gMAotCSAgfHwgU19HRVRfU0VHTUVOVCAoc3ltKSAhPSBzZWMKLSNpZiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICYmIGRlZmluZWQgKE9CSl9DT0ZGKQotCSAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX0VYVAotI2VuZGlmCi0JICB8fCBTX0lTX0VYVEVSTkFMIChzeW0pKQotCXsKLQkgIGFzX3dhcm5fd2hlcmUgKGZpeC0+ZnhfZmlsZSwgZml4LT5meF9saW5lLAotCQkJIF8oIi51c2VzIGRvZXMgbm90IHJlZmVyIHRvIGEgbG9jYWwgc3ltYm9sIGluIHRoZSBzYW1lIHNlY3Rpb24iKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIExvb2sgdGhyb3VnaCB0aGUgZml4dXBzIGFnYWluLCB0aGlzIHRpbWUgbG9va2luZyBmb3Igb25lCi0JIGF0IHRoZSBzYW1lIGxvY2F0aW9uIGFzIHN5bS4gICovCi0gICAgICB2YWwgPSBTX0dFVF9WQUxVRSAoc3ltKTsKLSAgICAgIGZvciAoZnNjYW4gPSBzZWdpbmZvLT5maXhfcm9vdDsKLQkgICBmc2NhbiAhPSBOVUxMOwotCSAgIGZzY2FuID0gZnNjYW4tPmZ4X25leHQpCi0JaWYgKHZhbCA9PSBmc2Nhbi0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZzY2FuLT5meF93aGVyZQotCSAgICAmJiBmc2Nhbi0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19TSF9BTElHTgotCSAgICAmJiBmc2Nhbi0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19TSF9DT0RFCi0JICAgICYmIGZzY2FuLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1NIX0RBVEEKLQkgICAgJiYgZnNjYW4tPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfU0hfTEFCRUwpCi0JICBicmVhazsKLSAgICAgIGlmIChmc2NhbiA9PSBOVUxMKQotCXsKLQkgIGFzX3dhcm5fd2hlcmUgKGZpeC0+ZnhfZmlsZSwgZml4LT5meF9saW5lLAotCQkJIF8oImNhbid0IGZpbmQgZml4dXAgcG9pbnRlZCB0byBieSAudXNlcyIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKGZzY2FuLT5meF90Y2JpdCkKLQl7Ci0JICAvKiBXZSd2ZSBhbHJlYWR5IGRvbmUgdGhpcyBvbmUuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBmc2NhbiBzaG91bGQgYWxzbyBiZSBhIGZpeHVwIHRvIGEgbG9jYWwgc3ltYm9sIGluIHRoZSBzYW1lCi0JIHNlY3Rpb24uICAqLwotICAgICAgc3ltID0gZnNjYW4tPmZ4X2FkZHN5OwotICAgICAgaWYgKHN5bSA9PSBOVUxMCi0JICB8fCBmc2Nhbi0+Znhfc3Vic3kgIT0gTlVMTAotCSAgfHwgZnNjYW4tPmZ4X2FkZG51bWJlciAhPSAwCi0JICB8fCBTX0dFVF9TRUdNRU5UIChzeW0pICE9IHNlYwotI2lmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgZGVmaW5lZCAoT0JKX0NPRkYpCi0JICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfRVhUCi0jZW5kaWYKLQkgIHx8IFNfSVNfRVhURVJOQUwgKHN5bSkpCi0JewotCSAgYXNfd2Fybl93aGVyZSAoZml4LT5meF9maWxlLCBmaXgtPmZ4X2xpbmUsCi0JCQkgXygiLnVzZXMgdGFyZ2V0IGRvZXMgbm90IHJlZmVyIHRvIGEgbG9jYWwgc3ltYm9sIGluIHRoZSBzYW1lIHNlY3Rpb24iKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIE5vdyB3ZSBsb29rIHRocm91Z2ggYWxsIHRoZSBmaXh1cHMgb2YgYWxsIHRoZSBzZWN0aW9ucywKLQkgY291bnRpbmcgdGhlIG51bWJlciBvZiB0aW1lcyB3ZSBmaW5kIGEgcmVmZXJlbmNlIHRvIHN5bS4gICovCi0gICAgICBpbmZvLnN5bSA9IHN5bTsKLSAgICAgIGluZm8uY291bnQgPSAwOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCBzaF9jb3VudF9yZWxvY3MsIChQVFIpICZpbmZvKTsKLSNlbHNlCi0gICAgICB7Ci0JaW50IGlzY2FuOwotCi0JZm9yIChpc2NhbiA9IFNFR19FMDsgaXNjYW4gPCBTRUdfVU5LTk9XTjsgaXNjYW4rKykKLQkgIHNoX2NvdW50X3JlbG9jcyAoKGJmZCAqKSBOVUxMLCBpc2NhbiwgKFBUUikgJmluZm8pOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIGlmIChpbmZvLmNvdW50IDwgMSkKLQlhYm9ydCAoKTsKLQotICAgICAgLyogR2VuZXJhdGUgYSBCRkRfUkVMT0NfU0hfQ09VTlQgZml4dXAgYXQgdGhlIGxvY2F0aW9uIG9mIHN5bS4KLQkgV2UgaGF2ZSBhbHJlYWR5IGFkanVzdGVkIHRoZSB2YWx1ZSBvZiBzeW0gdG8gaW5jbHVkZSB0aGUKLQkgZnJhZ21lbnQgYWRkcmVzcywgc28gd2UgdW5kbyB0aGF0IGFkanVzdG1lbnQgaGVyZS4gICovCi0gICAgICBzdWJzZWdfY2hhbmdlIChzZWMsIDApOwotICAgICAgZml4X25ldyAoc3ltLT5zeV9mcmFnLCBTX0dFVF9WQUxVRSAoc3ltKSAtIHN5bS0+c3lfZnJhZy0+ZnJfYWRkcmVzcywKLQkgICAgICAgNCwgJmFic19zeW1ib2wsIGluZm8uY291bnQsIDAsIEJGRF9SRUxPQ19TSF9DT1VOVCk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgc3ltYm9sIHRhYmxlIGhhcyBiZWVuIGNvbXBsZXRlZCwKLSAgIGJ1dCBiZWZvcmUgdGhlIHJlbG9jcyBvciBzZWN0aW9uIGNvbnRlbnRzIGhhdmUgYmVlbiB3cml0dGVuIG91dC4KLSAgIElmIHdlIGhhdmUgc2VlbiBhbnkgLnVzZXMgcHNldWRvLW9wcywgdGhleSBwb2ludCB0byBhbiBpbnN0cnVjdGlvbgotICAgd2hpY2ggbG9hZHMgYSByZWdpc3RlciB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24uICBXZSBsb29rCi0gICB0aHJvdWdoIHRoZSBmaXh1cHMgdG8gZmluZCB3aGVyZSB0aGUgZnVuY3Rpb24gYWRkcmVzcyBpcyBiZWluZwotICAgbG9hZGVkIGZyb20uICBXZSB0aGVuIGdlbmVyYXRlIGEgQ09VTlQgcmVsb2MgZ2l2aW5nIHRoZSBudW1iZXIgb2YKLSAgIHRpbWVzIHRoYXQgZnVuY3Rpb24gYWRkcmVzcyBpcyByZWZlcnJlZCB0by4gIFRoZSBsaW5rZXIgdXNlcyB0aGlzCi0gICBpbmZvcm1hdGlvbiB3aGVuIGRvaW5nIHJlbGF4aW5nLCB0byBkZWNpZGUgd2hlbiBpdCBjYW4gZWxpbWluYXRlCi0gICB0aGUgc3RvcmVkIGZ1bmN0aW9uIGFkZHJlc3MgZW50aXJlbHkuICAqLwotCi12b2lkCi1zaF9mcm9iX2ZpbGUgKCkKLXsKLSAgaWYgKCEgc2hfcmVsYXgpCi0gICAgcmV0dXJuOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgc2hfZnJvYl9zZWN0aW9uLCAoUFRSKSBOVUxMKTsKLSNlbHNlCi0gIHsKLSAgICBpbnQgaXNlZzsKLQotICAgIGZvciAoaXNlZyA9IFNFR19FMDsgaXNlZyA8IFNFR19VTktOT1dOOyBpc2VnKyspCi0gICAgICBzaF9mcm9iX3NlY3Rpb24gKChiZmQgKikgTlVMTCwgaXNlZywgKFBUUikgTlVMTCk7Ci0gIH0KLSNlbmRpZgotfQotCi0vKiBDYWxsZWQgYWZ0ZXIgcmVsYXhpbmcuICBTZXQgdGhlIGNvcnJlY3Qgc2l6ZXMgb2YgdGhlIGZyYWdtZW50cywgYW5kCi0gICBjcmVhdGUgcmVsb2NzIHNvIHRoYXQgbWRfYXBwbHlfZml4IHdpbGwgZmlsbCBpbiB0aGUgY29ycmVjdCB2YWx1ZXMuICAqLwotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICBiZmQgKmhlYWRlcnM7Ci0jZWxzZQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSNlbmRpZgotICAgICBzZWdUIHNlZzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBpbnQgZG9uZXJlbGF4ID0gMDsKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIEMgKENPTkRfSlVNUCwgQ09ORDgpOgotICAgIGNhc2UgQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EOCk6Ci0gICAgICBzdWJzZWdfY2hhbmdlIChzZWcsIDApOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDIsIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQsCi0JICAgICAgIDEsIEJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyKTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMik6Ci0gICAgICBzdWJzZWdfY2hhbmdlIChzZWcsIDApOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDIsIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQsCi0JICAgICAgIDEsIEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMik7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDIChVTkNPTkRfSlVNUCwgVU5DT05EMzIpOgotICAgIGNhc2UgQyAoVU5DT05EX0pVTVAsIFVOREVGX1dPUkRfRElTUCk6Ci0gICAgICBpZiAoZnJhZ1AtPmZyX3N5bWJvbCA9PSBOVUxMKQotCWFzX2JhZCAoXygiYXQgMHglbHgsIGRpc3BsYWNlbWVudCBvdmVyZmxvd3MgMTItYml0IGZpZWxkIiksCi0JCSh1bnNpZ25lZCBsb25nKSBmcmFnUC0+ZnJfYWRkcmVzcyk7Ci0gICAgICBlbHNlIGlmIChTX0lTX0RFRklORUQgKGZyYWdQLT5mcl9zeW1ib2wpKQotCWFzX2JhZCAoXygiYXQgMHglbHgsIGRpc3BsYWNlbWVudCB0byBkZWZpbmVkIHN5bWJvbCAlcyBvdmVyZmxvd3MgMTItYml0IGZpZWxkIiksCi0JCSh1bnNpZ25lZCBsb25nKSBmcmFnUC0+ZnJfYWRkcmVzcywJCQotCQlTX0dFVF9OQU1FIChmcmFnUC0+ZnJfc3ltYm9sKSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJhdCAweCVseCwgZGlzcGxhY2VtZW50IHRvIHVuZGVmaW5lZCBzeW1ib2wgJXMgb3ZlcmZsb3dzIDEyLWJpdCBmaWVsZCIpLAotCQkodW5zaWduZWQgbG9uZykgZnJhZ1AtPmZyX2FkZHJlc3MsCQkKLQkJU19HRVRfTkFNRSAoZnJhZ1AtPmZyX3N5bWJvbCkpOwotCi0jaWYgMAkJCQkvKiBUaGlzIGNvZGUgd29ya3MsIGJ1dCBnZW5lcmF0ZXMgcG9vciBjb2RlIGFuZCB0aGUgY29tcGlsZXIKLQkJCQkgICBzaG91bGQgbmV2ZXIgcHJvZHVjZSBhIHNlcXVlbmNlIHRoYXQgcmVxdWlyZXMgaXQgdG8gYmUgdXNlZC4gICovCi0KLSAgICAgIC8qIEEganVtcCB3b250IGZpdCBpbiAxMiBiaXRzLCBtYWtlIGNvZGUgd2hpY2ggbG9va3MgbGlrZQotCSBicmEgZm9vCi0JIG1vdi53IEAoMCwgUEMpLCByMTQKLQkgLmxvbmcgZGlzcAotCSBmb286IGJyYSBAcjE0Ci0JICovCi0gICAgICBpbnQgdCA9IGJ1ZmZlclswXSAmIDB4MTA7Ci0KLSAgICAgIGJ1ZmZlcltoaWdoYnl0ZV0gPSAweGEwOwkvKiBicmFuY2ggb3ZlciBtb3ZlIGFuZCBkaXNwICovCi0gICAgICBidWZmZXJbbG93Ynl0ZV0gPSAzOwotICAgICAgYnVmZmVyW2hpZ2hieXRlKzJdID0gMHhkMCB8IEpSRUc7CS8qIEJ1aWxkIG1vdiBpbnNuICovCi0gICAgICBidWZmZXJbbG93Ynl0ZSsyXSA9IDB4MDA7Ci0KLSAgICAgIGJ1ZmZlcltoaWdoYnl0ZSs0XSA9IDA7CS8qIHNwYWNlIGZvciAzMiBiaXQganVtcCBkaXNwICovCi0gICAgICBidWZmZXJbbG93Ynl0ZSs0XSA9IDA7Ci0gICAgICBidWZmZXJbaGlnaGJ5dGUrNl0gPSAwOwotICAgICAgYnVmZmVyW2xvd2J5dGUrNl0gPSAwOwotCi0gICAgICBidWZmZXJbaGlnaGJ5dGUrOF0gPSAweDQwIHwgSlJFRzsJLyogQnVpbGQgam1wIEBKUkVHICovCi0gICAgICBidWZmZXJbbG93Ynl0ZSs4XSA9IHQgPyAweGIgOiAweDJiOwotCi0gICAgICBidWZmZXJbaGlnaGJ5dGUrMTBdID0gMHgyMDsgLyogYnVpbGQgbm9wICovCi0gICAgICBidWZmZXJbbG93Ynl0ZSsxMF0gPSAweDBiOwotCi0gICAgICAvKiBNYWtlIHJlbG9jIGZvciB0aGUgbG9uZyBkaXNwICovCi0gICAgICBmaXhfbmV3IChmcmFnUCwKLQkgICAgICAgZnJhZ1AtPmZyX2ZpeCArIDQsCi0JICAgICAgIDQsCi0JICAgICAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsCi0JICAgICAgIDAsCi0JICAgICAgIEJGRF9SRUxPQ18zMik7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IFVOQ09ORDMyX0xFTkdUSDsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZG9uZXJlbGF4ID0gMTsKLSNlbmRpZgotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBDT05EMTIpOgotICAgIGNhc2UgQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMTIpOgotICAgICAgLyogQSBiY29uZCB3b24ndCBmaXQsIHNvIHR1cm4gaXQgaW50byBhIGIhY29uZDsgYnJhIGRpc3A7IG5vcCAqLwotICAgICAgLyogSSBmb3VuZCB0aGF0IGEgcmVsYXggZmFpbHVyZSBmb3IgZ2NjLmMtdG9ydHVyZS9leGVjdXRlLzkzMDYyOC0xLmMKLQkgd2FzIGR1ZSB0byBnYXMgaW5jb3JyZWN0bHkgcmVsYXhpbmcgYW4gb3V0LW9mLXJhbmdlIGNvbmRpdGlvbmFsCi0JIGJyYW5jaCB3aXRoIGRlbGF5IHNsb3QuICBJdCB0dXJuZWQ6Ci0gICAgICAgICAgICAgICAgICAgICBiZi5zICAgIEw2ICAgICAgICAgICAgICAoc2xvdCBtb3YubCAgIHIxMixAKDQ0LHIwKSkKLSAgICAgICAgIGludG86Ci0gICAKLTJjOiAgOGYgMDEgYTAgOGIgICAgIGJmLnMgICAgMzIgPF9tYWluKzMyPiAgIChzbG90IGJyYSAgICAgICBMNikKLTMwOiAgMDAgMDkgICAgICAgICAgIG5vcAotMzI6ICAxMCBjYiAgICAgICAgICAgbW92LmwgICByMTIsQCg0NCxyMCkKLSAgICAgICAgIFRoZXJlZm9yZSwgYnJhbmNoZXMgd2l0aCBkZWxheSBzbG90cyBoYXZlIHRvIGJlIGhhbmRsZWQKLQkgZGlmZmVyZW50bHkgZnJvbSBvbmVzIHdpdGhvdXQgZGVsYXkgc2xvdHMuICAqLwotICAgICAgewotCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9Ci0JICAodW5zaWduZWQgY2hhciAqKSAoZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsKTsKLQlpbnQgaGlnaGJ5dGUgPSB0YXJnZXRfYmlnX2VuZGlhbiA/IDAgOiAxOwotCWludCBsb3dieXRlID0gdGFyZ2V0X2JpZ19lbmRpYW4gPyAxIDogMDsKLQlpbnQgZGVsYXkgPSBmcmFnUC0+ZnJfc3VidHlwZSA9PSBDIChDT05EX0pVTVBfREVMQVksIENPTkQxMik7Ci0KLQkvKiBUb2dnbGUgdGhlIHRydWUvZmFsc2UgYml0IG9mIHRoZSBiY29uZC4gICovCi0JYnVmZmVyW2hpZ2hieXRlXSBePSAweDI7Ci0KLQkvKiBJZiB0aGlzIGlzIGEgZGFsYXllZCBicmFuY2gsIHdlIG1heSBub3QgcHV0IHRoZSB0aGUgYnJhIGluIHRoZQotCSAgIHNsb3QuICBTbyB3ZSBjaGFuZ2UgaXQgdG8gYSBub24tZGVsYXllZCBicmFuY2gsIGxpa2UgdGhhdDoKLQkgICBiISBjb25kIHNsb3RfbGFiZWw7IGJyYSBkaXNwOyBzbG90X2xhYmVsOiBzbG90X2luc24KLQkgICA/Pz8gV2Ugc2hvdWxkIHRyeSBpZiBzd2FwcGluZyB0aGUgY29uZGl0aW9uYWwgYnJhbmNoIGFuZAotCSAgIGl0cyBkZWxheS1zbG90IGluc24gYWxyZWFkeSBtYWtlcyB0aGUgYnJhbmNoIHJlYWNoLiAgKi8KLQotCS8qIEJ1aWxkIGEgcmVsb2NhdGlvbiB0byBzaXggLyBmb3VyIGJ5dGVzIGZhcnRoZXIgb24uICAqLwotCXN1YnNlZ19jaGFuZ2UgKHNlZywgMCk7Ci0JZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDIsCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCQkgc2VjdGlvbl9zeW1ib2wgKHNlZyksCi0jZWxzZQotCQkgc2VnX2luZm8gKHNlZyktPmRvdCwKLSNlbmRpZgotCQkgZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4ICsgKGRlbGF5ID8gNCA6IDYpLAotCQkgMSwgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIpOwotCi0JLyogU2V0IHVwIGEganVtcCBpbnN0cnVjdGlvbi4gICovCi0JYnVmZmVyW2hpZ2hieXRlICsgMl0gPSAweGEwOwotCWJ1ZmZlcltsb3dieXRlICsgMl0gPSAwOwotCWZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMik7Ci0KLQlpZiAoZGVsYXkpCi0JICB7Ci0JICAgIGJ1ZmZlcltoaWdoYnl0ZV0gJj0gfjB4NDsgLyogUmVtb3ZlcyBkZWxheSBzbG90IGZyb20gYnJhbmNoLiAgKi8KLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgLyogRmlsbCBpbiBhIE5PUCBpbnN0cnVjdGlvbi4gICovCi0JICAgIGJ1ZmZlcltoaWdoYnl0ZSArIDRdID0gMHgwOwotCSAgICBidWZmZXJbbG93Ynl0ZSArIDRdID0gMHg5OwotCi0JICAgIGZyYWdQLT5mcl9maXggKz0gNjsKLQkgIH0KLQlmcmFnUC0+ZnJfdmFyID0gMDsKLQlkb25lcmVsYXggPSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEMgKENPTkRfSlVNUCwgQ09ORDMyKToKLSAgICBjYXNlIEMgKENPTkRfSlVNUF9ERUxBWSwgQ09ORDMyKToKLSAgICBjYXNlIEMgKENPTkRfSlVNUCwgVU5ERUZfV09SRF9ESVNQKToKLSAgICBjYXNlIEMgKENPTkRfSlVNUF9ERUxBWSwgVU5ERUZfV09SRF9ESVNQKToKLSAgICAgIGlmIChmcmFnUC0+ZnJfc3ltYm9sID09IE5VTEwpCi0JYXNfYmFkIChfKCJhdCAweCVseCwgZGlzcGxhY2VtZW50IG92ZXJmbG93cyA4LWJpdCBmaWVsZCIpLCAKLQkJKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9hZGRyZXNzKTsKLSAgICAgIGVsc2UgaWYgKFNfSVNfREVGSU5FRCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JYXNfYmFkIChfKCJhdCAweCVseCwgZGlzcGxhY2VtZW50IHRvIGRlZmluZWQgc3ltYm9sICVzIG92ZXJmbG93cyA4LWJpdCBmaWVsZCAiKSwKLQkJKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9hZGRyZXNzLAkJCi0JCVNfR0VUX05BTUUgKGZyYWdQLT5mcl9zeW1ib2wpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgdG8gdW5kZWZpbmVkIHN5bWJvbCAlcyBvdmVyZmxvd3MgOC1iaXQgZmllbGQgIiksCi0JCSh1bnNpZ25lZCBsb25nKSBmcmFnUC0+ZnJfYWRkcmVzcywJCQotCQlTX0dFVF9OQU1FIChmcmFnUC0+ZnJfc3ltYm9sKSk7Ci0KLSNpZiAwCQkJCS8qIFRoaXMgY29kZSB3b3JrcywgYnV0IGdlbmVyYXRlcyBwb29yIGNvZGUsIGFuZCB0aGUgY29tcGlsZXIKLQkJCQkgICBzaG91bGQgbmV2ZXIgcHJvZHVjZSBhIHNlcXVlbmNlIHRoYXQgcmVxdWlyZXMgaXQgdG8gYmUgdXNlZC4gICovCi0KLSAgICAgIC8qIEEgYmNvbmQgd29uJ3QgZml0IGFuZCBpdCB3b24ndCBnbyBpbnRvIGEgMTIgYml0Ci0JIGRpc3BsYWNlbWVudCBlaXRoZXIsIHRoZSBjb2RlIHNlcXVlbmNlIGxvb2tzIGxpa2U6Ci0JIGIhY29uZCBmb29wCi0JIG1vdi53IEAobiwgUEMpLCByMTQKLQkgam1wICBAcjE0Ci0JIG5vcAotCSAubG9uZyB3aGVyZQotCSBmb29wOgotCSAqLwotCi0gICAgICBidWZmZXJbMF0gXj0gMHgyOwkJLyogVG9nZ2xlIFQvRiBiaXQgKi8KLSNkZWZpbmUgSlJFRyAxNAotICAgICAgYnVmZmVyWzFdID0gNTsJCS8qIGJyYW5jaCBvdmVyIG1vdiwganVtcCwgbm9wIGFuZCBwdHIgKi8KLSAgICAgIGJ1ZmZlclsyXSA9IDB4ZDAgfCBKUkVHOwkvKiBCdWlsZCBtb3YgaW5zbiAqLwotICAgICAgYnVmZmVyWzNdID0gMHgyOwotICAgICAgYnVmZmVyWzRdID0gMHg0MCB8IEpSRUc7CS8qIEJ1aWxkIGptcCBASlJFRyAqLwotICAgICAgYnVmZmVyWzVdID0gMHgwYjsKLSAgICAgIGJ1ZmZlcls2XSA9IDB4MjA7CQkvKiBidWlsZCBub3AgKi8KLSAgICAgIGJ1ZmZlcls3XSA9IDB4MGI7Ci0gICAgICBidWZmZXJbOF0gPSAwOwkJLyogc3BhY2UgZm9yIDMyIGJpdCBqdW1wIGRpc3AgKi8KLSAgICAgIGJ1ZmZlcls5XSA9IDA7Ci0gICAgICBidWZmZXJbMTBdID0gMDsKLSAgICAgIGJ1ZmZlclsxMV0gPSAwOwotICAgICAgYnVmZmVyWzEyXSA9IDA7Ci0gICAgICBidWZmZXJbMTNdID0gMDsKLSAgICAgIC8qIE1ha2UgcmVsb2MgZm9yIHRoZSBsb25nIGRpc3AgKi8KLSAgICAgIGZpeF9uZXcgKGZyYWdQLAotCSAgICAgICBmcmFnUC0+ZnJfZml4ICsgOCwKLQkgICAgICAgNCwKLQkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwKLQkgICAgICAgMCwKLQkgICAgICAgQkZEX1JFTE9DXzMyKTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gQ09ORDMyX0xFTkdUSDsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZG9uZXJlbGF4ID0gMTsKLSNlbmRpZgotCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGRvbmVyZWxheCAmJiAhc2hfcmVsYXgpCi0gICAgYXNfd2Fybl93aGVyZSAoZnJhZ1AtPmZyX2ZpbGUsIGZyYWdQLT5mcl9saW5lLAotCQkgICBfKCJvdmVyZmxvdyBpbiBicmFuY2ggdG8gJXM7IGNvbnZlcnRlZCBpbnRvIGxvbmdlciBpbnN0cnVjdGlvbiBzZXF1ZW5jZSIpLAotCQkgICAoZnJhZ1AtPmZyX3N5bWJvbCAhPSBOVUxMCi0JCSAgICA/IFNfR0VUX05BTUUgKGZyYWdQLT5mcl9zeW1ib2wpCi0JCSAgICA6ICIiKSk7Ci19Ci0KLXZhbHVlVAotREVGVU4gKG1kX3NlY3Rpb25fYWxpZ24sIChzZWcsIHNpemUpLAotICAgICAgIHNlZ1Qgc2VnIEFORAotICAgICAgIHZhbHVlVCBzaXplKQotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBPQkpfRUxGCi0gIHJldHVybiBzaXplOwotI2Vsc2UgLyogISBPQkpfRUxGICovCi0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZykpIC0gMSkKLQkgICYgKC0xIDw8IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKSkpOwotI2VuZGlmIC8qICEgT0JKX0VMRiAqLwotI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCi0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSAtIDEpCi0JICAmICgtMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSk7Ci0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi19Ci0KLS8qIFRoaXMgc3RhdGljIHZhcmlhYmxlIGlzIHNldCBieSBzX3VhY29ucyB0byB0ZWxsIHNoX2NvbnNfYWxpZ24gdGhhdAotICAgdGhlIGV4cGVzc2lvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIGFsaWduZWQuICAqLwotCi1zdGF0aWMgaW50IHNoX25vX2FsaWduX2NvbnMgPSAwOwotCi0vKiBUaGlzIGhhbmRsZXMgdGhlIHVuYWxpZ25lZCBzcGFjZSBhbGxvY2F0aW9uIHBzZXVkby1vcHMsIHN1Y2ggYXMKLSAgIC51YXdvcmQuICAudWF3b3JkIGlzIGp1c3QgbGlrZSAud29yZCwgYnV0IHRoZSB2YWx1ZSBkb2VzIG5vdCBuZWVkCi0gICB0byBiZSBhbGlnbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfdWFjb25zIChieXRlcykKLSAgICAgaW50IGJ5dGVzOwotewotICAvKiBUZWxsIHNoX2NvbnNfYWxpZ24gbm90IHRvIGFsaWduIHRoaXMgdmFsdWUuICAqLwotICBzaF9ub19hbGlnbl9jb25zID0gMTsKLSAgY29ucyAoYnl0ZXMpOwotfQotCi0vKiBJZiBhIC53b3JkLCBldC4gYWwuLCBwc2V1ZC1vcCBpcyBzZWVuLCB3YXJuIGlmIHRoZSB2YWx1ZSBpcyBub3QKLSAgIGFsaWduZWQgY29ycmVjdGx5LiAgTm90ZSB0aGF0IHRoaXMgY2FuIGNhdXNlIHdhcm5pbmdzIHRvIGJlIGlzc3VlZAotICAgd2hlbiBhc3NlbWJsaW5nIGluaXRpYWxpemVkIHN0cnVjdHVyZWQgd2hpY2ggd2VyZSBkZWNsYXJlZCB3aXRoIHRoZQotICAgcGFja2VkIGF0dHJpYnV0ZS4gIEZJWE1FOiBQZXJoYXBzIHdlIHNob3VsZCByZXF1aXJlIGFuIG9wdGlvbiB0bwotICAgZW5hYmxlIHRoaXMgd2FybmluZz8gICovCi0KLXZvaWQKLXNoX2NvbnNfYWxpZ24gKG5ieXRlcykKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgaW50IG5hbGlnbjsKLSAgY2hhciAqcDsKLQotICBpZiAoc2hfbm9fYWxpZ25fY29ucykKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGFuIHVuYWxpZ25lZCBwc2V1ZG8tb3AuICAqLwotICAgICAgc2hfbm9fYWxpZ25fY29ucyA9IDA7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbGlnbiA9IDA7Ci0gIHdoaWxlICgobmJ5dGVzICYgMSkgPT0gMCkKLSAgICB7Ci0gICAgICArK25hbGlnbjsKLSAgICAgIG5ieXRlcyA+Pj0gMTsKLSAgICB9Ci0KLSAgaWYgKG5hbGlnbiA9PSAwKQotICAgIHJldHVybjsKLQotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGlmICgoYWJzX3NlY3Rpb25fb2Zmc2V0ICYgKCgxIDw8IG5hbGlnbikgLSAxKSkgIT0gMCkKLQlhc193YXJuIChfKCJtaXNhbGlnbmVkIGRhdGEiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHAgPSBmcmFnX3ZhciAocnNfYWxpZ25fY29kZSwgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwKLQkJKHN5bWJvbFMgKikgTlVMTCwgKG9mZnNldFQpIG5hbGlnbiwgKGNoYXIgKikgTlVMTCk7Ci0KLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgbmFsaWduKTsKLX0KLQotLyogV2hlbiByZWxheGluZywgd2UgbmVlZCB0byBvdXRwdXQgYSByZWxvYyBmb3IgYW55IC5hbGlnbiBkaXJlY3RpdmUKLSAgIHRoYXQgcmVxdWVzdHMgYWxpZ25tZW50IHRvIGEgZm91ciBieXRlIGJvdW5kYXJ5IG9yIGxhcmdlci4gIFRoaXMgaXMKLSAgIGFsc28gd2hlcmUgd2UgY2hlY2sgZm9yIG1pc2FsaWduZWQgZGF0YS4gICovCi0KLXZvaWQKLXNoX2hhbmRsZV9hbGlnbiAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIGlmIChzaF9yZWxheAotICAgICAgJiYgZnJhZy0+ZnJfdHlwZSA9PSByc19hbGlnbgotICAgICAgJiYgZnJhZy0+ZnJfYWRkcmVzcyArIGZyYWctPmZyX2ZpeCA+IDAKLSAgICAgICYmIGZyYWctPmZyX29mZnNldCA+IDEKLSAgICAgICYmIG5vd19zZWcgIT0gYnNzX3NlY3Rpb24pCi0gICAgZml4X25ldyAoZnJhZywgZnJhZy0+ZnJfZml4LCAyLCAmYWJzX3N5bWJvbCwgZnJhZy0+ZnJfb2Zmc2V0LCAwLAotCSAgICAgQkZEX1JFTE9DX1NIX0FMSUdOKTsKLQotICBpZiAoZnJhZy0+ZnJfdHlwZSA9PSByc19hbGlnbl9jb2RlCi0gICAgICAmJiBmcmFnLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZy0+ZnJfYWRkcmVzcyAtIGZyYWctPmZyX2ZpeCAhPSAwKQotICAgIGFzX3dhcm5fd2hlcmUgKGZyYWctPmZyX2ZpbGUsIGZyYWctPmZyX2xpbmUsIF8oIm1pc2FsaWduZWQgZGF0YSIpKTsKLX0KLQotLyogVGhpcyBtYWNybyBkZWNpZGVzIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHJlbG9jIGlzIGFuIGVudHJ5IGluIGEKLSAgIHN3aXRjaCB0YWJsZS4gIEl0IGlzIHVzZWQgd2hlbiByZWxheGluZywgYmVjYXVzZSB0aGUgbGlua2VyIG5lZWRzCi0gICB0byBrbm93IGFib3V0IGFsbCBzdWNoIGVudHJpZXMgc28gdGhhdCBpdCBjYW4gYWRqdXN0IHRoZW0gaWYKLSAgIG5lY2Vzc2FyeS4gICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIFNXSVRDSF9UQUJMRV9DT05TKGZpeCkgKDApCi0jZWxzZQotI2RlZmluZSBTV0lUQ0hfVEFCTEVfQ09OUyhmaXgpCQkJCVwKLSAgKChmaXgpLT5meF9yX3R5cGUgPT0gMAkJCQlcCi0gICAmJiAoKGZpeCktPmZ4X3NpemUgPT0gMgkJCQlcCi0gICAgICAgfHwgKGZpeCktPmZ4X3NpemUgPT0gMQkJCQlcCi0gICAgICAgfHwgKGZpeCktPmZ4X3NpemUgPT0gNCkpCi0jZW5kaWYKLQotI2RlZmluZSBTV0lUQ0hfVEFCTEUoZml4KQkJCQlcCi0gICgoZml4KS0+ZnhfYWRkc3kgIT0gTlVMTAkJCQlcCi0gICAmJiAoZml4KS0+Znhfc3Vic3kgIT0gTlVMTAkJCQlcCi0gICAmJiBTX0dFVF9TRUdNRU5UICgoZml4KS0+ZnhfYWRkc3kpID09IHRleHRfc2VjdGlvbglcCi0gICAmJiBTX0dFVF9TRUdNRU5UICgoZml4KS0+Znhfc3Vic3kpID09IHRleHRfc2VjdGlvbglcCi0gICAmJiAoKGZpeCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzIJCQlcCi0gICAgICAgfHwgKGZpeCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMTYJCVwKLSAgICAgICB8fCAoZml4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ184CQlcCi0gICAgICAgfHwgU1dJVENIX1RBQkxFX0NPTlMgKGZpeCkpKQotCi0vKiBTZWUgd2hldGhlciB3ZSBuZWVkIHRvIGZvcmNlIGEgcmVsb2NhdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KLSAgIFRoaXMgaXMgdXNlZCB0byBmb3JjZSBvdXQgc3dpdGNoIGFuZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucyB3aGVuCi0gICByZWxheGluZy4gICovCi0KLWludAotc2hfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotICAgICBmaXhTICpmaXg7Ci17Ci0KLSAgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoISBzaF9yZWxheCkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gKGZpeC0+ZnhfcGNyZWwKLQkgIHx8IFNXSVRDSF9UQUJMRSAoZml4KQotCSAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0NPVU5UCi0JICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfQUxJR04KLQkgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9DT0RFCi0JICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfREFUQQotCSAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0xBQkVMKTsKLX0KLQotI2lmZGVmIE9CSl9FTEYKLWJvb2xlYW4KLXNoX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgZml4UyAqZml4UDsKLXsKLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSAgCi0gIC8qIFdlIG5lZWQgdGhlIHN5bWJvbCBuYW1lIGZvciB0aGUgVlRBQkxFIGVudHJpZXMgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAxOwotfQotI2VuZGlmCi0KLS8qIEFwcGx5IGEgZml4dXAgdG8gdGhlIG9iamVjdCBmaWxlLiAgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLWludAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWxwKQotICAgICBmaXhTICpmaXhQOwotICAgICB2YWx1ZVQgKnZhbHA7Ci0jZWxzZQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotI2VuZGlmCi17Ci0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+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+ZnhfZG9uZSA9IDA7Ci0gICAgICByZXR1cm47Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmIChzaGlmdCAhPSAwKQotICAgIHsKLSAgICAgIGlmICgodmFsICYgKCgxIDw8IHNoaWZ0KSAtIDEpKSAhPSAwKQotCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgXygibWlzYWxpZ25lZCBvZmZzZXQiKSk7Ci0gICAgICBpZiAodmFsID49IDApCi0JdmFsID4+PSBzaGlmdDsKLSAgICAgIGVsc2UKLQl2YWwgPSAoKHZhbCA+PiBzaGlmdCkKLQkgICAgICAgfCAoKGxvbmcpIC0xICYgfiAoKGxvbmcpIC0xID4+IHNoaWZ0KSkpOwotICAgIH0KLSAgaWYgKG1heCAhPSAwICYmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KSkKLSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIF8oIm9mZnNldCBvdXQgb2YgcmFuZ2UiKSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHJldHVybiAwOwotI2VuZGlmCi19Ci0KLS8qIENhbGxlZCBqdXN0IGJlZm9yZSBhZGRyZXNzIHJlbGF4YXRpb24uICBSZXR1cm4gdGhlIGxlbmd0aAotICAgYnkgd2hpY2ggYSBmcmFnbWVudCBtdXN0IGdyb3cgdG8gcmVhY2ggaXQncyBkZXN0aW5hdGlvbi4gICovCi0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgQyAoVU5DT05EX0pVTVAsIFVOREVGX0RJU1ApOgotICAgICAgLyogdXNlZCB0byBiZSBhIGJyYW5jaCB0byBzb21ld2hlcmUgd2hpY2ggd2FzIHVua25vd24gKi8KLSAgICAgIGlmICghZnJhZ1AtPmZyX3N5bWJvbCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMik7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoVU5DT05EX0pVTVAsIFVOQ09ORDEyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChVTkNPTkRfSlVNUCwgVU5DT05EMTIpOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMildLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoVU5DT05EX0pVTVAsIFVOREVGX1dPUkRfRElTUCk7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoVU5DT05EX0pVTVAsIFVOQ09ORDMyKV0ucmx4X2xlbmd0aDsKLQkgIHJldHVybiBtZF9yZWxheF90YWJsZVtDIChVTkNPTkRfSlVNUCwgVU5DT05EMzIpXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBVTkRFRl9ESVNQKToKLSAgICBjYXNlIEMgKENPTkRfSlVNUF9ERUxBWSwgVU5ERUZfRElTUCk6Ci0gICAgICAvKiB1c2VkIHRvIGJlIGEgYnJhbmNoIHRvIHNvbWV3aGVyZSB3aGljaCB3YXMgdW5rbm93biAqLwotICAgICAgaWYgKGZyYWdQLT5mcl9zeW1ib2wKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICBpbnQgd2hhdCA9IEdFVF9XSEFUIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0JICAvKiBHb3QgYSBzeW1ib2wgYW5kIGl0J3MgZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQsIGJlY29tZSBieXRlCi0JICAgICBzaXplZCAtIG1heWJlIGl0IHdpbGwgZml4IHVwICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIENPTkQ4KTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBDT05EOCldLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N5bWJvbCkKLQl7Ci0JICBpbnQgd2hhdCA9IEdFVF9XSEFUIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0JICAvKiBJdHMgZ290IGEgc2VnbWVudCwgYnV0IGl0cyBub3Qgb3Vycywgc28gaXQgd2lsbCBhbHdheXMgYmUgbG9uZyAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDICh3aGF0LCBVTkRFRl9XT1JEX0RJU1ApOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIENPTkQzMildLnJseF9sZW5ndGg7Ci0JICByZXR1cm4gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgQ09ORDMyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50IHdoYXQgPSBHRVRfV0hBVCAoZnJhZ1AtPmZyX3N1YnR5cGUpOwotCSAgLyogV2Uga25vdyB0aGUgYWJzIHZhbHVlICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIENPTkQ4KTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBDT05EOCldLnJseF9sZW5ndGg7Ci0JfQotCi0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBmcmFnUC0+ZnJfdmFyOwotfQotCi0vKiBQdXQgbnVtYmVyIGludG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIHVzZSwgbmJ5dGVzKQotICAgICBjaGFyICpwdHI7Ci0gICAgIHZhbHVlVCB1c2U7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKHB0ciwgdXNlLCBuYnl0ZXMpOwotICBlbHNlCi0gICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAocHRyLCB1c2UsIG5ieXRlcyk7Ci19Ci0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiBmaXhQLT5meF9zaXplICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgMjsKLX0KLQotI2lmZGVmIE9CSl9DT0ZGCi0KLWludAotdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIHJldHVybiBtZF9yZWxheF90YWJsZVtmcmFnLT5mcl9zdWJ0eXBlXS5ybHhfbGVuZ3RoOwotfQotCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotLyogV2hlbiB3ZSBhbGlnbiB0aGUgLnRleHQgc2VjdGlvbiwgaW5zZXJ0IHRoZSBjb3JyZWN0IE5PUCBwYXR0ZXJuLiAgKi8KLQotaW50Ci1zaF9kb19hbGlnbiAobiwgZmlsbCwgbGVuLCBtYXgpCi0gICAgIGludCBuOwotICAgICBjb25zdCBjaGFyICpmaWxsOwotICAgICBpbnQgbGVuOwotICAgICBpbnQgbWF4OwotewotICBpZiAoZmlsbCA9PSBOVUxMCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgJiYgKG5vd19zZWctPmZsYWdzICYgU0VDX0NPREUpICE9IDAKLSNlbHNlCi0gICAgICAmJiBub3dfc2VnICE9IGRhdGFfc2VjdGlvbgotICAgICAgJiYgbm93X3NlZyAhPSBic3Nfc2VjdGlvbgotI2VuZGlmCi0gICAgICAmJiBuID4gMSkKLSAgICB7Ci0gICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBiaWdfbm9wX3BhdHRlcm5bXSA9IHsgMHgwMCwgMHgwOSB9OwotICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbGl0dGxlX25vcF9wYXR0ZXJuW10gPSB7IDB4MDksIDB4MDAgfTsKLQotICAgICAgLyogRmlyc3QgYWxpZ24gdG8gYSAyIGJ5dGUgYm91bmRhcnksIGluIGNhc2UgdGhlcmUgaXMgYW4gb2RkCi0gICAgICAgICAuYnl0ZS4gICovCi0gICAgICBmcmFnX2FsaWduICgxLCAwLCAwKTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlmcmFnX2FsaWduX3BhdHRlcm4gKG4sIGJpZ19ub3BfcGF0dGVybiwgc2l6ZW9mIGJpZ19ub3BfcGF0dGVybiwgbWF4KTsKLSAgICAgIGVsc2UKLQlmcmFnX2FsaWduX3BhdHRlcm4gKG4sIGxpdHRsZV9ub3BfcGF0dGVybiwgc2l6ZW9mIGxpdHRsZV9ub3BfcGF0dGVybiwKLQkJCSAgICBtYXgpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBPQkpfQ09GRgotCi0vKiBNYXAgQkZEIHJlbG9jcyB0byBTSCBDT0ZGIHJlbG9jcy4gICovCi0KLXN0cnVjdCByZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvYzsKLSAgaW50IHNoX3JlbG9jOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWxvY19tYXAgY29mZl9yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DXzMyLCBSX1NIX0lNTTMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX1NIX0lNTTE2IH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfU0hfSU1NOCB9LAotICB7IEJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyLCBSX1NIX1BDRElTUDhCWTIgfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENESVNQMTJCWTIsIFJfU0hfUENESVNQIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0lNTTQsIFJfU0hfSU1NNCB9LAotICB7IEJGRF9SRUxPQ19TSF9JTU00QlkyLCBSX1NIX0lNTTRCWTIgfSwKLSAgeyBCRkRfUkVMT0NfU0hfSU1NNEJZNCwgUl9TSF9JTU00Qlk0IH0sCi0gIHsgQkZEX1JFTE9DX1NIX0lNTTgsIFJfU0hfSU1NOCB9LAotICB7IEJGRF9SRUxPQ19TSF9JTU04QlkyLCBSX1NIX0lNTThCWTIgfSwKLSAgeyBCRkRfUkVMT0NfU0hfSU1NOEJZNCwgUl9TSF9JTU04Qlk0IH0sCi0gIHsgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMiwgUl9TSF9QQ1JFTElNTThCWTIgfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0LCBSX1NIX1BDUkVMSU1NOEJZNCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NIX1NXSVRDSDggfSwKLSAgeyBCRkRfUkVMT0NfU0hfU1dJVENIMTYsIFJfU0hfU1dJVENIMTYgfSwKLSAgeyBCRkRfUkVMT0NfU0hfU1dJVENIMzIsIFJfU0hfU1dJVENIMzIgfSwKLSAgeyBCRkRfUkVMT0NfU0hfVVNFUywgUl9TSF9VU0VTIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0NPVU5ULCBSX1NIX0NPVU5UIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0FMSUdOLCBSX1NIX0FMSUdOIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0NPREUsIFJfU0hfQ09ERSB9LAotICB7IEJGRF9SRUxPQ19TSF9EQVRBLCBSX1NIX0RBVEEgfSwKLSAgeyBCRkRfUkVMT0NfU0hfTEFCRUwsIFJfU0hfTEFCRUwgfSwKLSAgeyBCRkRfUkVMT0NfVU5VU0VELCAwIH0KLX07Ci0KLS8qIEFkanVzdCBhIHJlbG9jIGZvciB0aGUgU0guICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdlbmVyaWMgY29kZSwKLSAgIGJ1dCBkb2VzIHNvbWUgbWlub3IgdHdlYWtpbmcuICAqLwotCi12b2lkCi1zaF9jb2ZmX3JlbG9jX21hbmdsZSAoc2VnLCBmaXgsIGludHIsIHBhZGRyKQotICAgICBzZWdtZW50X2luZm9fdHlwZSAqc2VnOwotICAgICBmaXhTICpmaXg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50cjsKLSAgICAgdW5zaWduZWQgaW50IHBhZGRyOwotewotICBzeW1ib2xTICpzeW1ib2xfcHRyID0gZml4LT5meF9hZGRzeTsKLSAgc3ltYm9sUyAqZG90OwotCi0gIGludHItPnJfdmFkZHIgPSBwYWRkciArIGZpeC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeC0+Znhfd2hlcmU7Ci0KLSAgaWYgKCEgU1dJVENIX1RBQkxFIChmaXgpKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCByZWxvY19tYXAgKnJtOwotCi0gICAgICBmb3IgKHJtID0gY29mZl9yZWxvY19tYXA7IHJtLT5iZmRfcmVsb2MgIT0gQkZEX1JFTE9DX1VOVVNFRDsgcm0rKykKLQlpZiAocm0tPmJmZF9yZWxvYyA9PSAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSBmaXgtPmZ4X3JfdHlwZSkKLQkgIGJyZWFrOwotICAgICAgaWYgKHJtLT5iZmRfcmVsb2MgPT0gQkZEX1JFTE9DX1VOVVNFRCkKLQlhc19iYWRfd2hlcmUgKGZpeC0+ZnhfZmlsZSwgZml4LT5meF9saW5lLAotCQkgICAgICBfKCJDYW4gbm90IHJlcHJlc2VudCAlcyByZWxvY2F0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JCSAgICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXgtPmZ4X3JfdHlwZSkpOwotICAgICAgaW50ci0+cl90eXBlID0gcm0tPnNoX3JlbG9jOwotICAgICAgaW50ci0+cl9vZmZzZXQgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGtub3cgKHNoX3JlbGF4KTsKLQotICAgICAgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18xNikKLQlpbnRyLT5yX3R5cGUgPSBSX1NIX1NXSVRDSDE2OwotICAgICAgZWxzZSBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzgpCi0JaW50ci0+cl90eXBlID0gUl9TSF9TV0lUQ0g4OwotICAgICAgZWxzZSBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyKQotCWludHItPnJfdHlwZSA9IFJfU0hfU1dJVENIMzI7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIC8qIEZvciBhIHN3aXRjaCByZWxvYywgd2Ugc2V0IHJfb2Zmc2V0IHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLSAgICAgICAgIHRoZSByZWxvYyBhZGRyZXNzIGFuZCB0aGUgc3VidHJhaGVuZC4gIFdoZW4gdGhlIGxpbmtlciBpcwotICAgICAgICAgZG9pbmcgcmVsYXhpbmcsIGl0IGNhbiB1c2UgdGhlIGRldGVybWluZSB0aGUgc3RhcnRpbmcgYW5kCi0gICAgICAgICBlbmRpbmcgcG9pbnRzIG9mIHRoZSBzd2l0Y2ggZGlmZmVyZW5jZSBleHByZXNzaW9uLiAgKi8KLSAgICAgIGludHItPnJfb2Zmc2V0ID0gaW50ci0+cl92YWRkciAtIFNfR0VUX1ZBTFVFIChmaXgtPmZ4X3N1YnN5KTsKLSAgICB9Ci0KLSAgLyogUEMgcmVsYXRpdmUgcmVsb2NzIGFyZSBhbHdheXMgYWdhaW5zdCB0aGUgY3VycmVudCBzZWN0aW9uLiAgKi8KLSAgaWYgKHN5bWJvbF9wdHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGZpeC0+Znhfcl90eXBlKQotCXsKLQljYXNlIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTI6Ci0JY2FzZSBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0OgotCWNhc2UgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTI6Ci0JY2FzZSBCRkRfUkVMT0NfU0hfUENESVNQMTJCWTI6Ci0JY2FzZSBCRkRfUkVMT0NfU0hfVVNFUzoKLQkgIHN5bWJvbF9wdHIgPSBzZWctPmRvdDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfVVNFUykKLSAgICB7Ci0gICAgICAvKiBXZSBjYW4ndCBzdG9yZSB0aGUgb2Zmc2V0IGluIHRoZSBvYmplY3QgZmlsZSwgc2luY2UgdGhpcwotCSByZWxvYyBkb2VzIG5vdCB0YWtlIHVwIGFueSBzcGFjZSwgc28gd2Ugc3RvcmUgaXQgaW4gcl9vZmZzZXQuCi0JIFRoZSBmeF9hZGRudW1iZXIgZmllbGQgd2FzIHNldCBpbiBtZF9hcHBseV9maXguICAqLwotICAgICAgaW50ci0+cl9vZmZzZXQgPSBmaXgtPmZ4X2FkZG51bWJlcjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9DT1VOVCkKLSAgICB7Ci0gICAgICAvKiBXZSBjYW4ndCBzdG9yZSB0aGUgY291bnQgaW4gdGhlIG9iamVjdCBmaWxlLCBzaW5jZSB0aGlzIHJlbG9jCi0gICAgICAgICBkb2VzIG5vdCB0YWtlIHVwIGFueSBzcGFjZSwgc28gd2Ugc3RvcmUgaXQgaW4gcl9vZmZzZXQuICBUaGUKLSAgICAgICAgIGZ4X29mZnNldCBmaWVsZCB3YXMgc2V0IHdoZW4gdGhlIGZpeHVwIHdhcyBjcmVhdGVkIGluCi0gICAgICAgICBzaF9jb2ZmX2Zyb2JfZmlsZS4gICovCi0gICAgICBpbnRyLT5yX29mZnNldCA9IGZpeC0+Znhfb2Zmc2V0OwotICAgICAgLyogVGhpcyByZWxvYyBpcyBhbHdheXMgYWJzb2x1dGUuICAqLwotICAgICAgc3ltYm9sX3B0ciA9IE5VTEw7Ci0gICAgfQotICBlbHNlIGlmIChmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfQUxJR04pCi0gICAgewotICAgICAgLyogU3RvcmUgdGhlIGFsaWdubWVudCBpbiB0aGUgcl9vZmZzZXQgZmllbGQuICAqLwotICAgICAgaW50ci0+cl9vZmZzZXQgPSBmaXgtPmZ4X29mZnNldDsKLSAgICAgIC8qIFRoaXMgcmVsb2MgaXMgYWx3YXlzIGFic29sdXRlLiAgKi8KLSAgICAgIHN5bWJvbF9wdHIgPSBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0NPREUKLQkgICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfREFUQQotCSAgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9MQUJFTCkKLSAgICB7Ci0gICAgICAvKiBUaGVzZSByZWxvY3MgYXJlIGFsd2F5cyBhYnNvbHV0ZS4gICovCi0gICAgICBzeW1ib2xfcHRyID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogVHVybiB0aGUgc2VnbWVudCBvZiB0aGUgc3ltYm9sIGludG8gYW4gb2Zmc2V0LiAgKi8KLSAgaWYgKHN5bWJvbF9wdHIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkb3QgPSBzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVCAoc3ltYm9sX3B0cildLmRvdDsKLSAgICAgIGlmIChkb3QgIT0gTlVMTCkKLQlpbnRyLT5yX3N5bW5keCA9IGRvdC0+c3lfbnVtYmVyOwotICAgICAgZWxzZQotCWludHItPnJfc3ltbmR4ID0gc3ltYm9sX3B0ci0+c3lfbnVtYmVyOwotICAgIH0KLSAgZWxzZQotICAgIGludHItPnJfc3ltbmR4ID0gLTE7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0vKiBDcmVhdGUgYSByZWxvYy4gICovCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlOwotCi0gIHJlbCA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWwtPnN5bV9wdHJfcHRyID0gJmZpeHAtPmZ4X2FkZHN5LT5ic3ltOwotICByZWwtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0KLSAgcl90eXBlID0gZml4cC0+Znhfcl90eXBlOwotCi0gIGlmIChTV0lUQ0hfVEFCTEUgKGZpeHApKQotICAgIHsKLSAgICAgIHJlbC0+YWRkZW5kID0gcmVsLT5hZGRyZXNzIC0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KTsKLSAgICAgIGlmIChyX3R5cGUgPT0gQkZEX1JFTE9DXzE2KQotCXJfdHlwZSA9IEJGRF9SRUxPQ19TSF9TV0lUQ0gxNjsKLSAgICAgIGVsc2UgaWYgKHJfdHlwZSA9PSBCRkRfUkVMT0NfOCkKLQlyX3R5cGUgPSBCRkRfUkVMT0NfOF9QQ1JFTDsKLSAgICAgIGVsc2UgaWYgKHJfdHlwZSA9PSBCRkRfUkVMT0NfMzIpCi0Jcl90eXBlID0gQkZEX1JFTE9DX1NIX1NXSVRDSDMyOwotICAgICAgZWxzZQotCWFib3J0ICgpOwotICAgIH0KLSAgZWxzZSBpZiAocl90eXBlID09IEJGRF9SRUxPQ19TSF9VU0VTKQotICAgIHJlbC0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlIGlmIChyX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0NPVU5UKQotICAgIHJlbC0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotICBlbHNlIGlmIChyX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0FMSUdOKQotICAgIHJlbC0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotICBlbHNlIGlmIChyX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICAgICAgIHx8IHJfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJlbC0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotICBlbHNlIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgZWxzZQotICAgIHJlbC0+YWRkZW5kID0gMDsKLQotICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIHJfdHlwZSk7Ci0gIGlmIChyZWwtPmhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiQ2Fubm90IHJlcHJlc2VudCByZWxvY2F0aW9uIHR5cGUgJXMiKSwKLQkJICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChyX3R5cGUpKTsKLSAgICAgIC8qIFNldCBob3d0byB0byBhIGdhcmJhZ2UgdmFsdWUgc28gdGhhdCB3ZSBjYW4ga2VlcCBnb2luZy4gICovCi0gICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIEJGRF9SRUxPQ18zMik7Ci0gICAgICBhc3NlcnQgKHJlbC0+aG93dG8gIT0gTlVMTCk7Ci0gICAgfQotCi0gIHJldHVybiByZWw7Ci19Ci0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXNoLmggYi9nYXMvY29uZmlnL3RjLXNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMDJlYWIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1zaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1zaC5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX1NICi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX3NoCi0KLSNpZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBzZWdtZW50X2luZm9fc3RydWN0Owotc3RydWN0IGludGVybmFsX3JlbG9jOwotI2VuZGlmCi0KLS8qIFdoZXRoZXIgaW4gbGl0dGxlIGVuZGlhbiBtb2RlLiAgKi8KLWV4dGVybiBpbnQgc2hsOwotCi0vKiBXaGV0aGVyIC1yZWxheCB3YXMgdXNlZC4gICovCi1leHRlcm4gaW50IHNoX3JlbGF4OwotCi0vKiBXaGV0aGVyIC1zbWFsbCB3YXMgdXNlZC4gICovCi1leHRlcm4gaW50IHNoX3NtYWxsOwotCi0vKiBEb24ndCB0cnkgdG8gYnJlYWsgd29yZHMuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qIFdlIHJlcXVpcmUgLmxvbmcsIGV0LiBhbC4sIHRvIGJlIGFsaWduZWQgY29ycmVjdGx5LiAgKi8KLSNkZWZpbmUgbWRfY29uc19hbGlnbihuYnl0ZXMpIHNoX2NvbnNfYWxpZ24gKG5ieXRlcykKLWV4dGVybiB2b2lkIHNoX2NvbnNfYWxpZ24gUEFSQU1TICgoaW50KSk7Ci0KLS8qIFdoZW4gcmVsYXhpbmcsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgcmVsb2NhdGlvbnMgZm9yIGFsaWdubWVudAotICAgZGlyZWN0aXZlcy4gICovCi0jZGVmaW5lIEhBTkRMRV9BTElHTihmcmFnKSBzaF9oYW5kbGVfYWxpZ24gKGZyYWcpCi1leHRlcm4gdm9pZCBzaF9oYW5kbGVfYWxpZ24gUEFSQU1TICgoZnJhZ1MgKikpOwotCi0vKiBXZSBuZWVkIHRvIGZvcmNlIG91dCBzb21lIHJlbG9jYXRpb25zIHdoZW4gcmVsYXhpbmcuICAqLwotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeCkgc2hfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotZXh0ZXJuIGludCBzaF9mb3JjZV9yZWxvY2F0aW9uICgpOwotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgc2hfZml4X2FkanVzdGFibGUoZml4UCkKLSNlbmRpZgotCi0jZGVmaW5lIElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTCi0KLSNkZWZpbmUgTElTVElOR19IRUFERVIgKHNobCA/ICJIaXRhY2hpIFN1cGVyLUggR0FTIExpdHRsZSBFbmRpYW4iIDogIkhpdGFjaGkgU3VwZXItSCBHQVMgQmlnIEVuZGlhbiIpCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0vKiBXZSB1c2UgYSBzcGVjaWFsIGFsaWdubWVudCBmdW5jdGlvbiB0byBpbnNlcnQgdGhlIGNvcnJlY3Qgbm9wCi0gICBwYXR0ZXJuLiAgKi8KLWV4dGVybiBpbnQgc2hfZG9fYWxpZ24gUEFSQU1TICgoaW50LCBjb25zdCBjaGFyICosIGludCwgaW50KSk7Ci0jZGVmaW5lIG1kX2RvX2FsaWduKG4sZmlsbCxsZW4sbWF4LGwpIGlmIChzaF9kb19hbGlnbiAobixmaWxsLGxlbixtYXgpKSBnb3RvIGwKLQotLyogV2UgcmVjb3JkLCBmb3IgZWFjaCBzZWN0aW9uLCB3aGV0aGVyIHdlIGhhdmUgbW9zdCByZWNlbnRseSBvdXRwdXQgYQotICAgQ09ERSByZWxvYyBvciBhIERBVEEgcmVsb2MuICAqLwotc3RydWN0IHNoX3NlZ21lbnRfaW5mb190eXBlCi17Ci0gIGludCBpbl9jb2RlIDogMTsKLX07Ci0jZGVmaW5lIFRDX1NFR01FTlRfSU5GT19UWVBFIHN0cnVjdCBzaF9zZWdtZW50X2luZm9fdHlwZQotCi0vKiBXZSBjYWxsIGEgcm91dGluZSB0byBlbWl0IGEgcmVsb2MgZm9yIGEgbGFiZWwsIHNvIHRoYXQgdGhlIGxpbmtlcgotICAgY2FuIGFsaWduIGxvYWRzIGFuZCBzdG9yZXMgd2l0aG91dCBjcm9zc2luZyBhIGxhYmVsLiAgKi8KLWV4dGVybiB2b2lkIHNoX2Zyb2JfbGFiZWwgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgc2hfZnJvYl9sYWJlbCAoKQotCi0vKiBXZSBjYWxsIGEgcm91dGluZSB0byBmbHVzaCBwZW5kaW5nIG91dHB1dCBpbiBvcmRlciB0byBvdXRwdXQgYSBEQVRBCi0gICByZWxvYyB3aGVuIHJlcXVpcmVkLiAgKi8KLWV4dGVybiB2b2lkIHNoX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQoKSBzaF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSB0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCBzaF9mcm9iX2ZpbGUKLSNlbHNlCi0jZGVmaW5lIHRjX2Zyb2JfZmlsZSBzaF9mcm9iX2ZpbGUKLSNlbmRpZgotZXh0ZXJuIHZvaWQgc2hfZnJvYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLQotI2lmZGVmIE9CSl9DT0ZGCi0vKiBDT0ZGIHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KLQotI2RlZmluZSBET19OT1RfU1RSSVAgMAotCi0vKiBUaGlzIG1hY3JvIHRyYW5zbGF0ZXMgYmV0d2VlbiBhbiBpbnRlcm5hbCBmaXggYW5kIGFuIGNvZmYgcmVsb2MgdHlwZSAqLwotI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShmaXgpICgoZml4KS0+Znhfcl90eXBlKQotCi0jZGVmaW5lIEJGRF9BUkNIIFRBUkdFVF9BUkNICi0KLSNkZWZpbmUgQ09GRl9NQUdJQyAoc2hsID8gU0hfQVJDSF9NQUdJQ19MSVRUTEUgOiBTSF9BUkNIX01BR0lDX0JJRykKLQotLyogV2UgbmVlZCB0byB3cml0ZSBvdXQgcmVsb2NzIHdoaWNoIGhhdmUgbm90IGJlZW4gY29tcGxldGVkLiAgKi8KLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoZml4KSAoKGZpeCktPmZ4X2FkZHN5ICE9IE5VTEwpCi0KLSNkZWZpbmUgVENfUkVMT0NfTUFOR0xFKHNlZywgZml4LCBpbnQsIHBhZGRyKSBcCi0gIHNoX2NvZmZfcmVsb2NfbWFuZ2xlICgoc2VnKSwgKGZpeCksIChpbnQpLCAocGFkZHIpKQotZXh0ZXJuIHZvaWQgc2hfY29mZl9yZWxvY19tYW5nbGUKLSAgUEFSQU1TICgoc3RydWN0IHNlZ21lbnRfaW5mb19zdHJ1Y3QgKiwgc3RydWN0IGZpeCAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCB1bnNpZ25lZCBpbnQpKTsKLQotI2RlZmluZSB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2soYSkgOyAvKiBub3QgdXNlZCAqLwotCi0jZGVmaW5lIE5FRURfRlhfUl9UWVBFIDEKLQotI2RlZmluZSBUQ19LRUVQX0ZYX09GRlNFVCAxCi0KLSNkZWZpbmUgVENfQ09GRl9TSVpFTUFDSERFUChmcmFnKSB0Y19jb2ZmX3NpemVtYWNoZGVwKGZyYWcpCi1leHRlcm4gaW50IHRjX2NvZmZfc2l6ZW1hY2hkZXAgUEFSQU1TICgoZnJhZ1MgKikpOwotCi0vKiBXZSBhbGlnbiBtb3N0IHNlY3Rpb25zIHRvIGEgMTYgYnl0ZSBib3VuZGFyeS4gICovCi0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykJCQkJCVwKLSAgKHN0cm5jbXAgKG9ial9zZWdtZW50X25hbWUgKFNFRyksICIuc3RhYnN0ciIsIDgpID09IDAJCVwKLSAgID8gMAkJCQkJCQkJXAotICAgOiAoKHN0cm5jbXAgKG9ial9zZWdtZW50X25hbWUgKFNFRyksICIuc3RhYiIsIDUpID09IDAJXAotICAgICAgIHx8IHN0cmNtcCAob2JqX3NlZ21lbnRfbmFtZSAoU0VHKSwgIi5jdG9ycyIpID09IDAJXAotICAgICAgIHx8IHN0cmNtcCAob2JqX3NlZ21lbnRfbmFtZSAoU0VHKSwgIi5kdG9ycyIpID09IDApCVwKLSAgICAgID8gMgkJCQkJCQlcCi0gICAgICA6IChzaF9zbWFsbCA/IDIgOiA0KSkpCi0KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCi0jaWZkZWYgT0JKX0VMRgotLyogRUxGIHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KLQotLyogV2hldGhlciBvciBub3QgdGhlIHRhcmdldCBpcyBiaWcgZW5kaWFuICovCi1leHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOwotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgKHNobCA/ICJlbGYzMi1zaGwiIDogImVsZjMyLXNoIikKLQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQotLyogZW5kIG9mIHRjLXNoLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtc3BhcmMuYyBiL2dhcy9jb25maWcvdGMtc3BhcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxOGE4YS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXNwYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUxICswLDAgQEAKLS8qIHRjLXNwYXJjLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBTUEFSQwotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MC05NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZQotICAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2luY2x1ZGUgIm9wY29kZS9zcGFyYy5oIgotCi0jaWZkZWYgT0JKX0VMRgotI2luY2x1ZGUgImVsZi9zcGFyYy5oIgotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3Qgc3BhcmNfYXJjaCAqbG9va3VwX2FyY2ggUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBpbml0X2RlZmF1bHRfYXJjaCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBzcGFyY19pcCBQQVJBTVMgKChjaGFyICosIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKiopKTsKLXN0YXRpYyBpbnQgaW5fc2lnbmVkX3JhbmdlIFBBUkFNUyAoKGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOwotc3RhdGljIGludCBpbl91bnNpZ25lZF9yYW5nZSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfdm1hKSk7Ci1zdGF0aWMgaW50IGluX2JpdGZpZWxkX3JhbmdlIFBBUkFNUyAoKGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOwotc3RhdGljIGludCBzcGFyY19mZnMgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYmZkX3ZtYSBCU1IgUEFSQU1TICgoYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgaW50IGNtcF9yZWdfZW50cnkgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLXN0YXRpYyBpbnQgcGFyc2Vfa2V5d29yZF9hcmcgUEFSQU1TICgoaW50ICgqKSAoY29uc3QgY2hhciAqKSwgY2hhciAqKiwgaW50ICopKTsKLXN0YXRpYyBpbnQgcGFyc2VfY29uc3RfZXhwcl9hcmcgUEFSQU1TICgoY2hhciAqKiwgaW50ICopKTsKLXN0YXRpYyBpbnQgZ2V0X2V4cHJlc3Npb24gUEFSQU1TICgoY2hhciAqc3RyKSk7Ci0KLS8qIERlZmF1bHQgYXJjaGl0ZWN0dXJlLiAgKi8KLS8qID8/PyBUaGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgVjgsIGJ1dCBzcGFyY2xpdGUgc3VwcG9ydCB3YXMgYWRkZWQKLSAgIGJ5IG1ha2luZyBpdCB0aGUgZGVmYXVsdC4gIEdDQyBub3cgcGFzc2VzIC1Bc3BhcmNsaXRlLCBzbyBtYXliZSBzb21ldGltZSBpbgotICAgdGhlIGZ1dHVyZSB3ZSBjYW4gc2V0IHRoaXMgdG8gVjguICAqLwotI2lmbmRlZiBERUZBVUxUX0FSQ0gKLSNkZWZpbmUgREVGQVVMVF9BUkNIICJzcGFyY2xpdGUiCi0jZW5kaWYKLXN0YXRpYyBjaGFyICpkZWZhdWx0X2FyY2ggPSBERUZBVUxUX0FSQ0g7Ci0KLS8qIE5vbi16ZXJvIGlmIHRoZSBpbml0aWFsIHZhbHVlcyBvZiBgbWF4X2FyY2hpdGVjdHVyZScgYW5kIGBzcGFyY19hcmNoX3NpemUnCi0gICBoYXZlIGJlZW4gc2V0LiAgKi8KLXN0YXRpYyBpbnQgZGVmYXVsdF9pbml0X3A7Ci0KLS8qIEN1cnJlbnQgYXJjaGl0ZWN0dXJlLiAgV2UgZG9uJ3QgYnVtcCB1cCB1bmxlc3MgbmVjZXNzYXJ5LiAgKi8KLXN0YXRpYyBlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCBjdXJyZW50X2FyY2hpdGVjdHVyZSA9IFNQQVJDX09QQ09ERV9BUkNIX1Y2OwotCi0vKiBUaGUgbWF4aW11bSBhcmNoaXRlY3R1cmUgbGV2ZWwgd2UgY2FuIGJ1bXAgdXAgdG8uCi0gICBJbiBhIDMyIGJpdCBlbnZpcm9ubWVudCwgZG9uJ3QgYWxsb3cgYnVtcGluZyB1cCB0byB2OSBieSBkZWZhdWx0LgotICAgVGhlIG5hdGl2ZSBhc3NlbWJsZXIgd29ya3MgdGhpcyB3YXkuICBUaGUgdXNlciBpcyByZXF1aXJlZCB0byBwYXNzCi0gICBhbiBleHBsaWNpdCBhcmd1bWVudCBiZWZvcmUgd2UnbGwgY3JlYXRlIHY5IG9iamVjdCBmaWxlcy4gIEhvd2V2ZXIsIGlmCi0gICB3ZSBkb24ndCBzZWUgYW55IHY5IGluc25zLCBhIHY4cGx1cyBvYmplY3QgZmlsZSBpcyBub3QgY3JlYXRlZC4gICovCi1zdGF0aWMgZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgbWF4X2FyY2hpdGVjdHVyZTsKLQotLyogRWl0aGVyIDMyIG9yIDY0LCBzZWxlY3RzIGZpbGUgZm9ybWF0LiAgKi8KLXN0YXRpYyBpbnQgc3BhcmNfYXJjaF9zaXplOwotLyogSW5pdGlhbCAoZGVmYXVsdCkgdmFsdWUsIHJlY29yZGVkIHNlcGFyYXRlbHkgaW4gY2FzZSBhIHVzZXIgb3B0aW9uCi0gICBjaGFuZ2VzIHRoZSB2YWx1ZSBiZWZvcmUgbWRfc2hvd191c2FnZSBpcyBjYWxsZWQuICAqLwotc3RhdGljIGludCBkZWZhdWx0X2FyY2hfc2l6ZTsKLQotI2lmZGVmIE9CSl9FTEYKLS8qIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdjkgbWVtb3J5IG1vZGVsLiAgQ3VycmVudGx5IG9ubHkgdXNlZCBmb3IKLSAgIEVMRi4gICovCi1zdGF0aWMgZW51bSB7IE1NX1RTTywgTU1fUFNPLCBNTV9STU8gfSBzcGFyY19tZW1vcnlfbW9kZWwgPSBNTV9STU87Ci0jZW5kaWYKLQotc3RhdGljIGludCBhcmNoaXRlY3R1cmVfcmVxdWVzdGVkOwotc3RhdGljIGludCB3YXJuX29uX2J1bXA7Ci0KLS8qIElmIHdhcm5fb25fYnVtcCBhbmQgdGhlIG5lZWRlZCBhcmNoaXRlY3R1cmUgaXMgaGlnaGVyIHRoYW4gdGhpcwotICAgYXJjaGl0ZWN0dXJlLCBpc3N1ZSBhIHdhcm5pbmcuICAqLwotc3RhdGljIGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsIHdhcm5fYWZ0ZXJfYXJjaGl0ZWN0dXJlOwotCi0vKiBOb24temVybyBpZiB3ZSBhcmUgZ2VuZXJhdGluZyBQSUMgY29kZS4gICovCi1pbnQgc3BhcmNfcGljX2NvZGU7Ci0KLS8qIE5vbi16ZXJvIGlmIHdlIHNob3VsZCBnaXZlIGFuIGVycm9yIHdoZW4gbWlzYWxpZ25lZCBkYXRhIGlzIHNlZW4uICAqLwotc3RhdGljIGludCBlbmZvcmNlX2FsaWduZWRfZGF0YTsKLQotZXh0ZXJuIGludCB0YXJnZXRfYmlnX2VuZGlhbjsKLQotc3RhdGljIGludCB0YXJnZXRfbGl0dGxlX2VuZGlhbl9kYXRhOwotCi0vKiBWOSBhbmQgODZ4IGhhdmUgYmlnIGFuZCBsaXR0bGUgZW5kaWFuIGRhdGEsIGJ1dCBpbnN0cnVjdGlvbnMgYXJlIGFsd2F5cyBiaWcKLSAgIGVuZGlhbi4gIFRoZSBzcGFyY2xldCBoYXMgYmktZW5kaWFuIHN1cHBvcnQgYnV0IGJvdGggZGF0YSBhbmQgaW5zbnMgaGF2ZQotICAgdGhlIHNhbWUgZW5kaWFubmVzcy4gIEdsb2JhbCBgdGFyZ2V0X2JpZ19lbmRpYW4nIGlzIHVzZWQgZm9yIGRhdGEuCi0gICBUaGUgZm9sbG93aW5nIG1hY3JvIGlzIHVzZWQgZm9yIGluc3RydWN0aW9ucy4gICovCi0jaWZuZGVmIElOU05fQklHX0VORElBTgotI2RlZmluZSBJTlNOX0JJR19FTkRJQU4gKHRhcmdldF9iaWdfZW5kaWFuIFwKLQkJCSB8fCBkZWZhdWx0X2FyY2hfdHlwZSA9PSBzcGFyYzg2eCBcCi0JCQkgfHwgU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUCAobWF4X2FyY2hpdGVjdHVyZSkpCi0jZW5kaWYKLQotLyogaGFuZGxlIG9mIHRoZSBPUENPREUgaGFzaCB0YWJsZSAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2g7Ci0KLXN0YXRpYyBpbnQgbG9nMiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZGF0YTEgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgc19zZWcgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3Byb2MgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3Jlc2VydmUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2NvbW1vbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZW1wdHkgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3VhY29ucyBQQVJBTVMgKChpbnQpKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDB9LAkvKiBEZWZhdWx0aW5nIGlzIGludmFsaWQgKDApICovCi0gIHsiY29tbW9uIiwgc19jb21tb24sIDB9LAotICB7ImVtcHR5Iiwgc19lbXB0eSwgMH0sCi0gIHsiZ2xvYmFsIiwgc19nbG9ibCwgMH0sCi0gIHsiaGFsZiIsIGNvbnMsIDJ9LAotICB7Im9wdGltIiwgc19pZ25vcmUsIDB9LAotICB7InByb2MiLCBzX3Byb2MsIDB9LAotICB7InJlc2VydmUiLCBzX3Jlc2VydmUsIDB9LAotICB7InNlZyIsIHNfc2VnLCAwfSwKLSAgeyJza2lwIiwgc19zcGFjZSwgMH0sCi0gIHsid29yZCIsIGNvbnMsIDR9LAotICB7Inh3b3JkIiwgY29ucywgOH0sCi0gIHsidWFoYWxmIiwgc191YWNvbnMsIDJ9LAotICB7InVhd29yZCIsIHNfdWFjb25zLCA0fSwKLSAgeyJ1YXh3b3JkIiwgc191YWNvbnMsIDh9LAotI2lmZGVmIE9CSl9FTEYKLSAgLyogdGhlc2UgYXJlIHNwZWNpZmljIHRvIHNwYXJjL3N2cjQgKi8KLSAgeyJwdXNoc2VjdGlvbiIsIG9ial9lbGZfc2VjdGlvbiwgMH0sCi0gIHsicG9wc2VjdGlvbiIsIG9ial9lbGZfcHJldmlvdXMsIDB9LAotICB7IjJieXRlIiwgc191YWNvbnMsIDJ9LAotICB7IjRieXRlIiwgc191YWNvbnMsIDR9LAotICB7IjhieXRlIiwgc191YWNvbnMsIDh9LAotI2VuZGlmCi0gIHtOVUxMLCAwLCAwfSwKLX07Ci0KLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gMTI7CS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiEiOwkvKiBKRiByZW1vdmVkICd8JyBmcm9tIGNvbW1lbnRfY2hhcnMgKi8KLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dCAqLwotLyogTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4gKi8KLS8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIHN0YXJ0ZWQgbGlrZSB0aGlzIG9uZSB3aWxsIGFsd2F5cwotICAgd29yayBpZiAnLycgaXNuJ3Qgb3RoZXJ3aXNlIGRlZmluZWQuICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7Ci0KLS8qIEFsc28gYmUgYXdhcmUgdGhhdCBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQgbWF5IGhhdmUgdG8gYmUKLSAgIGNoYW5nZWQgaW4gcmVhZC5jLiAgSWRlYWxseSBpdCBzaG91bGRuJ3QgaGF2ZSB0byBrbm93IGFib3V0IGl0IGF0IGFsbCwKLSAgIGJ1dCBub3RoaW5nIGlzIGlkZWFsIGFyb3VuZCBoZXJlLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgb2N0YWxbMjU2XTsKLSNkZWZpbmUgaXNvY3RhbChjKSAgb2N0YWxbKHVuc2lnbmVkIGNoYXIpIChjKV0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHRvSGV4WzI1Nl07Ci0KLXN0cnVjdCBzcGFyY19pdAotICB7Ci0gICAgY2hhciAqZXJyb3I7Ci0gICAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gICAgc3RydWN0IG5saXN0ICpubGlzdHA7Ci0gICAgZXhwcmVzc2lvblMgZXhwOwotICAgIGludCBwY3JlbDsKLSAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gIH07Ci0KLXN0cnVjdCBzcGFyY19pdCB0aGVfaW5zbiwgc2V0X2luc247Ci0KLXN0YXRpYyB2b2lkIG91dHB1dF9pbnNuCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKiwgc3RydWN0IHNwYXJjX2l0ICopKTsKLQwKLS8qIFRhYmxlIG9mIGFyZ3VtZW50cyB0byAtQS4KLSAgIFRoZSBzcGFyY19vcGNvZGVfYXJjaCB0YWJsZSBpbiBzcGFyYy1vcGMuYyBpcyBpbnN1ZmZpY2llbnQgYW5kIGluY29ycmVjdAotICAgZm9yIHRoaXMgdXNlLiAgVGhhdCB0YWJsZSBpcyBmb3Igb3Bjb2RlcyBvbmx5LiAgVGhpcyB0YWJsZSBpcyBmb3Igb3Bjb2RlcwotICAgYW5kIGZpbGUgZm9ybWF0cy4gICovCi0KLWVudW0gc3BhcmNfYXJjaF90eXBlcyB7djYsIHY3LCB2OCwgc3BhcmNsZXQsIHNwYXJjbGl0ZSwgc3BhcmM4NngsIHY4cGx1cywKLQkJICAgICAgIHY4cGx1c2EsIHY5LCB2OWEsIHY5XzY0fTsKLQotc3RhdGljIHN0cnVjdCBzcGFyY19hcmNoIHsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqb3Bjb2RlX2FyY2g7Ci0gIGVudW0gc3BhcmNfYXJjaF90eXBlcyBhcmNoX3R5cGU7Ci0gIC8qIERlZmF1bHQgd29yZCBzaXplLCBhcyBzcGVjaWZpZWQgZHVyaW5nIGNvbmZpZ3VyYXRpb24uCi0gICAgIEEgdmFsdWUgb2YgemVybyBtZWFucyBjYW4ndCBiZSB1c2VkIHRvIHNwZWNpZnkgZGVmYXVsdCBhcmNoaXRlY3R1cmUuICAqLwotICBpbnQgZGVmYXVsdF9hcmNoX3NpemU7Ci0gIC8qIEFsbG93YWJsZSBhcmcgdG8gLUE/ICAqLwotICBpbnQgdXNlcl9vcHRpb25fcDsKLX0gc3BhcmNfYXJjaF90YWJsZVtdID0gewotICB7ICJ2NiIsICJ2NiIsIHY2LCAwLCAxIH0sCi0gIHsgInY3IiwgInY3IiwgdjcsIDAsIDEgfSwKLSAgeyAidjgiLCAidjgiLCB2OCwgMzIsIDEgfSwKLSAgeyAic3BhcmNsZXQiLCAic3BhcmNsZXQiLCBzcGFyY2xldCwgMzIsIDEgfSwKLSAgeyAic3BhcmNsaXRlIiwgInNwYXJjbGl0ZSIsIHNwYXJjbGl0ZSwgMzIsIDEgfSwKLSAgeyAic3BhcmM4NngiLCAic3BhcmNsaXRlIiwgc3BhcmM4NngsIDMyLCAxIH0sCi0gIHsgInY4cGx1cyIsICJ2OSIsIHY5LCAwLCAxIH0sCi0gIHsgInY4cGx1c2EiLCAidjlhIiwgdjksIDAsIDEgfSwKLSAgeyAidjkiLCAidjkiLCB2OSwgMCwgMSB9LAotICB7ICJ2OWEiLCAidjlhIiwgdjksIDAsIDEgfSwKLSAgLyogVGhpcyBleGlzdHMgdG8gYWxsb3cgY29uZmlndXJlLmluL01ha2VmaWxlLmluIHRvIHBhc3Mgb25lCi0gICAgIHZhbHVlIHRvIHNwZWNpZnkgYm90aCB0aGUgZGVmYXVsdCBtYWNoaW5lIGFuZCBkZWZhdWx0IHdvcmQgc2l6ZS4gICovCi0gIHsgInY5LTY0IiwgInY5IiwgdjksIDY0LCAwIH0sCi0gIHsgTlVMTCwgTlVMTCwgdjgsIDAsIDAgfQotfTsKLQotLyogVmFyaWFudCBvZiBkZWZhdWx0X2FyY2ggKi8KLXN0YXRpYyBlbnVtIHNwYXJjX2FyY2hfdHlwZXMgZGVmYXVsdF9hcmNoX3R5cGU7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BhcmNfYXJjaCAqCi1sb29rdXBfYXJjaCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHNwYXJjX2FyY2ggKnNhOwotCi0gIGZvciAoc2EgPSAmc3BhcmNfYXJjaF90YWJsZVswXTsgc2EtPm5hbWUgIT0gTlVMTDsgc2ErKykKLSAgICBpZiAoc3RyY21wIChzYS0+bmFtZSwgbmFtZSkgPT0gMCkKLSAgICAgIGJyZWFrOwotICBpZiAoc2EtPm5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIHNhOwotfQotCi0vKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IG9wY29kZSBhcmNoIGFuZCB3b3JkIHNpemUgZnJvbSB0aGUgZGVmYXVsdAotICAgYXJjaGl0ZWN0dXJlIG5hbWUuICAqLwotCi1zdGF0aWMgdm9pZAotaW5pdF9kZWZhdWx0X2FyY2ggKCkKLXsKLSAgc3RydWN0IHNwYXJjX2FyY2ggKnNhID0gbG9va3VwX2FyY2ggKGRlZmF1bHRfYXJjaCk7Ci0KLSAgaWYgKHNhID09IE5VTEwKLSAgICAgIHx8IHNhLT5kZWZhdWx0X2FyY2hfc2l6ZSA9PSAwKQotICAgIGFzX2ZhdGFsIChfKCJJbnZhbGlkIGRlZmF1bHQgYXJjaGl0ZWN0dXJlLCBicm9rZW4gYXNzZW1ibGVyLiIpKTsKLQotICBtYXhfYXJjaGl0ZWN0dXJlID0gc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoIChzYS0+b3Bjb2RlX2FyY2gpOwotICBpZiAobWF4X2FyY2hpdGVjdHVyZSA9PSBTUEFSQ19PUENPREVfQVJDSF9CQUQpCi0gICAgYXNfZmF0YWwgKF8oIkJhZCBvcGNvZGUgdGFibGUsIGJyb2tlbiBhc3NlbWJsZXIuIikpOwotICBkZWZhdWx0X2FyY2hfc2l6ZSA9IHNwYXJjX2FyY2hfc2l6ZSA9IHNhLT5kZWZhdWx0X2FyY2hfc2l6ZTsKLSAgZGVmYXVsdF9pbml0X3AgPSAxOwotICBkZWZhdWx0X2FyY2hfdHlwZSA9IHNhLT5hcmNoX3R5cGU7Ci19Ci0KLS8qIENhbGxlZCBieSBUQVJHRVRfRk9STUFULiAgKi8KLQotY29uc3QgY2hhciAqCi1zcGFyY190YXJnZXRfZm9ybWF0ICgpCi17Ci0gIC8qIFdlIGRvbid0IGdldCBhIGNoYW5jZSB0byBpbml0aWFsaXplIGFueXRoaW5nIGJlZm9yZSB3ZSdyZSBjYWxsZWQsCi0gICAgIHNvIGhhbmRsZSB0aGF0IG5vdy4gICovCi0gIGlmICghIGRlZmF1bHRfaW5pdF9wKQotICAgIGluaXRfZGVmYXVsdF9hcmNoICgpOwotCi0jaWZkZWYgT0JKX0FPVVQKLSNpZmRlZiBURV9OZXRCU0QKLSAgcmV0dXJuICJhLm91dC1zcGFyYy1uZXRic2QiOwotI2Vsc2UKLSNpZmRlZiBURV9TUEFSQ0FPVVQKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIHJldHVybiAiYS5vdXQtc3Vub3MtYmlnIjsKLSAgZWxzZSBpZiAoZGVmYXVsdF9hcmNoX3R5cGUgPT0gc3BhcmM4NnggJiYgdGFyZ2V0X2xpdHRsZV9lbmRpYW5fZGF0YSkKLSAgICByZXR1cm4gImEub3V0LXN1bm9zLWJpZyI7Ci0gIGVsc2UgcmV0dXJuICJhLm91dC1zcGFyYy1saXR0bGUiOwotI2Vsc2UKLSAgcmV0dXJuICJhLm91dC1zdW5vcy1iaWciOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0JPVVQKLSAgcmV0dXJuICJiLm91dC5iaWciOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfQ09GRgotI2lmZGVmIFRFX0xZTlgKLSAgcmV0dXJuICJjb2ZmLXNwYXJjLWx5bngiOwotI2Vsc2UKLSAgcmV0dXJuICJjb2ZmLXNwYXJjIjsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0gIHJldHVybiBzcGFyY19hcmNoX3NpemUgPT0gNjQgPyAiZWxmNjQtc3BhcmMiIDogImVsZjMyLXNwYXJjIjsKLSNlbmRpZgotCi0gIGFib3J0ICgpOwotfQotDAotLyoKLSAqIG1kX3BhcnNlX29wdGlvbgotICoJSW52b2NhdGlvbiBsaW5lIGluY2x1ZGVzIGEgc3dpdGNoIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBiYXNlIGFzc2VtYmxlci4KLSAqCVNlZSBpZiBpdCdzIGEgcHJvY2Vzc29yLXNwZWNpZmljIG9wdGlvbi4gIFRoZXNlIGFyZToKLSAqCi0gKgktYnVtcAotICoJCVdhcm4gb24gYXJjaGl0ZWN0dXJlIGJ1bXBzLiAgU2VlIGFsc28gLUEuCi0gKgotICoJLUF2NiwgLUF2NywgLUF2OCwgLUFzcGFyY2xpdGUsIC1Bc3BhcmNsZXQKLSAqCQlTdGFuZGFyZCAzMiBiaXQgYXJjaGl0ZWN0dXJlcy4KLSAqCS1BdjhwbHVzLCAtQXY4cGx1c2EKLSAqCQlTcGFyYzY0IGluIGEgMzIgYml0IHdvcmxkLgotICoJLUF2OSwgLUF2OWEKLSAqCQlTcGFyYzY0IGluIGVpdGhlciBhIDMyIG9yIDY0IGJpdCB3b3JsZCAoLTMyLy02NCBzYXlzIHdoaWNoKS4KLSAqCQlUaGlzIHVzZWQgdG8gb25seSBtZWFuIDY0IGJpdHMsIGJ1dCBwcm9wZXJseSBzcGVjaWZ5aW5nIGl0Ci0gKgkJY29tcGxpY2F0ZWQgZ2NjJ3MgQVNNX1NQRUNzLCBzbyBub3cgb3Bjb2RlIHNlbGVjdGlvbiBpcwotICoJCXNwZWNpZmllZCBvcnRob2dvbmFsbHkgdG8gd29yZCBzaXplIChleGNlcHQgd2hlbiBzcGVjaWZ5aW5nCi0gKgkJdGhlIGRlZmF1bHQsIGJ1dCB0aGF0IGlzIGFuIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbCkuCi0gKgkteGFyY2g9djhwbHVzLCAteGFyY2g9djhwbHVzYQotICoJCVNhbWUgYXMgLUF2OHBsdXN7LGF9LCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFN1bidzIGFzc2VtYmxlci4KLSAqCi0gKgkJU2VsZWN0IHRoZSBhcmNoaXRlY3R1cmUgYW5kIHBvc3NpYmx5IHRoZSBmaWxlIGZvcm1hdC4KLSAqCQlJbnN0cnVjdGlvbnMgb3IgZmVhdHVyZXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQKLSAqCQlhcmNoaXRlY3R1cmUgY2F1c2UgZmF0YWwgZXJyb3JzLgotICoKLSAqCQlUaGUgZGVmYXVsdCBpcyB0byBzdGFydCBhdCB2NiwgYW5kIGJ1bXAgdGhlIGFyY2hpdGVjdHVyZSB1cAotICoJCXdoZW5ldmVyIGFuIGluc3RydWN0aW9uIGlzIHNlZW4gYXQgYSBoaWdoZXIgbGV2ZWwuICBJbiAzMiBiaXQKLSAqCQllbnZpcm9ubWVudHMsIHY5IGlzIG5vdCBidW1wZWQgdXAgdG8sIHRoZSB1c2VyIG11c3QgcGFzcwotICogCQktQXY4cGx1c3ssYX0uCi0gKgotICoJCUlmIC1idW1wIGlzIHNwZWNpZmllZCwgYSB3YXJuaW5nIGlzIHByaW50aW5nIHdoZW4gYnVtcGluZyB0bwotICoJCWhpZ2hlciBsZXZlbHMuCi0gKgotICoJCUlmIGFuIGFyY2hpdGVjdHVyZSBpcyBzcGVjaWZpZWQsIGFsbCBpbnN0cnVjdGlvbnMgbXVzdCBtYXRjaAotICoJCXRoYXQgYXJjaGl0ZWN0dXJlLiAgQW55IGhpZ2hlciBsZXZlbCBpbnN0cnVjdGlvbnMgYXJlIGZsYWdnZWQKLSAqCQlhcyBlcnJvcnMuICBOb3RlIHRoYXQgaW4gdGhlIDMyIGJpdCBlbnZpcm9ubWVudCBzcGVjaWZ5aW5nCi0gKgkJLUF2OHBsdXMgZG9lcyBub3QgYXV0b21hdGljYWxseSBjcmVhdGUgYSB2OHBsdXMgb2JqZWN0IGZpbGUsIGEKLSAqCQl2OSBpbnNuIG11c3QgYmUgc2Vlbi4KLSAqCi0gKgkJSWYgYm90aCBhbiBhcmNoaXRlY3R1cmUgYW5kIC1idW1wIGFyZSBzcGVjaWZpZWQsIHRoZQotICoJCWFyY2hpdGVjdHVyZSBzdGFydHMgYXQgdGhlIHNwZWNpZmllZCBsZXZlbCwgYnV0IGJ1bXBzIGFyZQotICoJCXdhcm5pbmdzLiAgTm90ZSB0aGF0IHdlIGNhbid0IHNldCBgY3VycmVudF9hcmNoaXRlY3R1cmUnIHRvCi0gKgkJdGhlIHJlcXVlc3RlZCBsZXZlbCBpbiB0aGlzIGNhc2U6IGluIHRoZSAzMiBiaXQgZW52aXJvbm1lbnQsCi0gKgkJd2Ugc3RpbGwgbXVzdCBhdm9pZCBjcmVhdGluZyB2OHBsdXMgb2JqZWN0IGZpbGVzIHVubGVzcyB2OQotICogCQlpbnNucyBhcmUgc2Vlbi4KLSAqCi0gKiBOb3RlOgotICoJCUJ1bXBpbmcgYmV0d2VlbiBpbmNvbXBhdGlibGUgYXJjaGl0ZWN0dXJlcyBpcyBhbHdheXMgYW4KLSAqCQllcnJvci4gIEZvciBleGFtcGxlLCBmcm9tIHNwYXJjbGl0ZSB0byB2OS4KLSAqLwotCi0jaWZkZWYgT0JKX0VMRgotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIkE6SzpWUTpzcSI7Ci0jZWxzZQotI2lmZGVmIE9CSl9BT1VUCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiQTprIjsKLSNlbHNlCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiQToiOwotI2VuZGlmCi0jZW5kaWYKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSNkZWZpbmUgT1BUSU9OX0JVTVAgKE9QVElPTl9NRF9CQVNFKQotICB7ImJ1bXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JVTVB9LAotI2RlZmluZSBPUFRJT05fU1BBUkMgKE9QVElPTl9NRF9CQVNFICsgMSkKLSAgeyJzcGFyYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1BBUkN9LAotI2RlZmluZSBPUFRJT05fWEFSQ0ggKE9QVElPTl9NRF9CQVNFICsgMikKLSAgeyJ4YXJjaCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fWEFSQ0h9LAotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgT1BUSU9OXzMyIChPUFRJT05fTURfQkFTRSArIDMpCi0gIHsiMzIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OXzMyfSwKLSNkZWZpbmUgT1BUSU9OXzY0IChPUFRJT05fTURfQkFTRSArIDQpCi0gIHsiNjQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OXzY0fSwKLSNkZWZpbmUgT1BUSU9OX1RTTyAoT1BUSU9OX01EX0JBU0UgKyA1KQotICB7IlRTTyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFNPfSwKLSNkZWZpbmUgT1BUSU9OX1BTTyAoT1BUSU9OX01EX0JBU0UgKyA2KQotICB7IlBTTyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUFNPfSwKLSNkZWZpbmUgT1BUSU9OX1JNTyAoT1BUSU9OX01EX0JBU0UgKyA3KQotICB7IlJNTyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUk1PfSwKLSNlbmRpZgotI2lmZGVmIFNQQVJDX0JJRU5ESUFOCi0jZGVmaW5lIE9QVElPTl9MSVRUTEVfRU5ESUFOIChPUFRJT05fTURfQkFTRSArIDgpCi0gIHsiRUwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJVFRMRV9FTkRJQU59LAotI2RlZmluZSBPUFRJT05fQklHX0VORElBTiAoT1BUSU9OX01EX0JBU0UgKyA5KQotICB7IkVCIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CSUdfRU5ESUFOfSwKLSNlbmRpZgotI2RlZmluZSBPUFRJT05fRU5GT1JDRV9BTElHTkVEX0RBVEEgKE9QVElPTl9NRF9CQVNFICsgMTApCi0gIHsiZW5mb3JjZS1hbGlnbmVkLWRhdGEiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VORk9SQ0VfQUxJR05FRF9EQVRBfSwKLSNkZWZpbmUgT1BUSU9OX0xJVFRMRV9FTkRJQU5fREFUQSAoT1BUSU9OX01EX0JBU0UgKyAxMSkKLSAgeyJsaXR0bGUtZW5kaWFuLWRhdGEiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJVFRMRV9FTkRJQU5fREFUQX0sCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIC8qIFdlIGRvbid0IGdldCBhIGNoYW5jZSB0byBpbml0aWFsaXplIGFueXRoaW5nIGJlZm9yZSB3ZSdyZSBjYWxsZWQsCi0gICAgIHNvIGhhbmRsZSB0aGF0IG5vdy4gICovCi0gIGlmICghIGRlZmF1bHRfaW5pdF9wKQotICAgIGluaXRfZGVmYXVsdF9hcmNoICgpOwotCi0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSBPUFRJT05fQlVNUDoKLSAgICAgIHdhcm5fb25fYnVtcCA9IDE7Ci0gICAgICB3YXJuX2FmdGVyX2FyY2hpdGVjdHVyZSA9IFNQQVJDX09QQ09ERV9BUkNIX1Y2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9YQVJDSDoKLSAgICAgIC8qIFRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTdW4ncyBhc3NlbWJsZXIuICAqLwotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAidjhwbHVzIikgIT0gMAotCSAgJiYgc3RyY21wIChhcmcsICJ2OHBsdXNhIikgIT0gMCkKLQl7Ci0JICBhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlIC14YXJjaD0lcyIpLCBhcmcpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotICAgIGNhc2UgJ0EnOgotICAgICAgewotCXN0cnVjdCBzcGFyY19hcmNoICpzYTsKLQllbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCBvcGNvZGVfYXJjaDsKLQotCXNhID0gbG9va3VwX2FyY2ggKGFyZyk7Ci0JaWYgKHNhID09IE5VTEwKLQkgICAgfHwgISBzYS0+dXNlcl9vcHRpb25fcCkKLQkgIHsKLQkgICAgYXNfYmFkIChfKCJpbnZhbGlkIGFyY2hpdGVjdHVyZSAtQSVzIiksIGFyZyk7Ci0JICAgIHJldHVybiAwOwotCSAgfQotCi0Jb3Bjb2RlX2FyY2ggPSBzcGFyY19vcGNvZGVfbG9va3VwX2FyY2ggKHNhLT5vcGNvZGVfYXJjaCk7Ci0JaWYgKG9wY29kZV9hcmNoID09IFNQQVJDX09QQ09ERV9BUkNIX0JBRCkKLQkgIGFzX2ZhdGFsIChfKCJCYWQgb3Bjb2RlIHRhYmxlLCBicm9rZW4gYXNzZW1ibGVyLiIpKTsKLQotCW1heF9hcmNoaXRlY3R1cmUgPSBvcGNvZGVfYXJjaDsKLQlhcmNoaXRlY3R1cmVfcmVxdWVzdGVkID0gMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fU1BBUkM6Ci0gICAgICAvKiBJZ25vcmUgLXNwYXJjLCB1c2VkIGJ5IFN1bk9TIG1ha2UgZGVmYXVsdCAucy5vIHJ1bGUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9FTkZPUkNFX0FMSUdORURfREFUQToKLSAgICAgIGVuZm9yY2VfYWxpZ25lZF9kYXRhID0gMTsKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgU1BBUkNfQklFTkRJQU4KLSAgICBjYXNlIE9QVElPTl9MSVRUTEVfRU5ESUFOOgotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotICAgICAgaWYgKGRlZmF1bHRfYXJjaF90eXBlICE9IHNwYXJjbGV0KQotCWFzX2ZhdGFsICgiVGhpcyB0YXJnZXQgZG9lcyBub3Qgc3VwcG9ydCAtRUwiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0xJVFRMRV9FTkRJQU5fREFUQToKLSAgICAgIHRhcmdldF9saXR0bGVfZW5kaWFuX2RhdGEgPSAxOwotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotICAgICAgaWYgKGRlZmF1bHRfYXJjaF90eXBlICE9IHNwYXJjODZ4Ci0JICAmJiBkZWZhdWx0X2FyY2hfdHlwZSAhPSB2OSkKLQlhc19mYXRhbCAoIlRoaXMgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgLS1saXR0bGUtZW5kaWFuLWRhdGEiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0JJR19FTkRJQU46Ci0gICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IDE7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0FPVVQKLSAgICBjYXNlICdrJzoKLSAgICAgIHNwYXJjX3BpY19jb2RlID0gMTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0gICAgY2FzZSBPUFRJT05fMzI6Ci0gICAgY2FzZSBPUFRJT05fNjQ6Ci0gICAgICB7Ci0JY29uc3QgY2hhciAqKmxpc3QsICoqbDsKLQotCXNwYXJjX2FyY2hfc2l6ZSA9IGMgPT0gT1BUSU9OXzMyID8gMzIgOiA2NDsKLQlsaXN0ID0gYmZkX3RhcmdldF9saXN0ICgpOwotCWZvciAobCA9IGxpc3Q7ICpsICE9IE5VTEw7IGwrKykKLQkgIHsKLQkgICAgaWYgKHNwYXJjX2FyY2hfc2l6ZSA9PSAzMikKLQkgICAgICB7Ci0JCWlmIChzdHJjbXAgKCpsLCAiZWxmMzItc3BhcmMiKSA9PSAwKQotCQkgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaWYgKHN0cmNtcCAoKmwsICJlbGY2NC1zcGFyYyIpID09IDApCi0JCSAgYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCWlmICgqbCA9PSBOVUxMKQotCSAgYXNfZmF0YWwgKF8oIk5vIGNvbXBpbGVkIGluIHN1cHBvcnQgZm9yICVkIGJpdCBvYmplY3QgZmlsZSBmb3JtYXQiKSwKLQkJICAgIHNwYXJjX2FyY2hfc2l6ZSk7Ci0JZnJlZSAobGlzdCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1RTTzoKLSAgICAgIHNwYXJjX21lbW9yeV9tb2RlbCA9IE1NX1RTTzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fUFNPOgotICAgICAgc3BhcmNfbWVtb3J5X21vZGVsID0gTU1fUFNPOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9STU86Ci0gICAgICBzcGFyY19tZW1vcnlfbW9kZWwgPSBNTV9STU87Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1YnOgotICAgICAgcHJpbnRfdmVyc2lvbl9pZCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUSc6Ci0gICAgICAvKiBReSAtIGRvIGVtaXQgLmNvbW1lbnQKLQkgUW4gLSBkbyBub3QgZW1pdCAuY29tbWVudCAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzoKLSAgICAgIC8qIHVzZSAuc3RhYiBpbnN0ZWFkIG9mIC5zdGFiLmV4Y2wgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncSc6Ci0gICAgICAvKiBxdWljayAtLSBuYXRpdmUgYXNzZW1ibGVyIGRvZXMgZmV3ZXIgY2hlY2tzICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0snOgotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiUElDIikgIT0gMCkKLQlhc193YXJuIChfKCJVbnJlY29nbml6ZWQgb3B0aW9uIGZvbGxvd2luZyAtSyIpKTsKLSAgICAgIGVsc2UKLQlzcGFyY19waWNfY29kZSA9IDE7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGNvbnN0IHN0cnVjdCBzcGFyY19hcmNoICphcmNoOwotCi0gIC8qIFdlIGRvbid0IGdldCBhIGNoYW5jZSB0byBpbml0aWFsaXplIGFueXRoaW5nIGJlZm9yZSB3ZSdyZSBjYWxsZWQsCi0gICAgIHNvIGhhbmRsZSB0aGF0IG5vdy4gICovCi0gIGlmICghIGRlZmF1bHRfaW5pdF9wKQotICAgIGluaXRfZGVmYXVsdF9hcmNoICgpOwotCi0gIGZwcmludGYoc3RyZWFtLCBfKCJTUEFSQyBvcHRpb25zOlxuIikpOwotICBmb3IgKGFyY2ggPSAmc3BhcmNfYXJjaF90YWJsZVswXTsgYXJjaC0+bmFtZTsgYXJjaCsrKQotICAgIHsKLSAgICAgIGlmIChhcmNoICE9ICZzcGFyY19hcmNoX3RhYmxlWzBdKQotCWZwcmludGYgKHN0cmVhbSwgIiB8ICIpOwotICAgICAgaWYgKGFyY2gtPnVzZXJfb3B0aW9uX3ApCi0JZnByaW50ZiAoc3RyZWFtLCAiLUElcyIsIGFyY2gtPm5hbWUpOwotICAgIH0KLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcbi14YXJjaD12OHBsdXMgfCAteGFyY2g9djhwbHVzYVxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLQkJCXNwZWNpZnkgdmFyaWFudCBvZiBTUEFSQyBhcmNoaXRlY3R1cmVcblwKLS1idW1wCQkJd2FybiB3aGVuIGFzc2VtYmxlciBzd2l0Y2hlcyBhcmNoaXRlY3R1cmVzXG5cCi0tc3BhcmMJCQlpZ25vcmVkXG5cCi0tLWVuZm9yY2UtYWxpZ25lZC1kYXRhCWZvcmNlIC5sb25nLCBldGMuLCB0byBiZSBhbGlnbmVkIGNvcnJlY3RseVxuIikpOwotI2lmZGVmIE9CSl9BT1VUCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotLWsJCQlnZW5lcmF0ZSBQSUNcbiIpKTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0tMzIJCQljcmVhdGUgMzIgYml0IG9iamVjdCBmaWxlXG5cCi0tNjQJCQljcmVhdGUgNjQgYml0IG9iamVjdCBmaWxlXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotCQkJW2RlZmF1bHQgaXMgJWRdXG4iKSwgZGVmYXVsdF9hcmNoX3NpemUpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLS1UU08JCQl1c2UgVG90YWwgU3RvcmUgT3JkZXJpbmdcblwKLS1QU08JCQl1c2UgUGFydGlhbCBTdG9yZSBPcmRlcmluZ1xuXAotLVJNTwkJCXVzZSBSZWxheGVkIE1lbW9yeSBPcmRlcmluZ1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLQkJCVtkZWZhdWx0IGlzICVzXVxuIiksIChkZWZhdWx0X2FyY2hfc2l6ZSA9PSA2NCkgPyAiUk1PIiA6ICJUU08iKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0tS1BJQwkJCWdlbmVyYXRlIFBJQ1xuXAotLVYJCQlwcmludCBhc3NlbWJsZXIgdmVyc2lvbiBudW1iZXJcblwKLS1xCQkJaWdub3JlZFxuXAotLVF5LCAtUW4JCWlnbm9yZWRcblwKLS1zCQkJaWdub3JlZFxuIikpOwotI2VuZGlmCi0jaWZkZWYgU1BBUkNfQklFTkRJQU4KLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0tRUwJCQlnZW5lcmF0ZSBjb2RlIGZvciBhIGxpdHRsZSBlbmRpYW4gbWFjaGluZVxuXAotLUVCCQkJZ2VuZXJhdGUgY29kZSBmb3IgYSBiaWcgZW5kaWFuIG1hY2hpbmVcblwKLS0tbGl0dGxlLWVuZGlhbi1kYXRhCWdlbmVyYXRlIGNvZGUgZm9yIGEgbWFjaGluZSBoYXZpbmcgYmlnIGVuZGlhblxuXAotICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zIGFuZCBsaXR0bGUgZW5kaWFuIGRhdGEuIikpOwotI2VuZGlmCi19Ci0MCi0vKiBzcGFyYzY0IHByaXZpbGVkZ2VkIHJlZ2lzdGVycyAqLwotCi1zdHJ1Y3QgcHJpdl9yZWdfZW50cnkKLSAgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgaW50IHJlZ251bTsKLSAgfTsKLQotc3RydWN0IHByaXZfcmVnX2VudHJ5IHByaXZfcmVnX3RhYmxlW10gPQotewotICB7InRwYyIsIDB9LAotICB7InRucGMiLCAxfSwKLSAgeyJ0c3RhdGUiLCAyfSwKLSAgeyJ0dCIsIDN9LAotICB7InRpY2siLCA0fSwKLSAgeyJ0YmEiLCA1fSwKLSAgeyJwc3RhdGUiLCA2fSwKLSAgeyJ0bCIsIDd9LAotICB7InBpbCIsIDh9LAotICB7ImN3cCIsIDl9LAotICB7ImNhbnNhdmUiLCAxMH0sCi0gIHsiY2FucmVzdG9yZSIsIDExfSwKLSAgeyJjbGVhbndpbiIsIDEyfSwKLSAgeyJvdGhlcndpbiIsIDEzfSwKLSAgeyJ3c3RhdGUiLCAxNH0sCi0gIHsiZnEiLCAxNX0sCi0gIHsidmVyIiwgMzF9LAotICB7IiIsIC0xfSwJCQkvKiBlbmQgbWFya2VyICovCi19OwotCi0vKiB2OWEgc3BlY2lmaWMgYXNycyAqLwotCi1zdHJ1Y3QgcHJpdl9yZWdfZW50cnkgdjlhX2Fzcl90YWJsZVtdID0KLXsKLSAgeyJ0aWNrX2NtcHIiLCAyM30sCi0gIHsic29mdGludCIsIDIyfSwKLSAgeyJzZXRfc29mdGludCIsIDIwfSwKLSAgeyJwaWMiLCAxN30sCi0gIHsicGNyIiwgMTZ9LAotICB7ImdzciIsIDE5fSwKLSAgeyJkY3IiLCAxOH0sCi0gIHsiY2xlYXJfc29mdGludCIsIDIxfSwKLSAgeyIiLCAtMX0sCQkJLyogZW5kIG1hcmtlciAqLwotfTsKLQotc3RhdGljIGludAotY21wX3JlZ19lbnRyeSAocGFyZywgcWFyZykKLSAgICAgY29uc3QgUFRSIHBhcmc7Ci0gICAgIGNvbnN0IFBUUiBxYXJnOwotewotICBjb25zdCBzdHJ1Y3QgcHJpdl9yZWdfZW50cnkgKnAgPSAoY29uc3Qgc3RydWN0IHByaXZfcmVnX2VudHJ5ICopIHBhcmc7Ci0gIGNvbnN0IHN0cnVjdCBwcml2X3JlZ19lbnRyeSAqcSA9IChjb25zdCBzdHJ1Y3QgcHJpdl9yZWdfZW50cnkgKikgcWFyZzsKLQotICByZXR1cm4gc3RyY21wIChxLT5uYW1lLCBwLT5uYW1lKTsKLX0KLQwKLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBJdCBzaG91bGQKLSAgIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjLiB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgd2lsbCBuZWVkLiAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICByZWdpc3RlciBjb25zdCBjaGFyICpyZXR2YWwgPSBOVUxMOwotICBpbnQgbG9zZSA9IDA7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpID0gMDsKLQotICAvKiBXZSBkb24ndCBnZXQgYSBjaGFuY2UgdG8gaW5pdGlhbGl6ZSBhbnl0aGluZyBiZWZvcmUgbWRfcGFyc2Vfb3B0aW9uCi0gICAgIGlzIGNhbGxlZCwgYW5kIGl0IG1heSBub3QgYmUgY2FsbGVkLCBzbyBoYW5kbGUgZGVmYXVsdCBpbml0aWFsaXphdGlvbgotICAgICBub3cgaWYgbm90IGFscmVhZHkgZG9uZS4gICovCi0gIGlmICghIGRlZmF1bHRfaW5pdF9wKQotICAgIGluaXRfZGVmYXVsdF9hcmNoICgpOwotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICB3aGlsZSAoaSA8ICh1bnNpZ25lZCBpbnQpIHNwYXJjX251bV9vcGNvZGVzKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBzcGFyY19vcGNvZGVzW2ldLm5hbWU7Ci0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgbmFtZSwgKFBUUikgJnNwYXJjX29wY29kZXNbaV0pOwotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIpLAotCQkgICBzcGFyY19vcGNvZGVzW2ldLm5hbWUsIHJldHZhbCk7Ci0JICBsb3NlID0gMTsKLQl9Ci0gICAgICBkbwotCXsKLQkgIGlmIChzcGFyY19vcGNvZGVzW2ldLm1hdGNoICYgc3BhcmNfb3Bjb2Rlc1tpXS5sb3NlKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJpbnRlcm5hbCBlcnJvcjogbG9zaW5nIG9wY29kZTogYCVzJyBcIiVzXCJcbiIpLAotCQkgICAgICAgc3BhcmNfb3Bjb2Rlc1tpXS5uYW1lLCBzcGFyY19vcGNvZGVzW2ldLmFyZ3MpOwotCSAgICAgIGxvc2UgPSAxOwotCSAgICB9Ci0JICArK2k7Ci0JfQotICAgICAgd2hpbGUgKGkgPCAodW5zaWduZWQgaW50KSBzcGFyY19udW1fb3Bjb2RlcwotCSAgICAgJiYgIXN0cmNtcCAoc3BhcmNfb3Bjb2Rlc1tpXS5uYW1lLCBuYW1lKSk7Ci0gICAgfQotCi0gIGlmIChsb3NlKQotICAgIGFzX2ZhdGFsIChfKCJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIpKTsKLQotICBmb3IgKGkgPSAnMCc7IGkgPCAnOCc7ICsraSkKLSAgICBvY3RhbFtpXSA9IDE7Ci0gIGZvciAoaSA9ICcwJzsgaSA8PSAnOSc7ICsraSkKLSAgICB0b0hleFtpXSA9IGkgLSAnMCc7Ci0gIGZvciAoaSA9ICdhJzsgaSA8PSAnZic7ICsraSkKLSAgICB0b0hleFtpXSA9IGkgKyAxMCAtICdhJzsKLSAgZm9yIChpID0gJ0EnOyBpIDw9ICdGJzsgKytpKQotICAgIHRvSGV4W2ldID0gaSArIDEwIC0gJ0EnOwotCi0gIHFzb3J0IChwcml2X3JlZ190YWJsZSwgc2l6ZW9mIChwcml2X3JlZ190YWJsZSkgLyBzaXplb2YgKHByaXZfcmVnX3RhYmxlWzBdKSwKLQkgc2l6ZW9mIChwcml2X3JlZ190YWJsZVswXSksIGNtcF9yZWdfZW50cnkpOwotCi0gIC8qIElmIC1idW1wLCByZWNvcmQgdGhlIGFyY2hpdGVjdHVyZSBsZXZlbCBhdCB3aGljaCB3ZSBzdGFydCBpc3N1aW5nCi0gICAgIHdhcm5pbmdzLiAgVGhlIGJlaGF2aW91ciBpcyBkaWZmZXJlbnQgZGVwZW5kaW5nIHVwb24gd2hldGhlciBhbgotICAgICBhcmNoaXRlY3R1cmUgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLiAgSWYgaXQgd2Fzbid0LCB3ZSBpc3N1ZSB3YXJuaW5ncwotICAgICBmb3IgYWxsIHVwd2FyZHMgYnVtcHMuICBJZiBpdCB3YXMsIHdlIGRvbid0IHN0YXJ0IGlzc3Vpbmcgd2FybmluZ3MgdW50aWwKLSAgICAgd2UgbmVlZCB0byBidW1wIGJleW9uZCB0aGUgcmVxdWVzdGVkIGFyY2hpdGVjdHVyZSBvciB3aGVuIHdlIGJ1bXAgYmV0d2VlbgotICAgICBjb25mbGljdGluZyBhcmNoaXRlY3R1cmVzLiAgKi8KLQotICBpZiAod2Fybl9vbl9idW1wCi0gICAgICAmJiBhcmNoaXRlY3R1cmVfcmVxdWVzdGVkKQotICAgIHsKLSAgICAgIC8qIGBtYXhfYXJjaGl0ZWN0dXJlJyByZWNvcmRzIHRoZSByZXF1ZXN0ZWQgYXJjaGl0ZWN0dXJlLgotCSBJc3N1ZSB3YXJuaW5ncyBpZiB3ZSBnbyBhYm92ZSBpdC4gICovCi0gICAgICB3YXJuX2FmdGVyX2FyY2hpdGVjdHVyZSA9IG1heF9hcmNoaXRlY3R1cmU7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIGhpZ2hlc3QgYXJjaGl0ZWN0dXJlIGxldmVsIHRoYXQgZG9lc24ndCBjb25mbGljdCB3aXRoCi0JIHRoZSByZXF1ZXN0ZWQgb25lLiAgKi8KLSAgICAgIGZvciAobWF4X2FyY2hpdGVjdHVyZSA9IFNQQVJDX09QQ09ERV9BUkNIX01BWDsKLQkgICBtYXhfYXJjaGl0ZWN0dXJlID4gd2Fybl9hZnRlcl9hcmNoaXRlY3R1cmU7Ci0JICAgLS1tYXhfYXJjaGl0ZWN0dXJlKQotCWlmICghIFNQQVJDX09QQ09ERV9DT05GTElDVF9QIChtYXhfYXJjaGl0ZWN0dXJlLAotCQkJCSAgICAgICB3YXJuX2FmdGVyX2FyY2hpdGVjdHVyZSkpCi0JICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIENhbGxlZCBhZnRlciBhbGwgYXNzZW1ibHkgaGFzIGJlZW4gZG9uZS4gICovCi0KLXZvaWQKLXNwYXJjX21kX2VuZCAoKQotewotICBpZiAoc3BhcmNfYXJjaF9zaXplID09IDY0KQotICAgIHsKLSAgICAgIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSA9PSBTUEFSQ19PUENPREVfQVJDSF9WOUEpCi0JYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfc3BhcmMsIGJmZF9tYWNoX3NwYXJjX3Y5YSk7Ci0gICAgICBlbHNlCi0JYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfc3BhcmMsIGJmZF9tYWNoX3NwYXJjX3Y5KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgPT0gU1BBUkNfT1BDT0RFX0FSQ0hfVjkpCi0JYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfc3BhcmMsIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyk7Ci0gICAgICBlbHNlIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSA9PSBTUEFSQ19PUENPREVfQVJDSF9WOUEpCi0JYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfc3BhcmMsIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EpOwotICAgICAgZWxzZSBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgPT0gU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMRVQpCi0JYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfc3BhcmMsIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0KTsKLSAgICAgIGVsc2UgaWYgKGRlZmF1bHRfYXJjaF90eXBlID09IHNwYXJjODZ4ICYmIHRhcmdldF9saXR0bGVfZW5kaWFuX2RhdGEpCi0JYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfc3BhcmMsIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZSk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhlIHNwYXJjbGl0ZSBpcyB0cmVhdGVkIGxpa2UgYSBub3JtYWwgc3BhcmMuICBQZXJoYXBzIGl0IHNob3VsZG4ndAotCSAgICAgYmUgYnV0IGZvciBub3cgaXQgaXMgKHNpbmNlIHRoYXQncyB0aGUgd2F5IGl0J3MgYWx3YXlzIGJlZW4KLQkgICAgIHRyZWF0ZWQpLiAgKi8KLQkgIGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyYyk7Ci0JfQotICAgIH0KLX0KLQwKLS8qIFJldHVybiBub24temVybyBpZiBWQUwgaXMgaW4gdGhlIHJhbmdlIC0oTUFYKzEpIHRvIE1BWC4gICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1pbl9zaWduZWRfcmFuZ2UgKHZhbCwgbWF4KQotICAgICBiZmRfc2lnbmVkX3ZtYSB2YWwsIG1heDsKLXsKLSAgaWYgKG1heCA8PSAwKQotICAgIGFib3J0ICgpOwotICAvKiBTaWduLWV4dGVuZCB0aGUgdmFsdWUgZnJvbSB0aGUgYXJjaGl0ZWN0dXJlIHdvcmQgc2l6ZSwgc28gdGhhdAotICAgICAweGZmZmZmZmZmIGlzIGFsd2F5cyBjb25zaWRlcmVkIC0xIG9uIHNwYXJjMzIuICAqLwotICBpZiAoc3BhcmNfYXJjaF9zaXplID09IDMyKQotICAgIHsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHNpZ24gPSAoYmZkX3NpZ25lZF92bWEpMSA8PCAzMTsKLSAgICAgIHZhbCA9ICgodmFsICYgMHhmZmZmZmZmZikgXiBzaWduKSAtIHNpZ247Ci0gICAgfQotICBpZiAodmFsID4gbWF4KQotICAgIHJldHVybiAwOwotICBpZiAodmFsIDwgfm1heCkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFJldHVybiBub24temVybyBpZiBWQUwgaXMgaW4gdGhlIHJhbmdlIDAgdG8gTUFYLiAgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWluX3Vuc2lnbmVkX3JhbmdlICh2YWwsIG1heCkKLSAgICAgYmZkX3ZtYSB2YWwsIG1heDsKLXsKLSAgaWYgKHZhbCA+IG1heCkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFJldHVybiBub24temVybyBpZiBWQUwgaXMgaW4gdGhlIHJhbmdlIC0oTUFYLzIrMSkgdG8gTUFYLgotICAgKGUuZy4gLTE1IHRvICszMSkuICAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotaW5fYml0ZmllbGRfcmFuZ2UgKHZhbCwgbWF4KQotICAgICBiZmRfc2lnbmVkX3ZtYSB2YWwsIG1heDsKLXsKLSAgaWYgKG1heCA8PSAwKQotICAgIGFib3J0ICgpOwotICBpZiAodmFsID4gbWF4KQotICAgIHJldHVybiAwOwotICBpZiAodmFsIDwgfihtYXggPj4gMSkpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1zcGFyY19mZnMgKG1hc2spCi0gICAgIHVuc2lnbmVkIGludCBtYXNrOwotewotICBpbnQgaTsKLQotICBpZiAobWFzayA9PSAwKQotICAgIHJldHVybiAtMTsKLQotICBmb3IgKGkgPSAwOyAobWFzayAmIDEpID09IDA7ICsraSkKLSAgICBtYXNrID4+PSAxOwotICByZXR1cm4gaTsKLX0KLQotLyogSW1wbGVtZW50IGJpZyBzaGlmdCByaWdodC4gICovCi1zdGF0aWMgYmZkX3ZtYQotQlNSICh2YWwsIGFtb3VudCkKLSAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgIGludCBhbW91bnQ7Ci17Ci0gIGlmIChzaXplb2YgKGJmZF92bWEpIDw9IDQgJiYgYW1vdW50ID49IDMyKQotICAgIGFzX2ZhdGFsIChfKCJTdXBwb3J0IGZvciA2NC1iaXQgYXJpdGhtZXRpYyBub3QgY29tcGlsZWQgaW4uIikpOwotICByZXR1cm4gdmFsID4+IGFtb3VudDsKLX0KLQwKLS8qIEZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gc3BhcmNfaXAgYW5kIGdldF9leHByZXNzaW9uLiAgKi8KLXN0YXRpYyBjaGFyICpleHByX2VuZDsKLQotLyogRm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBtZF9hc3NlbWJsZSBhbmQgc3BhcmNfaXAuICAqLwotc3RhdGljIGludCBzcGVjaWFsX2Nhc2U7Ci0KLS8qIFZhbHVlcyBmb3IgYHNwZWNpYWxfY2FzZScuCi0gICBJbnN0cnVjdGlvbnMgdGhhdCByZXF1aXJlIHdpZXJkIGhhbmRsaW5nIGJlY2F1c2UgdGhleSdyZSBsb25nZXIgdGhhbgotICAgNCBieXRlcy4gICovCi0jZGVmaW5lIFNQRUNJQUxfQ0FTRV9OT05FCTAKLSNkZWZpbmUJU1BFQ0lBTF9DQVNFX1NFVAkxCi0jZGVmaW5lIFNQRUNJQUxfQ0FTRV9TRVRTVwkyCi0jZGVmaW5lIFNQRUNJQUxfQ0FTRV9TRVRYCTMKLS8qIEZJWE1FOiBzcGFyYy1vcGMuYyBkb2Vzbid0IGhhdmUgbmVjZXNzYXJ5ICJTIiB0cmlnZ2VyIHRvIGVuYWJsZSB0aGlzLiAgKi8KLSNkZWZpbmUJU1BFQ0lBTF9DQVNFX0ZESVYJNAotCi0vKiBCaXQgbWFza3Mgb2YgdmFyaW91cyBpbnNucy4gICovCi0jZGVmaW5lIE5PUF9JTlNOIDB4MDEwMDAwMDAKLSNkZWZpbmUgT1JfSU5TTiAweDgwMTAwMDAwCi0jZGVmaW5lIEZNT1ZTX0lOU04gMHg4MUEwMDAyMAotI2RlZmluZSBTRVRISV9JTlNOIDB4MDEwMDAwMDAKLSNkZWZpbmUgU0xMWF9JTlNOIDB4ODEyODEwMDAKLSNkZWZpbmUgU1JBX0lOU04gMHg4MTM4MDAwMAotCi0vKiBUaGUgbGFzdCBpbnN0cnVjdGlvbiB0byBiZSBhc3NlbWJsZWQuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKmxhc3RfaW5zbjsKLS8qIFRoZSBhc3NlbWJsZWQgb3Bjb2RlIG9mIGBsYXN0X2luc24nLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3Rfb3Bjb2RlOwotDAotLyogTWFpbiBlbnRyeSBwb2ludCB0byBhc3NlbWJsZSBvbmUgaW5zdHJ1Y3Rpb24uICAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKmluc247Ci0KLSAga25vdyAoc3RyKTsKLSAgc3BlY2lhbF9jYXNlID0gU1BFQ0lBTF9DQVNFX05PTkU7Ci0gIHNwYXJjX2lwIChzdHIsICZpbnNuKTsKLQotICAvKiBXZSB3YXJuIGFib3V0IGF0dGVtcHRzIHRvIHB1dCBhIGZsb2F0aW5nIHBvaW50IGJyYW5jaCBpbiBhIGRlbGF5IHNsb3QsCi0gICAgIHVubGVzcyB0aGUgZGVsYXkgc2xvdCBoYXMgYmVlbiBhbm51bGxlZC4gICovCi0gIGlmIChpbnNuICE9IE5VTEwKLSAgICAgICYmIGxhc3RfaW5zbiAhPSBOVUxMCi0gICAgICAmJiAoaW5zbi0+ZmxhZ3MgJiBGX0ZCUikgIT0gMAotICAgICAgJiYgKGxhc3RfaW5zbi0+ZmxhZ3MgJiBGX0RFTEFZRUQpICE9IDAKLSAgICAgIC8qID8/PyBUaGlzIHRlc3QgaXNuJ3QgY29tcGxldGVseSBhY2N1cmF0ZS4gIFdlIGFzc3VtZSBhbnl0aGluZyB3aXRoCi0JIEZfe1VOQlIsQ09OREJSLEZCUn0gc2V0IGlzIGFubnVsbGFibGUuICAqLwotICAgICAgJiYgKChsYXN0X2luc24tPmZsYWdzICYgKEZfVU5CUiB8IEZfQ09OREJSIHwgRl9GQlIpKSA9PSAwCi0JICB8fCAobGFzdF9vcGNvZGUgJiBBTk5VTCkgPT0gMCkpCi0gICAgYXNfd2FybiAoXygiRlAgYnJhbmNoIGluIGRlbGF5IHNsb3QiKSk7Ci0KLSAgLyogU1BBUkMgYmVmb3JlIHY5IHJlcXVpcmVzIGEgbm9wIGluc3RydWN0aW9uIGJldHdlZW4gYSBmbG9hdGluZwotICAgICBwb2ludCBpbnN0cnVjdGlvbiBhbmQgYSBmbG9hdGluZyBwb2ludCBicmFuY2guICBXZSBpbnNlcnQgb25lCi0gICAgIGF1dG9tYXRpY2FsbHksIHdpdGggYSB3YXJuaW5nLiAgKi8KLSAgaWYgKG1heF9hcmNoaXRlY3R1cmUgPCBTUEFSQ19PUENPREVfQVJDSF9WOQotICAgICAgJiYgaW5zbiAhPSBOVUxMCi0gICAgICAmJiBsYXN0X2luc24gIT0gTlVMTAotICAgICAgJiYgKGluc24tPmZsYWdzICYgRl9GQlIpICE9IDAKLSAgICAgICYmIChsYXN0X2luc24tPmZsYWdzICYgRl9GTE9BVCkgIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3BhcmNfaXQgbm9wX2luc247Ci0KLSAgICAgIG5vcF9pbnNuLm9wY29kZSA9IE5PUF9JTlNOOwotICAgICAgbm9wX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmbm9wX2luc24pOwotICAgICAgYXNfd2FybiAoXygiRlAgYnJhbmNoIHByZWNlZGVkIGJ5IEZQIGluc3RydWN0aW9uOyBOT1AgaW5zZXJ0ZWQiKSk7Ci0gICAgfQotCi0gIHN3aXRjaCAoc3BlY2lhbF9jYXNlKQotICAgIHsKLSAgICBjYXNlIFNQRUNJQUxfQ0FTRV9OT05FOgotICAgICAgLyogbm9ybWFsIGluc24gKi8KLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNQRUNJQUxfQ0FTRV9TRVQ6Ci0gICAgICB7Ci0JaW50IG5lZWRfaGkyMl9wID0gMDsKLQotCS8qICJzZXQiIGlzIG5vdCBkZWZpbmVkIGZvciBuZWdhdGl2ZSBudW1iZXJzIGluIHY5OiBpdCBkb2Vzbid0IHlpZWxkCi0JICAgd2hhdCB5b3UgZXhwZWN0IGl0IHRvLiAgKi8KLQlpZiAoU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUCAobWF4X2FyY2hpdGVjdHVyZSkKLQkgICAgJiYgdGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkgIHsKLQkgICAgaWYgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPCAwKQotCSAgICAgIGFzX3dhcm4gKF8oInNldDogdXNlZCB3aXRoIG5lZ2F0aXZlIG51bWJlciIpKTsKLQkgICAgZWxzZSBpZiAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA+IChvZmZzZXRUKSAweGZmZmZmZmZmKQotCSAgICAgIGFzX3dhcm4gKF8oInNldDogbnVtYmVyIGxhcmdlciB0aGFuIDQyOTQ5NjcyOTUiKSk7Ci0JICB9Ci0KLQkvKiBTZWUgaWYgb3BlcmFuZCBpcyBhYnNvbHV0ZSBhbmQgc21hbGw7IHNraXAgc2V0aGkgaWYgc28uICAqLwotCWlmICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JICAgIHx8IHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPj0gKDEgPDwgMTIpCi0JICAgIHx8IHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPCAtKDEgPDwgMTIpKQotCSAgewotCSAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLQkgICAgbmVlZF9oaTIyX3AgPSAxOwotCSAgfQotCS8qIFNlZSBpZiBvcGVyYW5kIGhhcyBubyBsb3ctb3JkZXIgYml0czsgc2tpcCBPUiBpZiBzby4gICovCi0JaWYgKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkgICAgfHwgKG5lZWRfaGkyMl9wICYmICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyICYgMHgzRkYpICE9IDApCi0JICAgIHx8ICEgbmVlZF9oaTIyX3ApCi0JICB7Ci0JICAgIGludCByZCA9ICh0aGVfaW5zbi5vcGNvZGUgJiBSRCAofjApKSA+PiAyNTsKLQkgICAgdGhlX2luc24ub3Bjb2RlID0gKE9SX0lOU04gfCAobmVlZF9oaTIyX3AgPyBSUzEgKHJkKSA6IDApCi0JCQkgICAgICAgfCBSRCAocmQpCi0JCQkgICAgICAgfCBJTU1FRAotCQkJICAgICAgIHwgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIKLQkJCQkgICYgKG5lZWRfaGkyMl9wID8gMHgzZmYgOiAweDFmZmYpKSk7Ci0JICAgIHRoZV9pbnNuLnJlbG9jID0gKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCSAgICAgID8gQkZEX1JFTE9DX0xPMTAKLQkJCSAgICAgIDogQkZEX1JFTE9DX05PTkUpOwotCSAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLQkgIH0KLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgU1BFQ0lBTF9DQVNFX1NFVFNXOgotICAgICAgewotCS8qIEZJWE1FOiBOb3QgZmluaXNoZWQuICAqLwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBTUEVDSUFMX0NBU0VfU0VUWDoKLSAgICAgIHsKLSNkZWZpbmUgU0lHTkVYVDMyKHgpICgoKCh4KSAmIDB4ZmZmZmZmZmYpIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwKQotCWludCB1cHBlcjMyID0gU0lHTkVYVDMyIChCU1IgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIsIDMyKSk7Ci0JaW50IGxvd2VyMzIgPSBTSUdORVhUMzIgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIpOwotI3VuZGVmIFNJR05FWFQzMgotCWludCB0bXByZWcgPSAodGhlX2luc24ub3Bjb2RlICYgUlMxICh+MCkpID4+IDE0OwotCWludCBkc3RyZWcgPSAodGhlX2luc24ub3Bjb2RlICYgUkQgKH4wKSkgPj4gMjU7Ci0JLyogT3V0cHV0IGRpcmVjdGx5IHRvIGRzdCByZWcgaWYgbG93ZXIgMzIgYml0cyBhcmUgYWxsIHplcm8uICAqLwotCWludCB1cHBlcl9kc3RyZWcgPSAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudAotCQkJICAgICYmIGxvd2VyMzIgPT0gMCkgPyBkc3RyZWcgOiB0bXByZWc7Ci0JaW50IG5lZWRfaGgyMl9wID0gMCwgbmVlZF9obTEwX3AgPSAwLCBuZWVkX2hpMjJfcCA9IDAsIG5lZWRfbG8xMF9wID0gMDsKLQotCS8qIFRoZSB0bXAgcmVnIHNob3VsZCBub3QgYmUgdGhlIGRzdCByZWcuICAqLwotCWlmICh0bXByZWcgPT0gZHN0cmVnKQotCSAgYXNfd2FybiAoXygic2V0eDogdGVtcG9yYXJ5IHJlZ2lzdGVyIHNhbWUgYXMgZGVzdGluYXRpb24gcmVnaXN0ZXIiKSk7Ci0KLQkvKiBSZXNldCBYX2FkZF9udW1iZXIsIHdlJ3ZlIGV4dHJhY3RlZCBpdCBhcyB1cHBlcjMyL2xvd2VyMzIuCi0JICAgT3RoZXJ3aXNlIGZpeHVwX3NlZ21lbnQgd2lsbCBjb21wbGFpbiBhYm91dCBub3QgYmVpbmcgYWJsZSB0bwotCSAgIHdyaXRlIGFuIDggYnl0ZSBudW1iZXIgaW4gYSA0IGJ5dGUgZmllbGQuICAqLwotCXRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPSAwOwotCi0JLyogPz8/IE9idmlvdXNseSB0aGVyZSBhcmUgb3RoZXIgb3B0aW1pemF0aW9ucyB3ZSBjYW4gZG8KLQkgICAoZS5nLiBzZXRoaStzaGlmdCBmb3IgMHgxZjAwMDAwMDApIGFuZCBwZXJoYXBzIHdlIHNob3VsZG4ndCBiZQotCSAgIGRvaW5nIHNvbWUgb2YgdGhlc2UuICBMYXRlci4gIElmIHlvdSBkbyBjaGFuZ2UgdGhpbmdzLCB0cnkgdG8KLQkgICBjaGFuZ2UgYWxsIG9mIHRoaXMgdG8gYmUgdGFibGUgZHJpdmVuIGFzIHdlbGwuICAqLwotCi0JLyogV2hhdCB0byBvdXRwdXQgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIGlmIGl0J3MgY29uc3RhbnQuCi0JICAgQ29tcHV0ZSB0aGF0IGZpcnN0LCB0aGVuIG91dHB1dCB3aGF0IHdlJ3ZlIGRlY2lkZWQgdXBvbi4gICovCi0JaWYgKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JICBuZWVkX2hoMjJfcCA9IG5lZWRfaG0xMF9wID0gbmVlZF9oaTIyX3AgPSBuZWVkX2xvMTBfcCA9IDE7Ci0JZWxzZQotCSAgewotCSAgICAvKiBPbmx5IG5lZWQgaGgyMiBpZiBgb3InIGluc24gY2FuJ3QgaGFuZGxlIGNvbnN0YW50LiAgKi8KLQkgICAgaWYgKHVwcGVyMzIgPCAtKDEgPDwgMTIpIHx8IHVwcGVyMzIgPj0gKDEgPDwgMTIpKQotCSAgICAgIG5lZWRfaGgyMl9wID0gMTsKLQotCSAgICAvKiBEb2VzIGJvdHRvbSBwYXJ0IChhZnRlciBzZXRoaSkgaGF2ZSBiaXRzPyAgKi8KLQkgICAgaWYgKChuZWVkX2hoMjJfcCAmJiAodXBwZXIzMiAmIDB4M2ZmKSAhPSAwKQotCQkvKiBObyBoaDIyLCBidXQgZG9lcyB1cHBlcjMyIHN0aWxsIGhhdmUgYml0cyB3ZSBjYW4ndCBzZXQKLQkJICAgZnJvbSBsb3dlcjMyPyAgKi8KLQkJfHwgKCEgbmVlZF9oaDIyX3AKLQkJICAgICYmIHVwcGVyMzIgIT0gMAotCQkgICAgJiYgKHVwcGVyMzIgIT0gLTEgfHwgbG93ZXIzMiA+PSAwKSkpCi0JICAgICAgbmVlZF9obTEwX3AgPSAxOwotCi0JICAgIC8qIElmIHRoZSBsb3dlciBoYWxmIGlzIGFsbCB6ZXJvLCB3ZSBidWlsZCB0aGUgdXBwZXIgaGFsZiBkaXJlY3RseQotCSAgICAgICBpbnRvIHRoZSBkc3QgcmVnLiAgKi8KLQkgICAgaWYgKGxvd2VyMzIgIT0gMAotCQkvKiBOZWVkIGxvd2VyIGhhbGYgaWYgbnVtYmVyIGlzIHplcm8uICAqLwotCQl8fCAoISBuZWVkX2hoMjJfcCAmJiAhIG5lZWRfaG0xMF9wKSkKLQkgICAgICB7Ci0JCS8qIE5vIG5lZWQgZm9yIHNldGhpIGlmIGBvcicgaW5zbiBjYW4gaGFuZGxlIGNvbnN0YW50LiAgKi8KLQkJaWYgKGxvd2VyMzIgPCAtKDEgPDwgMTIpIHx8IGxvd2VyMzIgPj0gKDEgPDwgMTIpCi0JCSAgICAvKiBOb3RlIHRoYXQgd2UgY2FuJ3QgdXNlIGEgbmVnYXRpdmUgY29uc3RhbnQgaW4gdGhlIGBvcicKLQkJICAgICAgIGluc24gdW5sZXNzIHRoZSB1cHBlciAzMiBiaXRzIGFyZSBhbGwgb25lcy4gICovCi0JCSAgICB8fCAobG93ZXIzMiA8IDAgJiYgdXBwZXIzMiAhPSAtMSkpCi0JCSAgbmVlZF9oaTIyX3AgPSAxOwotCi0JCS8qIERvZXMgYm90dG9tIHBhcnQgKGFmdGVyIHNldGhpKSBoYXZlIGJpdHM/ICAqLwotCQlpZiAoKG5lZWRfaGkyMl9wICYmIChsb3dlcjMyICYgMHgzZmYpICE9IDApCi0JCSAgICAvKiBObyBzZXRoaS4gICovCi0JCSAgICB8fCAoISBuZWVkX2hpMjJfcCAmJiAobG93ZXIzMiAmIDB4MWZmZikgIT0gMCkKLQkJICAgIC8qIE5lZWQgYG9yJyBpZiB3ZSBkaWRuJ3Qgc2V0IGFueXRoaW5nIGVsc2UuICAqLwotCQkgICAgfHwgKCEgbmVlZF9oaTIyX3AgJiYgISBuZWVkX2hoMjJfcCAmJiAhIG5lZWRfaG0xMF9wKSkKLQkJICBuZWVkX2xvMTBfcCA9IDE7Ci0JICAgICAgfQotCSAgfQotCi0JaWYgKG5lZWRfaGgyMl9wKQotCSAgewotCSAgICB0aGVfaW5zbi5vcGNvZGUgPSAoU0VUSElfSU5TTiB8IFJEICh1cHBlcl9kc3RyZWcpCi0JCQkgICAgICAgfCAoKHVwcGVyMzIgPj4gMTApICYgMHgzZmZmZmYpKTsKLQkgICAgdGhlX2luc24ucmVsb2MgPSAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJICAgICAgPyBCRkRfUkVMT0NfU1BBUkNfSEgyMiA6IEJGRF9SRUxPQ19OT05FKTsKLQkgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0JICB9Ci0KLQlpZiAobmVlZF9obTEwX3ApCi0JICB7Ci0JICAgIHRoZV9pbnNuLm9wY29kZSA9IChPUl9JTlNOCi0JCQkgICAgICAgfCAobmVlZF9oaDIyX3AgPyBSUzEgKHVwcGVyX2RzdHJlZykgOiAwKQotCQkJICAgICAgIHwgUkQgKHVwcGVyX2RzdHJlZykKLQkJCSAgICAgICB8IElNTUVECi0JCQkgICAgICAgfCAodXBwZXIzMgotCQkJCSAgJiAobmVlZF9oaDIyX3AgPyAweDNmZiA6IDB4MWZmZikpKTsKLQkgICAgdGhlX2luc24ucmVsb2MgPSAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJICAgICAgPyBCRkRfUkVMT0NfU1BBUkNfSE0xMCA6IEJGRF9SRUxPQ19OT05FKTsKLQkgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0JICB9Ci0KLQlpZiAobmVlZF9oaTIyX3ApCi0JICB7Ci0JICAgIHRoZV9pbnNuLm9wY29kZSA9IChTRVRISV9JTlNOIHwgUkQgKGRzdHJlZykKLQkJCSAgICAgICB8ICgobG93ZXIzMiA+PiAxMCkgJiAweDNmZmZmZikpOwotCSAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19ISTIyOwotCSAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLQkgIH0KLQotCWlmIChuZWVkX2xvMTBfcCkKLQkgIHsKLQkgICAgLyogRklYTUU6IE9uZSBuaWNlIG9wdGltaXphdGlvbiB0byBkbyBoZXJlIGlzIHRvIE9SIHRoZSBsb3cgcGFydAotCSAgICAgICB3aXRoIHRoZSBoaWdocGFydCBpZiBoaTIyIGlzbid0IG5lZWRlZCBhbmQgdGhlIGxvdyBwYXJ0IGlzCi0JICAgICAgIHBvc2l0aXZlLiAgKi8KLQkgICAgdGhlX2luc24ub3Bjb2RlID0gKE9SX0lOU04gfCAobmVlZF9oaTIyX3AgPyBSUzEgKGRzdHJlZykgOiAwKQotCQkJICAgICAgIHwgUkQgKGRzdHJlZykKLQkJCSAgICAgICB8IElNTUVECi0JCQkgICAgICAgfCAobG93ZXIzMgotCQkJCSAgJiAobmVlZF9oaTIyX3AgPyAweDNmZiA6IDB4MWZmZikpKTsKLQkgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfTE8xMDsKLQkgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0JICB9Ci0KLQkvKiBJZiB3ZSBuZWVkZWQgdG8gYnVpbGQgdGhlIHVwcGVyIHBhcnQsIHNoaWZ0IGl0IGludG8gcGxhY2UuICAqLwotCWlmIChuZWVkX2hoMjJfcCB8fCBuZWVkX2htMTBfcCkKLQkgIHsKLQkgICAgdGhlX2luc24ub3Bjb2RlID0gKFNMTFhfSU5TTiB8IFJTMSAodXBwZXJfZHN0cmVnKSB8IFJEICh1cHBlcl9kc3RyZWcpCi0JCQkgICAgICAgfCBJTU1FRCB8IDMyKTsKLQkgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKLQkgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0JICB9Ci0KLQkvKiBJZiB3ZSBuZWVkZWQgdG8gYnVpbGQgYm90aCB1cHBlciBhbmQgbG93ZXIgcGFydHMsIE9SIHRoZW0gdG9nZXRoZXIuICAqLwotCWlmICgobmVlZF9oaDIyX3AgfHwgbmVlZF9obTEwX3ApCi0JICAgICYmIChuZWVkX2hpMjJfcCB8fCBuZWVkX2xvMTBfcCkpCi0JICB7Ci0JICAgIHRoZV9pbnNuLm9wY29kZSA9IChPUl9JTlNOIHwgUlMxIChkc3RyZWcpIHwgUlMyICh1cHBlcl9kc3RyZWcpCi0JCQkgICAgICAgfCBSRCAoZHN0cmVnKSk7Ci0JICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX05PTkU7Ci0JICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotCSAgfQotCS8qIFdlIGRpZG4ndCBuZWVkIGJvdGggcmVncywgYnV0IHdlIG1heSBoYXZlIHRvIHNpZ24gZXh0ZW5kIGxvd2VyMzIuICAqLwotCWVsc2UgaWYgKG5lZWRfaGkyMl9wICYmIHVwcGVyMzIgPT0gLTEpCi0JICB7Ci0JICAgIHRoZV9pbnNuLm9wY29kZSA9IChTUkFfSU5TTiB8IFJTMSAoZHN0cmVnKSB8IFJEIChkc3RyZWcpCi0JCQkgICAgICAgfCBJTU1FRCB8IDApOwotCSAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19OT05FOwotCSAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLQkgIH0KLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgU1BFQ0lBTF9DQVNFX0ZESVY6Ci0gICAgICB7Ci0JaW50IHJkID0gKHRoZV9pbnNuLm9wY29kZSA+PiAyNSkgJiAweDFmOwotCi0Jb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0KLQkvKiBBY2NvcmRpbmcgdG8gaW5mb3JtYXRpb24gbGVha2VkIGZyb20gU3VuLCB0aGUgImZkaXYiIGluc3RydWN0aW9ucwotCSAgIG9uIGVhcmx5IFNQQVJDIG1hY2hpbmVzIHdvdWxkIHByb2R1Y2UgaW5jb3JyZWN0IHJlc3VsdHMgc29tZXRpbWVzLgotCSAgIFRoZSB3b3JrYXJvdW5kIGlzIHRvIGFkZCBhbiBmbW92cyBvZiB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgdG8KLQkgICBpdHNlbGYganVzdCBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24uICBUaGlzIHdhcyB0cnVlIG9uIG1hY2hpbmVzCi0JICAgd2l0aCBXZWl0ZWsgMTE2NSBmbG9hdCBjaGlwcywgc3VjaCBhcyB0aGUgU3VuLTQvMjYwIGFuZCAvMjgwLiAqLwotCWFzc2VydCAodGhlX2luc24ucmVsb2MgPT0gQkZEX1JFTE9DX05PTkUpOwotCXRoZV9pbnNuLm9wY29kZSA9IEZNT1ZTX0lOU04gfCByZCB8IFJEIChyZCk7Ci0Jb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oImZhaWxlZCBzcGVjaWFsIGNhc2UgaW5zbiBzYW5pdHkgY2hlY2siKSk7Ci0gICAgfQotfQotCi0vKiBTdWJyb3V0aW5lIG9mIG1kX2Fzc2VtYmxlIHRvIGRvIHRoZSBhY3R1YWwgcGFyc2luZy4gICovCi0KLXN0YXRpYyB2b2lkCi1zcGFyY19pcCAoc3RyLCBwaW5zbikKLSAgICAgY2hhciAqc3RyOwotICAgICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICoqcGluc247Ci17Ci0gIGNoYXIgKmVycm9yX21lc3NhZ2UgPSAiIjsKLSAgY2hhciAqczsKLSAgY29uc3QgY2hhciAqYXJnczsKLSAgY2hhciBjOwotICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICppbnNuOwotICBjaGFyICphcmdzU3RhcnQ7Ci0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICB1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0gIGludCBtYXRjaCA9IDA7Ci0gIGludCBjb21tYSA9IDA7Ci0gIGludCB2OV9hcmdfcDsKLQotICBzID0gc3RyOwotICBpZiAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLSAgICB7Ci0gICAgICBkbwotCSsrczsKLSAgICAgIHdoaWxlIChpc2xvd2VyICgodW5zaWduZWQgY2hhcikgKnMpIHx8IGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpOwotICAgIH0KLQotICBzd2l0Y2ggKCpzKQotICAgIHsKLSAgICBjYXNlICdcMCc6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJywnOgotICAgICAgY29tbWEgPSAxOwotCi0gICAgICAvKkZBTExUSFJPVUdIICovCi0KLSAgICBjYXNlICcgJzoKLSAgICAgICpzKysgPSAnXDAnOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oIlVua25vd24gb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgfQotICBpbnNuID0gKHN0cnVjdCBzcGFyY19vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBzdHIpOwotICAqcGluc24gPSBpbnNuOwotICBpZiAoaW5zbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiVW5rbm93biBvcGNvZGU6IGAlcyciKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChjb21tYSkKLSAgICB7Ci0gICAgICAqLS1zID0gJywnOwotICAgIH0KLQotICBhcmdzU3RhcnQgPSBzOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIG9wY29kZSA9IGluc24tPm1hdGNoOwotICAgICAgbWVtc2V0ICgmdGhlX2luc24sICdcMCcsIHNpemVvZiAodGhlX2luc24pKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX05PTkU7Ci0gICAgICB2OV9hcmdfcCA9IDA7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBCdWlsZCB0aGUgb3Bjb2RlLCBjaGVja2luZyBhcyB3ZSBnbyB0byBtYWtlCi0gICAgICAgKiBzdXJlIHRoYXQgdGhlIG9wZXJhbmRzIG1hdGNoCi0gICAgICAgKi8KLSAgICAgIGZvciAoYXJncyA9IGluc24tPmFyZ3M7OyArK2FyZ3MpCi0JewotCSAgc3dpdGNoICgqYXJncykKLQkgICAgewotCSAgICBjYXNlICdLJzoKLQkgICAgICB7Ci0JCWludCBrbWFzayA9IDA7Ci0KLQkJLyogUGFyc2UgYSBzZXJpZXMgb2YgbWFza3MuICAqLwotCQlpZiAoKnMgPT0gJyMnKQotCQkgIHsKLQkJICAgIHdoaWxlICgqcyA9PSAnIycpCi0JCSAgICAgIHsKLQkJCWludCBtYXNrOwotCi0JCQlpZiAoISBwYXJzZV9rZXl3b3JkX2FyZyAoc3BhcmNfZW5jb2RlX21lbWJhciwgJnMsCi0JCQkJCQkgJm1hc2spKQotCQkJICB7Ci0JCQkgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBtZW1iYXIgbWFzayBuYW1lIik7Ci0JCQkgICAgZ290byBlcnJvcjsKLQkJCSAgfQotCQkJa21hc2sgfD0gbWFzazsKLQkJCXdoaWxlICgqcyA9PSAnICcpIHsgKytzOyBjb250aW51ZTsgfQotCQkJaWYgKCpzID09ICd8JyB8fCAqcyA9PSAnKycpCi0JCQkgICsrczsKLQkJCXdoaWxlICgqcyA9PSAnICcpIHsgKytzOyBjb250aW51ZTsgfQotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKCEgcGFyc2VfY29uc3RfZXhwcl9hcmcgKCZzLCAma21hc2spKQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIG1lbWJhciBtYXNrIGV4cHJlc3Npb24iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0KLQkJICAgIGlmIChrbWFzayA8IDAgfHwga21hc2sgPiAxMjcpCi0JCSAgICAgIHsKLQkJCWVycm9yX21lc3NhZ2UgPSBfKCI6IGludmFsaWQgbWVtYmFyIG1hc2sgbnVtYmVyIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9Ci0JCSAgfQotCi0JCW9wY29kZSB8PSBNRU1CQVIgKGttYXNrKTsKLQkJY29udGludWU7Ci0JICAgICAgfQotCi0JICAgIGNhc2UgJyonOgotCSAgICAgIHsKLQkJaW50IGZjbiA9IDA7Ci0KLQkJLyogUGFyc2UgYSBwcmVmZXRjaCBmdW5jdGlvbi4gICovCi0JCWlmICgqcyA9PSAnIycpCi0JCSAgewotCQkgICAgaWYgKCEgcGFyc2Vfa2V5d29yZF9hcmcgKHNwYXJjX2VuY29kZV9wcmVmZXRjaCwgJnMsICZmY24pKQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIHByZWZldGNoIGZ1bmN0aW9uIG5hbWUiKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBpZiAoISBwYXJzZV9jb25zdF9leHByX2FyZyAoJnMsICZmY24pKQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIHByZWZldGNoIGZ1bmN0aW9uIGV4cHJlc3Npb24iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0KLQkJICAgIGlmIChmY24gPCAwIHx8IGZjbiA+IDMxKQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIHByZWZldGNoIGZ1bmN0aW9uIG51bWJlciIpOwotCQkJZ290byBlcnJvcjsKLQkJICAgICAgfQotCQkgIH0KLQkJb3Bjb2RlIHw9IFJEIChmY24pOwotCQljb250aW51ZTsKLQkgICAgICB9Ci0KLQkgICAgY2FzZSAnISc6Ci0JICAgIGNhc2UgJz8nOgotCSAgICAgIC8qIFBhcnNlIGEgc3BhcmM2NCBwcml2aWxlZ2VkIHJlZ2lzdGVyLiAgKi8KLQkgICAgICBpZiAoKnMgPT0gJyUnKQotCQl7Ci0JCSAgc3RydWN0IHByaXZfcmVnX2VudHJ5ICpwID0gcHJpdl9yZWdfdGFibGU7Ci0JCSAgdW5zaWduZWQgaW50IGxlbiA9IDk5OTk5OTk7IC8qIGluaXQgdG8gbWFrZSBnY2MgaGFwcHkgKi8KLQotCQkgIHMgKz0gMTsKLQkJICB3aGlsZSAocC0+bmFtZVswXSA+IHNbMF0pCi0JCSAgICBwKys7Ci0JCSAgd2hpbGUgKHAtPm5hbWVbMF0gPT0gc1swXSkKLQkJICAgIHsKLQkJICAgICAgbGVuID0gc3RybGVuIChwLT5uYW1lKTsKLQkJICAgICAgaWYgKHN0cm5jbXAgKHAtPm5hbWUsIHMsIGxlbikgPT0gMCkKLQkJCWJyZWFrOwotCQkgICAgICBwKys7Ci0JCSAgICB9Ci0JCSAgaWYgKHAtPm5hbWVbMF0gIT0gc1swXSkKLQkJICAgIHsKLQkJICAgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogdW5yZWNvZ25pemFibGUgcHJpdmlsZWdlZCByZWdpc3RlciIpOwotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCQkgIGlmICgqYXJncyA9PSAnPycpCi0JCSAgICBvcGNvZGUgfD0gKHAtPnJlZ251bSA8PCAxNCk7Ci0JCSAgZWxzZQotCQkgICAgb3Bjb2RlIHw9IChwLT5yZWdudW0gPDwgMjUpOwotCQkgIHMgKz0gbGVuOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZXJyb3JfbWVzc2FnZSA9IF8oIjogdW5yZWNvZ25pemFibGUgcHJpdmlsZWdlZCByZWdpc3RlciIpOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQotCSAgICBjYXNlICdfJzoKLQkgICAgY2FzZSAnLyc6Ci0JICAgICAgLyogUGFyc2UgYSB2OWEgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyLiAgKi8KLQkgICAgICBpZiAoKnMgPT0gJyUnKQotCQl7Ci0JCSAgc3RydWN0IHByaXZfcmVnX2VudHJ5ICpwID0gdjlhX2Fzcl90YWJsZTsKLQkJICB1bnNpZ25lZCBpbnQgbGVuID0gOTk5OTk5OTsgLyogaW5pdCB0byBtYWtlIGdjYyBoYXBweSAqLwotCi0JCSAgcyArPSAxOwotCQkgIHdoaWxlIChwLT5uYW1lWzBdID4gc1swXSkKLQkJICAgIHArKzsKLQkJICB3aGlsZSAocC0+bmFtZVswXSA9PSBzWzBdKQotCQkgICAgewotCQkgICAgICBsZW4gPSBzdHJsZW4gKHAtPm5hbWUpOwotCQkgICAgICBpZiAoc3RybmNtcCAocC0+bmFtZSwgcywgbGVuKSA9PSAwKQotCQkJYnJlYWs7Ci0JCSAgICAgIHArKzsKLQkJICAgIH0KLQkJICBpZiAocC0+bmFtZVswXSAhPSBzWzBdKQotCQkgICAgewotCQkgICAgICBlcnJvcl9tZXNzYWdlID0gXygiOiB1bnJlY29nbml6YWJsZSB2OWEgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIik7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0JCSAgaWYgKCphcmdzID09ICcvJyAmJiAocC0+cmVnbnVtID09IDIwIHx8IHAtPnJlZ251bSA9PSAyMSkpCi0JCSAgICB7Ci0JCSAgICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IHJkIG9uIHdyaXRlIG9ubHkgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIik7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9CQkgICAgICAKLQkJICBpZiAoKmFyZ3MgPT0gJy8nKQotCQkgICAgb3Bjb2RlIHw9IChwLT5yZWdudW0gPDwgMTQpOwotCQkgIGVsc2UKLQkJICAgIG9wY29kZSB8PSAocC0+cmVnbnVtIDw8IDI1KTsKLQkJICBzICs9IGxlbjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGVycm9yX21lc3NhZ2UgPSBfKCI6IHVucmVjb2duaXphYmxlIHY5YSBhbmNpbGxhcnkgc3RhdGUgcmVnaXN0ZXIiKTsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0KLQkgICAgY2FzZSAnTSc6Ci0JICAgIGNhc2UgJ20nOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWFzciIsIDQpID09IDApCi0JCXsKLQkJICBzICs9IDQ7Ci0KLQkJICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJICAgIHsKLQkJICAgICAgbG9uZyBudW0gPSAwOwotCi0JCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQotCQkJewotCQkJICBudW0gPSBudW0gKiAxMCArICpzIC0gJzAnOwotCQkJICArK3M7Ci0JCQl9Ci0KLQkJICAgICAgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID49IFNQQVJDX09QQ09ERV9BUkNIX1Y5KQotCQkJewotCQkJICBpZiAobnVtIDwgMTYgfHwgMzEgPCBudW0pCi0JCQkgICAgewotCQkJICAgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogYXNyIG51bWJlciBtdXN0IGJlIGJldHdlZW4gMTYgYW5kIDMxIik7Ci0JCQkgICAgICBnb3RvIGVycm9yOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBpZiAobnVtIDwgMCB8fCAzMSA8IG51bSkKLQkJCSAgICB7Ci0JCQkgICAgICBlcnJvcl9tZXNzYWdlID0gXygiOiBhc3IgbnVtYmVyIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAzMSIpOwotCQkJICAgICAgZ290byBlcnJvcjsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgb3Bjb2RlIHw9ICgqYXJncyA9PSAnTScgPyBSUzEgKG51bSkgOiBSRCAobnVtKSk7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogZXhwZWN0aW5nICVhc3JOIik7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0JCX0gLyogaWYgJWFzciAqLwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0knOgotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDXzExOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ2onOgotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDXzEwOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ1gnOgotCSAgICAgIC8qIFY4IHN5c3RlbXMgZG9uJ3QgdW5kZXJzdGFuZCBCRkRfUkVMT0NfU1BBUkNfNS4gICovCi0JICAgICAgaWYgKFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AgKG1heF9hcmNoaXRlY3R1cmUpKQotCQl0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ181OwotCSAgICAgIGVsc2UKLQkJdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkMxMzsKLQkgICAgICAvKiBUaGVzZSBmaWVsZHMgYXJlIHVuc2lnbmVkLCBidXQgZm9yIHVwd2FyZCBjb21wYXRpYmlsaXR5LAotCQkgYWxsb3cgbmVnYXRpdmUgdmFsdWVzIGFzIHdlbGwuICAqLwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ1knOgotCSAgICAgIC8qIFY4IHN5c3RlbXMgZG9uJ3QgdW5kZXJzdGFuZCBCRkRfUkVMT0NfU1BBUkNfNi4gICovCi0JICAgICAgaWYgKFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AgKG1heF9hcmNoaXRlY3R1cmUpKQotCQl0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ182OwotCSAgICAgIGVsc2UKLQkJdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkMxMzsKLQkgICAgICAvKiBUaGVzZSBmaWVsZHMgYXJlIHVuc2lnbmVkLCBidXQgZm9yIHVwd2FyZCBjb21wYXRpYmlsaXR5LAotCQkgYWxsb3cgbmVnYXRpdmUgdmFsdWVzIGFzIHdlbGwuICAqLwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ2snOgotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gLyogUkVMT0NfV0RJU1AyXzE0ICovIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE2OwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdHJzoKLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5OwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdOJzoKLQkgICAgICBpZiAoKnMgPT0gJ3AnICYmIHNbMV0gPT0gJ24nKQotCQl7Ci0JCSAgcyArPSAyOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnVCc6Ci0JICAgICAgaWYgKCpzID09ICdwJyAmJiBzWzFdID09ICd0JykKLQkJewotCQkgIHMgKz0gMjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3onOgotCSAgICAgIGlmICgqcyA9PSAnICcpCi0JCXsKLQkJICArK3M7Ci0JCX0KLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVpY2MiLCA0KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA0OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnWic6Ci0JICAgICAgaWYgKCpzID09ICcgJykKLQkJewotCQkgICsrczsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJXhjYyIsIDQpID09IDApCi0JCXsKLQkJICBzICs9IDQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc2JzoKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQl7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZmNjMCIsIDUpID09IDApCi0JCXsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc3JzoKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQl7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZmNjMSIsIDUpID09IDApCi0JCXsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc4JzoKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQl7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZmNjMiIsIDUpID09IDApCi0JCXsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc5JzoKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQl7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZmNjMyIsIDUpID09IDApCi0JCXsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdQJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVwYyIsIDMpID09IDApCi0JCXsKLQkJICBzICs9IDM7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdXJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiV0aWNrIiwgNSkgPT0gMCkKLQkJewotCQkgIHMgKz0gNTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1wwJzoJCS8qIGVuZCBvZiBhcmdzICovCi0JICAgICAgaWYgKCpzID09ICdcMCcpCi0JCXsKLQkJICBtYXRjaCA9IDE7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcrJzoKLQkgICAgICBpZiAoKnMgPT0gJysnKQotCQl7Ci0JCSAgKytzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKCpzID09ICctJykKLQkJewotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnWyc6CQkvKiB0aGVzZSBtdXN0IG1hdGNoIGV4YWN0bHkgKi8KLQkgICAgY2FzZSAnXSc6Ci0JICAgIGNhc2UgJywnOgotCSAgICBjYXNlICcgJzoKLQkgICAgICBpZiAoKnMrKyA9PSAqYXJncykKLQkJY29udGludWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnIyc6CQkvKiBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCAqLwotCSAgICAgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMrKykpCi0JCXsKLQkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJICAgIHsKLQkJICAgICAgKytzOwotCQkgICAgfQotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnQyc6CQkvKiBjb3Byb2Nlc3NvciBzdGF0ZSByZWdpc3RlciAqLwotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWNzciIsIDQpID09IDApCi0JCXsKLQkJICBzICs9IDQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdiJzoJCS8qIG5leHQgb3BlcmFuZCBpcyBhIGNvcHJvY2Vzc29yIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ2MnOgotCSAgICBjYXNlICdEJzoKLQkgICAgICBpZiAoKnMrKyA9PSAnJScgJiYgKnMrKyA9PSAnYycgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJewotCQkgIG1hc2sgPSAqcysrOwotCQkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQotCQkgICAgewotCQkgICAgICBtYXNrID0gMTAgKiAobWFzayAtICcwJykgKyAoKnMrKyAtICcwJyk7Ci0JCSAgICAgIGlmIChtYXNrID49IDMyKQotCQkJewotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIG1hc2sgLT0gJzAnOwotCQkgICAgfQotCQkgIHN3aXRjaCAoKmFyZ3MpCi0JCSAgICB7Ci0KLQkJICAgIGNhc2UgJ2InOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAxNDsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ2MnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzazsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ0QnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAyNTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdyJzoJCS8qIG5leHQgb3BlcmFuZCBtdXN0IGJlIGEgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnTyc6Ci0JICAgIGNhc2UgJzEnOgotCSAgICBjYXNlICcyJzoKLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgaWYgKCpzKysgPT0gJyUnKQotCQl7Ci0JCSAgc3dpdGNoIChjID0gKnMrKykKLQkJICAgIHsKLQotCQkgICAgY2FzZSAnZic6CS8qIGZyYW1lIHBvaW50ZXIgKi8KLQkJICAgICAgaWYgKCpzKysgPT0gJ3AnKQotCQkJewotCQkJICBtYXNrID0gMHgxZTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0KLQkJICAgIGNhc2UgJ2cnOgkvKiBnbG9iYWwgcmVnaXN0ZXIgKi8KLQkJICAgICAgaWYgKGlzb2N0YWwgKGMgPSAqcysrKSkKLQkJCXsKLQkJCSAgbWFzayA9IGMgLSAnMCc7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgICBnb3RvIGVycm9yOwotCi0JCSAgICBjYXNlICdpJzoJLyogaW4gcmVnaXN0ZXIgKi8KLQkJICAgICAgaWYgKGlzb2N0YWwgKGMgPSAqcysrKSkKLQkJCXsKLQkJCSAgbWFzayA9IGMgLSAnMCcgKyAyNDsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0KLQkJICAgIGNhc2UgJ2wnOgkvKiBsb2NhbCByZWdpc3RlciAqLwotCQkgICAgICBpZiAoaXNvY3RhbCAoYyA9ICpzKyspKQotCQkJewotCQkJICBtYXNrID0gKGMgLSAnMCcgKyAxNik7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgICBnb3RvIGVycm9yOwotCi0JCSAgICBjYXNlICdvJzoJLyogb3V0IHJlZ2lzdGVyICovCi0JCSAgICAgIGlmIChpc29jdGFsIChjID0gKnMrKykpCi0JCQl7Ci0JCQkgIG1hc2sgPSAoYyAtICcwJyArIDgpOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgZ290byBlcnJvcjsKLQotCQkgICAgY2FzZSAncyc6CS8qIHN0YWNrIHBvaW50ZXIgKi8KLQkJICAgICAgaWYgKCpzKysgPT0gJ3AnKQotCQkJewotCQkJICBtYXNrID0gMHhlOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgZ290byBlcnJvcjsKLQotCQkgICAgY2FzZSAncic6CS8qIGFueSByZWdpc3RlciAqLwotCQkgICAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAoYyA9ICpzKyspKSkKLQkJCXsKLQkJCSAgZ290byBlcnJvcjsKLQkJCX0KLQkJICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLQkJICAgIGNhc2UgJzAnOgotCQkgICAgY2FzZSAnMSc6Ci0JCSAgICBjYXNlICcyJzoKLQkJICAgIGNhc2UgJzMnOgotCQkgICAgY2FzZSAnNCc6Ci0JCSAgICBjYXNlICc1JzoKLQkJICAgIGNhc2UgJzYnOgotCQkgICAgY2FzZSAnNyc6Ci0JCSAgICBjYXNlICc4JzoKLQkJICAgIGNhc2UgJzknOgotCQkgICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJCXsKLQkJCSAgaWYgKChjID0gMTAgKiAoYyAtICcwJykgKyAoKnMrKyAtICcwJykpID49IDMyKQotCQkJICAgIHsKLQkJCSAgICAgIGdvdG8gZXJyb3I7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGMgLT0gJzAnOwotCQkJfQotCQkgICAgICBtYXNrID0gYzsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0KLQkJICAvKiBHb3QgdGhlIHJlZ2lzdGVyLCBub3cgZmlndXJlIG91dCB3aGVyZQotCQkgICAgIGl0IGdvZXMgaW4gdGhlIG9wY29kZS4gICovCi0JCSAgc3dpdGNoICgqYXJncykKLQkJICAgIHsKLQkJICAgIGNhc2UgJzEnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAxNDsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJzInOgotCQkgICAgICBvcGNvZGUgfD0gbWFzazsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ2QnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAyNTsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ3InOgotCQkgICAgICBvcGNvZGUgfD0gKG1hc2sgPDwgMjUpIHwgKG1hc2sgPDwgMTQpOwotCQkgICAgICBjb250aW51ZTsKLQotCQkgICAgY2FzZSAnTyc6Ci0JCSAgICAgIG9wY29kZSB8PSAobWFzayA8PCAyNSkgfCAobWFzayA8PCAwKTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdlJzoJCS8qIG5leHQgb3BlcmFuZCBpcyBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ3YnOgotCSAgICBjYXNlICdWJzoKLQotCSAgICBjYXNlICdmJzoKLQkgICAgY2FzZSAnQic6Ci0JICAgIGNhc2UgJ1InOgotCi0JICAgIGNhc2UgJ2cnOgotCSAgICBjYXNlICdIJzoKLQkgICAgY2FzZSAnSic6Ci0JICAgICAgewotCQljaGFyIGZvcm1hdDsKLQotCQlpZiAoKnMrKyA9PSAnJScKLQkJICAgICYmICgoZm9ybWF0ID0gKnMpID09ICdmJykKLQkJICAgICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKytzKSkKLQkJICB7Ci0JCSAgICBmb3IgKG1hc2sgPSAwOyBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpOyArK3MpCi0JCSAgICAgIHsKLQkJCW1hc2sgPSAxMCAqIG1hc2sgKyAoKnMgLSAnMCcpOwotCQkgICAgICB9CQkvKiByZWFkIHRoZSBudW1iZXIgKi8KLQotCQkgICAgaWYgKCgqYXJncyA9PSAndicKLQkJCSB8fCAqYXJncyA9PSAnQicKLQkJCSB8fCAqYXJncyA9PSAnSCcpCi0JCQkmJiAobWFzayAmIDEpKQotCQkgICAgICB7Ci0JCQlicmVhazsKLQkJICAgICAgfQkJLyogcmVnaXN0ZXIgbXVzdCBiZSBldmVuIG51bWJlcmVkICovCi0KLQkJICAgIGlmICgoKmFyZ3MgPT0gJ1YnCi0JCQkgfHwgKmFyZ3MgPT0gJ1InCi0JCQkgfHwgKmFyZ3MgPT0gJ0onKQotCQkJJiYgKG1hc2sgJiAzKSkKLQkJICAgICAgewotCQkJYnJlYWs7Ci0JCSAgICAgIH0JCS8qIHJlZ2lzdGVyIG11c3QgYmUgbXVsdGlwbGUgb2YgNCAqLwotCi0JCSAgICBpZiAobWFzayA+PSA2NCkKLQkJICAgICAgewotCQkJaWYgKFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AgKG1heF9hcmNoaXRlY3R1cmUpKQotCQkJICBlcnJvcl9tZXNzYWdlID0gXygiOiBUaGVyZSBhcmUgb25seSA2NCBmIHJlZ2lzdGVyczsgWzAtNjNdIik7Ci0JCQllbHNlCi0JCQkgIGVycm9yX21lc3NhZ2UgPSBfKCI6IFRoZXJlIGFyZSBvbmx5IDMyIGYgcmVnaXN0ZXJzOyBbMC0zMV0iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0JLyogb24gZXJyb3IgKi8KLQkJICAgIGVsc2UgaWYgKG1hc2sgPj0gMzIpCi0JCSAgICAgIHsKLQkJCWlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSkKLQkJCSAgewotCQkJICAgIHY5X2FyZ19wID0gMTsKLQkJCSAgICBtYXNrIC09IDMxOwkvKiB3cmFwIGhpZ2ggYml0ICovCi0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IFRoZXJlIGFyZSBvbmx5IDMyIGYgcmVnaXN0ZXJzOyBbMC0zMV0iKTsKLQkJCSAgICBnb3RvIGVycm9yOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBicmVhazsKLQkJICB9CS8qIGlmIG5vdCBhbiAnZicgcmVnaXN0ZXIuICovCi0KLQkJc3dpdGNoICgqYXJncykKLQkJICB7Ci0JCSAgY2FzZSAndic6Ci0JCSAgY2FzZSAnVic6Ci0JCSAgY2FzZSAnZSc6Ci0JCSAgICBvcGNvZGUgfD0gUlMxIChtYXNrKTsKLQkJICAgIGNvbnRpbnVlOwotCi0KLQkJICBjYXNlICdmJzoKLQkJICBjYXNlICdCJzoKLQkJICBjYXNlICdSJzoKLQkJICAgIG9wY29kZSB8PSBSUzIgKG1hc2spOwotCQkgICAgY29udGludWU7Ci0KLQkJICBjYXNlICdnJzoKLQkJICBjYXNlICdIJzoKLQkJICBjYXNlICdKJzoKLQkJICAgIG9wY29kZSB8PSBSRCAobWFzayk7Ci0JCSAgICBjb250aW51ZTsKLQkJICB9CQkvKiBwYWNrIGl0IGluLiAqLwotCi0JCWtub3cgKDApOwotCQlicmVhazsKLQkgICAgICB9CQkJLyogZmxvYXQgYXJnICovCi0KLQkgICAgY2FzZSAnRic6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZnNyIiwgNCkgPT0gMCkKLQkJewotCQkgIHMgKz0gNDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJzAnOgkJLyogNjQgYml0IGltbWVkaWF0ZSAoc2V0eCBpbnNuKSAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX05PTkU7IC8qIHJlbG9jIGhhbmRsZWQgZWxzZXdoZXJlICovCi0JICAgICAgZ290byBpbW1lZGlhdGU7Ci0KLQkgICAgY2FzZSAnaCc6CQkvKiBoaWdoIDIyIGJpdHMgKi8KLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19ISTIyOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ2wnOgkJLyogMjIgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZSAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDX1dESVNQMjI7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ0wnOgkJLyogMzAgYml0IGltbWVkaWF0ZSAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyOwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICduJzoJCS8qIDIyIGJpdCBpbW1lZGlhdGUgKi8KLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQzIyOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ2knOgkJLyogMTMgYml0IGltbWVkaWF0ZSAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDMTM7Ci0KLQkgICAgICAvKiBmYWxsdGhyb3VnaCAqLwotCi0JICAgIGltbWVkaWF0ZToKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQlzKys7Ci0KLQkgICAgICAvKiBDaGVjayBmb3IgJWhpLCBldGMuICAqLwotCSAgICAgIGlmICgqcyA9PSAnJScpCi0JCXsKLQkJICBzdGF0aWMgc3RydWN0IG9wcyB7Ci0JCSAgICAvKiBUaGUgbmFtZSBhcyBpdCBhcHBlYXJzIGluIGFzc2VtYmxlci4gICovCi0JCSAgICBjaGFyICpuYW1lOwotCQkgICAgLyogc3RybGVuIChuYW1lKSwgcHJlY29tcHV0ZWQgZm9yIHNwZWVkICovCi0JCSAgICBpbnQgbGVuOwotCQkgICAgLyogVGhlIHJlbG9jIHRoaXMgcHNldWRvLW9wIHRyYW5zbGF0ZXMgdG8uICAqLwotCQkgICAgaW50IHJlbG9jOwotCQkgICAgLyogTm9uLXplcm8gaWYgZm9yIHY5IG9ubHkuICAqLwotCQkgICAgaW50IHY5X3A7Ci0JCSAgICAvKiBOb24temVybyBpZiBjYW4gYmUgdXNlZCBpbiBwYy1yZWxhdGl2ZSBjb250ZXh0cy4gICovCi0JCSAgICBpbnQgcGNyZWxfcDsvKkZJWE1FOndpcCovCi0JCSAgfSBvcHNbXSA9IHsKLQkJICAgIC8qIGhpeC9sb3ggbXVzdCBhcHBlYXIgYmVmb3JlIGhpL2xvIHNvICVoaXggd29uJ3QgYmUKLQkJICAgICAgIG1pc3Rha2VuIGZvciAlaGkuICAqLwotCQkgICAgeyAiaGl4IiwgMywgQkZEX1JFTE9DX1NQQVJDX0hJWDIyLCAxLCAwIH0sCi0JCSAgICB7ICJsb3giLCAzLCBCRkRfUkVMT0NfU1BBUkNfTE9YMTAsIDEsIDAgfSwKLQkJICAgIHsgImhpIiwgMiwgQkZEX1JFTE9DX0hJMjIsIDAsIDEgfSwKLQkJICAgIHsgImxvIiwgMiwgQkZEX1JFTE9DX0xPMTAsIDAsIDEgfSwKLQkJICAgIHsgImhoIiwgMiwgQkZEX1JFTE9DX1NQQVJDX0hIMjIsIDEsIDEgfSwKLQkJICAgIHsgImhtIiwgMiwgQkZEX1JFTE9DX1NQQVJDX0hNMTAsIDEsIDEgfSwKLQkJICAgIHsgImxtIiwgMiwgQkZEX1JFTE9DX1NQQVJDX0xNMjIsIDEsIDEgfSwKLQkJICAgIHsgImg0NCIsIDMsIEJGRF9SRUxPQ19TUEFSQ19INDQsIDEsIDAgfSwKLQkJICAgIHsgIm00NCIsIDMsIEJGRF9SRUxPQ19TUEFSQ19NNDQsIDEsIDAgfSwKLQkJICAgIHsgImw0NCIsIDMsIEJGRF9SRUxPQ19TUEFSQ19MNDQsIDEsIDAgfSwKLQkJICAgIHsgInVoaSIsIDMsIEJGRF9SRUxPQ19TUEFSQ19ISDIyLCAxLCAwIH0sCi0JCSAgICB7ICJ1bG8iLCAzLCBCRkRfUkVMT0NfU1BBUkNfSE0xMCwgMSwgMCB9LAotCQkgICAgeyBOVUxMIH0KLQkJICB9OwotCQkgIHN0cnVjdCBvcHMgKm87Ci0KLQkJICBmb3IgKG8gPSBvcHM7IG8tPm5hbWU7IG8rKykKLQkJICAgIGlmIChzdHJuY21wIChzICsgMSwgby0+bmFtZSwgby0+bGVuKSA9PSAwKQotCQkgICAgICBicmVhazsKLQkJICBpZiAoby0+bmFtZSA9PSBOVUxMKQotCQkgICAgYnJlYWs7Ci0KLQkJICB0aGVfaW5zbi5yZWxvYyA9IG8tPnJlbG9jOwotCQkgIHMgKz0gby0+bGVuICsgMTsKLQkJICB2OV9hcmdfcCA9IG8tPnY5X3A7Ci0JCX0KLQotCSAgICAgIC8qIE5vdGUgdGhhdCBpZiB0aGUgZ2V0X2V4cHJlc3Npb24oKSBmYWlscywgd2Ugd2lsbCBzdGlsbAotCQkgaGF2ZSBjcmVhdGVkIFUgZW50cmllcyBpbiB0aGUgc3ltYm9sIHRhYmxlIGZvciB0aGUKLQkJICdzeW1ib2xzJyBpbiB0aGUgaW5wdXQgc3RyaW5nLiAgVHJ5IG5vdCB0byBjcmVhdGUgVQotCQkgc3ltYm9scyBmb3IgcmVnaXN0ZXJzLCBldGMuICAqLwotCSAgICAgIHsKLQkJLyogVGhpcyBzdHVmZiBjaGVja3MgdG8gc2VlIGlmIHRoZSBleHByZXNzaW9uIGVuZHMgaW4KLQkJICAgKyVyZWcuICBJZiBpdCBkb2VzLCBpdCByZW1vdmVzIHRoZSByZWdpc3RlciBmcm9tCi0JCSAgIHRoZSBleHByZXNzaW9uLCBhbmQgcmUtc2V0cyAncycgdG8gcG9pbnQgdG8gdGhlCi0JCSAgIHJpZ2h0IHBsYWNlLiAgKi8KLQotCQljaGFyICpzMTsKLQotCQlmb3IgKHMxID0gczsgKnMxICYmICpzMSAhPSAnLCcgJiYgKnMxICE9ICddJzsgczErKykgOwotCi0JCWlmIChzMSAhPSBzICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzMVstMV0pKQotCQkgIHsKLQkJICAgIGlmIChzMVstMl0gPT0gJyUnICYmIHMxWy0zXSA9PSAnKycpCi0JCSAgICAgIHsKLQkJCXMxIC09IDM7Ci0JCQkqczEgPSAnXDAnOwotCQkJKHZvaWQpIGdldF9leHByZXNzaW9uIChzKTsKLQkJCSpzMSA9ICcrJzsKLQkJCXMgPSBzMTsKLQkJCWNvbnRpbnVlOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChzdHJjaHIgKCJnb2xpMDEyMzQ1Njc4OSIsIHMxWy0yXSkgJiYgczFbLTNdID09ICclJyAmJiBzMVstNF0gPT0gJysnKQotCQkgICAgICB7Ci0JCQlzMSAtPSA0OwotCQkJKnMxID0gJ1wwJzsKLQkJCSh2b2lkKSBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JCQkqczEgPSAnKyc7Ci0JCQlzID0gczE7Ci0JCQljb250aW51ZTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgKHZvaWQpIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0KLQkgICAgICAvKiBDaGVjayBmb3IgY29uc3RhbnRzIHRoYXQgZG9uJ3QgcmVxdWlyZSBlbWl0dGluZyBhIHJlbG9jLiAgKi8KLQkgICAgICBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudAotCQkgICYmIHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wgPT0gMAotCQkgICYmIHRoZV9pbnNuLmV4cC5YX29wX3N5bWJvbCA9PSAwKQotCQl7Ci0JCSAgLyogRm9yIHBjLXJlbGF0aXZlIGNhbGwgaW5zdHJ1Y3Rpb25zLCB3ZSByZWplY3QKLQkJICAgICBjb25zdGFudHMgdG8gZ2V0IGJldHRlciBjb2RlLiAgKi8KLQkJICBpZiAodGhlX2luc24ucGNyZWwKLQkJICAgICAgJiYgdGhlX2luc24ucmVsb2MgPT0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyCi0JCSAgICAgICYmIGluX3NpZ25lZF9yYW5nZSAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciwgMHgzZmZmKSkKLQkJICAgIHsKLQkJICAgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogUEMtcmVsYXRpdmUgb3BlcmFuZCBjYW4ndCBiZSBhIGNvbnN0YW50Iik7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0KLQkJICAvKiBDb25zdGFudHMgdGhhdCB3b24ndCBmaXQgYXJlIGNoZWNrZWQgaW4gbWRfYXBwbHlfZml4MwotCQkgICAgIGFuZCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLgotCQkgICAgID8/PyBJdCB3b3VsZCBiZSBwcmVmZXJhYmxlIHRvIGluc3RhbGwgdGhlIGNvbnN0YW50cwotCQkgICAgIGludG8gdGhlIGluc24gaGVyZSBhbmQgc2F2ZSBoYXZpbmcgdG8gY3JlYXRlIGEgZml4UwotCQkgICAgIGZvciBlYWNoIG9uZS4gIFRoZXJlIGFscmVhZHkgZXhpc3RzIGNvZGUgdG8gaGFuZGxlCi0JCSAgICAgYWxsIHRoZSB2YXJpb3VzIGNhc2VzIChlLmcuIGluIG1kX2FwcGx5X2ZpeDMgYW5kCi0JCSAgICAgYmZkX2luc3RhbGxfcmVsb2NhdGlvbikgc28gZHVwbGljYXRpbmcgYWxsIHRoYXQgY29kZQotCQkgICAgIGhlcmUgaXNuJ3QgcmlnaHQuICAqLwotCQl9Ci0KLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdhJzoKLQkgICAgICBpZiAoKnMrKyA9PSAnYScpCi0JCXsKLQkJICBvcGNvZGUgfD0gQU5OVUw7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdBJzoKLQkgICAgICB7Ci0JCWludCBhc2kgPSAwOwotCi0JCS8qIFBhcnNlIGFuIGFzaS4gICovCi0JCWlmICgqcyA9PSAnIycpCi0JCSAgewotCQkgICAgaWYgKCEgcGFyc2Vfa2V5d29yZF9hcmcgKHNwYXJjX2VuY29kZV9hc2ksICZzLCAmYXNpKSkKLQkJICAgICAgewotCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBBU0kgbmFtZSIpOwotCQkJZ290byBlcnJvcjsKLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGlmICghIHBhcnNlX2NvbnN0X2V4cHJfYXJnICgmcywgJmFzaSkpCi0JCSAgICAgIHsKLQkJCWVycm9yX21lc3NhZ2UgPSBfKCI6IGludmFsaWQgQVNJIGV4cHJlc3Npb24iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0KLQkJICAgIGlmIChhc2kgPCAwIHx8IGFzaSA+IDI1NSkKLQkJICAgICAgewotCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBBU0kgbnVtYmVyIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9Ci0JCSAgfQotCQlvcGNvZGUgfD0gQVNJIChhc2kpOwotCQljb250aW51ZTsKLQkgICAgICB9CQkJLyogYWx0ZXJuYXRlIHNwYWNlICovCi0KLQkgICAgY2FzZSAncCc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlcHNyIiwgNCkgPT0gMCkKLQkJewotCQkgIHMgKz0gNDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3EnOgkJLyogZmxvYXRpbmcgcG9pbnQgcXVldWUgKi8KLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVmcSIsIDMpID09IDApCi0JCXsKLQkJICBzICs9IDM7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdRJzoJCS8qIGNvcHJvY2Vzc29yIHF1ZXVlICovCi0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlY3EiLCAzKSA9PSAwKQotCQl7Ci0JCSAgcyArPSAzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnUyc6Ci0JICAgICAgaWYgKHN0cmNtcCAoc3RyLCAic2V0IikgPT0gMAotCQkgIHx8IHN0cmNtcCAoc3RyLCAic2V0dXciKSA9PSAwKQotCQl7Ci0JCSAgc3BlY2lhbF9jYXNlID0gU1BFQ0lBTF9DQVNFX1NFVDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc3RyLCAic2V0c3ciKSA9PSAwKQotCQl7Ci0JCSAgc3BlY2lhbF9jYXNlID0gU1BFQ0lBTF9DQVNFX1NFVFNXOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChzdHIsICJzZXR4IikgPT0gMCkKLQkJewotCQkgIHNwZWNpYWxfY2FzZSA9IFNQRUNJQUxfQ0FTRV9TRVRYOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RybmNtcCAoc3RyLCAiZmRpdiIsIDQpID09IDApCi0JCXsKLQkJICBzcGVjaWFsX2Nhc2UgPSBTUEVDSUFMX0NBU0VfRkRJVjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ28nOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWFzaSIsIDQpICE9IDApCi0JCWJyZWFrOwotCSAgICAgIHMgKz0gNDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdzJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVmcHJzIiwgNSkgIT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgcyArPSA1OwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ0UnOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWNjciIsIDQpICE9IDApCi0JCWJyZWFrOwotCSAgICAgIHMgKz0gNDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICd0JzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiV0YnIiLCA0KSAhPSAwKQotCQlicmVhazsKLQkgICAgICBzICs9IDQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAndyc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIld2ltIiwgNCkgIT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgcyArPSA0OwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3gnOgotCSAgICAgIHsKLQkJY2hhciAqcHVzaCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJZXhwcmVzc2lvblMgZTsKLQotCQlpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotCQlleHByZXNzaW9uICgmZSk7Ci0JCWlmIChlLlhfb3AgPT0gT19jb25zdGFudCkKLQkJICB7Ci0JCSAgICBpbnQgbiA9IGUuWF9hZGRfbnVtYmVyOwotCQkgICAgaWYgKG4gIT0gZS5YX2FkZF9udW1iZXIgfHwgKG4gJiB+MHgxZmYpICE9IDApCi0JCSAgICAgIGFzX2JhZCAoXygiT1BGIGltbWVkaWF0ZSBvcGVyYW5kIG91dCBvZiByYW5nZSAoMC0weDFmZikiKSk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIG9wY29kZSB8PSBlLlhfYWRkX251bWJlciA8PCA1OwotCQkgIH0KLQkJZWxzZQotCQkgIGFzX2JhZCAoXygibm9uLWltbWVkaWF0ZSBPUEYgb3BlcmFuZCwgaWdub3JlZCIpKTsKLQkJcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJaW5wdXRfbGluZV9wb2ludGVyID0gcHVzaDsKLQkJY29udGludWU7Ci0JICAgICAgfQotCi0JICAgIGNhc2UgJ3knOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJXkiLCAyKSAhPSAwKQotCQlicmVhazsKLQkgICAgICBzICs9IDI7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAndSc6Ci0JICAgIGNhc2UgJ1UnOgotCSAgICAgIHsKLQkJLyogUGFyc2UgYSBzcGFyY2xldCBjcHJlZy4gICovCi0JCWludCBjcHJlZzsKLQkJaWYgKCEgcGFyc2Vfa2V5d29yZF9hcmcgKHNwYXJjX2VuY29kZV9zcGFyY2xldF9jcHJlZywgJnMsICZjcHJlZykpCi0JCSAgewotCQkgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBjcHJlZyBuYW1lIik7Ci0JCSAgICBnb3RvIGVycm9yOwotCQkgIH0KLQkJb3Bjb2RlIHw9ICgqYXJncyA9PSAnVScgPyBSUzEgKGNwcmVnKSA6IFJEIChjcHJlZykpOwotCQljb250aW51ZTsKLQkgICAgICB9Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19mYXRhbCAoXygiZmFpbGVkIHNhbml0eSBjaGVjay4iKSk7Ci0JICAgIH0JCQkvKiBzd2l0Y2ggb24gYXJnIGNvZGUgKi8KLQotCSAgLyogQnJlYWsgb3V0IG9mIGZvcigpIGxvb3AuICAqLwotCSAgYnJlYWs7Ci0JfQkJCS8qIGZvciBlYWNoIGFyZyB0aGF0IHdlIGV4cGVjdCAqLwotCi0gICAgZXJyb3I6Ci0gICAgICBpZiAobWF0Y2ggPT0gMCkKLQl7Ci0JICAvKiBBcmdzIGRvbid0IG1hdGNoLiAqLwotCSAgaWYgKCZpbnNuWzFdIC0gc3BhcmNfb3Bjb2RlcyA8IHNwYXJjX251bV9vcGNvZGVzCi0JICAgICAgJiYgKGluc24tPm5hbWUgPT0gaW5zblsxXS5uYW1lCi0JCSAgfHwgIXN0cmNtcCAoaW5zbi0+bmFtZSwgaW5zblsxXS5uYW1lKSkpCi0JICAgIHsKLQkgICAgICArK2luc247Ci0JICAgICAgcyA9IGFyZ3NTdGFydDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJJbGxlZ2FsIG9wZXJhbmRzJXMiKSwgZXJyb3JfbWVzc2FnZSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGhhdmUgYSBtYXRjaC4gIE5vdyBzZWUgaWYgdGhlIGFyY2hpdGVjdHVyZSBpcyBvay4gICovCi0JICBpbnQgbmVlZGVkX2FyY2hfbWFzayA9IGluc24tPmFyY2hpdGVjdHVyZTsKLQotCSAgaWYgKHY5X2FyZ19wKQotCSAgICB7Ci0JICAgICAgbmVlZGVkX2FyY2hfbWFzayAmPSB+ICgoMSA8PCBTUEFSQ19PUENPREVfQVJDSF9WOSkKLQkJCQkgICAgIHwgKDEgPDwgU1BBUkNfT1BDT0RFX0FSQ0hfVjlBKSk7Ci0JICAgICAgbmVlZGVkX2FyY2hfbWFzayB8PSAoMSA8PCBTUEFSQ19PUENPREVfQVJDSF9WOSk7Ci0JICAgIH0KLQotCSAgaWYgKG5lZWRlZF9hcmNoX21hc2sgJiBTUEFSQ19PUENPREVfU1VQUE9SVEVEIChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0JICAgIDsgLyogb2sgKi8KLQkgIC8qIENhbiB3ZSBidW1wIHVwIHRoZSBhcmNoaXRlY3R1cmU/ICAqLwotCSAgZWxzZSBpZiAobmVlZGVkX2FyY2hfbWFzayAmIFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKG1heF9hcmNoaXRlY3R1cmUpKQotCSAgICB7Ci0JICAgICAgZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgbmVlZGVkX2FyY2hpdGVjdHVyZSA9Ci0JCXNwYXJjX2ZmcyAoU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAobWF4X2FyY2hpdGVjdHVyZSkKLQkJCSAgICYgbmVlZGVkX2FyY2hfbWFzayk7Ci0KLQkgICAgICBhc3NlcnQgKG5lZWRlZF9hcmNoaXRlY3R1cmUgPD0gU1BBUkNfT1BDT0RFX0FSQ0hfTUFYKTsKLQkgICAgICBpZiAod2Fybl9vbl9idW1wCi0JCSAgJiYgbmVlZGVkX2FyY2hpdGVjdHVyZSA+IHdhcm5fYWZ0ZXJfYXJjaGl0ZWN0dXJlKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiYXJjaGl0ZWN0dXJlIGJ1bXBlZCBmcm9tIFwiJXNcIiB0byBcIiVzXCIgb24gXCIlc1wiIiksCi0JCQkgICBzcGFyY19vcGNvZGVfYXJjaHNbY3VycmVudF9hcmNoaXRlY3R1cmVdLm5hbWUsCi0JCQkgICBzcGFyY19vcGNvZGVfYXJjaHNbbmVlZGVkX2FyY2hpdGVjdHVyZV0ubmFtZSwKLQkJCSAgIHN0cik7Ci0JCSAgd2Fybl9hZnRlcl9hcmNoaXRlY3R1cmUgPSBuZWVkZWRfYXJjaGl0ZWN0dXJlOwotCQl9Ci0JICAgICAgY3VycmVudF9hcmNoaXRlY3R1cmUgPSBuZWVkZWRfYXJjaGl0ZWN0dXJlOwotCSAgICB9Ci0JICAvKiBDb25mbGljdC4gICovCi0JICAvKiA/Pz8gVGhpcyBzZWVtcyB0byBiZSBhIGJpdCBmcmFnaWxlLiAgV2hhdCBpZiB0aGUgbmV4dCBlbnRyeSBpbgotCSAgICAgdGhlIG9wY29kZSB0YWJsZSBpcyB0aGUgb25lIHdlIHdhbnQgYW5kIGl0IGlzIHN1cHBvcnRlZD8KLQkgICAgIEl0IGlzIHBvc3NpYmxlIHRvIGFycmFuZ2UgdGhlIHRhYmxlIHRvZGF5IHNvIHRoYXQgdGhpcyBjYW4ndAotCSAgICAgaGFwcGVuIGJ1dCB3aGF0IGFib3V0IHRvbW9ycm93PyAgKi8KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBhcmNoLHByaW50ZWRfb25lX3AgPSAwOwotCSAgICAgIGNoYXIgKnA7Ci0JICAgICAgY2hhciByZXF1aXJlZF9hcmNoc1tTUEFSQ19PUENPREVfQVJDSF9NQVggKiAxNl07Ci0KLQkgICAgICAvKiBDcmVhdGUgYSBsaXN0IG9mIHRoZSBhcmNoaXRlY3R1cmVzIHRoYXQgc3VwcG9ydCB0aGUgaW5zbi4gICovCi0JICAgICAgbmVlZGVkX2FyY2hfbWFzayAmPSB+IFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKG1heF9hcmNoaXRlY3R1cmUpOwotCSAgICAgIHAgPSByZXF1aXJlZF9hcmNoczsKLQkgICAgICBhcmNoID0gc3BhcmNfZmZzIChuZWVkZWRfYXJjaF9tYXNrKTsKLQkgICAgICB3aGlsZSAoKDEgPDwgYXJjaCkgPD0gbmVlZGVkX2FyY2hfbWFzaykKLQkJewotCQkgIGlmICgoMSA8PCBhcmNoKSAmIG5lZWRlZF9hcmNoX21hc2spCi0JCSAgICB7Ci0JCSAgICAgIGlmIChwcmludGVkX29uZV9wKQotCQkJKnArKyA9ICd8JzsKLQkJICAgICAgc3RyY3B5IChwLCBzcGFyY19vcGNvZGVfYXJjaHNbYXJjaF0ubmFtZSk7Ci0JCSAgICAgIHAgKz0gc3RybGVuIChwKTsKLQkJICAgICAgcHJpbnRlZF9vbmVfcCA9IDE7Ci0JCSAgICB9Ci0JCSAgKythcmNoOwotCQl9Ci0KLQkgICAgICBhc19iYWQgKF8oIkFyY2hpdGVjdHVyZSBtaXNtYXRjaCBvbiBcIiVzXCIuIiksIHN0cik7Ci0JICAgICAgYXNfdHNrdHNrIChfKCIgKFJlcXVpcmVzICVzOyByZXF1ZXN0ZWQgYXJjaGl0ZWN0dXJlIGlzICVzLikiKSwKLQkJCSByZXF1aXJlZF9hcmNocywKLQkJCSBzcGFyY19vcGNvZGVfYXJjaHNbbWF4X2FyY2hpdGVjdHVyZV0ubmFtZSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfSAvKiBpZiBubyBtYXRjaCAqLwotCi0gICAgICBicmVhazsKLSAgICB9IC8qIGZvcmV2ZXIgbG9va2luZyBmb3IgYSBtYXRjaCAqLwotCi0gIHRoZV9pbnNuLm9wY29kZSA9IG9wY29kZTsKLX0KLQotLyogUGFyc2UgYW4gYXJndW1lbnQgdGhhdCBjYW4gYmUgZXhwcmVzc2VkIGFzIGEga2V5d29yZC4KLSAgIChlZzogI1N0b3JlU3RvcmUgb3IgJWNjZnIpLgotICAgVGhlIHJlc3VsdCBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzLgotICAgSWYgc3VjY2Vzc2Z1bCwgSU5QVVRfUE9JTlRFUiBpcyB1cGRhdGVkLiAgKi8KLQotc3RhdGljIGludAotcGFyc2Vfa2V5d29yZF9hcmcgKGxvb2t1cF9mbiwgaW5wdXRfcG9pbnRlclAsIHZhbHVlUCkKLSAgICAgaW50ICgqbG9va3VwX2ZuKSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLSAgICAgY2hhciAqKmlucHV0X3BvaW50ZXJQOwotICAgICBpbnQgKnZhbHVlUDsKLXsKLSAgaW50IHZhbHVlOwotICBjaGFyIGMsICpwLCAqcTsKLQotICBwID0gKmlucHV0X3BvaW50ZXJQOwotICBmb3IgKHEgPSBwICsgKCpwID09ICcjJyB8fCAqcCA9PSAnJScpOwotICAgICAgIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcSkgfHwgKnEgPT0gJ18nOwotICAgICAgICsrcSkKLSAgICBjb250aW51ZTsKLSAgYyA9ICpxOwotICAqcSA9IDA7Ci0gIHZhbHVlID0gKCpsb29rdXBfZm4pIChwKTsKLSAgKnEgPSBjOwotICBpZiAodmFsdWUgPT0gLTEpCi0gICAgcmV0dXJuIDA7Ci0gICp2YWx1ZVAgPSB2YWx1ZTsKLSAgKmlucHV0X3BvaW50ZXJQID0gcTsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFBhcnNlIGFuIGFyZ3VtZW50IHRoYXQgaXMgYSBjb25zdGFudCBleHByZXNzaW9uLgotICAgVGhlIHJlc3VsdCBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzLiAgKi8KLQotc3RhdGljIGludAotcGFyc2VfY29uc3RfZXhwcl9hcmcgKGlucHV0X3BvaW50ZXJQLCB2YWx1ZVApCi0gICAgIGNoYXIgKippbnB1dF9wb2ludGVyUDsKLSAgICAgaW50ICp2YWx1ZVA7Ci17Ci0gIGNoYXIgKnNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSAqaW5wdXRfcG9pbnRlclA7Ci0gIC8qIFRoZSBuZXh0IGV4cHJlc3Npb24gbWF5IGJlIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgY29uc3RhbnQKLSAgICAgKHNheSBpZiB3ZSdyZSBub3QgcHJvY2Vzc2luZyB0aGUgcmlnaHQgdmFyaWFudCBvZiB0aGUgaW5zbikuCi0gICAgIERvbid0IGNhbGwgZXhwcmVzc2lvbiB1bmxlc3Mgd2UncmUgc3VyZSBpdCB3aWxsIHN1Y2NlZWQgYXMgaXQgd2lsbAotICAgICBzaWduYWwgYW4gZXJyb3IgKHdoaWNoIHdlIHdhbnQgdG8gZGVmZXIgdW50aWwgbGF0ZXIpLiAgKi8KLSAgLyogRklYTUU6IEl0IG1pZ2h0IGJlIGJldHRlciB0byBkZWZpbmUgbWRfb3BlcmFuZCBhbmQgaGF2ZSBpdCByZWNvZ25pemUKLSAgICAgdGhpbmdzIGxpa2UgJWFzaSwgZXRjLiBidXQgY29udGludWluZyB0aGF0IHJvdXRlIHRocm91Z2ggdG8gdGhlIGVuZAotICAgICBpcyBhIGxvdCBvZiB3b3JrLiAgKi8KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyUnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGV4cHJlc3Npb24gKCZleHApOwotICAqaW5wdXRfcG9pbnRlclAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHJldHVybiAwOwotICAqdmFsdWVQID0gZXhwLlhfYWRkX251bWJlcjsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2Ygc3BhcmNfaXAgdG8gcGFyc2UgYW4gZXhwcmVzc2lvbi4gICovCi0KLXN0YXRpYyBpbnQKLWdldF9leHByZXNzaW9uIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqc2F2ZV9pbjsKLSAgc2VnVCBzZWc7Ci0KLSAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotICBzZWcgPSBleHByZXNzaW9uICgmdGhlX2luc24uZXhwKTsKLSAgaWYgKHNlZyAhPSBhYnNvbHV0ZV9zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gdGV4dF9zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gZGF0YV9zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gYnNzX3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSB1bmRlZmluZWRfc2VjdGlvbikKLSAgICB7Ci0gICAgICB0aGVfaW5zbi5lcnJvciA9IF8oImJhZCBzZWdtZW50Iik7Ci0gICAgICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICByZXR1cm4gMDsKLX0KLQotLyogU3Vicm91dGluZSBvZiBtZF9hc3NlbWJsZSB0byBvdXRwdXQgb25lIGluc24uICAqLwotCi1zdGF0aWMgdm9pZAotb3V0cHV0X2luc24gKGluc24sIHRoZV9pbnNuKQotICAgICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICppbnNuOwotICAgICBzdHJ1Y3Qgc3BhcmNfaXQgKnRoZV9pbnNuOwotewotICBjaGFyICp0b1AgPSBmcmFnX21vcmUgKDQpOwotCi0gIC8qIHB1dCBvdXQgdGhlIG9wY29kZSAqLwotICBpZiAoSU5TTl9CSUdfRU5ESUFOKQotICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKHRvUCwgKHZhbHVlVCkgdGhlX2luc24tPm9wY29kZSwgNCk7Ci0gIGVsc2UKLSAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuICh0b1AsICh2YWx1ZVQpIHRoZV9pbnNuLT5vcGNvZGUsIDQpOwotCi0gIC8qIHB1dCBvdXQgdGhlIHN5bWJvbC1kZXBlbmRlbnQgc3R1ZmYgKi8KLSAgaWYgKHRoZV9pbnNuLT5yZWxvYyAhPSBCRkRfUkVMT0NfTk9ORSkKLSAgICB7Ci0gICAgICBmaXhTICpmaXhQID0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywJLyogd2hpY2ggZnJhZyAqLwotCQkJCSAodG9QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpLAkvKiB3aGVyZSAqLwotCQkJCSA0LAkJLyogc2l6ZSAqLwotCQkJCSAmdGhlX2luc24tPmV4cCwKLQkJCQkgdGhlX2luc24tPnBjcmVsLAotCQkJCSB0aGVfaW5zbi0+cmVsb2MpOwotICAgICAgLyogVHVybiBvZmYgb3ZlcmZsb3cgY2hlY2tpbmcgaW4gZml4dXBfc2VnbWVudC4gIFdlJ2xsIGRvIG91cgotCSBvd24gb3ZlcmZsb3cgY2hlY2tpbmcgaW4gbWRfYXBwbHlfZml4My4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UKLQkgdGhlIGluc24gc2l6ZSBpcyA0IGFuZCBmaXh1cF9zZWdtZW50IHdpbGwgc2lnbmFsIGFuIG92ZXJmbG93IGZvcgotCSBsYXJnZSA4IGJ5dGUgcXVhbnRpdGllcy4gICovCi0gICAgICBmaXhQLT5meF9ub19vdmVyZmxvdyA9IDE7Ci0gICAgfQotCi0gIGxhc3RfaW5zbiA9IGluc247Ci0gIGxhc3Rfb3Bjb2RlID0gdGhlX2luc24tPm9wY29kZTsKLX0KLQwKLS8qCi0gIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBtZF9hdG9mIGluIG02OGsuYy4gIEkgdGhpbmsgdGhpcyBpcyByaWdodCwKLSAgYnV0IEknbSBub3Qgc3VyZS4KLQotICBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICAqLwotCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgaSxwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIGNoYXIgKnQ7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCSAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQl9Ci0gICAgfQotICAgICAKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFdyaXRlIGEgdmFsdWUgb3V0IHRvIHRoZSBvYmplY3QgZmlsZSwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCi0gICBlbmRpYW5uZXNzLiAgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLSAgZWxzZSBpZiAodGFyZ2V0X2xpdHRsZV9lbmRpYW5fZGF0YQotCSAgICYmICgobiA9PSA0IHx8IG4gPT0gMikgJiYgfm5vd19zZWctPmZsYWdzICYgU0VDX0FMTE9DKSkKLSAgICAvKiBPdXRwdXQgZGVidWcgd29yZHMsIHdoaWNoIGFyZSBub3QgaW4gYWxsb2NhdGVkIHNlY3Rpb25zLCBhcyBiaWcgZW5kaWFuICovCi0gICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotICBlbHNlIGlmICh0YXJnZXRfbGl0dGxlX2VuZGlhbl9kYXRhIHx8ICEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotDAotLyogQXBwbHkgYSBmaXhTIHRvIHRoZSBmcmFncywgbm93IHRoYXQgd2Uga25vdyB0aGUgdmFsdWUgaXQgb3VnaHQgdG8KLSAgIGhvbGQuICovCi0KLWludAotbWRfYXBwbHlfZml4MyAoZml4UCwgdmFsdWUsIHNlZ21lbnQpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFsdWU7Ci0gICAgIHNlZ1Qgc2VnbWVudDsKLXsKLSAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotICBvZmZzZXRUIHZhbDsKLSAgbG9uZyBpbnNuOwotCi0gIHZhbCA9ICp2YWx1ZTsKLQotICBhc3NlcnQgKGZpeFAtPmZ4X3JfdHlwZSA8IEJGRF9SRUxPQ19VTlVTRUQpOwotCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbDsJLyogUmVtZW1iZXIgdmFsdWUgZm9yIGVtaXRfcmVsb2MgKi8KLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogRklYTUU6IFNQQVJDIEVMRiByZWxvY2F0aW9ucyBkb24ndCB1c2UgYW4gYWRkZW5kIGluIHRoZSBkYXRhCi0gICAgIGZpZWxkIGl0c2VsZi4gIFRoaXMgd2hvbGUgYXBwcm9hY2ggc2hvdWxkIGJlIHNvbWVob3cgY29tYmluZWQKLSAgICAgd2l0aCB0aGUgY2FsbHMgdG8gYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4gIEFsc28sIHRoZSB2YWx1ZSBwYXNzZWQKLSAgICAgaW4gYnkgZml4dXBfc2VnbWVudCBpbmNsdWRlcyB0aGUgdmFsdWUgb2YgYSBkZWZpbmVkIHN5bWJvbC4gIFdlCi0gICAgIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgdmFsdWUgb2YgYW4gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbC4gICovCi0gIGlmIChmaXhQLT5meF9hZGRzeSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChmaXhQLT5meF9hZGRzeS0+c3lfdXNlZF9pbl9yZWxvYwotCSAgJiYgKFNfSVNfRVhURVJOQUwgKGZpeFAtPmZ4X2FkZHN5KQotCSAgICAgIHx8IFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpCi0JICAgICAgfHwgKHNwYXJjX3BpY19jb2RlICYmICEgZml4UC0+ZnhfcGNyZWwpCi0JICAgICAgfHwgKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWdtZW50Ci0JCSAgJiYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwKLQkJCQkJICAgICAgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpKQotCQkgICAgICAgJiBTRUNfTElOS19PTkNFKSAhPSAwCi0JCSAgICAgIHx8IHN0cm5jbXAgKHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpKSwKLQkJCQkgICIuZ251LmxpbmtvbmNlIiwKLQkJCQkgIHNpemVvZiAiLmdudS5saW5rb25jZSIgLSAxKSA9PSAwKSkpCi0JICAmJiBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gYWJzb2x1dGVfc2VjdGlvbgotCSAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IHVuZGVmaW5lZF9zZWN0aW9uCi0JICAmJiAhIGJmZF9pc19jb21fc2VjdGlvbiAoU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpKSkKLQlmaXhQLT5meF9hZGRudW1iZXIgLT0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIFRoaXMgaXMgYSBoYWNrLiAgVGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIHdheSB0bwotICAgICBoYW5kbGUgdGhpcy4gIFByb2JhYmx5IGluIHRlcm1zIG9mIGhvd3RvIGZpZWxkcywgb25jZQotICAgICB3ZSBjYW4gbG9vayBhdCB0aGVzZSBmaXh1cHMgaW4gdGVybXMgb2YgaG93dG9zLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzJfUENSRUxfUzIgJiYgZml4UC0+ZnhfYWRkc3kpCi0gICAgdmFsICs9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLQotI2lmZGVmIE9CSl9BT1VUCi0gIC8qIEZJWE1FOiBNb3JlIHJpZGljdWxvdXMgZ2FzIHJlbG9jIGhhY2tpbmcuICBJZiB3ZSBhcmUgZ29pbmcgdG8KLSAgICAgZ2VuZXJhdGUgYSByZWxvYywgdGhlbiB3ZSBqdXN0IHdhbnQgdG8gbGV0IHRoZSByZWxvYyBhZGRlbmQgc2V0Ci0gICAgIHRoZSB2YWx1ZS4gIFdlIGRvIG5vdCB3YW50IHRvIGFsc28gc3R1ZmYgdGhlIGFkZGVuZCBpbnRvIHRoZQotICAgICBvYmplY3QgZmlsZS4gIEluY2x1ZGluZyB0aGUgYWRkZW5kIGluIHRoZSBvYmplY3QgZmlsZSB3b3JrcyB3aGVuCi0gICAgIGRvaW5nIGEgc3RhdGljIGxpbmssIGJlY2F1c2UgdGhlIGxpbmtlciB3aWxsIGlnbm9yZSB0aGUgb2JqZWN0Ci0gICAgIGZpbGUgY29udGVudHMuICBIb3dldmVyLCB0aGUgZHluYW1pYyBsaW5rZXIgZG9lcyBub3QgaWdub3JlIHRoZQotICAgICBvYmplY3QgZmlsZSBjb250ZW50cy4gICovCi0gIGlmIChmaXhQLT5meF9hZGRzeSAhPSBOVUxMCi0gICAgICAmJiBmaXhQLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyKQotICAgIHZhbCA9IDA7Ci0KLSAgLyogV2hlbiBnZW5lcmF0aW5nIFBJQyBjb2RlLCB3ZSBkbyBub3Qgd2FudCBhbiBhZGRlbmQgZm9yIGEgcmVsb2MKLSAgICAgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbC4gIFdlIGFkanVzdCBmeF9hZGRudW1iZXIgdG8gY2FuY2VsIG91dCB0aGUKLSAgICAgdmFsdWUgYWxyZWFkeSBpbmNsdWRlZCBpbiB2YWwsIGFuZCB0byBhbHNvIGNhbmNlbCBvdXQgdGhlCi0gICAgIGFkanVzdG1lbnQgd2hpY2ggYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3aWxsIGNyZWF0ZS4gICovCi0gIGlmIChzcGFyY19waWNfY29kZQotICAgICAgJiYgZml4UC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMgotICAgICAgJiYgZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotICAgICAgJiYgISBTX0lTX0NPTU1PTiAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICAmJiAoZml4UC0+ZnhfYWRkc3ktPmJzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotICAgIGZpeFAtPmZ4X2FkZG51bWJlciAtPSAyICogU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLQotICAvKiBXaGVuIGdlbmVyYXRpbmcgUElDIGNvZGUsIHdlIG5lZWQgdG8gZmlkZGxlIHRvIGdldAotICAgICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHRvIGRvIHRoZSByaWdodCB0aGluZyBmb3IgYSBQQyByZWxhdGl2ZQotICAgICByZWxvYyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sIHdoaWNoIHdlIGFyZSBnb2luZyB0byBrZWVwLiAgKi8KLSAgaWYgKHNwYXJjX3BpY19jb2RlCi0gICAgICAmJiBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyCi0gICAgICAmJiBmaXhQLT5meF9hZGRzeSAhPSBOVUxMCi0gICAgICAmJiAoU19JU19FWFRFUk5BTCAoZml4UC0+ZnhfYWRkc3kpCi0JICB8fCBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICAgICYmIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICAmJiAhIFNfSVNfQ09NTU9OIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgdmFsID0gMDsKLSAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciAtPSAyICogU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBJZiB0aGlzIGlzIGEgZGF0YSByZWxvY2F0aW9uLCBqdXN0IG91dHB1dCBWQUwuICAqLwotCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzE2KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIDIpOwotICAgIH0KLSAgZWxzZSBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMgotCSAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU1BBUkNfUkVWMzIpCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgNCk7Ci0gICAgfQotICBlbHNlIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzY0KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIDgpOwotICAgIH0KLSAgZWxzZSBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCAKLSAgICAgICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgewotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJdCdzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGFuIGluc3RydWN0aW9uLiAgKi8KLQotICAgICAgaWYgKElOU05fQklHX0VORElBTikKLQlpbnNuID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgYnVmKTsKLSAgICAgIGVsc2UKLQlpbnNuID0gYmZkX2dldGwzMiAoKHVuc2lnbmVkIGNoYXIgKikgYnVmKTsKLSAgICAKLSAgICAgIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotCXsKLQljYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTF9TMjoKLQkgIHZhbCA9IHZhbCA+PiAyOwotCSAgLyogRklYTUU6IFRoaXMgaW5jcmVtZW50LWJ5LW9uZSBkZXNlcnZlcyBhIGNvbW1lbnQgb2Ygd2h5IGl0J3MKLQkgICAgIGJlaW5nIGRvbmUhICAqLwotCSAgaWYgKCEgc3BhcmNfcGljX2NvZGUKLQkgICAgICB8fCBmaXhQLT5meF9hZGRzeSA9PSBOVUxMCi0JICAgICAgfHwgKGZpeFAtPmZ4X2FkZHN5LT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLQkgICAgKyt2YWw7Ci0JICBpbnNuIHw9IHZhbCAmIDB4M2ZmZmZmZmY7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDXzExOgotCSAgaWYgKCEgaW5fc2lnbmVkX3JhbmdlICh2YWwsIDB4N2ZmKSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgaW5zbiB8PSB2YWwgJiAweDdmZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfMTA6Ci0JICBpZiAoISBpbl9zaWduZWRfcmFuZ2UgKHZhbCwgMHgzZmYpKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICBpbnNuIHw9IHZhbCAmIDB4M2ZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ183OgotCSAgaWYgKCEgaW5fYml0ZmllbGRfcmFuZ2UgKHZhbCwgMHg3ZikpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIGluc24gfD0gdmFsICYgMHg3ZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfNjoKLQkgIGlmICghIGluX2JpdGZpZWxkX3JhbmdlICh2YWwsIDB4M2YpKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICBpbnNuIHw9IHZhbCAmIDB4M2Y7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDXzU6Ci0JICBpZiAoISBpbl9iaXRmaWVsZF9yYW5nZSAodmFsLCAweDFmKSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgaW5zbiB8PSB2YWwgJiAweDFmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE2OgotCSAgLyogRklYTUU6IHNpbXBsaWZ5ICovCi0JICBpZiAoKCh2YWwgPiAwKSAmJiAodmFsICYgfjB4M2ZmZmMpKQotCSAgICAgIHx8ICgodmFsIDwgMCkgJiYgKH4odmFsIC0gMSkgJiB+MHgzZmZmYykpKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICAvKiBGSVhNRTogVGhlICsxIGRlc2VydmVzIGEgY29tbWVudC4gICovCi0JICB2YWwgPSAodmFsID4+IDIpICsgMTsKLQkgIGluc24gfD0gKCh2YWwgJiAweGMwMDApIDw8IDYpIHwgKHZhbCAmIDB4M2ZmZik7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTk6Ci0JICAvKiBGSVhNRTogc2ltcGxpZnkgKi8KLQkgIGlmICgoKHZhbCA+IDApICYmICh2YWwgJiB+MHgxZmZmZmMpKQotCSAgICAgIHx8ICgodmFsIDwgMCkgJiYgKH4odmFsIC0gMSkgJiB+MHgxZmZmZmMpKSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgLyogRklYTUU6IFRoZSArMSBkZXNlcnZlcyBhIGNvbW1lbnQuICAqLwotCSAgdmFsID0gKHZhbCA+PiAyKSArIDE7Ci0JICBpbnNuIHw9IHZhbCAmIDB4N2ZmZmY7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0hIMjI6Ci0JICB2YWwgPSBCU1IgKHZhbCwgMzIpOwotCSAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0xNMjI6Ci0JY2FzZSBCRkRfUkVMT0NfSEkyMjoKLQkgIGlmICghZml4UC0+ZnhfYWRkc3kpCi0JICAgIHsKLQkgICAgICBpbnNuIHw9ICh2YWwgPj4gMTApICYgMHgzZmZmZmY7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBOZWVkIGNvbW1lbnQgZXhwbGFpbmluZyB3aHkgd2UgZG8gdGhpcy4gICovCi0JICAgICAgaW5zbiAmPSB+MHhmZmZmOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDMjI6Ci0JICBpZiAodmFsICYgfjB4MDAzZmZmZmYpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIGluc24gfD0gKHZhbCAmIDB4M2ZmZmZmKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfSE0xMDoKLQkgIHZhbCA9IEJTUiAodmFsLCAzMik7Ci0JICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotCi0JY2FzZSBCRkRfUkVMT0NfTE8xMDoKLQkgIGlmICghZml4UC0+ZnhfYWRkc3kpCi0JICAgIHsKLQkgICAgICBpbnNuIHw9IHZhbCAmIDB4M2ZmOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogTmVlZCBjb21tZW50IGV4cGxhaW5pbmcgd2h5IHdlIGRvIHRoaXMuICAqLwotCSAgICAgIGluc24gJj0gfjB4ZmY7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkMxMzoKLQkgIGlmICghIGluX3NpZ25lZF9yYW5nZSAodmFsLCAweDFmZmYpKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICBpbnNuIHw9IHZhbCAmIDB4MWZmZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMjoKLQkgIHZhbCA9ICh2YWwgPj4gMikgKyAxOwotCSAgLyogRkFMTFRIUk9VR0ggKi8KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19CQVNFMjI6Ci0JICBpbnNuIHw9IHZhbCAmIDB4M2ZmZmZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19INDQ6Ci0JICBpZiAoIWZpeFAtPmZ4X2FkZHN5KQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSB0dmFsID0gdmFsOwotCSAgICAgIHR2YWwgPj49IDIyOwotCSAgICAgIGluc24gfD0gdHZhbCAmIDB4M2ZmZmZmOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX000NDoKLQkgIGlmICghZml4UC0+ZnhfYWRkc3kpCi0JICAgIGluc24gfD0gKHZhbCA+PiAxMikgJiAweDNmZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfTDQ0OgotCSAgaWYgKCFmaXhQLT5meF9hZGRzeSkKLQkgICAgaW5zbiB8PSB2YWwgJiAweGZmZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfSElYMjI6Ci0JICBpZiAoIWZpeFAtPmZ4X2FkZHN5KQotCSAgICB7Ci0JICAgICAgdmFsIF49IH4gKG9mZnNldFQpIDA7Ci0JICAgICAgaW5zbiB8PSAodmFsID4+IDEwKSAmIDB4M2ZmZmZmOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0xPWDEwOgotCSAgaWYgKCFmaXhQLT5meF9hZGRzeSkKLQkgICAgaW5zbiB8PSAweDFjMDAgfCAodmFsICYgMHgzZmYpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19OT05FOgotCWRlZmF1bHQ6Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJiYWQgb3IgdW5oYW5kbGVkIHJlbG9jYXRpb24gdHlwZTogMHglMDJ4IiksCi0JCQlmaXhQLT5meF9yX3R5cGUpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoSU5TTl9CSUdfRU5ESUFOKQotCWJmZF9wdXRiMzIgKGluc24sICh1bnNpZ25lZCBjaGFyICopIGJ1Zik7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwzMiAoaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgYnVmKTsKLSAgICB9Ci0KLSAgLyogQXJlIHdlIGZpbmlzaGVkIHdpdGggdGhpcyByZWxvY2F0aW9uIG5vdz8gICovCi0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSAwICYmICFmaXhQLT5meF9wY3JlbCkKLSAgICBmaXhQLT5meF9kb25lID0gMTsKLQotICByZXR1cm4gMTsKLX0KLQotLyogVHJhbnNsYXRlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyB0byBCRkQgdGFyZ2V0Ci0gICBmb3JtYXQuICAqLwotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWxvYzsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAmZml4cC0+ZnhfYWRkc3ktPmJzeW07Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCi0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTIyOgotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTA6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUxfUzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkMxMzoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19CQVNFMTM6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfNjQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfNToKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ182OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDXzc6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfMTA6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfMTE6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfSEgyMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19ITTEwOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0xNMjI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfUENfSEgyMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19QQ19ITTEwOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX1BDX0xNMjI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfSDQ0OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX000NDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19MNDQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfSElYMjI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfTE9YMTA6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfUkVWMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgICAgY29kZSA9IGZpeHAtPmZ4X3JfdHlwZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9BT1VUKQotICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBQSUMgY29kZSwgd2UgbmVlZCB0byBnZW5lcmF0ZSBhIGRpZmZlcmVudAotICAgICBzZXQgb2YgcmVsb2NzLiAgKi8KLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgR09UX05BTUUgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSNlbHNlCi0jZGVmaW5lIEdPVF9OQU1FICJfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotI2VuZGlmCi0KLSAgaWYgKHNwYXJjX3BpY19jb2RlKQotICAgIHsKLSAgICAgIHN3aXRjaCAoY29kZSkKLQl7Ci0JY2FzZSBCRkRfUkVMT0NfMzJfUENSRUxfUzI6Ci0JICBpZiAoISBTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KQotCSAgICAgIHx8IFNfSVNfQ09NTU9OIChmaXhwLT5meF9hZGRzeSkKLQkgICAgICB8fCBTX0lTX0VYVEVSTkFMIChmaXhwLT5meF9hZGRzeSkKLQkgICAgICB8fCBTX0lTX1dFQUsgKGZpeHAtPmZ4X2FkZHN5KSkKLQkgICAgY29kZSA9IEJGRF9SRUxPQ19TUEFSQ19XUExUMzA7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ19ISTIyOgotCSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KSwgR09UX05BTUUpID09IDApCi0JICAgIGNvZGUgPSBCRkRfUkVMT0NfU1BBUkNfUEMyMjsKLQkgIGVsc2UKLQkgICAgY29kZSA9IEJGRF9SRUxPQ19TUEFSQ19HT1QyMjsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DX0xPMTA6Ci0JICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAoU19HRVRfTkFNRSAoZml4cC0+ZnhfYWRkc3kpLCBHT1RfTkFNRSkgPT0gMCkKLQkgICAgY29kZSA9IEJGRF9SRUxPQ19TUEFSQ19QQzEwOwotCSAgZWxzZQotCSAgICBjb2RlID0gQkZEX1JFTE9DX1NQQVJDX0dPVDEwOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfU1BBUkMxMzoKLQkgIGNvZGUgPSBCRkRfUkVMT0NfU1BBUkNfR09UMTM7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZiAvKiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfQU9VVCkgKi8KLQotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgY29kZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgZXhwb3J0IHJlbG9jIHR5cGUgJWQgKGAlcycpIiksCi0JCSAgICBmaXhwLT5meF9yX3R5cGUsIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChjb2RlKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogQEAgV2h5IGZ4X2FkZG51bWJlciBzb21ldGltZXMgYW5kIGZ4X29mZnNldCBvdGhlciB0aW1lcz8gICovCi0jaWZkZWYgT0JKX0FPVVQKLQotICBpZiAocmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSA9PSAwCi0gICAgICB8fCBjb2RlID09IEJGRF9SRUxPQ19TUEFSQ19QQzEwCi0gICAgICB8fCBjb2RlID09IEJGRF9SRUxPQ19TUEFSQ19QQzIyKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UgaWYgKHNwYXJjX3BpY19jb2RlCi0JICAgJiYgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMgotCSAgICYmIGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICAmJiAoU19JU19FWFRFUk5BTCAoZml4cC0+ZnhfYWRkc3kpCi0JICAgICAgIHx8IFNfSVNfV0VBSyAoZml4cC0+ZnhfYWRkc3kpKQotCSAgICYmIFNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpCi0JICAgJiYgISBTX0lTX0NPTU1PTiAoZml4cC0+ZnhfYWRkc3kpKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0IC0gcmVsb2MtPmFkZHJlc3M7Ci0KLSNlbHNlIC8qIGVsZiBvciBjb2ZmICovCi0KLSAgaWYgKHJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUgPT0gMAotICAgICAgfHwgY29kZSA9PSBCRkRfUkVMT0NfU1BBUkNfUEMxMAotICAgICAgfHwgY29kZSA9PSBCRkRfUkVMT0NfU1BBUkNfUEMyMikKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlIGlmICgoZml4cC0+ZnhfYWRkc3ktPmJzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotICAgIHJlbG9jLT5hZGRlbmQgPSAoc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBmaXhwLT5meF9hZGRudW1iZXIKLQkJICAgICArIG1kX3BjcmVsX2Zyb20gKGZpeHApKTsKLSAgZWxzZQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0jZW5kaWYKLQotICByZXR1cm4gcmVsb2M7Ci19Ci0MCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19CQkJCS8qIG1kX3VuZGVmaW5lZF9zeW1ib2woKSAqLwotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0jaWZuZGVmIE9CSl9FTEYKLSAgLyogVGhpcyBpcyBub3QgcmlnaHQgZm9yIEVMRjsgYS5vdXQgd2FudHMgaXQsIGFuZCBDT0ZGIHdpbGwgZm9yY2UKLSAgICAgdGhlIGFsaWdubWVudCBhbnl3YXlzLiAgKi8KLSAgdmFsdWVUIGFsaWduID0gKCh2YWx1ZVQpIDEKLQkJICA8PCAodmFsdWVUKSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpKTsKLSAgdmFsdWVUIG5ld3NpemU7Ci0gIC8qIHR1cm4gYWxpZ25tZW50IHZhbHVlIGludG8gYSBtYXNrICovCi0gIGFsaWduLS07Ci0gIG5ld3NpemUgPSAoc2l6ZSArIGFsaWduKSAmIH5hbGlnbjsKLSAgcmV0dXJuIG5ld3NpemU7Ci0jZWxzZQotICByZXR1cm4gc2l6ZTsKLSNlbmRpZgotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgc3BhcmMsIHRoZXkncmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIG9mZnNldCwgcGx1cwotICAgaXRzIHNpemUuICBUaGlzIGdldHMgdXMgdG8gdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbi4KLSAgICg/Pz8gSXMgdGhpcyByaWdodD8gIEZJWE1FLVNPT04pICovCi1sb25nIAotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgbG9uZyByZXQ7Ci0KLSAgcmV0ID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotICBpZiAoISBzcGFyY19waWNfY29kZQotICAgICAgfHwgZml4UC0+ZnhfYWRkc3kgPT0gTlVMTAotICAgICAgfHwgKGZpeFAtPmZ4X2FkZHN5LT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICByZXQgKz0gZml4UC0+Znhfc2l6ZTsKLSAgcmV0dXJuIHJldDsKLX0KLQwKLS8qIFJldHVybiBsb2cyIChWQUxVRSksIG9yIC0xIGlmIFZBTFVFIGlzIG5vdCBhbiBleGFjdCBwb3NpdGl2ZSBwb3dlcgotICAgb2YgdHdvLiAgKi8KLQotc3RhdGljIGludAotbG9nMiAodmFsdWUpCi0gICAgIGludCB2YWx1ZTsKLXsKLSAgaW50IHNoaWZ0OwotCi0gIGlmICh2YWx1ZSA8PSAwKQotICAgIHJldHVybiAtMTsKLQotICBmb3IgKHNoaWZ0ID0gMDsgKHZhbHVlICYgMSkgPT0gMDsgdmFsdWUgPj49IDEpCi0gICAgKytzaGlmdDsKLQotICByZXR1cm4gKHZhbHVlID09IDEpID8gc2hpZnQgOiAtMTsKLX0KLQotLyoKLSAqIHNvcnQgb2YgbGlrZSBzX2xjb21tCi0gKi8KLQotI2lmbmRlZiBPQkpfRUxGCi1zdGF0aWMgaW50IG1heF9hbGlnbm1lbnQgPSAxNTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotc19yZXNlcnZlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgYzsKLSAgaW50IGFsaWduOwotICBpbnQgc2l6ZTsKLSAgaW50IHRlbXA7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgaWYgKChzaXplID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkJTUyBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIiksIHNpemUpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGJhZCBsZW5ndGggKi8KLQotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotCi0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIsXCJic3NcIiIsIDYpICE9IDAKLSAgICAgICYmIHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIixcIi5ic3NcIiIsIDcpICE9IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgLnJlc2VydmUgc2VnbWVudCAtLSBleHBlY3RlZCBCU1Mgc2VnbWVudCIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsyXSA9PSAnLicpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDc7Ci0gIGVsc2UKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLQl7Ci0JICBhc19iYWQgKF8oIm1pc3NpbmcgYWxpZ25tZW50IikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGFsaWduID0gKGludCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSNpZm5kZWYgT0JKX0VMRgotICAgICAgaWYgKGFsaWduID4gbWF4X2FsaWdubWVudCkKLQl7Ci0JICBhbGlnbiA9IG1heF9hbGlnbm1lbnQ7Ci0JICBhc193YXJuIChfKCJhbGlnbm1lbnQgdG9vIGxhcmdlOyBhc3N1bWluZyAlZCIpLCBhbGlnbik7Ci0JfQotI2VuZGlmCi0KLSAgICAgIGlmIChhbGlnbiA8IDApCi0JewotCSAgYXNfYmFkIChfKCJuZWdhdGl2ZSBhbGlnbm1lbnQiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGFsaWduICE9IDApCi0JewotCSAgdGVtcCA9IGxvZzIgKGFsaWduKTsKLQkgIGlmICh0ZW1wIDwgMCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7Ci0JICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgYWxpZ24gPSB0ZW1wOwotCX0KLQotICAgICAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIGFsaWduKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhbGlnbiA9IDA7Ci0KLSAgaWYgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApCi0jaWZkZWYgT0JKX0FPVVQKLSAgICAgICYmIFNfR0VUX09USEVSIChzeW1ib2xQKSA9PSAwCi0gICAgICAmJiBTX0dFVF9ERVNDIChzeW1ib2xQKSA9PSAwCi0jZW5kaWYKLSAgICAgICkKLSAgICB7Ci0gICAgICBpZiAoISBuZWVkX3Bhc3NfMikKLQl7Ci0JICBjaGFyICpwZnJhZzsKLQkgIHNlZ1QgY3VycmVudF9zZWcgPSBub3dfc2VnOwotCSAgc3Vic2VnVCBjdXJyZW50X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0KLQkgIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAxKTsgLyogc3dpdGNoIHRvIGJzcyAqLwotCi0JICBpZiAoYWxpZ24pCi0JICAgIGZyYWdfYWxpZ24gKGFsaWduLCAwLCAwKTsgLyogZG8gYWxpZ25tZW50ICovCi0KLQkgIC8qIGRldGFjaCBmcm9tIG9sZCBmcmFnICovCi0JICBpZiAoU19HRVRfU0VHTUVOVChzeW1ib2xQKSA9PSBic3Nfc2VjdGlvbikKLQkgICAgc3ltYm9sUC0+c3lfZnJhZy0+ZnJfc3ltYm9sID0gTlVMTDsKLQotCSAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWdfbm93OwotCSAgcGZyYWcgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKTAsIHN5bWJvbFAsCi0JCQkgICAgKG9mZnNldFQpIHNpemUsIChjaGFyICopMCk7Ci0JICAqcGZyYWcgPSAwOwotCi0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBic3Nfc2VjdGlvbik7Ci0KLQkgIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VnLCBjdXJyZW50X3N1YnNlZyk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0JICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLSNlbmRpZgotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193YXJuKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgJXMiLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICB9CQkJCS8qIGlmIG5vdCByZWRlZmluaW5nICovCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfY29tbW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgY2hhciAqcDsKLSAgaW50IHRlbXAsIHNpemU7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAvKiBqdXN0IGFmdGVyIG5hbWUgaXMgbm93ICdcMCcgKi8KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogc2tpcCAnLCcgKi8KLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi5DT01Nb24gbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIpLCB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBzaXplID0gdGVtcDsKLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgISBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gKHZhbHVlVCkgc2l6ZSkKLQl7Ci0JICBhc193YXJuIChfKCJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlZC4iKSwKLQkJICAgU19HRVRfTkFNRSAoc3ltYm9sUCksIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksIHNpemUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWZuZGVmIE9CSl9FTEYKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBzaXplKTsKLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLSNlbmRpZgotICAgIH0KLSAga25vdyAoc3ltYm9sUC0+c3lfZnJhZyA9PSAmemVyb19hZGRyZXNzX2ZyYWcpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBjb21tb24gbGVuZ3RoIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLSAgICB7Ci0gICAgICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSNpZm5kZWYgT0JKX0VMRgotICAgICAgaWYgKHRlbXAgPiBtYXhfYWxpZ25tZW50KQotCXsKLQkgIHRlbXAgPSBtYXhfYWxpZ25tZW50OwotCSAgYXNfd2FybiAoXygiYWxpZ25tZW50IHRvbyBsYXJnZTsgYXNzdW1pbmcgJWQiKSwgdGVtcCk7Ci0JfQotI2VuZGlmCi0KLSAgICAgIGlmICh0ZW1wIDwgMCkKLQl7Ci0JICBhc19iYWQgKF8oIm5lZ2F0aXZlIGFsaWdubWVudCIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0jaWZkZWYgT0JKX0VMRgotICAgICAgaWYgKHN5bWJvbFAtPmxvY2FsKQotCXsKLQkgIHNlZ1Qgb2xkX3NlYzsKLQkgIGludCBvbGRfc3Vic2VjOwotCSAgY2hhciAqcDsKLQkgIGludCBhbGlnbjsKLQotCSAgb2xkX3NlYyA9IG5vd19zZWc7Ci0JICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKLQotCSAgaWYgKHRlbXAgPT0gMCkKLQkgICAgYWxpZ24gPSAwOwotCSAgZWxzZQotCSAgICBhbGlnbiA9IGxvZzIgKHRlbXApOwotCi0JICBpZiAoYWxpZ24gPCAwKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VjdGlvbiwgYWxpZ24pOwotCSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIDApOwotCSAgaWYgKGFsaWduKQotCSAgICBmcmFnX2FsaWduIChhbGlnbiwgMCwgMCk7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gYnNzX3NlY3Rpb24pCi0JICAgIHN5bWJvbFAtPnN5X2ZyYWctPmZyX3N5bWJvbCA9IDA7Ci0JICBzeW1ib2xQLT5zeV9mcmFnID0gZnJhZ19ub3c7Ci0JICBwID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgc3ltYm9sUCwKLQkJCShvZmZzZXRUKSBzaXplLCAoY2hhciAqKSAwKTsKLQkgICpwID0gMDsKLQkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJzc19zZWN0aW9uKTsKLQkgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgU19TRVRfU0laRSAoc3ltYm9sUCwgc2l6ZSk7Ci0JICBzdWJzZWdfc2V0IChvbGRfc2VjLCBvbGRfc3Vic2VjKTsKLQl9Ci0gICAgICBlbHNlCi0jZW5kaWYgLyogT0JKX0VMRiAqLwotCXsKLQlhbGxvY2F0ZV9jb21tb246Ci0JICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgc2l6ZSk7Ci0jaWZkZWYgT0JKX0VMRgotCSAgU19TRVRfQUxJR04gKHN5bWJvbFAsIHRlbXApOwotCSAgU19TRVRfU0laRSAoc3ltYm9sUCwgc2l6ZSk7Ci0jZW5kaWYKLQkgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJmZF9jb21fc2VjdGlvbl9wdHIpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIC8qIEBAIFNvbWUgdXNlIHRoZSBkb3QsIHNvbWUgZG9uJ3QuICBDYW4gd2UgZ2V0IHNvbWUgY29uc2lzdGVuY3k/PyAgKi8KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcuJykKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIC8qIEBAIFNvbWUgc2F5IGRhdGEsIHNvbWUgc2F5IGJzcy4gICovCi0gICAgICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiYnNzXCIiLCA0KQotCSAgJiYgc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiZGF0YVwiIiwgNSkpCi0JewotCSAgd2hpbGUgKCotLWlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0JICAgIDsKLQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotCSAgZ290byBiYWRfY29tbW9uX3NlZ21lbnQ7Ci0JfQotICAgICAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnIicpCi0JOwotICAgICAgZ290byBhbGxvY2F0ZV9jb21tb247Ci0gICAgfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBzeW1ib2xQLT5ic3ltLT5mbGFncyB8PSBCU0ZfT0JKRUNUOwotI2VuZGlmCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcmV0dXJuOwotCi0gIHsKLSAgYmFkX2NvbW1vbl9zZWdtZW50OgotICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgd2hpbGUgKCpwICYmICpwICE9ICdcbicpCi0gICAgICBwKys7Ci0gICAgYyA9ICpwOwotICAgICpwID0gJ1wwJzsKLSAgICBhc19iYWQgKF8oImJhZCAuY29tbW9uIHNlZ21lbnQgJXMiKSwgaW5wdXRfbGluZV9wb2ludGVyICsgMSk7Ci0gICAgKnAgPSBjOwotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0gICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotLyogSGFuZGxlIHRoZSAuZW1wdHkgcHNldWRvLW9wLiAgVGhpcyBzdXByZXNzZXMgdGhlIHdhcm5pbmdzIGFib3V0Ci0gICBpbnZhbGlkIGRlbGF5IHNsb3QgdXNhZ2UuICAqLwotCi1zdGF0aWMgdm9pZAotc19lbXB0eSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiBUaGUgZWFzeSB3YXkgdG8gaW1wbGVtZW50IGlzIHRvIGp1c3QgZm9yZ2V0IGFib3V0IHRoZSBsYXN0Ci0gICAgIGluc3RydWN0aW9uLiAgKi8KLSAgbGFzdF9pbnNuID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLXNfc2VnIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0KLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIlwidGV4dFwiIiwgNikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKLSAgICAgIHNfdGV4dCAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiXCJkYXRhXCIiLCA2KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA2OwotICAgICAgc19kYXRhICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJcImRhdGExXCIiLCA3KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA3OwotICAgICAgc19kYXRhMSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJcImJzc1wiIiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLSAgICAgIC8qIFdlIG9ubHkgc3VwcG9ydCAyIHNlZ21lbnRzIC0tIHRleHQgYW5kIGRhdGEgLS0gZm9yIG5vdywgc28KLQkgdGhpbmdzIGluIHRoZSAiYnNzIHNlZ21lbnQiIHdpbGwgaGF2ZSB0byBnbyBpbnRvIGRhdGEgZm9yIG5vdy4KLQkgWW91IGNhbiBzdGlsbCBhbGxvY2F0ZSBTRUdfQlNTIHN0dWZmIHdpdGggLmxjb21tIG9yIC5yZXNlcnZlLiAqLwotICAgICAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCAyNTUpOwkvKiBGSVhNRS1TT01FREFZICovCi0gICAgICByZXR1cm47Ci0gICAgfQotICBhc19iYWQgKF8oIlVua25vd24gc2VnbWVudCB0eXBlIikpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19kYXRhMSAoKQotewotICBzdWJzZWdfc2V0IChkYXRhX3NlY3Rpb24sIDEpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19wcm9jIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci19Ci0KLS8qIFRoaXMgc3RhdGljIHZhcmlhYmxlIGlzIHNldCBieSBzX3VhY29ucyB0byB0ZWxsIHNwYXJjX2NvbnNfYWxpZ24KLSAgIHRoYXQgdGhlIGV4cGVzc2lvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIGFsaWduZWQuICAqLwotCi1zdGF0aWMgaW50IHNwYXJjX25vX2FsaWduX2NvbnMgPSAwOwotCi0vKiBUaGlzIGhhbmRsZXMgdGhlIHVuYWxpZ25lZCBzcGFjZSBhbGxvY2F0aW9uIHBzZXVkby1vcHMsIHN1Y2ggYXMKLSAgIC51YXdvcmQuICAudWF3b3JkIGlzIGp1c3QgbGlrZSAud29yZCwgYnV0IHRoZSB2YWx1ZSBkb2VzIG5vdCBuZWVkCi0gICB0byBiZSBhbGlnbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfdWFjb25zIChieXRlcykKLSAgICAgaW50IGJ5dGVzOwotewotICAvKiBUZWxsIHNwYXJjX2NvbnNfYWxpZ24gbm90IHRvIGFsaWduIHRoaXMgdmFsdWUuICAqLwotICBzcGFyY19ub19hbGlnbl9jb25zID0gMTsKLSAgY29ucyAoYnl0ZXMpOwotfQotCi0vKiBJZiB0aGUgLS1lbmZvcmNlLWFsaWduZWQtZGF0YSBvcHRpb24gaXMgdXNlZCwgd2UgcmVxdWlyZSAud29yZCwKLSAgIGV0LiBhbC4sIHRvIGJlIGFsaWduZWQgY29ycmVjdGx5LiAgV2UgZG8gaXQgYnkgc2V0dGluZyB1cCBhbgotICAgcnNfYWxpZ25fY29kZSBmcmFnLCBhbmQgY2hlY2tpbmcgaW4gSEFORExFX0FMSUdOIHRvIG1ha2Ugc3VyZSB0aGF0Ci0gICBubyB1bmV4cGVjdGVkIGFsaWdubWVudCB3YXMgaW50cm9kdWNlZC4KLQotICAgVGhlIFN1bk9TIGFuZCBTb2xhcmlzIG5hdGl2ZSBhc3NlbWJsZXJzIGVuZm9yY2UgYWxpZ25lZCBkYXRhIGJ5Ci0gICBkZWZhdWx0LiAgV2UgZG9uJ3Qgd2FudCB0byBkbyB0aGF0LCBiZWNhdXNlIGdjYyBjYW4gZGVsaWJlcmF0ZWx5Ci0gICBnZW5lcmF0ZSBtaXNhbGlnbmVkIGRhdGEgaWYgdGhlIHBhY2tlZCBhdHRyaWJ1dGUgaXMgdXNlZC4gIEluc3RlYWQsCi0gICB3ZSBwZXJtaXQgbWlzYWxpZ25lZCBkYXRhIGJ5IGRlZmF1bHQsIGFuZCBwZXJtaXQgdGhlIHVzZXIgdG8gc2V0IGFuCi0gICBvcHRpb24gdG8gY2hlY2sgZm9yIGl0LiAgKi8KLQotdm9pZAotc3BhcmNfY29uc19hbGlnbiAobmJ5dGVzKQotICAgICBpbnQgbmJ5dGVzOwotewotICBpbnQgbmFsaWduOwotICBjaGFyICpwOwotCi0gIC8qIE9ubHkgZG8gdGhpcyBpZiB3ZSBhcmUgZW5mb3JjaW5nIGFsaWduZWQgZGF0YS4gICovCi0gIGlmICghIGVuZm9yY2VfYWxpZ25lZF9kYXRhKQotICAgIHJldHVybjsKLQotICBpZiAoc3BhcmNfbm9fYWxpZ25fY29ucykKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGFuIHVuYWxpZ25lZCBwc2V1ZG8tb3AuICAqLwotICAgICAgc3BhcmNfbm9fYWxpZ25fY29ucyA9IDA7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbGlnbiA9IGxvZzIgKG5ieXRlcyk7Ci0gIGlmIChuYWxpZ24gPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgYXNzZXJ0IChuYWxpZ24gPiAwKTsKLQotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGlmICgoYWJzX3NlY3Rpb25fb2Zmc2V0ICYgKCgxIDw8IG5hbGlnbikgLSAxKSkgIT0gMCkKLQlhc19iYWQgKF8oIm1pc2FsaWduZWQgZGF0YSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgcCA9IGZyYWdfdmFyIChyc19hbGlnbl9jb2RlLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLAotCQkoc3ltYm9sUyAqKSBOVUxMLCAob2Zmc2V0VCkgbmFsaWduLCAoY2hhciAqKSBOVUxMKTsKLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCBuYWxpZ24pOwotfQotCi0vKiBUaGlzIGlzIHdoZXJlIHdlIGRvIHRoZSB1bmV4cGVjdGVkIGFsaWdubWVudCBjaGVjay4KLSAgIFRoaXMgaXMgY2FsbGVkIGZyb20gSEFORExFX0FMSUdOIGluIHRjLXNwYXJjLmguICAqLwotCi12b2lkCi1zcGFyY19oYW5kbGVfYWxpZ24gKGZyYWdwKQotICAgICBmcmFnUyAqZnJhZ3A7Ci17Ci0gIGlmIChmcmFncC0+ZnJfdHlwZSA9PSByc19hbGlnbl9jb2RlICYmICFmcmFncC0+ZnJfc3VidHlwZQotICAgICAgJiYgZnJhZ3AtPmZyX25leHQtPmZyX2FkZHJlc3MgLSBmcmFncC0+ZnJfYWRkcmVzcyAtIGZyYWdwLT5mcl9maXggIT0gMCkKLSAgICBhc19iYWRfd2hlcmUgKGZyYWdwLT5mcl9maWxlLCBmcmFncC0+ZnJfbGluZSwgXygibWlzYWxpZ25lZCBkYXRhIikpOwotICBpZiAoZnJhZ3AtPmZyX3R5cGUgPT0gcnNfYWxpZ25fY29kZSAmJiBmcmFncC0+ZnJfc3VidHlwZSA9PSAxMDI0KQotICAgIHsKLSAgICAgIGludCBjb3VudCA9IGZyYWdwLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZ3AtPmZyX2FkZHJlc3MgLSBmcmFncC0+ZnJfZml4OwotICAgICAgCi0gICAgICBpZiAoY291bnQgPj0gNAotCSAgJiYgIShjb3VudCAmIDMpCi0JICAmJiBjb3VudCA8PSAxMDI0Ci0JICAmJiAhKChsb25nKShmcmFncC0+ZnJfbGl0ZXJhbCArIGZyYWdwLT5mcl9maXgpICYgMykpCi0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCAqcCA9ICh1bnNpZ25lZCAqKShmcmFncC0+ZnJfbGl0ZXJhbCArIGZyYWdwLT5mcl9maXgpOwotICAgICAgICAgIGludCBpOwotICAgICAgICAgIAotICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSArPSA0LCBwKyspCi0gICAgICAgICAgICBpZiAoSU5TTl9CSUdfRU5ESUFOKQotICAgICAgICAgICAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuICgoY2hhciAqKXAsIDB4MDEwMDAwMDAsIDQpOyAvKiBlbWl0IG5vcHMgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoKGNoYXIgKilwLCAweDEwMDAwMDAwLCA0KTsKLQotICAgICAgICAgIGlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSAmJiBjb3VudCA+IDgpCi0gICAgICAgICAgICB7Ci0JICAgICAgY2hhciAqd2FkZHIgPSAmZnJhZ3AtPmZyX2xpdGVyYWxbZnJhZ3AtPmZyX2ZpeF07Ci0JICAgICAgdW5zaWduZWQgd3ZhbCA9ICgweDMwNjgwMDAwIHwgY291bnQgPj4gMik7IC8qIGJhLGEscHQgJXhjYywgMWYgKi8KLQkgICAgICBpZiAoSU5TTl9CSUdfRU5ESUFOKQotCQludW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuICh3YWRkciwgd3ZhbCwgNCk7Ci0JICAgICAgZWxzZQotCQludW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuICh3YWRkciwgd3ZhbCwgNCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZnJhZ3AtPmZyX3ZhciA9IGNvdW50OwotICAgICAgICB9Ci0gICAgfQotfQotCi0jaWZkZWYgT0JKX0VMRgotLyogU29tZSBzcGVjaWFsIHByb2Nlc3NpbmcgZm9yIGEgU3BhcmMgRUxGIGZpbGUuICAqLwotCi12b2lkCi1zcGFyY19lbGZfZmluYWxfcHJvY2Vzc2luZyAoKQotewotICAvKiBTZXQgdGhlIFNwYXJjIEVMRiBmbGFnIGJpdHMuICBGSVhNRTogVGhlcmUgc2hvdWxkIHByb2JhYmx5IGJlIHNvbWUKLSAgICAgc29ydCBvZiBCRkQgaW50ZXJmYWNlIGZvciB0aGlzLiAgKi8KLSAgaWYgKHNwYXJjX2FyY2hfc2l6ZSA9PSA2NCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHNwYXJjX21lbW9yeV9tb2RlbCkKLQl7Ci0JY2FzZSBNTV9STU86Ci0JICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDVjlfUk1POwotCSAgYnJlYWs7Ci0JY2FzZSBNTV9QU086Ci0JICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDVjlfUFNPOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID49IFNQQVJDX09QQ09ERV9BUkNIX1Y5KQotICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNfMzJQTFVTOwotICBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgPT0gU1BBUkNfT1BDT0RFX0FSQ0hfVjlBKQotICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNfU1VOX1VTMTsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSBlbWl0X2V4cHIgdmlhIFRDX0NPTlNfRklYX05FVyB3aGVuIGNyZWF0aW5nIGEKLSAgIHJlbG9jIGZvciBhIGNvbnMuICBXZSBjb3VsZCB1c2UgdGhlIGRlZmluaXRpb24gdGhlcmUsIGV4Y2VwdCB0aGF0Ci0gICB3ZSB3YW50IHRvIGhhbmRsZSBsaXR0bGUgZW5kaWFuIHJlbG9jcyBzcGVjaWFsbHkuICAqLwotCi12b2lkCi1jb25zX2ZpeF9uZXdfc3BhcmMgKGZyYWcsIHdoZXJlLCBuYnl0ZXMsIGV4cCkKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIGludCB3aGVyZTsKLSAgICAgdW5zaWduZWQgaW50IG5ieXRlczsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHI7Ci0KLSAgciA9IChuYnl0ZXMgPT0gMSA/IEJGRF9SRUxPQ184IDoKLSAgICAgICAobmJ5dGVzID09IDIgPyBCRkRfUkVMT0NfMTYgOgotCShuYnl0ZXMgPT0gNCA/IEJGRF9SRUxPQ18zMiA6IEJGRF9SRUxPQ182NCkpKTsKLQotICBpZiAodGFyZ2V0X2xpdHRsZV9lbmRpYW5fZGF0YSAmJiBuYnl0ZXMgPT0gNAotICAgICAgJiYgbm93X3NlZy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICAKLSAgICByID0gQkZEX1JFTE9DX1NQQVJDX1JFVjMyOwotICBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIChpbnQpIG5ieXRlcywgZXhwLCAwLCByKTsKLX0KLQotI2lmZGVmIE9CSl9FTEYKLWludAotZWxmMzJfc3BhcmNfZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKLSAgICAgIHN0cnVjdCBmaXggKmZpeHA7Ci17Ci0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMTsKLSAKLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1zcGFyYy5oIGIvZ2FzL2NvbmZpZy90Yy1zcGFyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTA1NzY0Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtc3BhcmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKiB0Yy1zcGFyYy5oIC0gTWFjcm9zIGFuZCB0eXBlIGRlZmluZXMgZm9yIHRoZSBzcGFyYy4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAtOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUKLSAgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBUQ19TUEFSQwotI2RlZmluZSBUQ19TUEFSQyAxCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBmcmFnOwotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdXNlZCB0byBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGB0YXJnZXRfYmlnX2VuZGlhbicuICAqLwotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9zcGFyYwotCi1leHRlcm4gY29uc3QgY2hhciAqc3BhcmNfdGFyZ2V0X2Zvcm1hdCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgc3BhcmNfdGFyZ2V0X2Zvcm1hdCAoKQotCi0jaWYgMAotI2lmZGVmIFRFX1NQQVJDQU9VVAotLyogQmktZW5kaWFuIHN1cHBvcnQgbWF5IGV2ZW50dWFsbHkgYmUgdW5jb25kaXRpb25hbCwgYnV0IHVudGlsIHRoaW5ncyBhcmUKLSAgIHdvcmtpbmcgd2VsbCBpdCdzIG9ubHkgcHJvdmlkZWQgZm9yIHRhcmdldHMgdGhhdCBuZWVkIGl0LiAgKi8KLSNkZWZpbmUgU1BBUkNfQklFTkRJQU4KLSNlbmRpZgotI2VuZGlmCi0vKiBNYWtlIGl0IHVuY29uZGl0aW9uYWwgYW5kIGNoZWNrIGlmIC1FTCBpcyB2YWxpZCBhZnRlciBvcHRpb24gcGFyc2luZyAqLwotI2RlZmluZSBTUEFSQ19CSUVORElBTgotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBtZF9jb252ZXJ0X2ZyYWcoYixzLGYpCQl7YXNfZmF0YWwgKF8oInNwYXJjIGNvbnZlcnRfZnJhZ1xuIikpO30KLSNkZWZpbmUgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoZixzKSBcCi0JCQkoYXNfZmF0YWwoXygiZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggY2FsbGVkIikpLDEpCi0KLSNkZWZpbmUgTElTVElOR19IRUFERVIgIlNQQVJDIEdBUyAiCi0KLWV4dGVybiBpbnQgc3BhcmNfcGljX2NvZGU7Ci0KLSNkZWZpbmUgbWRfZG9fYWxpZ24obiwgZmlsbCwgbGVuLCBtYXgsIGFyb3VuZCkJCQkJXAotaWYgKChuKSAmJiAobikgPD0gMTAgJiYgIW5lZWRfcGFzc18yICYmICEoZmlsbCkJCQkJXAotICAgICYmIG5vd19zZWcgIT0gZGF0YV9zZWN0aW9uICYmIG5vd19zZWcgIT0gYnNzX3NlY3Rpb24pCQlcCi0gIHsJCQkJCQkJCQlcCi0gICAgY2hhciAqcDsJCQkJCQkJCVwKLSAgICBwID0gZnJhZ192YXIgKHJzX2FsaWduX2NvZGUsIDEgPDwgbiwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMTAyNCwJXAotICAgICAgICAgICAgICAgICAgKHN5bWJvbFMgKikgMCwgKG9mZnNldFQpIChuKSwgKGNoYXIgKikgMCk7CQlcCi0gICAgKnAgPSAweDAwOwkJCQkJCQkJXAotICAgIGdvdG8gYXJvdW5kOwkJCQkJCQlcCi0gIH0KLQotLyogV2UgcmVxdWlyZSAud29yZCwgZXQuIGFsLiwgdG8gYmUgYWxpZ25lZCBjb3JyZWN0bHkuICAqLwotI2RlZmluZSBtZF9jb25zX2FsaWduKG5ieXRlcykgc3BhcmNfY29uc19hbGlnbiAobmJ5dGVzKQotZXh0ZXJuIHZvaWQgc3BhcmNfY29uc19hbGlnbiBQQVJBTVMgKChpbnQpKTsKLSNkZWZpbmUgSEFORExFX0FMSUdOKGZyYWdwKSBzcGFyY19oYW5kbGVfYWxpZ24gKGZyYWdwKQotZXh0ZXJuIHZvaWQgc3BhcmNfaGFuZGxlX2FsaWduIFBBUkFNUyAoKHN0cnVjdCBmcmFnICopKTsKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9BT1VUKQotCi0vKiBUaGlzIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlIGlmIHRoZSByZWxvY2F0aW9uIGlzIGZvciBhIGxvY2FsCi0gICBvYmplY3QgZm9yIHdoaWNoIHdlIHN0aWxsIHdhbnQgdG8gZG8gdGhlIHJlbG9jYXRpb24gYXQgcnVudGltZS4KLSAgIFRydWUgaWYgd2UgYXJlIHdpbGxpbmcgdG8gcGVyZm9ybSB0aGlzIHJlbG9jYXRpb24gd2hpbGUgYnVpbGRpbmcKLSAgIHRoZSAubyBmaWxlLgotCi0gICBJZiB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9sLCB0aGVuIHRoZQotICAgYS5vdXQgYXNzZW1ibGVyIHNob3VsZCBub3QgZG8gdGhlIHJlbG9jYXRpb24gaWYgZ2VuZXJhdGluZyBQSUMsIGFuZAotICAgdGhlIEVMRiBhc3NlbWJsZXIgc2hvdWxkIG5ldmVyIGRvIHRoZSByZWxvY2F0aW9uLiAgKi8KLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgb2JqX3JlbG9jYXRlX2V4dGVybiAwCi0jZWxzZQotI2RlZmluZSBvYmpfcmVsb2NhdGVfZXh0ZXJuICghIHNwYXJjX3BpY19jb2RlKQotI2VuZGlmCi0KLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkgIFwKLSAgKG9ial9yZWxvY2F0ZV9leHRlcm4gXAotICAgfHwgKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwgXAotICAgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX0NPTU1PTiAoKEZJWCktPmZ4X2FkZHN5KSkpCi0jZW5kaWYKLQotLyogSSBrbm93IHRoYXQgImNhbGwgMCIgZmFpbHMgaW4gc3BhcmMtY29mZiBpZiB0aGlzIGRvZXNuJ3QgcmV0dXJuIDEuICBJCi0gICBkb24ndCBrbm93IGFib3V0IG90aGVyIHJlbG9jYXRpb24gdHlwZXMsIG9yIG90aGVyIGZvcm1hdHMsIHlldC4gICovCi0jaWZkZWYgT0JKX0NPRkYKLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKQlcCi0JKChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiBcCi0JICYmICgoRklYUCktPmZ4X2FkZHN5ID09IDAgXAotCSAgICAgfHwgU19HRVRfU0VHTUVOVCAoKEZJWFApLT5meF9hZGRzeSkgPT0gYWJzb2x1dGVfc2VjdGlvbikpCi0jZGVmaW5lIFJFTE9DX1JFUVVJUkVTX1NZTUJPTAotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4cCkgZWxmMzJfc3BhcmNfZm9yY2VfcmVsb2NhdGlvbihmaXhwKQotZXh0ZXJuIGludCBlbGYzMl9zcGFyY19mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotI2VuZGlmCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKLQotI2lmZGVmIE9CSl9FTEYKLS8qIEtlZXAgcmVsb2NhdGlvbnMgYWdhaW5zdCBnbG9iYWwgc3ltYm9scy4gIERvbid0IHR1cm4gdGhlbSBpbnRvCi0gICByZWxvY2F0aW9ucyBhZ2FpbnN0IHNlY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIGR5bmFtaWMKLSAgIGxpbmtlciB0byBvcGVyYXRlIHByb3Blcmx5LiAgV2hlbiBnZW5lcmF0aW5nIFBJQywgd2UgbmVlZCB0byBrZWVwCi0gICBhbnkgbm9uIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYKQkJCQkJCVwKLSAgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KQkJCQkJXAotICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkJCQkJCVwKLSAgICYmICghIHNwYXJjX3BpY19jb2RlCQkJCQkJCVwKLSAgICAgICB8fCAoRklYKS0+ZnhfcGNyZWwJCQkJCQlcCi0gICAgICAgfHwgKChGSVgpLT5meF9zdWJzeSAhPSBOVUxMCQkJCQlcCi0JICAgJiYgKFNfR0VUX1NFR01FTlQgKChGSVgpLT5meF9zdWJzeSkJCQkJXAotCSAgICAgICA9PSBTX0dFVF9TRUdNRU5UICgoRklYKS0+ZnhfYWRkc3kpKSkJCQlcCi0gICAgICAgfHwgc3RyY2hyIChTX0dFVF9OQU1FICgoRklYKS0+ZnhfYWRkc3kpLCAnXDAwMScpICE9IE5VTEwJCVwKLSAgICAgICB8fCBzdHJjaHIgKFNfR0VUX05BTUUgKChGSVgpLT5meF9hZGRzeSksICdcMDAyJykgIT0gTlVMTCkpCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9BT1VUCi0vKiBXaGVuIGdlbmVyYXRpbmcgUElDIGNvZGUsIHdlIG11c3Qgbm90IGFkanVzdCBhbnkgcmVsb2Mgd2hpY2ggd2lsbAotICAgdHVybiBpbnRvIGEgcmVsb2MgYWdhaW5zdCB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgbm9yIGFueSByZWxvYwotICAgd2hpY2ggd2Ugd2lsbCBuZWVkIGlmIGEgc3ltYm9sIGlzIG92ZXJyaWRkZW4uICAqLwotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVgpCQkJCQkJXAotICAoISBzcGFyY19waWNfY29kZQkJCQkJCQlcCi0gICB8fCAoKEZJWCktPmZ4X3BjcmVsCQkJCQkJCVwKLSAgICAgICAmJiAoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwJCQkJCVwKLQkgICB8fCAoISBTX0lTX0VYVEVSTkFMICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotCSAgICAgICAmJiAhIFNfSVNfV0VBSyAoKEZJWCktPmZ4X2FkZHN5KSkpKQkJCVwKLSAgIHx8IChGSVgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzE2CQkJCQlcCi0gICB8fCAoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMikKLSNlbmRpZgotCi0jZGVmaW5lIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nIHNwYXJjX2VsZl9maW5hbF9wcm9jZXNzaW5nCi1leHRlcm4gdm9pZCBzcGFyY19lbGZfZmluYWxfcHJvY2Vzc2luZyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gdm9pZCBzcGFyY19tZF9lbmQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9lbmQoKSBzcGFyY19tZF9lbmQgKCkKLQotI2VuZGlmCi0KLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXIGNvbnNfZml4X25ld19zcGFyYwotZXh0ZXJuIHZvaWQgY29uc19maXhfbmV3X3NwYXJjCi0gIFBBUkFNUyAoKHN0cnVjdCBmcmFnICosIGludCwgdW5zaWduZWQgaW50LCBzdHJ1Y3QgZXhwcmVzc2lvblMgKikpOwotCi0vKiBlbmQgb2YgdGMtc3BhcmMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy10YWhvZS5jIGIvZ2FzL2NvbmZpZy90Yy10YWhvZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmQ2M2NhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdGFob2UuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMjcgKzAsMCBAQAotLyogdGMtdGFob2UuYwotICAgTm90IHBhcnQgb2YgR0FTIHlldC4gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0vKiB0aGlzIGJpdCBnbG9tbWVkIGZyb20gdGFob2UtaW5zdC5oICovCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBieXRlOwotdHlwZWRlZiBieXRlIHRhaG9lX29wY29kZVQ7Ci0KLS8qCi0gKiBUaGlzIGlzIHBhcnQgb2YgdGFob2UtaW5zLXBhcnNlLmMgJiBmcmllbmRzLgotICogV2Ugd2FudCB0byBwYXJzZSBhIHRhaG9lIGluc3RydWN0aW9uIHRleHQgaW50byBhIHRyZWUgZGVmaW5lZCBoZXJlLgotICovCi0KLSNkZWZpbmUgVElUX01BWF9PUEVSQU5EUyAoNCkJLyogbWF4aW11bSBudW1iZXIgb2Ygb3BlcmFuZHMgaW4gb25lCi0JCQkJICAgc2luZ2xlIHRhaG9lIGluc3RydWN0aW9uICovCi0KLXN0cnVjdCB0b3AJCQkvKiB0YWhvZSBpbnN0cnVjdGlvbiBvcGVyYW5kICovCi17Ci0gIGludCB0b3BfbmR4OwkJCS8qIC0xLCBvciBpbmRleCByZWdpc3Rlci4gZWcgNz1bUjddICovCi0gIGludCB0b3BfcmVnOwkJCS8qIC0xLCBvciByZWdpc3RlciBudW1iZXIuIGVnIDcgPSBSNyBvciAoUjcpICovCi0gIGJ5dGUgdG9wX21vZGU7CQkvKiBBZGRyZXNzaW5nIG1vZGUgYnl0ZS4gVGhpcyBieXRlLCBkZWZpbmVzCi0JCQkJICAgd2hpY2ggb2YgdGhlIDExIG1vZGVzIG9wY29kZSBpcy4gKi8KLQotICBjaGFyIHRvcF9hY2Nlc3M7CQkvKiBBY2Nlc3MgdHlwZSB3YW50ZWQgZm9yIHRoaXMgb3BwZXJhbmQKLQkJCQkgICAnYidicmFuY2ggJyAnbm8taW5zdHJ1Y3Rpb24gJ2FtcnZ3JyAqLwotICBjaGFyIHRvcF93aWR0aDsJCS8qIE9wZXJhbmQgd2lkdGggZXhwZWN0ZWQsIG9uZSBvZiAiYndscT8tOiEiICovCi0KLSAgY2hhciAqdG9wX2Vycm9yOwkJLyogU2F5IGlmIG9wZXJhbmQgaXMgaW5hcHByb3ByaWF0ZSAgICAgICAgICovCi0KLSAgc2VnVCBzZWdfb2Zfb3BlcmFuZDsJCS8qIHNlZ21lbnQgYXMgcmV0dXJuZWQgYnkgZXhwcmVzc2lvbigpKi8KLQotICBleHByZXNzaW9uUyBleHBfb2Zfb3BlcmFuZDsJLyogVGhlIGV4cHJlc3Npb24gYXMgcGFyc2VkIGJ5IGV4cHJlc3Npb24oKSovCi0KLSAgYnl0ZSB0b3BfZGlzcHNpemU7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGRpc3BsYWNlbWVudCBpZiB3ZQotCQkJCSAgIGNhbiBmaWd1cmUgaXQgb3V0ICovCi19OwotCi0vKiBUaGUgYWRkcmVzc2luZyBtb2RlcyBmb3IgYW4gb3BlcmFuZC4gVGhlc2UgbnVtYmVycyBhcmUgdGhlIGFjdXRhbCB2YWx1ZXMKLSAgIGZvciBjZXJ0YWluIG1vZGVzLCBzbyBiZSBjYXJlZnVsbCBpZiB5b3Ugc2NyZXcgd2l0aCB0aGVtLiAqLwotI2RlZmluZSBUQUhPRV9ESVJFQ1RfUkVHICgweDUwKQotI2RlZmluZSBUQUhPRV9SRUdfREVGRVJSRUQgKDB4NjApCi0KLSNkZWZpbmUgVEFIT0VfUkVHX0RJU1AgKDB4RTApCi0jZGVmaW5lIFRBSE9FX1JFR19ESVNQX0RFRkVSUkVEICgweEYwKQotCi0jZGVmaW5lIFRBSE9FX0lNTUVESUFURSAoMHg4RikKLSNkZWZpbmUgVEFIT0VfSU1NRURJQVRFX0JZVEUgKDB4ODgpCi0jZGVmaW5lIFRBSE9FX0lNTUVESUFURV9XT1JEICgweDg5KQotI2RlZmluZSBUQUhPRV9JTU1FRElBVEVfTE9OR1dPUkQgKDB4OEYpCi0jZGVmaW5lIFRBSE9FX0FCU09MVVRFX0FERFIgKDB4OUYpCi0KLSNkZWZpbmUgVEFIT0VfRElTUExBQ0VEX1JFTEFUSVZFICgweEVGKQotI2RlZmluZSBUQUhPRV9ESVNQX1JFTF9ERUZFUlJFRCAoMHhGRikKLQotI2RlZmluZSBUQUhPRV9BVVRPX0RFQyAoMHg3RSkKLSNkZWZpbmUgVEFIT0VfQVVUT19JTkMgKDB4OEUpCi0jZGVmaW5lIFRBSE9FX0FVVE9fSU5DX0RFRkVSUkVEICgweDlFKQotLyogSU5ERVhFRF9SRUcgaXMgZGVjaWRlZCBieSB0aGUgZXhpc3RhbmNlIG9yIGxhY2sgb2YgYSBbcmVnXSAqLwotCi0vKiBUaGVzZSBhcmUgZW5jb2RlZCBpbnRvIHRvcF93aWR0aCB3aGVuIHRvcF9hY2Nlc3M9PSdiJwotICAgYW5kIGl0J3MgYSBwc3VlZG8gb3AuKi8KLSNkZWZpbmUgVEFIT0VfV0lEVEhfQUxXQVlTX0pVTVAgICAgICAnLScKLSNkZWZpbmUgVEFIT0VfV0lEVEhfQ09ORElUSU9OQUxfSlVNUCAnPycKLSNkZWZpbmUgVEFIT0VfV0lEVEhfQklHX1JFVl9KVU1QICAgICAnIScKLSNkZWZpbmUgVEFIT0VfV0lEVEhfQklHX05PTl9SRVZfSlVNUCAnOicKLQotLyogVGhlIGhleCBjb2RlIGZvciBjZXJ0YWluIHRhaG9lIGNvbW1hbmRzIGFuZCBtb2Rlcy4KLSAgIFRoaXMgaXMganVzdCBmb3IgcmVhZGFiaWxpdHkuICovCi0jZGVmaW5lIFRBSE9FX0pNUCAoMHg3MSkKLSNkZWZpbmUgVEFIT0VfUENfUkVMX0xPTkcgKDB4RUYpCi0jZGVmaW5lIFRBSE9FX0JSQiAoMHgxMSkKLSNkZWZpbmUgVEFIT0VfQlJXICgweDEzKQotLyogVGhlc2UsIHdoZW4gJ29yZWQnIHdpdGgsIG9yIGFkZGVkIHRvLCBhIHJlZ2lzdGVyIG51bWJlciwKLSAgIHNldCB1cCB0aGUgbnVtYmVyIGZvciB0aGUgZGlzcGxhY2VtZW50IG1vZGUuICovCi0jZGVmaW5lIFRBSE9FX1BDX09SX0JZVEUgKDB4QTApCi0jZGVmaW5lIFRBSE9FX1BDX09SX1dPUkQgKDB4QzApCi0jZGVmaW5lIFRBSE9FX1BDX09SX0xPTkcgKDB4RTApCi0KLXN0cnVjdCB0aXQJCQkvKiBnZXQgaXQgb3V0IG9mIHRoZSBzZXdlciwgaXQgc3RhbmRzIGZvcgotCQkJCSAgIHRhaG9lIGluc3RydWN0aW9uIHRyZWUgKEdlZXplISkgKi8KLXsKLSAgdGFob2Vfb3Bjb2RlVCB0aXRfb3Bjb2RlOwkvKiBUaGUgb3Bjb2RlLiAqLwotICBieXRlIHRpdF9vcGVyYW5kczsJCS8qIEhvdyBtYW55IG9wZXJhbmRzIGFyZSBoZXJlLiAqLwotICBzdHJ1Y3QgdG9wIHRpdF9vcGVyYW5kW1RJVF9NQVhfT1BFUkFORFNdOwkvKiBPcGVyYW5kcyAqLwotICBjaGFyICp0aXRfZXJyb3I7CQkvKiAiIiBvciBmYXRhbCBlcnJvciB0ZXh0ICovCi19OwotCi0vKiBlbmQ6IHRhaG9lLWluc3QuaCAqLwotCi0vKiB0YWhvZS5jIC0gdGFob2Utc3BlY2lmaWMgLQotICAgTm90IHBhcnQgb2YgZ2FzIHlldC4KLSAgICovCi0KLSNpbmNsdWRlICJvcGNvZGUvdGFob2UuaCIKLQotLyogVGhpcyBpcyB0aGUgbnVtYmVyIHRvIHB1dCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhLm91dCBmaWxlICovCi1sb25nIG9tYWdpYyA9IE9NQUdJQzsKLQotLyogVGhlc2UgY2hhcnMgc3RhcnQgYSBjb21tZW50IGFueXdoZXJlIGluIGEgc291cmNlIGZpbGUgKGV4Y2VwdCBpbnNpZGUKLSAgIGFub3RoZXIgY29tbWVudCBvciBhIHF1b3RlZCBzdHJpbmcuICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjOyI7Ci0KLS8qIFRoZXNlIGNoYXJzIG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudAotICAgYXMgaW4gMGYxMjMuNDU2Ci0gICBvciAgICAwZDEuMjM0RS0xMiAoc2VlIGV4cCBjaGFycyBhYm92ZSkKLSAgIE5vdGU6IFRoZSBUYWhvZSBwb3J0IGRvZXNuJ3Qgc3VwcG9ydCBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuIFRoaXMgaXMKLSAgICAgICAgIGNvbnNpc3RhbnQgd2l0aCAnYXMnIElmIGl0J3MgbmVlZGVkLCBJIGNhbiBhbHdheXMgYWRkIGl0IGxhdGVyLiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkZiI7Ci0KLS8qIEFsc28gYmUgYXdhcmUgdGhhdCBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQgbWF5IGhhdmUgdG8gYmUKLSAgIGNoYW5nZWQgaW4gcmVhZC5jIC4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdCBhbGwsCi0gICBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4KLSAgIChUaGUgdGFob2UgaGFzIHBsZW50eSBvZiByb29tLCBzbyB0aGUgY2hhbmdlIGN1cnJlbnRseSBpc24ndCBuZWVkZWQuKQotICAgKi8KLQotc3RhdGljIHN0cnVjdCB0aXQgdDsJCS8qIEEgdGFob2UgaW5zdHJ1Y3Rpb24gYWZ0ZXIgZGVjb2RpbmcuICovCi0KLXZvaWQgZmxvYXRfY29ucyAoKTsKLS8qIEEgdGFibGUgb2YgcHNldWRvIG9wcyAoc2FucyAuKSwgdGhlIGZ1bmN0aW9uIGNhbGxlZCwgYW5kIGFuIGludGVnZXIgb3AKLSAgIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoLiAqLwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImRmbG9hdCIsIGZsb2F0X2NvbnMsICdkJ30sCi0gIHsiZmZsb2F0IiwgZmxvYXRfY29ucywgJ2YnfSwKLSAgezB9Ci19OwotDAotLyoKLSAqIEZvciBUYWhvZSwgcmVsYXRpdmUgYWRkcmVzc2VzIG9mICJqdXN0IHRoZSByaWdodCBsZW5ndGgiIGFyZSBwcmV0dHkgZWFzeS4KLSAqIFRoZSBicmFuY2ggZGlzcGxhY2VtZW50IGlzIGFsd2F5cyB0aGUgbGFzdCBvcGVyYW5kLCBldmVuIGluCi0gKiBzeW50aGV0aWMgaW5zdHJ1Y3Rpb25zLgotICogRm9yIFRhaG9lLCB3ZSBlbmNvZGUgdGhlIHJlbGF4X3N1YnN0YXRlVHMgKGluIGUuZy4gZnJfc3Vic3RhdGUpIGFzOgotICoKLSAqCQkgICAgNCAgICAgICAzICAgICAgIDIgICAgICAgMSAgICAgICAwCSAgICAgYml0IG51bWJlcgotICoJLS0tLyAvLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICoJCXwgICAgIHdoYXQgc3RhdGUgPwl8ICBob3cgbG9uZyA/CXwKLSAqCS0tLS8gLy0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAqCi0gKiBUaGUgImhvdyBsb25nIiBiaXRzIGFyZSAwMD1ieXRlLCAwMT13b3JkLCAxMD1sb25nLgotICogVGhpcyBpcyBhIFVuKnggY29udmVudGlvbi4KLSAqIE5vdCBhbGwgbGVuZ3RocyBhcmUgbGVnaXQgZm9yIGEgZ2l2ZW4gdmFsdWUgb2YgKHdoYXQgc3RhdGUpLgotICogVGhlIGZvdXIgc3RhdGVzIGFyZSBsaXN0ZWQgYmVsb3cuCi0gKiBUaGUgImhvdyBsb25nIiByZWZlcnMgbWVyZWx5IHRvIHRoZSBkaXNwbGFjZW1lbnQgbGVuZ3RoLgotICogVGhlIGFkZHJlc3MgdXN1YWxseSBoYXMgc29tZSBjb25zdGFudCBieXRlcyBpbiBpdCBhcyB3ZWxsLgotICoKLQotU3RhdGVzIGZvciBUYWhvZSBhZGRyZXNzIHJlbGF4aW5nLgotMS4JVEFIT0VfV0lEVEhfQUxXQVlTX0pVTVAgKC0pCi0JRm9ybWF0OiAiYi0iCi0JVGFob2Ugb3Bjb2RlcyBhcmU6CShIZXgpCi0JCWpyCQkxMQotCQlqYnIJCTExCi0JU2ltcGxlIGJyYW5jaC4KLQlBbHdheXMsIDEgYnl0ZSBvcGNvZGUsIHRoZW4gZGlzcGxhY2VtZW50L2Fic29sdXRlLgotCUlmIHdvcmQgb3IgbG9uZ3dvcmQsIGNoYW5nZSBvcGNvZGUgdG8gYnJ3IG9yIGptcC4KLQotCQotMi4JVEFIT0VfV0lEVEhfQ09ORElUSU9OQUxfSlVNUCAoPykKLQlKPGNvbmQ+IHdoZXJlIDxjb25kPiBpcyBhIHNpbXBsZSBmbGFnIHRlc3QuCi0JRm9ybWF0OiAiYj8iCi0JVGFob2Ugb3Bjb2RlcyBhcmU6CShIZXgpCi0JCWpuZXEvam5lcXUJMjEKLQkJamVxbC9qZXFsdQkzMQotCQlqZ3RyCQk0MQotCQlqbGVxCQk1MQotCQlqZ2VxCQk4MQotCQlqbHNzCQk5MQotCQlqZ3RydQkJYTEKLQkJamxlcXUJCWIxCi0JCWp2YwkJYzEKLQkJanZzCQlkMQotCQlqbHNzdS9qY3MJZTEKLQkJamdlcXUvamNjCWYxCi0JQWx3YXlzLCB5b3UgY29tcGxlbWVudCA0dGggYml0IHRvIHJldmVyc2UgdGhlIGNvbmRpdGlvbi4KLQlBbHdheXMsIDEtYnl0ZSBvcGNvZGUsIHRoZW4gMS1ieXRlIGRpc3BsYWNlbWVudC4KLQotMy4JVEFIT0VfV0lEVEhfQklHX1JFVl9KVU1QICghKQotCUpiYy9KYnMgd2hlcmUgY29uZCB0ZXN0cyBhIG1lbW9yeSBiaXQuCi0JRm9ybWF0OiAicmx2bGIhIgotCVRhaG9lIG9wY29kZXMgYXJlOgkoSGV4KQotCQlqYnMJCTBlCi0JCWpiYwkJMWUKLQlBbHdheXMsIHlvdSBjb21wbGVtZW50IDR0aCBiaXQgdG8gcmV2ZXJzZSB0aGUgY29uZGl0aW9uLgotCUFsd2F5cywgMS1ieXRlIG9wY2RlLCBsb25nd29yZCwgbG9uZ3dvcmQtYWRkcmVzcywgMS13b3JkLWRpc3BsYWNlbWVudAotCi00LglUQUhPRV9XSURUSF9CSUdfTk9OX1JFVl9KVU1QICg6KQotCUphb2JsWFgvSmJzc2kKLQlGb3JtYXQ6ICJybG1sYjoiCi0JVGFob2Ugb3Bjb2RlcyBhcmU6CShIZXgpCi0JCWFvamxzcwkJMmYKLQkJamFvYmxzcwkJMmYKLQkJYW9qbGVxCQkzZgotCQlqYW9ibGVxCQkzZgotCQlqYnNzaQkJNWYKLQlBbHdheXMsIHdlIGNhbm5vdCByZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgYnJhbmNoOyB3ZSBoYXZlIGEgd29yZAotCWRpc3BsYWNlbWVudC4KLQotV2UgbmVlZCB0byBtb2RpZnkgdGhlIG9wY29kZSBpcyBmb3IgY2xhc3MgMSwgMiBhbmQgMyBpbnN0cnVjdGlvbnMuCi1BZnRlciByZWxheCgpIHdlIG1heSBjb21wbGVtZW50IHRoZSA0dGggYml0IG9mIDIgb3IgMyB0byByZXZlcnNlIHNlbnNlIG9mCi1icmFuY2guCi0KLVdlIHNvbWV0aW1lcyBzdG9yZSBjb250ZXh0IGluIHRoZSBvcGVyYW5kIGxpdGVyYWwuIFRoaXMgd2F5IHdlIGNhbiBmaWd1cmUgb3V0Ci1hZnRlciByZWxheCgpIHdoYXQgdGhlIG9yaWdpbmFsIGFkZHJlc3NpbmcgbW9kZSB3YXMuIChXYXMgaXMgcGNfcmVsLCBvcgotcGNfcmVsX2Rpc3A/IFRoYXQgc29ydCBvZiB0aGluZy4pICovCi0MCi0vKiBUaGVzZSBkaXNwbGFjZW1lbnRzIGFyZSByZWxhdGl2ZSB0byB0aGUgU1RBUlQgYWRkcmVzcyBvZiB0aGUKLSAgIGRpc3BsYWNlbWVudCB3aGljaCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGRpc3BsYWNlbWVudCwgbm90IHRoZSBlbmQgb2YKLSAgIHRoZSBpbnN0cnVjdGlvbi4gVGhlIGhhcmR3YXJlIHBjX3JlbCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbnMuCi0gICBUaGF0J3Mgd2h5IGFsbCB0aGUgZGlzcGxhY2VtZW50cyBoYXZlIHRoZSBsZW5ndGggb2YgdGhlIGRpc3BsYWNlbWVudCBhZGRlZAotICAgdG8gdGhlbS4gKFdGICsgbGVuZ3RoKHdvcmQpKQotCi0gICBUaGUgZmlyc3QgbGV0dGVyIGlzIEJ5dGUsIFdvcmQuCi0gICAybmQgbGV0dGVyIGlzIEZvcndhcmQsIEJhY2t3YXJkLiAqLwotI2RlZmluZSBCRiAoMSsgMTI3KQotI2RlZmluZSBCQiAoMSstMTI4KQotI2RlZmluZSBXRiAoMisgMzI3NjcpCi0jZGVmaW5lIFdCICgyKy0zMjc2OCkKLS8qIERvbnQgbmVlZCBMRiwgTEIgYmVjYXVzZSB0aGV5IGFsd2F5cyByZWFjaC4gW1RoZXkgYXJlIGNvZGVkIGFzIDAuXSAqLwotCi0jZGVmaW5lIEMoYSxiKSBFTkNPREVfUkVMQVgoYSxiKQotLyogVGhpcyBtYWNybyBoYXMgbm8gc2lkZS1lZmZlY3RzLiAqLwotI2RlZmluZSBFTkNPREVfUkVMQVgod2hhdCxsZW5ndGgpICgoKHdoYXQpIDw8IDIpICsgKGxlbmd0aCkpCi0jZGVmaW5lIFJFTEFYX1NUQVRFKHdoYXQpICgod2hhdCkgPj4gMikKLSNkZWZpbmUgUkVMQVhfTEVOR1RIKGxlbmd0aCkgKChsZW5ndGgpICYmIDMpCi0KLSNkZWZpbmUgU1RBVEVfQUxXQVlTX0JSQU5DSCAgICAgICAgICAgICAoMSkKLSNkZWZpbmUgU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNIICAgICAgICAoMikKLSNkZWZpbmUgU1RBVEVfQklHX1JFVl9CUkFOQ0ggICAgICAgICAgICAoMykKLSNkZWZpbmUgU1RBVEVfQklHX05PTl9SRVZfQlJBTkNIICAgICAgICAoNCkKLSNkZWZpbmUgU1RBVEVfUENfUkVMQVRJVkUJCSg1KQotCi0jZGVmaW5lIFNUQVRFX0JZVEUgICAgICAgICAgICAgICAgICAgICAgKDApCi0jZGVmaW5lIFNUQVRFX1dPUkQgICAgICAgICAgICAgICAgICAgICAgKDEpCi0jZGVmaW5lIFNUQVRFX0xPTkcgICAgICAgICAgICAgICAgICAgICAgKDIpCi0jZGVmaW5lIFNUQVRFX1VOREYgICAgICAgICAgICAgICAgICAgICAgKDMpCS8qIFN5bWJvbCB1bmRlZmluZWQgaW4gcGFzczEgKi8KLQotLyogVGhpcyBpcyB0aGUgdGFibGUgdXNlZCBieSBnYXMgdG8gZmlndXJlIG91dCByZWxheGluZyBtb2Rlcy4gVGhlIGZpZWxkcyBhcmUKLSAgIGZvcndhcmRfYnJhbmNoIHJlYWNoLCBiYWNrd2FyZF9icmFuY2ggcmVhY2gsIG51bWJlciBvZiBieXRlcyBpdCB3b3VsZCB0YWtlLAotICAgd2hlcmUgdGhlIG5leHQgYmlnZ2VzdCBicmFuY2ggaXMuICovCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogZXJyb3Igc2VudGluZWwgICAwLDAJKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICAwLDEJKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICAwLDIJKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICAwLDMJKi8KLS8qIFVuY29uZGl0aW9uYWwgYnJhbmNoIGNhc2VzICJqcmIiCi0gICAgIFRoZSByZWxheCBwYXJ0IGlzIHRoZSBhY3R1YWwgZGlzcGxhY2VtZW50ICovCi0gIHsKLSAgICBCRiwgQkIsIDEsIEMgKDEsIDEpCi0gIH0sCQkJCS8qIGJyYiBCYGZvbwkgICAgMSwwICovCi0gIHsKLSAgICBXRiwgV0IsIDIsIEMgKDEsIDIpCi0gIH0sCQkJCS8qIGJydyBXYGZvbwkgICAgMSwxICovCi0gIHsKLSAgICAwLCAwLCA1LCAwCi0gIH0sCQkJCS8qIEptcCBMYGZvbwkgICAgMSwyICovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgMSwzICovCi0vKiBSZXZlcnNpYmxlIENvbmRpdGlvbmFsIEJyYW5jaC4gSWYgdGhlIGJyYW5jaCB3b24ndCByZWFjaCwgcmV2ZXJzZQotICAgICBpdCwgYW5kIGp1bXAgb3ZlciBhIGJydyBvciBhIGptcCB0aGF0IHdpbGwgcmVhY2guIFRoZSByZWxheCBwYXJ0IGlzIHRoZQotICAgICBhY3R1YWwgYWRkcmVzcy4gKi8KLSAgewotICAgIEJGLCBCQiwgMSwgQyAoMiwgMSkKLSAgfSwJCQkJLyogYjxjb25kPiBCYGZvbyAgICAyLDAgKi8KLSAgewotICAgIFdGICsgMiwgV0IgKyAyLCA0LCBDICgyLCAyKQotICB9LAkJCQkvKiBicmV2IG92ZXIsIGJydyBXYGZvbywgb3ZlcjogMiwxICovCi0gIHsKLSAgICAwLCAwLCA3LCAwCi0gIH0sCQkJCS8qIGJyZXYgb3Zlciwgam1wIExgZm9vLCBvdmVyOiAyLDIgKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICAyLDMgKi8KLS8qIEFub3RoZXIgdHlwZSBvZiByZXZlcnNhYmxlIGJyYW5jaC4gQnV0IHRoaXMgb25seSBoYXMgYSB3b3JkCi0gICAgIGRpc3BsYWNlbWVudC4gKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICAzLDAgKi8KLSAgewotICAgIFdGLCBXQiwgMiwgQyAoMywgMikKLSAgfSwJCQkJLyogamJYIFdgZm9vCSAgICAzLDEgKi8KLSAgewotICAgIDAsIDAsIDgsIDAKLSAgfSwJCQkJLyoganJldlggb3Zlciwgam1wIExgZm9vLCBvdmVyOiAgMywyICovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgMywzICovCi0vKiBUaGVzZSBhcmUgdGhlIG5vbiByZXZlcnNhYmxlIGJyYW5jaGVzLCBhbGwgb2Ygd2hpY2ggaGF2ZSBhIHdvcmQKLSAgICAgZGlzcGxhY2VtZW50LiBJZiBJIGNhbid0IHJlYWNoLCBicmFuY2ggb3ZlciBhIGJ5dGUgYnJhbmNoLCB0byBhCi0gICAgIGp1bXAgdGhhdCB3aWxsIHJlYWNoLiBUaGUganVtcGVkIGJyYW5jaCBqdW1wcyBvdmVyIHRoZSByZWFjaGluZwotICAgICBicmFuY2gsIHRvIGNvbnRpbnVlIHdpdGggdGhlIGZsb3cgb2YgdGhlIHByb2dyYW0uIEl0J3MgbGlrZSBwbGF5aW5nCi0gICAgIGxlYXAgZnJvZy4gKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICA0LDAgKi8KLSAgewotICAgIFdGLCBXQiwgMiwgQyAoNCwgMikKLSAgfSwJCQkJLyogYW9ibF8gV2Bmb28JICAgIDQsMSAqLwotICB7Ci0gICAgMCwgMCwgMTAsIDAKLSAgfSwJCQkJLyphb2JsXyBXYGhvcCxiciBvdmVyLGhvcDogam1wIExeZm9vLG92ZXIgNCwyKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICA0LDMgKi8KLS8qIE5vcm1hbCBkaXNwbGFjZW1lbnQgbW9kZSwgbm8ganVtcGluZyBvciBhbnl0aGluZyBsaWtlIHRoYXQuCi0gICAgIFRoZSByZWxheCBwb2ludHMgdG8gb25lIGJ5dGUgYmVmb3JlIHRoZSBhZGRyZXNzLCB0aGF0cyB3aHkgYWxsCi0gICAgIHRoZSBudW1iZXJzIGFyZSB1cCBieSBvbmUuICovCi0gIHsKLSAgICBCRiArIDEsIEJCICsgMSwgMiwgQyAoNSwgMSkKLSAgfSwJCQkJLyogQl4iZm9vIgkgICAgNSwwICovCi0gIHsKLSAgICBXRiArIDEsIFdCICsgMSwgMywgQyAoNSwgMikKLSAgfSwJCQkJLyogV14iZm9vIgkgICAgNSwxICovCi0gIHsKLSAgICAwLCAwLCA1LCAwCi0gIH0sCQkJCS8qIExeImZvbyIJICAgIDUsMiAqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDUsMyAqLwotfTsKLQotI3VuZGVmIEMKLSN1bmRlZiBCRgotI3VuZGVmIEJCCi0jdW5kZWYgV0YKLSN1bmRlZiBXQgotLyogRW5kIHJlbGF4IHN0dWZmICovCi0MCi0vKiBIYW5kbGUgb2YgdGhlIE9QQ09ERSBoYXNoIHRhYmxlLiAgTlVMTCBtZWFucyBhbnkgdXNlIGJlZm9yZQotICAgbWRfYmVnaW4oKSB3aWxsIGNyYXNoLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoOwotCi0vKiBJbml0IGZ1bmN0aW9uLiBCdWlsZCB0aGUgaGFzaCB0YWJsZS4gKi8KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIHN0cnVjdCB0b3QgKnRQOwotICBjaGFyICplcnJvcnZhbCA9IDA7Ci0gIGludCBzeW50aGV0aWNfdG9vID0gMTsJLyogSWYgMCwganVzdCB1c2UgcmVhbCBvcGNvZGVzLiAqLwotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBmb3IgKHRQID0gdG90c3RyczsgKnRQLT5uYW1lICYmICFlcnJvcnZhbDsgdFArKykKLSAgICBlcnJvcnZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCB0UC0+bmFtZSwgJnRQLT5kZXRhaWwpOwotCi0gIGlmIChzeW50aGV0aWNfdG9vKQotICAgIGZvciAodFAgPSBzeW50aGV0aWNfdG90c3RyczsgKnRQLT5uYW1lICYmICFlcnJvcnZhbDsgdFArKykKLSAgICAgIGVycm9ydmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIHRQLT5uYW1lLCAmdFAtPmRldGFpbCk7Ci0KLSAgaWYgKGVycm9ydmFsKQotICAgIGFzX2ZhdGFsIChlcnJvcnZhbCk7Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiYWQ6U1R0OlYiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ2EnOgotICAgICAgYXNfd2FybiAoXygiVGhlIC1hIG9wdGlvbiBkb2Vzbid0IGV4aXN0LiAoRGVzcGl0ZSB3aGF0IHRoZSBtYW4gcGFnZSBzYXlzISIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICBhc193YXJuIChfKCJEaXNwbGFjZW1lbnQgbGVuZ3RoICVzIGlnbm9yZWQhIiksIGFyZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1MnOgotICAgICAgYXNfd2FybiAoXygiU1lNQk9MIFRBQkxFIG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgICBhc193YXJuIChfKCJUT0tFTiBUUkFDRSBub3QgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3QnOgotICAgICAgYXNfd2FybiAoXygiSSBkb24ndCBuZWVkIG9yIHVzZSB0ZW1wLiBmaWxlIFwiJXNcIi4iKSwgYXJnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVic6Ci0gICAgICBhc193YXJuIChfKCJJIGRvbid0IHVzZSBhbiBpbnRlcnBhc3MgZmlsZSEgLVYgaWdub3JlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi1UYWhvZSBvcHRpb25zOlxuXAotLWEJCQlpZ25vcmVkXG5cCi0tZCBMRU5HVEgJCWlnbm9yZWRcblwKLS1KCQkJaWdub3JlZFxuXAotLVMJCQlpZ25vcmVkXG5cCi0tdCBGSUxFCQkJaWdub3JlZFxuXAotLVQJCQlpZ25vcmVkXG5cCi0tVgkJCWlnbm9yZWRcbiIpKTsKLX0KLQwKLS8qIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBzZWN0aW9uIHRha2UgbnVtYmVycyBpbiB0aGUgbWFjaGluZSBmb3JtYXQsIGFuZAotICAgbXVuZ2VzIHRoZW0gaW50byBUYWhvZSBieXRlIG9yZGVyLgotICAgVGhleSBleGlzdCBwcmltYXJpbHkgZm9yIGNyb3NzIGFzc2VtYmx5IHB1cnBvc2UuICovCi12b2lkCQkJCS8qIEtub3dzIGFib3V0IG9yZGVyIG9mIGJ5dGVzIGluIGFkZHJlc3MuICovCi1tZF9udW1iZXJfdG9fY2hhcnMgKGNvbiwgdmFsdWUsIG5ieXRlcykKLSAgICAgY2hhciBjb25bXTsJCS8qIFJldHVybiAnbmJ5dGVzJyBvZiBjaGFycyBoZXJlLiAqLwotICAgICB2YWx1ZVQgdmFsdWU7CQkvKiBUaGUgdmFsdWUgb2YgdGhlIGJpdHMuICovCi0gICAgIGludCBuYnl0ZXM7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG91dHB1dC4gKi8KLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoY29uLCB2YWx1ZSwgbmJ5dGVzKTsKLX0KLQotI2lmZGVmIGNvbW1lbnQKLXZvaWQJCQkJLyogS25vd3MgYWJvdXQgb3JkZXIgb2YgYnl0ZXMgaW4gYWRkcmVzcy4gKi8KLW1kX251bWJlcl90b19pbW0gKGNvbiwgdmFsdWUsIG5ieXRlcykKLSAgICAgY2hhciBjb25bXTsJCS8qIFJldHVybiAnbmJ5dGVzJyBvZiBjaGFycyBoZXJlLiAqLwotICAgICBsb25nIGludCB2YWx1ZTsJCS8qIFRoZSB2YWx1ZSBvZiB0aGUgYml0cy4gKi8KLSAgICAgaW50IG5ieXRlczsJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgb3V0cHV0LiAqLwotewotICBtZF9udW1iZXJfdG9fY2hhcnMgKGNvbiwgdmFsdWUsIG5ieXRlcyk7Ci19Ci0KLSNlbmRpZiAvKiBjb21tZW50ICovCi0KLXZvaWQKLXRjX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCAqLwotICBrbm93ICgwKTsKLX0KLQotdm9pZAkJCQkvKiBLbm93cyBhYm91dCBvcmRlciBvZiBieXRlcyBpbiBhZGRyZXNzLiAqLwotbWRfbnVtYmVyX3RvX2Rpc3AgKGNvbiwgdmFsdWUsIG5ieXRlcykKLSAgICAgY2hhciBjb25bXTsJCS8qIFJldHVybiAnbmJ5dGVzJyBvZiBjaGFycyBoZXJlLiAqLwotICAgICBsb25nIGludCB2YWx1ZTsJCS8qIFRoZSB2YWx1ZSBvZiB0aGUgYml0cy4gKi8KLSAgICAgaW50IG5ieXRlczsJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgb3V0cHV0LiAqLwotewotICBtZF9udW1iZXJfdG9fY2hhcnMgKGNvbiwgdmFsdWUsIG5ieXRlcyk7Ci19Ci0KLXZvaWQJCQkJLyogS25vd3MgYWJvdXQgb3JkZXIgb2YgYnl0ZXMgaW4gYWRkcmVzcy4gKi8KLW1kX251bWJlcl90b19maWVsZCAoY29uLCB2YWx1ZSwgbmJ5dGVzKQotICAgICBjaGFyIGNvbltdOwkJLyogUmV0dXJuICduYnl0ZXMnIG9mIGNoYXJzIGhlcmUuICovCi0gICAgIGxvbmcgaW50IHZhbHVlOwkJLyogVGhlIHZhbHVlIG9mIHRoZSBiaXRzLiAqLwotICAgICBpbnQgbmJ5dGVzOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvdXRwdXQuICovCi17Ci0gIG1kX251bWJlcl90b19jaGFycyAoY29uLCB2YWx1ZSwgbmJ5dGVzKTsKLX0KLQotLyogUHV0IHRoZSBiaXRzIGluIGFuIG9yZGVyIHRoYXQgYSB0YWhvZSB3aWxsIHVuZGVyc3RhbmQsIGRlc3BpdGUgdGhlIG9yZGVyaW5nCi0gICBvZiB0aGUgbmF0aXZlIG1hY2hpbmUuCi0gICBPbiBUYWhvZTogZmlyc3QgNCBieXRlcyBhcmUgbm9ybWFsIHVuc2lnbmVkIGJpZyBlbmRpYW4gbG9uZywKLSAgIG5leHQgdGhyZWUgYnl0ZXMgYXJlIHN5bWJvbG51bSwgaW4ga2luZCBvZiAzIGJ5dGUgYmlnIGVuZGlhbiAobGVhc3Qgc2lnLiBieXRlIGxhc3QpLgotICAgVGhlIGxhc3QgYnl0ZSBpcyBicm9rZW4gdXAgd2l0aCBiaXQgNyBhcyBwY3JlbCwKLSAgIAliaXRzIDYgJiA1IGFzIGxlbmd0aCwKLQliaXQgNCBhcyBleHRlcm4gYW5kIHRoZSBsYXN0IG5pYmJsZSBhcyAndW5kZWZpbmVkJy4gKi8KLQotI2lmIGNvbW1lbnQKLXZvaWQKLW1kX3JpX3RvX2NoYXJzIChyaV9wLCByaSkKLSAgICAgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqcmlfcCwgcmk7Ci17Ci0gIGJ5dGUgdGhlX2J5dGVzW3NpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbyldOwotICAvKiBUaGUgcmVhc29uIEkgY2FuJ3QganVzdCBlbmNvZGUgdGhlc2UgZGlyZWN0bHkgaW50byByaV9wIGlzIHRoYXQKLSAgICAgcmlfcCBtYXkgcG9pbnQgdG8gcmkuICovCi0KLSAgLyogVGhpcyBpcyBlYXN5ICovCi0gIG1kX251bWJlcl90b19jaGFycyAodGhlX2J5dGVzLCByaS5yX2FkZHJlc3MsIHNpemVvZiAocmkucl9hZGRyZXNzKSk7Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgdGhlX2J5dGVzWzRdID0gKHJpLnJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbNV0gPSAocmkucl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKLSAgdGhlX2J5dGVzWzZdID0gcmkucl9zeW1ib2xudW0gJiAweDBmZjsKLSAgdGhlX2J5dGVzWzddID0gKCgocmkucl9leHRlcm4gPDwgNCkgJiAweDEwKSB8ICgocmkucl9sZW5ndGggPDwgNSkgJiAweDYwKSB8Ci0JCSAgKChyaS5yX3BjcmVsIDw8IDcpICYgMHg4MCkpICYgMHhmMDsKLQotICBiY29weSAodGhlX2J5dGVzLCAoY2hhciAqKSByaV9wLCBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pKTsKLX0KLQotI2VuZGlmIC8qIGNvbW1lbnQgKi8KLQotLyogUHV0IHRoZSBiaXRzIGluIGFuIG9yZGVyIHRoYXQgYSB0YWhvZSB3aWxsIHVuZGVyc3RhbmQsIGRlc3BpdGUgdGhlIG9yZGVyaW5nCi0gICBvZiB0aGUgbmF0aXZlIG1hY2hpbmUuCi0gICBPbiBUYWhvZTogZmlyc3QgNCBieXRlcyBhcmUgbm9ybWFsIHVuc2lnbmVkIGJpZyBlbmRpYW4gbG9uZywKLSAgIG5leHQgdGhyZWUgYnl0ZXMgYXJlIHN5bWJvbG51bSwgaW4ga2luZCBvZiAzIGJ5dGUgYmlnIGVuZGlhbiAobGVhc3Qgc2lnLiBieXRlIGxhc3QpLgotICAgVGhlIGxhc3QgYnl0ZSBpcyBicm9rZW4gdXAgd2l0aCBiaXQgNyBhcyBwY3JlbCwKLSAgIAliaXRzIDYgJiA1IGFzIGxlbmd0aCwKLQliaXQgNCBhcyBleHRlcm4gYW5kIHRoZSBsYXN0IG5pYmJsZSBhcyAndW5kZWZpbmVkJy4gKi8KLQotdm9pZCAKLXRjX2FvdXRfZml4X3RvX2NoYXJzICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgbG9uZyByX3N5bWJvbG51bTsKLQotICBrbm93IChmaXhQLT5meF9hZGRzeSAhPSBOVUxMKTsKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLAotICAgICAgIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSAtIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlLAotCQkgICAgICA0KTsKLQotICByX3N5bWJvbG51bSA9IChTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCQkgPyBTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSkKLQkJIDogZml4UC0+ZnhfYWRkc3ktPnN5X251bWJlcik7Ci0KLSAgd2hlcmVbNF0gPSAocl9zeW1ib2xudW0gPj4gMTYpICYgMHgwZmY7Ci0gIHdoZXJlWzVdID0gKHJfc3ltYm9sbnVtID4+IDgpICYgMHgwZmY7Ci0gIHdoZXJlWzZdID0gcl9zeW1ib2xudW0gJiAweDBmZjsKLSAgd2hlcmVbN10gPSAoKChpc19wY3JlbCAoZml4UCkgPDwgNykgJiAweDgwKQotCSAgICAgIHwgKCgoKGZpeFAtPmZ4X3R5cGUgPT0gRlhfOCB8fCBmaXhQLT5meF90eXBlID09IEZYX1BDUkVMOAotCQkgICAgPyAwCi0JCSAgICA6IChmaXhQLT5meF90eXBlID09IEZYXzE2IHx8IGZpeFAtPmZ4X3R5cGUgPT0gRlhfUENSRUwxNgotCQkgICAgICAgPyAxCi0JCSAgICA6IChmaXhQLT5meF90eXBlID09IEZYXzMyIHx8IGZpeFAtPmZ4X3R5cGUgPT0gRlhfUENSRUwzMgotCQkgICAgICAgPyAyCi0JCSAgICAgICA6IDQyKSkpKSA8PCA1KSAmIDB4NjApCi0JICAgICAgfCAoKCFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSA8PCA0KSAmIDB4MTApKTsKLX0KLQotLyogUmVsb2NhdGUgYnl0ZSBzdHVmZiAqLwotDAotLyogVGhpcyBpcyBmb3IgYnJva2VuIHdvcmQuICovCi1jb25zdCBpbnQgbWRfc2hvcnRfanVtcF9zaXplID0gMzsKLQotdm9pZAotbWRfY3JlYXRlX3Nob3J0X2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICB2YWx1ZVQgb2Zmc2V0OwotCi0gIG9mZnNldCA9IHRvX2FkZHIgLSAoZnJvbV9hZGRyICsgMSk7Ci0gICpwdHIrKyA9IFRBSE9FX0JSVzsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIG9mZnNldCwgMik7Ci19Ci0KLWNvbnN0IGludCBtZF9sb25nX2p1bXBfc2l6ZSA9IDY7Ci1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDg7CS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotdm9pZAotbWRfY3JlYXRlX2xvbmdfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIChmcm9tX2FkZHIgKyA0KTsKLSAgKnB0cisrID0gVEFIT0VfSk1QOwotICAqcHRyKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIG9mZnNldCwgNCk7Ci19Ci0MCi0vKgotICoJCQltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpCi0gKgotICogQ2FsbGVkIGp1c3QgYmVmb3JlIHJlbGF4KCkuCi0gKiBBbnkgc3ltYm9sIHRoYXQgaXMgbm93IHVuZGVmaW5lZCB3aWxsIG5vdCBiZWNvbWUgZGVmaW5lZCwgc28gd2UgYXNzdW1lZAotICogdGhhdCBpdCB3aWxsIGJlIHJlc29sdmVkIGJ5IHRoZSBsaW5rZXIuCi0gKiBSZXR1cm4gdGhlIGNvcnJlY3QgZnJfc3VidHlwZSBpbiB0aGUgZnJhZywgZm9yIHJlbGF4KCkKLSAqIFJldHVybiB0aGUgaW5pdGlhbCAiZ3Vlc3MgZm9yIGZyX3ZhciIgdG8gY2FsbGVyLiAoSG93IGJpZyBJIHRoaW5rIHRoaXMKLSAqIHdpbGwgYmUuKQotICogVGhlIGd1ZXNzIGZvciBmcl92YXIgaXMgQUNUVUFMTFkgdGhlIGdyb3d0aCBiZXlvbmQgZnJfZml4LgotICogV2hhdGV2ZXIgd2UgZG8gdG8gZ3JvdyBmcl9maXggb3IgZnJfdmFyIGNvbnRyaWJ1dGVzIHRvIG91ciByZXR1cm5lZCB2YWx1ZS4KLSAqIEFsdGhvdWdoIGl0IG1heSBub3QgYmUgZXhwbGljaXQgaW4gdGhlIGZyYWcsIHByZXRlbmQgZnJfdmFyIHN0YXJ0cyB3aXRoIGEKLSAqIDAgdmFsdWUuCi0gKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWdtZW50X3R5cGU7CQkvKiBOX0RBVEEgb3IgTl9URVhULiAqLwotewotICByZWdpc3RlciBjaGFyICpwOwotICByZWdpc3RlciBpbnQgb2xkX2ZyX2ZpeDsKLSAgLyogIGludCBwY19yZWw7IEZJWE1FOiByZW1vdmUgdGhpcyAqLwotCi0gIG9sZF9mcl9maXggPSBmcmFnUC0+ZnJfZml4OwotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICAvKiBUaGUgc3ltYm9sIHdhcyBpbiB0aGUgc2FtZSBzZWdtZW50IGFzIHRoZSBvcGNvZGUsIGFuZCBpdCdzCi0JIGEgcmVhbCBwY19yZWwgY2FzZSBzbyBpdCdzIGEgcmVsYXhhYmxlIGNhc2UuICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX0JZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIGNhc2UgaXMgc3RpbGwgdW5kZWZpbmVkLCBzbyBhc3VtZSBpdCdzIGEgbG9uZyB3b3JkIGZvciB0aGUKLQkgbGlua2VyIHRvIGZpeC4gKi8KLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICAqcCB8PSBUQUhPRV9QQ19PUl9MT05HOwotCSAgLyogV2Ugbm93IGtub3cgaG93IGJpZyBpdCB3aWxsIGJlLCBvbmUgbG9uZyB3b3JkLiAqLwotCSAgZnJhZ1AtPmZyX2ZpeCArPSAxICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgRlhfUENSRUwzMiwgTlVMTCk7Ci0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNILCBTVEFURV9CWVRFKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcCA9IGZyYWdQLT5mcl9saXRlcmFsICsgb2xkX2ZyX2ZpeDsKLQkgICpmcmFnUC0+ZnJfb3Bjb2RlIF49IDB4MTA7CS8qIFJldmVyc2Ugc2Vuc2Ugb2YgYnJhbmNoLiAqLwotCSAgKnArKyA9IDY7Ci0JICAqcCsrID0gVEFIT0VfSk1QOwotCSAgKnArKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotCSAgZnJhZ1AtPmZyX2ZpeCArPSAxICsgMSArIDEgKyA0OwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyAzLCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCBGWF9QQ1JFTDMyLCBOVUxMKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19SRVZfQlJBTkNILCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPQotCSAgICBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19SRVZfQlJBTkNILCBTVEFURV9XT1JEKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcCA9IGZyYWdQLT5mcl9saXRlcmFsICsgb2xkX2ZyX2ZpeDsKLQkgICpmcmFnUC0+ZnJfb3Bjb2RlIF49IDB4MTA7CS8qIFJldmVyc2Ugc2Vuc2Ugb2YgYnJhbmNoLiAqLwotCSAgKnArKyA9IDA7Ci0JICAqcCsrID0gNjsKLQkgICpwKysgPSBUQUhPRV9KTVA7Ci0JICAqcCsrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0JICBmcmFnUC0+ZnJfZml4ICs9IDIgKyAyICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgRlhfUENSRUwzMiwgTlVMTCk7Ci0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfTk9OX1JFVl9CUkFOQ0gsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX05PTl9SRVZfQlJBTkNILCBTVEFURV9XT1JEKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcCA9IGZyYWdQLT5mcl9saXRlcmFsICsgb2xkX2ZyX2ZpeDsKLQkgICpwKysgPSAyOwotCSAgKnArKyA9IDA7Ci0JICAqcCsrID0gVEFIT0VfQlJCOwotCSAgKnArKyA9IDY7Ci0JICAqcCsrID0gVEFIT0VfSk1QOwotCSAgKnArKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotCSAgZnJhZ1AtPmZyX2ZpeCArPSAyICsgMiArIDIgKyA0OwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyA2LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCBGWF9QQ1JFTDMyLCBOVUxMKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfQllURSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICAqZnJhZ1AtPmZyX29wY29kZSA9IFRBSE9FX0pNUDsKLQkgICpwKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLQkgIGZyYWdQLT5mcl9maXggKz0gMSArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDEsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIEZYX1BDUkVMMzIsIE5VTEwpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gKGZyYWdQLT5mcl92YXIgKyBmcmFnUC0+ZnJfZml4IC0gb2xkX2ZyX2ZpeCk7Ci19CQkJCS8qIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KCkgKi8KLQwKLS8qCi0gKgkJCW1kX2NvbnZlcnRfZnJhZygpOwotICoKLSAqIENhbGxlZCBhZnRlciByZWxheCgpIGlzIGZpbmlzaGVkLgotICogSW46CUFkZHJlc3Mgb2YgZnJhZy4KLSAqCWZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQuCi0gKglmcl9zdWJ0eXBlIGlzIHdoYXQgdGhlIGFkZHJlc3MgcmVsYXhlZCB0by4KLSAqCi0gKiBPdXQ6CUFueSBmaXhTcyBhbmQgY29uc3RhbnRzIGFyZSBzZXQgdXAuCi0gKglDYWxsZXIgd2lsbCB0dXJuIGZyYWcgaW50byBhICIuc3BhY2UgMCIuCi0gKi8KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VnOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKmFkZHJlc3NQOwkvKiAtPiBfdmFyIHRvIGNoYW5nZS4gKi8KLSAgcmVnaXN0ZXIgY2hhciAqb3Bjb2RlUDsJLyogLT4gb3Bjb2RlIGNoYXIocykgdG8gY2hhbmdlLiAqLwotICByZWdpc3RlciBzaG9ydCBpbnQgbGVuZ3RoX2NvZGU7CS8qIDI9bG9uZyAxPXdvcmQgMD1ieXRlICovCi0gIHJlZ2lzdGVyIHNob3J0IGludCBleHRlbnNpb24gPSAwOwkvKiBTaXplIG9mIHJlbGF4ZWQgYWRkcmVzcy4KLQkJCQkgICBBZGRlZCB0byBmcl9maXg6IGluY2wuIEFMTCB2YXIgY2hhcnMuICovCi0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHJlZ2lzdGVyIGxvbmcgaW50IHdoZXJlOwotICByZWdpc3RlciBsb25nIGludCBhZGRyZXNzX29mX3ZhcjsKLSAgLyogV2hlcmUsIGluIGZpbGUgc3BhY2UsIGlzIF92YXIgb2YgKmZyYWdQPyAqLwotICByZWdpc3RlciBsb25nIGludCB0YXJnZXRfYWRkcmVzczsKLSAgLyogV2hlcmUsIGluIGZpbGUgc3BhY2UsIGRvZXMgYWRkciBwb2ludD8gKi8KLQotICBrbm93IChmcmFnUC0+ZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudCk7Ci0gIGxlbmd0aF9jb2RlID0gUkVMQVhfTEVOR1RIIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0gIGtub3cgKGxlbmd0aF9jb2RlID49IDAgJiYgbGVuZ3RoX2NvZGUgPCAzKTsKLSAgd2hlcmUgPSBmcmFnUC0+ZnJfZml4OwotICBhZGRyZXNzUCA9IGZyYWdQLT5mcl9saXRlcmFsICsgd2hlcmU7Ci0gIG9wY29kZVAgPSBmcmFnUC0+ZnJfb3Bjb2RlOwotICBzeW1ib2xQID0gZnJhZ1AtPmZyX3N5bWJvbDsKLSAga25vdyAoc3ltYm9sUCk7Ci0gIHRhcmdldF9hZGRyZXNzID0gU19HRVRfVkFMVUUgKHN5bWJvbFApICsgZnJhZ1AtPmZyX29mZnNldDsKLSAgYWRkcmVzc19vZl92YXIgPSBmcmFnUC0+ZnJfYWRkcmVzcyArIHdoZXJlOwotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX0JZVEUpOgotICAgICAgLyogKmFkZHJlc3NQIGhvbGRzIHRoZSByZWdpc3RlcnMgbnVtYmVyLCBwbHVzIDB4MTAsIGlmIGl0J3MgZGVmZXJyZWQKLSAgICAgICBtb2RlLiBUbyBzZXQgdXAgdGhlIHJpZ2h0IG1vZGUsIGp1c3QgT1IgdGhlIHNpemUgb2YgdGhpcyBkaXNwbGFjZW1lbnQgKi8KLSAgICAgIC8qIEJ5dGUgZGlzcGxhY2VtZW50LiAqLwotICAgICAgKmFkZHJlc3NQKysgfD0gVEFIT0VfUENfT1JfQllURTsKLSAgICAgICphZGRyZXNzUCA9IHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMik7Ci0gICAgICBleHRlbnNpb24gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX1dPUkQpOgotICAgICAgLyogV29yZCBkaXNwbGFjZW1lbnQuICovCi0gICAgICAqYWRkcmVzc1ArKyB8PSBUQUhPRV9QQ19PUl9XT1JEOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAzKSwgMik7Ci0gICAgICBleHRlbnNpb24gPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX0xPTkcpOgotICAgICAgLyogTG9uZyB3b3JkIGRpc3BsYWNlbWVudC4gKi8KLSAgICAgICphZGRyZXNzUCsrIHw9IFRBSE9FX1BDX09SX0xPTkc7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDUpLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX0JZVEUpOgotICAgICAgKmFkZHJlc3NQID0gdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAxKTsKLSAgICAgIGV4dGVuc2lvbiA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX1dPUkQpOgotICAgICAgKm9wY29kZVAgXj0gMHgxMDsJCS8qIFJldmVyc2Ugc2Vuc2Ugb2YgdGVzdC4gKi8KLSAgICAgICphZGRyZXNzUCsrID0gMzsJCS8qIEp1bXAgb3ZlciB3b3JkIGJyYW5jaCAqLwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9CUlc7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDQpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX0xPTkcpOgotICAgICAgKm9wY29kZVAgXj0gMHgxMDsJCS8qIFJldmVyc2Ugc2Vuc2Ugb2YgdGVzdC4gKi8KLSAgICAgICphZGRyZXNzUCsrID0gNjsKLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfSk1QOwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9CWVRFKToKLSAgICAgICphZGRyZXNzUCA9IHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMSk7Ci0gICAgICBleHRlbnNpb24gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfV09SRCk6Ci0gICAgICAqb3Bjb2RlUCA9IFRBSE9FX0JSVzsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMiksIDIpOwotICAgICAgZXh0ZW5zaW9uID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIFNUQVRFX0xPTkcpOgotICAgICAgKm9wY29kZVAgPSBUQUhPRV9KTVA7Ci0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyA1KSwgNCk7Ci0gICAgICBleHRlbnNpb24gPSA1OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX1JFVl9CUkFOQ0gsIFNUQVRFX1dPUkQpOgotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKSwgMik7Ci0gICAgICBleHRlbnNpb24gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX1JFVl9CUkFOQ0gsIFNUQVRFX0xPTkcpOgotICAgICAgKm9wY29kZVAgXj0gMHgxMDsKLSAgICAgICphZGRyZXNzUCsrID0gMDsKLSAgICAgICphZGRyZXNzUCsrID0gNjsKLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfSk1QOwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfTk9OX1JFVl9CUkFOQ0gsIFNUQVRFX1dPUkQpOgotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKSwgMik7Ci0gICAgICBleHRlbnNpb24gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX05PTl9SRVZfQlJBTkNILCBTVEFURV9MT05HKToKLSAgICAgICphZGRyZXNzUCsrID0gMDsKLSAgICAgICphZGRyZXNzUCsrID0gMjsKLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfQlJCOwotICAgICAgKmFkZHJlc3NQKysgPSA2OwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9KTVA7Ci0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MsIDQpOwotICAgICAgZXh0ZW5zaW9uID0gMTA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBCQURfQ0FTRSAoZnJhZ1AtPmZyX3N1YnR5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBmcmFnUC0+ZnJfZml4ICs9IGV4dGVuc2lvbjsKLX0JCQkJLyogbWRfY29udmVydF9mcmFnICovCi0MCi0KLS8qIFRoaXMgaXMgdGhlIHN0dWZmIGZvciBtZF9hc3NlbWJsZS4gKi8KLSNkZWZpbmUgRlBfUkVHIDEzCi0jZGVmaW5lIFNQX1JFRyAxNAotI2RlZmluZSBQQ19SRUcgMTUKLSNkZWZpbmUgQklHR0VTVFJFRyBQQ19SRUcKLQotLyoKLSAqIFBhcnNlIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBTVEFSVAotICogSWYgaXQgcmVwcmVzZW50cyBhIHZhbGlkIHJlZ2lzdGVyLCBwb2ludCBTVEFSVCB0byB0aGUgY2hhcmFjdGVyIGFmdGVyCi0gKiB0aGUgbGFzdCB2YWxpZCByZWdpc3RlciBjaGFyLCBhbmQgcmV0dXJuIHRoZSByZWdpc3RlciBudW1iZXIgKDAtMTUpLgotICogSWYgaW52YWxpZCwgbGVhdmUgU1RBUlQgYWxvbmUsIHJldHVybiAtMS4KLSAqIFRoZSBmb3JtYXQgaGFzIHRvIGJlIGV4YWN0LiBJIGRvbid0IGRvIHRoaW5ncyBsaWtlIGVhdCBsZWFkaW5nIHplcm9zCi0gKiBvciB0aGUgbGlrZS4KLSAqIE5vdGU6IFRoaXMgZG9lc24ndCBjaGVjayBmb3IgdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgbWFraW5nCi0gKiB0aGlzIGludmFsaWQuIEV4OiBSMTIzIHdvdWxkIHJldHVybiAxMiwgaXQncyB0aGUgY2FsbGVycyBqb2IgdG8gY2hlY2sKLSAqIHdoYXQgc3RhcnQgaXMgcG9pbnQgdG8gYXBvbiByZXR1cm4uCi0gKgotICogVmFsaWQgcmVnaXN0ZXJzIGFyZSBSMS1SMTUsICUxLSUxNSwgRlAgKDEzKSwgU1AgKDE0KSwgUEMgKDE1KQotICogQ2FzZSBkb2Vzbid0IG1hdHRlci4KLSAqLwotaW50Ci10YWhvZV9yZWdfcGFyc2UgKHN0YXJ0KQotICAgICBjaGFyICoqc3RhcnQ7CQkvKiBBIHBvaW50ZXIgdG8gdGhlIHN0cmluZyB0byBwYXJzZS4gKi8KLXsKLSAgcmVnaXN0ZXIgY2hhciAqcmVncG9pbnQgPSAqc3RhcnQ7Ci0gIHJlZ2lzdGVyIGludCByZWdudW0gPSAtMTsKLQotICBzd2l0Y2ggKCpyZWdwb2ludCsrKQotICAgIHsKLSAgICBjYXNlICclJzoJCQkvKiBSZWdpc3RlcnMgY2FuIHN0YXJ0IHdpdGggYSAlLAotCQkJCSAgIFIgb3IgciwgYW5kIHRoZW4gYSBudW1iZXIuICovCi0gICAgY2FzZSAnUic6Ci0gICAgY2FzZSAncic6Ci0gICAgICBpZiAoaXNkaWdpdCAoKnJlZ3BvaW50KSkKLQl7Ci0JICAvKiBHb3QgdGhlIGZpcnN0IGRpZ2l0LiAqLwotCSAgcmVnbnVtID0gKnJlZ3BvaW50KysgLSAnMCc7Ci0JICBpZiAoKHJlZ251bSA9PSAxKSAmJiBpc2RpZ2l0ICgqcmVncG9pbnQpKQotCSAgICB7Ci0JICAgICAgLyogSXRzIGEgdHdvIGRpZ2l0IG51bWJlci4gKi8KLQkgICAgICByZWdudW0gPSAxMCArICgqcmVncG9pbnQrKyAtICcwJyk7Ci0JICAgICAgaWYgKHJlZ251bSA+IEJJR0dFU1RSRUcpCi0JCXsJCS8qIE51bWJlciB0b28gYmlnPyAqLwotCQkgIHJlZ251bSA9IC0xOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdGJzoJCQkvKiBJcyBpdCB0aGUgRlAgKi8KLSAgICBjYXNlICdmJzoKLSAgICAgIHN3aXRjaCAoKnJlZ3BvaW50KyspCi0JewotCWNhc2UgJ3AnOgotCWNhc2UgJ1AnOgotCSAgcmVnbnVtID0gRlBfUkVHOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3MnOgkJCS8qIEhvdyBhYm91dCB0aGUgU1AgKi8KLSAgICBjYXNlICdTJzoKLSAgICAgIHN3aXRjaCAoKnJlZ3BvaW50KyspCi0JewotCWNhc2UgJ3AnOgotCWNhc2UgJ1AnOgotCSAgcmVnbnVtID0gU1BfUkVHOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3AnOgkJCS8qIE9SIHRoZSBQQyBldmVuICovCi0gICAgY2FzZSAnUCc6Ci0gICAgICBzd2l0Y2ggKCpyZWdwb2ludCsrKQotCXsKLQljYXNlICdjJzoKLQljYXNlICdDJzoKLQkgIHJlZ251bSA9IFBDX1JFRzsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKHJlZ251bSAhPSAtMSkKLSAgICB7CQkJCS8qIE5vIGVycm9yLCBzbyBtb3ZlIHN0cmluZyBwb2ludGVyICovCi0gICAgICAqc3RhcnQgPSByZWdwb2ludDsKLSAgICB9Ci0gIHJldHVybiByZWdudW07CQkvKiBSZXR1cm4gcmVzdWx0cyAqLwotfQkJCQkvKiB0YWhvZV9yZWdfcGFyc2UgKi8KLQwKLS8qCi0gKiBUaGlzIGNob3BzIHVwIGFuIG9wZXJhbmQgYW5kIGZpZ3VyZXMgb3V0IGl0cyBtb2RlcyBhbmQgc3R1ZmYuCi0gKiBJdCdzIGEgbGl0dGxlIHRvdWNoeSBhYm91dCBleHRyYSBjaGFyYWN0ZXJzLgotICogT3B0ZXggdG8gc3RhcnQgd2l0aCBvbmUgZXh0cmEgY2hhcmFjdGVyIHNvIGl0IGNhbiBiZSBvdmVyd3JpdHRlbiBmb3IKLSAqIHRoZSBiYWNrd2FyZCBwYXJ0IG9mIHRoZSBwYXJzaW5nLgotICogWW91IGNhbid0IHB1dCBhIGJ1bmNoIG9mIGV4dHJhIGNoYXJhY3RlcnMgaW4gc2lkZSB0bwotICogbWFrZSB0aGUgY29tbWFuZCBsb29rIGN1dGUuIGllOiAqIGZvbyAoIHIxICkgWyAgcjAgXQotICogSWYgeW91IGxpa2UgZG9pbmcgYSBsb3Qgb2YgdHlwaW5nLCB0cnkgQ09CT0whCi0gKiBBY3R1YWxseSwgdGhpcyBwYXJzZXIgaXMgYSBsaXR0bGUgd2VhayBhbGwgYXJvdW5kLiBJdCdzIGRlc2lnbmVkIHRvIGJlCi0gKiB1c2VkIHdpdGggY29tcGxpZXJzLCBzbyBJIGVtcGhpc2lzZSBjb3JyZWN0IGRlY29kaW5nIG9mIHZhbGlkIGNvZGUgcXVpY2tseQotICogcmF0aGVyIHRoYXQgY2F0Y2hpbmcgZXZlcnkgcG9zc2FibGUgZXJyb3IuCi0gKiBOb3RlOiBUaGlzIHVzZXMgdGhlIGV4cHJlc3Npb24gZnVuY3Rpb24sIHNvIHNhdmUgaW5wdXRfbGluZV9wb2ludGVyIGJlZm9yZQotICogY2FsbGluZy4KLSAqCi0gKiBTcGVycnkgZGVmaW5lcyB0aGUgc2VtYW50aWNzIG9mIGFkZHJlc3MgbW9kZXMgKGFuZCB2YWx1ZXMpCi0gKiBieSBhIHR3by1sZXR0ZXIgY29kZSwgZXhwbGFpbmVkIGhlcmUuCi0gKgotICogICBsZXR0ZXIgMTogICBhY2Nlc3MgdHlwZQotICoKLSAqICAgICBhICAgICAgICAgYWRkcmVzcyBjYWxjdWxhdGlvbiAtIG5vIGRhdGEgYWNjZXNzLCByZWdpc3RlcnMgZm9yYmlkZGVuCi0gKiAgICAgYiAgICAgICAgIGJyYW5jaCBkaXNwbGFjZW1lbnQKLSAqICAgICBtICAgICAgICAgcmVhZCAtIGxldCBnbyBvZiBidXMgLSB3cml0ZSBiYWNrICJtb2RpZnkiCi0gKiAgICAgciAgICAgICAgIHJlYWQKLSAqICAgICB3ICAgICAgICAgd3JpdGUKLSAqICAgICB2ICAgICAgICAgYml0IGZpZWxkIGFkZHJlc3M6IGxpa2UgJ2EnIGJ1dCByZWdpc3RlcnMgYXJlIE9LCi0gKgotICogICBsZXR0ZXIgMjogICBkYXRhIHR5cGUgKGkuZS4gd2lkdGgsIGFsaWdubWVudCkKLSAqCi0gKiAgICAgYiAgICAgICAgIGJ5dGUKLSAqICAgICB3ICAgICAgICAgd29yZAotICogICAgIGwgICAgICAgICBsb25nd29yZAotICogICAgIHEgICAgICAgICBxdWFkd29yZCAoRXZlbiByZWdzIDwgMTQgYWxsb3dlZCkgKGlmIDEyLCB5b3UgZ2V0IGEgd2FybmluZykKLSAqICAgICAtCSB1bmNvbmRpdGlvbmFsIHN5bnRoZXRpYyBqYnIgb3BlcmFuZAotICogICAgID8JIHNpbXBsZSBzeW50aGV0aWMgcmV2ZXJzYWJsZSBicmFuY2ggb3BlcmFuZAotICogICAgICEJIGNvbXBsZXggc3ludGhldGljIHJldmVyc2FibGUgYnJhbmNoIG9wZXJhbmQKLSAqICAgICA6CSBjb21wbGV4IHN5bnRoZXRpYyBub24tcmV2ZXJzYWJsZSBicmFuY2ggb3BlcmFuZAotICoKLSAqIFRoZSAnLT8hOicgbGV0dGVyIDIncyBhcmUgbm90IGZvciBleHRlcm5hbCBjb25zdW1wdGlvbi4gVGhleSBhcmUgdXNlZAotICogYnkgR0FTIGZvciBwc3VlZG8gb3BzIHJlbGF4aW5nIGNvZGUuCi0gKgotICogQWZ0ZXIgcGFyc2luZyB0b3BQIGhhczoKLSAqCi0gKiAgIHRvcF9uZHg6ICAgICAgICAtMSwgb3IgdGhlIGluZGV4IHJlZ2lzdGVyLiBlZyA3PVtSN10KLSAqICAgdG9wX3JlZzogICAgICAgIC0xLCBvciByZWdpc3RlciBudW1iZXIuIGVnIDcgPSBSNyBvciAoUjcpCi0gKiAgIHRvcF9tb2RlOiAgICAgICBUaGUgYWRkcmVzc2luZyBtb2RlIGJ5dGUuIFRoaXMgYnl0ZSwgZGVmaW5lcyB3aGljaCBvZgotICogICAgICAgICAgICAgICAgICAgdGhlIDExIG1vZGVzIG9wY29kZSBpcy4KLSAqICAgdG9wX2FjY2VzczogICAgIEFjY2VzcyB0eXBlIHdhbnRlZCBmb3IgdGhpcyBvcHBlcmFuZCAnYidicmFuY2ggJyAnCi0gKiAgICAgICAgICAgICAgICAgICBuby1pbnN0cnVjdGlvbiAnYW1ydncnCi0gKiAgIHRvcF93aWR0aDogICAgICBPcGVyYW5kIHdpZHRoIGV4cGVjdGVkLCBvbmUgb2YgImJ3bHE/LTohIgotICogICBleHBfb2Zfb3BlcmFuZDogVGhlIGV4cHJlc3Npb24gYXMgcGFyc2VkIGJ5IGV4cHJlc3Npb24oKQotICogICB0b3BfZGlzcHNpemU6ICAgTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBkaXNwbGFjZW1lbnQgaWYgd2UgY2FuIGZpZ3VyZSBpdAotICogICAgICAgICAgICAgICAgICAgb3V0IGFuZCBpdCdzIHJlbGF2ZW50LgotICoKLSAqIE5lZWQgc3ludGF4IGNoZWNrcyBidWlsdC4KLSAqLwotCi12b2lkCi10aXBfb3AgKG9wdGV4LCB0b3BQKQotICAgICBjaGFyICpvcHRleDsJCS8qIFRoZSB1c2VycyB0ZXh0IGlucHV0LCB3aXRoIG9uZSBsZWFkaW5nIGNoYXJhY3RlciAqLwotICAgICBzdHJ1Y3QgdG9wICp0b3BQOwkJLyogVGhlIHRhaG9lIGluc3RydWN0aW9uIHdpdGggc29tZSBmaWVsZHMgYWxyZWFkeSBzZXQ6Ci0JCQkgaW46IGFjY2Vzcywgd2lkdGgKLQkJCSBvdXQ6IG5keCwgcmVnLCBtb2RlLCBlcnJvciwgZGlzcHNpemUgKi8KLQotewotICBpbnQgbW9kZSA9IDA7CQkJLyogVGhpcyBvcGVyYW5kJ3MgbW9kZS4gKi8KLSAgY2hhciBzZWdmYXVsdCA9ICpvcHRleDsJLyogVG8ga2VlcCB0aGUgYmFjayBwYXJzaW5nIGZyb20gZnJlYWtpbmcuICovCi0gIGNoYXIgKnBvaW50ID0gb3B0ZXggKyAxOwkvKiBQYXJzaW5nIGZyb20gZnJvbnQgdG8gYmFjay4gKi8KLSAgY2hhciAqZW5kOwkJCS8qIFBhcnNpbmcgZnJvbSBiYWNrIHRvIGZyb250LiAqLwotICBpbnQgcmVnID0gLTE7CQkJLyogbWFqb3IgcmVnaXN0ZXIsIC0xIG1lYW5zIGFic2VudCAqLwotICBpbnQgaW1yZWcgPSAtMTsJCS8qIE1ham9yIHJlZ2lzdGVyIGluIGltbWVkaWF0ZSBtb2RlICovCi0gIGludCBuZHggPSAtMTsJCQkvKiBpbmRleCByZWdpc3RlciBudW1iZXIsIC0xIG1lYW5zIGFic2VudCAqLwotICBjaGFyIGRlY19pbmMgPSAnICc7CQkvKiBJcyB0aGUgU1AgYXV0by1pbmNyZW1lbnRlZCAnKycgb3IKLQkJCQkgICBhdXRvLWRlY3JlbWVudGVkICctJyBvciBuZWl0aGVyICcgJy4gKi8KLSAgaW50IGltbWVkaWF0ZSA9IDA7CQkvKiAxIGlmICckJyBpbW1lZGlhdGUgbW9kZSAqLwotICBpbnQgY2FsbF93aWR0aCA9IDA7CQkvKiBJZiB0aGUgY2FsbGVyIGNhc3RzIHRoZSBkaXNwbGFjZW1lbnQgKi8KLSAgaW50IGFic193aWR0aCA9IDA7CQkvKiBUaGUgd2lkdGggb2YgdGhlIGFic29sdXRlIGRpc3BsYWNtZW50ICovCi0gIGludCBjb21fd2lkdGggPSAwOwkJLyogRGlzcGxhY2VtZW50IHdpZHRoIHJlcXVpcmVkIGJ5IGJyYW5jaCAqLwotICBpbnQgZGVmZXJyZWQgPSAwOwkJLyogMSBpZiAnKicgZGVmZXJyYWwgaXMgdXNlZCAqLwotICBieXRlIGRpc3Bfc2l6ZSA9IDA7CQkvKiBIb3cgYmlnIGlzIHRoaXMgb3BlcmFuZC4gMCA9PSBkb24ndCBrbm93ICovCi0gIGNoYXIgKm9wX2JhZCA9ICIiOwkJLyogQmFkIG9wZXJhbmQgZXJyb3IgKi8KLQotICBjaGFyICp0cCwgKnRlbXAsIGM7CQkvKiBUZW1wb3JhcnkgaG9sZGVycyAqLwotCi0gIGNoYXIgYWNjZXNzID0gdG9wUC0+dG9wX2FjY2VzczsJLyogU2F2ZSBvbiBhIGRlcmVmLiAqLwotICBjaGFyIHdpZHRoID0gdG9wUC0+dG9wX3dpZHRoOwotCi0gIGludCByZWFsbHlfbm9uZSA9IDA7CQkvKiBFbXB0eSBleHByZXNzaW9ucyBldmFsdWF0ZSB0byAwCi0JCQkJICAgYnV0IEkgbmVlZCB0byBrbm93IGlmIGl0J3MgdGhlcmUgb3Igbm90ICovCi0gIGV4cHJlc3Npb25TICpleHBQOwkJLyogLT4gZXhwcmVzc2lvbiB2YWx1ZXMgZm9yIHRoaXMgb3BlcmFuZCAqLwotCi0gIC8qIERvZXMgdGhpcyBjb21tYW5kIHJlc3RyaWN0IHRoZSBkaXNwbGFjZW1lbnQgc2l6ZS4gKi8KLSAgaWYgKGFjY2VzcyA9PSAnYicpCi0gICAgY29tX3dpZHRoID0gKHdpZHRoID09ICdiJyA/IDEgOgotCQkgKHdpZHRoID09ICd3JyA/IDIgOgotCQkgICh3aWR0aCA9PSAnbCcgPyA0IDogMCkpKTsKLQotICAqb3B0ZXggPSAnXDAnOwkJLyogVGhpcyBpcyBraW5kIG9mIGEgYmFjayBzdG9wIGZvciBhbGwKLQkJCQkgICB0aGUgc2VhcmNoZXMgdG8gZmFpbCBvbiBpZiBuZWVkZWQuKi8KLSAgaWYgKCpwb2ludCA9PSAnKicpCi0gICAgewkJCQkvKiBBIGRlcmVmZXJlbmNlPyAqLwotICAgICAgZGVmZXJyZWQgPSAxOwotICAgICAgcG9pbnQrKzsKLSAgICB9Ci0KLSAgLyogRm9yY2Ugd29yZHMgaW50byBhIGNlcnRhaW4gbW9kZSAqLwotICAvKiBCaXRjaCwgQml0Y2gsIEJpdGNoISAqLwotICAvKgotICAgKiBVc2luZyB0aGUgXiBvcGVyYXRvciBpcyBhbWJpZ291cy4gSWYgSSBoYXZlIGFuIGFic29sdXRlIGxhYmVsCi0gICAqIGNhbGxlZCAndycgc2V0IHRvLCBzYXkgMiwgYW5kIEkgaGF2ZSB0aGUgZXhwcmVzc2lvbiAnd14xJywgZG8gSSBnZXQKLSAgICogMSwgZm9yY2VkIHRvIGJlIGluIHdvcmQgZGlzcGxhY2VtZW50IG1vZGUsIG9yIGRvIEkgZ2V0IHRoZSB2YWx1ZSBvZgotICAgKiAndycgb3InZWQgd2l0aCAxICgzIGluIHRoaXMgY2FzZSkuCi0gICAqIFRoZSBkZWZhdWx0IGlzICd3JyBhcyBhbiBvZmZzZXQsIHNvIHRoYXQncyB3aGF0IEkgdXNlLgotICAgKiBTdGljayB3aXRoIGAsIGl0IGRvZXMgdGhlIHNhbWUsIGFuZCBpc24ndCBhbWJpZy4KLSAgICovCi0KLSAgaWYgKCpwb2ludCAhPSAnXDAnICYmICgocG9pbnRbMV0gPT0gJ14nKSB8fCAocG9pbnRbMV0gPT0gJ2AnKSkpCi0gICAgc3dpdGNoICgqcG9pbnQpCi0gICAgICB7Ci0gICAgICBjYXNlICdiJzoKLSAgICAgIGNhc2UgJ0InOgotICAgICAgY2FzZSAndyc6Ci0gICAgICBjYXNlICdXJzoKLSAgICAgIGNhc2UgJ2wnOgotICAgICAgY2FzZSAnTCc6Ci0JaWYgKGNvbV93aWR0aCkKLQkgIGFzX3dhcm4gKF8oIkNhc3RpbmcgYSBicmFuY2ggZGlzcGxhY2VtZW50IGlzIGJhZCBmb3JtLCBhbmQgaXMgaWdub3JlZC4iKSk7Ci0JZWxzZQotCSAgewotCSAgICBjID0gKGlzdXBwZXIgKCpwb2ludCkgPyB0b2xvd2VyICgqcG9pbnQpIDogKnBvaW50KTsKLQkgICAgY2FsbF93aWR0aCA9ICgoYyA9PSAnYicpID8gMSA6Ci0JCQkgICgoYyA9PSAndycpID8gMiA6IDQpKTsKLQkgIH0KLQlwb2ludCArPSAyOwotCWJyZWFrOwotICAgICAgfQotCi0gIC8qIFNldHRpbmcgaW1tZWRpYXRlIG1vZGUgKi8KLSAgaWYgKCpwb2ludCA9PSAnJCcpCi0gICAgewotICAgICAgaW1tZWRpYXRlID0gMTsKLSAgICAgIHBvaW50Kys7Ci0gICAgfQotCi0gIC8qCi0gICAqIEkndmUgcHVsbGVkIG9mZiBhbGwgdGhlIGVhc3kgc3R1ZmYgb2ZmIHRoZSBmcm9udCwgbW92ZSB0byB0aGUgZW5kIGFuZAotICAgKiB5YW5rLgotICAgKi8KLQotICBmb3IgKGVuZCA9IHBvaW50OyAqZW5kICE9ICdcMCc7IGVuZCsrKQkvKiBNb3ZlIHRvIHRoZSBlbmQuICovCi0gICAgOwotCi0gIGlmIChlbmQgIT0gcG9pbnQpCQkvKiBOdWxsIHN0cmluZz8gKi8KLSAgICBlbmQtLTsKLQotICBpZiAoZW5kID4gcG9pbnQgJiYgKmVuZCA9PSAnICcgJiYgZW5kWy0xXSAhPSAnXCcnKQotICAgIGVuZC0tOwkJCS8qIEhvcCB3aGl0ZSBzcGFjZSAqLwotCi0gIC8qIElzIHRoaXMgYW4gaW5kZXggcmVnLiAqLwotICBpZiAoKCplbmQgPT0gJ10nKSAmJiAoZW5kWy0xXSAhPSAnXCcnKSkKLSAgICB7Ci0gICAgICB0ZW1wID0gZW5kOwotCi0gICAgICAvKiBGaW5kIG9wZW5pbmcgYnJhY2UuICovCi0gICAgICBmb3IgKC0tZW5kOyAoKmVuZCAhPSAnWycgJiYgZW5kICE9IHBvaW50KTsgZW5kLS0pCi0JOwotCi0gICAgICAvKiBJZiBJIGZvdW5kIHRoZSBvcGVuaW5nIGJyYWNlLCBnZXQgdGhlIGluZGV4IHJlZ2lzdGVyIG51bWJlci4gKi8KLSAgICAgIGlmICgqZW5kID09ICdbJykKLQl7Ci0JICB0cCA9IGVuZCArIDE7CQkvKiB0cCBzaG91bGQgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIGEgcmVnLiAqLwotCSAgbmR4ID0gdGFob2VfcmVnX3BhcnNlICgmdHApOwotCSAgaWYgKHRwICE9IHRlbXApCi0JICAgIHsJCQkvKiBSZWcuIHBhcnNlIGVycm9yLiAqLwotCSAgICAgIG5keCA9IC0xOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBlbmQtLTsJCS8qIEZvdW5kIGl0LCBtb3ZlIHBhc3QgYnJhY2UuICovCi0JICAgIH0KLQkgIGlmIChuZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBvcF9iYWQgPSBfKCJDb3VsZG4ndCBwYXJzZSB0aGUgW2luZGV4XSBpbiB0aGlzIG9wZXJhbmQuIik7Ci0JICAgICAgZW5kID0gcG9pbnQ7CS8qIEZvcmNlIGFsbCB0aGUgcmVzdCBvZiB0aGUgdGVzdHMgdG8gZmFpbC4gKi8KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvcF9iYWQgPSBfKCJDb3VsZG4ndCBmaW5kIHRoZSBvcGVuaW5nICdbJyBmb3IgdGhlIGluZGV4IG9mIHRoaXMgb3BlcmFuZC4iKTsKLQkgIGVuZCA9IHBvaW50OwkJLyogRm9yY2UgYWxsIHRoZSByZXN0IG9mIHRoZSB0ZXN0cyB0byBmYWlsLiAqLwotCX0KLSAgICB9Ci0KLSAgLyogUG9zdCBpbmNyZW1lbnQ/ICovCi0gIGlmICgqZW5kID09ICcrJykKLSAgICB7Ci0gICAgICBkZWNfaW5jID0gJysnOwotICAgICAgLyogd2FzOiAgICAqZW5kLS07ICovCi0gICAgICBlbmQtLTsKLSAgICB9Ci0KLSAgLyogcmVnaXN0ZXIgaW4gcGFyZW5zPyAqLwotICBpZiAoKCplbmQgPT0gJyknKSAmJiAoZW5kWy0xXSAhPSAnXCcnKSkKLSAgICB7Ci0gICAgICB0ZW1wID0gZW5kOwotCi0gICAgICAvKiBGaW5kIG9wZW5pbmcgcGFyZW4uICovCi0gICAgICBmb3IgKC0tZW5kOyAoKmVuZCAhPSAnKCcgJiYgZW5kICE9IHBvaW50KTsgZW5kLS0pCi0JOwotCi0gICAgICAvKiBJZiBJIGZvdW5kIHRoZSBvcGVuaW5nIHBhcmVuLCBnZXQgdGhlIHJlZ2lzdGVyIG51bWJlci4gKi8KLSAgICAgIGlmICgqZW5kID09ICcoJykKLQl7Ci0JICB0cCA9IGVuZCArIDE7Ci0JICByZWcgPSB0YWhvZV9yZWdfcGFyc2UgKCZ0cCk7Ci0JICBpZiAodHAgIT0gdGVtcCkKLQkgICAgewotCSAgICAgIC8qIE5vdCBhIHJlZ2lzdGVyLCBidXQgY291bGQgYmUgcGFydCBvZiB0aGUgZXhwcmVzc2lvbi4gKi8KLQkgICAgICByZWcgPSAtMTsKLQkgICAgICBlbmQgPSB0ZW1wOwkvKiBSZXN0IHRoZSBwb2ludGVyIGJhY2sgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZW5kLS07CQkvKiBGb3VuZCB0aGUgcmVnLiBtb3ZlIGJlZm9yZSBvcGVuaW5nIHBhcmVuLiAqLwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9wX2JhZCA9IF8oIkNvdWxkbid0IGZpbmQgdGhlIG9wZW5pbmcgJygnIGZvciB0aGUgZGVyZWYgb2YgdGhpcyBvcGVyYW5kLiIpOwotCSAgZW5kID0gcG9pbnQ7CQkvKiBGb3JjZSBhbGwgdGhlIHJlc3Qgb2YgdGhlIHRlc3RzIHRvIGZhaWwuICovCi0JfQotICAgIH0KLQotICAvKiBQcmUgZGVjcmVtZW50PyAqLwotICBpZiAoKmVuZCA9PSAnLScpCi0gICAgewotICAgICAgaWYgKGRlY19pbmMgIT0gJyAnKQotCXsKLQkgIG9wX2JhZCA9IF8oIk9wZXJhbmQgY2FuJ3QgYmUgYm90aCBwcmUtaW5jIGFuZCBwb3N0LWRlYy4iKTsKLQkgIGVuZCA9IHBvaW50OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkZWNfaW5jID0gJy0nOwotCSAgLyogd2FzOiAgICAgICplbmQtLTsgKi8KLQkgIGVuZC0tOwotCX0KLSAgICB9Ci0KLSAgLyoKLSAgICogRXZlcnl0aGluZyBiZXR3ZWVuIHBvaW50IGFuZCBlbmQgaXMgdGhlICdleHByZXNzaW9uJywgdW5sZXNzIGl0J3MKLSAgICogYSByZWdpc3RlciBuYW1lLgotICAgKi8KLQotICBjID0gZW5kWzFdOwotICBlbmRbMV0gPSAnXDAnOwotCi0gIHRwID0gcG9pbnQ7Ci0gIGltcmVnID0gdGFob2VfcmVnX3BhcnNlICgmcG9pbnQpOwkvKiBHZXQgdGhlIGltbWVkaWF0ZSByZWdpc3RlcgotCQkJCSAgICAgIGlmIGl0IGlzIHRoZXJlLiovCi0gIGlmICgqcG9pbnQgIT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBJZiB0aGVyZSBpcyBqdW5rIGFmdGVyIHBvaW50LCB0aGVuIHRoZSBpdCdzIG5vdCBpbW1lZGlhdGUgcmVnLiAqLwotICAgICAgcG9pbnQgPSB0cDsKLSAgICAgIGltcmVnID0gLTE7Ci0gICAgfQotCi0gIGlmIChpbXJlZyAhPSAtMSAmJiByZWcgIT0gLTEpCi0gICAgb3BfYmFkID0gXygiSSBwYXJzZWQgMiByZWdpc3RlcnMgaW4gdGhpcyBvcGVyYW5kLiIpOwotCi0gIC8qCi0gICAqIEV2YWx1YXRlIHdoYXRzIGxlZnQgb2YgdGhlIGV4cHJlc3Npb24gdG8gc2VlIGlmIGl0J3MgdmFsaWQuCi0gICAqIE5vdGUgYWdhaW46IFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBjYWxsaW5nIGV4cHJlc3Npb24gaGFzIHNhdmVkCi0gICAqIGlucHV0X2xpbmVfcG9pbnRlci4gKE5hZywgbmFnLCBuYWchKQotICAgKi8KLQotICBpZiAoKm9wX2JhZCA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIHN0YXRlbWVudCBoYXMgbm8gc3ludGF4IGdvb2ZzIHlldDogbGV0cyBzbmlmZiB0aGUgZXhwcmVzc2lvbiAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcG9pbnQ7Ci0gICAgICBleHBQID0gJih0b3BQLT5leHBfb2Zfb3BlcmFuZCk7Ci0gICAgICB0b3BQLT5zZWdfb2Zfb3BlcmFuZCA9IGV4cHJlc3Npb24gKGV4cFApOwotICAgICAgc3dpdGNoIChleHBQLT5YX29wKQotCXsKLQljYXNlIE9fYWJzZW50OgotCSAgLyogTm8gZXhwcmVzc2lvbi4gRm9yIEJTRDQuMiBjb21wYXRpYmlsaXR5LCBtaXNzaW5nIGV4cHJlc3Npb24gaXMKLQkgICAgIGFic29sdXRlIDAgKi8KLQkgIGV4cFAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgZXhwUC0+WF9hZGRfbnVtYmVyID0gMDsKLQkgIHJlYWxseV9ub25lID0gMTsKLQljYXNlIE9fY29uc3RhbnQ6Ci0JICAvKiBmb3IgU0VHX0FCU09MVVRFLCB3ZSBzaG91bGRudCBuZWVkIHRvIHNldCBYX29wX3N5bWJvbCwKLQkgICAgIFhfYWRkX3N5bWJvbCB0byBhbnkgcGFydGljdWxhciB2YWx1ZS4gKi8KLQkgIC8qIEJ1dCwgd2Ugd2lsbCBwcm9ncmFtIGRlZmVuc2l2ZWx5LiBTaW5jZSB0aGlzIHNpdHVhdGlvbiBvY2N1cnMKLQkgICAgIHJhcmVseSBzbyBpdCBjb3N0cyB1cyBsaXR0bGUgdG8gZG8gc28uICovCi0JICBleHBQLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotCSAgZXhwUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgLyogSG93IG1hbnkgYnl0ZXMgYXJlIG5lZWRlZCB0byBleHByZXNzIHRoaXMgYWJzIHZhbHVlPyAqLwotCSAgYWJzX3dpZHRoID0KLQkgICAgKCgoKGV4cFAtPlhfYWRkX251bWJlciAmIDB4RkZGRkZGODApID09IDApIHx8Ci0JICAgICAgKChleHBQLT5YX2FkZF9udW1iZXIgJiAweEZGRkZGRjgwKSA9PSAweEZGRkZGRjgwKSkgPyAxIDoKLQkgICAgICgoKGV4cFAtPlhfYWRkX251bWJlciAmIDB4RkZGRjgwMDApID09IDApIHx8Ci0JICAgICAgKChleHBQLT5YX2FkZF9udW1iZXIgJiAweEZGRkY4MDAwKSA9PSAweEZGRkY4MDAwKSkgPyAyIDogNCk7Ci0KLQljYXNlIE9fc3ltYm9sOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgLyoKLQkgICAqIE1ham9yIGJ1Zy4gV2UgY2FuJ3QgaGFuZGxlIHRoZSBjYXNlIG9mIGEgb3BlcmF0b3IKLQkgICAqIGV4cHJlc3Npb24gaW4gYSBzeW50aGV0aWMgb3Bjb2RlIHZhcmlhYmxlLWxlbmd0aAotCSAgICogaW5zdHJ1Y3Rpb24uICBXZSBkb24ndCBoYXZlIGEgZnJhZyB0eXBlIHRoYXQgaXMgc21hcnQKLQkgICAqIGVub3VnaCB0byByZWxheCBhIG9wZXJhdG9yLCBhbmQgc28gd2UganVzdCBmb3JjZSBhbGwKLQkgICAqIG9wZXJhdG9ycyB0byBiZWhhdmUgbGlrZSBTRUdfUEFTUzFzLiAgQ2xlYXJseSwgaWYgdGhlcmUgaXMKLQkgICAqIGEgZGVtYW5kIHdlIGNhbiBpbnZlbnQgYSBuZXcgb3IgbW9kaWZpZWQgZnJhZyB0eXBlIGFuZAotCSAgICogdGhlbiBjb2RpbmcgdXAgYSBmcmFnIGZvciB0aGlzIGNhc2Ugd2lsbCBiZSBlYXN5LgotCSAgICovCi0JICBuZWVkX3Bhc3NfMiA9IDE7Ci0JICBvcF9iYWQgPSBfKCJDYW4ndCByZWxvY2F0ZSBleHByZXNzaW9uIGVycm9yLiIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9fYmlnOgotCSAgLyogVGhpcyBpcyBhbiBlcnJvci4gVGFob2UgZG9lc24ndCBhbGxvdyBhbnkgZXhwcmVzc2lvbnMKLQkgICAgIGJpZ2dlciB0aGF0IGEgMzIgYml0IGxvbmcgd29yZC4gQW55IGJpZ2dlciBoYXMgdG8gYmUgcmVmZXJlbmNlZAotCSAgICAgYnkgYWRkcmVzcy4gKi8KLQkgIG9wX2JhZCA9IF8oIkV4cHJlc3Npb24gaXMgdG9vIGxhcmdlIGZvciBhIDMyIGJpdHMuIik7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXDAnKQotCXsKLQkgIG9wX2JhZCA9IF8oIkp1bmsgYXQgZW5kIG9mIGV4cHJlc3Npb24uIik7Ci0JfQotICAgIH0KLQotICBlbmRbMV0gPSBjOwotCi0gIC8qIEknbSBkb25lLCBzbyByZXN0b3JlIG9wdGV4ICovCi0gICpvcHRleCA9IHNlZ2ZhdWx0OwotCi0KLSAgLyoKLSAgICogQXQgdGhpcyBwb2ludCBpbiB0aGUgZ2FtZSwgd2UgKGluIHRoZW9yeSkgaGF2ZSBhbGwgdGhlIGNvbXBvbmVudHMgb2YKLSAgICogdGhlIG9wZXJhbmQgYXQgbGVhc3QgcGFyc2VkLiBOb3cgaXQncyB0aW1lIHRvIGNoZWNrIGZvciBzeW50YXgvc2VtYW50aWMKLSAgICogZXJyb3JzLCBhbmQgYnVpbGQgdGhlIG1vZGUuCi0gICAqIFRoaXMgaXMgd2hhdCBJIGhhdmU6Ci0gICAqICAgZGVmZXJyZWQgPSAxIGlmICcqJwotICAgKiAgIGNhbGxfd2lkdGggPSAwLDEsMiw0Ci0gICAqICAgYWJzX3dpZHRoID0gMCwxLDIsNAotICAgKiAgIGNvbV93aWR0aCA9IDAsMSwyLDQKLSAgICogICBpbW1lZGlhdGUgPSAxIGlmICckJwotICAgKiAgIG5keCA9IC0xIG9yIHJlZyBudW0KLSAgICogICBkZWNfaW5jID0gJy0nIG9yICcrJyBvciAnICcKLSAgICogICByZWcgPSAtMSBvciByZWcgbnVtCi0gICAqICAgaW1yZWcgPSAtMSBvciByZWcgbnVtCi0gICAqICAgdG9wUC0+ZXhwX29mX29wZXJhbmQKLSAgICogICByZWFsbHlfbm9uZQotICAgKi8KLSAgLyogSXMgdGhlcmUgYSBkaXNwbGFjZW1lbnQgc2l6ZT8gKi8KLSAgZGlzcF9zaXplID0gKGNhbGxfd2lkdGggPyBjYWxsX3dpZHRoIDoKLQkgICAgICAgKGNvbV93aWR0aCA/IGNvbV93aWR0aCA6Ci0JCWFic193aWR0aCA/IGFic193aWR0aCA6IDApKTsKLQotICBpZiAoKm9wX2JhZCA9PSAnXDAnKQotICAgIHsKLSAgICAgIGlmIChpbXJlZyAhPSAtMSkKLQl7Ci0JICAvKiBSbiAqLwotCSAgbW9kZSA9IFRBSE9FX0RJUkVDVF9SRUc7Ci0JICBpZiAoZGVmZXJyZWQgfHwgaW1tZWRpYXRlIHx8IChkZWNfaW5jICE9ICcgJykgfHwKLQkgICAgICAocmVnICE9IC0xKSB8fCAhcmVhbGx5X25vbmUpCi0JICAgIG9wX2JhZCA9IF8oIlN5bnRheCBlcnJvciBpbiBkaXJlY3QgcmVnaXN0ZXIgbW9kZS4iKTsKLQkgIGVsc2UgaWYgKG5keCAhPSAtMSkKLQkgICAgb3BfYmFkID0gXygiWW91IGNhbid0IGluZGV4IGEgcmVnaXN0ZXIgaW4gZGlyZWN0IHJlZ2lzdGVyIG1vZGUuIik7Ci0JICBlbHNlIGlmIChpbXJlZyA9PSBTUF9SRUcgJiYgYWNjZXNzID09ICdyJykKLQkgICAgb3BfYmFkID0KLQkgICAgICBfKCJTUCBjYW4ndCBiZSB0aGUgc291cmNlIG9wZXJhbmQgd2l0aCBkaXJlY3QgcmVnaXN0ZXIgYWRkcmVzc2luZy4iKTsKLQkgIGVsc2UgaWYgKGFjY2VzcyA9PSAnYScpCi0JICAgIG9wX2JhZCA9IF8oIkNhbid0IHRha2UgdGhlIGFkZHJlc3Mgb2YgYSByZWdpc3Rlci4iKTsKLQkgIGVsc2UgaWYgKGFjY2VzcyA9PSAnYicpCi0JICAgIG9wX2JhZCA9IF8oIkRpcmVjdCBSZWdpc3RlciBjYW4ndCBiZSB1c2VkIGluIGEgYnJhbmNoLiIpOwotCSAgZWxzZSBpZiAod2lkdGggPT0gJ3EnICYmICgoaW1yZWcgJSAyKSB8fCAoaW1yZWcgPiAxMykpKQotCSAgICBvcF9iYWQgPSBfKCJGb3IgcXVhZCBhY2Nlc3MsIHRoZSByZWdpc3RlciBtdXN0IGJlIGV2ZW4gYW5kIDwgMTQuIik7Ci0JICBlbHNlIGlmIChjYWxsX3dpZHRoKQotCSAgICBvcF9iYWQgPSBfKCJZb3UgY2FuJ3QgY2FzdCBhIGRpcmVjdCByZWdpc3Rlci4iKTsKLQotCSAgaWYgKCpvcF9iYWQgPT0gJ1wwJykKLQkgICAgewotCSAgICAgIC8qIE5vIGVycm9ycywgY2hlY2sgZm9yIHdhcm5pbmdzICovCi0JICAgICAgaWYgKHdpZHRoID09ICdxJyAmJiBpbXJlZyA9PSAxMikKLQkJYXNfd2FybiAoXygiVXNpbmcgcmVnIDE0IGZvciBxdWFkd29yZHMgY2FuIHRyb21wIHRoZSBGUCByZWdpc3Rlci4iKSk7Ci0KLQkgICAgICByZWcgPSBpbXJlZzsKLQkgICAgfQotCi0JICAvKiBXZSBrbm93OiBpbW0gPSAtMSAqLwotCX0KLSAgICAgIGVsc2UgaWYgKGRlY19pbmMgPT0gJy0nKQotCXsKLQkgIC8qIC0oU1ApICovCi0JICBtb2RlID0gVEFIT0VfQVVUT19ERUM7Ci0JICBpZiAoZGVmZXJyZWQgfHwgaW1tZWRpYXRlIHx8ICFyZWFsbHlfbm9uZSkKLQkgICAgb3BfYmFkID0gXygiU3ludGF4IGVycm9yIGluIGF1dG8tZGVjIG1vZGUuIik7Ci0JICBlbHNlIGlmIChuZHggIT0gLTEpCi0JICAgIG9wX2JhZCA9IF8oIllvdSBjYW4ndCBoYXZlIGFuIGluZGV4IGF1dG8gZGVjIG1vZGUuIik7Ci0JICBlbHNlIGlmIChhY2Nlc3MgPT0gJ3InKQotCSAgICBvcF9iYWQgPSBfKCJBdXRvIGRlYyBtb2RlIGNhbnQgYmUgdXNlZCBmb3IgcmVhZGluZy4iKTsKLQkgIGVsc2UgaWYgKHJlZyAhPSBTUF9SRUcpCi0JICAgIG9wX2JhZCA9IF8oIkF1dG8gZGVjIG9ubHkgd29ya3Mgb2YgdGhlIFNQIHJlZ2lzdGVyLiIpOwotCSAgZWxzZSBpZiAoYWNjZXNzID09ICdiJykKLQkgICAgb3BfYmFkID0gXygiQXV0byBkZWMgY2FuJ3QgYmUgdXNlZCBpbiBhIGJyYW5jaC4iKTsKLQkgIGVsc2UgaWYgKHdpZHRoID09ICdxJykKLQkgICAgb3BfYmFkID0gXygiQXV0byBkZWMgd29uJ3Qgd29yayB3aXRoIHF1YWR3b3Jkcy4iKTsKLQotCSAgLyogV2Uga25vdzogaW1tID0gLTEsIGRlY19pbmMgIT0gJy0nICovCi0JfQotICAgICAgZWxzZSBpZiAoZGVjX2luYyA9PSAnKycpCi0JewotCSAgaWYgKGltbWVkaWF0ZSB8fCAhcmVhbGx5X25vbmUpCi0JICAgIG9wX2JhZCA9IF8oIlN5bnRheCBlcnJvciBpbiBvbmUgb2YgdGhlIGF1dG8taW5jIG1vZGVzLiIpOwotCSAgZWxzZSBpZiAoZGVmZXJyZWQpCi0JICAgIHsKLQkgICAgICAvKiAqKFNQKSsgKi8KLQkgICAgICBtb2RlID0gVEFIT0VfQVVUT19JTkNfREVGRVJSRUQ7Ci0JICAgICAgaWYgKHJlZyAhPSBTUF9SRUcpCi0JCW9wX2JhZCA9IF8oIkF1dG8gaW5jIGRlZmVycmVkIG9ubHkgd29ya3Mgb2YgdGhlIFNQIHJlZ2lzdGVyLiIpOwotCSAgICAgIGVsc2UgaWYgKG5keCAhPSAtMSkKLQkJb3BfYmFkID0gXygiWW91IGNhbid0IGhhdmUgYW4gaW5kZXggYXV0byBpbmMgZGVmZXJyZWQgbW9kZS4iKTsKLQkgICAgICBlbHNlIGlmIChhY2Nlc3MgPT0gJ2InKQotCQlvcF9iYWQgPSBfKCJBdXRvIGluYyBjYW4ndCBiZSB1c2VkIGluIGEgYnJhbmNoLiIpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiAoU1ApKyAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9BVVRPX0lOQzsKLQkgICAgICBpZiAoYWNjZXNzID09ICdtJyB8fCBhY2Nlc3MgPT0gJ3cnKQotCQlvcF9iYWQgPSBfKCJZb3UgY2FuJ3Qgd3JpdGUgdG8gYW4gYXV0byBpbmMgcmVnaXN0ZXIuIik7Ci0JICAgICAgZWxzZSBpZiAocmVnICE9IFNQX1JFRykKLQkJb3BfYmFkID0gXygiQXV0byBpbmMgb25seSB3b3JrcyBvZiB0aGUgU1AgcmVnaXN0ZXIuIik7Ci0JICAgICAgZWxzZSBpZiAoYWNjZXNzID09ICdiJykKLQkJb3BfYmFkID0gXygiQXV0byBpbmMgY2FuJ3QgYmUgdXNlZCBpbiBhIGJyYW5jaC4iKTsKLQkgICAgICBlbHNlIGlmICh3aWR0aCA9PSAncScpCi0JCW9wX2JhZCA9IF8oIkF1dG8gaW5jIHdvbid0IHdvcmsgd2l0aCBxdWFkd29yZHMuIik7Ci0JICAgICAgZWxzZSBpZiAobmR4ICE9IC0xKQotCQlvcF9iYWQgPSBfKCJZb3UgY2FuJ3QgaGF2ZSBhbiBpbmRleCBpbiBhdXRvIGluYyBtb2RlLiIpOwotCSAgICB9Ci0KLQkgIC8qIFdlIGtub3c6IGltbSA9IC0xLCBkZWNfaW5jID09ICcgJyAqLwotCX0KLSAgICAgIGVsc2UgaWYgKHJlZyAhPSAtMSkKLQl7Ci0JICBpZiAoKG5keCAhPSAtMSkgJiYgKHJlZyA9PSBTUF9SRUcpKQotCSAgICBvcF9iYWQgPSBfKCJZb3UgY2FuJ3QgaW5kZXggdGhlIHNwIHJlZ2lzdGVyLiIpOwotCSAgaWYgKGRlZmVycmVkKQotCSAgICB7Ci0JICAgICAgLyogKjxkaXNwPihSbikgKi8KLQkgICAgICBtb2RlID0gVEFIT0VfUkVHX0RJU1BfREVGRVJSRUQ7Ci0JICAgICAgaWYgKGltbWVkaWF0ZSkKLQkJb3BfYmFkID0gXygiU3ludGF4IGVycm9yIGluIHJlZ2lzdGVyIGRpc3BsYWNlZCBtb2RlLiIpOwotCSAgICB9Ci0JICBlbHNlIGlmIChyZWFsbHlfbm9uZSkKLQkgICAgewotCSAgICAgIC8qIChSbikgKi8KLQkgICAgICBtb2RlID0gVEFIT0VfUkVHX0RFRkVSUkVEOwotCSAgICAgIC8qIGlmIHJlZyA9IFNQIHRoZW4gY2FudCBiZSBpbmRleGVkICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIDxkaXNwPihSbikgKi8KLQkgICAgICBtb2RlID0gVEFIT0VfUkVHX0RJU1A7Ci0JICAgIH0KLQotCSAgLyogV2Uga25vdzogaW1tID0gLTEsIGRlY19pbmMgPT0gJyAnLCBSZWcgPSAtMSAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocmVhbGx5X25vbmUpCi0JICAgIG9wX2JhZCA9IF8oIkFuIG9mZmVzdCBpcyBuZWVkZWQgZm9yIHRoaXMgb3BlcmFuZC4iKTsKLQkgIGlmIChkZWZlcnJlZCAmJiBpbW1lZGlhdGUpCi0JICAgIHsKLQkgICAgICAvKiAqJDxBRERSPiAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9BQlNPTFVURV9BRERSOwotCSAgICAgIGRpc3Bfc2l6ZSA9IDQ7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGltbWVkaWF0ZSkKLQkgICAgewotCSAgICAgIC8qICQ8ZGlzcD4gKi8KLQkgICAgICBtb2RlID0gVEFIT0VfSU1NRURJQVRFOwotCSAgICAgIGlmIChuZHggIT0gLTEpCi0JCW9wX2JhZCA9IF8oIllvdSBjYW4ndCBpbmRleCBhIHJlZ2lzdGVyIGluIGltbWVkaWF0ZSBtb2RlLiIpOwotCSAgICAgIGlmIChhY2Nlc3MgPT0gJ2EnKQotCQlvcF9iYWQgPSBfKCJJbW1lZGlhdGUgYWNjZXNzIGNhbid0IGJlIHVzZWQgYXMgYW4gYWRkcmVzcy4iKTsKLQkgICAgICAvKiBwb25kZXIgdGhlIHdpc2RvbSBvZiBhIGNhc3QgYmVjYXVzZSBpdCBkb2Vzbid0IGRvIGFueSBnb29kLiAqLwotCSAgICB9Ci0JICBlbHNlIGlmIChkZWZlcnJlZCkKLQkgICAgewotCSAgICAgIC8qICo8ZGlzcD4gKi8KLQkgICAgICBtb2RlID0gVEFIT0VfRElTUF9SRUxfREVGRVJSRUQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIDxkaXNwPiAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9ESVNQTEFDRURfUkVMQVRJVkU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qCi0gICAqIEF0IHRoaXMgcG9pbnQsIGFsbCB0aGUgZXJyb3JzIHdlIGNhbiBkbyBoYXZlIGJlIGNoZWNrZWQgZm9yLgotICAgKiBXZSBjYW4gYnVpbGQgdGhlICd0b3AnLiAqLwotCi0gIHRvcFAtPnRvcF9uZHggPSBuZHg7Ci0gIHRvcFAtPnRvcF9yZWcgPSByZWc7Ci0gIHRvcFAtPnRvcF9tb2RlID0gbW9kZTsKLSAgdG9wUC0+dG9wX2Vycm9yID0gb3BfYmFkOwotICB0b3BQLT50b3BfZGlzcHNpemUgPSBkaXNwX3NpemU7Ci19CQkJCS8qIHRpcF9vcCAqLwotDAotLyoKLSAqICAgICAgICAgICAgICAgICAgdCBpIHAgKCApCi0gKgotICogVGhpcyBjb252ZXJ0cyBhIHN0cmluZyBpbnRvIGEgdGFob2UgaW5zdHJ1Y3Rpb24uCi0gKiBUaGUgc3RyaW5nIG11c3QgYmUgYSBiYXJlIHNpbmdsZSBpbnN0cnVjdGlvbiBpbiB0YWhvZSAod2l0aCBCU0Q0IGZyb2JzKQotICogZm9ybWF0LgotICogSXQgcHJvdmlkZXMgYXQgbW9zdCBvbmUgZmF0YWwgZXJyb3IgbWVzc2FnZSAod2hpY2ggc3RvcHMgdGhlIHNjYW4pCi0gKiBzb21lIHdhcm5pbmcgbWVzc2FnZXMgYXMgaXQgZmluZHMgdGhlbS4KLSAqIFRoZSB0YWhvZSBpbnN0cnVjdGlvbiBpcyByZXR1cm5lZCBpbiBleHBsb2RlZCBmb3JtLgotICoKLSAqIFRoZSBleHBsb2RlZCBpbnN0cnVjdGlvbiBpcyByZXR1cm5lZCB0byBhIHN0cnVjdCB0aXQgb2YgeW91ciBjaG9pY2UuCi0gKiAjaW5jbHVkZSAidGFob2UtaW5zdC5oIiB0byBrbm93IHdoYXQgYSBzdHJ1Y3QgdGl0IGlzLgotICoKLSAqLwotCi1zdGF0aWMgdm9pZAotdGlwICh0aXRQLCBpbnN0cmluZykKLSAgICAgc3RydWN0IHRpdCAqdGl0UDsJCS8qIFdlIGJ1aWxkIGFuIGV4cGxvZGVkIGluc3RydWN0aW9uIGhlcmUuICovCi0gICAgIGNoYXIgKmluc3RyaW5nOwkJLyogVGV4dCBvZiBhIHZheCBpbnN0cnVjdGlvbjogd2UgbW9kaWZ5LiAqLwotewotICByZWdpc3RlciBzdHJ1Y3QgdG90X3dvdCAqdHdQID0gTlVMTDsJLyogSG93IHRvIGJpdC1lbmNvZGUgdGhpcyBvcGNvZGUuICovCi0gIHJlZ2lzdGVyIGNoYXIgKnA7CQkvKiAxL3NraXAgd2hpdGVzcGFjZS4yL3NjYW4gdm90X2hvdyAqLwotICByZWdpc3RlciBjaGFyICpxOwkJLyogICovCi0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgY291bnQ7CS8qIGNvdW50cyBudW1iZXIgb2Ygb3BlcmFuZHMgc2VlbiAqLwotICByZWdpc3RlciBzdHJ1Y3QgdG9wICpvcGVyYW5kcDsvKiBzY2FuIG9wZXJhbmRzIGluIHN0cnVjdCB0aXQgKi8KLSAgcmVnaXN0ZXIgY2hhciAqYWxsb3BlcnIgPSAiIjsJLyogZXJyb3Igb3ZlciBhbGwgb3BlcmFuZHMgKi8KLSAgcmVnaXN0ZXIgY2hhciBjOwkJLyogUmVtZW1iZXIgY2hhciwgKHdlIGNsb2JiZXIgaXQKLQkJCQkgICB3aXRoICdcMCcgdGVtcG9yYXJpbHkpLiAqLwotICBjaGFyICpzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoKmluc3RyaW5nID09ICcgJykKLSAgICArK2luc3RyaW5nOwkJCS8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlLiAqLwotICBmb3IgKHAgPSBpbnN0cmluZzsgKnAgJiYgKnAgIT0gJyAnOyBwKyspCi0gICAgOwkJCQkvKiBNVVNUIGVuZCBpbiBlbmQtb2Ytc3RyaW5nIG9yCi0JCQkJICAgZXhhY3RseSAxIHNwYWNlLiAqLwotICAvKiBTY2FubmVkIHVwIHRvIGVuZCBvZiBvcGVyYXRpb24tY29kZS4gKi8KLSAgLyogT3BlcmF0aW9uLWNvZGUgaXMgZW5kZWQgd2l0aCB3aGl0ZXNwYWNlLiAqLwotICBpZiAocCA9PSBpbnN0cmluZykKLSAgICB7Ci0gICAgICB0aXRQLT50aXRfZXJyb3IgPSBfKCJObyBvcGVyYXRvciIpOwotICAgICAgY291bnQgPSAwOwotICAgICAgdGl0UC0+dGl0X29wY29kZSA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYyA9ICpwOwotICAgICAgKnAgPSAnXDAnOwotICAgICAgLyoKLSAgICAgKiBIZXJlIHdpdGggaW5zdHJpbmcgcG9pbnRpbmcgdG8gd2hhdCBiZXR0ZXIgYmUgYW4gb3AtbmFtZSwgYW5kIHAKLSAgICAgKiBwb2ludGluZyB0byBjaGFyYWN0ZXIganVzdCBwYXN0IHRoYXQuCi0gICAgICogV2UgdHJ1c3QgaW5zdHJpbmcgcG9pbnRzIHRvIGFuIG9wLW5hbWUsIHdpdGggbm8gd2hpdGVzcGFjZS4KLSAgICAgKi8KLSAgICAgIHR3UCA9IChzdHJ1Y3QgdG90X3dvdCAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIGluc3RyaW5nKTsKLSAgICAgICpwID0gYzsJCQkvKiBSZXN0b3JlIGNoYXIgYWZ0ZXIgb3AtY29kZS4gKi8KLSAgICAgIGlmICh0d1AgPT0gMCkKLQl7Ci0JICB0aXRQLT50aXRfZXJyb3IgPSBfKCJVbmtub3duIG9wZXJhdG9yIik7Ci0JICBjb3VudCA9IDA7Ci0JICB0aXRQLT50aXRfb3Bjb2RlID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyoKLSAgICAgICAqIFdlIGZvdW5kIGEgbWF0Y2ghIFNvIGxldHMgcGljayB1cCBhcyBtYW55IG9wZXJhbmRzIGFzIHRoZQotICAgICAgICogaW5zdHJ1Y3Rpb24gd2FudHMsIGFuZCBldmVuIGdyaXBlIGlmIHRoZXJlIGFyZSB0b28gbWFueS4KLSAgICAgICAqIFdlIGV4cGVjdCBjb21tYSB0byBzZXBlcmF0ZSBlYWNoIG9wZXJhbmQuCi0gICAgICAgKiBXZSBsZXQgaW5zdHJpbmcgdHJhY2sgdGhlIHRleHQsIHdoaWxlIHAgdHJhY2tzIGEgcGFydCBvZiB0aGUKLSAgICAgICAqIHN0cnVjdCB0b3QuCi0gICAgICAgKi8KLQotCSAgY291bnQgPSAwOwkJLyogbm8gb3BlcmFuZHMgc2VlbiB5ZXQgKi8KLQkgIGluc3RyaW5nID0gcCArICgqcCAhPSAnXDAnKTsJLyogcG9pbnQgcGFzdCB0aGUgb3BlcmF0aW9uIGNvZGUgKi8KLQkgIC8qIHRpcF9vcCgpIHNjcmV3cyB3aXRoIHRoZSBpbnB1dF9saW5lX3BvaW50ZXIsIHNvIHNhdmUgaXQgYmVmb3JlCi0JIEkganVtcCBpbiAqLwotCSAgc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBmb3IgKHAgPSB0d1AtPmFyZ3MsIG9wZXJhbmRwID0gdGl0UC0+dGl0X29wZXJhbmQ7Ci0JICAgICAgICEqYWxsb3BlcnIgJiYgKnA7Ci0JICAgICAgIG9wZXJhbmRwKyssIHAgKz0gMikKLQkgICAgewotCSAgICAgIC8qCi0JICogSGVyZSB0byBwYXJzZSBvbmUgb3BlcmFuZC4gTGVhdmUgaW5zdHJpbmcgcG9pbnRpbmcganVzdAotCSAqIHBhc3QgYW55IG9uZSAnLCcgdGhhdCBtYXJrcyB0aGUgZW5kIG9mIHRoaXMgb3BlcmFuZC4KLQkgKi8KLQkgICAgICBpZiAoIXBbMV0pCi0JCWFzX2ZhdGFsIChfKCJDb21waWxlciBidWc6IE9ERCBudW1iZXIgb2YgYnl0ZXMgaW4gYXJnIHN0cnVjdHVyZSAlcy4iKSwKLQkJCSAgdHdQLT5hcmdzKTsKLQkgICAgICBlbHNlIGlmICgqaW5zdHJpbmcpCi0JCXsKLQkJICBmb3IgKHEgPSBpbnN0cmluZzsgKCpxICE9ICcsJyAmJiAqcSAhPSAnXDAnKTsgcSsrKQotCQkgICAgewotCQkgICAgICBpZiAoKnEgPT0gJ1wnJyAmJiBxWzFdICE9ICdcMCcpCS8qIEp1bXAgcXVvdGVkIGNoYXJhY3RlcnMgKi8KLQkJCXErKzsKLQkJICAgIH0KLQkJICBjID0gKnE7Ci0JCSAgLyoKLQkgICAqIFEgcG9pbnRzIHRvICcsJyBvciAnXDAnIHRoYXQgZW5kcyBhcmd1bWVudC4gQyBpcyB0aGF0Ci0JICAgKiBjaGFyYWN0ZXIuCi0JICAgKi8KLQkJICAqcSA9ICdcMCc7Ci0JCSAgb3BlcmFuZHAtPnRvcF9hY2Nlc3MgPSBwWzBdOwotCQkgIG9wZXJhbmRwLT50b3Bfd2lkdGggPSBwWzFdOwotCQkgIHRpcF9vcCAoaW5zdHJpbmcgLSAxLCBvcGVyYW5kcCk7Ci0JCSAgKnEgPSBjOwkvKiBSZXN0b3JlIGlucHV0IHRleHQuICovCi0JCSAgaWYgKCoob3BlcmFuZHAtPnRvcF9lcnJvcikpCi0JCSAgICB7Ci0JCSAgICAgIGFsbG9wZXJyID0gb3BlcmFuZHAtPnRvcF9lcnJvcjsKLQkJICAgIH0KLQkJICBpbnN0cmluZyA9IHEgKyAoYyA/IDEgOiAwKTsJLyogbmV4dCBvcGVyYW5kIChpZiBhbnkpICovCi0JCSAgY291bnQrKzsJLyogIHdvbiBhbm90aGVyIGFyZ3VtZW50LCBtYXkgaGF2ZSBhbiBvcGVyciAqLwotCQl9Ci0JICAgICAgZWxzZQotCQlhbGxvcGVyciA9IF8oIk5vdCBlbm91Z2ggb3BlcmFuZHMiKTsKLQkgICAgfQotCSAgLyogUmVzdG9yZSB0aGUgcG9pbnRlci4gKi8KLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCi0JICBpZiAoISphbGxvcGVycikKLQkgICAgewotCSAgICAgIGlmICgqaW5zdHJpbmcgPT0gJyAnKQotCQlpbnN0cmluZysrOwkvKiBTa2lwIHdoaXRlc3BhY2UuICovCi0JICAgICAgaWYgKCppbnN0cmluZykKLQkJYWxsb3BlcnIgPSBfKCJUb28gbWFueSBvcGVyYW5kcyIpOwotCSAgICB9Ci0JICB0aXRQLT50aXRfZXJyb3IgPSBhbGxvcGVycjsKLQl9Ci0gICAgfQotCi0gIHRpdFAtPnRpdF9vcGNvZGUgPSB0d1AtPmNvZGU7CS8qIFRoZSBvcC1jb2RlLiAqLwotICB0aXRQLT50aXRfb3BlcmFuZHMgPSBjb3VudDsKLX0JCQkJLyogdGlwICovCi0MCi0vKiBtZF9hc3NlbWJsZSgpIGVtaXQgZnJhZ3MgZm9yIDEgaW5zdHJ1Y3Rpb24gKi8KLXZvaWQKLW1kX2Fzc2VtYmxlIChpbnN0cnVjdGlvbl9zdHJpbmcpCi0gICAgIGNoYXIgKmluc3RydWN0aW9uX3N0cmluZzsJLyogQSBzdHJpbmc6IGFzc2VtYmxlIDEgaW5zdHJ1Y3Rpb24uICovCi17Ci0gIGNoYXIgKnA7Ci0gIHJlZ2lzdGVyIHN0cnVjdCB0b3AgKm9wZXJhbmRQOy8qIEFuIG9wZXJhbmQuIFNjYW5zIGFsbCBvcGVyYW5kcy4gKi8KLSAgLyogIGNoYXIgY19zYXZlOwlmaXhtZTogcmVtb3ZlIHRoaXMgbGluZSAqLy8qIFdoYXQgdXNlZCB0byBsaXZlIGFmdGVyIGFuIGV4cHJlc3Npb24uICovCi0gIC8qICBzdHJ1Y3QgZnJhZyAqZnJhZ1A7CWZpeG1lOiByZW1vdmUgdGhpcyBsaW5lICovLyogRnJhZ21lbnQgb2YgY29kZSB3ZSBqdXN0IG1hZGUuICovCi0gIC8qICByZWdpc3RlciBzdHJ1Y3QgdG9wICplbmRfb3BlcmFuZFA7IGZpeG1lOiByZW1vdmUgdGhpcyBsaW5lICovLyogLT4gc2xvdCBqdXN0IGFmdGVyIGxhc3Qgb3BlcmFuZAotCQkJCQlMaW1pdCBvZiB0aGUgZm9yIChlYWNoIG9wZXJhbmQpLiAqLwotICByZWdpc3RlciBleHByZXNzaW9uUyAqZXhwUDsJLyogLT4gZXhwcmVzc2lvbiB2YWx1ZXMgZm9yIHRoaXMgb3BlcmFuZCAqLwotCi0gIC8qIFRoZXNlIHJlZmVyIHRvIGFuIGluc3RydWN0aW9uIG9wZXJhbmQgZXhwcmVzc2lvbi4gKi8KLSAgc2VnVCB0b19zZWc7CQkJLyogVGFyZ2V0IHNlZ21lbnQgb2YgdGhlIGFkZHJlc3MuCSAqLwotCi0gIHJlZ2lzdGVyIHZhbHVlVCB0aGlzX2FkZF9udW1iZXI7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBzeW1ib2wgKnRoaXNfYWRkX3N5bWJvbDsJLyogK3ZlIChtaW51ZW5kKSBzeW1ib2wuICovCi0KLSAgLyogIHRhaG9lX29wY29kZVQgb3Bjb2RlX2FzX251bWJlcjsgZml4bWU6IHJlbW92ZSB0aGlzIGxpbmUgKi8vKiBUaGUgb3Bjb2RlIGFzIGEgbnVtYmVyLiAqLwotICBjaGFyICpvcGNvZGVQOwkJLyogV2hlcmUgaXQgaXMgaW4gYSBmcmFnLiAqLwotICAvKiAgY2hhciAqb3Btb2RlUDsJZml4bWU6IHJlbW92ZSB0aGlzIGxpbmUgKi8vKiBXaGVyZSBvcGNvZGUgdHlwZSBpcywgaW4gYSBmcmFnLiAqLwotCi0gIGludCBkaXNwc2l6ZTsJCQkvKiBGcm9tIHRvcF9kaXNwc2l6ZTogdGFob2Vfb3BlcmFuZF93aWR0aAotCQkJCSAgIChpbiBieXRlcykgKi8KLSAgaW50IGlzX3VuZGVmaW5lZDsJCS8qIDEgaWYgb3BlcmFuZCBleHByZXNzaW9uJ3MKLQkJCQkgICBzZWdtZW50IG5vdCBrbm93biB5ZXQuICovCi0gIGludCBwY19yZWw7CQkJLyogSXMgdGhpcyBvcGVyYW5kIHBjIHJlbGF0aXZlPyAqLwotCi0gIC8qIERlY29kZSB0aGUgb3BlcmFuZC4gKi8KLSAgdGlwICgmdCwgaW5zdHJ1Y3Rpb25fc3RyaW5nKTsKLQotICAvKgotICAgKiBDaGVjayB0byBzZWUgaWYgdGhpcyBvcGVyYW5kIGRlY29kZSBwcm9wZXJseS4KLSAgICogTm90aWNlIHRoYXQgd2UgaGF2ZW4ndCBtYWRlIGFueSBmcmFncyB5ZXQuCi0gICAqIElmIGl0IGdvb2ZlZCwgdGhlbiB0aGlzIGluc3RydWN0aW9uIHdpbGwgd2VkZ2UgaW4gYW55IHBhc3MsCi0gICAqIGFuZCB3ZSBjYW4gc2FmZWx5IGZsdXNoIGl0LCB3aXRob3V0IGNhdXNpbmcgaW50ZXJwYXNzIHN5bWJvbCBwaGFzZQotICAgKiBlcnJvcnMuIFRoYXQgaXMsIHdpdGhvdXQgY2hhbmdpbmcgbGFiZWwgdmFsdWVzIGluIGRpZmZlcmVudCBwYXNzZXMuCi0gICAqLwotICBpZiAoKnQudGl0X2Vycm9yKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIklnbm9yaW5nIHN0YXRlbWVudCBkdWUgdG8gXCIlc1wiIiksIHQudGl0X2Vycm9yKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBzYXcgbm8gZXJyb3JzIGluIGFueSBvcGVyYW5kcyAtIHRyeSB0byBtYWtlIGZyYWcocykgKi8KLSAgICAgIC8qIEVtaXQgb3AtY29kZS4gKi8KLSAgICAgIC8qIFJlbWVtYmVyIHdoZXJlIGl0IGlzLCBpbiBjYXNlIHdlIHdhbnQgdG8gbW9kaWZ5IHRoZSBvcC1jb2RlIGxhdGVyLiAqLwotICAgICAgb3Bjb2RlUCA9IGZyYWdfbW9yZSAoMSk7Ci0gICAgICAqb3Bjb2RlUCA9IHQudGl0X29wY29kZTsKLSAgICAgIC8qIE5vdyBkbyBlYWNoIG9wZXJhbmQuICovCi0gICAgICBmb3IgKG9wZXJhbmRQID0gdC50aXRfb3BlcmFuZDsKLQkgICBvcGVyYW5kUCA8IHQudGl0X29wZXJhbmQgKyB0LnRpdF9vcGVyYW5kczsKLQkgICBvcGVyYW5kUCsrKQotCXsJCQkvKiBmb3IgZWFjaCBvcGVyYW5kICovCi0JICBleHBQID0gJihvcGVyYW5kUC0+ZXhwX29mX29wZXJhbmQpOwotCSAgaWYgKG9wZXJhbmRQLT50b3BfbmR4ID49IDApCi0JICAgIHsKLQkgICAgICAvKiBJbmRleGVkIGFkZHJlc3NpbmcgYnl0ZQotCSAgIExlZ2FsaXR5IG9mIGluZGV4ZWQgbW9kZSBhbHJlYWR5IGNoZWNrZWQ6IGl0IGlzIE9LICovCi0JICAgICAgRlJBR19BUFBFTkRfMV9DSEFSICgweDQwICsgb3BlcmFuZFAtPnRvcF9uZHgpOwotCSAgICB9CQkJLyogaWYodG9wX25keD49MCkgKi8KLQotCSAgLyogSGVyZSB0byBtYWtlIG1haW4gb3BlcmFuZCBmcmFnKHMpLiAqLwotCSAgdGhpc19hZGRfbnVtYmVyID0gZXhwUC0+WF9hZGRfbnVtYmVyOwotCSAgdGhpc19hZGRfc3ltYm9sID0gZXhwUC0+WF9hZGRfc3ltYm9sOwotCSAgdG9fc2VnID0gb3BlcmFuZFAtPnNlZ19vZl9vcGVyYW5kOwotCSAga25vdyAodG9fc2VnID09IFNFR19VTktOT1dOIHx8IFwKLQkJdG9fc2VnID09IFNFR19BQlNPTFVURSB8fCBcCi0JCXRvX3NlZyA9PSBTRUdfREFUQSB8fCBcCi0JCXRvX3NlZyA9PSBTRUdfVEVYVCB8fCBcCi0JCXRvX3NlZyA9PSBTRUdfQlNTKTsKLQkgIGlzX3VuZGVmaW5lZCA9ICh0b19zZWcgPT0gU0VHX1VOS05PV04pOwotCSAgLyogRG8gd2Uga25vdyBob3cgYmlnIHRoaXMgb3BwZXJhbmQgaXM/ICovCi0JICBkaXNwc2l6ZSA9IG9wZXJhbmRQLT50b3BfZGlzcHNpemU7Ci0JICBwY19yZWwgPSAwOwotCSAgLyogRGVhbCB3aXRoIHRoZSBicmFuY2ggcG9zc2FiaWxpdGllcy4gKE5vdGUsIHRoaXMgZG9lc24ndCBpbmNsdWRlCi0JIGp1bXBzLikqLwotCSAgaWYgKG9wZXJhbmRQLT50b3BfYWNjZXNzID09ICdiJykKLQkgICAgewotCSAgICAgIC8qIEJyYW5jaGVzIG11c3QgYmUgZXhwcmVzc2lvbnMuIEEgcHN1ZWRvIGJyYW5jaCBjYW4gYWxzbyBqdW1wIHRvCi0JICAgYW4gYWJzb2x1dGUgYWRkcmVzcy4gKi8KLQkgICAgICBpZiAodG9fc2VnID09IG5vd19zZWcgfHwgaXNfdW5kZWZpbmVkKQotCQl7Ci0JCSAgLyogSWYgaXNfdW5kZWZpbmVkLCB0aGVuIGl0IG1pZ2h0IEJFQ09NRSBub3dfc2VnIGJ5IHJlbGF4IHRpbWUuICovCi0JCSAgaWYgKGRpc3BzaXplKQotCQkgICAgewotCQkgICAgICAvKiBJIGtub3cgaG93IGJpZyB0aGUgYnJhbmNoIGlzIHN1cHBvc2VkIHRvIGJlIChpdCdzIGEgbm9ybWFsCi0JICAgICAgIGJyYW5jaCksIHNvIEkgc2V0IHVwIHRoZSBmcmFnLCBhbmQgbGV0IEdBUyBkbyB0aGUgcmVzdC4gKi8KLQkJICAgICAgcCA9IGZyYWdfbW9yZSAoZGlzcHNpemUpOwotCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJICAgICAgIHNpemVfdG9fZnggKGRpc3BzaXplLCAxKSwKLQkJCSAgICAgICBOVUxMKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qICh0b19zZWc9PW5vd19zZWcgfHwgdG9fc2VnID09IFNFR19VTktOT1dOKSAmJiBkaXNwc2l6ZT09MCAqLwotCQkgICAgICAvKiBJZiB3ZSBkb24ndCBrbm93IGhvdyBiaWcgaXQgaXMsIHRoZW4gaXRzIGEgc3ludGhldGljIGJyYW5jaCwKLQkgICAgICAgc28gd2Ugc2V0IHVwIGEgc2ltcGxlIHJlbGF4IHN0YXRlLiAqLwotCQkgICAgICBzd2l0Y2ggKG9wZXJhbmRQLT50b3Bfd2lkdGgpCi0JCQl7Ci0JCQljYXNlIFRBSE9FX1dJRFRIX0NPTkRJVElPTkFMX0pVTVA6Ci0JCQkgIC8qIFNpbXBsZSAoY29uZGl0aW9uYWwpIGp1bXAuIEkgbWF5IGhhdmUgdG8gcmV2ZXJzZSB0aGUKLQkJIGNvbmRpdGlvbiBvZiBvcGNvZGVQLCBhbmQgdGhlbiBqdW1wIHRvIG15IGRlc3RpbmF0aW9uLgotCQkgSSBzZXQgMSBieXRlIGFzaWRlIGZvciB0aGUgYnJhbmNoIG9mZiBzZXQsIGFuZCBjb3VsZCBuZWVkIDYKLQkJIG1vcmUgYnl0ZXMgZm9yIHRoZSBwY19yZWwganVtcCAqLwotCQkJICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDcsIDEsCi0JCQkJICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNILAotCQkJCSAgICBpc191bmRlZmluZWQgPyBTVEFURV9VTkRGIDogU1RBVEVfQllURSksCi0JCQkJIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLCBvcGNvZGVQKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIFRBSE9FX1dJRFRIX0FMV0FZU19KVU1QOgotCQkJICAvKiBTaW1wbGUgKHVuY29uZGl0aW9uYWwpIGp1bXAuIEkgbWF5IGhhdmUgdG8gY29udmVydCB0aGlzIHRvCi0JCSBhIHdvcmQgYnJhbmNoLCBvciBhbiBhYnNvbHV0ZSBqdW1wLiAqLwotCQkJICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDUsIDEsCi0JCQkJICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwKLQkJCQkgICAgaXNfdW5kZWZpbmVkID8gU1RBVEVfVU5ERiA6IFNUQVRFX0JZVEUpLAotCQkJCSB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwgb3Bjb2RlUCk7Ci0JCQkgIGJyZWFrOwotCQkJICAvKiBUaGUgc21hbGxlc3Qgc2l6ZSBmb3IgdGhlIG5leHQgMiBjYXNlcyBpcyB3b3JkLiAqLwotCQkJY2FzZSBUQUhPRV9XSURUSF9CSUdfUkVWX0pVTVA6Ci0JCQkgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgOCwgMiwKLQkJCQkgICAgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfUkVWX0JSQU5DSCwKLQkJCQkgICAgaXNfdW5kZWZpbmVkID8gU1RBVEVfVU5ERiA6IFNUQVRFX1dPUkQpLAotCQkJCSAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJCQkgICAgb3Bjb2RlUCk7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSBUQUhPRV9XSURUSF9CSUdfTk9OX1JFVl9KVU1QOgotCQkJICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEwLCAyLAotCQkJCSAgICBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19OT05fUkVWX0JSQU5DSCwKLQkJCQkgICAgaXNfdW5kZWZpbmVkID8gU1RBVEVfVU5ERiA6IFNUQVRFX1dPUkQpLAotCQkJCSAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJCQkgICAgb3Bjb2RlUCk7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgYXNfZmF0YWwgKF8oIkNvbXBsaWxlciBidWc6IEdvdCBhIGNhc2UgKCVkKSBJIHdhc24ndCBleHBlY3RpbmcuIiksCi0JCQkJICAgIG9wZXJhbmRQLT50b3Bfd2lkdGgpOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogdG9fc2VnICE9IG5vd19zZWcgJiYgdG9fc2VnICE9IHNlZ191bmtub3duIChzdGlsbCBpbiBicmFuY2gpCi0JICAgICBJbiBvdGhlciB3b3JkcywgSSdtIGp1bXBpbmcgb3V0IG9mIG15IHNlZ21lbnQgc28gZXh0ZW5kIHRoZQotCSAgICAgYnJhbmNoZXMgdG8ganVtcHMsIGFuZCBsZXQgR0FTIGZpeCB0aGVtLiAqLwotCi0JCSAgLyogVGhlc2UgYXJlICJicmFuY2hlcyIgd2hhdCB3aWxsIGFsd2F5cyBiZSBicmFuY2hlcyBhcm91bmQgYSBqdW1wCi0JICAgICB0byB0aGUgY29ycmVjdCBhZGRyZXNzcyBpbiByZWFsIGxpZmUuCi0JICAgICBJZiB0b19zZWcgaXMgU0VHX0FCU09MVVRFLCBqdXN0IGVuY29kZSB0aGUgYnJhbmNoIGluLAotCSAgICAgZWxzZSBsZXQgR0FTIGZpeCB0aGUgYWRkcmVzcy4gKi8KLQotCQkgIHN3aXRjaCAob3BlcmFuZFAtPnRvcF93aWR0aCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIHRoZW9yeToKLQkgICAgICAgRm9yIFNFR19BQlNPTFVURSwgdGhlbiBtb2RlIGlzIEFCU09MVVRFX0FERFIsIGp1bXAKLQkgICAgICAgdG8gdGhhdCBhZGRyZXNzcyAobm90IHBjX3JlbCkuCi0JICAgICAgIEZvciBvdGhlciBzZWdzLCBhZGRyZXNzIGlzIGEgbG9uZyB3b3JkIFBDIHJlbCBqdW1wLiAqLwotCQkgICAgY2FzZSBUQUhPRV9XSURUSF9DT05ESVRJT05BTF9KVU1QOgotCQkgICAgICAvKiBiPGNvbmQ+ICovCi0JCSAgICAgIC8qIFRvIHJldmVyc2UgdGhlIGNvbmRpdGlvbiBpbiBhIFRBSE9FIGJyYW5jaCwKLQkgICAgICAgY29tcGxlbWVudCBiaXQgNCAqLwotCQkgICAgICAqb3Bjb2RlUCBePSAweDEwOwotCQkgICAgICBwID0gZnJhZ19tb3JlICg3KTsKLQkJICAgICAgKnArKyA9IDY7Ci0JCSAgICAgICpwKysgPSBUQUhPRV9KTVA7Ci0JCSAgICAgICpwKysgPSAob3BlcmFuZFAtPnRvcF9tb2RlID09Ci0JCQkgICAgICBUQUhPRV9BQlNPTFVURV9BRERSID8gVEFIT0VfQUJTT0xVVEVfQUREUiA6Ci0JCQkgICAgICBUQUhPRV9QQ19SRUxfTE9ORyk7Ci0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCSAgICAgICAodG9fc2VnICE9IFNFR19BQlNPTFVURSkgPyBGWF9QQ1JFTDMyIDogRlhfMzIsIE5VTEwpOwotCQkgICAgICAvKgotCSAgICAgKiBOb3cgKGVnKQlCTEVRCTFmCi0JICAgICAqCQlKTVAJZm9vCi0JICAgICAqCTE6Ci0JICAgICAqLwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgVEFIT0VfV0lEVEhfQUxXQVlTX0pVTVA6Ci0JCSAgICAgIC8qIGJyLCBqdXN0IHR1cm4gaXQgaW50byBhIGp1bXAgKi8KLQkJICAgICAgKm9wY29kZVAgPSBUQUhPRV9KTVA7Ci0JCSAgICAgIHAgPSBmcmFnX21vcmUgKDUpOwotCQkgICAgICAqcCsrID0gKG9wZXJhbmRQLT50b3BfbW9kZSA9PQotCQkJICAgICAgVEFIT0VfQUJTT0xVVEVfQUREUiA/IFRBSE9FX0FCU09MVVRFX0FERFIgOgotCQkJICAgICAgVEFIT0VfUENfUkVMX0xPTkcpOwotCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkgICAgICAgKHRvX3NlZyAhPSBTRUdfQUJTT0xVVEUpID8gRlhfUENSRUwzMiA6IEZYXzMyLCBOVUxMKTsKLQkJICAgICAgLyogTm93IChlZykgSk1QIGZvbyAqLwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgVEFIT0VfV0lEVEhfQklHX1JFVl9KVU1QOgotCQkgICAgICBwID0gZnJhZ19tb3JlICg4KTsKLQkJICAgICAgKm9wY29kZVAgXj0gMHgxMDsKLQkJICAgICAgKnArKyA9IDA7Ci0JCSAgICAgICpwKysgPSA2OwotCQkgICAgICAqcCsrID0gVEFIT0VfSk1QOwotCQkgICAgICAqcCsrID0gKG9wZXJhbmRQLT50b3BfbW9kZSA9PQotCQkJICAgICAgVEFIT0VfQUJTT0xVVEVfQUREUiA/IFRBSE9FX0FCU09MVVRFX0FERFIgOgotCQkJICAgICAgVEFIT0VfUENfUkVMX0xPTkcpOwotCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkgICAgICAgKHRvX3NlZyAhPSBTRUdfQUJTT0xVVEUpID8gRlhfUENSRUwzMiA6IEZYXzMyLCBOVUxMKTsKLQkJICAgICAgLyoKLQkgICAgICogTm93IChlZykJQUNCeAkxZgotCSAgICAgKgkJSk1QICAgICBmb28KLQkgICAgICoJMToKLQkgICAgICovCi0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBUQUhPRV9XSURUSF9CSUdfTk9OX1JFVl9KVU1QOgotCQkgICAgICBwID0gZnJhZ19tb3JlICgxMCk7Ci0JCSAgICAgICpwKysgPSAwOwotCQkgICAgICAqcCsrID0gMjsKLQkJICAgICAgKnArKyA9IFRBSE9FX0JSQjsKLQkJICAgICAgKnArKyA9IDY7Ci0JCSAgICAgICpwKysgPSBUQUhPRV9KTVA7Ci0JCSAgICAgICpwKysgPSAob3BlcmFuZFAtPnRvcF9tb2RlID09Ci0JCQkgICAgICBUQUhPRV9BQlNPTFVURV9BRERSID8gVEFIT0VfQUJTT0xVVEVfQUREUiA6Ci0JCQkgICAgICBUQUhPRV9QQ19SRUxfTE9ORyk7Ci0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCSAgICAgICAodG9fc2VnICE9IFNFR19BQlNPTFVURSkgPyBGWF9QQ1JFTDMyIDogRlhfMzIsIE5VTEwpOwotCQkgICAgICAvKgotCSAgICAgKiBOb3cgKGVnKQl4T0J4eHgJMWYKLQkgICAgICoJCUJSQgkyZgotCSAgICAgKgkxOglKTVAJQCNmb28KLQkgICAgICoJMjoKLQkgICAgICovCi0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnYic6Ci0JCSAgICBjYXNlICd3JzoKLQkJICAgICAgYXNfd2FybiAoXygiUmVhbCBicmFuY2ggZGlzcGxhY2VtZW50cyBtdXN0IGJlIGV4cHJlc3Npb25zLiIpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBhc19mYXRhbCAoXygiQ29tcGxpZXIgZXJyb3I6IEkgZ290IGFuIHVua25vd24gc3ludGhldGljIGJyYW5jaCA6JWMiKSwKLQkJCQlvcGVyYW5kUC0+dG9wX3dpZHRoKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogSXQgYWluJ3QgYSBicmFuY2ggb3BlcmFuZC4gKi8KLQkgICAgICBzd2l0Y2ggKG9wZXJhbmRQLT50b3BfbW9kZSkKLQkJewotCQkgIC8qIEF1dG8tZm9vIGFjY2Vzcywgb25seSB3b3JrcyBmb3Igb25lIHJlZyAoU1ApCi0JICAgICBzbyB0aGUgb25seSB0aGluZyBuZWVkZWQgaXMgdGhlIG1vZGUuICovCi0JCWNhc2UgVEFIT0VfQVVUT19ERUM6Ci0JCWNhc2UgVEFIT0VfQVVUT19JTkM6Ci0JCWNhc2UgVEFIT0VfQVVUT19JTkNfREVGRVJSRUQ6Ci0JCSAgRlJBR19BUFBFTkRfMV9DSEFSIChvcGVyYW5kUC0+dG9wX21vZGUpOwotCQkgIGJyZWFrOwotCi0JCSAgLyogTnVtYmVyZWQgUmVnaXN0ZXIgb25seSBhY2Nlc3MuIE9ubHkgdGhpbmcgbmVlZGVkIGlzIHRoZQotCSAgICAgbW9kZSArIFJlZ2lzdGVyIG51bWJlciAqLwotCQljYXNlIFRBSE9FX0RJUkVDVF9SRUc6Ci0JCWNhc2UgVEFIT0VfUkVHX0RFRkVSUkVEOgotCQkgIEZSQUdfQVBQRU5EXzFfQ0hBUiAob3BlcmFuZFAtPnRvcF9tb2RlICsgb3BlcmFuZFAtPnRvcF9yZWcpOwotCQkgIGJyZWFrOwotCi0JCSAgLyogQW4gYWJzb2x1dGUgYWRkcmVzcy4gSXQncyBzaXplIGlzIGFsd2F5cyA1IGJ5dGVzLgotCSAgICAgKG1vZGVfdHlwZSArIDQgYnl0ZSBhZGRyZXNzKS4gKi8KLQkJY2FzZSBUQUhPRV9BQlNPTFVURV9BRERSOgotCQkgIGtub3cgKCh0aGlzX2FkZF9zeW1ib2wgPT0gTlVMTCkpOwotCQkgIHAgPSBmcmFnX21vcmUgKDUpOwotCQkgICpwID0gVEFIT0VfQUJTT0xVVEVfQUREUjsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyAxLCB0aGlzX2FkZF9udW1iZXIsIDQpOwotCQkgIGJyZWFrOwotCi0JCSAgLyogSW1tZWRpYXRlIGRhdGEuIElmIHRoZSBzaXplIGlzbid0IGtub3duLCB0aGVuIGl0J3MgYW4gYWRkcmVzcwotCSAgICAgKyBhbmQgb2Zmc2V0LCB3aGljaCBpcyA0IGJ5dGVzIGJpZy4gKi8KLQkJY2FzZSBUQUhPRV9JTU1FRElBVEU6Ci0JCSAgaWYgKHRoaXNfYWRkX3N5bWJvbCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBwID0gZnJhZ19tb3JlICg1KTsKLQkJICAgICAgKnArKyA9IFRBSE9FX0lNTUVESUFURV9MT05HV09SRDsKLQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJCSAgICAgICBGWF8zMiwgTlVMTCk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBJdCdzIGEgaW50ZWdlciwgYW5kIEkga25vdyBpdCdzIHNpemUuICovCi0JCSAgICAgIGlmICgodW5zaWduZWQpIHRoaXNfYWRkX251bWJlciA8IDB4NDApCi0JCQl7Ci0JCQkgIC8qIFdpbGwgaXQgZml0IGluIGEgbGl0ZXJhbD8gKi8KLQkJCSAgRlJBR19BUFBFTkRfMV9DSEFSICgoYnl0ZSkgdGhpc19hZGRfbnVtYmVyKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBwID0gZnJhZ19tb3JlIChkaXNwc2l6ZSArIDEpOwotCQkJICBzd2l0Y2ggKGRpc3BzaXplKQotCQkJICAgIHsKLQkJCSAgICBjYXNlIDE6Ci0JCQkgICAgICAqcCsrID0gVEFIT0VfSU1NRURJQVRFX0JZVEU7Ci0JCQkgICAgICAqcCA9IChieXRlKSB0aGlzX2FkZF9udW1iZXI7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlIDI6Ci0JCQkgICAgICAqcCsrID0gVEFIT0VfSU1NRURJQVRFX1dPUkQ7Ci0JCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIHRoaXNfYWRkX251bWJlciwgMik7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlIDQ6Ci0JCQkgICAgICAqcCsrID0gVEFIT0VfSU1NRURJQVRFX0xPTkdXT1JEOwotCQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCB0aGlzX2FkZF9udW1iZXIsIDQpOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCSAgLyogRGlzdGFuY2UgZnJvbSB0aGUgUEMuIElmIHRoZSBzaXplIGlzbid0IGtub3duLCB3ZSBoYXZlIHRvIHJlbGF4Ci0JICAgICBpbnRvIGl0LiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIGRpc3Aoc3ApIGlzIHRoYXQKLQkgICAgIHRoaXMgb2Zmc2V0IGlzIHBjX3JlbCwgYW5kIGRpc3Aoc3ApIGlzbid0LgotCSAgICAgTm90ZSB0aGUgZHJvcCB0aHJvdWdoIGNvZGUuICovCi0KLQkJY2FzZSBUQUhPRV9ESVNQTEFDRURfUkVMQVRJVkU6Ci0JCWNhc2UgVEFIT0VfRElTUF9SRUxfREVGRVJSRUQ6Ci0JCSAgb3BlcmFuZFAtPnRvcF9yZWcgPSBQQ19SRUc7Ci0JCSAgcGNfcmVsID0gMTsKLQotCQkgIC8qIFJlZ2lzdGVyLCBwbHVzIGEgZGlzcGxhY2VtZW50IG1vZGUuIFNhdmUgdGhlIHJlZ2lzdGVyIG51bWJlciwKLQkgICAgIGFuZCB3ZWF0aGVyIGl0cyBkZWZmZXJlZCBvciBub3QsIGFuZCByZWxheCB0aGUgc2l6ZSBpZiBpdCBpc24ndAotCSAgICAga25vd24uICovCi0JCWNhc2UgVEFIT0VfUkVHX0RJU1A6Ci0JCWNhc2UgVEFIT0VfUkVHX0RJU1BfREVGRVJSRUQ6Ci0JCSAgaWYgKG9wZXJhbmRQLT50b3BfbW9kZSA9PSBUQUhPRV9ESVNQX1JFTF9ERUZFUlJFRCB8fAotCQkgICAgICBvcGVyYW5kUC0+dG9wX21vZGUgPT0gVEFIT0VfUkVHX0RJU1BfREVGRVJSRUQpCi0JCSAgICBvcGVyYW5kUC0+dG9wX3JlZyArPSAweDEwOwkvKiBkZWZmZXJlZCBtb2RlIGlzIGFsd2F5cyAweDEwIGhpZ2hlcgotCQkJCQkgIHRoYW4gaXQncyBub24tZGVmZmVyZWQgc2libGluZy4gKi8KLQotCQkgIC8qIElzIHRoaXMgYSB2YWx1ZSBvdXQgb2YgdGhpcyBzZWdtZW50PwotCSAgICAgVGhlIGZpcnN0IHBhcnQgb2YgdGhpcyBjb25kaXRpb25hbCBpcyBhIGNsdWRnZSB0byBtYWtlIGdhcwotCSAgICAgcHJvZHVjZSB0aGUgc2FtZSBvdXRwdXQgYXMgJ2FzJyB3aGVuIHRoZXJlIGlzIGEgbGFibGUsIGluCi0JICAgICB0aGUgY3VycmVudCBzZWdtZW50LCBkaXNwbGFjZWluZyBhIHJlZ2lzdGVyLiBJdCdzIHN0cmFuZ2UsCi0JICAgICBhbmQgbm8gb25lIGluIHRoZWlyIHJpZ2h0IG1pbmQgd291bGQgZG8gaXQsIGJ1dCBpdCdzIGVhc3kKLQkgICAgIHRvIGNsdWRnZS4gKi8KLQkJICBpZiAoKGRpc3BzaXplID09IDAgJiYgIXBjX3JlbCkgfHwKLQkJICAgICAgKHRvX3NlZyAhPSBub3dfc2VnICYmICFpc191bmRlZmluZWQgJiYgdG9fc2VnICE9IFNFR19BQlNPTFVURSkpCi0JCSAgICBkaXNwc2l6ZSA9IDQ7Ci0KLQkJICBpZiAoZGlzcHNpemUgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyoKLQkgICAgICogV2UgaGF2ZSBhIFNFR19VTktOT1dOIHN5bWJvbCwgb3IgdGhlIHNpemUgaXNuJ3QgY2FzdC4KLQkgICAgICogSXQgbWlnaHQgdHVybiBvdXQgdG8gYmUgaW4gdGhlIHNhbWUgc2VnbWVudCBhcwotCSAgICAgKiB0aGUgaW5zdHJ1Y3Rpb24sIHBlcm1pdHRpbmcgcmVsYXhhdGlvbi4KLQkgICAgICovCi0JCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDUsIDIsCi0JCQkJICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsCi0JCQkJICAgIGlzX3VuZGVmaW5lZCA/IFNUQVRFX1VOREYgOiBTVEFURV9CWVRFKSwKLQkJCQkgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsIDApOwotCQkgICAgICAqcCA9IG9wZXJhbmRQLT50b3BfcmVnOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogRWl0aGVyIHRoaXMgaXMgYW4gYWJzLCBvciBhIGNhc3QuICovCi0JCSAgICAgIHAgPSBmcmFnX21vcmUgKGRpc3BzaXplICsgMSk7Ci0JCSAgICAgIHN3aXRjaCAoZGlzcHNpemUpCi0JCQl7Ci0JCQljYXNlIDE6Ci0JCQkgICpwID0gVEFIT0VfUENfT1JfQllURSArIG9wZXJhbmRQLT50b3BfcmVnOwotCQkJICBicmVhazsKLQkJCWNhc2UgMjoKLQkJCSAgKnAgPSBUQUhPRV9QQ19PUl9XT1JEICsgb3BlcmFuZFAtPnRvcF9yZWc7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSA0OgotCQkJICAqcCA9IFRBSE9FX1BDX09SX0xPTkcgKyBvcGVyYW5kUC0+dG9wX3JlZzsKLQkJCSAgYnJlYWs7Ci0JCQl9OwotCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywgcCArIDEgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJCSAgICAgICBzaXplX3RvX2Z4IChkaXNwc2l6ZSwgcGNfcmVsKSwgTlVMTCk7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgYXNfZmF0YWwgKF8oIkJhcmYsIGJhZCBtb2RlICV4XG4iKSwgb3BlcmFuZFAtPnRvcF9tb2RlKTsKLQkJfQotCSAgICB9Ci0JfQkJCS8qIGZvcihvcGVyYW5kUCkgKi8KLSAgICB9CQkJCS8qIGlmKCFuZWVkX3Bhc3NfMiAmJiAhZ29vZmVkKSAqLwotfQkJCQkvKiB0YWhvZV9hc3NlbWJsZSgpICovCi0KLQotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICovCi0KLS8qIEFSR1NVU0VEICovCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQkJCQkvKiBtZF91bmRlZmluZWRfc3ltYm9sKCkgKi8KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAqLwotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICByZXR1cm4gKChzaXplICsgNykgJiB+Nyk7CS8qIFJvdW5kIGFsbCBzZWN0cyB0byBtdWx0aXBsZSBvZiA4ICovCi19CQkJCS8qIG1kX3NlY3Rpb25fYWxpZ24oKSAqLwotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgc3BhcmMsIHRoZXkncmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIG9mZnNldCwgcGx1cwotICAgaXRzIHNpemUuICBUaGlzIGdldHMgdXMgdG8gdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbi4KLSAgICg/Pz8gSXMgdGhpcyByaWdodD8gIEZJWE1FLVNPT04pICovCi1sb25nIAotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuICgoKGZpeFAtPmZ4X3R5cGUgPT0gRlhfOAotCSAgICB8fCBmaXhQLT5meF90eXBlID09IEZYX1BDUkVMOCkKLQkgICA/IDEKLQkgICA6ICgoZml4UC0+ZnhfdHlwZSA9PSBGWF8xNgotCSAgICAgICB8fCBmaXhQLT5meF90eXBlID09IEZYX1BDUkVMMTYpCi0JICAgICAgPyAyCi0JICAgICAgOiAoKGZpeFAtPmZ4X3R5cGUgPT0gRlhfMzIKLQkJICB8fCBmaXhQLT5meF90eXBlID09IEZYX1BDUkVMMzIpCi0JCSA/IDQKLQkJIDogMCkpKSArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyk7Ci19CQkJCS8qIG1kX3BjcmVsX2Zyb20oKSAqLwotCi1pbnQgCi10Y19pc19wY3JlbCAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCAqLwotICBrbm93ICgwKTsKLSAgcmV0dXJuICgwKTsKLX0JCQkJLyogdGNfaXNfcGNyZWwoKSAqLwotCi0vKiBlbmQgb2YgdGMtdGFob2UuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy10YWhvZS5oIGIvZ2FzL2NvbmZpZy90Yy10YWhvZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZThhNWJlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdGFob2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy10YWhvZS5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfVEFIT0UgMQotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2RlZmluZSBOT19MSVNUSU5HCi0KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQl7O30JLyogZG9uJ3QgbmVlZCBpdC4gKi8KLSNkZWZpbmUgdGNfY3Jhd2xfc3ltYm9sX2NoYWluKGEpCXs7fQkvKiBkb24ndCBuZWVkIGl0LiAqLwotI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKGEpCXs7fQotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRjLXRhaG9lLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdGljMzAuYyBiL2dhcy9jb25maWcvdGMtdGljMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlZDkwNS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXRpYzMwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODg3ICswLDAgQEAKLS8qIHRjLWMzMC5jIC0tIEFzc2VtYmx5IGNvZGUgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAKLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gICBDb250cmlidXRlZCBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICAgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzMwIG1hY2hpbmUgc3BlY2lmaWMgZ2FzLgotICAgV3JpdHRlbiBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KS4KLSAgIEJ1Z3MgJiBzdWdnZXN0aW9ucyBhcmUgY29tcGxldGVseSB3ZWxjb21lLiAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLgotICAgUGxlYXNlIGhlbHAgdXMgbWFrZSBpdCBiZXR0ZXIuCi0gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3RpYzMwLmgiCi0KLS8qIHB1dCBoZXJlIGFsbCBub24tZGlnaXQgbm9uLWxldHRlciBjaGFyY3RlcnMgdGhhdCBtYXkgb2NjdXIgaW4gYW4gb3BlcmFuZCAqLwotc3RhdGljIGNoYXIgb3BlcmFuZF9zcGVjaWFsX2NoYXJzW10gPSAiJSQtKygsKSouX34vPD4mXiE6W0BdIjsKLXN0YXRpYyBjaGFyICpvcmRpbmFsX25hbWVzW10gPQoteyJmaXJzdCIsICJzZWNvbmQiLCAidGhpcmQiLCAiZm91cnRoIiwgImZpZnRoIn07Ci0KLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gMDsKLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIioiOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLWNvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KLXsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLQotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJmRmREeFgiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIHRhYmxlcyBmb3IgbGV4aWNhbCBhbmFseXNpcyAqLwotc3RhdGljIGNoYXIgb3Bjb2RlX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciByZWdpc3Rlcl9jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgb3BlcmFuZF9jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgc3BhY2VfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIGlkZW50aWZpZXJfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIGRpZ2l0X2NoYXJzWzI1Nl07Ci0KLS8qIGxleGljYWwgbWFjcm9zICovCi0jZGVmaW5lIGlzX29wY29kZV9jaGFyKHgpIChvcGNvZGVfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19vcGVyYW5kX2NoYXIoeCkgKG9wZXJhbmRfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19yZWdpc3Rlcl9jaGFyKHgpIChyZWdpc3Rlcl9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX3NwYWNlX2NoYXIoeCkgKHNwYWNlX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfaWRlbnRpZmllcl9jaGFyKHgpIChpZGVudGlmaWVyX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfZGlnaXRfY2hhcih4KSAoZGlnaXRfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7MCwgMCwgMH0KLX07Ci0KLSN1bmRlZiBVU0VfU1RET1VUCi0jZGVmaW5lIFVTRV9TVERPVVQgMQotCi0jaWZkZWYgVVNFX1NUREFSRwotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLWludAotZGVidWcgKGNvbnN0IGNoYXIgKnN0cmluZywuLi4pCi17Ci0gIGlmIChmbGFnX2RlYnVnKQotICAgIHsKLSAgICAgIHZhX2xpc3QgYXJncHRyOwotICAgICAgY2hhciBzdHJbMTAwXTsKLQotICAgICAgdmFfc3RhcnQgKGFyZ3B0ciwgc3RyaW5nKTsKLSAgICAgIHZzcHJpbnRmIChzdHIsIHN0cmluZywgYXJncHRyKTsKLSAgICAgIGlmIChzdHJbMF0gPT0gJ1wwJykKLQlyZXR1cm4gKDApOwotICAgICAgdmFfZW5kIChhcmdwdHIpOwotICAgICAgZnB1dHMgKHN0ciwgVVNFX1NURE9VVCA/IHN0ZG91dCA6IHN0ZGVycik7Ci0gICAgICByZXR1cm4gc3RybGVuIChzdHIpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotI2Vsc2UKLWludAotZGVidWcgKHN0cmluZywgdmFfYWxpc3QpCi0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgdmFfZGNsCi17Ci0gIGlmIChmbGFnX2RlYnVnKQotICAgIHsKLSAgICAgIHZhX2xpc3QgYXJncHRyOwotICAgICAgY2hhciBzdHJbMTAwXTsKLSAgICAgIGludCBjbnQ7Ci0KLSAgICAgIHZhX3N0YXJ0IChhcmdwdHIsIHN0cmluZyk7Ci0gICAgICBjbnQgPSB2c3ByaW50ZiAoc3RyLCBzdHJpbmcsIGFyZ3B0cik7Ci0gICAgICBpZiAoc3RyWzBdID09IE5VTEwpCi0JcmV0dXJuICgwKTsKLSAgICAgIHZhX2VuZCAoYXJncHRyKTsKLSAgICAgIGZwdXRzIChzdHIsIFVTRV9TVERPVVQgPyBzdGRvdXQgOiBzdGRlcnIpOwotICAgICAgcmV0dXJuIChjbnQpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KLS8qIGhhc2ggdGFibGUgZm9yIG9wY29kZSBsb29rdXAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoOwotLyogaGFzaCB0YWJsZSBmb3IgcGFyYWxsZWwgb3Bjb2RlIGxvb2t1cCAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnBhcm9wX2hhc2g7Ci0vKiBoYXNoIHRhYmxlIGZvciByZWdpc3RlciBsb29rdXAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpyZWdfaGFzaDsKLS8qIGhhc2ggdGFibGUgZm9yIGluZGlyZWN0IGFkZHJlc3NpbmcgbG9va3VwICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqaW5kX2hhc2g7Ci0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNvbnN0IGNoYXIgKmhhc2hfZXJyOwotICBkZWJ1ZyAoIkluIG1kX2JlZ2luKClcbiIpOwotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIHsKLSAgICBjb25zdCB0ZW1wbGF0ZSAqY3VycmVudF9vcHRhYiA9IHRpYzMwX29wdGFiOwotICAgIGZvciAoOyBjdXJyZW50X29wdGFiIDwgdGljMzBfb3B0YWJfZW5kOyBjdXJyZW50X29wdGFiKyspCi0gICAgICB7Ci0JaGFzaF9lcnIgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgY3VycmVudF9vcHRhYi0+bmFtZSwgKGNoYXIgKikgY3VycmVudF9vcHRhYik7Ci0JaWYgKGhhc2hfZXJyKQotCSAgYXNfZmF0YWwgKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgSGFzaCAlczogJXMiLCBjdXJyZW50X29wdGFiLT5uYW1lLCBoYXNoX2Vycik7Ci0gICAgICB9Ci0gIH0KLSAgcGFyb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotICB7Ci0gICAgY29uc3QgcGFydGVtcGxhdGUgKmN1cnJlbnRfcGFyb3AgPSB0aWMzMF9wYXJvcHRhYjsKLSAgICBmb3IgKDsgY3VycmVudF9wYXJvcCA8IHRpYzMwX3Bhcm9wdGFiX2VuZDsgY3VycmVudF9wYXJvcCsrKQotICAgICAgewotCWhhc2hfZXJyID0gaGFzaF9pbnNlcnQgKHBhcm9wX2hhc2gsIGN1cnJlbnRfcGFyb3AtPm5hbWUsIChjaGFyICopIGN1cnJlbnRfcGFyb3ApOwotCWlmIChoYXNoX2VycikKLQkgIGFzX2ZhdGFsICgiSW50ZXJuYWwgRXJyb3I6IENhbid0IEhhc2ggJXM6ICVzIiwgY3VycmVudF9wYXJvcC0+bmFtZSwgaGFzaF9lcnIpOwotICAgICAgfQotICB9Ci0gIHJlZ19oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIHsKLSAgICBjb25zdCByZWcgKmN1cnJlbnRfcmVnID0gdGljMzBfcmVndGFiOwotICAgIGZvciAoOyBjdXJyZW50X3JlZyA8IHRpYzMwX3JlZ3RhYl9lbmQ7IGN1cnJlbnRfcmVnKyspCi0gICAgICB7Ci0JaGFzaF9lcnIgPSBoYXNoX2luc2VydCAocmVnX2hhc2gsIGN1cnJlbnRfcmVnLT5uYW1lLCAoY2hhciAqKSBjdXJyZW50X3JlZyk7Ci0JaWYgKGhhc2hfZXJyKQotCSAgYXNfZmF0YWwgKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgSGFzaCAlczogJXMiLCBjdXJyZW50X3JlZy0+bmFtZSwgaGFzaF9lcnIpOwotICAgICAgfQotICB9Ci0gIGluZF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIHsKLSAgICBjb25zdCBpbmRfYWRkcl90eXBlICpjdXJyZW50X2luZCA9IHRpYzMwX2luZGFkZHJfdGFiOwotICAgIGZvciAoOyBjdXJyZW50X2luZCA8IHRpYzMwX2luZGFkZHJ0YWJfZW5kOyBjdXJyZW50X2luZCsrKQotICAgICAgewotCWhhc2hfZXJyID0gaGFzaF9pbnNlcnQgKGluZF9oYXNoLCBjdXJyZW50X2luZC0+c3ludGF4LCAoY2hhciAqKSBjdXJyZW50X2luZCk7Ci0JaWYgKGhhc2hfZXJyKQotCSAgYXNfZmF0YWwgKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgSGFzaCAlczogJXMiLCBjdXJyZW50X2luZC0+c3ludGF4LCBoYXNoX2Vycik7Ci0gICAgICB9Ci0gIH0KLSAgLyogZmlsbCBpbiBsZXhpY2FsIHRhYmxlczogIG9wY29kZV9jaGFycywgb3BlcmFuZF9jaGFycywgc3BhY2VfY2hhcnMgKi8KLSAgewotICAgIHJlZ2lzdGVyIGludCBjOwotICAgIHJlZ2lzdGVyIGNoYXIgKnA7Ci0KLSAgICBmb3IgKGMgPSAwOyBjIDwgMjU2OyBjKyspCi0gICAgICB7Ci0JaWYgKGlzbG93ZXIgKGMpIHx8IGlzZGlnaXQgKGMpKQotCSAgewotCSAgICBvcGNvZGVfY2hhcnNbY10gPSBjOwotCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IGM7Ci0JICB9Ci0JZWxzZSBpZiAoaXN1cHBlciAoYykpCi0JICB7Ci0JICAgIG9wY29kZV9jaGFyc1tjXSA9IHRvbG93ZXIgKGMpOwotCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IG9wY29kZV9jaGFyc1tjXTsKLQkgIH0KLQllbHNlIGlmIChjID09ICcpJyB8fCBjID09ICcoJykKLQkgIHsKLQkgICAgcmVnaXN0ZXJfY2hhcnNbY10gPSBjOwotCSAgfQotCWlmIChpc3VwcGVyIChjKSB8fCBpc2xvd2VyIChjKSB8fCBpc2RpZ2l0IChjKSkKLQkgIG9wZXJhbmRfY2hhcnNbY10gPSBjOwotCWlmIChpc2RpZ2l0IChjKSB8fCBjID09ICctJykKLQkgIGRpZ2l0X2NoYXJzW2NdID0gYzsKLQlpZiAoaXNhbHBoYSAoYykgfHwgYyA9PSAnXycgfHwgYyA9PSAnLicgfHwgaXNkaWdpdCAoYykpCi0JICBpZGVudGlmaWVyX2NoYXJzW2NdID0gYzsKLQlpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKQotCSAgc3BhY2VfY2hhcnNbY10gPSBjOwotCWlmIChjID09ICdfJykKLQkgIG9wY29kZV9jaGFyc1tjXSA9IGM7Ci0gICAgICB9Ci0gICAgZm9yIChwID0gb3BlcmFuZF9zcGVjaWFsX2NoYXJzOyAqcCAhPSAnXDAnOyBwKyspCi0gICAgICBvcGVyYW5kX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSAqcF0gPSAqcDsKLSAgfQotfQotCi0vKiBBZGRyZXNzIE1vZGUgT1IgdmFsdWVzICovCi0jZGVmaW5lIEFNX1JlZ2lzdGVyICAweDAwMDAwMDAwCi0jZGVmaW5lIEFNX0RpcmVjdCAgICAweDAwMjAwMDAwCi0jZGVmaW5lIEFNX0luZGlyZWN0ICAweDAwNDAwMDAwCi0jZGVmaW5lIEFNX0ltbWVkaWF0ZSAweDAwNjAwMDAwCi0jZGVmaW5lIEFNX05vdFJlcSAgICAweEZGRkZGRkZGCi0KLS8qIFBDIFJlbGF0aXZlIE9SIHZhbHVlcyAqLwotI2RlZmluZSBQQ19SZWdpc3RlciAweDAwMDAwMDAwCi0jZGVmaW5lIFBDX1JlbGF0aXZlIDB4MDIwMDAwMDAKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgb3BfdHlwZTsKLSAgc3RydWN0Ci0gICAgewotICAgICAgaW50IHJlc29sdmVkOwotICAgICAgdW5zaWduZWQgYWRkcmVzczsKLSAgICAgIGNoYXIgKmxhYmVsOwotICAgICAgZXhwcmVzc2lvblMgZGlyZWN0X2V4cHI7Ci0gICAgfQotICBkaXJlY3Q7Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIG1vZDsKLSAgICAgIGludCBBUm51bTsKLSAgICAgIHVuc2lnbmVkIGNoYXIgZGlzcDsKLSAgICB9Ci0gIGluZGlyZWN0OwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBvcGNvZGU7Ci0gICAgfQotICByZWc7Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIGludCByZXNvbHZlZDsKLSAgICAgIGludCBkZWNpbWFsX2ZvdW5kOwotICAgICAgZmxvYXQgZl9udW1iZXI7Ci0gICAgICBpbnQgc19udW1iZXI7Ci0gICAgICB1bnNpZ25lZCBpbnQgdV9udW1iZXI7Ci0gICAgICBjaGFyICpsYWJlbDsKLSAgICAgIGV4cHJlc3Npb25TIGltbV9leHByOwotICAgIH0KLSAgaW1tZWRpYXRlOwotfQotb3BlcmFuZDsKLQotaW50IHRpYzMwX3BhcmFsbGVsX2luc24gUEFSQU1TICgoY2hhciAqKSk7Ci1vcGVyYW5kICp0aWMzMF9vcGVyYW5kIFBBUkFNUyAoKGNoYXIgKikpOwotY2hhciAqdGljMzBfZmluZF9wYXJhbGxlbF9pbnNuIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKSk7Ci0KLXRlbXBsYXRlICpvcGNvZGU7Ci0KLXN0cnVjdCB0aWMzMF9pbnNuCi0gIHsKLSAgICB0ZW1wbGF0ZSAqdG07CQkvKiBUZW1wbGF0ZSBvZiBjdXJyZW50IGluc3RydWN0aW9uICovCi0gICAgdW5zaWduZWQgb3Bjb2RlOwkJLyogRmluYWwgb3Bjb2RlICovCi0gICAgaW50IG9wZXJhbmRzOwkJLyogTnVtYmVyIG9mIGdpdmVuIG9wZXJhbmRzICovCi0gICAgLyogVHlwZSBvZiBvcGVyYW5kIGdpdmVuIGluIGluc3RydWN0aW9uICovCi0gICAgb3BlcmFuZCAqb3BlcmFuZF90eXBlW01BWF9PUEVSQU5EU107Ci0gICAgdW5zaWduZWQgYWRkcmVzc2luZ19tb2RlOwkvKiBGaW5hbCBhZGRyZXNzaW5nIG1vZGUgb2YgaW5zdHJ1Y3Rpb24gKi8KLSAgfTsKLQotc3RydWN0IHRpYzMwX2luc24gaW5zbjsKLXN0YXRpYyBpbnQgZm91bmRfcGFyYWxsZWxfaW5zbjsKLQotdm9pZAotbWRfYXNzZW1ibGUgKGxpbmUpCi0gICAgIGNoYXIgKmxpbmU7Ci17Ci0gIHRlbXBsYXRlICpvcGNvZGU7Ci0gIGNoYXIgKmN1cnJlbnRfcG9zbjsKLSAgY2hhciAqdG9rZW5fc3RhcnQ7Ci0gIGNoYXIgc2F2ZV9jaGFyOwotICBpbnQgY291bnQ7Ci0KLSAgZGVidWcgKCJJbiBtZF9hc3NlbWJsZSgpIHdpdGggYXJndW1lbnQgJXNcbiIsIGxpbmUpOwotICBtZW1zZXQgKCZpbnNuLCAnXDAnLCBzaXplb2YgKGluc24pKTsKLSAgaWYgKGZvdW5kX3BhcmFsbGVsX2luc24pCi0gICAgewotICAgICAgZGVidWcgKCJMaW5lIGlzIHNlY29uZCBwYXJ0IG9mIHBhcmFsbGVsIGluc3RydWN0aW9uXG5cbiIpOwotICAgICAgZm91bmRfcGFyYWxsZWxfaW5zbiA9IDA7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoKGN1cnJlbnRfcG9zbiA9IHRpYzMwX2ZpbmRfcGFyYWxsZWxfaW5zbiAobGluZSwgaW5wdXRfbGluZV9wb2ludGVyICsgMSkpID09IE5VTEwpCi0gICAgY3VycmVudF9wb3NuID0gbGluZTsKLSAgZWxzZQotICAgIGZvdW5kX3BhcmFsbGVsX2luc24gPSAxOwotICB3aGlsZSAoaXNfc3BhY2VfY2hhciAoKmN1cnJlbnRfcG9zbikpCi0gICAgY3VycmVudF9wb3NuKys7Ci0gIHRva2VuX3N0YXJ0ID0gY3VycmVudF9wb3NuOwotICBpZiAoIWlzX29wY29kZV9jaGFyICgqY3VycmVudF9wb3NuKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKCJJbnZhbGlkIGNoYXJhY3RlciAlcyBpbiBvcGNvZGUiLCBvdXRwdXRfaW52YWxpZCAoKmN1cnJlbnRfcG9zbikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgLyogQ2hlY2sgaWYgaW5zdHJ1Y3Rpb24gaXMgYSBwYXJhbGxlbCBpbnN0cnVjdGlvbiBieSBzZWVpbmcgaWYgdGhlIGZpcnN0Ci0gICAgIGNoYXJhY3RlciBpcyBhIHEuICovCi0gIGlmICgqdG9rZW5fc3RhcnQgPT0gJ3EnKQotICAgIHsKLSAgICAgIGlmICh0aWMzMF9wYXJhbGxlbF9pbnNuICh0b2tlbl9zdGFydCkpCi0JewotCSAgaWYgKGZvdW5kX3BhcmFsbGVsX2luc24pCi0JICAgIGZyZWUgKHRva2VuX3N0YXJ0KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICB3aGlsZSAoaXNfb3Bjb2RlX2NoYXIgKCpjdXJyZW50X3Bvc24pKQotICAgIGN1cnJlbnRfcG9zbisrOwotICB7CQkJCS8qIEZpbmQgaW5zdHJ1Y3Rpb24gKi8KLSAgICBzYXZlX2NoYXIgPSAqY3VycmVudF9wb3NuOwotICAgICpjdXJyZW50X3Bvc24gPSAnXDAnOwotICAgIG9wY29kZSA9ICh0ZW1wbGF0ZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIHRva2VuX3N0YXJ0KTsKLSAgICBpZiAob3Bjb2RlKQotICAgICAgewotCWRlYnVnICgiRm91bmQgaW5zdHJ1Y3Rpb24gJXNcbiIsIG9wY29kZS0+bmFtZSk7Ci0JaW5zbi50bSA9IG9wY29kZTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JZGVidWcgKCJEaWRuJ3QgZmluZCBpbnNuXG4iKTsKLQlhc19iYWQgKCJVbmtub3duIFRNUzMyMEMzMCBpbnN0cnVjdGlvbjogJXMiLCB0b2tlbl9zdGFydCk7Ci0JcmV0dXJuOwotICAgICAgfQotICAgICpjdXJyZW50X3Bvc24gPSBzYXZlX2NoYXI7Ci0gIH0KLSAgaWYgKCpjdXJyZW50X3Bvc24gIT0gRU5EX09GX0lOU04pCi0gICAgewkJCQkvKiBGaW5kIG9wZXJhbmRzICovCi0gICAgICBpbnQgcGFyZW5fbm90X2JhbGFuY2VkOwotICAgICAgaW50IGV4cGVjdGluZ19vcGVyYW5kID0gMDsKLSAgICAgIGludCB0aGlzX29wZXJhbmQ7Ci0gICAgICBkbwotCXsKLQkgIC8qIHNraXAgb3B0aW9uYWwgd2hpdGUgc3BhY2UgYmVmb3JlIG9wZXJhbmQgKi8KLQkgIHdoaWxlICghaXNfb3BlcmFuZF9jaGFyICgqY3VycmVudF9wb3NuKSAmJiAqY3VycmVudF9wb3NuICE9IEVORF9PRl9JTlNOKQotCSAgICB7Ci0JICAgICAgaWYgKCFpc19zcGFjZV9jaGFyICgqY3VycmVudF9wb3NuKSkKLQkJewotCQkgIGFzX2JhZCAoIkludmFsaWQgY2hhcmFjdGVyICVzIGJlZm9yZSAlcyBvcGVyYW5kIiwKLQkJCSAgb3V0cHV0X2ludmFsaWQgKCpjdXJyZW50X3Bvc24pLAotCQkJICBvcmRpbmFsX25hbWVzW2luc24ub3BlcmFuZHNdKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBjdXJyZW50X3Bvc24rKzsKLQkgICAgfQotCSAgdG9rZW5fc3RhcnQgPSBjdXJyZW50X3Bvc247CS8qIGFmdGVyIHdoaXRlIHNwYWNlICovCi0JICBwYXJlbl9ub3RfYmFsYW5jZWQgPSAwOwotCSAgd2hpbGUgKHBhcmVuX25vdF9iYWxhbmNlZCB8fCAqY3VycmVudF9wb3NuICE9ICcsJykKLQkgICAgewotCSAgICAgIGlmICgqY3VycmVudF9wb3NuID09IEVORF9PRl9JTlNOKQotCQl7Ci0JCSAgaWYgKHBhcmVuX25vdF9iYWxhbmNlZCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkICgiVW5iYWxhbmNlZCBwYXJlbnRoZXNpcyBpbiAlcyBvcGVyYW5kLiIsCi0JCQkgICAgICBvcmRpbmFsX25hbWVzW2luc24ub3BlcmFuZHNdKTsKLQkJICAgICAgcmV0dXJuOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGJyZWFrOwkvKiB3ZSBhcmUgZG9uZSAqLwotCQl9Ci0JICAgICAgZWxzZSBpZiAoIWlzX29wZXJhbmRfY2hhciAoKmN1cnJlbnRfcG9zbikgJiYgIWlzX3NwYWNlX2NoYXIgKCpjdXJyZW50X3Bvc24pKQotCQl7Ci0JCSAgYXNfYmFkICgiSW52YWxpZCBjaGFyYWN0ZXIgJXMgaW4gJXMgb3BlcmFuZCIsCi0JCQkgIG91dHB1dF9pbnZhbGlkICgqY3VycmVudF9wb3NuKSwKLQkJCSAgb3JkaW5hbF9uYW1lc1tpbnNuLm9wZXJhbmRzXSk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gJygnKQotCQkrK3BhcmVuX25vdF9iYWxhbmNlZDsKLQkgICAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSAnKScpCi0JCS0tcGFyZW5fbm90X2JhbGFuY2VkOwotCSAgICAgIGN1cnJlbnRfcG9zbisrOwotCSAgICB9Ci0JICBpZiAoY3VycmVudF9wb3NuICE9IHRva2VuX3N0YXJ0KQotCSAgICB7CQkJLyogeWVzLCB3ZSd2ZSByZWFkIGluIGFub3RoZXIgb3BlcmFuZCAqLwotCSAgICAgIHRoaXNfb3BlcmFuZCA9IGluc24ub3BlcmFuZHMrKzsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kcyA+IE1BWF9PUEVSQU5EUykKLQkJewotCQkgIGFzX2JhZCAoIlNwdXJpb3VzIG9wZXJhbmRzOyAoJWQgb3BlcmFuZHMvaW5zdHJ1Y3Rpb24gbWF4KSIsCi0JCQkgIE1BWF9PUEVSQU5EUyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgLyogbm93IHBhcnNlIG9wZXJhbmQgYWRkaW5nIGluZm8gdG8gJ2luc24nIGFzIHdlIGdvIGFsb25nICovCi0JICAgICAgc2F2ZV9jaGFyID0gKmN1cnJlbnRfcG9zbjsKLQkgICAgICAqY3VycmVudF9wb3NuID0gJ1wwJzsKLQkgICAgICBpbnNuLm9wZXJhbmRfdHlwZVt0aGlzX29wZXJhbmRdID0gdGljMzBfb3BlcmFuZCAodG9rZW5fc3RhcnQpOwotCSAgICAgICpjdXJyZW50X3Bvc24gPSBzYXZlX2NoYXI7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlW3RoaXNfb3BlcmFuZF0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoZXhwZWN0aW5nX29wZXJhbmQpCi0JCXsKLQkJICBhc19iYWQgKCJFeHBlY3Rpbmcgb3BlcmFuZCBhZnRlciAnLCc7IGdvdCBub3RoaW5nIik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gJywnKQotCQl7Ci0JCSAgYXNfYmFkICgiRXhwZWN0aW5nIG9wZXJhbmQgYmVmb3JlICcsJzsgZ290IG5vdGhpbmciKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgfQotCSAgLyogbm93ICpjdXJyZW50X3Bvc24gbXVzdCBiZSBlaXRoZXIgJywnIG9yIEVORF9PRl9JTlNOICovCi0JICBpZiAoKmN1cnJlbnRfcG9zbiA9PSAnLCcpCi0JICAgIHsKLQkgICAgICBpZiAoKisrY3VycmVudF9wb3NuID09IEVORF9PRl9JTlNOKQotCQl7CQkvKiBqdXN0IHNraXAgaXQsIGlmIGl0J3MgXG4gY29tcGxhaW4gKi8KLQkJICBhc19iYWQgKCJFeHBlY3Rpbmcgb3BlcmFuZCBhZnRlciAnLCc7IGdvdCBub3RoaW5nIik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgZXhwZWN0aW5nX29wZXJhbmQgPSAxOwotCSAgICB9Ci0JfQotICAgICAgd2hpbGUgKCpjdXJyZW50X3Bvc24gIT0gRU5EX09GX0lOU04pOwkvKiB1bnRpbCB3ZSBnZXQgZW5kIG9mIGluc24gKi8KLSAgICB9Ci0gIGRlYnVnICgiTnVtYmVyIG9mIG9wZXJhbmRzIGZvdW5kOiAlZFxuIiwgaW5zbi5vcGVyYW5kcyk7Ci0gIC8qIENoZWNrIHRoYXQgbnVtYmVyIG9mIG9wZXJhbmRzIGlzIGNvcnJlY3QgKi8KLSAgaWYgKGluc24ub3BlcmFuZHMgIT0gaW5zbi50bS0+b3BlcmFuZHMpCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICBpbnQgbnVtb3BzID0gaW5zbi50bS0+b3BlcmFuZHM7Ci0gICAgICAvKiBJZiBvcGVyYW5kcyBhcmUgbm90IHRoZSBzYW1lLCB0aGVuIHNlZSBpZiBhbnkgb2YgdGhlIG9wZXJhbmRzIGFyZSBub3QKLSAgICAgICAgIHJlcXVpcmVkLiAgVGhlbiByZWNoZWNrIHdpdGggbnVtYmVyIG9mIGdpdmVuIG9wZXJhbmRzLiAgSWYgdGhleSBhcmUgc3RpbGwgbm90Ci0gICAgICAgICB0aGUgc2FtZSwgdGhlbiBnaXZlIGFuIGVycm9yLCBvdGhlcndpc2UgY2Fycnkgb24uICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgaW5zbi50bS0+b3BlcmFuZHM7IGkrKykKLQlpZiAoaW5zbi50bS0+b3BlcmFuZF90eXBlc1tpXSAmIE5vdFJlcSkKLQkgIG51bW9wcy0tOwotICAgICAgaWYgKGluc24ub3BlcmFuZHMgIT0gbnVtb3BzKQotCXsKLQkgIGFzX2JhZCAoIkluY29ycmVjdCBudW1iZXIgb2Ygb3BlcmFuZHMgZ2l2ZW4iKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX05vdFJlcTsKLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgaW5zbi5vcGVyYW5kczsgY291bnQrKykKLSAgICB7Ci0gICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbY291bnRdLT5vcF90eXBlICYgaW5zbi50bS0+b3BlcmFuZF90eXBlc1tjb3VudF0pCi0JewotCSAgZGVidWcgKCJPcGVyYW5kICVkIG1hdGNoZXNcbiIsIGNvdW50ICsgMSk7Ci0JICAvKiBJZiBpbnN0cnVjdGlvbiBoYXMgdHdvIG9wZXJhbmRzIGFuZCBoYXMgYW4gQWRkcmVzc01vZGUgbW9kaWZpZXIgdGhlbiBzZXQKLQkgICAgIGFkZHJlc3NpbmcgbW9kZSB0eXBlIGZvciBpbnN0cnVjdGlvbiAqLwotCSAgaWYgKGluc24udG0tPm9wY29kZV9tb2RpZmllciA9PSBBZGRyZXNzTW9kZSkKLQkgICAgewotCSAgICAgIGludCBhZGRyX2luc24gPSAwOwotCSAgICAgIC8qIFN0b3JlIGluc3RydWN0aW9uIHVzZXMgdGhlIHNlY29uZCBvcGVyYW5kIGZvciB0aGUgYWRkcmVzcyBtb2RlLiAqLwotCSAgICAgIGlmICgoaW5zbi50bS0+b3BlcmFuZF90eXBlc1sxXSAmIChJbmRpcmVjdCB8IERpcmVjdCkpID09IChJbmRpcmVjdCB8IERpcmVjdCkpCi0JCWFkZHJfaW5zbiA9IDE7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlW2FkZHJfaW5zbl0tPm9wX3R5cGUgJiAoQWxsUmVnKSkKLQkJaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9SZWdpc3RlcjsKLQkgICAgICBlbHNlIGlmIChpbnNuLm9wZXJhbmRfdHlwZVthZGRyX2luc25dLT5vcF90eXBlICYgRGlyZWN0KQotCQlpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX0RpcmVjdDsKLQkgICAgICBlbHNlIGlmIChpbnNuLm9wZXJhbmRfdHlwZVthZGRyX2luc25dLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JCWluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fSW5kaXJlY3Q7Ci0JICAgICAgZWxzZQotCQlpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX0ltbWVkaWF0ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKCJUaGUgJXMgb3BlcmFuZCBkb2Vzbid0IG1hdGNoIiwgb3JkaW5hbF9uYW1lc1tjb3VudF0pOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIC8qIE5vdyBzZXQgdGhlIGFkZHJlc3NpbmcgbW9kZSBmb3IgMyBvcGVyYW5kIGluc3RydWN0aW9ucy4gKi8KLSAgaWYgKChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgb3AzVDEpICYmIChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzFdICYgb3AzVDIpKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgYWRkcmVzc2luZyBtb2RlIHRvIHRoZSB2YWx1ZXMgdXNlZCBmb3IgMiBvcGVyYW5kIGluc3RydWN0aW9ucyBpbiB0aGUKLSAgICAgICAgIEcgYWRkcmVzc2luZyBmaWVsZCBvZiB0aGUgb3Bjb2RlLiAqLwotICAgICAgY2hhciAqcDsKLSAgICAgIHN3aXRjaCAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPm9wX3R5cGUpCi0JewotCWNhc2UgUm46Ci0JY2FzZSBBUm46Ci0JY2FzZSBEUFJlZzoKLQljYXNlIE90aGVyUmVnOgotCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgKEFsbFJlZykpCi0JICAgIGluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fUmVnaXN0ZXI7Ci0JICBlbHNlIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCSAgICBpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX0RpcmVjdDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFNob3VsZG4ndCBtYWtlIGl0IHRvIHRoaXMgc3RhZ2UgKi8KLQkgICAgICBhc19iYWQgKCJJbmNvbXBhdGlibGUgZmlyc3QgYW5kIHNlY29uZCBvcGVyYW5kcyBpbiBpbnN0cnVjdGlvbiIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBJbmRpcmVjdDoKLQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIChBbGxSZWcpKQotCSAgICBpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX0luZGlyZWN0OwotCSAgZWxzZSBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQkgICAgaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9JbW1lZGlhdGU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBTaG91bGRuJ3QgbWFrZSBpdCB0byB0aGlzIHN0YWdlICovCi0JICAgICAgYXNfYmFkICgiSW5jb21wYXRpYmxlIGZpcnN0IGFuZCBzZWNvbmQgb3BlcmFuZHMgaW4gaW5zdHJ1Y3Rpb24iKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIC8qIE5vdyBtYWtlIHVwIHRoZSBvcGNvZGUgZm9yIHRoZSAzIG9wZXJhbmQgaW5zdHJ1Y3Rpb25zLiAgQXMgaW4gcGFyYWxsZWwKLSAgICAgICAgIGluc3RydWN0aW9ucywgdGhlcmUgd2lsbCBiZSBubyB1bnJlc29sdmVkIHZhbHVlcywgc28gdGhleSBjYW4gYmUgZnVsbHkgZm9ybWVkCi0gICAgICAgICBhbmQgYWRkZWQgdG8gdGhlIGZyYWcgdGFibGUuICovCi0gICAgICBpbnNuLm9wY29kZSA9IGluc24udG0tPmJhc2Vfb3Bjb2RlOwotICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JewotCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbmRpcmVjdC5BUm51bSk7Ci0JICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQl9Ci0gICAgICBlbHNlCi0JaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5yZWcub3Bjb2RlKTsKLSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCXsKLQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JfQotICAgICAgZWxzZQotCWluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+cmVnLm9wY29kZSA8PCA4KTsKLSAgICAgIGlmIChpbnNuLm9wZXJhbmRzID09IDMpCi0JaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzJdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLSAgICAgIGluc24ub3Bjb2RlIHw9IGluc24uYWRkcmVzc2luZ19tb2RlOwotICAgICAgcCA9IGZyYWdfbW9yZSAoSU5TTl9TSVpFKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0gICAgfQotICBlbHNlCi0gICAgewkJCQkvKiBOb3QgYSB0aHJlZSBvcGVyYW5kIGluc3RydWN0aW9uICovCi0gICAgICBjaGFyICpwOwotICAgICAgaW50IGFtX2luc24gPSAtMTsKLSAgICAgIGluc24ub3Bjb2RlID0gaW5zbi50bS0+YmFzZV9vcGNvZGU7Ci0gICAgICAvKiBDcmVhdGUgZnJhZyBmb3IgaW5zdHJ1Y3Rpb24gLSBhbGwgaW5zdHJ1Y3Rpb25zIGFyZSA0IGJ5dGVzIGxvbmcuICovCi0gICAgICBwID0gZnJhZ19tb3JlIChJTlNOX1NJWkUpOwotICAgICAgaWYgKChpbnNuLm9wZXJhbmRzID4gMCkgJiYgKGluc24udG0tPm9wY29kZV9tb2RpZmllciA9PSBBZGRyZXNzTW9kZSkpCi0JewotCSAgaW5zbi5vcGNvZGUgfD0gaW5zbi5hZGRyZXNzaW5nX21vZGU7Ci0JICBpZiAoaW5zbi5hZGRyZXNzaW5nX21vZGUgPT0gQU1fSW5kaXJlY3QpCi0JICAgIHsKLQkgICAgICAvKiBEZXRlcm1pbmUgd2hpY2ggb3BlcmFuZCBnaXZlcyB0aGUgYWRkcmVzc2luZyBtb2RlICovCi0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JCWFtX2luc24gPSAwOwotCSAgICAgIGlmICgoaW5zbi5vcGVyYW5kcyA+IDEpICYmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIEluZGlyZWN0KSkKLQkJYW1faW5zbiA9IDE7Ci0JICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlW2FtX2luc25dLT5pbmRpcmVjdC5kaXNwKTsKLQkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbYW1faW5zbl0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCSAgICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVthbV9pbnNuXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kcyA+IDEpCi0JCWluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVshYW1faW5zbl0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGluc24uYWRkcmVzc2luZ19tb2RlID09IEFNX1JlZ2lzdGVyKQotCSAgICB7Ci0JICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5yZWcub3Bjb2RlKTsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kcyA+IDEpCi0JCWluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW5zbi5hZGRyZXNzaW5nX21vZGUgPT0gQU1fRGlyZWN0KQotCSAgICB7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5vcF90eXBlICYgRGlyZWN0KQotCQlhbV9pbnNuID0gMDsKLQkgICAgICBpZiAoKGluc24ub3BlcmFuZHMgPiAxKSAmJiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiBEaXJlY3QpKQotCQlhbV9pbnNuID0gMTsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kcyA+IDEpCi0JCWluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVshYW1faW5zbl0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVthbV9pbnNuXS0+ZGlyZWN0LnJlc29sdmVkID09IDEpCi0JCXsKLQkJICAvKiBSZXNvbHZlZCB2YWx1ZXMgY2FuIGJlIHBsYWNlZCBzdHJhaWdodCBpbnRvIGluc3RydWN0aW9uIHdvcmQsIGFuZCBvdXRwdXQgKi8KLQkJICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbYW1faW5zbl0tPmRpcmVjdC5hZGRyZXNzICYgMHgwMDAwRkZGRik7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewkJLyogVW5yZXNvbHZlZCBkaXJlY3QgYWRkcmVzc2luZyBtb2RlIGluc3RydWN0aW9uICovCi0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgKyAyIC0gKGZyYWdfbm93LT5mcl9saXRlcmFsKSwgMiwgJmluc24ub3BlcmFuZF90eXBlW2FtX2luc25dLT5kaXJlY3QuZGlyZWN0X2V4cHIsIDAsIDApOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGluc24uYWRkcmVzc2luZ19tb2RlID09IEFNX0ltbWVkaWF0ZSkKLQkgICAgewotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnJlc29sdmVkID09IDEpCi0JCXsKLQkJICBjaGFyICprZWVwbG9jOwotCQkgIGludCBzaXplOwotCQkgIGlmIChpbnNuLm9wZXJhbmRzID4gMSkKLQkJICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JCSAgc3dpdGNoIChpbnNuLnRtLT5pbW1fYXJnX3R5cGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIEltbV9GbG9hdDoKLQkJICAgICAgZGVidWcgKCJGbG9hdGluZyBwb2ludCBmaXJzdCBvcGVyYW5kXG4iKTsKLQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICAgICAga2VlcGxvYyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5sYWJlbDsKLQkJICAgICAgaWYgKG1kX2F0b2YgKCdmJywgcCArIDIsICZzaXplKSAhPSAwKQotCQkJewotCQkJICBhc19iYWQgKCJpbnZhbGlkIHNob3J0IGZvcm0gZmxvYXRpbmcgcG9pbnQgaW1tZWRpYXRlIG9wZXJhbmQiKTsKLQkJCSAgcmV0dXJuOwotCQkJfQotCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBrZWVwbG9jOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgSW1tX1VJbnQ6Ci0JCSAgICAgIGRlYnVnICgiVW5zaWduZWQgaW50IGZpcnN0IG9wZXJhbmRcbiIpOwotCQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5kZWNpbWFsX2ZvdW5kKQotCQkJYXNfd2FybiAoInJvdW5kaW5nIGRvd24gZmlyc3Qgb3BlcmFuZCBmbG9hdCB0byB1bnNpZ25lZCBpbnQiKTsKLQkJICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUudV9udW1iZXIgPiAweEZGRkYpCi0JCQlhc193YXJuICgib25seSBsb3dlciAxNi1iaXRzIG9mIGZpcnN0IG9wZXJhbmQgYXJlIHVzZWQiKTsKLQkJICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUudV9udW1iZXIgJiAweDAwMDBGRkZGTCk7Ci0JCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBJbW1fU0ludDoKLQkJICAgICAgZGVidWcgKCJJbnQgZmlyc3Qgb3BlcmFuZFxuIik7Ci0JCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmRlY2ltYWxfZm91bmQpCi0JCQlhc193YXJuICgicm91bmRpbmcgZG93biBmaXJzdCBvcGVyYW5kIGZsb2F0IHRvIHNpZ25lZCBpbnQiKTsKLQkJICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuc19udW1iZXIgPCAtMzI3NjggfHwKLQkJCSAgaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5zX251bWJlciA+IDMyNzY3KQotCQkJewotCQkJICBhc19iYWQgKCJmaXJzdCBvcGVyYW5kIGlzIHRvbyBsYXJnZSBmb3IgMTYtYml0IHNpZ25lZCBpbnQiKTsKLQkJCSAgcmV0dXJuOwotCQkJfQotCQkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5zX251bWJlciAmIDB4MDAwMEZGRkZMKTsKLQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsJCS8qIFVucmVzb2x2ZWQgaW1tZWRpYXRlIGxhYmVsICovCi0JCSAgaWYgKGluc24ub3BlcmFuZHMgPiAxKQotCQkgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDIgLSAoZnJhZ19ub3ctPmZyX2xpdGVyYWwpLCAyLCAmaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5pbW1fZXhwciwgMCwgMCk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluc24udG0tPm9wY29kZV9tb2RpZmllciA9PSBQQ1JlbCkKLQl7Ci0JICAvKiBDb25kaXRpb25hbCBCcmFuY2ggYW5kIENhbGwgaW5zdHJ1Y3Rpb25zICovCi0JICBpZiAoKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gJiAoQWxsUmVnIHwgRGlzcCkpID09IChBbGxSZWcgfCBEaXNwKSkKLQkgICAgewotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+b3BfdHlwZSAmIChBbGxSZWcpKQotCQl7Ci0JCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5yZWcub3Bjb2RlKTsKLQkJICBpbnNuLm9wY29kZSB8PSBQQ19SZWdpc3RlcjsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW5zbi5vcGNvZGUgfD0gUENfUmVsYXRpdmU7Ci0JCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUucmVzb2x2ZWQgPT0gMSkKLQkJICAgIHsKLQkJICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuc19udW1iZXIgJiAweDAwMDBGRkZGKTsKLQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDIgLSAoZnJhZ19ub3ctPmZyX2xpdGVyYWwpLCAyLCAmaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5pbW1fZXhwciwgMSwgMCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gJiBBUm4pID09IEFSbikKLQkgICAgewotCSAgICAgIC8qIERlY3JlbWVudCBhbmQgQnJhbmNoIGluc3RydWN0aW9ucyAqLwotCSAgICAgIGluc24ub3Bjb2RlIHw9ICgoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPnJlZy5vcGNvZGUgLSAweDA4KSA8PCAyMik7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgKEFsbFJlZykpCi0JCXsKLQkJICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPnJlZy5vcGNvZGUpOwotCQkgIGluc24ub3Bjb2RlIHw9IFBDX1JlZ2lzdGVyOwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+aW1tZWRpYXRlLnJlc29sdmVkID09IDEpCi0JCXsKLQkJICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5kZWNpbWFsX2ZvdW5kKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKCJmaXJzdCBvcGVyYW5kIGlzIGZsb2F0aW5nIHBvaW50Iik7Ci0JCSAgICAgIHJldHVybjsKLQkJICAgIH0KLQkJICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5zX251bWJlciA8IC0zMjc2OCB8fAotCQkgICAgICBpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnNfbnVtYmVyID4gMzI3NjcpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoImZpcnN0IG9wZXJhbmQgaXMgdG9vIGxhcmdlIGZvciAxNi1iaXQgc2lnbmVkIGludCIpOwotCQkgICAgICByZXR1cm47Ci0JCSAgICB9Ci0JCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5pbW1lZGlhdGUuc19udW1iZXIpOwotCQkgIGluc24ub3Bjb2RlIHw9IFBDX1JlbGF0aXZlOwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnNuLm9wY29kZSB8PSBQQ19SZWxhdGl2ZTsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDIgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMiwgJmluc24ub3BlcmFuZF90eXBlWzFdLT5pbW1lZGlhdGUuaW1tX2V4cHIsIDEsIDApOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdID09IElWZWN0b3IpCi0JewotCSAgLyogVHJhcCBpbnN0cnVjdGlvbnMgKi8KLQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+b3BfdHlwZSAmIElWZWN0b3IpCi0JICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnVfbnVtYmVyKTsKLQkgIGVsc2UKLQkgICAgewkJCS8qIFNob3VsZG4ndCBnZXQgaGVyZSAqLwotCSAgICAgIGFzX2JhZCAoImludGVycnVwdCB2ZWN0b3IgZm9yIHRyYXAgaW5zdHJ1Y3Rpb24gb3V0IG9mIHJhbmdlIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCX0KLSAgICAgIGVsc2UgaWYgKGluc24udG0tPm9wY29kZV9tb2RpZmllciA9PSBTdGFja09wIHx8IGluc24udG0tPm9wY29kZV9tb2RpZmllciA9PSBSb3RhdGUpCi0JewotCSAgLyogUHVzaCwgUG9wIGFuZCBSb3RhdGUgaW5zdHJ1Y3Rpb25zICovCi0JICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQl9Ci0gICAgICBlbHNlIGlmICgoaW5zbi50bS0+b3BlcmFuZF90eXBlc1swXSAmIChBYnMyNCB8IERpcmVjdCkpID09IChBYnMyNCB8IERpcmVjdCkpCi0JewotCSAgLyogTERQIEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIHRlc3RlZCBmb3IgYmVmb3JlIHRoZSBuZXh0IHNlY3Rpb24gKi8KLQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+b3BfdHlwZSAmIERpcmVjdCkKLQkgICAgewotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+ZGlyZWN0LnJlc29sdmVkID09IDEpCi0JCXsKLQkJICAvKiBEaXJlY3QgYWRkcmVzc2luZyB1c2VzIGxvd2VyIDggYml0cyBvZiBkaXJlY3QgYWRkcmVzcyAqLwotCQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+ZGlyZWN0LmFkZHJlc3MgJiAweDAwRkYwMDAwKSA+PiAxNjsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZml4UyAqZml4OwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgZml4ID0gZml4X25ld19leHAgKGZyYWdfbm93LCBwICsgMyAtIChmcmFnX25vdy0+ZnJfbGl0ZXJhbCksIDEsICZpbnNuLm9wZXJhbmRfdHlwZVswXS0+ZGlyZWN0LmRpcmVjdF9leHByLCAwLCAwKTsKLQkJICAvKiBFbnN1cmUgdGhhdCB0aGUgYXNzZW1ibGVyIGRvZXNuJ3QgY29tcGxhaW4gYWJvdXQgZml0dGluZyBhIDI0LWJpdAotCQkgICAgIGFkZHJlc3MgaW50byA4IGJpdHMuICovCi0JCSAgZml4LT5meF9ub19vdmVyZmxvdyA9IDE7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUucmVzb2x2ZWQgPT0gMSkKLQkJewotCQkgIC8qIEltbWVkaWF0ZSBhZGRyZXNzaW5nIHVzZXMgdXBwZXIgOCBiaXRzIG9mIGFkZHJlc3MgKi8KLQkJICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS51X251bWJlciA+IDB4MDBGRkZGRkYpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoIkxEUCBpbnN0cnVjdGlvbiBuZWVkcyBhIDI0LWJpdCBvcGVyYW5kIik7Ci0JCSAgICAgIHJldHVybjsKLQkJICAgIH0KLQkJICBpbnNuLm9wY29kZSB8PSAoKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUudV9udW1iZXIgJiAweDAwRkYwMDAwKSA+PiAxNik7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGZpeFMgKmZpeDsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgIGZpeCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDMgLSAoZnJhZ19ub3ctPmZyX2xpdGVyYWwpLCAxLCAmaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5pbW1fZXhwciwgMCwgMCk7Ci0JCSAgZml4LT5meF9ub19vdmVyZmxvdyA9IDE7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gJiAoSW1tMjQpKQotCXsKLQkgIC8qIFVuY29uZGl0aW9uYWwgQnJhbmNoIGFuZCBDYWxsIGluc3RydWN0aW9ucyAqLwotCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUucmVzb2x2ZWQgPT0gMSkKLQkgICAgewotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnVfbnVtYmVyID4gMHgwMEZGRkZGRikKLQkJYXNfd2FybiAoImZpcnN0IG9wZXJhbmQgaXMgdG9vIGxhcmdlIGZvciBhIDI0LWJpdCBkaXNwbGFjZW1lbnQiKTsKLQkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS51X251bWJlciAmIDB4MDBGRkZGRkYpOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwICsgMSAtIChmcmFnX25vdy0+ZnJfbGl0ZXJhbCksIDMsICZpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmltbV9leHByLCAwLCAwKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gJiBOb3RSZXEpCi0JewotCSAgLyogQ2hlY2sgZm9yIE5PUCBpbnN0cnVjdGlvbiB3aXRob3V0IGFyZ3VtZW50cy4gKi8KLQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JfQotICAgICAgZWxzZSBpZiAoaW5zbi50bS0+b3BlcmFuZHMgPT0gMCkKLQl7Ci0JICAvKiBDaGVjayBmb3IgaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgb3BlcmFuZHMuICovCi0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCX0KLSAgICB9Ci0gIGRlYnVnICgiQWRkcmVzc2luZyBtb2RlOiAlMDhYXG4iLCBpbnNuLmFkZHJlc3NpbmdfbW9kZSk7Ci0gIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5zbi5vcGVyYW5kczsgaSsrKQotICAgICAgewotCWlmIChpbnNuLm9wZXJhbmRfdHlwZVtpXS0+aW1tZWRpYXRlLmxhYmVsKQotCSAgZnJlZSAoaW5zbi5vcGVyYW5kX3R5cGVbaV0tPmltbWVkaWF0ZS5sYWJlbCk7Ci0JZnJlZSAoaW5zbi5vcGVyYW5kX3R5cGVbaV0pOwotICAgICAgfQotICB9Ci0gIGRlYnVnICgiRmluYWwgb3Bjb2RlOiAlMDhYXG4iLCBpbnNuLm9wY29kZSk7Ci0gIGRlYnVnICgiXG4iKTsKLX0KLQotc3RydWN0IHRpYzMwX3Bhcl9pbnNuCi17Ci0gIHBhcnRlbXBsYXRlICp0bTsJCS8qIFRlbXBsYXRlIG9mIGN1cnJlbnQgcGFyYWxsZWwgaW5zdHJ1Y3Rpb24gKi8KLSAgaW50IG9wZXJhbmRzWzJdOwkJLyogTnVtYmVyIG9mIGdpdmVuIG9wZXJhbmRzIGZvciBlYWNoIGluc24gKi8KLSAgLyogVHlwZSBvZiBvcGVyYW5kIGdpdmVuIGluIGluc3RydWN0aW9uICovCi0gIG9wZXJhbmQgKm9wZXJhbmRfdHlwZVsyXVtNQVhfT1BFUkFORFNdOwotICBpbnQgc3dhcF9vcGVyYW5kczsJCS8qIFdoZXRoZXIgdG8gc3dhcCBvcGVyYW5kcyBhcm91bmQuICovCi0gIHVuc2lnbmVkIHBfZmllbGQ7CQkvKiBWYWx1ZSBvZiBwIGZpZWxkIGluIG11bHRpcGx5IGFkZC9zdWIgaW5zdHJ1Y3Rpb25zICovCi0gIHVuc2lnbmVkIG9wY29kZTsJCS8qIEZpbmFsIG9wY29kZSAqLwotfTsKLQotc3RydWN0IHRpYzMwX3Bhcl9pbnNuIHBfaW5zbjsKLQotaW50Ci10aWMzMF9wYXJhbGxlbF9pbnNuIChjaGFyICp0b2tlbikKLXsKLSAgc3RhdGljIHBhcnRlbXBsYXRlICpwX29wY29kZTsKLSAgY2hhciAqY3VycmVudF9wb3NuID0gdG9rZW47Ci0gIGNoYXIgKnRva2VuX3N0YXJ0OwotICBjaGFyIHNhdmVfY2hhcjsKLQotICBkZWJ1ZyAoIkluIHRpYzMwX3BhcmFsbGVsX2luc24gd2l0aCAlc1xuIiwgdG9rZW4pOwotICBtZW1zZXQgKCZwX2luc24sICdcMCcsIHNpemVvZiAocF9pbnNuKSk7Ci0gIHdoaWxlIChpc19vcGNvZGVfY2hhciAoKmN1cnJlbnRfcG9zbikpCi0gICAgY3VycmVudF9wb3NuKys7Ci0gIHsJCQkJLyogRmluZCBpbnN0cnVjdGlvbiAqLwotICAgIHNhdmVfY2hhciA9ICpjdXJyZW50X3Bvc247Ci0gICAgKmN1cnJlbnRfcG9zbiA9ICdcMCc7Ci0gICAgcF9vcGNvZGUgPSAocGFydGVtcGxhdGUgKikgaGFzaF9maW5kIChwYXJvcF9oYXNoLCB0b2tlbik7Ci0gICAgaWYgKHBfb3Bjb2RlKQotICAgICAgewotCWRlYnVnICgiRm91bmQgaW5zdHJ1Y3Rpb24gJXNcbiIsIHBfb3Bjb2RlLT5uYW1lKTsKLQlwX2luc24udG0gPSBwX29wY29kZTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JY2hhciBmaXJzdF9vcGNvZGVbNl0gPQotCXswfTsKLQljaGFyIHNlY29uZF9vcGNvZGVbNl0gPQotCXswfTsKLQlpbnQgaTsKLQlpbnQgY3VycmVudF9vcGNvZGUgPSAtMTsKLQlpbnQgY2hhcl9wdHIgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IHN0cmxlbiAodG9rZW4pOyBpKyspCi0JICB7Ci0JICAgIGNoYXIgY2ggPSAqKHRva2VuICsgaSk7Ci0JICAgIGlmIChjaCA9PSAnXycgJiYgY3VycmVudF9vcGNvZGUgPT0gLTEpCi0JICAgICAgewotCQljdXJyZW50X29wY29kZSA9IDA7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgaWYgKGNoID09ICdfJyAmJiBjdXJyZW50X29wY29kZSA9PSAwKQotCSAgICAgIHsKLQkJY3VycmVudF9vcGNvZGUgPSAxOwotCQljaGFyX3B0ciA9IDA7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgc3dpdGNoIChjdXJyZW50X29wY29kZSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSAwOgotCQlmaXJzdF9vcGNvZGVbY2hhcl9wdHIrK10gPSBjaDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAxOgotCQlzZWNvbmRfb3Bjb2RlW2NoYXJfcHRyKytdID0gY2g7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIH0KLQlkZWJ1ZyAoImZpcnN0X29wY29kZSA9ICVzXG4iLCBmaXJzdF9vcGNvZGUpOwotCWRlYnVnICgic2Vjb25kX29wY29kZSA9ICVzXG4iLCBzZWNvbmRfb3Bjb2RlKTsKLQlzcHJpbnRmICh0b2tlbiwgInFfJXNfJXMiLCBzZWNvbmRfb3Bjb2RlLCBmaXJzdF9vcGNvZGUpOwotCXBfb3Bjb2RlID0gKHBhcnRlbXBsYXRlICopIGhhc2hfZmluZCAocGFyb3BfaGFzaCwgdG9rZW4pOwotCWlmIChwX29wY29kZSkKLQkgIHsKLQkgICAgZGVidWcgKCJGb3VuZCBpbnN0cnVjdGlvbiAlc1xuIiwgcF9vcGNvZGUtPm5hbWUpOwotCSAgICBwX2luc24udG0gPSBwX29wY29kZTsKLQkgICAgcF9pbnNuLnN3YXBfb3BlcmFuZHMgPSAxOwotCSAgfQotCWVsc2UKLQkgIHJldHVybiAwOwotICAgICAgfQotICAgICpjdXJyZW50X3Bvc24gPSBzYXZlX2NoYXI7Ci0gIH0KLSAgewkJCQkvKiBGaW5kIG9wZXJhbmRzICovCi0gICAgaW50IHBhcmVuX25vdF9iYWxhbmNlZDsKLSAgICBpbnQgZXhwZWN0aW5nX29wZXJhbmQgPSAwOwotICAgIGludCBmb3VuZF9zZXBhcmF0b3IgPSAwOwotICAgIGRvCi0gICAgICB7Ci0JLyogc2tpcCBvcHRpb25hbCB3aGl0ZSBzcGFjZSBiZWZvcmUgb3BlcmFuZCAqLwotCXdoaWxlICghaXNfb3BlcmFuZF9jaGFyICgqY3VycmVudF9wb3NuKSAmJiAqY3VycmVudF9wb3NuICE9IEVORF9PRl9JTlNOKQotCSAgewotCSAgICBpZiAoIWlzX3NwYWNlX2NoYXIgKCpjdXJyZW50X3Bvc24pICYmICpjdXJyZW50X3Bvc24gIT0gUEFSQUxMRUxfU0VQQVJBVE9SKQotCSAgICAgIHsKLQkJYXNfYmFkICgiSW52YWxpZCBjaGFyYWN0ZXIgJXMgYmVmb3JlICVzIG9wZXJhbmQiLAotCQkJb3V0cHV0X2ludmFsaWQgKCpjdXJyZW50X3Bvc24pLAotCQkJb3JkaW5hbF9uYW1lc1tpbnNuLm9wZXJhbmRzXSk7Ci0JCXJldHVybiAxOwotCSAgICAgIH0KLQkgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gUEFSQUxMRUxfU0VQQVJBVE9SKQotCSAgICAgIGZvdW5kX3NlcGFyYXRvciA9IDE7Ci0JICAgIGN1cnJlbnRfcG9zbisrOwotCSAgfQotCXRva2VuX3N0YXJ0ID0gY3VycmVudF9wb3NuOwkvKiBhZnRlciB3aGl0ZSBzcGFjZSAqLwotCXBhcmVuX25vdF9iYWxhbmNlZCA9IDA7Ci0Jd2hpbGUgKHBhcmVuX25vdF9iYWxhbmNlZCB8fCAqY3VycmVudF9wb3NuICE9ICcsJykKLQkgIHsKLQkgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gRU5EX09GX0lOU04pCi0JICAgICAgewotCQlpZiAocGFyZW5fbm90X2JhbGFuY2VkKQotCQkgIHsKLQkJICAgIGFzX2JhZCAoIlVuYmFsYW5jZWQgcGFyZW50aGVzaXMgaW4gJXMgb3BlcmFuZC4iLAotCQkJICAgIG9yZGluYWxfbmFtZXNbaW5zbi5vcGVyYW5kc10pOwotCQkgICAgcmV0dXJuIDE7Ci0JCSAgfQotCQllbHNlCi0JCSAgYnJlYWs7CS8qIHdlIGFyZSBkb25lICovCi0JICAgICAgfQotCSAgICBlbHNlIGlmICgqY3VycmVudF9wb3NuID09IFBBUkFMTEVMX1NFUEFSQVRPUikKLQkgICAgICB7Ci0JCXdoaWxlIChpc19zcGFjZV9jaGFyICgqKGN1cnJlbnRfcG9zbiAtIDEpKSkKLQkJICBjdXJyZW50X3Bvc24tLTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmICghaXNfb3BlcmFuZF9jaGFyICgqY3VycmVudF9wb3NuKSAmJiAhaXNfc3BhY2VfY2hhciAoKmN1cnJlbnRfcG9zbikpCi0JICAgICAgewotCQlhc19iYWQgKCJJbnZhbGlkIGNoYXJhY3RlciAlcyBpbiAlcyBvcGVyYW5kIiwKLQkJCW91dHB1dF9pbnZhbGlkICgqY3VycmVudF9wb3NuKSwKLQkJCW9yZGluYWxfbmFtZXNbaW5zbi5vcGVyYW5kc10pOwotCQlyZXR1cm4gMTsKLQkgICAgICB9Ci0JICAgIGlmICgqY3VycmVudF9wb3NuID09ICcoJykKLQkgICAgICArK3BhcmVuX25vdF9iYWxhbmNlZDsKLQkgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gJyknKQotCSAgICAgIC0tcGFyZW5fbm90X2JhbGFuY2VkOwotCSAgICBjdXJyZW50X3Bvc24rKzsKLQkgIH0KLQlpZiAoY3VycmVudF9wb3NuICE9IHRva2VuX3N0YXJ0KQotCSAgewkJCS8qIHllcywgd2UndmUgcmVhZCBpbiBhbm90aGVyIG9wZXJhbmQgKi8KLQkgICAgcF9pbnNuLm9wZXJhbmRzW2ZvdW5kX3NlcGFyYXRvcl0rKzsKLQkgICAgaWYgKHBfaW5zbi5vcGVyYW5kc1tmb3VuZF9zZXBhcmF0b3JdID4gTUFYX09QRVJBTkRTKQotCSAgICAgIHsKLQkJYXNfYmFkICgiU3B1cmlvdXMgb3BlcmFuZHM7ICglZCBvcGVyYW5kcy9pbnN0cnVjdGlvbiBtYXgpIiwKLQkJCU1BWF9PUEVSQU5EUyk7Ci0JCXJldHVybiAxOwotCSAgICAgIH0KLQkgICAgLyogbm93IHBhcnNlIG9wZXJhbmQgYWRkaW5nIGluZm8gdG8gJ2luc24nIGFzIHdlIGdvIGFsb25nICovCi0JICAgIHNhdmVfY2hhciA9ICpjdXJyZW50X3Bvc247Ci0JICAgICpjdXJyZW50X3Bvc24gPSAnXDAnOwotCSAgICBwX2luc24ub3BlcmFuZF90eXBlW2ZvdW5kX3NlcGFyYXRvcl1bcF9pbnNuLm9wZXJhbmRzW2ZvdW5kX3NlcGFyYXRvcl0gLSAxXSA9Ci0JICAgICAgdGljMzBfb3BlcmFuZCAodG9rZW5fc3RhcnQpOwotCSAgICAqY3VycmVudF9wb3NuID0gc2F2ZV9jaGFyOwotCSAgICBpZiAoIXBfaW5zbi5vcGVyYW5kX3R5cGVbZm91bmRfc2VwYXJhdG9yXVtwX2luc24ub3BlcmFuZHNbZm91bmRfc2VwYXJhdG9yXSAtIDFdKQotCSAgICAgIHJldHVybiAxOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKGV4cGVjdGluZ19vcGVyYW5kKQotCSAgICAgIHsKLQkJYXNfYmFkICgiRXhwZWN0aW5nIG9wZXJhbmQgYWZ0ZXIgJywnOyBnb3Qgbm90aGluZyIpOwotCQlyZXR1cm4gMTsKLQkgICAgICB9Ci0JICAgIGlmICgqY3VycmVudF9wb3NuID09ICcsJykKLQkgICAgICB7Ci0JCWFzX2JhZCAoIkV4cGVjdGluZyBvcGVyYW5kIGJlZm9yZSAnLCc7IGdvdCBub3RoaW5nIik7Ci0JCXJldHVybiAxOwotCSAgICAgIH0KLQkgIH0KLQkvKiBub3cgKmN1cnJlbnRfcG9zbiBtdXN0IGJlIGVpdGhlciAnLCcgb3IgRU5EX09GX0lOU04gKi8KLQlpZiAoKmN1cnJlbnRfcG9zbiA9PSAnLCcpCi0JICB7Ci0JICAgIGlmICgqKytjdXJyZW50X3Bvc24gPT0gRU5EX09GX0lOU04pCi0JICAgICAgewkJCS8qIGp1c3Qgc2tpcCBpdCwgaWYgaXQncyBcbiBjb21wbGFpbiAqLwotCQlhc19iYWQgKCJFeHBlY3Rpbmcgb3BlcmFuZCBhZnRlciAnLCc7IGdvdCBub3RoaW5nIik7Ci0JCXJldHVybiAxOwotCSAgICAgIH0KLQkgICAgZXhwZWN0aW5nX29wZXJhbmQgPSAxOwotCSAgfQotICAgICAgfQotICAgIHdoaWxlICgqY3VycmVudF9wb3NuICE9IEVORF9PRl9JTlNOKTsJLyogdW50aWwgd2UgZ2V0IGVuZCBvZiBpbnNuICovCi0gIH0KLSAgaWYgKHBfaW5zbi5zd2FwX29wZXJhbmRzKQotICAgIHsKLSAgICAgIGludCB0ZW1wX251bSwgaTsKLSAgICAgIG9wZXJhbmQgKnRlbXBfb3A7Ci0KLSAgICAgIHRlbXBfbnVtID0gcF9pbnNuLm9wZXJhbmRzWzBdOwotICAgICAgcF9pbnNuLm9wZXJhbmRzWzBdID0gcF9pbnNuLm9wZXJhbmRzWzFdOwotICAgICAgcF9pbnNuLm9wZXJhbmRzWzFdID0gdGVtcF9udW07Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX09QRVJBTkRTOyBpKyspCi0JewotCSAgdGVtcF9vcCA9IHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1baV07Ci0JICBwX2luc24ub3BlcmFuZF90eXBlWzBdW2ldID0gcF9pbnNuLm9wZXJhbmRfdHlwZVsxXVtpXTsKLQkgIHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1baV0gPSB0ZW1wX29wOwotCX0KLSAgICB9Ci0gIGlmIChwX2luc24ub3BlcmFuZHNbMF0gIT0gcF9pbnNuLnRtLT5vcGVyYW5kc18xKQotICAgIHsKLSAgICAgIGFzX2JhZCAoImluY29ycmVjdCBudW1iZXIgb2Ygb3BlcmFuZHMgZ2l2ZW4gaW4gdGhlIGZpcnN0IGluc3RydWN0aW9uIik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChwX2luc24ub3BlcmFuZHNbMV0gIT0gcF9pbnNuLnRtLT5vcGVyYW5kc18yKQotICAgIHsKLSAgICAgIGFzX2JhZCAoImluY29ycmVjdCBudW1iZXIgb2Ygb3BlcmFuZHMgZ2l2ZW4gaW4gdGhlIHNlY29uZCBpbnN0cnVjdGlvbiIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBkZWJ1ZyAoIk51bWJlciBvZiBvcGVyYW5kcyBpbiBmaXJzdCBpbnNuOiAlZFxuIiwgcF9pbnNuLm9wZXJhbmRzWzBdKTsKLSAgZGVidWcgKCJOdW1iZXIgb2Ygb3BlcmFuZHMgaW4gc2Vjb25kIGluc246ICVkXG4iLCBwX2luc24ub3BlcmFuZHNbMV0pOwotICB7CQkJCS8qIE5vdyBjaGVjayBpZiBvcGVyYW5kcyBhcmUgY29ycmVjdCAqLwotICAgIGludCBjb3VudDsKLSAgICBpbnQgbnVtX3JuID0gMDsKLSAgICBpbnQgbnVtX2luZCA9IDA7Ci0gICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMjsgY291bnQrKykKLSAgICAgIHsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgcF9pbnNuLm9wZXJhbmRzW2NvdW50XTsgaSsrKQotCSAgewotCSAgICBpZiAoKHBfaW5zbi5vcGVyYW5kX3R5cGVbY291bnRdW2ldLT5vcF90eXBlICYKLQkJIHBfaW5zbi50bS0+b3BlcmFuZF90eXBlc1tjb3VudF1baV0pID09IDApCi0JICAgICAgewotCQlhc19iYWQgKCIlcyBpbnN0cnVjdGlvbiwgb3BlcmFuZCAlZCBkb2Vzbid0IG1hdGNoIiwgb3JkaW5hbF9uYW1lc1tjb3VudF0sIGkgKyAxKTsKLQkJcmV0dXJuIDE7Ci0JICAgICAgfQotCSAgICAvKiBHZXQgbnVtYmVyIG9mIFIgcmVnaXN0ZXIgYW5kIGluZGlyZWN0IHJlZmVyZW5jZSBjb250YWluZWQgd2l0aGluIHRoZSBmaXJzdAotCSAgICAgICB0d28gb3BlcmFuZHMgb2YgZWFjaCBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBtdWx0aXBseQotCSAgICAgICBwYXJhbGxlbCBpbnN0cnVjdGlvbnMgd2hpY2ggcmVxdWlyZSB0d28gUiByZWdpc3RlcnMgYW5kIHR3byBpbmRpcmVjdAotCSAgICAgICByZWZlcmVuY2VzLCBidXQgbm90IGluIGFueSBwYXJ0aWN1bGFyIHBsYWNlLiAqLwotCSAgICBpZiAoKHBfaW5zbi5vcGVyYW5kX3R5cGVbY291bnRdW2ldLT5vcF90eXBlICYgUm4pICYmIGkgPCAyKQotCSAgICAgIG51bV9ybisrOwotCSAgICBlbHNlIGlmICgocF9pbnNuLm9wZXJhbmRfdHlwZVtjb3VudF1baV0tPm9wX3R5cGUgJiBJbmRpcmVjdCkgJiYgaSA8IDIpCi0JICAgICAgbnVtX2luZCsrOwotCSAgfQotICAgICAgfQotICAgIGlmICgocF9pbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdWzBdICYgKEluZGlyZWN0IHwgUm4pKSA9PSAoSW5kaXJlY3QgfCBSbikpCi0gICAgICB7Ci0JLyogQ2hlY2sgZm9yIHRoZSBtdWx0aXBseSBpbnN0cnVjdGlvbnMgKi8KLQlpZiAobnVtX3JuICE9IDIpCi0JICB7Ci0JICAgIGFzX2JhZCAoImluY29ycmVjdCBmb3JtYXQgZm9yIG11bHRpcGx5IHBhcmFsbGVsIGluc3RydWN0aW9uIik7Ci0JICAgIHJldHVybiAxOwotCSAgfQotCWlmIChudW1faW5kICE9IDIpCi0JICB7CQkJLyogU2hvdWxkbid0IGdldCBoZXJlICovCi0JICAgIGFzX2JhZCAoImluY29ycmVjdCBmb3JtYXQgZm9yIG11bHRpcGx5IHBhcmFsbGVsIGluc3RydWN0aW9uIik7Ci0JICAgIHJldHVybiAxOwotCSAgfQotCWlmICgocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsyXS0+cmVnLm9wY29kZSAhPSAweDAwKSAmJgotCSAgICAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsyXS0+cmVnLm9wY29kZSAhPSAweDAxKSkKLQkgIHsKLQkgICAgYXNfYmFkICgiZGVzdGluYXRpb24gZm9yIG11bHRpcGx5IGNhbiBvbmx5IGJlIFIwIG9yIFIxIik7Ci0JICAgIHJldHVybiAxOwotCSAgfQotCWlmICgocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsyXS0+cmVnLm9wY29kZSAhPSAweDAyKSAmJgotCSAgICAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsyXS0+cmVnLm9wY29kZSAhPSAweDAzKSkKLQkgIHsKLQkgICAgYXNfYmFkICgiZGVzdGluYXRpb24gZm9yIGFkZC9zdWJ0cmFjdCBjYW4gb25seSBiZSBSMiBvciBSMyIpOwotCSAgICByZXR1cm4gMTsKLQkgIH0KLQkvKiBOb3cgZGV0ZXJtaW5lIHRoZSBQIGZpZWxkIGZvciB0aGUgaW5zdHJ1Y3Rpb24gKi8KLQlpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCSAgewotCSAgICBpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCSAgICAgIHBfaW5zbi5wX2ZpZWxkID0gMHgwMDAwMDAwMDsJLyogSW5kICogSW5kLCBSbiAgKy8tIFJuICAqLwotCSAgICBlbHNlIGlmIChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JICAgICAgcF9pbnNuLnBfZmllbGQgPSAweDAxMDAwMDAwOwkvKiBJbmQgKiBSbiwgIEluZCArLy0gUm4gICovCi0JICAgIGVsc2UKLQkgICAgICBwX2luc24ucF9maWVsZCA9IDB4MDMwMDAwMDA7CS8qIEluZCAqIFJuLCAgUm4gICsvLSBJbmQgKi8KLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGlmIChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5vcF90eXBlICYgUm4pCi0JICAgICAgcF9pbnNuLnBfZmllbGQgPSAweDAyMDAwMDAwOwkvKiBSbiAgKiBSbiwgIEluZCArLy0gSW5kICovCi0JICAgIGVsc2UgaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQkgICAgICB7Ci0JCW9wZXJhbmQgKnRlbXA7Ci0JCXBfaW5zbi5wX2ZpZWxkID0gMHgwMTAwMDAwMDsJLyogUm4gICogSW5kLCBJbmQgKy8tIFJuICAqLwotCQkvKiBOZWVkIHRvIHN3YXAgdGhlIHR3byBtdWx0aXBseSBvcGVyYW5kcyBhcm91bmQgc28gdGhhdCBldmVyeXRoaW5nIGlzIGluCi0JCSAgIGl0cyBwbGFjZSBmb3IgdGhlIG9wY29kZSBtYWtldXAgaWUgc28gSW5kICogUm4sIEluZCArLy0gUm4gKi8KLQkJdGVtcCA9IHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF07Ci0JCXBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0gPSBwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdOwotCQlwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdID0gdGVtcDsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW9wZXJhbmQgKnRlbXA7Ci0JCXBfaW5zbi5wX2ZpZWxkID0gMHgwMzAwMDAwMDsJLyogUm4gICogSW5kLCBSbiAgKy8tIEluZCAqLwotCQl0ZW1wID0gcF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXTsKLQkJcF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXSA9IHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV07Ci0JCXBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0gPSB0ZW1wOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgfQotICBkZWJ1ZyAoIlAgZmllbGQ6ICUwOFhcbiIsIHBfaW5zbi5wX2ZpZWxkKTsKLSAgLyogRmluYWxpc2Ugb3Bjb2RlLiAgVGhpcyBpcyBlYXNpZXIgZm9yIHBhcmFsbGVsIGluc3RydWN0aW9ucyBhcyB0aGV5IGhhdmUgdG8gYmUKLSAgICAgZnVsbHkgcmVzb2x2ZWQsIHRoZXJlIGFyZSBubyBtZW1vcnkgYWRkcmVzc2VzIGFsbG93ZWQsIGV4Y2VwdCB0aHJvdWdoIGluZGlyZWN0Ci0gICAgIGFkZHJlc3NpbmcsIHNvIHRoZXJlIGFyZSBubyBsYWJlbHMgdG8gcmVzb2x2ZS4gKi8KLSAgewotICAgIHBfaW5zbi5vcGNvZGUgPSBwX2luc24udG0tPmJhc2Vfb3Bjb2RlOwotICAgIHN3aXRjaCAocF9pbnNuLnRtLT5vcG9yZGVyKQotICAgICAgewotICAgICAgY2FzZSBPT180b3AxOgotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0LkFSbnVtKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5yZWcub3Bjb2RlIDw8IDIyKTsKLQlicmVhazsKLSAgICAgIGNhc2UgT09fNG9wMjoKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5BUm51bSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+cmVnLm9wY29kZSA8PCAxOSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSA8PCAyMik7Ci0JaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPnJlZy5vcGNvZGUgPT0gcF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSkKLQkgIGFzX3dhcm4gKCJsb2FkaW5nIHRoZSBzYW1lIHJlZ2lzdGVyIGluIHBhcmFsbGVsIG9wZXJhdGlvbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSBPT180b3AzOgotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPmluZGlyZWN0LkFSbnVtKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5yZWcub3Bjb2RlIDw8IDIyKTsKLQlicmVhazsKLSAgICAgIGNhc2UgT09fNW9wMToKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5BUm51bSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSA8PCAxOSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsyXS0+cmVnLm9wY29kZSA8PCAyMik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE9PXzVvcDI6Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+aW5kaXJlY3QuQVJudW0pOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPnJlZy5vcGNvZGUgPDwgMTkpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMl0tPnJlZy5vcGNvZGUgPDwgMjIpOwotCWJyZWFrOwotICAgICAgY2FzZSBPT19QRmllbGQ6Ci0JcF9pbnNuLm9wY29kZSB8PSBwX2luc24ucF9maWVsZDsKLQlpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsyXS0+cmVnLm9wY29kZSA9PSAweDAxKQotCSAgcF9pbnNuLm9wY29kZSB8PSAweDAwODAwMDAwOwotCWlmIChwX2luc24ub3BlcmFuZF90eXBlWzFdWzJdLT5yZWcub3Bjb2RlID09IDB4MDMpCi0JICBwX2luc24ub3Bjb2RlIHw9IDB4MDA0MDAwMDA7Ci0Jc3dpdGNoIChwX2luc24ucF9maWVsZCkKLQkgIHsKLQkgIGNhc2UgMHgwMDAwMDAwMDoKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+aW5kaXJlY3QuQVJudW0pOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+cmVnLm9wY29kZSA8PCAxOSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAweDAxMDAwMDAwOgotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5pbmRpcmVjdC5BUm51bSk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5yZWcub3Bjb2RlIDw8IDE5KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDB4MDIwMDAwMDA6Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0LkFSbnVtKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPnJlZy5vcGNvZGUgPDwgMTkpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMHgwMzAwMDAwMDoKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QuQVJudW0pOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSA8PCAxOSk7Ci0JICAgIGJyZWFrOwotCSAgfQotCWJyZWFrOwotICAgICAgfQotICB9CQkJCS8qIE9wY29kZSBpcyBmaW5hbGlzZWQgYXQgdGhpcyBwb2ludCBmb3IgYWxsIHBhcmFsbGVsIGluc3RydWN0aW9ucy4gKi8KLSAgewkJCQkvKiBPdXRwdXQgb3Bjb2RlICovCi0gICAgY2hhciAqcDsKLSAgICBwID0gZnJhZ19tb3JlIChJTlNOX1NJWkUpOwotICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgcF9pbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLSAgfQotICB7Ci0gICAgaW50IGksIGo7Ci0gICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICAgIGZvciAoaiA9IDA7IGogPCBwX2luc24ub3BlcmFuZHNbaV07IGorKykKLQlmcmVlIChwX2luc24ub3BlcmFuZF90eXBlW2ldW2pdKTsKLSAgfQotICBkZWJ1ZyAoIkZpbmFsIG9wY29kZTogJTA4WFxuIiwgcF9pbnNuLm9wY29kZSk7Ci0gIGRlYnVnICgiXG4iKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLW9wZXJhbmQgKgotdGljMzBfb3BlcmFuZCAodG9rZW4pCi0gICAgIGNoYXIgKnRva2VuOwotewotICBpbnQgY291bnQ7Ci0gIGNoYXIgaW5kX2J1ZmZlcltzdHJsZW4gKHRva2VuKV07Ci0gIG9wZXJhbmQgKmN1cnJlbnRfb3A7Ci0KLSAgZGVidWcgKCJJbiB0aWMzMF9vcGVyYW5kIHdpdGggJXNcbiIsIHRva2VuKTsKLSAgY3VycmVudF9vcCA9IChvcGVyYW5kICopIG1hbGxvYyAoc2l6ZW9mIChvcGVyYW5kKSk7Ci0gIG1lbXNldCAoY3VycmVudF9vcCwgJ1wwJywgc2l6ZW9mIChvcGVyYW5kKSk7Ci0gIGlmICgqdG9rZW4gPT0gRElSRUNUX1JFRkVSRU5DRSkKLSAgICB7Ci0gICAgICBjaGFyICp0b2tlbl9wb3NuID0gdG9rZW4gKyAxOwotICAgICAgaW50IGRpcmVjdF9sYWJlbCA9IDA7Ci0gICAgICBkZWJ1ZyAoIkZvdW5kIGRpcmVjdCByZWZlcmVuY2VcbiIpOwotICAgICAgd2hpbGUgKCp0b2tlbl9wb3NuKQotCXsKLQkgIGlmICghaXNfZGlnaXRfY2hhciAoKnRva2VuX3Bvc24pKQotCSAgICBkaXJlY3RfbGFiZWwgPSAxOwotCSAgdG9rZW5fcG9zbisrOwotCX0KLSAgICAgIGlmIChkaXJlY3RfbGFiZWwpCi0JewotCSAgY2hhciAqc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBzZWdUIHJldHZhbDsKLQkgIGRlYnVnICgiRGlyZWN0IHJlZmVyZW5jZSBpcyBhIGxhYmVsXG4iKTsKLQkgIGN1cnJlbnRfb3AtPmRpcmVjdC5sYWJlbCA9IHRva2VuICsgMTsKLQkgIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gdG9rZW4gKyAxOwotCSAgZGVidWcgKCJDdXJyZW50IGlucHV0X2xpbmVfcG9pbnRlcjogJXNcbiIsIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0JICByZXR2YWwgPSBleHByZXNzaW9uICgmY3VycmVudF9vcC0+ZGlyZWN0LmRpcmVjdF9leHByKTsKLQkgIGRlYnVnICgiRXhwcmVzc2lvbiB0eXBlOiAlZFxuIiwgY3VycmVudF9vcC0+ZGlyZWN0LmRpcmVjdF9leHByLlhfb3ApOwotCSAgZGVidWcgKCJFeHByZXNzaW9uIGFkZG51bTogJWRcbiIsIGN1cnJlbnRfb3AtPmRpcmVjdC5kaXJlY3RfZXhwci5YX2FkZF9udW1iZXIpOwotCSAgZGVidWcgKCJTZWdtZW50OiAlZFxuIiwgcmV0dmFsKTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaWYgKGN1cnJlbnRfb3AtPmRpcmVjdC5kaXJlY3RfZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBjdXJyZW50X29wLT5kaXJlY3QuYWRkcmVzcyA9IGN1cnJlbnRfb3AtPmRpcmVjdC5kaXJlY3RfZXhwci5YX2FkZF9udW1iZXI7Ci0JICAgICAgY3VycmVudF9vcC0+ZGlyZWN0LnJlc29sdmVkID0gMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkZWJ1ZyAoIkRpcmVjdCByZWZlcmVuY2UgaXMgYSBudW1iZXJcbiIpOwotCSAgY3VycmVudF9vcC0+ZGlyZWN0LmFkZHJlc3MgPSBhdG9pICh0b2tlbiArIDEpOwotCSAgY3VycmVudF9vcC0+ZGlyZWN0LnJlc29sdmVkID0gMTsKLQl9Ci0gICAgICBjdXJyZW50X29wLT5vcF90eXBlID0gRGlyZWN0OwotICAgIH0KLSAgZWxzZSBpZiAoKnRva2VuID09IElORElSRUNUX1JFRkVSRU5DRSkKLSAgICB7CQkJCS8qIEluZGlyZWN0IHJlZmVyZW5jZSBvcGVyYW5kICovCi0gICAgICBpbnQgZm91bmRfYXIgPSAwOwotICAgICAgaW50IGZvdW5kX2Rpc3AgPSAwOwotICAgICAgaW50IGFyX251bWJlciA9IC0xOwotICAgICAgaW50IGRpc3BfbnVtYmVyID0gMDsKLSAgICAgIGludCBidWZmZXJfcG9zbiA9IDE7Ci0gICAgICBpbmRfYWRkcl90eXBlICppbmRfYWRkcl9vcDsKLSAgICAgIGRlYnVnICgiRm91bmQgaW5kaXJlY3QgcmVmZXJlbmNlXG4iKTsKLSAgICAgIGluZF9idWZmZXJbMF0gPSAqdG9rZW47Ci0gICAgICBmb3IgKGNvdW50ID0gMTsgY291bnQgPCBzdHJsZW4gKHRva2VuKTsgY291bnQrKykKLQl7CQkJLyogU3RyaXAgb3BlcmFuZCAqLwotCSAgaW5kX2J1ZmZlcltidWZmZXJfcG9zbl0gPSB0b2xvd2VyICgqKHRva2VuICsgY291bnQpKTsKLQkgIGlmICgoKih0b2tlbiArIGNvdW50IC0gMSkgPT0gJ2EnIHx8ICoodG9rZW4gKyBjb3VudCAtIDEpID09ICdBJykgJiYKLQkgICAgICAoKih0b2tlbiArIGNvdW50KSA9PSAncicgfHwgKih0b2tlbiArIGNvdW50KSA9PSAnUicpKQotCSAgICB7Ci0JICAgICAgLyogQVIgcmVmZXJlbmNlIGlzIGZvdW5kLCBzbyBnZXQgaXRzIG51bWJlciBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGJ1ZmZlcgotCSAgICAgICAgIHNvIGl0IGNhbiBwYXNzIHRocm91Z2ggaGFzaF9maW5kKCkgKi8KLQkgICAgICBpZiAoZm91bmRfYXIpCi0JCXsKLQkJICBhc19iYWQgKCJNb3JlIHRoYW4gb25lIEFSIHJlZ2lzdGVyIGZvdW5kIGluIGluZGlyZWN0IHJlZmVyZW5jZSIpOwotCQkgIHJldHVybiBOVUxMOwotCQl9Ci0JICAgICAgaWYgKCoodG9rZW4gKyBjb3VudCArIDEpIDwgJzAnIHx8ICoodG9rZW4gKyBjb3VudCArIDEpID4gJzcnKQotCQl7Ci0JCSAgYXNfYmFkICgiSWxsZWdhbCBBUiByZWdpc3RlciBpbiBpbmRpcmVjdCByZWZlcmVuY2UiKTsKLQkJICByZXR1cm4gTlVMTDsKLQkJfQotCSAgICAgIGFyX251bWJlciA9ICoodG9rZW4gKyBjb3VudCArIDEpIC0gJzAnOwotCSAgICAgIGZvdW5kX2FyID0gMTsKLQkgICAgICBjb3VudCsrOwotCSAgICB9Ci0JICBpZiAoKih0b2tlbiArIGNvdW50KSA9PSAnKCcpCi0JICAgIHsKLQkgICAgICAvKiBQYXJlbnRoZXNpcyBmb3VuZCwgc28gY2hlY2sgaWYgYSBkaXNwbGFjZW1lbnQgdmFsdWUgaXMgaW5zaWRlLiAgSWYgc28sIGdldAotCSAgICAgICAgIHRoZSB2YWx1ZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGJ1ZmZlci4gKi8KLQkgICAgICBpZiAoaXNfZGlnaXRfY2hhciAoKih0b2tlbiArIGNvdW50ICsgMSkpKQotCQl7Ci0JCSAgY2hhciBkaXNwWzEwXTsKLQkJICBpbnQgZGlzcF9wb3NuID0gMDsKLQotCQkgIGlmIChmb3VuZF9kaXNwKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKCJNb3JlIHRoYW4gb25lIGRpc3BsYWNlbWVudCBmb3VuZCBpbiBpbmRpcmVjdCByZWZlcmVuY2UiKTsKLQkJICAgICAgcmV0dXJuIE5VTEw7Ci0JCSAgICB9Ci0JCSAgY291bnQrKzsKLQkJICB3aGlsZSAoKih0b2tlbiArIGNvdW50KSAhPSAnKScpCi0JCSAgICB7Ci0JCSAgICAgIGlmICghaXNfZGlnaXRfY2hhciAoKih0b2tlbiArIGNvdW50KSkpCi0JCQl7Ci0JCQkgIGFzX2JhZCAoIkludmFsaWQgZGlzcGxhY2VtZW50IGluIGluZGlyZWN0IHJlZmVyZW5jZSIpOwotCQkJICByZXR1cm4gTlVMTDsKLQkJCX0KLQkJICAgICAgZGlzcFtkaXNwX3Bvc24rK10gPSAqKHRva2VuICsgKGNvdW50KyspKTsKLQkJICAgIH0KLQkJICBkaXNwW2Rpc3BfcG9zbl0gPSAnXDAnOwotCQkgIGRpc3BfbnVtYmVyID0gYXRvaSAoZGlzcCk7Ci0JCSAgY291bnQtLTsKLQkJICBmb3VuZF9kaXNwID0gMTsKLQkJfQotCSAgICB9Ci0JICBidWZmZXJfcG9zbisrOwotCX0KLSAgICAgIGluZF9idWZmZXJbYnVmZmVyX3Bvc25dID0gJ1wwJzsKLSAgICAgIGlmICghZm91bmRfYXIpCi0JewotCSAgYXNfYmFkICgiQVIgcmVnaXN0ZXIgbm90IGZvdW5kIGluIGluZGlyZWN0IHJlZmVyZW5jZSIpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgaW5kX2FkZHJfb3AgPSAoaW5kX2FkZHJfdHlwZSAqKSBoYXNoX2ZpbmQgKGluZF9oYXNoLCBpbmRfYnVmZmVyKTsKLSAgICAgIGlmIChpbmRfYWRkcl9vcCkKLQl7Ci0JICBkZWJ1ZyAoIkZvdW5kIGluZGlyZWN0IHJlZmVyZW5jZTogJXNcbiIsIGluZF9hZGRyX29wLT5zeW50YXgpOwotCSAgaWYgKGluZF9hZGRyX29wLT5kaXNwbGFjZW1lbnQgPT0gSU1QTElFRF9ESVNQKQotCSAgICB7Ci0JICAgICAgZm91bmRfZGlzcCA9IDE7Ci0JICAgICAgZGlzcF9udW1iZXIgPSAxOwotCSAgICB9Ci0JICBlbHNlIGlmICgoaW5kX2FkZHJfb3AtPmRpc3BsYWNlbWVudCA9PSBESVNQX1JFUVVJUkVEKSAmJiAhZm91bmRfZGlzcCkKLQkgICAgewotCSAgICAgIC8qIE1heWJlIGFuIGltcGxpZWQgZGlzcGxhY2VtZW50IG9mIDEgYWdhaW4gKi8KLQkgICAgICBhc19iYWQgKCJyZXF1aXJlZCBkaXNwbGFjZW1lbnQgd2Fzbid0IGdpdmVuIGluIGluZGlyZWN0IHJlZmVyZW5jZSIpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoImlsbGVnYWwgaW5kaXJlY3QgcmVmZXJlbmNlIik7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBpZiAoZm91bmRfZGlzcCAmJiAoZGlzcF9udW1iZXIgPCAwIHx8IGRpc3BfbnVtYmVyID4gMjU1KSkKLQl7Ci0JICBhc19iYWQgKCJkaXNwbGFjZW1lbnQgbXVzdCBiZSBhbiB1bnNpZ25lZCA4LWJpdCBudW1iZXIiKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIGN1cnJlbnRfb3AtPmluZGlyZWN0Lm1vZCA9IGluZF9hZGRyX29wLT5tb2RmaWVsZDsKLSAgICAgIGN1cnJlbnRfb3AtPmluZGlyZWN0LmRpc3AgPSBkaXNwX251bWJlcjsKLSAgICAgIGN1cnJlbnRfb3AtPmluZGlyZWN0LkFSbnVtID0gYXJfbnVtYmVyOwotICAgICAgY3VycmVudF9vcC0+b3BfdHlwZSA9IEluZGlyZWN0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlZyAqcmVnb3AgPSAocmVnICopIGhhc2hfZmluZCAocmVnX2hhc2gsIHRva2VuKTsKLSAgICAgIGlmIChyZWdvcCkKLQl7Ci0JICBkZWJ1ZyAoIkZvdW5kIHJlZ2lzdGVyIG9wZXJhbmQ6ICVzXG4iLCByZWdvcC0+bmFtZSk7Ci0JICBpZiAocmVnb3AtPnJlZ3R5cGUgPT0gUkVHX0FSbikKLQkgICAgY3VycmVudF9vcC0+b3BfdHlwZSA9IEFSbjsKLQkgIGVsc2UgaWYgKHJlZ29wLT5yZWd0eXBlID09IFJFR19SbikKLQkgICAgY3VycmVudF9vcC0+b3BfdHlwZSA9IFJuOwotCSAgZWxzZSBpZiAocmVnb3AtPnJlZ3R5cGUgPT0gUkVHX0RQKQotCSAgICBjdXJyZW50X29wLT5vcF90eXBlID0gRFBSZWc7Ci0JICBlbHNlCi0JICAgIGN1cnJlbnRfb3AtPm9wX3R5cGUgPSBPdGhlclJlZzsKLQkgIGN1cnJlbnRfb3AtPnJlZy5vcGNvZGUgPSByZWdvcC0+b3Bjb2RlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoIWlzX2RpZ2l0X2NoYXIgKCp0b2tlbikgfHwgKih0b2tlbiArIDEpID09ICd4JyB8fCBzdHJjaHIgKHRva2VuLCAnaCcpKQotCSAgICB7Ci0JICAgICAgY2hhciAqc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgc2VnVCByZXR2YWw7Ci0JICAgICAgZGVidWcgKCJQcm9iYWJseSBhIGxhYmVsOiAlc1xuIiwgdG9rZW4pOwotCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbCA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuICh0b2tlbikgKyAxKTsKLQkgICAgICBzdHJjcHkgKGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbCwgdG9rZW4pOwotCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbFtzdHJsZW4gKHRva2VuKV0gPSAnXDAnOwotCSAgICAgIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHRva2VuOwotCSAgICAgIGRlYnVnICgiQ3VycmVudCBpbnB1dF9saW5lX3BvaW50ZXI6ICVzXG4iLCBpbnB1dF9saW5lX3BvaW50ZXIpOwotCSAgICAgIHJldHZhbCA9IGV4cHJlc3Npb24gKCZjdXJyZW50X29wLT5pbW1lZGlhdGUuaW1tX2V4cHIpOwotCSAgICAgIGRlYnVnICgiRXhwcmVzc2lvbiB0eXBlOiAlZFxuIiwgY3VycmVudF9vcC0+aW1tZWRpYXRlLmltbV9leHByLlhfb3ApOwotCSAgICAgIGRlYnVnICgiRXhwcmVzc2lvbiBhZGRudW06ICVkXG4iLCBjdXJyZW50X29wLT5pbW1lZGlhdGUuaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkgICAgICBkZWJ1ZyAoIlNlZ21lbnQ6ICVkXG4iLCByZXR2YWwpOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGlmIChjdXJyZW50X29wLT5pbW1lZGlhdGUuaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCQl7Ci0JCSAgY3VycmVudF9vcC0+aW1tZWRpYXRlLnNfbnVtYmVyID0gY3VycmVudF9vcC0+aW1tZWRpYXRlLmltbV9leHByLlhfYWRkX251bWJlcjsKLQkJICBjdXJyZW50X29wLT5pbW1lZGlhdGUudV9udW1iZXIgPSAodW5zaWduZWQgaW50KSBjdXJyZW50X29wLT5pbW1lZGlhdGUuaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotCQkgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5yZXNvbHZlZCA9IDE7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY291bnQ7Ci0JICAgICAgZGVidWcgKCJGb3VuZCBhIG51bWJlciBvciBkaXNwbGFjZW1lbnRcbiIpOwotCSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHN0cmxlbiAodG9rZW4pOyBjb3VudCsrKQotCQlpZiAoKih0b2tlbiArIGNvdW50KSA9PSAnLicpCi0JCSAgY3VycmVudF9vcC0+aW1tZWRpYXRlLmRlY2ltYWxfZm91bmQgPSAxOwotCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbCA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuICh0b2tlbikgKyAxKTsKLQkgICAgICBzdHJjcHkgKGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbCwgdG9rZW4pOwotCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbFtzdHJsZW4gKHRva2VuKV0gPSAnXDAnOwotCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5mX251bWJlciA9IChmbG9hdCkgYXRvZiAodG9rZW4pOwotCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5zX251bWJlciA9IChpbnQpIGF0b2kgKHRva2VuKTsKLQkgICAgICBjdXJyZW50X29wLT5pbW1lZGlhdGUudV9udW1iZXIgPSAodW5zaWduZWQgaW50KSBhdG9pICh0b2tlbik7Ci0JICAgICAgY3VycmVudF9vcC0+aW1tZWRpYXRlLnJlc29sdmVkID0gMTsKLQkgICAgfQotCSAgY3VycmVudF9vcC0+b3BfdHlwZSA9IERpc3AgfCBBYnMyNCB8IEltbTE2IHwgSW1tMjQ7Ci0JICBpZiAoY3VycmVudF9vcC0+aW1tZWRpYXRlLnVfbnVtYmVyID49IDAgJiYgY3VycmVudF9vcC0+aW1tZWRpYXRlLnVfbnVtYmVyIDw9IDMxKQotCSAgICBjdXJyZW50X29wLT5vcF90eXBlIHw9IElWZWN0b3I7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGN1cnJlbnRfb3A7Ci19Ci0KLS8qIG5leHRfbGluZSBwb2ludHMgdG8gdGhlIG5leHQgbGluZSBhZnRlciB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiAoY3VycmVudF9saW5lKS4KLSAgIFNlYXJjaCBmb3IgdGhlIHBhcmFsbGVsIGJhcnMsIGFuZCBpZiBmb3VuZCwgbWVyZ2UgdHdvIGxpbmVzIGludG8gaW50ZXJuYWwgc3ludGF4Ci0gICBmb3IgYSBwYXJhbGxlbCBpbnN0cnVjdGlvbjoKLSAgIHFfW0lOU04xXV9bSU5TTjJdIFtPUEVSQU5EUzFdIHwgW09QRVJBTkRTMl0KLSAgIEJ5IHRoaXMgc3RhZ2UsIGFsbCBjb21tZW50cyBhcmUgc2NydWJiZWQsIGFuZCBvbmx5IHRoZSBiYXJlIGxpbmVzIGFyZSBnaXZlbi4KLSAqLwotCi0jZGVmaW5lIE5PTkUgICAgICAgICAgIDAKLSNkZWZpbmUgU1RBUlRfT1BDT0RFICAgMQotI2RlZmluZSBFTkRfT1BDT0RFICAgICAyCi0jZGVmaW5lIFNUQVJUX09QRVJBTkRTIDMKLSNkZWZpbmUgRU5EX09QRVJBTkRTICAgNAotCi1jaGFyICoKLXRpYzMwX2ZpbmRfcGFyYWxsZWxfaW5zbiAoY3VycmVudF9saW5lLCBuZXh0X2xpbmUpCi0gICAgIGNoYXIgKmN1cnJlbnRfbGluZTsKLSAgICAgY2hhciAqbmV4dF9saW5lOwotewotICBpbnQgZm91bmRfcGFyYWxsZWwgPSAwOwotICBjaGFyIGZpcnN0X29wY29kZVsyNTZdOwotICBjaGFyIHNlY29uZF9vcGNvZGVbMjU2XTsKLSAgY2hhciBmaXJzdF9vcGVyYW5kc1syNTZdOwotICBjaGFyIHNlY29uZF9vcGVyYW5kc1syNTZdOwotICBjaGFyICpwYXJhbGxlbF9pbnNuOwotCi0gIGRlYnVnICgiSW4gdGljMzBfZmluZF9wYXJhbGxlbF9pbnNuKClcbiIpOwotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyhpbnQpICpuZXh0X2xpbmVdKQotICAgIHsKLSAgICAgIGlmICgqbmV4dF9saW5lID09IFBBUkFMTEVMX1NFUEFSQVRPUiAmJiAqKG5leHRfbGluZSArIDEpID09IFBBUkFMTEVMX1NFUEFSQVRPUikKLQl7Ci0JICBmb3VuZF9wYXJhbGxlbCA9IDE7Ci0JICBuZXh0X2xpbmUrKzsKLQkgIGJyZWFrOwotCX0KLSAgICAgIG5leHRfbGluZSsrOwotICAgIH0KLSAgaWYgKCFmb3VuZF9wYXJhbGxlbCkKLSAgICByZXR1cm4gTlVMTDsKLSAgZGVidWcgKCJGb3VuZCBhIHBhcmFsbGVsIGluc3RydWN0aW9uXG4iKTsKLSAgewotICAgIGludCBpOwotICAgIGNoYXIgKm9wY29kZSwgKm9wZXJhbmRzLCAqbGluZTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgICB7Ci0JaWYgKGkgPT0gMCkKLQkgIHsKLQkgICAgb3Bjb2RlID0gJmZpcnN0X29wY29kZVswXTsKLQkgICAgb3BlcmFuZHMgPSAmZmlyc3Rfb3BlcmFuZHNbMF07Ci0JICAgIGxpbmUgPSBjdXJyZW50X2xpbmU7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBvcGNvZGUgPSAmc2Vjb25kX29wY29kZVswXTsKLQkgICAgb3BlcmFuZHMgPSAmc2Vjb25kX29wZXJhbmRzWzBdOwotCSAgICBsaW5lID0gbmV4dF9saW5lOwotCSAgfQotCXsKLQkgIGludCBzZWFyY2hfc3RhdHVzID0gTk9ORTsKLQkgIGludCBjaGFyX3B0ciA9IDA7Ci0JICBjaGFyIGM7Ci0KLQkgIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKGludCkgKGMgPSAqbGluZSldICYmICpsaW5lKQotCSAgICB7Ci0JICAgICAgaWYgKGlzX29wY29kZV9jaGFyIChjKSAmJiBzZWFyY2hfc3RhdHVzID09IE5PTkUpCi0JCXsKLQkJICBvcGNvZGVbY2hhcl9wdHIrK10gPSB0b2xvd2VyIChjKTsKLQkJICBzZWFyY2hfc3RhdHVzID0gU1RBUlRfT1BDT0RFOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaXNfb3Bjb2RlX2NoYXIgKGMpICYmIHNlYXJjaF9zdGF0dXMgPT0gU1RBUlRfT1BDT0RFKQotCQl7Ci0JCSAgb3Bjb2RlW2NoYXJfcHRyKytdID0gdG9sb3dlciAoYyk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICghaXNfb3Bjb2RlX2NoYXIgKGMpICYmIHNlYXJjaF9zdGF0dXMgPT0gU1RBUlRfT1BDT0RFKQotCQl7Ci0JCSAgb3Bjb2RlW2NoYXJfcHRyXSA9ICdcMCc7Ci0JCSAgY2hhcl9wdHIgPSAwOwotCQkgIHNlYXJjaF9zdGF0dXMgPSBFTkRfT1BDT0RFOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaXNfb3BlcmFuZF9jaGFyIChjKSAmJiBzZWFyY2hfc3RhdHVzID09IFNUQVJUX09QRVJBTkRTKQotCQl7Ci0JCSAgb3BlcmFuZHNbY2hhcl9wdHIrK10gPSBjOwotCQl9Ci0JICAgICAgaWYgKGlzX29wZXJhbmRfY2hhciAoYykgJiYgc2VhcmNoX3N0YXR1cyA9PSBFTkRfT1BDT0RFKQotCQl7Ci0JCSAgb3BlcmFuZHNbY2hhcl9wdHIrK10gPSBjOwotCQkgIHNlYXJjaF9zdGF0dXMgPSBTVEFSVF9PUEVSQU5EUzsKLQkJfQotCSAgICAgIGxpbmUrKzsKLQkgICAgfQotCSAgaWYgKHNlYXJjaF9zdGF0dXMgIT0gU1RBUlRfT1BFUkFORFMpCi0JICAgIHJldHVybiBOVUxMOwotCSAgb3BlcmFuZHNbY2hhcl9wdHJdID0gJ1wwJzsKLQl9Ci0gICAgICB9Ci0gIH0KLSAgcGFyYWxsZWxfaW5zbiA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuIChmaXJzdF9vcGNvZGUpICsgc3RybGVuIChmaXJzdF9vcGVyYW5kcykgKwotCQkgICAgIHN0cmxlbiAoc2Vjb25kX29wY29kZSkgKyBzdHJsZW4gKHNlY29uZF9vcGVyYW5kcykgKyA4KTsKLSAgc3ByaW50ZiAocGFyYWxsZWxfaW5zbiwgInFfJXNfJXMgJXMgfCAlcyIsIGZpcnN0X29wY29kZSwgc2Vjb25kX29wY29kZSwgZmlyc3Rfb3BlcmFuZHMsIHNlY29uZF9vcGVyYW5kcyk7Ci0gIGRlYnVnICgicGFyYWxsZWwgaW5zbiA9ICVzXG4iLCBwYXJhbGxlbF9pbnNuKTsKLSAgcmV0dXJuIHBhcmFsbGVsX2luc247Ci19Ci0KLSN1bmRlZiBOT05FCi0jdW5kZWYgU1RBUlRfT1BDT0RFCi0jdW5kZWYgRU5EX09QQ09ERQotI3VuZGVmIFNUQVJUX09QRVJBTkRTCi0jdW5kZWYgRU5EX09QRVJBTkRTCi0KLS8qIEluIG9yZGVyIHRvIGdldCBnYXMgdG8gaWdub3JlIGFueSB8IGNoYXJzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUsCi0gICB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBhIHwgaXMgZm91bmQgaW4gYSBsaW5lLiAqLwotCi1pbnQKLXRpYzMwX3VucmVjb2duaXplZF9saW5lIChjKQotICAgICBpbnQgYzsKLXsKLSAgZGVidWcgKCJJbiB0Y191bnJlY29nbml6ZWRfbGluZVxuIik7Ci0gIHJldHVybiAoYyA9PSBQQVJBTExFTF9TRVBBUkFUT1IpOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKLSAgICAgZnJhZ1MgKmZyYWdQOwotICAgICBzZWdUIHNlZ21lbnQ7Ci17Ci0gIGRlYnVnICgiSW4gbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKVxuIik7Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLXsKLSAgZGVidWcgKCJJbiBtZF9jb252ZXJ0X2ZyYWcoKVxuIik7Ci19Ci0KLWludAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWxQKQotICAgICBmaXhTICpmaXhQOwotICAgICB2YWx1ZVQgKnZhbFA7Ci17Ci0gIHZhbHVlVCB2YWx1ZSA9ICp2YWxQOwotCi0gIGRlYnVnICgiSW4gbWRfYXBwbHlfZml4KCkgd2l0aCB2YWx1ZSA9ICVsZFxuIiwgKGxvbmcpIHZhbHVlKTsKLSAgZGVidWcgKCJWYWx1ZXMgaW4gZml4UFxuIik7Ci0gIGRlYnVnICgiZnhfc2l6ZSA9ICVkXG4iLCBmaXhQLT5meF9zaXplKTsKLSAgZGVidWcgKCJmeF9wY3JlbCA9ICVkXG4iLCBmaXhQLT5meF9wY3JlbCk7Ci0gIGRlYnVnICgiZnhfd2hlcmUgPSAlZFxuIiwgZml4UC0+Znhfd2hlcmUpOwotICBkZWJ1ZyAoImZ4X29mZnNldCA9ICVkXG4iLCAoaW50KSBmaXhQLT5meF9vZmZzZXQpOwotICB7Ci0gICAgY2hhciAqYnVmID0gZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOwotICAgIHZhbHVlIC89IElOU05fU0laRTsKLSAgICBpZiAoZml4UC0+Znhfc2l6ZSA9PSAxKQotICAgICAgewkJCQkvKiBTcGVjaWFsIGZpeCBmb3IgTERQIGluc3RydWN0aW9uLiAqLwotCXZhbHVlID0gKHZhbHVlICYgMHgwMEZGMDAwMCkgPj4gMTY7Ci0gICAgICB9Ci0gICAgZGVidWcgKCJuZXcgdmFsdWUgPSAlbGRcbiIsIChsb25nKSB2YWx1ZSk7Ci0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCBmaXhQLT5meF9zaXplKTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgaW50IGk7Ci0KLSAgZGVidWcgKCJJbiBtZF9wYXJzZV9vcHRpb24oKVxuIik7Ci0gIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0gICAgewotICAgICAgcHJpbnRmICgiJWNcbiIsIGFyZ1tjXSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGRlYnVnICgiSW4gbWRfc2hvd191c2FnZSgpXG4iKTsKLX0KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBkZWJ1ZyAoIkluIG1kX3VuZGVmaW5lZF9zeW1ib2woKVxuIik7Ci0gIHJldHVybiAoc3ltYm9sUyAqKSAwOwotfQotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIGRlYnVnICgiSW4gbWRfc2VjdGlvbl9hbGlnbigpIHNlZ21lbnQgPSAlZCBhbmQgc2l6ZSA9ICVkXG4iLCBzZWdtZW50LCBzaXplKTsKLSAgc2l6ZSA9IChzaXplICsgMykgLyA0OwotICBzaXplICo9IDQ7Ci0gIGRlYnVnICgiTmV3IHNpemUgdmFsdWUgPSAlZFxuIiwgc2l6ZSk7Ci0gIHJldHVybiBzaXplOwotfQotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBpbnQgb2Zmc2V0OwotCi0gIGRlYnVnICgiSW4gbWRfcGNyZWxfZnJvbSgpXG4iKTsKLSAgZGVidWcgKCJmeF93aGVyZSA9ICVkXG4iLCBmaXhQLT5meF93aGVyZSk7Ci0gIGRlYnVnICgiZnhfc2l6ZSA9ICVkXG4iLCBmaXhQLT5meF9zaXplKTsKLSAgLyogRmluZCB0aGUgb3Bjb2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBpbiB0aGUgZnJfbGl0ZXJhbAotICAgICBzdG9yYWdlIGFyZWEsIGFuZCBjaGVjayBiaXQgMjEuICBCaXQgMjEgY29udGFpbnMgd2hldGhlciB0aGUgY3VycmVudCBpbnN0cnVjdGlvbgotICAgICBpcyBhIGRlbGF5ZWQgb25lIG9yIG5vdCwgYW5kIHRoZW4gc2V0IHRoZSBvZmZzZXQgdmFsdWUgYXBwcm9wcmlhdGVseS4gKi8KLSAgaWYgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWxbZml4UC0+Znhfd2hlcmUgLSBmaXhQLT5meF9zaXplICsgMV0gJiAweDIwKQotICAgIG9mZnNldCA9IDM7Ci0gIGVsc2UKLSAgICBvZmZzZXQgPSAxOwotICBkZWJ1ZyAoIm9mZnNldCA9ICVkXG4iLCBvZmZzZXQpOwotICAvKiBQQyBSZWxhdGl2ZSBpbnN0cnVjdGlvbnMgaGF2ZSBhIGZvcm1hdDoKLSAgICAgZGlzcGxhY2VtZW50ID0gTGFiZWwgLSAoUEMgKyBvZmZzZXQpCi0gICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBQQyArIG9mZnNldCB3aGVyZToKLSAgICAgZnhfd2hlcmUgLSBmeF9zaXplID0gUEMKLSAgICAgSU5TTl9TSVpFICogb2Zmc2V0ID0gb2Zmc2V0IG51bWJlciBvZiBpbnN0cnVjdGlvbnMKLSAgICovCi0gIHJldHVybiBmaXhQLT5meF93aGVyZSAtIGZpeFAtPmZ4X3NpemUgKyAoSU5TTl9TSVpFICogb2Zmc2V0KTsKLX0KLQotY2hhciAqCi1tZF9hdG9mICh3aGF0X3N0YXRlbWVudF90eXBlLCBsaXRlcmFsUCwgc2l6ZVApCi0gICAgIGludCB3aGF0X3N0YXRlbWVudF90eXBlOwotICAgICBjaGFyICpsaXRlcmFsUDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIGNoYXIgKnRva2VuOwotICBjaGFyIGtlZXB2YWw7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gIC8qICBjaGFyICphdG9mX2llZWUgKCk7ICovCi0gIGZsb2F0IGZsb2F0X3ZhbHVlOwotICBkZWJ1ZyAoIkluIG1kX2F0b2YoKVxuIik7Ci0gIGRlYnVnICgicHJlY2lzaW9uID0gJWNcbiIsIHdoYXRfc3RhdGVtZW50X3R5cGUpOwotICBkZWJ1ZyAoImxpdGVyYWwgPSAlc1xuIiwgbGl0ZXJhbFApOwotICBkZWJ1ZyAoImxpbmUgPSAiKTsKLSAgdG9rZW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkKSAqaW5wdXRfbGluZV9wb2ludGVyXSAmJiAoKmlucHV0X2xpbmVfcG9pbnRlcikgJiYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKSkKLSAgICB7Ci0gICAgICBkZWJ1ZyAoIiVjIiwgKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gIGtlZXB2YWwgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLSAgZGVidWcgKCJcbiIpOwotICBmbG9hdF92YWx1ZSA9IChmbG9hdCkgYXRvZiAodG9rZW4pOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0ga2VlcHZhbDsKLSAgZGVidWcgKCJmbG9hdF92YWx1ZSA9ICVmXG4iLCBmbG9hdF92YWx1ZSk7Ci0gIHN3aXRjaCAod2hhdF9zdGF0ZW1lbnRfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSI7Ci0gICAgfQotICBpZiAoZmxvYXRfdmFsdWUgPT0gMC4wKQotICAgIHsKLSAgICAgIHZhbHVlID0gKHByZWMgPT0gMikgPyAweDAwMDA4MDAwTCA6IDB4ODAwMDAwMDBMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZXhwLCBzaWduLCBtYW50LCB0bXNmbG9hdDsKLSAgICAgIHRtc2Zsb2F0ID0gKigobG9uZyAqKSAmZmxvYXRfdmFsdWUpOwotICAgICAgc2lnbiA9IHRtc2Zsb2F0ICYgMHg4MDAwMDAwMDsKLSAgICAgIG1hbnQgPSB0bXNmbG9hdCAmIDB4MDA3RkZGRkY7Ci0gICAgICBleHAgPSB0bXNmbG9hdCAmIDB4N0Y4MDAwMDA7Ci0gICAgICBleHAgPDw9IDE7Ci0gICAgICBpZiAoZXhwID09IDB4RkYwMDAwMDApCi0JewotCSAgaWYgKG1hbnQgPT0gMCkKLQkgICAgdmFsdWUgPSAweDdGN0ZGRkZGOwotCSAgZWxzZSBpZiAoc2lnbiA9PSAwKQotCSAgICB2YWx1ZSA9IDB4N0Y3RkZGRkY7Ci0JICBlbHNlCi0JICAgIHZhbHVlID0gMHg3RjgwMDAwMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXhwIC09IDB4N0YwMDAwMDA7Ci0JICBpZiAoc2lnbikKLQkgICAgewotCSAgICAgIG1hbnQgPSBtYW50ICYgMHgwMDdGRkZGRjsKLQkgICAgICBtYW50ID0gLW1hbnQ7Ci0JICAgICAgbWFudCA9IG1hbnQgJiAweDAwRkZGRkZGOwotCSAgICAgIGlmIChtYW50ID09IDApCi0JCXsKLQkJICBtYW50IHw9IDB4MDA4MDAwMDA7Ci0JCSAgZXhwID0gKGxvbmcpIGV4cCAtIDB4MDEwMDAwMDA7Ci0JCX0KLQkgICAgfQotCSAgdG1zZmxvYXQgPSBleHAgfCBtYW50OwotCSAgdmFsdWUgPSB0bXNmbG9hdDsKLQl9Ci0gICAgICBpZiAocHJlYyA9PSAyKQotCXsKLQkgIGxvbmcgZXhwLCBtYW50OwotCi0JICBpZiAodG1zZmxvYXQgPT0gMHg4MDAwMDAwMCkKLQkgICAgewotCSAgICAgIHZhbHVlID0gMHg4MDAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9IDA7Ci0JICAgICAgZXhwID0gKHRtc2Zsb2F0ICYgMHhGRjAwMDAwMCk7Ci0JICAgICAgZXhwID4+PSAyNDsKLQkgICAgICBtYW50ID0gdG1zZmxvYXQgJiAweDAwN0ZGRkZGOwotCSAgICAgIGlmICh0bXNmbG9hdCAmIDB4MDA4MDAwMDApCi0JCXsKLQkJICBtYW50IHw9IDB4RkYwMDAwMDA7Ci0JCSAgbWFudCArPSAweDAwMDAwODAwOwotCQkgIG1hbnQgPj49IDEyOwotCQkgIG1hbnQgfD0gMHgwMDAwMDgwMDsKLQkJICBtYW50ICY9IDB4MEZGRjsKLQkJICBpZiAoZXhwID4gNykKLQkJICAgIHZhbHVlID0gMHg3ODAwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbWFudCB8PSAweDAwODAwMDAwOwotCQkgIG1hbnQgKz0gMHgwMDAwMDgwMDsKLQkJICBleHAgKz0gKG1hbnQgPj4gMjQpOwotCQkgIG1hbnQgPj49IDEyOwotCQkgIG1hbnQgJj0gMHgwN0ZGOwotCQkgIGlmIChleHAgPiA3KQotCQkgICAgdmFsdWUgPSAweDc3RkY7Ci0JCX0KLQkgICAgICBpZiAoZXhwIDwgLTgpCi0JCXZhbHVlID0gMHg4MDAwOwotCSAgICAgIGlmICh2YWx1ZSA9PSAwKQotCQl7Ci0JCSAgbWFudCA9IChleHAgPDwgMTIpIHwgbWFudDsKLQkJICB2YWx1ZSA9IG1hbnQgJiAweEZGRkY7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIG1kX251bWJlcl90b19jaGFycyAobGl0ZXJhbFAsIHZhbHVlLCBwcmVjKTsKLSAgKnNpemVQID0gcHJlYzsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIGRlYnVnICgiSW4gbWRfbnVtYmVyX3RvX2NoYXJzKClcbiIpOwotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci0gIC8qICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuKGJ1Zix2YWwsbik7ICovCi19Ci0KLSNkZWZpbmUgRihTWixQQ1JFTCkJCSgoKFNaKSA8PCAxKSArIChQQ1JFTCkpCi0jZGVmaW5lIE1BUChTWixQQ1JFTCxUWVBFKQljYXNlIEYoU1osUENSRUwpOiBjb2RlID0gKFRZUEUpOyBicmVhawotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4UCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGFyZWxlbnQgKnJlbDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUgPSAwOwotCi0gIGRlYnVnICgiSW4gdGNfZ2VuX3JlbG9jKClcbiIpOwotICBkZWJ1ZyAoImZpeFAuc2l6ZSA9ICVkXG4iLCBmaXhQLT5meF9zaXplKTsKLSAgZGVidWcgKCJmaXhQLnBjcmVsID0gJWRcbiIsIGZpeFAtPmZ4X3BjcmVsKTsKLSAgZGVidWcgKCJhZGRzeS5uYW1lID0gJXNcbiIsIFNfR0VUX05BTUUgKGZpeFAtPmZ4X2FkZHN5KSk7Ci0gIHN3aXRjaCAoRiAoZml4UC0+Znhfc2l6ZSwgZml4UC0+ZnhfcGNyZWwpKQotICAgIHsKLSAgICAgIE1BUCAoMSwgMCwgQkZEX1JFTE9DX1RJQzMwX0xEUCk7Ci0gICAgICBNQVAgKDIsIDAsIEJGRF9SRUxPQ18xNik7Ci0gICAgICBNQVAgKDMsIDAsIEJGRF9SRUxPQ18yNCk7Ci0gICAgICBNQVAgKDIsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBNQVAgKDQsIDAsIEJGRF9SRUxPQ18zMik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoIkNhbiBub3QgZG8gJWQgYnl0ZSAlc3JlbG9jYXRpb24iLCBmaXhQLT5meF9zaXplLAotCSAgICAgIGZpeFAtPmZ4X3BjcmVsID8gInBjLXJlbGF0aXZlICIgOiAiIik7Ci0gICAgfQotI3VuZGVmIE1BUAotI3VuZGVmIEYKLQotICByZWwgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgYXNzZXJ0IChyZWwgIT0gMCk7Ci0gIHJlbC0+c3ltX3B0cl9wdHIgPSAmZml4UC0+ZnhfYWRkc3ktPmJzeW07Ci0gIHJlbC0+YWRkcmVzcyA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZTsKLSAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotICAgIHJlbC0+YWRkZW5kID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlCi0gICAgcmVsLT5hZGRlbmQgPSAwOwotICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICBpZiAoIXJlbC0+aG93dG8pCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIG5hbWUgPSBTX0dFVF9OQU1FIChmaXhQLT5meF9hZGRzeSk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCW5hbWUgPSAiPHVua25vd24+IjsKLSAgICAgIGFzX2ZhdGFsICgiQ2Fubm90IGdlbmVyYXRlIHJlbG9jYXRpb24gdHlwZSBmb3Igc3ltYm9sICVzLCBjb2RlICVzIiwgbmFtZSwgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLSAgICB9Ci0gIHJldHVybiByZWw7Ci19Ci0KLXZvaWQKLXRjX2FvdXRfcHJlX3dyaXRlX2hvb2sgKCkKLXsKLSAgZGVidWcgKCJJbiB0Y19hb3V0X3ByZV93cml0ZV9ob29rKClcbiIpOwotfQotCi12b2lkCi1tZF9vcGVyYW5kIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBkZWJ1ZyAoIkluIG1kX29wZXJhbmQoKVxuIik7Ci19Ci0KLWNoYXIgb3V0cHV0X2ludmFsaWRfYnVmWzhdOwotCi1jaGFyICoKLW91dHB1dF9pbnZhbGlkIChjKQotICAgICBjaGFyIGM7Ci17Ci0gIGlmIChpc3ByaW50IChjKSkKLSAgICBzcHJpbnRmIChvdXRwdXRfaW52YWxpZF9idWYsICInJWMnIiwgYyk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChvdXRwdXRfaW52YWxpZF9idWYsICIoMHgleCkiLCAodW5zaWduZWQpIGMpOwotICByZXR1cm4gb3V0cHV0X2ludmFsaWRfYnVmOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy10aWMzMC5oIGIvZ2FzL2NvbmZpZy90Yy10aWMzMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTcyZDJlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdGljMzAuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qIHRjLXRpYzMwLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLXRpYzMwLmMKLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gICBDb250cmlidXRlZCBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9UQ19USUMzMF9IXwotI2RlZmluZSBfVENfVElDMzBfSF8KLQotI2RlZmluZSBUQ19USUMzMCAxCi0KLSNpZmRlZiBPQkpfQU9VVAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC10aWMzMCIKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9BUkNICQliZmRfYXJjaF90aWMzMAotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTgkxCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi1jaGFyICpvdXRwdXRfaW52YWxpZCBQQVJBTVMgKChpbnQgYykpOwotCi0jZGVmaW5lIEVORF9PRl9JTlNOICdcMCcKLSNkZWZpbmUgTUFYX09QRVJBTkRTIDYKLSNkZWZpbmUgRElSRUNUX1JFRkVSRU5DRSAnQCcKLSNkZWZpbmUgSU5ESVJFQ1RfUkVGRVJFTkNFICcqJwotI2RlZmluZSBQQVJBTExFTF9TRVBBUkFUT1IgJ3wnCi0jZGVmaW5lIElOU05fU0laRSA0Ci0KLS8qIERlZmluZSB0aGlzIHRvIDEgaWYgeW91IHdhbnQgdGhlIGRlYnVnIG91dHB1dCB0byBiZSBvbiBzdGRvdXQsCi0gICBvdGhlcndpc2Ugc3RkZXJyIHdpbGwgYmUgdXNlZC4gIElmIHN0ZGVyciBpcyB1c2VkLCB0aGVyZSB3aWxsIGJlIGEKLSAgIGJldHRlciBzeW5jaHJvbmlzYXRpb24gd2l0aCB0aGUgYXNfYmFkIG91dHB1dHMsIGJ1dCB5b3UgY2FuJ3QKLSAgIGNhcHR1cmUgdGhlIG91dHB1dC4gKi8KLSNkZWZpbmUgVVNFX1NURE9VVCAwCi0KLSNkZWZpbmUgdGNfdW5yZWNvZ25pemVkX2xpbmUgdGljMzBfdW5yZWNvZ25pemVkX2xpbmUKLQotZXh0ZXJuIGludCB0aWMzMF91bnJlY29nbml6ZWRfbGluZSBQQVJBTVMgKChpbnQpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXRpYzgwLmMgYi9nYXMvY29uZmlnL3RjLXRpYzgwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMWRiYTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy10aWM4MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2MSArMCwwIEBACi0vKiB0Yy10aWM4MC5jIC0tIEFzc2VtYmxlIGZvciB0aGUgVEkgVE1TMzIwQzgwIChNVikKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3RpYzgwLmgiCi0KLSNkZWZpbmUgaW50ZXJuYWxfZXJyb3Iod2hhdCkgXAotICBhc19mYXRhbChfKCJpbnRlcm5hbCBlcnJvcjolczolZDogJXNcbiIpLF9fRklMRV9fLF9fTElORV9fLHdoYXQpCi0jZGVmaW5lIGludGVybmFsX2Vycm9yX2Eod2hhdCxhcmcpIFwKLSAgYXNfZmF0YWwoXygiaW50ZXJuYWwgZXJyb3I6JXM6JWQ6ICVzICVkXG4iKSxfX0ZJTEVfXyxfX0xJTkVfXyx3aGF0LGFyZykKLQotDAotLyogR2VuZXJpYyBhc3NlbWJsZXIgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBtdXN0IGJlIGRlZmluZWQgYnkgYWxsIHRhcmdldHMuICovCi0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIjsqIyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHVzZWQgdG8gc2VwYXJhdGUgbXVsdGlwbGUgY29tbWFuZHMgb24gYSBzaW5nbGUKLSAgIGxpbmUuIFRoZSBzZW1pY29sb24gaXMgc3VjaCBhIGNoYXJhY3RlciBieSBkZWZhdWx0IGFuZCBzaG91bGQgbm90IGJlCi0gICBleHBsaWNpdGx5IGxpc3RlZC4gKi8KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFyZSB1c2VkIHRvIGluZGljYXRlIGFuIGV4cG9uZW50IGluIGEgZmxvYXRpbmcgCi0gICBwb2ludCBudW1iZXIuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWVhbiB0aGF0IGEgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsIAotICAgYXMgaW4gMGYxLjAuICAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJmRiI7Ci0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0KLSAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgIGludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uICovCi0KLWV4dGVybiB2b2lkIG9ial9jb2ZmX3NlY3Rpb24gKCk7Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgImFsaWduIiwJc19hbGlnbl9ieXRlcywJCTQgfSwJLyogRG8gYnl0ZSBhbGlnbm1lbnQsIGRlZmF1bHQgaXMgYSA0IGJ5dGUgYm91bmRhcnkgKi8KLSAgeyAid29yZCIsCWNvbnMsCQkJNCB9LAkvKiBGSVhNRTogU2hvdWxkIHRoaXMgYmUgbWFjaGluZSBpbmRlcGVuZGVudD8gKi8KLSAgeyAiYnNzIiwJc19sY29tbV9ieXRlcywJCTEgfSwKLSAgeyAic2VjdCIsCW9ial9jb2ZmX3NlY3Rpb24sCTB9LAkvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFRJIHRvb2xzICovCi0gIHsgInNlY3Rpb24iLAlvYmpfY29mZl9zZWN0aW9uLAkwfSwJLyogU3RhbmRhcmQgQ09GRiAuc2VjdGlvbiBwc2V1ZG8tb3AgKi8KLSAgeyBOVUxMLAlOVUxMLAkJCTAgfQotfTsKLQotLyogT3Bjb2RlIGhhc2ggdGFibGUuICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnRpYzgwX2hhc2g7Ci0KLXN0YXRpYyBzdHJ1Y3QgdGljODBfb3Bjb2RlICogZmluZF9vcGNvZGUgUEFSQU1TICgoc3RydWN0IHRpYzgwX29wY29kZSAqLCBleHByZXNzaW9uUyBbXSkpOwotc3RhdGljIHZvaWQgYnVpbGRfaW5zbiBQQVJBTVMgKChzdHJ1Y3QgdGljODBfb3Bjb2RlICosIGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyBpbnQgZ2V0X29wZXJhbmRzIFBBUkFNUyAoKGV4cHJlc3Npb25TIGV4cFtdKSk7Ci1zdGF0aWMgaW50IGNvbnN0X292ZXJmbG93IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgbnVtLCBpbnQgYml0cywgaW50IGZsYWdzKSk7Ci0KLS8qIFJlcGxhY2Ugc2hvcnQgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zIHdpdGggbG9uZyBmb3JtIHdoZW4gbmVjZXNzYXJ5LiAgQ3VycmVudGx5Ci0gICB0aGlzIGlzIG9mZiBieSBkZWZhdWx0IG9yIHdoZW4gZ2l2ZW4gdGhlIC1uby1yZWxheCBvcHRpb24uICBUdXJuaW5nIGl0IG9uIGJ5IHVzaW5nCi0gICB0aGUgLXJlbGF4IG9wdGlvbiBmb3JjZXMgYWxsIFBDIHJlbGF0aXZlIGluc3RydWN0aW9ucyB0byB1c2UgdGhlIGxvbmcgZm9ybSwgd2hpY2gKLSAgIGlzIHdoeSBpdCBpcyBjdXJyZW50bHkgbm90IHRoZSBkZWZhdWx0LiAqLwotc3RhdGljIGludCB0aWM4MF9yZWxheCA9IDA7Ci0KLQwKLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIGludGVybmFsX2Vycm9yIChfKCJSZWxheGF0aW9uIGlzIGEgbHV4dXJ5IHdlIGNhbid0IGFmZm9yZCIpKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAqLwotCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDQKLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLSAgY2hhciAqYXRvZl9pZWVlICgpOwotICAKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJiYWQgY2FsbCB0byBtZF9hdG9mICgpIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAgIH0KLSAgCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgCi0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKiBDaGVjayB0byBzZWUgaWYgdGhlIGNvbnN0YW50IHZhbHVlIGluIE5VTSB3aWxsIGZpdCBpbiBhIGZpZWxkIG9mCi0gICB3aWR0aCBCSVRTIGlmIGl0IGhhcyBmbGFncyBGTEFHUy4gKi8KLQotc3RhdGljIGludAotY29uc3Rfb3ZlcmZsb3cgKG51bSwgYml0cywgZmxhZ3MpCi0gICAgIHVuc2lnbmVkIGxvbmcgbnVtOwotICAgICBpbnQgYml0czsKLSAgICAgaW50IGZsYWdzOwotewotICBsb25nIG1pbiwgbWF4OwotICBpbnQgcmV0dmFsID0gMDsKLQotICAvKiBPbmx5IG5lZWQgdG8gY2hlY2sgZmllbGRzIGxlc3MgdGhhbiAzMiBiaXRzIHdpZGUgKi8KLSAgaWYgKGJpdHMgPCAzMikKLSAgICBpZiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1NJR05FRCkKLSAgICAgIHsKLQltYXggPSAoMSA8PCAoYml0cyAtIDEpKSAtIDE7IAotCW1pbiA9IC0gKDEgPDwgKGJpdHMgLSAxKSk7ICAKLQlyZXR2YWwgPSAoKGxvbmcpIG51bSA+IG1heCkgfHwgKChsb25nKSBudW0gPCBtaW4pOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQltYXggPSAoMSA8PCBiaXRzKSAtIDE7Ci0JbWluID0gMDsKLQlyZXR2YWwgPSAobnVtID4gbWF4KSB8fCAobnVtIDwgbWluKTsKLSAgICAgIH0KLSAgcmV0dXJuIChyZXR2YWwpOwotfQotCi0vKiBnZXRfb3BlcmFuZHMoKSBwYXJzZXMgYSBzdHJpbmcgb2Ygb3BlcmFuZHMgYW5kIGZpbGxzIGluIGEgcGFzc2VkIGFycmF5IG9mCi0gICBleHByZXNzaW9ucyBpbiBFWFAuCi0KLSAgIE5vdGUgdGhhdCB3ZSB1c2UgT19hYnNlbnQgZXhwcmVzc2lvbnMgdG8gcmVjb3JkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgIGFib3V0IHRoZSBwcmV2aW91cyBub24tT19hYnNlbnQgZXhwcmVzc2lvbiwgc3VjaCBhcyAiOm0iIG9yICI6cyIKLSAgIG1vZGlmaWVycyBvciByZWdpc3RlciBudW1iZXJzIGVuY2xvc2VkIGluIHBhcmVucyBsaWtlICIocjEwKSIuCi0KLSAgIFJldHVybnMgdGhlIG51bWJlciBvZiBleHByZXNzaW9ucyB0aGF0IHdlcmUgcGxhY2VkIGluIEVYUC4KLQotICAgKi8KLQotc3RhdGljIGludAotZ2V0X29wZXJhbmRzIChleHApIAotICAgICBleHByZXNzaW9uUyBleHBbXTsKLXsKLSAgY2hhciAqcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW50IG51bWV4cCA9IDA7Ci0gIGludCBtZmxhZyA9IDA7Ci0gIGludCBzZmxhZyA9IDA7Ci0gIGludCBwYXJlbnMgPSAwOwotCi0gIHdoaWxlICgqcCkgIAotICAgIHsKLSAgICAgIC8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gICAgICB3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJywnKSAKLQl7Ci0JICBwKys7Ci0JfQotCi0gICAgICAvKiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgb3BlcmFuZHMgbGVmdCB0byBwYXJzZSAqLwotICAgICAgaWYgKCpwID09IDAgfHwgKnAgPT0gJ1xuJyB8fCAqcCA9PSAnXHInKSAKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgICAKLSAgICAgIC8qIE5vdGljZSBzY2FsaW5nIG9yIGRpcmVjdCBtZW1vcnkgb3BlcmFuZCBtb2RpZmllcnMgYW5kIHNhdmUgdGhlbSBpbgotCSBhbiBPX2Fic2VudCBleHByZXNzaW9uIGFmdGVyIHRoZSBleHByZXNzaW9uIHRoYXQgdGhleSBtb2RpZnkuICovCi0KLSAgICAgIGlmICgqcCA9PSAnOicpIAotCXsKLQkgIHArKzsKLQkgIGV4cFtudW1leHBdLlhfb3AgPSBPX2Fic2VudDsKLQkgIGlmICgqcCA9PSAnbScpIAotCSAgICB7Ci0JICAgICAgcCsrOwotCSAgICAgIC8qIFRoaXMgaXMgYSAiOm0iIG1vZGlmaWVyICovCi0JICAgICAgZXhwW251bWV4cF0uWF9hZGRfbnVtYmVyID0gVElDODBfT1BFUkFORF9NX1NJIHwgVElDODBfT1BFUkFORF9NX0xJOwotCSAgICB9Ci0JICBlbHNlIGlmICgqcCA9PSAncycpCi0JICAgIHsKLQkgICAgICBwKys7Ci0JICAgICAgLyogVGhpcyBpcyBhICI6cyIgbW9kaWZpZXIgKi8KLQkgICAgICBleHBbbnVtZXhwXS5YX2FkZF9udW1iZXIgPSBUSUM4MF9PUEVSQU5EX1NDQUxFRDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCInOicgbm90IGZvbGxvd2VkIGJ5ICdtJyBvciAncyciKSk7Ci0JICAgIH0KLQkgIG51bWV4cCsrOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBIYW5kbGUgbGVhZGluZyAnKCcgb24gb3BlcmFuZHMgdGhhdCB1c2UgdGhlbSwgYnkgcmVjb3JkaW5nIHRoYXQgd2UKLQkgaGF2ZSBlbnRlcmVkIGEgcGFyZW4gbmVzdGluZyBsZXZlbCBhbmQgdGhlbiBjb250aW51aW5nLiAgV2UgY29tcGxhaW4KLQkgYWJvdXQgbXVsdGlwbGUgbmVzdGluZy4gKi8KLQotICAgICAgaWYgKCpwID09ICcoJykKLQl7Ci0JICBpZiAoKytwYXJlbnMgIT0gMSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygicGFyZW4gbmVzdGluZyIpKTsKLQkgICAgfQotCSAgcCsrOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBIYW5kbGUgdHJhaWxpbmcgJyknIG9uIG9wZXJhbmRzIHRoYXQgdXNlIHRoZW0sIGJ5IHJlZHVjaW5nIHRoZQotCSBuZXN0aW5nIGxldmVsIGFuZCB0aGVuIGNvbnRpbnVpbmcuICBXZSBjb21wbGFpbiBpZiB0aGVyZSB3ZXJlIHRvbwotCSBtYW55IGNsb3N1cmVzLiAqLwotCi0gICAgICBpZiAoKnAgPT0gJyknKSAKLQl7Ci0JICAvKiBSZWNvcmQgdGhhdCB3ZSBoYXZlIGxlZnQgYSBwYXJlbiBncm91cCBhbmQgY29udGludWUgKi8KLQkgIGlmICgtLXBhcmVucyA8IDApCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIm1pc21hdGNoZWQgcGFyZW50aGVzaXMiKSk7Ci0JICAgIH0KLQkgIHArKzsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQmVnaW4gb3BlcmFuZCBwYXJzaW5nIGF0IHRoZSBjdXJyZW50IHNjYW4gcG9pbnQuICovCi0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0gICAgICBleHByZXNzaW9uICgmZXhwW251bWV4cF0pOwotCi0gICAgICBpZiAoZXhwW251bWV4cF0uWF9vcCA9PSBPX2lsbGVnYWwpCi0JewotCSAgYXNfYmFkIChfKCJpbGxlZ2FsIG9wZXJhbmQiKSk7Ci0JfQotICAgICAgZWxzZSBpZiAoZXhwW251bWV4cF0uWF9vcCA9PSBPX2Fic2VudCkKLQl7Ci0JICBhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKLQl9Ci0KLSAgICAgIG51bWV4cCsrOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgaWYgKHBhcmVucykKLSAgICB7Ci0gICAgICBleHBbbnVtZXhwXS5YX29wID0gT19hYnNlbnQ7Ci0gICAgICBleHBbbnVtZXhwKytdLlhfYWRkX251bWJlciA9IFRJQzgwX09QRVJBTkRfUEFSRU5TOwotICAgIH0KLQotICAvKiBNYXJrIHRoZSBlbmQgb2YgdGhlIHZhbGlkIG9wZXJhbmRzIHdpdGggYW4gaWxsZWdhbCBleHByZXNzaW9uLiAqLwotICBleHBbbnVtZXhwXS5YX29wID0gT19pbGxlZ2FsOwotCi0gIHJldHVybiAobnVtZXhwKTsKLX0KLQotLyogZmluZF9vcGNvZGUoKSBnZXRzIGEgcG9pbnRlciB0byB0aGUgZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZSB0aGF0Ci0gICBtYXRjaGVzIHRoZSBpbnN0cnVjdGlvbiBiZWluZyBhc3NlbWJsZWQsIG9yIHJldHVybnMgTlVMTCBpZiBubyBzdWNoIG1hdGNoCi0gICBpcyBmb3VuZC4KLQotICAgRmlyc3QgaXQgcGFyc2VzIGFsbCB0aGUgb3BlcmFuZHMgYW5kIHNhdmUgdGhlbSBhcyBleHByZXNzaW9ucy4gIE5vdGUgdGhhdAotICAgd2UgdXNlIE9fYWJzZW50IGV4cHJlc3Npb25zIHRvIHJlY29yZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgcHJldmlvdXMgbm9uLU9fYWJzZW50IGV4cHJlc3Npb24sIHN1Y2ggYXMgIjptIiBvciAiOnMiIG1vZGlmaWVycyBvcgotICAgcmVnaXN0ZXIgbnVtYmVycyBlbmNsb3NlZCBpbiBwYXJlbnMgbGlrZSAiKHIxMCkiLgotCi0gICBJdCB0aGVuIGxvb2tzIGF0IGFsbCBvcGNvZGVzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgdXNlcyB0aGUgb3BlcmFuZHMgdG8KLSAgIGNob29zZSB0aGUgY29ycmVjdCBvcGNvZGUuICAqLwotCi1zdGF0aWMgc3RydWN0IHRpYzgwX29wY29kZSAqCi1maW5kX29wY29kZSAob3Bjb2RlLCBteW9wcykKLSAgICAgc3RydWN0IHRpYzgwX29wY29kZSAqb3Bjb2RlOwotICAgICBleHByZXNzaW9uUyBteW9wc1tdOwotewotICBpbnQgbnVtZXhwOwkJCQkvKiBOdW1iZXIgb2YgZXhwcmVzc2lvbnMgZnJvbSBwYXJzaW5nIG9wZXJhbmRzICovCi0gIGludCBleHBpOwkJCQkvKiBJbmRleCBvZiBjdXJyZW50IGV4cHJlc3Npb24gdG8gbWF0Y2ggKi8KLSAgaW50IG9waTsJCQkJLyogSW5kZXggb2YgY3VycmVudCBvcGVyYW5kIHRvIG1hdGNoICovCi0gIGludCBtYXRjaCA9IDA7CQkJLyogU2V0IHRvIDEgd2hlbiBhbiBvcGVyYW5kIG1hdGNoIGlzIGZvdW5kICovCi0gIHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wYyA9IG9wY29kZTsJLyogUG9pbnRlciB0byBjdXJyZW50IG9wY29kZSB0YWJsZSBlbnRyeSAqLwotICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICplbmQ7CS8qIFBvaW50ZXIgdG8gZW5kIG9mIG9wY29kZSB0YWJsZSAqLwotCi0gIC8qIEZpcnN0IHBhcnNlIGFsbCB0aGUgb3BlcmFuZHMgc28gd2Ugb25seSBoYXZlIHRvIGRvIGl0IG9uY2UuICBUaGVyZSBtYXkKLSAgICAgYmUgbW9yZSBleHByZXNzaW9ucyBnZW5lcmF0ZWQgdGhhbiB0aGVyZSBhcmUgb3BlcmFuZHMuICovCi0KLSAgbnVtZXhwID0gZ2V0X29wZXJhbmRzIChteW9wcyk7Ci0KLSAgLyogRm9yIGVhY2ggb3Bjb2RlIHdpdGggdGhlIHNhbWUgbmFtZSwgdHJ5IHRvIG1hdGNoIGl0IGFnYWluc3QgdGhlIHBhcnNlZAotICAgICBvcGVyYW5kcy4gKi8KLQotICBlbmQgPSB0aWM4MF9vcGNvZGVzICsgdGljODBfbnVtX29wY29kZXM7Ci0gIHdoaWxlICghbWF0Y2ggJiYgKG9wYyA8IGVuZCkgJiYgKHN0cmNtcCAob3BjIC0+IG5hbWUsIG9wY29kZSAtPiBuYW1lKSA9PSAwKSkKLSAgICB7Ci0gICAgICAvKiBTdGFydCBvZmYgYXNzdW1pbmcgYSBtYXRjaC4gIElmIHdlIGZpbmQgYSBtaXNtYXRjaCwgdGhlbiB0aGlzIGlzCi0JIHJlc2V0IGFuZCB0aGUgb3BlcmFuZC9leHByIG1hdGNoaW5nIGxvb3AgdGVybWluYXRlcyB3aXRoIG1hdGNoCi0JIGVxdWFsIHRvIHplcm8sIHdoaWNoIGFsbG93cyB1cyB0byB0cnkgdGhlIG5leHQgb3Bjb2RlLiAqLwotCi0gICAgICBtYXRjaCA9IDE7Ci0KLSAgICAgIC8qIEZvciBlYWNoIGV4cHJlc3Npb24sIHRyeSB0byBtYXRjaCBpdCBhZ2FpbnN0IHRoZSBjdXJyZW50IG9wZXJhbmQKLQkgZm9yIHRoZSBjdXJyZW50IG9wY29kZS4gIFVwb24gYW55IG1pc21hdGNoLCB3ZSBhYmFuZG9uIGZ1cnRoZXIKLQkgbWF0Y2hpbmcgZm9yIHRoZSBjdXJyZW50IG9wY29kZSB0YWJsZSBlbnRyeS4gICovCi0KLSAgICAgIGZvciAoZXhwaSA9IDAsIG9waSA9IC0xOyAoZXhwaSA8IG51bWV4cCkgJiYgbWF0Y2g7IGV4cGkrKykKLQl7Ci0JICBpbnQgYml0cywgZmxhZ3MsIFhfb3AsIG51bTsKLQotCSAgWF9vcCA9IG15b3BzW2V4cGldLlhfb3A7Ci0JICBudW0gPSBteW9wc1tleHBpXS5YX2FkZF9udW1iZXI7Ci0KLQkgIC8qIFRoZSBPX2Fic2VudCBleHByZXNzaW9ucyBhcHBseSB0byB0aGUgc2FtZSBvcGVyYW5kIGFzIHRoZSBtb3N0Ci0JICAgICByZWNlbnQgbm9uIE9fYWJzZW50IGV4cHJlc3Npb24uICBTbyBvbmx5IGluY3JlbWVudCB0aGUgb3BlcmFuZAotCSAgICAgaW5kZXggd2hlbiB0aGUgY3VycmVudCBleHByZXNzaW9uIGlzIG5vdCBvbmUgb2YgdGhlc2Ugc3BlY2lhbAotCSAgICAgZXhwcmVzc2lvbnMuICovCi0KLQkgIGlmIChYX29wICE9IE9fYWJzZW50KQotCSAgICB7Ci0JICAgICAgb3BpKys7Ci0JICAgIH0KLQotCSAgZmxhZ3MgPSB0aWM4MF9vcGVyYW5kc1tvcGMgLT4gb3BlcmFuZHNbb3BpXV0uZmxhZ3M7Ci0JICBiaXRzID0gdGljODBfb3BlcmFuZHNbb3BjIC0+IG9wZXJhbmRzW29waV1dLmJpdHM7Ci0KLQkgIHN3aXRjaCAoWF9vcCkKLQkgICAgewotCSAgICBjYXNlIE9fcmVnaXN0ZXI6Ci0JICAgICAgLyogQWxzbyBjaGVjayB0aGF0IHJlZ2lzdGVycyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBldmVuIGFjdHVhbGx5Ci0JCSBhcmUgZXZlbi4gKi8KLQkgICAgICBpZiAoKChmbGFncyAmIFRJQzgwX09QRVJBTkRfR1BSKSAhPSAobnVtICYgVElDODBfT1BFUkFORF9HUFIpKSB8fAotCQkgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0ZQQSkgIT0gKG51bSAmIFRJQzgwX09QRVJBTkRfRlBBKSkgfHwKLQkJICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9DUikgIT0gKG51bSAmIFRJQzgwX09QRVJBTkRfQ1IpKSB8fAotCQkgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0VWRU4pICYmIChudW0gJiAxKSkgfHwKLQkJICBjb25zdF9vdmVyZmxvdyAobnVtICYgflRJQzgwX09QRVJBTkRfTUFTSywgYml0cywgZmxhZ3MpKQotCQl7Ci0JCSAgbWF0Y2ggPSAwOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19jb25zdGFudDoKLQkgICAgICBpZiAoKGZsYWdzICYgVElDODBfT1BFUkFORF9FTkRNQVNLKSAmJiAobnVtID09IDMyKSkKLQkJewotCQkgIC8qIEVuZG1hc2sgdmFsdWVzIG9mIDAgYW5kIDMyIGdpdmUgaWRlbnRpY2FsIHJlc3VsdHMgKi8KLQkJICBudW0gPSAwOwotCQl9Ci0JICAgICAgaWYgKChmbGFncyAmIChUSUM4MF9PUEVSQU5EX0ZQQSB8IFRJQzgwX09QRVJBTkRfR1BSKSkgfHwKLQkJICBjb25zdF9vdmVyZmxvdyAobnVtLCBiaXRzLCBmbGFncykpCi0JCXsKLQkJICBtYXRjaCA9IDA7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX3N5bWJvbDoKLQkgICAgICBpZiAoKGJpdHMgPCAzMikgJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9QQ1JFTCkgJiYgIXRpYzgwX3JlbGF4KQotCQl7Ci0JCSAgLyogVGhlIGRlZmF1bHQgaXMgdG8gcHJlZmVyIHRoZSBzaG9ydCBmb3JtIG9mIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zLgotCQkgICAgIFRoaXMgaXMgdGhlIG9ubHkgZm9ybSB0aGF0IHRoZSBUSSBhc3NlbWJsZXIgc3VwcG9ydHMuCi0JCSAgICAgSWYgdGhlIC1yZWxheCBvcHRpb24gaXMgZ2l2ZW4sIHdlIG5ldmVyIHVzZSB0aGUgc2hvcnQgZm9ybXMuCi0JCSAgICAgRklYTUU6IFNob3VsZCBiZSBhYmxlIHRvIGNob29zZSAiYmVzdC1maXQiLiAqLwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKGJpdHMgPT0gMzIpIC8qICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfQkFTRVJFTCkgKi8pCi0JCXsKLQkJICAvKiBUaGUgZGVmYXVsdCBpcyB0byBwcmVmZXIgdGhlIGxvbmcgZm9ybSBvZiBiYXNlIHJlbGF0aXZlIHJlbG9jYXRpb25zLgotCQkgICAgIFRoaXMgaXMgdGhlIG9ubHkgZm9ybSB0aGF0IHRoZSBUSSBhc3NlbWJsZXIgc3VwcG9ydHMuCi0JCSAgICAgSWYgdGhlIC1uby1yZWxheCBvcHRpb24gaXMgZ2l2ZW4sIHdlIGFsd2F5cyB1c2UgdGhlIGxvbmcgZm9ybSBvZgotCQkgICAgIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zLgotCQkgICAgIEZJWE1FOiBTaG91bGQgYmUgYWJsZSB0byBjaG9vc2UgImJlc3QtZml0Ii4gKi8KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFN5bWJvbHMgdGhhdCBkb24ndCBtYXRjaCBvbmUgb2YgdGhlIGFib3ZlIGNhc2VzIGFyZQotCQkgICAgIHJlamVjdGVkIGFzIGFuIG9wZXJhbmQuICovCi0JCSAgbWF0Y2ggPSAwOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19hYnNlbnQ6Ci0JICAgICAgLyogSWYgdGhpcyBpcyBhbiBPX2Fic2VudCBleHByZXNzaW9uLCB0aGVuIGl0IG1heSBiZSBhbiBleHByZXNzaW9uIHRoYXQKLQkJIHN1cHBsaWVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9wZXJhbmQsIHN1Y2ggYXMgIjptIiBvcgotCQkgIjpzIiBtb2RpZmllcnMuIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBvcGVyYW5kIG1hdGNoZXMgdGhpcyByZXF1aXJlbWVudC4gKi8KLQkgICAgICBpZiAoISgobnVtICYgVElDODBfT1BFUkFORF9NX1NJKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX01fU0kpIHx8Ci0JCSAgICAobnVtICYgVElDODBfT1BFUkFORF9NX0xJKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX01fTEkpIHx8Ci0JCSAgICAobnVtICYgVElDODBfT1BFUkFORF9TQ0FMRUQpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfU0NBTEVEKSkpCi0JCXsKLQkJICBtYXRjaCA9IDA7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2JpZzoKLQkgICAgICBpZiAoKG51bSA+IDApIHx8ICEoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0ZMT0FUKSkKLQkJewotCQkgIG1hdGNoID0gMDsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9faWxsZWdhbDoKLQkgICAgY2FzZSBPX3N5bWJvbF9ydmE6Ci0JICAgIGNhc2UgT191bWludXM6Ci0JICAgIGNhc2UgT19iaXRfbm90OgotCSAgICBjYXNlIE9fbG9naWNhbF9ub3Q6Ci0JICAgIGNhc2UgT19tdWx0aXBseToKLQkgICAgY2FzZSBPX2RpdmlkZToKLQkgICAgY2FzZSBPX21vZHVsdXM6Ci0JICAgIGNhc2UgT19sZWZ0X3NoaWZ0OgotCSAgICBjYXNlIE9fcmlnaHRfc2hpZnQ6Ci0JICAgIGNhc2UgT19iaXRfaW5jbHVzaXZlX29yOgotCSAgICBjYXNlIE9fYml0X29yX25vdDoKLQkgICAgY2FzZSBPX2JpdF9leGNsdXNpdmVfb3I6Ci0JICAgIGNhc2UgT19iaXRfYW5kOgotCSAgICBjYXNlIE9fYWRkOgotCSAgICBjYXNlIE9fc3VidHJhY3Q6Ci0JICAgIGNhc2UgT19lcToKLQkgICAgY2FzZSBPX25lOgotCSAgICBjYXNlIE9fbHQ6Ci0JICAgIGNhc2UgT19sZToKLQkgICAgY2FzZSBPX2dlOgotCSAgICBjYXNlIE9fZ3Q6Ci0JICAgIGNhc2UgT19sb2dpY2FsX2FuZDoKLQkgICAgY2FzZSBPX2xvZ2ljYWxfb3I6Ci0JICAgIGNhc2UgT19tYXg6Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaW50ZXJuYWxfZXJyb3JfYSAoXygidW5oYW5kbGVkIGV4cHJlc3Npb24gdHlwZSIpLCBYX29wKTsKLQkgICAgfQotCX0KLSAgICAgIGlmICghbWF0Y2gpCi0JewotCSAgb3BjKys7Ci0JfQotICAgIH0gIAotCi0gIHJldHVybiAobWF0Y2ggPyBvcGMgOiBOVUxMKTsKLQotI2lmIDAKLQotICAvKiBOb3cgc2VhcmNoIHRoZSBvcGNvZGUgdGFibGUgdGFibGUgZm9yIG9uZSB3aXRoIG9wZXJhbmRzIHRoYXQKLSAgICAgbWF0Y2hlcyB3aGF0IHdlJ3ZlIGdvdC4gKi8KLQotICB3aGlsZSAoIW1hdGNoKQotICAgIHsKLSAgICAgIG1hdGNoID0gMTsKLSAgICAgIGZvciAoaSA9IDA7IG9wY29kZSAtPiBvcGVyYW5kc1tpXTsgaSsrKSAKLQl7Ci0JICBpbnQgZmxhZ3MgPSB0aWM4MF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKLQkgIGludCBYX29wID0gbXlvcHNbaV0uWF9vcDsKLQkgIGludCBudW0gPSBteW9wc1tpXS5YX2FkZF9udW1iZXI7Ci0KLQkgIGlmIChYX29wID09IDApIAotCSAgICB7Ci0JICAgICAgbWF0Y2ggPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAgICAgCi0JICBpZiAoZmxhZ3MgJiAoVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX0ZQQSB8IFRJQzgwX09QRVJBTkRfQ1IpKSAKLQkgICAgewotCSAgICAgIGlmICgoWF9vcCAhPSBPX3JlZ2lzdGVyKSB8fAotCQkgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0dQUikgIT0gKG51bSAmIFRJQzgwX09QRVJBTkRfR1BSKSkgfHwKLQkJICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9GUEEpICE9IChudW0gJiBUSUM4MF9PUEVSQU5EX0ZQQSkpIHx8Ci0JCSAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfQ1IpICE9IChudW0gJiBUSUM4MF9PUEVSQU5EX0NSKSkpCi0JCXsKLQkJICBtYXRjaD0wOwotCQkgIGJyZWFrOwotCQl9CSAgCi0JICAgIH0KLQkgICAgICAKLQkgIGlmICgoKGZsYWdzICYgVElDODBfT1BFUkFORF9NSU5VUykgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IFRJQzgwX09QRVJBTkRfTUlOVVMpKSkgfHwKLQkgICAgICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9QTFVTKSAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gVElDODBfT1BFUkFORF9QTFVTKSkpIHx8Ci0JICAgICAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfQVRNSU5VUykgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IFRJQzgwX09QRVJBTkRfQVRNSU5VUykpKSB8fAotCSAgICAgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0FUUEFSKSAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gVElDODBfT1BFUkFORF9BVFBBUikpKSB8fAotCSAgICAgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0FUU0lHTikgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IFRJQzgwX09QRVJBTkRfQVRTSUdOKSkpKSAKLQkgICAgewotCSAgICAgIG1hdGNoPTA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0JICAgICAgCi0JfQotICAgICAgLyogd2UncmUgb25seSBkb25lIGlmIHRoZSBvcGVyYW5kcyBtYXRjaGVkIHNvIGZhciBBTkQgdGhlcmUKLQkgYXJlIG5vIG1vcmUgdG8gY2hlY2sgKi8KLSAgICAgIGlmIChtYXRjaCAmJiBteW9wc1tpXS5YX29wPT0wKSAKLQlicmVhazsKLSAgICAgIGVsc2UKLQltYXRjaCA9IDA7Ci0KLSAgICAgIG5leHRfb3Bjb2RlID0gb3Bjb2RlKzE7Ci0gICAgICBpZiAobmV4dF9vcGNvZGUtPm9wY29kZSA9PSAwKSAKLQlicmVhazsKLSAgICAgIGlmIChzdHJjbXAobmV4dF9vcGNvZGUtPm5hbWUsIG9wY29kZS0+bmFtZSkpCi0JYnJlYWs7Ci0gICAgICBvcGNvZGUgPSBuZXh0X29wY29kZTsKLSAgICB9Ci0KLSAgaWYgKCFtYXRjaCkgIAotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYmFkIG9wY29kZSBvciBvcGVyYW5kcyIpKTsKLSAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotCi0gIC8qIENoZWNrIHRoYXQgYWxsIHJlZ2lzdGVycyB0aGF0IGFyZSByZXF1aXJlZCB0byBiZSBldmVuIGFyZS4gKi8KLSAgLyogQWxzbywgaWYgYW55IG9wZXJhbmRzIHdlcmUgbWFya2VkIGFzIHJlZ2lzdGVycywgYnV0IHdlcmUgcmVhbGx5IHN5bWJvbHMgKi8KLSAgLyogZml4IHRoYXQgaGVyZS4gKi8KLSAgZm9yIChpPTA7IG9wY29kZS0+b3BlcmFuZHNbaV07IGkrKykgCi0gICAgewotICAgICAgaWYgKCh0aWM4MF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFncyAmIFRJQzgwX09QRVJBTkRfRVZFTikgJiYKLQkgIChteW9wc1tpXS5YX2FkZF9udW1iZXIgJiAxKSkgCi0JYXNfZmF0YWwgKF8oIlJlZ2lzdGVyIG51bWJlciBtdXN0IGJlIEVWRU4iKSk7Ci0gICAgICBpZiAobXlvcHNbaV0uWF9vcCA9PSBPX3JlZ2lzdGVyKQotCXsKLQkgIGlmICghKHRpYzgwX29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzICYgVElDODBfT1BFUkFORF9SRUcpKSAKLQkgICAgewotCSAgICAgIG15b3BzW2ldLlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBteW9wc1tpXS5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgoY2hhciAqKW15b3BzW2ldLlhfb3Bfc3ltYm9sKTsKLQkgICAgICBteW9wc1tpXS5YX2FkZF9udW1iZXIgPSAwOwotCSAgICAgIG15b3BzW2ldLlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNlbmRpZgotfQotCi0vKiBidWlsZF9pbnNuIHRha2VzIGEgcG9pbnRlciB0byB0aGUgb3Bjb2RlIGVudHJ5IGluIHRoZSBvcGNvZGUgdGFibGUKLSAgIGFuZCB0aGUgYXJyYXkgb2Ygb3BlcmFuZCBleHByZXNzaW9ucyBhbmQgd3JpdGVzIG91dCB0aGUgaW5zdHJ1Y3Rpb24uCi0KLSAgIE5vdGUgdGhhdCB0aGUgb3Bjb2RlIHdvcmQgYW5kIGV4dGVuZGVkIHdvcmQgbWF5IGJlIHdyaXR0ZW4gdG8gZGlmZmVyZW50Ci0gICBmcmFncywgd2l0aCB0aGUgb3Bjb2RlIGF0IHRoZSBlbmQgb2Ygb25lIGZyYWcgYW5kIHRoZSBleHRlbnNpb24gYXQgdGhlCi0gICBiZWdpbm5pbmcgb2YgdGhlIG5leHQuICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9pbnNuIChvcGNvZGUsIG9wZXJzKSAKLSAgICAgc3RydWN0IHRpYzgwX29wY29kZSAqb3Bjb2RlOwotICAgICBleHByZXNzaW9uUyAqb3BlcnM7Ci17Ci0gIGludCBleHBpOwkJCQkvKiBJbmRleCBvZiBjdXJyZW50IGV4cHJlc3Npb24gdG8gbWF0Y2ggKi8KLSAgaW50IG9waTsJCQkJLyogSW5kZXggb2YgY3VycmVudCBvcGVyYW5kIHRvIG1hdGNoICovCi0gIHVuc2lnbmVkIGxvbmcgaW5zblsyXTsJCS8qIEluc3RydWN0aW9uIGFuZCBsb25nIGltbWVkaWF0ZSAoaWYgYW55KSAqLwotICBjaGFyICpmOwkJCQkvKiBQb2ludGVyIHRvIGZyYWcgbG9jYXRpb24gZm9yIGluc25bMF0gKi8KLSAgZnJhZ1MgKmZmcmFnOwkJCQkvKiBGcmFnIGNvbnRhaW5pbmcgbG9jYXRpb24gZiAqLwotICBjaGFyICpmeCA9IE5VTEw7CQkJLyogUG9pbnRlciB0byBmcmFnIGxvY2F0aW9uIGZvciBpbnNuWzFdICovCi0gIGZyYWdTICpmeGZyYWc7CQkJLyogRnJhZyBjb250YWluaW5nIGxvY2F0aW9uIGZ4ICovCi0KLSAgLyogU3RhcnQgd2l0aCB0aGUgcmF3IG9wY29kZSBiaXRzIGZyb20gdGhlIG9wY29kZSB0YWJsZS4gKi8KLSAgaW5zblswXSA9IG9wY29kZSAtPiBvcGNvZGU7Ci0KLSAgLyogV2UgYXJlIGdvaW5nIHRvIGluc2VydCBhdCBsZWFzdCBvbmUgMzIgYml0IG9wY29kZSBzbyBnZXQgdGhlCi0gICAgIGZyYWcgbm93LiAqLwotCi0gIGYgPSBmcmFnX21vcmUgKDQpOwotICBmZnJhZyA9IGZyYWdfbm93OwotCi0gIC8qIEZvciBlYWNoIG9wZXJhbmQgZXhwcmVzc2lvbiwgaW5zZXJ0IHRoZSBhcHByb3ByaWF0ZSBiaXRzIGludG8gdGhlCi0gICAgIGluc3RydWN0aW9uIC4gKi8KLSAgZm9yIChleHBpID0gMCwgb3BpID0gLTE7IG9wZXJzW2V4cGldLlhfb3AgIT0gT19pbGxlZ2FsOyBleHBpKyspCi0gICAgewotICAgICAgaW50IGJpdHMsIHNoaWZ0LCBmbGFncywgWF9vcCwgbnVtOwotCi0gICAgICBYX29wID0gb3BlcnNbZXhwaV0uWF9vcDsKLSAgICAgIG51bSA9IG9wZXJzW2V4cGldLlhfYWRkX251bWJlcjsKLQotICAgICAgLyogVGhlIE9fYWJzZW50IGV4cHJlc3Npb25zIGFwcGx5IHRvIHRoZSBzYW1lIG9wZXJhbmQgYXMgdGhlIG1vc3QKLQkgcmVjZW50IG5vbiBPX2Fic2VudCBleHByZXNzaW9uLiAgU28gb25seSBpbmNyZW1lbnQgdGhlIG9wZXJhbmQKLQkgaW5kZXggd2hlbiB0aGUgY3VycmVudCBleHByZXNzaW9uIGlzIG5vdCBvbmUgb2YgdGhlc2Ugc3BlY2lhbAotCSBleHByZXNzaW9ucy4gKi8KLQotICAgICAgaWYgKFhfb3AgIT0gT19hYnNlbnQpCi0JewotCSAgb3BpKys7Ci0JfQotCi0gICAgICBmbGFncyA9IHRpYzgwX29wZXJhbmRzW29wY29kZSAtPiBvcGVyYW5kc1tvcGldXS5mbGFnczsKLSAgICAgIGJpdHMgPSB0aWM4MF9vcGVyYW5kc1tvcGNvZGUgLT4gb3BlcmFuZHNbb3BpXV0uYml0czsKLSAgICAgIHNoaWZ0ID0gdGljODBfb3BlcmFuZHNbb3Bjb2RlIC0+IG9wZXJhbmRzW29waV1dLnNoaWZ0OwotCi0gICAgICBzd2l0Y2ggKFhfb3ApCi0JewotCWNhc2UgT19yZWdpc3RlcjoKLQkgIG51bSAmPSB+VElDODBfT1BFUkFORF9NQVNLOwotCSAgaW5zblswXSA9IGluc25bMF0gfCAobnVtIDw8IHNoaWZ0KTsKLQkgIGJyZWFrOwotCWNhc2UgT19jb25zdGFudDoKLQkgIGlmICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0VORE1BU0spICYmIChudW0gPT0gMzIpKQotCSAgICB7Ci0JICAgICAgLyogRW5kbWFzayB2YWx1ZXMgb2YgMCBhbmQgMzIgZ2l2ZSBpZGVudGljYWwgcmVzdWx0cyAqLwotCSAgICAgIG51bSA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfQklUTlVNKSkKLQkgICAgewotCSAgICAgIC8qIEJJVE5VTSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiBvbmUncyBjb21wbGVtZW50IGZvcm0gKi8KLQkgICAgICBudW0gPSAofm51bSAmIDB4MUYpOwotCSAgICB9Ci0JICAvKiBNYXNrIG9mZiB1cHBlciBiaXRzLCBqdXN0IGl0IGNhc2UgaXQgaXMgc2lnbmVkIGFuZCBpcyBuZWdhdGl2ZSAqLwotCSAgaWYgKGJpdHMgPCAzMikKLQkgICAgewotCSAgICAgIG51bSAmPSAoMSA8PCBiaXRzKSAtIDE7Ci0JICAgICAgaW5zblswXSA9IGluc25bMF0gfCAobnVtIDw8IHNoaWZ0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnggPSBmcmFnX21vcmUgKDQpOwotCSAgICAgIGZ4ZnJhZyA9IGZyYWdfbm93OwotCSAgICAgIGluc25bMV0gPSBudW07Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgT19zeW1ib2w6Ci0JICBpZiAoYml0cyA9PSAzMikKLQkgICAgewotCSAgICAgIGZ4ID0gZnJhZ19tb3JlICg0KTsKLQkgICAgICBmeGZyYWcgPSBmcmFnX25vdzsKLQkgICAgICBpbnNuWzFdID0gMDsKLQkgICAgICBpZiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1BDUkVMKQotCQl7Ci0JCSAgZml4X25ld19leHAgKGZ4ZnJhZywKLQkJCSAgICAgICBmeCAtIChmeGZyYWcgLT4gZnJfbGl0ZXJhbCksCi0JCQkgICAgICAgNCwKLQkJCSAgICAgICAmb3BlcnNbZXhwaV0sIAotCQkJICAgICAgIDEsCi0JCQkgICAgICAgUl9NUFBDUik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmaXhfbmV3X2V4cCAoZnhmcmFnLAotCQkJICAgICAgIGZ4IC0gKGZ4ZnJhZyAtPiBmcl9saXRlcmFsKSwKLQkJCSAgICAgICA0LAotCQkJICAgICAgICZvcGVyc1tleHBpXSwgCi0JCQkgICAgICAgMCwKLQkJCSAgICAgICBSX1JFTExPTkdYKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfUENSRUwpCi0JICAgIHsKLQkgICAgICBmaXhfbmV3X2V4cCAoZmZyYWcsCi0JCQkgICBmIC0gKGZmcmFnIC0+IGZyX2xpdGVyYWwpLAotCQkJICAgNCwJCQkvKiBGSVhNRSEgaG93IGlzIHRoaXMgdXNlZD8gKi8KLQkJCSAgICZvcGVyc1tleHBpXSwKLQkJCSAgIDEsCi0JCQkgICBSX01QUENSMTVXKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50ZXJuYWxfZXJyb3IgKF8oInN5bWJvbCByZWxvYyB0aGF0IGlzIG5vdCBQQyByZWxhdGl2ZSBvciAzMiBiaXRzIikpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIE9fYWJzZW50OgotCSAgLyogRWFjaCBPX2Fic2VudCBleHByZXNzaW9uIGNhbiBpbmRpY2F0ZSBleGFjdGx5IG9uZSBwb3NzaWJsZSBtb2RpZmllci4gKi8KLQkgIGlmICgobnVtICYgVElDODBfT1BFUkFORF9NX1NJKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX01fU0kpKQotCSAgICB7Ci0JICAgICAgaW5zblswXSA9IGluc25bMF0gfCAoMSA8PCAxNyk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChudW0gJiBUSUM4MF9PUEVSQU5EX01fTEkpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfTV9MSSkpCi0JICAgIHsKLQkgICAgICBpbnNuWzBdID0gaW5zblswXSB8ICgxIDw8IDE1KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKG51bSAmIFRJQzgwX09QRVJBTkRfU0NBTEVEKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1NDQUxFRCkpCi0JICAgIHsKLQkgICAgICBpbnNuWzBdID0gaW5zblswXSB8ICgxIDw8IDExKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKG51bSAmIFRJQzgwX09QRVJBTkRfUEFSRU5TKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1BBUkVOUykpCi0JICAgIHsKLQkgICAgICAvKiBObyBjb2RlIHRvIGdlbmVyYXRlLCBqdXN0IGFjY2VwdCBhbmQgZGlzY2FyZCB0aGlzIGV4cHJlc3Npb24gKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50ZXJuYWxfZXJyb3JfYSAoXygidW5oYW5kbGVkIG9wZXJhbmQgbW9kaWZpZXIiKSwgb3BlcnNbZXhwaV0uWF9hZGRfbnVtYmVyKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPX2JpZzoKLQkgIGZ4ID0gZnJhZ19tb3JlICg0KTsKLQkgIGZ4ZnJhZyA9IGZyYWdfbm93OwotCSAgewotCSAgICBpbnQgcHJlY2lzaW9uID0gMjsKLQkgICAgbG9uZyBleHBvbmVudF9iaXRzID0gOEw7Ci0JICAgIExJVFRMRU5VTV9UWVBFIHdvcmRzWzJdOwotCSAgICAvKiBWYWx1ZSBpcyBzdGlsbCBpbiBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciAqLwotCSAgICBnZW5fdG9fd29yZHMgKHdvcmRzLCBwcmVjaXNpb24sIGV4cG9uZW50X2JpdHMpOwotCSAgICBpbnNuWzFdID0gKHdvcmRzWzBdIDw8IDE2KSB8IHdvcmRzWzFdOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPX2lsbGVnYWw6Ci0JY2FzZSBPX3N5bWJvbF9ydmE6Ci0JY2FzZSBPX3VtaW51czoKLQljYXNlIE9fYml0X25vdDoKLQljYXNlIE9fbG9naWNhbF9ub3Q6Ci0JY2FzZSBPX211bHRpcGx5OgotCWNhc2UgT19kaXZpZGU6Ci0JY2FzZSBPX21vZHVsdXM6Ci0JY2FzZSBPX2xlZnRfc2hpZnQ6Ci0JY2FzZSBPX3JpZ2h0X3NoaWZ0OgotCWNhc2UgT19iaXRfaW5jbHVzaXZlX29yOgotCWNhc2UgT19iaXRfb3Jfbm90OgotCWNhc2UgT19iaXRfZXhjbHVzaXZlX29yOgotCWNhc2UgT19iaXRfYW5kOgotCWNhc2UgT19hZGQ6Ci0JY2FzZSBPX3N1YnRyYWN0OgotCWNhc2UgT19lcToKLQljYXNlIE9fbmU6Ci0JY2FzZSBPX2x0OgotCWNhc2UgT19sZToKLQljYXNlIE9fZ2U6Ci0JY2FzZSBPX2d0OgotCWNhc2UgT19sb2dpY2FsX2FuZDoKLQljYXNlIE9fbG9naWNhbF9vcjoKLQljYXNlIE9fbWF4OgotCWRlZmF1bHQ6Ci0JICBpbnRlcm5hbF9lcnJvcl9hIChfKCJ1bmhhbmRsZWQgZXhwcmVzc2lvbiIpLCBYX29wKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbiwgZWl0aGVyIDQgb3IgOCBieXRlcy4gICovCi0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuWzBdLCA0KTsKLSAgaWYgKGZ4ICE9IE5VTEwpCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmeCwgaW5zblsxXSwgNCk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgR2FzCi0gICBjYWxscyB0aGlzIGZ1bmN0aW9uIGZvciBlYWNoIGlucHV0IGxpbmUgd2hpY2ggZG9lcyBub3QgY29udGFpbiBhCi0gICBwc2V1ZG9vcC4KLQotICBTVFIgcG9pbnRzIHRvIGEgTlVMTCB0ZXJtaW5hdGVkIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcwotICBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0IHRoZSBmcmFncy9ieXRlcyBpdCBhc3NlbWJsZXMgdG8uICAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnNjYW47Ci0gIHVuc2lnbmVkIGNoYXIgKmlucHV0X2xpbmVfc2F2ZTsKLSAgc3RydWN0IHRpYzgwX29wY29kZSAqb3Bjb2RlOwotICBleHByZXNzaW9uUyBteW9wc1sxNl07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQotICAvKiBFbnN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRoZXJlIHRvIGFzc2VtYmxlLiAqLwotICBhc3NlcnQgKHN0cik7Ci0KLSAgLyogRHJvcCBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlLiAqLwotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgewotICAgICAgc3RyKys7Ci0gICAgfQotCi0gIC8qIElzb2xhdGUgdGhlIG1uZW1vbmljIGZyb20gdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyBieSBmaW5kaW5nIHRoZSBmaXJzdAotICAgICB3aGl0ZXNwYWNlIGNoYXJhY3RlciBhbmQgemFwcGluZyBpdCB0byBhIG51bGwgYnl0ZS4gKi8KLSAgZm9yIChzY2FuID0gc3RyOyAqc2NhbiAhPSAnXDAwMCcgJiYgIWlzc3BhY2UgKCpzY2FuKTsgc2NhbisrKSB7O30KLSAgaWYgKCpzY2FuICE9ICdcMDAwJykKLSAgICB7Ci0gICAgICAqc2NhbisrID0gJ1wwMDAnOwotICAgIH0KLQotICAvKiBUcnkgdG8gZmluZCB0aGlzIG1uZW1vbmljIGluIHRoZSBoYXNoIHRhYmxlICovCi0gIGlmICgob3Bjb2RlID0gKHN0cnVjdCB0aWM4MF9vcGNvZGUgKikgaGFzaF9maW5kICh0aWM4MF9oYXNoLCBzdHIpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBtbmVtb25pYzogJyVzJyIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdHIgPSBzY2FuOwotICB3aGlsZSAoaXNzcGFjZSAoKnNjYW4pKQotICAgIHsKLSAgICAgIHNjYW4rKzsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9zYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLSAgb3Bjb2RlID0gZmluZF9vcGNvZGUgKG9wY29kZSwgbXlvcHMpOwotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIG9wZXJhbmRzOiAnJXMnIiksIGlucHV0X2xpbmVfc2F2ZSk7Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfc2F2ZTsKLSAgYnVpbGRfaW5zbiAob3Bjb2RlLCBteW9wcyk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgYXQgdGhlIHN0YXJ0IG9mIGFzc2VtYmx5LCBhZnRlciB0aGUgY29tbWFuZAotICAgbGluZSBhcmd1bWVudHMgaGF2ZSBiZWVuIHBhcnNlZCBhbmQgYWxsIHRoZSBtYWNoaW5lIGluZGVwZW5kZW50Ci0gICBpbml0aWFsaXphdGlvbnMgaGF2ZSBiZWVuIGNvbXBsZXRlZC4KLQotICAgSXQgc2hvdWxkIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjLiwgdGhhdCB0aGUgbWFjaGluZSBkZXBlbmRlbnQgcGFydCBvZgotICAgdGhlIGFzc2VtYmxlciB3aWxsIG5lZWQuICAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjaGFyICpwcmV2X25hbWUgPSAiIjsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSAqb3A7Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wX2VuZDsKLSAgY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICpwZHNwOwotICBleHRlcm4gaW50IGNvZmZfZmxhZ3M7CQkJLyogRGVmaW5lZCBpbiBvYmotY29mZi5jICovCi0KLSAgLyogU2V0IEZfQVIzMldSIGluIGNvZmZfZmxhZ3MsIHdoaWNoIHdpbGwgZW5kIHVwIGluIHRoZSBmaWxlIGhlYWRlcgotICAgICBmX2ZsYWdzIGZpZWxkLiAqLwotCi0gIGNvZmZfZmxhZ3MgfD0gRl9BUjMyV1I7CS8qIFRJYzgwIGlzIDMyIGJpdCBsaXR0bGUgZW5kaWFuICovCi0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUuICBUaGUgVEljODAgaW5zdHJ1Y3Rpb24gc2V0Ci0gICAgIGhhcyBtYW55IGlkZW50aWNhbCBvcGNvZGUgbmFtZXMgdGhhdCBoYXZlIGRpZmZlcmVudCBvcGNvZGVzIGJhc2VkCi0gICAgIG9uIHRoZSBvcGVyYW5kcy4gIFRoaXMgaGFzaCB0YWJsZSB0aGVuIHByb3ZpZGVzIGEgcXVpY2sgaW5kZXggdG8KLSAgICAgdGhlIGZpcnN0IG9wY29kZSB3aXRoIGEgcGFydGljdWxhciBuYW1lIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLwotCi0gIHRpYzgwX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgb3BfZW5kID0gdGljODBfb3Bjb2RlcyArIHRpYzgwX251bV9vcGNvZGVzOwotICBmb3IgKG9wID0gdGljODBfb3Bjb2Rlczsgb3AgPCBvcF9lbmQ7IG9wKyspCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocHJldl9uYW1lLCBvcCAtPiBuYW1lKSAhPSAwKSAKLQl7Ci0JICBwcmV2X25hbWUgPSAoY2hhciAqKSBvcCAtPiBuYW1lOwotCSAgaGFzaF9pbnNlcnQgKHRpYzgwX2hhc2gsIG9wIC0+IG5hbWUsIChjaGFyICopIG9wKTsKLQl9Ci0gICAgfQotCi0gIC8qIEluc2VydCB0aGUgcHJlZGVmaW5lZCBzeW1ib2xzIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gIFdlIHVzZSBzeW1ib2xfY3JlYXRlCi0gICAgIHJhdGhlciB0aGFuIHN5bWJvbF9uZXcgc28gdGhhdCB0aGVzZSBzeW1ib2xzIGRvbid0IGVuZCB1cCBpbiB0aGUgb2JqZWN0Ci0gICAgIGZpbGVzJyBzeW1ib2wgdGFibGUuICBOb3RlIHRoYXQgdGhlIHZhbHVlcyBvZiB0aGUgcHJlZGVmaW5lZCBzeW1ib2xzIGluY2x1ZGUKLSAgICAgc29tZSB1cHBlciBiaXRzIHRoYXQgZGlzdGluZ3Vpc2ggdGhlIHR5cGUgb2YgdGhlIHN5bWJvbCAocmVnaXN0ZXIsIGJpdG51bSwKLSAgICAgY29uZGl0aW9uIGNvZGUsIGV0YykgYW5kIHRoZXNlIGJpdHMgbXVzdCBiZSBtYXNrZWQgYXdheSBiZWZvcmUgYWN0dWFsbHkKLSAgICAgaW5zZXJ0aW5nIHRoZSB2YWx1ZXMgaW50byB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLiAgRm9yIHJlZ2lzdGVycyB3ZSBwdXQKLSAgICAgdGhlc2UgYml0cyBpbiB0aGUgc3ltYm9sIHRhYmxlIHNpbmNlIHdlIHVzZSB0aGVtIGxhdGVyIGFuZCB0aGVyZSBpcyBubwotICAgICBxdWVzdGlvbiB0aGF0IHRoZXkgYXJlbid0IHBhcnQgb2YgdGhlIHJlZ2lzdGVyIG51bWJlci4gIEZvciBjb25zdGFudHMgd2UKLSAgICAgY2FuJ3QgZG8gdGhhdCBzaW5jZSB0aGUgY29uc3RhbnQgY2FuIGJlIGFueSB2YWx1ZSwgc28gdGhleSBhcmUgbWFza2VkIG9mZgotICAgICBiZWZvcmUgcHV0dGluZyB0aGVtIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gKi8KLQotICBwZHNwID0gTlVMTDsKLSAgd2hpbGUgKChwZHNwID0gdGljODBfbmV4dF9wcmVkZWZpbmVkX3N5bWJvbCAocGRzcCkpICE9IE5VTEwpCi0gICAgewotICAgICAgc2VnVCBzZWdtZW50OwotICAgICAgdmFsdWVUIHZhbHU7Ci0gICAgICBpbnQgc3ltdHlwZTsKLQotICAgICAgc3ltdHlwZSA9IFBEU19WQUxVRSAocGRzcCkgJiBUSUM4MF9PUEVSQU5EX01BU0s7Ci0gICAgICBzd2l0Y2ggKHN5bXR5cGUpCi0JewotCWNhc2UgVElDODBfT1BFUkFORF9HUFI6Ci0JY2FzZSBUSUM4MF9PUEVSQU5EX0ZQQToKLQljYXNlIFRJQzgwX09QRVJBTkRfQ1I6Ci0JICBzZWdtZW50ID0gcmVnX3NlY3Rpb247Ci0JICB2YWx1ID0gUERTX1ZBTFVFIChwZHNwKTsKLQkgIGJyZWFrOwotCWNhc2UgVElDODBfT1BFUkFORF9DQzoKLQljYXNlIFRJQzgwX09QRVJBTkRfQklUTlVNOgotCSAgc2VnbWVudCA9IGFic29sdXRlX3NlY3Rpb247Ci0JICB2YWx1ID0gUERTX1ZBTFVFIChwZHNwKSAmIH5USUM4MF9PUEVSQU5EX01BU0s7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgaW50ZXJuYWxfZXJyb3JfYSAoXygidW5oYW5kbGVkIHByZWRlZmluZWQgc3ltYm9sIGJpdHMiKSwgc3ltdHlwZSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfY3JlYXRlIChQRFNfTkFNRSAocGRzcCksIHNlZ21lbnQsIHZhbHUsCi0JCQkJCSAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gICAgfQotfQotCi0MCi0KLS8qIFRoZSBhc3NlbWJsZXIgYWRkcyBtZF9zaG9ydG9wdHMgdG8gdGhlIHN0cmluZyBwYXNzZWQgdG8gZ2V0b3B0LiAqLwotCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLQotLyogVGhlIGFzc2VtYmxlciBhZGRzIG1kX2xvbmdvcHRzIHRvIHRoZSBtYWNoaW5lIGluZGVwZW5kZW50IGxvbmcgb3B0aW9ucwotICAgdGhhdCBhcmUgcGFzc2VkIHRvIGdldG9wdC4gKi8KLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotCi0jZGVmaW5lIE9QVElPTl9SRUxBWAkoT1BUSU9OX01EX0JBU0UpCi0gIHsicmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JFTEFYfSwKLQotI2RlZmluZSBPUFRJT05fTk9fUkVMQVgJKE9QVElPTl9SRUxBWCArIDEpCi0gIHsibm8tcmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX1JFTEFYfSwKLQotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19OwotCi1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLS8qIFRoZSBtZF9wYXJzZV9vcHRpb24gZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgZ2V0b3B0IHJldHVybnMgYW4KLSAgIHVucmVjb2duaXplZCBjb2RlLCBwcmVzdW1hYmx5IGluZGljYXRpbmcgYSBzcGVjaWFsIGNvZGUgdmFsdWUgd2hpY2gKLSAgIGFwcGVhcnMgaW4gbWRfbG9uZ29wdHMgZm9yIG1hY2hpbmUgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnMuICovCi0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSBPUFRJT05fUkVMQVg6Ci0gICAgICB0aWM4MF9yZWxheCA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9OT19SRUxBWDoKLSAgICAgIHRpYzgwX3JlbGF4ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKDApOwotICAgIH0KLSAgcmV0dXJuICgxKTsKLX0KLQotLyogVGhlIG1kX3Nob3dfdXNhZ2UgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSB1c2FnZSBtZXNzYWdlIGlzCi0gICBwcmludGVkLiAgSXQgc2hvdWxkIHByaW50IGEgZGVzY3JpcHRpb24gb2YgdGhlIG1hY2hpbmUgc3BlY2lmaWMgb3B0aW9ucwotICAgZm91bmQgaW4gbWRfbG9uZ29wdHMuICovCi0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sICJcCi1USWM4MCBvcHRpb25zOlxuXAotLXJlbGF4CQkJYWx0ZXIgUEMgcmVsYXRpdmUgYnJhbmNoIGluc3RydWN0aW9ucyB0byB1c2UgbG9uZyBmb3JtIHdoZW4gbmVlZGVkXG5cCi0tbm8tcmVsYXgJCWFsd2F5cyB1c2Ugc2hvcnQgUEMgcmVsYXRpdmUgYnJhbmNoIGluc3RydWN0aW9ucywgZXJyb3Igb24gb3ZlcmZsb3dcbiIpOwotfQotCi0MCi0vKiBBdHRlbXB0IHRvIHNpbXBsaWZ5IG9yIGV2ZW4gZWxpbWluYXRlIGEgZml4dXAuICBUaGUgcmV0dXJuIHZhbHVlIGlzCi0gICBpZ25vcmVkOyBwZXJoYXBzIGl0IHdhcyBvbmNlIG1lYW5pbmdmdWwsIGJ1dCBub3cgaXQgaXMgaGlzdG9yaWNhbC4KLSAgIFRvIGluZGljYXRlIHRoYXQgYSBmaXh1cCBoYXMgYmVlbiBlbGltaW5hdGVkLCBzZXQgZml4UC0+ZnhfZG9uZS4KLSAgICovCi0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqZGVzdCA9ICBmaXhQIC0+IGZ4X2ZyYWcgLT4gZnJfbGl0ZXJhbCArIGZpeFAgLT4gZnhfd2hlcmU7Ci0gIGludCBvdmVyZmxvdzsKLQotICBzd2l0Y2ggKGZpeFAgLT4gZnhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfUkVMTE9OR1g6Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGRlc3QsICh2YWx1ZVQpIHZhbCwgNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTVBQQ1I6Ci0gICAgICB2YWwgPj49IDI7Ci0gICAgICB2YWwgKz0gMTsJICAvKiBUYXJnZXQgYWRkcmVzcyBjb21wdXRlZCBmcm9tIGluc3Qgc3RhcnQgKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZGVzdCwgKHZhbHVlVCkgdmFsLCA0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NUFBDUjE1VzoKLSAgICAgIG92ZXJmbG93ID0gKHZhbCA8IC02NTUzNkwpIHx8ICh2YWwgPiA2NTUzMkwpOwotICAgICAgaWYgKG92ZXJmbG93KQotCXsKLQkgIGFzX2JhZF93aGVyZSAoZml4UCAtPiBmeF9maWxlLCBmaXhQIC0+IGZ4X2xpbmUsCi0JCQlfKCJQQyBvZmZzZXQgMHglbHggb3V0c2lkZSByYW5nZSAweCVseC0weCVseCIpLAotCQkJdmFsLCAtNjU1MzZMLCA2NTUzMkwpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB2YWwgPj49IDI7Ci0JICAqZGVzdCsrID0gdmFsICYgMHhGRjsKLQkgIHZhbCA+Pj0gODsKLQkgICpkZXN0ID0gKCpkZXN0ICYgMHg4MCkgfCAodmFsICYgMHg3Rik7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0FCUzoKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZGVzdCwgKHZhbHVlVCkgdmFsLCBmaXhQIC0+IGZ4X3NpemUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGludGVybmFsX2Vycm9yX2EgKF8oInVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGUgaW4gZml4dXAiKSwgZml4UCAtPiBmeF9yX3R5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0MCi0vKiBGdW5jdGlvbnMgY29uY2VybmluZyByZWxvY3MuICAqLwotCi0vKiBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCBhIFBDIHJlbGF0aXZlIGp1bXAgc2hvdWxkIGJlIGNhbGN1bGF0ZWQsCi0gICBnaXZlbiBhIFBDIHJlbGF0aXZlIHJlbG9jLgotCi0gICBGb3IgdGhlIFRJYzgwLCB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSAzMiBiaXQgb3Bjb2RlIGNvbnRhaW5pbmcKLSAgIHRoZSBQQyByZWxhdGl2ZSBmaWVsZC4gKi8KLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIChmaXhQIC0+IGZ4X2ZyYWcgLT4gZnJfYWRkcmVzcyArIGZpeFAgLT4gZnhfd2hlcmUpIDsKLX0KLQotLyoKLSAqIENhbGxlZCBhZnRlciByZWxheCgpIGlzIGZpbmlzaGVkLgotICogSW46CUFkZHJlc3Mgb2YgZnJhZy4KLSAqCWZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQuCi0gKglmcl9zdWJ0eXBlIGlzIHdoYXQgdGhlIGFkZHJlc3MgcmVsYXhlZCB0by4KLSAqCi0gKiBPdXQ6CUFueSBmaXhTcyBhbmQgY29uc3RhbnRzIGFyZSBzZXQgdXAuCi0gKglDYWxsZXIgd2lsbCB0dXJuIGZyYWcgaW50byBhICIuc3BhY2UgMCIuCi0gKi8KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWc7Ci0gICAgIGZyYWdTICpmcmFnUDsKLXsKLSAgaW50ZXJuYWxfZXJyb3IgKF8oIm1kX2NvbnZlcnRfZnJhZygpIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKSk7Ci0gIGFib3J0ICgpOwotfQotCi0MCi0vKkFSR1NVU0VEKi8KLXZvaWQKLXRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoaWdub3JlKQotICAgICBzeW1ib2xTICppZ25vcmU7Ci17Ci19Ci0KLSNpZiBkZWZpbmVkIE9CSl9DT0ZGCi0KLXNob3J0Ci10Y19jb2ZmX2ZpeDJydHlwZSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIChmaXhQIC0+IGZ4X3JfdHlwZSk7Ci19Ci0KLSNlbmRpZgkvKiBPQkpfQ09GRiAqLwotCi0vKiBlbmQgb2YgdGMtdGljODAuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy10aWM4MC5oIGIvZ2FzL2NvbmZpZy90Yy10aWM4MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmZmMjQ5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdGljODAuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy10aWM4MC5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfVElDODAKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0gJYmZkX2FyY2hfdGljODAKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkiY29mZi10aWM4MCIKLSNkZWZpbmUgQkZEX0FSQ0gJVEFSR0VUX0FSQ0gKLQotLyogV2UgbmVlZCB0aGUgZXh0cmEgZmllbGQgaW4gdGhlIGZpeHVwIHN0cnVjdCB0byBwdXQgdGhlIHJlbG9jYXRpb24gaW4uICovCi0KLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUKLQotLyogRGVmaW5lIG1kX251bWJlcl90b19jaGFycyBhcyB0aGUgYXBwcm9wcmlhdGUgc3RhbmRhcmQgYmlnIGVuZGlhbiBvcgotICAgbGl0dGxlIGVuZGlhbiBmdW5jdGlvbi4gIFNob3VsZCB3ZSBzb21lZGF5IHN1cHBvcnQgZW5kaWFubmVzcyBhcyBhCi0gICBydW50aW1lIGRlY2lzaW9uLCB0aGlzIHdpbGwgbmVlZCB0byBjaGFuZ2UuICovCi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4KLQotLyogRGVmaW5lIGF3YXkgdGhlIGNhbGwgdG8gbWRfb3BlcmFuZCBpbiB0aGUgZXhwcmVzc2lvbiBwYXJzaW5nIGNvZGUuCi0gICBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgZXhwcmVzc2lvbiBwYXJzZXIgY2FuJ3QgcGFyc2UgdGhlIGlucHV0Ci0gICBhbmQgZ2l2ZXMgdGhlIGFzc2VtYmxlciBiYWNrZW5kIGEgY2hhbmNlIHRvIGRlYWwgd2l0aCBpdCBpbnN0ZWFkLiAqLwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotI2lmZGVmIE9CSl9DT0ZGCi0KLS8qIENPRkYgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLwotCi0jZGVmaW5lIENPRkZfTUFHSUMJVElDODBfQVJDSF9NQUdJQwotCi0vKiBXaGV0aGVyIGEgcmVsb2Mgc2hvdWxkIGJlIG91dHB1dC4gICovCi0KLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoZml4cCkgKChmaXhwKSAtPiBmeF9hZGRzeSAhPSBOVUxMKQotCi0vKiBUaGlzIG1hY3JvIHRyYW5zbGF0ZXMgYmV0d2VlbiBhbiBpbnRlcm5hbCBmaXggYW5kIGFuIGNvZmYgcmVsb2MgdHlwZSAqLwotCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeFApIHRjX2NvZmZfZml4MnJ0eXBlKGZpeFApCi0KLWV4dGVybiBzaG9ydCB0Y19jb2ZmX2ZpeDJydHlwZSAoKTsKLQotI2VuZGlmCS8qIE9CSl9DT0ZGICovCi0KLS8qIGVuZCBvZiB0Yy10aWM4MC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXY4NTAuYyBiL2dhcy9jb25maWcvdGMtdjg1MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGFiMTQ1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdjg1MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3OCArMCwwIEBACi0vKiB0Yy12ODUwLmMgLS0gQXNzZW1ibGVyIGNvZGUgZm9yIHRoZSBORUMgVjg1MAotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIgICAgIAotI2luY2x1ZGUgIm9wY29kZS92ODUwLmgiCi0KLSNkZWZpbmUgQVJFQV9aREEgMAotI2RlZmluZSBBUkVBX1NEQSAxCi0jZGVmaW5lIEFSRUFfVERBIDIKLQotLyogc2lnbi1leHRlbmQgYSAxNi1iaXQgbnVtYmVyICovCi0jZGVmaW5lIFNFWFQxNih4KQkoKCgoeCkgJiAweGZmZmYpIF4gKH4gMHg3ZmZmKSkgKyAweDgwMDApCi0KLS8qIFRlbXBvcmFyaWx5IGhvbGRzIHRoZSByZWxvYyBpbiBhIGNvbnMgZXhwcmVzc2lvbi4gICovCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGhvbGRfY29uc19yZWxvYzsKLQotLyogU2V0IHRvIFRSVUUgaWYgd2Ugd2FudCB0byBiZSBwZWRhbnRpYyBhYm91dCBzaWduZWQgb3ZlcmZsb3dzLiAgKi8KLXN0YXRpYyBib29sZWFuIHdhcm5fc2lnbmVkX292ZXJmbG93cyAgID0gRkFMU0U7Ci1zdGF0aWMgYm9vbGVhbiB3YXJuX3Vuc2lnbmVkX292ZXJmbG93cyA9IEZBTFNFOwotCi0vKiBJbmRpY2F0ZXMgdGhlIHRhcmdldCBCRkQgbWFjaGluZSBudW1iZXIuICAqLwotc3RhdGljIGludCAgICAgbWFjaGluZSA9IC0xOwotCi0vKiBJbmRpY2F0ZXMgdGhlIHRhcmdldCBwcm9jZXNzb3IocykgZm9yIHRoZSBhc3NlbWJsZS4gICovCi1zdGF0aWMgdW5zaWduZWQgaW50CXByb2Nlc3Nvcl9tYXNrID0gLTE7Ci0KLQwKLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KLXN0cnVjdCByZWdfbmFtZQotewotICBjb25zdCBjaGFyICogbmFtZTsKLSAgaW50ICAgICAgICAgIHZhbHVlOwotfTsKLQotLyogR2VuZXJpYyBhc3NlbWJsZXIgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBtdXN0IGJlIGRlZmluZWQgYnkgYWxsIHRhcmdldHMuICovCi0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIjsjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtYXkgYmUgdXNlZCB0byBzZXBhcmF0ZSBtdWx0aXBsZSBjb21tYW5kcyBvbiBhIAotICAgc2luZ2xlIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFyZSB1c2VkIHRvIGluZGljYXRlIGFuIGV4cG9uZW50IGluIGEgZmxvYXRpbmcgCi0gICBwb2ludCBudW1iZXIuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWVhbiB0aGF0IGEgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsIAotICAgYXMgaW4gMGQxLjAuICAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRCI7Ci0MCi0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotICAvKiBDb25kaXRpb25hbCBicmFuY2hlcy4gICovCi0gIHsweGZmLCAgICAgLTB4MTAwLCAgICAyLCAxfSwKLSAgezB4MWZmZmZmLCAtMHgyMDAwMDAsIDYsIDB9LAotICAvKiBVbmNvbmRpdGlvbmFsIGJyYW5jaGVzLiAgKi8KLSAgezB4ZmYsICAgICAtMHgxMDAsICAgIDIsIDN9LAotICB7MHgxZmZmZmYsIC0weDIwMDAwMCwgNCwgMH0sCi19OwotCi0KLXN0YXRpYyBzZWdUIHNkYXRhX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1QgdGRhdGFfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCB6ZGF0YV9zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHNic3Nfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCB0YnNzX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1QgemJzc19zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHJvc2RhdGFfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCByb3pkYXRhX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1Qgc2NvbW1vbl9zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHRjb21tb25fc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCB6Y29tbW9uX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1QgY2FsbF90YWJsZV9kYXRhX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1QgY2FsbF90YWJsZV90ZXh0X3NlY3Rpb24gPSBOVUxMOwotCi0vKiBmaXh1cHMgKi8KLSNkZWZpbmUgTUFYX0lOU05fRklYVVBTICg1KQotc3RydWN0IHY4NTBfZml4dXAKLXsKLSAgZXhwcmVzc2lvblMgICAgICAgICAgICAgIGV4cDsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgIG9waW5kZXg7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLX07Ci0KLXN0cnVjdCB2ODUwX2ZpeHVwIGZpeHVwcyBbTUFYX0lOU05fRklYVVBTXTsKLXN0YXRpYyBpbnQgZmM7Ci0KLQwKLXZvaWQKLXY4NTBfc2RhdGEgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAoc2RhdGFfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX3RkYXRhIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKHRkYXRhX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX3pkYXRhIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKHpkYXRhX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX3Nic3MgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAoc2Jzc19zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF90YnNzIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKHRic3Nfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfemJzcyAoaW50IGlnbm9yZSkKLXsKLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0gIAotICBzdWJzZWdfc2V0ICh6YnNzX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX3Jvc2RhdGEgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAocm9zZGF0YV9zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF9yb3pkYXRhIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKHJvemRhdGFfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfY2FsbF90YWJsZV9kYXRhIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKGNhbGxfdGFibGVfZGF0YV9zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF9jYWxsX3RhYmxlX3RleHQgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAoY2FsbF90YWJsZV90ZXh0X3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX2JzcyAoaW50IGlnbm9yZSkKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAoc3Vic2VnVCkgdGVtcCk7Ci0gICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF9vZmZzZXQgKGludCBpZ25vcmUpCi17Ci0gIGludCB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIAotICB0ZW1wIC09IGZyYWdfbm93X2ZpeCgpOwotICAKLSAgaWYgKHRlbXAgPiAwKQotICAgICh2b2lkKSBmcmFnX21vcmUgKHRlbXApOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogQ29waWVkIGZyb20gb2JqX2VsZl9jb21tb24oKSBpbiBnYXMvY29uZmlnL29iai1lbGYuYyAqLwotc3RhdGljIHZvaWQKLXY4NTBfY29tbSAoYXJlYSkKLSAgICAgaW50IGFyZWE7Ci17Ci0gIGNoYXIgKiAgICBuYW1lOwotICBjaGFyICAgICAgYzsKLSAgY2hhciAqICAgIHA7Ci0gIGludCAgICAgICB0ZW1wOwotICBpbnQgICAgICAgc2l6ZTsKLSAgc3ltYm9sUyAqIHN5bWJvbFA7Ci0gIGludCAgICAgICBoYXZlX2FsaWduOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgCi0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIAotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIAotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgaW5wdXRfbGluZV9wb2ludGVyICsrOwkJLyogc2tpcCAnLCcgKi8KLSAgCi0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygiLkNPTU1vbiBsZW5ndGggKCVkLikgPCAwISBJZ25vcmVkLiIpLCB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgc2l6ZSA9IHRlbXA7Ci0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0gIAotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gc2l6ZSkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgYXNfd2FybiAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWQuIiksCi0JCSAgIFNfR0VUX05BTUUgKHN5bWJvbFApLCAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplKTsKLQl9Ci0gICAgfQotICAKLSAga25vdyAoc3ltYm9sUC0+c3lfZnJhZyA9PSAmIHplcm9fYWRkcmVzc19mcmFnKTsKLSAgCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICBoYXZlX2FsaWduID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGhhdmVfYWxpZ24gPSAxOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotICAKLSAgaWYgKCEgaGF2ZV9hbGlnbiB8fCAqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLSAgICB7Ci0gICAgICBpZiAoISBoYXZlX2FsaWduKQotCXRlbXAgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIAotCSAgaWYgKHRlbXAgPCAwKQotCSAgICB7Ci0JICAgICAgdGVtcCA9IDA7Ci0JICAgICAgYXNfd2FybiAoXygiQ29tbW9uIGFsaWdubWVudCBuZWdhdGl2ZTsgMCBhc3N1bWVkIikpOwotCSAgICB9Ci0JfQotICAgICAgCi0gICAgICBpZiAoc3ltYm9sUC0+bG9jYWwpCi0JewotCSAgc2VnVCAgIG9sZF9zZWM7Ci0JICBpbnQgICAgb2xkX3N1YnNlYzsKLQkgIGNoYXIgKiBwZnJhZzsKLQkgIGludCAgICBhbGlnbjsKLQkgIGZsYWd3b3JkCWFwcGxpY2FibGU7Ci0KLQkgIG9sZF9zZWMgPSBub3dfc2VnOwotCSAgb2xkX3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0gICAgICAKLQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCQkgIAotCSAgYXBwbGljYWJsZSAmPSBTRUNfQUxMT0M7Ci0JICAKLQkgIHN3aXRjaCAoYXJlYSkKLQkgICAgewotCSAgICBjYXNlIEFSRUFfU0RBOgotCSAgICAgIGlmIChzYnNzX3NlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgIHNic3Nfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuc2JzcyIsIDApOwotCSAgICAgIAotCQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzYnNzX3NlY3Rpb24sIGFwcGxpY2FibGUpOwotCSAgICAgIAotCQkgIHNlZ19pbmZvIChzYnNzX3NlY3Rpb24pLT5ic3MgPSAxOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAKLQkgICAgY2FzZSBBUkVBX1pEQToKLQkgICAgICBpZiAoemJzc19zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICB6YnNzX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnpic3MiLCAwKTsKLQkJICAKLQkJICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2Jzc19zZWN0aW9uLCBhcHBsaWNhYmxlKTsKLQkgICAgICAKLQkJICBzZWdfaW5mbyAoemJzc19zZWN0aW9uKS0+YnNzID0gMTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgCi0JICAgIGNhc2UgQVJFQV9UREE6Ci0JICAgICAgaWYgKHRic3Nfc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgdGJzc19zZWN0aW9uID0gc3Vic2VnX25ldyAoIi50YnNzIiwgMCk7Ci0JCSAgCi0JCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHRic3Nfc2VjdGlvbiwgYXBwbGljYWJsZSk7Ci0JCSAgCi0JCSAgc2VnX2luZm8gKHRic3Nfc2VjdGlvbiktPmJzcyA9IDE7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAodGVtcCkKLQkgICAgewotCSAgICAgIC8qIGNvbnZlcnQgdG8gYSBwb3dlciBvZiAyIGFsaWdubWVudCAqLwotCSAgICAgIGZvciAoYWxpZ24gPSAwOyAodGVtcCAmIDEpID09IDA7IHRlbXAgPj49IDEsICsrYWxpZ24pCi0JCTsKLQkgICAgICAKLQkgICAgICBpZiAodGVtcCAhPSAxKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJDb21tb24gYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7Ci0JCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICBhbGlnbiA9IDA7Ci0JICAKLQkgIHN3aXRjaCAoYXJlYSkKLQkgICAgewotCSAgICBjYXNlIEFSRUFfU0RBOgotCSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKHNic3Nfc2VjdGlvbiwgYWxpZ24pOwotCSAgICAgIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotCSAgICAgIHN1YnNlZ19zZXQgKHNic3Nfc2VjdGlvbiwgMCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBUkVBX1pEQToKLQkgICAgICByZWNvcmRfYWxpZ25tZW50ICh6YnNzX3NlY3Rpb24sIGFsaWduKTsKLQkgICAgICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLQkgICAgICBzdWJzZWdfc2V0ICh6YnNzX3NlY3Rpb24sIDApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQVJFQV9UREE6Ci0JICAgICAgcmVjb3JkX2FsaWdubWVudCAodGJzc19zZWN0aW9uLCBhbGlnbik7Ci0JICAgICAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0JICAgICAgc3Vic2VnX3NldCAodGJzc19zZWN0aW9uLCAwKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0KCk7Ci0JICAgIH0KLQkgIAotCSAgaWYgKGFsaWduKQotCSAgICBmcmFnX2FsaWduIChhbGlnbiwgMCwgMCk7Ci0KLQkgIHN3aXRjaCAoYXJlYSkKLQkgICAgewotCSAgICBjYXNlIEFSRUFfU0RBOgotCSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBzYnNzX3NlY3Rpb24pCi0JCXN5bWJvbFAtPnN5X2ZyYWctPmZyX3N5bWJvbCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBUkVBX1pEQToKLQkgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gemJzc19zZWN0aW9uKQotCQlzeW1ib2xQLT5zeV9mcmFnLT5mcl9zeW1ib2wgPSAwOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQVJFQV9UREE6Ci0JICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHRic3Nfc2VjdGlvbikKLQkJc3ltYm9sUC0+c3lfZnJhZy0+ZnJfc3ltYm9sID0gMDsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0KCk7Ci0JICAgIH0KLQkgIAotCSAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWdfbm93OwotCSAgcGZyYWcgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBzeW1ib2xQLAotCQkJICAgIChvZmZzZXRUKSBzaXplLCAoY2hhciAqKSAwKTsKLQkgICpwZnJhZyA9IDA7Ci0JICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLQkgIAotCSAgc3dpdGNoIChhcmVhKQotCSAgICB7Ci0JICAgIGNhc2UgQVJFQV9TREE6Ci0JICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgc2Jzc19zZWN0aW9uKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBBUkVBX1pEQToKLQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCB6YnNzX3NlY3Rpb24pOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIEFSRUFfVERBOgotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHRic3Nfc2VjdGlvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCSAgICAKLQkgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0JICBzdWJzZWdfc2V0IChvbGRfc2VjLCBvbGRfc3Vic2VjKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCWFsbG9jYXRlX2NvbW1vbjoKLQkgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBzaXplKTsKLQkgIFNfU0VUX0FMSUdOIChzeW1ib2xQLCB0ZW1wKTsKLQkgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIAotCSAgc3dpdGNoIChhcmVhKQotCSAgICB7Ci0JICAgIGNhc2UgQVJFQV9TREE6Ci0JICAgICAgaWYgKHNjb21tb25fc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgZmxhZ3dvcmQJYXBwbGljYWJsZTsKLQkJICAKLQkJICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkJICAKLQkJICBzY29tbW9uX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnNjb21tb24iLCAwKTsKLQkJICAKLQkJICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2NvbW1vbl9zZWN0aW9uLCBhcHBsaWNhYmxlCi0JCSAgICAgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfREFUQQotCQkJfCBTRUNfSEFTX0NPTlRFTlRTKSB8IFNFQ19JU19DT01NT04pOwotCQl9Ci0JICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgc2NvbW1vbl9zZWN0aW9uKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBBUkVBX1pEQToKLQkgICAgICBpZiAoemNvbW1vbl9zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICBmbGFnd29yZAlhcHBsaWNhYmxlOwotCQkgIAotCQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCQkgIAotCQkgIHpjb21tb25fc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuemNvbW1vbiIsIDApOwotCQkgIAotCQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCB6Y29tbW9uX3NlY3Rpb24sIGFwcGxpY2FibGUKLQkJICAgICAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19EQVRBCi0JCQl8IFNFQ19IQVNfQ09OVEVOVFMpIHwgU0VDX0lTX0NPTU1PTik7Ci0JCX0KLQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCB6Y29tbW9uX3NlY3Rpb24pOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIEFSRUFfVERBOgotCSAgICAgIGlmICh0Y29tbW9uX3NlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgIGZsYWd3b3JkCWFwcGxpY2FibGU7Ci0JCSAgCi0JCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JCSAgCi0JCSAgdGNvbW1vbl9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi50Y29tbW9uIiwgMCk7Ci0JCSAgCi0JCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHRjb21tb25fc2VjdGlvbiwgYXBwbGljYWJsZQotCQkgICAgICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0RBVEEKLQkJCXwgU0VDX0hBU19DT05URU5UUykgfCBTRUNfSVNfQ09NTU9OKTsKLQkJfQotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHRjb21tb25fc2VjdGlvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIC8qIEBAIFNvbWUgdXNlIHRoZSBkb3QsIHNvbWUgZG9uJ3QuICBDYW4gd2UgZ2V0IHNvbWUgY29uc2lzdGVuY3k/PyAgKi8KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcuJykKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIC8qIEBAIFNvbWUgc2F5IGRhdGEsIHNvbWUgc2F5IGJzcy4gICovCi0gICAgICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiYnNzXCIiLCA0KQotCSAgJiYgc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiZGF0YVwiIiwgNSkpCi0JewotCSAgd2hpbGUgKCotLWlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0JICAgIDsKLQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotCSAgZ290byBiYWRfY29tbW9uX3NlZ21lbnQ7Ci0JfQotICAgICAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnIicpCi0JOwotICAgICAgZ290byBhbGxvY2F0ZV9jb21tb247Ci0gICAgfQotCi0gIHN5bWJvbFAtPmJzeW0tPmZsYWdzIHw9IEJTRl9PQkpFQ1Q7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcmV0dXJuOwotCi0gIHsKLSAgYmFkX2NvbW1vbl9zZWdtZW50OgotICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgd2hpbGUgKCpwICYmICpwICE9ICdcbicpCi0gICAgICBwKys7Ci0gICAgYyA9ICpwOwotICAgICpwID0gJ1wwJzsKLSAgICBhc19iYWQgKF8oImJhZCAuY29tbW9uIHNlZ21lbnQgJXMiKSwgaW5wdXRfbGluZV9wb2ludGVyICsgMSk7Ci0gICAgKnAgPSBjOwotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0gICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZAotc2V0X21hY2hpbmUgKGludCBudW1iZXIpCi17Ci0gIG1hY2hpbmUgPSBudW1iZXI7Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIFRBUkdFVF9BUkNILCBtYWNoaW5lKTsKLQotICBzd2l0Y2ggKG1hY2hpbmUpCi0gICAgewotICAgIGNhc2UgMDogcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MDsgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF92ODUwZTogIHByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlYTogcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MEVBOyBicmVhazsKLSAgICB9Ci19Ci0KLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsic2RhdGEiLCAgIHY4NTBfc2RhdGEsICAgMH0sCi0gIHsidGRhdGEiLCAgIHY4NTBfdGRhdGEsICAgMH0sCi0gIHsiemRhdGEiLCAgIHY4NTBfemRhdGEsICAgMH0sCi0gIHsic2JzcyIsICAgIHY4NTBfc2JzcywgICAgMH0sCi0gIHsidGJzcyIsICAgIHY4NTBfdGJzcywgICAgMH0sCi0gIHsiemJzcyIsICAgIHY4NTBfemJzcywgICAgMH0sCi0gIHsicm9zZGF0YSIsIHY4NTBfcm9zZGF0YSwgMH0sCi0gIHsicm96ZGF0YSIsIHY4NTBfcm96ZGF0YSwgMH0sCi0gIHsiYnNzIiwgICAgIHY4NTBfYnNzLCAgICAgMH0sCi0gIHsib2Zmc2V0IiwgIHY4NTBfb2Zmc2V0LCAgMH0sCi0gIHsid29yZCIsICAgIGNvbnMsICAgICAgICAgNH0sCi0gIHsiemNvbW0iLCAgIHY4NTBfY29tbSwgICAgQVJFQV9aREF9LAotICB7InNjb21tIiwgICB2ODUwX2NvbW0sICAgIEFSRUFfU0RBfSwKLSAgeyJ0Y29tbSIsICAgdjg1MF9jb21tLCAgICBBUkVBX1REQX0sCi0gIHsidjg1MCIsICAgIHNldF9tYWNoaW5lLCAgMH0sCi0gIHsiY2FsbF90YWJsZV9kYXRhIiwgdjg1MF9jYWxsX3RhYmxlX2RhdGEsIDB9LAotICB7ImNhbGxfdGFibGVfdGV4dCIsIHY4NTBfY2FsbF90YWJsZV90ZXh0LCAwfSwKLSAgeyJ2ODUwZSIsICAgICAgICAgICBzZXRfbWFjaGluZSwgICAgICAgICAgYmZkX21hY2hfdjg1MGV9LAotICB7InY4NTBlYSIsICAgICAgICAgIHNldF9tYWNoaW5lLCAgICAgICAgICBiZmRfbWFjaF92ODUwZWF9LAotICB7IE5VTEwsICAgICBOVUxMLCAgICAgICAgIDB9Ci19OwotCi0vKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqdjg1MF9oYXNoOwotCi0vKiBUaGlzIHRhYmxlIGlzIHNvcnRlZC4gU3VpdGFibGUgZm9yIHNlYXJjaGluZyBieSBhIGJpbmFyeSBzZWFyY2guICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiZXAiLCAgMzAgfSwJCS8qIGVwIC0gZWxlbWVudCBwdHIgKi8KLSAgeyAiZ3AiLCAgIDQgfSwJCS8qIGdwIC0gZ2xvYmFsIHB0ciAqLwotICB7ICJocCIsICAgMiB9LAkJLyogaHAgLSBoYW5kbGVyIHN0YWNrIHB0ciAqLwotICB7ICJscCIsICAzMSB9LAkJLyogbHAgLSBsaW5rIHB0ciAqLwotICB7ICJyMCIsICAgMCB9LAotICB7ICJyMSIsICAgMSB9LAotICB7ICJyMTAiLCAxMCB9LAotICB7ICJyMTEiLCAxMSB9LAotICB7ICJyMTIiLCAxMiB9LAotICB7ICJyMTMiLCAxMyB9LAotICB7ICJyMTQiLCAxNCB9LAotICB7ICJyMTUiLCAxNSB9LAotICB7ICJyMTYiLCAxNiB9LAotICB7ICJyMTciLCAxNyB9LAotICB7ICJyMTgiLCAxOCB9LAotICB7ICJyMTkiLCAxOSB9LAotICB7ICJyMiIsICAgMiB9LAotICB7ICJyMjAiLCAyMCB9LAotICB7ICJyMjEiLCAyMSB9LAotICB7ICJyMjIiLCAyMiB9LAotICB7ICJyMjMiLCAyMyB9LAotICB7ICJyMjQiLCAyNCB9LAotICB7ICJyMjUiLCAyNSB9LAotICB7ICJyMjYiLCAyNiB9LAotICB7ICJyMjciLCAyNyB9LAotICB7ICJyMjgiLCAyOCB9LAotICB7ICJyMjkiLCAyOSB9LAotICB7ICJyMyIsICAgMyB9LAotICB7ICJyMzAiLCAzMCB9LAotICB7ICJyMzEiLCAzMSB9LAotICB7ICJyNCIsICAgNCB9LAotICB7ICJyNSIsICAgNSB9LAotICB7ICJyNiIsICAgNiB9LAotICB7ICJyNyIsICAgNyB9LAotICB7ICJyOCIsICAgOCB9LAotICB7ICJyOSIsICAgOSB9LAotICB7ICJzcCIsICAgMyB9LAkJLyogc3AgLSBzdGFjayBwdHIgKi8KLSAgeyAidHAiLCAgIDUgfSwJCS8qIHRwIC0gdGV4dCBwdHIgKi8KLSAgeyAiemVybyIsIDAgfSwKLX07Ci0jZGVmaW5lIFJFR19OQU1FX0NOVAkoc2l6ZW9mIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpIC8gc2l6ZW9mIChzdHJ1Y3QgcmVnX25hbWUpKQotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgc3lzdGVtX3JlZ2lzdGVyc1tdID0gCi17Ci0gIHsgImN0YnAiLCAgMjAgfSwKLSAgeyAiY3RwYyIsICAxNiB9LAotICB7ICJjdHBzdyIsIDE3IH0sCi0gIHsgImRicGMiLCAgMTggfSwKLSAgeyAiZGJwc3ciLCAxOSB9LAotICB7ICJlY3IiLCAgICA0IH0sCi0gIHsgImVpcGMiLCAgIDAgfSwKLSAgeyAiZWlwc3ciLCAgMSB9LAotICB7ICJmZXBjIiwgICAyIH0sCi0gIHsgImZlcHN3IiwgIDMgfSwKLSAgeyAicHN3IiwgICAgNSB9LAotfTsKLSNkZWZpbmUgU1lTUkVHX05BTUVfQ05UCShzaXplb2YgKHN5c3RlbV9yZWdpc3RlcnMpIC8gc2l6ZW9mIChzdHJ1Y3QgcmVnX25hbWUpKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIHN5c3RlbV9saXN0X3JlZ2lzdGVyc1tdID0KLXsKLSAgeyJQUyIsICAgICAgNSB9LAotICB7IlNSIiwgICAgICAwICsgMX0KLX07Ci0jZGVmaW5lIFNZU1JFR0xJU1RfTkFNRV9DTlQJKHNpemVvZiAoc3lzdGVtX2xpc3RfcmVnaXN0ZXJzKSAvIHNpemVvZiAoc3RydWN0IHJlZ19uYW1lKSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBjY19uYW1lc1tdID0KLXsKLSAgeyAiYyIsICAweDEgfSwKLSAgeyAiZSIsICAweDIgfSwKLSAgeyAiZ2UiLCAweGUgfSwKLSAgeyAiZ3QiLCAweGYgfSwKLSAgeyAiaCIsICAweGIgfSwKLSAgeyAibCIsICAweDEgfSwKLSAgeyAibGUiLCAweDcgfSwKLSAgeyAibHQiLCAweDYgfSwKLSAgeyAibiIsICAweDQgfSwKLSAgeyAibmMiLCAweDkgfSwKLSAgeyAibmUiLCAweGEgfSwKLSAgeyAibmgiLCAweDMgfSwKLSAgeyAibmwiLCAweDkgfSwKLSAgeyAibnMiLCAweGMgfSwKLSAgeyAibnYiLCAweDggfSwKLSAgeyAibnoiLCAweGEgfSwKLSAgeyAicCIsICAweGMgfSwKLSAgeyAicyIsICAweDQgfSwKLSAgeyAic2EiLCAweGQgfSwKLSAgeyAidCIsICAweDUgfSwKLSAgeyAidiIsICAweDAgfSwKLSAgeyAieiIsICAweDIgfSwKLX07Ci0jZGVmaW5lIENDX05BTUVfQ05UCShzaXplb2YgKGNjX25hbWVzKSAvIHNpemVvZiAoc3RydWN0IHJlZ19uYW1lKSkKLQotLyogcmVnX25hbWVfc2VhcmNoIGRvZXMgYSBiaW5hcnkgc2VhcmNoIG9mIHRoZSBnaXZlbiByZWdpc3RlciB0YWJsZQotICAgdG8gc2VlIGlmICJuYW1lIiBpcyBhIHZhbGlkIHJlZ2l0ZXIgbmFtZS4gIFJldHVybnMgdGhlIHJlZ2lzdGVyCi0gICBudW1iZXIgZnJvbSB0aGUgYXJyYXkgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4gKi8KLQotc3RhdGljIGludAotcmVnX25hbWVfc2VhcmNoIChyZWdzLCByZWdjb3VudCwgbmFtZSwgYWNjZXB0X251bWJlcnMpCi0gICAgIGNvbnN0IHN0cnVjdCByZWdfbmFtZSAqIHJlZ3M7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgICAgIHJlZ2NvdW50OwotICAgICBjb25zdCBjaGFyICogICAgICAgICAgICBuYW1lOwotICAgICBib29sZWFuICAgICAgICAgICAgICAgICBhY2NlcHRfbnVtYmVyczsKLXsKLSAgaW50IG1pZGRsZSwgbG93LCBoaWdoOwotICBpbnQgY21wOwotICBzeW1ib2xTICogc3ltYm9sUDsKLQotICAvKiBJZiB0aGUgcmVnaXN0ZXIgbmFtZSBpcyBhIHN5bWJvbCwgdGhlbiBldmFsdWF0ZSBpdC4gICovCi0gIGlmICgoc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIGFuIGFsaWFzIGZvciBhbm90aGVyIG5hbWUgdGhlbiB1c2UgdGhhdC4KLQkgSWYgdGhlIHN5bWJvbCBpcyBhbiBhbGlhcyBmb3IgYSBudW1iZXIsIHRoZW4gcmV0dXJuIHRoZSBudW1iZXIuICAqLwotICAgICAgaWYgKHN5bWJvbFAtPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wpCi0JewotCSAgbmFtZSA9IFNfR0VUX05BTUUgKHN5bWJvbFAtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbCk7Ci0JfQotICAgICAgZWxzZSBpZiAoYWNjZXB0X251bWJlcnMpCi0JewotCSAgaW50IHJlZyA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLQkgIAotCSAgaWYgKHJlZyA+PSAwICYmIHJlZyA8PSAzMSkKLQkgICAgcmV0dXJuIHJlZzsKLQl9Ci0KLSAgICAgIC8qIE90aGVyd2lzZSBkcm9wIHRocm91Z2ggYW5kIHRyeSBwYXJzaW5nIG5hbWUgbm9ybWFsbHkuICAqLwotICAgIH0KLSAgCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSByZWdjb3VudCAtIDE7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgY21wID0gc3RyY2FzZWNtcCAobmFtZSwgcmVnc1ttaWRkbGVdLm5hbWUpOwotICAgICAgaWYgKGNtcCA8IDApCi0JaGlnaCA9IG1pZGRsZSAtIDE7Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCWxvdyA9IG1pZGRsZSArIDE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIHJlZ3NbbWlkZGxlXS52YWx1ZTsKLSAgICB9Ci0gIHdoaWxlIChsb3cgPD0gaGlnaCk7Ci0gIHJldHVybiAtMTsKLX0KLQotCi0vKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUDsKLXsKLSAgaW50ICAgIHJlZ19udW1iZXI7Ci0gIGNoYXIgKiBuYW1lOwotICBjaGFyICogc3RhcnQ7Ci0gIGNoYXIgICBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAocHJlX2RlZmluZWRfcmVnaXN0ZXJzLCBSRUdfTkFNRV9DTlQsCi0JCQkJbmFtZSwgRkFMU0UpOwotCi0gICogaW5wdXRfbGluZV9wb2ludGVyID0gYzsJLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAKLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgICAgICAgICA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCAgPSBOVUxMOwotICAgICAgCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OwotICAgICAgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBTdW1tYXJ5IG9mIHN5c3RlbV9yZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46ICBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKiAgICAgIGV4cHJlc3Npb25QIHBvaW50cyB0byBhbiBleHByZXNzaW9uIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQgaW4uCi0gKiAgICAgIGFjY2VwdF9udW1iZXJzIGlzIHRydWUgaWZmIG51bWVyaWNhbCByZWdpc3RlciBuYW1lcyBtYXkgYmUgdXNlZC4KLSAqICAgICAgYWNjZXB0X2xpc3RfbmFtZXMgaXMgdHJ1ZSBpZmYgdGhlIHNwZWNpYWwgbmFtZXMgUFMgYW5kIFNSIG1heSBiZSAKLSAqICAgICAgYWNjZXB0ZWQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TIHN0cnVjdHVyZSBpbiBleHByZXNzaW9uUC4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1zeXN0ZW1fcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblAsIGFjY2VwdF9udW1iZXJzLCBhY2NlcHRfbGlzdF9uYW1lcykKLSAgICAgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUDsKLSAgICAgYm9vbGVhbiAgICAgICBhY2NlcHRfbnVtYmVyczsKLSAgICAgYm9vbGVhbiAgICAgICBhY2NlcHRfbGlzdF9uYW1lczsKLXsKLSAgaW50ICAgIHJlZ19udW1iZXI7Ci0gIGNoYXIgKiBuYW1lOwotICBjaGFyICogc3RhcnQ7Ci0gIGNoYXIgICBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKHN5c3RlbV9yZWdpc3RlcnMsIFNZU1JFR19OQU1FX0NOVCwgbmFtZSwKLQkJCQlhY2NlcHRfbnVtYmVycyk7Ci0KLSAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgCi0gIGlmIChyZWdfbnVtYmVyIDwgMAotICAgICAgJiYgYWNjZXB0X251bWJlcnMpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICAgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0KLSAgICAgIGlmIChpc2RpZ2l0ICgqIGlucHV0X2xpbmVfcG9pbnRlcikpCi0JewotCSAgcmVnX251bWJlciA9IHN0cnRvbCAoaW5wdXRfbGluZV9wb2ludGVyLCAmIGlucHV0X2xpbmVfcG9pbnRlciwgMTApOwotCi0JICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgcmVnaXN0ZXIgbnVtYmVyIGlzIGFsbG93YWJsZS4gKi8KLQkgIGlmICggICByZWdfbnVtYmVyIDwgMAotCQkgfHwgcmVnX251bWJlciA+IDUKLQkJICYmIHJlZ19udW1iZXIgPCAxNgotCQkgfHwgcmVnX251bWJlciA+IDIwCi0JCSApCi0JICAgIHsKLQkgICAgICByZWdfbnVtYmVyID0gLTE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChhY2NlcHRfbGlzdF9uYW1lcykKLQl7Ci0JICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChzeXN0ZW1fbGlzdF9yZWdpc3RlcnMsCi0JCQkJCVNZU1JFR0xJU1RfTkFNRV9DTlQsIG5hbWUsIEZBTFNFKTsKLQotCSAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLQl9Ci0gICAgfQotICAKLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgICAgICAgICA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCAgPSBOVUxMOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OwotICAgICAgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBTdW1tYXJ5IG9mIGNjX25hbWUoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1jY19uYW1lIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUDsKLXsKLSAgaW50ICAgIHJlZ19udW1iZXI7Ci0gIGNoYXIgKiBuYW1lOwotICBjaGFyICogc3RhcnQ7Ci0gIGNoYXIgICBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGNjX25hbWVzLCBDQ19OQU1FX0NOVCwgbmFtZSwgRkFMU0UpOwotCi0gICogaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gIAotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCAgICAgICAgID0gT19jb25zdGFudDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sICA9IE5VTEw7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7Ci0gICAgICAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1za2lwX3doaXRlX3NwYWNlICh2b2lkKQotewotICB3aGlsZSAoICAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJyAnCi0JIHx8ICogaW5wdXRfbGluZV9wb2ludGVyID09ICdcdCcpCi0gICAgKysgaW5wdXRfbGluZV9wb2ludGVyOwotfQotCi0vKiBTdW1tYXJ5IG9mIHBhcnNlX3JlZ2lzdGVyX2xpc3QgKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciAgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIGEgbGlzdCBvZiByZWdpc3RlcnMuCi0gKiAgICAgaW5zbiAgICAgICAgICAgICAgICBpcyB0aGUgcGFydGlhbGx5IGNvbnN0cnVjdGVkIGluc3RydWN0aW9uLgotICogICAgIG9wZXJhbmQgICAgICAgICAgICAgaXMgdGhlIG9wZXJhbmQgYmVpbmcgaW5zZXJ0ZWQuCi0gKgotICogb3V0OiBOVUxMIGlmIHRoZSBwYXJzZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgYQotICogICAgICBwb2ludGVyIHRvIGFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQuICBJZiB0aGUgcGFyc2UKLSAqICAgICAgY29tcGxldGVzIHRoZSBjb3JyZWN0IGJpdCBmaWVsZHMgaW4gdGhlIGluc3RydWN0aW9uCi0gKiAgICAgIHdpbGwgYmUgZmlsbGVkIGluLgotICoKLSAqIFBhcnNlcyByZWdpc3RlciBsaXN0cyB3aXRoIHRoZSBzeW50YXg6Ci0gKgotICogICB7IHJYIH0KLSAqICAgeyByWCwgclkgfQotICogICB7IHJYIC0gclkgfQotICogICB7IHJYIC0gclksIHJaIH0KLSAqICAgZXRjCi0gKgotICogYW5kIGFsc28gcGFyc2VzIGNvbnN0YW50IGVweHJlc3Npb25zIHdob2VzIGJpdHMgaW5kaWNhdGUgdGhlCi0gKiByZWdpc3RlcnMgaW4gdGhlIGxpc3RzLiAgVGhlIExTQiBpbiB0aGUgZXhwcmVzc2lvbiByZWZlcnMgdG8KLSAqIHRoZSBsb3dlc3QgbnVtYmVyZWQgcGVybWlzc2FibGUgcmVnaXN0ZXIgaW4gdGhlIHJlZ2lzdGVyIGxpc3QsCi0gKiBhbmQgc28gb24gdXB3YXJkcy4gIFN5c3RlbSByZWdpc3RlcnMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgdmVyeQotICogaGlnaCBudW1iZXJzLgotICogCi0gKi8KLXN0YXRpYyBjaGFyICoKLXBhcnNlX3JlZ2lzdGVyX2xpc3QKLSgKLSAgdW5zaWduZWQgbG9uZyAqICAgICAgICAgICAgIGluc24sCi0gIGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kCi0pCi17Ci0gIHN0YXRpYyBpbnQgIHR5cGUxX3JlZ3NbIDMyIF0gPSB7IDMwLCAgMCwgIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMzEsIDI5LCAyOCwgMjMsIDIyLCAyMSwgMjAsIDI3LCAyNiwgMjUsIDI0IH07Ci0gIHN0YXRpYyBpbnQgIHR5cGUyX3JlZ3NbIDMyIF0gPSB7IDE5LCAxOCwgMTcsIDE2LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAzMCwgMzEsIDI5LCAyOCwgMjMsIDIyLCAyMSwgMjAsIDI3LCAyNiwgMjUsIDI0IH07Ci0gIHN0YXRpYyBpbnQgIHR5cGUzX3JlZ3NbIDMyIF0gPSB7ICAzLCAgMiwgIDEsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxNCwgMTUsIDEzLCAxMiwgIDcsICA2LCAgNSwgIDQsIDExLCAxMCwgIDksICA4IH07Ci0gIGludCAqICAgICAgIHJlZ3M7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotCi0gIC8qIFNlbGVjdCBhIHJlZ2lzdGVyIGFycmF5IHRvIHBhcnNlLiAqLwotICBzd2l0Y2ggKG9wZXJhbmQtPnNoaWZ0KQotICAgIHsKLSAgICBjYXNlIDB4ZmZlMDAwMDE6IHJlZ3MgPSB0eXBlMV9yZWdzOyBicmVhazsKLSAgICBjYXNlIDB4ZmZmODAwMGY6IHJlZ3MgPSB0eXBlMl9yZWdzOyBicmVhazsKLSAgICBjYXNlIDB4ZmZmODAwMWY6IHJlZ3MgPSB0eXBlM19yZWdzOyBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJ1bmtub3duIG9wZXJhbmQgc2hpZnQ6ICV4XG4iKSwgb3BlcmFuZC0+c2hpZnQpOwotICAgICAgcmV0dXJuIF8oImludGVybmFsIGZhaWx1cmUgaW4gcGFyc2VfcmVnaXN0ZXJfbGlzdCIpOwotICAgIH0KLQotICBza2lwX3doaXRlX3NwYWNlICgpOwotCi0gIC8qIElmIHRoZSBleHByZXNzaW9uIHN0YXJ0cyB3aXRoIGEgY3VybHkgYnJhY2UgaXQgaXMgYSByZWdpc3RlciBsaXN0LgotICAgICBPdGhlcndpc2UgaXQgaXMgYSBjb25zdGFudCBleHByZXNzaW9uLCB3aG9lcyBiaXRzIGluZGljYXRlIHdoaWNoCi0gICAgIHJlZ2lzdGVycyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QuICAqLwotICAKLSAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyICE9ICd7JykKLSAgICB7Ci0gICAgICBpbnQgYml0czsKLSAgICAgIGludCByZWc7Ci0gICAgICBpbnQgaTsKLQkJCi0gICAgICBleHByZXNzaW9uICgmIGV4cCk7Ci0gICAgICAKLSAgICAgIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCXJldHVybiBfKCJjb25zdGFudCBleHByZXNzaW9uIG9yIHJlZ2lzdGVyIGxpc3QgZXhwZWN0ZWQiKTsKLQotICAgICAgaWYgKHJlZ3MgPT0gdHlwZTFfcmVncykKLQl7Ci0JICBpZiAoZXhwLlhfYWRkX251bWJlciAmIDB4RkZGRkYwMDApCi0JICAgIHJldHVybiBfKCJoaWdoIGJpdHMgc2V0IGluIHJlZ2lzdGVyIGxpc3QgZXhwcmVzc2lvbiIpOwotCSAgCi0JICBmb3IgKHJlZyA9IDIwOyByZWcgPCAzMjsgcmVnICsrKQotCSAgICBpZiAoZXhwLlhfYWRkX251bWJlciAmICgxIDw8IChyZWcgLSAyMCkpKQotCSAgICAgIHsKLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JCSAgaWYgKHJlZ3NbaV0gPT0gcmVnKQotCQkgICAgKiBpbnNuIHw9ICgxIDw8IGkpOwotCSAgICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChyZWdzID09IHR5cGUyX3JlZ3MpCi0JewotCSAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAweEZGRkUwMDAwKQotCSAgICByZXR1cm4gXygiaGlnaCBiaXRzIHNldCBpbiByZWdpc3RlciBsaXN0IGV4cHJlc3Npb24iKTsKLQkgIAotCSAgZm9yIChyZWcgPSAxOyByZWcgPCAxNjsgcmVnICsrKQotCSAgICBpZiAoZXhwLlhfYWRkX251bWJlciAmICgxIDw8IChyZWcgLSAxKSkpCi0JICAgICAgewotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJICBpZiAocmVnc1tpXSA9PSByZWcpCi0JCSAgICAqIGluc24gfD0gKDEgPDwgaSk7Ci0JICAgICAgfQotCi0JICBpZiAoZXhwLlhfYWRkX251bWJlciAmICgxIDw8IDE1KSkKLQkgICAgKiBpbnNuIHw9ICgxIDw8IDMpOwotCSAgCi0JICBpZiAoZXhwLlhfYWRkX251bWJlciAmICgxIDw8IDE2KSkKLQkgICAgKiBpbnNuIHw9ICgxIDw8IDE5KTsKLQl9Ci0gICAgICBlbHNlIC8qIHJlZ3MgPT0gdHlwZTNfcmVncyAqLwotCXsKLQkgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgMHhGRkZFMDAwMCkKLQkgICAgcmV0dXJuIF8oImhpZ2ggYml0cyBzZXQgaW4gcmVnaXN0ZXIgbGlzdCBleHByZXNzaW9uIik7Ci0JICAKLQkgIGZvciAocmVnID0gMTY7IHJlZyA8IDMyOyByZWcgKyspCi0JICAgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgKDEgPDwgKHJlZyAtIDE2KSkpCi0JICAgICAgewotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJICBpZiAocmVnc1tpXSA9PSByZWcpCi0JCSAgICAqIGluc24gfD0gKDEgPDwgaSk7Ci0JICAgICAgfQotCi0JICBpZiAoZXhwLlhfYWRkX251bWJlciAmICgxIDw8IDE2KSkKLQkgICAgKiBpbnNuIHw9ICgxIDw8IDE5KTsKLQl9Ci0KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIgKys7Ci0KLSAgLyogUGFyc2UgdGhlIHJlZ2lzdGVyIGxpc3QgdW50aWwgYSB0ZXJtaW5hdG9yIChjbG9zaW5nIGN1cmx5IGJyYWNlIG9yCi0gICAgIG5ldy1saW5lKSBpcyBmb3VuZC4gICovCi0gIGZvciAoOzspCi0gICAgewotICAgICAgaWYgKHJlZ2lzdGVyX25hbWUgKCYgZXhwKSkKLQl7Ci0JICBpbnQgIGk7Ci0JICAKLQkgIC8qIExvY2F0ZSB0aGUgZ2l2ZW4gcmVnaXN0ZXIgaW4gdGhlIGxpc3QsIGFuZCBpZiBpdCBpcyB0aGVyZSwKLQkgICAgIGluc2VydCB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW50byB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAocmVnc1sgaSBdID09IGV4cC5YX2FkZF9udW1iZXIpCi0JCXsKLQkJICAqIGluc24gfD0gKDEgPDwgaSk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaSA9PSAzMikKLQkgICAgewotCSAgICAgIHJldHVybiBfKCJpbGxlZ2FsIHJlZ2lzdGVyIGluY2x1ZGVkIGluIGxpc3QiKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN5c3RlbV9yZWdpc3Rlcl9uYW1lICgmIGV4cCwgdHJ1ZSwgdHJ1ZSkpCi0JewotCSAgaWYgKHJlZ3MgPT0gdHlwZTFfcmVncykKLQkgICAgewotCSAgICAgIHJldHVybiBfKCJzeXN0ZW0gcmVnaXN0ZXJzIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBsaXN0Iik7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGV4cC5YX2FkZF9udW1iZXIgPT0gNSkKLQkgICAgewotCSAgICAgIGlmIChyZWdzID09IHR5cGUyX3JlZ3MpCi0JCXJldHVybiBfKCJQU1cgY2Fubm90IGJlIGluY2x1ZGVkIGluIGxpc3QiKTsKLQkgICAgICBlbHNlCi0JCSogaW5zbiB8PSAweDg7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGV4cC5YX2FkZF9udW1iZXIgPCA0KQotCSAgICAqIGluc24gfD0gMHg4MDAwMDsKLQkgIGVsc2UKLQkgICAgcmV0dXJuIF8oIkhpZ2ggdmFsdWUgc3lzdGVtIHJlZ2lzdGVycyBjYW5ub3QgYmUgaW5jbHVkZWQgaW4gbGlzdCIpOwotCX0KLSAgICAgIGVsc2UgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICd9JykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKys7Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyICsrOwotCSAgY29udGludWU7Ci0JfQotICAgICAgZWxzZSBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQotCXsKLQkgIC8qIFdlIGhhdmUgZW5jb3VudGVyZWQgYSByYW5nZSBvZiByZWdpc3RlcnM6IHJYIC0gclkgKi8KLQkgIGludCAgICAgICAgIGo7Ci0JICBleHByZXNzaW9uUyBleHAyOwotCi0JICAvKiBTa2lwIHRoZSBkYXNoLiAgKi8KLQkgICsrIGlucHV0X2xpbmVfcG9pbnRlcjsKLQotCSAgLyogR2V0IHRoZSBzZWNvbmQgcmVnaXN0ZXIgaW4gdGhlIHJhbmdlLiAgKi8KLQkgIGlmICghIHJlZ2lzdGVyX25hbWUgKCYgZXhwMikpCi0JICAgIHsKLQkgICAgICByZXR1cm4gXygic2Vjb25kIHJlZ2lzdGVyIHNob3VsZCBmb2xsb3cgZGFzaCBpbiByZWdpc3RlciBsaXN0Iik7Ci0JICAgICAgZXhwMi5YX2FkZF9udW1iZXIgPSBleHAuWF9hZGRfbnVtYmVyOwotCSAgICB9Ci0KLQkgIC8qIEFkZCB0aGUgcmVzdCBvZiB0aGUgcmVnaXN0ZXJzIGluIHRoZSByYW5nZS4gICovCi0JICBmb3IgKGogPSBleHAuWF9hZGRfbnVtYmVyICsgMTsgaiA8PSBleHAyLlhfYWRkX251bWJlcjsgaisrKQotCSAgICB7Ci0JICAgICAgaW50ICBpOwotCSAgCi0JICAgICAgLyogTG9jYXRlIHRoZSBnaXZlbiByZWdpc3RlciBpbiB0aGUgbGlzdCwgYW5kIGlmIGl0IGlzIHRoZXJlLAotCQkgaW5zZXJ0IHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JCXsKLQkJICBpZiAocmVnc1sgaSBdID09IGopCi0JCSAgICB7Ci0JCSAgICAgICogaW5zbiB8PSAoMSA8PCBpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGlmIChpID09IDMyKQotCQlyZXR1cm4gXygiaWxsZWdhbCByZWdpc3RlciBpbmNsdWRlZCBpbiBsaXN0Iik7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBza2lwX3doaXRlX3NwYWNlICgpOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotQ09OU1QgY2hhciAqIG1kX3Nob3J0b3B0cyA9ICJtOiI7Ci0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiBtZF9sb25nb3B0czsgCi0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICBGSUxFICogc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIiBWODUwIG9wdGlvbnM6XG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiICAtbXdhcm4tc2lnbmVkLW92ZXJmbG93ICAgIFdhcm4gaWYgc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZXMgb3ZlcmZsb3dcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgIC1td2Fybi11bnNpZ25lZC1vdmVyZmxvdyAgV2FybiBpZiB1bnNpZ25lZCBpbW1lZGlhdGUgdmFsdWVzIG92ZXJmbG93XG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiICAtbXY4NTAgICAgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGlzIHRhcmdldGVkIGF0IHRoZSB2ODUwXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiICAtbXY4NTBlICAgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGlzIHRhcmdldGVkIGF0IHRoZSB2ODUwZVxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIiAgLW12ODUwZWEgICAgICAgICAgICAgICAgICBUaGUgY29kZSBpcyB0YXJnZXRlZCBhdCB0aGUgdjg1MGVhXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiICAtbXY4NTBhbnkgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGlzIGdlbmVyaWMsIGRlc3BpdGUgYW55IHByb2Nlc3NvciBzcGVjaWZpYyBpbnN0cnVjdGlvbnNcbiIpKTsKLX0KLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50ICAgIGM7Ci0gICAgIGNoYXIgKiBhcmc7Ci17Ci0gIGlmIChjICE9ICdtJykKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJ1bmtub3duIGNvbW1hbmQgbGluZSBvcHRpb246IC0lYyVzXG4iKSwgYywgYXJnKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoc3RyY21wIChhcmcsICJ3YXJuLXNpZ25lZC1vdmVyZmxvdyIpID09IDApCi0gICAgewotICAgICAgd2Fybl9zaWduZWRfb3ZlcmZsb3dzID0gVFJVRTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAid2Fybi11bnNpZ25lZC1vdmVyZmxvdyIpID09IDApCi0gICAgewotICAgICAgd2Fybl91bnNpZ25lZF9vdmVyZmxvd3MgPSBUUlVFOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJ2ODUwIikgPT0gMCkKLSAgICB7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIHByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInY4NTBlIikgPT0gMCkKLSAgICB7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfdjg1MGU7Ci0gICAgICBwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwRTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAidjg1MGVhIikgPT0gMCkKLSAgICB7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfdjg1MGVhOwotICAgICAgcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MEVBOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJ2ODUwYW55IikgPT0gMCkKLSAgICB7Ci0gICAgICBtYWNoaW5lID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFRlbGwgdGhlIHdvcmxkIHRoYXQgdGhpcyBpcyBmb3IgYW55IHY4NTAgY2hpcC4gICovCi0gICAgICBwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwRUE7IC8qIEJ1dCBzdXBwb3J0IGluc3RydWN0aW9ucyBmb3IgdGhlIGV4dGVuZGVkIHZlcnNpb25zLiAgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJ1bmtub3duIGNvbW1hbmQgbGluZSBvcHRpb246IC0lYyVzXG4iKSwgYywgYXJnKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgCi0gIHJldHVybiAxOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gIGNoYXIgKiBuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRwLCBzaXplcCkKLSAgaW50ICAgIHR5cGU7Ci0gIGNoYXIgKiBsaXRwOwotICBpbnQgKiAgc2l6ZXA7Ci17Ci0gIGludCAgICAgICAgICAgIHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICogICAgICAgICB0OwotICBpbnQgICAgICAgICAgICBpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplcCA9IDA7Ci0gICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOwotICAgIH0KLSAgCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplcCA9IHByZWMgKiAyOwotCi0gIGZvciAoaSA9IHByZWMgLSAxOyBpID49IDA7IGktLSkKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdHAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLSAgICAgIGxpdHAgKz0gMjsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyogVmVyeSBncm9zcy4gICovCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gIGJmZCAqICAgICAgYWJmZDsKLSAgYXNlY3Rpb24gKiBzZWM7Ci0gIGZyYWdTICogICAgZnJhZ1A7Ci17Ci0gIHN1YnNlZ19jaGFuZ2UgKHNlYywgMCk7Ci0gIAotICAvKiBJbiByYW5nZSBjb25kaXRpb25hbCBvciB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAwIHx8IGZyYWdQLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgewotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ19VTlVTRUQgKyAoaW50KWZyYWdQLT5mcl9vcGNvZGUpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7Ci0gICAgfQotICAvKiBPdXQgb2YgcmFuZ2UgY29uZGl0aW9uYWwgYnJhbmNoLiAgRW1pdCBhIGJyYW5jaCBhcm91bmQgYSBqdW1wLiAgKi8KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXIgPSAKLQkodW5zaWduZWQgY2hhciAqKSAoZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsKTsKLQotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgYnVmZmVyWzBdIF49IDB4MDg7Ci0gICAgICAvKiBNYXNrIG9mZiBhbGwgdGhlIGRpc3BsYWNlbWVudCBiaXRzLiAgKi8KLSAgICAgIGJ1ZmZlclswXSAmPSAweDhmOwotICAgICAgYnVmZmVyWzFdICY9IDB4MDc7Ci0gICAgICAvKiBOb3cgc2V0IHRoZSBkaXNwbGFjZW1lbnQgYml0cyBzbyB0aGF0IHdlIGJyYW5jaAotCSBhcm91bmQgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgICAgIGJ1ZmZlclswXSB8PSAweDMwOwotCi0gICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZSBmaW5hbAotCSB0YXJnZXQuICAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWZmZXIgKyAyLCAweDAwMDAwNzgwLCA0KTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DX1VOVVNFRCArCi0JICAgICAgIChpbnQpIGZyYWdQLT5mcl9vcGNvZGUgKyAxKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OwotICAgIH0KLSAgLyogT3V0IG9mIHJhbmdlIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgRW1pdCBhIGp1bXAuICAqLwotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAzKQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsLCAweDAwMDAwNzgwLCA0KTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfVU5VU0VEICsKLQkgICAgICAgKGludCkgZnJhZ1AtPmZyX29wY29kZSArIDEpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0gICAgfQotICBlbHNlCi0gICAgYWJvcnQgKCk7Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQotICAgICBhc2VjdGlvbiAqIHNlZzsKLSAgICAgdmFsdWVUICAgICBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjaGFyICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X25hbWUgPSAiIjsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHY4NTBfb3Bjb2RlICogb3A7Ci0gIGZsYWd3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2FibGU7Ci0KLSAgaWYgKHN0cm5jbXAgKFRBUkdFVF9DUFUsICJ2ODUwZWEiLCA2KSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChtYWNoaW5lID09IC0xKQotCW1hY2hpbmUgPSBiZmRfbWFjaF92ODUwZWE7Ci0gICAgICAKLSAgICAgIGlmIChwcm9jZXNzb3JfbWFzayA9PSAtMSkKLQlwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwRUE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChUQVJHRVRfQ1BVLCAidjg1MGUiLCA1KSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChtYWNoaW5lID09IC0xKQotCW1hY2hpbmUgICAgICAgID0gYmZkX21hY2hfdjg1MGU7Ci0gICAgICAKLSAgICAgIGlmIChwcm9jZXNzb3JfbWFzayA9PSAtMSkKLQlwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwRTsKLSAgICB9Ci0gIGVsc2UKLSAgaWYgKHN0cm5jbXAgKFRBUkdFVF9DUFUsICJ2ODUwIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobWFjaGluZSA9PSAtMSkKLQltYWNoaW5lICAgICAgICA9IDA7Ci0gICAgICAKLSAgICAgIGlmIChwcm9jZXNzb3JfbWFzayA9PSAtMSkKLQlwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwOwotICAgIH0KLSAgZWxzZQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgYXNfYmFkIChfKCJVbmFibGUgdG8gZGV0ZXJtaW5lIGRlZmF1bHQgdGFyZ2V0IHByb2Nlc3NvciBmcm9tIHN0cmluZzogJXMiKSwgCi0gICAgICAgICAgICBUQVJHRVRfQ1BVKTsKLQotICB2ODUwX2hhc2ggPSBoYXNoX25ldygpOwotCi0gIC8qIEluc2VydCB1bmlxdWUgbmFtZXMgaW50byBoYXNoIHRhYmxlLiAgVGhlIFY4NTAgaW5zdHJ1Y3Rpb24gc2V0Ci0gICAgIGhhcyBtYW55IGlkZW50aWNhbCBvcGNvZGUgbmFtZXMgdGhhdCBoYXZlIGRpZmZlcmVudCBvcGNvZGVzIGJhc2VkCi0gICAgIG9uIHRoZSBvcGVyYW5kcy4gIFRoaXMgaGFzaCB0YWJsZSB0aGVuIHByb3ZpZGVzIGEgcXVpY2sgaW5kZXggdG8KLSAgICAgdGhlIGZpcnN0IG9wY29kZSB3aXRoIGEgcGFydGljdWxhciBuYW1lIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLwotCi0gIG9wID0gdjg1MF9vcGNvZGVzOwotICB3aGlsZSAob3AtPm5hbWUpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocHJldl9uYW1lLCBvcC0+bmFtZSkpIAotCXsKLQkgIHByZXZfbmFtZSA9IChjaGFyICopIG9wLT5uYW1lOwotCSAgaGFzaF9pbnNlcnQgKHY4NTBfaGFzaCwgb3AtPm5hbWUsIChjaGFyICopIG9wKTsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBUQVJHRVRfQVJDSCwgbWFjaGluZSk7Ci0KLSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0gIAotICBjYWxsX3RhYmxlX2RhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuY2FsbF90YWJsZV9kYXRhIiwgMCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBjYWxsX3RhYmxlX2RhdGFfc2VjdGlvbiwKLQkJCSBhcHBsaWNhYmxlICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0JCQkJICAgICAgIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0gIAotICBjYWxsX3RhYmxlX3RleHRfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuY2FsbF90YWJsZV90ZXh0IiwgMCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBjYWxsX3RhYmxlX3RleHRfc2VjdGlvbiwKLQkJCSBhcHBsaWNhYmxlICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFQURPTkxZCi0JCQkJICAgICAgIHwgU0VDX0NPREUpKTsKLSAgCi0gIC8qIFJlc3RvcmUgdGV4dCBzZWN0aW9uIGFzIHRoZSBjdXJyZW50IGRlZmF1bHQuICAqLwotICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIDApOwotfQotCi0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLWhhbmRsZV9jdG9mZiAoY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQpCi17Ci0gIGlmIChvcGVyYW5kID09IE5VTEwpCi0gICAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX0NBTExUXzE2XzE2X09GRlNFVDsKLQotICBpZiAoICAgb3BlcmFuZC0+Yml0cyAgIT0gNgotICAgICAgfHwgb3BlcmFuZC0+c2hpZnQgIT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImN0b2ZmKCkgcmVsb2NhdGlvbiB1c2VkIG9uIGFuIGluc3RydWN0aW9uIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgaXQiKSk7Ci0gICAgICByZXR1cm4gQkZEX1JFTE9DXzY0OyAgLyogVXNlZCB0byBpbmRpY2F0ZSBhbiBlcnJvciBjb25kaXRpb24uICAqLwotICAgIH0KLSAgICAgIAotICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfNl83X09GRlNFVDsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotaGFuZGxlX3NkYW9mZiAoY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQpCi17Ci0gIGlmIChvcGVyYW5kID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X09GRlNFVDsKLSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gMTUgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMTcpIHJldHVybiBCRkRfUkVMT0NfVjg1MF9TREFfMTVfMTZfT0ZGU0VUOwotICBpZiAob3BlcmFuZC0+Yml0cyA9PSAtMSkgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQ7Ci0gIAotICBpZiAoICAgb3BlcmFuZC0+Yml0cyAgIT0gMTYKLSAgICAgIHx8IG9wZXJhbmQtPnNoaWZ0ICE9IDE2KQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygic2Rhb2ZmKCkgcmVsb2NhdGlvbiB1c2VkIG9uIGFuIGluc3RydWN0aW9uIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgaXQiKSk7Ci0gICAgICByZXR1cm4gQkZEX1JFTE9DXzY0OyAgLyogVXNlZCB0byBpbmRpY2F0ZSBhbiBlcnJvciBjb25kaXRpb24uICAqLwotICAgIH0KLSAgCi0gIHJldHVybiBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfT0ZGU0VUOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1oYW5kbGVfemRhb2ZmIChjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZCkKLXsKLSAgaWYgKG9wZXJhbmQgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VUOwotICBpZiAob3BlcmFuZC0+Yml0cyA9PSAxNSAmJiBvcGVyYW5kLT5zaGlmdCA9PSAxNykgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1pEQV8xNV8xNl9PRkZTRVQ7Ci0gIGlmIChvcGVyYW5kLT5iaXRzID09IC0xKSAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVDsKLQotICBpZiAoICAgb3BlcmFuZC0+Yml0cyAgIT0gMTYKLSAgICAgIHx8IG9wZXJhbmQtPnNoaWZ0ICE9IDE2KQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiemRhb2ZmKCkgcmVsb2NhdGlvbiB1c2VkIG9uIGFuIGluc3RydWN0aW9uIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgaXQiKSk7Ci0gICAgICByZXR1cm4gQkZEX1JFTE9DXzY0OyAgLyogVXNlZCB0byBpbmRpY2F0ZSBhbiBlcnJvciBjb25kaXRpb24uICAqLwotICAgIH0KLSAgCi0gIHJldHVybiBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VUOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1oYW5kbGVfdGRhb2ZmIChjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZCkKLXsKLSAgaWYgKG9wZXJhbmQgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1REQV83XzdfT0ZGU0VUOyAgLyogZGF0YSBpdGVtLCBub3QgYW4gaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAob3BlcmFuZC0+Yml0cyA9PSA2ICYmIG9wZXJhbmQtPnNoaWZ0ID09IDEpICAgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfVERBXzZfOF9PRkZTRVQ7ICAvKiBzbGQudy9zc3Qudywgb3BlcmFuZDogRDhfNiAgKi8KLSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gNCAmJiBvcGVyYW5kLT5pbnNlcnQgIT0gTlVMTCkgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1REQV80XzVfT0ZGU0VUOyAgLyogc2xkLmh1LCBvcGVyYW5kOiBENS00ICovCi0gIGlmIChvcGVyYW5kLT5iaXRzID09IDQgJiYgb3BlcmFuZC0+aW5zZXJ0ID09IE5VTEwpIHJldHVybiBCRkRfUkVMT0NfVjg1MF9UREFfNF80X09GRlNFVDsgIC8qIHNsZC5idSwgb3BlcmFuZDogRDQgICAqLwotICBpZiAob3BlcmFuZC0+Yml0cyA9PSAxNiAmJiBvcGVyYW5kLT5zaGlmdCA9PSAxNikgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfVERBXzE2XzE2X09GRlNFVDsgLyogc2V0MSAmIGNodW1zLCBvcGVyYW5kczogRDE2ICovCi0gIAotICBpZiAob3BlcmFuZC0+Yml0cyAhPSA3KQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidGRhb2ZmKCkgcmVsb2NhdGlvbiB1c2VkIG9uIGFuIGluc3RydWN0aW9uIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgaXQiKSk7Ci0gICAgICByZXR1cm4gQkZEX1JFTE9DXzY0OyAgLyogVXNlZCB0byBpbmRpY2F0ZSBhbiBlcnJvciBjb25kaXRpb24uICAqLwotICAgIH0KLSAgCi0gIHJldHVybiAgb3BlcmFuZC0+aW5zZXJ0ICE9IE5VTEwKLSAgICA/IEJGRF9SRUxPQ19WODUwX1REQV83XzhfT0ZGU0VUICAgICAvKiBzbGQuaC9zc3QuaCwgb3BlcmFuZDogRDhfNyAqLwotICAgIDogQkZEX1JFTE9DX1Y4NTBfVERBXzdfN19PRkZTRVQ7ICAgIC8qIHNsZC5iL3NzdC5iLCBvcHJlYW5kOiBENyAgICovCi19Ci0KLS8qIFdhcm5pbmc6IFRoZSBjb2RlIGluIHRoaXMgZnVuY3Rpb24gcmVsaWVzIHVwb24gdGhlIGRlZmluaXRpb25zCi0gICBpbiB0aGUgdjg1MF9vcGVyYW5kc1tdIGFycmF5IChkZWZpbmVkIGluIG9wY29kZXMvdjg1MC1vcGMuYykKLSAgIG1hdGNoaW5nIHRoZSBoYXJkIGNvZGVkIHZhbHVlcyBjb250YWluZWQgaGVyZWluLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotdjg1MF9yZWxvY19wcmVmaXggKGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kKQotewotICBib29sZWFuIHBhcmVuX3NraXBwZWQgPSBmYWxzZTsKLQotCi0gIC8qIFNraXAgbGVhZGluZyBvcGVuaW5nIHBhcmVudGhlc2lzLiAgKi8KLSAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICcoJykKLSAgICB7Ci0gICAgICArKyBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBwYXJlbl9za2lwcGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSNkZWZpbmUgQ0hFQ0tfKG5hbWUsIHJlbG9jKSAJCQkJCQlcCi0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsIG5hbWUjIyIoIiwgc3RybGVuIChuYW1lKSArIDEpID09IDApCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IHN0cmxlbiAobmFtZSk7CQkJCVwKLSAgICAgIHJldHVybiByZWxvYzsJCQkJCQkJXAotICAgIH0KLSAgCi0gIENIRUNLXyAoImhpMCIsICAgIEJGRF9SRUxPQ19ISTE2KTsKLSAgQ0hFQ0tfICgiaGkiLCAgICAgQkZEX1JFTE9DX0hJMTZfUyk7Ci0gIENIRUNLXyAoImxvIiwgICAgIEJGRF9SRUxPQ19MTzE2KTsKLSAgQ0hFQ0tfICgic2Rhb2ZmIiwgaGFuZGxlX3NkYW9mZiAob3BlcmFuZCkpOwotICBDSEVDS18gKCJ6ZGFvZmYiLCBoYW5kbGVfemRhb2ZmIChvcGVyYW5kKSk7Ci0gIENIRUNLXyAoInRkYW9mZiIsIGhhbmRsZV90ZGFvZmYgKG9wZXJhbmQpKTsKLSAgQ0hFQ0tfICgiaGlsbyIsICAgQkZEX1JFTE9DXzMyKTsKLSAgQ0hFQ0tfICgiY3RvZmYiLCAgaGFuZGxlX2N0b2ZmIChvcGVyYW5kKSk7Ci0gIAotICAvKiBSZXN0b3JlIHNraXBwZWQgcGFyZW50aGVzaXMuICAqLwotICBpZiAocGFyZW5fc2tpcHBlZCkKLSAgICAtLSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIAotICByZXR1cm4gQkZEX1JFTE9DX1VOVVNFRDsKLX0KLQotLyogSW5zZXJ0IGFuIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi12ODUwX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCB2YWwsIGZpbGUsIGxpbmUsIHN0cikKLSAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kOwotICAgICBvZmZzZXRUICAgICAgICAgICAgICAgICAgICAgdmFsOwotICAgICBjaGFyICogICAgICAgICAgICAgICAgICAgICAgZmlsZTsKLSAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGxpbmU7Ci0gICAgIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICBzdHI7Ci17Ci0gIGlmIChvcGVyYW5kLT5pbnNlcnQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqIG1lc3NhZ2UgPSBOVUxMOwotICAgICAgCi0gICAgICBpbnNuID0gb3BlcmFuZC0+aW5zZXJ0IChpbnNuLCB2YWwsICYgbWVzc2FnZSk7Ci0gICAgICBpZiAobWVzc2FnZSAhPSBOVUxMKQotCXsKLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU0lHTkVEKQotCSAgICAgICYmICEgd2Fybl9zaWduZWRfb3ZlcmZsb3dzCi0JICAgICAgJiYgc3Ryc3RyIChtZXNzYWdlLCAib3V0IG9mIHJhbmdlIikgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIHNraXAgd2FybmluZy4uLiAqLwotCSAgICB9Ci0JICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU0lHTkVEKSA9PSAwCi0JCSAgICYmICEgd2Fybl91bnNpZ25lZF9vdmVyZmxvd3MKLQkJICAgJiYgc3Ryc3RyIChtZXNzYWdlLCAib3V0IG9mIHJhbmdlIikgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIHNraXAgd2FybmluZy4uLiAqLwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHIpCi0JICAgIHsKLQkgICAgICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQotCQlhc193YXJuICgiJXM6ICVzIiwgc3RyLCBtZXNzYWdlKTsKLQkgICAgICBlbHNlCi0JCWFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsICIlczogJXMiLCBzdHIsIG1lc3NhZ2UpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQotCQlhc193YXJuIChtZXNzYWdlKTsKLQkgICAgICBlbHNlCi0JCWFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsIG1lc3NhZ2UpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChvcGVyYW5kLT5iaXRzICE9IDMyKQotCXsKLQkgIGxvbmcgICAgbWluLCBtYXg7Ci0JICBvZmZzZXRUIHRlc3Q7Ci0KLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgd2Fybl9zaWduZWRfb3ZlcmZsb3dzKQotCQltYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7Ci0JICAgICAgZWxzZQotCQltYXggPSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSAtIDE7Ci0JICAgICAgCi0JICAgICAgbWluID0gLSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotCSAgICAgIAotCSAgICAgIGlmICghIHdhcm5fdW5zaWduZWRfb3ZlcmZsb3dzKQotCQltaW4gPSAtICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOwotCSAgICAgIGVsc2UKLQkJbWluID0gMDsKLQkgICAgfQotCSAgCi0JICBpZiAodmFsIDwgKG9mZnNldFQpIG1pbiB8fCB2YWwgPiAob2Zmc2V0VCkgbWF4KQotCSAgICB7Ci0JICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgICBjb25zdCBjaGFyICogZXJyID0gXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVzIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIpOwotCSAgICAgIGNoYXIgICAgICAgICBidWZbMTAwXTsKLQkgICAgICAKLQkgICAgICAvKiBSZXN0b3JlIG1pbiBhbmQgbWl4IHRvIGV4cGVjdGVkIHZhbHVlcyBmb3IgZGVjaW1hbCByYW5nZXMuICAqLwotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU0lHTkVEKQotCQkgICYmICEgd2Fybl9zaWduZWRfb3ZlcmZsb3dzKQotCQltYXggPSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSAtIDE7Ci0KLQkgICAgICBpZiAoISAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU0lHTkVEKQotCQkgICYmICEgd2Fybl91bnNpZ25lZF9vdmVyZmxvd3MpCi0JCW1pbiA9IDA7Ci0KLQkgICAgICBpZiAoc3RyKQotCQl7Ci0JCSAgc3ByaW50ZiAoYnVmLCAiJXM6ICIsIHN0cik7Ci0JCSAgCi0JCSAgc3ByaW50X3ZhbHVlIChidWYgKyBzdHJsZW4gKGJ1ZiksIHZhbCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXNwcmludF92YWx1ZSAoYnVmLCB2YWwpOwotCSAgICAgIAotCSAgICAgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0JCWFzX3dhcm4gKGVyciwgYnVmLCBtaW4sIG1heCk7Ci0JICAgICAgZWxzZQotCQlhc193YXJuX3doZXJlIChmaWxlLCBsaW5lLCBlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCSAgICB9Ci0JfQotCi0gICAgICBpbnNuIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdCk7Ci0gICAgfQotICAKLSAgcmV0dXJuIGluc247Ci19Ci0KLQwKLXN0YXRpYyBjaGFyICAgICAgICAgICAgICAgICBjb3B5X29mX2luc3RydWN0aW9uIFsxMjhdOwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKSAKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICBzOwotICBjaGFyICogICAgICAgICAgICAgICAgICAgIHN0YXJ0X29mX29wZXJhbmRzOwotICBzdHJ1Y3Qgdjg1MF9vcGNvZGUgKiAgICAgIG9wY29kZTsKLSAgc3RydWN0IHY4NTBfb3Bjb2RlICogICAgICBuZXh0X29wY29kZTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqICAgICBvcGluZGV4X3B0cjsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICBuZXh0X29waW5kZXg7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgcmVsYXhhYmxlOwotICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgaW5zbl9zaXplOwotICBjaGFyICogICAgICAgICAgICAgICAgICAgIGY7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgaTsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICBtYXRjaDsKLSAgYm9vbGVhbiAgICAgICAgICAgICAgICAgICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSBmYWxzZTsKLSAgdW5zaWduZWQgICAgICAgICAgICAgICAgICBleHRyYV9kYXRhX2xlbjsKLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICBleHRyYV9kYXRhOwotICBjaGFyICoJCSAgICBzYXZlZF9pbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgCi0gIHN0cm5jcHkgKGNvcHlfb2ZfaW5zdHJ1Y3Rpb24sIHN0ciwgc2l6ZW9mIChjb3B5X29mX2luc3RydWN0aW9uKSAtIDEpOwotICAKLSAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotICBmb3IgKHMgPSBzdHI7ICpzICE9ICdcMCcgJiYgISBpc3NwYWNlICgqcyk7IHMrKykKLSAgICBjb250aW51ZTsKLSAgCi0gIGlmICgqcyAhPSAnXDAnKQotICAgICpzKysgPSAnXDAnOwotCi0gIC8qIGZpbmQgdGhlIGZpcnN0IG9wY29kZSB3aXRoIHRoZSBwcm9wZXIgbmFtZSAqLwotICBvcGNvZGUgPSAoc3RydWN0IHY4NTBfb3Bjb2RlICopIGhhc2hfZmluZCAodjg1MF9oYXNoLCBzdHIpOwotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygiVW5yZWNvZ25pemVkIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3RyID0gczsKLSAgd2hpbGUgKGlzc3BhY2UgKCogc3RyKSkKLSAgICArKyBzdHI7Ci0KLSAgc3RhcnRfb2Zfb3BlcmFuZHMgPSBzdHI7Ci0KLSAgc2F2ZWRfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICogZXJybXNnID0gTlVMTDsKLQotICAgICAgbWF0Y2ggPSAwOwotICAgICAgCi0gICAgICBpZiAoKG9wY29kZS0+cHJvY2Vzc29ycyAmIHByb2Nlc3Nvcl9tYXNrKSA9PSAwKQotCXsKLQkgIGVycm1zZyA9IF8oIlRhcmdldCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGluc3RydWN0aW9uLiIpOwotCSAgZ290byBlcnJvcjsKLQl9Ci0gICAgICAKLSAgICAgIHJlbGF4YWJsZSA9IDA7Ci0gICAgICBmYyA9IDA7Ci0gICAgICBuZXh0X29waW5kZXggPSAwOwotICAgICAgaW5zbiA9IG9wY29kZS0+b3Bjb2RlOwotICAgICAgZXh0cmFfZGF0YV9hZnRlcl9pbnNuID0gZmFsc2U7Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0ciA9IHN0YXJ0X29mX29wZXJhbmRzOwotCi0gICAgICBmb3IgKG9waW5kZXhfcHRyID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXhfcHRyICE9IDA7IG9waW5kZXhfcHRyICsrKQotCXsKLQkgIGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kOwotCSAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgIGhvbGQ7Ci0JICBleHByZXNzaW9uUyAgICAgICAgICAgICAgICAgZXg7Ci0JICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgICAgcmVsb2M7Ci0KLQkgIGlmIChuZXh0X29waW5kZXggPT0gMCkKLQkgICAgewotCSAgICAgIG9wZXJhbmQgPSAmIHY4NTBfb3BlcmFuZHNbICogb3BpbmRleF9wdHIgXTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3BlcmFuZCAgICAgID0gJiB2ODUwX29wZXJhbmRzWyBuZXh0X29waW5kZXggXTsKLQkgICAgICBuZXh0X29waW5kZXggPSAwOwotCSAgICB9Ci0KLQkgIGVycm1zZyA9IE5VTEw7Ci0KLQkgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICcsJyB8fCAqc3RyID09ICdbJyB8fCAqc3RyID09ICddJykKLQkgICAgKysgc3RyOwotCi0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfUkVMQVgpCi0JICAgIHJlbGF4YWJsZSA9IDE7Ci0KLQkgIC8qIEdhdGhlciB0aGUgb3BlcmFuZC4gKi8KLQkgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0JICAKLQkgIC8qIGxvKCksIGhpKCksIGhpMCgpLCBldGMuLi4gKi8KLQkgIGlmICgocmVsb2MgPSB2ODUwX3JlbG9jX3ByZWZpeCAob3BlcmFuZCkpICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgZmFrZSByZWxvYywgdXNlZCB0byBpbmRpY2F0ZSBhbiBlcnJvciBjb25kaXRpb24uICAqLwotCSAgICAgIGlmIChyZWxvYyA9PSBCRkRfUkVMT0NfNjQpCi0JCXsKLQkJICBtYXRjaCA9IDE7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCQkgCi0JICAgICAgZXhwcmVzc2lvbiAoJiBleCk7Ci0KLQkgICAgICBpZiAoZXguWF9vcCA9PSBPX2NvbnN0YW50KQotCQl7Ci0JCSAgc3dpdGNoIChyZWxvYykKLQkJICAgIHsKLQkJICAgIGNhc2UgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVDoKLQkJICAgICAgLyogVG8gY29wZSB3aXRoICJub3QxIDcsIHpkYW9mZigweGZmZmZmMDA2KVtyMF0iCi0JCQkgYW5kIHRoZSBsaWtlLiAgKi8KLQkJICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkJICAgICAgCi0JCSAgICBjYXNlIEJGRF9SRUxPQ19MTzE2OgotCQkgICAgICB7Ci0JCQkvKiBUcnVuY2F0ZSwgdGhlbiBzaWduIGV4dGVuZCB0aGUgdmFsdWUuICAqLwotCQkJZXguWF9hZGRfbnVtYmVyID0gU0VYVDE2IChleC5YX2FkZF9udW1iZXIpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQotCQkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKLQkJICAgICAgewotCQkJLyogVHJ1bmNhdGUsIHRoZW4gc2lnbiBleHRlbmQgdGhlIHZhbHVlLiAgKi8KLQkJCWV4LlhfYWRkX251bWJlciA9IFNFWFQxNiAoZXguWF9hZGRfbnVtYmVyID4+IDE2KTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0KLQkJICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKLQkJICAgICAgewotCQkJLyogVHJ1bmNhdGUsIHRoZW4gc2lnbiBleHRlbmQgdGhlIHZhbHVlLiAgKi8KLQkJICAgICAgICBpbnQgdGVtcCA9IChleC5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOwotCi0JCQl0ZW1wICs9IChleC5YX2FkZF9udW1iZXIgPj4gMTUpICYgMTsKLQotCQkJZXguWF9hZGRfbnVtYmVyID0gU0VYVDE2ICh0ZW1wKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICAKLQkJICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotCQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MEVfSU1NRURJQVRFMzIpID09IDApCi0JCQl7Ci0JCQkgIGVycm1zZyA9IF8oImltbWVkaWF0ZSBvcGVyYW5kIGlzIHRvbyBsYXJnZSIpOwotCQkJICBnb3RvIGVycm9yOwotCQkJfQotCQkgICAgICAKLQkJICAgICAgZXh0cmFfZGF0YV9hZnRlcl9pbnNuID0gdHJ1ZTsKLQkJICAgICAgZXh0cmFfZGF0YV9sZW4gICAgICAgID0gNDsKLQkJICAgICAgZXh0cmFfZGF0YSAgICAgICAgICAgID0gZXguWF9hZGRfbnVtYmVyOwotCQkgICAgICBleC5YX2FkZF9udW1iZXIgICAgICAgPSAwOwotCQkgICAgICBicmVhazsKLQkJICAgICAgCi0JCSAgICBkZWZhdWx0OgotCQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJyZWxvYzogJWRcbiIsIHJlbG9jKTsKLQkJICAgICAgYXNfYmFkIChfKCJBQUFSRyAtPiB1bmhhbmRsZWQgY29uc3RhbnQgcmVsb2MiKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCi0JCSAgaWYgKGZjID4gTUFYX0lOU05fRklYVVBTKQotCQkgICAgYXNfZmF0YWwgKF8oInRvbyBtYW55IGZpeHVwcyIpKTsKLQkJICAKLQkJICBmaXh1cHNbIGZjIF0uZXhwICAgICA9IGV4OwotCQkgIGZpeHVwc1sgZmMgXS5vcGluZGV4ID0gKiBvcGluZGV4X3B0cjsKLQkJICBmaXh1cHNbIGZjIF0ucmVsb2MgICA9IHJlbG9jOwotCQkgIGZjKys7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAocmVsb2MgPT0gQkZEX1JFTE9DXzMyKQotCQkgICAgewotCQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MEVfSU1NRURJQVRFMzIpID09IDApCi0JCQl7Ci0JCQkgIGVycm1zZyA9IF8oImltbWVkaWF0ZSBvcGVyYW5kIGlzIHRvbyBsYXJnZSIpOwotCQkJICBnb3RvIGVycm9yOwotCQkJfQotCQkgICAgICAKLQkJICAgICAgZXh0cmFfZGF0YV9hZnRlcl9pbnNuID0gdHJ1ZTsKLQkJICAgICAgZXh0cmFfZGF0YV9sZW4gICAgICAgID0gNDsKLQkJICAgICAgZXh0cmFfZGF0YSAgICAgICAgICAgID0gZXguWF9hZGRfbnVtYmVyOwotCQkgICAgfQotCQkgICAgICAKLQkJICBpZiAoZmMgPiBNQVhfSU5TTl9GSVhVUFMpCi0JCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCi0JCSAgZml4dXBzWyBmYyBdLmV4cCAgICAgPSBleDsKLQkJICBmaXh1cHNbIGZjIF0ub3BpbmRleCA9ICogb3BpbmRleF9wdHI7Ci0JCSAgZml4dXBzWyBmYyBdLnJlbG9jICAgPSByZWxvYzsKLQkJICBmYysrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVycm1zZyA9IE5VTEw7Ci0JICAgICAgCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9SRUcpICE9IDApIAotCQl7Ci0JCSAgaWYgKCFyZWdpc3Rlcl9uYW1lICgmIGV4KSkKLQkJICAgIHsKLQkJICAgICAgZXJybXNnID0gXygiaW52YWxpZCByZWdpc3RlciBuYW1lIik7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9OT1RfUjApCi0JCSAgICAgICYmIGV4LlhfYWRkX251bWJlciA9PSAwKQotCQkgICAgewotCQkgICAgICBlcnJtc2cgPSBfKCJyZWdpc3RlciByMCBjYW5ub3QgYmUgdXNlZCBoZXJlIik7Ci0JCSAgICAgIAotCQkgICAgICAvKiBGb3JjZSBhbiBlcnJvciBtZXNzYWdlIHRvIGJlIGdlbmVyYXRlZCBieQotCQkJIHNraXBwaW5nIG92ZXIgYW55IGZvbGxvd2luZyBwb3RlbnRpYWwgbWF0Y2hlcwotCQkJIGZvciB0aGlzIG9wY29kZS4gICovCi0JCSAgICAgIG9wY29kZSArPSAzOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1NSRykgIT0gMCkgCi0JCXsKLQkJICBpZiAoIXN5c3RlbV9yZWdpc3Rlcl9uYW1lICgmIGV4LCB0cnVlLCBmYWxzZSkpCi0JCSAgICB7Ci0JCSAgICAgIGVycm1zZyA9IF8oImludmFsaWQgc3lzdGVtIHJlZ2lzdGVyIG5hbWUiKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9FUCkgIT0gMCkKLQkJewotCQkgIGNoYXIgKiBzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJICBjaGFyICAgYyAgICAgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkJICAKLQkJICBpZiAoc3RyY21wIChzdGFydCwgImVwIikgIT0gMCAmJiBzdHJjbXAgKHN0YXJ0LCAicjMwIikgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogUHV0IHRoaW5ncyBiYWNrIHRoZSB3YXkgd2UgZm91bmQgdGhlbS4gICovCi0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsKLQkJICAgICAgZXJybXNnID0gXygiZXhwZWN0ZWQgRVAgcmVnaXN0ZXIiKTsKLQkJICAgICAgZ290byBlcnJvcjsKLQkJICAgIH0KLQkJICAKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICAKLQkJICB3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnLCcgfHwgKnN0ciA9PSAnWycgfHwgKnN0ciA9PSAnXScpCi0JCSAgICArKyBzdHI7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfQ0MpICE9IDApIAotCQl7Ci0JCSAgaWYgKCFjY19uYW1lICgmIGV4KSkKLQkJICAgIHsKLQkJICAgICAgZXJybXNnID0gXygiaW52YWxpZCBjb25kaXRpb24gY29kZSBuYW1lIik7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBFX1BVU0hfUE9QKSAKLQkJewotCQkgIGVycm1zZyA9IHBhcnNlX3JlZ2lzdGVyX2xpc3QgKCYgaW5zbiwgb3BlcmFuZCk7Ci0JCSAgCi0JCSAgLyogVGhlIHBhcnNlX3JlZ2lzdGVyX2xpc3QoKSBmdW5jdGlvbiBoYXMgYWxyZWFkeSBkb25lCi0JCSAgICAgZXZlcnl0aGluZywgc28gZmFrZSBhIGR1bW15IGV4cHJlc3Npb24uICAqLwotCQkgIGV4Llhfb3AgICAgICAgICA9IE9fY29uc3RhbnQ7Ci0JCSAgZXguWF9hZGRfbnVtYmVyID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MEVfSU1NRURJQVRFMTYpIAotCQl7Ci0JCSAgZXhwcmVzc2lvbiAoJiBleCk7Ci0KLQkJICBpZiAoZXguWF9vcCAhPSBPX2NvbnN0YW50KQotCQkgICAgZXJybXNnID0gXygiY29uc3RhbnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotCQkgIGVsc2UgaWYgKGV4LlhfYWRkX251bWJlciAmIDB4ZmZmZjAwMDApCi0JCSAgICB7Ci0JCSAgICAgIGlmIChleC5YX2FkZF9udW1iZXIgJiAweGZmZmYpCi0JCQllcnJtc2cgPSBfKCJjb25zdGFudCB0b28gYmlnIHRvIGZpdCBpbnRvIGluc3RydWN0aW9uIik7Ci0JCSAgICAgIGVsc2UgaWYgKChpbnNuICYgMHgwMDFmZmZjMCkgPT0gMHgwMDEzMDc4MCkKLQkJCWV4LlhfYWRkX251bWJlciA+Pj0gMTY7Ci0JCSAgICAgIGVsc2UKLQkJCWVycm1zZyA9IF8oImNvbnN0YW50IHRvbyBiaWcgdG8gZml0IGludG8gaW5zdHJ1Y3Rpb24iKTsKLQkJICAgIH0KLQkJICAKLQkJICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSB0cnVlOwotCQkgIGV4dHJhX2RhdGFfbGVuICAgICAgICA9IDI7Ci0JCSAgZXh0cmFfZGF0YSAgICAgICAgICAgID0gZXguWF9hZGRfbnVtYmVyOwotCQkgIGV4LlhfYWRkX251bWJlciAgICAgICA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBFX0lNTUVESUFURTMyKSAKLQkJewotCQkgIGV4cHJlc3Npb24gKCYgZXgpOwotCQkgIAotCQkgIGlmIChleC5YX29wICE9IE9fY29uc3RhbnQpCi0JCSAgICBlcnJtc2cgPSBfKCJjb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0JCSAgCi0JCSAgZXh0cmFfZGF0YV9hZnRlcl9pbnNuID0gdHJ1ZTsKLQkJICBleHRyYV9kYXRhX2xlbiAgICAgICAgPSA0OwotCQkgIGV4dHJhX2RhdGEgICAgICAgICAgICA9IGV4LlhfYWRkX251bWJlcjsKLQkJICBleC5YX2FkZF9udW1iZXIgICAgICAgPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAocmVnaXN0ZXJfbmFtZSAoJiBleCkKLQkJICAgICAgICYmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9SRUcpID09IDApCi0JCXsKLQkJICBjaGFyIGM7Ci0JCSAgaW50ICBleGlzdHMgPSAwOwotCQkgIAotCQkgIC8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgYW4gYWxpYXMgaGFzIGJlZW4gZGVmaW5lZCB0aGF0Ci0JCSAgICAgbWF0Y2hlcyBhIHJlZ2lzdGVyIG5hbWUuICBGb3IgZXhhbXBsZSB0aGUgY29kZSBtYXkKLQkJICAgICBpbmNsdWRlIGEgIi5zZXQgWkVSTywgMCIgZGlyZWN0aXZlLCB3aGljaCBtYXRjaGVzCi0JCSAgICAgdGhlIHJlZ2lzdGVyIG5hbWUgInplcm8iLiAgQXR0ZW1wdCB0byByZXBhcnNlIHRoZQotCQkgICAgIGZpZWxkIGFzIGFuIGV4cHJlc3Npb24sIGFuZCBvbmx5IGNvbXBsYWluIGlmIHdlCi0JCSAgICAgY2Fubm90IGdlbmVyYXRlIGEgY29uc3RhbnQuICAqLwotCi0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0JCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCQkgIAotCQkgIGlmIChzeW1ib2xfZmluZCAoc3RyKSAhPSBOVUxMKQotCQkgICAgZXhpc3RzID0gMTsKLQkJICAKLQkJICAqIGlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCQkgIAotCQkgIGV4cHJlc3Npb24gKCYgZXgpOwotCi0JCSAgaWYgKGV4Llhfb3AgIT0gT19jb25zdGFudCkKLQkJICAgIHsKLQkJICAgICAgLyogSWYgdGhpcyByZWdpc3RlciBpcyBhY3R1YWxseSBvY2N1cmluZyB0b28gZWFybHkgb24KLQkJCSB0aGUgcGFyc2luZyBvZiB0aGUgaW5zdHJ1Y3Rpb24sIChiZWNhdXNlIGFub3RoZXIKLQkJCSBmaWVsZCBpcyBtaXNzaW5nKSB0aGVuIHJlcG9ydCB0aGlzLiAgKi8KLQkJICAgICAgaWYgKG9waW5kZXhfcHRyWzFdICE9IDAKLQkJCSAgJiYgKHY4NTBfb3BlcmFuZHMgW29waW5kZXhfcHRyIFsxXV0uZmxhZ3MgJiBWODUwX09QRVJBTkRfUkVHKSkKLQkJCWVycm1zZyA9IF8oInN5bnRheCBlcnJvcjogdmFsdWUgaXMgbWlzc2luZyBiZWZvcmUgdGhlIHJlZ2lzdGVyIG5hbWUiKTsKLQkJICAgICAgZWxzZQotCQkJZXJybXNnID0gXygic3ludGF4IGVycm9yOiByZWdpc3RlciBub3QgZXhwZWN0ZWQiKTsKLQotCQkgICAgICAvKiBJZiB3ZSBjcmVhdGVkIGEgc3ltYm9sIGluIHRoZSBwcm9jZXNzIG9mIHRoaXMgdGVzdCB0aGVuCi0JCQkgZGVsZXRlIGl0IG5vdywgc28gdGhhdCBpdCB3aWxsIG5vdCBiZSBvdXRwdXQgd2l0aCB0aGUgcmVhbAotCQkJIHN5bWJvbHMuLi4gKi8KLQkJICAgICAgaWYgKGV4aXN0cyA9PSAwCi0JCQkgICYmIGV4Llhfb3AgPT0gT19zeW1ib2wpCi0JCQlzeW1ib2xfcmVtb3ZlIChleC5YX2FkZF9zeW1ib2wsCi0JCQkJICAgICAgICYgc3ltYm9sX3Jvb3RQLCAmIHN5bWJvbF9sYXN0UCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzeXN0ZW1fcmVnaXN0ZXJfbmFtZSAoJiBleCwgZmFsc2UsIGZhbHNlKQotCQkgICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1NSRykgPT0gMCkKLQkJewotCQkgIGVycm1zZyA9IF8oInN5bnRheCBlcnJvcjogc3lzdGVtIHJlZ2lzdGVyIG5vdCBleHBlY3RlZCIpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoY2NfbmFtZSAoJmV4KQotCQkgICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX0NDKSA9PSAwKQotCQl7Ci0JCSAgZXJybXNnID0gXygic3ludGF4IGVycm9yOiBjb25kaXRpb24gY29kZSBub3QgZXhwZWN0ZWQiKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGV4cHJlc3Npb24gKCYgZXgpOwotCQkgIC8qIFNwZWNpYWwgY2FzZToKLQkJICAgICBJZiB3ZSBhcmUgYXNzZW1ibGluZyBhIE1PViBpbnN0cnVjdGlvbiAob3IgYSBDQUxMVC4uLi4gOi0pCi0JCSAgICAgYW5kIHRoZSBpbW1lZGlhdGUgdmFsdWUgZG9lcyBub3QgZml0IGludG8gdGhlIGJpdHMKLQkJICAgICBhdmFpbGFibGUgdGhlbiBjcmVhdGUgYSBmYWtlIGVycm9yIHNvIHRoYXQgdGhlIG5leHQgTU9WCi0JCSAgICAgaW5zdHJ1Y3Rpb24gd2lsbCBiZSBzZWxlY3RlZC4gIFRoaXMgb25lIGhhcyBhIDMyIGJpdAotCQkgICAgIGltbWVkaWF0ZSBmaWVsZC4gICovCi0KLQkJICBpZiAoKChpbnNuICYgMHgwN2UwKSA9PSAweDAyMDApCi0JCSAgICAgICYmIGV4Llhfb3AgPT0gT19jb25zdGFudAotCQkgICAgICAmJiAoZXguWF9hZGRfbnVtYmVyIDwgKC0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkpCi0JCQkgIHx8IGV4LlhfYWRkX251bWJlciA+ICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSkKLQkJICAgIGVycm1zZyA9IF8oImltbWVkaWF0ZSBvcGVyYW5kIGlzIHRvbyBsYXJnZSIpOwotCQl9Ci0KLQkgICAgICBpZiAoZXJybXNnKQotCQlnb3RvIGVycm9yOwotCSAgICAgIAotLyogZnByaW50ZiAoc3RkZXJyLCAiIGluc246ICV4LCBvcGVyYW5kICVkLCBvcDogJWQsIGFkZF9udW1iZXI6ICVkXG4iLAotICAgaW5zbiwgb3BpbmRleF9wdHIgLSBvcGNvZGUtPm9wZXJhbmRzLCBleC5YX29wLCBleC5YX2FkZF9udW1iZXIpOyAqLwotCi0JICAgICAgc3dpdGNoIChleC5YX29wKSAKLQkJewotCQljYXNlIE9faWxsZWdhbDoKLQkJICBlcnJtc2cgPSBfKCJpbGxlZ2FsIG9wZXJhbmQiKTsKLQkJICBnb3RvIGVycm9yOwotCQljYXNlIE9fYWJzZW50OgotCQkgIGVycm1zZyA9IF8oIm1pc3Npbmcgb3BlcmFuZCIpOwotCQkgIGdvdG8gZXJyb3I7Ci0JCWNhc2UgT19yZWdpc3RlcjoKLQkJICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgKFY4NTBfT1BFUkFORF9SRUcgfCBWODUwX09QRVJBTkRfU1JHKSkgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgZXJybXNnID0gXygiaW52YWxpZCBvcGVyYW5kIik7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0JCSAgaW5zbiA9IHY4NTBfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlciwKLQkJCQkJICAgICAgKGNoYXIgKikgTlVMTCwgMCwKLQkJCQkJICAgICAgY29weV9vZl9pbnN0cnVjdGlvbik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBPX2NvbnN0YW50OgotCQkgIGluc24gPSB2ODUwX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCBleC5YX2FkZF9udW1iZXIsCi0JCQkJCSAgICAgIChjaGFyICopIE5VTEwsIDAsCi0JCQkJCSAgICAgIGNvcHlfb2ZfaW5zdHJ1Y3Rpb24pOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciB0aGlzIGV4cHJlc3Npb24uICAqLwotCQkgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCi0JCSAgZml4dXBzWyBmYyBdLmV4cCAgICAgPSBleDsKLQkJICBmaXh1cHNbIGZjIF0ub3BpbmRleCA9ICogb3BpbmRleF9wdHI7Ci0JCSAgZml4dXBzWyBmYyBdLnJlbG9jICAgPSBCRkRfUkVMT0NfVU5VU0VEOwotCQkgICsrZmM7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCi0JICB3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnLCcgfHwgKnN0ciA9PSAnWycgfHwgKnN0ciA9PSAnXScKLQkJIHx8ICpzdHIgPT0gJyknKQotCSAgICArK3N0cjsKLQl9Ci0gICAgICBtYXRjaCA9IDE7Ci0KLSAgICBlcnJvcjoKLSAgICAgIGlmIChtYXRjaCA9PSAwKQotICAgICAgICB7Ci0JICBuZXh0X29wY29kZSA9IG9wY29kZSArIDE7Ci0JICBpZiAobmV4dF9vcGNvZGUtPm5hbWUgIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAobmV4dF9vcGNvZGUtPm5hbWUsIG9wY29kZS0+bmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgIG9wY29kZSA9IG5leHRfb3Bjb2RlOwotCi0JICAgICAgLyogU2tpcCB2ZXJzaW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0YXJnZXQKLQkJIHByb2Nlc3Nvci4gICovCi0JICAgICAgaWYgKChvcGNvZGUtPnByb2Nlc3NvcnMgJiBwcm9jZXNzb3JfbWFzaykgPT0gMCkKLQkJZ290byBlcnJvcjsKLQkgICAgICAKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgCi0JICBhc19iYWQgKCIlczogJXMiLCBjb3B5X29mX2luc3RydWN0aW9uLCBlcnJtc2cpOwotCSAgCi0JICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJ10nKQotCSAgICArKyBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlZF9pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICAgIAotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgKytzdHI7Ci0KLSAgaWYgKCpzdHIgIT0gJ1wwJykKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGFzX2JhZCAoXygianVuayBhdCBlbmQgb2YgbGluZTogYCVzJyIpLCBzdHIpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLiAqLwotICAKLSAgaWYgKHJlbGF4YWJsZSAmJiBmYyA+IDApCi0gICAgewotICAgICAgaW5zbl9zaXplID0gMjsKLSAgICAgIGZjID0gMDsKLQotICAgICAgaWYgKCFzdHJjbXAgKG9wY29kZS0+bmFtZSwgImJyIikpCi0JewotCSAgZiA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNCwgMiwgMiwKLQkJCWZpeHVwc1swXS5leHAuWF9hZGRfc3ltYm9sLAotCQkJZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIsCi0JCQkoY2hhciAqKWZpeHVwc1swXS5vcGluZGV4KTsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgaW5zbl9zaXplKTsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZiArIDIsIDAsIDIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA2LCA0LCAwLAotCQkJZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wsCi0JCQlmaXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciwKLQkJCShjaGFyICopZml4dXBzWzBdLm9waW5kZXgpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCBpbnNuX3NpemUpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmICsgMiwgMCwgNCk7Ci0JfQotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICAvKiBGb3VyIGJ5dGUgaW5zbnMgaGF2ZSBhbiBvcGNvZGUgd2l0aCB0aGUgdHdvIGhpZ2ggYml0cyBvbi4gICovCi0gICAgICBpZiAoKGluc24gJiAweDA2MDApID09IDB4MDYwMCkKLQlpbnNuX3NpemUgPSA0OwotICAgICAgZWxzZQotCWluc25fc2l6ZSA9IDI7Ci0KLSAgICAgIC8qIFNwZWNpYWwgY2FzZTogMzIgYml0IE1PViAqLwotICAgICAgaWYgKChpbnNuICYgMHhmZmUwKSA9PSAweDA2MjApCi0JaW5zbl9zaXplID0gMjsKLSAgICAgIAotICAgICAgZiA9IGZyYWdfbW9yZSAoaW5zbl9zaXplKTsKLSAgICAgIAotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCBpbnNuX3NpemUpOwotCi0gICAgICBpZiAoZXh0cmFfZGF0YV9hZnRlcl9pbnNuKQotCXsKLQkgIGYgPSBmcmFnX21vcmUgKGV4dHJhX2RhdGFfbGVuKTsKLQkgIAotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBleHRyYV9kYXRhLCBleHRyYV9kYXRhX2xlbik7Ci0KLQkgIGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbiA9IGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogQ3JlYXRlIGFueSBmaXh1cHMuICBBdCB0aGlzIHBvaW50IHdlIGRvIG5vdCB1c2UgYQotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUsIGJ1dCBpbnN0ZWFkIGp1c3QgdXNlIHRoZQotICAgICBCRkRfUkVMT0NfVU5VU0VEIHBsdXMgdGhlIG9wZXJhbmQgaW5kZXguICBUaGlzIGxldHMgdXMgZWFzaWx5Ci0gICAgIGhhbmRsZSBmaXh1cHMgZm9yIGFueSBvcGVyYW5kIHR5cGUsIGFsdGhvdWdoIHRoYXQgaXMgYWRtaXR0ZWRseQotICAgICBub3QgYSB2ZXJ5IGV4Y2l0aW5nIGZlYXR1cmUuICBXZSBwaWNrIGEgQkZEIHJlbG9jIHR5cGUgaW4KLSAgICAgbWRfYXBwbHlfZml4LiAgKi8gIAotICBmb3IgKGkgPSAwOyBpIDwgZmM7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZDsKLSAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgICByZWxvYzsKLSAgICAgIAotICAgICAgb3BlcmFuZCA9ICYgdjg1MF9vcGVyYW5kc1sgZml4dXBzW2ldLm9waW5kZXggXTsKLQotICAgICAgcmVsb2MgPSBmaXh1cHNbaV0ucmVsb2M7Ci0gICAgICAKLSAgICAgIGlmIChyZWxvYyAhPSBCRkRfUkVMT0NfVU5VU0VEKQotCXsKLQkgIHJlbG9jX2hvd3RvX3R5cGUgKiByZWxvY19ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LAotCQkJCQkJCQkgIHJlbG9jKTsKLQkgIGludCAgICAgICAgICAgICAgICBzaXplOwotCSAgaW50ICAgICAgICAgICAgICAgIGFkZHJlc3M7Ci0JICBmaXhTICogICAgICAgICAgICAgZml4UDsKLQotCSAgaWYgKCFyZWxvY19ob3d0bykKLQkgICAgYWJvcnQoKTsKLQkgIAotCSAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG8pOwotCi0JICAvKiBYWFggVGhpcyB3aWxsIGFib3J0IG9uIGFuIFJfVjg1MF84IHJlbG9jIC0KLQkgICAgIGlzIHRoaXMgcmVsb2MgYWN0dWFsbHkgdXNlZCA/ICovCi0JICBpZiAoc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgCi0JICAgIGFib3J0ICgpOwotCi0JICBhZGRyZXNzID0gKGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkgKyBpbnNuX3NpemUgLSBzaXplOwotCi0JICBpZiAocmVsb2MgPT0gQkZEX1JFTE9DXzMyKQotCSAgICB7Ci0JICAgICAgYWRkcmVzcyArPSAyOwotCSAgICB9Ci0JICAKLQkgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGFkZHJlc3MsIHNpemUsCi0JCQkgICAgICAmIGZpeHVwc1tpXS5leHAsIAotCQkJICAgICAgcmVsb2NfaG93dG8tPnBjX3JlbGF0aXZlLAotCQkJICAgICAgcmVsb2MpOwotCi0JICBzd2l0Y2ggKHJlbG9jKQotCSAgICB7Ci0JICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX0hJMTY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKLQkgICAgICBmaXhQLT5meF9ub19vdmVyZmxvdyA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZml4X25ld19leHAgKAotCQkgICAgICAgZnJhZ19ub3csCi0JCSAgICAgICBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDQsCi0JCSAgICAgICAmIGZpeHVwc1tpXS5leHAsCi0JCSAgICAgICAxIC8qIEZJWE1FOiBWODUwX09QRVJBTkRfUkVMQVRJVkUgPz8/ICovLAotCQkgICAgICAgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgKGZpeHVwc1tpXS5vcGluZGV4Ci0JCQkJCQkgICArIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQpCi0JCSAgICAgICApOwotCX0KLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZWRfaW5wdXRfbGluZV9wb2ludGVyOwotfQotCi0KLS8qIElmIHdoaWxlIHByb2Nlc3NpbmcgYSBmaXh1cCwgYSByZWxvYyByZWFsbHkgbmVlZHMgdG8gYmUgY3JlYXRlZCAqLwotLyogdGhlbiBpdCBpcyBkb25lIGhlcmUuICAqLwotICAgICAgICAgICAgICAgICAKLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWcsIGZpeHApCi0gICAgIGFzZWN0aW9uICogc2VnOwotICAgICBmaXhTICogICAgIGZpeHA7Ci17Ci0gIGFyZWxlbnQgKiByZWxvYzsKLSAgCi0gIHJlbG9jICAgICAgICAgICAgICA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAmIGZpeHAtPmZ4X2FkZHN5LT5ic3ltOwotICByZWxvYy0+YWRkcmVzcyAgICAgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIHJlbG9jLT5ob3d0byAgICAgICA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhwLT5meF9yX3R5cGUpOwotCi0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgICAgICAgICAgICAgICBfKCJyZWxvYyAlZCBub3Qgc3VwcG9ydGVkIGJ5IG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCQkgICAgKGludCkgZml4cC0+Znhfcl90eXBlKTsKLQotICAgICAgeGZyZWUgKHJlbG9jKTsKLSAgICAgIAotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gIGVsc2UKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICAKLSAgcmV0dXJuIHJlbG9jOwotfQotCi0vKiBBc3N1bWUgZXZlcnl0aGluZyB3aWxsIGZpdCBpbiB0d28gYnl0ZXMsIHRoZW4gZXhwYW5kIGFzIG5lY2Vzc2FyeS4gICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqIGZyYWdwOwotICAgICBhc2VjdGlvbiAqIHNlZzsKLXsKLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDApCi0gICAgZnJhZ3AtPmZyX3ZhciA9IDQ7Ci0gIGVsc2UgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgZnJhZ3AtPmZyX3ZhciA9IDI7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIDI7Ci19IAotCi1sb25nCi12ODUwX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4cCwgc2VjdGlvbikKLSAgICAgZml4UyAqIGZpeHA7Ci0gICAgIHNlZ1QgICBzZWN0aW9uOwotewotICAvKiBJZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCwgb3IgaW4gYSBzZWN0aW9uIG90aGVyIHRoYW4gb3VyIG93biwKLSAgICAgdGhlbiBsZXQgdGhlIGxpbmtlciBmaWd1cmUgaXQgb3V0LiAgKi8KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmICghIFNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpCi0JICB8fCAoU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpICE9IHNlY3Rpb24pKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZC9ub3QgaW4gb3VyIHNlY3Rpb24uCi0JIExldCB0aGUgbGlua2VyIGZpZ3VyZSBpdCBvdXQuICAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci19Ci0KLWludAotbWRfYXBwbHlfZml4MyAoZml4cCwgdmFsdWVwLCBzZWcpCi0gICAgIGZpeFMgKiAgIGZpeHA7Ci0gICAgIHZhbHVlVCAqIHZhbHVlcDsKLSAgICAgc2VnVCAgICAgc2VnOwotewotICB2YWx1ZVQgdmFsdWU7Ci0gIGNoYXIgKiB3aGVyZTsKLQotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgewotICAgICAgZml4cC0+ZnhfZG9uZSA9IDA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ID09IChzeW1ib2xTICopIE5VTEwpCi0gICAgewotICAgICAgdmFsdWUgPSAqIHZhbHVlcDsKLSAgICAgIGZpeHAtPmZ4X2RvbmUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgdmFsdWUgPSAqIHZhbHVlcDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbHVlID0gZml4cC0+Znhfb2Zmc2V0OwotICAgICAgaWYgKGZpeHAtPmZ4X3N1YnN5ICE9IChzeW1ib2xTICopIE5VTEwpCi0JewotCSAgaWYgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X3N1YnN5KSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICB2YWx1ZSAtPSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UgZG9uJ3QgYWN0dWFsbHkgc3VwcG9ydCBzdWJ0cmFjdGluZyBhIHN5bWJvbC4gICovCi0JICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgIF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICgoaW50KSBmaXhwLT5meF9yX3R5cGUgPj0gKGludCkgQkZEX1JFTE9DX1VOVVNFRCkKLSAgICB7Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgb3BpbmRleDsKLSAgICAgIGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kOwotICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgIGluc247Ci0KLSAgICAgIG9waW5kZXggPSAoaW50KSBmaXhwLT5meF9yX3R5cGUgLSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEOwotICAgICAgb3BlcmFuZCA9ICYgdjg1MF9vcGVyYW5kc1sgb3BpbmRleCBdOwotCi0gICAgICAvKiBGZXRjaCB0aGUgaW5zdHJ1Y3Rpb24sIGluc2VydCB0aGUgZnVsbHkgcmVzb2x2ZWQgb3BlcmFuZAotICAgICAgICAgdmFsdWUsIGFuZCBzdHVmZiB0aGUgaW5zdHJ1Y3Rpb24gYmFjayBhZ2Fpbi4KLQotCSBOb3RlIHRoZSBpbnN0cnVjdGlvbiBoYXMgYmVlbiBzdG9yZWQgaW4gbGl0dGxlIGVuZGlhbgotCSBmb3JtYXQhICAqLwotICAgICAgd2hlcmUgPSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmU7Ci0KLSAgICAgIGluc24gPSBiZmRfZ2V0bDMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBpbnNuID0gdjg1MF9pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgKG9mZnNldFQpIHZhbHVlLAotCQkJCSAgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwgTlVMTCk7Ci0gICAgICBiZmRfcHV0bDMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotCi0gICAgICBpZiAoZml4cC0+ZnhfZG9uZSkKLQl7Ci0JICAvKiBOb3RoaW5nIGVsc2UgdG8gZG8gaGVyZS4gKi8KLQkgIHJldHVybiAxOwotCX0KLQotICAgICAgLyogRGV0ZXJtaW5lIGEgQkZEIHJlbG9jIHZhbHVlIGJhc2VkIG9uIHRoZSBvcGVyYW5kIGluZm9ybWF0aW9uLiAgCi0JIFdlIGFyZSBvbmx5IHByZXBhcmVkIHRvIHR1cm4gYSBmZXcgb2YgdGhlIG9wZXJhbmRzIGludG8gcmVsb2NzLiAqLwotCi0gICAgICBpZiAob3BlcmFuZC0+Yml0cyA9PSAyMikKLQlmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfVjg1MF8yMl9QQ1JFTDsKLSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmJpdHMgPT0gOSkKLQlmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfVjg1MF85X1BDUkVMOwotICAgICAgZWxzZQotCXsKLQkgIC8qIGZwcmludGYgKHN0ZGVyciwgImJpdHM6ICVkLCBpbnNuOiAleFxuIiwgb3BlcmFuZC0+Yml0cywgaW5zbik7ICovCi0JICAKLQkgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgICAgIF8oInVucmVzb2x2ZWQgZXhwcmVzc2lvbiB0aGF0IG11c3QgYmUgcmVzb2x2ZWQiKSk7Ci0JICBmaXhwLT5meF9kb25lID0gMTsKLQkgIHJldHVybiAxOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGZpeHAtPmZ4X2RvbmUpCi0gICAgewotICAgICAgLyogV2Ugc3RpbGwgaGF2ZSB0byBpbnNlcnQgdGhlIHZhbHVlIGludG8gbWVtb3J5ISAgKi8KLSAgICAgIHdoZXJlID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOwotCi0gICAgICBpZiAoZml4cC0+Znhfc2l6ZSA9PSAxKQotCSogd2hlcmUgPSB2YWx1ZSAmIDB4ZmY7Ci0gICAgICBlbHNlIGlmIChmaXhwLT5meF9zaXplID09IDIpCi0JYmZkX3B1dGwxNiAodmFsdWUgJiAweGZmZmYsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGVsc2UgaWYgKGZpeHAtPmZ4X3NpemUgPT0gNCkKLQliZmRfcHV0bDMyICh2YWx1ZSwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgIH0KLSAgCi0gIGZpeHAtPmZ4X2FkZG51bWJlciA9IHZhbHVlOwotICByZXR1cm4gMTsKLX0KLQotDAotLyogUGFyc2UgYSBjb25zIGV4cHJlc3Npb24uICBXZSBoYXZlIHRvIGhhbmRsZSBoaSgpLCBsbygpLCBldGMKLSAgIG9uIHRoZSB2ODUwLiAgKi8KLXZvaWQKLXBhcnNlX2NvbnNfZXhwcmVzc2lvbl92ODUwIChleHApCi0gIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIC8qIFNlZSBpZiB0aGVyZSdzIGEgcmVsb2MgcHJlZml4IGxpa2UgaGkoKSB3ZSBoYXZlIHRvIGhhbmRsZS4gICovCi0gIGhvbGRfY29uc19yZWxvYyA9IHY4NTBfcmVsb2NfcHJlZml4IChOVUxMKTsKLQotICAvKiBEbyBub3JtYWwgZXhwcmVzc2lvbiBwYXJzaW5nLiAgKi8KLSAgZXhwcmVzc2lvbiAoZXhwKTsKLX0KLQotLyogQ3JlYXRlIGEgZml4dXAgZm9yIGEgY29ucyBleHByZXNzaW9uLiAgSWYgcGFyc2VfY29uc19leHByZXNzaW9uX3Y4NTAKLSAgIGZvdW5kIGEgcmVsb2MgcHJlZml4LCB0aGVuIHdlIHVzZSB0aGF0IHJlbG9jLCBlbHNlIHdlIGNob29zZSBhbgotICAgYXBwcm9wcmlhdGUgb25lIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBleHByZXNzaW9uLiAgKi8KLXZvaWQKLWNvbnNfZml4X25ld192ODUwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwKQotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgaW50IHdoZXJlOwotICAgICBpbnQgc2l6ZTsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgaWYgKGhvbGRfY29uc19yZWxvYyA9PSBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIGlmIChzaXplID09IDQpCi0JaG9sZF9jb25zX3JlbG9jID0gQkZEX1JFTE9DXzMyOwotICAgICAgaWYgKHNpemUgPT0gMikKLQlob2xkX2NvbnNfcmVsb2MgPSBCRkRfUkVMT0NfMTY7Ci0gICAgICBpZiAoc2l6ZSA9PSAxKQotCWhvbGRfY29uc19yZWxvYyA9IEJGRF9SRUxPQ184OwotICAgIH0KLQotICBpZiAoZXhwICE9IE5VTEwpCi0gICAgZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsIDAsIGhvbGRfY29uc19yZWxvYyk7Ci0gIGVsc2UKLSAgICBmaXhfbmV3IChmcmFnLCB3aGVyZSwgc2l6ZSwgTlVMTCwgMCwgMCwgaG9sZF9jb25zX3JlbG9jKTsKLX0KLWJvb2xlYW4KLXY4NTBfZml4X2FkanVzdGFibGUgKGZpeFApCi0gICAgZml4UyAqZml4UDsKLXsKLSAKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0gCi0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLwotICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotICAvKiBEb24ndCBhZGp1c3QgZnVuY3Rpb24gbmFtZXMgKi8KLSAgaWYgKFNfSVNfRlVOQ1RJT04gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBXZSBuZWVkIHRoZSBzeW1ib2wgbmFtZSBmb3IgdGhlIFZUQUJMRSBlbnRyaWVzICovCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMDsKLSAKLSAgcmV0dXJuIDE7Ci19Ci0gCi1pbnQKLXY4NTBfZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKLSAgICAgIHN0cnVjdCBmaXggKmZpeHA7Ci17Ci0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMTsKLSAKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXY4NTAuaCBiL2dhcy9jb25maWcvdGMtdjg1MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWQ0ZDFjLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdjg1MC5oCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyogdGMtdjg1MC5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy12ODUwLmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19WODUwCi0KLSNpbmNsdWRlIDxlbGYvdjg1MC5oPgotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gI2Vycm9yIFY4NTAgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCi0jZW5kaWYKLQotLyogVGhlIHRhcmdldCBCRkQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggCQliZmRfYXJjaF92ODUwCi0KLS8qIFRoZSB0YXJnZXQgQkZEIGZvcm1hdC4gICovCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgCQkiZWxmMzItdjg1MCIKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgdjg1MF9maXhfYWRqdXN0YWJsZShmaXhQKQotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeHApIHY4NTBfZm9yY2VfcmVsb2NhdGlvbihmaXhwKQotZXh0ZXJuIGludCB2ODUwX2ZvcmNlX3JlbG9jYXRpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLS8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jZGVmaW5lIERJRkZfRVhQUl9PSwkJLyogZm9vLS4gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLQotLyogV2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgLndvcmQgc3RyYW5nZWx5LiAgKi8KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIG1kX251bWJlcl90b19jaGFycyBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuCi0gICAgIAotLyogV2UgbmVlZCB0byBoYW5kbGUgbG8oKSwgaGkoKSwgZXRjIGV0YyBpbiAuaHdvcmQsIC53b3JkLCBldGMKLSAgIGRpcmVjdGl2ZXMsIHNvIHdlIGhhdmUgdG8gcGFyc2UgImNvbnMiIGV4cHJlc3Npb25zIG91cnNlbHZlcy4gICovCi0jZGVmaW5lIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTihFWFAsIE5CWVRFUykgcGFyc2VfY29uc19leHByZXNzaW9uX3Y4NTAgKEVYUCkKLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXIGNvbnNfZml4X25ld192ODUwCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0KLS8qIFRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIHRoZSBzbWFsbCBkYXRhIGFyZWEgKHBvaW50ZWQgdG8gYnkgR1ApLiAgKi8KLSNkZWZpbmUgU0hGX1Y4NTBfR1BSRUwJCTB4MTAwMDAwMDAKLS8qIFRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIHRoZSB0aW55IGRhdGEgYXJlYSAocG9pbnRlZCB0byBieSBFUCkuICAqLwotI2RlZmluZSBTSEZfVjg1MF9FUFJFTAkJMHgyMDAwMDAwMAotLyogVGhpcyBzZWN0aW9uIG11c3QgYmUgaW4gdGhlIHplcm8gZGF0YSBhcmVhIChwb2ludGVkIHRvIGJ5IFIwKS4gICovCi0jZGVmaW5lIFNIRl9WODUwX1IwUkVMCQkweDQwMDAwMDAwCi0KLSNkZWZpbmUgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMgXAotICB7ICIuc2RhdGEiLAlTSFRfUFJPR0JJVFMsCQlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfVjg1MF9HUFJFTAl9LCBcCi0gIHsgIi5yb3NkYXRhIiwJU0hUX1BST0dCSVRTLAkJU0hGX0FMTE9DICsgICAgICAgICAgICAgU0hGX1Y4NTBfR1BSRUwJfSwgXAotICB7ICIuc2JzcyIsCVNIVF9OT0JJVFMsCQlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfVjg1MF9HUFJFTAl9LCBcCi0gIHsgIi5zY29tbW9uIiwJU0hUX1Y4NTBfU0NPTU1PTiwgCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX0dQUkVMCX0sIFwKLSAgeyAiLnRkYXRhIiwJU0hUX1BST0dCSVRTLAkJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfRVBSRUwJfSwgXAotICB7ICIudGJzcyIsCVNIVF9OT0JJVFMsCQlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfVjg1MF9FUFJFTAl9LCBcCi0gIHsgIi50Y29tbW9uIiwJU0hUX1Y4NTBfVENPTU1PTiwJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfUjBSRUwJfSwgXAotICB7ICIuemRhdGEiLAlTSFRfUFJPR0JJVFMsCQlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfVjg1MF9SMFJFTAl9LCBcCi0gIHsgIi5yb3pkYXRhIiwJU0hUX1BST0dCSVRTLAkJU0hGX0FMTE9DICsgICAgICAgICAgICAgU0hGX1Y4NTBfUjBSRUwJfSwgXAotICB7ICIuemJzcyIsCVNIVF9OT0JJVFMsCSAgCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX1IwUkVMCX0sIFwKLSAgeyAiLnpjb21tb24iLAlTSFRfVjg1MF9aQ09NTU9OLCAJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfUjBSRUwJfSwgXAotICB7ICIuY2FsbF90YWJsZV9kYXRhIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgfSwJICAgXAotICB7ICIuY2FsbF90YWJsZV90ZXh0IiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfRVhFQ0lOU1RSIH0sCi0KLSNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKGZpeFAsc2VjdGlvbikgdjg1MF9wY3JlbF9mcm9tX3NlY3Rpb24gKGZpeFAsIHNlY3Rpb24pCi1leHRlcm4gbG9uZyB2ODUwX3BjcmVsX2Zyb21fc2VjdGlvbiAoKTsKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdmF4LmMgYi9nYXMvY29uZmlnL3RjLXZheC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGU0YTliLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdmF4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQyICswLDAgQEAKLS8qIHRjLXZheC5jIC0gdmF4LXNwZWNpZmljIC0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2luY2x1ZGUgInZheC1pbnN0LmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgkJLyogRm9yIEZSQUdfQVBQRU5EXzFfQ0hBUiBtYWNybyBpbiAiZnJhZ3MuaCIgKi8KLQotLyogVGhlc2UgY2hhcnMgc3RhcnQgYSBjb21tZW50IGFueXdoZXJlIGluIGEgc291cmNlIGZpbGUgKGV4Y2VwdCBpbnNpZGUKLSAgIGFub3RoZXIgY29tbWVudCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFRoZXNlIGNoYXJzIG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAqLwotLyogTm90ZSB0aGF0IGZvciB0aGUgVkFYIHRoZSBhcmUgdGhlIHNhbWUgYXMgY29tbWVudF9jaGFycyBhYm92ZS4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBhcyBpbiAwZjEyMy40NTYgKi8KLS8qIG9yICAgIDBIMS4yMzRFLTEyIChzZWUgZXhwIGNoYXJzIGFib3ZlKSAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRGZGZ0doSCI7Ci0KLS8qIEFsc28gYmUgYXdhcmUgdGhhdCBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQgbWF5IGhhdmUgdG8gYmUKLSAgIGNoYW5nZWQgaW4gcmVhZC5jIC4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdCBhbGwsCi0gICBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4gICovCi0KLS8qIEhvbGQgZGV0YWlscyBvZiBhbiBvcGVyYW5kIGV4cHJlc3Npb24gKi8KLXN0YXRpYyBleHByZXNzaW9uUyBleHBfb2Zfb3BlcmFuZFtWSVRfTUFYX09QRVJBTkRTXTsKLXN0YXRpYyBzZWdUIHNlZ19vZl9vcGVyYW5kW1ZJVF9NQVhfT1BFUkFORFNdOwotCi0vKiBBIHZheCBpbnN0cnVjdGlvbiBhZnRlciBkZWNvZGluZy4gKi8KLXN0YXRpYyBzdHJ1Y3Qgdml0IHY7Ci0KLS8qIEhvbGQgZGV0YWlscyBvZiBiaWcgb3BlcmFuZHMuICovCi1MSVRUTEVOVU1fVFlQRSBiaWdfb3BlcmFuZF9iaXRzW1ZJVF9NQVhfT1BFUkFORFNdW1NJWkVfT0ZfTEFSR0VfTlVNQkVSXTsKLUZMT05VTV9UWVBFIGZsb2F0X29wZXJhbmRbVklUX01BWF9PUEVSQU5EU107Ci0vKiBBYm92ZSBpcyBtYWRlIHRvIHBvaW50IGludG8gYmlnX29wZXJhbmRfYml0cyBieSBtZF9iZWdpbigpLiAqLwotCi1pbnQgZmxhZ19oYXNoX2xvbmdfbmFtZXM7CS8qIC0rICovCi1pbnQgZmxhZ19vbmU7CQkJLyogLTEgKi8KLWludCBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmM7CS8qIC1IICovCi1pbnQgZmxhZ19ub19oYXNoX21peGVkX2Nhc2U7CS8qIC1oIE5VTSAqLwotDAotLyoKLSAqIEZvciBWQVgsIHJlbGF0aXZlIGFkZHJlc3NlcyBvZiAianVzdCB0aGUgcmlnaHQgbGVuZ3RoIiBhcmUgZWFzeS4KLSAqIFRoZSBicmFuY2ggZGlzcGxhY2VtZW50IGlzIGFsd2F5cyB0aGUgbGFzdCBvcGVyYW5kLCBldmVuIGluCi0gKiBzeW50aGV0aWMgaW5zdHJ1Y3Rpb25zLgotICogRm9yIFZBWCwgd2UgZW5jb2RlIHRoZSByZWxheF9zdWJzdGF0ZVRzIChpbiBlLmcuIGZyX3N1YnN0YXRlKSBhczoKLSAqCi0gKgkJICAgIDQgICAgICAgMyAgICAgICAyICAgICAgIDEgICAgICAgMAkgICAgIGJpdCBudW1iZXIKLSAqCS0tLS8gLy0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAqCQl8ICAgICB3aGF0IHN0YXRlID8JfCAgaG93IGxvbmcgPwl8Ci0gKgktLS0vIC8tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gKgotICogVGhlICJob3cgbG9uZyIgYml0cyBhcmUgMDA9Ynl0ZSwgMDE9d29yZCwgMTA9bG9uZy4KLSAqIFRoaXMgaXMgYSBVbip4IGNvbnZlbnRpb24uCi0gKiBOb3QgYWxsIGxlbmd0aHMgYXJlIGxlZ2l0IGZvciBhIGdpdmVuIHZhbHVlIG9mICh3aGF0IHN0YXRlKS4KLSAqIFRoZSAiaG93IGxvbmciIHJlZmVycyBtZXJlbHkgdG8gdGhlIGRpc3BsYWNlbWVudCBsZW5ndGguCi0gKiBUaGUgYWRkcmVzcyB1c3VhbGx5IGhhcyBzb21lIGNvbnN0YW50IGJ5dGVzIGluIGl0IGFzIHdlbGwuCi0gKgotCi0gZ3JvdXBzIGZvciBWQVggYWRkcmVzcyByZWxheGluZy4KLQotIDEuCSJmb28iIHBjLXJlbGF0aXZlLgotIGxlbmd0aCBvZiBieXRlLCB3b3JkLCBsb25nCi0KLSAyYS4JSjxjb25kPiB3aGVyZSA8Y29uZD4gaXMgYSBzaW1wbGUgZmxhZyB0ZXN0LgotIGxlbmd0aCBvZiBieXRlLCB3b3JkLCBsb25nLgotIFZBWCBvcGNvZGVzIGFyZToJKEhleCkKLSBibmVxL2JuZXF1CTEyCi0gYmVxbC9iZXFsdQkxMwotIGJndHIJCTE0Ci0gYmxlcQkJMTUKLSBiZ2VxCQkxOAotIGJsc3MJCTE5Ci0gYmd0cnUJCTFhCi0gYmxlcXUJCTFiCi0gYnZjCQkxYwotIGJ2cwkJMWQKLSBiZ2VxdS9iY2MJMWUKLSBibHNzdS9iY3MJMWYKLSBBbHdheXMsIHlvdSBjb21wbGVtZW50IDB0aCBiaXQgdG8gcmV2ZXJzZSBjb25kaXRpb24uCi0gQWx3YXlzLCAxLWJ5dGUgb3Bjb2RlLCB0aGVuIDEtYnl0ZSBkaXNwbGFjZW1lbnQuCi0KLSAyYi4JSjxjb25kPiB3aGVyZSBjb25kIHRlc3RzIGEgbWVtb3J5IGJpdC4KLSBsZW5ndGggb2YgYnl0ZSwgd29yZCwgbG9uZy4KLSBWYXggb3Bjb2RlcyBhcmU6CShIZXgpCi0gYmJzCQllMAotIGJiYwkJZTEKLSBiYnNzCQllMgotIGJiY3MJCWUzCi0gYmJzYwkJZTQKLSBiYmNjCQllNQotIGJic3NpCQllNgotIGJiY2NpCQllNwotIEFsd2F5cywgeW91IGNvbXBsZW1lbnQgMHRoIGJpdCB0byByZXZlcnNlIGNvbmRpdGlvbi4KLSBBbHdheXMsIDEtYnl0ZSBvcGNkZSwgbG9uZ3dvcmQtYWRkcmVzcywgYnl0ZS1hZGRyZXNzLCAxLWJ5dGUtZGlzcGxhY2VtZW50Ci0KLSAyYy4JSjxjb25kPiB3aGVyZSBjb25kIHRlc3RzIGxvdy1vcmRlciBtZW1vcnkgYml0Ci0gbGVuZ3RoIG9mIGJ5dGUsd29yZCxsb25nLgotIFZheCBvcGNvZGVzIGFyZToJKEhleCkKLSBibGJzCQllOAotIGJsYmMJCWU5Ci0gQWx3YXlzLCB5b3UgY29tcGxlbWVudCAwdGggYml0IHRvIHJldmVyc2UgY29uZGl0aW9uLgotIEFsd2F5cywgMS1ieXRlIG9wY29kZSwgbG9uZ3dvcmQtYWRkcmVzcywgMS1ieXRlIGRpc3BsYWNlbWVudC4KLQotIDMuCUpicy9KYnIuCi0gbGVuZ3RoIG9mIGJ5dGUsd29yZCxsb25nLgotIFZheCBvcGNvZGVzIGFyZToJKEhleCkKLSBic2JiCQkxMAotIGJyYgkJMTEKLSBUaGVzZSBhcmUgbGlrZSAoMikgYnV0IHRoZXJlIGlzIG5vIGNvbmRpdGlvbiB0byByZXZlcnNlLgotIEFsd2F5cywgMSBieXRlIG9wY29kZSwgdGhlbiBkaXNwbGFjZW1lbnQvYWJzb2x1dGUuCi0KLSA0YS4JSmFjYlgKLSBsZW5ndGggb2Ygd29yZCwgbG9uZy4KLSBWYXggb3Bjb2RlcyBhcmU6CShIZXgpCi0gYWNidwkJM2QKLSBhY2JmCQk0ZgotIGFjYmQJCTZmCi0gYWJjYgkJOWQKLSBhY2JsCQlmMQotIGFjYmcJICAgICAgNGZmZAotIGFjYmgJICAgICAgNmZmZAotIEFsd2F5cywgd2UgY2Fubm90IHJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBicmFuY2g7IHdlIGhhdmUgYSB3b3JkCi0gZGlzcGxhY2VtZW50LgotIFRoZSBkb3VibGUtYnl0ZSBvcC1jb2RlcyBkb24ndCBodXJ0OiB3ZSBuZXZlciB3YW50IHRvIG1vZGlmeSB0aGUKLSBvcGNvZGUsIHNvIHdlIGRvbid0IGNhcmUgaG93IG1hbnkgYnl0ZXMgYXJlIGJldHdlZW4gdGhlIG9wY29kZSBhbmQKLSB0aGUgb3BlcmFuZC4KLQotIDRiLglKWG9iWFhYCi0gbGVuZ3RoIG9mIGxvbmcsIGxvbmcsIGJ5dGUuCi0gVmF4IG9wY29kZXMgYXJlOgkoSGV4KQotIGFvYmxzcwkJZjIKLSBhb2JsZXEJCWYzCi0gc29iZ2VxCQlmNAotIHNvYmd0cgkJZjUKLSBBbHdheXMsIHdlIGNhbm5vdCByZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgYnJhbmNoOyB3ZSBoYXZlIGEgYnl0ZQotIGRpc3BsYWNlbWVudC4KLQotIFRoZSBvbmx5IHRpbWUgd2UgbmVlZCB0byBtb2RpZnkgdGhlIG9wY29kZSBpcyBmb3IgY2xhc3MgMiBpbnN0cnVjdGlvbnMuCi0gQWZ0ZXIgcmVsYXgoKSB3ZSBtYXkgY29tcGxlbWVudCB0aGUgbG93ZXN0IG9yZGVyIGJpdCBvZiBzdWNoIGluc3RydWN0aW9uCi0gdG8gcmV2ZXJzZSBzZW5zZSBvZiBicmFuY2guCi0KLSBGb3IgY2xhc3MgMiBpbnN0cnVjdGlvbnMsIHdlIHN0b3JlIGNvbnRleHQgb2YgIndoZXJlIGlzIHRoZSBvcGNvZGUgbGl0ZXJhbCIuCi0gV2UgY2FuIGNoYW5nZSBhbiBvcGNvZGUncyBsb3dlc3Qgb3JkZXIgYml0IHdpdGhvdXQgYnJlYWtpbmcgYW55dGhpbmcgZWxzZS4KLQotIFdlIHNvbWV0aW1lcyBzdG9yZSBjb250ZXh0IGluIHRoZSBvcGVyYW5kIGxpdGVyYWwuIFRoaXMgd2F5IHdlIGNhbiBmaWd1cmUgb3V0Ci0gYWZ0ZXIgcmVsYXgoKSB3aGF0IHRoZSBvcmlnaW5hbCBhZGRyZXNzaW5nIG1vZGUgd2FzLgotICovCi0MCi0vKiBUaGVzZSBkaXNwbGFjZW1lbnRzIGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUKLSAgIGRpc3BsYWNlbWVudC4gIFRoZSBmaXJzdCBsZXR0ZXIgaXMgQnl0ZSwgV29yZC4gIDJuZCBsZXR0ZXIgaXMKLSAgIEZvcndhcmQsIEJhY2t3YXJkLiAqLwotI2RlZmluZSBCRiAoMSsgMTI3KQotI2RlZmluZSBCQiAoMSstMTI4KQotI2RlZmluZSBXRiAoMisgMzI3NjcpCi0jZGVmaW5lIFdCICgyKy0zMjc2OCkKLS8qIERvbnQgbmVlZCBMRiwgTEIgYmVjYXVzZSB0aGV5IGFsd2F5cyByZWFjaC4gW1RoZXkgYXJlIGNvZGVkIGFzIDAuXSAqLwotCi0KLSNkZWZpbmUgQyhhLGIpIEVOQ09ERV9SRUxBWChhLGIpCi0vKiBUaGlzIG1hY3JvIGhhcyBubyBzaWRlLWVmZmVjdHMuICovCi0jZGVmaW5lIEVOQ09ERV9SRUxBWCh3aGF0LGxlbmd0aCkgKCgod2hhdCkgPDwgMikgKyAobGVuZ3RoKSkKLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci0gIHsxLCAxLCAwLCAwfSwJCQkvKiBlcnJvciBzZW50aW5lbCAgIDAsMAkqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICAwLDEJKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgMCwyCSovCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiB1bnVzZWQJICAgIDAsMwkqLwotICB7QkYgKyAxLCBCQiArIDEsIDIsIEMgKDEsIDEpfSwvKiBCXiJmb28iCSAgICAxLDAgKi8KLSAge1dGICsgMSwgV0IgKyAxLCAzLCBDICgxLCAyKX0sLyogV14iZm9vIgkgICAgMSwxICovCi0gIHswLCAwLCA1LCAwfSwJCQkvKiBMXiJmb28iCSAgICAxLDIgKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgMSwzICovCi0gIHtCRiwgQkIsIDEsIEMgKDIsIDEpfSwJLyogYjxjb25kPiBCXiJmb28iICAyLDAgKi8KLSAge1dGICsgMiwgV0IgKyAyLCA0LCBDICgyLCAyKX0sLyogYnIuKz8gYnJ3IFgJICAgIDIsMSAqLwotICB7MCwgMCwgNywgMH0sCQkJLyogYnIuKz8gam1wIFgJICAgIDIsMiAqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICAyLDMgKi8KLSAge0JGLCBCQiwgMSwgQyAoMywgMSl9LAkvKiBicmIgQl5mb28JICAgIDMsMCAqLwotICB7V0YsIFdCLCAyLCBDICgzLCAyKX0sCS8qIGJydyBXXmZvbwkgICAgMywxICovCi0gIHswLCAwLCA1LCAwfSwJCQkvKiBKbXAgTF5mb28JICAgIDMsMiAqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICAzLDMgKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgNCwwICovCi0gIHtXRiwgV0IsIDIsIEMgKDQsIDIpfSwJLyogYWNiXyBeV2ZvbwkgICAgNCwxICovCi0gIHswLCAwLCAxMCwgMH0sCQkvKiBhY2JfLGJyLGptcCBMXmZvbzQsMiAqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICA0LDMgKi8KLSAge0JGLCBCQiwgMSwgQyAoNSwgMSl9LAkvKiBYb2JfX18sLGZvbyAgICAgIDUsMCAqLwotICB7V0YgKyA0LCBXQiArIDQsIDYsIEMgKDUsIDIpfSwvKiBYb2IuKzIsYnJiLiszLGJydzUsMSAqLwotICB7MCwgMCwgOSwgMH0sCQkJLyogWG9iLisyLGJyYi4rNixqbXA1LDIgKi8KLX07Ci0KLSN1bmRlZiBDCi0jdW5kZWYgQkYKLSN1bmRlZiBCQgotI3VuZGVmIFdGCi0jdW5kZWYgV0IKLQotdm9pZCBmbG9hdF9jb25zICgpOwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImRmbG9hdCIsIGZsb2F0X2NvbnMsICdkJ30sCi0gIHsiZmZsb2F0IiwgZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJnZmxvYXQiLCBmbG9hdF9jb25zLCAnZyd9LAotICB7ImhmbG9hdCIsIGZsb2F0X2NvbnMsICdoJ30sCi0gIHswfSwKLX07Ci0KLSNkZWZpbmUgU1RBVEVfUENfUkVMQVRJVkUJCSgxKQotI2RlZmluZSBTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gJKDIpCi0jZGVmaW5lIFNUQVRFX0FMV0FZU19CUkFOQ0gJCSgzKQkvKiBpbmNsdWRlcyBCU0IuLi4gKi8KLSNkZWZpbmUgU1RBVEVfQ09NUExFWF9CUkFOQ0gJICAgICAgICAoNCkKLSNkZWZpbmUgU1RBVEVfQ09NUExFWF9IT1AJCSg1KQotCi0jZGVmaW5lIFNUQVRFX0JZVEUJCQkoMCkKLSNkZWZpbmUgU1RBVEVfV09SRAkJCSgxKQotI2RlZmluZSBTVEFURV9MT05HCQkJKDIpCi0jZGVmaW5lIFNUQVRFX1VOREYJCQkoMykJLyogU3ltYm9sIHVuZGVmaW5lZCBpbiBwYXNzMSAqLwotCi0KLSNkZWZpbmUgbWluKGEsIGIpCSgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0KLWludCBmbG9udW1fZ2VuMnZheCBQQVJBTVMgKChjaGFyIGZvcm1hdF9sZXR0ZXIsIEZMT05VTV9UWVBFICogZiwKLQkJCSAgICBMSVRUTEVOVU1fVFlQRSAqIHdvcmRzKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqdmlwX2JlZ2luIFBBUkFNUyAoKGludCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCi0JCQkJICAgICAgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB2aXBfb3BfZGVmYXVsdHMgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgdmlwX29wIFBBUkFNUyAoKGNoYXIgKiwgc3RydWN0IHZvcCAqKSk7Ci1zdGF0aWMgdm9pZCB2aXAgUEFSQU1TICgoc3RydWN0IHZpdCAqLCBjaGFyICopKTsKLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY29uc3QgY2hhciAqZXJydHh0OwotICBGTE9OVU1fVFlQRSAqZlA7Ci0gIGludCBpOwotCi0gIGlmICgoZXJydHh0ID0gdmlwX2JlZ2luICgxLCAiJCIsICIqIiwgImAiKSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiVklQX0JFR0lOIGVycm9yOiVzIiksIGVycnR4dCk7Ci0gICAgfQotCi0gIGZvciAoaSA9IDAsIGZQID0gZmxvYXRfb3BlcmFuZDsKLSAgICAgICBmUCA8IGZsb2F0X29wZXJhbmQgKyBWSVRfTUFYX09QRVJBTkRTOwotICAgICAgIGkrKywgZlArKykKLSAgICB7Ci0gICAgICBmUC0+bG93ID0gJmJpZ19vcGVyYW5kX2JpdHNbaV1bMF07Ci0gICAgICBmUC0+aGlnaCA9ICZiaWdfb3BlcmFuZF9iaXRzW2ldW1NJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMV07Ci0gICAgfQotfQotDAotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChjb24sIHZhbHVlLCBuYnl0ZXMpCi0gICAgIGNoYXIgY29uW107Ci0gICAgIHZhbHVlVCB2YWx1ZTsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoY29uLCB2YWx1ZSwgbmJ5dGVzKTsKLX0KLQotLyogRml4IHVwIHNvbWUgZGF0YSBvciBpbnN0cnVjdGlvbnMgYWZ0ZXIgd2UgZmluZCBvdXQgdGhlIHZhbHVlIG9mIGEgc3ltYm9sCi0gICB0aGF0IHRoZXkgcmVmZXJlbmNlLiAgKi8KLQotdm9pZAkJCQkvKiBLbm93cyBhYm91dCBvcmRlciBvZiBieXRlcyBpbiBhZGRyZXNzLiAqLwotbWRfYXBwbHlfZml4IChmaXhQLCB2YWx1ZSkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWx1ZTsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsLAotCQkJCSh2YWx1ZVQpIHZhbHVlLCBmaXhQLT5meF9zaXplKTsKLX0KLQotbG9uZwotbWRfY2hhcnNfdG9fbnVtYmVyIChjb24sIG5ieXRlcykKLSAgICAgdW5zaWduZWQgY2hhciBjb25bXTsJLyogTG93IG9yZGVyIGJ5dGUgMXN0LiAqLwotICAgICBpbnQgbmJ5dGVzOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBpbnB1dC4gKi8KLXsKLSAgbG9uZyByZXR2YWw7Ci0gIGZvciAocmV0dmFsID0gMCwgY29uICs9IG5ieXRlcyAtIDE7IG5ieXRlcy0tOyBjb24tLSkKLSAgICB7Ci0gICAgICByZXR2YWwgPDw9IEJJVFNfUEVSX0NIQVI7Ci0gICAgICByZXR2YWwgfD0gKmNvbjsKLSAgICB9Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0MCi0vKiB2YXg6bWRfYXNzZW1ibGUoKSBlbWl0IGZyYWdzIGZvciAxIGluc3RydWN0aW9uICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChpbnN0cnVjdGlvbl9zdHJpbmcpCi0gICAgIGNoYXIgKmluc3RydWN0aW9uX3N0cmluZzsJLyogQSBzdHJpbmc6IGFzc2VtYmxlIDEgaW5zdHJ1Y3Rpb24uICovCi17Ci0gIC8qIE5vbi16ZXJvIGlmIG9wZXJhbmQgZXhwcmVzc2lvbidzIHNlZ21lbnQgaXMgbm90IGtub3duIHlldC4gKi8KLSAgaW50IGlzX3VuZGVmaW5lZDsKLQotICBpbnQgbGVuZ3RoX2NvZGU7Ci0gIGNoYXIgKnA7Ci0gIC8qIEFuIG9wZXJhbmQuIFNjYW5zIGFsbCBvcGVyYW5kcy4gKi8KLSAgc3RydWN0IHZvcCAqb3BlcmFuZFA7Ci0gIGNoYXIgKnNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCQkJLyogV2hhdCB1c2VkIHRvIGxpdmUgYWZ0ZXIgYW4gZXhwcmVzc2lvbi4gKi8KLSAgY2hhciBjX3NhdmU7Ci0gIC8qIDE6IGluc3RydWN0aW9uX3N0cmluZyBiYWQgZm9yIGFsbCBwYXNzZXMuICovCi0gIGludCBnb29mZWQ7Ci0gIC8qIFBvaW50cyB0byBzbG90IGp1c3QgYWZ0ZXIgbGFzdCBvcGVyYW5kLiAgKi8KLSAgc3RydWN0IHZvcCAqZW5kX29wZXJhbmRQOwotICAvKiBQb2ludHMgdG8gZXhwcmVzc2lvbiB2YWx1ZXMgZm9yIHRoaXMgb3BlcmFuZC4gICovCi0gIGV4cHJlc3Npb25TICpleHBQOwotICBzZWdUICpzZWdQOwotCi0gIC8qIFRoZXNlIHJlZmVyIHRvIGFuIGluc3RydWN0aW9uIG9wZXJhbmQgZXhwcmVzc2lvbi4gKi8KLSAgLyogVGFyZ2V0IHNlZ21lbnQgb2YgdGhlIGFkZHJlc3MuCSAqLwotICBzZWdUIHRvX3NlZzsKLSAgdmFsdWVUIHRoaXNfYWRkX251bWJlcjsKLSAgLyogUG9zaXRpdmUgKG1pbnVlbmQpIHN5bWJvbC4gKi8KLSAgc3RydWN0IHN5bWJvbCAqdGhpc19hZGRfc3ltYm9sOwotICAvKiBBcyBhIG51bWJlci4gKi8KLSAgbG9uZyBvcGNvZGVfYXNfbnVtYmVyOwotICAvKiBMZWFzdCBzaWduaWZpY2FudCBieXRlIDFzdC4gKi8KLSAgY2hhciAqb3Bjb2RlX2FzX2NoYXJzOwotICAvKiBBcyBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLiAqLwotICAvKiBMZWFzdCBzaWduaWZpY2FudCBieXRlIDFzdCAqLwotICBjaGFyICpvcGNvZGVfbG93X2J5dGVQOwotICAvKiBsZW5ndGggKGJ5dGVzKSBtZWFudCBieSB2b3Bfc2hvcnQuICovCi0gIGludCBsZW5ndGg7Ci0gIC8qIDAsIG9yIDEgaWYgJ0AnIGlzIGluIGFkZHJlc3NpbmcgbW9kZS4gKi8KLSAgaW50IGF0OwotICAvKiBGcm9tIHZvcF9uYnl0ZXM6IHZheF9vcGVyYW5kX3dpZHRoIChpbiBieXRlcykgKi8KLSAgaW50IG5ieXRlczsKLSAgRkxPTlVNX1RZUEUgKmZsb2F0UDsKLSAgTElUVExFTlVNX1RZUEUgbGl0ZXJhbF9mbG9hdFs4XTsKLSAgLyogQmlnIGVub3VnaCBmb3IgYW55IGZsb2F0aW5nIHBvaW50IGxpdGVyYWwuICovCi0KLSAgdmlwICgmdiwgaW5zdHJ1Y3Rpb25fc3RyaW5nKTsKLQotICAvKgotICAgKiBOb3cgd2UgdHJ5IHRvIGZpbmQgYXMgbWFueSBhc193YXJuKClzIGFzIHdlIGNhbi4gSWYgd2UgZG8gYW55IGFzX3dhcm4oKXMKLSAgICogdGhlbiBnb29mZWQ9MS4gTm90aWNlIHRoYXQgd2UgZG9uJ3QgbWFrZSBhbnkgZnJhZ3MgeWV0LgotICAgKiBTaG91bGQgZ29vZmVkIGJlIDEsIHRoZW4gdGhpcyBpbnN0cnVjdGlvbiB3aWxsIHdlZGdlIGluIGFueSBwYXNzLAotICAgKiBhbmQgd2UgY2FuIHNhZmVseSBmbHVzaCBpdCwgd2l0aG91dCBjYXVzaW5nIGludGVycGFzcyBzeW1ib2wgcGhhc2UKLSAgICogZXJyb3JzLiBUaGF0IGlzLCB3aXRob3V0IGNoYW5naW5nIGxhYmVsIHZhbHVlcyBpbiBkaWZmZXJlbnQgcGFzc2VzLgotICAgKi8KLSAgaWYgKChnb29mZWQgPSAoKnYudml0X2Vycm9yKSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJJZ25vcmluZyBzdGF0ZW1lbnQgZHVlIHRvIFwiJXNcIiIpLCB2LnZpdF9lcnJvcik7Ci0gICAgfQotICAvKgotICAgKiBXZSBuZWVkIHRvIHVzZSBleHByZXNzaW9uKCkgYW5kIGZyaWVuZHMsIHdoaWNoIHJlcXVpcmUgdXMgdG8gZGlkZGxlCi0gICAqIGlucHV0X2xpbmVfcG9pbnRlci4gU28gd2Ugc2F2ZSBpdCBhbmQgcmVzdG9yZSBpdCBsYXRlci4KLSAgICovCi0gIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBmb3IgKG9wZXJhbmRQID0gdi52aXRfb3BlcmFuZCwKLSAgICAgICBleHBQID0gZXhwX29mX29wZXJhbmQsCi0gICAgICAgc2VnUCA9IHNlZ19vZl9vcGVyYW5kLAotICAgICAgIGZsb2F0UCA9IGZsb2F0X29wZXJhbmQsCi0gICAgICAgZW5kX29wZXJhbmRQID0gdi52aXRfb3BlcmFuZCArIHYudml0X29wZXJhbmRzOwotCi0gICAgICAgb3BlcmFuZFAgPCBlbmRfb3BlcmFuZFA7Ci0KLSAgICAgICBvcGVyYW5kUCsrLCBleHBQKyssIHNlZ1ArKywgZmxvYXRQKyspCi0gICAgewkJCQkvKiBmb3IgZWFjaCBvcGVyYW5kICovCi0gICAgICBpZiAob3BlcmFuZFAtPnZvcF9lcnJvcikKLQl7Ci0JICBhc193YXJuIChfKCJJZ25vcmluZyBzdGF0ZW1lbnQgYmVjYXVzZSBcIiVzXCIiKSwgb3BlcmFuZFAtPnZvcF9lcnJvcik7Ci0JICBnb29mZWQgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBzdGF0ZW1lbnQgaGFzIG5vIHN5bnRheCBnb29mczogbGV0cyBzbmlmZiB0aGUgZXhwcmVzc2lvbiAqLwotCSAgaW50IGNhbl9iZV9zaG9ydCA9IDA7CS8qIDEgaWYgYSBiaWdudW0gY2FuIGJlIHJlZHVjZWQgdG8gYSBzaG9ydCBsaXRlcmFsLiAqLwotCi0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvcGVyYW5kUC0+dm9wX2V4cHJfYmVnaW47Ci0JICBjX3NhdmUgPSBvcGVyYW5kUC0+dm9wX2V4cHJfZW5kWzFdOwotCSAgb3BlcmFuZFAtPnZvcF9leHByX2VuZFsxXSA9ICdcMCc7Ci0JICAvKiBJZiB0b19zZWcgPT0gU0VHX1BBU1MxLCBleHByZXNzaW9uKCkgd2lsbCBoYXZlIHNldCBuZWVkX3Bhc3NfMiA9IDEuICovCi0JICAqc2VnUCA9IGV4cHJlc3Npb24gKGV4cFApOwotCSAgc3dpdGNoIChleHBQLT5YX29wKQotCSAgICB7Ci0JICAgIGNhc2UgT19hYnNlbnQ6Ci0JICAgICAgLyogZm9yIEJTRDQuMiBjb21wYXRpYmlsaXR5LCBtaXNzaW5nIGV4cHJlc3Npb24gaXMgYWJzb2x1dGUgMCAqLwotCSAgICAgIGV4cFAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICAgIGV4cFAtPlhfYWRkX251bWJlciA9IDA7Ci0JICAgICAgLyogRm9yIFNFR19BQlNPTFVURSwgd2Ugc2hvdWxkbid0IG5lZWQgdG8gc2V0IFhfb3Bfc3ltYm9sLAotCQkgWF9hZGRfc3ltYm9sIHRvIGFueSBwYXJ0aWN1bGFyIHZhbHVlLiAgQnV0LCB3ZSB3aWxsIHByb2dyYW0KLQkJIGRlZmVuc2l2ZWx5LiBTaW5jZSB0aGlzIHNpdHVhdGlvbiBvY2N1cnMgcmFyZWx5IHNvIGl0IGNvc3RzCi0JCSB1cyBsaXR0bGUgdG8gZG8sIGFuZCBzdG9wcyBEZWFuIHdvcnJ5aW5nIGFib3V0IHRoZSBvcmlnaW4gb2YKLQkJIHJhbmRvbSBiaXRzIGluIGV4cHJlc3Npb25TJ3MuICAqLwotCSAgICAgIGV4cFAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICAgICAgZXhwUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgT19zeW1ib2w6Ci0JICAgIGNhc2UgT19jb25zdGFudDoKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIC8qCi0JICAgICAgICogTWFqb3IgYnVnLiBXZSBjYW4ndCBoYW5kbGUgdGhlIGNhc2Ugb2YgYQotCSAgICAgICAqIFNFR19PUCBleHByZXNzaW9uIGluIGEgVklUX09QQ09ERV9TWU5USEVUSUMKLQkgICAgICAgKiB2YXJpYWJsZS1sZW5ndGggaW5zdHJ1Y3Rpb24uCi0JICAgICAgICogV2UgZG9uJ3QgaGF2ZSBhIGZyYWcgdHlwZSB0aGF0IGlzIHNtYXJ0IGVub3VnaCB0bwotCSAgICAgICAqIHJlbGF4IGEgU0VHX09QLCBhbmQgc28gd2UganVzdCBmb3JjZSBhbGwKLQkgICAgICAgKiBTRUdfT1BzIHRvIGJlaGF2ZSBsaWtlIFNFR19QQVNTMXMuCi0JICAgICAgICogQ2xlYXJseSwgaWYgdGhlcmUgaXMgYSBkZW1hbmQgd2UgY2FuIGludmVudCBhIG5ldyBvcgotCSAgICAgICAqIG1vZGlmaWVkIGZyYWcgdHlwZSBhbmQgdGhlbiBjb2RpbmcgdXAgYSBmcmFnIGZvciB0aGlzCi0JICAgICAgICogY2FzZSB3aWxsIGJlIGVhc3kuIFNFR19PUCB3YXMgaW52ZW50ZWQgZm9yIHRoZQotCSAgICAgICAqIC53b3JkcyBhZnRlciBhIENBU0Ugb3Bjb2RlLCBhbmQgd2FzIG5ldmVyIGludGVuZGVkIGZvcgotCSAgICAgICAqIGluc3RydWN0aW9uIG9wZXJhbmRzLgotCSAgICAgICAqLwotCSAgICAgIG5lZWRfcGFzc18yID0gMTsKLQkgICAgICBhc193YXJuIChfKCJDYW4ndCByZWxvY2F0ZSBleHByZXNzaW9uIikpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgT19iaWc6Ci0JICAgICAgLyogUHJlc2VydmUgdGhlIGJpdHMuICovCi0JICAgICAgaWYgKGV4cFAtPlhfYWRkX251bWJlciA+IDApCi0JCXsKLQkJICBiaWdudW1fY29weSAoZ2VuZXJpY19iaWdudW0sIGV4cFAtPlhfYWRkX251bWJlciwKLQkJCSAgICAgICBmbG9hdFAtPmxvdywgU0laRV9PRl9MQVJHRV9OVU1CRVIpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAga25vdyAoZXhwUC0+WF9hZGRfbnVtYmVyIDwgMCk7Ci0JCSAgZmxvbnVtX2NvcHkgKCZnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciwKLQkJCSAgICAgICBmbG9hdFApOwotCQkgIGlmIChzdHJjaHIgKCJzIGkiLCBvcGVyYW5kUC0+dm9wX3Nob3J0KSkKLQkJICAgIHsKLQkJICAgICAgLyogQ291bGQgcG9zc2libHkgYmVjb21lIFNeIyAqLwotCQkgICAgICBmbG9udW1fZ2VuMnZheCAoLWV4cFAtPlhfYWRkX251bWJlciwgZmxvYXRQLCBsaXRlcmFsX2Zsb2F0KTsKLQkJICAgICAgc3dpdGNoICgtZXhwUC0+WF9hZGRfbnVtYmVyKQotCQkJewotCQkJY2FzZSAnZic6Ci0JCQkgIGNhbl9iZV9zaG9ydCA9Ci0JCQkgICAgKGxpdGVyYWxfZmxvYXRbMF0gJiAweEZDMEYpID09IDB4NDAwMAotCQkJICAgICYmIGxpdGVyYWxfZmxvYXRbMV0gPT0gMDsKLQkJCSAgYnJlYWs7Ci0KLQkJCWNhc2UgJ2QnOgotCQkJICBjYW5fYmVfc2hvcnQgPQotCQkJICAgIChsaXRlcmFsX2Zsb2F0WzBdICYgMHhGQzBGKSA9PSAweDQwMDAKLQkJCSAgICAmJiBsaXRlcmFsX2Zsb2F0WzFdID09IDAKLQkJCSAgICAmJiBsaXRlcmFsX2Zsb2F0WzJdID09IDAKLQkJCSAgICAmJiBsaXRlcmFsX2Zsb2F0WzNdID09IDA7Ci0JCQkgIGJyZWFrOwotCi0JCQljYXNlICdnJzoKLQkJCSAgY2FuX2JlX3Nob3J0ID0KLQkJCSAgICAobGl0ZXJhbF9mbG9hdFswXSAmIDB4RkY4MSkgPT0gMHg0MDAwCi0JCQkgICAgJiYgbGl0ZXJhbF9mbG9hdFsxXSA9PSAwCi0JCQkgICAgJiYgbGl0ZXJhbF9mbG9hdFsyXSA9PSAwCi0JCQkgICAgJiYgbGl0ZXJhbF9mbG9hdFszXSA9PSAwOwotCQkJICBicmVhazsKLQotCQkJY2FzZSAnaCc6Ci0JCQkgIGNhbl9iZV9zaG9ydCA9ICgobGl0ZXJhbF9mbG9hdFswXSAmIDB4RkZGOCkgPT0gMHg0MDAwCi0JCQkJCSAgJiYgKGxpdGVyYWxfZmxvYXRbMV0gJiAweEUwMDApID09IDAKLQkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzJdID09IDAKLQkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzNdID09IDAKLQkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzRdID09IDAKLQkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzVdID09IDAKLQkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzZdID09IDAKLQkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzddID09IDApOwotCQkJICBicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCSAgQkFEX0NBU0UgKC1leHBQLT5YX2FkZF9udW1iZXIpOwotCQkJICBicmVhazsKLQkJCX0JLyogc3dpdGNoIChmbG9hdCB0eXBlKSAqLwotCQkgICAgfQkJLyogaWYgKGNvdWxkIHdhbnQgdG8gYmVjb21lIFNeIy4uLikgKi8KLQkJfQkJLyogYmlnbnVtIG9yIGZsb251bSA/ICovCi0KLQkgICAgICBpZiAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAncycKLQkJICB8fCBvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICdpJwotCQkgIHx8IChvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICcgJwotCQkgICAgICAmJiBvcGVyYW5kUC0+dm9wX3JlZyA9PSAweEYKLQkJICAgICAgJiYgKG9wZXJhbmRQLT52b3BfbW9kZSAmIDB4RSkgPT0gMHg4KSkKLQkJewotCQkgIC8qIFNhdyBhICcjJy4gKi8KLQkJICBpZiAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnICcpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIG11c3QgY2hvc2UgU14gb3IgSV4uICovCi0JCSAgICAgIGlmIChleHBQLT5YX2FkZF9udW1iZXIgPiAwKQotCQkJewotCQkJICAvKiBCaWdudW06IFNob3J0IGxpdGVyYWwgaW1wb3NzaWJsZS4gKi8KLQkJCSAgb3BlcmFuZFAtPnZvcF9zaG9ydCA9ICdpJzsKLQkJCSAgb3BlcmFuZFAtPnZvcF9tb2RlID0gODsKLQkJCSAgb3BlcmFuZFAtPnZvcF9yZWcgPSAweEY7CS8qIFZBWCBQQy4gKi8KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICAvKiBGbG9udW06IFRyeSB0byBkbyBpdC4gKi8KLQkJCSAgaWYgKGNhbl9iZV9zaG9ydCkKLQkJCSAgICB7Ci0JCQkgICAgICBvcGVyYW5kUC0+dm9wX3Nob3J0ID0gJ3MnOwotCQkJICAgICAgb3BlcmFuZFAtPnZvcF9tb2RlID0gMDsKLQkJCSAgICAgIG9wZXJhbmRQLT52b3BfbmR4ID0gLTE7Ci0JCQkgICAgICBvcGVyYW5kUC0+dm9wX3JlZyA9IC0xOwotCQkJICAgICAgZXhwUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgb3BlcmFuZFAtPnZvcF9zaG9ydCA9ICdpJzsKLQkJCSAgICAgIG9wZXJhbmRQLT52b3BfbW9kZSA9IDg7Ci0JCQkgICAgICBvcGVyYW5kUC0+dm9wX3JlZyA9IDB4RjsJLyogVkFYIFBDICovCi0JCQkgICAgfQotCQkJfQkvKiBiaWdudW0gb3IgZmxvbnVtID8gKi8KLQkJICAgIH0JCS8qICBpZiAjLCBidXQgbm8gU14gb3IgSV4gc2Vlbi4gKi8KLQkJICAvKiBObyBtb3JlICcgJyBjYXNlOiBlaXRoZXIgJ3MnIG9yICdpJy4gKi8KLQkJICBpZiAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAncycpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdhbnRzIHRvIGJlIGEgc2hvcnQgbGl0ZXJhbC4gKi8KLQkJICAgICAgaWYgKGV4cFAtPlhfYWRkX251bWJlciA+IDApCi0JCQl7Ci0JCQkgIGFzX3dhcm4gKF8oIkJpZ251bSBub3QgcGVybWl0dGVkIGluIHNob3J0IGxpdGVyYWwuIEltbWVkaWF0ZSBtb2RlIGFzc3VtZWQuIikpOwotCQkJICBvcGVyYW5kUC0+dm9wX3Nob3J0ID0gJ2knOwotCQkJICBvcGVyYW5kUC0+dm9wX21vZGUgPSA4OwotCQkJICBvcGVyYW5kUC0+dm9wX3JlZyA9IDB4RjsJLyogVkFYIFBDLiAqLwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGlmICghY2FuX2JlX3Nob3J0KQotCQkJICAgIHsKLQkJCSAgICAgIGFzX3dhcm4gKF8oIkNhbid0IGRvIGZsb251bSBzaG9ydCBsaXRlcmFsOiBpbW1lZGlhdGUgbW9kZSB1c2VkLiIpKTsKLQkJCSAgICAgIG9wZXJhbmRQLT52b3Bfc2hvcnQgPSAnaSc7Ci0JCQkgICAgICBvcGVyYW5kUC0+dm9wX21vZGUgPSA4OwotCQkJICAgICAgb3BlcmFuZFAtPnZvcF9yZWcgPSAweEY7CS8qIFZBWCBQQy4gKi8KLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7CS8qIEVuY29kZSBzaG9ydCBsaXRlcmFsIG5vdy4gKi8KLQkJCSAgICAgIGludCB0ZW1wID0gMDsKLQotCQkJICAgICAgc3dpdGNoICgtZXhwUC0+WF9hZGRfbnVtYmVyKQotCQkJCXsKLQkJCQljYXNlICdmJzoKLQkJCQljYXNlICdkJzoKLQkJCQkgIHRlbXAgPSBsaXRlcmFsX2Zsb2F0WzBdID4+IDQ7Ci0JCQkJICBicmVhazsKLQotCQkJCWNhc2UgJ2cnOgotCQkJCSAgdGVtcCA9IGxpdGVyYWxfZmxvYXRbMF0gPj4gMTsKLQkJCQkgIGJyZWFrOwotCi0JCQkJY2FzZSAnaCc6Ci0JCQkJICB0ZW1wID0gKChsaXRlcmFsX2Zsb2F0WzBdIDw8IDMpICYgMDcwKQotCQkJCSAgICB8ICgobGl0ZXJhbF9mbG9hdFsxXSA+PiAxMykgJiAwNyk7Ci0JCQkJICBicmVhazsKLQotCQkJCWRlZmF1bHQ6Ci0JCQkJICBCQURfQ0FTRSAoLWV4cFAtPlhfYWRkX251bWJlcik7Ci0JCQkJICBicmVhazsKLQkJCQl9Ci0KLQkJCSAgICAgIGZsb2F0UC0+bG93WzBdID0gdGVtcCAmIDA3NzsKLQkJCSAgICAgIGZsb2F0UC0+bG93WzFdID0gMDsKLQkJCSAgICB9CS8qIGlmIGNhbiBiZSBzaG9ydCBsaXRlcmFsIGZsb2F0ICovCi0JCQl9CS8qIGZsb251bSBvciBiaWdudW0gPyAqLwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsJCS8qIEleIyBzZWVuOiBzZXQgaXQgdXAgaWYgZmxvYXQuICovCi0JCSAgICAgIGlmIChleHBQLT5YX2FkZF9udW1iZXIgPCAwKQotCQkJewotCQkJICBtZW1jcHkgKGZsb2F0UC0+bG93LCBsaXRlcmFsX2Zsb2F0LCBzaXplb2YgKGxpdGVyYWxfZmxvYXQpKTsKLQkJCX0KLQkJICAgIH0JCS8qIGlmIFNeIyBzZWVuLiAqLwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNfd2FybiAoXygiQSBiaWdudW0vZmxvbnVtIG1heSBub3QgYmUgYSBkaXNwbGFjZW1lbnQ6IDB4JWx4IHVzZWQiKSwKLQkJCSAgIChleHBQLT5YX2FkZF9udW1iZXIgPSAweDgwMDAwMDAwTCkpOwotCQkgIC8qIENob3NlbiBzbyBsdXNlciBnZXRzIHRoZSBtb3N0IG9mZnNldCBiaXRzIHRvIHBhdGNoIGxhdGVyLiAqLwotCQl9Ci0JICAgICAgZXhwUC0+WF9hZGRfbnVtYmVyID0gZmxvYXRQLT5sb3dbMF0KLQkJfCAoKExJVFRMRU5VTV9NQVNLICYgKGZsb2F0UC0+bG93WzFdKSkgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKTsKLQkgICAgICAvKgotCSAgICAgICAqIEZvciB0aGUgT19iaWcgY2FzZSB3ZSBoYXZlOgotCSAgICAgICAqIElmIHZvcF9zaG9ydCA9PSAncycgdGhlbiBhIHNob3J0IGZsb2F0aW5nIGxpdGVyYWwgaXMgaW4gdGhlCi0JICAgICAgICoJbG93ZXN0IDYgYml0cyBvZiBmbG9hdFAgLT4gbG93IFswXSwgd2hpY2ggaXMKLQkgICAgICAgKgliaWdfb3BlcmFuZF9iaXRzIFstLS1dIFswXS4KLQkgICAgICAgKiBJZiB2b3Bfc2hvcnQgPT0gJ2knIHRoZW4gdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBlbGVtZW50cwotCSAgICAgICAqCW9mIGJpZ19vcGVyYW5kX2JpdHMgWy0tLV0gWy4uLl0gYXJlIHNldCB1cCB3aXRoIHRoZSBjb3JyZWN0Ci0JICAgICAgICoJYml0cy4KLQkgICAgICAgKiBBbHNvLCBqdXN0IGluIGNhc2Ugd2lkdGggaXMgYnl0ZSB3b3JkIG9yIGxvbmcsIHdlIGNvcHkgdGhlIGxvd2VzdAotCSAgICAgICAqIDMyIGJpdHMgb2YgdGhlIG51bWJlciB0byBYX2FkZF9udW1iZXIuCi0JICAgICAgICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlmIChpbnB1dF9saW5lX3BvaW50ZXIgIT0gb3BlcmFuZFAtPnZvcF9leHByX2VuZCArIDEpCi0JICAgIHsKLQkgICAgICBhc193YXJuICgiSnVuayBhdCBlbmQgb2YgZXhwcmVzc2lvbiBcIiVzXCIiLCBpbnB1dF9saW5lX3BvaW50ZXIpOwotCSAgICAgIGdvb2ZlZCA9IDE7Ci0JICAgIH0KLQkgIG9wZXJhbmRQLT52b3BfZXhwcl9lbmRbMV0gPSBjX3NhdmU7Ci0JfQotICAgIH0JCQkJLyogZm9yKGVhY2ggb3BlcmFuZCkgKi8KLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAobmVlZF9wYXNzXzIgfHwgZ29vZmVkKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLQotICAvKiBFbWl0IG9wLWNvZGUuICovCi0gIC8qIFJlbWVtYmVyIHdoZXJlIGl0IGlzLCBpbiBjYXNlIHdlIHdhbnQgdG8gbW9kaWZ5IHRoZSBvcC1jb2RlIGxhdGVyLiAqLwotICBvcGNvZGVfbG93X2J5dGVQID0gZnJhZ19tb3JlICh2LnZpdF9vcGNvZGVfbmJ5dGVzKTsKLSAgbWVtY3B5IChvcGNvZGVfbG93X2J5dGVQLCB2LnZpdF9vcGNvZGUsIHYudml0X29wY29kZV9uYnl0ZXMpOwotICBvcGNvZGVfYXNfbnVtYmVyID0gbWRfY2hhcnNfdG9fbnVtYmVyIChvcGNvZGVfYXNfY2hhcnMgPSB2LnZpdF9vcGNvZGUsIDQpOwotICBmb3IgKG9wZXJhbmRQID0gdi52aXRfb3BlcmFuZCwKLSAgICAgICBleHBQID0gZXhwX29mX29wZXJhbmQsCi0gICAgICAgc2VnUCA9IHNlZ19vZl9vcGVyYW5kLAotICAgICAgIGZsb2F0UCA9IGZsb2F0X29wZXJhbmQsCi0gICAgICAgZW5kX29wZXJhbmRQID0gdi52aXRfb3BlcmFuZCArIHYudml0X29wZXJhbmRzOwotCi0gICAgICAgb3BlcmFuZFAgPCBlbmRfb3BlcmFuZFA7Ci0KLSAgICAgICBvcGVyYW5kUCsrLAotICAgICAgIGZsb2F0UCsrLAotICAgICAgIHNlZ1ArKywKLSAgICAgICBleHBQKyspCi0gICAgewotICAgICAgaWYgKG9wZXJhbmRQLT52b3BfbmR4ID49IDApCi0JewotCSAgLyogaW5kZXhlZCBhZGRyZXNzaW5nIGJ5dGUgKi8KLQkgIC8qIExlZ2FsaXR5IG9mIGluZGV4ZWQgbW9kZSBhbHJlYWR5IGNoZWNrZWQ6IGl0IGlzIE9LICovCi0JICBGUkFHX0FQUEVORF8xX0NIQVIgKDB4NDAgKyBvcGVyYW5kUC0+dm9wX25keCk7Ci0JfQkJCS8qIGlmKHZvcF9uZHg+PTApICovCi0KLSAgICAgIC8qIEhlcmUgdG8gbWFrZSBtYWluIG9wZXJhbmQgZnJhZyhzKS4gKi8KLSAgICAgIHRoaXNfYWRkX251bWJlciA9IGV4cFAtPlhfYWRkX251bWJlcjsKLSAgICAgIHRoaXNfYWRkX3N5bWJvbCA9IGV4cFAtPlhfYWRkX3N5bWJvbDsKLSAgICAgIHRvX3NlZyA9ICpzZWdQOwotICAgICAgaXNfdW5kZWZpbmVkID0gKHRvX3NlZyA9PSBTRUdfVU5LTk9XTik7Ci0gICAgICBhdCA9IG9wZXJhbmRQLT52b3BfbW9kZSAmIDE7Ci0gICAgICBsZW5ndGggPSAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnYicKLQkJPyAxIDogKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJ3cnCi0JCSAgICAgICA/IDIgOiAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnbCcKLQkJCSAgICAgID8gNCA6IDApKSk7Ci0gICAgICBuYnl0ZXMgPSBvcGVyYW5kUC0+dm9wX25ieXRlczsKLSAgICAgIGlmIChvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAnYicpCi0JewotCSAgaWYgKHRvX3NlZyA9PSBub3dfc2VnIHx8IGlzX3VuZGVmaW5lZCkKLQkgICAgewotCSAgICAgIC8qIElmIGlzX3VuZGVmaW5lZCwgdGhlbiBpdCBtaWdodCBCRUNPTUUgbm93X3NlZy4gKi8KLQkgICAgICBpZiAobmJ5dGVzKQotCQl7Ci0JCSAgcCA9IGZyYWdfbW9yZSAobmJ5dGVzKTsKLQkJICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBuYnl0ZXMsCi0JCQkgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwgMSwgTk9fUkVMT0MpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7CQkvKiB0b19zZWc9PW5vd19zZWcgfHwgdG9fc2VnID09IFNFR19VTktOT1dOICovCi0JCSAgLyogbmJ5dGVzPT0wICovCi0JCSAgbGVuZ3RoX2NvZGUgPSBpc191bmRlZmluZWQgPyBTVEFURV9VTkRGIDogU1RBVEVfQllURTsKLQkJICBpZiAob3Bjb2RlX2FzX251bWJlciAmIFZJVF9PUENPREVfU1BFQ0lBTCkKLQkJICAgIHsKLQkJICAgICAgaWYgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX1VOQ09ORElUSU9OQUxfSlVNUCkKLQkJCXsKLQkJCSAgLyogYnIgb3IganNiICovCi0JCQkgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNSwgMSwKLQkJCSAgICBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIGxlbmd0aF9jb2RlKSwKLQkJCQkgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkJICAgIG9wY29kZV9sb3dfYnl0ZVApOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGlmIChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9XT1JEX0pVTVApCi0JCQkgICAgewotCQkJICAgICAgbGVuZ3RoX2NvZGUgPSBTVEFURV9XT1JEOwotCQkJICAgICAgLyogSkY6IFRoZXJlIGlzIG5vIHN0YXRlX2J5dGUgZm9yIHRoaXMgb25lISAqLwotCQkJICAgICAgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMCwgMiwKLQkJCQkJRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0JSQU5DSCwgbGVuZ3RoX2NvZGUpLAotCQkJCQl0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJCQkJb3Bjb2RlX2xvd19ieXRlUCk7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAga25vdyAob3BlcmFuZFAtPnZvcF93aWR0aCA9PSBWQVhfV0lEVEhfQllURV9KVU1QKTsKLQkJCSAgICAgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgOSwgMSwKLQkJCSAgICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9IT1AsIGxlbmd0aF9jb2RlKSwKLQkJCQkJdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkJCW9wY29kZV9sb3dfYnl0ZVApOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGtub3cgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX0NPTkRJVElPTkFMX0pVTVApOwotCQkgICAgICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDcsIDEsCi0JCSAgICAgICBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgbGVuZ3RoX2NvZGUpLAotCQkJCXRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJCW9wY29kZV9sb3dfYnl0ZVApOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIHRvX3NlZyAhPSBub3dfc2VnICYmIHRvX3NlZyAhPSBTRUdfVU5LTk9XTiAqLwotCSAgICAgIC8qCi0JICAgICAgICogLS0tIFNFRyBGTE9BVCBNQVkgQVBQRUFSIEhFUkUgLS0tLQotCSAgICAgICAqLwotCSAgICAgIGlmICh0b19zZWcgPT0gU0VHX0FCU09MVVRFKQotCQl7Ci0JCSAgaWYgKG5ieXRlcykKLQkJICAgIHsKLQkJICAgICAga25vdyAoIShvcGNvZGVfYXNfbnVtYmVyICYgVklUX09QQ09ERV9TWU5USEVUSUMpKTsKLQkJICAgICAgcCA9IGZyYWdfbW9yZSAobmJ5dGVzKTsKLQkJICAgICAgLyogQ29udmVudGlvbmFsIHJlbG9jYXRpb24uICovCi0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgbmJ5dGVzLCAmYWJzX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJICAgICAgIDEsIE5PX1JFTE9DKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGtub3cgKG9wY29kZV9hc19udW1iZXIgJiBWSVRfT1BDT0RFX1NZTlRIRVRJQyk7Ci0JCSAgICAgIGlmIChvcGNvZGVfYXNfbnVtYmVyICYgVklUX09QQ09ERV9TUEVDSUFMKQotCQkJewotCQkJICBpZiAob3BlcmFuZFAtPnZvcF93aWR0aCA9PSBWQVhfV0lEVEhfVU5DT05ESVRJT05BTF9KVU1QKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIGJyIG9yIGpzYiAqLwotCQkJICAgICAgKm9wY29kZV9sb3dfYnl0ZVAgPSBvcGNvZGVfYXNfY2hhcnNbMF0gKyBWQVhfV0lERU5fTE9ORzsKLQkJCSAgICAgIGtub3cgKG9wY29kZV9hc19jaGFyc1sxXSA9PSAwKTsKLQkJCSAgICAgIHAgPSBmcmFnX21vcmUgKDUpOwotCQkJICAgICAgcFswXSA9IFZBWF9BQlNPTFVURV9NT0RFOwkvKiBAIy4uLiAqLwotCQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgMSwgdGhpc19hZGRfbnVtYmVyLCA0KTsKLQkJCSAgICAgIC8qIE5vdyAoZWcpIEpNUCBAI2ZvbyBvciBKU0IgQCNmb28uICovCi0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgaWYgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX1dPUkRfSlVNUCkKLQkJCQl7Ci0JCQkJICBwID0gZnJhZ19tb3JlICgxMCk7Ci0JCQkJICBwWzBdID0gMjsKLQkJCQkgIHBbMV0gPSAwOwotCQkJCSAgcFsyXSA9IFZBWF9CUkI7Ci0JCQkJICBwWzNdID0gNjsKLQkJCQkgIHBbNF0gPSBWQVhfSk1QOwotCQkJCSAgcFs1XSA9IFZBWF9BQlNPTFVURV9NT0RFOwkvKiBAIy4uLiAqLwotCQkJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgNiwgdGhpc19hZGRfbnVtYmVyLCA0KTsKLQkJCQkgIC8qCi0JCQkJICAgKiBOb3cgKGVnKQlBQ0J4CTFmCi0JCQkJICAgKgkJQlJCCTJmCi0JCQkJICAgKgkxOglKTVAJQCNmb28KLQkJCQkgICAqCTI6Ci0JCQkJICAgKi8KLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotCQkJCSAga25vdyAob3BlcmFuZFAtPnZvcF93aWR0aCA9PSBWQVhfV0lEVEhfQllURV9KVU1QKTsKLQkJCQkgIHAgPSBmcmFnX21vcmUgKDkpOwotCQkJCSAgcFswXSA9IDI7Ci0JCQkJICBwWzFdID0gVkFYX0JSQjsKLQkJCQkgIHBbMl0gPSA2OwotCQkJCSAgcFszXSA9IFZBWF9KTVA7Ci0JCQkJICBwWzRdID0gVkFYX1BDX1JFTEFUSVZFX01PREUgKyAxOwkvKiBAIy4uLiAqLwotCQkJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgNSwgdGhpc19hZGRfbnVtYmVyLCA0KTsKLQkJCQkgIC8qCi0JCQkJICAgKiBOb3cgKGVnKQl4T0J4eHgJMWYKLQkJCQkgICAqCQlCUkIJMmYKLQkJCQkgICAqCTE6CUpNUAlAI2ZvbwotCQkJCSAgICoJMjoKLQkJCQkgICAqLwotCQkJCX0KLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgLyogYjxjb25kPiAqLwotCQkJICAqb3Bjb2RlX2xvd19ieXRlUCBePSAxOwotCQkJICAvKiBUbyByZXZlcnNlIHRoZSBjb25kaXRpb24gaW4gYSBWQVggYnJhbmNoLAotCQkJICAgICBjb21wbGVtZW50IHRoZSBsb3dlc3Qgb3JkZXIgYml0LiAqLwotCQkJICBwID0gZnJhZ19tb3JlICg3KTsKLQkJCSAgcFswXSA9IDY7Ci0JCQkgIHBbMV0gPSBWQVhfSk1QOwotCQkJICBwWzJdID0gVkFYX0FCU09MVVRFX01PREU7CS8qIEAjLi4uICovCi0JCQkgIG1kX251bWJlcl90b19jaGFycyAocCArIDMsIHRoaXNfYWRkX251bWJlciwgNCk7Ci0JCQkgIC8qCi0JCQkgICAqIE5vdyAoZWcpCUJMRVEJMWYKLQkJCSAgICoJCUpNUAlAI2ZvbwotCQkJICAgKgkxOgotCQkJICAgKi8KLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIHRvX3NlZyAhPSBub3dfc2VnICYmIHRvX3NlZyAhPSBTRUdfVU5LTk9XTiAmJiB0b19TZWcgIT0gU0VHX0FCU09MVVRFICovCi0JCSAgaWYgKG5ieXRlcyA+IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIFBjLXJlbGF0aXZlLiBDb252ZW50aW9uYWwgcmVsb2NhdGlvbi4gKi8KLQkJICAgICAga25vdyAoIShvcGNvZGVfYXNfbnVtYmVyICYgVklUX09QQ09ERV9TWU5USEVUSUMpKTsKLQkJICAgICAgcCA9IGZyYWdfbW9yZSAobmJ5dGVzKTsKLQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICBuYnl0ZXMsICZhYnNfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkgICAgICAgMSwgTk9fUkVMT0MpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAga25vdyAob3Bjb2RlX2FzX251bWJlciAmIFZJVF9PUENPREVfU1lOVEhFVElDKTsKLQkJICAgICAgaWYgKG9wY29kZV9hc19udW1iZXIgJiBWSVRfT1BDT0RFX1NQRUNJQUwpCi0JCQl7Ci0JCQkgIGlmIChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9VTkNPTkRJVElPTkFMX0pVTVApCi0JCQkgICAgewotCQkJICAgICAgLyogYnIgb3IganNiICovCi0JCQkgICAgICBrbm93IChvcGNvZGVfYXNfY2hhcnNbMV0gPT0gMCk7Ci0JCQkgICAgICAqb3Bjb2RlX2xvd19ieXRlUCA9IG9wY29kZV9hc19jaGFyc1swXSArIFZBWF9XSURFTl9MT05HOwotCQkJICAgICAgcCA9IGZyYWdfbW9yZSAoNSk7Ci0JCQkgICAgICBwWzBdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7Ci0JCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywKLQkJCQkgICAgICAgcCArIDEgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkJCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLAotCQkJCSAgICAgICB0aGlzX2FkZF9udW1iZXIsIDEsIE5PX1JFTE9DKTsKLQkJCSAgICAgIC8qIE5vdyBlZyBKTVAgZm9vIG9yIEpTQiBmb28uICovCi0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgaWYgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX1dPUkRfSlVNUCkKLQkJCQl7Ci0JCQkJICBwID0gZnJhZ19tb3JlICgxMCk7Ci0JCQkJICBwWzBdID0gMDsKLQkJCQkgIHBbMV0gPSAyOwotCQkJCSAgcFsyXSA9IFZBWF9CUkI7Ci0JCQkJICBwWzNdID0gNjsKLQkJCQkgIHBbNF0gPSBWQVhfSk1QOwotCQkJCSAgcFs1XSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOwotCQkJCSAgZml4X25ldyAoZnJhZ19ub3csCi0JCQkJCSAgIHAgKyA2IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDQsCi0JCQkJCSAgIHRoaXNfYWRkX3N5bWJvbCwKLQkJCQkJICAgdGhpc19hZGRfbnVtYmVyLCAxLCBOT19SRUxPQyk7Ci0JCQkJICAvKgotCQkJCSAgICogTm93IChlZykJQUNCeAkxZgotCQkJCSAgICoJCUJSQgkyZgotCQkJCSAgICoJMToJSk1QCWZvbwotCQkJCSAgICoJMjoKLQkJCQkgICAqLwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICBrbm93IChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9CWVRFX0pVTVApOwotCQkJCSAgcCA9IGZyYWdfbW9yZSAoMTApOwotCQkJCSAgcFswXSA9IDI7Ci0JCQkJICBwWzFdID0gVkFYX0JSQjsKLQkJCQkgIHBbMl0gPSA2OwotCQkJCSAgcFszXSA9IFZBWF9KTVA7Ci0JCQkJICBwWzRdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7Ci0JCQkJICBmaXhfbmV3IChmcmFnX25vdywKLQkJCQkJICAgcCArIDUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCQkJICAgNCwgdGhpc19hZGRfc3ltYm9sLAotCQkJCQkgICB0aGlzX2FkZF9udW1iZXIsIDEsIE5PX1JFTE9DKTsKLQkJCQkgIC8qCi0JCQkJICAgKiBOb3cgKGVnKQl4T0J4eHgJMWYKLQkJCQkgICAqCQlCUkIJMmYKLQkJCQkgICAqCTE6CUpNUAlmb28KLQkJCQkgICAqCTI6Ci0JCQkJICAgKi8KLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGtub3cgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX0NPTkRJVElPTkFMX0pVTVApOwotCQkJICAqb3Bjb2RlX2xvd19ieXRlUCBePSAxOwkvKiBSZXZlcnNlIGJyYW5jaCBjb25kaXRpb24uICovCi0JCQkgIHAgPSBmcmFnX21vcmUgKDcpOwotCQkJICBwWzBdID0gNjsKLQkJCSAgcFsxXSA9IFZBWF9KTVA7Ci0JCQkgIHBbMl0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsKLQkJCSAgZml4X25ldyAoZnJhZ19ub3csIHAgKyAzIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkJICAgNCwgdGhpc19hZGRfc3ltYm9sLAotCQkJCSAgIHRoaXNfYWRkX251bWJlciwgMSwgTk9fUkVMT0MpOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAga25vdyAob3BlcmFuZFAtPnZvcF9hY2Nlc3MgIT0gJ2InKTsJLyogU28gaXQgaXMgb3JkaW5hcnkgb3BlcmFuZC4gKi8KLQkgIGtub3cgKG9wZXJhbmRQLT52b3BfYWNjZXNzICE9ICcgJyk7CS8qICcgJyB0YXJnZXQtaW5kZXBlbmRlbnQ6IGVsc2V3aGVyZS4gKi8KLQkgIGtub3cgKG9wZXJhbmRQLT52b3BfYWNjZXNzID09ICdhJwotCQl8fCBvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAnbScKLQkJfHwgb3BlcmFuZFAtPnZvcF9hY2Nlc3MgPT0gJ3InCi0JCXx8IG9wZXJhbmRQLT52b3BfYWNjZXNzID09ICd2JwotCQl8fCBvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAndycpOwotCSAgaWYgKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJ3MnKQotCSAgICB7Ci0JICAgICAgaWYgKHRvX3NlZyA9PSBTRUdfQUJTT0xVVEUpCi0JCXsKLQkJICBpZiAodGhpc19hZGRfbnVtYmVyID49IDY0KQotCQkgICAgewotCQkgICAgICBhc193YXJuIChfKCJTaG9ydCBsaXRlcmFsIG92ZXJmbG93KCVsZC4pLCBpbW1lZGlhdGUgbW9kZSBhc3N1bWVkLiIpLAotCQkJICAgICAgIChsb25nKSB0aGlzX2FkZF9udW1iZXIpOwotCQkgICAgICBvcGVyYW5kUC0+dm9wX3Nob3J0ID0gJ2knOwotCQkgICAgICBvcGVyYW5kUC0+dm9wX21vZGUgPSA4OwotCQkgICAgICBvcGVyYW5kUC0+dm9wX3JlZyA9IDB4RjsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX3dhcm4gKF8oIkZvcmNlZCBzaG9ydCBsaXRlcmFsIHRvIGltbWVkaWF0ZSBtb2RlLiBub3dfc2VnPSVzIHRvX3NlZz0lcyIpLAotCQkJICAgc2VnbWVudF9uYW1lIChub3dfc2VnKSwgc2VnbWVudF9uYW1lICh0b19zZWcpKTsKLQkJICBvcGVyYW5kUC0+dm9wX3Nob3J0ID0gJ2knOwotCQkgIG9wZXJhbmRQLT52b3BfbW9kZSA9IDg7Ci0JCSAgb3BlcmFuZFAtPnZvcF9yZWcgPSAweEY7Ci0JCX0KLQkgICAgfQotCSAgaWYgKG9wZXJhbmRQLT52b3BfcmVnID49IDAgJiYgKG9wZXJhbmRQLT52b3BfbW9kZSA8IDgKLQkJICB8fCAob3BlcmFuZFAtPnZvcF9yZWcgIT0gMHhGICYmIG9wZXJhbmRQLT52b3BfbW9kZSA8IDEwKSkpCi0JICAgIHsKLQkgICAgICAvKiBPbmUgYnl0ZSBvcGVyYW5kLiAqLwotCSAgICAgIGtub3cgKG9wZXJhbmRQLT52b3BfbW9kZSA+IDMpOwotCSAgICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAob3BlcmFuZFAtPnZvcF9tb2RlIDw8IDQgfCBvcGVyYW5kUC0+dm9wX3JlZyk7Ci0JICAgICAgLyogQWxsIDEtYnl0ZXMgZXhjZXB0IFNeIyBoYXBwZW4gaGVyZS4gKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyoge0B9e3FefWZvb3soUm4pfSBvciBTXiNmb28gKi8KLQkgICAgICBpZiAob3BlcmFuZFAtPnZvcF9yZWcgPT0gLTEgJiYgb3BlcmFuZFAtPnZvcF9zaG9ydCAhPSAncycpCi0JCXsKLQkJICAvKiAie0B9e3FefWZvbyIgKi8KLQkJICBpZiAodG9fc2VnID09IG5vd19zZWcpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChsZW5ndGggPT0gMCkKLQkJCXsKLQkJCSAga25vdyAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnICcpOwotCQkJICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMCwgMiwKLQkJCSAgICAgICBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9CWVRFKSwKLQkJCQkJdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkJCW9wY29kZV9sb3dfYnl0ZVApOwotCQkJICBrbm93IChvcGVyYW5kUC0+dm9wX21vZGUgPT0gMTAgKyBhdCk7Ci0JCQkgICpwID0gYXQgPDwgNDsKLQkJCSAgLyogQXQgaXMgdGhlIG9ubHkgY29udGV4dCB3ZSBuZWVkIHRvIGNhcnJ5Ci0JCQkgICAgIHRvIG90aGVyIHNpZGUgb2YgcmVsYXgoKSBwcm9jZXNzLiAgTXVzdAotCQkJICAgICBiZSBpbiB0aGUgY29ycmVjdCBiaXQgcG9zaXRpb24gb2YgVkFYCi0JCQkgICAgIG9wZXJhbmQgc3BlYy4gYnl0ZS4gKi8KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBrbm93IChsZW5ndGgpOwotCQkJICBrbm93IChvcGVyYW5kUC0+dm9wX3Nob3J0ICE9ICcgJyk7Ci0JCQkgIHAgPSBmcmFnX21vcmUgKGxlbmd0aCArIDEpOwotCQkJICBwWzBdID0gMHhGIHwgKChhdCArICI/XDEyXDE0P1wxNiJbbGVuZ3RoXSkgPDwgNCk7Ci0JCQkgIGZpeF9uZXcgKGZyYWdfbm93LCBwICsgMSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJCSAgIGxlbmd0aCwgdGhpc19hZGRfc3ltYm9sLAotCQkJCSAgIHRoaXNfYWRkX251bWJlciwgMSwgTk9fUkVMT0MpOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsJCS8qIHRvX3NlZyAhPSBub3dfc2VnICovCi0JCSAgICAgIGlmICh0aGlzX2FkZF9zeW1ib2wgPT0gTlVMTCkKLQkJCXsKLQkJCSAga25vdyAodG9fc2VnID09IFNFR19BQlNPTFVURSk7Ci0JCQkgIC8qIERvIEAjZm9vOiBzaW1wbGVyIHJlbG9jYXRpb24gdGhhbiBmb28tLihwYykgYW55d2F5LiAqLwotCQkJICBwID0gZnJhZ19tb3JlICg1KTsKLQkJCSAgcFswXSA9IFZBWF9BQlNPTFVURV9NT0RFOwkvKiBAIy4uLiAqLwotCQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyAxLCB0aGlzX2FkZF9udW1iZXIsIDQpOwotCQkJICBpZiAobGVuZ3RoICYmIGxlbmd0aCAhPSA0KQotCQkJICAgIHsKLQkJCSAgICAgIGFzX3dhcm4gKF8oIkxlbmd0aCBzcGVjaWZpY2F0aW9uIGlnbm9yZWQuIEFkZHJlc3MgbW9kZSA5RiB1c2VkIikpOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICAvKiB7QH17cV59b3RoZXJfc2VnICovCi0JCQkgIGtub3cgKChsZW5ndGggPT0gMCAmJiBvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICcgJykKLQkJCSAgICAgfHwgKGxlbmd0aCA+IDAgJiYgb3BlcmFuZFAtPnZvcF9zaG9ydCAhPSAnICcpKTsKLQkJCSAgaWYgKGlzX3VuZGVmaW5lZCkKLQkJCSAgICB7Ci0JCQkgICAgICAvKgotCQkJICAgICAgICogV2UgaGF2ZSBhIFNFR19VTktOT1dOIHN5bWJvbC4gSXQgbWlnaHQKLQkJCSAgICAgICAqIHR1cm4gb3V0IHRvIGJlIGluIHRoZSBzYW1lIHNlZ21lbnQgYXMKLQkJCSAgICAgICAqIHRoZSBpbnN0cnVjdGlvbiwgcGVybWl0dGluZyByZWxheGF0aW9uLgotCQkJICAgICAgICovCi0JCQkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA1LCAyLAotCQkJICAgICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX1VOREYpLAotCQkJCQkgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkJCSAgICAwKTsKLQkJCSAgICAgIHBbMF0gPSBhdCA8PCA0OwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChsZW5ndGggPT0gMCkKLQkJCQl7Ci0JCQkJICBrbm93IChvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICcgJyk7Ci0JCQkJICBsZW5ndGggPSA0OwkvKiBMb25nZXN0IHBvc3NpYmxlLiAqLwotCQkJCX0KLQkJCSAgICAgIHAgPSBmcmFnX21vcmUgKGxlbmd0aCArIDEpOwotCQkJICAgICAgcFswXSA9IDB4RiB8ICgoYXQgKyAiP1wxMlwxND9cMTYiW2xlbmd0aF0pIDw8IDQpOwotCQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgMSwgdGhpc19hZGRfbnVtYmVyLCBsZW5ndGgpOwotCQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csCi0JCQkJICAgICAgIHAgKyAxIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkJICAgICAgIGxlbmd0aCwgdGhpc19hZGRfc3ltYm9sLAotCQkJCSAgICAgICB0aGlzX2FkZF9udW1iZXIsIDEsIE5PX1JFTE9DKTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiB7QH17cV59Zm9vKFJuKSBvciBTXiMgb3IgSV4jIG9yICMgKi8KLQkJICBpZiAob3BlcmFuZFAtPnZvcF9tb2RlIDwgMHhBKQotCQkgICAgewotCQkgICAgICAvKiAjIG9yIFNeIyBvciBJXiMgKi8KLQkJICAgICAgaWYgKG9wZXJhbmRQLT52b3BfYWNjZXNzID09ICd2JwotCQkJICB8fCBvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAnYScpCi0JCQl7Ci0JCQkgIGlmIChvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAndicpCi0JCQkgICAgYXNfd2FybiAoXygiSW52YWxpZCBvcGVyYW5kOiAgaW1tZWRpYXRlIHZhbHVlIHVzZWQgYXMgYmFzZSBhZGRyZXNzLiIpKTsKLQkJCSAgZWxzZQotCQkJICAgIGFzX3dhcm4gKF8oIkludmFsaWQgb3BlcmFuZDogIGltbWVkaWF0ZSB2YWx1ZSB1c2VkIGFzIGFkZHJlc3MuIikpOwotCQkJICAvKiBnY2MgMi42LjMgaXMga25vd24gdG8gZ2VuZXJhdGUgdGhlc2UgaW4gYXQgbGVhc3QKLQkJCSAgICAgb25lIGNhc2UuICAqLwotCQkJfQotCQkgICAgICBpZiAobGVuZ3RoID09IDAKLQkJCSAgJiYgdG9fc2VnID09IFNFR19BQlNPTFVURSAmJiAoZXhwUC0+WF9vcCAhPSBPX2JpZykKLQkJCSAgJiYgb3BlcmFuZFAtPnZvcF9tb2RlID09IDgJLyogTm8gJ0AnLiAqLwotCQkJICAmJiB0aGlzX2FkZF9udW1iZXIgPCA2NCkKLQkJCXsKLQkJCSAgb3BlcmFuZFAtPnZvcF9zaG9ydCA9ICdzJzsKLQkJCX0KLQkJICAgICAgaWYgKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJ3MnKQotCQkJewotCQkJICBGUkFHX0FQUEVORF8xX0NIQVIgKHRoaXNfYWRkX251bWJlcik7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgLyogSV4jLi4uICovCi0JCQkgIGtub3cgKG5ieXRlcyk7Ci0JCQkgIHAgPSBmcmFnX21vcmUgKG5ieXRlcyArIDEpOwotCQkJICBrbm93IChvcGVyYW5kUC0+dm9wX3JlZyA9PSAweEYpOwotCQkJICBwWzBdID0gKG9wZXJhbmRQLT52b3BfbW9kZSA8PCA0KSB8IDB4RjsKLQkJCSAgaWYgKCh0b19zZWcgPT0gU0VHX0FCU09MVVRFKSAmJiAoZXhwUC0+WF9vcCAhPSBPX2JpZykpCi0JCQkgICAgewotCQkJICAgICAgLyoKLQkJCSAgICAgICAqIElmIG5ieXRlcyA+IDQsIHRoZW4gd2UgYXJlIHNjcm9kLiBXZQotCQkJICAgICAgICogZG9uJ3Qga25vdyBpZiB0aGUgaGlnaCBvcmRlciBieXRlcwotCQkJICAgICAgICogYXJlIHRvIGJlIDB4RkYgb3IgMHgwMC4gIEJTRDQuMiAmIFJNUwotCQkJICAgICAgICogc2F5IHVzZSAweDAwLiBPSyAtLS0gYnV0IHRoaXMKLQkJCSAgICAgICAqIGFzc2VtYmxlciBuZWVkcyBBTk9USEVSIHJld3JpdGUgdG8KLQkJCSAgICAgICAqIGNvcGUgcHJvcGVybHkgd2l0aCB0aGlzIGJ1Zy4gKi8KLQkJCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCArIDEsIHRoaXNfYWRkX251bWJlciwgbWluICg0LCBuYnl0ZXMpKTsKLQkJCSAgICAgIGlmIChuYnl0ZXMgPiA0KQotCQkJCXsKLQkJCQkgIG1lbXNldCAocCArIDUsICdcMCcsIG5ieXRlcyAtIDQpOwotCQkJCX0KLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoZXhwUC0+WF9vcCA9PSBPX2JpZykKLQkJCQl7Ci0JCQkJICAvKgotCQkJCSAgICogUHJvYmxlbSBoZXJlIGlzIHRvIGdldCB0aGUgYnl0ZXMKLQkJCQkgICAqIGluIHRoZSByaWdodCBvcmRlci4gIFdlIHN0b3JlZAotCQkJCSAgICogb3VyIGNvbnN0YW50IGFzIExJVFRMRU5VTXMsIG5vdAotCQkJCSAgICogYnl0ZXMuICovCi0JCQkJICBMSVRUTEVOVU1fVFlQRSAqbFA7Ci0KLQkJCQkgIGxQID0gZmxvYXRQLT5sb3c7Ci0JCQkJICBpZiAobmJ5dGVzICYgMSkKLQkJCQkgICAgewotCQkJCSAgICAgIGtub3cgKG5ieXRlcyA9PSAxKTsKLQkJCQkgICAgICBwWzFdID0gKmxQOwotCQkJCSAgICB9Ci0JCQkJICBlbHNlCi0JCQkJICAgIHsKLQkJCQkgICAgICBmb3IgKHArKzsgbmJ5dGVzOyBuYnl0ZXMgLT0gMiwgcCArPSAyLCBsUCsrKQotCQkJCQl7Ci0JCQkJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAqbFAsIDIpOwotCQkJCQl9Ci0JCQkJICAgIH0KLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotCQkJCSAgZml4X25ldyAoZnJhZ19ub3csIHAgKyAxIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkJCSAgIG5ieXRlcywgdGhpc19hZGRfc3ltYm9sLAotCQkJCQkgICB0aGlzX2FkZF9udW1iZXIsIDAsIE5PX1JFTE9DKTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsJCS8qIHtAfXtxXn1mb28oUm4pICovCi0JCSAgICAgIGtub3cgKChsZW5ndGggPT0gMCAmJiBvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICcgJykKLQkJCSAgICB8fCAobGVuZ3RoID4gMCAmJiBvcGVyYW5kUC0+dm9wX3Nob3J0ICE9ICcgJykpOwotCQkgICAgICBpZiAobGVuZ3RoID09IDApCi0JCQl7Ci0JCQkgIGlmICh0b19zZWcgPT0gU0VHX0FCU09MVVRFKQotCQkJICAgIHsKLQkJCSAgICAgIGxvbmcgdGVzdDsKLQotCQkJICAgICAgdGVzdCA9IHRoaXNfYWRkX251bWJlcjsKLQotCQkJICAgICAgaWYgKHRlc3QgPCAwKQotCQkJCXRlc3QgPSB+dGVzdDsKLQotCQkJICAgICAgbGVuZ3RoID0gdGVzdCAmIDB4ZmZmZjgwMDAgPyA0Ci0JCQkJOiB0ZXN0ICYgMHhmZmZmZmY4MCA/IDIKLQkJCQk6IDE7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgbGVuZ3RoID0gNDsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIHAgPSBmcmFnX21vcmUgKDEgKyBsZW5ndGgpOwotCQkgICAgICBrbm93IChvcGVyYW5kUC0+dm9wX3JlZyA+PSAwKTsKLQkJICAgICAgcFswXSA9IG9wZXJhbmRQLT52b3BfcmVnCi0JCQl8ICgoYXQgfCAiP1wxMlwxND9cMTYiW2xlbmd0aF0pIDw8IDQpOwotCQkgICAgICBpZiAodG9fc2VnID09IFNFR19BQlNPTFVURSkKLQkJCXsKLQkJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgMSwgdGhpc19hZGRfbnVtYmVyLCBsZW5ndGgpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGZpeF9uZXcgKGZyYWdfbm93LCBwICsgMSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJCSAgIGxlbmd0aCwgdGhpc19hZGRfc3ltYm9sLAotCQkJCSAgIHRoaXNfYWRkX251bWJlciwgMCwgTk9fUkVMT0MpOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0JCQkvKiBpZihzaW5nbGUtYnl0ZS1vcGVyYW5kKSAqLwotCX0KLSAgICB9CQkJCS8qIGZvcihvcGVyYW5kUCkgKi8KLX0JCQkJLyogdmF4X2Fzc2VtYmxlKCkgKi8KLQwKLS8qCi0gKgkJCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KCkKLSAqCi0gKiBDYWxsZWQganVzdCBiZWZvcmUgcmVsYXgoKS4KLSAqIEFueSBzeW1ib2wgdGhhdCBpcyBub3cgdW5kZWZpbmVkIHdpbGwgbm90IGJlY29tZSBkZWZpbmVkLgotICogUmV0dXJuIHRoZSBjb3JyZWN0IGZyX3N1YnR5cGUgaW4gdGhlIGZyYWcuCi0gKiBSZXR1cm4gdGhlIGluaXRpYWwgImd1ZXNzIGZvciBmcl92YXIiIHRvIGNhbGxlci4KLSAqIFRoZSBndWVzcyBmb3IgZnJfdmFyIGlzIEFDVFVBTExZIHRoZSBncm93dGggYmV5b25kIGZyX2ZpeC4KLSAqIFdoYXRldmVyIHdlIGRvIHRvIGdyb3cgZnJfZml4IG9yIGZyX3ZhciBjb250cmlidXRlcyB0byBvdXIgcmV0dXJuZWQgdmFsdWUuCi0gKiBBbHRob3VnaCBpdCBtYXkgbm90IGJlIGV4cGxpY2l0IGluIHRoZSBmcmFnLCBwcmV0ZW5kIGZyX3ZhciBzdGFydHMgd2l0aCBhCi0gKiAwIHZhbHVlLgotICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKLSAgICAgZnJhZ1MgKmZyYWdQOwotICAgICBzZWdUIHNlZ21lbnQ7Ci17Ci0gIGNoYXIgKnA7Ci0gIGludCBvbGRfZnJfZml4OwotCi0gIG9sZF9mcl9maXggPSBmcmFnUC0+ZnJfZml4OwotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQpCi0JewkJCS8qIEEgcmVsYXhhYmxlIGNhc2UuICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX0JZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgcFswXSB8PSBWQVhfUENfUkVMQVRJVkVfTU9ERTsJLyogUHJlc2VydmUgQCBiaXQuICovCi0JICBmcmFnUC0+ZnJfZml4ICs9IDEgKyA0OwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyAxLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7Ci0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfQllURSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICAqZnJhZ1AtPmZyX29wY29kZSBePSAxOwkvKiBSZXZlcnNlIHNlbnNlIG9mIGJyYW5jaC4gKi8KLQkgIHBbMF0gPSA2OwotCSAgcFsxXSA9IFZBWF9KTVA7Ci0JICBwWzJdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7CS8qIC4uLihQQykgKi8KLQkgIGZyYWdQLT5mcl9maXggKz0gMSArIDEgKyAxICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgMywgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgTk9fUkVMT0MpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9CUkFOQ0gsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTVBMRVhfQlJBTkNILCBTVEFURV9XT1JEKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcCA9IGZyYWdQLT5mcl9saXRlcmFsICsgb2xkX2ZyX2ZpeDsKLQkgIHBbMF0gPSAyOwotCSAgcFsxXSA9IDA7Ci0JICBwWzJdID0gVkFYX0JSQjsKLQkgIHBbM10gPSA2OwotCSAgcFs0XSA9IFZBWF9KTVA7Ci0JICBwWzVdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7CS8qIC4uLihwYykgKi8KLQkgIGZyYWdQLT5mcl9maXggKz0gMiArIDIgKyAxICsgMSArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDYsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIE5PX1JFTE9DKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTVBMRVhfSE9QLCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50KQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0hPUCwgU1RBVEVfQllURSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICBwWzBdID0gMjsKLQkgIHBbMV0gPSBWQVhfQlJCOwotCSAgcFsyXSA9IDY7Ci0JICBwWzNdID0gVkFYX0pNUDsKLQkgIHBbNF0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsJLyogLi4uKHBjKSAqLwotCSAgZnJhZ1AtPmZyX2ZpeCArPSAxICsgMiArIDEgKyAxICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgNSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgTk9fUkVMT0MpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfVU5ERik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfQllURSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICAqZnJhZ1AtPmZyX29wY29kZSArPSBWQVhfV0lERU5fTE9ORzsKLQkgIHBbMF0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsJLyogLi4uKFBDKSAqLwotCSAgZnJhZ1AtPmZyX2ZpeCArPSAxICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgMSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgTk9fUkVMT0MpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gKGZyYWdQLT5mcl92YXIgKyBmcmFnUC0+ZnJfZml4IC0gb2xkX2ZyX2ZpeCk7Ci19CQkJCS8qIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KCkgKi8KLQwKLS8qCi0gKgkJCW1kX2NvbnZlcnRfZnJhZygpOwotICoKLSAqIENhbGxlZCBhZnRlciByZWxheCgpIGlzIGZpbmlzaGVkLgotICogSW46CUFkZHJlc3Mgb2YgZnJhZy4KLSAqCWZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQuCi0gKglmcl9zdWJ0eXBlIGlzIHdoYXQgdGhlIGFkZHJlc3MgcmVsYXhlZCB0by4KLSAqCi0gKiBPdXQ6CUFueSBmaXhTcyBhbmQgY29uc3RhbnRzIGFyZSBzZXQgdXAuCi0gKglDYWxsZXIgd2lsbCB0dXJuIGZyYWcgaW50byBhICIuc3BhY2UgMCIuCi0gKi8KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VnOwotICAgICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGNoYXIgKmFkZHJlc3NQOwkJLyogLT4gX3ZhciB0byBjaGFuZ2UuICovCi0gIGNoYXIgKm9wY29kZVA7CQkvKiAtPiBvcGNvZGUgY2hhcihzKSB0byBjaGFuZ2UuICovCi0gIHNob3J0IGludCBsZW5ndGhfY29kZTsJLyogMj1sb25nIDE9d29yZCAwPWJ5dGUgKi8KLSAgc2hvcnQgaW50IGV4dGVuc2lvbiA9IDA7CS8qIFNpemUgb2YgcmVsYXhlZCBhZGRyZXNzLiAqLwotICAvKiBBZGRlZCB0byBmcl9maXg6IGluY2wuIEFMTCB2YXIgY2hhcnMuICovCi0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGxvbmcgd2hlcmU7Ci0gIGxvbmcgYWRkcmVzc19vZl92YXI7Ci0gIC8qIFdoZXJlLCBpbiBmaWxlIHNwYWNlLCBpcyBfdmFyIG9mICpmcmFnUD8gKi8KLSAgbG9uZyB0YXJnZXRfYWRkcmVzcyA9IDA7Ci0gIC8qIFdoZXJlLCBpbiBmaWxlIHNwYWNlLCBkb2VzIGFkZHIgcG9pbnQ/ICovCi0KLSAga25vdyAoZnJhZ1AtPmZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQpOwotICBsZW5ndGhfY29kZSA9IGZyYWdQLT5mcl9zdWJ0eXBlICYgMzsJLyogZGVwZW5kcyBvbiBFTkNPREVfUkVMQVgoKSAqLwotICBrbm93IChsZW5ndGhfY29kZSA+PSAwICYmIGxlbmd0aF9jb2RlIDwgMyk7Ci0gIHdoZXJlID0gZnJhZ1AtPmZyX2ZpeDsKLSAgYWRkcmVzc1AgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIHdoZXJlOwotICBvcGNvZGVQID0gZnJhZ1AtPmZyX29wY29kZTsKLSAgc3ltYm9sUCA9IGZyYWdQLT5mcl9zeW1ib2w7Ci0gIGtub3cgKHN5bWJvbFApOwotICB0YXJnZXRfYWRkcmVzcyA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKSArIGZyYWdQLT5mcl9vZmZzZXQ7Ci0gIGFkZHJlc3Nfb2ZfdmFyID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZTsKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfQllURSk6Ci0gICAgICBrbm93ICgqYWRkcmVzc1AgPT0gMCB8fCAqYWRkcmVzc1AgPT0gMHgxMCk7CS8qICdAJyBiaXQuICovCi0gICAgICBhZGRyZXNzUFswXSB8PSAweEFGOwkvKiBCeXRlIGRpc3BsYWNlbWVudC4gKi8KLSAgICAgIGFkZHJlc3NQWzFdID0gdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfV09SRCk6Ci0gICAgICBrbm93ICgqYWRkcmVzc1AgPT0gMCB8fCAqYWRkcmVzc1AgPT0gMHgxMCk7CS8qICdAJyBiaXQuICovCi0gICAgICBhZGRyZXNzUFswXSB8PSAweENGOwkvKiBXb3JkIGRpc3BsYWNlbWVudC4gKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyAxLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDMpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfTE9ORyk6Ci0gICAgICBrbm93ICgqYWRkcmVzc1AgPT0gMCB8fCAqYWRkcmVzc1AgPT0gMHgxMCk7CS8qICdAJyBiaXQuICovCi0gICAgICBhZGRyZXNzUFswXSB8PSAweEVGOwkvKiBMb25nIHdvcmQgZGlzcGxhY2VtZW50LiAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCArIDEsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgNSksIDQpOwotICAgICAgZXh0ZW5zaW9uID0gNTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfQllURSk6Ci0gICAgICBhZGRyZXNzUFswXSA9IHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMSk7Ci0gICAgICBleHRlbnNpb24gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNILCBTVEFURV9XT1JEKToKLSAgICAgIG9wY29kZVBbMF0gXj0gMTsJCS8qIFJldmVyc2Ugc2Vuc2Ugb2YgdGVzdC4gKi8KLSAgICAgIGFkZHJlc3NQWzBdID0gMzsKLSAgICAgIGFkZHJlc3NQWzFdID0gVkFYX0JSQiArIFZBWF9XSURFTl9XT1JEOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCArIDIsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgNCksIDIpOwotICAgICAgZXh0ZW5zaW9uID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfTE9ORyk6Ci0gICAgICBvcGNvZGVQWzBdIF49IDE7CQkvKiBSZXZlcnNlIHNlbnNlIG9mIHRlc3QuICovCi0gICAgICBhZGRyZXNzUFswXSA9IDY7Ci0gICAgICBhZGRyZXNzUFsxXSA9IFZBWF9KTVA7Ci0gICAgICBhZGRyZXNzUFsyXSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCArIDMsIHRhcmdldF9hZGRyZXNzLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9CWVRFKToKLSAgICAgIGFkZHJlc3NQWzBdID0gdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAxKTsKLSAgICAgIGV4dGVuc2lvbiA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9XT1JEKToKLSAgICAgIG9wY29kZVBbMF0gKz0gVkFYX1dJREVOX1dPUkQ7CS8qIGJyYiAtPiBicncsIGJzYmIgLT4gYnNidyAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKSwgMik7Ci0gICAgICBleHRlbnNpb24gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfTE9ORyk6Ci0gICAgICBvcGNvZGVQWzBdICs9IFZBWF9XSURFTl9MT05HOwkvKiBicmIgLT4gam1wLCBic2JiIC0+IGpzYiAqLwotICAgICAgYWRkcmVzc1BbMF0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyAxLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDUpLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0JSQU5DSCwgU1RBVEVfV09SRCk6Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDIpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0JSQU5DSCwgU1RBVEVfTE9ORyk6Ci0gICAgICBhZGRyZXNzUFswXSA9IDI7Ci0gICAgICBhZGRyZXNzUFsxXSA9IDA7Ci0gICAgICBhZGRyZXNzUFsyXSA9IFZBWF9CUkI7Ci0gICAgICBhZGRyZXNzUFszXSA9IDY7Ci0gICAgICBhZGRyZXNzUFs0XSA9IFZBWF9KTVA7Ci0gICAgICBhZGRyZXNzUFs1XSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCArIDYsIHRhcmdldF9hZGRyZXNzLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDEwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9IT1AsIFNUQVRFX0JZVEUpOgotICAgICAgYWRkcmVzc1BbMF0gPSB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDEpOwotICAgICAgZXh0ZW5zaW9uID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTVBMRVhfSE9QLCBTVEFURV9XT1JEKToKLSAgICAgIGFkZHJlc3NQWzBdID0gMjsKLSAgICAgIGFkZHJlc3NQWzFdID0gVkFYX0JSQjsKLSAgICAgIGFkZHJlc3NQWzJdID0gMzsKLSAgICAgIGFkZHJlc3NQWzNdID0gVkFYX0JSVzsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyA0LCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDYpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0hPUCwgU1RBVEVfTE9ORyk6Ci0gICAgICBhZGRyZXNzUFswXSA9IDI7Ci0gICAgICBhZGRyZXNzUFsxXSA9IFZBWF9CUkI7Ci0gICAgICBhZGRyZXNzUFsyXSA9IDY7Ci0gICAgICBhZGRyZXNzUFszXSA9IFZBWF9KTVA7Ci0gICAgICBhZGRyZXNzUFs0XSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCArIDUsIHRhcmdldF9hZGRyZXNzLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBCQURfQ0FTRSAoZnJhZ1AtPmZyX3N1YnR5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBmcmFnUC0+ZnJfZml4ICs9IGV4dGVuc2lvbjsKLX0JCQkJLyogbWRfY29udmVydF9mcmFnKCkgKi8KLQotLyogVHJhbnNsYXRlIGludGVybmFsIGZvcm1hdCBvZiByZWxvY2F0aW9uIGluZm8gaW50byB0YXJnZXQgZm9ybWF0LgotCi0gICBPbiB2YXg6IGZpcnN0IDQgYnl0ZXMgYXJlIG5vcm1hbCB1bnNpZ25lZCBsb25nLCBuZXh0IHRocmVlIGJ5dGVzCi0gICBhcmUgc3ltYm9sbnVtLCBsZWFzdCBzaWcuIGJ5dGUgZmlyc3QuICBMYXN0IGJ5dGUgaXMgYnJva2VuIHVwIHdpdGgKLSAgIHRoZSB1cHBlciBuaWJibGUgYXMgbnV0aGluLCBiaXQgMyBhcyBleHRlcm4sIGJpdHMgMiAmIDEgYXMgbGVuZ3RoLCBhbmQKLSAgIGJpdCAwIGFzIHBjcmVsLiAqLwotI2lmZGVmIGNvbW1lbnQKLXZvaWQKLW1kX3JpX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpKQotICAgICBjaGFyICp0aGVfYnl0ZXM7Ci0gICAgIHN0cnVjdCByZWxvY19pbmZvX2dlbmVyaWMgcmk7Ci17Ci0gIC8qIHRoaXMgaXMgZWFzeSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHRoZV9ieXRlcywgcmkucl9hZGRyZXNzLCBzaXplb2YgKHJpLnJfYWRkcmVzcykpOwotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICB0aGVfYnl0ZXNbNl0gPSAocmkucl9zeW1ib2xudW0gPj4gMTYpICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s1XSA9IChyaS5yX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbNF0gPSByaS5yX3N5bWJvbG51bSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbN10gPSAoKChyaS5yX2V4dGVybiA8PCAzKSAmIDB4MDgpIHwgKChyaS5yX2xlbmd0aCA8PCAxKSAmIDB4MDYpIHwKLQkJICAoKHJpLnJfcGNyZWwgPDwgMCkgJiAweDAxKSkgJiAweDBGOwotfQotCi0jZW5kaWYgLyogY29tbWVudCAqLwotCi12b2lkIAotdGNfYW91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICAvKgotICAgKiBJbjogbGVuZ3RoIG9mIHJlbG9jYXRpb24gKG9yIG9mIGFkZHJlc3MpIGluIGNoYXJzOiAxLCAyIG9yIDQuCi0gICAqIE91dDogR05VIExEIHJlbG9jYXRpb24gbGVuZ3RoIGNvZGU6IDAsIDEsIG9yIDIuCi0gICAqLwotCi0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5ieXRlc19yX2xlbmd0aFtdID0gezQyLCAwLCAxLCA0MiwgMn07Ci0gIGxvbmcgcl9zeW1ib2xudW07Ci0KLSAga25vdyAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCk7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwKLSAgICAgICBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSwKLQkJICAgICAgNCk7Ci0KLSAgcl9zeW1ib2xudW0gPSAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkJID8gU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpCi0JCSA6IGZpeFAtPmZ4X2FkZHN5LT5zeV9udW1iZXIpOwotCi0gIHdoZXJlWzZdID0gKHJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB3aGVyZVs1XSA9IChyX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB3aGVyZVs0XSA9IHJfc3ltYm9sbnVtICYgMHgwZmY7Ci0gIHdoZXJlWzddID0gKCgoKCFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkgPDwgMykgJiAweDA4KQotCSAgICAgIHwgKChuYnl0ZXNfcl9sZW5ndGhbZml4UC0+Znhfc2l6ZV0gPDwgMSkgJiAweDA2KQotCSAgICAgIHwgKCgoZml4UC0+ZnhfcGNyZWwgPDwgMCkgJiAweDAxKSAmIDB4MGYpKTsKLX0KLQotLyoKLSAqICAgICAgIEJVR1MsIEdSSVBFUywgIEFQT0xPR0lBLCBldGMuCi0gKgotICogVGhlIG9wY29kZSB0YWJsZSAndm90c3RycycgbmVlZHMgdG8gYmUgc29ydGVkIG9uIG9wY29kZSBmcmVxdWVuY3kuCi0gKiBUaGF0IGlzLCBBRlRFUiB3ZSBoYXNoIGl0IHdpdGggaGFzaF8uLi4oKSwgd2Ugd2FudCBtb3N0LXVzZWQgb3Bjb2RlcwotICogdG8gY29tZSBvdXQgb2YgdGhlIGhhc2ggdGFibGUgZmFzdGVyLgotICoKLSAqIEkgYW0gc29ycnkgdG8gaW5mbGljdCB5ZXQgYW5vdGhlciBWQVggYXNzZW1ibGVyIG9uIHRoZSB3b3JsZCwgYnV0Ci0gKiBSTVMgc2F5cyB3ZSBtdXN0IGRvIGV2ZXJ5dGhpbmcgZnJvbSBzY3JhdGNoLCB0byBwcmV2ZW50IHBpbi1oZWFkcwotICogcmVzdHJpY3RpbmcgdGhpcyBzb2Z0d2FyZS4KLSAqLwotCi0vKgotICogVGhpcyBpcyBhIHZhZ3VlbHkgbW9kdWxhciBzZXQgb2Ygcm91dGluZXMgaW4gQyB0byBwYXJzZSBWQVgKLSAqIGFzc2VtYmx5IGNvZGUgdXNpbmcgREVDIG1uZW1vbmljcy4gSXQgaXMgTk9UIHVuKnggc3BlY2lmaWMuCi0gKgotICogVGhlIGlkZWEgaGVyZSBpcyB0aGF0IHRoZSBhc3NlbWJsZXIgaGFzIHRha2VuIGNhcmUgb2YgYWxsOgotICogICBsYWJlbHMKLSAqICAgbWFjcm9zCi0gKiAgIGxpc3RpbmcKLSAqICAgcHNldWRvLW9wcwotICogICBsaW5lIGNvbnRpbnVhdGlvbgotICogICBjb21tZW50cwotICogICBjb25kZW5zaW5nIGFueSB3aGl0ZXNwYWNlIGRvd24gdG8gZXhhY3RseSBvbmUgc3BhY2UKLSAqIGFuZCBhbGwgd2UgaGF2ZSB0byBkbyBpcyBwYXJzZSAxIGxpbmUgaW50byBhIHZheCBpbnN0cnVjdGlvbgotICogcGFydGlhbGx5IGZvcm1lZC4gV2Ugd2lsbCBhY2NlcHQgYSBsaW5lLCBhbmQgZGVsaXZlcjoKLSAqICAgYW4gZXJyb3IgbWVzc2FnZSAoaG9wZWZ1bGx5IGVtcHR5KQotICogICBhIHNrZWxldG9uIFZBWCBpbnN0cnVjdGlvbiAodHJlZSBzdHJ1Y3R1cmUpCi0gKiAgIHRleHR1YWwgcG9pbnRlcnMgdG8gYWxsIHRoZSBvcGVyYW5kIGV4cHJlc3Npb25zCi0gKiAgIGEgd2FybmluZyBtZXNzYWdlIHRoYXQgbm90ZXMgYSBzaWxseSBvcGVyYW5kIChob3BlZnVsbHkgZW1wdHkpCi0gKi8KLQwKLS8qCi0gKgkJRSBEIEkgVCAgIEggSSBTIFQgTyBSIFkKLSAqCi0gKiAxN21heTg2IERlYW4gRWxzbmVyLiBCdWcgaWYgbGluZSBlbmRzIGltbWVkaWF0ZWx5IGFmdGVyIG9wY29kZS4KLSAqIDMwYXByODYgRGVhbiBFbHNuZXIuIE5ldyB2aXBfb3AoKSB1c2VzIGFyZyBibG9jayBzbyBjaGFuZ2UgY2FsbC4KLSAqICA2amFuODYgRGVhbiBFbHNuZXIuIENyb2NrIHZpcF9iZWdpbigpIHRvIGNhbGwgdmlwX29wX2RlZmF1bHRzKCkuCi0gKiAgMmphbjg2IERlYW4gRWxzbmVyLiBJbnZlbnQgc3ludGhldGljIG9wY29kZXMuCi0gKglXaWRlbiB2YXhfb3Bjb2RlVCB0byAzMiBiaXRzLiBVc2UgYSBiaXQgZm9yIFZJVF9PUENPREVfU1lOVEhFVElDLAotICoJd2hpY2ggbWVhbnMgdGhpcyBpcyBub3QgYSByZWFsIG9wY29kZSwgaXQgaXMgbGlrZSBhIG1hY3JvOyBpdCB3aWxsCi0gKgliZSByZWxheCgpZWQgaW50byAxIG9yIG1vcmUgaW5zdHJ1Y3Rpb25zLgotICoJVXNlIGFub3RoZXIgYml0IGZvciBWSVRfT1BDT0RFX1NQRUNJQUwgaWYgdGhlIG9wLWNvZGUgaXMgbm90IG9wdGltaXNlZAotICoJbGlrZSBhIHJlZ3VsYXIgYnJhbmNoIGluc3RydWN0aW9uLiBPcHRpb24gYWRkZWQgdG8gdmlwX2JlZ2luKCk6Ci0gKglleGNsdWRlCXN5bnRoZXRpYyBvcGNvZGVzLiBJbnZlbnQgc3ludGhldGljX3ZvdHN0cnNbXS4KLSAqIDMxZGVjODUgRGVhbiBFbHNuZXIuIEludmVudCB2aXRfb3Bjb2RlX25ieXRlcy4KLSAqCUFsc28gbWFrZSB2aXRfb3Bjb2RlIGludG8gYSBjaGFyW10uIFdlIG5vdyBoYXZlIG4tYnl0ZSB2YXggb3Bjb2RlcywKLSAqCXNvIGNhbGxlcidzIGRvbid0IGhhdmUgdG8ga25vdyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgMS1ieXRlICYgYQotICoJMi1ieXRlIG9wLWNvZGUuIFN0aWxsIG5lZWQgdmF4X29wY29kZVQgY29uY2VwdCwgc28gd2Uga25vdyBob3cKLSAqCWJpZyBhbiBvYmplY3QgbXVzdCBiZSB0byBob2xkIGFuIG9wLmNvZGUuCi0gKiAzMGRlYzg1IERlYW4gRWxzbmVyLiBXaWRlbiB0eXBlZGVmIHZheF9vcGNvZGVUIGluICJ2YXgtaW5zdC5oIgotICoJYmVjYXVzZSB2YXggb3Bjb2RlcyBtYXkgYmUgMTYgYml0cy4gT3VyIGNydWZ0eSBDIGNvbXBpbGVyIHdhcwotICoJaGFwcGlseSBpbml0aWFsaXNpbmcgOC1iaXQgdm90X2NvZGVzIHdpdGggMTYtYml0IG51bWJlcnMhCi0gKgkoV291bGRuJ3QgdGhlICdwaG9uZSBjb21wYW55IGxpa2UgdG8gY29tcHJlc3MgZGF0YSBzbyBlYXNpbHkhKQotICogMjlkZWM4NSBEZWFuIEVsc25lci4gTmV3IHN0YXRpYyB0YWJsZSB2YXhfb3BlcmFuZF93aWR0aF9zaXplW10uCi0gKglJbnZlbnRlZCBzbyB3ZSBrbm93IGh3IG1hbnkgYnl0ZXMgYSAiSV4jNDIiIG5lZWRzIGluIGl0cyBpbW1lZGlhdGUKLSAqCW9wZXJhbmQuIFJldmlzZWQgc3RydWN0IHZvcCBpbiAidmF4LWluc3QuaCI6IGV4cGxpY2l0bHkgaW5jbHVkZQotICoJYnl0ZSBsZW5ndGggb2YgZWFjaCBvcGVyYW5kLCBhbmQgaXQncyBsZXR0ZXItY29kZSBkYXR1bSB0eXBlLgotICogMTdub3Y4NSBEZWFuIEVsc25lci4gTmFtZSBDaGFuZ2UuCi0gKglEdWUgdG8gYXIoMSkgdHJ1bmNhdGluZyBuYW1lcywgd2UgbGVhcm5lZCB0aGUgaGFyZCB3YXkgdGhhdAotICoJInZheC1pbnN0LXBhcnNlLmMiIC0+ICJ2YXgtaW5zdC1wYXJzZS4iIGRyb3BwaW5nIHRoZSAibyIgb2ZmCi0gKgl0aGUgYXJjaGl2ZWQgb2JqZWN0IG5hbWUuIFNPLi4uIHdlIHNob3J0ZW5lZCB0aGUgbmFtZSBvZiB0aGlzCi0gKglzb3VyY2UgZmlsZSwgYW5kIGNoYW5nZWQgdGhlIG1ha2VmaWxlLgotICovCi0KLS8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoOwotCi0vKgotICogSW46CTEgY2hhcmFjdGVyLCBmcm9tICJiZGZnaGxvcXB3IiBiZWluZyB0aGUgZGF0YS10eXBlIG9mIGFuIG9wZXJhbmQKLSAqCW9mIGEgdmF4IGluc3RydWN0aW9uLgotICoKLSAqIE91dDoJdGhlIGxlbmd0aCBvZiBhbiBvcGVyYW5kIG9mIHRoYXQgdHlwZSwgaW4gYnl0ZXMuCi0gKglTcGVjaWFsIGJyYW5jaCBvcGVyYW5kcyB0eXBlcyAiLT8hIiBoYXZlIGxlbmd0aCAwLgotICovCi0KLXN0YXRpYyBjb25zdCBzaG9ydCBpbnQgdmF4X29wZXJhbmRfd2lkdGhfc2l6ZVsyNTZdID0KLXsKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gIDAsIDAsIDEsIDAsIDgsIDAsIDQsIDgsIDE2LCAwLCAwLCAwLCA0LCAwLCAwLDE2LAkvKiAuLmIuZC5mZ2guLi5sLi5vICovCi0gIDAsIDgsIDAsIDAsIDAsIDAsIDAsIDIsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAucS4uLi4udy4uLi4uLi4uICovCi0gIDAsIDAsIDEsIDAsIDgsIDAsIDQsIDgsIDE2LCAwLCAwLCAwLCA0LCAwLCAwLDE2LAkvKiAuLmIuZC5mZ2guLi5sLi5vICovCi0gIDAsIDgsIDAsIDAsIDAsIDAsIDAsIDIsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAucS4uLi4udy4uLi4uLi4uICovCi0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLX07Ci0MCi0vKgotICogVGhpcyBwZXJ2ZXJzaW9uIGVuY29kZXMgYWxsIHRoZSB2YXggb3Bjb2RlcyBhcyBhIGJ1bmNoIG9mIHN0cmluZ3MuCi0gKiBSTVMgc2F5cyB3ZSBzaG91bGQgYnVpbGQgb3VyIGhhc2gtdGFibGUgYXQgcnVuLXRpbWUuIEhtbS4KLSAqIFBsZWFzZSB3b3VsZCBzb21lb25lIGFycmFuZ2UgdGhlc2UgaW4gZGVjcmVhc2luZyBmcmVxdWVuY3kgb2Ygb3Bjb2RlPwotICogQmVjYXVzZSBvZiB0aGUgd2F5IGhhc2hfLi4uKCkgd29ya3MsIHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBvcGNvZGUKLSAqIHNob3VsZCBiZSB0ZXh0dWFsbHkgZmlyc3QgYW5kIHNvIG9uLgotICoKLSAqIElucHV0IGZvciB0aGlzIHRhYmxlIHdhcyAndmF4Lm9wY29kZXMnLCBhd2soMSllZCBieSAndmF4Lm9wY29kZXMuYy5hd2snIC4KLSAqIFNvIGNoYW5nZSAndmF4Lm9wY29kZXMnLCB0aGVuIHJlLWdlbmVyYXRlIHRoaXMgdGFibGUuCi0gKi8KLQotI2luY2x1ZGUgIm9wY29kZS92YXguaCIKLQwKLS8qCi0gKiBUaGlzIGlzIGEgdGFibGUgb2Ygb3B0aW9uYWwgb3AtY29kZXMuIEFsbCBvZiB0aGVtIHJlcHJlc2VudAotICogJ3N5bnRoZXRpYycgaW5zdHJ1Y3Rpb25zIHRoYXQgc2VlbSBwb3B1bGFyLgotICoKLSAqIEhlcmUgd2UgbWFrZSBzb21lIHBzZXVkbyBvcC1jb2Rlcy4gRXZlcnkgY29kZSBoYXMgYSBiaXQgc2V0IHRvIHNheQotICogaXQgaXMgc3ludGhldGljLiBUaGlzIGxldHMgeW91IGNhdGNoIHRoZW0gaWYgeW91IHdhbnQgdG8KLSAqIGJhbiB0aGVzZSBvcGNvZGVzLiBUaGV5IGFyZSBtbmVtb25pY3MgZm9yICJlbGFzdGljIiBpbnN0cnVjdGlvbnMKLSAqIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGFzc2VtYmxlIGludG8gdGhlIGZld2VzdCBieXRlcyBuZWVkZWQgdG8gZG8gYQotICogYnJhbmNoLCBvciB0byBkbyBhIGNvbmRpdGlvbmFsIGJyYW5jaCwgb3Igd2hhdGV2ZXIuCi0gKgotICogVGhlIG9wY29kZSBpcyBpbiB0aGUgdXN1YWwgcGxhY2UgW2xvdy1vcmRlciBuKjggYml0c10uIFRoaXMgbWVhbnMKLSAqIHRoYXQgaWYgeW91IG1hc2sgb2ZmIHRoZSBidWNreSBiaXRzLCB0aGUgdXN1YWwgcnVsZXMgYXBwbHkgYWJvdXQKLSAqIGhvdyBsb25nIHRoZSBvcGNvZGUgaXMuCi0gKgotICogQWxsIFZBWCBicmFuY2ggZGlzcGxhY2VtZW50cyBjb21lIGF0IHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9uLgotICogRm9yIHNpbXBsZSBicmFuY2hlcyAoMS1ieXRlIG9wY29kZSArIDEtYnl0ZSBkaXNwbGFjZW1lbnQpIHRoZSBsYXN0Ci0gKiBvcGVyYW5kIGlzIGNvZGVkICdiPycgd2hlcmUgdGhlICJkYXRhIHR5cGUiICc/JyBpcyBhIGNsdWUgdGhhdCB3ZQotICogbWF5IHJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBicmFuY2ggKGNvbXBsZW1lbnQgbG93ZXN0IG9yZGVyIGJpdCkKLSAqIGFuZCBicmFuY2ggYXJvdW5kIGEganVtcC4gVGhpcyBpcyBieSBmYXIgdGhlIG1vc3QgY29tbW9uIGNhc2UuCi0gKiBUaGF0IGlzIHdoeSB0aGUgVklUX09QQ09ERV9TWU5USEVUSUMgYml0IGlzIHNldDogaXQgc2F5cyB0aGlzIGlzCi0gKiBhIDAtYnl0ZSBvcC1jb2RlIGZvbGxvd2VkIGJ5IDIgb3IgbW9yZSBieXRlcyBvZiBvcGVyYW5kIGFkZHJlc3MuCi0gKgotICogSWYgdGhlIG9wLWNvZGUgaGFzIFZJVF9PUENPREVfU1BFQ0lBTCBzZXQsIHRoZW4gd2UgaGF2ZSBhIG1vcmUgdW51c3VhbAotICogY2FzZS4KLSAqCi0gKiBGb3IgSkJTQiAmIEpCUiB0aGUgdHJlYXRtZW50IGlzIHRoZSBzaW1pbGFyLCBleGNlcHQgKDEpIHdlIGhhdmUgYSAnYncnCi0gKiBvcHRpb24gYmVmb3JlICgyKSB3ZSBjYW4gZGlyZWN0bHkgSlNCL0pNUCBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbmRpdGlvbi4KLSAqIFRoZXNlIG9wZXJhbmRzIGhhdmUgJ2ItJyBhcyB0aGVpciBhY2Nlc3MvZGF0YSB0eXBlLgotICoKLSAqIFRoYXQgbGVhdmVzIGEgYnVuY2ggb2YgcmFuZG9tIG9wY29kZXM6IEpBQ0J4LCBKeE9CeHh4LiBJbiB0aGVzZQotICogY2FzZXMsIHdlIGRvIHRoZSBzYW1lIGlkZWEuIEpBQ0J4eHggYXJlIGFsbCBtYXJrZWQgd2l0aCBhICdiIScKLSAqIEpBT0J4eHggJiBKU09CeHh4IGFyZSBtYXJrZWQgd2l0aCBhICdiOicuCi0gKgotICovCi0jaWYgKFZJVF9PUENPREVfU1lOVEhFVElDICE9IDB4ODAwMDAwMDApCi1Zb3UgaGF2ZSBqdXN0IGJyb2tlbiB0aGUgZW5jb2RpbmcgYmVsb3csIHdoaWNoIGFzc3VtZXMgdGhlIHNpZ24gYml0Ci0gIG1lYW5zICdJIGFtIGFuIGltYWdpbmFyeSBpbnN0cnVjdGlvbicuCi0jZW5kaWYKLQotI2lmIChWSVRfT1BDT0RFX1NQRUNJQUwgIT0gMHg0MDAwMDAwMCkKLSAgWW91IGhhdmUganVzdCBicm9rZW4gdGhlIGVuY29kaW5nIGJlbG93LCB3aGljaCBhc3N1bWVzIHRoZSAweDQwIE0gYml0IG1lYW5zCi0gICdJIGFtIG5vdCB0byBiZSAib3B0aW1pc2VkIiB0aGUgd2F5IG5vcm1hbCBicmFuY2hlcyBhcmUnLgotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm90Ci0gIHN5bnRoZXRpY192b3RzdHJzW10gPQotewotICB7Impic2IiLAl7ImItIiwgMHhDMDAwMDAxMH19LAkJLyogQlNEIDQuMiAqLwotLyoganNiIHVzZWQgYWxyZWFkeSAqLwotICB7ImpiciIsCXsiYi0iLCAweEMwMDAwMDExfX0sCQkvKiBCU0QgNC4yICovCi0gIHsianIiLAl7ImItIiwgMHhDMDAwMDAxMX19LAkJLyogY29uc2lzdGVudCAqLwotICB7ImpuZXEiLAl7ImI/IiwgMHg4MDAwMDAxMn19LAotICB7ImpuZXF1IiwJeyJiPyIsIDB4ODAwMDAwMTJ9fSwKLSAgeyJqZXFsIiwJeyJiPyIsIDB4ODAwMDAwMTN9fSwKLSAgeyJqZXFsdSIsCXsiYj8iLCAweDgwMDAwMDEzfX0sCi0gIHsiamd0ciIsCXsiYj8iLCAweDgwMDAwMDE0fX0sCi0gIHsiamxlcSIsCXsiYj8iLCAweDgwMDAwMDE1fX0sCi0vKiB1bi11c2VkIG9wY29kZXMgaGVyZSAqLwotICB7ImpnZXEiLAl7ImI/IiwgMHg4MDAwMDAxOH19LAotICB7Impsc3MiLAl7ImI/IiwgMHg4MDAwMDAxOX19LAotICB7ImpndHJ1IiwJeyJiPyIsIDB4ODAwMDAwMWF9fSwKLSAgeyJqbGVxdSIsCXsiYj8iLCAweDgwMDAwMDFifX0sCi0gIHsianZjIiwJeyJiPyIsIDB4ODAwMDAwMWN9fSwKLSAgeyJqdnMiLAl7ImI/IiwgMHg4MDAwMDAxZH19LAotICB7ImpnZXF1IiwJeyJiPyIsIDB4ODAwMDAwMWV9fSwKLSAgeyJqY2MiLAl7ImI/IiwgMHg4MDAwMDAxZX19LAotICB7Impsc3N1IiwJeyJiPyIsIDB4ODAwMDAwMWZ9fSwKLSAgeyJqY3MiLAl7ImI/IiwgMHg4MDAwMDAxZn19LAotCi0gIHsiamFjYnciLAl7InJ3cndtd2IhIiwgMHhDMDAwMDAzZH19LAotICB7ImphY2JmIiwJeyJyZnJmbWZiISIsIDB4QzAwMDAwNGZ9fSwKLSAgeyJqYWNiZCIsCXsicmRyZG1kYiEiLCAweEMwMDAwMDZmfX0sCi0gIHsiamFjYmIiLAl7InJicmJtYmIhIiwgMHhDMDAwMDA5ZH19LAotICB7ImphY2JsIiwJeyJybHJsbWxiISIsIDB4QzAwMDAwZjF9fSwKLSAgeyJqYWNiZyIsCXsicmdyZ21nYiEiLCAweEMwMDA0ZmZkfX0sCi0gIHsiamFjYmgiLAl7InJocmhtaGIhIiwgMHhDMDAwNmZmZH19LAotCi0gIHsiamJzIiwJeyJybHZiYj8iLCAweDgwMDAwMGUwfX0sCi0gIHsiamJjIiwJeyJybHZiYj8iLCAweDgwMDAwMGUxfX0sCi0gIHsiamJzcyIsCXsicmx2YmI/IiwgMHg4MDAwMDBlMn19LAotICB7ImpiY3MiLAl7InJsdmJiPyIsIDB4ODAwMDAwZTN9fSwKLSAgeyJqYnNjIiwJeyJybHZiYj8iLCAweDgwMDAwMGU0fX0sCi0gIHsiamJjYyIsCXsicmx2YmI/IiwgMHg4MDAwMDBlNX19LAotICB7Impic3NpIiwJeyJybHZiYj8iLCAweDgwMDAwMGU2fX0sCi0gIHsiamJjY2kiLAl7InJsdmJiPyIsIDB4ODAwMDAwZTd9fSwKLSAgeyJqbGJzIiwJeyJybGI/IiwgMHg4MDAwMDBlOH19LAotICB7ImpsYmMiLAl7InJsYj8iLCAweDgwMDAwMGU5fX0sCi0KLSAgeyJqYW9ibHNzIiwJeyJybG1sYjoiLCAweEMwMDAwMGYyfX0sCi0gIHsiamFvYmxlcSIsCXsicmxtbGI6IiwgMHhDMDAwMDBmM319LAotICB7Impzb2JnZXEiLAl7Im1sYjoiLCAweEMwMDAwMGY0fX0sCi0gIHsianNvYmd0ciIsCXsibWxiOiIsIDB4QzAwMDAwZjV9fSwKLQotLyogQ0FTRXggaGFzIG5vIGJyYW5jaCBhZGRyZXNzZXMgaW4gb3VyIGNvbmNlcHRpb24gb2YgaXQuICovCi0vKiBZb3Ugc2hvdWxkIHVzZSAiLndvcmQgLi4uIiBzdGF0ZW1lbnRzIGFmdGVyIHRoZSAiY2FzZSAuLi4iLiAqLwotCi0gIHsiIiwJeyIiLCAwfX0JCQkvKiBlbXB0eSBpcyBlbmQgc2VudGluZWwgKi8KLQotfTsJCQkJLyogc3ludGhldGljX3ZvdHN0cnMgKi8KLQwKLS8qCi0gKiAgICAgICAgICAgICAgICAgIHYgaSBwIF8gYiBlIGcgaSBuICggKQotICoKLSAqIENhbGwgbWUgb25jZSBiZWZvcmUgeW91IGRlY29kZSBhbnkgbGluZXMuCi0gKiBJIGRlY29kZSB2b3RzdHJzIGludG8gYSBoYXNoIHRhYmxlIGF0IG9wX2hhc2ggKHdoaWNoIEkgY3JlYXRlKS4KLSAqIEkgcmV0dXJuIGFuIGVycm9yIHRleHQgb3IgbnVsbC4KLSAqIElmIHlvdSB3YW50LCBJIHdpbGwgaW5jbHVkZSB0aGUgJ3N5bnRoZXRpYycgalhYWCBpbnN0cnVjdGlvbnMgaW4gdGhlCi0gKiBpbnN0cnVjdGlvbiB0YWJsZS4KLSAqIFlvdSBtdXN0IG5vbWluYXRlIG1ldGFjaGFyYWN0ZXJzIGZvciBlZyBERUMncyAiIyIsICJAIiwgIl4iLgotICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXZpcF9iZWdpbiAoc3ludGhldGljX3RvbywgaW1tZWRpYXRlLCBpbmRpcmVjdCwgZGlzcGxlbikKLSAgICAgaW50IHN5bnRoZXRpY190b287CQkvKiAxIG1lYW5zIGluY2x1ZGUgalhYWCBvcC1jb2Rlcy4gKi8KLSAgICAgY29uc3QgY2hhciAqaW1tZWRpYXRlLCAqaW5kaXJlY3QsICpkaXNwbGVuOwotewotICBjb25zdCBzdHJ1Y3Qgdm90ICp2UDsJCS8qIHNjYW4gdm90c3RycyAqLwotICBjb25zdCBjaGFyICpyZXR2YWwgPSAwOwkvKiBlcnJvciB0ZXh0ICovCi0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIGZvciAodlAgPSB2b3RzdHJzOyAqdlAtPnZvdF9uYW1lICYmICFyZXR2YWw7IHZQKyspCi0gICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIHZQLT52b3RfbmFtZSwgKFBUUikgJnZQLT52b3RfZGV0YWlsKTsKLQotICBpZiAoc3ludGhldGljX3RvbykKLSAgICBmb3IgKHZQID0gc3ludGhldGljX3ZvdHN0cnM7ICp2UC0+dm90X25hbWUgJiYgIXJldHZhbDsgdlArKykKLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCB2UC0+dm90X25hbWUsIChQVFIpICZ2UC0+dm90X2RldGFpbCk7Ci0KLSNpZm5kZWYgQ09OU1RfVEFCTEUKLSAgdmlwX29wX2RlZmF1bHRzIChpbW1lZGlhdGUsIGluZGlyZWN0LCBkaXNwbGVuKTsKLSNlbmRpZgotCi0gIHJldHVybiByZXR2YWw7Ci19Ci0KLQotLyoKLSAqICAgICAgICAgICAgICAgICAgdiBpIHAgKCApCi0gKgotICogVGhpcyBjb252ZXJ0cyBhIHN0cmluZyBpbnRvIGEgdmF4IGluc3RydWN0aW9uLgotICogVGhlIHN0cmluZyBtdXN0IGJlIGEgYmFyZSBzaW5nbGUgaW5zdHJ1Y3Rpb24gaW4gZGVjLXZheCAod2l0aCBCU0Q0IGZyb2JzKQotICogZm9ybWF0LgotICogSXQgcHJvdmlkZXMgc29tZSBlcnJvciBtZXNzYWdlczogYXQgbW9zdCBvbmUgZmF0YWwgZXJyb3IgbWVzc2FnZSAod2hpY2gKLSAqIHN0b3BzIHRoZSBzY2FuKSBhbmQgYXQgbW9zdCBvbmUgd2FybmluZyBtZXNzYWdlIGZvciBlYWNoIG9wZXJhbmQuCi0gKiBUaGUgdmF4IGluc3RydWN0aW9uIGlzIHJldHVybmVkIGluIGV4cGxvZGVkIGZvcm0sIHNpbmNlIHdlIGhhdmUgbm8KLSAqIGtub3dsZWRnZSBvZiBob3cgeW91IHBhcnNlIChvciBldmFsdWF0ZSkgeW91ciBleHByZXNzaW9ucy4KLSAqIFdlIGRvIGhvd2V2ZXIgc3RyaXAgb2ZmIGFuZCBkZWNvZGUgYWRkcmVzc2luZyBtb2RlcyBhbmQgb3BlcmF0aW9uCi0gKiBtbmVtb25pYy4KLSAqCi0gKiBUaGUgZXhwbG9kZWQgaW5zdHJ1Y3Rpb24gaXMgcmV0dXJuZWQgdG8gYSBzdHJ1Y3Qgdml0IG9mIHlvdXIgY2hvaWNlLgotICogI2luY2x1ZGUgInZheC1pbnN0LmgiIHRvIGtub3cgd2hhdCBhIHN0cnVjdCB2aXQgaXMuCi0gKgotICogVGhpcyBmdW5jdGlvbidzIHZhbHVlIGlzIGEgc3RyaW5nLiBJZiBpdCBpcyBub3QgIiIgdGhlbiBhbiBpbnRlcm5hbAotICogbG9naWMgZXJyb3Igd2FzIGZvdW5kOiByZWFkIHRoaXMgY29kZSB0byBhc3NpZ24gbWVhbmluZyB0byB0aGUgc3RyaW5nLgotICogTm8gYXJndW1lbnQgc3RyaW5nIHNob3VsZCBnZW5lcmF0ZSBzdWNoIGFuIGVycm9yIHN0cmluZzoKLSAqIGl0IG1lYW5zIGEgYnVnIGluIG91ciBjb2RlLCBub3QgaW4gdGhlIHVzZXIncyB0ZXh0LgotICoKLSAqIFlvdSBNVVNUIGhhdmUgY2FsbGVkIHZpcF9iZWdpbigpIG9uY2UgYmVmb3JlIHVzaW5nIHRoaXMgZnVuY3Rpb24uCi0gKi8KLQotc3RhdGljIHZvaWQKLXZpcCAodml0UCwgaW5zdHJpbmcpCi0gICAgIHN0cnVjdCB2aXQgKnZpdFA7CQkvKiBXZSBidWlsZCBhbiBleHBsb2RlZCBpbnN0cnVjdGlvbiBoZXJlLiAqLwotICAgICBjaGFyICppbnN0cmluZzsJCS8qIFRleHQgb2YgYSB2YXggaW5zdHJ1Y3Rpb246IHdlIG1vZGlmeS4gKi8KLXsKLSAgLyogSG93IHRvIGJpdC1lbmNvZGUgdGhpcyBvcGNvZGUuICovCi0gIHN0cnVjdCB2b3Rfd290ICp2d1A7Ci0gIC8qIDEvc2tpcCB3aGl0ZXNwYWNlLjIvc2NhbiB2b3RfaG93ICovCi0gIGNoYXIgKnA7Ci0gIGNoYXIgKnE7Ci0gIC8qIGNvdW50cyBudW1iZXIgb2Ygb3BlcmFuZHMgc2VlbiAqLwotICB1bnNpZ25lZCBjaGFyIGNvdW50OwotICAvKiBzY2FuIG9wZXJhbmRzIGluIHN0cnVjdCB2aXQgKi8KLSAgc3RydWN0IHZvcCAqb3BlcmFuZHA7Ci0gIC8qIGVycm9yIG92ZXIgYWxsIG9wZXJhbmRzICovCi0gIGNvbnN0IGNoYXIgKmFsbG9wZXJyOwotICAvKiBSZW1lbWJlciBjaGFyLCAod2UgY2xvYmJlciBpdCB3aXRoICdcMCcgdGVtcG9yYXJpbHkpLiAqLwotICBjaGFyIGM7Ci0gIC8qIE9wLWNvZGUgb2YgdGhpcyBpbnN0cnVjdGlvbi4gKi8KLSAgdmF4X29wY29kZVQgb2M7Ci0KLSAgaWYgKCppbnN0cmluZyA9PSAnICcpCi0gICAgKytpbnN0cmluZzsJCQkvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi8KLSAgZm9yIChwID0gaW5zdHJpbmc7ICpwICYmICpwICE9ICcgJzsgcCsrKTs7CS8qIE1VU1QgZW5kIGluIGVuZC1vZi1zdHJpbmcgb3IgZXhhY3RseSAxIHNwYWNlLiAqLwotICAvKiBTY2FubmVkIHVwIHRvIGVuZCBvZiBvcGVyYXRpb24tY29kZS4gKi8KLSAgLyogT3BlcmF0aW9uLWNvZGUgaXMgZW5kZWQgd2l0aCB3aGl0ZXNwYWNlLiAqLwotICBpZiAocCAtIGluc3RyaW5nID09IDApCi0gICAgewotICAgICAgdml0UC0+dml0X2Vycm9yID0gXygiTm8gb3BlcmF0b3IiKTsKLSAgICAgIGNvdW50ID0gMDsKLSAgICAgIG1lbXNldCAodml0UC0+dml0X29wY29kZSwgJ1wwJywgc2l6ZW9mICh2aXRQLT52aXRfb3Bjb2RlKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYyA9ICpwOwotICAgICAgKnAgPSAnXDAnOwotICAgICAgLyoKLSAgICAgICAqIEhlcmUgd2l0aCBpbnN0cmluZyBwb2ludGluZyB0byB3aGF0IGJldHRlciBiZSBhbiBvcC1uYW1lLCBhbmQgcAotICAgICAgICogcG9pbnRpbmcgdG8gY2hhcmFjdGVyIGp1c3QgcGFzdCB0aGF0LgotICAgICAgICogV2UgdHJ1c3QgaW5zdHJpbmcgcG9pbnRzIHRvIGFuIG9wLW5hbWUsIHdpdGggbm8gd2hpdGVzcGFjZS4KLSAgICAgICAqLwotICAgICAgdndQID0gKHN0cnVjdCB2b3Rfd290ICopIGhhc2hfZmluZCAob3BfaGFzaCwgaW5zdHJpbmcpOwotICAgICAgKnAgPSBjOwkJCS8qIFJlc3RvcmUgY2hhciBhZnRlciBvcC1jb2RlLiAqLwotICAgICAgaWYgKHZ3UCA9PSAwKQotCXsKLQkgIHZpdFAtPnZpdF9lcnJvciA9IF8oIlVua25vd24gb3BlcmF0b3IiKTsKLQkgIGNvdW50ID0gMDsKLQkgIG1lbXNldCAodml0UC0+dml0X29wY29kZSwgJ1wwJywgc2l6ZW9mICh2aXRQLT52aXRfb3Bjb2RlKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qCi0JICAgKiBXZSBmb3VuZCBhIG1hdGNoISBTbyBsZXRzIHBpY2sgdXAgYXMgbWFueSBvcGVyYW5kcyBhcyB0aGUKLQkgICAqIGluc3RydWN0aW9uIHdhbnRzLCBhbmQgZXZlbiBncmlwZSBpZiB0aGVyZSBhcmUgdG9vIG1hbnkuCi0JICAgKiBXZSBleHBlY3QgY29tbWEgdG8gc2VwZXJhdGUgZWFjaCBvcGVyYW5kLgotCSAgICogV2UgbGV0IGluc3RyaW5nIHRyYWNrIHRoZSB0ZXh0LCB3aGlsZSBwIHRyYWNrcyBhIHBhcnQgb2YgdGhlCi0JICAgKiBzdHJ1Y3Qgdm90LgotCSAgICovCi0JICBjb25zdCBjaGFyICpob3dwOwotCSAgLyoKLQkgICAqIFRoZSBsaW5lcyBiZWxvdyBrbm93IGFib3V0IDItYnl0ZSBvcGNvZGVzIHN0YXJ0aW5nIEZELEZFIG9yIEZGLgotCSAgICogVGhleSBhbHNvIHVuZGVyc3RhbmQgc3ludGhldGljIG9wY29kZXMuIE5vdGU6Ci0JICAgKiB3ZSByZXR1cm4gMzIgYml0cyBvZiBvcGNvZGUsIGluY2x1ZGluZyBidWNreSBiaXRzLCBCVVQKLQkgICAqIGFuIG9wY29kZSBsZW5ndGggaXMgZWl0aGVyIDggb3IgMTYgYml0cyBmb3Igdml0X29wY29kZV9uYnl0ZXMuCi0JICAgKi8KLQkgIG9jID0gdndQLT52b3RfY29kZTsJLyogVGhlIG9wLWNvZGUuICovCi0JICB2aXRQLT52aXRfb3Bjb2RlX25ieXRlcyA9IChvYyAmIDB4RkYpID49IDB4RkQgPyAyIDogMTsKLQkgIG1kX251bWJlcl90b19jaGFycyAodml0UC0+dml0X29wY29kZSwgb2MsIDQpOwotCSAgY291bnQgPSAwOwkJLyogbm8gb3BlcmFuZHMgc2VlbiB5ZXQgKi8KLQkgIGluc3RyaW5nID0gcDsJCS8qIHBvaW50IGp1c3QgcGFzdCBvcGVyYXRpb24gY29kZSAqLwotCSAgYWxsb3BlcnIgPSAiIjsKLQkgIGZvciAoaG93cCA9IHZ3UC0+dm90X2hvdywgb3BlcmFuZHAgPSB2aXRQLT52aXRfb3BlcmFuZDsKLQkgICAgICAgIShhbGxvcGVyciAmJiAqYWxsb3BlcnIpICYmICpob3dwOwotCSAgICAgICBvcGVyYW5kcCsrLCBob3dwICs9IDIpCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIEhlcmUgdG8gcGFyc2Ugb25lIG9wZXJhbmQuIExlYXZlIGluc3RyaW5nIHBvaW50aW5nIGp1c3QKLQkgICAgICAgKiBwYXN0IGFueSBvbmUgJywnIHRoYXQgbWFya3MgdGhlIGVuZCBvZiB0aGlzIG9wZXJhbmQuCi0JICAgICAgICovCi0JICAgICAgaWYgKCFob3dwWzFdKQotCQlhc19mYXRhbCAoXygib2RkIG51bWJlciBvZiBieXRlcyBpbiBvcGVyYW5kIGRlc2NyaXB0aW9uIikpOwotCSAgICAgIGVsc2UgaWYgKCppbnN0cmluZykKLQkJewotCQkgIGZvciAocSA9IGluc3RyaW5nOyAoYyA9ICpxKSAmJiBjICE9ICcsJzsgcSsrKQotCQkgICAgOwotCQkgIC8qCi0JCSAgICogUSBwb2ludHMgdG8gJywnIG9yICdcMCcgdGhhdCBlbmRzIGFyZ3VtZW50LiBDIGlzIHRoYXQKLQkJICAgKiBjaGFyYWN0ZXIuCi0JCSAgICovCi0JCSAgKnEgPSAwOwotCQkgIG9wZXJhbmRwLT52b3Bfd2lkdGggPSBob3dwWzFdOwotCQkgIG9wZXJhbmRwLT52b3BfbmJ5dGVzID0gdmF4X29wZXJhbmRfd2lkdGhfc2l6ZVsodW5zaWduZWQpIGhvd3BbMV1dOwotCQkgIG9wZXJhbmRwLT52b3BfYWNjZXNzID0gaG93cFswXTsKLQkJICB2aXBfb3AgKGluc3RyaW5nLCBvcGVyYW5kcCk7Ci0JCSAgKnEgPSBjOwkvKiBSZXN0b3JlIGlucHV0IHRleHQuICovCi0JCSAgaWYgKG9wZXJhbmRwLT52b3BfZXJyb3IpCi0JCSAgICBhbGxvcGVyciA9IF8oIkJhZCBvcGVyYW5kIik7Ci0JCSAgaW5zdHJpbmcgPSBxICsgKGMgPyAxIDogMCk7CS8qIG5leHQgb3BlcmFuZCAoaWYgYW55KSAqLwotCQkgIGNvdW50Kys7CS8qICB3b24gYW5vdGhlciBhcmd1bWVudCwgbWF5IGhhdmUgYW4gb3BlcnIgKi8KLQkJfQotCSAgICAgIGVsc2UKLQkJYWxsb3BlcnIgPSBfKCJOb3QgZW5vdWdoIG9wZXJhbmRzIik7Ci0JICAgIH0KLQkgIGlmICghKmFsbG9wZXJyKQotCSAgICB7Ci0JICAgICAgaWYgKCppbnN0cmluZyA9PSAnICcpCi0JCWluc3RyaW5nKys7CS8qIFNraXAgd2hpdGVzcGFjZS4gKi8KLQkgICAgICBpZiAoKmluc3RyaW5nKQotCQlhbGxvcGVyciA9IF8oIlRvbyBtYW55IG9wZXJhbmRzIik7Ci0JICAgIH0KLQkgIHZpdFAtPnZpdF9lcnJvciA9IGFsbG9wZXJyOwotCX0KLSAgICB9Ci0gIHZpdFAtPnZpdF9vcGVyYW5kcyA9IGNvdW50OwotfQotDAotI2lmZGVmIHRlc3QKLQotLyoKLSAqIFRlc3QgcHJvZ3JhbSBmb3IgYWJvdmUuCi0gKi8KLQotc3RydWN0IHZpdCBteXZpdDsJCS8qIGJ1aWxkIGFuIGV4cGxvZGVkIHZheCBpbnN0cnVjdGlvbiBoZXJlICovCi1jaGFyIGFuc3dlclsxMDBdOwkJLyogaHVtYW4gdHlwZXMgYSBsaW5lIG9mIHZheCBhc3NlbWJsZXIgaGVyZSAqLwotY2hhciAqbXlidWc7CQkJLyogIiIgb3IgYW4gaW50ZXJuYWwgbG9naWMgZGlhZ25vc3RpYyAqLwotaW50IG15Y291bnQ7CQkJLyogbnVtYmVyIG9mIG9wZXJhbmRzICovCi1zdHJ1Y3Qgdm9wICpteXZvcDsJCS8qIHNjYW4gb3BlcmFuZHMgZnJvbSBteXZpdCAqLwotaW50IG15c3ludGg7CQkJLyogMSBtZWFucyB3YW50IHN5bnRoZXRpYyBvcGNvZGVzLiAqLwotY2hhciBteV9pbW1lZGlhdGVbMjAwXTsKLWNoYXIgbXlfaW5kaXJlY3RbMjAwXTsKLWNoYXIgbXlfZGlzcGxlblsyMDBdOwotCi1tYWluICgpCi17Ci0gIGNoYXIgKnA7Ci0KLSAgcHJpbnRmICgiMCBtZWFucyBubyBzeW50aGV0aWMgaW5zdHJ1Y3Rpb25zLiAgICIpOwotICBwcmludGYgKCJWYWx1ZSBmb3IgdmlwX2JlZ2luPyAgIik7Ci0gIGdldHMgKGFuc3dlcik7Ci0gIHNzY2FuZiAoYW5zd2VyLCAiJWQiLCAmbXlzeW50aCk7Ci0gIHByaW50ZiAoIlN5bnRoZXRpYyBvcGNvZGVzICVzIGJlIGluY2x1ZGVkLlxuIiwgbXlzeW50aCA/ICJ3aWxsIiA6ICJ3aWxsIG5vdCIpOwotICBwcmludGYgKCJlbnRlciBpbW1lZGlhdGUgc3ltYm9scyBlZyBlbnRlciAjICAgIik7Ci0gIGdldHMgKG15X2ltbWVkaWF0ZSk7Ci0gIHByaW50ZiAoImVudGVyIGluZGlyZWN0IHN5bWJvbHMgIGVnIGVudGVyIEAgICAiKTsKLSAgZ2V0cyAobXlfaW5kaXJlY3QpOwotICBwcmludGYgKCJlbnRlciBkaXNwbGVuIHN5bWJvbHMgICBlZyBlbnRlciBeICAgIik7Ci0gIGdldHMgKG15X2Rpc3BsZW4pOwotICBpZiAocCA9IHZpcF9iZWdpbiAobXlzeW50aCwgbXlfaW1tZWRpYXRlLCBteV9pbmRpcmVjdCwgbXlfZGlzcGxlbikpCi0gICAgewotICAgICAgZXJyb3IgKCJ2aXBfYmVnaW49JXMiLCBwKTsKLSAgICB9Ci0gIHByaW50ZiAoIkFuIGVtcHR5IGlucHV0IGxpbmUgd2lsbCBxdWl0IHlvdSBmcm9tIHRoZSB2YXggaW5zdHJ1Y3Rpb24gcGFyc2VyXG4iKTsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBwcmludGYgKCJ2YXggaW5zdHJ1Y3Rpb246ICIpOwotICAgICAgZmZsdXNoIChzdGRvdXQpOwotICAgICAgZ2V0cyAoYW5zd2VyKTsKLSAgICAgIGlmICghKmFuc3dlcikKLQl7Ci0JICBicmVhazsJCS8qIG91dCBvZiBmb3IgZWFjaCBpbnB1dCB0ZXh0IGxvb3AgKi8KLQl9Ci0gICAgICB2aXAgKCZteXZpdCwgYW5zd2VyKTsKLSAgICAgIGlmICgqbXl2aXQudml0X2Vycm9yKQotCXsKLQkgIHByaW50ZiAoIkVSUjpcIiVzXCJcbiIsIG15dml0LnZpdF9lcnJvcik7Ci0JfQotICAgICAgcHJpbnRmICgib3Bjb2RlPSIpOwotICAgICAgZm9yIChteWNvdW50ID0gbXl2aXQudml0X29wY29kZV9uYnl0ZXMsIHAgPSBteXZpdC52aXRfb3Bjb2RlOwotCSAgIG15Y291bnQ7Ci0JICAgbXljb3VudC0tLCBwKysKLQkpCi0JewotCSAgcHJpbnRmICgiJTAyeCAiLCAqcCAmIDB4RkYpOwotCX0KLSAgICAgIHByaW50ZiAoIiAgIG9wZXJhbmQgY291bnQ9JWQuXG4iLCBteWNvdW50ID0gbXl2aXQudml0X29wZXJhbmRzKTsKLSAgICAgIGZvciAobXl2b3AgPSBteXZpdC52aXRfb3BlcmFuZDsgbXljb3VudDsgbXljb3VudC0tLCBteXZvcCsrKQotCXsKLQkgIHByaW50ZiAoIm1vZGU9JXh4IHJlZz0leHggbmR4PSV4eCBsZW49JyVjJz0lYyVjJWQuIGV4cHI9XCIiLAotCQkgIG15dm9wLT52b3BfbW9kZSwgbXl2b3AtPnZvcF9yZWcsIG15dm9wLT52b3BfbmR4LAotCQkgIG15dm9wLT52b3Bfc2hvcnQsIG15dm9wLT52b3BfYWNjZXNzLCBteXZvcC0+dm9wX3dpZHRoLAotCQkgIG15dm9wLT52b3BfbmJ5dGVzKTsKLQkgIGZvciAocCA9IG15dm9wLT52b3BfZXhwcl9iZWdpbjsgcCA8PSBteXZvcC0+dm9wX2V4cHJfZW5kOyBwKyspCi0JICAgIHsKLQkgICAgICBwdXRjaGFyICgqcCk7Ci0JICAgIH0KLQkgIHByaW50ZiAoIlwiXG4iKTsKLQkgIGlmIChteXZvcC0+dm9wX2Vycm9yKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiICBlcnI6XCIlc1wiXG4iLCBteXZvcC0+dm9wX2Vycm9yKTsKLQkgICAgfQotCSAgaWYgKG15dm9wLT52b3Bfd2FybikKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiAgd3JuOlwiJXNcIlxuIiwgbXl2b3AtPnZvcF93YXJuKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHZpcF9lbmQgKCk7Ci0gIGV4aXQgKEVYSVRfU1VDQ0VTUyk7Ci19Ci0KLSNlbmRpZiAvKiAjaWZkZWYgdGVzdCAqLwotCi0vKiBlbmQgb2YgdmF4X2luc19wYXJzZS5jICovCi0KLS8qIHZheF9yZWdfcGFyc2UuYyAtIGNvbnZlcnQgYSBWQVggcmVnaXN0ZXIgbmFtZSB0byBhIG51bWJlciAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5ODcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIEEgcGFydCBvZiBHTlUuICovCi0KLS8qCi0gKiAgICAgICAgICB2IGEgeCBfIHIgZSBnIF8gcCBhIHIgcyBlICggKQotICoKLSAqIFRha2UgMyBjaGFyLnMsIHRoZSBsYXN0IG9mIHdoaWNoIG1heSBiZSBgXDBgIChub24tZXhpc3RlbnQpCi0gKiBhbmQgcmV0dXJuIHRoZSBWQVggcmVnaXN0ZXIgbnVtYmVyIHRoYXQgdGhleSByZXByZXNlbnQuCi0gKgotICogUmV0dXJuIC0xIGlmIHRoZXkgZG9uJ3QgZm9ybSBhIHJlZ2lzdGVyIG5hbWUuIEdvb2QgbmFtZXMgcmV0dXJuCi0gKiBhIG51bWJlciBmcm9tIDA6MTUgaW5jbHVzaXZlLgotICoKLSAqIENhc2UgaXMgbm90IGltcG9ydGFudCBpbiBhIG5hbWUuCi0gKgotICogUmVnaXN0ZXIgbmFtZXMgdW5kZXJzdG9vZCBhcmU6Ci0gKgotICoJUjAKLSAqCVIxCi0gKglSMgotICoJUjMKLSAqCVI0Ci0gKglSNQotICoJUjYKLSAqIAlSNwotICoJUjgKLSAqCVI5Ci0gKglSMTAKLSAqCVIxMQotICoJUjEyCUFQCi0gKglSMTMJRlAKLSAqCVIxNAlTUAotICoJUjE1CVBDCi0gKgotICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBBUCAoMTIpCi0jZGVmaW5lIEZQICgxMykKLSNkZWZpbmUgU1AgKDE0KQotI2RlZmluZSBQQyAoMTUpCi0MCi1pbnQJCQkJLyogcmV0dXJuIC0xIG9yIDA6MTUgKi8KLXZheF9yZWdfcGFyc2UgKGMxLCBjMiwgYzMpCS8qIDMgY2hhcnMgb2YgcmVnaXN0ZXIgbmFtZSAqLwotICAgICBjaGFyIGMxLCBjMiwgYzM7CQkvKiBjMyA9PSAwIGlmIDItY2hhcmFjdGVyIHJlZyBuYW1lICovCi17Ci0gIGludCByZXR2YWw7CQkvKiByZXR1cm4gLTE6MTUgKi8KLQotICByZXR2YWwgPSAtMTsKLQotICBpZiAoaXN1cHBlciAoYzEpKQotICAgIGMxID0gdG9sb3dlciAoYzEpOwotICBpZiAoaXN1cHBlciAoYzIpKQotICAgIGMyID0gdG9sb3dlciAoYzIpOwotICBpZiAoaXNkaWdpdCAoYzIpICYmIGMxID09ICdyJykKLSAgICB7Ci0gICAgICByZXR2YWwgPSBjMiAtICcwJzsKLSAgICAgIGlmIChpc2RpZ2l0IChjMykpCi0JewotCSAgcmV0dmFsID0gcmV0dmFsICogMTAgKyBjMyAtICcwJzsKLQkgIHJldHZhbCA9IChyZXR2YWwgPiAxNSkgPyAtMSA6IHJldHZhbDsKLQkgIC8qIGNsYW1wIHRoZSByZWdpc3RlciB2YWx1ZSB0byAxIGhleCBkaWdpdCAqLwotCX0KLSAgICAgIGVsc2UgaWYgKGMzKQotCXJldHZhbCA9IC0xOwkJLyogYzMgbXVzdCBiZSAnXDAnIG9yIGEgZGlnaXQgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKGMzKQkJCS8qIFRoZXJlIGFyZSBubyB0aHJlZSBsZXR0ZXIgcmVncyAqLwotICAgIHJldHZhbCA9IC0xOwotICBlbHNlIGlmIChjMiA9PSAncCcpCi0gICAgewotICAgICAgc3dpdGNoIChjMSkKLQl7Ci0JY2FzZSAncyc6Ci0JICByZXR2YWwgPSBTUDsKLQkgIGJyZWFrOwotCWNhc2UgJ2YnOgotCSAgcmV0dmFsID0gRlA7Ci0JICBicmVhazsKLQljYXNlICdhJzoKLQkgIHJldHZhbCA9IEFQOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHZhbCA9IC0xOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGMxID09ICdwJyAmJiBjMiA9PSAnYycpCi0gICAgcmV0dmFsID0gUEM7Ci0gIGVsc2UKLSAgICByZXR2YWwgPSAtMTsKLSAgcmV0dXJuIChyZXR2YWwpOwotfQotCi0vKgotICogICAgICAgICAgICAgICB2IGkgcCBfIG8gcCAoICkKLSAqCi0gKiBQYXJzZSBhIHZheCBvcGVyYW5kIGluIERFQyBhc3NlbWJsZXIgbm90YXRpb24uCi0gKiBGb3Igc3BlZWQsIGV4cGVjdCBhIHN0cmluZyBvZiB3aGl0ZXNwYWNlIHRvIGJlIHJlZHVjZWQgdG8gYSBzaW5nbGUgJyAnLgotICogVGhpcyBpcyB0aGUgY2FzZSBmb3IgR05VIEFTLCBhbmQgaXMgZWFzeSBmb3Igb3RoZXIgREVDLWNvbXBhdGlibGUKLSAqIGFzc2VtYmxlcnMuCi0gKgotICogS25vd2xlZGdlIGFib3V0IERFQyBWQVggYXNzZW1ibGVyIG9wZXJhbmQgbm90YXRpb24gbGl2ZXMgaGVyZS4KLSAqIFRoaXMgZG9lc24ndCBldmVuIGtub3cgd2hhdCBhIHJlZ2lzdGVyIG5hbWUgaXMsIGV4Y2VwdCBpdCBiZWxpZXZlcwotICogYWxsIHJlZ2lzdGVyIG5hbWVzIGFyZSAyIG9yIDMgY2hhcmFjdGVycywgYW5kIGxldHMgdmF4X3JlZ19wYXJzZSgpIHNheQotICogd2hhdCBudW1iZXIgZWFjaCBuYW1lIHJlcHJlc2VudHMuCi0gKiBJdCBkb2VzLCBob3dldmVyLCBrbm93IHRoYXQgUEMsIFNQIGV0YyBhcmUgc3BlY2lhbCByZWdpc3RlcnMgc28gaXQgY2FuCi0gKiBkZXRlY3QgYWRkcmVzc2luZyBtb2RlcyB0aGF0IGFyZSBzaWxseSBmb3IgdGhvc2UgcmVnaXN0ZXJzLgotICoKLSAqIFdoZXJlIHBvc3NpYmxlLCBpdCBkZWxpdmVycyAxIGZhdGFsIG9yIDEgd2FybmluZyBtZXNzYWdlIGlmIHRoZSBvcGVyYW5kCi0gKiBpcyBzdXNwZWN0LiBFeGFjdGx5IHdoYXQgd2UgdGVzdCBmb3IgaXMgc3RpbGwgZXZvbHZpbmcuCi0gKi8KLQotLyoKLSAqCQkgICAJQiB1IGcgcwotICoKLSAqCUFyZyBibG9jay4KLSAqCi0gKiBUaGVyZSB3ZXJlIGEgbnVtYmVyIG9mICdtaXNtYXRjaGVkIGFyZ3VtZW50IHR5cGUnIGJ1Z3MgdG8gdmlwX29wLgotICogVGhlIG1vc3QgZ2VuZXJhbCBzb2x1dGlvbiBpcyB0byB0eXBlZGVmIGVhY2ggKG9mIG1hbnkpIGFyZ3VtZW50cy4KLSAqIFdlIHVzZWQgaW5zdGVhZCBhIHR5cGVkZWYnZCBhcmd1bWVudCBibG9jay4gVGhpcyBpcyBsZXNzIG1vZHVsYXIKLSAqIHRoYW4gdXNpbmcgc2VwZXJhdGUgcmV0dXJuIHBvaW50ZXJzIGZvciBlYWNoIHJlc3VsdCwgYnV0IHJ1bnMgZmFzdGVyCi0gKiBvbiBtb3N0IGVuZ2luZXMsIGFuZCBzZWVtcyB0byBrZWVwIHByb2dyYW1tZXJzIGhhcHB5LiBJdCB3aWxsIGhhdmUKLSAqIHRvIGJlIGRvbmUgcHJvcGVybHkgaWYgd2UgZXZlciB3YW50IHRvIHVzZSB2aXBfb3AgYXMgYSBnZW5lcmFsLXB1cnBvc2UKLSAqIG1vZHVsZSAoaXQgd2FzIGRlc2lnbmVkIHRvIGJlKS4KLSAqCi0gKglHXgotICoKLSAqIERvZXNuJ3Qgc3VwcG9ydCBERUMgIkdeIiBmb3JtYXQgb3BlcmFuZHMuIFRoZXNlIGFsd2F5cyB0YWtlIDUgYnl0ZXMKLSAqIHRvIGV4cHJlc3MsIGFuZCBjb2RlIGFzIG1vZGVzIDhGIG9yIDlGLiBSZWFzb246ICJHXiIgZGVwcml2ZXMgeW91IG9mCi0gKiBvcHRpbWlzaW5nIHRvIChzYXkpIGEgIkJeIiBpZiB5b3UgYXJlIGx1Y2t5IGluIHRoZSB3YXkgeW91IGxpbmsuCi0gKiBXaGVuIHNvbWVvbmUgYnVpbGRzIGEgbGlua2VyIHNtYXJ0IGVub3VnaCB0byBjb252ZXJ0ICJHXiIgdG8gIkJeIiwgIldeIgotICogd2hlbmV2ZXIgcG9zc2libGUsIHRoZW4gd2Ugc2hvdWxkIGltcGxlbWVudCBpdC4KLSAqIElmIHRoZXJlIGlzIHNvbWUgb3RoZXIgdXNlIGZvciAiR14iLCBmZWVsIGZyZWUgdG8gY29kZSBpdCBpbiEKLSAqCi0gKgotICoJc3BlZWQKLSAqCi0gKiBJZiBJIG5lc3RlZCBpZigpcyBtb3JlLCBJIGNvdWxkIGF2b2lkIHRlc3RpbmcgKCplcnIpIHdoaWNoIHdvdWxkIHNhdmUKLSAqIHRpbWUsIHNwYWNlIGFuZCBwYWdlIGZhdWx0cy4gSSBkaWRuJ3QgbmVzdCBhbGwgdGhvc2UgaWYoKXMgZm9yIGNsYXJpdHkKLSAqIGFuZCBiZWNhdXNlIEkgdGhpbmsgdGhlIG1vZGUgdGVzdGluZyBjYW4gYmUgcmUtYXJyYW5nZWQgMXN0IHRvIHRlc3QgdGhlCi0gKiBjb21tb25lciBjb25zdHJ1Y3RzIDFzdC4gRG9lcyBhbnlib2R5IGhhdmUgc3RhdGlzdGljcyBvbiB0aGlzPwotICoKLSAqCi0gKgotICoJZXJyb3IgbWVzc2FnZXMKLSAqCi0gKiBJbiBmdXR1cmUsIHdlIHNob3VsZCBiZSBhYmxlIHRvICdjb21wb3NlJyBlcnJvciBtZXNzYWdlcyBpbiBhIHNjcmF0Y2ggYXJlYQotICogYW5kIGdpdmUgdGhlIHVzZXIgTVVDSCBtb3JlIGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2VzLiBBbHRob3VnaCB0aGlzIHRha2VzCi0gKiBhIGxpdHRsZSBtb3JlIGNvZGUgYXQgcnVuLXRpbWUsIGl0IHdpbGwgbWFrZSB0aGlzIG1vZHVsZSBtdWNoIG1vcmUgc2VsZi0KLSAqIGRvY3VtZW50aW5nLiBBcyBhbiBleGFtcGxlIG9mIHdoYXQgc3Vja3Mgbm93OiBtb3N0IGVycm9yIG1lc3NhZ2VzIGhhdmUKLSAqIGhhcmR3aXJlZCBpbnRvIHRoZW0gdGhlIERFQyBWQVggbWV0YWNoYXJhY3RlcnMgIiNeQCIgd2hpY2ggYXJlIG5vdGhpbmcgbGlrZQotICogdGhlIFVuKnggY2hhcmFjdGVycyAiJGAqIiwgdGhhdCBtb3N0IHVzZXJzIHdpbGwgZXhwZWN0IGZyb20gdGhpcyBBUy4KLSAqLwotDAotLyoKLSAqIFRoZSBpbnB1dCBpcyBhIHN0cmluZywgZW5kaW5nIHdpdGggJ1wwJy4KLSAqCi0gKiBXZSBhbHNvIHJlcXVpcmUgYSAnaGludCcgb2Ygd2hhdCBraW5kIG9mIG9wZXJhbmQgaXMgZXhwZWN0ZWQ6IHNvCi0gKiB3ZSBjYW4gcmVtaW5kIGNhbGxlciBub3QgdG8gd3JpdGUgaW50byBsaXRlcmFscyBmb3IgaW5zdGFuY2UuCi0gKgotICogVGhlIG91dHB1dCBpcyBhIHNrZWxldGFsIGluc3RydWN0aW9uLgotICoKLSAqIFRoZSBhbGdvcml0aG0gaGFzIHR3byBwYXJ0cy4KLSAqIDEuIGV4dHJhY3QgdGhlIHN5bnRhY3RpYyBmZWF0dXJlcyAocGFyc2Ugb2ZmIGFsbCB0aGUgQF4jLSgpK1tdIG1vZGUgY3J1ZCk7Ci0gKiAyLiBleHByZXNzIHRoZSBAXiMtKCkrW10gYXMgc29tZSBwYXJhbWV0ZXJzIHN1aXRlZCB0byBmdXJ0aGVyIGFuYWx5c2lzLgotICoKLSAqIDJuZCBzdGVwIGlzIHdoZXJlIHdlIGRldGVjdCB0aGUgZ29vZ2xlcyBvZiBwb3NzaWJsZSBpbnZhbGlkIGNvbWJpbmF0aW9ucwotICogYSBodW1hbiAob3IgY29tcGlsZXIpIG1pZ2h0IHdyaXRlLiBOb3RlIHRoYXQgaWYgd2UgZG8gYSBoYWxmLXdheQotICogZGVjZW50IGFzc2VtYmxlciwgd2UgZG9uJ3Qga25vdyBob3cgbG9uZyB0byBtYWtlIChlZykgZGlzcGxhY2VtZW50Ci0gKiBmaWVsZHMgd2hlbiB3ZSBmaXJzdCBtZWV0IHRoZW0gKGJlY2F1c2UgdGhleSBtYXkgbm90IGhhdmUgZGVmaW5lZCB2YWx1ZXMpLgotICogU28gd2UgbXVzdCB3YWl0IHVudGlsIHdlIGtub3cgaG93IG1hbnkgYml0cyBhcmUgbmVlZGVkIGZvciBlYWNoIGFkZHJlc3MsCi0gKiB0aGVuIHdlIGNhbiBrbm93IGJvdGggbGVuZ3RoIGFuZCBvcGNvZGVzIG9mIGluc3RydWN0aW9ucy4KLSAqIEZvciByZWFzb24ocykgYWJvdmUsIHdlIHdpbGwgcGFzcyB0byBvdXIgY2FsbGVyIGEgJ2Jyb2tlbicgaW5zdHJ1Y3Rpb24KLSAqIG9mIHRoZXNlIG1ham9yIGNvbXBvbmVudHMsIGZyb20gd2hpY2ggb3VyIGNhbGxlciBjYW4gZ2VuZXJhdGUgaW5zdHJ1Y3Rpb25zOgotICogIC0gIGRpc3BsYWNlbWVudCBsZW5ndGggICAgICBJXiBTXiBMXiBCXiBXXiB1bnNwZWNpZmllZAotICogIC0gIG1vZGUgICAgICAgICAgICAgICAgICAgICAobWFueSkKLSAqICAtICByZWdpc3RlciAgICAgICAgICAgICAgICAgUjAtUjE1IG9yIGFic2VudAotICogIC0gIGluZGV4IHJlZ2lzdGVyICAgICAgICAgICBSMC1SMTUgb3IgYWJzZW50Ci0gKiAgLSAgZXhwcmVzc2lvbiB0ZXh0ICAgICAgICAgIHdoYXQgd2UgZG9uJ3QgcGFyc2UKLSAqICAtICBlcnJvciB0ZXh0KHMpICAgICAgICAgICAgd2h5IHdlIGNvdWxkbid0IHVuZGVyc3RhbmQgdGhlIG9wZXJhbmQKLSAqLwotCi0vKgotICogVG8gZGVjb2RlIG91dHB1dCBvZiB0aGlzLCB0ZXN0IGVycnR4dC4gSWYgZXJydHh0WzBdID09ICdcMCcsIHRoZW4KLSAqIHdlIGhhZCBubyBlcnJvcnMgdGhhdCBwcmV2ZW50ZWQgcGFyc2luZy4gQWxzbywgaWYgd2UgZXZlciByZXBvcnQKLSAqIGFuIGludGVybmFsIGJ1ZywgZXJydHh0WzBdIGlzIHNldCBub24temVyby4gU28gb25lIHRlc3QgdGVsbHMgeW91Ci0gKiBpZiB0aGUgb3RoZXIgb3V0cHV0cyBhcmUgdG8gYmUgdGFrZW4gc2VyaW91c2x5LgotICovCi0KLQotLyoKLSAqIEJlY2F1c2UgdGhpcyBtb2R1bGUgaXMgdXNlZnVsIGZvciBib3RoIFZNUyBhbmQgVU4qWCBzdHlsZSBhc3NlbWJsZXJzCi0gKiBhbmQgYmVjYXVzZSBvZiB0aGUgdmFyaWV0eSBvZiBVTipYIGFzc2VtYmxlcnMgd2UgbXVzdCByZWNvZ25pc2UKLSAqIHRoZSBkaWZmZXJlbnQgY29udmVudGlvbnMgZm9yIGFzc2VtYmxlciBvcGVyYW5kIG5vdGF0aW9uLiBGb3IgZXhhbXBsZQotICogVk1TIHNheXMgIiM0MiIgZm9yIGltbWVkaWF0ZSBtb2RlLCB3aGlsZSBtb3N0IFVOKlggc2F5ICIkNDIiLgotICogV2UgcGVybWl0IGFyYml0cmFyeSBzZXRzIG9mIChzaW5nbGUpIGNoYXJhY3RlcnMgdG8gcmVwcmVzZW50IHRoZQotICogMyBjb25jZXB0cyB0aGF0IERFQyB3cml0ZXMgJyMnLCAnQCcsICdeJy4KLSAqLwotCi0vKiBjaGFyYWN0ZXIgdGVzdHMgKi8KLSNkZWZpbmUgVklQX0lNTUVESUFURSAwMQkvKiBDaGFyYWN0ZXIgaXMgbGlrZSBERUMgIyAqLwotI2RlZmluZSBWSVBfSU5ESVJFQ1QgIDAyCS8qIENoYXIgaXMgbGlrZSBERUMgQCAqLwotI2RlZmluZSBWSVBfRElTUExFTiAgIDA0CS8qIENoYXIgaXMgbGlrZSBERUMgXiAqLwotCi0jZGVmaW5lIElNTUVESUFURVAoYykJKHZpcF9tZXRhY2hhcmFjdGVycyBbKGMpJjB4ZmZdJlZJUF9JTU1FRElBVEUpCi0jZGVmaW5lIElORElSRUNUUChjKQkodmlwX21ldGFjaGFyYWN0ZXJzIFsoYykmMHhmZl0mVklQX0lORElSRUNUKQotI2RlZmluZSBESVNQTEVOUChjKQkodmlwX21ldGFjaGFyYWN0ZXJzIFsoYykmMHhmZl0mVklQX0RJU1BMRU4pCi0KLS8qIFdlIGFzc3VtZSA4IGJpdHMgcGVyIGJ5dGUuIFVzZSB2aXBfb3BfZGVmYXVsdHMoKSB0byBzZXQgdGhlc2UgdXAgQkVGT1JFIHdlCi0gKiBhcmUgZXZlciBjYWxsZWQuCi0gKi8KLQotI2lmIGRlZmluZWQoQ09OU1RfVEFCTEUpCi0jZGVmaW5lIF8gMCwKLSNkZWZpbmUgSSBWSVBfSU1NRURJQVRFLAotI2RlZmluZSBTIFZJUF9JTkRJUkVDVCwKLSNkZWZpbmUgRCBWSVBfRElTUExFTiwKLXN0YXRpYyBjb25zdCBjaGFyCi12aXBfbWV0YWNoYXJhY3RlcnNbMjU2XSA9Ci17Ci0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8JLyogXkAgXkEgXkIgXkMgXkQgXkUgXkYgXkcgXkggXkkgXkogXksgXkwgXk0gXk4gXk8qLwotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCS8qIF5QIF5RIF5SIF5TIF5UIF5VIF5WIF5XIF5YIF5ZIF5aIF5bIF5cIF5dIF5eIF5fICovCi0gIF8gXyBfIF8gSSBfIF8gXyBfIF8gUyBfIF8gXyBfIF8JLyogc3AgISAgIiAgIyAgJCAgJSAgJiAnICAoICApICAqICArICAsICAtICAuICAvICovCi0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8JLyowICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5ICA6ICA7ICA8ICA9ICA+ICA/Ki8KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwkvKkAgIEEgIEIgIEMgIEQgIEUgIEYgIEcgIEggIEkgIEogIEsgIEwgIE0gIE4gIE8qLwotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCS8qUCAgUSAgUiAgUyAgVCAgVSAgViAgVyAgWCAgWSAgWiAgWyAgXCAgXSAgXiAgXyovCi0gIEQgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8JLypgICBhICBiICBjICBkICBlICBmICBnICBoICBpICBqICBrICBsICBtICBuICBvKi8KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwkvKnAgIHEgIHIgIHMgIHQgIHUgIHYgIHcgIHggIHkgIHogIHsgIHwgIH0gIH4gIF4/Ki8KLQotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCi0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCi0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCi0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8KLX07Ci0jdW5kZWYgXwotI3VuZGVmIEkKLSN1bmRlZiBTCi0jdW5kZWYgRAotI2Vsc2UKLXN0YXRpYyBjaGFyIHZpcF9tZXRhY2hhcmFjdGVyc1syNTZdOwotCi1zdGF0aWMgdm9pZAotdmlwX29wXzEgKGJpdCwgc3ltcykKLSAgICAgaW50IGJpdDsKLSAgICAgY29uc3QgY2hhciAqc3ltczsKLXsKLSAgdW5zaWduZWQgY2hhciB0OwotCi0gIHdoaWxlICgodCA9ICpzeW1zKyspICE9IDApCi0gICAgdmlwX21ldGFjaGFyYWN0ZXJzW3RdIHw9IGJpdDsKLX0KLQotLyogQ2FuIGJlIGNhbGxlZCBhbnkgdGltZS4gIE1vcmUgYXJndW1lbnRzIG1heSBhcHBlYXIgaW4gZnV0dXJlLiAgKi8KLXN0YXRpYyB2b2lkIAotdmlwX29wX2RlZmF1bHRzIChpbW1lZGlhdGUsIGluZGlyZWN0LCBkaXNwbGVuKQotICAgICBjb25zdCBjaGFyICppbW1lZGlhdGU7Ci0gICAgIGNvbnN0IGNoYXIgKmluZGlyZWN0OwotICAgICBjb25zdCBjaGFyICpkaXNwbGVuOwotewotICB2aXBfb3BfMSAoVklQX0lNTUVESUFURSwgaW1tZWRpYXRlKTsKLSAgdmlwX29wXzEgKFZJUF9JTkRJUkVDVCwgaW5kaXJlY3QpOwotICB2aXBfb3BfMSAoVklQX0RJU1BMRU4sIGRpc3BsZW4pOwotfQotCi0jZW5kaWYKLQwKLQotLyoKLSAqIERlYyBkZWZpbmVzIHRoZSBzZW1hbnRpY3Mgb2YgYWRkcmVzcyBtb2RlcyAoYW5kIHZhbHVlcykKLSAqIGJ5IGEgdHdvLWxldHRlciBjb2RlLCBleHBsYWluZWQgaGVyZS4KLSAqCi0gKiAgIGxldHRlciAxOiAgIGFjY2VzcyB0eXBlCi0gKgotICogICAgIGEgICAgICAgICBhZGRyZXNzIGNhbGN1bGF0aW9uIC0gbm8gZGF0YSBhY2Nlc3MsIHJlZ2lzdGVycyBmb3JiaWRkZW4KLSAqICAgICBiICAgICAgICAgYnJhbmNoIGRpc3BsYWNlbWVudAotICogICAgIG0gICAgICAgICByZWFkIC0gbGV0IGdvIG9mIGJ1cyAtIHdyaXRlIGJhY2sgICAgIm1vZGlmeSIKLSAqICAgICByICAgICAgICAgcmVhZAotICogICAgIHYgICAgICAgICBiaXQgZmllbGQgYWRkcmVzczogbGlrZSAnYScgYnV0IHJlZ2lzdGVycyBhcmUgT0sKLSAqICAgICB3ICAgICAgICAgd3JpdGUKLSAqICAgICBzcGFjZQkgbm8gb3BlcmF0b3IgKGVnICIubG9uZyBmb28iKSBbb3VyIGNvbnZlbnRpb25dCi0gKgotICogICBsZXR0ZXIgMjogICBkYXRhIHR5cGUgKGkuZS4gd2lkdGgsIGFsaWdubWVudCkKLSAqCi0gKiAgICAgYiAgICAgICAgIGJ5dGUKLSAqICAgICBkICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCAoRCBmb3JtYXQpCi0gKiAgICAgZiAgICAgICAgIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgKEYgZm9ybWF0KQotICogICAgIGcgICAgICAgICBHIGZvcm1hdCBmbG9hdGluZwotICogICAgIGggICAgICAgICBIIGZvcm1hdCBmbG9hdGluZwotICogICAgIGwgICAgICAgICBsb25nd29yZAotICogICAgIG8gICAgICAgICBvY3Rhd29yZAotICogICAgIHEgICAgICAgICBxdWFkd29yZAotICogICAgIHcgICAgICAgICB3b3JkCi0gKiAgICAgPwkgc2ltcGxlIHN5bnRoZXRpYyBicmFuY2ggb3BlcmFuZAotICogICAgIC0JIHVuY29uZGl0aW9uYWwgc3ludGhldGljIEpTQi9KU1Igb3BlcmFuZAotICogICAgICEJIGNvbXBsZXggc3ludGhldGljIGJyYW5jaCBvcGVyYW5kCi0gKgotICogVGhlICctPyEnIGxldHRlciAyJ3MgYXJlIG5vdCBmb3IgZXh0ZXJuYWwgY29uc3VtcHRpb24uIFRoZXkgYXJlIHVzZWQKLSAqIGZvciB2YXJpb3VzIGFzc2VtYmxlcnMuIEdlbmVyYWxseSwgYWxsIHVua25vd24gd2lkdGhzIGFyZSBhc3N1bWVkIDAuCi0gKiBXZSBkb24ndCBsaW1pdCB5b3VyIGNob2ljZSBvZiB3aWR0aCBjaGFyYWN0ZXIuCi0gKgotICogREVDIG9wZXJhbmRzIGFyZSBoYXJkIHdvcmsgdG8gcGFyc2UuIEZvciBleGFtcGxlLCAnQCcgYXMgdGhlIGZpcnN0Ci0gKiBjaGFyYWN0ZXIgbWVhbnMgaW5kaXJlY3QgKGRlZmVycmVkKSBtb2RlIGJ1dCBlbHN3aGVyZSBpdCBpcyBhIHNoaWZ0Ci0gKiBvcGVyYXRvci4KLSAqIFRoZSBsb25nLXdpbmRlZCBleHBsYW5hdGlvbiBvZiBob3cgdGhpcyBpcyBzdXBwb3NlZCB0byB3b3JrIGlzCi0gKiBjYW5jZWxsZWQuIFJlYWQgYSBERUMgdmF4IG1hbnVhbC4KLSAqIFdlIHRyeSBoYXJkIG5vdCB0byBwYXJzZSBhbnl0aGluZyB0aGF0IE1JR0hUIGJlIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24KLSAqIGJ1cmllZCBpbiB0aGF0IHN5bnRheC4gRm9yIGV4YW1wbGUgaWYgd2Ugc2VlIEAuLi4oUm4pIHdlIGRvbid0IGNoZWNrCi0gKiBmb3IgJy0nIGJlZm9yZSB0aGUgJygnIGJlY2F1c2UgbW9kZSBALShSbikgZG9lcyBub3QgZXhpc3QuCi0gKgotICogQWZ0ZXIgcGFyc2luZyB3ZSBoYXZlOgotICoKLSAqIGF0ICAgICAgICAgICAgICAgICAgICAgMSBpZiBsZWFkaW5nICdAJyAob3IgVW4qeCAnKicpCi0gKiBsZW4gICAgICAgICAgICAgICAgICAgIHRha2VzIG9uZSB2YWx1ZSBmcm9tICIgYmlsc3ciLiBlZyBCXiAtPiAnYicuCi0gKiBoYXNoICAgICAgICAgICAgICAgICAgIDEgaWYgbGVhZGluZyAnIycgKG9yIFVuKnggJyQnKQotICogZXhwcl9iZWdpbiwgZXhwcl9lbmQgICB0aGUgZXhwcmVzc2lvbiB3ZSBkaWQgbm90IHBhcnNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW4gdGhvdWdoIHdlIGRvbid0IGludGVycHJldCBpdCwgd2UgbWFrZSB1c2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgb2YgaXRzIHByZXNlbmNlIG9yIGFic2VuY2UuCi0gKiBzaWduICAgICAgICAgICAgICAgICAgIC0xOiAtKFJuKSAgICAwOiBhYnNlbnQgICAgKzE6IChSbikrCi0gKiBwYXJlbiAgICAgICAgICAgICAgICAgIDEgaWYgKCkgYXJlIGFyb3VuZCByZWdpc3RlcgotICogcmVnICAgICAgICAgICAgICAgICAgICBtYWpvciByZWdpc3RlciBudW1iZXIgMDoxNSAgICAtMSBtZWFucyBhYnNlbnQKLSAqIG5keCAgICAgICAgICAgICAgICAgICAgaW5kZXggcmVnaXN0ZXIgbnVtYmVyIDA6MTUgICAgLTEgbWVhbnMgYWJzZW50Ci0gKgotICogQWdhaW4sIEkgZGFyZSBub3QgZXhwbGFpbiBpdDoganVzdCB0cmFjZSBBTEwgdGhlIGNvZGUhCi0gKi8KLQwKLXN0YXRpYyB2b2lkCi12aXBfb3AgKG9wdGV4dCwgdm9wUCkKLSAgICAgLyogdXNlcidzIGlucHV0IHN0cmluZyBlLmcuOiAiQEJeZm9vQGJhcihBUClbRlBdOiIgKi8KLSAgICAgY2hhciAqb3B0ZXh0OwotICAgICAvKiBJbnB1dCBmaWVsZHM6IHZvcF9hY2Nlc3MsIHZvcF93aWR0aC4KLQlPdXRwdXQgZmllbGRzOiBfbmR4LCBfcmVnLCBfbW9kZSwgX3Nob3J0LCBfd2FybiwKLQlfZXJyb3IgX2V4cHJfYmVnaW4sIF9leHByX2VuZCwgX25ieXRlcy4KLQl2b3BfbmJ5dGVzIDogbnVtYmVyIG9mIGJ5dGVzIGluIGEgZGF0dW0uICovCi0gICAgIHN0cnVjdCB2b3AgKnZvcFA7Ci17Ci0gIC8qIHRyYWNrIG9wZXJhbmQgdGV4dCBmb3J3YXJkICovCi0gIGNoYXIgKnA7Ci0gIC8qIHRyYWNrIG9wZXJhbmQgdGV4dCBiYWNrd2FyZCAqLwotICBjaGFyICpxOwotICAvKiAxIGlmIGxlYWRpbmcgJ0AnICgnKicpIHNlZW4gKi8KLSAgaW50IGF0OwotICAvKiBvbmUgb2YgIiBiaWxzdyIgKi8KLSAgY2hhciBsZW47Ci0gIC8qIDEgaWYgbGVhZGluZyAnIycgKCckJykgc2VlbiAqLwotICBpbnQgaGFzaDsKLSAgLyogLTEsIDAgb3IgKzEgKi8KLSAgaW50IHNpZ24gPSAwOwotICAvKiAxIGlmICgpIHN1cnJvdW5kIHJlZ2lzdGVyICovCi0gIGludCBwYXJlbiA9IDA7Ci0gIC8qIHJlZ2lzdGVyIG51bWJlciwgLTE6YWJzZW50ICovCi0gIGludCByZWcgPSAwOwotICAvKiBpbmRleCByZWdpc3RlciBudW1iZXIgLTE6YWJzZW50ICovCi0gIGludCBuZHggPSAwOwotICAvKiByZXBvcnQgaWxsZWdhbCBvcGVyYW5kLCAiIj09T0sgKi8KLSAgLyogIiAiIGlzIGEgRkFLRSBlcnJvcjogbWVhbnMgd2Ugd29uICovCi0gIC8qIEFOWSBlcnIgdGhhdCBiZWdpbnMgd2l0aCAnICcgaXMgYSBmYWtlLiAqLwotICAvKiAiICIgaXMgY29udmVydGVkIHRvICIiIGJlZm9yZSByZXR1cm4gKi8KLSAgY29uc3QgY2hhciAqZXJyOwotICAvKiB3YXJuIGFib3V0IHdlaXJkIG1vZGVzIHBmIGFkZHJlc3MgKi8KLSAgY29uc3QgY2hhciAqd3JuOwotICAvKiBwcmVzZXJ2ZSBxIGluIGNhc2Ugd2UgYmFja3VwICovCi0gIGNoYXIgKm9sZHEgPSBOVUxMOwotICAvKiBidWlsZCB1cCA0LWJpdCBvcGVyYW5kIG1vZGUgaGVyZSAqLwotICAvKiBub3RlOiBpbmRleCBtb2RlIGlzIGluIG5keCwgdGhpcyBpcyAqLwotICAvKiB0aGUgbWFqb3IgbW9kZSBvZiBvcGVyYW5kIGFkZHJlc3MgKi8KLSAgaW50IG1vZGUgPSAwOwotICAvKgotICAgKiBOb3RpY2UgaG93IHdlIG1vdmUgd3JvbmctYXJnLXR5cGUgYnVncyBJTlNJREUgdGhpcyBtb2R1bGU6IGlmIHdlCi0gICAqIGdldCB0aGUgdHlwZXMgd3JvbmcgYmVsb3csIHdlIGxvc2UgYXQgY29tcGlsZSB0aW1lIHJhdGhlciB0aGFuIGF0Ci0gICAqIGxpbnQgb3IgcnVuIHRpbWUuCi0gICAqLwotICBjaGFyIGFjY2Vzc19tb2RlOwkJLyogdm9wX2FjY2Vzcy4gKi8KLSAgY2hhciB3aWR0aDsJCQkvKiB2b3Bfd2lkdGguICovCi0KLSAgYWNjZXNzX21vZGUgPSB2b3BQLT52b3BfYWNjZXNzOwotICB3aWR0aCA9IHZvcFAtPnZvcF93aWR0aDsKLSAgLyogTm9uZSBvZiBvdXIgY29kZSBidWdzICh5ZXQpLCBubyB1c2VyIHRleHQgZXJyb3JzLCBubyB3YXJuaW5ncwotICAgICBldmVuLiAgKi8KLSAgZXJyID0gd3JuID0gMDsKLQotICBwID0gb3B0ZXh0OwotCi0gIGlmICgqcCA9PSAnICcpCQkvKiBFeHBlY3QgYWxsIHdoaXRlc3BhY2UgcmVkdWNlZCB0byAnICcuICovCi0gICAgcCsrOwkJCS8qIHNraXAgb3ZlciB3aGl0ZXNwYWNlICovCi0KLSAgaWYgKChhdCA9IElORElSRUNUUCAoKnApKSAhPSAwKQotICAgIHsJCQkJLyogMSBpZiAqcD09J0AnKG9yICcqJyBmb3IgVW4qeCkgKi8KLSAgICAgIHArKzsJCQkvKiBhdCBpcyBkZXRlcm1pbmVkICovCi0gICAgICBpZiAoKnAgPT0gJyAnKQkJLyogRXhwZWN0IGFsbCB3aGl0ZXNwYWNlIHJlZHVjZWQgdG8gJyAnLiAqLwotCXArKzsJCQkvKiBza2lwIG92ZXIgd2hpdGVzcGFjZSAqLwotICAgIH0KLQotICAvKgotICAgKiBUaGlzIGNvZGUgaXMgc3VidGxlLiBJdCB0cmllcyB0byBkZXRlY3QgYWxsIGxlZ2FsIChsZXR0ZXIpJ14nCi0gICAqIGJ1dCBpdCBkb2Vzbid0IHdhc3RlIHRpbWUgZXhwbGljaXRseSB0ZXN0aW5nIGZvciBwcmVtYXR1cmUgJ1wwJyBiZWNhdXNlCi0gICAqIHRoaXMgY2FzZSBpcyByZWplY3RlZCBhcyBhIG1pc21hdGNoIGFnYWluc3QgZWl0aGVyIChsZXR0ZXIpIG9yICdeJy4KLSAgICovCi0gIHsKLSAgICBjaGFyIGM7Ci0KLSAgICBjID0gKnA7Ci0gICAgaWYgKGlzdXBwZXIgKGMpKQotICAgICAgYyA9IHRvbG93ZXIgKGMpOwotICAgIGlmIChESVNQTEVOUCAocFsxXSkgJiYgc3RyY2hyICgiYmlsd3MiLCBsZW4gPSBjKSkKLSAgICAgIHAgKz0gMjsJCQkvKiBza2lwIChsZXR0ZXIpICdeJyAqLwotICAgIGVsc2UJCQkvKiBubyAobGV0dGVyKSAnXicgc2VlbiAqLwotICAgICAgbGVuID0gJyAnOwkJLyogbGVuIGlzIGRldGVybWluZWQgKi8KLSAgfQotCi0gIGlmICgqcCA9PSAnICcpCQkvKiBFeHBlY3QgYWxsIHdoaXRlc3BhY2UgcmVkdWNlZCB0byAnICcuICovCi0gICAgcCsrOwkJCS8qIHNraXAgb3ZlciB3aGl0ZXNwYWNlICovCi0KLSAgaWYgKChoYXNoID0gSU1NRURJQVRFUCAoKnApKSAhPSAwKQkvKiAxIGlmICpwPT0nIycgKCckJyBmb3IgVW4qeCkgKi8KLSAgICBwKys7CQkJLyogaGFzaCBpcyBkZXRlcm1pbmVkICovCi0KLSAgLyoKLSAgICogcCBwb2ludHMgdG8gd2hhdCBtYXkgYmUgdGhlIGJlZ2lubmluZyBvZiBhbiBleHByZXNzaW9uLgotICAgKiBXZSBoYXZlIHBlZWxlZCBvZmYgdGhlIGZyb250IGFsbCB0aGF0IGlzIHBlZWxhYmxlLgotICAgKiBXZSBrbm93IGF0LCBsZW4sIGhhc2guCi0gICAqCi0gICAqIExldHMgcG9pbnQgcSBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0IGFuZCBwYXJzZSB0aGF0IChiYWNrd2FyZHMpLgotICAgKi8KLQotICBmb3IgKHEgPSBwOyAqcTsgcSsrKQotICAgIDsKLSAgcS0tOwkJCQkvKiBub3cgcSBwb2ludHMgYXQgbGFzdCBjaGFyIG9mIHRleHQgKi8KLQwKLSAgaWYgKCpxID09ICcgJyAmJiBxID49IHApCS8qIEV4cGVjdCBhbGwgd2hpdGVzcGFjZSByZWR1Y2VkIHRvICcgJy4gKi8KLSAgICBxLS07Ci0gIC8qIHJldmVyc2Ugb3ZlciB3aGl0ZXNwYWNlLCBidXQgZG9uJ3QgKi8KLSAgLyogcnVuIGJhY2sgb3ZlciAqcCAqLwotCi0gIC8qCi0gICAqIEFzIGEgbWF0dGVyIG9mIHBvbGljeSBoZXJlLCB3ZSBsb29rIGZvciBbUm5dLCBhbHRob3VnaCBib3RoIFJuIGFuZCBTXiMKLSAgICogZm9yYmlkIFtSbl0uIFRoaXMgaXMgYmVjYXVzZSBpdCBpcyBlYXN5LCBhbmQgYmVjYXVzZSBvbmx5IGEgc2ljawotICAgKiBjeWJvcmcgd291bGQgaGF2ZSBbLi4uXSB0cmFpbGluZyBhbiBleHByZXNzaW9uIGluIGEgVkFYLWxpa2UgYXNzZW1ibGVyLgotICAgKiBBIG1ldGljdWxvdXMgcGFyc2VyIHdvdWxkIGZpcnN0IGNoZWNrIGZvciBSbiBmb2xsb3dlZCBieSAnKCcgb3IgJ1snCi0gICAqIGFuZCBub3QgcGFyc2UgYSB0cmFpbGluZyAnXScgaWYgaXQgZm91bmQgYW5vdGhlci4gV2UganVzdCBiYW4gZXhwcmVzc2lvbnMKLSAgICogZW5kaW5nIGluICddJy4KLSAgICovCi0gIGlmICgqcSA9PSAnXScpCi0gICAgewotICAgICAgd2hpbGUgKHEgPj0gcCAmJiAqcSAhPSAnWycpCi0JcS0tOwotICAgICAgLyogZWl0aGVyIHE8cCBvciB3ZSBnb3QgbWF0Y2hpbmcgJ1snICovCi0gICAgICBpZiAocSA8IHApCi0JZXJyID0gXygibm8gJ1snIHRvIG1hdGNoICddJyIpOwotICAgICAgZWxzZQotCXsKLQkgIC8qCi0JICAgKiBDb25mdXNlcnMgbGlrZSAiW10iIHdpbGwgZXZlbnR1YWxseSBsb3NlIHdpdGggYSBiYWQgcmVnaXN0ZXIKLQkgICAqIG5hbWUgZXJyb3IuIFNvIGFnYWluIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGVhcmx5ICdcMCcuCi0JICAgKi8KLQkgIGlmIChxWzNdID09ICddJykKLQkgICAgbmR4ID0gdmF4X3JlZ19wYXJzZSAocVsxXSwgcVsyXSwgMCk7Ci0JICBlbHNlIGlmIChxWzRdID09ICddJykKLQkgICAgbmR4ID0gdmF4X3JlZ19wYXJzZSAocVsxXSwgcVsyXSwgcVszXSk7Ci0JICBlbHNlCi0JICAgIG5keCA9IC0xOwotCSAgLyoKLQkgICAqIFNpbmNlIHdlIHNhdyBhICddJyB3ZSB3aWxsIGRlbWFuZCBhIHJlZ2lzdGVyIG5hbWUgaW4gdGhlIFtdLgotCSAgICogSWYgbHVzZXIgaGFzbid0IGdpdmVuIHVzIG9uZTogYmUgcnVkZS4KLQkgICAqLwotCSAgaWYgKG5keCA8IDApCi0JICAgIGVyciA9IF8oImJhZCByZWdpc3RlciBpbiBbXSIpOwotCSAgZWxzZSBpZiAobmR4ID09IFBDKQotCSAgICBlcnIgPSBfKCJbUENdIGluZGV4IGJhbm5lZCIpOwotCSAgZWxzZQotCSAgICBxLS07CQkvKiBwb2ludCBxIGp1c3QgYmVmb3JlICJbLi4uXSIgKi8KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgbmR4ID0gLTE7CQkJLyogbm8gJ10nLCBzbyBubyBpTkRlWCByZWdpc3RlciAqLwotCi0gIC8qCi0gICAqIElmIGVyciA9ICIuLi4iIHRoZW4gd2UgbG9zdDogcnVuIGF3YXkuCi0gICAqIE90aGVyd2lzZSBuZHggPT0gLTEgaWYgdGhlcmUgd2FzIG5vICJbLi4uXSIuCi0gICAqIE90aGVyd2lzZSwgbmR4IGlzIGluZGV4IHJlZ2lzdGVyIG51bWJlciwgYW5kIHEgcG9pbnRzIGJlZm9yZSAiWy4uLl0iLgotICAgKi8KLQwKLSAgaWYgKCpxID09ICcgJyAmJiBxID49IHApCS8qIEV4cGVjdCBhbGwgd2hpdGVzcGFjZSByZWR1Y2VkIHRvICcgJy4gKi8KLSAgICBxLS07Ci0gIC8qIHJldmVyc2Ugb3ZlciB3aGl0ZXNwYWNlLCBidXQgZG9uJ3QgKi8KLSAgLyogcnVuIGJhY2sgb3ZlciAqcCAqLwotICBpZiAoIWVyciB8fCAhKmVycikKLSAgICB7Ci0gICAgICBzaWduID0gMDsJCQkvKiBubyAoKSsgb3IgLSgpIHNlZW4geWV0ICovCi0KLSAgICAgIGlmIChxID4gcCArIDMgJiYgKnEgPT0gJysnICYmIHFbLTFdID09ICcpJykKLQl7Ci0JICBzaWduID0gMTsJCS8qIHdlIHNhdyBhICIpKyIgKi8KLQkgIHEtLTsJCQkvKiBxIHBvaW50cyB0byAnKScgKi8KLQl9Ci0KLSAgICAgIGlmICgqcSA9PSAnKScgJiYgcSA+IHAgKyAyKQotCXsKLQkgIHBhcmVuID0gMTsJCS8qIGFzc3VtZSB3ZSBoYXZlICIoLi4uKSIgKi8KLQkgIHdoaWxlIChxID49IHAgJiYgKnEgIT0gJygnKQotCSAgICBxLS07Ci0JICAvKiBlaXRoZXIgcTxwIG9yIHdlIGdvdCBtYXRjaGluZyAnKCcgKi8KLQkgIGlmIChxIDwgcCkKLQkgICAgZXJyID0gXygibm8gJygnIHRvIG1hdGNoICcpJyIpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBDb25mdXNlcnMgbGlrZSAiKCkiIHdpbGwgZXZlbnR1YWxseSBsb3NlIHdpdGggYSBiYWQgcmVnaXN0ZXIKLQkgICAgICAgKiBuYW1lIGVycm9yLiBTbyBhZ2FpbiB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBlYXJseSAnXDAnLgotCSAgICAgICAqLwotCSAgICAgIGlmIChxWzNdID09ICcpJykKLQkJcmVnID0gdmF4X3JlZ19wYXJzZSAocVsxXSwgcVsyXSwgMCk7Ci0JICAgICAgZWxzZSBpZiAocVs0XSA9PSAnKScpCi0JCXJlZyA9IHZheF9yZWdfcGFyc2UgKHFbMV0sIHFbMl0sIHFbM10pOwotCSAgICAgIGVsc2UKLQkJcmVnID0gLTE7Ci0JICAgICAgLyoKLQkgICAgICAgKiBTaW5jZSB3ZSBzYXcgYSAnKScgd2Ugd2lsbCBkZW1hbmQgYSByZWdpc3RlciBuYW1lIGluIHRoZSAnKScuCi0JICAgICAgICogVGhpcyBpcyBuYXN0eTogd2h5IGNhbid0IG91ciBoeXBvdGhldGljYWwgYXNzZW1ibGVyIHBlcm1pdAotCSAgICAgICAqIHBhcmVudGhlc2lzZWQgZXhwcmVzc2lvbnM/IEJFQ0FVU0UgSSBBTSBMQVpZISBUaGF0IGlzIHdoeS4KLQkgICAgICAgKiBBYnVzZSBsdXNlciBpZiB3ZSBkaWRuJ3Qgc3B5IGEgcmVnaXN0ZXIgbmFtZS4KLQkgICAgICAgKi8KLQkgICAgICBpZiAocmVnIDwgMCkKLQkJewotCQkgIC8qIEpGIGFsbG93IHBhcmVudGhhc2l6ZWQgZXhwcmVzc2lvbnMuICBJIGhvcGUgdGhpcyB3b3JrcyAqLwotCQkgIHBhcmVuID0gMDsKLQkJICB3aGlsZSAoKnEgIT0gJyknKQotCQkgICAgcSsrOwotCQkgIC8qIGVyciA9ICJ1bmtub3duIHJlZ2lzdGVyIGluICgpIjsgKi8KLQkJfQotCSAgICAgIGVsc2UKLQkJcS0tOwkJLyogcG9pbnQganVzdCBiZWZvcmUgJygnIG9mICIoLi4uKSIgKi8KLQkgICAgICAvKgotCSAgICAgICAqIElmIGVyciA9PSAiLi4uIiB0aGVuIHdlIGxvc3QuIFJ1biBhd2F5LgotCSAgICAgICAqIE90aGVyd2lzZSBpZiByZWcgPj0gMCB0aGVuIHdlIHNhdyAoUm4pLgotCSAgICAgICAqLwotCSAgICB9Ci0JICAvKgotCSAgICogSWYgZXJyID09ICIuLi4iIHRoZW4gd2UgbG9zdC4KLQkgICAqIE90aGVyd2lzZSBwYXJlbj09MSBhbmQgcmVnID0gcmVnaXN0ZXIgaW4gIigpIi4KLQkgICAqLwotCX0KLSAgICAgIGVsc2UKLQlwYXJlbiA9IDA7Ci0gICAgICAvKgotICAgICAgICogSWYgZXJyID09ICIuLi4iIHRoZW4gd2UgbG9zdC4KLSAgICAgICAqIE90aGVyd2lzZSwgcSBwb2ludHMganVzdCBiZWZvcmUgIihSbikiLCBpZiBhbnkuCi0gICAgICAgKiBJZiB0aGVyZSB3YXMgYSAiKC4uLikiIHRoZW4gcGFyZW49PTEsIGFuZCByZWcgaXMgdGhlIHJlZ2lzdGVyLgotICAgICAgICovCi0MCi0gICAgICAvKgotICAgICAgICogV2Ugc2hvdWxkIG9ubHkgc2VlayAnLScgb2YgIi0oLi4uKSIgaWY6Ci0gICAgICAgKiAgIHdlIHNhdyAiKC4uLikiICAgICAgICAgICAgICAgICAgICBwYXJlbiA9PSAxCi0gICAgICAgKiAgIHdlIGhhdmUgbm8gZXJyb3JzIHNvIGZhciAgICAgICAgICAhICplcnIKLSAgICAgICAqICAgd2UgZGlkIG5vdCBzZWUgJysnIG9mICIoLi4uKSsiICAgIHNpZ24gPCAxCi0gICAgICAgKiBXZSBkb24ndCBjaGVjayBsZW4uIFdlIHdhbnQgYSBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIGxhdGVyIGlmCi0gICAgICAgKiB1c2VyIHRyaWVzICJ4Xi4uLi0oUm4pIi4gVGhpcyBpcyBhIGZlYXR1cmUgbm90IGEgYnVnLgotICAgICAgICovCi0gICAgICBpZiAoIWVyciB8fCAhKmVycikKLQl7Ci0JICBpZiAocGFyZW4gJiYgc2lnbiA8IDEpLyogIXNpZ24gaXMgYWRlcXVhdGUgdGVzdCAqLwotCSAgICB7Ci0JICAgICAgaWYgKCpxID09ICctJykKLQkJewotCQkgIHNpZ24gPSAtMTsKLQkJICBxLS07Ci0JCX0KLQkgICAgfQotCSAgLyoKLQkgICAqIFdlIGhhdmUgYmFjay10cmFja2VkIG92ZXIgbW9zdAotCSAgICogb2YgdGhlIGNydWQgYXQgdGhlIGVuZCBvZiBhbiBvcGVyYW5kLgotCSAgICogVW5sZXNzIGVyciwgd2Uga25vdzogc2lnbiwgcGFyZW4uIElmIHBhcmVuLCB3ZSBrbm93IHJlZy4KLQkgICAqIFRoZSBsYXN0IGNhc2UgaXMgb2YgYW4gZXhwcmVzc2lvbiAiUm4iLgotCSAgICogVGhpcyBpcyB3b3J0aCBodW50aW5nIGZvciBpZiAhZXJyLCAhcGFyZW4uCi0JICAgKiBXZSB3b3VsZG4ndCBiZSBoZXJlIGlmIGVyci4KLQkgICAqIFdlIHJlbWVtYmVyIHRvIHNhdmUgcSwgaW4gY2FzZSB3ZSBkaWRuJ3Qgd2FudCAiUm4iIGFueXdheS4KLQkgICAqLwotCSAgaWYgKCFwYXJlbikKLQkgICAgewotCSAgICAgIGlmICgqcSA9PSAnICcgJiYgcSA+PSBwKQkvKiBFeHBlY3QgYWxsIHdoaXRlc3BhY2UgcmVkdWNlZCB0byAnICcuICovCi0JCXEtLTsKLQkgICAgICAvKiByZXZlcnNlIG92ZXIgd2hpdGVzcGFjZSwgYnV0IGRvbid0ICovCi0JICAgICAgLyogcnVuIGJhY2sgb3ZlciAqcCAqLwotCSAgICAgIGlmIChxID4gcCAmJiBxIDwgcCArIDMpCS8qIHJvb20gZm9yIFJuIG9yIFJubiBleGFjdGx5PyAqLwotCQlyZWcgPSB2YXhfcmVnX3BhcnNlIChwWzBdLCBwWzFdLCBxIDwgcCArIDIgPyAwIDogcFsyXSk7Ci0JICAgICAgZWxzZQotCQlyZWcgPSAtMTsJLyogYWx3YXlzIGNvbWVzIGhlcmUgaWYgbm8gcmVnaXN0ZXIgYXQgYWxsICovCi0JICAgICAgLyoKLQkgICAgICAgKiBIZXJlIHdpdGggYSBkZWZpbml0aXZlIHJlZyB2YWx1ZS4KLQkgICAgICAgKi8KLQkgICAgICBpZiAocmVnID49IDApCi0JCXsKLQkJICBvbGRxID0gcTsKLQkJICBxID0gcCAtIDE7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIC8qCi0gICAqIGhhdmUgcmVnLiAtMTphYnNlbnQ7IGVsc2UgMDoxNQotICAgKi8KLQotICAvKgotICAgKiBXZSBoYXZlOiAgZXJyLCBhdCwgbGVuLCBoYXNoLCBuZHgsIHNpZ24sIHBhcmVuLCByZWcuCi0gICAqIEFsc28sIGFueSByZW1haW5pbmcgZXhwcmVzc2lvbiBpcyBmcm9tICpwIHRocm91Z2ggKnEgaW5jbHVzaXZlLgotICAgKiBTaG91bGQgdGhlcmUgYmUgbm8gZXhwcmVzc2lvbiwgcT09cC0xLiBTbyBleHByZXNzaW9uIGxlbmd0aCA9IHEtcCsxLgotICAgKiBUaGlzIGNvbXBsZXRlcyB0aGUgZmlyc3QgcGFydDogcGFyc2luZyB0aGUgb3BlcmFuZCB0ZXh0LgotICAgKi8KLQwKLSAgLyoKLSAgICogV2Ugbm93IHdhbnQgdG8gYm9pbCB0aGUgZGF0YSBkb3duLCBjaGVja2luZyBjb25zaXN0ZW5jeSBvbiB0aGUgd2F5LgotICAgKiBXZSB3YW50OiAgbGVuLCBtb2RlLCByZWcsIG5keCwgZXJyLCBwLCBxLCB3cm4sIGJ1Zy4KLSAgICogV2Ugd2lsbCBkZWxpdmVyIGEgNC1iaXQgcmVnLCBhbmQgYSA0LWJpdCBtb2RlLgotICAgKi8KLQotICAvKgotICAgKiBDYXNlIG9mIGJyYW5jaCBvcGVyYW5kLiBEaWZmZXJlbnQuIE5vIExeQl5XXkleU14gYWxsb3dlZCBmb3IgaW5zdGFuY2UuCi0gICAqCi0gICAqIGluOiAgYXQJPwotICAgKiAgICAgIGxlbgk/Ci0gICAqICAgICAgaGFzaAk/Ci0gICAqICAgICAgcDpxCT8KLSAgICogICAgICBzaWduICA/Ci0gICAqICAgICAgcGFyZW4JPwotICAgKiAgICAgIHJlZyAgID8KLSAgICogICAgICBuZHggICA/Ci0gICAqCi0gICAqIG91dDogbW9kZSAgMAotICAgKiAgICAgIHJlZyAgIC0xCi0gICAqICAgICAgbGVuCScgJwotICAgKiAgICAgIHA6cQl3aGF0ZXZlciB3YXMgaW5wdXQKLSAgICogICAgICBuZHgJLTEKLSAgICogICAgICBlcnIJIiAiCQkgb3IgZXJyb3IgbWVzc2FnZSwgYW5kIG90aGVyIG91dHB1dHMgdHJhc2hlZAotICAgKi8KLSAgLyogYnJhbmNoIG9wZXJhbmRzIGhhdmUgcmVzdHJpY3RlZCBmb3JtcyAqLwotICBpZiAoKCFlcnIgfHwgISplcnIpICYmIGFjY2Vzc19tb2RlID09ICdiJykKLSAgICB7Ci0gICAgICBpZiAoYXQgfHwgaGFzaCB8fCBzaWduIHx8IHBhcmVuIHx8IG5keCA+PSAwIHx8IHJlZyA+PSAwIHx8IGxlbiAhPSAnICcpCi0JZXJyID0gXygiaW52YWxpZCBicmFuY2ggb3BlcmFuZCIpOwotICAgICAgZWxzZQotCWVyciA9ICIgIjsKLSAgICB9Ci0MCi0gIC8qIFNpbmNlIG5vYm9keSBzZWVtcyB0byB1c2UgaXQ6IGNvbW1lbnQgdGhpcyAnZmVhdHVyZScoPykgb3V0IGZvciBub3cuICovCi0jaWZkZWYgTkVWRVIKLSAgLyoKLSAgICogQ2FzZSBvZiBzdGFuZC1hbG9uZSBvcGVyYW5kLiBlLmcuICIubG9uZyBmb28iCi0gICAqCi0gICAqIGluOiAgYXQJPwotICAgKiAgICAgIGxlbgk/Ci0gICAqICAgICAgaGFzaAk/Ci0gICAqICAgICAgcDpxCT8KLSAgICogICAgICBzaWduICA/Ci0gICAqICAgICAgcGFyZW4JPwotICAgKiAgICAgIHJlZyAgID8KLSAgICogICAgICBuZHggICA/Ci0gICAqCi0gICAqIG91dDogbW9kZSAgMAotICAgKiAgICAgIHJlZyAgIC0xCi0gICAqICAgICAgbGVuCScgJwotICAgKiAgICAgIHA6cQl3aGF0ZXZlciB3YXMgaW5wdXQKLSAgICogICAgICBuZHgJLTEKLSAgICogICAgICBlcnIJIiAiCQkgb3IgZXJyb3IgbWVzc2FnZSwgYW5kIG90aGVyIG91dHB1dHMgdHJhc2hlZAotICAgKi8KLSAgaWYgKCghZXJyIHx8ICEqZXJyKSAmJiBhY2Nlc3NfbW9kZSA9PSAnICcpCi0gICAgewotICAgICAgaWYgKGF0KQotCWVyciA9IF8oImFkZHJlc3MgcHJvaGliaXRzIEAiKTsKLSAgICAgIGVsc2UgaWYgKGhhc2gpCi0JZXJyID0gXygiYWRkcmVzcyBwcm9oaWJpdHMgIyIpOwotICAgICAgZWxzZSBpZiAoc2lnbikKLQl7Ci0JICBpZiAoc2lnbiA8IDApCi0JICAgIGVyciA9IF8oImFkZHJlc3MgcHJvaGliaXRzIC0oKSIpOwotCSAgZWxzZQotCSAgICBlcnIgPSBfKCJhZGRyZXNzIHByb2hpYml0cyAoKSsiKTsKLQl9Ci0gICAgICBlbHNlIGlmIChwYXJlbikKLQllcnIgPSBfKCJhZGRyZXNzIHByb2hpYml0cyAoKSIpOwotICAgICAgZWxzZSBpZiAobmR4ID49IDApCi0JZXJyID0gXygiYWRkcmVzcyBwcm9oaWJpdHMgW10iKTsKLSAgICAgIGVsc2UgaWYgKHJlZyA+PSAwKQotCWVyciA9IF8oImFkZHJlc3MgcHJvaGliaXRzIHJlZ2lzdGVyIik7Ci0gICAgICBlbHNlIGlmIChsZW4gIT0gJyAnKQotCWVyciA9IF8oImFkZHJlc3MgcHJvaGliaXRzIGRpc3BsYWNlbWVudCBsZW5ndGggc3BlY2lmaWVyIik7Ci0gICAgICBlbHNlCi0JewotCSAgZXJyID0gIiAiOwkvKiBzdWNjZWVkICovCi0JICBtb2RlID0gMDsKLQl9Ci0gICAgfQotI2VuZGlmIC8qI0lmZGVmIE5FVkVSKi8KLQwKLSAgLyoKLSAgICogQ2FzZSBvZiBTXiMuCi0gICAqCi0gICAqIGluOiAgYXQgICAgICAgMAotICAgKiAgICAgIGxlbiAgICAgICdzJyAgICAgICAgICAgICAgIGRlZmluaXRpb24KLSAgICogICAgICBoYXNoICAgICAxICAgICAgICAgICAgICBkZW1hbmQKLSAgICogICAgICBwOnEgICAgICAgICAgICAgICAgICAgICAgICBkZW1hbmQgbm90IGVtcHR5Ci0gICAqICAgICAgc2lnbiAgICAgMCAgICAgICAgICAgICAgICAgYnkgcGFyZW49PTAKLSAgICogICAgICBwYXJlbiAgICAwICAgICAgICAgICAgIGJ5ICIoKSIgc2NhbiBsb2dpYyBiZWNhdXNlICJTXiIgc2VlbgotICAgKiAgICAgIHJlZyAgICAgIC0xICAgICAgICAgICAgICAgIG9yIG5uIGJ5IG1pc3Rha2UKLSAgICogICAgICBuZHggICAgICAtMQotICAgKgotICAgKiBvdXQ6IG1vZGUgICAgIDAKLSAgICogICAgICByZWcgICAgICAtMQotICAgKiAgICAgIGxlbiAgICAgICdzJwotICAgKiAgICAgIGV4cAotICAgKiAgICAgIG5keCAgICAgIC0xCi0gICAqLwotICBpZiAoKCFlcnIgfHwgISplcnIpICYmIGxlbiA9PSAncycpCi0gICAgewotICAgICAgaWYgKCFoYXNoIHx8IHBhcmVuIHx8IGF0IHx8IG5keCA+PSAwKQotCWVyciA9IF8oImludmFsaWQgb3BlcmFuZCBvZiBTXiMiKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocmVnID49IDApCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIFNISVQhIHdlIHNhdyBTXiNSbm4gISBwdXQgdGhlIFJubiBiYWNrIGluCi0JICAgICAgICogZXhwcmVzc2lvbi4gS0xVREdFISBVc2Ugb2xkcSBzbyB3ZSBkb24ndAotCSAgICAgICAqIG5lZWQgdG8ga25vdyBleGFjdCBsZW5ndGggb2YgcmVnIG5hbWUuCi0JICAgICAgICovCi0JICAgICAgcSA9IG9sZHE7Ci0JICAgICAgcmVnID0gMDsKLQkgICAgfQotCSAgLyoKLQkgICAqIFdlIGhhdmUgYWxsIHRoZSBleHByZXNzaW9uIHdlIHdpbGwgZXZlciBnZXQuCi0JICAgKi8KLQkgIGlmIChwID4gcSkKLQkgICAgZXJyID0gXygiU14jIG5lZWRzIGV4cHJlc3Npb24iKTsKLQkgIGVsc2UgaWYgKGFjY2Vzc19tb2RlID09ICdyJykKLQkgICAgewotCSAgICAgIGVyciA9ICIgIjsJLyogV0lOISAqLwotCSAgICAgIG1vZGUgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGVyciA9IF8oIlNeIyBtYXkgb25seSByZWFkLWFjY2VzcyIpOwotCX0KLSAgICB9Ci0MCi0gIC8qCi0gICAqIENhc2Ugb2YgLShSbiksIHdoaWNoIGlzIHdlaXJkIGNhc2UuCi0gICAqCi0gICAqIGluOiAgYXQgICAgICAgMAotICAgKiAgICAgIGxlbiAgICAgICcKLSAgICogICAgICBoYXNoICAgICAwCi0gICAqICAgICAgcDpxICAgICAgcTxwCi0gICAqICAgICAgc2lnbiAgICAgLTEgICAgICAgICAgICAgICAgYnkgZGVmaW5pdGlvbgotICAgKiAgICAgIHBhcmVuICAgIDEgICAgICAgICAgICAgIGJ5IGRlZmluaXRpb24KLSAgICogICAgICByZWcgICAgICBwcmVzZW50ICAgICAgICAgICBieSBkZWZpbml0aW9uCi0gICAqICAgICAgbmR4ICAgICAgb3B0aW9uYWwKLSAgICoKLSAgICogb3V0OiBtb2RlICAgICA3Ci0gICAqICAgICAgcmVnICAgICAgcHJlc2VudAotICAgKiAgICAgIGxlbiAgICAgICcgJwotICAgKiAgICAgIGV4cCAgICAgICIiICAgICAgICAgICAgICAgIGVuZm9yY2UgZW1wdHkgZXhwcmVzc2lvbgotICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsICAgICAgICAgIHdhcm4gaWYgc2FtZSBhcyByZWcKLSAgICovCi0gIGlmICgoIWVyciB8fCAhKmVycikgJiYgc2lnbiA8IDApCi0gICAgewotICAgICAgaWYgKGxlbiAhPSAnICcgfHwgaGFzaCB8fCBhdCB8fCBwIDw9IHEpCi0JZXJyID0gXygiaW52YWxpZCBvcGVyYW5kIG9mIC0oKSIpOwotICAgICAgZWxzZQotCXsKLQkgIGVyciA9ICIgIjsJCS8qIHdpbiAqLwotCSAgbW9kZSA9IDc7Ci0JICBpZiAocmVnID09IFBDKQotCSAgICB3cm4gPSBfKCItKFBDKSB1bnByZWRpY3RhYmxlIik7Ci0JICBlbHNlIGlmIChyZWcgPT0gbmR4KQotCSAgICB3cm4gPSBfKCJbXWluZGV4IHNhbWUgYXMgLSgpcmVnaXN0ZXI6IHVucHJlZGljdGFibGUiKTsKLQl9Ci0gICAgfQotDAotICAvKgotICAgKiBXZSBjb252ZXJ0ICIoUm4pIiB0byAiQFJuIiBmb3Igb3VyIGNvbnZlbmllbmNlLgotICAgKiAoSSBob3BlIHRoaXMgaXMgY29udmVuaWVudDogaGFzIHNvbWVvbmUgZ290IGEgYmV0dGVyIHdheSB0byBwYXJzZSB0aGlzPykKLSAgICogQSBzaWRlLWVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgIkBSbiIgaXMgYSB2YWxpZCBvcGVyYW5kLgotICAgKi8KLSAgaWYgKHBhcmVuICYmICFzaWduICYmICFoYXNoICYmICFhdCAmJiBsZW4gPT0gJyAnICYmIHAgPiBxKQotICAgIHsKLSAgICAgIGF0ID0gMTsKLSAgICAgIHBhcmVuID0gMDsKLSAgICB9Ci0KLSAgLyoKLSAgICogQ2FzZSBvZiAoUm4pKywgd2hpY2ggaXMgc2xpZ2h0bHkgZGlmZmVyZW50LgotICAgKgotICAgKiBpbjogIGF0Ci0gICAqICAgICAgbGVuICAgICAgJyAnCi0gICAqICAgICAgaGFzaCAgICAgMAotICAgKiAgICAgIHA6cSAgICAgIHE8cAotICAgKiAgICAgIHNpZ24gICAgICsxICAgICAgICAgICAgICAgIGJ5IGRlZmluaXRpb24KLSAgICogICAgICBwYXJlbiAgICAxICAgICAgICAgICAgICBieSBkZWZpbml0aW9uCi0gICAqICAgICAgcmVnICAgICAgcHJlc2VudCAgICAgICAgICAgYnkgZGVmaW5pdGlvbgotICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsCi0gICAqCi0gICAqIG91dDogbW9kZSAgICAgOCtACi0gICAqICAgICAgcmVnICAgICAgcHJlc2VudAotICAgKiAgICAgIGxlbiAgICAgICcgJwotICAgKiAgICAgIGV4cCAgICAgICIiICAgICAgICAgICAgICAgIGVuZm9yY2UgZW1wdHkgZXhwcmVzc2lvbgotICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsICAgICAgICAgIHdhcm4gaWYgc2FtZSBhcyByZWcKLSAgICovCi0gIGlmICgoIWVyciB8fCAhKmVycikgJiYgc2lnbiA+IDApCi0gICAgewotICAgICAgaWYgKGxlbiAhPSAnICcgfHwgaGFzaCB8fCBwIDw9IHEpCi0JZXJyID0gXygiaW52YWxpZCBvcGVyYW5kIG9mICgpKyIpOwotICAgICAgZWxzZQotCXsKLQkgIGVyciA9ICIgIjsJCS8qIHdpbiAqLwotCSAgbW9kZSA9IDggKyAoYXQgPyAxIDogMCk7Ci0JICBpZiAocmVnID09IFBDKQotCSAgICB3cm4gPSBfKCIoUEMpKyB1bnByZWRpY3RhYmxlIik7Ci0JICBlbHNlIGlmIChyZWcgPT0gbmR4KQotCSAgICB3cm4gPSBfKCJbXWluZGV4IHNhbWUgYXMgKCkrcmVnaXN0ZXI6IHVucHJlZGljdGFibGUiKTsKLQl9Ci0gICAgfQotDAotICAvKgotICAgKiBDYXNlIG9mICMsIHdpdGhvdXQgU14uCi0gICAqCi0gICAqIGluOiAgYXQKLSAgICogICAgICBsZW4gICAgICAnICcgb3IgJ2knCi0gICAqICAgICAgaGFzaCAgICAgMSAgICAgICAgICAgICAgYnkgZGVmaW5pdGlvbgotICAgKiAgICAgIHA6cQotICAgKiAgICAgIHNpZ24gICAgIDAKLSAgICogICAgICBwYXJlbiAgICAwCi0gICAqICAgICAgcmVnICAgICAgYWJzZW50Ci0gICAqICAgICAgbmR4ICAgICAgb3B0aW9uYWwKLSAgICoKLSAgICogb3V0OiBtb2RlICAgICA4K0AKLSAgICogICAgICByZWcgICAgICBQQwotICAgKiAgICAgIGxlbiAgICAgICcgJyBvciAnaScKLSAgICogICAgICBleHAKLSAgICogICAgICBuZHggICAgICBvcHRpb25hbAotICAgKi8KLSAgaWYgKCghZXJyIHx8ICEqZXJyKSAmJiBoYXNoKQotICAgIHsKLSAgICAgIGlmIChsZW4gIT0gJ2knICYmIGxlbiAhPSAnICcpCi0JZXJyID0gXygiIyBjb25mbGljdHMgbGVuZ3RoIik7Ci0gICAgICBlbHNlIGlmIChwYXJlbikKLQllcnIgPSBfKCIjIGJhcnMgcmVnaXN0ZXIiKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocmVnID49IDApCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIFNISVQhIHdlIHNhdyAjUm5uISBQdXQgdGhlIFJubiBiYWNrIGludG8gdGhlIGV4cHJlc3Npb24uCi0JICAgICAgICogQnkgdXNpbmcgb2xkcSwgd2UgZG9uJ3QgbmVlZCB0byBrbm93IGhvdyBsb25nIFJubiB3YXMuCi0JICAgICAgICogS0xVREdFIQotCSAgICAgICAqLwotCSAgICAgIHEgPSBvbGRxOwotCSAgICAgIHJlZyA9IC0xOwkJLyogbm8gcmVnaXN0ZXIgYW55IG1vcmUgKi8KLQkgICAgfQotCSAgZXJyID0gIiAiOwkJLyogd2luICovCi0KLQkgIC8qIEpGIGEgYnVnZml4LCBJIHRoaW5rISAqLwotCSAgaWYgKGF0ICYmIGFjY2Vzc19tb2RlID09ICdhJykKLQkgICAgdm9wUC0+dm9wX25ieXRlcyA9IDQ7Ci0KLQkgIG1vZGUgPSAoYXQgPyA5IDogOCk7Ci0JICByZWcgPSBQQzsKLQkgIGlmICgoYWNjZXNzX21vZGUgPT0gJ20nIHx8IGFjY2Vzc19tb2RlID09ICd3JykgJiYgIWF0KQotCSAgICB3cm4gPSBfKCJ3cml0aW5nIG9yIG1vZGlmeWluZyAjIGlzIHVucHJlZGljdGFibGUiKTsKLQl9Ci0gICAgfQotICAvKgotICAgKiBJZiAhKmVyciwgdGhlbiAgICAgICAgc2lnbiA9PSAwCi0gICAqICAgICAgICAgICAgICAgICAgICAgICBoYXNoID09IDAKLSAgICovCi0MCi0gIC8qCi0gICAqIENhc2Ugb2YgUm4uIFdlIHNlcGVyYXRlIHRoaXMgb25lIGJlY2F1c2UgaXQgaGFzIGEgZmV3IHNwZWNpYWwKLSAgICogZXJyb3JzIHRoZSByZW1haW5pbmcgbW9kZXMgbGFjay4KLSAgICoKLSAgICogaW46ICBhdCAgICAgICBvcHRpb25hbAotICAgKiAgICAgIGxlbiAgICAgICcgJwotICAgKiAgICAgIGhhc2ggICAgIDAgICAgICAgICAgICAgYnkgcHJvZ3JhbSBsb2dpYwotICAgKiAgICAgIHA6cSAgICAgIGVtcHR5Ci0gICAqICAgICAgc2lnbiAgICAgMCAgICAgICAgICAgICAgICAgYnkgcHJvZ3JhbSBsb2dpYwotICAgKiAgICAgIHBhcmVuICAgIDAgICAgICAgICAgICAgYnkgZGVmaW5pdGlvbgotICAgKiAgICAgIHJlZyAgICAgIHByZXNlbnQgICAgICAgICAgIGJ5IGRlZmluaXRpb24KLSAgICogICAgICBuZHggICAgICBvcHRpb25hbAotICAgKgotICAgKiBvdXQ6IG1vZGUgICAgIDUrQAotICAgKiAgICAgIHJlZyAgICAgIHByZXNlbnQKLSAgICogICAgICBsZW4gICAgICAnICcgICAgICAgICAgICAgICBlbmZvcmNlIG5vIGxlbmd0aAotICAgKiAgICAgIGV4cCAgICAgICIiICAgICAgICAgICAgICAgIGVuZm9yY2UgZW1wdHkgZXhwcmVzc2lvbgotICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsICAgICAgICAgIHdhcm4gaWYgc2FtZSBhcyByZWcKLSAgICovCi0gIGlmICgoIWVyciB8fCAhKmVycikgJiYgIXBhcmVuICYmIHJlZyA+PSAwKQotICAgIHsKLSAgICAgIGlmIChsZW4gIT0gJyAnKQotCWVyciA9IF8oImxlbmd0aCBub3QgbmVlZGVkIik7Ci0gICAgICBlbHNlIGlmIChhdCkKLQl7Ci0JICBlcnIgPSAiICI7CQkvKiB3aW4gKi8KLQkgIG1vZGUgPSA2OwkJLyogQFJuICovCi0JfQotICAgICAgZWxzZSBpZiAobmR4ID49IDApCi0JZXJyID0gXygiY2FuJ3QgW11pbmRleCBhIHJlZ2lzdGVyLCBiZWNhdXNlIGl0IGhhcyBubyBhZGRyZXNzIik7Ci0gICAgICBlbHNlIGlmIChhY2Nlc3NfbW9kZSA9PSAnYScpCi0JZXJyID0gXygiYSByZWdpc3RlciBoYXMgbm8gYWRkcmVzcyIpOwotICAgICAgZWxzZQotCXsKLQkgIC8qCi0JICAgKiBJZGVhIGhlcmUgaXMgdG8gZGV0ZWN0IGZyb20gbGVuZ3RoIG9mIGRhdHVtCi0JICAgKiBhbmQgZnJvbSByZWdpc3RlciBudW1iZXIgaWYgd2Ugd2lsbCB0b3VjaCBQQy4KLQkgICAqIFdhcm4gaWYgd2UgZG8uCi0JICAgKiB2b3BfbmJ5dGVzIGlzIG51bWJlciBvZiBieXRlcyBpbiBvcGVyYW5kLgotCSAgICogQ29tcHV0ZSBoaWdoZXN0IGJ5dGUgYWZmZWN0ZWQsIGNvbXBhcmUgdG8gUEMwLgotCSAgICovCi0JICBpZiAoKHZvcFAtPnZvcF9uYnl0ZXMgKyByZWcgKiA0KSA+IDYwKQotCSAgICB3cm4gPSBfKCJQQyBwYXJ0IG9mIG9wZXJhbmQgdW5wcmVkaWN0YWJsZSIpOwotCSAgZXJyID0gIiAiOwkJLyogd2luICovCi0JICBtb2RlID0gNTsJCS8qIFJuICovCi0JfQotICAgIH0KLSAgLyoKLSAgICogSWYgISplcnIsICAgICAgICBzaWduICA9PSAwCi0gICAqICAgICAgICAgICAgICAgICAgaGFzaCAgPT0gMAotICAgKiAgICAgICAgICAgICAgICAgIHBhcmVuID09IDEgIE9SIHJlZz09LTEKLSAgICovCi0MCi0gIC8qCi0gICAqIFJlc3Qgb2YgY2FzZXMgZml0IGludG8gb25lIGJ1bmNoLgotICAgKgotICAgKiBpbjogIGF0ICAgICAgIG9wdGlvbmFsCi0gICAqICAgICAgbGVuICAgICAgJyAnIG9yICdiJyBvciAndycgb3IgJ2wnCi0gICAqICAgICAgaGFzaCAgICAgMCAgICAgICAgICAgICBieSBwcm9ncmFtIGxvZ2ljCi0gICAqICAgICAgcDpxICAgICAgZXhwZWN0ZWQgICAgICAgICAgKGVtcHR5IGlzIG5vdCBhbiBlcnJvcikKLSAgICogICAgICBzaWduICAgICAwICAgICAgICAgICAgICAgICBieSBwcm9ncmFtIGxvZ2ljCi0gICAqICAgICAgcGFyZW4gICAgb3B0aW9uYWwKLSAgICogICAgICByZWcgICAgICBvcHRpb25hbAotICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsCi0gICAqCi0gICAqIG91dDogbW9kZSAgICAgMTAgKyBAICsgbGVuCi0gICAqICAgICAgcmVnICAgICAgb3B0aW9uYWwKLSAgICogICAgICBsZW4gICAgICAnICcgb3IgJ2InIG9yICd3JyBvciAnbCcKLSAgICogICAgICBleHAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZSBlbXB0eQotICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsICAgICAgICAgIHdhcm4gaWYgc2FtZSBhcyByZWcKLSAgICovCi0gIGlmICghZXJyIHx8ICEqZXJyKQotICAgIHsKLSAgICAgIGVyciA9ICIgIjsJCS8qIHdpbiAoYWx3YXlzKSAqLwotICAgICAgbW9kZSA9IDEwICsgKGF0ID8gMSA6IDApOwotICAgICAgc3dpdGNoIChsZW4pCi0JewotCWNhc2UgJ2wnOgotCSAgbW9kZSArPSAyOwotCWNhc2UgJ3cnOgotCSAgbW9kZSArPSAyOwotCWNhc2UgJyAnOgkJLyogYXNzdW1lZCBCXiB1bnRpbCBvdXIgY2FsbGVyIGNoYW5nZXMgaXQgKi8KLQljYXNlICdiJzoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyoKLSAgICogaGVyZSB3aXRoIGNvbXBsZXRlbHkgc3BlY2lmaWVkICAgICBtb2RlCi0gICAqCQkJCQlsZW4KLSAgICoJCQkJCXJlZwotICAgKgkJCQkJZXhwcmVzc2lvbiAgIHAscQotICAgKgkJCQkJbmR4Ci0gICAqLwotCi0gIGlmICgqZXJyID09ICcgJykKLSAgICBlcnIgPSAwOwkJCS8qICIgIiBpcyBubyBsb25nZXIgYW4gZXJyb3IgKi8KLQotICB2b3BQLT52b3BfbW9kZSA9IG1vZGU7Ci0gIHZvcFAtPnZvcF9yZWcgPSByZWc7Ci0gIHZvcFAtPnZvcF9zaG9ydCA9IGxlbjsKLSAgdm9wUC0+dm9wX2V4cHJfYmVnaW4gPSBwOwotICB2b3BQLT52b3BfZXhwcl9lbmQgPSBxOwotICB2b3BQLT52b3BfbmR4ID0gbmR4OwotICB2b3BQLT52b3BfZXJyb3IgPSBlcnI7Ci0gIHZvcFAtPnZvcF93YXJuID0gd3JuOwotfQotDAotLyoKLQotICBTdW1tYXJ5IG9mIHZpcF9vcCBvdXRwdXRzLgotCi0gIG1vZGUJcmVnCWxlbgluZHgKLSAgKFJuKSA9PiBAUm4KLSAge0B9Um4JCQk1K0AJbgknICcJb3B0aW9uYWwKLSAgYnJhbmNoIG9wZXJhbmQJCTAJLTEJJyAnCS0xCi0gIFNeI2ZvbwkJCTAJLTEJJ3MnCS0xCi0gIC0oUm4pCQkJNwluCScgJwlvcHRpb25hbAotICB7QH0oUm4pKwkJOCtACW4JJyAnCW9wdGlvbmFsCi0gIHtAfSNmb28sIG5vIFNeCQk4K0AJUEMJIiBpIglvcHRpb25hbAotICB7QH17cV59eyhSbil9CQkxMCtAK3EJb3B0aW9uCSIgYndsIglvcHRpb25hbAotCi0gICovCi0MCi0jaWZkZWYgVEVTVAkJCS8qICNEZWZpbmUgdG8gdXNlIHRoaXMgdGVzdGJlZC4gKi8KLQotLyoKLSAqIEZvbGxvd3MgYSB0ZXN0IHByb2dyYW0gZm9yIHRoaXMgZnVuY3Rpb24uCi0gKiBXZSBkZWNsYXJlIGFycmF5cyBub24tbG9jYWwgaW4gY2FzZSBzb21lIG9mIG91ciB0aW55LW1pbmRlZCBtYWNoaW5lcwotICogZGVmYXVsdCB0byBzbWFsbCBzdGFja3MuIEFsc28sIGhlbHBzIHdpdGggc29tZSBkZWJ1Z2dlcnMuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWNoYXIgYW5zd2VyWzEwMF07CQkvKiBodW1hbiB0eXBlcyBpbnRvIGhlcmUgKi8KLWNoYXIgKnA7CQkJLyogICovCi1jaGFyICpteWVycjsKLWNoYXIgKm15d3JuOwotY2hhciAqbXlidWc7Ci1jaGFyIG15YWNjZXNzOwotY2hhciBteXdpZHRoOwotY2hhciBteW1vZGU7Ci1jaGFyIG15cmVnOwotY2hhciBteWxlbjsKLWNoYXIgKm15bGVmdDsKLWNoYXIgKm15cmlnaHQ7Ci1jaGFyIG15bmR4OwotaW50IG15X29wZXJhbmRfbGVuZ3RoOwotY2hhciBteV9pbW1lZGlhdGVbMjAwXTsKLWNoYXIgbXlfaW5kaXJlY3RbMjAwXTsKLWNoYXIgbXlfZGlzcGxlblsyMDBdOwotCi1tYWluICgpCi17Ci0gIHByaW50ZiAoImVudGVyIGltbWVkaWF0ZSBzeW1ib2xzIGVnIGVudGVyICMgICAiKTsKLSAgZ2V0cyAobXlfaW1tZWRpYXRlKTsKLSAgcHJpbnRmICgiZW50ZXIgaW5kaXJlY3Qgc3ltYm9scyAgZWcgZW50ZXIgQCAgICIpOwotICBnZXRzIChteV9pbmRpcmVjdCk7Ci0gIHByaW50ZiAoImVudGVyIGRpc3BsZW4gc3ltYm9scyAgIGVnIGVudGVyIF4gICAiKTsKLSAgZ2V0cyAobXlfZGlzcGxlbik7Ci0gIHZpcF9vcF9kZWZhdWx0cyAobXlfaW1tZWRpYXRlLCBteV9pbmRpcmVjdCwgbXlfZGlzcGxlbik7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgcHJpbnRmICgiYWNjZXNzLHdpZHRoIChlZyAnYWInIG9yICd3aCcpIFtlbXB0eSBsaW5lIHRvIHF1aXRdIDogICIpOwotICAgICAgZmZsdXNoIChzdGRvdXQpOwotICAgICAgZ2V0cyAoYW5zd2VyKTsKLSAgICAgIGlmICghYW5zd2VyWzBdKQotCWV4aXQgKEVYSVRfU1VDQ0VTUyk7Ci0gICAgICBteWFjY2VzcyA9IGFuc3dlclswXTsKLSAgICAgIG15d2lkdGggPSBhbnN3ZXJbMV07Ci0gICAgICBzd2l0Y2ggKG15d2lkdGgpCi0JewotCWNhc2UgJ2InOgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBteV9vcGVyYW5kX2xlbmd0aCA9IDg7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIG15X29wZXJhbmRfbGVuZ3RoID0gNDsKLQkgIGJyZWFrOwotCWNhc2UgJ2cnOgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSAxNjsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSAzMjsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSA0OwotCSAgYnJlYWs7Ci0JY2FzZSAnbyc6Ci0JICBteV9vcGVyYW5kX2xlbmd0aCA9IDE2OwotCSAgYnJlYWs7Ci0JY2FzZSAncSc6Ci0JICBteV9vcGVyYW5kX2xlbmd0aCA9IDg7Ci0JICBicmVhazsKLQljYXNlICd3JzoKLQkgIG15X29wZXJhbmRfbGVuZ3RoID0gMjsKLQkgIGJyZWFrOwotCWNhc2UgJyEnOgotCWNhc2UgJz8nOgotCWNhc2UgJy0nOgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSAwOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSAyOwotCSAgcHJpbnRmICgiSSBkbid0IHVuZGVyc3RhbmQgYWNjZXNzIHdpZHRoICVjXG4iLCBteXdpZHRoKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHByaW50ZiAoIlZBWCBhc3NlbWJsZXIgaW5zdHJ1Y3Rpb24gb3BlcmFuZDogIik7Ci0gICAgICBmZmx1c2ggKHN0ZG91dCk7Ci0gICAgICBnZXRzIChhbnN3ZXIpOwotICAgICAgbXlidWcgPSB2aXBfb3AgKGFuc3dlciwgbXlhY2Nlc3MsIG15d2lkdGgsIG15X29wZXJhbmRfbGVuZ3RoLAotCQkgICAgICAmbXltb2RlLCAmbXlyZWcsICZteWxlbiwgJm15bGVmdCwgJm15cmlnaHQsICZteW5keCwKLQkJICAgICAgJm15ZXJyLCAmbXl3cm4pOwotICAgICAgaWYgKCpteWVycikKLQl7Ci0JICBwcmludGYgKCJlcnJvcjogXCIlc1wiXG4iLCBteWVycik7Ci0JICBpZiAoKm15YnVnKQotCSAgICBwcmludGYgKCIgYnVnOiBcIiVzXCJcbiIsIG15YnVnKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCpteXdybikKLQkgICAgcHJpbnRmICgid2FybmluZzogXCIlc1wiXG4iLCBteXdybik7Ci0JICBtdW1ibGUgKCJtb2RlIiwgbXltb2RlKTsKLQkgIG11bWJsZSAoInJlZ2lzdGVyIiwgbXlyZWcpOwotCSAgbXVtYmxlICgiaW5kZXgiLCBteW5keCk7Ci0JICBwcmludGYgKCJ3aWR0aDonJWMnICAiLCBteWxlbik7Ci0JICBwcmludGYgKCJleHByZXNzaW9uOiBcIiIpOwotCSAgd2hpbGUgKG15bGVmdCA8PSBteXJpZ2h0KQotCSAgICBwdXRjaGFyICgqbXlsZWZ0KyspOwotCSAgcHJpbnRmICgiXCJcbiIpOwotCX0KLSAgICB9Ci19Ci0KLW11bWJsZSAodGV4dCwgdmFsdWUpCi0gICAgIGNoYXIgKnRleHQ7Ci0gICAgIGludCB2YWx1ZTsKLXsKLSAgcHJpbnRmICgiJXM6IiwgdGV4dCk7Ci0gIGlmICh2YWx1ZSA+PSAwKQotICAgIHByaW50ZiAoIiV4eCIsIHZhbHVlKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIkFCU0VOVCIpOwotICBwcmludGYgKCIgICIpOwotfQotCi0jZW5kaWYgLyogaWZkZWYgVEVTVCAqLwotCi0vKiBlbmQ6IHZpcF9vcC5jICovCi0KLWNvbnN0IGludCBtZF9zaG9ydF9qdW1wX3NpemUgPSAzOwotY29uc3QgaW50IG1kX2xvbmdfanVtcF9zaXplID0gNjsKLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gODsJLyogU2l6ZSBvZiByZWxvY2F0aW9uIHJlY29yZCAqLwotCi12b2lkCi1tZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgLyogVGhpcyBmb3JtZXIgY2FsY3VsYXRpb24gd2FzIG9mZiBieSB0d286Ci0gICAgICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDEpOwotICAgICBXZSBuZWVkIHRvIGFjY291bnQgZm9yIHRoZSBvbmUgYnl0ZSBpbnN0cnVjdGlvbiBhbmQgYWxzbyBpdHMKLSAgICAgdHdvIGJ5dGUgb3BlcmFuZC4gICovCi0gIG9mZnNldCA9IHRvX2FkZHIgLSAoZnJvbV9hZGRyICsgMSArIDIpOwotICAqcHRyKysgPSBWQVhfQlJXOwkJLyogYnJhbmNoIHdpdGggd29yZCAoMTYgYml0KSBvZmZzZXQgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIG9mZnNldCwgMik7Ci19Ci0KLXZvaWQKLW1kX2NyZWF0ZV9sb25nX2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICB2YWx1ZVQgb2Zmc2V0OwotCi0gIG9mZnNldCA9IHRvX2FkZHIgLSBTX0dFVF9WQUxVRSAodG9fc3ltYm9sKTsKLSAgKnB0cisrID0gVkFYX0pNUDsJCS8qIGFyYml0cmFyeSBqdW1wICovCi0gICpwdHIrKyA9IFZBWF9BQlNPTFVURV9NT0RFOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgb2Zmc2V0LCA0KTsKLSAgZml4X25ldyAoZnJhZywgcHRyIC0gZnJhZy0+ZnJfbGl0ZXJhbCwgNCwgdG9fc3ltYm9sLCAobG9uZykgMCwgMCwgTk9fUkVMT0MpOwotfQotDAotI2lmZGVmIE9CSl9WTVMKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJkOlNUdDpWKzFoOkh2OjoiOwotI2Vsc2UKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJkOlNUdDpWIjsKLSNlbmRpZgotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ1MnOgotICAgICAgYXNfd2FybiAoXygiU1lNQk9MIFRBQkxFIG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgICBhc193YXJuIChfKCJUT0tFTiBUUkFDRSBub3QgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgYXNfd2FybiAoXygiRGlzcGxhY2VtZW50IGxlbmd0aCAlcyBpZ25vcmVkISIpLCBhcmcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd0JzoKLSAgICAgIGFzX3dhcm4gKF8oIkkgZG9uJ3QgbmVlZCBvciB1c2UgdGVtcC4gZmlsZSBcIiVzXCIuIiksIGFyZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1YnOgotICAgICAgYXNfd2FybiAoXygiSSBkb24ndCB1c2UgYW4gaW50ZXJwYXNzIGZpbGUhIC1WIGlnbm9yZWQiKSk7Ci0gICAgICBicmVhazsKLQotI2lmZGVmIE9CSl9WTVMKLSAgICBjYXNlICcrJzoJCQkvKiBGb3IgZysrLiAgSGFzaCBhbnkgbmFtZSA+IDMxIGNoYXJzIGxvbmcuICovCi0gICAgICBmbGFnX2hhc2hfbG9uZ19uYW1lcyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzEnOgkJCS8qIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCi0gICAgICBmbGFnX29uZSA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0gnOgkJCS8qIFNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb24gKi8KLSAgICAgIGZsYWdfc2hvd19hZnRlcl90cnVuYyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgkJCS8qIE5vIGhhc2hpbmcgb2YgbWl4ZWQtY2FzZSBuYW1lcyAqLwotICAgICAgewotCWV4dGVybiBjaGFyIHZtc19uYW1lX21hcHBpbmc7Ci0Jdm1zX25hbWVfbWFwcGluZyA9IGF0b2kgKGFyZyk7Ci0JZmxhZ19ub19oYXNoX21peGVkX2Nhc2UgPSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd2JzoKLSAgICAgIHsKLQlleHRlcm4gY2hhciAqY29tcGlsZXJfdmVyc2lvbl9zdHJpbmc7Ci0JaWYgKCFhcmcgfHwgISphcmcgfHwgYWNjZXNzIChhcmcsIDApID09IDApCi0JICByZXR1cm4gMDsJCS8qIGhhdmUgY2FsbGVyIHNob3cgdGhlIGFzc2VtYmxlciB2ZXJzaW9uICovCi0JY29tcGlsZXJfdmVyc2lvbl9zdHJpbmcgPSBhcmc7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi1WQVggb3B0aW9uczpcblwKLS1kIExFTkdUSAkJaWdub3JlZFxuXAotLUoJCQlpZ25vcmVkXG5cCi0tUwkJCWlnbm9yZWRcblwKLS10IEZJTEUJCQlpZ25vcmVkXG5cCi0tVAkJCWlnbm9yZWRcblwKLS1WCQkJaWdub3JlZFxuIikpOwotI2lmZGVmIE9CSl9WTVMKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1WTVMgb3B0aW9uczpcblwKLS0rCQkJaGFzaCBlbmNvZGUgbmFtZXMgbG9uZ2VyIHRoYW4gMzEgY2hhcmFjdGVyc1xuXAotLTEJCQlgY29uc3QnIGhhbmRsaW5nIGNvbXBhdGlibGUgd2l0aCBnY2MgMS54XG5cCi0tSAkJCXNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb25cblwKLS1oIE5VTQkJCWRvbid0IGhhc2ggbWl4ZWQtY2FzZSBuYW1lcywgYW5kIGFkanVzdCBjYXNlOlxuXAotCQkJMCA9IHVwcGVyLCAyID0gbG93ZXIsIDMgPSBwcmVzZXJ2ZSBjYXNlXG5cCi0tdlwiVkVSU0lPTlwiCQljb2RlIGJlaW5nIGFzc2VtYmxlZCB3YXMgcHJvZHVjZWQgYnkgY29tcGlsZXIgXCJWRVJTSU9OXCJcbiIpKTsKLSNlbmRpZgotfQotDAotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgcmV0dXJuIHNpemU7CQkJLyogQnl0ZSBhbGlnbm1lbnQgaXMgZmluZSAqLwotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgdmF4LCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBvZmZzZXQsIHBsdXMKLSAgIGl0cyBzaXplLiAoPz8/IElzIHRoaXMgcmlnaHQ/ICBGSVhNRS1TT09OKSAqLwotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIGZpeFAtPmZ4X3NpemUgKyBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci19Ci0KLS8qIGVuZCBvZiB0Yy12YXguYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy12YXguaCBiL2dhcy9jb25maWcvdGMtdmF4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NzkxZjcuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy12YXguaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qIHRjLXZheC5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy12YXguYy4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTEsIDkyLCA5MywgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfVkFYIDEKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNkZWZpbmUgTk9fUkVMT0MgMAotI2RlZmluZSBOT1BfT1BDT0RFIDB4MDEKLQotI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKHgpCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19jcmF3bF9zeW1ib2xfY2hhaW4oYSkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotbG9uZyBtZF9jaGFyc190b19udW1iZXIgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRjLXZheC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXc2NS5jIGIvZ2FzL2NvbmZpZy90Yy13NjUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIyMDFlNy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXc2NS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxOSArMCwwIEBACi0vKiB0Yy13NjUuYyAtLSBBc3NlbWJsZSBjb2RlIGZvciB0aGUgVzY1ODE2Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICAgV3JpdHRlbiBCeSBTdGV2ZSBDaGFtYmVybGFpbgotICAgc2FjQGN5Z251cy5jb20KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0jaW5jbHVkZSAiLi4vb3Bjb2Rlcy93NjUtb3BjLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiISI7Ci1DT05TVCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiEjIjsKLQotLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLSAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgIEludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCi0gKi8KLQotI2RlZmluZSBPUF9CQ0MJMHg5MAotI2RlZmluZSBPUF9CQ1MJMHhCMAotI2RlZmluZSBPUF9CRVEJMHhGMAotI2RlZmluZSBPUF9CTUkJMHgzMAotI2RlZmluZSBPUF9CTkUJMHhEMAotI2RlZmluZSBPUF9CUEwJMHgxMAotI2RlZmluZSBPUF9CUkEJMHg4MAotI2RlZmluZSBPUF9CUkwJMHg4MgotI2RlZmluZSBPUF9CVkMJMHg1MAotI2RlZmluZSBPUF9CVlMJMHg3MAotCi12b2lkIHNfbG9uZ2EgKCk7Ci1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImludCIsIGNvbnMsIDJ9LAotICB7IndvcmQiLCBjb25zLCAyfSwKLSAgeyJsb25nYSIsIHNfbG9uZ2EsIDB9LAotICB7ImxvbmdpIiwgc19sb25nYSwgMX0sCi0gIHswLCAwLCAwfQotfTsKLQotCi12b2lkIGNvbnMgKCk7Ci12b2lkIHNfYWxpZ25fYnl0ZXMgKCk7Ci0KLQotLyppbnQgbWRfcmVsb2Nfc2l6ZTsgKi8KLQotc3RhdGljIGludCByZWxheDsJCS8qIHNldCBpZiAtcmVsYXggc2VlbiAqLwotCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0KLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wY29kZV9oYXNoX2NvbnRyb2w7CS8qIE9wY29kZSBtbmVtb25pY3MgKi8KLQotaW50IE07CQkJCS8qIE0gZmxhZyAqLwotaW50IFg7CQkJCS8qIFggZmxhZyAqLwotCi0KLQotCi0jZGVmaW5lIEMoYSxiKSBFTkNPREVfUkVMQVgoYSxiKQotI2RlZmluZSBFTkNPREVfUkVMQVgod2hhdCxsZW5ndGgpICgoKHdoYXQpIDw8IDIpICsgKGxlbmd0aCkpCi0KLSNkZWZpbmUgR0VUX1dIQVQoeCkgKCh4Pj4yKSkKLQotI2RlZmluZSBCWVRFX0RJU1AgMQotI2RlZmluZSBXT1JEX0RJU1AgMgotI2RlZmluZSBVTkRFRl9CWVRFX0RJU1AgMAotI2RlZmluZSBVTkRFRl9XT1JEX0RJU1AgMwotCi0jZGVmaW5lIENPTkRfQlJBTkNIIAkxCi0jZGVmaW5lIFVOQ09ORF9CUkFOQ0ggICAyCi0jZGVmaW5lIEVORCAJMwotCi0jZGVmaW5lIEJZVEVfRiAxMjcJCS8qIEhvdyBmYXIgd2UgY2FuIGJyYW5jaCBmb3J3YXJkcyAqLwotI2RlZmluZSBCWVRFX0IgLTEyNgkJLyogSG93IGZhciB3ZSBjYW4gYnJhbmNoIGJhY2t3YXJkcyAqLwotI2RlZmluZSBXT1JEX0YgMzI3NjcKLSNkZWZpbmUgV09SRF9CIDMyNzY4Ci0KLXJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW0MgKEVORCwgMCldOwotCi0vKgotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIFRoaXMgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0YyB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgbmVlZHMKLSAqLwotCi0KLXZvaWQKLXNfbG9uZ2EgKHhtb2RlKQotewotICBpbnQgKnAgPSB4bW9kZSA/ICZYIDogJk07Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcgJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIm9uIiwgMikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLSAgICAgICpwID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIm9mZiIsIDMpID09IDApCi0gICAgewotICAgICAgKnAgPSAxOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDM7Ci0gICAgfQotICBlbHNlCi0gICAgYXNfYmFkIChfKCJuZWVkIG9uIG9yIG9mZi4iKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci12b2lkCi1tZF9iZWdpbiAoKQotewotICByZWxheF90eXBlUyAqdGFibGU7Ci0gIHN0cnVjdCBvcGluZm8gKm9wY29kZTsKLSAgY2hhciAqcHJldl9uYW1lID0gIiI7Ci0KLSAgb3Bjb2RlX2hhc2hfY29udHJvbCA9IGhhc2hfbmV3ICgpOwotCi0gIC8qIEluc2VydCB1bmlxdWUgbmFtZXMgaW50byBoYXNoIHRhYmxlICovCi0gIGZvciAob3Bjb2RlID0gb3B0YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChwcmV2X25hbWUsIG9wY29kZS0+bmFtZSkpCi0JewotCSAgcHJldl9uYW1lID0gb3Bjb2RlLT5uYW1lOwotCSAgaGFzaF9pbnNlcnQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG9wY29kZS0+bmFtZSwgKGNoYXIgKikgb3Bjb2RlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTWFrZSBhbGwgdGhlIG9wY29kZXMgd2l0aCB0aGUgc2FtZSBuYW1lIHBvaW50IHRvIHRoZSBzYW1lCi0JICAgICBzdHJpbmcgKi8KLQkgIG9wY29kZS0+bmFtZSA9IHByZXZfbmFtZTsKLQl9Ci0gICAgfQotCi0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgcmVsYXggdGFibGUuICBXZSB1c2UgYSBsb2NhbCB2YXJpYWJsZSB0byBhdm9pZAotICAgICB3YXJuaW5ncyBhYm91dCBtb2RpZnlpbmcgYSBzdXBwb3NlZGx5IGNvbnN0IGRhdGEgc3RydWN0dXJlLiAgKi8KLSAgdGFibGUgPSAocmVsYXhfdHlwZVMgKikgbWRfcmVsYXhfdGFibGU7Ci0gIHRhYmxlW0MgKENPTkRfQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfZm9yd2FyZCA9IEJZVEVfRjsKLSAgdGFibGVbQyAoQ09ORF9CUkFOQ0gsIEJZVEVfRElTUCldLnJseF9iYWNrd2FyZCA9IEJZVEVfQjsKLSAgdGFibGVbQyAoQ09ORF9CUkFOQ0gsIEJZVEVfRElTUCldLnJseF9sZW5ndGggPSAyOwotICB0YWJsZVtDIChDT05EX0JSQU5DSCwgQllURV9ESVNQKV0ucmx4X21vcmUgPSBDIChDT05EX0JSQU5DSCwgV09SRF9ESVNQKTsKLQotICB0YWJsZVtDIChDT05EX0JSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2ZvcndhcmQgPSBXT1JEX0Y7Ci0gIHRhYmxlW0MgKENPTkRfQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfYmFja3dhcmQgPSBXT1JEX0I7Ci0gIHRhYmxlW0MgKENPTkRfQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoID0gNTsKLSAgdGFibGVbQyAoQ09ORF9CUkFOQ0gsIFdPUkRfRElTUCldLnJseF9tb3JlID0gMDsKLQotICB0YWJsZVtDIChVTkNPTkRfQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfZm9yd2FyZCA9IEJZVEVfRjsKLSAgdGFibGVbQyAoVU5DT05EX0JSQU5DSCwgQllURV9ESVNQKV0ucmx4X2JhY2t3YXJkID0gQllURV9COwotICB0YWJsZVtDIChVTkNPTkRfQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoID0gMjsKLSAgdGFibGVbQyAoVU5DT05EX0JSQU5DSCwgQllURV9ESVNQKV0ucmx4X21vcmUgPSBDIChVTkNPTkRfQlJBTkNILCBXT1JEX0RJU1ApOwotCi0gIHRhYmxlW0MgKFVOQ09ORF9CUkFOQ0gsIFdPUkRfRElTUCldLnJseF9mb3J3YXJkID0gV09SRF9GOwotICB0YWJsZVtDIChVTkNPTkRfQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfYmFja3dhcmQgPSBXT1JEX0I7Ci0gIHRhYmxlW0MgKFVOQ09ORF9CUkFOQ0gsIFdPUkRfRElTUCldLnJseF9sZW5ndGggPSAzOwotICB0YWJsZVtDIChVTkNPTkRfQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfbW9yZSA9IDA7Ci0KLSAgZmxhZ19zaWduZWRfb3ZlcmZsb3dfb2sgPSAxOwotfQotCi1zdGF0aWMgZXhwcmVzc2lvblMgaW1tZWRpYXRlOwkvKiBhYnNvbHV0ZSBleHByZXNzaW9uICovCi1zdGF0aWMgZXhwcmVzc2lvblMgaW1tZWRpYXRlMTsJLyogYWJzb2x1dGUgZXhwcmVzc2lvbiAqLwotCi0KLXN0YXRpYyBzeW1ib2xTICoKLWRvdCAoKQotewotICBjb25zdCBjaGFyICpmYWtlOwotCi0gIC8qIEpGOiAnLicgaXMgcHNldWRvIHN5bWJvbCB3aXRoIHZhbHVlIG9mIGN1cnJlbnQgbG9jYXRpb24KLSAgICAgaW4gY3VycmVudCBzZWdtZW50LiAgKi8KLSAgZmFrZSA9IEZBS0VfTEFCRUxfTkFNRTsKLSAgcmV0dXJuIHN5bWJvbF9uZXcgKGZha2UsCi0JCSAgICAgbm93X3NlZywKLQkJICAgICAodmFsdWVUKSBmcmFnX25vd19maXggKCksCi0JCSAgICAgZnJhZ19ub3cpOwotCi19Ci0KLWludCBleHByX3NpemU7Ci1pbnQgZXhwcl9zaGlmdDsKLWludCB0Y19jb25zX3JlbG9jOwotdm9pZAotdzY1X2V4cHJlc3Npb24gKGRlc3QsIGJ5dGVzKQotICAgICBleHByZXNzaW9uUyAqZGVzdDsKLSAgICAgdW5zaWduZWQgaW50IGJ5dGVzOwotewotICBleHByX3NpemUgPSAwOwotICBleHByX3NoaWZ0ID0gMDsKLSAgdGNfY29uc19yZWxvYyA9IDA7Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcgJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnPCcpCi0gICAgewotICAgICAgZXhwcl9zaXplID0gMTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLSAgZWxzZSBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnPicpCi0gICAgewotICAgICAgZXhwcl9zaGlmdCA9IDE7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ14nKQotICAgIHsKLSAgICAgIGV4cHJfc2hpZnQgPSAyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotCi0gIGV4cHIgKDAsIGRlc3QpOwotfQotCi1pbnQgYW1vZGU7Ci1zdGF0aWMKLWNoYXIgKgotcGFyc2VfZXhwIChzLCBieXRlcykKLSAgICAgY2hhciAqczsKLSAgICAgaW50IGJ5dGVzOwotewotICBjaGFyICpzYXZlOwotICBjaGFyICpuZXc7Ci0KLSAgc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLSAgdzY1X2V4cHJlc3Npb24gKCZpbW1lZGlhdGUsIGJ5dGVzKTsKLSAgaWYgKGltbWVkaWF0ZS5YX29wID09IE9fYWJzZW50KQotICAgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotICBuZXcgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLQotc3RhdGljCi1jaGFyICoKLWdldF9vcGVyYW5kcyAoaW5mbywgcHRyKQotICAgICBzdHJ1Y3Qgb3BpbmZvICppbmZvOwotICAgICBjaGFyICpwdHI7Ci17Ci0gIHJlZ2lzdGVyIGludCBvdmVycmlkZV9sZW4gPSAwOwotICByZWdpc3RlciBpbnQgYnl0ZXMgPSAwOwotICB3aGlsZSAoKnB0ciA9PSAnICcpCi0gICAgcHRyKys7Ci0KLSAgaWYgKHB0clswXSA9PSAnIycpCi0gICAgewotICAgICAgcHRyKys7Ci0gICAgICBzd2l0Y2ggKGluZm8tPmFtb2RlKQotCXsKLQljYXNlIEFERFJfSU1NVE9JOgotCSAgYnl0ZXMgPSBYID8gMSA6IDI7Ci0JICBhbW9kZSA9IEFERFJfSU1NVE9JOwotCSAgYnJlYWs7Ci0JY2FzZSBBRERSX0lNTVRPQToKLQkgIGJ5dGVzID0gTSA/IDEgOiAyOwotCSAgYW1vZGUgPSBBRERSX0lNTVRPQTsKLQkgIGJyZWFrOwotCWNhc2UgQUREUl9JTU1DT1A6Ci0JICBieXRlcyA9IDE7Ci0JICBhbW9kZSA9IEFERFJfSU1NQ09QOwotCSAgYnJlYWs7Ci0JY2FzZSBBRERSX0RJUjoKLQkgIGJ5dGVzID0gMjsKLQkgIGFtb2RlID0gQUREUl9BQlM7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBwdHIgPSBwYXJzZV9leHAgKHB0cik7Ci0gICAgfQotICBlbHNlIGlmIChwdHJbMF0gPT0gJyEnKQotICAgIHsKLSAgICAgIHB0ciA9IHBhcnNlX2V4cCAocHRyICsgMSk7Ci0gICAgICBpZiAocHRyWzBdID09ICcsJykKLQl7Ci0JICBpZiAocHRyWzFdID09ICd5JykKLQkgICAgewotCSAgICAgIGFtb2RlID0gQUREUl9BQlNfSURYX1k7Ci0JICAgICAgYnl0ZXMgPSAyOwotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0JICBlbHNlIGlmIChwdHJbMV0gPT0gJ3gnKQotCSAgICB7Ci0JICAgICAgYW1vZGUgPSBBRERSX0FCU19JRFhfWDsKLQkgICAgICBieXRlcyA9IDI7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGFmdGVyIDxleHAiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYW1vZGUgPSBBRERSX0FCUzsKLQkgIGJ5dGVzID0gMjsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChwdHJbMF0gPT0gJz4nKQotICAgIHsKLSAgICAgIHB0ciA9IHBhcnNlX2V4cCAocHRyICsgMSk7Ci0gICAgICBpZiAocHRyWzBdID09ICcsJyAmJiBwdHJbMV0gPT0gJ3gnKQotCXsKLQkgIGFtb2RlID0gQUREUl9BQlNfTE9OR19JRFhfWDsKLQkgIGJ5dGVzID0gMzsKLQkgIHB0ciArPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhbW9kZSA9IEFERFJfQUJTX0xPTkc7Ci0JICBieXRlcyA9IDM7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAocHRyWzBdID09ICc8JykKLSAgICB7Ci0gICAgICBwdHIgPSBwYXJzZV9leHAgKHB0ciArIDEpOwotICAgICAgaWYgKHB0clswXSA9PSAnLCcpCi0JewotCSAgaWYgKHB0clsxXSA9PSAneScpCi0JICAgIHsKLQkgICAgICBhbW9kZSA9IEFERFJfRElSX0lEWF9ZOwotCSAgICAgIHB0ciArPSAyOwotCSAgICAgIGJ5dGVzID0gMjsKLQkgICAgfQotCSAgZWxzZSBpZiAocHRyWzFdID09ICd4JykKLQkgICAgewotCSAgICAgIGFtb2RlID0gQUREUl9ESVJfSURYX1g7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgICAgYnl0ZXMgPSAyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBhZnRlciA8ZXhwIikpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFtb2RlID0gQUREUl9ESVI7Ci0JICBieXRlcyA9IDE7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAocHRyWzBdID09ICdhJykKLSAgICB7Ci0gICAgICBhbW9kZSA9IEFERFJfQUNDOwotICAgIH0KLSAgZWxzZSBpZiAocHRyWzBdID09ICcoJykKLSAgICB7Ci0gICAgICAvKiBMb29rIGZvciAoZXhwKSx5Ci0JICg8ZXhwKSx5Ci0JIChleHAseCkKLQkgKDxleHAseCkKLQkgKGV4cCkKLQkgKCFleHApCi0JIChleHApCi0JICg8ZXhwKQotCSAoZXhwLHgpCi0JICghZXhwLHgpCi0JIChleHAscykKLQkgKGV4cCxzKSx5ICovCi0KLSAgICAgIHB0cisrOwotICAgICAgaWYgKHB0clswXSA9PSAnPCcpCi0JewotCSAgb3ZlcnJpZGVfbGVuID0gMTsKLQkgIHB0cisrOwotCX0KLSAgICAgIGVsc2UgaWYgKHB0clswXSA9PSAnIScpCi0JewotCSAgb3ZlcnJpZGVfbGVuID0gMjsKLQkgIHB0cisrOwotCX0KLSAgICAgIGVsc2UgaWYgKHB0clswXSA9PSAnPicpCi0JewotCSAgb3ZlcnJpZGVfbGVuID0gMzsKLQkgIHB0cisrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvdmVycmlkZV9sZW4gPSAwOwotCX0KLSAgICAgIHB0ciA9IHBhcnNlX2V4cCAocHRyKTsKLQotICAgICAgaWYgKHB0clswXSA9PSAnLCcpCi0JewotCSAgcHRyKys7Ci0JICBpZiAocHRyWzBdID09ICd4JyAmJiBwdHJbMV0gPT0gJyknKQotCSAgICB7Ci0JICAgICAgcHRyICs9IDI7Ci0KLQkgICAgICBpZiAob3ZlcnJpZGVfbGVuID09IDEpCi0JCXsKLQkJICBhbW9kZSA9IEFERFJfRElSX0lEWF9JTkRfWDsKLQkJICBieXRlcyA9IDI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhbW9kZSA9IEFERFJfQUJTX0lORF9JRFg7Ci0JCSAgYnl0ZXMgPSAyOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHB0clswXSA9PSAncycgJiYgcHRyWzFdID09ICcpJyAmJiBwdHJbMl0gPT0gJywnICYmIHB0clszXSA9PSAneScpCi0JICAgIHsKLQkgICAgICBhbW9kZSA9IEFERFJfU1RBQ0tfUkVMX0lORFhfSURYOwotCSAgICAgIGJ5dGVzID0gMTsKLQkgICAgICBwdHIgKz0gNDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHB0clswXSA9PSAnKScpCi0JewotCSAgaWYgKHB0clsxXSA9PSAnLCcgJiYgcHRyWzJdID09ICd5JykKLQkgICAgewotCSAgICAgIGFtb2RlID0gQUREUl9ESVJfSU5EX0lEWF9ZOwotCSAgICAgIHB0ciArPSAzOwotCSAgICAgIGJ5dGVzID0gMjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKG92ZXJyaWRlX2xlbiA9PSAxKQotCQl7Ci0JCSAgYW1vZGUgPSBBRERSX0RJUl9JTkQ7Ci0JCSAgYnl0ZXMgPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYW1vZGUgPSBBRERSX0FCU19JTkQ7Ci0JCSAgYnl0ZXMgPSAyOwotCQl9Ci0JICAgICAgcHRyKys7Ci0KLQkgICAgfQotCX0KLQotICAgIH0KLSAgZWxzZSBpZiAocHRyWzBdID09ICdbJykKLSAgICB7Ci0gICAgICBwdHIgPSBwYXJzZV9leHAgKHB0ciArIDEpOwotICAgICAgaWYgKHB0clswXSA9PSAnXScpCi0JewotCSAgcHRyKys7Ci0JICBpZiAocHRyWzBdID09ICcsJyAmJiBwdHJbMV0gPT0gJ3knKQotCSAgICB7Ci0JICAgICAgYnl0ZXMgPSAxOwotCSAgICAgIGFtb2RlID0gQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkc7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChpbmZvLT5jb2RlID09IE9fam1wKSAKLQkJewotCQlieXRlcyA9IDI7Ci0JCWFtb2RlID0gQUREUl9BQlNfSU5EX0xPTkc7Ci0JICAgICAgfSAKLQkgICAgICBlbHNlIAotewotCQlieXRlcyA9IDE7Ci0JICAgICAgCi0JCWFtb2RlID0gQUREUl9ESVJfSU5EX0xPTkc7Ci0JICAgICAgfQotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHB0ciA9IHBhcnNlX2V4cCAocHRyLCAyKTsKLSAgICAgIGlmIChwdHJbMF0gPT0gJywnKQotCXsKLQkgIGlmIChwdHJbMV0gPT0gJ3knKQotCSAgICB7Ci0JICAgICAgaWYgKG92ZXJyaWRlX2xlbiA9PSAxKQotCQl7Ci0JCSAgYnl0ZXMgPSAxOwotCQkgIGFtb2RlID0gQUREUl9ESVJfSURYX1k7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhbW9kZSA9IEFERFJfQUJTX0lEWF9ZOwotCQkgIGJ5dGVzID0gMjsKLQkJfQotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0JICBlbHNlIGlmIChwdHJbMV0gPT0gJ3gnKQotCSAgICB7Ci0JICAgICAgaWYgKG92ZXJyaWRlX2xlbiA9PSAxKQotCQl7Ci0JCSAgYW1vZGUgPSBBRERSX0RJUl9JRFhfWDsKLQkJICBieXRlcyA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhbW9kZSA9IEFERFJfQUJTX0lEWF9YOwotCQkgIGJ5dGVzID0gMjsKLQkJfQotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0JICBlbHNlIGlmIChwdHJbMV0gPT0gJ3MnKQotCSAgICB7Ci0JICAgICAgYnl0ZXMgPSAxOwotCSAgICAgIGFtb2RlID0gQUREUl9TVEFDS19SRUw7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJ5dGVzID0gMTsKLQkgICAgICBpbW1lZGlhdGUxID0gaW1tZWRpYXRlOwotCSAgICAgIHB0ciA9IHBhcnNlX2V4cCAocHRyICsgMSk7Ci0JICAgICAgYW1vZGUgPSBBRERSX0JMT0NLX01PVkU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChpbmZvLT5hbW9kZSkKLQkgICAgewotCSAgICBjYXNlIEFERFJfUENfUkVMOgotCSAgICAgIGFtb2RlID0gQUREUl9QQ19SRUw7Ci0JICAgICAgYnl0ZXMgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFERFJfUENfUkVMX0xPTkc6Ci0JICAgICAgYW1vZGUgPSBBRERSX1BDX1JFTF9MT05HOwotCSAgICAgIGJ5dGVzID0gMjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBpZiAob3ZlcnJpZGVfbGVuID09IDEpCi0JCXsKLQkJICBhbW9kZSA9IEFERFJfRElSOwotCQkgIGJ5dGVzID0gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG92ZXJyaWRlX2xlbiA9PSAzKQotCQl7Ci0JCSAgYnl0ZXMgPSAzOwotCQkgIGFtb2RlID0gQUREUl9BQlNfTE9ORzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFtb2RlID0gQUREUl9BQlM7Ci0JCSAgYnl0ZXMgPSAyOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHN3aXRjaCAoYnl0ZXMpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIHN3aXRjaCAoZXhwcl9zaGlmdCkKLQl7Ci0JY2FzZSAwOgotCSAgaWYgKGFtb2RlID09IEFERFJfRElSKQotCXRjX2NvbnNfcmVsb2MgPSBSX1c2NV9EUDsKLQkgIGVsc2UKLXRjX2NvbnNfcmVsb2MgPSBSX1c2NV9BQlM4OwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgdGNfY29uc19yZWxvYyA9IFJfVzY1X0FCUzhTODsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIHRjX2NvbnNfcmVsb2MgPSBSX1c2NV9BQlM4UzE2OwotCSAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgc3dpdGNoIChleHByX3NoaWZ0KQotCXsKLQljYXNlIDA6Ci0JICB0Y19jb25zX3JlbG9jID0gUl9XNjVfQUJTMTY7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICB0Y19jb25zX3JlbG9jID0gUl9XNjVfQUJTMTZTODsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIHRjX2NvbnNfcmVsb2MgPSBSX1c2NV9BQlMxNlMxNjsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIFBhc3NlZCBhIHBvaW50ZXIgdG8gYSBsaXN0IG9mIG9wY29kZXMgd2hpY2ggdXNlIGRpZmZlcmVudAotICAgYWRkcmVzc2luZyBtb2RlcywgcmV0dXJuIHRoZSBvcGNvZGUgd2hpY2ggbWF0Y2hlcyB0aGUgb3Bjb2RlcwotICAgcHJvdmlkZWQKLSAqLwotCi1zdGF0aWMKLXN0cnVjdCBvcGluZm8gKgotZ2V0X3NwZWNpZmljIChvcGNvZGUpCi0gICAgIHN0cnVjdCBvcGluZm8gKm9wY29kZTsKLXsKLSAgaW50IG9jb2RlID0gb3Bjb2RlLT5jb2RlOwotCi0gIGZvciAoOyBvcGNvZGUtPmNvZGUgPT0gb2NvZGU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIGlmIChvcGNvZGUtPmFtb2RlID09IGFtb2RlKQotCXJldHVybiBvcGNvZGU7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1jaGVjayAob3BlcmFuZCwgbG93LCBoaWdoKQotICAgICBleHByZXNzaW9uUyAqb3BlcmFuZDsKLSAgICAgaW50IGxvdzsKLSAgICAgaW50IGhpZ2g7Ci17Ci0gIGlmIChvcGVyYW5kLT5YX29wICE9IE9fY29uc3RhbnQKLSAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlciA8IGxvdwotICAgICAgfHwgb3BlcmFuZC0+WF9hZGRfbnVtYmVyID4gaGlnaCkKLSAgICB7Ci0gICAgICBhc19iYWQgKCJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkIiwgbG93LCBoaWdoKTsKLSAgICB9Ci0gIHJldHVybiBvcGVyYW5kLT5YX2FkZF9udW1iZXI7Ci19Ci0KLQotc3RhdGljIGludCBsb2cyW10gPQotezAsIDAsIDEsIDAsIDJ9OwotCi0vKiBOb3cgd2Uga25vdyB3aGF0IHNvcnQgb2Ygb3Bjb2RlcyBpdCBpcywgbGV0cyBidWlsZCB0aGUgYnl0ZXMgLQotICovCi1zdGF0aWMgdm9pZAotYnVpbGRfTXl0ZXMgKG9wY29kZSkKLSAgICAgc3RydWN0IG9waW5mbyAqb3Bjb2RlOwotewotICBpbnQgc2l6ZTsKLSAgaW50IHR5cGU7Ci0gIGludCBwY3JlbDsKLSAgY2hhciAqb3V0cHV0OwotCi0gIGlmIChvcGNvZGUtPmFtb2RlID09IEFERFJfSU1QTElFRCkKLSAgICB7Ci0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDEpOwotICAgIH0KLSAgZWxzZSBpZiAob3Bjb2RlLT5hbW9kZSA9PSBBRERSX1BDX1JFTCkKLSAgICB7Ci0gICAgICBpbnQgdHlwZTsKLSAgICAgIC8qIFRoaXMgaXMgYSByZWxheGFibGUgaW5zbiwgc28gd2UgZG8gc29tZSBzcGVjaWFsIGhhbmRsaW5nICovCi0gICAgICB0eXBlID0gb3Bjb2RlLT52YWwgPT0gT1BfQlJBID8gVU5DT05EX0JSQU5DSCA6IENPTkRfQlJBTkNIOwotICAgICAgb3V0cHV0ID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQkJIG1kX3JlbGF4X3RhYmxlW0MgKHR5cGUsIFdPUkRfRElTUCldLnJseF9sZW5ndGgsCi0JCQkgbWRfcmVsYXhfdGFibGVbQyAodHlwZSwgQllURV9ESVNQKV0ucmx4X2xlbmd0aCwKLQkJCSBDICh0eXBlLCBVTkRFRl9CWVRFX0RJU1ApLAotCQkJIGltbWVkaWF0ZS5YX2FkZF9zeW1ib2wsCi0JCQkgaW1tZWRpYXRlLlhfYWRkX251bWJlciwKLQkJCSAwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9wY29kZS0+YW1vZGUpCi0JewotCSAgR0VUSU5GTyAoc2l6ZSwgdHlwZSwgcGNyZWwpOwotCX0KLQotICAgICAgLyogSWYgc29tZXRoaW5nIHNwZWNpYWwgd2FzIGRvbmUgaW4gdGhlCi0JIGV4cHJlc3Npb24gbW9kaWZ5IHRoZSByZWxvYyB0eXBlICovCi0gICAgICBpZiAodGNfY29uc19yZWxvYykKLQl7Ci0JICB0eXBlID0gdGNfY29uc19yZWxvYzsKLQl9Ci0KLQotCi0gICAgICAvKiAxIGJ5dGUgZm9yIHRoZSBvcGNvZGUgKyB0aGUgYnl0ZXMgZm9yIHRoZSBhZGRybW9kZSAqLwotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlIChzaXplICsgMSk7Ci0KLSAgICAgIGlmIChvcGNvZGUtPmFtb2RlID09IEFERFJfQkxPQ0tfTU9WRSkKLQl7Ci0JICAvKiBUd28gcmVsb2NzIGZvciB0aGlzIG9uZSAqLwotCSAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICAgICAgb3V0cHV0ICsgMSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkgICAgICAgMSwKLQkJICAgICAgICZpbW1lZGlhdGUsCi0JCSAgICAgICAwLAotCQkgICAgICAgUl9XNjVfQUJTOFMxNik7Ci0KLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIG91dHB1dCArIDIgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgIDEsCi0JCSAgICAgICAmaW1tZWRpYXRlMSwKLQkJICAgICAgIDAsCi0JCSAgICAgICBSX1c2NV9BQlM4UzE2KTsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlID49IDAKLQkgICAgICAgJiYgb3Bjb2RlLT5hbW9kZSAhPSBBRERSX0lNUExJRUQKLQkgICAgICAgJiYgb3Bjb2RlLT5hbW9kZSAhPSBBRERSX0FDQwotCSAgICAgICAmJiBvcGNvZGUtPmFtb2RlICE9IEFERFJfU1RBQ0spCi0JewotCSAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICAgICAgb3V0cHV0ICsgMSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkgICAgICAgc2l6ZSwKLQkJICAgICAgICZpbW1lZGlhdGUsCi0JCSAgICAgICBwY3JlbCwKLQkJICAgICAgIHR5cGUpOwotCX0KLSAgICB9Ci0gIG91dHB1dFswXSA9IG9wY29kZS0+dmFsOwotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0Ci0gICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLgotICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgdW5zaWduZWQgY2hhciAqb3Bfc3RhcnQ7Ci0gIHVuc2lnbmVkIGNoYXIgKm9wX2VuZDsKLSAgc3RydWN0IG9waW5mbyAqb3Bjb2RlOwotICBjaGFyIG5hbWVbMjBdOwotICBpbnQgbmxlbiA9IDA7Ci0gIGNoYXIgKnA7Ci0KLSAgLyogRHJvcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIC8qIGFsbCBvcGNvZGVzIGFyZSB0aHJlZSBsZXR0ZXJzICovCi0gIG5hbWVbMF0gPSBzdHJbMF07Ci0gIG5hbWVbMV0gPSBzdHJbMV07Ci0gIG5hbWVbMl0gPSBzdHJbMl07Ci0gIG5hbWVbM10gPSAwOwotCi0gIHRjX2NvbnNfcmVsb2MgPSAwOwotICBzdHIgKz0gMzsKLSAgb3Bjb2RlID0gKHN0cnVjdCBvcGluZm8gKikgaGFzaF9maW5kIChvcGNvZGVfaGFzaF9jb250cm9sLCBuYW1lKTsKLQotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ1bmtub3duIG9wY29kZSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKG9wY29kZS0+YW1vZGUgIT0gQUREUl9JTVBMSUVECi0gICAgICAmJiBvcGNvZGUtPmFtb2RlICE9IEFERFJfU1RBQ0spCi0gICAgewotICAgICAgZ2V0X29wZXJhbmRzIChvcGNvZGUsIHN0cik7Ci0gICAgICBvcGNvZGUgPSBnZXRfc3BlY2lmaWMgKG9wY29kZSk7Ci0gICAgfQotCi0gIGlmIChvcGNvZGUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBDb3VsZG4ndCBmaW5kIGFuIG9wY29kZSB3aGljaCBtYXRjaGVkIHRoZSBvcGVyYW5kcyAqLwotCi0KLSAgICAgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgxKTsKLQotICAgICAgd2hlcmVbMF0gPSAweDA7Ci0gICAgICB3aGVyZVsxXSA9IDB4MDsKLSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBvcGVyYW5kcyBmb3Igb3Bjb2RlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBidWlsZF9NeXRlcyAob3Bjb2RlKTsKLX0KLQotCi12b2lkCi1ERUZVTiAodGNfY3Jhd2xfc3ltYm9sX2NoYWluLCAoaGVhZGVycyksCi0gICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfY3Jhd2xfc3ltYm9sX2NoYWluIFxuIikpOwotfQotCi1zeW1ib2xTICoKLURFRlVOIChtZF91bmRlZmluZWRfc3ltYm9sLCAobmFtZSksCi0gICAgICAgY2hhciAqbmFtZSkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLURFRlVOICh0Y19oZWFkZXJzX2hvb2ssIChoZWFkZXJzKSwKLSAgICAgICBvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpCi17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19oZWFkZXJzX2hvb2sgXG4iKSk7Ci19Ci0KLS8qIFZhcmlvdXMgcm91dGluZXMgdG8ga2lsbCBvbmUgZGF5ICovCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLSAgY2hhciAqYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfTlRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkcyArIHByZWMgLSAxOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgKCp3b3JkUC0tKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYyxhKQotICAgIGludCBjOwotICAgIGNoYXIgKmE7Ci0KLXsKLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLXRjX05vdXRfZml4X3RvX2NoYXJzICgpCi17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19Ob3V0X2ZpeF90b19jaGFycyBcbiIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLS8qCi1jYWxsZWQgYWZ0ZXIgcmVsYXhpbmcsIGNoYW5nZSB0aGUgZnJhZ3Mgc28gdGhleSBrbm93IGhvdyBiaWcgdGhleSBhcmUKLSovCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBpbnQgZGlzcF9zaXplID0gMDsKLSAgaW50IGluc3Rfc2l6ZSA9IDA7Ci0gIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIChmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWwpOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgQyAoQ09ORF9CUkFOQ0gsIEJZVEVfRElTUCk6Ci0gICAgY2FzZSBDIChVTkNPTkRfQlJBTkNILCBCWVRFX0RJU1ApOgotICAgICAgZGlzcF9zaXplID0gMTsKLSAgICAgIGluc3Rfc2l6ZSA9IDE7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogY29uZCBicmFuY2hlcyB0byBhIGtub3duIDE2IGJpdCBkaXNwbGFjZW1lbnQgKi8KLSAgICBjYXNlIEMgKENPTkRfQlJBTkNILCBXT1JEX0RJU1ApOgotICAgICAgc3dpdGNoIChidWZmZXJbMF0pCi0JewotCWNhc2UgT1BfQkNDOgotCWNhc2UgT1BfQkNTOgotCWNhc2UgT1BfQkVROgotCWNhc2UgT1BfQk1JOgotCWNhc2UgT1BfQk5FOgotCWNhc2UgT1BfQlBMOgotCWNhc2UgT1BfQlZTOgotCWNhc2UgT1BfQlZDOgotCSAgLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiB0aGUgdGVzdCAqLwotCSAgYnVmZmVyWzBdIF49IDB4MjA7Ci0JICBidWZmZXJbMV0gPSAzOwkvKiBKdW1wIG92ZXIgZm9sbG93aW5nIGJybCAqLwotCSAgYnVmZmVyWzJdID0gT1BfQlJMOwotCSAgYnVmZmVyWzNdID0gMDsKLQkgIGJ1ZmZlcls0XSA9IDA7Ci0JICBkaXNwX3NpemUgPSAyOwotCSAgaW5zdF9zaXplID0gMzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEMgKFVOQ09ORF9CUkFOQ0gsIFdPUkRfRElTUCk6Ci0gICAgICAvKiBVbmNvbmRpdGlvbmFsIGJyYW5jaGVzIHRvIGEga25vd24gMTYgYml0IGRpc3BsYWNlbWVudCAqLwotCi0gICAgICBzd2l0Y2ggKGJ1ZmZlclswXSkKLQl7Ci0JY2FzZSBPUF9CUkE6Ci0JICBidWZmZXJbMF0gPSBPUF9CUkw7Ci0JICBkaXNwX3NpemUgPSAyOwotCSAgaW5zdF9zaXplID0gMTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICAgIC8qIGdvdCB0byBjcmVhdGUgYSBicmFuY2ggb3ZlciBhIHJlbG9jIGhlcmUgKi8KLSAgICBjYXNlIEMgKENPTkRfQlJBTkNILCBVTkRFRl9XT1JEX0RJU1ApOgotICAgICAgYnVmZmVyWzBdIF49IDB4MjA7CS8qIGludmVydCB0ZXN0ICovCi0gICAgICBidWZmZXJbMV0gPSAzOwotICAgICAgYnVmZmVyWzJdID0gT1BfQlJMOwotICAgICAgYnVmZmVyWzNdID0gMDsKLSAgICAgIGJ1ZmZlcls0XSA9IDA7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwKLQkgICAgICAgZnJhZ1AtPmZyX2ZpeCArIDMsCi0JICAgICAgIDQsCi0JICAgICAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsCi0JICAgICAgIDAsCi0JICAgICAgIFJfVzY1X1BDUjE2KTsKLQotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSBkaXNwX3NpemUgKyBpbnN0X3NpemU7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQyAoVU5DT05EX0JSQU5DSCwgVU5ERUZfV09SRF9ESVNQKToKLSAgICAgIGJ1ZmZlclswXSA9IE9QX0JSTDsKLSAgICAgIGJ1ZmZlclsxXSA9IDA7Ci0gICAgICBidWZmZXJbMl0gPSAwOwotICAgICAgZml4X25ldyAoZnJhZ1AsCi0JICAgICAgIGZyYWdQLT5mcl9maXggKyAxLAotCSAgICAgICA0LAotCSAgICAgICBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LAotCSAgICAgICAwLAotCSAgICAgICBSX1c2NV9QQ1IxNik7Ci0KLSAgICAgIGZyYWdQLT5mcl9maXggKz0gZGlzcF9zaXplICsgaW5zdF9zaXplOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBpZiAoaW5zdF9zaXplKQotICAgIHsKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbiAqLwotICAgICAgaW50IG5leHRfaW5zdCA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfYWRkcmVzcyArIGRpc3Bfc2l6ZSArIGluc3Rfc2l6ZTsKLSAgICAgIGludCB0YXJnX2FkZHIgPSAoU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpICsKLQkJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQpOwotICAgICAgaW50IGRpc3AgPSB0YXJnX2FkZHIgLSBuZXh0X2luc3Q7Ci0KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmZmVyICsgaW5zdF9zaXplLCBkaXNwLCBkaXNwX3NpemUpOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSBkaXNwX3NpemUgKyBpbnN0X3NpemU7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICB9Ci19Ci0KLQotdmFsdWVUCi1ERUZVTiAobWRfc2VjdGlvbl9hbGlnbiwgKHNlZywgc2l6ZSksCi0gICAgICAgc2VnVCBzZWcgQU5ECi0gICAgICAgdmFsdWVUIHNpemUpCi17Ci0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSAtIDEpCi0JICAmICgtMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSk7Ci0KLX0KLQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotewotICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIGludCBhZGRyID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlOwotCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZml4UC0+Znhfc2l6ZSA9PSAxKQotCWZpeFAtPmZ4X3JfdHlwZSA9IFJfVzY1X0FCUzg7Ci0gICAgICBlbHNlCi0JZml4UC0+Znhfcl90eXBlID0gUl9XNjVfQUJTMTY7Ci0gICAgfQotCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfVzY1X0FCUzhTMTY6Ci0gICAgICB2YWwgPj49IDg7Ci0gICAgY2FzZSBSX1c2NV9BQlM4Uzg6Ci0gICAgICB2YWwgPj49IDg7Ci0gICAgY2FzZSBSX1c2NV9BQlM4OgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1c2NV9BQlMxNlMxNjoKLSAgICAgIHZhbCA+Pj0gODsKLSAgICBjYXNlIFJfVzY1X0FCUzE2Uzg6Ci0gICAgICB2YWwgPj49IDg7Ci0gICAgY2FzZSBSX1c2NV9BQlMxNjoKLSAgICAgICpidWYrKyA9IHZhbCA+PiAwOwotICAgICAgKmJ1ZisrID0gdmFsID4+IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVzY1X0FCUzI0OgotICAgICAgKmJ1ZisrID0gdmFsID4+IDA7Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gODsKLSAgICAgICpidWYrKyA9IHZhbCA+PiAxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9XNjVfUENSODoKLSAgICAgICpidWYrKyA9IHZhbCAtIGFkZHIgLSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1c2NV9QQ1IxNjoKLSAgICAgIHZhbCA9IHZhbCAtIGFkZHIgLSAxOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgKmJ1ZisrID0gdmFsID4+IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVzY1X0RQOgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0vKiBQdXQgbnVtYmVyIGludG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIHVzZSwgbmJ5dGVzKQotICAgICBjaGFyICpwdHI7Ci0gICAgIHZhbHVlVCB1c2U7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKHB0ciwgdXNlLCBuYnl0ZXMpOwotfQotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBpbnQgZ2FwID0gZml4UC0+Znhfc2l6ZSArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyAtIDE7Ci0gIHJldHVybiBnYXA7Ci19Ci0KLXZvaWQKLXRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoeCkKLSAgICBzdHJ1Y3Qgc3ltYm9sICp4OwotewotfQotCi1zaG9ydAotdGNfY29mZl9maXgycnR5cGUgKGZpeF9wdHIpCi0gICAgIGZpeFMgKmZpeF9wdHI7Ci17Ci0gIHJldHVybiBmaXhfcHRyLT5meF9yX3R5cGU7Ci19Ci0KLXZvaWQKLXRjX3JlbG9jX21hbmdsZSAoZml4X3B0ciwgaW50ciwgYmFzZSkKLSAgICAgZml4UyAqZml4X3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRyOwotICAgICBiZmRfdm1hIGJhc2U7Ci0KLXsKLSAgc3ltYm9sUyAqc3ltYm9sX3B0cjsKLQotICBzeW1ib2xfcHRyID0gZml4X3B0ci0+ZnhfYWRkc3k7Ci0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIGF0dGFjaGVkIHRvIGEgc3ltYm9sIHRoZW4gaXQncyBvawotICAgICB0byBvdXRwdXQgaXQgKi8KLSAgaWYgKGZpeF9wdHItPmZ4X3JfdHlwZSA9PSBSRUxPQ18zMikKLSAgICB7Ci0gICAgICAvKiBjb25zIGxpa2VzIHRvIGNyZWF0ZSByZWxvYzMyJ3Mgd2hhdGV2ZXIgdGhlIHNpemUgb2YgdGhlIHJlbG9jLi4KLSAgICAgICAqLwotICAgICAgc3dpdGNoIChmaXhfcHRyLT5meF9zaXplKQotCXsKLQljYXNlIDI6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX0lNTTE2OwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgaW50ci0+cl90eXBlID0gUl9JTU04OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZml4X3B0ci0+Znhfc2l6ZSA9PSA0KQotCWludHItPnJfdHlwZSA9IFJfVzY1X0FCUzI0OwotICAgICAgZWxzZQotCWludHItPnJfdHlwZSA9IGZpeF9wdHItPmZ4X3JfdHlwZTsKLSAgICB9Ci0KLSAgaW50ci0+cl92YWRkciA9IGZpeF9wdHItPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhfcHRyLT5meF93aGVyZSArIGJhc2U7Ci0gIGludHItPnJfb2Zmc2V0ID0gZml4X3B0ci0+Znhfb2Zmc2V0OwotCi0gIC8qIFR1cm4gdGhlIHNlZ21lbnQgb2YgdGhlIHN5bWJvbCBpbnRvIGFuIG9mZnNldC4gICovCi0gIGlmIChzeW1ib2xfcHRyKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKmRvdDsKLQotICAgICAgZG90ID0gc2VnbWVudF9pbmZvW1NfR0VUX1NFR01FTlQgKHN5bWJvbF9wdHIpXS5kb3Q7Ci0gICAgICBpZiAoZG90KQotCXsKLQkgIGludHItPnJfb2Zmc2V0ICs9IFNfR0VUX1ZBTFVFIChzeW1ib2xfcHRyKTsKLQkgIGludHItPnJfc3ltbmR4ID0gZG90LT5zeV9udW1iZXI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludHItPnJfc3ltbmR4ID0gc3ltYm9sX3B0ci0+c3lfbnVtYmVyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRyLT5yX3N5bW5keCA9IC0xOwotICAgIH0KLX0KLQotaW50Ci10Y19jb2ZmX3NpemVtYWNoZGVwIChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgcmV0dXJuIG1kX3JlbGF4X3RhYmxlW2ZyYWctPmZyX3N1YnR5cGVdLnJseF9sZW5ndGg7Ci19Ci0KLQotCi0KLQotLyoKLWNhbGxlZCBqdXN0IGJlZm9yZSBhZGRyZXNzIHJlbGF4YXRpb24sIHJldHVybiB0aGUgbGVuZ3RoCi1ieSB3aGljaCBhIGZyYWdtZW50IG11c3QgZ3JvdyB0byByZWFjaCBpdCdzIGRlc3RpbmF0aW9uCi0qLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnRfdHlwZTsKLXsKLSAgaW50IHdoYXQgPSBHRVRfV0hBVCAoZnJhZ1AtPmZyX3N1YnR5cGUpOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIEMgKENPTkRfQlJBTkNILCBVTkRFRl9CWVRFX0RJU1ApOgotICAgIGNhc2UgQyAoVU5DT05EX0JSQU5DSCwgVU5ERUZfQllURV9ESVNQKToKLSAgICAgIC8qIHVzZWQgdG8gYmUgYSBicmFuY2ggdG8gc29tZXdoZXJlIHdoaWNoIHdhcyB1bmtub3duICovCi0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIC8qIEdvdCBhIHN5bWJvbCBhbmQgaXQncyBkZWZpbmVkIGluIHRoaXMgc2VnbWVudCwgYmVjb21lIGJ5dGUKLQkgc2l6ZWQgLSBtYXliZSBpdCB3aWxsIGZpeCB1cCAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDICh3aGF0LCBCWVRFX0RJU1ApOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIEJZVEVfRElTUCldLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEl0cyBnb3QgYSBzZWdtZW50LCBidXQgaXRzIG5vdCBvdXJzLCBzbyBpdCB3aWxsIGFsd2F5cyBiZSBsb25nICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIFVOREVGX1dPUkRfRElTUCk7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aDsKLQkgIHJldHVybiBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoOwotCX0KLSAgICB9Ci0gIHJldHVybiBmcmFnUC0+ZnJfdmFyOwotfQotCi0KLQotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0jZGVmaW5lIE9QVElPTl9SRUxBWCAoT1BUSU9OX01EX0JBU0UpCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotCi19Ci0KLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdzY1LmggYi9nYXMvY29uZmlnL3RjLXc2NS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzk0YWQyLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdzY1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtdzY1LmgKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jZGVmaW5lIFRDX1c2NQotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2lmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGludGVybmFsX3JlbG9jOwotI2VuZGlmCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0vKiBUaGlzIG1hY3JvIHRyYW5zbGF0ZXMgYmV0d2VlbiBhbiBpbnRlcm5hbCBmaXggYW5kIGFuIGNvZmYgcmVsb2MgdHlwZSAqLwotI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShmaXhQKSB0Y19jb2ZmX2ZpeDJydHlwZShmaXhQKQotCi0jZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX3c2NQotI2RlZmluZSBDT0ZGX01BR0lDIDB4NjUwMAotCi0jZGVmaW5lIElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTCi0KLSNkZWZpbmUgVENfUkVMT0NfTUFOR0xFKHMsYSxiLGMpIHRjX3JlbG9jX21hbmdsZShhLGIsYykKLWV4dGVybiB2b2lkIHRjX3JlbG9jX21hbmdsZQotICBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBiZmRfdm1hKSk7Ci0KLSNkZWZpbmUgRE9fTk9UX1NUUklQIDAKLSNkZWZpbmUgTElTVElOR19IRUFERVIgIlc2NTgxNiBHQVMgIgotI2RlZmluZSBORUVEX0ZYX1JfVFlQRSAxCi0jZGVmaW5lIFJFTE9DXzMyIDEyMzQKLQotI2RlZmluZSBUQ19DT0ZGX1NJWkVNQUNIREVQKGZyYWcpIHRjX2NvZmZfc2l6ZW1hY2hkZXAoZnJhZykKLSNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSB3NjVfZXhwcmVzc2lvbiAoRVhQLCBOQllURVMpCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICgxKQotI2RlZmluZSBUQ19DT05TX1JFTE9DIHRjX2NvbnNfcmVsb2MKLSNkZWZpbmUgRE9OVF9PVkVSRkxPVwotaW50IHRjX2NvbnNfcmVsb2M7Ci0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0vKiBlbmQgb2YgdGMtdzY1LmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtejhrLmMgYi9nYXMvY29uZmlnL3RjLXo4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjExMzQxLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtejhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTg5ICswLDAgQEAKLS8qIHRjLXo4ay5jIC0tIEFzc2VtYmxlIGNvZGUgZm9yIHRoZSBaaWxvZyBaODAwbgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICBXcml0dGVuIEJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gIHNhY0BjeWdudXMuY29tCi0gICovCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJvcGNvZGVzL3o4ay1vcGMuaCIKLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPQoteychJywgMH07Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPQoteyc7JywgMH07Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0KLXsnIycsIDB9OwotCi1leHRlcm4gaW50IG1hY2hpbmU7Ci1leHRlcm4gaW50IGNvZmZfZmxhZ3M7Ci1pbnQgc2VnbWVudGVkX21vZGU7Ci1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZTsKLQotLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLSAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgIEludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCi0gICAqLwotCi12b2lkIGNvbnMgKCk7Ci0KLXZvaWQKLXNfc2VnbSAoKQotewotICBzZWdtZW50ZWRfbW9kZSA9IDE7Ci0gIG1hY2hpbmUgPSBiZmRfbWFjaF96ODAwMTsKLSAgY29mZl9mbGFncyA9IEZfWjgwMDE7Ci19Ci0KLXZvaWQKLXNfdW5zZWcgKCkKLXsKLSAgc2VnbWVudGVkX21vZGUgPSAwOwotICBtYWNoaW5lID0gYmZkX21hY2hfejgwMDI7Ci0gIGNvZmZfZmxhZ3MgPSBGX1o4MDAyOwotfQotCi1zdGF0aWMKLXZvaWQKLWV2ZW4gKCkKLXsKLSAgZnJhZ19hbGlnbiAoMSwgMCwgMCk7Ci0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDEpOwotfQotCi12b2lkIG9ial9jb2ZmX3NlY3Rpb24gKCk7Ci0KLWludAotdG9oZXggKGMpCi0gICAgIGludCBjOwotewotICBpZiAoaXNkaWdpdCAoYykpCi0gICAgcmV0dXJuIGMgLSAnMCc7Ci0gIGlmIChpc2xvd2VyIChjKSkKLSAgICByZXR1cm4gYyAtICdhJyArIDEwOwotICByZXR1cm4gYyAtICdBJyArIDEwOwotfQotCi12b2lkCi1zdmFsICgpCi17Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCcnKQotICAgIHsKLSAgICAgIGludCBjOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgd2hpbGUgKGMgIT0gJ1wnJykKLQl7Ci0JICBpZiAoYyA9PSAnJScpCi0JICAgIHsKLQkgICAgICBjID0gKHRvaGV4IChpbnB1dF9saW5lX3BvaW50ZXJbMF0pIDw8IDQpCi0JCXwgdG9oZXggKGlucHV0X2xpbmVfcG9pbnRlclsxXSk7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0JICAgIH0KLQkgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoYyk7Ci0JICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCX0KLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotCi19Ci1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImludCIsIGNvbnMsIDJ9LAotICB7ImRhdGEuYiIsIGNvbnMsIDF9LAotICB7ImRhdGEudyIsIGNvbnMsIDJ9LAotICB7ImRhdGEubCIsIGNvbnMsIDR9LAotICB7ImZvcm0iLCBsaXN0aW5nX3BzaXplLCAwfSwKLSAgeyJoZWFkaW5nIiwgbGlzdGluZ190aXRsZSwgMH0sCi0gIHsiaW1wb3J0Iiwgc19pZ25vcmUsIDB9LAotICB7InBhZ2UiLCBsaXN0aW5nX2VqZWN0LCAwfSwKLSAgeyJwcm9ncmFtIiwgc19pZ25vcmUsIDB9LAotICB7Ino4MDAxIiwgc19zZWdtLCAwfSwKLSAgeyJ6ODAwMiIsIHNfdW5zZWcsIDB9LAotCi0KLSAgeyJzZWdtIiwgc19zZWdtLCAwfSwKLSAgeyJ1bnNlZ20iLCBzX3Vuc2VnLCAwfSwKLSAgeyJ1bnNlZyIsIHNfdW5zZWcsIDB9LAotICB7Im5hbWUiLCBzX2FwcF9maWxlLCAwfSwKLSAgeyJnbG9iYWwiLCBzX2dsb2JsLCAwfSwKLSAgeyJ3dmFsIiwgY29ucywgMn0sCi0gIHsibHZhbCIsIGNvbnMsIDR9LAotICB7ImJ2YWwiLCBjb25zLCAxfSwKLSAgeyJzdmFsIiwgc3ZhbCwgMH0sCi0gIHsicnNlY3QiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0Iiwgb2JqX2NvZmZfc2VjdGlvbiwgMH0sCi0gIHsiYmxvY2siLCBzX3NwYWNlLCAwfSwKLSAgeyJldmVuIiwgZXZlbiwgMH0sCi0gIHswLCAwLCAwfQotfTsKLQotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wY29kZV9oYXNoX2NvbnRyb2w7CS8qIE9wY29kZSBtbmVtb25pY3MgKi8KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgb3Bjb2RlX2VudHJ5X3R5cGUgKm9wY29kZTsKLSAgY2hhciAqcHJldl9uYW1lID0gIiI7Ci0gIGludCBpZHggPSAwOwotCi0gIG9wY29kZV9oYXNoX2NvbnRyb2wgPSBoYXNoX25ldyAoKTsKLQotICBmb3IgKG9wY29kZSA9IHo4a190YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICAvKiBPbmx5IGVudGVyIHVuaXF1ZSBjb2RlcyBpbnRvIHRoZSB0YWJsZSAqLwotICAgICAgY2hhciAqc3JjID0gb3Bjb2RlLT5uYW1lOwotCi0gICAgICBpZiAoc3RyY21wIChvcGNvZGUtPm5hbWUsIHByZXZfbmFtZSkpCi0JewotCSAgaGFzaF9pbnNlcnQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG9wY29kZS0+bmFtZSwgKGNoYXIgKikgb3Bjb2RlKTsKLQkgIGlkeCsrOwotCX0KLSAgICAgIG9wY29kZS0+aWR4ID0gaWR4OwotICAgICAgcHJldl9uYW1lID0gb3Bjb2RlLT5uYW1lOwotICAgIH0KLQotICAvKiBkZWZhdWx0IHRvIHo4MDAyICovCi0gIHNfdW5zZWcgKCk7Ci0KLSAgLyogaW5zZXJ0IHRoZSBwc2V1ZG8gb3BzIHRvbyAqLwotICBmb3IgKGlkeCA9IDA7IG1kX3BzZXVkb190YWJsZVtpZHhdLnBvY19uYW1lOyBpZHgrKykKLSAgICB7Ci0gICAgICBvcGNvZGVfZW50cnlfdHlwZSAqZmFrZV9vcGNvZGU7Ci0gICAgICBmYWtlX29wY29kZSA9IChvcGNvZGVfZW50cnlfdHlwZSAqKSBtYWxsb2MgKHNpemVvZiAob3Bjb2RlX2VudHJ5X3R5cGUpKTsKLSAgICAgIGZha2Vfb3Bjb2RlLT5uYW1lID0gbWRfcHNldWRvX3RhYmxlW2lkeF0ucG9jX25hbWUsCi0JZmFrZV9vcGNvZGUtPmZ1bmMgPSAodm9pZCAqKSAobWRfcHNldWRvX3RhYmxlICsgaWR4KTsKLSAgICAgIGZha2Vfb3Bjb2RlLT5vcGNvZGUgPSAyNTA7Ci0gICAgICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgZmFrZV9vcGNvZGUtPm5hbWUsIGZha2Vfb3Bjb2RlKTsKLSAgICB9Ci0KLSAgbGlua3JlbGF4ID0gMTsKLX0KLQotc3RydWN0IHo4a19leHAKLXsKLSAgY2hhciAqZV9iZWc7Ci0gIGNoYXIgKmVfZW5kOwotICBleHByZXNzaW9uUyBlX2V4cDsKLX07Ci10eXBlZGVmIHN0cnVjdCB6OGtfb3AKLXsKLSAgY2hhciByZWdzaXplOwkJCS8qICdiJywndycsJ3InLCdxJyAqLwotICB1bnNpZ25lZCBpbnQgcmVnOwkJLyogMC4uMTUgKi8KLQotICBpbnQgbW9kZTsKLQotICB1bnNpZ25lZCBpbnQgeF9yZWc7CQkvKiBhbnkgb3RoZXIgcmVnaXN0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2RlICovCi0gIGV4cHJlc3Npb25TIGV4cDsJCS8qIGFueSBleHByZXNzaW9uICovCi19Ci0KLW9wX3R5cGU7Ci0KLXN0YXRpYyBleHByZXNzaW9uUyAqZGFfb3BlcmFuZDsKLXN0YXRpYyBleHByZXNzaW9uUyAqaW1tX29wZXJhbmQ7Ci0KLWludCByZWdbMTZdOwotaW50IHRoZV9jYzsKLWludCB0aGVfY3RybDsKLWludCB0aGVfZmxhZ3M7Ci1pbnQgdGhlX2ludGVycnVwdDsKLQotY2hhciAqCi1ERUZVTiAod2hhdHJlZywgKHJlZywgc3JjKSwKLSAgICAgICBpbnQgKnJlZyBBTkQKLSAgICAgICBjaGFyICpzcmMpCi17Ci0gIGlmIChpc2RpZ2l0IChzcmNbMV0pKQotICAgIHsKLSAgICAgICpyZWcgPSAoc3JjWzBdIC0gJzAnKSAqIDEwICsgc3JjWzFdIC0gJzAnOwotICAgICAgcmV0dXJuIHNyYyArIDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKnJlZyA9IChzcmNbMF0gLSAnMCcpOwotICAgICAgcmV0dXJuIHNyYyArIDE7Ci0gICAgfQotfQotCi0vKgotICBwYXJzZSBvcGVyYW5kcwotCi0gIHJoMC1yaDcsIHJsMC1ybDcKLSAgcjAtcjE1Ci0gIHJyMC1ycjE0Ci0gIHJxMC0tcnExMgotICBXUkVHIHIwLHIxLHIyLHIzLHI0LHI1LHI2LHI3LGZwLHNwCi0gIHIwbCxyMGgsLi5yN2wscjdoCi0gIEBXUkVHCi0gIEBXUkVHKwotICBALVdSRUcKLSAgI2NvbnN0Ci0KLSAgKi8KLQotLyogdHJ5IGFuZCBwYXJzZSBhIHJlZyBuYW1lLCByZXR1cm5zIG51bWJlciBvZiBjaGFycyBjb25zdW1lZCAqLwotY2hhciAqCi1ERUZVTiAocGFyc2VfcmVnLCAoc3JjLCBtb2RlLCByZWcpLAotICAgICAgIGNoYXIgKnNyYyBBTkQKLSAgICAgICBpbnQgKm1vZGUgQU5ECi0gICAgICAgdW5zaWduZWQgaW50ICpyZWcpCi17Ci0gIGNoYXIgKnJlcyA9IDA7Ci0gIGNoYXIgcmVnbm87Ci0KLSAgaWYgKHNyY1swXSA9PSAncycgJiYgc3JjWzFdID09ICdwJykKLSAgICB7Ci0gICAgICBpZiAoc2VnbWVudGVkX21vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAqbW9kZSA9IENMQVNTX1JFR19MT05HOwotICAgICAgICAgICpyZWcgPSAxNDsKLSAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgKm1vZGUgPSBDTEFTU19SRUdfV09SRDsKLSAgICAgICAgICAqcmVnID0gMTU7Ci0gICAgICAgIH0KLSAgICAgIHJldHVybiBzcmMgKyAyOwotICAgIH0KLSAgaWYgKHNyY1swXSA9PSAncicpCi0gICAgewotICAgICAgaWYgKHNyY1sxXSA9PSAncicpCi0gICAgICAgIHsKLSAgICAgICAgICAqbW9kZSA9IENMQVNTX1JFR19MT05HOwotICAgICAgICAgIHJlcyA9IHdoYXRyZWcgKHJlZywgc3JjICsgMik7Ci0JICByZWdubyA9ICpyZWc7Ci0JICBpZiAocmVnbm8gPiAxNCkKLSAgICAgICAgICAJYXNfd2FybiAoXygicmVnaXN0ZXIgcnIlZCwgb3V0IG9mIHJhbmdlLiIpLHJlZ25vKTsKLSAgICAgICAgfQotICAgICAgZWxzZSBpZiAoc3JjWzFdID09ICdoJykKLSAgICAgICAgewotICAgICAgICAgICptb2RlID0gQ0xBU1NfUkVHX0JZVEU7Ci0gICAgICAgICAgcmVzID0gd2hhdHJlZyAocmVnLCBzcmMgKyAyKTsKLQkgIHJlZ25vID0gKnJlZzsKLQkgIGlmIChyZWdubyA+IDcpCi0gICAgICAgICAgCWFzX3dhcm4gKF8oInJlZ2lzdGVyIHJoJWQsIG91dCBvZiByYW5nZS4iKSxyZWdubyk7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNyY1sxXSA9PSAnbCcpCi0gICAgICAgIHsKLSAgICAgICAgICAqbW9kZSA9IENMQVNTX1JFR19CWVRFOwotICAgICAgICAgIHJlcyA9IHdoYXRyZWcgKHJlZywgc3JjICsgMik7Ci0JICByZWdubyA9ICpyZWc7Ci0JICBpZiAocmVnbm8gPiA3KQotICAgICAgICAgIAlhc193YXJuIChfKCJyZWdpc3RlciBybCVkLCBvdXQgb2YgcmFuZ2UuIikscmVnbm8pOwotICAgICAgICAgICpyZWcgKz0gODsKLSAgICAgICAgfQotICAgICAgZWxzZSBpZiAoc3JjWzFdID09ICdxJykKLSAgICAgICAgewotICAgICAgICAgICptb2RlID0gQ0xBU1NfUkVHX1FVQUQ7Ci0gICAgICAgICAgcmVzID0gd2hhdHJlZyAocmVnLCBzcmMgKyAyKTsKLQkgIHJlZ25vID0gKnJlZzsKLQkgIGlmIChyZWdubyA+IDEyKQotICAgICAgICAgIAlhc193YXJuIChfKCJyZWdpc3RlciBycSVkLCBvdXQgb2YgcmFuZ2UuIikscmVnbm8pOwotICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAqbW9kZSA9IENMQVNTX1JFR19XT1JEOwotICAgICAgICAgIHJlcyA9IHdoYXRyZWcgKHJlZywgc3JjICsgMSk7Ci0JICByZWdubyA9ICpyZWc7Ci0JICBpZiAocmVnbm8gPiAxNSkKLSAgICAgICAgICAJYXNfd2FybiAoXygicmVnaXN0ZXIgciVkLCBvdXQgb2YgcmFuZ2UuIikscmVnbm8pOwotICAgICAgICB9Ci0gICAgfQotICByZXR1cm4gcmVzOwotCi19Ci0KLWNoYXIgKgotREVGVU4gKHBhcnNlX2V4cCwgKHMsIG9wKSwKLSAgICAgICBjaGFyICpzIEFORAotICAgICAgIGV4cHJlc3Npb25TICogb3ApCi17Ci0gIGNoYXIgKnNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoYXIgKm5ldzsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotICBleHByZXNzaW9uIChvcCk7Ci0gIGlmIChvcC0+WF9vcCA9PSBPX2Fic2VudCkKLSAgICBhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKLSAgbmV3ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICByZXR1cm4gbmV3OwotfQotCi0vKiBUaGUgbWFueSBmb3JtcyBvZiBvcGVyYW5kOgotCi0gICA8cmI+Ci0gICA8cj4KLSAgIDxycj4KLSAgIDxycT4KLSAgIEByCi0gICAjZXhwCi0gICBleHAKLSAgIGV4cChyKQotICAgcigjZXhwKQotICAgcihyKQotCi0KLQotICAgKi8KLQotc3RhdGljCi1jaGFyICoKLURFRlVOIChjaGVja2ZvciwgKHB0ciwgd2hhdCksCi0gICAgICAgY2hhciAqcHRyIEFORAotICAgICAgIGNoYXIgd2hhdCkKLXsKLSAgaWYgKCpwdHIgPT0gd2hhdCkKLSAgICBwdHIrKzsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgJWMiKSwgd2hhdCk7Ci0gICAgfQotICByZXR1cm4gcHRyOwotfQotCi0vKiBNYWtlIHN1cmUgdGhlIG1vZGUgc3VwcGxpZWQgaXMgdGhlIHNpemUgb2YgYSB3b3JkICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHJlZ3dvcmQsIChtb2RlLCBzdHJpbmcpLAotICAgICAgIGludCBtb2RlIEFORAotICAgICAgIGNoYXIgKnN0cmluZykKLXsKLSAgaW50IG9rOwotCi0gIG9rID0gQ0xBU1NfUkVHX1dPUkQ7Ci0gIGlmIChvayAhPSBtb2RlKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygicmVnaXN0ZXIgaXMgd3Jvbmcgc2l6ZSBmb3IgYSB3b3JkICVzIiksIHN0cmluZyk7Ci0gICAgfQotfQotCi0vKiBNYWtlIHN1cmUgdGhlIG1vZGUgc3VwcGxpZWQgaXMgdGhlIHNpemUgb2YgYW4gYWRkcmVzcyAqLwotc3RhdGljIHZvaWQKLURFRlVOIChyZWdhZGRyLCAobW9kZSwgc3RyaW5nKSwKLSAgICAgICBpbnQgbW9kZSBBTkQKLSAgICAgICBjaGFyICpzdHJpbmcpCi17Ci0gIGludCBvazsKLQotICBvayA9IHNlZ21lbnRlZF9tb2RlID8gQ0xBU1NfUkVHX0xPTkcgOiBDTEFTU19SRUdfV09SRDsKLSAgaWYgKG9rICE9IG1vZGUpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJyZWdpc3RlciBpcyB3cm9uZyBzaXplIGZvciBhZGRyZXNzICVzIiksIHN0cmluZyk7Ci0gICAgfQotfQotCi1zdHJ1Y3QgY3RybF9uYW1lcwotewotICAgaW50IHZhbHVlOwotICAgY2hhciAqbmFtZTsKLX07Ci0KLXN0cnVjdCBjdHJsX25hbWVzIGN0cmxfdGFibGVbXSA9Ci17Ci0gICAweDIsICJmY3ciLAotICAgMFgzLCAicmVmcmVzaCIsCi0gICAweDQsICJwc2Fwc2VnIiwKLSAgIDB4NSwgInBzYXBvZmYiLAotICAgMHg1LCAicHNhcCIsCi0gICAweDYsICJuc3BzZWciLAotICAgMHg3LCAibnNwb2ZmIiwKLSAgIDB4NywgIm5zcCIsCi0gICAwLCAwCi19OwotICAgCi1zdGF0aWMgdm9pZAotREVGVU4gKGdldF9jdHJsX29wZXJhbmQsIChwdHIsIG1vZGUsIGRzdCksCi0gICAgICAgY2hhciAqKnB0ciBBTkQKLSAgICAgICBzdHJ1Y3QgejhrX29wICptb2RlIEFORAotICAgICAgIHVuc2lnbmVkIGludCBkc3QpCi17Ci0gIGNoYXIgKnNyYyA9ICpwdHI7Ci0gIGludCByOwotICBpbnQgaTsKLQotICB3aGlsZSAoKnNyYyA9PSAnICcpCi0gICAgc3JjKys7Ci0KLSAgbW9kZS0+bW9kZSA9IENMQVNTX0NUUkw7Ci0gIGZvciAoaSA9IDA7IGN0cmxfdGFibGVbaV0ubmFtZTsgaSsrKQotICAgIHsKLSAgICAgIGludCBqOwotCi0gICAgICBmb3IgKGogPSAwOyBjdHJsX3RhYmxlW2ldLm5hbWVbal07IGorKykKLSAgICAgICAgewotICAgICAgICAgIGlmIChjdHJsX3RhYmxlW2ldLm5hbWVbal0gIT0gc3JjW2pdKQotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgICB0aGVfY3RybCA9IGN0cmxfdGFibGVbaV0udmFsdWU7Ci0gICAgICAqcHRyID0gc3JjICsgajsKLSAgICAgIHJldHVybjsKLSAgICBmYWlsOjsKLSAgICB9Ci0gIHRoZV9jdHJsID0gMDsKLSAgcmV0dXJuOwotfQotCi1zdHJ1Y3QgZmxhZ19uYW1lcwotewotICBpbnQgdmFsdWU7Ci0gIGNoYXIgKm5hbWU7Ci0KLX07Ci0KLXN0cnVjdCBmbGFnX25hbWVzIGZsYWdfdGFibGVbXSA9Ci17Ci0gIDB4MSwgInAiLAotICAweDEsICJ2IiwKLSAgMHgyLCAicyIsCi0gIDB4NCwgInoiLAotICAweDgsICJjIiwKLSAgMHgwLCAiKyIsCi0gIDAsIDAKLX07Ci0KLXN0YXRpYyB2b2lkCi1ERUZVTiAoZ2V0X2ZsYWdzX29wZXJhbmQsIChwdHIsIG1vZGUsIGRzdCksCi0gICAgICAgY2hhciAqKnB0ciBBTkQKLSAgICAgICBzdHJ1Y3QgejhrX29wICptb2RlIEFORAotICAgICAgIHVuc2lnbmVkIGludCBkc3QpCi17Ci0gIGNoYXIgKnNyYyA9ICpwdHI7Ci0gIGludCByOwotICBpbnQgaTsKLSAgaW50IGo7Ci0KLSAgd2hpbGUgKCpzcmMgPT0gJyAnKQotICAgIHNyYysrOwotCi0gIG1vZGUtPm1vZGUgPSBDTEFTU19GTEFHUzsKLSAgdGhlX2ZsYWdzID0gMDsKLSAgZm9yIChqID0gMDsgaiA8PSA5OyBqKyspCi0gICAgewotICAgICBpZiAoIXNyY1tqXSkKLQlnb3RvIGRvbmU7Ci0gICAgIGZvciAoaSA9IDA7IGZsYWdfdGFibGVbaV0ubmFtZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGZsYWdfdGFibGVbaV0ubmFtZVswXSA9PSBzcmNbal0pCi0JCXsKLQkgICAgICAgIHRoZV9mbGFncyA9IHRoZV9mbGFncyB8IGZsYWdfdGFibGVbaV0udmFsdWU7Ci0JCWdvdG8gbWF0Y2g7Ci0JCX0KLSAgICAgICAgfQotICAgICAgZ290byBkb25lOwotICAgIG1hdGNoOgotICAgICA7Ci0gICAgfQotICBkb25lOgotICAqcHRyID0gc3JjICsgajsKLSAgcmV0dXJuOwotfQotCi0KLXN0cnVjdCBpbnRlcnJ1cHRfbmFtZXMKLXsKLSAgaW50IHZhbHVlOwotICBjaGFyICpuYW1lOwotCi19OwotCi1zdHJ1Y3QgaW50ZXJydXB0X25hbWVzIGludHJfdGFibGVbXSA9Ci17Ci0gIDB4MSwgIm52aSIsCi0gIDB4MiwgInZpIiwKLSAgMHgzLCAiYm90aCIsCi0gIDB4MywgImFsbCIsCi0gIDAsIDAKLX07Ci0KLXN0YXRpYyB2b2lkCi1ERUZVTiAoZ2V0X2ludGVycnVwdF9vcGVyYW5kLCAocHRyLCBtb2RlLCBkc3QpLAotICAgICAgIGNoYXIgKipwdHIgQU5ECi0gICAgICAgc3RydWN0IHo4a19vcCAqbW9kZSBBTkQKLSAgICAgICB1bnNpZ25lZCBpbnQgZHN0KQotewotICBjaGFyICpzcmMgPSAqcHRyOwotICBpbnQgcjsKLSAgaW50IGk7Ci0KLSAgd2hpbGUgKCpzcmMgPT0gJyAnKQotICAgIHNyYysrOwotCi0gIG1vZGUtPm1vZGUgPSBDTEFTU19JTU07Ci0gIGZvciAoaSA9IDA7IGludHJfdGFibGVbaV0ubmFtZTsgaSsrKQotICAgIHsKLSAgICAgIGludCBqOwotCi0gICAgICBmb3IgKGogPSAwOyBpbnRyX3RhYmxlW2ldLm5hbWVbal07IGorKykKLSAgICAgICAgewotICAgICAgICAgIGlmIChpbnRyX3RhYmxlW2ldLm5hbWVbal0gIT0gc3JjW2pdKQotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgICB0aGVfaW50ZXJydXB0ID0gaW50cl90YWJsZVtpXS52YWx1ZTsKLSAgICAgICpwdHIgPSBzcmMgKyBqOwotICAgICAgcmV0dXJuOwotICAgIGZhaWw6OwotICAgIH0KLSAgdGhlX2ludGVycnVwdCA9IDB4MDsKLSAgcmV0dXJuOwotfQotCi1zdHJ1Y3QgY2NfbmFtZXMKLXsKLSAgaW50IHZhbHVlOwotICBjaGFyICpuYW1lOwotCi19OwotCi1zdHJ1Y3QgY2NfbmFtZXMgdGFibGVbXSA9Ci17Ci0gIDB4MCwgImYiLAotICAweDEsICJsdCIsCi0gIDB4MiwgImxlIiwKLSAgMHgzLCAidWxlIiwKLSAgMHg0LCAib3YiLAotICAweDQsICJwZSIsCi0gIDB4NSwgIm1pIiwKLSAgMHg2LCAiZXEiLAotICAweDYsICJ6IiwKLSAgMHg3LCAiYyIsCi0gIDB4NywgInVsdCIsCi0gIDB4OCwgInQiLAotICAweDksICJnZSIsCi0gIDB4YSwgImd0IiwKLSAgMHhiLCAidWd0IiwKLSAgMHhjLCAibm92IiwKLSAgMHhjLCAicG8iLAotICAweGQsICJwbCIsCi0gIDB4ZSwgIm5lIiwKLSAgMHhlLCAibnoiLAotICAweGYsICJuYyIsCi0gIDB4ZiwgInVnZSIsCi0gIDAsIDAKLX07Ci0KLXN0YXRpYyB2b2lkCi1ERUZVTiAoZ2V0X2NjX29wZXJhbmQsIChwdHIsIG1vZGUsIGRzdCksCi0gICAgICAgY2hhciAqKnB0ciBBTkQKLSAgICAgICBzdHJ1Y3QgejhrX29wICptb2RlIEFORAotICAgICAgIHVuc2lnbmVkIGludCBkc3QpCi17Ci0gIGNoYXIgKnNyYyA9ICpwdHI7Ci0gIGludCByOwotICBpbnQgaTsKLQotICB3aGlsZSAoKnNyYyA9PSAnICcpCi0gICAgc3JjKys7Ci0KLSAgbW9kZS0+bW9kZSA9IENMQVNTX0NDOwotICBmb3IgKGkgPSAwOyB0YWJsZVtpXS5uYW1lOyBpKyspCi0gICAgewotICAgICAgaW50IGo7Ci0KLSAgICAgIGZvciAoaiA9IDA7IHRhYmxlW2ldLm5hbWVbal07IGorKykKLQl7Ci0JICBpZiAodGFibGVbaV0ubmFtZVtqXSAhPSBzcmNbal0pCi0JICAgIGdvdG8gZmFpbDsKLQl9Ci0gICAgICB0aGVfY2MgPSB0YWJsZVtpXS52YWx1ZTsKLSAgICAgICpwdHIgPSBzcmMgKyBqOwotICAgICAgcmV0dXJuOwotICAgIGZhaWw6OwotICAgIH0KLSAgdGhlX2NjID0gMHg4OwotfQotCi1zdGF0aWMgdm9pZAotZ2V0X29wZXJhbmQgKHB0ciwgbW9kZSwgZHN0KQotICAgICBjaGFyICoqcHRyOwotICAgICBzdHJ1Y3QgejhrX29wICptb2RlOwotICAgICB1bnNpZ25lZCBpbnQgZHN0OwotewotICBjaGFyICpzcmMgPSAqcHRyOwotICBjaGFyICplbmQ7Ci0gIHVuc2lnbmVkIGludCBudW07Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0gIHVuc2lnbmVkIGludCBzaXplOwotCi0gIG1vZGUtPm1vZGUgPSAwOwotCi0gIHdoaWxlICgqc3JjID09ICcgJykKLSAgICBzcmMrKzsKLSAgaWYgKCpzcmMgPT0gJyMnKQotICAgIHsKLSAgICAgIG1vZGUtPm1vZGUgPSBDTEFTU19JTU07Ci0gICAgICBpbW1fb3BlcmFuZCA9ICYobW9kZS0+ZXhwKTsKLSAgICAgIHNyYyA9IHBhcnNlX2V4cCAoc3JjICsgMSwgJihtb2RlLT5leHApKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCpzcmMgPT0gJ0AnKQotICAgIHsKLSAgICAgIGludCBkOwotCi0gICAgICBtb2RlLT5tb2RlID0gQ0xBU1NfSVI7Ci0gICAgICBzcmMgPSBwYXJzZV9yZWcgKHNyYyArIDEsICZkLCAmbW9kZS0+cmVnKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgcmVnbjsKLQotICAgICAgZW5kID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLT5tb2RlLCAmcmVnbik7Ci0KLSAgICAgIGlmIChlbmQpCi0JewotCSAgaW50IG53LCBucjsKLQotCSAgc3JjID0gZW5kOwotCSAgaWYgKCpzcmMgPT0gJygnKQotCSAgICB7Ci0JICAgICAgc3JjKys7Ci0JICAgICAgZW5kID0gcGFyc2VfcmVnIChzcmMsICZudywgJm5yKTsKLQkgICAgICBpZiAoZW5kKQotCQl7Ci0JCSAgLyogR290IFJhKFJiKSAqLwotCQkgIHNyYyA9IGVuZDsKLQotCQkgIGlmICgqc3JjICE9ICcpJykKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJNaXNzaW5nICkgaW4gcmEocmIpIikpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgc3JjKys7Ci0JCSAgICB9Ci0KLQkJICByZWdhZGRyIChtb2RlLT5tb2RlLCAicmEocmIpIHJhIik7Ci0vKgkJICByZWd3b3JkIChtb2RlLT5tb2RlLCAicmEocmIpIHJiIik7Ki8KLQkJICBtb2RlLT5tb2RlID0gQ0xBU1NfQlg7Ci0JCSAgbW9kZS0+cmVnID0gcmVnbjsKLQkJICBtb2RlLT54X3JlZyA9IG5yOwotCQkgIHJlZ1tBUkdfUlhdID0gbnI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBHb3QgUmEoZGlzcCkgKi8KLQkJICBpZiAoKnNyYyA9PSAnIycpCi0JCSAgICBzcmMrKzsKLQkJICBzcmMgPSBwYXJzZV9leHAgKHNyYywgJihtb2RlLT5leHApKTsKLQkJICBzcmMgPSBjaGVja2ZvciAoc3JjLCAnKScpOwotCQkgIG1vZGUtPm1vZGUgPSBDTEFTU19CQTsKLQkJICBtb2RlLT5yZWcgPSByZWduOwotCQkgIG1vZGUtPnhfcmVnID0gMDsKLQkJICBpbW1fb3BlcmFuZCA9ICYobW9kZS0+ZXhwKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtb2RlLT5yZWcgPSByZWduOwotCSAgICAgIG1vZGUtPnhfcmVnID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBObyBpbml0aWFsIHJlZyAqLwotCSAgc3JjID0gcGFyc2VfZXhwIChzcmMsICYobW9kZS0+ZXhwKSk7Ci0JICBpZiAoKnNyYyA9PSAnKCcpCi0JICAgIHsKLQkgICAgICBzcmMrKzsKLQkgICAgICBlbmQgPSBwYXJzZV9yZWcgKHNyYywgJihtb2RlLT5tb2RlKSwgJnJlZ24pOwotCSAgICAgIHJlZ3dvcmQgKG1vZGUtPm1vZGUsICJhZGRyKFJhKSByYSIpOwotCSAgICAgIG1vZGUtPm1vZGUgPSBDTEFTU19YOwotCSAgICAgIG1vZGUtPnJlZyA9IHJlZ247Ci0JICAgICAgbW9kZS0+eF9yZWcgPSAwOwotCSAgICAgIGRhX29wZXJhbmQgPSAmKG1vZGUtPmV4cCk7Ci0JICAgICAgc3JjID0gY2hlY2tmb3IgKGVuZCwgJyknKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogSnVzdCBhbiBhZGRyZXNzICovCi0JICAgICAgbW9kZS0+bW9kZSA9IENMQVNTX0RBOwotCSAgICAgIG1vZGUtPnJlZyA9IDA7Ci0JICAgICAgbW9kZS0+eF9yZWcgPSAwOwotCSAgICAgIGRhX29wZXJhbmQgPSAmKG1vZGUtPmV4cCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAqcHRyID0gc3JjOwotfQotCi1zdGF0aWMKLWNoYXIgKgotZ2V0X29wZXJhbmRzIChvcGNvZGUsIG9wX2VuZCwgb3BlcmFuZCkKLSAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKm9wY29kZTsKLSAgICAgY2hhciAqb3BfZW5kOwotICAgICBvcF90eXBlICpvcGVyYW5kOwotewotICBjaGFyICpwdHIgPSBvcF9lbmQ7Ci1jaGFyICpzYXZwdHI7Ci0gIHN3aXRjaCAob3Bjb2RlLT5ub3BlcmFuZHMpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIG9wZXJhbmRbMF0ubW9kZSA9IDA7Ci0gICAgICBvcGVyYW5kWzFdLm1vZGUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICBwdHIrKzsKLSAgICAgIGlmIChvcGNvZGUtPmFyZ19pbmZvWzBdID09IENMQVNTX0NDKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0X2NjX29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKLSAgICAgICAgfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5hcmdfaW5mb1swXSA9PSBDTEFTU19GTEFHUykKLSAgICAgICAgewotICAgICAgICAgIGdldF9mbGFnc19vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+YXJnX2luZm9bMF0gPT0gKENMQVNTX0lNTSArKEFSR19JTU0yKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRfaW50ZXJydXB0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKLSAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKLSAgICAgICAgfQotICAgICAgb3BlcmFuZFsxXS5tb2RlID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOgotICAgICAgcHRyKys7Ci0gICAgICBzYXZwdHIgPSBwdHI7Ci0gICAgICBpZiAob3Bjb2RlLT5hcmdfaW5mb1swXSA9PSBDTEFTU19DQykKLSAgICAgICAgewotICAgICAgICAgIGdldF9jY19vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+YXJnX2luZm9bMF0gPT0gQ0xBU1NfQ1RSTCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBnZXRfY3RybF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7Ci0gICAgICAgICAgICAgICBpZiAodGhlX2N0cmwgPT0gMCkKLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIHB0ciA9IHNhdnB0cjsKLSAgICAgICAgICAgICAgICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgICAgICAgICAgICAgIGlmIChwdHIgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICBpZiAoKnB0ciA9PSAnLCcpCi0gICAgICAgICAgICAgICAgICAgICBwdHIrKzsKLSAgICAgICAgICAgICAgICAgICBnZXRfY3RybF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuIHB0cjsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgIGlmIChwdHIgPT0gMCkKLSAgICAgICAgcmV0dXJuOwotICAgICAgaWYgKCpwdHIgPT0gJywnKQotICAgICAgICBwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMSwgMSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICAgIHB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKLSAgICAgIGlmICgqcHRyID09ICcsJykKLQlwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMSwgMSk7Ci0gICAgICBpZiAoKnB0ciA9PSAnLCcpCi0JcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDIsIDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDQ6Ci0gICAgICBwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7Ci0gICAgICBpZiAoKnB0ciA9PSAnLCcpCi0JcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDEsIDEpOwotICAgICAgaWYgKCpwdHIgPT0gJywnKQotCXB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAyLCAyKTsKLSAgICAgIGlmICgqcHRyID09ICcsJykKLQlwdHIrKzsKLSAgICAgIGdldF9jY19vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMywgMyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIFBhc3NlZCBhIHBvaW50ZXIgdG8gYSBsaXN0IG9mIG9wY29kZXMgd2hpY2ggdXNlIGRpZmZlcmVudAotICAgYWRkcmVzc2luZyBtb2RlcywgcmV0dXJuIHRoZSBvcGNvZGUgd2hpY2ggbWF0Y2hlcyB0aGUgb3Bjb2RlcwotICAgcHJvdmlkZWQKLSAgICovCi0KLXN0YXRpYwotb3Bjb2RlX2VudHJ5X3R5cGUgKgotREVGVU4gKGdldF9zcGVjaWZpYywgKG9wY29kZSwgb3BlcmFuZHMpLAotICAgICAgIG9wY29kZV9lbnRyeV90eXBlICogb3Bjb2RlIEFORAotICAgICAgIG9wX3R5cGUgKiBvcGVyYW5kcykKLQotewotICBvcGNvZGVfZW50cnlfdHlwZSAqdGhpc190cnkgPSBvcGNvZGU7Ci0gIGludCBmb3VuZCA9IDA7Ci0gIHVuc2lnbmVkIGludCBub3BlcmFuZHMgPSBvcGNvZGUtPm5vcGVyYW5kczsKLQotICB1bnNpZ25lZCBpbnQgZGlzcHJlZzsKLSAgdW5zaWduZWQgaW50IHRoaXNfaW5kZXggPSBvcGNvZGUtPmlkeDsKLQotICB3aGlsZSAodGhpc19pbmRleCA9PSBvcGNvZGUtPmlkeCAmJiAhZm91bmQpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIHRoaXNfdHJ5ID0gb3Bjb2RlKys7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbm9wZXJhbmRzOyBpKyspCi0JewotCSAgaW50IG1vZGUgPSBvcGVyYW5kc1tpXS5tb2RlOwotCi0JICBpZiAoKG1vZGUgJiBDTEFTU19NQVNLKSAhPSAodGhpc190cnktPmFyZ19pbmZvW2ldICYgQ0xBU1NfTUFTSykpCi0JICAgIHsKLQkgICAgICAvKiBpdCBjb3VsZCBiZSBhbiBwYyByZWwgb3BlcmFuZCwgaWYgdGhpcyBpcyBhIGRhIG1vZGUgYW5kCi0JICAgd2UgbGlrZSBkaXNwcywgdGhlbiBpbnNlcnQgaXQgKi8KLQotCSAgICAgIGlmIChtb2RlID09IENMQVNTX0RBICYmIHRoaXNfdHJ5LT5hcmdfaW5mb1tpXSA9PSBDTEFTU19ESVNQKQotCQl7Ci0JCSAgLyogVGhpcyBpcyB0aGUgY2FzZSAqLwotCQkgIG9wZXJhbmRzW2ldLm1vZGUgPSBDTEFTU19ESVNQOwotCQl9Ci0JICAgICAgZWxzZSBpZiAobW9kZSA9PSBDTEFTU19CQSAmJiB0aGlzX3RyeS0+YXJnX2luZm9baV0pCi0JCXsKLQkJICAvKiBDYW4ndCB0aGluayBvZiBhIHdheSB0byB0dXJuIHdoYXQgd2UndmUgYmVlbiBnaXZlbiBpbnRvCi0JICAgICBzb21ldGhpbmcgdGhhdCdzIG9rICovCi0JCSAgZ290byBmYWlsOwotCQl9Ci0JICAgICAgZWxzZSBpZiAodGhpc190cnktPmFyZ19pbmZvW2ldICYgQ0xBU1NfUFIpCi0JCXsKLQkJICBpZiAobW9kZSA9PSBDTEFTU19SRUdfTE9ORyAmJiBzZWdtZW50ZWRfbW9kZSkKLQkJICAgIHsKLQkJICAgICAgLyogb2sgKi8KLQkJICAgIH0KLQkJICBlbHNlIGlmIChtb2RlID09IENMQVNTX1JFR19XT1JEICYmICFzZWdtZW50ZWRfbW9kZSkKLQkJICAgIHsKLQkJICAgICAgLyogb2sgKi8KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBnb3RvIGZhaWw7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWdvdG8gZmFpbDsKLQkgICAgfQotCSAgc3dpdGNoIChtb2RlICYgQ0xBU1NfTUFTSykKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENMQVNTX1g6Ci0JICAgIGNhc2UgQ0xBU1NfSVI6Ci0JICAgIGNhc2UgQ0xBU1NfQkE6Ci0JICAgIGNhc2UgQ0xBU1NfQlg6Ci0JICAgIGNhc2UgQ0xBU1NfRElTUDoKLQkgICAgY2FzZSBDTEFTU19SRUc6Ci0JICAgIGNhc2UgQ0xBU1NfUkVHX1dPUkQ6Ci0JICAgIGNhc2UgQ0xBU1NfUkVHX0JZVEU6Ci0JICAgIGNhc2UgQ0xBU1NfUkVHX1FVQUQ6Ci0JICAgIGNhc2UgQ0xBU1NfUkVHX0xPTkc6Ci0JICAgIGNhc2UgQ0xBU1NfUkVHTjA6Ci0JICAgICAgcmVnW3RoaXNfdHJ5LT5hcmdfaW5mb1tpXSAmIEFSR19NQVNLXSA9IG9wZXJhbmRzW2ldLnJlZzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgZm91bmQgPSAxOwotICAgIGZhaWw6OwotICAgIH0KLSAgaWYgKGZvdW5kKQotICAgIHJldHVybiB0aGlzX3RyeTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotREVGVU4gKGNoZWNrX29wZXJhbmQsIChvcGVyYW5kLCB3aWR0aCwgc3RyaW5nKSwKLSAgICAgICBzdHJ1Y3QgejhrX29wICpvcGVyYW5kIEFORAotICAgICAgIHVuc2lnbmVkIGludCB3aWR0aCBBTkQKLSAgICAgICBjaGFyICpzdHJpbmcpCi17Ci0gIGlmIChvcGVyYW5kLT5leHAuWF9hZGRfc3ltYm9sID09IDAKLSAgICAgICYmIG9wZXJhbmQtPmV4cC5YX29wX3N5bWJvbCA9PSAwKQotICAgIHsKLQotICAgICAgLyogTm8gc3ltYm9sIGludm9sdmVkLCBsZXQncyBsb29rIGF0IG9mZnNldCwgaXQncyBkYW5nZXJvdXMgaWYgYW55IG9mCi0gICAgICAgdGhlIGhpZ2ggYml0cyBhcmUgbm90IDAgb3IgZmYncywgZmluZCBvdXQgYnkgb3Jpbmcgb3IgYW5kaW5nIHdpdGgKLSAgICAgICB0aGUgd2lkdGggYW5kIHNlZWluZyBpZiB0aGUgYW5zd2VyIGlzIDAgb3IgYWxsIGZzKi8KLSAgICAgIGlmICgob3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciAmIH53aWR0aCkgIT0gMCAmJgotCSAgKG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgfCB3aWR0aCkgIT0gKH4wKSkKLQl7Ci0JICBhc193YXJuIChfKCJvcGVyYW5kICVzMHgleCBvdXQgb2YgcmFuZ2UuIiksIHN0cmluZywgb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlcik7Ci0JfQotICAgIH0KLQotfQotCi1zdGF0aWMgY2hhciBidWZmZXJbMjBdOwotCi1zdGF0aWMgdm9pZAotREVGVU4gKG5ld2ZpeCwgKHB0ciwgdHlwZSwgb3BlcmFuZCksCi0gICAgICAgaW50IHB0ciBBTkQKLSAgICAgICBpbnQgdHlwZSBBTkQKLSAgICAgICBleHByZXNzaW9uUyAqIG9wZXJhbmQpCi17Ci0gIGlmIChvcGVyYW5kLT5YX2FkZF9zeW1ib2wKLSAgICAgIHx8IG9wZXJhbmQtPlhfb3Bfc3ltYm9sCi0gICAgICB8fCBvcGVyYW5kLT5YX2FkZF9udW1iZXIpCi0gICAgewotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICBwdHIsCi0JCSAgIDEsCi0JCSAgIG9wZXJhbmQsCi0JCSAgIDAsCi0JCSAgIHR5cGUpOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotREVGVU4gKGFwcGx5X2ZpeCwgKHB0ciwgdHlwZSwgb3BlcmFuZCwgc2l6ZSksCi0gICAgICAgY2hhciAqcHRyIEFORAotICAgICAgIGludCB0eXBlIEFORAotICAgICAgIGV4cHJlc3Npb25TICogb3BlcmFuZCBBTkQKLSAgICAgICBpbnQgc2l6ZSkKLXsKLSAgaW50IG4gPSBvcGVyYW5kLT5YX2FkZF9udW1iZXI7Ci0KLSAgb3BlcmFuZC0+WF9hZGRfbnVtYmVyID0gbjsKLSAgbmV3Zml4ICgocHRyIC0gYnVmZmVyKSAvIDIsIHR5cGUsIG9wZXJhbmQpOwotI2lmIDEKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDg6CQkJLyogOCBuaWJibGVzID09IDMyIGJpdHMgKi8KLSAgICAgICpwdHIrKyA9IG4gPj4gMjg7Ci0gICAgICAqcHRyKysgPSBuID4+IDI0OwotICAgICAgKnB0cisrID0gbiA+PiAyMDsKLSAgICAgICpwdHIrKyA9IG4gPj4gMTY7Ci0gICAgY2FzZSA0OgkJCS8qIDQgbmlibGxlcyA9PSAxNiBiaXRzICovCi0gICAgICAqcHRyKysgPSBuID4+IDEyOwotICAgICAgKnB0cisrID0gbiA+PiA4OwotICAgIGNhc2UgMjoKLSAgICAgICpwdHIrKyA9IG4gPj4gNDsKLSAgICBjYXNlIDE6Ci0gICAgICAqcHRyKysgPSBuID4+IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0jZW5kaWYKLSAgcmV0dXJuIHB0cjsKLQotfQotCi0vKiBOb3cgd2Uga25vdyB3aGF0IHNvcnQgb2Ygb3Bjb2RlcyBpdCBpcywgbGV0cyBidWlsZCB0aGUgYnl0ZXMgLQotICovCi0jZGVmaW5lIElOU0VSVCh4LHkpICp4KysgPSB5Pj4yNDsgKngrKyA9IHk+PiAxNjsgKngrKz15Pj44OyAqeCsrID15Owotc3RhdGljIHZvaWQKLWJ1aWxkX2J5dGVzICh0aGlzX3RyeSwgb3BlcmFuZCkKLSAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKiB0aGlzX3RyeTsKLSAgICAgc3RydWN0IHo4a19vcCAqb3BlcmFuZDsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaW50IGxlbmd0aDsKLSAgY2hhciAqb3V0cHV0OwotICBjaGFyICpvdXRwdXRfcHRyID0gYnVmZmVyOwotICBjaGFyIHBhcnQ7Ci0gIGludCBjOwotICBjaGFyIGhpZ2g7Ci0gIGludCBuaWI7Ci0gIGludCBuaWJibGU7Ci0gIHVuc2lnbmVkIGludCAqY2xhc3NfcHRyOwotCi0gIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICBmcmFnX25ldyAoMCk7Ci0KLSAgbWVtc2V0IChidWZmZXIsIDIwLCAwKTsKLSAgY2xhc3NfcHRyID0gdGhpc190cnktPmJ5dGVfaW5mbzsKLXRvcDo7Ci0KLSAgZm9yIChuaWJibGUgPSAwOyBjID0gKmNsYXNzX3B0cisrOyBuaWJibGUrKykKLSAgICB7Ci0KLSAgICAgIHN3aXRjaCAoYyAmIENMQVNTX01BU0spCi0JewotCWRlZmF1bHQ6Ci0KLQkgIGFib3J0ICgpOwotCWNhc2UgQ0xBU1NfQUREUkVTUzoKLQkgIC8qIERpcmVjdCBhZGRyZXNzLCB3ZSBkb24ndCBjb3BlIHdpdGggdGhlIFNTIG1vZGUgcmlnaHQgbm93ICovCi0JICBpZiAoc2VnbWVudGVkX21vZGUpCi0JICAgIHsKLQkgICAgICBkYV9vcGVyYW5kLT5YX2FkZF9udW1iZXIgfD0gMHg4MDAwMDAwMDsKLQkgICAgICBvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTMyLCBkYV9vcGVyYW5kLCA4KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9JTU0xNiwgZGFfb3BlcmFuZCwgNCk7Ci0JICAgIH0KLQkgIGRhX29wZXJhbmQgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19ESVNQODoKLQkgIC8qIHBjIHJlbCA4IGJpdCAqLwotCSAgb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9KUiwgZGFfb3BlcmFuZCwgMik7Ci0JICBkYV9vcGVyYW5kID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBDTEFTU18wRElTUDc6Ci0JICAvKiBwYyByZWwgNyBiaXQgKi8KLQkgICpvdXRwdXRfcHRyID0gMDsKLQkgIG91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfRElTUDcsIGRhX29wZXJhbmQsIDIpOwotCSAgZGFfb3BlcmFuZCA9IDA7Ci0JICBicmVhazsKLQotCWNhc2UgQ0xBU1NfMURJU1A3OgotCSAgLyogcGMgcmVsIDcgYml0ICovCi0JICAqb3V0cHV0X3B0ciA9IDB4ODA7Ci0JICBvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0RJU1A3LCBkYV9vcGVyYW5kLCAyKTsKLSAgICAgICAgICBvdXRwdXRfcHRyWy0yXSA9ICAweDg7Ci0JICBkYV9vcGVyYW5kID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBDTEFTU19CSVRfMU9SMjoKLQkgICpvdXRwdXRfcHRyID0gYyAmIDB4ZjsKLQkgIGlmIChpbW1fb3BlcmFuZCkKLQkgICAgewotCSAgICAgIGlmIChpbW1fb3BlcmFuZC0+WF9hZGRfbnVtYmVyID09IDIpCi0JCXsKLQkJICAqb3V0cHV0X3B0ciB8PSAyOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaW1tX29wZXJhbmQtPlhfYWRkX251bWJlciAhPSAxKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJpbW1lZGlhdGUgbXVzdCBiZSAxIG9yIDIiKSk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJpbW1lZGlhdGUgMSBvciAyIGV4cGVjdGVkIikpOwotCSAgICB9Ci0JICBvdXRwdXRfcHRyKys7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0NDOgotCSAgKm91dHB1dF9wdHIrKyA9IHRoZV9jYzsKLQkgIGJyZWFrOwotICAgICAgICBjYXNlIENMQVNTXzBDQ0M6Ci0gICAgICAgICAgKm91dHB1dF9wdHIrKyA9IHRoZV9jdHJsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENMQVNTXzFDQ0M6Ci0gICAgICAgICAgKm91dHB1dF9wdHIrKyA9IHRoZV9jdHJsIHwgMHg4OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENMQVNTXzAwSUk6Ci0gICAgICAgICAgKm91dHB1dF9wdHIrKyA9ICh+dGhlX2ludGVycnVwdCAmIDB4Myk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0xBU1NfMDFJSToKLSAgICAgICAgICAqb3V0cHV0X3B0cisrID0gKH50aGVfaW50ZXJydXB0ICYgMHgzKSB8IDB4NDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDTEFTU19GTEFHUzoKLSAgICAgICAgICAqb3V0cHV0X3B0cisrID0gdGhlX2ZsYWdzOwotICAgICAgICAgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQklUOgotCSAgKm91dHB1dF9wdHIrKyA9IGMgJiAweGY7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR04wOgotCSAgaWYgKHJlZ1tjICYgMHhmXSA9PSAwKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJjYW4ndCB1c2UgUjAgaGVyZSIpKTsKLQkgICAgfQotCWNhc2UgQ0xBU1NfUkVHOgotCWNhc2UgQ0xBU1NfUkVHX0JZVEU6Ci0JY2FzZSBDTEFTU19SRUdfV09SRDoKLQljYXNlIENMQVNTX1JFR19MT05HOgotCWNhc2UgQ0xBU1NfUkVHX1FVQUQ6Ci0JICAvKiBJbnNlcnQgYml0IG1hdHRlcm4gb2YKLQkgcmlnaHQgcmVnICovCi0JICAqb3V0cHV0X3B0cisrID0gcmVnW2MgJiAweGZdOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19ESVNQOgotCSAgb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9JTU0xNiwgZGFfb3BlcmFuZCwgNCk7Ci0JICBkYV9vcGVyYW5kID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBDTEFTU19JTU06Ci0JICB7Ci0JICAgIG5pYiA9IDA7Ci0JICAgIHN3aXRjaCAoYyAmIEFSR19NQVNLKQotCSAgICAgIHsKLQkgICAgICBjYXNlIEFSR19JTU00OgotCQlvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTRMLCBpbW1fb3BlcmFuZCwgMSk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgQVJHX0lNTTRNMToKLQkJaW1tX29wZXJhbmQtPlhfYWRkX251bWJlci0tOwotCQlvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTRMLCBpbW1fb3BlcmFuZCwgMSk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgQVJHX0lNTU5NSU5VUzE6Ci0JCWltbV9vcGVyYW5kLT5YX2FkZF9udW1iZXItLTsKLQkJb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9JTU00TCwgaW1tX29wZXJhbmQsIDEpOwotCQlicmVhazsKLQkgICAgICBjYXNlIEFSR19OSU04OgotCQlpbW1fb3BlcmFuZC0+WF9hZGRfbnVtYmVyID0gLWltbV9vcGVyYW5kLT5YX2FkZF9udW1iZXI7Ci0JICAgICAgY2FzZSBBUkdfSU1NODoKLQkJb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9JTU04LCBpbW1fb3BlcmFuZCwgMik7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgQVJHX0lNTTE2OgotCQlvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTE2LCBpbW1fb3BlcmFuZCwgNCk7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBBUkdfSU1NMzI6Ci0JCW91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NMzIsIGltbV9vcGVyYW5kLCA4KTsKLQkJYnJlYWs7Ci0KLQkgICAgICBkZWZhdWx0OgotCQlhYm9ydCAoKTsKLQkgICAgICB9Ci0JICB9Ci0JfQotICAgIH0KLQotICAvKiBDb3B5IGZyb20gdGhlIG5pYmJsZSBidWZmZXIgaW50byB0aGUgZnJhZyAqLwotCi0gIHsKLSAgICBpbnQgbGVuZ3RoID0gKG91dHB1dF9wdHIgLSBidWZmZXIpIC8gMjsKLSAgICBjaGFyICpzcmMgPSBidWZmZXI7Ci0gICAgY2hhciAqZnJhZ3AgPSBmcmFnX21vcmUgKGxlbmd0aCk7Ci0KLSAgICB3aGlsZSAoc3JjIDwgb3V0cHV0X3B0cikKLSAgICAgIHsKLQkqZnJhZ3AgPSAoc3JjWzBdIDw8IDQpIHwgc3JjWzFdOwotCXNyYyArPSAyOwotCWZyYWdwKys7Ci0gICAgICB9Ci0KLSAgfQotCi19Ci0KLS8qIFRoaXMgaXMgdGhlIGd1dHMgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlci4gIFNUUiBwb2ludHMgdG8gYQotICAgbWFjaGluZSBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIGZ1bmNpdG9uIGlzIHN1cHBvc2VkIHRvIGVtaXQKLSAgIHRoZSBmcmFncy9ieXRlcyBpdCBhc3NlbWJsZXMgdG8uCi0gICAqLwotCi12b2lkCi1ERUZVTiAobWRfYXNzZW1ibGUsIChzdHIpLAotICAgICAgIGNoYXIgKnN0cikKLXsKLSAgY2hhciAqb3Bfc3RhcnQ7Ci0gIGNoYXIgKm9wX2VuZDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHN0cnVjdCB6OGtfb3Agb3BlcmFuZFszXTsKLSAgb3Bjb2RlX2VudHJ5X3R5cGUgKm9wY29kZTsKLSAgb3Bjb2RlX2VudHJ5X3R5cGUgKnByZXZfb3Bjb2RlOwotCi0gIGNoYXIgKmRvdCA9IDA7Ci0gIGNoYXIgYzsKLQotICAvKiBEcm9wIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgLyogZmluZCB0aGUgb3AgY29kZSBlbmQgKi8KLSAgZm9yIChvcF9zdGFydCA9IG9wX2VuZCA9IHN0cjsKLSAgICAgICAqb3BfZW5kICE9IDAgJiYgKm9wX2VuZCAhPSAnICc7Ci0gICAgICAgb3BfZW5kKyspCi0gICAgewotICAgIH0KLQotICA7Ci0KLSAgaWYgKG9wX2VuZCA9PSBvcF9zdGFydCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImNhbid0IGZpbmQgb3Bjb2RlICIpKTsKLSAgICB9Ci0gIGMgPSAqb3BfZW5kOwotCi0gICpvcF9lbmQgPSAwOwotCi0gIG9wY29kZSA9IChvcGNvZGVfZW50cnlfdHlwZSAqKSBoYXNoX2ZpbmQgKG9wY29kZV9oYXNoX2NvbnRyb2wsCi0JCQkJCSAgICBvcF9zdGFydCk7Ci0KLQotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ1bmtub3duIG9wY29kZSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKG9wY29kZS0+b3Bjb2RlID09IDI1MCkKLSAgICB7Ci0gICAgICAvKiB3YXMgcmVhbGx5IGEgcHNldWRvIG9wICovCi0KLSAgICAgIHBzZXVkb190eXBlUyAqcDsKLSAgICAgIGNoYXIgb2M7Ci0KLSAgICAgIGNoYXIgKm9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICpvcF9lbmQgPSBjOwotCi0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IG9wX2VuZDsKLQotICAgICAgb2MgPSAqb2xkOwotICAgICAgKm9sZCA9ICdcbic7Ci0gICAgICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBwID0gKHBzZXVkb190eXBlUyAqKSAob3Bjb2RlLT5mdW5jKTsKLQotICAgICAgKHAtPnBvY19oYW5kbGVyKSAocC0+cG9jX3ZhbCk7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvbGQ7Ci0gICAgICAqb2xkID0gb2M7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gZ2V0X29wZXJhbmRzIChvcGNvZGUsIG9wX2VuZCwKLQkJCQkJIG9wZXJhbmQpOwotICAgICAgcHJldl9vcGNvZGUgPSBvcGNvZGU7Ci0KLSAgICAgIG9wY29kZSA9IGdldF9zcGVjaWZpYyAob3Bjb2RlLCBvcGVyYW5kKTsKLQotICAgICAgaWYgKG9wY29kZSA9PSAwKQotCXsKLQkgIC8qIENvdWxkbid0IGZpbmQgYW4gb3Bjb2RlIHdoaWNoIG1hdGNoZWQgdGhlIG9wZXJhbmRzICovCi0JICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMik7Ci0KLQkgIHdoZXJlWzBdID0gMHgwOwotCSAgd2hlcmVbMV0gPSAweDA7Ci0KLQkgIGFzX2JhZCAoXygiQ2FuJ3QgZmluZCBvcGNvZGUgdG8gbWF0Y2ggb3BlcmFuZHMiKSk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBidWlsZF9ieXRlcyAob3Bjb2RlLCBvcGVyYW5kKTsKLSAgICB9Ci19Ci0KLXZvaWQKLURFRlVOICh0Y19jcmF3bF9zeW1ib2xfY2hhaW4sIChoZWFkZXJzKSwKLSAgICAgICBvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpCi17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19jcmF3bF9zeW1ib2xfY2hhaW4gXG4iKSk7Ci19Ci0KLXN5bWJvbFMgKgotREVGVU4gKG1kX3VuZGVmaW5lZF9zeW1ib2wsIChuYW1lKSwKLSAgICAgICBjaGFyICpuYW1lKQotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotREVGVU4gKHRjX2hlYWRlcnNfaG9vaywgKGhlYWRlcnMpLAotICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2hlYWRlcnNfaG9vayBcbiIpKTsKLX0KLQotLyogVmFyaW91cyByb3V0aW5lcyB0byBraWxsIG9uZSBkYXkgKi8KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gICAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0gIGNoYXIgKmF0b2ZfaWVlZSAoKTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOwotICAgIH0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICBmb3IgKHdvcmRQID0gd29yZHM7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAobG9uZykgKCp3b3JkUCsrKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotDAotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIno6IjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICd6JzoKLSAgICAgIGlmICghc3RyY21wIChhcmcsICI4MDAxIikpCi0Jc19zZWdtICgpOwotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiODAwMiIpKQotCXNfdW5zZWcgKCk7Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJpbnZhbGlkIGFyY2hpdGVjdHVyZSAteiVzIiksIGFyZyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotWjhLIG9wdGlvbnM6XG5cCi0tejgwMDEJCQlnZW5lcmF0ZSBzZWdtZW50ZWQgY29kZVxuXAotLXo4MDAyCQkJZ2VuZXJhdGUgdW5zZWdtZW50ZWQgY29kZVxuIikpOwotfQotDAotdm9pZAotdGNfYW91dF9maXhfdG9fY2hhcnMgKCkKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2FvdXRfZml4X3RvX2NoYXJzIFxuIikpOwotICBhYm9ydCAoKTsKLX0KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWc7Ci0gICAgIGZyYWdTICpmcmFnUDsKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIG1kX2NvbnZlcnRfZnJhZyBcbiIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLXZhbHVlVAotREVGVU4gKG1kX3NlY3Rpb25fYWxpZ24sIChzZWcsIHNpemUpLAotICAgICAgIHNlZ1Qgc2VnIEFORAotICAgICAgIHZhbHVlVCBzaXplKQotewotICByZXR1cm4gKChzaXplICsgKDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkgLSAxKSAmICgtMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSk7Ci0KLX0KLQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotewotICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0KLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9JTU00TDoKLSAgICAgIGJ1ZlswXSA9IChidWZbMF0gJiAweGYwKSB8ICgoYnVmWzBdICsgdmFsKSAmIDB4Zik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9KUjoKLQotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgLyogICAgaWYgKHZhbCAhPSAwKSBhYm9ydCgpOyovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9ESVNQNzoKLQotICAgICAgKmJ1ZisrICs9IHZhbDsKLSAgICAgIC8qICAgIGlmICh2YWwgIT0gMCkgYWJvcnQoKTsqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSU1NODoKLSAgICAgIGJ1ZlswXSArPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSU1NMTY6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0lNTTMyOgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAyNCk7Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDE2KTsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSNpZiAwCi0gICAgY2FzZSBSX0RBIHwgUl9TRUc6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDE2KTsKLSAgICAgICpidWYrKyA9IDB4MDA7Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGNhc2UgMDoKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIGZpeFAtPmZ4X3NpemUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICB9Ci19Ci0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIHByaW50ZiAoXygiY2FsbCB0b21kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IFxuIikpOwotICBhYm9ydCAoKTsKLX0KLQotLyogUHV0IG51bWJlciBpbnRvIHRhcmdldCBieXRlIG9yZGVyICovCi0KLXZvaWQKLURFRlVOIChtZF9udW1iZXJfdG9fY2hhcnMsIChwdHIsIHVzZSwgbmJ5dGVzKSwKLSAgICAgICBjaGFyICpwdHIgQU5ECi0gICAgICAgdmFsdWVUIHVzZSBBTkQKLSAgICAgICBpbnQgbmJ5dGVzKQotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChwdHIsIHVzZSwgbmJ5dGVzKTsKLX0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGFib3J0ICgpOwotfQotCi12b2lkCi10Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgKHMpCi0gICAgIHN0cnVjdCBzeW1ib2wgKnM7Ci17Ci19Ci0KLXZvaWQKLXRjX3JlbG9jX21hbmdsZSAoZml4X3B0ciwgaW50ciwgYmFzZSkKLSAgICAgZml4UyAqZml4X3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRyOwotICAgICBiZmRfdm1hIGJhc2U7Ci0KLXsKLSAgc3ltYm9sUyAqc3ltYm9sX3B0cjsKLQotICBpZiAoZml4X3B0ci0+ZnhfYWRkc3kgJiYKLSAgICAgIGZpeF9wdHItPmZ4X3N1YnN5KSAKLSAgICB7Ci0gICAgICBzeW1ib2xTICphZGQgPSBmaXhfcHRyLT5meF9hZGRzeTsKLSAgICAgIHN5bWJvbFMgKnN1YiA9IGZpeF9wdHItPmZ4X3N1YnN5OwotICAgICAgaWYgKFNfR0VUX1NFR01FTlQoYWRkKSAhPSBTX0dFVF9TRUdNRU5UKHN1YikpCi0JewotCSAgYXNfYmFkKF8oIkNhbid0IHN1YnRyYWN0IHN5bWJvbHMgaW4gZGlmZmVyZW50IHNlY3Rpb25zICVzICVzIiksCi0JCSBTX0dFVF9OQU1FKGFkZCksIFNfR0VUX05BTUUoc3ViKSk7Ci0JfQotICAgICAgZWxzZSB7Ci0JaW50IGRpZmYgPSBTX0dFVF9WQUxVRShhZGQpIC0gU19HRVRfVkFMVUUoc3ViKTsKLQlmaXhfcHRyLT5meF9hZGRzeSA9IDA7Ci0JZml4X3B0ci0+Znhfc3Vic3kgPSAwOwotCWZpeF9wdHItPmZ4X29mZnNldCArPSBkaWZmOwotICAgICAgfQotICAgIH0KLSAgc3ltYm9sX3B0ciA9IGZpeF9wdHItPmZ4X2FkZHN5OwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyBhdHRhY2hlZCB0byBhIHN5bWJvbCB0aGVuIGl0J3Mgb2sKLSAgICAgdG8gb3V0cHV0IGl0ICovCi0gIGlmIChmaXhfcHRyLT5meF9yX3R5cGUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBjb25zIGxpa2VzIHRvIGNyZWF0ZSByZWxvYzMyJ3Mgd2hhdGV2ZXIgdGhlIHNpemUgb2YgdGhlIHJlbG9jLi4gKi8KLSAgICAgIHN3aXRjaCAoZml4X3B0ci0+Znhfc2l6ZSkKLQl7Ci0JY2FzZSAyOgotCSAgaW50ci0+cl90eXBlID0gUl9JTU0xNjsKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIGludHItPnJfdHlwZSA9IFJfSU1NODsKLQkgIGJyZWFrOwotCWNhc2UgNDoKLQkgIGludHItPnJfdHlwZSA9IFJfSU1NMzI7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ci0+cl90eXBlID0gZml4X3B0ci0+Znhfcl90eXBlOwotICAgIH0KLQotICBpbnRyLT5yX3ZhZGRyID0gZml4X3B0ci0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeF9wdHItPmZ4X3doZXJlICsgYmFzZTsKLSAgaW50ci0+cl9vZmZzZXQgPSBmaXhfcHRyLT5meF9vZmZzZXQ7Ci0KLSAgaWYgKHN5bWJvbF9wdHIpCi0gICAgaW50ci0+cl9zeW1uZHggPSBzeW1ib2xfcHRyLT5zeV9udW1iZXI7Ci0gIGVsc2UKLSAgICBpbnRyLT5yX3N5bW5keCA9IC0xOwotfQotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXo4ay5oIGIvZ2FzL2NvbmZpZy90Yy16OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4YjY1Ni4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXo4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLXo4ay5oCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiwgOTMsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jZGVmaW5lIFRDX1o4SwotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLSNpZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBpbnRlcm5hbF9yZWxvYzsKLSNlbmRpZgotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIExPQ0FMX0xBQkVMKHgpIDAKLSNlbmRpZgotCi0vKiBUaGlzIG1hY3JvIHRyYW5zbGF0ZXMgYmV0d2VlbiBhbiBpbnRlcm5hbCBmaXggYW5kIGFuIGNvZmYgcmVsb2MgdHlwZSAqLwotI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShmaXhQKSBhYm9ydCgpOwotCi0jZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX3o4awotI2RlZmluZSBDT0ZGX01BR0lDIDB4ODAwMAotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyh4KSAoMSkKLSNkZWZpbmUgSUdOT1JFX05PTlNUQU5EQVJEX0VTQ0FQRVMKLQotI2RlZmluZSBUQ19SRUxPQ19NQU5HTEUocyxhLGIsYykgdGNfcmVsb2NfbWFuZ2xlKGEsYixjKQotZXh0ZXJuIHZvaWQgdGNfcmVsb2NfbWFuZ2xlCi0gIFBBUkFNUyAoKHN0cnVjdCBmaXggKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosIGJmZF92bWEpKTsKLQotI2RlZmluZSBET19OT1RfU1RSSVAgMAotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiWmlsb2cgWjgwMDAgR0FTICIKLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUgMQotI2RlZmluZSBSRUxPQ18zMiAxMjM0Ci0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0vKiBlbmQgb2YgdGMtejhrLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtMzg2YnNkLmggYi9nYXMvY29uZmlnL3RlLTM4NmJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmZmOTkwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtMzg2YnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiB0ZS0zODZic2QuaCAtLSAzODZCU0QgdGFyZ2V0IGVudmlyb25tZW50IGRlY2xhcmF0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgIAotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRFXzM4NkJTRAkxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiB0ZS1zdW4zLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtYXV4LmggYi9nYXMvY29uZmlnL3RlLWF1eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTZmYTAxLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtYXV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jZGVmaW5lIFRFX0FVWAotCi0vKiBGcm9tIG9iai1jb2ZmLmg6Ci0gICBUaGlzIGludGVybmFsX2xpbmVubyBjcmFwIGlzIHRvIHN0b3AgbmFtZXNwYWNlIHBvbGx1dGlvbiBmcm9tIHRoZQotICAgYmZkIGludGVybmFsIGNvZmYgaGVhZGVyZmlsZS4gKi8KLSNkZWZpbmUgaW50ZXJuYWxfbGluZW5vIGJmZF9pbnRlcm5hbF9saW5lbm8KLSNpbmNsdWRlICJjb2ZmL2F1eC1jb2ZmLmgiCS8qIG92ZXJyaWRlIGJpdHMgaW4gY29mZi9pbnRlcm5hbC5oICovCi0jdW5kZWYgaW50ZXJuYWxfbGluZW5vCi0KLSNkZWZpbmUgQ09GRl9OT0xPQURfUFJPQkxFTQotI2RlZmluZSBLRUVQX1JFTE9DX0lORk8KLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotI2lmbmRlZiBMT0NBTF9MQUJFTFNfRkIKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1kZWx0ODguaCBiL2dhcy9jb25maWcvdGUtZGVsdDg4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkY2Q2YjcuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1kZWx0ODguaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0ZS1kZWx0YTg4LmguICAqLwotCi0jZGVmaW5lIFRFX0RFTFRBODggMQotCi0jZGVmaW5lIENPRkZfTk9MT0FEX1BST0JMRU0JMQotCi0vKiBBZGRlZCB0aGVzZSwgYmVjYXVzZSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgd2UncmUgdGFyZ2V0dGluZyB3ZSBtYXkKLSAgIG5lZWQgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgbGliZ2NjLCBhbmQgdGhhdCB3aWxsIHVzZSBsb2NhbAotICAgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUgkxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQgkJMQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1kZWx0YS5oIGIvZ2FzL2NvbmZpZy90ZS1kZWx0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTZjNjJjLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtZGVsdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNkZWZpbmUgVEVfREVMVEEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotI2RlZmluZSBDT0ZGX05PTE9BRF9QUk9CTEVNCTEKLSNkZWZpbmUgQ09GRl9DT01NT05fQURERU5ECTEKLQotLyogQWRkZWQgdGhlc2UsIGJlY2F1c2UgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3JlIHRhcmdldHRpbmcgd2UgbWF5Ci0gICBuZWVkIGFuIGFzc2VtYmxlciB2ZXJzaW9uIG9mIGxpYmdjYywgYW5kIHRoYXQgd2lsbCB1c2UgbG9jYWwKLSAgIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIJMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIJCTEKLQotLyogZW5kIG9mIHRlLWRlbHRhLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtZHB4Mi5oIGIvZ2FzL2NvbmZpZy90ZS1kcHgyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MzQxY2EuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1kcHgyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vKiBNYWNoaW5lIHNwZWNpZmljIGRlZmluZXMgZm9yIHRoZSBkcHgyIG1hY2hpbmUgKi8KLQotLyogVGhlIG1hZ2ljIG51bWJlciBpcyBub3QgdGhlIHVzdWFsIE1DNjhNQUdJQy4gKi8KLSNkZWZpbmUgQ09GRl9NQUdJQyAgICAgICBNQzY4S0JDU01BR0lDCi0KLSNkZWZpbmUgUkVHSVNURVJfUFJFRklYX09QVElPTkFMIDEKLQotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLW02OGstdW4iCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qIGVuZCBvZiB0ZS1kcHgyLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtZHluaXguaCBiL2dhcy9jb25maWcvdGUtZHluaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3YjMwZi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWR5bml4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8qIFRoaXMgaXMgZm9yIGkzODYtc2VxdWVudC1ic2QuICBUaGUgYXNzZW1ibGVyIHByb2JhYmx5IGRvZXMgbm90Ci0gICBhY3R1YWxseSB3b3JrLCBhcyB0aGUgc3VwcG9ydCBpbiBCRkQgaXMgbm90IGNvbXBsZXRlIGFzIG9mIHRoaXMKLSAgIHdyaXRpbmcuICBTZWUgYmZkL2kzODYtZHluaXguYy4gICovCi0KLSNkZWZpbmUgVEVfRFlOSVggMQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1lcG9jLXBlLmggYi9nYXMvY29uZmlnL3RlLWVwb2MtcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1ZjkxNC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWVwb2MtcGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI2RlZmluZSBURV9QRQotI2RlZmluZSBURV9FUE9DCi0jZGVmaW5lIExFWF9BVCAxIC8qIGNhbiBoYXZlIEAncyBpbnNpZGUgbGFiZWxzICovCi0KLS8qIFRoZSBQRSBmb3JtYXQgc3VwcG9ydHMgbG9uZyBzZWN0aW9uIG5hbWVzLiAgKi8KLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtZ2VuZXJpYy5oIGIvZ2FzL2NvbmZpZy90ZS1nZW5lcmljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZWRhNDUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1nZW5lcmljLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHRlLWdlbmVyaWMuaCBhbmQgaXMgaW50ZW5kZWQgdG8gYmUgYSB0ZW1wbGF0ZSBmb3IKLSAqIHRhcmdldCBlbnZpcm9ubWVudCBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0gKgotICogSXQgaXMgbXkgaW50ZW50IHRoYXQgdGhpcyBmaWxlIHdpbGwgZXZvbHZlIGludG8gYSBmaWxlIHN1aXRhYmxlIGZvciBjb25maWcsCi0gKiBjb21waWxlLCBhbmQgY29weWluZyBhcyBhbiBhaWQgZm9yIHRlc3RpbmcgYW5kIHBvcnRpbmcuICB4b3hvcmljaC4KLSAqLwotCi0vKiBBZGRlZCB0aGVzZSwgYmVjYXVzZSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgd2UncmUgdGFyZ2V0dGluZyB3ZSBtYXkKLSAgIG5lZWQgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgbGliZ2NjLCBhbmQgdGhhdCB3aWxsIHVzZSBsb2NhbAotICAgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLS8qIHRoZXNlIGRlZmluZSBpbnRlcmZhY2VzICovCi0jaWZkZWYgT0JKX0hFQURFUgotI2luY2x1ZGUgT0JKX0hFQURFUgotI2Vsc2UKLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0jZW5kaWYKLQotLyogZW5kIG9mIHRlLWdlbmVyaWMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1nbzMyLmggYi9nYXMvY29uZmlnL3RlLWdvMzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmYmQyZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWdvMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGUtZ28zMi5oCi0gKi8KLQotI2RlZmluZSBURV9HTzMyCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1nbzMyIgotCi0vKiBHQVMgc2hvdWxkIHRyZWF0ICcuYWxpZ24gdmFsdWUnIGFzIGFuIGFsaWdubWVudCBvZiAyKip2YWx1ZSAqLwotI2RlZmluZSBVU0VfQUxJR05fUFRXTwotCi0vKiB0aGVzZSBkZWZpbmUgaW50ZXJmYWNlcyAqLwotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtaHAzMDAuaCBiL2dhcy9jb25maWcvdGUtaHAzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5NGFiNC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWhwMzAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKiB0ZS1ocDMwMC5oIC0tIGhwdXggOTAwMC8zMDAgdGFyZ2V0IGVudmlyb25tZW50IGRlY2xhcmF0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKiBlbmQgb2YgdGUtaHAzMDAuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1ocHBhLmggYi9nYXMvY29uZmlnL3RlLWhwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZjNGZhNy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWhwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qIE1hY2hpbmUgc3BlY2lmaWMgZGVmaW5lcyBmb3IgdGhlIFBBIG1hY2hpbmUKLSAgIENvcHlyaWdodCAxOTg3LCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotICAgCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotICAgCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0JSFAgUEEtUklTQyBhbmQgT1NGLzEgc3VwcG9ydCB3YXMgY29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IKLQlTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWguCi0gKi8KLQotLyogdGhlc2UgZGVmaW5lIGludGVyZmFjZXMgKi8KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWkzODZhaXguaCBiL2dhcy9jb25maWcvdGUtaTM4NmFpeC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGYwOTQ1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtaTM4NmFpeC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyB0ZS1pMzg2YWl4LmggYW5kIGlzIGJ1aWx0IGZyb20gcGllY2VzIG9mIGNvZGUgZnJvbSBNaW5oIFRyYW4tTGUKLSAqIDxUUkFOTEVASU5URUxMSUNPUlAuQ09NPiBieSByaWNoQGN5Z251cy5jb20uCi0gKi8KLQotI2RlZmluZSBURV9JMzg2QUlYIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyoKLSAqIFVuZGVmaW5lIFJFVkVSU0VfU09SVF9SRUxPQ1MgdG8ga2VlcCB0aGUgcmVsb2NhdGlvbiBlbnRyaWVzIHNvcnRlZAotICogaW4gYXNjZW5kaW5nIHZhZGRyLgotICovCi0jdW5kZWYgUkVWRVJTRV9TT1JUX1JFTE9DUwotCi0vKgotICogRGVmaW5lIEtFRVBfUkVMT0NfSU5GTyBzbyB0aGF0IHRoZSBzdHJpcCByZWxvYyBpbmZvIGZsYWcgRl9SRUxGTEcKLSAqIGlzIG5vdCB1c2VkIGluIHRoZSBmaWxlaGRyIGZvciBDT0ZGIG91dHB1dC4KLSAqLwotI2RlZmluZSBLRUVQX1JFTE9DX0lORk8KLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogNzkKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2YgdGUtaTM4NmFpeC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWljOTYwLmggYi9nYXMvY29uZmlnL3RlLWljOTYwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMzFmYjkuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1pYzk2MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRlLWljOTYwLmgKLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGUtaWM5NjAuaCBhbmQgaXMgaW50ZW5kZWQgdG8gZGVmaW5lIGljOTYwIGVudmlyb25tZW50Ci0gKiBzcGVjaWZpYyBkaWZmZXJlbmNlcy4KLSAqLwotCi0jZGVmaW5lIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBMT0NBTF9MQUJFTChuYW1lKSAoKG5hbWVbMF0gPT0nTCcpIFwKLQkJCSAgIHx8IChuYW1lWzBdID09Jy4nIFwKLQkJCSAgICAgICAmJiAobmFtZVsxXT09J0MnIFwKLQkJCQkgICB8fCBuYW1lWzFdPT0nSScgXAotCQkJCSAgIHx8IG5hbWVbMV09PScuJykpKQotI2VuZGlmCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qIGVuZCBvZiB0ZS1pYzk2MC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWxpbnV4LmggYi9nYXMvY29uZmlnL3RlLWxpbnV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzVhN2EuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1saW51eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jZGVmaW5lIFRFX0xJTlVYCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWxuZXdzLmggYi9nYXMvY29uZmlnL3RlLWxuZXdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYmNjNWEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1sbmV3cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0vKiB0ZS1sbmV3cy5oIC0tIGxpdHRsZS1lbmRpYW4gTkVXUyBlbXVsYXRpb24uICAqLwotCi0jZGVmaW5lIEVDT0ZGX0xJVFRMRV9GT1JNQVQgImVjb2ZmLWJpZ2xpdHRsZW1pcHMiCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWx5bnguaCBiL2dhcy9jb25maWcvdGUtbHlueC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDg1MTVkLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtbHlueC5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jZGVmaW5lIFRFX0xZTlgKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotI2lmbmRlZiBMT0NBTF9MQUJFTFNfRkIKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1tYWNoLmggYi9nYXMvY29uZmlnL3RlLW1hY2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1NDdmOC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLW1hY2guaAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotI2RlZmluZSBURV9NYWNoCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1tYWNvcy5oIGIvZ2FzL2NvbmZpZy90ZS1tYWNvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjQ4ZGM0Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtbWFjb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0ZS1tYWNvcy5oLiAgKi8KLQotI2RlZmluZSBURV9QT1dFUk1BQyAxCi0KLS8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQotICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCi0gICBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtbXVsdGkuaCBiL2dhcy9jb25maWcvdGUtbXVsdGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlZGE0NS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLW11bHRpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHRlLWdlbmVyaWMuaCBhbmQgaXMgaW50ZW5kZWQgdG8gYmUgYSB0ZW1wbGF0ZSBmb3IKLSAqIHRhcmdldCBlbnZpcm9ubWVudCBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0gKgotICogSXQgaXMgbXkgaW50ZW50IHRoYXQgdGhpcyBmaWxlIHdpbGwgZXZvbHZlIGludG8gYSBmaWxlIHN1aXRhYmxlIGZvciBjb25maWcsCi0gKiBjb21waWxlLCBhbmQgY29weWluZyBhcyBhbiBhaWQgZm9yIHRlc3RpbmcgYW5kIHBvcnRpbmcuICB4b3hvcmljaC4KLSAqLwotCi0vKiBBZGRlZCB0aGVzZSwgYmVjYXVzZSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgd2UncmUgdGFyZ2V0dGluZyB3ZSBtYXkKLSAgIG5lZWQgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgbGliZ2NjLCBhbmQgdGhhdCB3aWxsIHVzZSBsb2NhbAotICAgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLS8qIHRoZXNlIGRlZmluZSBpbnRlcmZhY2VzICovCi0jaWZkZWYgT0JKX0hFQURFUgotI2luY2x1ZGUgT0JKX0hFQURFUgotI2Vsc2UKLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0jZW5kaWYKLQotLyogZW5kIG9mIHRlLWdlbmVyaWMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1uYnNkLmggYi9nYXMvY29uZmlnL3RlLW5ic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlNDYwMC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLW5ic2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qIHRlLW5ic2QuaCAtLSBOZXRCU0QgdGFyZ2V0IGVudmlyb25tZW50IGRlY2xhcmF0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotICAgCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotICAgCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRFX05ldEJTRAkxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1uYnNkNTMyLmggYi9nYXMvY29uZmlnL3RlLW5ic2Q1MzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNmOWU1Zi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLW5ic2Q1MzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGUtbmV0YnNkNTMyLmgKLSAqCi0gKiBXcml0dGVuIGJ5IElhbiBEYWxsIDxpZGFsbEBlbGVjZW5nLmFkZWxhaWRlLmVkdS5hdT4KLSAqIAotICogMTktSnVuLTk0Ci0gKiAKLSAqLwotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJhLm91dC1uczMyay1uZXRic2QiCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qIE1heWJlIHRoZXNlIHNob3VsZCBiZSBtb3JlIGxpa2UgVENfTlMzMjUzMiBhbmQgVENfTlMzMjM4MSBpbiBjYXNlCi0gKiBvZiBjb25mbGljdHMuIE5TMzIzODEgaXMgdXNlZCBpbiBvcGNvZGUvbnMzMmsuaCBhbmQgdGhhdCBpcyBhbHNvCi0gKiB1c2VkIGJ5IEdEQi4gTmVlZCB0byBjaGVjay4KLSAqLwotI2RlZmluZSBOUzMyNTMyCi0jZGVmaW5lIE5TMzIzODEKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtcGM1MzJtYWNoLmggYi9nYXMvY29uZmlnL3RlLXBjNTMybWFjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWU3ZmY4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtcGM1MzJtYWNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHRlLXBjNTMyLmgKLSAqCi0gKiBXcml0dGVuIGJ5IElhbiBEYWxsIDxpZGFsbEBlbGVjZW5nLmFkZWxhaWRlLmVkdS5hdT4KLSAqIAotICogMjQtTWF5LTk0Ci0gKiAKLSAqLwotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJhLm91dC1wYzUzMi1tYWNoIgotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKiBNYXliZSB0aGVzZSBzaG91bGQgYmUgbW9yZSBsaWtlIFRDX05TMzI1MzIgYW5kIFRDX05TMzIzODEgaW4gY2FzZQotICogb2YgY29uZmxpY3RzLiBOUzMyMzgxIGlzIHVzZWQgaW4gb3Bjb2RlL25zMzJrLmggYW5kIHRoYXQgaXMgYWxzbwotICogdXNlZCBieSBHREIuIE5lZWQgdG8gY2hlY2suCi0gKi8KLSNkZWZpbmUgTlMzMjUzMgotI2RlZmluZSBOUzMyMzgxCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXBlLmggYi9nYXMvY29uZmlnL3RlLXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMWYwYjIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1wZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jZGVmaW5lIFRFX1BFCi0jZGVmaW5lIExFWF9BVCAxIC8qIGNhbiBoYXZlIEAncyBpbnNpZGUgbGFiZWxzICovCi0KLS8qIFRoZSBQRSBmb3JtYXQgc3VwcG9ydHMgbG9uZyBzZWN0aW9uIG5hbWVzLiAgKi8KLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtcHBjbncuaCBiL2dhcy9jb25maWcvdGUtcHBjbncuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkZjA1MC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXBwY253LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiB0ZS1wcGNudy5oIC0tIFBvd2VyIFBDIHJ1bm5pbmcgTmV0d2FyZSBlbnZpcm9ubWVudCBkZWNsYXJhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0gICAKLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0gICAKLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQWRkZWQgdGhlc2UsIGJlY2F1c2UgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3JlIHRhcmdldHRpbmcgd2UgbWF5Ci0gICBuZWVkIGFuIGFzc2VtYmxlciB2ZXJzaW9uIG9mIGxpYmdjYywgYW5kIHRoYXQgd2lsbCB1c2UgbG9jYWwKLSAgIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiB0aGVzZSBkZWZpbmUgaW50ZXJmYWNlcyAqLwotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyogZ2NjIHVzZXMgZXNjYXBlIHNlcXVlbmNlcyBmb3IgcHBjL25ldHdhcmUgKi8KLQotI3VuZGVmIE5PX1NUUklOR19FU0NBUEVTCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXBzb3MuaCBiL2dhcy9jb25maWcvdGUtcHNvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWQ0MTUzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtcHNvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyB0ZS1wc29zLmggZm9yIGVtYmVkZGVkIHN5c3RlbXMgcnVubmluZyBwU09TLgotICogQ29udHJpYnV0ZWQgYnkgTWFydGluIEFuYW50aGFyYW1hbiAobWFydGluQG1haWwuaW1lY2gudW5pLWR1aXNidXJnLmRlKQotICovCi0KLSNkZWZpbmUgVEVfUFNPUwotCi0vKiBBZGRlZCB0aGVzZSwgYmVjYXVzZSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgd2UncmUgdGFyZ2V0dGluZyB3ZSBtYXkKLSAgIG5lZWQgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgbGliZ2NjLCBhbmQgdGhhdCB3aWxsIHVzZSBsb2NhbAotICAgbGFiZWxzLiAgKi8KLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogVGhpcyBtYWtlcyBHQVMgbW9yZSB2ZXJzYXRpbGUgYW5kIGJsb2NrcyBzb21lIEVMRidpc21zIGluCi0gICB0Yy1tNjhrLmguICovCi0KLSNkZWZpbmUgUkVHSVNURVJfUFJFRklYX09QVElPTkFMIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyogZW5kIG9mIHRlLXBzb3MuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1yaXNjaXguaCBiL2dhcy9jb25maWcvdGUtcmlzY2l4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzI1M2UuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1yaXNjaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2RlZmluZSBURV9SSVNDSVgKLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtc3BhcmNhb3V0LmggYi9nYXMvY29uZmlnL3RlLXNwYXJjYW91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzEwMTg0Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtc3BhcmNhb3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKiB0ZS1zcGFyY2FvdXQuaCAtLSBlbWJlZGRlZCBzcGFyYy1hb3V0IHRhcmdldCBlbnZpcm9ubWVudCBkZWNsYXJhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0gICAKLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0gICAKLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBURV9TUEFSQ0FPVVQJMQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtc3VuMy5oIGIvZ2FzL2NvbmZpZy90ZS1zdW4zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NWQ0MmIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1zdW4zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKiB0ZS1zdW4zLmggLS0gU3VuLTMgdGFyZ2V0IGVudmlyb25tZW50IGRlY2xhcmF0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIHRoZSAjZGVmaW5lcyBzcGVjaWZpYwotICAgdG8gU1VOIGNvbXB1dGVyIFNVTiAzIHNlcmllcyBjb21wdXRlcnMuICAoVGhlIG9ubHkga2luZAotICAgd2UgaGF2ZSBhcm91bmQgaGVyZSwgdW5mb3J0dW5hdGx5LikKLQotICAgUnVtb3IgaGFzIGl0IHRoYXQgdGhpcyBmaWxlIHdpbGwgd29yayBvbiB0aGUgU3VuLTIgaWYgdGhlIGFzc2VtYmxlcgotICAgaXMgY2FsbGVkIHdpdGggLW02ODAxMCAgVGhpcyBpcyBub3QgdGVzdGVkLiAgKi8KLQotCi0jZGVmaW5lIFRFX1NVTjMJMQotCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiBDb3VsZCBhbHNvIGJlIDoKLSAgICNkZWZpbmUgU19MT0NBTF9OQU1FKHMpCShTX0dFVF9OQU1FKHMpWzBdID09ICcuJyAmJgotICAgU19HRVRfTkFNRShzKVsxXSA9PSAnTCcgfHwKLSAgIFNfR0VUX05BTUUocylbMV0gPT0gJy4nKQotICAgKi8KLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRlLXN1bjMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1zdnI0LmggYi9nYXMvY29uZmlnL3RlLXN2cjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxN2VlMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXN2cjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI2RlZmluZSBURV9TVlI0Ci0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXN5c3YzMi5oIGIvZ2FzL2NvbmZpZy90ZS1zeXN2MzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzZTZlNS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXN5c3YzMi5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0vKiBSZW1vdmUgbGVhZGluZyB1bmRlcnNjb3JlIGZyb20gdGhlIGdjYyBnZW5lcmF0ZWQgc3ltYm9sIG5hbWVzICovCi0jZGVmaW5lIFNUUklQX1VOREVSU0NPUkUKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyogZW5kIG9mIHRlLXN5c3YzMi5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3ZheC1pbnN0LmggYi9nYXMvY29uZmlnL3ZheC1pbnN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZDhmOTguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy92YXgtaW5zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyogdmF4LWluc3QuaCAtIEdOVSAtIFBhcnQgb2YgdmF4LmMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MiwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogVGhpcyBpcyBwYXJ0IG9mIHZheC1pbnMtcGFyc2UuYyAmIGZyaWVuZHMuCi0gKiBXZSB3YW50IHRvIHBhcnNlIGEgdmF4IGluc3RydWN0aW9uIHRleHQgaW50byBhIHRyZWUgZGVmaW5lZCBoZXJlLgotICovCi0KLSNkZWZpbmUgVklUX01BWF9PUEVSQU5EUyAoNikJLyogbWF4aW11bSBudW1iZXIgb2Ygb3BlcmFuZHMgaW4gb25lICAgICAgICovCi0vKiBzaW5nbGUgdmF4IGluc3RydWN0aW9uICovCi0KLXN0cnVjdCB2b3AJCQkvKiB2YXggaW5zdHJ1Y3Rpb24gb3BlcmFuZCAgICAgICAgICAgICAgICAgKi8KLXsKLSAgc2hvcnQgaW50IHZvcF9uZHg7CQkvKiAtMSwgb3IgaW5kZXggcmVnaXN0ZXIuIGVnIDc9W1I3XQkgICAqLwotICBzaG9ydCBpbnQgdm9wX3JlZzsJCS8qIC0xLCBvciByZWdpc3RlciBudW1iZXIuIGVnIEBJXiM9MHhGICAgICAqLwotICAvKiBIZWxwcyBkaXN0aW5ndWlzaCAiYWJzIiBmcm9tICJhYnMoUEMpIi4gKi8KLSAgc2hvcnQgaW50IHZvcF9tb2RlOwkJLyogYWRkcmVzc2luZyBtb2RlIDQgYml0cy4gZWcgSV4jPTB4OQkgICAqLwotICBjaGFyIHZvcF9zaG9ydDsJCS8qIG9wZXJhbmQgZGlzcGxhY2VtZW50IGxlbmd0aCBhcyB3cml0dGVuICAqLwotICAvKiAnICc9bm9uZSwgImJpbHN3Ij1CXkleTF5TXldeLiAgICAgICAgICAgKi8KLSAgY2hhciB2b3BfYWNjZXNzOwkJLyogJ2InYnJhbmNoICcgJ25vLWluc3RydWN0aW9uICdhbXJ2dydub3JtICovCi0gIGNoYXIgdm9wX3dpZHRoOwkJLyogT3BlcmFuZCB3aWR0aCwgb25lIG9mICJiZGZnaGxvcXciCSAgICovCi0gIGNvbnN0IGNoYXIgKnZvcF93YXJuOwkJLyogd2FybmluZyBtZXNzYWdlIG9mIHRoaXMgb3BlcmFuZCwgaWYgYW55ICovCi0gIGNvbnN0IGNoYXIgKnZvcF9lcnJvcjsJLyogc2F5IGlmIG9wZXJhbmQgaXMgaW5hcHByb3ByaWF0ZSAgICAgICAgICovCi0gIGNoYXIgKnZvcF9leHByX2JlZ2luOwkJLyogVW5wYXJzZWQgZXhwcmVzc2lvbiwgMXN0IGNoYXIgLi4uCSAgICovCi0gIGNoYXIgKnZvcF9leHByX2VuZDsJCS8qIC4uLiBsYXN0IGNoYXIuCQkJICAgKi8KLSAgdW5zaWduZWQgY2hhciB2b3BfbmJ5dGVzOwkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gZGF0dW0JCSAgICovCi19OwotCi0KLXR5cGVkZWYgbG9uZyB2YXhfb3Bjb2RlVDsJLyogRm9yIGluaXRpYWxpc2luZyBhcnJheSBvZiBvcGNvZGVzCSAgICovCi0vKiBTb21lIHN5bnRoZXRpYyBvcGNvZGVzID4gMTYgYml0cyEgICAgICAgKi8KLQotI2RlZmluZSBWSVRfT1BDT0RFX1NZTlRIRVRJQyAweDgwMDAwMDAwCS8qIE5vdCByZWFsIGhhcmR3YXJlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVklUX09QQ09ERV9TUEVDSUFMICAgMHg0MDAwMDAwMAkvKiBOb3Qgbm9ybWFsIGJyYW5jaCBvcHRpbWlzaW5nLiAgICovCi0vKiBOZXZlciBzZXQgd2l0aG91dCAuLi5fU1lOVEhFVElDICovCi0KLSNkZWZpbmUgVkFYX1dJRFRIX1VOQ09ORElUSU9OQUxfSlVNUCAnLScJLyogVGhlc2UgYXJlIGVuY29kZWQgaW50byAgICAgICAgICovCi0jZGVmaW5lIFZBWF9XSURUSF9DT05ESVRJT05BTF9KVU1QICAgJz8nCS8qIHZvcF93aWR0aCB3aGVuIHZvcF9hY2Nlc3M9PSdiJyAqLwotI2RlZmluZSBWQVhfV0lEVEhfV09SRF9KVU1QICAgICAgICAgICchJwkvKiBhbmQgVklUX09QQ09ERV9TWU5USEVUSUMgc2V0LiAgKi8KLSNkZWZpbmUgVkFYX1dJRFRIX0JZVEVfSlVNUAkgICAgICc6JwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBWQVhfSk1QICgweDE3KQkJLyogVXNlZnVsIGZvciBicmFuY2ggb3B0aW1pc2luZy4gSnVtcCBpbnN0ciovCi0jZGVmaW5lIFZBWF9QQ19SRUxBVElWRV9NT0RFICgweGVmKQkvKiBVc2UgaXQgYWZ0ZXIgVkFYX0pNUAkJICAgKi8KLSNkZWZpbmUgVkFYX0FCU09MVVRFX01PREUgKDB4OUYpLyogVXNlIGFzIEAjLi4uCQkJICAgKi8KLSNkZWZpbmUgVkFYX0JSQiAoMHgxMSkJCS8qIENhbm9uaWNhbCBicmFuY2guCQkJICAgKi8KLSNkZWZpbmUgVkFYX0JSVyAoMHgzMSkJCS8qIEFub3RoZXIgY2Fub25pY2FsIGJyYW5jaAkJICAgKi8KLSNkZWZpbmUgVkFYX1dJREVOX1dPUkQgKDB4MjApCS8qIEFkZCB0aGlzIHRvIGJ5dGUgYnJhbmNoIHRvIGdldCB3b3JkIGJyLiAqLwotI2RlZmluZSBWQVhfV0lERU5fTE9ORyAoMHg2KQkvKiBBZGQgdGhpcyB0byBieXRlIGJyYW5jaCB0byBnZXQgbG9uZyBqbXAuKi8KLS8qIE5lZWRzIFZBWF9QQ19SRUxBVElWRV9NT0RFIGJ5dGUgYWZ0ZXIgaXQqLwotCi1zdHJ1Y3Qgdml0CQkJLyogdmF4IGluc3RydWN0aW9uIHRyZWUgICAgICAgICAgICAgICAgICAgICovCi17Ci0gIC8qIHZpdF9vcGNvZGUgaXMgY2hhcltdIGZvciBwb3J0YWJpbGl0eS4gICAqLwotICBjaGFyIHZpdF9vcGNvZGVbc2l6ZW9mICh2YXhfb3Bjb2RlVCldOwotICB1bnNpZ25lZCBjaGFyIHZpdF9vcGNvZGVfbmJ5dGVzOwkvKiBIb3cgbG9uZyBpcyBfb3Bjb2RlPyAoY2hhcnMpCSAgICovCi0gIHVuc2lnbmVkIGNoYXIgdml0X29wZXJhbmRzOwkvKgkJCQkJICAgKi8KLSAgc3RydWN0IHZvcCB2aXRfb3BlcmFuZFtWSVRfTUFYX09QRVJBTkRTXTsJLyogb3BlcmFuZHMgICAgICAgICAgICAgKi8KLSAgY29uc3QgY2hhciAqdml0X2Vycm9yOwkvKiAiIiBvciBlcnJvciB0ZXh0ICovCi19OwotCi0vKiBlbmQgb2YgdmF4LWluc3QuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy92bXMtYS1jb25mLmggYi9nYXMvY29uZmlnL3Ztcy1hLWNvbmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4ZmM2OC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3Ztcy1hLWNvbmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKiB2bXMtYWxwaGEtY29uZi5oLiAgR2VuZXJhdGVkIG1hbnVhbGx5IGZyb20gY29uZi5pbiwKLSAgIGFuZCB1c2VkIGJ5IGNvbmZpZy1nYXMtYWxwaGEuY29tIHdoZW4gY29uc3RydWN0aW5nIGNvbmZpZy5oLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotI3VuZGVmIENfQUxMT0NBCi0jZWxzZQotI2RlZmluZSBDX0FMTE9DQQotI2VuZGlmCi0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jdW5kZWYgaW5saW5lCi0jZWxzZQotI2RlZmluZSBpbmxpbmUKLSNlbmRpZgotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotCVNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLQlTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLQlTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAoLTEpCi0KLS8qIFNob3VsZCBnYXMgdXNlIGhpZ2gtbGV2ZWwgQkZEIGludGVyZmFjZXM/ICAqLwotI2RlZmluZSBCRkRfQVNTRU1CTEVSCi0KLS8qIFNvbWUgYXNzZXJ0L3ByZXByb2Nlc3NvciBjb21iaW5hdGlvbnMgYXJlIGluY2FwYWJsZSBvZiBoYW5kbGluZwotICAgY2VydGFpbiBraW5kcyBvZiBjb25zdHJ1Y3RzIGluIHRoZSBhcmd1bWVudCBvZiBhc3NlcnQuICBGb3IgZXhhbXBsZSwKLSAgIHF1b3RlZCBzdHJpbmdzIChpZiByZXF1b3RpbmcgaXNuJ3QgZG9uZSByaWdodCkgb3IgbmV3bGluZXMuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jdW5kZWYgQlJPS0VOX0FTU0VSVAotI2Vsc2UKLSNkZWZpbmUgQlJPS0VOX0FTU0VSVAotI2VuZGlmCi0KLS8qIElmIHdlIGFyZW4ndCBkb2luZyBjcm9zcy1hc3NlbWJsaW5nLCBzb21lIG9wZXJhdGlvbnMgY2FuIGJlIG9wdGltaXplZCwKLSAgIHNpbmNlIGJ5dGUgb3JkZXJzIGFuZCB2YWx1ZSBzaXplcyBkb24ndCBuZWVkIHRvIGJlIGFkanVzdGVkLiAgKi8KLSN1bmRlZiBDUk9TU19DT01QSUxFCi0KLS8qIFNvbWUgZ2FzIGNvZGUgd2FudHMgdG8ga25vdyB0aGVzZSBwYXJhbWV0ZXJzLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0FMSUFTCSJhbHBoYS12bXMiCi0jZGVmaW5lIFRBUkdFVF9DUFUJImFscGhhIgotI2RlZmluZSBUQVJHRVRfQ0FOT05JQ0FMCSJhbHBoYS1kZWMtdm1zIgotI2RlZmluZSBUQVJHRVRfT1MJIm9wZW5WTVMvQWxwaGEiCi0jZGVmaW5lIFRBUkdFVF9WRU5ET1IJImRlYyIKLQotLyogU29tZXRpbWVzIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGRvbid0IGRlY2xhcmUgbWFsbG9jIGFuZCByZWFsbG9jLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQwotCi0vKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBmcmVlLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUKLQotLyogU29tZXRpbWVzIGVycm5vLmggZG9lc24ndCBkZWNsYXJlIGVycm5vIGl0c2VsZi4gICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FUlJOTwotCi0jdW5kZWYgTUFOWV9TRUdNRU5UUwotCi0vKiBOZWVkZWQgb25seSBmb3Igc3BhcmMgY29uZmlndXJhdGlvbiAqLwotI3VuZGVmIHNwYXJjdjkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByZW1vdmUgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX1JFTU9WRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHVubGluayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9VTkxJTksKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZXJybm8uaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX0VSUk5PX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01FTU9SWV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGFyZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1REQVJHX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSAotI2Vsc2UKLSN1bmRlZiBIQVZFX1NZU19UWVBFU19ICi0jZW5kaWYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9VTklTVERfSAkvKiBjb25maWctZ2FzLmNvbSB3aWxsIG1ha2Ugb25lIGlmIG5lY2Vzc2FyeSAqLwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YXJhcmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBUkFSR1NfSAotCi0vKiBWTVMtc3BlY2lmaWM6ICB3ZSBuZWVkIHRvIHNldCB1cCBFWElUX3h4eCBoZXJlIGJlY2F1c2UgdGhlIGRlZmF1bHQKLSAgIHZhbHVlcyBpbiBhcy5oIGFyZSBpbmFwcHJvcHJpYXRlIGZvciBWTVMsIGJ1dCB3ZSBhbHNvIHdhbnQgdG8gcHJldmVudAotICAgYXMuaCdzIGluY2x1c2lvbiBvZiA8c3RkbGliLmg+IGZyb20gdHJpZ2dlcmluZyByZWRlZmluaXRpb24gd2FybmluZ3MuCi0gICA8c3RkbGliLmg+IGd1YXJkcyBpdHNlbGYgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24sIHNvIGluY2x1ZGluZyBpdAotICAgaGVyZSB0dXJucyBhcy5oJ3MgbGF0ZXIgI2luY2x1ZGUgaW50byBhIG5vLW9wLiAgKFdlIGNhbid0IHNpbXBseSB1c2UKLSAgICNpZm5kZWYgSEFWRV9TVERMSUJfSCBoZXJlLCBiZWNhdXNlIHRoZSA8c3RkbGliLmg+IGluIHNldmVyYWwgb2xkZXIKLSAgIGdjYy12bXMgZGlzdHJpYnV0aW9ucyBuZWdsZWN0cyB0byBkZWZpbmUgdGhlc2UgdHdvIHJlcXVpcmVkIG1hY3Jvcy4pICAqLwotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmIF9fREVDQwotI3VuZGVmIEVYSVRfU1VDQ0VTUwotI3VuZGVmIEVYSVRfRkFJTFVSRQotI2RlZmluZSBFWElUX1NVQ0NFU1MgMQkJCS8qIFNTJF9OT1JNQUwsIFNUUyRLX1NVQ0NFU1MgKi8KLSNkZWZpbmUgRVhJVF9GQUlMVVJFIDB4MTAwMDAwMDIJCS8qIChTVFMkS19FUlJPUiB8IFNUUyRNX0lOSElCX01TRykgKi8KLSNlbmRpZgotCi0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2lmIF9fREVDQwotZXh0ZXJuIGludCBzdHJjYXNlY21wICgpOwotZXh0ZXJuIGludCBzdHJuY2FzZWNtcCAoKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy92bXMtY29uZi5oIGIvZ2FzL2NvbmZpZy92bXMtY29uZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjI1Y2ZjLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdm1zLWNvbmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKiB2bXMtY29uZi5oLiAgR2VuZXJhdGVkIG1hbnVhbGx5IGZyb20gY29uZi5pbiwKLSAgIGFuZCB1c2VkIGJ5IGNvbmZpZy1nYXMuY29tIHdoZW4gY29uc3RydWN0aW5nIGNvbmZpZy5oLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotI3VuZGVmIENfQUxMT0NBCi0jZWxzZQotI2RlZmluZSBDX0FMTE9DQQotI2VuZGlmCi0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jdW5kZWYgaW5saW5lCi0jZWxzZQotI2RlZmluZSBpbmxpbmUKLSNlbmRpZgotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAoLTEpCi0KLS8qIERlZmluZSBpZiBsZXggZGVjbGFyZXMgeXl0ZXh0IGFzIGEgY2hhciAqIGJ5IGRlZmF1bHQsIG5vdCBhIGNoYXJbXS4gICovCi0jdW5kZWYgWVlURVhUX1BPSU5URVIKLQotLyogTmFtZSBvZiBwYWNrYWdlLiAgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gb2YgcGFja2FnZS4gICovCi0vKiBEZWZpbmUgaW4gYnkgY29uZmlnLWdhcy5jb20gKi8KLS8qICN1bmRlZiBWRVJTSU9OICovCi0KLS8qIFNob3VsZCBnYXMgdXNlIGhpZ2gtbGV2ZWwgQkZEIGludGVyZmFjZXM/ICAqLwotI3VuZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogU29tZSBhc3NlcnQvcHJlcHJvY2Vzc29yIGNvbWJpbmF0aW9ucyBhcmUgaW5jYXBhYmxlIG9mIGhhbmRsaW5nCi0gICBjZXJ0YWluIGtpbmRzIG9mIGNvbnN0cnVjdHMgaW4gdGhlIGFyZ3VtZW50IG9mIGFzc2VydC4gIEZvciBleGFtcGxlLAotICAgcXVvdGVkIHN0cmluZ3MgKGlmIHJlcXVvdGluZyBpc24ndCBkb25lIHJpZ2h0KSBvciBuZXdsaW5lcy4gICovCi0jaWZkZWYgX19HTlVDX18KLSN1bmRlZiBCUk9LRU5fQVNTRVJUCi0jZWxzZQotI2RlZmluZSBCUk9LRU5fQVNTRVJUCi0jZW5kaWYKLQotLyogSWYgd2UgYXJlbid0IGRvaW5nIGNyb3NzLWFzc2VtYmxpbmcsIHNvbWUgb3BlcmF0aW9ucyBjYW4gYmUgb3B0aW1pemVkLAotICAgc2luY2UgYnl0ZSBvcmRlcnMgYW5kIHZhbHVlIHNpemVzIGRvbid0IG5lZWQgdG8gYmUgYWRqdXN0ZWQuICAqLwotI3VuZGVmIENST1NTX0NPTVBJTEUKLQotLyogU29tZSBnYXMgY29kZSB3YW50cyB0byBrbm93IHRoZXNlIHBhcmFtZXRlcnMuICAqLwotI2RlZmluZSBUQVJHRVRfQUxJQVMJInZtcyIKLSNkZWZpbmUgVEFSR0VUX0NQVQkidmF4IgotI2RlZmluZSBUQVJHRVRfQ0FOT05JQ0FMCSJ2YXgtZGVjLXZtcyIKLSNkZWZpbmUgVEFSR0VUX09TCSJ2bXMiCi0jZGVmaW5lIFRBUkdFVF9WRU5ET1IJImRlYyIKLQotLyogU29tZXRpbWVzIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGRvbid0IGRlY2xhcmUgc3Ryc3RyLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotCi0vKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBtYWxsb2MgYW5kIHJlYWxsb2MuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DCi0KLS8qIFNvbWV0aW1lcyB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBkb24ndCBkZWNsYXJlIGZyZWUuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotCi0vKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBzYnJrLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLQotLyogU29tZXRpbWVzIGVycm5vLmggZG9lc24ndCBkZWNsYXJlIGVycm5vIGl0c2VsZi4gICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FUlJOTwotCi0jdW5kZWYgTUFOWV9TRUdNRU5UUwotCi0vKiBUaGUgY29uZmlndXJlIHNjcmlwdCBkZWZpbmVzIHRoaXMgZm9yIHNvbWUgdGFyZ2V0cyBiYXNlZCBvbiB0aGUKLSAgIHRhcmdldCBuYW1lIHVzZWQuICBJdCBpcyBub3QgYWx3YXlzIGRlZmluZWQuICAqLwotI3VuZGVmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0KLS8qIE5lZWRlZCBvbmx5IGZvciBzb21lIGNvbmZpZ3VyYXRpb25zIHRoYXQgY2FuIHByb2R1Y2UgbXVsdGlwbGUgb3V0cHV0Ci0gICBmb3JtYXRzLiAgKi8KLSN1bmRlZiBERUZBVUxUX0VNVUxBVElPTgotI3VuZGVmIEVNVUxBVElPTlMKLSN1bmRlZiBVU0VfRU1VTEFUSU9OUwotI3VuZGVmIE9CSl9NQVlCRV9BT1VUCi0jdW5kZWYgT0JKX01BWUJFX0JPVVQKLSN1bmRlZiBPQkpfTUFZQkVfQ09GRgotI3VuZGVmIE9CSl9NQVlCRV9FQ09GRgotI3VuZGVmIE9CSl9NQVlCRV9FTEYKLSN1bmRlZiBPQkpfTUFZQkVfR0VORVJJQwotI3VuZGVmIE9CSl9NQVlCRV9IUDMwMAotI3VuZGVmIE9CSl9NQVlCRV9JRUVFCi0jdW5kZWYgT0JKX01BWUJFX1NPTQotI3VuZGVmIE9CSl9NQVlCRV9WTVMKLQotLyogVXNlZCBmb3Igc29tZSBvZiB0aGUgQ09GRiBjb25maWd1cmF0aW9ucywgd2hlbiB0aGUgQ09GRiBjb2RlIG5lZWRzCi0gICB0byBzZWxlY3Qgc29tZXRoaW5nIGJhc2VkIG9uIHRoZSBDUFUgdHlwZSBiZWZvcmUgaXQga25vd3MgaXQuLi4gKi8KLSN1bmRlZiBJMzg2Q09GRgotI3VuZGVmIE02OEtDT0ZGCi0jdW5kZWYgTTg4S0NPRkYKLQotLyogVXNpbmcgY2dlbiBjb2RlPyAgKi8KLSN1bmRlZiBVU0lOR19DR0VOCi0KLS8qIE5lZWRlZCBvbmx5IGZvciBzcGFyYyBjb25maWd1cmF0aW9uLiAgKi8KLSN1bmRlZiBERUZBVUxUX0FSQ0gKLQotLyogTmVlZGVkIG9ubHkgZm9yIFBvd2VyUEMgU29sYXJpcy4gICovCi0jdW5kZWYgVEFSR0VUX1NPTEFSSVNfQ09NTUVOVAotCi0vKiBOZWVkZWQgb25seSBmb3IgU0NPIDUuICAqLwotI3VuZGVmIFNDT19FTEYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByZW1vdmUgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX1JFTU9WRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNicmsgZnVuY3Rpb24uICAqLwotLyogc2JyaygpIGlzIGF2YWlsYWJsZSwgYnV0IHdlIGRvbid0IHdhbnQgZ2FzIHRvIHVzZSBpdC4gICovCi0jdW5kZWYgSEFWRV9TQlJLCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdW5saW5rIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1VOTElOSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfRVJSTk9fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUVNT1JZX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkYXJnLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVERBUkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBIQVZFX1NZU19UWVBFU19ICi0jZWxzZQotI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKLSNlbmRpZgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1VOSVNURF9ICS8qIGNvbmZpZy1nYXMuY29tIHdpbGwgbWFrZSBvbmUgaWYgbmVjZXNzYXJ5ICovCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhcmFyZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFSQVJHU19ICi0KLS8qIFZNUy1zcGVjaWZpYzogIHdlIG5lZWQgdG8gc2V0IHVwIEVYSVRfeHh4IGhlcmUgYmVjYXVzZSB0aGUgZGVmYXVsdAotICAgdmFsdWVzIGluIGFzLmggYXJlIGluYXBwcm9wcmlhdGUgZm9yIFZNUywgYnV0IHdlIGFsc28gd2FudCB0byBwcmV2ZW50Ci0gICBhcy5oJ3MgaW5jbHVzaW9uIG9mIDxzdGRsaWIuaD4gZnJvbSB0cmlnZ2VyaW5nIHJlZGVmaW5pdGlvbiB3YXJuaW5ncy4KLSAgIDxzdGRsaWIuaD4gZ3VhcmRzIGl0c2VsZiBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbiwgc28gaW5jbHVkaW5nIGl0Ci0gICBoZXJlIHR1cm5zIGFzLmgncyBsYXRlciAjaW5jbHVkZSBpbnRvIGEgbm8tb3AuICAoV2UgY2FuJ3Qgc2ltcGx5IHVzZQotICAgI2lmbmRlZiBIQVZFX1NURExJQl9IIGhlcmUsIGJlY2F1c2UgdGhlIDxzdGRsaWIuaD4gaW4gc2V2ZXJhbCBvbGRlcgotICAgZ2NjLXZtcyBkaXN0cmlidXRpb25zIG5lZ2xlY3RzIHRvIGRlZmluZSB0aGVzZSB0d28gcmVxdWlyZWQgbWFjcm9zLikgICovCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI3VuZGVmIEVYSVRfU1VDQ0VTUwotI3VuZGVmIEVYSVRfRkFJTFVSRQotI2VuZGlmCi0jZGVmaW5lIEVYSVRfU1VDQ0VTUyAxCQkJLyogU1MkX05PUk1BTCwgU1RTJEtfU1VDQ0VTUyAqLwotI2RlZmluZSBFWElUX0ZBSUxVUkUgMHgxMDAwMDAwMgkJLyogKFNUUyRLX0VSUk9SIHwgU1RTJE1fSU5ISUJfTVNHKSAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZ3VyZSBiL2dhcy9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUzNmE3YmQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDU3NTIgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1iZmQtYXNzZW1ibGVyICB1c2UgQkZEIGJhY2sgZW5kIGZvciB3cml0aW5nIG9iamVjdCBmaWxlcyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gICAgdGFyZ2V0cyAgICAgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucyBiZXNpZGVzIHRoZSBwcmltYXJ5IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1hcy5oCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBlbHNlCi0gICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBmaQotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU5MjogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MTM6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLXRhcmdldF9hbGlhcz0kdGFyZ2V0Ci1jYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLXRhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKLXRhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi10YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotdGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYzMTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NjY6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzE5OiBjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiID4mNQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAotICAgZmkKLSAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIiQqIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgMT4mMjsgZXhpdCAxOyB9Ci0gICBmaQotCi0gICB0ZXN0ICIkMiIgPSBjb25mdGVzdGZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siIDE+JjI7IGV4aXQgMTsgfQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZWNobyAiJGFjX3QiInllcyIgMT4mNgotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc3NjogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci1zZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgotYWxsOgotCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCi1FT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCi1pZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcwotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0bWFrZQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgU0VUX01BS0U9Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi0KLVBBQ0tBR0U9Z2FzCi0KLVZFUlNJT049Mi45LjQKLQotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCi1FT0YKLQotCi0KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MjI6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBQ0xPQ0FMPWFjbG9jYWwKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODM1OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPQ09ORj1hdXRvY29uZgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPQ09ORj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2NvbmYiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg0ODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9tYWtlIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT01BS0U9YXV0b21ha2UKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT01BS0U9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9tYWtlIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg2MTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NzQ6IGNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChtYWtlaW5mbyAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIE1BS0VJTkZPPW1ha2VpbmZvCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIE1BS0VJTkZPPSIkbWlzc2luZ19kaXIvbWlzc2luZyBtYWtlaW5mbyIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc3RhdGljPXllcwotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5Mzc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk2NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTk3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA0ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA4MDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMTA5MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwOTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEyMjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMjc6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE1NTogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgb3IgLS13aXRob3V0LWdudS1sZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2dudV9sZCIKLSAgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotCi0KLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE5OTogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gIC8qIHwgW0EtWmEtel06XFwqKQotICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMTc6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIyMDogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0gICAgICAgIHRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maQotZmkKLQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExEIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLXRlc3QgLXogIiRMRCIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjU2OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nbnVfbGQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ251X2xkIiAxPiY2Ci0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjcyOiBjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTk0nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gL3Vzci91Y2IgL3Vzci9jY3MvYmluICRQQVRIIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICBhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLSAgICAgIGVsc2UKLSAgICAgICAgYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSIKLSAgICAgIGZpCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maQotZmkKLQotTk09IiRhY19jdl9wYXRoX05NIgotZWNobyAiJGFjX3QiIiROTSIgMT4mNgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMDc6IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTE5fUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotaWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGwKLXRoZW4KLSAgcm0gLWYgY29uZnRlc3RkYXRhCi0gIGFjX2N2X3Byb2dfTE5fUz0ibG4gLXMiCi1lbHNlCi0gIGFjX2N2X3Byb2dfTE5fUz1sbgotZmkKLWZpCi1MTl9TPSIkYWNfY3ZfcHJvZ19MTl9TIgotaWYgdGVzdCAiJGFjX2N2X3Byb2dfTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgotICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQotZWxzZQotICBhY190b29sX3ByZWZpeD0KLWZpCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ci10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGhvc3QiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJyNsaW5lIDEzNDkgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzNTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICA7OwotCi0qLSotY3lnd2luKikKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzc1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQwNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCIgJiYgYWNfY3ZfcHJvZ19ETExUT09MPSJmYWxzZSIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIERMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDQyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9IiR7YWNfdG9vbF9wcmVmaXh9YXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0NzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iYXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIiAmJiBhY19jdl9wcm9nX0FTPSJmYWxzZSIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBBUz0iZmFsc2UiCi1maQotZmkKLQotCi0gIDs7Ci0KLWVzYWMKLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxpYnRvb2wgY29uZmlndXJlIGZhaWxlZCIgMT4mMjsgZXhpdCAxOyB9Ci0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotCi11c2VyX2JmZF9nYXM9Ci0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtYmZkLWFzc2VtYmxlciBvciAtLWRpc2FibGUtYmZkLWFzc2VtYmxlciB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9iZmRfYXNzZW1ibGVyK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9iZmRfYXNzZW1ibGVyIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgbmVlZF9iZmQ9eWVzIHVzZXJfYmZkX2dhcz15ZXMgOzsKLSAgbm8pICB1c2VyX2JmZF9nYXM9bm8gOzsKLSAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZ2l2ZW4gZm9yIGJmZC1hc3NlbWJsZXIgb3B0aW9uIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGFyZ2V0cyBvciAtLWRpc2FibGUtdGFyZ2V0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV90YXJnZXRzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV90YXJnZXRzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnIiAxPiYyOyBleGl0IDE7IH0KLQkgICAgOzsKLSAgbm8pCSAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikJICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWMKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY29tbW9uYmZkbGliIG9yIC0tZGlzYWJsZS1jb21tb25iZmRsaWIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfY29tbW9uYmZkbGliK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9jb21tb25iZmRsaWIiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZmkKLQotdXNpbmdfY2dlbj1ubwotCi0jIEdlbmVyYXRlIGEgaGVhZGVyIGZpbGUKLQotCi0KLQotdGVfZmlsZT1nZW5lcmljCi0KLSMgTWFrZWZpbGUgdGFyZ2V0IGZvciBpbnN0YWxsaW5nIGdhcyBpbiAkKHRvb2xkaXIpL2Jpbi4KLWluc3RhbGxfdG9vbGRpcj1pbnN0YWxsLWV4ZWMtdG9vbGRpcgotCi1jYW5vbl90YXJnZXRzPSIiCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgotICBmb3IgdCBpbiBgZWNobyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYDsgZG8KLSAgICByZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0IDI+L2Rldi9udWxsYAotICAgIGlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgotICAgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHJlc3VsdCIKLSMgICAgZWxzZQotIyAgICAgICMgUGVybWl0ICJhbGwiLCBldGMuICBXZSBkb24ndCBzdXBwb3J0IGl0IHlldCB0aG91Z2guCi0jICAgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHQiCi0gICAgZmkKLSAgZG9uZQotICBfZ2FzX3VuaXFfbGlzdD0iJGNhbm9uX3RhcmdldHMiCi1fZ2FzX3VuaXFfbmV3bGlzdD0iIgotZm9yIF9nYXNfdW5pcV9pIGluIF9nYXNfdW5pcV9kdW1teSAkX2dhc191bmlxX2xpc3QgOyBkbwotICBjYXNlICRfZ2FzX3VuaXFfaSBpbgotICBfZ2FzX3VuaXFfZHVtbXkpIDs7Ci0gICopIGNhc2UgIiAkX2dhc191bmlxX25ld2xpc3QgIiBpbgotICAgICAgICoiICRfZ2FzX3VuaXFfaSAiKikgOzsKLSAgICAgICAqKSBfZ2FzX3VuaXFfbmV3bGlzdD0iJF9nYXNfdW5pcV9uZXdsaXN0ICRfZ2FzX3VuaXFfaSIgOzsKLSAgICAgZXNhYyA7OwotICBlc2FjCi1kb25lCi1jYW5vbl90YXJnZXRzPSRfZ2FzX3VuaXFfbmV3bGlzdAotCi1maQotCi1lbXVsYXRpb25zPSIiCi0KLWZvciB0aGlzX3RhcmdldCBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzIDsgZG8KLQotICAgIGV2YWwgYGVjaG8gJHRoaXNfdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvY3B1PVwxIHZlbmRvcj1cMiBvcz1cMy8nYAotCi0gICAgIyBjaGVjayBmb3IgYXJjaGl0ZWN0dXJlIHZhcmlhbnRzCi0gICAgYXJjaD0KLSAgICBlbmRpYW49Ci0gICAgY2FzZSAke2NwdX0gaW4KLSAgICAgIGFscGhhKikJCWNwdV90eXBlPWFscGhhIDs7Ci0gICAgICBhcm1lYikJCWNwdV90eXBlPWFybSBlbmRpYW49YmlnIDs7Ci0gICAgICBhcm0qKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIGFybWIqKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIGFybXYqbCkJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBhcm12KmIpCQljcHVfdHlwZT1hcm0gZW5kaWFuPWJpZyA7OwotICAgICAgc3Ryb25nYXJtKikJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIHRodW1iKikJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBocHBhKikJCWNwdV90eXBlPWhwcGEgOzsKLSAgICAgIGlbNDU2XTg2KQkJY3B1X3R5cGU9aTM4NiA7OwotICAgICAgbTY4MFswMTIzNDZdMCkJY3B1X3R5cGU9bTY4ayA7OwotICAgICAgbTY4MDA4KQkJY3B1X3R5cGU9bTY4ayA7OwotICAgICAgbTY4Mz8/KQkJY3B1X3R5cGU9bTY4ayA7OwotICAgICAgbTUyMDApCQljcHVfdHlwZT1tNjhrIDs7Ci0gICAgICBtOCopCQljcHVfdHlwZT1tODhrIDs7Ci0gICAgICBtaXBzKmVsKQkJY3B1X3R5cGU9bWlwcyBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzKikJCWNwdV90eXBlPW1pcHMgZW5kaWFuPWJpZyA7OwotICAgICAgcG93ZXJwY2xlKikJY3B1X3R5cGU9cHBjIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIHBvd2VycGMqKQkJY3B1X3R5cGU9cHBjIGVuZGlhbj1iaWcgOzsKLSAgICAgIHJzNjAwMCopCQljcHVfdHlwZT1wcGMgOzsKLSAgICAgIHNwYXJjbGl0ZSopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmNsaXRlIDs7Ci0gICAgICBzcGFyY2xldCopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmNsZXQgOzsKLSAgICAgIHNwYXJjNjQqKQkJY3B1X3R5cGU9c3BhcmMgYXJjaD12OS02NCA7OwotICAgICAgc3BhcmM4NngqKQljcHVfdHlwZT1zcGFyYyBhcmNoPXNwYXJjODZ4ICA7OwotICAgICAgc3BhcmMqKQkJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xpdGUgOzsgIyA/Pz8gU2VlIHRjLXNwYXJjLmMuCi0gICAgICB2ODUwKikJCWNwdV90eXBlPXY4NTAgOzsKLSAgICAgICopCQljcHVfdHlwZT0ke2NwdX0gOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldCA7IHRoZW4KLSAgICAgIHRhcmdldF9jcHVfdHlwZT0ke2NwdV90eXBlfQotICAgIGVsaWYgdGVzdCAke3RhcmdldF9jcHVfdHlwZX0gIT0gJHtjcHVfdHlwZX0gOyB0aGVuCi0gICAgICBjb250aW51ZQotICAgIGZpCi0KLSAgICBnZW5lcmljX3RhcmdldD0ke2NwdV90eXBlfS0kdmVuZG9yLSRvcwotICAgIGRldj1ubwotICAgIGJmZF9nYXM9bm8KLSAgICBlbT1nZW5lcmljCi0KLSAgICAjIGFzc2lnbiBvYmplY3QgZm9ybWF0Ci0gICAgY2FzZSAke2dlbmVyaWNfdGFyZ2V0fSBpbgotICAgICAgYTI5ay0qLWNvZmYpICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhMjlrLWFtZC11ZGkpICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstYW1kLWVibW9uKSAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYTI5ay1ueXUtc3ltMSkgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhMjlrLSotdnh3b3JrcyopICAgICAgZm10PWNvZmYgOzsKLQotICAgICAgYWxwaGEqLSotKnZtcyopCSAgICBmbXQ9ZXZheCA7OwotICAgICAgYWxwaGEqLSotbmV0d2FyZSopICAgIGZtdD1lY29mZiA7OwotICAgICAgYWxwaGEqLSotb3BlbmJzZCopICAgIGZtdD1lY29mZiA7OwotICAgICAgYWxwaGEqLSotb3NmKikgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgYWxwaGEqLSotbGludXhlY29mZiopIGZtdD1lY29mZiA7OwotICAgICAgYWxwaGEqLSotbGludXgtZ251KikgIGZtdD1lbGYgZW09bGludXggOzsKLSAgICAgIGFscGhhKi0qLW5ldGJzZCopICAgICBmbXQ9ZWxmIGVtPW5ic2QgOzsKLQotICAgICAgYXJjLSotZWxmKikgICAgICAgICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgYXJtLSotYW91dCkJICAgICAgICAgICAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICBhcm0tKi1jb2ZmIHwgdGh1bWItKi1jb2ZmKSAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGFybS0qLWVsZiB8IHRodW1iLSotZWxmKSAgICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBhcm0tKi1saW51eCphb3V0KikJICAgICAgICBmbXQ9YW91dCBlbT1saW51eCA7OwotICAgICAgYXJtLSotbGludXgqIHwgYXJtdiotKi1saW51eC1nbnUpCWZtdD1lbGYgIGVtPWxpbnV4IDs7Ci0gICAgICBhcm0tKi1uZXRic2QqKQkgICAgICAgICAgICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllcyA7OwotICAgICAgYXJtLSotb2FiaSB8IHRodW1iLSotb2FiaSkgICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIGFybS1lcG9jLXBlIHwgdGh1bWItZXBvYy1wZSkgICAgICBmbXQ9Y29mZiBlbT1lcG9jLXBlIDs7Ci0gICAgICBhcm0tKi1wZSB8IHRodW1iLSotcGUpICAgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIGFybS0qLXJpc2NpeCopCSAgICAgICAgICAgICAgICBmbXQ9YW91dCBlbT1yaXNjaXggOzsKLQotICAgICAgZDEwdi0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgZDMwdi0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0KLSAgICAgIGZyMzAtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgaHBwYS0qLSplbGYqKSAgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWxpdGVzKikgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OwotICAgICAgaHBwYS0qLW9zZiopICAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotICAgICAgaHBwYS0qLXJ0ZW1zKikgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWhwdXgqKSAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotICAgICAgaHBwYS0qLW1wZWl4KikgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWJzZCopICAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWhpdXgqKSAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotCi0gICAgICBoODMwMC0qLWNvZmYpICAgICAgICAgZm10PWNvZmYgOzsKLQotICAgICAgaTM4Ni1pYm0tYWl4KikgICAgICAgIGZtdD1jb2ZmIGVtPWkzODZhaXggOzsKLSAgICAgIGkzODYtc2VxdWVudC1ic2QqKSAgICBmbXQ9YW91dCBlbT1keW5peCBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWJlb3NwZSopICAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotYmVvc2VsZiogfCBpMzg2LSotYmVvcyopIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1ic2QqKSAgICAgICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKLSAgICAgIGkzODYtKi1uZXRic2QwLjgpICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKLSAgICAgIGkzODYtKi1uZXRic2QqKSAgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzOzsKLSAgICAgIGkzODYtKi1vcGVuYnNkKikgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzOzsKLSAgICAgIGkzODYtKi1saW51eCphb3V0KiB8IGkzODYtKi1saW51eG9sZGxkKSAgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBpMzg2LSotbGludXgqY29mZiopICAgZm10PWNvZmYgZW09bGludXggOzsKLSAgICAgIGkzODYtKi1saW51eC1nbnUqKSAgICBmbXQ9ZWxmIGVtPWxpbnV4IGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotbHlueG9zKikgICAgICAgZm10PWNvZmYgZW09bHlueCA7OwotICAgICAgaTM4Ni0qLXN5c3Y0KiB8IGkzODYtKi1zb2xhcmlzKiB8IGkzODYtKi1lbGYpCi0JCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWZyZWVic2RlbGYqKSAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1mcmVlYnNkKikgICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKLSAgICAgIGkzODYtKi1jb2ZmIHwgaTM4Ni0qLXN5c3YqIHwgaTM4Ni0qLXNjbzMuMnY1KmNvZmYgfCBpMzg2LSotaXNjKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGkzODYtKi1zY28zLjJ2NSopICAgICAgZm10PWVsZgotCQkJICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0OyB0aGVuCi0JCQkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNDT19FTEYgMQotRU9GCi0KLQkJCSAgICBmaQotCQkJICAgIDs7Ci0gICAgICBpMzg2LSotc2NvMy4yKikgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGkzODYtKi12c3RhKSAgICAgICAgICBmbXQ9YW91dCA7OwotICAgICAgaTM4Ni0qLW1zZG9zZGpncHAqIHwgaTM4Ni0qLWdvMzIqIHwgaTM4Ni1nbzMyLXJ0ZW1zKikKLQkJCSAgICBmbXQ9Y29mZiBlbT1nbzMyOzsKLSAgICAgIGkzODYtKi1ydGVtc2VsZiopICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBpMzg2LSotcnRlbXMqKSAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGkzODYtKi1nbnUqKSAgICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBpMzg2LSotbWFjaCopCi0JCQkgICAgZm10PWFvdXQgZW09bWFjaCBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLW1zZG9zKikgICAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICBpMzg2LSotbW9zcyopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBpMzg2LSotcGUpICAgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIGkzODYtKi1jeWd3aW4qKSAgICAgICBmbXQ9Y29mZiBlbT1wZSBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLW1pbmd3MzIqKSAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotKm50KikgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIGk5NjAtKi1ib3V0KSAgICAgICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLWNvZmYpICAgICAgICAgIGZtdD1jb2ZmIGVtPWljOTYwIDs7Ci0gICAgICBpOTYwLSotcnRlbXMqKSAgICAgICAgZm10PWNvZmYgZW09aWM5NjAgOzsKLSAgICAgIGk5NjAtKi1uaW5keSopICAgICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3M0KikgICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotdnh3b3JrczUuMCkgICAgZm10PWJvdXQgOzsKLSAgICAgIGk5NjAtKi12eHdvcmtzNS4qKSAgICBmbXQ9Y29mZiBlbT1pYzk2MCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3MqKSAgICAgIGZtdD1ib3V0IDs7Ci0KLSAgICAgIG0zMnItKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgbTY4ay0qLXZ4d29ya3MqIHwgbTY4ay1lcmljc3Nvbi1vc2UgfCBtNjhrLSotc3Vub3MqKQotCQkJICAgIGZtdD1hb3V0IGVtPXN1bjMgOzsKLSAgICAgIG02OGstbW90b3JvbGEtc3lzdiopICBmbXQ9Y29mZiBlbT1kZWx0YSA7OwotICAgICAgbTY4ay1idWxsLXN5c3YzKikgICAgIGZtdD1jb2ZmIGVtPWRweDIgOzsKLSAgICAgIG02OGstYXBvbGxvLSopICAgICAgICBmbXQ9Y29mZiBlbT1hcG9sbG8gOzsKLSAgICAgIG02OGstKi1zeXN2NCopICMgbXVzdCBiZSBiZWZvcmUgLXN5c3YqCi0JCQkgICAgZm10PWVsZiBlbT1zdnI0IDs7Ci0gICAgICBtNjhrLSotZWxmKikJICAgIGZtdD1lbGYgOzsKLSAgICAgIG02OGstKi1jb2ZmIHwgbTY4ay0qLXN5c3YqIHwgbTY4ay0qLXJ0ZW1zKikKLQkJCSAgICBmbXQ9Y29mZiA7OwotICAgICAgbTY4ay0qLWhwdXgqKSAgICAgICAgIGZtdD1ocDMwMCBlbT1ocDMwMCA7OwotICAgICAgbTY4ay0qLWxpbnV4KmFvdXQqKSAgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBtNjhrLSotbGludXgtZ251KikgICAgZm10PWVsZiBlbT1saW51eCA7OwotICAgICAgbTY4ay0qLWdudSopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtNjhrLSotbHlueG9zKikgICAgICAgZm10PWNvZmYgZW09bHlueCA7OwotICAgICAgbTY4ay0qLW5ldGJzZCopICAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXMgOzsKLSAgICAgIG02OGstKi1vcGVuYnNkKikgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBtNjhrLWFwcGxlLWF1eCopICAgICAgZm10PWNvZmYgZW09YXV4IDs7Ci0gICAgICBtNjhrLSotcHNvcyopICAgICAgICAgZm10PWVsZiBlbT1wc29zOzsKLQotICAgICAgbTg4ay1tb3Rvcm9sYS1zeXN2MyopIGZtdD1jb2ZmIGVtPWRlbHQ4OCA7OwotICAgICAgbTg4ay0qLWNvZmYqKSAgICAgICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIG1jb3JlLSotZWxmKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgbWNvcmUtKi1wZSkJICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgICMgZG9uJ3QgY2hhbmdlIGVtIGxpa2UgKi0qLWJzZCBkb2VzCi0gICAgICBtaXBzLWRlYy1uZXRic2QqKQkgICAgZm10PWVsZiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLWRlYy1vcGVuYnNkKikgICAgZm10PWVsZiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLWRlYy1ic2QqKSAgICAgICAgZm10PWFvdXQgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy1zb255LWJzZCopICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWJzZCopICAgICAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogVW5rbm93biB2ZW5kb3IgZm9yIG1pcHMtYnNkIGNvbmZpZ3VyYXRpb24uIiAxPiYyOyBleGl0IDE7IH0gOzsKLSAgICAgIG1pcHMtKi11bHRyaXgqKSAgICAgICBmbXQ9ZWNvZmYgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy0qLW9zZiopICAgICAgICAgIGZtdD1lY29mZiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLSotZWNvZmYqKSAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotZWNvZmYqKSAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotaXJpeDYqKQkgICAgZm10PWVsZiA7OwotICAgICAgbWlwcy0qLWlyaXg1KikgICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIG1pcHMtKi1pcml4KikgICAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1sbmV3cyopICAgICAgICBmbXQ9ZWNvZmYgZW09bG5ld3MgOzsKLSAgICAgIG1pcHMtKi1yaXNjb3MqKSAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1zeXN2KikgICAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1lbGYqIHwgbWlwcy0qLXJ0ZW1zKiB8IG1pcHMtKi1saW51eC1nbnUqIHwgbWlwcy0qLWdudSogfCBtaXBzLSotb3BlbmJzZCopCi0JCQkgICAgZm10PWVsZiA7OwotICAgICAgbWlwcy0qLXZ4d29ya3MqKSAgICAgIGZtdD1lbGYKLQkJCSAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTUlQU19TVEFCU19FTEYgMQotRU9GCi0KLQkJCSAgICA7OwotICAgICAgbW4xMDIwMC0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBtbjEwMzAwLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHBwYy0qLXBlIHwgcHBjLSotY3lnd2luKiB8IHBwYy0qLXdpbm50KikKLQkJICAgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIHBwYy0qLWFpeCopICAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgcHBjLSotYmVvcyopICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBwcGMtKi0qYnNkKiB8IHBwYy0qLWVsZiogfCBwcGMtKi1lYWJpKiB8IHBwYy0qLXN5c3Y0KikKLQkJCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBwcGMtKi1saW51eC1nbnUqKQkgICAgZm10PWVsZgotCQkJICAgIGNhc2UgIiRlbmRpYW4iIGluCi0JCQkgICAgYmlnKSAgOzsKLQkJCSAgICAqKSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IEdOVS9MaW51eCBtdXN0IGJlIGNvbmZpZ3VyZWQgYmlnIGVuZGlhbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci0JCQkgICAgZXNhYwotCQkJICAgIDs7Ci0gICAgICBwcGMtKi1zb2xhcmlzKikJICAgIGZtdD1lbGYKLQkJCSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldDsgdGhlbgotCQkJCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBUQVJHRVRfU09MQVJJU19DT01NRU5UIDEKLUVPRgotCi0JCQkgICAgZmkKLQkJCSAgICBpZiB0ZXN0IHgke2VuZGlhbn0gPSB4YmlnOyB0aGVuCi0JCQkJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBTb2xhcmlzIG11c3QgYmUgY29uZmlndXJlZCBsaXR0bGUgZW5kaWFuIiAxPiYyOyBleGl0IDE7IH0KLQkJCSAgICBmaQotCQkJICAgIDs7Ci0gICAgICBwcGMtKi1ydGVtcyopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBwcGMtKi1tYWNvcyogfCBwcGMtKi1tcHcqKQotCQkJICAgIGZtdD1jb2ZmIGVtPW1hY29zIDs7Ci0gICAgICBwcGMtKi1uZXR3YXJlKikgICAgICAgZm10PWVsZiBlbT1wcGNudyA7OwotCi0gICAgICBzaC0qLWVsZiopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBzaC0qLWNvZmYqKSAgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIHNoLSotcnRlbXNlbGYqKSAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBzaC0qLXJ0ZW1zKikJICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIG5zMzJrLXBjNTMyLW1hY2gqIHwgbnMzMmstcGM1MzItdXgqKSAgICBmbXQ9YW91dCBlbT1wYzUzMm1hY2ggOzsKLSAgICAgIG5zMzJrLXBjNTMyLW5ldGJzZCogfCBuczMyay1wYzUzMi1saXRlcyopICBmbXQ9YW91dCBlbT1uYnNkNTMyIDs7Ci0gICAgICBuczMyay1wYzUzMi1vcGVuYnNkKikgZm10PWFvdXQgZW09bmJzZDUzMiA7OwotCi0gICAgICBzcGFyYy0qLXJ0ZW1zKikgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIHNwYXJjLSotc3Vub3M0KikgICAgICBmbXQ9YW91dCBlbT1zdW4zIDs7Ci0gICAgICBzcGFyYy0qLWFvdXQgfCBzcGFyYyotKi12eHdvcmtzKikKLQkJCSAgICBmbXQ9YW91dCBlbT1zcGFyY2FvdXQgOzsKLSAgICAgIHNwYXJjLSotY29mZikgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgc3BhcmMtKi1saW51eCphb3V0KikgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBzcGFyYy0qLWxpbnV4LWdudSopICAgZm10PWVsZiBlbT1saW51eCA7OwotICAgICAgc3BhcmMtKi1seW54b3MqKSAgICAgIGZtdD1jb2ZmIGVtPWx5bnggOzsKLSAgICAgIHNwYXJjLWZ1aml0c3Utbm9uZSkgICBmbXQ9YW91dCA7OwotICAgICAgc3BhcmMtKi1lbGYgfCBzcGFyYy0qLXN5c3Y0KiB8IHNwYXJjLSotc29sYXJpcyopCi0JCQkgICAgZm10PWVsZiA7OwotICAgICAgc3BhcmMtKi1uZXRic2QqKSAgICAgIGZtdD1hb3V0IGVtPW5ic2QgOzsKLSAgICAgIHNwYXJjLSotb3BlbmJzZCopICAgICBmbXQ9YW91dCBlbT1uYnNkIDs7Ci0KLSAgICAgIHN0cm9uZ2FybS0qLWNvZmYpICAgICBmbXQ9Y29mZiA7OwotICAgICAgc3Ryb25nYXJtLSotZWxmKSAgICAgIGZtdD1lbGYgOzsKLQotICAgICAgdGljMzAtKi0qYW91dCopCSAgICBmbXQ9YW91dCBiZmRfZ2FzPXllcyA7OwotICAgICAgdGljMzAtKi0qY29mZiopICAgICAgIGZtdD1jb2ZmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICB0aWM4MC0qLSopCSAgICBmbXQ9Y29mZiA7OwotCi0gICAgICB2ODUwLSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICB2ODUwZS0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICB2ODUwZWEtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICB2YXgtKi1ic2QqIHwgdmF4LSotdWx0cml4KikKLQkJCSAgICBmbXQ9YW91dCA7OwotICAgICAgdmF4LSotdm1zKSAgICAgICAgICAgIGZtdD12bXMgOzsKLQotCi0gICAgICB6OGstKi1jb2ZmIHwgejhrLSotc2ltKQotCQkJICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIHc2NS0qLSopICAgICAgICAgICAgICBmbXQ9Y29mZiA7OwotCi0gICAgICAqLSotYW91dCB8ICotKi1zY291dCkKLQkJCSAgICBmbXQ9YW91dCA7OwotICAgICAgKi0qLW5pbmR5KikKLQkJCSAgICBmbXQ9Ym91dCA7OwotICAgICAgKi0qLWJzZCopCi0JCQkgICAgZm10PWFvdXQgZW09c3VuMyA7OwotICAgICAgKi0qLWdlbmVyaWMpICAgICAgICAgIGZtdD1nZW5lcmljIDs7Ci0gICAgICAqLSoteHJheSB8ICotKi1obXMpICAgZm10PWNvZmYgOzsKLSAgICAgICotKi1zaW0pICAgICAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgKi0qLWVsZiB8ICotKi1zeXN2NCogfCAqLSotc29sYXJpcyopCi0JCQkgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiBHQVMgc3VwcG9ydCBmb3IgJHtnZW5lcmljX3RhcmdldH0gaXMgaW5jb21wbGV0ZS4iIDE+JjIKLQkJCSAgICBmbXQ9ZWxmIGRldj15ZXMgOzsKLSAgICAgICotKi12eHdvcmtzKSAgICAgICAgICBmbXQ9YW91dCA7OwotICAgICAgKi0qLW5ldHdhcmUpICAgICAgICAgIGZtdD1lbGYgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldCA7IHRoZW4KLSAgICAgIGVuZGlhbl9kZWY9Ci0gICAgICBpZiB0ZXN0IHgke2VuZGlhbn0gPSB4YmlnOyB0aGVuCi0JZW5kaWFuX2RlZj0xCi0gICAgICBlbGlmIHRlc3QgeCR7ZW5kaWFufSA9IHhsaXR0bGU7IHRoZW4KLQllbmRpYW5fZGVmPTAKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IHgke2VuZGlhbl9kZWZ9ICE9IHg7IHRoZW4KLQljYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAkZW5kaWFuX2RlZgotRU9GCi0KLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGNhc2UgJHtjcHVfdHlwZX0tJHtmbXR9IGluCi0gICAgICBhbHBoYSotKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIGFybS0qKQliZmRfZ2FzPXllcyA7OwotICAgICMgbm90IHlldAotICAgICMgaTM4Ni1hb3V0KQliZmRfZ2FzPXByZWZlcnJlZCA7OwotICAgICAgbWlwcy0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgbnMzMmstKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIHBwYy0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgc3BhcmMtKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIHN0cm9uZ2FybS0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgKi1lbGYpCWJmZF9nYXM9eWVzIDs7Ci0gICAgICAqLWVjb2ZmKQliZmRfZ2FzPXllcyA7OwotICAgICAgKi1zb20pCWJmZF9nYXM9eWVzIDs7Ci0gICAgICAqKQkJOzsKLSAgICBlc2FjCi0KLSMgT3RoZXIgcmFuZG9tIHN0dWZmLgotCi0gICAgIyBEbyB3ZSBuZWVkIHRoZSBvcGNvZGVzIGxpYnJhcnk/Ci0gICAgY2FzZSAke2NwdV90eXBlfSBpbgotICAgICAgdmF4IHwgaTM4NiB8IHRpYzMwKQotCTs7Ci0KLSAgICAgICopCi0JbmVlZF9vcGNvZGVzPXllcwotCi0JY2FzZSAiJHtlbmFibGVfc2hhcmVkfSIgaW4KLQl5ZXMpIHNoYXJlZF9vcGNvZGVzPXRydWUgOzsKLQkqb3Bjb2RlcyopIHNoYXJlZF9vcGNvZGVzPXRydWUgOzsKLQkqKSBzaGFyZWRfb3Bjb2Rlcz1mYWxzZSA7OwotCWVzYWMKLQlpZiB0ZXN0ICIke3NoYXJlZF9vcGNvZGVzfSIgPSAidHJ1ZSI7IHRoZW4KLQkgICMgQSBzaGFyZWQgbGlib3Bjb2RlcyBtdXN0IGJlIGxpbmtlZCBhZ2FpbnN0IGxpYmJmZC4KLQkgIG5lZWRfYmZkPXllcwotCWZpCi0JOzsKLSAgICBlc2FjCi0KLSAgICAjIEFueSBvdGhlciBzcGVjaWFsIG9iamVjdCBmaWxlcyBuZWVkZWQgPwotICAgIGNhc2UgJHtjcHVfdHlwZX0gaW4KLSAgICAgIGZyMzAgfCBtMzJyKQotCXVzaW5nX2NnZW49eWVzCi0JOzsKLQotICAgICAgbTY4aykKLQljYXNlICR7ZXh0cmFfb2JqZWN0c30gaW4KLQkqbTY4ay1wYXJzZS5vKikgOzsKLQkqKSBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBtNjhrLXBhcnNlLm8iIDs7Ci0JZXNhYwotCTs7Ci0KLSAgICAgIG1pcHMpCi0JZWNobyAke2V4dHJhX29iamVjdHN9IHwgZ3JlcCAtcyAiaXRibC1wYXJzZS5vIiAKLQlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgotCSAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgaXRibC1wYXJzZS5vIgotCWZpCi0KLQllY2hvICR7ZXh0cmFfb2JqZWN0c30gfCBncmVwIC1zICJpdGJsLWxleC5vIiAKLQlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgotCSAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgaXRibC1sZXgubyIKLQlmaQotCi0JZWNobyAke2V4dHJhX29iamVjdHN9IHwgZ3JlcCAtcyAiaXRibC1vcHMubyIgCi0JaWYgdGVzdCAkPyAtbmUgMCA7IHRoZW4KLQkgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGl0Ymwtb3BzLm8iCi0JZmkKLQk7OwotCi0gICAgICBzcGFyYykKLQlpZiB0ZXN0ICR0aGlzX3RhcmdldCA9ICR0YXJnZXQgOyB0aGVuCi0JICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBERUZBVUxUX0FSQ0ggIiR7YXJjaH0iCi1FT0YKLQotCWZpCi0JOzsKLSAgICAgICopCi0JOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICR1c2luZ19jZ2VuID0geWVzIDsgdGhlbgotCWNhc2UgIngke2V4dHJhX29iamVjdHN9IiBpbgotCSpjZ2VuLm8qKSA7OwotCSopIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGNnZW4ubyIgOzsKLQllc2FjCi0gICAgZmkKLQotIyBTZWUgaWYgd2UgcmVhbGx5IGNhbiBzdXBwb3J0IHRoaXMgY29uZmlndXJhdGlvbiB3aXRoIHRoZSBlbXVsYXRpb24gY29kZS4KLQotICAgIGlmIHRlc3QgJHRoaXNfdGFyZ2V0ID0gJHRhcmdldCA7IHRoZW4KLSAgICAgIHByaW1hcnlfYmZkX2dhcz0kYmZkX2dhcwotICAgICAgb2JqX2Zvcm1hdD0kZm10Ci0gICAgICB0ZV9maWxlPSRlbQotCi0gICAgICBpZiB0ZXN0ICRiZmRfZ2FzID0gbm8gOyB0aGVuCi0JIyBDYW4ndCBzdXBwb3J0IG90aGVyIGNvbmZpZ3VyYXRpb25zIHRoaXMgd2F5LgotCWJyZWFrCi0gICAgICBmaQotICAgIGVsaWYgdGVzdCAkYmZkX2dhcyA9IG5vIDsgdGhlbgotICAgICAgIyBDYW4ndCBzdXBwb3J0IHRoaXMgY29uZmlndXJhdGlvbi4KLSAgICAgIGJyZWFrCi0gICAgZmkKLQotIyBGcm9tIHRhcmdldCBuYW1lIGFuZCBmb3JtYXQsIHByb2R1Y2UgYSBsaXN0IG9mIHN1cHBvcnRlZCBlbXVsYXRpb25zLgotCi0gICAgY2FzZSAke2dlbmVyaWNfdGFyZ2V0fS0ke2ZtdH0gaW4KLSAgICAgIG1pcHMtKi1pcml4NSotKikJZW11bGF0aW9uPSJtaXBzYmVsZiBtaXBzbGVsZiBtaXBzZWxmIG1pcHNiZWNvZmYgbWlwc2xlY29mZiBtaXBzZWNvZmYiIDs7Ci0gICAgICBtaXBzLSotbGludXgtZ251Ki0qKSBjYXNlICIkZW5kaWFuIiBpbgotCQkJYmlnKQllbXVsYXRpb249Im1pcHNiZWxmIG1pcHNsZWxmIG1pcHNlbGYgbWlwc2JlY29mZiBtaXBzbGVjb2ZmIG1pcHNlY29mZiIgOzsKLQkJCSopCWVtdWxhdGlvbj0ibWlwc2xlbGYgbWlwc2JlbGYgbWlwc2VsZiBtaXBzbGVjb2ZmIG1pcHNiZWNvZmYgbWlwc2Vjb2ZmIiA7OwotCQkJZXNhYyA7OwotICAgICAgbWlwcy0qLWxuZXdzKi1lY29mZikgOzsKLSAgICAgIG1pcHMtKi0qLWVjb2ZmKQljYXNlICIkZW5kaWFuIiBpbgotCQkJYmlnKQllbXVsYXRpb249Im1pcHNiZWNvZmYgbWlwc2xlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQkqKQllbXVsYXRpb249Im1pcHNsZWNvZmYgbWlwc2JlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQllc2FjIDs7Ci0gICAgICBtaXBzLSotKi1lbGYpCWNhc2UgIiRlbmRpYW4iIGluCi0JCQliaWcpCWVtdWxhdGlvbj0ibWlwc2JlbGYgbWlwc2xlbGYgbWlwc2VsZiIgOzsKLQkJCSopCWVtdWxhdGlvbj0ibWlwc2xlbGYgbWlwc2JlbGYgbWlwc2VsZiIgOzsKLSAgICAgICMgVW5jb21tZW50aW5nIHRoZSBuZXh0IGxpbmUgd2lsbCB0dXJuIG9uIHN1cHBvcnQgZm9yIGkzODYgQ09GRgotICAgICAgIyBpbiBhbnkgaTM4NiBFTEYgY29uZmlndXJhdGlvbi4gIFRoaXMgcHJvYmFibHkgZG9lc24ndCB3b3JrCi0gICAgICAjIGNvcnJlY3RseS4KLSAgICAgICMgaTM4Ni0qLSotZWxmKQllbXVsYXRpb249ImkzODZjb2ZmIGkzODZlbGYiIDs7Ci0JCQllc2FjIDs7Ci0gICAgZXNhYwotCi0gICAgZW11bGF0aW9ucz0iJGVtdWxhdGlvbnMgJGVtdWxhdGlvbiIKLQotZG9uZQotCi0jIEFzc2lnbiBmbG9hdGluZyBwb2ludCB0eXBlLiAgTW9zdCBwcm9jZXNzb3JzIHdpdGggRlAgc3VwcG9ydAotIyBJRUVFIEZQLiAgT24gdGhvc2UgdGhhdCBkb24ndCBzdXBwb3J0IEZQIGF0IGFsbCwgdXN1YWxseSBJRUVFCi0jIGlzIGVtdWxhdGVkLgotY2FzZSAke3RhcmdldF9jcHV9IGluCi0gIHZheCB8IHRhaG9lICkJYXRvZj0ke3RhcmdldF9jcHV9IDs7Ci0gICopCQlhdG9mPWllZWUgOzsKLWVzYWMKLQotY2FzZSAiJHtvYmpfZm9ybWF0fSIgaW4KLSAgIiIpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogR0FTIGRvZXMgbm90IGtub3cgd2hhdCBmb3JtYXQgdG8gdXNlIGZvciB0YXJnZXQgJHt0YXJnZXR9IiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotIyBVbmZvcnR1bmF0ZWx5IHRoZSBjcHUgaW4gY3B1LW9wYy5oIGZpbGUgaXNuJ3QgYWx3YXlzICQoVEFSR0VUX0NQVSkuCi1jZ2VuX2NwdV9wcmVmaXg9IiIKLWlmIHRlc3QgJHVzaW5nX2NnZW4gPSB5ZXMgOyB0aGVuCi0gIGNhc2UgJHt0YXJnZXRfY3B1fSBpbgotICAgICopIGNnZW5fY3B1X3ByZWZpeD0ke3RhcmdldF9jcHV9IDs7Ci0gIGVzYWMKLSAgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBVU0lOR19DR0VOIDEKLUVPRgotCi1maQotCi0KLWlmIHRlc3QgISAtciAke3NyY2Rpcn0vY29uZmlnL3RjLSR7dGFyZ2V0X2NwdV90eXBlfS5jOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogR0FTIGRvZXMgbm90IHN1cHBvcnQgdGFyZ2V0IENQVSAke3RhcmdldF9jcHVfdHlwZX0iIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotaWYgdGVzdCAhIC1yICR7c3JjZGlyfS9jb25maWcvb2JqLSR7b2JqX2Zvcm1hdH0uYzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IEdBUyBkb2VzIG5vdCBoYXZlIHN1cHBvcnQgZm9yIG9iamVjdCBmaWxlIGZvcm1hdCAke29ial9mb3JtYXR9IiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWNhc2UgJHt1c2VyX2JmZF9nYXN9LSR7cHJpbWFyeV9iZmRfZ2FzfSBpbgotICB5ZXMteWVzIHwgbm8tbm8pCi0gICAgIyBXZSBkaWRuJ3Qgb3ZlcnJpZGUgdXNlcidzIGNob2ljZS4KLSAgICA7OwotICBuby15ZXMpCi0gICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiBVc2Ugb2YgQkZEIGlzIHJlcXVpcmVkIGZvciAke3RhcmdldH07IG92ZXJyaWRpbmcgY29uZmlnIG9wdGlvbnMuIiAxPiYyCi0gICAgOzsKLSAgbm8tcHJlZmVycmVkKQotICAgIHByaW1hcnlfYmZkX2dhcz1ubwotICAgIDs7Ci0gICotcHJlZmVycmVkKQotICAgIHByaW1hcnlfYmZkX2dhcz15ZXMKLSAgICA7OwotICB5ZXMtKikKLSAgICBwcmltYXJ5X2JmZF9nYXM9eWVzCi0gICAgOzsKLSAgLSopCi0gICAgIyBVc2VyIHNwZWNpZmllZCBub3RoaW5nLgotICAgIDs7Ci1lc2FjCi0KLSMgU29tZSBDT0ZGIGNvbmZpZ3VyYXRpb25zIHdhbnQgdGhlc2UgcmFuZG9tIG90aGVyIGZsYWdzIHNldC4KLWNhc2UgJHtvYmpfZm9ybWF0fSBpbgotICBjb2ZmKQotICAgIGNhc2UgJHt0YXJnZXRfY3B1X3R5cGV9IGluCi0gICAgICBpMzg2KSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSTM4NkNPRkYgMQotRU9GCi0gOzsKLSAgICAgIG02OGspIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBNNjhLQ09GRiAxCi1FT0YKLSA7OwotICAgICAgbTg4aykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE04OEtDT0ZGIDEKLUVPRgotIDs7Ci0gICAgZXNhYwotICAgIDs7Ci1lc2FjCi0KLSMgR2V0dGluZyB0aGlzIGRvbmUgcmlnaHQgaXMgZ29pbmcgdG8gYmUgYSBiaXRjaC4gIEVhY2ggY29uZmlndXJhdGlvbiBzcGVjaWZpZWQKLSMgd2l0aCAtLWVuYWJsZS10YXJnZXRzPS4uLiBzaG91bGQgYmUgY2hlY2tlZCBmb3IgZW52aXJvbm1lbnQsIGZvcm1hdCwgY3B1LCBhbmQKLSMgYmZkX2dhcyBzZXR0aW5nLgotIwotIyBGb3IgZWFjaCBjb25maWd1cmF0aW9uLCB0aGUgbmVjZXNzYXJ5IG9iamVjdCBmaWxlIHN1cHBvcnQgY29kZSBtdXN0IGJlIGxpbmtlZAotIyBpbi4gIFRoaXMgbWlnaHQgYmUgb25seSBvbmUsIGl0IG1pZ2h0IGJlIHVwIHRvIGZvdXIuICBUaGUgbmVjZXNzYXJ5IGVtdWxhdGlvbgotIyBjb2RlIG5lZWRzIHRvIGJlIHByb3ZpZGVkLCB0b28uCi0jCi0jIEFuZCB0aGVuIHRoZXJlJ3MgIi0tZW5hYmxlLXRhcmdldHM9YWxsIi4uLi4KLSMKLSMgRm9yIG5vdywganVzdCBhbHdheXMgZG8gaXQgZm9yIE1JUFMgRUxGIG9yIEVDT0ZGIGNvbmZpZ3VyYXRpb25zLiAgU2lnaC4KLQotZm9ybWF0cz0iJHtvYmpfZm9ybWF0fSIKLWVtZmlsZXM9IiIKLUVNVUxBVElPTlM9IiIKLV9nYXNfdW5pcV9saXN0PSIkZW11bGF0aW9ucyIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15ICRfZ2FzX3VuaXFfbGlzdCA7IGRvCi0gIGNhc2UgJF9nYXNfdW5pcV9pIGluCi0gIF9nYXNfdW5pcV9kdW1teSkgOzsKLSAgKikgY2FzZSAiICRfZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgJF9nYXNfdW5pcV9pICIqKSA7OwotICAgICAgICopIF9nYXNfdW5pcV9uZXdsaXN0PSIkX2dhc191bmlxX25ld2xpc3QgJF9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLWVtdWxhdGlvbnM9JF9nYXNfdW5pcV9uZXdsaXN0Ci0KLWZvciBlbSBpbiAuICRlbXVsYXRpb25zIDsgZG8KLSAgY2FzZSAkZW0gaW4KLSAgICAuKQljb250aW51ZSA7OwotICAgIG1pcHNiZWxmIHwgbWlwc2xlbGYpCi0JZm10PWVsZiAgIGZpbGU9bWlwc2VsZiA7OwotICAgIG1pcHNiZWNvZmYgfCBtaXBzbGVjb2ZmKQotCWZtdD1lY29mZiBmaWxlPW1pcHNlY29mZiA7OwotICAgIGkzODZjb2ZmKQotCWZtdD1jb2ZmICBmaWxlPWkzODZjb2ZmIDs7Ci0gICAgaTM4NmVsZikKLQlmbXQ9ZWxmICAgZmlsZT1pMzg2ZWxmIDs7Ci0gIGVzYWMKLSAgZm9ybWF0cz0iJGZvcm1hdHMgJGZtdCIKLSAgZW1maWxlcz0iJGVtZmlsZXMgZS0kZmlsZS5vIgotICBFTVVMQVRJT05TPSIkRU1VTEFUSU9OUyAmJGVtLCIKLWRvbmUKLV9nYXNfdW5pcV9saXN0PSIkZm9ybWF0cyIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15ICRfZ2FzX3VuaXFfbGlzdCA7IGRvCi0gIGNhc2UgJF9nYXNfdW5pcV9pIGluCi0gIF9nYXNfdW5pcV9kdW1teSkgOzsKLSAgKikgY2FzZSAiICRfZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgJF9nYXNfdW5pcV9pICIqKSA7OwotICAgICAgICopIF9nYXNfdW5pcV9uZXdsaXN0PSIkX2dhc191bmlxX25ld2xpc3QgJF9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLWZvcm1hdHM9JF9nYXNfdW5pcV9uZXdsaXN0Ci0KLV9nYXNfdW5pcV9saXN0PSIkZW1maWxlcyIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15ICRfZ2FzX3VuaXFfbGlzdCA7IGRvCi0gIGNhc2UgJF9nYXNfdW5pcV9pIGluCi0gIF9nYXNfdW5pcV9kdW1teSkgOzsKLSAgKikgY2FzZSAiICRfZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgJF9nYXNfdW5pcV9pICIqKSA7OwotICAgICAgICopIF9nYXNfdW5pcV9uZXdsaXN0PSIkX2dhc191bmlxX25ld2xpc3QgJF9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLWVtZmlsZXM9JF9nYXNfdW5pcV9uZXdsaXN0Ci0KLWlmIHRlc3QgYHNldCAuICRmb3JtYXRzIDsgc2hpZnQgOyBlY2hvICQjYCAtZ3QgMSA7IHRoZW4KLSAgZm9yIGZtdCBpbiAkZm9ybWF0cyA7IGRvCi0gICAgY2FzZSAkZm10IGluCi0gICAgICBhb3V0KQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX0FPVVQgMQotRU9GCi0gICA7OwotICAgICAgYm91dCkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE9CSl9NQVlCRV9CT1VUIDEKLUVPRgotICAgOzsKLSAgICAgIGNvZmYpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfQ09GRiAxCi1FT0YKLSAgICA7OwotICAgICAgZWNvZmYpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfRUNPRkYgMQotRU9GCi0gICA7OwotICAgICAgZWxmKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX0VMRiAxCi1FT0YKLSAgICAgOzsKLSAgICAgIGdlbmVyaWMpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfR0VORVJJQyAxCi1FT0YKLSA7OwotICAgICAgaHAzMDApCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfSFAzMDAgMQotRU9GCi0gICA7OwotICAgICAgaWVlZSkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE9CSl9NQVlCRV9JRUVFIDEKLUVPRgotICAgIDs7Ci0gICAgICBzb20pCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfU09NIDEKLUVPRgotICAgICA7OwotICAgICAgdm1zKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX1ZNUyAxCi1FT0YKLSAgICAgOzsKLSAgICBlc2FjCi0gICAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgb2JqLSRmbXQubyIKLSAgZG9uZQotICBvYmpfZm9ybWF0PW11bHRpCi1maQotaWYgdGVzdCBgc2V0IC4gJGVtZmlsZXMgOyBzaGlmdCA7IGVjaG8gJCNgIC1ndCAwIDsgdGhlbgotICB0ZV9maWxlPW11bHRpCi0gIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzICRlbWZpbGVzIgotICBERUZBVUxUX0VNVUxBVElPTj1gc2V0IC4gJGVtdWxhdGlvbnMgOyBlY2hvICQyYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgVVNFX0VNVUxBVElPTlMgMQotRU9GCi0KLWZpCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIEVNVUxBVElPTlMgJEVNVUxBVElPTlMKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBERUZBVUxUX0VNVUxBVElPTiAiJERFRkFVTFRfRU1VTEFUSU9OIgotRU9GCi0KLQotY2FzZSAke3ByaW1hcnlfYmZkX2dhc30tJHt0YXJnZXRfY3B1X3R5cGV9LSR7b2JqX2Zvcm1hdH0gaW4KLSAgeWVzLSotY29mZikJbmVlZF9iZmQ9eWVzIDs7Ci0gIG5vLSotY29mZikJbmVlZF9iZmQ9eWVzCi0JCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBNQU5ZX1NFR01FTlRTIDEKLUVPRgotIDs7Ci1lc2FjCi0KLXJlamVjdF9kZXZfY29uZmlncz15ZXMKLQotY2FzZSAke3JlamVjdF9kZXZfY29uZmlnc30tJHtkZXZ9IGluCi0gIHllcy15ZXMpICMgT29wcy4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IEdBUyBkb2VzIG5vdCBzdXBwb3J0IHRoZSAke2dlbmVyaWNfdGFyZ2V0fSBjb25maWd1cmF0aW9uLiIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLWVzYWMKLQotCi0KLQotCi0KLQotY2FzZSAiJHtwcmltYXJ5X2JmZF9nYXN9IiBpbgotICB5ZXMpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBCRkRfQVNTRU1CTEVSIDEKLUVPRgotCi0JbmVlZF9iZmQ9eWVzIDs7Ci1lc2FjCi0KLSMgZG8gd2UgbmVlZCB0aGUgb3Bjb2RlcyBsaWJyYXJ5PwotY2FzZSAiJHtuZWVkX29wY29kZXN9IiBpbgoteWVzKQotICBPUENPREVTX0xJQj0uLi9vcGNvZGVzL2xpYm9wY29kZXMubGEKLSAgOzsKLWVzYWMKLQotY2FzZSAiJHtuZWVkX2JmZH0iIGluCi15ZXMpCi0gIEJGRExJQj0uLi9iZmQvbGliYmZkLmxhCi0gIEFMTF9PQkpfREVQUz0iJEFMTF9PQkpfREVQUyAuLi9iZmQvYmZkLmgiCi0gIDs7Ci1lc2FjCi0KLQotCi0KLQotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUQVJHRVRfQUxJQVMgIiR7dGFyZ2V0X2FsaWFzfSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUQVJHRVRfQ0FOT05JQ0FMICIke3RhcmdldH0iCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVEFSR0VUX0NQVSAiJHt0YXJnZXRfY3B1fSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUQVJHRVRfVkVORE9SICIke3RhcmdldF92ZW5kb3J9IgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFRBUkdFVF9PUyAiJHt0YXJnZXRfb3N9IgotRU9GCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzExOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzQxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM5MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQyNDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMjQzNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ2NjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NzE6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0ODA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ5OTogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotCi1mb3IgYWNfcHJvZyBpbiAnYmlzb24gLXknIGJ5YWNjCi1kbwotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjUzNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1lBQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ZQUNDPSIkWUFDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfWUFDQz0iJGFjX3Byb2ciCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLVlBQ0M9IiRhY19jdl9wcm9nX1lBQ0MiCi1pZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRZQUNDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotdGVzdCAtbiAiJFlBQ0MiICYmIGJyZWFrCi1kb25lCi10ZXN0IC1uICIkWUFDQyIgfHwgWUFDQz0ieWFjYyIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1Njc6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU4MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU4ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU5OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjYwNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjYxNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjYyMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZm9yIGFjX3Byb2cgaW4gZmxleCBsZXgKLWRvCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjUyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTEVYJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19MRVg9IiRMRVgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0xFWD0iJGFjX3Byb2ciCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUxFWD0iJGFjX2N2X3Byb2dfTEVYIgotaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRVgiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi10ZXN0IC1uICIkTEVYIiAmJiBicmVhawotZG9uZQotdGVzdCAtbiAiJExFWCIgfHwgTEVYPSIiJG1pc3NpbmdfZGlyL21pc3NpbmcgZmxleCIiCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZmxleCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZmxleDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjg1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTEVYJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19MRVg9IiRMRVgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0xFWD0iZmxleCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfTEVYIiAmJiBhY19jdl9wcm9nX0xFWD0ibGV4IgotZmkKLWZpCi1MRVg9IiRhY19jdl9wcm9nX0xFWCIKLWlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEVYIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJExFWExJQiIKLXRoZW4KLSAgY2FzZSAiJExFWCIgaW4KLSAgZmxleCopIGFjX2xpYj1mbCA7OwotICAqKSBhY19saWI9bCA7OwotICBlc2FjCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzE5OiBjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIgPiY1Ci1hY19saWJfdmFyPWBlY2hvICRhY19saWInXyd5eXdyYXAgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sJGFjX2xpYiAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzI3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgeXl3cmFwKCk7Ci0KLWludCBtYWluKCkgewoteXl3cmFwKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzM4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMRVhMSUI9Ii1sJGFjX2xpYiIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBsZXggb3V0cHV0IGZpbGUgcm9vdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc2MTogY2hlY2tpbmcgbGV4IG91dHB1dCBmaWxlIHJvb3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbGV4X3Jvb3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZSBtaW5pbWFsIGxleCBwcm9ncmFtIGlzIGp1c3QgYSBzaW5nbGUgbGluZTogJSUuICBCdXQgc29tZSBicm9rZW4gbGV4ZXMKLSMgKFNvbGFyaXMsIEkgdGhpbmsgaXQgd2FzKSB3YW50IHR3byAlJSBsaW5lcywgc28gYWNjb21tb2RhdGUgdGhlbS4KLWVjaG8gJyUlCi0lJScgfCAkTEVYCi1pZiB0ZXN0IC1mIGxleC55eS5jOyB0aGVuCi0gIGFjX2N2X3Byb2dfbGV4X3Jvb3Q9bGV4Lnl5Ci1lbGlmIHRlc3QgLWYgbGV4eXkuYzsgdGhlbgotICBhY19jdl9wcm9nX2xleF9yb290PWxleHl5Ci1lbHNlCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2Fubm90IGZpbmQgb3V0cHV0IGZyb20gJExFWDsgZ2l2aW5nIHVwIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfbGV4X3Jvb3QiIDE+JjYKLUxFWF9PVVRQVVRfUk9PVD0kYWNfY3ZfcHJvZ19sZXhfcm9vdAotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHl5dGV4dCBpcyBhIHBvaW50ZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3ODI6IGNoZWNraW5nIHdoZXRoZXIgeXl0ZXh0IGlzIGEgcG9pbnRlciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFBPU0lYIHNheXMgbGV4IGNhbiBkZWNsYXJlIHl5dGV4dCBlaXRoZXIgYXMgYSBwb2ludGVyIG9yIGFuIGFycmF5OyB0aGUKLSMgZGVmYXVsdCBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuIEZpZ3VyZSBvdXQgd2hpY2ggaXQgaXMsIHNpbmNlCi0jIG5vdCBhbGwgaW1wbGVtZW50YXRpb25zIHByb3ZpZGUgdGhlICVwb2ludGVyIGFuZCAlYXJyYXkgZGVjbGFyYXRpb25zLgotYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXI9bm8KLWVjaG8gJ2V4dGVybiBjaGFyICp5eXRleHQ7JyA+PiRMRVhfT1VUUFVUX1JPT1QuYwotYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9IiRMSUJTICRMRVhMSUIiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzk0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWBjYXQgJExFWF9PVVRQVVRfUk9PVC5jYAotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODAxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotcm0gLWYgIiR7TEVYX09VVFBVVF9ST09UfS5jIgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlciA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgWVlURVhUX1BPSU5URVIgMQotRU9GCi0KLWZpCi0KLQotQUxMX0xJTkdVQVM9Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjgyNTogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg0NjogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjg1MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg1OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODc2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4OTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjkxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTI2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5NTA6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk1NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDA0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwMjU6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAzMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMzk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDY1OiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDcwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwOTg6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzEwMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzEzMzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxMzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE0NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxNjY6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzE3MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTk5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzIzMTogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyMzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjYxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjY2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzMxNjogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzMjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzY4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM3ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDA3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDEyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NjA6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0NjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2MDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjM2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzY0MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzY0NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2NzY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2ODEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzcwNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzczMzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzczOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzYxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RQQ1BZIDEKLUVPRgotCi0gICBmaQotCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3OTU6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzgwMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiBMQ19NRVNTQUdFUwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4MDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotRU9GCi0KLSAgICBmaQotICBmaQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODI4OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCi0gIFVTRV9OTFM9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTkxTPXllcwotZmkKLQotICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgotICAgIAotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEVOQUJMRV9OTFMgMQotRU9GCi0KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4NDg6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKLWVsc2UKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubwotZmkKLQotICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2Ci0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg2NzogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzg3MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozODc3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg5NDogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzODk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5MjI6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1saW50bCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzOTMwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZHRleHRkb21haW4oKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kdGV4dGRvbWFpbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk0MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk1NzogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzOTYyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dFVFRFWFQgMQotRU9GCi0KLQkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5OTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwMzE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQwMzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDA1OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA4NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxMjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDE1NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDE2MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmUKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCSAgICAgICAgCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxOTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjI4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDI2NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgICAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDM1NDogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKLSAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDM4MjogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDM4NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzkyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbXNnZm9ybWF0PWxpbnV4Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotbXNnZm9ybWF0PXhvcGVuCi1maQotCi0KLQkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIAotICAgCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIAotCi0gICAgICBsPQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0NTU6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiA+JjUKLSAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi1maQotCi0gIGVjaG8gIiRhY190IiIkVVNFX01BSU5UQUlORVJfTU9ERSIgMT4mNgotICAKLQotaWYgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllczsgdGhlbgotICBNQUlOVEFJTkVSX01PREVfVFJVRT0KLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPScjJwotZWxzZQotICBNQUlOVEFJTkVSX01PREVfVFJVRT0nIycKLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPQotZmkKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDc4OiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDgzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLSNpZm5kZWYgX19DWUdXSU5fXwotI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotI2VuZGlmCi1yZXR1cm4gX19DWUdXSU5fXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDk0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTExOiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ1MTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTIzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKLU1JTkdXMzI9Ci10ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1NDI6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1NTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmopIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLQotZm9yIGFjX2hkciBpbiBzdHJpbmcuaCBzdGRsaWIuaCBtZW1vcnkuaCBzdHJpbmdzLmggdW5pc3RkLmggc3RkYXJnLmggdmFyYXJncy5oIGVycm5vLmggc3lzL3R5cGVzLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTc3OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDU4MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDU4NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotIyBQdXQgdGhpcyBoZXJlIHNvIHRoYXQgYXV0b2NvbmYncyAiY3Jvc3MtY29tcGlsaW5nIiBtZXNzYWdlIGRvZXNuJ3QgY29uZnVzZQotIyBwZW9wbGUgd2hvIGFyZSBub3QgY3Jvc3MtY29tcGlsaW5nIGJ1dCBhcmUgY29tcGlsaW5nIGNyb3NzLWFzc2VtYmxlcnMuCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGNvbXBpbGluZyBhIGNyb3NzLWFzc2VtYmxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDYxNzogY2hlY2tpbmcgd2hldGhlciBjb21waWxpbmcgYSBjcm9zcy1hc3NlbWJsZXIiID4mNQotaWYgdGVzdCAiJHtob3N0fSIgPSAiJHt0YXJnZXR9IjsgdGhlbgotICBjcm9zc19nYXM9bm8KLWVsc2UKLSAgY3Jvc3NfZ2FzPXllcwotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ1JPU1NfQ09NUElMRSAxCi1FT0YKLQotZmkKLWVjaG8gIiRhY190IiIkY3Jvc3NfZ2FzIiAxPiY2Ci0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2MzI6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NjM3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2NDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NjY1OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ2NzAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDY5ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ3MzA6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NzM1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDc2MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDc2NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Nzg4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4MTU6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0ODIzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4NDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0ODY0OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4NzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODc4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLQotIyBWTVMgZG9lc24ndCBoYXZlIHVubGluay4KLWZvciBhY19mdW5jIGluIHVubGluayByZW1vdmUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5MDg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ5MTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDkzNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgU29tZSBzeXN0ZW1zIGRvbid0IGhhdmUgc2JyaygpLgotZm9yIGFjX2Z1bmMgaW4gc2JyawotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDk2NTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDk3MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTkzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgU29tZSBub24tQU5TSSBwcmVwcm9jZXNzb3JzIGJvdGNoIHJlcXVvdGluZyBpbnNpZGUgc3RyaW5ncy4gIFRoYXQncyBiYWQKLSMgZW5vdWdoLCBidXQgb24gc29tZSBvZiB0aG9zZSBzeXN0ZW1zLCB0aGUgYXNzZXJ0IG1hY3JvIHJlbGllcyBvbiByZXF1b3RpbmcKLSMgd29ya2luZyBwcm9wZXJseSEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFzc2VydCBtYWNybyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTAyMjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXNzZXJ0IG1hY3JvIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnYXNfY3ZfYXNzZXJ0X29rJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTAyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLWludCBtYWluKCkgewotCi0vKiBjaGVjayBmb3IgcmVxdW90aW5nIHByb2JsZW1zICovCi1zdGF0aWMgaW50IGEsIGIsIGMsIGQ7Ci1zdGF0aWMgY2hhciAqczsKLWFzc2VydCAoIXN0cmNtcChzLCAiZm9vIGJhciBiYXogcXV1eCIpKTsKLS8qIGNoZWNrIGZvciBuZXdsaW5lIGhhbmRsaW5nICovCi1hc3NlcnQgKGEgPT0gYgotICAgICAgICB8fCBjID09IGQpOwotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2Fzc2VydF9vaz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2Fzc2VydF9vaz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2Fzc2VydF9vayIgMT4mNgotdGVzdCAkZ2FzX2N2X2Fzc2VydF9vayA9IHllcyB8fCBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQlJPS0VOX0FTU0VSVCAxCi1FT0YKLQotCi0KLSMgT24gc29tZSBzeXN0ZW1zLCB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBtYXkgbm90IGRlY2xhcmUgbWFsbG9jLCByZWFsbG9jLAotIyBhbmQgZnJlZS4gIFRoZXJlIGFyZSBwbGFjZXMgd2hlcmUgZ2FzIG5lZWRzIHRoZXNlIGZ1bmN0aW9ucyB0byBoYXZlIGJlZW4KLSMgZGVjbGFyZWQgLS0gc3VjaCBhcyB3aGVuIHRha2luZyB0aGVpciBhZGRyZXNzZXMuCi1nYXNfdGVzdF9oZWFkZXJzPSIKLSNpZmRlZiBIQVZFX01FTU9SWV9ICi0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3Igc3Ryc3RyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MDg0OiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBzdHJzdHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dhc19jdl9kZWNsX25lZWRlZF9zdHJzdHInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MDg5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSRnYXNfdGVzdF9oZWFkZXJzCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiBjaGFyICooKmYpKCk7Ci1mIHg7Ci14ID0gKGYpIHN0cnN0cjsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxMDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9zdHJzdHI9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1lY2hvICIkYWNfdCIiJGdhc19jdl9kZWNsX25lZWRlZF9zdHJzdHIiIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9zdHJzdHIgPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIgMQotRU9GCi0KLWZpCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgbWFsbG9jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MTIxOiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBtYWxsb2MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dhc19jdl9kZWNsX25lZWRlZF9tYWxsb2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MTI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSRnYXNfdGVzdF9oZWFkZXJzCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiBjaGFyICooKmYpKCk7Ci1mIHg7Ci14ID0gKGYpIG1hbGxvYzsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxMzc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9tYWxsb2M9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX21hbGxvYz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1lY2hvICIkYWNfdCIiJGdhc19jdl9kZWNsX25lZWRlZF9tYWxsb2MiIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9tYWxsb2MgPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MgMQotRU9GCi0KLWZpCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgZnJlZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTE1ODogY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgZnJlZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2FzX2N2X2RlY2xfbmVlZGVkX2ZyZWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MTYzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSRnYXNfdGVzdF9oZWFkZXJzCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiB2b2lkICgqZikoKTsKLWYgeDsKLXggPSAoZikgZnJlZTsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxNzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9mcmVlPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9mcmVlPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2RlY2xfbmVlZGVkX2ZyZWUiIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9mcmVlID0geWVzOyB0aGVuCi0gY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRlJFRSAxCi1FT0YKLQotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBzYnJrIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MTk1OiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBzYnJrIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnYXNfY3ZfZGVjbF9uZWVkZWRfc2Jyaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUyMDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotJGdhc190ZXN0X2hlYWRlcnMKLWludCBtYWluKCkgewotCi10eXBlZGVmIGNoYXIgKigqZikoKTsKLWYgeDsKLXggPSAoZikgc2JyazsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUyMTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9zYnJrPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9zYnJrPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2RlY2xfbmVlZGVkX3NicmsiIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9zYnJrID0geWVzOyB0aGVuCi0gY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU0JSSyAxCi1FT0YKLQotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBlbnZpcm9uIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MjMyOiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBlbnZpcm9uIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnYXNfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUyMzcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotJGdhc190ZXN0X2hlYWRlcnMKLWludCBtYWluKCkgewotCi10eXBlZGVmIGNoYXIgKipmOwotZiB4OwoteCA9IChmKSBlbnZpcm9uOwotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTI0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX2Vudmlyb249bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX2Vudmlyb249eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotZWNobyAiJGFjX3QiIiRnYXNfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbiIgMT4mNgotaWYgdGVzdCAkZ2FzX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24gPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OIDEKLUVPRgotCi1maQotCi0KLSMgRG9lcyBlcnJuby5oIGRlY2xhcmUgZXJybm8sIG9yIGRvIHdlIGhhdmUgdG8gYWRkIGEgc2VwYXJhdGUgZGVjbGFyYXRpb24KLSMgZm9yIGl0PwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBlcnJubyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTI3MjogY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgZXJybm8iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dhc19jdl9kZWNsX25lZWRlZF9lcnJubycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUyNzcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgSEFWRV9FUlJOT19ICi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiBpbnQgZjsKLWYgeDsKLXggPSAoZikgZXJybm87Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MjkyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnYXNfY3ZfZGVjbF9uZWVkZWRfZXJybm89bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX2Vycm5vPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2RlY2xfbmVlZGVkX2Vycm5vIiAxPiY2Ci1pZiB0ZXN0ICRnYXNfY3ZfZGVjbF9uZWVkZWRfZXJybm8gPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9FUlJOTyAxCi1FT0YKLQotZmkKLQotCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIGRvYy9NYWtlZmlsZSAuZ2RiaW5pdDpnZGJpbml0LmluIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAUEFDS0FHRUAlJFBBQ0tBR0UlZwotcyVAVkVSU0lPTkAlJFZFUlNJT04lZwotcyVAQUNMT0NBTEAlJEFDTE9DQUwlZwotcyVAQVVUT0NPTkZAJSRBVVRPQ09ORiVnCi1zJUBBVVRPTUFLRUAlJEFVVE9NQUtFJWcKLXMlQEFVVE9IRUFERVJAJSRBVVRPSEVBREVSJWcKLXMlQE1BS0VJTkZPQCUkTUFLRUlORk8lZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAQ0NAJSRDQyVnCi1zJUBMREAlJExEJWcKLXMlQE5NQCUkTk0lZwotcyVATE5fU0AlJExOX1MlZwotcyVATElCVE9PTEAlJExJQlRPT0wlZwotcyVARExMVE9PTEAlJERMTFRPT0wlZwotcyVAQVNAJSRBUyVnCi1zJUBjZ2VuX2NwdV9wcmVmaXhAJSRjZ2VuX2NwdV9wcmVmaXglZwotcyVAZXh0cmFfb2JqZWN0c0AlJGV4dHJhX29iamVjdHMlZwotcyVAdGFyZ2V0X2NwdV90eXBlQCUkdGFyZ2V0X2NwdV90eXBlJWcKLXMlQG9ial9mb3JtYXRAJSRvYmpfZm9ybWF0JWcKLXMlQHRlX2ZpbGVAJSR0ZV9maWxlJWcKLXMlQGluc3RhbGxfdG9vbGRpckAlJGluc3RhbGxfdG9vbGRpciVnCi1zJUBhdG9mQCUkYXRvZiVnCi1zJUBCRkRMSUJAJSRCRkRMSUIlZwotcyVAT1BDT0RFU19MSUJAJSRPUENPREVTX0xJQiVnCi1zJUBBTExfT0JKX0RFUFNAJSRBTExfT0JKX0RFUFMlZwotcyVAWUFDQ0AlJFlBQ0MlZwotcyVATEVYQCUkTEVYJWcKLXMlQExFWExJQkAlJExFWExJQiVnCi1zJUBDUFBAJSRDUFAlZwotcyVATEVYX09VVFBVVF9ST09UQCUkTEVYX09VVFBVVF9ST09UJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZwotcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIGRvYy9NYWtlZmlsZSAuZ2RiaW5pdDpnZGJpbml0LmluIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLXRhcmdldF9jcHVfdHlwZT0ke3RhcmdldF9jcHVfdHlwZX0KLSBjZ2VuX2NwdV9wcmVmaXg9JHtjZ2VuX2NwdV9wcmVmaXh9Ci0gb2JqX2Zvcm1hdD0ke29ial9mb3JtYXR9Ci0gdGVfZmlsZT0ke3RlX2ZpbGV9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi1ybSAtZiB0YXJnLWNwdS5jIHRhcmctY3B1Lmggb2JqLWZvcm1hdC5oIG9iai1mb3JtYXQuYyB0YXJnLWVudi5oIGF0b2YtdGFyZy5jIGl0YmwtY3B1LmgKLSBlY2hvICcjaW5jbHVkZSAidGMtJyIke3RhcmdldF9jcHVfdHlwZX0iJy5oIicgPiB0YXJnLWNwdS5oCi0gZWNobyAnI2luY2x1ZGUgIm9iai0nIiR7b2JqX2Zvcm1hdH0iJy5oIicgPiBvYmotZm9ybWF0LmgKLSBlY2hvICcjaW5jbHVkZSAidGUtJyIke3RlX2ZpbGV9IicuaCInID4gdGFyZy1lbnYuaAotIGVjaG8gJyNpbmNsdWRlICJpdGJsLSciJHt0YXJnZXRfY3B1X3R5cGV9IicuaCInID4gaXRibC1jcHUuaAotIGlmIHRlc3QgIngkY2dlbl9jcHVfcHJlZml4IiAhPSB4IDsgdGhlbgotICAgZWNobyAnI2luY2x1ZGUgIm9wY29kZXMvJyIke2NnZW5fY3B1X3ByZWZpeH0iJy1kZXNjLmgiJyA+IGNnZW4tZGVzYy5oCi0gZmkKLQotIHNlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWd1cmUuYmF0IGIvZ2FzL2NvbmZpZ3VyZS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZDI2OWYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZ3VyZS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi1AZWNobyBvZmYNCi1pZiAiJTEiID09ICJoOC8zMDAiIGdvdG8gaDgzMDANCi0NCi1lY2hvIENvbmZpZ3VyaW5nIGdhcyBmb3IgZ28zMg0KLXVwZGF0ZSBjb25maWcvdGMtaTM4Ni5jIHRhcmctY3B1LmMNCi11cGRhdGUgY29uZmlnL3RjLWkzODYuaCB0YXJnLWNwdS5oDQotdXBkYXRlIGNvbmZpZy90ZS1nbzMyLmggdGFyZy1lbnYuaA0KLXVwZGF0ZSBjb25maWcvb2JqLWNvZmYuaCBvYmotZm9ybWF0LmgNCi11cGRhdGUgY29uZmlnL29iai1jb2ZmLmMgb2JqLWZvcm1hdC5jDQotdXBkYXRlIGNvbmZpZy9hdG9mLWllZWUuYyBhdG9mLXRhcmcuYw0KLWdvdG8gY29tbW9uDQotDQotOmg4MzAwDQotZWNobyBDb25maWd1cmluZyBnYXMgZm9yIEg4LzMwMA0KLWNvcHkgY29uZmlnXGhvLWdvMzIuaCBob3N0LmgNCi1jb3B5IGNvbmZpZ1x0Yy1oODMwMC5jIHRhcmctY3B1LmMNCi1jb3B5IGNvbmZpZ1x0Yy1oODMwMC5oIHRhcmctY3B1LmgNCi1jb3B5IGNvbmZpZ1x0ZS1nZW5lcmljLmggdGFyZy1lbnYuaA0KLWNvcHkgY29uZmlnXG9iamNvZmZiZmQuaCBvYmotZm9ybWF0LmgNCi1jb3B5IGNvbmZpZ1xvYmpjb2ZmYmZkLmMgb2JqLWZvcm1hdC5jDQotY29weSBjb25maWdcYXRvZi1pZWVlLmMgYXRvZi10YXJnLmMNCi0NCi06Y29tbW9uDQotDQotZWNobyAjIE1ha2VmaWxlIGdlbmVyYXRlZCBieSAiY29uZmlndXJlLmJhdCI+IE1ha2VmaWxlLjINCi1lY2hvIGFsbC5kb3MgOiBhcy5uZXcgZ2FzcC5uZXc+PiBNYWtlZmlsZS4yDQotDQotaWYgZXhpc3QgY29uZmlnLnNlZCBkZWwgY29uZmlnLnNlZA0KLQ0KLWVjaG8gInMvQHNyY2RpckAvLi9nCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvQHRhcmdldF9hbGlhc0AvZ28zMi8JCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL0BwcmVmaXhALy8JCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9AQ0NAL2djYy9nCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvQE9QQ09ERVNfTElCQC8uLlwvb3Bjb2Rlc1wvbGlib3Bjb2Rlcy5hL2cJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL0BCRkRMSUJALy4uXC9iZmRcL2xpYmJmZC5hL2cJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvQEFMTF9PQkpfREVQU0AvLi5cL2JmZFwvYmZkLmgvZwkJCSI+PiBjb25maWcuc2VkDQotDQotZWNobyAiL15hbGxbIAldKjovIGFcCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gImR1bW15OgkJCQkJCSI+PiBjb25maWcuc2VkDQotDQotZWNobyAicy9cL3VzclteIF0qLmgvL2cJCQkJCSI+PiBjb25maWcuc2VkDQotDQotZWNobyAiL15jb25maWcuaFsgCV0qOi8gZAkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvXk1ha2VmaWxlL25vdC1NYWtlZmlsZS8JCQkJIj4+IGNvbmZpZy5zZWQNCi0NCi1zZWQgLWUgInMvXlwiLy8iIC1lICJzL1wiJC8vIiAtZSAicy9bIAldKiQvLyIgY29uZmlnLnNlZCA+IGNvbmZpZzIuc2VkDQotc2VkIC1mIGNvbmZpZzIuc2VkIE1ha2VmaWxlLmluID4+IE1ha2VmaWxlLjINCi11cGRhdGUgTWFrZWZpbGUuMiBNYWtlZmlsZQ0KLWRlbCBNYWtlZmlsZS4yDQotZGVsIGNvbmZpZy5zZWQNCi1kZWwgY29uZmlnMi5zZWQNCi0NCi1lY2hvICNpZm5kZWYgR0FTX1ZFUlNJT04+IGNvbmZpZy5uZXcNCi1zZWQgLW4gIi9eVkVSU0lPTj0vcCIgTWFrZWZpbGUuaW4gfCBzZWQgLWUgInMvVkVSU0lPTj0vI2RlZmluZSBHQVNfVkVSU0lPTiBcIi8iIC1lICJzLyQvXCIvIj4+IGNvbmZpZy5uZXcNCi10eXBlIGNvbmZpZ1xnbzMyLmNmZyA+PiBjb25maWcubmV3DQotZWNobyAjZW5kaWY+PiBjb25maWcubmV3DQotdXBkYXRlIGNvbmZpZy5uZXcgY29uZmlnLmgNCmRpZmYgLS1naXQgYS9nYXMvY29uZmlndXJlLmluIGIvZ2FzL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZhZmQ2OC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNzY4ICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sCi1kbmwgQW5kIGJlIGNhcmVmdWwgd2hlbiBjaGFuZ2luZyBpdCEgIElmIHlvdSBtdXN0IGFkZCB0ZXN0cyB3aXRoIHNxdWFyZQotZG5sIGJyYWNrZXRzLCBiZSBzdXJlIGNoYW5nZXF1b3RlIGludm9jYXRpb25zIHN1cnJvdW5kIGl0LgotZG5sCi1kbmwKLWRubCB2Mi41IG5lZWRlZCBmb3IgLS1iaW5kaXIgZXQgYWwKLUFDX1BSRVJFUSgyLjEzKQotQUNfSU5JVChhcy5oKQotCi1BQ19DQU5PTklDQUxfU1lTVEVNCi0KLUFNX0lOSVRfQVVUT01BS0UoZ2FzLCAyLjkuNCkKLQotQU1fUFJPR19MSUJUT09MCi0KLXVzZXJfYmZkX2dhcz0KLUFDX0FSR19FTkFCTEUoYmZkLWFzc2VtYmxlciwKLVsgIC0tZW5hYmxlLWJmZC1hc3NlbWJsZXIgIHVzZSBCRkQgYmFjayBlbmQgZm9yIHdyaXRpbmcgb2JqZWN0IGZpbGVzXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgbmVlZF9iZmQ9eWVzIHVzZXJfYmZkX2dhcz15ZXMgOzsKLSAgbm8pICB1c2VyX2JmZF9nYXM9bm8gOzsKLSAgKikgICBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBnaXZlbiBmb3IgYmZkLWFzc2VtYmxlciBvcHRpb24pIDs7Ci1lc2FjXSlkbmwKLUFDX0FSR19FTkFCTEUodGFyZ2V0cywKLVsgICAgdGFyZ2V0cyAgICAgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucyBiZXNpZGVzIHRoZSBwcmltYXJ5XSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKLQkgICAgOzsKLSAgbm8pCSAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikJICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWNdKWRubAotQUNfQVJHX0VOQUJMRShjb21tb25iZmRsaWIsCi1bICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb25dKSA7OwotZXNhY10pZG5sCi0KLXVzaW5nX2NnZW49bm8KLQotIyBHZW5lcmF0ZSBhIGhlYWRlciBmaWxlCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLQotdGVfZmlsZT1nZW5lcmljCi0KLSMgTWFrZWZpbGUgdGFyZ2V0IGZvciBpbnN0YWxsaW5nIGdhcyBpbiAkKHRvb2xkaXIpL2Jpbi4KLWluc3RhbGxfdG9vbGRpcj1pbnN0YWxsLWV4ZWMtdG9vbGRpcgotCi1jYW5vbl90YXJnZXRzPSIiCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgotICBmb3IgdCBpbiBgZWNobyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYDsgZG8KLSAgICByZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0IDI+L2Rldi9udWxsYAotICAgIGlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgotICAgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHJlc3VsdCIKLSMgICAgZWxzZQotIyAgICAgICMgUGVybWl0ICJhbGwiLCBldGMuICBXZSBkb24ndCBzdXBwb3J0IGl0IHlldCB0aG91Z2guCi0jICAgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHQiCi0gICAgZmkKLSAgZG9uZQotICBHQVNfVU5JUShjYW5vbl90YXJnZXRzKQotZmkKLQotZW11bGF0aW9ucz0iIgotCi1mb3IgdGhpc190YXJnZXQgaW4gJHRhcmdldCAkY2Fub25fdGFyZ2V0cyA7IGRvCi0KLWNoYW5nZXF1b3RlKCwpZG5sCi0gICAgZXZhbCBgZWNobyAkdGhpc190YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9jcHU9XDEgdmVuZG9yPVwyIG9zPVwzLydgCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0KLSAgICAjIGNoZWNrIGZvciBhcmNoaXRlY3R1cmUgdmFyaWFudHMKLSAgICBhcmNoPQotICAgIGVuZGlhbj0KLSAgICBjYXNlICR7Y3B1fSBpbgotICAgICAgYWxwaGEqKQkJY3B1X3R5cGU9YWxwaGEgOzsKLSAgICAgIGFybWViKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1iaWcgOzsKLSAgICAgIGFybSopCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgYXJtYiopCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgYXJtdipsKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIGFybXYqYikJCWNwdV90eXBlPWFybSBlbmRpYW49YmlnIDs7Ci0gICAgICBzdHJvbmdhcm0qKQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgdGh1bWIqKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIGhwcGEqKQkJY3B1X3R5cGU9aHBwYSA7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgICAgIGlbNDU2XTg2KQkJY3B1X3R5cGU9aTM4NiA7OwotICAgICAgbTY4MFswMTIzNDZdMCkJY3B1X3R5cGU9bTY4ayA7OwotY2hhbmdlcXVvdGUoWyxdKWRubAotICAgICAgbTY4MDA4KQkJY3B1X3R5cGU9bTY4ayA7OwotICAgICAgbTY4Mz8/KQkJY3B1X3R5cGU9bTY4ayA7OwotICAgICAgbTUyMDApCQljcHVfdHlwZT1tNjhrIDs7Ci0gICAgICBtOCopCQljcHVfdHlwZT1tODhrIDs7Ci0gICAgICBtaXBzKmVsKQkJY3B1X3R5cGU9bWlwcyBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzKikJCWNwdV90eXBlPW1pcHMgZW5kaWFuPWJpZyA7OwotICAgICAgcG93ZXJwY2xlKikJY3B1X3R5cGU9cHBjIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIHBvd2VycGMqKQkJY3B1X3R5cGU9cHBjIGVuZGlhbj1iaWcgOzsKLSAgICAgIHJzNjAwMCopCQljcHVfdHlwZT1wcGMgOzsKLSAgICAgIHNwYXJjbGl0ZSopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmNsaXRlIDs7Ci0gICAgICBzcGFyY2xldCopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmNsZXQgOzsKLSAgICAgIHNwYXJjNjQqKQkJY3B1X3R5cGU9c3BhcmMgYXJjaD12OS02NCA7OwotICAgICAgc3BhcmM4NngqKQljcHVfdHlwZT1zcGFyYyBhcmNoPXNwYXJjODZ4ICA7OwotICAgICAgc3BhcmMqKQkJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xpdGUgOzsgIyA/Pz8gU2VlIHRjLXNwYXJjLmMuCi0gICAgICB2ODUwKikJCWNwdV90eXBlPXY4NTAgOzsKLSAgICAgICopCQljcHVfdHlwZT0ke2NwdX0gOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldCA7IHRoZW4KLSAgICAgIHRhcmdldF9jcHVfdHlwZT0ke2NwdV90eXBlfQotICAgIGVsaWYgdGVzdCAke3RhcmdldF9jcHVfdHlwZX0gIT0gJHtjcHVfdHlwZX0gOyB0aGVuCi0gICAgICBjb250aW51ZQotICAgIGZpCi0KLSAgICBnZW5lcmljX3RhcmdldD0ke2NwdV90eXBlfS0kdmVuZG9yLSRvcwotICAgIGRldj1ubwotICAgIGJmZF9nYXM9bm8KLSAgICBlbT1nZW5lcmljCi0KLSAgICAjIGFzc2lnbiBvYmplY3QgZm9ybWF0Ci0gICAgY2FzZSAke2dlbmVyaWNfdGFyZ2V0fSBpbgotICAgICAgYTI5ay0qLWNvZmYpICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhMjlrLWFtZC11ZGkpICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstYW1kLWVibW9uKSAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYTI5ay1ueXUtc3ltMSkgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhMjlrLSotdnh3b3JrcyopICAgICAgZm10PWNvZmYgOzsKLQotICAgICAgYWxwaGEqLSotKnZtcyopCSAgICBmbXQ9ZXZheCA7OwotICAgICAgYWxwaGEqLSotbmV0d2FyZSopICAgIGZtdD1lY29mZiA7OwotICAgICAgYWxwaGEqLSotb3BlbmJzZCopICAgIGZtdD1lY29mZiA7OwotICAgICAgYWxwaGEqLSotb3NmKikgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgYWxwaGEqLSotbGludXhlY29mZiopIGZtdD1lY29mZiA7OwotICAgICAgYWxwaGEqLSotbGludXgtZ251KikgIGZtdD1lbGYgZW09bGludXggOzsKLSAgICAgIGFscGhhKi0qLW5ldGJzZCopICAgICBmbXQ9ZWxmIGVtPW5ic2QgOzsKLQotICAgICAgYXJjLSotZWxmKikgICAgICAgICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgYXJtLSotYW91dCkJICAgICAgICAgICAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICBhcm0tKi1jb2ZmIHwgdGh1bWItKi1jb2ZmKSAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGFybS0qLWVsZiB8IHRodW1iLSotZWxmKSAgICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBhcm0tKi1saW51eCphb3V0KikJICAgICAgICBmbXQ9YW91dCBlbT1saW51eCA7OwotICAgICAgYXJtLSotbGludXgqIHwgYXJtdiotKi1saW51eC1nbnUpCWZtdD1lbGYgIGVtPWxpbnV4IDs7Ci0gICAgICBhcm0tKi1uZXRic2QqKQkgICAgICAgICAgICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllcyA7OwotICAgICAgYXJtLSotb2FiaSB8IHRodW1iLSotb2FiaSkgICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIGFybS1lcG9jLXBlIHwgdGh1bWItZXBvYy1wZSkgICAgICBmbXQ9Y29mZiBlbT1lcG9jLXBlIDs7Ci0gICAgICBhcm0tKi1wZSB8IHRodW1iLSotcGUpICAgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIGFybS0qLXJpc2NpeCopCSAgICAgICAgICAgICAgICBmbXQ9YW91dCBlbT1yaXNjaXggOzsKLQotICAgICAgZDEwdi0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgZDMwdi0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0KLSAgICAgIGZyMzAtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgaHBwYS0qLSplbGYqKSAgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWxpdGVzKikgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OwotICAgICAgaHBwYS0qLW9zZiopICAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotICAgICAgaHBwYS0qLXJ0ZW1zKikgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWhwdXgqKSAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotICAgICAgaHBwYS0qLW1wZWl4KikgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWJzZCopICAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWhpdXgqKSAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotCi0gICAgICBoODMwMC0qLWNvZmYpICAgICAgICAgZm10PWNvZmYgOzsKLQotICAgICAgaTM4Ni1pYm0tYWl4KikgICAgICAgIGZtdD1jb2ZmIGVtPWkzODZhaXggOzsKLSAgICAgIGkzODYtc2VxdWVudC1ic2QqKSAgICBmbXQ9YW91dCBlbT1keW5peCBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWJlb3NwZSopICAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotYmVvc2VsZiogfCBpMzg2LSotYmVvcyopIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1ic2QqKSAgICAgICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKLSAgICAgIGkzODYtKi1uZXRic2QwLjgpICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKLSAgICAgIGkzODYtKi1uZXRic2QqKSAgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzOzsKLSAgICAgIGkzODYtKi1vcGVuYnNkKikgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzOzsKLSAgICAgIGkzODYtKi1saW51eCphb3V0KiB8IGkzODYtKi1saW51eG9sZGxkKSAgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBpMzg2LSotbGludXgqY29mZiopICAgZm10PWNvZmYgZW09bGludXggOzsKLSAgICAgIGkzODYtKi1saW51eC1nbnUqKSAgICBmbXQ9ZWxmIGVtPWxpbnV4IGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotbHlueG9zKikgICAgICAgZm10PWNvZmYgZW09bHlueCA7OwotICAgICAgaTM4Ni0qLXN5c3Y0KiB8IGkzODYtKi1zb2xhcmlzKiB8IGkzODYtKi1lbGYpCi0JCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWZyZWVic2RlbGYqKSAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1mcmVlYnNkKikgICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKLSAgICAgIGkzODYtKi1jb2ZmIHwgaTM4Ni0qLXN5c3YqIHwgaTM4Ni0qLXNjbzMuMnY1KmNvZmYgfCBpMzg2LSotaXNjKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGkzODYtKi1zY28zLjJ2NSopICAgICAgZm10PWVsZgotCQkJICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0OyB0aGVuCi0JCQkJQUNfREVGSU5FKFNDT19FTEYsIDEsCi0JCQkJICAgIFtEZWZpbmUgaWYgZGVmYXVsdGluZyB0byBFTEYgb24gU0NPIDUuXSkKLQkJCSAgICBmaQotCQkJICAgIDs7Ci0gICAgICBpMzg2LSotc2NvMy4yKikgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGkzODYtKi12c3RhKSAgICAgICAgICBmbXQ9YW91dCA7OwotICAgICAgaTM4Ni0qLW1zZG9zZGpncHAqIHwgaTM4Ni0qLWdvMzIqIHwgaTM4Ni1nbzMyLXJ0ZW1zKikKLQkJCSAgICBmbXQ9Y29mZiBlbT1nbzMyOzsKLSAgICAgIGkzODYtKi1ydGVtc2VsZiopICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBpMzg2LSotcnRlbXMqKSAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGkzODYtKi1nbnUqKSAgICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBpMzg2LSotbWFjaCopCi0JCQkgICAgZm10PWFvdXQgZW09bWFjaCBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLW1zZG9zKikgICAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICBpMzg2LSotbW9zcyopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBpMzg2LSotcGUpICAgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIGkzODYtKi1jeWd3aW4qKSAgICAgICBmbXQ9Y29mZiBlbT1wZSBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLW1pbmd3MzIqKSAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotKm50KikgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIGk5NjAtKi1ib3V0KSAgICAgICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLWNvZmYpICAgICAgICAgIGZtdD1jb2ZmIGVtPWljOTYwIDs7Ci0gICAgICBpOTYwLSotcnRlbXMqKSAgICAgICAgZm10PWNvZmYgZW09aWM5NjAgOzsKLSAgICAgIGk5NjAtKi1uaW5keSopICAgICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3M0KikgICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotdnh3b3JrczUuMCkgICAgZm10PWJvdXQgOzsKLSAgICAgIGk5NjAtKi12eHdvcmtzNS4qKSAgICBmbXQ9Y29mZiBlbT1pYzk2MCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3MqKSAgICAgIGZtdD1ib3V0IDs7Ci0KLSAgICAgIG0zMnItKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgbTY4ay0qLXZ4d29ya3MqIHwgbTY4ay1lcmljc3Nvbi1vc2UgfCBtNjhrLSotc3Vub3MqKQotCQkJICAgIGZtdD1hb3V0IGVtPXN1bjMgOzsKLSAgICAgIG02OGstbW90b3JvbGEtc3lzdiopICBmbXQ9Y29mZiBlbT1kZWx0YSA7OwotICAgICAgbTY4ay1idWxsLXN5c3YzKikgICAgIGZtdD1jb2ZmIGVtPWRweDIgOzsKLSAgICAgIG02OGstYXBvbGxvLSopICAgICAgICBmbXQ9Y29mZiBlbT1hcG9sbG8gOzsKLSAgICAgIG02OGstKi1zeXN2NCopICMgbXVzdCBiZSBiZWZvcmUgLXN5c3YqCi0JCQkgICAgZm10PWVsZiBlbT1zdnI0IDs7Ci0gICAgICBtNjhrLSotZWxmKikJICAgIGZtdD1lbGYgOzsKLSAgICAgIG02OGstKi1jb2ZmIHwgbTY4ay0qLXN5c3YqIHwgbTY4ay0qLXJ0ZW1zKikKLQkJCSAgICBmbXQ9Y29mZiA7OwotICAgICAgbTY4ay0qLWhwdXgqKSAgICAgICAgIGZtdD1ocDMwMCBlbT1ocDMwMCA7OwotICAgICAgbTY4ay0qLWxpbnV4KmFvdXQqKSAgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBtNjhrLSotbGludXgtZ251KikgICAgZm10PWVsZiBlbT1saW51eCA7OwotICAgICAgbTY4ay0qLWdudSopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtNjhrLSotbHlueG9zKikgICAgICAgZm10PWNvZmYgZW09bHlueCA7OwotICAgICAgbTY4ay0qLW5ldGJzZCopICAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXMgOzsKLSAgICAgIG02OGstKi1vcGVuYnNkKikgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBtNjhrLWFwcGxlLWF1eCopICAgICAgZm10PWNvZmYgZW09YXV4IDs7Ci0gICAgICBtNjhrLSotcHNvcyopICAgICAgICAgZm10PWVsZiBlbT1wc29zOzsKLQotICAgICAgbTg4ay1tb3Rvcm9sYS1zeXN2MyopIGZtdD1jb2ZmIGVtPWRlbHQ4OCA7OwotICAgICAgbTg4ay0qLWNvZmYqKSAgICAgICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIG1jb3JlLSotZWxmKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgbWNvcmUtKi1wZSkJICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgICMgZG9uJ3QgY2hhbmdlIGVtIGxpa2UgKi0qLWJzZCBkb2VzCi0gICAgICBtaXBzLWRlYy1uZXRic2QqKQkgICAgZm10PWVsZiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLWRlYy1vcGVuYnNkKikgICAgZm10PWVsZiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLWRlYy1ic2QqKSAgICAgICAgZm10PWFvdXQgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy1zb255LWJzZCopICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWJzZCopICAgICAgICAgIEFDX01TR19FUlJPUihVbmtub3duIHZlbmRvciBmb3IgbWlwcy1ic2QgY29uZmlndXJhdGlvbi4pIDs7Ci0gICAgICBtaXBzLSotdWx0cml4KikgICAgICAgZm10PWVjb2ZmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtKi1vc2YqKSAgICAgICAgICBmbXQ9ZWNvZmYgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy0qLWVjb2ZmKikgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWVjb2ZmKikgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWlyaXg2KikJICAgIGZtdD1lbGYgOzsKLSAgICAgIG1pcHMtKi1pcml4NSopICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtaXBzLSotaXJpeCopICAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotbG5ld3MqKSAgICAgICAgZm10PWVjb2ZmIGVtPWxuZXdzIDs7Ci0gICAgICBtaXBzLSotcmlzY29zKikgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotc3lzdiopICAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotZWxmKiB8IG1pcHMtKi1ydGVtcyogfCBtaXBzLSotbGludXgtZ251KiB8IG1pcHMtKi1nbnUqIHwgbWlwcy0qLW9wZW5ic2QqKQotCQkJICAgIGZtdD1lbGYgOzsKLSAgICAgIG1pcHMtKi12eHdvcmtzKikgICAgICBmbXQ9ZWxmCi0JCQkgICAgQUNfREVGSU5FKE1JUFNfU1RBQlNfRUxGLCAxLAotCQkJCVtVc2UgRUxGIHN0YWJzIGZvciBNSVBTLCBub3QgRUNPRkYgc3RhYnNdKQotCQkJICAgIDs7Ci0gICAgICBtbjEwMjAwLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIG1uMTAzMDAtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgcHBjLSotcGUgfCBwcGMtKi1jeWd3aW4qIHwgcHBjLSotd2lubnQqKQotCQkgICAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OwotICAgICAgcHBjLSotYWl4KikgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBwcGMtKi1iZW9zKikgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIHBwYy0qLSpic2QqIHwgcHBjLSotZWxmKiB8IHBwYy0qLWVhYmkqIHwgcHBjLSotc3lzdjQqKQotCQkJICAgIGZtdD1lbGYgOzsKLSAgICAgIHBwYy0qLWxpbnV4LWdudSopCSAgICBmbXQ9ZWxmCi0JCQkgICAgY2FzZSAiJGVuZGlhbiIgaW4KLQkJCSAgICBiaWcpICA7OwotCQkJICAgICopICAgIEFDX01TR19FUlJPUihHTlUvTGludXggbXVzdCBiZSBjb25maWd1cmVkIGJpZyBlbmRpYW4pIDs7Ci0JCQkgICAgZXNhYwotCQkJICAgIDs7Ci0gICAgICBwcGMtKi1zb2xhcmlzKikJICAgIGZtdD1lbGYKLQkJCSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldDsgdGhlbgotCQkJCUFDX0RFRklORShUQVJHRVRfU09MQVJJU19DT01NRU5ULCAxLAotCQkJCVtEZWZpbmUgaWYgZGVmYXVsdCB0YXJnZXQgaXMgUG93ZXJQQyBTb2xhcmlzLl0pCi0JCQkgICAgZmkKLQkJCSAgICBpZiB0ZXN0IHgke2VuZGlhbn0gPSB4YmlnOyB0aGVuCi0JCQkJQUNfTVNHX0VSUk9SKFNvbGFyaXMgbXVzdCBiZSBjb25maWd1cmVkIGxpdHRsZSBlbmRpYW4pCi0JCQkgICAgZmkKLQkJCSAgICA7OwotICAgICAgcHBjLSotcnRlbXMqKQkgICAgZm10PWVsZiA7OwotICAgICAgcHBjLSotbWFjb3MqIHwgcHBjLSotbXB3KikKLQkJCSAgICBmbXQ9Y29mZiBlbT1tYWNvcyA7OwotICAgICAgcHBjLSotbmV0d2FyZSopICAgICAgIGZtdD1lbGYgZW09cHBjbncgOzsKLQotICAgICAgc2gtKi1lbGYqKQkgICAgZm10PWVsZiA7OwotICAgICAgc2gtKi1jb2ZmKikgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBzaC0qLXJ0ZW1zZWxmKikgICAgICAgZm10PWVsZiA7OwotICAgICAgc2gtKi1ydGVtcyopCSAgICBmbXQ9Y29mZiA7OwotCi0gICAgICBuczMyay1wYzUzMi1tYWNoKiB8IG5zMzJrLXBjNTMyLXV4KikgICAgZm10PWFvdXQgZW09cGM1MzJtYWNoIDs7Ci0gICAgICBuczMyay1wYzUzMi1uZXRic2QqIHwgbnMzMmstcGM1MzItbGl0ZXMqKSAgZm10PWFvdXQgZW09bmJzZDUzMiA7OwotICAgICAgbnMzMmstcGM1MzItb3BlbmJzZCopIGZtdD1hb3V0IGVtPW5ic2Q1MzIgOzsKLQotICAgICAgc3BhcmMtKi1ydGVtcyopICAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICBzcGFyYy0qLXN1bm9zNCopICAgICAgZm10PWFvdXQgZW09c3VuMyA7OwotICAgICAgc3BhcmMtKi1hb3V0IHwgc3BhcmMqLSotdnh3b3JrcyopCi0JCQkgICAgZm10PWFvdXQgZW09c3BhcmNhb3V0IDs7Ci0gICAgICBzcGFyYy0qLWNvZmYpICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIHNwYXJjLSotbGludXgqYW91dCopICBmbXQ9YW91dCBlbT1saW51eCA7OwotICAgICAgc3BhcmMtKi1saW51eC1nbnUqKSAgIGZtdD1lbGYgZW09bGludXggOzsKLSAgICAgIHNwYXJjLSotbHlueG9zKikgICAgICBmbXQ9Y29mZiBlbT1seW54IDs7Ci0gICAgICBzcGFyYy1mdWppdHN1LW5vbmUpICAgZm10PWFvdXQgOzsKLSAgICAgIHNwYXJjLSotZWxmIHwgc3BhcmMtKi1zeXN2NCogfCBzcGFyYy0qLXNvbGFyaXMqKQotCQkJICAgIGZtdD1lbGYgOzsKLSAgICAgIHNwYXJjLSotbmV0YnNkKikgICAgICBmbXQ9YW91dCBlbT1uYnNkIDs7Ci0gICAgICBzcGFyYy0qLW9wZW5ic2QqKSAgICAgZm10PWFvdXQgZW09bmJzZCA7OwotCi0gICAgICBzdHJvbmdhcm0tKi1jb2ZmKSAgICAgZm10PWNvZmYgOzsKLSAgICAgIHN0cm9uZ2FybS0qLWVsZikgICAgICBmbXQ9ZWxmIDs7Ci0KLSAgICAgIHRpYzMwLSotKmFvdXQqKQkgICAgZm10PWFvdXQgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHRpYzMwLSotKmNvZmYqKSAgICAgICBmbXQ9Y29mZiBiZmRfZ2FzPXllcyA7OwotICAgICAgdGljODAtKi0qKQkgICAgZm10PWNvZmYgOzsKLQotICAgICAgdjg1MC0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgdjg1MGUtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgdjg1MGVhLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgdmF4LSotYnNkKiB8IHZheC0qLXVsdHJpeCopCi0JCQkgICAgZm10PWFvdXQgOzsKLSAgICAgIHZheC0qLXZtcykgICAgICAgICAgICBmbXQ9dm1zIDs7Ci0KLQotICAgICAgejhrLSotY29mZiB8IHo4ay0qLXNpbSkKLQkJCSAgICBmbXQ9Y29mZiA7OwotCi0gICAgICB3NjUtKi0qKSAgICAgICAgICAgICAgZm10PWNvZmYgOzsKLQotICAgICAgKi0qLWFvdXQgfCAqLSotc2NvdXQpCi0JCQkgICAgZm10PWFvdXQgOzsKLSAgICAgICotKi1uaW5keSopCi0JCQkgICAgZm10PWJvdXQgOzsKLSAgICAgICotKi1ic2QqKQotCQkJICAgIGZtdD1hb3V0IGVtPXN1bjMgOzsKLSAgICAgICotKi1nZW5lcmljKSAgICAgICAgICBmbXQ9Z2VuZXJpYyA7OwotICAgICAgKi0qLXhyYXkgfCAqLSotaG1zKSAgIGZtdD1jb2ZmIDs7Ci0gICAgICAqLSotc2ltKSAgICAgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgICotKi1lbGYgfCAqLSotc3lzdjQqIHwgKi0qLXNvbGFyaXMqKQotCQkJICAgIEFDX01TR19XQVJOKEdBUyBzdXBwb3J0IGZvciAke2dlbmVyaWNfdGFyZ2V0fSBpcyBpbmNvbXBsZXRlLikKLQkJCSAgICBmbXQ9ZWxmIGRldj15ZXMgOzsKLSAgICAgICotKi12eHdvcmtzKSAgICAgICAgICBmbXQ9YW91dCA7OwotICAgICAgKi0qLW5ldHdhcmUpICAgICAgICAgIGZtdD1lbGYgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldCA7IHRoZW4KLSAgICAgIGVuZGlhbl9kZWY9Ci0gICAgICBpZiB0ZXN0IHgke2VuZGlhbn0gPSB4YmlnOyB0aGVuCi0JZW5kaWFuX2RlZj0xCi0gICAgICBlbGlmIHRlc3QgeCR7ZW5kaWFufSA9IHhsaXR0bGU7IHRoZW4KLQllbmRpYW5fZGVmPTAKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IHgke2VuZGlhbl9kZWZ9ICE9IHg7IHRoZW4KLQlBQ19ERUZJTkVfVU5RVU9URUQoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4sICRlbmRpYW5fZGVmLAotCQkJICAgW0RlZmluZSBhcyAxIGlmIGJpZyBlbmRpYW4uXSkKLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGNhc2UgJHtjcHVfdHlwZX0tJHtmbXR9IGluCi0gICAgICBhbHBoYSotKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIGFybS0qKQliZmRfZ2FzPXllcyA7OwotICAgICMgbm90IHlldAotICAgICMgaTM4Ni1hb3V0KQliZmRfZ2FzPXByZWZlcnJlZCA7OwotICAgICAgbWlwcy0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgbnMzMmstKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIHBwYy0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgc3BhcmMtKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIHN0cm9uZ2FybS0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgKi1lbGYpCWJmZF9nYXM9eWVzIDs7Ci0gICAgICAqLWVjb2ZmKQliZmRfZ2FzPXllcyA7OwotICAgICAgKi1zb20pCWJmZF9nYXM9eWVzIDs7Ci0gICAgICAqKQkJOzsKLSAgICBlc2FjCi0KLSMgT3RoZXIgcmFuZG9tIHN0dWZmLgotCi0gICAgIyBEbyB3ZSBuZWVkIHRoZSBvcGNvZGVzIGxpYnJhcnk/Ci0gICAgY2FzZSAke2NwdV90eXBlfSBpbgotICAgICAgdmF4IHwgaTM4NiB8IHRpYzMwKQotCTs7Ci0KLSAgICAgICopCi0JbmVlZF9vcGNvZGVzPXllcwotCi0JY2FzZSAiJHtlbmFibGVfc2hhcmVkfSIgaW4KLQl5ZXMpIHNoYXJlZF9vcGNvZGVzPXRydWUgOzsKLQkqb3Bjb2RlcyopIHNoYXJlZF9vcGNvZGVzPXRydWUgOzsKLQkqKSBzaGFyZWRfb3Bjb2Rlcz1mYWxzZSA7OwotCWVzYWMKLQlpZiB0ZXN0ICIke3NoYXJlZF9vcGNvZGVzfSIgPSAidHJ1ZSI7IHRoZW4KLQkgICMgQSBzaGFyZWQgbGlib3Bjb2RlcyBtdXN0IGJlIGxpbmtlZCBhZ2FpbnN0IGxpYmJmZC4KLQkgIG5lZWRfYmZkPXllcwotCWZpCi0JOzsKLSAgICBlc2FjCi0KLSAgICAjIEFueSBvdGhlciBzcGVjaWFsIG9iamVjdCBmaWxlcyBuZWVkZWQgPwotICAgIGNhc2UgJHtjcHVfdHlwZX0gaW4KLSAgICAgIGZyMzAgfCBtMzJyKQotCXVzaW5nX2NnZW49eWVzCi0JOzsKLQotICAgICAgbTY4aykKLQljYXNlICR7ZXh0cmFfb2JqZWN0c30gaW4KLQkqbTY4ay1wYXJzZS5vKikgOzsKLQkqKSBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBtNjhrLXBhcnNlLm8iIDs7Ci0JZXNhYwotCTs7Ci0KLSAgICAgIG1pcHMpCi0JZWNobyAke2V4dHJhX29iamVjdHN9IHwgZ3JlcCAtcyAiaXRibC1wYXJzZS5vIiAKLQlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgotCSAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgaXRibC1wYXJzZS5vIgotCWZpCi0KLQllY2hvICR7ZXh0cmFfb2JqZWN0c30gfCBncmVwIC1zICJpdGJsLWxleC5vIiAKLQlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgotCSAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgaXRibC1sZXgubyIKLQlmaQotCi0JZWNobyAke2V4dHJhX29iamVjdHN9IHwgZ3JlcCAtcyAiaXRibC1vcHMubyIgCi0JaWYgdGVzdCAkPyAtbmUgMCA7IHRoZW4KLQkgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGl0Ymwtb3BzLm8iCi0JZmkKLQk7OwotCi0gICAgICBzcGFyYykKLQlpZiB0ZXN0ICR0aGlzX3RhcmdldCA9ICR0YXJnZXQgOyB0aGVuCi0JICBBQ19ERUZJTkVfVU5RVU9URUQoREVGQVVMVF9BUkNILCAiJHthcmNofSIsIFtEZWZhdWx0IGFyY2hpdGVjdHVyZS5dKQotCWZpCi0JOzsKLSAgICAgICopCi0JOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICR1c2luZ19jZ2VuID0geWVzIDsgdGhlbgotCWNhc2UgIngke2V4dHJhX29iamVjdHN9IiBpbgotCSpjZ2VuLm8qKSA7OwotCSopIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGNnZW4ubyIgOzsKLQllc2FjCi0gICAgZmkKLQotIyBTZWUgaWYgd2UgcmVhbGx5IGNhbiBzdXBwb3J0IHRoaXMgY29uZmlndXJhdGlvbiB3aXRoIHRoZSBlbXVsYXRpb24gY29kZS4KLQotICAgIGlmIHRlc3QgJHRoaXNfdGFyZ2V0ID0gJHRhcmdldCA7IHRoZW4KLSAgICAgIHByaW1hcnlfYmZkX2dhcz0kYmZkX2dhcwotICAgICAgb2JqX2Zvcm1hdD0kZm10Ci0gICAgICB0ZV9maWxlPSRlbQotCi0gICAgICBpZiB0ZXN0ICRiZmRfZ2FzID0gbm8gOyB0aGVuCi0JIyBDYW4ndCBzdXBwb3J0IG90aGVyIGNvbmZpZ3VyYXRpb25zIHRoaXMgd2F5LgotCWJyZWFrCi0gICAgICBmaQotICAgIGVsaWYgdGVzdCAkYmZkX2dhcyA9IG5vIDsgdGhlbgotICAgICAgIyBDYW4ndCBzdXBwb3J0IHRoaXMgY29uZmlndXJhdGlvbi4KLSAgICAgIGJyZWFrCi0gICAgZmkKLQotIyBGcm9tIHRhcmdldCBuYW1lIGFuZCBmb3JtYXQsIHByb2R1Y2UgYSBsaXN0IG9mIHN1cHBvcnRlZCBlbXVsYXRpb25zLgotCi0gICAgY2FzZSAke2dlbmVyaWNfdGFyZ2V0fS0ke2ZtdH0gaW4KLSAgICAgIG1pcHMtKi1pcml4NSotKikJZW11bGF0aW9uPSJtaXBzYmVsZiBtaXBzbGVsZiBtaXBzZWxmIG1pcHNiZWNvZmYgbWlwc2xlY29mZiBtaXBzZWNvZmYiIDs7Ci0gICAgICBtaXBzLSotbGludXgtZ251Ki0qKSBjYXNlICIkZW5kaWFuIiBpbgotCQkJYmlnKQllbXVsYXRpb249Im1pcHNiZWxmIG1pcHNsZWxmIG1pcHNlbGYgbWlwc2JlY29mZiBtaXBzbGVjb2ZmIG1pcHNlY29mZiIgOzsKLQkJCSopCWVtdWxhdGlvbj0ibWlwc2xlbGYgbWlwc2JlbGYgbWlwc2VsZiBtaXBzbGVjb2ZmIG1pcHNiZWNvZmYgbWlwc2Vjb2ZmIiA7OwotCQkJZXNhYyA7OwotICAgICAgbWlwcy0qLWxuZXdzKi1lY29mZikgOzsKLSAgICAgIG1pcHMtKi0qLWVjb2ZmKQljYXNlICIkZW5kaWFuIiBpbgotCQkJYmlnKQllbXVsYXRpb249Im1pcHNiZWNvZmYgbWlwc2xlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQkqKQllbXVsYXRpb249Im1pcHNsZWNvZmYgbWlwc2JlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQllc2FjIDs7Ci0gICAgICBtaXBzLSotKi1lbGYpCWNhc2UgIiRlbmRpYW4iIGluCi0JCQliaWcpCWVtdWxhdGlvbj0ibWlwc2JlbGYgbWlwc2xlbGYgbWlwc2VsZiIgOzsKLQkJCSopCWVtdWxhdGlvbj0ibWlwc2xlbGYgbWlwc2JlbGYgbWlwc2VsZiIgOzsKLSAgICAgICMgVW5jb21tZW50aW5nIHRoZSBuZXh0IGxpbmUgd2lsbCB0dXJuIG9uIHN1cHBvcnQgZm9yIGkzODYgQ09GRgotICAgICAgIyBpbiBhbnkgaTM4NiBFTEYgY29uZmlndXJhdGlvbi4gIFRoaXMgcHJvYmFibHkgZG9lc24ndCB3b3JrCi0gICAgICAjIGNvcnJlY3RseS4KLSAgICAgICMgaTM4Ni0qLSotZWxmKQllbXVsYXRpb249ImkzODZjb2ZmIGkzODZlbGYiIDs7Ci0JCQllc2FjIDs7Ci0gICAgZXNhYwotCi0gICAgZW11bGF0aW9ucz0iJGVtdWxhdGlvbnMgJGVtdWxhdGlvbiIKLQotZG9uZQotCi0jIEFzc2lnbiBmbG9hdGluZyBwb2ludCB0eXBlLiAgTW9zdCBwcm9jZXNzb3JzIHdpdGggRlAgc3VwcG9ydAotIyBJRUVFIEZQLiAgT24gdGhvc2UgdGhhdCBkb24ndCBzdXBwb3J0IEZQIGF0IGFsbCwgdXN1YWxseSBJRUVFCi0jIGlzIGVtdWxhdGVkLgotY2FzZSAke3RhcmdldF9jcHV9IGluCi0gIHZheCB8IHRhaG9lICkJYXRvZj0ke3RhcmdldF9jcHV9IDs7Ci0gICopCQlhdG9mPWllZWUgOzsKLWVzYWMKLQotY2FzZSAiJHtvYmpfZm9ybWF0fSIgaW4KLSAgIiIpIEFDX01TR19FUlJPUihHQVMgZG9lcyBub3Qga25vdyB3aGF0IGZvcm1hdCB0byB1c2UgZm9yIHRhcmdldCAke3RhcmdldH0pIDs7Ci1lc2FjCi0KLSMgVW5mb3J0dW5hdGVseSB0aGUgY3B1IGluIGNwdS1vcGMuaCBmaWxlIGlzbid0IGFsd2F5cyAkKFRBUkdFVF9DUFUpLgotY2dlbl9jcHVfcHJlZml4PSIiCi1pZiB0ZXN0ICR1c2luZ19jZ2VuID0geWVzIDsgdGhlbgotICBjYXNlICR7dGFyZ2V0X2NwdX0gaW4KLSAgICAqKSBjZ2VuX2NwdV9wcmVmaXg9JHt0YXJnZXRfY3B1fSA7OwotICBlc2FjCi0gIEFDX1NVQlNUKGNnZW5fY3B1X3ByZWZpeCkKLSAgQUNfREVGSU5FKFVTSU5HX0NHRU4sIDEsIFtVc2luZyBjZ2VuIGNvZGU/XSkKLWZpCi0KLWRubAotZG5sIE1ha2Ugc3VyZSB0aGUgZGVzaXJlZCBzdXBwb3J0IGZpbGVzIGV4aXN0LgotZG5sCi0KLWlmIHRlc3QgISAtciAke3NyY2Rpcn0vY29uZmlnL3RjLSR7dGFyZ2V0X2NwdV90eXBlfS5jOyB0aGVuCi0gIEFDX01TR19FUlJPUihHQVMgZG9lcyBub3Qgc3VwcG9ydCB0YXJnZXQgQ1BVICR7dGFyZ2V0X2NwdV90eXBlfSkKLWZpCi0KLWlmIHRlc3QgISAtciAke3NyY2Rpcn0vY29uZmlnL29iai0ke29ial9mb3JtYXR9LmM7IHRoZW4KLSAgQUNfTVNHX0VSUk9SKEdBUyBkb2VzIG5vdCBoYXZlIHN1cHBvcnQgZm9yIG9iamVjdCBmaWxlIGZvcm1hdCAke29ial9mb3JtYXR9KQotZmkKLQotY2FzZSAke3VzZXJfYmZkX2dhc30tJHtwcmltYXJ5X2JmZF9nYXN9IGluCi0gIHllcy15ZXMgfCBuby1ubykKLSAgICAjIFdlIGRpZG4ndCBvdmVycmlkZSB1c2VyJ3MgY2hvaWNlLgotICAgIDs7Ci0gIG5vLXllcykKLSAgICBBQ19NU0dfV0FSTihVc2Ugb2YgQkZEIGlzIHJlcXVpcmVkIGZvciAke3RhcmdldH07IG92ZXJyaWRpbmcgY29uZmlnIG9wdGlvbnMuKQotICAgIDs7Ci0gIG5vLXByZWZlcnJlZCkKLSAgICBwcmltYXJ5X2JmZF9nYXM9bm8KLSAgICA7OwotICAqLXByZWZlcnJlZCkKLSAgICBwcmltYXJ5X2JmZF9nYXM9eWVzCi0gICAgOzsKLSAgeWVzLSopCi0gICAgcHJpbWFyeV9iZmRfZ2FzPXllcwotICAgIDs7Ci0gIC0qKQotICAgICMgVXNlciBzcGVjaWZpZWQgbm90aGluZy4KLSAgICA7OwotZXNhYwotCi0jIFNvbWUgQ09GRiBjb25maWd1cmF0aW9ucyB3YW50IHRoZXNlIHJhbmRvbSBvdGhlciBmbGFncyBzZXQuCi1jYXNlICR7b2JqX2Zvcm1hdH0gaW4KLSAgY29mZikKLSAgICBjYXNlICR7dGFyZ2V0X2NwdV90eXBlfSBpbgotICAgICAgaTM4NikgQUNfREVGSU5FKEkzODZDT0ZGLCAxLCBbVXNpbmcgaTM4NiBDT0ZGP10pIDs7Ci0gICAgICBtNjhrKSBBQ19ERUZJTkUoTTY4S0NPRkYsIDEsIFtVc2luZyBtNjhrIENPRkY/XSkgOzsKLSAgICAgIG04OGspIEFDX0RFRklORShNODhLQ09GRiwgMSwgW1VzaW5nIG04OGsgQ09GRj9dKSA7OwotICAgIGVzYWMKLSAgICA7OwotZXNhYwotCi0jIEdldHRpbmcgdGhpcyBkb25lIHJpZ2h0IGlzIGdvaW5nIHRvIGJlIGEgYml0Y2guICBFYWNoIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkCi0jIHdpdGggLS1lbmFibGUtdGFyZ2V0cz0uLi4gc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGVudmlyb25tZW50LCBmb3JtYXQsIGNwdSwgYW5kCi0jIGJmZF9nYXMgc2V0dGluZy4KLSMKLSMgRm9yIGVhY2ggY29uZmlndXJhdGlvbiwgdGhlIG5lY2Vzc2FyeSBvYmplY3QgZmlsZSBzdXBwb3J0IGNvZGUgbXVzdCBiZSBsaW5rZWQKLSMgaW4uICBUaGlzIG1pZ2h0IGJlIG9ubHkgb25lLCBpdCBtaWdodCBiZSB1cCB0byBmb3VyLiAgVGhlIG5lY2Vzc2FyeSBlbXVsYXRpb24KLSMgY29kZSBuZWVkcyB0byBiZSBwcm92aWRlZCwgdG9vLgotIwotIyBBbmQgdGhlbiB0aGVyZSdzICItLWVuYWJsZS10YXJnZXRzPWFsbCIuLi4uCi0jCi0jIEZvciBub3csIGp1c3QgYWx3YXlzIGRvIGl0IGZvciBNSVBTIEVMRiBvciBFQ09GRiBjb25maWd1cmF0aW9ucy4gIFNpZ2guCi0KLWZvcm1hdHM9IiR7b2JqX2Zvcm1hdH0iCi1lbWZpbGVzPSIiCi1FTVVMQVRJT05TPSIiCi1HQVNfVU5JUShlbXVsYXRpb25zKQotZm9yIGVtIGluIC4gJGVtdWxhdGlvbnMgOyBkbwotICBjYXNlICRlbSBpbgotICAgIC4pCWNvbnRpbnVlIDs7Ci0gICAgbWlwc2JlbGYgfCBtaXBzbGVsZikKLQlmbXQ9ZWxmICAgZmlsZT1taXBzZWxmIDs7Ci0gICAgbWlwc2JlY29mZiB8IG1pcHNsZWNvZmYpCi0JZm10PWVjb2ZmIGZpbGU9bWlwc2Vjb2ZmIDs7Ci0gICAgaTM4NmNvZmYpCi0JZm10PWNvZmYgIGZpbGU9aTM4NmNvZmYgOzsKLSAgICBpMzg2ZWxmKQotCWZtdD1lbGYgICBmaWxlPWkzODZlbGYgOzsKLSAgZXNhYwotICBmb3JtYXRzPSIkZm9ybWF0cyAkZm10IgotICBlbWZpbGVzPSIkZW1maWxlcyBlLSRmaWxlLm8iCi0gIEVNVUxBVElPTlM9IiRFTVVMQVRJT05TICYkZW0sIgotZG9uZQotR0FTX1VOSVEoZm9ybWF0cykKLUdBU19VTklRKGVtZmlsZXMpCi1pZiB0ZXN0IGBzZXQgLiAkZm9ybWF0cyA7IHNoaWZ0IDsgZWNobyAkI2AgLWd0IDEgOyB0aGVuCi0gIGZvciBmbXQgaW4gJGZvcm1hdHMgOyBkbwotICAgIGNhc2UgJGZtdCBpbgotICAgICAgYW91dCkJQUNfREVGSU5FKE9CSl9NQVlCRV9BT1VULCAxLCAgICBbYS5vdXQgc3VwcG9ydD9dKSAgIDs7Ci0gICAgICBib3V0KQlBQ19ERUZJTkUoT0JKX01BWUJFX0JPVVQsIDEsICAgIFtiLm91dCBzdXBwb3J0P10pICAgOzsKLSAgICAgIGNvZmYpCUFDX0RFRklORShPQkpfTUFZQkVfQ09GRiwgMSwgICAgW0NPRkYgc3VwcG9ydD9dKSAgICA7OwotICAgICAgZWNvZmYpCUFDX0RFRklORShPQkpfTUFZQkVfRUNPRkYsIDEsICAgW0VDT0ZGIHN1cHBvcnQ/XSkgICA7OwotICAgICAgZWxmKQlBQ19ERUZJTkUoT0JKX01BWUJFX0VMRiwgMSwgICAgIFtFTEYgc3VwcG9ydD9dKSAgICAgOzsKLSAgICAgIGdlbmVyaWMpCUFDX0RFRklORShPQkpfTUFZQkVfR0VORVJJQywgMSwgW2dlbmVyaWMgc3VwcG9ydD9dKSA7OwotICAgICAgaHAzMDApCUFDX0RFRklORShPQkpfTUFZQkVfSFAzMDAsIDEsICAgW0hQMzAwIHN1cHBvcnQ/XSkgICA7OwotICAgICAgaWVlZSkJQUNfREVGSU5FKE9CSl9NQVlCRV9JRUVFLCAxLCAgICBbSUVFRSBzdXBwb3J0P10pICAgIDs7Ci0gICAgICBzb20pCUFDX0RFRklORShPQkpfTUFZQkVfU09NLCAxLCAgICAgW1NPTSBzdXBwb3J0P10pICAgICA7OwotICAgICAgdm1zKQlBQ19ERUZJTkUoT0JKX01BWUJFX1ZNUywgMSwgICAgIFtWTVMgc3VwcG9ydD9dKSAgICAgOzsKLSAgICBlc2FjCi0gICAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgb2JqLSRmbXQubyIKLSAgZG9uZQotICBvYmpfZm9ybWF0PW11bHRpCi1maQotaWYgdGVzdCBgc2V0IC4gJGVtZmlsZXMgOyBzaGlmdCA7IGVjaG8gJCNgIC1ndCAwIDsgdGhlbgotICB0ZV9maWxlPW11bHRpCi0gIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzICRlbWZpbGVzIgotICBERUZBVUxUX0VNVUxBVElPTj1gc2V0IC4gJGVtdWxhdGlvbnMgOyBlY2hvICQyYAotICBBQ19ERUZJTkUoVVNFX0VNVUxBVElPTlMsIDEsIFtVc2UgZW11bGF0aW9uIHN1cHBvcnQ/XSkKLWZpCi1BQ19TVUJTVChleHRyYV9vYmplY3RzKQotQUNfREVGSU5FX1VOUVVPVEVEKEVNVUxBVElPTlMsICRFTVVMQVRJT05TLCBbU3VwcG9ydGVkIGVtdWxhdGlvbnMuXSkKLUFDX0RFRklORV9VTlFVT1RFRChERUZBVUxUX0VNVUxBVElPTiwgIiRERUZBVUxUX0VNVUxBVElPTiIsCi0JCSAgIFtEZWZhdWx0IGVtdWxhdGlvbi5dKQotCi1jYXNlICR7cHJpbWFyeV9iZmRfZ2FzfS0ke3RhcmdldF9jcHVfdHlwZX0tJHtvYmpfZm9ybWF0fSBpbgotICB5ZXMtKi1jb2ZmKQluZWVkX2JmZD15ZXMgOzsKLSAgbm8tKi1jb2ZmKQluZWVkX2JmZD15ZXMKLQkJQUNfREVGSU5FKE1BTllfU0VHTUVOVFMsIDEsIFtvbGQgQ09GRiBzdXBwb3J0P10pIDs7Ci1lc2FjCi0KLXJlamVjdF9kZXZfY29uZmlncz15ZXMKLQotY2FzZSAke3JlamVjdF9kZXZfY29uZmlnc30tJHtkZXZ9IGluCi0gIHllcy15ZXMpICMgT29wcy4KLSAgICBBQ19NU0dfRVJST1IoR0FTIGRvZXMgbm90IHN1cHBvcnQgdGhlICR7Z2VuZXJpY190YXJnZXR9IGNvbmZpZ3VyYXRpb24uKQotICAgIDs7Ci1lc2FjCi0KLUFDX1NVQlNUKHRhcmdldF9jcHVfdHlwZSkKLUFDX1NVQlNUKG9ial9mb3JtYXQpCi1BQ19TVUJTVCh0ZV9maWxlKQotQUNfU1VCU1QoaW5zdGFsbF90b29sZGlyKQotQUNfU1VCU1QoYXRvZikKLWRubCBBQ19TVUJTVChlbXVsYXRpb24pCi0KLWNhc2UgIiR7cHJpbWFyeV9iZmRfZ2FzfSIgaW4KLSAgeWVzKQlBQ19ERUZJTkUoQkZEX0FTU0VNQkxFUiwgMSwgW1VzZSBCRkQgaW50ZXJmYWNlP10pCi0JbmVlZF9iZmQ9eWVzIDs7Ci1lc2FjCi0KLSMgZG8gd2UgbmVlZCB0aGUgb3Bjb2RlcyBsaWJyYXJ5PwotY2FzZSAiJHtuZWVkX29wY29kZXN9IiBpbgoteWVzKQotICBPUENPREVTX0xJQj0uLi9vcGNvZGVzL2xpYm9wY29kZXMubGEKLSAgOzsKLWVzYWMKLQotY2FzZSAiJHtuZWVkX2JmZH0iIGluCi15ZXMpCi0gIEJGRExJQj0uLi9iZmQvbGliYmZkLmxhCi0gIEFMTF9PQkpfREVQUz0iJEFMTF9PQkpfREVQUyAuLi9iZmQvYmZkLmgiCi0gIDs7Ci1lc2FjCi0KLUFDX1NVQlNUKEJGRExJQikKLUFDX1NVQlNUKE9QQ09ERVNfTElCKQotCi1BQ19TVUJTVChBTExfT0JKX0RFUFMpCi0KLUFDX0RFRklORV9VTlFVT1RFRChUQVJHRVRfQUxJQVMsCSIke3RhcmdldF9hbGlhc30iLCBbVGFyZ2V0IGFsaWFzLl0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVEFSR0VUX0NBTk9OSUNBTCwJIiR7dGFyZ2V0fSIsICAgICAgIFtDYW5vbmljYWwgdGFyZ2V0Ll0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVEFSR0VUX0NQVSwJCSIke3RhcmdldF9jcHV9IiwgICBbVGFyZ2V0IENQVS5dKQotQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVF9WRU5ET1IsCSIke3RhcmdldF92ZW5kb3J9IiwgW1RhcmdldCB2ZW5kb3IuXSkKLUFDX0RFRklORV9VTlFVT1RFRChUQVJHRVRfT1MsCQkiJHt0YXJnZXRfb3N9IiwgICAgW1RhcmdldCBPUy5dKQotCi1BQ19QUk9HX0NDCi0KLUFDX1BST0dfWUFDQwotQU1fUFJPR19MRVgKLQotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi1BTV9NQUlOVEFJTkVSX01PREUKLUFDX0VYRUVYVAotCi1BQ19DSEVDS19IRUFERVJTKHN0cmluZy5oIHN0ZGxpYi5oIG1lbW9yeS5oIHN0cmluZ3MuaCB1bmlzdGQuaCBzdGRhcmcuaCB2YXJhcmdzLmggZXJybm8uaCBzeXMvdHlwZXMuaCkKLQotIyBQdXQgdGhpcyBoZXJlIHNvIHRoYXQgYXV0b2NvbmYncyAiY3Jvc3MtY29tcGlsaW5nIiBtZXNzYWdlIGRvZXNuJ3QgY29uZnVzZQotIyBwZW9wbGUgd2hvIGFyZSBub3QgY3Jvc3MtY29tcGlsaW5nIGJ1dCBhcmUgY29tcGlsaW5nIGNyb3NzLWFzc2VtYmxlcnMuCi1BQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBjb21waWxpbmcgYSBjcm9zcy1hc3NlbWJsZXIpCi1pZiB0ZXN0ICIke2hvc3R9IiA9ICIke3RhcmdldH0iOyB0aGVuCi0gIGNyb3NzX2dhcz1ubwotZWxzZQotICBjcm9zc19nYXM9eWVzCi0gIEFDX0RFRklORShDUk9TU19DT01QSUxFLCAxLCBbQ29tcGlsaW5nIGNyb3NzLWFzc2VtYmxlcj9dKQotZmkKLUFDX01TR19SRVNVTFQoJGNyb3NzX2dhcykKLQotZG5sIGFuc2lkZWNsLmggd2lsbCBkZWFsIHdpdGggY29uc3QKLWRubCBBQ19DT05TVAotQUNfRlVOQ19BTExPQ0EKLUFDX0NfSU5MSU5FCi0KLSMgVk1TIGRvZXNuJ3QgaGF2ZSB1bmxpbmsuCi1BQ19DSEVDS19GVU5DUyh1bmxpbmsgcmVtb3ZlLCBicmVhaykKLQotIyBTb21lIHN5c3RlbXMgZG9uJ3QgaGF2ZSBzYnJrKCkuCi1BQ19DSEVDS19GVU5DUyhzYnJrKQotCi0jIFNvbWUgbm9uLUFOU0kgcHJlcHJvY2Vzc29ycyBib3RjaCByZXF1b3RpbmcgaW5zaWRlIHN0cmluZ3MuICBUaGF0J3MgYmFkCi0jIGVub3VnaCwgYnV0IG9uIHNvbWUgb2YgdGhvc2Ugc3lzdGVtcywgdGhlIGFzc2VydCBtYWNybyByZWxpZXMgb24gcmVxdW90aW5nCi0jIHdvcmtpbmcgcHJvcGVybHkhCi1HQVNfV09SS0lOR19BU1NFUlQKLQotIyBPbiBzb21lIHN5c3RlbXMsIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIG1heSBub3QgZGVjbGFyZSBtYWxsb2MsIHJlYWxsb2MsCi0jIGFuZCBmcmVlLiAgVGhlcmUgYXJlIHBsYWNlcyB3aGVyZSBnYXMgbmVlZHMgdGhlc2UgZnVuY3Rpb25zIHRvIGhhdmUgYmVlbgotIyBkZWNsYXJlZCAtLSBzdWNoIGFzIHdoZW4gdGFraW5nIHRoZWlyIGFkZHJlc3Nlcy4KLWdhc190ZXN0X2hlYWRlcnM9IgotI2lmZGVmIEhBVkVfTUVNT1JZX0gKLSNpbmNsdWRlIDxtZW1vcnkuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotIgotR0FTX0NIRUNLX0RFQ0xfTkVFREVEKHN0cnN0ciwgZiwgY2hhciAqKCpmKSgpLCAkZ2FzX3Rlc3RfaGVhZGVycykKLUdBU19DSEVDS19ERUNMX05FRURFRChtYWxsb2MsIGYsIGNoYXIgKigqZikoKSwgJGdhc190ZXN0X2hlYWRlcnMpCi1HQVNfQ0hFQ0tfREVDTF9ORUVERUQoZnJlZSwgZiwgdm9pZCAoKmYpKCksICRnYXNfdGVzdF9oZWFkZXJzKQotR0FTX0NIRUNLX0RFQ0xfTkVFREVEKHNicmssIGYsIGNoYXIgKigqZikoKSwgJGdhc190ZXN0X2hlYWRlcnMpCi1HQVNfQ0hFQ0tfREVDTF9ORUVERUQoZW52aXJvbiwgZiwgY2hhciAqKmYsICRnYXNfdGVzdF9oZWFkZXJzKQotCi0jIERvZXMgZXJybm8uaCBkZWNsYXJlIGVycm5vLCBvciBkbyB3ZSBoYXZlIHRvIGFkZCBhIHNlcGFyYXRlIGRlY2xhcmF0aW9uCi0jIGZvciBpdD8KLUdBU19DSEVDS19ERUNMX05FRURFRChlcnJubywgZiwgaW50IGYsIFsKLSNpZmRlZiBIQVZFX0VSUk5PX0gKLSNpbmNsdWRlIDxlcnJuby5oPgotI2VuZGlmCi1dKQotCi1kbmwgVGhpcyBtdXN0IGNvbWUgbGFzdC4KLQotZG5sIFdlIHVzZWQgdG8gbWFrZSBzeW1saW5rcyB0byBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSwgYnV0IG5vdwotZG5sIHdlIGp1c3QgdXNlIHRoZSByaWdodCBuYW1lIGZvciAuYyBmaWxlcywgYW5kIGNyZWF0ZSAuaCBmaWxlcyBpbgotZG5sIHRoZSBidWlsZCBkaXJlY3Rvcnkgd2hpY2ggaW5jbHVkZSB0aGUgcmlnaHQgLmggZmlsZS4gIE1ha2Ugc3VyZQotZG5sIHRoZSBvbGQgc3ltbGlua3MgZG9uJ3QgZXhpc3QsIHNvIHRoYXQgYSByZWNvbmZpZ3VyZSBpbiBhbiBleGlzdGluZwotZG5sIGRpcmVjdG9yeSBiZWhhdmVzIHJlYXNvbmFibHkuCi0KLUFDX09VVFBVVChNYWtlZmlsZSBkb2MvTWFrZWZpbGUgLmdkYmluaXQ6Z2RiaW5pdC5pbiBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluLAotW3JtIC1mIHRhcmctY3B1LmMgdGFyZy1jcHUuaCBvYmotZm9ybWF0Lmggb2JqLWZvcm1hdC5jIHRhcmctZW52LmggYXRvZi10YXJnLmMgaXRibC1jcHUuaAotIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiR7dGFyZ2V0X2NwdV90eXBlfSInLmgiJyA+IHRhcmctY3B1LmgKLSBlY2hvICcjaW5jbHVkZSAib2JqLSciJHtvYmpfZm9ybWF0fSInLmgiJyA+IG9iai1mb3JtYXQuaAotIGVjaG8gJyNpbmNsdWRlICJ0ZS0nIiR7dGVfZmlsZX0iJy5oIicgPiB0YXJnLWVudi5oCi0gZWNobyAnI2luY2x1ZGUgIml0YmwtJyIke3RhcmdldF9jcHVfdHlwZX0iJy5oIicgPiBpdGJsLWNwdS5oCi0gaWYgdGVzdCAieCRjZ2VuX2NwdV9wcmVmaXgiICE9IHggOyB0aGVuCi0gICBlY2hvICcjaW5jbHVkZSAib3Bjb2Rlcy8nIiR7Y2dlbl9jcHVfcHJlZml4fSInLWRlc2MuaCInID4gY2dlbi1kZXNjLmgKLSBmaQotCi0gc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlXSwKLVt0YXJnZXRfY3B1X3R5cGU9JHt0YXJnZXRfY3B1X3R5cGV9Ci0gY2dlbl9jcHVfcHJlZml4PSR7Y2dlbl9jcHVfcHJlZml4fQotIG9ial9mb3JtYXQ9JHtvYmpfZm9ybWF0fQotIHRlX2ZpbGU9JHt0ZV9maWxlfV0pCmRpZmYgLS1naXQgYS9nYXMvZGVidWcuYyBiL2dhcy9kZWJ1Zy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTlmMjNmLi4wMDAwMDAwCi0tLSBhL2dhcy9kZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBkZWJ1Zy5jCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogUm91dGluZXMgZm9yIGRlYnVnIHVzZSBvbmx5LiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi1kbXBfZnJhZ3MgKCkKLXsKLSAgZnJjaGFpblMgKmNocDsKLSAgY2hhciAqcDsKLQotICBmb3IgKGNocCA9IGZyY2hhaW5fcm9vdDsgY2hwOyBjaHAgPSBjaHAtPmZyY2hfbmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGNocC0+ZnJjaF9zZWcpCi0JewotCWNhc2UgU0VHX0RBVEE6Ci0JICBwID0gIkRhdGEiOwotCSAgYnJlYWs7Ci0JY2FzZSBTRUdfVEVYVDoKLQkgIHAgPSAiVGV4dCI7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcCA9ICI/Pz8iOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcHJpbnRmICgiXG5TRUdNRU5UICVzICVkXG4iLCBwLCBjaHAtPmZyY2hfc3Vic2VnKTsKLSAgICAgIGRtcF9mcmFnIChjaHAtPmZyY2hfcm9vdCwgIlx0Iik7Ci0gICAgfQotfQotCi1kbXBfZnJhZyAoZnAsIGluZGVudCkKLSAgICAgc3RydWN0IGZyYWcgKmZwOwotICAgICBjaGFyICppbmRlbnQ7Ci17Ci0gIGZvciAoOyBmcDsgZnAgPSBmcC0+ZnJfbmV4dCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlc0ZSQUdNRU5UIEAgMHgleFxuIiwgaW5kZW50LCBmcCk7Ci0gICAgICBzd2l0Y2ggKGZwLT5mcl90eXBlKQotCXsKLQljYXNlIHJzX2FsaWduOgotCSAgcHJpbnRmICgiJXNyc19hbGlnbiglZClcbiIsIGluZGVudCwgZnAtPmZyX29mZnNldCk7Ci0JICBicmVhazsKLQljYXNlIHJzX2ZpbGw6Ci0JICBwcmludGYgKCIlc3JzX2ZpbGwoJWQpXG4iLCBpbmRlbnQsIGZwLT5mcl9vZmZzZXQpOwotCSAgcHJpbnRmICgiJXMiLCBpbmRlbnQpOwotCSAgdmFyX2NoYXJzIChmcCwgZnAtPmZyX3ZhciArIGZwLT5mcl9maXgpOwotCSAgcHJpbnRmICgiJXNcdCByZXBlYXRlZCAlZCB0aW1lcywiLAotCQkgIGluZGVudCwgZnAtPmZyX29mZnNldCk7Ci0JICBwcmludGYgKCIgZml4ZWQgbGVuZ3RoIGlmICMgY2hhcnMgPT0gMClcbiIpOwotCSAgYnJlYWs7Ci0JY2FzZSByc19vcmc6Ci0JICBwcmludGYgKCIlc3JzX29yZyglZCtzeW0gQDB4JXgpXG4iLCBpbmRlbnQsCi0JCSAgZnAtPmZyX29mZnNldCwgZnAtPmZyX3N5bWJvbCk7Ci0JICBwcmludGYgKCIlc2ZpbGwgd2l0aCAiLCBpbmRlbnQpOwotCSAgdmFyX2NoYXJzIChmcCwgMSk7Ci0JICBwcmludGYgKCJcbiIpOwotCSAgYnJlYWs7Ci0JY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKLQkgIHByaW50ZiAoIiVzbWFjaGluZV9kZXBcbiIsIGluZGVudCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcHJpbnRmICgiJXN1bmtub3duIHR5cGVcbiIsIGluZGVudCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBwcmludGYgKCIlc2FkZHI9JWQoMHgleClcbiIsIGluZGVudCwgZnAtPmZyX2FkZHJlc3MsIGZwLT5mcl9hZGRyZXNzKTsKLSAgICAgIHByaW50ZiAoIiVzZnJfZml4PSVkXG4iLCBpbmRlbnQsIGZwLT5mcl9maXgpOwotICAgICAgcHJpbnRmICgiJXNmcl92YXI9JWRcbiIsIGluZGVudCwgZnAtPmZyX3Zhcik7Ci0gICAgICBwcmludGYgKCIlc2ZyX29mZnNldD0lZFxuIiwgaW5kZW50LCBmcC0+ZnJfb2Zmc2V0KTsKLSAgICAgIHByaW50ZiAoIiVzY2hhcnMgQCAweCV4XG4iLCBpbmRlbnQsIGZwLT5mcl9saXRlcmFsKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotfQotCi12YXJfY2hhcnMgKGZwLCBuKQotICAgICBzdHJ1Y3QgZnJhZyAqZnA7Ci0gICAgIGludCBuOwotewotICB1bnNpZ25lZCBjaGFyICpwOwotCi0gIGZvciAocCA9ICh1bnNpZ25lZCBjaGFyICopIGZwLT5mcl9saXRlcmFsOyBuOyBuLS0sIHArKykKLSAgICB7Ci0gICAgICBwcmludGYgKCIlMDJ4ICIsICpwKTsKLSAgICB9Ci19Ci0KLS8qIGVuZCBvZiBkZWJ1Zy5jICovCmRpZmYgLS1naXQgYS9nYXMvZGVwLWluLnNlZCBiL2dhcy9kZXAtaW4uc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDdmOTY5Li4wMDAwMDAwCi0tLSBhL2dhcy9kZXAtaW4uc2VkCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotOmxvb3AKLS9cXCQvTgotL1xcJC9iIGxvb3AKLQotcyEgLi4vY29uZmlnLmghIWcKLXMhIC4uLy4uL2JmZC9iZmQuaCEhZwotcyEgLi4vaXRibC1wYXJzZS5oISFnCi1zIUBJTkNESVJAISQoSU5DRElSKSFnCi1zIUBCRkRESVJAISQoQkZERElSKSFnCi1zIUBTUkNESVJAL2NvbmZpZyEkKHNyY2RpcikvY29uZmlnIWcKLXMhQFNSQ0RJUkAvLi4vb3Bjb2RlcyEkKHNyY2RpcikvLi4vb3Bjb2RlcyFnCi1zIUBTUkNESVJALyEhZwotcyEgY29uZmlnLmghIWcKLXMhIGFzLmghIWcKLXMhIGFzaW50bC5oISFnCi1zISB0YXJnLWVudi5oISFnCi1zISBvYmotZm9ybWF0LmghIWcKLXMhIHRhcmctY3B1LmghIWcKLXMhIGZsb251bS5oISFnCi1zISBleHByLmghIWcKLXMhIHN0cnVjLXN5bWJvbC5oISFnCi1zISB3cml0ZS5oISFnCi1zISBmcmFncy5oISFnCi1zISBoYXNoLmghIWcKLXMhIHJlYWQuaCEhZwotcyEgc3ltYm9scy5oISFnCi1zISB0Yy5oISFnCi1zISBvYmouaCEhZwotcyEgbGlzdGluZy5oISFnCi1zISBiaWdudW0uaCEhZwotcyEgYml0X2ZpeC5oISFnCi1zISBpdGJsLWNwdS5oISFnCi1zISBcJChzcmNkaXIpL2NvbmZpZy90ZS1nZW5lcmljLmghIWcKLXMhIFwkKElOQ0RJUikvbGliaWJlcnR5LmghIWcKLXMhIFwkKElOQ0RJUikvYW5zaWRlY2wuaCEhZwotcyEgXCQoSU5DRElSKS9mb3Blbi1zYW1lLmghIWcKLQotcy9cXFxuICovIC9nCi0KLXMvICokLy8KLXMvICAqLyAvZwotLzokL2QKLQotcy9cKC5cezUwXH1bXiBdKlwpIC9cMSBcXFwKLSAgL2cKZGlmZiAtLWdpdCBhL2dhcy9kZXBlbmQuYyBiL2dhcy9kZXBlbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3YzdjOC4uMDAwMDAwMAotLS0gYS9nYXMvZGVwZW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyogZGVwZW5kLmMgLSBIYW5kbGUgZGVwZW5kZW5jeSB0cmFja2luZy4KLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLS8qIFRoZSBmaWxlIHRvIHdyaXRlIHRvLCBvciBOVUxMIGlmIG5vIGRlcGVuZGVuY2llcyBiZWluZyBrZXB0LiAgKi8KLXN0YXRpYyBjaGFyICpkZXBfZmlsZSA9IE5VTEw7Ci0KLXN0cnVjdCBkZXBlbmRlbmN5Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIHN0cnVjdCBkZXBlbmRlbmN5ICpuZXh0OwotfTsKLQotLyogQWxsIHRoZSBmaWxlcyB3ZSBkZXBlbmQgb24uICAqLwotc3RhdGljIHN0cnVjdCBkZXBlbmRlbmN5ICpkZXBfY2hhaW4gPSBOVUxMOwotCi0vKiBDdXJyZW50IGNvbHVtbiBpbiBvdXRwdXQgZmlsZS4gICovCi1zdGF0aWMgaW50IGNvbHVtbiA9IDA7Ci0KLXN0YXRpYyBpbnQgcXVvdGVfc3RyaW5nX2Zvcl9tYWtlIFBBUkFNUyAoKEZJTEUgKiwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB3cmFwX291dHB1dCBQQVJBTVMgKChGSUxFICosIGNoYXIgKiwgaW50KSk7Ci0KLS8qIE51bWJlciBvZiBjb2x1bW5zIGFsbG93YWJsZS4gICovCi0jZGVmaW5lIE1BWF9DT0xVTU5TIDcyCi0KLQwKLQotLyogU3RhcnQgc2F2aW5nIGRlcGVuZGVuY2llcywgdG8gYmUgd3JpdHRlbiB0byBGSUxFTkFNRS4gIElmIHRoaXMgaXMKLSAgIG5ldmVyIGNhbGxlZCwgdGhlbiBkZXBlbmRlbmN5IHRyYWNraW5nIGlzIHNpbXBseSBza2lwcGVkLiAgKi8KLQotdm9pZAotc3RhcnRfZGVwZW5kZW5jaWVzIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGRlcF9maWxlID0gZmlsZW5hbWU7Ci19Ci0KLS8qIE5vdGljZWQgYSBuZXcgZmlsZW5hbWUsIHNvIHRyeSB0byByZWdpc3RlciBpdC4gICovCi0KLXZvaWQKLXJlZ2lzdGVyX2RlcGVuZGVuY3kgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgc3RydWN0IGRlcGVuZGVuY3kgKmRlcDsKLQotICBpZiAoZGVwX2ZpbGUgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChkZXAgPSBkZXBfY2hhaW47IGRlcCAhPSBOVUxMOyBkZXAgPSBkZXAtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgc3RyY21wIChmaWxlbmFtZSwgZGVwLT5maWxlKSkKLQlyZXR1cm47Ci0gICAgfQotCi0gIGRlcCA9IChzdHJ1Y3QgZGVwZW5kZW5jeSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBkZXBlbmRlbmN5KSk7Ci0gIGRlcC0+ZmlsZSA9IHhzdHJkdXAgKGZpbGVuYW1lKTsKLSAgZGVwLT5uZXh0ID0gZGVwX2NoYWluOwotICBkZXBfY2hhaW4gPSBkZXA7Ci19Ci0KLS8qIFF1b3RlIGEgZmlsZSBuYW1lIHRoZSB3YXkgYG1ha2UnIHdhbnRzIGl0LCBhbmQgcHJpbnQgaXQgdG8gRklMRS4KLSAgIElmIEZJTEUgaXMgTlVMTCwgZG8gbm8gcHJpbnRpbmcsIGJ1dCByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUKLSAgIHF1b3RlZCBzdHJpbmcuCi0KLSAgIFRoaXMgY29kZSBpcyB0YWtlbiBmcm9tIGdjYyB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcy4gICovCi0KLXN0YXRpYyBpbnQKLXF1b3RlX3N0cmluZ19mb3JfbWFrZSAoZmlsZSwgc3JjKQotICAgICBGSUxFICpmaWxlOwotICAgICBjaGFyICpzcmM7Ci17Ci0gIGNoYXIgKnAgPSBzcmM7Ci0gIGludCBpID0gMDsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBjaGFyIGMgPSAqcCsrOwotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdcMCc6Ci0JY2FzZSAnICc6Ci0JY2FzZSAnXHQnOgotCSAgewotCSAgICAvKiBHTlUgbWFrZSB1c2VzIGEgd2VpcmQgcXVvdGluZyBzY2hlbWUgZm9yIHdoaXRlIHNwYWNlLgotCSAgICAgICBBIHNwYWNlIG9yIHRhYiBwcmVjZWRlZCBieSAyTisxIGJhY2tzbGFzaGVzIHJlcHJlc2VudHMKLQkgICAgICAgTiBiYWNrc2xhc2hlcyBmb2xsb3dlZCBieSBzcGFjZTsgYSBzcGFjZSBvciB0YWIKLQkgICAgICAgcHJlY2VkZWQgYnkgMk4gYmFja3NsYXNoZXMgcmVwcmVzZW50cyBOIGJhY2tzbGFzaGVzIGF0Ci0JICAgICAgIHRoZSBlbmQgb2YgYSBmaWxlIG5hbWU7IGFuZCBiYWNrc2xhc2hlcyBpbiBvdGhlcgotCSAgICAgICBjb250ZXh0cyBzaG91bGQgbm90IGJlIGRvdWJsZWQuICAqLwotCSAgICBjaGFyICpxOwotCSAgICBmb3IgKHEgPSBwIC0gMTsgc3JjIDwgcSAmJiBxWy0xXSA9PSAnXFwnOyAgcS0tKQotCSAgICAgIHsKLQkJaWYgKGZpbGUpCi0JCSAgcHV0YyAoJ1xcJywgZmlsZSk7Ci0JCWkrKzsKLQkgICAgICB9Ci0JICB9Ci0JICBpZiAoIWMpCi0JICAgIHJldHVybiBpOwotCSAgaWYgKGZpbGUpCi0JICAgIHB1dGMgKCdcXCcsIGZpbGUpOwotCSAgaSsrOwotCSAgZ290byBvcmRpbmFyeV9jaGFyOwotCSAgCi0JY2FzZSAnJCc6Ci0JICBpZiAoZmlsZSkKLQkgICAgcHV0YyAoYywgZmlsZSk7Ci0JICBpKys7Ci0JICAvKiBGYWxsIHRocm91Z2guICBUaGlzIGNhbiBtaXNoYW5kbGUgdGhpbmdzIGxpa2UgIiQoIiBidXQKLQkgICAgIHRoZXJlJ3Mgbm8gZWFzeSBmaXguICAqLwotCWRlZmF1bHQ6Ci0Jb3JkaW5hcnlfY2hhcjoKLQkgIC8qIFRoaXMgY2FuIG1pc2hhbmRsZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgIlwwXG4lKj9bXFx+IjsKLQkgICAgIGV4YWN0bHkgd2hpY2ggY2hhcnMgYXJlIG1pc2hhbmRsZWQgZGVwZW5kcyBvbiB0aGUgYG1ha2UnIHZlcnNpb24uCi0JICAgICBXZSBrbm93IG9mIG5vIHBvcnRhYmxlIHNvbHV0aW9uIGZvciB0aGlzOwotCSAgICAgZXZlbiBHTlUgbWFrZSAzLjc2LjEgZG9lc24ndCBzb2x2ZSB0aGUgcHJvYmxlbSBlbnRpcmVseS4KLQkgICAgIChBbHNvLCAnXDAnIGlzIG1pc2hhbmRsZWQgZHVlIHRvIG91ciBjYWxsaW5nIGNvbnZlbnRpb25zLikgICovCi0JICBpZiAoZmlsZSkKLQkgICAgcHV0YyAoYywgZmlsZSk7Ci0JICBpKys7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0vKiBBcHBlbmQgc29tZSBvdXRwdXQgdG8gdGhlIGZpbGUsIGtlZXBpbmcgdHJhY2sgb2YgY29sdW1ucyBhbmQgZG9pbmcKLSAgIHdyYXBwaW5nIGFzIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyB2b2lkCi13cmFwX291dHB1dCAoZiwgc3RyaW5nLCBzcGFjZXIpCi0gICAgIEZJTEUgKmY7Ci0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgaW50IHNwYWNlcjsKLXsKLSAgaW50IGxlbiA9IHF1b3RlX3N0cmluZ19mb3JfbWFrZSAoTlVMTCwgc3RyaW5nKTsKLQotICBpZiAobGVuID09IDApCi0gICAgcmV0dXJuOwotCi0gIGlmIChjb2x1bW4gJiYgTUFYX0NPTFVNTlMgLSAxIC8qc3BhY2VyKi8gLSAyIC8qYCBcJyovIDwgY29sdW1uICsgbGVuKQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICIgXFxcbiAiKTsKLSAgICAgIGNvbHVtbiA9IDA7Ci0gICAgICBpZiAoc3BhY2VyID09ICcgJykKLQlzcGFjZXIgPSAnXDAnOwotICAgIH0KLQotICBpZiAoc3BhY2VyID09ICcgJykKLSAgICB7Ci0gICAgICBwdXRjIChzcGFjZXIsIGYpOwotICAgICAgKytjb2x1bW47Ci0gICAgfQotCi0gIHF1b3RlX3N0cmluZ19mb3JfbWFrZSAoZiwgc3RyaW5nKTsKLSAgY29sdW1uICs9IGxlbjsKLQotICBpZiAoc3BhY2VyID09ICc6JykKLSAgICB7Ci0gICAgICBwdXRjIChzcGFjZXIsIGYpOwotICAgICAgKytjb2x1bW47Ci0gICAgfQotfQotCi0vKiBQcmludCBkZXBlbmRlbmN5IGZpbGUuICAqLwotCi12b2lkCi1wcmludF9kZXBlbmRlbmNpZXMgKCkKLXsKLSAgRklMRSAqZjsKLSAgc3RydWN0IGRlcGVuZGVuY3kgKmRlcDsKLQotICBpZiAoZGVwX2ZpbGUgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZiA9IGZvcGVuIChkZXBfZmlsZSwgInciKTsKLSAgaWYgKGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJDYW4ndCBvcGVuIGAlcycgZm9yIHdyaXRpbmciKSwgZGVwX2ZpbGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjb2x1bW4gPSAwOwotICB3cmFwX291dHB1dCAoZiwgb3V0X2ZpbGVfbmFtZSwgJzonKTsKLSAgZm9yIChkZXAgPSBkZXBfY2hhaW47IGRlcCAhPSBOVUxMOyBkZXAgPSBkZXAtPm5leHQpCi0gICAgd3JhcF9vdXRwdXQgKGYsIGRlcC0+ZmlsZSwgJyAnKTsKLQotICBwdXRjICgnXG4nLCBmKTsKLQotICBpZiAoZmNsb3NlIChmKSkKLSAgICBhc193YXJuIChfKCJDYW4ndCBjbG9zZSBgJXMnIiksIGRlcF9maWxlKTsKLX0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvTWFrZWZpbGUuYW0gYi9nYXMvZG9jL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWY1YTRhLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotIyBXaGF0IHZlcnNpb24gb2YgdGhlIG1hbnVhbCB5b3Ugd2FudDsgImFsbCIgaW5jbHVkZXMgZXZlcnl0aGluZwotQ09ORklHPWFsbAotCi1tYW5fTUFOUyA9IGFzLjEKLQotaW5mb19URVhJTkZPUyA9IGFzLnRleGluZm8gZ2FzcC50ZXhpCi0KLWFzY29uZmlnLnRleGk6ICQoQ09ORklHKS50ZXhpCi0Jcm0gLWYgYXNjb25maWcudGV4aQotCWxuIC1zICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGxuICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGNwICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkKLQotQ1BVX0RPQ1MgPSBcCi0JYy1hMjlrLnRleGkgXAotCWMtYXJtLnRleGkgXAotCWMtZDEwdi50ZXhpIFwKLQljLWg4MzAwLnRleGkgXAotCWMtaDg1MDAudGV4aSBcCi0JYy1ocHBhLnRleGkgXAotCWMtaTM4Ni50ZXhpIFwKLQljLWk5NjAudGV4aSBcCi0JYy1tNjhrLnRleGkgXAotCWMtbWlwcy50ZXhpIFwKLQljLW5zMzJrLnRleGkgXAotCWMtc2gudGV4aSBcCi0JYy1zcGFyYy50ZXhpIFwKLQljLXZheC50ZXhpIFwKLQljLXY4NTAudGV4aSBcCi0JYy16OGsudGV4aQotCi1nYXN2ZXIudGV4aTogTWFrZWZpbGUKLQlybSAtZiAkQAotCWVjaG8gJ0BzZXQgVkVSU0lPTiAkKFZFUlNJT04pJyA+ICRACi0KLWFzLmluZm86ICQoc3JjZGlyKS9hcy50ZXhpbmZvIGFzY29uZmlnLnRleGkgZ2FzdmVyLnRleGkgJChDUFVfRE9DUykKLWFzLmR2aTogJChzcmNkaXIpL2FzLnRleGluZm8gYXNjb25maWcudGV4aSBnYXN2ZXIudGV4aSAkKENQVV9ET0NTKQotCi0jIFRoaXMgb25lIGlzbid0IHJlYWR5IGZvciBwcmltZSB0aW1lIHlldC4gIE5vdCBldmVuIGEgbGl0dGxlIGJpdC4KLQotbm9pbnN0X1RFWElORk9TID0gaW50ZXJuYWxzLnRleGkKLQotRElTVENMRUFORklMRVMgPSBhc2NvbmZpZy50ZXhpCi0KLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gZ2FzdmVyLnRleGkKZGlmZiAtLWdpdCBhL2dhcy9kb2MvTWFrZWZpbGUuaW4gYi9nYXMvZG9jL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjRkMWE1Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuLgotCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfdHJpcGxldCA9IEBob3N0QAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKLUFMTF9PQkpfREVQUyA9IEBBTExfT0JKX0RFUFNACi1BUyA9IEBBU0AKLUJGRExJQiA9IEBCRkRMSUJACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLURBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAotRExMVE9PTCA9IEBETExUT09MQAotRVhFRVhUID0gQEVYRUVYVEAKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotR01TR0ZNVCA9IEBHTVNHRk1UQAotR1RfTk8gPSBAR1RfTk9ACi1HVF9ZRVMgPSBAR1RfWUVTQAotSU5DTFVERV9MT0NBTEVfSCA9IEBJTkNMVURFX0xPQ0FMRV9IQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotSU5UTERFUFMgPSBASU5UTERFUFNACi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLUlOVExPQkpTID0gQElOVExPQkpTQAotTEQgPSBATERACi1MRVggPSBATEVYQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTUFJTlQgPSBATUFJTlRACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLU1TR0ZNVCA9IEBNU0dGTVRACi1OTSA9IEBOTUAKLU9QQ09ERVNfTElCID0gQE9QQ09ERVNfTElCQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotWUFDQyA9IEBZQUNDQAotYXRvZiA9IEBhdG9mQAotY2dlbl9jcHVfcHJlZml4ID0gQGNnZW5fY3B1X3ByZWZpeEAKLWV4dHJhX29iamVjdHMgPSBAZXh0cmFfb2JqZWN0c0AKLWluc3RhbGxfdG9vbGRpciA9IEBpbnN0YWxsX3Rvb2xkaXJACi1sID0gQGxACi1vYmpfZm9ybWF0ID0gQG9ial9mb3JtYXRACi10YXJnZXRfY3B1X3R5cGUgPSBAdGFyZ2V0X2NwdV90eXBlQAotdGVfZmlsZSA9IEB0ZV9maWxlQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLSMgV2hhdCB2ZXJzaW9uIG9mIHRoZSBtYW51YWwgeW91IHdhbnQ7ICJhbGwiIGluY2x1ZGVzIGV2ZXJ5dGhpbmcKLUNPTkZJRyA9IGFsbAotCi1tYW5fTUFOUyA9IGFzLjEKLQotaW5mb19URVhJTkZPUyA9IGFzLnRleGluZm8gZ2FzcC50ZXhpCi0KLUNQVV9ET0NTID0gXAotCWMtYTI5ay50ZXhpIFwKLQljLWFybS50ZXhpIFwKLQljLWQxMHYudGV4aSBcCi0JYy1oODMwMC50ZXhpIFwKLQljLWg4NTAwLnRleGkgXAotCWMtaHBwYS50ZXhpIFwKLQljLWkzODYudGV4aSBcCi0JYy1pOTYwLnRleGkgXAotCWMtbTY4ay50ZXhpIFwKLQljLW1pcHMudGV4aSBcCi0JYy1uczMyay50ZXhpIFwKLQljLXNoLnRleGkgXAotCWMtc3BhcmMudGV4aSBcCi0JYy12YXgudGV4aSBcCi0JYy12ODUwLnRleGkgXAotCWMtejhrLnRleGkKLQotCi0jIFRoaXMgb25lIGlzbid0IHJlYWR5IGZvciBwcmltZSB0aW1lIHlldC4gIE5vdCBldmVuIGEgbGl0dGxlIGJpdC4KLQotbm9pbnN0X1RFWElORk9TID0gaW50ZXJuYWxzLnRleGkKLQotRElTVENMRUFORklMRVMgPSBhc2NvbmZpZy50ZXhpCi0KLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gZ2FzdmVyLnRleGkKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSAuLi9jb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gCi1URVhJMkRWSSA9IGBpZiB0ZXN0IC1mICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyB0aGVuIGVjaG8gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IGVsc2UgZWNobyB0ZXhpMmR2aTsgZmlgCi1URVhJTkZPX1RFWCA9ICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleAotSU5GT19ERVBTID0gYXMuaW5mbyBnYXNwLmluZm8KLURWSVMgPSBhcy5kdmkgZ2FzcC5kdmkKLVRFWElORk9TID0gYXMudGV4aW5mbyBnYXNwLnRleGkKLW1hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQotTUFOUyA9ICQobWFuX01BTlMpCi0KLU5ST0ZGID0gbnJvZmYKLURJU1RfQ09NTU9OID0gIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gdGFyCi1HWklQX0VOViA9IC0tYmVzdAotYWxsOiBhbGwtcmVkaXJlY3QKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmR2aSAuaW5mbyAucHMgLnRleGkgLnRleGluZm8gLnR4aQotJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIE1ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWN5Z251cyBkb2MvTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLQotYXMuaW5mbzogYXMudGV4aW5mbwotYXMuZHZpOiBhcy50ZXhpbmZvCi0KLQotZ2FzcC5pbmZvOiBnYXNwLnRleGkKLWdhc3AuZHZpOiBnYXNwLnRleGkKLQotCi1EVklQUyA9IGR2aXBzCi0KLS50ZXhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnRleGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnR4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0uZHZpLnBzOgotCSQoRFZJUFMpICQ8IC1vICRACi0KLWluc3RhbGwtaW5mby1hbTogJChJTkZPX0RFUFMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChpbmZvZGlyKQotCUBsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgaWZpbGUgaW4gYGNkICQkZCAmJiBlY2hvICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV1gOyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgJCRkLyQkaWZpbGU7IHRoZW4gXAotCSAgICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZSI7IFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZTsgXAotCSAgICBlbHNlIDogOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQlAJChQT1NUX0lOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGVjaG8gIiBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUiO1wKLQkgICAgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIHx8IDo7XAotCSAgZG9uZTsgXAotCWVsc2UgOiA7IGZpCi0KLXVuaW5zdGFsbC1pbmZvOgotCSQoUFJFX1VOSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBpaT15ZXM7IFwKLQllbHNlIGlpPTsgZmk7IFwKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0IC16ICIkaWkiIFwKLQkgICAgfHwgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgLS1yZW1vdmUgJCRmaWxlOyBcCi0JZG9uZQotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgKGNkICQoREVTVERJUikkKGluZm9kaXIpICYmIHJtIC1mICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV0pOyBcCi0JZG9uZQotCi1kaXN0LWluZm86ICQoSU5GT19ERVBTKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgYmFzZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRiYXNlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBmaWxlIGluIGBjZCAkJGQgJiYgZXZhbCBlY2hvICQkYmFzZSpgOyBkbyBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0KLW1vc3RseWNsZWFuLWFtaW5mbzoKLQktcm0gLWYgYXMuYXV4IGFzLmNwIGFzLmNwcyBhcy5kdmkgYXMuZm4gYXMuZm5zIGFzLmt5IGFzLmt5cyBhcy5wcyBcCi0JICBhcy5sb2cgYXMucGcgYXMudG9jIGFzLnRwIGFzLnRwcyBhcy52ciBhcy52cnMgYXMub3AgYXMudHIgXAotCSAgYXMuY3YgYXMuY24gZ2FzcC5hdXggZ2FzcC5jcCBnYXNwLmNwcyBnYXNwLmR2aSBnYXNwLmZuIFwKLQkgIGdhc3AuZm5zIGdhc3Aua3kgZ2FzcC5reXMgZ2FzcC5wcyBnYXNwLmxvZyBnYXNwLnBnIGdhc3AudG9jIFwKLQkgIGdhc3AudHAgZ2FzcC50cHMgZ2FzcC52ciBnYXNwLnZycyBnYXNwLm9wIGdhc3AudHIgZ2FzcC5jdiBcCi0JICBnYXNwLmNuCi0KLWNsZWFuLWFtaW5mbzoKLQotZGlzdGNsZWFuLWFtaW5mbzoKLQotbWFpbnRhaW5lci1jbGVhbi1hbWluZm86Ci0JZm9yIGkgaW4gJChJTkZPX0RFUFMpOyBkbyBcCi0JICBybSAtZiAkJGk7IFwKLQkgIGlmIHRlc3QgImBlY2hvICQkaS1bMC05XSpgIiAhPSAiJCRpLVswLTldKiI7IHRoZW4gXAotCSAgICBybSAtZiAkJGktWzAtOV0qOyBcCi0JICBmaTsgXAotCWRvbmUKLWNsZWFuLWluZm86IG1vc3RseWNsZWFuLWFtaW5mbwotCi1pbnN0YWxsLW1hbjE6Ci0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChtYW4xZGlyKQotCUBsaXN0PSckKG1hbjFfTUFOUyknOyBcCi0JbDI9JyQobWFuX01BTlMpJzsgZm9yIGkgaW4gJCRsMjsgZG8gXAotCSAgY2FzZSAiJCRpIiBpbiBcCi0JICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQoc3JjZGlyKS8kJGk7IHRoZW4gZmlsZT0kKHNyY2RpcikvJCRpOyBcCi0JICBlbHNlIGZpbGU9JCRpOyBmaTsgXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQkZmlsZSAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3Q7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1tYW4xOgotCUBsaXN0PSckKG1hbjFfTUFOUyknOyBcCi0JbDI9JyQobWFuX01BTlMpJzsgZm9yIGkgaW4gJCRsMjsgZG8gXAotCSAgY2FzZSAiJCRpIiBpbiBcCi0JICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCi0JICBlY2hvICIgcm0gLWYgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAotCSAgcm0gLWYgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotaW5zdGFsbC1tYW46ICQoTUFOUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLW1hbjEKLXVuaW5zdGFsbC1tYW46Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwtbWFuMQotdGFnczogVEFHUwotVEFHUzoKLQotCi1kaXN0ZGlyID0gJCh0b3BfYnVpbGRkaXIpLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLQotc3ViZGlyID0gZG9jCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgZGlzdC1pbmZvCi1pbmZvLWFtOiAkKElORk9fREVQUykKLWluZm86IGluZm8tYW0KLWR2aS1hbTogJChEVklTKQotZHZpOiBkdmktYW0KLWNoZWNrLWFtOgotY2hlY2s6IGNoZWNrLWFtCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQotaW5zdGFsbC1pbmZvLWFtOiAKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCi1pbnN0YWxsLWV4ZWMtYW06Ci1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQotCi1pbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtbWFuCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotaW5zdGFsbDogaW5zdGFsbC1hbQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbWFuCi11bmluc3RhbGw6IHVuaW5zdGFsbC1hbQotYWxsLWFtOiBNYWtlZmlsZSAkKE1BTlMpCi1hbGwtcmVkaXJlY3Q6IGFsbC1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6Ci0JJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQobWFuZGlyKS9tYW4xCi0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQktdGVzdCAteiAiJChESVNUQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoRElTVENMRUFORklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWFtaW5mbyBtb3N0bHljbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQotCi1jbGVhbi1hbTogIGNsZWFuLWFtaW5mbyBjbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWFtCi0KLWNsZWFuOiBjbGVhbi1hbQotCi1kaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4tYW1pbmZvIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBcCi0JCWRpc3RjbGVhbi1hbQotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCi0KLS5QSE9OWTogaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1pbmZvIG1vc3RseWNsZWFuLWFtaW5mbyBcCi1kaXN0Y2xlYW4tYW1pbmZvIGNsZWFuLWFtaW5mbyBtYWludGFpbmVyLWNsZWFuLWFtaW5mbyBpbnN0YWxsLW1hbjEgXAotdW5pbnN0YWxsLW1hbjEgaW5zdGFsbC1tYW4gdW5pbnN0YWxsLW1hbiB0YWdzIGRpc3RkaXIgaW5mby1hbSBpbmZvIFwKLWR2aS1hbSBkdmkgY2hlY2sgY2hlY2stYW0gaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxjaGVjayBpbnN0YWxsLWluZm8tYW0gXAotaW5zdGFsbC1pbmZvIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGF0YSBcCi1pbnN0YWxsLWFtIGluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbCBhbGwtcmVkaXJlY3QgYWxsLWFtIGFsbCBcCi1pbnN0YWxsZGlycyBtb3N0bHljbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWdlbmVyaWMgXAotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGNsZWFuIG1vc3RseWNsZWFuIGRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuCi0KLQotYXNjb25maWcudGV4aTogJChDT05GSUcpLnRleGkKLQlybSAtZiBhc2NvbmZpZy50ZXhpCi0JbG4gLXMgJChzcmNkaXIpLyQoQ09ORklHKS50ZXhpIC4vYXNjb25maWcudGV4aSA+L2Rldi9udWxsIDI+JjEgXAotCSAgfHwgbG4gJChzcmNkaXIpLyQoQ09ORklHKS50ZXhpIC4vYXNjb25maWcudGV4aSA+L2Rldi9udWxsIDI+JjEgXAotCSAgfHwgY3AgJChzcmNkaXIpLyQoQ09ORklHKS50ZXhpIC4vYXNjb25maWcudGV4aQotCi1nYXN2ZXIudGV4aTogTWFrZWZpbGUKLQlybSAtZiAkQAotCWVjaG8gJ0BzZXQgVkVSU0lPTiAkKFZFUlNJT04pJyA+ICRACi0KLWFzLmluZm86ICQoc3JjZGlyKS9hcy50ZXhpbmZvIGFzY29uZmlnLnRleGkgZ2FzdmVyLnRleGkgJChDUFVfRE9DUykKLWFzLmR2aTogJChzcmNkaXIpL2FzLnRleGluZm8gYXNjb25maWcudGV4aSBnYXN2ZXIudGV4aSAkKENQVV9ET0NTKQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9nYXMvZG9jL2FsbC50ZXhpIGIvZ2FzL2RvYy9hbGwudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5MGM1Yi4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2FsbC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotQGMgQ29weXJpZ2h0IDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEdBUyBtYW51YWwKLQotQGMgQ29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgYWxsLWluY2x1c2l2ZSB2ZXJzaW9uIG9mIG1hbnVhbAotCi1AYyBzd2l0Y2hlczotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUBjIFByb3BlcnRpZXMgb2YgdGhlIG1hbnVhbAotQGMgPT09PT09PT09PT09PT09PT09PT09PT09Ci1AYyBEaXNjdXNzIGFsbCBhcmNoaXRlY3R1cmVzPwotQHNldCBBTEwtQVJDSAotQGMgQSBnZW5lcmljIGZvcm0gb2YgbWFudWFsIChub3QgdGFpbG9yZWQgdG8gc3BlY2lmaWMgdGFyZ2V0KT8KLUBzZXQgR0VORVJJQwotQGMgSW5jbHVkZSB0ZXh0IG9uIGFzc2VtYmxlciBpbnRlcm5hbHM/Ci1AY2xlYXIgSU5URVJOQUxTCi1AYyBNYW55IG9iamVjdCBmb3JtYXRzIHN1cHBvcnRlZCBpbiB0aGlzIGNvbmZpZz8KLUBzZXQgTVVMVEktT0JKCi0KLUBjIE9iamVjdCBmb3JtYXRzIG9mIGludGVyZXN0Ci1AYyA9PT09PT09PT09PT09PT09PT09PT09PT09PQotQHNldCBBT1VUCi1Ac2V0IEJPVVQKLUBzZXQgQ09GRgotQHNldCBFTEYKLUBzZXQgU09NCi0KLUBjIENQVXMgb2YgaW50ZXJlc3QKLUBjID09PT09PT09PT09PT09PT0KLUBzZXQgQTI5SwotQHNldCBBUkMKLUBzZXQgQVJNCi1Ac2V0IEQxMFYKLUBzZXQgRDMwVgotQHNldCBIOC8zMDAKLUBzZXQgSDgvNTAwCi1Ac2V0IFNICi1Ac2V0IEk4MDM4NgotQHNldCBJOTYwCi1Ac2V0IE1DT1JFCi1Ac2V0IE1JUFMKLUBzZXQgTTMyUgotQHNldCBNNjgwWDAKLUBzZXQgWjgwMDAKLUBzZXQgU1BBUkMKLUBzZXQgVkFYCi1Ac2V0IFZYV09SS1MKLUBzZXQgSFBQQQotQHNldCBWODUwCi0KLUBjIERvZXMgdGhpcyB2ZXJzaW9uIG9mIHRoZSBhc3NlbWJsZXIgdXNlIHRoZSBkaWZmZXJlbmNlLXRhYmxlIGtsdWdlPwotQHNldCBESUZGLVRCTC1LTFVHRQotCi1AYyBEbyBhbGwgbWFjaGluZXMgZGVzY3JpYmVkIHVzZSBJRUVFIGZsb2F0aW5nIHBvaW50PwotQGNsZWFyIElFRUVGTE9BVAotCi1AYyBJcyBhIHdvcmQgMzIgYml0cywgb3IgMTY/Ci1AY2xlYXIgVzMyCi1Ac2V0IFcxNgotCi1AYyBEbyBzeW1ib2xzIGhhdmUgZGlmZmVyZW50IGNoYXJhY3RlcnMgdGhhbiB1c3VhbD8KLUBjbGVhciBTUEVDSUFMLVNZTVMKLQotQGMgc3RyaW5nczotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUBjIE5hbWUgb2YgdGhlIGFzc2VtYmxlcjoKLUBzZXQgQVMgYXMKLUBjIE5hbWUgb2YgQyBjb21waWxlcjoKLUBzZXQgR0NDIGdjYwotQGMgTmFtZSBvZiBsaW5rZXI6Ci1Ac2V0IExEIGxkCi1AYyBUZXh0IGZvciB0YXJnZXQgbWFjaGluZSAoYmVzdCBub3QgdXNlZCBpbiBnZW5lcmljIGNhc2U7IGJ1dCBqdXN0IGluIGNhc2UuLi4pCi1Ac2V0IFRBUkdFVCBtYWNoaW5lIHNwZWNpZmljCi1AYyBOYW1lIG9mIG9iamVjdCBmb3JtYXQgTk9UIFNFVCBpbiBnZW5lcmljIHZlcnNpb24KLUBjbGVhciBPQkotTkFNRQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9hcy4xIGIvZ2FzL2RvYy9hcy4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGYyODg2Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYXMuMQorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkyLCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggYXMgMSAiMjkgTWFyY2ggMTk5NiIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotCi0uU0ggTkFNRQotR05VIGFzIFwtIHRoZSBwb3J0YWJsZSBHTlUgYXNzZW1ibGVyLgotCi0uU0ggU1lOT1BTSVMKLS5uYQotLkIgYXMKLS5SQiAiW1x8IiBcLWEgIltcfCIgZGhsbnMgIlx8XSIgXGMKLVwmXFtcfFw9XGMKLS5JIGZpbGVcYwotXCZcfF1cfF0KLS5SQiAiW1x8IiBcLUQgIlx8XSIKLS5SQiAiW1x8IiBcLVwtZGVmc3ltXCBTWU09VkFMICJcfF0iCi0uUkIgIltcfCIgXC1mICJcfF0iCi0uUkIgIltcfCIgXC1cLWdzdGFicyAiXHxdIgotLlJCICJbXHwiIFwtSQotLkkgcGF0aFxjCi1cJlx8XQotLlJCICJbXHwiIFwtSyAiXHxdIgotLlJCICJbXHwiIFwtTCAiXHxdIgotLlJCICJbXHwiIFwtTVwgfFwgXC1cLW1yaSAiXHxdIgotLlJCICJbXHwiIFwtbyAKLS5JIG9iamZpbGVcYwotXCZcfF0KLS5SQiAiW1x8IiBcLVIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtdHJhZGl0aW9uYWxcLWZvcm1hdCAiXHxdIgotLlJCICJbXHwiIFwtdiAiXHxdIgotLlJCICJbXHwiIFwtdyAiXHxdIgotLlJCICJbXHwiIFwtXF5cLSAiXCB8XCAiIFxjCi0uSSBmaWxlc1xjCi1cJlx8Llx8Llx8Llx8XQotCi0uSSBpOTYwLW9ubHkgb3B0aW9uczoKLS5icgotLlJCICJbXHwiIFwtQUNBICJcfHxcfCIgXC1BQ0FfQSAiXHx8XHwiIFwtQUNCXGMKLS5SQiAiXHx8XHwiIFwtQUNDICJcfHxcfCIgXC1BS0EgIlx8fFx8IiBcLUFLQlxjCi0uUkIgIlx8fFx8IiBcLUFLQyAiXHx8XHwiIFwtQU1DICJcfF0iCi0uUkIgIltcfCIgXC1iICJcfF0iCi0uUkIgIltcfCIgXC1uby1yZWxheCAiXHxdIgotCi0uSSBtNjgweDAtb25seSBvcHRpb25zOgotLmJyCi0uUkIgIltcfCIgXC1sICJcfF0iCi0uUkIgIltcfCIgXC1tYzY4MDAwICJcfHxcfCIgXC1tYzY4MDEwICJcfHxcfCIgXC1tYzY4MDIwICJcfF0iCi0uYWQgYgotCi0uU0ggREVTQ1JJUFRJT04KLUdOVSBcYwotLkIgYXNcYwotXCYgaXMgcmVhbGx5IGEgZmFtaWx5IG9mIGFzc2VtYmxlcnMuICAKLUlmIHlvdSB1c2UgKG9yIGhhdmUgdXNlZCkgdGhlIEdOVSBhc3NlbWJsZXIgb24gb25lIGFyY2hpdGVjdHVyZSwgeW91Ci1zaG91bGQgZmluZCBhIGZhaXJseSBzaW1pbGFyIGVudmlyb25tZW50IHdoZW4geW91IHVzZSBpdCBvbiBhbm90aGVyCi1hcmNoaXRlY3R1cmUuICBFYWNoIHZlcnNpb24gaGFzIG11Y2ggaW4gY29tbW9uIHdpdGggdGhlIG90aGVycywKLWluY2x1ZGluZyBvYmplY3QgZmlsZSBmb3JtYXRzLCBtb3N0IGFzc2VtYmxlciBkaXJlY3RpdmVzIChvZnRlbiBjYWxsZWQKLVxjCi0uSSBwc2V1ZG8tb3BzKVxjCi1cJiBhbmQgYXNzZW1ibGVyIHN5bnRheC4gIAotCi1Gb3IgaW5mb3JtYXRpb24gb24gdGhlIHN5bnRheCBhbmQgcHNldWRvLW9wcyB1c2VkIGJ5IEdOVSBcYwotLkIgYXNcYwotXCYsIHNlZSBgXHxcYwotLkIgYXNcYwotXHwnIGVudHJ5IGluIFxjCi0uQiBpbmZvIFxjCi0ob3IgdGhlIG1hbnVhbCBcYwotLkkKLS5JCi1Vc2luZyBhczogVGhlIEdOVSBBc3NlbWJsZXJcYwotXCYpLgotCi1cYwotLkIgYXNcYwotXCYgaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGFzc2VtYmxlIHRoZSBvdXRwdXQgb2YgdGhlIEdOVSBDCi1jb21waWxlciBcYwotLkIgZ2NjXGMKLVwmIGZvciB1c2UgYnkgdGhlIGxpbmtlciBcYwotLkIgbGRcYwotXCYuICBOZXZlcnRoZWxlc3MsCi13ZSd2ZSB0cmllZCB0byBtYWtlIFxjCi0uQiBhc1xjCi1cJiBhc3NlbWJsZSBjb3JyZWN0bHkgZXZlcnl0aGluZyB0aGF0IHRoZSBuYXRpdmUKLWFzc2VtYmxlciB3b3VsZC4KLVRoaXMgZG9lc24ndCBtZWFuIFxjCi0uQiBhc1xjCi1cJiBhbHdheXMgdXNlcyB0aGUgc2FtZSBzeW50YXggYXMgYW5vdGhlcgotYXNzZW1ibGVyIGZvciB0aGUgc2FtZSBhcmNoaXRlY3R1cmU7IGZvciBleGFtcGxlLCB3ZSBrbm93IG9mIHNldmVyYWwKLWluY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiA2ODB4MCBhc3NlbWJseSBsYW5ndWFnZSBzeW50YXguCi0KLUVhY2ggdGltZSB5b3UgcnVuIFxjCi0uQiBhc1xjCi1cJiBpdCBhc3NlbWJsZXMgZXhhY3RseSBvbmUgc291cmNlCi1wcm9ncmFtLiAgVGhlIHNvdXJjZSBwcm9ncmFtIGlzIG1hZGUgdXAgb2Ygb25lIG9yIG1vcmUgZmlsZXMuCi0oVGhlIHN0YW5kYXJkIGlucHV0IGlzIGFsc28gYSBmaWxlLikKLQotSWYgXGMKLS5CIGFzXGMKLVwmIGlzIGdpdmVuIG5vIGZpbGUgbmFtZXMgaXQgYXR0ZW1wdHMgdG8gcmVhZCBvbmUgaW5wdXQgZmlsZQotZnJvbSB0aGUgXGMKLS5CIGFzXGMKLVwmIHN0YW5kYXJkIGlucHV0LCB3aGljaCBpcyBub3JtYWxseSB5b3VyIHRlcm1pbmFsLiAgWW91Ci1tYXkgaGF2ZSB0byB0eXBlIFxjCi0uQiBjdGwtRFxjCi1cJiB0byB0ZWxsIFxjCi0uQiBhc1xjCi1cJiB0aGVyZSBpcyBubyBtb3JlIHByb2dyYW0KLXRvIGFzc2VtYmxlLiAgVXNlIGBcfFxjCi0uQiBcLVxeXC1cYwotXHwnIGlmIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgbmFtZSB0aGUgc3RhbmRhcmQgaW5wdXQgZmlsZQotaW4geW91ciBjb21tYW5kIGxpbmUuCi0KLS5CIGFzXGMKLVwmIG1heSB3cml0ZSB3YXJuaW5ncyBhbmQgZXJyb3IgbWVzc2FnZXMgdG8gdGhlIHN0YW5kYXJkIGVycm9yCi1maWxlICh1c3VhbGx5IHlvdXIgdGVybWluYWwpLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbiB3aGVuIFxjCi0uQiBhc1xjCi1cJiBpcwotcnVuIGF1dG9tYXRpY2FsbHkgYnkgYSBjb21waWxlci4gIFdhcm5pbmdzIHJlcG9ydCBhbiBhc3N1bXB0aW9uIG1hZGUgc28KLXRoYXQgXGMKLS5CIGFzXGMKLVwmIGNvdWxkIGtlZXAgYXNzZW1ibGluZyBhIGZsYXdlZCBwcm9ncmFtOyBlcnJvcnMgcmVwb3J0IGEKLWdyYXZlIHByb2JsZW0gdGhhdCBzdG9wcyB0aGUgYXNzZW1ibHkuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CUiBcLWEKLVR1cm4gb24gYXNzZW1ibHkgbGlzdGluZ3MuICBUaGVyZSBhcmUgdmFyaW91cyBzdWJvcHRpb25zLgotLkIgZAotb21pdHMgZGVidWdnaW5nIGRpcmVjdGl2ZXMuCi0uQiBoCi1pbmNsdWRlcyB0aGUgaGlnaCBsZXZlbCBzb3VyY2UgY29kZTsgdGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpZiB0aGUKLXNvdXJjZSBmaWxlIGNhbiBiZSBmb3VuZCwgYW5kIHRoZSBjb2RlIHdhcyBjb21waWxlZCB3aXRoCi0uQiBcLWcuCi0uQiBsCi1pbmNsdWRlcyBhbiBhc3NlbWJseSBsaXN0aW5nLgotLkIgbgotb21pdHMgZm9ybXMgcHJvY2Vzc2luZy4KLS5CIHMKLWluY2x1ZGVzIGEgc3ltYm9sIGxpc3RpbmcuCi0uQiA9Ci0uSSBmaWxlCi1zZXRzIHRoZSBsaXN0aW5nIGZpbGUgbmFtZTsgdGhpcyBtdXN0IGJlIHRoZSBsYXN0IHN1Ym9wdGlvbi4KLVRoZSBkZWZhdWx0IHN1Ym9wdGlvbnMgYXJlCi0uQiBobHMuCi0uVFAKLS5CIFwtRAotVGhpcyBvcHRpb24gaXMgYWNjZXB0ZWQgb25seSBmb3Igc2NyaXB0IGNvbXBhdGliaWxpdHkgd2l0aCBjYWxscyB0bwotb3RoZXIgYXNzZW1ibGVyczsgaXQgaGFzIG5vIGVmZmVjdCBvbiBcYwotLkIgYXNcYwotXCYuCi0uVFAKLS5CIFwtXC1kZWZzeW0gU1lNPVZBTFVFCi1EZWZpbmUgdGhlIHN5bWJvbCBTWU0gdG8gYmUgVkFMVUUgYmVmb3JlIGFzc2VtYmxpbmcgdGhlIGlucHV0IGZpbGUuCi1WQUxVRSBtdXN0IGJlIGFuIGludGVnZXIgY29uc3RhbnQuICBBcyBpbiBDLCBhIGxlYWRpbmcgMHggaW5kaWNhdGVzIGEKLWhleGFkZWNpbWFsIHZhbHVlLCBhbmQgYSBsZWFkaW5nIDAgaW5kaWNhdGVzIGFuIG9jdGFsIHZhbHVlLgotLlRQCi0uQiBcLWYKLWBgZmFzdCcnLS1za2lwIHByZXByb2Nlc3NpbmcgKGFzc3VtZSBzb3VyY2UgaXMgY29tcGlsZXIgb3V0cHV0KS4KLS5UUAotLkJJICJcLUlcICIgcGF0aAotQWRkIAotLkkgcGF0aAotdG8gdGhlIHNlYXJjaCBsaXN0IGZvciAKLS5CIC5pbmNsdWRlCi1kaXJlY3RpdmVzLgotLlRQCi0uQiBcLVwtZ3N0YWJzCi1HZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGVhY2ggYXNzZW1ibGVyIGxpbmUuICBUaGlzCi1tYXkgaGVscCBkZWJ1Z2dpbmcgYXNzZW1ibGVyIGNvZGUsIGlmIHRoZSBkZWJ1Z2dlciBjYW4gaGFuZGxlIGl0LgotLlRQCi0uQiBcLUsKLUlzc3VlIHdhcm5pbmdzIHdoZW4gZGlmZmVyZW5jZSB0YWJsZXMgYWx0ZXJlZCBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzLgotLlRQCi0uQiBcLUwKLUtlZXAgKGluIHN5bWJvbCB0YWJsZSkgbG9jYWwgc3ltYm9scywgc3RhcnRpbmcgd2l0aCBgXHxcYwotLkIgTFxjCi1cfCcKLS5UUAotLkIgXC1NLCBcLVwtbXJpCi1Bc3NlbWJsZSBpbiBNUkkgY29tcGF0aWJpbGl0eSBtb2RlLgotLlRQCi0uQkkgIlwtb1wgIiBvYmpmaWxlCi1OYW1lIHRoZSBvYmplY3QtZmlsZSBvdXRwdXQgZnJvbSBcYwotLkIgYXMKLS5UUAotLkIgXC1SCi1Gb2xkIGRhdGEgc2VjdGlvbiBpbnRvIHRleHQgc2VjdGlvbgotLlRQCi0uQiBcLVwtdHJhZGl0aW9uYWxcLWZvcm1hdAotVXNlIHNhbWUgZm9ybWF0IGFzIG5hdGl2ZSBhc3NlbWJsZXIsIHdoZW4gcG9zc2libGUuCi0uVFAKLS5CIFwtdgotQW5ub3VuY2UgXGMKLS5CIGFzXGMKLVwmIHZlcnNpb24KLS5UUAotLkIgXC1XCi1TdXBwcmVzcyB3YXJuaW5nIG1lc3NhZ2VzCi0uVFAKLS5JUiAiXC1cXlwtIiAiXCB8XCAiICJmaWxlc1x8Llx8Llx8LiIKLVNvdXJjZSBmaWxlcyB0byBhc3NlbWJsZSwgb3Igc3RhbmRhcmQgaW5wdXQgKFxjCi0uQlIgIlwtXF5cLSIgIikiCi0uVFAKLS5CSSBcLUEgdmFyCi0uSQotKFdoZW4gY29uZmlndXJlZCBmb3IgSW50ZWwgOTYwLikKLVNwZWNpZnkgd2hpY2ggdmFyaWFudCBvZiB0aGUgOTYwIGFyY2hpdGVjdHVyZSBpcyB0aGUgdGFyZ2V0LgotLlRQCi0uQiBcLWIKLS5JCi0oV2hlbiBjb25maWd1cmVkIGZvciBJbnRlbCA5NjAuKQotQWRkIGNvZGUgdG8gY29sbGVjdCBzdGF0aXN0aWNzIGFib3V0IGJyYW5jaGVzIHRha2VuLgotLlRQCi0uQiBcLW5vLXJlbGF4Ci0uSQotKFdoZW4gY29uZmlndXJlZCBmb3IgSW50ZWwgOTYwLikKLURvIG5vdCBhbHRlciBjb21wYXJlLWFuZC1icmFuY2ggaW5zdHJ1Y3Rpb25zIGZvciBsb25nIGRpc3BsYWNlbWVudHM7Ci1lcnJvciBpZiBuZWNlc3NhcnkuCi0uVFAKLS5CIFwtbAotLkkKLShXaGVuIGNvbmZpZ3VyZWQgZm9yIE1vdG9yb2xhIDY4MDAwKS4gIAotLmJyCi1TaG9ydGVuIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkIHN5bWJvbHMsIHRvIG9uZSB3b3JkIGluc3RlYWQgb2YgdHdvLgotLlRQCi0uQlIgIlwtbWM2ODAwMCIgIlx8fFx8IiAiXC1tYzY4MDEwIiAiXHx8XHwiICJcLW1jNjgwMjAiCi0uSQotKFdoZW4gY29uZmlndXJlZCBmb3IgTW90b3JvbGEgNjgwMDApLiAgCi0uYnIKLVNwZWNpZnkgd2hhdCBwcm9jZXNzb3IgaW4gdGhlIDY4MDAwIGZhbWlseSBpcyB0aGUgdGFyZ2V0IChkZWZhdWx0IDY4MDIwKQotCi0uUFAKLU9wdGlvbnMgbWF5IGJlIGluIGFueSBvcmRlciwgYW5kIG1heSBiZQotYmVmb3JlLCBhZnRlciwgb3IgYmV0d2VlbiBmaWxlIG5hbWVzLiAgVGhlIG9yZGVyIG9mIGZpbGUgbmFtZXMgaXMKLXNpZ25pZmljYW50LgotCi1gXHxcYwotLkIgXC1cXlwtXGMKLVx8JyAodHdvIGh5cGhlbnMpIGJ5IGl0c2VsZiBuYW1lcyB0aGUgc3RhbmRhcmQgaW5wdXQgZmlsZQotZXhwbGljaXRseSwgYXMgb25lIG9mIHRoZSBmaWxlcyBmb3IgXGMKLS5CIGFzXGMKLVwmIHRvIGFzc2VtYmxlLgotCi1FeGNlcHQgZm9yIGBcfFxjCi0uQiBcLVxeXC1cYwotXHwnIGFueSBjb21tYW5kIGxpbmUgYXJndW1lbnQgdGhhdCBiZWdpbnMgd2l0aCBhCi1oeXBoZW4gKGBcfFxjCi0uQiBcLVxjCi1cfCcpIGlzIGFuIG9wdGlvbi4gIEVhY2ggb3B0aW9uIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mCi1cYwotLkIgYXNcYwotXCYuICBObyBvcHRpb24gY2hhbmdlcyB0aGUgd2F5IGFub3RoZXIgb3B0aW9uIHdvcmtzLiAgQW4KLW9wdGlvbiBpcyBhIGBcfFxjCi0uQiBcLVxjCi1cfCcgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgbGV0dGVyczsgdGhlIGNhc2Ugb2YKLXRoZSBsZXR0ZXIgaXMgaW1wb3J0YW50LiAgIEFsbCBvcHRpb25zIGFyZSBvcHRpb25hbC4KLQotVGhlIGBcfFxjCi0uQiBcLW9cYwotXHwnIG9wdGlvbiBleHBlY3RzIGV4YWN0bHkgb25lIGZpbGUgbmFtZSB0byBmb2xsb3cuICBUaGUgZmlsZQotbmFtZSBtYXkgZWl0aGVyIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgb3B0aW9uJ3MgbGV0dGVyIChjb21wYXRpYmxlCi13aXRoIG9sZGVyIGFzc2VtYmxlcnMpIG9yIGl0IG1heSBiZSB0aGUgbmV4dCBjb21tYW5kIGFyZ3VtZW50IChHTlUKLXN0YW5kYXJkKS4gIAotCi1UaGVzZSB0d28gY29tbWFuZCBsaW5lcyBhcmUgZXF1aXZhbGVudDoKLS5icgotLkIKLWFzXCBcIFwtb1wgXCBteVwtb2JqZWN0XC1maWxlLm9cIFwgbXVtYmxlLnMKLS5icgotLkIKLWFzXCBcIFwtb215XC1vYmplY3RcLWZpbGUub1wgXCBtdW1ibGUucwotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGFzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1Vc2luZyBhczogVGhlIEdOVSBBc3NlbWJsZXJcYwotXCY7Ci0uQlIgZ2NjICIoIiAxICIpLCIKLS5CUiBsZCAiKCIgMSAiKS4iCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYXMudGV4aW5mbyBiL2dhcy9kb2MvYXMudGV4aW5mbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlMzYyYS4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2FzLnRleGluZm8KKysrIC9kZXYvbnVsbApAQCAtMSw1MzIyICswLDAgQEAKLVxpbnB1dCB0ZXhpbmZvIEBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLVRleGluZm8tKi0KLUBjICBDb3B5cmlnaHQgKGMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLUBjICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFVQREFURSEhICBPbiBmdXR1cmUgdXBkYXRlcy0tCi1AYyAgICgxKSAgIGNoZWNrIGZvciBuZXcgbWFjaGluZS1kZXAgY21kbGluZSBvcHRpb25zIGluCi1AYyAgICAgICAgIG1kX3BhcnNlX29wdGlvbiBkZWZpbml0aW9ucyBpbiBjb25maWcvdGMtKi5jCi1AYyAgICgyKSAgIGZvciBwbGF0Zm9ybS1zcGVjaWZpYyBkaXJlY3RpdmVzLCBleGFtaW5lIG1kX3BzZXVkb19vcAotQGMgICAgICAgICBpbiBjb25maWcvdGMtKi5jCi1AYyAgICgzKSAgIGZvciBvYmplY3QtZm9ybWF0IHNwZWNpZmljIGRpcmVjdGl2ZXMsIGV4YW1pbmUgb2JqX3BzZXVkb19vcAotQGMgICAgICAgICBpbiBjb25maWcvb2JqLSouYyAgICAgICAKLUBjICAgKDQpICAgcG9ydGFibGUgZGlyZWN0aXZlcyBpbiBwb3RhYmxlW10gaW4gcmVhZC5jCi1AYyAlKipzdGFydCBvZiBoZWFkZXIKLUBzZXRmaWxlbmFtZSBhcy5pbmZvCi1AYyAtLS1jb25maWctLS0KLUBjIGRlZmF1bHRzLCBjb25maWcgZmlsZSBtYXkgb3ZlcnJpZGU6Ci1Ac2V0IGhhdmUtc3RhYnMKLUBjIC0tLQotQGluY2x1ZGUgYXNjb25maWcudGV4aQotQGluY2x1ZGUgZ2FzdmVyLnRleGkKLUBjIC0tLQotQGMgY29tbW9uIE9SIGNvbWJpbmF0aW9ucyBvZiBjb25kaXRpb25zCi1AaWZzZXQgQU9VVAotQHNldCBhb3V0LWJvdXQKLUBlbmQgaWZzZXQKLUBpZnNldCBBUk0vVGh1bWIKLUBzZXQgQVJNCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQk9VVAotQHNldCBhb3V0LWJvdXQKLUBlbmQgaWZzZXQKLUBpZnNldCBIOC8zMDAKLUBzZXQgSDgKLUBlbmQgaWZzZXQKLUBpZnNldCBIOC81MDAKLUBzZXQgSDgKLUBlbmQgaWZzZXQKLUBpZnNldCBTSAotQHNldCBIOAotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLUBzZXQgYWJub3JtYWwtc2VwYXJhdG9yCi1AZW5kIGlmc2V0Ci1AYyAtLS0tLS0tLS0tLS0KLUBpZnNldCBHRU5FUklDCi1Ac2V0dGl0bGUgVXNpbmcgQHZhbHVle0FTfQotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQHNldHRpdGxlIFVzaW5nIEB2YWx1ZXtBU30gKEB2YWx1ZXtUQVJHRVR9KQotQGVuZCBpZmNsZWFyCi1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCi1AYyAlKiplbmQgb2YgaGVhZGVyCi0KLUBjIEBzbWFsbGJvb2sKLUBjIEBzZXQgU01BTEwKLUBjIFdBUkUhIFNvbWUgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IHNlY3Rpb25zIGNvbnRhaW4gdGFibGVzIG9mIG1hY2hpbmUKLUBjIGluc3RydWN0aW9ucy4gIEV4Y2VwdCBpbiBtdWx0aS1jb2x1bW4gZm9ybWF0LCB0aGVzZSB0YWJsZXMgbG9vayBzaWxseS4KLUBjIFVuZm9ydHVuYXRlbHksIFRleGluZm8gZG9lc24ndCBoYXZlIGEgZ2VuZXJhbC1wdXJwb3NlIG11bHRpLWNvbCBmb3JtYXQsIHNvCi1AYyB0aGUgbXVsdGktY29sIGZvcm1hdCBpcyBmYWtlZCB3aXRoaW4gQGV4YW1wbGUgc2VjdGlvbnMuCi1AYyAKLUBjIEFnYWluIHVuZm9ydHVuYXRlbHksIHRoZSBuYXR1cmFsIHNpemUgdGhhdCBmaXRzIG9uIGEgcGFnZSwgZm9yIHRoZXNlIHRhYmxlcywKLUBjIGlzIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3Qgc21hbGxib29rIGlzIHR1cm5lZCBvbi4KLUBjIFRoaXMgbWF0dGVycywgYmVjYXVzZSBvZiBvcmRlcjogdGV4dCBmbG93IHN3aXRjaGVzIGNvbHVtbnMgYXQgZWFjaCBwYWdlCi1AYyBicmVhay4KLUBjIAotQGMgVGhlIGZvcm1hdCBmYWtlZCBpbiB0aGlzIHNvdXJjZSB3b3JrcyByZWFzb25hYmx5IHdlbGwgZm9yIHNtYWxsYm9vaywKLUBjIG5vdCB3ZWxsIGZvciB0aGUgZGVmYXVsdCBsYXJnZS1wYWdlIGZvcm1hdC4gIFRoaXMgbWFudWFsIGV4cGVjdHMgdGhhdCBpZiB5b3UKLUBjIHR1cm4gb24gQHNtYWxsYm9vaywgeW91IHdpbGwgYWxzbyB1bmNvbW1lbnQgdGhlICJAc2V0IFNNQUxMIiB0byBlbmFibGUgdGhlCi1AYyB0YWJsZXMgaW4gcXVlc3Rpb24uICBZb3UgY2FuIHR1cm4gb24gb25lIHdpdGhvdXQgdGhlIG90aGVyIGF0IHlvdXIKLUBjIGRpc2NyZXRpb24sIG9mIGNvdXJzZS4gCi1AaWZpbmZvCi1Ac2V0IFNNQUxMCi1AYyB0aGUgaW5zbiB0YWJsZXMgbG9vayBqdXN0IGFzIHNpbGx5IGluIGluZm8gZmlsZXMgcmVnYXJkbGVzcyBvZiBzbWFsbGJvb2ssCi1AYyBtaWdodCBhcyB3ZWxsIHNob3cgJ2VtIGFueXdheXMuCi1AZW5kIGlmaW5mbwotCi1AaWZpbmZvCi1AZm9ybWF0Ci1TVEFSVC1JTkZPLURJUi1FTlRSWQotKiBBczogKGFzKS4gICAgICAgICAgICAgICAgICAgICBUaGUgR05VIGFzc2VtYmxlci4KLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi0KLUBmaW5hbG91dAotQHN5bmNvZGVpbmRleCBreSBjcAotCi1AaWZpbmZvCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBHTlUgQXNzZW1ibGVyICJAdmFsdWV7QVN9Ii4KLQotQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzIG1hbnVhbAotdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZSByZXN1bHRpbmcKLWRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8KLXRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCBpZmluZm8KLQotQHRpdGxlcGFnZQotQHRpdGxlIFVzaW5nIEB2YWx1ZXtBU30KLUBzdWJ0aXRsZSBUaGUgQHNje2dudX0gQXNzZW1ibGVyCi1AaWZjbGVhciBHRU5FUklDCi1Ac3VidGl0bGUgZm9yIHRoZSBAdmFsdWV7VEFSR0VUfSBmYW1pbHkKLUBlbmQgaWZjbGVhcgotQHNwIDEKLUBzdWJ0aXRsZSBWZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfQotQHNwIDEKLUBzcCAxMwotVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBJbmMuICB0aGFua3MgVGhlIE5pY2UgQ29tcHV0ZXIKLUNvbXBhbnkgb2YgQXVzdHJhbGlhIGZvciBsb2FuaW5nIERlYW4gRWxzbmVyIHRvIHdyaXRlIHRoZQotZmlyc3QgKFZheCkgdmVyc2lvbiBvZiBAY29kZXthc30gZm9yIFByb2plY3QgQHNje2dudX0uCi1UaGUgcHJvcHJpZXRvcnMsIG1hbmFnZW1lbnQgYW5kIHN0YWZmIG9mIFROQ0NBIHRoYW5rIEZTRiBmb3IKLWRpc3RyYWN0aW5nIHRoZSBib3NzIHdoaWxlIHRoZXkgZ290IHNvbWUgd29yawotZG9uZS4KLUBzcCAzCi1AYXV0aG9yIERlYW4gRWxzbmVyLCBKYXkgRmVubGFzb24gJiBmcmllbmRzCi1AcGFnZQotQHRleAote1xwYXJza2lwPTBwdAotXGhmaWxsIHtcaXQgVXNpbmcge1x0dCBAdmFsdWV7QVN9fX1ccGFyCi1caGZpbGwgRWRpdGVkIGJ5IEN5Z251cyBTdXBwb3J0XHBhcgotfQotJSJib3hpdCIgbWFjcm8gZm9yIGZpZ3VyZXM6Ci0lTW9kaWZpZWQgZnJvbSBLbnV0aCdzIGBgYm94aXQnJyBtYWNybyBmcm9tIFRlWGJvb2sgKGFuc3dlciB0byBleGVyY2lzZSAyMS4zKQotXGdkZWZcYm94aXQjMSMye1x2Ym94e1xocnVsZVxoYm94e1x2cnVsZVxrZXJuM3B0Ci0gICAgIFx2Ym94e1xwYXJpbmRlbnQ9MHB0XHBhcnNraXA9MHB0XGhzaXplPSMxXGtlcm4zcHRcc3RydXRcaGZpbAotIzJcaGZpbFxzdHJ1dFxrZXJuM3B0fVxrZXJuM3B0XHZydWxlfVxocnVsZX19JWJveCB3aXRoIHZpc2libGUgb3V0bGluZQotXGdkZWZcaWJveCMxIzJ7XGhib3ggdG8gIzF7IzJcaGZpbH1ca2VybjhwdH0lIGludmlzaWJsZSBib3gKLUBlbmQgdGV4Ci0KLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzIG1hbnVhbAotdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZSByZXN1bHRpbmcKLWRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8KLXRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCB0aXRsZXBhZ2UKLQotQGlmaW5mbwotQG5vZGUgVG9wCi1AdG9wIFVzaW5nIEB2YWx1ZXtBU30KLQotVGhpcyBmaWxlIGlzIGEgdXNlciBndWlkZSB0byB0aGUgQHNje2dudX0gYXNzZW1ibGVyIEBjb2Rle0B2YWx1ZXtBU319IHZlcnNpb24KLUB2YWx1ZXtWRVJTSU9OfS4KLUBpZmNsZWFyIEdFTkVSSUMKLVRoaXMgdmVyc2lvbiBvZiB0aGUgZmlsZSBkZXNjcmliZXMgQGNvZGV7QHZhbHVle0FTfX0gY29uZmlndXJlZCB0byBnZW5lcmF0ZQotY29kZSBmb3IgQHZhbHVle1RBUkdFVH0gYXJjaGl0ZWN0dXJlcy4KLUBlbmQgaWZjbGVhcgotQG1lbnUKLSogT3ZlcnZpZXc6OiAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXcKLSogSW52b2tpbmc6OiAgICAgICAgICAgICAgICAgICAgQ29tbWFuZC1MaW5lIE9wdGlvbnMKLSogU3ludGF4OjogICAgICAgICAgICAgICAgICAgICAgU3ludGF4Ci0qIFNlY3Rpb25zOjogICAgICAgICAgICAgICAgICAgIFNlY3Rpb25zIGFuZCBSZWxvY2F0aW9uCi0qIFN5bWJvbHM6OiAgICAgICAgICAgICAgICAgICAgIFN5bWJvbHMKLSogRXhwcmVzc2lvbnM6OiAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbnMKLSogUHNldWRvIE9wczo6ICAgICAgICAgICAgICAgICAgQXNzZW1ibGVyIERpcmVjdGl2ZXMKLSogTWFjaGluZSBEZXBlbmRlbmNpZXM6OiAgICAgICAgTWFjaGluZSBEZXBlbmRlbnQgRmVhdHVyZXMKLSogUmVwb3J0aW5nIEJ1Z3M6OiAgICAgICAgICAgICAgUmVwb3J0aW5nIEJ1Z3MKLSogQWNrbm93bGVkZ2VtZW50czo6ICAgICAgICAgICAgV2hvIERpZCBXaGF0Ci0qIEluZGV4OjogICAgICAgICAgICAgICAgICAgICAgIEluZGV4Ci1AZW5kIG1lbnUKLUBlbmQgaWZpbmZvCi0KLUBub2RlIE92ZXJ2aWV3Ci1AY2hhcHRlciBPdmVydmlldwotQGlmdGV4Ci1UaGlzIG1hbnVhbCBpcyBhIHVzZXIgZ3VpZGUgdG8gdGhlIEBzY3tnbnV9IGFzc2VtYmxlciBAY29kZXtAdmFsdWV7QVN9fS4KLUBpZmNsZWFyIEdFTkVSSUMKLVRoaXMgdmVyc2lvbiBvZiB0aGUgbWFudWFsIGRlc2NyaWJlcyBAY29kZXtAdmFsdWV7QVN9fSBjb25maWd1cmVkIHRvIGdlbmVyYXRlCi1jb2RlIGZvciBAdmFsdWV7VEFSR0VUfSBhcmNoaXRlY3R1cmVzLgotQGVuZCBpZmNsZWFyCi1AZW5kIGlmdGV4Ci0KLUBjaW5kZXggaW52b2NhdGlvbiBzdW1tYXJ5Ci1AY2luZGV4IG9wdGlvbiBzdW1tYXJ5Ci1AY2luZGV4IHN1bW1hcnkgb2Ygb3B0aW9ucwotSGVyZSBpcyBhIGJyaWVmIHN1bW1hcnkgb2YgaG93IHRvIGludm9rZSBAY29kZXtAdmFsdWV7QVN9fS4gIEZvciBkZXRhaWxzLAotQHB4cmVme0ludm9raW5nLCxDb21hbmQtTGluZSBPcHRpb25zfS4KLQotQGMgV2UgZG9uJ3QgdXNlIGRlZmZuIGFuZCBmcmllbmRzIGZvciB0aGUgZm9sbG93aW5nIGJlY2F1c2UgdGhleSBzZWVtCi1AYyB0byBiZSBsaW1pdGVkIHRvIG9uZSBsaW5lIGZvciB0aGUgaGVhZGVyLgotQHNtYWxsZXhhbXBsZQotQHZhbHVle0FTfSBbIC1hW2NkaGxuc11bPWZpbGVdIF0gWyAtRCBdICBbIC0tZGVmc3ltIEB2YXJ7c3ltfT1AdmFye3ZhbH0gXQotIFsgLWYgXSBbIC0tZ3N0YWJzIF0gWyAtLWhlbHAgXSBbIC1JIEB2YXJ7ZGlyfSBdIFsgLUogXSBbIC1LIF0gWyAtTCBdCi0gWyAtLWtlZXAtbG9jYWxzIF0gWyAtbyBAdmFye29iamZpbGV9IF0gWyAtUiBdIFsgLS1zdGF0aXN0aWNzIF0gWyAtdiBdCi0gWyAtdmVyc2lvbiBdIFsgLS12ZXJzaW9uIF0gWyAtVyBdIFsgLXcgXSBbIC14IF0gWyAtWiBdCi1AaWZzZXQgQTI5SwotQGMgYW0yOWsgaGFzIG5vIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlciBvcHRpb25zCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQVJDCi0gWyAtbWJpZy1lbmRpYW4gfCAtbWxpdHRsZS1lbmRpYW4gXQotQGVuZCBpZnNldAotQGlmc2V0IEFSTQotIFsgLW1bYXJtXTEgfCAtbVthcm1dMiB8IC1tW2FybV0yNTAgfCAtbVthcm1dMyB8IC1tW2FybV02IHwgLW1bYXJtXTdbdF1bW2RdbVtpXV0gXQotIFsgLW1bYXJtXXYyIHwgLW1bYXJtXXYyYSB8IC1tW2FybV12MyB8IC1tW2FybV12M20gfCAtbVthcm1ddjQgfCAtbVthcm1ddjR0IF0KLSBbIC1tdGh1bWIgfCAtbWFsbCBdCi0gWyAtbWZwYTEwIHwgLW1mcGExMSB8IC1tZnBlLW9sZCB8IC1tbm8tZnB1IF0KLSBbIC1FQiB8IC1FTCBdCi0gWyAtbWFwY3MtMzIgfCAtbWFwY3MtMjYgXQotQGVuZCBpZnNldAotQGlmc2V0IEQxMFYKLSBbIC1PIF0KLUBlbmQgaWZzZXQKLUBpZnNldCBEMzBWCi0gWyAtTyB8IC1uIHwgLU4gXQotQGVuZCBpZnNldAotQGlmc2V0IEg4Ci1AYyBIaXRhY2hpIGZhbWlseSBjaGlwcyBoYXZlIG5vIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlciBvcHRpb25zCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSFBQQQotQGMgSFBQQSBoYXMgbm8gbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyIG9wdGlvbnMgKHlldCkuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgU1BBUkMKLUBjIFRoZSBvcmRlciBoZXJlIGlzIGltcG9ydGFudC4gIFNlZSBjLXNwYXJjLnRleGkuCi0gWyAtQXY2IHwgLUF2NyB8IC1BdjggfCAtQXNwYXJjbGV0IHwgLUFzcGFyY2xpdGUKLSAgIC1BdjhwbHVzIHwgLUF2OHBsdXNhIHwgLUF2OSB8IC1BdjlhIF0KLSBbIC14YXJjaD12OHBsdXMgfCAteGFyY2g9djhwbHVzYSBdIFsgLWJ1bXAgXSBbIC0zMiB8IC02NCBdCi1AZW5kIGlmc2V0Ci1AaWZzZXQgWjgwMDAKLUBjIFo4MDAwIGhhcyBubyBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIgb3B0aW9ucwotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLUBjIHNlZSBtZF9wYXJzZV9vcHRpb24gaW4gdGMtaTk2MC5jCi0gWyAtQUNBIHwgLUFDQV9BIHwgLUFDQiB8IC1BQ0MgfCAtQUtBIHwgLUFLQiB8IC1BS0MgfCAtQU1DIF0KLSBbIC1iIF0gWyAtbm8tcmVsYXggXQotQGVuZCBpZnNldAotQGlmc2V0IE02ODBYMAotIFsgLWwgXSBbIC1tNjgwMDAgfCAtbTY4MDEwIHwgLW02ODAyMCB8IC4uLiBdCi1AZW5kIGlmc2V0Ci1AaWZzZXQgTUNPUkUKLSBbIC1qc3JpMmJzciBdIFsgLXNpZmlsdGVyIF0gWyAtcmVsYXggXQotQGVuZCBpZnNldAotQGlmc2V0IE1JUFMKLSBbIC1ub2NwcCBdIFsgLUVMIF0gWyAtRUIgXSBbIC1HIEB2YXJ7bnVtfSBdIFsgLW1jcHU9QHZhcntDUFV9IF0KLSBbIC1taXBzMSBdIFsgLW1pcHMyIF0gWyAtbWlwczMgXSBbIC1tNDY1MCBdIFsgLW5vLW00NjUwIF0KLSBbIC0tdHJhcCBdIFsgLS1icmVhayBdCi0gWyAtLWVtdWxhdGlvbj1AdmFye25hbWV9IF0KLUBlbmQgaWZzZXQKLSBbIC0tIHwgQHZhcntmaWxlc30gQGRvdHN7fSBdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1hW2NkaGxtbnNdCi1UdXJuIG9uIGxpc3RpbmdzLCBpbiBhbnkgb2YgYSB2YXJpZXR5IG9mIHdheXM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLWFjCi1vbWl0IGZhbHNlIGNvbmRpdGlvbmFscwotCi1AaXRlbSAtYWQKLW9taXQgZGVidWdnaW5nIGRpcmVjdGl2ZXMKLQotQGl0ZW0gLWFoCi1pbmNsdWRlIGhpZ2gtbGV2ZWwgc291cmNlCi0KLUBpdGVtIC1hbAotaW5jbHVkZSBhc3NlbWJseQotCi1AaXRlbSAtYW0KLWluY2x1ZGUgbWFjcm8gZXhwYW5zaW9ucwotCi1AaXRlbSAtYW4KLW9taXQgZm9ybXMgcHJvY2Vzc2luZwotCi1AaXRlbSAtYXMKLWluY2x1ZGUgc3ltYm9scwotCi1AaXRlbSA9ZmlsZQotc2V0IHRoZSBuYW1lIG9mIHRoZSBsaXN0aW5nIGZpbGUKLUBlbmQgdGFibGUKLQotWW91IG1heSBjb21iaW5lIHRoZXNlIG9wdGlvbnM7IGZvciBleGFtcGxlLCB1c2UgQHNhbXB7LWFsbn0gZm9yIGFzc2VtYmx5Ci1saXN0aW5nIHdpdGhvdXQgZm9ybXMgcHJvY2Vzc2luZy4gIFRoZSBAc2FtcHs9ZmlsZX0gb3B0aW9uLCBpZiB1c2VkLCBtdXN0IGJlCi10aGUgbGFzdCBvbmUuICBCeSBpdHNlbGYsIEBzYW1wey1hfSBkZWZhdWx0cyB0byBAc2FtcHstYWhsc30uCi0KLUBpdGVtIC1ECi1JZ25vcmVkLiAgVGhpcyBvcHRpb24gaXMgYWNjZXB0ZWQgZm9yIHNjcmlwdCBjb21wYXRpYmlsaXR5IHdpdGggY2FsbHMgdG8KLW90aGVyIGFzc2VtYmxlcnMuCi0KLUBpdGVtIC0tZGVmc3ltIEB2YXJ7c3ltfT1AdmFye3ZhbHVlfQotRGVmaW5lIHRoZSBzeW1ib2wgQHZhcntzeW19IHRvIGJlIEB2YXJ7dmFsdWV9IGJlZm9yZSBhc3NlbWJsaW5nIHRoZSBpbnB1dCBmaWxlLgotQHZhcnt2YWx1ZX0gbXVzdCBiZSBhbiBpbnRlZ2VyIGNvbnN0YW50LiAgQXMgaW4gQywgYSBsZWFkaW5nIEBzYW1wezB4fQotaW5kaWNhdGVzIGEgaGV4YWRlY2ltYWwgdmFsdWUsIGFuZCBhIGxlYWRpbmcgQHNhbXB7MH0gaW5kaWNhdGVzIGFuIG9jdGFsIHZhbHVlLgotCi1AaXRlbSAtZgotYGBmYXN0JyctLS1za2lwIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQgcHJlcHJvY2Vzc2luZyAoYXNzdW1lIHNvdXJjZSBpcwotY29tcGlsZXIgb3V0cHV0KS4KLQotQGl0ZW0gLS1nc3RhYnMKLUdlbmVyYXRlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBhc3NlbWJsZXIgbGluZS4gIFRoaXMKLW1heSBoZWxwIGRlYnVnZ2luZyBhc3NlbWJsZXIgY29kZSwgaWYgdGhlIGRlYnVnZ2VyIGNhbiBoYW5kbGUgaXQuCi0KLUBpdGVtIC0taGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgZXhpdC4KLQotQGl0ZW0gLUkgQHZhcntkaXJ9Ci1BZGQgZGlyZWN0b3J5IEB2YXJ7ZGlyfSB0byB0aGUgc2VhcmNoIGxpc3QgZm9yIEBjb2Rley5pbmNsdWRlfSBkaXJlY3RpdmVzLgotCi1AaXRlbSAtSgotRG9uJ3Qgd2FybiBhYm91dCBzaWduZWQgb3ZlcmZsb3cuCi0KLUBpdGVtIC1LCi1AaWZjbGVhciBESUZGLVRCTC1LTFVHRQotVGhpcyBvcHRpb24gaXMgYWNjZXB0ZWQgYnV0IGhhcyBubyBlZmZlY3Qgb24gdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseS4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IERJRkYtVEJMLUtMVUdFCi1Jc3N1ZSB3YXJuaW5ncyB3aGVuIGRpZmZlcmVuY2UgdGFibGVzIGFsdGVyZWQgZm9yIGxvbmcgZGlzcGxhY2VtZW50cy4KLUBlbmQgaWZzZXQKLQotQGl0ZW0gLUwKLUBpdGVteCAtLWtlZXAtbG9jYWxzCi1LZWVwIChpbiB0aGUgc3ltYm9sIHRhYmxlKSBsb2NhbCBzeW1ib2xzLiAgT24gdHJhZGl0aW9uYWwgYS5vdXQgc3lzdGVtcwotdGhlc2Ugc3RhcnQgd2l0aCBAc2FtcHtMfSwgYnV0IGRpZmZlcmVudCBzeXN0ZW1zIGhhdmUgZGlmZmVyZW50IGxvY2FsCi1sYWJlbCBwcmVmaXhlcy4KLQotQGl0ZW0gLW8gQHZhcntvYmpmaWxlfQotTmFtZSB0aGUgb2JqZWN0LWZpbGUgb3V0cHV0IGZyb20gQGNvZGV7QHZhbHVle0FTfX0gQHZhcntvYmpmaWxlfS4KLQotQGl0ZW0gLVIKLUZvbGQgdGhlIGRhdGEgc2VjdGlvbiBpbnRvIHRoZSB0ZXh0IHNlY3Rpb24uCi0KLUBpdGVtIC0tc3RhdGlzdGljcwotUHJpbnQgdGhlIG1heGltdW0gc3BhY2UgKGluIGJ5dGVzKSBhbmQgdG90YWwgdGltZSAoaW4gc2Vjb25kcykgdXNlZCBieQotYXNzZW1ibHkuCi0KLUBpdGVtIC0tc3RyaXAtbG9jYWwtYWJzb2x1dGUKLVJlbW92ZSBsb2NhbCBhYnNvbHV0ZSBzeW1ib2xzIGZyb20gdGhlIG91dGdvaW5nIHN5bWJvbCB0YWJsZS4KLQotQGl0ZW0gLXYKLUBpdGVteCAtdmVyc2lvbgotUHJpbnQgdGhlIEBjb2Rle2FzfSB2ZXJzaW9uLgotCi1AaXRlbSAtLXZlcnNpb24KLVByaW50IHRoZSBAY29kZXthc30gdmVyc2lvbiBhbmQgZXhpdC4KLQotQGl0ZW0gLVcKLVN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXMuCi0KLUBpdGVtIC13Ci1JZ25vcmVkLgotCi1AaXRlbSAteAotSWdub3JlZC4KLQotQGl0ZW0gLVoKLUdlbmVyYXRlIGFuIG9iamVjdCBmaWxlIGV2ZW4gYWZ0ZXIgZXJyb3JzLgotCi1AaXRlbSAtLSB8IEB2YXJ7ZmlsZXN9IEBkb3Rze30KLVN0YW5kYXJkIGlucHV0LCBvciBzb3VyY2UgZmlsZXMgdG8gYXNzZW1ibGUuCi0KLUBlbmQgdGFibGUKLQotQGlmc2V0IEFSQwotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yCi1hbiBBUkMgcHJvY2Vzc29yLgotCi1AdGFibGUgQGNvZGUKLQotQGNpbmRleCBBUkMgZW5kaWFubmVzcwotQGNpbmRleCBlbmRpYW5uZXNzLCBBUkMKLUBjaW5kZXggYmlnIGVuZGlhbiBvdXRwdXQsIEFSQwotQGl0ZW0gLW1iaWctZW5kaWFuCi1HZW5lcmF0ZSBgYGJpZyBlbmRpYW4nJyBmb3JtYXQgb3V0cHV0LgotCi1AY2luZGV4IGxpdHRsZSBlbmRpYW4gb3V0cHV0LCBBUkMKLUBpdGVtIC1tbGl0dGxlLWVuZGlhbgotR2VuZXJhdGUgYGBsaXR0bGUgZW5kaWFuJycgZm9ybWF0IG91dHB1dC4KLQotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgQVJNCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IgdGhlIEFSTQotcHJvY2Vzc29yIGZhbWlseS4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtbVthcm1dMSB8IC1tW2FybV0yIHwgLW1bYXJtXTI1MCB8IC1tW2FybV0zIHwgLW1bYXJtXTYgfCAtbVthcm1dN1t0XVtbZF1tXSB8IC1tW2FybV12MiB8IC1tW2FybV12MmEgfCAtbVthcm1ddjMgfCAtbVthcm1ddjNtIHwgLW1bYXJtXXY0IHwgLW1bYXJtXXY0dCAKLVNwZWNpZnkgd2hpY2ggdmFyaWFudCBvZiB0aGUgQVJNIGFyY2hpdGVjdHVyZSBpcyB0aGUgdGFyZ2V0LgotQGl0ZW0gLW10aHVtYiB8IC1tYWxsCi1FbmFibGUgb3IgZGlzYWJsZSBUaHVtYiBvbmx5IGluc3RydWN0aW9uIGRlY29kaW5nLgotQGl0ZW0gLW1mcGExMCB8IC1tZnBhMTEgfCAtbWZwZS1vbGQgfCAtbW5vLWZwdQotU2VsZWN0IHdoaWNoIEZsb2F0aW5nIFBvaW50IGFyY2hpdGN0dXJlIGlzIHRoZSB0YXJnZXQuCi1AaXRlbSAtbWFwY3MtMzIgfCAtbWFwY3MtMjYKLVNlbGVjdCB3aGljaCBwcm9jZWR1cmUgY2FsbGluZyBjb252ZW50aW9uIGlzIGluIHVzZS4KLUBpdGVtIC1FQiB8IC1FTAotU2VsZWN0IGVpdGhlciBiaWctZW5kaWFuICgtRUIpIG9yIGxpdHRsZS1lbmRpYW4gKC1FTCkgb3V0cHV0LgotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgRDEwVgotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yCi1hIEQxMFYgcHJvY2Vzc29yLgotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEQxMFYgb3B0aW1pemF0aW9uCi1AY2luZGV4IG9wdGltaXphdGlvbiwgRDEwVgotQGl0ZW0gLU8KLU9wdGltaXplIG91dHB1dCBieSBwYXJhbGxlbGl6aW5nIGluc3RydWN0aW9ucy4KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEQzMFYKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvciBhIEQzMFYKLXByb2Nlc3Nvci4KLUB0YWJsZSBAY29kZQotQGNpbmRleCBEMzBWIG9wdGltaXphdGlvbgotQGNpbmRleCBvcHRpbWl6YXRpb24sIEQzMFYKLUBpdGVtIC1PCi1PcHRpbWl6ZSBvdXRwdXQgYnkgcGFyYWxsZWxpemluZyBpbnN0cnVjdGlvbnMuCi0KLUBjaW5kZXggRDMwViBub3BzCi1AaXRlbSAtbgotV2FybiB3aGVuIG5vcHMgYXJlIGdlbmVyYXRlZC4KLQotQGNpbmRleCBEMzBWIG5vcHMgYWZ0ZXIgMzItYml0IG11bHRpcGx5Ci1AaXRlbSAtTgotV2FybiB3aGVuIGEgbm9wIGFmdGVyIGEgMzItYml0IG11bHRpcGx5IGluc3RydWN0aW9uIGlzIGdlbmVyYXRlZC4KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEk5NjAKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvciB0aGUKLUludGVsIDgwOTYwIHByb2Nlc3Nvci4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtQUNBIHwgLUFDQV9BIHwgLUFDQiB8IC1BQ0MgfCAtQUtBIHwgLUFLQiB8IC1BS0MgfCAtQU1DCi1TcGVjaWZ5IHdoaWNoIHZhcmlhbnQgb2YgdGhlIDk2MCBhcmNoaXRlY3R1cmUgaXMgdGhlIHRhcmdldC4KLQotQGl0ZW0gLWIKLUFkZCBjb2RlIHRvIGNvbGxlY3Qgc3RhdGlzdGljcyBhYm91dCBicmFuY2hlcyB0YWtlbi4KLQotQGl0ZW0gLW5vLXJlbGF4Ci1EbyBub3QgYWx0ZXIgY29tcGFyZS1hbmQtYnJhbmNoIGluc3RydWN0aW9ucyBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzOwotZXJyb3IgaWYgbmVjZXNzYXJ5LgotCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLQotQGlmc2V0IE02ODBYMAotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yIHRoZQotTW90b3JvbGEgNjgwMDAgc2VyaWVzLgotCi1AdGFibGUgQGNvZGUKLQotQGl0ZW0gLWwKLVNob3J0ZW4gcmVmZXJlbmNlcyB0byB1bmRlZmluZWQgc3ltYm9scywgdG8gb25lIHdvcmQgaW5zdGVhZCBvZiB0d28uCi0KLUBpdGVtIC1tNjgwMDAgfCAtbTY4MDA4IHwgLW02ODAxMCB8IC1tNjgwMjAgfCAtbTY4MDMwIHwgLW02ODA0MCB8IC1tNjgwNjAKLUBpdGVteCB8IC1tNjgzMDIgfCAtbTY4MzMxIHwgLW02ODMzMiB8IC1tNjgzMzMgfCAtbTY4MzQwIHwgLW1jcHUzMiB8IC1tNTIwMAotU3BlY2lmeSB3aGF0IHByb2Nlc3NvciBpbiB0aGUgNjgwMDAgZmFtaWx5IGlzIHRoZSB0YXJnZXQuICBUaGUgZGVmYXVsdAotaXMgbm9ybWFsbHkgdGhlIDY4MDIwLCBidXQgdGhpcyBjYW4gYmUgY2hhbmdlZCBhdCBjb25maWd1cmF0aW9uIHRpbWUuCi0KLUBpdGVtIC1tNjg4ODEgfCAtbTY4ODgyIHwgLW1uby02ODg4MSB8IC1tbm8tNjg4ODIKLVRoZSB0YXJnZXQgbWFjaGluZSBkb2VzIChvciBkb2VzIG5vdCkgaGF2ZSBhIGZsb2F0aW5nLXBvaW50IGNvcHJvY2Vzc29yLgotVGhlIGRlZmF1bHQgaXMgdG8gYXNzdW1lIGEgY29wcm9jZXNzb3IgZm9yIDY4MDIwLCA2ODAzMCwgYW5kIGNwdTMyLiAgQWx0aG91Z2gKLXRoZSBiYXNpYyA2ODAwMCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSA2ODg4MSwgYSBjb21iaW5hdGlvbiBvZiB0aGUKLXR3byBjYW4gYmUgc3BlY2lmaWVkLCBzaW5jZSBpdCdzIHBvc3NpYmxlIHRvIGRvIGVtdWxhdGlvbiBvZiB0aGUKLWNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyB3aXRoIHRoZSBtYWluIHByb2Nlc3Nvci4KLQotQGl0ZW0gLW02ODg1MSB8IC1tbm8tNjg4NTEKLVRoZSB0YXJnZXQgbWFjaGluZSBkb2VzIChvciBkb2VzIG5vdCkgaGF2ZSBhIG1lbW9yeS1tYW5hZ2VtZW50Ci11bml0IGNvcHJvY2Vzc29yLiAgVGhlIGRlZmF1bHQgaXMgdG8gYXNzdW1lIGFuIE1NVSBmb3IgNjgwMjAgYW5kIHVwLgotCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBTUEFSQwotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkCi1mb3IgdGhlIFNQQVJDIGFyY2hpdGVjdHVyZToKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtQXY2IHwgLUF2NyB8IC1BdjggfCAtQXNwYXJjbGV0IHwgLUFzcGFyY2xpdGUKLUBpdGVteCAtQXY4cGx1cyB8IC1BdjhwbHVzYSB8IC1BdjkgfCAtQXY5YQotRXhwbGljaXRseSBzZWxlY3QgYSB2YXJpYW50IG9mIHRoZSBTUEFSQyBhcmNoaXRlY3R1cmUuCi0KLUBzYW1wey1BdjhwbHVzfSBhbmQgQHNhbXB7LUF2OHBsdXNhfSBzZWxlY3QgYSAzMiBiaXQgZW52aXJvbm1lbnQuCi1Ac2FtcHstQXY5fSBhbmQgQHNhbXB7LUF2OWF9IHNlbGVjdCBhIDY0IGJpdCBlbnZpcm9ubWVudC4KLQotQHNhbXB7LUF2OHBsdXNhfSBhbmQgQHNhbXB7LUF2OWF9IGVuYWJsZSB0aGUgU1BBUkMgVjkgaW5zdHJ1Y3Rpb24gc2V0IHdpdGgKLVVsdHJhU1BBUkMgZXh0ZW5zaW9ucy4KLQotQGl0ZW0gLXhhcmNoPXY4cGx1cyB8IC14YXJjaD12OHBsdXNhCi1Gb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBTb2xhcmlzIHY5IGFzc2VtYmxlci4gIFRoZXNlIG9wdGlvbnMgYXJlCi1lcXVpdmFsZW50IHRvIC1BdjhwbHVzIGFuZCAtQXY4cGx1c2EsIHJlc3BlY3RpdmVseS4KLQotQGl0ZW0gLWJ1bXAKLVdhcm4gd2hlbiB0aGUgYXNzZW1ibGVyIHN3aXRjaGVzIHRvIGFub3RoZXIgYXJjaGl0ZWN0dXJlLgotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgTUlQUwotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yCi1hIE1JUFMgcHJvY2Vzc29yLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1HIEB2YXJ7bnVtfQotVGhpcyBvcHRpb24gc2V0cyB0aGUgbGFyZ2VzdCBzaXplIG9mIGFuIG9iamVjdCB0aGF0IGNhbiBiZSByZWZlcmVuY2VkCi1pbXBsaWNpdGx5IHdpdGggdGhlIEBjb2Rle2dwfSByZWdpc3Rlci4gIEl0IGlzIG9ubHkgYWNjZXB0ZWQgZm9yIHRhcmdldHMgdGhhdAotdXNlIEVDT0ZGIGZvcm1hdCwgc3VjaCBhcyBhIERFQ3N0YXRpb24gcnVubmluZyBVbHRyaXguICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA4LgotCi1AY2luZGV4IE1JUFMgZW5kaWFubmVzcwotQGNpbmRleCBlbmRpYW5uZXNzLCBNSVBTCi1AY2luZGV4IGJpZyBlbmRpYW4gb3V0cHV0LCBNSVBTCi1AaXRlbSAtRUIKLUdlbmVyYXRlIGBgYmlnIGVuZGlhbicnIGZvcm1hdCBvdXRwdXQuCi0KLUBjaW5kZXggbGl0dGxlIGVuZGlhbiBvdXRwdXQsIE1JUFMKLUBpdGVtIC1FTAotR2VuZXJhdGUgYGBsaXR0bGUgZW5kaWFuJycgZm9ybWF0IG91dHB1dC4KLQotQGNpbmRleCBNSVBTIElTQQotQGl0ZW0gLW1pcHMxCi1AaXRlbXggLW1pcHMyCi1AaXRlbXggLW1pcHMzCi1HZW5lcmF0ZSBjb2RlIGZvciBhIHBhcnRpY3VsYXIgTUlQUyBJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlIGxldmVsLgotQHNhbXB7LW1pcHMxfSBjb3JyZXNwb25kcyB0byB0aGUgQHNje3IyMDAwfSBhbmQgQHNje3IzMDAwfSBwcm9jZXNzb3JzLAotQHNhbXB7LW1pcHMyfSB0byB0aGUgQHNje3I2MDAwfSBwcm9jZXNzb3IsIGFuZCBAc2FtcHstbWlwczN9IHRvIHRoZSBAc2N7cjQwMDB9Ci1wcm9jZXNzb3IuCi0KLUBpdGVtIC1tNDY1MAotQGl0ZW14IC1uby1tNDY1MAotR2VuZXJhdGUgY29kZSBmb3IgdGhlIE1JUFMgQHNje3I0NjUwfSBjaGlwLiAgVGhpcyB0ZWxscyB0aGUgYXNzZW1ibGVyIHRvIGFjY2VwdAotdGhlIEBzYW1we21hZH0gYW5kIEBzYW1we21hZHV9IGluc3RydWN0aW9uLCBhbmQgdG8gbm90IHNjaGVkdWxlIEBzYW1we25vcH0KLWluc3RydWN0aW9ucyBhcm91bmQgYWNjZXNzZXMgdG8gdGhlIEBzYW1we0hJfSBhbmQgQHNhbXB7TE99IHJlZ2lzdGVycy4KLUBzYW1wey1uby1tNDY1MH0gdHVybnMgb2ZmIHRoaXMgb3B0aW9uLgotCi1AaXRlbSAtbWNwdT1AdmFye0NQVX0KLUdlbmVyYXRlIGNvZGUgZm9yIGEgcGFydGljdWxhciBNSVBTIGNwdS4gIFRoaXMgaGFzIGxpdHRsZSBlZmZlY3Qgb24gdGhlCi1hc3NlbWJsZXIsIGJ1dCBpdCBpcyBwYXNzZWQgYnkgQGNvZGV7QHZhbHVle0dDQ319LgotCi1AY2luZGV4IGVtdWxhdGlvbgotQGl0ZW0gLS1lbXVsYXRpb249QHZhcntuYW1lfQotVGhpcyBvcHRpb24gY2F1c2VzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGVtdWxhdGUgQGNvZGV7QHZhbHVle0FTfX0gY29uZmlndXJlZAotZm9yIHNvbWUgb3RoZXIgdGFyZ2V0LCBpbiBhbGwgcmVzcGVjdHMsIGluY2x1ZGluZyBvdXRwdXQgZm9ybWF0IChjaG9vc2luZwotYmV0d2VlbiBFTEYgYW5kIEVDT0ZGIG9ubHkpLCBoYW5kbGluZyBvZiBwc2V1ZG8tb3Bjb2RlcyB3aGljaCBtYXkgZ2VuZXJhdGUKLWRlYnVnZ2luZyBpbmZvcm1hdGlvbiBvciBzdG9yZSBzeW1ib2wgdGFibGUgaW5mb3JtYXRpb24sIGFuZCBkZWZhdWx0Ci1lbmRpYW5uZXNzLiAgVGhlIGF2YWlsYWJsZSBjb25maWd1cmF0aW9uIG5hbWVzIGFyZTogQHNhbXB7bWlwc2Vjb2ZmfSwKLUBzYW1we21pcHNlbGZ9LCBAc2FtcHttaXBzbGVjb2ZmfSwgQHNhbXB7bWlwc2JlY29mZn0sIEBzYW1we21pcHNsZWxmfSwKLUBzYW1we21pcHNiZWxmfS4gIFRoZSBmaXJzdCB0d28gZG8gbm90IGFsdGVyIHRoZSBkZWZhdWx0IGVuZGlhbm5lc3MgZnJvbSB0aGF0Ci1vZiB0aGUgcHJpbWFyeSB0YXJnZXQgZm9yIHdoaWNoIHRoZSBhc3NlbWJsZXIgd2FzIGNvbmZpZ3VyZWQ7IHRoZSBvdGhlcnMgY2hhbmdlCi10aGUgZGVmYXVsdCB0byBsaXR0bGUtIG9yIGJpZy1lbmRpYW4gYXMgaW5kaWNhdGVkIGJ5IHRoZSBAc2FtcHtifSBvciBAc2FtcHtsfQotaW4gdGhlIG5hbWUuICBVc2luZyBAc2FtcHstRUJ9IG9yIEBzYW1wey1FTH0gd2lsbCBvdmVycmlkZSB0aGUgZW5kaWFubmVzcwotc2VsZWN0aW9uIGluIGFueSBjYXNlLgotCi1UaGlzIG9wdGlvbiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIG9ubHkgd2hlbiB0aGUgcHJpbWFyeSB0YXJnZXQKLUBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgZm9yIGlzIGEgTUlQUyBFTEYgb3IgRUNPRkYgdGFyZ2V0LgotRnVydGhlcm1vcmUsIHRoZSBwcmltYXJ5IHRhcmdldCBvciBvdGhlcnMgc3BlY2lmaWVkIHdpdGgKLUBzYW1wey0tZW5hYmxlLXRhcmdldHM9QGRvdHN7fX0gYXQgY29uZmlndXJhdGlvbiB0aW1lIG11c3QgaW5jbHVkZSBzdXBwb3J0IGZvcgotdGhlIG90aGVyIGZvcm1hdCwgaWYgYm90aCBhcmUgdG8gYmUgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGUsIHRoZSBJcml4IDUKLWNvbmZpZ3VyYXRpb24gaW5jbHVkZXMgc3VwcG9ydCBmb3IgYm90aC4KLQotRXZlbnR1YWxseSwgdGhpcyBvcHRpb24gd2lsbCBzdXBwb3J0IG1vcmUgY29uZmlndXJhdGlvbnMsIHdpdGggbW9yZQotZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciB0aGUgYXNzZW1ibGVyJ3MgYmVoYXZpb3IsIGFuZCB3aWxsIGJlIHN1cHBvcnRlZCBmb3IKLW1vcmUgcHJvY2Vzc29ycy4KLQotQGl0ZW0gLW5vY3BwCi1AY29kZXtAdmFsdWV7QVN9fSBpZ25vcmVzIHRoaXMgb3B0aW9uLiAgSXQgaXMgYWNjZXB0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAotdGhlIG5hdGl2ZSB0b29scy4KLQotQG5lZWQgOTAwCi1AaXRlbSAtLXRyYXAKLUBpdGVteCAtLW5vLXRyYXAKLUBpdGVteCAtLWJyZWFrCi1AaXRlbXggLS1uby1icmVhawotQ29udHJvbCBob3cgdG8gZGVhbCB3aXRoIG11bHRpcGxpY2F0aW9uIG92ZXJmbG93IGFuZCBkaXZpc2lvbiBieSB6ZXJvLgotQHNhbXB7LS10cmFwfSBvciBAc2FtcHstLW5vLWJyZWFrfSAod2hpY2ggYXJlIHN5bm9ueW1zKSB0YWtlIGEgdHJhcCBleGNlcHRpb24KLShhbmQgb25seSB3b3JrIGZvciBJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlIGxldmVsIDIgYW5kIGhpZ2hlcik7Ci1Ac2FtcHstLWJyZWFrfSBvciBAc2FtcHstLW5vLXRyYXB9IChhbHNvIHN5bm9ueW1zLCBhbmQgdGhlIGRlZmF1bHQpIHRha2UgYQotYnJlYWsgZXhjZXB0aW9uLgotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgTUNPUkUKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvcgotYW4gTUNvcmUgcHJvY2Vzc29yLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1qc3JpMmJzcgotQGl0ZW14IC1ub2pzcmkyYnNyCi1FbmFibGUgb3IgZGlzYWJsZSB0aGUgSlNSSSB0byBCU1IgdHJhbnNmb3JtYXRpb24uICBCeSBkZWZhdWx0IHRoaXMgaXMgZW5hYmxlZC4KLVRoZSBjb21tYW5kIGxpbmUgb3B0aW9uIEBzYW1wey1ub2pzcmkyYnNyfSBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIGl0LgotCi1AaXRlbSAtc2lmaWx0ZXIKLUBpdGVteCAtbm9zaWZpbHRlcgotRW5hYmxlIG9yIGRpc2FibGUgdGhlIHNpbGljb24gZmlsdGVyIGJlaGF2aW91ci4gIEJ5IGRlZmF1bHQgdGhpcyBpcyBkaXNhYmxlZC4KLVRoZSBkZWZhdWx0IGNhbiBiZSBvdmVyaWRkZW4gYnkgdGhlIEBzYW1wey1zaWZpbHRlcn0gY29tbWFuZCBsaW5lIG9wdGlvbi4KLQotQGl0ZW0gLXJlbGF4Ci1BbHRlciBqdW1wIGluc3RydWN0aW9ucyBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzLgotCi0KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQG1lbnUKLSogTWFudWFsOjogICAgICAgICAgICAgICAgICAgICAgU3RydWN0dXJlIG9mIHRoaXMgTWFudWFsCi0qIEdOVSBBc3NlbWJsZXI6OiAgICAgICAgICAgICAgIFRoZSBHTlUgQXNzZW1ibGVyCi0qIE9iamVjdCBGb3JtYXRzOjogICAgICAgICAgICAgIE9iamVjdCBGaWxlIEZvcm1hdHMKLSogQ29tbWFuZCBMaW5lOjogICAgICAgICAgICAgICAgQ29tbWFuZCBMaW5lCi0qIElucHV0IEZpbGVzOjogICAgICAgICAgICAgICAgIElucHV0IEZpbGVzCi0qIE9iamVjdDo6ICAgICAgICAgICAgICAgICAgICAgIE91dHB1dCAoT2JqZWN0KSBGaWxlCi0qIEVycm9yczo6ICAgICAgICAgICAgICAgICAgICAgIEVycm9yIGFuZCBXYXJuaW5nIE1lc3NhZ2VzCi1AZW5kIG1lbnUKLQotQG5vZGUgTWFudWFsCi1Ac2VjdGlvbiBTdHJ1Y3R1cmUgb2YgdGhpcyBNYW51YWwKLQotQGNpbmRleCBtYW51YWwsIHN0cnVjdHVyZSBhbmQgcHVycG9zZQotVGhpcyBtYW51YWwgaXMgaW50ZW5kZWQgdG8gZGVzY3JpYmUgd2hhdCB5b3UgbmVlZCB0byBrbm93IHRvIHVzZQotQHNje2dudX0gQGNvZGV7QHZhbHVle0FTfX0uICBXZSBjb3ZlciB0aGUgc3ludGF4IGV4cGVjdGVkIGluIHNvdXJjZSBmaWxlcywgaW5jbHVkaW5nCi1ub3RhdGlvbiBmb3Igc3ltYm9scywgY29uc3RhbnRzLCBhbmQgZXhwcmVzc2lvbnM7IHRoZSBkaXJlY3RpdmVzIHRoYXQKLUBjb2Rle0B2YWx1ZXtBU319IHVuZGVyc3RhbmRzOyBhbmQgb2YgY291cnNlIGhvdyB0byBpbnZva2UgQGNvZGV7QHZhbHVle0FTfX0uCi0KLUBpZmNsZWFyIEdFTkVSSUMKLVdlIGFsc28gY292ZXIgc3BlY2lhbCBmZWF0dXJlcyBpbiB0aGUgQHZhbHVle1RBUkdFVH0KLWNvbmZpZ3VyYXRpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0sIGluY2x1ZGluZyBhc3NlbWJsZXIgZGlyZWN0aXZlcy4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IEdFTkVSSUMKLVRoaXMgbWFudWFsIGFsc28gZGVzY3JpYmVzIHNvbWUgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGZlYXR1cmVzIG9mCi12YXJpb3VzIGZsYXZvcnMgb2YgdGhlIGFzc2VtYmxlci4KLUBlbmQgaWZzZXQKLQotQGNpbmRleCBtYWNoaW5lIGluc3RydWN0aW9ucyAobm90IGNvdmVyZWQpCi1PbiB0aGUgb3RoZXIgaGFuZCwgdGhpcyBtYW51YWwgaXMgQGVtcGh7bm90fSBpbnRlbmRlZCBhcyBhbiBpbnRyb2R1Y3Rpb24KLXRvIHByb2dyYW1taW5nIGluIGFzc2VtYmx5IGxhbmd1YWdlLS0tbGV0IGFsb25lIHByb2dyYW1taW5nIGluIGdlbmVyYWwhCi1JbiBhIHNpbWlsYXIgdmVpbiwgd2UgbWFrZSBubyBhdHRlbXB0IHRvIGludHJvZHVjZSB0aGUgbWFjaGluZQotYXJjaGl0ZWN0dXJlOyB3ZSBkbyBAZW1waHtub3R9IGRlc2NyaWJlIHRoZSBpbnN0cnVjdGlvbiBzZXQsIHN0YW5kYXJkCi1tbmVtb25pY3MsIHJlZ2lzdGVycyBvciBhZGRyZXNzaW5nIG1vZGVzIHRoYXQgYXJlIHN0YW5kYXJkIHRvIGEKLXBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlLgotQGlmc2V0IEdFTkVSSUMKLVlvdSBtYXkgd2FudCB0byBjb25zdWx0IHRoZSBtYW51ZmFjdHVyZXIncwotbWFjaGluZSBhcmNoaXRlY3R1cmUgbWFudWFsIGZvciB0aGlzIGluZm9ybWF0aW9uLgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEg4LzMwMAotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBIOC8zMDAgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZSBAY2l0ZXtIOC8zMDAKLVNlcmllcyBQcm9ncmFtbWluZyBNYW51YWx9IChIaXRhY2hpIEFERS0tNjAyLS0wMjUpLiAgRm9yIHRoZSBIOC8zMDBILAotc2VlIEBjaXRle0g4LzMwMEggU2VyaWVzIFByb2dyYW1taW5nIE1hbnVhbH0gKEhpdGFjaGkpLgotQGVuZCBpZnNldAotQGlmc2V0IEg4LzUwMAotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBIOC81MDAgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZSBAY2l0ZXtIOC81MDAKLVNlcmllcyBQcm9ncmFtbWluZyBNYW51YWx9IChIaXRhY2hpIE0yMVQwMDEpLgotQGVuZCBpZnNldAotQGlmc2V0IFNICi1Gb3IgaW5mb3JtYXRpb24gb24gdGhlIEhpdGFjaGkgU0ggbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7U0gtTWljcm9jb21wdXRlciBVc2VyJ3MgTWFudWFsfSAoSGl0YWNoaSBNaWNybyBTeXN0ZW1zLCBJbmMuKS4KLUBlbmQgaWZzZXQKLUBpZnNldCBaODAwMAotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBaODAwMCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlIEBjaXRle1o4MDAwIENQVSBUZWNobmljYWwgTWFudWFsfQotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBjIEkgdGhpbmsgdGhpcyBpcyBwcmVtYXR1cmUtLS1kb2NAY3lnbnVzLmNvbSwgMTdqYW4xOTkxCi1AaWdub3JlCi1UaHJvdWdob3V0IHRoaXMgbWFudWFsLCB3ZSBhc3N1bWUgdGhhdCB5b3UgYXJlIHJ1bm5pbmcgQGRmbntHTlV9LAotdGhlIHBvcnRhYmxlIG9wZXJhdGluZyBzeXN0ZW0gZnJvbSB0aGUgQGRmbntGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMufS4gIFRoaXMgcmVzdHJpY3RzIG91ciBhdHRlbnRpb24gdG8gY2VydGFpbiBraW5kcyBvZgotY29tcHV0ZXIgKGluIHBhcnRpY3VsYXIsIHRoZSBraW5kcyBvZiBjb21wdXRlcnMgdGhhdCBAc2N7Z251fSBjYW4gcnVuIG9uKTsKLW9uY2UgdGhpcyBhc3N1bXB0aW9uIGlzIGdyYW50ZWQgZXhhbXBsZXMgYW5kIGRlZmluaXRpb25zIG5lZWQgbGVzcwotcXVhbGlmaWNhdGlvbi4KLQotQGNvZGV7QHZhbHVle0FTfX0gaXMgcGFydCBvZiBhIHRlYW0gb2YgcHJvZ3JhbXMgdGhhdCB0dXJuIGEgaGlnaC1sZXZlbAotaHVtYW4tcmVhZGFibGUgc2VyaWVzIG9mIGluc3RydWN0aW9ucyBpbnRvIGEgbG93LWxldmVsCi1jb21wdXRlci1yZWFkYWJsZSBzZXJpZXMgb2YgaW5zdHJ1Y3Rpb25zLiAgRGlmZmVyZW50IHZlcnNpb25zIG9mCi1AY29kZXtAdmFsdWV7QVN9fSBhcmUgdXNlZCBmb3IgZGlmZmVyZW50IGtpbmRzIG9mIGNvbXB1dGVyLgotQGVuZCBpZ25vcmUKLQotQGMgVGhlcmUgdXNlZCB0byBiZSBhIHNlY3Rpb24gIlRlcm1pbm9sb2d5IiBoZXJlLCB3aGljaCBkZWZpbmVkCi1AYyAiY29udGVudHMiLCAiYnl0ZSIsICJ3b3JkIiwgYW5kICJsb25nIi4gIERlZmluaW5nICJ3b3JkIiB0byBhbnkKLUBjIHBhcnRpY3VsYXIgc2l6ZSBpcyBjb25mdXNpbmcgd2hlbiB0aGUgLndvcmQgZGlyZWN0aXZlIG1heSBnZW5lcmF0ZSAxNgotQGMgYml0cyBvbiBvbmUgbWFjaGluZSBhbmQgMzIgYml0cyBvbiBhbm90aGVyOyBpbiBnZW5lcmFsLCBmb3IgdGhlIHVzZXIKLUBjIHZlcnNpb24gb2YgdGhpcyBtYW51YWwsIG5vbmUgb2YgdGhlc2UgdGVybXMgc2VlbSBlc3NlbnRpYWwgdG8gZGVmaW5lLgotQGMgVGhleSB3ZXJlIHVzZWQgdmVyeSBsaXR0bGUgZXZlbiBpbiB0aGUgZm9ybWVyIGRyYWZ0IG9mIHRoZSBtYW51YWw7Ci1AYyB0aGlzIGRyYWZ0IG1ha2VzIGFuIGVmZm9ydCB0byBhdm9pZCB0aGVtIChleGNlcHQgaW4gbmFtZXMgb2YKLUBjIGRpcmVjdGl2ZXMpLgotCi1Abm9kZSBHTlUgQXNzZW1ibGVyCi1Ac2VjdGlvbiBUaGUgR05VIEFzc2VtYmxlcgotCi1Ac2N7Z251fSBAY29kZXthc30gaXMgcmVhbGx5IGEgZmFtaWx5IG9mIGFzc2VtYmxlcnMuCi1AaWZjbGVhciBHRU5FUklDCi1UaGlzIG1hbnVhbCBkZXNjcmliZXMgQGNvZGV7QHZhbHVle0FTfX0sIGEgbWVtYmVyIG9mIHRoYXQgZmFtaWx5IHdoaWNoIGlzCi1jb25maWd1cmVkIGZvciB0aGUgQHZhbHVle1RBUkdFVH0gYXJjaGl0ZWN0dXJlcy4KLUBlbmQgaWZjbGVhcgotSWYgeW91IHVzZSAob3IgaGF2ZSB1c2VkKSB0aGUgQHNje2dudX0gYXNzZW1ibGVyIG9uIG9uZSBhcmNoaXRlY3R1cmUsIHlvdQotc2hvdWxkIGZpbmQgYSBmYWlybHkgc2ltaWxhciBlbnZpcm9ubWVudCB3aGVuIHlvdSB1c2UgaXQgb24gYW5vdGhlcgotYXJjaGl0ZWN0dXJlLiAgRWFjaCB2ZXJzaW9uIGhhcyBtdWNoIGluIGNvbW1vbiB3aXRoIHRoZSBvdGhlcnMsCi1pbmNsdWRpbmcgb2JqZWN0IGZpbGUgZm9ybWF0cywgbW9zdCBhc3NlbWJsZXIgZGlyZWN0aXZlcyAob2Z0ZW4gY2FsbGVkCi1AZGZue3BzZXVkby1vcHN9KSBhbmQgYXNzZW1ibGVyIHN5bnRheC5AcmVmaWxsCi0KLUBjaW5kZXggcHVycG9zZSBvZiBAc2N7Z251fSBhc3NlbWJsZXIKLUBjb2Rle0B2YWx1ZXtBU319IGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBhc3NlbWJsZSB0aGUgb3V0cHV0IG9mIHRoZQotQHNje2dudX0gQyBjb21waWxlciBAY29kZXtAdmFsdWV7R0NDfX0gZm9yIHVzZSBieSB0aGUgbGlua2VyCi1AY29kZXtAdmFsdWV7TER9fS4gIE5ldmVydGhlbGVzcywgd2UndmUgdHJpZWQgdG8gbWFrZSBAY29kZXtAdmFsdWV7QVN9fQotYXNzZW1ibGUgY29ycmVjdGx5IGV2ZXJ5dGhpbmcgdGhhdCBvdGhlciBhc3NlbWJsZXJzIGZvciB0aGUgc2FtZQotbWFjaGluZSB3b3VsZCBhc3NlbWJsZS4KLUBpZnNldCBWQVgKLUFueSBleGNlcHRpb25zIGFyZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkgKEBweHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30pLgotQGVuZCBpZnNldAotQGlmc2V0IE02ODBYMAotQGMgVGhpcyByZW1hcmsgc2hvdWxkIGFwcGVhciBpbiBnZW5lcmljIHZlcnNpb24gb2YgbWFudWFsOyBhc3N1bXB0aW9uCi1AYyBoZXJlIGlzIHRoYXQgZ2VuZXJpYyB2ZXJzaW9uIHNldHMgTTY4MHgwLgotVGhpcyBkb2Vzbid0IG1lYW4gQGNvZGV7QHZhbHVle0FTfX0gYWx3YXlzIHVzZXMgdGhlIHNhbWUgc3ludGF4IGFzIGFub3RoZXIKLWFzc2VtYmxlciBmb3IgdGhlIHNhbWUgYXJjaGl0ZWN0dXJlOyBmb3IgZXhhbXBsZSwgd2Uga25vdyBvZiBzZXZlcmFsCi1pbmNvbXBhdGlibGUgdmVyc2lvbnMgb2YgNjgweDAgYXNzZW1ibHkgbGFuZ3VhZ2Ugc3ludGF4LgotQGVuZCBpZnNldAotCi1Vbmxpa2Ugb2xkZXIgYXNzZW1ibGVycywgQGNvZGV7QHZhbHVle0FTfX0gaXMgZGVzaWduZWQgdG8gYXNzZW1ibGUgYSBzb3VyY2UKLXByb2dyYW0gaW4gb25lIHBhc3Mgb2YgdGhlIHNvdXJjZSBmaWxlLiAgVGhpcyBoYXMgYSBzdWJ0bGUgaW1wYWN0IG9uIHRoZQotQGtiZHsub3JnfSBkaXJlY3RpdmUgKEBweHJlZntPcmcsLEBjb2Rley5vcmd9fSkuCi0KLUBub2RlIE9iamVjdCBGb3JtYXRzCi1Ac2VjdGlvbiBPYmplY3QgRmlsZSBGb3JtYXRzCi0KLUBjaW5kZXggb2JqZWN0IGZpbGUgZm9ybWF0Ci1UaGUgQHNje2dudX0gYXNzZW1ibGVyIGNhbiBiZSBjb25maWd1cmVkIHRvIHByb2R1Y2Ugc2V2ZXJhbCBhbHRlcm5hdGl2ZQotb2JqZWN0IGZpbGUgZm9ybWF0cy4gIEZvciB0aGUgbW9zdCBwYXJ0LCB0aGlzIGRvZXMgbm90IGFmZmVjdCBob3cgeW91Ci13cml0ZSBhc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtczsgYnV0IGRpcmVjdGl2ZXMgZm9yIGRlYnVnZ2luZyBzeW1ib2xzCi1hcmUgdHlwaWNhbGx5IGRpZmZlcmVudCBpbiBkaWZmZXJlbnQgZmlsZSBmb3JtYXRzLiAgQHhyZWZ7U3ltYm9sCi1BdHRyaWJ1dGVzLCxTeW1ib2wgQXR0cmlidXRlc30uCi1AaWZjbGVhciBHRU5FUklDCi1AaWZjbGVhciBNVUxUSS1PQkoKLU9uIHRoZSBAdmFsdWV7VEFSR0VUfSwgQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCB0byBwcm9kdWNlCi1AdmFsdWV7T0JKLU5BTUV9IGZvcm1hdCBvYmplY3QgZmlsZXMuCi1AZW5kIGlmY2xlYXIKLUBjIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGV4aGF1c3QgYWxsIGNvbmZpZ3MgdGhhdCBzZXQgTVVMVEktT0JKLCBpZGVhbGx5Ci1AaWZzZXQgQTI5SwotT24gdGhlIEB2YWx1ZXtUQVJHRVR9LCBAY29kZXtAdmFsdWV7QVN9fSBjYW4gYmUgY29uZmlndXJlZCB0byBwcm9kdWNlIGVpdGhlcgotQGNvZGV7YS5vdXR9IG9yIENPRkYgZm9ybWF0IG9iamVjdCBmaWxlcy4KLUBlbmQgaWZzZXQKLUBpZnNldCBJOTYwCi1PbiB0aGUgQHZhbHVle1RBUkdFVH0sIEBjb2Rle0B2YWx1ZXtBU319IGNhbiBiZSBjb25maWd1cmVkIHRvIHByb2R1Y2UgZWl0aGVyCi1AY29kZXtiLm91dH0gb3IgQ09GRiBmb3JtYXQgb2JqZWN0IGZpbGVzLgotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLU9uIHRoZSBAdmFsdWV7VEFSR0VUfSwgQGNvZGV7QHZhbHVle0FTfX0gY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBlaXRoZXIKLVNPTSBvciBFTEYgZm9ybWF0IG9iamVjdCBmaWxlcy4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBDb21tYW5kIExpbmUKLUBzZWN0aW9uIENvbW1hbmQgTGluZQotCi1AY2luZGV4IGNvbW1hbmQgbGluZSBjb252ZW50aW9ucwotQWZ0ZXIgdGhlIHByb2dyYW0gbmFtZSBAY29kZXtAdmFsdWV7QVN9fSwgdGhlIGNvbW1hbmQgbGluZSBtYXkgY29udGFpbgotb3B0aW9ucyBhbmQgZmlsZSBuYW1lcy4gIE9wdGlvbnMgbWF5IGFwcGVhciBpbiBhbnkgb3JkZXIsIGFuZCBtYXkgYmUKLWJlZm9yZSwgYWZ0ZXIsIG9yIGJldHdlZW4gZmlsZSBuYW1lcy4gIFRoZSBvcmRlciBvZiBmaWxlIG5hbWVzIGlzCi1zaWduaWZpY2FudC4KLQotQGNpbmRleCBzdGFuZGFyZCBpbnB1dCwgYXMgaW5wdXQgZmlsZQotQGtpbmRleCAtLQotQGZpbGV7LS19ICh0d28gaHlwaGVucykgYnkgaXRzZWxmIG5hbWVzIHRoZSBzdGFuZGFyZCBpbnB1dCBmaWxlCi1leHBsaWNpdGx5LCBhcyBvbmUgb2YgdGhlIGZpbGVzIGZvciBAY29kZXtAdmFsdWV7QVN9fSB0byBhc3NlbWJsZS4KLQotQGNpbmRleCBvcHRpb25zLCBjb21tYW5kIGxpbmUKLUV4Y2VwdCBmb3IgQHNhbXB7LS19IGFueSBjb21tYW5kIGxpbmUgYXJndW1lbnQgdGhhdCBiZWdpbnMgd2l0aCBhCi1oeXBoZW4gKEBzYW1wey19KSBpcyBhbiBvcHRpb24uICBFYWNoIG9wdGlvbiBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZgotQGNvZGV7QHZhbHVle0FTfX0uICBObyBvcHRpb24gY2hhbmdlcyB0aGUgd2F5IGFub3RoZXIgb3B0aW9uIHdvcmtzLiAgQW4KLW9wdGlvbiBpcyBhIEBzYW1wey19IGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGxldHRlcnM7IHRoZSBjYXNlIG9mCi10aGUgbGV0dGVyIGlzIGltcG9ydGFudC4gICBBbGwgb3B0aW9ucyBhcmUgb3B0aW9uYWwuCi0KLVNvbWUgb3B0aW9ucyBleHBlY3QgZXhhY3RseSBvbmUgZmlsZSBuYW1lIHRvIGZvbGxvdyB0aGVtLiAgVGhlIGZpbGUKLW5hbWUgbWF5IGVpdGhlciBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIG9wdGlvbidzIGxldHRlciAoY29tcGF0aWJsZQotd2l0aCBvbGRlciBhc3NlbWJsZXJzKSBvciBpdCBtYXkgYmUgdGhlIG5leHQgY29tbWFuZCBhcmd1bWVudCAoQHNje2dudX0KLXN0YW5kYXJkKS4gIFRoZXNlIHR3byBjb21tYW5kIGxpbmVzIGFyZSBlcXVpdmFsZW50OgotCi1Ac21hbGxleGFtcGxlCi1AdmFsdWV7QVN9IC1vIG15LW9iamVjdC1maWxlLm8gbXVtYmxlLnMKLUB2YWx1ZXtBU30gLW9teS1vYmplY3QtZmlsZS5vIG11bWJsZS5zCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBJbnB1dCBGaWxlcwotQHNlY3Rpb24gSW5wdXQgRmlsZXMKLQotQGNpbmRleCBpbnB1dAotQGNpbmRleCBzb3VyY2UgcHJvZ3JhbQotQGNpbmRleCBmaWxlcywgaW5wdXQKLVdlIHVzZSB0aGUgcGhyYXNlIEBkZm57c291cmNlIHByb2dyYW19LCBhYmJyZXZpYXRlZCBAZGZue3NvdXJjZX0sIHRvCi1kZXNjcmliZSB0aGUgcHJvZ3JhbSBpbnB1dCB0byBvbmUgcnVuIG9mIEBjb2Rle0B2YWx1ZXtBU319LiAgVGhlIHByb2dyYW0gbWF5Ci1iZSBpbiBvbmUgb3IgbW9yZSBmaWxlczsgaG93IHRoZSBzb3VyY2UgaXMgcGFydGl0aW9uZWQgaW50byBmaWxlcwotZG9lc24ndCBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlIHNvdXJjZS4KLQotQGMgSSBhZGRlZCAiY29uIiBwcmVmaXggdG8gImNhdGVuYXRpb24iIGp1c3QgdG8gcHJvdmUgSSBjYW4gb3ZlcmNvbWUgbXkKLUBjIEFQTCB0cmFpbmluZy4uLiAgIGRvY0BjeWdudXMuY29tCi1UaGUgc291cmNlIHByb2dyYW0gaXMgYSBjb25jYXRlbmF0aW9uIG9mIHRoZSB0ZXh0IGluIGFsbCB0aGUgZmlsZXMsIGluIHRoZQotb3JkZXIgc3BlY2lmaWVkLgotCi1FYWNoIHRpbWUgeW91IHJ1biBAY29kZXtAdmFsdWV7QVN9fSBpdCBhc3NlbWJsZXMgZXhhY3RseSBvbmUgc291cmNlCi1wcm9ncmFtLiAgVGhlIHNvdXJjZSBwcm9ncmFtIGlzIG1hZGUgdXAgb2Ygb25lIG9yIG1vcmUgZmlsZXMuCi0oVGhlIHN0YW5kYXJkIGlucHV0IGlzIGFsc28gYSBmaWxlLikKLQotWW91IGdpdmUgQGNvZGV7QHZhbHVle0FTfX0gYSBjb21tYW5kIGxpbmUgdGhhdCBoYXMgemVybyBvciBtb3JlIGlucHV0IGZpbGUKLW5hbWVzLiAgVGhlIGlucHV0IGZpbGVzIGFyZSByZWFkIChmcm9tIGxlZnQgZmlsZSBuYW1lIHRvIHJpZ2h0KS4gIEEKLWNvbW1hbmQgbGluZSBhcmd1bWVudCAoaW4gYW55IHBvc2l0aW9uKSB0aGF0IGhhcyBubyBzcGVjaWFsIG1lYW5pbmcKLWlzIHRha2VuIHRvIGJlIGFuIGlucHV0IGZpbGUgbmFtZS4KLQotSWYgeW91IGdpdmUgQGNvZGV7QHZhbHVle0FTfX0gbm8gZmlsZSBuYW1lcyBpdCBhdHRlbXB0cyB0byByZWFkIG9uZSBpbnB1dCBmaWxlCi1mcm9tIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzdGFuZGFyZCBpbnB1dCwgd2hpY2ggaXMgbm9ybWFsbHkgeW91ciB0ZXJtaW5hbC4gIFlvdQotbWF5IGhhdmUgdG8gdHlwZSBAa2V5e2N0bC1EfSB0byB0ZWxsIEBjb2Rle0B2YWx1ZXtBU319IHRoZXJlIGlzIG5vIG1vcmUgcHJvZ3JhbQotdG8gYXNzZW1ibGUuCi0KLVVzZSBAc2FtcHstLX0gaWYgeW91IG5lZWQgdG8gZXhwbGljaXRseSBuYW1lIHRoZSBzdGFuZGFyZCBpbnB1dCBmaWxlCi1pbiB5b3VyIGNvbW1hbmQgbGluZS4KLQotSWYgdGhlIHNvdXJjZSBpcyBlbXB0eSwgQGNvZGV7QHZhbHVle0FTfX0gcHJvZHVjZXMgYSBzbWFsbCwgZW1wdHkgb2JqZWN0Ci1maWxlLgotCi1Ac3ViaGVhZGluZyBGaWxlbmFtZXMgYW5kIExpbmUtbnVtYmVycwotCi1AY2luZGV4IGlucHV0IGZpbGUgbGluZW51bWJlcnMKLUBjaW5kZXggbGluZSBudW1iZXJzLCBpbiBpbnB1dCBmaWxlcwotVGhlcmUgYXJlIHR3byB3YXlzIG9mIGxvY2F0aW5nIGEgbGluZSBpbiB0aGUgaW5wdXQgZmlsZSAob3IgZmlsZXMpIGFuZAotZWl0aGVyIG1heSBiZSB1c2VkIGluIHJlcG9ydGluZyBlcnJvciBtZXNzYWdlcy4gIE9uZSB3YXkgcmVmZXJzIHRvIGEgbGluZQotbnVtYmVyIGluIGEgcGh5c2ljYWwgZmlsZTsgdGhlIG90aGVyIHJlZmVycyB0byBhIGxpbmUgbnVtYmVyIGluIGEKLWBgbG9naWNhbCcnIGZpbGUuICBAeHJlZntFcnJvcnMsICxFcnJvciBhbmQgV2FybmluZyBNZXNzYWdlc30uCi0KLUBkZm57UGh5c2ljYWwgZmlsZXN9IGFyZSB0aG9zZSBmaWxlcyBuYW1lZCBpbiB0aGUgY29tbWFuZCBsaW5lIGdpdmVuCi10byBAY29kZXtAdmFsdWV7QVN9fS4KLQotQGRmbntMb2dpY2FsIGZpbGVzfSBhcmUgc2ltcGx5IG5hbWVzIGRlY2xhcmVkIGV4cGxpY2l0bHkgYnkgYXNzZW1ibGVyCi1kaXJlY3RpdmVzOyB0aGV5IGJlYXIgbm8gcmVsYXRpb24gdG8gcGh5c2ljYWwgZmlsZXMuICBMb2dpY2FsIGZpbGUgbmFtZXMgaGVscAotZXJyb3IgbWVzc2FnZXMgcmVmbGVjdCB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUsIHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gc291cmNlCi1pcyBpdHNlbGYgc3ludGhlc2l6ZWQgZnJvbSBvdGhlciBmaWxlcy4gIEBjb2Rle0B2YWx1ZXtBU319IHVuZGVyc3RhbmRzIHRoZQotQHNhbXB7I30gZGlyZWN0aXZlcyBlbWl0dGVkIGJ5IHRoZSBAY29kZXtAdmFsdWV7R0NDfX0gcHJlcHJvY2Vzc29yLiAgU2VlIGFsc28KLUByZWZ7RmlsZSwsQGNvZGV7LmZpbGV9fS4KLQotQG5vZGUgT2JqZWN0Ci1Ac2VjdGlvbiBPdXRwdXQgKE9iamVjdCkgRmlsZQotCi1AY2luZGV4IG9iamVjdCBmaWxlCi1AY2luZGV4IG91dHB1dCBmaWxlCi1Aa2luZGV4IGEub3V0Ci1Aa2luZGV4IC5vCi1FdmVyeSB0aW1lIHlvdSBydW4gQGNvZGV7QHZhbHVle0FTfX0gaXQgcHJvZHVjZXMgYW4gb3V0cHV0IGZpbGUsIHdoaWNoIGlzCi15b3VyIGFzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW0gdHJhbnNsYXRlZCBpbnRvIG51bWJlcnMuICBUaGlzIGZpbGUKLWlzIHRoZSBvYmplY3QgZmlsZS4gIEl0cyBkZWZhdWx0IG5hbWUgaXMKLUBpZmNsZWFyIEJPVVQKLUBjb2Rle2Eub3V0fS4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IEJPVVQKLUBpZnNldCBHRU5FUklDCi1AY29kZXthLm91dH0sIG9yIAotQGVuZCBpZnNldAotQGNvZGV7Yi5vdXR9IHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCBmb3IgdGhlIEludGVsIDgwOTYwLgotQGVuZCBpZnNldAotWW91IGNhbiBnaXZlIGl0IGFub3RoZXIgbmFtZSBieSB1c2luZyB0aGUgQGNvZGV7LW99IG9wdGlvbi4gIENvbnZlbnRpb25hbGx5LAotb2JqZWN0IGZpbGUgbmFtZXMgZW5kIHdpdGggQGZpbGV7Lm99LiAgVGhlIGRlZmF1bHQgbmFtZSBpcyB1c2VkIGZvciBoaXN0b3JpY2FsCi1yZWFzb25zOiBvbGRlciBhc3NlbWJsZXJzIHdlcmUgY2FwYWJsZSBvZiBhc3NlbWJsaW5nIHNlbGYtY29udGFpbmVkIHByb2dyYW1zCi1kaXJlY3RseSBpbnRvIGEgcnVubmFibGUgcHJvZ3JhbS4gIChGb3Igc29tZSBmb3JtYXRzLCB0aGlzIGlzbid0IGN1cnJlbnRseQotcG9zc2libGUsIGJ1dCBpdCBjYW4gYmUgZG9uZSBmb3IgdGhlIEBjb2Rle2Eub3V0fSBmb3JtYXQuKQotCi1AY2luZGV4IGxpbmtlcgotQGtpbmRleCBsZAotVGhlIG9iamVjdCBmaWxlIGlzIG1lYW50IGZvciBpbnB1dCB0byB0aGUgbGlua2VyIEBjb2Rle0B2YWx1ZXtMRH19LiAgSXQgY29udGFpbnMKLWFzc2VtYmxlZCBwcm9ncmFtIGNvZGUsIGluZm9ybWF0aW9uIHRvIGhlbHAgQGNvZGV7QHZhbHVle0xEfX0gaW50ZWdyYXRlCi10aGUgYXNzZW1ibGVkIHByb2dyYW0gaW50byBhIHJ1bm5hYmxlIGZpbGUsIGFuZCAob3B0aW9uYWxseSkgc3ltYm9saWMKLWluZm9ybWF0aW9uIGZvciB0aGUgZGVidWdnZXIuCi0KLUBjIGxpbmsgYWJvdmUgdG8gc29tZSBpbmZvIGZpbGUocykgbGlrZSB0aGUgZGVzY3JpcHRpb24gb2YgYS5vdXQuCi1AYyBkb24ndCBmb3JnZXQgdG8gZGVzY3JpYmUgQHNje2dudX0gaW5mbyBhcyB3ZWxsIGFzIFVuaXggbG9zc2FnZS4KLQotQG5vZGUgRXJyb3JzCi1Ac2VjdGlvbiBFcnJvciBhbmQgV2FybmluZyBNZXNzYWdlcwotCi1AY2luZGV4IGVycm9yIG1lc3NzYWdlcwotQGNpbmRleCB3YXJuaW5nIG1lc3NhZ2VzCi1AY2luZGV4IG1lc3NhZ2VzIGZyb20gYXNzZW1ibGVyCi1AY29kZXtAdmFsdWV7QVN9fSBtYXkgd3JpdGUgd2FybmluZ3MgYW5kIGVycm9yIG1lc3NhZ2VzIHRvIHRoZSBzdGFuZGFyZCBlcnJvcgotZmlsZSAodXN1YWxseSB5b3VyIHRlcm1pbmFsKS4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gd2hlbiAgYSBjb21waWxlcgotcnVucyBAY29kZXtAdmFsdWV7QVN9fSBhdXRvbWF0aWNhbGx5LiAgV2FybmluZ3MgcmVwb3J0IGFuIGFzc3VtcHRpb24gbWFkZSBzbwotdGhhdCBAY29kZXtAdmFsdWV7QVN9fSBjb3VsZCBrZWVwIGFzc2VtYmxpbmcgYSBmbGF3ZWQgcHJvZ3JhbTsgZXJyb3JzIHJlcG9ydCBhCi1ncmF2ZSBwcm9ibGVtIHRoYXQgc3RvcHMgdGhlIGFzc2VtYmx5LgotCi1AY2luZGV4IGZvcm1hdCBvZiB3YXJuaW5nIG1lc3NhZ2VzCi1XYXJuaW5nIG1lc3NhZ2VzIGhhdmUgdGhlIGZvcm1hdAotCi1Ac21hbGxleGFtcGxlCi1maWxlX25hbWU6QGJ7Tk5OfTpXYXJuaW5nIE1lc3NhZ2UgVGV4dAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1AY2luZGV4IGxpbmUgbnVtYmVycywgaW4gd2FybmluZ3MvZXJyb3JzCi0od2hlcmUgQGJ7Tk5OfSBpcyBhIGxpbmUgbnVtYmVyKS4gIElmIGEgbG9naWNhbCBmaWxlIG5hbWUgaGFzIGJlZW4gZ2l2ZW4KLShAcHhyZWZ7RmlsZSwsQGNvZGV7LmZpbGV9fSkgaXQgaXMgdXNlZCBmb3IgdGhlIGZpbGVuYW1lLCBvdGhlcndpc2UgdGhlIG5hbWUgb2YKLXRoZSBjdXJyZW50IGlucHV0IGZpbGUgaXMgdXNlZC4gIElmIGEgbG9naWNhbCBsaW5lIG51bWJlciB3YXMgZ2l2ZW4KLUBpZnNldCBHRU5FUklDCi0oQHB4cmVme0xpbmUsLEBjb2Rley5saW5lfX0pCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZjbGVhciBBMjlLCi0oQHB4cmVme0xpbmUsLEBjb2Rley5saW5lfX0pCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBBMjlLCi0oQHB4cmVme0xuLCxAY29kZXsubG59fSkKLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotdGhlbiBpdCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIHByaW50ZWQsCi1vdGhlcndpc2UgdGhlIGFjdHVhbCBsaW5lIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIGlzIHByaW50ZWQuICBUaGUKLW1lc3NhZ2UgdGV4dCBpcyBpbnRlbmRlZCB0byBiZSBzZWxmIGV4cGxhbmF0b3J5IChpbiB0aGUgZ3JhbmQgVW5peAotdHJhZGl0aW9uKS4KLQotQGNpbmRleCBmb3JtYXQgb2YgZXJyb3IgbWVzc2FnZXMKLUVycm9yIG1lc3NhZ2VzIGhhdmUgdGhlIGZvcm1hdAotQHNtYWxsZXhhbXBsZQotZmlsZV9uYW1lOkBie05OTn06RkFUQUw6RXJyb3IgTWVzc2FnZSBUZXh0Ci1AZW5kIHNtYWxsZXhhbXBsZQotVGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgYXJlIGRlcml2ZWQgYXMgZm9yIHdhcm5pbmcKLW1lc3NhZ2VzLiAgVGhlIGFjdHVhbCBtZXNzYWdlIHRleHQgbWF5IGJlIHJhdGhlciBsZXNzIGV4cGxhbmF0b3J5Ci1iZWNhdXNlIG1hbnkgb2YgdGhlbSBhcmVuJ3Qgc3VwcG9zZWQgdG8gaGFwcGVuLgotCi1Abm9kZSBJbnZva2luZwotQGNoYXB0ZXIgQ29tbWFuZC1MaW5lIE9wdGlvbnMKLQotQGNpbmRleCBvcHRpb25zLCBhbGwgdmVyc2lvbnMgb2YgYXNzZW1ibGVyCi1UaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIGNvbW1hbmQtbGluZSBvcHRpb25zIGF2YWlsYWJsZSBpbiBAZW1waHthbGx9Ci12ZXJzaW9ucyBvZiB0aGUgQHNje2dudX0gYXNzZW1ibGVyOyBAcHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LCBmb3Igb3B0aW9ucyBzcGVjaWZpYwotQGlmY2xlYXIgR0VORVJJQwotdG8gdGhlIEB2YWx1ZXtUQVJHRVR9LgotQGVuZCBpZmNsZWFyCi1AaWZzZXQgR0VORVJJQwotdG8gcGFydGljdWxhciBtYWNoaW5lIGFyY2hpdGVjdHVyZXMuCi1AZW5kIGlmc2V0Ci0KLUlmIHlvdSBhcmUgaW52b2tpbmcgQGNvZGV7QHZhbHVle0FTfX0gdmlhIHRoZSBAc2N7Z251fSBDIGNvbXBpbGVyICh2ZXJzaW9uIDIpLAoteW91IGNhbiB1c2UgdGhlIEBzYW1wey1XYX0gb3B0aW9uIHRvIHBhc3MgYXJndW1lbnRzIHRocm91Z2ggdG8gdGhlIGFzc2VtYmxlci4KLVRoZSBhc3NlbWJsZXIgYXJndW1lbnRzIG11c3QgYmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciAoYW5kIHRoZSBAc2FtcHstV2F9KQotYnkgY29tbWFzLiAgRm9yIGV4YW1wbGU6Ci0KLUBzbWFsbGV4YW1wbGUKLWdjYyAtYyAtZyAtTyAtV2EsLWFsaCwtTCBmaWxlLmMKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotVGhpcyBwYXNzZXMgdHdvIG9wdGlvbnMgdG8gdGhlIGFzc2VtYmxlcjogQHNhbXB7LWFsaH0gKGVtaXQgYSBsaXN0aW5nIHRvCi1zdGFuZGFyZCBvdXRwdXQgd2l0aCB3aXRoIGhpZ2gtbGV2ZWwgYW5kIGFzc2VtYmx5IHNvdXJjZSkgYW5kIEBzYW1wey1MfSAocmV0YWluCi1sb2NhbCBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGUpLgotCi1Vc3VhbGx5IHlvdSBkbyBub3QgbmVlZCB0byB1c2UgdGhpcyBAc2FtcHstV2F9IG1lY2hhbmlzbSwgc2luY2UgbWFueSBjb21waWxlcgotY29tbWFuZC1saW5lIG9wdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgcGFzc2VkIHRvIHRoZSBhc3NlbWJsZXIgYnkgdGhlIGNvbXBpbGVyLgotKFlvdSBjYW4gY2FsbCB0aGUgQHNje2dudX0gY29tcGlsZXIgZHJpdmVyIHdpdGggdGhlIEBzYW1wey12fSBvcHRpb24gdG8gc2VlCi1wcmVjaXNlbHkgd2hhdCBvcHRpb25zIGl0IHBhc3NlcyB0byBlYWNoIGNvbXBpbGF0aW9uIHBhc3MsIGluY2x1ZGluZyB0aGUKLWFzc2VtYmxlci4pCi0KLUBtZW51Ci0qIGE6OiAgICAgICAgICAgICAtYVtjZGhsbnNdIGVuYWJsZSBsaXN0aW5ncwotKiBEOjogICAgICAgICAgICAgLUQgZm9yIGNvbXBhdGliaWxpdHkKLSogZjo6ICAgICAgICAgICAgIC1mIHRvIHdvcmsgZmFzdGVyCi0qIEk6OiAgICAgICAgICAgICAtSSBmb3IgLmluY2x1ZGUgc2VhcmNoIHBhdGgKLUBpZmNsZWFyIERJRkYtVEJMLUtMVUdFCi0qIEs6OiAgICAgICAgICAgICAtSyBmb3IgY29tcGF0aWJpbGl0eQotQGVuZCBpZmNsZWFyCi1AaWZzZXQgRElGRi1UQkwtS0xVR0UKLSogSzo6ICAgICAgICAgICAgIC1LIGZvciBkaWZmZXJlbmNlIHRhYmxlcwotQGVuZCBpZnNldAotCi0qIEw6OiAgICAgICAgICAgICAtTCB0byByZXRhaW4gbG9jYWwgbGFiZWxzCi0qIE06OgkJICAtTSBvciAtLW1yaSB0byBhc3NlbWJsZSBpbiBNUkkgY29tcGF0aWJpbGl0eSBtb2RlCi0qIE1EOjogICAgICAgICAgICAtLU1EIGZvciBkZXBlbmRlbmN5IHRyYWNraW5nCi0qIG86OiAgICAgICAgICAgICAtbyB0byBuYW1lIHRoZSBvYmplY3QgZmlsZQotKiBSOjogICAgICAgICAgICAgLVIgdG8gam9pbiBkYXRhIGFuZCB0ZXh0IHNlY3Rpb25zCi0qIHN0YXRpc3RpY3M6OiAgICAtLXN0YXRpc3RpY3MgdG8gc2VlIHN0YXRpc3RpY3MgYWJvdXQgYXNzZW1ibHkKLSogdHJhZGl0aW9uYWwtZm9ybWF0OjogLS10cmFkaXRpb25hbC1mb3JtYXQgZm9yIGNvbXBhdGlibGUgb3V0cHV0Ci0qIHY6OiAgICAgICAgICAgICAtdiB0byBhbm5vdW5jZSB2ZXJzaW9uCi0qIFc6OiAgICAgICAgICAgICAtVyB0byBzdXBwcmVzcyB3YXJuaW5ncwotKiBaOjogICAgICAgICAgICAgLVogdG8gbWFrZSBvYmplY3QgZmlsZSBldmVuIGFmdGVyIGVycm9ycwotQGVuZCBtZW51Ci0KLUBub2RlIGEKLUBzZWN0aW9uIEVuYWJsZSBMaXN0aW5nczogQGNvZGV7LWFbY2RobG5zXX0KLQotQGtpbmRleCAtYQotQGtpbmRleCAtYWMKLUBraW5kZXggLWFkCi1Aa2luZGV4IC1haAotQGtpbmRleCAtYWwKLUBraW5kZXggLWFuCi1Aa2luZGV4IC1hcwotQGNpbmRleCBsaXN0aW5ncywgZW5hYmxpbmcKLUBjaW5kZXggYXNzZW1ibHkgbGlzdGluZ3MsIGVuYWJsaW5nCi0KLVRoZXNlIG9wdGlvbnMgZW5hYmxlIGxpc3Rpbmcgb3V0cHV0IGZyb20gdGhlIGFzc2VtYmxlci4gIEJ5IGl0c2VsZiwKLUBzYW1wey1hfSByZXF1ZXN0cyBoaWdoLWxldmVsLCBhc3NlbWJseSwgYW5kIHN5bWJvbHMgbGlzdGluZy4KLVlvdSBjYW4gdXNlIG90aGVyIGxldHRlcnMgdG8gc2VsZWN0IHNwZWNpZmljIG9wdGlvbnMgZm9yIHRoZSBsaXN0OgotQHNhbXB7LWFofSByZXF1ZXN0cyBhIGhpZ2gtbGV2ZWwgbGFuZ3VhZ2UgbGlzdGluZywKLUBzYW1wey1hbH0gcmVxdWVzdHMgYW4gb3V0cHV0LXByb2dyYW0gYXNzZW1ibHkgbGlzdGluZywgYW5kCi1Ac2FtcHstYXN9IHJlcXVlc3RzIGEgc3ltYm9sIHRhYmxlIGxpc3RpbmcuCi1IaWdoLWxldmVsIGxpc3RpbmdzIHJlcXVpcmUgdGhhdCBhIGNvbXBpbGVyIGRlYnVnZ2luZyBvcHRpb24gbGlrZQotQHNhbXB7LWd9IGJlIHVzZWQsIGFuZCB0aGF0IGFzc2VtYmx5IGxpc3RpbmdzIChAc2FtcHstYWx9KSBiZSByZXF1ZXN0ZWQKLWFsc28uCi0KLVVzZSB0aGUgQHNhbXB7LWFjfSBvcHRpb24gdG8gb21pdCBmYWxzZSBjb25kaXRpb25hbHMgZnJvbSBhIGxpc3RpbmcuICBBbnkgbGluZXMKLXdoaWNoIGFyZSBub3QgYXNzZW1ibGVkIGJlY2F1c2Ugb2YgYSBmYWxzZSBAY29kZXsuaWZ9IChvciBAY29kZXsuaWZkZWZ9LCBvciBhbnkKLW90aGVyIGNvbmRpdGlvbmFsKSwgb3IgYSB0cnVlIEBjb2Rley5pZn0gZm9sbG93ZWQgYnkgYW4gQGNvZGV7LmVsc2V9LCB3aWxsIGJlCi1vbWl0dGVkIGZyb20gdGhlIGxpc3RpbmcuCi0KLVVzZSB0aGUgQHNhbXB7LWFkfSBvcHRpb24gdG8gb21pdCBkZWJ1Z2dpbmcgZGlyZWN0aXZlcyBmcm9tIHRoZQotbGlzdGluZy4KLQotT25jZSB5b3UgaGF2ZSBzcGVjaWZpZWQgb25lIG9mIHRoZXNlIG9wdGlvbnMsIHlvdSBjYW4gZnVydGhlciBjb250cm9sCi1saXN0aW5nIG91dHB1dCBhbmQgaXRzIGFwcGVhcmFuY2UgdXNpbmcgdGhlIGRpcmVjdGl2ZXMgQGNvZGV7Lmxpc3R9LAotQGNvZGV7Lm5vbGlzdH0sIEBjb2Rley5wc2l6ZX0sIEBjb2Rley5lamVjdH0sIEBjb2Rley50aXRsZX0sIGFuZAotQGNvZGV7LnNidHRsfS4KLVRoZSBAc2FtcHstYW59IG9wdGlvbiB0dXJucyBvZmYgYWxsIGZvcm1zIHByb2Nlc3NpbmcuCi1JZiB5b3UgZG8gbm90IHJlcXVlc3QgbGlzdGluZyBvdXRwdXQgd2l0aCBvbmUgb2YgdGhlIEBzYW1wey1hfSBvcHRpb25zLCB0aGUKLWxpc3RpbmctY29udHJvbCBkaXJlY3RpdmVzIGhhdmUgbm8gZWZmZWN0LgotCi1UaGUgbGV0dGVycyBhZnRlciBAc2FtcHstYX0gbWF5IGJlIGNvbWJpbmVkIGludG8gb25lIG9wdGlvbiwKLUBlbXBoe2UuZy59LCBAc2FtcHstYWxufS4KLQotQG5vZGUgRAotQHNlY3Rpb24gQGNvZGV7LUR9Ci0KLUBraW5kZXggLUQKLVRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgd2hhdHNvZXZlciwgYnV0IGl0IGlzIGFjY2VwdGVkIHRvIG1ha2UgaXQgbW9yZQotbGlrZWx5IHRoYXQgc2NyaXB0cyB3cml0dGVuIGZvciBvdGhlciBhc3NlbWJsZXJzIGFsc28gd29yayB3aXRoCi1AY29kZXtAdmFsdWV7QVN9fS4KLQotQG5vZGUgZgotQHNlY3Rpb24gV29yayBGYXN0ZXI6IEBjb2Rley1mfQotCi1Aa2luZGV4IC1mCi1AY2luZGV4IHRydXN0ZWQgY29tcGlsZXIKLUBjaW5kZXggZmFzdGVyIHByb2Nlc3NpbmcgKEBjb2Rley1mfSkKLUBzYW1wey1mfSBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gYXNzZW1ibGluZyBwcm9ncmFtcyB3cml0dGVuIGJ5IGEKLSh0cnVzdGVkKSBjb21waWxlci4gIEBzYW1wey1mfSBzdG9wcyB0aGUgYXNzZW1ibGVyIGZyb20gZG9pbmcgd2hpdGVzcGFjZQotYW5kIGNvbW1lbnQgcHJlcHJvY2Vzc2luZyBvbgotdGhlIGlucHV0IGZpbGUocykgYmVmb3JlIGFzc2VtYmxpbmcgdGhlbS4gIEB4cmVme1ByZXByb2Nlc3NpbmcsCi0sUHJlcHJvY2Vzc2luZ30uCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBpZiB5b3UgdXNlIEBzYW1wey1mfSB3aGVuIHRoZSBmaWxlcyBhY3R1YWxseSBuZWVkIHRvIGJlCi1wcmVwcm9jZXNzZWQgKGlmIHRoZXkgY29udGFpbiBjb21tZW50cywgZm9yIGV4YW1wbGUpLCBAY29kZXtAdmFsdWV7QVN9fSBkb2VzCi1ub3Qgd29yayBjb3JyZWN0bHkuCi1AZW5kIHF1b3RhdGlvbgotCi1Abm9kZSBJCi1Ac2VjdGlvbiBAY29kZXsuaW5jbHVkZX0gc2VhcmNoIHBhdGg6IEBjb2Rley1JfSBAdmFye3BhdGh9Ci0KLUBraW5kZXggLUkgQHZhcntwYXRofQotQGNpbmRleCBwYXRocyBmb3IgQGNvZGV7LmluY2x1ZGV9Ci1AY2luZGV4IHNlYXJjaCBwYXRoIGZvciBAY29kZXsuaW5jbHVkZX0KLUBjaW5kZXggQGNvZGV7aW5jbHVkZX0gZGlyZWN0aXZlIHNlYXJjaCBwYXRoCi1Vc2UgdGhpcyBvcHRpb24gdG8gYWRkIGEgQHZhcntwYXRofSB0byB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcwotQGNvZGV7QHZhbHVle0FTfX0gc2VhcmNoZXMgZm9yIGZpbGVzIHNwZWNpZmllZCBpbiBAY29kZXsuaW5jbHVkZX0KLWRpcmVjdGl2ZXMgKEBweHJlZntJbmNsdWRlLCxAY29kZXsuaW5jbHVkZX19KS4gIFlvdSBtYXkgdXNlIEBjb2Rley1JfSBhcwotbWFueSB0aW1lcyBhcyBuZWNlc3NhcnkgdG8gaW5jbHVkZSBhIHZhcmlldHkgb2YgcGF0aHMuICBUaGUgY3VycmVudAotd29ya2luZyBkaXJlY3RvcnkgaXMgYWx3YXlzIHNlYXJjaGVkIGZpcnN0OyBhZnRlciB0aGF0LCBAY29kZXtAdmFsdWV7QVN9fQotc2VhcmNoZXMgYW55IEBzYW1wey1JfSBkaXJlY3RvcmllcyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IHdlcmUKLXNwZWNpZmllZCAobGVmdCB0byByaWdodCkgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotQG5vZGUgSwotQHNlY3Rpb24gRGlmZmVyZW5jZSBUYWJsZXM6IEBjb2Rley1LfQotCi1Aa2luZGV4IC1LCi1AaWZjbGVhciBESUZGLVRCTC1LTFVHRQotT24gdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseSwgdGhpcyBvcHRpb24gaXMgYWxsb3dlZCwgYnV0IGhhcyBubyBlZmZlY3QuICBJdCBpcwotcGVybWl0dGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEBzY3tnbnV9IGFzc2VtYmxlciBvbiBvdGhlciBwbGF0Zm9ybXMsCi13aGVyZSBpdCBjYW4gYmUgdXNlZCB0byB3YXJuIHdoZW4gdGhlIGFzc2VtYmxlciBhbHRlcnMgdGhlIG1hY2hpbmUgY29kZQotZ2VuZXJhdGVkIGZvciBAc2FtcHsud29yZH0gZGlyZWN0aXZlcyBpbiBkaWZmZXJlbmNlIHRhYmxlcy4gIFRoZSBAdmFsdWV7VEFSR0VUfQotZmFtaWx5IGRvZXMgbm90IGhhdmUgdGhlIGFkZHJlc3NpbmcgbGltaXRhdGlvbnMgdGhhdCBzb21ldGltZXMgbGVhZCB0byB0aGlzCi1hbHRlcmF0aW9uIG9uIG90aGVyIHBsYXRmb3Jtcy4KLUBlbmQgaWZjbGVhcgotCi1AaWZzZXQgRElGRi1UQkwtS0xVR0UKLUBjaW5kZXggZGlmZmVyZW5jZSB0YWJsZXMsIHdhcm5pbmcKLUBjaW5kZXggd2FybmluZyBmb3IgYWx0ZXJlZCBkaWZmZXJlbmNlIHRhYmxlcwotQGNvZGV7QHZhbHVle0FTfX0gc29tZXRpbWVzIGFsdGVycyB0aGUgY29kZSBlbWl0dGVkIGZvciBkaXJlY3RpdmVzIG9mIHRoZSBmb3JtCi1Ac2FtcHsud29yZCBAdmFye3N5bTF9LUB2YXJ7c3ltMn19OyBAcHhyZWZ7V29yZCwsQGNvZGV7LndvcmR9fS4KLVlvdSBjYW4gdXNlIHRoZSBAc2FtcHstS30gb3B0aW9uIGlmIHlvdSB3YW50IGEgd2FybmluZyBpc3N1ZWQgd2hlbiB0aGlzCi1pcyBkb25lLgotQGVuZCBpZnNldAotCi1Abm9kZSBMCi1Ac2VjdGlvbiBJbmNsdWRlIExvY2FsIExhYmVsczogQGNvZGV7LUx9Ci0KLUBraW5kZXggLUwKLUBjaW5kZXggbG9jYWwgbGFiZWxzLCByZXRhaW5pbmcgaW4gb3V0cHV0Ci1MYWJlbHMgYmVnaW5uaW5nIHdpdGggQHNhbXB7TH0gKHVwcGVyIGNhc2Ugb25seSkgYXJlIGNhbGxlZCBAZGZue2xvY2FsCi1sYWJlbHN9LiBAeHJlZntTeW1ib2wgTmFtZXN9LiAgTm9ybWFsbHkgeW91IGRvIG5vdCBzZWUgc3VjaCBsYWJlbHMgd2hlbgotZGVidWdnaW5nLCBiZWNhdXNlIHRoZXkgYXJlIGludGVuZGVkIGZvciB0aGUgdXNlIG9mIHByb2dyYW1zIChsaWtlCi1jb21waWxlcnMpIHRoYXQgY29tcG9zZSBhc3NlbWJsZXIgcHJvZ3JhbXMsIG5vdCBmb3IgeW91ciBub3RpY2UuCi1Ob3JtYWxseSBib3RoIEBjb2Rle0B2YWx1ZXtBU319IGFuZCBAY29kZXtAdmFsdWV7TER9fSBkaXNjYXJkIHN1Y2ggbGFiZWxzLCBzbyB5b3UgZG8gbm90Ci1ub3JtYWxseSBkZWJ1ZyB3aXRoIHRoZW0uCi0KLVRoaXMgb3B0aW9uIHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvIHJldGFpbiB0aG9zZSBAc2FtcHtMQGRvdHN7fX0gc3ltYm9scwotaW4gdGhlIG9iamVjdCBmaWxlLiAgVXN1YWxseSBpZiB5b3UgZG8gdGhpcyB5b3UgYWxzbyB0ZWxsIHRoZSBsaW5rZXIKLUBjb2Rle0B2YWx1ZXtMRH19IHRvIHByZXNlcnZlIHN5bWJvbHMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBAc2FtcHtMfS4KLQotQnkgZGVmYXVsdCwgYSBsb2NhbCBsYWJlbCBpcyBhbnkgbGFiZWwgYmVnaW5uaW5nIHdpdGggQHNhbXB7TH0sIGJ1dCBlYWNoCi10YXJnZXQgaXMgYWxsb3dlZCB0byByZWRlZmluZSB0aGUgbG9jYWwgbGFiZWwgcHJlZml4LgotQGlmc2V0IEhQUEEKLU9uIHRoZSBIUFBBIGxvY2FsIGxhYmVscyBiZWdpbiB3aXRoIEBzYW1we0wkfS4KLUBlbmQgaWZzZXQKLUBpZnNldCBBUk0KLUBzYW1wezt9IGZvciB0aGUgQVJNIGZhbWlseTsKLUBlbmQgaWZzZXQKLQotQG5vZGUgTQotQHNlY3Rpb24gQXNzZW1ibGUgaW4gTVJJIENvbXBhdGliaWxpdHkgTW9kZTogQGNvZGV7LU19Ci0KLUBraW5kZXggLU0KLUBjaW5kZXggTVJJIGNvbXBhdGliaWxpdHkgbW9kZQotVGhlIEBjb2Rley1NfSBvciBAY29kZXstLW1yaX0gb3B0aW9uIHNlbGVjdHMgTVJJIGNvbXBhdGliaWxpdHkgbW9kZS4gIFRoaXMKLWNoYW5nZXMgdGhlIHN5bnRheCBhbmQgcHNldWRvLW9wIGhhbmRsaW5nIG9mIEBjb2Rle0B2YWx1ZXtBU319IHRvIG1ha2UgaXQKLWNvbXBhdGlibGUgd2l0aCB0aGUgQGNvZGV7QVNNNjhLfSBvciB0aGUgQGNvZGV7QVNNOTYwfSAoZGVwZW5kaW5nIHVwb24gdGhlCi1jb25maWd1cmVkIHRhcmdldCkgYXNzZW1ibGVyIGZyb20gTWljcm90ZWMgUmVzZWFyY2guICBUaGUgZXhhY3QgbmF0dXJlIG9mIHRoZQotTVJJIHN5bnRheCB3aWxsIG5vdCBiZSBkb2N1bWVudGVkIGhlcmU7IHNlZSB0aGUgTVJJIG1hbnVhbHMgZm9yIG1vcmUKLWluZm9ybWF0aW9uLiAgTm90ZSBpbiBwYXJ0aWN1bGFyIHRoYXQgdGhlIGhhbmRsaW5nIG9mIG1hY3JvcyBhbmQgbWFjcm8KLWFyZ3VtZW50cyBpcyBzb21ld2hhdCBkaWZmZXJlbnQuICBUaGUgcHVycG9zZSBvZiB0aGlzIG9wdGlvbiBpcyB0byBwZXJtaXQKLWFzc2VtYmxpbmcgZXhpc3RpbmcgTVJJIGFzc2VtYmxlciBjb2RlIHVzaW5nIEBjb2Rle0B2YWx1ZXtBU319LgotCi1UaGUgTVJJIGNvbXBhdGliaWxpdHkgaXMgbm90IGNvbXBsZXRlLiAgQ2VydGFpbiBvcGVyYXRpb25zIG9mIHRoZSBNUkkgYXNzZW1ibGVyCi1kZXBlbmQgdXBvbiBpdHMgb2JqZWN0IGZpbGUgZm9ybWF0LCBhbmQgY2FuIG5vdCBiZSBzdXBwb3J0ZWQgdXNpbmcgb3RoZXIgb2JqZWN0Ci1maWxlIGZvcm1hdHMuICBTdXBwb3J0aW5nIHRoZXNlIHdvdWxkIHJlcXVpcmUgZW5oYW5jaW5nIGVhY2ggb2JqZWN0IGZpbGUgZm9ybWF0Ci1pbmRpdmlkdWFsbHkuICBUaGVzZSBhcmU6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtIGdsb2JhbCBzeW1ib2xzIGluIGNvbW1vbiBzZWN0aW9uCi0KLVRoZSBtNjhrIE1SSSBhc3NlbWJsZXIgc3VwcG9ydHMgY29tbW9uIHNlY3Rpb25zIHdoaWNoIGFyZSBtZXJnZWQgYnkgdGhlIGxpbmtlci4KLU90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMgZG8gbm90IHN1cHBvcnQgdGhpcy4gIEBjb2Rle0B2YWx1ZXtBU319IGhhbmRsZXMKLWNvbW1vbiBzZWN0aW9ucyBieSB0cmVhdGluZyB0aGVtIGFzIGEgc2luZ2xlIGNvbW1vbiBzeW1ib2wuICBJdCBwZXJtaXRzIGxvY2FsCi1zeW1ib2xzIHRvIGJlIGRlZmluZWQgd2l0aGluIGEgY29tbW9uIHNlY3Rpb24sIGJ1dCBpdCBjYW4gbm90IHN1cHBvcnQgZ2xvYmFsCi1zeW1ib2xzLCBzaW5jZSBpdCBoYXMgbm8gd2F5IHRvIGRlc2NyaWJlIHRoZW0uCi0KLUBpdGVtIGNvbXBsZXggcmVsb2NhdGlvbnMKLQotVGhlIE1SSSBhc3NlbWJsZXJzIHN1cHBvcnQgcmVsb2NhdGlvbnMgYWdhaW5zdCBhIG5lZ2F0ZWQgc2VjdGlvbiBhZGRyZXNzLCBhbmQKLXJlbG9jYXRpb25zIHdoaWNoIGNvbWJpbmUgdGhlIHN0YXJ0IGFkZHJlc3NlcyBvZiB0d28gb3IgbW9yZSBzZWN0aW9ucy4gIFRoZXNlCi1hcmUgbm90IHN1cHBvcnQgYnkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotQGl0ZW0gQGNvZGV7RU5EfSBwc2V1ZG8tb3Agc3BlY2lmeWluZyBzdGFydCBhZGRyZXNzCi0KLVRoZSBNUkkgQGNvZGV7RU5EfSBwc2V1ZG8tb3AgcGVybWl0cyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIHN0YXJ0IGFkZHJlc3MuCi1UaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4gIFRoZSBzdGFydCBhZGRyZXNzIG1heQotaW5zdGVhZCBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIEBjb2Rley1lfSBvcHRpb24gdG8gdGhlIGxpbmtlciwgb3IgaW4gYSBsaW5rZXIKLXNjcmlwdC4KLQotQGl0ZW0gQGNvZGV7SUROVH0sIEBjb2Rley5pZGVudH0gYW5kIEBjb2Rle05BTUV9IHBzZXVkby1vcHMKLQotVGhlIE1SSSBAY29kZXtJRE5UfSwgQGNvZGV7LmlkZW50fSBhbmQgQGNvZGV7TkFNRX0gcHNldWRvLW9wcyBhc3NpZ24gYSBtb2R1bGUKLW5hbWUgdG8gdGhlIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMuCi0KLUBpdGVtIEBjb2Rle09SR30gcHNldWRvLW9wCi0KLVRoZSBtNjhrIE1SSSBAY29kZXtPUkd9IHBzZXVkby1vcCBiZWdpbnMgYW4gYWJzb2x1dGUgc2VjdGlvbiBhdCBhIGdpdmVuCi1hZGRyZXNzLiAgVGhpcyBkaWZmZXJzIGZyb20gdGhlIHVzdWFsIEBjb2Rle0B2YWx1ZXtBU319IEBjb2Rley5vcmd9IHBzZXVkby1vcCwKLXdoaWNoIGNoYW5nZXMgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgY3VycmVudCBzZWN0aW9uLiAgQWJzb2x1dGUgc2VjdGlvbnMgYXJlCi1ub3Qgc3VwcG9ydGVkIGJ5IG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMuICBUaGUgYWRkcmVzcyBvZiBhIHNlY3Rpb24gbWF5IGJlCi1hc3NpZ25lZCB3aXRoaW4gYSBsaW5rZXIgc2NyaXB0LgotQGVuZCBpdGVtaXplCi0KLVRoZXJlIGFyZSBzb21lIG90aGVyIGZlYXR1cmVzIG9mIHRoZSBNUkkgYXNzZW1ibGVyIHdoaWNoIGFyZSBub3Qgc3VwcG9ydGVkIGJ5Ci1AY29kZXtAdmFsdWV7QVN9fSwgdHlwaWNhbGx5IGVpdGhlciBiZWNhdXNlIHRoZXkgYXJlIGRpZmZpY3VsdCBvciBiZWNhdXNlIHRoZXkKLXNlZW0gb2YgbGl0dGxlIGNvbnNlcXVlbmNlLiAgU29tZSBvZiB0aGVzZSBtYXkgYmUgc3VwcG9ydGVkIGluIGZ1dHVyZSByZWxlYXNlcy4KLQotQGl0ZW1pemUgQGJ1bGxldAotCi1AaXRlbSBFQkNESUMgc3RyaW5ncwotCi1FQkNESUMgc3RyaW5ncyBhcmUgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gcGFja2VkIGJpbmFyeSBjb2RlZCBkZWNpbWFsCi0KLVBhY2tlZCBiaW5hcnkgY29kZWQgZGVjaW1hbCBpcyBub3Qgc3VwcG9ydGVkLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBAY29kZXtEQy5QfQotYW5kIEBjb2Rle0RDQi5QfSBwc2V1ZG8tb3BzIGFyZSBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXtGRVFVfSBwc2V1ZG8tb3AKLQotVGhlIG02OGsgQGNvZGV7RkVRVX0gcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIEBjb2Rle05PT0JKfSBwc2V1ZG8tb3AKLQotVGhlIG02OGsgQGNvZGV7Tk9PQkp9IHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXtPUFR9IGJyYW5jaCBjb250cm9sIG9wdGlvbnMKLQotVGhlIG02OGsgQGNvZGV7T1BUfSBicmFuY2ggY29udHJvbCBvcHRpb25zLS0tQGNvZGV7Qn0sIEBjb2Rle0JSU30sIEBjb2Rle0JSQn0sCi1AY29kZXtCUkx9LCBhbmQgQGNvZGV7QlJXfS0tLWFyZSBpZ25vcmVkLiAgQGNvZGV7QHZhbHVle0FTfX0gYXV0b21hdGljYWxseQotcmVsYXhlcyBhbGwgYnJhbmNoZXMsIHdoZXRoZXIgZm9yd2FyZCBvciBiYWNrd2FyZCwgdG8gYW4gYXBwcm9wcmlhdGUgc2l6ZSwgc28KLXRoZXNlIG9wdGlvbnMgc2VydmUgbm8gcHVycG9zZS4KLQotQGl0ZW0gQGNvZGV7T1BUfSBsaXN0IGNvbnRyb2wgb3B0aW9ucwotCi1UaGUgZm9sbG93aW5nIG02OGsgQGNvZGV7T1BUfSBsaXN0IGNvbnRyb2wgb3B0aW9ucyBhcmUgaWdub3JlZDogQGNvZGV7Q30sCi1AY29kZXtDRVh9LCBAY29kZXtDTH0sIEBjb2Rle0NSRX0sIEBjb2Rle0V9LCBAY29kZXtHfSwgQGNvZGV7SX0sIEBjb2Rle019LAotQGNvZGV7TUVYfSwgQGNvZGV7TUN9LCBAY29kZXtNRH0sIEBjb2Rle1h9LgotCi1AaXRlbSBvdGhlciBAY29kZXtPUFR9IG9wdGlvbnMKLQotVGhlIGZvbGxvd2luZyBtNjhrIEBjb2Rle09QVH0gb3B0aW9ucyBhcmUgaWdub3JlZDogQGNvZGV7TkVTVH0sIEBjb2Rle099LAotQGNvZGV7T0xEfSwgQGNvZGV7T1B9LCBAY29kZXtQfSwgQGNvZGV7UENPfSwgQGNvZGV7UENSfSwgQGNvZGV7UENTfSwgQGNvZGV7Un0uCi0KLUBpdGVtIEBjb2Rle09QVH0gQGNvZGV7RH0gb3B0aW9uIGlzIGRlZmF1bHQKLQotVGhlIG02OGsgQGNvZGV7T1BUfSBAY29kZXtEfSBvcHRpb24gaXMgdGhlIGRlZmF1bHQsIHVubGlrZSB0aGUgTVJJIGFzc2VtYmxlci4KLUBjb2Rle09QVCBOT0R9IG1heSBiZSB1c2VkIHRvIHR1cm4gaXQgb2ZmLgotCi1AaXRlbSBAY29kZXtYUkVGfSBwc2V1ZG8tb3AuCi0KLVRoZSBtNjhrIEBjb2Rle1hSRUZ9IHBzZXVkby1vcCBpcyBpZ25vcmVkLgotCi1AaXRlbSBAY29kZXsuZGVidWd9IHBzZXVkby1vcAotCi1UaGUgaTk2MCBAY29kZXsuZGVidWd9IHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXsuZXh0ZW5kZWR9IHBzZXVkby1vcAotCi1UaGUgaTk2MCBAY29kZXsuZXh0ZW5kZWR9IHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXsubGlzdH0gcHNldWRvLW9wLgotCi1UaGUgdmFyaW91cyBvcHRpb25zIG9mIHRoZSBpOTYwIEBjb2Rley5saXN0fSBwc2V1ZG8tb3AgYXJlIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIEBjb2Rley5vcHRpbWl6ZX0gcHNldWRvLW9wCi0KLVRoZSBpOTYwIEBjb2Rley5vcHRpbWl6ZX0gcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIEBjb2Rley5vdXRwdXR9IHBzZXVkby1vcAotCi1UaGUgaTk2MCBAY29kZXsub3V0cHV0fSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gQGNvZGV7LnNldHJlYWx9IHBzZXVkby1vcAotCi1UaGUgaTk2MCBAY29kZXsuc2V0cmVhbH0gcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBNRAotQHNlY3Rpb24gRGVwZW5kZW5jeSB0cmFja2luZzogQGNvZGV7LS1NRH0KLQotQGtpbmRleCAtLU1ECi1AY2luZGV4IGRlcGVuZGVuY3kgdHJhY2tpbmcKLUBjaW5kZXggbWFrZSBydWxlcwotCi1AY29kZXtAdmFsdWV7QVN9fSBjYW4gZ2VuZXJhdGUgYSBkZXBlbmRlbmN5IGZpbGUgZm9yIHRoZSBmaWxlIGl0IGNyZWF0ZXMuICBUaGlzCi1maWxlIGNvbnNpc3RzIG9mIGEgc2luZ2xlIHJ1bGUgc3VpdGFibGUgZm9yIEBjb2Rle21ha2V9IGRlc2NyaWJpbmcgdGhlCi1kZXBlbmRlbmNpZXMgb2YgdGhlIG1haW4gc291cmNlIGZpbGUuCi0KLVRoZSBydWxlIGlzIHdyaXR0ZW4gdG8gdGhlIGZpbGUgbmFtZWQgaW4gaXRzIGFyZ3VtZW50LgotCi1UaGlzIGZlYXR1cmUgaXMgdXNlZCBpbiB0aGUgYXV0b21hdGljIHVwZGF0aW5nIG9mIG1ha2VmaWxlcy4KLQotQG5vZGUgbwotQHNlY3Rpb24gTmFtZSB0aGUgT2JqZWN0IEZpbGU6IEBjb2Rley1vfQotCi1Aa2luZGV4IC1vCi1AY2luZGV4IG5hbWluZyBvYmplY3QgZmlsZQotQGNpbmRleCBvYmplY3QgZmlsZSBuYW1lCi1UaGVyZSBpcyBhbHdheXMgb25lIG9iamVjdCBmaWxlIG91dHB1dCB3aGVuIHlvdSBydW4gQGNvZGV7QHZhbHVle0FTfX0uICBCeQotZGVmYXVsdCBpdCBoYXMgdGhlIG5hbWUKLUBpZnNldCBHRU5FUklDCi1AaWZzZXQgSTk2MAotQGZpbGV7YS5vdXR9IChvciBAZmlsZXtiLm91dH0sIGZvciBJbnRlbCA5NjAgdGFyZ2V0cyBvbmx5KS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEk5NjAKLUBmaWxle2Eub3V0fS4KLUBlbmQgaWZjbGVhcgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEk5NjAKLUBmaWxle2Iub3V0fS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEk5NjAKLUBmaWxle2Eub3V0fS4KLUBlbmQgaWZjbGVhcgotQGVuZCBpZmNsZWFyCi1Zb3UgdXNlIHRoaXMgb3B0aW9uICh3aGljaCB0YWtlcyBleGFjdGx5IG9uZSBmaWxlbmFtZSkgdG8gZ2l2ZSB0aGUKLW9iamVjdCBmaWxlIGEgZGlmZmVyZW50IG5hbWUuCi0KLVdoYXRldmVyIHRoZSBvYmplY3QgZmlsZSBpcyBjYWxsZWQsIEBjb2Rle0B2YWx1ZXtBU319IG92ZXJ3cml0ZXMgYW55Ci1leGlzdGluZyBmaWxlIG9mIHRoZSBzYW1lIG5hbWUuCi0KLUBub2RlIFIKLUBzZWN0aW9uIEpvaW4gRGF0YSBhbmQgVGV4dCBTZWN0aW9uczogQGNvZGV7LVJ9Ci0KLUBraW5kZXggLVIKLUBjaW5kZXggZGF0YSBhbmQgdGV4dCBzZWN0aW9ucywgam9pbmluZwotQGNpbmRleCB0ZXh0IGFuZCBkYXRhIHNlY3Rpb25zLCBqb2luaW5nCi1AY2luZGV4IGpvaW5pbmcgdGV4dCBhbmQgZGF0YSBzZWN0aW9ucwotQGNpbmRleCBtZXJnaW5nIHRleHQgYW5kIGRhdGEgc2VjdGlvbnMKLUBjb2Rley1SfSB0ZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0byB3cml0ZSB0aGUgb2JqZWN0IGZpbGUgYXMgaWYgYWxsCi1kYXRhLXNlY3Rpb24gZGF0YSBsaXZlcyBpbiB0aGUgdGV4dCBzZWN0aW9uLiAgVGhpcyBpcyBvbmx5IGRvbmUgYXQKLXRoZSB2ZXJ5IGxhc3QgbW9tZW50OiAgeW91ciBiaW5hcnkgZGF0YSBhcmUgdGhlIHNhbWUsIGJ1dCBkYXRhCi1zZWN0aW9uIHBhcnRzIGFyZSByZWxvY2F0ZWQgZGlmZmVyZW50bHkuICBUaGUgZGF0YSBzZWN0aW9uIHBhcnQgb2YKLXlvdXIgb2JqZWN0IGZpbGUgaXMgemVybyBieXRlcyBsb25nIGJlY2F1c2UgYWxsIGl0cyBieXRlcyBhcmUKLWFwcGVuZGVkIHRvIHRoZSB0ZXh0IHNlY3Rpb24uICAoQHhyZWZ7U2VjdGlvbnMsLFNlY3Rpb25zIGFuZCBSZWxvY2F0aW9ufS4pCi0KLVdoZW4geW91IHNwZWNpZnkgQGNvZGV7LVJ9IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGdlbmVyYXRlIHNob3J0ZXIKLWFkZHJlc3MgZGlzcGxhY2VtZW50cyAoYmVjYXVzZSB3ZSBkbyBub3QgaGF2ZSB0byBjcm9zcyBiZXR3ZWVuIHRleHQgYW5kCi1kYXRhIHNlY3Rpb24pLiAgV2UgcmVmcmFpbiBmcm9tIGRvaW5nIHRoaXMgc2ltcGx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGgKLW9sZGVyIHZlcnNpb25zIG9mIEBjb2Rle0B2YWx1ZXtBU319LiAgSW4gZnV0dXJlLCBAY29kZXstUn0gbWF5IHdvcmsgdGhpcyB3YXkuCi0KLUBpZnNldCBDT0ZGCi1XaGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgZm9yIENPRkYgb3V0cHV0LAotdGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWwgaWYgeW91IHVzZSBzZWN0aW9ucyBuYW1lZCBAc2FtcHsudGV4dH0gYW5kCi1Ac2FtcHsuZGF0YX0uCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBIUFBBCi1AY29kZXstUn0gaXMgbm90IHN1cHBvcnRlZCBmb3IgYW55IG9mIHRoZSBIUFBBIHRhcmdldHMuICBVc2luZwotQGNvZGV7LVJ9IGdlbmVyYXRlcyBhIHdhcm5pbmcgZnJvbSBAY29kZXtAdmFsdWV7QVN9fS4KLUBlbmQgaWZzZXQKLQotQG5vZGUgc3RhdGlzdGljcwotQHNlY3Rpb24gRGlzcGxheSBBc3NlbWJseSBTdGF0aXN0aWNzOiBAY29kZXstLXN0YXRpc3RpY3N9Ci0KLUBraW5kZXggLS1zdGF0aXN0aWNzCi1AY2luZGV4IHN0YXRpc3RpY3MsIGFib3V0IGFzc2VtYmx5Ci1AY2luZGV4IHRpbWUsIHRvdGFsIGZvciBhc3NlbWJseQotQGNpbmRleCBzcGFjZSB1c2VkLCBtYXhpbXVtIGZvciBhc3NlbWJseQotVXNlIEBzYW1wey0tc3RhdGlzdGljc30gdG8gZGlzcGxheSB0d28gc3RhdGlzdGljcyBhYm91dCB0aGUgcmVzb3VyY2VzIHVzZWQgYnkKLUBjb2Rle0B2YWx1ZXtBU319OiB0aGUgbWF4aW11bSBhbW91bnQgb2Ygc3BhY2UgYWxsb2NhdGVkIGR1cmluZyB0aGUgYXNzZW1ibHkKLShpbiBieXRlcyksIGFuZCB0aGUgdG90YWwgZXhlY3V0aW9uIHRpbWUgdGFrZW4gZm9yIHRoZSBhc3NlbWJseSAoaW4gQHNje2NwdX0KLXNlY29uZHMpLgotCi1Abm9kZSB0cmFkaXRpb25hbC1mb3JtYXQKLUBzZWN0aW9uIENvbXBhdGlibGUgb3V0cHV0OiBAY29kZXstLXRyYWRpdGlvbmFsLWZvcm1hdH0KLQotQGtpbmRleCAtLXRyYWRpdGlvbmFsLWZvcm1hdAotRm9yIHNvbWUgdGFyZ2V0cywgdGhlIG91dHB1dCBvZiBAY29kZXtAdmFsdWV7QVN9fSBpcyBkaWZmZXJlbnQgaW4gc29tZSB3YXlzCi1mcm9tIHRoZSBvdXRwdXQgb2Ygc29tZSBleGlzdGluZyBhc3NlbWJsZXIuICBUaGlzIHN3aXRjaCByZXF1ZXN0cwotQGNvZGV7QHZhbHVle0FTfX0gdG8gdXNlIHRoZSB0cmFkaXRpb25hbCBmb3JtYXQgaW5zdGVhZC4KLQotRm9yIGV4YW1wbGUsIGl0IGRpc2FibGVzIHRoZSBleGNlcHRpb24gZnJhbWUgb3B0aW1pemF0aW9ucyB3aGljaAotQGNvZGV7QHZhbHVle0FTfX0gbm9ybWFsbHkgZG9lcyBieSBkZWZhdWx0IG9uIEBjb2Rle0B2YWx1ZXtHQ0N9fSBvdXRwdXQuCi0KLUBub2RlIHYKLUBzZWN0aW9uIEFubm91bmNlIFZlcnNpb246IEBjb2Rley12fQotCi1Aa2luZGV4IC12Ci1Aa2luZGV4IC12ZXJzaW9uCi1AY2luZGV4IGFzc2VtYmxlciB2ZXJzaW9uCi1AY2luZGV4IHZlcnNpb24gb2YgYXNzZW1ibGVyCi1Zb3UgY2FuIGZpbmQgb3V0IHdoYXQgdmVyc2lvbiBvZiBhcyBpcyBydW5uaW5nIGJ5IGluY2x1ZGluZyB0aGUKLW9wdGlvbiBAc2FtcHstdn0gKHdoaWNoIHlvdSBjYW4gYWxzbyBzcGVsbCBhcyBAc2FtcHstdmVyc2lvbn0pIG9uIHRoZQotY29tbWFuZCBsaW5lLgotCi1Abm9kZSBXCi1Ac2VjdGlvbiBTdXBwcmVzcyBXYXJuaW5nczogQGNvZGV7LVd9Ci0KLUBraW5kZXggLVcKLUBjaW5kZXggc3VwcHJlc3Npbmcgd2FybmluZ3MKLUBjaW5kZXggd2FybmluZ3MsIHN1cHByZXNzaW5nCi1AY29kZXtAdmFsdWV7QVN9fSBzaG91bGQgbmV2ZXIgZ2l2ZSBhIHdhcm5pbmcgb3IgZXJyb3IgbWVzc2FnZSB3aGVuCi1hc3NlbWJsaW5nIGNvbXBpbGVyIG91dHB1dC4gIEJ1dCBwcm9ncmFtcyB3cml0dGVuIGJ5IHBlb3BsZSBvZnRlbgotY2F1c2UgQGNvZGV7QHZhbHVle0FTfX0gdG8gZ2l2ZSBhIHdhcm5pbmcgdGhhdCBhIHBhcnRpY3VsYXIgYXNzdW1wdGlvbiB3YXMKLW1hZGUuICBBbGwgc3VjaCB3YXJuaW5ncyBhcmUgZGlyZWN0ZWQgdG8gdGhlIHN0YW5kYXJkIGVycm9yIGZpbGUuCi1JZiB5b3UgdXNlIHRoaXMgb3B0aW9uLCBubyB3YXJuaW5ncyBhcmUgaXNzdWVkLiAgVGhpcyBvcHRpb24gb25seQotYWZmZWN0cyB0aGUgd2FybmluZyBtZXNzYWdlczogaXQgZG9lcyBub3QgY2hhbmdlIGFueSBwYXJ0aWN1bGFyIG9mIGhvdwotQGNvZGV7QHZhbHVle0FTfX0gYXNzZW1ibGVzIHlvdXIgZmlsZS4gIEVycm9ycywgd2hpY2ggc3RvcCB0aGUgYXNzZW1ibHksIGFyZQotc3RpbGwgcmVwb3J0ZWQuCi0KLUBub2RlIFoKLUBzZWN0aW9uIEdlbmVyYXRlIE9iamVjdCBGaWxlIGluIFNwaXRlIG9mIEVycm9yczogQGNvZGV7LVp9Ci1AY2luZGV4IG9iamVjdCBmaWxlLCBhZnRlciBlcnJvcnMKLUBjaW5kZXggZXJyb3JzLCBjb250aW51aW5nIGFmdGVyCi1BZnRlciBhbiBlcnJvciBtZXNzYWdlLCBAY29kZXtAdmFsdWV7QVN9fSBub3JtYWxseSBwcm9kdWNlcyBubyBvdXRwdXQuICBJZiBmb3IKLXNvbWUgcmVhc29uIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBvYmplY3QgZmlsZSBvdXRwdXQgZXZlbiBhZnRlcgotQGNvZGV7QHZhbHVle0FTfX0gZ2l2ZXMgYW4gZXJyb3IgbWVzc2FnZSBvbiB5b3VyIHByb2dyYW0sIHVzZSB0aGUgQHNhbXB7LVp9Ci1vcHRpb24uICBJZiB0aGVyZSBhcmUgYW55IGVycm9ycywgQGNvZGV7QHZhbHVle0FTfX0gY29udGludWVzIGFueXdheXMsIGFuZAotd3JpdGVzIGFuIG9iamVjdCBmaWxlIGFmdGVyIGEgZmluYWwgd2FybmluZyBtZXNzYWdlIG9mIHRoZSBmb3JtIEBzYW1we0B2YXJ7bn0KLWVycm9ycywgQHZhcnttfSB3YXJuaW5ncywgZ2VuZXJhdGluZyBiYWQgb2JqZWN0IGZpbGUufQotCi1Abm9kZSBTeW50YXgKLUBjaGFwdGVyIFN5bnRheAotCi1AY2luZGV4IG1hY2hpbmUtaW5kZXBlbmRlbnQgc3ludGF4Ci1AY2luZGV4IHN5bnRheCwgbWFjaGluZS1pbmRlcGVuZGVudAotVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyB0aGUgbWFjaGluZS1pbmRlcGVuZGVudCBzeW50YXggYWxsb3dlZCBpbiBhCi1zb3VyY2UgZmlsZS4gIEBjb2Rle0B2YWx1ZXtBU319IHN5bnRheCBpcyBzaW1pbGFyIHRvIHdoYXQgbWFueSBvdGhlcgotYXNzZW1ibGVycyB1c2U7IGl0IGlzIGluc3BpcmVkIGJ5IHRoZSBCU0QgNC4yCi1AaWZjbGVhciBWQVgKLWFzc2VtYmxlci4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IFZBWAotYXNzZW1ibGVyLCBleGNlcHQgdGhhdCBAY29kZXtAdmFsdWV7QVN9fSBkb2VzIG5vdCBhc3NlbWJsZSBWYXggYml0LWZpZWxkcy4KLUBlbmQgaWZzZXQKLQotQG1lbnUKLSogUHJlcHJvY2Vzc2luZzo6ICAgICAgICAgICAgICBQcmVwcm9jZXNzaW5nCi0qIFdoaXRlc3BhY2U6OiAgICAgICAgICAgICAgICAgIFdoaXRlc3BhY2UKLSogQ29tbWVudHM6OiAgICAgICAgICAgICAgICAgICAgQ29tbWVudHMKLSogU3ltYm9sIEludHJvOjogICAgICAgICAgICAgICAgU3ltYm9scwotKiBTdGF0ZW1lbnRzOjogICAgICAgICAgICAgICAgICBTdGF0ZW1lbnRzCi0qIENvbnN0YW50czo6ICAgICAgICAgICAgICAgICAgIENvbnN0YW50cwotQGVuZCBtZW51Ci0KLUBub2RlIFByZXByb2Nlc3NpbmcKLUBzZWN0aW9uIFByZXByb2Nlc3NpbmcKLQotQGNpbmRleCBwcmVwcm9jZXNzaW5nCi1UaGUgQGNvZGV7QHZhbHVle0FTfX0gaW50ZXJuYWwgcHJlcHJvY2Vzc29yOgotQGl0ZW1pemUgQGJ1bGxldAotQGNpbmRleCB3aGl0ZXNwYWNlLCByZW1vdmVkIGJ5IHByZXByb2Nlc3NvcgotQGl0ZW0KLWFkanVzdHMgYW5kIHJlbW92ZXMgZXh0cmEgd2hpdGVzcGFjZS4gIEl0IGxlYXZlcyBvbmUgc3BhY2Ugb3IgdGFiIGJlZm9yZQotdGhlIGtleXdvcmRzIG9uIGEgbGluZSwgYW5kIHR1cm5zIGFueSBvdGhlciB3aGl0ZXNwYWNlIG9uIHRoZSBsaW5lIGludG8KLWEgc2luZ2xlIHNwYWNlLgotCi1AY2luZGV4IGNvbW1lbnRzLCByZW1vdmVkIGJ5IHByZXByb2Nlc3NvcgotQGl0ZW0KLXJlbW92ZXMgYWxsIGNvbW1lbnRzLCByZXBsYWNpbmcgdGhlbSB3aXRoIGEgc2luZ2xlIHNwYWNlLCBvciBhbgotYXBwcm9wcmlhdGUgbnVtYmVyIG9mIG5ld2xpbmVzLgotCi1AY2luZGV4IGNvbnN0YW50cywgY29udmVydGVkIGJ5IHByZXByb2Nlc3NvcgotQGl0ZW0KLWNvbnZlcnRzIGNoYXJhY3RlciBjb25zdGFudHMgaW50byB0aGUgYXBwcm9wcmlhdGUgbnVtZXJpYyB2YWx1ZXMuCi1AZW5kIGl0ZW1pemUKLQotSXQgZG9lcyBub3QgZG8gbWFjcm8gcHJvY2Vzc2luZywgaW5jbHVkZSBmaWxlIGhhbmRsaW5nLCBvcgotYW55dGhpbmcgZWxzZSB5b3UgbWF5IGdldCBmcm9tIHlvdXIgQyBjb21waWxlcidzIHByZXByb2Nlc3Nvci4gIFlvdSBjYW4KLWRvIGluY2x1ZGUgZmlsZSBwcm9jZXNzaW5nIHdpdGggdGhlIEBjb2Rley5pbmNsdWRlfSBkaXJlY3RpdmUKLShAcHhyZWZ7SW5jbHVkZSwsQGNvZGV7LmluY2x1ZGV9fSkuICBZb3UgY2FuIHVzZSB0aGUgQHNje2dudX0gQyBjb21waWxlciBkcml2ZXIKLXRvIGdldCBvdGhlciBgYENQUCcnIHN0eWxlIHByZXByb2Nlc3NpbmcsIGJ5IGdpdmluZyB0aGUgaW5wdXQgZmlsZSBhCi1Ac2FtcHsuU30gc3VmZml4LiAgQHhyZWZ7T3ZlcmFsbCBPcHRpb25zLCwgT3B0aW9ucyBDb250cm9sbGluZyB0aGUgS2luZCBvZgotT3V0cHV0LCBnY2MuaW5mbywgVXNpbmcgR05VIENDfS4KLQotRXhjZXNzIHdoaXRlc3BhY2UsIGNvbW1lbnRzLCBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cwotY2Fubm90IGJlIHVzZWQgaW4gdGhlIHBvcnRpb25zIG9mIHRoZSBpbnB1dCB0ZXh0IHRoYXQgYXJlIG5vdAotcHJlcHJvY2Vzc2VkLgotCi1AY2luZGV4IHR1cm5pbmcgcHJlcHJvY2Vzc2luZyBvbiBhbmQgb2ZmCi1AY2luZGV4IHByZXByb2Nlc3NpbmcsIHR1cm5pbmcgb24gYW5kIG9mZgotQGtpbmRleCAjTk9fQVBQCi1Aa2luZGV4ICNBUFAKLUlmIHRoZSBmaXJzdCBsaW5lIG9mIGFuIGlucHV0IGZpbGUgaXMgQGNvZGV7I05PX0FQUH0gb3IgaWYgeW91IHVzZSB0aGUKLUBzYW1wey1mfSBvcHRpb24sIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIGFyZSBub3QgcmVtb3ZlZCBmcm9tIHRoZSBpbnB1dCBmaWxlLgotV2l0aGluIGFuIGlucHV0IGZpbGUsIHlvdSBjYW4gYXNrIGZvciB3aGl0ZXNwYWNlIGFuZCBjb21tZW50IHJlbW92YWwgaW4KLXNwZWNpZmljIHBvcnRpb25zIG9mIHRoZSBieSBwdXR0aW5nIGEgbGluZSB0aGF0IHNheXMgQGNvZGV7I0FQUH0gYmVmb3JlIHRoZQotdGV4dCB0aGF0IG1heSBjb250YWluIHdoaXRlc3BhY2Ugb3IgY29tbWVudHMsIGFuZCBwdXR0aW5nIGEgbGluZSB0aGF0IHNheXMKLUBjb2RleyNOT19BUFB9IGFmdGVyIHRoaXMgdGV4dC4gIFRoaXMgZmVhdHVyZSBpcyBtYWlubHkgaW50ZW5kIHRvIHN1cHBvcnQKLUBjb2Rle2FzbX0gc3RhdGVtZW50cyBpbiBjb21waWxlcnMgd2hvc2Ugb3V0cHV0IGlzIG90aGVyd2lzZSBmcmVlIG9mIGNvbW1lbnRzCi1hbmQgd2hpdGVzcGFjZS4KLQotQG5vZGUgV2hpdGVzcGFjZQotQHNlY3Rpb24gV2hpdGVzcGFjZQotCi1AY2luZGV4IHdoaXRlc3BhY2UKLUBkZm57V2hpdGVzcGFjZX0gaXMgb25lIG9yIG1vcmUgYmxhbmtzIG9yIHRhYnMsIGluIGFueSBvcmRlci4KLVdoaXRlc3BhY2UgaXMgdXNlZCB0byBzZXBhcmF0ZSBzeW1ib2xzLCBhbmQgdG8gbWFrZSBwcm9ncmFtcyBuZWF0ZXIgZm9yCi1wZW9wbGUgdG8gcmVhZC4gIFVubGVzcyB3aXRoaW4gY2hhcmFjdGVyIGNvbnN0YW50cwotKEBweHJlZntDaGFyYWN0ZXJzLCxDaGFyYWN0ZXIgQ29uc3RhbnRzfSksIGFueSB3aGl0ZXNwYWNlIG1lYW5zIHRoZSBzYW1lCi1hcyBleGFjdGx5IG9uZSBzcGFjZS4KLQotQG5vZGUgQ29tbWVudHMKLUBzZWN0aW9uIENvbW1lbnRzCi0KLUBjaW5kZXggY29tbWVudHMKLVRoZXJlIGFyZSB0d28gd2F5cyBvZiByZW5kZXJpbmcgY29tbWVudHMgdG8gQGNvZGV7QHZhbHVle0FTfX0uICBJbiBib3RoCi1jYXNlcyB0aGUgY29tbWVudCBpcyBlcXVpdmFsZW50IHRvIG9uZSBzcGFjZS4KLQotQW55dGhpbmcgZnJvbSBAc2FtcHsvKn0gdGhyb3VnaCB0aGUgbmV4dCBAc2FtcHsqL30gaXMgYSBjb21tZW50LgotVGhpcyBtZWFucyB5b3UgbWF5IG5vdCBuZXN0IHRoZXNlIGNvbW1lbnRzLgotCi1Ac21hbGxleGFtcGxlCi0vKgotICBUaGUgb25seSB3YXkgdG8gaW5jbHVkZSBhIG5ld2xpbmUgKCdcbicpIGluIGEgY29tbWVudAotICBpcyB0byB1c2UgdGhpcyBzb3J0IG9mIGNvbW1lbnQuCi0qLwotCi0vKiBUaGlzIHNvcnQgb2YgY29tbWVudCBkb2VzIG5vdCBuZXN0LiAqLwotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Bbnl0aGluZyBmcm9tIHRoZSBAZGZue2xpbmUgY29tbWVudH0gY2hhcmFjdGVyIHRvIHRoZSBuZXh0IG5ld2xpbmUKLWlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCBpcyBpZ25vcmVkLiAgVGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIgaXMKLUBpZnNldCBBMjlLCi1Ac2FtcHs7fSBmb3IgdGhlIEFNRCAyOUsgZmFtaWx5OwotQGVuZCBpZnNldAotQGlmc2V0IEFSQwotQHNhbXB7O30gb24gdGhlIEFSQzsKLUBlbmQgaWZzZXQKLUBpZnNldCBIOC8zMDAKLUBzYW1wezt9IGZvciB0aGUgSDgvMzAwIGZhbWlseTsKLUBlbmQgaWZzZXQKLUBpZnNldCBIOC81MDAKLUBzYW1weyF9IGZvciB0aGUgSDgvNTAwIGZhbWlseTsKLUBlbmQgaWZzZXQKLUBpZnNldCBIUFBBCi1Ac2FtcHs7fSBmb3IgdGhlIEhQUEE7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgSTk2MAotQHNhbXB7I30gb24gdGhlIGk5NjA7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgU0gKLUBzYW1weyF9IGZvciB0aGUgSGl0YWNoaSBTSDsKLUBlbmQgaWZzZXQKLUBpZnNldCBTUEFSQwotQHNhbXB7IX0gb24gdGhlIFNQQVJDOwotQGVuZCBpZnNldAotQGlmc2V0IE0zMlIKLUBzYW1weyN9IG9uIHRoZSBtMzJyOwotQGVuZCBpZnNldAotQGlmc2V0IE02ODBYMAotQHNhbXB7fH0gb24gdGhlIDY4MHgwOwotQGVuZCBpZnNldAotQGlmc2V0IFZBWAotQHNhbXB7I30gb24gdGhlIFZheDsKLUBlbmQgaWZzZXQKLUBpZnNldCBaODAwMAotQHNhbXB7IX0gZm9yIHRoZSBaODAwMDsKLUBlbmQgaWZzZXQKLUBpZnNldCBWODUwCi1Ac2FtcHsjfSBvbiB0aGUgVjg1MDsKLUBlbmQgaWZzZXQKLXNlZSBAcmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4gIEByZWZpbGwKLUBjIEZJWE1FIFdoYXQgYWJvdXQgaTM4NiwgbTg4aywgaTg2MD8KLQotQGlmc2V0IEdFTkVSSUMKLU9uIHNvbWUgbWFjaGluZXMgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgbGluZSBjb21tZW50IGNoYXJhY3RlcnMuICBPbmUKLWNoYXJhY3RlciBvbmx5IGJlZ2lucyBhIGNvbW1lbnQgaWYgaXQgaXMgdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBvbgotYSBsaW5lLCB3aGlsZSB0aGUgb3RoZXIgYWx3YXlzIGJlZ2lucyBhIGNvbW1lbnQuCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBWODUwCi1UaGUgVjg1MCBhc3NlbWJsZXIgYWxzbyBzdXBwb3J0cyBhIGRvdWJsZSBkYXNoIGFzIHN0YXJ0aW5nIGEgY29tbWVudCB0aGF0Ci1leHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCi0KLUBzYW1wey0tfTsKLUBlbmQgaWZzZXQKLQotQGtpbmRleCAjCi1AY2luZGV4IGxpbmVzIHN0YXJ0aW5nIHdpdGggQGNvZGV7I30KLUBjaW5kZXggbG9naWNhbCBsaW5lIG51bWJlcnMKLVRvIGJlIGNvbXBhdGlibGUgd2l0aCBwYXN0IGFzc2VtYmxlcnMsIGxpbmVzIHRoYXQgYmVnaW4gd2l0aCBAc2FtcHsjfSBoYXZlIGEKLXNwZWNpYWwgaW50ZXJwcmV0YXRpb24uICBGb2xsb3dpbmcgdGhlIEBzYW1weyN9IHNob3VsZCBiZSBhbiBhYnNvbHV0ZQotZXhwcmVzc2lvbiAoQHB4cmVme0V4cHJlc3Npb25zfSk6IHRoZSBsb2dpY2FsIGxpbmUgbnVtYmVyIG9mIHRoZSBAZW1waHtuZXh0fQotbGluZS4gIFRoZW4gYSBzdHJpbmcgKEBweHJlZntTdHJpbmdzLCwgU3RyaW5nc30pIGlzIGFsbG93ZWQ6IGlmIHByZXNlbnQgaXQgaXMgYQotbmV3IGxvZ2ljYWwgZmlsZSBuYW1lLiAgVGhlIHJlc3Qgb2YgdGhlIGxpbmUsIGlmIGFueSwgc2hvdWxkIGJlIHdoaXRlc3BhY2UuCi0KLUlmIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIG9uIHRoZSBsaW5lIGFyZSBub3QgbnVtZXJpYywKLXRoZSBsaW5lIGlzIGlnbm9yZWQuICAoSnVzdCBsaWtlIGEgY29tbWVudC4pCi0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGFuIG9yZGluYXJ5IGNvbW1lbnQuCi0jIDQyLTYgIm5ld19maWxlX25hbWUiICAgICMgTmV3IGxvZ2ljYWwgZmlsZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBsb2dpY2FsIGxpbmUgIyAzNi4KLUBlbmQgc21hbGxleGFtcGxlCi1UaGlzIGZlYXR1cmUgaXMgZGVwcmVjYXRlZCwgYW5kIG1heSBkaXNhcHBlYXIgZnJvbSBmdXR1cmUgdmVyc2lvbnMKLW9mIEBjb2Rle0B2YWx1ZXtBU319LgotCi1Abm9kZSBTeW1ib2wgSW50cm8KLUBzZWN0aW9uIFN5bWJvbHMKLQotQGNpbmRleCBjaGFyYWN0ZXJzIHVzZWQgaW4gc3ltYm9scwotQGlmY2xlYXIgU1BFQ0lBTC1TWU1TCi1BIEBkZm57c3ltYm9sfSBpcyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGNob3NlbiBmcm9tIHRoZSBzZXQgb2YgYWxsCi1sZXR0ZXJzIChib3RoIHVwcGVyIGFuZCBsb3dlciBjYXNlKSwgZGlnaXRzIGFuZCB0aGUgdGhyZWUgY2hhcmFjdGVycwotQHNhbXB7Xy4kfS4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IFNQRUNJQUwtU1lNUwotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEg4Ci1BIEBkZm57c3ltYm9sfSBpcyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGNob3NlbiBmcm9tIHRoZSBzZXQgb2YgYWxsCi1sZXR0ZXJzIChib3RoIHVwcGVyIGFuZCBsb3dlciBjYXNlKSwgZGlnaXRzIGFuZCB0aGUgdGhyZWUgY2hhcmFjdGVycwotQHNhbXB7Ll8kfS4gIChTYXZlIHRoYXQsIG9uIHRoZSBIOC8zMDAgb25seSwgeW91IG1heSBub3QgdXNlIEBzYW1weyR9IGluCi1zeW1ib2wgbmFtZXMuKQotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1AZW5kIGlmc2V0Ci1AaWZzZXQgR0VORVJJQwotT24gbW9zdCBtYWNoaW5lcywgeW91IGNhbiBhbHNvIHVzZSBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXM7IGV4Y2VwdGlvbnMKLWFyZSBub3RlZCBpbiBAcmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4KLUBlbmQgaWZzZXQKLU5vIHN5bWJvbCBtYXkgYmVnaW4gd2l0aCBhIGRpZ2l0LiAgQ2FzZSBpcyBzaWduaWZpY2FudC4KLVRoZXJlIGlzIG5vIGxlbmd0aCBsaW1pdDogYWxsIGNoYXJhY3RlcnMgYXJlIHNpZ25pZmljYW50LiAgU3ltYm9scyBhcmUKLWRlbGltaXRlZCBieSBjaGFyYWN0ZXJzIG5vdCBpbiB0aGF0IHNldCwgb3IgYnkgdGhlIGJlZ2lubmluZyBvZiBhIGZpbGUKLShzaW5jZSB0aGUgc291cmNlIHByb2dyYW0gbXVzdCBlbmQgd2l0aCBhIG5ld2xpbmUsIHRoZSBlbmQgb2YgYSBmaWxlIGlzCi1ub3QgYSBwb3NzaWJsZSBzeW1ib2wgZGVsaW1pdGVyKS4gIEB4cmVme1N5bWJvbHN9LgotQGNpbmRleCBsZW5ndGggb2Ygc3ltYm9scwotCi1Abm9kZSBTdGF0ZW1lbnRzCi1Ac2VjdGlvbiBTdGF0ZW1lbnRzCi0KLUBjaW5kZXggc3RhdGVtZW50cywgc3RydWN0dXJlIG9mCi1AY2luZGV4IGxpbmUgc2VwYXJhdG9yIGNoYXJhY3RlcgotQGNpbmRleCBzdGF0ZW1lbnQgc2VwYXJhdG9yIGNoYXJhY3RlcgotQGlmY2xlYXIgR0VORVJJQwotQGlmY2xlYXIgYWJub3JtYWwtc2VwYXJhdG9yCi1BIEBkZm57c3RhdGVtZW50fSBlbmRzIGF0IGEgbmV3bGluZSBjaGFyYWN0ZXIgKEBzYW1we1xufSkgb3IgYXQgYQotc2VtaWNvbG9uIChAc2FtcHs7fSkuICBUaGUgbmV3bGluZSBvciBzZW1pY29sb24gaXMgY29uc2lkZXJlZCBwYXJ0IG9mCi10aGUgcHJlY2VkaW5nIHN0YXRlbWVudC4gIE5ld2xpbmVzIGFuZCBzZW1pY29sb25zIHdpdGhpbiBjaGFyYWN0ZXIKLWNvbnN0YW50cyBhcmUgYW4gZXhjZXB0aW9uOiB0aGV5IGRvIG5vdCBlbmQgc3RhdGVtZW50cy4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IGFibm9ybWFsLXNlcGFyYXRvcgotQGlmc2V0IEEyOUsKLUEgQGRmbntzdGF0ZW1lbnR9IGVuZHMgYXQgYSBuZXdsaW5lIGNoYXJhY3RlciAoQHNhbXB7XG59KSBvciBhbiBgYGF0JycKLXNpZ24gKEBzYW1we0BAfSkuICBUaGUgbmV3bGluZSBvciBhdCBzaWduIGlzIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUKLXByZWNlZGluZyBzdGF0ZW1lbnQuICBOZXdsaW5lcyBhbmQgYXQgc2lnbnMgd2l0aGluIGNoYXJhY3RlciBjb25zdGFudHMKLWFyZSBhbiBleGNlcHRpb246IHRoZXkgZG8gbm90IGVuZCBzdGF0ZW1lbnRzLgotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLUEgQGRmbntzdGF0ZW1lbnR9IGVuZHMgYXQgYSBuZXdsaW5lIGNoYXJhY3RlciAoQHNhbXB7XG59KSBvciBhbiBleGNsYW1hdGlvbiAKLXBvaW50IChAc2FtcHshfSkuICBUaGUgbmV3bGluZSBvciBleGNsYW1hdGlvbiBwb2ludCBpcyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlCi1wcmVjZWRpbmcgc3RhdGVtZW50LiAgTmV3bGluZXMgYW5kIGV4Y2xhbWF0aW9uIHBvaW50cyB3aXRoaW4gY2hhcmFjdGVyCi1jb25zdGFudHMgYXJlIGFuIGV4Y2VwdGlvbjogdGhleSBkbyBub3QgZW5kIHN0YXRlbWVudHMuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgKLUEgQGRmbntzdGF0ZW1lbnR9IGVuZHMgYXQgYSBuZXdsaW5lIGNoYXJhY3RlciAoQHNhbXB7XG59KTsgb3IgKGZvciB0aGUKLUg4LzMwMCkgYSBkb2xsYXIgc2lnbiAoQHNhbXB7JH0pOyBvciAoZm9yIHRoZQotSGl0YWNoaS1TSCBvciB0aGUKLUg4LzUwMCkgYSBzZW1pY29sb24KLShAc2FtcHs7fSkuICBUaGUgbmV3bGluZSBvciBzZXBhcmF0b3IgY2hhcmFjdGVyIGlzIGNvbnNpZGVyZWQgcGFydCBvZgotdGhlIHByZWNlZGluZyBzdGF0ZW1lbnQuICBOZXdsaW5lcyBhbmQgc2VwYXJhdG9ycyB3aXRoaW4gY2hhcmFjdGVyCi1jb25zdGFudHMgYXJlIGFuIGV4Y2VwdGlvbjogdGhleSBkbyBub3QgZW5kIHN0YXRlbWVudHMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLUBpZnNldCBHRU5FUklDCi1BIEBkZm57c3RhdGVtZW50fSBlbmRzIGF0IGEgbmV3bGluZSBjaGFyYWN0ZXIgKEBzYW1we1xufSkgb3IgbGluZQotc2VwYXJhdG9yIGNoYXJhY3Rlci4gIChUaGUgbGluZSBzZXBhcmF0b3IgaXMgdXN1YWxseSBAc2FtcHs7fSwgdW5sZXNzCi10aGlzIGNvbmZsaWN0cyB3aXRoIHRoZSBjb21tZW50IGNoYXJhY3RlcjsgQHB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4pICBUaGUKLW5ld2xpbmUgb3Igc2VwYXJhdG9yIGNoYXJhY3RlciBpcyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHByZWNlZGluZwotc3RhdGVtZW50LiAgTmV3bGluZXMgYW5kIHNlcGFyYXRvcnMgd2l0aGluIGNoYXJhY3RlciBjb25zdGFudHMgYXJlIGFuCi1leGNlcHRpb246IHRoZXkgZG8gbm90IGVuZCBzdGF0ZW1lbnRzLgotQGVuZCBpZnNldAotCi1AY2luZGV4IG5ld2xpbmUsIHJlcXVpcmVkIGF0IGZpbGUgZW5kCi1AY2luZGV4IEVPRiwgbmV3bGluZSBtdXN0IHByZWNlZGUKLUl0IGlzIGFuIGVycm9yIHRvIGVuZCBhbnkgc3RhdGVtZW50IHdpdGggZW5kLW9mLWZpbGU6ICB0aGUgbGFzdAotY2hhcmFjdGVyIG9mIGFueSBpbnB1dCBmaWxlIHNob3VsZCBiZSBhIG5ld2xpbmUuQHJlZmlsbAotCi1BbiBlbXB0eSBzdGF0ZW1lbnQgaXMgYWxsb3dlZCwgYW5kIG1heSBpbmNsdWRlIHdoaXRlc3BhY2UuICBJdCBpcyBpZ25vcmVkLgotCi1AY2luZGV4IGluc3RydWN0aW9ucyBhbmQgZGlyZWN0aXZlcwotQGNpbmRleCBkaXJlY3RpdmVzIGFuZCBpbnN0cnVjdGlvbnMKLUBjICJrZXkgc3ltYm9sIiBpcyBub3QgdXNlZCBlbHNld2hlcmUgaW4gdGhlIGRvY3VtZW50OyBzZWVtcyBwZWRhbnRpYyB0bwotQGMgQGRlZm57fSBpdCBpbiB0aGF0IGNhc2UsIGFzIHdhcyBkb25lIHByZXZpb3VzbHkuLi4gIGRvY0BjeWdudXMuY29tLAotQGMgMTNmZWI5MS4KLUEgc3RhdGVtZW50IGJlZ2lucyB3aXRoIHplcm8gb3IgbW9yZSBsYWJlbHMsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYQota2V5IHN5bWJvbCB3aGljaCBkZXRlcm1pbmVzIHdoYXQga2luZCBvZiBzdGF0ZW1lbnQgaXQgaXMuICBUaGUga2V5Ci1zeW1ib2wgZGV0ZXJtaW5lcyB0aGUgc3ludGF4IG9mIHRoZSByZXN0IG9mIHRoZSBzdGF0ZW1lbnQuICBJZiB0aGUKLXN5bWJvbCBiZWdpbnMgd2l0aCBhIGRvdCBAc2FtcHsufSB0aGVuIHRoZSBzdGF0ZW1lbnQgaXMgYW4gYXNzZW1ibGVyCi1kaXJlY3RpdmU6IHR5cGljYWxseSB2YWxpZCBmb3IgYW55IGNvbXB1dGVyLiAgSWYgdGhlIHN5bWJvbCBiZWdpbnMgd2l0aAotYSBsZXR0ZXIgdGhlIHN0YXRlbWVudCBpcyBhbiBhc3NlbWJseSBsYW5ndWFnZSBAZGZue2luc3RydWN0aW9ufTogaXQKLWFzc2VtYmxlcyBpbnRvIGEgbWFjaGluZSBsYW5ndWFnZSBpbnN0cnVjdGlvbi4KLUBpZnNldCBHRU5FUklDCi1EaWZmZXJlbnQgdmVyc2lvbnMgb2YgQGNvZGV7QHZhbHVle0FTfX0gZm9yIGRpZmZlcmVudCBjb21wdXRlcnMKLXJlY29nbml6ZSBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb25zLiAgSW4gZmFjdCwgdGhlIHNhbWUgc3ltYm9sIG1heQotcmVwcmVzZW50IGEgZGlmZmVyZW50IGluc3RydWN0aW9uIGluIGEgZGlmZmVyZW50IGNvbXB1dGVyJ3MgYXNzZW1ibHkKLWxhbmd1YWdlLkByZWZpbGwKLUBlbmQgaWZzZXQKLQotQGNpbmRleCBAY29kZXs6fSAobGFiZWwpCi1AY2luZGV4IGxhYmVsIChAY29kZXs6fSkKLUEgbGFiZWwgaXMgYSBzeW1ib2wgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBjb2xvbiAoQGNvZGV7On0pLgotV2hpdGVzcGFjZSBiZWZvcmUgYSBsYWJlbCBvciBhZnRlciBhIGNvbG9uIGlzIHBlcm1pdHRlZCwgYnV0IHlvdSBtYXkgbm90Ci1oYXZlIHdoaXRlc3BhY2UgYmV0d2VlbiBhIGxhYmVsJ3Mgc3ltYm9sIGFuZCBpdHMgY29sb24uIEB4cmVme0xhYmVsc30uCi0KLUBpZnNldCBIUFBBCi1Gb3IgSFBQQSB0YXJnZXRzLCBsYWJlbHMgbmVlZCBub3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBjb2xvbiwgYnV0IAotdGhlIGRlZmluaXRpb24gb2YgYSBsYWJlbCBtdXN0IGJlZ2luIGluIGNvbHVtbiB6ZXJvLiAgVGhpcyBhbHNvIGltcGxpZXMgdGhhdAotb25seSBvbmUgbGFiZWwgbWF5IGJlIGRlZmluZWQgb24gZWFjaCBsaW5lLgotQGVuZCBpZnNldAotCi1Ac21hbGxleGFtcGxlCi1sYWJlbDogICAgIC5kaXJlY3RpdmUgICAgZm9sbG93ZWQgYnkgc29tZXRoaW5nCi1hbm90aGVyX2xhYmVsOiAgICAgICAgICAgIyBUaGlzIGlzIGFuIGVtcHR5IHN0YXRlbWVudC4KLSAgICAgICAgICAgaW5zdHJ1Y3Rpb24gICBvcGVyYW5kXzEsIG9wZXJhbmRfMiwgQGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgQ29uc3RhbnRzCi1Ac2VjdGlvbiBDb25zdGFudHMKLQotQGNpbmRleCBjb25zdGFudHMKLUEgY29uc3RhbnQgaXMgYSBudW1iZXIsIHdyaXR0ZW4gc28gdGhhdCBpdHMgdmFsdWUgaXMga25vd24gYnkKLWluc3BlY3Rpb24sIHdpdGhvdXQga25vd2luZyBhbnkgY29udGV4dC4gIExpa2UgdGhpczoKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotLmJ5dGUgIDc0LCAwMTEyLCAwOTIsIDB4NEEsIDBYNGEsICdKLCAnXEogIyBBbGwgdGhlIHNhbWUgdmFsdWUuCi0uYXNjaWkgIlJpbmcgdGhlIGJlbGxcNyIgICAgICAgICAgICAgICAgICAjIEEgc3RyaW5nIGNvbnN0YW50LgotLm9jdGEgIDB4MTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OUFCQ0RFRjAgIyBBIGJpZ251bS4KLS5mbG9hdCAwZi0zMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjdcCi05NTAyODg0MTk3MS42OTM5OTM3NTFFLTQwICAgICAgICAgICAgICAgICAjIC0gcGksIGEgZmxvbnVtLgotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG1lbnUKLSogQ2hhcmFjdGVyczo6ICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyIENvbnN0YW50cwotKiBOdW1iZXJzOjogICAgICAgICAgICAgICAgICAgICBOdW1iZXIgQ29uc3RhbnRzCi1AZW5kIG1lbnUKLQotQG5vZGUgQ2hhcmFjdGVycwotQHN1YnNlY3Rpb24gQ2hhcmFjdGVyIENvbnN0YW50cwotCi1AY2luZGV4IGNoYXJhY3RlciBjb25zdGFudHMKLUBjaW5kZXggY29uc3RhbnRzLCBjaGFyYWN0ZXIKLVRoZXJlIGFyZSB0d28ga2luZHMgb2YgY2hhcmFjdGVyIGNvbnN0YW50cy4gIEEgQGRmbntjaGFyYWN0ZXJ9IHN0YW5kcwotZm9yIG9uZSBjaGFyYWN0ZXIgaW4gb25lIGJ5dGUgYW5kIGl0cyB2YWx1ZSBtYXkgYmUgdXNlZCBpbgotbnVtZXJpYyBleHByZXNzaW9ucy4gIFN0cmluZyBjb25zdGFudHMgKHByb3Blcmx5IGNhbGxlZCBzdHJpbmcKLUBlbXBoe2xpdGVyYWxzfSkgYXJlIHBvdGVudGlhbGx5IG1hbnkgYnl0ZXMgYW5kIHRoZWlyIHZhbHVlcyBtYXkgbm90IGJlCi11c2VkIGluIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMuCi0KLUBtZW51Ci0qIFN0cmluZ3M6OiAgICAgICAgICAgICAgICAgICAgIFN0cmluZ3MKLSogQ2hhcnM6OiAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVycwotQGVuZCBtZW51Ci0KLUBub2RlIFN0cmluZ3MKLUBzdWJzdWJzZWN0aW9uIFN0cmluZ3MKLQotQGNpbmRleCBzdHJpbmcgY29uc3RhbnRzCi1AY2luZGV4IGNvbnN0YW50cywgc3RyaW5nCi1BIEBkZm57c3RyaW5nfSBpcyB3cml0dGVuIGJldHdlZW4gZG91YmxlLXF1b3Rlcy4gIEl0IG1heSBjb250YWluCi1kb3VibGUtcXVvdGVzIG9yIG51bGwgY2hhcmFjdGVycy4gIFRoZSB3YXkgdG8gZ2V0IHNwZWNpYWwgY2hhcmFjdGVycwotaW50byBhIHN0cmluZyBpcyB0byBAZGZue2VzY2FwZX0gdGhlc2UgY2hhcmFjdGVyczogcHJlY2VkZSB0aGVtIHdpdGgKLWEgYmFja3NsYXNoIEBzYW1we1x9IGNoYXJhY3Rlci4gIEZvciBleGFtcGxlIEBzYW1we1xcfSByZXByZXNlbnRzCi1vbmUgYmFja3NsYXNoOiAgdGhlIGZpcnN0IEBjb2Rle1x9IGlzIGFuIGVzY2FwZSB3aGljaCB0ZWxscwotQGNvZGV7QHZhbHVle0FTfX0gdG8gaW50ZXJwcmV0IHRoZSBzZWNvbmQgY2hhcmFjdGVyIGxpdGVyYWxseSBhcyBhIGJhY2tzbGFzaAotKHdoaWNoIHByZXZlbnRzIEBjb2Rle0B2YWx1ZXtBU319IGZyb20gcmVjb2duaXppbmcgdGhlIHNlY29uZCBAY29kZXtcfSBhcyBhbgotZXNjYXBlIGNoYXJhY3RlcikuICBUaGUgY29tcGxldGUgbGlzdCBvZiBlc2NhcGVzIGZvbGxvd3MuCi0KLUBjaW5kZXggZXNjYXBlIGNvZGVzLCBjaGFyYWN0ZXIKLUBjaW5kZXggY2hhcmFjdGVyIGVzY2FwZSBjb2RlcwotQHRhYmxlIEBrYmQKLUBjICAgICAgQGl0ZW0gXGEKLUBjICAgICAgTW5lbW9uaWMgZm9yIEFDS25vd2xlZGdlOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDAwNy4KLUBjCi1AY2luZGV4IEBjb2Rle1xifSAoYmFja3NwYWNlIGNoYXJhY3RlcikKLUBjaW5kZXggYmFja3NwYWNlIChAY29kZXtcYn0pCi1AaXRlbSBcYgotTW5lbW9uaWMgZm9yIGJhY2tzcGFjZTsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMTAuCi0KLUBjICAgICAgQGl0ZW0gXGUKLUBjICAgICAgTW5lbW9uaWMgZm9yIEVPVGV4dDsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMDQuCi1AYwotQGNpbmRleCBAY29kZXtcZn0gKGZvcm1mZWVkIGNoYXJhY3RlcikKLUBjaW5kZXggZm9ybWZlZWQgKEBjb2Rle1xmfSkKLUBpdGVtIFxmCi1NbmVtb25pYyBmb3IgRm9ybUZlZWQ7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDE0LgotCi1AY2luZGV4IEBjb2Rle1xufSAobmV3bGluZSBjaGFyYWN0ZXIpCi1AY2luZGV4IG5ld2xpbmUgKEBjb2Rle1xufSkKLUBpdGVtIFxuCi1NbmVtb25pYyBmb3IgbmV3bGluZTsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMTIuCi0KLUBjICAgICAgQGl0ZW0gXHAKLUBjICAgICAgTW5lbW9uaWMgZm9yIHByZWZpeDsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMzMsIHVzdWFsbHkga25vd24gYXMgQGNvZGV7ZXNjYXBlfS4KLUBjCi1AY2luZGV4IEBjb2Rle1xyfSAoY2FycmlhZ2UgcmV0dXJuIGNoYXJhY3RlcikKLUBjaW5kZXggY2FycmlhZ2UgcmV0dXJuIChAY29kZXtccn0pCi1AaXRlbSBccgotTW5lbW9uaWMgZm9yIGNhcnJpYWdlLVJldHVybjsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMTUuCi0KLUBjICAgICAgQGl0ZW0gXHMKLUBjICAgICAgTW5lbW9uaWMgZm9yIHNwYWNlOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDA0MC4gIEluY2x1ZGVkIGZvciBjb21wbGlhbmNlIHdpdGgKLUBjICAgICAgb3RoZXIgYXNzZW1ibGVycy4KLUBjCi1AY2luZGV4IEBjb2Rle1x0fSAodGFiKQotQGNpbmRleCB0YWIgKEBjb2Rle1x0fSkKLUBpdGVtIFx0Ci1NbmVtb25pYyBmb3IgaG9yaXpvbnRhbCBUYWI7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDExLgotCi1AYyAgICAgIEBpdGVtIFx2Ci1AYyAgICAgIE1uZW1vbmljIGZvciBWZXJ0aWNhbCB0YWI7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDEzLgotQGMgICAgICBAaXRlbSBceCBAdmFye2RpZ2l0fSBAdmFye2RpZ2l0fSBAdmFye2RpZ2l0fQotQGMgICAgICBBIGhleGFkZWNpbWFsIGNoYXJhY3RlciBjb2RlLiAgVGhlIG51bWVyaWMgY29kZSBpcyAzIGhleGFkZWNpbWFsIGRpZ2l0cy4KLUBjCi1AY2luZGV4IEBjb2Rle1xAdmFye2RkZH19IChvY3RhbCBjaGFyYWN0ZXIgY29kZSkKLUBjaW5kZXggb2N0YWwgY2hhcmFjdGVyIGNvZGUgKEBjb2Rle1xAdmFye2RkZH19KQotQGl0ZW0gXCBAdmFye2RpZ2l0fSBAdmFye2RpZ2l0fSBAdmFye2RpZ2l0fQotQW4gb2N0YWwgY2hhcmFjdGVyIGNvZGUuICBUaGUgbnVtZXJpYyBjb2RlIGlzIDMgb2N0YWwgZGlnaXRzLgotRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBVbml4IHN5c3RlbXMsIDggYW5kIDkgYXJlIGFjY2VwdGVkIGFzIGRpZ2l0czoKLWZvciBleGFtcGxlLCBAY29kZXtcMDA4fSBoYXMgdGhlIHZhbHVlIDAxMCwgYW5kIEBjb2Rle1wwMDl9IHRoZSB2YWx1ZSAwMTEuCi0KLUBjaW5kZXggQGNvZGV7XEB2YXJ7eGQuLi59fSAoaGV4IGNoYXJhY3RlciBjb2RlKQotQGNpbmRleCBoZXggY2hhcmFjdGVyIGNvZGUgKEBjb2Rle1xAdmFye3hkLi4ufX0pCi1AaXRlbSBcQGNvZGV7eH0gQHZhcntoZXgtZGlnaXRzLi4ufQotQSBoZXggY2hhcmFjdGVyIGNvZGUuICBBbGwgdHJhaWxpbmcgaGV4IGRpZ2l0cyBhcmUgY29tYmluZWQuICBFaXRoZXIgdXBwZXIgb3IKLWxvd2VyIGNhc2UgQGNvZGV7eH0gd29ya3MuCi0KLUBjaW5kZXggQGNvZGV7XFx9IChAc2FtcHtcfSBjaGFyYWN0ZXIpCi1AY2luZGV4IGJhY2tzbGFzaCAoQGNvZGV7XFx9KQotQGl0ZW0gXFwKLVJlcHJlc2VudHMgb25lIEBzYW1we1x9IGNoYXJhY3Rlci4KLQotQGMgICAgICBAaXRlbSBcJwotQGMgICAgICBSZXByZXNlbnRzIG9uZSBAc2FtcHsnfSAoYWNjZW50IGFjdXRlKSBjaGFyYWN0ZXIuCi1AYyAgICAgIFRoaXMgaXMgbmVlZGVkIGluIHNpbmdsZSBjaGFyYWN0ZXIgbGl0ZXJhbHMKLUBjICAgICAgKEB4cmVme0NoYXJhY3RlcnMsLENoYXJhY3RlciBDb25zdGFudHN9LikgdG8gcmVwcmVzZW50Ci1AYyAgICAgIGEgQHNhbXB7J30uCi1AYwotQGNpbmRleCBAY29kZXtcIn0gKGRvdWJsZXF1b3RlIGNoYXJhY3RlcikKLUBjaW5kZXggZG91YmxlcXVvdGUgKEBjb2Rle1wifSkKLUBpdGVtIFwiCi1SZXByZXNlbnRzIG9uZSBAc2FtcHsifSBjaGFyYWN0ZXIuICBOZWVkZWQgaW4gc3RyaW5ncyB0byByZXByZXNlbnQKLXRoaXMgY2hhcmFjdGVyLCBiZWNhdXNlIGFuIHVuZXNjYXBlZCBAc2FtcHsifSB3b3VsZCBlbmQgdGhlIHN0cmluZy4KLQotQGl0ZW0gXCBAdmFye2FueXRoaW5nLWVsc2V9Ci1Bbnkgb3RoZXIgY2hhcmFjdGVyIHdoZW4gZXNjYXBlZCBieSBAa2Jke1x9IGdpdmVzIGEgd2FybmluZywgYnV0Ci1hc3NlbWJsZXMgYXMgaWYgdGhlIEBzYW1we1x9IHdhcyBub3QgcHJlc2VudC4gIFRoZSBpZGVhIGlzIHRoYXQgaWYKLXlvdSB1c2VkIGFuIGVzY2FwZSBzZXF1ZW5jZSB5b3UgY2xlYXJseSBkaWRuJ3Qgd2FudCB0aGUgbGl0ZXJhbAotaW50ZXJwcmV0YXRpb24gb2YgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIuICBIb3dldmVyIEBjb2Rle0B2YWx1ZXtBU319IGhhcyBubwotb3RoZXIgaW50ZXJwcmV0YXRpb24sIHNvIEBjb2Rle0B2YWx1ZXtBU319IGtub3dzIGl0IGlzIGdpdmluZyB5b3UgdGhlIHdyb25nCi1jb2RlIGFuZCB3YXJucyB5b3Ugb2YgdGhlIGZhY3QuCi1AZW5kIHRhYmxlCi0KLVdoaWNoIGNoYXJhY3RlcnMgYXJlIGVzY2FwYWJsZSwgYW5kIHdoYXQgdGhvc2UgZXNjYXBlcyByZXByZXNlbnQsCi12YXJpZXMgd2lkZWx5IGFtb25nIGFzc2VtYmxlcnMuICBUaGUgY3VycmVudCBzZXQgaXMgd2hhdCB3ZSB0aGluawotdGhlIEJTRCA0LjIgYXNzZW1ibGVyIHJlY29nbml6ZXMsIGFuZCBpcyBhIHN1YnNldCBvZiB3aGF0IG1vc3QgQwotY29tcGlsZXJzIHJlY29nbml6ZS4gIElmIHlvdSBhcmUgaW4gZG91YnQsIGRvIG5vdCB1c2UgYW4gZXNjYXBlCi1zZXF1ZW5jZS4KLQotQG5vZGUgQ2hhcnMKLUBzdWJzdWJzZWN0aW9uIENoYXJhY3RlcnMKLQotQGNpbmRleCBzaW5nbGUgY2hhcmFjdGVyIGNvbnN0YW50Ci1AY2luZGV4IGNoYXJhY3Rlciwgc2luZ2xlCi1AY2luZGV4IGNvbnN0YW50LCBzaW5nbGUgY2hhcmFjdGVyCi1BIHNpbmdsZSBjaGFyYWN0ZXIgbWF5IGJlIHdyaXR0ZW4gYXMgYSBzaW5nbGUgcXVvdGUgaW1tZWRpYXRlbHkKLWZvbGxvd2VkIGJ5IHRoYXQgY2hhcmFjdGVyLiAgVGhlIHNhbWUgZXNjYXBlcyBhcHBseSB0byBjaGFyYWN0ZXJzIGFzCi10byBzdHJpbmdzLiAgU28gaWYgeW91IHdhbnQgdG8gd3JpdGUgdGhlIGNoYXJhY3RlciBiYWNrc2xhc2gsIHlvdQotbXVzdCB3cml0ZSBAa2JkeydcXH0gd2hlcmUgdGhlIGZpcnN0IEBjb2Rle1x9IGVzY2FwZXMgdGhlIHNlY29uZAotQGNvZGV7XH0uICBBcyB5b3UgY2FuIHNlZSwgdGhlIHF1b3RlIGlzIGFuIGFjdXRlIGFjY2VudCwgbm90IGEKLWdyYXZlIGFjY2VudC4gIEEgbmV3bGluZQotQGlmY2xlYXIgR0VORVJJQwotQGlmY2xlYXIgYWJub3JtYWwtc2VwYXJhdG9yCi0ob3Igc2VtaWNvbG9uIEBzYW1wezt9KQotQGVuZCBpZmNsZWFyCi1AaWZzZXQgYWJub3JtYWwtc2VwYXJhdG9yCi1AaWZzZXQgQTI5SwotKG9yIGF0IHNpZ24gQHNhbXB7QEB9KQotQGVuZCBpZnNldAotQGlmc2V0IEg4Ci0ob3IgZG9sbGFyIHNpZ24gQHNhbXB7JH0sIGZvciB0aGUgSDgvMzAwOyBvciBzZW1pY29sb24gQHNhbXB7O30gZm9yIHRoZQotSGl0YWNoaSBTSCBvcgotSDgvNTAwKQotQGVuZCBpZnNldAotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1pbW1lZGlhdGVseSBmb2xsb3dpbmcgYW4gYWN1dGUgYWNjZW50IGlzIHRha2VuIGFzIGEgbGl0ZXJhbCBjaGFyYWN0ZXIKLWFuZCBkb2VzIG5vdCBjb3VudCBhcyB0aGUgZW5kIG9mIGEgc3RhdGVtZW50LiAgVGhlIHZhbHVlIG9mIGEgY2hhcmFjdGVyCi1jb25zdGFudCBpbiBhIG51bWVyaWMgZXhwcmVzc2lvbiBpcyB0aGUgbWFjaGluZSdzIGJ5dGUtd2lkZSBjb2RlIGZvcgotdGhhdCBjaGFyYWN0ZXIuICBAY29kZXtAdmFsdWV7QVN9fSBhc3N1bWVzIHlvdXIgY2hhcmFjdGVyIGNvZGUgaXMgQVNDSUk6Ci1Aa2JkeydBfSBtZWFucyA2NSwgQGtiZHsnQn0gbWVhbnMgNjYsIGFuZCBzbyBvbi4gQHJlZmlsbAotCi1Abm9kZSBOdW1iZXJzCi1Ac3Vic2VjdGlvbiBOdW1iZXIgQ29uc3RhbnRzCi0KLUBjaW5kZXggY29uc3RhbnRzLCBudW1iZXIKLUBjaW5kZXggbnVtYmVyIGNvbnN0YW50cwotQGNvZGV7QHZhbHVle0FTfX0gZGlzdGluZ3Vpc2hlcyB0aHJlZSBraW5kcyBvZiBudW1iZXJzIGFjY29yZGluZyB0byBob3cgdGhleQotYXJlIHN0b3JlZCBpbiB0aGUgdGFyZ2V0IG1hY2hpbmUuICBAZW1waHtJbnRlZ2Vyc30gYXJlIG51bWJlcnMgdGhhdAotd291bGQgZml0IGludG8gYW4gQGNvZGV7aW50fSBpbiB0aGUgQyBsYW5ndWFnZS4gIEBlbXBoe0JpZ251bXN9IGFyZQotaW50ZWdlcnMsIGJ1dCB0aGV5IGFyZSBzdG9yZWQgaW4gbW9yZSB0aGFuIDMyIGJpdHMuICBAZW1waHtGbG9udW1zfQotYXJlIGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIGRlc2NyaWJlZCBiZWxvdy4KLQotQG1lbnUKLSogSW50ZWdlcnM6OiAgICAgICAgICAgICAgICAgICAgSW50ZWdlcnMKLSogQmlnbnVtczo6ICAgICAgICAgICAgICAgICAgICAgQmlnbnVtcwotKiBGbG9udW1zOjogICAgICAgICAgICAgICAgICAgICBGbG9udW1zCi1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSTk2MAotKiBCaXQgRmllbGRzOjogICAgICAgICAgICAgICAgICBCaXQgRmllbGRzCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLUBlbmQgbWVudQotCi1Abm9kZSBJbnRlZ2VycwotQHN1YnN1YnNlY3Rpb24gSW50ZWdlcnMKLUBjaW5kZXggaW50ZWdlcnMKLUBjaW5kZXggY29uc3RhbnRzLCBpbnRlZ2VyCi0KLUBjaW5kZXggYmluYXJ5IGludGVnZXJzCi1AY2luZGV4IGludGVnZXJzLCBiaW5hcnkKLUEgYmluYXJ5IGludGVnZXIgaXMgQHNhbXB7MGJ9IG9yIEBzYW1wezBCfSBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgb2YKLXRoZSBiaW5hcnkgZGlnaXRzIEBzYW1wezAxfS4KLQotQGNpbmRleCBvY3RhbCBpbnRlZ2VycwotQGNpbmRleCBpbnRlZ2Vycywgb2N0YWwKLUFuIG9jdGFsIGludGVnZXIgaXMgQHNhbXB7MH0gZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIG9mIHRoZSBvY3RhbAotZGlnaXRzIChAc2FtcHswMTIzNDU2N30pLgotCi1AY2luZGV4IGRlY2ltYWwgaW50ZWdlcnMKLUBjaW5kZXggaW50ZWdlcnMsIGRlY2ltYWwKLUEgZGVjaW1hbCBpbnRlZ2VyIHN0YXJ0cyB3aXRoIGEgbm9uLXplcm8gZGlnaXQgZm9sbG93ZWQgYnkgemVybyBvcgotbW9yZSBkaWdpdHMgKEBzYW1wezAxMjM0NTY3ODl9KS4KLQotQGNpbmRleCBoZXhhZGVjaW1hbCBpbnRlZ2VycwotQGNpbmRleCBpbnRlZ2VycywgaGV4YWRlY2ltYWwKLUEgaGV4YWRlY2ltYWwgaW50ZWdlciBpcyBAc2FtcHsweH0gb3IgQHNhbXB7MFh9IGZvbGxvd2VkIGJ5IG9uZSBvcgotbW9yZSBoZXhhZGVjaW1hbCBkaWdpdHMgY2hvc2VuIGZyb20gQHNhbXB7MDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRn0uCi0KLUludGVnZXJzIGhhdmUgdGhlIHVzdWFsIHZhbHVlcy4gIFRvIGRlbm90ZSBhIG5lZ2F0aXZlIGludGVnZXIsIHVzZQotdGhlIHByZWZpeCBvcGVyYXRvciBAc2FtcHstfSBkaXNjdXNzZWQgdW5kZXIgZXhwcmVzc2lvbnMKLShAcHhyZWZ7UHJlZml4IE9wcywsUHJlZml4IE9wZXJhdG9yc30pLgotCi1Abm9kZSBCaWdudW1zCi1Ac3Vic3Vic2VjdGlvbiBCaWdudW1zCi0KLUBjaW5kZXggYmlnbnVtcwotQGNpbmRleCBjb25zdGFudHMsIGJpZ251bQotQSBAZGZue2JpZ251bX0gaGFzIHRoZSBzYW1lIHN5bnRheCBhbmQgc2VtYW50aWNzIGFzIGFuIGludGVnZXIKLWV4Y2VwdCB0aGF0IHRoZSBudW1iZXIgKG9yIGl0cyBuZWdhdGl2ZSkgdGFrZXMgbW9yZSB0aGFuIDMyIGJpdHMgdG8KLXJlcHJlc2VudCBpbiBiaW5hcnkuICBUaGUgZGlzdGluY3Rpb24gaXMgbWFkZSBiZWNhdXNlIGluIHNvbWUgcGxhY2VzCi1pbnRlZ2VycyBhcmUgcGVybWl0dGVkIHdoaWxlIGJpZ251bXMgYXJlIG5vdC4KLQotQG5vZGUgRmxvbnVtcwotQHN1YnN1YnNlY3Rpb24gRmxvbnVtcwotQGNpbmRleCBmbG9udW1zCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50IG51bWJlcnMKLUBjaW5kZXggY29uc3RhbnRzLCBmbG9hdGluZyBwb2ludAotCi1AY2luZGV4IHByZWNpc2lvbiwgZmxvYXRpbmcgcG9pbnQKLUEgQGRmbntmbG9udW19IHJlcHJlc2VudHMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuICBUaGUgdHJhbnNsYXRpb24gaXMKLWluZGlyZWN0OiBhIGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGZyb20gdGhlIHRleHQgaXMgY29udmVydGVkIGJ5Ci1AY29kZXtAdmFsdWV7QVN9fSB0byBhIGdlbmVyaWMgYmluYXJ5IGZsb2F0aW5nIHBvaW50IG51bWJlciBvZiBtb3JlIHRoYW4KLXN1ZmZpY2llbnQgcHJlY2lzaW9uLiAgVGhpcyBnZW5lcmljIGZsb2F0aW5nIHBvaW50IG51bWJlciBpcyBjb252ZXJ0ZWQKLXRvIGEgcGFydGljdWxhciBjb21wdXRlcidzIGZsb2F0aW5nIHBvaW50IGZvcm1hdCAob3IgZm9ybWF0cykgYnkgYQotcG9ydGlvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBzcGVjaWFsaXplZCB0byB0aGF0IGNvbXB1dGVyLgotCi1BIGZsb251bSBpcyB3cml0dGVuIGJ5IHdyaXRpbmcgKGluIG9yZGVyKQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSBkaWdpdCBAc2FtcHswfS4KLUBpZnNldCBIUFBBCi0oQHNhbXB7MH0gaXMgb3B0aW9uYWwgb24gdGhlIEhQUEEuKQotQGVuZCBpZnNldAotCi1AaXRlbQotQSBsZXR0ZXIsIHRvIHRlbGwgQGNvZGV7QHZhbHVle0FTfX0gdGhlIHJlc3Qgb2YgdGhlIG51bWJlciBpcyBhIGZsb251bS4KLUBpZnNldCBHRU5FUklDCi1Aa2Jke2V9IGlzIHJlY29tbWVuZGVkLiAgQ2FzZSBpcyBub3QgaW1wb3J0YW50LgotQGlnbm9yZQotQGMgRklYTUU6IHZlcmlmeSBpZiBmbG9udW0gc3ludGF4IHJlYWxseSB0aGlzIHZhZ3VlIGZvciBtb3N0IGNhc2VzCi0oQW55IG90aGVyd2lzZSBpbGxlZ2FsIGxldHRlciB3b3JrcyBoZXJlLCBidXQgdGhhdCBtaWdodCBiZSBjaGFuZ2VkLiAgVmF4IEJTRAotNC4yIGFzc2VtYmxlciBzZWVtcyB0byBhbGxvdyBhbnkgb2YgQHNhbXB7ZGVmZ2hERUZHSH0uKQotQGVuZCBpZ25vcmUKLQotT24gdGhlIEg4LzMwMCwgSDgvNTAwLAotSGl0YWNoaSBTSCwKLWFuZCBBTUQgMjlLIGFyY2hpdGVjdHVyZXMsIHRoZSBsZXR0ZXIgbXVzdCBiZQotb25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGUFJTWH0gKGluIHVwcGVyIG9yIGxvd2VyIGNhc2UpLgotCi1PbiB0aGUgQVJDLCB0aGUgbGV0dGVyIG11c3QgYmUgb25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGUlN9Ci0oaW4gdXBwZXIgb3IgbG93ZXIgY2FzZSkuCi0KLU9uIHRoZSBJbnRlbCA5NjAgYXJjaGl0ZWN0dXJlLCB0aGUgbGV0dGVyIG11c3QgYmUKLW9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlR9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLQotT24gdGhlIEhQUEEgYXJjaGl0ZWN0dXJlLCB0aGUgbGV0dGVyIG11c3QgYmUgQHNhbXB7RX0gKHVwcGVyIGNhc2Ugb25seSkuCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgQTI5SwotT25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGUFJTWH0gKGluIHVwcGVyIG9yIGxvd2VyIGNhc2UpLgotQGVuZCBpZnNldAotQGlmc2V0IEFSQwotT25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGUlN9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLUBlbmQgaWZzZXQKLUBpZnNldCBIOAotT25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGUFJTWH0gKGluIHVwcGVyIG9yIGxvd2VyIGNhc2UpLgotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLVRoZSBsZXR0ZXIgQHNhbXB7RX0gKHVwcGVyIGNhc2Ugb25seSkuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSTk2MAotT25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGVH0gKGluIHVwcGVyIG9yIGxvd2VyIGNhc2UpLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBpdGVtCi1BbiBvcHRpb25hbCBzaWduOiBlaXRoZXIgQHNhbXB7K30gb3IgQHNhbXB7LX0uCi0KLUBpdGVtCi1BbiBvcHRpb25hbCBAZGZue2ludGVnZXIgcGFydH06IHplcm8gb3IgbW9yZSBkZWNpbWFsIGRpZ2l0cy4KLQotQGl0ZW0KLUFuIG9wdGlvbmFsIEBkZm57ZnJhY3Rpb25hbCBwYXJ0fTogQHNhbXB7Ln0gZm9sbG93ZWQgYnkgemVybwotb3IgbW9yZSBkZWNpbWFsIGRpZ2l0cy4KLQotQGl0ZW0KLUFuIG9wdGlvbmFsIGV4cG9uZW50LCBjb25zaXN0aW5nIG9mOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQW4gQHNhbXB7RX0gb3IgQHNhbXB7ZX0uCi1AYyBJIGNhbid0IGZpbmQgYSBjb25maWcgd2hlcmUgIkVYUF9DSEFSUyIgaXMgb3RoZXIgdGhhbiAnZUUnLCBidXQgaW4KLUBjIHByaW5jaXBsZSB0aGlzIGNhbiBwZXJmZWN0bHkgd2VsbCBiZSBkaWZmZXJlbnQgb24gZGlmZmVyZW50IHRhcmdldHMuCi1AaXRlbQotT3B0aW9uYWwgc2lnbjogZWl0aGVyIEBzYW1weyt9IG9yIEBzYW1wey19LgotQGl0ZW0KLU9uZSBvciBtb3JlIGRlY2ltYWwgZGlnaXRzLgotQGVuZCBpdGVtaXplCi0KLUBlbmQgaXRlbWl6ZQotCi1BdCBsZWFzdCBvbmUgb2YgdGhlIGludGVnZXIgcGFydCBvciB0aGUgZnJhY3Rpb25hbCBwYXJ0IG11c3QgYmUKLXByZXNlbnQuICBUaGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGhhcyB0aGUgdXN1YWwgYmFzZS0xMCB2YWx1ZS4KLQotQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBhbGwgcHJvY2Vzc2luZyB1c2luZyBpbnRlZ2Vycy4gIEZsb251bXMgYXJlIGNvbXB1dGVkCi1pbmRlcGVuZGVudGx5IG9mIGFueSBmbG9hdGluZyBwb2ludCBoYXJkd2FyZSBpbiB0aGUgY29tcHV0ZXIgcnVubmluZwotQGNvZGV7QHZhbHVle0FTfX0uCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBJOTYwCi1AYyBCaXQgZmllbGRzIGFyZSB3cml0dGVuIGFzIGEgZ2VuZXJhbCBmYWNpbGl0eSBidXQgYXJlIGFsc28gY29udHJvbGxlZAotQGMgYnkgYSBjb25kaXRpb25hbC1jb21waWxhdGlvbiBmbGFnLS0td2hpY2ggaXMgYXMgb2Ygbm93ICgyMW1hcjkxKQotQGMgdHVybmVkIG9uIG9ubHkgYnkgdGhlIGk5NjAgY29uZmlnIG9mIEdBUy4KLUBub2RlIEJpdCBGaWVsZHMKLUBzdWJzdWJzZWN0aW9uIEJpdCBGaWVsZHMKLQotQGNpbmRleCBiaXQgZmllbGRzCi1AY2luZGV4IGNvbnN0YW50cywgYml0IGZpZWxkCi1Zb3UgY2FuIGFsc28gZGVmaW5lIG51bWVyaWMgY29uc3RhbnRzIGFzIEBkZm57Yml0IGZpZWxkc30uCi1zcGVjaWZ5IHR3byBudW1iZXJzIHNlcGFyYXRlZCBieSBhIGNvbG9uLS0tCi1AZXhhbXBsZQotQHZhcnttYXNrfTpAdmFye3ZhbHVlfQotQGVuZCBleGFtcGxlCi1Abm9pbmRlbnQKLUBjb2Rle0B2YWx1ZXtBU319IGFwcGxpZXMgYSBiaXR3aXNlIEBzY3thbmR9IGJldHdlZW4gQHZhcnttYXNrfSBhbmQKLUB2YXJ7dmFsdWV9LgotCi1UaGUgcmVzdWx0aW5nIG51bWJlciBpcyB0aGVuIHBhY2tlZAotQGlmc2V0IEdFTkVSSUMKLUBjIHRoaXMgY29uZGl0aW9uYWwgcGFyZW4gaW4gY2FzZSBiaXQgZmllbGRzIHR1cm5lZCBvbiBlbHNld2hlcmUgdGhhbiA5NjAKLShpbiBob3N0LWRlcGVuZGVudCBieXRlIG9yZGVyKQotQGVuZCBpZnNldAotaW50byBhIGZpZWxkIHdob3NlIHdpZHRoIGRlcGVuZHMgb24gd2hpY2ggYXNzZW1ibGVyIGRpcmVjdGl2ZSBoYXMgdGhlCi1iaXQtZmllbGQgYXMgaXRzIGFyZ3VtZW50LiAgT3ZlcmZsb3cgKGEgcmVzdWx0IGZyb20gdGhlIGJpdHdpc2UgYW5kCi1yZXF1aXJpbmcgbW9yZSBiaW5hcnkgZGlnaXRzIHRvIHJlcHJlc2VudCkgaXMgbm90IGFuIGVycm9yOyBpbnN0ZWFkLAotbW9yZSBjb25zdGFudHMgYXJlIGdlbmVyYXRlZCwgb2YgdGhlIHNwZWNpZmllZCB3aWR0aCwgYmVnaW5uaW5nIHdpdGggdGhlCi1sZWFzdCBzaWduaWZpY2FudCBkaWdpdHMuQHJlZmlsbAotCi1UaGUgZGlyZWN0aXZlcyBAY29kZXsuYnl0ZX0sIEBjb2Rley5od29yZH0sIEBjb2Rley5pbnR9LCBAY29kZXsubG9uZ30sCi1AY29kZXsuc2hvcnR9LCBhbmQgQGNvZGV7LndvcmR9IGFjY2VwdCBiaXQtZmllbGQgYXJndW1lbnRzLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBub2RlIFNlY3Rpb25zCi1AY2hhcHRlciBTZWN0aW9ucyBhbmQgUmVsb2NhdGlvbgotQGNpbmRleCBzZWN0aW9ucwotQGNpbmRleCByZWxvY2F0aW9uCi0KLUBtZW51Ci0qIFNlY3MgQmFja2dyb3VuZDo6ICAgICAgICAgICAgIEJhY2tncm91bmQKLSogTGQgU2VjdGlvbnM6OiAgICAgICAgICAgICAgICAgTGlua2VyIFNlY3Rpb25zCi0qIEFzIFNlY3Rpb25zOjogICAgICAgICAgICAgICAgIEFzc2VtYmxlciBJbnRlcm5hbCBTZWN0aW9ucwotKiBTdWItU2VjdGlvbnM6OiAgICAgICAgICAgICAgICBTdWItU2VjdGlvbnMKLSogYnNzOjogICAgICAgICAgICAgICAgICAgICAgICAgYnNzIFNlY3Rpb24KLUBlbmQgbWVudQotCi1Abm9kZSBTZWNzIEJhY2tncm91bmQKLUBzZWN0aW9uIEJhY2tncm91bmQKLQotUm91Z2hseSwgYSBzZWN0aW9uIGlzIGEgcmFuZ2Ugb2YgYWRkcmVzc2VzLCB3aXRoIG5vIGdhcHM7IGFsbCBkYXRhCi1gYGluJycgdGhvc2UgYWRkcmVzc2VzIGlzIHRyZWF0ZWQgdGhlIHNhbWUgZm9yIHNvbWUgcGFydGljdWxhciBwdXJwb3NlLgotRm9yIGV4YW1wbGUgdGhlcmUgbWF5IGJlIGEgYGByZWFkIG9ubHknJyBzZWN0aW9uLgotCi1AY2luZGV4IGxpbmtlciwgYW5kIGFzc2VtYmxlcgotQGNpbmRleCBhc3NlbWJsZXIsIGFuZCBsaW5rZXIKLVRoZSBsaW5rZXIgQGNvZGV7QHZhbHVle0xEfX0gcmVhZHMgbWFueSBvYmplY3QgZmlsZXMgKHBhcnRpYWwgcHJvZ3JhbXMpIGFuZAotY29tYmluZXMgdGhlaXIgY29udGVudHMgdG8gZm9ybSBhIHJ1bm5hYmxlIHByb2dyYW0uICBXaGVuIEBjb2Rle0B2YWx1ZXtBU319Ci1lbWl0cyBhbiBvYmplY3QgZmlsZSwgdGhlIHBhcnRpYWwgcHJvZ3JhbSBpcyBhc3N1bWVkIHRvIHN0YXJ0IGF0IGFkZHJlc3MgMC4KLUBjb2Rle0B2YWx1ZXtMRH19IGFzc2lnbnMgdGhlIGZpbmFsIGFkZHJlc3NlcyBmb3IgdGhlIHBhcnRpYWwgcHJvZ3JhbSwgc28gdGhhdAotZGlmZmVyZW50IHBhcnRpYWwgcHJvZ3JhbXMgZG8gbm90IG92ZXJsYXAuICBUaGlzIGlzIGFjdHVhbGx5IGFuCi1vdmVyc2ltcGxpZmljYXRpb24sIGJ1dCBpdCBzdWZmaWNlcyB0byBleHBsYWluIGhvdyBAY29kZXtAdmFsdWV7QVN9fSB1c2VzCi1zZWN0aW9ucy4KLQotQGNvZGV7QHZhbHVle0xEfX0gbW92ZXMgYmxvY2tzIG9mIGJ5dGVzIG9mIHlvdXIgcHJvZ3JhbSB0byB0aGVpciBydW4tdGltZQotYWRkcmVzc2VzLiAgVGhlc2UgYmxvY2tzIHNsaWRlIHRvIHRoZWlyIHJ1bi10aW1lIGFkZHJlc3NlcyBhcyByaWdpZAotdW5pdHM7IHRoZWlyIGxlbmd0aCBkb2VzIG5vdCBjaGFuZ2UgYW5kIG5laXRoZXIgZG9lcyB0aGUgb3JkZXIgb2YgYnl0ZXMKLXdpdGhpbiB0aGVtLiAgU3VjaCBhIHJpZ2lkIHVuaXQgaXMgY2FsbGVkIGEgQGVtcGh7c2VjdGlvbn0uICBBc3NpZ25pbmcKLXJ1bi10aW1lIGFkZHJlc3NlcyB0byBzZWN0aW9ucyBpcyBjYWxsZWQgQGRmbntyZWxvY2F0aW9ufS4gIEl0IGluY2x1ZGVzCi10aGUgdGFzayBvZiBhZGp1c3RpbmcgbWVudGlvbnMgb2Ygb2JqZWN0LWZpbGUgYWRkcmVzc2VzIHNvIHRoZXkgcmVmZXIgdG8KLXRoZSBwcm9wZXIgcnVuLXRpbWUgYWRkcmVzc2VzLgotQGlmc2V0IEg4Ci1Gb3IgdGhlIEg4LzMwMCBhbmQgSDgvNTAwLAotYW5kIGZvciB0aGUgSGl0YWNoaSBTSCwKLUBjb2Rle0B2YWx1ZXtBU319IHBhZHMgc2VjdGlvbnMgaWYgbmVlZGVkIHRvCi1lbnN1cmUgdGhleSBlbmQgb24gYSB3b3JkIChzaXh0ZWVuIGJpdCkgYm91bmRhcnkuCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggc3RhbmRhcmQgYXNzZW1ibGVyIHNlY3Rpb25zCi1BbiBvYmplY3QgZmlsZSB3cml0dGVuIGJ5IEBjb2Rle0B2YWx1ZXtBU319IGhhcyBhdCBsZWFzdCB0aHJlZSBzZWN0aW9ucywgYW55Ci1vZiB3aGljaCBtYXkgYmUgZW1wdHkuICBUaGVzZSBhcmUgbmFtZWQgQGRmbnt0ZXh0fSwgQGRmbntkYXRhfSBhbmQKLUBkZm57YnNzfSBzZWN0aW9ucy4KLQotQGlmc2V0IENPRkYKLUBpZnNldCBHRU5FUklDCi1XaGVuIGl0IGdlbmVyYXRlcyBDT0ZGIG91dHB1dCwKLUBlbmQgaWZzZXQKLUBjb2Rle0B2YWx1ZXtBU319IGNhbiBhbHNvIGdlbmVyYXRlIHdoYXRldmVyIG90aGVyIG5hbWVkIHNlY3Rpb25zIHlvdSBzcGVjaWZ5Ci11c2luZyB0aGUgQHNhbXB7LnNlY3Rpb259IGRpcmVjdGl2ZSAoQHB4cmVme1NlY3Rpb24sLEBjb2Rley5zZWN0aW9ufX0pLgotSWYgeW91IGRvIG5vdCB1c2UgYW55IGRpcmVjdGl2ZXMgdGhhdCBwbGFjZSBvdXRwdXQgaW4gdGhlIEBzYW1wey50ZXh0fQotb3IgQHNhbXB7LmRhdGF9IHNlY3Rpb25zLCB0aGVzZSBzZWN0aW9ucyBzdGlsbCBleGlzdCwgYnV0IGFyZSBlbXB0eS4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEhQUEEKLUBpZnNldCBHRU5FUklDCi1XaGVuIEBjb2Rle0B2YWx1ZXtBU319IGdlbmVyYXRlcyBTT00gb3IgRUxGIG91dHB1dCBmb3IgdGhlIEhQUEEsCi1AZW5kIGlmc2V0Ci1AY29kZXtAdmFsdWV7QVN9fSBjYW4gYWxzbyBnZW5lcmF0ZSB3aGF0ZXZlciBvdGhlciBuYW1lZCBzZWN0aW9ucyB5b3UKLXNwZWNpZnkgdXNpbmcgdGhlIEBzYW1wey5zcGFjZX0gYW5kIEBzYW1wey5zdWJzcGFjZX0gZGlyZWN0aXZlcy4gIFNlZQotQGNpdGV7SFA5MDAwIFNlcmllcyA4MDAgQXNzZW1ibHkgTGFuZ3VhZ2UgUmVmZXJlbmNlIE1hbnVhbH0KLShIUCA5MjQzMi05MDAwMSkgZm9yIGRldGFpbHMgb24gdGhlIEBzYW1wey5zcGFjZX0gYW5kIEBzYW1wey5zdWJzcGFjZX0KLWFzc2VtYmxlciBkaXJlY3RpdmVzLgotCi1AaWZzZXQgU09NCi1BZGRpdGlvbmFsbHksIEBjb2Rle0B2YWx1ZXtBU319IHVzZXMgZGlmZmVyZW50IG5hbWVzIGZvciB0aGUgc3RhbmRhcmQKLXRleHQsIGRhdGEsIGFuZCBic3Mgc2VjdGlvbnMgd2hlbiBnZW5lcmF0aW5nIFNPTSBvdXRwdXQuICBQcm9ncmFtIHRleHQKLWlzIHBsYWNlZCBpbnRvIHRoZSBAc2FtcHskQ09ERSR9IHNlY3Rpb24sIGRhdGEgaW50byBAc2FtcHskREFUQSR9LCBhbmQKLUJTUyBpbnRvIEBzYW1weyRCU1MkfS4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotV2l0aGluIHRoZSBvYmplY3QgZmlsZSwgdGhlIHRleHQgc2VjdGlvbiBzdGFydHMgYXQgYWRkcmVzcyBAY29kZXswfSwgdGhlCi1kYXRhIHNlY3Rpb24gZm9sbG93cywgYW5kIHRoZSBic3Mgc2VjdGlvbiBmb2xsb3dzIHRoZSBkYXRhIHNlY3Rpb24uCi0KLUBpZnNldCBIUFBBCi1XaGVuIGdlbmVyYXRpbmcgZWl0aGVyIFNPTSBvciBFTEYgb3V0cHV0IGZpbGVzIG9uIHRoZSBIUFBBLCB0aGUgdGV4dAotc2VjdGlvbiBzdGFydHMgYXQgYWRkcmVzcyBAY29kZXswfSwgdGhlIGRhdGEgc2VjdGlvbiBhdCBhZGRyZXNzCi1AY29kZXsweDQwMDAwMDB9LCBhbmQgdGhlIGJzcyBzZWN0aW9uIGZvbGxvd3MgdGhlIGRhdGEgc2VjdGlvbi4KLUBlbmQgaWZzZXQKLQotVG8gbGV0IEBjb2Rle0B2YWx1ZXtMRH19IGtub3cgd2hpY2ggZGF0YSBjaGFuZ2VzIHdoZW4gdGhlIHNlY3Rpb25zIGFyZQotcmVsb2NhdGVkLCBhbmQgaG93IHRvIGNoYW5nZSB0aGF0IGRhdGEsIEBjb2Rle0B2YWx1ZXtBU319IGFsc28gd3JpdGVzIHRvIHRoZQotb2JqZWN0IGZpbGUgZGV0YWlscyBvZiB0aGUgcmVsb2NhdGlvbiBuZWVkZWQuICBUbyBwZXJmb3JtIHJlbG9jYXRpb24KLUBjb2Rle0B2YWx1ZXtMRH19IG11c3Qga25vdywgZWFjaCB0aW1lIGFuIGFkZHJlc3MgaW4gdGhlIG9iamVjdAotZmlsZSBpcyBtZW50aW9uZWQ6Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotV2hlcmUgaW4gdGhlIG9iamVjdCBmaWxlIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyByZWZlcmVuY2UgdG8KLWFuIGFkZHJlc3M/Ci1AaXRlbQotSG93IGxvbmcgKGluIGJ5dGVzKSBpcyB0aGlzIHJlZmVyZW5jZT8KLUBpdGVtCi1XaGljaCBzZWN0aW9uIGRvZXMgdGhlIGFkZHJlc3MgcmVmZXIgdG8/ICBXaGF0IGlzIHRoZSBudW1lcmljIHZhbHVlIG9mCi1AZGlzcGxheQotKEB2YXJ7YWRkcmVzc30pIEBtaW51c3t9IChAdmFye3N0YXJ0LWFkZHJlc3Mgb2Ygc2VjdGlvbn0pPwotQGVuZCBkaXNwbGF5Ci1AaXRlbQotSXMgdGhlIHJlZmVyZW5jZSB0byBhbiBhZGRyZXNzIGBgUHJvZ3JhbS1Db3VudGVyIHJlbGF0aXZlJyc/Ci1AZW5kIGl0ZW1pemUKLQotQGNpbmRleCBhZGRyZXNzZXMsIGZvcm1hdCBvZgotQGNpbmRleCBzZWN0aW9uLXJlbGF0aXZlIGFkZHJlc3NpbmcKLUluIGZhY3QsIGV2ZXJ5IGFkZHJlc3MgQGNvZGV7QHZhbHVle0FTfX0gZXZlciB1c2VzIGlzIGV4cHJlc3NlZCBhcwotQGRpc3BsYXkKLShAdmFye3NlY3Rpb259KSArIChAdmFye29mZnNldCBpbnRvIHNlY3Rpb259KQotQGVuZCBkaXNwbGF5Ci1Abm9pbmRlbnQKLUZ1cnRoZXIsIG1vc3QgZXhwcmVzc2lvbnMgQGNvZGV7QHZhbHVle0FTfX0gY29tcHV0ZXMgaGF2ZSB0aGlzIHNlY3Rpb24tcmVsYXRpdmUKLW5hdHVyZS4KLUBpZnNldCBTT00KLShGb3Igc29tZSBvYmplY3QgZm9ybWF0cywgc3VjaCBhcyBTT00gZm9yIHRoZSBIUFBBLCBzb21lIGV4cHJlc3Npb25zIGFyZQotc3ltYm9sLXJlbGF0aXZlIGluc3RlYWQuKQotQGVuZCBpZnNldAotCi1JbiB0aGlzIG1hbnVhbCB3ZSB1c2UgdGhlIG5vdGF0aW9uIEB7QHZhcntzZWNuYW1lfSBAdmFye059QH0gdG8gbWVhbiBgYG9mZnNldAotQHZhcntOfSBpbnRvIHNlY3Rpb24gQHZhcntzZWNuYW1lfS4nJwotCi1BcGFydCBmcm9tIHRleHQsIGRhdGEgYW5kIGJzcyBzZWN0aW9ucyB5b3UgbmVlZCB0byBrbm93IGFib3V0IHRoZQotQGRmbnthYnNvbHV0ZX0gc2VjdGlvbi4gIFdoZW4gQGNvZGV7QHZhbHVle0xEfX0gbWl4ZXMgcGFydGlhbCBwcm9ncmFtcywKLWFkZHJlc3NlcyBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbiByZW1haW4gdW5jaGFuZ2VkLiAgRm9yIGV4YW1wbGUsIGFkZHJlc3MKLUBjb2Rle0B7YWJzb2x1dGUgMEB9fSBpcyBgYHJlbG9jYXRlZCcnIHRvIHJ1bi10aW1lIGFkZHJlc3MgMCBieQotQGNvZGV7QHZhbHVle0xEfX0uICBBbHRob3VnaCB0aGUgbGlua2VyIG5ldmVyIGFycmFuZ2VzIHR3byBwYXJ0aWFsIHByb2dyYW1zJwotZGF0YSBzZWN0aW9ucyB3aXRoIG92ZXJsYXBwaW5nIGFkZHJlc3NlcyBhZnRlciBsaW5raW5nLCBAZW1waHtieSBkZWZpbml0aW9ufQotdGhlaXIgYWJzb2x1dGUgc2VjdGlvbnMgbXVzdCBvdmVybGFwLiAgQWRkcmVzcyBAY29kZXtAe2Fic29sdXRlQCAyMzlAfX0gaW4gb25lCi1wYXJ0IG9mIGEgcHJvZ3JhbSBpcyBhbHdheXMgdGhlIHNhbWUgYWRkcmVzcyB3aGVuIHRoZSBwcm9ncmFtIGlzIHJ1bm5pbmcgYXMKLWFkZHJlc3MgQGNvZGV7QHthYnNvbHV0ZUAgMjM5QH19IGluIGFueSBvdGhlciBwYXJ0IG9mIHRoZSBwcm9ncmFtLgotCi1UaGUgaWRlYSBvZiBzZWN0aW9ucyBpcyBleHRlbmRlZCB0byB0aGUgQGRmbnt1bmRlZmluZWR9IHNlY3Rpb24uICBBbnkKLWFkZHJlc3Mgd2hvc2Ugc2VjdGlvbiBpcyB1bmtub3duIGF0IGFzc2VtYmx5IHRpbWUgaXMgYnkgZGVmaW5pdGlvbgotcmVuZGVyZWQgQHt1bmRlZmluZWQgQHZhcntVfUB9LS0td2hlcmUgQHZhcntVfSBpcyBmaWxsZWQgaW4gbGF0ZXIuCi1TaW5jZSBudW1iZXJzIGFyZSBhbHdheXMgZGVmaW5lZCwgdGhlIG9ubHkgd2F5IHRvIGdlbmVyYXRlIGFuIHVuZGVmaW5lZAotYWRkcmVzcyBpcyB0byBtZW50aW9uIGFuIHVuZGVmaW5lZCBzeW1ib2wuICBBIHJlZmVyZW5jZSB0byBhIG5hbWVkCi1jb21tb24gYmxvY2sgd291bGQgYmUgc3VjaCBhIHN5bWJvbDogaXRzIHZhbHVlIGlzIHVua25vd24gYXQgYXNzZW1ibHkKLXRpbWUgc28gaXQgaGFzIHNlY3Rpb24gQGVtcGh7dW5kZWZpbmVkfS4KLQotQnkgYW5hbG9neSB0aGUgd29yZCBAZW1waHtzZWN0aW9ufSBpcyB1c2VkIHRvIGRlc2NyaWJlIGdyb3VwcyBvZiBzZWN0aW9ucyBpbgotdGhlIGxpbmtlZCBwcm9ncmFtLiAgQGNvZGV7QHZhbHVle0xEfX0gcHV0cyBhbGwgcGFydGlhbCBwcm9ncmFtcycgdGV4dAotc2VjdGlvbnMgaW4gY29udGlndW91cyBhZGRyZXNzZXMgaW4gdGhlIGxpbmtlZCBwcm9ncmFtLiAgSXQgaXMKLWN1c3RvbWFyeSB0byByZWZlciB0byB0aGUgQGVtcGh7dGV4dCBzZWN0aW9ufSBvZiBhIHByb2dyYW0sIG1lYW5pbmcgYWxsCi10aGUgYWRkcmVzc2VzIG9mIGFsbCBwYXJ0aWFsIHByb2dyYW1zJyB0ZXh0IHNlY3Rpb25zLiAgTGlrZXdpc2UgZm9yCi1kYXRhIGFuZCBic3Mgc2VjdGlvbnMuCi0KLVNvbWUgc2VjdGlvbnMgYXJlIG1hbmlwdWxhdGVkIGJ5IEBjb2Rle0B2YWx1ZXtMRH19OyBvdGhlcnMgYXJlIGludmVudGVkIGZvcgotdXNlIG9mIEBjb2Rle0B2YWx1ZXtBU319IGFuZCBoYXZlIG5vIG1lYW5pbmcgZXhjZXB0IGR1cmluZyBhc3NlbWJseS4KLQotQG5vZGUgTGQgU2VjdGlvbnMKLUBzZWN0aW9uIExpbmtlciBTZWN0aW9ucwotQGNvZGV7QHZhbHVle0xEfX0gZGVhbHMgd2l0aCBqdXN0IGZvdXIga2luZHMgb2Ygc2VjdGlvbnMsIHN1bW1hcml6ZWQgYmVsb3cuCi0KLUB0YWJsZSBAc3Ryb25nCi0KLUBpZnNldCBDT0ZGCi1AY2luZGV4IG5hbWVkIHNlY3Rpb25zCi1AY2luZGV4IHNlY3Rpb25zLCBuYW1lZAotQGl0ZW0gbmFtZWQgc2VjdGlvbnMKLUBlbmQgaWZzZXQKLUBpZnNldCBhb3V0LWJvdXQKLUBjaW5kZXggdGV4dCBzZWN0aW9uCi1AY2luZGV4IGRhdGEgc2VjdGlvbgotQGl0ZW14IHRleHQgc2VjdGlvbgotQGl0ZW14IGRhdGEgc2VjdGlvbgotQGVuZCBpZnNldAotVGhlc2Ugc2VjdGlvbnMgaG9sZCB5b3VyIHByb2dyYW0uICBAY29kZXtAdmFsdWV7QVN9fSBhbmQgQGNvZGV7QHZhbHVle0xEfX0gdHJlYXQgdGhlbSBhcwotc2VwYXJhdGUgYnV0IGVxdWFsIHNlY3Rpb25zLiAgQW55dGhpbmcgeW91IGNhbiBzYXkgb2Ygb25lIHNlY3Rpb24gaXMKLXRydWUgYW5vdGhlci4KLUBpZnNldCBhb3V0LWJvdXQKLVdoZW4gdGhlIHByb2dyYW0gaXMgcnVubmluZywgaG93ZXZlciwgaXQgaXMKLWN1c3RvbWFyeSBmb3IgdGhlIHRleHQgc2VjdGlvbiB0byBiZSB1bmFsdGVyYWJsZS4gIFRoZQotdGV4dCBzZWN0aW9uIGlzIG9mdGVuIHNoYXJlZCBhbW9uZyBwcm9jZXNzZXM6IGl0IGNvbnRhaW5zCi1pbnN0cnVjdGlvbnMsIGNvbnN0YW50cyBhbmQgdGhlIGxpa2UuICBUaGUgZGF0YSBzZWN0aW9uIG9mIGEgcnVubmluZwotcHJvZ3JhbSBpcyB1c3VhbGx5IGFsdGVyYWJsZTogZm9yIGV4YW1wbGUsIEMgdmFyaWFibGVzIHdvdWxkIGJlIHN0b3JlZAotaW4gdGhlIGRhdGEgc2VjdGlvbi4KLUBlbmQgaWZzZXQKLQotQGNpbmRleCBic3Mgc2VjdGlvbgotQGl0ZW0gYnNzIHNlY3Rpb24KLVRoaXMgc2VjdGlvbiBjb250YWlucyB6ZXJvZWQgYnl0ZXMgd2hlbiB5b3VyIHByb2dyYW0gYmVnaW5zIHJ1bm5pbmcuICBJdAotaXMgdXNlZCB0byBob2xkIHVuaXRpYWxpemVkIHZhcmlhYmxlcyBvciBjb21tb24gc3RvcmFnZS4gIFRoZSBsZW5ndGggb2YKLWVhY2ggcGFydGlhbCBwcm9ncmFtJ3MgYnNzIHNlY3Rpb24gaXMgaW1wb3J0YW50LCBidXQgYmVjYXVzZSBpdCBzdGFydHMKLW91dCBjb250YWluaW5nIHplcm9lZCBieXRlcyB0aGVyZSBpcyBubyBuZWVkIHRvIHN0b3JlIGV4cGxpY2l0IHplcm8KLWJ5dGVzIGluIHRoZSBvYmplY3QgZmlsZS4gIFRoZSBic3Mgc2VjdGlvbiB3YXMgaW52ZW50ZWQgdG8gZWxpbWluYXRlCi10aG9zZSBleHBsaWNpdCB6ZXJvcyBmcm9tIG9iamVjdCBmaWxlcy4KLQotQGNpbmRleCBhYnNvbHV0ZSBzZWN0aW9uCi1AaXRlbSBhYnNvbHV0ZSBzZWN0aW9uCi1BZGRyZXNzIDAgb2YgdGhpcyBzZWN0aW9uIGlzIGFsd2F5cyBgYHJlbG9jYXRlZCcnIHRvIHJ1bnRpbWUgYWRkcmVzcyAwLgotVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcmVmZXIgdG8gYW4gYWRkcmVzcyB0aGF0IEBjb2Rle0B2YWx1ZXtMRH19IG11c3QKLW5vdCBjaGFuZ2Ugd2hlbiByZWxvY2F0aW5nLiAgSW4gdGhpcyBzZW5zZSB3ZSBzcGVhayBvZiBhYnNvbHV0ZQotYWRkcmVzc2VzIGJlaW5nIGBgdW5yZWxvY2F0YWJsZScnOiB0aGV5IGRvIG5vdCBjaGFuZ2UgZHVyaW5nIHJlbG9jYXRpb24uCi0KLUBjaW5kZXggdW5kZWZpbmVkIHNlY3Rpb24KLUBpdGVtIHVuZGVmaW5lZCBzZWN0aW9uCi1UaGlzIGBgc2VjdGlvbicnIGlzIGEgY2F0Y2gtYWxsIGZvciBhZGRyZXNzIHJlZmVyZW5jZXMgdG8gb2JqZWN0cyBub3QgaW4KLXRoZSBwcmVjZWRpbmcgc2VjdGlvbnMuCi1AYyBGSVhNRTogcmVmIHRvIHNvbWUgb3RoZXIgZG9jIG9uIG9iai1maWxlIGZvcm1hdHMgY291bGQgZ28gaGVyZS4KLUBlbmQgdGFibGUKLQotQGNpbmRleCByZWxvY2F0aW9uIGV4YW1wbGUKLUFuIGlkZWFsaXplZCBleGFtcGxlIG9mIHRocmVlIHJlbG9jYXRhYmxlIHNlY3Rpb25zIGZvbGxvd3MuCi1AaWZzZXQgQ09GRgotVGhlIGV4YW1wbGUgdXNlcyB0aGUgdHJhZGl0aW9uYWwgc2VjdGlvbiBuYW1lcyBAc2FtcHsudGV4dH0gYW5kIEBzYW1wey5kYXRhfS4KLUBlbmQgaWZzZXQKLU1lbW9yeSBhZGRyZXNzZXMgYXJlIG9uIHRoZSBob3Jpem9udGFsIGF4aXMuCi0KLUBjIFRFWEkyUk9GRi1LSUxMCi1AaWZpbmZvCi1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgICAgICAgICAgICAgICArLS0tLS0rLS0tLSstLSsKLXBhcnRpYWwgcHJvZ3JhbSAjIDE6ICB8dHR0dHR8ZGRkZHwwMHwKLSAgICAgICAgICAgICAgICAgICAgICArLS0tLS0rLS0tLSstLSsKLQotICAgICAgICAgICAgICAgICAgICAgIHRleHQgICBkYXRhIGJzcwotICAgICAgICAgICAgICAgICAgICAgIHNlZy4gICBzZWcuIHNlZy4KLQotICAgICAgICAgICAgICAgICAgICAgICstLS0rLS0tKy0tLSsKLXBhcnRpYWwgcHJvZ3JhbSAjIDI6ICB8VFRUfERERHwwMDB8Ci0gICAgICAgICAgICAgICAgICAgICAgKy0tLSstLS0rLS0tKwotCi0gICAgICAgICAgICAgICAgICAgICAgKy0tKy0tLSstLS0tLSstLSstLS0tKy0tLSstLS0tLSt+fgotbGlua2VkIHByb2dyYW06ICAgICAgIHwgIHxUVFR8dHR0dHR8ICB8ZGRkZHxERER8MDAwMDB8Ci0gICAgICAgICAgICAgICAgICAgICAgKy0tKy0tLSstLS0tLSstLSstLS0tKy0tLSstLS0tLSt+fgotCi0gICAgYWRkcmVzc2VzOiAgICAgICAgMCBAZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQGMgVEVYSTJST0ZGLUtJTEwKLUBlbmQgaWZpbmZvCi1AbmVlZCA1MDAwCi1AdGV4Ci0KLVxsaW5le1xpdCBQYXJ0aWFsIHByb2dyYW0gXCMxOiBcaGZpbH0KLVxsaW5le1xpYm94ezIuNWNtfXtcdHQgdGV4dH1caWJveHsyY219e1x0dCBkYXRhfVxpYm94ezFjbX17XHR0IGJzc31caGZpbH0KLVxsaW5le1xib3hpdHsyLjVjbX17XHR0IHR0dHR0fVxib3hpdHsyY219e1x0dCBkZGRkfVxib3hpdHsxY219e1x0dCAwMH1caGZpbH0KLQotXGxpbmV7XGl0IFBhcnRpYWwgcHJvZ3JhbSBcIzI6IFxoZmlsfQotXGxpbmV7XGlib3h7MWNtfXtcdHQgdGV4dH1caWJveHsxLjVjbX17XHR0IGRhdGF9XGlib3h7MWNtfXtcdHQgYnNzfVxoZmlsfQotXGxpbmV7XGJveGl0ezFjbX17XHR0IFRUVH1cYm94aXR7MS41Y219e1x0dCBEREREfVxib3hpdHsxY219e1x0dCAwMDB9XGhmaWx9Ci0KLVxsaW5le1xpdCBsaW5rZWQgcHJvZ3JhbTogXGhmaWx9Ci1cbGluZXtcaWJveHsuNWNtfXt9XGlib3h7MWNtfXtcdHQgdGV4dH1caWJveHsyLjVjbX17fVxpYm94ey43NWNtfXt9XGlib3h7MmNtfXtcdHQgZGF0YX1caWJveHsxLjVjbX17fVxpYm94ezJjbX17XHR0IGJzc31caGZpbH0KLVxsaW5le1xib3hpdHsuNWNtfXt9XGJveGl0ezFjbX17XHR0IFRUVH1cYm94aXR7Mi41Y219e1x0dAotdHR0dHR9XGJveGl0ey43NWNtfXt9XGJveGl0ezJjbX17XHR0IGRkZGR9XGJveGl0ezEuNWNtfXtcdHQKLURERER9XGJveGl0ezJjbX17XHR0IDAwMDAwfVwgXGRvdHNcaGZpbH0KLQotXGxpbmV7XGl0IGFkZHJlc3NlczogXGhmaWx9Ci1cbGluZXswXGRvdHNcaGZpbH0KLQotQGVuZCB0ZXgKLUBjIEVORCBURVhJMlJPRkYtS0lMTAotCi1Abm9kZSBBcyBTZWN0aW9ucwotQHNlY3Rpb24gQXNzZW1ibGVyIEludGVybmFsIFNlY3Rpb25zCi0KLUBjaW5kZXggaW50ZXJuYWwgYXNzZW1ibGVyIHNlY3Rpb25zCi1AY2luZGV4IHNlY3Rpb25zIGluIG1lc3NhZ2VzLCBpbnRlcm5hbAotVGhlc2Ugc2VjdGlvbnMgYXJlIG1lYW50IG9ubHkgZm9yIHRoZSBpbnRlcm5hbCB1c2Ugb2YgQGNvZGV7QHZhbHVle0FTfX0uICBUaGV5Ci1oYXZlIG5vIG1lYW5pbmcgYXQgcnVuLXRpbWUuICBZb3UgZG8gbm90IHJlYWxseSBuZWVkIHRvIGtub3cgYWJvdXQgdGhlc2UKLXNlY3Rpb25zIGZvciBtb3N0IHB1cnBvc2VzOyBidXQgdGhleSBjYW4gYmUgbWVudGlvbmVkIGluIEBjb2Rle0B2YWx1ZXtBU319Ci13YXJuaW5nIG1lc3NhZ2VzLCBzbyBpdCBtaWdodCBiZSBoZWxwZnVsIHRvIGhhdmUgYW4gaWRlYSBvZiB0aGVpcgotbWVhbmluZ3MgdG8gQGNvZGV7QHZhbHVle0FTfX0uICBUaGVzZSBzZWN0aW9ucyBhcmUgdXNlZCB0byBwZXJtaXQgdGhlCi12YWx1ZSBvZiBldmVyeSBleHByZXNzaW9uIGluIHlvdXIgYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbSB0byBiZSBhCi1zZWN0aW9uLXJlbGF0aXZlIGFkZHJlc3MuCi0KLUB0YWJsZSBAYgotQGNpbmRleCBhc3NlbWJsZXIgaW50ZXJuYWwgbG9naWMgZXJyb3IKLUBpdGVtIEFTU0VNQkxFUi1JTlRFUk5BTC1MT0dJQy1FUlJPUiEKLUFuIGludGVybmFsIGFzc2VtYmxlciBsb2dpYyBlcnJvciBoYXMgYmVlbiBmb3VuZC4gIFRoaXMgbWVhbnMgdGhlcmUgaXMgYQotYnVnIGluIHRoZSBhc3NlbWJsZXIuCi0KLUBjaW5kZXggZXhwciAoaW50ZXJuYWwgc2VjdGlvbikKLUBpdGVtIGV4cHIgc2VjdGlvbgotVGhlIGFzc2VtYmxlciBzdG9yZXMgY29tcGxleCBleHByZXNzaW9uIGludGVybmFsbHkgYXMgY29tYmluYXRpb25zIG9mCi1zeW1ib2xzLiAgV2hlbiBpdCBuZWVkcyB0byByZXByZXNlbnQgYW4gZXhwcmVzc2lvbiBhcyBhIHN5bWJvbCwgaXQgcHV0cwotaXQgaW4gdGhlIGV4cHIgc2VjdGlvbi4KLUBjIEZJWE1FIGl0ZW0gZGVidWcKLUBjIEZJWE1FIGl0ZW0gdHJhbnNmZXJbdF0gdmVjdG9yIHByZWxvYWQKLUBjIEZJWE1FIGl0ZW0gdHJhbnNmZXJbdF0gdmVjdG9yIHBvc3Rsb2FkCi1AYyBGSVhNRSBpdGVtIHJlZ2lzdGVyCi1AZW5kIHRhYmxlCi0KLUBub2RlIFN1Yi1TZWN0aW9ucwotQHNlY3Rpb24gU3ViLVNlY3Rpb25zCi0KLUBjaW5kZXggbnVtYmVyZWQgc3Vic2VjdGlvbnMKLUBjaW5kZXggZ3JvdXBpbmcgZGF0YQotQGlmc2V0IGFvdXQtYm91dAotQXNzZW1ibGVkIGJ5dGVzCi1AaWZzZXQgQ09GRgotY29udmVudGlvbmFsbHkKLUBlbmQgaWZzZXQKLWZhbGwgaW50byB0d28gc2VjdGlvbnM6IHRleHQgYW5kIGRhdGEuCi1AZW5kIGlmc2V0Ci1Zb3UgbWF5IGhhdmUgc2VwYXJhdGUgZ3JvdXBzIG9mCi1AaWZzZXQgR0VORVJJQwotZGF0YSBpbiBuYW1lZCBzZWN0aW9ucwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmY2xlYXIgYW91dC1ib3V0Ci1kYXRhIGluIG5hbWVkIHNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBhb3V0LWJvdXQKLXRleHQgb3IgZGF0YQotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi10aGF0IHlvdSB3YW50IHRvIGVuZCB1cCBuZWFyIHRvIGVhY2ggb3RoZXIgaW4gdGhlIG9iamVjdCBmaWxlLCBldmVuIHRob3VnaCB0aGV5Ci1hcmUgbm90IGNvbnRpZ3VvdXMgaW4gdGhlIGFzc2VtYmxlciBzb3VyY2UuICBAY29kZXtAdmFsdWV7QVN9fSBhbGxvd3MgeW91IHRvCi11c2UgQGRmbntzdWJzZWN0aW9uc30gZm9yIHRoaXMgcHVycG9zZS4gIFdpdGhpbiBlYWNoIHNlY3Rpb24sIHRoZXJlIGNhbiBiZQotbnVtYmVyZWQgc3Vic2VjdGlvbnMgd2l0aCB2YWx1ZXMgZnJvbSAwIHRvIDgxOTIuICBPYmplY3RzIGFzc2VtYmxlZCBpbnRvIHRoZQotc2FtZSBzdWJzZWN0aW9uIGdvIGludG8gdGhlIG9iamVjdCBmaWxlIHRvZ2V0aGVyIHdpdGggb3RoZXIgb2JqZWN0cyBpbiB0aGUgc2FtZQotc3Vic2VjdGlvbi4gIEZvciBleGFtcGxlLCBhIGNvbXBpbGVyIG1pZ2h0IHdhbnQgdG8gc3RvcmUgY29uc3RhbnRzIGluIHRoZSB0ZXh0Ci1zZWN0aW9uLCBidXQgbWlnaHQgbm90IHdhbnQgdG8gaGF2ZSB0aGVtIGludGVyc3BlcnNlZCB3aXRoIHRoZSBwcm9ncmFtIGJlaW5nCi1hc3NlbWJsZWQuICBJbiB0aGlzIGNhc2UsIHRoZSBjb21waWxlciBjb3VsZCBpc3N1ZSBhIEBzYW1wey50ZXh0IDB9IGJlZm9yZSBlYWNoCi1zZWN0aW9uIG9mIGNvZGUgYmVpbmcgb3V0cHV0LCBhbmQgYSBAc2FtcHsudGV4dCAxfSBiZWZvcmUgZWFjaCBncm91cCBvZgotY29uc3RhbnRzIGJlaW5nIG91dHB1dC4KLQotU3Vic2VjdGlvbnMgYXJlIG9wdGlvbmFsLiAgSWYgeW91IGRvIG5vdCB1c2Ugc3Vic2VjdGlvbnMsIGV2ZXJ5dGhpbmcKLWdvZXMgaW4gc3Vic2VjdGlvbiBudW1iZXIgemVyby4KLQotQGlmc2V0IEdFTkVSSUMKLUVhY2ggc3Vic2VjdGlvbiBpcyB6ZXJvLXBhZGRlZCB1cCB0byBhIG11bHRpcGxlIG9mIGZvdXIgYnl0ZXMuCi0oU3Vic2VjdGlvbnMgbWF5IGJlIHBhZGRlZCBhIGRpZmZlcmVudCBhbW91bnQgb24gZGlmZmVyZW50IGZsYXZvcnMKLW9mIEBjb2Rle0B2YWx1ZXtBU319LikKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBIOAotT24gdGhlIEg4LzMwMCBhbmQgSDgvNTAwIHBsYXRmb3JtcywgZWFjaCBzdWJzZWN0aW9uIGlzIHplcm8tcGFkZGVkIHRvIGEgd29yZAotYm91bmRhcnkgKHR3byBieXRlcykuCi1UaGUgc2FtZSBpcyB0cnVlIG9uIHRoZSBIaXRhY2hpIFNILgotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLUBjIEZJWE1FIHNlY3Rpb24gcGFkZGluZyAoYWxpZ25tZW50KT8KLUBjIFJpY2ggUGl4bGV5IHNheXMgcGFkZGluZyBoZXJlIGRlcGVuZHMgb24gdGFyZ2V0IG9iaiBjb2RlIGZvcm1hdDsgdGhhdAotQGMgZG9lc24ndCBzZWVtIHBhcnRpY3VsYXJseSB1c2VmdWwgdG8gc2F5IHdpdGhvdXQgZnVydGhlciBlbGFib3JhdGlvbiwKLUBjIHNvIGZvciBub3cgSSBzYXkgbm90aGluZyBhYm91dCBpdC4gIElmIHRoaXMgaXMgYSBnZW5lcmljIEJGRCBpc3N1ZSwKLUBjIHRoZXNlIHBhcmFncmFwaHMgbWlnaHQgbmVlZCB0byB2YW5pc2ggZnJvbSB0aGlzIG1hbnVhbCwgYW5kIGJlCi1AYyBkaXNjdXNzZWQgaW4gQkZEIGNoYXB0ZXIgb2YgYmludXRpbHMgKG9yIHNvbWUgc3VjaCkuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQTI5SwotT24gdGhlIEFNRCAyOUsgZmFtaWx5LCBubyBwYXJ0aWN1bGFyIHBhZGRpbmcgaXMgYWRkZWQgdG8gc2VjdGlvbiBvcgotc3Vic2VjdGlvbiBzaXplczsgQHZhbHVle0FTfSBmb3JjZXMgbm8gYWxpZ25tZW50IG9uIHRoaXMgcGxhdGZvcm0uCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotU3Vic2VjdGlvbnMgYXBwZWFyIGluIHlvdXIgb2JqZWN0IGZpbGUgaW4gbnVtZXJpYyBvcmRlciwgbG93ZXN0IG51bWJlcmVkCi10byBoaWdoZXN0LiAgKEFsbCB0aGlzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBwZW9wbGUncyBhc3NlbWJsZXJzLikKLVRoZSBvYmplY3QgZmlsZSBjb250YWlucyBubyByZXByZXNlbnRhdGlvbiBvZiBzdWJzZWN0aW9uczsgQGNvZGV7QHZhbHVle0xEfX0gYW5kCi1vdGhlciBwcm9ncmFtcyB0aGF0IG1hbmlwdWxhdGUgb2JqZWN0IGZpbGVzIHNlZSBubyB0cmFjZSBvZiB0aGVtLgotVGhleSBqdXN0IHNlZSBhbGwgeW91ciB0ZXh0IHN1YnNlY3Rpb25zIGFzIGEgdGV4dCBzZWN0aW9uLCBhbmQgYWxsIHlvdXIKLWRhdGEgc3Vic2VjdGlvbnMgYXMgYSBkYXRhIHNlY3Rpb24uCi0KLVRvIHNwZWNpZnkgd2hpY2ggc3Vic2VjdGlvbiB5b3Ugd2FudCBzdWJzZXF1ZW50IHN0YXRlbWVudHMgYXNzZW1ibGVkCi1pbnRvLCB1c2UgYSBudW1lcmljIGFyZ3VtZW50IHRvIHNwZWNpZnkgaXQsIGluIGEgQHNhbXB7LnRleHQKLUB2YXJ7ZXhwcmVzc2lvbn19IG9yIGEgQHNhbXB7LmRhdGEgQHZhcntleHByZXNzaW9ufX0gc3RhdGVtZW50LgotQGlmc2V0IENPRkYKLUBpZnNldCBHRU5FUklDCi1XaGVuIGdlbmVyYXRpbmcgQ09GRiBvdXRwdXQsIHlvdQotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotWW91Ci1AZW5kIGlmY2xlYXIKLWNhbiBhbHNvIHVzZSBhbiBleHRyYSBzdWJzZWN0aW9uCi1hcmd1bWVudCB3aXRoIGFyYml0cmFyeSBuYW1lZCBzZWN0aW9uczogQHNhbXB7LnNlY3Rpb24gQHZhcntuYW1lfSwKLUB2YXJ7ZXhwcmVzc2lvbn19LgotQGVuZCBpZnNldAotQHZhcntFeHByZXNzaW9ufSBzaG91bGQgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4KLShAeHJlZntFeHByZXNzaW9uc30uKSAgSWYgeW91IGp1c3Qgc2F5IEBzYW1wey50ZXh0fSB0aGVuIEBzYW1wey50ZXh0IDB9Ci1pcyBhc3N1bWVkLiAgTGlrZXdpc2UgQHNhbXB7LmRhdGF9IG1lYW5zIEBzYW1wey5kYXRhIDB9LiAgQXNzZW1ibHkKLWJlZ2lucyBpbiBAY29kZXt0ZXh0IDB9LiAgRm9yIGluc3RhbmNlOgotQHNtYWxsZXhhbXBsZQotLnRleHQgMCAgICAgIyBUaGUgZGVmYXVsdCBzdWJzZWN0aW9uIGlzIHRleHQgMCBhbnl3YXkuCi0uYXNjaWkgIlRoaXMgbGl2ZXMgaW4gdGhlIGZpcnN0IHRleHQgc3Vic2VjdGlvbi4gKiIKLS50ZXh0IDEKLS5hc2NpaSAiQnV0IHRoaXMgbGl2ZXMgaW4gdGhlIHNlY29uZCB0ZXh0IHN1YnNlY3Rpb24uIgotLmRhdGEgMAotLmFzY2lpICJUaGlzIGxpdmVzIGluIHRoZSBkYXRhIHNlY3Rpb24sIgotLmFzY2lpICJpbiB0aGUgZmlyc3QgZGF0YSBzdWJzZWN0aW9uLiIKLS50ZXh0IDAKLS5hc2NpaSAiVGhpcyBsaXZlcyBpbiB0aGUgZmlyc3QgdGV4dCBzZWN0aW9uLCIKLS5hc2NpaSAiaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBhc3RlcmlzayAoKikuIgotQGVuZCBzbWFsbGV4YW1wbGUKLQotRWFjaCBzZWN0aW9uIGhhcyBhIEBkZm57bG9jYXRpb24gY291bnRlcn0gaW5jcmVtZW50ZWQgYnkgb25lIGZvciBldmVyeSBieXRlCi1hc3NlbWJsZWQgaW50byB0aGF0IHNlY3Rpb24uICBCZWNhdXNlIHN1YnNlY3Rpb25zIGFyZSBtZXJlbHkgYSBjb252ZW5pZW5jZQotcmVzdHJpY3RlZCB0byBAY29kZXtAdmFsdWV7QVN9fSB0aGVyZSBpcyBubyBjb25jZXB0IG9mIGEgc3Vic2VjdGlvbiBsb2NhdGlvbgotY291bnRlci4gIFRoZXJlIGlzIG5vIHdheSB0byBkaXJlY3RseSBtYW5pcHVsYXRlIGEgbG9jYXRpb24gY291bnRlci0tLWJ1dCB0aGUKLUBjb2Rley5hbGlnbn0gZGlyZWN0aXZlIGNoYW5nZXMgaXQsIGFuZCBhbnkgbGFiZWwgZGVmaW5pdGlvbiBjYXB0dXJlcyBpdHMKLWN1cnJlbnQgdmFsdWUuICBUaGUgbG9jYXRpb24gY291bnRlciBvZiB0aGUgc2VjdGlvbiB3aGVyZSBzdGF0ZW1lbnRzIGFyZSBiZWluZwotYXNzZW1ibGVkIGlzIHNhaWQgdG8gYmUgdGhlIEBkZm57YWN0aXZlfSBsb2NhdGlvbiBjb3VudGVyLgotCi1Abm9kZSBic3MKLUBzZWN0aW9uIGJzcyBTZWN0aW9uCi0KLUBjaW5kZXggYnNzIHNlY3Rpb24KLUBjaW5kZXggY29tbW9uIHZhcmlhYmxlIHN0b3JhZ2UKLVRoZSBic3Mgc2VjdGlvbiBpcyB1c2VkIGZvciBsb2NhbCBjb21tb24gdmFyaWFibGUgc3RvcmFnZS4KLVlvdSBtYXkgYWxsb2NhdGUgYWRkcmVzcyBzcGFjZSBpbiB0aGUgYnNzIHNlY3Rpb24sIGJ1dCB5b3UgbWF5Ci1ub3QgZGljdGF0ZSBkYXRhIHRvIGxvYWQgaW50byBpdCBiZWZvcmUgeW91ciBwcm9ncmFtIGV4ZWN1dGVzLiAgV2hlbgoteW91ciBwcm9ncmFtIHN0YXJ0cyBydW5uaW5nLCBhbGwgdGhlIGNvbnRlbnRzIG9mIHRoZSBic3MKLXNlY3Rpb24gYXJlIHplcm9lZCBieXRlcy4KLQotVGhlIEBjb2Rley5sY29tbX0gcHNldWRvLW9wIGRlZmluZXMgYSBzeW1ib2wgaW4gdGhlIGJzcyBzZWN0aW9uOyBzZWUKLUByZWZ7TGNvbW0sLEBjb2Rley5sY29tbX19LgotCi1UaGUgQGNvZGV7LmNvbW19IHBzZXVkby1vcCBtYXkgYmUgdXNlZCB0byBkZWNsYXJlIGEgY29tbW9uIHN5bWJvbCwgd2hpY2ggaXMKLWFub3RoZXIgZm9ybSBvZiB1bmluaXRpYWxpemVkIHN5bWJvbDsgc2VlIEB4cmVme0NvbW0sLEBjb2Rley5jb21tfX0uCi0KLUBpZnNldCBHRU5FUklDCi1XaGVuIGFzc2VtYmxpbmcgZm9yIGEgdGFyZ2V0IHdoaWNoIHN1cHBvcnRzIG11bHRpcGxlIHNlY3Rpb25zLCBzdWNoIGFzIEVMRiBvcgotQ09GRiwgeW91IG1heSBzd2l0Y2ggaW50byB0aGUgQGNvZGV7LmJzc30gc2VjdGlvbiBhbmQgZGVmaW5lIHN5bWJvbHMgYXMgdXN1YWw7Ci1zZWUgQHJlZntTZWN0aW9uLCxAY29kZXsuc2VjdGlvbn19LiAgWW91IG1heSBvbmx5IGFzc2VtYmxlIHplcm8gdmFsdWVzIGludG8gdGhlCi1zZWN0aW9uLiAgVHlwaWNhbGx5IHRoZSBzZWN0aW9uIHdpbGwgb25seSBjb250YWluIHN5bWJvbCBkZWZpbml0aW9ucyBhbmQKLUBjb2Rley5za2lwfSBkaXJlY3RpdmVzIChAcHhyZWZ7U2tpcCwsQGNvZGV7LnNraXB9fSkuCi1AZW5kIGlmc2V0Ci0KLUBub2RlIFN5bWJvbHMKLUBjaGFwdGVyIFN5bWJvbHMKLQotQGNpbmRleCBzeW1ib2xzCi1TeW1ib2xzIGFyZSBhIGNlbnRyYWwgY29uY2VwdDogdGhlIHByb2dyYW1tZXIgdXNlcyBzeW1ib2xzIHRvIG5hbWUKLXRoaW5ncywgdGhlIGxpbmtlciB1c2VzIHN5bWJvbHMgdG8gbGluaywgYW5kIHRoZSBkZWJ1Z2dlciB1c2VzIHN5bWJvbHMKLXRvIGRlYnVnLgotCi1AcXVvdGF0aW9uCi1AY2luZGV4IGRlYnVnZ2VycywgYW5kIHN5bWJvbCBvcmRlcgotQGVtcGh7V2FybmluZzp9IEBjb2Rle0B2YWx1ZXtBU319IGRvZXMgbm90IHBsYWNlIHN5bWJvbHMgaW4gdGhlIG9iamVjdCBmaWxlIGluCi10aGUgc2FtZSBvcmRlciB0aGV5IHdlcmUgZGVjbGFyZWQuICBUaGlzIG1heSBicmVhayBzb21lIGRlYnVnZ2Vycy4KLUBlbmQgcXVvdGF0aW9uCi0KLUBtZW51Ci0qIExhYmVsczo6ICAgICAgICAgICAgICAgICAgICAgIExhYmVscwotKiBTZXR0aW5nIFN5bWJvbHM6OiAgICAgICAgICAgICBHaXZpbmcgU3ltYm9scyBPdGhlciBWYWx1ZXMKLSogU3ltYm9sIE5hbWVzOjogICAgICAgICAgICAgICAgU3ltYm9sIE5hbWVzCi0qIERvdDo6ICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBTcGVjaWFsIERvdCBTeW1ib2wKLSogU3ltYm9sIEF0dHJpYnV0ZXM6OiAgICAgICAgICAgU3ltYm9sIEF0dHJpYnV0ZXMKLUBlbmQgbWVudQotCi1Abm9kZSBMYWJlbHMKLUBzZWN0aW9uIExhYmVscwotCi1AY2luZGV4IGxhYmVscwotQSBAZGZue2xhYmVsfSBpcyB3cml0dGVuIGFzIGEgc3ltYm9sIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgY29sb24KLUBzYW1wezp9LiAgVGhlIHN5bWJvbCB0aGVuIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlCi1hY3RpdmUgbG9jYXRpb24gY291bnRlciwgYW5kIGlzLCBmb3IgZXhhbXBsZSwgYSBzdWl0YWJsZSBpbnN0cnVjdGlvbgotb3BlcmFuZC4gIFlvdSBhcmUgd2FybmVkIGlmIHlvdSB1c2UgdGhlIHNhbWUgc3ltYm9sIHRvIHJlcHJlc2VudCB0d28KLWRpZmZlcmVudCBsb2NhdGlvbnM6IHRoZSBmaXJzdCBkZWZpbml0aW9uIG92ZXJyaWRlcyBhbnkgb3RoZXIKLWRlZmluaXRpb25zLgotCi1AaWZzZXQgSFBQQQotT24gdGhlIEhQUEEsIHRoZSB1c3VhbCBmb3JtIGZvciBhIGxhYmVsIG5lZWQgbm90IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEKLWNvbG9uLCBidXQgaW5zdGVhZCBtdXN0IHN0YXJ0IGluIGNvbHVtbiB6ZXJvLiAgT25seSBvbmUgbGFiZWwgbWF5IGJlIGRlZmluZWQgb24KLWEgc2luZ2xlIGxpbmUuICBUbyB3b3JrIGFyb3VuZCB0aGlzLCB0aGUgSFBQQSB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGFsc28KLXByb3ZpZGVzIGEgc3BlY2lhbCBkaXJlY3RpdmUgQGNvZGV7LmxhYmVsfSBmb3IgZGVmaW5pbmcgbGFiZWxzIG1vcmUgZmxleGlibHkuCi1AZW5kIGlmc2V0Ci0KLUBub2RlIFNldHRpbmcgU3ltYm9scwotQHNlY3Rpb24gR2l2aW5nIFN5bWJvbHMgT3RoZXIgVmFsdWVzCi0KLUBjaW5kZXggYXNzaWduaW5nIHZhbHVlcyB0byBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbCB2YWx1ZXMsIGFzc2lnbmluZwotQSBzeW1ib2wgY2FuIGJlIGdpdmVuIGFuIGFyYml0cmFyeSB2YWx1ZSBieSB3cml0aW5nIGEgc3ltYm9sLCBmb2xsb3dlZAotYnkgYW4gZXF1YWxzIHNpZ24gQHNhbXB7PX0sIGZvbGxvd2VkIGJ5IGFuIGV4cHJlc3Npb24KLShAcHhyZWZ7RXhwcmVzc2lvbnN9KS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB1c2luZyB0aGUgQGNvZGV7LnNldH0KLWRpcmVjdGl2ZS4gIEB4cmVme1NldCwsQGNvZGV7LnNldH19LgotCi1Abm9kZSBTeW1ib2wgTmFtZXMKLUBzZWN0aW9uIFN5bWJvbCBOYW1lcwotCi1AY2luZGV4IHN5bWJvbCBuYW1lcwotQGNpbmRleCBuYW1lcywgc3ltYm9sCi1AaWZjbGVhciBTUEVDSUFMLVNZTVMKLVN5bWJvbCBuYW1lcyBiZWdpbiB3aXRoIGEgbGV0dGVyIG9yIHdpdGggb25lIG9mIEBzYW1wey5ffS4gIE9uIG1vc3QKLW1hY2hpbmVzLCB5b3UgY2FuIGFsc28gdXNlIEBjb2RleyR9IGluIHN5bWJvbCBuYW1lczsgZXhjZXB0aW9ucyBhcmUKLW5vdGVkIGluIEByZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LiAgVGhhdCBjaGFyYWN0ZXIgbWF5IGJlIGZvbGxvd2VkIGJ5IGFueQotc3RyaW5nIG9mIGRpZ2l0cywgbGV0dGVycywgZG9sbGFyIHNpZ25zICh1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkIGluCi1AcmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfSksIGFuZCB1bmRlcnNjb3Jlcy4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IEEyOUsKLUZvciB0aGUgQU1EIDI5SyBmYW1pbHksIEBzYW1wez99IGlzIGFsc28gYWxsb3dlZCBpbiB0aGUKLWJvZHkgb2YgYSBzeW1ib2wgbmFtZSwgdGhvdWdoIG5vdCBhdCBpdHMgYmVnaW5uaW5nLgotQGVuZCBpZnNldAotCi1AaWZzZXQgU1BFQ0lBTC1TWU1TCi1AaWZzZXQgSDgKLVN5bWJvbCBuYW1lcyBiZWdpbiB3aXRoIGEgbGV0dGVyIG9yIHdpdGggb25lIG9mIEBzYW1wey5ffS4gIE9uIHRoZQotSGl0YWNoaSBTSCBvciB0aGUKLUg4LzUwMCwgeW91IGNhbiBhbHNvIHVzZSBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXMuICBUaGF0IGNoYXJhY3RlciBtYXkKLWJlIGZvbGxvd2VkIGJ5IGFueSBzdHJpbmcgb2YgZGlnaXRzLCBsZXR0ZXJzLCBkb2xsYXIgc2lnbnMgKHNhdmUgb24gdGhlCi1IOC8zMDApLCBhbmQgdW5kZXJzY29yZXMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUNhc2Ugb2YgbGV0dGVycyBpcyBzaWduaWZpY2FudDogQGNvZGV7Zm9vfSBpcyBhIGRpZmZlcmVudCBzeW1ib2wgbmFtZQotdGhhbiBAY29kZXtGb299LgotCi1FYWNoIHN5bWJvbCBoYXMgZXhhY3RseSBvbmUgbmFtZS4gIEVhY2ggbmFtZSBpbiBhbiBhc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtCi1yZWZlcnMgdG8gZXhhY3RseSBvbmUgc3ltYm9sLiAgWW91IG1heSB1c2UgdGhhdCBzeW1ib2wgbmFtZSBhbnkgbnVtYmVyIG9mIHRpbWVzCi1pbiBhIHByb2dyYW0uCi0KLUBzdWJoZWFkaW5nIExvY2FsIFN5bWJvbCBOYW1lcwotCi1AY2luZGV4IGxvY2FsIHN5bWJvbCBuYW1lcwotQGNpbmRleCBzeW1ib2wgbmFtZXMsIGxvY2FsCi1AY2luZGV4IHRlbXBvcmFyeSBzeW1ib2wgbmFtZXMKLUBjaW5kZXggc3ltYm9sIG5hbWVzLCB0ZW1wb3JhcnkKLUxvY2FsIHN5bWJvbHMgaGVscCBjb21waWxlcnMgYW5kIHByb2dyYW1tZXJzIHVzZSBuYW1lcyB0ZW1wb3JhcmlseS4KLVRoZXJlIGFyZSB0ZW4gbG9jYWwgc3ltYm9sIG5hbWVzLCB3aGljaCBhcmUgcmUtdXNlZCB0aHJvdWdob3V0IHRoZQotcHJvZ3JhbS4gIFlvdSBtYXkgcmVmZXIgdG8gdGhlbSB1c2luZyB0aGUgbmFtZXMgQHNhbXB7MH0gQHNhbXB7MX0KLUBkb3Rze30gQHNhbXB7OX0uICBUbyBkZWZpbmUgYSBsb2NhbCBzeW1ib2wsIHdyaXRlIGEgbGFiZWwgb2YgdGhlIGZvcm0KLUBzYW1we0Bie059On0gKHdoZXJlIEBie059IHJlcHJlc2VudHMgYW55IGRpZ2l0KS4gIFRvIHJlZmVyIHRvIHRoZSBtb3N0Ci1yZWNlbnQgcHJldmlvdXMgZGVmaW5pdGlvbiBvZiB0aGF0IHN5bWJvbCB3cml0ZSBAc2FtcHtAYntOfWJ9LCB1c2luZyB0aGUKLXNhbWUgZGlnaXQgYXMgd2hlbiB5b3UgZGVmaW5lZCB0aGUgbGFiZWwuICBUbyByZWZlciB0byB0aGUgbmV4dAotZGVmaW5pdGlvbiBvZiBhIGxvY2FsIGxhYmVsLCB3cml0ZSBAc2FtcHtAYntOfWZ9LS0td2hlcmUgQGJ7Tn0gZ2l2ZXMgeW91Ci1hIGNob2ljZSBvZiAxMCBmb3J3YXJkIHJlZmVyZW5jZXMuICBUaGUgQHNhbXB7Yn0gc3RhbmRzIGZvcgotYGBiYWNrd2FyZHMnJyBhbmQgdGhlIEBzYW1we2Z9IHN0YW5kcyBmb3IgYGBmb3J3YXJkcycnLgotCi1Mb2NhbCBzeW1ib2xzIGFyZSBub3QgZW1pdHRlZCBieSB0aGUgY3VycmVudCBAc2N7Z251fSBDIGNvbXBpbGVyLgotCi1UaGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiBob3cgeW91IGNhbiB1c2UgdGhlc2UgbGFiZWxzLCBidXQKLXJlbWVtYmVyIHRoYXQgYXQgYW55IHBvaW50IGluIHRoZSBhc3NlbWJseSB5b3UgY2FuIHJlZmVyIHRvIGF0IG1vc3QKLTEwIHByaW9yIGxvY2FsIGxhYmVscyBhbmQgdG8gYXQgbW9zdCAxMCBmb3J3YXJkIGxvY2FsIGxhYmVscy4KLQotTG9jYWwgc3ltYm9sIG5hbWVzIGFyZSBvbmx5IGEgbm90YXRpb24gZGV2aWNlLiAgVGhleSBhcmUgaW1tZWRpYXRlbHkKLXRyYW5zZm9ybWVkIGludG8gbW9yZSBjb252ZW50aW9uYWwgc3ltYm9sIG5hbWVzIGJlZm9yZSB0aGUgYXNzZW1ibGVyCi11c2VzIHRoZW0uICBUaGUgc3ltYm9sIG5hbWVzIHN0b3JlZCBpbiB0aGUgc3ltYm9sIHRhYmxlLCBhcHBlYXJpbmcgaW4KLWVycm9yIG1lc3NhZ2VzIGFuZCBvcHRpb25hbGx5IGVtaXR0ZWQgdG8gdGhlIG9iamVjdCBmaWxlIGhhdmUgdGhlc2UKLXBhcnRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIEwKLUFsbCBsb2NhbCBsYWJlbHMgYmVnaW4gd2l0aCBAc2FtcHtMfS4gTm9ybWFsbHkgYm90aCBAY29kZXtAdmFsdWV7QVN9fSBhbmQKLUBjb2Rle0B2YWx1ZXtMRH19IGZvcmdldCBzeW1ib2xzIHRoYXQgc3RhcnQgd2l0aCBAc2FtcHtMfS4gVGhlc2UgbGFiZWxzIGFyZQotdXNlZCBmb3Igc3ltYm9scyB5b3UgYXJlIG5ldmVyIGludGVuZGVkIHRvIHNlZS4gIElmIHlvdSB1c2UgdGhlCi1Ac2FtcHstTH0gb3B0aW9uIHRoZW4gQGNvZGV7QHZhbHVle0FTfX0gcmV0YWlucyB0aGVzZSBzeW1ib2xzIGluIHRoZQotb2JqZWN0IGZpbGUuIElmIHlvdSBhbHNvIGluc3RydWN0IEBjb2Rle0B2YWx1ZXtMRH19IHRvIHJldGFpbiB0aGVzZSBzeW1ib2xzLAoteW91IG1heSB1c2UgdGhlbSBpbiBkZWJ1Z2dpbmcuCi0KLUBpdGVtIEB2YXJ7ZGlnaXR9Ci1JZiB0aGUgbGFiZWwgaXMgd3JpdHRlbiBAc2FtcHswOn0gdGhlbiB0aGUgZGlnaXQgaXMgQHNhbXB7MH0uCi1JZiB0aGUgbGFiZWwgaXMgd3JpdHRlbiBAc2FtcHsxOn0gdGhlbiB0aGUgZGlnaXQgaXMgQHNhbXB7MX0uCi1BbmQgc28gb24gdXAgdGhyb3VnaCBAc2FtcHs5On0uCi0KLUBpdGVtIEBrYmR7Qy1BfQotVGhpcyB1bnVzdWFsIGNoYXJhY3RlciBpcyBpbmNsdWRlZCBzbyB5b3UgZG8gbm90IGFjY2lkZW50YWxseSBpbnZlbnQKLWEgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUuICBUaGUgY2hhcmFjdGVyIGhhcyBBU0NJSSB2YWx1ZQotQHNhbXB7XDAwMX0uCi0KLUBpdGVtIEBlbXBoe29yZGluYWwgbnVtYmVyfQotVGhpcyBpcyBhIHNlcmlhbCBudW1iZXIgdG8ga2VlcCB0aGUgbGFiZWxzIGRpc3RpbmN0LiAgVGhlIGZpcnN0Ci1Ac2FtcHswOn0gZ2V0cyB0aGUgbnVtYmVyIEBzYW1wezF9OyBUaGUgMTV0aCBAc2FtcHswOn0gZ2V0cyB0aGUKLW51bWJlciBAc2FtcHsxNX07IEBlbXBoe2V0Yy59LiAgTGlrZXdpc2UgZm9yIHRoZSBvdGhlciBsYWJlbHMgQHNhbXB7MTp9Ci10aHJvdWdoIEBzYW1wezk6fS4KLUBlbmQgdGFibGUKLQotRm9yIGluc3RhbmNlLCB0aGUgZmlyc3QgQGNvZGV7MTp9IGlzIG5hbWVkIEBjb2Rle0wxQGtiZHtDLUF9MX0sIHRoZSA0NHRoCi1AY29kZXszOn0gaXMgbmFtZWQgQGNvZGV7TDNAa2Jke0MtQX00NH0uCi0KLUBub2RlIERvdAotQHNlY3Rpb24gVGhlIFNwZWNpYWwgRG90IFN5bWJvbAotCi1AY2luZGV4IGRvdCAoc3ltYm9sKQotQGNpbmRleCBAY29kZXsufSAoc3ltYm9sKQotQGNpbmRleCBjdXJyZW50IGFkZHJlc3MKLUBjaW5kZXggbG9jYXRpb24gY291bnRlcgotVGhlIHNwZWNpYWwgc3ltYm9sIEBzYW1wey59IHJlZmVycyB0byB0aGUgY3VycmVudCBhZGRyZXNzIHRoYXQKLUBjb2Rle0B2YWx1ZXtBU319IGlzIGFzc2VtYmxpbmcgaW50by4gIFRodXMsIHRoZSBleHByZXNzaW9uIEBzYW1we21lbHZpbjoKLS5sb25nIC59IGRlZmluZXMgQGNvZGV7bWVsdmlufSB0byBjb250YWluIGl0cyBvd24gYWRkcmVzcy4KLUFzc2lnbmluZyBhIHZhbHVlIHRvIEBjb2Rley59IGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYSBAY29kZXsub3JnfQotZGlyZWN0aXZlLiAgVGh1cywgdGhlIGV4cHJlc3Npb24gQHNhbXB7Lj0uKzR9IGlzIHRoZSBzYW1lIGFzIHNheWluZwotQGlmY2xlYXIgbm8tc3BhY2UtZGlyCi1Ac2FtcHsuc3BhY2UgNH0uCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBuby1zcGFjZS1kaXIKLUBpZnNldCBBMjlLCi1Ac2FtcHsuYmxvY2sgNH0uCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIFN5bWJvbCBBdHRyaWJ1dGVzCi1Ac2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlcwotCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IGF0dHJpYnV0ZXMsIHN5bWJvbAotRXZlcnkgc3ltYm9sIGhhcywgYXMgd2VsbCBhcyBpdHMgbmFtZSwgdGhlIGF0dHJpYnV0ZXMgYGBWYWx1ZScnIGFuZAotYGBUeXBlJycuICBEZXBlbmRpbmcgb24gb3V0cHV0IGZvcm1hdCwgc3ltYm9scyBjYW4gYWxzbyBoYXZlIGF1eGlsaWFyeQotYXR0cmlidXRlcy4KLUBpZnNldCBJTlRFUk5BTFMKLVRoZSBkZXRhaWxlZCBkZWZpbml0aW9ucyBhcmUgaW4gQGZpbGV7YS5vdXQuaH0uCi1AZW5kIGlmc2V0Ci0KLUlmIHlvdSB1c2UgYSBzeW1ib2wgd2l0aG91dCBkZWZpbmluZyBpdCwgQGNvZGV7QHZhbHVle0FTfX0gYXNzdW1lcyB6ZXJvIGZvcgotYWxsIHRoZXNlIGF0dHJpYnV0ZXMsIGFuZCBwcm9iYWJseSB3b24ndCB3YXJuIHlvdS4gIFRoaXMgbWFrZXMgdGhlCi1zeW1ib2wgYW4gZXh0ZXJuYWxseSBkZWZpbmVkIHN5bWJvbCwgd2hpY2ggaXMgZ2VuZXJhbGx5IHdoYXQgeW91Ci13b3VsZCB3YW50LgotCi1AbWVudQotKiBTeW1ib2wgVmFsdWU6OiAgICAgICAgICAgICAgICBWYWx1ZQotKiBTeW1ib2wgVHlwZTo6ICAgICAgICAgICAgICAgICBUeXBlCi1AaWZzZXQgYW91dC1ib3V0Ci1AaWZzZXQgR0VORVJJQwotKiBhLm91dCBTeW1ib2xzOjogICAgICAgICAgICAgICBTeW1ib2wgQXR0cmlidXRlczogQGNvZGV7YS5vdXR9Ci1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZjbGVhciBCT1VUCi0qIGEub3V0IFN5bWJvbHM6OiAgICAgICAgICAgICAgIFN5bWJvbCBBdHRyaWJ1dGVzOiBAY29kZXthLm91dH0KLUBlbmQgaWZjbGVhcgotQGlmc2V0IEJPVVQKLSogYS5vdXQgU3ltYm9sczo6ICAgICAgICAgICAgICAgU3ltYm9sIEF0dHJpYnV0ZXM6IEBjb2Rle2Eub3V0fSwgQGNvZGV7Yi5vdXR9Ci1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLUBpZnNldCBDT0ZGCi0qIENPRkYgU3ltYm9sczo6ICAgICAgICAgICAgICAgIFN5bWJvbCBBdHRyaWJ1dGVzIGZvciBDT0ZGCi1AZW5kIGlmc2V0Ci1AaWZzZXQgU09NCi0qIFNPTSBTeW1ib2xzOjogICAgICAgICAgICAgICAgU3ltYm9sIEF0dHJpYnV0ZXMgZm9yIFNPTQotQGVuZCBpZnNldAotQGVuZCBtZW51Ci0KLUBub2RlIFN5bWJvbCBWYWx1ZQotQHN1YnNlY3Rpb24gVmFsdWUKLQotQGNpbmRleCB2YWx1ZSBvZiBhIHN5bWJvbAotQGNpbmRleCBzeW1ib2wgdmFsdWUKLVRoZSB2YWx1ZSBvZiBhIHN5bWJvbCBpcyAodXN1YWxseSkgMzIgYml0cy4gIEZvciBhIHN5bWJvbCB3aGljaCBsYWJlbHMgYQotbG9jYXRpb24gaW4gdGhlIHRleHQsIGRhdGEsIGJzcyBvciBhYnNvbHV0ZSBzZWN0aW9ucyB0aGUgdmFsdWUgaXMgdGhlCi1udW1iZXIgb2YgYWRkcmVzc2VzIGZyb20gdGhlIHN0YXJ0IG9mIHRoYXQgc2VjdGlvbiB0byB0aGUgbGFiZWwuCi1OYXR1cmFsbHkgZm9yIHRleHQsIGRhdGEgYW5kIGJzcyBzZWN0aW9ucyB0aGUgdmFsdWUgb2YgYSBzeW1ib2wgY2hhbmdlcwotYXMgQGNvZGV7QHZhbHVle0xEfX0gY2hhbmdlcyBzZWN0aW9uIGJhc2UgYWRkcmVzc2VzIGR1cmluZyBsaW5raW5nLiAgQWJzb2x1dGUKLXN5bWJvbHMnIHZhbHVlcyBkbyBub3QgY2hhbmdlIGR1cmluZyBsaW5raW5nOiB0aGF0IGlzIHdoeSB0aGV5IGFyZQotY2FsbGVkIGFic29sdXRlLgotCi1UaGUgdmFsdWUgb2YgYW4gdW5kZWZpbmVkIHN5bWJvbCBpcyB0cmVhdGVkIGluIGEgc3BlY2lhbCB3YXkuICBJZiBpdCBpcwotMCB0aGVuIHRoZSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBhc3NlbWJsZXIgc291cmNlIGZpbGUsIGFuZAotQGNvZGV7QHZhbHVle0xEfX0gdHJpZXMgdG8gZGV0ZXJtaW5lIGl0cyB2YWx1ZSBmcm9tIG90aGVyIGZpbGVzIGxpbmtlZCBpbnRvIHRoZQotc2FtZSBwcm9ncmFtLiAgWW91IG1ha2UgdGhpcyBraW5kIG9mIHN5bWJvbCBzaW1wbHkgYnkgbWVudGlvbmluZyBhIHN5bWJvbAotbmFtZSB3aXRob3V0IGRlZmluaW5nIGl0LiAgQSBub24temVybyB2YWx1ZSByZXByZXNlbnRzIGEgQGNvZGV7LmNvbW19Ci1jb21tb24gZGVjbGFyYXRpb24uICBUaGUgdmFsdWUgaXMgaG93IG11Y2ggY29tbW9uIHN0b3JhZ2UgdG8gcmVzZXJ2ZSwgaW4KLWJ5dGVzIChhZGRyZXNzZXMpLiAgVGhlIHN5bWJvbCByZWZlcnMgdG8gdGhlIGZpcnN0IGFkZHJlc3Mgb2YgdGhlCi1hbGxvY2F0ZWQgc3RvcmFnZS4KLQotQG5vZGUgU3ltYm9sIFR5cGUKLUBzdWJzZWN0aW9uIFR5cGUKLQotQGNpbmRleCB0eXBlIG9mIGEgc3ltYm9sCi1AY2luZGV4IHN5bWJvbCB0eXBlCi1UaGUgdHlwZSBhdHRyaWJ1dGUgb2YgYSBzeW1ib2wgY29udGFpbnMgcmVsb2NhdGlvbiAoc2VjdGlvbikKLWluZm9ybWF0aW9uLCBhbnkgZmxhZyBzZXR0aW5ncyBpbmRpY2F0aW5nIHRoYXQgYSBzeW1ib2wgaXMgZXh0ZXJuYWwsIGFuZAotKG9wdGlvbmFsbHkpLCBvdGhlciBpbmZvcm1hdGlvbiBmb3IgbGlua2VycyBhbmQgZGVidWdnZXJzLiAgVGhlIGV4YWN0Ci1mb3JtYXQgZGVwZW5kcyBvbiB0aGUgb2JqZWN0LWNvZGUgb3V0cHV0IGZvcm1hdCBpbiB1c2UuCi0KLUBpZnNldCBhb3V0LWJvdXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBCT1VUCi1AYyBUaGUgZm9sbG93aW5nIGF2b2lkcyBhICJ3aWRvdyIgc3Vic2VjdGlvbiB0aXRsZS4gIEBncm91cCB3b3VsZCBiZQotQGMgYmV0dGVyIGlmIGl0IHdlcmUgYXZhaWxhYmxlIG91dHNpZGUgZXhhbXBsZXMuCi1AbmVlZCAxMDAwCi1Abm9kZSBhLm91dCBTeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlczogQGNvZGV7YS5vdXR9LCBAY29kZXtiLm91dH0KLQotQGNpbmRleCBAY29kZXtiLm91dH0gc3ltYm9sIGF0dHJpYnV0ZXMKLUBjaW5kZXggc3ltYm9sIGF0dHJpYnV0ZXMsIEBjb2Rle2Iub3V0fQotVGhlc2Ugc3ltYm9sIGF0dHJpYnV0ZXMgYXBwZWFyIG9ubHkgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkIGZvcgotb25lIG9mIHRoZSBCZXJrZWxleS1kZXNjZW5kZWQgb2JqZWN0IG91dHB1dCBmb3JtYXRzLS0tQGNvZGV7YS5vdXR9IG9yCi1AY29kZXtiLm91dH0uCi0KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEJPVVQKLUBub2RlIGEub3V0IFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbCBBdHRyaWJ1dGVzOiBAY29kZXthLm91dH0KLQotQGNpbmRleCBAY29kZXthLm91dH0gc3ltYm9sIGF0dHJpYnV0ZXMKLUBjaW5kZXggc3ltYm9sIGF0dHJpYnV0ZXMsIEBjb2Rle2Eub3V0fQotCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZjbGVhcgotQGlmc2V0IEdFTkVSSUMKLUBub2RlIGEub3V0IFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbCBBdHRyaWJ1dGVzOiBAY29kZXthLm91dH0KLQotQGNpbmRleCBAY29kZXthLm91dH0gc3ltYm9sIGF0dHJpYnV0ZXMKLUBjaW5kZXggc3ltYm9sIGF0dHJpYnV0ZXMsIEBjb2Rle2Eub3V0fQotCi1AZW5kIGlmc2V0Ci1AbWVudQotKiBTeW1ib2wgRGVzYzo6ICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yCi0qIFN5bWJvbCBPdGhlcjo6ICAgICAgICAgICAgICAgIE90aGVyCi1AZW5kIG1lbnUKLQotQG5vZGUgU3ltYm9sIERlc2MKLUBzdWJzdWJzZWN0aW9uIERlc2NyaXB0b3IKLQotQGNpbmRleCBkZXNjcmlwdG9yLCBvZiBAY29kZXthLm91dH0gc3ltYm9sCi1UaGlzIGlzIGFuIGFyYml0cmFyeSAxNi1iaXQgdmFsdWUuICBZb3UgbWF5IGVzdGFibGlzaCBhIHN5bWJvbCdzCi1kZXNjcmlwdG9yIHZhbHVlIGJ5IHVzaW5nIGEgQGNvZGV7LmRlc2N9IHN0YXRlbWVudAotKEBweHJlZntEZXNjLCxAY29kZXsuZGVzY319KS4gIEEgZGVzY3JpcHRvciB2YWx1ZSBtZWFucyBub3RoaW5nIHRvCi1AY29kZXtAdmFsdWV7QVN9fS4KLQotQG5vZGUgU3ltYm9sIE90aGVyCi1Ac3Vic3Vic2VjdGlvbiBPdGhlcgotCi1AY2luZGV4IG90aGVyIGF0dHJpYnV0ZSwgb2YgQGNvZGV7YS5vdXR9IHN5bWJvbAotVGhpcyBpcyBhbiBhcmJpdHJhcnkgOC1iaXQgdmFsdWUuICBJdCBtZWFucyBub3RoaW5nIHRvIEBjb2Rle0B2YWx1ZXtBU319LgotQGVuZCBpZnNldAotCi1AaWZzZXQgQ09GRgotQG5vZGUgQ09GRiBTeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlcyBmb3IgQ09GRgotCi1AY2luZGV4IENPRkYgc3ltYm9sIGF0dHJpYnV0ZXMKLUBjaW5kZXggc3ltYm9sIGF0dHJpYnV0ZXMsIENPRkYKLQotVGhlIENPRkYgZm9ybWF0IHN1cHBvcnRzIGEgbXVsdGl0dWRlIG9mIGF1eGlsaWFyeSBzeW1ib2wgYXR0cmlidXRlczsKLWxpa2UgdGhlIHByaW1hcnkgc3ltYm9sIGF0dHJpYnV0ZXMsIHRoZXkgYXJlIHNldCBiZXR3ZWVuIEBjb2Rley5kZWZ9IGFuZAotQGNvZGV7LmVuZGVmfSBkaXJlY3RpdmVzLgotCi1Ac3Vic3Vic2VjdGlvbiBQcmltYXJ5IEF0dHJpYnV0ZXMKLQotQGNpbmRleCBwcmltYXJ5IGF0dHJpYnV0ZXMsIENPRkYgc3ltYm9scwotVGhlIHN5bWJvbCBuYW1lIGlzIHNldCB3aXRoIEBjb2Rley5kZWZ9OyB0aGUgdmFsdWUgYW5kIHR5cGUsCi1yZXNwZWN0aXZlbHksIHdpdGggQGNvZGV7LnZhbH0gYW5kIEBjb2Rley50eXBlfS4KLQotQHN1YnN1YnNlY3Rpb24gQXV4aWxpYXJ5IEF0dHJpYnV0ZXMKLQotQGNpbmRleCBhdXhpbGlhcnkgYXR0cmlidXRlcywgQ09GRiBzeW1ib2xzCi1UaGUgQGNvZGV7QHZhbHVle0FTfX0gZGlyZWN0aXZlcyBAY29kZXsuZGltfSwgQGNvZGV7LmxpbmV9LCBAY29kZXsuc2NsfSwKLUBjb2Rley5zaXplfSwgYW5kIEBjb2Rley50YWd9IGNhbiBnZW5lcmF0ZSBhdXhpbGlhcnkgc3ltYm9sIHRhYmxlCi1pbmZvcm1hdGlvbiBmb3IgQ09GRi4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IFNPTQotQG5vZGUgU09NIFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbCBBdHRyaWJ1dGVzIGZvciBTT00KLQotQGNpbmRleCBTT00gc3ltYm9sIGF0dHJpYnV0ZXMKLUBjaW5kZXggc3ltYm9sIGF0dHJpYnV0ZXMsIFNPTQotCi1UaGUgU09NIGZvcm1hdCBmb3IgdGhlIEhQUEEgc3VwcG9ydHMgYSBtdWx0aXR1ZGUgb2Ygc3ltYm9sIGF0dHJpYnV0ZXMgc2V0IHdpdGgKLXRoZSBAY29kZXsuRVhQT1JUfSBhbmQgQGNvZGV7LklNUE9SVH0gZGlyZWN0aXZlcy4KLQotVGhlIGF0dHJpYnV0ZXMgYXJlIGRlc2NyaWJlZCBpbiBAY2l0ZXtIUDkwMDAgU2VyaWVzIDgwMCBBc3NlbWJseSAKLUxhbmd1YWdlIFJlZmVyZW5jZSBNYW51YWx9IChIUCA5MjQzMi05MDAwMSkgdW5kZXIgdGhlIEBjb2Rle0lNUE9SVH0gYW5kCi1AY29kZXtFWFBPUlR9IGFzc2VtYmxlciBkaXJlY3RpdmUgZG9jdW1lbnRhdGlvbi4KLUBlbmQgaWZzZXQKLQotQG5vZGUgRXhwcmVzc2lvbnMKLUBjaGFwdGVyIEV4cHJlc3Npb25zCi0KLUBjaW5kZXggZXhwcmVzc2lvbnMKLUBjaW5kZXggYWRkcmVzc2VzCi1AY2luZGV4IG51bWVyaWMgdmFsdWVzCi1BbiBAZGZue2V4cHJlc3Npb259IHNwZWNpZmllcyBhbiBhZGRyZXNzIG9yIG51bWVyaWMgdmFsdWUuCi1XaGl0ZXNwYWNlIG1heSBwcmVjZWRlIGFuZC9vciBmb2xsb3cgYW4gZXhwcmVzc2lvbi4KLQotVGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uIG11c3QgYmUgYW4gYWJzb2x1dGUgbnVtYmVyLCBvciBlbHNlIGFuIG9mZnNldCBpbnRvCi1hIHBhcnRpY3VsYXIgc2VjdGlvbi4gIElmIGFuIGV4cHJlc3Npb24gaXMgbm90IGFic29sdXRlLCBhbmQgdGhlcmUgaXMgbm90Ci1lbm91Z2ggaW5mb3JtYXRpb24gd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBzZWVzIHRoZSBleHByZXNzaW9uIHRvIGtub3cgaXRzCi1zZWN0aW9uLCBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIHNvdXJjZSBwcm9ncmFtIG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byBpbnRlcnByZXQKLXRoZSBleHByZXNzaW9uLS0tYnV0IHRoZSBzZWNvbmQgcGFzcyBpcyBjdXJyZW50bHkgbm90IGltcGxlbWVudGVkLgotQGNvZGV7QHZhbHVle0FTfX0gYWJvcnRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGlzIHNpdHVhdGlvbi4KLQotQG1lbnUKLSogRW1wdHkgRXhwcnM6OiAgICAgICAgICAgICAgICAgRW1wdHkgRXhwcmVzc2lvbnMKLSogSW50ZWdlciBFeHByczo6ICAgICAgICAgICAgICAgSW50ZWdlciBFeHByZXNzaW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIEVtcHR5IEV4cHJzCi1Ac2VjdGlvbiBFbXB0eSBFeHByZXNzaW9ucwotCi1AY2luZGV4IGVtcHR5IGV4cHJlc3Npb25zCi1AY2luZGV4IGV4cHJlc3Npb25zLCBlbXB0eQotQW4gZW1wdHkgZXhwcmVzc2lvbiBoYXMgbm8gdmFsdWU6IGl0IGlzIGp1c3Qgd2hpdGVzcGFjZSBvciBudWxsLgotV2hlcmV2ZXIgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiBpcyByZXF1aXJlZCwgeW91IG1heSBvbWl0IHRoZQotZXhwcmVzc2lvbiwgYW5kIEBjb2Rle0B2YWx1ZXtBU319IGFzc3VtZXMgYSB2YWx1ZSBvZiAoYWJzb2x1dGUpIDAuICBUaGlzCi1pcyBjb21wYXRpYmxlIHdpdGggb3RoZXIgYXNzZW1ibGVycy4KLQotQG5vZGUgSW50ZWdlciBFeHBycwotQHNlY3Rpb24gSW50ZWdlciBFeHByZXNzaW9ucwotCi1AY2luZGV4IGludGVnZXIgZXhwcmVzc2lvbnMKLUBjaW5kZXggZXhwcmVzc2lvbnMsIGludGVnZXIKLUFuIEBkZm57aW50ZWdlciBleHByZXNzaW9ufSBpcyBvbmUgb3IgbW9yZSBAZW1waHthcmd1bWVudHN9IGRlbGltaXRlZAotYnkgQGVtcGh7b3BlcmF0b3JzfS4KLQotQG1lbnUKLSogQXJndW1lbnRzOjogICAgICAgICAgICAgICAgICAgQXJndW1lbnRzCi0qIE9wZXJhdG9yczo6ICAgICAgICAgICAgICAgICAgIE9wZXJhdG9ycwotKiBQcmVmaXggT3BzOjogICAgICAgICAgICAgICAgICBQcmVmaXggT3BlcmF0b3JzCi0qIEluZml4IE9wczo6ICAgICAgICAgICAgICAgICAgIEluZml4IE9wZXJhdG9ycwotQGVuZCBtZW51Ci0KLUBub2RlIEFyZ3VtZW50cwotQHN1YnNlY3Rpb24gQXJndW1lbnRzCi0KLUBjaW5kZXggZXhwcmVzc2lvbiBhcmd1bWVudHMKLUBjaW5kZXggYXJndW1lbnRzIGluIGV4cHJlc3Npb25zCi1AY2luZGV4IG9wZXJhbmRzIGluIGV4cHJlc3Npb25zCi1AY2luZGV4IGFyaXRobWV0aWMgb3BlcmFuZHMKLUBkZm57QXJndW1lbnRzfSBhcmUgc3ltYm9scywgbnVtYmVycyBvciBzdWJleHByZXNzaW9ucy4gIEluIG90aGVyCi1jb250ZXh0cyBhcmd1bWVudHMgYXJlIHNvbWV0aW1lcyBjYWxsZWQgYGBhcml0aG1ldGljIG9wZXJhbmRzJycuICBJbgotdGhpcyBtYW51YWwsIHRvIGF2b2lkIGNvbmZ1c2luZyB0aGVtIHdpdGggdGhlIGBgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMnJyBvZgotdGhlIG1hY2hpbmUgbGFuZ3VhZ2UsIHdlIHVzZSB0aGUgdGVybSBgYGFyZ3VtZW50JycgdG8gcmVmZXIgdG8gcGFydHMgb2YKLWV4cHJlc3Npb25zIG9ubHksIHJlc2VydmluZyB0aGUgd29yZCBgYG9wZXJhbmQnJyB0byByZWZlciBvbmx5IHRvIG1hY2hpbmUKLWluc3RydWN0aW9uIG9wZXJhbmRzLgotCi1TeW1ib2xzIGFyZSBldmFsdWF0ZWQgdG8geWllbGQgQHtAdmFye3NlY3Rpb259IEB2YXJ7Tk5OfUB9IHdoZXJlCi1AdmFye3NlY3Rpb259IGlzIG9uZSBvZiB0ZXh0LCBkYXRhLCBic3MsIGFic29sdXRlLAotb3IgdW5kZWZpbmVkLiAgQHZhcntOTk59IGlzIGEgc2lnbmVkLCAyJ3MgY29tcGxlbWVudCAzMiBiaXQKLWludGVnZXIuCi0KLU51bWJlcnMgYXJlIHVzdWFsbHkgaW50ZWdlcnMuCi0KLUEgbnVtYmVyIGNhbiBiZSBhIGZsb251bSBvciBiaWdudW0uICBJbiB0aGlzIGNhc2UsIHlvdSBhcmUgd2FybmVkCi10aGF0IG9ubHkgdGhlIGxvdyBvcmRlciAzMiBiaXRzIGFyZSB1c2VkLCBhbmQgQGNvZGV7QHZhbHVle0FTfX0gcHJldGVuZHMKLXRoZXNlIDMyIGJpdHMgYXJlIGFuIGludGVnZXIuICBZb3UgbWF5IHdyaXRlIGludGVnZXItbWFuaXB1bGF0aW5nCi1pbnN0cnVjdGlvbnMgdGhhdCBhY3Qgb24gZXhvdGljIGNvbnN0YW50cywgY29tcGF0aWJsZSB3aXRoIG90aGVyCi1hc3NlbWJsZXJzLgotCi1AY2luZGV4IHN1YmV4cHJlc3Npb25zCi1TdWJleHByZXNzaW9ucyBhcmUgYSBsZWZ0IHBhcmVudGhlc2lzIEBzYW1weyh9IGZvbGxvd2VkIGJ5IGFuIGludGVnZXIKLWV4cHJlc3Npb24sIGZvbGxvd2VkIGJ5IGEgcmlnaHQgcGFyZW50aGVzaXMgQHNhbXB7KX07IG9yIGEgcHJlZml4Ci1vcGVyYXRvciBmb2xsb3dlZCBieSBhbiBhcmd1bWVudC4KLQotQG5vZGUgT3BlcmF0b3JzCi1Ac3Vic2VjdGlvbiBPcGVyYXRvcnMKLQotQGNpbmRleCBvcGVyYXRvcnMsIGluIGV4cHJlc3Npb25zCi1AY2luZGV4IGFyaXRobWV0aWMgZnVuY3Rpb25zCi1AY2luZGV4IGZ1bmN0aW9ucywgaW4gZXhwcmVzc2lvbnMKLUBkZm57T3BlcmF0b3JzfSBhcmUgYXJpdGhtZXRpYyBmdW5jdGlvbnMsIGxpa2UgQGNvZGV7K30gb3IgQGNvZGV7JX0uICBQcmVmaXgKLW9wZXJhdG9ycyBhcmUgZm9sbG93ZWQgYnkgYW4gYXJndW1lbnQuICBJbmZpeCBvcGVyYXRvcnMgYXBwZWFyCi1iZXR3ZWVuIHRoZWlyIGFyZ3VtZW50cy4gIE9wZXJhdG9ycyBtYXkgYmUgcHJlY2VkZWQgYW5kL29yIGZvbGxvd2VkIGJ5Ci13aGl0ZXNwYWNlLgotCi1Abm9kZSBQcmVmaXggT3BzCi1Ac3Vic2VjdGlvbiBQcmVmaXggT3BlcmF0b3IKLQotQGNpbmRleCBwcmVmaXggb3BlcmF0b3JzCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgdGhlIGZvbGxvd2luZyBAZGZue3ByZWZpeCBvcGVyYXRvcnN9LiAgVGhleSBlYWNoIHRha2UKLW9uZSBhcmd1bWVudCwgd2hpY2ggbXVzdCBiZSBhYnNvbHV0ZS4KLQotQGMgdGhlIHRleC9lbmQgdGV4IHN0dWZmIHN1cnJvdW5kaW5nIHRoaXMgc21hbGwgdGFibGUgaXMgbWVhbnQgdG8gbWFrZQotQGMgaXQgYWxpZ24sIG9uIHRoZSBwcmludGVkIHBhZ2UsIHdpdGggdGhlIHNpbWlsYXIgdGFibGUgaW4gdGhlIG5leHQKLUBjIHNlY3Rpb24gKHdoaWNoIGlzIGluc2lkZSBhbiBlbnVtZXJhdGUpLgotQHRleAotXGdsb2JhbFxhZHZhbmNlXGxlZnRza2lwIGJ5IFxpdGVtaW5kZW50Ci1AZW5kIHRleAotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC0KLUBkZm57TmVnYXRpb259LiAgVHdvJ3MgY29tcGxlbWVudCBuZWdhdGlvbi4KLUBpdGVtIH4KLUBkZm57Q29tcGxlbWVudGF0aW9ufS4gIEJpdHdpc2Ugbm90LgotQGVuZCB0YWJsZQotCi1AdGV4Ci1cZ2xvYmFsXGFkdmFuY2VcbGVmdHNraXAgYnkgLVxpdGVtaW5kZW50Ci1AZW5kIHRleAotCi1Abm9kZSBJbmZpeCBPcHMKLUBzdWJzZWN0aW9uIEluZml4IE9wZXJhdG9ycwotCi1AY2luZGV4IGluZml4IG9wZXJhdG9ycwotQGNpbmRleCBvcGVyYXRvcnMsIHBlcm1pdHRlZCBhcmd1bWVudHMKLUBkZm57SW5maXggb3BlcmF0b3JzfSB0YWtlIHR3byBhcmd1bWVudHMsIG9uZSBvbiBlaXRoZXIgc2lkZS4gIE9wZXJhdG9ycwotaGF2ZSBwcmVjZWRlbmNlLCBidXQgb3BlcmF0aW9ucyB3aXRoIGVxdWFsIHByZWNlZGVuY2UgYXJlIHBlcmZvcm1lZCBsZWZ0Ci10byByaWdodC4gIEFwYXJ0IGZyb20gQGNvZGV7K30gb3IgQGNvZGV7LX0sIGJvdGggYXJndW1lbnRzIG11c3QgYmUKLWFic29sdXRlLCBhbmQgdGhlIHJlc3VsdCBpcyBhYnNvbHV0ZS4KLQotQGVudW1lcmF0ZQotQGNpbmRleCBvcGVyYXRvciBwcmVjZWRlbmNlCi1AY2luZGV4IHByZWNlZGVuY2Ugb2Ygb3BlcmF0b3JzCi0KLUBpdGVtCi1IaWdoZXN0IFByZWNlZGVuY2UKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAqCi1AZGZue011bHRpcGxpY2F0aW9ufS4KLQotQGl0ZW0gLwotQGRmbntEaXZpc2lvbn0uICBUcnVuY2F0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBDIG9wZXJhdG9yIEBzYW1wey99Ci0KLUBpdGVtICUKLUBkZm57UmVtYWluZGVyfS4KLQotQGl0ZW0gPAotQGl0ZW14IDw8Ci1AZGZue1NoaWZ0IExlZnR9LiAgU2FtZSBhcyB0aGUgQyBvcGVyYXRvciBAc2FtcHs8PH0uCi0KLUBpdGVtID4KLUBpdGVteCA+PgotQGRmbntTaGlmdCBSaWdodH0uICBTYW1lIGFzIHRoZSBDIG9wZXJhdG9yIEBzYW1wez4+fS4KLUBlbmQgdGFibGUKLQotQGl0ZW0KLUludGVybWVkaWF0ZSBwcmVjZWRlbmNlCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gfAotCi1AZGZue0JpdHdpc2UgSW5jbHVzaXZlIE9yfS4KLQotQGl0ZW0gJgotQGRmbntCaXR3aXNlIEFuZH0uCi0KLUBpdGVtIF4KLUBkZm57Qml0d2lzZSBFeGNsdXNpdmUgT3J9LgotCi1AaXRlbSAhCi1AZGZue0JpdHdpc2UgT3IgTm90fS4KLUBlbmQgdGFibGUKLQotQGl0ZW0KLUxvd2VzdCBQcmVjZWRlbmNlCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBhZGRpdGlvbiwgcGVybWl0dGVkIGFyZ3VtZW50cwotQGNpbmRleCBwbHVzLCBwZXJtaXR0ZWQgYXJndW1lbnRzCi1AY2luZGV4IGFyZ3VtZW50cyBmb3IgYWRkaXRpb24KLUBpdGVtICsKLUBkZm57QWRkaXRpb259LiAgSWYgZWl0aGVyIGFyZ3VtZW50IGlzIGFic29sdXRlLCB0aGUgcmVzdWx0IGhhcyB0aGUgc2VjdGlvbiBvZgotdGhlIG90aGVyIGFyZ3VtZW50LiAgWW91IG1heSBub3QgYWRkIHRvZ2V0aGVyIGFyZ3VtZW50cyBmcm9tIGRpZmZlcmVudAotc2VjdGlvbnMuCi0KLUBjaW5kZXggc3VidHJhY3Rpb24sIHBlcm1pdHRlZCBhcmd1bWVudHMKLUBjaW5kZXggbWludXMsIHBlcm1pdHRlZCBhcmd1bWVudHMKLUBjaW5kZXggYXJndW1lbnRzIGZvciBzdWJ0cmFjdGlvbgotQGl0ZW0gLQotQGRmbntTdWJ0cmFjdGlvbn0uICBJZiB0aGUgcmlnaHQgYXJndW1lbnQgaXMgYWJzb2x1dGUsIHRoZQotcmVzdWx0IGhhcyB0aGUgc2VjdGlvbiBvZiB0aGUgbGVmdCBhcmd1bWVudC4KLUlmIGJvdGggYXJndW1lbnRzIGFyZSBpbiB0aGUgc2FtZSBzZWN0aW9uLCB0aGUgcmVzdWx0IGlzIGFic29sdXRlLgotWW91IG1heSBub3Qgc3VidHJhY3QgYXJndW1lbnRzIGZyb20gZGlmZmVyZW50IHNlY3Rpb25zLgotQGMgRklYTUUgaXMgdGhlcmUgc3RpbGwgc29tZXRoaW5nIHVzZWZ1bCB0byBzYXkgYWJvdXQgdW5kZWZpbmVkIC0gdW5kZWZpbmVkID8KLUBlbmQgdGFibGUKLUBlbmQgZW51bWVyYXRlCi0KLUluIHNob3J0LCBpdCdzIG9ubHkgbWVhbmluZ2Z1bCB0byBhZGQgb3Igc3VidHJhY3QgdGhlIEBlbXBoe29mZnNldHN9IGluIGFuCi1hZGRyZXNzOyB5b3UgY2FuIG9ubHkgaGF2ZSBhIGRlZmluZWQgc2VjdGlvbiBpbiBvbmUgb2YgdGhlIHR3byBhcmd1bWVudHMuCi0KLUBub2RlIFBzZXVkbyBPcHMKLUBjaGFwdGVyIEFzc2VtYmxlciBEaXJlY3RpdmVzCi0KLUBjaW5kZXggZGlyZWN0aXZlcywgbWFjaGluZSBpbmRlcGVuZGVudAotQGNpbmRleCBwc2V1ZG8tb3BzLCBtYWNoaW5lIGluZGVwZW5kZW50Ci1AY2luZGV4IG1hY2hpbmUgaW5kZXBlbmRlbnQgZGlyZWN0aXZlcwotQWxsIGFzc2VtYmxlciBkaXJlY3RpdmVzIGhhdmUgbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgcGVyaW9kIChAc2FtcHsufSkuCi1UaGUgcmVzdCBvZiB0aGUgbmFtZSBpcyBsZXR0ZXJzLCB1c3VhbGx5IGluIGxvd2VyIGNhc2UuCi0KLVRoaXMgY2hhcHRlciBkaXNjdXNzZXMgZGlyZWN0aXZlcyB0aGF0IGFyZSBhdmFpbGFibGUgcmVnYXJkbGVzcyBvZiB0aGUKLXRhcmdldCBtYWNoaW5lIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIuCi1AaWZzZXQgR0VORVJJQwotU29tZSBtYWNoaW5lIGNvbmZpZ3VyYXRpb25zIHByb3ZpZGUgYWRkaXRpb25hbCBkaXJlY3RpdmVzLgotQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IG1hY2hpbmUtZGlyZWN0aXZlcwotQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9IGZvciBhZGRpdGlvbmFsIGRpcmVjdGl2ZXMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQG1lbnUKLSogQWJvcnQ6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmFib3J0fQotQGlmc2V0IENPRkYKLSogQUJPUlQ6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LkFCT1JUfQotQGVuZCBpZnNldAotCi0qIEFsaWduOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5hbGlnbiBAdmFye2Ficy1leHByfSAsIEB2YXJ7YWJzLWV4cHJ9fQotKiBBc2NpaTo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuYXNjaWkgIkB2YXJ7c3RyaW5nfSJ9QGRvdHN7fQotKiBBc2Npejo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuYXNjaXogIkB2YXJ7c3RyaW5nfSJ9QGRvdHN7fQotKiBCYWxpZ246OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuYmFsaWduIEB2YXJ7YWJzLWV4cHJ9ICwgQHZhcnthYnMtZXhwcn19Ci0qIEJ5dGU6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5ieXRlIEB2YXJ7ZXhwcmVzc2lvbnN9fQotKiBDb21tOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuY29tbSBAdmFye3N5bWJvbH0gLCBAdmFye2xlbmd0aH0gfQotKiBEYXRhOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZGF0YSBAdmFye3N1YnNlY3Rpb259fQotQGlmc2V0IENPRkYKLSogRGVmOjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmRlZiBAdmFye25hbWV9fQotQGVuZCBpZnNldAotQGlmc2V0IGFvdXQtYm91dAotKiBEZXNjOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZGVzYyBAdmFye3N5bWJvbH0sIEB2YXJ7YWJzLWV4cHJlc3Npb259fQotQGVuZCBpZnNldAotQGlmc2V0IENPRkYKLSogRGltOjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmRpbX0KLUBlbmQgaWZzZXQKLQotKiBEb3VibGU6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZG91YmxlIEB2YXJ7ZmxvbnVtc319Ci0qIEVqZWN0OjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lamVjdH0KLSogRWxzZTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmVsc2V9Ci0qIEVuZDo6CQkJCUBjb2Rley5lbmR9Ci1AaWZzZXQgQ09GRgotKiBFbmRlZjo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZW5kZWZ9Ci1AZW5kIGlmc2V0Ci0KLSogRW5kZnVuYzo6ICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmVuZGZ1bmN9Ci0qIEVuZGlmOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lbmRpZn0KLSogRXF1OjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmVxdSBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci0qIEVxdWl2OjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lcXVpdiBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci0qIEVycjo6CQkJCUBjb2Rley5lcnJ9Ci0qIEV4aXRtOjoJCQlAY29kZXsuZXhpdG19Ci0qIEV4dGVybjo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5leHRlcm59Ci0qIEZhaWw6OgkJCUBjb2Rley5mYWlsfQotQGlmY2xlYXIgbm8tZmlsZS1kaXIKLSogRmlsZTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmZpbGUgQHZhcntzdHJpbmd9fQotQGVuZCBpZmNsZWFyCi0KLSogRmlsbDo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmZpbGwgQHZhcntyZXBlYXR9ICwgQHZhcntzaXplfSAsIEB2YXJ7dmFsdWV9fQotKiBGbG9hdDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZmxvYXQgQHZhcntmbG9udW1zfX0KLSogRnVuYzo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmZ1bmN9ICAKLSogR2xvYmFsOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7Lmdsb2JhbCBAdmFye3N5bWJvbH19LCBAY29kZXsuZ2xvYmwgQHZhcntzeW1ib2x9fQotKiBod29yZDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuaHdvcmQgQHZhcntleHByZXNzaW9uc319Ci0qIElkZW50OjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5pZGVudH0KLSogSWY6OiAgICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmlmIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn19Ci0qIEluY2x1ZGU6OiAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5pbmNsdWRlICJAdmFye2ZpbGV9In0KLSogSW50OjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmludCBAdmFye2V4cHJlc3Npb25zfX0KLSogSXJwOjoJCQkJQGNvZGV7LmlycCBAdmFye3N5bWJvbH0sQHZhcnt2YWx1ZXN9fUBkb3Rze30KLSogSXJwYzo6CQkJQGNvZGV7LmlycGMgQHZhcntzeW1ib2x9LEB2YXJ7dmFsdWVzfX1AZG90c3t9Ci0qIExjb21tOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5sY29tbSBAdmFye3N5bWJvbH0gLCBAdmFye2xlbmd0aH19Ci0qIExmbGFnczo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5sZmxhZ3N9Ci1AaWZjbGVhciBuby1saW5lLWRpcgotKiBMaW5lOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubGluZSBAdmFye2xpbmUtbnVtYmVyfX0KLUBlbmQgaWZjbGVhcgotCi0qIExuOjogICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5sbiBAdmFye2xpbmUtbnVtYmVyfX0KLSogTGlua29uY2U6OgkJCUBjb2Rley5saW5rb25jZSBbQHZhcnt0eXBlfV19Ci0qIExpc3Q6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5saXN0fQotKiBMb25nOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubG9uZyBAdmFye2V4cHJlc3Npb25zfX0KLUBpZ25vcmUKLSogTHN5bTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmxzeW0gQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQotQGVuZCBpZ25vcmUKLQotKiBNYWNybzo6CQkJQGNvZGV7Lm1hY3JvIEB2YXJ7bmFtZX0gQHZhcnthcmdzfX1AZG90c3t9Ci0qIE1SSTo6CQkJCUBjb2Rley5tcmkgQHZhcnt2YWx9fQotCi0qIE5vbGlzdDo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5ub2xpc3R9Ci0qIE9jdGE6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5vY3RhIEB2YXJ7YmlnbnVtc319Ci0qIE9yZzo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5vcmcgQHZhcntuZXctbGN9ICwgQHZhcntmaWxsfX0KLSogUDJhbGlnbjo6ICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnAyYWxpZ24gQHZhcnthYnMtZXhwcn0gLCBAdmFye2Ficy1leHByfX0KLSogUHJpbnQ6OgkJCUBjb2Rley5wcmludCBAdmFye3N0cmluZ319Ci0qIFBzaXplOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5wc2l6ZSBAdmFye2xpbmVzfSwgQHZhcntjb2x1bW5zfX0KLSogUHVyZ2VtOjoJCQlAY29kZXsucHVyZ2VtIEB2YXJ7bmFtZX19Ci0qIFF1YWQ6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5xdWFkIEB2YXJ7YmlnbnVtc319Ci0qIFJlcHQ6OgkJCUBjb2Rley5yZXB0IEB2YXJ7Y291bnR9fQotKiBTYnR0bDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2J0dGwgIkB2YXJ7c3ViaGVhZGluZ30ifQotQGlmc2V0IENPRkYKLSogU2NsOjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNjbCBAdmFye2NsYXNzfX0KLSogU2VjdGlvbjo6ICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNlY3Rpb24gQHZhcntuYW1lfSwgQHZhcntzdWJzZWN0aW9ufX0KLUBlbmQgaWZzZXQKLQotKiBTZXQ6OiAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2V0IEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufX0KLSogU2hvcnQ6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNob3J0IEB2YXJ7ZXhwcmVzc2lvbnN9fQotKiBTaW5nbGU6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2luZ2xlIEB2YXJ7ZmxvbnVtc319Ci1AaWZzZXQgQ09GRgotKiBTaXplOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2l6ZX0KLUBlbmQgaWZzZXQKLQotKiBTa2lwOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2tpcCBAdmFye3NpemV9ICwgQHZhcntmaWxsfX0KLSogU2xlYjEyODo6CQkJQGNvZGV7LnNsZWIxMjggQHZhcntleHByZXNzaW9uc319Ci0qIFNwYWNlOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zcGFjZSBAdmFye3NpemV9ICwgQHZhcntmaWxsfX0KLUBpZnNldCBoYXZlLXN0YWJzCi0qIFN0YWI6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zdGFiZCwgLnN0YWJuLCAuc3RhYnN9Ci1AZW5kIGlmc2V0Ci0KLSogU3RyaW5nOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnN0cmluZyAiQHZhcntzdHJ9In0KLSogU3RydWN0OjoJCQlAY29kZXsuc3RydWN0IEB2YXJ7ZXhwcmVzc2lvbn19Ci1AaWZzZXQgRUxGCi0qIFN5bXZlcjo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zeW12ZXIgQHZhcntuYW1lfSxAdmFye25hbWUyQEBub2RlbmFtZX19Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgQ09GRgotKiBUYWc6OiAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsudGFnIEB2YXJ7c3RydWN0bmFtZX19Ci1AZW5kIGlmc2V0Ci0KLSogVGV4dDo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnRleHQgQHZhcntzdWJzZWN0aW9ufX0KLSogVGl0bGU6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnRpdGxlICJAdmFye2hlYWRpbmd9In0KLUBpZnNldCBDT0ZGCi0qIFR5cGU6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley50eXBlIEB2YXJ7aW50fX0KLSogVmFsOjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnZhbCBAdmFye2FkZHJ9fQotQGVuZCBpZnNldAotCi0qIFVsZWIxMjg6OiAgICAgICAgICAgICAgICAgICAgIEBjb2Rley51bGViMTI4IEB2YXJ7ZXhwcmVzc2lvbnN9fQotKiBXb3JkOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsud29yZCBAdmFye2V4cHJlc3Npb25zfX0KLSogRGVwcmVjYXRlZDo6ICAgICAgICAgICAgICAgICAgRGVwcmVjYXRlZCBEaXJlY3RpdmVzCi1AZW5kIG1lbnUKLQotQG5vZGUgQWJvcnQKLUBzZWN0aW9uIEBjb2Rley5hYm9ydH0KLQotQGNpbmRleCBAY29kZXthYm9ydH0gZGlyZWN0aXZlCi1AY2luZGV4IHN0b3BwaW5nIHRoZSBhc3NlbWJseQotVGhpcyBkaXJlY3RpdmUgc3RvcHMgdGhlIGFzc2VtYmx5IGltbWVkaWF0ZWx5LiAgSXQgaXMgZm9yCi1jb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgYXNzZW1ibGVycy4gIFRoZSBvcmlnaW5hbCBpZGVhIHdhcyB0aGF0IHRoZQotYXNzZW1ibHkgbGFuZ3VhZ2Ugc291cmNlIHdvdWxkIGJlIHBpcGVkIGludG8gdGhlIGFzc2VtYmxlci4gIElmIHRoZSBzZW5kZXIKLW9mIHRoZSBzb3VyY2UgcXVpdCwgaXQgY291bGQgdXNlIHRoaXMgZGlyZWN0aXZlIHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvCi1xdWl0IGFsc28uICBPbmUgZGF5IEBjb2Rley5hYm9ydH0gd2lsbCBub3QgYmUgc3VwcG9ydGVkLgotCi1AaWZzZXQgQ09GRgotQG5vZGUgQUJPUlQKLUBzZWN0aW9uIEBjb2Rley5BQk9SVH0KLQotQGNpbmRleCBAY29kZXtBQk9SVH0gZGlyZWN0aXZlCi1XaGVuIHByb2R1Y2luZyBDT0ZGIG91dHB1dCwgQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSBhcyBhCi1zeW5vbnltIGZvciBAc2FtcHsuYWJvcnR9LgotCi1AaWZzZXQgQk9VVAotV2hlbiBwcm9kdWNpbmcgQGNvZGV7Yi5vdXR9IG91dHB1dCwgQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSwKLWJ1dCBpZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBBbGlnbgotQHNlY3Rpb24gQGNvZGV7LmFsaWduIEB2YXJ7YWJzLWV4cHJ9LCBAdmFye2Ficy1leHByfSwgQHZhcnthYnMtZXhwcn19Ci0KLUBjaW5kZXggcGFkZGluZyB0aGUgbG9jYXRpb24gY291bnRlcgotQGNpbmRleCBAY29kZXthbGlnbn0gZGlyZWN0aXZlCi1QYWQgdGhlIGxvY2F0aW9uIGNvdW50ZXIgKGluIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24pIHRvIGEgcGFydGljdWxhciBzdG9yYWdlCi1ib3VuZGFyeS4gIFRoZSBmaXJzdCBleHByZXNzaW9uICh3aGljaCBtdXN0IGJlIGFic29sdXRlKSBpcyB0aGUgYWxpZ25tZW50Ci1yZXF1aXJlZCwgYXMgZGVzY3JpYmVkIGJlbG93LgotCi1UaGUgc2Vjb25kIGV4cHJlc3Npb24gKGFsc28gYWJzb2x1dGUpIGdpdmVzIHRoZSBmaWxsIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiB0aGUKLXBhZGRpbmcgYnl0ZXMuICBJdCAoYW5kIHRoZSBjb21tYSkgbWF5IGJlIG9taXR0ZWQuICBJZiBpdCBpcyBvbWl0dGVkLCB0aGUKLXBhZGRpbmcgYnl0ZXMgYXJlIG5vcm1hbGx5IHplcm8uICBIb3dldmVyLCBvbiBzb21lIHN5c3RlbXMsIGlmIHRoZSBzZWN0aW9uIGlzCi1tYXJrZWQgYXMgY29udGFpbmluZyBjb2RlIGFuZCB0aGUgZmlsbCB2YWx1ZSBpcyBvbWl0dGVkLCB0aGUgc3BhY2UgaXMgZmlsbGVkCi13aXRoIG5vLW9wIGluc3RydWN0aW9ucy4KLQotVGhlIHRoaXJkIGV4cHJlc3Npb24gaXMgYWxzbyBhYnNvbHV0ZSwgYW5kIGlzIGFsc28gb3B0aW9uYWwuICBJZiBpdCBpcyBwcmVzZW50LAotaXQgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgYnkgdGhpcyBhbGlnbm1lbnQKLWRpcmVjdGl2ZS4gIElmIGRvaW5nIHRoZSBhbGlnbm1lbnQgd291bGQgcmVxdWlyZSBza2lwcGluZyBtb3JlIGJ5dGVzIHRoYW4gdGhlCi1zcGVjaWZpZWQgbWF4aW11bSwgdGhlbiB0aGUgYWxpZ25tZW50IGlzIG5vdCBkb25lIGF0IGFsbC4gIFlvdSBjYW4gb21pdCB0aGUKLWZpbGwgdmFsdWUgKHRoZSBzZWNvbmQgYXJndW1lbnQpIGVudGlyZWx5IGJ5IHNpbXBseSB1c2luZyB0d28gY29tbWFzIGFmdGVyIHRoZQotcmVxdWlyZWQgYWxpZ25tZW50OyB0aGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdGhlIGFsaWdubWVudCB0byBiZSBmaWxsZWQKLXdpdGggbm8tb3AgaW5zdHJ1Y3Rpb25zIHdoZW4gYXBwcm9wcmlhdGUuCi0KLVRoZSB3YXkgdGhlIHJlcXVpcmVkIGFsaWdubWVudCBpcyBzcGVjaWZpZWQgdmFyaWVzIGZyb20gc3lzdGVtIHRvIHN5c3RlbS4KLUZvciB0aGUgYTI5aywgaHBwYSwgbTY4aywgbTg4aywgdzY1LCBzcGFyYywgYW5kIEhpdGFjaGkgU0gsIGFuZCBpMzg2IHVzaW5nIEVMRgotZm9ybWF0LAotdGhlIGZpcnN0IGV4cHJlc3Npb24gaXMgdGhlCi1hbGlnbm1lbnQgcmVxdWVzdCBpbiBieXRlcy4gIEZvciBleGFtcGxlIEBzYW1wey5hbGlnbiA4fSBhZHZhbmNlcwotdGhlIGxvY2F0aW9uIGNvdW50ZXIgdW50aWwgaXQgaXMgYSBtdWx0aXBsZSBvZiA4LiAgSWYgdGhlIGxvY2F0aW9uIGNvdW50ZXIKLWlzIGFscmVhZHkgYSBtdWx0aXBsZSBvZiA4LCBubyBjaGFuZ2UgaXMgbmVlZGVkLgotCi1Gb3Igb3RoZXIgc3lzdGVtcywgaW5jbHVkaW5nIHRoZSBpMzg2IHVzaW5nIGEub3V0IGZvcm1hdCwgaXQgaXMgdGhlCi1udW1iZXIgb2YgbG93LW9yZGVyIHplcm8gYml0cyB0aGUgbG9jYXRpb24gY291bnRlciBtdXN0IGhhdmUgYWZ0ZXIKLWFkdmFuY2VtZW50LiAgRm9yIGV4YW1wbGUgQHNhbXB7LmFsaWduIDN9IGFkdmFuY2VzIHRoZSBsb2NhdGlvbgotY291bnRlciB1bnRpbCBpdCBhIG11bHRpcGxlIG9mIDguICBJZiB0aGUgbG9jYXRpb24gY291bnRlciBpcyBhbHJlYWR5IGEKLW11bHRpcGxlIG9mIDgsIG5vIGNoYW5nZSBpcyBuZWVkZWQuCi0KLVRoaXMgaW5jb25zaXN0ZW5jeSBpcyBkdWUgdG8gdGhlIGRpZmZlcmVudCBiZWhhdmlvcnMgb2YgdGhlIHZhcmlvdXMKLW5hdGl2ZSBhc3NlbWJsZXJzIGZvciB0aGVzZSBzeXN0ZW1zIHdoaWNoIEdBUyBtdXN0IGVtdWxhdGUuCi1HQVMgYWxzbyBwcm92aWRlcyBAY29kZXsuYmFsaWdufSBhbmQgQGNvZGV7LnAyYWxpZ259IGRpcmVjdGl2ZXMsCi1kZXNjcmliZWQgbGF0ZXIsIHdoaWNoIGhhdmUgYSBjb25zaXN0ZW50IGJlaGF2aW9yIGFjcm9zcyBhbGwKLWFyY2hpdGVjdHVyZXMgKGJ1dCBhcmUgc3BlY2lmaWMgdG8gR0FTKS4KLQotQG5vZGUgQXNjaWkKLUBzZWN0aW9uIEBjb2Rley5hc2NpaSAiQHZhcntzdHJpbmd9In1AZG90c3t9Ci0KLUBjaW5kZXggQGNvZGV7YXNjaWl9IGRpcmVjdGl2ZQotQGNpbmRleCBzdHJpbmcgbGl0ZXJhbHMKLUBjb2Rley5hc2NpaX0gZXhwZWN0cyB6ZXJvIG9yIG1vcmUgc3RyaW5nIGxpdGVyYWxzIChAcHhyZWZ7U3RyaW5nc30pCi1zZXBhcmF0ZWQgYnkgY29tbWFzLiAgSXQgYXNzZW1ibGVzIGVhY2ggc3RyaW5nICh3aXRoIG5vIGF1dG9tYXRpYwotdHJhaWxpbmcgemVybyBieXRlKSBpbnRvIGNvbnNlY3V0aXZlIGFkZHJlc3Nlcy4KLQotQG5vZGUgQXNjaXoKLUBzZWN0aW9uIEBjb2Rley5hc2NpeiAiQHZhcntzdHJpbmd9In1AZG90c3t9Ci0KLUBjaW5kZXggQGNvZGV7YXNjaXp9IGRpcmVjdGl2ZQotQGNpbmRleCB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5ncwotQGNpbmRleCBudWxsLXRlcm1pbmF0ZWQgc3RyaW5ncwotQGNvZGV7LmFzY2l6fSBpcyBqdXN0IGxpa2UgQGNvZGV7LmFzY2lpfSwgYnV0IGVhY2ggc3RyaW5nIGlzIGZvbGxvd2VkIGJ5Ci1hIHplcm8gYnl0ZS4gIFRoZSBgYHonJyBpbiBAc2FtcHsuYXNjaXp9IHN0YW5kcyBmb3IgYGB6ZXJvJycuCi0KLUBub2RlIEJhbGlnbgotQHNlY3Rpb24gQGNvZGV7LmJhbGlnblt3bF0gQHZhcnthYnMtZXhwcn0sIEB2YXJ7YWJzLWV4cHJ9LCBAdmFye2Ficy1leHByfX0KLQotQGNpbmRleCBwYWRkaW5nIHRoZSBsb2NhdGlvbiBjb3VudGVyIGdpdmVuIG51bWJlciBvZiBieXRlcwotQGNpbmRleCBAY29kZXtiYWxpZ259IGRpcmVjdGl2ZQotUGFkIHRoZSBsb2NhdGlvbiBjb3VudGVyIChpbiB0aGUgY3VycmVudCBzdWJzZWN0aW9uKSB0byBhIHBhcnRpY3VsYXIKLXN0b3JhZ2UgYm91bmRhcnkuICBUaGUgZmlyc3QgZXhwcmVzc2lvbiAod2hpY2ggbXVzdCBiZSBhYnNvbHV0ZSkgaXMgdGhlCi1hbGlnbm1lbnQgcmVxdWVzdCBpbiBieXRlcy4gIEZvciBleGFtcGxlIEBzYW1wey5iYWxpZ24gOH0gYWR2YW5jZXMKLXRoZSBsb2NhdGlvbiBjb3VudGVyIHVudGlsIGl0IGlzIGEgbXVsdGlwbGUgb2YgOC4gIElmIHRoZSBsb2NhdGlvbiBjb3VudGVyCi1pcyBhbHJlYWR5IGEgbXVsdGlwbGUgb2YgOCwgbm8gY2hhbmdlIGlzIG5lZWRlZC4KLQotVGhlIHNlY29uZCBleHByZXNzaW9uIChhbHNvIGFic29sdXRlKSBnaXZlcyB0aGUgZmlsbCB2YWx1ZSB0byBiZSBzdG9yZWQgaW4gdGhlCi1wYWRkaW5nIGJ5dGVzLiAgSXQgKGFuZCB0aGUgY29tbWEpIG1heSBiZSBvbWl0dGVkLiAgSWYgaXQgaXMgb21pdHRlZCwgdGhlCi1wYWRkaW5nIGJ5dGVzIGFyZSBub3JtYWxseSB6ZXJvLiAgSG93ZXZlciwgb24gc29tZSBzeXN0ZW1zLCBpZiB0aGUgc2VjdGlvbiBpcwotbWFya2VkIGFzIGNvbnRhaW5pbmcgY29kZSBhbmQgdGhlIGZpbGwgdmFsdWUgaXMgb21pdHRlZCwgdGhlIHNwYWNlIGlzIGZpbGxlZAotd2l0aCBuby1vcCBpbnN0cnVjdGlvbnMuCi0KLVRoZSB0aGlyZCBleHByZXNzaW9uIGlzIGFsc28gYWJzb2x1dGUsIGFuZCBpcyBhbHNvIG9wdGlvbmFsLiAgSWYgaXQgaXMgcHJlc2VudCwKLWl0IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIGJ5IHRoaXMgYWxpZ25tZW50Ci1kaXJlY3RpdmUuICBJZiBkb2luZyB0aGUgYWxpZ25tZW50IHdvdWxkIHJlcXVpcmUgc2tpcHBpbmcgbW9yZSBieXRlcyB0aGFuIHRoZQotc3BlY2lmaWVkIG1heGltdW0sIHRoZW4gdGhlIGFsaWdubWVudCBpcyBub3QgZG9uZSBhdCBhbGwuICBZb3UgY2FuIG9taXQgdGhlCi1maWxsIHZhbHVlICh0aGUgc2Vjb25kIGFyZ3VtZW50KSBlbnRpcmVseSBieSBzaW1wbHkgdXNpbmcgdHdvIGNvbW1hcyBhZnRlciB0aGUKLXJlcXVpcmVkIGFsaWdubWVudDsgdGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRoZSBhbGlnbm1lbnQgdG8gYmUgZmlsbGVkCi13aXRoIG5vLW9wIGluc3RydWN0aW9ucyB3aGVuIGFwcHJvcHJpYXRlLgotCi1AY2luZGV4IEBjb2Rle2JhbGlnbnd9IGRpcmVjdGl2ZQotQGNpbmRleCBAY29kZXtiYWxpZ25sfSBkaXJlY3RpdmUKLVRoZSBAY29kZXsuYmFsaWdud30gYW5kIEBjb2Rley5iYWxpZ25sfSBkaXJlY3RpdmVzIGFyZSB2YXJpYW50cyBvZiB0aGUKLUBjb2Rley5iYWxpZ259IGRpcmVjdGl2ZS4gIFRoZSBAY29kZXsuYmFsaWdud30gZGlyZWN0aXZlIHRyZWF0cyB0aGUgZmlsbAotcGF0dGVybiBhcyBhIHR3byBieXRlIHdvcmQgdmFsdWUuICBUaGUgQGNvZGV7LmJhbGlnbmx9IGRpcmVjdGl2ZXMgdHJlYXRzIHRoZQotZmlsbCBwYXR0ZXJuIGFzIGEgZm91ciBieXRlIGxvbmd3b3JkIHZhbHVlLiAgRm9yIGV4YW1wbGUsIEBjb2Rley5iYWxpZ253Ci00LDB4MzY4ZH0gd2lsbCBhbGlnbiB0byBhIG11bHRpcGxlIG9mIDQuICBJZiBpdCBza2lwcyB0d28gYnl0ZXMsIHRoZXkgd2lsbCBiZQotZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlIDB4MzY4ZCAodGhlIGV4YWN0IHBsYWNlbWVudCBvZiB0aGUgYnl0ZXMgZGVwZW5kcyB1cG9uCi10aGUgZW5kaWFubmVzcyBvZiB0aGUgcHJvY2Vzc29yKS4gIElmIGl0IHNraXBzIDEgb3IgMyBieXRlcywgdGhlIGZpbGwgdmFsdWUgaXMKLXVuZGVmaW5lZC4KLQotQG5vZGUgQnl0ZQotQHNlY3Rpb24gQGNvZGV7LmJ5dGUgQHZhcntleHByZXNzaW9uc319Ci0KLUBjaW5kZXggQGNvZGV7Ynl0ZX0gZGlyZWN0aXZlCi1AY2luZGV4IGludGVnZXJzLCBvbmUgYnl0ZQotQGNvZGV7LmJ5dGV9IGV4cGVjdHMgemVybyBvciBtb3JlIGV4cHJlc3Npb25zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLgotRWFjaCBleHByZXNzaW9uIGlzIGFzc2VtYmxlZCBpbnRvIHRoZSBuZXh0IGJ5dGUuCi0KLUBub2RlIENvbW0KLUBzZWN0aW9uIEBjb2Rley5jb21tIEB2YXJ7c3ltYm9sfSAsIEB2YXJ7bGVuZ3RofSB9Ci0KLUBjaW5kZXggQGNvZGV7Y29tbX0gZGlyZWN0aXZlCi1AY2luZGV4IHN5bWJvbCwgY29tbW9uCi1AY29kZXsuY29tbX0gZGVjbGFyZXMgYSBjb21tb24gc3ltYm9sIG5hbWVkIEB2YXJ7c3ltYm9sfS4gIFdoZW4gbGlua2luZywgYQotY29tbW9uIHN5bWJvbCBpbiBvbmUgb2JqZWN0IGZpbGUgbWF5IGJlIG1lcmdlZCB3aXRoIGEgZGVmaW5lZCBvciBjb21tb24gc3ltYm9sCi1vZiB0aGUgc2FtZSBuYW1lIGluIGFub3RoZXIgb2JqZWN0IGZpbGUuICBJZiBAY29kZXtAdmFsdWV7TER9fSBkb2VzIG5vdCBzZWUgYQotZGVmaW5pdGlvbiBmb3IgdGhlIHN5bWJvbC0tanVzdCBvbmUgb3IgbW9yZSBjb21tb24gc3ltYm9scy0tdGhlbiBpdCB3aWxsCi1hbGxvY2F0ZSBAdmFye2xlbmd0aH0gYnl0ZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuICBAdmFye2xlbmd0aH0gbXVzdCBiZSBhbgotYWJzb2x1dGUgZXhwcmVzc2lvbi4gIElmIEBjb2Rle0B2YWx1ZXtMRH19IHNlZXMgbXVsdGlwbGUgY29tbW9uIHN5bWJvbHMgd2l0aAotdGhlIHNhbWUgbmFtZSwgYW5kIHRoZXkgZG8gbm90IGFsbCBoYXZlIHRoZSBzYW1lIHNpemUsIGl0IHdpbGwgYWxsb2NhdGUgc3BhY2UKLXVzaW5nIHRoZSBsYXJnZXN0IHNpemUuCi0KLUBpZnNldCBFTEYKLVdoZW4gdXNpbmcgRUxGLCB0aGUgQGNvZGV7LmNvbW19IGRpcmVjdGl2ZSB0YWtlcyBhbiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudC4KLVRoaXMgaXMgdGhlIGRlc2lyZWQgYWxpZ25tZW50IG9mIHRoZSBzeW1ib2wsIHNwZWNpZmllZCBhcyBhIGJ5dGUgYm91bmRhcnkgKGZvcgotZXhhbXBsZSwgYW4gYWxpZ25tZW50IG9mIDE2IG1lYW5zIHRoYXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IDQgYml0cyBvZiB0aGUKLWFkZHJlc3Mgc2hvdWxkIGJlIHplcm8pLiAgVGhlIGFsaWdubWVudCBtdXN0IGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24sIGFuZCBpdAotbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4gIElmIEBjb2Rle0B2YWx1ZXtMRH19IGFsbG9jYXRlcyB1bmluaXRpYWxpemVkIG1lbW9yeQotZm9yIHRoZSBjb21tb24gc3ltYm9sLCBpdCB3aWxsIHVzZSB0aGUgYWxpZ25tZW50IHdoZW4gcGxhY2luZyB0aGUgc3ltYm9sLiAgSWYKLW5vIGFsaWdubWVudCBpcyBzcGVjaWZpZWQsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgc2V0IHRoZSBhbGlnbm1lbnQgdG8gdGhlCi1sYXJnZXN0IHBvd2VyIG9mIHR3byBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHN5bWJvbCwgdXAgdG8gYQotbWF4aW11bSBvZiAxNi4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEhQUEEKLVRoZSBzeW50YXggZm9yIEBjb2Rley5jb21tfSBkaWZmZXJzIHNsaWdodGx5IG9uIHRoZSBIUFBBLiAgVGhlIHN5bnRheCBpcwotQHNhbXB7QHZhcntzeW1ib2x9IC5jb21tLCBAdmFye2xlbmd0aH19OyBAdmFye3N5bWJvbH0gaXMgb3B0aW9uYWwuCi1AZW5kIGlmc2V0Ci0KLUBub2RlIERhdGEKLUBzZWN0aW9uIEBjb2Rley5kYXRhIEB2YXJ7c3Vic2VjdGlvbn19Ci0KLUBjaW5kZXggQGNvZGV7ZGF0YX0gZGlyZWN0aXZlCi1AY29kZXsuZGF0YX0gdGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdG8gYXNzZW1ibGUgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnRzIG9udG8gdGhlCi1lbmQgb2YgdGhlIGRhdGEgc3Vic2VjdGlvbiBudW1iZXJlZCBAdmFye3N1YnNlY3Rpb259ICh3aGljaCBpcyBhbgotYWJzb2x1dGUgZXhwcmVzc2lvbikuICBJZiBAdmFye3N1YnNlY3Rpb259IGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzCi10byB6ZXJvLgotCi1AaWZzZXQgQ09GRgotQG5vZGUgRGVmCi1Ac2VjdGlvbiBAY29kZXsuZGVmIEB2YXJ7bmFtZX19Ci0KLUBjaW5kZXggQGNvZGV7ZGVmfSBkaXJlY3RpdmUKLUBjaW5kZXggQ09GRiBzeW1ib2xzLCBkZWJ1Z2dpbmcKLUBjaW5kZXggZGVidWdnaW5nIENPRkYgc3ltYm9scwotQmVnaW4gZGVmaW5pbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbCBAdmFye25hbWV9OyB0aGUKLWRlZmluaXRpb24gZXh0ZW5kcyB1bnRpbCB0aGUgQGNvZGV7LmVuZGVmfSBkaXJlY3RpdmUgaXMgZW5jb3VudGVyZWQuCi1AaWZzZXQgQk9VVAotCi1UaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IG9ic2VydmVkIHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCBmb3IgQ09GRgotZm9ybWF0IG91dHB1dDsgd2hlbiBwcm9kdWNpbmcgQGNvZGV7Yi5vdXR9LCBAc2FtcHsuZGVmfSBpcyByZWNvZ25pemVkLAotYnV0IGlnbm9yZWQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBpZnNldCBhb3V0LWJvdXQKLUBub2RlIERlc2MKLUBzZWN0aW9uIEBjb2Rley5kZXNjIEB2YXJ7c3ltYm9sfSwgQHZhcnthYnMtZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7ZGVzY30gZGlyZWN0aXZlCi1AY2luZGV4IENPRkYgc3ltYm9sIGRlc2NyaXB0b3IKLUBjaW5kZXggc3ltYm9sIGRlc2NyaXB0b3IsIENPRkYKLVRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHN5bWJvbCAoQHB4cmVme1N5bWJvbCBBdHRyaWJ1dGVzfSkKLXRvIHRoZSBsb3cgMTYgYml0cyBvZiBhbiBhYnNvbHV0ZSBleHByZXNzaW9uLgotCi1AaWZzZXQgQ09GRgotVGhlIEBzYW1wey5kZXNjfSBkaXJlY3RpdmUgaXMgbm90IGF2YWlsYWJsZSB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzCi1jb25maWd1cmVkIGZvciBDT0ZGIG91dHB1dDsgaXQgaXMgb25seSBmb3IgQGNvZGV7YS5vdXR9IG9yIEBjb2Rle2Iub3V0fQotb2JqZWN0IGZvcm1hdC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXRpYmlsaXR5LCBAY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzCi1pdCwgYnV0IHByb2R1Y2VzIG5vIG91dHB1dCwgd2hlbiBjb25maWd1cmVkIGZvciBDT0ZGLgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1AaWZzZXQgQ09GRgotQG5vZGUgRGltCi1Ac2VjdGlvbiBAY29kZXsuZGltfQotCi1AY2luZGV4IEBjb2Rle2RpbX0gZGlyZWN0aXZlCi1AY2luZGV4IENPRkYgYXV4aWxpYXJ5IHN5bWJvbCBpbmZvcm1hdGlvbgotQGNpbmRleCBhdXhpbGlhcnkgc3ltYm9sIGluZm9ybWF0aW9uLCBDT0ZGCi1UaGlzIGRpcmVjdGl2ZSBpcyBnZW5lcmF0ZWQgYnkgY29tcGlsZXJzIHRvIGluY2x1ZGUgYXV4aWxpYXJ5IGRlYnVnZ2luZwotaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEl0IGlzIG9ubHkgcGVybWl0dGVkIGluc2lkZQotQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlycy4KLUBpZnNldCBCT1VUCi0KLUBzYW1wey5kaW19IGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIGdlbmVyYXRpbmcgQ09GRiBmb3JtYXQgb3V0cHV0OyB3aGVuCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBnZW5lcmF0aW5nIEBjb2Rle2Iub3V0fSwgaXQgYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSBidXQKLWlnbm9yZXMgaXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIERvdWJsZQotQHNlY3Rpb24gQGNvZGV7LmRvdWJsZSBAdmFye2Zsb251bXN9fQotCi1AY2luZGV4IEBjb2Rle2RvdWJsZX0gZGlyZWN0aXZlCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50IG51bWJlcnMgKGRvdWJsZSkKLUBjb2Rley5kb3VibGV9IGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMuICBJdAotYXNzZW1ibGVzIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCi1AaWZzZXQgR0VORVJJQwotVGhlIGV4YWN0IGtpbmQgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBlbWl0dGVkIGRlcGVuZHMgb24gaG93Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkLiAgQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IElFRUVGTE9BVAotT24gdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseSBAc2FtcHsuZG91YmxlfSBlbWl0cyA2NC1iaXQgZmxvYXRpbmctcG9pbnQgbnVtYmVycwotaW4gQHNje2llZWV9IGZvcm1hdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBFamVjdAotQHNlY3Rpb24gQGNvZGV7LmVqZWN0fQotCi1AY2luZGV4IEBjb2Rle2VqZWN0fSBkaXJlY3RpdmUKLUBjaW5kZXggbmV3IHBhZ2UsIGluIGxpc3RpbmdzCi1AY2luZGV4IHBhZ2UsIGluIGxpc3RpbmdzCi1AY2luZGV4IGxpc3RpbmcgY29udHJvbDogbmV3IHBhZ2UKLUZvcmNlIGEgcGFnZSBicmVhayBhdCB0aGlzIHBvaW50LCB3aGVuIGdlbmVyYXRpbmcgYXNzZW1ibHkgbGlzdGluZ3MuCi0KLUBub2RlIEVsc2UKLUBzZWN0aW9uIEBjb2Rley5lbHNlfQotCi1AY2luZGV4IEBjb2Rle2Vsc2V9IGRpcmVjdGl2ZQotQGNvZGV7LmVsc2V9IGlzIHBhcnQgb2YgdGhlIEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnQgZm9yIGNvbmRpdGlvbmFsCi1hc3NlbWJseTsgQHB4cmVme0lmLCxAY29kZXsuaWZ9fS4gIEl0IG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZWN0aW9uCi1vZiBjb2RlIHRvIGJlIGFzc2VtYmxlZCBpZiB0aGUgY29uZGl0aW9uIGZvciB0aGUgcHJlY2VkaW5nIEBjb2Rley5pZn0KLXdhcyBmYWxzZS4KLQotQG5vZGUgRW5kCi1Ac2VjdGlvbiBAY29kZXsuZW5kfQotCi1AY2luZGV4IEBjb2Rle2VuZH0gZGlyZWN0aXZlCi1AY29kZXsuZW5kfSBtYXJrcyB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseSBmaWxlLiAgQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBub3QKLXByb2Nlc3MgYW55dGhpbmcgaW4gdGhlIGZpbGUgcGFzdCB0aGUgQGNvZGV7LmVuZH0gZGlyZWN0aXZlLgotCi1AaWZzZXQgQ09GRgotQG5vZGUgRW5kZWYKLUBzZWN0aW9uIEBjb2Rley5lbmRlZn0KLQotQGNpbmRleCBAY29kZXtlbmRlZn0gZGlyZWN0aXZlCi1UaGlzIGRpcmVjdGl2ZSBmbGFncyB0aGUgZW5kIG9mIGEgc3ltYm9sIGRlZmluaXRpb24gYmVndW4gd2l0aAotQGNvZGV7LmRlZn0uCi1AaWZzZXQgQk9VVAotCi1Ac2FtcHsuZW5kZWZ9IGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIGdlbmVyYXRpbmcgQ09GRiBmb3JtYXQgb3V0cHV0OyBpZgotQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCB0byBnZW5lcmF0ZSBAY29kZXtiLm91dH0sIGl0IGFjY2VwdHMgdGhpcwotZGlyZWN0aXZlIGJ1dCBpZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBFbmRmdW5jCi1Ac2VjdGlvbiBAY29kZXsuZW5kZnVuY30KLUBjaW5kZXggQGNvZGV7ZW5kZnVuY30gZGlyZWN0aXZlCi1AY29kZXsuZW5kZnVuY30gbWFya3MgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uIHNwZWNpZmllZCB3aXRoIEBjb2Rley5mdW5jfS4KLQotQG5vZGUgRW5kaWYKLUBzZWN0aW9uIEBjb2Rley5lbmRpZn0KLQotQGNpbmRleCBAY29kZXtlbmRpZn0gZGlyZWN0aXZlCi1AY29kZXsuZW5kaWZ9IGlzIHBhcnQgb2YgdGhlIEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnQgZm9yIGNvbmRpdGlvbmFsIGFzc2VtYmx5OwotaXQgbWFya3MgdGhlIGVuZCBvZiBhIGJsb2NrIG9mIGNvZGUgdGhhdCBpcyBvbmx5IGFzc2VtYmxlZAotY29uZGl0aW9uYWxseS4gIEB4cmVme0lmLCxAY29kZXsuaWZ9fS4KLQotQG5vZGUgRXF1Ci1Ac2VjdGlvbiBAY29kZXsuZXF1IEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufX0KLQotQGNpbmRleCBAY29kZXtlcXV9IGRpcmVjdGl2ZQotQGNpbmRleCBhc3NpZ25pbmcgdmFsdWVzIHRvIHN5bWJvbHMKLUBjaW5kZXggc3ltYm9scywgYXNzaWduaW5nIHZhbHVlcyB0bwotVGhpcyBkaXJlY3RpdmUgc2V0cyB0aGUgdmFsdWUgb2YgQHZhcntzeW1ib2x9IHRvIEB2YXJ7ZXhwcmVzc2lvbn0uCi1JdCBpcyBzeW5vbnltb3VzIHdpdGggQHNhbXB7LnNldH07IEBweHJlZntTZXQsLEBjb2Rley5zZXR9fS4KLQotQGlmc2V0IEhQUEEKLVRoZSBzeW50YXggZm9yIEBjb2Rle2VxdX0gb24gdGhlIEhQUEEgaXMgCi1Ac2FtcHtAdmFye3N5bWJvbH0gLmVxdSBAdmFye2V4cHJlc3Npb259fS4KLUBlbmQgaWZzZXQKLQotQG5vZGUgRXF1aXYKLUBzZWN0aW9uIEBjb2Rley5lcXVpdiBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci1AY2luZGV4IEBjb2Rle2VxdWl2fSBkaXJlY3RpdmUKLVRoZSBAY29kZXsuZXF1aXZ9IGRpcmVjdGl2ZSBpcyBsaWtlIEBjb2Rley5lcXV9IGFuZCBAY29kZXsuc2V0fSwgZXhjZXB0IHRoYXQKLXRoZSBhc3NlbWJsZXIgd2lsbCBzaWduYWwgYW4gZXJyb3IgaWYgQHZhcntzeW1ib2x9IGlzIGFscmVhZHkgZGVmaW5lZC4KLQotRXhjZXB0IGZvciB0aGUgY29udGVudHMgb2YgdGhlIGVycm9yIG1lc3NhZ2UsIHRoaXMgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIAotQHNtYWxsZXhhbXBsZQotLmlmZGVmIFNZTQotLmVycgotLmVuZGlmCi0uZXF1IFNZTSxWQUwKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIEVycgotQHNlY3Rpb24gQGNvZGV7LmVycn0KLUBjaW5kZXggQGNvZGV7ZXJyfSBkaXJlY3RpdmUKLUlmIEBjb2Rle0B2YWx1ZXtBU319IGFzc2VtYmxlcyBhIEBjb2Rley5lcnJ9IGRpcmVjdGl2ZSwgaXQgd2lsbCBwcmludCBhbiBlcnJvcgotbWVzc2FnZSBhbmQsIHVubGVzcyB0aGUgQGNvZGV7LVp9IG9wdGlvbiB3YXMgdXNlZCwgaXQgd2lsbCBub3QgZ2VuZXJhdGUgYW4KLW9iamVjdCBmaWxlLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBzaWduYWwgZXJyb3IgYW4gY29uZGl0aW9uYWxseSBjb21waWxlZCBjb2RlLgotCi1Abm9kZSBFeGl0bQotQHNlY3Rpb24gQGNvZGV7LmV4aXRtfQotRXhpdCBlYXJseSBmcm9tIHRoZSBjdXJyZW50IG1hY3JvIGRlZmluaXRpb24uICBAeHJlZntNYWNyb30uCi0KLUBub2RlIEV4dGVybgotQHNlY3Rpb24gQGNvZGV7LmV4dGVybn0KLQotQGNpbmRleCBAY29kZXtleHRlcm59IGRpcmVjdGl2ZQotQGNvZGV7LmV4dGVybn0gaXMgYWNjZXB0ZWQgaW4gdGhlIHNvdXJjZSBwcm9ncmFtLS0tZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggb3RoZXIgYXNzZW1ibGVycy0tLWJ1dCBpdCBpcyBpZ25vcmVkLiAgQGNvZGV7QHZhbHVle0FTfX0gdHJlYXRzCi1hbGwgdW5kZWZpbmVkIHN5bWJvbHMgYXMgZXh0ZXJuYWwuCi0KLUBub2RlIEZhaWwKLUBzZWN0aW9uIEBjb2Rley5mYWlsIEB2YXJ7ZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7ZmFpbH0gZGlyZWN0aXZlCi1HZW5lcmF0ZXMgYW4gZXJyb3Igb3IgYSB3YXJuaW5nLiAgSWYgdGhlIHZhbHVlIG9mIHRoZSBAdmFye2V4cHJlc3Npb259IGlzIDUwMAotb3IgbW9yZSwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBwcmludCBhIHdhcm5pbmcgbWVzc2FnZS4gIElmIHRoZSB2YWx1ZSBpcyBsZXNzCi10aGFuIDUwMCwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBwcmludCBhbiBlcnJvciBtZXNzYWdlLiAgVGhlIG1lc3NhZ2Ugd2lsbAotaW5jbHVkZSB0aGUgdmFsdWUgb2YgQHZhcntleHByZXNzaW9ufS4gIFRoaXMgY2FuIG9jY2FzaW9uYWxseSBiZSB1c2VmdWwgaW5zaWRlCi1jb21wbGV4IG5lc3RlZCBtYWNyb3Mgb3IgY29uZGl0aW9uYWwgYXNzZW1ibHkuCi0KLUBpZmNsZWFyIG5vLWZpbGUtZGlyCi1Abm9kZSBGaWxlCi1Ac2VjdGlvbiBAY29kZXsuZmlsZSBAdmFye3N0cmluZ319Ci0KLUBjaW5kZXggQGNvZGV7ZmlsZX0gZGlyZWN0aXZlCi1AY2luZGV4IGxvZ2ljYWwgZmlsZSBuYW1lCi1AY2luZGV4IGZpbGUgbmFtZSwgbG9naWNhbAotQGNvZGV7LmZpbGV9IHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRoYXQgd2UgYXJlIGFib3V0IHRvIHN0YXJ0IGEgbmV3IGxvZ2ljYWwKLWZpbGUuICBAdmFye3N0cmluZ30gaXMgdGhlIG5ldyBmaWxlIG5hbWUuICBJbiBnZW5lcmFsLCB0aGUgZmlsZW5hbWUgaXMKLXJlY29nbml6ZWQgd2hldGhlciBvciBub3QgaXQgaXMgc3Vycm91bmRlZCBieSBxdW90ZXMgQHNhbXB7In07IGJ1dCBpZiB5b3Ugd2lzaAotdG8gc3BlY2lmeSBhbiBlbXB0eSBmaWxlIG5hbWUsIHlvdSBtdXN0IGdpdmUgdGhlIHF1b3Rlcy0tQGNvZGV7IiJ9LiAgVGhpcwotc3RhdGVtZW50IG1heSBnbyBhd2F5IGluIGZ1dHVyZTogaXQgaXMgb25seSByZWNvZ25pemVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aAotb2xkIEBjb2Rle0B2YWx1ZXtBU319IHByb2dyYW1zLgotQGlmc2V0IEEyOUsKLUluIHNvbWUgY29uZmlndXJhdGlvbnMgb2YgQGNvZGV7QHZhbHVle0FTfX0sIEBjb2Rley5maWxlfSBoYXMgYWxyZWFkeSBiZWVuCi1yZW1vdmVkIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyIGFzc2VtYmxlcnMuICBAeHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQG5vZGUgRmlsbAotQHNlY3Rpb24gQGNvZGV7LmZpbGwgQHZhcntyZXBlYXR9ICwgQHZhcntzaXplfSAsIEB2YXJ7dmFsdWV9fQotCi1AY2luZGV4IEBjb2Rle2ZpbGx9IGRpcmVjdGl2ZQotQGNpbmRleCB3cml0aW5nIHBhdHRlcm5zIGluIG1lbW9yeQotQGNpbmRleCBwYXR0ZXJucywgd3JpdGluZyBpbiBtZW1vcnkKLUB2YXJ7cmVzdWx0fSwgQHZhcntzaXplfSBhbmQgQHZhcnt2YWx1ZX0gYXJlIGFic29sdXRlIGV4cHJlc3Npb25zLgotVGhpcyBlbWl0cyBAdmFye3JlcGVhdH0gY29waWVzIG9mIEB2YXJ7c2l6ZX0gYnl0ZXMuICBAdmFye1JlcGVhdH0KLW1heSBiZSB6ZXJvIG9yIG1vcmUuICBAdmFye1NpemV9IG1heSBiZSB6ZXJvIG9yIG1vcmUsIGJ1dCBpZiBpdCBpcwotbW9yZSB0aGFuIDgsIHRoZW4gaXQgaXMgZGVlbWVkIHRvIGhhdmUgdGhlIHZhbHVlIDgsIGNvbXBhdGlibGUgd2l0aAotb3RoZXIgcGVvcGxlJ3MgYXNzZW1ibGVycy4gIFRoZSBjb250ZW50cyBvZiBlYWNoIEB2YXJ7cmVwZWF0fSBieXRlcwotaXMgdGFrZW4gZnJvbSBhbiA4LWJ5dGUgbnVtYmVyLiAgVGhlIGhpZ2hlc3Qgb3JkZXIgNCBieXRlcyBhcmUKLXplcm8uICBUaGUgbG93ZXN0IG9yZGVyIDQgYnl0ZXMgYXJlIEB2YXJ7dmFsdWV9IHJlbmRlcmVkIGluIHRoZQotYnl0ZS1vcmRlciBvZiBhbiBpbnRlZ2VyIG9uIHRoZSBjb21wdXRlciBAY29kZXtAdmFsdWV7QVN9fSBpcyBhc3NlbWJsaW5nIGZvci4KLUVhY2ggQHZhcntzaXplfSBieXRlcyBpbiBhIHJlcGV0aXRpb24gaXMgdGFrZW4gZnJvbSB0aGUgbG93ZXN0IG9yZGVyCi1AdmFye3NpemV9IGJ5dGVzIG9mIHRoaXMgbnVtYmVyLiAgQWdhaW4sIHRoaXMgYml6YXJyZSBiZWhhdmlvciBpcwotY29tcGF0aWJsZSB3aXRoIG90aGVyIHBlb3BsZSdzIGFzc2VtYmxlcnMuCi0KLUB2YXJ7c2l6ZX0gYW5kIEB2YXJ7dmFsdWV9IGFyZSBvcHRpb25hbC4KLUlmIHRoZSBzZWNvbmQgY29tbWEgYW5kIEB2YXJ7dmFsdWV9IGFyZSBhYnNlbnQsIEB2YXJ7dmFsdWV9IGlzCi1hc3N1bWVkIHplcm8uICBJZiB0aGUgZmlyc3QgY29tbWEgYW5kIGZvbGxvd2luZyB0b2tlbnMgYXJlIGFic2VudCwKLUB2YXJ7c2l6ZX0gaXMgYXNzdW1lZCB0byBiZSAxLgotCi1Abm9kZSBGbG9hdAotQHNlY3Rpb24gQGNvZGV7LmZsb2F0IEB2YXJ7ZmxvbnVtc319Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQgbnVtYmVycyAoc2luZ2xlKQotQGNpbmRleCBAY29kZXtmbG9hdH0gZGlyZWN0aXZlCi1UaGlzIGRpcmVjdGl2ZSBhc3NlbWJsZXMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMuICBJdAotaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBAY29kZXsuc2luZ2xlfS4KLUBpZnNldCBHRU5FUklDCi1UaGUgZXhhY3Qga2luZCBvZiBmbG9hdGluZyBwb2ludCBudW1iZXJzIGVtaXR0ZWQgZGVwZW5kcyBvbiBob3cKLUBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQuCi1AeHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSUVFRUZMT0FUCi1PbiB0aGUgQHZhbHVle1RBUkdFVH0gZmFtaWx5LCBAY29kZXsuZmxvYXR9IGVtaXRzIDMyLWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXJzCi1pbiBAc2N7aWVlZX0gZm9ybWF0LgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBub2RlIEZ1bmMKLUBzZWN0aW9uIEBjb2Rley5mdW5jIEB2YXJ7bmFtZX1bLEB2YXJ7bGFiZWx9XX0KLUBjaW5kZXggQGNvZGV7ZnVuY30gZGlyZWN0aXZlCi1AY29kZXsuZnVuY30gZW1pdHMgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGRlbm90ZSBmdW5jdGlvbiBAdmFye25hbWV9LCBhbmQKLWlzIGlnbm9yZWQgdW5sZXNzIHRoZSBmaWxlIGlzIGFzc2VtYmxlZCB3aXRoIGRlYnVnZ2luZyBlbmFibGVkLgotT25seSBAc2FtcHstLWdzdGFic30gaXMgY3VycmVudGx5IHN1cHBvcnRlZC4KLUB2YXJ7bGFiZWx9IGlzIHRoZSBlbnRyeSBwb2ludCBvZiB0aGUgZnVuY3Rpb24gYW5kIGlmIG9taXR0ZWQgQHZhcntuYW1lfQotcHJlcGVuZGVkIHdpdGggdGhlIEBzYW1we2xlYWRpbmcgY2hhcn0gaXMgdXNlZC4KLUBzYW1we2xlYWRpbmcgY2hhcn0gaXMgdXN1YWxseSBAY29kZXtffSBvciBub3RoaW5nLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC4KLUFsbCBmdW5jdGlvbnMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIHRvIGhhdmUgQGNvZGV7dm9pZH0gcmV0dXJuIHR5cGUuCi1UaGUgZnVuY3Rpb24gbXVzdCBiZSB0ZXJtaW5hdGVkIHdpdGggQGNvZGV7LmVuZGZ1bmN9LgotCi1Abm9kZSBHbG9iYWwKLUBzZWN0aW9uIEBjb2Rley5nbG9iYWwgQHZhcntzeW1ib2x9fSwgQGNvZGV7Lmdsb2JsIEB2YXJ7c3ltYm9sfX0KLQotQGNpbmRleCBAY29kZXtnbG9iYWx9IGRpcmVjdGl2ZQotQGNpbmRleCBzeW1ib2wsIG1ha2luZyB2aXNpYmxlIHRvIGxpbmtlcgotQGNvZGV7Lmdsb2JhbH0gbWFrZXMgdGhlIHN5bWJvbCB2aXNpYmxlIHRvIEBjb2Rle0B2YWx1ZXtMRH19LiAgSWYgeW91IGRlZmluZQotQHZhcntzeW1ib2x9IGluIHlvdXIgcGFydGlhbCBwcm9ncmFtLCBpdHMgdmFsdWUgaXMgbWFkZSBhdmFpbGFibGUgdG8KLW90aGVyIHBhcnRpYWwgcHJvZ3JhbXMgdGhhdCBhcmUgbGlua2VkIHdpdGggaXQuICBPdGhlcndpc2UsCi1AdmFye3N5bWJvbH0gdGFrZXMgaXRzIGF0dHJpYnV0ZXMgZnJvbSBhIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lCi1mcm9tIGFub3RoZXIgZmlsZSBsaW5rZWQgaW50byB0aGUgc2FtZSBwcm9ncmFtLgotCi1Cb3RoIHNwZWxsaW5ncyAoQHNhbXB7Lmdsb2JsfSBhbmQgQHNhbXB7Lmdsb2JhbH0pIGFyZSBhY2NlcHRlZCwgZm9yCi1jb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgYXNzZW1ibGVycy4KLQotQGlmc2V0IEhQUEEKLU9uIHRoZSBIUFBBLCBAY29kZXsuZ2xvYmFsfSBpcyBub3QgYWx3YXlzIGVub3VnaCB0byBtYWtlIGl0IGFjY2Vzc2libGUgdG8gb3RoZXIKLXBhcnRpYWwgcHJvZ3JhbXMuICBZb3UgbWF5IG5lZWQgdGhlIEhQUEEtb25seSBAY29kZXsuRVhQT1JUfSBkaXJlY3RpdmUgYXMgd2VsbC4KLUB4cmVme0hQUEEgRGlyZWN0aXZlcywsIEhQUEEgQXNzZW1ibGVyIERpcmVjdGl2ZXN9LgotQGVuZCBpZnNldAotCi1Abm9kZSBod29yZAotQHNlY3Rpb24gQGNvZGV7Lmh3b3JkIEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle2h3b3JkfSBkaXJlY3RpdmUKLUBjaW5kZXggaW50ZWdlcnMsIDE2LWJpdAotQGNpbmRleCBudW1iZXJzLCAxNi1iaXQKLUBjaW5kZXggc2l4dGVlbiBiaXQgaW50ZWdlcnMKLVRoaXMgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgQHZhcntleHByZXNzaW9uc30sIGFuZCBlbWl0cwotYSAxNiBiaXQgbnVtYmVyIGZvciBlYWNoLgotCi1AaWZzZXQgR0VORVJJQwotVGhpcyBkaXJlY3RpdmUgaXMgYSBzeW5vbnltIGZvciBAc2FtcHsuc2hvcnR9OyBkZXBlbmRpbmcgb24gdGhlIHRhcmdldAotYXJjaGl0ZWN0dXJlLCBpdCBtYXkgYWxzbyBiZSBhIHN5bm9ueW0gZm9yIEBzYW1wey53b3JkfS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBXMzIKLVRoaXMgZGlyZWN0aXZlIGlzIGEgc3lub255bSBmb3IgQHNhbXB7LnNob3J0fS4KLUBlbmQgaWZzZXQKLUBpZnNldCBXMTYKLVRoaXMgZGlyZWN0aXZlIGlzIGEgc3lub255bSBmb3IgYm90aCBAc2FtcHsuc2hvcnR9IGFuZCBAc2FtcHsud29yZH0uCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQG5vZGUgSWRlbnQKLUBzZWN0aW9uIEBjb2Rley5pZGVudH0KLQotQGNpbmRleCBAY29kZXtpZGVudH0gZGlyZWN0aXZlCi1UaGlzIGRpcmVjdGl2ZSBpcyB1c2VkIGJ5IHNvbWUgYXNzZW1ibGVycyB0byBwbGFjZSB0YWdzIGluIG9iamVjdCBmaWxlcy4KLUBjb2Rle0B2YWx1ZXtBU319IHNpbXBseSBhY2NlcHRzIHRoZSBkaXJlY3RpdmUgZm9yIHNvdXJjZS1maWxlCi1jb21wYXRpYmlsaXR5IHdpdGggc3VjaCBhc3NlbWJsZXJzLCBidXQgZG9lcyBub3QgYWN0dWFsbHkgZW1pdCBhbnl0aGluZwotZm9yIGl0LgotCi1Abm9kZSBJZgotQHNlY3Rpb24gQGNvZGV7LmlmIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggY29uZGl0aW9uYWwgYXNzZW1ibHkKLUBjaW5kZXggQGNvZGV7aWZ9IGRpcmVjdGl2ZQotQGNvZGV7LmlmfSBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIGEgc2VjdGlvbiBvZiBjb2RlIHdoaWNoIGlzIG9ubHkKLWNvbnNpZGVyZWQgcGFydCBvZiB0aGUgc291cmNlIHByb2dyYW0gYmVpbmcgYXNzZW1ibGVkIGlmIHRoZSBhcmd1bWVudAotKHdoaWNoIG11c3QgYmUgYW4gQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufSkgaXMgbm9uLXplcm8uICBUaGUgZW5kIG9mCi10aGUgY29uZGl0aW9uYWwgc2VjdGlvbiBvZiBjb2RlIG11c3QgYmUgbWFya2VkIGJ5IEBjb2Rley5lbmRpZn0KLShAcHhyZWZ7RW5kaWYsLEBjb2Rley5lbmRpZn19KTsgb3B0aW9uYWxseSwgeW91IG1heSBpbmNsdWRlIGNvZGUgZm9yIHRoZQotYWx0ZXJuYXRpdmUgY29uZGl0aW9uLCBmbGFnZ2VkIGJ5IEBjb2Rley5lbHNlfSAoQHB4cmVme0Vsc2UsLEBjb2Rley5lbHNlfX0pLgotCi1UaGUgZm9sbG93aW5nIHZhcmlhbnRzIG9mIEBjb2Rley5pZn0gYXJlIGFsc28gc3VwcG9ydGVkOgotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle2lmZGVmfSBkaXJlY3RpdmUKLUBpdGVtIC5pZmRlZiBAdmFye3N5bWJvbH0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgc3BlY2lmaWVkIEB2YXJ7c3ltYm9sfQotaGFzIGJlZW4gZGVmaW5lZC4KLQotQGNpbmRleCBAY29kZXtpZmN9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmYyBAdmFye3N0cmluZzF9LEB2YXJ7c3RyaW5nMn0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgdHdvIHN0cmluZ3MgYXJlIHRoZSBzYW1lLiAgVGhlCi1zdHJpbmdzIG1heSBiZSBvcHRpb25hbGx5IHF1b3RlZCB3aXRoIHNpbmdsZSBxdW90ZXMuICBJZiB0aGV5IGFyZSBub3QgcXVvdGVkLAotdGhlIGZpcnN0IHN0cmluZyBzdG9wcyBhdCB0aGUgZmlyc3QgY29tbWEsIGFuZCB0aGUgc2Vjb25kIHN0cmluZyBzdG9wcyBhdCB0aGUKLWVuZCBvZiB0aGUgbGluZS4gIFN0cmluZ3Mgd2hpY2ggY29udGFpbiB3aGl0ZXNwYWNlIHNob3VsZCBiZSBxdW90ZWQuICBUaGUKLXN0cmluZyBjb21wYXJpc29uIGlzIGNhc2Ugc2Vuc2l0aXZlLgotCi1AY2luZGV4IEBjb2Rle2lmZXF9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmZXEgQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufQotQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSBhcmd1bWVudCBpcyB6ZXJvLgotCi1AY2luZGV4IEBjb2Rle2lmZXFzfSBkaXJlY3RpdmUKLUBpdGVtIC5pZmVxcyBAdmFye3N0cmluZzF9LEB2YXJ7c3RyaW5nMn0KLUFub3RoZXIgZm9ybSBvZiBAY29kZXsuaWZjfS4gIFRoZSBzdHJpbmdzIG11c3QgYmUgcXVvdGVkIHVzaW5nIGRvdWJsZSBxdW90ZXMuCi0KLUBjaW5kZXggQGNvZGV7aWZnZX0gZGlyZWN0aXZlCi1AaXRlbSAuaWZnZSBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIGFyZ3VtZW50IGlzIGdyZWF0ZXIgdGhhbiBvcgotZXF1YWwgdG8gemVyby4KLQotQGNpbmRleCBAY29kZXtpZmd0fSBkaXJlY3RpdmUKLUBpdGVtIC5pZmd0IEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgYXJndW1lbnQgaXMgZ3JlYXRlciB0aGFuIHplcm8uCi0KLUBjaW5kZXggQGNvZGV7aWZsZX0gZGlyZWN0aXZlCi1AaXRlbSAuaWZsZSBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiBvciBlcXVhbAotdG8gemVyby4KLQotQGNpbmRleCBAY29kZXtpZmx0fSBkaXJlY3RpdmUKLUBpdGVtIC5pZmx0IEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgYXJndW1lbnQgaXMgbGVzcyB0aGFuIHplcm8uCi0KLUBjaW5kZXggQGNvZGV7aWZuY30gZGlyZWN0aXZlCi1AaXRlbSAuaWZuYyBAdmFye3N0cmluZzF9LEB2YXJ7c3RyaW5nMn0uCi1MaWtlIEBjb2Rley5pZmN9LCBidXQgdGhlIHNlbnNlIG9mIHRoZSB0ZXN0IGlzIHJldmVyc2VkOiB0aGlzIGFzc2VtYmxlcyB0aGUKLWZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIHR3byBzdHJpbmdzIGFyZSBub3QgdGhlIHNhbWUuCi0KLUBjaW5kZXggQGNvZGV7aWZuZGVmfSBkaXJlY3RpdmUKLUBjaW5kZXggQGNvZGV7aWZub3RkZWZ9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmbmRlZiBAdmFye3N5bWJvbH0KLUBpdGVteCAuaWZub3RkZWYgQHZhcntzeW1ib2x9Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIHNwZWNpZmllZCBAdmFye3N5bWJvbH0KLWhhcyBub3QgYmVlbiBkZWZpbmVkLiAgQm90aCBzcGVsbGluZyB2YXJpYW50cyBhcmUgZXF1aXZhbGVudC4KLQotQGNpbmRleCBAY29kZXtpZm5lfSBkaXJlY3RpdmUKLUBpdGVtIC5pZm5lIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgYXJndW1lbnQgaXMgbm90IGVxdWFsIHRvIHplcm8KLShpbiBvdGhlciB3b3JkcywgdGhpcyBpcyBlcXVpdmFsZW50IHRvIEBjb2Rley5pZn0pLgotCi1AY2luZGV4IEBjb2Rle2lmbmVzfSBkaXJlY3RpdmUKLUBpdGVtIC5pZm5lcyBAdmFye3N0cmluZzF9LEB2YXJ7c3RyaW5nMn0KLUxpa2UgQGNvZGV7LmlmZXFzfSwgYnV0IHRoZSBzZW5zZSBvZiB0aGUgdGVzdCBpcyByZXZlcnNlZDogdGhpcyBhc3NlbWJsZXMgdGhlCi1mb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSB0d28gc3RyaW5ncyBhcmUgbm90IHRoZSBzYW1lLgotQGVuZCB0YWJsZQotCi1Abm9kZSBJbmNsdWRlCi1Ac2VjdGlvbiBAY29kZXsuaW5jbHVkZSAiQHZhcntmaWxlfSJ9Ci0KLUBjaW5kZXggQGNvZGV7aW5jbHVkZX0gZGlyZWN0aXZlCi1AY2luZGV4IHN1cHBvcnRpbmcgZmlsZXMsIGluY2x1ZGluZwotQGNpbmRleCBmaWxlcywgaW5jbHVkaW5nCi1UaGlzIGRpcmVjdGl2ZSBwcm92aWRlcyBhIHdheSB0byBpbmNsdWRlIHN1cHBvcnRpbmcgZmlsZXMgYXQgc3BlY2lmaWVkCi1wb2ludHMgaW4geW91ciBzb3VyY2UgcHJvZ3JhbS4gIFRoZSBjb2RlIGZyb20gQHZhcntmaWxlfSBpcyBhc3NlbWJsZWQgYXMKLWlmIGl0IGZvbGxvd2VkIHRoZSBwb2ludCBvZiB0aGUgQGNvZGV7LmluY2x1ZGV9OyB3aGVuIHRoZSBlbmQgb2YgdGhlCi1pbmNsdWRlZCBmaWxlIGlzIHJlYWNoZWQsIGFzc2VtYmx5IG9mIHRoZSBvcmlnaW5hbCBmaWxlIGNvbnRpbnVlcy4gIFlvdQotY2FuIGNvbnRyb2wgdGhlIHNlYXJjaCBwYXRocyB1c2VkIHdpdGggdGhlIEBzYW1wey1JfSBjb21tYW5kLWxpbmUgb3B0aW9uCi0oQHB4cmVme0ludm9raW5nLCxDb21tYW5kLUxpbmUgT3B0aW9uc30pLiAgUXVvdGF0aW9uIG1hcmtzIGFyZSByZXF1aXJlZAotYXJvdW5kIEB2YXJ7ZmlsZX0uCi0KLUBub2RlIEludAotQHNlY3Rpb24gQGNvZGV7LmludCBAdmFye2V4cHJlc3Npb25zfX0KLQotQGNpbmRleCBAY29kZXtpbnR9IGRpcmVjdGl2ZQotQGNpbmRleCBpbnRlZ2VycywgMzItYml0Ci1FeHBlY3QgemVybyBvciBtb3JlIEB2YXJ7ZXhwcmVzc2lvbnN9LCBvZiBhbnkgc2VjdGlvbiwgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KLUZvciBlYWNoIGV4cHJlc3Npb24sIGVtaXQgYSBudW1iZXIgdGhhdCwgYXQgcnVuIHRpbWUsIGlzIHRoZSB2YWx1ZSBvZiB0aGF0Ci1leHByZXNzaW9uLiAgVGhlIGJ5dGUgb3JkZXIgYW5kIGJpdCBzaXplIG9mIHRoZSBudW1iZXIgZGVwZW5kcyBvbiB3aGF0IGtpbmQKLW9mIHRhcmdldCB0aGUgYXNzZW1ibHkgaXMgZm9yLgotCi1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSDgKLU9uIHRoZSBIOC81MDAgYW5kIG1vc3QgZm9ybXMgb2YgdGhlIEg4LzMwMCwgQGNvZGV7LmludH0gZW1pdHMgMTYtYml0Ci1pbnRlZ2Vycy4gIE9uIHRoZSBIOC8zMDBIIGFuZCB0aGUgSGl0YWNoaSBTSCwgaG93ZXZlciwgQGNvZGV7LmludH0gZW1pdHMKLTMyLWJpdCBpbnRlZ2Vycy4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBJcnAKLUBzZWN0aW9uIEBjb2Rley5pcnAgQHZhcntzeW1ib2x9LEB2YXJ7dmFsdWVzfX1AZG90c3t9Ci0KLUBjaW5kZXggQGNvZGV7aXJwfSBkaXJlY3RpdmUKLUV2YWx1YXRlIGEgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBhc3NpZ25pbmcgZGlmZmVyZW50IHZhbHVlcyB0byBAdmFye3N5bWJvbH0uCi1UaGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBzdGFydHMgYXQgdGhlIEBjb2Rley5pcnB9IGRpcmVjdGl2ZSwgYW5kIGlzCi10ZXJtaW5hdGVkIGJ5IGFuIEBjb2Rley5lbmRyfSBkaXJlY3RpdmUuICBGb3IgZWFjaCBAdmFye3ZhbHVlfSwgQHZhcntzeW1ib2x9IGlzCi1zZXQgdG8gQHZhcnt2YWx1ZX0sIGFuZCB0aGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBpcyBhc3NlbWJsZWQuICBJZiBubwotQHZhcnt2YWx1ZX0gaXMgbGlzdGVkLCB0aGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBpcyBhc3NlbWJsZWQgb25jZSwgd2l0aAotQHZhcntzeW1ib2x9IHNldCB0byB0aGUgbnVsbCBzdHJpbmcuICBUbyByZWZlciB0byBAdmFye3N5bWJvbH0gd2l0aGluIHRoZQotc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cywgdXNlIEB2YXJ7XHN5bWJvbH0uCi0KLUZvciBleGFtcGxlLCBhc3NlbWJsaW5nCi0KLUBleGFtcGxlCi0gICAgICAgIC5pcnAgICAgcGFyYW0sMSwyLDMKLSAgICAgICAgbW92ZSAgICBkXHBhcmFtLHNwQEAtCi0gICAgICAgIC5lbmRyCi1AZW5kIGV4YW1wbGUKLQotaXMgZXF1aXZhbGVudCB0byBhc3NlbWJsaW5nCi0KLUBleGFtcGxlCi0gICAgICAgIG1vdmUgICAgZDEsc3BAQC0KLSAgICAgICAgbW92ZSAgICBkMixzcEBALQotICAgICAgICBtb3ZlICAgIGQzLHNwQEAtCi1AZW5kIGV4YW1wbGUKLQotQG5vZGUgSXJwYwotQHNlY3Rpb24gQGNvZGV7LmlycGMgQHZhcntzeW1ib2x9LEB2YXJ7dmFsdWVzfX1AZG90c3t9Ci0KLUBjaW5kZXggQGNvZGV7aXJwY30gZGlyZWN0aXZlCi1FdmFsdWF0ZSBhIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgYXNzaWduaW5nIGRpZmZlcmVudCB2YWx1ZXMgdG8gQHZhcntzeW1ib2x9LgotVGhlIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgc3RhcnRzIGF0IHRoZSBAY29kZXsuaXJwY30gZGlyZWN0aXZlLCBhbmQgaXMKLXRlcm1pbmF0ZWQgYnkgYW4gQGNvZGV7LmVuZHJ9IGRpcmVjdGl2ZS4gIEZvciBlYWNoIGNoYXJhY3RlciBpbiBAdmFye3ZhbHVlfSwKLUB2YXJ7c3ltYm9sfSBpcyBzZXQgdG8gdGhlIGNoYXJhY3RlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIGlzCi1hc3NlbWJsZWQuICBJZiBubyBAdmFye3ZhbHVlfSBpcyBsaXN0ZWQsIHRoZSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIGlzCi1hc3NlbWJsZWQgb25jZSwgd2l0aCBAdmFye3N5bWJvbH0gc2V0IHRvIHRoZSBudWxsIHN0cmluZy4gIFRvIHJlZmVyIHRvCi1AdmFye3N5bWJvbH0gd2l0aGluIHRoZSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzLCB1c2UgQHZhcntcc3ltYm9sfS4KLQotRm9yIGV4YW1wbGUsIGFzc2VtYmxpbmcKLQotQGV4YW1wbGUKLSAgICAgICAgLmlycGMgICAgcGFyYW0sMTIzCi0gICAgICAgIG1vdmUgICAgZFxwYXJhbSxzcEBALQotICAgICAgICAuZW5kcgotQGVuZCBleGFtcGxlCi0KLWlzIGVxdWl2YWxlbnQgdG8gYXNzZW1ibGluZwotCi1AZXhhbXBsZQotICAgICAgICBtb3ZlICAgIGQxLHNwQEAtCi0gICAgICAgIG1vdmUgICAgZDIsc3BAQC0KLSAgICAgICAgbW92ZSAgICBkMyxzcEBALQotQGVuZCBleGFtcGxlCi0KLUBub2RlIExjb21tCi1Ac2VjdGlvbiBAY29kZXsubGNvbW0gQHZhcntzeW1ib2x9ICwgQHZhcntsZW5ndGh9fQotCi1AY2luZGV4IEBjb2Rle2xjb21tfSBkaXJlY3RpdmUKLUBjaW5kZXggbG9jYWwgY29tbW9uIHN5bWJvbHMKLUBjaW5kZXggc3ltYm9scywgbG9jYWwgY29tbW9uCi1SZXNlcnZlIEB2YXJ7bGVuZ3RofSAoYW4gYWJzb2x1dGUgZXhwcmVzc2lvbikgYnl0ZXMgZm9yIGEgbG9jYWwgY29tbW9uCi1kZW5vdGVkIGJ5IEB2YXJ7c3ltYm9sfS4gIFRoZSBzZWN0aW9uIGFuZCB2YWx1ZSBvZiBAdmFye3N5bWJvbH0gYXJlCi10aG9zZSBvZiB0aGUgbmV3IGxvY2FsIGNvbW1vbi4gIFRoZSBhZGRyZXNzZXMgYXJlIGFsbG9jYXRlZCBpbiB0aGUgYnNzCi1zZWN0aW9uLCBzbyB0aGF0IGF0IHJ1bi10aW1lIHRoZSBieXRlcyBzdGFydCBvZmYgemVyb2VkLiAgQHZhcntTeW1ib2x9Ci1pcyBub3QgZGVjbGFyZWQgZ2xvYmFsIChAcHhyZWZ7R2xvYmFsLCxAY29kZXsuZ2xvYmFsfX0pLCBzbyBpcyBub3JtYWxseQotbm90IHZpc2libGUgdG8gQGNvZGV7QHZhbHVle0xEfX0uCi0KLUBpZnNldCBHRU5FUklDCi1Tb21lIHRhcmdldHMgcGVybWl0IGEgdGhpcmQgYXJndW1lbnQgdG8gYmUgdXNlZCB3aXRoIEBjb2Rley5sY29tbX0uICBUaGlzCi1hcmd1bWVudCBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgYWxpZ25tZW50IG9mIHRoZSBzeW1ib2wgaW4gdGhlIGJzcyBzZWN0aW9uLgotQGVuZCBpZnNldAotCi1AaWZzZXQgSFBQQQotVGhlIHN5bnRheCBmb3IgQGNvZGV7Lmxjb21tfSBkaWZmZXJzIHNsaWdodGx5IG9uIHRoZSBIUFBBLiAgVGhlIHN5bnRheCBpcwotQHNhbXB7QHZhcntzeW1ib2x9IC5sY29tbSwgQHZhcntsZW5ndGh9fTsgQHZhcntzeW1ib2x9IGlzIG9wdGlvbmFsLgotQGVuZCBpZnNldAotCi1Abm9kZSBMZmxhZ3MKLUBzZWN0aW9uIEBjb2Rley5sZmxhZ3N9Ci0KLUBjaW5kZXggQGNvZGV7bGZsYWdzfSBkaXJlY3RpdmUgKGlnbm9yZWQpCi1AY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzIHRoaXMgZGlyZWN0aXZlLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyCi1hc3NlbWJsZXJzLCBidXQgaWdub3JlcyBpdC4KLQotQGlmY2xlYXIgbm8tbGluZS1kaXIKLUBub2RlIExpbmUKLUBzZWN0aW9uIEBjb2Rley5saW5lIEB2YXJ7bGluZS1udW1iZXJ9fQotCi1AY2luZGV4IEBjb2Rle2xpbmV9IGRpcmVjdGl2ZQotQGVuZCBpZmNsZWFyCi1AaWZzZXQgbm8tbGluZS1kaXIKLUBub2RlIExuCi1Ac2VjdGlvbiBAY29kZXsubG4gQHZhcntsaW5lLW51bWJlcn19Ci0KLUBjaW5kZXggQGNvZGV7bG59IGRpcmVjdGl2ZQotQGVuZCBpZnNldAotQGNpbmRleCBsb2dpY2FsIGxpbmUgbnVtYmVyCi1AaWZzZXQgYW91dC1ib3V0Ci1DaGFuZ2UgdGhlIGxvZ2ljYWwgbGluZSBudW1iZXIuICBAdmFye2xpbmUtbnVtYmVyfSBtdXN0IGJlIGFuIGFic29sdXRlCi1leHByZXNzaW9uLiAgVGhlIG5leHQgbGluZSBoYXMgdGhhdCBsb2dpY2FsIGxpbmUgbnVtYmVyLiAgVGhlcmVmb3JlIGFueSBvdGhlcgotc3RhdGVtZW50cyBvbiB0aGUgY3VycmVudCBsaW5lIChhZnRlciBhIHN0YXRlbWVudCBzZXBhcmF0b3IgY2hhcmFjdGVyKSBhcmUKLXJlcG9ydGVkIGFzIG9uIGxvZ2ljYWwgbGluZSBudW1iZXIgQHZhcntsaW5lLW51bWJlcn0gQG1pbnVze30gMS4gIE9uZSBkYXkKLUBjb2Rle0B2YWx1ZXtBU319IHdpbGwgbm8gbG9uZ2VyIHN1cHBvcnQgdGhpcyBkaXJlY3RpdmU6IGl0IGlzIHJlY29nbml6ZWQgb25seQotZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBhc3NlbWJsZXIgcHJvZ3JhbXMuCi0KLUBpZnNldCBHRU5FUklDCi1AaWZzZXQgQTI5SwotQGVtcGh7V2FybmluZzp9IEluIHRoZSBBTUQyOUsgY29uZmlndXJhdGlvbiBvZiBAdmFsdWV7QVN9LCB0aGlzIGNvbW1hbmQgaXMKLW5vdCBhdmFpbGFibGU7IHVzZSB0aGUgc3lub255bSBAY29kZXsubG59IGluIHRoYXQgY29udGV4dC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgbm8tbGluZS1kaXIKLUV2ZW4gdGhvdWdoIHRoaXMgaXMgYSBkaXJlY3RpdmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBAY29kZXthLm91dH0gb3IKLUBjb2Rle2Iub3V0fSBvYmplY3QtY29kZSBmb3JtYXRzLCBAY29kZXtAdmFsdWV7QVN9fSBzdGlsbCByZWNvZ25pemVzIGl0Ci13aGVuIHByb2R1Y2luZyBDT0ZGIG91dHB1dCwgYW5kIHRyZWF0cyBAc2FtcHsubGluZX0gYXMgdGhvdWdoIGl0Ci13ZXJlIHRoZSBDT0ZGIEBzYW1wey5sbn0gQGVtcGh7aWZ9IGl0IGlzIGZvdW5kIG91dHNpZGUgYQotQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlyLgotCi1JbnNpZGUgYSBAY29kZXsuZGVmfSwgQHNhbXB7LmxpbmV9IGlzLCBpbnN0ZWFkLCBvbmUgb2YgdGhlIGRpcmVjdGl2ZXMKLXVzZWQgYnkgY29tcGlsZXJzIHRvIGdlbmVyYXRlIGF1eGlsaWFyeSBzeW1ib2wgaW5mb3JtYXRpb24gZm9yCi1kZWJ1Z2dpbmcuCi1AZW5kIGlmY2xlYXIKLQotQG5vZGUgTGlua29uY2UKLUBzZWN0aW9uIEBjb2Rley5saW5rb25jZSBbQHZhcnt0eXBlfV19Ci1AY2luZGV4IENPTURBVAotQGNpbmRleCBAY29kZXtsaW5rb25jZX0gZGlyZWN0aXZlCi1AY2luZGV4IGNvbW1vbiBzZWN0aW9ucwotTWFyayB0aGUgY3VycmVudCBzZWN0aW9uIHNvIHRoYXQgdGhlIGxpbmtlciBvbmx5IGluY2x1ZGVzIGEgc2luZ2xlIGNvcHkgb2YgaXQuCi1UaGlzIG1heSBiZSB1c2VkIHRvIGluY2x1ZGUgdGhlIHNhbWUgc2VjdGlvbiBpbiBzZXZlcmFsIGRpZmZlcmVudCBvYmplY3QgZmlsZXMsCi1idXQgZW5zdXJlIHRoYXQgdGhlIGxpbmtlciB3aWxsIG9ubHkgaW5jbHVkZSBpdCBvbmNlIGluIHRoZSBmaW5hbCBvdXRwdXQgZmlsZS4KLVRoZSBAY29kZXsubGlua29uY2V9IHBzZXVkby1vcCBtdXN0IGJlIHVzZWQgZm9yIGVhY2ggaW5zdGFuY2Ugb2YgdGhlIHNlY3Rpb24uCi1EdXBsaWNhdGUgc2VjdGlvbnMgYXJlIGRldGVjdGVkIGJhc2VkIG9uIHRoZSBzZWN0aW9uIG5hbWUsIHNvIGl0IHNob3VsZCBiZQotdW5pcXVlLgotCi1UaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBhIGZldyBvYmplY3QgZmlsZSBmb3JtYXRzOyBhcyBvZiB0aGlzCi13cml0aW5nLCB0aGUgb25seSBvYmplY3QgZmlsZSBmb3JtYXQgd2hpY2ggc3VwcG9ydHMgaXQgaXMgdGhlIFBvcnRhYmxlCi1FeGVjdXRhYmxlIGZvcm1hdCB1c2VkIG9uIFdpbmRvd3MgTlQuCi0KLVRoZSBAdmFye3R5cGV9IGFyZ3VtZW50IGlzIG9wdGlvbmFsLiAgSWYgc3BlY2lmaWVkLCBpdCBtdXN0IGJlIG9uZSBvZiB0aGUKLWZvbGxvd2luZyBzdHJpbmdzLiAgRm9yIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi0ubGlua29uY2Ugc2FtZV9zaXplCi1AZW5kIHNtYWxsZXhhbXBsZQotTm90IGFsbCB0eXBlcyBtYXkgYmUgc3VwcG9ydGVkIG9uIGFsbCBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGRpc2NhcmQKLVNpbGVudGx5IGRpc2NhcmQgZHVwbGljYXRlIHNlY3Rpb25zLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KLQotQGl0ZW0gb25lX29ubHkKLVdhcm4gaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZSBzZWN0aW9ucywgYnV0IHN0aWxsIGtlZXAgb25seSBvbmUgY29weS4KLQotQGl0ZW0gc2FtZV9zaXplCi1XYXJuIGlmIGFueSBvZiB0aGUgZHVwbGljYXRlcyBoYXZlIGRpZmZlcmVudCBzaXplcy4KLQotQGl0ZW0gc2FtZV9jb250ZW50cwotV2FybiBpZiBhbnkgb2YgdGhlIGR1cGxpY2F0ZXMgZG8gbm90IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBjb250ZW50cy4KLUBlbmQgdGFibGUKLQotQG5vZGUgTG4KLUBzZWN0aW9uIEBjb2Rley5sbiBAdmFye2xpbmUtbnVtYmVyfX0KLQotQGNpbmRleCBAY29kZXtsbn0gZGlyZWN0aXZlCi1AaWZjbGVhciBuby1saW5lLWRpcgotQHNhbXB7LmxufSBpcyBhIHN5bm9ueW0gZm9yIEBzYW1wey5saW5lfS4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IG5vLWxpbmUtZGlyCi1UZWxsIEBjb2Rle0B2YWx1ZXtBU319IHRvIGNoYW5nZSB0aGUgbG9naWNhbCBsaW5lIG51bWJlci4gIEB2YXJ7bGluZS1udW1iZXJ9Ci1tdXN0IGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24uICBUaGUgbmV4dCBsaW5lIGhhcyB0aGF0IGxvZ2ljYWwKLWxpbmUgbnVtYmVyLCBzbyBhbnkgb3RoZXIgc3RhdGVtZW50cyBvbiB0aGUgY3VycmVudCBsaW5lIChhZnRlciBhCi1zdGF0ZW1lbnQgc2VwYXJhdG9yIGNoYXJhY3RlciBAY29kZXs7fSkgYXJlIHJlcG9ydGVkIGFzIG9uIGxvZ2ljYWwKLWxpbmUgbnVtYmVyIEB2YXJ7bGluZS1udW1iZXJ9IEBtaW51c3t9IDEuCi1AaWZzZXQgQk9VVAotCi1UaGlzIGRpcmVjdGl2ZSBpcyBhY2NlcHRlZCwgYnV0IGlnbm9yZWQsIHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMKLWNvbmZpZ3VyZWQgZm9yIEBjb2Rle2Iub3V0fTsgaXRzIGVmZmVjdCBpcyBvbmx5IGFzc29jaWF0ZWQgd2l0aCBDT0ZGCi1vdXRwdXQgZm9ybWF0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBNUkkKLUBzZWN0aW9uIEBjb2Rley5tcmkgQHZhcnt2YWx9fQotCi1AY2luZGV4IEBjb2Rle21yaX0gZGlyZWN0aXZlCi1AY2luZGV4IE1SSSBtb2RlLCB0ZW1wb3JhcmlseQotSWYgQHZhcnt2YWx9IGlzIG5vbi16ZXJvLCB0aGlzIHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGVudGVyIE1SSSBtb2RlLiAgSWYKLUB2YXJ7dmFsfSBpcyB6ZXJvLCB0aGlzIHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGV4aXQgTVJJIG1vZGUuICBUaGlzIGNoYW5nZQotYWZmZWN0cyBjb2RlIGFzc2VtYmxlZCB1bnRpbCB0aGUgbmV4dCBAY29kZXsubXJpfSBkaXJlY3RpdmUsIG9yIHVudGlsIHRoZSBlbmQKLW9mIHRoZSBmaWxlLiAgQHhyZWZ7TSwgTVJJIG1vZGUsIE1SSSBtb2RlfS4KLQotQG5vZGUgTGlzdAotQHNlY3Rpb24gQGNvZGV7Lmxpc3R9Ci0KLUBjaW5kZXggQGNvZGV7bGlzdH0gZGlyZWN0aXZlCi1AY2luZGV4IGxpc3RpbmcgY29udHJvbCwgdHVybmluZyBvbgotQ29udHJvbCAoaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgQGNvZGV7Lm5vbGlzdH0gZGlyZWN0aXZlKSB3aGV0aGVyIG9yCi1ub3QgYXNzZW1ibHkgbGlzdGluZ3MgYXJlIGdlbmVyYXRlZC4gIFRoZXNlIHR3byBkaXJlY3RpdmVzIG1haW50YWluIGFuCi1pbnRlcm5hbCBjb3VudGVyICh3aGljaCBpcyB6ZXJvIGluaXRpYWxseSkuICAgQGNvZGV7Lmxpc3R9IGluY3JlbWVudHMgdGhlCi1jb3VudGVyLCBhbmQgQGNvZGV7Lm5vbGlzdH0gZGVjcmVtZW50cyBpdC4gIEFzc2VtYmx5IGxpc3RpbmdzIGFyZQotZ2VuZXJhdGVkIHdoZW5ldmVyIHRoZSBjb3VudGVyIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgotCi1CeSBkZWZhdWx0LCBsaXN0aW5ncyBhcmUgZGlzYWJsZWQuICBXaGVuIHlvdSBlbmFibGUgdGhlbSAod2l0aCB0aGUKLUBzYW1wey1hfSBjb21tYW5kIGxpbmUgb3B0aW9uOyBAcHhyZWZ7SW52b2tpbmcsLENvbW1hbmQtTGluZSBPcHRpb25zfSksCi10aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgbGlzdGluZyBjb3VudGVyIGlzIG9uZS4KLQotQG5vZGUgTG9uZwotQHNlY3Rpb24gQGNvZGV7LmxvbmcgQHZhcntleHByZXNzaW9uc319Ci0KLUBjaW5kZXggQGNvZGV7bG9uZ30gZGlyZWN0aXZlCi1AY29kZXsubG9uZ30gaXMgdGhlIHNhbWUgYXMgQHNhbXB7LmludH0sIEBweHJlZntJbnQsLEBjb2Rley5pbnR9fS4KLQotQGlnbm9yZQotQGMgbm8gb25lIHNlZW1zIHRvIGtub3cgd2hhdCB0aGlzIGlzIGZvciBvciB3aGV0aGVyIHRoaXMgZGVzY3JpcHRpb24gaXMKLUBjIHdoYXQgaXQgcmVhbGx5IG91Z2h0IHRvIGRvCi1Abm9kZSBMc3ltCi1Ac2VjdGlvbiBAY29kZXsubHN5bSBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7bHN5bX0gZGlyZWN0aXZlCi1AY2luZGV4IHN5bWJvbCwgbm90IHJlZmVyZW5jZWQgaW4gYXNzZW1ibHkKLUBjb2Rley5sc3ltfSBjcmVhdGVzIGEgbmV3IHN5bWJvbCBuYW1lZCBAdmFye3N5bWJvbH0sIGJ1dCBkb2VzIG5vdCBwdXQgaXQgaW4KLXRoZSBoYXNoIHRhYmxlLCBlbnN1cmluZyBpdCBjYW5ub3QgYmUgcmVmZXJlbmNlZCBieSBuYW1lIGR1cmluZyB0aGUKLXJlc3Qgb2YgdGhlIGFzc2VtYmx5LiAgVGhpcyBzZXRzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBzeW1ib2wgdG8gYmUKLXRoZSBzYW1lIGFzIHRoZSBleHByZXNzaW9uIHZhbHVlOgotQHNtYWxsZXhhbXBsZQotQHZhcntvdGhlcn0gPSBAdmFye2Rlc2NyaXB0b3J9ID0gMAotQHZhcnt0eXBlfSA9IEByeyhzZWN0aW9uIG9mIEB2YXJ7ZXhwcmVzc2lvbn0pfQotQHZhcnt2YWx1ZX0gPSBAdmFye2V4cHJlc3Npb259Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGUgbmV3IHN5bWJvbCBpcyBub3QgZmxhZ2dlZCBhcyBleHRlcm5hbC4KLUBlbmQgaWdub3JlCi0KLUBub2RlIE1hY3JvCi1Ac2VjdGlvbiBAY29kZXsubWFjcm99Ci0KLUBjaW5kZXggbWFjcm9zCi1UaGUgY29tbWFuZHMgQGNvZGV7Lm1hY3JvfSBhbmQgQGNvZGV7LmVuZG19IGFsbG93IHlvdSB0byBkZWZpbmUgbWFjcm9zIHRoYXQKLWdlbmVyYXRlIGFzc2VtYmx5IG91dHB1dC4gIEZvciBleGFtcGxlLCB0aGlzIGRlZmluaXRpb24gc3BlY2lmaWVzIGEgbWFjcm8KLUBjb2Rle3N1bX0gdGhhdCBwdXRzIGEgc2VxdWVuY2Ugb2YgbnVtYmVycyBpbnRvIG1lbW9yeToKLQotQGV4YW1wbGUKLSAgICAgICAgLm1hY3JvICBzdW0gZnJvbT0wLCB0bz01Ci0gICAgICAgIC5sb25nICAgXGZyb20KLSAgICAgICAgLmlmICAgICBcdG8tXGZyb20KLSAgICAgICAgc3VtICAgICAiKFxmcm9tKzEpIixcdG8KLSAgICAgICAgLmVuZGlmCi0gICAgICAgIC5lbmRtCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1XaXRoIHRoYXQgZGVmaW5pdGlvbiwgQHNhbXB7U1VNIDAsNX0gaXMgZXF1aXZhbGVudCB0byB0aGlzIGFzc2VtYmx5IGlucHV0OgotCi1AZXhhbXBsZQotICAgICAgICAubG9uZyAgIDAKLSAgICAgICAgLmxvbmcgICAxCi0gICAgICAgIC5sb25nICAgMgotICAgICAgICAubG9uZyAgIDMKLSAgICAgICAgLmxvbmcgICA0Ci0gICAgICAgIC5sb25nICAgNQotQGVuZCBleGFtcGxlCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5tYWNybyBAdmFye21hY25hbWV9Ci1AaXRlbXggLm1hY3JvIEB2YXJ7bWFjbmFtZX0gQHZhcnttYWNhcmdzfSBAZG90c3t9Ci1AY2luZGV4IEBjb2Rle21hY3JvfSBkaXJlY3RpdmUKLUJlZ2luIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEB2YXJ7bWFjbmFtZX0uICBJZiB5b3VyIG1hY3JvCi1kZWZpbml0aW9uIHJlcXVpcmVzIGFyZ3VtZW50cywgc3BlY2lmeSB0aGVpciBuYW1lcyBhZnRlciB0aGUgbWFjcm8gbmFtZSwKLXNlcGFyYXRlZCBieSBjb21tYXMgb3Igc3BhY2VzLiAgWW91IGNhbiBzdXBwbHkgYSBkZWZhdWx0IHZhbHVlIGZvciBhbnkKLW1hY3JvIGFyZ3VtZW50IGJ5IGZvbGxvd2luZyB0aGUgbmFtZSB3aXRoIEBzYW1wez1AdmFye2RlZmx0fX0uICBGb3IKLWV4YW1wbGUsIHRoZXNlIGFyZSBhbGwgdmFsaWQgQGNvZGV7Lm1hY3JvfSBzdGF0ZW1lbnRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC5tYWNybyBjb21tCi1CZWdpbiB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAY29kZXtjb21tfSwgd2hpY2ggdGFrZXMgbm8KLWFyZ3VtZW50cy4KLQotQGl0ZW0gLm1hY3JvIHBsdXMxIHAsIHAxCi1AaXRlbXggLm1hY3JvIHBsdXMxIHAgcDEKLUVpdGhlciBzdGF0ZW1lbnQgYmVnaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEBjb2Rle3BsdXMxfSwKLXdoaWNoIHRha2VzIHR3byBhcmd1bWVudHM7IHdpdGhpbiB0aGUgbWFjcm8gZGVmaW5pdGlvbiwgd3JpdGUKLUBzYW1we1xwfSBvciBAc2FtcHtccDF9IHRvIGV2YWx1YXRlIHRoZSBhcmd1bWVudHMuCi0KLUBpdGVtIC5tYWNybyByZXNlcnZlX3N0ciBwMT0wIHAyCi1CZWdpbiB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAY29kZXtyZXNlcnZlX3N0cn0sIHdpdGggdHdvCi1hcmd1bWVudHMuICBUaGUgZmlyc3QgYXJndW1lbnQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYnV0IG5vdCB0aGUgc2Vjb25kLgotQWZ0ZXIgdGhlIGRlZmluaXRpb24gaXMgY29tcGxldGUsIHlvdSBjYW4gY2FsbCB0aGUgbWFjcm8gZWl0aGVyIGFzCi1Ac2FtcHtyZXNlcnZlX3N0ciBAdmFye2F9LEB2YXJ7Yn19ICh3aXRoIEBzYW1we1xwMX0gZXZhbHVhdGluZyB0bwotQHZhcnthfSBhbmQgQHNhbXB7XHAyfSBldmFsdWF0aW5nIHRvIEB2YXJ7Yn0pLCBvciBhcyBAc2FtcHtyZXNlcnZlX3N0cgotLEB2YXJ7Yn19ICh3aXRoIEBzYW1we1xwMX0gZXZhbHVhdGluZyBhcyB0aGUgZGVmYXVsdCwgaW4gdGhpcyBjYXNlCi1Ac2FtcHswfSwgYW5kIEBzYW1we1xwMn0gZXZhbHVhdGluZyB0byBAdmFye2J9KS4KLUBlbmQgdGFibGUKLQotV2hlbiB5b3UgY2FsbCBhIG1hY3JvLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGFyZ3VtZW50IHZhbHVlcyBlaXRoZXIgYnkKLXBvc2l0aW9uLCBvciBieSBrZXl3b3JkLiAgRm9yIGV4YW1wbGUsIEBzYW1we3N1bSA5LDE3fSBpcyBlcXVpdmFsZW50IHRvCi1Ac2FtcHtzdW0gdG89MTcsIGZyb209OX0uCi0KLUBpdGVtIC5lbmRtCi1AY2luZGV4IEBjb2Rle2VuZG19IGRpcmVjdGl2ZQotTWFyayB0aGUgZW5kIG9mIGEgbWFjcm8gZGVmaW5pdGlvbi4KLQotQGl0ZW0gLmV4aXRtCi1AY2luZGV4IEBjb2Rle2V4aXRtfSBkaXJlY3RpdmUKLUV4aXQgZWFybHkgZnJvbSB0aGUgY3VycmVudCBtYWNybyBkZWZpbml0aW9uLgotCi1AY2luZGV4IG51bWJlciBvZiBtYWNyb3MgZXhlY3V0ZWQKLUBjaW5kZXggbWFjcm9zLCBjb3VudCBleGVjdXRlZAotQGl0ZW0gXEBACi1AY29kZXtAdmFsdWV7QVN9fSBtYWludGFpbnMgYSBjb3VudGVyIG9mIGhvdyBtYW55IG1hY3JvcyBpdCBoYXMKLWV4ZWN1dGVkIGluIHRoaXMgcHNldWRvLXZhcmlhYmxlOyB5b3UgY2FuIGNvcHkgdGhhdCBudW1iZXIgdG8geW91cgotb3V0cHV0IHdpdGggQHNhbXB7XEBAfSwgYnV0IEBlbXBoe29ubHkgd2l0aGluIGEgbWFjcm8gZGVmaW5pdGlvbn0uCi0KLUBpZ25vcmUKLUBpdGVtIExPQ0FMIEB2YXJ7bmFtZX0gWyAsIEBkb3Rze30gXQotQGVtcGh7V2FybmluZzogQGNvZGV7TE9DQUx9IGlzIG9ubHkgYXZhaWxhYmxlIGlmIHlvdSBzZWxlY3QgYGBhbHRlcm5hdGUKLW1hY3JvIHN5bnRheCcnIHdpdGggQHNhbXB7LWF9IG9yIEBzYW1wey0tYWx0ZXJuYXRlfS59ICBAeHJlZntBbHRlcm5hdGUsLAotQWx0ZXJuYXRlIG1hY3JvIHN5bnRheH0uCi0KLUdlbmVyYXRlIGEgc3RyaW5nIHJlcGxhY2VtZW50IGZvciBlYWNoIG9mIHRoZSBAdmFye25hbWV9IGFyZ3VtZW50cywgYW5kCi1yZXBsYWNlIGFueSBpbnN0YW5jZXMgb2YgQHZhcntuYW1lfSBpbiBlYWNoIG1hY3JvIGV4cGFuc2lvbi4gIFRoZQotcmVwbGFjZW1lbnQgc3RyaW5nIGlzIHVuaXF1ZSBpbiB0aGUgYXNzZW1ibHksIGFuZCBkaWZmZXJlbnQgZm9yIGVhY2gKLXNlcGFyYXRlIG1hY3JvIGV4cGFuc2lvbi4gIEBjb2Rle0xPQ0FMfSBhbGxvd3MgeW91IHRvIHdyaXRlIG1hY3JvcyB0aGF0Ci1kZWZpbmUgc3ltYm9scywgd2l0aG91dCBmZWFyIG9mIGNvbmZsaWN0IGJldHdlZW4gc2VwYXJhdGUgbWFjcm8gZXhwYW5zaW9ucy4KLUBlbmQgaWdub3JlCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBOb2xpc3QKLUBzZWN0aW9uIEBjb2Rley5ub2xpc3R9Ci0KLUBjaW5kZXggQGNvZGV7bm9saXN0fSBkaXJlY3RpdmUKLUBjaW5kZXggbGlzdGluZyBjb250cm9sLCB0dXJuaW5nIG9mZgotQ29udHJvbCAoaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgQGNvZGV7Lmxpc3R9IGRpcmVjdGl2ZSkgd2hldGhlciBvcgotbm90IGFzc2VtYmx5IGxpc3RpbmdzIGFyZSBnZW5lcmF0ZWQuICBUaGVzZSB0d28gZGlyZWN0aXZlcyBtYWludGFpbiBhbgotaW50ZXJuYWwgY291bnRlciAod2hpY2ggaXMgemVybyBpbml0aWFsbHkpLiAgIEBjb2Rley5saXN0fSBpbmNyZW1lbnRzIHRoZQotY291bnRlciwgYW5kIEBjb2Rley5ub2xpc3R9IGRlY3JlbWVudHMgaXQuICBBc3NlbWJseSBsaXN0aW5ncyBhcmUKLWdlbmVyYXRlZCB3aGVuZXZlciB0aGUgY291bnRlciBpcyBncmVhdGVyIHRoYW4gemVyby4KLQotQG5vZGUgT2N0YQotQHNlY3Rpb24gQGNvZGV7Lm9jdGEgQHZhcntiaWdudW1zfX0KLQotQGMgRklYTUU6IGRvdWJsZSBzaXplIGVtaXR0ZWQgZm9yICJvY3RhIiBvbiBpOTYwLCBvdGhlcnM/ICBPciB3YXJuPwotQGNpbmRleCBAY29kZXtvY3RhfSBkaXJlY3RpdmUKLUBjaW5kZXggaW50ZWdlciwgMTYtYnl0ZQotQGNpbmRleCBzaXh0ZWVuIGJ5dGUgaW50ZWdlcgotVGhpcyBkaXJlY3RpdmUgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgYmlnbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIEZvciBlYWNoCi1iaWdudW0sIGl0IGVtaXRzIGEgMTYtYnl0ZSBpbnRlZ2VyLgotCi1UaGUgdGVybSBgYG9jdGEnJyBjb21lcyBmcm9tIGNvbnRleHRzIGluIHdoaWNoIGEgYGB3b3JkJycgaXMgdHdvIGJ5dGVzOwotaGVuY2UgQGVtcGh7b2N0YX0td29yZCBmb3IgMTYgYnl0ZXMuCi0KLUBub2RlIE9yZwotQHNlY3Rpb24gQGNvZGV7Lm9yZyBAdmFye25ldy1sY30gLCBAdmFye2ZpbGx9fQotCi1AY2luZGV4IEBjb2Rle29yZ30gZGlyZWN0aXZlCi1AY2luZGV4IGxvY2F0aW9uIGNvdW50ZXIsIGFkdmFuY2luZwotQGNpbmRleCBhZHZhbmNpbmcgbG9jYXRpb24gY291bnRlcgotQGNpbmRleCBjdXJyZW50IGFkZHJlc3MsIGFkdmFuY2luZwotQWR2YW5jZSB0aGUgbG9jYXRpb24gY291bnRlciBvZiB0aGUgY3VycmVudCBzZWN0aW9uIHRvCi1AdmFye25ldy1sY30uICBAdmFye25ldy1sY30gaXMgZWl0aGVyIGFuIGFic29sdXRlIGV4cHJlc3Npb24gb3IgYW4KLWV4cHJlc3Npb24gd2l0aCB0aGUgc2FtZSBzZWN0aW9uIGFzIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24uICBUaGF0IGlzLAoteW91IGNhbid0IHVzZSBAY29kZXsub3JnfSB0byBjcm9zcyBzZWN0aW9uczogaWYgQHZhcntuZXctbGN9IGhhcyB0aGUKLXdyb25nIHNlY3Rpb24sIHRoZSBAY29kZXsub3JnfSBkaXJlY3RpdmUgaXMgaWdub3JlZC4gIFRvIGJlIGNvbXBhdGlibGUKLXdpdGggZm9ybWVyIGFzc2VtYmxlcnMsIGlmIHRoZSBzZWN0aW9uIG9mIEB2YXJ7bmV3LWxjfSBpcyBhYnNvbHV0ZSwKLUBjb2Rle0B2YWx1ZXtBU319IGlzc3VlcyBhIHdhcm5pbmcsIHRoZW4gcHJldGVuZHMgdGhlIHNlY3Rpb24gb2YgQHZhcntuZXctbGN9Ci1pcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBzdWJzZWN0aW9uLgotCi1AY29kZXsub3JnfSBtYXkgb25seSBpbmNyZWFzZSB0aGUgbG9jYXRpb24gY291bnRlciwgb3IgbGVhdmUgaXQKLXVuY2hhbmdlZDsgeW91IGNhbm5vdCB1c2UgQGNvZGV7Lm9yZ30gdG8gbW92ZSB0aGUgbG9jYXRpb24gY291bnRlcgotYmFja3dhcmRzLgotCi1AYyBkb3VibGUgbmVnYXRpdmUgdXNlZCBiZWxvdyAibm90IHVuZGVmaW5lZCIgYmVjYXVzZSB0aGlzIGlzIGEgc3BlY2lmaWMKLUBjIHJlZmVyZW5jZSB0byAidW5kZWZpbmVkIiAoYXMgU0VHX1VOS05PV04gaXMgY2FsbGVkIGluIHRoaXMgbWFudWFsKQotQGMgc2VjdGlvbi4gZG9jQGN5Z251cy5jb20gMThmZWI5MQotQmVjYXVzZSBAY29kZXtAdmFsdWV7QVN9fSB0cmllcyB0byBhc3NlbWJsZSBwcm9ncmFtcyBpbiBvbmUgcGFzcywgQHZhcntuZXctbGN9Ci1tYXkgbm90IGJlIHVuZGVmaW5lZC4gIElmIHlvdSByZWFsbHkgZGV0ZXN0IHRoaXMgcmVzdHJpY3Rpb24gd2UgZWFnZXJseSBhd2FpdAotYSBjaGFuY2UgdG8gc2hhcmUgeW91ciBpbXByb3ZlZCBhc3NlbWJsZXIuCi0KLUJld2FyZSB0aGF0IHRoZSBvcmlnaW4gaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLCBub3QKLXRvIHRoZSBzdGFydCBvZiB0aGUgc3Vic2VjdGlvbi4gIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIG90aGVyCi1wZW9wbGUncyBhc3NlbWJsZXJzLgotCi1XaGVuIHRoZSBsb2NhdGlvbiBjb3VudGVyIChvZiB0aGUgY3VycmVudCBzdWJzZWN0aW9uKSBpcyBhZHZhbmNlZCwgdGhlCi1pbnRlcnZlbmluZyBieXRlcyBhcmUgZmlsbGVkIHdpdGggQHZhcntmaWxsfSB3aGljaCBzaG91bGQgYmUgYW4KLWFic29sdXRlIGV4cHJlc3Npb24uICBJZiB0aGUgY29tbWEgYW5kIEB2YXJ7ZmlsbH0gYXJlIG9taXR0ZWQsCi1AdmFye2ZpbGx9IGRlZmF1bHRzIHRvIHplcm8uCi0KLUBub2RlIFAyYWxpZ24KLUBzZWN0aW9uIEBjb2Rley5wMmFsaWduW3dsXSBAdmFye2Ficy1leHByfSwgQHZhcnthYnMtZXhwcn0sIEB2YXJ7YWJzLWV4cHJ9fQotCi1AY2luZGV4IHBhZGRpbmcgdGhlIGxvY2F0aW9uIGNvdW50ZXIgZ2l2ZW4gYSBwb3dlciBvZiB0d28KLUBjaW5kZXggQGNvZGV7cDJhbGlnbn0gZGlyZWN0aXZlCi1QYWQgdGhlIGxvY2F0aW9uIGNvdW50ZXIgKGluIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24pIHRvIGEgcGFydGljdWxhcgotc3RvcmFnZSBib3VuZGFyeS4gIFRoZSBmaXJzdCBleHByZXNzaW9uICh3aGljaCBtdXN0IGJlIGFic29sdXRlKSBpcyB0aGUKLW51bWJlciBvZiBsb3ctb3JkZXIgemVybyBiaXRzIHRoZSBsb2NhdGlvbiBjb3VudGVyIG11c3QgaGF2ZSBhZnRlcgotYWR2YW5jZW1lbnQuICBGb3IgZXhhbXBsZSBAc2FtcHsucDJhbGlnbiAzfSBhZHZhbmNlcyB0aGUgbG9jYXRpb24KLWNvdW50ZXIgdW50aWwgaXQgYSBtdWx0aXBsZSBvZiA4LiAgSWYgdGhlIGxvY2F0aW9uIGNvdW50ZXIgaXMgYWxyZWFkeSBhCi1tdWx0aXBsZSBvZiA4LCBubyBjaGFuZ2UgaXMgbmVlZGVkLgotCi1UaGUgc2Vjb25kIGV4cHJlc3Npb24gKGFsc28gYWJzb2x1dGUpIGdpdmVzIHRoZSBmaWxsIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiB0aGUKLXBhZGRpbmcgYnl0ZXMuICBJdCAoYW5kIHRoZSBjb21tYSkgbWF5IGJlIG9taXR0ZWQuICBJZiBpdCBpcyBvbWl0dGVkLCB0aGUKLXBhZGRpbmcgYnl0ZXMgYXJlIG5vcm1hbGx5IHplcm8uICBIb3dldmVyLCBvbiBzb21lIHN5c3RlbXMsIGlmIHRoZSBzZWN0aW9uIGlzCi1tYXJrZWQgYXMgY29udGFpbmluZyBjb2RlIGFuZCB0aGUgZmlsbCB2YWx1ZSBpcyBvbWl0dGVkLCB0aGUgc3BhY2UgaXMgZmlsbGVkCi13aXRoIG5vLW9wIGluc3RydWN0aW9ucy4KLQotVGhlIHRoaXJkIGV4cHJlc3Npb24gaXMgYWxzbyBhYnNvbHV0ZSwgYW5kIGlzIGFsc28gb3B0aW9uYWwuICBJZiBpdCBpcyBwcmVzZW50LAotaXQgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgYnkgdGhpcyBhbGlnbm1lbnQKLWRpcmVjdGl2ZS4gIElmIGRvaW5nIHRoZSBhbGlnbm1lbnQgd291bGQgcmVxdWlyZSBza2lwcGluZyBtb3JlIGJ5dGVzIHRoYW4gdGhlCi1zcGVjaWZpZWQgbWF4aW11bSwgdGhlbiB0aGUgYWxpZ25tZW50IGlzIG5vdCBkb25lIGF0IGFsbC4gIFlvdSBjYW4gb21pdCB0aGUKLWZpbGwgdmFsdWUgKHRoZSBzZWNvbmQgYXJndW1lbnQpIGVudGlyZWx5IGJ5IHNpbXBseSB1c2luZyB0d28gY29tbWFzIGFmdGVyIHRoZQotcmVxdWlyZWQgYWxpZ25tZW50OyB0aGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdGhlIGFsaWdubWVudCB0byBiZSBmaWxsZWQKLXdpdGggbm8tb3AgaW5zdHJ1Y3Rpb25zIHdoZW4gYXBwcm9wcmlhdGUuCi0KLUBjaW5kZXggQGNvZGV7cDJhbGlnbnd9IGRpcmVjdGl2ZQotQGNpbmRleCBAY29kZXtwMmFsaWdubH0gZGlyZWN0aXZlCi1UaGUgQGNvZGV7LnAyYWxpZ253fSBhbmQgQGNvZGV7LnAyYWxpZ25sfSBkaXJlY3RpdmVzIGFyZSB2YXJpYW50cyBvZiB0aGUKLUBjb2Rley5wMmFsaWdufSBkaXJlY3RpdmUuICBUaGUgQGNvZGV7LnAyYWxpZ253fSBkaXJlY3RpdmUgdHJlYXRzIHRoZSBmaWxsCi1wYXR0ZXJuIGFzIGEgdHdvIGJ5dGUgd29yZCB2YWx1ZS4gIFRoZSBAY29kZXsucDJhbGlnbmx9IGRpcmVjdGl2ZXMgdHJlYXRzIHRoZQotZmlsbCBwYXR0ZXJuIGFzIGEgZm91ciBieXRlIGxvbmd3b3JkIHZhbHVlLiAgRm9yIGV4YW1wbGUsIEBjb2Rley5wMmFsaWdudwotMiwweDM2OGR9IHdpbGwgYWxpZ24gdG8gYSBtdWx0aXBsZSBvZiA0LiAgSWYgaXQgc2tpcHMgdHdvIGJ5dGVzLCB0aGV5IHdpbGwgYmUKLWZpbGxlZCBpbiB3aXRoIHRoZSB2YWx1ZSAweDM2OGQgKHRoZSBleGFjdCBwbGFjZW1lbnQgb2YgdGhlIGJ5dGVzIGRlcGVuZHMgdXBvbgotdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHByb2Nlc3NvcikuICBJZiBpdCBza2lwcyAxIG9yIDMgYnl0ZXMsIHRoZSBmaWxsIHZhbHVlIGlzCi11bmRlZmluZWQuCi0KLUBub2RlIFByaW50Ci1Ac2VjdGlvbiBAY29kZXsucHJpbnQgQHZhcntzdHJpbmd9fQotCi1AY2luZGV4IEBjb2Rle3ByaW50fSBkaXJlY3RpdmUKLUBjb2Rle0B2YWx1ZXtBU319IHdpbGwgcHJpbnQgQHZhcntzdHJpbmd9IG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgZHVyaW5nCi1hc3NlbWJseS4gIFlvdSBtdXN0IHB1dCBAdmFye3N0cmluZ30gaW4gZG91YmxlIHF1b3Rlcy4KLQotQG5vZGUgUHNpemUKLUBzZWN0aW9uIEBjb2Rley5wc2l6ZSBAdmFye2xpbmVzfSAsIEB2YXJ7Y29sdW1uc319Ci0KLUBjaW5kZXggQGNvZGV7cHNpemV9IGRpcmVjdGl2ZQotQGNpbmRleCBsaXN0aW5nIGNvbnRyb2w6IHBhcGVyIHNpemUKLUBjaW5kZXggcGFwZXIgc2l6ZSwgZm9yIGxpc3RpbmdzCi1Vc2UgdGhpcyBkaXJlY3RpdmUgdG8gZGVjbGFyZSB0aGUgbnVtYmVyIG9mIGxpbmVzLS0tYW5kLCBvcHRpb25hbGx5LCB0aGUKLW51bWJlciBvZiBjb2x1bW5zLS0tdG8gdXNlIGZvciBlYWNoIHBhZ2UsIHdoZW4gZ2VuZXJhdGluZyBsaXN0aW5ncy4KLQotSWYgeW91IGRvIG5vdCB1c2UgQGNvZGV7LnBzaXplfSwgbGlzdGluZ3MgdXNlIGEgZGVmYXVsdCBsaW5lLWNvdW50Ci1vZiA2MC4gIFlvdSBtYXkgb21pdCB0aGUgY29tbWEgYW5kIEB2YXJ7Y29sdW1uc30gc3BlY2lmaWNhdGlvbjsgdGhlCi1kZWZhdWx0IHdpZHRoIGlzIDIwMCBjb2x1bW5zLgotCi1AY29kZXtAdmFsdWV7QVN9fSBnZW5lcmF0ZXMgZm9ybWZlZWRzIHdoZW5ldmVyIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mCi1saW5lcyBpcyBleGNlZWRlZCAob3Igd2hlbmV2ZXIgeW91IGV4cGxpY2l0bHkgcmVxdWVzdCBvbmUsIHVzaW5nCi1AY29kZXsuZWplY3R9KS4KLQotSWYgeW91IHNwZWNpZnkgQHZhcntsaW5lc30gYXMgQGNvZGV7MH0sIG5vIGZvcm1mZWVkcyBhcmUgZ2VuZXJhdGVkIHNhdmUKLXRob3NlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHdpdGggQGNvZGV7LmVqZWN0fS4KLQotQG5vZGUgUHVyZ2VtCi1Ac2VjdGlvbiBAY29kZXsucHVyZ2VtIEB2YXJ7bmFtZX19Ci0KLUBjaW5kZXggQGNvZGV7cHVyZ2VtfSBkaXJlY3RpdmUKLVVuZGVmaW5lIHRoZSBtYWNybyBAdmFye25hbWV9LCBzbyB0aGF0IGxhdGVyIHVzZXMgb2YgdGhlIHN0cmluZyB3aWxsIG5vdCBiZQotZXhwYW5kZWQuICBAeHJlZntNYWNyb30uCi0KLUBub2RlIFF1YWQKLUBzZWN0aW9uIEBjb2Rley5xdWFkIEB2YXJ7YmlnbnVtc319Ci0KLUBjaW5kZXggQGNvZGV7cXVhZH0gZGlyZWN0aXZlCi1AY29kZXsucXVhZH0gZXhwZWN0cyB6ZXJvIG9yIG1vcmUgYmlnbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIEZvcgotZWFjaCBiaWdudW0sIGl0IGVtaXRzCi1AaWZjbGVhciBiaWdudW0tMTYKLWFuIDgtYnl0ZSBpbnRlZ2VyLiAgSWYgdGhlIGJpZ251bSB3b24ndCBmaXQgaW4gOCBieXRlcywgaXQgcHJpbnRzIGEKLXdhcm5pbmcgbWVzc2FnZTsgYW5kIGp1c3QgdGFrZXMgdGhlIGxvd2VzdCBvcmRlciA4IGJ5dGVzIG9mIHRoZSBiaWdudW0uCi1AY2luZGV4IGVpZ2h0LWJ5dGUgaW50ZWdlcgotQGNpbmRleCBpbnRlZ2VyLCA4LWJ5dGUKLQotVGhlIHRlcm0gYGBxdWFkJycgY29tZXMgZnJvbSBjb250ZXh0cyBpbiB3aGljaCBhIGBgd29yZCcnIGlzIHR3byBieXRlczsKLWhlbmNlIEBlbXBoe3F1YWR9LXdvcmQgZm9yIDggYnl0ZXMuCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBiaWdudW0tMTYKLWEgMTYtYnl0ZSBpbnRlZ2VyLiAgSWYgdGhlIGJpZ251bSB3b24ndCBmaXQgaW4gMTYgYnl0ZXMsIGl0IHByaW50cyBhCi13YXJuaW5nIG1lc3NhZ2U7IGFuZCBqdXN0IHRha2VzIHRoZSBsb3dlc3Qgb3JkZXIgMTYgYnl0ZXMgb2YgdGhlIGJpZ251bS4KLUBjaW5kZXggc2l4dGVlbi1ieXRlIGludGVnZXIKLUBjaW5kZXggaW50ZWdlciwgMTYtYnl0ZQotQGVuZCBpZnNldAotCi1Abm9kZSBSZXB0Ci1Ac2VjdGlvbiBAY29kZXsucmVwdCBAdmFye2NvdW50fX0KLQotQGNpbmRleCBAY29kZXtyZXB0fSBkaXJlY3RpdmUKLVJlcGVhdCB0aGUgc2VxdWVuY2Ugb2YgbGluZXMgYmV0d2VlbiB0aGUgQGNvZGV7LnJlcHR9IGRpcmVjdGl2ZSBhbmQgdGhlIG5leHQKLUBjb2Rley5lbmRyfSBkaXJlY3RpdmUgQHZhcntjb3VudH0gdGltZXMuCi0KLUZvciBleGFtcGxlLCBhc3NlbWJsaW5nCi0KLUBleGFtcGxlCi0gICAgICAgIC5yZXB0ICAgMwotICAgICAgICAubG9uZyAgIDAKLSAgICAgICAgLmVuZHIKLUBlbmQgZXhhbXBsZQotCi1pcyBlcXVpdmFsZW50IHRvIGFzc2VtYmxpbmcKLQotQGV4YW1wbGUKLSAgICAgICAgLmxvbmcgICAwCi0gICAgICAgIC5sb25nICAgMAotICAgICAgICAubG9uZyAgIDAKLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBTYnR0bAotQHNlY3Rpb24gQGNvZGV7LnNidHRsICJAdmFye3N1YmhlYWRpbmd9In0KLQotQGNpbmRleCBAY29kZXtzYnR0bH0gZGlyZWN0aXZlCi1AY2luZGV4IHN1YnRpdGxlcyBmb3IgbGlzdGluZ3MKLUBjaW5kZXggbGlzdGluZyBjb250cm9sOiBzdWJ0aXRsZQotVXNlIEB2YXJ7c3ViaGVhZGluZ30gYXMgdGhlIHRpdGxlICh0aGlyZCBsaW5lLCBpbW1lZGlhdGVseSBhZnRlciB0aGUKLXRpdGxlIGxpbmUpIHdoZW4gZ2VuZXJhdGluZyBhc3NlbWJseSBsaXN0aW5ncy4KLQotVGhpcyBkaXJlY3RpdmUgYWZmZWN0cyBzdWJzZXF1ZW50IHBhZ2VzLCBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IHBhZ2UgaWYKLWl0IGFwcGVhcnMgd2l0aGluIHRlbiBsaW5lcyBvZiB0aGUgdG9wIG9mIGEgcGFnZS4KLQotQGlmc2V0IENPRkYKLUBub2RlIFNjbAotQHNlY3Rpb24gQGNvZGV7LnNjbCBAdmFye2NsYXNzfX0KLQotQGNpbmRleCBAY29kZXtzY2x9IGRpcmVjdGl2ZQotQGNpbmRleCBzeW1ib2wgc3RvcmFnZSBjbGFzcyAoQ09GRikKLUBjaW5kZXggQ09GRiBzeW1ib2wgc3RvcmFnZSBjbGFzcwotU2V0IHRoZSBzdG9yYWdlLWNsYXNzIHZhbHVlIGZvciBhIHN5bWJvbC4gIFRoaXMgZGlyZWN0aXZlIG1heSBvbmx5IGJlCi11c2VkIGluc2lkZSBhIEBjb2Rley5kZWZ9L0Bjb2Rley5lbmRlZn0gcGFpci4gIFN0b3JhZ2UgY2xhc3MgbWF5IGZsYWcKLXdoZXRoZXIgYSBzeW1ib2wgaXMgc3RhdGljIG9yIGV4dGVybmFsLCBvciBpdCBtYXkgcmVjb3JkIGZ1cnRoZXIKLXN5bWJvbGljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLUBpZnNldCBCT1VUCi0KLVRoZSBAc2FtcHsuc2NsfSBkaXJlY3RpdmUgaXMgcHJpbWFyaWx5IGFzc29jaWF0ZWQgd2l0aCBDT0ZGIG91dHB1dDsgd2hlbgotY29uZmlndXJlZCB0byBnZW5lcmF0ZSBAY29kZXtiLm91dH0gb3V0cHV0IGZvcm1hdCwgQGNvZGV7QHZhbHVle0FTfX0KLWFjY2VwdHMgdGhpcyBkaXJlY3RpdmUgYnV0IGlnbm9yZXMgaXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIFNlY3Rpb24KLUBzZWN0aW9uIEBjb2Rley5zZWN0aW9uIEB2YXJ7bmFtZX19Ci0KLUBjaW5kZXggQGNvZGV7c2VjdGlvbn0gZGlyZWN0aXZlCi1AY2luZGV4IG5hbWVkIHNlY3Rpb24KLVVzZSB0aGUgQGNvZGV7LnNlY3Rpb259IGRpcmVjdGl2ZSB0byBhc3NlbWJsZSB0aGUgZm9sbG93aW5nIGNvZGUgaW50byBhIHNlY3Rpb24KLW5hbWVkIEB2YXJ7bmFtZX0uCi0KLVRoaXMgZGlyZWN0aXZlIGlzIG9ubHkgc3VwcG9ydGVkIGZvciB0YXJnZXRzIHRoYXQgYWN0dWFsbHkgc3VwcG9ydCBhcmJpdHJhcmlseQotbmFtZWQgc2VjdGlvbnM7IG9uIEBjb2Rle2Eub3V0fSB0YXJnZXRzLCBmb3IgZXhhbXBsZSwgaXQgaXMgbm90IGFjY2VwdGVkLCBldmVuCi13aXRoIGEgc3RhbmRhcmQgQGNvZGV7YS5vdXR9IHNlY3Rpb24gbmFtZS4KLQotQGlmc2V0IENPRkYKLUZvciBDT0ZGIHRhcmdldHMsIHRoZSBAY29kZXsuc2VjdGlvbn0gZGlyZWN0aXZlIGlzIHVzZWQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcKLXdheXM6Ci1Ac21hbGxleGFtcGxlCi0uc2VjdGlvbiBAdmFye25hbWV9WywgIkB2YXJ7ZmxhZ3N9Il0KLS5zZWN0aW9uIEB2YXJ7bmFtZX1bLCBAdmFye3N1YnNlZ21lbnR9XQotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGlzIHF1b3RlZCwgaXQgaXMgdGFrZW4gYXMgZmxhZ3MgdG8gdXNlIGZvciB0aGUKLXNlY3Rpb24uICBFYWNoIGZsYWcgaXMgYSBzaW5nbGUgY2hhcmFjdGVyLiAgVGhlIGZvbGxvd2luZyBmbGFncyBhcmUgcmVjb2duaXplZDoKLUB0YWJsZSBAY29kZQotQGl0ZW0gYgotYnNzIHNlY3Rpb24gKHVuaW5pdGlhbGl6ZWQgZGF0YSkKLUBpdGVtIG4KLXNlY3Rpb24gaXMgbm90IGxvYWRlZAotQGl0ZW0gdwotd3JpdGFibGUgc2VjdGlvbgotQGl0ZW0gZAotZGF0YSBzZWN0aW9uCi1AaXRlbSByCi1yZWFkLW9ubHkgc2VjdGlvbgotQGl0ZW0geAotZXhlY3V0YWJsZSBzZWN0aW9uCi1AZW5kIHRhYmxlCi0KLUlmIG5vIGZsYWdzIGFyZSBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGZsYWdzIGRlcGVuZCB1cG9uIHRoZSBzZWN0aW9uIG5hbWUuICBJZgotdGhlIHNlY3Rpb24gbmFtZSBpcyBub3QgcmVjb2duaXplZCwgdGhlIGRlZmF1bHQgd2lsbCBiZSBmb3IgdGhlIHNlY3Rpb24gdG8gYmUKLWxvYWRlZCBhbmQgd3JpdGFibGUuCi0KLUlmIHRoZSBvcHRpb25hbCBhcmd1bWVudCB0byB0aGUgQGNvZGV7LnNlY3Rpb259IGRpcmVjdGl2ZSBpcyBub3QgcXVvdGVkLCBpdCBpcwotdGFrZW4gYXMgYSBzdWJzZWdtZW50IG51bWJlciAoQHB4cmVme1N1Yi1TZWN0aW9uc30pLgotQGVuZCBpZnNldAotCi1AaWZzZXQgRUxGCi1Gb3IgRUxGIHRhcmdldHMsIHRoZSBAY29kZXsuc2VjdGlvbn0gZGlyZWN0aXZlIGlzIHVzZWQgbGlrZSB0aGlzOgotQHNtYWxsZXhhbXBsZQotLnNlY3Rpb24gQHZhcntuYW1lfVssICJAdmFye2ZsYWdzfSJbLCBAQEB2YXJ7dHlwZX1dXQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoZSBvcHRpb25hbCBAdmFye2ZsYWdzfSBhcmd1bWVudCBpcyBhIHF1b3RlZCBzdHJpbmcgd2hpY2ggbWF5IGNvbnRhaW4gYW55Ci1jb21iaW50aW9uIG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKLUB0YWJsZSBAY29kZQotQGl0ZW0gYQotc2VjdGlvbiBpcyBhbGxvY2F0YWJsZQotQGl0ZW0gdwotc2VjdGlvbiBpcyB3cml0YWJsZQotQGl0ZW0geAotc2VjdGlvbiBpcyBleGVjdXRhYmxlCi1AZW5kIHRhYmxlCi0KLVRoZSBvcHRpb25hbCBAdmFye3R5cGV9IGFyZ3VtZW50IG1heSBjb250YWluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbnN0YW50czoKLUB0YWJsZSBAY29kZQotQGl0ZW0gQEBwcm9nYml0cwotc2VjdGlvbiBjb250YWlucyBkYXRhCi1AaXRlbSBAQG5vYml0cwotc2VjdGlvbiBkb2VzIG5vdCBjb250YWluIGRhdGEgKGkuZS4sIHNlY3Rpb24gb25seSBvY2N1cGllcyBzcGFjZSkKLUBlbmQgdGFibGUKLQotSWYgbm8gZmxhZ3MgYXJlIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgZmxhZ3MgZGVwZW5kIHVwb24gdGhlIHNlY3Rpb24gbmFtZS4gIElmCi10aGUgc2VjdGlvbiBuYW1lIGlzIG5vdCByZWNvZ25pemVkLCB0aGUgZGVmYXVsdCB3aWxsIGJlIGZvciB0aGUgc2VjdGlvbiB0byBoYXZlCi1ub25lIG9mIHRoZSBhYm92ZSBmbGFnczogaXQgd2lsbCBub3QgYmUgYWxsb2NhdGVkIGluIG1lbW9yeSwgbm9yIHdyaXRhYmxlLCBub3IKLWV4ZWN1dGFibGUuICBUaGUgc2VjdGlvbiB3aWxsIGNvbnRhaW4gZGF0YS4KLQotRm9yIEVMRiB0YXJnZXRzLCB0aGUgYXNzZW1ibGVyIHN1cHBvcnRzIGFub3RoZXIgdHlwZSBvZiBAY29kZXsuc2VjdGlvbn0KLWRpcmVjdGl2ZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBTb2xhcmlzIGFzc2VtYmxlcjoKLUBzbWFsbGV4YW1wbGUKLS5zZWN0aW9uICJAdmFye25hbWV9IlssIEB2YXJ7ZmxhZ3N9Li4uXQotQGVuZCBzbWFsbGV4YW1wbGUKLU5vdGUgdGhhdCB0aGUgc2VjdGlvbiBuYW1lIGlzIHF1b3RlZC4gIFRoZXJlIG1heSBiZSBhIHNlcXVlbmNlIG9mIGNvbW1hCi1zZXBhcmF0ZWQgZmxhZ3M6Ci1AdGFibGUgQGNvZGUKLUBpdGVtICNhbGxvYwotc2VjdGlvbiBpcyBhbGxvY2F0YWJsZQotQGl0ZW0gI3dyaXRlCi1zZWN0aW9uIGlzIHdyaXRhYmxlCi1AaXRlbSAjZXhlY2luc3RyCi1zZWN0aW9uIGlzIGV4ZWN1dGFibGUKLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQG5vZGUgU2V0Ci1Ac2VjdGlvbiBAY29kZXsuc2V0IEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufX0KLQotQGNpbmRleCBAY29kZXtzZXR9IGRpcmVjdGl2ZQotQGNpbmRleCBzeW1ib2wgdmFsdWUsIHNldHRpbmcKLVNldCB0aGUgdmFsdWUgb2YgQHZhcntzeW1ib2x9IHRvIEB2YXJ7ZXhwcmVzc2lvbn0uICBUaGlzCi1jaGFuZ2VzIEB2YXJ7c3ltYm9sfSdzIHZhbHVlIGFuZCB0eXBlIHRvIGNvbmZvcm0gdG8KLUB2YXJ7ZXhwcmVzc2lvbn0uICBJZiBAdmFye3N5bWJvbH0gd2FzIGZsYWdnZWQgYXMgZXh0ZXJuYWwsIGl0IHJlbWFpbnMKLWZsYWdnZWQgKEBweHJlZntTeW1ib2wgQXR0cmlidXRlc30pLgotCi1Zb3UgbWF5IEBjb2Rley5zZXR9IGEgc3ltYm9sIG1hbnkgdGltZXMgaW4gdGhlIHNhbWUgYXNzZW1ibHkuCi0KLUlmIHlvdSBAY29kZXsuc2V0fSBhIGdsb2JhbCBzeW1ib2wsIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIG9iamVjdAotZmlsZSBpcyB0aGUgbGFzdCB2YWx1ZSBzdG9yZWQgaW50byBpdC4KLQotQGlmc2V0IEhQUEEKLVRoZSBzeW50YXggZm9yIEBjb2Rle3NldH0gb24gdGhlIEhQUEEgaXMKLUBzYW1we0B2YXJ7c3ltYm9sfSAuc2V0IEB2YXJ7ZXhwcmVzc2lvbn19LgotQGVuZCBpZnNldAotCi1Abm9kZSBTaG9ydAotQHNlY3Rpb24gQGNvZGV7LnNob3J0IEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle3Nob3J0fSBkaXJlY3RpdmUKLUBpZnNldCBHRU5FUklDCi1AY29kZXsuc2hvcnR9IGlzIG5vcm1hbGx5IHRoZSBzYW1lIGFzIEBzYW1wey53b3JkfS4KLUB4cmVme1dvcmQsLEBjb2Rley53b3JkfX0uCi0KLUluIHNvbWUgY29uZmlndXJhdGlvbnMsIGhvd2V2ZXIsIEBjb2Rley5zaG9ydH0gYW5kIEBjb2Rley53b3JkfSBnZW5lcmF0ZQotbnVtYmVycyBvZiBkaWZmZXJlbnQgbGVuZ3RoczsgQHB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBXMTYKLUBjb2Rley5zaG9ydH0gaXMgdGhlIHNhbWUgYXMgQHNhbXB7LndvcmR9LiAgQHhyZWZ7V29yZCwsQGNvZGV7LndvcmR9fS4KLUBlbmQgaWZzZXQKLUBpZnNldCBXMzIKLVRoaXMgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgQHZhcntleHByZXNzaW9uc30sIGFuZCBlbWl0cwotYSAxNiBiaXQgbnVtYmVyIGZvciBlYWNoLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBub2RlIFNpbmdsZQotQHNlY3Rpb24gQGNvZGV7LnNpbmdsZSBAdmFye2Zsb251bXN9fQotCi1AY2luZGV4IEBjb2Rle3NpbmdsZX0gZGlyZWN0aXZlCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50IG51bWJlcnMgKHNpbmdsZSkKLVRoaXMgZGlyZWN0aXZlIGFzc2VtYmxlcyB6ZXJvIG9yIG1vcmUgZmxvbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIEl0Ci1oYXMgdGhlIHNhbWUgZWZmZWN0IGFzIEBjb2Rley5mbG9hdH0uCi1AaWZzZXQgR0VORVJJQwotVGhlIGV4YWN0IGtpbmQgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBlbWl0dGVkIGRlcGVuZHMgb24gaG93Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkLiAgQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IElFRUVGTE9BVAotT24gdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseSwgQGNvZGV7LnNpbmdsZX0gZW1pdHMgMzItYml0IGZsb2F0aW5nIHBvaW50Ci1udW1iZXJzIGluIEBzY3tpZWVlfSBmb3JtYXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQGlmc2V0IENPRkYKLUBub2RlIFNpemUKLUBzZWN0aW9uIEBjb2Rley5zaXplfQotCi1AY2luZGV4IEBjb2Rle3NpemV9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUgaXMgZ2VuZXJhdGVkIGJ5IGNvbXBpbGVycyB0byBpbmNsdWRlIGF1eGlsaWFyeSBkZWJ1Z2dpbmcKLWluZm9ybWF0aW9uIGluIHRoZSBzeW1ib2wgdGFibGUuICBJdCBpcyBvbmx5IHBlcm1pdHRlZCBpbnNpZGUKLUBjb2Rley5kZWZ9L0Bjb2Rley5lbmRlZn0gcGFpcnMuCi1AaWZzZXQgQk9VVAotCi1Ac2FtcHsuc2l6ZX0gaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gZ2VuZXJhdGluZyBDT0ZGIGZvcm1hdCBvdXRwdXQ7IHdoZW4KLUBjb2Rle0B2YWx1ZXtBU319IGlzIGdlbmVyYXRpbmcgQGNvZGV7Yi5vdXR9LCBpdCBhY2NlcHRzIHRoaXMgZGlyZWN0aXZlIGJ1dAotaWdub3JlcyBpdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQG5vZGUgU2xlYjEyOAotQHNlY3Rpb24gQGNvZGV7LnNsZWIxMjggQHZhcntleHByZXNzaW9uc319Ci0KLUBjaW5kZXggQGNvZGV7c2xlYjEyOH0gZGlyZWN0aXZlCi1AdmFye3NsZWIxMjh9IHN0YW5kcyBmb3IgYGBzaWduZWQgbGl0dGxlIGVuZGlhbiBiYXNlIDEyOC4nJyAgVGhpcyBpcyBhIAotY29tcGFjdCwgdmFyaWFibGUgbGVuZ3RoIHJlcHJlc2VudGF0aW9uIG9mIG51bWJlcnMgdXNlZCBieSB0aGUgRFdBUkYKLXN5bWJvbGljIGRlYnVnZ2luZyBmb3JtYXQuICBAeHJlZntVbGViMTI4LEBjb2Rley51bGViMTI4fX0uCi0KLUBpZmNsZWFyIG5vLXNwYWNlLWRpcgotQG5vZGUgU2tpcAotQHNlY3Rpb24gQGNvZGV7LnNraXAgQHZhcntzaXplfSAsIEB2YXJ7ZmlsbH19Ci0KLUBjaW5kZXggQGNvZGV7c2tpcH0gZGlyZWN0aXZlCi1AY2luZGV4IGZpbGxpbmcgbWVtb3J5Ci1UaGlzIGRpcmVjdGl2ZSBlbWl0cyBAdmFye3NpemV9IGJ5dGVzLCBlYWNoIG9mIHZhbHVlIEB2YXJ7ZmlsbH0uICBCb3RoCi1AdmFye3NpemV9IGFuZCBAdmFye2ZpbGx9IGFyZSBhYnNvbHV0ZSBleHByZXNzaW9ucy4gIElmIHRoZSBjb21tYSBhbmQKLUB2YXJ7ZmlsbH0gYXJlIG9taXR0ZWQsIEB2YXJ7ZmlsbH0gaXMgYXNzdW1lZCB0byBiZSB6ZXJvLiAgVGhpcyBpcyB0aGUgc2FtZSBhcwotQHNhbXB7LnNwYWNlfS4KLQotQG5vZGUgU3BhY2UKLUBzZWN0aW9uIEBjb2Rley5zcGFjZSBAdmFye3NpemV9ICwgQHZhcntmaWxsfX0KLQotQGNpbmRleCBAY29kZXtzcGFjZX0gZGlyZWN0aXZlCi1AY2luZGV4IGZpbGxpbmcgbWVtb3J5Ci1UaGlzIGRpcmVjdGl2ZSBlbWl0cyBAdmFye3NpemV9IGJ5dGVzLCBlYWNoIG9mIHZhbHVlIEB2YXJ7ZmlsbH0uICBCb3RoCi1AdmFye3NpemV9IGFuZCBAdmFye2ZpbGx9IGFyZSBhYnNvbHV0ZSBleHByZXNzaW9ucy4gIElmIHRoZSBjb21tYQotYW5kIEB2YXJ7ZmlsbH0gYXJlIG9taXR0ZWQsIEB2YXJ7ZmlsbH0gaXMgYXNzdW1lZCB0byBiZSB6ZXJvLiAgVGhpcyBpcyB0aGUgc2FtZQotYXMgQHNhbXB7LnNraXB9LgotCi1AaWZzZXQgSFBQQQotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzp9IEBjb2Rley5zcGFjZX0gaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgbWVhbmluZyBmb3IgSFBQQQotdGFyZ2V0czsgdXNlIEBjb2Rley5ibG9ja30gYXMgYSBzdWJzdGl0dXRlLiAgU2VlIEBjaXRle0hQOTAwMCBTZXJpZXMgODAwCi1Bc3NlbWJseSBMYW5ndWFnZSBSZWZlcmVuY2UgTWFudWFsfSAoSFAgOTI0MzItOTAwMDEpIGZvciB0aGUgbWVhbmluZyBvZiB0aGUKLUBjb2Rley5zcGFjZX0gZGlyZWN0aXZlLiAgQHhyZWZ7SFBQQSBEaXJlY3RpdmVzLCxIUFBBIEFzc2VtYmxlciBEaXJlY3RpdmVzfSwKLWZvciBhIHN1bW1hcnkuCi1AZW5kIHF1b3RhdGlvbgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBpZnNldCBBMjlLCi1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBTcGFjZQotQHNlY3Rpb24gQGNvZGV7LnNwYWNlfQotQGNpbmRleCBAY29kZXtzcGFjZX0gZGlyZWN0aXZlCi1AZW5kIGlmY2xlYXIKLU9uIHRoZSBBTUQgMjlLLCB0aGlzIGRpcmVjdGl2ZSBpcyBpZ25vcmVkOyBpdCBpcyBhY2NlcHRlZCBmb3IKLWNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBBTUQgMjlLIGFzc2VtYmxlcnMuCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBJbiBtb3N0IHZlcnNpb25zIG9mIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIsIHRoZSBkaXJlY3RpdmUKLUBjb2Rley5zcGFjZX0gaGFzIHRoZSBlZmZlY3Qgb2YgQGNvZGV7LmJsb2NrfSAgQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBxdW90YXRpb24KLUBlbmQgaWZzZXQKLQotQGlmc2V0IGhhdmUtc3RhYnMKLUBub2RlIFN0YWIKLUBzZWN0aW9uIEBjb2Rley5zdGFiZCwgLnN0YWJuLCAuc3RhYnN9Ci0KLUBjaW5kZXggc3ltYm9saWMgZGVidWdnZXJzLCBpbmZvcm1hdGlvbiBmb3IKLUBjaW5kZXggQGNvZGV7c3RhYkB2YXJ7eH19IGRpcmVjdGl2ZXMKLVRoZXJlIGFyZSB0aHJlZSBkaXJlY3RpdmVzIHRoYXQgYmVnaW4gQHNhbXB7LnN0YWJ9LgotQWxsIGVtaXQgc3ltYm9scyAoQHB4cmVme1N5bWJvbHN9KSwgZm9yIHVzZSBieSBzeW1ib2xpYyBkZWJ1Z2dlcnMuCi1UaGUgc3ltYm9scyBhcmUgbm90IGVudGVyZWQgaW4gdGhlIEBjb2Rle0B2YWx1ZXtBU319IGhhc2ggdGFibGU6IHRoZXkKLWNhbm5vdCBiZSByZWZlcmVuY2VkIGVsc2V3aGVyZSBpbiB0aGUgc291cmNlIGZpbGUuCi1VcCB0byBmaXZlIGZpZWxkcyBhcmUgcmVxdWlyZWQ6Ci0KLUB0YWJsZSBAdmFyCi1AaXRlbSBzdHJpbmcKLVRoaXMgaXMgdGhlIHN5bWJvbCdzIG5hbWUuICBJdCBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVyIGV4Y2VwdAotQHNhbXB7XDAwMH0sIHNvIGlzIG1vcmUgZ2VuZXJhbCB0aGFuIG9yZGluYXJ5IHN5bWJvbCBuYW1lcy4gIFNvbWUKLWRlYnVnZ2VycyB1c2VkIHRvIGNvZGUgYXJiaXRyYXJpbHkgY29tcGxleCBzdHJ1Y3R1cmVzIGludG8gc3ltYm9sIG5hbWVzCi11c2luZyB0aGlzIGZpZWxkLgotCi1AaXRlbSB0eXBlCi1BbiBhYnNvbHV0ZSBleHByZXNzaW9uLiAgVGhlIHN5bWJvbCdzIHR5cGUgaXMgc2V0IHRvIHRoZSBsb3cgOCBiaXRzIG9mCi10aGlzIGV4cHJlc3Npb24uICBBbnkgYml0IHBhdHRlcm4gaXMgcGVybWl0dGVkLCBidXQgQGNvZGV7QHZhbHVle0xEfX0KLWFuZCBkZWJ1Z2dlcnMgY2hva2Ugb24gc2lsbHkgYml0IHBhdHRlcm5zLgotCi1AaXRlbSBvdGhlcgotQW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIFRoZSBzeW1ib2wncyBgYG90aGVyJycgYXR0cmlidXRlIGlzIHNldCB0byB0aGUKLWxvdyA4IGJpdHMgb2YgdGhpcyBleHByZXNzaW9uLgotCi1AaXRlbSBkZXNjCi1BbiBhYnNvbHV0ZSBleHByZXNzaW9uLiAgVGhlIHN5bWJvbCdzIGRlc2NyaXB0b3IgaXMgc2V0IHRvIHRoZSBsb3cgMTYKLWJpdHMgb2YgdGhpcyBleHByZXNzaW9uLgotCi1AaXRlbSB2YWx1ZQotQW4gYWJzb2x1dGUgZXhwcmVzc2lvbiB3aGljaCBiZWNvbWVzIHRoZSBzeW1ib2wncyB2YWx1ZS4KLUBlbmQgdGFibGUKLQotSWYgYSB3YXJuaW5nIGlzIGRldGVjdGVkIHdoaWxlIHJlYWRpbmcgYSBAY29kZXsuc3RhYmR9LCBAY29kZXsuc3RhYm59LAotb3IgQGNvZGV7LnN0YWJzfSBzdGF0ZW1lbnQsIHRoZSBzeW1ib2wgaGFzIHByb2JhYmx5IGFscmVhZHkgYmVlbiBjcmVhdGVkOwoteW91IGdldCBhIGhhbGYtZm9ybWVkIHN5bWJvbCBpbiB5b3VyIG9iamVjdCBmaWxlLiAgVGhpcyBpcwotY29tcGF0aWJsZSB3aXRoIGVhcmxpZXIgYXNzZW1ibGVycyEKLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle3N0YWJkfSBkaXJlY3RpdmUKLUBpdGVtIC5zdGFiZCBAdmFye3R5cGV9ICwgQHZhcntvdGhlcn0gLCBAdmFye2Rlc2N9Ci0KLVRoZSBgYG5hbWUnJyBvZiB0aGUgc3ltYm9sIGdlbmVyYXRlZCBpcyBub3QgZXZlbiBhbiBlbXB0eSBzdHJpbmcuCi1JdCBpcyBhIG51bGwgcG9pbnRlciwgZm9yIGNvbXBhdGliaWxpdHkuICBPbGRlciBhc3NlbWJsZXJzIHVzZWQgYQotbnVsbCBwb2ludGVyIHNvIHRoZXkgZGlkbid0IHdhc3RlIHNwYWNlIGluIG9iamVjdCBmaWxlcyB3aXRoIGVtcHR5Ci1zdHJpbmdzLgotCi1UaGUgc3ltYm9sJ3MgdmFsdWUgaXMgc2V0IHRvIHRoZSBsb2NhdGlvbiBjb3VudGVyLAotcmVsb2NhdGFibHkuICBXaGVuIHlvdXIgcHJvZ3JhbSBpcyBsaW5rZWQsIHRoZSB2YWx1ZSBvZiB0aGlzIHN5bWJvbAotaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIgd2hlbiB0aGUgQGNvZGV7LnN0YWJkfSB3YXMKLWFzc2VtYmxlZC4KLQotQGNpbmRleCBAY29kZXtzdGFibn0gZGlyZWN0aXZlCi1AaXRlbSAuc3RhYm4gQHZhcnt0eXBlfSAsIEB2YXJ7b3RoZXJ9ICwgQHZhcntkZXNjfSAsIEB2YXJ7dmFsdWV9Ci1UaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGlzIHNldCB0byB0aGUgZW1wdHkgc3RyaW5nIEBjb2RleyIifS4KLQotQGNpbmRleCBAY29kZXtzdGFic30gZGlyZWN0aXZlCi1AaXRlbSAuc3RhYnMgQHZhcntzdHJpbmd9ICwgIEB2YXJ7dHlwZX0gLCBAdmFye290aGVyfSAsIEB2YXJ7ZGVzY30gLCBAdmFye3ZhbHVlfQotQWxsIGZpdmUgZmllbGRzIGFyZSBzcGVjaWZpZWQuCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci1AYyBlbmQgICAgIGhhdmUtc3RhYnMKLQotQG5vZGUgU3RyaW5nCi1Ac2VjdGlvbiBAY29kZXsuc3RyaW5nfSAiQHZhcntzdHJ9IgotCi1AY2luZGV4IHN0cmluZywgY29weWluZyB0byBvYmplY3QgZmlsZQotQGNpbmRleCBAY29kZXtzdHJpbmd9IGRpcmVjdGl2ZQotCi1Db3B5IHRoZSBjaGFyYWN0ZXJzIGluIEB2YXJ7c3RyfSB0byB0aGUgb2JqZWN0IGZpbGUuICBZb3UgbWF5IHNwZWNpZnkgbW9yZSB0aGFuCi1vbmUgc3RyaW5nIHRvIGNvcHksIHNlcGFyYXRlZCBieSBjb21tYXMuICBVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCBmb3IgYQotcGFydGljdWxhciBtYWNoaW5lLCB0aGUgYXNzZW1ibGVyIG1hcmtzIHRoZSBlbmQgb2YgZWFjaCBzdHJpbmcgd2l0aCBhIDAgYnl0ZS4KLVlvdSBjYW4gdXNlIGFueSBvZiB0aGUgZXNjYXBlIHNlcXVlbmNlcyBkZXNjcmliZWQgaW4gQHJlZntTdHJpbmdzLCxTdHJpbmdzfS4KLQotQG5vZGUgU3RydWN0Ci1Ac2VjdGlvbiBAY29kZXsuc3RydWN0IEB2YXJ7ZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7c3RydWN0fSBkaXJlY3RpdmUKLVN3aXRjaCB0byB0aGUgYWJzb2x1dGUgc2VjdGlvbiwgYW5kIHNldCB0aGUgc2VjdGlvbiBvZmZzZXQgdG8gQHZhcntleHByZXNzaW9ufSwKLXdoaWNoIG11c3QgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIFlvdSBtaWdodCB1c2UgdGhpcyBhcyBmb2xsb3dzOgotQHNtYWxsZXhhbXBsZQotICAgICAgICAuc3RydWN0IDAKLWZpZWxkMToKLSAgICAgICAgLnN0cnVjdCBmaWVsZDEgKyA0Ci1maWVsZDI6Ci0gICAgICAgIC5zdHJ1Y3QgZmllbGQyICsgNAotZmllbGQzOgotQGVuZCBzbWFsbGV4YW1wbGUKLVRoaXMgd291bGQgZGVmaW5lIHRoZSBzeW1ib2wgQGNvZGV7ZmllbGQxfSB0byBoYXZlIHRoZSB2YWx1ZSAwLCB0aGUgc3ltYm9sCi1AY29kZXtmaWVsZDJ9IHRvIGhhdmUgdGhlIHZhbHVlIDQsIGFuZCB0aGUgc3ltYm9sIEBjb2Rle2ZpZWxkM30gdG8gaGF2ZSB0aGUKLXZhbHVlIDguICBBc3NlbWJseSB3b3VsZCBiZSBsZWZ0IGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLCBhbmQgeW91IHdvdWxkIG5lZWQgdG8KLXVzZSBhIEBjb2Rley5zZWN0aW9ufSBkaXJlY3RpdmUgb2Ygc29tZSBzb3J0IHRvIGNoYW5nZSB0byBzb21lIG90aGVyIHNlY3Rpb24KLWJlZm9yZSBmdXJ0aGVyIGFzc2VtYmx5LgotCi1AaWZzZXQgRUxGCi1Abm9kZSBTeW12ZXIKLUBzZWN0aW9uIEBjb2Rley5zeW12ZXJ9Ci1AY2luZGV4IEBjb2Rle3N5bXZlcn0gZGlyZWN0aXZlCi1AY2luZGV4IHN5bWJvbCB2ZXJzaW9uaW5nCi1AY2luZGV4IHZlcnNpb25zIG9mIHN5bWJvbHMKLVVzZSB0aGUgQGNvZGV7LnN5bXZlcn0gZGlyZWN0aXZlIHRvIGJpbmQgc3ltYm9scyB0byBzcGVjaWZpYyB2ZXJzaW9uIG5vZGVzCi13aXRoaW4gYSBzb3VyY2UgZmlsZS4gIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgb24gRUxGIHBsYXRmb3JtcywgYW5kIGlzCi10eXBpY2FsbHkgdXNlZCB3aGVuIGFzc2VtYmxpbmcgZmlsZXMgdG8gYmUgbGlua2VkIGludG8gYSBzaGFyZWQgbGlicmFyeS4KLVRoZXJlIGFyZSBjYXNlcyB3aGVyZSBpdCBtYXkgbWFrZSBzZW5zZSB0byB1c2UgdGhpcyBpbiBvYmplY3RzIHRvIGJlIGJvdW5kCi1pbnRvIGFuIGFwcGxpY2F0aW9uIGl0c2VsZiBzbyBhcyB0byBvdmVycmlkZSBhIHZlcnNpb25lZCBzeW1ib2wgZnJvbSBhCi1zaGFyZWQgbGlicmFyeS4KLQotRm9yIEVMRiB0YXJnZXRzLCB0aGUgQGNvZGV7LnN5bXZlcn0gZGlyZWN0aXZlIGlzIHVzZWQgbGlrZSB0aGlzOgotQHNtYWxsZXhhbXBsZQotLnN5bXZlciBAdmFye25hbWV9LCBAdmFye25hbWUyQEBub2RlbmFtZX0KLUBlbmQgc21hbGxleGFtcGxlCi1JbiB0aGlzIGNhc2UsIHRoZSBzeW1ib2wgQHZhcntuYW1lfSBtdXN0IGV4aXN0IGFuZCBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgZmlsZQotYmVpbmcgYXNzZW1ibGVkLiAgVGhlIEBjb2Rley52ZXJzeW19IGRpcmVjdGl2ZSBlZmZlY3RpdmVseSBjcmVhdGVzIGEgc3ltYm9sCi1hbGlhcyB3aXRoIHRoZSBuYW1lIEB2YXJ7bmFtZTJAQG5vZGVuYW1lfSwgYW5kIGluIGZhY3QgdGhlIG1haW4gcmVhc29uIHRoYXQgd2UKLWp1c3QgZG9uJ3QgdHJ5IGFuZCBjcmVhdGUgYSByZWd1bGFyIGFsaWFzIGlzIHRoYXQgdGhlIEB2YXJ7QEB9IGNoYXJhY3RlciBpc24ndAotcGVybWl0dGVkIGluIHN5bWJvbCBuYW1lcy4gIFRoZSBAdmFye25hbWUyfSBwYXJ0IG9mIHRoZSBuYW1lIGlzIHRoZSBhY3R1YWwgbmFtZQotb2YgdGhlIHN5bWJvbCBieSB3aGljaCBpdCB3aWxsIGJlIGV4dGVybmFsbHkgcmVmZXJlbmNlZC4gIFRoZSBuYW1lIEB2YXJ7bmFtZX0KLWl0c2VsZiBpcyBtZXJlbHkgYSBuYW1lIG9mIGNvbnZlbmllbmNlIHRoYXQgaXMgdXNlZCBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvCi1oYXZlIGRlZmluaXRpb25zIGZvciBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBhIGZ1bmN0aW9uIHdpdGhpbiBhIHNpbmdsZSBzb3VyY2UKLWZpbGUsIGFuZCBzbyB0aGF0IHRoZSBjb21waWxlciBjYW4gdW5hbWJpZ3VvdXNseSBrbm93IHdoaWNoIHZlcnNpb24gb2YgYQotZnVuY3Rpb24gaXMgYmVpbmcgbWVudGlvbmVkLiAgVGhlIEB2YXJ7bm9kZW5hbWV9IHBvcnRpb24gb2YgdGhlIGFsaWFzIHNob3VsZCBiZQotdGhlIG5hbWUgb2YgYSBub2RlIHNwZWNpZmllZCBpbiB0aGUgdmVyc2lvbiBzY3JpcHQgc3VwcGxpZWQgdG8gdGhlIGxpbmtlciB3aGVuCi1idWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgSWYgeW91IGFyZSBhdHRlbXB0aW5nIHRvIG92ZXJyaWRlIGEgdmVyc2lvbmVkCi1zeW1ib2wgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIEB2YXJ7bm9kZW5hbWV9IHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZQotbm9kZW5hbWUgb2YgdGhlIHN5bWJvbCB5b3UgYXJlIHRyeWluZyB0byBvdmVycmlkZS4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IENPRkYKLUBub2RlIFRhZwotQHNlY3Rpb24gQGNvZGV7LnRhZyBAdmFye3N0cnVjdG5hbWV9fQotCi1AY2luZGV4IENPRkYgc3RydWN0dXJlIGRlYnVnZ2luZwotQGNpbmRleCBzdHJ1Y3R1cmUgZGVidWdnaW5nLCBDT0ZGCi1AY2luZGV4IEBjb2Rle3RhZ30gZGlyZWN0aXZlCi1UaGlzIGRpcmVjdGl2ZSBpcyBnZW5lcmF0ZWQgYnkgY29tcGlsZXJzIHRvIGluY2x1ZGUgYXV4aWxpYXJ5IGRlYnVnZ2luZwotaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEl0IGlzIG9ubHkgcGVybWl0dGVkIGluc2lkZQotQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlycy4gIFRhZ3MgYXJlIHVzZWQgdG8gbGluayBzdHJ1Y3R1cmUKLWRlZmluaXRpb25zIGluIHRoZSBzeW1ib2wgdGFibGUgd2l0aCBpbnN0YW5jZXMgb2YgdGhvc2Ugc3RydWN0dXJlcy4KLUBpZnNldCBCT1VUCi0KLUBzYW1wey50YWd9IGlzIG9ubHkgdXNlZCB3aGVuIGdlbmVyYXRpbmcgQ09GRiBmb3JtYXQgb3V0cHV0OyB3aGVuCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBnZW5lcmF0aW5nIEBjb2Rle2Iub3V0fSwgaXQgYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSBidXQKLWlnbm9yZXMgaXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIFRleHQKLUBzZWN0aW9uIEBjb2Rley50ZXh0IEB2YXJ7c3Vic2VjdGlvbn19Ci0KLUBjaW5kZXggQGNvZGV7dGV4dH0gZGlyZWN0aXZlCi1UZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0byBhc3NlbWJsZSB0aGUgZm9sbG93aW5nIHN0YXRlbWVudHMgb250byB0aGUgZW5kIG9mCi10aGUgdGV4dCBzdWJzZWN0aW9uIG51bWJlcmVkIEB2YXJ7c3Vic2VjdGlvbn0sIHdoaWNoIGlzIGFuIGFic29sdXRlCi1leHByZXNzaW9uLiAgSWYgQHZhcntzdWJzZWN0aW9ufSBpcyBvbWl0dGVkLCBzdWJzZWN0aW9uIG51bWJlciB6ZXJvCi1pcyB1c2VkLgotCi1Abm9kZSBUaXRsZQotQHNlY3Rpb24gQGNvZGV7LnRpdGxlICJAdmFye2hlYWRpbmd9In0KLQotQGNpbmRleCBAY29kZXt0aXRsZX0gZGlyZWN0aXZlCi1AY2luZGV4IGxpc3RpbmcgY29udHJvbDogdGl0bGUgbGluZQotVXNlIEB2YXJ7aGVhZGluZ30gYXMgdGhlIHRpdGxlIChzZWNvbmQgbGluZSwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCi1zb3VyY2UgZmlsZSBuYW1lIGFuZCBwYWdlbnVtYmVyKSB3aGVuIGdlbmVyYXRpbmcgYXNzZW1ibHkgbGlzdGluZ3MuCi0KLVRoaXMgZGlyZWN0aXZlIGFmZmVjdHMgc3Vic2VxdWVudCBwYWdlcywgYXMgd2VsbCBhcyB0aGUgY3VycmVudCBwYWdlIGlmCi1pdCBhcHBlYXJzIHdpdGhpbiB0ZW4gbGluZXMgb2YgdGhlIHRvcCBvZiBhIHBhZ2UuCi0KLUBpZnNldCBDT0ZGCi1Abm9kZSBUeXBlCi1Ac2VjdGlvbiBAY29kZXsudHlwZSBAdmFye2ludH19Ci0KLUBjaW5kZXggQ09GRiBzeW1ib2wgdHlwZQotQGNpbmRleCBzeW1ib2wgdHlwZSwgQ09GRgotQGNpbmRleCBAY29kZXt0eXBlfSBkaXJlY3RpdmUKLVRoaXMgZGlyZWN0aXZlLCBwZXJtaXR0ZWQgb25seSB3aXRoaW4gQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlycywKLXJlY29yZHMgdGhlIGludGVnZXIgQHZhcntpbnR9IGFzIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KLUBpZnNldCBCT1VUCi0KLUBzYW1wey50eXBlfSBpcyBhc3NvY2lhdGVkIG9ubHkgd2l0aCBDT0ZGIGZvcm1hdCBvdXRwdXQ7IHdoZW4KLUBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgZm9yIEBjb2Rle2Iub3V0fSBvdXRwdXQsIGl0IGFjY2VwdHMgdGhpcwotZGlyZWN0aXZlIGJ1dCBpZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1AaWZzZXQgQ09GRgotQG5vZGUgVmFsCi1Ac2VjdGlvbiBAY29kZXsudmFsIEB2YXJ7YWRkcn19Ci0KLUBjaW5kZXggQGNvZGV7dmFsfSBkaXJlY3RpdmUKLUBjaW5kZXggQ09GRiB2YWx1ZSBhdHRyaWJ1dGUKLUBjaW5kZXggdmFsdWUgYXR0cmlidXRlLCBDT0ZGCi1UaGlzIGRpcmVjdGl2ZSwgcGVybWl0dGVkIG9ubHkgd2l0aGluIEBjb2Rley5kZWZ9L0Bjb2Rley5lbmRlZn0gcGFpcnMsCi1yZWNvcmRzIHRoZSBhZGRyZXNzIEB2YXJ7YWRkcn0gYXMgdGhlIHZhbHVlIGF0dHJpYnV0ZSBvZiBhIHN5bWJvbCB0YWJsZQotZW50cnkuCi1AaWZzZXQgQk9VVAotCi1Ac2FtcHsudmFsfSBpcyB1c2VkIG9ubHkgZm9yIENPRkYgb3V0cHV0OyB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzCi1jb25maWd1cmVkIGZvciBAY29kZXtiLm91dH0sIGl0IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUgYnV0IGlnbm9yZXMgaXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIFVsZWIxMjgKLUBzZWN0aW9uIEBjb2Rley51bGViMTI4IEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle3VsZWIxMjh9IGRpcmVjdGl2ZQotQHZhcnt1bGViMTI4fSBzdGFuZHMgZm9yIGBgdW5zaWduZWQgbGl0dGxlIGVuZGlhbiBiYXNlIDEyOC4nJyAgVGhpcyBpcyBhIAotY29tcGFjdCwgdmFyaWFibGUgbGVuZ3RoIHJlcHJlc2VudGF0aW9uIG9mIG51bWJlcnMgdXNlZCBieSB0aGUgRFdBUkYKLXN5bWJvbGljIGRlYnVnZ2luZyBmb3JtYXQuICBAeHJlZntTbGViMTI4LEBjb2Rley5zbGViMTI4fX0uCi0KLUBub2RlIFdvcmQKLUBzZWN0aW9uIEBjb2Rley53b3JkIEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle3dvcmR9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgQHZhcntleHByZXNzaW9uc30sIG9mIGFueSBzZWN0aW9uLAotc2VwYXJhdGVkIGJ5IGNvbW1hcy4KLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBXMzIKLUZvciBlYWNoIGV4cHJlc3Npb24sIEBjb2Rle0B2YWx1ZXtBU319IGVtaXRzIGEgMzItYml0IG51bWJlci4KLUBlbmQgaWZzZXQKLUBpZnNldCBXMTYKLUZvciBlYWNoIGV4cHJlc3Npb24sIEBjb2Rle0B2YWx1ZXtBU319IGVtaXRzIGEgMTYtYml0IG51bWJlci4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotQGlmc2V0IEdFTkVSSUMKLQotVGhlIHNpemUgb2YgdGhlIG51bWJlciBlbWl0dGVkLCBhbmQgaXRzIGJ5dGUgb3JkZXIsCi1kZXBlbmQgb24gd2hhdCB0YXJnZXQgY29tcHV0ZXIgdGhlIGFzc2VtYmx5IGlzIGZvci4KLUBlbmQgaWZzZXQKLQotQGMgb24gYW1kMjlrLCBpOTYwLCBzcGFyYyB0aGUgInNwZWNpYWwgdHJlYXRtZW50IHRvIHN1cHBvcnQgY29tcGlsZXJzIiBkb2Vzbid0Ci1AYyBoYXBwZW4tLS0zMi1iaXQgYWRkcmVzc2FiaWxpdHksIHBlcmlvZDsgbm8gbG9uZy9zaG9ydCBqdW1wcy4KLUBpZnNldCBESUZGLVRCTC1LTFVHRQotQGNpbmRleCBkaWZmZXJlbmNlIHRhYmxlcyBhbHRlcmVkCi1AY2luZGV4IGFsdGVyZWQgZGlmZmVyZW5jZSB0YWJsZXMKLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6IFNwZWNpYWwgVHJlYXRtZW50IHRvIHN1cHBvcnQgQ29tcGlsZXJzfQotQGVuZCBxdW90YXRpb24KLQotQGlmc2V0IEdFTkVSSUMKLU1hY2hpbmVzIHdpdGggYSAzMi1iaXQgYWRkcmVzcyBzcGFjZSwgYnV0IHRoYXQgZG8gbGVzcyB0aGFuIDMyLWJpdAotYWRkcmVzc2luZywgcmVxdWlyZSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgdHJlYXRtZW50LiAgSWYgdGhlIG1hY2hpbmUgb2YKLWludGVyZXN0IHRvIHlvdSBkb2VzIDMyLWJpdCBhZGRyZXNzaW5nIChvciBkb2Vzbid0IHJlcXVpcmUgaXQ7Ci1AcHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9KSwgeW91IGNhbiBpZ25vcmUgdGhpcyBpc3N1ZS4KLQotQGVuZCBpZnNldAotSW4gb3JkZXIgdG8gYXNzZW1ibGUgY29tcGlsZXIgb3V0cHV0IGludG8gc29tZXRoaW5nIHRoYXQgd29ya3MsCi1AY29kZXtAdmFsdWV7QVN9fSBvY2Nhc2lvbmxseSBkb2VzIHN0cmFuZ2UgdGhpbmdzIHRvIEBzYW1wey53b3JkfSBkaXJlY3RpdmVzLgotRGlyZWN0aXZlcyBvZiB0aGUgZm9ybSBAc2FtcHsud29yZCBzeW0xLXN5bTJ9IGFyZSBvZnRlbiBlbWl0dGVkIGJ5Ci1jb21waWxlcnMgYXMgcGFydCBvZiBqdW1wIHRhYmxlcy4gIFRoZXJlZm9yZSwgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBhc3NlbWJsZXMgYQotZGlyZWN0aXZlIG9mIHRoZSBmb3JtIEBzYW1wey53b3JkIHN5bTEtc3ltMn0sIGFuZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi1AY29kZXtzeW0xfSBhbmQgQGNvZGV7c3ltMn0gZG9lcyBub3QgZml0IGluIDE2IGJpdHMsIEBjb2Rle0B2YWx1ZXtBU319Ci1jcmVhdGVzIGEgQGRmbntzZWNvbmRhcnkganVtcCB0YWJsZX0sIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgbmV4dCBsYWJlbC4KLVRoaXMgc2Vjb25kYXJ5IGp1bXAgdGFibGUgaXMgcHJlY2VkZWQgYnkgYSBzaG9ydC1qdW1wIHRvIHRoZQotZmlyc3QgYnl0ZSBhZnRlciB0aGUgc2Vjb25kYXJ5IHRhYmxlLiAgVGhpcyBzaG9ydC1qdW1wIHByZXZlbnRzIHRoZSBmbG93Ci1vZiBjb250cm9sIGZyb20gYWNjaWRlbnRhbGx5IGZhbGxpbmcgaW50byB0aGUgbmV3IHRhYmxlLiAgSW5zaWRlIHRoZQotdGFibGUgaXMgYSBsb25nLWp1bXAgdG8gQGNvZGV7c3ltMn0uICBUaGUgb3JpZ2luYWwgQHNhbXB7LndvcmR9Ci1jb250YWlucyBAY29kZXtzeW0xfSBtaW51cyB0aGUgYWRkcmVzcyBvZiB0aGUgbG9uZy1qdW1wIHRvCi1AY29kZXtzeW0yfS4KLQotSWYgdGhlcmUgd2VyZSBzZXZlcmFsIG9jY3VycmVuY2VzIG9mIEBzYW1wey53b3JkIHN5bTEtc3ltMn0gYmVmb3JlIHRoZQotc2Vjb25kYXJ5IGp1bXAgdGFibGUsIGFsbCBvZiB0aGVtIGFyZSBhZGp1c3RlZC4gIElmIHRoZXJlIHdhcyBhCi1Ac2FtcHsud29yZCBzeW0zLXN5bTR9LCB0aGF0IGFsc28gZGlkIG5vdCBmaXQgaW4gc2l4dGVlbiBiaXRzLCBhCi1sb25nLWp1bXAgdG8gQGNvZGV7c3ltNH0gaXMgaW5jbHVkZWQgaW4gdGhlIHNlY29uZGFyeSBqdW1wIHRhYmxlLAotYW5kIHRoZSBAY29kZXsud29yZH0gZGlyZWN0aXZlcyBhcmUgYWRqdXN0ZWQgdG8gY29udGFpbiBAY29kZXtzeW0zfQotbWludXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGxvbmctanVtcCB0byBAY29kZXtzeW00fTsgYW5kIHNvIG9uLCBmb3IgYXMgbWFueQotZW50cmllcyBpbiB0aGUgb3JpZ2luYWwganVtcCB0YWJsZSBhcyBuZWNlc3NhcnkuCi0KLUBpZnNldCBJTlRFUk5BTFMKLUBlbXBoe1RoaXMgZmVhdHVyZSBtYXkgYmUgZGlzYWJsZWQgYnkgY29tcGlsaW5nIEBjb2Rle0B2YWx1ZXtBU319IHdpdGggdGhlCi1Ac2FtcHstRFdPUktJTkdfRE9UX1dPUkR9IG9wdGlvbi59IFRoaXMgZmVhdHVyZSBpcyBsaWtlbHkgdG8gY29uZnVzZQotYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbW1lcnMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci1AYyBlbmQgICAgIERJRkYtVEJMLUtMVUdFCi0KLUBub2RlIERlcHJlY2F0ZWQKLUBzZWN0aW9uIERlcHJlY2F0ZWQgRGlyZWN0aXZlcwotCi1AY2luZGV4IGRlcHJlY2F0ZWQgZGlyZWN0aXZlcwotQGNpbmRleCBvYnNvbGVzY2VudCBkaXJlY3RpdmVzCi1PbmUgZGF5IHRoZXNlIGRpcmVjdGl2ZXMgd29uJ3Qgd29yay4KLVRoZXkgYXJlIGluY2x1ZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgYXNzZW1ibGVycy4KLUB0YWJsZSBAdAotQGl0ZW0gLmFib3J0Ci1AaXRlbSAubGluZQotQGVuZCB0YWJsZQotCi1AaWZzZXQgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIE1hY2hpbmUgRGVwZW5kZW50IEZlYXR1cmVzCi0KLUBjaW5kZXggbWFjaGluZSBkZXBlbmRlbmNpZXMKLVRoZSBtYWNoaW5lIGluc3RydWN0aW9uIHNldHMgYXJlIChhbG1vc3QgYnkgZGVmaW5pdGlvbikgZGlmZmVyZW50IG9uCi1lYWNoIG1hY2hpbmUgd2hlcmUgQGNvZGV7QHZhbHVle0FTfX0gcnVucy4gIEZsb2F0aW5nIHBvaW50IHJlcHJlc2VudGF0aW9ucwotdmFyeSBhcyB3ZWxsLCBhbmQgQGNvZGV7QHZhbHVle0FTfX0gb2Z0ZW4gc3VwcG9ydHMgYSBmZXcgYWRkaXRpb25hbAotZGlyZWN0aXZlcyBvciBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyCi1hc3NlbWJsZXJzIG9uIGEgcGFydGljdWxhciBwbGF0Zm9ybS4gIEZpbmFsbHksIHNvbWUgdmVyc2lvbnMgb2YKLUBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnQgc3BlY2lhbCBwc2V1ZG8taW5zdHJ1Y3Rpb25zIGZvciBicmFuY2gKLW9wdGltaXphdGlvbi4KLQotVGhpcyBjaGFwdGVyIGRpc2N1c3NlcyBtb3N0IG9mIHRoZXNlIGRpZmZlcmVuY2VzLCB0aG91Z2ggaXQgZG9lcyBub3QKLWluY2x1ZGUgZGV0YWlscyBvbiBhbnkgbWFjaGluZSdzIGluc3RydWN0aW9uIHNldC4gIEZvciBkZXRhaWxzIG9uIHRoYXQKLXN1YmplY3QsIHNlZSB0aGUgaGFyZHdhcmUgbWFudWZhY3R1cmVyJ3MgbWFudWFsLgotCi1AbWVudQotQGlmc2V0IEEyOUsKLSogQU1EMjlLLURlcGVuZGVudDo6ICAgICAgICAgICAgQU1EIDI5SyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBBUkMKLSogQVJDLURlcGVuZGVudDo6ICAgICAgICAgICAgICAgQVJDIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEFSTQotKiBBUk0tRGVwZW5kZW50OjogICAgICAgICAgICAgICBBUk0gRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgRDEwVgotKiBEMTBWLURlcGVuZGVudDo6ICAgICAgICAgICAgICBEMTBWIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEQzMFYKLSogRDMwVi1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgRDMwViBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBIOC8zMDAKLSogSDgvMzAwLURlcGVuZGVudDo6ICAgICAgICAgICAgSGl0YWNoaSBIOC8zMDAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgvNTAwCi0qIEg4LzUwMC1EZXBlbmRlbnQ6OiAgICAgICAgICAgIEhpdGFjaGkgSDgvNTAwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLSogSFBQQS1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgSFBQQSBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBJODAzODYKLSogaTM4Ni1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgSW50ZWwgODAzODYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSTk2MAotKiBpOTYwLURlcGVuZGVudDo6ICAgICAgICAgICAgICBJbnRlbCA4MDk2MCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBNNjgwWDAKLSogTTY4Sy1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgTTY4MHgwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IE1JUFMKLSogTUlQUy1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgTUlQUyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBTSAotKiBTSC1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgICBIaXRhY2hpIFNIIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IFNQQVJDCi0qIFNwYXJjLURlcGVuZGVudDo6ICAgICAgICAgICAgIFNQQVJDIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IFY4NTAKLSogVjg1MC1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgVjg1MCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBaODAwMAotKiBaODAwMC1EZXBlbmRlbnQ6OiAgICAgICAgICAgICBaODAwMCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBWQVgKLSogVmF4LURlcGVuZGVudDo6ICAgICAgICAgICAgICAgVkFYIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGVuZCBtZW51Ci0KLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmc2V0Ci0KLUBjIFRoZSBmb2xsb3dpbmcgbWFqb3Igbm9kZXMgYXJlICpzZWN0aW9ucyogaW4gdGhlIEdFTkVSSUMgdmVyc2lvbiwgKmNoYXB0ZXJzKgotQGMgaW4gc2luZ2xlLWNwdSB2ZXJzaW9ucy4gIFRoaXMgaXMgbWFpbmx5IGFjaGlldmVkIGJ5IEBsb3dlcnNlY3Rpb25zLiAgVGhlcmUgaXMgYQotQGMgcGVjdWxpYXJpdHk6IHRvIHByZXNlcnZlIGNyb3NzLXJlZmVyZW5jZXMsIHRoZXJlIG11c3QgYmUgYSBub2RlIGNhbGxlZAotQGMgIk1hY2hpbmUgRGVwZW5kZW5jaWVzIi4gIEhlbmNlIHRoZSBjb25kaXRpb25hbCBub2RlbmFtZXMgaW4gZWFjaAotQGMgbWFqb3Igbm9kZSBiZWxvdy4gIE5vZGUgZGVmYXVsdGluZyBpbiBtYWtlaW5mbyByZXF1aXJlcyBhZGphY2VuY3kgb2YKLUBjIG5vZGUgYW5kIHNlY3Rpb25pbmcgY29tbWFuZHM7IGhlbmNlIHRoZSByZXBldGl0aW9uIG9mIEBjaGFwdGVyIEJMQUgKLUBjIGluIGJvdGggY29uZGl0aW9uYWwgYmxvY2tzLgotCi1AaWZzZXQgQVJDCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIEFSQy1EZXBlbmRlbnQKLUBjaGFwdGVyIEFSQyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBBUkMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBBUkMgc3VwcG9ydAotQG1lbnUKLSogQVJDLU9wdHM6OiAgICAgICAgICAgICAgICAgICAgT3B0aW9ucwotKiBBUkMtRmxvYXQ6OiAgICAgICAgICAgICAgICAgICBGbG9hdGluZyBQb2ludAotKiBBUkMtRGlyZWN0aXZlczo6ICAgICAgICAgICAgICBTcGFyYyBNYWNoaW5lIERpcmVjdGl2ZXMKLUBlbmQgbWVudQotCi1Abm9kZSBBUkMtT3B0cwotQHNlY3Rpb24gT3B0aW9ucwotCi1AY2luZGV4IG9wdGlvbnMgZm9yIEFSQwotQGNpbmRleCBBUkMgb3B0aW9ucwotQGNpbmRleCBhcmNoaXRlY3R1cmVzLCBBUkMKLUBjaW5kZXggQVJDIGFyY2hpdGVjdHVyZXMKLVRoZSBBUkMgY2hpcCBmYW1pbHkgaW5jbHVkZXMgc2V2ZXJhbCBzdWNjZXNzaXZlIGxldmVscyAob3Igb3RoZXIKLXZhcmlhbnRzKSBvZiBjaGlwLCB1c2luZyB0aGUgc2FtZSBjb3JlIGluc3RydWN0aW9uIHNldCwgYnV0IGluY2x1ZGluZwotYSBmZXcgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgYXQgZWFjaCBsZXZlbC4KLQotQnkgZGVmYXVsdCwgQGNvZGV7QHZhbHVle0FTfX0gYXNzdW1lcyB0aGUgY29yZSBpbnN0cnVjdGlvbiBzZXQgKEFSQwotYmFzZSkuICBUaGUgQGNvZGV7LmNwdX0gcHNldWRvLW9wIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gc2VsZWN0Ci10aGUgdmFyaWFudC4KLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rley1tYmlnLWVuZGlhbn0gb3B0aW9uIChBUkMpCi1AY2luZGV4IEBjb2Rley1tbGl0dGxlLWVuZGlhbn0gb3B0aW9uIChBUkMpCi1AY2luZGV4IEFSQyBiaWctZW5kaWFuIG91dHB1dAotQGNpbmRleCBBUkMgbGl0dGxlLWVuZGlhbiBvdXRwdXQKLUBjaW5kZXggYmlnLWVuZGlhbiBvdXRwdXQsIEFSQwotQGNpbmRleCBsaXR0bGUtZW5kaWFuIG91dHB1dCwgQVJDCi1AaXRlbSAtbWJpZy1lbmRpYW4KLUBpdGVteCAtbWxpdHRsZS1lbmRpYW4KLUFueSBAc2N7YXJjfSBjb25maWd1cmF0aW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGNhbiBzZWxlY3QgYmlnLWVuZGlhbiBvcgotbGl0dGxlLWVuZGlhbiBvdXRwdXQgYXQgcnVuIHRpbWUgKHVubGlrZSBtb3N0IG90aGVyIEBzY3tnbnV9IGRldmVsb3BtZW50Ci10b29scywgd2hpY2ggbXVzdCBiZSBjb25maWd1cmVkIGZvciBvbmUgb3IgdGhlIG90aGVyKS4gIFVzZQotQHNhbXB7LW1iaWctZW5kaWFufSB0byBzZWxlY3QgYmlnLWVuZGlhbiBvdXRwdXQsIGFuZCBAc2FtcHstbWxpdHRsZS1lbmRpYW59Ci1mb3IgbGl0dGxlLWVuZGlhbi4KLUBlbmQgdGFibGUKLQotQG5vZGUgQVJDLUZsb2F0Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBBUkMgKEBzY3tpZWVlfSkKLUBjaW5kZXggQVJDIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgQVJDIGNwdSBmYW1pbHkgY3VycmVudGx5IGRvZXMgbm90IGhhdmUgaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQKLXN1cHBvcnQuICBTb2Z0d2FyZSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IGlzIHByb3ZpZGVkIGJ5IEBjb2Rle0dDQ30KLWFuZCB1c2VzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzLgotCi1Abm9kZSBBUkMtRGlyZWN0aXZlcwotQHNlY3Rpb24gQVJDIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IEFSQyBtYWNoaW5lIGRpcmVjdGl2ZXMKLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBBUkMKLVRoZSBBUkMgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwKLW1hY2hpbmUgZGlyZWN0aXZlczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAuY3B1Ci1AY2luZGV4IEBjb2Rle2NwdX0gZGlyZWN0aXZlLCBTUEFSQwotVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBkZXNpcmVkIGNwdS4KLVRoZSBBUkMgaXMgaW50ZW5kZWQgdG8gYmUgY3VzdG9taXphYmxlLCBAY29kZXsuY3B1fSBpcyB1c2VkIHRvCi1zZWxlY3QgdGhlIGRlc2lyZWQgdmFyaWFudCBbdGhvdWdoIGN1cnJlbnRseSB0aGVyZSBhcmUgbm9uZV0uCi0KLUBlbmQgdGFibGUKLQotQGVuZCBpZnNldAotCi1AaWZzZXQgQTI5SwotQGluY2x1ZGUgYy1hMjlrLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEFSTQotQGluY2x1ZGUgYy1hcm0udGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgSGl0YWNoaS1hbGwKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBNYWNoaW5lIERlcGVuZGVudCBGZWF0dXJlcwotCi1UaGUgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXRzIGFyZSBkaWZmZXJlbnQgb24gZWFjaCBIaXRhY2hpIGNoaXAgZmFtaWx5LAotYW5kIHRoZXJlIGFyZSBhbHNvIHNvbWUgc3ludGF4IGRpZmZlcmVuY2VzIGFtb25nIHRoZSBmYW1pbGllcy4gIFRoaXMKLWNoYXB0ZXIgZGVzY3JpYmVzIHRoZSBzcGVjaWZpYyBAY29kZXtAdmFsdWV7QVN9fSBmZWF0dXJlcyBmb3IgZWFjaAotZmFtaWx5LgotCi1AbWVudQotKiBIOC8zMDAtRGVwZW5kZW50OjogICAgICAgICAgICBIaXRhY2hpIEg4LzMwMCBEZXBlbmRlbnQgRmVhdHVyZXMKLSogSDgvNTAwLURlcGVuZGVudDo6ICAgICAgICAgICAgSGl0YWNoaSBIOC81MDAgRGVwZW5kZW50IEZlYXR1cmVzCi0qIFNILURlcGVuZGVudDo6ICAgICAgICAgICAgICAgIEhpdGFjaGkgU0ggRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIG1lbnUKLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEQxMFYKLUBpbmNsdWRlIGMtZDEwdi50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBEMzBWCi1AaW5jbHVkZSBjLWQzMHYudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgSDgvMzAwCi1AaW5jbHVkZSBjLWg4MzAwLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEg4LzUwMAotQGluY2x1ZGUgYy1oODUwMC50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBIUFBBCi1AaW5jbHVkZSBjLWhwcGEudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgSTgwMzg2Ci1AaW5jbHVkZSBjLWkzODYudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgSTk2MAotQGluY2x1ZGUgYy1pOTYwLnRleGkKLUBlbmQgaWZzZXQKLQotCi1AaWZzZXQgTTY4MFgwCi1AaW5jbHVkZSBjLW02OGsudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgTUlQUwotQGluY2x1ZGUgYy1taXBzLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IE5TMzJLCi1AaW5jbHVkZSBjLW5zMzJrLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IFNICi1AaW5jbHVkZSBjLXNoLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IFNQQVJDCi1AaW5jbHVkZSBjLXNwYXJjLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IFo4MDAwCi1AaW5jbHVkZSBjLXo4ay50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBWQVgKLUBpbmNsdWRlIGMtdmF4LnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IFY4NTAKLUBpbmNsdWRlIGMtdjg1MC50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBHRU5FUklDCi1AYyByZXZlcnNlIGVmZmVjdCBvZiBAZG93biBhdCB0b3Agb2YgZ2VuZXJpYyBNYWNoaW5lLURlcCBjaGFwdGVyCi1AcmFpc2VzZWN0aW9ucwotQGVuZCBpZnNldAotCi1Abm9kZSBSZXBvcnRpbmcgQnVncwotQGNoYXB0ZXIgUmVwb3J0aW5nIEJ1Z3MKLUBjaW5kZXggYnVncyBpbiBhc3NlbWJsZXIKLUBjaW5kZXggcmVwb3J0aW5nIGJ1Z3MgaW4gYXNzZW1ibGVyCi0KLVlvdXIgYnVnIHJlcG9ydHMgcGxheSBhbiBlc3NlbnRpYWwgcm9sZSBpbiBtYWtpbmcgQGNvZGV7QHZhbHVle0FTfX0gcmVsaWFibGUuCi0KLVJlcG9ydGluZyBhIGJ1ZyBtYXkgaGVscCB5b3UgYnkgYnJpbmdpbmcgYSBzb2x1dGlvbiB0byB5b3VyIHByb2JsZW0sIG9yIGl0IG1heQotbm90LiAgQnV0IGluIGFueSBjYXNlIHRoZSBwcmluY2lwYWwgZnVuY3Rpb24gb2YgYSBidWcgcmVwb3J0IGlzIHRvIGhlbHAgdGhlCi1lbnRpcmUgY29tbXVuaXR5IGJ5IG1ha2luZyB0aGUgbmV4dCB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IHdvcmsgYmV0dGVyLgotQnVnIHJlcG9ydHMgYXJlIHlvdXIgY29udHJpYnV0aW9uIHRvIHRoZSBtYWludGVuYW5jZSBvZiBAY29kZXtAdmFsdWV7QVN9fS4KLQotSW4gb3JkZXIgZm9yIGEgYnVnIHJlcG9ydCB0byBzZXJ2ZSBpdHMgcHVycG9zZSwgeW91IG11c3QgaW5jbHVkZSB0aGUKLWluZm9ybWF0aW9uIHRoYXQgZW5hYmxlcyB1cyB0byBmaXggdGhlIGJ1Zy4KLQotQG1lbnUKLSogQnVnIENyaXRlcmlhOjogICAgICAgICAgICAgICAgSGF2ZSB5b3UgZm91bmQgYSBidWc/Ci0qIEJ1ZyBSZXBvcnRpbmc6OiAgICAgICAgICAgICAgIEhvdyB0byByZXBvcnQgYnVncwotQGVuZCBtZW51Ci0KLUBub2RlIEJ1ZyBDcml0ZXJpYQotQHNlY3Rpb24gSGF2ZSB5b3UgZm91bmQgYSBidWc/Ci1AY2luZGV4IGJ1ZyBjcml0ZXJpYQotCi1JZiB5b3UgYXJlIG5vdCBzdXJlIHdoZXRoZXIgeW91IGhhdmUgZm91bmQgYSBidWcsIGhlcmUgYXJlIHNvbWUgZ3VpZGVsaW5lczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGNpbmRleCBmYXRhbCBzaWduYWwKLUBjaW5kZXggYXNzZW1ibGVyIGNyYXNoCi1AY2luZGV4IGNyYXNoIG9mIGFzc2VtYmxlcgotQGl0ZW0KLUlmIHRoZSBhc3NlbWJsZXIgZ2V0cyBhIGZhdGFsIHNpZ25hbCwgZm9yIGFueSBpbnB1dCB3aGF0ZXZlciwgdGhhdCBpcyBhCi1AY29kZXtAdmFsdWV7QVN9fSBidWcuICBSZWxpYWJsZSBhc3NlbWJsZXJzIG5ldmVyIGNyYXNoLgotCi1AY2luZGV4IGVycm9yIG9uIHZhbGlkIGlucHV0Ci1AaXRlbQotSWYgQGNvZGV7QHZhbHVle0FTfX0gcHJvZHVjZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdmFsaWQgaW5wdXQsIHRoYXQgaXMgYSBidWcuCi0KLUBjaW5kZXggaW52YWxpZCBpbnB1dAotQGl0ZW0KLUlmIEBjb2Rle0B2YWx1ZXtBU319IGRvZXMgbm90IHByb2R1Y2UgYW4gZXJyb3IgbWVzc2FnZSBmb3IgaW52YWxpZCBpbnB1dCwgdGhhdAotaXMgYSBidWcuICBIb3dldmVyLCB5b3Ugc2hvdWxkIG5vdGUgdGhhdCB5b3VyIGlkZWEgb2YgYGBpbnZhbGlkIGlucHV0JycgbWlnaHQKLWJlIG91ciBpZGVhIG9mIGBgYW4gZXh0ZW5zaW9uJycgb3IgYGBzdXBwb3J0IGZvciB0cmFkaXRpb25hbCBwcmFjdGljZScnLgotCi1AaXRlbQotSWYgeW91IGFyZSBhbiBleHBlcmllbmNlZCB1c2VyIG9mIGFzc2VtYmxlcnMsIHlvdXIgc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50Ci1vZiBAY29kZXtAdmFsdWV7QVN9fSBhcmUgd2VsY29tZSBpbiBhbnkgY2FzZS4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBCdWcgUmVwb3J0aW5nCi1Ac2VjdGlvbiBIb3cgdG8gcmVwb3J0IGJ1Z3MKLUBjaW5kZXggYnVnIHJlcG9ydHMKLUBjaW5kZXggYXNzZW1ibGVyIGJ1Z3MsIHJlcG9ydGluZwotCi1BIG51bWJlciBvZiBjb21wYW5pZXMgYW5kIGluZGl2aWR1YWxzIG9mZmVyIHN1cHBvcnQgZm9yIEBzY3tnbnV9IHByb2R1Y3RzLiAgSWYKLXlvdSBvYnRhaW5lZCBAY29kZXtAdmFsdWV7QVN9fSBmcm9tIGEgc3VwcG9ydCBvcmdhbml6YXRpb24sIHdlIHJlY29tbWVuZCB5b3UKLWNvbnRhY3QgdGhhdCBvcmdhbml6YXRpb24gZmlyc3QuCi0KLVlvdSBjYW4gZmluZCBjb250YWN0IGluZm9ybWF0aW9uIGZvciBtYW55IHN1cHBvcnQgY29tcGFuaWVzIGFuZAotaW5kaXZpZHVhbHMgaW4gdGhlIGZpbGUgQGZpbGV7ZXRjL1NFUlZJQ0V9IGluIHRoZSBAc2N7Z251fSBFbWFjcwotZGlzdHJpYnV0aW9uLgotCi1JbiBhbnkgZXZlbnQsIHdlIGFsc28gcmVjb21tZW5kIHRoYXQgeW91IHNlbmQgYnVnIHJlcG9ydHMgZm9yIEBjb2Rle0B2YWx1ZXtBU319Ci10byBAc2FtcHtidWctZ251LXV0aWxzQEBnbnUub3JnfS4KLQotVGhlIGZ1bmRhbWVudGFsIHByaW5jaXBsZSBvZiByZXBvcnRpbmcgYnVncyB1c2VmdWxseSBpcyB0aGlzOgotQHN0cm9uZ3tyZXBvcnQgYWxsIHRoZSBmYWN0c30uICBJZiB5b3UgYXJlIG5vdCBzdXJlIHdoZXRoZXIgdG8gc3RhdGUgYQotZmFjdCBvciBsZWF2ZSBpdCBvdXQsIHN0YXRlIGl0IQotCi1PZnRlbiBwZW9wbGUgb21pdCBmYWN0cyBiZWNhdXNlIHRoZXkgdGhpbmsgdGhleSBrbm93IHdoYXQgY2F1c2VzIHRoZSBwcm9ibGVtCi1hbmQgYXNzdW1lIHRoYXQgc29tZSBkZXRhaWxzIGRvIG5vdCBtYXR0ZXIuICBUaHVzLCB5b3UgbWlnaHQgYXNzdW1lIHRoYXQgdGhlCi1uYW1lIG9mIGEgc3ltYm9sIHlvdSB1c2UgaW4gYW4gZXhhbXBsZSBkb2VzIG5vdCBtYXR0ZXIuICBXZWxsLCBwcm9iYWJseSBpdCBkb2VzCi1ub3QsIGJ1dCBvbmUgY2Fubm90IGJlIHN1cmUuICBQZXJoYXBzIHRoZSBidWcgaXMgYSBzdHJheSBtZW1vcnkgcmVmZXJlbmNlIHdoaWNoCi1oYXBwZW5zIHRvIGZldGNoIGZyb20gdGhlIGxvY2F0aW9uIHdoZXJlIHRoYXQgbmFtZSBpcyBzdG9yZWQgaW4gbWVtb3J5OwotcGVyaGFwcywgaWYgdGhlIG5hbWUgd2VyZSBkaWZmZXJlbnQsIHRoZSBjb250ZW50cyBvZiB0aGF0IGxvY2F0aW9uIHdvdWxkIGZvb2wKLXRoZSBhc3NlbWJsZXIgaW50byBkb2luZyB0aGUgcmlnaHQgdGhpbmcgZGVzcGl0ZSB0aGUgYnVnLiAgUGxheSBpdCBzYWZlIGFuZAotZ2l2ZSBhIHNwZWNpZmljLCBjb21wbGV0ZSBleGFtcGxlLiAgVGhhdCBpcyB0aGUgZWFzaWVzdCB0aGluZyBmb3IgeW91IHRvIGRvLAotYW5kIHRoZSBtb3N0IGhlbHBmdWwuCi0KLUtlZXAgaW4gbWluZCB0aGF0IHRoZSBwdXJwb3NlIG9mIGEgYnVnIHJlcG9ydCBpcyB0byBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcgaWYKLWl0IGlzIG5ldyB0byB1cy4gIFRoZXJlZm9yZSwgYWx3YXlzIHdyaXRlIHlvdXIgYnVnIHJlcG9ydHMgb24gdGhlIGFzc3VtcHRpb24KLXRoYXQgdGhlIGJ1ZyBoYXMgbm90IGJlZW4gcmVwb3J0ZWQgcHJldmlvdXNseS4KLQotU29tZXRpbWVzIHBlb3BsZSBnaXZlIGEgZmV3IHNrZXRjaHkgZmFjdHMgYW5kIGFzaywgYGBEb2VzIHRoaXMgcmluZyBhCi1iZWxsPycnICBUaG9zZSBidWcgcmVwb3J0cyBhcmUgdXNlbGVzcywgYW5kIHdlIHVyZ2UgZXZlcnlvbmUgdG8KLUBlbXBoe3JlZnVzZSB0byByZXNwb25kIHRvIHRoZW19IGV4Y2VwdCB0byBjaGlkZSB0aGUgc2VuZGVyIHRvIHJlcG9ydAotYnVncyBwcm9wZXJseS4KLQotVG8gZW5hYmxlIHVzIHRvIGZpeCB0aGUgYnVnLCB5b3Ugc2hvdWxkIGluY2x1ZGUgYWxsIHRoZXNlIHRoaW5nczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319LiAgQGNvZGV7QHZhbHVle0FTfX0gYW5ub3VuY2VzIGl0IGlmIHlvdSBzdGFydAotaXQgd2l0aCB0aGUgQHNhbXB7LS12ZXJzaW9ufSBhcmd1bWVudC4KLQotV2l0aG91dCB0aGlzLCB3ZSB3aWxsIG5vdCBrbm93IHdoZXRoZXIgdGhlcmUgaXMgYW55IHBvaW50IGluIGxvb2tpbmcgZm9yCi10aGUgYnVnIGluIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0uCi0KLUBpdGVtCi1BbnkgcGF0Y2hlcyB5b3UgbWF5IGhhdmUgYXBwbGllZCB0byB0aGUgQGNvZGV7QHZhbHVle0FTfX0gc291cmNlLgotCi1AaXRlbQotVGhlIHR5cGUgb2YgbWFjaGluZSB5b3UgYXJlIHVzaW5nLCBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gbmFtZSBhbmQKLXZlcnNpb24gbnVtYmVyLgotCi1AaXRlbQotV2hhdCBjb21waWxlciAoYW5kIGl0cyB2ZXJzaW9uKSB3YXMgdXNlZCB0byBjb21waWxlIEBjb2Rle0B2YWx1ZXtBU319LS0tZS5nLgotYGBAY29kZXtnY2MtMi43fScnLgotCi1AaXRlbQotVGhlIGNvbW1hbmQgYXJndW1lbnRzIHlvdSBnYXZlIHRoZSBhc3NlbWJsZXIgdG8gYXNzZW1ibGUgeW91ciBleGFtcGxlIGFuZAotb2JzZXJ2ZSB0aGUgYnVnLiAgVG8gZ3VhcmFudGVlIHlvdSB3aWxsIG5vdCBvbWl0IHNvbWV0aGluZyBpbXBvcnRhbnQsIGxpc3QgdGhlbQotYWxsLiAgQSBjb3B5IG9mIHRoZSBNYWtlZmlsZSAob3IgdGhlIG91dHB1dCBmcm9tIG1ha2UpIGlzIHN1ZmZpY2llbnQuCi0KLUlmIHdlIHdlcmUgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBhcmd1bWVudHMsIHdlIHdvdWxkIHByb2JhYmx5IGd1ZXNzIHdyb25nCi1hbmQgdGhlbiB3ZSBtaWdodCBub3QgZW5jb3VudGVyIHRoZSBidWcuCi0KLUBpdGVtCi1BIGNvbXBsZXRlIGlucHV0IGZpbGUgdGhhdCB3aWxsIHJlcHJvZHVjZSB0aGUgYnVnLiAgSWYgdGhlIGJ1ZyBpcyBvYnNlcnZlZCB3aGVuCi10aGUgYXNzZW1ibGVyIGlzIGludm9rZWQgdmlhIGEgY29tcGlsZXIsIHNlbmQgdGhlIGFzc2VtYmxlciBzb3VyY2UsIG5vdCB0aGUKLWhpZ2ggbGV2ZWwgbGFuZ3VhZ2Ugc291cmNlLiAgTW9zdCBjb21waWxlcnMgd2lsbCBwcm9kdWNlIHRoZSBhc3NlbWJsZXIgc291cmNlCi13aGVuIHJ1biB3aXRoIHRoZSBAc2FtcHstU30gb3B0aW9uLiAgSWYgeW91IGFyZSB1c2luZyBAY29kZXtAdmFsdWV7R0NDfX0sIHVzZQotdGhlIG9wdGlvbnMgQHNhbXB7LXYgLS1zYXZlLXRlbXBzfTsgdGhpcyB3aWxsIHNhdmUgdGhlIGFzc2VtYmxlciBzb3VyY2UgaW4gYQotZmlsZSB3aXRoIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsuc30sIGFuZCBhbHNvIHNob3cgeW91IGV4YWN0bHkgaG93Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBiZWluZyBydW4uCi0KLUBpdGVtCi1BIGRlc2NyaXB0aW9uIG9mIHdoYXQgYmVoYXZpb3IgeW91IG9ic2VydmUgdGhhdCB5b3UgYmVsaWV2ZSBpcwotaW5jb3JyZWN0LiAgRm9yIGV4YW1wbGUsIGBgSXQgZ2V0cyBhIGZhdGFsIHNpZ25hbC4nJwotCi1PZiBjb3Vyc2UsIGlmIHRoZSBidWcgaXMgdGhhdCBAY29kZXtAdmFsdWV7QVN9fSBnZXRzIGEgZmF0YWwgc2lnbmFsLCB0aGVuIHdlCi13aWxsIGNlcnRhaW5seSBub3RpY2UgaXQuICBCdXQgaWYgdGhlIGJ1ZyBpcyBpbmNvcnJlY3Qgb3V0cHV0LCB3ZSBtaWdodCBub3QKLW5vdGljZSB1bmxlc3MgaXQgaXMgZ2xhcmluZ2x5IHdyb25nLiAgWW91IG1pZ2h0IGFzIHdlbGwgbm90IGdpdmUgdXMgYSBjaGFuY2UgdG8KLW1ha2UgYSBtaXN0YWtlLgotCi1FdmVuIGlmIHRoZSBwcm9ibGVtIHlvdSBleHBlcmllbmNlIGlzIGEgZmF0YWwgc2lnbmFsLCB5b3Ugc2hvdWxkIHN0aWxsIHNheSBzbwotZXhwbGljaXRseS4gIFN1cHBvc2Ugc29tZXRoaW5nIHN0cmFuZ2UgaXMgZ29pbmcgb24sIHN1Y2ggYXMsIHlvdXIgY29weSBvZgotQGNvZGV7QHZhbHVle0FTfX0gaXMgb3V0IG9mIHN5bmNoLCBvciB5b3UgaGF2ZSBlbmNvdW50ZXJlZCBhIGJ1ZyBpbiB0aGUgQwotbGlicmFyeSBvbiB5b3VyIHN5c3RlbS4gIChUaGlzIGhhcyBoYXBwZW5lZCEpICBZb3VyIGNvcHkgbWlnaHQgY3Jhc2ggYW5kIG91cnMKLXdvdWxkIG5vdC4gIElmIHlvdSB0b2xkIHVzIHRvIGV4cGVjdCBhIGNyYXNoLCB0aGVuIHdoZW4gb3VycyBmYWlscyB0byBjcmFzaCwgd2UKLXdvdWxkIGtub3cgdGhhdCB0aGUgYnVnIHdhcyBub3QgaGFwcGVuaW5nIGZvciB1cy4gIElmIHlvdSBoYWQgbm90IHRvbGQgdXMgdG8KLWV4cGVjdCBhIGNyYXNoLCB0aGVuIHdlIHdvdWxkIG5vdCBiZSBhYmxlIHRvIGRyYXcgYW55IGNvbmNsdXNpb24gZnJvbSBvdXIKLW9ic2VydmF0aW9ucy4KLQotQGl0ZW0KLUlmIHlvdSB3aXNoIHRvIHN1Z2dlc3QgY2hhbmdlcyB0byB0aGUgQGNvZGV7QHZhbHVle0FTfX0gc291cmNlLCBzZW5kIHVzIGNvbnRleHQKLWRpZmZzLCBhcyBnZW5lcmF0ZWQgYnkgQGNvZGV7ZGlmZn0gd2l0aCB0aGUgQHNhbXB7LXV9LCBAc2FtcHstY30sIG9yIEBzYW1wey1wfQotb3B0aW9uLiAgQWx3YXlzIHNlbmQgZGlmZnMgZnJvbSB0aGUgb2xkIGZpbGUgdG8gdGhlIG5ldyBmaWxlLiAgSWYgeW91IGV2ZW4KLWRpc2N1c3Mgc29tZXRoaW5nIGluIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzb3VyY2UsIHJlZmVyIHRvIGl0IGJ5IGNvbnRleHQsIG5vdAotYnkgbGluZSBudW1iZXIuCi0KLVRoZSBsaW5lIG51bWJlcnMgaW4gb3VyIGRldmVsb3BtZW50IHNvdXJjZXMgd2lsbCBub3QgbWF0Y2ggdGhvc2UgaW4geW91cgotc291cmNlcy4gIFlvdXIgbGluZSBudW1iZXJzIHdvdWxkIGNvbnZleSBubyB1c2VmdWwgaW5mb3JtYXRpb24gdG8gdXMuCi1AZW5kIGl0ZW1pemUKLQotSGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBhcmUgbm90IG5lY2Vzc2FyeToKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUEgZGVzY3JpcHRpb24gb2YgdGhlIGVudmVsb3BlIG9mIHRoZSBidWcuCi0KLU9mdGVuIHBlb3BsZSB3aG8gZW5jb3VudGVyIGEgYnVnIHNwZW5kIGEgbG90IG9mIHRpbWUgaW52ZXN0aWdhdGluZwotd2hpY2ggY2hhbmdlcyB0byB0aGUgaW5wdXQgZmlsZSB3aWxsIG1ha2UgdGhlIGJ1ZyBnbyBhd2F5IGFuZCB3aGljaAotY2hhbmdlcyB3aWxsIG5vdCBhZmZlY3QgaXQuCi0KLVRoaXMgaXMgb2Z0ZW4gdGltZSBjb25zdW1pbmcgYW5kIG5vdCB2ZXJ5IHVzZWZ1bCwgYmVjYXVzZSB0aGUgd2F5IHdlCi13aWxsIGZpbmQgdGhlIGJ1ZyBpcyBieSBydW5uaW5nIGEgc2luZ2xlIGV4YW1wbGUgdW5kZXIgdGhlIGRlYnVnZ2VyCi13aXRoIGJyZWFrcG9pbnRzLCBub3QgYnkgcHVyZSBkZWR1Y3Rpb24gZnJvbSBhIHNlcmllcyBvZiBleGFtcGxlcy4KLVdlIHJlY29tbWVuZCB0aGF0IHlvdSBzYXZlIHlvdXIgdGltZSBmb3Igc29tZXRoaW5nIGVsc2UuCi0KLU9mIGNvdXJzZSwgaWYgeW91IGNhbiBmaW5kIGEgc2ltcGxlciBleGFtcGxlIHRvIHJlcG9ydCBAZW1waHtpbnN0ZWFkfQotb2YgdGhlIG9yaWdpbmFsIG9uZSwgdGhhdCBpcyBhIGNvbnZlbmllbmNlIGZvciB1cy4gIEVycm9ycyBpbiB0aGUKLW91dHB1dCB3aWxsIGJlIGVhc2llciB0byBzcG90LCBydW5uaW5nIHVuZGVyIHRoZSBkZWJ1Z2dlciB3aWxsIHRha2UKLWxlc3MgdGltZSwgYW5kIHNvIG9uLgotCi1Ib3dldmVyLCBzaW1wbGlmaWNhdGlvbiBpcyBub3Qgdml0YWw7IGlmIHlvdSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLAotcmVwb3J0IHRoZSBidWcgYW55d2F5IGFuZCBzZW5kIHVzIHRoZSBlbnRpcmUgdGVzdCBjYXNlIHlvdSB1c2VkLgotCi1AaXRlbQotQSBwYXRjaCBmb3IgdGhlIGJ1Zy4KLQotQSBwYXRjaCBmb3IgdGhlIGJ1ZyBkb2VzIGhlbHAgdXMgaWYgaXQgaXMgYSBnb29kIG9uZS4gIEJ1dCBkbyBub3Qgb21pdAotdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdGVzdCBjYXNlLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0Ci1hIHBhdGNoIGlzIGFsbCB3ZSBuZWVkLiAgV2UgbWlnaHQgc2VlIHByb2JsZW1zIHdpdGggeW91ciBwYXRjaCBhbmQgZGVjaWRlCi10byBmaXggdGhlIHByb2JsZW0gYW5vdGhlciB3YXksIG9yIHdlIG1pZ2h0IG5vdCB1bmRlcnN0YW5kIGl0IGF0IGFsbC4KLQotU29tZXRpbWVzIHdpdGggYSBwcm9ncmFtIGFzIGNvbXBsaWNhdGVkIGFzIEBjb2Rle0B2YWx1ZXtBU319IGl0IGlzIHZlcnkgaGFyZCB0bwotY29uc3RydWN0IGFuIGV4YW1wbGUgdGhhdCB3aWxsIG1ha2UgdGhlIHByb2dyYW0gZm9sbG93IGEgY2VydGFpbiBwYXRoIHRocm91Z2gKLXRoZSBjb2RlLiAgSWYgeW91IGRvIG5vdCBzZW5kIHVzIHRoZSBleGFtcGxlLCB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbnN0cnVjdAotb25lLCBzbyB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIHZlcmlmeSB0aGF0IHRoZSBidWcgaXMgZml4ZWQuCi0KLUFuZCBpZiB3ZSBjYW5ub3QgdW5kZXJzdGFuZCB3aGF0IGJ1ZyB5b3UgYXJlIHRyeWluZyB0byBmaXgsIG9yIHdoeSB5b3VyCi1wYXRjaCBzaG91bGQgYmUgYW4gaW1wcm92ZW1lbnQsIHdlIHdpbGwgbm90IGluc3RhbGwgaXQuICBBIHRlc3QgY2FzZSB3aWxsCi1oZWxwIHVzIHRvIHVuZGVyc3RhbmQuCi0KLUBpdGVtCi1BIGd1ZXNzIGFib3V0IHdoYXQgdGhlIGJ1ZyBpcyBvciB3aGF0IGl0IGRlcGVuZHMgb24uCi0KLVN1Y2ggZ3Vlc3NlcyBhcmUgdXN1YWxseSB3cm9uZy4gIEV2ZW4gd2UgY2Fubm90IGd1ZXNzIHJpZ2h0IGFib3V0IHN1Y2gKLXRoaW5ncyB3aXRob3V0IGZpcnN0IHVzaW5nIHRoZSBkZWJ1Z2dlciB0byBmaW5kIHRoZSBmYWN0cy4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBBY2tub3dsZWRnZW1lbnRzCi1AY2hhcHRlciBBY2tub3dsZWRnZW1lbnRzCi0KLUlmIHlvdSBoYXZlIGNvbnRyaWJ1dGVkIHRvIEBjb2Rle0B2YWx1ZXtBU319IGFuZCB5b3VyIG5hbWUgaXNuJ3QgbGlzdGVkIGhlcmUsCi1pdCBpcyBub3QgbWVhbnQgYXMgYSBzbGlnaHQuICBXZSBqdXN0IGRvbid0IGtub3cgYWJvdXQgaXQuICBTZW5kIG1haWwgdG8gdGhlCi1tYWludGFpbmVyLCBhbmQgd2UnbGwgY29ycmVjdCB0aGUgc2l0dWF0aW9uLiAgQ3VycmVudGx5IAotQGMgKEphbnVhcnkgMTk5NCksIAotdGhlIG1haW50YWluZXIgaXMgS2VuIFJhZWJ1cm4gKGVtYWlsIGFkZHJlc3MgQGNvZGV7cmFlYnVybkBAY3lnbnVzLmNvbX0pLgotCi1EZWFuIEVsc25lciB3cm90ZSB0aGUgb3JpZ2luYWwgQHNje2dudX0gYXNzZW1ibGVyIGZvciB0aGUgVkFYLkBmb290bm90ZXtBbnkKLW1vcmUgZGV0YWlscz99Ci0KLUpheSBGZW5sYXNvbiBtYWludGFpbmVkIEdBUyBmb3IgYSB3aGlsZSwgYWRkaW5nIHN1cHBvcnQgZm9yIEdEQi1zcGVjaWZpYyBkZWJ1ZwotaW5mb3JtYXRpb24gYW5kIHRoZSA2OGsgc2VyaWVzIG1hY2hpbmVzLCBtb3N0IG9mIHRoZSBwcmVwcm9jZXNzaW5nIHBhc3MsIGFuZAotZXh0ZW5zaXZlIGNoYW5nZXMgaW4gQGZpbGV7bWVzc2FnZXMuY30sIEBmaWxle2lucHV0LWZpbGUuY30sIEBmaWxle3dyaXRlLmN9LgotCi1LLiBSaWNoYXJkIFBpeGxleSBtYWludGFpbmVkIEdBUyBmb3IgYSB3aGlsZSwgYWRkaW5nIHZhcmlvdXMgZW5oYW5jZW1lbnRzIGFuZAotbWFueSBidWcgZml4ZXMsIGluY2x1ZGluZyBtZXJnaW5nIHN1cHBvcnQgZm9yIHNldmVyYWwgcHJvY2Vzc29ycywgYnJlYWtpbmcgR0FTCi11cCB0byBoYW5kbGUgbXVsdGlwbGUgb2JqZWN0IGZpbGUgZm9ybWF0IGJhY2sgZW5kcyAoaW5jbHVkaW5nIGhlYXZ5IHJld3JpdGUsCi10ZXN0aW5nLCBhbiBpbnRlZ3JhdGlvbiBvZiB0aGUgY29mZiBhbmQgYi5vdXQgYmFjayBlbmRzKSwgYWRkaW5nIGNvbmZpZ3VyYXRpb24KLWluY2x1ZGluZyBoZWF2eSB0ZXN0aW5nIGFuZCB2ZXJpZmljYXRpb24gb2YgY3Jvc3MgYXNzZW1ibGVycyBhbmQgZmlsZSBzcGxpdHMKLWFuZCByZW5hbWluZywgY29udmVydGVkIEdBUyB0byBzdHJpY3RseSBBTlNJIEMgaW5jbHVkaW5nIGZ1bGwgcHJvdG90eXBlcywgYWRkZWQKLXN1cHBvcnQgZm9yIG02ODBbMzRdMCBhbmQgY3B1MzIsIGRpZCBjb25zaWRlcmFibGUgd29yayBvbiBpOTYwIGluY2x1ZGluZyBhIENPRkYKLXBvcnQgKGluY2x1ZGluZyBjb25zaWRlcmFibGUgYW1vdW50cyBvZiByZXZlcnNlIGVuZ2luZWVyaW5nKSwgYSBTUEFSQyBvcGNvZGUKLWZpbGUgcmV3cml0ZSwgREVDc3RhdGlvbiwgcnM2MDAwLCBhbmQgaHAzMDBocHV4IGhvc3QgcG9ydHMsIHVwZGF0ZWQgYGBrbm93JycKLWFzc2VydGlvbnMgYW5kIG1hZGUgdGhlbSB3b3JrLCBtdWNoIG90aGVyIHJlb3JnYW5pemF0aW9uLCBjbGVhbnVwLCBhbmQgbGludC4KLQotS2VuIFJhZWJ1cm4gd3JvdGUgdGhlIGhpZ2gtbGV2ZWwgQkZEIGludGVyZmFjZSBjb2RlIHRvIHJlcGxhY2UgbW9zdCBvZiB0aGUgY29kZQotaW4gZm9ybWF0LXNwZWNpZmljIEkvTyBtb2R1bGVzLgotCi1UaGUgb3JpZ2luYWwgVk1TIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IERhdmlkIEwuIEthc2h0YW4uICBFcmljIFlvdW5nZGFsZQotaGFzIGRvbmUgbXVjaCB3b3JrIHdpdGggaXQgc2luY2UuCi0KLVRoZSBJbnRlbCA4MDM4NiBtYWNoaW5lIGRlc2NyaXB0aW9uIHdhcyB3cml0dGVuIGJ5IEVsaW90IERyZXNzZWxoYXVzLgotCi1NaW5oIFRyYW4tTGUgYXQgSW50ZWxsaUNvcnAgY29udHJpYnV0ZWQgc29tZSBBSVggMzg2IHN1cHBvcnQuCi0KLVRoZSBNb3Rvcm9sYSA4OGsgbWFjaGluZSBkZXNjcmlwdGlvbiB3YXMgY29udHJpYnV0ZWQgYnkgRGV2b24gQm93ZW4gb2YgQnVmZmFsbwotVW5pdmVyc2l0eSBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQgb2YgdGhlIFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCi0KLUtlaXRoIEtub3dsZXMgYXQgdGhlIE9wZW4gU29mdHdhcmUgRm91bmRhdGlvbiB3cm90ZSB0aGUgb3JpZ2luYWwgTUlQUyBiYWNrIGVuZAotKEBmaWxle3RjLW1pcHMuY30sIEBmaWxle3RjLW1pcHMuaH0pLCBhbmQgY29udHJpYnV0ZWQgUm9zZSBmb3JtYXQgc3VwcG9ydAotKHdoaWNoIGhhc24ndCBiZWVuIG1lcmdlZCBpbiB5ZXQpLiAgUmFscGggQ2FtcGJlbGwgd29ya2VkIHdpdGggdGhlIE1JUFMgY29kZSB0bwotc3VwcG9ydCBhLm91dCBmb3JtYXQuCi0KLVN1cHBvcnQgZm9yIHRoZSBaaWxvZyBaOGsgYW5kIEhpdGFjaGkgSDgvMzAwIGFuZCBIOC81MDAgcHJvY2Vzc29ycyAodGMtejhrLAotdGMtaDgzMDAsIHRjLWg4NTAwKSwgYW5kIElFRUUgNjk1IG9iamVjdCBmaWxlIGZvcm1hdCAob2JqLWllZWUpLCB3YXMgd3JpdHRlbiBieQotU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuICBTdGV2ZSBhbHNvIG1vZGlmaWVkIHRoZSBDT0ZGIGJhY2sgZW5kIHRvCi11c2UgQkZEIGZvciBzb21lIGxvdy1sZXZlbCBvcGVyYXRpb25zLCBmb3IgdXNlIHdpdGggdGhlIEg4LzMwMCBhbmQgQU1EIDI5awotdGFyZ2V0cy4KLQotSm9obiBHaWxtb3JlIGJ1aWx0IHRoZSBBTUQgMjkwMDAgc3VwcG9ydCwgYWRkZWQgQGNvZGV7LmluY2x1ZGV9IHN1cHBvcnQsIGFuZAotc2ltcGxpZmllZCB0aGUgY29uZmlndXJhdGlvbiBvZiB3aGljaCB2ZXJzaW9ucyBhY2NlcHQgd2hpY2ggZGlyZWN0aXZlcy4gIEhlCi11cGRhdGVkIHRoZSA2OGsgbWFjaGluZSBkZXNjcmlwdGlvbiBzbyB0aGF0IE1vdG9yb2xhJ3Mgb3Bjb2RlcyBhbHdheXMgcHJvZHVjZWQKLWZpeGVkLXNpemUgaW5zdHJ1Y3Rpb25zIChlLmcuIEBjb2Rle2pzcn0pLCB3aGlsZSBzeW50aGV0aWMgaW5zdHJ1Y3Rpb25zCi1yZW1haW5lZCBzaHJpbmthYmxlIChAY29kZXtqYnNyfSkuICBKb2huIGZpeGVkIG1hbnkgYnVncywgaW5jbHVkaW5nIHRydWUgdGVzdGVkCi1jcm9zcy1jb21waWxhdGlvbiBzdXBwb3J0LCBhbmQgb25lIGJ1ZyBpbiByZWxheGF0aW9uIHRoYXQgdG9vayBhIHdlZWsgYW5kCi1yZXF1aXJlZCB0aGUgcHJvdmVyYmlhbCBvbmUtYml0IGZpeC4KLQotSWFuIExhbmNlIFRheWxvciBvZiBDeWdudXMgU3VwcG9ydCBtZXJnZWQgdGhlIE1vdG9yb2xhIGFuZCBNSVQgc3ludGF4IGZvciB0aGUKLTY4aywgY29tcGxldGVkIHN1cHBvcnQgZm9yIHNvbWUgQ09GRiB0YXJnZXRzICg2OGssIGkzODYgU1ZSMywgYW5kIFNDTyBVbml4KSwKLWFkZGVkIHN1cHBvcnQgZm9yIE1JUFMgRUNPRkYgYW5kIEVMRiB0YXJnZXRzLCB3cm90ZSB0aGUgaW5pdGlhbCBSUy82MDAwIGFuZAotUG93ZXJQQyBhc3NlbWJsZXIsIGFuZCBtYWRlIGEgZmV3IG90aGVyIG1pbm9yIHBhdGNoZXMuCi0KLVN0ZXZlIENoYW1iZXJsYWluIG1hZGUgQGNvZGV7QHZhbHVle0FTfX0gYWJsZSB0byBnZW5lcmF0ZSBsaXN0aW5ncy4KLQotSGV3bGV0dC1QYWNrYXJkIGNvbnRyaWJ1dGVkIHN1cHBvcnQgZm9yIHRoZSBIUDkwMDAvMzAwLgotCi1KZWZmIExhdyB3cm90ZSBHQVMgYW5kIEJGRCBzdXBwb3J0IGZvciB0aGUgbmF0aXZlIEhQUEEgb2JqZWN0IGZvcm1hdCAoU09NKQotYWxvbmcgd2l0aCBhIGZhaXJseSBleHRlbnNpdmUgSFBQQSB0ZXN0c3VpdGUgKGZvciBib3RoIFNPTSBhbmQgRUxGIG9iamVjdAotZm9ybWF0cykuICBUaGlzIHdvcmsgd2FzIHN1cHBvcnRlZCBieSBib3RoIHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQKLXRoZSBVbml2ZXJzaXR5IG9mIFV0YWggYW5kIEN5Z251cyBTdXBwb3J0LgotCi1TdXBwb3J0IGZvciBFTEYgZm9ybWF0IGZpbGVzIGhhcyBiZWVuIHdvcmtlZCBvbiBieSBNYXJrIEVpY2hpbiBvZiBDeWdudXMKLVN1cHBvcnQgKG9yaWdpbmFsLCBpbmNvbXBsZXRlIGltcGxlbWVudGF0aW9uIGZvciBTUEFSQyksIFBldGUgSG9vZ2VuYm9vbSBhbmQKLUplZmYgTGF3IGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWggKEhQUEEgbWFpbmx5KSwgTWljaGFlbCBNZWlzc25lciBvZiB0aGUgT3BlbgotU29mdHdhcmUgRm91bmRhdGlvbiAoaTM4NiBtYWlubHkpLCBhbmQgS2VuIFJhZWJ1cm4gb2YgQ3lnbnVzIFN1cHBvcnQgKHNwYXJjLAotYW5kIHNvbWUgaW5pdGlhbCA2NC1iaXQgc3VwcG9ydCkuCi0KLVJpY2hhcmQgSGVuZGVyc29uIHJld3JvdGUgdGhlIEFscGhhIGFzc2VtYmxlci4gS2xhdXMgS2FlbXBmIHdyb3RlIEdBUyBhbmQgQkZECi1zdXBwb3J0IGZvciBvcGVuVk1TL0FscGhhLgotCi1TZXZlcmFsIGVuZ2luZWVycyBhdCBDeWdudXMgU3VwcG9ydCBoYXZlIGFsc28gcHJvdmlkZWQgbWFueSBzbWFsbCBidWcgZml4ZXMgYW5kCi1jb25maWd1cmF0aW9uIGVuaGFuY2VtZW50cy4KLQotTWFueSBvdGhlcnMgaGF2ZSBjb250cmlidXRlZCBsYXJnZSBvciBzbWFsbCBidWdmaXhlcyBhbmQgZW5oYW5jZW1lbnRzLiAgSWYKLXlvdSBoYXZlIGNvbnRyaWJ1dGVkIHNpZ25pZmljYW50IHdvcmsgYW5kIGFyZSBub3QgbWVudGlvbmVkIG9uIHRoaXMgbGlzdCwgYW5kCi13YW50IHRvIGJlLCBsZXQgdXMga25vdy4gIFNvbWUgb2YgdGhlIGhpc3RvcnkgaGFzIGJlZW4gbG9zdDsgd2UgYXJlIG5vdAotaW50ZW50aW9uYWxseSBsZWF2aW5nIGFueW9uZSBvdXQuCi0KLUBub2RlIEluZGV4Ci1AdW5udW1iZXJlZCBJbmRleAotCi1AcHJpbnRpbmRleCBjcAotCi1AY29udGVudHMKLUBieWUKLUBjIExvY2FsIFZhcmlhYmxlczoKLUBjIGZpbGwtY29sdW1uOiA3OQotQGMgRW5kOgpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWEyOWsudGV4aSBiL2dhcy9kb2MvYy1hMjlrLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTE1ZDguLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWEyOWsudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgQU1EMjlLLURlcGVuZGVudAotQGNoYXB0ZXIgQU1EIDI5SyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBBTUQgMjlLIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggQU1EIDI5SyBzdXBwb3J0Ci1AY2luZGV4IDI5SyBzdXBwb3J0Ci1AbWVudQotKiBBTUQyOUsgT3B0aW9uczo6ICAgICAgICAgICAgICBPcHRpb25zCi0qIEFNRDI5SyBTeW50YXg6OiAgICAgICAgICAgICAgIFN5bnRheAotKiBBTUQyOUsgRmxvYXRpbmcgUG9pbnQ6OiAgICAgICBGbG9hdGluZyBQb2ludAotKiBBTUQyOUsgRGlyZWN0aXZlczo6ICAgICAgICAgICBBTUQgMjlLIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBBTUQyOUsgT3Bjb2Rlczo6ICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgQU1EMjlLIE9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLUBjaW5kZXggQU1EIDI5SyBvcHRpb25zIChub25lKQotQGNpbmRleCBvcHRpb25zIGZvciBBTUQyOUsgKG5vbmUpCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gYWRkaXRpb25hbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgdGhlIEFNRAotMjlLIGZhbWlseS4KLQotQG5vZGUgQU1EMjlLIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1AbWVudQotKiBBTUQyOUstTWFjcm9zOjoJCU1hY3JvcwotKiBBTUQyOUstQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogQU1EMjlLLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLUBlbmQgbWVudQotCi1Abm9kZSBBTUQyOUstTWFjcm9zCi1Ac3Vic2VjdGlvbiBNYWNyb3MKLQotQGNpbmRleCBNYWNyb3MsIEFNRCAyOUsKLUBjaW5kZXggQU1EIDI5SyBtYWNyb3MKLVRoZSBtYWNybyBzeW50YXggdXNlZCBvbiB0aGUgQU1EIDI5SyBpcyBsaWtlIHRoYXQgZGVzY3JpYmVkIGluIHRoZSBBTUQKLTI5SyBGYW1pbHkgTWFjcm8gQXNzZW1ibGVyIFNwZWNpZmljYXRpb24uICBOb3JtYWwgQGNvZGV7QHZhbHVle0FTfX0KLW1hY3JvcyBzaG91bGQgc3RpbGwgd29yay4KLQotQG5vZGUgQU1EMjlLLUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLQotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBBTUQgMjlLCi1AY2luZGV4IEFNRCAyOUsgbGluZSBjb21tZW50IGNoYXJhY3RlcgotQHNhbXB7O30gaXMgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIuCi0KLUBjaW5kZXggaWRlbnRpZmllcnMsIEFNRCAyOUsKLUBjaW5kZXggQU1EIDI5SyBpZGVudGlmaWVycwotVGhlIGNoYXJhY3RlciBAc2FtcHs/fSBpcyBwZXJtaXR0ZWQgaW4gaWRlbnRpZmllcnMgKGJ1dCBtYXkgbm90IGJlZ2luCi1hbiBpZGVudGlmaWVyKS4KLQotQG5vZGUgQU1EMjlLLVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi0KLUBjaW5kZXggQU1EIDI5SyByZWdpc3RlciBuYW1lcwotQGNpbmRleCByZWdpc3RlciBuYW1lcywgQU1EIDI5SwotR2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycyBhcmUgcmVwcmVzZW50ZWQgYnkgcHJlZGVmaW5lZCBzeW1ib2xzIG9mIHRoZQotZm9ybSBAc2FtcHtHUkB2YXJ7bm5ufX0gKGZvciBnbG9iYWwgcmVnaXN0ZXJzKSBvciBAc2FtcHtMUkB2YXJ7bm5ufX0KLShmb3IgbG9jYWwgcmVnaXN0ZXJzKSwgd2hlcmUgQHZhcntubm59IHJlcHJlc2VudHMgYSBudW1iZXIgYmV0d2VlbgotQGNvZGV7MH0gYW5kIEBjb2RlezEyN30sIHdyaXR0ZW4gd2l0aCBubyBsZWFkaW5nIHplcm9zLiAgVGhlIGxlYWRpbmcKLWxldHRlcnMgbWF5IGJlIGluIGVpdGhlciB1cHBlciBvciBsb3dlciBjYXNlOyBmb3IgZXhhbXBsZSwgQHNhbXB7Z3IxM30KLWFuZCBAc2FtcHtMUjd9IGFyZSBib3RoIHZhbGlkIHJlZ2lzdGVyIG5hbWVzLgotCi1Zb3UgbWF5IGFsc28gcmVmZXIgdG8gZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycyBieSBzcGVjaWZ5aW5nIHRoZQotcmVnaXN0ZXIgbnVtYmVyIGFzIHRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiAocHJlZml4ZWQgd2l0aCBAc2FtcHslJX0KLXRvIGZsYWcgdGhlIGV4cHJlc3Npb24gYXMgYSByZWdpc3RlciBudW1iZXIpOgotQHNtYWxsZXhhbXBsZQotJSVAdmFye2V4cHJlc3Npb259Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci0tLS13aGVyZSBAdmFye2V4cHJlc3Npb259IG11c3QgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiBldmFsdWF0aW5nIHRvIGEKLW51bWJlciBiZXR3ZWVuIEBjb2RlezB9IGFuZCBAY29kZXsyNTV9LiAgVGhlIHJhbmdlIFswLCAxMjddIHJlZmVycyB0bwotZ2xvYmFsIHJlZ2lzdGVycywgYW5kIHRoZSByYW5nZSBbMTI4LCAyNTVdIHRvIGxvY2FsIHJlZ2lzdGVycy4KLQotQGNpbmRleCBzcGVjaWFsIHB1cnBvc2UgcmVnaXN0ZXJzLCBBTUQgMjlLCi1AY2luZGV4IEFNRCAyOUsgc3BlY2lhbCBwdXJwb3NlIHJlZ2lzdGVycwotQGNpbmRleCBwcm90ZWN0ZWQgcmVnaXN0ZXJzLCBBTUQgMjlLCi1AY2luZGV4IEFNRCAyOUsgcHJvdGVjdGVkIHJlZ2lzdGVycwotSW4gYWRkaXRpb24sIEBjb2Rle0B2YWx1ZXtBU319IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgcHJvdGVjdGVkCi1zcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXIgbmFtZXMgZm9yIHRoZSBBTUQgMjlLIGZhbWlseToKLQotQHNtYWxsZXhhbXBsZQotICB2YWIgICAgY2hkICAgIHBjMAotICBvcHMgICAgY2hjICAgIHBjMQotICBjcHMgICAgcmJwICAgIHBjMgotICBjZmcgICAgdG1jICAgIG1tdQotICBjaGEgICAgdG1yICAgIGxydQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlc2UgdW5wcm90ZWN0ZWQgc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVyIG5hbWVzIGFyZSBhbHNvIHJlY29nbml6ZWQ6Ci1Ac21hbGxleGFtcGxlCi0gIGlwYyAgICBhbHUgICAgZnBlCi0gIGlwYSAgICBicCAgICAgaW50ZQotICBpcGIgICAgZmMgICAgIGZwcwotICBxICAgICAgY3IgICAgIGV4b3AKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIEFNRDI5SyBGbG9hdGluZyBQb2ludAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgQU1EIDI5SyAoQHNje2llZWV9KQotQGNpbmRleCBBTUQgMjlLIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgQU1EIDI5SyBmYW1pbHkgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLQotQG5vZGUgQU1EMjlLIERpcmVjdGl2ZXMKLUBzZWN0aW9uIEFNRCAyOUsgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBBTUQgMjlLCi1AY2luZGV4IEFNRCAyOUsgbWFjaGluZSBkaXJlY3RpdmVzCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7YmxvY2t9IGRpcmVjdGl2ZSwgQU1EIDI5SwotQGl0ZW0gLmJsb2NrIEB2YXJ7c2l6ZX0gLCBAdmFye2ZpbGx9Ci1UaGlzIGRpcmVjdGl2ZSBlbWl0cyBAdmFye3NpemV9IGJ5dGVzLCBlYWNoIG9mIHZhbHVlIEB2YXJ7ZmlsbH0uICBCb3RoCi1AdmFye3NpemV9IGFuZCBAdmFye2ZpbGx9IGFyZSBhYnNvbHV0ZSBleHByZXNzaW9ucy4gIElmIHRoZSBjb21tYQotYW5kIEB2YXJ7ZmlsbH0gYXJlIG9taXR0ZWQsIEB2YXJ7ZmlsbH0gaXMgYXNzdW1lZCB0byBiZSB6ZXJvLgotCi1JbiBvdGhlciB2ZXJzaW9ucyBvZiB0aGUgQHNje2dudX0gYXNzZW1ibGVyLCB0aGlzIGRpcmVjdGl2ZSBpcyBjYWxsZWQKLUBzYW1wey5zcGFjZX0uCi1AZW5kIHRhYmxlCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtjcHV0eXBlfSBkaXJlY3RpdmUsIEFNRCAyOUsKLUBpdGVtIC5jcHV0eXBlCi1UaGlzIGRpcmVjdGl2ZSBpcyBpZ25vcmVkOyBpdCBpcyBhY2NlcHRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyCi1BTUQgMjlLIGFzc2VtYmxlcnMuCi0KLUBjaW5kZXggQGNvZGV7ZmlsZX0gZGlyZWN0aXZlLCBBTUQgMjlLCi1AaXRlbSAuZmlsZQotVGhpcyBkaXJlY3RpdmUgaXMgaWdub3JlZDsgaXQgaXMgYWNjZXB0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlcgotQU1EIDI5SyBhc3NlbWJsZXJzLgotCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gaW4gb3RoZXIgdmVyc2lvbnMgb2YgdGhlIEBzY3tnbnV9IGFzc2VtYmxlciwgQGNvZGV7LmZpbGV9IGlzCi11c2VkIGZvciB0aGUgZGlyZWN0aXZlIGNhbGxlZCBAY29kZXsuYXBwLWZpbGV9IGluIHRoZSBBTUQgMjlLIHN1cHBvcnQuCi1AZW5kIHF1b3RhdGlvbgotCi1AY2luZGV4IEBjb2Rle2xpbmV9IGRpcmVjdGl2ZSwgQU1EIDI5SwotQGl0ZW0gLmxpbmUKLVRoaXMgZGlyZWN0aXZlIGlzIGlnbm9yZWQ7IGl0IGlzIGFjY2VwdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKLUFNRCAyOUsgYXNzZW1ibGVycy4KLQotQGlnbm9yZQotQGMgc2luY2Ugd2UncmUgaWdub3JpbmcgLmxzeW0uLi4KLUBjaW5kZXggQGNvZGV7cmVnfSBkaXJlY3RpdmUsIEFNRCAyOUsKLUBpdGVtIC5yZWcgQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259Ci1AY29kZXsucmVnfSBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIEBjb2Rley5sc3ltfTsgQHB4cmVme0xzeW0sLEBjb2Rley5sc3ltfX0uCi1AZW5kIGlnbm9yZQotCi1AY2luZGV4IEBjb2Rle3NlY3R9IGRpcmVjdGl2ZSwgQU1EIDI5SwotQGl0ZW0gLnNlY3QKLVRoaXMgZGlyZWN0aXZlIGlzIGlnbm9yZWQ7IGl0IGlzIGFjY2VwdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKLUFNRCAyOUsgYXNzZW1ibGVycy4KLQotQGNpbmRleCBAY29kZXt1c2V9IGRpcmVjdGl2ZSwgQU1EIDI5SwotQGl0ZW0gLnVzZSBAdmFye3NlY3Rpb24gbmFtZX0KLUVzdGFibGlzaGVzIHRoZSBzZWN0aW9uIGFuZCBzdWJzZWN0aW9uIGZvciB0aGUgZm9sbG93aW5nIGNvZGU7Ci1AdmFye3NlY3Rpb24gbmFtZX0gbWF5IGJlIG9uZSBvZiBAY29kZXsudGV4dH0sIEBjb2Rley5kYXRhfSwKLUBjb2Rley5kYXRhMX0sIG9yIEBjb2Rley5saXR9LiAgV2l0aCBvbmUgb2YgdGhlIGZpcnN0IHRocmVlIEB2YXJ7c2VjdGlvbgotbmFtZX0gb3B0aW9ucywgQHNhbXB7LnVzZX0gaXMgZXF1aXZhbGVudCB0byB0aGUgbWFjaGluZSBkaXJlY3RpdmUKLUB2YXJ7c2VjdGlvbiBuYW1lfTsgdGhlIHJlbWFpbmluZyBjYXNlLCBAc2FtcHsudXNlIC5saXR9LCBpcyB0aGUgc2FtZSBhcwotQHNhbXB7LmRhdGEgMjAwfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQU1EMjlLIE9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLQotQGNpbmRleCBBTUQgMjlLIG9wY29kZXMKLUBjaW5kZXggb3Bjb2RlcyBmb3IgQU1EIDI5SwotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIEFNRCAyOUsgb3Bjb2Rlcy4gIE5vCi1hZGRpdGlvbmFsIHBzZXVkby1pbnN0cnVjdGlvbnMgYXJlIG5lZWRlZCBvbiB0aGlzIGZhbWlseS4KLQotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSAyOUsgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZSBAY2l0ZXtBbTI5MDAwCi1Vc2VyJ3MgTWFudWFsfSwgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtYXJtLnRleGkgYi9nYXMvZG9jL2MtYXJtLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NGZiMmEuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWFybS50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIEFSTS1EZXBlbmRlbnQKLUBjaGFwdGVyIEFSTSBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIEFSTSBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IEFSTSBzdXBwb3J0Ci1AY2luZGV4IFRodW1iIHN1cHBvcnQKLUBtZW51Ci0qIEFSTSBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKLSogQVJNIFN5bnRheDo6ICAgICAgICAgICAgICAgU3ludGF4Ci0qIEFSTSBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIEFSTSBEaXJlY3RpdmVzOjogICAgICAgICAgIEFSTSBNYWNoaW5lIERpcmVjdGl2ZXMKLSogQVJNIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEFSTSBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi1AY2luZGV4IEFSTSBvcHRpb25zIChub25lKQotQGNpbmRleCBvcHRpb25zIGZvciBBUk0gKG5vbmUpCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7LW1hcm19IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW1hcm0gQHZhcntbMnwyNTB8M3w2fDYwfDYwMHw2MTB8NjIwfDd8N218N2R8N2RtfDdkaXw3ZG1pfDcwfDcwMHw3MDBpfDcxMHw3MTBjfDcxMDB8NzUwMHw3NTAwZmV8N3RkbWl8OHw4MTB8OXw5dGRtaXN0cm9uZ2FybXxzdHJvbmdhcm0xMTB8c3Ryb25nYXJtMTEwMF19Ci1UaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhlIHRhcmdldCBwcm9jZXNzb3IuICBUaGUgYXNzZW1ibGVyIHdpbGwgaXNzdWUgYW4KLWVycm9yIG1lc3NhZ2UgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFzc2VtYmxlIGFuIGluc3RydWN0aW9uIHdoaWNoCi13aWxsIG5vdCBleGVjdXRlIG9uIHRoZSB0YXJnZXQgcHJvY2Vzc29yLgotQGNpbmRleCBAY29kZXstbWFybXZ9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW1hcm12IEB2YXJ7WzJ8MmF8M3wzbXw0fDR0XX0KLVRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gIFRoZSBhc3NlbWJsZXIgd2lsbCBpc3N1ZQotYW4gZXJyb3IgbWVzc2FnZSBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24gd2hpY2gKLXdpbGwgbm90IGV4ZWN1dGUgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCi1AY2luZGV4IEBjb2Rley1tdGh1bWJ9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW10aHVtYgotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoYXQgb25seSBUaHVtYiBpbnN0cnVjdGlvbnMgc2hvdWxkIGJlIGFzc2VtYmxlZC4KLUBjaW5kZXggQGNvZGV7LW1hbGx9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW1hbGwKLVRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGF0IGFueSBBcm0gb3IgVGh1bWIgaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIGFzc2VtYmxlZC4KLUBjaW5kZXggQGNvZGV7LW1mcGF9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW1mcGEgQHZhcntbMTB8MTFdfQotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoZSBmbG9hdGluZyBwb2ludCBhcmNoaXRlY3R1cmUgaW4gdXNlIG9uIHRoZQotdGFyZ2V0IHByb2Nlc3Nvci4gCi1AY2luZGV4IEBjb2Rley1tZnBlLW9sZH0gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtbWZwZS1vbGQKLURvIG5vdCBhbGxvdyB0aGUgYXNzZW1ibGUgb2YgZmxvYXRpbmcgcG9pbnQgbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zLgotQGNpbmRleCBAY29kZXstbW5vLWZwdX0gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtbW5vLWZwdQotRG8gbm90IGFsbG93IHRoZSBhc3NlbWJseSBvZiBhbnkgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zLgotQGNpbmRleCBAY29kZXstbXRodW1iLWludGVyd29ya30gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtbXRodW1iLWludGVyd29yawotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoYXQgdGhlIG91dHB1dCBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlciBzaG91bGQKLWJlIG1hcmtlZCBhcyBzdXBwb3J0aW5nIGludGVyd29ya2luZy4KLUBjaW5kZXggQGNvZGV7LW1hcGNzfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1tYXBjcyBAdmFye1syNnwzMl19Ci1UaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhhdCB0aGUgb3V0cHV0IGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyIHNob3VsZAotYmUgbWFya2VkIGFzIHN1cHBvcnRpbmcgdGhlIGluZGljYXRlZCB2ZXJzaW9uIG9mIHRoZSBBcm0gUHJvY2VkdXJlLgotQ2FsbGluZyBTdGFuZGFyZC4KLUBpdGVtIC1tYXBjcy1mbG9hdAotVGhpcyBpbmRpY2F0ZXMgdGhlIHRoZSBmbG9hdGluZyBwb2ludCB2YXJpYW50IG9mIHRoZSBBUENTIHNob3VsZCBiZQotdXNlZC4gIEluIHRoaXMgdmFyaWFudCBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiBGUAotcmVnaXN0ZXJzIHJhdGVociB0aGFuIGludGVnZXIgcmVnaXN0ZXJzLgotQGl0ZW0gLW1hcGNzLXJlZW50cmFudAotVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVlbnRyYW50IHZhcmlhbnQgb2YgdGhlIEFQQ1Mgc2hvdWxkIGJlIHVzZWQuCi1UaGlzIHZhcmlhbnQgc3VwcG9ydHMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZS4KLUBjaW5kZXggQGNvZGV7LUVCfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1FQgotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoYXQgdGhlIG91dHB1dCBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlciBzaG91bGQKLWJlIG1hcmtlZCBhcyBiZWluZyBlbmNvZGVkIGZvciBhIGJpZy1lbmRpYW4gcHJvY2Vzc29yLgotQGNpbmRleCBAY29kZXstRUx9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLUVMCi1UaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhhdCB0aGUgb3V0cHV0IGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyIHNob3VsZAotYmUgbWFya2VkIGFzIGJlaW5nIGVuY29kZWQgZm9yIGEgbGl0dGxlLWVuZGlhbiBwcm9jZXNzb3IuCi1AY2luZGV4IEBjb2Rley1rfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBjaW5kZXggUElDIGNvZGUgZ2VuZXJhdGlvbiBmb3IgQVJNCi1AaXRlbSAtawotVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgZ2VuZXJhdGlvbiBvZiBQSUMgKHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUpLgotQGl0ZW0gLW1vYWJpCi1UaGlzIGluZGljYXRlcyB0aGF0IHRoZSBjb2RlIHNob3VsZCBiZSBhc3NlbWJsZWQgdXNpbmcgdGhlIG9sZCBBUk0gRUxGCi1jb252ZW50aW9ucywgYmFzZWQgb24gYSBiZXRhIHJlbGVhc2UgcmVsZWFzZSBvZiB0aGUgQVJNLUVMRgotc3BlY2lmaWNhdGlvbnMsIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IGNvbnZlbnRpb25zIHdoaWNoIGFyZSBiYXNlZCBvbgotdGhlIGZpbmFsIHJlbGVhc2Ugb2YgdGhlIEFSTS1FTEYgc3BlY2lmaWNhdGlvbnMuCi1AZW5kIHRhYmxlCi0KLQotQG5vZGUgQVJNIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1AbWVudQotKiBBUk0tQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogQVJNLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLUBlbmQgbWVudQotCi1Abm9kZSBBUk0tQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIEFSTQotQGNpbmRleCBBUk0gbGluZSBjb21tZW50IGNoYXJhY3RlcgotVGhlIHByZXNlbmNlIG9mIGEgQHNhbXB7I30gYW5kIEBzYW1we0BAfSBvbiBhIGxpbmUgaW5kaWNhdGVzIHRoZSBzdGFydCBvZgotYSBjb21tZW50IHRoYXQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGxpbmUuCi0KLUBjaW5kZXggaWRlbnRpZmllcnMsIEFSTQotQGNpbmRleCBBUk0gaWRlbnRpZmllcnMKLSpUT0RPKiBFeHBsYWluIGFib3V0IC9kYXRhIG1vZGlmaWVyIG9uIHN5bWJvbHMuCi0KLUBub2RlIEFSTS1SZWdzCi1Ac3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcwotCi1AY2luZGV4IEFSTSByZWdpc3RlciBuYW1lcwotQGNpbmRleCByZWdpc3RlciBuYW1lcywgQVJNCi0qVE9ETyogRXhwbGFpbiBhYm91dCBBUk0gcmVnaXN0ZXIgbmFtaW5nLCBhbmQgdGhlIHByZWRlZmluZWQgbmFtZXMuCi0KLUBub2RlIEFSTSBGbG9hdGluZyBQb2ludAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgQVJNIChAc2N7aWVlZX0pCi1AY2luZGV4IEFSTSBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQotVGhlIEFSTSBmYW1pbHkgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLQotCi0KLUBub2RlIEFSTSBEaXJlY3RpdmVzCi1Ac2VjdGlvbiBBUk0gTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBBUk0KLUBjaW5kZXggQVJNIG1hY2hpbmUgZGlyZWN0aXZlcwotQHRhYmxlIEBjb2RlCi0KLUBjaW5kZXggQGNvZGV7cmVxfSBkaXJlY3RpdmUsIEFSTQotQGl0ZW0gQHZhcntuYW1lfSAucmVxIEB2YXJ7cmVnaXN0ZXIgbmFtZX0KLVRoaXMgY3JlYXRlcyBhbiBhbGlhcyBmb3IgQHZhcntyZWdpc3RlciBuYW1lfSBjYWxsZWQgQHZhcntuYW1lfS4gIEZvcgotZXhhbXBsZToKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICBmb28gLnJlcSByMAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBAY29kZXtjb2RlfSBkaXJlY3RpdmUsIEFSTQotQGl0ZW0gLmNvZGUgQHZhcntbMTZ8MzJdfQotVGhpcyBkaXJlY3RpdmUgc2VsZWN0cyB0aGUgaW5zdHJ1Y3Rpb24gc2V0IGJlaW5nIGdlbmVyYXRlZC4gVGhlIHZhbHVlIDE2Ci1zZWxlY3RzIFRodW1iLCB3aXRoIHRoZSB2YWx1ZSAzMiBzZWxlY3RpbmcgQVJNLgotCi1AY2luZGV4IEBjb2Rle3RodW1ifSBkaXJlY3RpdmUsIEFSTQotQGl0ZW0gLnRodW1iCi1UaGlzIHBlcmZvcm1zIHRoZSBzYW1lIGFjdGlvbiBhcyBAdmFyey5jb2RlIDE2fS4KLQotQGNpbmRleCBAY29kZXthcm19IGRpcmVjdGl2ZSwgQVJNCi1AaXRlbSAuYXJtCi1UaGlzIHBlcmZvcm1zIHRoZSBzYW1lIGFjdGlvbiBhcyBAdmFyey5jb2RlIDMyfS4KLQotQGNpbmRleCBAY29kZXtmb3JjZV90aHVtYn0gZGlyZWN0aXZlLCBBUk0KLUBpdGVtIC5mb3JjZV90aHVtYgotVGhpcyBkaXJlY3RpdmUgZm9yY2VzIHRoZSBzZWxlY3Rpb24gb2YgVGh1bWIgaW5zdHJ1Y3Rpb25zLCBldmVuIGlmIHRoZQotdGFyZ2V0IHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IHRob3NlIGluc3RydWN0aW9ucwotCi1AY2luZGV4IEBjb2Rle3RodW1iX2Z1bmN9IGRpcmVjdGl2ZSwgQVJNCi1AaXRlbSAudGh1bWJfZnVuYwotVGhpcyBkaXJlY3RpdmUgc3BlY2lmaWVzIHRoYXQgdGhlIGZvbGxvd2luZyBzeW1ib2wgaXMgdGhlIG5hbWUgb2YgYQotVGh1bWIgZW5jb2RlZCBmdW5jdGlvbi4gIFRoaXMgaW5mb3JtYXRpb24gaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGFsbG93Ci10aGUgYXNzZW1ibGVyIGFuZCBsaW5rZXIgdG8gZ2VuZXJhdGUgY29ycmVjdCBjb2RlIGZvciBpbnRlcndvcmtpbmcKLWJldHdlZW4gQXJtIGFuZCBUaHVtYiBpbnN0cnVjdGlvbnMgYW5kIHNob3VsZCBiZSB1c2VkIGV2ZW4gaWYKLWludGVyd29ya2luZyBpcyBub3QgZ29pbmcgdG8gYmUgcGVyZm9ybWVkLgotCi1AY2luZGV4IEBjb2Rley5sdG9yZ30gZGlyZWN0aXZlLCBBUk0KLUBpdGVtIC5sdG9yZwotVGhpcyBkaXJlY3RpdmUgY2F1c2VzIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBsaXRlcmFsIHBvb2wgdG8gYmUKLWR1bXBlZCBpbnRvIHRoZSBjdXJyZW50IHNlY3Rpb24gKHdoaWNoIGlzIGFzc3VtZWQgdG8gYmUgdGhlIC50ZXh0Ci1zZWN0aW9uKSBhdCB0aGUgY3VycmVudCBsb2NhdGlvbiAoYWxpZ25lZCB0byBhIHdvcmQgYm91bmRhcnkpLgotCi1AY2luZGV4IEBjb2Rley5wb29sfSBkaXJlY3RpdmUsIEFSTQotQGl0ZW0gLnBvb2wKLVRoaXMgaXMgYSBzeW5vbnltIGZvciAubHRvcmcuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgQVJNIE9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLQotQGNpbmRleCBBUk0gb3Bjb2RlcwotQGNpbmRleCBvcGNvZGVzIGZvciBBUk0KLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBBUk0gb3Bjb2Rlcy4KLQotKlRPRE8qIERvY3VtZW50IHRoZSBwc2V1ZG8tb3BzIChhZHIsIG5vcCkKLQotR0FTIGZvciB0aGUgQVJNIHN1cHBvcnRzIGEgc3ludGhldGljIHJlZ2lzdGVyIGxvYWQgaW5zdHJ1Y3Rpb24gd2hvZXMKLXN5bnRheCBpczogCi0KLUBzbWFsbGV4YW1wbGUKLSAgbGRyIDxyZWdpc3Rlcj4gLCA9IDxleHByZXNzaW9uPgotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBudW1lcmljIGNvbnN0YW50IHRoZW4gYSBNT1Ygb3IgTVZOCi1pbnN0cnVjdGlvbiB3aWxsIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIExEUiBpbnN0cnVjdGlvbiwgaWYgdGhlCi1jb25zdGFudCBjYW4gYmUgZ2VuZXJhdGVkIGJ5IGVpdGhlciBvZiB0aGVzZSBpbnN0cnVjdGlvbnMuICBPdGhlcndpc2UKLXRoZSBjb25zdGFudCB3aWxsIGJlIHBsYWNlZCBpbnRvIHRoZSBuZWFyZXN0IGxpdGVyYWwgcG9vbCAoaWYgaXQgbm90Ci1hbHJlYWR5IHRoZXJlKSBhbmQgYSBQQyByZWxhdGl2ZSBMRFIgaW5zdHJ1Y3Rpb24gd2lsbCBiZSBnZW5lcmF0ZWQuCi0KLUZvciBpbmZvcm1hdGlvbiBvbiB0aGUgQVJNIG9yIFRodW1iIGluc3RydWN0aW9uIHNldHMsIHNlZSBAY2l0ZXtBUk0KLVNvZnR3YXJlIERldmVsb3BtZW50IFRvb2xraXQgUmVmZXJlbmNlIE1hbnVhbH0sIEFkdmFuY2VkIFJJU0MgTWFjaGluZXMKLUx0ZC4KLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWQxMHYudGV4aSBiL2dhcy9kb2MvYy1kMTB2LnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkN2JmODguLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWQxMHYudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgRDEwVi1EZXBlbmRlbnQKLUBjaGFwdGVyIEQxMFYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgRDEwViBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IEQxMFYgc3VwcG9ydAotQG1lbnUKLSogRDEwVi1PcHRzOjogICAgICAgICAgICAgICAgICAgRDEwViBPcHRpb25zCi0qIEQxMFYtU3ludGF4OjogICAgICAgICAgICAgICAgIFN5bnRheAotKiBEMTBWLUZsb2F0OjogICAgICAgICAgICAgICAgICBGbG9hdGluZyBQb2ludAotKiBEMTBWLU9wY29kZXM6OiAgICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgRDEwVi1PcHRzCi1Ac2VjdGlvbiBEMTBWIE9wdGlvbnMKLUBjaW5kZXggb3B0aW9ucywgRDEwVgotQGNpbmRleCBEMTBWIG9wdGlvbnMKLVRoZSBNaXRzdWJpc2hpIEQxMFYgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBoYXMgYSBmZXcgbWFjaGluZQotZGVwZW5kZW50IG9wdGlvbnMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gLU8KLVRoZSBEMTBWIGNhbiBvZnRlbiBleGVjdXRlIHR3byBzdWItaW5zdHJ1Y3Rpb25zIGluIHBhcmFsbGVsLiBXaGVuIHRoaXMgb3B0aW9uCi1pcyB1c2VkLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIGF0dGVtcHQgdG8gb3B0aW1pemUgaXRzIG91dHB1dCBieSBkZXRlY3Rpbmcgd2hlbgotaW5zdHJ1Y3Rpb25zIGNhbiBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbC4KLUBpdGVtIC0tbm93YXJuc3dhcAotVG8gb3B0aW1pemUgZXhlY3V0aW9uIHBlcmZvcm1hbmNlLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIHNvbWV0aW1lcyBzd2FwIHRoZQotb3JkZXIgb2YgaW5zdHJ1Y3Rpb25zLiBOb3JtYWxseSB0aGlzIGdlbmVyYXRlcyBhIHdhcm5pbmcuIFdoZW4gdGhpcyBvcHRpb24gCi1pcyB1c2VkLCBubyB3YXJuaW5nIHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gaW5zdHJ1Y3Rpb25zIGFyZSBzd2FwcGVkLgotQGVuZCB0YWJsZQotCi1Abm9kZSBEMTBWLVN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1AY2luZGV4IEQxMFYgc3ludGF4Ci1AY2luZGV4IHN5bnRheCwgRDEwVgotCi1UaGUgRDEwViBzeW50YXggaXMgYmFzZWQgb24gdGhlIHN5bnRheCBpbiBNaXRzdWJpc2hpJ3MgRDEwViBhcmNoaXRlY3R1cmUgbWFudWFsLgotVGhlIGRpZmZlcmVuY2VzIGFyZSBkZXRhaWxlZCBiZWxvdy4KLQotQG1lbnUKLSogRDEwVi1TaXplOjogICAgICAgICAgICAgICAgIFNpemUgTW9kaWZpZXJzCi0qIEQxMFYtU3Viczo6ICAgICAgICAgICAgICAgICBTdWItSW5zdHJ1Y3Rpb25zCi0qIEQxMFYtQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogRDEwVi1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCi0qIEQxMFYtQWRkcmVzc2luZzo6ICAgICAgICAgICBBZGRyZXNzaW5nIE1vZGVzCi0qIEQxMFYtV29yZDo6ICAgICAgICAgICAgICAgICBAQFdPUkQgTW9kaWZpZXIKLUBlbmQgbWVudQotCi0KLUBub2RlIEQxMFYtU2l6ZQotQHN1YnNlY3Rpb24gU2l6ZSBNb2RpZmllcnMKLUBjaW5kZXggRDEwViBzaXplIG1vZGlmaWVycwotQGNpbmRleCBzaXplIG1vZGlmaWVycywgRDEwVgotVGhlIEQxMFYgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSB1c2VzIHRoZSBpbnN0cnVjdGlvbiBuYW1lcyBpbiB0aGUgRDEwVgotQXJjaGl0ZWN0dXJlIE1hbnVhbC4gIEhvd2V2ZXIsIHRoZSBuYW1lcyBpbiB0aGUgbWFudWFsIGFyZSBzb21ldGltZXMgYW1iaWd1b3VzLgotVGhlcmUgYXJlIGluc3RydWN0aW9uIG5hbWVzIHRoYXQgY2FuIGFzc2VtYmxlIHRvIGEgc2hvcnQgb3IgbG9uZyBmb3JtIG9wY29kZS4KLUhvdyBkb2VzIHRoZSBhc3NlbWJsZXIgcGljayB0aGUgY29ycmVjdCBmb3JtPyAgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBhbHdheXMgcGljayB0aGUKLXNtYWxsZXN0IGZvcm0gaWYgaXQgY2FuLiAgV2hlbiBkZWFsaW5nIHdpdGggYSBzeW1ib2wgdGhhdCBpcyBub3QgZGVmaW5lZCB5ZXQgd2hlbiBhCi1saW5lIGlzIGJlaW5nIGFzc2VtYmxlZCwgaXQgd2lsbCBhbHdheXMgdXNlIHRoZSBsb25nIGZvcm0uICBJZiB5b3UgbmVlZCB0byBmb3JjZSB0aGUgCi1hc3NlbWJsZXIgdG8gdXNlIGVpdGhlciB0aGUgc2hvcnQgb3IgbG9uZyBmb3JtIG9mIHRoZSBpbnN0cnVjdGlvbiwgeW91IGNhbiBhcHBlbmQKLWVpdGhlciBAc2FtcHsuc30gKHNob3J0KSBvciBAc2FtcHsubH0gKGxvbmcpIHRvIGl0LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgd3JpdGluZyAKLWFuIGFzc2VtYmx5IHByb2dyYW0gYW5kIHlvdSB3YW50IHRvIGRvIGEgYnJhbmNoIHRvIGEgc3ltYm9sIHRoYXQgaXMgZGVmaW5lZCBsYXRlcgotaW4geW91ciBwcm9ncmFtLCB5b3UgY2FuIHdyaXRlIEBzYW1we2JyYS5zICAgZm9vfS4gIAotT2JqZHVtcCBhbmQgR0RCIHdpbGwgYWx3YXlzIGFwcGVuZCBAc2FtcHsuc30gb3IgQHNhbXB7Lmx9IHRvIGluc3RydWN0aW9ucyB3aGljaAotaGF2ZSBib3RoIHNob3J0IGFuZCBsb25nIGZvcm1zLgotCi1Abm9kZSBEMTBWLVN1YnMKLUBzdWJzZWN0aW9uIFN1Yi1JbnN0cnVjdGlvbnMKLUBjaW5kZXggRDEwViBzdWItaW5zdHJ1Y3Rpb25zCi1AY2luZGV4IHN1Yi1pbnN0cnVjdGlvbnMsIEQxMFYKLVRoZSBEMTBWIGFzc2VtYmxlciB0YWtlcyBhcyBpbnB1dCBhIHNlcmllcyBvZiBpbnN0cnVjdGlvbnMsIGVpdGhlciBvbmUtcGVyLWxpbmUsCi1vciBpbiB0aGUgc3BlY2lhbCB0d28tcGVyLWxpbmUgZm9ybWF0IGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLiAgU29tZSBvZiB0aGVzZQotaW5zdHJ1Y3Rpb25zIHdpbGwgYmUgc2hvcnQtZm9ybSBvciBzdWItaW5zdHJ1Y3Rpb25zLiAgVGhlc2Ugc3ViLWluc3RydWN0aW9ucyBjYW4gYmUgcGFja2VkCi1pbnRvIGEgc2luZ2xlIGluc3RydWN0aW9uLiAgVGhlIGFzc2VtYmxlciB3aWxsIGRvIHRoaXMgYXV0b21hdGljYWxseS4gIEl0IHdpbGwgYWxzbyBkZXRlY3QKLXdoZW4gaXQgc2hvdWxkIG5vdCBwYWNrIGluc3RydWN0aW9ucy4gIEZvciBleGFtcGxlLCB3aGVuIGEgbGFiZWwgaXMgZGVmaW5lZCwgdGhlIG5leHQKLWluc3RydWN0aW9uIHdpbGwgbmV2ZXIgYmUgcGFja2FnZWQgd2l0aCB0aGUgcHJldmlvdXMgb25lLiAgV2hlbmV2ZXIgYSBicmFuY2ggYW5kIGxpbmsKLWluc3RydWN0aW9uIGlzIGNhbGxlZCwgaXQgd2lsbCBub3QgYmUgcGFja2FnZWQgd2l0aCB0aGUgbmV4dCBpbnN0cnVjdGlvbiBzbyB0aGUgcmV0dXJuCi1hZGRyZXNzIHdpbGwgYmUgdmFsaWQuICBOb3BzIGFyZSBhdXRvbWF0aWNhbGx5IGluc2VydGVkIHdoZW4gbmVjZXNzYXJ5LgotCi1JZiB5b3UgZG8gbm90IHdhbnQgdGhlIGFzc2VtYmxlciBhdXRvbWF0aWNhbGx5IG1ha2luZyB0aGVzZSBkZWNpc2lvbnMsIHlvdSBjYW4gY29udHJvbAotdGhlIHBhY2thZ2luZyBhbmQgZXhlY3V0aW9uIHR5cGUgKHBhcmFsbGVsIG9yIHNlcXVlbnRpYWwpIHdpdGggdGhlIHNwZWNpYWwgZXhlY3V0aW9uIAotc3ltYm9scyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4gIAotCi1Abm9kZSBEMTBWLUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgRDEwVgotQGNpbmRleCBEMTBWIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUBzYW1wezt9IGFuZCBAc2FtcHsjfSBhcmUgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXJzLgotQGNpbmRleCBzdWItaW5zdHJ1Y3Rpb24gb3JkZXJpbmcsIEQxMFYKLUBjaW5kZXggRDEwViBzdWItaW5zdHJ1Y3Rpb24gb3JkZXJpbmcKLVN1Yi1pbnN0cnVjdGlvbnMgbWF5IGJlIGV4ZWN1dGVkIGluIG9yZGVyLCBpbiByZXZlcnNlLW9yZGVyLCBvciBpbiBwYXJhbGxlbC4KLUluc3RydWN0aW9ucyBsaXN0ZWQgaW4gdGhlIHN0YW5kYXJkIG9uZS1wZXItbGluZSBmb3JtYXQgd2lsbCBiZSBleGVjdXRlZCBzZXF1ZW50aWFsbHkuCi1UbyBzcGVjaWZ5IHRoZSBleGVjdXRpbmcgb3JkZXIsIHVzZSB0aGUgZm9sbG93aW5nIHN5bWJvbHM6IAotQHRhYmxlIEBzYW1wCi1AaXRlbSAtPgotU2VxdWVudGlhbCB3aXRoIGluc3RydWN0aW9uIG9uIHRoZSBsZWZ0IGZpcnN0LgotQGl0ZW0gPC0KLVNlcXVlbnRpYWwgd2l0aCBpbnN0cnVjdGlvbiBvbiB0aGUgcmlnaHQgZmlyc3QuCi1AaXRlbSB8fAotUGFyYWxsZWwKLUBlbmQgdGFibGUKLVRoZSBEMTBWIHN5bnRheCBhbGxvd3MgZWl0aGVyIG9uZSBpbnN0cnVjdGlvbiBwZXIgbGluZSwgb25lIGluc3RydWN0aW9uIHBlciBsaW5lIHdpdGgKLXRoZSBleGVjdXRpb24gc3ltYm9sLCBvciB0d28gaW5zdHJ1Y3Rpb25zIHBlciBsaW5lLiAgRm9yIGV4YW1wbGUKLUB0YWJsZSBAY29kZQotQGl0ZW0gYWJzICAgICAgIGExICAgICAgLT4gICAgICBhYnMgICAgIHIwCi1FeGVjdXRlIHRoZXNlIHNlcXVlbnRpYWxseS4gIFRoZSBpbnN0cnVjdGlvbiBvbiB0aGUgcmlnaHQgaXMgaW4gdGhlIHJpZ2h0Ci1jb250YWluZXIgYW5kIGlzIGV4ZWN1dGVkIHNlY29uZC4KLUBpdGVtIGFicyAgICAgICByMCAgICAgIDwtICAgICAgYWJzICAgICBhMQotRXhlY3V0ZSB0aGVzZSByZXZlcnNlLXNlcXVlbnRpYWxseS4gIFRoZSBpbnN0cnVjdGlvbiBvbiB0aGUgcmlnaHQgaXMgaW4gdGhlIHJpZ2h0Ci1jb250YWluZXIsIGFuZCBpcyBleGVjdXRlZCBmaXJzdC4KLUBpdGVtIGxkMncgICAgcjIsQEByOCsgICAgICAgICB8fCAgICAgIG1hYyAgICAgYTAscjAscjcKLUV4ZWN1dGUgdGhlc2UgaW4gcGFyYWxsZWwuCi1AaXRlbSBsZDJ3ICAgIHIyLEBAcjgrICAgICAgICAgfHwgICAgICAKLUBpdGVteCBtYWMgICAgIGEwLHIwLHI3Ci1Ud28tbGluZSBmb3JtYXQuIEV4ZWN1dGUgdGhlc2UgaW4gcGFyYWxsZWwuCi1AaXRlbSBsZDJ3ICAgIHIyLEBAcjgrICAgICAgICAgCi1AaXRlbXggbWFjICAgICBhMCxyMCxyNwotVHdvLWxpbmUgZm9ybWF0LiBFeGVjdXRlIHRoZXNlIHNlcXVlbnRpYWxseS4gIEFzc2VtYmxlciB3aWxsCi1wdXQgdGhlbSBpbiB0aGUgcHJvcGVyIGNvbnRhaW5lcnMuCi1AaXRlbSBsZDJ3ICAgIHIyLEBAcjgrICAgICAgICAgLT4KLUBpdGVteCBtYWMgICAgIGEwLHIwLHI3Ci1Ud28tbGluZSBmb3JtYXQuIEV4ZWN1dGUgdGhlc2Ugc2VxdWVudGlhbGx5LiAgU2FtZSBhcyBhYm92ZSBidXQKLXNlY29uZCBpbnN0cnVjdGlvbiB3aWxsIGFsd2F5cyBnbyBpbnRvIHJpZ2h0IGNvbnRhaW5lci4gIAotQGVuZCB0YWJsZQotQGNpbmRleCBzeW1ib2wgbmFtZXMsIEBzYW1weyR9IGluCi1AY2luZGV4IEBjb2RleyR9IGluIHN5bWJvbCBuYW1lcwotU2luY2UgQHNhbXB7JH0gaGFzIG5vIHNwZWNpYWwgbWVhbmluZywgeW91IG1heSB1c2UgaXQgaW4gc3ltYm9sIG5hbWVzLgotCi1Abm9kZSBEMTBWLVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi1AY2luZGV4IEQxMFYgcmVnaXN0ZXJzCi1AY2luZGV4IHJlZ2lzdGVycywgRDEwVgotWW91IGNhbiB1c2UgdGhlIHByZWRlZmluZWQgc3ltYm9scyBAc2FtcHtyMH0gdGhyb3VnaCBAc2FtcHtyMTV9IHRvIHJlZmVyIHRvIHRoZSBEMTBWIAotcmVnaXN0ZXJzLiAgWW91IGNhbiBhbHNvIHVzZSBAc2FtcHtzcH0gYXMgYW4gYWxpYXMgZm9yIEBzYW1we3IxNX0uICBUaGUgYWNjdW11bGF0b3JzCi1hcmUgQHNhbXB7YTB9IGFuZCBAc2FtcHthMX0uICBUaGVyZSBhcmUgc3BlY2lhbCByZWdpc3Rlci1wYWlyIG5hbWVzIHRoYXQgbWF5IAotb3B0aW9uYWxseSBiZSB1c2VkIGluIG9wY29kZXMgdGhhdCByZXF1aXJlIGV2ZW4tbnVtYmVyZWQgcmVnaXN0ZXJzLiBSZWdpc3RlciBuYW1lcyBhcmUgCi1ub3QgY2FzZSBzZW5zaXRpdmUuICAKLQotUmVnaXN0ZXIgUGFpcnMKLUB0YWJsZSBAY29kZQotQGl0ZW0gcjAtcjEKLUBpdGVtIHIyLXIzCi1AaXRlbSByNC1yNQotQGl0ZW0gcjYtcjcKLUBpdGVtIHI4LXI5Ci1AaXRlbSByMTAtcjExCi1AaXRlbSByMTItcjEzCi1AaXRlbSByMTQtcjE1Ci1AZW5kIHRhYmxlCi0KLVRoZSBEMTBWIGFsc28gaGFzIHByZWRlZmluZWQgc3ltYm9scyBmb3IgdGhlc2UgY29udHJvbCByZWdpc3RlcnMgYW5kIHN0YXR1cyBiaXRzOgotQHRhYmxlIEBjb2RlCi1AaXRlbSBwc3cKLVByb2Nlc3NvciBTdGF0dXMgV29yZAotQGl0ZW0gYnBzdwotQmFja3VwIFByb2Nlc3NvciBTdGF0dXMgV29yZAotQGl0ZW0gcGMKLVByb2dyYW0gQ291bnRlcgotQGl0ZW0gYnBjCi1CYWNrdXAgUHJvZ3JhbSBDb3VudGVyCi1AaXRlbSBycHRfYwotUmVwZWF0IENvdW50Ci1AaXRlbSBycHRfcwotUmVwZWF0IFN0YXJ0IGFkZHJlc3MKLUBpdGVtIHJwdF9lCi1SZXBlYXQgRW5kIGFkZHJlc3MKLUBpdGVtIG1vZF9zCi1Nb2R1bG8gU3RhcnQgYWRkcmVzcwotQGl0ZW0gbW9kX2UKLU1vZHVsbyBFbmQgYWRkcmVzcwotQGl0ZW0gaWJhCi1JbnN0cnVjdGlvbiBCcmVhayBBZGRyZXNzCi1AaXRlbSBmMAotRmxhZyAwCi1AaXRlbSBmMQotRmxhZyAxCi1AaXRlbSBjCi1DYXJyeSBmbGFnCi1AZW5kIHRhYmxlCi0gICAgICAgIAotQG5vZGUgRDEwVi1BZGRyZXNzaW5nCi1Ac3Vic2VjdGlvbiBBZGRyZXNzaW5nIE1vZGVzCi1AY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIEQxMFYKLUBjaW5kZXggRDEwViBhZGRyZXNzaW5nIG1vZGVzCi1AY29kZXtAdmFsdWV7QVN9fSB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgZm9yIHRoZSBEMTBWLgotQGNvZGV7UkB2YXJ7bn19IGluIHRoZSBmb2xsb3dpbmcgcmVmZXJzIHRvIGFueSBvZiB0aGUgbnVtYmVyZWQKLXJlZ2lzdGVycywgYnV0IEBlbXBoe25vdH0gdGhlIGNvbnRyb2wgcmVnaXN0ZXJzLgotQHRhYmxlIEBjb2RlCi1AaXRlbSBSQHZhcntufQotUmVnaXN0ZXIgZGlyZWN0Ci1AaXRlbSBAQFJAdmFye259Ci1SZWdpc3RlciBpbmRpcmVjdAotQGl0ZW0gQEBSQHZhcntufSsKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdC1pbmNyZW1lbnQKLUBpdGVtIEBAUkB2YXJ7bn0tCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3QtZGVjcmVtZW50Ci1AaXRlbSBAQC1TUAotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwcmUtZGVjcmVtZW50Ci1AaXRlbSBAQChAdmFye2Rpc3B9LCBSQHZhcntufSkKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggZGlzcGxhY2VtZW50Ci1AaXRlbSBAdmFye2FkZHJ9Ci1QQyByZWxhdGl2ZSBhZGRyZXNzIChmb3IgYnJhbmNoIG9yIHJlcCkuIAotQGl0ZW0gI0B2YXJ7aW1tfQotSW1tZWRpYXRlIGRhdGEgKHRoZSBAc2FtcHsjfSBpcyBvcHRpb25hbCBhbmQgaWdub3JlZCkKLUBlbmQgdGFibGUKLQotQG5vZGUgRDEwVi1Xb3JkCi1Ac3Vic2VjdGlvbiBAQFdPUkQgTW9kaWZpZXIKLUBjaW5kZXggRDEwViBAQHdvcmQgbW9kaWZpZXIKLUBjaW5kZXggQEB3b3JkIG1vZGlmaWVyLCBEMTBWCi1Bbnkgc3ltYm9sIGZvbGxvd2VkIGJ5IEBjb2Rle0BAd29yZH0gd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgc3ltYm9sJ3MgdmFsdWUKLXNoaWZ0ZWQgcmlnaHQgYnkgMi4gIFRoaXMgaXMgdXNlZCBpbiBzaXR1YXRpb25zIHN1Y2ggYXMgbG9hZGluZyBhIHJlZ2lzdGVyCi13aXRoIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gKG9yIGFueSBvdGhlciBjb2RlIGZyYWdtZW50KS4gIEZvciBleGFtcGxlLCBpZgoteW91IHdhbnQgdG8gbG9hZCBhIHJlZ2lzdGVyIHdpdGggdGhlIGxvY2F0aW9uIG9mIHRoZSBmdW5jdGlvbiBAY29kZXttYWlufSB0aGVuCi1qdW1wIHRvIHRoYXQgZnVuY3Rpb24sIHlvdSBjb3VsZCBkbyBpdCBhcyBmb2xsd3M6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLWxkaSAgICAgcjIsIG1haW5AQHdvcmQKLWptcCAgICAgcjIKLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIEQxMFYtRmxvYXQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBEMTBWCi1AY2luZGV4IEQxMFYgZmxvYXRpbmcgcG9pbnQKLVRoZSBEMTBWIGhhcyBubyBoYXJkd2FyZSBmbG9hdGluZyBwb2ludCwgYnV0IHRoZSBAY29kZXsuZmxvYXR9IGFuZCBAY29kZXsuZG91YmxlfQotZGlyZWN0aXZlcyBnZW5lcmF0ZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggb3RoZXIgZGV2ZWxvcG1lbnQgdG9vbHMuIAotCi1Abm9kZSBEMTBWLU9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLUBjaW5kZXggRDEwViBvcGNvZGUgc3VtbWFyeQotQGNpbmRleCBvcGNvZGUgc3VtbWFyeSwgRDEwVgotQGNpbmRleCBtbmVtb25pY3MsIEQxMFYKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gc3VtbWFyeSwgRDEwVgotRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBEMTBWIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUKLUBjaXRle0QxMFYgQXJjaGl0ZWN0dXJlOiBBIFZMSVcgTWljcm9wcm9jZXNzb3IgZm9yIE11bHRpbWVkaWEgQXBwbGljYXRpb25zfSAKLShNaXRzdWJpc2hpIEVsZWN0cmljIENvcnAuKS4KLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBEMTBWIG9wY29kZXMuICBUaGUgb25seSBjaGFuZ2VzIGFyZSB0aG9zZQotZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIG9uIHNpemUgbW9kaWZpZXJzCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1kMzB2LnRleGkgYi9nYXMvZG9jL2MtZDMwdi50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzFiMzQ0Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1kMzB2LnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIEQzMFYtRGVwZW5kZW50Ci1AY2hhcHRlciBEMzBWIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIEQzMFYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBEMzBWIHN1cHBvcnQKLUBtZW51Ci0qIEQzMFYtT3B0czo6ICAgICAgICAgICAgICAgICAgIEQzMFYgT3B0aW9ucwotKiBEMzBWLVN5bnRheDo6ICAgICAgICAgICAgICAgICBTeW50YXgKLSogRDMwVi1GbG9hdDo6ICAgICAgICAgICAgICAgICAgRmxvYXRpbmcgUG9pbnQKLSogRDMwVi1PcGNvZGVzOjogICAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEQzMFYtT3B0cwotQHNlY3Rpb24gRDMwViBPcHRpb25zCi1AY2luZGV4IG9wdGlvbnMsIEQzMFYKLUBjaW5kZXggRDMwViBvcHRpb25zCi1UaGUgTWl0c3ViaXNoaSBEMzBWIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gaGFzIGEgZmV3IG1hY2hpbmUKLWRlcGVuZGVudCBvcHRpb25zLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIC1PCi1UaGUgRDMwViBjYW4gb2Z0ZW4gZXhlY3V0ZSB0d28gc3ViLWluc3RydWN0aW9ucyBpbiBwYXJhbGxlbC4gV2hlbiB0aGlzIG9wdGlvbgotaXMgdXNlZCwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBhdHRlbXB0IHRvIG9wdGltaXplIGl0cyBvdXRwdXQgYnkgZGV0ZWN0aW5nIHdoZW4KLWluc3RydWN0aW9ucyBjYW4gYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuCi0KLUBpdGVtIC1uCi1XaGVuIHRoaXMgb3B0aW9uIGlzIHVzZWQsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgaXNzdWUgYSB3YXJuaW5nIGV2ZXJ5Ci10aW1lIGl0IGFkZHMgYSBub3AgaW5zdHJ1Y3Rpb24uCi0KLUBpdGVtIC1OCi1XaGVuIHRoaXMgb3B0aW9uIGlzIHVzZWQsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgaXNzdWUgYSB3YXJuaW5nIGlmIGl0Ci1uZWVkcyB0byBpbnNlcnQgYSBub3AgYWZ0ZXIgYSAzMi1iaXQgbXVsdGlwbHkgYmVmb3JlIGEgbG9hZCBvciAxNi1iaXQKLW11bHRpcGx5IGluc3RydWN0aW9uLgotQGVuZCB0YWJsZQotCi1Abm9kZSBEMzBWLVN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1AY2luZGV4IEQzMFYgc3ludGF4Ci1AY2luZGV4IHN5bnRheCwgRDMwVgotCi1UaGUgRDMwViBzeW50YXggaXMgYmFzZWQgb24gdGhlIHN5bnRheCBpbiBNaXRzdWJpc2hpJ3MgRDMwViBhcmNoaXRlY3R1cmUgbWFudWFsLgotVGhlIGRpZmZlcmVuY2VzIGFyZSBkZXRhaWxlZCBiZWxvdy4KLQotQG1lbnUKLSogRDMwVi1TaXplOjogICAgICAgICAgICAgICAgIFNpemUgTW9kaWZpZXJzCi0qIEQzMFYtU3Viczo6ICAgICAgICAgICAgICAgICBTdWItSW5zdHJ1Y3Rpb25zCi0qIEQzMFYtQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogRDMwVi1HdWFyZGVkOjogICAgICAgICAgICAgIEd1YXJkZWQgRXhlY3V0aW9uCi0qIEQzMFYtUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotKiBEMzBWLUFkZHJlc3Npbmc6OiAgICAgICAgICAgQWRkcmVzc2luZyBNb2RlcwotQGVuZCBtZW51Ci0KLQotQG5vZGUgRDMwVi1TaXplCi1Ac3Vic2VjdGlvbiBTaXplIE1vZGlmaWVycwotQGNpbmRleCBEMzBWIHNpemUgbW9kaWZpZXJzCi1AY2luZGV4IHNpemUgbW9kaWZpZXJzLCBEMzBWCi1UaGUgRDMwViB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IHVzZXMgdGhlIGluc3RydWN0aW9uIG5hbWVzIGluIHRoZSBEMzBWCi1BcmNoaXRlY3R1cmUgTWFudWFsLiAgSG93ZXZlciwgdGhlIG5hbWVzIGluIHRoZSBtYW51YWwgYXJlIHNvbWV0aW1lcyBhbWJpZ3VvdXMuCi1UaGVyZSBhcmUgaW5zdHJ1Y3Rpb24gbmFtZXMgdGhhdCBjYW4gYXNzZW1ibGUgdG8gYSBzaG9ydCBvciBsb25nIGZvcm0gb3Bjb2RlLgotSG93IGRvZXMgdGhlIGFzc2VtYmxlciBwaWNrIHRoZSBjb3JyZWN0IGZvcm0/ICBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIGFsd2F5cyBwaWNrIHRoZQotc21hbGxlc3QgZm9ybSBpZiBpdCBjYW4uICBXaGVuIGRlYWxpbmcgd2l0aCBhIHN5bWJvbCB0aGF0IGlzIG5vdCBkZWZpbmVkIHlldCB3aGVuIGEKLWxpbmUgaXMgYmVpbmcgYXNzZW1ibGVkLCBpdCB3aWxsIGFsd2F5cyB1c2UgdGhlIGxvbmcgZm9ybS4gIElmIHlvdSBuZWVkIHRvIGZvcmNlIHRoZSAKLWFzc2VtYmxlciB0byB1c2UgZWl0aGVyIHRoZSBzaG9ydCBvciBsb25nIGZvcm0gb2YgdGhlIGluc3RydWN0aW9uLCB5b3UgY2FuIGFwcGVuZAotZWl0aGVyIEBzYW1wey5zfSAoc2hvcnQpIG9yIEBzYW1wey5sfSAobG9uZykgdG8gaXQuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSB3cml0aW5nIAotYW4gYXNzZW1ibHkgcHJvZ3JhbSBhbmQgeW91IHdhbnQgdG8gZG8gYSBicmFuY2ggdG8gYSBzeW1ib2wgdGhhdCBpcyBkZWZpbmVkIGxhdGVyCi1pbiB5b3VyIHByb2dyYW0sIHlvdSBjYW4gd3JpdGUgQHNhbXB7YnJhLnMgZm9vfS4gCi1PYmpkdW1wIGFuZCBHREIgd2lsbCBhbHdheXMgYXBwZW5kIEBzYW1wey5zfSBvciBAc2FtcHsubH0gdG8gaW5zdHJ1Y3Rpb25zIHdoaWNoCi1oYXZlIGJvdGggc2hvcnQgYW5kIGxvbmcgZm9ybXMuCi0KLUBub2RlIEQzMFYtU3VicwotQHN1YnNlY3Rpb24gU3ViLUluc3RydWN0aW9ucwotQGNpbmRleCBEMzBWIHN1Yi1pbnN0cnVjdGlvbnMKLUBjaW5kZXggc3ViLWluc3RydWN0aW9ucywgRDMwVgotVGhlIEQzMFYgYXNzZW1ibGVyIHRha2VzIGFzIGlucHV0IGEgc2VyaWVzIG9mIGluc3RydWN0aW9ucywgZWl0aGVyIG9uZS1wZXItbGluZSwKLW9yIGluIHRoZSBzcGVjaWFsIHR3by1wZXItbGluZSBmb3JtYXQgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uICBTb21lIG9mIHRoZXNlCi1pbnN0cnVjdGlvbnMgd2lsbCBiZSBzaG9ydC1mb3JtIG9yIHN1Yi1pbnN0cnVjdGlvbnMuICBUaGVzZSBzdWItaW5zdHJ1Y3Rpb25zIGNhbiBiZSBwYWNrZWQKLWludG8gYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uICBUaGUgYXNzZW1ibGVyIHdpbGwgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LiAgSXQgd2lsbCBhbHNvIGRldGVjdAotd2hlbiBpdCBzaG91bGQgbm90IHBhY2sgaW5zdHJ1Y3Rpb25zLiAgRm9yIGV4YW1wbGUsIHdoZW4gYSBsYWJlbCBpcyBkZWZpbmVkLCB0aGUgbmV4dAotaW5zdHJ1Y3Rpb24gd2lsbCBuZXZlciBiZSBwYWNrYWdlZCB3aXRoIHRoZSBwcmV2aW91cyBvbmUuICBXaGVuZXZlciBhIGJyYW5jaCBhbmQgbGluawotaW5zdHJ1Y3Rpb24gaXMgY2FsbGVkLCBpdCB3aWxsIG5vdCBiZSBwYWNrYWdlZCB3aXRoIHRoZSBuZXh0IGluc3RydWN0aW9uIHNvIHRoZSByZXR1cm4KLWFkZHJlc3Mgd2lsbCBiZSB2YWxpZC4gIE5vcHMgYXJlIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgd2hlbiBuZWNlc3NhcnkuCi0KLUlmIHlvdSBkbyBub3Qgd2FudCB0aGUgYXNzZW1ibGVyIGF1dG9tYXRpY2FsbHkgbWFraW5nIHRoZXNlIGRlY2lzaW9ucywgeW91IGNhbiBjb250cm9sCi10aGUgcGFja2FnaW5nIGFuZCBleGVjdXRpb24gdHlwZSAocGFyYWxsZWwgb3Igc2VxdWVudGlhbCkgd2l0aCB0aGUgc3BlY2lhbCBleGVjdXRpb24gCi1zeW1ib2xzIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLiAgCi0KLUBub2RlIEQzMFYtQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBEMzBWCi1AY2luZGV4IEQzMFYgbGluZSBjb21tZW50IGNoYXJhY3RlcgotQHNhbXB7O30gYW5kIEBzYW1weyN9IGFyZSB0aGUgbGluZSBjb21tZW50IGNoYXJhY3RlcnMuCi1AY2luZGV4IHN1Yi1pbnN0cnVjdGlvbiBvcmRlcmluZywgRDMwVgotQGNpbmRleCBEMzBWIHN1Yi1pbnN0cnVjdGlvbiBvcmRlcmluZwotU3ViLWluc3RydWN0aW9ucyBtYXkgYmUgZXhlY3V0ZWQgaW4gb3JkZXIsIGluIHJldmVyc2Utb3JkZXIsIG9yIGluIHBhcmFsbGVsLgotSW5zdHJ1Y3Rpb25zIGxpc3RlZCBpbiB0aGUgc3RhbmRhcmQgb25lLXBlci1saW5lIGZvcm1hdCB3aWxsIGJlIGV4ZWN1dGVkCi1zZXF1ZW50aWFsbHkgdW5sZXNzIHlvdSB1c2UgdGhlIEBzYW1wey1PfSBvcHRpb24uCi0KLVRvIHNwZWNpZnkgdGhlIGV4ZWN1dGluZyBvcmRlciwgdXNlIHRoZSBmb2xsb3dpbmcgc3ltYm9sczogCi1AdGFibGUgQHNhbXAKLUBpdGVtIC0+Ci1TZXF1ZW50aWFsIHdpdGggaW5zdHJ1Y3Rpb24gb24gdGhlIGxlZnQgZmlyc3QuCi0KLUBpdGVtIDwtCi1TZXF1ZW50aWFsIHdpdGggaW5zdHJ1Y3Rpb24gb24gdGhlIHJpZ2h0IGZpcnN0LgotCi1AaXRlbSB8fAotUGFyYWxsZWwKLUBlbmQgdGFibGUKLQotVGhlIEQzMFYgc3ludGF4IGFsbG93cyBlaXRoZXIgb25lIGluc3RydWN0aW9uIHBlciBsaW5lLCBvbmUgaW5zdHJ1Y3Rpb24gcGVyIGxpbmUgd2l0aAotdGhlIGV4ZWN1dGlvbiBzeW1ib2wsIG9yIHR3byBpbnN0cnVjdGlvbnMgcGVyIGxpbmUuICBGb3IgZXhhbXBsZQotQHRhYmxlIEBjb2RlCi1AaXRlbSBhYnMgcjIscjMgLT4gYWJzIHI0LHI1Ci1FeGVjdXRlIHRoZXNlIHNlcXVlbnRpYWxseS4gIFRoZSBpbnN0cnVjdGlvbiBvbiB0aGUgcmlnaHQgaXMgaW4gdGhlIHJpZ2h0Ci1jb250YWluZXIgYW5kIGlzIGV4ZWN1dGVkIHNlY29uZC4KLQotQGl0ZW0gYWJzIHIyLHIzIDwtIGFicyByNCxyNQotRXhlY3V0ZSB0aGVzZSByZXZlcnNlLXNlcXVlbnRpYWxseS4gIFRoZSBpbnN0cnVjdGlvbiBvbiB0aGUgcmlnaHQgaXMgaW4gdGhlIHJpZ2h0Ci1jb250YWluZXIsIGFuZCBpcyBleGVjdXRlZCBmaXJzdC4KLQotQGl0ZW0gYWJzIHIyLHIzIHx8IGFicyByNCxyNQotRXhlY3V0ZSB0aGVzZSBpbiBwYXJhbGxlbC4KLQotQGl0ZW0gbGR3IHIyLEBAKHIzLHI0KSB8fAotQGl0ZW14IG11bHggcjYscjgscjkKLVR3by1saW5lIGZvcm1hdC4gRXhlY3V0ZSB0aGVzZSBpbiBwYXJhbGxlbC4KLQotQGl0ZW0gbXVseCBhMCxyOCxyOQotQGl0ZW14IHN0dyByMixAQChyMyxyNCkKLVR3by1saW5lIGZvcm1hdC4gRXhlY3V0ZSB0aGVzZSBzZXF1ZW50aWFsbHkgdW5sZXNzIEBzYW1wey1PfSBvcHRpb24gaXMKLXVzZWQuICBJZiB0aGUgQHNhbXB7LU99IG9wdGlvbiBpcyB1c2VkLCB0aGUgYXNzZW1ibGVyIHdpbGwgZGV0ZXJtaW5lIGlmCi10aGUgaW5zdHJ1Y3Rpb25zIGNvdWxkIGJlIGRvbmUgaW4gcGFyYWxsZWwgKHRoZSBhYm92ZSB0d28gaW5zdHJ1Y3Rpb25zCi1jYW4gYmUgZG9uZSBpbiBwYXJhbGxlbCksIGFuZCBpZiBzbywgZW1pdCB0aGVtIGFzIHBhcmFsbGVsIGluc3RydWN0aW9ucy4KLVRoZSBhc3NlbWJsZXIgd2lsbCBwdXQgdGhlbSBpbiB0aGUgcHJvcGVyIGNvbnRhaW5lcnMuICBJbiB0aGUgYWJvdmUKLWV4YW1wbGUsIHRoZSBhc3NlbWJsZXIgd2lsbCBwdXQgdGhlIEBzYW1we3N0d30gaW5zdHJ1Y3Rpb24gaW4gbGVmdAotY29udGFpbmVyIGFuZCB0aGUgQHNhbXB7bXVseH0gaW5zdHJ1Y3Rpb24gaW4gdGhlIHJpZ2h0IGNvbnRhaW5lci4KLQotQGl0ZW0gc3R3IHIyLEBAKHIzLHI0KSAtPgotQGl0ZW14IG11bHggYTAscjgscjkKLVR3by1saW5lIGZvcm1hdC4gIEV4ZWN1dGUgdGhlIEBzYW1we3N0d30gaW5zdHJ1Y3Rpb24gZm9sbG93ZWQgYnkgdGhlCi1Ac2FtcHttdWx4fSBpbnN0cnVjdGlvbiBzZXF1ZW50aWFsbHkuICBUaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gZ29lcyBpbiB0aGUKLWxlZnQgY29udGFpbmVyIGFuZCB0aGUgc2Vjb25kIGluc3RydWN0aW9uIGdvZXMgaW50byByaWdodCBjb250YWluZXIuCi1UaGUgYXNzZW1ibGVyIHdpbGwgZ2l2ZSBhbiBlcnJvciBpZiB0aGUgbWFjaGluZSBvcmRlcmluZyBjb25zdHJhaW50cyBhcmUKLXZpb2xhdGVkLgotCi1AaXRlbSBzdHcgcjIsQEAocjMscjQpIDwtCi1AaXRlbXggbXVseCBhMCxyOCxyOQotU2FtZSBhcyBwcmV2aW91cyBleGFtcGxlLCBleGNlcHQgdGhhdCB0aGUgQHNhbXB7bXVseH0gaW5zdHJ1Y3Rpb24gaXMKLWV4ZWN1dGVkIGJlZm9yZSB0aGUgQHNhbXB7c3R3fSBpbnN0cnVjdGlvbi4KLUBlbmQgdGFibGUKLQotQGNpbmRleCBzeW1ib2wgbmFtZXMsIEBzYW1weyR9IGluCi1AY2luZGV4IEBjb2RleyR9IGluIHN5bWJvbCBuYW1lcwotU2luY2UgQHNhbXB7JH0gaGFzIG5vIHNwZWNpYWwgbWVhbmluZywgeW91IG1heSB1c2UgaXQgaW4gc3ltYm9sIG5hbWVzLgotCi1Abm9kZSBEMzBWLUd1YXJkZWQKLUBzdWJzZWN0aW9uIEd1YXJkZWQgRXhlY3V0aW9uCi1AY2luZGV4IEQzMFYgR3VhcmRlZCBFeGVjdXRpb24KLUBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIHRoZSBmdWxsIHJhbmdlIG9mIGd1YXJkZWQgZXhlY3V0aW9uCi1kaXJlY3RpdmVzIGZvciBlYWNoIGluc3RydWN0aW9uLiAgSnVzdCBhcHBlbmQgdGhlIGRpcmVjdGl2ZSBhZnRlciB0aGUKLWluc3RydWN0aW9uIHByb3Blci4gIFRoZSBkaXJlY3RpdmVzIGFyZToKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSAvdHgKLUV4ZWN1dGUgdGhlIGluc3RydWN0aW9uIGlmIGZsYWcgZjAgaXMgdHJ1ZS4KLUBpdGVtIC9meAotRXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24gaWYgZmxhZyBmMCBpcyBmYWxzZS4KLUBpdGVtIC94dAotRXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24gaWYgZmxhZyBmMSBpcyB0cnVlLgotQGl0ZW0gL3hmCi1FeGVjdXRlIHRoZSBpbnN0cnVjdGlvbiBpZiBmbGFnIGYxIGlzIGZhbHNlLgotQGl0ZW0gL3R0Ci1FeGVjdXRlIHRoZSBpbnN0cnVjdGlvbiBpZiBib3RoIGZsYWdzIGYwIGFuZCBmMSBhcmUgdHJ1ZS4KLUBpdGVtIC90ZgotRXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24gaWYgZmxhZyBmMCBpcyB0cnVlIGFuZCBmbGFnIGYxIGlzIGZhbHNlLgotQGVuZCB0YWJsZQotCi1Abm9kZSBEMzBWLVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi1AY2luZGV4IEQzMFYgcmVnaXN0ZXJzCi1AY2luZGV4IHJlZ2lzdGVycywgRDMwVgotWW91IGNhbiB1c2UgdGhlIHByZWRlZmluZWQgc3ltYm9scyBAc2FtcHtyMH0gdGhyb3VnaCBAc2FtcHtyNjN9IHRvIHJlZmVyCi10byB0aGUgRDMwViByZWdpc3RlcnMuICBZb3UgY2FuIGFsc28gdXNlIEBzYW1we3NwfSBhcyBhbiBhbGlhcyBmb3IKLUBzYW1we3I2M30gYW5kIEBzYW1we2xpbmt9IGFzIGFuIGFsaWFzIGZvciBAc2FtcHtyNjJ9LiAgVGhlIGFjY3VtdWxhdG9ycwotYXJlIEBzYW1we2EwfSBhbmQgQHNhbXB7YTF9LgotCi1UaGUgRDMwViBhbHNvIGhhcyBwcmVkZWZpbmVkIHN5bWJvbHMgZm9yIHRoZXNlIGNvbnRyb2wgcmVnaXN0ZXJzIGFuZCBzdGF0dXMgYml0czoKLUB0YWJsZSBAY29kZQotQGl0ZW0gcHN3Ci1Qcm9jZXNzb3IgU3RhdHVzIFdvcmQKLUBpdGVtIGJwc3cKLUJhY2t1cCBQcm9jZXNzb3IgU3RhdHVzIFdvcmQKLUBpdGVtIHBjCi1Qcm9ncmFtIENvdW50ZXIKLUBpdGVtIGJwYwotQmFja3VwIFByb2dyYW0gQ291bnRlcgotQGl0ZW0gcnB0X2MKLVJlcGVhdCBDb3VudAotQGl0ZW0gcnB0X3MKLVJlcGVhdCBTdGFydCBhZGRyZXNzCi1AaXRlbSBycHRfZQotUmVwZWF0IEVuZCBhZGRyZXNzCi1AaXRlbSBtb2RfcwotTW9kdWxvIFN0YXJ0IGFkZHJlc3MKLUBpdGVtIG1vZF9lCi1Nb2R1bG8gRW5kIGFkZHJlc3MKLUBpdGVtIGliYQotSW5zdHJ1Y3Rpb24gQnJlYWsgQWRkcmVzcwotQGl0ZW0gZjAKLUZsYWcgMAotQGl0ZW0gZjEKLUZsYWcgMQotQGl0ZW0gZjIKLUZsYWcgMgotQGl0ZW0gZjMKLUZsYWcgMwotQGl0ZW0gZjQKLUZsYWcgNAotQGl0ZW0gZjUKLUZsYWcgNQotQGl0ZW0gZjYKLUZsYWcgNgotQGl0ZW0gZjcKLUZsYWcgNwotQGl0ZW0gcwotU2FtZSBhcyBmbGFnIDQgKHNhdHVyYXRpb24gZmxhZykKLUBpdGVtIHYKLVNhbWUgYXMgZmxhZyA1IChvdmVyZmxvdyBmbGFnKQotQGl0ZW0gdmEKLVNhbWUgYXMgZmxhZyA2IChzdGlja3kgb3ZlcmZsb3cgZmxhZykKLUBpdGVtIGMKLVNhbWUgYXMgZmxhZyA3IChjYXJyeS9ib3Jyb3cgZmxhZykKLUBpdGVtIGIKLVNhbWUgYXMgZmxhZyA3IChjYXJyeS9ib3Jyb3cgZmxhZykKLUBlbmQgdGFibGUKLSAgICAgICAgCi1Abm9kZSBEMzBWLUFkZHJlc3NpbmcKLUBzdWJzZWN0aW9uIEFkZHJlc3NpbmcgTW9kZXMKLUBjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgRDMwVgotQGNpbmRleCBEMzBWIGFkZHJlc3NpbmcgbW9kZXMKLUBjb2Rle0B2YWx1ZXtBU319IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgYWRkcmVzc2luZyBtb2RlcyBmb3IgdGhlIEQzMFYuCi1AY29kZXtSQHZhcntufX0gaW4gdGhlIGZvbGxvd2luZyByZWZlcnMgdG8gYW55IG9mIHRoZSBudW1iZXJlZAotcmVnaXN0ZXJzLCBidXQgQGVtcGh7bm90fSB0aGUgY29udHJvbCByZWdpc3RlcnMuCi1AdGFibGUgQGNvZGUKLUBpdGVtIFJAdmFye259Ci1SZWdpc3RlciBkaXJlY3QKLUBpdGVtIEBAUkB2YXJ7bn0KLVJlZ2lzdGVyIGluZGlyZWN0Ci1AaXRlbSBAQFJAdmFye259KwotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0LWluY3JlbWVudAotQGl0ZW0gQEBSQHZhcntufS0KLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdC1kZWNyZW1lbnQKLUBpdGVtIEBALVNQCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHByZS1kZWNyZW1lbnQKLUBpdGVtIEBAKEB2YXJ7ZGlzcH0sIFJAdmFye259KQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBkaXNwbGFjZW1lbnQKLUBpdGVtIEB2YXJ7YWRkcn0KLVBDIHJlbGF0aXZlIGFkZHJlc3MgKGZvciBicmFuY2ggb3IgcmVwKS4gCi1AaXRlbSAjQHZhcntpbW19Ci1JbW1lZGlhdGUgZGF0YSAodGhlIEBzYW1weyN9IGlzIG9wdGlvbmFsIGFuZCBpZ25vcmVkKQotQGVuZCB0YWJsZQotCi1Abm9kZSBEMzBWLUZsb2F0Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgRDMwVgotQGNpbmRleCBEMzBWIGZsb2F0aW5nIHBvaW50Ci1UaGUgRDMwViBoYXMgbm8gaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQsIGJ1dCB0aGUgQGNvZGV7LmZsb2F0fSBhbmQgQGNvZGV7LmRvdWJsZX0KLWRpcmVjdGl2ZXMgZ2VuZXJhdGVzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIG90aGVyIGRldmVsb3BtZW50IHRvb2xzLiAKLQotQG5vZGUgRDMwVi1PcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi1AY2luZGV4IEQzMFYgb3Bjb2RlIHN1bW1hcnkKLUBjaW5kZXggb3Bjb2RlIHN1bW1hcnksIEQzMFYKLUBjaW5kZXggbW5lbW9uaWNzLCBEMzBWCi1AY2luZGV4IGluc3RydWN0aW9uIHN1bW1hcnksIEQzMFYKLUZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgRDMwViBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCi1AY2l0ZXtEMzBWIEFyY2hpdGVjdHVyZTogQSBWTElXIE1pY3JvcHJvY2Vzc29yIGZvciBNdWx0aW1lZGlhIEFwcGxpY2F0aW9uc30gCi0oTWl0c3ViaXNoaSBFbGVjdHJpYyBDb3JwLikuCi1AY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRzIGFsbCB0aGUgc3RhbmRhcmQgRDMwViBvcGNvZGVzLiAgVGhlIG9ubHkgY2hhbmdlcyBhcmUgdGhvc2UKLWRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiBvbiBzaXplIG1vZGlmaWVycwotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtaDgzMDAudGV4aSBiL2dhcy9kb2MvYy1oODMwMC50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjcwOTE4Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1oODMwMC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1AZW5kIGlmc2V0Ci1Abm9kZSBIOC8zMDAtRGVwZW5kZW50Ci1AY2hhcHRlciBIOC8zMDAgRGVwZW5kZW50IEZlYXR1cmVzCi0KLUBjaW5kZXggSDgvMzAwIHN1cHBvcnQKLUBtZW51Ci0qIEg4LzMwMCBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKLSogSDgvMzAwIFN5bnRheDo6ICAgICAgICAgICAgICAgU3ludGF4Ci0qIEg4LzMwMCBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIEg4LzMwMCBEaXJlY3RpdmVzOjogICAgICAgICAgIEg4LzMwMCBNYWNoaW5lIERpcmVjdGl2ZXMKLSogSDgvMzAwIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEg4LzMwMCBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi0KLUBjaW5kZXggSDgvMzAwIG9wdGlvbnMgKG5vbmUpCi1AY2luZGV4IG9wdGlvbnMsIEg4LzMwMCAobm9uZSkKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgSGl0YWNoaQotSDgvMzAwIGZhbWlseS4KLQotQG5vZGUgSDgvMzAwIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1AbWVudQotKiBIOC8zMDAtQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogSDgvMzAwLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLSogSDgvMzAwLUFkZHJlc3Npbmc6OiAgICAgICAgICAgQWRkcmVzc2luZyBNb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEg4LzMwMC1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi0KLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgSDgvMzAwCi1AY2luZGV4IEg4LzMwMCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Ac2FtcHs7fSBpcyB0aGUgbGluZSBjb21tZW50IGNoYXJhY3Rlci4KLQotQGNpbmRleCBsaW5lIHNlcGFyYXRvciwgSDgvMzAwCi1AY2luZGV4IHN0YXRlbWVudCBzZXBhcmF0b3IsIEg4LzMwMAotQGNpbmRleCBIOC8zMDAgbGluZSBzZXBhcmF0b3IKLUBzYW1weyR9IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBuZXdsaW5lIHRvIHNlcGFyYXRlIHN0YXRlbWVudHMuCi1UaGVyZWZvcmUgQGVtcGh7eW91IG1heSBub3QgdXNlIEBzYW1weyR9IGluIHN5bWJvbCBuYW1lc30gb24gdGhlIEg4LzMwMC4KLQotQG5vZGUgSDgvMzAwLVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi0KLUBjaW5kZXggSDgvMzAwIHJlZ2lzdGVycwotQGNpbmRleCByZWdpc3RlciBuYW1lcywgSDgvMzAwCi1Zb3UgY2FuIHVzZSBwcmVkZWZpbmVkIHN5bWJvbHMgb2YgdGhlIGZvcm0gQHNhbXB7ckB2YXJ7bn1ofSBhbmQKLUBzYW1we3JAdmFye259bH0gdG8gcmVmZXIgdG8gdGhlIEg4LzMwMCByZWdpc3RlcnMgYXMgc2l4dGVlbiA4LWJpdAotZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycy4gIEB2YXJ7bn0gaXMgYSBkaWdpdCBmcm9tIEBzYW1wezB9IHRvCi1Ac2FtcHs3fSk7IGZvciBpbnN0YW5jZSwgYm90aCBAc2FtcHtyMGh9IGFuZCBAc2FtcHtyN2x9IGFyZSB2YWxpZAotcmVnaXN0ZXIgbmFtZXMuCi0KLVlvdSBjYW4gYWxzbyB1c2UgdGhlIGVpZ2h0IHByZWRlZmluZWQgc3ltYm9scyBAc2FtcHtyQHZhcntufX0gdG8gcmVmZXIKLXRvIHRoZSBIOC8zMDAgcmVnaXN0ZXJzIGFzIDE2LWJpdCByZWdpc3RlcnMgKHlvdSBtdXN0IHVzZSB0aGlzIGZvcm0gZm9yCi1hZGRyZXNzaW5nKS4KLQotT24gdGhlIEg4LzMwMEgsIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGVpZ2h0IHByZWRlZmluZWQgc3ltYm9scwotQHNhbXB7ZXJAdmFye259fSAoQHNhbXB7ZXIwfSBAZG90c3t9IEBzYW1we2VyN30pIHRvIHJlZmVyIHRvIHRoZSAzMi1iaXQKLWdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMuCi0KLVRoZSB0d28gY29udHJvbCByZWdpc3RlcnMgYXJlIGNhbGxlZCBAY29kZXtwY30gKHByb2dyYW0gY291bnRlcjsgYQotMTYtYml0IHJlZ2lzdGVyLCBleGNlcHQgb24gdGhlIEg4LzMwMEggd2hlcmUgaXQgaXMgMjQgYml0cykgYW5kCi1AY29kZXtjY3J9IChjb25kaXRpb24gY29kZSByZWdpc3RlcjsgYW4gOC1iaXQgcmVnaXN0ZXIpLiAgQGNvZGV7cjd9IGlzCi11c2VkIGFzIHRoZSBzdGFjayBwb2ludGVyLCBhbmQgY2FuIGFsc28gYmUgY2FsbGVkIEBjb2Rle3NwfS4KLQotQG5vZGUgSDgvMzAwLUFkZHJlc3NpbmcKLUBzdWJzZWN0aW9uIEFkZHJlc3NpbmcgTW9kZXMKLQotQGNpbmRleCBhZGRyZXNzaW5nIG1vZGVzLCBIOC8zMDAKLUBjaW5kZXggSDgvMzAwIGFkZHJlc3NpbmcgbW9kZXMKLUB2YWx1ZXtBU30gdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBhZGRyZXNzaW5nIG1vZGVzIGZvciB0aGUgSDgvMzAwOgotQHRhYmxlIEBjb2RlCi1AaXRlbSByQHZhcntufQotUmVnaXN0ZXIgZGlyZWN0Ci0KLUBpdGVtIEBAckB2YXJ7bn0KLVJlZ2lzdGVyIGluZGlyZWN0Ci0KLUBuZWVkIDEyMDAKLUBpdGVtIEBAKEB2YXJ7ZH0sIHJAdmFye259KQotQGl0ZW14IEBAKEB2YXJ7ZH06MTYsIHJAdmFye259KQotQGl0ZW14IEBAKEB2YXJ7ZH06MjQsIHJAdmFye259KQotUmVnaXN0ZXIgaW5kaXJlY3Q6IDE2LWJpdCBvciAyNC1iaXQgZGlzcGxhY2VtZW50IEB2YXJ7ZH0gZnJvbSByZWdpc3RlcgotQHZhcntufS4gICgyNC1iaXQgZGlzcGxhY2VtZW50cyBhcmUgb25seSBtZWFuaW5nZnVsIG9uIHRoZSBIOC8zMDBILikKLQotQGl0ZW0gQEByQHZhcntufSsKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdC1pbmNyZW1lbnQKLQotQGl0ZW0gQEAtckB2YXJ7bn0KLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcHJlLWRlY3JlbWVudAotCi1AaXRlbSBAY29kZXtAQH1AdmFye2FhfQotQGl0ZW14IEBjb2Rle0BAfUB2YXJ7YWF9OjgKLUBpdGVteCBAY29kZXtAQH1AdmFye2FhfToxNgotQGl0ZW14IEBjb2Rle0BAfUB2YXJ7YWF9OjI0Ci1BYnNvbHV0ZSBhZGRyZXNzIEBjb2Rle2FhfS4gIChUaGUgYWRkcmVzcyBzaXplIEBzYW1wezoyNH0gb25seSBtYWtlcwotc2Vuc2Ugb24gdGhlIEg4LzMwMEguKQotCi1AaXRlbSAjQHZhcnt4eH0KLUBpdGVteCAjQHZhcnt4eH06OAotQGl0ZW14ICNAdmFye3h4fToxNgotQGl0ZW14ICNAdmFye3h4fTozMgotSW1tZWRpYXRlIGRhdGEgQHZhcnt4eH0uICBZb3UgbWF5IHNwZWNpZnkgdGhlIEBzYW1wezo4fSwgQHNhbXB7OjE2fSwgb3IKLUBzYW1wezozMn0gZm9yIGNsYXJpdHksIGlmIHlvdSB3aXNoOyBidXQgQGNvZGV7QHZhbHVle0FTfX0gbmVpdGhlcgotcmVxdWlyZXMgdGhpcyBub3IgdXNlcyBpdC0tLXRoZSBkYXRhIHNpemUgcmVxdWlyZWQgaXMgdGFrZW4gZnJvbQotY29udGV4dC4KLQotQGl0ZW0gQGNvZGV7QEB9QGNvZGV7QEB9QHZhcnthYX0KLUBpdGVteCBAY29kZXtAQH1AY29kZXtAQH1AdmFye2FhfTo4Ci1NZW1vcnkgaW5kaXJlY3QuICBZb3UgbWF5IHNwZWNpZnkgdGhlIEBzYW1wezo4fSBmb3IgY2xhcml0eSwgaWYgeW91Ci13aXNoOyBidXQgQGNvZGV7QHZhbHVle0FTfX0gbmVpdGhlciByZXF1aXJlcyB0aGlzIG5vciB1c2VzIGl0LgotQGVuZCB0YWJsZQotCi1Abm9kZSBIOC8zMDAgRmxvYXRpbmcgUG9pbnQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEg4LzMwMCAoQHNje2llZWV9KQotQGNpbmRleCBIOC8zMDAgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBIOC8zMDAgZmFtaWx5IGhhcyBubyBoYXJkd2FyZSBmbG9hdGluZyBwb2ludCwgYnV0IHRoZSBAY29kZXsuZmxvYXR9Ci1kaXJlY3RpdmUgZ2VuZXJhdGVzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIG90aGVyIGRldmVsb3BtZW50IHRvb2xzLgotCi1AcGFnZQotQG5vZGUgSDgvMzAwIERpcmVjdGl2ZXMKLUBzZWN0aW9uIEg4LzMwMCBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBIOC8zMDAgbWFjaGluZSBkaXJlY3RpdmVzIChub25lKQotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIEg4LzMwMCAobm9uZSkKLUBjaW5kZXggQGNvZGV7d29yZH0gZGlyZWN0aXZlLCBIOC8zMDAKLUBjaW5kZXggQGNvZGV7aW50fSBkaXJlY3RpdmUsIEg4LzMwMAotQGNvZGV7QHZhbHVle0FTfX0gaGFzIG9ubHkgb25lIG1hY2hpbmUtZGVwZW5kZW50IGRpcmVjdGl2ZSBmb3IgdGhlCi1IOC8zMDA6Ci0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBIOC8zMDBILCBhc3NlbWJsaW5nIGZvcgotQGl0ZW0gLmg4MzAwaAotUmVjb2duaXplIGFuZCBlbWl0IGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgSDgvMzAwSCB2YXJpYW50LCBhbmQKLWFsc28gbWFrZSBAY29kZXsuaW50fSBlbWl0IDMyLWJpdCBudW1iZXJzIHJhdGhlciB0aGFuIHRoZSB1c3VhbCAoMTYtYml0KQotZm9yIHRoZSBIOC8zMDAgZmFtaWx5LgotQGVuZCB0YWJsZQotCi1PbiB0aGUgSDgvMzAwIGZhbWlseSAoaW5jbHVkaW5nIHRoZSBIOC8zMDBIKSBAc2FtcHsud29yZH0gZGlyZWN0aXZlcwotZ2VuZXJhdGUgMTYtYml0IG51bWJlcnMuCi0KLUBub2RlIEg4LzMwMCBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi0KLUBjaW5kZXggSDgvMzAwIG9wY29kZSBzdW1tYXJ5Ci1AY2luZGV4IG9wY29kZSBzdW1tYXJ5LCBIOC8zMDAKLUBjaW5kZXggbW5lbW9uaWNzLCBIOC8zMDAKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gc3VtbWFyeSwgSDgvMzAwCi1Gb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIEg4LzMwMCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCi1AY2l0ZXtIOC8zMDAgU2VyaWVzIFByb2dyYW1taW5nIE1hbnVhbH0gKEhpdGFjaGkgQURFLS02MDItLTAyNSkuICBGb3IKLWluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBIOC8zMDBILCBzZWUgQGNpdGV7SDgvMzAwSCBTZXJpZXMKLVByb2dyYW1taW5nIE1hbnVhbH0gKEhpdGFjaGkpLgotCi1AY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRzIGFsbCB0aGUgc3RhbmRhcmQgSDgvMzAwIG9wY29kZXMuICBObyBhZGRpdGlvbmFsCi1wc2V1ZG8taW5zdHJ1Y3Rpb25zIGFyZSBuZWVkZWQgb24gdGhpcyBmYW1pbHkuCi0KLUBpZnNldCBTTUFMTAotQGMgdGhpcyB0YWJsZSwgZHVlIHRvIHRoZSBtdWx0aS1jb2wgZmFraW5nIGFuZCBoYXJkY29kZWQgb3JkZXIsIGxvb2tzIHNpbGx5Ci1AYyBleGNlcHQgaW4gc21hbGxib29rLiAgU2VlIGNvbW1lbnRzIGJlbG93ICJAc2V0IFNNQUxMIiBuZWFyIHRvcCBvZiB0aGlzIGZpbGUuCi0KLVRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgSDgvMzAwIG9wY29kZXMsIGFuZCB0aGVpciBhcmd1bWVudHMuCi1FbnRyaWVzIG1hcmtlZCBAc2FtcHsqfSBhcmUgb3Bjb2RlcyB1c2VkIG9ubHkgb24gdGhlIEg4LzMwMEguCi0KLUBzbWFsbGV4YW1wbGUKLUBjIFVzaW5nIEBncm91cCBzZWVtcyB0byB1c2UgdGhlIG5vcm1hbCBiYXNlbGluZXNraXAsIG5vdCB0aGUgc21hbGxleGFtcGxlCi1AYyBiYXNlbGluZXNraXA7IGxvb2tzIGFwcHJveCBkb3VibGVzcGFjZWQuCi0gICAgICAgICBAaXtMZWdlbmQ6fQotICAgICAgICAgICAgUnMgICBAcntzb3VyY2UgcmVnaXN0ZXJ9Ci0gICAgICAgICAgICBSZCAgIEBye2Rlc3RpbmF0aW9uIHJlZ2lzdGVyfQotICAgICAgICAgICAgYWJzICBAcnthYnNvbHV0ZSBhZGRyZXNzfQotICAgICAgICAgICAgaW1tICBAcntpbW1lZGlhdGUgZGF0YX0KLSAgICAgICAgIGRpc3A6TiAgQHJ7Ti1iaXQgZGlzcGxhY2VtZW50IGZyb20gYSByZWdpc3Rlcn0KLSAgICAgICAgcGNyZWw6TiAgQHJ7Ti1iaXQgZGlzcGxhY2VtZW50IHJlbGF0aXZlIHRvIHByb2dyYW0gY291bnRlcn0KLQotICAgYWRkLmIgI2ltbSxyZCAgICAgICAgICAgICAgKiAgYW5kYyAjaW1tLGNjcgotICAgYWRkLmIgcnMscmQgICAgICAgICAgICAgICAgICAgYmFuZCAjaW1tLHJkCi0gICBhZGQudyBycyxyZCAgICAgICAgICAgICAgICAgICBiYW5kICNpbW0sQEByZAotKiAgYWRkLncgI2ltbSxyZCAgICAgICAgICAgICAgICAgYmFuZCAjaW1tLEBAYWJzOjgKLSogIGFkZC5sIHJzLHJkICAgICAgICAgICAgICAgICAgIGJyYSAgcGNyZWw6OAotKiAgYWRkLmwgI2ltbSxyZCAgICAgICAgICAgICAgKiAgYnJhICBwY3JlbDoxNgotICAgYWRkcyAjaW1tLHJkICAgICAgICAgICAgICAgICAgYnQgICBwY3JlbDo4Ci0gICBhZGR4ICNpbW0scmQgICAgICAgICAgICAgICAqICBidCAgIHBjcmVsOjE2Ci0gICBhZGR4IHJzLHJkICAgICAgICAgICAgICAgICAgICBicm4gIHBjcmVsOjgKLSAgIGFuZC5iICNpbW0scmQgICAgICAgICAgICAgICogIGJybiAgcGNyZWw6MTYKLSAgIGFuZC5iIHJzLHJkICAgICAgICAgICAgICAgICAgIGJmICAgcGNyZWw6OAotKiAgYW5kLncgcnMscmQgICAgICAgICAgICAgICAgKiAgYmYgICBwY3JlbDoxNgotKiAgYW5kLncgI2ltbSxyZCAgICAgICAgICAgICAgICAgYmhpICBwY3JlbDo4Ci0qICBhbmQubCAjaW1tLHJkICAgICAgICAgICAgICAqICBiaGkgIHBjcmVsOjE2Ci0qICBhbmQubCBycyxyZCAgICAgICAgICAgICAgICAgICBibHMgIHBjcmVsOjgKLUBwYWdlCi0qICBibHMgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBibGQgICNpbW0scmQKLSAgIGJjYyAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJsZCAgI2ltbSxAQHJkCi0qICBiY2MgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBibGQgICNpbW0sQEBhYnM6OAotICAgYmhzICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYm5vdCAjaW1tLHJkCi0qICBiaHMgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBibm90ICNpbW0sQEByZAotICAgYmNzICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYm5vdCAjaW1tLEBAYWJzOjgKLSogIGJjcyAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJub3QgcnMscmQKLSAgIGJsbyAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJub3QgcnMsQEByZAotKiAgYmxvICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYm5vdCBycyxAQGFiczo4Ci0gICBibmUgIHBjcmVsOjggICAgICAgICAgICAgICAgICBib3IgICNpbW0scmQKLSogIGJuZSAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJvciAgI2ltbSxAQHJkCi0gICBiZXEgIHBjcmVsOjggICAgICAgICAgICAgICAgICBib3IgICNpbW0sQEBhYnM6OAotKiAgYmVxICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnNldCAjaW1tLHJkCi0gICBidmMgIHBjcmVsOjggICAgICAgICAgICAgICAgICBic2V0ICNpbW0sQEByZAotKiAgYnZjICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnNldCAjaW1tLEBAYWJzOjgKLSAgIGJ2cyAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJzZXQgcnMscmQKLSogIGJ2cyAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJzZXQgcnMsQEByZAotICAgYnBsICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnNldCBycyxAQGFiczo4Ci0qICBicGwgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBic3IgIHBjcmVsOjgKLSAgIGJtaSAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJzciAgcGNyZWw6MTYKLSogIGJtaSAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJzdCAgI2ltbSxyZAotICAgYmdlICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnN0ICAjaW1tLEBAcmQKLSogIGJnZSAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJzdCAgI2ltbSxAQGFiczo4Ci0gICBibHQgIHBjcmVsOjggICAgICAgICAgICAgICAgICBidHN0ICNpbW0scmQKLSogIGJsdCAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJ0c3QgI2ltbSxAQHJkCi0gICBiZ3QgIHBjcmVsOjggICAgICAgICAgICAgICAgICBidHN0ICNpbW0sQEBhYnM6OAotKiAgYmd0ICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnRzdCBycyxyZAotICAgYmxlICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnRzdCBycyxAQHJkCi0qICBibGUgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBidHN0IHJzLEBAYWJzOjgKLSAgIGJjbHIgI2ltbSxyZCAgICAgICAgICAgICAgICAgIGJ4b3IgI2ltbSxyZAotICAgYmNsciAjaW1tLEBAcmQgICAgICAgICAgICAgICAgIGJ4b3IgI2ltbSxAQHJkCi0gICBiY2xyICNpbW0sQEBhYnM6OCAgICAgICAgICAgICAgYnhvciAjaW1tLEBAYWJzOjgKLSAgIGJjbHIgcnMscmQgICAgICAgICAgICAgICAgICAgIGNtcC5iICNpbW0scmQKLSAgIGJjbHIgcnMsQEByZCAgICAgICAgICAgICAgICAgICBjbXAuYiBycyxyZAotICAgYmNsciBycyxAQGFiczo4ICAgICAgICAgICAgICAgIGNtcC53IHJzLHJkCi0gICBiaWFuZCAjaW1tLHJkICAgICAgICAgICAgICAgICBjbXAudyBycyxyZAotICAgYmlhbmQgI2ltbSxAQHJkICAgICAgICAgICAgICogIGNtcC53ICNpbW0scmQKLSAgIGJpYW5kICNpbW0sQEBhYnM6OCAgICAgICAgICAqICBjbXAubCAjaW1tLHJkCi0gICBiaWxkICNpbW0scmQgICAgICAgICAgICAgICAqICBjbXAubCBycyxyZAotICAgYmlsZCAjaW1tLEBAcmQgICAgICAgICAgICAgICAgIGRhYSAgcnMKLSAgIGJpbGQgI2ltbSxAQGFiczo4ICAgICAgICAgICAgICBkYXMgIHJzCi0gICBiaW9yICNpbW0scmQgICAgICAgICAgICAgICAgICBkZWMuYiBycwotICAgYmlvciAjaW1tLEBAcmQgICAgICAgICAgICAgICogIGRlYy53ICNpbW0scmQKLSAgIGJpb3IgI2ltbSxAQGFiczo4ICAgICAgICAgICAqICBkZWMubCAjaW1tLHJkCi0gICBiaXN0ICNpbW0scmQgICAgICAgICAgICAgICAgICBkaXZ4dS5iIHJzLHJkCi0gICBiaXN0ICNpbW0sQEByZCAgICAgICAgICAgICAgKiAgZGl2eHUudyBycyxyZAotICAgYmlzdCAjaW1tLEBAYWJzOjggICAgICAgICAgICogIGRpdnhzLmIgcnMscmQKLSAgIGJpeG9yICNpbW0scmQgICAgICAgICAgICAgICogIGRpdnhzLncgcnMscmQKLSAgIGJpeG9yICNpbW0sQEByZCAgICAgICAgICAgICAgICBlZXBtb3YKLSAgIGJpeG9yICNpbW0sQEBhYnM6OCAgICAgICAgICAqICBlZXBtb3Z3Ci1AcGFnZQotKiAgZXh0cy53IHJkICAgICAgICAgICAgICAgICAgICAgbW92LncgcnMsQEBhYnM6MTYKLSogIGV4dHMubCByZCAgICAgICAgICAgICAgICAgICogIG1vdi5sICNpbW0scmQKLSogIGV4dHUudyByZCAgICAgICAgICAgICAgICAgICogIG1vdi5sIHJzLHJkCi0qICBleHR1LmwgcmQgICAgICAgICAgICAgICAgICAqICBtb3YubCBAQHJzLHJkCi0gICBpbmMgIHJzICAgICAgICAgICAgICAgICAgICAqICBtb3YubCBAQChkaXNwOjE2LHJzKSxyZAotKiAgaW5jLncgI2ltbSxyZCAgICAgICAgICAgICAgKiAgbW92LmwgQEAoZGlzcDoyNCxycykscmQKLSogIGluYy5sICNpbW0scmQgICAgICAgICAgICAgICogIG1vdi5sIEBAcnMrLHJkCi0gICBqbXAgIEBAcnMgICAgICAgICAgICAgICAgICAgKiAgbW92LmwgQEBhYnM6MTYscmQKLSAgIGptcCAgYWJzICAgICAgICAgICAgICAgICAgICogIG1vdi5sIEBAYWJzOjI0LHJkCi0gICBqbXAgIEBAQEBhYnM6OCAgICAgICAgICAgICAgICogIG1vdi5sIHJzLEBAcmQKLSAgIGpzciAgQEBycyAgICAgICAgICAgICAgICAgICAqICBtb3YubCBycyxAQChkaXNwOjE2LHJkKQotICAganNyICBhYnMgICAgICAgICAgICAgICAgICAgKiAgbW92LmwgcnMsQEAoZGlzcDoyNCxyZCkKLSAgIGpzciAgQEBAQGFiczo4ICAgICAgICAgICAgICAgKiAgbW92LmwgcnMsQEAtcmQKLSAgIGxkYyAgI2ltbSxjY3IgICAgICAgICAgICAgICogIG1vdi5sIHJzLEBAYWJzOjE2Ci0gICBsZGMgIHJzLGNjciAgICAgICAgICAgICAgICAqICBtb3YubCBycyxAQGFiczoyNAotKiAgbGRjICBAQGFiczoxNixjY3IgICAgICAgICAgICAgIG1vdmZwZSBAQGFiczoxNixyZAotKiAgbGRjICBAQGFiczoyNCxjY3IgICAgICAgICAgICAgIG1vdnRwZSBycyxAQGFiczoxNgotKiAgbGRjICBAQChkaXNwOjE2LHJzKSxjY3IgICAgICAgIG11bHh1LmIgcnMscmQKLSogIGxkYyAgQEAoZGlzcDoyNCxycyksY2NyICAgICAqICBtdWx4dS53IHJzLHJkCi0qICBsZGMgIEBAcnMrLGNjciAgICAgICAgICAgICAgKiAgbXVseHMuYiBycyxyZAotKiAgbGRjICBAQHJzLGNjciAgICAgICAgICAgICAgICogIG11bHhzLncgcnMscmQKLSogIG1vdi5iIEBAKGRpc3A6MjQscnMpLHJkICAgICAgICBuZWcuYiBycwotKiAgbW92LmIgcnMsQEAoZGlzcDoyNCxyZCkgICAgICogIG5lZy53IHJzCi0gICBtb3YuYiBAQGFiczoxNixyZCAgICAgICAgICAgKiAgbmVnLmwgcnMKLSAgIG1vdi5iIHJzLHJkICAgICAgICAgICAgICAgICAgIG5vcAotICAgbW92LmIgQEBhYnM6OCxyZCAgICAgICAgICAgICAgIG5vdC5iIHJzCi0gICBtb3YuYiBycyxAQGFiczo4ICAgICAgICAgICAgKiAgbm90LncgcnMKLSAgIG1vdi5iIHJzLHJkICAgICAgICAgICAgICAgICogIG5vdC5sIHJzCi0gICBtb3YuYiAjaW1tLHJkICAgICAgICAgICAgICAgICBvci5iICNpbW0scmQKLSAgIG1vdi5iIEBAcnMscmQgICAgICAgICAgICAgICAgICBvci5iIHJzLHJkCi0gICBtb3YuYiBAQChkaXNwOjE2LHJzKSxyZCAgICAgKiAgb3IudyAjaW1tLHJkCi0gICBtb3YuYiBAQHJzKyxyZCAgICAgICAgICAgICAgKiAgb3IudyBycyxyZAotICAgbW92LmIgQEBhYnM6OCxyZCAgICAgICAgICAgICogIG9yLmwgI2ltbSxyZAotICAgbW92LmIgcnMsQEByZCAgICAgICAgICAgICAgICogIG9yLmwgcnMscmQKLSAgIG1vdi5iIHJzLEBAKGRpc3A6MTYscmQpICAgICAgICBvcmMgICNpbW0sY2NyCi0gICBtb3YuYiBycyxAQC1yZCAgICAgICAgICAgICAgICAgcG9wLncgcnMKLSAgIG1vdi5iIHJzLEBAYWJzOjggICAgICAgICAgICAqICBwb3AubCBycwotICAgbW92LncgcnMsQEByZCAgICAgICAgICAgICAgICAgIHB1c2gudyBycwotKiAgbW92LncgQEAoZGlzcDoyNCxycykscmQgICAgICogIHB1c2gubCBycwotKiAgbW92LncgcnMsQEAoZGlzcDoyNCxyZCkgICAgICAgIHJvdGwuYiBycwotKiAgbW92LncgQEBhYnM6MjQscmQgICAgICAgICAgICogIHJvdGwudyBycwotKiAgbW92LncgcnMsQEBhYnM6MjQgICAgICAgICAgICogIHJvdGwubCBycwotICAgbW92LncgcnMscmQgICAgICAgICAgICAgICAgICAgcm90ci5iIHJzCi0gICBtb3YudyAjaW1tLHJkICAgICAgICAgICAgICAqICByb3RyLncgcnMKLSAgIG1vdi53IEBAcnMscmQgICAgICAgICAgICAgICAqICByb3RyLmwgcnMKLSAgIG1vdi53IEBAKGRpc3A6MTYscnMpLHJkICAgICAgICByb3R4bC5iIHJzCi0gICBtb3YudyBAQHJzKyxyZCAgICAgICAgICAgICAgKiAgcm90eGwudyBycwotICAgbW92LncgQEBhYnM6MTYscmQgICAgICAgICAgICogIHJvdHhsLmwgcnMKLSAgIG1vdi53IHJzLEBAKGRpc3A6MTYscmQpICAgICAgICByb3R4ci5iIHJzCi0gICBtb3YudyBycyxAQC1yZCAgICAgICAgICAgICAgKiAgcm90eHIudyBycwotQHBhZ2UKLSogIHJvdHhyLmwgcnMgICAgICAgICAgICAgICAgICogIHN0YyAgY2NyLEBAKGRpc3A6MjQscmQpCi0gICBicHQgICAgICAgICAgICAgICAgICAgICAgICAqICBzdGMgIGNjcixAQC1yZAotICAgcnRlICAgICAgICAgICAgICAgICAgICAgICAgKiAgc3RjICBjY3IsQEBhYnM6MTYKLSAgIHJ0cyAgICAgICAgICAgICAgICAgICAgICAgICogIHN0YyAgY2NyLEBAYWJzOjI0Ci0gICBzaGFsLmIgcnMgICAgICAgICAgICAgICAgICAgICBzdWIuYiBycyxyZAotKiAgc2hhbC53IHJzICAgICAgICAgICAgICAgICAgICAgc3ViLncgcnMscmQKLSogIHNoYWwubCBycyAgICAgICAgICAgICAgICAgICogIHN1Yi53ICNpbW0scmQKLSAgIHNoYXIuYiBycyAgICAgICAgICAgICAgICAgICogIHN1Yi5sIHJzLHJkCi0qICBzaGFyLncgcnMgICAgICAgICAgICAgICAgICAqICBzdWIubCAjaW1tLHJkCi0qICBzaGFyLmwgcnMgICAgICAgICAgICAgICAgICAgICBzdWJzICNpbW0scmQKLSAgIHNobGwuYiBycyAgICAgICAgICAgICAgICAgICAgIHN1YnggI2ltbSxyZAotKiAgc2hsbC53IHJzICAgICAgICAgICAgICAgICAgICAgc3VieCBycyxyZAotKiAgc2hsbC5sIHJzICAgICAgICAgICAgICAgICAgKiAgdHJhcGEgI2ltbQotICAgc2hsci5iIHJzICAgICAgICAgICAgICAgICAgICAgeG9yICAjaW1tLHJkCi0qICBzaGxyLncgcnMgICAgICAgICAgICAgICAgICAgICB4b3IgIHJzLHJkCi0qICBzaGxyLmwgcnMgICAgICAgICAgICAgICAgICAqICB4b3IudyAjaW1tLHJkCi0gICBzbGVlcCAgICAgICAgICAgICAgICAgICAgICAqICB4b3IudyBycyxyZAotICAgc3RjICBjY3IscmQgICAgICAgICAgICAgICAgKiAgeG9yLmwgI2ltbSxyZAotKiAgc3RjICBjY3IsQEBycyAgICAgICAgICAgICAgICogIHhvci5sIHJzLHJkCi0qICBzdGMgIGNjcixAQChkaXNwOjE2LHJkKSAgICAgICAgeG9yYyAjaW1tLGNjcgotQGVuZCBzbWFsbGV4YW1wbGUKLUBlbmQgaWZzZXQKLQotQGNpbmRleCBzaXplIHN1ZmZpeGVzLCBIOC8zMDAKLUBjaW5kZXggSDgvMzAwIHNpemUgc3VmZml4ZXMKLUZvdXIgSDgvMzAwIGluc3RydWN0aW9ucyAoQGNvZGV7YWRkfSwgQGNvZGV7Y21wfSwgQGNvZGV7bW92fSwKLUBjb2Rle3N1Yn0pIGFyZSBkZWZpbmVkIHdpdGggdmFyaWFudHMgdXNpbmcgdGhlIHN1ZmZpeGVzIEBzYW1wey5ifSwKLUBzYW1wey53fSwgYW5kIEBzYW1wey5sfSB0byBzcGVjaWZ5IHRoZSBzaXplIG9mIGEgbWVtb3J5IG9wZXJhbmQuCi1AY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyB0aGVzZSBzdWZmaXhlcywgYnV0IGRvZXMgbm90IHJlcXVpcmUgdGhlbTsKLXNpbmNlIG9uZSBvZiB0aGUgb3BlcmFuZHMgaXMgYWx3YXlzIGEgcmVnaXN0ZXIsIEBjb2Rle0B2YWx1ZXtBU319IGNhbgotZGVkdWNlIHRoZSBjb3JyZWN0IHNpemUuCi0KLUZvciBleGFtcGxlLCBzaW5jZSBAY29kZXtyMH0gcmVmZXJzIHRvIGEgMTYtYml0IHJlZ2lzdGVyLAotQGV4YW1wbGUKLW1vdiAgICByMCxAQGZvbwotQGV4ZGVudCBpcyBlcXVpdmFsZW50IHRvCi1tb3YudyAgcjAsQEBmb28KLUBlbmQgZXhhbXBsZQotCi1JZiB5b3UgdXNlIHRoZSBzaXplIHN1ZmZpeGVzLCBAY29kZXtAdmFsdWV7QVN9fSBpc3N1ZXMgYSB3YXJuaW5nIHdoZW4KLXRoZSBzdWZmaXggYW5kIHRoZSByZWdpc3RlciBzaXplIGRvIG5vdCBtYXRjaC4KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1oODUwMC50ZXhpIGIvZ2FzL2RvYy9jLWg4NTAwLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZjBlNjQuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWg4NTAwLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AcGFnZQotQG5vZGUgSDgvNTAwLURlcGVuZGVudAotQGNoYXB0ZXIgSDgvNTAwIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4IEg4LzUwMCBzdXBwb3J0Ci1AbWVudQotKiBIOC81MDAgT3B0aW9uczo6ICAgICAgICAgICAgICBPcHRpb25zCi0qIEg4LzUwMCBTeW50YXg6OiAgICAgICAgICAgICAgIFN5bnRheAotKiBIOC81MDAgRmxvYXRpbmcgUG9pbnQ6OiAgICAgICBGbG9hdGluZyBQb2ludAotKiBIOC81MDAgRGlyZWN0aXZlczo6ICAgICAgICAgICBIOC81MDAgTWFjaGluZSBEaXJlY3RpdmVzCi0qIEg4LzUwMCBPcGNvZGVzOjogICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBIOC81MDAgT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotCi1AY2luZGV4IEg4LzUwMCBvcHRpb25zIChub25lKQotQGNpbmRleCBvcHRpb25zLCBIOC81MDAgKG5vbmUpCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gYWRkaXRpb25hbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgdGhlIEhpdGFjaGkKLUg4LzUwMCBmYW1pbHkuCi0KLUBub2RlIEg4LzUwMCBTeW50YXgKLUBzZWN0aW9uIFN5bnRheAotCi1AbWVudQotKiBIOC81MDAtQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogSDgvNTAwLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLSogSDgvNTAwLUFkZHJlc3Npbmc6OiAgICAgICAgICAgQWRkcmVzc2luZyBNb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEg4LzUwMC1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi0KLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgSDgvNTAwCi1AY2luZGV4IEg4LzUwMCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Ac2FtcHshfSBpcyB0aGUgbGluZSBjb21tZW50IGNoYXJhY3Rlci4KLQotQGNpbmRleCBsaW5lIHNlcGFyYXRvciwgSDgvNTAwCi1AY2luZGV4IHN0YXRlbWVudCBzZXBhcmF0b3IsIEg4LzUwMAotQGNpbmRleCBIOC81MDAgbGluZSBzZXBhcmF0b3IKLUBzYW1wezt9IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBuZXdsaW5lIHRvIHNlcGFyYXRlIHN0YXRlbWVudHMuCi0KLUBjaW5kZXggc3ltYm9sIG5hbWVzLCBAc2FtcHskfSBpbgotQGNpbmRleCBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXMKLVNpbmNlIEBzYW1weyR9IGhhcyBubyBzcGVjaWFsIG1lYW5pbmcsIHlvdSBtYXkgdXNlIGl0IGluIHN5bWJvbCBuYW1lcy4KLQotQG5vZGUgSDgvNTAwLVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi0KLUBjaW5kZXggSDgvNTAwIHJlZ2lzdGVycwotQGNpbmRleCByZWdpc3RlcnMsIEg4LzUwMAotWW91IGNhbiB1c2UgdGhlIHByZWRlZmluZWQgc3ltYm9scyBAc2FtcHtyMH0sIEBzYW1we3IxfSwgQHNhbXB7cjJ9LAotQHNhbXB7cjN9LCBAc2FtcHtyNH0sIEBzYW1we3I1fSwgQHNhbXB7cjZ9LCBhbmQgQHNhbXB7cjd9IHRvIHJlZmVyIHRvCi10aGUgSDgvNTAwIHJlZ2lzdGVycy4KLQotVGhlIEg4LzUwMCBhbHNvIGhhcyB0aGVzZSBjb250cm9sIHJlZ2lzdGVyczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBjcAotY29kZSBwb2ludGVyCi0KLUBpdGVtIGRwCi1kYXRhIHBvaW50ZXIKLQotQGl0ZW0gYnAKLWJhc2UgcG9pbnRlcgotCi1AaXRlbSB0cAotc3RhY2sgdG9wIHBvaW50ZXIKLQotQGl0ZW0gZXAKLWV4dHJhIHBvaW50ZXIKLQotQGl0ZW0gc3IKLXN0YXR1cyByZWdpc3RlcgotCi1AaXRlbSBjY3IKLWNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVyCi1AZW5kIHRhYmxlCi0KLUFsbCByZWdpc3RlcnMgYXJlIDE2IGJpdHMgbG9uZy4gIFRvIHJlcHJlc2VudCAzMiBiaXQgbnVtYmVycywgdXNlIHR3bwotYWRqYWNlbnQgcmVnaXN0ZXJzOyBmb3IgZGlzdGFudCBtZW1vcnkgYWRkcmVzc2VzLCB1c2Ugb25lIG9mIHRoZSBzZWdtZW50Ci1wb2ludGVycyAoQGNvZGV7Y3B9IGZvciB0aGUgcHJvZ3JhbSBjb3VudGVyOyBAY29kZXtkcH0gZm9yCi1AY29kZXtyMH0tLUBjb2Rle3IzfTsgQGNvZGV7ZXB9IGZvciBAY29kZXtyNH0gYW5kIEBjb2Rle3I1fTsgYW5kCi1AY29kZXt0cH0gZm9yIEBjb2Rle3I2fSBhbmQgQGNvZGV7cjd9LgotCi1Abm9kZSBIOC81MDAtQWRkcmVzc2luZwotQHN1YnNlY3Rpb24gQWRkcmVzc2luZyBNb2RlcwotCi1AY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIEg4LzUwMAotQGNpbmRleCBIOC81MDAgYWRkcmVzc2luZyBtb2RlcwotQHZhbHVle0FTfSB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgZm9yIHRoZSBIOC81MDA6Ci1AdGFibGUgQGNvZGUKLUBpdGVtIFJAdmFye259Ci1SZWdpc3RlciBkaXJlY3QKLQotQGl0ZW0gQEBSQHZhcntufQotUmVnaXN0ZXIgaW5kaXJlY3QKLQotQGl0ZW0gQEAoZDo4LCBSQHZhcntufSkKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggOCBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudAotCi1AaXRlbSBAQChkOjE2LCBSQHZhcntufSkKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggMTYgYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQKLQotQGl0ZW0gQEAtUkB2YXJ7bn0KLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcHJlLWRlY3JlbWVudAotCi1AaXRlbSBAQFJAdmFye259KwotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0LWluY3JlbWVudAotCi1AaXRlbSBAQEB2YXJ7YWF9OjgKLTggYml0IGFic29sdXRlIGFkZHJlc3MKLQotQGl0ZW0gQEBAdmFye2FhfToxNgotMTYgYml0IGFic29sdXRlIGFkZHJlc3MKLQotQGl0ZW0gI0B2YXJ7eHh9OjgKLTggYml0IGltbWVkaWF0ZQotCi1AaXRlbSAjQHZhcnt4eH06MTYKLTE2IGJpdCBpbW1lZGlhdGUKLUBlbmQgdGFibGUKLQotQG5vZGUgSDgvNTAwIEZsb2F0aW5nIFBvaW50Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBIOC81MDAgKEBzY3tpZWVlfSkKLUBjaW5kZXggSDgvNTAwIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgSDgvNTAwIGZhbWlseSBoYXMgbm8gaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQsIGJ1dCB0aGUgQGNvZGV7LmZsb2F0fQotZGlyZWN0aXZlIGdlbmVyYXRlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBmb3IgY29tcGF0aWJpbGl0eQotd2l0aCBvdGhlciBkZXZlbG9wbWVudCB0b29scy4KLQotQG5vZGUgSDgvNTAwIERpcmVjdGl2ZXMKLUBzZWN0aW9uIEg4LzUwMCBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBIOC81MDAgbWFjaGluZSBkaXJlY3RpdmVzIChub25lKQotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIEg4LzUwMCAobm9uZSkKLUBjaW5kZXggQGNvZGV7d29yZH0gZGlyZWN0aXZlLCBIOC81MDAKLUBjaW5kZXggQGNvZGV7aW50fSBkaXJlY3RpdmUsIEg4LzUwMAotQGNvZGV7QHZhbHVle0FTfX0gaGFzIG5vIG1hY2hpbmUtZGVwZW5kZW50IGRpcmVjdGl2ZXMgZm9yIHRoZSBIOC81MDAuCi1Ib3dldmVyLCBvbiB0aGlzIHBsYXRmb3JtIHRoZSBAc2FtcHsuaW50fSBhbmQgQHNhbXB7LndvcmR9IGRpcmVjdGl2ZXMKLWdlbmVyYXRlIDE2LWJpdCBudW1iZXJzLgotCi1Abm9kZSBIOC81MDAgT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotCi1AY2luZGV4IEg4LzUwMCBvcGNvZGUgc3VtbWFyeQotQGNpbmRleCBvcGNvZGUgc3VtbWFyeSwgSDgvNTAwCi1AY2luZGV4IG1uZW1vbmljcywgSDgvNTAwCi1AY2luZGV4IGluc3RydWN0aW9uIHN1bW1hcnksIEg4LzUwMAotRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBIOC81MDAgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7SDgvNTAwIFNlcmllcyBQcm9ncmFtbWluZyBNYW51YWx9IChIaXRhY2hpIE0yMVQwMDEpLgotCi1AY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRzIGFsbCB0aGUgc3RhbmRhcmQgSDgvNTAwIG9wY29kZXMuICBObyBhZGRpdGlvbmFsCi1wc2V1ZG8taW5zdHJ1Y3Rpb25zIGFyZSBuZWVkZWQgb24gdGhpcyBmYW1pbHkuCi0KLUBpZnNldCBTTUFMTAotQGMgdGhpcyB0YWJsZSwgZHVlIHRvIHRoZSBtdWx0aS1jb2wgZmFraW5nIGFuZCBoYXJkY29kZWQgb3JkZXIsIGxvb2tzIHNpbGx5Ci1AYyBleGNlcHQgaW4gc21hbGxib29rLiAgU2VlIGNvbW1lbnRzIGJlbG93ICJAc2V0IFNNQUxMIiBuZWFyIHRvcCBvZiB0aGlzIGZpbGUuCi0KLVRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyBIOC81MDAgb3Bjb2RlcyBhbmQgdGhlaXIgb3BlcmFuZHM6Ci0KLUBjIFVzZSBAZ3JvdXAgaWYgaXQgZXZlciB3b3JrcywgaW5zdGVhZCBvZiBAcGFnZQotQHBhZ2UKLUBzbWFsbGV4YW1wbGUKLUBpe0xlZ2VuZDp9Ci1hYnM4ICAgICAgQHJ7OC1iaXQgYWJzb2x1dGUgYWRkcmVzc30KLWFiczE2ICAgICBAcnsxNi1iaXQgYWJzb2x1dGUgYWRkcmVzc30KLWFiczI0ICAgICBAcnsyNC1iaXQgYWJzb2x1dGUgYWRkcmVzc30KLWNyYiAgICAgICBAcntAY29kZXtjY3J9LCBAY29kZXticn0sIEBjb2Rle2VwfSwgQGNvZGV7ZHB9LCBAY29kZXt0cH0sIEBjb2Rle2RwfX0KLWRpc3A4ICAgICBAcns4LWJpdCBkaXNwbGFjZW1lbnR9Ci1lYSAgICAgICAgQHJ7QGNvZGV7cm59LCBAY29kZXtAQHJufSwgQGNvZGV7QEAoZDo4LCBybil9LCBAY29kZXtAQChkOjE2LCBybil9LH0KLSAgICAgICAgICBAcntAY29kZXtAQC1ybn0sIEBjb2Rle0BAcm4rfSwgQGNvZGV7QEBhYTo4fSwgQGNvZGV7QEBhYToxNn0sfQotICAgICAgICAgIEBye0Bjb2RleyN4eDo4fSwgQGNvZGV7I3h4OjE2fX0KLWVhX21lbSAgICBAcntAY29kZXtAQHJufSwgQGNvZGV7QEAoZDo4LCBybil9LCBAY29kZXtAQChkOjE2LCBybil9LH0KLSAgICAgICAgICBAcntAY29kZXtAQC1ybn0sIEBjb2Rle0BAcm4rfSwgQGNvZGV7QEBhYTo4fSwgQGNvZGV7QEBhYToxNn19Ci1lYV9ub2ltbSAgQHJ7QGNvZGV7cm59LCBAY29kZXtAQHJufSwgQGNvZGV7QEAoZDo4LCBybil9LCBAY29kZXtAQChkOjE2LCBybil9LH0KLSAgICAgICAgICBAcntAY29kZXtAQC1ybn0sIEBjb2Rle0BAcm4rfSwgQGNvZGV7QEBhYTo4fSwgQGNvZGV7QEBhYToxNn19Ci1mcCAgICAgICAgcjYKLWltbTQgICAgICBAcns0LWJpdCBpbW1lZGlhdGUgZGF0YX0KLWltbTggICAgICBAcns4LWJpdCBpbW1lZGlhdGUgZGF0YX0KLWltbTE2ICAgICBAcnsxNi1iaXQgaW1tZWRpYXRlIGRhdGF9Ci1wY3JlbDggICAgQHJ7OC1iaXQgb2Zmc2V0IGZyb20gcHJvZ3JhbSBjb3VudGVyfQotcGNyZWwxNiAgIEByezE2LWJpdCBvZmZzZXQgZnJvbSBwcm9ncmFtIGNvdW50ZXJ9Ci1xaW0gICAgICAgQHJ7QGNvZGV7LTJ9LCBAY29kZXstMX0sIEBjb2RlezF9LCBAY29kZXsyfX0KLXJkICAgICAgICBAcnthbnkgcmVnaXN0ZXJ9Ci1ycyAgICAgICAgQHJ7YSByZWdpc3RlciBkaXN0aW5jdCBmcm9tIHJkfQotcmxpc3QgICAgIEBye2NvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlZ2lzdGVycyBpbiBwYXJlbnRoZXNlczt9Ci0gICAgICAgICAgQHJ7cmVnaXN0ZXIgcmFuZ2VzIEBjb2Rle3JkLXJzfSBhcmUgYWxsb3dlZH0KLXNwICAgICAgICBAcntzdGFjayBwb2ludGVyIChAY29kZXtyN30pfQotc3IgICAgICAgIEBye3N0YXR1cyByZWdpc3Rlcn0KLXN6ICAgICAgICBAcntzaXplOyBAc2FtcHsuYn0gb3IgQHNhbXB7Lnd9LiAgSWYgb21pdHRlZCwgZGVmYXVsdCBAc2FtcHsud319Ci0KLWxkY1suYl0gZWEsY3JiICAgICAgICAgICAgICAgICBiY2NbLnddIHBjcmVsMTYKLWxkY1sud10gZWEsc3IgICAgICAgICAgICAgICAgICBiY2NbLmJdIHBjcmVsOCAKLWFkZFs6cV0gc3ogcWltLGVhX25vaW1tICAgICAgICBiaHNbLnddIHBjcmVsMTYKLWFkZFs6Z10gc3ogZWEscmQgICAgICAgICAgICAgICBiaHNbLmJdIHBjcmVsOCAKLWFkZHMgc3ogZWEscmQgICAgICAgICAgICAgICAgICBiY3NbLnddIHBjcmVsMTYKLWFkZHggc3ogZWEscmQgICAgICAgICAgICAgICAgICBiY3NbLmJdIHBjcmVsOCAKLWFuZCBzeiBlYSxyZCAgICAgICAgICAgICAgICAgICBibG9bLnddIHBjcmVsMTYKLWFuZGNbLmJdIGltbTgsY3JiICAgICAgICAgICAgICBibG9bLmJdIHBjcmVsOCAKLWFuZGNbLnddIGltbTE2LHNyICAgICAgICAgICAgICBibmVbLnddIHBjcmVsMTYKLWJwdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBibmVbLmJdIHBjcmVsOCAKLWJyYVsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBiZXFbLnddIHBjcmVsMTYKLWJyYVsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBiZXFbLmJdIHBjcmVsOCAKLWJ0Wy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgICBidmNbLnddIHBjcmVsMTYKLWJ0Wy5iXSBwY3JlbDggICAgICAgICAgICAgICAgICBidmNbLmJdIHBjcmVsOCAKLWJyblsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBidnNbLnddIHBjcmVsMTYKLWJyblsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBidnNbLmJdIHBjcmVsOCAKLWJmWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgICBicGxbLnddIHBjcmVsMTYKLWJmWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgICBicGxbLmJdIHBjcmVsOCAKLWJoaVsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBibWlbLnddIHBjcmVsMTYKLWJoaVsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBibWlbLmJdIHBjcmVsOCAKLWJsc1sud10gcGNyZWwxNiAgICAgICAgICAgICAgICBiZ2VbLnddIHBjcmVsMTYKLWJsc1suYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBiZ2VbLmJdIHBjcmVsOCAKLUBwYWdlCi1ibHRbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgbW92WzpnXVsuYl0gaW1tOCxlYV9tZW0gICAgICAgCi1ibHRbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgbW92WzpnXVsud10gaW1tMTYsZWFfbWVtICAgICAgCi1iZ3RbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgbW92ZnBlWy5iXSBlYSxyZCAgICAgICAgICAgICAgCi1iZ3RbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgbW92dHBlWy5iXSBycyxlYV9ub2ltbSAgICAgICAgCi1ibGVbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgbXVseHUgc3ogZWEscmQgICAgICAgICAgICAgICAgCi1ibGVbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgbmVnIHN6IGVhICAgICAgICAgICAgICAgICAgICAgCi1iY2xyIHN6IGltbTQsZWFfbm9pbW0gICAgICAgICAgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1iY2xyIHN6IHJzLGVhX25vaW1tICAgICAgICAgICAgbm90IHN6IGVhICAgICAgICAgICAgICAgICAgICAgCi1ibm90IHN6IGltbTQsZWFfbm9pbW0gICAgICAgICAgb3Igc3ogZWEscmQgICAgICAgICAgICAgICAgICAgCi1ibm90IHN6IHJzLGVhX25vaW1tICAgICAgICAgICAgb3JjWy5iXSBpbW04LGNyYiAgICAgICAgICAgICAgCi1ic2V0IHN6IGltbTQsZWFfbm9pbW0gICAgICAgICAgb3JjWy53XSBpbW0xNixzciAgICAgICAgICAgICAgCi1ic2V0IHN6IHJzLGVhX25vaW1tICAgICAgICAgICAgcGptcCBhYnMyNCAgICAgICAgICAgICAgICAgICAgCi1ic3JbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgcGptcCBAQHJkICAgICAgICAgICAgICAgICAgICAgCi1ic3JbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgcGpzciBhYnMyNCAgICAgICAgICAgICAgICAgICAgCi1idHN0IHN6IGltbTQsZWFfbm9pbW0gICAgICAgICAgcGpzciBAQHJkICAgICAgICAgICAgICAgICAgICAgCi1idHN0IHN6IHJzLGVhX25vaW1tICAgICAgICAgICAgcHJ0ZCBpbW04ICAgICAgICAgICAgICAgICAgICAgCi1jbHIgc3ogZWEgICAgICAgICAgICAgICAgICAgICAgcHJ0ZCBpbW0xNiAgICAgICAgICAgICAgICAgICAgCi1jbXBbOmVdWy5iXSBpbW04LHJkICAgICAgICAgICAgcHJ0cyAgICAgICAgICAgICAgICAgICAgICAgICAgCi1jbXBbOmldWy53XSBpbW0xNixyZCAgICAgICAgICAgcm90bCBzeiBlYSAgICAgICAgICAgICAgICAgICAgCi1jbXBbOmddLmIgaW1tOCxlYV9ub2ltbSAgICAgICAgcm90ciBzeiBlYSAgICAgICAgICAgICAgICAgICAgCi1jbXBbOmddWy53XSBpbW0xNixlYV9ub2ltbSAgICAgcm90eGwgc3ogZWEgICAgICAgICAgICAgICAgICAgCi1DbXBbOmddIHN6IGVhLHJkICAgICAgICAgICAgICAgcm90eHIgc3ogZWEgICAgICAgICAgICAgICAgICAgCi1kYWRkIHJzLHJkICAgICAgICAgICAgICAgICAgICAgcnRkIGltbTggICAgICAgICAgICAgICAgICAgICAKLWRpdnh1IHN6IGVhLHJkICAgICAgICAgICAgICAgICBydGQgaW1tMTYgICAgICAgICAgICAgICAgICAgIAotZHN1YiBycyxyZCAgICAgICAgICAgICAgICAgICAgIHJ0cyAgICAgICAgICAgICAgICAgICAgICAgICAgCi1leHRzWy5iXSByZCAgICAgICAgICAgICAgICAgICAgc2NiL2YgcnMscGNyZWw4ICAgICAgICAgICAgICAgCi1leHR1Wy5iXSByZCAgICAgICAgICAgICAgICAgICAgc2NiL25lIHJzLHBjcmVsOCAgICAgICAgICAgICAKLWptcCBAQHJkICAgICAgICAgICAgICAgICAgICAgICAgc2NiL2VxIHJzLHBjcmVsOCAgICAgICAgICAgICAKLWptcCBAQChpbW04LHJkKSAgICAgICAgICAgICAgICAgc2hhbCBzeiBlYSAgICAgICAgICAgICAgICAgICAKLWptcCBAQChpbW0xNixyZCkgICAgICAgICAgICAgICAgc2hhciBzeiBlYSAgICAgICAgICAgICAgICAgICAgCi1qbXAgYWJzMTYgICAgICAgICAgICAgICAgICAgICAgc2hsbCBzeiBlYSAgICAgICAgICAgIAotanNyIEBAcmQgICAgICAgICAgICAgICAgICAgICAgICBzaGxyIHN6IGVhICAgICAgICAgICAgCi1qc3IgQEAoaW1tOCxyZCkgICAgICAgICAgICAgICAgIHNsZWVwICAgICAgICAgICAgICAgICAKLWpzciBAQChpbW0xNixyZCkgICAgICAgICAgICAgICAgc3RjWy5iXSBjcmIsZWFfbm9pbW0gIAotanNyIGFiczE2ICAgICAgICAgICAgICAgICAgICAgIHN0Y1sud10gc3IsZWFfbm9pbW0gICAKLWxkbSBAQHNwKywocmxpc3QpICAgICAgICAgICAgICAgc3RtIChybGlzdCksQEAtc3AgICAgIAotbGluayBmcCxpbW04ICAgICAgICAgICAgICAgICAgIHN1YiBzeiBlYSxyZCAgICAgICAgICAKLWxpbmsgZnAsaW1tMTYgICAgICAgICAgICAgICAgICBzdWJzIHN6IGVhLHJkICAgICAgICAgCi1tb3ZbOmVdWy5iXSBpbW04LHJkICAgICAgICAgICAgc3VieCBzeiBlYSxyZCAgICAgICAgIAotbW92WzppXVsud10gaW1tMTYscmQgICAgICAgICAgIHN3YXBbLmJdIHJkICAgICAgICAgICAKLW1vdls6bF1bLnddIGFiczgscmQgICAgICAgICAgICB0YXNbLmJdIGVhICAgICAKLW1vdls6bF0uYiBhYnM4LHJkICAgICAgICAgICAgICB0cmFwYSBpbW00ICAgICAKLW1vdls6c11bLnddIHJzLGFiczggICAgICAgICAgICB0cmFwL3ZzICAgICAgICAKLW1vdls6c10uYiBycyxhYnM4ICAgICAgICAgICAgICB0c3Qgc3ogZWEgICAgICAKLW1vdls6Zl1bLnddIEBAKGRpc3A4LGZwKSxyZCAgICAgdW5sayBmcCAgICAgICAgCi1tb3ZbOmZdWy53XSBycyxAQChkaXNwOCxmcCkgICAgIHhjaFsud10gcnMscmQgCi1tb3ZbOmZdLmIgQEAoZGlzcDgsZnApLHJkICAgICAgIHhvciBzeiBlYSxyZCAgIAotbW92WzpmXS5iIHJzLEBAKGRpc3A4LGZwKSAgICAgICB4b3JjLmIgaW1tOCxjcmIKLW1vdls6Z10gc3ogcnMsZWFfbWVtICAgICAgICAgICB4b3JjLncgaW1tMTYsc3IKLW1vdls6Z10gc3ogZWEscmQgICAgICAgICAgICAgIAotQGVuZCBzbWFsbGV4YW1wbGUKLUBlbmQgaWZzZXQKZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1ocHBhLnRleGkgYi9nYXMvZG9jL2MtaHBwYS50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmE1MzVmLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1ocHBhLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AcGFnZQotQG5vZGUgSFBQQS1EZXBlbmRlbnQKLUBjaGFwdGVyIEhQUEEgRGVwZW5kZW50IEZlYXR1cmVzCi0KLUBjaW5kZXggIHN1cHBvcnQKLUBtZW51Ci0qIEhQUEEgTm90ZXM6OiAgICAgICAgICAgICAgICBOb3RlcwotKiBIUFBBIE9wdGlvbnM6OiAgICAgICAgICAgICAgT3B0aW9ucwotKiBIUFBBIFN5bnRheDo6ICAgICAgICAgICAgICAgU3ludGF4Ci0qIEhQUEEgRmxvYXRpbmcgUG9pbnQ6OiAgICAgICBGbG9hdGluZyBQb2ludAotKiBIUFBBIERpcmVjdGl2ZXM6OiAgICAgICAgICAgSFBQQSBNYWNoaW5lIERpcmVjdGl2ZXMKLSogSFBQQSBPcGNvZGVzOjogICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBIUFBBIE5vdGVzCi1Ac2VjdGlvbiBOb3RlcwotQXMgYSBiYWNrIGVuZCBmb3IgQHNje2dudX0gQHNje2NjfSBAY29kZXtAdmFsdWV7QVN9fSBoYXMgYmVlbiB0aHJvdWdobHkgdGVzdGVkIGFuZCBzaG91bGQKLXdvcmsgZXh0cmVtZWx5IHdlbGwuICBXZSBoYXZlIHRlc3RlZCBpdCBvbmx5IG1pbmltYWxseSBvbiBoYW5kIHdyaXR0ZW4gYXNzZW1ibHkKLWNvZGUgYW5kIG5vIG9uZSBoYXMgdGVzdGVkIGl0IG11Y2ggb24gdGhlIGFzc2VtYmx5IG91dHB1dCBmcm9tIHRoZSBIUAotY29tcGlsZXJzLgotCi1UaGUgZm9ybWF0IG9mIHRoZSBkZWJ1Z2dpbmcgc2VjdGlvbnMgaGFzIGNoYW5nZWQgc2luY2UgdGhlIG9yaWdpbmFsCi1AY29kZXtAdmFsdWV7QVN9fSBwb3J0ICh2ZXJzaW9uIDEuM1gpIHdhcyByZWxlYXNlZDsgdGhlcmVmb3JlLAoteW91IG11c3QgcmVidWlsZCBhbGwgSFBQQSBvYmplY3RzIGFuZCBsaWJyYXJpZXMgd2l0aCB0aGUgbmV3IAotYXNzZW1ibGVyIHNvIHRoYXQgeW91IGNhbiBkZWJ1ZyB0aGUgZmluYWwgZXhlY3V0YWJsZS4KLQotVGhlIEhQUEEgQGNvZGV7QHZhbHVle0FTfX0gcG9ydCBnZW5lcmF0ZXMgYSBzbWFsbCBzdWJzZXQgb2YgdGhlIHJlbG9jYXRpb25zCi1hdmFpbGFibGUgaW4gdGhlIFNPTSBhbmQgRUxGIG9iamVjdCBmaWxlIGZvcm1hdHMuICBBZGRpdGlvbmFsIHJlbG9jYXRpb24KLXN1cHBvcnQgd2lsbCBiZSBhZGRlZCBhcyBpdCBiZWNvbWVzIG5lY2Vzc2FyeS4gIAotCi1Abm9kZSBIUFBBIE9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBtYWNoaW5lLWRlcGVuZGVudCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgdGhlIEhQUEEuCi0KLUBjaW5kZXggSFBQQSBTeW50YXgKLUBub2RlIEhQUEEgU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLVRoZSBhc3NlbWJsZXIgc3ludGF4IGNsb3NlbHkgZm9sbG93cyB0aGUgSFBQQSBpbnN0cnVjdGlvbiBzZXQKLXJlZmVyZW5jZSBtYW51YWw7IGFzc2VtYmxlciBkaXJlY3RpdmVzIGFuZCBnZW5lcmFsIHN5bnRheCBjbG9zZWx5IGZvbGxvdyB0aGUKLUhQUEEgYXNzZW1ibHkgbGFuZ3VhZ2UgcmVmZXJlbmNlIG1hbnVhbCwgd2l0aCBhIGZldyBub3Rld29ydGh5IGRpZmZlcmVuY2VzLgotCi1GaXJzdCwgYSBjb2xvbiBtYXkgaW1tZWRpYXRlbHkgZm9sbG93IGEgbGFiZWwgZGVmaW5pdGlvbi4gIFRoaXMgaXMKLXNpbXBseSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGhvdyBtb3N0IGFzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW1tZXJzCi13cml0ZSBjb2RlLgotCi1Tb21lIG9ic2N1cmUgZXhwcmVzc2lvbiBwYXJzaW5nIHByb2JsZW1zIG1heSBhZmZlY3QgaGFuZCB3cml0dGVuIGNvZGUgd2hpY2gKLXVzZXMgdGhlIEBjb2Rle3Nwb3B9IGluc3RydWN0aW9ucywgb3IgY29kZSB3aGljaCBtYWtlcyBzaWduaWZpY2FudAotdXNlIG9mIHRoZSBAY29kZXshfSBsaW5lIHNlcGFyYXRvci4KLQotQGNvZGV7QHZhbHVle0FTfX0gaXMgbXVjaCBsZXNzIGZvcmdpdmluZyBhYm91dCBtaXNzaW5nIGFyZ3VtZW50cyBhbmQgb3RoZXIKLXNpbWlsYXIgb3ZlcnNpZ2h0cyB0aGFuIHRoZSBIUCBhc3NlbWJsZXIuICBAY29kZXtAdmFsdWV7QVN9fSBub3RpZmllcyB5b3UKLW9mIG1pc3NpbmcgYXJndW1lbnRzIGFzIHN5bnRheCBlcnJvcnM7IHRoaXMgaXMgcmVnYXJkZWQgYXMgYSBmZWF0dXJlLCBub3QgYQotYnVnLgotCi1GaW5hbGx5LCBAY29kZXtAdmFsdWV7QVN9fSBhbGxvd3MgeW91IHRvIHVzZSBhbiBleHRlcm5hbCBzeW1ib2wgd2l0aG91dAotZXhwbGljaXRseSBpbXBvcnRpbmcgdGhlIHN5bWJvbC4gIEBlbXBoe1dhcm5pbmc6fSBpbiB0aGUgZnV0dXJlIHRoaXMgd2lsbCBiZQotYW4gZXJyb3IgZm9yIEhQUEEgdGFyZ2V0cy4KLQotU3BlY2lhbCBjaGFyYWN0ZXJzIGZvciBIUFBBIHRhcmdldHMgaW5jbHVkZToKLQotQHNhbXB7O30gaXMgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIuCi0KLUBzYW1weyF9IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBuZXdsaW5lIHRvIHNlcGFyYXRlIHN0YXRlbWVudHMuCi0KLVNpbmNlIEBzYW1weyR9IGhhcyBubyBzcGVjaWFsIG1lYW5pbmcsIHlvdSBtYXkgdXNlIGl0IGluIHN5bWJvbCBuYW1lcy4KLQotQG5vZGUgSFBQQSBGbG9hdGluZyBQb2ludAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEhQUEEgKEBzY3tpZWVlfSkKLUBjaW5kZXggSFBQQSBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQotVGhlIEhQUEEgZmFtaWx5IHVzZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCi0KLUBub2RlIEhQUEEgRGlyZWN0aXZlcwotQHNlY3Rpb24gSFBQQSBBc3NlbWJsZXIgRGlyZWN0aXZlcwotCi1AY29kZXtAdmFsdWV7QVN9fSBmb3IgdGhlIEhQUEEgc3VwcG9ydHMgbWFueSBhZGRpdGlvbmFsIGRpcmVjdGl2ZXMgZm9yCi1jb21wYXRpYmlsaXR5IHdpdGggdGhlIG5hdGl2ZSBhc3NlbWJsZXIuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZW0gb25seQotYnJpZWZseS4gIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBIUFBBLXNwZWNpZmljIGFzc2VtYmxlciBkaXJlY3RpdmVzLCBzZWUKLUBjaXRle0hQOTAwMCBTZXJpZXMgODAwIEFzc2VtYmx5IExhbmd1YWdlIFJlZmVyZW5jZSBNYW51YWx9IChIUCA5MjQzMi05MDAwMSkuCi0KLUBjaW5kZXggSFBQQSBkaXJlY3RpdmVzIG5vdCBzdXBwb3J0ZWQKLUBjb2Rle0B2YWx1ZXtBU319IGRvZXMgQGVtcGh7bm90fSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgYXNzZW1ibGVyIGRpcmVjdGl2ZXMKLWRlc2NyaWJlZCBpbiB0aGUgSFAgbWFudWFsOgotCi1AZXhhbXBsZQotLmVuZG0gICAgICAgICAgIC5saXN0b24KLS5lbnRlciAgICAgICAgICAubG9jY3QKLS5sZWF2ZSAgICAgICAgICAubWFjcm8gIAotLmxpc3RvZmYKLUBlbmQgZXhhbXBsZQotCi1AY2luZGV4IEBjb2Rley5wYXJhbX0gb24gSFBQQQotQmV5b25kIHRob3NlIGltcGxlbWVudGVkIGZvciBjb21wYXRpYmlsaXR5LCBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyBvbmUKLWFkZGl0aW9uYWwgYXNzZW1ibGVyIGRpcmVjdGl2ZSBmb3IgdGhlIEhQUEE6IEBjb2Rley5wYXJhbX0uICBJdCBjb252ZXlzCi1yZWdpc3RlciBhcmd1bWVudCBsb2NhdGlvbnMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICBJdHMgc3ludGF4IGNsb3NlbHkgZm9sbG93cwotdGhlIEBjb2Rley5leHBvcnR9IGRpcmVjdGl2ZS4KLQotQGNpbmRleCBIUFBBLW9ubHkgZGlyZWN0aXZlcwotVGhlc2UgYXJlIHRoZSBhZGRpdGlvbmFsIGRpcmVjdGl2ZXMgaW4gQGNvZGV7QHZhbHVle0FTfX0gZm9yIHRoZSBIUFBBOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC5ibG9jayBAdmFye259Ci1AaXRlbXggLmJsb2NreiBAdmFye259Ci1SZXNlcnZlIEB2YXJ7bn0gYnl0ZXMgb2Ygc3RvcmFnZSwgYW5kIGluaXRpYWxpemUgdGhlbSB0byB6ZXJvLgotCi1AaXRlbSAuY2FsbCAKLU1hcmsgdGhlIGJlZ2lubmluZyBvZiBhIHByb2NlZHVyZSBjYWxsLiAgT25seSB0aGUgc3BlY2lhbCBjYXNlIHdpdGggQGVtcGh7bm8KLWFyZ3VtZW50c30gaXMgYWxsb3dlZC4KLQotQGl0ZW0gLmNhbGxpbmZvIFsgQHZhcntwYXJhbX09QHZhcnt2YWx1ZX0sIEBkb3Rze30gXSAgWyBAdmFye2ZsYWd9LCBAZG90c3t9IF0KLVNwZWNpZnkgYSBudW1iZXIgb2YgcGFyYW1ldGVycyBhbmQgZmxhZ3MgdGhhdCBkZWZpbmUgdGhlIGVudmlyb25tZW50IGZvciBhCi1wcm9jZWR1cmUuCi0KLUB2YXJ7cGFyYW19IG1heSBiZSBhbnkgb2YgQHNhbXB7ZnJhbWV9IChmcmFtZSBzaXplKSwgQHNhbXB7ZW50cnlfZ3J9IChlbmQgb2YKLWdlbmVyYWwgcmVnaXN0ZXIgcmFuZ2UpLCBAc2FtcHtlbnRyeV9mcn0gKGVuZCBvZiBmbG9hdCByZWdpc3RlciByYW5nZSksCi1Ac2FtcHtlbnRyeV9zcn0gKGVuZCBvZiBzcGFjZSByZWdpc3RlciByYW5nZSkuCi0KLVRoZSB2YWx1ZXMgZm9yIEB2YXJ7ZmxhZ30gYXJlIEBzYW1we2NhbGxzfSBvciBAc2FtcHtjYWxsZXJ9IChwcm9jIGhhcwotc3Vicm91dGluZXMpLCBAc2FtcHtub19jYWxsc30gKHByb2MgZG9lcyBub3QgY2FsbCBzdWJyb3V0aW5lcyksIEBzYW1we3NhdmVfcnB9Ci0ocHJlc2VydmUgcmV0dXJuIHBvaW50ZXIpLCBAc2FtcHtzYXZlX3NwfSAocHJvYyBwcmVzZXJ2ZXMgc3RhY2sgcG9pbnRlciksCi1Ac2FtcHtub191bndpbmR9IChkbyBub3QgdW53aW5kIHRoaXMgcHJvYyksIEBzYW1we2hwdXhfaW50fSAocHJvYyBpcyBpbnRlcnJ1cHQKLXJvdXRpbmUpLgotCi1AaXRlbSAuY29kZQotQXNzZW1ibGUgaW50byB0aGUgc3RhbmRhcmQgc2VjdGlvbiBjYWxsZWQgQHNhbXB7JFRFWFQkfSwgc3Vic2VjdGlvbgotQHNhbXB7JENPREUkfS4KLQotQGlmc2V0IFNPTQotQGl0ZW0gLmNvcHlyaWdodCAiQHZhcntzdHJpbmd9IgotSW4gdGhlIFNPTSBvYmplY3QgZm9ybWF0LCBpbnNlcnQgQHZhcntzdHJpbmd9IGludG8gdGhlIG9iamVjdCBjb2RlLCBtYXJrZWQgYXMgYQotY29weXJpZ2h0IHN0cmluZy4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEVMRgotQGl0ZW0gLmNvcHlyaWdodCAiQHZhcntzdHJpbmd9IgotSW4gdGhlIEVMRiBvYmplY3QgZm9ybWF0LCBpbnNlcnQgQHZhcntzdHJpbmd9IGludG8gdGhlIG9iamVjdCBjb2RlLCBtYXJrZWQgYXMgYQotdmVyc2lvbiBzdHJpbmcuCi1AZW5kIGlmc2V0Ci0KLUBpdGVtIC5lbnRlcgotTm90IHlldCBzdXBwb3J0ZWQ7IHRoZSBhc3NlbWJsZXIgcmVqZWN0cyBwcm9ncmFtcyBjb250YWluaW5nIHRoaXMgZGlyZWN0aXZlLgotCi1AaXRlbSAuZW50cnkKLU1hcmsgdGhlIGJlZ2lubmluZyBvZiBhIHByb2NlZHVyZS4KLQotQGl0ZW0gLmV4aXQKLU1hcmsgdGhlIGVuZCBvZiBhIHByb2NlZHVyZS4KLQotQGl0ZW0gLmV4cG9ydCBAdmFye25hbWV9IFsgLEB2YXJ7dHlwfSBdICBbICxAdmFye3BhcmFtfT1AdmFye3J9IF0KLU1ha2UgYSBwcm9jZWR1cmUgQHZhcntuYW1lfSBhdmFpbGFibGUgdG8gY2FsbGVycy4gIEB2YXJ7dHlwfSwgaWYgcHJlc2VudCwgbXVzdAotYmUgb25lIG9mIEBzYW1we2Fic29sdXRlfSwgQHNhbXB7Y29kZX0gKEVMRiBvbmx5LCBub3QgU09NKSwgQHNhbXB7ZGF0YX0sCi1Ac2FtcHtlbnRyeX0sIEBzYW1we2RhdGF9LCBAc2FtcHtlbnRyeX0sIEBzYW1we21pbGxpY29kZX0sIEBzYW1we3BsYWJlbH0sCi1Ac2FtcHtwcmlfcHJvZ30sIG9yIEBzYW1we3NlY19wcm9nfS4KLQotQHZhcntwYXJhbX0sIGlmIHByZXNlbnQsIHByb3ZpZGVzIGVpdGhlciByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUKLXByb2NlZHVyZSBhcmd1bWVudHMgYW5kIHJlc3VsdCwgb3IgYSBwcml2aWxlZ2UgbGV2ZWwuICBAdmFye3BhcmFtfSBtYXkgYmUKLUBzYW1we2FyZ3dAdmFye259fSAod2hlcmUgQHZhcntufSByYW5nZXMgZnJvbSBAY29kZXswfSB0byBAY29kZXszfSwgYW5kCi1pbmRpY2F0ZXMgb25lIG9mIGZvdXIgb25lLXdvcmQgYXJndW1lbnRzKTsgQHNhbXB7cnRudmFsfSAodGhlIHByb2NlZHVyZSdzCi1yZXN1bHQpOyBvciBAc2FtcHtwcml2X2xldn0gKHByaXZpbGVnZSBsZXZlbCkuICBGb3IgYXJndW1lbnRzIG9yIHRoZSByZXN1bHQsCi1AdmFye3J9IHNwZWNpZmllcyBob3cgdG8gcmVsb2NhdGUsIGFuZCBtdXN0IGJlIG9uZSBvZiBAc2FtcHtub30gKG5vdAotcmVsb2NhdGFibGUpLCBAc2FtcHtncn0gKGFyZ3VtZW50IGlzIGluIGdlbmVyYWwgcmVnaXN0ZXIpLCBAc2FtcHtmcn0gKGluCi1mbG9hdGluZyBwb2ludCByZWdpc3RlciksIG9yIEBzYW1we2Z1fSAodXBwZXIgaGFsZiBvZiBmbG9hdCByZWdpc3RlcikuCi1Gb3IgQHNhbXB7cHJpdl9sZXZ9LCBAdmFye3J9IGlzIGFuIGludGVnZXIuCi0KLUBpdGVtIC5oYWxmIEB2YXJ7bn0KLURlZmluZSBhIHR3by1ieXRlIGludGVnZXIgY29uc3RhbnQgQHZhcntufTsgc3lub255bSBmb3IgdGhlIHBvcnRhYmxlCi1AY29kZXtAdmFsdWV7QVN9fSBkaXJlY3RpdmUgQGNvZGV7LnNob3J0fS4KLQotQGl0ZW0gLmltcG9ydCBAdmFye25hbWV9IFsgLEB2YXJ7dHlwfSBdCi1Db252ZXJzZSBvZiBAY29kZXsuZXhwb3J0fTsgbWFrZSBhIHByb2NlZHVyZSBhdmFpbGFibGUgdG8gY2FsbC4gIFRoZSBhcmd1bWVudHMKLXVzZSB0aGUgc2FtZSBjb252ZW50aW9ucyBhcyB0aGUgZmlyc3QgdHdvIGFyZ3VtZW50cyBmb3IgQGNvZGV7LmV4cG9ydH0uCi0KLUBpdGVtIC5sYWJlbCBAdmFye25hbWV9Ci1EZWZpbmUgQHZhcntuYW1lfSBhcyBhIGxhYmVsIGZvciB0aGUgY3VycmVudCBhc3NlbWJseSBsb2NhdGlvbi4KLQotQGl0ZW0gLmxlYXZlCi1Ob3QgeWV0IHN1cHBvcnRlZDsgdGhlIGFzc2VtYmxlciByZWplY3RzIHByb2dyYW1zIGNvbnRhaW5pbmcgdGhpcyBkaXJlY3RpdmUuCi0KLUBpdGVtIC5vcmlnaW4gQHZhcntsY30KLUFkdmFuY2UgbG9jYXRpb24gY291bnRlciB0byBAdmFye2xjfS4gU3lub255bSBmb3IgdGhlIEBjb2Rle0B2YWx1ZXthc319Ci1wb3J0YWJsZSBkaXJlY3RpdmUgQGNvZGV7Lm9yZ30uCi0KLUBpdGVtIC5wYXJhbSBAdmFye25hbWV9IFsgLEB2YXJ7dHlwfSBdICBbICxAdmFye3BhcmFtfT1AdmFye3J9IF0KLUBjIE5vdCBpbiBIUCBtYW51YWw7IEBzY3tnbnV9IEhQUEEgZXh0ZW5zaW9uCi1TaW1pbGFyIHRvIEBjb2Rley5leHBvcnR9LCBidXQgdXNlZCBmb3Igc3RhdGljIHByb2NlZHVyZXMuCi0KLUBpdGVtIC5wcm9jCi1Vc2UgcHJlY2VkaW5nIHRoZSBmaXJzdCBzdGF0ZW1lbnQgb2YgYSBwcm9jZWR1cmUuCi0KLUBpdGVtIC5wcm9jZW5kCi1Vc2UgZm9sbG93aW5nIHRoZSBsYXN0IHN0YXRlbWVudCBvZiBhIHByb2NlZHVyZS4KLQotQGl0ZW0gQHZhcntsYWJlbH0gLnJlZyBAdmFye2V4cHJ9Ci1AYyA/PyBOb3QgaW4gSFAgbWFudWFsIChKYW4gMTk4OCB2bikKLVN5bm9ueW0gZm9yIEBjb2Rley5lcXV9OyBkZWZpbmUgQHZhcntsYWJlbH0gd2l0aCB0aGUgYWJzb2x1dGUgZXhwcmVzc2lvbgotQHZhcntleHByfSBhcyBpdHMgdmFsdWUuCi0KLUBpdGVtIC5zcGFjZSBAdmFye3NlY25hbWV9IFsgLEB2YXJ7cGFyYW1zfSBdCi1Td2l0Y2ggdG8gc2VjdGlvbiBAdmFye3NlY25hbWV9LCBjcmVhdGluZyBhIG5ldyBzZWN0aW9uIGJ5IHRoYXQgbmFtZSBpZgotbmVjZXNzYXJ5LiAgWW91IG1heSBvbmx5IHVzZSBAdmFye3BhcmFtc30gd2hlbiBjcmVhdGluZyBhIG5ldyBzZWN0aW9uLCBub3QKLXdoZW4gc3dpdGNoaW5nIHRvIGFuIGV4aXN0aW5nIG9uZS4gIEB2YXJ7c2VjbmFtZX0gbWF5IGlkZW50aWZ5IGEgc2VjdGlvbiBieQotbnVtYmVyIHJhdGhlciB0aGFuIGJ5IG5hbWUuCi0KLUlmIHNwZWNpZmllZCwgdGhlIGxpc3QgQHZhcntwYXJhbXN9IGRlY2xhcmVzIGF0dHJpYnV0ZXMgb2YgdGhlIHNlY3Rpb24sCi1pZGVudGlmaWVkIGJ5IGtleXdvcmRzLiAgVGhlIGtleXdvcmRzIHJlY29nbml6ZWQgYXJlIEBzYW1we3NwbnVtPUB2YXJ7ZXhwfX0KLShpZGVudGlmeSB0aGlzIHNlY3Rpb24gYnkgdGhlIG51bWJlciBAdmFye2V4cH0sIGFuIGFic29sdXRlIGV4cHJlc3Npb24pLAotQHNhbXB7c29ydD1AdmFye2V4cH19IChvcmRlciBzZWN0aW9ucyBhY2NvcmRpbmcgdG8gdGhpcyBzb3J0IGtleSB3aGVuIGxpbmtpbmc7Ci1AdmFye2V4cH0gaXMgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiksIEBzYW1we3VubG9hZGFibGV9IChzZWN0aW9uIGNvbnRhaW5zIG5vCi1sb2FkYWJsZSBkYXRhKSwgQHNhbXB7bm90ZGVmaW5lZH0gKHRoaXMgc2VjdGlvbiBkZWZpbmVkIGVsc2V3aGVyZSksIGFuZAotQHNhbXB7cHJpdmF0ZX0gKGRhdGEgaW4gdGhpcyBzZWN0aW9uIG5vdCBhdmFpbGFibGUgdG8gb3RoZXIgcHJvZ3JhbXMpLgotCi1AaXRlbSAuc3BudW0gQHZhcntzZWNuYW19Ci1AYyA/PyBOb3QgaW4gSFAgbWFudWFsIChKYW4gMTk4OCkKLUFsbG9jYXRlIGZvdXIgYnl0ZXMgb2Ygc3RvcmFnZSwgYW5kIGluaXRpYWxpemUgdGhlbSB3aXRoIHRoZSBzZWN0aW9uIG51bWJlciBvZgotdGhlIHNlY3Rpb24gbmFtZWQgQHZhcntzZWNuYW19LiAgKFlvdSBjYW4gZGVmaW5lIHRoZSBzZWN0aW9uIG51bWJlciB3aXRoIHRoZQotSFBQQSBAY29kZXsuc3BhY2V9IGRpcmVjdGl2ZS4pCi0KLUBjaW5kZXggQGNvZGV7c3RyaW5nfSBkaXJlY3RpdmUgb24gSFBQQQotQGl0ZW0gLnN0cmluZyAiQHZhcntzdHJ9IgotQ29weSB0aGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIEB2YXJ7c3RyfSB0byB0aGUgb2JqZWN0IGZpbGUuCi1AeHJlZntTdHJpbmdzLCxTdHJpbmdzfSwgZm9yIGluZm9ybWF0aW9uIG9uIGVzY2FwZSBzZXF1ZW5jZXMgeW91IGNhbiB1c2UgaW4KLUBjb2Rle0B2YWx1ZXtBU319IHN0cmluZ3MuCi0KLUBlbXBoe1dhcm5pbmchfSBUaGUgSFBQQSB2ZXJzaW9uIG9mIEBjb2Rley5zdHJpbmd9IGRpZmZlcnMgZnJvbSB0aGUKLXVzdWFsIEBjb2Rle0B2YWx1ZXtBU319IGRlZmluaXRpb246IGl0IGRvZXMgQGVtcGh7bm90fSB3cml0ZSBhIHplcm8gYnl0ZQotYWZ0ZXIgY29weWluZyBAdmFye3N0cn0uCi0KLUBpdGVtIC5zdHJpbmd6ICJAdmFye3N0cn0iCi1MaWtlIEBjb2Rley5zdHJpbmd9LCBidXQgYXBwZW5kcyBhIHplcm8gYnl0ZSBhZnRlciBjb3B5aW5nIEB2YXJ7c3RyfSB0byBvYmplY3QKLWZpbGUuCi0KLUBpdGVtIC5zdWJzcGEgQHZhcntuYW1lfSBbICxAdmFye3BhcmFtc30gXQotQGl0ZW14IC5uc3Vic3BhIEB2YXJ7bmFtZX0gWyAsQHZhcntwYXJhbXN9IF0KLVNpbWlsYXIgdG8gQGNvZGV7LnNwYWNlfSwgYnV0IHNlbGVjdHMgYSBzdWJzZWN0aW9uIEB2YXJ7bmFtZX0gd2l0aGluIHRoZQotY3VycmVudCBzZWN0aW9uLiAgWW91IG1heSBvbmx5IHNwZWNpZnkgQHZhcntwYXJhbXN9IHdoZW4geW91IGNyZWF0ZSBhCi1zdWJzZWN0aW9uIChpbiB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgQGNvZGV7LnN1YnNwYX0gZm9yIHRoaXMgQHZhcntuYW1lfSkuCi0KLUlmIHNwZWNpZmllZCwgdGhlIGxpc3QgQHZhcntwYXJhbXN9IGRlY2xhcmVzIGF0dHJpYnV0ZXMgb2YgdGhlIHN1YnNlY3Rpb24sCi1pZGVudGlmaWVkIGJ5IGtleXdvcmRzLiAgVGhlIGtleXdvcmRzIHJlY29nbml6ZWQgYXJlIEBzYW1we3F1YWQ9QHZhcntleHByfX0KLShgYHF1YWRyYW50JycgZm9yIHRoaXMgc3Vic2VjdGlvbiksIEBzYW1we2FsaWduPUB2YXJ7ZXhwcn19IChhbGlnbm1lbnQgZm9yCi1iZWdpbm5pbmcgb2YgdGhpcyBzdWJzZWN0aW9uOyBhIHBvd2VyIG9mIHR3byksIEBzYW1we2FjY2Vzcz1AdmFye2V4cHJ9fSAodmFsdWUKLWZvciBgYGFjY2VzcyByaWdodHMnJyBmaWVsZCksIEBzYW1we3NvcnQ9QHZhcntleHByfX0gKHNvcnRpbmcgb3JkZXIgZm9yIHRoaXMKLXN1YnNwYWNlIGluIGxpbmspLCBAc2FtcHtjb2RlX29ubHl9IChzdWJzZWN0aW9uIGNvbnRhaW5zIG9ubHkgY29kZSksCi1Ac2FtcHt1bmxvYWRhYmxlfSAoc3Vic2VjdGlvbiBjYW5ub3QgYmUgbG9hZGVkIGludG8gbWVtb3J5KSwgQHNhbXB7Y29tbW9ufQotKHN1YnNlY3Rpb24gaXMgY29tbW9uIGJsb2NrKSwgQHNhbXB7ZHVwX2NvbW19IChpbml0aWFsaXplZCBkYXRhIG1heSBoYXZlCi1kdXBsaWNhdGUgbmFtZXMpLCBvciBAc2FtcHt6ZXJvfSAoc3Vic2VjdGlvbiBpcyBhbGwgemVyb3MsIGRvIG5vdCB3cml0ZSBpbgotb2JqZWN0IGZpbGUpLgotCi1AY29kZXsubnN1YnNwYX0gYWx3YXlzIGNyZWF0ZXMgYSBuZXcgc3Vic3BhY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgZXZlbgotaWYgb25lIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLQotQGl0ZW0gLnZlcnNpb24gIkB2YXJ7c3RyfSIKLVdyaXRlIEB2YXJ7c3RyfSBhcyB2ZXJzaW9uIGlkZW50aWZpZXIgaW4gb2JqZWN0IGNvZGUuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEhQUEEgT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBIUFBBIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUKLUBjaXRle1BBLVJJU0MgQXJjaGl0ZWN0dXJlIGFuZCBJbnN0cnVjdGlvbiBTZXQgUmVmZXJlbmNlIE1hbnVhbH0gCi0oSFAgMDk3NDAtOTAwMzkpLgpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWkzODYudGV4aSBiL2dhcy9kb2MvYy1pMzg2LnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNzg5M2IuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWkzODYudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBpMzg2LURlcGVuZGVudAotQGNoYXB0ZXIgODAzODYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgODAzODYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBpMzg2IHN1cHBvcnQKLUBjaW5kZXggaTgwMzA2IHN1cHBvcnQKLUBtZW51Ci0qIGkzODYtT3B0aW9uczo6ICAgICAgICAgICAgICAgIE9wdGlvbnMKLSogaTM4Ni1TeW50YXg6OiAgICAgICAgICAgICAgICAgQVQmVCBTeW50YXggdmVyc3VzIEludGVsIFN5bnRheAotKiBpMzg2LU1uZW1vbmljczo6ICAgICAgICAgICAgICBJbnN0cnVjdGlvbiBOYW1pbmcKLSogaTM4Ni1SZWdzOjogICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtaW5nCi0qIGkzODYtUHJlZml4ZXM6OiAgICAgICAgICAgICAgIEluc3RydWN0aW9uIFByZWZpeGVzCi0qIGkzODYtTWVtb3J5OjogICAgICAgICAgICAgICAgIE1lbW9yeSBSZWZlcmVuY2VzCi0qIGkzODYtanVtcHM6OiAgICAgICAgICAgICAgICAgIEhhbmRsaW5nIG9mIEp1bXAgSW5zdHJ1Y3Rpb25zCi0qIGkzODYtRmxvYXQ6OiAgICAgICAgICAgICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIGkzODYtU0lNRDo6ICAgICAgICAgICAgICAgICAgIEludGVsJ3MgTU1YIGFuZCBBTUQncyAzRE5vdyEgU0lNRCBPcGVyYXRpb25zCi0qIGkzODYtMTZiaXQ6OiAgICAgICAgICAgICAgICAgIFdyaXRpbmcgMTYtYml0IENvZGUKLSogaTM4Ni1CdWdzOjogICAgICAgICAgICAgICAgICAgQVQmVCBTeW50YXggYnVncwotKiBpMzg2LU5vdGVzOjogICAgICAgICAgICAgICAgICBOb3RlcwotQGVuZCBtZW51Ci0KLUBub2RlIGkzODYtT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotCi1AY2luZGV4IG9wdGlvbnMgZm9yIGkzODYgKG5vbmUpCi1AY2luZGV4IGkzODYgb3B0aW9ucyAobm9uZSkKLVRoZSA4MDM4NiBoYXMgbm8gbWFjaGluZSBkZXBlbmRlbnQgb3B0aW9ucy4KLQotQG5vZGUgaTM4Ni1TeW50YXgKLUBzZWN0aW9uIEFUJlQgU3ludGF4IHZlcnN1cyBJbnRlbCBTeW50YXgKLQotQGNpbmRleCBpMzg2IHN5bnRheCBjb21wYXRpYmlsaXR5Ci1AY2luZGV4IHN5bnRheCBjb21wYXRpYmlsaXR5LCBpMzg2Ci1JbiBvcmRlciB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG91dHB1dCBvZiBAY29kZXtAdmFsdWV7R0NDfX0sCi1AY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyBBVCZUIFN5c3RlbSBWLzM4NiBhc3NlbWJsZXIgc3ludGF4LiAgVGhpcyBpcyBxdWl0ZQotZGlmZmVyZW50IGZyb20gSW50ZWwgc3ludGF4LiAgV2UgbWVudGlvbiB0aGVzZSBkaWZmZXJlbmNlcyBiZWNhdXNlCi1hbG1vc3QgYWxsIDgwMzg2IGRvY3VtZW50cyB1c2UgSW50ZWwgc3ludGF4LiAgTm90YWJsZSBkaWZmZXJlbmNlcwotYmV0d2VlbiB0aGUgdHdvIHN5bnRheGVzIGFyZToKLQotQGNpbmRleCBpbW1lZGlhdGUgb3BlcmFuZHMsIGkzODYKLUBjaW5kZXggaTM4NiBpbW1lZGlhdGUgb3BlcmFuZHMKLUBjaW5kZXggcmVnaXN0ZXIgb3BlcmFuZHMsIGkzODYKLUBjaW5kZXggaTM4NiByZWdpc3RlciBvcGVyYW5kcwotQGNpbmRleCBqdW1wL2NhbGwgb3BlcmFuZHMsIGkzODYKLUBjaW5kZXggaTM4NiBqdW1wL2NhbGwgb3BlcmFuZHMKLUBjaW5kZXggb3BlcmFuZCBkZWxpbWl0ZXJzLCBpMzg2Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQVQmVCBpbW1lZGlhdGUgb3BlcmFuZHMgYXJlIHByZWNlZGVkIGJ5IEBzYW1weyR9OyBJbnRlbCBpbW1lZGlhdGUKLW9wZXJhbmRzIGFyZSB1bmRlbGltaXRlZCAoSW50ZWwgQHNhbXB7cHVzaCA0fSBpcyBBVCZUIEBzYW1we3B1c2hsICQ0fSkuCi1BVCZUIHJlZ2lzdGVyIG9wZXJhbmRzIGFyZSBwcmVjZWRlZCBieSBAc2FtcHslfTsgSW50ZWwgcmVnaXN0ZXIgb3BlcmFuZHMKLWFyZSB1bmRlbGltaXRlZC4gIEFUJlQgYWJzb2x1dGUgKGFzIG9wcG9zZWQgdG8gUEMgcmVsYXRpdmUpIGp1bXAvY2FsbAotb3BlcmFuZHMgYXJlIHByZWZpeGVkIGJ5IEBzYW1weyp9OyB0aGV5IGFyZSB1bmRlbGltaXRlZCBpbiBJbnRlbCBzeW50YXguCi0KLUBjaW5kZXggaTM4NiBzb3VyY2UsIGRlc3RpbmF0aW9uIG9wZXJhbmRzCi1AY2luZGV4IHNvdXJjZSwgZGVzdGluYXRpb24gb3BlcmFuZHM7IGkzODYKLUBpdGVtCi1BVCZUIGFuZCBJbnRlbCBzeW50YXggdXNlIHRoZSBvcHBvc2l0ZSBvcmRlciBmb3Igc291cmNlIGFuZCBkZXN0aW5hdGlvbgotb3BlcmFuZHMuICBJbnRlbCBAc2FtcHthZGQgZWF4LCA0fSBpcyBAc2FtcHthZGRsICQ0LCAlZWF4fS4gIFRoZQotQHNhbXB7c291cmNlLCBkZXN0fSBjb252ZW50aW9uIGlzIG1haW50YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAotcHJldmlvdXMgVW5peCBhc3NlbWJsZXJzLiAgTm90ZSB0aGF0IGluc3RydWN0aW9ucyB3aXRoIG1vcmUgdGhhbiBvbmUKLXNvdXJjZSBvcGVyYW5kLCBzdWNoIGFzIHRoZSBAc2FtcHtlbnRlcn0gaW5zdHJ1Y3Rpb24sIGRvIEBlbXBoe25vdH0gaGF2ZQotcmV2ZXJzZWQgb3JkZXIuICBAcmVme2kzODYtQnVnc30uCi0KLUBjaW5kZXggbW5lbW9uaWMgc3VmZml4ZXMsIGkzODYKLUBjaW5kZXggc2l6ZXMgb3BlcmFuZHMsIGkzODYKLUBjaW5kZXggaTM4NiBzaXplIHN1ZmZpeGVzCi1AaXRlbQotSW4gQVQmVCBzeW50YXggdGhlIHNpemUgb2YgbWVtb3J5IG9wZXJhbmRzIGlzIGRldGVybWluZWQgZnJvbSB0aGUgbGFzdAotY2hhcmFjdGVyIG9mIHRoZSBpbnN0cnVjdGlvbiBtbmVtb25pYy4gIE1uZW1vbmljIHN1ZmZpeGVzIG9mIEBzYW1we2J9LAotQHNhbXB7d30sIGFuZCBAc2FtcHtsfSBzcGVjaWZ5IGJ5dGUgKDgtYml0KSwgd29yZCAoMTYtYml0KSwgYW5kIGxvbmcKLSgzMi1iaXQpIG1lbW9yeSByZWZlcmVuY2VzLiAgSW50ZWwgc3ludGF4IGFjY29tcGxpc2hlcyB0aGlzIGJ5IHByZWZpeGluZwotbWVtb3J5IG9wZXJhbmRzIChAZW1waHtub3R9IHRoZSBpbnN0cnVjdGlvbiBtbmVtb25pY3MpIHdpdGggQHNhbXB7Ynl0ZQotcHRyfSwgQHNhbXB7d29yZCBwdHJ9LCBhbmQgQHNhbXB7ZHdvcmQgcHRyfS4gIFRodXMsIEludGVsIEBzYW1we21vdiBhbCwKLWJ5dGUgcHRyIEB2YXJ7Zm9vfX0gaXMgQHNhbXB7bW92YiBAdmFye2Zvb30sICVhbH0gaW4gQVQmVCBzeW50YXguCi0KLUBjaW5kZXggcmV0dXJuIGluc3RydWN0aW9ucywgaTM4NgotQGNpbmRleCBpMzg2IGp1bXAsIGNhbGwsIHJldHVybgotQGl0ZW0KLUltbWVkaWF0ZSBmb3JtIGxvbmcganVtcHMgYW5kIGNhbGxzIGFyZQotQHNhbXB7bGNhbGwvbGptcCAkQHZhcntzZWN0aW9ufSwgJEB2YXJ7b2Zmc2V0fX0gaW4gQVQmVCBzeW50YXg7IHRoZQotSW50ZWwgc3ludGF4IGlzCi1Ac2FtcHtjYWxsL2ptcCBmYXIgQHZhcntzZWN0aW9ufTpAdmFye29mZnNldH19LiAgQWxzbywgdGhlIGZhciByZXR1cm4KLWluc3RydWN0aW9uCi1pcyBAc2FtcHtscmV0ICRAdmFye3N0YWNrLWFkanVzdH19IGluIEFUJlQgc3ludGF4OyBJbnRlbCBzeW50YXggaXMKLUBzYW1we3JldCBmYXIgQHZhcntzdGFjay1hZGp1c3R9fS4KLQotQGNpbmRleCBzZWN0aW9ucywgaTM4NgotQGNpbmRleCBpMzg2IHNlY3Rpb25zCi1AaXRlbQotVGhlIEFUJlQgYXNzZW1ibGVyIGRvZXMgbm90IHByb3ZpZGUgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc2VjdGlvbgotcHJvZ3JhbXMuICBVbml4IHN0eWxlIHN5c3RlbXMgZXhwZWN0IGFsbCBwcm9ncmFtcyB0byBiZSBzaW5nbGUgc2VjdGlvbnMuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgaTM4Ni1NbmVtb25pY3MKLUBzZWN0aW9uIEluc3RydWN0aW9uIE5hbWluZwotCi1AY2luZGV4IGkzODYgaW5zdHJ1Y3Rpb24gbmFtaW5nCi1AY2luZGV4IGluc3RydWN0aW9uIG5hbWluZywgaTM4NgotSW5zdHJ1Y3Rpb24gbW5lbW9uaWNzIGFyZSBzdWZmaXhlZCB3aXRoIG9uZSBjaGFyYWN0ZXIgbW9kaWZpZXJzIHdoaWNoCi1zcGVjaWZ5IHRoZSBzaXplIG9mIG9wZXJhbmRzLiAgVGhlIGxldHRlcnMgQHNhbXB7Yn0sIEBzYW1we3d9LCBhbmQKLUBzYW1we2x9IHNwZWNpZnkgYnl0ZSwgd29yZCwgYW5kIGxvbmcgb3BlcmFuZHMuICBJZiBubyBzdWZmaXggaXMKLXNwZWNpZmllZCBieSBhbiBpbnN0cnVjdGlvbiB0aGVuIEBjb2Rle0B2YWx1ZXtBU319IHRyaWVzIHRvIGZpbGwgaW4gdGhlCi1taXNzaW5nIHN1ZmZpeCBiYXNlZCBvbiB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgb3BlcmFuZCAodGhlIGxhc3Qgb25lCi1ieSBjb252ZW50aW9uKS4gIFRodXMsIEBzYW1we21vdiAlYXgsICVieH0gaXMgZXF1aXZhbGVudCB0byBAc2FtcHttb3Z3Ci0lYXgsICVieH07IGFsc28sIEBzYW1we21vdiAkMSwgJWJ4fSBpcyBlcXVpdmFsZW50IHRvIEBzYW1we21vdncgJDEsCi0lYnh9LiAgTm90ZSB0aGF0IHRoaXMgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIEFUJlQgVW5peCBhc3NlbWJsZXIgd2hpY2gKLWFzc3VtZXMgdGhhdCBhIG1pc3NpbmcgbW5lbW9uaWMgc3VmZml4IGltcGxpZXMgbG9uZyBvcGVyYW5kIHNpemUuICAoVGhpcwotaW5jb21wYXRpYmlsaXR5IGRvZXMgbm90IGFmZmVjdCBjb21waWxlciBvdXRwdXQgc2luY2UgY29tcGlsZXJzIGFsd2F5cwotZXhwbGljaXRseSBzcGVjaWZ5IHRoZSBtbmVtb25pYyBzdWZmaXguKQotCi1BbG1vc3QgYWxsIGluc3RydWN0aW9ucyBoYXZlIHRoZSBzYW1lIG5hbWVzIGluIEFUJlQgYW5kIEludGVsIGZvcm1hdC4KLVRoZXJlIGFyZSBhIGZldyBleGNlcHRpb25zLiAgVGhlIHNpZ24gZXh0ZW5kIGFuZCB6ZXJvIGV4dGVuZAotaW5zdHJ1Y3Rpb25zIG5lZWQgdHdvIHNpemVzIHRvIHNwZWNpZnkgdGhlbS4gIFRoZXkgbmVlZCBhIHNpemUgdG8KLXNpZ24vemVybyBleHRlbmQgQGVtcGh7ZnJvbX0gYW5kIGEgc2l6ZSB0byB6ZXJvIGV4dGVuZCBAZW1waHt0b30uICBUaGlzCi1pcyBhY2NvbXBsaXNoZWQgYnkgdXNpbmcgdHdvIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeGVzIGluIEFUJlQKLXN5bnRheC4gIEJhc2UgbmFtZXMgZm9yIHNpZ24gZXh0ZW5kIGFuZCB6ZXJvIGV4dGVuZCBhcmUKLUBzYW1we21vdnNAZG90c3t9fSBhbmQgQHNhbXB7bW92ekBkb3Rze319IGluIEFUJlQgc3ludGF4IChAc2FtcHttb3ZzeH0KLWFuZCBAc2FtcHttb3Z6eH0gaW4gSW50ZWwgc3ludGF4KS4gIFRoZSBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcwotYXJlIHRhY2tlZCBvbiB0byB0aGlzIGJhc2UgbmFtZSwgdGhlIEBlbXBoe2Zyb219IHN1ZmZpeCBiZWZvcmUgdGhlCi1AZW1waHt0b30gc3VmZml4LiAgVGh1cywgQHNhbXB7bW92c2JsICVhbCwgJWVkeH0gaXMgQVQmVCBzeW50YXggZm9yCi1gYG1vdmUgc2lnbiBleHRlbmQgQGVtcGh7ZnJvbX0gJWFsIEBlbXBoe3RvfSAlZWR4LicnICBQb3NzaWJsZSBzdWZmaXhlcywKLXRodXMsIGFyZSBAc2FtcHtibH0gKGZyb20gYnl0ZSB0byBsb25nKSwgQHNhbXB7Ynd9IChmcm9tIGJ5dGUgdG8gd29yZCksCi1hbmQgQHNhbXB7d2x9IChmcm9tIHdvcmQgdG8gbG9uZykuCi0KLUBjaW5kZXggY29udmVyc2lvbiBpbnN0cnVjdGlvbnMsIGkzODYKLUBjaW5kZXggaTM4NiBjb252ZXJzaW9uIGluc3RydWN0aW9ucwotVGhlIEludGVsLXN5bnRheCBjb252ZXJzaW9uIGluc3RydWN0aW9ucwotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQHNhbXB7Y2J3fSAtLS0gc2lnbi1leHRlbmQgYnl0ZSBpbiBAc2FtcHslYWx9IHRvIHdvcmQgaW4gQHNhbXB7JWF4fSwKLQotQGl0ZW0KLUBzYW1we2N3ZGV9IC0tLSBzaWduLWV4dGVuZCB3b3JkIGluIEBzYW1weyVheH0gdG8gbG9uZyBpbiBAc2FtcHslZWF4fSwKLQotQGl0ZW0KLUBzYW1we2N3ZH0gLS0tIHNpZ24tZXh0ZW5kIHdvcmQgaW4gQHNhbXB7JWF4fSB0byBsb25nIGluIEBzYW1weyVkeDolYXh9LAotCi1AaXRlbQotQHNhbXB7Y2RxfSAtLS0gc2lnbi1leHRlbmQgZHdvcmQgaW4gQHNhbXB7JWVheH0gdG8gcXVhZCBpbiBAc2FtcHslZWR4OiVlYXh9LAotQGVuZCBpdGVtaXplCi0KLUBub2luZGVudAotYXJlIGNhbGxlZCBAc2FtcHtjYnR3fSwgQHNhbXB7Y3d0bH0sIEBzYW1we2N3dGR9LCBhbmQgQHNhbXB7Y2x0ZH0gaW4KLUFUJlQgbmFtaW5nLiAgQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cyBlaXRoZXIgbmFtaW5nIGZvciB0aGVzZSBpbnN0cnVjdGlvbnMuCi0KLUBjaW5kZXgganVtcCBpbnN0cnVjdGlvbnMsIGkzODYKLUBjaW5kZXggY2FsbCBpbnN0cnVjdGlvbnMsIGkzODYKLUZhciBjYWxsL2p1bXAgaW5zdHJ1Y3Rpb25zIGFyZSBAc2FtcHtsY2FsbH0gYW5kIEBzYW1we2xqbXB9IGluCi1BVCZUIHN5bnRheCwgYnV0IGFyZSBAc2FtcHtjYWxsIGZhcn0gYW5kIEBzYW1we2p1bXAgZmFyfSBpbiBJbnRlbAotY29udmVudGlvbi4KLQotQG5vZGUgaTM4Ni1SZWdzCi1Ac2VjdGlvbiBSZWdpc3RlciBOYW1pbmcKLQotQGNpbmRleCBpMzg2IHJlZ2lzdGVycwotQGNpbmRleCByZWdpc3RlcnMsIGkzODYKLVJlZ2lzdGVyIG9wZXJhbmRzIGFyZSBhbHdheXMgcHJlZml4ZWQgd2l0aCBAc2FtcHslfS4gIFRoZSA4MDM4NiByZWdpc3RlcnMKLWNvbnNpc3Qgb2YKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLXRoZSA4IDMyLWJpdCByZWdpc3RlcnMgQHNhbXB7JWVheH0gKHRoZSBhY2N1bXVsYXRvciksIEBzYW1weyVlYnh9LAotQHNhbXB7JWVjeH0sIEBzYW1weyVlZHh9LCBAc2FtcHslZWRpfSwgQHNhbXB7JWVzaX0sIEBzYW1weyVlYnB9ICh0aGUKLWZyYW1lIHBvaW50ZXIpLCBhbmQgQHNhbXB7JWVzcH0gKHRoZSBzdGFjayBwb2ludGVyKS4KLQotQGl0ZW0KLXRoZSA4IDE2LWJpdCBsb3ctZW5kcyBvZiB0aGVzZTogQHNhbXB7JWF4fSwgQHNhbXB7JWJ4fSwgQHNhbXB7JWN4fSwKLUBzYW1weyVkeH0sIEBzYW1weyVkaX0sIEBzYW1weyVzaX0sIEBzYW1weyVicH0sIGFuZCBAc2FtcHslc3B9LgotCi1AaXRlbQotdGhlIDggOC1iaXQgcmVnaXN0ZXJzOiBAc2FtcHslYWh9LCBAc2FtcHslYWx9LCBAc2FtcHslYmh9LAotQHNhbXB7JWJsfSwgQHNhbXB7JWNofSwgQHNhbXB7JWNsfSwgQHNhbXB7JWRofSwgYW5kIEBzYW1weyVkbH0gKFRoZXNlCi1hcmUgdGhlIGhpZ2gtYnl0ZXMgYW5kIGxvdy1ieXRlcyBvZiBAc2FtcHslYXh9LCBAc2FtcHslYnh9LAotQHNhbXB7JWN4fSwgYW5kIEBzYW1weyVkeH0pCi0KLUBpdGVtCi10aGUgNiBzZWN0aW9uIHJlZ2lzdGVycyBAc2FtcHslY3N9IChjb2RlIHNlY3Rpb24pLCBAc2FtcHslZHN9Ci0oZGF0YSBzZWN0aW9uKSwgQHNhbXB7JXNzfSAoc3RhY2sgc2VjdGlvbiksIEBzYW1weyVlc30sIEBzYW1weyVmc30sCi1hbmQgQHNhbXB7JWdzfS4KLQotQGl0ZW0KLXRoZSAzIHByb2Nlc3NvciBjb250cm9sIHJlZ2lzdGVycyBAc2FtcHslY3IwfSwgQHNhbXB7JWNyMn0sIGFuZAotQHNhbXB7JWNyM30uCi0KLUBpdGVtCi10aGUgNiBkZWJ1ZyByZWdpc3RlcnMgQHNhbXB7JWRiMH0sIEBzYW1weyVkYjF9LCBAc2FtcHslZGIyfSwKLUBzYW1weyVkYjN9LCBAc2FtcHslZGI2fSwgYW5kIEBzYW1weyVkYjd9LgotCi1AaXRlbQotdGhlIDIgdGVzdCByZWdpc3RlcnMgQHNhbXB7JXRyNn0gYW5kIEBzYW1weyV0cjd9LgotCi1AaXRlbQotdGhlIDggZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgc3RhY2sgQHNhbXB7JXN0fSBvciBlcXVpdmFsZW50bHkKLUBzYW1weyVzdCgwKX0sIEBzYW1weyVzdCgxKX0sIEBzYW1weyVzdCgyKX0sIEBzYW1weyVzdCgzKX0sCi1Ac2FtcHslc3QoNCl9LCBAc2FtcHslc3QoNSl9LCBAc2FtcHslc3QoNil9LCBhbmQgQHNhbXB7JXN0KDcpfS4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBpMzg2LVByZWZpeGVzCi1Ac2VjdGlvbiBJbnN0cnVjdGlvbiBQcmVmaXhlcwotCi1AY2luZGV4IGkzODYgaW5zdHJ1Y3Rpb24gcHJlZml4ZXMKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gcHJlZml4ZXMsIGkzODYKLUBjaW5kZXggcHJlZml4ZXMsIGkzODYKLUluc3RydWN0aW9uIHByZWZpeGVzIGFyZSB1c2VkIHRvIG1vZGlmeSB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uLiAgVGhleQotYXJlIHVzZWQgdG8gcmVwZWF0IHN0cmluZyBpbnN0cnVjdGlvbnMsIHRvIHByb3ZpZGUgc2VjdGlvbiBvdmVycmlkZXMsIHRvCi1wZXJmb3JtIGJ1cyBsb2NrIG9wZXJhdGlvbnMsIGFuZCB0byBjaGFuZ2Ugb3BlcmFuZCBhbmQgYWRkcmVzcyBzaXplcy4KLShNb3N0IGluc3RydWN0aW9ucyB0aGF0IG5vcm1hbGx5IG9wZXJhdGUgb24gMzItYml0IG9wZXJhbmRzIHdpbGwgdXNlCi0xNi1iaXQgb3BlcmFuZHMgaWYgdGhlIGluc3RydWN0aW9uIGhhcyBhbiBgYG9wZXJhbmQgc2l6ZScnIHByZWZpeC4pCi1JbnN0cnVjdGlvbiBwcmVmaXhlcyBhcmUgYmVzdCB3cml0dGVuIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGluc3RydWN0aW9uCi10aGV5IGFjdCB1cG9uLiBGb3IgZXhhbXBsZSwgdGhlIEBzYW1we3NjYXN9IChzY2FuIHN0cmluZykgaW5zdHJ1Y3Rpb24gaXMKLXJlcGVhdGVkIHdpdGg6Ci0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgcmVwbmUgc2NhcyAlZXM6KCVlZGkpLCVhbAotQGVuZCBzbWFsbGV4YW1wbGUKLQotWW91IG1heSBhbHNvIHBsYWNlIHByZWZpeGVzIG9uIHRoZSBsaW5lcyBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdGhlCi1pbnN0cnVjdGlvbiwgYnV0IHRoaXMgY2lyY3VtdmVudHMgY2hlY2tzIHRoYXQgQGNvZGV7QHZhbHVle0FTfX0gZG9lcwotd2l0aCBwcmVmaXhlcywgYW5kIHdpbGwgbm90IHdvcmsgd2l0aCBhbGwgcHJlZml4ZXMuCi0KLUhlcmUgaXMgYSBsaXN0IG9mIGluc3RydWN0aW9uIHByZWZpeGVzOgotCi1AY2luZGV4IHNlY3Rpb24gb3ZlcnJpZGUgcHJlZml4ZXMsIGkzODYKLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1TZWN0aW9uIG92ZXJyaWRlIHByZWZpeGVzIEBzYW1we2NzfSwgQHNhbXB7ZHN9LCBAc2FtcHtzc30sIEBzYW1we2VzfSwKLUBzYW1we2ZzfSwgQHNhbXB7Z3N9LiAgVGhlc2UgYXJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgYnkgc3BlY2lmeWluZwotdXNpbmcgdGhlIEB2YXJ7c2VjdGlvbn06QHZhcnttZW1vcnktb3BlcmFuZH0gZm9ybSBmb3IgbWVtb3J5IHJlZmVyZW5jZXMuCi0KLUBjaW5kZXggc2l6ZSBwcmVmaXhlcywgaTM4NgotQGl0ZW0KLU9wZXJhbmQvQWRkcmVzcyBzaXplIHByZWZpeGVzIEBzYW1we2RhdGExNn0gYW5kIEBzYW1we2FkZHIxNn0KLWNoYW5nZSAzMi1iaXQgb3BlcmFuZHMvYWRkcmVzc2VzIGludG8gMTYtYml0IG9wZXJhbmRzL2FkZHJlc3NlcywKLXdoaWxlIEBzYW1we2RhdGEzMn0gYW5kIEBzYW1we2FkZHIzMn0gY2hhbmdlIDE2LWJpdCBvbmVzIChpbiBhCi1AY29kZXsuY29kZTE2fSBzZWN0aW9uKSBpbnRvIDMyLWJpdCBvcGVyYW5kcy9hZGRyZXNzZXMuICBUaGVzZSBwcmVmaXhlcwotQGVtcGh7bXVzdH0gYXBwZWFyIG9uIHRoZSBzYW1lIGxpbmUgb2YgY29kZSBhcyB0aGUgaW5zdHJ1Y3Rpb24gdGhleQotbW9kaWZ5LiBGb3IgZXhhbXBsZSwgaW4gYSAxNi1iaXQgQGNvZGV7LmNvZGUxNn0gc2VjdGlvbiwgeW91IG1pZ2h0Ci13cml0ZToKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICBhZGRyMzIgam1wbCAqKCVlYngpCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY2luZGV4IGJ1cyBsb2NrIHByZWZpeGVzLCBpMzg2Ci1AY2luZGV4IGluaGliaXRpbmcgaW50ZXJydXB0cywgaTM4NgotQGl0ZW0KLVRoZSBidXMgbG9jayBwcmVmaXggQHNhbXB7bG9ja30gaW5oaWJpdHMgaW50ZXJydXB0cyBkdXJpbmcgZXhlY3V0aW9uIG9mCi10aGUgaW5zdHJ1Y3Rpb24gaXQgcHJlY2VkZXMuICAoVGhpcyBpcyBvbmx5IHZhbGlkIHdpdGggY2VydGFpbgotaW5zdHJ1Y3Rpb25zOyBzZWUgYSA4MDM4NiBtYW51YWwgZm9yIGRldGFpbHMpLgotCi1AY2luZGV4IGNvcHJvY2Vzc29yIHdhaXQsIGkzODYKLUBpdGVtCi1UaGUgd2FpdCBmb3IgY29wcm9jZXNzb3IgcHJlZml4IEBzYW1we3dhaXR9IHdhaXRzIGZvciB0aGUgY29wcm9jZXNzb3IgdG8KLWNvbXBsZXRlIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLiAgVGhpcyBzaG91bGQgbmV2ZXIgYmUgbmVlZGVkIGZvciB0aGUKLTgwMzg2LzgwMzg3IGNvbWJpbmF0aW9uLgotCi1AY2luZGV4IHJlcGVhdCBwcmVmaXhlcywgaTM4NgotQGl0ZW0KLVRoZSBAc2FtcHtyZXB9LCBAc2FtcHtyZXBlfSwgYW5kIEBzYW1we3JlcG5lfSBwcmVmaXhlcyBhcmUgYWRkZWQKLXRvIHN0cmluZyBpbnN0cnVjdGlvbnMgdG8gbWFrZSB0aGVtIHJlcGVhdCBAc2FtcHslZWN4fSB0aW1lcyAoQHNhbXB7JWN4fQotdGltZXMgaWYgdGhlIGN1cnJlbnQgYWRkcmVzcyBzaXplIGlzIDE2LWJpdHMpLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIGkzODYtTWVtb3J5Ci1Ac2VjdGlvbiBNZW1vcnkgUmVmZXJlbmNlcwotCi1AY2luZGV4IGkzODYgbWVtb3J5IHJlZmVyZW5jZXMKLUBjaW5kZXggbWVtb3J5IHJlZmVyZW5jZXMsIGkzODYKLUFuIEludGVsIHN5bnRheCBpbmRpcmVjdCBtZW1vcnkgcmVmZXJlbmNlIG9mIHRoZSBmb3JtCi0KLUBzbWFsbGV4YW1wbGUKLUB2YXJ7c2VjdGlvbn06W0B2YXJ7YmFzZX0gKyBAdmFye2luZGV4fSpAdmFye3NjYWxlfSArIEB2YXJ7ZGlzcH1dCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLWlzIHRyYW5zbGF0ZWQgaW50byB0aGUgQVQmVCBzeW50YXgKLQotQHNtYWxsZXhhbXBsZQotQHZhcntzZWN0aW9ufTpAdmFye2Rpc3B9KEB2YXJ7YmFzZX0sIEB2YXJ7aW5kZXh9LCBAdmFye3NjYWxlfSkKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotd2hlcmUgQHZhcntiYXNlfSBhbmQgQHZhcntpbmRleH0gYXJlIHRoZSBvcHRpb25hbCAzMi1iaXQgYmFzZSBhbmQKLWluZGV4IHJlZ2lzdGVycywgQHZhcntkaXNwfSBpcyB0aGUgb3B0aW9uYWwgZGlzcGxhY2VtZW50LCBhbmQKLUB2YXJ7c2NhbGV9LCB0YWtpbmcgdGhlIHZhbHVlcyAxLCAyLCA0LCBhbmQgOCwgbXVsdGlwbGllcyBAdmFye2luZGV4fQotdG8gY2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBvcGVyYW5kLiAgSWYgbm8gQHZhcntzY2FsZX0gaXMKLXNwZWNpZmllZCwgQHZhcntzY2FsZX0gaXMgdGFrZW4gdG8gYmUgMS4gIEB2YXJ7c2VjdGlvbn0gc3BlY2lmaWVzIHRoZQotb3B0aW9uYWwgc2VjdGlvbiByZWdpc3RlciBmb3IgdGhlIG1lbW9yeSBvcGVyYW5kLCBhbmQgbWF5IG92ZXJyaWRlIHRoZQotZGVmYXVsdCBzZWN0aW9uIHJlZ2lzdGVyIChzZWUgYSA4MDM4NiBtYW51YWwgZm9yIHNlY3Rpb24gcmVnaXN0ZXIKLWRlZmF1bHRzKS4gTm90ZSB0aGF0IHNlY3Rpb24gb3ZlcnJpZGVzIGluIEFUJlQgc3ludGF4IEBlbXBoe211c3R9Ci1iZSBwcmVjZWRlZCBieSBhIEBzYW1weyV9LiAgSWYgeW91IHNwZWNpZnkgYSBzZWN0aW9uIG92ZXJyaWRlIHdoaWNoCi1jb2luY2lkZXMgd2l0aCB0aGUgZGVmYXVsdCBzZWN0aW9uIHJlZ2lzdGVyLCBAY29kZXtAdmFsdWV7QVN9fSBkb2VzIEBlbXBoe25vdH0KLW91dHB1dCBhbnkgc2VjdGlvbiByZWdpc3RlciBvdmVycmlkZSBwcmVmaXhlcyB0byBhc3NlbWJsZSB0aGUgZ2l2ZW4KLWluc3RydWN0aW9uLiAgVGh1cywgc2VjdGlvbiBvdmVycmlkZXMgY2FuIGJlIHNwZWNpZmllZCB0byBlbXBoYXNpemUgd2hpY2gKLXNlY3Rpb24gcmVnaXN0ZXIgaXMgdXNlZCBmb3IgYSBnaXZlbiBtZW1vcnkgb3BlcmFuZC4KLQotSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBJbnRlbCBhbmQgQVQmVCBzdHlsZSBtZW1vcnkgcmVmZXJlbmNlczoKLQotQHRhYmxlIEBhc2lzCi1AaXRlbSBBVCZUOiBAc2FtcHstNCglZWJwKX0sIEludGVsOiAgQHNhbXB7W2VicCAtIDRdfQotQHZhcntiYXNlfSBpcyBAc2FtcHslZWJwfTsgQHZhcntkaXNwfSBpcyBAc2FtcHstNH0uIEB2YXJ7c2VjdGlvbn0gaXMKLW1pc3NpbmcsIGFuZCB0aGUgZGVmYXVsdCBzZWN0aW9uIGlzIHVzZWQgKEBzYW1weyVzc30gZm9yIGFkZHJlc3Npbmcgd2l0aAotQHNhbXB7JWVicH0gYXMgdGhlIGJhc2UgcmVnaXN0ZXIpLiAgQHZhcntpbmRleH0sIEB2YXJ7c2NhbGV9IGFyZSBib3RoIG1pc3NpbmcuCi0KLUBpdGVtIEFUJlQ6IEBzYW1we2ZvbygsJWVheCw0KX0sIEludGVsOiBAc2FtcHtbZm9vICsgZWF4KjRdfQotQHZhcntpbmRleH0gaXMgQHNhbXB7JWVheH0gKHNjYWxlZCBieSBhIEB2YXJ7c2NhbGV9IDQpOyBAdmFye2Rpc3B9IGlzCi1Ac2FtcHtmb299LiAgQWxsIG90aGVyIGZpZWxkcyBhcmUgbWlzc2luZy4gIFRoZSBzZWN0aW9uIHJlZ2lzdGVyIGhlcmUKLWRlZmF1bHRzIHRvIEBzYW1weyVkc30uCi0KLUBpdGVtIEFUJlQ6IEBzYW1we2ZvbygsMSl9OyBJbnRlbCBAc2FtcHtbZm9vXX0KLVRoaXMgdXNlcyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSBAc2FtcHtmb299IGFzIGEgbWVtb3J5IG9wZXJhbmQuCi1Ob3RlIHRoYXQgQHZhcntiYXNlfSBhbmQgQHZhcntpbmRleH0gYXJlIGJvdGggbWlzc2luZywgYnV0IHRoZXJlIGlzIG9ubHkKLUBlbXBoe29uZX0gQHNhbXB7LH0uICBUaGlzIGlzIGEgc3ludGFjdGljIGV4Y2VwdGlvbi4KLQotQGl0ZW0gQVQmVDogQHNhbXB7JWdzOmZvb307IEludGVsIEBzYW1we2dzOmZvb30KLVRoaXMgc2VsZWN0cyB0aGUgY29udGVudHMgb2YgdGhlIHZhcmlhYmxlIEBzYW1we2Zvb30gd2l0aCBzZWN0aW9uCi1yZWdpc3RlciBAdmFye3NlY3Rpb259IGJlaW5nIEBzYW1weyVnc30uCi1AZW5kIHRhYmxlCi0KLUFic29sdXRlIChhcyBvcHBvc2VkIHRvIFBDIHJlbGF0aXZlKSBjYWxsIGFuZCBqdW1wIG9wZXJhbmRzIG11c3QgYmUKLXByZWZpeGVkIHdpdGggQHNhbXB7Kn0uICBJZiBubyBAc2FtcHsqfSBpcyBzcGVjaWZpZWQsIEBjb2Rle0B2YWx1ZXtBU319Ci1hbHdheXMgY2hvb3NlcyBQQyByZWxhdGl2ZSBhZGRyZXNzaW5nIGZvciBqdW1wL2NhbGwgbGFiZWxzLgotCi1BbnkgaW5zdHJ1Y3Rpb24gdGhhdCBoYXMgYSBtZW1vcnkgb3BlcmFuZCwgYnV0IG5vIHJlZ2lzdGVyIG9wZXJhbmQsCi1AZW1waHttdXN0fSBzcGVjaWZ5IGl0cyBzaXplIChieXRlLCB3b3JkLCBvciBsb25nKSB3aXRoIGFuIGluc3RydWN0aW9uCi1tbmVtb25pYyBzdWZmaXggKEBzYW1we2J9LCBAc2FtcHt3fSwgb3IgQHNhbXB7bH0sIHJlc3BlY3RpdmVseSkuCi0KLUBub2RlIGkzODYtanVtcHMKLUBzZWN0aW9uIEhhbmRsaW5nIG9mIEp1bXAgSW5zdHJ1Y3Rpb25zCi0KLUBjaW5kZXgganVtcCBvcHRpbWl6YXRpb24sIGkzODYKLUBjaW5kZXggaTM4NiBqdW1wIG9wdGltaXphdGlvbgotSnVtcCBpbnN0cnVjdGlvbnMgYXJlIGFsd2F5cyBvcHRpbWl6ZWQgdG8gdXNlIHRoZSBzbWFsbGVzdCBwb3NzaWJsZQotZGlzcGxhY2VtZW50cy4gIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIGJ5dGUgKDgtYml0KSBkaXNwbGFjZW1lbnQKLWp1bXBzIHdoZW5ldmVyIHRoZSB0YXJnZXQgaXMgc3VmZmljaWVudGx5IGNsb3NlLiAgSWYgYSBieXRlIGRpc3BsYWNlbWVudAotaXMgaW5zdWZmaWNpZW50IGEgbG9uZyAoMzItYml0KSBkaXNwbGFjZW1lbnQgaXMgdXNlZC4gIFdlIGRvIG5vdCBzdXBwb3J0Ci13b3JkICgxNi1iaXQpIGRpc3BsYWNlbWVudCBqdW1wcyBpbiAzMi1iaXQgbW9kZSAoaS5lLiBwcmVmaXhpbmcgdGhlIGp1bXAKLWluc3RydWN0aW9uIHdpdGggdGhlIEBzYW1we2RhdGExNn0gaW5zdHJ1Y3Rpb24gcHJlZml4KSwgc2luY2UgdGhlIDgwMzg2Ci1pbnNpc3RzIHVwb24gbWFza2luZyBAc2FtcHslZWlwfSB0byAxNiBiaXRzIGFmdGVyIHRoZSB3b3JkIGRpc3BsYWNlbWVudAotaXMgYWRkZWQuCi0KLU5vdGUgdGhhdCB0aGUgQHNhbXB7amN4en0sIEBzYW1we2plY3h6fSwgQHNhbXB7bG9vcH0sIEBzYW1we2xvb3B6fSwKLUBzYW1we2xvb3BlfSwgQHNhbXB7bG9vcG56fSBhbmQgQHNhbXB7bG9vcG5lfSBpbnN0cnVjdGlvbnMgb25seSBjb21lIGluIGJ5dGUKLWRpc3BsYWNlbWVudHMsIHNvIHRoYXQgaWYgeW91IHVzZSB0aGVzZSBpbnN0cnVjdGlvbnMgKEBjb2Rle0B2YWx1ZXtHQ0N9fSBkb2VzCi1ub3QgdXNlIHRoZW0pIHlvdSBtYXkgZ2V0IGFuIGVycm9yIG1lc3NhZ2UgKGFuZCBpbmNvcnJlY3QgY29kZSkuICBUaGUgQVQmVAotODAzODYgYXNzZW1ibGVyIHRyaWVzIHRvIGdldCBhcm91bmQgdGhpcyBwcm9ibGVtIGJ5IGV4cGFuZGluZyBAc2FtcHtqY3h6IGZvb30KLXRvCi0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgIGpjeHogY3hfemVybwotICAgICAgICAgam1wIGN4X25vbnplcm8KLWN4X3plcm86IGptcCBmb28KLWN4X25vbnplcm86Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBpMzg2LUZsb2F0Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGkzODYgZmxvYXRpbmcgcG9pbnQKLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIGkzODYKLUFsbCA4MDM4NyBmbG9hdGluZyBwb2ludCB0eXBlcyBleGNlcHQgcGFja2VkIEJDRCBhcmUgc3VwcG9ydGVkLgotKEJDRCBzdXBwb3J0IG1heSBiZSBhZGRlZCB3aXRob3V0IG11Y2ggZGlmZmljdWx0eSkuICBUaGVzZSBkYXRhCi10eXBlcyBhcmUgMTYtLCAzMi0sIGFuZCA2NC0gYml0IGludGVnZXJzLCBhbmQgc2luZ2xlICgzMi1iaXQpLAotZG91YmxlICg2NC1iaXQpLCBhbmQgZXh0ZW5kZWQgKDgwLWJpdCkgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LgotRWFjaCBzdXBwb3J0ZWQgdHlwZSBoYXMgYW4gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IGFuZCBhIGNvbnN0cnVjdG9yCi1hc3NvY2lhdGVkIHdpdGggaXQuICBJbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcyBzcGVjaWZ5IHRoZSBvcGVyYW5kJ3MKLWRhdGEgdHlwZS4gIENvbnN0cnVjdG9ycyBidWlsZCB0aGVzZSBkYXRhIHR5cGVzIGludG8gbWVtb3J5LgotCi1AY2luZGV4IEBjb2Rle2Zsb2F0fSBkaXJlY3RpdmUsIGkzODYKLUBjaW5kZXggQGNvZGV7c2luZ2xlfSBkaXJlY3RpdmUsIGkzODYKLUBjaW5kZXggQGNvZGV7ZG91YmxlfSBkaXJlY3RpdmUsIGkzODYKLUBjaW5kZXggQGNvZGV7dGZsb2F0fSBkaXJlY3RpdmUsIGkzODYKLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1GbG9hdGluZyBwb2ludCBjb25zdHJ1Y3RvcnMgYXJlIEBzYW1wey5mbG9hdH0gb3IgQHNhbXB7LnNpbmdsZX0sCi1Ac2FtcHsuZG91YmxlfSwgYW5kIEBzYW1wey50ZmxvYXR9IGZvciAzMi0sIDY0LSwgYW5kIDgwLWJpdCBmb3JtYXRzLgotVGhlc2UgY29ycmVzcG9uZCB0byBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcyBAc2FtcHtzfSwgQHNhbXB7bH0sCi1hbmQgQHNhbXB7dH0uIEBzYW1we3R9IHN0YW5kcyBmb3IgODAtYml0ICh0ZW4gYnl0ZSkgcmVhbC4gIFRoZSA4MDM4Nwotb25seSBzdXBwb3J0cyB0aGlzIGZvcm1hdCB2aWEgdGhlIEBzYW1we2ZsZHR9IChsb2FkIDgwLWJpdCByZWFsIHRvIHN0YWNrCi10b3ApIGFuZCBAc2FtcHtmc3RwdH0gKHN0b3JlIDgwLWJpdCByZWFsIGFuZCBwb3Agc3RhY2spIGluc3RydWN0aW9ucy4KLQotQGNpbmRleCBAY29kZXt3b3JkfSBkaXJlY3RpdmUsIGkzODYKLUBjaW5kZXggQGNvZGV7bG9uZ30gZGlyZWN0aXZlLCBpMzg2Ci1AY2luZGV4IEBjb2Rle2ludH0gZGlyZWN0aXZlLCBpMzg2Ci1AY2luZGV4IEBjb2Rle3F1YWR9IGRpcmVjdGl2ZSwgaTM4NgotQGl0ZW0KLUludGVnZXIgY29uc3RydWN0b3JzIGFyZSBAc2FtcHsud29yZH0sIEBzYW1wey5sb25nfSBvciBAc2FtcHsuaW50fSwgYW5kCi1Ac2FtcHsucXVhZH0gZm9yIHRoZSAxNi0sIDMyLSwgYW5kIDY0LWJpdCBpbnRlZ2VyIGZvcm1hdHMuICBUaGUKLWNvcnJlc3BvbmRpbmcgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4ZXMgYXJlIEBzYW1we3N9IChzaW5nbGUpLAotQHNhbXB7bH0gKGxvbmcpLCBhbmQgQHNhbXB7cX0gKHF1YWQpLiAgQXMgd2l0aCB0aGUgODAtYml0IHJlYWwgZm9ybWF0LAotdGhlIDY0LWJpdCBAc2FtcHtxfSBmb3JtYXQgaXMgb25seSBwcmVzZW50IGluIHRoZSBAc2FtcHtmaWxkcX0gKGxvYWQKLXF1YWQgaW50ZWdlciB0byBzdGFjayB0b3ApIGFuZCBAc2FtcHtmaXN0cHF9IChzdG9yZSBxdWFkIGludGVnZXIgYW5kIHBvcAotc3RhY2spIGluc3RydWN0aW9ucy4KLUBlbmQgaXRlbWl6ZQotCi1SZWdpc3RlciB0byByZWdpc3RlciBvcGVyYXRpb25zIHNob3VsZCBub3QgdXNlIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeGVzLgotQHNhbXB7ZnN0bCAlc3QsICVzdCgxKX0gd2lsbCBnaXZlIGEgd2FybmluZywgYW5kIGJlIGFzc2VtYmxlZCBhcyBpZiB5b3UKLXdyb3RlIEBzYW1we2ZzdCAlc3QsICVzdCgxKX0sIHNpbmNlIGFsbCByZWdpc3RlciB0byByZWdpc3RlciBvcGVyYXRpb25zCi11c2UgODAtYml0IGZsb2F0aW5nIHBvaW50IG9wZXJhbmRzLiAoQ29udHJhc3QgdGhpcyB3aXRoIEBzYW1we2ZzdGwgJXN0LCBtZW19LAotd2hpY2ggY29udmVydHMgQHNhbXB7JXN0fSBmcm9tIDgwLWJpdCB0byA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgZm9ybWF0LAotdGhlbiBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGUgNCBieXRlIGxvY2F0aW9uIEBzYW1we21lbX0pCi0KLUBub2RlIGkzODYtU0lNRAotQHNlY3Rpb24gSW50ZWwncyBNTVggYW5kIEFNRCdzIDNETm93ISBTSU1EIE9wZXJhdGlvbnMKLQotQGNpbmRleCBNTVgsIGkzODYKLUBjaW5kZXggM0ROb3chLCBpMzg2Ci1AY2luZGV4IFNJTUQsIGkzODYKLQotQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgSW50ZWwncyBNTVggaW5zdHJ1Y3Rpb24gc2V0IChTSU1ECi1pbnN0cnVjdGlvbnMgZm9yIGludGVnZXIgZGF0YSksIGF2YWlsYWJsZSBvbiBJbnRlbCdzIFBlbnRpdW0gTU1YCi1wcm9jZXNzb3JzIGFuZCBQZW50aXVtIElJIHByb2Nlc3NvcnMsIEFNRCdzIEs2IGFuZCBLNi0yIHByb2Nlc3NvcnMsCi1DeXJpeCcgTTIgcHJvY2Vzc29yLCBhbmQgcHJvYmFibHkgb3RoZXJzLiAgSXQgYWxzbyBzdXBwb3J0cyBBTUQncyAzRE5vdyEKLWluc3RydWN0aW9uIHNldCAoU0lNRCBpbnN0cnVjdGlvbnMgZm9yIDMyLWJpdCBmbG9hdGluZyBwb2ludCBkYXRhKQotYXZhaWxhYmxlIG9uIEFNRCdzIEs2LTIgcHJvY2Vzc29yIGFuZCBwb3NzaWJseSBvdGhlcnMgaW4gdGhlIGZ1dHVyZS4KLQotQ3VycmVudGx5LCBAY29kZXtAdmFsdWV7QVN9fSBkb2VzIG5vdCBzdXBwb3J0IEludGVsJ3MgZmxvYXRpbmcgcG9pbnQKLVNJTUQsIEthdG1haSAoS05JKS4KLQotVGhlIGVpZ2h0IDY0LWJpdCBNTVggb3BlcmFuZHMsIGFsc28gdXNlZCBieSAzRE5vdyEsIGFyZSBjYWxsZWQgQHNhbXB7JW1tMH0sCi1Ac2FtcHslbW0xfSwgLi4uIEBzYW1weyVtbTd9LiAgVGhleSBjb250YWluIGVpZ2h0IDgtYml0IGludGVnZXJzLCBmb3VyCi0xNi1iaXQgaW50ZWdlcnMsIHR3byAzMi1iaXQgaW50ZWdlcnMsIG9uZSA2NC1iaXQgaW50ZWdlciwgb3IgdHdvIDMyLWJpdAotZmxvYXRpbmcgcG9pbnQgdmFsdWVzLiAgVGhlIE1NWCByZWdpc3RlcnMgY2Fubm90IGJlIHVzZWQgYXQgdGhlIHNhbWUgdGltZQotYXMgdGhlIGZsb2F0aW5nIHBvaW50IHN0YWNrLgotCi1TZWUgSW50ZWwgYW5kIEFNRCBkb2N1bWVudGF0aW9uLCBrZWVwaW5nIGluIG1pbmQgdGhhdCB0aGUgb3BlcmFuZCBvcmRlciBpbgotaW5zdHJ1Y3Rpb25zIGlzIHJldmVyc2VkIGZyb20gdGhlIEludGVsIHN5bnRheC4KLQotQG5vZGUgaTM4Ni0xNmJpdAotQHNlY3Rpb24gV3JpdGluZyAxNi1iaXQgQ29kZQotCi1AY2luZGV4IGkzODYgMTYtYml0IGNvZGUKLUBjaW5kZXggMTYtYml0IGNvZGUsIGkzODYKLUBjaW5kZXggcmVhbC1tb2RlIGNvZGUsIGkzODYKLUBjaW5kZXggQGNvZGV7Y29kZTE2fSBkaXJlY3RpdmUsIGkzODYKLUBjaW5kZXggQGNvZGV7Y29kZTMyfSBkaXJlY3RpdmUsIGkzODYKLVdoaWxlIEBjb2Rle0B2YWx1ZXtBU319IG5vcm1hbGx5IHdyaXRlcyBvbmx5IGBgcHVyZScnIDMyLWJpdCBpMzg2IGNvZGUsCi1pdCBhbHNvIHN1cHBvcnRzIHdyaXRpbmcgY29kZSB0byBydW4gaW4gcmVhbCBtb2RlIG9yIGluIDE2LWJpdCBwcm90ZWN0ZWQKLW1vZGUgY29kZSBzZWdtZW50cy4gIFRvIGRvIHRoaXMsIHB1dCBhIEBzYW1wey5jb2RlMTZ9IGRpcmVjdGl2ZSBiZWZvcmUKLXRoZSBhc3NlbWJseSBsYW5ndWFnZSBpbnN0cnVjdGlvbnMgdG8gYmUgcnVuIGluIDE2LWJpdCBtb2RlLiAgWW91IGNhbgotc3dpdGNoIEBjb2Rle0B2YWx1ZXtBU319IGJhY2sgdG8gd3JpdGluZyBub3JtYWwgMzItYml0IGNvZGUgd2l0aCB0aGUKLUBzYW1wey5jb2RlMzJ9IGRpcmVjdGl2ZS4KLQotVGhlIGNvZGUgd2hpY2ggQGNvZGV7QHZhbHVle0FTfX0gZ2VuZXJhdGVzIGluIDE2LWJpdCBtb2RlIHdpbGwgbm90Ci1uZWNlc3NhcmlseSBydW4gb24gYSAxNi1iaXQgcHJlLTgwMzg2IHByb2Nlc3Nvci4gIFRvIHdyaXRlIGNvZGUgdGhhdAotcnVucyBvbiBzdWNoIGEgcHJvY2Vzc29yLCB5b3UgbXVzdCByZWZyYWluIGZyb20gdXNpbmcgQGVtcGh7YW55fSAzMi1iaXQKLWNvbnN0cnVjdHMgd2hpY2ggcmVxdWlyZSBAY29kZXtAdmFsdWV7QVN9fSB0byBvdXRwdXQgYWRkcmVzcyBvciBvcGVyYW5kCi1zaXplIHByZWZpeGVzLgotCi1Ob3RlIHRoYXQgd3JpdGluZyAxNi1iaXQgY29kZSBpbnN0cnVjdGlvbnMgYnkgZXhwbGljaXRseSBzcGVjaWZ5aW5nIGEKLXByZWZpeCBvciBhbiBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggd2l0aGluIGEgMzItYml0IGNvZGUgc2VjdGlvbgotZ2VuZXJhdGVzIGRpZmZlcmVudCBtYWNoaW5lIGluc3RydWN0aW9ucyB0aGFuIHRob3NlIGdlbmVyYXRlZCBmb3IgYQotMTYtYml0IGNvZGUgc2VnbWVudC4gIEluIGEgMzItYml0IGNvZGUgc2VjdGlvbiwgdGhlIGZvbGxvd2luZyBjb2RlCi1nZW5lcmF0ZXMgdGhlIG1hY2hpbmUgb3Bjb2RlIGJ5dGVzIEBzYW1wezY2IDZhIDA0fSwgd2hpY2ggcHVzaGVzIHRoZQotdmFsdWUgQHNhbXB7NH0gb250byB0aGUgc3RhY2ssIGRlY3JlbWVudGluZyBAc2FtcHslZXNwfSBieSAyLgotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgIHB1c2h3ICQ0Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgc2FtZSBjb2RlIGluIGEgMTYtYml0IGNvZGUgc2VjdGlvbiB3b3VsZCBnZW5lcmF0ZSB0aGUgbWFjaGluZQotb3Bjb2RlIGJ5dGVzIEBzYW1wezZhIDA0fSAoaWUuIHdpdGhvdXQgdGhlIG9wZXJhbmQgc2l6ZSBwcmVmaXgpLCB3aGljaAotaXMgY29ycmVjdCBzaW5jZSB0aGUgcHJvY2Vzc29yIGRlZmF1bHQgb3BlcmFuZCBzaXplIGlzIGFzc3VtZWQgdG8gYmUgMTYKLWJpdHMgaW4gYSAxNi1iaXQgY29kZSBzZWN0aW9uLgotCi1Abm9kZSBpMzg2LUJ1Z3MKLUBzZWN0aW9uIEFUJlQgU3ludGF4IGJ1Z3MKLQotVGhlIFVuaXhXYXJlIGFzc2VtYmxlciwgYW5kIHByb2JhYmx5IG90aGVyIEFUJlQgZGVyaXZlZCBpeDg2IFVuaXgKLWFzc2VtYmxlcnMsIGdlbmVyYXRlIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyB3aXRoIHJldmVyc2VkIHNvdXJjZQotYW5kIGRlc3RpbmF0aW9uIHJlZ2lzdGVycyBpbiBjZXJ0YWluIGNhc2VzLiAgVW5mb3J0dW5hdGVseSwgZ2NjIGFuZAotcG9zc2libHkgbWFueSBvdGhlciBwcm9ncmFtcyB1c2UgdGhpcyByZXZlcnNlZCBzeW50YXgsIHNvIHdlJ3JlIHN0dWNrCi13aXRoIGl0LgotCi1Gb3IgZXhhbXBsZQotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgIGZzdWIgJXN0LCVzdCgzKQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotcmVzdWx0cyBpbiBAc2FtcHslc3QoMyl9IGJlaW5nIHVwZGF0ZWQgdG8gQHNhbXB7JXN0IC0gJXN0KDMpfSByYXRoZXIKLXRoYW4gdGhlIGV4cGVjdGVkIEBzYW1weyVzdCgzKSAtICVzdH0uICBUaGlzIGhhcHBlbnMgd2l0aCBhbGwgdGhlCi1ub24tY29tbXV0YXRpdmUgYXJpdGhtZXRpYyBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zIHdpdGggdHdvIHJlZ2lzdGVyCi1vcGVyYW5kcyB3aGVyZSB0aGUgc291cmNlIHJlZ2lzdGVyIGlzIEBzYW1weyVzdH0gYW5kIHRoZSBkZXN0aW5hdGlvbgotcmVnaXN0ZXIgaXMgQHNhbXB7JXN0KGkpfS4KLQotQG5vZGUgaTM4Ni1Ob3RlcwotQHNlY3Rpb24gTm90ZXMKLQotQGNpbmRleCBpMzg2IEBjb2Rle211bH0sIEBjb2Rle2ltdWx9IGluc3RydWN0aW9ucwotQGNpbmRleCBAY29kZXttdWx9IGluc3RydWN0aW9uLCBpMzg2Ci1AY2luZGV4IEBjb2Rle2ltdWx9IGluc3RydWN0aW9uLCBpMzg2Ci1UaGVyZSBpcyBzb21lIHRyaWNrZXJ5IGNvbmNlcm5pbmcgdGhlIEBzYW1we211bH0gYW5kIEBzYW1we2ltdWx9Ci1pbnN0cnVjdGlvbnMgdGhhdCBkZXNlcnZlcyBtZW50aW9uLiAgVGhlIDE2LSwgMzItLCBhbmQgNjQtYml0IGV4cGFuZGluZwotbXVsdGlwbGllcyAoYmFzZSBvcGNvZGUgQHNhbXB7MHhmNn07IGV4dGVuc2lvbiA0IGZvciBAc2FtcHttdWx9IGFuZCA1Ci1mb3IgQHNhbXB7aW11bH0pIGNhbiBiZSBvdXRwdXQgb25seSBpbiB0aGUgb25lIG9wZXJhbmQgZm9ybS4gIFRodXMsCi1Ac2FtcHtpbXVsICVlYngsICVlYXh9IGRvZXMgQGVtcGh7bm90fSBzZWxlY3QgdGhlIGV4cGFuZGluZyBtdWx0aXBseTsKLXRoZSBleHBhbmRpbmcgbXVsdGlwbHkgd291bGQgY2xvYmJlciB0aGUgQHNhbXB7JWVkeH0gcmVnaXN0ZXIsIGFuZCB0aGlzCi13b3VsZCBjb25mdXNlIEBjb2Rle0B2YWx1ZXtHQ0N9fSBvdXRwdXQuICBVc2UgQHNhbXB7aW11bCAlZWJ4fSB0byBnZXQgdGhlCi02NC1iaXQgcHJvZHVjdCBpbiBAc2FtcHslZWR4OiVlYXh9LgotCi1XZSBoYXZlIGFkZGVkIGEgdHdvIG9wZXJhbmQgZm9ybSBvZiBAc2FtcHtpbXVsfSB3aGVuIHRoZSBmaXJzdCBvcGVyYW5kCi1pcyBhbiBpbW1lZGlhdGUgbW9kZSBleHByZXNzaW9uIGFuZCB0aGUgc2Vjb25kIG9wZXJhbmQgaXMgYSByZWdpc3Rlci4KLVRoaXMgaXMganVzdCBhIHNob3J0aGFuZCwgc28gdGhhdCwgbXVsdGlwbHlpbmcgQHNhbXB7JWVheH0gYnkgNjksIGZvcgotZXhhbXBsZSwgY2FuIGJlIGRvbmUgd2l0aCBAc2FtcHtpbXVsICQ2OSwgJWVheH0gcmF0aGVyIHRoYW4gQHNhbXB7aW11bAotJDY5LCAlZWF4LCAlZWF4fS4KLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWk5NjAudGV4aSBiL2dhcy9kb2MvYy1pOTYwLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NzAzMGEuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWk5NjAudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgaTk2MC1EZXBlbmRlbnQKLUBjaGFwdGVyIEludGVsIDgwOTYwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIEludGVsIDgwOTYwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggaTk2MCBzdXBwb3J0Ci1AbWVudQotKiBPcHRpb25zLWk5NjA6OiAgICAgICAgICAgICAgICBpOTYwIENvbW1hbmQtbGluZSBPcHRpb25zCi0qIEZsb2F0aW5nIFBvaW50LWk5NjA6OiAgICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIERpcmVjdGl2ZXMtaTk2MDo6ICAgICAgICAgICAgIGk5NjAgTWFjaGluZSBEaXJlY3RpdmVzCi0qIE9wY29kZXMgZm9yIGk5NjA6OiAgICAgICAgICAgIGk5NjAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBjIEZJWE1FISBBZGQgU3ludGF4IHNlYyB3aXRoIGRpc2N1c3Npb24gb2YgYml0ZmllbGRzIGhlcmUsIGF0IGxlYXN0IHNvCi1AYyBsb25nIGFzIHRoZXkncmUgbm90IHR1cm5lZCBvbiBmb3Igb3RoZXIgbWFjaGluZXMgdGhhbiA5NjAuCi0KLUBub2RlIE9wdGlvbnMtaTk2MAotCi1Ac2VjdGlvbiBpOTYwIENvbW1hbmQtbGluZSBPcHRpb25zCi0KLUBjaW5kZXggaTk2MCBvcHRpb25zCi1AY2luZGV4IG9wdGlvbnMsIGk5NjAKLUB0YWJsZSBAY29kZQotCi1AY2luZGV4IGk5NjAgYXJjaGl0ZWN0dXJlIG9wdGlvbnMKLUBjaW5kZXggYXJjaGl0ZWN0dXJlIG9wdGlvbnMsIGk5NjAKLUBjaW5kZXggQGNvZGV7LUF9IG9wdGlvbnMsIGk5NjAKLUBpdGVtIC1BQ0EgfCAtQUNBX0EgfCAtQUNCIHwgLUFDQyB8IC1BS0EgfCAtQUtCIHwgLUFLQyB8IC1BTUMKLVNlbGVjdCB0aGUgODA5NjAgYXJjaGl0ZWN0dXJlLiAgSW5zdHJ1Y3Rpb25zIG9yIGZlYXR1cmVzIG5vdCBzdXBwb3J0ZWQKLWJ5IHRoZSBzZWxlY3RlZCBhcmNoaXRlY3R1cmUgY2F1c2UgZmF0YWwgZXJyb3JzLgotCi1Ac2FtcHstQUNBfSBpcyBlcXVpdmFsZW50IHRvIEBzYW1wey1BQ0FfQX07IEBzYW1wey1BS0N9IGlzIGVxdWl2YWxlbnQgdG8KLUBzYW1wey1BTUN9LiAgU3lub255bXMgYXJlIHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgdG9vbHMuCi0KLUlmIHlvdSBkbyBub3Qgc3BlY2lmeSBhbnkgb2YgdGhlc2Ugb3B0aW9ucywgQGNvZGV7QHZhbHVle0FTfX0gZ2VuZXJhdGVzIGNvZGUKLWZvciBhbnkgaW5zdHJ1Y3Rpb24gb3IgZmVhdHVyZSB0aGF0IGlzIHN1cHBvcnRlZCBieSBAZW1waHtzb21lfSB2ZXJzaW9uIG9mIHRoZQotOTYwIChldmVuIGlmIHRoaXMgbWVhbnMgbWl4aW5nIGFyY2hpdGVjdHVyZXMhKS4gIEluIHByaW5jaXBsZSwKLUBjb2Rle0B2YWx1ZXtBU319IGF0dGVtcHRzIHRvIGRlZHVjZSB0aGUgbWluaW1hbCBzdWZmaWNpZW50IHByb2Nlc3NvciB0eXBlIGlmCi1ub25lIGlzIHNwZWNpZmllZDsgZGVwZW5kaW5nIG9uIHRoZSBvYmplY3QgY29kZSBmb3JtYXQsIHRoZSBwcm9jZXNzb3IgdHlwZSBtYXkKLWJlIHJlY29yZGVkIGluIHRoZSBvYmplY3QgZmlsZS4gIElmIGl0IGlzIGNyaXRpY2FsIHRoYXQgdGhlIEBjb2Rle0B2YWx1ZXtBU319Ci1vdXRwdXQgbWF0Y2ggYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUsIHNwZWNpZnkgdGhhdCBhcmNoaXRlY3R1cmUgZXhwbGljaXRseS4KLQotQGNpbmRleCBAY29kZXstYn0gb3B0aW9uLCBpOTYwCi1AY2luZGV4IGJyYW5jaCByZWNvcmRpbmcsIGk5NjAKLUBjaW5kZXggaTk2MCBicmFuY2ggcmVjb3JkaW5nCi1AaXRlbSAtYgotQWRkIGNvZGUgdG8gY29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCBjb25kaXRpb25hbCBicmFuY2hlcyB0YWtlbiwgZm9yCi1sYXRlciBvcHRpbWl6YXRpb24gdXNpbmcgYnJhbmNoIHByZWRpY3Rpb24gYml0cy4gIChUaGUgY29uZGl0aW9uYWwgYnJhbmNoCi1pbnN0cnVjdGlvbnMgaGF2ZSBicmFuY2ggcHJlZGljdGlvbiBiaXRzIGluIHRoZSBDQSwgQ0IsIGFuZCBDQwotYXJjaGl0ZWN0dXJlcy4pICBJZiBAdmFye0JSfSByZXByZXNlbnRzIGEgY29uZGl0aW9uYWwgYnJhbmNoIGluc3RydWN0aW9uLAotdGhlIGZvbGxvd2luZyByZXByZXNlbnRzIHRoZSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyIHdoZW4KLUBzYW1wey1ifSBpcyBzcGVjaWZpZWQ6Ci0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgY2FsbCAgICBAdmFye2luY3JlbWVudCByb3V0aW5lfQotICAgICAgICAud29yZCAgIDAgICAgICAgIyBwcmUtY291bnRlcgotTGFiZWw6ICBAdmFye0JSfQotICAgICAgICBjYWxsICAgIEB2YXJ7aW5jcmVtZW50IHJvdXRpbmV9Ci0gICAgICAgIC53b3JkICAgMCAgICAgICAjIHBvc3QtY291bnRlcgotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIGNvdW50ZXIgZm9sbG93aW5nIGEgYnJhbmNoIHJlY29yZHMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGJyYW5jaAotd2FzIEBlbXBoe25vdH0gdGFrZW47IHRoZSBkaWZmZXJlbmMgYmV0d2VlbiB0aGUgdHdvIGNvdW50ZXJzIGlzIHRoZQotbnVtYmVyIG9mIHRpbWVzIHRoZSBicmFuY2ggQGVtcGh7d2FzfSB0YWtlbi4KLQotQGNpbmRleCBAY29kZXtnYnI5NjB9LCBpOTYwIHBvc3Rwcm9jZXNzb3IKLUBjaW5kZXggYnJhbmNoIHN0YXRpc3RpY3MgdGFibGUsIGk5NjAKLUEgdGFibGUgb2YgZXZlcnkgc3VjaCBAY29kZXtMYWJlbH0gaXMgYWxzbyBnZW5lcmF0ZWQsIHNvIHRoYXQgdGhlCi1leHRlcm5hbCBwb3N0cHJvY2Vzc29yIEBjb2Rle2dicjk2MH0gKHN1cHBsaWVkIGJ5IEludGVsKSBjYW4gbG9jYXRlIGFsbAotdGhlIGNvdW50ZXJzLiAgVGhpcyB0YWJsZSBpcyBhbHdheXMgbGFiZWxsZWQgQHNhbXB7X19CUkFOQ0hfVEFCTEVfX307Ci10aGlzIGlzIGEgbG9jYWwgc3ltYm9sIHRvIHBlcm1pdCBjb2xsZWN0aW5nIHN0YXRpc3RpY3MgZm9yIG1hbnkgc2VwYXJhdGUKLW9iamVjdCBmaWxlcy4gIFRoZSB0YWJsZSBpcyB3b3JkIGFsaWduZWQsIGFuZCBiZWdpbnMgd2l0aCBhIHR3by13b3JkCi1oZWFkZXIuICBUaGUgZmlyc3Qgd29yZCwgaW5pdGlhbGl6ZWQgdG8gMCwgaXMgdXNlZCBpbiBtYWludGFpbmluZyBsaW5rZWQKLWxpc3RzIG9mIGJyYW5jaCB0YWJsZXMuICBUaGUgc2Vjb25kIHdvcmQgaXMgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mCi1lbnRyaWVzIGluIHRoZSB0YWJsZSwgd2hpY2ggZm9sbG93IGltbWVkaWF0ZWx5OiBlYWNoIGlzIGEgd29yZCwgcG9pbnRpbmcKLXRvIG9uZSBvZiB0aGUgbGFiZWxzIGlsbHVzdHJhdGVkIGFib3ZlLgotCi1AYyBURVhJMlJPRkYtS0lMTAotQGlmaW5mbwotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi1AZXhhbXBsZQotICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsgLi4uICstLS0tLS0tLS0tLS0rCi0gfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgfCAgICAgICAgICAgIHwKLSB8ICAqTkVYVCAgICAgfCAgQ09VTlQ6IE4gIHwgKkJSTEFCIDEgICB8ICAgICB8ICpCUkxBQiBOICAgfAotIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgIHwgICAgICAgICAgICB8Ci0gKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKyAuLi4gKy0tLS0tLS0tLS0tLSsKLQotICAgICAgICAgICAgICAgX19CUkFOQ0hfVEFCTEVfXyBsYXlvdXQKLUBlbmQgZXhhbXBsZQotQGMgVEVYSTJST0ZGLUtJTEwKLUBlbmQgaWZpbmZvCi1AbmVlZCAyMDAwCi1AdGV4Ci1cdnNraXAgMXBjCi1cbGluZXtcbGVmdHNraXA9MHB0XGhza2lwXHRhYmxlaW5kZW50Ci1cYm94aXR7MmNtfXtcdHQgKk5FWFR9XGJveGl0ezJjbX17XHR0IENPVU5UOiBcaXQgTn1cYm94aXR7MmNtfXtcdHQKLSpCUkxBQiAxfVxpYm94ezFjbX17XHF1YWRcZG90c31cYm94aXR7MmNtfXtcdHQgKkJSTEFCIFxpdCBOfVxoZmlsfQotXGNlbnRlcmxpbmV7XGl0IHtcdHQgXF9cX0JSQU5DSFxfVEFCTEVcX1xffSBsYXlvdXR9Ci1AZW5kIHRleAotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi0KLVRoZSBmaXJzdCB3b3JkIG9mIHRoZSBoZWFkZXIgaXMgdXNlZCB0byBsb2NhdGUgbXVsdGlwbGUgYnJhbmNoIHRhYmxlcywKLXNpbmNlIGVhY2ggb2JqZWN0IGZpbGUgbWF5IGNvbnRhaW4gb25lLiBOb3JtYWxseSB0aGUgbGlua3MgYXJlCi1tYWludGFpbmVkIHdpdGggYSBjYWxsIHRvIGFuIGluaXRpYWxpemF0aW9uIHJvdXRpbmUsIHBsYWNlZCBhdCB0aGUKLWJlZ2lubmluZyBvZiBlYWNoIGZ1bmN0aW9uIGluIHRoZSBmaWxlLiAgVGhlIEBzY3tnbnV9IEMgY29tcGlsZXIKLWdlbmVyYXRlcyB0aGVzZSBjYWxscyBhdXRvbWF0aWNhbGx5IHdoZW4geW91IGdpdmUgaXQgYSBAc2FtcHstYn0gb3B0aW9uLgotRm9yIGZ1cnRoZXIgZGV0YWlscywgc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIEBzYW1we2dicjk2MH0uCi0KLUBjaW5kZXggQGNvZGV7LW5vLXJlbGF4fSBvcHRpb24sIGk5NjAKLUBpdGVtIC1uby1yZWxheAotTm9ybWFsbHksIENvbXBhcmUtYW5kLUJyYW5jaCBpbnN0cnVjdGlvbnMgd2l0aCB0YXJnZXRzIHRoYXQgcmVxdWlyZQotZGlzcGxhY2VtZW50cyBncmVhdGVyIHRoYW4gMTMgYml0cyAob3IgdGhhdCBoYXZlIGV4dGVybmFsIHRhcmdldHMpIGFyZQotcmVwbGFjZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBjb21wYXJlIChvciBAc2FtcHtjaGtiaXR9KSBhbmQgYnJhbmNoCi1pbnN0cnVjdGlvbnMuICBZb3UgY2FuIHVzZSB0aGUgQHNhbXB7LW5vLXJlbGF4fSBvcHRpb24gdG8gc3BlY2lmeSB0aGF0Ci1AY29kZXtAdmFsdWV7QVN9fSBzaG91bGQgZ2VuZXJhdGUgZXJyb3JzIGluc3RlYWQsIGlmIHRoZSB0YXJnZXQgZGlzcGxhY2VtZW50Ci1pcyBsYXJnZXIgdGhhbiAxMyBiaXRzLgotCi1UaGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgdGhlIENvbXBhcmUtYW5kLUp1bXAgaW5zdHJ1Y3Rpb25zOyB0aGUgY29kZQotZW1pdHRlZCBmb3IgdGhlbSBpcyBAZW1waHthbHdheXN9IGFkanVzdGVkIHdoZW4gbmVjZXNzYXJ5IChkZXBlbmRpbmcgb24KLWRpc3BsYWNlbWVudCBzaXplKSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHlvdSB1c2UgQHNhbXB7LW5vLXJlbGF4fS4KLUBlbmQgdGFibGUKLQotQG5vZGUgRmxvYXRpbmcgUG9pbnQtaTk2MAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgaTk2MCAoQHNje2llZWV9KQotQGNpbmRleCBpOTYwIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1AY29kZXtAdmFsdWV7QVN9fSBnZW5lcmF0ZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMgZm9yIHRoZSBkaXJlY3RpdmVzCi1Ac2FtcHsuZmxvYXR9LCBAc2FtcHsuZG91YmxlfSwgQHNhbXB7LmV4dGVuZGVkfSwgYW5kIEBzYW1wey5zaW5nbGV9LgotCi1Abm9kZSBEaXJlY3RpdmVzLWk5NjAKLUBzZWN0aW9uIGk5NjAgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBpOTYwCi1AY2luZGV4IGk5NjAgbWFjaGluZSBkaXJlY3RpdmVzCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtic3N9IGRpcmVjdGl2ZSwgaTk2MAotQGl0ZW0gLmJzcyBAdmFye3N5bWJvbH0sIEB2YXJ7bGVuZ3RofSwgQHZhcnthbGlnbn0KLVJlc2VydmUgQHZhcntsZW5ndGh9IGJ5dGVzIGluIHRoZSBic3Mgc2VjdGlvbiBmb3IgYSBsb2NhbCBAdmFye3N5bWJvbH0sCi1hbGlnbmVkIHRvIHRoZSBwb3dlciBvZiB0d28gc3BlY2lmaWVkIGJ5IEB2YXJ7YWxpZ259LiAgQHZhcntsZW5ndGh9IGFuZAotQHZhcnthbGlnbn0gbXVzdCBiZSBwb3NpdGl2ZSBhYnNvbHV0ZSBleHByZXNzaW9ucy4gIFRoaXMgZGlyZWN0aXZlCi1kaWZmZXJzIGZyb20gQHNhbXB7Lmxjb21tfSBvbmx5IGluIHRoYXQgaXQgcGVybWl0cyB5b3UgdG8gc3BlY2lmeQotYW4gYWxpZ25tZW50LiAgQHhyZWZ7TGNvbW0sLEBjb2Rley5sY29tbX19LgotQGVuZCB0YWJsZQotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7ZXh0ZW5kZWR9IGRpcmVjdGl2ZSwgaTk2MAotQGl0ZW0gLmV4dGVuZGVkIEB2YXJ7ZmxvbnVtc30KLUBjb2Rley5leHRlbmRlZH0gZXhwZWN0cyB6ZXJvIG9yIG1vcmUgZmxvbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hczsgZm9yCi1lYWNoIGZsb251bSwgQHNhbXB7LmV4dGVuZGVkfSBlbWl0cyBhbiBAc2N7aWVlZX0gZXh0ZW5kZWQtZm9ybWF0ICg4MC1iaXQpCi1mbG9hdGluZy1wb2ludCBudW1iZXIuCi0KLUBjaW5kZXggQGNvZGV7bGVhZnByb2N9IGRpcmVjdGl2ZSwgaTk2MAotQGl0ZW0gLmxlYWZwcm9jIEB2YXJ7Y2FsbC1sYWJ9LCBAdmFye2JhbC1sYWJ9Ci1Zb3UgY2FuIHVzZSB0aGUgQHNhbXB7LmxlYWZwcm9jfSBkaXJlY3RpdmUgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKLW9wdGltaXplZCBAY29kZXtjYWxsan0gaW5zdHJ1Y3Rpb24gdG8gZW5hYmxlIGZhc3RlciBjYWxscyBvZiBsZWFmCi1wcm9jZWR1cmVzLiAgSWYgYSBwcm9jZWR1cmUgaXMga25vd24gdG8gY2FsbCBubyBvdGhlciBwcm9jZWR1cmVzLCB5b3UKLW1heSBkZWZpbmUgYW4gZW50cnkgcG9pbnQgdGhhdCBza2lwcyBwcm9jZWR1cmUgcHJvbG9nIGNvZGUgKGFuZCB0aGF0IGRvZXMKLW5vdCBkZXBlbmQgb24gc3lzdGVtLXN1cHBsaWVkIHNhdmVkIGNvbnRleHQpLCBhbmQgZGVjbGFyZSBpdCBhcyB0aGUKLUB2YXJ7YmFsLWxhYn0gdXNpbmcgQHNhbXB7LmxlYWZwcm9jfS4gIElmIHRoZSBwcm9jZWR1cmUgYWxzbyBoYXMgYW4KLWVudHJ5IHBvaW50IHRoYXQgZ29lcyB0aHJvdWdoIHRoZSBub3JtYWwgcHJvbG9nLCB5b3UgY2FuIHNwZWNpZnkgdGhhdAotZW50cnkgcG9pbnQgYXMgQHZhcntjYWxsLWxhYn0uCi0KLUEgQHNhbXB7LmxlYWZwcm9jfSBkZWNsYXJhdGlvbiBpcyBtZWFudCBmb3IgdXNlIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCi1vcHRpbWl6ZWQgY2FsbCBpbnN0cnVjdGlvbiBAc2FtcHtjYWxsan07IHRoZSBkaXJlY3RpdmUgcmVjb3JkcyB0aGUgZGF0YQotbmVlZGVkIGxhdGVyIHRvIGNob29zZSBiZXR3ZWVuIGNvbnZlcnRpbmcgdGhlIEBzYW1we2NhbGxqfSBpbnRvIGEKLUBjb2Rle2JhbH0gb3IgYSBAY29kZXtjYWxsfS4KLQotQHZhcntjYWxsLWxhYn0gaXMgb3B0aW9uYWw7IGlmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHByZXNlbnQsIG9yIGlmIHRoZQotdHdvIGFyZ3VtZW50cyBhcmUgaWRlbnRpY2FsLCB0aGUgc2luZ2xlIGFyZ3VtZW50IGlzIGFzc3VtZWQgdG8gYmUgdGhlCi1AY29kZXtiYWx9IGVudHJ5IHBvaW50LgotCi1AY2luZGV4IEBjb2Rle3N5c3Byb2N9IGRpcmVjdGl2ZSwgaTk2MAotQGl0ZW0gLnN5c3Byb2MgQHZhcntuYW1lfSwgQHZhcntpbmRleH0KLVRoZSBAc2FtcHsuc3lzcHJvY30gZGlyZWN0aXZlIGRlZmluZXMgYSBuYW1lIGZvciBhIHN5c3RlbSBwcm9jZWR1cmUuCi1BZnRlciB5b3UgZGVmaW5lIGl0IHVzaW5nIEBzYW1wey5zeXNwcm9jfSwgeW91IGNhbiB1c2UgQHZhcntuYW1lfSB0bwotcmVmZXIgdG8gdGhlIHN5c3RlbSBwcm9jZWR1cmUgaWRlbnRpZmllZCBieSBAdmFye2luZGV4fSB3aGVuIGNhbGxpbmcKLXByb2NlZHVyZXMgd2l0aCB0aGUgb3B0aW1pemVkIGNhbGwgaW5zdHJ1Y3Rpb24gQHNhbXB7Y2FsbGp9LgotCi1Cb3RoIGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQ7IEB2YXJ7aW5kZXh9IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAzMQotKGluY2x1c2l2ZSkuCi1AZW5kIHRhYmxlCi0KLUBub2RlIE9wY29kZXMgZm9yIGk5NjAKLUBzZWN0aW9uIGk5NjAgT3Bjb2RlcwotCi1AY2luZGV4IG9wY29kZXMsIGk5NjAKLUBjaW5kZXggaTk2MCBvcGNvZGVzCi1BbGwgSW50ZWwgOTYwIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQ7Ci1AcHhyZWZ7T3B0aW9ucy1pOTYwLCxpOTYwIENvbW1hbmQtbGluZSBPcHRpb25zfSBmb3IgYSBkaXNjdXNzaW9uIG9mCi1zZWxlY3RpbmcgdGhlIGluc3RydWN0aW9uIHN1YnNldCBmb3IgYSBwYXJ0aWN1bGFyIDk2MAotYXJjaGl0ZWN0dXJlLkByZWZpbGwKLQotU29tZSBvcGNvZGVzIGFyZSBwcm9jZXNzZWQgYmV5b25kIHNpbXBseSBlbWl0dGluZyBhIHNpbmdsZSBjb3JyZXNwb25kaW5nCi1pbnN0cnVjdGlvbjogQHNhbXB7Y2FsbGp9LCBhbmQgQ29tcGFyZS1hbmQtQnJhbmNoIG9yIENvbXBhcmUtYW5kLUp1bXAKLWluc3RydWN0aW9ucyB3aXRoIHRhcmdldCBkaXNwbGFjZW1lbnRzIGxhcmdlciB0aGFuIDEzIGJpdHMuCi0KLUBtZW51Ci0qIGNhbGxqLWk5NjA6OiAgICAgICAgICAgICAgICAgIEBjb2Rle2NhbGxqfQotKiBDb21wYXJlLWFuZC1icmFuY2gtaTk2MDo6ICAgICBDb21wYXJlLWFuZC1CcmFuY2gKLUBlbmQgbWVudQotCi1Abm9kZSBjYWxsai1pOTYwCi1Ac3Vic2VjdGlvbiBAY29kZXtjYWxsan0KLQotQGNpbmRleCBAY29kZXtjYWxsan0sIGk5NjAgcHNldWRvLW9wY29kZQotQGNpbmRleCBpOTYwIEBjb2Rle2NhbGxqfSBwc2V1ZG8tb3Bjb2RlCi1Zb3UgY2FuIHdyaXRlIEBjb2Rle2NhbGxqfSB0byBoYXZlIHRoZSBhc3NlbWJsZXIgb3IgdGhlIGxpbmtlciBkZXRlcm1pbmUKLXRoZSBtb3N0IGFwcHJvcHJpYXRlIGZvcm0gb2Ygc3Vicm91dGluZSBjYWxsOiBAc2FtcHtjYWxsfSwKLUBzYW1we2JhbH0sIG9yIEBzYW1we2NhbGxzfS4gIElmIHRoZSBhc3NlbWJseSBzb3VyY2UgY29udGFpbnMKLWVub3VnaCBpbmZvcm1hdGlvbi0tLWEgQHNhbXB7LmxlYWZwcm9jfSBvciBAc2FtcHsuc3lzcHJvY30gZGlyZWN0aXZlCi1kZWZpbmluZyB0aGUgb3BlcmFuZC0tLXRoZW4gQGNvZGV7QHZhbHVle0FTfX0gdHJhbnNsYXRlcyB0aGUKLUBjb2Rle2NhbGxqfTsgaWYgbm90LCBpdCBzaW1wbHkgZW1pdHMgdGhlIEBjb2Rle2NhbGxqfSwgbGVhdmluZyBpdAotZm9yIHRoZSBsaW5rZXIgdG8gcmVzb2x2ZS4KLQotQG5vZGUgQ29tcGFyZS1hbmQtYnJhbmNoLWk5NjAKLUBzdWJzZWN0aW9uIENvbXBhcmUtYW5kLUJyYW5jaAotCi1AY2luZGV4IGk5NjAgY29tcGFyZS9icmFuY2ggaW5zdHJ1Y3Rpb25zCi1AY2luZGV4IGNvbXBhcmUvYnJhbmNoIGluc3RydWN0aW9ucywgaTk2MAotVGhlIDk2MCBhcmNoaXRlY3R1cmVzIHByb3ZpZGUgY29tYmluZWQgQ29tcGFyZS1hbmQtQnJhbmNoIGluc3RydWN0aW9ucwotdGhhdCBwZXJtaXQgeW91IHRvIHN0b3JlIHRoZSBicmFuY2ggdGFyZ2V0IGluIHRoZSBsb3dlciAxMyBiaXRzIG9mIHRoZQotaW5zdHJ1Y3Rpb24gd29yZCBpdHNlbGYuICBIb3dldmVyLCBpZiB5b3Ugc3BlY2lmeSBhIGJyYW5jaCB0YXJnZXQgZmFyCi1lbm91Z2ggYXdheSB0aGF0IGl0cyBhZGRyZXNzIHdvbid0IGZpdCBpbiAxMyBiaXRzLCB0aGUgYXNzZW1ibGVyIGNhbgotZWl0aGVyIGlzc3VlIGFuIGVycm9yLCBvciBjb252ZXJ0IHlvdXIgQ29tcGFyZS1hbmQtQnJhbmNoIGluc3RydWN0aW9uCi1pbnRvIHNlcGFyYXRlIGluc3RydWN0aW9ucyB0byBkbyB0aGUgY29tcGFyZSBhbmQgdGhlIGJyYW5jaC4KLQotQGNpbmRleCBjb21wYXJlIGFuZCBqdW1wIGV4cGFuc2lvbnMsIGk5NjAKLUBjaW5kZXggaTk2MCBjb21wYXJlIGFuZCBqdW1wIGV4cGFuc2lvbnMKLVdoZXRoZXIgQGNvZGV7QHZhbHVle0FTfX0gZ2l2ZXMgYW4gZXJyb3Igb3IgZXhwYW5kcyB0aGUgaW5zdHJ1Y3Rpb24gZGVwZW5kcwotb24gdHdvIGNob2ljZXMgeW91IGNhbiBtYWtlOiB3aGV0aGVyIHlvdSB1c2UgdGhlIEBzYW1wey1uby1yZWxheH0gb3B0aW9uLAotYW5kIHdoZXRoZXIgeW91IHVzZSBhIGBgQ29tcGFyZSBhbmQgQnJhbmNoJycgaW5zdHJ1Y3Rpb24gb3IgYSBgYENvbXBhcmUKLWFuZCBKdW1wJycgaW5zdHJ1Y3Rpb24uICBUaGUgYGBKdW1wJycgaW5zdHJ1Y3Rpb25zIGFyZSBAZW1waHthbHdheXN9Ci1leHBhbmRlZCBpZiBuZWNlc3Nhcnk7IHRoZSBgYEJyYW5jaCcnIGluc3RydWN0aW9ucyBhcmUgZXhwYW5kZWQgd2hlbgotbmVjZXNzYXJ5IEBlbXBoe3VubGVzc30geW91IHNwZWNpZnkgQGNvZGV7LW5vLXJlbGF4fS0tLWluIHdoaWNoIGNhc2UKLUBjb2Rle0B2YWx1ZXtBU319IGdpdmVzIGFuIGVycm9yIGluc3RlYWQuCi0KLVRoZXNlIGFyZSB0aGUgQ29tcGFyZS1hbmQtQnJhbmNoIGluc3RydWN0aW9ucywgdGhlaXIgYGBKdW1wJycgdmFyaWFudHMsCi1hbmQgdGhlIGluc3RydWN0aW9uIHBhaXJzIHRoZXkgbWF5IGV4cGFuZCBpbnRvOgotCi1AYyBURVhJMlJPRkYtS0lMTAotQGlmaW5mbwotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi1AZXhhbXBsZQotICAgICAgICBDb21wYXJlIGFuZAotICAgICBCcmFuY2ggICAgICBKdW1wICAgICAgIEV4cGFuZGVkIHRvCi0gICAgIC0tLS0tLSAgICAtLS0tLS0gICAgICAgLS0tLS0tLS0tLS0tCi0gICAgICAgIGJiYyAgICAgICAgICAgICAgICAgY2hrYml0OyBibm8KLSAgICAgICAgYmJzICAgICAgICAgICAgICAgICBjaGtiaXQ7IGJvCi0gICAgIGNtcGliZSAgICBjbXBpamUgICAgICAgY21waTsgYmUKLSAgICAgY21waWJnICAgIGNtcGlqZyAgICAgICBjbXBpOyBiZwotICAgIGNtcGliZ2UgICBjbXBpamdlICAgICAgIGNtcGk7IGJnZQotICAgICBjbXBpYmwgICAgY21waWpsICAgICAgIGNtcGk7IGJsCi0gICAgY21waWJsZSAgIGNtcGlqbGUgICAgICAgY21waTsgYmxlCi0gICAgY21waWJubyAgIGNtcGlqbm8gICAgICAgY21waTsgYm5vCi0gICAgY21waWJuZSAgIGNtcGlqbmUgICAgICAgY21waTsgYm5lCi0gICAgIGNtcGlibyAgICBjbXBpam8gICAgICAgY21waTsgYm8KLSAgICAgY21wb2JlICAgIGNtcG9qZSAgICAgICBjbXBvOyBiZQotICAgICBjbXBvYmcgICAgY21wb2pnICAgICAgIGNtcG87IGJnCi0gICAgY21wb2JnZSAgIGNtcG9qZ2UgICAgICAgY21wbzsgYmdlCi0gICAgIGNtcG9ibCAgICBjbXBvamwgICAgICAgY21wbzsgYmwKLSAgICBjbXBvYmxlICAgY21wb2psZSAgICAgICBjbXBvOyBibGUKLSAgICBjbXBvYm5lICAgY21wb2puZSAgICAgICBjbXBvOyBibmUKLUBlbmQgZXhhbXBsZQotQGMgVEVYSTJST0ZGLUtJTEwKLUBlbmQgaWZpbmZvCi1AdGV4Ci1caHNraXBcdGFibGVpbmRlbnQKLVxoYWxpZ257XGhmaWwge1x0dCAjfVxxdWFkJlxoZmlsIHtcdHQgI31ccXF1YWQme1x0dCAjfVxoZmlsXGNyCi1cb21pdHtcaGZpbFxpdCBDb21wYXJlIGFuZFxoZmlsfVxzcGFuXG9taXQmXGNyCi17XGl0IEJyYW5jaH0me1xpdCBKdW1wfSZ7XGl0IEV4cGFuZGVkIHRvfVxjcgotICAgICAgICBiYmMmICAgICAgICAgICAgICAgICAmIGNoa2JpdDsgYm5vXGNyCi0gICAgICAgIGJicyYgICAgICAgICAgICAgICAgICYgY2hrYml0OyBib1xjcgotICAgICBjbXBpYmUmICAgIGNtcGlqZSYgICAgICAgY21waTsgYmVcY3IKLSAgICAgY21waWJnJiAgICBjbXBpamcmICAgICAgIGNtcGk7IGJnXGNyCi0gICAgY21waWJnZSYgICBjbXBpamdlJiAgICAgICBjbXBpOyBiZ2VcY3IKLSAgICAgY21waWJsJiAgICBjbXBpamwmICAgICAgIGNtcGk7IGJsXGNyCi0gICAgY21waWJsZSYgICBjbXBpamxlJiAgICAgICBjbXBpOyBibGVcY3IKLSAgICBjbXBpYm5vJiAgIGNtcGlqbm8mICAgICAgIGNtcGk7IGJub1xjcgotICAgIGNtcGlibmUmICAgY21waWpuZSYgICAgICAgY21waTsgYm5lXGNyCi0gICAgIGNtcGlibyYgICAgY21waWpvJiAgICAgICBjbXBpOyBib1xjcgotICAgICBjbXBvYmUmICAgIGNtcG9qZSYgICAgICAgY21wbzsgYmVcY3IKLSAgICAgY21wb2JnJiAgICBjbXBvamcmICAgICAgIGNtcG87IGJnXGNyCi0gICAgY21wb2JnZSYgICBjbXBvamdlJiAgICAgICBjbXBvOyBiZ2VcY3IKLSAgICAgY21wb2JsJiAgICBjbXBvamwmICAgICAgIGNtcG87IGJsXGNyCi0gICAgY21wb2JsZSYgICBjbXBvamxlJiAgICAgICBjbXBvOyBibGVcY3IKLSAgICBjbXBvYm5lJiAgIGNtcG9qbmUmICAgICAgIGNtcG87IGJuZVxjcn0KLUBlbmQgdGV4Ci1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1tMzJyLnRleGkgYi9nYXMvZG9jL2MtbTMyci50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTIxZWRlLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1tMzJyLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgTTMyUi1EZXBlbmRlbnQKLUBjaGFwdGVyIE0zMlIgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgTTMyUiBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtbTY4ay50ZXhpIGIvZ2FzL2RvYy9jLW02OGsudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmODU3Zi4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtbTY4ay50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIE02OEstRGVwZW5kZW50Ci1AY2hhcHRlciBNNjgweDAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgTTY4MHgwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggTTY4MHgwIHN1cHBvcnQKLUBtZW51Ci0qIE02OEstT3B0czo6ICAgICAgICAgICAgICAgICAgIE02ODB4MCBPcHRpb25zCi0qIE02OEstU3ludGF4OjogICAgICAgICAgICAgICAgIFN5bnRheAotKiBNNjhLLU1vdG8tU3ludGF4OjogICAgICAgICAgICBNb3Rvcm9sYSBTeW50YXgKLSogTTY4Sy1GbG9hdDo6ICAgICAgICAgICAgICAgICAgRmxvYXRpbmcgUG9pbnQKLSogTTY4Sy1EaXJlY3RpdmVzOjogICAgICAgICAgICAgNjgweDAgTWFjaGluZSBEaXJlY3RpdmVzCi0qIE02OEstb3Bjb2Rlczo6ICAgICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBNNjhLLU9wdHMKLUBzZWN0aW9uIE02ODB4MCBPcHRpb25zCi0KLUBjaW5kZXggb3B0aW9ucywgTTY4MHgwCi1AY2luZGV4IE02ODB4MCBvcHRpb25zCi1UaGUgTW90b3JvbGEgNjgweDAgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBoYXMgYSBmZXcgbWFjaGluZQotZGVwZW5kZW50IG9wdGlvbnMuCi0KLUBjaW5kZXggQHNhbXB7LWx9IG9wdGlvbiwgTTY4MHgwCi1Zb3UgY2FuIHVzZSB0aGUgQHNhbXB7LWx9IG9wdGlvbiB0byBzaG9ydGVuIHRoZSBzaXplIG9mIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkCi1zeW1ib2xzLiAgSWYgeW91IGRvIG5vdCB1c2UgdGhlIEBzYW1wey1sfSBvcHRpb24sIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkCi1zeW1ib2xzIGFyZSB3aWRlIGVub3VnaCBmb3IgYSBmdWxsIEBjb2Rle2xvbmd9ICgzMiBiaXRzKS4gIChTaW5jZQotQGNvZGV7QHZhbHVle0FTfX0gY2Fubm90IGtub3cgd2hlcmUgdGhlc2Ugc3ltYm9scyBlbmQgdXAsIEBjb2Rle0B2YWx1ZXtBU319IGNhbgotb25seSBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGxpbmtlciB0byBmaWxsIGluIGxhdGVyLiAgU2luY2UgQGNvZGV7QHZhbHVle0FTfX0KLWRvZXMgbm90IGtub3cgaG93IGZhciBhd2F5IHRoZXNlIHN5bWJvbHMgYXJlLCBpdCBhbGxvY2F0ZXMgYXMgbXVjaCBzcGFjZSBhcyBpdAotY2FuLikgIElmIHlvdSB1c2UgdGhpcyBvcHRpb24sIHRoZSByZWZlcmVuY2VzIGFyZSBvbmx5IG9uZSB3b3JkIHdpZGUgKDE2IGJpdHMpLgotVGhpcyBtYXkgYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRoZSBvYmplY3QgZmlsZSB0byBiZSBhcyBzbWFsbCBhcyBwb3NzaWJsZSwgYW5kCi15b3Uga25vdyB0aGF0IHRoZSByZWxldmFudCBzeW1ib2xzIGFyZSBhbHdheXMgbGVzcyB0aGFuIDE3IGJpdHMgYXdheS4KLQotQGNpbmRleCBAc2FtcHstLXJlZ2lzdGVyLXByZWZpeC1vcHRpb25hbH0gb3B0aW9uLCBNNjgweDAKLUZvciBzb21lIGNvbmZpZ3VyYXRpb25zLCBlc3BlY2lhbGx5IHRob3NlIHdoZXJlIHRoZSBjb21waWxlciBub3JtYWxseQotZG9lcyBub3QgcHJlcGVuZCBhbiB1bmRlcnNjb3JlIHRvIHRoZSBuYW1lcyBvZiB1c2VyIHZhcmlhYmxlcywgdGhlCi1hc3NlbWJsZXIgcmVxdWlyZXMgYSBAc2FtcHslfSBiZWZvcmUgYW55IHVzZSBvZiBhIHJlZ2lzdGVyIG5hbWUuICBUaGlzCi1pcyBpbnRlbmRlZCB0byBsZXQgdGhlIGFzc2VtYmxlciBkaXN0aW5ndWlzaCBiZXR3ZWVuIEMgdmFyaWFibGVzIGFuZAotZnVuY3Rpb25zIG5hbWVkIEBzYW1we2EwfSB0aHJvdWdoIEBzYW1we2E3fSwgYW5kIHNvIG9uLiAgVGhlIEBzYW1weyV9IGlzCi1hbHdheXMgYWNjZXB0ZWQsIGJ1dCBpcyBub3QgcmVxdWlyZWQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMsIG5vdGFibHkKLUBzYW1we3N1bjN9LiAgVGhlIEBzYW1wey0tcmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsfSBvcHRpb24gbWF5IGJlIHVzZWQKLXRvIHBlcm1pdCBvbWl0dGluZyB0aGUgQHNhbXB7JX0gZXZlbiBmb3IgY29uZmlndXJhdGlvbnMgZm9yIHdoaWNoIGl0IGlzCi1ub3JtYWxseSByZXF1aXJlZC4gIElmIHRoaXMgaXMgZG9uZSwgaXQgd2lsbCBnZW5lcmFsbHkgYmUgaW1wb3NzaWJsZSB0bwotcmVmZXIgdG8gQyB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWVzIGFzIHJlZ2lzdGVyCi1uYW1lcy4KLQotQGNpbmRleCBAc2FtcHstLWJpdHdpc2Utb3J9IG9wdGlvbiwgTTY4MHgwCi1Ob3JtYWxseSB0aGUgY2hhcmFjdGVyIEBzYW1we3x9IGlzIHRyZWF0ZWQgYXMgYSBjb21tZW50IGNoYXJhY3Rlciwgd2hpY2gKLW1lYW5zIHRoYXQgaXQgY2FuIG5vdCBiZSB1c2VkIGluIGV4cHJlc3Npb25zLiAgVGhlIEBzYW1wey0tYml0d2lzZS1vcn0KLW9wdGlvbiB0dXJucyBAc2FtcHt8fSBpbnRvIGEgbm9ybWFsIGNoYXJhY3Rlci4gIEluIHRoaXMgbW9kZSwgeW91IG11c3QKLWVpdGhlciB1c2UgQyBzdHlsZSBjb21tZW50cywgb3Igc3RhcnQgY29tbWVudHMgd2l0aCBhIEBzYW1weyN9IGNoYXJhY3RlcgotYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuCi0KLUBjaW5kZXggQHNhbXB7LS1iYXNlLXNpemUtZGVmYXVsdC0xNn0KLUBjaW5kZXggQHNhbXB7LS1iYXNlLXNpemUtZGVmYXVsdC0zMn0KLUlmIHlvdSB1c2UgYW4gYWRkcmVzc2luZyBtb2RlIHdpdGggYSBiYXNlIHJlZ2lzdGVyIHdpdGhvdXQgc3BlY2lmeWluZwotdGhlIHNpemUsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgbm9ybWFsbHkgdXNlIHRoZSBmdWxsIDMyIGJpdCB2YWx1ZS4KLUZvciBleGFtcGxlLCB0aGUgYWRkcmVzc2luZyBtb2RlIEBzYW1weyVhMEBAKCVkMCl9IGlzIGVxdWl2YWxlbnQgdG8KLUBzYW1weyVhMEBAKCVkMDpsKX0uICBZb3UgbWF5IHVzZSB0aGUgQHNhbXB7LS1iYXNlLXNpemUtZGVmYXVsdC0xNn0KLW9wdGlvbiB0byB0ZWxsIEBjb2Rle0B2YWx1ZXtBU319IHRvIGRlZmF1bHQgdG8gdXNpbmcgdGhlIDE2IGJpdCB2YWx1ZS4KLUluIHRoaXMgY2FzZSwgQHNhbXB7JWEwQEAoJWQwKX0gaXMgZXF1aXZhbGVudCB0byBAc2FtcHslYTBAQCglZDA6dyl9LgotWW91IG1heSB1c2UgdGhlIEBzYW1wey0tYmFzZS1zaXplLWRlZmF1bHQtMzJ9IG9wdGlvbiB0byByZXN0b3JlIHRoZQotZGVmYXVsdCBiZWhhdmlvdXIuCi0KLUBjaW5kZXggQHNhbXB7LS1kaXNwLXNpemUtZGVmYXVsdC0xNn0KLUBjaW5kZXggQHNhbXB7LS1kaXNwLXNpemUtZGVmYXVsdC0zMn0KLUlmIHlvdSB1c2UgYW4gYWRkcmVzc2luZyBtb2RlIHdpdGggYSBkaXNwbGFjZW1lbnQsIGFuZCB0aGUgdmFsdWUgb2YgdGhlCi1kaXNwbGFjZW1lbnQgaXMgbm90IGtub3duLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIG5vcm1hbGx5IGFzc3VtZSB0aGF0Ci10aGUgdmFsdWUgaXMgMzIgYml0cy4gIEZvciBleGFtcGxlLCBpZiB0aGUgc3ltYm9sIEBzYW1we2Rpc3B9IGhhcyBub3QKLWJlZW4gZGVmaW5lZCwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBhc3NlbWJsZSB0aGUgYWRkcmVzc2luZyBtb2RlCi1Ac2FtcHslYTBAQChkaXNwLCVkMCl9IGFzIHRob3VnaCBAc2FtcHtkaXNwfSBpcyBhIDMyIGJpdCB2YWx1ZS4gIFlvdSBtYXkKLXVzZSB0aGUgQHNhbXB7LS1kaXNwLXNpemUtZGVmYXVsdC0xNn0gb3B0aW9uIHRvIHRlbGwgQGNvZGV7QHZhbHVle0FTfX0KLXRvIGluc3RlYWQgYXNzdW1lIHRoYXQgdGhlIGRpc3BsYWNlbWVudCBpcyAxNiBiaXRzLiAgSW4gdGhpcyBjYXNlLAotQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBhc3NlbWJsZSBAc2FtcHslYTBAQChkaXNwLCVkMCl9IGFzIHRob3VnaAotQHNhbXB7ZGlzcH0gaXMgYSAxNiBiaXQgdmFsdWUuICBZb3UgbWF5IHVzZSB0aGUKLUBzYW1wey0tZGlzcC1zaXplLWRlZmF1bHQtMzJ9IG9wdGlvbiB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGJlaGF2aW91ci4KLQotQGNpbmRleCBAc2FtcHstbTY4MDAwfSBhbmQgcmVsYXRlZCBvcHRpb25zCi1AY2luZGV4IGFyY2hpdGVjdHVyZSBvcHRpb25zLCBNNjgweDAKLUBjaW5kZXggTTY4MHgwIGFyY2hpdGVjdHVyZSBvcHRpb25zCi1AY29kZXtAdmFsdWV7QVN9fSBjYW4gYXNzZW1ibGUgY29kZSBmb3Igc2V2ZXJhbCBkaWZmZXJlbnQgbWVtYmVycyBvZiB0aGUKLU1vdG9yb2xhIDY4MHgwIGZhbWlseS4gIFRoZSBkZWZhdWx0IGRlcGVuZHMgdXBvbiBob3cgQGNvZGV7QHZhbHVle0FTfX0KLXdhcyBjb25maWd1cmVkIHdoZW4gaXQgd2FzIGJ1aWx0OyBub3JtYWxseSwgdGhlIGRlZmF1bHQgaXMgdG8gYXNzZW1ibGUKLWNvZGUgZm9yIHRoZSA2ODAyMCBtaWNyb3Byb2Nlc3Nvci4gIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBtYXkgYmUgdXNlZCB0bwotY2hhbmdlIHRoZSBkZWZhdWx0LiAgVGhlc2Ugb3B0aW9ucyBjb250cm9sIHdoaWNoIGluc3RydWN0aW9ucyBhbmQKLWFkZHJlc3NpbmcgbW9kZXMgYXJlIHBlcm1pdHRlZC4gIFRoZSBtZW1iZXJzIG9mIHRoZSA2ODB4MCBmYW1pbHkgYXJlCi12ZXJ5IHNpbWlsYXIuICBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRpZmZlcmVuY2VzLCBzZWUgdGhlCi1Nb3Rvcm9sYSBtYW51YWxzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIC1tNjgwMDAKLUBpdGVteCAtbTY4ZWMwMDAKLUBpdGVteCAtbTY4aGMwMDAKLUBpdGVteCAtbTY4aGMwMDEKLUBpdGVteCAtbTY4MDA4Ci1AaXRlbXggLW02ODMwMgotQGl0ZW14IC1tNjgzMDYKLUBpdGVteCAtbTY4MzA3Ci1AaXRlbXggLW02ODMyMgotQGl0ZW14IC1tNjgzNTYKLUFzc2VtYmxlIGZvciB0aGUgNjgwMDAuIEBzYW1wey1tNjgwMDh9LCBAc2FtcHstbTY4MzAyfSwgYW5kIHNvIG9uIGFyZSBzeW5vbnltcwotZm9yIEBzYW1wey1tNjgwMDB9LCBzaW5jZSB0aGUgY2hpcHMgYXJlIHRoZSBzYW1lIGZyb20gdGhlIHBvaW50IG9mIHZpZXcKLW9mIHRoZSBhc3NlbWJsZXIuCi0KLUBpdGVtIC1tNjgwMTAKLUFzc2VtYmxlIGZvciB0aGUgNjgwMTAuCi0KLUBpdGVtIC1tNjgwMjAKLUBpdGVteCAtbTY4ZWMwMjAKLUFzc2VtYmxlIGZvciB0aGUgNjgwMjAuICBUaGlzIGlzIG5vcm1hbGx5IHRoZSBkZWZhdWx0LgotCi1AaXRlbSAtbTY4MDMwCi1AaXRlbXggLW02OGVjMDMwCi1Bc3NlbWJsZSBmb3IgdGhlIDY4MDMwLgotCi1AaXRlbSAtbTY4MDQwCi1AaXRlbXggLW02OGVjMDQwCi1Bc3NlbWJsZSBmb3IgdGhlIDY4MDQwLgotCi1AaXRlbSAtbTY4MDYwCi1AaXRlbXggLW02OGVjMDYwCi1Bc3NlbWJsZSBmb3IgdGhlIDY4MDYwLgotCi1AaXRlbSAtbWNwdTMyCi1AaXRlbXggLW02ODMzMAotQGl0ZW14IC1tNjgzMzEKLUBpdGVteCAtbTY4MzMyCi1AaXRlbXggLW02ODMzMwotQGl0ZW14IC1tNjgzMzQKLUBpdGVteCAtbTY4MzM2Ci1AaXRlbXggLW02ODM0MAotQGl0ZW14IC1tNjgzNDEKLUBpdGVteCAtbTY4MzQ5Ci1AaXRlbXggLW02ODM2MAotQXNzZW1ibGUgZm9yIHRoZSBDUFUzMiBmYW1pbHkgb2YgY2hpcHMuCi0KLUBpdGVtIC1tNTIwMAotQXNzZW1ibGUgZm9yIHRoZSBDb2xkRmlyZSBmYW1pbHkgb2YgY2hpcHMuCi0KLUBpdGVtIC1tNjg4ODEKLUBpdGVteCAtbTY4ODgyCi1Bc3NlbWJsZSA2ODg4MSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciB0aGUKLTY4MDIwLCA2ODAzMCwgYW5kIHRoZSBDUFUzMi4gIFRoZSA2ODA0MCBhbmQgNjgwNjAgYWx3YXlzIHN1cHBvcnQKLWZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucy4KLQotQGl0ZW0gLW1uby02ODg4MQotRG8gbm90IGFzc2VtYmxlIDY4ODgxIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQKLWZvciA2ODAwMCBhbmQgdGhlIDY4MDEwLiAgVGhlIDY4MDQwIGFuZCA2ODA2MCBhbHdheXMgc3VwcG9ydCBmbG9hdGluZwotcG9pbnQgaW5zdHJ1Y3Rpb25zLCBldmVuIGlmIHRoaXMgb3B0aW9uIGlzIHVzZWQuCi0KLUBpdGVtIC1tNjg4NTEKLUFzc2VtYmxlIDY4ODUxIE1NVSBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciB0aGUgNjgwMjAsCi02ODAzMCwgYW5kIDY4MDYwLiAgVGhlIDY4MDQwIGFjY2VwdHMgYSBzb21ld2hhdCBkaWZmZXJlbnQgc2V0IG9mIE1NVQotaW5zdHJ1Y3Rpb25zOyBAc2FtcHstbTY4ODUxfSBhbmQgQHNhbXB7LW02ODA0MH0gc2hvdWxkIG5vdCBiZSB1c2VkCi10b2dldGhlci4KLQotQGl0ZW0gLW1uby02ODg1MQotRG8gbm90IGFzc2VtYmxlIDY4ODUxIE1NVSBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciB0aGUKLTY4MDAwLCA2ODAxMCwgYW5kIHRoZSBDUFUzMi4gIFRoZSA2ODA0MCBhY2NlcHRzIGEgc29tZXdoYXQgZGlmZmVyZW50IHNldAotb2YgTU1VIGluc3RydWN0aW9ucy4KLUBlbmQgdGFibGUKLQotQG5vZGUgTTY4Sy1TeW50YXgKLUBzZWN0aW9uIFN5bnRheAotCi1AY2luZGV4IEBzY3ttaXR9Ci1UaGlzIHN5bnRheCBmb3IgdGhlIE1vdG9yb2xhIDY4MHgwIHdhcyBkZXZlbG9wZWQgYXQgQHNje21pdH0uCi0KLUBjaW5kZXggTTY4MHgwIHN5bnRheAotQGNpbmRleCBzeW50YXgsIE02ODB4MAotQGNpbmRleCBNNjgweDAgc2l6ZSBtb2RpZmllcnMKLUBjaW5kZXggc2l6ZSBtb2RpZmllcnMsIE02ODB4MAotVGhlIDY4MHgwIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gdXNlcyBpbnN0cnVjdGlvbnMgbmFtZXMgYW5kCi1zeW50YXggY29tcGF0aWJsZSB3aXRoIHRoZSBTdW4gYXNzZW1ibGVyLiAgSW50ZXJ2ZW5pbmcgcGVyaW9kcyBhcmUKLWlnbm9yZWQ7IGZvciBleGFtcGxlLCBAc2FtcHttb3ZsfSBpcyBlcXVpdmFsZW50IHRvIEBzYW1we21vdi5sfS4KLQotSW4gdGhlIGZvbGxvd2luZyB0YWJsZSBAdmFye2FwY30gc3RhbmRzIGZvciBhbnkgb2YgdGhlIGFkZHJlc3MgcmVnaXN0ZXJzCi0oQHNhbXB7JWEwfSB0aHJvdWdoIEBzYW1weyVhN30pLCB0aGUgcHJvZ3JhbSBjb3VudGVyIChAc2FtcHslcGN9KSwgdGhlCi16ZXJvLWFkZHJlc3MgcmVsYXRpdmUgdG8gdGhlIHByb2dyYW0gY291bnRlciAoQHNhbXB7JXpwY30pLCBhIHN1cHByZXNzZWQKLWFkZHJlc3MgcmVnaXN0ZXIgKEBzYW1weyV6YTB9IHRocm91Z2ggQHNhbXB7JXphN30pLCBvciBpdCBtYXkgYmUgb21pdHRlZAotZW50aXJlbHkuICBUaGUgdXNlIG9mIEB2YXJ7c2l6ZX0gbWVhbnMgb25lIG9mIEBzYW1we3d9IG9yIEBzYW1we2x9LCBhbmQKLWl0IG1heSBiZSBvbWl0dGVkLCBhbG9uZyB3aXRoIHRoZSBsZWFkaW5nIGNvbG9uLCB1bmxlc3MgYSBzY2FsZSBpcyBhbHNvCi1zcGVjaWZpZWQuICBUaGUgdXNlIG9mIEB2YXJ7c2NhbGV9IG1lYW5zIG9uZSBvZiBAc2FtcHsxfSwgQHNhbXB7Mn0sCi1Ac2FtcHs0fSwgb3IgQHNhbXB7OH0sIGFuZCBpdCBtYXkgYWx3YXlzIGJlIG9taXR0ZWQgYWxvbmcgd2l0aCB0aGUKLWxlYWRpbmcgY29sb24uCi0KLUBjaW5kZXggTTY4MHgwIGFkZHJlc3NpbmcgbW9kZXMKLUBjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgTTY4MHgwCi1UaGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgYXJlIHVuZGVyc3Rvb2Q6Ci1AdGFibGUgQGRmbgotQGl0ZW0gSW1tZWRpYXRlCi1Ac2FtcHsjQHZhcntudW1iZXJ9fQotCi1AaXRlbSBEYXRhIFJlZ2lzdGVyCi1Ac2FtcHslZDB9IHRocm91Z2ggQHNhbXB7JWQ3fQotCi1AaXRlbSBBZGRyZXNzIFJlZ2lzdGVyCi1Ac2FtcHslYTB9IHRocm91Z2ggQHNhbXB7JWE3fUAqCi1Ac2FtcHslYTd9IGlzIGFsc28ga25vd24gYXMgQHNhbXB7JXNwfSwgaS5lLiB0aGUgU3RhY2sgUG9pbnRlci4gIEBjb2RleyVhNn0KLWlzIGFsc28ga25vd24gYXMgQHNhbXB7JWZwfSwgdGhlIEZyYW1lIFBvaW50ZXIuCi0KLUBpdGVtIEFkZHJlc3MgUmVnaXN0ZXIgSW5kaXJlY3QKLUBzYW1weyVhMEBAfSB0aHJvdWdoIEBzYW1weyVhN0BAfQotCi1AaXRlbSBBZGRyZXNzIFJlZ2lzdGVyIFBvc3RpbmNyZW1lbnQKLUBzYW1weyVhMEBAK30gdGhyb3VnaCBAc2FtcHslYTdAQCt9Ci0KLUBpdGVtIEFkZHJlc3MgUmVnaXN0ZXIgUHJlZGVjcmVtZW50Ci1Ac2FtcHslYTBAQC19IHRocm91Z2ggQHNhbXB7JWE3QEAtfQotCi1AaXRlbSBJbmRpcmVjdCBQbHVzIE9mZnNldAotQHNhbXB7QHZhcnthcGN9QEAoQHZhcntudW1iZXJ9KX0KLQotQGl0ZW0gSW5kZXgKLUBzYW1we0B2YXJ7YXBjfUBAKEB2YXJ7bnVtYmVyfSxAdmFye3JlZ2lzdGVyfTpAdmFye3NpemV9OkB2YXJ7c2NhbGV9KX0KLQotVGhlIEB2YXJ7bnVtYmVyfSBtYXkgYmUgb21pdHRlZC4KLQotQGl0ZW0gUG9zdGluZGV4Ci1Ac2FtcHtAdmFye2FwY31AQChAdmFye251bWJlcn0pQEAoQHZhcntvbnVtYmVyfSxAdmFye3JlZ2lzdGVyfTpAdmFye3NpemV9OkB2YXJ7c2NhbGV9KX0KLQotVGhlIEB2YXJ7b251bWJlcn0gb3IgdGhlIEB2YXJ7cmVnaXN0ZXJ9LCBidXQgbm90IGJvdGgsIG1heSBiZSBvbWl0dGVkLgotCi1AaXRlbSBQcmVpbmRleAotQHNhbXB7QHZhcnthcGN9QEAoQHZhcntudW1iZXJ9LEB2YXJ7cmVnaXN0ZXJ9OkB2YXJ7c2l6ZX06QHZhcntzY2FsZX0pQEAoQHZhcntvbnVtYmVyfSl9Ci0KLVRoZSBAdmFye251bWJlcn0gbWF5IGJlIG9taXR0ZWQuICBPbWl0dGluZyB0aGUgQHZhcntyZWdpc3Rlcn0gcHJvZHVjZXMKLXRoZSBQb3N0aW5kZXggYWRkcmVzc2luZyBtb2RlLgotCi1AaXRlbSBBYnNvbHV0ZQotQHNhbXB7QHZhcntzeW1ib2x9fSwgb3IgQHNhbXB7QHZhcntkaWdpdHN9fSwgb3B0aW9uYWxseSBmb2xsb3dlZCBieQotQHNhbXB7OmJ9LCBAc2FtcHs6d30sIG9yIEBzYW1wezpsfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgTTY4Sy1Nb3RvLVN5bnRheAotQHNlY3Rpb24gTW90b3JvbGEgU3ludGF4Ci0KLUBjaW5kZXggTW90b3JvbGEgc3ludGF4IGZvciB0aGUgNjgweDAKLUBjaW5kZXggYWx0ZXJuYXRlIHN5bnRheCBmb3IgdGhlIDY4MHgwCi0KLVRoZSBzdGFuZGFyZCBNb3Rvcm9sYSBzeW50YXggZm9yIHRoaXMgY2hpcCBkaWZmZXJzIGZyb20gdGhlIHN5bnRheAotYWxyZWFkeSBkaXNjdXNzZWQgKEBweHJlZntNNjhLLVN5bnRheCwsU3ludGF4fSkuICBAY29kZXtAdmFsdWV7QVN9fSBjYW4KLWFjY2VwdCBNb3Rvcm9sYSBzeW50YXggZm9yIG9wZXJhbmRzLCBldmVuIGlmIEBzY3ttaXR9IHN5bnRheCBpcyB1c2VkIGZvcgotb3RoZXIgb3BlcmFuZHMgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICBUaGUgdHdvIGtpbmRzIG9mIHN5bnRheCBhcmUKLWZ1bGx5IGNvbXBhdGlibGUuCi0KLUluIHRoZSBmb2xsb3dpbmcgdGFibGUgQHZhcnthcGN9IHN0YW5kcyBmb3IgYW55IG9mIHRoZSBhZGRyZXNzIHJlZ2lzdGVycwotKEBzYW1weyVhMH0gdGhyb3VnaCBAc2FtcHslYTd9KSwgdGhlIHByb2dyYW0gY291bnRlciAoQHNhbXB7JXBjfSksIHRoZQotemVyby1hZGRyZXNzIHJlbGF0aXZlIHRvIHRoZSBwcm9ncmFtIGNvdW50ZXIgKEBzYW1weyV6cGN9KSwgb3IgYQotc3VwcHJlc3NlZCBhZGRyZXNzIHJlZ2lzdGVyIChAc2FtcHslemEwfSB0aHJvdWdoIEBzYW1weyV6YTd9KS4gIFRoZSB1c2UKLW9mIEB2YXJ7c2l6ZX0gbWVhbnMgb25lIG9mIEBzYW1we3d9IG9yIEBzYW1we2x9LCBhbmQgaXQgbWF5IGFsd2F5cyBiZQotb21pdHRlZCBhbG9uZyB3aXRoIHRoZSBsZWFkaW5nIGRvdC4gIFRoZSB1c2Ugb2YgQHZhcntzY2FsZX0gbWVhbnMgb25lIG9mCi1Ac2FtcHsxfSwgQHNhbXB7Mn0sIEBzYW1wezR9LCBvciBAc2FtcHs4fSwgYW5kIGl0IG1heSBhbHdheXMgYmUgb21pdHRlZAotYWxvbmcgd2l0aCB0aGUgbGVhZGluZyBhc3Rlcmlzay4KLQotVGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGFkZHJlc3NpbmcgbW9kZXMgYXJlIHVuZGVyc3Rvb2Q6Ci0KLUB0YWJsZSBAZGZuCi1AaXRlbSBBZGRyZXNzIFJlZ2lzdGVyIEluZGlyZWN0Ci1Ac2FtcHsoJWEwKX0gdGhyb3VnaCBAc2FtcHsoJWE3KX1AKiAKLUBzYW1weyVhN30gaXMgYWxzbyBrbm93biBhcyBAc2FtcHslc3B9LCBpLmUuIHRoZSBTdGFjayBQb2ludGVyLiAgQGNvZGV7JWE2fQotaXMgYWxzbyBrbm93biBhcyBAc2FtcHslZnB9LCB0aGUgRnJhbWUgUG9pbnRlci4KLQotQGl0ZW0gQWRkcmVzcyBSZWdpc3RlciBQb3N0aW5jcmVtZW50Ci1Ac2FtcHsoJWEwKSt9IHRocm91Z2ggQHNhbXB7KCVhNykrfQotCi1AaXRlbSBBZGRyZXNzIFJlZ2lzdGVyIFByZWRlY3JlbWVudAotQHNhbXB7LSglYTApfSB0aHJvdWdoIEBzYW1wey0oJWE3KX0KLQotQGl0ZW0gSW5kaXJlY3QgUGx1cyBPZmZzZXQKLUBzYW1we0B2YXJ7bnVtYmVyfShAdmFyeyVhMH0pfSB0aHJvdWdoIEBzYW1we0B2YXJ7bnVtYmVyfShAdmFyeyVhN30pfSwKLW9yIEBzYW1we0B2YXJ7bnVtYmVyfShAdmFyeyVwY30pfS4KLQotVGhlIEB2YXJ7bnVtYmVyfSBtYXkgYWxzbyBhcHBlYXIgd2l0aGluIHRoZSBwYXJlbnRoZXNlcywgYXMgaW4KLUBzYW1weyhAdmFye251bWJlcn0sQHZhcnslYTB9KX0uICBXaGVuIHVzZWQgd2l0aCB0aGUgQHZhcntwY30sIHRoZQotQHZhcntudW1iZXJ9IG1heSBiZSBvbWl0dGVkICh3aXRoIGFuIGFkZHJlc3MgcmVnaXN0ZXIsIG9taXR0aW5nIHRoZQotQHZhcntudW1iZXJ9IHByb2R1Y2VzIEFkZHJlc3MgUmVnaXN0ZXIgSW5kaXJlY3QgbW9kZSkuCi0KLUBpdGVtIEluZGV4Ci1Ac2FtcHtAdmFye251bWJlcn0oQHZhcnthcGN9LEB2YXJ7cmVnaXN0ZXJ9LkB2YXJ7c2l6ZX0qQHZhcntzY2FsZX0pfQotCi1UaGUgQHZhcntudW1iZXJ9IG1heSBiZSBvbWl0dGVkLCBvciBpdCBtYXkgYXBwZWFyIHdpdGhpbiB0aGUKLXBhcmVudGhlc2VzLiAgVGhlIEB2YXJ7YXBjfSBtYXkgYmUgb21pdHRlZC4gIFRoZSBAdmFye3JlZ2lzdGVyfSBhbmQgdGhlCi1AdmFye2FwY30gbWF5IGFwcGVhciBpbiBlaXRoZXIgb3JkZXIuICBJZiBib3RoIEB2YXJ7YXBjfSBhbmQKLUB2YXJ7cmVnaXN0ZXJ9IGFyZSBhZGRyZXNzIHJlZ2lzdGVycywgYW5kIHRoZSBAdmFye3NpemV9IGFuZCBAdmFye3NjYWxlfQotYXJlIG9taXR0ZWQsIHRoZW4gdGhlIGZpcnN0IHJlZ2lzdGVyIGlzIHRha2VuIGFzIHRoZSBiYXNlIHJlZ2lzdGVyLCBhbmQKLXRoZSBzZWNvbmQgYXMgdGhlIGluZGV4IHJlZ2lzdGVyLgotCi1AaXRlbSBQb3N0aW5kZXgKLUBzYW1weyhbQHZhcntudW1iZXJ9LEB2YXJ7YXBjfV0sQHZhcntyZWdpc3Rlcn0uQHZhcntzaXplfSpAdmFye3NjYWxlfSxAdmFye29udW1iZXJ9KX0KLQotVGhlIEB2YXJ7b251bWJlcn0sIG9yIHRoZSBAdmFye3JlZ2lzdGVyfSwgb3IgYm90aCwgbWF5IGJlIG9taXR0ZWQuCi1FaXRoZXIgdGhlIEB2YXJ7bnVtYmVyfSBvciB0aGUgQHZhcnthcGN9IG1heSBiZSBvbWl0dGVkLCBidXQgbm90IGJvdGguCi0KLUBpdGVtIFByZWluZGV4Ci1Ac2FtcHsoW0B2YXJ7bnVtYmVyfSxAdmFye2FwY30sQHZhcntyZWdpc3Rlcn0uQHZhcntzaXplfSpAdmFye3NjYWxlfV0sQHZhcntvbnVtYmVyfSl9Ci0KLVRoZSBAdmFye251bWJlcn0sIG9yIHRoZSBAdmFye2FwY30sIG9yIHRoZSBAdmFye3JlZ2lzdGVyfSwgb3IgYW55IHR3byBvZgotdGhlbSwgbWF5IGJlIG9taXR0ZWQuICBUaGUgQHZhcntvbnVtYmVyfSBtYXkgYmUgb21pdHRlZC4gIFRoZQotQHZhcntyZWdpc3Rlcn0gYW5kIHRoZSBAdmFye2FwY30gbWF5IGFwcGVhciBpbiBlaXRoZXIgb3JkZXIuICBJZiBib3RoCi1AdmFye2FwY30gYW5kIEB2YXJ7cmVnaXN0ZXJ9IGFyZSBhZGRyZXNzIHJlZ2lzdGVycywgYW5kIHRoZSBAdmFye3NpemV9Ci1hbmQgQHZhcntzY2FsZX0gYXJlIG9taXR0ZWQsIHRoZW4gdGhlIGZpcnN0IHJlZ2lzdGVyIGlzIHRha2VuIGFzIHRoZQotYmFzZSByZWdpc3RlciwgYW5kIHRoZSBzZWNvbmQgYXMgdGhlIGluZGV4IHJlZ2lzdGVyLgotQGVuZCB0YWJsZQotCi1Abm9kZSBNNjhLLUZsb2F0Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBNNjgweDAKLUBjaW5kZXggTTY4MHgwIGZsb2F0aW5nIHBvaW50Ci1QYWNrZWQgZGVjaW1hbCAoUCkgZm9ybWF0IGZsb2F0aW5nIGxpdGVyYWxzIGFyZSBub3Qgc3VwcG9ydGVkLgotRmVlbCBmcmVlIHRvIGFkZCB0aGUgY29kZSEKLQotVGhlIGZsb2F0aW5nIHBvaW50IGZvcm1hdHMgZ2VuZXJhdGVkIGJ5IGRpcmVjdGl2ZXMgYXJlIHRoZXNlLgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7ZmxvYXR9IGRpcmVjdGl2ZSwgTTY4MHgwCi1AaXRlbSAuZmxvYXQKLUBjb2Rle1NpbmdsZX0gcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXtkb3VibGV9IGRpcmVjdGl2ZSwgTTY4MHgwCi1AaXRlbSAuZG91YmxlCi1AY29kZXtEb3VibGV9IHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCi0KLUBjaW5kZXggQGNvZGV7ZXh0ZW5kfSBkaXJlY3RpdmUgTTY4MHgwCi1AY2luZGV4IEBjb2Rle2xkb3VibGV9IGRpcmVjdGl2ZSBNNjgweDAKLUBpdGVtIC5leHRlbmQKLUBpdGVteCAubGRvdWJsZQotQGNvZGV7RXh0ZW5kZWR9IHByZWNpc2lvbiAoQGNvZGV7bG9uZyBkb3VibGV9KSBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCi1AZW5kIHRhYmxlCi0KLUBub2RlIE02OEstRGlyZWN0aXZlcwotQHNlY3Rpb24gNjgweDAgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggTTY4MHgwIGRpcmVjdGl2ZXMKLUBjaW5kZXggZGlyZWN0aXZlcywgTTY4MHgwCi1JbiBvcmRlciB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIFN1biBhc3NlbWJsZXIgdGhlIDY4MHgwIGFzc2VtYmxlcgotdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzLgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7ZGF0YTF9IGRpcmVjdGl2ZSwgTTY4MHgwCi1AaXRlbSAuZGF0YTEKLVRoaXMgZGlyZWN0aXZlIGlzIGlkZW50aWNhbCB0byBhIEBjb2Rley5kYXRhIDF9IGRpcmVjdGl2ZS4KLQotQGNpbmRleCBAY29kZXtkYXRhMn0gZGlyZWN0aXZlLCBNNjgweDAKLUBpdGVtIC5kYXRhMgotVGhpcyBkaXJlY3RpdmUgaXMgaWRlbnRpY2FsIHRvIGEgQGNvZGV7LmRhdGEgMn0gZGlyZWN0aXZlLgotCi1AY2luZGV4IEBjb2Rle2V2ZW59IGRpcmVjdGl2ZSwgTTY4MHgwCi1AaXRlbSAuZXZlbgotVGhpcyBkaXJlY3RpdmUgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIEBjb2Rley5hbGlnbn0gZGlyZWN0aXZlOyBpdAotYWxpZ25zIHRoZSBvdXRwdXQgdG8gYW4gZXZlbiBieXRlIGJvdW5kYXJ5LgotCi1AY2luZGV4IEBjb2Rle3NraXB9IGRpcmVjdGl2ZSwgTTY4MHgwCi1AaXRlbSAuc2tpcAotVGhpcyBkaXJlY3RpdmUgaXMgaWRlbnRpY2FsIHRvIGEgQGNvZGV7LnNwYWNlfSBkaXJlY3RpdmUuCi1AZW5kIHRhYmxlCi0KLUBuZWVkIDIwMDAKLUBub2RlIE02OEstb3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotCi1AY2luZGV4IE02ODB4MCBvcGNvZGVzCi1AY2luZGV4IG9wY29kZXMsIE02ODB4MAotQGNpbmRleCBpbnN0cnVjdGlvbiBzZXQsIE02ODB4MAotQGMgZG9jQGN5Z251cy5jb206IEkgZG9uJ3Qgc2VlIGFueSBwb2ludCBpbiB0aGUgZm9sbG93aW5nCi1AYyAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGguICBCdWdzIGFyZSBidWdzOyBob3cgZG9lcyBzYXlpbmcgdGhpcwotQGMgICAgICAgICAgICAgICAgICAgaGVscCBhbnlvbmU/Ci1AaWdub3JlCi1EYW5nZXI6ICBTZXZlcmFsIGJ1Z3MgaGF2ZSBiZWVuIGZvdW5kIGluIHRoZSBvcGNvZGUgdGFibGUgKGFuZAotZml4ZWQpLiAgTW9yZSBidWdzIG1heSBleGlzdC4gIEJlIGNhcmVmdWwgd2hlbiB1c2luZyBvYnNjdXJlCi1pbnN0cnVjdGlvbnMuCi1AZW5kIGlnbm9yZQotCi1AbWVudQotKiBNNjhLLUJyYW5jaDo6ICAgICAgICAgICAgICAgICBCcmFuY2ggSW1wcm92ZW1lbnQKLSogTTY4Sy1DaGFyczo6ICAgICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi1AZW5kIG1lbnUKLQotQG5vZGUgTTY4Sy1CcmFuY2gKLUBzdWJzZWN0aW9uIEJyYW5jaCBJbXByb3ZlbWVudAotCi1AY2luZGV4IHBzZXVkby1vcGNvZGVzLCBNNjgweDAKLUBjaW5kZXggTTY4MHgwIHBzZXVkby1vcGNvZGVzCi1AY2luZGV4IGJyYW5jaCBpbXByb3ZlbWVudCwgTTY4MHgwCi1AY2luZGV4IE02ODB4MCBicmFuY2ggaW1wcm92ZW1lbnQKLUNlcnRhaW4gcHNldWRvIG9wY29kZXMgYXJlIHBlcm1pdHRlZCBmb3IgYnJhbmNoIGluc3RydWN0aW9ucy4KLVRoZXkgZXhwYW5kIHRvIHRoZSBzaG9ydGVzdCBicmFuY2ggaW5zdHJ1Y3Rpb24gdGhhdCByZWFjaCB0aGUKLXRhcmdldC4gIEdlbmVyYWxseSB0aGVzZSBtbmVtb25pY3MgYXJlIG1hZGUgYnkgc3Vic3RpdHV0aW5nIEBzYW1we2p9IGZvcgotQHNhbXB7Yn0gYXQgdGhlIHN0YXJ0IG9mIGEgTW90b3JvbGEgbW5lbW9uaWMuCi0KLVRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgcHNldWRvLW9wZXJhdGlvbnMuICBBIEBjb2Rleyp9IGZsYWdzCi1jYXNlcyB0aGF0IGFyZSBtb3JlIGZ1bGx5IGRlc2NyaWJlZCBhZnRlciB0aGUgdGFibGU6Ci0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgICBEaXNwbGFjZW1lbnQKLSAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgIHwgICAgICAgICAgICAgICAgNjgwMjAgICA2ODAwMC8xMAotUHNldWRvLU9wIHxCWVRFICAgIFdPUkQgICAgTE9ORyAgICBMT05HICAgICAgbm9uLVBDIHJlbGF0aXZlCi0gICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgamJzciB8YnNycyAgICBic3IgICAgIGJzcmwgICAganNyICAgICAgIGpzcgotICAgICAganJhIHxicmFzICAgIGJyYSAgICAgYnJhbCAgICBqbXAgICAgICAgam1wCi0qICAgICBqWFggfGJYWHMgICAgYlhYICAgICBiWFhsICAgIGJOWHM7am1wbCBiTlhzO2ptcAotKiAgICBkYlhYIHxkYlhYICAgIGRiWFggICAgICAgIGRiWFg7IGJyYTsgam1wbAotKiAgICBmalhYIHxmYlhYdyAgIGZiWFh3ICAgZmJYWGwgICAgICAgICAgICAgZmJOWHc7am1wCi0KLVhYOiBjb25kaXRpb24KLU5YOiBuZWdhdGl2ZSBvZiBjb25kaXRpb24gWFgKLQotQGVuZCBzbWFsbGV4YW1wbGUKLUBjZW50ZXIgQGNvZGV7Kn0tLS1zZWUgZnVsbCBkZXNjcmlwdGlvbiBiZWxvdwotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGpic3IKLUBpdGVteCBqcmEKLVRoZXNlIGFyZSB0aGUgc2ltcGxlc3QganVtcCBwc2V1ZG8tb3BlcmF0aW9uczsgdGhleSBhbHdheXMgbWFwIHRvIG9uZQotcGFydGljdWxhciBtYWNoaW5lIGluc3RydWN0aW9uLCBkZXBlbmRpbmcgb24gdGhlIGRpc3BsYWNlbWVudCB0byB0aGUKLWJyYW5jaCB0YXJnZXQuCi0KLUBpdGVtIGpAdmFye1hYfQotSGVyZSwgQHNhbXB7akB2YXJ7WFh9fSBzdGFuZHMgZm9yIGFuIGVudGlyZSBmYW1pbHkgb2YgcHNldWRvLW9wZXJhdGlvbnMsCi13aGVyZSBAdmFye1hYfSBpcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCBvciBjb25kaXRpb24tY29kZSB0ZXN0LiAgVGhlIGZ1bGwKLWxpc3Qgb2YgcHNldWRvLW9wcyBpbiB0aGlzIGZhbWlseSBpczoKLUBzbWFsbGV4YW1wbGUKLSBqaGkgICBqbHMgICBqY2MgICBqY3MgICBqbmUgICBqZXEgICBqdmMKLSBqdnMgICBqcGwgICBqbWkgICBqZ2UgICBqbHQgICBqZ3QgICBqbGUKLUBlbmQgc21hbGxleGFtcGxlCi0KLUZvciB0aGUgY2FzZXMgb2Ygbm9uLVBDIHJlbGF0aXZlIGRpc3BsYWNlbWVudHMgYW5kIGxvbmcgZGlzcGxhY2VtZW50cyBvbgotdGhlIDY4MDAwIG9yIDY4MDEwLCBAY29kZXtAdmFsdWV7QVN9fSBpc3N1ZXMgYSBsb25nZXIgY29kZSBmcmFnbWVudCBpbiB0ZXJtcyBvZgotQHZhcntOWH0sIHRoZSBvcHBvc2l0ZSBjb25kaXRpb24gdG8gQHZhcntYWH0uICBGb3IgZXhhbXBsZSwgZm9yIHRoZQotbm9uLVBDIHJlbGF0aXZlIGNhc2U6Ci1Ac21hbGxleGFtcGxlCi0gICAgakB2YXJ7WFh9IGZvbwotQGVuZCBzbWFsbGV4YW1wbGUKLWdpdmVzCi1Ac21hbGxleGFtcGxlCi0gICAgIGJAdmFye05YfXMgb29mCi0gICAgIGptcCBmb28KLSBvb2Y6Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbSBkYkB2YXJ7WFh9Ci1UaGUgZnVsbCBmYW1pbHkgb2YgcHNldWRvLW9wZXJhdGlvbnMgY292ZXJlZCBoZXJlIGlzCi1Ac21hbGxleGFtcGxlCi0gZGJoaSAgIGRibHMgICBkYmNjICAgZGJjcyAgIGRibmUgICBkYmVxICAgZGJ2YwotIGRidnMgICBkYnBsICAgZGJtaSAgIGRiZ2UgICBkYmx0ICAgZGJndCAgIGRibGUKLSBkYmYgICAgZGJyYSAgIGRidAotQGVuZCBzbWFsbGV4YW1wbGUKLQotT3RoZXIgdGhhbiBmb3Igd29yZCBhbmQgYnl0ZSBkaXNwbGFjZW1lbnRzLCB3aGVuIHRoZSBzb3VyY2UgcmVhZHMKLUBzYW1we2RiQHZhcntYWH0gZm9vfSwgQGNvZGV7QHZhbHVle0FTfX0gZW1pdHMKLUBzbWFsbGV4YW1wbGUKLSAgICAgZGJAdmFye1hYfSBvbzEKLSAgICAgYnJhIG9vMgotIG9vMTpqbXBsIGZvbwotIG9vMjoKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtIGZqQHZhcntYWH0KLVRoaXMgZmFtaWx5IGluY2x1ZGVzCi1Ac21hbGxleGFtcGxlCi0gZmpuZSAgIGZqZXEgICBmamdlICAgZmpsdCAgIGZqZ3QgICBmamxlICAgZmpmCi0gZmp0ICAgIGZqZ2wgICBmamdsZSAgZmpuZ2UgIGZqbmdsICBmam5nbGUgZmpuZ3QKLSBmam5sZSAgZmpubHQgIGZqb2dlICBmam9nbCAgZmpvZ3QgIGZqb2xlICBmam9sdAotIGZqb3IgICBmanNlcSAgZmpzZiAgIGZqc25lICBmanN0ICAgZmp1ZXEgIGZqdWdlCi0gZmp1Z3QgIGZqdWxlICBmanVsdCAgZmp1bgotQGVuZCBzbWFsbGV4YW1wbGUKLQotRm9yIGJyYW5jaCB0YXJnZXRzIHRoYXQgYXJlIG5vdCBQQyByZWxhdGl2ZSwgQGNvZGV7QHZhbHVle0FTfX0gZW1pdHMKLUBzbWFsbGV4YW1wbGUKLSAgICAgZmJAdmFye05YfSBvb2YKLSAgICAgam1wIGZvbwotIG9vZjoKLUBlbmQgc21hbGxleGFtcGxlCi13aGVuIGl0IGVuY291bnRlcnMgQHNhbXB7ZmpAdmFye1hYfSBmb299LgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIE02OEstQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IHNwZWNpYWwgY2hhcmFjdGVycywgTTY4MHgwCi1AY2luZGV4IE02ODB4MCBpbW1lZGlhdGUgY2hhcmFjdGVyCi1AY2luZGV4IGltbWVkaWF0ZSBjaGFyYWN0ZXIsIE02ODB4MAotQGNpbmRleCBNNjgweDAgbGluZSBjb21tZW50IGNoYXJhY3RlcgotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBNNjgweDAKLUBjaW5kZXggY29tbWVudHMsIE02ODB4MAotVGhlIGltbWVkaWF0ZSBjaGFyYWN0ZXIgaXMgQHNhbXB7I30gZm9yIFN1biBjb21wYXRpYmlsaXR5LiAgVGhlCi1saW5lLWNvbW1lbnQgY2hhcmFjdGVyIGlzIEBzYW1we3x9ICh1bmxlc3MgdGhlIEBzYW1wey0tYml0d2lzZS1vcn0KLW9wdGlvbiBpcyB1c2VkKS4gIElmIGEgQHNhbXB7I30gYXBwZWFycyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSwgaXQKLWlzIHRyZWF0ZWQgYXMgYSBjb21tZW50IHVubGVzcyBpdCBsb29rcyBsaWtlIEBzYW1weyMgbGluZSBmaWxlfSwgaW4KLXdoaWNoIGNhc2UgaXQgaXMgdHJlYXRlZCBub3JtYWxseS4KLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLW1pcHMudGV4aSBiL2dhcy9kb2MvYy1taXBzLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyM2RkYTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLW1pcHMudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIE1JUFMtRGVwZW5kZW50Ci1AY2hhcHRlciBNSVBTIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIE1JUFMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBNSVBTIHByb2Nlc3NvcgotQHNje2dudX0gQGNvZGV7QHZhbHVle0FTfX0gZm9yIEBzY3ttaXBzfSBhcmNoaXRlY3R1cmVzIHN1cHBvcnRzIHNldmVyYWwKLWRpZmZlcmVudCBAc2N7bWlwc30gcHJvY2Vzc29ycywgYW5kIE1JUFMgSVNBIGxldmVscyBJIHRocm91Z2ggSVYuICBGb3IKLWluZm9ybWF0aW9uIGFib3V0IHRoZSBAc2N7bWlwc30gaW5zdHJ1Y3Rpb24gc2V0LCBzZWUgQGNpdGV7TUlQUyBSSVNDCi1BcmNoaXRlY3R1cmV9LCBieSBLYW5lIGFuZCBIZWluZHJpY2ggKFByZW50aWNlLUhhbGwpLiAgRm9yIGFuIG92ZXJ2aWV3Ci1vZiBAc2N7bWlwc30gYXNzZW1ibHkgY29udmVudGlvbnMsIHNlZSBgYEFwcGVuZGl4IEQ6IEFzc2VtYmx5IExhbmd1YWdlCi1Qcm9ncmFtbWluZycnIGluIHRoZSBzYW1lIHdvcmsuCi0KLUBtZW51Ci0qIE1JUFMgT3B0czo6ICAgCUFzc2VtYmxlciBvcHRpb25zCi0qIE1JUFMgT2JqZWN0OjogCUVDT0ZGIG9iamVjdCBjb2RlCi0qIE1JUFMgU3RhYnM6OiAgCURpcmVjdGl2ZXMgZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotKiBNSVBTIElTQTo6ICAgIAlEaXJlY3RpdmVzIHRvIG92ZXJyaWRlIHRoZSBJU0EgbGV2ZWwKLSogTUlQUyBhdXRvZXh0ZW5kOjoJRGlyZWN0aXZlcyBmb3IgZXh0ZW5kaW5nIE1JUFMgMTYgYml0IGluc3RydWN0aW9ucwotKiBNSVBTIGluc246OgkJRGlyZWN0aXZlIHRvIG1hcmsgZGF0YSBhcyBhbiBpbnN0cnVjdGlvbgotKiBNSVBTIG9wdGlvbiBzdGFjazo6CURpcmVjdGl2ZXMgdG8gc2F2ZSBhbmQgcmVzdG9yZSBvcHRpb25zCi1AZW5kIG1lbnUKLQotQG5vZGUgTUlQUyBPcHRzCi1Ac2VjdGlvbiBBc3NlbWJsZXIgb3B0aW9ucwotCi1UaGUgQHNje21pcHN9IGNvbmZpZ3VyYXRpb25zIG9mIEBzY3tnbnV9IEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnQgdGhlc2UKLXNwZWNpYWwgb3B0aW9uczoKLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rley1HfSBvcHRpb24gKE1JUFMpCi1AaXRlbSAtRyBAdmFye251bX0KLVRoaXMgb3B0aW9uIHNldHMgdGhlIGxhcmdlc3Qgc2l6ZSBvZiBhbiBvYmplY3QgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZAotaW1wbGljaXRseSB3aXRoIHRoZSBAY29kZXtncH0gcmVnaXN0ZXIuICBJdCBpcyBvbmx5IGFjY2VwdGVkIGZvciB0YXJnZXRzCi10aGF0IHVzZSBAc2N7ZWNvZmZ9IGZvcm1hdC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDguCi0KLUBjaW5kZXggQGNvZGV7LUVCfSBvcHRpb24gKE1JUFMpCi1AY2luZGV4IEBjb2Rley1FTH0gb3B0aW9uIChNSVBTKQotQGNpbmRleCBNSVBTIGJpZy1lbmRpYW4gb3V0cHV0Ci1AY2luZGV4IE1JUFMgbGl0dGxlLWVuZGlhbiBvdXRwdXQKLUBjaW5kZXggYmlnLWVuZGlhbiBvdXRwdXQsIE1JUFMKLUBjaW5kZXggbGl0dGxlLWVuZGlhbiBvdXRwdXQsIE1JUFMKLUBpdGVtIC1FQgotQGl0ZW14IC1FTAotQW55IEBzY3ttaXBzfSBjb25maWd1cmF0aW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGNhbiBzZWxlY3QgYmlnLWVuZGlhbiBvcgotbGl0dGxlLWVuZGlhbiBvdXRwdXQgYXQgcnVuIHRpbWUgKHVubGlrZSB0aGUgb3RoZXIgQHNje2dudX0gZGV2ZWxvcG1lbnQKLXRvb2xzLCB3aGljaCBtdXN0IGJlIGNvbmZpZ3VyZWQgZm9yIG9uZSBvciB0aGUgb3RoZXIpLiAgVXNlIEBzYW1wey1FQn0KLXRvIHNlbGVjdCBiaWctZW5kaWFuIG91dHB1dCwgYW5kIEBzYW1wey1FTH0gZm9yIGxpdHRsZS1lbmRpYW4uCi0KLUBjaW5kZXggTUlQUyBhcmNoaXRlY3R1cmUgb3B0aW9ucwotQGl0ZW0gLW1pcHMxCi1AaXRlbXggLW1pcHMyCi1AaXRlbXggLW1pcHMzCi1AaXRlbXggLW1pcHM0Ci1HZW5lcmF0ZSBjb2RlIGZvciBhIHBhcnRpY3VsYXIgTUlQUyBJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlIGxldmVsLgotQHNhbXB7LW1pcHMxfSBjb3JyZXNwb25kcyB0byB0aGUgQHNje3IyMDAwfSBhbmQgQHNje3IzMDAwfSBwcm9jZXNzb3JzLAotQHNhbXB7LW1pcHMyfSB0byB0aGUgQHNje3I2MDAwfSBwcm9jZXNzb3IsIEBzYW1wey1taXBzM30gdG8gdGhlCi1Ac2N7cjQwMDB9IHByb2Nlc3NvciwgYW5kIEBzYW1wey1taXBzNH0gdG8gdGhlIEBzY3tyODAwMH0gYW5kCi1Ac2N7cjEwMDAwfSBwcm9jZXNzb3JzLiAgWW91IGNhbiBhbHNvIHN3aXRjaCBpbnN0cnVjdGlvbiBzZXRzIGR1cmluZyB0aGUKLWFzc2VtYmx5OyBzZWUgQHJlZntNSVBTIElTQSwsIERpcmVjdGl2ZXMgdG8gb3ZlcnJpZGUgdGhlIElTQSBsZXZlbH0uCi0KLUBpdGVtIC1taXBzMTYKLUBpdGVteCAtbm8tbWlwczE2Ci1HZW5lcmF0ZSBjb2RlIGZvciB0aGUgTUlQUyAxNiBwcm9jZXNzb3IuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gcHV0dGluZwotQHNhbXB7LnNldCBtaXBzMTZ9IGF0IHRoZSBzdGFydCBvZiB0aGUgYXNzZW1ibHkgZmlsZS4gIEBzYW1wey1uby1taXBzMTZ9Ci10dXJucyBvZmYgdGhpcyBvcHRpb24uCi0KLUBpdGVtIC1tNDAxMAotQGl0ZW14IC1uby1tNDAxMAotR2VuZXJhdGUgY29kZSBmb3IgdGhlIExTSSBAc2N7cjQwMTB9IGNoaXAuICBUaGlzIHRlbGxzIHRoZSBhc3NlbWJsZXIgdG8KLWFjY2VwdCB0aGUgQHNje3I0MDEwfSBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgKEBzYW1we2FkZGNpdX0sIEBzYW1we2ZmY30sCi1ldGMuKSwgYW5kIHRvIG5vdCBzY2hlZHVsZSBAc2FtcHtub3B9IGluc3RydWN0aW9ucyBhcm91bmQgYWNjZXNzZXMgdG8KLXRoZSBAc2FtcHtISX0gYW5kIEBzYW1we0xPfSByZWdpc3RlcnMuICBAc2FtcHstbm8tbTQwMTB9IHR1cm5zIG9mZiB0aGlzCi1vcHRpb24uCi0KLUBpdGVtIC1tNDY1MAotQGl0ZW14IC1uby1tNDY1MAotR2VuZXJhdGUgY29kZSBmb3IgdGhlIE1JUFMgQHNje3I0NjUwfSBjaGlwLiAgVGhpcyB0ZWxscyB0aGUgYXNzZW1ibGVyIHRvIGFjY2VwdAotdGhlIEBzYW1we21hZH0gYW5kIEBzYW1we21hZHV9IGluc3RydWN0aW9uLCBhbmQgdG8gbm90IHNjaGVkdWxlIEBzYW1we25vcH0KLWluc3RydWN0aW9ucyBhcm91bmQgYWNjZXNzZXMgdG8gdGhlIEBzYW1we0hJfSBhbmQgQHNhbXB7TE99IHJlZ2lzdGVycy4KLUBzYW1wey1uby1tNDY1MH0gdHVybnMgb2ZmIHRoaXMgb3B0aW9uLgotCi1AaXRlbXggLW0zOTAwCi1AaXRlbXggLW5vLW0zOTAwCi1AaXRlbXggLW00MTAwCi1AaXRlbXggLW5vLW00MTAwCi1Gb3IgZWFjaCBvcHRpb24gQHNhbXB7LW1AdmFye25ubm59fSwgZ2VuZXJhdGUgY29kZSBmb3IgdGhlIE1JUFMKLUBzY3tyQHZhcntubm5ufX0gY2hpcC4gIFRoaXMgdGVsbHMgdGhlIGFzc2VtYmxlciB0byBhY2NlcHQgaW5zdHJ1Y3Rpb25zCi1zcGVjaWZpYyB0byB0aGF0IGNoaXAsIGFuZCB0byBzY2hlZHVsZSBmb3IgdGhhdCBjaGlwJ3MgaGF6YXJkcy4KLQotQGl0ZW0gLW1jcHU9QHZhcntjcHV9Ci1HZW5lcmF0ZSBjb2RlIGZvciBhIHBhcnRpY3VsYXIgTUlQUyBjcHUuICBJdCBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8KLUBzYW1wey1tQHZhcntjcHV9fSwgZXhjZXB0IHRoYXQgdGhlcmUgYXJlIG1vcmUgdmFsdWUgb2YgQHZhcntjcHV9Ci11bmRlcnN0b29kLiAgVmFsaWQgQHZhcntjcHV9IHZhbHVlIGFyZToKLQotQHF1b3RhdGlvbgotMjAwMCwKLTMwMDAsCi0zOTAwLAotNDAwMCwKLTQwMTAsCi00MTAwLAotNDExMSwKLTQzMDAsCi00NDAwLAotNDYwMCwKLTQ2NTAsCi01MDAwLAotNjAwMCwKLTgwMDAsCi0xMDAwMAotQGVuZCBxdW90YXRpb24KLQotCi1AY2luZGV4IEBjb2Rley1ub2NwcH0gaWdub3JlZCAoTUlQUykKLUBpdGVtIC1ub2NwcAotVGhpcyBvcHRpb24gaXMgaWdub3JlZC4gIEl0IGlzIGFjY2VwdGVkIGZvciBjb21tYW5kLWxpbmUgY29tcGF0aWJpbGl0eSB3aXRoCi1vdGhlciBhc3NlbWJsZXJzLCB3aGljaCB1c2UgaXQgdG8gdHVybiBvZmYgQyBzdHlsZSBwcmVwcm9jZXNzaW5nLiAgV2l0aAotQHNje2dudX0gQGNvZGV7QHZhbHVle0FTfX0sIHRoZXJlIGlzIG5vIG5lZWQgZm9yIEBzYW1wey1ub2NwcH0sIGJlY2F1c2UgdGhlCi1Ac2N7Z251fSBhc3NlbWJsZXIgaXRzZWxmIG5ldmVyIHJ1bnMgdGhlIEMgcHJlcHJvY2Vzc29yLgotCi1AaXRlbSAtLXRyYXAKLUBpdGVteCAtLW5vLWJyZWFrCi1AYyBGSVhNRSEgICgxKSByZWZsZWN0IHRoZXNlIG9wdGlvbnMgKG5leHQgaXRlbSB0b28pIGluIG9wdGlvbiBzdW1tYXJpZXM7Ci1AYyAgICAgICAgICgyKSBzdG9wIHRlYXNpbmcsIHNheSBfd2hpY2hfIGluc3RydWN0aW9ucyBleHBhbmRlZCBfaG93Xy4KLUBjb2Rle0B2YWx1ZXtBU319IGF1dG9tYXRpY2FsbHkgbWFjcm8gZXhwYW5kcyBjZXJ0YWluIGRpdmlzaW9uIGFuZAotbXVsdGlwbGljYXRpb24gaW5zdHJ1Y3Rpb25zIHRvIGNoZWNrIGZvciBvdmVyZmxvdyBhbmQgZGl2aXNpb24gYnkgemVyby4gIFRoaXMKLW9wdGlvbiBjYXVzZXMgQGNvZGV7QHZhbHVle0FTfX0gdG8gZ2VuZXJhdGUgY29kZSB0byB0YWtlIGEgdHJhcCBleGNlcHRpb24KLXJhdGhlciB0aGFuIGEgYnJlYWsgZXhjZXB0aW9uIHdoZW4gYW4gZXJyb3IgaXMgZGV0ZWN0ZWQuICBUaGUgdHJhcCBpbnN0cnVjdGlvbnMKLWFyZSBvbmx5IHN1cHBvcnRlZCBhdCBJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlIGxldmVsIDIgYW5kIGhpZ2hlci4KLQotQGl0ZW0gLS1icmVhawotQGl0ZW14IC0tbm8tdHJhcAotR2VuZXJhdGUgY29kZSB0byB0YWtlIGEgYnJlYWsgZXhjZXB0aW9uIHJhdGhlciB0aGFuIGEgdHJhcCBleGNlcHRpb24gd2hlbiBhbgotZXJyb3IgaXMgZGV0ZWN0ZWQuICBUaGlzIGlzIHRoZSBkZWZhdWx0LgotQGVuZCB0YWJsZQotCi1Abm9kZSBNSVBTIE9iamVjdAotQHNlY3Rpb24gTUlQUyBFQ09GRiBvYmplY3QgY29kZQotCi1AY2luZGV4IEVDT0ZGIHNlY3Rpb25zCi1AY2luZGV4IE1JUFMgRUNPRkYgc2VjdGlvbnMKLUFzc2VtYmxpbmcgZm9yIGEgQHNje21pcHN9IEBzY3tlY29mZn0gdGFyZ2V0IHN1cHBvcnRzIHNvbWUgYWRkaXRpb25hbCBzZWN0aW9ucwotYmVzaWRlcyB0aGUgdXN1YWwgQGNvZGV7LnRleHR9LCBAY29kZXsuZGF0YX0gYW5kIEBjb2Rley5ic3N9LiAgVGhlCi1hZGRpdGlvbmFsIHNlY3Rpb25zIGFyZSBAY29kZXsucmRhdGF9LCB1c2VkIGZvciByZWFkLW9ubHkgZGF0YSwKLUBjb2Rley5zZGF0YX0sIHVzZWQgZm9yIHNtYWxsIGRhdGEsIGFuZCBAY29kZXsuc2Jzc30sIHVzZWQgZm9yIHNtYWxsCi1jb21tb24gb2JqZWN0cy4KLQotQGNpbmRleCBzbWFsbCBvYmplY3RzLCBNSVBTIEVDT0ZGCi1AY2luZGV4IEBjb2Rle2dwfSByZWdpc3RlciwgTUlQUwotV2hlbiBhc3NlbWJsaW5nIGZvciBAc2N7ZWNvZmZ9LCB0aGUgYXNzZW1ibGVyIHVzZXMgdGhlIEBjb2RleyRncH0gKEBjb2RleyQyOH0pCi1yZWdpc3RlciB0byBmb3JtIHRoZSBhZGRyZXNzIG9mIGEgYGBzbWFsbCBvYmplY3QnJy4gIEFueSBvYmplY3QgaW4gdGhlCi1AY29kZXsuc2RhdGF9IG9yIEBjb2Rley5zYnNzfSBzZWN0aW9ucyBpcyBjb25zaWRlcmVkIGBgc21hbGwnJyBpbiB0aGlzIHNlbnNlLgotRm9yIGV4dGVybmFsIG9iamVjdHMsIG9yIGZvciBvYmplY3RzIGluIHRoZSBAY29kZXsuYnNzfSBzZWN0aW9uLCB5b3UgY2FuIHVzZQotdGhlIEBjb2Rle0B2YWx1ZXtHQ0N9fSBAc2FtcHstR30gb3B0aW9uIHRvIGNvbnRyb2wgdGhlIHNpemUgb2Ygb2JqZWN0cyBhZGRyZXNzZWQgdmlhCi1AY29kZXskZ3B9OyB0aGUgZGVmYXVsdCB2YWx1ZSBpcyA4LCBtZWFuaW5nIHRoYXQgYSByZWZlcmVuY2UgdG8gYW55IG9iamVjdAotZWlnaHQgYnl0ZXMgb3Igc21hbGxlciB1c2VzIEBjb2RleyRncH0uICBQYXNzaW5nIEBzYW1wey1HIDB9IHRvCi1AY29kZXtAdmFsdWV7QVN9fSBwcmV2ZW50cyBpdCBmcm9tIHVzaW5nIHRoZSBAY29kZXskZ3B9IHJlZ2lzdGVyIG9uIHRoZSBiYXNpcwotb2Ygb2JqZWN0IHNpemUgKGJ1dCB0aGUgYXNzZW1ibGVyIHVzZXMgQGNvZGV7JGdwfSBmb3Igb2JqZWN0cyBpbiBAY29kZXsuc2RhdGF9Ci1vciBAY29kZXtzYnNzfSBpbiBhbnkgY2FzZSkuICBUaGUgc2l6ZSBvZiBhbiBvYmplY3QgaW4gdGhlIEBjb2Rley5ic3N9IHNlY3Rpb24KLWlzIHNldCBieSB0aGUgQGNvZGV7LmNvbW19IG9yIEBjb2Rley5sY29tbX0gZGlyZWN0aXZlIHRoYXQgZGVmaW5lcyBpdC4gIFRoZQotc2l6ZSBvZiBhbiBleHRlcm5hbCBvYmplY3QgbWF5IGJlIHNldCB3aXRoIHRoZSBAY29kZXsuZXh0ZXJufSBkaXJlY3RpdmUuICBGb3IKLWV4YW1wbGUsIEBzYW1wey5leHRlcm4gc3ltLDR9IGRlY2xhcmVzIHRoYXQgdGhlIG9iamVjdCBhdCBAY29kZXtzeW19IGlzIDQgYnl0ZXMKLWluIGxlbmd0aCwgd2hpZSBsZWF2aW5nIEBjb2Rle3N5bX0gb3RoZXJ3aXNlIHVuZGVmaW5lZC4KLQotVXNpbmcgc21hbGwgQHNje2Vjb2ZmfSBvYmplY3RzIHJlcXVpcmVzIGxpbmtlciBzdXBwb3J0LCBhbmQgYXNzdW1lcyB0aGF0IHRoZQotQGNvZGV7JGdwfSByZWdpc3RlciBpcyBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQgKG5vcm1hbGx5IGRvbmUgYXV0b21hdGljYWxseSBieQotdGhlIHN0YXJ0dXAgY29kZSkuICBAc2N7bWlwc30gQHNje2Vjb2ZmfSBhc3NlbWJseSBjb2RlIG11c3Qgbm90IG1vZGlmeSB0aGUKLUBjb2RleyRncH0gcmVnaXN0ZXIuCi0KLUBub2RlIE1JUFMgU3RhYnMKLUBzZWN0aW9uIERpcmVjdGl2ZXMgZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotCi1AY2luZGV4IE1JUFMgZGVidWdnaW5nIGRpcmVjdGl2ZXMKLUBzY3ttaXBzfSBAc2N7ZWNvZmZ9IEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIHNldmVyYWwgZGlyZWN0aXZlcyB1c2VkIGZvcgotZ2VuZXJhdGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2hpY2ggYXJlIG5vdCBzdXBwb3J0IGJ5IHRyYWRpdGlvbmFsIEBzY3ttaXBzfQotYXNzZW1ibGVycy4gIFRoZXNlIGFyZSBAY29kZXsuZGVmfSwgQGNvZGV7LmVuZGVmfSwgQGNvZGV7LmRpbX0sIEBjb2Rley5maWxlfSwKLUBjb2Rley5zY2x9LCBAY29kZXsuc2l6ZX0sIEBjb2Rley50YWd9LCBAY29kZXsudHlwZX0sIEBjb2Rley52YWx9LAotQGNvZGV7LnN0YWJkfSwgQGNvZGV7LnN0YWJufSwgYW5kIEBjb2Rley5zdGFic30uICBUaGUgZGVidWdnaW5nIGluZm9ybWF0aW9uCi1nZW5lcmF0ZWQgYnkgdGhlIHRocmVlIEBjb2Rley5zdGFifSBkaXJlY3RpdmVzIGNhbiBvbmx5IGJlIHJlYWQgYnkgQHNje2dkYn0sCi1ub3QgYnkgdHJhZGl0aW9uYWwgQHNje21pcHN9IGRlYnVnZ2VycyAodGhpcyBlbmhhbmNlbWVudCBpcyByZXF1aXJlZCB0byBmdWxseQotc3VwcG9ydCBDKysgZGVidWdnaW5nKS4gIFRoZXNlIGRpcmVjdGl2ZXMgYXJlIHByaW1hcmlseSB1c2VkIGJ5IGNvbXBpbGVycywgbm90Ci1hc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtbWVycyEKLQotQG5vZGUgTUlQUyBJU0EKLUBzZWN0aW9uIERpcmVjdGl2ZXMgdG8gb3ZlcnJpZGUgdGhlIElTQSBsZXZlbAotCi1AY2luZGV4IE1JUFMgSVNBIG92ZXJyaWRlCi1Aa2luZGV4IEBjb2Rley5zZXQgbWlwc0B2YXJ7bn19Ci1Ac2N7Z251fSBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyBhbiBhZGRpdGlvbmFsIGRpcmVjdGl2ZSB0byBjaGFuZ2UKLXRoZSBAc2N7bWlwc30gSW5zdHJ1Y3Rpb24gU2V0IEFyY2hpdGVjdHVyZSBsZXZlbCBvbiB0aGUgZmx5OiBAY29kZXsuc2V0Ci1taXBzQHZhcntufX0uICBAdmFye259IHNob3VsZCBiZSBhIG51bWJlciBmcm9tIDAgdG8gNC4gIEEgdmFsdWUgZnJvbSAxCi10byA0IG1ha2VzIHRoZSBhc3NlbWJsZXIgYWNjZXB0IGluc3RydWN0aW9ucyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcKLUBzY3tpc2F9IGxldmVsLCBmcm9tIHRoYXQgcG9pbnQgb24gaW4gdGhlIGFzc2VtYmx5LiAgQGNvZGV7LnNldAotbWlwc0B2YXJ7bn19IGFmZmVjdHMgbm90IG9ubHkgd2hpY2ggaW5zdHJ1Y3Rpb25zIGFyZSBwZXJtaXR0ZWQsIGJ1dCBhbHNvCi1ob3cgY2VydGFpbiBtYWNyb3MgYXJlIGV4cGFuZGVkLiAgQGNvZGV7LnNldCBtaXBzMH0gcmVzdG9yZXMgdGhlCi1Ac2N7aXNhfSBsZXZlbCB0byBpdHMgb3JpZ2luYWwgbGV2ZWw6IGVpdGhlciB0aGUgbGV2ZWwgeW91IHNlbGVjdGVkIHdpdGgKLWNvbW1hbmQgbGluZSBvcHRpb25zLCBvciB0aGUgZGVmYXVsdCBmb3IgeW91ciBjb25maWd1cmF0aW9uLiAgWW91IGNhbgotdXNlIHRoaXMgZmVhdHVyZSB0byBwZXJtaXQgc3BlY2lmaWMgQHNje3I0MDAwfSBpbnN0cnVjdGlvbnMgd2hpbGUKLWFzc2VtYmxpbmcgaW4gMzIgYml0IG1vZGUuICBVc2UgdGhpcyBkaXJlY3RpdmUgd2l0aCBjYXJlIQotCi1UaGUgZGlyZWN0aXZlIEBzYW1wey5zZXQgbWlwczE2fSBwdXRzIHRoZSBhc3NlbWJsZXIgaW50byBNSVBTIDE2IG1vZGUsCi1pbiB3aGljaCBpdCB3aWxsIGFzc2VtYmxlIGluc3RydWN0aW9ucyBmb3IgdGhlIE1JUFMgMTYgcHJvY2Vzc29yLiAgVXNlCi1Ac2FtcHsuc2V0IG5vbWlwczE2fSB0byByZXR1cm4gdG8gbm9ybWFsIDMyIGJpdCBtb2RlLgotCi1UcmFkaXRpb25hbCBAc2N7bWlwc30gYXNzZW1ibGVycyBkbyBub3Qgc3VwcG9ydCB0aGlzIGRpcmVjdGl2ZS4gIAotCi1Abm9kZSBNSVBTIGF1dG9leHRlbmQKLUBzZWN0aW9uIERpcmVjdGl2ZXMgZm9yIGV4dGVuZGluZyBNSVBTIDE2IGJpdCBpbnN0cnVjdGlvbnMKLQotQGtpbmRleCBAY29kZXsuc2V0IGF1dG9leHRlbmR9Ci1Aa2luZGV4IEBjb2Rley5zZXQgbm9hdXRvZXh0ZW5kfQotQnkgZGVmYXVsdCwgTUlQUyAxNiBpbnN0cnVjdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgZXh0ZW5kZWQgdG8gMzIgYml0cwotd2hlbiBuZWNlc3NhcnkuICBUaGUgZGlyZWN0aXZlIEBzYW1wey5zZXQgbm9hdXRvZXh0ZW5kfSB3aWxsIHR1cm4gdGhpcwotb2ZmLiAgV2hlbiBAc2FtcHsuc2V0IG5vYXV0b2V4dGVuZH0gaXMgaW4gZWZmZWN0LCBhbnkgMzIgYml0IGluc3RydWN0aW9uCi1tdXN0IGJlIGV4cGxpY2l0bHkgZXh0ZW5kZWQgd2l0aCB0aGUgQHNhbXB7LmV9IG1vZGlmaWVyIChlLmcuLAotQHNhbXB7bGkuZSAkNCwxMDAwfSkuICBUaGUgZGlyZWN0aXZlIEBzYW1wey5zZXQgYXV0b2V4dGVuZH0gbWF5IGJlIHVzZWQKLXRvIG9uY2UgYWdhaW4gYXV0b21hdGljYWxseSBleHRlbmQgaW5zdHJ1Y3Rpb25zIHdoZW4gbmVjZXNzYXJ5LgotCi1UaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiBpbiBNSVBTIDE2IG1vZGUuICBUcmFkaXRpb25hbAotQHNje21pcHN9IGFzc2VtYmxlcnMgZG8gbm90IHN1cHBvcnQgdGhpcyBkaXJlY3RpdmUuCi0KLUBub2RlIE1JUFMgaW5zbgotQHNlY3Rpb24gRGlyZWN0aXZlIHRvIG1hcmsgZGF0YSBhcyBhbiBpbnN0cnVjdGlvbgotCi1Aa2luZGV4IEBjb2Rley5pbnNufQotVGhlIEBjb2Rley5pbnNufSBkaXJlY3RpdmUgdGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdGhhdCB0aGUgZm9sbG93aW5nCi1kYXRhIGlzIGFjdHVhbGx5IGluc3RydWN0aW9ucy4gIFRoaXMgbWFrZXMgYSBkaWZmZXJlbmNlIGluIE1JUFMgMTYgbW9kZToKLXdoZW4gbG9hZGluZyB0aGUgYWRkcmVzcyBvZiBhIGxhYmVsIHdoaWNoIHByZWNlZGVzIGluc3RydWN0aW9ucywKLUBjb2Rle0B2YWx1ZXtBU319IGF1dG9tYXRpY2FsbHkgYWRkcyAxIHRvIHRoZSB2YWx1ZSwgc28gdGhhdCBqdW1waW5nIHRvCi10aGUgbG9hZGVkIGFkZHJlc3Mgd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcuCi0KLUBub2RlIE1JUFMgb3B0aW9uIHN0YWNrCi1Ac2VjdGlvbiBEaXJlY3RpdmVzIHRvIHNhdmUgYW5kIHJlc3RvcmUgb3B0aW9ucwotCi1AY2luZGV4IE1JUFMgb3B0aW9uIHN0YWNrCi1Aa2luZGV4IEBjb2Rley5zZXQgcHVzaH0KLUBraW5kZXggQGNvZGV7LnNldCBwb3B9Ci1UaGUgZGlyZWN0aXZlcyBAY29kZXsuc2V0IHB1c2h9IGFuZCBAY29kZXsuc2V0IHBvcH0gbWF5IGJlIHVzZWQgdG8gc2F2ZQotYW5kIHJlc3RvcmUgdGhlIGN1cnJlbnQgc2V0dGluZ3MgZm9yIGFsbCB0aGUgb3B0aW9ucyB3aGljaCBhcmUKLWNvbnRyb2xsZWQgYnkgQGNvZGV7LnNldH0uICBUaGUgQGNvZGV7LnNldCBwdXNofSBkaXJlY3RpdmUgc2F2ZXMgdGhlCi1jdXJyZW50IHNldHRpbmdzIG9uIGEgc3RhY2suICBUaGUgQGNvZGV7LnNldCBwb3B9IGRpcmVjdGl2ZSBwb3BzIHRoZQotc3RhY2sgYW5kIHJlc3RvcmVzIHRoZSBzZXR0aW5ncy4KLQotVGhlc2UgZGlyZWN0aXZlcyBjYW4gYmUgdXNlZnVsIGluc2lkZSBhbiBtYWNybyB3aGljaCBtdXN0IGNoYW5nZSBhbgotb3B0aW9uIHN1Y2ggYXMgdGhlIElTQSBsZXZlbCBvciBpbnN0cnVjdGlvbiByZW9yZGVyaW5nIGJ1dCBkb2VzIG5vdCB3YW50Ci10byBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBjb2RlIHdoaWNoIGludm9rZWQgdGhlIG1hY3JvLgotCi1UcmFkaXRpb25hbCBAc2N7bWlwc30gYXNzZW1ibGVycyBkbyBub3Qgc3VwcG9ydCB0aGVzZSBkaXJlY3RpdmVzLgpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLW5zMzJrLnRleGkgYi9nYXMvZG9jL2MtbnMzMmsudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljNjFkOS4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtbnMzMmsudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLUBjICBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLQotQGlnbm9yZQotQGMgRklYTUUhICBTdG9wIGlnbm9yaW5nIHdoZW4gZmlsbGVkIGluLgotQG5vZGUgMzJ4MzIKLUBjaGFwdGVyIDMyeDMyCi0KLUBzZWN0aW9uIE9wdGlvbnMKLVRoZSAzMngzMiB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGFjY2VwdHMgYSBAc2FtcHstbTMyMDMyfSBvcHRpb24gdG8KLXNwZWNpZnkgdGhpYXQgaXQgaXMgY29tcGlsaW5nIGZvciBhIDMyMDMyIHByb2Nlc3Nvciwgb3IgYQotQHNhbXB7LW0zMjUzMn0gdG8gc3BlY2lmeSB0aGF0IGl0IGlzIGNvbXBpbGluZyBmb3IgYSAzMjUzMiBvcHRpb24uCi1UaGUgZGVmYXVsdCAoaWYgbmVpdGhlciBpcyBzcGVjaWZpZWQpIGlzIGNob3NlbiB3aGVuIHRoZSBhc3NlbWJsZXIKLWlzIGNvbXBpbGVkLgotCi1Ac2VjdGlvbiBTeW50YXgKLUkgZG9uJ3Qga25vdyBhbnl0aGluZyBhYm91dCB0aGUgMzJ4MzIgc3ludGF4IGFzc2VtYmxlZCBieQotQGNvZGV7QHZhbHVle0FTfX0uICBTb21lb25lIHdobyB1bmRlcnNhbmRzIHRoZSBwcm9jZXNzb3IgKEkndmUgbmV2ZXIgc2Vlbgotb25lKSBhbmQgdGhlIHBvc3NpYmxlIHN5bnRheGVzIHNob3VsZCB3cml0ZSB0aGlzIHNlY3Rpb24uCi0KLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci1UaGUgMzJ4MzIgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgYnV0IEBjb2Rle0B2YWx1ZXtBU319Ci1vbmx5IGNyZWF0ZXMgc2luZ2xlIG9yIGRvdWJsZSBwcmVjaXNpb24gdmFsdWVzLiAgSSBkb24ndCBrbm93IGlmIHRoZQotMzJ4MzIgdW5kZXJzdGFuZHMgZXh0ZW5kZWQgcHJlY2lzaW9uIG51bWJlcnMuCi0KLUBzZWN0aW9uIDMyeDMyIE1hY2hpbmUgRGlyZWN0aXZlcwotVGhlIDMyeDMyIGhhcyBubyBtYWNoaW5lIGRlcGVuZGVudCBkaXJlY3RpdmVzLgotCi1AZW5kIGlnbm9yZQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLXNoLnRleGkgYi9nYXMvZG9jL2Mtc2gudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIwZjU1NC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2Mtc2gudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AcGFnZQotQG5vZGUgU0gtRGVwZW5kZW50Ci1AY2hhcHRlciBIaXRhY2hpIFNIIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4IFNIIHN1cHBvcnQKLUBtZW51Ci0qIFNIIE9wdGlvbnM6OiAgICAgICAgICAgICAgT3B0aW9ucwotKiBTSCBTeW50YXg6OiAgICAgICAgICAgICAgIFN5bnRheAotKiBTSCBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIFNIIERpcmVjdGl2ZXM6OiAgICAgICAgICAgU0ggTWFjaGluZSBEaXJlY3RpdmVzCi0qIFNIIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIFNIIE9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLQotQGNpbmRleCBTSCBvcHRpb25zIChub25lKQotQGNpbmRleCBvcHRpb25zLCBTSCAobm9uZSkKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgSGl0YWNoaQotU0ggZmFtaWx5LgotCi1Abm9kZSBTSCBTeW50YXgKLUBzZWN0aW9uIFN5bnRheAotCi1AbWVudQotKiBTSC1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycwotKiBTSC1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCi0qIFNILUFkZHJlc3Npbmc6OiAgICAgICAgICAgQWRkcmVzc2luZyBNb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIFNILUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLQotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBTSAotQGNpbmRleCBTSCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Ac2FtcHshfSBpcyB0aGUgbGluZSBjb21tZW50IGNoYXJhY3Rlci4KLQotQGNpbmRleCBsaW5lIHNlcGFyYXRvciwgU0gKLUBjaW5kZXggc3RhdGVtZW50IHNlcGFyYXRvciwgU0gKLUBjaW5kZXggU0ggbGluZSBzZXBhcmF0b3IKLVlvdSBjYW4gdXNlIEBzYW1wezt9IGluc3RlYWQgb2YgYSBuZXdsaW5lIHRvIHNlcGFyYXRlIHN0YXRlbWVudHMuCi0KLUBjaW5kZXggc3ltYm9sIG5hbWVzLCBAc2FtcHskfSBpbgotQGNpbmRleCBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXMKLVNpbmNlIEBzYW1weyR9IGhhcyBubyBzcGVjaWFsIG1lYW5pbmcsIHlvdSBtYXkgdXNlIGl0IGluIHN5bWJvbCBuYW1lcy4KLQotQG5vZGUgU0gtUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLQotQGNpbmRleCBTSCByZWdpc3RlcnMKLUBjaW5kZXggcmVnaXN0ZXJzLCBTSAotWW91IGNhbiB1c2UgdGhlIHByZWRlZmluZWQgc3ltYm9scyBAc2FtcHtyMH0sIEBzYW1we3IxfSwgQHNhbXB7cjJ9LAotQHNhbXB7cjN9LCBAc2FtcHtyNH0sIEBzYW1we3I1fSwgQHNhbXB7cjZ9LCBAc2FtcHtyN30sIEBzYW1we3I4fSwKLUBzYW1we3I5fSwgQHNhbXB7cjEwfSwgQHNhbXB7cjExfSwgQHNhbXB7cjEyfSwgQHNhbXB7cjEzfSwgQHNhbXB7cjE0fSwKLWFuZCBAc2FtcHtyMTV9IHRvIHJlZmVyIHRvIHRoZSBTSCByZWdpc3RlcnMuCi0KLVRoZSBTSCBhbHNvIGhhcyB0aGVzZSBjb250cm9sIHJlZ2lzdGVyczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBwcgotcHJvY2VkdXJlIHJlZ2lzdGVyIChob2xkcyByZXR1cm4gYWRkcmVzcykKLQotQGl0ZW0gcGMKLXByb2dyYW0gY291bnRlcgotCi1AaXRlbSBtYWNoCi1AaXRlbXggbWFjbAotaGlnaCBhbmQgbG93IG11bHRpcGx5IGFjY3VtdWxhdG9yIHJlZ2lzdGVycwotCi1AaXRlbSBzcgotc3RhdHVzIHJlZ2lzdGVyCi0KLUBpdGVtIGdicgotZ2xvYmFsIGJhc2UgcmVnaXN0ZXIKLQotQGl0ZW0gdmJyCi12ZWN0b3IgYmFzZSByZWdpc3RlciAoZm9yIGludGVycnVwdCB2ZWN0b3JzKQotQGVuZCB0YWJsZQotCi1Abm9kZSBTSC1BZGRyZXNzaW5nCi1Ac3Vic2VjdGlvbiBBZGRyZXNzaW5nIE1vZGVzCi0KLUBjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgU0gKLUBjaW5kZXggU0ggYWRkcmVzc2luZyBtb2RlcwotQGNvZGV7QHZhbHVle0FTfX0gdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBhZGRyZXNzaW5nIG1vZGVzIGZvciB0aGUgU0guCi1AY29kZXtSQHZhcntufX0gaW4gdGhlIGZvbGxvd2luZyByZWZlcnMgdG8gYW55IG9mIHRoZSBudW1iZXJlZAotcmVnaXN0ZXJzLCBidXQgQGVtcGh7bm90fSB0aGUgY29udHJvbCByZWdpc3RlcnMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gUkB2YXJ7bn0KLVJlZ2lzdGVyIGRpcmVjdAotCi1AaXRlbSBAQFJAdmFye259Ci1SZWdpc3RlciBpbmRpcmVjdAotCi1AaXRlbSBAQC1SQHZhcntufQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwcmUtZGVjcmVtZW50Ci0KLUBpdGVtIEBAUkB2YXJ7bn0rCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3QtaW5jcmVtZW50Ci0KLUBpdGVtIEBAKEB2YXJ7ZGlzcH0sIFJAdmFye259KQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBkaXNwbGFjZW1lbnQKLQotQGl0ZW0gQEAoUjAsIFJAdmFye259KQotUmVnaXN0ZXIgaW5kZXhlZAotCi1AaXRlbSBAQChAdmFye2Rpc3B9LCBHQlIpCi1AY29kZXtHQlJ9IG9mZnNldAotCi1AaXRlbSBAQChSMCwgR0JSKQotR0JSIGluZGV4ZWQKLQotQGl0ZW0gQHZhcnthZGRyfQotQGl0ZW14IEBAKEB2YXJ7ZGlzcH0sIFBDKQotUEMgcmVsYXRpdmUgYWRkcmVzcyAoZm9yIGJyYW5jaCBvciBmb3IgYWRkcmVzc2luZyBtZW1vcnkpLiAgVGhlCi1AY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgeW91IHRvIHVzZSB0aGUgc2ltcGxlciBmb3JtCi1AdmFye2FkZHJ9IGFueXdoZXJlIGEgUEMgcmVsYXRpdmUgYWRkcmVzcyBpcyBjYWxsZWQgZm9yOyB0aGUgYWx0ZXJuYXRlCi1mb3JtIGlzIHN1cHBvcnRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGFzc2VtYmxlcnMuCi0KLUBpdGVtICNAdmFye2ltbX0KLUltbWVkaWF0ZSBkYXRhCi1AZW5kIHRhYmxlCi0KLUBub2RlIFNIIEZsb2F0aW5nIFBvaW50Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBTSCAoQHNje2llZWV9KQotQGNpbmRleCBTSCBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQotVGhlIFNIIGZhbWlseSBoYXMgbm8gaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQsIGJ1dCB0aGUgQGNvZGV7LmZsb2F0fQotZGlyZWN0aXZlIGdlbmVyYXRlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBmb3IgY29tcGF0aWJpbGl0eQotd2l0aCBvdGhlciBkZXZlbG9wbWVudCB0b29scy4KLQotQG5vZGUgU0ggRGlyZWN0aXZlcwotQHNlY3Rpb24gU0ggTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggU0ggbWFjaGluZSBkaXJlY3RpdmVzCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgU0gKLUBjaW5kZXggQGNvZGV7dWF3b3JkfSBkaXJlY3RpdmUsIFNICi1AY2luZGV4IEBjb2Rle3VhbG9uZ30gZGlyZWN0aXZlLCBTSAotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHVhd29yZAotQGl0ZW14IHVhbG9uZwotQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBpc3N1ZSBhIHdhcm5pbmcgd2hlbiBhIG1pc2FsaWduZWQgQGNvZGV7LndvcmR9IG9yCi1AY29kZXsubG9uZ30gZGlyZWN0aXZlIGlzIHVzZWQuICBZb3UgbWF5IHVzZSBAY29kZXsudWF3b3JkfSBvcgotQGNvZGV7LnVhbG9uZ30gdG8gaW5kaWNhdGUgdGhhdCB0aGUgdmFsdWUgaXMgaW50ZW50aW9uYWxseSBtaXNhbGlnbmVkLgotQGVuZCB0YWJsZQotCi1Abm9kZSBTSCBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi0KLUBjaW5kZXggU0ggb3Bjb2RlIHN1bW1hcnkKLUBjaW5kZXggb3Bjb2RlIHN1bW1hcnksIFNICi1AY2luZGV4IG1uZW1vbmljcywgU0gKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gc3VtbWFyeSwgU0gKLUZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgU0ggbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7U0gtTWljcm9jb21wdXRlciBVc2VyJ3MgTWFudWFsfSAoSGl0YWNoaSBNaWNybyBTeXN0ZW1zLCBJbmMuKS4KLQotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIFNIIG9wY29kZXMuICBObyBhZGRpdGlvbmFsCi1wc2V1ZG8taW5zdHJ1Y3Rpb25zIGFyZSBuZWVkZWQgb24gdGhpcyBmYW1pbHkuICBOb3RlLCBob3dldmVyLCB0aGF0Ci1iZWNhdXNlIEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIGEgc2ltcGxlciBmb3JtIG9mIFBDLXJlbGF0aXZlCi1hZGRyZXNzaW5nLCB5b3UgbWF5IHNpbXBseSB3cml0ZSAoZm9yIGV4YW1wbGUpCi0KLUBleGFtcGxlCi1tb3YubCAgYmFyLHIwCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aGVyZSBvdGhlciBhc3NlbWJsZXJzIG1pZ2h0IHJlcXVpcmUgYW4gZXhwbGljaXQgZGlzcGxhY2VtZW50IHRvCi1AY29kZXtiYXJ9IGZyb20gdGhlIHByb2dyYW0gY291bnRlcjoKLQotQGV4YW1wbGUKLW1vdi5sICBAQChAdmFye2Rpc3B9LCBQQykKLUBlbmQgZXhhbXBsZQotCi1AaWZzZXQgU01BTEwKLUBjIHRoaXMgdGFibGUsIGR1ZSB0byB0aGUgbXVsdGktY29sIGZha2luZyBhbmQgaGFyZGNvZGVkIG9yZGVyLCBsb29rcyBzaWxseQotQGMgZXhjZXB0IGluIHNtYWxsYm9vay4gIFNlZSBjb21tZW50cyBiZWxvdyAiQHNldCBTTUFMTCIgbmVhciB0b3Agb2YgdGhpcyBmaWxlLgotCi1IZXJlIGlzIGEgc3VtbWFyeSBvZiBTSCBvcGNvZGVzOgotCi1AcGFnZQotQHNtYWxsZXhhbXBsZQotQGl7TGVnZW5kOn0KLVJuICAgICAgICBAcnthIG51bWJlcmVkIHJlZ2lzdGVyfQotUm0gICAgICAgIEBye2Fub3RoZXIgbnVtYmVyZWQgcmVnaXN0ZXJ9Ci0jaW1tICAgICAgQHJ7aW1tZWRpYXRlIGRhdGF9Ci1kaXNwICAgICAgQHJ7ZGlzcGxhY2VtZW50fQotZGlzcDggICAgIEByezgtYml0IGRpc3BsYWNlbWVudH0KLWRpc3AxMiAgICBAcnsxMi1iaXQgZGlzcGxhY2VtZW50fQotCi1hZGQgI2ltbSxSbiAgICAgICAgICAgICAgICAgICAgbGRzLmwgQEBSbissUFIgICAgICAgICAgICAgIAotYWRkIFJtLFJuICAgICAgICAgICAgICAgICAgICAgIG1hYy53IEBAUm0rLEBAUm4rICAgICAgICAgICAKLWFkZGMgUm0sUm4gICAgICAgICAgICAgICAgICAgICBtb3YgI2ltbSxSbiAgICAgICAgICAgICAgICAgCi1hZGR2IFJtLFJuICAgICAgICAgICAgICAgICAgICAgbW92IFJtLFJuICAgICAgICAgICAgICAgICAgIAotYW5kICNpbW0sUjAgICAgICAgICAgICAgICAgICAgIG1vdi5iIFJtLEBAKFIwLFJuKSAgICAgICAgICAKLWFuZCBSbSxSbiAgICAgICAgICAgICAgICAgICAgICBtb3YuYiBSbSxAQC1SbiAgICAgICAgICAgICAgCi1hbmQuYiAjaW1tLEBAKFIwLEdCUikgICAgICAgICAgIG1vdi5iIFJtLEBAUm4gICAgICAgICAgICAgICAKLWJmIGRpc3A4ICAgICAgICAgICAgICAgICAgICAgICBtb3YuYiBAQChkaXNwLFJtKSxSMCAgICAgICAgCi1icmEgZGlzcDEyICAgICAgICAgICAgICAgICAgICAgbW92LmIgQEAoZGlzcCxHQlIpLFIwICAgICAgIAotYnNyIGRpc3AxMiAgICAgICAgICAgICAgICAgICAgIG1vdi5iIEBAKFIwLFJtKSxSbiAgICAgICAgICAKLWJ0IGRpc3A4ICAgICAgICAgICAgICAgICAgICAgICBtb3YuYiBAQFJtKyxSbiAgICAgICAgICAgICAgCi1jbHJtYWMgICAgICAgICAgICAgICAgICAgICAgICAgbW92LmIgQEBSbSxSbiAgICAgICAgICAgICAgIAotY2xydCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdi5iIFIwLEBAKGRpc3AsUm0pICAgICAgICAKLWNtcC9lcSAjaW1tLFIwICAgICAgICAgICAgICAgICBtb3YuYiBSMCxAQChkaXNwLEdCUikgICAgICAgCi1jbXAvZXEgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LmwgUm0sQEAoZGlzcCxSbikgICAgICAgIAotY21wL2dlIFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi5sIFJtLEBAKFIwLFJuKSAgICAgICAgICAKLWNtcC9ndCBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YubCBSbSxAQC1SbiAgICAgICAgICAgICAgCi1jbXAvaGkgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LmwgUm0sQEBSbiAgICAgICAgICAgICAgIAotY21wL2hzIFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi5sIEBAKGRpc3AsUm4pLFJtICAgICAgICAKLWNtcC9wbCBSbiAgICAgICAgICAgICAgICAgICAgICBtb3YubCBAQChkaXNwLEdCUiksUjAgICAgICAgCi1jbXAvcHogUm4gICAgICAgICAgICAgICAgICAgICAgbW92LmwgQEAoZGlzcCxQQyksUm4gICAgICAgIAotY21wL3N0ciBSbSxSbiAgICAgICAgICAgICAgICAgIG1vdi5sIEBAKFIwLFJtKSxSbiAgICAgICAgICAKLWRpdjBzIFJtLFJuICAgICAgICAgICAgICAgICAgICBtb3YubCBAQFJtKyxSbiAgICAgICAgICAgICAgCi1kaXYwdSAgICAgICAgICAgICAgICAgICAgICAgICAgbW92LmwgQEBSbSxSbiAgICAgICAgICAgICAgIAotZGl2MSBSbSxSbiAgICAgICAgICAgICAgICAgICAgIG1vdi5sIFIwLEBAKGRpc3AsR0JSKSAgICAgICAKLWV4dHMuYiBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YudyBSbSxAQChSMCxSbikgICAgICAgICAgCi1leHRzLncgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LncgUm0sQEAtUm4gICAgICAgICAgICAgIAotZXh0dS5iIFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi53IFJtLEBAUm4gICAgICAgICAgICAgICAKLWV4dHUudyBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YudyBAQChkaXNwLFJtKSxSMCAgICAgICAgCi1qbXAgQEBSbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdi53IEBAKGRpc3AsR0JSKSxSMCAgICAgICAKLWpzciBAQFJuICAgICAgICAgICAgICAgICAgICAgICAgbW92LncgQEAoZGlzcCxQQyksUm4gICAgICAgIAotbGRjIFJuLEdCUiAgICAgICAgICAgICAgICAgICAgIG1vdi53IEBAKFIwLFJtKSxSbiAgICAgICAgICAKLWxkYyBSbixTUiAgICAgICAgICAgICAgICAgICAgICBtb3YudyBAQFJtKyxSbiAgICAgICAgICAgICAgCi1sZGMgUm4sVkJSICAgICAgICAgICAgICAgICAgICAgbW92LncgQEBSbSxSbiAgICAgICAgICAgICAgIAotbGRjLmwgQEBSbissR0JSICAgICAgICAgICAgICAgICBtb3YudyBSMCxAQChkaXNwLFJtKSAgICAgICAgCi1sZGMubCBAQFJuKyxTUiAgICAgICAgICAgICAgICAgIG1vdi53IFIwLEBAKGRpc3AsR0JSKSAgICAgICAKLWxkYy5sIEBAUm4rLFZCUiAgICAgICAgICAgICAgICAgbW92YSBAQChkaXNwLFBDKSxSMCAgICAgICAgIAotbGRzIFJuLE1BQ0ggICAgICAgICAgICAgICAgICAgIG1vdnQgUm4gICAgICAgICAgICAgICAgICAgICAKLWxkcyBSbixNQUNMICAgICAgICAgICAgICAgICAgICBtdWxzIFJtLFJuICAgICAgICAgICAgICAgICAgCi1sZHMgUm4sUFIgICAgICAgICAgICAgICAgICAgICAgbXVsdSBSbSxSbiAgICAgICAgICAgICAgICAgIAotbGRzLmwgQEBSbissTUFDSCAgICAgICAgICAgICAgICBuZWcgUm0sUm4gICAgICAgICAgICAgICAgICAgCi1sZHMubCBAQFJuKyxNQUNMICAgICAgICAgICAgICAgIG5lZ2MgUm0sUm4gICAgICAgICAgICAgICAgICAKLUBwYWdlCi1ub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RjIFZCUixSbiAgICAgICAgICAgICAgICAKLW5vdCBSbSxSbiAgICAgICAgICAgICAgICAgICAgICBzdGMubCBHQlIsQEAtUm4gICAgICAgICAgIAotb3IgI2ltbSxSMCAgICAgICAgICAgICAgICAgICAgIHN0Yy5sIFNSLEBALVJuICAgICAgICAgICAgCi1vciBSbSxSbiAgICAgICAgICAgICAgICAgICAgICAgc3RjLmwgVkJSLEBALVJuICAgICAgICAgICAKLW9yLmIgI2ltbSxAQChSMCxHQlIpICAgICAgICAgICAgc3RzIE1BQ0gsUm4gICAgICAgICAgICAgICAKLXJvdGNsIFJuICAgICAgICAgICAgICAgICAgICAgICBzdHMgTUFDTCxSbiAgICAgICAgICAgICAgIAotcm90Y3IgUm4gICAgICAgICAgICAgICAgICAgICAgIHN0cyBQUixSbiAgICAgICAgICAgICAgICAgCi1yb3RsIFJuICAgICAgICAgICAgICAgICAgICAgICAgc3RzLmwgTUFDSCxAQC1SbiAgICAgICAgICAKLXJvdHIgUm4gICAgICAgICAgICAgICAgICAgICAgICBzdHMubCBNQUNMLEBALVJuICAgICAgICAgIAotcnRlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cy5sIFBSLEBALVJuICAgICAgICAgICAgCi1ydHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViIFJtLFJuICAgICAgICAgICAgICAgICAKLXNldHQgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJjIFJtLFJuICAgICAgICAgICAgICAgIAotc2hhbCBSbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnYgUm0sUm4gICAgICAgICAgICAgICAgCi1zaGFyIFJuICAgICAgICAgICAgICAgICAgICAgICAgc3dhcC5iIFJtLFJuICAgICAgICAgICAgICAKLXNobGwgUm4gICAgICAgICAgICAgICAgICAgICAgICBzd2FwLncgUm0sUm4gICAgICAgICAgICAgIAotc2hsbDE2IFJuICAgICAgICAgICAgICAgICAgICAgIHRhcy5iIEBAUm4gICAgICAgICAgICAgICAgCi1zaGxsMiBSbiAgICAgICAgICAgICAgICAgICAgICAgdHJhcGEgI2ltbSAgICAgICAgICAgICAgICAKLXNobGw4IFJuICAgICAgICAgICAgICAgICAgICAgICB0c3QgI2ltbSxSMCAgICAgICAgICAgICAgIAotc2hsciBSbiAgICAgICAgICAgICAgICAgICAgICAgIHRzdCBSbSxSbiAgICAgICAgICAgICAgICAgCi1zaGxyMTYgUm4gICAgICAgICAgICAgICAgICAgICAgdHN0LmIgI2ltbSxAQChSMCxHQlIpICAgICAKLXNobHIyIFJuICAgICAgICAgICAgICAgICAgICAgICB4b3IgI2ltbSxSMCAgICAgICAgICAgICAgIAotc2hscjggUm4gICAgICAgICAgICAgICAgICAgICAgIHhvciBSbSxSbiAgICAgICAgICAgICAgICAgCi1zbGVlcCAgICAgICAgICAgICAgICAgICAgICAgICAgeG9yLmIgI2ltbSxAQChSMCxHQlIpICAgICAKLXN0YyBHQlIsUm4gICAgICAgICAgICAgICAgICAgICB4dHJjdCBSbSxSbiAgICAgICAgICAgICAgIAotc3RjIFNSLFJuCi1AZW5kIHNtYWxsZXhhbXBsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgSGl0YWNoaS1hbGwKLUBpZmNsZWFyIEdFTkVSSUMKLUByYWlzZXNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLXNwYXJjLnRleGkgYi9nYXMvZG9jL2Mtc3BhcmMudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3MWM4Mi4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2Mtc3BhcmMudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgU3BhcmMtRGVwZW5kZW50Ci1AY2hhcHRlciBTUEFSQyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBTUEFSQyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IFNQQVJDIHN1cHBvcnQKLUBtZW51Ci0qIFNwYXJjLU9wdHM6OiAgICAgICAgICAgICAgICAgIE9wdGlvbnMKLSogU3BhcmMtQWxpZ25lZC1EYXRhOjoJCU9wdGlvbiB0byBlbmZvcmNlIGFsaWduZWQgZGF0YQotKiBTcGFyYy1GbG9hdDo6ICAgICAgICAgICAgICAgICBGbG9hdGluZyBQb2ludAotKiBTcGFyYy1EaXJlY3RpdmVzOjogICAgICAgICAgICBTcGFyYyBNYWNoaW5lIERpcmVjdGl2ZXMKLUBlbmQgbWVudQotCi1Abm9kZSBTcGFyYy1PcHRzCi1Ac2VjdGlvbiBPcHRpb25zCi0KLUBjaW5kZXggb3B0aW9ucyBmb3IgU1BBUkMKLUBjaW5kZXggU1BBUkMgb3B0aW9ucwotQGNpbmRleCBhcmNoaXRlY3R1cmVzLCBTUEFSQwotQGNpbmRleCBTUEFSQyBhcmNoaXRlY3R1cmVzCi1UaGUgU1BBUkMgY2hpcCBmYW1pbHkgaW5jbHVkZXMgc2V2ZXJhbCBzdWNjZXNzaXZlIGxldmVscywgdXNpbmcgdGhlIHNhbWUKLWNvcmUgaW5zdHJ1Y3Rpb24gc2V0LCBidXQgaW5jbHVkaW5nIGEgZmV3IGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zIGF0Ci1lYWNoIGxldmVsLiAgVGhlcmUgYXJlIGV4Y2VwdGlvbnMgdG8gdGhpcyBob3dldmVyLiAgRm9yIGRldGFpbHMgb24gd2hhdAotaW5zdHJ1Y3Rpb25zIGVhY2ggdmFyaWFudCBzdXBwb3J0cywgcGxlYXNlIHNlZSB0aGUgY2hpcCdzIGFyY2hpdGVjdHVyZQotcmVmZXJlbmNlIG1hbnVhbC4KLQotQnkgZGVmYXVsdCwgQGNvZGV7QHZhbHVle0FTfX0gYXNzdW1lcyB0aGUgY29yZSBpbnN0cnVjdGlvbiBzZXQgKFNQQVJDCi12NiksIGJ1dCBgYGJ1bXBzJycgdGhlIGFyY2hpdGVjdHVyZSBsZXZlbCBhcyBuZWVkZWQ6IGl0IHN3aXRjaGVzIHRvCi1zdWNjZXNzaXZlbHkgaGlnaGVyIGFyY2hpdGVjdHVyZXMgYXMgaXQgZW5jb3VudGVycyBpbnN0cnVjdGlvbnMgdGhhdAotb25seSBleGlzdCBpbiB0aGUgaGlnaGVyIGxldmVscy4KLQotSWYgbm90IGNvbmZpZ3VyZWQgZm9yIFNQQVJDIHY5IChAY29kZXtzcGFyYzY0LSotKn0pIEdBUyB3aWxsIG5vdCBidW1wCi1wYXNzZWQgc3BhcmNsaXRlIGJ5IGRlZmF1bHQsIGFuIG9wdGlvbiBtdXN0IGJlIHBhc3NlZCB0byBlbmFibGUgdGhlCi12OSBpbnN0cnVjdGlvbnMuCi0KLUdBUyB0cmVhdHMgc3BhcmNsaXRlIGFzIGJlaW5nIGNvbXBhdGlibGUgd2l0aCB2OCwgdW5sZXNzIGFuIGFyY2hpdGVjdHVyZQotaXMgZXhwbGljaXRseSByZXF1ZXN0ZWQuICBTUEFSQyB2OSBpcyBhbHdheXMgaW5jb21wYXRpYmxlIHdpdGggc3BhcmNsaXRlLgotCi1AYyBUaGUgb3JkZXIgaGVyZSBpcyB0aGUgc2FtZSBhcyB0aGUgb3JkZXIgb2YgZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwKLUBjIHRvIGdpdmUgdGhlIHVzZXIgYSBzZW5zZSBvZiB0aGUgb3JkZXIgb2YgdGhlICJidW1waW5nIi4KLQotQHRhYmxlIEBjb2RlCi1Aa2luZGV4IC1BdjYKLUBraW5kZXggQXY3Ci1Aa2luZGV4IC1BdjgKLUBraW5kZXggLUFzcGFyY2xldAotQGtpbmRleCAtQXNwYXJjbGl0ZQotQGtpbmRleCAtQXY5Ci1Aa2luZGV4IC1BdjlhCi1AaXRlbSAtQXY2IHwgLUF2NyB8IC1BdjggfCAtQXNwYXJjbGV0IHwgLUFzcGFyY2xpdGUKLUBpdGVteCAtQXY4cGx1cyB8IC1BdjhwbHVzYSB8IC1BdjkgfCAtQXY5YQotVXNlIG9uZSBvZiB0aGUgQHNhbXB7LUF9IG9wdGlvbnMgdG8gc2VsZWN0IG9uZSBvZiB0aGUgU1BBUkMKLWFyY2hpdGVjdHVyZXMgZXhwbGljaXRseS4gIElmIHlvdSBzZWxlY3QgYW4gYXJjaGl0ZWN0dXJlIGV4cGxpY2l0bHksCi1AY29kZXtAdmFsdWV7QVN9fSByZXBvcnRzIGEgZmF0YWwgZXJyb3IgaWYgaXQgZW5jb3VudGVycyBhbiBpbnN0cnVjdGlvbgotb3IgZmVhdHVyZSByZXF1aXJpbmcgYW4gaW5jb21wYXRpYmxlIG9yIGhpZ2hlciBsZXZlbC4KLQotQHNhbXB7LUF2OHBsdXN9IGFuZCBAc2FtcHstQXY4cGx1c2F9IHNlbGVjdCBhIDMyIGJpdCBlbnZpcm9ubWVudC4KLQotQHNhbXB7LUF2OX0gYW5kIEBzYW1wey1BdjlhfSBzZWxlY3QgYSA2NCBiaXQgZW52aXJvbm1lbnQgYW5kIGFyZSBub3QKLWF2YWlsYWJsZSB1bmxlc3MgR0FTIGlzIGV4cGxpY2l0bHkgY29uZmlndXJlZCB3aXRoIDY0IGJpdCBlbnZpcm9ubWVudAotc3VwcG9ydC4KLQotQHNhbXB7LUF2OHBsdXNhfSBhbmQgQHNhbXB7LUF2OWF9IGVuYWJsZSB0aGUgU1BBUkMgVjkgaW5zdHJ1Y3Rpb24gc2V0IHdpdGgKLVVsdHJhU1BBUkMgZXh0ZW5zaW9ucy4KLQotQGl0ZW0gLXhhcmNoPXY4cGx1cyB8IC14YXJjaD12OHBsdXNhCi1Gb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBTb2xhcmlzIHY5IGFzc2VtYmxlci4gIFRoZXNlIG9wdGlvbnMgYXJlCi1lcXVpdmFsZW50IHRvIC1BdjhwbHVzIGFuZCAtQXY4cGx1c2EsIHJlc3BlY3RpdmVseS4KLQotQGl0ZW0gLWJ1bXAKLVdhcm4gd2hlbmV2ZXIgaXQgaXMgbmVjZXNzYXJ5IHRvIHN3aXRjaCB0byBhbm90aGVyIGxldmVsLgotSWYgYW4gYXJjaGl0ZWN0dXJlIGxldmVsIGlzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLCBHQVMgd2lsbCBub3QgaXNzdWUKLXdhcm5pbmdzIHVudGlsIHRoYXQgbGV2ZWwgaXMgcmVhY2hlZCwgYW5kIHdpbGwgdGhlbiBidW1wIHRoZSBsZXZlbAotYXMgcmVxdWlyZWQgKGV4Y2VwdCBiZXR3ZWVuIGluY29tcGF0aWJsZSBsZXZlbHMpLgotCi1AaXRlbSAtMzIgfCAtNjQKLVNlbGVjdCB0aGUgd29yZCBzaXplLCBlaXRoZXIgMzIgYml0cyBvciA2NCBiaXRzLgotVGhlc2Ugb3B0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgd2l0aCB0aGUgRUxGIG9iamVjdCBmaWxlIGZvcm1hdCwKLWFuZCByZXF1aXJlIHRoYXQgdGhlIG5lY2Vzc2FyeSBCRkQgc3VwcG9ydCBoYXMgYmVlbiBpbmNsdWRlZC4KLUBlbmQgdGFibGUKLQotQG5vZGUgU3BhcmMtQWxpZ25lZC1EYXRhCi1Ac2VjdGlvbiBFbmZvcmNpbmcgYWxpZ25lZCBkYXRhCi0KLUBjaW5kZXggZGF0YSBhbGlnbm1lbnQgb24gU1BBUkMKLUBjaW5kZXggU1BBUkMgZGF0YSBhbGlnbm1lbnQKLVNQQVJDIEdBUyBub3JtYWxseSBwZXJtaXRzIGRhdGEgdG8gYmUgbWlzYWxpZ25lZC4gIEZvciBleGFtcGxlLCBpdAotcGVybWl0cyB0aGUgQGNvZGV7Lmxvbmd9IHBzZXVkby1vcCB0byBiZSB1c2VkIG9uIGEgYnl0ZSBib3VuZGFyeS4KLUhvd2V2ZXIsIHRoZSBuYXRpdmUgU3VuT1MgYW5kIFNvbGFyaXMgYXNzZW1ibGVycyBpc3N1ZSBhbiBlcnJvciB3aGVuCi10aGV5IHNlZSBtaXNhbGlnbmVkIGRhdGEuCi0KLUBraW5kZXggLS1lbmZvcmNlLWFsaWduZWQtZGF0YQotWW91IGNhbiB1c2UgdGhlIEBjb2Rley0tZW5mb3JjZS1hbGlnbmVkLWRhdGF9IG9wdGlvbiB0byBtYWtlIFNQQVJDIEdBUwotYWxzbyBpc3N1ZSBhbiBlcnJvciBhYm91dCBtaXNhbGlnbmVkIGRhdGEsIGp1c3QgYXMgdGhlIFN1bk9TIGFuZCBTb2xhcmlzCi1hc3NlbWJsZXJzIGRvLgotCi1UaGUgQGNvZGV7LS1lbmZvcmNlLWFsaWduZWQtZGF0YX0gb3B0aW9uIGlzIG5vdCB0aGUgZGVmYXVsdCBiZWNhdXNlIGdjYwotaXNzdWVzIG1pc2FsaWduZWQgZGF0YSBwc2V1ZG8tb3BzIHdoZW4gaXQgaW5pdGlhbGl6ZXMgY2VydGFpbiBwYWNrZWQKLWRhdGEgc3RydWN0dXJlcyAoc3RydWN0dXJlcyBkZWZpbmVkIHVzaW5nIHRoZSBAY29kZXtwYWNrZWR9IGF0dHJpYnV0ZSkuCi1Zb3UgbWF5IGhhdmUgdG8gYXNzZW1ibGUgd2l0aCBHQVMgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSBwYWNrZWQgZGF0YQotc3RydWN0dXJlcyBpbiB5b3VyIG93biBjb2RlLgotCi1AaWdub3JlCi1AYyBGSVhNRTogKHNwYXJjKSBGaWxsIGluICJzeW50YXgiIHNlY3Rpb24hCi1AYyBzdWJzZWN0aW9uIHN5bnRheAotSSBkb24ndCBrbm93IGFueXRoaW5nIGFib3V0IFNwYXJjIHN5bnRheC4gIFNvbWVvbmUgd2hvIGRvZXMKLXdpbGwgaGF2ZSB0byB3cml0ZSB0aGlzIHNlY3Rpb24uCi1AZW5kIGlnbm9yZQotCi1Abm9kZSBTcGFyYy1GbG9hdAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgU1BBUkMgKEBzY3tpZWVlfSkKLUBjaW5kZXggU1BBUkMgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBTcGFyYyB1c2VzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzLgotCi1Abm9kZSBTcGFyYy1EaXJlY3RpdmVzCi1Ac2VjdGlvbiBTcGFyYyBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBTUEFSQyBtYWNoaW5lIGRpcmVjdGl2ZXMKLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBTUEFSQwotVGhlIFNwYXJjIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsCi1tYWNoaW5lIGRpcmVjdGl2ZXM6Ci0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXthbGlnbn0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLmFsaWduCi1UaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgdGhlIGRlc2lyZWQgYWxpZ25tZW50IGluIGJ5dGVzLgotCi1AY2luZGV4IEBjb2Rle2NvbW1vbn0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLmNvbW1vbgotVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3ltYm9sIG5hbWUsIGEgcG9zaXRpdmUgbnVtYmVyLCBhbmQKLUBjb2RleyJic3MifS4gIFRoaXMgYmVoYXZlcyBzb21ld2hhdCBsaWtlIEBjb2Rley5jb21tfSwgYnV0IHRoZQotc3ludGF4IGlzIGRpZmZlcmVudC4KLQotQGNpbmRleCBAY29kZXtoYWxmfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAuaGFsZgotVGhpcyBpcyBmdW5jdGlvbmFsbHkgaWRlbnRpY2FsIHRvIEBjb2Rley5zaG9ydH0uCi0KLUBjaW5kZXggQGNvZGV7cHJvY30gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLnByb2MKLVRoaXMgZGlyZWN0aXZlIGlzIGlnbm9yZWQuICBBbnkgdGV4dCBmb2xsb3dpbmcgaXQgb24gdGhlIHNhbWUKLWxpbmUgaXMgYWxzbyBpZ25vcmVkLgotCi1AY2luZGV4IEBjb2Rle3Jlc2VydmV9IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC5yZXNlcnZlCi1UaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBzeW1ib2wgbmFtZSwgYSBwb3NpdGl2ZSBudW1iZXIsIGFuZAotQGNvZGV7ImJzcyJ9LiAgVGhpcyBiZWhhdmVzIHNvbWV3aGF0IGxpa2UgQGNvZGV7Lmxjb21tfSwgYnV0IHRoZQotc3ludGF4IGlzIGRpZmZlcmVudC4KLQotQGNpbmRleCBAY29kZXtzZWd9IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC5zZWcKLVRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBAY29kZXsidGV4dCJ9LCBAY29kZXsiZGF0YSJ9LCBvcgotQGNvZGV7ImRhdGExIn0uICBJdCBiZWhhdmVzIGxpa2UgQGNvZGV7LnRleHR9LCBAY29kZXsuZGF0YX0sIG9yCi1AY29kZXsuZGF0YSAxfS4KLQotQGNpbmRleCBAY29kZXtza2lwfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAuc2tpcAotVGhpcyBpcyBmdW5jdGlvbmFsbHkgaWRlbnRpY2FsIHRvIHRoZSBAY29kZXsuc3BhY2V9IGRpcmVjdGl2ZS4KLQotQGNpbmRleCBAY29kZXt3b3JkfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAud29yZAotT24gdGhlIFNwYXJjLCB0aGUgQGNvZGV7LndvcmR9IGRpcmVjdGl2ZSBwcm9kdWNlcyAzMiBiaXQgdmFsdWVzLAotaW5zdGVhZCBvZiB0aGUgMTYgYml0IHZhbHVlcyBpdCBwcm9kdWNlcyBvbiBtYW55IG90aGVyIG1hY2hpbmVzLgotCi1AY2luZGV4IEBjb2Rle3h3b3JkfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAueHdvcmQKLU9uIHRoZSBTcGFyYyBWOSBwcm9jZXNzb3IsIHRoZSBAY29kZXsueHdvcmR9IGRpcmVjdGl2ZSBwcm9kdWNlcwotNjQgYml0IHZhbHVlcy4KLUBlbmQgdGFibGUKLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLXY4NTAudGV4aSBiL2dhcy9kb2MvYy12ODUwLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MTZlMGYuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLXY4NTAudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLQotQG5vZGUgVjg1MC1EZXBlbmRlbnQKLUBjaGFwdGVyIHY4NTAgRGVwZW5kZW50IEZlYXR1cmVzCi0KLUBjaW5kZXggVjg1MCBzdXBwb3J0Ci1AbWVudQotKiBWODUwIE9wdGlvbnM6OiAgICAgICAgICAgICAgT3B0aW9ucwotKiBWODUwIFN5bnRheDo6ICAgICAgICAgICAgICAgU3ludGF4Ci0qIFY4NTAgRmxvYXRpbmcgUG9pbnQ6OiAgICAgICBGbG9hdGluZyBQb2ludAotKiBWODUwIERpcmVjdGl2ZXM6OiAgICAgICAgICAgVjg1MCBNYWNoaW5lIERpcmVjdGl2ZXMKLSogVjg1MCBPcGNvZGVzOjogICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBWODUwIE9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLUBjaW5kZXggVjg1MCBvcHRpb25zIChub25lKQotQGNpbmRleCBvcHRpb25zIGZvciBWODUwIChub25lKQotQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zCi1mb3IgdGhlIFY4NTAgcHJvY2Vzc29yIGZhbWlseToKLQotQGNpbmRleCBjb21tYW5kIGxpbmUgb3B0aW9ucywgVjg1MAotQGNpbmRleCBWODUwIGNvbW1hbmQgbGluZSBvcHRpb25zCi1AdGFibGUgQGNvZGUKLQotQGNpbmRleCBAY29kZXstd3NpZ25lZF9vdmVyZmxvd30gY29tbWFuZCBsaW5lIG9wdGlvbiwgVjg1MAotQGl0ZW0gLXdzaWduZWRfb3ZlcmZsb3cKLUNhdXNlcyB3YXJuaW5ncyB0byBiZSBwcm9kdWNlZCB3aGVuIHNpZ25lZCBpbW1lZGlhdGUgdmFsdWVzIG92ZXJmbG93IHRoZQotc3BhY2UgYXZhaWxhYmxlIGZvciB0aGVuIHdpdGhpbiB0aGVpciBvcGNvZGVzLiAgQnkgZGVmYXVsdCB0aGlzIG9wdGlvbgotaXMgZGlzYWJsZWQgYXMgaXQgaXMgcG9zc2libGUgdG8gcmVjZWl2ZSBzcHVyaW91cyB3YXJuaW5ncyBkdWUgdG8gdXNpbmcKLWV4YWN0IGJpdCBwYXR0ZXJucyBhcyBpbW1lZGlhdGUgY29uc3RhbnRzLgotCi1AY2luZGV4IEBjb2Rley13dW5zaWduZWRfb3ZlcmZsb3d9IGNvbW1hbmQgbGluZSBvcHRpb24sIFY4NTAKLUBpdGVtIC13dW5zaWduZWRfb3ZlcmZsb3cKLUNhdXNlcyB3YXJuaW5ncyB0byBiZSBwcm9kdWNlZCB3aGVuIHVuc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZXMgb3ZlcmZsb3cKLXRoZSBzcGFjZSBhdmFpbGFibGUgZm9yIHRoZW4gd2l0aGluIHRoZWlyIG9wY29kZXMuICBCeSBkZWZhdWx0IHRoaXMKLW9wdGlvbiBpcyBkaXNhYmxlZCBhcyBpdCBpcyBwb3NzaWJsZSB0byByZWNlaXZlIHNwdXJpb3VzIHdhcm5pbmdzIGR1ZSB0bwotdXNpbmcgZXhhY3QgYml0IHBhdHRlcm5zIGFzIGltbWVkaWF0ZSBjb25zdGFudHMuCi0KLUBjaW5kZXggQGNvZGV7LW12ODUwfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBWODUwCi1AaXRlbSAtbXY4NTAKLVNwZWNpZmllcyB0aGF0IHRoZSBhc3NlbWJsZWQgY29kZSBzaG91bGQgYmUgbWFya2VkIGFzIGJlaW5nIHRhcmdldGVkIGF0Ci10aGUgVjg1MCBwcm9jZXNzb3IuICBUaGlzIGFsbG93cyB0aGUgbGlua2VyIHRvIGRldGVjdCBhdHRlbXB0cyB0byBsaW5rCi1zdWNoIGNvZGUgd2l0aCBjb2RlIGFzc2VtYmxlZCBmb3Igb3RoZXIgcHJvY2Vzc29ycy4KLQotQGNpbmRleCBAY29kZXstbXY4NTBlfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBWODUwCi1AaXRlbSAtbXY4NTBlCi1TcGVjaWZpZXMgdGhhdCB0aGUgYXNzZW1ibGVkIGNvZGUgc2hvdWxkIGJlIG1hcmtlZCBhcyBiZWluZyB0YXJnZXRlZCBhdAotdGhlIFY4NTBFIHByb2Nlc3Nvci4gIFRoaXMgYWxsb3dzIHRoZSBsaW5rZXIgdG8gZGV0ZWN0IGF0dGVtcHRzIHRvIGxpbmsKLXN1Y2ggY29kZSB3aXRoIGNvZGUgYXNzZW1ibGVkIGZvciBvdGhlciBwcm9jZXNzb3JzLgotCi1AY2luZGV4IEBjb2Rley1tdjg1MGFueX0gY29tbWFuZCBsaW5lIG9wdGlvbiwgVjg1MAotQGl0ZW0gLW12ODUwYW55Ci1TcGVjaWZpZXMgdGhhdCB0aGUgYXNzZW1ibGVkIGNvZGUgc2hvdWxkIGJlIG1hcmtlZCBhcyBiZWluZyB0YXJnZXRlZCBhdAotdGhlIFY4NTAgcHJvY2Vzc29yIGJ1dCBzdXBwb3J0IGluc3RydWN0aW9ucyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUKLWV4dGVuZGVkIHZhcmlhbnRzIG9mIHRoZSBwcm9jZXNzLiAgVGhpcyBhbGxvd3MgdGhlIHByb2R1Y3Rpb24gb2YKLWJpbmFyaWVzIHRoYXQgY29udGFpbiB0YXJnZXQgc3BlY2lmaWMgY29kZSwgYnV0IHdoaWNoIGFyZSBhbHNvIGludGVuZGVkCi10byBiZSB1c2VkIGluIGEgZ2VuZXJpYyBmYXNoaW9uLiAgRm9yIGV4YW1wbGUgbGliZ2NjLmEgY29udGFpbnMgZ2VuZXJpYwotcm91dGluZXMgdXNlZCBieSB0aGUgY29kZSBwcm9kdWNlZCBieSBHQ0MgZm9yIGFsbCB2ZXJzaW9ucyBvZiB0aGUgdjg1MAotYXJjaGl0ZWN0dXJlLCB0b2dldGhlciB3aXRoIHN1cHBvcnQgcm91dGluZXMgb25seSB1c2VkIGJ5IHRoZSBWODUwRQotYXJjaGl0ZWN0dXJlLgotCi1AZW5kIHRhYmxlCi0KLQotQG5vZGUgVjg1MCBTeW50YXgKLUBzZWN0aW9uIFN5bnRheAotQG1lbnUKLSogVjg1MC1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycwotKiBWODUwLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLUBlbmQgbWVudQotCi1Abm9kZSBWODUwLUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLQotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBWODUwCi1AY2luZGV4IFY4NTAgbGluZSBjb21tZW50IGNoYXJhY3RlcgotQHNhbXB7I30gaXMgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIuCi1Abm9kZSBWODUwLVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi0KLUBjaW5kZXggVjg1MCByZWdpc3RlciBuYW1lcwotQGNpbmRleCByZWdpc3RlciBuYW1lcywgVjg1MAotQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBuYW1lcyBmb3IgcmVnaXN0ZXJzOgotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle3plcm99IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDAKLXIwLCB6ZXJvCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDEKLXIxCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDIKLXIyLCBocAotQGNpbmRleCBAY29kZXtzcH0gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMwotcjMsIHNwCi1AY2luZGV4IEBjb2Rle2dwfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciA0Ci1yNCwgZ3AKLUBjaW5kZXggQGNvZGV7dHB9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDUKLXI1LCB0cAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciA2Ci1yNgotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciA3Ci1yNwotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciA4Ci1yOAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciA5Ci1yOQotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxMAotcjEwCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDExCi1yMTEKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTIKLXIxMgotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxMwotcjEzCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDE0Ci1yMTQKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTUKLXIxNQotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxNgotcjE2Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDE3Ci1yMTcKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTgKLXIxOAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxOQotcjE5Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDIwCi1yMjAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjEKLXIyMQotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyMgotcjIyCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDIzCi1yMjMKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjQKLXIyNAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyNQotcjI1Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDI2Ci1yMjYKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjcKLXIyNwotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyOAotcjI4Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDI5Ci1yMjkKLUBjaW5kZXggQGNvZGV7ZXB9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDMwCi1yMzAsIGVwCi1AY2luZGV4IEBjb2Rle2xwfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAzMQotcjMxLCBscAotQGNpbmRleCBAY29kZXtlaXBjfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gc3lzdGVtIHJlZ2lzdGVyIDAKLWVpcGMKLUBjaW5kZXggQGNvZGV7ZWlwc3d9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMQotZWlwc3cKLUBjaW5kZXggQGNvZGV7ZmVwY30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAyCi1mZXBjCi1AY2luZGV4IEBjb2Rle2ZlcHN3fSByZWdpc3RlciwgVjg1MAotQGl0ZW0gc3lzdGVtIHJlZ2lzdGVyIDMKLWZlcHN3Ci1AY2luZGV4IEBjb2Rle2Vjcn0gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciA0Ci1lY3IKLUBjaW5kZXggQGNvZGV7cHN3fSByZWdpc3RlciwgVjg1MAotQGl0ZW0gc3lzdGVtIHJlZ2lzdGVyIDUKLXBzdwotQGNpbmRleCBAY29kZXtjdHBjfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gc3lzdGVtIHJlZ2lzdGVyIDE2Ci1jdHBjCi1AY2luZGV4IEBjb2Rle2N0cHN3fSByZWdpc3RlciwgVjg1MAotQGl0ZW0gc3lzdGVtIHJlZ2lzdGVyIDE3Ci1jdHBzdwotQGNpbmRleCBAY29kZXtkYnBjfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gc3lzdGVtIHJlZ2lzdGVyIDE4Ci1kYnBjCi1AY2luZGV4IEBjb2Rle2RicHN3fSByZWdpc3RlciwgVjg1MAotQGl0ZW0gc3lzdGVtIHJlZ2lzdGVyIDE5Ci1kYnBzdwotQGNpbmRleCBAY29kZXtjdGJwfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gc3lzdGVtIHJlZ2lzdGVyIDIwCi1jdGJwCi1AZW5kIHRhYmxlCi0KLUBub2RlIFY4NTAgRmxvYXRpbmcgUG9pbnQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIFY4NTAgKEBzY3tpZWVlfSkKLUBjaW5kZXggVjg1MCBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQotVGhlIFY4NTAgZmFtaWx5IHVzZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCi0KLUBub2RlIFY4NTAgRGlyZWN0aXZlcwotQHNlY3Rpb24gVjg1MCBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIFY4NTAKLUBjaW5kZXggVjg1MCBtYWNoaW5lIGRpcmVjdGl2ZXMKLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtvZmZzZXR9IGRpcmVjdGl2ZSwgVjg1MAotQGl0ZW0gLm9mZnNldCBAdmFyezxleHByZXNzaW9uPn0KLU1vdmVzIHRoZSBvZmZzZXQgaW50byB0aGUgY3VycmVudCBzZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgYW1vdW50LiAKLQotQGNpbmRleCBAY29kZXtzZWN0aW9ufSBkaXJlY3RpdmUsIFY4NTAKLUBpdGVtIC5zZWN0aW9uICJuYW1lIiwgPHR5cGU+Ci1UaGlzIGlzIGFuIGV4dGVuc2lvbiB0byB0aGUgc3RhbmRhcmQgLnNlY3Rpb24gZGlyZWN0aXZlLiAgSXQgc2V0cyB0aGUKLWN1cnJlbnQgc2VjdGlvbiB0byBiZSA8dHlwZT4gYW5kIGNyZWF0ZXMgYW4gYWxpYXMgZm9yIHRoaXMgc2VjdGlvbgotY2FsbGVkICJuYW1lIi4gCi0KLUBjaW5kZXggQGNvZGV7LnY4NTB9IGRpcmVjdGl2ZSwgVjg1MAotQGl0ZW0gLnY4NTAKLVNwZWNpZmllcyB0aGF0IHRoZSBhc3NlbWJsZWQgY29kZSBzaG91bGQgYmUgbWFya2VkIGFzIGJlaW5nIHRhcmdldGVkIGF0Ci10aGUgVjg1MCBwcm9jZXNzb3IuICBUaGlzIGFsbG93cyB0aGUgbGlua2VyIHRvIGRldGVjdCBhdHRlbXB0cyB0byBsaW5rCi1zdWNoIGNvZGUgd2l0aCBjb2RlIGFzc2VtYmxlZCBmb3Igb3RoZXIgcHJvY2Vzc29ycy4KLQotQGNpbmRleCBAY29kZXsudjg1MGV9IGRpcmVjdGl2ZSwgVjg1MAotQGl0ZW0gLnY4NTBlCi1TcGVjaWZpZXMgdGhhdCB0aGUgYXNzZW1ibGVkIGNvZGUgc2hvdWxkIGJlIG1hcmtlZCBhcyBiZWluZyB0YXJnZXRlZCBhdAotdGhlIFY4NTBFIHByb2Nlc3Nvci4gIFRoaXMgYWxsb3dzIHRoZSBsaW5rZXIgdG8gZGV0ZWN0IGF0dGVtcHRzIHRvIGxpbmsKLXN1Y2ggY29kZSB3aXRoIGNvZGUgYXNzZW1ibGVkIGZvciBvdGhlciBwcm9jZXNzb3JzLgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIFY4NTAgT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotCi1AY2luZGV4IFY4NTAgb3Bjb2RlcwotQGNpbmRleCBvcGNvZGVzIGZvciBWODUwCi1AY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRzIGFsbCB0aGUgc3RhbmRhcmQgVjg1MCBvcGNvZGVzLgotCi1AY29kZXtAdmFsdWV7QVN9fSBhbHNvIGltcGxlbWVudHMgdGhlIGZvbGxvd2luZyBwc2V1ZG8gb3BzOgotCi1AdGFibGUgQGNvZGUKLQotQGNpbmRleCBAY29kZXtoaTB9IHBzZXVkby1vcCwgVjg1MAotQGl0ZW0gaGkwKCkKLUNvbXB1dGVzIHRoZSBoaWdoZXIgMTYgYml0cyBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhbmQgc3RvcmVzIGl0IGludG8KLXRoZSBpbW1lZGlhdGUgb3BlcmFuZCBmaWVsZCBvZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZToKLQotICAgIEBzYW1we211bGhpIGhpMChoZXJlIC0gdGhlcmUpLCByNSwgcjZ9Ci0KLWNvbXB1dGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFkZHJlc3Mgb2YgbGFiZWxzICdoZXJlJyBhbmQKLSd0aGVyZScsIHRha2VzIHRoZSB1cHBlciAxNiBiaXRzIG9mIHRoaXMgZGlmZmVyZW5jZSwgc2hpZnRzIGl0IGRvd24gMTYKLWJpdHMgYW5kIHRoZW4gbXV0bGlwbGllcyBpdCBieSB0aGUgbG93ZXIgMTYgYml0cyBpbiByZWdpc3RlciA1LCBwdXR0aW5nCi10aGUgcmVzdWx0IGludG8gcmVnaXN0ZXIgNi4gCi0KLUBjaW5kZXggQGNvZGV7bG99IHBzZXVkby1vcCwgVjg1MAotQGl0ZW0gbG8oKQotQ29tcHV0ZXMgdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24gYW5kIHN0b3JlcyBpdCBpbnRvCi10aGUgaW1tZWRpYXRlIG9wZXJhbmQgZmllbGQgb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGU6Ci0KLSAgICBAc2FtcHthZGRpIGxvKGhlcmUgLSB0aGVyZSksIHI1LCByNn0KLQotY29tcHV0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWRkcmVzcyBvZiBsYWJlbHMgJ2hlcmUnIGFuZAotJ3RoZXJlJywgdGFrZXMgdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhpcyBkaWZmZXJlbmNlIGFuZCBhZGRzIGl0IHRvCi1yZWdpc3RlciA1LCBwdXR0aW5nIHRoZSByZXN1bHQgaW50byByZWdpc3RlciA2LgotCi1AY2luZGV4IEBjb2Rle2hpfSBwc2V1ZG8tb3AsIFY4NTAKLUBpdGVtIGhpKCkKLUNvbXB1dGVzIHRoZSBoaWdoZXIgMTYgYml0cyBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhbmQgdGhlbiBhZGRzIHRoZQotdmFsdWUgb2YgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBsb3dlciAxNiBiaXRzIG9mIHRoZSBleHByZXNzaW9uCi1hbmQgc3RvcmVzIHRoZSByZXN1bHQgaW50byB0aGUgaW1tZWRpYXRlIG9wZXJhbmQgZmllbGQgb2YgdGhlIGdpdmVuCi1pbnN0cnVjdGlvbi4gIEZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcgY29kZSBjYW4gYmUgdXNlZCB0byBjb21wdXRlIHRoZQotYWRkcmVzcyBvZiB0aGUgbGFiZWwgJ2hlcmUnIGFuZCBzdG9yZSBpdCBpbnRvIHJlZ2lzdGVyIDY6Ci0KLSAgICBAc2FtcHttb3ZoaSBoaShoZXJlKSwgcjAsIHI2fQotICAgIEBzYW1we21vdmVhIGxvKGhlcmUpLCByNiwgcjZ9Ci0KLVRoZSByZWFzb24gZm9yIHRoaXMgc3BlY2lhbCBiZWhhdmlvdXIgaXMgdGhhdCBtb3ZlYSBwZXJmb3JtcyBhIHNpZ24KLWV4dGVudGlvbiBvbiBpdHMgaW1tZWRpYXRlIG9wZXJhbmQuICBTbyBmb3IgZXhhbXBsZSBpZiB0aGUgYWRkcmVzcyBvZgotJ2hlcmUnIHdhcyAweEZGRkZGRkZGIHRoZW4gd2l0aG91dCB0aGUgc3BlY2lhbCBiZWhhdmlvdXIgb2YgdGhlIGhpKCkKLXBzZXVkby1vcCB0aGUgbW92aGkgaW5zdHJ1Y3Rpb24gd291bGQgcHV0IDB4RkZGRjAwMDAgaW50byByNiwgdGhlbiB0aGUKLW1vdmVhIGluc3RydWN0aW9uIHdvdWxkIHRha2VzIGl0cyBpbW1lZGlhdGUgb3BlcmFuZCwgMHhGRkZGLCBzaWduIGV4dGVuZAotaXQgdG8gMzIgYml0cywgMHhGRkZGRkZGRiwgYW5kIHRoZW4gYWRkIGl0IGludG8gcjYgZ2l2aW5nIDB4RkZGRUZGRkYKLXdoaWNoIGlzIHdyb25nICh0aGUgZmlmdGggbmliYmxlIGlzIEUpLiAgV2l0aCB0aGUgaGkoKSBwc2V1ZG8gb3AgYWRkaW5nCi1pbiB0aGUgdG9wIGJpdCBvZiB0aGUgbG8oKSBwc2V1ZG8gb3AsIHRoZSBtb3ZoaSBpbnN0cnVjdGlvbiBhY3R1YWxseQotc3RvcmVzIDAgaW50byByNiAoMHhGRkZGICsgMSA9IDB4MDAwMCksIHNvIHRoYXQgdGhlIG1vdmVhIGluc3RydWN0aW9uCi1zdG9yZXMgMHhGRkZGRkZGRiBpbnRvIHI2IC0gdGhlIHJpZ2h0IHZhbHVlLgotCi1AY2luZGV4IEBjb2Rle2hpbG99IHBzZXVkby1vcCwgVjg1MAotQGl0ZW0gaGlsbygpCi1Db21wdXRlcyB0aGUgMzIgYml0IHZhbHVlIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uIGFuZCBzdG9yZXMgaXQgaW50bwotdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGZpZWxkIG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiAod2hpY2ggbXVzdCBiZSBhCi1tb3YgaW5zdHJ1Y3Rpb24pLiAgRm9yIGV4YW1wbGU6Ci0KLSAgICBAc2FtcHttb3YgaGlsbyhoZXJlKSwgcjZ9Ci0KLWNvbXB1dGVzIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIG9mIGxhYmVsICdoZXJlJyBhbmQgcHV0cyB0aGUgcmVzdWx0IGludG8KLXJlZ2lzdGVyIDYuICAKLQotQGNpbmRleCBAY29kZXtzZGFvZmZ9IHBzZXVkby1vcCwgVjg1MAotQGl0ZW0gc2Rhb2ZmKCkKLUNvbXB1dGVzIHRoZSBvZmZzZXQgb2YgdGhlIG5hbWVkIHZhcmlhYmxlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBTbWFsbAotRGF0YSBBcmVhICh3aG9lcyBhZGRyZXNzIGlzIGhlbGQgaW4gcmVnaXN0ZXIgNCwgdGhlIEdQIHJlZ2lzdGVyKSBhbmQKLXN0b3JlcyB0aGUgcmVzdWx0IGFzIGEgMTYgYml0IHNpZ25lZCB2YWx1ZSBpbiB0aGUgaW1tZWRpYXRlIG9wZXJhbmQKLWZpZWxkIG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4gIEZvciBleGFtcGxlOiAKLQotICAgICAgQHNhbXB7bGQudyBzZGFvZmYoX2FfdmFyaWFibGUpW2dwXSxyNn0KLQotbG9hZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSBsYWJlbCAnX2FfdmFyaWFibGUnCi1pbnRvIHJlZ2lzdGVyIDYsIHByb3ZpZGVkIHRoYXQgdGhlIGxhYmVsIGlzIGxvY2F0ZWQgc29tZXdoZXJlIHdpdGhpbiArLy0KLTMySyBvZiB0aGUgYWRkcmVzcyBoZWxkIGluIHRoZSBHUCByZWdpc3Rlci4gIFtOb3RlIHRoZSBsaW5rZXIgYXNzdW1lcwotdGhhdCB0aGUgR1AgcmVnaXN0ZXIgY29udGFpbnMgYSBmaXhlZCBhZGRyZXNzIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUKLWxhYmVsIGNhbGxlZCAnX19ncCcuICBUaGlzIGNhbiBlaXRoZXIgYmUgc2V0IHVwIGF1dG9tYXRpY2FsbHkgYnkgdGhlCi1saW5rZXIsIG9yIHNwZWNpZmljYWxseSBzZXQgYnkgdXNpbmcgdGhlIEBzYW1wey0tZGVmc3ltIF9fZ3A9PHZhbHVlPn0KLWNvbW1hbmQgbGluZSBvcHRpb25dLgotCi1AY2luZGV4IEBjb2Rle3RkYW9mZn0gcHNldWRvLW9wLCBWODUwCi1AaXRlbSB0ZGFvZmYoKQotQ29tcHV0ZXMgdGhlIG9mZnNldCBvZiB0aGUgbmFtZWQgdmFyaWFibGUgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIFRpbnkKLURhdGEgQXJlYSAod2hvZXMgYWRkcmVzcyBpcyBoZWxkIGluIHJlZ2lzdGVyIDMwLCB0aGUgRVAgcmVnaXN0ZXIpIGFuZAotc3RvcmVzIHRoZSByZXN1bHQgYXMgYSA0LDUsIDcgb3IgOCBiaXQgdW5zaWduZWQgdmFsdWUgaW4gdGhlIGltbWVkaWF0ZQotb3BlcmFuZCBmaWVsZCBvZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZToKLQotICAgICAgQHNhbXB7c2xkLncgdGRhb2ZmKF9hX3ZhcmlhYmxlKVtlcF0scjZ9Ci0KLWxvYWRzIHRoZSBjb250ZW50cyBvZiB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgbGFiZWwgJ19hX3ZhcmlhYmxlJwotaW50byByZWdpc3RlciA2LCBwcm92aWRlZCB0aGF0IHRoZSBsYWJlbCBpcyBsb2NhdGVkIHNvbWV3aGVyZSB3aXRoaW4gKzI1NgotYnl0ZXMgb2YgdGhlIGFkZHJlc3MgaGVsZCBpbiB0aGUgRVAgcmVnaXN0ZXIuICBbTm90ZSB0aGUgbGlua2VyIGFzc3VtZXMKLXRoYXQgdGhlIEVQIHJlZ2lzdGVyIGNvbnRhaW5zIGEgZml4ZWQgYWRkcmVzcyBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlCi1sYWJlbCBjYWxsZWQgJ19fZXAnLiAgVGhpcyBjYW4gZWl0aGVyIGJlIHNldCB1cCBhdXRvbWF0aWNhbGx5IGJ5IHRoZQotbGlua2VyLCBvciBzcGVjaWZpY2FsbHkgc2V0IGJ5IHVzaW5nIHRoZSBAc2FtcHstLWRlZnN5bSBfX2VwPTx2YWx1ZT59Ci1jb21tYW5kIGxpbmUgb3B0aW9uXS4KLQotQGNpbmRleCBAY29kZXt6ZGFvZmZ9IHBzZXVkby1vcCwgVjg1MAotQGl0ZW0gemRhb2ZmKCkKLUNvbXB1dGVzIHRoZSBvZmZzZXQgb2YgdGhlIG5hbWVkIHZhcmlhYmxlIGZyb20gYWRkcmVzcyAwIGFuZCBzdG9yZXMgdGhlCi1yZXN1bHQgYXMgYSAxNiBiaXQgc2lnbmVkIHZhbHVlIGluIHRoZSBpbW1lZGlhdGUgb3BlcmFuZCBmaWVsZCBvZiB0aGUKLWdpdmVuIGluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGU6Ci0KLSAgICAgIEBzYW1we21vdmVhIHpkYW9mZihfYV92YXJpYWJsZSksemVybyxyNn0KLQotcHV0cyB0aGUgYWRkcmVzcyBvZiB0aGUgbGFiZWwgJ19hX3ZhcmlhYmxlJyBpbnRvIHJlZ2lzdGVyIDYsIGFzc3VtaW5nCi10aGF0IHRoZSBsYWJlbCBpcyBzb21ld2hlcmUgd2l0aGluIHRoZSBmaXJzdCAzMksgb2YgbWVtb3J5LiAgKFN0cmljdGx5Ci1zcGVha2luZyBpdCBhbHNvIHBvc3NpYmxlIHRvIGFjY2VzcyB0aGUgbGFzdCAzMksgb2YgbWVtb3J5IGFzIHdlbGwsIGFzCi10aGUgb2Zmc2V0cyBhcmUgc2lnbmVkKS4KLQotQGNpbmRleCBAY29kZXtjdG9mZn0gcHNldWRvLW9wLCBWODUwCi1AaXRlbSBjdG9mZigpCi1Db21wdXRlcyB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lZCB2YXJpYWJsZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgQ2FsbAotVGFibGUgQXJlYSAod2hvZXMgYWRkcmVzcyBpcyBoZWxnIGluIHN5c3RlbSByZWdpc3RlciAyMCwgdGhlIENUQlAKLXJlZ2lzdGVyKSBhbmQgc3RvcmVzIHRoZSByZXN1bHQgYSA2IG9yIDE2IGJpdCB1bnNpZ25lZCB2YWx1ZSBpbiB0aGUKLWltbWVkaWF0ZSBmaWVsZCBvZiB0aGVuIGdpdmVuIGluc3RydWN0aW9uIG9yIHBpZWNlIG9mIGRhdGEuICBGb3IKLWV4YW1wbGU6Ci0KLSAgICAgQHNhbXB7Y2FsbHQgY3RvZmYodGFibGVfZnVuYzEpfQotCi13aWxsIHB1dCB0aGUgY2FsbCB0aGUgZnVuY3Rpb24gd2hvZXMgYWRkcmVzcyBpcyBoZWxkIGluIHRoZSBjYWxsIHRhYmxlCi1hdCB0aGUgbG9jYXRpb24gbGFiZWxlZCAndGFibGVfZnVuYzEnLgotCi1AZW5kIHRhYmxlCi0KLQotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBWODUwIGluc3RydWN0aW9uIHNldCwgc2VlIEBjaXRle1Y4NTAKLUZhbWlseSAzMi0vMTYtQml0IHNpbmdsZS1DaGlwIE1pY3JvY29udHJvbGxlciBBcmNoaXRlY3R1cmUgTWFudWFsfSBmcm9tIE5FQy4KLUx0ZC4KLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLXZheC50ZXhpIGIvZ2FzL2RvYy9jLXZheC50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTNkN2U1Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy12YXgudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGMgVkFYL1ZNUyBkZXNjcmlwdGlvbiBleGhhbmNlZCBhbmQgY29ycmVjdGVkIGJ5IEtsYXVzIEsiYWVtcGYsIGtrYWVtcGZAcHJvZ2lzLmRlCi1AaWZzZXQgR0VORVJJQwotQG5vZGUgVmF4LURlcGVuZGVudAotQGNoYXB0ZXIgVkFYIERlcGVuZGVudCBGZWF0dXJlcwotQGNpbmRleCBWQVggc3VwcG9ydAotCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgVkFYIERlcGVuZGVudCBGZWF0dXJlcwotQGNpbmRleCBWQVggc3VwcG9ydAotCi1AZW5kIGlmY2xlYXIKLQotQG1lbnUKLSogVkFYLU9wdHM6OiAgICAgICAgICAgICAgICAgICAgVkFYIENvbW1hbmQtTGluZSBPcHRpb25zCi0qIFZBWC1mbG9hdDo6ICAgICAgICAgICAgICAgICAgIFZBWCBGbG9hdGluZyBQb2ludAotKiBWQVgtZGlyZWN0aXZlczo6ICAgICAgICAgICAgICBWYXggTWFjaGluZSBEaXJlY3RpdmVzCi0qIFZBWC1vcGNvZGVzOjogICAgICAgICAgICAgICAgIFZBWCBPcGNvZGVzCi0qIFZBWC1icmFuY2g6OiAgICAgICAgICAgICAgICAgIFZBWCBCcmFuY2ggSW1wcm92ZW1lbnQKLSogVkFYLW9wZXJhbmRzOjogICAgICAgICAgICAgICAgVkFYIE9wZXJhbmRzCi0qIFZBWC1ubzo6ICAgICAgICAgICAgICAgICAgICAgIE5vdCBTdXBwb3J0ZWQgb24gVkFYCi1AZW5kIG1lbnUKLQotCi1Abm9kZSBWQVgtT3B0cwotQHNlY3Rpb24gVkFYIENvbW1hbmQtTGluZSBPcHRpb25zCi0KLUBjaW5kZXggY29tbWFuZC1saW5lIG9wdGlvbnMgaWdub3JlZCwgVkFYCi1AY2luZGV4IFZBWCBjb21tYW5kLWxpbmUgb3B0aW9ucyBpZ25vcmVkCi1UaGUgVmF4IHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cyBhbnkgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zLAotZ2l2ZXMgYSB3YXJuaW5nIG1lc3NhZ2UgdGhhdCB0aGUgb3B0aW9uIHdhcyBpZ25vcmVkIGFuZCBwcm9jZWVkcy4KLVRoZXNlIG9wdGlvbnMgYXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggc2NyaXB0cyBkZXNpZ25lZCBmb3Igb3RoZXIKLXBlb3BsZSdzIGFzc2VtYmxlcnMuCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXstRH0sIGlnbm9yZWQgb24gVkFYCi1AY2luZGV4IEBjb2Rley1TfSwgaWdub3JlZCBvbiBWQVgKLUBjaW5kZXggQGNvZGV7LVR9LCBpZ25vcmVkIG9uIFZBWAotQGl0ZW0gQGNvZGV7LUR9IChEZWJ1ZykKLUBpdGVteCBAY29kZXstU30gKFN5bWJvbCBUYWJsZSkKLUBpdGVteCBAY29kZXstVH0gKFRva2VuIFRyYWNlKQotVGhlc2UgYXJlIG9ic29sZXRlIG9wdGlvbnMgdXNlZCB0byBkZWJ1ZyBvbGQgYXNzZW1ibGVycy4KLQotQGNpbmRleCBAY29kZXstZH0sIFZBWCBvcHRpb24KLUBpdGVtIEBjb2Rley1kfSAoRGlzcGxhY2VtZW50IHNpemUgZm9yIEpVTVBzKQotVGhpcyBvcHRpb24gZXhwZWN0cyBhIG51bWJlciBmb2xsb3dpbmcgdGhlIEBzYW1wey1kfS4gIExpa2Ugb3B0aW9ucwotdGhhdCBleHBlY3QgZmlsZW5hbWVzLCB0aGUgbnVtYmVyIG1heSBpbW1lZGlhdGVseSBmb2xsb3cgdGhlCi1Ac2FtcHstZH0gKG9sZCBzdGFuZGFyZCkgb3IgY29uc3RpdHV0ZSB0aGUgd2hvbGUgb2YgdGhlIGNvbW1hbmQgbGluZQotYXJndW1lbnQgdGhhdCBmb2xsb3dzIEBzYW1wey1kfSAoQHNje2dudX0gc3RhbmRhcmQpLgotCi1AY2luZGV4IEBjb2Rley1WfSwgcmVkdW5kYW50IG9uIFZBWAotQGl0ZW0gQGNvZGV7LVZ9IChWaXJ0dWFsaXplIEludGVycGFzcyBUZW1wb3JhcnkgRmlsZSkKLVNvbWUgb3RoZXIgYXNzZW1ibGVycyB1c2UgYSB0ZW1wb3JhcnkgZmlsZS4gIFRoaXMgb3B0aW9uCi1jb21tYW5kZWQgdGhlbSB0byBrZWVwIHRoZSBpbmZvcm1hdGlvbiBpbiBhY3RpdmUgbWVtb3J5IHJhdGhlcgotdGhhbiBpbiBhIGRpc2sgZmlsZS4gIEBjb2Rle0B2YWx1ZXtBU319IGFsd2F5cyBkb2VzIHRoaXMsIHNvIHRoaXMKLW9wdGlvbiBpcyByZWR1bmRhbnQuCi0KLUBjaW5kZXggQGNvZGV7LUp9LCBpZ25vcmVkIG9uIFZBWAotQGl0ZW0gQGNvZGV7LUp9IChKVU1QaWZ5IExvbmdlciBCcmFuY2hlcykKLU1hbnkgMzItYml0IGNvbXB1dGVycyBwZXJtaXQgYSB2YXJpZXR5IG9mIGJyYW5jaCBpbnN0cnVjdGlvbnMKLXRvIGRvIHRoZSBzYW1lIGpvYi4gIFNvbWUgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBzaG9ydCAoYW5kCi1mYXN0KSBidXQgaGF2ZSBhIGxpbWl0ZWQgcmFuZ2U7IG90aGVycyBhcmUgbG9uZyAoYW5kIHNsb3cpIGJ1dAotY2FuIGJyYW5jaCBhbnl3aGVyZSBpbiB2aXJ0dWFsIG1lbW9yeS4gIE9mdGVuIHRoZXJlIGFyZSAzCi1mbGF2b3JzIG9mIGJyYW5jaDogc2hvcnQsIG1lZGl1bSBhbmQgbG9uZy4gIFNvbWUgb3RoZXIKLWFzc2VtYmxlcnMgd291bGQgZW1pdCBzaG9ydCBhbmQgbWVkaXVtIGJyYW5jaGVzLCB1bmxlc3MgdG9sZCBieQotdGhpcyBvcHRpb24gdG8gZW1pdCBzaG9ydCBhbmQgbG9uZyBicmFuY2hlcy4KLQotQGNpbmRleCBAY29kZXstdH0sIGlnbm9yZWQgb24gVkFYCi1AaXRlbSBAY29kZXstdH0gKFRlbXBvcmFyeSBGaWxlIERpcmVjdG9yeSkKLVNvbWUgb3RoZXIgYXNzZW1ibGVycyBtYXkgdXNlIGEgdGVtcG9yYXJ5IGZpbGUsIGFuZCB0aGlzIG9wdGlvbgotdGFrZXMgYSBmaWxlbmFtZSBiZWluZyB0aGUgZGlyZWN0b3J5IHRvIHNpdGUgdGhlIHRlbXBvcmFyeQotZmlsZS4gIFNpbmNlIEBjb2Rle0B2YWx1ZXtBU319IGRvZXMgbm90IHVzZSBhIHRlbXBvcmFyeSBkaXNrIGZpbGUsIHRoaXMKLW9wdGlvbiBtYWtlcyBubyBkaWZmZXJlbmNlLiAgQHNhbXB7LXR9IG5lZWRzIGV4YWN0bHkgb25lCi1maWxlbmFtZS4KLUBlbmQgdGFibGUKLQotQGNpbmRleCBWTVMgKFZBWCkgb3B0aW9ucwotQGNpbmRleCBvcHRpb25zIGZvciBWQVgvVk1TCi1AY2luZGV4IFZBWC9WTVMgb3B0aW9ucwotQGNpbmRleCBWYXgtMTEgQyBjb21wYXRpYmlsaXR5Ci1AY2luZGV4IHN5bWJvbHMgd2l0aCB1cHBlcmNhc2UsIFZBWC9WTVMKLVRoZSBWYXggdmVyc2lvbiBvZiB0aGUgYXNzZW1ibGVyIGFjY2VwdHMgYWRkaXRpb25hbCBvcHRpb25zIHdoZW4KLWNvbXBpbGVkIGZvciBWTVM6Ci0KLUB0YWJsZSBAc2FtcAotQGNpbmRleCBAc2FtcHstaH0gb3B0aW9uLCBWQVgvVk1TCi1AaXRlbSAtaCBAdmFye259Ci1FeHRlcm5hbCBzeW1ib2wgb3Igc2VjdGlvbiAodXNlZCBmb3IgZ2xvYmFsIHZhcmlhYmxlcykgbmFtZXMgYXJlIG5vdAotY2FzZSBzZW5zaXRpdmUgb24gVkFYL1ZNUyBhbmQgYWx3YXlzIG1hcHBlZCB0byB1cHBlciBjYXNlLiAgVGhpcyBpcwotY29udHJhcnkgdG8gdGhlIEMgbGFuZ3VhZ2UgZGVmaW5pdGlvbiB3aGljaCBleHBsaWNpdGx5IGRpc3Rpbmd1aXNoZXMKLXVwcGVyIGFuZCBsb3dlciBjYXNlLiAgVG8gaW1wbGVtZW50IGEgc3RhbmRhcmQgY29uZm9ybWluZyBDIGNvbXBpbGVyLAotbmFtZXMgbXVzdCBiZSBjaGFuZ2VkIChtYXBwZWQpIHRvIHByZXNlcnZlIHRoZSBjYXNlIGluZm9ybWF0aW9uLiAgVGhlCi1kZWZhdWx0IG1hcHBpbmcgaXMgdG8gY29udmVydCBhbGwgbG93ZXIgY2FzZSBjaGFyYWN0ZXJzIHRvIHVwcGVyY2FzZSBhbmQKLWFkZGluZyBhbiB1bmRlcnNjb3JlIGZvbGxvd2VkIGJ5IGEgNiBkaWdpdCBoZXggdmFsdWUsIHJlcHJlc2VudGluZyBhIDI0Ci1kaWdpdCBiaW5hcnkgdmFsdWUuICBUaGUgb25lIGRpZ2l0cyBpbiB0aGUgYmluYXJ5IHZhbHVlIHJlcHJlc2VudCB3aGljaAotY2hhcmFjdGVycyBhcmUgdXBwZXJjYXNlIGluIHRoZSBvcmlnaW5hbCBzeW1ib2wgbmFtZS4KLQotVGhlIEBzYW1wey1oIEB2YXJ7bn19IG9wdGlvbiBkZXRlcm1pbmVzIGhvdyB3ZSBtYXAgbmFtZXMuICBUaGlzIHRha2VzCi1zZXZlcmFsIHZhbHVlcy4gIE5vIEBzYW1wey1ofSBzd2l0Y2ggYXQgYWxsIGFsbG93cyBjYXNlIGhhY2tpbmcgYXMKLWRlc2NyaWJlZCBhYm92ZS4gIEEgdmFsdWUgb2YgemVybyAoQHNhbXB7LWgwfSkgaW1wbGllcyBuYW1lcyBzaG91bGQgYmUKLXVwcGVyIGNhc2UsIGFuZCBpbmhpYml0cyB0aGUgY2FzZSBoYWNrLiAgQSB2YWx1ZSBvZiAyIChAc2FtcHstaDJ9KQotaW1wbGllcyBuYW1lcyBzaG91bGQgYmUgYWxsIGxvd2VyIGNhc2UsIHdpdGggbm8gY2FzZSBoYWNrLiAgQSB2YWx1ZSBvZiAzCi0oQHNhbXB7LWgzfSkgaW1wbGllcyB0aGF0IGNhc2Ugc2hvdWxkIGJlIHByZXNlcnZlZC4gIFRoZSB2YWx1ZSAxIGlzCi11bnVzZWQuICBUaGUgQGNvZGV7LUh9IG9wdGlvbiBkaXJlY3RzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGRpc3BsYXkKLWV2ZXJ5IG1hcHBlZCBzeW1ib2wgZHVyaW5nIGFzc2VtYmx5LgotCi1TeW1ib2xzIHdob3NlIG5hbWVzIGluY2x1ZGUgYSBkb2xsYXIgc2lnbiBAc2FtcHskfSBhcmUgZXhjZXB0aW9ucyB0byB0aGUKLWdlbmVyYWwgbmFtZSBtYXBwaW5nLiAgVGhlc2Ugc3ltYm9scyBhcmUgbm9ybWFsbHkgb25seSB1c2VkIHRvIHJlZmVyZW5jZQotVk1TIGxpYnJhcnkgbmFtZXMuICBTdWNoIHN5bWJvbHMgYXJlIGFsd2F5cyBtYXBwZWQgdG8gdXBwZXIgY2FzZS4KLQotQGNpbmRleCBAc2FtcHstK30gb3B0aW9uLCBWQVgvVk1TCi1AaXRlbSAtKwotVGhlIEBzYW1wey0rfSBvcHRpb24gY2F1c2VzIEBjb2Rle0B2YWx1ZXtBU319IHRvIHRydW5jYXRlIGFueSBzeW1ib2wKLW5hbWUgbGFyZ2VyIHRoYW4gMzEgY2hhcmFjdGVycy4gIFRoZSBAc2FtcHstK30gb3B0aW9uIGFsc28gcHJldmVudHMgc29tZQotY29kZSBmb2xsb3dpbmcgdGhlIEBzYW1we19tYWlufSBzeW1ib2wgbm9ybWFsbHkgYWRkZWQgdG8gbWFrZSB0aGUgb2JqZWN0Ci1maWxlIGNvbXBhdGlibGUgd2l0aCBWYXgtMTEgIkMiLgotCi1AY2luZGV4IEBzYW1wey0xfSBvcHRpb24sIFZBWC9WTVMKLUBpdGVtIC0xCi1UaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggQGNvZGV7QHZhbHVle0FTfX0KLXZlcnNpb24gMS54LgotCi1AY2luZGV4IEBzYW1wey1IfSBvcHRpb24sIFZBWC9WTVMKLUBpdGVtIC1ICi1UaGUgQHNhbXB7LUh9IG9wdGlvbiBjYXVzZXMgQGNvZGV7QHZhbHVle0FTfX0gdG8gcHJpbnQgZXZlcnkgc3ltYm9sCi13aGljaCB3YXMgY2hhbmdlZCBieSBjYXNlIG1hcHBpbmcuCi1AZW5kIHRhYmxlCi0KLUBub2RlIFZBWC1mbG9hdAotQHNlY3Rpb24gVkFYIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggVkFYIGZsb2F0aW5nIHBvaW50Ci1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBWQVgKLUNvbnZlcnNpb24gb2YgZmxvbnVtcyB0byBmbG9hdGluZyBwb2ludCBpcyBjb3JyZWN0LCBhbmQKLWNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyBhc3NlbWJsZXJzLiAgUm91bmRpbmcgaXMKLXRvd2FyZHMgemVybyBpZiB0aGUgcmVtYWluZGVyIGlzIGV4YWN0bHkgaGFsZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LgotCi1AY29kZXtEfSwgQGNvZGV7Rn0sIEBjb2Rle0d9IGFuZCBAY29kZXtIfSBmbG9hdGluZyBwb2ludCBmb3JtYXRzCi1hcmUgdW5kZXJzdG9vZC4KLQotSW1tZWRpYXRlIGZsb2F0aW5nIGxpdGVyYWxzIChAZW1waHtlLmcufSBAc2FtcHtTYCQ2Ljl9KQotYXJlIHJlbmRlcmVkIGNvcnJlY3RseS4gIEFnYWluLCByb3VuZGluZyBpcyB0b3dhcmRzIHplcm8gaW4gdGhlCi1ib3VuZGFyeSBjYXNlLgotCi1AY2luZGV4IEBjb2Rle2Zsb2F0fSBkaXJlY3RpdmUsIFZBWAotQGNpbmRleCBAY29kZXtkb3VibGV9IGRpcmVjdGl2ZSwgVkFYCi1UaGUgQGNvZGV7LmZsb2F0fSBkaXJlY3RpdmUgcHJvZHVjZXMgQGNvZGV7Zn0gZm9ybWF0IG51bWJlcnMuCi1UaGUgQGNvZGV7LmRvdWJsZX0gZGlyZWN0aXZlIHByb2R1Y2VzIEBjb2Rle2R9IGZvcm1hdCBudW1iZXJzLgotCi1Abm9kZSBWQVgtZGlyZWN0aXZlcwotQHNlY3Rpb24gVmF4IE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgVkFYCi1AY2luZGV4IFZBWCBtYWNoaW5lIGRpcmVjdGl2ZXMKLVRoZSBWYXggdmVyc2lvbiBvZiB0aGUgYXNzZW1ibGVyIHN1cHBvcnRzIGZvdXIgZGlyZWN0aXZlcyBmb3IKLWdlbmVyYXRpbmcgVmF4IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4gIFRoZXkgYXJlIGRlc2NyaWJlZCBpbiB0aGUKLXRhYmxlIGJlbG93LgotCi1AY2luZGV4IHdpZGUgZmxvYXRpbmcgcG9pbnQgZGlyZWN0aXZlcywgVkFYCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7ZGZsb2F0fSBkaXJlY3RpdmUsIFZBWAotQGl0ZW0gLmRmbG9hdAotVGhpcyBleHBlY3RzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLCBhbmQKLWFzc2VtYmxlcyBWYXggQGNvZGV7ZH0gZm9ybWF0IDY0LWJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCi0KLUBjaW5kZXggQGNvZGV7ZmZsb2F0fSBkaXJlY3RpdmUsIFZBWAotQGl0ZW0gLmZmbG9hdAotVGhpcyBleHBlY3RzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLCBhbmQKLWFzc2VtYmxlcyBWYXggQGNvZGV7Zn0gZm9ybWF0IDMyLWJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCi0KLUBjaW5kZXggQGNvZGV7Z2Zsb2F0fSBkaXJlY3RpdmUsIFZBWAotQGl0ZW0gLmdmbG9hdAotVGhpcyBleHBlY3RzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLCBhbmQKLWFzc2VtYmxlcyBWYXggQGNvZGV7Z30gZm9ybWF0IDY0LWJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCi0KLUBjaW5kZXggQGNvZGV7aGZsb2F0fSBkaXJlY3RpdmUsIFZBWAotQGl0ZW0gLmhmbG9hdAotVGhpcyBleHBlY3RzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLCBhbmQKLWFzc2VtYmxlcyBWYXggQGNvZGV7aH0gZm9ybWF0IDEyOC1iaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIFZBWC1vcGNvZGVzCi1Ac2VjdGlvbiBWQVggT3Bjb2RlcwotCi1AY2luZGV4IFZBWCBvcGNvZGUgbW5lbW9uaWNzCi1AY2luZGV4IG9wY29kZSBtbmVtb25pY3MsIFZBWAotQGNpbmRleCBtbmVtb25pY3MgZm9yIG9wY29kZXMsIFZBWAotQWxsIERFQyBtbmVtb25pY3MgYXJlIHN1cHBvcnRlZC4gIEJld2FyZSB0aGF0IEBjb2Rle2Nhc2VAZG90c3t9fQotaW5zdHJ1Y3Rpb25zIGhhdmUgZXhhY3RseSAzIG9wZXJhbmRzLiAgVGhlIGRpc3BhdGNoIHRhYmxlIHRoYXQKLWZvbGxvd3MgdGhlIEBjb2Rle2Nhc2VAZG90c3t9fSBpbnN0cnVjdGlvbiBzaG91bGQgYmUgbWFkZSB3aXRoCi1AY29kZXsud29yZH0gc3RhdGVtZW50cy4gIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCB1bml4Ci1hc3NlbWJsZXJzIHdlIGtub3cgb2YuCi0KLUBub2RlIFZBWC1icmFuY2gKLUBzZWN0aW9uIFZBWCBCcmFuY2ggSW1wcm92ZW1lbnQKLQotQGNpbmRleCBWQVggYnJhbmNoIGltcHJvdmVtZW50Ci1AY2luZGV4IGJyYW5jaCBpbXByb3ZlbWVudCwgVkFYCi1AY2luZGV4IHBzZXVkby1vcHMgZm9yIGJyYW5jaCwgVkFYCi1DZXJ0YWluIHBzZXVkbyBvcGNvZGVzIGFyZSBwZXJtaXR0ZWQuICBUaGV5IGFyZSBmb3IgYnJhbmNoCi1pbnN0cnVjdGlvbnMuICBUaGV5IGV4cGFuZCB0byB0aGUgc2hvcnRlc3QgYnJhbmNoIGluc3RydWN0aW9uIHRoYXQKLXJlYWNoZXMgdGhlIHRhcmdldC4gIEdlbmVyYWxseSB0aGVzZSBtbmVtb25pY3MgYXJlIG1hZGUgYnkKLXN1YnN0aXR1dGluZyBAc2FtcHtqfSBmb3IgQHNhbXB7Yn0gYXQgdGhlIHN0YXJ0IG9mIGEgREVDIG1uZW1vbmljLgotVGhpcyBmZWF0dXJlIGlzIGluY2x1ZGVkIGJvdGggZm9yIGNvbXBhdGliaWxpdHkgYW5kIHRvIGhlbHAKLWNvbXBpbGVycy4gIElmIHlvdSBkbyBub3QgbmVlZCB0aGlzIGZlYXR1cmUsIGF2b2lkIHRoZXNlCi1vcGNvZGVzLiAgSGVyZSBhcmUgdGhlIG1uZW1vbmljcywgYW5kIHRoZSBjb2RlIHRoZXkgY2FuIGV4cGFuZCBpbnRvLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGpic2IKLUBzYW1we0pzYn0gaXMgYWxyZWFkeSBhbiBpbnN0cnVjdGlvbiBtbmVtb25pYywgc28gd2UgY2hvc2UgQHNhbXB7amJzYn0uCi1AdGFibGUgQGFzaXMKLUBpdGVtIChieXRlIGRpc3BsYWNlbWVudCkKLUBrYmR7YnNiYiBAZG90c3t9fQotQGl0ZW0gKHdvcmQgZGlzcGxhY2VtZW50KQotQGtiZHtic2J3IEBkb3Rze319Ci1AaXRlbSAobG9uZyBkaXNwbGFjZW1lbnQpCi1Aa2Jke2pzYiBAZG90c3t9fQotQGVuZCB0YWJsZQotQGl0ZW0gamJyCi1AaXRlbXgganIKLVVuY29uZGl0aW9uYWwgYnJhbmNoLgotQHRhYmxlIEBhc2lzCi1AaXRlbSAoYnl0ZSBkaXNwbGFjZW1lbnQpCi1Aa2Jke2JyYiBAZG90c3t9fQotQGl0ZW0gKHdvcmQgZGlzcGxhY2VtZW50KQotQGtiZHticncgQGRvdHN7fX0KLUBpdGVtIChsb25nIGRpc3BsYWNlbWVudCkKLUBrYmR7am1wIEBkb3Rze319Ci1AZW5kIHRhYmxlCi1AaXRlbSBqQHZhcntDT05EfQotQHZhcntDT05EfSBtYXkgYmUgYW55IG9uZSBvZiB0aGUgY29uZGl0aW9uYWwgYnJhbmNoZXMKLUBjb2Rle25lcX0sIEBjb2Rle25lcXV9LCBAY29kZXtlcWx9LCBAY29kZXtlcWx1fSwgQGNvZGV7Z3RyfSwKLUBjb2Rle2dlcX0sIEBjb2Rle2xzc30sIEBjb2Rle2d0cnV9LCBAY29kZXtsZXF1fSwgQGNvZGV7dmN9LCBAY29kZXt2c30sCi1AY29kZXtnZXF1fSwgQGNvZGV7Y2N9LCBAY29kZXtsc3N1fSwgQGNvZGV7Y3N9LgotQHZhcntDT05EfSBtYXkgYWxzbyBiZSBvbmUgb2YgdGhlIGJpdCB0ZXN0cwotQGNvZGV7YnN9LCBAY29kZXtiY30sIEBjb2Rle2Jzc30sIEBjb2Rle2Jjc30sIEBjb2Rle2JzY30sIEBjb2Rle2JjY30sCi1AY29kZXtic3NpfSwgQGNvZGV7YmNjaX0sIEBjb2Rle2xic30sIEBjb2Rle2xiY30uCi1AdmFye05PVENPTkR9IGlzIHRoZSBvcHBvc2l0ZSBjb25kaXRpb24gdG8gQHZhcntDT05EfS4KLUB0YWJsZSBAYXNpcwotQGl0ZW0gKGJ5dGUgZGlzcGxhY2VtZW50KQotQGtiZHtiQHZhcntDT05EfSBAZG90c3t9fQotQGl0ZW0gKHdvcmQgZGlzcGxhY2VtZW50KQotQGtiZHtiQHZhcntOT1RDT05EfSBmb28gOyBicncgQGRvdHN7fSA7IGZvbzp9Ci1AaXRlbSAobG9uZyBkaXNwbGFjZW1lbnQpCi1Aa2Jke2JAdmFye05PVENPTkR9IGZvbyA7IGptcCBAZG90c3t9IDsgZm9vOn0KLUBlbmQgdGFibGUKLUBpdGVtIGphY2JAdmFye1h9Ci1AdmFye1h9IG1heSBiZSBvbmUgb2YgQGNvZGV7YiBkIGYgZyBoIGwgd30uCi1AdGFibGUgQGFzaXMKLUBpdGVtICh3b3JkIGRpc3BsYWNlbWVudCkKLUBrYmR7QHZhcntPUENPREV9IEBkb3Rze319Ci1AaXRlbSAobG9uZyBkaXNwbGFjZW1lbnQpCi1AZXhhbXBsZQotQHZhcntPUENPREV9IEBkb3Rze30sIGZvbyA7Ci1icmIgYmFyIDsKLWZvbzogam1wIEBkb3Rze30gOwotYmFyOgotQGVuZCBleGFtcGxlCi1AZW5kIHRhYmxlCi1AaXRlbSBqYW9iQHZhcntZWVl9Ci1AdmFye1lZWX0gbWF5IGJlIG9uZSBvZiBAY29kZXtsc3MgbGVxfS4KLUBpdGVtIGpzb2JAdmFye1paWn0KLUB2YXJ7WlpafSBtYXkgYmUgb25lIG9mIEBjb2Rle2dlcSBndHJ9LgotQHRhYmxlIEBhc2lzCi1AaXRlbSAoYnl0ZSBkaXNwbGFjZW1lbnQpCi1Aa2Jke0B2YXJ7T1BDT0RFfSBAZG90c3t9fQotQGl0ZW0gKHdvcmQgZGlzcGxhY2VtZW50KQotQGV4YW1wbGUKLUB2YXJ7T1BDT0RFfSBAZG90c3t9LCBmb28gOwotYnJiIGJhciA7Ci1mb286IGJydyBAdmFye2Rlc3RpbmF0aW9ufSA7Ci1iYXI6Ci1AZW5kIGV4YW1wbGUKLUBpdGVtIChsb25nIGRpc3BsYWNlbWVudCkKLUBleGFtcGxlCi1AdmFye09QQ09ERX0gQGRvdHN7fSwgZm9vIDsKLWJyYiBiYXIgOwotZm9vOiBqbXAgQHZhcntkZXN0aW5hdGlvbn0gOwotYmFyOgotQGVuZCBleGFtcGxlCi1AZW5kIHRhYmxlCi1AaXRlbSBhb2JsZXEKLUBpdGVteCBhb2Jsc3MKLUBpdGVteCBzb2JnZXEKLUBpdGVteCBzb2JndHIKLUB0YWJsZSBAYXNpcwotQGl0ZW0gKGJ5dGUgZGlzcGxhY2VtZW50KQotQGtiZHtAdmFye09QQ09ERX0gQGRvdHN7fX0KLUBpdGVtICh3b3JkIGRpc3BsYWNlbWVudCkKLUBleGFtcGxlCi1AdmFye09QQ09ERX0gQGRvdHN7fSwgZm9vIDsKLWJyYiBiYXIgOwotZm9vOiBicncgQHZhcntkZXN0aW5hdGlvbn0gOwotYmFyOgotQGVuZCBleGFtcGxlCi1AaXRlbSAobG9uZyBkaXNwbGFjZW1lbnQpCi1AZXhhbXBsZQotQHZhcntPUENPREV9IEBkb3Rze30sIGZvbyA7Ci1icmIgYmFyIDsKLWZvbzogam1wIEB2YXJ7ZGVzdGluYXRpb259IDsKLWJhcjoKLUBlbmQgZXhhbXBsZQotQGVuZCB0YWJsZQotQGVuZCB0YWJsZQotCi1Abm9kZSBWQVgtb3BlcmFuZHMKLUBzZWN0aW9uIFZBWCBPcGVyYW5kcwotCi1AY2luZGV4IFZBWCBvcGVyYW5kIG5vdGF0aW9uCi1AY2luZGV4IG9wZXJhbmQgbm90YXRpb24sIFZBWAotQGNpbmRleCBpbW1lZGlhdGUgY2hhcmFjdGVyLCBWQVgKLUBjaW5kZXggVkFYIGltbWVkaWF0ZSBjaGFyYWN0ZXIKLVRoZSBpbW1lZGlhdGUgY2hhcmFjdGVyIGlzIEBzYW1weyR9IGZvciBVbml4IGNvbXBhdGliaWxpdHksIG5vdAotQHNhbXB7I30gYXMgREVDIHdyaXRlcyBpdC4KLQotQGNpbmRleCBpbmRpcmVjdCBjaGFyYWN0ZXIsIFZBWAotQGNpbmRleCBWQVggaW5kaXJlY3QgY2hhcmFjdGVyCi1UaGUgaW5kaXJlY3QgY2hhcmFjdGVyIGlzIEBzYW1weyp9IGZvciBVbml4IGNvbXBhdGliaWxpdHksIG5vdAotQHNhbXB7QEB9IGFzIERFQyB3cml0ZXMgaXQuCi0KLUBjaW5kZXggZGlzcGxhY2VtZW50IHNpemluZyBjaGFyYWN0ZXIsIFZBWAotQGNpbmRleCBWQVggZGlzcGxhY2VtZW50IHNpemluZyBjaGFyYWN0ZXIKLVRoZSBkaXNwbGFjZW1lbnQgc2l6aW5nIGNoYXJhY3RlciBpcyBAc2FtcHtgfSAoYW4gYWNjZW50IGdyYXZlKSBmb3IKLVVuaXggY29tcGF0aWJpbGl0eSwgbm90IEBzYW1we159IGFzIERFQyB3cml0ZXMgaXQuICBUaGUgbGV0dGVyCi1wcmVjZWRpbmcgQHNhbXB7YH0gbWF5IGhhdmUgZWl0aGVyIGNhc2UuICBAc2FtcHtHfSBpcyBub3QKLXVuZGVyc3Rvb2QsIGJ1dCBhbGwgb3RoZXIgbGV0dGVycyAoQGNvZGV7YiBpIGwgcyB3fSkgYXJlIHVuZGVyc3Rvb2QuCi0KLUBjaW5kZXggcmVnaXN0ZXIgbmFtZXMsIFZBWAotQGNpbmRleCBWQVggcmVnaXN0ZXIgbmFtZXMKLVJlZ2lzdGVyIG5hbWVzIHVuZGVyc3Rvb2QgYXJlIEBjb2Rle3IwIHIxIHIyIEBkb3Rze30gcjE1IGFwIGZwIHNwCi1wY30uICBVcHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXJzIGFyZSBlcXVpdmFsZW50LgotCi1Gb3IgaW5zdGFuY2UKLUBzbWFsbGV4YW1wbGUKLXRzdGIgKndgJDQocjUpCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1BbnkgZXhwcmVzc2lvbiBpcyBwZXJtaXR0ZWQgaW4gYW4gb3BlcmFuZC4gIE9wZXJhbmRzIGFyZSBjb21tYQotc2VwYXJhdGVkLgotCi1AYyBUaGVyZSBpcyBzb21lIGJ1ZyB0byBkbyB3aXRoIHJlY29nbml6aW5nIGV4cHJlc3Npb25zCi1AYyBpbiBvcGVyYW5kcywgYnV0IEkgZm9yZ2V0IHdoYXQgaXQgaXMuICBJdCBpcwotQGMgYSBzeW50YXggY2xhc2ggYmVjYXVzZSAoKSBpcyB1c2VkIGFzIGFuIGFkZHJlc3MgbW9kZQotQGMgYW5kIHRvIGVuY2Fwc3VsYXRlIHN1Yi1leHByZXNzaW9ucy4KLQotQG5vZGUgVkFYLW5vCi1Ac2VjdGlvbiBOb3QgU3VwcG9ydGVkIG9uIFZBWAotCi1AY2luZGV4IFZBWCBiaXRmaWVsZHMgbm90IHN1cHBvcnRlZAotQGNpbmRleCBiaXRmaWVsZHMsIG5vdCBzdXBwb3J0ZWQgb24gVkFYCi1WYXggYml0IGZpZWxkcyBjYW4gbm90IGJlIGFzc2VtYmxlZCB3aXRoIEBjb2Rle0B2YWx1ZXtBU319LiAgU29tZW9uZQotY2FuIGFkZCB0aGUgcmVxdWlyZWQgY29kZSBpZiB0aGV5IHJlYWxseSBuZWVkIGl0LgpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLXo4ay50ZXhpIGIvZ2FzL2RvYy9jLXo4ay50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmIxMGUzLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy16OGsudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgWjgwMDAtRGVwZW5kZW50Ci1AY2hhcHRlciBaODAwMCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBaODAwMCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IFo4MDAwIHN1cHBvcnQKLVRoZSBaODAwMCBAdmFsdWV7QVN9IHN1cHBvcnRzIGJvdGggbWVtYmVycyBvZiB0aGUgWjgwMDAgZmFtaWx5OiB0aGUKLXVuc2VnbWVudGVkIFo4MDAyLCB3aXRoIDE2IGJpdCBhZGRyZXNzZXMsIGFuZCB0aGUgc2VnbWVudGVkIFo4MDAxIHdpdGgKLTI0IGJpdCBhZGRyZXNzZXMuCi0KLVdoZW4gdGhlIGFzc2VtYmxlciBpcyBpbiB1bnNlZ21lbnRlZCBtb2RlIChzcGVjaWZpZWQgd2l0aCB0aGUKLUBjb2Rle3Vuc2VnbX0gZGlyZWN0aXZlKSwgYW4gYWRkcmVzcyB0YWtlcyB1cCBvbmUgd29yZCAoMTYgYml0KQotc2l6ZWQgcmVnaXN0ZXIuICBXaGVuIHRoZSBhc3NlbWJsZXIgaXMgaW4gc2VnbWVudGVkIG1vZGUgKHNwZWNpZmllZCB3aXRoCi10aGUgQGNvZGV7c2VnbX0gZGlyZWN0aXZlKSwgYSAyNC1iaXQgYWRkcmVzcyB0YWtlcyB1cCBhIGxvbmcgKDMyIGJpdCkKLXJlZ2lzdGVyLiAgQHhyZWZ7WjgwMDAgRGlyZWN0aXZlcywsQXNzZW1ibGVyIERpcmVjdGl2ZXMgZm9yIHRoZSBaODAwMH0sCi1mb3IgYSBsaXN0IG9mIG90aGVyIFo4MDAwIHNwZWNpZmljIGFzc2VtYmxlciBkaXJlY3RpdmVzLgotCi1AbWVudQotKiBaODAwMCBPcHRpb25zOjogICAgICAgICAgICAgICBObyBzcGVjaWFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciBaODAwMAotKiBaODAwMCBTeW50YXg6OiAgICAgICAgICAgICAgICBBc3NlbWJsZXIgc3ludGF4IGZvciB0aGUgWjgwMDAKLSogWjgwMDAgRGlyZWN0aXZlczo6ICAgICAgICAgICAgU3BlY2lhbCBkaXJlY3RpdmVzIGZvciB0aGUgWjgwMDAKLSogWjgwMDAgT3Bjb2Rlczo6ICAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIFo4MDAwIE9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLQotQGNpbmRleCBaODAwMCBvcHRpb25zCi1AY2luZGV4IG9wdGlvbnMsIFo4MDAwCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gYWRkaXRpb25hbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgdGhlIFppbG9nCi1aODAwMCBmYW1pbHkuCi0KLUBub2RlIFo4MDAwIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1AbWVudQotKiBaODAwMC1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycwotKiBaODAwMC1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCi0qIFo4MDAwLUFkZHJlc3Npbmc6OiAgICAgICAgICAgQWRkcmVzc2luZyBNb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIFo4MDAwLUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLQotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBaODAwMAotQGNpbmRleCBaODAwMCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Ac2FtcHshfSBpcyB0aGUgbGluZSBjb21tZW50IGNoYXJhY3Rlci4KLQotQGNpbmRleCBsaW5lIHNlcGFyYXRvciwgWjgwMDAKLUBjaW5kZXggc3RhdGVtZW50IHNlcGFyYXRvciwgWjgwMDAKLUBjaW5kZXggWjgwMDAgbGluZSBzZXBhcmF0b3IKLVlvdSBjYW4gdXNlIEBzYW1wezt9IGluc3RlYWQgb2YgYSBuZXdsaW5lIHRvIHNlcGFyYXRlIHN0YXRlbWVudHMuCi0KLUBub2RlIFo4MDAwLVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi0KLUBjaW5kZXggWjgwMDAgcmVnaXN0ZXJzCi1AY2luZGV4IHJlZ2lzdGVycywgWjgwMDAKLVRoZSBaODAwMCBoYXMgc2l4dGVlbiAxNiBiaXQgcmVnaXN0ZXJzLCBudW1iZXJlZCAwIHRvIDE1LiAgWW91IGNhbiByZWZlcgotdG8gZGlmZmVyZW50IHNpemVkIGdyb3VwcyBvZiByZWdpc3RlcnMgYnkgcmVnaXN0ZXIgbnVtYmVyLCB3aXRoIHRoZQotcHJlZml4IEBzYW1we3J9IGZvciAxNiBiaXQgcmVnaXN0ZXJzLCBAc2FtcHtycn0gZm9yIDMyIGJpdCByZWdpc3RlcnMgYW5kCi1Ac2FtcHtycX0gZm9yIDY0IGJpdCByZWdpc3RlcnMuICBZb3UgY2FuIGFsc28gcmVmZXIgdG8gdGhlIGNvbnRlbnRzIG9mCi10aGUgZmlyc3QgZWlnaHQgKG9mIHRoZSBzaXh0ZWVuIDE2IGJpdCByZWdpc3RlcnMpIGJ5IGJ5dGVzLiAgVGhleSBhcmUKLW5hbWVkIEBzYW1we3JAdmFye259aH0gYW5kIEBzYW1we3JAdmFye259bH0uCi0KLUBzbWFsbGV4YW1wbGUKLUBleGRlbnQgQGVtcGh7Ynl0ZSByZWdpc3RlcnN9Ci1yMGwgcjBoIHIxaCByMWwgcjJoIHIybCByM2ggcjNsCi1yNGggcjRsIHI1aCByNWwgcjZoIHI2bCByN2ggcjdsCi0KLUBleGRlbnQgQGVtcGh7d29yZCByZWdpc3RlcnN9Ci1yMCByMSByMiByMyByNCByNSByNiByNyByOCByOSByMTAgcjExIHIxMiByMTMgcjE0IHIxNQotCi1AZXhkZW50IEBlbXBoe2xvbmcgd29yZCByZWdpc3RlcnN9Ci1ycjAgcnIyIHJyNCBycjYgcnI4IHJyMTAgcnIxMiBycjE0Ci0KLUBleGRlbnQgQGVtcGh7cXVhZCB3b3JkIHJlZ2lzdGVyc30KLXJxMCBycTQgcnE4IHJxMTIKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIFo4MDAwLUFkZHJlc3NpbmcKLUBzdWJzZWN0aW9uIEFkZHJlc3NpbmcgTW9kZXMKLQotQGNpbmRleCBhZGRyZXNzaW5nIG1vZGVzLCBaODAwMAotQGNpbmRleCBaODAwIGFkZHJlc3NpbmcgbW9kZXMKLUB2YWx1ZXtBU30gdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBhZGRyZXNzaW5nIG1vZGVzIGZvciB0aGUgWjgwMDA6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gckB2YXJ7bn0KLVJlZ2lzdGVyIGRpcmVjdAotCi1AaXRlbSBAQHJAdmFye259Ci1JbmRpcmVjdCByZWdpc3RlcgotCi1AaXRlbSBAdmFye2FkZHJ9Ci1EaXJlY3Q6IHRoZSAxNiBiaXQgb3IgMjQgYml0IGFkZHJlc3MgKGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBhc3NlbWJsZXIKLWlzIGluIHNlZ21lbnRlZCBvciB1bnNlZ21lbnRlZCBtb2RlKSBvZiB0aGUgb3BlcmFuZCBpcyBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi0KLUBpdGVtIGFkZHJlc3MockB2YXJ7bn0pCi1JbmRleGVkOiB0aGUgMTYgb3IgMjQgYml0IGFkZHJlc3MgaXMgYWRkZWQgdG8gdGhlIDE2IGJpdCByZWdpc3RlciB0byBwcm9kdWNlCi10aGUgZmluYWwgYWRkcmVzcyBpbiBtZW1vcnkgb2YgdGhlIG9wZXJhbmQuCi0KLUBpdGVtIHJAdmFye259KCNAdmFye2ltbX0pCi1CYXNlIEFkZHJlc3M6IHRoZSAxNiBvciAyNCBiaXQgcmVnaXN0ZXIgaXMgYWRkZWQgdG8gdGhlIDE2IGJpdCBzaWduCi1leHRlbmRlZCBpbW1lZGlhdGUgZGlzcGxhY2VtZW50IHRvIHByb2R1Y2UgdGhlIGZpbmFsIGFkZHJlc3MgaW4gbWVtb3J5Ci1vZiB0aGUgb3BlcmFuZC4KLQotQGl0ZW0gckB2YXJ7bn0ockB2YXJ7bX0pCi1CYXNlIEluZGV4OiB0aGUgMTYgb3IgMjQgYml0IHJlZ2lzdGVyIHJAdmFye259IGlzIGFkZGVkIHRvIHRoZSBzaWduCi1leHRlbmRlZCAxNiBiaXQgaW5kZXggcmVnaXN0ZXIgckB2YXJ7bX0gdG8gcHJvZHVjZSB0aGUgZmluYWwgYWRkcmVzcyBpbgotbWVtb3J5IG9mIHRoZSBvcGVyYW5kLgotCi1AaXRlbSAjQHZhcnt4eH0KLUltbWVkaWF0ZSBkYXRhIEB2YXJ7eHh9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBaODAwMCBEaXJlY3RpdmVzCi1Ac2VjdGlvbiBBc3NlbWJsZXIgRGlyZWN0aXZlcyBmb3IgdGhlIFo4MDAwCi0KLUBjaW5kZXggWjgwMDAgZGlyZWN0aXZlcwotQGNpbmRleCBkaXJlY3RpdmVzLCBaODAwMAotVGhlIFo4MDAwIHBvcnQgb2YgQHZhbHVle0FTfSBpbmNsdWRlcyB0aGVzZSBhZGRpdGlvbmFsIGFzc2VtYmxlciBkaXJlY3RpdmVzLAotZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBaODAwMCBhc3NlbWJsZXJzLiAgQXMgc2hvd24sIHRoZXNlIGRvIG5vdAotYmVnaW4gd2l0aCBAc2FtcHsufSAodW5saWtlIHRoZSBvcmRpbmFyeSBAdmFsdWV7QVN9IGRpcmVjdGl2ZXMpLgotCi1AdGFibGUgQGNvZGUKLUBraW5kZXggc2VnbQotQGl0ZW0gc2VnbQotR2VuZXJhdGVzIGNvZGUgZm9yIHRoZSBzZWdtZW50ZWQgWjgwMDEuCi0KLUBraW5kZXggdW5zZWdtCi1AaXRlbSB1bnNlZ20KLUdlbmVyYXRlcyBjb2RlIGZvciB0aGUgdW5zZWdtZW50ZWQgWjgwMDIuCi0KLUBraW5kZXggbmFtZQotQGl0ZW0gbmFtZQotU3lub255bSBmb3IgQGNvZGV7LmZpbGV9Ci0KLUBraW5kZXggZ2xvYmFsCi1AaXRlbSBnbG9iYWwKLVN5bm9ueW0gZm9yIEBjb2Rley5nbG9iYWx9Ci0KLUBraW5kZXggd3ZhbAotQGl0ZW0gd3ZhbAotU3lub255bSBmb3IgQGNvZGV7LndvcmR9Ci0KLUBraW5kZXggbHZhbAotQGl0ZW0gbHZhbAotU3lub255bSBmb3IgQGNvZGV7Lmxvbmd9Ci0KLUBraW5kZXggYnZhbAotQGl0ZW0gYnZhbAotU3lub255bSBmb3IgQGNvZGV7LmJ5dGV9Ci0KLUBraW5kZXggc3ZhbAotQGl0ZW0gc3ZhbAotQXNzZW1ibGUgYSBzdHJpbmcuICBAY29kZXtzdmFsfSBleHBlY3RzIG9uZSBzdHJpbmcgbGl0ZXJhbCwgZGVsaW1pdGVkIGJ5Ci1zaW5nbGUgcXVvdGVzLiAgSXQgYXNzZW1ibGVzIGVhY2ggYnl0ZSBvZiB0aGUgc3RyaW5nIGludG8gY29uc2VjdXRpdmUKLWFkZHJlc3Nlcy4gIFlvdSBjYW4gdXNlIHRoZSBlc2NhcGUgc2VxdWVuY2UgQHNhbXB7JUB2YXJ7eHh9fSAod2hlcmUKLUB2YXJ7eHh9IHJlcHJlc2VudHMgYSB0d28tZGlnaXQgaGV4YWRlY2ltYWwgbnVtYmVyKSB0byByZXByZXNlbnQgdGhlCi1jaGFyYWN0ZXIgd2hvc2UgQHNje2FzY2lpfSB2YWx1ZSBpcyBAdmFye3h4fS4gIFVzZSB0aGlzIGZlYXR1cmUgdG8KLWRlc2NyaWJlIHNpbmdsZSBxdW90ZSBhbmQgb3RoZXIgY2hhcmFjdGVycyB0aGF0IG1heSBub3QgYXBwZWFyIGluIHN0cmluZwotbGl0ZXJhbHMgYXMgdGhlbXNlbHZlcy4gIEZvciBleGFtcGxlLCB0aGUgQyBzdGF0ZW1lbnQgQHd7QHNhbXB7Y2hhciAqYSA9Ci0iaGUgc2FpZCBcIml0J3MgNTAlIG9mZlwiIjt9fSBpcyByZXByZXNlbnRlZCBpbiBaODAwMCBhc3NlbWJseSBsYW5ndWFnZQotKHNob3duIHdpdGggdGhlIGFzc2VtYmxlciBvdXRwdXQgaW4gaGV4IGF0IHRoZSBsZWZ0KSBhcwotCi1AaWZ0ZXgKLUBiZWdpbmdyb3VwCi1AbGV0QG5vbmFycm93aW5nPUBjb21tZW50Ci1AZW5kIGlmdGV4Ci1Ac21hbGxleGFtcGxlCi02ODY1MjA3MyAgICBzdmFsICAgICdoZSBzYWlkICUyMml0JTI3cyA1MCUyNSBvZmYlMjIlMDAnCi02MTY5NjQyMAotMjI2OTc0MjcKLTczMjAzNTMwCi0yNTIwNkY2NgotNjYyMjAwCi1AZW5kIHNtYWxsZXhhbXBsZQotQGlmdGV4Ci1AZW5kZ3JvdXAKLUBlbmQgaWZ0ZXgKLQotQGtpbmRleCByc2VjdAotQGl0ZW0gcnNlY3QKLXN5bm9ueW0gZm9yIEBjb2Rley5zZWN0aW9ufQotCi1Aa2luZGV4IGJsb2NrCi1AaXRlbSBibG9jawotc3lub255bSBmb3IgQGNvZGV7LnNwYWNlfQotCi1Aa2luZGV4IGV2ZW4KLUBpdGVtIGV2ZW4KLXNwZWNpYWwgY2FzZSBvZiBAY29kZXsuYWxpZ259OyBhbGlnbnMgb3V0cHV0IHRvIGV2ZW4gYnl0ZSBib3VuZGFyeS4KLUBlbmQgdGFibGUKLQotQG5vZGUgWjgwMDAgT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotCi1AY2luZGV4IFo4MDAwIG9wY29kZSBzdW1tYXJ5Ci1AY2luZGV4IG9wY29kZSBzdW1tYXJ5LCBaODAwMAotQGNpbmRleCBtbmVtb25pY3MsIFo4MDAwCi1AY2luZGV4IGluc3RydWN0aW9uIHN1bW1hcnksIFo4MDAwCi1Gb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIFo4MDAwIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUKLUBjaXRle1o4MDAwIFRlY2huaWNhbCBNYW51YWx9LgotCi1AaWZzZXQgU01BTEwKLUBjIHRoaXMgdGFibGUsIGR1ZSB0byB0aGUgbXVsdGktY29sIGZha2luZyBhbmQgaGFyZGNvZGVkIG9yZGVyLCBsb29rcyBzaWxseQotQGMgZXhjZXB0IGluIHNtYWxsYm9vay4gIFNlZSBjb21tZW50cyBiZWxvdyAiQHNldCBTTUFMTCIgbmVhciB0b3Agb2YgdGhpcyBmaWxlLgotCi1UaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhlIG9wY29kZXMgYW5kIHRoZWlyIGFyZ3VtZW50czoKLUBpZnRleAotQGJlZ2luZ3JvdXAKLUBsZXRAbm9uYXJyb3dpbmc9QGNvbW1lbnQKLUBlbmQgaWZ0ZXgKLUBzbWFsbGV4YW1wbGUKLQotICAgICAgICAgICAgcnMgICBAcnsxNiBiaXQgc291cmNlIHJlZ2lzdGVyfQotICAgICAgICAgICAgcmQgICBAcnsxNiBiaXQgZGVzdGluYXRpb24gcmVnaXN0ZXJ9Ci0gICAgICAgICAgICByYnMgICBAcns4IGJpdCBzb3VyY2UgcmVnaXN0ZXJ9Ci0gICAgICAgICAgICByYmQgICBAcns4IGJpdCBkZXN0aW5hdGlvbiByZWdpc3Rlcn0KLSAgICAgICAgICAgIHJycyAgIEByezMyIGJpdCBzb3VyY2UgcmVnaXN0ZXJ9Ci0gICAgICAgICAgICBycmQgICBAcnszMiBiaXQgZGVzdGluYXRpb24gcmVnaXN0ZXJ9Ci0gICAgICAgICAgICBycXMgICBAcns2NCBiaXQgc291cmNlIHJlZ2lzdGVyfQotICAgICAgICAgICAgcnFkICAgQHJ7NjQgYml0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyfQotICAgICAgICAgICAgYWRkciBAcnsxNi8yNCBiaXQgYWRkcmVzc30KLSAgICAgICAgICAgIGltbSAgQHJ7aW1tZWRpYXRlIGRhdGF9Ci0KLWFkYyByZCxycyAgICAgICAgICAgICAgIGNscmIgYWRkciAgICAgICAgICAgICAgIGNwc2lyIEBAcmQsQEBycyxycixjYwotYWRjYiByYmQscmJzICAgICAgICAgICAgY2xyYiBhZGRyKHJkKSAgICAgICAgICAgY3BzaXJiIEBAcmQsQEBycyxycixjYwotYWRkIHJkLEBAcnMgICAgICAgICAgICAgIGNscmIgcmJkICAgICAgICAgICAgICAgIGRhYiByYmQKLWFkZCByZCxhZGRyICAgICAgICAgICAgIGNvbSBAQHJkICAgICAgICAgICAgICAgICBkYmpueiByYmQsZGlzcDcKLWFkZCByZCxhZGRyKHJzKSAgICAgICAgIGNvbSBhZGRyICAgICAgICAgICAgICAgIGRlYyBAQHJkLGltbTRtMQotYWRkIHJkLGltbTE2ICAgICAgICAgICAgY29tIGFkZHIocmQpICAgICAgICAgICAgZGVjIGFkZHIocmQpLGltbTRtMQotYWRkIHJkLHJzICAgICAgICAgICAgICAgY29tIHJkICAgICAgICAgICAgICAgICAgZGVjIGFkZHIsaW1tNG0xCi1hZGRiIHJiZCxAQHJzICAgICAgICAgICAgY29tYiBAQHJkICAgICAgICAgICAgICAgIGRlYyByZCxpbW00bTEKLWFkZGIgcmJkLGFkZHIgICAgICAgICAgIGNvbWIgYWRkciAgICAgICAgICAgICAgIGRlY2IgQEByZCxpbW00bTEKLWFkZGIgcmJkLGFkZHIocnMpICAgICAgIGNvbWIgYWRkcihyZCkgICAgICAgICAgIGRlY2IgYWRkcihyZCksaW1tNG0xCi1hZGRiIHJiZCxpbW04ICAgICAgICAgICBjb21iIHJiZCAgICAgICAgICAgICAgICBkZWNiIGFkZHIsaW1tNG0xCi1hZGRiIHJiZCxyYnMgICAgICAgICAgICBjb21mbGcgZmxhZ3MgICAgICAgICAgICBkZWNiIHJiZCxpbW00bTEKLWFkZGwgcnJkLEBAcnMgICAgICAgICAgICBjcCBAQHJkLGltbTE2ICAgICAgICAgICAgZGkgaTIKLWFkZGwgcnJkLGFkZHIgICAgICAgICAgIGNwIGFkZHIocmQpLGltbTE2ICAgICAgIGRpdiBycmQsQEBycwotYWRkbCBycmQsYWRkcihycykgICAgICAgY3AgYWRkcixpbW0xNiAgICAgICAgICAgZGl2IHJyZCxhZGRyCi1hZGRsIHJyZCxpbW0zMiAgICAgICAgICBjcCByZCxAQHJzICAgICAgICAgICAgICAgZGl2IHJyZCxhZGRyKHJzKQotYWRkbCBycmQscnJzICAgICAgICAgICAgY3AgcmQsYWRkciAgICAgICAgICAgICAgZGl2IHJyZCxpbW0xNgotYW5kIHJkLEBAcnMgICAgICAgICAgICAgIGNwIHJkLGFkZHIocnMpICAgICAgICAgIGRpdiBycmQscnMKLWFuZCByZCxhZGRyICAgICAgICAgICAgIGNwIHJkLGltbTE2ICAgICAgICAgICAgIGRpdmwgcnFkLEBAcnMKLWFuZCByZCxhZGRyKHJzKSAgICAgICAgIGNwIHJkLHJzICAgICAgICAgICAgICAgIGRpdmwgcnFkLGFkZHIKLWFuZCByZCxpbW0xNiAgICAgICAgICAgIGNwYiBAQHJkLGltbTggICAgICAgICAgICBkaXZsIHJxZCxhZGRyKHJzKQotYW5kIHJkLHJzICAgICAgICAgICAgICAgY3BiIGFkZHIocmQpLGltbTggICAgICAgZGl2bCBycWQsaW1tMzIKLWFuZGIgcmJkLEBAcnMgICAgICAgICAgICBjcGIgYWRkcixpbW04ICAgICAgICAgICBkaXZsIHJxZCxycnMKLWFuZGIgcmJkLGFkZHIgICAgICAgICAgIGNwYiByYmQsQEBycyAgICAgICAgICAgICBkam56IHJkLGRpc3A3Ci1hbmRiIHJiZCxhZGRyKHJzKSAgICAgICBjcGIgcmJkLGFkZHIgICAgICAgICAgICBlaSBpMgotYW5kYiByYmQsaW1tOCAgICAgICAgICAgY3BiIHJiZCxhZGRyKHJzKSAgICAgICAgZXggcmQsQEBycwotYW5kYiByYmQscmJzICAgICAgICAgICAgY3BiIHJiZCxpbW04ICAgICAgICAgICAgZXggcmQsYWRkcgotYml0IEBAcmQsaW1tNCAgICAgICAgICAgIGNwYiByYmQscmJzICAgICAgICAgICAgIGV4IHJkLGFkZHIocnMpCi1iaXQgYWRkcihyZCksaW1tNCAgICAgICBjcGQgcmQsQEBycyxycixjYyAgICAgICAgZXggcmQscnMKLWJpdCBhZGRyLGltbTQgICAgICAgICAgIGNwZGIgcmJkLEBAcnMscnIsY2MgICAgICBleGIgcmJkLEBAcnMKLWJpdCByZCxpbW00ICAgICAgICAgICAgIGNwZHIgcmQsQEBycyxycixjYyAgICAgICBleGIgcmJkLGFkZHIKLWJpdCByZCxycyAgICAgICAgICAgICAgIGNwZHJiIHJiZCxAQHJzLHJyLGNjICAgICBleGIgcmJkLGFkZHIocnMpCi1iaXRiIEBAcmQsaW1tNCAgICAgICAgICAgY3BpIHJkLEBAcnMscnIsY2MgICAgICAgIGV4YiByYmQscmJzCi1iaXRiIGFkZHIocmQpLGltbTQgICAgICBjcGliIHJiZCxAQHJzLHJyLGNjICAgICAgZXh0MGUgaW1tOAotYml0YiBhZGRyLGltbTQgICAgICAgICAgY3BpciByZCxAQHJzLHJyLGNjICAgICAgIGV4dDBmIGltbTgKLWJpdGIgcmJkLGltbTQgICAgICAgICAgIGNwaXJiIHJiZCxAQHJzLHJyLGNjICAgICBleHQ4ZSBpbW04Ci1iaXRiIHJiZCxycyAgICAgICAgICAgICBjcGwgcnJkLEBAcnMgICAgICAgICAgICAgZXh0OGYgaW1tOAotYnB0ICAgICAgICAgICAgICAgICAgICAgY3BsIHJyZCxhZGRyICAgICAgICAgICAgZXh0cyBycmQKLWNhbGwgQEByZCAgICAgICAgICAgICAgICBjcGwgcnJkLGFkZHIocnMpICAgICAgICBleHRzYiByZAotY2FsbCBhZGRyICAgICAgICAgICAgICAgY3BsIHJyZCxpbW0zMiAgICAgICAgICAgZXh0c2wgcnFkCi1jYWxsIGFkZHIocmQpICAgICAgICAgICBjcGwgcnJkLHJycyAgICAgICAgICAgICBoYWx0Ci1jYWxyIGRpc3AxMiAgICAgICAgICAgICBjcHNkIEBAcmQsQEBycyxycixjYyAgICAgIGluIHJkLEBAcnMKLWNsciBAQHJkICAgICAgICAgICAgICAgICBjcHNkYiBAQHJkLEBAcnMscnIsY2MgICAgIGluIHJkLGltbTE2Ci1jbHIgYWRkciAgICAgICAgICAgICAgICBjcHNkciBAQHJkLEBAcnMscnIsY2MgICAgIGluYiByYmQsQEBycwotY2xyIGFkZHIocmQpICAgICAgICAgICAgY3BzZHJiIEBAcmQsQEBycyxycixjYyAgICBpbmIgcmJkLGltbTE2Ci1jbHIgcmQgICAgICAgICAgICAgICAgICBjcHNpIEBAcmQsQEBycyxycixjYyAgICAgIGluYyBAQHJkLGltbTRtMQotY2xyYiBAQHJkICAgICAgICAgICAgICAgIGNwc2liIEBAcmQsQEBycyxycixjYyAgICAgaW5jIGFkZHIocmQpLGltbTRtMQotaW5jIGFkZHIsaW1tNG0xICAgICAgICAgbGRiIHJiZCxycyhyeCkgICAgICAgICAgbXVsdCBycmQsYWRkcihycykKLWluYyByZCxpbW00bTEgICAgICAgICAgIGxkYiByZChpbW0xNikscmJzICAgICAgIG11bHQgcnJkLGltbTE2Ci1pbmNiIEBAcmQsaW1tNG0xICAgICAgICAgbGRiIHJkKHJ4KSxyYnMgICAgICAgICAgbXVsdCBycmQscnMKLWluY2IgYWRkcihyZCksaW1tNG0xICAgIGxkY3RsIGN0cmwscnMgICAgICAgICAgIG11bHRsIHJxZCxAQHJzCi1pbmNiIGFkZHIsaW1tNG0xICAgICAgICBsZGN0bCByZCxjdHJsICAgICAgICAgICBtdWx0bCBycWQsYWRkcgotaW5jYiByYmQsaW1tNG0xICAgICAgICAgbGRkIEBAcnMsQEByZCxyciAgICAgICAgICBtdWx0bCBycWQsYWRkcihycykKLWluZCBAQHJkLEBAcnMscmEgICAgICAgICAgbGRkYiBAQHJzLEBAcmQscnIgICAgICAgICBtdWx0bCBycWQsaW1tMzIKLWluZGIgQEByZCxAQHJzLHJiYSAgICAgICAgbGRkciBAQHJzLEBAcmQscnIgICAgICAgICBtdWx0bCBycWQscnJzCi1pbmliIEBAcmQsQEBycyxyYSAgICAgICAgIGxkZHJiIEBAcnMsQEByZCxyciAgICAgICAgbmVnIEBAcmQKLWluaWJyIEBAcmQsQEBycyxyYSAgICAgICAgbGRpIEBAcmQsQEBycyxyciAgICAgICAgICBuZWcgYWRkcgotaXJldCAgICAgICAgICAgICAgICAgICAgbGRpYiBAQHJkLEBAcnMscnIgICAgICAgICBuZWcgYWRkcihyZCkKLWpwIGNjLEBAcmQgICAgICAgICAgICAgICBsZGlyIEBAcmQsQEBycyxyciAgICAgICAgIG5lZyByZAotanAgY2MsYWRkciAgICAgICAgICAgICAgbGRpcmIgQEByZCxAQHJzLHJyICAgICAgICBuZWdiIEBAcmQKLWpwIGNjLGFkZHIocmQpICAgICAgICAgIGxkayByZCxpbW00ICAgICAgICAgICAgIG5lZ2IgYWRkcgotanIgY2MsZGlzcDggICAgICAgICAgICAgbGRsIEBAcmQscnJzICAgICAgICAgICAgIG5lZ2IgYWRkcihyZCkKLWxkIEBAcmQsaW1tMTYgICAgICAgICAgICBsZGwgYWRkcihyZCkscnJzICAgICAgICBuZWdiIHJiZAotbGQgQEByZCxycyAgICAgICAgICAgICAgIGxkbCBhZGRyLHJycyAgICAgICAgICAgIG5vcAotbGQgYWRkcihyZCksaW1tMTYgICAgICAgbGRsIHJkKGltbTE2KSxycnMgICAgICAgb3IgcmQsQEBycwotbGQgYWRkcihyZCkscnMgICAgICAgICAgbGRsIHJkKHJ4KSxycnMgICAgICAgICAgb3IgcmQsYWRkcgotbGQgYWRkcixpbW0xNiAgICAgICAgICAgbGRsIHJyZCxAQHJzICAgICAgICAgICAgIG9yIHJkLGFkZHIocnMpCi1sZCBhZGRyLHJzICAgICAgICAgICAgICBsZGwgcnJkLGFkZHIgICAgICAgICAgICBvciByZCxpbW0xNgotbGQgcmQoaW1tMTYpLHJzICAgICAgICAgbGRsIHJyZCxhZGRyKHJzKSAgICAgICAgb3IgcmQscnMKLWxkIHJkKHJ4KSxycyAgICAgICAgICAgIGxkbCBycmQsaW1tMzIgICAgICAgICAgIG9yYiByYmQsQEBycwotbGQgcmQsQEBycyAgICAgICAgICAgICAgIGxkbCBycmQscnJzICAgICAgICAgICAgIG9yYiByYmQsYWRkcgotbGQgcmQsYWRkciAgICAgICAgICAgICAgbGRsIHJyZCxycyhpbW0xNikgICAgICAgb3JiIHJiZCxhZGRyKHJzKQotbGQgcmQsYWRkcihycykgICAgICAgICAgbGRsIHJyZCxycyhyeCkgICAgICAgICAgb3JiIHJiZCxpbW04Ci1sZCByZCxpbW0xNiAgICAgICAgICAgICBsZG0gQEByZCxycyxuICAgICAgICAgICAgb3JiIHJiZCxyYnMKLWxkIHJkLHJzICAgICAgICAgICAgICAgIGxkbSBhZGRyKHJkKSxycyxuICAgICAgIG91dCBAQHJkLHJzCi1sZCByZCxycyhpbW0xNikgICAgICAgICBsZG0gYWRkcixycyxuICAgICAgICAgICBvdXQgaW1tMTYscnMKLWxkIHJkLHJzKHJ4KSAgICAgICAgICAgIGxkbSByZCxAQHJzLG4gICAgICAgICAgICBvdXRiIEBAcmQscmJzCi1sZGEgcmQsYWRkciAgICAgICAgICAgICBsZG0gcmQsYWRkcihycyksbiAgICAgICBvdXRiIGltbTE2LHJicwotbGRhIHJkLGFkZHIocnMpICAgICAgICAgbGRtIHJkLGFkZHIsbiAgICAgICAgICAgb3V0ZCBAQHJkLEBAcnMscmEKLWxkYSByZCxycyhpbW0xNikgICAgICAgIGxkcHMgQEBycyAgICAgICAgICAgICAgICBvdXRkYiBAQHJkLEBAcnMscmJhCi1sZGEgcmQscnMocngpICAgICAgICAgICBsZHBzIGFkZHIgICAgICAgICAgICAgICBvdXRpYiBAQHJkLEBAcnMscmEKLWxkYXIgcmQsZGlzcDE2ICAgICAgICAgIGxkcHMgYWRkcihycykgICAgICAgICAgIG91dGliciBAQHJkLEBAcnMscmEKLWxkYiBAQHJkLGltbTggICAgICAgICAgICBsZHIgZGlzcDE2LHJzICAgICAgICAgICBwb3AgQEByZCxAQHJzCi1sZGIgQEByZCxyYnMgICAgICAgICAgICAgbGRyIHJkLGRpc3AxNiAgICAgICAgICAgcG9wIGFkZHIocmQpLEBAcnMKLWxkYiBhZGRyKHJkKSxpbW04ICAgICAgIGxkcmIgZGlzcDE2LHJicyAgICAgICAgIHBvcCBhZGRyLEBAcnMKLWxkYiBhZGRyKHJkKSxyYnMgICAgICAgIGxkcmIgcmJkLGRpc3AxNiAgICAgICAgIHBvcCByZCxAQHJzCi1sZGIgYWRkcixpbW04ICAgICAgICAgICBsZHJsIGRpc3AxNixycnMgICAgICAgICBwb3BsIEBAcmQsQEBycwotbGRiIGFkZHIscmJzICAgICAgICAgICAgbGRybCBycmQsZGlzcDE2ICAgICAgICAgcG9wbCBhZGRyKHJkKSxAQHJzCi1sZGIgcmJkLEBAcnMgICAgICAgICAgICAgbWJpdCAgICAgICAgICAgICAgICAgICAgcG9wbCBhZGRyLEBAcnMKLWxkYiByYmQsYWRkciAgICAgICAgICAgIG1yZXEgcmQgICAgICAgICAgICAgICAgIHBvcGwgcnJkLEBAcnMKLWxkYiByYmQsYWRkcihycykgICAgICAgIG1yZXMgICAgICAgICAgICAgICAgICAgIHB1c2ggQEByZCxAQHJzCi1sZGIgcmJkLGltbTggICAgICAgICAgICBtc2V0ICAgICAgICAgICAgICAgICAgICBwdXNoIEBAcmQsYWRkcgotbGRiIHJiZCxyYnMgICAgICAgICAgICAgbXVsdCBycmQsQEBycyAgICAgICAgICAgIHB1c2ggQEByZCxhZGRyKHJzKQotbGRiIHJiZCxycyhpbW0xNikgICAgICAgbXVsdCBycmQsYWRkciAgICAgICAgICAgcHVzaCBAQHJkLGltbTE2Ci1wdXNoIEBAcmQscnMgICAgICAgICAgICAgc2V0IGFkZHIsaW1tNCAgICAgICAgICAgc3VibCBycmQsaW1tMzIKLXB1c2hsIEBAcmQsQEBycyAgICAgICAgICAgc2V0IHJkLGltbTQgICAgICAgICAgICAgc3VibCBycmQscnJzCi1wdXNobCBAQHJkLGFkZHIgICAgICAgICAgc2V0IHJkLHJzICAgICAgICAgICAgICAgdGNjIGNjLHJkCi1wdXNobCBAQHJkLGFkZHIocnMpICAgICAgc2V0YiBAQHJkLGltbTQgICAgICAgICAgIHRjY2IgY2MscmJkCi1wdXNobCBAQHJkLHJycyAgICAgICAgICAgc2V0YiBhZGRyKHJkKSxpbW00ICAgICAgdGVzdCBAQHJkCi1yZXMgQEByZCxpbW00ICAgICAgICAgICAgc2V0YiBhZGRyLGltbTQgICAgICAgICAgdGVzdCBhZGRyCi1yZXMgYWRkcihyZCksaW1tNCAgICAgICBzZXRiIHJiZCxpbW00ICAgICAgICAgICB0ZXN0IGFkZHIocmQpCi1yZXMgYWRkcixpbW00ICAgICAgICAgICBzZXRiIHJiZCxycyAgICAgICAgICAgICB0ZXN0IHJkCi1yZXMgcmQsaW1tNCAgICAgICAgICAgICBzZXRmbGcgaW1tNCAgICAgICAgICAgICB0ZXN0YiBAQHJkCi1yZXMgcmQscnMgICAgICAgICAgICAgICBzaW5iIHJiZCxpbW0xNiAgICAgICAgICB0ZXN0YiBhZGRyCi1yZXNiIEBAcmQsaW1tNCAgICAgICAgICAgc2luYiByZCxpbW0xNiAgICAgICAgICAgdGVzdGIgYWRkcihyZCkKLXJlc2IgYWRkcihyZCksaW1tNCAgICAgIHNpbmQgQEByZCxAQHJzLHJhICAgICAgICAgdGVzdGIgcmJkCi1yZXNiIGFkZHIsaW1tNCAgICAgICAgICBzaW5kYiBAQHJkLEBAcnMscmJhICAgICAgIHRlc3RsIEBAcmQKLXJlc2IgcmJkLGltbTQgICAgICAgICAgIHNpbmliIEBAcmQsQEBycyxyYSAgICAgICAgdGVzdGwgYWRkcgotcmVzYiByYmQscnMgICAgICAgICAgICAgc2luaWJyIEBAcmQsQEBycyxyYSAgICAgICB0ZXN0bCBhZGRyKHJkKQotcmVzZmxnIGltbTQgICAgICAgICAgICAgc2xhIHJkLGltbTggICAgICAgICAgICAgdGVzdGwgcnJkCi1yZXQgY2MgICAgICAgICAgICAgICAgICBzbGFiIHJiZCxpbW04ICAgICAgICAgICB0cmRiIEBAcmQsQEBycyxyYmEKLXJsIHJkLGltbTFvcjIgICAgICAgICAgIHNsYWwgcnJkLGltbTggICAgICAgICAgIHRyZHJiIEBAcmQsQEBycyxyYmEKLXJsYiByYmQsaW1tMW9yMiAgICAgICAgIHNsbCByZCxpbW04ICAgICAgICAgICAgIHRyaWIgQEByZCxAQHJzLHJicgotcmxjIHJkLGltbTFvcjIgICAgICAgICAgc2xsYiByYmQsaW1tOCAgICAgICAgICAgdHJpcmIgQEByZCxAQHJzLHJicgotcmxjYiByYmQsaW1tMW9yMiAgICAgICAgc2xsbCBycmQsaW1tOCAgICAgICAgICAgdHJ0ZHJiIEBAcmEsQEByYixyYnIKLXJsZGIgcmJiLHJiYSAgICAgICAgICAgIHNvdXQgaW1tMTYscnMgICAgICAgICAgIHRydGliIEBAcmEsQEByYixycgotcnIgcmQsaW1tMW9yMiAgICAgICAgICAgc291dGIgaW1tMTYscmJzICAgICAgICAgdHJ0aXJiIEBAcmEsQEByYixyYnIKLXJyYiByYmQsaW1tMW9yMiAgICAgICAgIHNvdXRkIEBAcmQsQEBycyxyYSAgICAgICAgdHJ0cmIgQEByYSxAQHJiLHJicgotcnJjIHJkLGltbTFvcjIgICAgICAgICAgc291dGRiIEBAcmQsQEBycyxyYmEgICAgICB0c2V0IEBAcmQKLXJyY2IgcmJkLGltbTFvcjIgICAgICAgIHNvdXRpYiBAQHJkLEBAcnMscmEgICAgICAgdHNldCBhZGRyCi1ycmRiIHJiYixyYmEgICAgICAgICAgICBzb3V0aWJyIEBAcmQsQEBycyxyYSAgICAgIHRzZXQgYWRkcihyZCkKLXJzdmQzNiAgICAgICAgICAgICAgICAgIHNyYSByZCxpbW04ICAgICAgICAgICAgIHRzZXQgcmQKLXJzdmQzOCAgICAgICAgICAgICAgICAgIHNyYWIgcmJkLGltbTggICAgICAgICAgIHRzZXRiIEBAcmQKLXJzdmQ3OCAgICAgICAgICAgICAgICAgIHNyYWwgcnJkLGltbTggICAgICAgICAgIHRzZXRiIGFkZHIKLXJzdmQ3ZSAgICAgICAgICAgICAgICAgIHNybCByZCxpbW04ICAgICAgICAgICAgIHRzZXRiIGFkZHIocmQpCi1yc3ZkOWQgICAgICAgICAgICAgICAgICBzcmxiIHJiZCxpbW04ICAgICAgICAgICB0c2V0YiByYmQKLXJzdmQ5ZiAgICAgICAgICAgICAgICAgIHNybGwgcnJkLGltbTggICAgICAgICAgIHhvciByZCxAQHJzCi1yc3ZkYjkgICAgICAgICAgICAgICAgICBzdWIgcmQsQEBycyAgICAgICAgICAgICAgeG9yIHJkLGFkZHIKLXJzdmRiZiAgICAgICAgICAgICAgICAgIHN1YiByZCxhZGRyICAgICAgICAgICAgIHhvciByZCxhZGRyKHJzKQotc2JjIHJkLHJzICAgICAgICAgICAgICAgc3ViIHJkLGFkZHIocnMpICAgICAgICAgeG9yIHJkLGltbTE2Ci1zYmNiIHJiZCxyYnMgICAgICAgICAgICBzdWIgcmQsaW1tMTYgICAgICAgICAgICB4b3IgcmQscnMKLXNjIGltbTggICAgICAgICAgICAgICAgIHN1YiByZCxycyAgICAgICAgICAgICAgIHhvcmIgcmJkLEBAcnMKLXNkYSByZCxycyAgICAgICAgICAgICAgIHN1YmIgcmJkLEBAcnMgICAgICAgICAgICB4b3JiIHJiZCxhZGRyCi1zZGFiIHJiZCxycyAgICAgICAgICAgICBzdWJiIHJiZCxhZGRyICAgICAgICAgICB4b3JiIHJiZCxhZGRyKHJzKQotc2RhbCBycmQscnMgICAgICAgICAgICAgc3ViYiByYmQsYWRkcihycykgICAgICAgeG9yYiByYmQsaW1tOAotc2RsIHJkLHJzICAgICAgICAgICAgICAgc3ViYiByYmQsaW1tOCAgICAgICAgICAgeG9yYiByYmQscmJzCi1zZGxiIHJiZCxycyAgICAgICAgICAgICBzdWJiIHJiZCxyYnMgICAgICAgICAgICB4b3JiIHJiZCxyYnMKLXNkbGwgcnJkLHJzICAgICAgICAgICAgIHN1YmwgcnJkLEBAcnMKLXNldCBAQHJkLGltbTQgICAgICAgICAgICBzdWJsIHJyZCxhZGRyCi1zZXQgYWRkcihyZCksaW1tNCAgICAgICBzdWJsIHJyZCxhZGRyKHJzKQotQGVuZCBzbWFsbGV4YW1wbGUKLUBpZnRleAotQGVuZGdyb3VwCi1AZW5kIGlmdGV4Ci1AZW5kIGlmc2V0Ci0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvZ2FzcC50ZXhpIGIvZ2FzL2RvYy9nYXNwLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0Y2Q2ZjQuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9nYXNwLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwxMDg2ICswLDAgQEAKLVxpbnB1dCB0ZXhpbmZvICAgICAgICAgICAgICAgQGMgICAgICAgICAgICAgLSotIFRleGluZm8gLSotCi1Ac2V0ZmlsZW5hbWUgZ2FzcC5pbmZvCi1AYwotQGMgVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgYXNzZW1ibHkgcHJlcHJvY2Vzc29yICJHQVNQIgotQGMKLUBjIENvcHlyaWdodCAoYykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjCi1AYyBUaGlzIHRleHQgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQotQGMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogZ2FzcDogKGdhc3ApLiAgICAgICAgICAgICAgICAgICAgIFRoZSBHTlUgQXNzZW1ibGVyIFByZXByb2Nlc3NvcgotRU5ELUlORk8tRElSLUVOVFJZCi1AZW5kIGZvcm1hdAotQGVuZCBpZmluZm8KLQotQHN5bmNvZGVpbmRleCBreSBjcAotQHN5bmNvZGVpbmRleCBmbiBjcAotCi1AZmluYWxvdXQKLUBzZXRjaGFwdGVybmV3cGFnZSBvZGQKLUBzZXR0aXRsZSBHQVNQCi1AdGl0bGVwYWdlCi1AYyBGSVhNRSBib3JpbmcgdGl0bGUKLUB0aXRsZSBHQVNQLCBhbiBhc3NlbWJseSBwcmVwcm9jZXNzb3IKLUBzdWJ0aXRsZSBmb3IgR0FTUCB2ZXJzaW9uIDEKLUBzcCAxCi1Ac3VidGl0bGUgTWFyY2ggMTk5NAotQGF1dGhvciBSb2xhbmQgUGVzY2gKLUBwYWdlCi0KLUB0ZXgKLXtccGFyc2tpcD0wcHQgXGhmaWxsIEN5Z251cyBTdXBwb3J0XHBhcgotfQotQGVuZCB0ZXgKLQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0Ci10aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgdGl0bGVwYWdlCi0KLUBpZmluZm8KLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBhIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi1AZW5kIGlnbm9yZQotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdAotdGhlIGVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi0KLUBub2RlIFRvcAotQHRvcCBHQVNQCi0KLUdBU1AgaXMgYSBwcmVwcm9jZXNzb3IgZm9yIGFzc2VtYmx5IHByb2dyYW1zLgotCi1UaGlzIGZpbGUgZGVzY3JpYmVzIHZlcnNpb24gMSBvZiBHQVNQLgotCi1TdGV2ZSBDaGFtYmVybGFpbiB3cm90ZSBHQVNQOyBSb2xhbmQgUGVzY2ggd3JvdGUgdGhpcyBtYW51YWwuCi0KLUBtZW51Ci0qIE92ZXJ2aWV3OjogICAgICAgICAgICAgICAgICAgIFdoYXQgaXMgR0FTUD8KLSogSW52b2tpbmcgR0FTUDo6ICAgICAgICAgICAgICAgQ29tbWFuZCBsaW5lIG9wdGlvbnMuCi0qIENvbW1hbmRzOjogICAgICAgICAgICAgICAgICAgIFByZXByb2Nlc3NvciBjb21tYW5kcy4KLSogSW5kZXg6OiAgICAgICAgICAgICAgICAgICAgICAgSW5kZXguCi1AZW5kIG1lbnUKLUBlbmQgaWZpbmZvCi0KLUBub2RlIE92ZXJ2aWV3Ci1AY2hhcHRlciBXaGF0IGlzIEdBU1A/Ci0KLVRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhlIEBzY3tnbnV9IGFzc2VtYmxlciBpcyB0byBhc3NlbWJsZSB0aGUgb3V0cHV0IG9mCi1vdGhlciBwcm9ncmFtcy0tLW5vdGFibHkgY29tcGlsZXJzLiAgV2hlbiB5b3UgaGF2ZSB0byBoYW5kLWNvZGUKLXNwZWNpYWxpemVkIHJvdXRpbmVzIGluIGFzc2VtYmx5LCB0aGF0IG1lYW5zIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIgaXMKLWFuIHVuZnJpZW5kbHkgcHJvY2Vzc29yOiBpdCBoYXMgbm8gZGlyZWN0aXZlcyBmb3IgbWFjcm9zLCBjb25kaXRpb25hbHMsCi1vciBtYW55IG90aGVyIGNvbnZlbmllbmNlcyB0aGF0IHlvdSBtaWdodCBleHBlY3QuCi0KLUluIHNvbWUgY2FzZXMgeW91IGNhbiBzaW1wbHkgdXNlIHRoZSBDIHByZXByb2Nlc3Nvciwgb3IgYSBnZW5lcmFsaXplZAotcHJlcHJvY2Vzc29yIGxpa2UgQHNje200fTsgYnV0IHRoaXMgY2FuIGJlIGF3a3dhcmQsIHNpbmNlIG5vbmUgb2YgdGhlc2UKLXRoaW5ncyBhcmUgZGVzaWduZWQgd2l0aCBhc3NlbWJseSBpbiBtaW5kLgotCi1Ac2N7Z2FzcH0gZmlsbHMgdGhpcyBuZWVkLiAgSXQgaXMgZXhwcmVzc2x5IGRlc2lnbmVkIHRvIHByb3ZpZGUgdGhlCi1mYWNpbGl0aWVzIHlvdSBuZWVkIHdpdGggaGFuZC1jb2RlZCBhc3NlbWJseSBjb2RlLiAgSW1wbGVtZW50aW5nIGl0IGFzIGEKLXByZXByb2Nlc3NvciwgcmF0aGVyIHRoYW4gcGFydCBvZiB0aGUgYXNzZW1ibGVyLCBhbGxvd3MgdGhlIG1heGltdW0KLWZsZXhpYmlsaXR5OiB5b3UgY2FuIHVzZSBpdCB3aXRoIGhhbmQtY29kZWQgYXNzZW1ibHksIHdpdGhvdXQgcGF5aW5nIGEKLXBlbmFsdHkgb2YgYWRkZWQgY29tcGxleGl0eSBpbiB0aGUgYXNzZW1ibGVyIHlvdSB1c2UgZm9yIGNvbXBpbGVyCi1vdXRwdXQuCi0KLUhlcmUgaXMgYSBzbWFsbCBleGFtcGxlIHRvIGdpdmUgdGhlIGZsYXZvciBvZiBAc2N7Z2FzcH0uICBUaGlzIGlucHV0IHRvCi1Ac2N7Z2FzcH0KLQotQGNhcnRvdWNoZQotQGV4YW1wbGUKLSAgICAgICAgLk1BQ1JPICBzYXZlcmVncyBmcm9tPTggdG89MTQKLWNvdW50ICAgLkFTU0lHTkEgXGZyb20KLSAgICAgICAgISBzYXZlIHJcZnJvbS4uclx0bwotICAgICAgICAuQVdISUxFICBcJmNvdW50IExFIFx0bwotICAgICAgICBtb3YgICAgIHJcJmNvdW50LEBALXNwCi1jb3VudCAgIC5BU1NJR05BICBcJmNvdW50ICsgMQotICAgICAgICAuQUVORFcKLSAgICAgICAgLkVORE0KLQotICAgICAgICBzYXZlcmVncyBmcm9tPTEyCi0KLWJhcjogICAgbW92ICAgICAjSCdkZWFkKzEwLHIwCi1mb28gICAgIC5TREFUQUMgImhlbGxvIjwxMD4KLSAgICAgICAgLkVORAotQGVuZCBleGFtcGxlCi1AZW5kIGNhcnRvdWNoZQotCi1Abm9pbmRlbnQKLWdlbmVyYXRlcyB0aGlzIGFzc2VtYmx5IHByb2dyYW06Ci0KLUBjYXJ0b3VjaGUKLUBleGFtcGxlCi0gICAgICAgICEgc2F2ZSByMTIuLnIxNAotICAgICAgICBtb3YgICAgIHIxMixAQC1zcAotICAgICAgICBtb3YgICAgIHIxMyxAQC1zcAotICAgICAgICBtb3YgICAgIHIxNCxAQC1zcAotCi1iYXI6ICAgIG1vdiAgICAgIzU3MDA1KzEwLHIwCi1mb286ICAgIC5ieXRlICAgNiwxMDQsMTAxLDEwOCwxMDgsMTExLDEwCi1AZW5kIGV4YW1wbGUKLUBlbmQgY2FydG91Y2hlCi0KLUBub2RlIEludm9raW5nIEdBU1AKLUBjaGFwdGVyIENvbW1hbmQgTGluZSBPcHRpb25zCi0KLUBjIEZJWE1FISAgT3IgaXMgdGhlcmUgYSBzaW1wbGVyIHdheSwgY2FsbGluZyBmcm9tIEdBUyBvcHRpb24/Ci1UaGUgc2ltcGxlc3Qgd2F5IHRvIHVzZSBAc2N7Z2FzcH0gaXMgdG8gcnVuIGl0IGFzIGEgZmlsdGVyIGFuZCBhc3NlbWJsZQotaXRzIG91dHB1dC4gIEluIFVuaXggYW5kIGl0cyBpbGssIHlvdSBjYW4gZG8gdGhpcywgZm9yIGV4YW1wbGU6Ci0KLUBjIEZJWE1FISBHQVNQIGZpbGVuYW1lIHN1ZmZpeCBjb252ZW50aW9uPwotQGV4YW1wbGUKLSQgZ2FzcCBwcm9nLmFzbSB8IGFzIC1vIHByb2cubwotQGVuZCBleGFtcGxlCi0KLU5hdHVyYWxseSwgdGhlcmUgYXJlIGFsc28gYSBmZXcgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gYWxsb3cgeW91IHRvCi1yZXF1ZXN0IHZhcmlhdGlvbnMgb24gdGhpcyBiYXNpYyB0aGVtZS4gIEhlcmUgaXMgdGhlIGZ1bGwgc2V0IG9mCi1wb3NzaWJpbGl0aWVzIGZvciB0aGUgQHNje2dhc3B9IGNvbW1hbmQgbGluZS4KLQotQGV4YW1wbGUKLWdhc3AgIFsgLWEgfCAtLWFsdGVybmF0ZSBdCi0gICAgICBbIC1jIEB2YXJ7Y2hhcn0gfCAtLWNvbW1lbnRjaGFyIEB2YXJ7Y2hhcn0gXQotICAgICAgWyAtZCB8IC0tZGVidWcgXSAgWyAtaCB8IC0taGVscCBdIFsgLU0gfCAtLW1yaSBdCi0gICAgICBbIC1vIEB2YXJ7b3V0ZmlsZX0gfCAtLW91dHB1dCBAdmFye291dGZpbGV9IF0KLSAgICAgIFsgLXAgfCAtLXByaW50IF0gIFsgLXMgfCAtLWNvcHlzb3VyY2UgXQotICAgICAgWyAtdSB8IC0tdW5yZWFzb25hYmxlIF0gIFsgLXYgfCAtLXZlcnNpb24gXQotICAgICAgQHZhcntpbmZpbGV9IEBkb3Rze30KLUBlbmQgZXhhbXBsZQotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSBAdmFye2luZmlsZX0gQGRvdHN7fQotQGMgRklYTUUhIFdoeSBub3Qgc3RkaW4gYXMgZGVmYXVsdCBpbmZpbGU/Ci1UaGUgaW5wdXQgZmlsZSBuYW1lcy4gIFlvdSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIGlucHV0IGZpbGU7IGlmIHlvdQotc3BlY2lmeSBtb3JlLCBAc2N7Z2FzcH0gcHJlcHJvY2Vzc2VzIHRoZW0gYWxsLCBjb25jYXRlbmF0aW5nIHRoZSBvdXRwdXQKLWluIHRoZSBvcmRlciB5b3UgbGlzdCB0aGUgQHZhcntpbmZpbGV9IGFyZ3VtZW50cy4KLQotTWFyayB0aGUgZW5kIG9mIGVhY2ggaW5wdXQgZmlsZSB3aXRoIHRoZSBwcmVwcm9jZXNzb3IgY29tbWFuZAotQGNvZGV7LkVORH0uICBAeHJlZntPdGhlciBDb21tYW5kcywsIE1pc2NlbGxhbmVvdXMgY29tbWFuZHN9LgotCi1AaXRlbSAtYQotQGl0ZW14IC0tYWx0ZXJuYXRlCi1Vc2UgYWx0ZXJuYXRpdmUgbWFjcm8gc3ludGF4LiAgQHhyZWZ7QWx0ZXJuYXRlLCwgQWx0ZXJuYXRlIG1hY3JvCi1zeW50YXh9LCBmb3IgYSBkaXNjdXNzaW9uIG9mIGhvdyB0aGlzIHN5bnRheCBkaWZmZXJzIGZyb20gdGhlIGRlZmF1bHQKLUBzY3tnYXNwfSBzeW50YXguCi0KLUBjaW5kZXggY29tbWVudCBjaGFyYWN0ZXIsIGNoYW5naW5nCi1AY2luZGV4IHNlbWljb2xvbiwgYXMgY29tbWVudAotQGNpbmRleCBleGNsYW1hdGlvbiBtYXJrLCBhcyBjb21tZW50Ci1AY2luZGV4IHNocmllaywgYXMgY29tbWVudAotQGNpbmRleCBiYW5nLCBhcyBjb21tZW50Ci1AY2luZGV4IEBjb2RleyF9IGRlZmF1bHQgY29tbWVudCBjaGFyCi1AY2luZGV4IEBjb2Rlezt9IGFzIGNvbW1lbnQgY2hhcgotQGl0ZW0gLWMgJ0B2YXJ7Y2hhcn0nCi1AaXRlbXggLS1jb21tZW50Y2hhciAnQHZhcntjaGFyfScKLVVzZSBAdmFye2NoYXJ9IGFzIHRoZSBjb21tZW50IGNoYXJhY3Rlci4gIFRoZSBkZWZhdWx0IGNvbW1lbnQgY2hhcmFjdGVyCi1pcyBAc2FtcHshfS4gIEZvciBleGFtcGxlLCB0byB1c2UgYSBzZW1pY29sb24gYXMgdGhlIGNvbW1lbnQgY2hhcmFjdGVyLAotc3BlY2lmeSBAd3tAc2FtcHstYyAnOyd9fSBvbiB0aGUgQHNje2dhc3B9IGNvbW1hbmQgbGluZS4gIFNpbmNlCi1hc3NlbWJsZXIgY29tbWFuZCBjaGFyYWN0ZXJzIG9mdGVuIGhhdmUgc3BlY2lhbCBzaWduaWZpY2FuY2UgdG8gY29tbWFuZAotc2hlbGxzLCBpdCBpcyBhIGdvb2QgaWRlYSB0byBxdW90ZSBvciBlc2NhcGUgQHZhcntjaGFyfSB3aGVuIHlvdSBzcGVjaWZ5Ci1hIGNvbW1lbnQgY2hhcmFjdGVyLgotCi1Gb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eSwgYWxsIGV4YW1wbGVzIGluIHRoaXMgbWFudWFsIHVzZSB0aGUgZGVmYXVsdAotY29tbWVudCBjaGFyYWN0ZXIgQHNhbXB7IX0uCi0KLUBpdGVtIC1kCi1AaXRlbXggLS1kZWJ1ZwotU2hvdyBkZWJ1Z2dpbmcgc3RhdGlzdGljcy4gIEluIHRoaXMgdmVyc2lvbiBvZiBAc2N7Z2FzcH0sIHRoaXMgb3B0aW9uCi1wcm9kdWNlcyBzdGF0aXN0aWNzIGFib3V0IHRoZSBzdHJpbmcgYnVmZmVycyB0aGF0IEBzY3tnYXNwfSBhbGxvY2F0ZXMKLWludGVybmFsbHkuICBGb3IgZWFjaCBkZWZpbmVkIGJ1ZmZlcnNpemUgQHZhcntzfSwgQHNje2dhc3B9IHNob3dzIHRoZQotbnVtYmVyIG9mIHN0cmluZ3MgQHZhcntufSB0aGF0IGl0IGFsbG9jYXRlZCwgd2l0aCBhIGxpbmUgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotc3RyaW5ncyBzaXplIEB2YXJ7c30gOiBAdmFye259Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1Ac2N7Z2FzcH0gZGlzcGxheXMgdGhlc2Ugc3RhdGlzdGljcyBvbiB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtLCB3aGVuCi1kb25lIHByZXByb2Nlc3NpbmcuCi0KLUBpdGVtIC1oCi1AaXRlbXggLS1oZWxwCi1EaXNwbGF5IGEgc3VtbWFyeSBvZiB0aGUgQHNje2dhc3B9IGNvbW1hbmQgbGluZSBvcHRpb25zLgotCi1AaXRlbSAtTQotQGl0ZW14IC0tbXJpCi1Vc2UgTVJJIGNvbXBhdGliaWxpdHkgbW9kZS4gIFVzaW5nIHRoaXMgb3B0aW9uIGNhdXNlcyBAc2N7Z2FzcH0gdG8KLWFjY2VwdCB0aGUgc3ludGF4IGFuZCBwc2V1ZG8tb3BzIHVzZWQgYnkgdGhlIE1pY3JvdGVjIFJlc2VhcmNoCi1AY29kZXtBU002OEt9IGFzc2VtYmxlci4KLQotQGl0ZW0gLW8gQHZhcntvdXRmaWxlfQotQGl0ZW14IC0tb3V0cHV0IEB2YXJ7b3V0ZmlsZX0KLVdyaXRlIHRoZSBvdXRwdXQgaW4gYSBmaWxlIGNhbGxlZCBAdmFye291dGZpbGV9LiAgSWYgeW91IGRvIG5vdCB1c2UgdGhlCi1Ac2FtcHstb30gb3B0aW9uLCBAc2N7Z2FzcH0gd3JpdGVzIGl0cyBvdXRwdXQgb24gdGhlIHN0YW5kYXJkIG91dHB1dAotc3RyZWFtLgotCi1AaXRlbSAtcAotQGl0ZW14IC0tcHJpbnQKLVByaW50IGxpbmUgbnVtYmVycy4gIEBzY3tnYXNwfSBvYmV5cyB0aGlzIG9wdGlvbiBAZW1waHtvbmx5fSBpZiB5b3UgYWxzbwotc3BlY2lmeSBAc2FtcHstc30gdG8gY29weSBzb3VyY2UgbGluZXMgdG8gaXRzIG91dHB1dC4gIFdpdGggQHNhbXB7LXMKLS1wfSwgQHNje2dhc3B9IGRpc3BsYXlzIHRoZSBsaW5lIG51bWJlciBvZiBlYWNoIHNvdXJjZSBsaW5lIGNvcGllZAotKGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjb21tZW50IGNoYXJhY3RlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lKS4KLQotQGl0ZW0gLXMKLUBpdGVteCAtLWNvcHlzb3VyY2UKLUNvcHkgdGhlIHNvdXJjZSBsaW5lcyB0byB0aGUgb3V0cHV0IGZpbGUuICBVc2UgdGhpcyBvcHRpb24KLXRvIHNlZSB0aGUgZWZmZWN0IG9mIGVhY2ggcHJlcHJvY2Vzc29yIGxpbmUgb24gdGhlIEBzY3tnYXNwfSBvdXRwdXQuCi1Ac2N7Z2FzcH0gcGxhY2VzIGEgY29tbWVudCBjaGFyYWN0ZXIgKEBzYW1weyF9IGJ5IGRlZmF1bHQpIGF0Ci10aGUgYmVnaW5uaW5nIG9mIGVhY2ggc291cmNlIGxpbmUgaXQgY29waWVzLCBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMKLW9wdGlvbiBhbmQgc3RpbGwgYXNzZW1ibGUgdGhlIHJlc3VsdC4KLQotQGl0ZW0gLXUKLUBpdGVteCAtLXVucmVhc29uYWJsZQotQnlwYXNzIGBgdW5yZWFzb25hYmxlIGV4cGFuc2lvbicnIGxpbWl0LiAgU2luY2UgeW91IGNhbiBkZWZpbmUgQHNje2dhc3B9Ci1tYWNyb3MgaW5zaWRlIG90aGVyIG1hY3JvIGRlZmluaXRpb25zLCB0aGUgcHJlcHJvY2Vzc29yIG5vcm1hbGx5Ci1pbmNsdWRlcyBhIHNhbml0eSBjaGVjay4gIElmIHlvdXIgcHJvZ3JhbSByZXF1aXJlcyBtb3JlIHRoYW4gMSwwMDAKLW5lc3RlZCBleHBhbnNpb25zLCBAc2N7Z2FzcH0gbm9ybWFsbHkgZXhpdHMgd2l0aCBhbiBlcnJvciBtZXNzYWdlLiAgVXNlCi10aGlzIG9wdGlvbiB0byB0dXJuIG9mZiB0aGlzIGNoZWNrLCBhbGxvd2luZyB1bmxpbWl0ZWQgbmVzdGVkCi1leHBhbnNpb25zLgotCi1AaXRlbSAtdgotQGl0ZW14IC0tdmVyc2lvbgotRGlzcGxheSB0aGUgQHNje2dhc3B9IHZlcnNpb24gbnVtYmVyLgotQGVuZCBmdGFibGUKLQotQG5vZGUgQ29tbWFuZHMKLUBjaGFwdGVyIFByZXByb2Nlc3NvciBDb21tYW5kcwotCi1Ac2N7Z2FzcH0gY29tbWFuZHMgaGF2ZSBhIHN0cmFpZ2h0Zm9yd2FyZCBzeW50YXggdGhhdCBmaXRzIGluIHdlbGwgd2l0aAotYXNzZW1ibHkgY29udmVudGlvbnMuICBJbiBnZW5lcmFsLCBhIGNvbW1hbmQgZXh0ZW5kcyBmb3IgYSBsaW5lLCBhbmQgbWF5Ci1oYXZlIHVwIHRvIHRocmVlIGZpZWxkczogYW4gb3B0aW9uYWwgbGFiZWwsIHRoZSBjb21tYW5kIGl0c2VsZiwgYW5kCi1vcHRpb25hbCBhcmd1bWVudHMgdG8gdGhlIGNvbW1hbmQuICBZb3UgY2FuIHdyaXRlIGNvbW1hbmRzIGluIHVwcGVyIG9yCi1sb3dlciBjYXNlLCB0aG91Z2ggdGhpcyBtYW51YWwgc2hvd3MgdGhlbSBpbiB1cHBlciBjYXNlLiAgQHhyZWZ7U3ludGF4Ci1EZXRhaWxzLCwgRGV0YWlscyBvZiB0aGUgR0FTUCBzeW50YXh9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQG1lbnUKLSogQ29uZGl0aW9uYWxzOjoKLSogTG9vcHM6OgotKiBWYXJpYWJsZXM6OgotKiBNYWNyb3M6OgotKiBEYXRhOjoKLSogTGlzdGluZ3M6OgotKiBPdGhlciBDb21tYW5kczo6Ci0qIFN5bnRheCBEZXRhaWxzOjoKLSogQWx0ZXJuYXRlOjoKLUBlbmQgbWVudQotCi1Abm9kZSBDb25kaXRpb25hbHMKLUBzZWN0aW9uIENvbmRpdGlvbmFsIGFzc2VtYmx5Ci0KLVRoZSBjb25kaXRpb25hbC1hc3NlbWJseSBkaXJlY3RpdmVzIGFsbG93IHlvdSB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUKLXBvcnRpb25zIG9mIGFuIGFzc2VtYmx5IGRlcGVuZGluZyBvbiBob3cgYSBwYWlyIG9mIGV4cHJlc3Npb25zLCBvciBhCi1wYWlyIG9mIHN0cmluZ3MsIGNvbXBhcmUuCi0KLVRoZSBvdmVyYWxsIHN0cnVjdHVyZSBvZiBjb25kaXRpb25hbHMgaXMgZmFtaWxpYXIgZnJvbSBtYW55IG90aGVyCi1jb250ZXh0cy4gIEBjb2Rley5BSUZ9IG1hcmtzIHRoZSBzdGFydCBvZiBhIGNvbmRpdGlvbmFsLCBhbmQgcHJlY2VkZXMKLWFzc2VtYmx5IGZvciB0aGUgY2FzZSB3aGVuIHRoZSBjb25kaXRpb24gaXMgdHJ1ZS4gICBBbiBvcHRpb25hbAotQGNvZGV7LkFFTFNFfSBwcmVjZWRlcyBhc3NlbWJseSBmb3IgdGhlIGNvbnZlcnNlIGNhc2UsIGFuZCBhbgotQGNvZGV7LkFFTkRJfSBtYXJrcyB0aGUgZW5kIG9mIHRoZSBjb25kaXRpb24uCi0KLUBjIEZJWE1FISBXaHkgZG9lc24ndCAtdSB0dXJuIG9mZiB0aGlzIGNoZWNrPwotWW91IG1heSBuZXN0IGNvbmRpdGlvbmFscyB1cCB0byBhIGRlcHRoIG9mIDEwMDsgQHNje2dhc3B9IHJlamVjdHMKLW5lc3RpbmcgYmV5b25kIHRoYXQsIGJlY2F1c2UgaXQgbWF5IGluZGljYXRlIGEgYnVnIGluIHlvdXIgbWFjcm8KLXN0cnVjdHVyZS4KLQotQGMgRklYTUUhIFdoeSBpc24ndCB0aGVyZSBzb21ldGhpbmcgbGlrZSBjcHAncyAtRCBvcHRpb24/ICBDb25kaXRpb25hbHMKLUBjICAgICAgICB3b3VsZCBiZSBtdWNoIG1vcmUgdXNlZnVsIGlmIHRoZXJlIHdlcmUuCi1Db25kaXRpb25hbHMgYXJlIHByaW1hcmlseSB1c2VmdWwgaW5zaWRlIG1hY3JvIGRlZmluaXRpb25zLCB3aGVyZSB5b3UKLW9mdGVuIG5lZWQgZGlmZmVyZW50IGVmZmVjdHMgZGVwZW5kaW5nIG9uIGFyZ3VtZW50IHZhbHVlcy4KLUB4cmVme01hY3JvcywsIERlZmluaW5nIHlvdXIgb3duIGRpcmVjdGl2ZXN9LCBmb3IgZGV0YWlscyBhYm91dCBkZWZpbmluZwotbWFjcm9zLgotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAuQUlGIEB2YXJ7ZXhwcmF9IEB2YXJ7Y21wfSBAdmFye2V4cHJifQotQGl0ZW14IC5BSUYgIkB2YXJ7c3RyYX0iIEB2YXJ7Y21wfSAiQHZhcntzdHJifSIKLQotVGhlIGdvdmVybmluZyBjb25kaXRpb24gZ29lcyBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBAY29kZXsuQUlGfQotcHJlcHJvY2Vzc29yIGNvbW1hbmQuICBZb3UgbWF5IGNvbXBhcmUgZWl0aGVyIHR3byBzdHJpbmdzLCBvciB0d28KLWV4cHJlc3Npb25zLgotCi1XaGVuIHlvdSBjb21wYXJlIHN0cmluZ3MsIG9ubHkgdHdvIGNvbmRpdGlvbmFsIEB2YXJ7Y21wfSBjb21wYXJpc29uCi1vcGVyYXRvcnMgYXJlIGF2YWlsYWJsZTogQHNhbXB7RVF9ICh0cnVlIGlmIEB2YXJ7c3RyYX0gYW5kIEB2YXJ7c3RyYn0KLWFyZSBpZGVudGljYWwpLCBhbmQgQHNhbXB7TkV9ICh0aGUgb3Bwb3NpdGUpLgotCi1XaGVuIHlvdSBjb21wYXJlIHR3byBleHByZXNzaW9ucywgQGVtcGh7Ym90aCBleHByZXNzaW9ucyBtdXN0IGJlCi1hYnNvbHV0ZX0gKEBweHJlZntFeHByZXNzaW9ucywsIEFyaXRobWV0aWMgZXhwcmVzc2lvbnMgaW4gR0FTUH0pLiAgWW91Ci1jYW4gdXNlIHRoZXNlIEB2YXJ7Y21wfSBjb21wYXJpc29uIG9wZXJhdG9ycyB3aXRoIGV4cHJlc3Npb25zOgotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSBFUQotQXJlIEB2YXJ7ZXhwcmF9IGFuZCBAdmFye2V4cHJifSBlcXVhbD8gIChGb3Igc3RyaW5ncywgYXJlIEB2YXJ7c3RyYX0gYW5kCi1AdmFye3N0cmJ9IGlkZW50aWNhbD8pCi0KLUBpdGVtIE5FCi1BcmUgQHZhcntleHByYX0gYW5kIEB2YXJ7ZXhwcmJ9IGRpZmZlcmVudD8gIChGb3Igc3RyaW5ncywgYXJlIEB2YXJ7c3RyYX0KLWFuZCBAdmFye3N0cmJ9IGRpZmZlcmVudD8KLQotQGl0ZW0gTFQKLUlzIEB2YXJ7ZXhwcmF9IGxlc3MgdGhhbiBAdmFye2V4cHJifT8gIChOb3QgYWxsb3dlZCBmb3Igc3RyaW5ncy4pCi0KLUBpdGVtIExFCi1JcyBAdmFye2V4cHJhfSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gQHZhcntleHByYn0/ICAoTm90IGFsbG93ZWQgZm9yIHN0cmluZ3MuKQotCi1AaXRlbSBHVAotSXMgQHZhcntleHByYX0gZ3JlYXRlciB0aGFuIEB2YXJ7ZXhwcmJ9PyAgKE5vdCBhbGxvd2VkIGZvciBzdHJpbmdzLikKLQotQGl0ZW0gR0UKLUlzIEB2YXJ7ZXhwcmF9IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBAdmFye2V4cHJifT8gIChOb3QgYWxsb3dlZCBmb3IKLXN0cmluZ3MuKQotQGVuZCBmdGFibGUKLQotQGl0ZW0gLkFFTFNFCi1NYXJrcyB0aGUgc3RhcnQgb2YgYXNzZW1ibHkgY29kZSB0byBiZSBpbmNsdWRlZCBpZiB0aGUgY29uZGl0aW9uIGZhaWxzLgotT3B0aW9uYWwsIGFuZCBvbmx5IGFsbG93ZWQgd2l0aGluIGEgY29uZGl0aW9uYWwgKGJldHdlZW4gQGNvZGV7LkFJRn0gYW5kCi1AY29kZXsuQUVOREl9KS4KLQotQGl0ZW0gLkFFTkRJCi1NYXJrcyB0aGUgZW5kIG9mIGEgY29uZGl0aW9uYWwgYXNzZW1ibHkuCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBMb29wcwotQHNlY3Rpb24gUmVwZXRpdGl2ZSBzZWN0aW9ucyBvZiBhc3NlbWJseQotCi1Ud28gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgYWxsb3cgeW91IHRvIHJlcGVhdGVkbHkgaXNzdWUgY29waWVzIG9mIHRoZQotc2FtZSBibG9jayBvZiBhc3NlbWJseSBjb2RlLgotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAuQVJFUEVBVCBAdmFye2FleHB9Ci1AaXRlbXggLkFFTkRSCi1JZiB5b3Ugc2ltcGx5IG5lZWQgdG8gcmVwZWF0IHRoZSBzYW1lIGJsb2NrIG9mIGFzc2VtYmx5IG92ZXIgYW5kIG92ZXIgYQotZml4ZWQgbnVtYmVyIG9mIHRpbWVzLCBzYW5kd2ljaCBvbmUgaW5zdGFuY2Ugb2YgdGhlIHJlcGVhdGVkIGJsb2NrCi1iZXR3ZWVuIEBjb2Rley5BUkVQRUFUfSBhbmQgQGNvZGV7LkFFTkRSfS4gIFNwZWNpZnkgdGhlIG51bWJlciBvZgotY29waWVzIGFzIEB2YXJ7YWV4cH0gKHdoaWNoIG11c3QgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbikuICBGb3IKLWV4YW1wbGUsIHRoaXMgcmVwZWF0cyB0d28gYXNzZW1ibHkgc3RhdGVtZW50cyB0aHJlZSB0aW1lcyBpbiBzdWNjZXNzaW9uOgotCi1AY2FydG91Y2hlCi1AZXhhbXBsZQotICAgICAgICAuQVJFUEVBVCAgICAgICAgMwotICAgICAgICByb3RjbCAgIHIyCi0gICAgICAgIGRpdjEgICAgcjAscjEKLSAgICAgICAgLkFFTkRSCi1AZW5kIGV4YW1wbGUKLUBlbmQgY2FydG91Y2hlCi0KLUBpdGVtIC5BV0hJTEUgQHZhcntleHByYX0gQHZhcntjbXB9IEB2YXJ7ZXhwcmJ9Ci1AaXRlbXggLkFFTkRXCi1AaXRlbXggLkFXSElMRSBAdmFye3N0cmF9IEB2YXJ7Y21wfSBAdmFye3N0cmJ9Ci1AaXRlbXggLkFFTkRXCi1UbyByZXBlYXQgYSBibG9jayBvZiBhc3NlbWJseSBkZXBlbmRpbmcgb24gYSBjb25kaXRpb25hbCB0ZXN0LCByYXRoZXIKLXRoYW4gcmVwZWF0aW5nIGl0IGZvciBhIHNwZWNpZmljIG51bWJlciBvZiB0aW1lcywgdXNlIEBjb2Rley5BV0hJTEV9LgotQGNvZGV7LkFFTkRXfSBtYXJrcyB0aGUgZW5kIG9mIHRoZSByZXBlYXRlZCBibG9jay4gIFRoZSBjb25kaXRpb25hbAotY29tcGFyaXNvbiB3b3JrcyBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyBmb3IgQGNvZGV7LkFJRn0sIHdpdGggdGhlIHNhbWUKLWNvbXBhcmlzb24gb3BlcmF0b3JzIChAcHhyZWZ7Q29uZGl0aW9uYWxzLCwgQ29uZGl0aW9uYWwgYXNzZW1ibHl9KS4KLQotU2luY2UgdGhlIHRlcm1zIG9mIHRoZSBjb21wYXJpc29uIG11c3QgYmUgYWJzb2x1dGUgZXhwcmVzc2lvbiwKLUBjb2Rley5BV0hJTEV9IGlzIHByaW1hcmlseSB1c2VmdWwgd2l0aGluIG1hY3Jvcy4gIEB4cmVme01hY3JvcywsCi1EZWZpbmluZyB5b3VyIG93biBkaXJlY3RpdmVzfS4KLUBlbmQgZnRhYmxlCi0KLUBjaW5kZXggbG9vcHMsIGJyZWFraW5nIG91dCBvZgotQGNpbmRleCBicmVha2luZyBvdXQgb2YgbG9vcHMKLVlvdSBjYW4gdXNlIHRoZSBAY29kZXsuRVhJVE19IHByZXByb2Nlc3NvciBkaXJlY3RpdmUgdG8gYnJlYWsgb3V0IG9mCi1sb29wcyBlYXJseSAoYXMgd2VsbCBhcyB0byBicmVhayBvdXQgb2YgbWFjcm9zKS4gIEB4cmVme01hY3JvcywsCi1EZWZpbmluZyB5b3VyIG93biBkaXJlY3RpdmVzfS4KLQotQG5vZGUgVmFyaWFibGVzCi1Ac2VjdGlvbiBQcmVwcm9jZXNzb3IgdmFyaWFibGVzCi0KLVlvdSBjYW4gdXNlIHZhcmlhYmxlcyBpbiBAc2N7Z2FzcH0gdG8gcmVwcmVzZW50IHN0cmluZ3MsIHJlZ2lzdGVycywgb3IKLXRoZSByZXN1bHRzIG9mIGV4cHJlc3Npb25zLgotCi1Zb3UgbXVzdCBkaXN0aW5ndWlzaCB0d28ga2luZHMgb2YgdmFyaWFibGVzOiAKLUBlbnVtZXJhdGUKLUBpdGVtCi1WYXJpYWJsZXMgZGVmaW5lZCB3aXRoIEBjb2Rley5FUVV9IG9yIEBjb2Rley5BU1NJR059LiAgVG8gZXZhbHVhdGUgdGhpcwota2luZCBvZiB2YXJpYWJsZSBpbiB5b3VyIGFzc2VtYmx5IG91dHB1dCwgc2ltcGx5IG1lbnRpb24gaXRzIG5hbWUuICBGb3IKLWV4YW1wbGUsIHRoZXNlIHR3byBsaW5lcyBkZWZpbmUgYW5kIHVzZSBhIHZhcmlhYmxlIEBzYW1we2VnfToKLQotQGNhcnRvdWNoZQotQGV4YW1wbGUKLWVnICAgICAuRVFVICAgRkxJUC02NAotICAgICAgIEBkb3Rze30KLSAgICAgICBtb3YubCAgZWcscjAKLUBlbmQgZXhhbXBsZQotQGVuZCBjYXJ0b3VjaGUKLQotQGVtcGh7RG8gbm90IHVzZX0gdGhpcyBraW5kIG9mIHZhcmlhYmxlIGluIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zIG9yCi13aGlsZSBsb29wczsgQHNje2dhc3B9IG9ubHkgZXZhbHVhdGVzIHRoZXNlIHZhcmlhYmxlcyB3aGVuIHdyaXRpbmcKLWFzc2VtYmx5IG91dHB1dC4KLQotQGl0ZW0KLVZhcmlhYmxlcyBmb3IgdXNlIGR1cmluZyBwcmVwcm9jZXNzaW5nLiAgWW91IGNhbiBkZWZpbmUgdGhlc2UKLXdpdGggQGNvZGV7LkFTU0lHTkN9IG9yIEBjb2Rley5BU1NJR05BfS4gIFRvIGV2YWx1YXRlIHRoaXMKLWtpbmQgb2YgdmFyaWFibGUsIHdyaXRlIEBzYW1we1wmfSBiZWZvcmUgdGhlIHZhcmlhYmxlIG5hbWU7IGZvciBleGFtcGxlLAotCi1AY2FydG91Y2hlCi1AZXhhbXBsZQotb3BjaXQgIC5BU1NJR05BICA0NwotICAgICAgIEBkb3Rze30KLSAgICAgICAuQVdISUxFICBcJm9wY2l0IEdUIDAKLSAgICAgICBAZG90c3t9Ci0gICAgICAgLkFFTkRXCi1AZW5kIGV4YW1wbGUKLUBlbmQgY2FydG91Y2hlCi0KLUBzY3tnYXNwfSB0cmVhdHMgbWFjcm8gYXJndW1lbnRzIGFsbW9zdCB0aGUgc2FtZSB3YXksIGJ1dCB0byBldmFsdWF0ZQotdGhlbSB5b3UgdXNlIHRoZSBwcmVmaXggQHNhbXB7XH0gcmF0aGVyIHRoYW4gQHNhbXB7XCZ9LgotQHhyZWZ7TWFjcm9zLCwgRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlc30uCi1AZW5kIGVudW1lcmF0ZQotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSBAdmFye3B2YXJ9IC5FUVUgQHZhcntleHByfQotQGMgRklYTUUhICBBbnl0aGluZyB0byBiZXdhcmUgb2YgcmUgR0FTIGRpcmVjdGl2ZSBvZiBzYW1lIG5hbWU/Ci1Bc3NpZ24gcHJlcHJvY2Vzc29yIHZhcmlhYmxlIEB2YXJ7cHZhcn0gdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uCi1AdmFye2V4cHJ9LiAgVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiByZWRlZmluaXRpb247IHVzZSBAc2FtcHsuRVFVfQotd2l0aCB0aGUgc2FtZSBAdmFye3B2YXJ9IGFzIG9mdGVuIGFzIHlvdSBmaW5kIGl0IGNvbnZlbmllbnQuCi0KLUBpdGVtIEB2YXJ7cHZhcn0gLkFTU0lHTiBAdmFye2V4cHJ9Ci1BbG1vc3QgdGhlIHNhbWUgYXMgQGNvZGV7LkVRVX0sIHNhdmUgdGhhdCB5b3UgbWF5IG5vdCByZWRlZmluZQotQHZhcntwdmFyfSB1c2luZyBAY29kZXsuQVNTSUdOfSBvbmNlIGl0IGhhcyBhIHZhbHVlLgotQGMgRklYTUUhISAgU3VwcG9zZWQgdG8gd29yayB0aGlzIHdheSwgYXBwYXJlbnRseSwgYnV0IG9uIDlmZWI5NCB3b3JrcwotQGMgICAgICAgICAganVzdCBsaWtlIC5FUVUKLQotQGl0ZW0gQHZhcntwdmFyfSAuQVNTSUdOQSBAdmFye2FleHByfQotRGVmaW5lIGEgdmFyaWFibGUgd2l0aCBhIG51bWVyaWMgdmFsdWUsIGZvciB1c2UgZHVyaW5nIHByZXByb2Nlc3NpbmcuCi1AdmFye2FleHByfSBtdXN0IGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24uICBZb3UgY2FuIHJlZGVmaW5lIHZhcmlhYmxlcwotd2l0aCBAY29kZXsuQVNTSUdOQX0gYXQgYW55IHRpbWUuCi0KLUBpdGVtIEB2YXJ7cHZhcn0gLkFTU0lHTkMgIkB2YXJ7c3RyfSIKLURlZmluZSBhIHZhcmlhYmxlIHdpdGggYSBzdHJpbmcgdmFsdWUsIGZvciB1c2UgZHVyaW5nIHByZXByb2Nlc3NpbmcuCi1Zb3UgY2FuIHJlZGVmaW5lIHZhcmlhYmxlcyB3aXRoIEBjb2Rley5BU1NJR05DfSBhdCBhbnkgdGltZS4KLQotQGl0ZW0gQHZhcntwdmFyfSAuUkVHIChAdmFye3JlZ2lzdGVyfSkKLVVzZSBAY29kZXsuUkVHfSB0byBkZWZpbmUgYSB2YXJpYWJsZSB0aGF0IHJlcHJlc2VudHMgYSByZWdpc3Rlci4gIEluCi1wYXJ0aWN1bGFyLCBAdmFye3JlZ2lzdGVyfSBpcyBAZW1waHtub3QgZXZhbHVhdGVkfSBhcyBhbiBleHByZXNzaW9uLgotWW91IG1heSB1c2UgQGNvZGV7LlJFR30gYXQgd2lsbCB0byByZWRlZmluZSByZWdpc3RlciB2YXJpYWJsZXMuCi1AZW5kIGZ0YWJsZQotCi1BbGwgdGhlc2UgZGlyZWN0aXZlcyBhY2NlcHQgdGhlIHZhcmlhYmxlIG5hbWUgaW4gdGhlIGBgbGFiZWwnJyBwb3NpdGlvbiwKLXRoYXQgaXMgYXQgdGhlIGxlZnQgbWFyZ2luLiAgWW91IG1heSBzcGVjaWZ5IGEgY29sb24gYWZ0ZXIgdGhlIHZhcmlhYmxlCi1uYW1lIGlmIHlvdSB3aXNoOyB0aGUgZmlyc3QgZXhhbXBsZSBhYm92ZSBjb3VsZCBoYXZlIHN0YXJ0ZWQgQHNhbXB7ZWc6fQotd2l0aCB0aGUgc2FtZSBlZmZlY3QuCi0KLUBjIHBhZ2VicmVhayBtYWtlcyBmb3IgYmV0dGVyIGFlc3RoZXRpY3MtLS1lbnN1cmVzIG1hY3JvIGFuZCBleHBhbnNpb24gdG9nZXRoZXIKLUBwYWdlCi1Abm9kZSBNYWNyb3MKLUBzZWN0aW9uIERlZmluaW5nIHlvdXIgb3duIGRpcmVjdGl2ZXMKLQotVGhlIGNvbW1hbmRzIEBjb2Rley5NQUNST30gYW5kIEBjb2Rley5FTkRNfSBhbGxvdyB5b3UgdG8gZGVmaW5lIG1hY3JvcwotdGhhdCBnZW5lcmF0ZSBhc3NlbWJseSBvdXRwdXQuICBZb3UgY2FuIHVzZSB0aGVzZSBtYWNyb3Mgd2l0aCBhIHN5bnRheAotc2ltaWxhciB0byBidWlsdC1pbiBAc2N7Z2FzcH0gb3IgYXNzZW1ibGVyIGRpcmVjdGl2ZXMuICBGb3IgZXhhbXBsZSwKLXRoaXMgZGVmaW5pdGlvbiBzcGVjaWZpZXMgYSBtYWNybyBAY29kZXtTVU19IHRoYXQgYWRkcyB0b2dldGhlciBhIHJhbmdlIG9mCi1jb25zZWN1dGl2ZSByZWdpc3RlcnM6Ci0KLUBjYXJ0b3VjaGUKLUBleGFtcGxlCi0gICAgICAgIC5NQUNSTyAgU1VNIEZST009MCwgVE89OQotICAgICAgICAhIFxGUk9NIFxUTwotICAgICAgICBtb3YgICAgIHJcRlJPTSxyMTAKLUNPVU5UICAgLkFTU0lHTkEgICAgICAgIFxGUk9NKzEKLSAgICAgICAgLkFXSElMRSBcJkNPVU5UIExFIFxUTwotICAgICAgICBhZGQgICAgIHJcJkNPVU5ULHIxMAotQ09VTlQgICAuQVNTSUdOQSAgICAgICAgXCZDT1VOVCsxCi0gICAgICAgIC5BRU5EVwotICAgICAgICAuRU5ETQotQGVuZCBleGFtcGxlCi1AZW5kIGNhcnRvdWNoZQotCi1Abm9pbmRlbnQKLVdpdGggdGhhdCBkZWZpbml0aW9uLCBAc2FtcHtTVU0gMCw1fSBnZW5lcmF0ZXMgdGhpcyBhc3NlbWJseSBvdXRwdXQ6Ci0KLUBjYXJ0b3VjaGUKLUBleGFtcGxlCi0gICAgICAgICEgMCA1Ci0gICAgICAgIG1vdiAgICAgcjAscjEwCi0gICAgICAgIGFkZCAgICAgcjEscjEwCi0gICAgICAgIGFkZCAgICAgcjIscjEwCi0gICAgICAgIGFkZCAgICAgcjMscjEwCi0gICAgICAgIGFkZCAgICAgcjQscjEwCi0gICAgICAgIGFkZCAgICAgcjUscjEwCi1AZW5kIGV4YW1wbGUKLUBlbmQgY2FydG91Y2hlCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5NQUNSTyBAdmFye21hY25hbWV9Ci1AaXRlbXggLk1BQ1JPIEB2YXJ7bWFjbmFtZX0gQHZhcnttYWNhcmdzfSBAZG90c3t9Ci1CZWdpbiB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAdmFye21hY25hbWV9LiAgSWYgeW91ciBtYWNybwotZGVmaW5pdGlvbiByZXF1aXJlcyBhcmd1bWVudHMsIHNwZWNpZnkgdGhlaXIgbmFtZXMgYWZ0ZXIgdGhlIG1hY3JvIG5hbWUsCi1zZXBhcmF0ZWQgYnkgY29tbWFzIG9yIHNwYWNlcy4gIFlvdSBjYW4gc3VwcGx5IGEgZGVmYXVsdCB2YWx1ZSBmb3IgYW55Ci1tYWNybyBhcmd1bWVudCBieSBmb2xsb3dpbmcgdGhlIG5hbWUgd2l0aCBAc2FtcHs9QHZhcntkZWZsdH19LiAgRm9yCi1leGFtcGxlLCB0aGVzZSBhcmUgYWxsIHZhbGlkIEBjb2Rley5NQUNST30gc3RhdGVtZW50czoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAuTUFDUk8gQ09NTQotQmVnaW4gdGhlIGRlZmluaXRpb24gb2YgYSBtYWNybyBjYWxsZWQgQGNvZGV7Q09NTX0sIHdoaWNoIHRha2VzIG5vCi1hcmd1bWVudHMuCi0KLUBpdGVtIC5NQUNSTyBQTFVTMSBQLCBQMQotQGl0ZW14IC5NQUNSTyBQTFVTMSBQIFAxCi1FaXRoZXIgc3RhdGVtZW50IGJlZ2lucyB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAY29kZXtQTFVTMX0sCi13aGljaCB0YWtlcyB0d28gYXJndW1lbnRzOyB3aXRoaW4gdGhlIG1hY3JvIGRlZmluaXRpb24sIHdyaXRlCi1Ac2FtcHtcUH0gb3IgQHNhbXB7XFAxfSB0byBldmFsdWF0ZSB0aGUgYXJndW1lbnRzLgotCi1AaXRlbSAuTUFDUk8gUkVTRVJWRV9TVFIgUDE9MCBQMgotQmVnaW4gdGhlIGRlZmluaXRpb24gb2YgYSBtYWNybyBjYWxsZWQgQGNvZGV7UkVTRVJWRV9TVFJ9LCB3aXRoIHR3bwotYXJndW1lbnRzLiAgVGhlIGZpcnN0IGFyZ3VtZW50IGhhcyBhIGRlZmF1bHQgdmFsdWUsIGJ1dCBub3QgdGhlIHNlY29uZC4KLUFmdGVyIHRoZSBkZWZpbml0aW9uIGlzIGNvbXBsZXRlLCB5b3UgY2FuIGNhbGwgdGhlIG1hY3JvIGVpdGhlciBhcwotQHNhbXB7UkVTRVJWRV9TVFIgQHZhcnthfSxAdmFye2J9fSAod2l0aCBAc2FtcHtcUDF9IGV2YWx1YXRpbmcgdG8KLUB2YXJ7YX0gYW5kIEBzYW1we1xQMn0gZXZhbHVhdGluZyB0byBAdmFye2J9KSwgb3IgYXMgQHNhbXB7UkVTRVJWRV9TVFIKLSxAdmFye2J9fSAod2l0aCBAc2FtcHtcUDF9IGV2YWx1YXRpbmcgYXMgdGhlIGRlZmF1bHQsIGluIHRoaXMgY2FzZQotQHNhbXB7MH0sIGFuZCBAc2FtcHtcUDJ9IGV2YWx1YXRpbmcgdG8gQHZhcntifSkuCi1AZW5kIHRhYmxlCi0KLVdoZW4geW91IGNhbGwgYSBtYWNybywgeW91IGNhbiBzcGVjaWZ5IHRoZSBhcmd1bWVudCB2YWx1ZXMgZWl0aGVyIGJ5Ci1wb3NpdGlvbiwgb3IgYnkga2V5d29yZC4gIEZvciBleGFtcGxlLCBAc2FtcHtTVU0gOSwxN30gaXMgZXF1aXZhbGVudCB0bwotQHNhbXB7U1VNIFRPPTE3LCBGUk9NPTl9LiAgTWFjcm8gYXJndW1lbnRzIGFyZSBwcmVwcm9jZXNzb3IgdmFyaWFibGVzCi1zaW1pbGFyIHRvIHRoZSB2YXJpYWJsZXMgeW91IGRlZmluZSB3aXRoIEBzYW1wey5BU1NJR05BfSBvcgotQHNhbXB7LkFTU0lHTkN9OyBpbiBwYXJ0aWN1bGFyLCB5b3UgY2FuIHVzZSB0aGVtIGluIGNvbmRpdGlvbmFscyBvciBmb3IKLWxvb3AgY29udHJvbC4gIChUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRoZSBwcmVmaXggeW91IHdyaXRlIHRvIGV2YWx1YXRlCi10aGUgdmFyaWFibGU6IGZvciBhIG1hY3JvIGFyZ3VtZW50LCB3cml0ZSBAc2FtcHtcQHZhcnthcmduYW1lfX0sIGJ1dCBmb3IKLWEgcHJlcHJvY2Vzc29yIHZhcmlhYmxlLCB3cml0ZSBAc2FtcHtcJkB2YXJ7dmFybmFtZX19LikKLQotQGl0ZW0gQHZhcntuYW1lfSAuTUFDUk8KLUBpdGVteCBAdmFye25hbWV9IC5NQUNSTyAoIEB2YXJ7bWFjYXJnc30gQGRvdHN7fSApCi1AYyBGSVhNRSBjaGVjazogSSB0aGluayBubyBlcnJvciBfYW5kXyBubyBhcmdzIHJlY29nbml6ZWQgaWYgSSB1c2UgZm9ybQotQGMgICAgICAgTkFNRSAgLk1BQ1JPICAgQVJHIEFSRwotQW4gYWx0ZXJuYXRpdmUgZm9ybSBvZiBpbnRyb2R1Y2luZyBhIG1hY3JvIGRlZmluaXRpb246IHNwZWNpZnkgdGhlIG1hY3JvCi1uYW1lIGluIHRoZSBsYWJlbCBwb3NpdGlvbiwgYW5kIHRoZSBhcmd1bWVudHMgKGlmIGFueSkgYmV0d2VlbgotcGFyZW50aGVzZXMgYWZ0ZXIgdGhlIG5hbWUuICBEZWZhdWx0aW5nIHJ1bGVzIGFuZCB1c2FnZSB3b3JrIHRoZSBzYW1lCi13YXkgYXMgZm9yIHRoZSBvdGhlciBtYWNybyBkZWZpbml0aW9uIHN5bnRheC4KLQotQGl0ZW0gLkVORE0KLU1hcmsgdGhlIGVuZCBvZiBhIG1hY3JvIGRlZmluaXRpb24uCi0KLUBpdGVtIC5FWElUTQotRXhpdCBlYXJseSBmcm9tIHRoZSBjdXJyZW50IG1hY3JvIGRlZmluaXRpb24sIEBjb2Rley5BUkVQRUFUfSBsb29wLCBvcgotQGNvZGV7LkFXSElMRX0gbG9vcC4KLQotQGNpbmRleCBudW1iZXIgb2YgbWFjcm9zIGV4ZWN1dGVkCi1AY2luZGV4IG1hY3JvcywgY291bnQgZXhlY3V0ZWQKLUBpdGVtIFxAQAotQHNje2dhc3B9IG1haW50YWlucyBhIGNvdW50ZXIgb2YgaG93IG1hbnkgbWFjcm9zIGl0IGhhcwotZXhlY3V0ZWQgaW4gdGhpcyBwc2V1ZG8tdmFyaWFibGU7IHlvdSBjYW4gY29weSB0aGF0IG51bWJlciB0byB5b3VyCi1vdXRwdXQgd2l0aCBAc2FtcHtcQEB9LCBidXQgQGVtcGh7b25seSB3aXRoaW4gYSBtYWNybyBkZWZpbml0aW9ufS4KLQotQGl0ZW0gTE9DQUwgQHZhcntuYW1lfSBbICwgQGRvdHN7fSBdCi1AZW1waHtXYXJuaW5nOiBAY29kZXtMT0NBTH0gaXMgb25seSBhdmFpbGFibGUgaWYgeW91IHNlbGVjdCBgYGFsdGVybmF0ZQotbWFjcm8gc3ludGF4Jycgd2l0aCBAc2FtcHstYX0gb3IgQHNhbXB7LS1hbHRlcm5hdGV9Ln0gIEB4cmVme0FsdGVybmF0ZSwsCi1BbHRlcm5hdGUgbWFjcm8gc3ludGF4fS4KLQotR2VuZXJhdGUgYSBzdHJpbmcgcmVwbGFjZW1lbnQgZm9yIGVhY2ggb2YgdGhlIEB2YXJ7bmFtZX0gYXJndW1lbnRzLCBhbmQKLXJlcGxhY2UgYW55IGluc3RhbmNlcyBvZiBAdmFye25hbWV9IGluIGVhY2ggbWFjcm8gZXhwYW5zaW9uLiAgVGhlCi1yZXBsYWNlbWVudCBzdHJpbmcgaXMgdW5pcXVlIGluIHRoZSBhc3NlbWJseSwgYW5kIGRpZmZlcmVudCBmb3IgZWFjaAotc2VwYXJhdGUgbWFjcm8gZXhwYW5zaW9uLiAgQGNvZGV7TE9DQUx9IGFsbG93cyB5b3UgdG8gd3JpdGUgbWFjcm9zIHRoYXQKLWRlZmluZSBzeW1ib2xzLCB3aXRob3V0IGZlYXIgb2YgY29uZmxpY3QgYmV0d2VlbiBzZXBhcmF0ZSBtYWNybyBleHBhbnNpb25zLgotQGVuZCBmdGFibGUKLQotQG5vZGUgRGF0YQotQHNlY3Rpb24gRGF0YSBvdXRwdXQKLQotSW4gYXNzZW1ibHkgY29kZSwgeW91IG9mdGVuIG5lZWQgdG8gc3BlY2lmeSB3b3JraW5nIGFyZWFzIG9mIG1lbW9yeTsKLWRlcGVuZGluZyBvbiB0aGUgYXBwbGljYXRpb24sIHlvdSBtYXkgd2FudCB0byBpbml0aWFsaXplIHN1Y2ggbWVtb3J5IG9yCi1ub3QuICBAc2N7Z2FzcH0gcHJvdmlkZXMgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgdG8gaGVscCB5b3UgYXZvaWQKLXJlcGV0aXRpdmUgY29kaW5nIGZvciBib3RoIHB1cnBvc2VzLgotCi1Zb3UgY2FuIHVzZSBsYWJlbHMgYXMgdXN1YWwgdG8gbWFyayB0aGUgZGF0YSBhcmVhcy4KLQotQG1lbnUKLSogSW5pdGlhbGl6ZWQ6OgotKiBVbmluaXRpYWxpemVkOjoKLUBlbmQgbWVudQotCi1Abm9kZSBJbml0aWFsaXplZAotQHN1YnNlY3Rpb24gSW5pdGlhbGl6ZWQgZGF0YQotCi1UaGVzZSBhcmUgdGhlIEBzY3tnYXNwfSBkaXJlY3RpdmVzIGZvciBpbml0aWFsaXplZCBkYXRhLCBhbmQgdGhlIHN0YW5kYXJkCi1Ac2N7Z251fSBhc3NlbWJsZXIgZGlyZWN0aXZlcyB0aGV5IGV4cGFuZCB0bzoKLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gLkRBVEEgQHZhcntleHByfSwgQHZhcntleHByfSwgQGRvdHN7fQotQGl0ZW14IC5EQVRBLkIgQHZhcntleHByfSwgQHZhcntleHByfSwgQGRvdHN7fQotQGl0ZW14IC5EQVRBLlcgQHZhcntleHByfSwgQHZhcntleHByfSwgQGRvdHN7fQotQGl0ZW14IC5EQVRBLkwgQHZhcntleHByfSwgQHZhcntleHByfSwgQGRvdHN7fQotRXZhbHVhdGUgYXJpdGhtZXRpYyBleHByZXNzaW9ucyBAdmFye2V4cHJ9LCBhbmQgZW1pdCB0aGUgY29ycmVzcG9uZGluZwotQGNvZGV7YXN9IGRpcmVjdGl2ZSAobGFiZWxsZWQgd2l0aCBAdmFye2xhYn0pLiAgVGhlIHVucXVhbGlmaWVkCi1AY29kZXsuREFUQX0gZW1pdHMgQHNhbXB7Lmxvbmd9OyBAY29kZXsuREFUQS5CfSBlbWl0cyBAc2FtcHsuYnl0ZX07Ci1AY29kZXsuREFUQS5XfSBlbWl0cyBAc2FtcHsuc2hvcnR9OyBhbmQgQGNvZGV7LkRBVEEuTH0gZW1pdHMKLUBzYW1wey5sb25nfS4KLQotRm9yIGV4YW1wbGUsIEBzYW1we2ZvbyAuREFUQSAxLDIsM30gZW1pdHMgQHNhbXB7Zm9vOiAubG9uZyAxLDIsM30uCi0KLUBpdGVtIC5EQVRBQiBAdmFye3JlcGVhdH0sIEB2YXJ7ZXhwcn0KLUBpdGVteCAuREFUQUIuQiBAdmFye3JlcGVhdH0sIEB2YXJ7ZXhwcn0KLUBpdGVteCAuREFUQUIuVyBAdmFye3JlcGVhdH0sIEB2YXJ7ZXhwcn0KLUBpdGVteCAuREFUQUIuTCBAdmFye3JlcGVhdH0sIEB2YXJ7ZXhwcn0KLUBjIEZJWE1FISBMb29rcyBsaWtlIGdhc3AgYWNjZXB0cyBhbmQgaWdub3JlcyBhcmdzIGFmdGVyIDJuZC4KLU1ha2UgQGNvZGV7YXN9IGVtaXQgQHZhcntyZXBlYXR9IGNvcGllcyBvZiB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24KLUB2YXJ7ZXhwcn0gKHVzaW5nIHRoZSBAY29kZXthc30gZGlyZWN0aXZlIEBjb2Rley5maWxsfSkuCi1Ac2FtcHsuREFUQUIuQn0gcmVwZWF0cyBvbmUtYnl0ZSB2YWx1ZXM7IEBzYW1wey5EQVRBQi5XfSByZXBlYXRzCi10d28tYnl0ZSB2YWx1ZXM7IGFuZCBAc2FtcHsuREFUQUIuTH0gcmVwZWF0cyBmb3VyLWJ5dGUgdmFsdWVzLgotQHNhbXB7LkRBVEFCfSB3aXRob3V0IGEgc3VmZml4IHJlcGVhdHMgZm91ci1ieXRlIHZhbHVlcywganVzdCBsaWtlCi1Ac2FtcHsuREFUQUIuTH0uCi0KLUBjIEZJWE1FISBBbGxvd2luZyB6ZXJvIG1pZ2h0IGJlIHVzZWZ1bCBmb3IgZWRnZSBjb25kaXRpb25zIGluIG1hY3Jvcy4KLUB2YXJ7cmVwZWF0fSBtdXN0IGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24gd2l0aCBhIHBvc2l0aXZlIHZhbHVlLgotCi1AaXRlbSAuU0RBVEEgIkB2YXJ7c3RyfSIgQGRvdHN7fQotU3RyaW5nIGRhdGEuICBFbWl0cyBhIGNvbmNhdGVuYXRpb24gb2YgYnl0ZXMsIHByZWNpc2VseSBhcyB5b3Ugc3BlY2lmeQotdGhlbSAoaW4gcGFydGljdWxhciwgQGVtcGh7bm90aGluZyBpcyBhZGRlZCB0byBtYXJrIHRoZSBlbmR9IG9mIHRoZQotc3RyaW5nKS4gIEB4cmVme0NvbnN0YW50cywsIFN0cmluZyBhbmQgbnVtZXJpYyBjb25zdGFudHN9LCBmb3IgZGV0YWlscwotYWJvdXQgaG93IHRvIHdyaXRlIHN0cmluZ3MuICBAY29kZXsuU0RBVEF9IGNvbmNhdGVuYXRlcyBtdWx0aXBsZQotYXJndW1lbnRzLCBtYWtpbmcgaXQgZWFzeSB0byBzd2l0Y2ggYmV0d2VlbiBzdHJpbmcgcmVwcmVzZW50YXRpb25zLiAgWW91Ci1jYW4gdXNlIGNvbW1hcyB0byBzZXBhcmF0ZSB0aGUgaW5kaXZpZHVhbCBhcmd1bWVudHMgZm9yIGNsYXJpdHksIGlmIHlvdQotY2hvb3NlLgotCi1AaXRlbSAuU0RBVEFCIEB2YXJ7cmVwZWF0fSwgIkB2YXJ7c3RyfSIgQGRvdHN7fQotUmVwZWF0ZWQgc3RyaW5nIGRhdGEuICBUaGUgZmlyc3QgYXJndW1lbnQgc3BlY2lmaWVzIGhvdyBtYW55IGNvcGllcyBvZgotdGhlIHN0cmluZyB0byBlbWl0OyB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyBzcGVjaWZ5IHRoZSBzdHJpbmcsIGluIHRoZQotc2FtZSB3YXkgYXMgdGhlIGFyZ3VtZW50cyB0byBAY29kZXsuU0RBVEF9LgotCi1AaXRlbSAuU0RBVEFaICJAdmFye3N0cn0iIEBkb3Rze30KLVplcm8tdGVybWluYXRlZCBzdHJpbmcgZGF0YS4gIEp1c3QgbGlrZSBAY29kZXsuU0RBVEF9LCBleGNlcHQgdGhhdAotQGNvZGV7LlNEQVRBWn0gd3JpdGVzIGEgemVybyBieXRlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KLQotQGl0ZW0gLlNEQVRBQyAiQHZhcntzdHJ9IiBAZG90c3t9Ci1Db3VudC1wcmVmaXhlZCBzdHJpbmcgZGF0YS4gIEp1c3QgbGlrZSBAY29kZXsuU0RBVEF9LCBleGNlcHQgdGhhdAotQHNje2dhc3B9IHByZWNlZGVzIHRoZSBzdHJpbmcgd2l0aCBhIGxlYWRpbmcgb25lLWJ5dGUgY291bnQuICBGb3IKLWV4YW1wbGUsIEBzYW1wey5TREFUQUMgIkhJIn0gZ2VuZXJhdGVzIEBzYW1wey5ieXRlIDIsNzIsNzN9LiAgU2luY2UgdGhlCi1jb3VudCBmaWVsZCBpcyBvbmx5IG9uZSBieXRlLCB5b3UgY2FuIG9ubHkgdXNlIEBjb2Rley5TREFUQUN9IGZvcgotc3RyaW5ncyBsZXNzIHRoYW4gMjU2IGJ5dGVzIGluIGxlbmd0aC4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIFVuaW5pdGlhbGl6ZWQKLUBzdWJzZWN0aW9uIFVuaW5pdGlhbGl6ZWQgZGF0YQotCi1AYyBGSVhNRSEgIC5zcGFjZSBkaWZmZXJlbnQgb24gc29tZSBwbGF0Zm9ybXMsIG5vdGFibHkgSFBQQS4gIENvbmZpZz8KLVVzZSB0aGUgQGNvZGV7LlJFU30sIEBjb2Rley5TUkVTfSwgQGNvZGV7LlNSRVNDfSwgYW5kIEBjb2Rley5TUkVTWn0KLWRpcmVjdGl2ZXMgdG8gcmVzZXJ2ZSBtZW1vcnkgYW5kIGxlYXZlIGl0IHVuaW5pdGlhbGl6ZWQuICBAc2N7Z2FzcH0KLXJlc29sdmVzIHRoZXNlIGRpcmVjdGl2ZXMgdG8gYXBwcm9wcmlhdGUgY2FsbHMgb2YgdGhlIEBzY3tnbnV9Ci1AY29kZXthc30gQGNvZGV7LnNwYWNlfSBkaXJlY3RpdmUuCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5SRVMgQHZhcntjb3VudH0KLUBpdGVteCAuUkVTLkIgQHZhcntjb3VudH0KLUBpdGVteCAuUkVTLlcgQHZhcntjb3VudH0KLUBpdGVteCAuUkVTLkwgQHZhcntjb3VudH0KLVJlc2VydmUgcm9vbSBmb3IgQHZhcntjb3VudH0gdW5pbml0aWFsaXplZCBlbGVtZW50cyBvZiBkYXRhLiAgVGhlCi1zdWZmaXggc3BlY2lmaWVzIHRoZSBzaXplIG9mIGVhY2ggZWxlbWVudDogQGNvZGV7LlJFUy5CfSByZXNlcnZlcwotQHZhcntjb3VudH0gYnl0ZXMsIEBjb2Rley5SRVMuV30gcmVzZXJ2ZXMgQHZhcntjb3VudH0gcGFpcnMgb2YgYnl0ZXMsCi1hbmQgQGNvZGV7LlJFUy5MfSByZXNlcnZlcyBAdmFye2NvdW50fSBxdWFydGV0cy4gIEBjb2Rley5SRVN9IHdpdGhvdXQgYQotc3VmZml4IGlzIGVxdWl2YWxlbnQgdG8gQGNvZGV7LlJFUy5MfS4KLQotQGl0ZW0gLlNSRVMgQHZhcntjb3VudH0KLUBpdGVteCAuU1JFUy5CIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVMuVyBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTLkwgQHZhcntjb3VudH0KLUBjIEZJWE1FISAgVGhpcyBpcyBib3JpbmcuICBTaG91bGRuJ3QgaXQgYXQgbGVhc3QgaGF2ZSBhIGRpZmZlcmVudAotQGMgICAgICAgICBkZWZhdWx0IHNpemU/ICAoZS5nLiB0aGUgIlMiIHN1Z2dlc3RzICJzdHJpbmciLCBmb3Igd2hpY2ggLkIKLUBjICAgICAgICAgd291bGQgYmUgbW9yZSBhcHByb3ByaWF0ZSkKLUBjb2Rley5TUkVTfSBpcyBhIHN5bm9ueW0gZm9yIEBzYW1wey5SRVN9LgotCi1AaXRlbSAuU1JFU0MgQHZhcntjb3VudH0KLUBpdGVteCAuU1JFU0MuQiBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTQy5XIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVNDLkwgQHZhcntjb3VudH0KLUxpa2UgQGNvZGV7LlNSRVN9LCBidXQgcmVzZXJ2ZXMgc3BhY2UgZm9yIEBjb2Rle0B2YXJ7Y291bnR9KzF9IGVsZW1lbnRzLgotCi1AaXRlbSAuU1JFU1ogQHZhcntjb3VudH0KLUBpdGVteCAuU1JFU1ouQiBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTWi5XIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVNaLkwgQHZhcntjb3VudH0KLUxpa2UgQGNvZGV7LlNSRVN9LCBidXQgcmVzZXJ2ZXMgc3BhY2UgZm9yIEBjb2Rle0B2YXJ7Y291bnR9KzF9IGVsZW1lbnRzLgotQGVuZCBmdGFibGUKLQotQG5vZGUgTGlzdGluZ3MKLUBzZWN0aW9uIEFzc2VtYmx5IGxpc3RpbmcgY29udHJvbAotCi1UaGUgQHNje2dhc3B9IGxpc3RpbmctY29udHJvbCBkaXJlY3RpdmVzIGNvcnJlc3BvbmQgdG8KLXJlbGF0ZWQgQHNje2dudX0gQGNvZGV7YXN9IGRpcmVjdGl2ZXMuCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5QUklOVCBMSVNUCi1AaXRlbXggLlBSSU5UIE5PTElTVAotUHJpbnQgY29udHJvbC4gIFRoaXMgZGlyZWN0aXZlIGVtaXRzIHRoZSBAc2N7Z251fSBAY29kZXthc30gZGlyZWN0aXZlCi1AY29kZXsubGlzdH0gb3IgQGNvZGV7Lm5vbGlzdH0sIGFjY29yZGluZyB0byBpdHMgYXJndW1lbnQuICBAeHJlZntMaXN0LCwKLUBjb2Rley5saXN0fSwgYXMuaW5mbywgVXNpbmcgYXN9LCBmb3IgZGV0YWlscyBvbiBob3cgdGhlc2UgZGlyZWN0aXZlcwotaW50ZXJhY3QuCi0KLUBpdGVtIC5GT1JNIExJTj1AdmFye2xufQotQGl0ZW14IC5GT1JNIENPTD1AdmFye2NvbHN9Ci1AaXRlbXggLkZPUk0gTElOPUB2YXJ7bG59IENPTD1AdmFye2NvbHN9Ci1TcGVjaWZ5IHRoZSBwYWdlIHNpemUgZm9yIGFzc2VtYmx5IGxpc3RpbmdzOiBAdmFye2xufSByZXByZXNlbnRzIHRoZQotbnVtYmVyIG9mIGxpbmVzLCBhbmQgQHZhcntjb2xzfSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMuICBZb3UgbWF5IHNwZWNpZnkKLWVpdGhlciBwYWdlIGRpbWVuc2lvbiBpbmRlcGVuZGVudGx5LCBvciBib3RoIHRvZ2V0aGVyLiAgSWYgeW91IGRvIG5vdAotc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGxpbmVzLCBAc2N7Z2FzcH0gYXNzdW1lcyA2MCBsaW5lczsgaWYgeW91IGRvIG5vdAotc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMsIEBzY3tnYXNwfSBhc3N1bWVzIDEzMiBjb2x1bW5zLgotKEFueSB2YWx1ZXMgeW91IG1heSBoYXZlIHNwZWNpZmllZCBpbiBwcmV2aW91cyBpbnN0YW5jZXMgb2YgQGNvZGV7LkZPUk19Ci1kbyBAZW1waHtub3R9IGNhcnJ5IG92ZXIgYXMgZGVmYXVsdHMuKSAgRW1pdHMgdGhlIEBjb2Rley5wc2l6ZX0KLWFzc2VtYmxlciBkaXJlY3RpdmUuCi0KLUBpdGVtIC5IRUFESU5HIEB2YXJ7c3RyaW5nfQotU3BlY2lmeSBAdmFye3N0cmluZ30gYXMgdGhlIHRpdGxlIG9mIHlvdXIgYXNzZW1ibHkgbGlzdGluZ3MuICBFbWl0cwotQHNhbXB7LnRpdGxlICJAdmFye3N0cmluZ30ifS4KLQotQGl0ZW0gLlBBR0UKLUZvcmNlIGEgbmV3IHBhZ2UgaW4gYXNzZW1ibHkgbGlzdGluZ3MuICBFbWl0cyBAc2FtcHsuZWplY3R9LgotQGVuZCBmdGFibGUKLQotQG5vZGUgT3RoZXIgQ29tbWFuZHMKLUBzZWN0aW9uIE1pc2NlbGxhbmVvdXMgY29tbWFuZHMKLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gLkFMVEVSTkFURQotVXNlIHRoZSBhbHRlcm5hdGUgbWFjcm8gc3ludGF4IGhlbmNlZm9ydGggaW4gdGhlIGFzc2VtYmx5LgotQHhyZWZ7QWx0ZXJuYXRlLCwgQWx0ZXJuYXRlIG1hY3JvIHN5bnRheH0uCi0KLUBpdGVtIC5PUkcKLUBjIEZJWE1FISAgVGhpcyBpcyB2ZXJ5IHN0cmFuZ2UsIHNpbmNlIF9HQVNfIHVuZGVyc3RhbmRzIC5vcmcKLVRoaXMgY29tbWFuZCBpcyByZWNvZ25pemVkLCBidXQgbm90IHlldCBpbXBsZW1lbnRlZC4gIEBzY3tnYXNwfQotZ2VuZXJhdGVzIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHByb2dyYW1zIHRoYXQgdXNlIEBjb2Rley5PUkd9LgotCi1AaXRlbSAuUkFESVggQHZhcntzfQotQGMgRklYTUUgbm8gdGVzdCBjYXNlcyBpbiB0ZXN0c3VpdGUvZ2FzcAotQHNje2dhc3B9IHVuZGVyc3RhbmRzIG51bWJlcnMgaW4gYW55IG9mIGJhc2UgdHdvLCBlaWdodCwgdGVuLCBvcgotc2l4dGVlbi4gIFlvdSBjYW4gZW5jb2RlIHRoZSBiYXNlIGV4cGxpY2l0bHkgaW4gYW55IG51bWVyaWMgY29uc3RhbnQKLShAcHhyZWZ7Q29uc3RhbnRzLCwgU3RyaW5nIGFuZCBudW1lcmljIGNvbnN0YW50c30pLiAgSWYgeW91IHdyaXRlCi1udW1iZXJzIHdpdGhvdXQgYW4gZXhwbGljaXQgaW5kaWNhdGlvbiBvZiB0aGUgYmFzZSwgdGhlIG1vc3QgcmVjZW50Ci1Ac2FtcHsuUkFESVggQHZhcntzfX0gY29tbWFuZCBkZXRlcm1pbmVzIGhvdyB0aGV5IGFyZSBpbnRlcnByZXRlZC4KLUB2YXJ7c30gaXMgYSBzaW5nbGUgbGV0dGVyLCBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAuUkFESVggQgotQmFzZSAyLgotCi1AaXRlbSAuUkFESVggUQotQmFzZSA4LgotCi1AaXRlbSAuUkFESVggRAotQmFzZSAxMC4gIFRoaXMgaXMgdGhlIG9yaWdpbmFsIGRlZmF1bHQgcmFkaXguCi0KLUBpdGVtIC5SQURJWCBICi1CYXNlIDE2LgotQGVuZCB0YWJsZQotCi1Zb3UgbWF5IHNwZWNpZnkgdGhlIGFyZ3VtZW50IEB2YXJ7c30gaW4gbG93ZXIgY2FzZSAoYW55IG9mIEBzYW1we2JxZGh9KQotd2l0aCB0aGUgc2FtZSBlZmZlY3RzLgotCi1AaXRlbSAuRVhQT1JUIEB2YXJ7bmFtZX0KLUBpdGVteCAuR0xPQkFMIEB2YXJ7bmFtZX0KLUBjIEZJWE1FISBObyB0ZXN0IGNhc2VzIGluIHRlc3RzdWl0ZS9nYXNwCi1EZWNsYXJlIEB2YXJ7bmFtZX0gZ2xvYmFsIChlbWl0cyBAc2FtcHsuZ2xvYmFsIEB2YXJ7bmFtZX19KS4gIFRoZSB0d28KLWRpcmVjdGl2ZXMgYXJlIHN5bm9ueW1vdXMuCi0KLUBpdGVtIC5QUk9HUkFNCi1ObyBlZmZlY3Q6IEBzY3tnYXNwfSBhY2NlcHRzIHRoaXMgZGlyZWN0aXZlLCBhbmQgc2lsZW50bHkgaWdub3JlcyBpdC4KLQotQGl0ZW0gLkVORAotTWFyayBlbmQgb2YgZWFjaCBwcmVwcm9jZXNzb3IgZmlsZS4gIEBzY3tnYXNwfSBpc3N1ZXMgYSB3YXJuaW5nIGlmIGl0Ci1yZWFjaGVzIGVuZCBvZiBmaWxlIHdpdGhvdXQgc2VlaW5nIHRoaXMgY29tbWFuZC4KLQotQGl0ZW0gLklOQ0xVREUgIkB2YXJ7c3RyfSIKLVByZXByb2Nlc3MgdGhlIGZpbGUgbmFtZWQgYnkgQHZhcntzdHJ9LCBhcyBpZiBpdHMgY29udGVudHMgYXBwZWFyZWQKLXdoZXJlIHRoZSBAY29kZXsuSU5DTFVERX0gZGlyZWN0aXZlIGRvZXMuICBAc2N7Z2FzcH0gaW1wb3NlcyBhIG1heGltdW0KLWxpbWl0IG9mIDMwIHN0YWNrZWQgaW5jbHVkZSBmaWxlcywgYXMgYSBzYW5pdHkgY2hlY2suCi1AYyBGSVhNRSEgIFdoeSBpcyBpbmNsdWRlIGRlcHRoIG5vdCBhZmZlY3RlZCBieSAtdT8KLQotQGl0ZW0gLkFMSUdOIEB2YXJ7c2l6ZX0KLUBjIEZJWE1FISBXaHkgaXMgdGhpcyBub3QgdXR0ZXJseSBwb2ludGxlc3M/Ci1FdmFsdWF0ZSB0aGUgYWJzb2x1dGUgZXhwcmVzc2lvbiBAdmFye3NpemV9LCBhbmQgZW1pdCB0aGUgYXNzZW1ibHkKLWluc3RydWN0aW9uIEBzYW1wey5hbGlnbiBAdmFye3NpemV9fSB1c2luZyB0aGUgcmVzdWx0LgotQGVuZCBmdGFibGUKLQotQG5vZGUgU3ludGF4IERldGFpbHMKLUBzZWN0aW9uIERldGFpbHMgb2YgdGhlIEdBU1Agc3ludGF4Ci0KLVNpbmNlIEBzY3tnYXNwfSBpcyBtZWFudCB0byB3b3JrIHdpdGggYXNzZW1ibHkgY29kZSwgaXRzIHN0YXRlbWVudAotc3ludGF4IGhhcyBubyBzdXJwcmlzZXMgZm9yIHRoZSBhc3NlbWJseSBwcm9ncmFtbWVyLgotCi1AY2luZGV4IHdoaXRlc3BhY2UKLUBlbXBoe1doaXRlc3BhY2V9IChibGFua3Mgb3IgdGFiczsgQGVtcGh7bm90fSBuZXdsaW5lKSBpcyBwYXJ0aWFsbHkKLXNpZ25pZmljYW50LCBpbiB0aGF0IGl0IGRlbGltaXRzIHVwIHRvIHRocmVlIGZpZWxkcyBpbiBhIGxpbmUuICBUaGUKLWFtb3VudCBvZiB3aGl0ZXNwYWNlIGRvZXMgbm90IG1hdHRlcjsgeW91IG1heSBsaW5lIHVwIGZpZWxkcyBpbiBzZXBhcmF0ZQotbGluZXMgaWYgeW91IHdpc2gsIGJ1dCBAc2N7Z2FzcH0gZG9lcyBub3QgcmVxdWlyZSB0aGF0LgotCi1AY2luZGV4IGZpZWxkcyBvZiBAc2N7Z2FzcH0gc291cmNlIGxpbmUKLUBjaW5kZXggbGFiZWwgZmllbGQKLVRoZSBAZW1waHtmaXJzdCBmaWVsZH0sIGFuIG9wdGlvbmFsIEBkZm57bGFiZWx9LCBtdXN0IGJlIGZsdXNoIGxlZnQgaW4gYQotbGluZSAod2l0aCBubyBsZWFkaW5nIHdoaXRlc3BhY2UpIGlmIGl0IGFwcGVhcnMgYXQgYWxsLiAgWW91IG1heSB1c2UgYQotY29sb24gYWZ0ZXIgdGhlIGxhYmVsIGlmIHlvdSB3aXNoOyBAc2N7Z2FzcH0gbmVpdGhlciByZXF1aXJlcyB0aGUgY29sb24KLW5vciBvYmplY3RzIHRvIGl0IChidXQgd2lsbCBub3QgaW5jbHVkZSBpdCBhcyBwYXJ0IG9mIHRoZSBsYWJlbCBuYW1lKS4KLQotQGNpbmRleCBkaXJlY3RpdmUgZmllbGQKLVRoZSBAZW1waHtzZWNvbmQgZmllbGR9LCB3aGljaCBtdXN0IGFwcGVhciBhZnRlciBzb21lIHdoaXRlc3BhY2UsCi1jb250YWlucyBhIEBzY3tnYXNwfSBvciBhc3NlbWJseSBAZGZue2RpcmVjdGl2ZX0uCi0KLUBjaW5kZXggYXJndW1lbnQgZmllbGRzCi1BbnkgQGVtcGh7ZnVydGhlciBmaWVsZHN9IG9uIGEgbGluZSBhcmUgQGRmbnthcmd1bWVudHN9IHRvIHRoZQotZGlyZWN0aXZlOyB5b3UgY2FuIHNlcGFyYXRlIHRoZW0gZnJvbSBvbmUgYW5vdGhlciB1c2luZyBlaXRoZXIgY29tbWFzIG9yCi13aGl0ZXNwYWNlLgotCi1AbWVudQotKiBNYXJrZXJzOjoKLSogQ29uc3RhbnRzOjoKLSogU3ltYm9sczo6Ci0qIEV4cHJlc3Npb25zOjoKLSogU3RyaW5nIEJ1aWx0aW5zOjoKLUBlbmQgbWVudQotCi1Abm9kZSBNYXJrZXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIHN5bnRhY3RpYyBtYXJrZXJzCi0KLUBzY3tnYXNwfSByZWNvZ25pemVzIGEgZmV3IHNwZWNpYWwgbWFya2VyczogdG8gZGVsaW1pdCBjb21tZW50cywgdG8KLWNvbnRpbnVlIGEgc3RhdGVtZW50IG9uIHRoZSBuZXh0IGxpbmUsIHRvIHNlcGFyYXRlIHN5bWJvbHMgZnJvbSBvdGhlcgotY2hhcmFjdGVycywgYW5kIHRvIGNvcHkgdGV4dCB0byB0aGUgb3V0cHV0IGxpdGVyYWxseS4gIChPbmUgb3RoZXIKLXNwZWNpYWwgbWFya2VyLCBAc2FtcHtcQEB9LCB3b3JrcyBvbmx5IHdpdGhpbiBtYWNybyBkZWZpbml0aW9uczsKLUBweHJlZntNYWNyb3MsLCBEZWZpbmluZyB5b3VyIG93biBkaXJlY3RpdmVzfS4pCi0KLUBjaW5kZXggY29tbWVudHMKLVRoZSB0cmFpbGluZyBwYXJ0IG9mIGFueSBAc2N7Z2FzcH0gc291cmNlIGxpbmUgbWF5IGJlIGEgQGRmbntjb21tZW50fS4KLUEgY29tbWVudCBiZWdpbnMgd2l0aCB0aGUgZmlyc3QgdW5xdW90ZWQgY29tbWVudCBjaGFyYWN0ZXIgKEBzYW1weyF9IGJ5Ci1kZWZhdWx0KSwgb3IgYW4gZXNjYXBlZCBvciBkb3VibGVkIGNvbW1lbnQgY2hhcmFjdGVyIChAc2FtcHtcIX0gb3IKLUBzYW1weyEhfSBieSBkZWZhdWx0KSwgYW5kIGV4dGVuZHMgdG8gdGhlIGVuZCBvZiBhIGxpbmUuICBZb3UgY2FuCi1zcGVjaWZ5IHdoYXQgY29tbWVudCBjaGFyYWN0ZXIgdG8gdXNlIHdpdGggdGhlIEBzYW1wey1jfSBvcHRpb24KLShAcHhyZWZ7SW52b2tpbmcgR0FTUCwsIENvbW1hbmQgTGluZSBPcHRpb25zfSkuICBUaGUgdHdvIGtpbmRzIG9mCi1jb21tZW50IG1hcmtlcnMgbGVhZCB0byBzbGlnaHRseSBkaWZmZXJlbnQgdHJlYXRtZW50OgotCi1AdGFibGUgQGNvZGUKLUBpdGVtICEKLUEgc2luZ2xlLCB1bi1lc2NhcGVkIGNvbW1lbnQgY2hhcmFjdGVyIGdlbmVyYXRlcyBhbiBhc3NlbWJseSBjb21tZW50IGluCi10aGUgQHNje2dhc3B9IG91dHB1dC4gIEBzY3tnYXNwfSBldmFsdWF0ZXMgYW55IHByZXByb2Nlc3NvciB2YXJpYWJsZXMKLShtYWNybyBhcmd1bWVudHMsIG9yIHZhcmlhYmxlcyBkZWZpbmVkIHdpdGggQGNvZGV7LkFTU0lHTkF9IG9yCi1AY29kZXsuQVNTSUdOQ30pIHByZXNlbnQuICBGb3IgZXhhbXBsZSwgYSBtYWNybyB0aGF0IGJlZ2lucyBsaWtlIHRoaXMKLQotQGV4YW1wbGUKLSAgICAgICAgLk1BQ1JPICBTVU0gRlJPTT0wLCBUTz05Ci0gICAgICAgICEgXEZST00gXFRPCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1pc3N1ZXMgYXMgdGhlIGZpcnN0IGxpbmUgb2Ygb3V0cHV0IGEgY29tbWVudCB0aGF0IHJlY29yZHMgdGhlCi12YWx1ZXMgeW91IHVzZWQgdG8gY2FsbCB0aGUgbWFjcm8uCi0KLUBjIGNvbW1lbnRzLCBwcmVwcm9jZXNzb3Itb25seQotQGMgcHJlcHJvY2Vzc29yLW9ubHkgY29tbWVudHMKLUBjIEdBU1Atb25seSBjb21tZW50cwotQGl0ZW0gXCEKLUBpdGVteCAhIQotRWl0aGVyIGFuIGVzY2FwZWQgY29tbWVudCBjaGFyYWN0ZXIsIG9yIGEgZG91YmxlIGNvbW1lbnQgY2hhcmFjdGVyLAotbWFya3MgYSBAc2N7Z2FzcH0gc291cmNlIGNvbW1lbnQuICBAc2N7Z2FzcH0gZG9lcyBub3QgY29weSBzdWNoIGNvbW1lbnRzCi10byB0aGUgYXNzZW1ibHkgb3V0cHV0LgotQGVuZCB0YWJsZQotCi1AY2luZGV4IGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXIKLUBraW5kZXggKwotVG8gQGVtcGh7Y29udGludWUgYSBzdGF0ZW1lbnR9IG9uIHRoZSBuZXh0IGxpbmUgb2YgdGhlIGZpbGUsIGJlZ2luIHRoZQotc2Vjb25kIGxpbmUgd2l0aCB0aGUgY2hhcmFjdGVyIEBzYW1weyt9LgotCi1AY2luZGV4IGxpdGVyYWwgY29weSB0byBvdXRwdXQKLUBjaW5kZXggY29weWluZyBsaXRlcmFsbHkgdG8gb3V0cHV0Ci1AY2luZGV4IHByZXByb2Nlc3NpbmcsIGF2b2lkaW5nCi1AY2luZGV4IGF2b2lkaW5nIHByZXByb2Nlc3NpbmcKLU9jY2FzaW9uYWxseSB5b3UgbWF5IHdhbnQgdG8gcHJldmVudCBAc2N7Z2FzcH0gZnJvbSBwcmVwcm9jZXNzaW5nIHNvbWUKLXBhcnRpY3VsYXIgYml0IG9mIHRleHQuICBUbyBAZW1waHtjb3B5IGxpdGVyYWxseX0gZnJvbSB0aGUgQHNje2dhc3B9Ci1zb3VyY2UgdG8gaXRzIG91dHB1dCwgcGxhY2UgQHNhbXB7XCh9IGJlZm9yZSB0aGUgc3RyaW5nIHRvIGNvcHksIGFuZAotQHNhbXB7KX0gYXQgdGhlIGVuZC4gIEZvciBleGFtcGxlLCB3cml0ZSBAc2FtcHtcKFwhKX0gaWYgeW91IG5lZWQgdGhlCi1jaGFyYWN0ZXJzIEBzYW1we1whfSBpbiB5b3VyIGFzc2VtYmx5IG91dHB1dC4KLQotQGNpbmRleCBzeW1ib2wgc2VwYXJhdG9yCi1AY2luZGV4IHRleHQsIHNlcGFyYXRpbmcgZnJvbSBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbHMsIHNlcGFyYXRpbmcgZnJvbSB0ZXh0Ci1UbyBAZW1waHtzZXBhcmF0ZSBhIHByZXByb2Nlc3NvciB2YXJpYWJsZX0gZnJvbSB0ZXh0IHRvIGFwcGVhcgotaW1tZWRpYXRlbHkgYWZ0ZXIgaXRzIHZhbHVlLCB3cml0ZSBhIHNpbmdsZSBxdW90ZSAoQGNvZGV7J30pLiAgRm9yCi1leGFtcGxlLCBAc2FtcHsuU0RBVEEgIlxQJzEifSB3cml0ZXMgYSBzdHJpbmcgYnVpbHQgYnkgY29uY2F0ZW5hdGluZyB0aGUKLXZhbHVlIG9mIEBjb2Rle1B9IGFuZCB0aGUgZGlnaXQgQHNhbXB7MX0uICAoWW91IGNhbm5vdCBhY2hpZXZlIHRoaXMgYnkKLXdyaXRpbmcganVzdCBAc2FtcHtcUDF9LCBzaW5jZSBAc2FtcHtQMX0gaXMgaXRzZWxmIGEgdmFsaWQgbmFtZSBmb3IgYQotcHJlcHJvY2Vzc29yIHZhcmlhYmxlLikKLQotQG5vZGUgQ29uc3RhbnRzCi1Ac3Vic2VjdGlvbiBTdHJpbmcgYW5kIG51bWVyaWMgY29uc3RhbnRzCi0KLVRoZXJlIGFyZSB0d28gd2F5cyBvZiB3cml0aW5nIEBkZm57c3RyaW5nIGNvbnN0YW50c30gaW4gQHNje2dhc3B9OiBhcwotbGl0ZXJhbCB0ZXh0LCBhbmQgYnkgbnVtZXJpYyBieXRlIHZhbHVlLiAgU3BlY2lmeSBhIHN0cmluZyBsaXRlcmFsCi1iZXR3ZWVuIGRvdWJsZSBxdW90ZXMgKEBjb2RleyJAdmFye3N0cn0ifSkuICBTcGVjaWZ5IGFuIGluZGl2aWR1YWwKLW51bWVyaWMgYnl0ZSB2YWx1ZSBhcyBhbiBhYnNvbHV0ZSBleHByZXNzaW9uIGJldHdlZW4gYW5nbGUgYnJhY2tldHMKLShAY29kZXs8QHZhcntleHByfT59LiAgRGlyZWN0aXZlcyB0aGF0IG91dHB1dCBzdHJpbmdzIGFsbG93IHlvdSB0bwotc3BlY2lmeSBhbnkgbnVtYmVyIG9mIGVpdGhlciBraW5kIG9mIHZhbHVlLCBpbiB3aGF0ZXZlciBvcmRlciBpcwotY29udmVuaWVudCwgYW5kIGNvbmNhdGVuYXRlIHRoZSByZXN1bHQuICAoQWx0ZXJuYXRlIHN5bnRheCBtb2RlCi1pbnRyb2R1Y2VzIGEgbnVtYmVyIG9mIGFsdGVybmF0aXZlIHN0cmluZyBub3RhdGlvbnM7IEBweHJlZntBbHRlcm5hdGUsLAotQWx0ZXJuYXRlIG1hY3JvIHN5bnRheH0uKQotCi1AYyBEZXRhaWxzIG9mIG51bWVyaWMgbm90YXRpb24sIGUuZy4gYmFzZSBwcmVmaXhlcwotWW91IGNhbiB3cml0ZSBAZGZue251bWVyaWMgY29uc3RhbnRzfSBlaXRoZXIgaW4gYSBzcGVjaWZpYyBiYXNlLCBvciBpbgotd2hhdGV2ZXIgYmFzZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgKGVpdGhlciAxMCwgb3Igc2VsZWN0ZWQgYnkgdGhlIG1vc3QKLXJlY2VudCBAY29kZXsuUkFESVh9KS4KLQotVG8gd3JpdGUgYSBudW1iZXIgaW4gYSBAZW1waHtzcGVjaWZpYyBiYXNlfSwgdXNlIHRoZSBwYXR0ZXJuCi1AY29kZXtAdmFye3N9J0B2YXJ7ZGRkfX06IGEgYmFzZSBzcGVjaWZpZXIgY2hhcmFjdGVyIEB2YXJ7c30sIGZvbGxvd2VkCi1ieSBhIHNpbmdsZSBxdW90ZSBmb2xsb3dlZCBieSBkaWdpdHMgQHZhcntkZGR9LiAgVGhlIGJhc2Ugc3BlY2lmaWVyCi1jaGFyYWN0ZXIgbWF0Y2hlcyB0aG9zZSB5b3UgY2FuIHNwZWNpZnkgd2l0aCBAY29kZXsuUkFESVh9OiBAc2FtcHtCfSBmb3IKLWJhc2UgMiwgQHNhbXB7UX0gZm9yIGJhc2UgOCwgQHNhbXB7RH0gZm9yIGJhc2UgMTAsIGFuZCBAc2FtcHtIfSBmb3IgYmFzZQotMTYuICAoWW91IGNhbiB3cml0ZSB0aGlzIGNoYXJhY3RlciBpbiBsb3dlciBjYXNlIGlmIHlvdSBwcmVmZXIuKQotCi1AYyBGSVhNRSEgV2hhdCBhcmUgcnVsZXMgZm9yIHJlY29nbml6aW5nIG51bWJlciBpbiBkZWZsdCBiYXNlPyAgV2hhdGV2ZXIKLUBjICAgICAgICBpcyBsZWZ0IG92ZXIgYWZ0ZXIgcGFyc2luZyBvdGhlciB0aGluZ3M/PwotCi1Abm9kZSBTeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2xzCi0KLUBzY3tnYXNwfSByZWNvZ25pemVzIHN5bWJvbCBuYW1lcyB0aGF0IHN0YXJ0IHdpdGggYW55IGFscGhhYmV0aWMgY2hhcmFjdGVyLAotQHNhbXB7X30sIG9yIEBzYW1weyR9LCBhbmQgY29udGludWUgd2l0aCBhbnkgb2YgdGhlIHNhbWUgY2hhcmFjdGVycyBvcgotd2l0aCBkaWdpdHMuICBMYWJlbCBuYW1lcyBmb2xsb3cgdGhlIHNhbWUgcnVsZXMuCi0KLUBub2RlIEV4cHJlc3Npb25zCi1Ac3Vic2VjdGlvbiBBcml0aG1ldGljIGV4cHJlc3Npb25zIGluIEdBU1AKLQotQGNpbmRleCBhYnNvbHV0ZSBleHByZXNzaW9ucwotQGNpbmRleCByZWxvY2F0YWJsZSBleHByZXNzaW9ucwotVGhlcmUgYXJlIHR3byBraW5kcyBvZiBleHByZXNzaW9ucywgZGVwZW5kaW5nIG9uIHRoZWlyIHJlc3VsdDoKLUBkZm57YWJzb2x1dGV9IGV4cHJlc3Npb25zLCB3aGljaCByZXNvbHZlIHRvIGEgY29uc3RhbnQgKHRoYXQgaXMsIHRoZXkKLWRvIG5vdCBpbnZvbHZlIGFueSB2YWx1ZXMgdW5rbm93biB0byBAc2N7Z2FzcH0pLCBhbmQgQGRmbntyZWxvY2F0YWJsZX0KLWV4cHJlc3Npb25zLCB3aGljaCBtdXN0IHJlZHVjZSB0byB0aGUgZm9ybQotCi1AZXhhbXBsZQotQHZhcnthZGRzeW19K0B2YXJ7Y29uc3R9LUB2YXJ7c3Vic3ltfQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotd2hlcmUgQHZhcnthZGRzeW19IGFuZCBAdmFye3N1YnN5bX0gYXJlIGFzc2VtYmx5IHN5bWJvbHMgb2YgdW5rbm93bgotdmFsdWUsIGFuZCBAdmFye2NvbnN0fSBpcyBhIGNvbnN0YW50LgotCi1Bcml0aG1ldGljIGZvciBAc2N7Z2FzcH0gZXhwcmVzc2lvbnMgZm9sbG93cyB2ZXJ5IHNpbWlsYXIgcnVsZXMgdG8gQy4KLVlvdSBjYW4gdXNlIHBhcmVudGhlc2VzIHRvIGNoYW5nZSBwcmVjZWRlbmNlOyBvdGhlcndpc2UsIGFyaXRobWV0aWMKLXByaW1pdGl2ZXMgaGF2ZSBkZWNyZWFzaW5nIHByZWNlZGVuY2UgaW4gdGhlIG9yZGVyIG9mIHRoZSBmb2xsb3dpbmcKLWxpc3QuCi0KLUBlbnVtZXJhdGUKLUBpdGVtCi1TaW5nbGUtYXJndW1lbnQgQGNvZGV7K30gKGlkZW50aXR5KSwgQGNvZGV7LX0gKGFyaXRobWV0aWMgb3Bwb3NpdGUpLCBvcgotQGNvZGV7fn0gKGJpdHdpc2UgbmVnYXRpb24pLiAgQGVtcGh7VGhlIGFyZ3VtZW50IG11c3QgYmUgYW4gYWJzb2x1dGUKLWV4cHJlc3Npb24ufQotCi1AaXRlbQotQGNvZGV7Kn0gKG11bHRpcGxpY2F0aW9uKSBhbmQgQGNvZGV7L30gKGRpdmlzaW9uKS4gIEBlbXBoe0JvdGggYXJndW1lbnRzCi1tdXN0IGJlIGFic29sdXRlIGV4cHJlc3Npb25zLn0KLQotQGl0ZW0KLUBjb2Rleyt9IChhZGRpdGlvbikgYW5kIEBjb2Rley19IChzdWJ0cmFjdGlvbikuICBAZW1waHtBdCBsZWFzdCBvbmUgYXJndW1lbnQKLW11c3QgYmUgYWJzb2x1dGUufQotQGMgRklYTUUhICBBY3R1YWxseSwgc3VidHJhY3Rpb24gZG9lc24ndCBjaGVjayBmb3IgdGhpcy4KLQotQGl0ZW0KLUBjb2RleyZ9IChiaXR3aXNlIGFuZCkuICBAZW1waHtCb3RoIGFyZ3VtZW50cyBtdXN0IGJlIGFic29sdXRlLn0KLQotQGl0ZW0KLUBjIEZJWE1FISAgSSBhZ3JlZSB+IGlzIGEgYmV0dGVyIG5vdGF0aW9uIHRoYW4gXiBmb3IgeG9yLCBidXQgaXMgdGhlCi1AYyAgICAgICAgIGltcHJvdmVtZW50IHdvcnRoIGRpZmZlcmluZyBmcm9tIEM/Ci1AY29kZXt8fSAoYml0d2lzZSBvcikgYW5kIEBjb2Rle359IChiaXR3aXNlIGV4Y2x1c2l2ZSBvcjsgQGNvZGV7Xn0gaW4KLUMpLiAgQGVtcGh7Qm90aCBhcmd1bWVudHMgbXVzdCBiZSBhYnNvbHV0ZS59Ci1AZW5kIGVudW1lcmF0ZQotCi1Abm9kZSBTdHJpbmcgQnVpbHRpbnMKLUBzdWJzZWN0aW9uIFN0cmluZyBwcmltaXRpdmVzCi0KLVlvdSBjYW4gdXNlIHRoZXNlIHByaW1pdGl2ZXMgdG8gbWFuaXB1bGF0ZSBzdHJpbmdzIChpbiB0aGUgYXJndW1lbnQKLWZpZWxkIG9mIEBzY3tnYXNwfSBzdGF0ZW1lbnRzKToKLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gLkxFTigiQHZhcntzdHJ9IikKLUNhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHN0cmluZyBAY29kZXsiQHZhcntzdHJ9In0sIGFzIGFuIGFic29sdXRlCi1leHByZXNzaW9uLiAgRm9yIGV4YW1wbGUsIEBzYW1wey5SRVMuQiAuTEVOKCJzYW1wbGUiKX0gcmVzZXJ2ZXMgc2l4Ci1ieXRlcyBvZiBtZW1vcnkuCi0KLUBpdGVtIC5JTlNUUigiQHZhcntzdHJpbmd9IiwgIkB2YXJ7c2VnfSIsIEB2YXJ7aXh9KQotU2VhcmNoIGZvciB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBAdmFye3NlZ30gYWZ0ZXIgcG9zaXRpb24gQHZhcntpeH0gb2YKLUB2YXJ7c3RyaW5nfS4gIEZvciBleGFtcGxlLCBAc2FtcHsuSU5TVFIoIkFCQ0RFRkciLCAiQ0RFIiwgMCl9IGV2YWx1YXRlcwotdG8gdGhlIGFic29sdXRlIHJlc3VsdCBAY29kZXsyfS4KLQotVGhlIHJlc3VsdCBpcyBAY29kZXstMX0gaWYgQHZhcntzZWd9IGRvZXMgbm90IG9jY3VyIGluIEB2YXJ7c3RyaW5nfQotYWZ0ZXIgcG9zaXRpb24gQHZhcntpeH0uCi0KLUBpdGVtIC5TVUJTVFIoIkB2YXJ7c3RyaW5nfSIsQHZhcntzdGFydH0sQHZhcntsZW59KQotVGhlIHN1YnN0cmluZyBvZiBAdmFye3N0cmluZ30gYmVnaW5uaW5nIGF0IGJ5dGUgbnVtYmVyIEB2YXJ7c3RhcnR9IGFuZAotZXh0ZW5kaW5nIGZvciBAdmFye2xlbn0gYnl0ZXMuCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBBbHRlcm5hdGUKLUBzZWN0aW9uIEFsdGVybmF0ZSBtYWNybyBzeW50YXgKLQotSWYgeW91IHNwZWNpZnkgQHNhbXB7LWF9IG9yIEBzYW1wey0tYWx0ZXJuYXRlfSBvbiB0aGUgQHNje2dhc3B9IGNvbW1hbmQKLWxpbmUsIHRoZSBwcmVwcm9jZXNzb3IgdXNlcyBzb21ld2hhdCBkaWZmZXJlbnQgc3ludGF4LiAgVGhpcyBzeW50YXggaXMKLXJlbWluaXNjZW50IG9mIHRoZSBzeW50YXggb2YgUGhhciBMYXAgbWFjcm8gYXNzZW1ibGVyLCBidXQgaXQKLWlzIEBlbXBoe25vdH0gbWVhbnQgdG8gYmUgYSBmdWxsIGVtdWxhdGlvbiBvZiBQaGFyIExhcCBvciBzaW1pbGFyCi1hc3NlbWJsZXJzLiAgSW4gcGFydGljdWxhciwgQHNje2dhc3B9IGRvZXMgbm90IHN1cHBvcnQgZGlyZWN0aXZlcyBzdWNoCi1hcyBAY29kZXtEQn0gYW5kIEBjb2Rle0lSUH0sIGV2ZW4gaW4gYWx0ZXJuYXRlIHN5bnRheCBtb2RlLgotCi1JbiBwYXJ0aWN1bGFyLCBAc2FtcHstYX0gKG9yIEBzYW1wey0tYWx0ZXJuYXRlfSkgZWxpY2l0cyB0aGVzZQotZGlmZmVyZW5jZXM6Ci0KLUB0YWJsZSBAZW1waAotQGl0ZW0gUHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMKLVlvdSBjYW4gdXNlIEBzY3tnYXNwfSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyB3aXRob3V0IGEgbGVhZGluZyBAc2FtcHsufQotZG90LiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gd3JpdGUgQHNhbXB7U0RBVEF9IHdpdGggdGhlIHNhbWUgZWZmZWN0IGFzCi1Ac2FtcHsuU0RBVEF9LgotCi1AaXRlbSBMT0NBTAotT25lIGFkZGl0aW9uYWwgZGlyZWN0aXZlLCBAY29kZXtMT0NBTH0sIGlzIGF2YWlsYWJsZS4gIEB4cmVme01hY3JvcywsCi1EZWZpbmluZyB5b3VyIG93biBkaXJlY3RpdmVzfSwgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGhvdyB0byB1c2UKLUBjb2Rle0xPQ0FMfS4KLQotQG5lZWQgMjAwMAotQGl0ZW0gU3RyaW5nIGRlbGltaXRlcnMKLVlvdSBjYW4gd3JpdGUgc3RyaW5ncyBkZWxpbWl0ZWQgaW4gdGhlc2Ugb3RoZXIgd2F5cyBiZXNpZGVzCi1AY29kZXsiQHZhcntzdHJpbmd9In06Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gJ0B2YXJ7c3RyaW5nfScKLVlvdSBjYW4gZGVsaW1pdCBzdHJpbmdzIHdpdGggc2luZ2xlLXF1b3RlIGNoYXJhdGVycy4KLQotQGl0ZW0gPEB2YXJ7c3RyaW5nfT4KLVlvdSBjYW4gZGVsaW1pdCBzdHJpbmdzIHdpdGggbWF0Y2hpbmcgYW5nbGUgYnJhY2tldHMuCi1AZW5kIHRhYmxlCi0KLUBpdGVtIHNpbmdsZS1jaGFyYWN0ZXIgc3RyaW5nIGVzY2FwZQotVG8gaW5jbHVkZSBhbnkgc2luZ2xlIGNoYXJhY3RlciBsaXRlcmFsbHkgaW4gYSBzdHJpbmcgKGV2ZW4gaWYgdGhlCi1jaGFyYWN0ZXIgd291bGQgb3RoZXJ3aXNlIGhhdmUgc29tZSBzcGVjaWFsIG1lYW5pbmcpLCB5b3UgY2FuIHByZWZpeCB0aGUKLWNoYXJhY3RlciB3aXRoIEBzYW1weyF9IChhbiBleGNsYW1hdGlvbiBtYXJrKS4gIEZvciBleGFtcGxlLCB5b3UgY2FuCi13cml0ZSBAc2FtcHs8NC4zICE+IDUuNCEhPn0gdG8gZ2V0IHRoZSBsaXRlcmFsIHRleHQgQHNhbXB7NC4zID4gNS40IX0uCi0KLUBpdGVtIEV4cHJlc3Npb24gcmVzdWx0cyBhcyBzdHJpbmdzCi1Zb3UgY2FuIHdyaXRlIEBzYW1weyVAdmFye2V4cHJ9fSB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBAdmFye2V4cHJ9Ci1hbmQgdXNlIHRoZSByZXN1bHQgYXMgYSBzdHJpbmcuICAKLUBlbmQgdGFibGUKLQotQG5vZGUgSW5kZXgKLUB1bm51bWJlcmVkIEluZGV4Ci0KLUBwcmludGluZGV4IGNwCi0KLUBjb250ZW50cwotQGJ5ZQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9oOC50ZXhpIGIvZ2FzL2RvYy9oOC50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGYxNzE0Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvaDgudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLUBjbGVhciBBTEwtQVJDSAotQGNsZWFyIEdFTkVSSUMKLUBjbGVhciBJTlRFUk5BTFMKLUBjbGVhciBNVUxUSS1PQkoKLUBjbGVhciBBT1VUCi1AY2xlYXIgQk9VVAotQHNldCBDT0ZGCi1AY2xlYXIgRUxGCi1Ac2V0IEhpdGFjaGktYWxsCi1Ac2V0IEg4LzMwMAotQHNldCBIOC81MDAKLUBzZXQgU0gKLUBjbGVhciBESUZGLVRCTC1LTFVHRQotQHNldCBJRUVFRkxPQVQKLUBjbGVhciBXMzIKLUBzZXQgVzE2Ci1Ac2V0IFNQRUNJQUwtU1lNUwotQHNldCBBUyBhcwotQHNldCBHQ0MgZ2NjCi1Ac2V0IExEIGxkCi1Ac2V0IFRBUkdFVCBIOC8zMDAgYW5kIEg4LzUwMAotQHNldCBUQVJHRVQgSDgvMzAwLCBIOC81MDAsIGFuZCBIaXRhY2hpIFNICi1Ac2V0IE9CSi1OQU1FIENPRkYKLUBjCi1AY2xlYXIgaGF2ZS1zdGFicwotQHNldCBhYm5vcm1hbC1zZXBhcmF0b3IKZGlmZiAtLWdpdCBhL2dhcy9kb2MvaW50ZXJuYWxzLnRleGkgYi9nYXMvZG9jL2ludGVybmFscy50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGQ0OWUwNi4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2ludGVybmFscy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTU2MCArMCwwIEBACi1caW5wdXQgdGV4aW5mbwotQHNldGZpbGVuYW1lIGludGVybmFscy5pbmZvCi1Abm9kZSBUb3AKLUB0b3AgQXNzZW1ibGVyIEludGVybmFscwotQHJhaXNlc2VjdGlvbnMKLUBjaW5kZXggaW50ZXJuYWxzCi0KLVRoaXMgY2hhcHRlciBkZXNjcmliZXMgdGhlIGludGVybmFscyBvZiB0aGUgYXNzZW1ibGVyLiAgSXQgaXMgaW5jb21wbGV0ZSwgYnV0Ci1pdCBtYXkgaGVscCBhIGJpdC4KLQotVGhpcyBjaGFwdGVyIHdhcyBsYXN0IG1vZGlmaWVkIG9uICREYXRlJC4gIEl0IGlzIG5vdCB1cGRhdGVkIHJlZ3VsYXJseSwgYW5kIGl0Ci1tYXkgYmUgb3V0IG9mIGRhdGUuCi0KLUBtZW51Ci0qIEdBUyB2ZXJzaW9uczo6ICAgICAgICBHQVMgdmVyc2lvbnMKLSogRGF0YSB0eXBlczo6CQlEYXRhIHR5cGVzCi0qIEdBUyBwcm9jZXNzaW5nOjogICAgICBXaGF0IEdBUyBkb2VzIHdoZW4gaXQgcnVucwotKiBQb3J0aW5nIEdBUzo6ICAgICAgICAgUG9ydGluZyBHQVMKLSogUmVsYXhhdGlvbjo6ICAgICAgICAgIFJlbGF4YXRpb24KLSogQnJva2VuIHdvcmRzOjogICAgICAgIEJyb2tlbiB3b3JkcwotKiBJbnRlcm5hbCBmdW5jdGlvbnM6OiAgSW50ZXJuYWwgZnVuY3Rpb25zCi0qIFRlc3Qgc3VpdGU6OiAgICAgICAgICBUZXN0IHN1aXRlCi1AZW5kIG1lbnUKLQotQG5vZGUgR0FTIHZlcnNpb25zCi1Ac2VjdGlvbiBHQVMgdmVyc2lvbnMKLQotR0FTIGhhcyBhY3F1aXJlZCBsYXllcnMgb2YgY29kZSBvdmVyIHRpbWUuICBUaGUgb3JpZ2luYWwgR0FTIG9ubHkgc3VwcG9ydGVkIHRoZQotYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0LCB3aXRoIHRocmVlIHNlY3Rpb25zLiAgU3VwcG9ydCBmb3IgbXVsdGlwbGUgc2VjdGlvbnMKLWhhcyBiZWVuIGFkZGVkIGluIHR3byBkaWZmZXJlbnQgd2F5cy4KLQotVGhlIHByZWZlcnJlZCBhcHByb2FjaCBpcyB0byB1c2UgdGhlIHZlcnNpb24gb2YgR0FTIGNyZWF0ZWQgd2hlbiB0aGUgc3ltYm9sCi1AY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBkZWZpbmVkLiAgVGhlIG90aGVyIHZlcnNpb25zIG9mIEdBUyBhcmUgZG9jdW1lbnRlZCBmb3IKLWhpc3RvcmljYWwgcHVycG9zZXMsIGFuZCB0byBoZWxwIGFueWJvZHkgd2hvIGhhcyB0byBkZWJ1ZyBjb2RlIHdyaXR0ZW4gZm9yCi10aGVtLgotCi1UaGUgdHlwZSBAY29kZXtzZWdUfSBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHNlY3Rpb24gaW4gY29kZSB3aGljaCBtdXN0IHdvcmsKLXdpdGggYWxsIHZlcnNpb25zIG9mIEdBUy4KLQotQG1lbnUKLSogT3JpZ2luYWwgR0FTOjogICAgICAgIE9yaWdpbmFsIEdBUyB2ZXJzaW9uCi0qIE1BTllfU0VHTUVOVFM6OiAgICAgICBNQU5ZX1NFR01FTlRTIGdhcyB2ZXJzaW9uCi0qIEJGRF9BU1NFTUJMRVI6OiAgICAgICBCRkRfQVNTRU1CTEVSIGdhcyB2ZXJzaW9uCi1AZW5kIG1lbnUKLQotQG5vZGUgT3JpZ2luYWwgR0FTCi1Ac3Vic2VjdGlvbiBPcmlnaW5hbCBHQVMKLQotVGhlIG9yaWdpbmFsIEdBUyBvbmx5IHN1cHBvcnRlZCB0aGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IHdpdGggdGhyZWUKLXNlY3Rpb25zOiBAc2FtcHsudGV4dH0sIEBzYW1wey5kYXRhfSwgYW5kIEBzYW1wey5ic3N9LiAgVGhpcyBpcyB0aGUgdmVyc2lvbiBvZgotR0FTIHRoYXQgaXMgY29tcGlsZWQgaWYgbmVpdGhlciBAY29kZXtCRkRfQVNTRU1CTEVSfSBub3IgQGNvZGV7TUFOWV9TRUdNRU5UU30KLWlzIGRlZmluZWQuICBUaGlzIHZlcnNpb24gb2YgR0FTIGlzIHN0aWxsIHVzZWQgZm9yIHRoZSBtNjhrLWFvdXQgdGFyZ2V0LCBhbmQKLXBlcmhhcHMgb3RoZXJzLgotCi1UaGlzIHZlcnNpb24gb2YgR0FTIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgYW55IG5ldyBkZXZlbG9wbWVudC4KLQotVGhlcmUgaXMgc3RpbGwgY29kZSB0aGF0IGlzIHNwZWNpZmljIHRvIHRoaXMgdmVyc2lvbiBvZiBHQVMsIG5vdGFibHkgaW4KLUBmaWxle3dyaXRlLmN9LiAgVGhlcmUgaXMgbm8gd2F5IGZvciB0aGlzIGNvZGUgdG8gbG9vcCB0aHJvdWdoIGFsbCB0aGUKLXNlY3Rpb25zOyBpdCBzaW1wbHkgbG9va3MgYXQgZ2xvYmFsIHZhcmlhYmxlcyBsaWtlIEBjb2Rle3RleHRfZnJhZ19yb290fSBhbmQKLUBjb2Rle2RhdGFfZnJhZ19yb290fS4KLQotVGhlIHR5cGUgQGNvZGV7c2VnVH0gaXMgYW4gZW51bS4KLQotQG5vZGUgTUFOWV9TRUdNRU5UUwotQHN1YnNlY3Rpb24gTUFOWV9TRUdNRU5UUyBnYXMgdmVyc2lvbgotQGNpbmRleCBNQU5ZX1NFR01FTlRTCi0KLVRoZSBAY29kZXtNQU5ZX1NFR01FTlRTfSB2ZXJzaW9uIG9mIGdhcyBpcyBvbmx5IHVzZWQgZm9yIENPRkYuICBJdCB1c2VzIHRoZSBCRkQKLWxpYnJhcnksIGJ1dCBpdCB3cml0ZXMgb3V0IGFsbCB0aGUgZGF0YSBpdHNlbGYgdXNpbmcgQGNvZGV7YmZkX3dyaXRlfS4gIFRoaXMKLXZlcnNpb24gb2YgZ2FzIHN1cHBvcnRzIHVwIHRvIDQwIG5vcm1hbCBzZWN0aW9ucy4gIFRoZSBzZWN0aW9uIG5hbWVzIGFyZSBzdG9yZWQKLWluIHRoZSBAY29kZXtzZWdfbmFtZX0gYXJyYXkuICBPdGhlciBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlCi1AY29kZXtzZWdtZW50X2luZm99IGFycmF5LgotCi1UaGUgdHlwZSBAY29kZXtzZWdUfSBpcyBhbiBlbnVtLiAgQ29kZSB0aGF0IHdhbnRzIHRvIGV4YW1pbmUgYWxsIHRoZSBzZWN0aW9ucwotY2FuIHVzZSBhIEBjb2Rle3NlZ1R9IHZhcmlhYmxlIGFzIGxvb3AgaW5kZXggZnJvbSBAY29kZXtTRUdfRTB9IHVwIHRvIGJ1dCBub3QKLWluY2x1ZGluZyBAY29kZXtTRUdfVU5LTk9XTn0uCi0KLU1vc3Qgb2YgdGhlIGNvZGUgc3BlY2lmaWMgdG8gdGhpcyB2ZXJzaW9uIG9mIEdBUyBpcyBpbiB0aGUgZmlsZQotQGZpbGV7Y29uZmlnL29iai1jb2ZmLmN9LCBpbiB0aGUgcG9ydGlvbiBvZiB0aGF0IGZpbGUgdGhhdCBpcyBjb21waWxlZCB3aGVuCi1AY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBub3QgZGVmaW5lZC4KLQotVGhpcyB2ZXJzaW9uIG9mIEdBUyBpcyBzdGlsbCB1c2VkIGZvciBzZXZlcmFsIENPRkYgdGFyZ2V0cy4KLQotQG5vZGUgQkZEX0FTU0VNQkxFUgotQHN1YnNlY3Rpb24gQkZEX0FTU0VNQkxFUiBnYXMgdmVyc2lvbgotQGNpbmRleCBCRkRfQVNTRU1CTEVSCi0KLVRoZSBwcmVmZXJyZWQgdmVyc2lvbiBvZiBHQVMgaXMgdGhlIEBjb2Rle0JGRF9BU1NFTUJMRVJ9IHZlcnNpb24uICBJbiB0aGlzCi12ZXJzaW9uIG9mIEdBUywgdGhlIG91dHB1dCBmaWxlIGlzIGEgbm9ybWFsIEJGRCwgYW5kIHRoZSBCRkQgcm91dGluZXMgYXJlIHVzZWQKLXRvIGdlbmVyYXRlIHRoZSBvdXRwdXQuCi0KLUBjb2Rle0JGRF9BU1NFTUJMRVJ9IHdpbGwgYXV0b21hdGljYWxseSBiZSB1c2VkIGZvciBjZXJ0YWluIHRhcmdldHMsIGluY2x1ZGluZwotdGhvc2UgdGhhdCB1c2UgdGhlIEVMRiwgRUNPRkYsIGFuZCBTT00gb2JqZWN0IGZpbGUgZm9ybWF0cywgYW5kIGFsc28gYWxsIEFscGhhLAotTUlQUywgUG93ZXJQQywgYW5kIFNQQVJDIHRhcmdldHMuICBZb3UgY2FuIGZvcmNlIHRoZSB1c2Ugb2YKLUBjb2Rle0JGRF9BU1NFTUJMRVJ9IGZvciBvdGhlciB0YXJnZXRzIHdpdGggdGhlIGNvbmZpZ3VyZSBvcHRpb24KLUBzYW1wey0tZW5hYmxlLWJmZC1hc3NlbWJsZXJ9OyBob3dldmVyLCBpdCBoYXMgbm90IGJlZW4gdGVzdGVkIGZvciBtYW55Ci10YXJnZXRzLCBhbmQgY2FuIG5vdCBiZSBhc3N1bWVkIHRvIHdvcmsuCi0KLUBub2RlIERhdGEgdHlwZXMKLUBzZWN0aW9uIERhdGEgdHlwZXMKLUBjaW5kZXggaW50ZXJuYWxzLCBkYXRhIHR5cGVzCi0KLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgc29tZSBmdW5kYW1lbnRhbCBHQVMgZGF0YSB0eXBlcy4KLQotQG1lbnUKLSogU3ltYm9sczo6ICAgICAgICAgICAgIFRoZSBzeW1ib2xTIHN0cnVjdHVyZQotKiBFeHByZXNzaW9uczo6ICAgICAgICAgVGhlIGV4cHJlc3Npb25TIHN0cnVjdHVyZQotKiBGaXh1cHM6OgkJVGhlIGZpeFMgc3RydWN0dXJlCi0qIEZyYWdzOjogICAgICAgICAgICAgICBUaGUgZnJhZ1Mgc3RydWN0dXJlCi1AZW5kIG1lbnUKLQotQG5vZGUgU3ltYm9scwotQHN1YnNlY3Rpb24gU3ltYm9scwotQGNpbmRleCBpbnRlcm5hbHMsIHN5bWJvbHMKLUBjaW5kZXggc3ltYm9scywgaW50ZXJuYWwKLUBjaW5kZXggc3ltYm9sUyBzdHJ1Y3R1cmUKLQotVGhlIGRlZmluaXRpb24gZm9yIEBjb2Rle3N0cnVjdCBzeW1ib2x9LCBhbHNvIGtub3duIGFzIEBjb2Rle3N5bWJvbFN9LCBpcwotbG9jYXRlZCBpbiBAZmlsZXtzdHJ1Yy1zeW1ib2wuaH0uICBTeW1ib2wgc3RydWN0dXJlcyBjb250YWluIHRoZSBmb2xsb3dpbmcKLWZpZWxkczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBzeV92YWx1ZQotVGhpcyBpcyBhbiBAY29kZXtleHByZXNzaW9uU30gdGhhdCBkZXNjcmliZXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBJdCBtaWdodAotcmVmZXIgdG8gb25lIG9yIG1vcmUgb3RoZXIgc3ltYm9sczsgaWYgc28sIGl0cyB0cnVlIHZhbHVlIG1heSBub3QgYmUga25vd24KLXVudGlsIEBjb2Rle3Jlc29sdmVfc3ltYm9sX3ZhbHVlfSBpcyBjYWxsZWQgaW4gQGNvZGV7d3JpdGVfb2JqZWN0X2ZpbGV9LgotCi1UaGUgZXhwcmVzc2lvbiBpcyBvZnRlbiBzaW1wbHkgYSBjb25zdGFudC4gIEJlZm9yZSBAY29kZXtyZXNvbHZlX3N5bWJvbF92YWx1ZX0KLWlzIGNhbGxlZCwgdGhlIHZhbHVlIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUgZnJhZyAoQHB4cmVme0ZyYWdzfSkuICBBZnRlcndhcmQsCi10aGUgZnJhZyBhZGRyZXNzIGhhcyBiZWVuIGFkZGVkIGluLgotCi1AaXRlbSBzeV9yZXNvbHZlZAotVGhpcyBmaWVsZCBpcyBub24temVybyBpZiB0aGUgc3ltYm9sJ3MgdmFsdWUgaGFzIGJlZW4gY29tcGxldGVseSByZXNvbHZlZC4gIEl0Ci1pcyB1c2VkIGR1cmluZyB0aGUgZmluYWwgcGFzcyBvdmVyIHRoZSBzeW1ib2wgdGFibGUuCi0KLUBpdGVtIHN5X3Jlc29sdmluZwotVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGRldGVjdCBsb29wcyB3aGlsZSByZXNvbHZpbmcgdGhlIHN5bWJvbCdzIHZhbHVlLgotCi1AaXRlbSBzeV91c2VkX2luX3JlbG9jCi1UaGlzIGZpZWxkIGlzIG5vbi16ZXJvIGlmIHRoZSBzeW1ib2wgaXMgdXNlZCBieSBhIHJlbG9jYXRpb24gZW50cnkuICBJZiBhIGxvY2FsCi1zeW1ib2wgaXMgdXNlZCBpbiBhIHJlbG9jYXRpb24gZW50cnksIGl0IG11c3QgYmUgcG9zc2libGUgdG8gcmVkaXJlY3QgdGhvc2UKLXJlbG9jYXRpb25zIHRvIG90aGVyIHN5bWJvbHMsIG9yIHRoaXMgc3ltYm9sIGNhbm5vdCBiZSByZW1vdmVkIGZyb20gdGhlIGZpbmFsCi1zeW1ib2wgbGlzdC4KLQotQGl0ZW0gc3lfbmV4dAotQGl0ZW14IHN5X3ByZXZpb3VzCi1UaGVzZSBwb2ludGVycyB0byBvdGhlciBAY29kZXtzeW1ib2xTfSBzdHJ1Y3R1cmVzIGRlc2NyaWJlIGEgc2luZ2x5IG9yIGRvdWJseQotbGlua2VkIGxpc3QuICAoSWYgQGNvZGV7U1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSU30gaXMgbm90IGRlZmluZWQsIHRoZQotQGNvZGV7c3lfcHJldmlvdXN9IGZpZWxkIHdpbGwgYmUgb21pdHRlZDsgQGNvZGV7U1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSU30gaXMKLWFsd2F5cyBkZWZpbmVkIGlmIEBjb2Rle0JGRF9BU1NFTUJMRVJ9LikgIFRoZXNlIGZpZWxkcyBzaG91bGQgYmUgYWNjZXNzZWQgd2l0aAotdGhlIEBjb2Rle3N5bWJvbF9uZXh0fSBhbmQgQGNvZGV7c3ltYm9sX3ByZXZpb3VzfSBtYWNyb3MuCi0KLUBpdGVtIHN5X2ZyYWcKLVRoaXMgcG9pbnRzIHRvIHRoZSBmcmFnIChAcHhyZWZ7RnJhZ3N9KSB0aGF0IHRoaXMgc3ltYm9sIGlzIGF0dGFjaGVkIHRvLgotCi1AaXRlbSBzeV91c2VkCi1XaGV0aGVyIHRoZSBzeW1ib2wgaXMgdXNlZCBhcyBhbiBvcGVyYW5kIG9yIGluIGFuIGV4cHJlc3Npb24uICBOb3RlOiBOb3QgYWxsIG9mCi10aGUgYmFja2VuZHMga2VlcCB0aGlzIGluZm9ybWF0aW9uIGFjY3VyYXRlOyBiYWNrZW5kcyB3aGljaCB1c2UgdGhpcyBiaXQgYXJlCi1yZXNwb25zaWJsZSBmb3Igc2V0dGluZyBpdCB3aGVuIGEgc3ltYm9sIGlzIHVzZWQgaW4gYmFja2VuZCByb3V0aW5lcy4KLQotQGl0ZW0gc3lfbXJpX2NvbW1vbgotV2hldGhlciB0aGUgc3ltYm9sIGlzIGFuIE1SSSBjb21tb24gc3ltYm9sIGNyZWF0ZWQgYnkgdGhlIEBjb2Rle0NPTU1PTn0KLXBzZXVkby1vcCB3aGVuIGFzc2VtYmxpbmcgaW4gTVJJIG1vZGUuCi0KLUBpdGVtIGJzeW0KLUlmIEBjb2Rle0JGRF9BU1NFTUJMRVJ9IGlzIGRlZmluZWQsIHRoaXMgcG9pbnRzIHRvIHRoZSBCRkQgQGNvZGV7YXN5bWJvbH0gdGhhdAotd2lsbCBiZSB1c2VkIGluIHdyaXRpbmcgdGhlIG9iamVjdCBmaWxlLgotCi1AaXRlbSBzeV9uYW1lX29mZnNldAotKE9ubHkgdXNlZCBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBub3QgZGVmaW5lZC4pICBUaGlzIGlzIHRoZSBwb3NpdGlvbiBvZgotdGhlIHN5bWJvbCdzIG5hbWUgaW4gdGhlIHN0cmluZyB0YWJsZSBvZiB0aGUgb2JqZWN0IGZpbGUuICBPbiBzb21lIGZvcm1hdHMsCi10aGlzIHdpbGwgc3RhcnQgYXQgcG9zaXRpb24gNCwgd2l0aCBwb3NpdGlvbiAwIHJlc2VydmVkIGZvciB1bm5hbWVkIHN5bWJvbHMuCi1UaGlzIGZpZWxkIGlzIG5vdCB1c2VkIHVudGlsIEBjb2Rle3dyaXRlX29iamVjdF9maWxlfSBpcyBjYWxsZWQuCi0KLUBpdGVtIHN5X3N5bWJvbAotKE9ubHkgdXNlZCBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBub3QgZGVmaW5lZC4pICBUaGlzIGlzIHRoZQotZm9ybWF0LXNwZWNpZmljIHN5bWJvbCBzdHJ1Y3R1cmUsIGFzIGl0IHdvdWxkIGJlIHdyaXR0ZW4gaW50byB0aGUgb2JqZWN0IGZpbGUuCi0KLUBpdGVtIHN5X251bWJlcgotKE9ubHkgdXNlZCBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBub3QgZGVmaW5lZC4pICBUaGlzIGlzIGEgMjQtYml0IHN5bWJvbAotbnVtYmVyLCBmb3IgdXNlIGluIGNvbnN0cnVjdGluZyByZWxvY2F0aW9uIHRhYmxlIGVudHJpZXMuCi0KLUBpdGVtIHN5X29iagotVGhpcyBmb3JtYXQtc3BlY2lmaWMgZGF0YSBpcyBvZiB0eXBlIEBjb2Rle09CSl9TWU1GSUVMRF9UWVBFfS4gIElmIG5vIG1hY3JvIGJ5Ci10aGF0IG5hbWUgaXMgZGVmaW5lZCBpbiBAZmlsZXtvYmotZm9ybWF0Lmh9LCB0aGlzIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCi1AaXRlbSBzeV90YwotVGhpcyBwcm9jZXNzb3Itc3BlY2lmaWMgZGF0YSBpcyBvZiB0eXBlIEBjb2Rle1RDX1NZTUZJRUxEX1RZUEV9LiAgSWYgbm8gbWFjcm8KLWJ5IHRoYXQgbmFtZSBpcyBkZWZpbmVkIGluIEBmaWxle3RhcmctY3B1Lmh9LCB0aGlzIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCi1AaXRlbSBUQVJHRVRfU1lNQk9MX0ZJRUxEUwotSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBpdCBkZWZpbmVzIGFkZGl0aW9uYWwgZmllbGRzIGluIHRoZSBzeW1ib2wgc3RydWN0dXJlLgotVGhpcyBtYWNybyBpcyBvYnNvbGV0ZSwgYW5kIHNob3VsZCBiZSByZXBsYWNlZCB3aGVuIHBvc3NpYmxlIGJ5IHVzZXMgb2YKLUBjb2Rle09CSl9TWU1GSUVMRF9UWVBFfSBhbmQgQGNvZGV7VENfU1lNRklFTERfVFlQRX0uCi1AZW5kIHRhYmxlCi0KLVRoZXJlIGFyZSBhIG51bWJlciBvZiBhY2Nlc3Mgcm91dGluZXMgdXNlZCB0byBleHRyYWN0IHRoZSBmaWVsZHMgb2YgYQotQGNvZGV7c3ltYm9sU30gc3RydWN0dXJlLiAgV2hlbiBwb3NzaWJsZSwgdGhlc2Ugcm91dGluZXMgc2hvdWxkIGJlIHVzZWQgcmF0aGVyCi10aGFuIHJlZmVycmluZyB0byB0aGUgZmllbGRzIGRpcmVjdGx5LiAgVGhlc2Ugcm91dGluZXMgd2lsbCB3b3JrIGZvciBhbnkgR0FTCi12ZXJzaW9uLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIFNfU0VUX1ZBTFVFCi1AY2luZGV4IFNfU0VUX1ZBTFVFCi1TZXQgdGhlIHN5bWJvbCdzIHZhbHVlLgotCi1AaXRlbSBTX0dFVF9WQUxVRQotQGNpbmRleCBTX0dFVF9WQUxVRQotR2V0IHRoZSBzeW1ib2wncyB2YWx1ZS4gIFRoaXMgd2lsbCBjYXVzZSBAY29kZXtyZXNvbHZlX3N5bWJvbF92YWx1ZX0gdG8gYmUKLWNhbGxlZCBpZiBuZWNlc3NhcnksIHNvIEBjb2Rle1NfR0VUX1ZBTFVFfSBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBpdCBpcwotc2FmZSB0byByZXNvbHZlIHN5bWJvbHMgKGkuZS4sIGFmdGVyIHRoZSBlbnRpcmUgaW5wdXQgZmlsZSBoYXMgYmVlbiByZWFkIGFuZAotYWxsIHN5bWJvbHMgaGF2ZSBiZWVuIGRlZmluZWQpLgotCi1AaXRlbSBTX1NFVF9TRUdNRU5UCi1AY2luZGV4IFNfU0VUX1NFR01FTlQKLVNldCB0aGUgc2VjdGlvbiBvZiB0aGUgc3ltYm9sLgotCi1AaXRlbSBTX0dFVF9TRUdNRU5UCi1AY2luZGV4IFNfR0VUX1NFR01FTlQKLUdldCB0aGUgc3ltYm9sJ3Mgc2VjdGlvbi4KLQotQGl0ZW0gU19HRVRfTkFNRQotQGNpbmRleCBTX0dFVF9OQU1FCi1HZXQgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbC4KLQotQGl0ZW0gU19TRVRfTkFNRQotQGNpbmRleCBTX1NFVF9OQU1FCi1TZXQgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbC4KLQotQGl0ZW0gU19JU19FWFRFUk5BTAotQGNpbmRleCBTX0lTX0VYVEVSTkFMCi1SZXR1cm4gbm9uLXplcm8gaWYgdGhlIHN5bWJvbCBpcyBleHRlcm5hbGx5IHZpc2libGUuCi0KLUBpdGVtIFNfSVNfRVhURVJOCi1AY2luZGV4IFNfSVNfRVhURVJOCi1BIHN5bm9ueW0gZm9yIEBjb2Rle1NfSVNfRVhURVJOQUx9LiAgRG9uJ3QgdXNlIGl0LgotCi1AaXRlbSBTX0lTX1dFQUsKLUBjaW5kZXggU19JU19XRUFLCi1SZXR1cm4gbm9uLXplcm8gaWYgdGhlIHN5bWJvbCBpcyB3ZWFrLgotCi1AaXRlbSBTX0lTX0NPTU1PTgotQGNpbmRleCBTX0lTX0NPTU1PTgotUmV0dXJuIG5vbi16ZXJvIGlmIHRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgQ29tbW9uIHN5bWJvbHMgYXJlIHNvbWV0aW1lcwotcmVwcmVzZW50ZWQgYXMgdW5kZWZpbmVkIHN5bWJvbHMgd2l0aCBhIHZhbHVlLCBpbiB3aGljaCBjYXNlIHRoaXMgZnVuY3Rpb24gd2lsbAotbm90IGJlIHJlbGlhYmxlLgotCi1AaXRlbSBTX0lTX0RFRklORUQKLUBjaW5kZXggU19JU19ERUZJTkVECi1SZXR1cm4gbm9uLXplcm8gaWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZC4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGlhYmxlIHdoZW4KLWNhbGxlZCBvbiBhIGNvbW1vbiBzeW1ib2wuCi0KLUBpdGVtIFNfSVNfREVCVUcKLUBjaW5kZXggU19JU19ERUJVRwotUmV0dXJuIG5vbi16ZXJvIGlmIHRoaXMgaXMgYSBkZWJ1Z2dpbmcgc3ltYm9sLgotCi1AaXRlbSBTX0lTX0xPQ0FMCi1AY2luZGV4IFNfSVNfTE9DQUwKLVJldHVybiBub24temVybyBpZiB0aGlzIGlzIGEgbG9jYWwgYXNzZW1ibGVyIHN5bWJvbCB3aGljaCBzaG91bGQgbm90IGJlCi1pbmNsdWRlZCBpbiB0aGUgZmluYWwgc3ltYm9sIHRhYmxlLiAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBvcHBvc2l0ZSBvZgotQGNvZGV7U19JU19FWFRFUk5BTH0uICBUaGUgQHNhbXB7LUx9IGFzc2VtYmxlciBvcHRpb24gYWZmZWN0cyB0aGUgcmV0dXJuIHZhbHVlCi1vZiB0aGlzIGZ1bmN0aW9uLgotCi1AaXRlbSBTX1NFVF9FWFRFUk5BTAotQGNpbmRleCBTX1NFVF9FWFRFUk5BTAotTWFyayB0aGUgc3ltYm9sIGFzIGV4dGVybmFsbHkgdmlzaWJsZS4KLQotQGl0ZW0gU19DTEVBUl9FWFRFUk5BTAotQGNpbmRleCBTX0NMRUFSX0VYVEVSTkFMCi1NYXJrIHRoZSBzeW1ib2wgYXMgbm90IGV4dGVybmFsbHkgdmlzaWJsZS4KLQotQGl0ZW0gU19TRVRfV0VBSwotQGNpbmRleCBTX1NFVF9XRUFLCi1NYXJrIHRoZSBzeW1ib2wgYXMgd2Vhay4KLQotQGl0ZW0gU19HRVRfVFlQRQotQGl0ZW0gU19HRVRfREVTQwotQGl0ZW0gU19HRVRfT1RIRVIKLUBjaW5kZXggU19HRVRfVFlQRQotQGNpbmRleCBTX0dFVF9ERVNDCi1AY2luZGV4IFNfR0VUX09USEVSCi1HZXQgdGhlIEBjb2Rle3R5cGV9LCBAY29kZXtkZXNjfSwgYW5kIEBjb2Rle290aGVyfSBmaWVsZHMgb2YgdGhlIHN5bWJvbC4gIFRoZXNlCi1hcmUgb25seSBkZWZpbmVkIGZvciBvYmplY3QgZmlsZSBmb3JtYXRzIGZvciB3aGljaCB0aGV5IG1ha2Ugc2Vuc2UgKHByaW1hcmlseQotYS5vdXQpLgotCi1AaXRlbSBTX1NFVF9UWVBFCi1AaXRlbSBTX1NFVF9ERVNDCi1AaXRlbSBTX1NFVF9PVEhFUgotQGNpbmRleCBTX1NFVF9UWVBFCi1AY2luZGV4IFNfU0VUX0RFU0MKLUBjaW5kZXggU19TRVRfT1RIRVIKLVNldCB0aGUgQGNvZGV7dHlwZX0sIEBjb2Rle2Rlc2N9LCBhbmQgQGNvZGV7b3RoZXJ9IGZpZWxkcyBvZiB0aGUgc3ltYm9sLiAgVGhlc2UKLWFyZSBvbmx5IGRlZmluZWQgZm9yIG9iamVjdCBmaWxlIGZvcm1hdHMgZm9yIHdoaWNoIHRoZXkgbWFrZSBzZW5zZSAocHJpbWFyaWx5Ci1hLm91dCkuCi0KLUBpdGVtIFNfR0VUX1NJWkUKLUBjaW5kZXggU19HRVRfU0laRQotR2V0IHRoZSBzaXplIG9mIGEgc3ltYm9sLiAgVGhpcyBpcyBvbmx5IGRlZmluZWQgZm9yIG9iamVjdCBmaWxlIGZvcm1hdHMgZm9yCi13aGljaCBpdCBtYWtlcyBzZW5zZSAocHJpbWFyaWx5IEVMRikuCi0KLUBpdGVtIFNfU0VUX1NJWkUKLUBjaW5kZXggU19TRVRfU0laRQotU2V0IHRoZSBzaXplIG9mIGEgc3ltYm9sLiAgVGhpcyBpcyBvbmx5IGRlZmluZWQgZm9yIG9iamVjdCBmaWxlIGZvcm1hdHMgZm9yCi13aGljaCBpdCBtYWtlcyBzZW5zZSAocHJpbWFyaWx5IEVMRikuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEV4cHJlc3Npb25zCi1Ac3Vic2VjdGlvbiBFeHByZXNzaW9ucwotQGNpbmRleCBpbnRlcm5hbHMsIGV4cHJlc3Npb25zCi1AY2luZGV4IGV4cHJlc3Npb25zLCBpbnRlcm5hbAotQGNpbmRleCBleHByZXNzaW9uUyBzdHJ1Y3R1cmUKLQotRXhwcmVzc2lvbnMgYXJlIHN0b3JlZCBpbiBhbiBAY29kZXtleHByZXNzaW9uU30gc3RydWN0dXJlLiAgVGhlIHN0cnVjdHVyZSBpcwotZGVmaW5lZCBpbiBAZmlsZXtleHByLmh9LgotCi1AY2luZGV4IGV4cHJlc3Npb24KLVRoZSBtYWNybyBAY29kZXtleHByZXNzaW9ufSB3aWxsIGNyZWF0ZSBhbiBAY29kZXtleHByZXNzaW9uU30gc3RydWN0dXJlIGJhc2VkCi1vbiB0aGUgdGV4dCBmb3VuZCBhdCB0aGUgZ2xvYmFsIHZhcmlhYmxlIEBjb2Rle2lucHV0X2xpbmVfcG9pbnRlcn0uCi0KLUBjaW5kZXggbWFrZV9leHByX3N5bWJvbAotQGNpbmRleCBleHByX3N5bWJvbF93aGVyZQotQSBzaW5nbGUgQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZSBjYW4gcmVwcmVzZW50IGEgc2luZ2xlIG9wZXJhdGlvbi4KLUNvbXBsZXggZXhwcmVzc2lvbnMgYXJlIGZvcm1lZCBieSBjcmVhdGluZyBAZGZue2V4cHJlc3Npb24gc3ltYm9sc30gYW5kCi1jb21iaW5pbmcgdGhlbSBpbiBAY29kZXtleHByZXNzaW9uU30gc3RydWN0dXJlcy4gIEFuIGV4cHJlc3Npb24gc3ltYm9sIGlzCi1jcmVhdGVkIGJ5IGNhbGxpbmcgQGNvZGV7bWFrZV9leHByX3N5bWJvbH0uICBBbiBleHByZXNzaW9uIHN5bWJvbCBzaG91bGQKLW5hdHVyYWxseSBuZXZlciBhcHBlYXIgaW4gYSBzeW1ib2wgdGFibGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gb2YKLUBjb2Rle1NfSVNfTE9DQUx9IChAcHhyZWZ7U3ltYm9sc30pIHJlZmxlY3RzIHRoYXQuICBUaGUgZnVuY3Rpb24KLUBjb2Rle2V4cHJfc3ltYm9sX3doZXJlfSByZXR1cm5zIG5vbi16ZXJvIGlmIGEgc3ltYm9sIGlzIGFuIGV4cHJlc3Npb24gc3ltYm9sLAotYW5kIGFsc28gcmV0dXJucyB0aGUgZmlsZSBhbmQgbGluZSBmb3IgdGhlIGV4cHJlc3Npb24gd2hpY2ggY2F1c2VkIGl0IHRvIGJlCi1jcmVhdGVkLgotCi1UaGUgQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZSBoYXMgdHdvIHN5bWJvbCBmaWVsZHMsIGEgbnVtYmVyIGZpZWxkLCBhbgotb3BlcmF0b3IgZmllbGQsIGFuZCBhIGZpZWxkIGluZGljYXRpbmcgd2hldGhlciB0aGUgbnVtYmVyIGlzIHVuc2lnbmVkLgotCi1UaGUgb3BlcmF0b3IgZmllbGQgaXMgb2YgdHlwZSBAY29kZXtvcGVyYXRvclR9LCBhbmQgZGVzY3JpYmVzIGhvdyB0byBpbnRlcnByZXQKLXRoZSBvdGhlciBmaWVsZHM7IHNlZSB0aGUgZGVmaW5pdGlvbiBpbiBAZmlsZXtleHByLmh9IGZvciB0aGUgcG9zc2liaWxpdGllcy4KLQotQW4gQGNvZGV7b3BlcmF0b3JUfSB2YWx1ZSBvZiBAY29kZXtPX2JpZ30gaW5kaWNhdGVzIGVpdGhlciBhIGZsb2F0aW5nIHBvaW50Ci1udW1iZXIsIHN0b3JlZCBpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlIEBjb2Rle2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyfSwgb3IKLWFuIGludGVnZXIgdG8gbGFyZ2UgdG8gc3RvcmUgaW4gYW4gQGNvZGV7b2Zmc2V0VH0gdHlwZSwgc3RvcmVkIGluIHRoZSBnbG9iYWwKLWFycmF5IEBjb2Rle2dlbmVyaWNfYmlnbnVtfS4gIFRoaXMgcmF0aGVyIGluZmxleGlibGUgYXBwcm9hY2ggbWFrZXMgaXQKLWltcG9zc2libGUgdG8gdXNlIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgb3IgbGFyZ2UgZXhwcmVzc2lvbnMgaW4gY29tcGxleAotZXhwcmVzc2lvbnMuCi0KLUBub2RlIEZpeHVwcwotQHN1YnNlY3Rpb24gRml4dXBzCi1AY2luZGV4IGludGVybmFscywgZml4dXBzCi1AY2luZGV4IGZpeHVwcwotQGNpbmRleCBmaXhTIHN0cnVjdHVyZQotCi1BIEBkZm57Zml4dXB9IGlzIGJhc2ljYWxseSBhbnl0aGluZyB3aGljaCBjYW4gbm90IGJlIHJlc29sdmVkIGluIHRoZSBmaXJzdAotcGFzcy4gIFNvbWV0aW1lcyBhIGZpeHVwIGNhbiBiZSByZXNvbHZlZCBieSB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseTsgaWYgbm90LAotdGhlIGZpeHVwIGJlY29tZXMgYSByZWxvY2F0aW9uIGVudHJ5IGluIHRoZSBvYmplY3QgZmlsZS4KLQotQGNpbmRleCBmaXhfbmV3Ci1AY2luZGV4IGZpeF9uZXdfZXhwCi1BIGZpeHVwIGlzIGNyZWF0ZWQgYnkgYSBjYWxsIHRvIEBjb2Rle2ZpeF9uZXd9IG9yIEBjb2Rle2ZpeF9uZXdfZXhwfS4gIEJvdGgKLXRha2UgYSBmcmFnIChAcHhyZWZ7RnJhZ3N9KSwgYSBwb3NpdGlvbiB3aXRoaW4gdGhlIGZyYWcsIGEgc2l6ZSwgYW4gaW5kaWNhdGlvbgotb2Ygd2hldGhlciB0aGUgZml4dXAgaXMgUEMgcmVsYXRpdmUsIGFuZCBhIHR5cGUuICBJbiBhIEBjb2Rle0JGRF9BU1NFTUJMRVJ9Ci1HQVMsIHRoZSB0eXBlIGlzIG5vbWluYWxseSBhIEBjb2Rle2JmZF9yZWxvY19jb2RlX3JlYWxfdHlwZX0sIGJ1dCBzZXZlcmFsCi10YXJnZXRzIHVzZSBvdGhlciB0eXBlIGNvZGVzIHRvIHJlcHJlc2VudCBmaXh1cHMgdGhhdCBjYW4gbm90IGJlIGRlc2NyaWJlZCBhcwotcmVsb2NhdGlvbnMuCi0KLVRoZSBAY29kZXtmaXhTfSBzdHJ1Y3R1cmUgaGFzIGEgbnVtYmVyIG9mIGZpZWxkcywgc2V2ZXJhbCBvZiB3aGljaCBhcmUgb2Jzb2xldGUKLW9yIGFyZSBvbmx5IHVzZWQgYnkgYSBwYXJ0aWN1bGFyIHRhcmdldC4gIFRoZSBpbXBvcnRhbnQgZmllbGRzIGFyZToKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBmeF9mcmFnCi1UaGUgZnJhZyAoQHB4cmVme0ZyYWdzfSkgdGhpcyBmaXh1cCBpcyBpbi4KLQotQGl0ZW0gZnhfd2hlcmUKLVRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIGZyYWcgd2hlcmUgdGhlIGZpeHVwIG9jY3Vycy4KLQotQGl0ZW0gZnhfYWRkc3kKLVRoZSBzeW1ib2wgdGhpcyBmaXh1cCBpcyBhZ2FpbnN0LiAgVHlwaWNhbGx5LCB0aGUgdmFsdWUgb2YgdGhpcyBzeW1ib2wgaXMgYWRkZWQKLWludG8gdGhlIG9iamVjdCBjb250ZW50cy4gIFRoaXMgbWF5IGJlIE5VTEwuCi0KLUBpdGVtIGZ4X3N1YnN5Ci1UaGUgdmFsdWUgb2YgdGhpcyBzeW1ib2wgaXMgc3VidHJhY3RlZCBmcm9tIHRoZSBvYmplY3QgY29udGVudHMuICBUaGlzIGlzCi1ub3JtYWxseSBOVUxMLgotCi1AaXRlbSBmeF9vZmZzZXQKLUEgbnVtYmVyIHdoaWNoIGlzIGFkZGVkIGludG8gdGhlIGZpeHVwLgotCi1AaXRlbSBmeF9hZGRudW1iZXIKLVNvbWUgQ1BVIGJhY2tlbmRzIHVzZSB0aGlzIGZpZWxkIHRvIGNvbnZleSBpbmZvcm1hdGlvbiBiZXR3ZWVuCi1AY29kZXttZF9hcHBseV9maXh9IGFuZCBAY29kZXt0Y19nZW5fcmVsb2N9LiAgVGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQgY29kZSBkb2VzCi1ub3QgdXNlIGl0LgotCi1AaXRlbSBmeF9uZXh0Ci1UaGUgbmV4dCBmaXh1cCBpbiB0aGUgc2VjdGlvbi4KLQotQGl0ZW0gZnhfcl90eXBlCi1UaGUgdHlwZSBvZiB0aGUgZml4dXAuICBUaGlzIGZpZWxkIGlzIG9ubHkgZGVmaW5lZCBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfSwgb3IKLWlmIHRoZSB0YXJnZXQgZGVmaW5lcyBAY29kZXtORUVEX0ZYX1JfVFlQRX0uCi0KLUBpdGVtIGZ4X3NpemUKLVRoZSBzaXplIG9mIHRoZSBmaXh1cC4gIFRoaXMgaXMgbW9zdGx5IHVzZWQgZm9yIGVycm9yIGNoZWNraW5nLgotCi1AaXRlbSBmeF9wY3JlbAotV2hldGhlciB0aGUgZml4dXAgaXMgUEMgcmVsYXRpdmUuCi0KLUBpdGVtIGZ4X2RvbmUKLU5vbi16ZXJvIGlmIHRoZSBmaXh1cCBoYXMgYmVlbiBhcHBsaWVkLCBhbmQgbm8gcmVsb2NhdGlvbiBlbnRyeSBuZWVkcyB0byBiZQotZ2VuZXJhdGVkLgotCi1AaXRlbSBmeF9maWxlCi1AaXRlbXggZnhfbGluZQotVGhlIGZpbGUgYW5kIGxpbmUgd2hlcmUgdGhlIGZpeHVwIHdhcyBjcmVhdGVkLgotCi1AaXRlbSB0Y19maXhfZGF0YQotVGhpcyBoYXMgdGhlIHR5cGUgQGNvZGV7VENfRklYX1RZUEV9LCBhbmQgaXMgb25seSBkZWZpbmVkIGlmIHRoZSB0YXJnZXQgZGVmaW5lcwotdGhhdCBtYWNyby4KLUBlbmQgdGFibGUKLQotQG5vZGUgRnJhZ3MKLUBzdWJzZWN0aW9uIEZyYWdzCi1AY2luZGV4IGludGVybmFscywgZnJhZ3MKLUBjaW5kZXggZnJhZ3MKLUBjaW5kZXggZnJhZ1Mgc3RydWN0dXJlLgotCi1UaGUgQGNvZGV7ZnJhZ1N9IHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIEBmaWxle2FzLmh9LiAgRWFjaCBmcmFnIHJlcHJlc2VudHMgYQotcG9ydGlvbiBvZiB0aGUgZmluYWwgb2JqZWN0IGZpbGUuICBBcyBHQVMgcmVhZHMgdGhlIHNvdXJjZSBmaWxlLCBpdCBjcmVhdGVzCi1mcmFncyB0byBob2xkIHRoZSBkYXRhIHRoYXQgaXQgcmVhZHMuICBBdCB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseSB0aGUgZnJhZ3MgYW5kCi1maXh1cHMgYXJlIHByb2Nlc3NlZCB0byBwcm9kdWNlIHRoZSBmaW5hbCBjb250ZW50cy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBmcl9hZGRyZXNzCi1UaGUgYWRkcmVzcyBvZiB0aGUgZnJhZy4gIFRoaXMgaXMgbm90IHNldCB1bnRpbCB0aGUgYXNzZW1ibGVyIHJlc2NhbnMgdGhlIGxpc3QKLW9mIGFsbCBmcmFncyBhZnRlciB0aGUgZW50aXJlIGlucHV0IGZpbGUgaXMgcGFyc2VkLiAgVGhlIGZ1bmN0aW9uCi1AY29kZXtyZWxheF9zZWdtZW50fSBmaWxscyBpbiB0aGlzIGZpZWxkLgotCi1AaXRlbSBmcl9uZXh0Ci1Qb2ludGVyIHRvIHRoZSBuZXh0IGZyYWcgaW4gdGhpcyAoc3ViKXNlY3Rpb24uCi0KLUBpdGVtIGZyX2ZpeAotRml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2Uga25vdyB3ZSdyZSBnb2luZyB0byBlbWl0IHRvIHRoZSBvdXRwdXQgZmlsZS4gIE1heQotYmUgemVyby4KLQotQGl0ZW0gZnJfdmFyCi1WYXJpYWJsZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3ZSBtYXkgb3V0cHV0LCBhZnRlciB0aGUgaW5pdGlhbCBAY29kZXtmcl9maXh9Ci1jaGFyYWN0ZXJzLiAgTWF5IGJlIHplcm8uCi0KLUBpdGVtIGZyX29mZnNldAotVGhlIGludGVycHJldGF0aW9uIG9mIHRoaXMgZmllbGQgaXMgY29udHJvbGxlZCBieSBAY29kZXtmcl90eXBlfS4gIEdlbmVyYWxseSwKLWlmIEBjb2Rle2ZyX3Zhcn0gaXMgbm9uLXplcm8sIHRoaXMgaXMgYSByZXBlYXQgY291bnQ6IHRoZSBAY29kZXtmcl92YXJ9Ci1jaGFyYWN0ZXJzIGFyZSBvdXRwdXQgQGNvZGV7ZnJfb2Zmc2V0fSB0aW1lcy4KLQotQGl0ZW0gbGluZQotSG9sZHMgbGluZSBudW1iZXIgaW5mbyB3aGVuIGFuIGFzc2VtYmxlciBsaXN0aW5nIHdhcyByZXF1ZXN0ZWQuCi0KLUBpdGVtIGZyX3R5cGUKLVJlbGF4YXRpb24gc3RhdGUuICBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgQGNvZGV7ZnJfb2Zmc2V0fSwKLUBjb2Rle2ZyX3N5bWJvbH0gYW5kIHRoZSB2YXJpYWJsZS1sZW5ndGggdGFpbCBvZiB0aGUgZnJhZywgYXMgd2VsbCBhcyB0aGUKLXRyZWF0bWVudCBpdCBnZXRzIGluIHZhcmlvdXMgcGhhc2VzIG9mIHByb2Nlc3NpbmcuICBJdCBkb2VzIG5vdCBhZmZlY3QgdGhlCi1pbml0aWFsIEBjb2Rle2ZyX2ZpeH0gY2hhcmFjdGVyczsgdGhleSBhcmUgYWx3YXlzIHN1cHBvc2VkIHRvIGJlIG91dHB1dAotdmVyYmF0aW0gKGZpeHVwcyBhc2lkZSkuICBTZWUgYmVsb3cgZm9yIHNwZWNpZmljIHZhbHVlcyB0aGlzIGZpZWxkIGNhbiBoYXZlLgotCi1AaXRlbSBmcl9zdWJ0eXBlCi1SZWxheGF0aW9uIHN1YnN0YXRlLiAgSWYgdGhlIG1hY3JvIEBjb2Rle21kX3JlbGF4X2ZyYWd9IGlzbid0IGRlZmluZWQsIHRoaXMgaXMKLWFzc3VtZWQgdG8gYmUgYW4gaW5kZXggaW50byBAY29kZXtUQ19HRU5FUklDX1JFTEFYX1RBQkxFfSBmb3IgdGhlIGdlbmVyaWMKLXJlbGF4YXRpb24gY29kZSB0byBwcm9jZXNzIChAcHhyZWZ7UmVsYXhhdGlvbn0pLiAgSWYgQGNvZGV7bWRfcmVsYXhfZnJhZ30gaXMKLWRlZmluZWQsIHRoaXMgZmllbGQgaXMgYXZhaWxhYmxlIGZvciBhbnkgdXNlIGJ5IHRoZSBDUFUtc3BlY2lmaWMgY29kZS4KLQotQGl0ZW0gZnJfc3ltYm9sCi1UaGlzIG5vcm1hbGx5IGluZGljYXRlcyB0aGUgc3ltYm9sIHRvIHVzZSB3aGVuIHJlbGF4aW5nIHRoZSBmcmFnIGFjY29yZGluZyB0bwotQGNvZGV7ZnJfdHlwZX0uCi0KLUBpdGVtIGZyX29wY29kZQotUG9pbnRzIHRvIHRoZSBsb3dlc3QtYWRkcmVzc2VkIGJ5dGUgb2YgdGhlIG9wY29kZSwgZm9yIHVzZSBpbiByZWxheGF0aW9uLgotCi1AaXRlbSB0Y19mcmFnX2RhdGEKLVRhcmdldCBzcGVjaWZpYyBmcmFnbWVudCBkYXRhIG9mIHR5cGUgVENfRlJBR19UWVBFLgotT25seSBwcmVzZW50IGlmIEBjb2Rle1RDX0ZSQUdfVFlQRX0gaXMgZGVmaW5lZC4KLQotQGl0ZW0gZnJfZmlsZQotQGl0ZW14IGZyX2xpbmUKLVRoZSBmaWxlIGFuZCBsaW5lIHdoZXJlIHRoaXMgZnJhZyB3YXMgbGFzdCBtb2RpZmllZC4KLQotQGl0ZW0gZnJfbGl0ZXJhbAotRGVjbGFyZWQgYXMgYSBvbmUtY2hhcmFjdGVyIGFycmF5LCB0aGlzIGxhc3QgZmllbGQgZ3Jvd3MgYXJiaXRyYXJpbHkgbGFyZ2UgdG8KLWhvbGQgdGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGUgZnJhZy4KLUBlbmQgdGFibGUKLQotVGhlc2UgYXJlIHRoZSBwb3NzaWJsZSByZWxheGF0aW9uIHN0YXRlcywgcHJvdmlkZWQgaW4gdGhlIGVudW1lcmF0aW9uIHR5cGUKLUBjb2Rle3JlbGF4X3N0YXRlVH0sIGFuZCB0aGUgaW50ZXJwcmV0YXRpb25zIHRoZXkgcmVwcmVzZW50IGZvciB0aGUgb3RoZXIKLWZpZWxkczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSByc19hbGlnbgotQGl0ZW14IHJzX2FsaWduX2NvZGUKLVRoZSBzdGFydCBvZiB0aGUgZm9sbG93aW5nIGZyYWcgc2hvdWxkIGJlIGFsaWduZWQgb24gc29tZSBib3VuZGFyeS4gIEluIHRoaXMKLWZyYWcsIEBjb2Rle2ZyX29mZnNldH0gaXMgdGhlIGxvZ2FyaXRobSAoYmFzZSAyKSBvZiB0aGUgYWxpZ25tZW50IGluIGJ5dGVzLgotKEZvciBleGFtcGxlLCBpZiBhbGlnbm1lbnQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IHdlcmUgZGVzaXJlZCwgQGNvZGV7ZnJfb2Zmc2V0fQotd291bGQgaGF2ZSBhIHZhbHVlIG9mIDMuKSAgVGhlIHZhcmlhYmxlIGNoYXJhY3RlcnMgaW5kaWNhdGUgdGhlIGZpbGwgcGF0dGVybiB0bwotYmUgdXNlZC4gIFRoZSBAY29kZXtmcl9zdWJ0eXBlfSBmaWVsZCBob2xkcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcAotd2hlbiBkb2luZyB0aGlzIGFsaWdubWVudC4gIElmIG1vcmUgYnl0ZXMgYXJlIG5lZWRlZCwgdGhlIGFsaWdubWVudCBpcyBub3QKLWRvbmUuICBBbiBAY29kZXtmcl9zdWJ0eXBlfSB2YWx1ZSBvZiAwIG1lYW5zIG5vIG1heGltdW0sIHdoaWNoIGlzIHRoZSBub3JtYWwKLWNhc2UuICBUYXJnZXQgYmFja2VuZHMgY2FuIHVzZSBAY29kZXtyc19hbGlnbl9jb2RlfSB0byBoYW5kbGUgY2VydGFpbiB0eXBlcyBvZgotYWxpZ25tZW50IGRpZmZlcmVudGx5LgotCi1AaXRlbSByc19icm9rZW5fd29yZAotVGhpcyBpbmRpY2F0ZXMgdGhhdCBgYGJyb2tlbiB3b3JkJycgcHJvY2Vzc2luZyBzaG91bGQgYmUgZG9uZSAoQHB4cmVme0Jyb2tlbgotd29yZHN9KS4gIElmIGJyb2tlbiB3b3JkIHByb2Nlc3NpbmcgaXMgbm90IG5lY2Vzc2FyeSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUsCi10aGlzIGVudW1lcmF0b3IgdmFsdWUgd2lsbCBub3QgYmUgZGVmaW5lZC4KLQotQGl0ZW0gcnNfY2ZhCi1UaGlzIHN0YXRlIGlzIHVzZWQgdG8gaW1wbGVtZW50IGV4Y2VwdGlvbiBmcmFtZSBvcHRpbWl6YXRpb25zLiAgVGhlCi1AY29kZXtmcl9zeW1ib2x9IGlzIGFuIGV4cHJlc3Npb24gc3ltYm9sIGZvciB0aGUgc3VidHJhY3Rpb24gd2hpY2ggbWF5IGJlCi1yZWxheGVkLiAgVGhlIEBjb2Rle2ZyX29wY29kZX0gZmllbGQgaG9sZHMgdGhlIGZyYWcgZm9yIHRoZSBwcmVjZWRpbmcgY29tbWFuZAotYnl0ZS4gIFRoZSBAY29kZXtmcl9vZmZzZXR9IGZpZWxkIGhvbGRzIHRoZSBvZmZzZXQgd2l0aGluIHRoYXQgZnJhZy4gIFRoZQotQGNvZGV7ZnJfc3VidHlwZX0gZmllbGQgaXMgdXNlZCBkdXJpbmcgcmVsYXhhdGlvbiB0byBob2xkIHRoZSBjdXJyZW50IHNpemUgb2YKLXRoZSBmcmFnLgotCi1AaXRlbSByc19maWxsCi1UaGUgdmFyaWFibGUgY2hhcmFjdGVycyBhcmUgdG8gYmUgcmVwZWF0ZWQgQGNvZGV7ZnJfb2Zmc2V0fSB0aW1lcy4gIElmCi1AY29kZXtmcl9vZmZzZXR9IGlzIDAsIHRoaXMgZnJhZyBoYXMgYSBsZW5ndGggb2YgQGNvZGV7ZnJfZml4fS4gIE1vc3QgZnJhZ3MKLWhhdmUgdGhpcyB0eXBlLgotCi1AaXRlbSByc19sZWIxMjgKLVRoaXMgc3RhdGUgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIERXQVJGIGBgbGl0dGxlIGVuZGlhbiBiYXNlIDEyOCcnIAotdmFyaWFibGUgbGVuZ3RoIG51bWJlciBmb3JtYXQuICBUaGUgQGNvZGV7ZnJfc3ltYm9sfSBpcyBhbHdheXMgYW4gZXhwcmVzc2lvbgotc3ltYm9sLCBhcyBjb25zdGFudCBleHByZXNzaW9ucyBhcmUgZW1pdHRlZCBkaXJlY3RseS4gIFRoZSBAY29kZXtmcl9vZmZzZXR9Ci1maWVsZCBpcyB1c2VkIGR1cmluZyByZWxheGF0aW9uIHRvIGhvbGQgdGhlIHByZXZpb3VzIHNpemUgb2YgdGhlIG51bWJlciBzbwotdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIGlmIHRoZSBmcmFnbWVudCBjaGFuZ2VkIHNpemUuCi0KLUBpdGVtIHJzX21hY2hpbmVfZGVwZW5kZW50Ci1EaXNwbGFjZW1lbnQgcmVsYXhhdGlvbiBpcyB0byBiZSBkb25lIG9uIHRoaXMgZnJhZy4gIFRoZSB0YXJnZXQgaXMgaW5kaWNhdGVkIGJ5Ci1AY29kZXtmcl9zeW1ib2x9IGFuZCBAY29kZXtmcl9vZmZzZXR9LCBhbmQgQGNvZGV7ZnJfc3VidHlwZX0gaW5kaWNhdGVzIHRoZQotcGFydGljdWxhciBtYWNoaW5lLXNwZWNpZmljIGFkZHJlc3NpbmcgbW9kZSBkZXNpcmVkLiAgQHhyZWZ7UmVsYXhhdGlvbn0uCi0KLUBpdGVtIHJzX29yZwotVGhlIHN0YXJ0IG9mIHRoZSBmb2xsb3dpbmcgZnJhZyBzaG91bGQgYmUgcHVzaGVkIGJhY2sgdG8gc29tZSBzcGVjaWZpYyBvZmZzZXQKLXdpdGhpbiB0aGUgc2VjdGlvbi4gIChTb21lIGFzc2VtYmxlcnMgdXNlIHRoZSB2YWx1ZSBhcyBhbiBhYnNvbHV0ZSBhZGRyZXNzOyBHQVMKLWRvZXMgbm90IGhhbmRsZSBmaW5hbCBhYnNvbHV0ZSBhZGRyZXNzZXMsIGJ1dCByYXRoZXIgcmVxdWlyZXMgdGhhdCB0aGUgbGlua2VyCi1zZXQgdGhlbS4pICBUaGUgb2Zmc2V0IGlzIGdpdmVuIGJ5IEBjb2Rle2ZyX3N5bWJvbH0gYW5kIEBjb2Rle2ZyX29mZnNldH07IG9uZQotY2hhcmFjdGVyIGZyb20gdGhlIHZhcmlhYmxlLWxlbmd0aCB0YWlsIGlzIHVzZWQgYXMgdGhlIGZpbGwgY2hhcmFjdGVyLgotQGVuZCB0YWJsZQotCi1AY2luZGV4IGZyY2hhaW5TIHN0cnVjdHVyZQotQSBjaGFpbiBvZiBmcmFncyBpcyBidWlsdCB1cCBmb3IgZWFjaCBzdWJzZWN0aW9uLiAgVGhlIGRhdGEgc3RydWN0dXJlCi1kZXNjcmliaW5nIGEgY2hhaW4gaXMgY2FsbGVkIGEgQGNvZGV7ZnJjaGFpblN9LCBhbmQgY29udGFpbnMgdGhlIGZvbGxvd2luZwotZmllbGRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGZyY2hfcm9vdAotUG9pbnRzIHRvIHRoZSBmaXJzdCBmcmFnIGluIHRoZSBjaGFpbi4gIE1heSBiZSBOVUxMIGlmIHRoZXJlIGFyZSBubyBmcmFncyBpbgotdGhpcyBjaGFpbi4KLUBpdGVtIGZyY2hfbGFzdAotUG9pbnRzIHRvIHRoZSBsYXN0IGZyYWcgaW4gdGhlIGNoYWluLCBvciBOVUxMIGlmIHRoZXJlIGFyZSBub25lLgotQGl0ZW0gZnJjaF9uZXh0Ci1OZXh0IGluIHRoZSBsaXN0IG9mIEBjb2Rle2ZyY2hhaW5TfSBzdHJ1Y3R1cmVzLgotQGl0ZW0gZnJjaF9zZWcKLUluZGljYXRlcyB0aGUgc2VjdGlvbiB0aGlzIGZyYWcgY2hhaW4gYmVsb25ncyB0by4KLUBpdGVtIGZyY2hfc3Vic2VnCi1TdWJzZWN0aW9uIChzdWJzZWdtZW50KSBudW1iZXIgb2YgdGhpcyBmcmFnIGNoYWluLgotQGl0ZW0gZml4X3Jvb3QsIGZpeF90YWlsCi0oRGVmaW5lZCBvbmx5IGlmIEBjb2Rle0JGRF9BU1NFTUJMRVJ9IGlzIGRlZmluZWQpLiAgUG9pbnQgdG8gZmlyc3QgYW5kIGxhc3QKLUBjb2Rle2ZpeFN9IHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3Vic2VjdGlvbi4KLUBpdGVtIGZyY2hfb2JzdGFjawotTm90IGN1cnJlbnRseSB1c2VkLiAgSW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgZnJhZyBhbGxvY2F0aW9uIGZvciB0aGlzCi1zdWJzZWN0aW9uLiAgVGhpcyBzaG91bGQgcmVkdWNlIGZyYWcgZ2VuZXJhdGlvbiBjYXVzZWQgYnkgc3dpdGNoaW5nIHNlY3Rpb25zLgotQGl0ZW0gZnJjaF9mcmFnX25vdwotVGhlIGN1cnJlbnQgZnJhZyBmb3IgdGhpcyBzdWJzZWdtZW50LgotQGVuZCB0YWJsZQotCi1BIEBjb2Rle2ZyY2hhaW5TfSBjb3JyZXNwb25kcyB0byBhIHN1YnNlY3Rpb247IGVhY2ggc2VjdGlvbiBoYXMgYSBsaXN0IG9mCi1AY29kZXtmcmNoYWluU30gcmVjb3JkcyBhc3NvY2lhdGVkIHdpdGggaXQuICBJbiBtb3N0IGNhc2VzLCBvbmx5IG9uZSBzdWJzZWN0aW9uCi1vZiBlYWNoIHNlY3Rpb24gaXMgdXNlZCwgc28gdGhlIGxpc3Qgd2lsbCBvbmx5IGJlIG9uZSBlbGVtZW50IGxvbmcsIGJ1dCBhbnkKLXByb2Nlc3Npbmcgb2YgZnJhZyBjaGFpbnMgc2hvdWxkIGJlIHByZXBhcmVkIHRvIGRlYWwgd2l0aCBtdWx0aXBsZSBjaGFpbnMgcGVyCi1zZWN0aW9uLgotCi1BZnRlciB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgcHJvY2Vzc2VkLCBhbmQgbm8gbW9yZSBmcmFncyBhcmUgdG8KLWJlIGdlbmVyYXRlZCwgdGhlIGZyYWcgY2hhaW5zIGFyZSBqb2luZWQgaW50byBvbmUgcGVyIHNlY3Rpb24gZm9yIGZ1cnRoZXIKLXByb2Nlc3NpbmcuICBBZnRlciB0aGlzIHBvaW50LCBpdCBpcyBzYWZlIHRvIG9wZXJhdGUgb24gb25lIGNoYWluIHBlciBzZWN0aW9uLgotCi1UaGUgYXNzZW1ibGVyIGFsd2F5cyBoYXMgYSBjdXJyZW50IGZyYWcsIG5hbWVkIEBjb2Rle2ZyYWdfbm93fS4gIE1vcmUgc3BhY2UgaXMKLWFsbG9jYXRlZCBmb3IgdGhlIGN1cnJlbnQgZnJhZyB1c2luZyB0aGUgQGNvZGV7ZnJhZ19tb3JlfSBmdW5jdGlvbjsgdGhpcwotcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFtb3VudCBvZiByZXF1ZXN0ZWQgc3BhY2UuICBSZWxheGluZyBpcyBkb25lIHVzaW5nCi12YXJpYW50IGZyYWdzIGFsbG9jYXRlZCBieSBAY29kZXtmcmFnX3Zhcn0gb3IgQGNvZGV7ZnJhZ192YXJpYW50fQotKEBweHJlZntSZWxheGF0aW9ufSkuCi0KLUBub2RlIEdBUyBwcm9jZXNzaW5nCi1Ac2VjdGlvbiBXaGF0IEdBUyBkb2VzIHdoZW4gaXQgcnVucwotQGNpbmRleCBpbnRlcm5hbHMsIG92ZXJ2aWV3Ci0KLVRoaXMgaXMgYSBxdWljayBsb29rIGF0IHdoYXQgYW4gYXNzZW1ibGVyIHJ1biBsb29rcyBsaWtlLgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotVGhlIGFzc2VtYmxlciBpbml0aWFsaXplcyBpdHNlbGYgYnkgY2FsbGluZyB2YXJpb3VzIGluaXQgcm91dGluZXMuCi0KLUBpdGVtCi1Gb3IgZWFjaCBzb3VyY2UgZmlsZSwgdGhlIEBjb2Rle3JlYWRfYV9zb3VyY2VfZmlsZX0gZnVuY3Rpb24gcmVhZHMgaW4gdGhlIGZpbGUKLWFuZCBwYXJzZXMgaXQuICBUaGUgZ2xvYmFsIHZhcmlhYmxlIEBjb2Rle2lucHV0X2xpbmVfcG9pbnRlcn0gcG9pbnRzIHRvIHRoZQotY3VycmVudCB0ZXh0OyBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIGNvcnJlY3QgdXAgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSwgYnV0IG5vdAotZmFydGhlci4KLQotQGl0ZW0KLUZvciBlYWNoIGxpbmUsIHRoZSBhc3NlbWJsZXIgcGFzc2VzIGxhYmVscyB0byB0aGUgQGNvZGV7Y29sb259IGZ1bmN0aW9uLCBhbmQKLWlzb2xhdGVzIHRoZSBmaXJzdCB3b3JkLiAgSWYgaXQgbG9va3MgbGlrZSBhIHBzZXVkby1vcCwgdGhlIHdvcmQgaXMgbG9va2VkIHVwCi1pbiB0aGUgcHNldWRvLW9wIGhhc2ggdGFibGUgQGNvZGV7cG9faGFzaH0gYW5kIGRpc3BhdGNoZWQgdG8gYSBwc2V1ZG8tb3AKLXJvdXRpbmUuICBPdGhlcndpc2UsIHRoZSB0YXJnZXQgZGVwZW5kZW50IEBjb2Rle21kX2Fzc2VtYmxlfSByb3V0aW5lIGlzIGNhbGxlZAotdG8gcGFyc2UgdGhlIGluc3RydWN0aW9uLgotCi1AaXRlbQotV2hlbiBwc2V1ZG8tb3BzIG9yIGluc3RydWN0aW9ucyBvdXRwdXQgZGF0YSwgdGhleSBhZGQgaXQgdG8gYSBmcmFnLCBjYWxsaW5nCi1AY29kZXtmcmFnX21vcmV9IHRvIGdldCBzcGFjZSB0byBzdG9yZSBpdCBpbi4KLQotQGl0ZW0KLVBzZXVkby1vcHMgYW5kIGluc3RydWN0aW9ucyBjYW4gYWxzbyBvdXRwdXQgZml4dXBzIGNyZWF0ZWQgYnkgQGNvZGV7Zml4X25ld30gb3IKLUBjb2Rle2ZpeF9uZXdfZXhwfS4KLQotQGl0ZW0KLUZvciBjZXJ0YWluIHRhcmdldHMsIGluc3RydWN0aW9ucyBjYW4gY3JlYXRlIHZhcmlhbnQgZnJhZ3Mgd2hpY2ggYXJlIHVzZWQgdG8KLXN0b3JlIHJlbGF4YXRpb24gaW5mb3JtYXRpb24gKEBweHJlZntSZWxheGF0aW9ufSkuCi0KLUBpdGVtCi1XaGVuIHRoZSBpbnB1dCBmaWxlIGlzIGZpbmlzaGVkLCB0aGUgQGNvZGV7d3JpdGVfb2JqZWN0X2ZpbGV9IHJvdXRpbmUgaXMKLWNhbGxlZC4gIEl0IGFzc2lnbnMgYWRkcmVzc2VzIHRvIGFsbCB0aGUgZnJhZ3MgKEBjb2Rle3JlbGF4X3NlZ21lbnR9KSwgcmVzb2x2ZXMKLWFsbCB0aGUgZml4dXBzIChAY29kZXtmaXh1cF9zZWdtZW50fSksIHJlc29sdmVzIGFsbCB0aGUgc3ltYm9sIHZhbHVlcyAodXNpbmcKLUBjb2Rle3Jlc29sdmVfc3ltYm9sX3ZhbHVlfSksIGFuZCBmaW5hbGx5IHdyaXRlcyBvdXQgdGhlIGZpbGUgKGluIHRoZQotQGNvZGV7QkZEX0FTU0VNQkxFUn0gY2FzZSwgdGhpcyBpcyBkb25lIGJ5IHNpbXBseSBjYWxsaW5nIEBjb2Rle2JmZF9jbG9zZX0pLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIFBvcnRpbmcgR0FTCi1Ac2VjdGlvbiBQb3J0aW5nIEdBUwotQGNpbmRleCBwb3J0aW5nCi0KLUVhY2ggR0FTIHRhcmdldCBzcGVjaWZpZXMgdHdvIG1haW4gdGhpbmdzOiB0aGUgQ1BVIGZpbGUgYW5kIHRoZSBvYmplY3QgZm9ybWF0Ci1maWxlLiAgVHdvIG1haW4gc3dpdGNoZXMgaW4gdGhlIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBoYW5kbGUgdGhpcy4gIFRoZQotZmlyc3Qgc3dpdGNoZXMgb24gQ1BVIHR5cGUgdG8gc2V0IHRoZSBzaGVsbCB2YXJpYWJsZSBAY29kZXtjcHVfdHlwZX0uICBUaGUKLXNlY29uZCBzd2l0Y2hlcyBvbiB0aGUgZW50aXJlIHRhcmdldCB0byBzZXQgdGhlIHNoZWxsIHZhcmlhYmxlIEBjb2Rle2ZtdH0uCi0KLVRoZSBjb25maWd1cmUgc2NyaXB0IHVzZXMgdGhlIHZhbHVlIG9mIEBjb2Rle2NwdV90eXBlfSB0byBzZWxlY3QgdHdvIGZpbGVzIGluCi10aGUgQGZpbGV7Y29uZmlnfSBkaXJlY3Rvcnk6IEBmaWxle3RjLUB2YXJ7Q1BVfS5jfSBhbmQgQGZpbGV7dGMtQHZhcntDUFV9Lmh9LgotVGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VzcyB3aWxsIGNyZWF0ZSBhIGZpbGUgbmFtZWQgQGZpbGV7dGFyZy1jcHUuaH0gaW4gdGhlCi1idWlsZCBkaXJlY3Rvcnkgd2hpY2ggaW5jbHVkZXMgQGZpbGV7dGMtQHZhcntDUFV9Lmh9LgotCi1UaGUgY29uZmlndXJlIHNjcmlwdCBhbHNvIHVzZXMgdGhlIHZhbHVlIG9mIEBjb2Rle2ZtdH0gdG8gc2VsZWN0IHR3byBmaWxlczoKLUBmaWxle29iai1AdmFye2ZtdH0uY30gYW5kIEBmaWxle29iai1AdmFye2ZtdH0uaH0uICBUaGUgY29uZmlndXJhdGlvbiBwcm9jZXNzCi13aWxsIGNyZWF0ZSBhIGZpbGUgbmFtZWQgQGZpbGV7b2JqLWZvcm1hdC5ofSBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5IHdoaWNoCi1pbmNsdWRlcyBAZmlsZXtvYmotQHZhcntmbXR9Lmh9LgotCi1Zb3UgY2FuIGFsc28gc2V0IHRoZSBlbXVsYXRpb24gaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYnkgc2V0dGluZyB0aGUgQGNvZGV7ZW19Ci12YXJpYWJsZS4gIE5vcm1hbGx5IHRoZSBkZWZhdWx0IHZhbHVlIG9mIEBzYW1we2dlbmVyaWN9IGlzIGZpbmUuICBUaGUKLWNvbmZpZ3VyYXRpb24gcHJvY2VzcyB3aWxsIGNyZWF0ZSBhIGZpbGUgbmFtZWQgQGZpbGV7dGFyZy1lbnYuaH0gaW4gdGhlIGJ1aWxkCi1kaXJlY3Rvcnkgd2hpY2ggaW5jbHVkZXMgQGZpbGV7dGUtQHZhcntlbX0uaH0uCi0KLVBvcnRpbmcgR0FTIHRvIGEgbmV3IENQVSByZXF1aXJlcyB3cml0aW5nIHRoZSBAZmlsZXt0Yy1AdmFye0NQVX19IGZpbGVzLgotUG9ydGluZyBHQVMgdG8gYSBuZXcgb2JqZWN0IGZpbGUgZm9ybWF0IHJlcXVpcmVzIHdyaXRpbmcgdGhlCi1AZmlsZXtvYmotQHZhcntmbXR9fSBmaWxlcy4gIFRoZXJlIGlzIHNvbWV0aW1lcyBzb21lIGludGVyYWN0aW9uIGJldHdlZW4gdGhlc2UKLXR3byBmaWxlcywgYnV0IGl0IGlzIG5vcm1hbGx5IG1pbmltYWwuCi0KLVRoZSBiZXN0IGFwcHJvYWNoIGlzLCBvZiBjb3Vyc2UsIHRvIGNvcHkgZXhpc3RpbmcgZmlsZXMuICBUaGUgZG9jdW1lbnRhdGlvbgotYmVsb3cgYXNzdW1lcyB0aGF0IHlvdSBhcmUgbG9va2luZyBhdCBleGlzdGluZyBmaWxlcyB0byBzZWUgdXNhZ2UgZGV0YWlscy4KLQotVGhlc2UgaW50ZXJmYWNlcyBoYXZlIGdyb3duIG92ZXIgdGltZSwgYW5kIGhhdmUgbmV2ZXIgYmVlbiBjYXJlZnVsbHkgdGhvdWdodAotb3V0IG9yIGRlc2lnbmVkLiAgTm90aGluZyBhYm91dCB0aGUgaW50ZXJmYWNlcyBkZXNjcmliZWQgaGVyZSBpcyBjYXN0IGluIHN0b25lLgotSXQgaXMgcG9zc2libGUgdGhhdCB0aGV5IHdpbGwgY2hhbmdlIGZyb20gb25lIHZlcnNpb24gb2YgdGhlIGFzc2VtYmxlciB0byB0aGUKLW5leHQuICBBbHNvLCBuZXcgbWFjcm9zIGFyZSBhZGRlZCBhbGwgdGhlIHRpbWUgYXMgdGhleSBhcmUgbmVlZGVkLgotCi1AbWVudQotKiBDUFUgYmFja2VuZDo6ICAgICAgICAgICAgICAgICBXcml0aW5nIGEgQ1BVIGJhY2tlbmQKLSogT2JqZWN0IGZvcm1hdCBiYWNrZW5kOjogICAgICAgV3JpdGluZyBhbiBvYmplY3QgZm9ybWF0IGJhY2tlbmQKLSogRW11bGF0aW9uczo6ICAgICAgICAgICAgICAgICAgV3JpdGluZyBlbXVsYXRpb24gZmlsZXMKLUBlbmQgbWVudQotCi1Abm9kZSBDUFUgYmFja2VuZAotQHN1YnNlY3Rpb24gV3JpdGluZyBhIENQVSBiYWNrZW5kCi1AY2luZGV4IENQVSBiYWNrZW5kCi1AY2luZGV4IEBmaWxle3RjLUB2YXJ7Q1BVfX0KLQotVGhlIENQVSBiYWNrZW5kIGZpbGVzIGFyZSB0aGUgaGVhcnQgb2YgdGhlIGFzc2VtYmxlci4gIFRoZXkgYXJlIHRoZSBvbmx5IHBhcnRzCi1vZiB0aGUgYXNzZW1ibGVyIHdoaWNoIGFjdHVhbGx5IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIGluc3RydWN0aW9uIHNldCBvZiB0aGUKLXByb2Nlc3Nvci4KLQotWW91IG11c3QgZGVmaW5lIGEgcmVhc29uYWJseSBzbWFsbCBsaXN0IG9mIG1hY3JvcyBhbmQgZnVuY3Rpb25zIGluIHRoZSBDUFUKLWJhY2tlbmQgZmlsZXMuICBZb3UgbWF5IGRlZmluZSBhIGxhcmdlIG51bWJlciBvZiBhZGRpdGlvbmFsIG1hY3JvcyBpbiB0aGUgQ1BVCi1iYWNrZW5kIGZpbGVzLCBub3QgYWxsIG9mIHdoaWNoIGFyZSBkb2N1bWVudGVkIGhlcmUuICBZb3UgbXVzdCwgb2YgY291cnNlLAotZGVmaW5lIG1hY3JvcyBpbiB0aGUgQGZpbGV7Lmh9IGZpbGUsIHdoaWNoIGlzIGluY2x1ZGVkIGJ5IGV2ZXJ5IGFzc2VtYmxlcgotc291cmNlIGZpbGUuICBZb3UgbWF5IGRlZmluZSB0aGUgZnVuY3Rpb25zIGFzIG1hY3JvcyBpbiB0aGUgQGZpbGV7Lmh9IGZpbGUsIG9yCi1hcyBmdW5jdGlvbnMgaW4gdGhlIEBmaWxley5jfSBmaWxlLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIFRDX0B2YXJ7Q1BVfQotQGNpbmRleCBUQ19AdmFye0NQVX0KLUJ5IGNvbnZlbnRpb24sIHlvdSBzaG91bGQgZGVmaW5lIHRoaXMgbWFjcm8gaW4gdGhlIEBmaWxley5ofSBmaWxlLiAgRm9yCi1leGFtcGxlLCBAZmlsZXt0Yy1tNjhrLmh9IGRlZmluZXMgQGNvZGV7VENfTTY4S30uICBZb3UgbWlnaHQgaGF2ZSB0byB1c2UgdGhpcwotaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGFkZCBDUFUgc3BlY2lmaWMgY29kZSB0byB0aGUgb2JqZWN0IGZvcm1hdCBmaWxlLgotCi1AaXRlbSBUQVJHRVRfRk9STUFUCi1UaGlzIG1hY3JvIGlzIHRoZSBCRkQgdGFyZ2V0IG5hbWUgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIG91dHB1dCBmaWxlLiAgVGhpcwotd2lsbCBub3JtYWxseSBkZXBlbmQgdXBvbiB0aGUgQGNvZGV7T0JKX0B2YXJ7Rk1UfX0gbWFjcm8uCi0KLUBpdGVtIFRBUkdFVF9BUkNICi1UaGlzIG1hY3JvIGlzIHRoZSBCRkQgYXJjaGl0ZWN0dXJlIHRvIHBhc3MgdG8gQGNvZGV7YmZkX3NldF9hcmNoX21hY2h9LgotCi1AaXRlbSBUQVJHRVRfTUFDSAotVGhpcyBtYWNybyBpcyB0aGUgQkZEIG1hY2hpbmUgbnVtYmVyIHRvIHBhc3MgdG8gQGNvZGV7YmZkX3NldF9hcmNoX21hY2h9LiAgSWYKLWl0IGlzIG5vdCBkZWZpbmVkLCBHQVMgd2lsbCB1c2UgMC4KLQotQGl0ZW0gVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLVlvdSBzaG91bGQgZGVmaW5lIHRoaXMgbWFjcm8gdG8gYmUgbm9uLXplcm8gaWYgdGhlIHRhcmdldCBpcyBiaWcgZW5kaWFuLCBhbmQKLXplcm8gaWYgdGhlIHRhcmdldCBpcyBsaXR0bGUgZW5kaWFuLgotCi1AaXRlbSBtZF9zaG9ydG9wdHMKLUBpdGVteCBtZF9sb25nb3B0cwotQGl0ZW14IG1kX2xvbmdvcHRzX3NpemUKLUBpdGVteCBtZF9wYXJzZV9vcHRpb24KLUBpdGVteCBtZF9zaG93X3VzYWdlCi1AY2luZGV4IG1kX3Nob3J0b3B0cwotQGNpbmRleCBtZF9sb25nb3B0cwotQGNpbmRleCBtZF9sb25nb3B0c19zaXplCi1AY2luZGV4IG1kX3BhcnNlX29wdGlvbgotQGNpbmRleCBtZF9zaG93X3VzYWdlCi1HQVMgdXNlcyB0aGVzZSB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBkdXJpbmcgb3B0aW9uIHByb2Nlc3NpbmcuCi1AY29kZXttZF9zaG9ydG9wdHN9IGlzIGEgQGNvZGV7Y29uc3QgY2hhciAqfSB3aGljaCBHQVMgYWRkcyB0byB0aGUgbWFjaGluZQotaW5kZXBlbmRlbnQgc3RyaW5nIHBhc3NlZCB0byBAY29kZXtnZXRvcHR9LiAgQGNvZGV7bWRfbG9uZ29wdHN9IGlzIGEKLUBjb2Rle3N0cnVjdCBvcHRpb24gW119IHdoaWNoIEdBUyBhZGRzIHRvIHRoZSBtYWNoaW5lIGluZGVwZW5kZW50IGxvbmcgb3B0aW9ucwotcGFzc2VkIHRvIEBjb2Rle2dldG9wdH07IHlvdSBtYXkgdXNlIEBjb2Rle09QVElPTl9NRF9CQVNFfSwgZGVmaW5lZCBpbgotQGZpbGV7YXMuaH0sIGFzIHRoZSBzdGFydCBvZiBhIHNldCBvZiBsb25nIG9wdGlvbiBpbmRpY2VzLCBpZiBuZWNlc3NhcnkuCi1AY29kZXttZF9sb25nb3B0c19zaXplfSBpcyBhIEBjb2Rle3NpemVfdH0gaG9sZGluZyB0aGUgc2l6ZSBAY29kZXttZF9sb25nb3B0c30uCi1HQVMgd2lsbCBjYWxsIEBjb2Rle21kX3BhcnNlX29wdGlvbn0gd2hlbmV2ZXIgQGNvZGV7Z2V0b3B0fSByZXR1cm5zIGFuCi11bnJlY29nbml6ZWQgY29kZSwgcHJlc3VtYWJseSBpbmRpY2F0aW5nIGEgc3BlY2lhbCBjb2RlIHZhbHVlIHdoaWNoIGFwcGVhcnMgaW4KLUBjb2Rle21kX2xvbmdvcHRzfS4gIEdBUyB3aWxsIGNhbGwgQGNvZGV7bWRfc2hvd191c2FnZX0gd2hlbiBhIHVzYWdlIG1lc3NhZ2UgaXMKLXByaW50ZWQ7IGl0IHNob3VsZCBwcmludCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBtYWNoaW5lIHNwZWNpZmljIG9wdGlvbnMuCi0KLUBpdGVtIG1kX2JlZ2luCi1AY2luZGV4IG1kX2JlZ2luCi1HQVMgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gYXQgdGhlIHN0YXJ0IG9mIHRoZSBhc3NlbWJseSwgYWZ0ZXIgdGhlIGNvbW1hbmQKLWxpbmUgYXJndW1lbnRzIGhhdmUgYmVlbiBwYXJzZWQgYW5kIGFsbCB0aGUgbWFjaGluZSBpbmRlcGVuZGVudCBpbml0aWFsaXphdGlvbnMKLWhhdmUgYmVlbiBjb21wbGV0ZWQuCi0KLUBpdGVtIG1kX2NsZWFudXAKLUBjaW5kZXggbWRfY2xlYW51cAotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGF0IHRoZSBlbmQgb2YgZWFjaCBpbnB1dCBmaWxlLgotCi1AaXRlbSBtZF9hc3NlbWJsZQotQGNpbmRleCBtZF9hc3NlbWJsZQotR0FTIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBlYWNoIGlucHV0IGxpbmUgd2hpY2ggZG9lcyBub3QgY29udGFpbiBhCi1wc2V1ZG8tb3AuICBUaGUgYXJndW1lbnQgaXMgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhlIGZ1bmN0aW9uIHNob3VsZAotYXNzZW1ibGUgdGhlIHN0cmluZyBhcyBhbiBpbnN0cnVjdGlvbiB3aXRoIG9wZXJhbmRzLiAgTm9ybWFsbHkKLUBjb2Rle21kX2Fzc2VtYmxlfSB3aWxsIGRvIHRoaXMgYnkgY2FsbGluZyBAY29kZXtmcmFnX21vcmV9IGFuZCB3cml0aW5nIG91dAotc29tZSBieXRlcyAoQHB4cmVme0ZyYWdzfSkuICBAY29kZXttZF9hc3NlbWJsZX0gd2lsbCBjYWxsIEBjb2Rle2ZpeF9uZXd9IHRvCi1jcmVhdGUgZml4dXBzIGFzIG5lZWRlZCAoQHB4cmVme0ZpeHVwc30pLiAgVGFyZ2V0cyB3aGljaCBuZWVkIHRvIGRvIHNwZWNpYWwKLXB1cnBvc2UgcmVsYXhhdGlvbiB3aWxsIGNhbGwgQGNvZGV7ZnJhZ192YXJ9LgotCi1AaXRlbSBtZF9wc2V1ZG9fdGFibGUKLUBjaW5kZXggbWRfcHNldWRvX3RhYmxlCi1UaGlzIGlzIGEgY29uc3QgYXJyYXkgb2YgdHlwZSBAY29kZXtwc2V1ZG9fdHlwZVN9LiAgSXQgaXMgYSBtYXBwaW5nIGZyb20KLXBzZXVkby1vcCBuYW1lcyB0byBmdW5jdGlvbnMuICBZb3Ugc2hvdWxkIHVzZSB0aGlzIHRhYmxlIHRvIGltcGxlbWVudAotcHNldWRvLW9wcyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gdGhlIENQVS4KLQotQGl0ZW0gdGNfY29uZGl0aW9uYWxfcHNldWRvb3AKLUBjaW5kZXggdGNfY29uZGl0aW9uYWxfcHNldWRvb3AKLUlmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgR0FTIHdpbGwgY2FsbCBpdCB3aXRoIGEgQGNvZGV7cHNldWRvX3R5cGVTfSBhcmd1bWVudC4KLUl0IHNob3VsZCByZXR1cm4gbm9uLXplcm8gaWYgdGhlIHBzZXVkby1vcCBpcyBhIGNvbmRpdGlvbmFsIHdoaWNoIGNvbnRyb2xzCi13aGV0aGVyIGNvZGUgaXMgYXNzZW1ibGVkLCBzdWNoIGFzIEBzYW1wey5pZn0uICBHQVMga25vd3MgYWJvdXQgdGhlIG5vcm1hbAotY29uZGl0aW9uYWwgcHNldWRvLW9wcyxhbmQgeW91IHNob3VsZCBub3JtYWxseSBub3QgaGF2ZSB0byBkZWZpbmUgdGhpcyBtYWNyby4KLQotQGl0ZW0gY29tbWVudF9jaGFycwotQGNpbmRleCBjb21tZW50X2NoYXJzCi1UaGlzIGlzIGEgbnVsbCB0ZXJtaW5hdGVkIEBjb2Rle2NvbnN0IGNoYXJ9IGFycmF5IG9mIGNoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYQotY29tbWVudC4KLQotQGl0ZW0gdGNfY29tbWVudF9jaGFycwotQGNpbmRleCB0Y19jb21tZW50X2NoYXJzCi1JZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQsIEdBUyB3aWxsIHVzZSBpdCBpbnN0ZWFkIG9mIEBjb2Rle2NvbW1lbnRfY2hhcnN9LgotCi1AaXRlbSB0Y19zeW1ib2xfY2hhcnMKLUBjaW5kZXggdGNfc3ltYm9sX2NoYXJzCi1JZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQsIGl0IGlzIGEgcG9pbnRlciB0byBhIG51bGwgdGVybWluYXRlZCBsaXN0IG9mCi1jaGFyYWN0ZXJzIHdoaWNoIG1heSBhcHBlYXIgaW4gYW4gb3BlcmFuZC4gIEdBUyBhbHJlYWR5IGFzc3VtZXMgdGhhdCBhbGwKLWFscGhhbnVtYmVyaWMgY2hhcmFjdGVycywgYW5kIEBzYW1weyR9LCBAc2FtcHsufSwgYW5kIEBzYW1we199IG1heSBhcHBlYXIgaW4gYW4KLW9wZXJhbmQgKHNlZSBAc2FtcHtzeW1ib2xfY2hhcnN9IGluIEBmaWxle2FwcC5jfSkuICBUaGlzIG1hY3JvIG1heSBiZSBkZWZpbmVkCi10byB0cmVhdCBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgYXMgYXBwZWFyaW5nIGluIGFuIG9wZXJhbmQuICBUaGlzIGFmZmVjdHMgdGhlCi13YXkgaW4gd2hpY2ggR0FTIHJlbW92ZXMgd2hpdGVzcGFjZSBiZWZvcmUgcGFzc2luZyB0aGUgc3RyaW5nIHRvCi1Ac2FtcHttZF9hc3NlbWJsZX0uCi0KLUBpdGVtIGxpbmVfY29tbWVudF9jaGFycwotQGNpbmRleCBsaW5lX2NvbW1lbnRfY2hhcnMKLVRoaXMgaXMgYSBudWxsIHRlcm1pbmF0ZWQgQGNvZGV7Y29uc3QgY2hhcn0gYXJyYXkgb2YgY2hhcmFjdGVycyB3aGljaCBzdGFydCBhCi1jb21tZW50IHdoZW4gdGhleSBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KLQotQGl0ZW0gbGluZV9zZXBhcmF0b3JfY2hhcnMKLUBjaW5kZXggbGluZV9zZXBhcmF0b3JfY2hhcnMKLVRoaXMgaXMgYSBudWxsIHRlcm1pbmF0ZWQgQGNvZGV7Y29uc3QgY2hhcn0gYXJyYXkgb2YgY2hhcmFjdGVycyB3aGljaCBzZXBhcmF0ZQotbGluZXMgKHNlbWljb2xvbiBhbmQgbmV3bGluZSBhcmUgc3VjaCBjaGFyYWN0ZXJzIGJ5IGRlZmF1bHQsIGFuZCBuZWVkIG5vdCBiZQotbGlzdGVkIGluIHRoaXMgYXJyYXkpLgotCi1AaXRlbSBFWFBfQ0hBUlMKLUBjaW5kZXggRVhQX0NIQVJTCi1UaGlzIGlzIGEgbnVsbCB0ZXJtaW5hdGVkIEBjb2Rle2NvbnN0IGNoYXJ9IGFycmF5IG9mIGNoYXJhY3RlcnMgd2hpY2ggbWF5IGJlCi11c2VkIGFzIHRoZSBleHBvbmVudCBjaGFyYWN0ZXIgaW4gYSBmbG9hdGluZyBwb2ludCBudW1iZXIuICBUaGlzIGlzIG5vcm1hbGx5Ci1AY29kZXsiZUUifS4KLQotQGl0ZW0gRkxUX0NIQVJTCi1AY2luZGV4IEZMVF9DSEFSUwotVGhpcyBpcyBhIG51bGwgdGVybWluYXRlZCBAY29kZXtjb25zdCBjaGFyfSBhcnJheSBvZiBjaGFyYWN0ZXJzIHdoaWNoIG1heSBiZQotdXNlZCB0byBpbmRpY2F0ZSBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgQSB6ZXJvIGZvbGxvd2VkIGJ5IG9uZSBvZiB0aGVzZQotY2hhcmFjdGVycyBpcyBhc3N1bWVkIHRvIGJlIGZvbGxvd2VkIGJ5IGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyOyB0aHVzIHRoZXkKLW9wZXJhdGUgdGhlIHdheSB0aGF0IEBjb2RlezB4fSBpcyB1c2VkIHRvIGluZGljYXRlIGEgaGV4YWRlY2ltYWwgY29uc3RhbnQuCi1Vc3VhbGx5IHRoaXMgaW5jbHVkZXMgQHNhbXB7cn0gYW5kIEBzYW1we2Z9LgotCi1AaXRlbSBMRVhfQVQKLUBjaW5kZXggTEVYX0FUCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHRoZSBsZXhpY2FsIHR5cGUgb2YgdGhlIEBrYmR7QH19IGNoYXJhY3Rlci4gIFRoZQotZGVmYXVsdCBpcyB6ZXJvLgotCi1MZXhpY2FsIHR5cGVzIGFyZSBhIGNvbWJpbmF0aW9uIG9mIEBjb2Rle0xFWF9OQU1FfSBhbmQgQGNvZGV7TEVYX0JFR0lOX05BTUV9LAotYm90aCBkZWZpbmVkIGluIEBmaWxle3JlYWQuaH0uICBAY29kZXtMRVhfTkFNRX0gaW5kaWNhdGVzIHRoYXQgdGhlIGNoYXJhY3RlcgotbWF5IGFwcGVhciBpbiBhIG5hbWUuICBAY29kZXtMRVhfQkVHSU5fTkFNRX0gaW5kaWNhdGVzIHRoYXQgdGhlIGNoYXJhY3RlciBtYXkKLWFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbmVtLgotCi1AaXRlbSBMRVhfQlIKLUBjaW5kZXggTEVYX0JSCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHRoZSBsZXhpY2FsIHR5cGUgb2YgdGhlIGJyYWNlIGNoYXJhY3RlcnMgQGtiZHtAe30sCi1Aa2Jke0B9fSwgQGtiZHtbfSwgYW5kIEBrYmR7XX0uICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB6ZXJvLgotCi1AaXRlbSBMRVhfUENUCi1AY2luZGV4IExFWF9QQ1QKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gdGhlIGxleGljYWwgdHlwZSBvZiB0aGUgQGtiZHslfSBjaGFyYWN0ZXIuICBUaGUKLWRlZmF1bHQgdmFsdWUgaXMgemVyby4KLQotQGl0ZW0gTEVYX1FNCi1AY2luZGV4IExFWF9RTQotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byB0aGUgbGV4aWNhbCB0eXBlIG9mIHRoZSBAa2Jkez99IGNoYXJhY3Rlci4gIFRoZQotZGVmYXVsdCB2YWx1ZSBpdCB6ZXJvLgotCi1AaXRlbSBMRVhfRE9MTEFSCi1AY2luZGV4IExFWF9ET0xMQVIKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gdGhlIGxleGljYWwgdHlwZSBvZiB0aGUgQGtiZHskfSBjaGFyYWN0ZXIuICBUaGUKLWRlZmF1bHQgdmFsdWUgaXMgQGNvZGV7TEVYX05BTUUgfCBMRVhfQkVHSU5fTkFNRX0uCi0KLUBpdGVtIFNJTkdMRV9RVU9URV9TVFJJTkdTCi1AY2luZGV4IFNJTkdMRV9RVU9URV9TVFJJTkdTCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIHRyZWF0IHNpbmdsZSBxdW90ZXMgYXMgc3RyaW5nIGRlbGltaXRlcnMuCi1Ob3JtYWxseSBvbmx5IGRvdWJsZSBxdW90ZXMgYXJlIGFjY2VwdGVkIGFzIHN0cmluZyBkZWxpbWl0ZXJzLgotCi1AaXRlbSBOT19TVFJJTkdfRVNDQVBFUwotQGNpbmRleCBOT19TVFJJTkdfRVNDQVBFUwotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBub3QgcGVybWl0IGVzY2FwZSBzZXF1ZW5jZXMgaW4gYSBzdHJpbmcuCi0KLUBpdGVtIE9OTFlfU1RBTkRBUkRfRVNDQVBFUwotQGNpbmRleCBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgd2FybiBhYm91dCB0aGUgdXNlIG9mIG5vbnN0YW5kYXJkIGVzY2FwZQotc2VxdWVuY2VzIGluIGEgc3RyaW5nLgotCi1AaXRlbSBtZF9zdGFydF9saW5lX2hvb2sKLUBjaW5kZXggbWRfc3RhcnRfbGluZV9ob29rCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggbGluZS4KLQotQGl0ZW0gTEFCRUxTX1dJVEhPVVRfQ09MT05TCi1AY2luZGV4IExBQkVMU19XSVRIT1VUX0NPTE9OUwotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBhc3N1bWUgdGhhdCBhbnkgdGV4dCBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lCi1pcyBhIGxhYmVsLCBldmVuIGlmIGl0IGRvZXMgbm90IGhhdmUgYSBjb2xvbi4KLQotQGl0ZW0gVENfU1RBUlRfTEFCRUwKLUBjaW5kZXggVENfU1RBUlRfTEFCRUwKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gY29udHJvbCB3aGF0IEdBUyBjb25zaWRlcnMgdG8gYmUgYSBsYWJlbC4gIFRoZQotZGVmYXVsdCBkZWZpbml0aW9uIGlzIHRvIGFjY2VwdCBhbnkgbmFtZSBmb2xsb3dlZCBieSBhIGNvbG9uIGNoYXJhY3Rlci4KLQotQGl0ZW0gTk9fUFNFVURPX0RPVAotQGNpbmRleCBOT19QU0VVRE9fRE9UCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIG5vdCByZXF1aXJlIHBzZXVkby1vcHMgdG8gc3RhcnQgd2l0aCBhCi1Aa2Jkey59IGNoYXJhY3Rlci4KLQotQGl0ZW0gVENfRVFVQUxfSU5fSU5TTgotQGNpbmRleCBUQ19FUVVBTF9JTl9JTlNOCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIGl0IHNob3VsZCByZXR1cm4gbm9uemVybyBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMKLXBlcm1pdHRlZCB0byBjb250YWluIGFuIEBrYmR7PX0gY2hhcmFjdGVyLiAgR0FTIHdpbGwgdXNlIHRoaXMgdG8gZGVjaWRlIGlmIGEKLUBrYmR7PX0gaXMgYW4gYXNzaWdubWVudCBvciBhbiBpbnN0cnVjdGlvbi4KLQotQGl0ZW0gVENfRU9MX0lOX0lOU04KLUBjaW5kZXggVENfRU9MX0lOX0lOU04KLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgaXQgc2hvdWxkIHJldHVybiBub256ZXJvIGlmIHRoZSBjdXJyZW50IGlucHV0IGxpbmUKLXBvaW50ZXIgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgdGhlIGVuZCBvZiBhIGxpbmUuCi0KLUBpdGVtIG1kX3BhcnNlX25hbWUKLUBjaW5kZXggbWRfcGFyc2VfbmFtZQotSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBHQVMgd2lsbCBjYWxsIGl0IGZvciBhbnkgc3ltYm9sIGZvdW5kIGluIGFuCi1leHByZXNzaW9uLiAgWW91IGNhbiBkZWZpbmUgdGhpcyB0byBoYW5kbGUgc3BlY2lhbCBzeW1ib2xzIGluIGEgc3BlY2lhbCB3YXkuCi1JZiBhIHN5bWJvbCBhbHdheXMgaGFzIGEgY2VydGFpbiB2YWx1ZSwgeW91IHNob3VsZCBub3JtYWxseSBlbnRlciBpdCBpbiB0aGUKLXN5bWJvbCB0YWJsZSwgcGVyaGFwcyB1c2luZyBAY29kZXtyZWdfc2VjdGlvbn0uCi0KLUBpdGVtIG1kX3VuZGVmaW5lZF9zeW1ib2wKLUBjaW5kZXggbWRfdW5kZWZpbmVkX3N5bWJvbAotR0FTIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gYSBzeW1ib2wgdGFibGUgbG9va3VwIGZhaWxzLCBiZWZvcmUgaXQKLWNyZWF0ZXMgYSBuZXcgc3ltYm9sLiAgVHlwaWNhbGx5IHRoaXMgd291bGQgYmUgdXNlZCB0byBzdXBwbHkgc3ltYm9scyB3aG9zZQotbmFtZSBvciB2YWx1ZSBjaGFuZ2VzIGR5bmFtaWNhbGx5LCBwb3NzaWJseSBpbiBhIGNvbnRleHQgc2Vuc2l0aXZlIHdheS4KLVByZWRlZmluZWQgc3ltYm9scyB3aXRoIGZpeGVkIHZhbHVlcywgc3VjaCBhcyByZWdpc3RlciBuYW1lcyBvciBjb25kaXRpb24KLWNvZGVzLCBhcmUgdHlwaWNhbGx5IGVudGVyZWQgZGlyZWN0bHkgaW50byB0aGUgc3ltYm9sIHRhYmxlIHdoZW4gQGNvZGV7bWRfYmVnaW59Ci1pcyBjYWxsZWQuCi0KLUBpdGVtIG1kX29wZXJhbmQKLUBjaW5kZXggbWRfb3BlcmFuZAotR0FTIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBhbnkgZXhwcmVzc2lvbiB0aGF0IGNhbiBub3QgYmUgcmVjb2duaXplZC4KLVdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCwgQGNvZGV7aW5wdXRfbGluZV9wb2ludGVyfSB3aWxsIHBvaW50IHRvIHRoZSBzdGFydAotb2YgdGhlIGV4cHJlc3Npb24uCi0KLUBpdGVtIHRjX3VucmVjb2duaXplZF9saW5lCi1AY2luZGV4IHRjX3VucmVjb2duaXplZF9saW5lCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgd2hlbiBpdCBmaW5kcyBhIGxpbmUgdGhhdCBpdCBjYW4gbm90Ci1wYXJzZS4KLQotQGl0ZW0gbWRfZG9fYWxpZ24KLUBjaW5kZXggbWRfZG9fYWxpZ24KLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gaGFuZGxlIGFuIGFsaWdubWVudCBkaXJlY3RpdmUuICBHQVMgd2lsbCBjYWxsIGl0Ci13aGVuIHRoZSBkaXJlY3RpdmUgaXMgc2VlbiBpbiB0aGUgaW5wdXQgZmlsZS4gIEZvciBleGFtcGxlLCB0aGUgaTM4NiBiYWNrZW5kCi11c2VzIHRoaXMgdG8gZ2VuZXJhdGUgZWZmaWNpZW50IG5vcCBpbnN0cnVjdGlvbnMgb2YgdmFyeWluZyBsZW5ndGhzLCBkZXBlbmRpbmcKLXVwb24gdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHRoZSBhbGlnbm1lbnQgd2lsbCBza2lwLgotCi1AaXRlbSBIQU5ETEVfQUxJR04KLUBjaW5kZXggSEFORExFX0FMSUdOCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGRvIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFuIGFsaWdubWVudCBkaXJlY3RpdmUuCi1HQVMgd2lsbCBjYWxsIGl0IGF0IHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LgotCi1AaXRlbSBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotQGNpbmRleCBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGVhY2ggdGltZSBpdCBza2lwcyBhbnkgc3BhY2UgYmVjYXVzZSBvZiBhCi1zcGFjZSBmaWxsaW5nIG9yIGFsaWdubWVudCBvciBkYXRhIGFsbG9jYXRpb24gcHNldWRvLW9wLgotCi1AaXRlbSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04KLUBjaW5kZXggVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHBhcnNlIGFuIGV4cHJlc3Npb24gdXNlZCBpbiBhIGRhdGEgYWxsb2NhdGlvbgotcHNldWRvLW9wIHN1Y2ggYXMgQGNvZGV7LndvcmR9LiAgWW91IGNhbiB1c2UgdGhpcyB0byByZWNvZ25pemUgcmVsb2NhdGlvbgotZGlyZWN0aXZlcyB0aGF0IG1heSBhcHBlYXIgaW4gc3VjaCBkaXJlY3RpdmVzLgotCi1AaXRlbSBCSVRGSUVMRF9DT05TX0VYUFJFU1NJT04KLUBjaW5kZXggQklURklFTERfQ09OU19FWFBSRVNTSU9OCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIHJlY29nbml6ZSBiaXRmaWVsZCBpbnN0cnVjdGlvbnMgaW4gZGF0YQotYWxsb2NhdGlvbiBwc2V1ZG8tb3BzLCBhcyB1c2VkIG9uIHRoZSBpOTYwLgotCi1AaXRlbSBSRVBFQVRfQ09OU19FWFBSRVNTSU9OCi1AY2luZGV4IFJFUEVBVF9DT05TX0VYUFJFU1NJT04KLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgcmVjb2duaXplIHJlcGVhdCBjb3VudHMgaW4gZGF0YSBhbGxvY2F0aW9uCi1wc2V1ZG8tb3BzLCBhcyB1c2VkIG9uIHRoZSBNSVBTLgotCi1AaXRlbSBtZF9jb25zX2FsaWduCi1AY2luZGV4IG1kX2NvbnNfYWxpZ24KLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gZG8gYW55IHNwZWNpYWwgYWxpZ25tZW50IGJlZm9yZSBhIGRhdGEgYWxsb2NhdGlvbgotcHNldWRvLW9wLgotCi1AaXRlbSBUQ19DT05TX0ZJWF9ORVcKLUBjaW5kZXggVENfQ09OU19GSVhfTkVXCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIGEgZGF0YSBhbGxvY2F0aW9uIHBzZXVkby1vcC4KLQotQGl0ZW0gVENfSU5JVF9GSVhfREFUQSAoQHZhcntmaXhwfSkKLUBjaW5kZXggVENfSU5JVF9GSVhfREFUQQotQSBDIHN0YXRlbWVudCB0byBpbml0aWFsaXplIHRoZSB0YXJnZXQgc3BlY2lmaWMgZmllbGRzIG9mIGZpeHVwIEB2YXJ7Zml4cH0uCi1UaGVzZSBmaWVsZHMgYXJlIGRlZmluZWQgd2l0aCB0aGUgQGNvZGV7VENfRklYX1RZUEV9IG1hY3JvLgotCi1AaXRlbSBUQ19GSVhfREFUQV9QUklOVCAoQHZhcntzdHJlYW19LCBAdmFye2ZpeHB9KQotQGNpbmRleCBUQ19GSVhfREFUQV9QUklOVAotQSBDIHN0YXRlbWVudCB0byBvdXRwdXQgdGFyZ2V0IHNwZWNpZmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IKLWZpeHVwIEB2YXJ7Zml4cH0gdG8gQHZhcntzdHJlYW19LiAgVGhpcyBtYWNybyBpcyBjYWxsZWQgYnkgQGNvZGV7cHJpbnRfZml4dXB9LgotCi1AaXRlbSBUQ19GUkFHX0lOSVQgKEB2YXJ7ZnJhZ3B9KQotQGNpbmRleCBUQ19GUkFHX0lOSVQKLUEgQyBzdGF0ZW1lbnQgdG8gaW5pdGlhbGl6ZSB0aGUgdGFyZ2V0IHNwZWNpZmljIGZpZWxkcyBvZiBmcmFnIEB2YXJ7ZnJhZ3B9LgotVGhlc2UgZmllbGRzIGFyZSBkZWZpbmVkIHdpdGggdGhlIEBjb2Rle1RDX0ZSQUdfVFlQRX0gbWFjcm8uCi0KLUBpdGVtIG1kX251bWJlcl90b19jaGFycwotQGNpbmRleCBtZF9udW1iZXJfdG9fY2hhcnMKLVRoaXMgc2hvdWxkIGp1c3QgY2FsbCBlaXRoZXIgQGNvZGV7bnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbn0gb3IKLUBjb2Rle251bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW59LCB3aGljaGV2ZXIgaXMgYXBwcm9wcmlhdGUuICBPbiB0YXJnZXRzIGxpa2UKLXRoZSBNSVBTIHdoaWNoIHN1cHBvcnQgb3B0aW9ucyB0byBjaGFuZ2UgdGhlIGVuZGlhbm5lc3MsIHdoaWNoIGZ1bmN0aW9uIHRvIGNhbGwKLWlzIGEgcnVudGltZSBkZWNpc2lvbi4gIE9uIG90aGVyIHRhcmdldHMsIEBjb2Rle21kX251bWJlcl90b19jaGFyc30gY2FuIGJlIGEKLXNpbXBsZSBtYWNyby4KLQotQGl0ZW0gbWRfcmVsb2Nfc2l6ZQotQGNpbmRleCBtZF9yZWxvY19zaXplCi1UaGlzIHZhcmlhYmxlIGlzIG9ubHkgdXNlZCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiBnYXMgKG5vdAotQGNvZGV7QkZEX0FTU0VNQkxFUn0gYW5kIG5vdCBAY29kZXtNQU5ZX1NFR01FTlRTfSkuICBJdCBob2xkcyB0aGUgc2l6ZSBvZiBhCi1yZWxvY2F0aW9uIGVudHJ5LgotCi1AaXRlbSBXT1JLSU5HX0RPVF9XT1JECi1AaXRlbXggbWRfc2hvcnRfanVtcF9zaXplCi1AaXRlbXggbWRfbG9uZ19qdW1wX3NpemUKLUBpdGVteCBtZF9jcmVhdGVfc2hvcnRfanVtcAotQGl0ZW14IG1kX2NyZWF0ZV9sb25nX2p1bXAKLUBjaW5kZXggV09SS0lOR19ET1RfV09SRAotQGNpbmRleCBtZF9zaG9ydF9qdW1wX3NpemUKLUBjaW5kZXggbWRfbG9uZ19qdW1wX3NpemUKLUBjaW5kZXggbWRfY3JlYXRlX3Nob3J0X2p1bXAKLUBjaW5kZXggbWRfY3JlYXRlX2xvbmdfanVtcAotSWYgQGNvZGV7V09SS0lOR19ET1RfV09SRH0gaXMgZGVmaW5lZCwgR0FTIHdpbGwgbm90IGRvIGJyb2tlbiB3b3JkIHByb2Nlc3NpbmcKLShAcHhyZWZ7QnJva2VuIHdvcmRzfSkuICBPdGhlcndpc2UsIHlvdSBzaG91bGQgc2V0IEBjb2Rle21kX3Nob3J0X2p1bXBfc2l6ZX0gdG8KLXRoZSBzaXplIG9mIGEgc2hvcnQganVtcCAoYSBqdW1wIHRoYXQgaXMganVzdCBsb25nIGVub3VnaCB0byBqdW1wIGFyb3VuZCBhIGxvbmcKLWptcCkgYW5kIEBjb2Rle21kX2xvbmdfanVtcF9zaXplfSB0byB0aGUgc2l6ZSBvZiBhIGxvbmcganVtcCAoYSBqdW1wIHRoYXQgY2FuCi1nbyBhbnl3aGVyZSBpbiB0aGUgZnVuY3Rpb24pLCBZb3Ugc2hvdWxkIGRlZmluZSBAY29kZXttZF9jcmVhdGVfc2hvcnRfanVtcH0gdG8KLWNyZWF0ZSBhIHNob3J0IGp1bXAgYXJvdW5kIGEgbG9uZyBqdW1wLCBhbmQgZGVmaW5lIEBjb2Rle21kX2NyZWF0ZV9sb25nX2p1bXB9Ci10byBjcmVhdGUgYSBsb25nIGp1bXAuCi0KLUBpdGVtIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4Ci1AY2luZGV4IG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIHNpemUgb2YgYSBAY29kZXtyc19tYWNoaW5lX2RlcGVuZGVudH0KLWZyYWcgYmVmb3JlIGFueSByZWxheGluZyBpcyBkb25lLiAgSXQgbWF5IGFsc28gY3JlYXRlIGFueSBuZWNlc3NhcnkKLXJlbG9jYXRpb25zLgotCi1AaXRlbSBtZF9yZWxheF9mcmFnCi1AY2luZGV4IG1kX3JlbGF4X2ZyYWcKLVRoaXMgbWFjcm8gbWF5IGJlIGRlZmluZWQgdG8gcmVsYXggYSBmcmFnLiAgR0FTIHdpbGwgY2FsbCB0aGlzIHdpdGggdGhlIGZyYWcKLWFuZCB0aGUgY2hhbmdlIGluIHNpemUgb2YgYWxsIHByZXZpb3VzIGZyYWdzOyBAY29kZXttZF9yZWxheF9mcmFnfSBzaG91bGQKLXJldHVybiB0aGUgY2hhbmdlIGluIHNpemUgb2YgdGhlIGZyYWcuICBAeHJlZntSZWxheGF0aW9ufS4KLQotQGl0ZW0gVENfR0VORVJJQ19SRUxBWF9UQUJMRQotQGNpbmRleCBUQ19HRU5FUklDX1JFTEFYX1RBQkxFCi1JZiB5b3UgZG8gbm90IGRlZmluZSBAY29kZXttZF9yZWxheF9mcmFnfSwgeW91IG1heSBkZWZpbmUKLUBjb2Rle1RDX0dFTkVSSUNfUkVMQVhfVEFCTEV9IGFzIGEgdGFibGUgb2YgQGNvZGV7cmVsYXhfdHlwZVN9IHN0cnVjdHVyZXMuICBUaGUKLW1hY2hpbmUgaW5kZXBlbmRlbnQgY29kZSBrbm93cyBob3cgdG8gdXNlIHN1Y2ggYSB0YWJsZSB0byByZWxheCBQQyByZWxhdGl2ZQotcmVmZXJlbmNlcy4gIFNlZSBAZmlsZXt0Yy1tNjhrLmN9IGZvciBhbiBleGFtcGxlLiAgQHhyZWZ7UmVsYXhhdGlvbn0uCi0KLUBpdGVtIG1kX3ByZXBhcmVfcmVsYXhfc2NhbgotQGNpbmRleCBtZF9wcmVwYXJlX3JlbGF4X3NjYW4KLUlmIGRlZmluZWQsIGl0IGlzIGEgQyBzdGF0ZW1lbnQgdGhhdCBpcyBpbnZva2VkIHByaW9yIHRvIHNjYW5uaW5nCi10aGUgcmVsYXggdGFibGUuCi0KLUBpdGVtIExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkKLUBjaW5kZXggTElOS0VSX1JFTEFYSU5HX1NIUklOS1NfT05MWQotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBhbmQgdGhlIGdsb2JhbCB2YXJpYWJsZSBAc2FtcHtsaW5rcmVsYXh9IGlzIHNldAotKGJlY2F1c2Ugb2YgYSBjb21tYW5kIGxpbmUgb3B0aW9uLCBvciB1bmNvbmRpdGlvbmFsbHkgaW4gQGNvZGV7bWRfYmVnaW59KSwgYQotQHNhbXB7LmFsaWdufSBkaXJlY3RpdmUgd2lsbCBjYXVzZSBleHRyYSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQuICBUaGUgbGlua2VyIGNhbgotdGhlbiBkaXNjYXJkIHRoaXMgc3BhY2Ugd2hlbiByZWxheGluZyB0aGUgc2VjdGlvbi4KLQotQGl0ZW0gbWRfY29udmVydF9mcmFnCi1AY2luZGV4IG1kX2NvbnZlcnRfZnJhZwotR0FTIHdpbGwgY2FsbCB0aGlzIGZvciBlYWNoIHJzX21hY2hpbmVfZGVwZW5kZW50IGZyYWdtZW50LgotVGhlIGluc3RydWN0aW9uIGlzIGNvbXBsZXRlZCB1c2luZyB0aGUgZGF0YSBmcm9tIHRoZSByZWxheGF0aW9uIHBhc3MuCi1JdCBtYXkgYWxzbyBjcmVhdGUgYW55IG5lY2Vzc2FyeSByZWxvY2F0aW9ucy4KLUB4cmVme1JlbGF4YXRpb259LgotCi1AaXRlbSBtZF9hcHBseV9maXgKLUBjaW5kZXggbWRfYXBwbHlfZml4Ci1HQVMgd2lsbCBjYWxsIHRoaXMgZm9yIGVhY2ggZml4dXAuICBJdCBzaG91bGQgc3RvcmUgdGhlIGNvcnJlY3QgdmFsdWUgaW4gdGhlCi1vYmplY3QgZmlsZS4gIEBjb2Rle2ZpeHVwX3NlZ21lbnR9IHBlcmZvcm1zIGEgZ2VuZXJpYyBvdmVyZmxvdyBjaGVjayBvbiB0aGUKLUBjb2Rle3ZhbHVlVCAqdmFsfSBhcmd1bWVudCBhZnRlciBAY29kZXttZF9hcHBseV9maXh9IHJldHVybnMuICBJZiB0aGUgb3ZlcmZsb3cKLWNoZWNrIGlzIHJlbGV2YW50IGZvciB0aGUgdGFyZ2V0IG1hY2hpbmUsIHRoZW4gQGNvZGV7bWRfYXBwbHlfZml4fSBzaG91bGQKLW1vZGlmeSBAY29kZXt2YWx1ZVQgKnZhbH0sIHR5cGljYWxseSB0byB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBvYmplY3QgZmlsZS4KLQotQGl0ZW0gVENfSEFORExFU19GWF9ET05FCi1AY2luZGV4IFRDX0hBTkRMRVNfRlhfRE9ORQotSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBpdCBtZWFucyB0aGF0IEBjb2Rle21kX2FwcGx5X2ZpeH0gY29ycmVjdGx5IHNldHMgdGhlCi1AY29kZXtmeF9kb25lfSBmaWVsZCBpbiB0aGUgZml4dXAuCi0KLUBpdGVtIHRjX2dlbl9yZWxvYwotQGNpbmRleCB0Y19nZW5fcmVsb2MKLUEgQGNvZGV7QkZEX0FTU0VNQkxFUn0gR0FTIHdpbGwgY2FsbCB0aGlzIHRvIGdlbmVyYXRlIGEgcmVsb2MuICBHQVMgd2lsbCBwYXNzCi10aGUgcmVzdWx0aW5nIHJlbG9jIHRvIEBjb2Rle2JmZF9pbnN0YWxsX3JlbG9jYXRpb259LiAgVGhpcyBjdXJyZW50bHkgd29ya3MKLXBvb3JseSwgYXMgQGNvZGV7YmZkX2luc3RhbGxfcmVsb2NhdGlvbn0gb2Z0ZW4gZG9lcyB0aGUgd3JvbmcgdGhpbmcsIGFuZAotaW5zdGFuY2VzIG9mIEBjb2Rle3RjX2dlbl9yZWxvY30gaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gd29yayBhcm91bmQgdGhlIHByb2JsZW1zLAotd2hpY2ggaW4gdHVybnMgbWFrZXMgaXQgZGlmZmljdWx0IHRvIGZpeCBAY29kZXtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufS4KLQotQGl0ZW0gUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFCi1AY2luZGV4IFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBpdCBtZWFucyB0aGF0IEBjb2Rle3RjX2dlbl9yZWxvY30gbWF5IHJldHVybiBtdWx0aXBsZQotcmVsb2NhdGlvbiBlbnRyaWVzIGZvciBhIHNpbmdsZSBmaXh1cC4gIEluIHRoaXMgY2FzZSwgdGhlIHJldHVybiB2YWx1ZSBvZgotQGNvZGV7dGNfZ2VuX3JlbG9jfSBpcyBhIHBvaW50ZXIgdG8gYSBudWxsIHRlcm1pbmF0ZWQgYXJyYXkuCi0KLUBpdGVtIE1BWF9SRUxPQ19FWFBBTlNJT04KLUBjaW5kZXggTUFYX1JFTE9DX0VYUEFOU0lPTgotWW91IG11c3QgZGVmaW5lIHRoaXMgaWYgQGNvZGV7UkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFfSBpcyBkZWZpbmVkOyBpdAotaW5kaWNhdGVzIHRoZSBsYXJnZXN0IG51bWJlciBvZiByZWxvY3Mgd2hpY2ggQGNvZGV7dGNfZ2VuX3JlbG9jfSBtYXkgcmV0dXJuIGZvcgotYSBzaW5nbGUgZml4dXAuCi0KLUBpdGVtIHRjX2ZpeF9hZGp1c3RhYmxlCi1AY2luZGV4IHRjX2ZpeF9hZGp1c3RhYmxlCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGluZGljYXRlIHdoZXRoZXIgYSBmaXh1cCBhZ2FpbnN0IGEgbG9jYWxseSBkZWZpbmVkCi1zeW1ib2wgc2hvdWxkIGJlIGFkanVzdGVkIHRvIGJlIGFnYWluc3QgdGhlIHNlY3Rpb24gc3ltYm9sLiAgSXQgc2hvdWxkIHJldHVybiBhCi1ub24temVybyB2YWx1ZSBpZiB0aGUgYWRqdXN0bWVudCBpcyBhY2NlcHRhYmxlLgotCi1AaXRlbSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04KLUBjaW5kZXggTURfUENSRUxfRlJPTV9TRUNUSU9OCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIGl0IHNob3VsZCByZXR1cm4gdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIGEKLVBDIHJlbGF0aXZlIGZpeHVwIGFuZCB0aGUgcG9zaXRpb24gZnJvbSB3aGljaCB0aGUgUEMgcmVsYXRpdmUgYWRqdXN0bWVudCBzaG91bGQKLWJlIG1hZGUuICBPbiBtYW55IHByb2Nlc3NvcnMsIHRoZSBiYXNlIG9mIGEgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24gaXMgdGhlIG5leHQKLWluc3RydWN0aW9uLCBzbyB0aGlzIG1hY3JvIHdvdWxkIHJldHVybiB0aGUgbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uLgotCi1AaXRlbSBtZF9wY3JlbF9mcm9tCi1AY2luZGV4IG1kX3BjcmVsX2Zyb20KLVRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgQGNvZGV7TURfUENSRUxfRlJPTV9TRUNUSU9OfS4gIFRoZSBkaWZmZXJlbmNlIGlzCi10aGF0IEBjb2Rle21kX3BjcmVsX2Zyb219IGRvZXMgbm90IHRha2UgYSBzZWN0aW9uIGFyZ3VtZW50LgotCi1AaXRlbSB0Y19mcm9iX2xhYmVsCi1AY2luZGV4IHRjX2Zyb2JfbGFiZWwKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBlYWNoIHRpbWUgYSBsYWJlbCBpcyBkZWZpbmVkLgotCi1AaXRlbSBtZF9zZWN0aW9uX2FsaWduCi1AY2luZGV4IG1kX3NlY3Rpb25fYWxpZ24KLUdBUyB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgZWFjaCBzZWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LCB0bwotcGVybWl0IHRoZSBDUFUgYmFja2VuZCB0byBhZGp1c3QgdGhlIGFsaWdubWVudCBvZiBhIHNlY3Rpb24uCi0KLUBpdGVtIHRjX2Zyb2Jfc2VjdGlvbgotQGNpbmRleCB0Y19mcm9iX3NlY3Rpb24KLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgYSBAY29kZXtCRkRfQVNTRU1CTEVSfSBHQVMgd2lsbCBjYWxsIGl0IGZvciBlYWNoCi1zZWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LgotCi1AaXRlbSB0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdAotQGNpbmRleCB0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdAotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSBzeW1ib2wgdmFsdWVzIGFyZQotcmVzb2x2ZWQsIGJ1dCBiZWZvcmUgdGhlIGZpeHVwcyBoYXZlIGJlZW4gY2hhbmdlZCBmcm9tIGxvY2FsIHN5bWJvbHMgdG8gc2VjdGlvbgotc3ltYm9scy4KLQotQGl0ZW0gdGNfZnJvYl9zeW1ib2wKLUBjaW5kZXggdGNfZnJvYl9zeW1ib2wKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBmb3IgZWFjaCBzeW1ib2wuICBZb3UgY2FuIGluZGljYXRlCi10aGF0IHRoZSBzeW1ib2wgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb2JqZWN0IGZpbGUgYnkgZGVmaW5pbmluZyB0aGlzCi1tYWNybyB0byBzZXQgaXRzIHNlY29uZCBhcmd1bWVudCB0byBhIG5vbi16ZXJvIHZhbHVlLgotCi1AaXRlbSB0Y19mcm9iX2ZpbGUKLUBjaW5kZXggdGNfZnJvYl9maWxlCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYWZ0ZXIgdGhlIHN5bWJvbCB0YWJsZSBoYXMgYmVlbgotY29tcGxldGVkLCBidXQgYmVmb3JlIHRoZSByZWxvY2F0aW9ucyBoYXZlIGJlZW4gZ2VuZXJhdGVkLgotCi1AaXRlbSB0Y19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYWZ0ZXIgdGhlIHJlbG9jcyBoYXZlIGJlZW4KLWdlbmVyYXRlZC4KLQotQGl0ZW0gTElTVElOR19IRUFERVIKLUEgc3RyaW5nIHRvIHVzZSBvbiB0aGUgaGVhZGVyIGxpbmUgb2YgYSBsaXN0aW5nLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgc2ltcGx5Ci1AY29kZXsiR0FTIExJU1RJTkcifS4KLQotQGl0ZW0gTElTVElOR19XT1JEX1NJWkUKLVRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcHV0IGludG8gYSB3b3JkIGluIGEgbGlzdGluZy4gIFRoaXMgYWZmZWN0cyB0aGUgd2F5IHRoZQotYnl0ZXMgYXJlIGNsdW1wZWQgdG9nZXRoZXIgaW4gdGhlIGxpc3RpbmcuICBGb3IgZXhhbXBsZSwgYSB2YWx1ZSBvZiAyIG1pZ2h0Ci1wcmludCBAc2FtcHsxMjM0IDU2Nzh9IHdoZXJlIGEgdmFsdWUgb2YgMSB3b3VsZCBwcmludCBAc2FtcHsxMiAzNCA1NiA3OH0uICBUaGUKLWRlZmF1bHQgdmFsdWUgaXMgNC4KLQotQGl0ZW0gTElTVElOR19MSFNfV0lEVEgKLVRoZSBudW1iZXIgb2Ygd29yZHMgb2YgZGF0YSB0byBwcmludCBvbiB0aGUgZmlyc3QgbGluZSBvZiBhIGxpc3RpbmcgZm9yIGEKLXBhcnRpY3VsYXIgc291cmNlIGxpbmUsIHdoZXJlIGVhY2ggd29yZCBpcyBAY29kZXtMSVNUSU5HX1dPUkRfU0laRX0gYnl0ZXMuICBUaGUKLWRlZmF1bHQgdmFsdWUgaXMgMS4KLQotQGl0ZW0gTElTVElOR19MSFNfV0lEVEhfU0VDT05ECi1MaWtlIEBjb2Rle0xJU1RJTkdfTEhTX1dJRFRIfSwgYnV0IGFwcGx5aW5nIHRvIHRoZSBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgbGluZQotb2YgdGhlIGRhdGEgcHJpbnRlZCBmb3IgYSBwYXJ0aWN1bGFyIHNvdXJjZSBsaW5lLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMS4KLQotQGl0ZW0gTElTVElOR19MSFNfQ09OVF9MSU5FUwotVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRpbnVhdGlvbiBsaW5lcyB0byBwcmludCBpbiBhIGxpc3RpbmcgZm9yIGEgcGFydGljdWxhcgotc291cmNlIGxpbmUuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA0LgotCi1AaXRlbSBMSVNUSU5HX1JIU19XSURUSAotVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcHJpbnQgZnJvbSBvbmUgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoZQotZGVmYXVsdCB2YWx1ZSBpcyAxMDAuCi1AZW5kIHRhYmxlCi0KLUBub2RlIE9iamVjdCBmb3JtYXQgYmFja2VuZAotQHN1YnNlY3Rpb24gV3JpdGluZyBhbiBvYmplY3QgZm9ybWF0IGJhY2tlbmQKLUBjaW5kZXggb2JqZWN0IGZvcm1hdCBiYWNrZW5kCi1AY2luZGV4IEBmaWxle29iai1AdmFye2ZtdH19Ci0KLUFzIHdpdGggdGhlIENQVSBiYWNrZW5kLCB0aGUgb2JqZWN0IGZvcm1hdCBiYWNrZW5kIG11c3QgZGVmaW5lIGEgZmV3IHRoaW5ncywKLWFuZCBtYXkgZGVmaW5lIHNvbWUgb3RoZXIgdGhpbmdzLiAgVGhlIGludGVyZmFjZSB0byB0aGUgb2JqZWN0IGZvcm1hdCBiYWNrZW5kCi1pcyBnZW5lcmFsbHkgc2ltcGxlcjsgbW9zdCBvZiB0aGUgc3VwcG9ydCBmb3IgYW4gb2JqZWN0IGZpbGUgZm9ybWF0IGNvbnNpc3RzIG9mCi1kZWZpbmluZyBhIG51bWJlciBvZiBwc2V1ZG8tb3BzLgotCi1UaGUgb2JqZWN0IGZvcm1hdCBAZmlsZXsuaH0gZmlsZSBtdXN0IGluY2x1ZGUgQGZpbGV7dGFyZy1jcHUuaH0uCi0KLVRoaXMgc2VjdGlvbiB3aWxsIG9ubHkgZGVmaW5lIHRoZSBAY29kZXtCRkRfQVNTRU1CTEVSfSB2ZXJzaW9uIG9mIEdBUy4gIEl0IGlzCi1pbXBvc3NpYmxlIHRvIHN1cHBvcnQgYSBuZXcgb2JqZWN0IGZpbGUgZm9ybWF0IHVzaW5nIGFueSBvdGhlciB2ZXJzaW9uIGFueWhvdywKLWFzIHRoZSBvcmlnaW5hbCBHQVMgdmVyc2lvbiBvbmx5IHN1cHBvcnRzIGEub3V0LCBhbmQgdGhlIEBjb2Rle01BTllfU0VHTUVOVFN9Ci1HQVMgdmVyc2lvbiBvbmx5IHN1cHBvcnRzIENPRkYuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gT0JKX0B2YXJ7Zm9ybWF0fQotQGNpbmRleCBPQkpfQHZhcntmb3JtYXR9Ci1CeSBjb252ZW50aW9uLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGlzIG1hY3JvIGluIHRoZSBAZmlsZXsuaH0gZmlsZS4gIEZvcgotZXhhbXBsZSwgQGZpbGV7b2JqLWVsZi5ofSBkZWZpbmVzIEBjb2Rle09CSl9FTEZ9LiAgWW91IG1pZ2h0IGhhdmUgdG8gdXNlIHRoaXMKLWlmIGl0IGlzIG5lY2Vzc2FyeSB0byBhZGQgb2JqZWN0IGZpbGUgZm9ybWF0IHNwZWNpZmljIGNvZGUgdG8gdGhlIENQVSBmaWxlLgotCi1AaXRlbSBvYmpfYmVnaW4KLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBhdCB0aGUgc3RhcnQgb2YgdGhlIGFzc2VtYmx5LCBhZnRlcgotdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaGF2ZSBiZWVuIHBhcnNlZCBhbmQgYWxsIHRoZSBtYWNoaW5lIGluZGVwZW5kZW50Ci1pbml0aWFsaXphdGlvbnMgaGF2ZSBiZWVuIGNvbXBsZXRlZC4KLQotQGl0ZW0gb2JqX2FwcF9maWxlCi1AY2luZGV4IG9ial9hcHBfZmlsZQotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBpbnZva2UgaXQgd2hlbiBpdCBzZWVzIGEgQGNvZGV7LmZpbGV9Ci1wc2V1ZG8tb3Agb3IgYSBAc2FtcHsjfSBsaW5lIGFzIHVzZWQgYnkgdGhlIEMgcHJlcHJvY2Vzc29yLgotCi1AaXRlbSBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUwotQGNpbmRleCBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUwotWW91IHNob3VsZCBkZWZpbmUgdGhpcyBtYWNybyB0byBjb3B5IG9iamVjdCBmb3JtYXQgc3BlY2lmaWMgaW5mb3JtYXRpb24gZnJvbQotb25lIHN5bWJvbCB0byBhbm90aGVyLiAgR0FTIHdpbGwgY2FsbCBpdCB3aGVuIG9uZSBzeW1ib2wgaXMgZXF1YXRlZCB0bwotYW5vdGhlci4KLQotQGl0ZW0gb2JqX2ZpeF9hZGp1c3RhYmxlCi1AY2luZGV4IG9ial9maXhfYWRqdXN0YWJsZQotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgZml4dXAgYWdhaW5zdCBhIGxvY2FsbHkgZGVmaW5lZAotc3ltYm9sIHNob3VsZCBiZSBhZGp1c3RlZCB0byBiZSBhZ2FpbnN0IHRoZSBzZWN0aW9uIHN5bWJvbC4gIEl0IHNob3VsZCByZXR1cm4gYQotbm9uLXplcm8gdmFsdWUgaWYgdGhlIGFkanVzdG1lbnQgaXMgYWNjZXB0YWJsZS4KLQotQGl0ZW0gb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jCi1AY2luZGV4IG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYwotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE9LIHRvIHVzZSBhIHNlY3Rpb24gc3ltYm9sIGluCi1hIHJlbG9jYXRlaW9uIGVudHJ5LiAgSWYgaXQgaXMgbm90LCBHQVMgd2lsbCBkZWZpbmUgYSBuZXcgc3ltYm9sIGF0IHRoZSBzdGFydAotb2YgYSBzZWN0aW9uLgotCi1AaXRlbSBFTUlUX1NFQ1RJT05fU1lNQk9MUwotQGNpbmRleCBFTUlUX1NFQ1RJT05fU1lNQk9MUwotWW91IHNob3VsZCBkZWZpbmUgdGhpcyBtYWNybyB3aXRoIGEgemVybyB2YWx1ZSBpZiB5b3UgZG8gbm90IHdhbnQgdG8gaW5jbHVkZQotc2VjdGlvbiBzeW1ib2xzIGluIHRoZSBvdXRwdXQgc3ltYm9sIHRhYmxlLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgbWFjcm8KLWlzIG9uZS4KLQotQGl0ZW0gb2JqX2FkanVzdF9zeW10YWIKLUBjaW5kZXggb2JqX2FkanVzdF9zeW10YWIKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgaW52b2tlIGl0IGp1c3QgYmVmb3JlIHNldHRpbmcgdGhlIHN5bWJvbAotdGFibGUgb2YgdGhlIG91dHB1dCBCRkQuICBGb3IgZXhhbXBsZSwgdGhlIENPRkYgc3VwcG9ydCB1c2VzIHRoaXMgbWFjcm8gdG8KLWdlbmVyYXRlIGEgQGNvZGV7LmZpbGV9IHN5bWJvbCBpZiBub25lIHdhcyBnZW5lcmF0ZWQgcHJldmlvdXNseS4KLQotQGl0ZW0gU0VQQVJBVEVfU1RBQl9TRUNUSU9OUwotQGNpbmRleCBTRVBBUkFURV9TVEFCX1NFQ1RJT05TCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGluZGljYXRlIHRoYXQgc3RhYnMgc2hvdWxkIGJlIHBsYWNlZCBpbiBzZXBhcmF0ZQotc2VjdGlvbnMsIGFzIGluIEVMRi4KLQotQGl0ZW0gSU5JVF9TVEFCX1NFQ1RJT04KLUBjaW5kZXggSU5JVF9TVEFCX1NFQ1RJT04KLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gaW5pdGlhbGl6ZSB0aGUgc3RhYnMgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLUBpdGVtIE9CSl9QUk9DRVNTX1NUQUIKLUBjaW5kZXggT0JKX1BST0NFU1NfU1RBQgotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBkbyBzcGVjaWZpYyBwcm9jZXNzaW5nIG9uIGEgc3RhYnMgZW50cnkuCi0KLUBpdGVtIG9ial9mcm9iX3NlY3Rpb24KLUBjaW5kZXggb2JqX2Zyb2Jfc2VjdGlvbgotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGZvciBlYWNoIHNlY3Rpb24gYXQgdGhlIGVuZCBvZiB0aGUKLWFzc2VtYmx5LgotCi1AaXRlbSBvYmpfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QKLUBjaW5kZXggb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0Ci1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYWZ0ZXIgdGhlIHN5bWJvbCB2YWx1ZXMgYXJlCi1yZXNvbHZlZCwgYnV0IGJlZm9yZSB0aGUgZml4dXBzIGhhdmUgYmVlbiBjaGFuZ2VkIGZyb20gbG9jYWwgc3ltYm9scyB0byBzZWN0aW9uCi1zeW1ib2xzLgotCi1AaXRlbSBvYmpfZnJvYl9zeW1ib2wKLUBjaW5kZXggb2JqX2Zyb2Jfc3ltYm9sCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgZm9yIGVhY2ggc3ltYm9sLiAgWW91IGNhbiBpbmRpY2F0ZQotdGhhdCB0aGUgc3ltYm9sIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG9iamVjdCBmaWxlIGJ5IGRlZmluaW5pbmcgdGhpcwotbWFjcm8gdG8gc2V0IGl0cyBzZWNvbmQgYXJndW1lbnQgdG8gYSBub24temVybyB2YWx1ZS4KLQotQGl0ZW0gb2JqX2Zyb2JfZmlsZQotQGNpbmRleCBvYmpfZnJvYl9maWxlCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYWZ0ZXIgdGhlIHN5bWJvbCB0YWJsZSBoYXMgYmVlbgotY29tcGxldGVkLCBidXQgYmVmb3JlIHRoZSByZWxvY2F0aW9ucyBoYXZlIGJlZW4gZ2VuZXJhdGVkLgotCi1AaXRlbSBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcwotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSByZWxvY3MgaGF2ZSBiZWVuCi1nZW5lcmF0ZWQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEVtdWxhdGlvbnMKLUBzdWJzZWN0aW9uIFdyaXRpbmcgZW11bGF0aW9uIGZpbGVzCi0KLU5vcm1hbGx5IHlvdSBkbyBub3QgaGF2ZSB0byB3cml0ZSBhbiBlbXVsYXRpb24gZmlsZS4gIFlvdSBjYW4ganVzdCB1c2UKLUBmaWxle3RlLWdlbmVyaWMuaH0uCi0KLUlmIHlvdSBkbyB3cml0ZSB5b3VyIG93biBlbXVsYXRpb24gZmlsZSwgaXQgbXVzdCBpbmNsdWRlIEBmaWxle29iai1mb3JtYXQuaH0uCi0KLUFuIGVtdWxhdGlvbiBmaWxlIHdpbGwgb2Z0ZW4gZGVmaW5lIEBjb2Rle1RFX0B2YXJ7RU19fTsgdGhpcyBtYXkgdGhlbiBiZSB1c2VkCi1pbiBvdGhlciBmaWxlcyB0byBjaGFuZ2UgdGhlIG91dHB1dC4KLQotQG5vZGUgUmVsYXhhdGlvbgotQHNlY3Rpb24gUmVsYXhhdGlvbgotQGNpbmRleCByZWxheGF0aW9uCi0KLUBkZm57UmVsYXhhdGlvbn0gaXMgYSBnZW5lcmljIHRlcm0gdXNlZCB3aGVuIHRoZSBzaXplIG9mIHNvbWUgaW5zdHJ1Y3Rpb24gb3IKLWRhdGEgZGVwZW5kcyB1cG9uIHRoZSB2YWx1ZSBvZiBzb21lIHN5bWJvbCBvciBvdGhlciBkYXRhLgotCi1HQVMga25vd3MgdG8gcmVsYXggYSBwYXJ0aWN1bGFyIHR5cGUgb2YgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiB1c2luZyBhIHRhYmxlLgotWW91IGNhbiBhbHNvIGRlZmluZSBhcmJpdHJhcmlseSBjb21wbGV4IGZvcm1zIG9mIHJlbGF4YXRpb24geW91cnNlbGYuCi0KLUBtZW51Ci0qIFJlbGF4aW5nIHdpdGggYSB0YWJsZTo6ICAgICAgIFJlbGF4aW5nIHdpdGggYSB0YWJsZQotKiBHZW5lcmFsIHJlbGF4aW5nOjogICAgICAgICAgICBHZW5lcmFsIHJlbGF4aW5nCi1AZW5kIG1lbnUKLQotQG5vZGUgUmVsYXhpbmcgd2l0aCBhIHRhYmxlCi1Ac3Vic2VjdGlvbiBSZWxheGluZyB3aXRoIGEgdGFibGUKLQotSWYgeW91IGRvIG5vdCBkZWZpbmUgQGNvZGV7bWRfcmVsYXhfZnJhZ30sIGFuZCB5b3UgZG8gZGVmaW5lCi1AY29kZXtUQ19HRU5FUklDX1JFTEFYX1RBQkxFfSwgR0FTIHdpbGwgcmVsYXggQGNvZGV7cnNfbWFjaGluZV9kZXBlbmRlbnR9IGZyYWdzCi1iYXNlZCBvbiB0aGUgZnJhZyBzdWJ0eXBlIGFuZCB0aGUgZGlzcGxhY2VtZW50IHRvIHNvbWUgc3BlY2lmaWVkIHRhcmdldAotYWRkcmVzcy4gIFRoZSBiYXNpYyBpZGVhIGlzIHRoYXQgc2V2ZXJhbCBtYWNoaW5lcyBoYXZlIGRpZmZlcmVudCBhZGRyZXNzaW5nCi1tb2RlcyBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIHNwZWNpZnkgZGlmZmVyZW50IHJhbmdlcyBvZiB2YWx1ZXMsIHdpdGgKLXN1Y2Nlc3NpdmUgbW9kZXMgYWJsZSB0byBhY2Nlc3Mgd2lkZXIgcmFuZ2VzLCBpbmNsdWRpbmcgdGhlIGVudGlyZXR5IG9mIHRoZQotcHJldmlvdXMgcmFuZ2UuICBTbWFsbGVyIHJhbmdlcyBhcmUgYXNzdW1lZCB0byBiZSBtb3JlIGRlc2lyYWJsZSAocGVyaGFwcyB0aGUKLWluc3RydWN0aW9uIHJlcXVpcmVzIG9uZSB3b3JkIGluc3RlYWQgb2YgdHdvIG9yIHRocmVlKTsgaWYgdGhpcyBpcyBub3QgdGhlCi1jYXNlLCBkb24ndCBkZXNjcmliZSB0aGUgc21hbGxlci1yYW5nZSwgaW5mZXJpb3IgbW9kZS4KLQotVGhlIEBjb2Rle2ZyX3N1YnR5cGV9IGZpZWxkIG9mIGEgZnJhZyBpcyBhbiBpbmRleCBpbnRvIGEgQ1BVLXNwZWNpZmljCi1yZWxheGF0aW9uIHRhYmxlLiAgVGhhdCB0YWJsZSBlbnRyeSBpbmRpY2F0ZXMgdGhlIHJhbmdlIG9mIHZhbHVlcyB0aGF0IGNhbiBiZQotc3RvcmVkLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2lsbCBoYXZlIHRvIGJlIGFkZGVkIHRvIHRoZSBmcmFnIHRvCi1hY2NvbW9kYXRlIHRoZSBhZGRyZXNzaW5nIG1vZGUsIGFuZCB0aGUgaW5kZXggb2YgdGhlIG5leHQgZW50cnkgdG8gZXhhbWluZSBpZgotdGhlIHZhbHVlIHRvIGJlIHN0b3JlZCBpcyBvdXRzaWRlIHRoZSByYW5nZSBhY2Nlc3NpYmxlIGJ5IHRoZSBjdXJyZW50Ci1hZGRyZXNzaW5nIG1vZGUuICBUaGUgQGNvZGV7ZnJfc3ltYm9sfSBmaWVsZCBvZiB0aGUgZnJhZyBpbmRpY2F0ZXMgd2hhdCBzeW1ib2wKLWlzIHRvIGJlIGFjY2Vzc2VkOyB0aGUgQGNvZGV7ZnJfb2Zmc2V0fSBmaWVsZCBpcyBhZGRlZCBpbi4KLQotSWYgdGhlIEBjb2Rle1RDX1BDUkVMX0FESlVTVH0gbWFjcm8gaXMgZGVmaW5lZCwgd2hpY2ggY3VycmVudGx5IHNob3VsZCBvbmx5IGhhcHBlbgotZm9yIHRoZSBOUzMyayBmYW1pbHksIHRoZSBAY29kZXtUQ19QQ1JFTF9BREpVU1R9IG1hY3JvIGlzIGNhbGxlZCBvbiB0aGUgZnJhZyB0bwotY29tcHV0ZSBhbiBhZGp1c3RtZW50IHRvIGJlIG1hZGUgdG8gdGhlIGRpc3BsYWNlbWVudC4KLQotVGhlIHZhbHVlIGZpdHRlZCBieSB0aGUgcmVsYXhhdGlvbiBjb2RlIGlzIGFsd2F5cyBhc3N1bWVkIHRvIGJlIGEgZGlzcGxhY2VtZW50Ci1mcm9tIHRoZSBjdXJyZW50IGZyYWcuICAoTW9yZSBzcGVjaWZpY2FsbHksIGZyb20gQGNvZGV7ZnJfZml4fSBieXRlcyBpbnRvIHRoZQotZnJhZy4pCi1AaWdub3JlCi1UaGlzIHNlZW1zIGtpbmRhIHNpbGx5LiAgV2hhdCBhYm91dCBmaXR0aW5nIHNtYWxsIGFic29sdXRlIHZhbHVlcz8gIEkgc3VwcG9zZQotQGNvZGV7bWRfYXNzZW1ibGV9IGlzIHN1cHBvc2VkIHRvIHRha2UgY2FyZSBvZiB0aGF0LCBidXQgaWYgdGhlIG9wZXJhbmQgaXMgYQotZGlmZmVyZW5jZSBiZXR3ZWVuIHN5bWJvbHMsIGl0IG1pZ2h0IG5vdCBiZSBhYmxlIHRvLCBpZiB0aGUgZGlmZmVyZW5jZSB3YXMgbm90Ci1jb21wdXRhYmxlIHlldC4KLUBlbmQgaWdub3JlCi0KLVRoZSBlbmQgb2YgdGhlIHJlbGF4YXRpb24gc2VxdWVuY2UgaXMgaW5kaWNhdGVkIGJ5IGEgYGBuZXh0JycgdmFsdWUgb2YgMC4gIFRoaXMKLW1lYW5zIHRoYXQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSB0YWJsZSBjYW4ndCBiZSB1c2VkLgotCi1Gb3Igc29tZSBjb25maWd1cmF0aW9ucywgdGhlIGxpbmtlciBjYW4gZG8gcmVsYXhpbmcgd2l0aGluIGEgc2VjdGlvbiBvZiBhbgotb2JqZWN0IGZpbGUuICBJZiBjYWxsIGluc3RydWN0aW9ucyBvZiB2YXJpb3VzIHNpemVzIGV4aXN0LCB0aGUgbGlua2VyIGNhbgotZGV0ZXJtaW5lIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluIGVhY2ggaW5zdGFuY2UsIHdoZW4gYSBzeW1ib2wncyB2YWx1ZSBpcwotcmVzb2x2ZWQuICBJbiBvcmRlciBmb3IgdGhlIGxpbmtlciB0byBhdm9pZCB3YXN0aW5nIHNwYWNlIGFuZCBoYXZpbmcgdG8gaW5zZXJ0Ci1uby1vcCBpbnN0cnVjdGlvbnMsIGl0IG11c3QgYmUgYWJsZSB0byBleHBhbmQgb3Igc2hyaW5rIHRoZSBzZWN0aW9uIGNvbnRlbnRzCi13aGlsZSBzdGlsbCBwcmVzZXJ2aW5nIGludHJhLXNlY3Rpb24gcmVmZXJlbmNlcyBhbmQgbWVldGluZyBhbGlnbm1lbnQKLXJlcXVpcmVtZW50cy4KLQotRm9yIHRoZSBpOTYwIHVzaW5nIGIub3V0IGZvcm1hdCwgbm8gZXhwYW5zaW9uIGlzIGRvbmU7IGluc3RlYWQsIGVhY2gKLUBzYW1wey5hbGlnbn0gZGlyZWN0aXZlIGNhdXNlcyBleHRyYSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQsIGVub3VnaCB0aGF0IHdoZW4KLXRoZSBsaW5rZXIgaXMgcmVsYXhpbmcgYSBzZWN0aW9uIGFuZCByZW1vdmluZyB1bm5lZWRlZCBzcGFjZSwgaXQgY2FuIGRpc2NhcmQKLXNvbWUgb3IgYWxsIG9mIHRoaXMgZXh0cmEgcGFkZGluZyBhbmQgY2F1c2UgdGhlIGZvbGxvd2luZyBkYXRhIHRvIGJlIGNvcnJlY3RseQotYWxpZ25lZC4KLQotRm9yIHRoZSBIOC8zMDAsIEkgdGhpbmsgdGhlIGxpbmtlciBleHBhbmRzIGNhbGxzIHRoYXQgY2FuJ3QgcmVhY2gsIGFuZCBkb2Vzbid0Ci13b3JyeSBhYm91dCBhbGlnbm1lbnQgaXNzdWVzOyB0aGUgY3B1IHByb2JhYmx5IG5ldmVyIG5lZWRzIGFueSBzaWduaWZpY2FudAotYWxpZ25tZW50IGJleW9uZCB0aGUgaW5zdHJ1Y3Rpb24gc2l6ZS4KLQotVGhlIHJlbGF4YXRpb24gdGFibGUgdHlwZSBjb250YWlucyB0aGVzZSBmaWVsZHM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gbG9uZyBybHhfZm9yd2FyZAotRm9yd2FyZCByZWFjaCwgbXVzdCBiZSBub24tbmVnYXRpdmUuCi1AaXRlbSBsb25nIHJseF9iYWNrd2FyZAotQmFja3dhcmQgcmVhY2gsIG11c3QgYmUgemVybyBvciBuZWdhdGl2ZS4KLUBpdGVtIHJseF9sZW5ndGgKLUxlbmd0aCBpbiBieXRlcyBvZiB0aGlzIGFkZHJlc3NpbmcgbW9kZS4KLUBpdGVtIHJseF9tb3JlCi1JbmRleCBvZiB0aGUgbmV4dC1sb25nZXIgcmVsYXggc3RhdGUsIG9yIHplcm8gaWYgdGhlcmUgaXMgbm8gbmV4dCByZWxheCBzdGF0ZS4KLUBlbmQgdGFibGUKLQotVGhlIHJlbGF4YXRpb24gaXMgZG9uZSBpbiBAY29kZXtyZWxheF9zZWdtZW50fSBpbiBAZmlsZXt3cml0ZS5jfS4gIFRoZQotZGlmZmVyZW5jZSBpbiB0aGUgbGVuZ3RoIGZpZWxkcyBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBtb2RlIGFuZCB0aGUgb25lIGZpbmFsbHkKLWNob3NlbiBieSB0aGUgcmVsYXhpbmcgY29kZSBpcyB0YWtlbiBhcyB0aGUgc2l6ZSBieSB3aGljaCB0aGUgY3VycmVudCBmcmFnIHdpbGwKLWJlIGluY3JlYXNlZCBpbiBzaXplLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBpbml0aWFsIHJlbGF4aW5nIG1vZGUgaGFzIGEgbGVuZ3RoCi1vZiAyIGJ5dGVzLCBhbmQgYmVjYXVzZSBvZiB0aGUgc2l6ZSBvZiB0aGUgZGlzcGxhY2VtZW50LCBpdCBnZXRzIHVwZ3JhZGVkIHRvIGEKLW1vZGUgd2l0aCBhIHNpemUgb2YgNiBieXRlcywgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFnIHdpbGwgZ3JvdyBieSA0IGJ5dGVzLgotKFRoZSBpbml0aWFsIHR3byBieXRlcyBzaG91bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIGZpeGVkIHBvcnRpb24gb2YgdGhlIGZyYWcsCi1zaW5jZSBpdCBpcyBhbHJlYWR5IGtub3duIHRoYXQgdGhleSB3aWxsIGJlIG91dHB1dC4pICBUaGlzIGdyb3d0aCBtdXN0IGJlCi1lZmZlY3RlZCBieSBAY29kZXttZF9jb252ZXJ0X2ZyYWd9OyBpdCBzaG91bGQgaW5jcmVhc2UgdGhlIEBjb2Rle2ZyX2ZpeH0gZmllbGQKLWJ5IHRoZSBhcHByb3ByaWF0ZSBzaXplLCBhbmQgZmlsbCBpbiB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgb2YgdGhlIGZyYWcuCi0oRW5vdWdoIHNwYWNlIGZvciB0aGUgbWF4aW11bSBncm93dGggc2hvdWxkIGhhdmUgYmVlbiBhbGxvY2F0ZWQgaW4gdGhlIGNhbGwgdG8KLWZyYWdfdmFyIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuKQotCi1JZiByZWxvY2F0aW9uIHJlY29yZHMgYXJlIG5lZWRlZCwgdGhleSBzaG91bGQgYmUgZW1pdHRlZCBieQotQGNvZGV7bWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXh9LiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgZXhhbWluZSB0aGUgdGFyZ2V0Ci1zeW1ib2wgb2YgdGhlIHN1cHBsaWVkIGZyYWcgYW5kIGNvcnJlY3QgdGhlIEBjb2Rle2ZyX3N1YnR5cGV9IG9mIHRoZSBmcmFnIGlmCi1uZWVkZWQuICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBpZiB0aGUgc3ltYm9sIGhhcyBub3QgeWV0IGJlZW4gZGVmaW5lZCwKLWl0IHdpbGwgbm90IGJlY29tZSBkZWZpbmVkIGxhdGVyOyBob3dldmVyLCBpdHMgdmFsdWUgbWF5IHN0aWxsIGNoYW5nZSBpZiB0aGUKLXNlY3Rpb24gaXQgaXMgaW4gZ2V0cyByZWxheGVkLgotCi1Vc3VhbGx5LCBpZiB0aGUgc3ltYm9sIGlzIGluIHRoZSBzYW1lIHNlY3Rpb24gYXMgdGhlIGZyYWcgKGdpdmVuIGJ5IHRoZQotQHZhcntzZWN9IGFyZ3VtZW50KSwgdGhlIG5hcnJvd2VzdCBsaWtlbHkgcmVsYXhhdGlvbiBtb2RlIGlzIHN0b3JlZCBpbgotQGNvZGV7ZnJfc3VidHlwZX0sIGFuZCB0aGF0J3MgdGhhdC4KLQotSWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQsIG9yIGluIGEgZGlmZmVyZW50IHNlY3Rpb24gKGFuZCB0aGVyZWZvcmUgbW92ZWFibGUKLXRvIGFuIGFyYml0cmFyaWx5IGxhcmdlIGRpc3RhbmNlKSwgdGhlIGxhcmdlc3QgYXZhaWxhYmxlIHJlbGF4YXRpb24gbW9kZSBpcwotc3BlY2lmaWVkLCBAY29kZXtmaXhfbmV3fSBpcyBjYWxsZWQgdG8gcHJvZHVjZSB0aGUgcmVsb2NhdGlvbiByZWNvcmQsCi1AY29kZXtmcl9maXh9IGlzIGluY3JlYXNlZCB0byBpbmNsdWRlIHRoZSByZWxvY2F0ZWQgZmllbGQgKHJlbWVtYmVyLCB0aGlzCi1zdG9yYWdlIHdhcyBhbGxvY2F0ZWQgd2hlbiBAY29kZXtmcmFnX3Zhcn0gd2FzIGNhbGxlZCksIGFuZCBAY29kZXtmcmFnX3dhbmV9IGlzCi1jYWxsZWQgdG8gY29udmVydCB0aGUgZnJhZyB0byBhbiBAY29kZXtyc19maWxsfSBmcmFnIHdpdGggbm8gdmFyaWFudCBwYXJ0LgotU29tZXRpbWVzIGNoYW5naW5nIGFkZHJlc3NpbmcgbW9kZXMgbWF5IGFsc28gcmVxdWlyZSByZXdyaXRpbmcgdGhlIGluc3RydWN0aW9uLgotSXQgY2FuIGJlIGFjY2Vzc2VkIHZpYSBAY29kZXtmcl9vcGNvZGV9IG9yIEBjb2Rle2ZyX2ZpeH0uCi0KLVNvbWV0aW1lcyBAY29kZXtmcl92YXJ9IGlzIGluY3JlYXNlZCBpbnN0ZWFkLCBhbmQgQGNvZGV7ZnJhZ193YW5lfSBpcyBub3QKLWNhbGxlZC4gIEknbSBub3Qgc3VyZSwgYnV0IEkgdGhpbmsgdGhpcyBpcyB0byBrZWVwIEBjb2Rle2ZyX2ZpeH0gcmVmZXJyaW5nIHRvCi1hbiBlYXJsaWVyIGJ5dGUsIGFuZCBAY29kZXtmcl9zdWJ0eXBlfSBzZXQgdG8gQGNvZGV7cnNfbWFjaGluZV9kZXBlbmRlbnR9IHNvCi10aGF0IEBjb2Rle21kX2NvbnZlcnRfZnJhZ30gd2lsbCBnZXQgY2FsbGVkLgotCi1Abm9kZSBHZW5lcmFsIHJlbGF4aW5nCi1Ac3Vic2VjdGlvbiBHZW5lcmFsIHJlbGF4aW5nCi0KLUlmIHVzaW5nIGEgc2ltcGxlIHRhYmxlIGlzIG5vdCBzdWl0YWJsZSwgeW91IG1heSBpbXBsZW1lbnQgYXJiaXRyYXJpbHkgY29tcGxleAotcmVsYXhhdGlvbiBzZW1hbnRpY3MgeW91cnNlbGYuICBGb3IgZXhhbXBsZSwgdGhlIE1JUFMgYmFja2VuZCB1c2VzIHRoaXMgdG8gZW1pdAotZGlmZmVyZW50IGluc3RydWN0aW9uIHNlcXVlbmNlcyBkZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGJlaW5nCi1hY2Nlc3NlZC4KLQotV2hlbiB5b3UgYXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBtYXkgbmVlZCByZWxheGF0aW9uLCB5b3Ugc2hvdWxkIGFsbG9jYXRlCi1hIGZyYWcgdXNpbmcgQGNvZGV7ZnJhZ192YXJ9IG9yIEBjb2Rle2ZyYWdfdmFyaWFudH0gd2l0aCBhIHR5cGUgb2YKLUBjb2Rle3JzX21hY2hpbmVfZGVwZW5kZW50fS4gIFlvdSBzaG91bGQgc3RvcmUgc29tZSBzb3J0IG9mIGluZm9ybWF0aW9uIGluIHRoZQotQGNvZGV7ZnJfc3VidHlwZX0gZmllbGQgc28gdGhhdCB5b3UgY2FuIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIHRoZSBmcmFnCi1sYXRlci4KLQotV2hlbiBHQVMgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLCBpdCB3aWxsIGxvb2sgdGhyb3VnaCB0aGUgZnJhZ3MgYW5kCi13b3JrIG91dCB0aGVpciBmaW5hbCBzaXplcy4KLQotR0FTIHdpbGwgZmlyc3QgY2FsbCBAY29kZXttZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheH0gb24gZWFjaAotQGNvZGV7cnNfbWFjaGluZV9kZXBlbmRlbnR9IGZyYWcuICBUaGlzIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGFuIGVzdGltYXRlZCBzaXplCi1mb3IgdGhlIGZyYWcuCi0KLUdBUyB3aWxsIHRoZW4gbG9vcCBvdmVyIHRoZSBmcmFncywgY2FsbGluZyBAY29kZXttZF9yZWxheF9mcmFnfSBvbiBlYWNoCi1AY29kZXtyc19tYWNoaW5lX2RlcGVuZGVudH0gZnJhZy4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgY2hhbmdlIGluCi1zaXplIG9mIHRoZSBmcmFnLiAgR0FTIHdpbGwga2VlcCBsb29waW5nIG92ZXIgdGhlIGZyYWdzIHVudGlsIG5vbmUgb2YgdGhlIGZyYWdzCi1jaGFuZ2VzIHNpemUuCi0KLUBub2RlIEJyb2tlbiB3b3JkcwotQHNlY3Rpb24gQnJva2VuIHdvcmRzCi1AY2luZGV4IGludGVybmFscywgYnJva2VuIHdvcmRzCi1AY2luZGV4IGJyb2tlbiB3b3JkcwotCi1Tb21lIGNvbXBpbGVycywgaW5jbHVkaW5nIEdDQywgd2lsbCBzb21ldGltZXMgZW1pdCBzd2l0Y2ggdGFibGVzIHNwZWNpZnlpbmcKLTE2LWJpdCBAY29kZXsud29yZH0gZGlzcGxhY2VtZW50cyB0byBicmFuY2ggdGFyZ2V0cywgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMKLXRoYXQgbG9hZCBlbnRyaWVzIGZyb20gdGhhdCB0YWJsZSB0byBjb21wdXRlIHRoZSB0YXJnZXQgYWRkcmVzcy4gIElmIHRoaXMgaXMKLWRvbmUgb24gYSAzMi1iaXQgbWFjaGluZSwgdGhlcmUgaXMgYSBjaGFuY2UgKGF0IGxlYXN0IHdpdGggcmVhbGx5IGxhcmdlCi1mdW5jdGlvbnMpIHRoYXQgdGhlIGRpc3BsYWNlbWVudCB3aWxsIG5vdCBmaXQgaW4gMTYgYml0cy4gIFRoZSBhc3NlbWJsZXIKLWhhbmRsZXMgdGhpcyB1c2luZyBhIGNvbmNlcHQgY2FsbGVkIEBkZm57YnJva2VuIHdvcmRzfS4gIFRoaXMgaWRlYSBpcyB3ZWxsCi1uYW1lZCwgc2luY2UgdGhlcmUgaXMgYW4gaW1wbGllZCBwcm9taXNlIHRoYXQgdGhlIDE2LWJpdCBmaWVsZCB3aWxsIGluIGZhY3QKLWhvbGQgdGhlIHNwZWNpZmllZCBkaXNwbGFjZW1lbnQuCi0KLUlmIGJyb2tlbiB3b3JkIHByb2Nlc3NpbmcgaXMgZW5hYmxlZCwgYW5kIGEgc2l0dWF0aW9uIGxpa2UgdGhpcyBpcyBlbmNvdW50ZXJlZCwKLXRoZSBhc3NlbWJsZXIgd2lsbCBpbnNlcnQgYSBqdW1wIGluc3RydWN0aW9uIGludG8gdGhlIGluc3RydWN0aW9uIHN0cmVhbSwgY2xvc2UKLWVub3VnaCB0byBiZSByZWFjaGVkIHdpdGggdGhlIDE2LWJpdCBkaXNwbGFjZW1lbnQuICBUaGlzIGp1bXAgaW5zdHJ1Y3Rpb24gd2lsbAotdHJhbnNmZXIgdG8gdGhlIHJlYWwgZGVzaXJlZCB0YXJnZXQgYWRkcmVzcy4gIFRodXMsIGFzIGxvbmcgYXMgdGhlIEBjb2Rley53b3JkfQotdmFsdWUgcmVhbGx5IGlzIHVzZWQgYXMgYSBkaXNwbGFjZW1lbnQgdG8gY29tcHV0ZSBhbiBhZGRyZXNzIHRvIGp1bXAgdG8sIHRoZQotbmV0IGVmZmVjdCB3aWxsIGJlIGNvcnJlY3QgKG1pbnVzIGEgdmVyeSBzbWFsbCBlZmZpY2llbmN5IGNvc3QpLiAgSWYKLUBjb2Rley53b3JkfSBkaXJlY3RpdmVzIHdpdGggbGFiZWwgZGlmZmVyZW5jZXMgZm9yIHZhbHVlcyBhcmUgdXNlZCBmb3Igb3RoZXIKLXB1cnBvc2VzLCBob3dldmVyLCB0aGluZ3MgbWF5IG5vdCB3b3JrIHByb3Blcmx5LiAgRm9yIHRhcmdldHMgd2hpY2ggdXNlIGJyb2tlbgotd29yZHMsIHRoZSBAc2FtcHstS30gb3B0aW9uIHdpbGwgd2FybiB3aGVuIGEgYnJva2VuIHdvcmQgaXMgZGlzY292ZXJlZC4KLQotVGhlIGJyb2tlbiB3b3JkIGNvZGUgaXMgdHVybmVkIG9mZiBieSB0aGUgQGNvZGV7V09SS0lOR19ET1RfV09SRH0gbWFjcm8uICBJdAotaXNuJ3QgbmVlZGVkIGlmIEBjb2Rley53b3JkfSBlbWl0cyBhIHZhbHVlIGxhcmdlIGVub3VnaCB0byBjb250YWluIGFuIGFkZHJlc3MKLShvciwgbW9yZSBjb3JyZWN0bHksIGFueSBwb3NzaWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGFkZHJlc3NlcykuCi0KLUBub2RlIEludGVybmFsIGZ1bmN0aW9ucwotQHNlY3Rpb24gSW50ZXJuYWwgZnVuY3Rpb25zCi0KLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgYmFzaWMgaW50ZXJuYWwgZnVuY3Rpb25zIHVzZWQgYnkgR0FTLgotCi1AbWVudQotKiBXYXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlczo6ICBXYXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcwotKiBIYXNoIHRhYmxlczo6ICAgICAgICAgICAgICAgICBIYXNoIHRhYmxlcwotQGVuZCBtZW51Ci0KLUBub2RlIFdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzCi1Ac3Vic2VjdGlvbiBXYXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcwotCi1AZGVmdHlwZWZ1biAgQHtAfSBpbnQgaGFkX3dhcm5pbmdzICh2b2lkKQotQGRlZnR5cGVmdW54IEB7QH0gaW50IGhhZF9lcnJvcnMgKHZvaWQpCi1SZXR1cm5zIG5vbi16ZXJvIGlmIGFueSB3YXJuaW5ncyBvciBlcnJvcnMsIHJlc3BlY3RpdmVseSwgaGF2ZSBiZWVuIHByaW50ZWQKLWR1cmluZyB0aGlzIGludm9jYXRpb24uCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gQHtAfSB2b2lkIGFzX3BlcnJvciAoY29uc3QgY2hhciAqQHZhcntncmlwZX0sIGNvbnN0IGNoYXIgKkB2YXJ7ZmlsZW5hbWV9KQotRGlzcGxheXMgYSBCRkQgb3Igc3lzdGVtIGVycm9yLCB0aGVuIGNsZWFycyB0aGUgZXJyb3Igc3RhdHVzLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuICBAe0B9IHZvaWQgYXNfdHNrdHNrIChjb25zdCBjaGFyICpAdmFye2Zvcm1hdH0sIC4uLikKLUBkZWZ0eXBlZnVueCBAe0B9IHZvaWQgYXNfd2FybiAoY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCi1AZGVmdHlwZWZ1bnggQHtAfSB2b2lkIGFzX2JhZCAoY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCi1AZGVmdHlwZWZ1bnggQHtAfSB2b2lkIGFzX2ZhdGFsIChjb25zdCBjaGFyICpAdmFye2Zvcm1hdH0sIC4uLikKLVRoZXNlIGZ1bmN0aW9ucyBkaXNwbGF5IG1lc3NhZ2VzIGFib3V0IHNvbWV0aGluZyBhbWlzcyB3aXRoIHRoZSBpbnB1dCBmaWxlLCBvcgotaW50ZXJuYWwgcHJvYmxlbXMgaW4gdGhlIGFzc2VtYmxlciBpdHNlbGYuICBUaGUgY3VycmVudCBmaWxlIG5hbWUgYW5kIGxpbmUKLW51bWJlciBhcmUgcHJpbnRlZCwgZm9sbG93ZWQgYnkgdGhlIHN1cHBsaWVkIG1lc3NhZ2UsIGZvcm1hdHRlZCB1c2luZwotQGNvZGV7dmZwcmludGZ9LCBhbmQgYSBmaW5hbCBuZXdsaW5lLgotCi1BbiBlcnJvciBpbmRpY2F0ZWQgYnkgQGNvZGV7YXNfYmFkfSB3aWxsIHJlc3VsdCBpbiBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzIHdoZW4KLXRoZSBhc3NlbWJsZXIgaGFzIGZpbmlzaGVkLiAgQ2FsbGluZyBAY29kZXthc19mYXRhbH0gd2lsbCByZXN1bHQgaW4gaW1tZWRpYXRlCi10ZXJtaW5hdGlvbiBvZiB0aGUgYXNzZW1ibGVyIHByb2Nlc3MuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gQHtAfSB2b2lkIGFzX3dhcm5fd2hlcmUgKGNoYXIgKkB2YXJ7ZmlsZX0sIHVuc2lnbmVkIGludCBAdmFye2xpbmV9LCBjb25zdCBjaGFyICpAdmFye2Zvcm1hdH0sIC4uLikKLUBkZWZ0eXBlZnVueCBAe0B9IHZvaWQgYXNfYmFkX3doZXJlIChjaGFyICpAdmFye2ZpbGV9LCB1bnNpZ25lZCBpbnQgQHZhcntsaW5lfSwgY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCi1UaGVzZSB2YXJpYW50cyBwZXJtaXQgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciwgYW5kIGFyZQotdXNlZCB3aGVuIHByb2JsZW1zIGFyZSBkZXRlY3RlZCB3aGVuIHJlcHJvY2Vzc2luZyBpbmZvcm1hdGlvbiBzYXZlZCBhd2F5IHdoZW4KLXByb2Nlc3Npbmcgc29tZSBlYXJsaWVyIHBhcnQgb2YgdGhlIGZpbGUuICBGb3IgZXhhbXBsZSwgZml4dXBzIGFyZSBwcm9jZXNzZWQKLWFmdGVyIGFsbCBpbnB1dCBoYXMgYmVlbiByZWFkLCBidXQgbWVzc2FnZXMgYWJvdXQgZml4dXBzIHNob3VsZCByZWZlciB0byB0aGUKLW9yaWdpbmFsIGZpbGVuYW1lIGFuZCBsaW5lIG51bWJlciB0aGF0IHRoZXkgYXJlIGFwcGxpY2FibGUgdG8uCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gQHtAfSB2b2lkIGZwcmludF92YWx1ZSAoRklMRSAqQHZhcntmaWxlfSwgdmFsdWVUIEB2YXJ7dmFsfSkKLUBkZWZ0eXBlZnVueCBAe0B9IHZvaWQgc3ByaW50X3ZhbHVlIChjaGFyICpAdmFye2J1Zn0sIHZhbHVlVCBAdmFye3ZhbH0pCi1UaGVzZSBmdW5jdGlvbnMgYXJlIGhlbHBmdWwgZm9yIGNvbnZlcnRpbmcgYSBAY29kZXt2YWx1ZVR9IHZhbHVlIGludG8gcHJpbnRhYmxlCi1mb3JtYXQsIGluIGNhc2UgaXQncyB3aWRlciB0aGFuIG1vZGVzIHRoYXQgQGNvZGV7KnByaW50Zn0gY2FuIGhhbmRsZS4gIElmIHRoZQotdHlwZSBpcyBuYXJyb3cgZW5vdWdoLCBhIGRlY2ltYWwgbnVtYmVyIHdpbGwgYmUgcHJvZHVjZWQ7IG90aGVyd2lzZSwgaXQgd2lsbCBiZQotaW4gaGV4YWRlY2ltYWwuICBUaGUgdmFsdWUgaXRzZWxmIGlzIG5vdCBleGFtaW5lZCB0byBtYWtlIHRoaXMgZGV0ZXJtaW5hdGlvbi4KLUBlbmQgZGVmdHlwZWZ1bgotCi1Abm9kZSBIYXNoIHRhYmxlcwotQHN1YnNlY3Rpb24gSGFzaCB0YWJsZXMKLUBjaW5kZXggaGFzaCB0YWJsZXMKLQotQGRlZnR5cGVmdW4gQHtAfSBAe3N0cnVjdCBoYXNoX2NvbnRyb2wgKkB9IGhhc2hfbmV3ICh2b2lkKQotQ3JlYXRlcyB0aGUgaGFzaCB0YWJsZSBjb250cm9sIHN0cnVjdHVyZS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBAe0B9IHZvaWQgaGFzaF9kaWUgKHN0cnVjdCBoYXNoX2NvbnRyb2wgKikKLURlc3Ryb3kgYSBoYXNoIHRhYmxlLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gUFRSIGhhc2hfZGVsZXRlIChzdHJ1Y3QgaGFzaF9jb250cm9sICosIGNvbnN0IGNoYXIgKikKLURlbGV0ZXMgZW50cnkgZnJvbSB0aGUgaGFzaCB0YWJsZSwgcmV0dXJucyB0aGUgdmFsdWUgaXQgaGFkLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gUFRSIGhhc2hfcmVwbGFjZSAoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICosIFBUUikKLVVwZGF0ZXMgdGhlIHZhbHVlIGZvciBhbiBlbnRyeSBhbHJlYWR5IGluIHRoZSB0YWJsZSwgcmV0dXJuaW5nIHRoZSBvbGQgdmFsdWUuCi1JZiBubyBlbnRyeSB3YXMgZm91bmQsIGp1c3QgcmV0dXJucyBOVUxMLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gQHtjb25zdCBjaGFyICpAfSBoYXNoX2luc2VydCAoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICosIFBUUikKLUluc2VydGluZyBhIHZhbHVlIGFscmVhZHkgaW4gdGhlIHRhYmxlIGlzIGFuIGVycm9yLgotUmV0dXJucyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gQHtAfSBAe2NvbnN0IGNoYXIgKkB9IGhhc2hfamFtIChzdHJ1Y3QgaGFzaF9jb250cm9sICosIGNvbnN0IGNoYXIgKiwgUFRSKQotSW5zZXJ0cyBpZiB0aGUgdmFsdWUgaXNuJ3QgYWxyZWFkeSBwcmVzZW50LCB1cGRhdGVzIGl0IGlmIGl0IGlzLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBub2RlIFRlc3Qgc3VpdGUKLUBzZWN0aW9uIFRlc3Qgc3VpdGUKLUBjaW5kZXggdGVzdCBzdWl0ZQotCi1UaGUgdGVzdCBzdWl0ZSBpcyBraW5kIG9mIGxhbWUgZm9yIG1vc3QgcHJvY2Vzc29ycy4gIE9mdGVuIGl0IG9ubHkgY2hlY2tzIHRvCi1zZWUgaWYgYSBjb3VwbGUgb2YgZmlsZXMgY2FuIGJlIGFzc2VtYmxlZCB3aXRob3V0IHRoZSBhc3NlbWJsZXIgcmVwb3J0aW5nIGFueQotZXJyb3JzLiAgRm9yIG1vcmUgY29tcGxldGUgdGVzdGluZywgd3JpdGUgYSB0ZXN0IHdoaWNoIGVpdGhlciBleGFtaW5lcyB0aGUKLWFzc2VtYmxlciBsaXN0aW5nLCBvciBydW5zIEBjb2Rle29iamR1bXB9IGFuZCBleGFtaW5lcyBpdHMgb3V0cHV0LiAgRm9yIHRoZQotbGF0dGVyLCB0aGUgVENMIHByb2NlZHVyZSBAY29kZXtydW5fZHVtcF90ZXN0fSBtYXkgY29tZSBpbiBoYW5keS4gIEl0IHRha2VzIHRoZQotYmFzZSBuYW1lIG9mIGEgZmlsZSwgYW5kIGxvb2tzIGZvciBAZmlsZXtAdmFye2ZpbGV9LmR9LiAgVGhpcyBmaWxlIHNob3VsZAotY29udGFpbiBhcyBpdHMgaW5pdGlhbCBsaW5lcyBhIHNldCBvZiB2YXJpYWJsZSBzZXR0aW5ncyBpbiBAc2FtcHsjfSBjb21tZW50cywKLWluIHRoZSBmb3JtOgotCi1AZXhhbXBsZQotICAgICAgICAjQHZhcnt2YXJuYW1lfTogQHZhcnt2YWx1ZX0KLUBlbmQgZXhhbXBsZQotCi1UaGUgQHZhcnt2YXJuYW1lfSBtYXkgYmUgQGNvZGV7b2JqZHVtcH0sIEBjb2Rle25tfSwgb3IgQGNvZGV7YXN9LCBpbiB3aGljaCBjYXNlCi1pdCBzcGVjaWZpZXMgdGhlIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRvIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbXMuICBFeGFjdGx5IG9uZQotb2YgQGNvZGV7b2JqZHVtcH0gb3IgQGNvZGV7bm19IG11c3QgYmUgc3BlY2lmaWVkLCBhcyB0aGF0IGFsc28gc3BlY2lmaWVzIHdoaWNoCi1wcm9ncmFtIHRvIHJ1biBhZnRlciB0aGUgYXNzZW1ibGVyIGhhcyBmaW5pc2hlZC4gIElmIEB2YXJ7dmFybmFtZX0gaXMKLUBjb2Rle3NvdXJjZX0sIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGU7IG90aGVyd2lzZSwKLUBmaWxle0B2YXJ7ZmlsZX0uc30gaXMgdXNlZC4gIElmIEB2YXJ7dmFybmFtZX0gaXMgQGNvZGV7bmFtZX0sIGl0IHNwZWNpZmllcyB0aGUKLW5hbWUgb2YgdGhlIHRlc3QgdG8gYmUgdXNlZCBpbiB0aGUgQGNvZGV7cGFzc30gb3IgQGNvZGV7ZmFpbH0gbWVzc2FnZXMuCi0KLVRoZSBub24tY29tbWVudGVkIHBhcnRzIG9mIHRoZSBmaWxlIGFyZSBpbnRlcnByZXRlZCBhcyByZWd1bGFyIGV4cHJlc3Npb25zLCBvbmUKLXBlciBsaW5lLiAgQmxhbmsgbGluZXMgaW4gdGhlIEBjb2Rle29iamR1bXB9IG9yIEBjb2Rle25tfSBvdXRwdXQgYXJlIHNraXBwZWQsCi1hcyBhcmUgYmxhbmsgbGluZXMgaW4gdGhlIEBjb2Rley5kfSBmaWxlOyB0aGUgb3RoZXIgbGluZXMgYXJlIHRlc3RlZCB0byBzZWUgaWYKLXRoZSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlcyB0aGUgcHJvZ3JhbSBvdXRwdXQuICBJZiBpdCBkb2VzIG5vdCwgdGhlIHRlc3QKLWZhaWxzLgotCi1Ob3RlIHRoYXQgdGhpcyBtZWFucyB0aGUgdGVzdHMgbXVzdCBiZSBtb2RpZmllZCBpZiB0aGUgQGNvZGV7b2JqZHVtcH0gb3V0cHV0Ci1zdHlsZSBpcyBjaGFuZ2VkLgotCi1AYnllCi1AYyBMb2NhbCBWYXJpYWJsZXM6Ci1AYyBmaWxsLWNvbHVtbjogNzkKLUBjIEVuZDoKZGlmZiAtLWdpdCBhL2dhcy9lY29mZi5jIGIvZ2FzL2Vjb2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzkzNzUuLjAwMDAwMDAKLS0tIGEvZ2FzL2Vjb2ZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzA4ICswLDAgQEAKLS8qIEVDT0ZGIGRlYnVnZ2luZyBzdXBwb3J0LgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSAgIFRoaXMgZmlsZSB3YXMgcHV0IHRvZ2V0aGVyIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4gIEEKLSAgIGdvb2QgZGVhbCBvZiBpdCBjb21lcyBkaXJlY3RseSBmcm9tIG1pcHMtdGZpbGUuYywgYnkgTWljaGFlbAotICAgTWVpc3NuZXIgPG1laXNzbmVyQG9zZi5vcmc+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi0vKiBUaGlzIGZpbGUgaXMgY29tcGlsZWQgY29uZGl0aW9uYWxseSBmb3IgdGhvc2UgdGFyZ2V0cyB3aGljaCB1c2UKLSAgIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAoZS5nLiwgTUlQUyBFQ09GRiwgTUlQUyBFTEYsIEFscGhhCi0gICBFQ09GRikuICAqLwotCi0jaWZkZWYgRUNPRkZfREVCVUdHSU5HCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImVjb2ZmLmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyogV2h5IGlzbid0IHRoaXMgaW4gY29mZi9zeW0uaD8gICovCi0jZGVmaW5lIFNUX1JGREVTQ0FQRSAweGZmZgotCi0vKiBUaGlzIGZpbGUgY29uc3RydWN0cyB0aGUgaW5mb3JtYXRpb24gdXNlZCBieSB0aGUgRUNPRkYgZGVidWdnaW5nCi0gICBmb3JtYXQuICBJdCBqdXN0IGJ1aWxkcyBhIGxhcmdlIGJsb2NrIG9mIGRhdGEuCi0KLSAgIFdlIHN1cHBvcnQgYm90aCBFQ09GRiBzdHlsZSBkZWJ1Z2dpbmcgYW5kIHN0YWJzIGRlYnVnZ2luZyAodGhlCi0gICBzdGFicyBzeW1ib2xzIGFyZSBlbmNhcHN1bGF0ZWQgaW4gRUNPRkYgc3ltYm9scykuICBUaGlzIHNob3VsZCBsZXQKLSAgIHVzIGhhbmRsZSBhbnl0aGluZyB0aGUgY29tcGlsZXIgbWlnaHQgdGhyb3cgYXQgdXMuICAqLwotCi0vKiBIZXJlIGlzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIE1JUFMgRUNPRkYgc3ltYm9sIHRhYmxlLCBieQotICAgTWljaGFlbCBNZWlzc25lci4gIFRoZSBNSVBTIHN5bWJvbCB0YWJsZSBoYXMgdGhlIGZvbGxvd2luZyBwaWVjZXM6Ci0KLQlTeW1ib2xpYyBIZWFkZXIKLQkgICAgfAotCSAgICArLS0JQXV4aWxpYXJ5IFN5bWJvbHMKLQkgICAgfAotCSAgICArLS0JRGVuc2UgbnVtYmVyIHRhYmxlCi0JICAgIHwKLQkgICAgKy0tCU9wdGltaXplciBTeW1ib2xzCi0JICAgIHwKLQkgICAgKy0tCUV4dGVybmFsIFN0cmluZ3MKLQkgICAgfAotCSAgICArLS0JRXh0ZXJuYWwgU3ltYm9scwotCSAgICB8Ci0JICAgICstLQlSZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3JzCi0JICAgIHwKLQkgICAgKy0tCUZpbGUgdGFibGUKLQkJICAgIHwKLQkJICAgICstLQlQcm9jZWR1cmUgdGFibGUKLQkJICAgIHwKLQkJICAgICstLQlMaW5lIG51bWJlciB0YWJsZQotCQkgICAgfAotCQkgICAgKy0tCUxvY2FsIFN0cmluZ3MKLQkJICAgIHwKLQkJICAgICstLQlMb2NhbCBTeW1ib2xzCi0KLSAgIFRoZSBzeW1ib2xpYyBoZWFkZXIgcG9pbnRzIHRvIGVhY2ggb2YgdGhlIG90aGVyIHRhYmxlcywgYW5kIGFsc28KLSAgIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgZW50cmllcy4gIEl0IGFsc28gY29udGFpbnMgYSBtYWdpYyBudW1iZXIKLSAgIGFuZCBNSVBTIGNvbXBpbGVyIHZlcnNpb24gbnVtYmVyLCBzdWNoIGFzIDIuMC4KLQotICAgVGhlIGF1eGlsaWFyeSB0YWJsZSBpcyBhIHNlcmllcyBvZiAzMiBiaXQgaW50ZWdlcnMsIHRoYXQgYXJlCi0gICByZWZlcmVuY2VkIGFzIG5lZWRlZCBmcm9tIHRoZSBsb2NhbCBzeW1ib2wgdGFibGUuICBVbmxpa2Ugc3RhbmRhcmQKLSAgIENPRkYsIHRoZSBhdXguICBpbmZvcm1hdGlvbiBkb2VzIG5vdCBmb2xsb3cgdGhlIHN5bWJvbCB0aGF0IHVzZXMKLSAgIGl0LCBidXQgcmF0aGVyIGlzIGEgc2VwYXJhdGUgdGFibGUuICBJbiB0aGVvcnksIHRoaXMgd291bGQgYWxsb3cKLSAgIHRoZSBNSVBTIGNvbXBpbGVycyB0byBjb2xsYXBzZSBkdXBsaWNhdGUgYXV4LiBlbnRyaWVzLCBidXQgSSd2ZSBub3QKLSAgIG5vdGljZWQgdGhpcyBoYXBwZW5pbmcgd2l0aCB0aGUgMS4zMSBjb21waWxlciBzdWl0ZS4gIFRoZSBkaWZmZXJlbnQKLSAgIHR5cGVzIG9mIGF1eC4gZW50cmllcyBhcmU6Ci0KLSAgICAxKQlkbkxvdzogTG93IGJvdW5kIG9uIGFycmF5IGRpbWVuc2lvbi4KLQotICAgIDIpCWRuSGlnaDogSGlnaCBib3VuZCBvbiBhcnJheSBkaW1lbnNpb24uCi0KLSAgICAzKQlpc3ltOiBJbmRleCB0byB0aGUgbG9jYWwgc3ltYm9sIHdoaWNoIGlzIHRoZSBzdGFydCBvZiB0aGUKLQlmdW5jdGlvbiBmb3IgdGhlIGVuZCBvZiBmdW5jdGlvbiBmaXJzdCBhdXguIGVudHJ5LgotCi0gICAgNCkJd2lkdGg6IFdpZHRoIG9mIHN0cnVjdHVyZXMgYW5kIGJpdGZpZWxkcy4KLQotICAgIDUpCWNvdW50OiBDb3VudCBvZiByYW5nZXMgZm9yIHZhcmlhbnQgcGFydC4KLQotICAgIDYpCXJuZHg6IEEgcmVsYXRpdmUgaW5kZXggaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgVGhlIHJlbGF0aXZlCi0JaW5kZXggZmllbGQgaGFzIHR3byBwYXJ0czogcmZkIHdoaWNoIGlzIGEgcG9pbnRlciBpbnRvIHRoZQotCXJlbGF0aXZlIGZpbGUgaW5kZXggdGFibGUgb3IgU1RfUkZERVNDQVBFIHdoaWNoIHNheXMgdGhlIG5leHQKLQlhdXguIGVudHJ5IGlzIHRoZSBmaWxlIG51bWJlciwgYW5kIGluZGV4OiB3aGljaCBpcyB0aGUgcG9pbnRlcgotCWludG8gdGhlIGxvY2FsIHN5bWJvbCB3aXRoaW4gYSBnaXZlbiBmaWxlIHRhYmxlLiAgVGhpcyBpcyBmb3IKLQl0aGluZ3MgbGlrZSByZWZlcmVuY2VzIHRvIHR5cGVzIGRlZmluZWQgaW4gYW5vdGhlciBmaWxlLgotCi0gICAgNykJVHlwZSBpbmZvcm1hdGlvbjogVGhpcyBpcyBsaWtlIHRoZSBDT0ZGIHR5cGUgYml0cywgZXhjZXB0IGl0Ci0JaXMgMzIgYml0cyBpbnN0ZWFkIG9mIDE2OyB0aGV5IHN0aWxsIGhhdmUgcm9vbSB0byBhZGQgbmV3Ci0JYmFzaWMgdHlwZXM7IGFuZCB0aGV5IGNhbiBoYW5kbGUgbW9yZSB0aGFuIDYgbGV2ZWxzIG9mIGFycmF5LAotCXBvaW50ZXIsIGZ1bmN0aW9uLCBldGMuICBFYWNoIHR5cGUgaW5mb3JtYXRpb24gZmllbGQgY29udGFpbnMKLQl0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBtZW1iZXJzOgotCi0JICAgIGEpCWZCaXRmaWVsZDogYSBiaXQgdGhhdCBzYXlzIHRoaXMgaXMgYSBiaXRmaWVsZCwgYW5kIHRoZQotCQlzaXplIGluIGJpdHMgZm9sbG93cyBhcyB0aGUgbmV4dCBhdXguIGVudHJ5LgotCi0JICAgIGIpCWNvbnRpbnVlZDogYSBiaXQgdGhhdCBzYXlzIHRoZSBuZXh0IGF1eC4gZW50cnkgaXMgYQotCQljb250aW51YXRpb24gb2YgdGhlIGN1cnJlbnQgdHlwZSBpbmZvcm1hdGlvbiAoaW4gY2FzZQotCQl0aGVyZSBhcmUgbW9yZSB0aGFuIDYgbGV2ZWxzIG9mIGFycmF5L3B0ci9mdW5jdGlvbikuCi0KLQkgICAgYykJYnQ6IGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgYmFzZSB0eXBlIGJlZm9yZSBhZGRpbmcKLQkJYXJyYXksIHBvaW50ZXIsIGZ1bmN0aW9uLCBldGMuIHF1YWxpZmllcnMuICBUaGUKLQkJY3VycmVudCBiYXNlIHR5cGVzIHRoYXQgSSBoYXZlIGRvY3VtZW50YXRpb24gZm9yIGFyZToKLQotCQkJYnROaWwJCS0tIHVuZGVmaW5lZAotCQkJYnRBZHIJCS0tIGFkZHJlc3MgLSBpbnRlZ2VyIHNhbWUgc2l6ZSBhcyBwdHIKLQkJCWJ0Q2hhcgkJLS0gY2hhcmFjdGVyCi0JCQlidFVDaGFyCQktLSB1bnNpZ25lZCBjaGFyYWN0ZXIKLQkJCWJ0U2hvcnQJCS0tIHNob3J0Ci0JCQlidFVTaG9ydAktLSB1bnNpZ25lZCBzaG9ydAotCQkJYnRJbnQJCS0tIGludAotCQkJYnRVSW50CQktLSB1bnNpZ25lZCBpbnQKLQkJCWJ0TG9uZwkJLS0gbG9uZwotCQkJYnRVTG9uZwkJLS0gdW5zaWduZWQgbG9uZwotCQkJYnRGbG9hdAkJLS0gZmxvYXQgKHJlYWwpCi0JCQlidERvdWJsZQktLSBEb3VibGUgKHJlYWwpCi0JCQlidFN0cnVjdAktLSBTdHJ1Y3R1cmUgKFJlY29yZCkKLQkJCWJ0VW5pb24JCS0tIFVuaW9uICh2YXJpYW50KQotCQkJYnRFbnVtCQktLSBFbnVtZXJhdGVkCi0JCQlidFR5cGVkZWYJLS0gZGVmaW5lZCB2aWEgYSB0eXBlZGVmIGlzeW1SZWYKLQkJCWJ0UmFuZ2UJCS0tIHN1YnJhbmdlIG9mIGludAotCQkJYnRTZXQJCS0tIHBhc2NhbCBzZXRzCi0JCQlidENvbXBsZXgJLS0gZm9ydHJhbiBjb21wbGV4Ci0JCQlidERDb21wbGV4CS0tIGZvcnRyYW4gZG91YmxlIGNvbXBsZXgKLQkJCWJ0SW5kaXJlY3QJLS0gZm9yd2FyZCBvciB1bm5hbWVkIHR5cGVkZWYKLQkJCWJ0Rml4ZWREZWMJLS0gRml4ZWQgRGVjaW1hbAotCQkJYnRGbG9hdERlYwktLSBGbG9hdCBEZWNpbWFsCi0JCQlidFN0cmluZwktLSBWYXJ5aW5nIExlbmd0aCBDaGFyYWN0ZXIgU3RyaW5nCi0JCQlidEJpdAkJLS0gQWxpZ25lZCBCaXQgU3RyaW5nCi0JCQlidFBpY3R1cmUJLS0gUGljdHVyZQotCQkJYnRWb2lkCQktLSBWb2lkIChNSVBTIGNjIHJldmlzaW9uID49IDIuMDApCi0KLQkgICAgZCkJdHEwIC0gdHE1OiB0eXBlIHF1YWxpZmllciBmaWVsZHMgYXMgbmVlZGVkLiAgVGhlCi0JCWN1cnJlbnQgdHlwZSBxdWFsaWZpZXIgZmllbGRzIEkgaGF2ZSBkb2N1bWVudGF0aW9uIGZvcgotCQlhcmU6Ci0KLQkJCXRxTmlsCQktLSBubyBtb3JlIHF1YWxpZmllcnMKLQkJCXRxUHRyCQktLSBwb2ludGVyCi0JCQl0cVByb2MJCS0tIHByb2NlZHVyZQotCQkJdHFBcnJheQkJLS0gYXJyYXkKLQkJCXRxRmFyCQktLSA4MDg2IGZhciBwb2ludGVycwotCQkJdHFWb2wJCS0tIHZvbGF0aWxlCi0KLQotICAgVGhlIGRlbnNlIG51bWJlciB0YWJsZSBpcyB1c2VkIGluIHRoZSBmcm9udCBlbmRzLCBhbmQgZGlzYXBwZWFycyBieQotICAgdGhlIHRpbWUgdGhlIC5vIGlzIGNyZWF0ZWQuCi0KLSAgIFdpdGggdGhlIDEuMzEgY29tcGlsZXIgc3VpdGUsIHRoZSBvcHRpbWl6YXRpb24gc3ltYm9scyBkb24ndCBzZWVtCi0gICB0byBiZSB1c2VkIGFzIGZhciBhcyBJIGNhbiB0ZWxsLgotCi0gICBUaGUgbGlua2VyIGlzIHRoZSBmaXJzdCBlbnRpdHkgdGhhdCBjcmVhdGVzIHRoZSByZWxhdGl2ZSBmaWxlCi0gICBkZXNjcmlwdG9yIHRhYmxlLCBhbmQgSSBiZWxpZXZlIGl0IGlzIHVzZWQgc28gdGhhdCB0aGUgaW5kaXZpZHVhbAotICAgZmlsZSB0YWJsZSBwb2ludGVycyBkb24ndCBoYXZlIHRvIGJlIHJld3JpdHRlbiB3aGVuIHRoZSBvYmplY3RzIGFyZQotICAgbWVyZ2VkIHRvZ2V0aGVyIGludG8gdGhlIHByb2dyYW0gZmlsZS4KLQotICAgVW5saWtlIENPRkYsIHRoZSBiYXNpYyBzeW1ib2wgJiBzdHJpbmcgdGFibGVzIGFyZSBzcGxpdCBpbnRvCi0gICBleHRlcm5hbCBhbmQgbG9jYWwgc3ltYm9scy9zdHJpbmdzLiAgVGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24KLSAgIG9ubHkgZ29lcyBvZmYgb2YgdGhlIGV4dGVybmFsIHN5bWJvbCB0YWJsZSwgYW5kIHRoZSBkZWJ1ZwotICAgaW5mb3JtYXRpb24gb25seSBnb2VzIG9mZiBvZiB0aGUgaW50ZXJuYWwgc3ltYm9sIHRhYmxlLiAgVGhlCi0gICBleHRlcm5hbCBzeW1ib2xzIGNhbiBoYXZlIGxpbmtzIHRvIGFuIGFwcHJvcHJpYXRlIGZpbGUgaW5kZXggYW5kCi0gICBzeW1ib2wgd2l0aGluIHRoZSBmaWxlIHRvIGdpdmUgaXQgdGhlIGFwcHJvcHJpYXRlIHR5cGUgaW5mb3JtYXRpb24uCi0gICBCZWNhdXNlIG9mIHRoaXMsIHRoZSBleHRlcm5hbCBzeW1ib2xzIGFyZSBhY3R1YWxseSBsYXJnZXIgdGhhbiB0aGUKLSAgIGludGVybmFsIHN5bWJvbHMgKHRvIGNvbnRhaW4gdGhlIGxpbmsgaW5mb3JtYXRpb24pLCBhbmQgY29udGFpbiB0aGUKLSAgIGxvY2FsIHN5bWJvbCBzdHJ1Y3R1cmUgYXMgYSBtZW1iZXIsIHRob3VnaCB0aGlzIG1lbWJlciBpcyBub3QgdGhlCi0gICBmaXJzdCBtZW1iZXIgb2YgdGhlIGV4dGVybmFsIHN5bWJvbCBzdHJ1Y3R1cmUgKCEpLiAgSSBzdXNwZWN0IHRoaXMKLSAgIHNwbGl0IGlzIHRvIG1ha2Ugc3RyaXAgZWFzaWVyIHRvIGRlYWwgd2l0aC4KLQotICAgRWFjaCBmaWxlIHRhYmxlIGhhcyBvZmZzZXRzIGZvciB3aGVyZSB0aGUgbGluZSBudW1iZXJzLCBsb2NhbAotICAgc3RyaW5ncywgbG9jYWwgc3ltYm9scywgYW5kIHByb2NlZHVyZSB0YWJsZSBzdGFydHMgZnJvbSB3aXRoaW4gdGhlCi0gICBnbG9iYWwgdGFibGVzLCBhbmQgdGhlIGluZGV4cyBhcmUgcmVzZXQgdG8gMCBmb3IgZWFjaCBvZiB0aG9zZQotICAgdGFibGVzIGZvciB0aGUgZmlsZS4KLQotICAgVGhlIHByb2NlZHVyZSB0YWJsZSBjb250YWlucyB0aGUgYmluYXJ5IGVxdWl2YWxlbnRzIG9mIHRoZSAuZW50Ci0gICAoc3RhcnQgb2YgdGhlIGZ1bmN0aW9uIGFkZHJlc3MpLCAuZnJhbWUgKHdoYXQgcmVnaXN0ZXIgaXMgdGhlCi0gICB2aXJ0dWFsIGZyYW1lIHBvaW50ZXIsIGNvbnN0YW50IG9mZnNldCBmcm9tIHRoZSByZWdpc3RlciB0byBvYnRhaW4KLSAgIHRoZSBWRlAsIGFuZCB3aGF0IHJlZ2lzdGVyIGhvbGRzIHRoZSByZXR1cm4gYWRkcmVzcyksIC5tYXNrLy5mbWFzawotICAgKGJpdG1hc2sgb2Ygc2F2ZWQgcmVnaXN0ZXJzLCBhbmQgd2hlcmUgdGhlIGZpcnN0IHJlZ2lzdGVyIGlzIHN0b3JlZAotICAgcmVsYXRpdmUgdG8gdGhlIFZGUCkgYXNzZW1ibGVyIGRpcmVjdGl2ZXMuICBJdCBhbHNvIGNvbnRhaW5zIHRoZQotICAgbG93IGFuZCBoaWdoIGJvdW5kcyBvZiB0aGUgbGluZSBudW1iZXJzIGlmIGRlYnVnZ2luZyBpcyB0dXJuZWQgb24uCi0KLSAgIFRoZSBsaW5lIG51bWJlciB0YWJsZSBpcyBhIGNvbXByZXNzZWQgZm9ybSBvZiB0aGUgbm9ybWFsIENPRkYgbGluZQotICAgdGFibGUuICBFYWNoIGxpbmUgbnVtYmVyIGVudHJ5IGlzIGVpdGhlciAxIG9yIDMgYnl0ZXMgbG9uZywgYW5kCi0gICBjb250YWlucyBhIHNpZ25lZCBkZWx0YSBmcm9tIHRoZSBwcmV2aW91cyBsaW5lLCBhbmQgYW4gdW5zaWduZWQKLSAgIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRoaXMgc3RhdGVtZW50IHRha2VzLgotCi0gICBUaGUgbG9jYWwgc3ltYm9sIHRhYmxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZmllbGRzOgotCi0gICAgMSkJaXNzOiBpbmRleCB0byB0aGUgbG9jYWwgc3RyaW5nIHRhYmxlIGdpdmluZyB0aGUgbmFtZSBvZiB0aGUKLQlzeW1ib2wuCi0KLSAgICAyKQl2YWx1ZTogdmFsdWUgb2YgdGhlIHN5bWJvbCAoYWRkcmVzcywgcmVnaXN0ZXIgbnVtYmVyLCBldGMuKS4KLQotICAgIDMpCXN0OiBzeW1ib2wgdHlwZS4gIFRoZSBjdXJyZW50IHN5bWJvbCB0eXBlcyBhcmU6Ci0KLQkgICAgc3ROaWwJICAtLSBOdXRoaW4nIHNwZWNpYWwKLQkgICAgc3RHbG9iYWwJICAtLSBleHRlcm5hbCBzeW1ib2wKLQkgICAgc3RTdGF0aWMJICAtLSBzdGF0aWMKLQkgICAgc3RQYXJhbQkgIC0tIHByb2NlZHVyZSBhcmd1bWVudAotCSAgICBzdExvY2FsCSAgLS0gbG9jYWwgdmFyaWFibGUKLQkgICAgc3RMYWJlbAkgIC0tIGxhYmVsCi0JICAgIHN0UHJvYwkgIC0tIEV4dGVybmFsIFByb2NlZHVyZQotCSAgICBzdEJsb2NrCSAgLS0gYmVnaW5uaW5nIG9mIGJsb2NrCi0JICAgIHN0RW5kCSAgLS0gZW5kIChvZiBhbnl0aGluZykKLQkgICAgc3RNZW1iZXIJICAtLSBtZW1iZXIgKG9mIGFueXRoaW5nKQotCSAgICBzdFR5cGVkZWYJICAtLSB0eXBlIGRlZmluaXRpb24KLQkgICAgc3RGaWxlCSAgLS0gZmlsZSBuYW1lCi0JICAgIHN0UmVnUmVsb2MJICAtLSByZWdpc3RlciByZWxvY2F0aW9uCi0JICAgIHN0Rm9yd2FyZAkgIC0tIGZvcndhcmRpbmcgYWRkcmVzcwotCSAgICBzdFN0YXRpY1Byb2MgIC0tIFN0YXRpYyBwcm9jZWR1cmUKLQkgICAgc3RDb25zdGFudAkgIC0tIGNvbnN0Ci0KLSAgICA0KQlzYzogc3RvcmFnZSBjbGFzcy4gIFRoZSBjdXJyZW50IHN0b3JhZ2UgY2xhc3NlcyBhcmU6Ci0KLQkgICAgc2NUZXh0CSAgLS0gdGV4dCBzeW1ib2wKLQkgICAgc2NEYXRhCSAgLS0gaW5pdGlhbGl6ZWQgZGF0YSBzeW1ib2wKLQkgICAgc2NCc3MJICAtLSB1bi1pbml0aWFsaXplZCBkYXRhIHN5bWJvbAotCSAgICBzY1JlZ2lzdGVyCSAgLS0gdmFsdWUgb2Ygc3ltYm9sIGlzIHJlZ2lzdGVyIG51bWJlcgotCSAgICBzY0FicwkgIC0tIHZhbHVlIG9mIHN5bWJvbCBpcyBhYnNvbHV0ZQotCSAgICBzY1VuZGVmaW5lZCAgIC0tIHdobyBrbm93cz8KLQkgICAgc2NDZGJMb2NhbAkgIC0tIHZhcmlhYmxlJ3MgdmFsdWUgaXMgSU4gc2UtPnZhLj8/Ci0JICAgIHNjQml0cwkgIC0tIHRoaXMgaXMgYSBiaXQgZmllbGQKLQkgICAgc2NDZGJTeXN0ZW0JICAtLSB2YWx1ZSBpcyBJTiBkZWJ1Z2dlcidzIGFkZHJlc3Mgc3BhY2UKLQkgICAgc2NSZWdJbWFnZQkgIC0tIHJlZ2lzdGVyIHZhbHVlIHNhdmVkIG9uIHN0YWNrCi0JICAgIHNjSW5mbwkgIC0tIHN5bWJvbCBjb250YWlucyBkZWJ1Z2dlciBpbmZvcm1hdGlvbgotCSAgICBzY1VzZXJTdHJ1Y3QgIC0tIGFkZHIgaW4gc3RydWN0IHVzZXIgZm9yIGN1cnJlbnQgcHJvY2VzcwotCSAgICBzY1NEYXRhCSAgLS0gbG9hZCB0aW1lIG9ubHkgc21hbGwgZGF0YQotCSAgICBzY1NCc3MJICAtLSBsb2FkIHRpbWUgb25seSBzbWFsbCBjb21tb24KLQkgICAgc2NSRGF0YQkgIC0tIGxvYWQgdGltZSBvbmx5IHJlYWQgb25seSBkYXRhCi0JICAgIHNjVmFyCSAgLS0gVmFyIHBhcmFtZXRlciAoZm9ydHJhbnBhc2NhbCkKLQkgICAgc2NDb21tb24JICAtLSBjb21tb24gdmFyaWFibGUKLQkgICAgc2NTQ29tbW9uCSAgLS0gc21hbGwgY29tbW9uCi0JICAgIHNjVmFyUmVnaXN0ZXIgLS0gVmFyIHBhcmFtZXRlciBpbiBhIHJlZ2lzdGVyCi0JICAgIHNjVmFyaWFudAkgIC0tIFZhcmlhbnQgcmVjb3JkCi0JICAgIHNjU1VuZGVmaW5lZCAgLS0gc21hbGwgdW5kZWZpbmVkKGV4dGVybmFsKSBkYXRhCi0JICAgIHNjSW5pdAkgIC0tIC5pbml0IHNlY3Rpb24gc3ltYm9sCi0KLSAgICA1KQlpbmRleDogcG9pbnRlciB0byBhIGxvY2FsIHN5bWJvbCBvciBhdXguIGVudHJ5LgotCi0KLQotICAgRm9yIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbToKLQotCSNpbmNsdWRlIDxzdGRpby5oPgotCi0JbWFpbigpewotCQlwcmludGYoIkhlbGxvIFdvcmxkIVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotICAgTWlwcy10ZHVtcCBwcm9kdWNlcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgotCi0gICBHbG9iYWwgZmlsZSBoZWFkZXI6Ci0gICAgICAgbWFnaWMgbnVtYmVyICAgICAgICAgICAgIDB4MTYyCi0gICAgICAgIyBzZWN0aW9ucyAgICAgICAgICAgICAgIDIKLSAgICAgICB0aW1lc3RhbXAgICAgICAgICAgICAgICAgNjQ1MzExNzk5LCBXZWQgSnVuIDEzIDE3OjE2OjM5IDE5OTAKLSAgICAgICBzeW1ib2xpYyBoZWFkZXIgb2Zmc2V0ICAgMjg0Ci0gICAgICAgc3ltYm9saWMgaGVhZGVyIHNpemUgICAgIDk2Ci0gICAgICAgb3B0aW9uYWwgaGVhZGVyICAgICAgICAgIDU2Ci0gICAgICAgZmxhZ3MgICAgICAgICAgICAgICAgICAgIDB4MAotCi0gICBTeW1ib2xpYyBoZWFkZXIsIG1hZ2ljIG51bWJlciA9IDB4NzAwOSwgdnN0YW1wID0gMS4zMToKLQotICAgICAgIEluZm8gICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgTnVtYmVyICAgICAgIEJ5dGVzCi0gICAgICAgPT09PSAgICAgICAgICAgICAgICAgICAgICA9PT09PT0gICAgICA9PT09PT0gICAgICA9PT09PQotCi0gICAgICAgTGluZSBudW1iZXJzICAgICAgICAgICAgICAgICAzODAgICAgICAgICAgIDQgICAgICAgICAgIDQgWzEzXQotICAgICAgIERlbnNlIG51bWJlcnMgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0gICAgICAgUHJvY2VkdXJlcyBUYWJsZXMgICAgICAgICAgICAzODQgICAgICAgICAgIDEgICAgICAgICAgNTIKLSAgICAgICBMb2NhbCBTeW1ib2xzICAgICAgICAgICAgICAgIDQzNiAgICAgICAgICAxNiAgICAgICAgIDE5MgotICAgICAgIE9wdGltaXphdGlvbiBTeW1ib2xzICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0gICAgICAgQXV4aWxpYXJ5IFN5bWJvbHMgICAgICAgICAgICA2MjggICAgICAgICAgMzkgICAgICAgICAxNTYKLSAgICAgICBMb2NhbCBTdHJpbmdzICAgICAgICAgICAgICAgIDc4NCAgICAgICAgICA4MCAgICAgICAgICA4MAotICAgICAgIEV4dGVybmFsIFN0cmluZ3MgICAgICAgICAgICAgODY0ICAgICAgICAgMTQ0ICAgICAgICAgMTQ0Ci0gICAgICAgRmlsZSBUYWJsZXMgICAgICAgICAgICAgICAgIDEwMDggICAgICAgICAgIDIgICAgICAgICAxNDQKLSAgICAgICBSZWxhdGl2ZSBGaWxlcyAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMAotICAgICAgIEV4dGVybmFsIFN5bWJvbHMgICAgICAgICAgICAxMTUyICAgICAgICAgIDIwICAgICAgICAgMzIwCi0KLSAgIEZpbGUgIzAsICJoZWxsbzIuYyIKLQotICAgICAgIE5hbWUgaW5kZXggID0gMSAgICAgICAgICBSZWFkaW4gICAgICA9IE5vCi0gICAgICAgTWVyZ2UgICAgICAgPSBObyAgICAgICAgIEVuZGlhbiAgICAgID0gTElUVExFCi0gICAgICAgRGVidWcgbGV2ZWwgPSBHMiAgICAgICAgIExhbmd1YWdlICAgID0gQwotICAgICAgIEFkciAgICAgICAgID0gMHgwMDAwMDAwMAotCi0gICAgICAgSW5mbyAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQgICAgICBOdW1iZXIgICAgICAgIFNpemUgICAgICBPZmZzZXQKLSAgICAgICA9PT09ICAgICAgICAgICAgICAgICAgICAgICA9PT09PSAgICAgID09PT09PSAgICAgICAgPT09PSAgICAgID09PT09PQotICAgICAgIExvY2FsIHN0cmluZ3MgICAgICAgICAgICAgICAgICAwICAgICAgICAgIDE1ICAgICAgICAgIDE1ICAgICAgICAgNzg0Ci0gICAgICAgTG9jYWwgc3ltYm9scyAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDYgICAgICAgICAgNzIgICAgICAgICA0MzYKLSAgICAgICBMaW5lIG51bWJlcnMgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAxMyAgICAgICAgICAxMyAgICAgICAgIDM4MAotICAgICAgIE9wdGltaXphdGlvbiBzeW1ib2xzICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0gICAgICAgUHJvY2VkdXJlcyAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDEgICAgICAgICAgNTIgICAgICAgICAzODQKLSAgICAgICBBdXhpbGlhcnkgc3ltYm9scyAgICAgICAgICAgICAgMCAgICAgICAgICAxNCAgICAgICAgICA1NiAgICAgICAgIDYyOAotICAgICAgIFJlbGF0aXZlIEZpbGVzICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0KLSAgICBUaGVyZSBhcmUgNiBsb2NhbCBzeW1ib2xzLCBzdGFydGluZyBhdCA0MzYKLQotCVN5bWJvbCMgMDogImhlbGxvMi5jIgotCSAgICBFbmQrMSBzeW1ib2wgID0gNgotCSAgICBTdHJpbmcgaW5kZXggID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gVGV4dCAgICAgICAgSW5kZXggID0gNgotCSAgICBTeW1ib2wgdHlwZSAgID0gRmlsZSAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxOiAibWFpbiIKLQkgICAgRW5kKzEgc3ltYm9sICA9IDUKLQkgICAgVHlwZSAgICAgICAgICA9IGludAotCSAgICBTdHJpbmcgaW5kZXggID0gMTAKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDEyCi0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDI6ICIiCi0JICAgIEVuZCsxIHN5bWJvbCAgPSA0Ci0JICAgIFN0cmluZyBpbmRleCAgPSAwCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSA0Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBCbG9jayAgICAgICBWYWx1ZSAgPSA4Ci0KLQlTeW1ib2wjIDM6ICIiCi0JICAgIEZpcnN0IHN5bWJvbCAgPSAyCi0JICAgIFN0cmluZyBpbmRleCAgPSAwCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAyCi0JICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSAyOAotCi0JU3ltYm9sIyA0OiAibWFpbiIKLQkgICAgRmlyc3Qgc3ltYm9sICA9IDEKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEwCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAxCi0JICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSA1MgotCi0JU3ltYm9sIyA1OiAiaGVsbG8yLmMiCi0JICAgIEZpcnN0IHN5bWJvbCAgPSAwCi0JICAgIFN0cmluZyBpbmRleCAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAwCi0JICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSAwCi0KLSAgICBUaGVyZSBhcmUgMTQgYXV4aWxpYXJ5IHRhYmxlIGVudHJpZXMsIHN0YXJ0aW5nIGF0IDYyOC4KLQotCSogIzAgICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMxICAgICAgICAgICAgICAyNCwgWyAgMjQvICAgICAgMF0sIFsgNiAwOjAgMDowOjA6MDowOjBdCi0JKiAjMiAgICAgICAgICAgICAgIDgsIFsgICA4LyAgICAgIDBdLCBbIDIgMDowIDA6MDowOjA6MDowXQotCSogIzMgICAgICAgICAgICAgIDE2LCBbICAxNi8gICAgICAwXSwgWyA0IDA6MCAwOjA6MDowOjA6MF0KLQkqICM0ICAgICAgICAgICAgICAyNCwgWyAgMjQvICAgICAgMF0sIFsgNiAwOjAgMDowOjA6MDowOjBdCi0JKiAjNSAgICAgICAgICAgICAgMzIsIFsgIDMyLyAgICAgIDBdLCBbIDggMDowIDA6MDowOjA6MDowXQotCSogIzYgICAgICAgICAgICAgIDQwLCBbICA0MC8gICAgICAwXSwgWzEwIDA6MCAwOjA6MDowOjA6MF0KLQkqICM3ICAgICAgICAgICAgICA0NCwgWyAgNDQvICAgICAgMF0sIFsxMSAwOjAgMDowOjA6MDowOjBdCi0JKiAjOCAgICAgICAgICAgICAgMTIsIFsgIDEyLyAgICAgIDBdLCBbIDMgMDowIDA6MDowOjA6MDowXQotCSogIzkgICAgICAgICAgICAgIDIwLCBbICAyMC8gICAgICAwXSwgWyA1IDA6MCAwOjA6MDowOjA6MF0KLQkqICMxMCAgICAgICAgICAgICAyOCwgWyAgMjgvICAgICAgMF0sIFsgNyAwOjAgMDowOjA6MDowOjBdCi0JKiAjMTEgICAgICAgICAgICAgMzYsIFsgIDM2LyAgICAgIDBdLCBbIDkgMDowIDA6MDowOjA6MDowXQotCSAgIzEyICAgICAgICAgICAgICA1LCBbICAgNS8gICAgICAwXSwgWyAxIDE6MCAwOjA6MDowOjA6MF0KLQkgICMxMyAgICAgICAgICAgICAyNCwgWyAgMjQvICAgICAgMF0sIFsgNiAwOjAgMDowOjA6MDowOjBdCi0KLSAgICBUaGVyZSBhcmUgMSBwcm9jZWR1cmUgZGVzY3JpcHRvciBlbnRyaWVzLCBzdGFydGluZyBhdCAwLgotCi0JUHJvY2VkdXJlIGRlc2NyaXB0b3IgMDoKLQkgICAgTmFtZSBpbmRleCAgID0gMTAgICAgICAgICAgTmFtZSAgICAgICAgICA9ICJtYWluIgotCSAgICAubWFzayAweDgwMDAwMDAwLC00ICAgICAgICAuZm1hc2sgMHgwMDAwMDAwMCwwCi0JICAgIC5mcmFtZSAkMjksMjQsJDMxCi0JICAgIE9wdC4gc3RhcnQgICA9IC0xICAgICAgICAgIFN5bWJvbHMgc3RhcnQgPSAxCi0JICAgIEZpcnN0IGxpbmUgIyA9IDMgICAgICAgICAgIExhc3QgbGluZSAjICAgPSA2Ci0JICAgIExpbmUgT2Zmc2V0ICA9IDAgICAgICAgICAgIEFkZHJlc3MgICAgICAgPSAweDAwMDAwMDAwCi0KLQlUaGVyZSBhcmUgNCBieXRlcyBob2xkaW5nIGxpbmUgbnVtYmVycywgc3RhcnRpbmcgYXQgMzgwLgotCSAgICBMaW5lICAgICAgICAgICAzLCAgIGRlbHRhICAgICAwLCAgIGNvdW50ICAyCi0JICAgIExpbmUgICAgICAgICAgIDQsICAgZGVsdGEgICAgIDEsICAgY291bnQgIDMKLQkgICAgTGluZSAgICAgICAgICAgNSwgICBkZWx0YSAgICAgMSwgICBjb3VudCAgMgotCSAgICBMaW5lICAgICAgICAgICA2LCAgIGRlbHRhICAgICAxLCAgIGNvdW50ICA2Ci0KLSAgIEZpbGUgIzEsICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIKLQotICAgIE5hbWUgaW5kZXggID0gMSAgICAgICAgICBSZWFkaW4gICAgICA9IE5vCi0gICAgTWVyZ2UgICAgICAgPSBZZXMgICAgICAgIEVuZGlhbiAgICAgID0gTElUVExFCi0gICAgRGVidWcgbGV2ZWwgPSBHMiAgICAgICAgIExhbmd1YWdlICAgID0gQwotICAgIEFkciAgICAgICAgID0gMHgwMDAwMDAwMAotCi0gICAgSW5mbyAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQgICAgICBOdW1iZXIgICAgICAgIFNpemUgICAgICBPZmZzZXQKLSAgICA9PT09ICAgICAgICAgICAgICAgICAgICAgICA9PT09PSAgICAgID09PT09PSAgICAgICAgPT09PSAgICAgID09PT09PQotICAgIExvY2FsIHN0cmluZ3MgICAgICAgICAgICAgICAgIDE1ICAgICAgICAgIDY1ICAgICAgICAgIDY1ICAgICAgICAgNzk5Ci0gICAgTG9jYWwgc3ltYm9scyAgICAgICAgICAgICAgICAgIDYgICAgICAgICAgMTAgICAgICAgICAxMjAgICAgICAgICA1MDgKLSAgICBMaW5lIG51bWJlcnMgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgIDM4MAotICAgIE9wdGltaXphdGlvbiBzeW1ib2xzICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0gICAgUHJvY2VkdXJlcyAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICA0MzYKLSAgICBBdXhpbGlhcnkgc3ltYm9scyAgICAgICAgICAgICAxNCAgICAgICAgICAyNSAgICAgICAgIDEwMCAgICAgICAgIDY4NAotICAgIFJlbGF0aXZlIEZpbGVzICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0KLSAgICBUaGVyZSBhcmUgMTAgbG9jYWwgc3ltYm9scywgc3RhcnRpbmcgYXQgNDQyCi0KLQlTeW1ib2wjIDA6ICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIKLQkgICAgRW5kKzEgc3ltYm9sICA9IDEwCi0JICAgIFN0cmluZyBpbmRleCAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAxMAotCSAgICBTeW1ib2wgdHlwZSAgID0gRmlsZSAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxOiAiX2lvYnVmIgotCSAgICBFbmQrMSBzeW1ib2wgID0gOQotCSAgICBTdHJpbmcgaW5kZXggID0gMjIKLQkgICAgU3RvcmFnZSBjbGFzcyA9IEluZm8gICAgICAgIEluZGV4ICA9IDkKLQkgICAgU3ltYm9sIHR5cGUgICA9IEJsb2NrICAgICAgIFZhbHVlICA9IDIwCi0KLQlTeW1ib2wjIDI6ICJfY250IgotCSAgICBUeXBlICAgICAgICAgID0gaW50Ci0JICAgIFN0cmluZyBpbmRleCAgPSAyOQotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gNAotCSAgICBTeW1ib2wgdHlwZSAgID0gTWVtYmVyICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAzOiAiX3B0ciIKLQkgICAgVHlwZSAgICAgICAgICA9IHB0ciB0byBjaGFyCi0JICAgIFN0cmluZyBpbmRleCAgPSAzNAotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gMTUKLQkgICAgU3ltYm9sIHR5cGUgICA9IE1lbWJlciAgICAgIFZhbHVlICA9IDMyCi0KLQlTeW1ib2wjIDQ6ICJfYmFzZSIKLQkgICAgVHlwZSAgICAgICAgICA9IHB0ciB0byBjaGFyCi0JICAgIFN0cmluZyBpbmRleCAgPSAzOQotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gMTYKLQkgICAgU3ltYm9sIHR5cGUgICA9IE1lbWJlciAgICAgIFZhbHVlICA9IDY0Ci0KLQlTeW1ib2wjIDU6ICJfYnVmc2l6IgotCSAgICBUeXBlICAgICAgICAgID0gaW50Ci0JICAgIFN0cmluZyBpbmRleCAgPSA0NQotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gNAotCSAgICBTeW1ib2wgdHlwZSAgID0gTWVtYmVyICAgICAgVmFsdWUgID0gOTYKLQotCVN5bWJvbCMgNjogIl9mbGFnIgotCSAgICBUeXBlICAgICAgICAgID0gc2hvcnQKLQkgICAgU3RyaW5nIGluZGV4ICA9IDUzCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBJbmZvICAgICAgICBJbmRleCAgPSAzCi0JICAgIFN5bWJvbCB0eXBlICAgPSBNZW1iZXIgICAgICBWYWx1ZSAgPSAxMjgKLQotCVN5bWJvbCMgNzogIl9maWxlIgotCSAgICBUeXBlICAgICAgICAgID0gY2hhcgotCSAgICBTdHJpbmcgaW5kZXggID0gNTkKLQkgICAgU3RvcmFnZSBjbGFzcyA9IEluZm8gICAgICAgIEluZGV4ICA9IDIKLQkgICAgU3ltYm9sIHR5cGUgICA9IE1lbWJlciAgICAgIFZhbHVlICA9IDE0NAotCi0JU3ltYm9sIyA4OiAiIgotCSAgICBGaXJzdCBzeW1ib2wgID0gMQotCSAgICBTdHJpbmcgaW5kZXggID0gMAotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gMQotCSAgICBTeW1ib2wgdHlwZSAgID0gRW5kICAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyA5OiAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiCi0JICAgIEZpcnN0IHN5bWJvbCAgPSAwCi0JICAgIFN0cmluZyBpbmRleCAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAwCi0JICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSAwCi0KLSAgICBUaGVyZSBhcmUgMjUgYXV4aWxpYXJ5IHRhYmxlIGVudHJpZXMsIHN0YXJ0aW5nIGF0IDY0Mi4KLQotCSogIzE0ICAgICAgICAgICAgIC0xLCBbNDA5NS8xMDQ4NTc1XSwgWzYzIDE6MSBmOmY6ZjpmOmY6Zl0KLQkgICMxNSAgICAgICAgICA2NTU0NCwgWyAgIDgvICAgICAxNl0sIFsgMiAwOjAgMTowOjA6MDowOjBdCi0JICAjMTYgICAgICAgICAgNjU1NDQsIFsgICA4LyAgICAgMTZdLCBbIDIgMDowIDE6MDowOjA6MDowXQotCSogIzE3ICAgICAgICAgMTk2NjU2LCBbICA0OC8gICAgIDQ4XSwgWzEyIDA6MCAzOjA6MDowOjA6MF0KLQkqICMxOCAgICAgICAgICAgODE5MSwgWzQwOTUvICAgICAgMV0sIFs2MyAxOjEgMDowOjA6MDpmOjFdCi0JKiAjMTkgICAgICAgICAgICAgIDEsIFsgICAxLyAgICAgIDBdLCBbIDAgMTowIDA6MDowOjA6MDowXQotCSogIzIwICAgICAgICAgIDIwNDc5LCBbNDA5NS8gICAgICA0XSwgWzYzIDE6MSAwOjA6MDowOmY6NF0KLQkqICMyMSAgICAgICAgICAgICAgMSwgWyAgIDEvICAgICAgMF0sIFsgMCAxOjAgMDowOjA6MDowOjBdCi0JKiAjMjIgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzIzICAgICAgICAgICAgICAyLCBbICAgMi8gICAgICAwXSwgWyAwIDA6MSAwOjA6MDowOjA6MF0KLQkqICMyNCAgICAgICAgICAgIDE2MCwgWyAxNjAvICAgICAgMF0sIFs0MCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMjUgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzI2ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMyNyAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMjggICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzI5ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzMCAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzEgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzMyICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzMyAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzQgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzM1ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzNiAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzcgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzM4ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQotICAgIFRoZXJlIGFyZSAwIHByb2NlZHVyZSBkZXNjcmlwdG9yIGVudHJpZXMsIHN0YXJ0aW5nIGF0IDEuCi0KLSAgIFRoZXJlIGFyZSAyMCBleHRlcm5hbCBzeW1ib2xzLCBzdGFydGluZyBhdCAxMTUyCi0KLQlTeW1ib2wjIDA6ICJfaW9iIgotCSAgICBUeXBlICAgICAgICAgID0gYXJyYXkgWzMgezE2MH1dIG9mIHN0cnVjdCBfaW9idWYgeyBpZmQgPSAxLCBpbmRleCA9IDEgfQotCSAgICBTdHJpbmcgaW5kZXggID0gMCAgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTcKLQkgICAgU3ltYm9sIHR5cGUgICA9IEdsb2JhbCAgICAgIFZhbHVlICA9IDYwCi0KLQlTeW1ib2wjIDE6ICJmb3BlbiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDUgICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMjogImZkb3BlbiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDExICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMzogImZyZW9wZW4iCi0JICAgIFN0cmluZyBpbmRleCAgPSAxOCAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDQ6ICJwb3BlbiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDI2ICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgNTogInRtcGZpbGUiCi0JICAgIFN0cmluZyBpbmRleCAgPSAzMiAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDY6ICJmdGVsbCIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDQwICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgNzogInJld2luZCIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDQ2ICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgODogInNldGJ1ZiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDUzICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgOTogInNldGJ1ZmZlciIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDYwICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTA6ICJzZXRsaW5lYnVmIgotCSAgICBTdHJpbmcgaW5kZXggID0gNzAgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxMTogImZnZXRzIgotCSAgICBTdHJpbmcgaW5kZXggID0gODEgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxMjogImdldHMiCi0JICAgIFN0cmluZyBpbmRleCAgPSA4NyAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDEzOiAiY3Rlcm1pZCIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDkyICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTQ6ICJjdXNlcmlkIgotCSAgICBTdHJpbmcgaW5kZXggID0gMTAwICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxNTogInRlbXBuYW0iCi0JICAgIFN0cmluZyBpbmRleCAgPSAxMDggICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDE2OiAidG1wbmFtIgotCSAgICBTdHJpbmcgaW5kZXggID0gMTE2ICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxNzogInNwcmludGYiCi0JICAgIFN0cmluZyBpbmRleCAgPSAxMjMgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDE4OiAibWFpbiIKLQkgICAgVHlwZSAgICAgICAgICA9IGludAotCSAgICBTdHJpbmcgaW5kZXggID0gMTMxICAgICAgICAgSWZkICAgID0gMAotCSAgICBTdG9yYWdlIGNsYXNzID0gVGV4dCAgICAgICAgSW5kZXggID0gMQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxOTogInByaW50ZiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEzNiAgICAgICAgIElmZCAgICA9IDAKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFVuZGVmaW5lZCAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotICAgVGhlIGZvbGxvd2luZyBhdXhpbGlhcnkgdGFibGUgZW50cmllcyB3ZXJlIHVudXNlZDoKLQotICAgICMwICAgICAgICAgICAgICAgMCAgMHgwMDAwMDAwMCAgdm9pZAotICAgICMyICAgICAgICAgICAgICAgOCAgMHgwMDAwMDAwOCAgY2hhcgotICAgICMzICAgICAgICAgICAgICAxNiAgMHgwMDAwMDAxMCAgc2hvcnQKLSAgICAjNCAgICAgICAgICAgICAgMjQgIDB4MDAwMDAwMTggIGludAotICAgICM1ICAgICAgICAgICAgICAzMiAgMHgwMDAwMDAyMCAgbG9uZwotICAgICM2ICAgICAgICAgICAgICA0MCAgMHgwMDAwMDAyOCAgZmxvYXQKLSAgICAjNyAgICAgICAgICAgICAgNDQgIDB4MDAwMDAwMmMgIGRvdWJsZQotICAgICM4ICAgICAgICAgICAgICAxMiAgMHgwMDAwMDAwYyAgdW5zaWduZWQgY2hhcgotICAgICM5ICAgICAgICAgICAgICAyMCAgMHgwMDAwMDAxNCAgdW5zaWduZWQgc2hvcnQKLSAgICAjMTAgICAgICAgICAgICAgMjggIDB4MDAwMDAwMWMgIHVuc2lnbmVkIGludAotICAgICMxMSAgICAgICAgICAgICAzNiAgMHgwMDAwMDAyNCAgdW5zaWduZWQgbG9uZwotICAgICMxNCAgICAgICAgICAgICAgMCAgMHgwMDAwMDAwMCAgdm9pZAotICAgICMxNSAgICAgICAgICAgICAyNCAgMHgwMDAwMDAxOCAgaW50Ci0gICAgIzE5ICAgICAgICAgICAgIDMyICAweDAwMDAwMDIwICBsb25nCi0gICAgIzIwICAgICAgICAgICAgIDQwICAweDAwMDAwMDI4ICBmbG9hdAotICAgICMyMSAgICAgICAgICAgICA0NCAgMHgwMDAwMDAyYyAgZG91YmxlCi0gICAgIzIyICAgICAgICAgICAgIDEyICAweDAwMDAwMDBjICB1bnNpZ25lZCBjaGFyCi0gICAgIzIzICAgICAgICAgICAgIDIwICAweDAwMDAwMDE0ICB1bnNpZ25lZCBzaG9ydAotICAgICMyNCAgICAgICAgICAgICAyOCAgMHgwMDAwMDAxYyAgdW5zaWduZWQgaW50Ci0gICAgIzI1ICAgICAgICAgICAgIDM2ICAweDAwMDAwMDI0ICB1bnNpZ25lZCBsb25nCi0gICAgIzI2ICAgICAgICAgICAgIDQ4ICAweDAwMDAwMDMwICBzdHJ1Y3Qgbm8gbmFtZSB7IGlmZCA9IC0xLCBpbmRleCA9IDEwNDg1NzUgfQotKi8KLQwKLS8qIFJlZGVmaW5pdGlvbiBvZiBvZiBzdG9yYWdlIGNsYXNzZXMgYXMgYW4gZW51bWVyYXRpb24gZm9yIGJldHRlcgotICAgZGVidWdnaW5nLiAgKi8KLQotdHlwZWRlZiBlbnVtIHNjIHsKLSAgc2NfTmlsCSA9IHNjTmlsLAkgIC8qIG5vIHN0b3JhZ2UgY2xhc3MgKi8KLSAgc2NfVGV4dAkgPSBzY1RleHQsCSAgLyogdGV4dCBzeW1ib2wgKi8KLSAgc2NfRGF0YQkgPSBzY0RhdGEsCSAgLyogaW5pdGlhbGl6ZWQgZGF0YSBzeW1ib2wgKi8KLSAgc2NfQnNzCSA9IHNjQnNzLAkgIC8qIHVuLWluaXRpYWxpemVkIGRhdGEgc3ltYm9sICovCi0gIHNjX1JlZ2lzdGVyCSA9IHNjUmVnaXN0ZXIsCSAgLyogdmFsdWUgb2Ygc3ltYm9sIGlzIHJlZ2lzdGVyIG51bWJlciAqLwotICBzY19BYnMJID0gc2NBYnMsCSAgLyogdmFsdWUgb2Ygc3ltYm9sIGlzIGFic29sdXRlICovCi0gIHNjX1VuZGVmaW5lZAkgPSBzY1VuZGVmaW5lZCwJICAvKiB3aG8ga25vd3M/ICovCi0gIHNjX0NkYkxvY2FsCSA9IHNjQ2RiTG9jYWwsCSAgLyogdmFyaWFibGUncyB2YWx1ZSBpcyBJTiBzZS0+dmEuPz8gKi8KLSAgc2NfQml0cwkgPSBzY0JpdHMsCSAgLyogdGhpcyBpcyBhIGJpdCBmaWVsZCAqLwotICBzY19DZGJTeXN0ZW0JID0gc2NDZGJTeXN0ZW0sCSAgLyogdmFsdWUgaXMgSU4gQ0RCJ3MgYWRkcmVzcyBzcGFjZSAqLwotICBzY19SZWdJbWFnZQkgPSBzY1JlZ0ltYWdlLAkgIC8qIHJlZ2lzdGVyIHZhbHVlIHNhdmVkIG9uIHN0YWNrICovCi0gIHNjX0luZm8JID0gc2NJbmZvLAkgIC8qIHN5bWJvbCBjb250YWlucyBkZWJ1Z2dlciBpbmZvcm1hdGlvbiAqLwotICBzY19Vc2VyU3RydWN0CSA9IHNjVXNlclN0cnVjdCwgIC8qIGFkZHIgaW4gc3RydWN0IHVzZXIgZm9yIGN1cnJlbnQgcHJvY2VzcyAqLwotICBzY19TRGF0YQkgPSBzY1NEYXRhLAkgIC8qIGxvYWQgdGltZSBvbmx5IHNtYWxsIGRhdGEgKi8KLSAgc2NfU0JzcwkgPSBzY1NCc3MsCSAgLyogbG9hZCB0aW1lIG9ubHkgc21hbGwgY29tbW9uICovCi0gIHNjX1JEYXRhCSA9IHNjUkRhdGEsCSAgLyogbG9hZCB0aW1lIG9ubHkgcmVhZCBvbmx5IGRhdGEgKi8KLSAgc2NfVmFyCSA9IHNjVmFyLAkgIC8qIFZhciBwYXJhbWV0ZXIgKGZvcnRyYW4scGFzY2FsKSAqLwotICBzY19Db21tb24JID0gc2NDb21tb24sCSAgLyogY29tbW9uIHZhcmlhYmxlICovCi0gIHNjX1NDb21tb24JID0gc2NTQ29tbW9uLAkgIC8qIHNtYWxsIGNvbW1vbiAqLwotICBzY19WYXJSZWdpc3RlciA9IHNjVmFyUmVnaXN0ZXIsIC8qIFZhciBwYXJhbWV0ZXIgaW4gYSByZWdpc3RlciAqLwotICBzY19WYXJpYW50CSA9IHNjVmFyaWFudCwJICAvKiBWYXJpYW50IHJlY29yZCAqLwotICBzY19TVW5kZWZpbmVkCSA9IHNjU1VuZGVmaW5lZCwgIC8qIHNtYWxsIHVuZGVmaW5lZChleHRlcm5hbCkgZGF0YSAqLwotICBzY19Jbml0CSA9IHNjSW5pdCwJICAvKiAuaW5pdCBzZWN0aW9uIHN5bWJvbCAqLwotICBzY19NYXgJID0gc2NNYXgJICAvKiBNYXggc3RvcmFnZSBjbGFzcysxICovCi19IHNjX3Q7Ci0KLS8qIFJlZGVmaW5pdGlvbiBvZiBzeW1ib2wgdHlwZS4gICovCi0KLXR5cGVkZWYgZW51bSBzdCB7Ci0gIHN0X05pbAk9IHN0TmlsLAkvKiBOdXRoaW4nIHNwZWNpYWwgKi8KLSAgc3RfR2xvYmFsCT0gc3RHbG9iYWwsCS8qIGV4dGVybmFsIHN5bWJvbCAqLwotICBzdF9TdGF0aWMJPSBzdFN0YXRpYywJLyogc3RhdGljICovCi0gIHN0X1BhcmFtCT0gc3RQYXJhbSwJLyogcHJvY2VkdXJlIGFyZ3VtZW50ICovCi0gIHN0X0xvY2FsCT0gc3RMb2NhbCwJLyogbG9jYWwgdmFyaWFibGUgKi8KLSAgc3RfTGFiZWwJPSBzdExhYmVsLAkvKiBsYWJlbCAqLwotICBzdF9Qcm9jCT0gc3RQcm9jLAkvKiAgICAgIiAgICAgICIJIFByb2NlZHVyZSAqLwotICBzdF9CbG9jawk9IHN0QmxvY2ssCS8qIGJlZ2lubmluZyBvZiBibG9jayAqLwotICBzdF9FbmQJPSBzdEVuZCwJLyogZW5kIChvZiBhbnl0aGluZykgKi8KLSAgc3RfTWVtYmVyCT0gc3RNZW1iZXIsCS8qIG1lbWJlciAob2YgYW55dGhpbmcJLSBzdHJ1Y3QvdW5pb24vZW51bSAqLwotICBzdF9UeXBlZGVmCT0gc3RUeXBlZGVmLAkvKiB0eXBlIGRlZmluaXRpb24gKi8KLSAgc3RfRmlsZQk9IHN0RmlsZSwJLyogZmlsZSBuYW1lICovCi0gIHN0X1JlZ1JlbG9jCT0gc3RSZWdSZWxvYywJLyogcmVnaXN0ZXIgcmVsb2NhdGlvbiAqLwotICBzdF9Gb3J3YXJkCT0gc3RGb3J3YXJkLAkvKiBmb3J3YXJkaW5nIGFkZHJlc3MgKi8KLSAgc3RfU3RhdGljUHJvYwk9IHN0U3RhdGljUHJvYywJLyogbG9hZCB0aW1lIG9ubHkgc3RhdGljIHByb2NzICovCi0gIHN0X0NvbnN0YW50CT0gc3RDb25zdGFudCwJLyogY29uc3QgKi8KLSAgc3RfU3RyCT0gc3RTdHIsCS8qIHN0cmluZyAqLwotICBzdF9OdW1iZXIJPSBzdE51bWJlciwJLyogcHVyZSBudW1iZXIgKGllLiA0IE5PUiAyKzIpICovCi0gIHN0X0V4cHIJPSBzdEV4cHIsCS8qIDIrMiB2cy4gNCAqLwotICBzdF9UeXBlCT0gc3RUeXBlLAkvKiBwb3N0LWNvZXJjaW9uIFNFUiAqLwotICBzdF9NYXgJPSBzdE1heAkJLyogbWF4IHR5cGUrMSAqLwotfSBzdF90OwotCi0vKiBSZWRlZmluaXRpb24gb2YgdHlwZSBxdWFsaWZpZXJzLiAgKi8KLQotdHlwZWRlZiBlbnVtIHRxIHsKLSAgdHFfTmlsCT0gdHFOaWwsCS8qIGJ0IGlzIHdoYXQgeW91IHNlZSAqLwotICB0cV9QdHIJPSB0cVB0ciwJLyogcG9pbnRlciAqLwotICB0cV9Qcm9jCT0gdHFQcm9jLAkvKiBwcm9jZWR1cmUgKi8KLSAgdHFfQXJyYXkJPSB0cUFycmF5LAkvKiBkdWggKi8KLSAgdHFfRmFyCT0gdHFGYXIsCS8qIGxvbmdlciBhZGRyZXNzaW5nIC0gODA4Ni84IGxhbmQgKi8KLSAgdHFfVm9sCT0gdHFWb2wsCS8qIHZvbGF0aWxlICovCi0gIHRxX01heAk9IHRxTWF4CQkvKiBNYXggdHlwZSBxdWFsaWZpZXIrMSAqLwotfSB0cV90OwotCi0vKiBSZWRlZmluaXRpb24gb2YgYmFzaWMgdHlwZXMuICAqLwotCi10eXBlZGVmIGVudW0gYnQgewotICBidF9OaWwJPSBidE5pbCwJLyogdW5kZWZpbmVkICovCi0gIGJ0X0Fkcgk9IGJ0QWRyLAkvKiBhZGRyZXNzIC0gaW50ZWdlciBzYW1lIHNpemUgYXMgcG9pbnRlciAqLwotICBidF9DaGFyCT0gYnRDaGFyLAkvKiBjaGFyYWN0ZXIgKi8KLSAgYnRfVUNoYXIJPSBidFVDaGFyLAkvKiB1bnNpZ25lZCBjaGFyYWN0ZXIgKi8KLSAgYnRfU2hvcnQJPSBidFNob3J0LAkvKiBzaG9ydCAqLwotICBidF9VU2hvcnQJPSBidFVTaG9ydCwJLyogdW5zaWduZWQgc2hvcnQgKi8KLSAgYnRfSW50CT0gYnRJbnQsCS8qIGludCAqLwotICBidF9VSW50CT0gYnRVSW50LAkvKiB1bnNpZ25lZCBpbnQgKi8KLSAgYnRfTG9uZwk9IGJ0TG9uZywJLyogbG9uZyAqLwotICBidF9VTG9uZwk9IGJ0VUxvbmcsCS8qIHVuc2lnbmVkIGxvbmcgKi8KLSAgYnRfRmxvYXQJPSBidEZsb2F0LAkvKiBmbG9hdCAocmVhbCkgKi8KLSAgYnRfRG91YmxlCT0gYnREb3VibGUsCS8qIERvdWJsZSAocmVhbCkgKi8KLSAgYnRfU3RydWN0CT0gYnRTdHJ1Y3QsCS8qIFN0cnVjdHVyZSAoUmVjb3JkKSAqLwotICBidF9Vbmlvbgk9IGJ0VW5pb24sCS8qIFVuaW9uICh2YXJpYW50KSAqLwotICBidF9FbnVtCT0gYnRFbnVtLAkvKiBFbnVtZXJhdGVkICovCi0gIGJ0X1R5cGVkZWYJPSBidFR5cGVkZWYsCS8qIGRlZmluZWQgdmlhIGEgdHlwZWRlZiwgaXN5bVJlZiBwb2ludHMgKi8KLSAgYnRfUmFuZ2UJPSBidFJhbmdlLAkvKiBzdWJyYW5nZSBvZiBpbnQgKi8KLSAgYnRfU2V0CT0gYnRTZXQsCS8qIHBhc2NhbCBzZXRzICovCi0gIGJ0X0NvbXBsZXgJPSBidENvbXBsZXgsCS8qIGZvcnRyYW4gY29tcGxleCAqLwotICBidF9EQ29tcGxleAk9IGJ0RENvbXBsZXgsCS8qIGZvcnRyYW4gZG91YmxlIGNvbXBsZXggKi8KLSAgYnRfSW5kaXJlY3QJPSBidEluZGlyZWN0LAkvKiBmb3J3YXJkIG9yIHVubmFtZWQgdHlwZWRlZiAqLwotICBidF9GaXhlZERlYwk9IGJ0Rml4ZWREZWMsCS8qIEZpeGVkIERlY2ltYWwgKi8KLSAgYnRfRmxvYXREZWMJPSBidEZsb2F0RGVjLAkvKiBGbG9hdCBEZWNpbWFsICovCi0gIGJ0X1N0cmluZwk9IGJ0U3RyaW5nLAkvKiBWYXJ5aW5nIExlbmd0aCBDaGFyYWN0ZXIgU3RyaW5nICovCi0gIGJ0X0JpdAk9IGJ0Qml0LAkvKiBBbGlnbmVkIEJpdCBTdHJpbmcgKi8KLSAgYnRfUGljdHVyZQk9IGJ0UGljdHVyZSwJLyogUGljdHVyZSAqLwotICBidF9Wb2lkCT0gYnRWb2lkLAkvKiBWb2lkICovCi0gIGJ0X01heAk9IGJ0TWF4CQkvKiBNYXggYmFzaWMgdHlwZSsxICovCi19IGJ0X3Q7Ci0KLSNkZWZpbmUgTl9UUSBpdHFNYXgKLQotLyogU3RhdGVzIGZvciB3aGV0aGVyIHRvIGhhc2ggdHlwZSBvciBub3QuICAqLwotdHlwZWRlZiBlbnVtIGhhc2hfc3RhdGUgewotICBoYXNoX25vCT0gMCwJCS8qIGRvbid0IGhhc2ggdHlwZSAqLwotICBoYXNoX3llcwk9IDEsCQkvKiBvayB0byBoYXNoIHR5cGUsIG9yIHVzZSBwcmV2aW91cyBoYXNoICovCi0gIGhhc2hfcmVjb3JkCT0gMgkJLyogb2sgdG8gcmVjb3JkIGhhc2gsIGJ1dCBkb24ndCB1c2UgcHJldi4gKi8KLX0gaGFzaF9zdGF0ZV90OwotCi0vKiBUeXBlcyBvZiBkaWZmZXJlbnQgc2l6ZWQgYWxsb2NhdGlvbiByZXF1ZXN0cy4gICovCi1lbnVtIGFsbG9jX3R5cGUgewotICBhbGxvY190eXBlX25vbmUsCQkvKiBkdW1teSB2YWx1ZSAqLwotICBhbGxvY190eXBlX3Njb3BlLAkJLyogbmVzdGVkIHNjb3BlcyBsaW5rZWQgbGlzdCAqLwotICBhbGxvY190eXBlX3ZsaW5rcywJCS8qIGdsdWUgbGlua2luZyBwYWdlcyBpbiB2YXJyYXkgKi8KLSAgYWxsb2NfdHlwZV9zaGFzaCwJCS8qIHN0cmluZyBoYXNoIGVsZW1lbnQgKi8KLSAgYWxsb2NfdHlwZV90aGFzaCwJCS8qIHR5cGUgaGFzaCBlbGVtZW50ICovCi0gIGFsbG9jX3R5cGVfdGFnLAkJLyogc3RydWN0L3VuaW9uL3RhZyBlbGVtZW50ICovCi0gIGFsbG9jX3R5cGVfZm9yd2FyZCwJCS8qIGVsZW1lbnQgdG8gaG9sZCB1bmtub3duIHRhZyAqLwotICBhbGxvY190eXBlX3RoZWFkLAkJLyogaGVhZCBvZiB0eXBlIGhhc2ggbGlzdCAqLwotICBhbGxvY190eXBlX3ZhcnJheSwJCS8qIGdlbmVyYWwgdmFycmF5IGFsbG9jYXRpb24gKi8KLSAgYWxsb2NfdHlwZV9saW5lbm8sCQkvKiBsaW5lIG51bWJlciBsaXN0ICovCi0gIGFsbG9jX3R5cGVfbGFzdAkJLyogbGFzdCsxIGVsZW1lbnQgZm9yIGFycmF5IGJvdW5kcyAqLwotfTsKLQotLyogVHlwZXMgb2YgYXV4aWxpYXJ5IHR5cGUgaW5mb3JtYXRpb24uICAqLwotZW51bSBhdXhfdHlwZSB7Ci0gIGF1eF90aXIsCQkJLyogVElSIHR5cGUgaW5mb3JtYXRpb24gKi8KLSAgYXV4X3JuZHgsCQkJLyogcmVsYXRpdmUgaW5kZXggaW50byBzeW1ib2wgdGFibGUgKi8KLSAgYXV4X2RuTG93LAkJCS8qIGxvdyBkaW1lbnNpb24gKi8KLSAgYXV4X2RuSGlnaCwJCQkvKiBoaWdoIGRpbWVuc2lvbiAqLwotICBhdXhfaXN5bSwJCQkvKiBzeW1ib2wgdGFibGUgaW5kZXggKGVuZCBvZiBwcm9jKSAqLwotICBhdXhfaXNzLAkJCS8qIGluZGV4IGludG8gc3RyaW5nIHNwYWNlIChub3QgdXNlZCkgKi8KLSAgYXV4X3dpZHRoLAkJCS8qIHdpZHRoIGZvciBub24tZGVmYXVsdCBzaXplZCBzdHJ1YyBmaWVsZHMgKi8KLSAgYXV4X2NvdW50CQkJLyogY291bnQgb2YgcmFuZ2VzIGZvciB2YXJpYW50IGFybSAqLwotfTsKLQwKLS8qIFN0cnVjdHVyZXMgdG8gcHJvdmlkZSBuLW51bWJlciBvZiB2aXJ0dWFsIGFycmF5cywgZWFjaCBvZiB3aGljaCBjYW4KLSAgIGdyb3cgbGluZWFybHksIGFuZCB3aGljaCBhcmUgd3JpdHRlbiBpbiB0aGUgb2JqZWN0IGZpbGUgYXMKLSAgIHNlcXVlbnRpYWwgcGFnZXMuICBPbiBzeXN0ZW1zIHdpdGggYSBCU0QgbWFsbG9jLCB0aGUKLSAgIE1BWF9DTFVTVEVSX1BBR0VTIHNob3VsZCBiZSAxIGxlc3MgdGhhbiBhIHBvd2VyIG9mIHR3bywgc2luY2UKLSAgIG1hbGxvYyBhZGRzIGl0J3Mgb3ZlcmhlYWQsIGFuZCByb3VuZHMgdXAgdG8gdGhlIG5leHQgcG93ZXIgb2YgMi4KLSAgIFBhZ2VzIGFyZSBsaW5rZWQgdG9nZXRoZXIgdmlhIGEgbGlua2VkIGxpc3QuCi0KLSAgIElmIFBBR0VfU0laRSBpcyA+IDQwOTYsIHRoZSBzdHJpbmcgbGVuZ3RoIGluIHRoZSBzaGFzaF90IHN0cnVjdHVyZQotICAgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgKGFzc3VtaW5nIHRoZXJlIGFyZSBzdHJpbmdzID4gNDA5NiBieXRlcykuICAqLwotCi0vKiBGSVhNRTogWWVzLCB0aGVyZSBjYW4gYmUgc3VjaCBzdHJpbmdzIHdoaWxlIGVtaXR0aW5nIEMrKyBjbGFzcyBkZWJ1ZwotICAgaW5mby4gIFRlbXBsYXRlcyBhcmUgdGhlIG9mZmVuZGVyIGhlcmUsIHRoZSB0ZXN0IGNhc2UgaW4gcXVlc3Rpb24gCi0gICBoYXZpbmcgYSBtYW5nbGVkIGNsYXNzIG5hbWUgb2YKLQotICAgICB0N3JiX3RyZWU0WjR4a2V5WnQ0cGFpcjJaQzR4a2V5WnQ3eHNvY2tldDFaNFVzZXJadDlzZWxlY3Qxc3QyWnQ0cGFpclwKLSAgICAgMlpDNHhrZXladDd4c29ja2V0MVo0VXNlclo0eGtleVp0NGxlc3MxWjR4a2V5Ci0KLSAgIFJlcGVhdCB0aGF0IGEgY291cGxlIGRvemVuIHRpbWVzIHdoaWxlIGxpc3RpbmcgdGhlIGNsYXNzIG1lbWJlcnMgYW5kCi0gICB5b3UndmUgZ290IHN0cmluZ3Mgb3ZlciA0ay4gIEhhY2sgYXJvdW5kIHRoaXMgZm9yIG5vdyBieSBpbmNyZWFzaW5nCi0gICB0aGUgcGFnZSBzaXplLiAgQSBwcm9wZXIgc29sdXRpb24gd291bGQgYWJhbmRvbiB0aGlzIHN0cnVjdHVyZSBzY2hlbWUKLSAgIGNlcnRhaW5seSBmb3IgdmVyeSBsYXJnZSBzdHJpbmdzLCBhbmQgcG9zc2libHkgZW50aXJlbHkuICAqLwotCi0jaWZuZGVmIFBBR0VfU0laRQotI2RlZmluZSBQQUdFX1NJWkUgKDgqMTAyNCkJLyogc2l6ZSBvZiB2YXJyYXkgcGFnZXMgKi8KLSNlbmRpZgotCi0jZGVmaW5lIFBBR0VfVVNJWkUgKCh1bnNpZ25lZCBsb25nKSBQQUdFX1NJWkUpCi0KLSNpZm5kZWYgTUFYX0NMVVNURVJfUEFHRVMJLyogIyBwYWdlcyB0byBnZXQgZnJvbSBzeXN0ZW0gKi8KLSNkZWZpbmUgTUFYX0NMVVNURVJfUEFHRVMgNjMKLSNlbmRpZgotCi0vKiBMaW5rZWQgbGlzdCBjb25uZWN0aW5nIHNlcGFyYXRlIHBhZ2UgYWxsb2NhdGlvbnMuICAqLwotdHlwZWRlZiBzdHJ1Y3QgdmxpbmtzIHsKLSAgc3RydWN0IHZsaW5rcwkqcHJldjsJCS8qIHByZXZpb3VzIHNldCBvZiBwYWdlcyAqLwotICBzdHJ1Y3QgdmxpbmtzICpuZXh0OwkJLyogbmV4dCBzZXQgb2YgcGFnZXMgKi8KLSAgdW5pb24gIHBhZ2UgICAqZGF0dW07CQkvKiBzdGFydCBvZiBwYWdlICovCi0gIHVuc2lnbmVkIGxvbmcJIHN0YXJ0X2luZGV4OwkvKiBzdGFydGluZyBpbmRleCAjIG9mIHBhZ2UgKi8KLX0gdmxpbmtzX3Q7Ci0KLQotLyogVmlydHVhbCBhcnJheSBoZWFkZXIuICAqLwotdHlwZWRlZiBzdHJ1Y3QgdmFycmF5IHsKLSAgdmxpbmtzX3QJKmZpcnN0OwkJCS8qIGZpcnN0IHBhZ2UgbGluayAqLwotICB2bGlua3NfdAkqbGFzdDsJCQkvKiBsYXN0IHBhZ2UgbGluayAqLwotICB1bnNpZ25lZCBsb25nCSBudW1fYWxsb2NhdGVkOwkJLyogIyBvYmplY3RzIGFsbG9jYXRlZCAqLwotICB1bnNpZ25lZCBzaG9ydCBvYmplY3Rfc2l6ZTsJCS8qIHNpemUgaW4gYnl0ZXMgb2YgZWFjaCBvYmplY3QgKi8KLSAgdW5zaWduZWQgc2hvcnQgb2JqZWN0c19wZXJfcGFnZTsJLyogIyBvYmplY3RzIHRoYXQgY2FuIGZpdCBvbiBhIHBhZ2UgKi8KLSAgdW5zaWduZWQgc2hvcnQgb2JqZWN0c19sYXN0X3BhZ2U7CS8qICMgb2JqZWN0cyBhbGxvY2F0ZWQgb24gbGFzdCBwYWdlICovCi19IHZhcnJheV90OwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotI2RlZmluZSBPQkpFQ1RTX1BFUl9QQUdFKHR5cGUpIChQQUdFX1NJWkUgLyBzaXplb2YgKHR5cGUpKQotI2Vsc2UKLSNkZWZpbmUgT0JKRUNUU19QRVJfUEFHRSh0eXBlKSAoKHNpemVvZiAodHlwZSkgPiAxKSA/IDEgOiBQQUdFX1NJWkUpCi0jZW5kaWYKLQotI2RlZmluZSBJTklUX1ZBUlJBWSh0eXBlKSB7CS8qIG1hY3JvIHRvIGluaXRpYWxpemUgYSB2YXJyYXkgKi8JXAotICAodmxpbmtzX3QgKikwLAkJLyogZmlyc3QgKi8JCQkJXAotICAodmxpbmtzX3QgKikwLAkJLyogbGFzdCAqLwkJCQlcCi0gIDAsCQkJCS8qIG51bV9hbGxvY2F0ZWQgKi8JCQlcCi0gIHNpemVvZiAodHlwZSksCQkvKiBvYmplY3Rfc2l6ZSAqLwkJCVwKLSAgT0JKRUNUU19QRVJfUEFHRSAodHlwZSksCS8qIG9iamVjdHNfcGVyX3BhZ2UgKi8JCQlcCi0gIE9CSkVDVFNfUEVSX1BBR0UgKHR5cGUpLAkvKiBvYmplY3RzX2xhc3RfcGFnZSAqLwkJCVwKLX0KLQotCi0vKiBNYXN0ZXIgdHlwZSBmb3IgaW5kZXhlcyB3aXRoaW4gdGhlIHN5bWJvbCB0YWJsZS4gKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBzeW1pbnRfdDsKLQotCi0vKiBMaW5rZWQgbGlzdCBzdXBwb3J0IGZvciBuZXN0ZWQgc2NvcGVzIChmaWxlLCBibG9jaywgc3RydWN0dXJlLCBldGMuKS4gICovCi10eXBlZGVmIHN0cnVjdCBzY29wZSB7Ci0gIHN0cnVjdCBzY29wZQkqcHJldjsJCS8qIHByZXZpb3VzIHNjb3BlIGxldmVsICovCi0gIHN0cnVjdCBzY29wZQkqZnJlZTsJCS8qIGZyZWUgbGlzdCBwb2ludGVyICovCi0gIHN0cnVjdCBsb2NhbHN5bSAqbHN5bTsJLyogcG9pbnRlciB0byBsb2NhbCBzeW1ib2wgbm9kZSAqLwotICBzdF90CQkgdHlwZTsJCS8qIHR5cGUgb2YgdGhlIG5vZGUgKi8KLX0gc2NvcGVfdDsKLQotCi0vKiBGb3IgYSBsb2NhbCBzeW1ib2wgd2Ugc3RvcmUgYSBnYXMgc3ltYm9sIGFzIHdlbGwgYXMgdGhlIGRlYnVnZ2luZwotICAgaW5mb3JtYXRpb24gd2UgZ2VuZXJhdGUuICBUaGUgZ2FzIHN5bWJvbCB3aWxsIGJlIE5VTEwgaWYgdGhpcyBpcwotICAgb25seSBhIGRlYnVnZ2luZyBzeW1ib2wuICAqLwotdHlwZWRlZiBzdHJ1Y3QgbG9jYWxzeW0gewotICBjb25zdCBjaGFyICpuYW1lOwkJLyogc3ltYm9sIG5hbWUgKi8KLSAgc3ltYm9sUyAqYXNfc3ltOwkJLyogc3ltYm9sIGFzIHNlZW4gYnkgZ2FzICovCi0gIGJmZF92bWEgYWRkZW5kOwkJLyogYWRkZW5kIHRvIGFzX3N5bSB2YWx1ZSAqLwotICBzdHJ1Y3QgZWZkciAqZmlsZV9wdHI7CS8qIGZpbGUgcG9pbnRlciAqLwotICBzdHJ1Y3QgZWNvZmZfcHJvYyAqcHJvY19wdHI7CS8qIHByb2MgcG9pbnRlciAqLwotICBzdHJ1Y3QgbG9jYWxzeW0gKmJlZ2luX3B0cjsJLyogc3ltYm9sIGF0IHN0YXJ0IG9mIGJsb2NrICovCi0gIHN0cnVjdCBlY29mZl9hdXggKmluZGV4X3B0cjsJLyogaW5kZXggdmFsdWUgdG8gYmUgZmlsbGVkIGluICovCi0gIHN0cnVjdCBmb3J3YXJkICpmb3J3YXJkX3JlZjsJLyogZm9yd2FyZCByZWZlcmVuY2VzIHRvIHRoaXMgc3ltYm9sICovCi0gIGxvbmcgc3ltX2luZGV4OwkJLyogZmluYWwgc3ltYm9sIGluZGV4ICovCi0gIEVYVFIgZWNvZmZfc3ltOwkJLyogRUNPRkYgZGVidWdnaW5nIHN5bWJvbCAqLwotfSBsb2NhbHN5bV90OwotCi0KLS8qIEZvciBhdXggaW5mb3JtYXRpb24gd2Uga2VlcCB0aGUgdHlwZSBhbmQgdGhlIGRhdGEuICAqLwotdHlwZWRlZiBzdHJ1Y3QgZWNvZmZfYXV4IHsKLSAgZW51bSBhdXhfdHlwZSB0eXBlOwkJLyogYXV4IHR5cGUgKi8KLSAgQVVYVSBkYXRhOwkJCS8qIGF1eCBkYXRhICovCi19IGF1eF90OwotCi0vKiBGb3IgYSBwcm9jZWR1cmUgd2Ugc3RvcmUgdGhlIGdhcyBzeW1ib2wgYXMgd2VsbCBhcyB0aGUgUERSCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QgZWNvZmZfcHJvYyB7Ci0gIGxvY2Fsc3ltX3QgKnN5bTsJCS8qIGFzc29jaWF0ZWQgc3ltYm9sICovCi0gIFBEUiBwZHI7CQkJLyogRUNPRkYgZGVidWdnaW5nIGluZm8gKi8KLX0gcHJvY190OwotCi0vKiBOdW1iZXIgb2YgcHJvY190IHN0cnVjdHVyZXMgYWxsb2NhdGVkLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHByb2NfY250OwotCi0KLS8qIEZvcndhcmQgcmVmZXJlbmNlIGxpc3QgZm9yIHRhZ3MgcmVmZXJlbmNlZCwgYnV0IG5vdCB5ZXQgZGVmaW5lZC4gICovCi10eXBlZGVmIHN0cnVjdCBmb3J3YXJkIHsKLSAgc3RydWN0IGZvcndhcmQgKm5leHQ7CQkvKiBuZXh0IGZvcndhcmQgcmVmZXJlbmNlICovCi0gIHN0cnVjdCBmb3J3YXJkICpmcmVlOwkJLyogZnJlZSBsaXN0IHBvaW50ZXIgKi8KLSAgYXV4X3QJCSAqaWZkX3B0cjsJLyogcG9pbnRlciB0byBzdG9yZSBmaWxlIGluZGV4ICovCi0gIGF1eF90CQkgKmluZGV4X3B0cjsJLyogcG9pbnRlciB0byBzdG9yZSBzeW1ib2wgaW5kZXggKi8KLX0gZm9yd2FyZF90OwotCi0KLS8qIExpbmtlZCBsaXN0IHN1cHBvcnQgZm9yIHRhZ3MuICBUaGUgZmlyc3QgdGFnIGluIHRoZSBsaXN0IGlzIGFsd2F5cwotICAgdGhlIGN1cnJlbnQgdGFnIGZvciB0aGF0IGJsb2NrLiAgKi8KLXR5cGVkZWYgc3RydWN0IHRhZyB7Ci0gIHN0cnVjdCB0YWcJICpmcmVlOwkJLyogZnJlZSBsaXN0IHBvaW50ZXIgKi8KLSAgc3RydWN0IHNoYXNoCSAqaGFzaF9wdHI7CS8qIHBvaW50ZXIgdG8gdGhlIGhhc2ggdGFibGUgaGVhZCAqLwotICBzdHJ1Y3QgdGFnCSAqc2FtZV9uYW1lOwkvKiB0YWcgd2l0aCBzYW1lIG5hbWUgaW4gb3V0ZXIgc2NvcGUgKi8KLSAgc3RydWN0IHRhZwkgKnNhbWVfYmxvY2s7CS8qIG5leHQgdGFnIGRlZmluZWQgaW4gdGhlIHNhbWUgYmxvY2suICAqLwotICBzdHJ1Y3QgZm9yd2FyZCAqZm9yd2FyZF9yZWY7CS8qIGxpc3Qgb2YgZm9yd2FyZCByZWZlcmVuY2VzICovCi0gIGJ0X3QJCSAgYmFzaWNfdHlwZTsJLyogYnRfU3RydWN0LCBidF9Vbmlvbiwgb3IgYnRfRW51bSAqLwotICBzeW1pbnRfdAkgIGlmZDsJCS8qIGZpbGUgIyB0YWcgZGVmaW5lZCBpbiAqLwotICBsb2NhbHN5bV90CSAqc3ltOwkJLyogZmlsZSdzIGxvY2FsIHN5bWJvbHMgKi8KLX0gdGFnX3Q7Ci0KLQotLyogSGVhZCBvZiBhIGJsb2NrJ3MgbGlua2VkIGxpc3Qgb2YgdGFncy4gICovCi10eXBlZGVmIHN0cnVjdCB0aGVhZCB7Ci0gIHN0cnVjdCB0aGVhZAkqcHJldjsJCS8qIHByZXZpb3VzIGJsb2NrICovCi0gIHN0cnVjdCB0aGVhZAkqZnJlZTsJCS8qIGZyZWUgbGlzdCBwb2ludGVyICovCi0gIHN0cnVjdCB0YWcJKmZpcnN0X3RhZzsJLyogZmlyc3QgdGFnIGluIGJsb2NrIGRlZmluZWQgKi8KLX0gdGhlYWRfdDsKLQotCi0vKiBVbmlvbiBjb250YWluaW5nIHBvaW50ZXJzIHRvIGVhY2ggdGhlIHNtYWxsIHN0cnVjdHVyZXMgd2hpY2ggYXJlIGZyZWVkIHVwLiAgKi8KLXR5cGVkZWYgdW5pb24gc21hbGxfZnJlZSB7Ci0gIHNjb3BlX3QJKmZfc2NvcGU7CS8qIHNjb3BlIHN0cnVjdHVyZSAqLwotICB0aGVhZF90CSpmX3RoZWFkOwkvKiB0YWcgaGVhZCBzdHJ1Y3R1cmUgKi8KLSAgdGFnX3QJCSpmX3RhZzsJCS8qIHRhZyBlbGVtZW50IHN0cnVjdHVyZSAqLwotICBmb3J3YXJkX3QJKmZfZm9yd2FyZDsJLyogZm9yd2FyZCB0YWcgcmVmZXJlbmNlICovCi19IHNtYWxsX2ZyZWVfdDsKLQotCi0vKiBTdHJpbmcgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0KLXR5cGVkZWYgc3RydWN0IHNoYXNoIHsKLSAgY2hhcgkJKnN0cmluZzsJLyogc3RyaW5nIHdlIGFyZSBoYXNoaW5nICovCi0gIHN5bWludF90CSBpbmR4OwkJLyogaW5kZXggd2l0aGluIHN0cmluZyB0YWJsZSAqLwotICBFWFRSCQkqZXN5bV9wdHI7CS8qIGdsb2JhbCBzeW1ib2wgcG9pbnRlciAqLwotICBsb2NhbHN5bV90CSpzeW1fcHRyOwkvKiBsb2NhbCBzeW1ib2wgcG9pbnRlciAqLwotICBsb2NhbHN5bV90CSplbmRfcHRyOwkvKiBzeW1ib2wgcG9pbnRlciB0byBlbmQgYmxvY2sgKi8KLSAgdGFnX3QJCSp0YWdfcHRyOwkvKiB0YWcgcG9pbnRlciAqLwotICBwcm9jX3QJKnByb2NfcHRyOwkvKiBwcm9jZWR1cmUgZGVzY3JpcHRvciBwb2ludGVyICovCi19IHNoYXNoX3Q7Ci0KLQotLyogVHlwZSBoYXNoIHRhYmxlIHN1cHBvcnQuICBUaGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSBtdXN0IGZpdAotICAgd2l0aGluIGEgcGFnZSB3aXRoIHRoZSBvdGhlciBleHRlbmRlZCBmaWxlIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24uCi0gICBCZWNhdXNlIHVuaXF1ZSB0eXBlcyB3aGljaCBhcmUgaGFzaGVkIGFyZSBmZXdlciBpbiBudW1iZXIgdGhhbgotICAgc3RyaW5ncywgd2UgdXNlIGEgc21hbGxlciBoYXNoIHZhbHVlLiAgKi8KLQotI2RlZmluZSBIQVNIQklUUyAzMAotCi0jaWZuZGVmIFRIQVNIX1NJWkUKLSNkZWZpbmUgVEhBU0hfU0laRSAxMTMKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB0aGFzaCB7Ci0gIHN0cnVjdCB0aGFzaAkqbmV4dDsJCS8qIG5leHQgaGFzaCB2YWx1ZSAqLwotICBBVVhVCQkgdHlwZTsJCS8qIHR5cGUgd2UgYXJlIGhhc2hpbmcgKi8KLSAgc3ltaW50X3QJIGluZHg7CQkvKiBpbmRleCB3aXRoaW4gc3RyaW5nIHRhYmxlICovCi19IHRoYXNoX3Q7Ci0KLQotLyogRXh0ZW5kZWQgZmlsZSBkZXNjcmlwdG9yIHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBzdXBwb3J0IG5lY2Vzc2FyeQotICAgdG8gYWRkIHRoaW5ncyB0byBlYWNoIGZpbGUgc2VwYXJhdGVseS4gICovCi10eXBlZGVmIHN0cnVjdCBlZmRyIHsKLSAgRkRSCQkgZmRyOwkJLyogRmlsZSBoZWFkZXIgdG8gYmUgd3JpdHRlbiBvdXQgKi8KLSAgRkRSCQkqb3JpZ19mZHI7CS8qIG9yaWdpbmFsIGZpbGUgaGVhZGVyICovCi0gIGNoYXIJCSpuYW1lOwkJLyogZmlsZW5hbWUgKi8KLSAgaW50CQkgZmFrZTsJCS8qIHdoZXRoZXIgdGhpcyBpcyBmYWtlZCAuZmlsZSAqLwotICBzeW1pbnRfdAkgdm9pZF90eXBlOwkvKiBhdXguIHBvaW50ZXIgdG8gJ3ZvaWQnIHR5cGUgKi8KLSAgc3ltaW50X3QJIGludF90eXBlOwkvKiBhdXguIHBvaW50ZXIgdG8gJ2ludCcgdHlwZSAqLwotICBzY29wZV90CSpjdXJfc2NvcGU7CS8qIGN1cnJlbnQgbmVzdGVkIHNjb3BlcyAqLwotICBzeW1pbnRfdAkgZmlsZV9pbmRleDsJLyogY3VycmVudCBmaWxlIG51bWJlciAqLwotICBpbnQJCSBuZXN0ZWRfc2NvcGVzOwkvKiAjIG5lc3RlZCBzY29wZXMgKi8KLSAgdmFycmF5X3QJIHN0cmluZ3M7CS8qIGxvY2FsIHN0cmluZ3MgKi8KLSAgdmFycmF5X3QJIHN5bWJvbHM7CS8qIGxvY2FsIHN5bWJvbHMgKi8KLSAgdmFycmF5X3QJIHByb2NzOwkJLyogcHJvY2VkdXJlcyAqLwotICB2YXJyYXlfdAkgYXV4X3N5bXM7CS8qIGF1eGlsaWFyeSBzeW1ib2xzICovCi0gIHN0cnVjdCBlZmRyCSpuZXh0X2ZpbGU7CS8qIG5leHQgZmlsZSBkZXNjcmlwdG9yICovCi0JCQkJLyogc3RyaW5nL3R5cGUgaGFzaCB0YWJsZXMgKi8KLSAgc3RydWN0IGhhc2hfY29udHJvbCAqc3RyX2hhc2g7CS8qIHN0cmluZyBoYXNoIHRhYmxlICovCi0gIHRoYXNoX3QJKnRoYXNoX2hlYWRbVEhBU0hfU0laRV07Ci19IGVmZHJfdDsKLQotLyogUHJlLWluaXRpYWxpemVkIGV4dGVuZGVkIGZpbGUgc3RydWN0dXJlLiAgKi8KLXN0YXRpYyBjb25zdCBlZmRyX3QgaW5pdF9maWxlID0KLXsKLSAgewkJCS8qIEZEUiBzdHJ1Y3R1cmUgKi8KLSAgICAwLAkJCS8qIGFkcjoJCW1lbW9yeSBhZGRyZXNzIG9mIGJlZ2lubmluZyBvZiBmaWxlICovCi0gICAgMCwJCQkvKiByc3M6CQlmaWxlIG5hbWUgKG9mIHNvdXJjZSwgaWYga25vd24pICovCi0gICAgMCwJCQkvKiBpc3NCYXNlOglmaWxlJ3Mgc3RyaW5nIHNwYWNlICovCi0gICAgMCwJCQkvKiBjYlNzOgludW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHNzICovCi0gICAgMCwJCQkvKiBpc3ltQmFzZToJYmVnaW5uaW5nIG9mIHN5bWJvbHMgKi8KLSAgICAwLAkJCS8qIGNzeW06CWNvdW50IGZpbGUncyBvZiBzeW1ib2xzICovCi0gICAgMCwJCQkvKiBpbGluZUJhc2U6CWZpbGUncyBsaW5lIHN5bWJvbHMgKi8KLSAgICAwLAkJCS8qIGNsaW5lOgljb3VudCBvZiBmaWxlJ3MgbGluZSBzeW1ib2xzICovCi0gICAgMCwJCQkvKiBpb3B0QmFzZToJZmlsZSdzIG9wdGltaXphdGlvbiBlbnRyaWVzICovCi0gICAgMCwJCQkvKiBjb3B0Ogljb3VudCBvZiBmaWxlJ3Mgb3B0aW1pemF0aW9uIGVudHJpZXMgKi8KLSAgICAwLAkJCS8qIGlwZEZpcnN0OglzdGFydCBvZiBwcm9jZWR1cmVzIGZvciB0aGlzIGZpbGUgKi8KLSAgICAwLAkJCS8qIGNwZDoJCWNvdW50IG9mIHByb2NlZHVyZXMgZm9yIHRoaXMgZmlsZSAqLwotICAgIDAsCQkJLyogaWF1eEJhc2U6CWZpbGUncyBhdXhpbGlhcnkgZW50cmllcyAqLwotICAgIDAsCQkJLyogY2F1eDoJY291bnQgb2YgZmlsZSdzIGF1eGlsaWFyeSBlbnRyaWVzICovCi0gICAgMCwJCQkvKiByZmRCYXNlOglpbmRleCBpbnRvIHRoZSBmaWxlIGluZGlyZWN0IHRhYmxlICovCi0gICAgMCwJCQkvKiBjcmZkOgljb3VudCBmaWxlIGluZGlyZWN0IGVudHJpZXMgKi8KLSAgICBsYW5nQywJCS8qIGxhbmc6CWxhbmd1YWdlIGZvciB0aGlzIGZpbGUgKi8KLSAgICAxLAkJCS8qIGZNZXJnZToJd2hldGhlciB0aGlzIGZpbGUgY2FuIGJlIG1lcmdlZCAqLwotICAgIDAsCQkJLyogZlJlYWRpbjoJdHJ1ZSBpZiByZWFkIGluIChub3QganVzdCBjcmVhdGVkKSAqLwotICAgIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLCAgLyogZkJpZ2VuZGlhbjoJaWYgMSwgY29tcGlsZWQgb24gYmlnIGVuZGlhbiBtYWNoaW5lICovCi0gICAgR0xFVkVMXzIsCQkvKiBnbGV2ZWw6CWxldmVsIHRoaXMgZmlsZSB3YXMgY29tcGlsZWQgd2l0aCAqLwotICAgIDAsCQkJLyogcmVzZXJ2ZWQ6CXJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi0gICAgMCwJCQkvKiBjYkxpbmVPZmZzZXQ6IGJ5dGUgb2Zmc2V0IGZyb20gaGVhZGVyIGZvciB0aGlzIGZpbGUgbG4ncyAqLwotICAgIDAsCQkJLyogY2JMaW5lOglzaXplIG9mIGxpbmVzIGZvciB0aGlzIGZpbGUgKi8KLSAgfSwKLQotICAoRkRSICopMCwJCS8qIG9yaWdfZmRyOglvcmlnaW5hbCBmaWxlIGhlYWRlciBwb2ludGVyICovCi0gIChjaGFyICopMCwJCS8qIG5hbWU6CXBvaW50ZXIgdG8gZmlsZW5hbWUgKi8KLSAgMCwJCQkvKiBmYWtlOgl3aGV0aGVyIHRoaXMgaXMgYSBmYWtlZCAuZmlsZSAqLwotICAwLAkJCS8qIHZvaWRfdHlwZToJcHRyIHRvIGF1eCBub2RlIGZvciB2b2lkIHR5cGUgKi8KLSAgMCwJCQkvKiBpbnRfdHlwZToJcHRyIHRvIGF1eCBub2RlIGZvciBpbnQgdHlwZSAqLwotICAoc2NvcGVfdCAqKTAsCQkvKiBjdXJfc2NvcGU6CWN1cnJlbnQgc2NvcGUgYmVpbmcgcHJvY2Vzc2VkICovCi0gIDAsCQkJLyogZmlsZV9pbmRleDoJY3VycmVudCBmaWxlICMgKi8KLSAgMCwJCQkvKiBuZXN0ZWRfc2NvcGVzOiAjIG5lc3RlZCBzY29wZXMgKi8KLSAgSU5JVF9WQVJSQVkgKGNoYXIpLAkvKiBzdHJpbmdzOglsb2NhbCBzdHJpbmcgdmFycmF5ICovCi0gIElOSVRfVkFSUkFZIChsb2NhbHN5bV90KSwJLyogc3ltYm9sczoJbG9jYWwgc3ltYm9scyB2YXJyYXkgKi8KLSAgSU5JVF9WQVJSQVkgKHByb2NfdCksCS8qIHByb2NzOglwcm9jZWR1cmUgdmFycmF5ICovCi0gIElOSVRfVkFSUkFZIChhdXhfdCksCS8qIGF1eF9zeW1zOglhdXhpbGlhcnkgc3ltYm9scyB2YXJyYXkgKi8KLQotICAoc3RydWN0IGVmZHIgKikwLAkvKiBuZXh0X2ZpbGU6CW5leHQgZmlsZSBzdHJ1Y3R1cmUgKi8KLQotICAoc3RydWN0IGhhc2hfY29udHJvbCAqKTAsCS8qIHN0cl9oYXNoOglzdHJpbmcgaGFzaCB0YWJsZSAqLwotICB7IDAgfSwJCS8qIHRoYXNoX2hlYWQ6CXR5cGUgaGFzaCB0YWJsZSAqLwotfTsKLQotCi1zdGF0aWMgZWZkcl90ICpmaXJzdF9maWxlOwkJCS8qIGZpcnN0IGZpbGUgZGVzY3JpcHRvciAqLwotc3RhdGljIGVmZHJfdCAqKmxhc3RfZmlsZV9wdHIgPSAmZmlyc3RfZmlsZTsJLyogZmlsZSBkZXNjcmlwdG9yIHRhaWwgKi8KLQotCi0vKiBMaW5lIG51bWJlciBpbmZvcm1hdGlvbiBpcyBrZXB0IGluIGEgbGlzdCB1bnRpbCB0aGUgYXNzZW1ibHkgaXMKLSAgIGZpbmlzaGVkLiAgKi8KLXR5cGVkZWYgc3RydWN0IGxpbmVub19saXN0IHsKLSAgc3RydWN0IGxpbmVub19saXN0ICpuZXh0OwkvKiBuZXh0IGVsZW1lbnQgaW4gbGlzdCAqLwotICBlZmRyX3QgKmZpbGU7CQkJLyogZmlsZSB0aGlzIGxpbmUgaXMgaW4gKi8KLSAgcHJvY190ICpwcm9jOwkJCS8qIHByb2NlZHVyZSB0aGlzIGxpbmUgaXMgaW4gKi8KLSAgZnJhZ1MgKmZyYWc7CQkJLyogZnJhZ21lbnQgdGhpcyBsaW5lIG51bWJlciBpcyBpbiAqLwotICB1bnNpZ25lZCBsb25nIHBhZGRyOwkJLyogb2Zmc2V0IHdpdGhpbiBmcmFnbWVudCAqLwotICBsb25nIGxpbmVubzsJCQkvKiBhY3R1YWwgbGluZSBudW1iZXIgKi8KLX0gbGluZW5vX2xpc3RfdDsKLQotc3RhdGljIGxpbmVub19saXN0X3QgKmZpcnN0X2xpbmVubzsKLXN0YXRpYyBsaW5lbm9fbGlzdF90ICpsYXN0X2xpbmVubzsKLXN0YXRpYyBsaW5lbm9fbGlzdF90ICoqbGFzdF9saW5lbm9fcHRyID0gJmZpcnN0X2xpbmVubzsKLQotLyogU29tZXRpbWVzIHRoZXJlIHdpbGwgYmUgc29tZSAubG9jIHN0YXRlbWVudHMgYmVmb3JlIGEgLmVudC4gIFdlCi0gICBrZWVwIHRoZW0gaW4gdGhpcyBsaXN0IHNvIHRoYXQgd2UgY2FuIGZpbGwgaW4gdGhlIHByb2NlZHVyZSBwb2ludGVyCi0gICBhZnRlciB3ZSBzZWUgdGhlIC5lbnQuICAqLwotc3RhdGljIGxpbmVub19saXN0X3QgKm5vcHJvY19saW5lbm87Ci0KLS8qIFVuaW9uIG9mIHZhcmlvdXMgdGhpbmdzIHRoYXQgYXJlIGhlbGQgaW4gcGFnZXMuICAqLwotdHlwZWRlZiB1bmlvbiBwYWdlIHsKLSAgY2hhcgkJYnl0ZQlbIFBBR0VfU0laRSBdOwotICB1bnNpZ25lZCBjaGFyCXVieXRlCVsgUEFHRV9TSVpFIF07Ci0gIGVmZHJfdAlmaWxlCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChlZmRyX3QpCSAgICAgXTsKLSAgRkRSCQlvZmlsZQlbIFBBR0VfU0laRSAvIHNpemVvZiAoRkRSKQkgICAgIF07Ci0gIHByb2NfdAlwcm9jCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChwcm9jX3QpCSAgICAgXTsKLSAgbG9jYWxzeW1fdAlzeW0JWyBQQUdFX1NJWkUgLyBzaXplb2YgKGxvY2Fsc3ltX3QpICAgIF07Ci0gIGF1eF90CQlhdXgJWyBQQUdFX1NJWkUgLyBzaXplb2YgKGF1eF90KQkgICAgIF07Ci0gIEROUgkJZGVuc2UJWyBQQUdFX1NJWkUgLyBzaXplb2YgKEROUikJICAgICBdOwotICBzY29wZV90CXNjb3BlCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChzY29wZV90KQkgICAgIF07Ci0gIHZsaW5rc190CXZsaW5rcwlbIFBBR0VfU0laRSAvIHNpemVvZiAodmxpbmtzX3QpCSAgICAgXTsKLSAgc2hhc2hfdAlzaGFzaAlbIFBBR0VfU0laRSAvIHNpemVvZiAoc2hhc2hfdCkJICAgICBdOwotICB0aGFzaF90CXRoYXNoCVsgUEFHRV9TSVpFIC8gc2l6ZW9mICh0aGFzaF90KQkgICAgIF07Ci0gIHRhZ190CQl0YWcJWyBQQUdFX1NJWkUgLyBzaXplb2YgKHRhZ190KQkgICAgIF07Ci0gIGZvcndhcmRfdAlmb3J3YXJkCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChmb3J3YXJkX3QpICAgICBdOwotICB0aGVhZF90CXRoZWFkCVsgUEFHRV9TSVpFIC8gc2l6ZW9mICh0aGVhZF90KQkgICAgIF07Ci0gIGxpbmVub19saXN0X3QJbGluZW5vCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChsaW5lbm9fbGlzdF90KSBdOwotfSBwYWdlX3R5cGU7Ci0KLQotLyogU3RydWN0dXJlIGhvbGRpbmcgYWxsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3Igc21hbGwgc2l6ZWQgc3RydWN0dXJlcy4gICovCi10eXBlZGVmIHN0cnVjdCBhbGxvY19pbmZvIHsKLSAgY2hhcgkJKmFsbG9jX25hbWU7CS8qIG5hbWUgb2YgdGhpcyBhbGxvY2F0aW9uIHR5cGUgKG11c3QgYmUgZmlyc3QpICovCi0gIHBhZ2VfdHlwZQkqY3VyX3BhZ2U7CS8qIGN1cnJlbnQgcGFnZSBiZWluZyBhbGxvY2F0ZWQgZnJvbSAqLwotICBzbWFsbF9mcmVlX3QJIGZyZWVfbGlzdDsJLyogY3VycmVudCBmcmVlIGxpc3QgaWYgYW55ICovCi0gIGludAkJIHVuYWxsb2NhdGVkOwkvKiBudW1iZXIgb2YgZWxlbWVudHMgdW5hbGxvY2F0ZWQgb24gcGFnZSAqLwotICBpbnQJCSB0b3RhbF9hbGxvYzsJLyogdG90YWwgbnVtYmVyIG9mIGFsbG9jYXRpb25zICovCi0gIGludAkJIHRvdGFsX2ZyZWU7CS8qIHRvdGFsIG51bWJlciBvZiBmcmVlcyAqLwotICBpbnQJCSB0b3RhbF9wYWdlczsJLyogdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGFsbG9jYXRlZCAqLwotfSBhbGxvY19pbmZvX3Q7Ci0KLQotLyogVHlwZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgdG9nZXRoZXIuICAqLwotdHlwZWRlZiBzdHJ1Y3QgdHlwZV9pbmZvIHsKLSAgYnRfdAkgICAgICBiYXNpY190eXBlOwkJLyogYmFzaWMgdHlwZSAqLwotICBpbnQJICAgICAgb3JpZ190eXBlOwkJLyogb3JpZ2luYWwgQ09GRi1iYXNlZCB0eXBlICovCi0gIGludAkgICAgICBudW1fdHE7CQkJLyogIyB0eXBlIHF1YWxpZmllcnMgKi8KLSAgaW50CSAgICAgIG51bV9kaW1zOwkJCS8qICMgZGltZW5zaW9ucyAqLwotICBpbnQJICAgICAgbnVtX3NpemVzOwkJLyogIyBzaXplcyAqLwotICBpbnQJICAgICAgZXh0cmFfc2l6ZXM7CQkvKiAjIGV4dHJhIHNpemVzIG5vdCB0aWVkIHdpdGggZGltcyAqLwotICB0YWdfdCAqICAgICB0YWdfcHRyOwkJCS8qIHRhZyBwb2ludGVyICovCi0gIGludAkgICAgICBiaXRmaWVsZDsJCQkvKiBzeW1ib2wgaXMgYSBiaXRmaWVsZCAqLwotICB0cV90CSAgICAgIHR5cGVfcXVhbGlmaWVyc1tOX1RRXTsJLyogdHlwZSBxdWFsaWZpZXJzIChwdHIsIGZ1bmMsIGFycmF5KSovCi0gIHN5bWludF90ICAgIGRpbWVuc2lvbnMgICAgIFtOX1RRXTsJLyogZGltZW5zaW9ucyBmb3IgZWFjaCBhcnJheSAqLwotICBzeW1pbnRfdCAgICBzaXplcwkgICAgIFtOX1RRKzJdOwkvKiBzaXplcyBvZiBlYWNoIGFycmF5IHNsaWNlICsgc2l6ZSBvZgotCQkJCQkgICBzdHJ1Y3QvdW5pb24vZW51bSArIGJpdGZpZWxkIHNpemUgKi8KLX0gdHlwZV9pbmZvX3Q7Ci0KLS8qIFByZS1pbml0aWFsaXplZCB0eXBlX2luZm8gc3RydWN0LiAgKi8KLXN0YXRpYyBjb25zdCB0eXBlX2luZm9fdCB0eXBlX2luZm9faW5pdCA9IHsKLSAgYnRfTmlsLAkJCQkvKiBiYXNpYyB0eXBlICovCi0gIFRfTlVMTCwJCQkJLyogb3JpZ2luYWwgQ09GRi1iYXNlZCB0eXBlICovCi0gIDAsCQkJCQkvKiAjIHR5cGUgcXVhbGlmaWVycyAqLwotICAwLAkJCQkJLyogIyBkaW1lbnNpb25zICovCi0gIDAsCQkJCQkvKiAjIHNpemVzICovCi0gIDAsCQkJCQkvKiBzaXplcyBub3QgdGllZCB3aXRoIGRpbXMgKi8KLSAgTlVMTCwJCQkJCS8qIHB0ciB0byB0YWcgKi8KLSAgMCwJCQkJCS8qIGJpdGZpZWxkICovCi0gIHsJCQkJCS8qIHR5cGUgcXVhbGlmaWVycyAqLwotICAgIHRxX05pbCwKLSAgICB0cV9OaWwsCi0gICAgdHFfTmlsLAotICAgIHRxX05pbCwKLSAgICB0cV9OaWwsCi0gICAgdHFfTmlsLAotICB9LAotICB7CQkJCQkvKiBkaW1lbnNpb25zICovCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAKLSAgfSwKLSAgewkJCQkJLyogc2l6ZXMgKi8KLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gIH0sCi19OwotCi0vKiBHbG9iYWwgaGFzaCB0YWJsZSBmb3IgdGhlIHRhZ3MgdGFibGUgYW5kIGdsb2JhbCB0YWJsZSBmb3IgZmlsZQotICAgZGVzY3JpcHRvcnMuICAqLwotCi1zdGF0aWMgdmFycmF5X3QgZmlsZV9kZXNjCT0gSU5JVF9WQVJSQVkgKGVmZHJfdCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWdfaGFzaDsKLQotLyogU3RhdGljIHR5cGVzIGZvciBpbnQgYW5kIHZvaWQuICBBbHNvLCByZW1lbWJlciB0aGUgbGFzdCBmdW5jdGlvbidzCi0gICB0eXBlICh3aGljaCBpcyBzZXQgdXAgd2hlbiB3ZSBlbmNvdW50ZXIgdGhlIGRlY2xhcmF0aW9uIGZvciB0aGUKLSAgIGZ1bmN0aW9uLCBhbmQgdXNlZCB3aGVuIHRoZSBlbmQgYmxvY2sgZm9yIHRoZSBmdW5jdGlvbiBpcyBlbWl0dGVkLiAgKi8KLQotc3RhdGljIHR5cGVfaW5mb190IGludF90eXBlX2luZm87Ci1zdGF0aWMgdHlwZV9pbmZvX3Qgdm9pZF90eXBlX2luZm87Ci1zdGF0aWMgdHlwZV9pbmZvX3QgbGFzdF9mdW5jX3R5cGVfaW5mbzsKLXN0YXRpYyBzeW1ib2xTICpsYXN0X2Z1bmNfc3ltX3ZhbHVlOwotCi0KLS8qIENvbnZlcnQgQ09GRiBiYXNpYyB0eXBlIHRvIEVDT0ZGIGJhc2ljIHR5cGUuICBUaGUgVF9OVUxMIHR5cGUKLSAgIHJlYWxseSBzaG91bGQgdXNlIGJ0X1ZvaWQsIGJ1dCB0aGlzIGNhdXNlcyB0aGUgY3VycmVudCBlY29mZiBHREIgdG8KLSAgIGlzc3VlIHVuc3VwcG9ydGVkIHR5cGUgbWVzc2FnZXMsIGFuZCB0aGUgVWx0cml4IDQuMDAgZGJ4IChha2EgTUlQUwotICAgMi4wKSBkb2Vzbid0IHVuZGVyc3RhbmQgaXQsIGV2ZW4gdGhvdWdoIHRoZSBjb21waWxlciBnZW5lcmF0ZXMgaXQuCi0gICBNYXliZSB0aGlzIHdpbGwgYmUgZml4ZWQgaW4gMi4xMCBvciAyLjIwIG9mIHRoZSBNSVBTIGNvbXBpbGVyCi0gICBzdWl0ZSwgYnV0IGZvciBub3cgZ28gd2l0aCB3aGF0IHdvcmtzLgotCi0gICBJdCB3b3VsZCBtYWtlIHNlbnNlIGZvciB0aGUgLnR5cGUgYW5kIC5zY2wgZGlyZWN0aXZlcyB0byB1c2UgdGhlCi0gICBFQ09GRiBudW1iZXJzIGRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZyB0aGUgQ09GRiBudW1iZXJzIGFuZAotICAgbWFwcGluZyB0aGVtLiAgVW5mb3J0dW5hdGVseSwgdGhpcyBpcyBoaXN0b3JpY2FsbHkgd2hhdCBtaXBzLXRmaWxlCi0gICBleHBlY3RzLCBhbmQgY2hhbmdpbmcgZ2NjIG5vdyB3b3VsZCBiZSBhIGNvbnNpZGVyYWJsZSBwYWluICh0aGUKLSAgIG5hdGl2ZSBjb21waWxlciBnZW5lcmF0ZXMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGludGVybmFsbHksIHJhdGhlcgotICAgdGhhbiB2aWEgdGhlIGFzc2VtYmxlciwgc28gaXQgd2lsbCBuZXZlciB1c2UgLnR5cGUgb3IgLnNjbCkuICAqLwotCi1zdGF0aWMgY29uc3QgYnRfdCBtYXBfY29mZl90eXBlc1tdID0gewotICBidF9OaWwsCQkJLyogVF9OVUxMICovCi0gIGJ0X05pbCwJCQkvKiBUX0FSRyAqLwotICBidF9DaGFyLAkJCS8qIFRfQ0hBUiAqLwotICBidF9TaG9ydCwJCQkvKiBUX1NIT1JUICovCi0gIGJ0X0ludCwJCQkvKiBUX0lOVCAqLwotICBidF9Mb25nLAkJCS8qIFRfTE9ORyAqLwotICBidF9GbG9hdCwJCQkvKiBUX0ZMT0FUICovCi0gIGJ0X0RvdWJsZSwJCQkvKiBUX0RPVUJMRSAqLwotICBidF9TdHJ1Y3QsCQkJLyogVF9TVFJVQ1QgKi8KLSAgYnRfVW5pb24sCQkJLyogVF9VTklPTiAqLwotICBidF9FbnVtLAkJCS8qIFRfRU5VTSAqLwotICBidF9FbnVtLAkJCS8qIFRfTU9FICovCi0gIGJ0X1VDaGFyLAkJCS8qIFRfVUNIQVIgKi8KLSAgYnRfVVNob3J0LAkJCS8qIFRfVVNIT1JUICovCi0gIGJ0X1VJbnQsCQkJLyogVF9VSU5UICovCi0gIGJ0X1VMb25nCQkJLyogVF9VTE9ORyAqLwotfTsKLQotLyogQ29udmVydCBDT0ZGIHN0b3JhZ2UgY2xhc3MgdG8gRUNPRkYgc3RvcmFnZSBjbGFzcy4gICovCi1zdGF0aWMgY29uc3Qgc2NfdCBtYXBfY29mZl9zdG9yYWdlW10gPSB7Ci0gIHNjX05pbCwJCQkvKiAgIDA6IENfTlVMTCAqLwotICBzY19BYnMsCQkJLyogICAxOiBDX0FVVE8JICBhdXRvIHZhciAqLwotICBzY19VbmRlZmluZWQsCQkJLyogICAyOiBDX0VYVAkgIGV4dGVybmFsICovCi0gIHNjX0RhdGEsCQkJLyogICAzOiBDX1NUQVQJICBzdGF0aWMgKi8KLSAgc2NfUmVnaXN0ZXIsCQkJLyogICA0OiBDX1JFRwkgIHJlZ2lzdGVyICovCi0gIHNjX1VuZGVmaW5lZCwJCQkvKiAgIDU6IENfRVhUREVGICA/Pz8gKi8KLSAgc2NfVGV4dCwJCQkvKiAgIDY6IENfTEFCRUwJICBsYWJlbCAqLwotICBzY19UZXh0LAkJCS8qICAgNzogQ19VTEFCRUwgIHVzZXIgbGFiZWwgKi8KLSAgc2NfSW5mbywJCQkvKiAgIDg6IENfTU9TCSAgbWVtYmVyIG9mIHN0cnVjdCAqLwotICBzY19BYnMsCQkJLyogICA5OiBDX0FSRwkgIGFyZ3VtZW50ICovCi0gIHNjX0luZm8sCQkJLyogIDEwOiBDX1NUUlRBRyAgc3RydWN0IHRhZyAqLwotICBzY19JbmZvLAkJCS8qICAxMTogQ19NT1UJICBtZW1iZXIgb2YgdW5pb24gKi8KLSAgc2NfSW5mbywJCQkvKiAgMTI6IENfVU5UQUcgICB1bmlvbiB0YWcgKi8KLSAgc2NfSW5mbywJCQkvKiAgMTM6IENfVFBERUYJICB0eXBlZGVmICovCi0gIHNjX0RhdGEsCQkJLyogIDE0OiBDX1VTVEFUSUMgPz8/ICovCi0gIHNjX0luZm8sCQkJLyogIDE1OiBDX0VOVEFHCSAgZW51bSB0YWcgKi8KLSAgc2NfSW5mbywJCQkvKiAgMTY6IENfTU9FCSAgbWVtYmVyIG9mIGVudW0gKi8KLSAgc2NfUmVnaXN0ZXIsCQkJLyogIDE3OiBDX1JFR1BBUk0gcmVnaXN0ZXIgcGFyYW1ldGVyICovCi0gIHNjX0JpdHMsCQkJLyogIDE4OyBDX0ZJRUxECSAgYml0ZmllbGQgKi8KLSAgc2NfTmlsLAkJCS8qICAxOSAqLwotICBzY19OaWwsCQkJLyogIDIwICovCi0gIHNjX05pbCwJCQkvKiAgMjEgKi8KLSAgc2NfTmlsLAkJCS8qICAyMiAqLwotICBzY19OaWwsCQkJLyogIDIzICovCi0gIHNjX05pbCwJCQkvKiAgMjQgKi8KLSAgc2NfTmlsLAkJCS8qICAyNSAqLwotICBzY19OaWwsCQkJLyogIDI2ICovCi0gIHNjX05pbCwJCQkvKiAgMjcgKi8KLSAgc2NfTmlsLAkJCS8qICAyOCAqLwotICBzY19OaWwsCQkJLyogIDI5ICovCi0gIHNjX05pbCwJCQkvKiAgMzAgKi8KLSAgc2NfTmlsLAkJCS8qICAzMSAqLwotICBzY19OaWwsCQkJLyogIDMyICovCi0gIHNjX05pbCwJCQkvKiAgMzMgKi8KLSAgc2NfTmlsLAkJCS8qICAzNCAqLwotICBzY19OaWwsCQkJLyogIDM1ICovCi0gIHNjX05pbCwJCQkvKiAgMzYgKi8KLSAgc2NfTmlsLAkJCS8qICAzNyAqLwotICBzY19OaWwsCQkJLyogIDM4ICovCi0gIHNjX05pbCwJCQkvKiAgMzkgKi8KLSAgc2NfTmlsLAkJCS8qICA0MCAqLwotICBzY19OaWwsCQkJLyogIDQxICovCi0gIHNjX05pbCwJCQkvKiAgNDIgKi8KLSAgc2NfTmlsLAkJCS8qICA0MyAqLwotICBzY19OaWwsCQkJLyogIDQ0ICovCi0gIHNjX05pbCwJCQkvKiAgNDUgKi8KLSAgc2NfTmlsLAkJCS8qICA0NiAqLwotICBzY19OaWwsCQkJLyogIDQ3ICovCi0gIHNjX05pbCwJCQkvKiAgNDggKi8KLSAgc2NfTmlsLAkJCS8qICA0OSAqLwotICBzY19OaWwsCQkJLyogIDUwICovCi0gIHNjX05pbCwJCQkvKiAgNTEgKi8KLSAgc2NfTmlsLAkJCS8qICA1MiAqLwotICBzY19OaWwsCQkJLyogIDUzICovCi0gIHNjX05pbCwJCQkvKiAgNTQgKi8KLSAgc2NfTmlsLAkJCS8qICA1NSAqLwotICBzY19OaWwsCQkJLyogIDU2ICovCi0gIHNjX05pbCwJCQkvKiAgNTcgKi8KLSAgc2NfTmlsLAkJCS8qICA1OCAqLwotICBzY19OaWwsCQkJLyogIDU5ICovCi0gIHNjX05pbCwJCQkvKiAgNjAgKi8KLSAgc2NfTmlsLAkJCS8qICA2MSAqLwotICBzY19OaWwsCQkJLyogIDYyICovCi0gIHNjX05pbCwJCQkvKiAgNjMgKi8KLSAgc2NfTmlsLAkJCS8qICA2NCAqLwotICBzY19OaWwsCQkJLyogIDY1ICovCi0gIHNjX05pbCwJCQkvKiAgNjYgKi8KLSAgc2NfTmlsLAkJCS8qICA2NyAqLwotICBzY19OaWwsCQkJLyogIDY4ICovCi0gIHNjX05pbCwJCQkvKiAgNjkgKi8KLSAgc2NfTmlsLAkJCS8qICA3MCAqLwotICBzY19OaWwsCQkJLyogIDcxICovCi0gIHNjX05pbCwJCQkvKiAgNzIgKi8KLSAgc2NfTmlsLAkJCS8qICA3MyAqLwotICBzY19OaWwsCQkJLyogIDc0ICovCi0gIHNjX05pbCwJCQkvKiAgNzUgKi8KLSAgc2NfTmlsLAkJCS8qICA3NiAqLwotICBzY19OaWwsCQkJLyogIDc3ICovCi0gIHNjX05pbCwJCQkvKiAgNzggKi8KLSAgc2NfTmlsLAkJCS8qICA3OSAqLwotICBzY19OaWwsCQkJLyogIDgwICovCi0gIHNjX05pbCwJCQkvKiAgODEgKi8KLSAgc2NfTmlsLAkJCS8qICA4MiAqLwotICBzY19OaWwsCQkJLyogIDgzICovCi0gIHNjX05pbCwJCQkvKiAgODQgKi8KLSAgc2NfTmlsLAkJCS8qICA4NSAqLwotICBzY19OaWwsCQkJLyogIDg2ICovCi0gIHNjX05pbCwJCQkvKiAgODcgKi8KLSAgc2NfTmlsLAkJCS8qICA4OCAqLwotICBzY19OaWwsCQkJLyogIDg5ICovCi0gIHNjX05pbCwJCQkvKiAgOTAgKi8KLSAgc2NfTmlsLAkJCS8qICA5MSAqLwotICBzY19OaWwsCQkJLyogIDkyICovCi0gIHNjX05pbCwJCQkvKiAgOTMgKi8KLSAgc2NfTmlsLAkJCS8qICA5NCAqLwotICBzY19OaWwsCQkJLyogIDk1ICovCi0gIHNjX05pbCwJCQkvKiAgOTYgKi8KLSAgc2NfTmlsLAkJCS8qICA5NyAqLwotICBzY19OaWwsCQkJLyogIDk4ICovCi0gIHNjX05pbCwJCQkvKiAgOTkgKi8KLSAgc2NfVGV4dCwJCQkvKiAxMDA6IENfQkxPQ0sgIGJsb2NrIHN0YXJ0L2VuZCAqLwotICBzY19UZXh0LAkJCS8qIDEwMTogQ19GQ04JIGZ1bmN0aW9uIHN0YXJ0L2VuZCAqLwotICBzY19JbmZvLAkJCS8qIDEwMjogQ19FT1MJIGVuZCBvZiBzdHJ1Y3QvdW5pb24vZW51bSAqLwotICBzY19OaWwsCQkJLyogMTAzOiBDX0ZJTEUJIGZpbGUgc3RhcnQgKi8KLSAgc2NfTmlsLAkJCS8qIDEwNDogQ19MSU5FCSBsaW5lIG51bWJlciAqLwotICBzY19OaWwsCQkJLyogMTA1OiBDX0FMSUFTCSBjb21iaW5lZCB0eXBlIGluZm8gKi8KLSAgc2NfTmlsLAkJCS8qIDEwNjogQ19ISURERU4gPz8/ICovCi19OwotCi0vKiBDb252ZXJ0IENPRkYgc3RvcmFnZSBjbGFzcyB0byBFQ09GRiBzeW1ib2wgdHlwZS4gICovCi1zdGF0aWMgY29uc3Qgc3RfdCBtYXBfY29mZl9zeW1fdHlwZVtdID0gewotICBzdF9OaWwsCQkJLyogICAwOiBDX05VTEwgKi8KLSAgc3RfTG9jYWwsCQkJLyogICAxOiBDX0FVVE8JICBhdXRvIHZhciAqLwotICBzdF9HbG9iYWwsCQkJLyogICAyOiBDX0VYVAkgIGV4dGVybmFsICovCi0gIHN0X1N0YXRpYywJCQkvKiAgIDM6IENfU1RBVAkgIHN0YXRpYyAqLwotICBzdF9Mb2NhbCwJCQkvKiAgIDQ6IENfUkVHCSAgcmVnaXN0ZXIgKi8KLSAgc3RfR2xvYmFsLAkJCS8qICAgNTogQ19FWFRERUYgID8/PyAqLwotICBzdF9MYWJlbCwJCQkvKiAgIDY6IENfTEFCRUwJICBsYWJlbCAqLwotICBzdF9MYWJlbCwJCQkvKiAgIDc6IENfVUxBQkVMICB1c2VyIGxhYmVsICovCi0gIHN0X01lbWJlciwJCQkvKiAgIDg6IENfTU9TCSAgbWVtYmVyIG9mIHN0cnVjdCAqLwotICBzdF9QYXJhbSwJCQkvKiAgIDk6IENfQVJHCSAgYXJndW1lbnQgKi8KLSAgc3RfQmxvY2ssCQkJLyogIDEwOiBDX1NUUlRBRyAgc3RydWN0IHRhZyAqLwotICBzdF9NZW1iZXIsCQkJLyogIDExOiBDX01PVQkgIG1lbWJlciBvZiB1bmlvbiAqLwotICBzdF9CbG9jaywJCQkvKiAgMTI6IENfVU5UQUcgICB1bmlvbiB0YWcgKi8KLSAgc3RfVHlwZWRlZiwJCQkvKiAgMTM6IENfVFBERUYJICB0eXBlZGVmICovCi0gIHN0X1N0YXRpYywJCQkvKiAgMTQ6IENfVVNUQVRJQyA/Pz8gKi8KLSAgc3RfQmxvY2ssCQkJLyogIDE1OiBDX0VOVEFHCSAgZW51bSB0YWcgKi8KLSAgc3RfTWVtYmVyLAkJCS8qICAxNjogQ19NT0UJICBtZW1iZXIgb2YgZW51bSAqLwotICBzdF9QYXJhbSwJCQkvKiAgMTc6IENfUkVHUEFSTSByZWdpc3RlciBwYXJhbWV0ZXIgKi8KLSAgc3RfTWVtYmVyLAkJCS8qICAxODsgQ19GSUVMRAkgIGJpdGZpZWxkICovCi0gIHN0X05pbCwJCQkvKiAgMTkgKi8KLSAgc3RfTmlsLAkJCS8qICAyMCAqLwotICBzdF9OaWwsCQkJLyogIDIxICovCi0gIHN0X05pbCwJCQkvKiAgMjIgKi8KLSAgc3RfTmlsLAkJCS8qICAyMyAqLwotICBzdF9OaWwsCQkJLyogIDI0ICovCi0gIHN0X05pbCwJCQkvKiAgMjUgKi8KLSAgc3RfTmlsLAkJCS8qICAyNiAqLwotICBzdF9OaWwsCQkJLyogIDI3ICovCi0gIHN0X05pbCwJCQkvKiAgMjggKi8KLSAgc3RfTmlsLAkJCS8qICAyOSAqLwotICBzdF9OaWwsCQkJLyogIDMwICovCi0gIHN0X05pbCwJCQkvKiAgMzEgKi8KLSAgc3RfTmlsLAkJCS8qICAzMiAqLwotICBzdF9OaWwsCQkJLyogIDMzICovCi0gIHN0X05pbCwJCQkvKiAgMzQgKi8KLSAgc3RfTmlsLAkJCS8qICAzNSAqLwotICBzdF9OaWwsCQkJLyogIDM2ICovCi0gIHN0X05pbCwJCQkvKiAgMzcgKi8KLSAgc3RfTmlsLAkJCS8qICAzOCAqLwotICBzdF9OaWwsCQkJLyogIDM5ICovCi0gIHN0X05pbCwJCQkvKiAgNDAgKi8KLSAgc3RfTmlsLAkJCS8qICA0MSAqLwotICBzdF9OaWwsCQkJLyogIDQyICovCi0gIHN0X05pbCwJCQkvKiAgNDMgKi8KLSAgc3RfTmlsLAkJCS8qICA0NCAqLwotICBzdF9OaWwsCQkJLyogIDQ1ICovCi0gIHN0X05pbCwJCQkvKiAgNDYgKi8KLSAgc3RfTmlsLAkJCS8qICA0NyAqLwotICBzdF9OaWwsCQkJLyogIDQ4ICovCi0gIHN0X05pbCwJCQkvKiAgNDkgKi8KLSAgc3RfTmlsLAkJCS8qICA1MCAqLwotICBzdF9OaWwsCQkJLyogIDUxICovCi0gIHN0X05pbCwJCQkvKiAgNTIgKi8KLSAgc3RfTmlsLAkJCS8qICA1MyAqLwotICBzdF9OaWwsCQkJLyogIDU0ICovCi0gIHN0X05pbCwJCQkvKiAgNTUgKi8KLSAgc3RfTmlsLAkJCS8qICA1NiAqLwotICBzdF9OaWwsCQkJLyogIDU3ICovCi0gIHN0X05pbCwJCQkvKiAgNTggKi8KLSAgc3RfTmlsLAkJCS8qICA1OSAqLwotICBzdF9OaWwsCQkJLyogIDYwICovCi0gIHN0X05pbCwJCQkvKiAgNjEgKi8KLSAgc3RfTmlsLAkJCS8qICA2MiAqLwotICBzdF9OaWwsCQkJLyogIDYzICovCi0gIHN0X05pbCwJCQkvKiAgNjQgKi8KLSAgc3RfTmlsLAkJCS8qICA2NSAqLwotICBzdF9OaWwsCQkJLyogIDY2ICovCi0gIHN0X05pbCwJCQkvKiAgNjcgKi8KLSAgc3RfTmlsLAkJCS8qICA2OCAqLwotICBzdF9OaWwsCQkJLyogIDY5ICovCi0gIHN0X05pbCwJCQkvKiAgNzAgKi8KLSAgc3RfTmlsLAkJCS8qICA3MSAqLwotICBzdF9OaWwsCQkJLyogIDcyICovCi0gIHN0X05pbCwJCQkvKiAgNzMgKi8KLSAgc3RfTmlsLAkJCS8qICA3NCAqLwotICBzdF9OaWwsCQkJLyogIDc1ICovCi0gIHN0X05pbCwJCQkvKiAgNzYgKi8KLSAgc3RfTmlsLAkJCS8qICA3NyAqLwotICBzdF9OaWwsCQkJLyogIDc4ICovCi0gIHN0X05pbCwJCQkvKiAgNzkgKi8KLSAgc3RfTmlsLAkJCS8qICA4MCAqLwotICBzdF9OaWwsCQkJLyogIDgxICovCi0gIHN0X05pbCwJCQkvKiAgODIgKi8KLSAgc3RfTmlsLAkJCS8qICA4MyAqLwotICBzdF9OaWwsCQkJLyogIDg0ICovCi0gIHN0X05pbCwJCQkvKiAgODUgKi8KLSAgc3RfTmlsLAkJCS8qICA4NiAqLwotICBzdF9OaWwsCQkJLyogIDg3ICovCi0gIHN0X05pbCwJCQkvKiAgODggKi8KLSAgc3RfTmlsLAkJCS8qICA4OSAqLwotICBzdF9OaWwsCQkJLyogIDkwICovCi0gIHN0X05pbCwJCQkvKiAgOTEgKi8KLSAgc3RfTmlsLAkJCS8qICA5MiAqLwotICBzdF9OaWwsCQkJLyogIDkzICovCi0gIHN0X05pbCwJCQkvKiAgOTQgKi8KLSAgc3RfTmlsLAkJCS8qICA5NSAqLwotICBzdF9OaWwsCQkJLyogIDk2ICovCi0gIHN0X05pbCwJCQkvKiAgOTcgKi8KLSAgc3RfTmlsLAkJCS8qICA5OCAqLwotICBzdF9OaWwsCQkJLyogIDk5ICovCi0gIHN0X0Jsb2NrLAkJCS8qIDEwMDogQ19CTE9DSyAgYmxvY2sgc3RhcnQvZW5kICovCi0gIHN0X1Byb2MsCQkJLyogMTAxOiBDX0ZDTgkgZnVuY3Rpb24gc3RhcnQvZW5kICovCi0gIHN0X0VuZCwJCQkvKiAxMDI6IENfRU9TCSBlbmQgb2Ygc3RydWN0L3VuaW9uL2VudW0gKi8KLSAgc3RfRmlsZSwJCQkvKiAxMDM6IENfRklMRQkgZmlsZSBzdGFydCAqLwotICBzdF9OaWwsCQkJLyogMTA0OiBDX0xJTkUJIGxpbmUgbnVtYmVyICovCi0gIHN0X05pbCwJCQkvKiAxMDU6IENfQUxJQVMJIGNvbWJpbmVkIHR5cGUgaW5mbyAqLwotICBzdF9OaWwsCQkJLyogMTA2OiBDX0hJRERFTiA/Pz8gKi8KLX07Ci0KLQotLyogS2VlcCB0cmFjayBvZiBkaWZmZXJlbnQgc2l6ZWQgYWxsb2NhdGlvbiByZXF1ZXN0cy4gICovCi1zdGF0aWMgYWxsb2NfaW5mb190IGFsbG9jX2NvdW50c1sgKGludClhbGxvY190eXBlX2xhc3QgXTsKLQwKLS8qIFJlY29yZCB3aGV0aGVyIHdlIGhhdmUgc2VlbiBhbnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLWludCBlY29mZl9kZWJ1Z2dpbmdfc2VlbiA9IDA7Ci0KLS8qIFZhcmlvdXMgc3RhdGljcy4gICovCi1zdGF0aWMgZWZkcl90ICAqY3VyX2ZpbGVfcHRyCT0gKGVmZHJfdCAqKSAwOwkvKiBjdXJyZW50IGZpbGUgZGVzYy4gaGVhZGVyICovCi1zdGF0aWMgcHJvY190ICAqY3VyX3Byb2NfcHRyCT0gKHByb2NfdCAqKSAwOwkvKiBjdXJyZW50IHByb2NlZHVyZSBoZWFkZXIgKi8KLXN0YXRpYyBwcm9jX3QgICpmaXJzdF9wcm9jX3B0ciAgPSAocHJvY190ICopIDA7IC8qIGZpcnN0IHByb2NlZHVyZSBoZWFkZXIgKi8KLXN0YXRpYyB0aGVhZF90ICp0b3BfdGFnX2hlYWQJPSAodGhlYWRfdCAqKSAwOyAvKiB0b3AgbGV2ZWwgdGFnIGhlYWQgKi8KLXN0YXRpYyB0aGVhZF90ICpjdXJfdGFnX2hlYWQJPSAodGhlYWRfdCAqKSAwOyAvKiBjdXJyZW50IHRhZyBoZWFkICovCi0jaWZkZWYgRUNPRkZfREVCVUcKLXN0YXRpYyBpbnQJZGVidWcJCT0gMDsgCQkvKiB0cmFjZSBmdW5jdGlvbnMgKi8KLSNlbmRpZgotc3RhdGljIGludAlzdGFic19zZWVuCT0gMDsJCS8qICE9IDAgaWYgc3RhYnMgaGF2ZSBiZWVuIHNlZW4gKi8KLQotc3RhdGljIGludCBjdXJyZW50X2ZpbGVfaWR4Owotc3RhdGljIGNvbnN0IGNoYXIgKmN1cnJlbnRfc3RhYnNfZmlsZW5hbWU7Ci0KLS8qIFBzZXVkbyBzeW1ib2wgdG8gdXNlIHdoZW4gcHV0dGluZyBzdGFicyBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotI2lmbmRlZiBTVEFCU19TWU1CT0wKLSNkZWZpbmUgU1RBQlNfU1lNQk9MICJAc3RhYnMiCi0jZW5kaWYKLQotc3RhdGljIGNoYXIgc3RhYnNfc3ltYm9sW10gPSBTVEFCU19TWU1CT0w7Ci0MCi0vKiBQcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGlzIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZCBhZGRfdmFycmF5X3BhZ2UgUEFSQU1TICgodmFycmF5X3QgKnZwKSk7Ci1zdGF0aWMgc3ltaW50X3QgYWRkX3N0cmluZyBQQVJBTVMgKCh2YXJyYXlfdCAqdnAsCi0JCQkJICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhc2hfdGJsLAotCQkJCSAgICBjb25zdCBjaGFyICpzdHIsCi0JCQkJICAgIHNoYXNoX3QgKipyZXRfaGFzaCkpOwotc3RhdGljIGxvY2Fsc3ltX3QgKmFkZF9lY29mZl9zeW1ib2wgUEFSQU1TICgoY29uc3QgY2hhciAqc3RyLCBzdF90IHR5cGUsCi0JCQkJCSAgICAgc2NfdCBzdG9yYWdlLCBzeW1ib2xTICpzeW0sCi0JCQkJCSAgICAgYmZkX3ZtYSBhZGRlbmQsIHN5bWludF90IHZhbHVlLAotCQkJCQkgICAgIHN5bWludF90IGluZHgpKTsKLXN0YXRpYyBzeW1pbnRfdCBhZGRfYXV4X3N5bV9zeW1pbnQgUEFSQU1TICgoc3ltaW50X3QgYXV4X3dvcmQpKTsKLXN0YXRpYyBzeW1pbnRfdCBhZGRfYXV4X3N5bV9ybmR4IFBBUkFNUyAoKGludCBmaWxlX2luZGV4LAotCQkJCQkgIHN5bWludF90IHN5bV9pbmRleCkpOwotc3RhdGljIHN5bWludF90IGFkZF9hdXhfc3ltX3RpciBQQVJBTVMgKCh0eXBlX2luZm9fdCAqdCwKLQkJCQkJIGhhc2hfc3RhdGVfdCBzdGF0ZSwKLQkJCQkJIHRoYXNoX3QgKipoYXNoX3RibCkpOwotc3RhdGljIHRhZ190ICpnZXRfdGFnIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnRhZywgbG9jYWxzeW1fdCAqc3ltLAotCQkJICAgICAgIGJ0X3QgYmFzaWNfdHlwZSkpOwotc3RhdGljIHZvaWQgYWRkX3Vua25vd25fdGFnIFBBUkFNUyAoKHRhZ190ICpwdGFnKSk7Ci1zdGF0aWMgdm9pZCBhZGRfcHJvY2VkdXJlIFBBUkFNUyAoKGNoYXIgKmZ1bmMpKTsKLXN0YXRpYyB2b2lkIGFkZF9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgaW50IGluZHgsIGludCBmYWtlKSk7Ci0jaWZkZWYgRUNPRkZfREVCVUcKLXN0YXRpYyBjaGFyICpzY190b19zdHJpbmcgUEFSQU1TICgoc2NfdCBzdG9yYWdlX2NsYXNzKSk7Ci1zdGF0aWMgY2hhciAqc3RfdG9fc3RyaW5nIFBBUkFNUyAoKHN0X3Qgc3ltYm9sX3R5cGUpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgbWFya19zdGFicyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBjaGFyICplY29mZl9hZGRfYnl0ZXMgUEFSQU1TICgoY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkJCQkgICAgICBjaGFyICpidWZwdHIsIHVuc2lnbmVkIGxvbmcgbmVlZCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfcGFkZGluZ19hZGp1c3QKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQsIGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCi0JICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGNoYXIgKipidWZwdHJwdHIpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVjb2ZmX2J1aWxkX2xpbmVubwotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgbG9uZyAqbGluZWNudHB0cikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfc3ltYm9scwotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfcHJvY3MKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQsIGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCi0JICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVjb2ZmX2J1aWxkX2F1eAotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfc3RyaW5ncyBQQVJBTVMgKChjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCQkJCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwKLQkJCQkJCSAgdmFycmF5X3QgKnZwKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBlY29mZl9idWlsZF9zcwotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfZmRyCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kLCBjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zZXR1cF9leHQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHBhZ2VfdHlwZSAqYWxsb2NhdGVfY2x1c3RlciBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIG5wYWdlcykpOwotc3RhdGljIHBhZ2VfdHlwZSAqYWxsb2NhdGVfcGFnZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgc2NvcGVfdCAqYWxsb2NhdGVfc2NvcGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZnJlZV9zY29wZSBQQVJBTVMgKChzY29wZV90ICpwdHIpKTsKLXN0YXRpYyB2bGlua3NfdCAqYWxsb2NhdGVfdmxpbmtzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBzaGFzaF90ICphbGxvY2F0ZV9zaGFzaCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdGhhc2hfdCAqYWxsb2NhdGVfdGhhc2ggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHRhZ190ICphbGxvY2F0ZV90YWcgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZnJlZV90YWcgUEFSQU1TICgodGFnX3QgKnB0cikpOwotc3RhdGljIGZvcndhcmRfdCAqYWxsb2NhdGVfZm9yd2FyZCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdGhlYWRfdCAqYWxsb2NhdGVfdGhlYWQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZnJlZV90aGVhZCBQQVJBTVMgKCh0aGVhZF90ICpwdHIpKTsKLXN0YXRpYyBsaW5lbm9fbGlzdF90ICphbGxvY2F0ZV9saW5lbm9fbGlzdCBQQVJBTVMgKCh2b2lkKSk7Ci0MCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgYXNzZW1ibGVyIHN0YXJ0cyB1cC4gICovCi0KLXZvaWQKLWVjb2ZmX3JlYWRfYmVnaW5faG9vayAoKQotewotICB0YWdfaGFzaCA9IGhhc2hfbmV3ICgpOwotICB0b3BfdGFnX2hlYWQgPSBhbGxvY2F0ZV90aGVhZCAoKTsKLSAgdG9wX3RhZ19oZWFkLT5maXJzdF90YWcgPSAodGFnX3QgKikgTlVMTDsKLSAgdG9wX3RhZ19oZWFkLT5mcmVlID0gKHRoZWFkX3QgKikgTlVMTDsKLSAgdG9wX3RhZ19oZWFkLT5wcmV2ID0gY3VyX3RhZ19oZWFkOwotICBjdXJfdGFnX2hlYWQgPSB0b3BfdGFnX2hlYWQ7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgc3ltYm9sIGlzIGNyZWF0ZWQuICAqLwotCi12b2lkCi1lY29mZl9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSBmaWxlIHBvaW50ZXIsIGJ1dCBvbmx5IGlmIHdlIGhhdmUgc2VlbiBhCi0gICAgIGZpbGUuICBJZiB3ZSBoYXZlbid0IHNlZW4gYSBmaWxlLCB0aGVuIHRoaXMgaXMgYSBwcm9iYWJseSBzcGVjaWFsCi0gICAgIHN5bWJvbCBjcmVhdGVkIGJ5IG1kX2JlZ2luIHdoaWNoIG1heSByZXF1aXJlZCBzcGVjaWFsIGhhbmRsaW5nIGF0Ci0gICAgIHNvbWUgcG9pbnQuICBDcmVhdGluZyBhIGR1bW15IGZpbGUgd2l0aCBhIGR1bW15IG5hbWUgaXMgY2VydGFpbmx5Ci0gICAgIHdyb25nLiAgKi8KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwKLSAgICAgICYmIHNlZW5fYXRfbGVhc3RfMV9maWxlICgpKQotICAgIGFkZF9maWxlICgoY29uc3QgY2hhciAqKSBOVUxMLCAwLCAxKTsKLSAgc3ltYm9sUC0+ZWNvZmZfZmlsZSA9IGN1cl9maWxlX3B0cjsKLSAgc3ltYm9sUC0+ZWNvZmZfc3ltYm9sID0gTlVMTDsKLSAgc3ltYm9sUC0+ZWNvZmZfZXh0ZXJuX3NpemUgPSAwOwotfQotDAotLyogQWRkIGEgcGFnZSB0byBhIHZhcnJheSBvYmplY3QuICAqLwotCi1zdGF0aWMgdm9pZAotYWRkX3ZhcnJheV9wYWdlICh2cCkKLSAgICAgdmFycmF5X3QgKnZwOwkJCQkvKiB2YXJyYXkgdG8gYWRkIHBhZ2UgdG8gKi8KLXsKLSAgdmxpbmtzX3QgKm5ld19saW5rcyA9IGFsbG9jYXRlX3ZsaW5rcyAoKTsKLQotI2lmZGVmIE1BTExPQ19DSEVDSwotICBpZiAodnAtPm9iamVjdF9zaXplID4gMSkKLSAgICBuZXdfbGlua3MtPmRhdHVtID0gKHBhZ2VfdHlwZSAqKSB4Y2FsbG9jICgxLCB2cC0+b2JqZWN0X3NpemUpOwotICBlbHNlCi0jZW5kaWYKLSAgICBuZXdfbGlua3MtPmRhdHVtID0gYWxsb2NhdGVfcGFnZSAoKTsKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZhcnJheV0udG90YWxfYWxsb2MrKzsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92YXJyYXldLnRvdGFsX3BhZ2VzKys7Ci0KLSAgbmV3X2xpbmtzLT5zdGFydF9pbmRleCA9IHZwLT5udW1fYWxsb2NhdGVkOwotICB2cC0+b2JqZWN0c19sYXN0X3BhZ2UgPSAwOwotCi0gIGlmICh2cC0+Zmlyc3QgPT0gKHZsaW5rc190ICopIE5VTEwpCQkvKiBmaXJzdCBhbGxvY2F0aW9uPyAqLwotICAgIHZwLT5maXJzdCA9IHZwLT5sYXN0ID0gbmV3X2xpbmtzOwotICBlbHNlCi0gICAgewkJCQkJCS8qIDJuZCBvciBncmVhdGVyIGFsbG9jYXRpb24gKi8KLSAgICAgIG5ld19saW5rcy0+cHJldiA9IHZwLT5sYXN0OwotICAgICAgdnAtPmxhc3QtPm5leHQgPSBuZXdfbGlua3M7Ci0gICAgICB2cC0+bGFzdCA9IG5ld19saW5rczsKLSAgICB9Ci19Ci0MCi0vKiBBZGQgYSBzdHJpbmcgKGFuZCBudWxsIHBhZCkgdG8gb25lIG9mIHRoZSBzdHJpbmcgdGFibGVzLiAgKi8KLQotc3RhdGljIHN5bWludF90Ci1hZGRfc3RyaW5nICh2cCwgaGFzaF90YmwsIHN0ciwgcmV0X2hhc2gpCi0gICAgIHZhcnJheV90ICp2cDsJCQkvKiBzdHJpbmcgb2JzdGFjayAqLwotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpoYXNoX3RibDsJLyogcHRyIHRvIGhhc2ggdGFibGUgKi8KLSAgICAgY29uc3QgY2hhciAqc3RyOwkJCS8qIHN0cmluZyAqLwotICAgICBzaGFzaF90ICoqcmV0X2hhc2g7CQkvKiByZXR1cm4gaGFzaCBwb2ludGVyICovCi17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbGVuID0gc3RybGVuIChzdHIpOwotICByZWdpc3RlciBzaGFzaF90ICpoYXNoX3B0cjsKLQotICBpZiAobGVuID49IFBBR0VfVVNJWkUpCi0gICAgYXNfZmF0YWwgKF8oIlN0cmluZyB0b28gYmlnICglbHUgYnl0ZXMpIiksIGxlbik7Ci0KLSAgaGFzaF9wdHIgPSAoc2hhc2hfdCAqKSBoYXNoX2ZpbmQgKGhhc2hfdGJsLCBzdHIpOwotICBpZiAoaGFzaF9wdHIgPT0gKHNoYXNoX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBjb25zdCBjaGFyICplcnI7Ci0KLSAgICAgIGlmICh2cC0+b2JqZWN0c19sYXN0X3BhZ2UgKyBsZW4gPj0gUEFHRV9VU0laRSkKLSAgICAgICAgewotICAgICAgICAgIHZwLT5udW1fYWxsb2NhdGVkID0KLSAgICAgICAgICAgICgodnAtPm51bV9hbGxvY2F0ZWQgKyBQQUdFX1VTSVpFIC0gMSkgLyBQQUdFX1VTSVpFKSAqIFBBR0VfVVNJWkU7Ci0gICAgICAgICAgYWRkX3ZhcnJheV9wYWdlICh2cCk7Ci0gICAgICAgIH0KLQotICAgICAgaGFzaF9wdHIgPSBhbGxvY2F0ZV9zaGFzaCAoKTsKLSAgICAgIGhhc2hfcHRyLT5pbmR4ID0gdnAtPm51bV9hbGxvY2F0ZWQ7Ci0KLSAgICAgIGhhc2hfcHRyLT5zdHJpbmcgPSAmdnAtPmxhc3QtPmRhdHVtLT5ieXRlW3ZwLT5vYmplY3RzX2xhc3RfcGFnZV07Ci0KLSAgICAgIHZwLT5vYmplY3RzX2xhc3RfcGFnZSArPSBsZW4gKyAxOwotICAgICAgdnAtPm51bV9hbGxvY2F0ZWQgKz0gbGVuICsgMTsKLQotICAgICAgc3RyY3B5IChoYXNoX3B0ci0+c3RyaW5nLCBzdHIpOwotCi0gICAgICBlcnIgPSBoYXNoX2luc2VydCAoaGFzaF90YmwsIHN0ciwgKGNoYXIgKikgaGFzaF9wdHIpOwotICAgICAgaWYgKGVycikKLQlhc19mYXRhbCAoXygiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN0cmluZyBoYXNoIHRhYmxlOiAlcyIpLAotCQkgIHN0ciwgZXJyKTsKLSAgICB9Ci0KLSAgaWYgKHJldF9oYXNoICE9IChzaGFzaF90ICoqKSBOVUxMKQotICAgICpyZXRfaGFzaCA9IGhhc2hfcHRyOwotCi0gIHJldHVybiBoYXNoX3B0ci0+aW5keDsKLX0KLQwKLS8qIEFkZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgKi8KLQotc3RhdGljIGxvY2Fsc3ltX3QgKgotYWRkX2Vjb2ZmX3N5bWJvbCAoc3RyLCB0eXBlLCBzdG9yYWdlLCBzeW1fdmFsdWUsIGFkZGVuZCwgdmFsdWUsIGluZHgpCi0gICAgIGNvbnN0IGNoYXIgKnN0cjsJCQkvKiBzeW1ib2wgbmFtZSAqLwotICAgICBzdF90IHR5cGU7CQkJCS8qIHN5bWJvbCB0eXBlICovCi0gICAgIHNjX3Qgc3RvcmFnZTsJCQkvKiBzdG9yYWdlIGNsYXNzICovCi0gICAgIHN5bWJvbFMgKnN5bV92YWx1ZTsJCS8qIGFzc29jaWF0ZWQgc3ltYm9sLiAgKi8KLSAgICAgYmZkX3ZtYSBhZGRlbmQ7CQkJLyogYWRkZW5kIHRvIHN5bV92YWx1ZS4gICovCi0gICAgIHN5bWludF90IHZhbHVlOwkJCS8qIHZhbHVlIG9mIHN5bWJvbCAqLwotICAgICBzeW1pbnRfdCBpbmR4OwkJCS8qIGluZGV4IHRvIGxvY2FsL2F1eC4gc3ltcyAqLwotewotICBsb2NhbHN5bV90ICpwc3ltOwotICByZWdpc3RlciBzY29wZV90ICpwc2NvcGU7Ci0gIHJlZ2lzdGVyIHRoZWFkX3QgKnB0YWdfaGVhZDsKLSAgcmVnaXN0ZXIgdGFnX3QgKnB0YWc7Ci0gIHJlZ2lzdGVyIHRhZ190ICpwdGFnX25leHQ7Ci0gIHJlZ2lzdGVyIHZhcnJheV90ICp2cDsKLSAgcmVnaXN0ZXIgaW50IHNjb3BlX2RlbHRhID0gMDsKLSAgc2hhc2hfdCAqaGFzaF9wdHIgPSAoc2hhc2hfdCAqKSBOVUxMOwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIpKTsKLQotICB2cCA9ICZjdXJfZmlsZV9wdHItPnN5bWJvbHM7Ci0KLSBpZiAodnAtPm9iamVjdHNfbGFzdF9wYWdlID09IHZwLT5vYmplY3RzX3Blcl9wYWdlKQotICAgIGFkZF92YXJyYXlfcGFnZSAodnApOwotCi0gIHBzeW0gPSAmdnAtPmxhc3QtPmRhdHVtLT5zeW1bIHZwLT5vYmplY3RzX2xhc3RfcGFnZSsrIF07Ci0KLSAgaWYgKHN0ciA9PSAoY29uc3QgY2hhciAqKSBOVUxMICYmIHN5bV92YWx1ZSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHBzeW0tPm5hbWUgPSBTX0dFVF9OQU1FIChzeW1fdmFsdWUpOwotICBlbHNlCi0gICAgcHN5bS0+bmFtZSA9IHN0cjsKLSAgcHN5bS0+YXNfc3ltID0gc3ltX3ZhbHVlOwotICBpZiAoc3ltX3ZhbHVlICE9IChzeW1ib2xTICopIE5VTEwpCi0gICAgc3ltX3ZhbHVlLT5lY29mZl9zeW1ib2wgPSBwc3ltOwotICBwc3ltLT5hZGRlbmQgPSBhZGRlbmQ7Ci0gIHBzeW0tPmZpbGVfcHRyID0gY3VyX2ZpbGVfcHRyOwotICBwc3ltLT5wcm9jX3B0ciA9IGN1cl9wcm9jX3B0cjsKLSAgcHN5bS0+YmVnaW5fcHRyID0gKGxvY2Fsc3ltX3QgKikgTlVMTDsKLSAgcHN5bS0+aW5kZXhfcHRyID0gKGF1eF90ICopIE5VTEw7Ci0gIHBzeW0tPmZvcndhcmRfcmVmID0gKGZvcndhcmRfdCAqKSBOVUxMOwotICBwc3ltLT5zeW1faW5kZXggPSAtMTsKLSAgbWVtc2V0ICgmcHN5bS0+ZWNvZmZfc3ltLCAwLCBzaXplb2YgKEVYVFIpKTsKLSAgcHN5bS0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgPSB2YWx1ZTsKLSAgcHN5bS0+ZWNvZmZfc3ltLmFzeW0uc3QgPSAodW5zaWduZWQpIHR5cGU7Ci0gIHBzeW0tPmVjb2ZmX3N5bS5hc3ltLnNjID0gKHVuc2lnbmVkKSBzdG9yYWdlOwotICBwc3ltLT5lY29mZl9zeW0uYXN5bS5pbmRleCA9IGluZHg7Ci0KLSAgLyogSWYgdGhlcmUgaXMgYW4gYXNzb2NpYXRlZCBzeW1ib2wsIHdlIHdhaXQgdW50aWwgdGhlIGVuZCBvZiB0aGUKLSAgICAgYXNzZW1ibHkgYmVmb3JlIGRlY2lkaW5nIHdoZXJlIHRvIHB1dCB0aGUgbmFtZSAoaXQgbWF5IGJlIGp1c3QgYW4KLSAgICAgZXh0ZXJuYWwgc3ltYm9sKS4gIE90aGVyd2lzZSwgdGhpcyBpcyBqdXN0IGEgZGVidWdnaW5nIHN5bWJvbCBhbmQKLSAgICAgdGhlIG5hbWUgc2hvdWxkIGdvIHdpdGggdGhlIGN1cnJlbnQgZmlsZS4gICovCi0gIGlmIChzeW1fdmFsdWUgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICBwc3ltLT5lY29mZl9zeW0uYXN5bS5pc3MgPSAoKHN0ciA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQotCQkJCT8gMAotCQkJCTogYWRkX3N0cmluZyAoJmN1cl9maWxlX3B0ci0+c3RyaW5ncywKLQkJCQkJICAgICAgY3VyX2ZpbGVfcHRyLT5zdHJfaGFzaCwKLQkJCQkJICAgICAgc3RyLAotCQkJCQkgICAgICAmaGFzaF9wdHIpKTsKLQotICArK3ZwLT5udW1fYWxsb2NhdGVkOwotCi0gIGlmIChFQ09GRl9JU19TVEFCICgmcHN5bS0+ZWNvZmZfc3ltLmFzeW0pKQotICAgIHJldHVybiBwc3ltOwotCi0gIC8qIFNhdmUgdGhlIHN5bWJvbCB3aXRoaW4gdGhlIGhhc2ggdGFibGUgaWYgdGhpcyBpcyBhIHN0YXRpYwotICAgICBpdGVtLCBhbmQgaXQgaGFzIGEgbmFtZS4gICovCi0gIGlmIChoYXNoX3B0ciAhPSAoc2hhc2hfdCAqKSBOVUxMCi0gICAgICAmJiAodHlwZSA9PSBzdF9HbG9iYWwgfHwgdHlwZSA9PSBzdF9TdGF0aWMgfHwgdHlwZSA9PSBzdF9MYWJlbAotCSAgfHwgdHlwZSA9PSBzdF9Qcm9jIHx8IHR5cGUgPT0gc3RfU3RhdGljUHJvYykpCi0gICAgaGFzaF9wdHItPnN5bV9wdHIgPSBwc3ltOwotCi0gIC8qIHB1c2ggb3IgcG9wIGEgc2NvcGUgaWYgYXBwcm9wcmlhdGUuICAqLwotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2Ugc3RfRmlsZToJCQkvKiBiZWdpbm5pbmcgb2YgZmlsZSAqLwotICAgIGNhc2Ugc3RfUHJvYzoJCQkvKiBwcm9jZWR1cmUgKi8KLSAgICBjYXNlIHN0X1N0YXRpY1Byb2M6CQkJLyogc3RhdGljIHByb2NlZHVyZSAqLwotICAgIGNhc2Ugc3RfQmxvY2s6CQkJLyogYmVnaW4gc2NvcGUgKi8KLSAgICAgIHBzY29wZSA9IGFsbG9jYXRlX3Njb3BlICgpOwotICAgICAgcHNjb3BlLT5wcmV2ID0gY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGU7Ci0gICAgICBwc2NvcGUtPmxzeW0gPSBwc3ltOwotICAgICAgcHNjb3BlLT50eXBlID0gdHlwZTsKLSAgICAgIGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlID0gcHNjb3BlOwotCi0gICAgICBpZiAodHlwZSAhPSBzdF9GaWxlKQotCXNjb3BlX2RlbHRhID0gMTsKLQotICAgICAgLyogRm9yIGV2ZXJ5IGJsb2NrIHR5cGUgZXhjZXB0IGZpbGUsIHN0cnVjdCwgdW5pb24sIG9yCi0JIGVudW1lcmF0aW9uIGJsb2NrcywgcHVzaCBhIGxldmVsIG9uIHRoZSB0YWcgc3RhY2suICBXZSBvbWl0Ci0JIGZpbGUgdHlwZXMsIHNvIHRoYXQgdGFncyBjYW4gc3BhbiBmaWxlIGJvdW5kYXJpZXMuICAqLwotICAgICAgaWYgKHR5cGUgIT0gc3RfRmlsZSAmJiBzdG9yYWdlICE9IHNjX0luZm8pCi0JewotCSAgcHRhZ19oZWFkID0gYWxsb2NhdGVfdGhlYWQgKCk7Ci0JICBwdGFnX2hlYWQtPmZpcnN0X3RhZyA9IDA7Ci0JICBwdGFnX2hlYWQtPnByZXYgPSBjdXJfdGFnX2hlYWQ7Ci0JICBjdXJfdGFnX2hlYWQgPSBwdGFnX2hlYWQ7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHN0X0VuZDoKLSAgICAgIHBzY29wZSA9IGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlOwotICAgICAgaWYgKHBzY29wZSA9PSAoc2NvcGVfdCAqKSBOVUxMKQotCWFzX2ZhdGFsIChfKCJ0b28gbWFueSBzdF9FbmQncyIpKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdF90IGJlZ2luX3R5cGUgPSAoc3RfdCkgcHNjb3BlLT5sc3ltLT5lY29mZl9zeW0uYXN5bS5zdDsKLQotCSAgcHN5bS0+YmVnaW5fcHRyID0gcHNjb3BlLT5sc3ltOwotCi0JICBpZiAoYmVnaW5fdHlwZSAhPSBzdF9GaWxlKQotCSAgICBzY29wZV9kZWx0YSA9IC0xOwotCi0JICAvKiBFeGNlcHQgZm9yIGZpbGUsIHN0cnVjdHVyZSwgdW5pb24sIG9yIGVudW1lcmF0aW9uIGVuZAotCSAgICAgYmxvY2tzIHJlbW92ZSBhbGwgdGFncyBjcmVhdGVkIHdpdGhpbiB0aGlzIHNjb3BlLiAgKi8KLQkgIGlmIChiZWdpbl90eXBlICE9IHN0X0ZpbGUgJiYgc3RvcmFnZSAhPSBzY19JbmZvKQotCSAgICB7Ci0JICAgICAgcHRhZ19oZWFkID0gY3VyX3RhZ19oZWFkOwotCSAgICAgIGN1cl90YWdfaGVhZCA9IHB0YWdfaGVhZC0+cHJldjsKLQotCSAgICAgIGZvciAocHRhZyA9IHB0YWdfaGVhZC0+Zmlyc3RfdGFnOwotCQkgICBwdGFnICE9ICh0YWdfdCAqKSBOVUxMOwotCQkgICBwdGFnID0gcHRhZ19uZXh0KQotCQl7Ci0JCSAgaWYgKHB0YWctPmZvcndhcmRfcmVmICE9IChmb3J3YXJkX3QgKikgTlVMTCkKLQkJICAgIGFkZF91bmtub3duX3RhZyAocHRhZyk7Ci0KLQkJICBwdGFnX25leHQgPSBwdGFnLT5zYW1lX2Jsb2NrOwotCQkgIHB0YWctPmhhc2hfcHRyLT50YWdfcHRyID0gcHRhZy0+c2FtZV9uYW1lOwotCQkgIGZyZWVfdGFnIChwdGFnKTsKLQkJfQotCi0JICAgICAgZnJlZV90aGVhZCAocHRhZ19oZWFkKTsKLQkgICAgfQotCi0JICBjdXJfZmlsZV9wdHItPmN1cl9zY29wZSA9IHBzY29wZS0+cHJldjsKLQotCSAgLyogYmxvY2sgYmVnaW4gZ2V0cyBuZXh0IHN5bSAjLiAgVGhpcyBpcyBzZXQgd2hlbiB3ZSBrbm93Ci0JICAgICB0aGUgc3ltYm9sIGluZGV4IHZhbHVlLiAgKi8KLQotCSAgLyogRnVuY3Rpb25zIHB1c2ggdHdvIG9yIG1vcmUgYXV4IHdvcmRzIGFzIGZvbGxvd3M6Ci0JICAgICAxc3Qgd29yZDogaW5kZXgrMSBvZiB0aGUgZW5kIHN5bWJvbCAoZmlsbGVkIGluIGxhdGVyKS4KLQkgICAgIDJuZCB3b3JkOiB0eXBlIG9mIHRoZSBmdW5jdGlvbiAocGx1cyBhbnkgYXV4IHdvcmRzIG5lZWRlZCkuCi0JICAgICBBbHNvLCB0aWUgdGhlIGV4dGVybmFsIHBvaW50ZXIgYmFjayB0byB0aGUgZnVuY3Rpb24gYmVnaW4gc3ltYm9sLiAgKi8KLQkgIGlmIChiZWdpbl90eXBlICE9IHN0X0ZpbGUgJiYgYmVnaW5fdHlwZSAhPSBzdF9CbG9jaykKLQkgICAgewotCSAgICAgIHN5bWludF90IHR5OwotCSAgICAgIHZhcnJheV90ICpzdnAgPSAmY3VyX2ZpbGVfcHRyLT5hdXhfc3ltczsKLQotCSAgICAgIHBzY29wZS0+bHN5bS0+ZWNvZmZfc3ltLmFzeW0uaW5kZXggPSBhZGRfYXV4X3N5bV9zeW1pbnQgKDApOwotCSAgICAgIHBzY29wZS0+bHN5bS0+aW5kZXhfcHRyID0KLQkJJnN2cC0+bGFzdC0+ZGF0dW0tPmF1eFtzdnAtPm9iamVjdHNfbGFzdF9wYWdlIC0gMV07Ci0JICAgICAgdHkgPSBhZGRfYXV4X3N5bV90aXIgKCZsYXN0X2Z1bmNfdHlwZV9pbmZvLAotCQkJCSAgICBoYXNoX25vLAotCQkJCSAgICAmY3VyX2ZpbGVfcHRyLT50aGFzaF9oZWFkWzBdKTsKLQotLyogVGhpcyBzZWVtcyB0byBiZSB1bm5lY2Vzc2FyeS4gIEknbSBub3QgZXZlbiBzdXJlIHdoYXQgaXQgaXMKLSAqIGludGVuZGVkIHRvIGRvLiAgSXQncyBmcm9tIG1pcHMtdGZpbGUuCi0gKgkgICAgICBpZiAobGFzdF9mdW5jX3N5bV92YWx1ZSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICoJCXsKLSAqCQkgIGxhc3RfZnVuY19zeW1fdmFsdWUtPmlmZCA9IGN1cl9maWxlX3B0ci0+ZmlsZV9pbmRleDsKLSAqCQkgIGxhc3RfZnVuY19zeW1fdmFsdWUtPmluZGV4ID0gdHk7Ci0gKgkJfQotICovCi0JICAgIH0KLQotCSAgZnJlZV9zY29wZSAocHNjb3BlKTsKLQl9Ci0gICAgfQotCi0gIGN1cl9maWxlX3B0ci0+bmVzdGVkX3Njb3BlcyArPSBzY29wZV9kZWx0YTsKLQotI2lmZGVmIEVDT0ZGX0RFQlVHCi0gIGlmIChkZWJ1ZyAmJiB0eXBlICE9IHN0X0ZpbGUKLSAgICAgICYmIChkZWJ1ZyA+IDIgfHwgdHlwZSA9PSBzdF9CbG9jayB8fCB0eXBlID09IHN0X0VuZAotCSAgfHwgdHlwZSA9PSBzdF9Qcm9jIHx8IHR5cGUgPT0gc3RfU3RhdGljUHJvYykpCi0gICAgewotICAgICAgY2hhciAqc2Nfc3RyID0gc2NfdG9fc3RyaW5nIChzdG9yYWdlKTsKLSAgICAgIGNoYXIgKnN0X3N0ciA9IHN0X3RvX3N0cmluZyAodHlwZSk7Ci0gICAgICBpbnQgZGVwdGggPSBjdXJfZmlsZV9wdHItPm5lc3RlZF9zY29wZXMgKyAoc2NvcGVfZGVsdGEgPCAwKTsKLQotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICAiXHRsc3ltXHR2PSAlMTBsZCwgZGVwdGg9ICUyZCwgc2M9ICUtMTJzIiwKLQkgICAgICAgdmFsdWUsIGRlcHRoLCBzY19zdHIpOwotCi0gICAgICBpZiAoc3RyX3N0YXJ0ICYmIHN0cl9lbmRfcDEgLSBzdHJfc3RhcnQgPiAwKQotCWZwcmludGYgKHN0ZGVyciwgIiBzdD0gJS0xMXMgbmFtZT0gJS4qc1xuIiwgc3Rfc3RyLCBzdHJfZW5kX3AxIC0gc3RyX3N0YXJ0LCBzdHJfc3RhcnQpOwotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgbGVuID0gc3RybGVuIChzdF9zdHIpOwotCSAgZnByaW50ZiAoc3RkZXJyLCAiIHN0PSAlLipzXG4iLCBsZW4tMSwgc3Rfc3RyKTsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIHBzeW07Ci19Ci0MCi0vKiBBZGQgYW4gYXV4aWxpYXJ5IHN5bWJvbCAocGFzc2luZyBhIHN5bWludCkuICBUaGlzIGlzIGFjdHVhbGx5IHVzZWQKLSAgIGZvciBpbnRlZ3JhbCBhdXggdHlwZXMsIG5vdCBqdXN0IHN5bWludHMuICAqLwotCi1zdGF0aWMgc3ltaW50X3QKLWFkZF9hdXhfc3ltX3N5bWludCAoYXV4X3dvcmQpCi0gICAgIHN5bWludF90IGF1eF93b3JkOwkJLyogYXV4aWxpYXJ5IGluZm9ybWF0aW9uIHdvcmQgKi8KLXsKLSAgcmVnaXN0ZXIgdmFycmF5X3QgKnZwOwotICByZWdpc3RlciBhdXhfdCAqYXV4X3B0cjsKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICBhc19mYXRhbCAoXygibm8gY3VycmVudCBmaWxlIHBvaW50ZXIiKSk7Ci0KLSAgdnAgPSAmY3VyX2ZpbGVfcHRyLT5hdXhfc3ltczsKLQotICBpZiAodnAtPm9iamVjdHNfbGFzdF9wYWdlID09IHZwLT5vYmplY3RzX3Blcl9wYWdlKQotICAgIGFkZF92YXJyYXlfcGFnZSAodnApOwotCi0gIGF1eF9wdHIgPSAmdnAtPmxhc3QtPmRhdHVtLT5hdXhbdnAtPm9iamVjdHNfbGFzdF9wYWdlKytdOwotICBhdXhfcHRyLT50eXBlID0gYXV4X2lzeW07Ci0gIGF1eF9wdHItPmRhdGEuaXN5bSA9IGF1eF93b3JkOwotCi0gIHJldHVybiB2cC0+bnVtX2FsbG9jYXRlZCsrOwotfQotCi0KLS8qIEFkZCBhbiBhdXhpbGlhcnkgc3ltYm9sIChwYXNzaW5nIGEgZmlsZS9zeW1ib2wgaW5kZXggY29tYm8pLiAgKi8KLQotc3RhdGljIHN5bWludF90Ci1hZGRfYXV4X3N5bV9ybmR4IChmaWxlX2luZGV4LCBzeW1faW5kZXgpCi0gICAgIGludCBmaWxlX2luZGV4OwotICAgICBzeW1pbnRfdCBzeW1faW5kZXg7Ci17Ci0gIHJlZ2lzdGVyIHZhcnJheV90ICp2cDsKLSAgcmVnaXN0ZXIgYXV4X3QgKmF1eF9wdHI7Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oIm5vIGN1cnJlbnQgZmlsZSBwb2ludGVyIikpOwotCi0gIHZwID0gJmN1cl9maWxlX3B0ci0+YXV4X3N5bXM7Ci0KLSAgaWYgKHZwLT5vYmplY3RzX2xhc3RfcGFnZSA9PSB2cC0+b2JqZWN0c19wZXJfcGFnZSkKLSAgICBhZGRfdmFycmF5X3BhZ2UgKHZwKTsKLQotICBhdXhfcHRyID0gJnZwLT5sYXN0LT5kYXR1bS0+YXV4W3ZwLT5vYmplY3RzX2xhc3RfcGFnZSsrXTsKLSAgYXV4X3B0ci0+dHlwZSA9IGF1eF9ybmR4OwotICBhdXhfcHRyLT5kYXRhLnJuZHgucmZkICAgPSBmaWxlX2luZGV4OwotICBhdXhfcHRyLT5kYXRhLnJuZHguaW5kZXggPSBzeW1faW5kZXg7Ci0KLSAgcmV0dXJuIHZwLT5udW1fYWxsb2NhdGVkKys7Ci19Ci0MCi0vKiBBZGQgYW4gYXV4aWxpYXJ5IHN5bWJvbCAocGFzc2luZyB0aGUgYmFzaWMgdHlwZSBhbmQgcG9zc2libHkKLSAgIHR5cGUgcXVhbGlmaWVycykuICAqLwotCi1zdGF0aWMgc3ltaW50X3QKLWFkZF9hdXhfc3ltX3RpciAodCwgc3RhdGUsIGhhc2hfdGJsKQotICAgICB0eXBlX2luZm9fdCAqdDsJCS8qIGN1cnJlbnQgdHlwZSBpbmZvcm1hdGlvbiAqLwotICAgICBoYXNoX3N0YXRlX3Qgc3RhdGU7CS8qIHdoZXRoZXIgdG8gaGFzaCB0eXBlIG9yIG5vdCAqLwotICAgICB0aGFzaF90ICoqaGFzaF90Ymw7CS8qIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSB0byB1c2UgKi8KLXsKLSAgcmVnaXN0ZXIgdmFycmF5X3QgKnZwOwotICByZWdpc3RlciBhdXhfdCAqYXV4X3B0cjsKLSAgc3RhdGljIEFVWFUgaW5pdF9hdXg7Ci0gIHN5bWludF90IHJldDsKLSAgaW50IGk7Ci0gIEFVWFUgYXV4OwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIpKTsKLQotICB2cCA9ICZjdXJfZmlsZV9wdHItPmF1eF9zeW1zOwotCi0gIGF1eCA9IGluaXRfYXV4OwotICBhdXgudGkuYnQgPSAoaW50KSB0LT5iYXNpY190eXBlOwotICBhdXgudGkuY29udGludWVkID0gMDsKLSAgYXV4LnRpLmZCaXRmaWVsZCA9IHQtPmJpdGZpZWxkOwotCi0gIGF1eC50aS50cTAgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbMF07Ci0gIGF1eC50aS50cTEgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbMV07Ci0gIGF1eC50aS50cTIgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbMl07Ci0gIGF1eC50aS50cTMgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbM107Ci0gIGF1eC50aS50cTQgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbNF07Ci0gIGF1eC50aS50cTUgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbNV07Ci0KLQotICAvKiBGb3IgYW55dGhpbmcgdGhhdCBhZGRzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHdlIG11c3Qgbm90IGhhc2gsCi0gICAgIHNvIGNoZWNrIGhlcmUsIGFuZCByZXNldCBvdXIgc3RhdGUuICovCi0KLSAgaWYgKHN0YXRlICE9IGhhc2hfbm8KLSAgICAgICYmICh0LT50eXBlX3F1YWxpZmllcnNbMF0gPT0gdHFfQXJyYXkKLQkgIHx8IHQtPnR5cGVfcXVhbGlmaWVyc1sxXSA9PSB0cV9BcnJheQotCSAgfHwgdC0+dHlwZV9xdWFsaWZpZXJzWzJdID09IHRxX0FycmF5Ci0JICB8fCB0LT50eXBlX3F1YWxpZmllcnNbM10gPT0gdHFfQXJyYXkKLQkgIHx8IHQtPnR5cGVfcXVhbGlmaWVyc1s0XSA9PSB0cV9BcnJheQotCSAgfHwgdC0+dHlwZV9xdWFsaWZpZXJzWzVdID09IHRxX0FycmF5Ci0JICB8fCB0LT5iYXNpY190eXBlID09IGJ0X1N0cnVjdAotCSAgfHwgdC0+YmFzaWNfdHlwZSA9PSBidF9VbmlvbgotCSAgfHwgdC0+YmFzaWNfdHlwZSA9PSBidF9FbnVtCi0JICB8fCB0LT5iaXRmaWVsZAotCSAgfHwgdC0+bnVtX2RpbXMgPiAwKSkKLSAgICBzdGF0ZSA9IGhhc2hfbm87Ci0KLSAgLyogU2VlIGlmIHdlIGNhbiBoYXNoIHRoaXMgdHlwZSwgYW5kIHNhdmUgc29tZSBzcGFjZSwgYnV0IHNvbWUgdHlwZXMKLSAgICAgY2FuJ3QgYmUgaGFzaGVkIChiZWNhdXNlIHRoZXkgY29udGFpbiBhcnJheXMgb3IgY29udGludWF0aW9ucyksCi0gICAgIGFuZCBvdGhlcnMgY2FuIGJlIHB1dCBpbnRvIHRoZSBoYXNoIGxpc3QsIGJ1dCBjYW5ub3QgdXNlIGV4aXN0aW5nCi0gICAgIHR5cGVzIGJlY2F1c2Ugb3RoZXIgYXV4IGVudHJpZXMgcHJlY2VkZSB0aGlzIG9uZS4gICovCi0KLSAgaWYgKHN0YXRlICE9IGhhc2hfbm8pCi0gICAgewotICAgICAgcmVnaXN0ZXIgdGhhc2hfdCAqaGFzaF9wdHI7Ci0gICAgICByZWdpc3RlciBzeW1pbnRfdCBoaTsKLQotICAgICAgaGkgPSBhdXguaXN5bSAmICgoMSA8PCBIQVNIQklUUykgLSAxKTsKLSAgICAgIGhpICU9IFRIQVNIX1NJWkU7Ci0KLSAgICAgIGZvciAoaGFzaF9wdHIgPSBoYXNoX3RibFtoaV07Ci0JICAgaGFzaF9wdHIgIT0gKHRoYXNoX3QgKikwOwotCSAgIGhhc2hfcHRyID0gaGFzaF9wdHItPm5leHQpCi0JewotCSAgaWYgKGF1eC5pc3ltID09IGhhc2hfcHRyLT50eXBlLmlzeW0pCi0JICAgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGhhc2hfcHRyICE9ICh0aGFzaF90ICopIE5VTEwgJiYgc3RhdGUgPT0gaGFzaF95ZXMpCi0JcmV0dXJuIGhhc2hfcHRyLT5pbmR4OwotCi0gICAgICBpZiAoaGFzaF9wdHIgPT0gKHRoYXNoX3QgKikgTlVMTCkKLQl7Ci0JICBoYXNoX3B0ciA9IGFsbG9jYXRlX3RoYXNoICgpOwotCSAgaGFzaF9wdHItPm5leHQgPSBoYXNoX3RibFtoaV07Ci0JICBoYXNoX3B0ci0+dHlwZSA9IGF1eDsKLQkgIGhhc2hfcHRyLT5pbmR4ID0gdnAtPm51bV9hbGxvY2F0ZWQ7Ci0JICBoYXNoX3RibFtoaV0gPSBoYXNoX3B0cjsKLQl9Ci0gICAgfQotCi0gIC8qIEV2ZXJ5dGhpbmcgaXMgc2V0IHVwLCBhZGQgdGhlIGF1eCBzeW1ib2wuICovCi0gIGlmICh2cC0+b2JqZWN0c19sYXN0X3BhZ2UgPT0gdnAtPm9iamVjdHNfcGVyX3BhZ2UpCi0gICAgYWRkX3ZhcnJheV9wYWdlICh2cCk7Ci0KLSAgYXV4X3B0ciA9ICZ2cC0+bGFzdC0+ZGF0dW0tPmF1eFsgdnAtPm9iamVjdHNfbGFzdF9wYWdlKysgXTsKLSAgYXV4X3B0ci0+dHlwZSA9IGF1eF90aXI7Ci0gIGF1eF9wdHItPmRhdGEgPSBhdXg7Ci0KLSAgcmV0ID0gdnAtPm51bV9hbGxvY2F0ZWQrKzsKLQotICAvKiBBZGQgYml0ZmllbGQgbGVuZ3RoIGlmIGl0IGV4aXN0cy4KLQotICAgICBOT1RFOiAgTWlwcyBkb2N1bWVudGF0aW9uIGNsYWltcyBiaXRmaWVsZCBnb2VzIGF0IHRoZSBlbmQgb2YgdGhlCi0gICAgIEFVWCByZWNvcmQsIGJ1dCB0aGUgREVDc3RhdGlvbiBjb21waWxlciBlbWl0cyBpdCBoZXJlLgotICAgICAoVGhpcyB3b3VsZCBvbmx5IG1ha2UgYSBkaWZmZXJlbmNlIGZvciBlbnVtIGJpdGZpZWxkcy4pCi0KLSAgICAgQWxzbyBub3RlOiAgV2UgdXNlIHRoZSBsYXN0IHNpemUgZ2l2ZW4gc2luY2UgZ2NjIG1heSBlbWl0IDIKLSAgICAgZm9yIGFuIGVudW0gYml0ZmllbGQuICAqLwotCi0gIGlmICh0LT5iaXRmaWVsZCkKLSAgICAodm9pZCkgYWRkX2F1eF9zeW1fc3ltaW50ICgoc3ltaW50X3QpdC0+c2l6ZXNbdC0+bnVtX3NpemVzLTFdKTsKLQotCi0gIC8qIEFkZCB0YWcgaW5mb3JtYXRpb24gaWYgbmVlZGVkLiAgU3RydWN0dXJlLCB1bmlvbiwgYW5kIGVudW0KLSAgICAgcmVmZXJlbmNlcyBhZGQgMiBhdXggc3ltYm9sczogYSBbZmlsZSBpbmRleCwgc3ltYm9sIGluZGV4XQotICAgICBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgdHlwZSwgYW5kIHRoZSBjdXJyZW50IGZpbGUgaW5kZXguICAqLwotCi0gIGlmICh0LT5iYXNpY190eXBlID09IGJ0X1N0cnVjdAotICAgICAgfHwgdC0+YmFzaWNfdHlwZSA9PSBidF9VbmlvbgotICAgICAgfHwgdC0+YmFzaWNfdHlwZSA9PSBidF9FbnVtKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHN5bWludF90IGZpbGVfaW5kZXggPSB0LT50YWdfcHRyLT5pZmQ7Ci0gICAgICByZWdpc3RlciBsb2NhbHN5bV90ICpzeW0gID0gdC0+dGFnX3B0ci0+c3ltOwotICAgICAgcmVnaXN0ZXIgZm9yd2FyZF90ICpmb3J3YXJkX3JlZiA9IGFsbG9jYXRlX2ZvcndhcmQgKCk7Ci0KLSAgICAgIGlmIChzeW0gIT0gKGxvY2Fsc3ltX3QgKikgTlVMTCkKLQl7Ci0JICBmb3J3YXJkX3JlZi0+bmV4dCA9IHN5bS0+Zm9yd2FyZF9yZWY7Ci0JICBzeW0tPmZvcndhcmRfcmVmID0gZm9yd2FyZF9yZWY7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZvcndhcmRfcmVmLT5uZXh0ID0gdC0+dGFnX3B0ci0+Zm9yd2FyZF9yZWY7Ci0JICB0LT50YWdfcHRyLT5mb3J3YXJkX3JlZiA9IGZvcndhcmRfcmVmOwotCX0KLQotICAgICAgKHZvaWQpIGFkZF9hdXhfc3ltX3JuZHggKFNUX1JGREVTQ0FQRSwgaW5kZXhOaWwpOwotICAgICAgZm9yd2FyZF9yZWYtPmluZGV4X3B0cgotCT0gJnZwLT5sYXN0LT5kYXR1bS0+YXV4WyB2cC0+b2JqZWN0c19sYXN0X3BhZ2UgLSAxXTsKLQotICAgICAgKHZvaWQpIGFkZF9hdXhfc3ltX3N5bWludCAoZmlsZV9pbmRleCk7Ci0gICAgICBmb3J3YXJkX3JlZi0+aWZkX3B0cgotCT0gJnZwLT5sYXN0LT5kYXR1bS0+YXV4WyB2cC0+b2JqZWN0c19sYXN0X3BhZ2UgLSAxXTsKLSAgICB9Ci0KLSAgLyogQWRkIGluZm9ybWF0aW9uIGFib3V0IGFycmF5IGJvdW5kcyBpZiB0aGV5IGV4aXN0LiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IHQtPm51bV9kaW1zOyBpKyspCi0gICAgewotICAgICAgKHZvaWQpIGFkZF9hdXhfc3ltX3JuZHggKFNUX1JGREVTQ0FQRSwKLQkJCSAgICAgICBjdXJfZmlsZV9wdHItPmludF90eXBlKTsKLQotICAgICAgKHZvaWQpIGFkZF9hdXhfc3ltX3N5bWludCAoY3VyX2ZpbGVfcHRyLT5maWxlX2luZGV4KTsJLyogZmlsZSBpbmRleCovCi0gICAgICAodm9pZCkgYWRkX2F1eF9zeW1fc3ltaW50ICgoc3ltaW50X3QpIDApOwkJCS8qIGxvdyBib3VuZCAqLwotICAgICAgKHZvaWQpIGFkZF9hdXhfc3ltX3N5bWludCAodC0+ZGltZW5zaW9uc1tpXSAtIDEpOwkJLyogaGlnaCBib3VuZCovCi0gICAgICAodm9pZCkgYWRkX2F1eF9zeW1fc3ltaW50ICgodC0+ZGltZW5zaW9uc1tpXSA9PSAwKQkvKiBzdHJpZGUgKi8KLQkJCQkgPyAwCi0JCQkJIDogKHQtPnNpemVzW2ldICogOCkgLyB0LT5kaW1lbnNpb25zW2ldKTsKLSAgICB9OwotCi0gIC8qIE5PVEU6ICBNaXBzIGRvY3VtZW50YXRpb24gY2xhaW1zIHRoYXQgdGhlIGJpdGZpZWxkIHdpZHRoIGdvZXMgaGVyZS4KLSAgICAgQnV0IGl0IG5lZWRzIHRvIGJlIGVtaXR0ZWQgZWFybGllci4gKi8KLQotICByZXR1cm4gcmV0OwotfQotDAotLyogQWRkIGEgdGFnIHRvIHRoZSB0YWcgdGFibGUgKHVubGVzcyBpdCBhbHJlYWR5IGV4aXN0cykuICAqLwotCi1zdGF0aWMgdGFnX3QgKgotZ2V0X3RhZyAodGFnLCBzeW0sIGJhc2ljX3R5cGUpCi0gICAgIGNvbnN0IGNoYXIgKnRhZzsJCQkvKiB0YWcgbmFtZSAqLwotICAgICBsb2NhbHN5bV90ICpzeW07CQkJLyogdGFnIHN0YXJ0IGJsb2NrICovCi0gICAgIGJ0X3QgYmFzaWNfdHlwZTsJCQkvKiBidF9TdHJ1Y3QsIGJ0X1VuaW9uLCBvciBidF9FbnVtICovCi17Ci0gIHNoYXNoX3QgKmhhc2hfcHRyOwotICBjb25zdCBjaGFyICplcnI7Ci0gIHRhZ190ICp0YWdfcHRyOwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIpKTsKLQotICBoYXNoX3B0ciA9IChzaGFzaF90ICopIGhhc2hfZmluZCAodGFnX2hhc2gsIHRhZyk7Ci0KLSAgaWYgKGhhc2hfcHRyICE9IChzaGFzaF90ICopIE5VTEwKLSAgICAgICYmIGhhc2hfcHRyLT50YWdfcHRyICE9ICh0YWdfdCAqKSBOVUxMKQotICB7Ci0gICAgdGFnX3B0ciA9IGhhc2hfcHRyLT50YWdfcHRyOwotICAgIGlmIChzeW0gIT0gKGxvY2Fsc3ltX3QgKikgTlVMTCkKLSAgICAgIHsKLQl0YWdfcHRyLT5iYXNpY190eXBlID0gYmFzaWNfdHlwZTsKLQl0YWdfcHRyLT5pZmQJICAgID0gY3VyX2ZpbGVfcHRyLT5maWxlX2luZGV4OwotCXRhZ19wdHItPnN5bQkgICAgPSBzeW07Ci0gICAgICB9Ci0gICAgcmV0dXJuIHRhZ19wdHI7Ci0gIH0KLQotICBpZiAoaGFzaF9wdHIgPT0gKHNoYXNoX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpwZXJtOwotCi0gICAgICBwZXJtID0geG1hbGxvYyAoKHVuc2lnbmVkIGxvbmcpIChzdHJsZW4gKHRhZykgKyAxKSk7Ci0gICAgICBzdHJjcHkgKHBlcm0sIHRhZyk7Ci0gICAgICBoYXNoX3B0ciA9IGFsbG9jYXRlX3NoYXNoICgpOwotICAgICAgZXJyID0gaGFzaF9pbnNlcnQgKHRhZ19oYXNoLCBwZXJtLCAoY2hhciAqKSBoYXNoX3B0cik7Ci0gICAgICBpZiAoZXJyKQotCWFzX2ZhdGFsIChfKCJJbnNlcnRpbmcgXCIlc1wiIGludG8gdGFnIGhhc2ggdGFibGU6ICVzIiksCi0JCSAgdGFnLCBlcnIpOwotICAgICAgaGFzaF9wdHItPnN0cmluZyA9IHBlcm07Ci0gICAgfQotCi0gIHRhZ19wdHIgPSBhbGxvY2F0ZV90YWcgKCk7Ci0gIHRhZ19wdHItPmZvcndhcmRfcmVmCT0gKGZvcndhcmRfdCAqKSBOVUxMOwotICB0YWdfcHRyLT5oYXNoX3B0cgk9IGhhc2hfcHRyOwotICB0YWdfcHRyLT5zYW1lX25hbWUJPSBoYXNoX3B0ci0+dGFnX3B0cjsKLSAgdGFnX3B0ci0+YmFzaWNfdHlwZQk9IGJhc2ljX3R5cGU7Ci0gIHRhZ19wdHItPnN5bQkJPSBzeW07Ci0gIHRhZ19wdHItPmlmZAkJPSAoKHN5bSA9PSAobG9jYWxzeW1fdCAqKSBOVUxMKQotCQkJICAgPyAoc3ltaW50X3QpIC0xCi0JCQkgICA6IGN1cl9maWxlX3B0ci0+ZmlsZV9pbmRleCk7Ci0gIHRhZ19wdHItPnNhbWVfYmxvY2sJPSBjdXJfdGFnX2hlYWQtPmZpcnN0X3RhZzsKLQotICBjdXJfdGFnX2hlYWQtPmZpcnN0X3RhZyA9IHRhZ19wdHI7Ci0gIGhhc2hfcHRyLT50YWdfcHRyCSAgPSB0YWdfcHRyOwotCi0gIHJldHVybiB0YWdfcHRyOwotfQotDAotLyogQWRkIGFuIHVua25vd24ge3N0cnVjdCwgdW5pb24sIGVudW19IHRhZy4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGRfdW5rbm93bl90YWcgKHB0YWcpCi0gICAgIHRhZ190CSpwdGFnOwkJLyogcG9pbnRlciB0byB0YWcgaW5mb3JtYXRpb24gKi8KLXsKLSAgc2hhc2hfdCAqaGFzaF9wdHIJPSBwdGFnLT5oYXNoX3B0cjsKLSAgY2hhciAqbmFtZQkJPSBoYXNoX3B0ci0+c3RyaW5nOwotICBsb2NhbHN5bV90ICpzeW07Ci0gIGZvcndhcmRfdCAqKnBmOwotCi0jaWZkZWYgRUNPRkZfREVCVUcKLSAgaWYgKGRlYnVnID4gMSkKLSAgICB7Ci0gICAgICBjaGFyICphZ2dfdHlwZQk9ICJ7dW5rbm93biBhZ2dyZWdhdGUgdHlwZX0iOwotICAgICAgc3dpdGNoIChwdGFnLT5iYXNpY190eXBlKQotCXsKLQljYXNlIGJ0X1N0cnVjdDoJYWdnX3R5cGUgPSAic3RydWN0IjsJYnJlYWs7Ci0JY2FzZSBidF9VbmlvbjoJYWdnX3R5cGUgPSAidW5pb24iOwlicmVhazsKLQljYXNlIGJ0X0VudW06CWFnZ190eXBlID0gImVudW0iOwlicmVhazsKLQlkZWZhdWx0OgkJCQlicmVhazsKLQl9Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgInVua25vd24gJXMgJS4qcyBmb3VuZFxuIiwgYWdnX3R5cGUsCi0JICAgICAgIGhhc2hfcHRyLT5sZW4sIG5hbWVfc3RhcnQpOwotICAgIH0KLSNlbmRpZgotCi0gIHN5bSA9IGFkZF9lY29mZl9zeW1ib2wgKG5hbWUsCi0JCQkgIHN0X0Jsb2NrLAotCQkJICBzY19JbmZvLAotCQkJICAoc3ltYm9sUyAqKSBOVUxMLAotCQkJICAoYmZkX3ZtYSkgMCwKLQkJCSAgKHN5bWludF90KSAwLAotCQkJICAoc3ltaW50X3QpIDApOwotCi0gICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sIChuYW1lLAotCQkJICAgc3RfRW5kLAotCQkJICAgc2NfSW5mbywKLQkJCSAgIChzeW1ib2xTICopIE5VTEwsCi0JCQkgICAoYmZkX3ZtYSkgMCwKLQkJCSAgIChzeW1pbnRfdCkgMCwKLQkJCSAgIChzeW1pbnRfdCkgMCk7Ci0KLSAgZm9yIChwZiA9ICZzeW0tPmZvcndhcmRfcmVmOyAqcGYgIT0gKGZvcndhcmRfdCAqKSBOVUxMOyBwZiA9ICYoKnBmKS0+bmV4dCkKLSAgICA7Ci0gICpwZiA9IHB0YWctPmZvcndhcmRfcmVmOwotfQotDAotLyogQWRkIGEgcHJvY2VkdXJlIHRvIHRoZSBjdXJyZW50IGZpbGUncyBsaXN0IG9mIHByb2NlZHVyZXMsIGFuZCByZWNvcmQKLSAgIHRoaXMgaXMgdGhlIGN1cnJlbnQgcHJvY2VkdXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF9wcm9jZWR1cmUgKGZ1bmMpCi0gICAgIGNoYXIgKmZ1bmM7CQkJLyogZnVuYyBuYW1lICovCi17Ci0gIHJlZ2lzdGVyIHZhcnJheV90ICp2cDsKLSAgcmVnaXN0ZXIgcHJvY190ICpuZXdfcHJvY19wdHI7Ci0gIHN5bWJvbFMgKnN5bTsKLQotI2lmZGVmIEVDT0ZGX0RFQlVHCi0gIGlmIChkZWJ1ZykKLSAgICBmcHV0YyAoJ1xuJywgc3RkZXJyKTsKLSNlbmRpZgotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIpKTsKLQotICB2cCA9ICZjdXJfZmlsZV9wdHItPnByb2NzOwotCi0gIGlmICh2cC0+b2JqZWN0c19sYXN0X3BhZ2UgPT0gdnAtPm9iamVjdHNfcGVyX3BhZ2UpCi0gICAgYWRkX3ZhcnJheV9wYWdlICh2cCk7Ci0KLSAgY3VyX3Byb2NfcHRyID0gbmV3X3Byb2NfcHRyID0gJnZwLT5sYXN0LT5kYXR1bS0+cHJvY1t2cC0+b2JqZWN0c19sYXN0X3BhZ2UrK107Ci0KLSAgaWYgKGZpcnN0X3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKLSAgICBmaXJzdF9wcm9jX3B0ciA9IG5ld19wcm9jX3B0cjsKLQotICB2cC0+bnVtX2FsbG9jYXRlZCsrOwotCi0gIG5ld19wcm9jX3B0ci0+cGRyLmlzeW0gPSAtMTsKLSAgbmV3X3Byb2NfcHRyLT5wZHIuaWxpbmUgPSAtMTsKLSAgbmV3X3Byb2NfcHRyLT5wZHIubG5Mb3cgPSAtMTsKLSAgbmV3X3Byb2NfcHRyLT5wZHIubG5IaWdoID0gLTE7Ci0KLSAgLyogU2V0IHRoZSBCU0ZfRlVOQ1RJT04gZmxhZyBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKGZ1bmMpOwotICBzeW0tPmJzeW0tPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQotICAvKiBQdXNoIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICAqLwotICBuZXdfcHJvY19wdHItPnN5bSA9IGFkZF9lY29mZl9zeW1ib2wgKChjb25zdCBjaGFyICopIE5VTEwsIHN0X1Byb2MsIHNjX1RleHQsCi0JCQkJCXN5bSwgKGJmZF92bWEpIDAsIChzeW1pbnRfdCkgMCwKLQkJCQkJKHN5bWludF90KSAwKTsKLQotICArK3Byb2NfY250OwotCi0gIC8qIEZpbGwgaW4gdGhlIGxpbmVub3MgcHJlY2VkaW5nIHRoZSAuZW50LCBpZiBhbnkuICAqLwotICBpZiAobm9wcm9jX2xpbmVubyAhPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGxpbmVub19saXN0X3QgKmw7Ci0KLSAgICAgIGZvciAobCA9IG5vcHJvY19saW5lbm87IGwgIT0gKGxpbmVub19saXN0X3QgKikgTlVMTDsgbCA9IGwtPm5leHQpCi0JbC0+cHJvYyA9IG5ld19wcm9jX3B0cjsKLSAgICAgICpsYXN0X2xpbmVub19wdHIgPSBub3Byb2NfbGluZW5vOwotICAgICAgd2hpbGUgKCpsYXN0X2xpbmVub19wdHIgIT0gTlVMTCkKLQl7Ci0JICBsYXN0X2xpbmVubyA9ICpsYXN0X2xpbmVub19wdHI7Ci0JICBsYXN0X2xpbmVub19wdHIgPSAmbGFzdF9saW5lbm8tPm5leHQ7Ci0JfQotICAgICAgbm9wcm9jX2xpbmVubyA9IChsaW5lbm9fbGlzdF90ICopIE5VTEw7Ci0gICAgfQotfQotCi1zeW1ib2xTICoKLWVjb2ZmX2dldF9jdXJfcHJvY19zeW0gKCkKLXsKLSAgcmV0dXJuIChjdXJfcHJvY19wdHIgPyBjdXJfcHJvY19wdHItPnN5bS0+YXNfc3ltIDogTlVMTCk7Ci19Ci0MCi0vKiBBZGQgYSBuZXcgZmlsZW5hbWUsIGFuZCBzZXQgdXAgYWxsIG9mIHRoZSBmaWxlIHJlbGF0aXZlCi0gICB2aXJ0dWFsIGFycmF5cyAoc3RyaW5ncywgc3ltYm9scywgYXV4IHN5bXMsIGV0Yy4pLiAgUmVjb3JkCi0gICB3aGVyZSB0aGUgY3VycmVudCBmaWxlIHN0cnVjdHVyZSBsaXZlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGRfZmlsZSAoZmlsZV9uYW1lLCBpbmR4LCBmYWtlKQotICAgICBjb25zdCBjaGFyICpmaWxlX25hbWU7CQkvKiBmaWxlIG5hbWUgKi8KLSAgICAgaW50IGluZHg7Ci0gICAgIGludCBmYWtlOwotewotICByZWdpc3RlciBpbnQgZmlyc3RfY2g7Ci0gIHJlZ2lzdGVyIGVmZHJfdCAqZmlsX3B0cjsKLQotI2lmZGVmIEVDT0ZGX0RFQlVHCi0gIGlmIChkZWJ1ZykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJcdGZpbGVcdCUuKnNcbiIsIGxlbiwgZmlsZV9zdGFydCk7Ci0jZW5kaWYKLQotICAvKiBJZiB0aGUgZmlsZSBuYW1lIGlzIE5VTEwsIHRoZW4gbm8gLmZpbGUgc3ltYm9sIGFwcGVhcmVkLCBhbmQgd2UKLSAgICAgd2FudCB0byB1c2UgdGhlIGFjdHVhbCBmaWxlIG5hbWUuICAqLwotICBpZiAoZmlsZV9uYW1lID09IChjb25zdCBjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgY2hhciAqZmlsZTsKLQotICAgICAgaWYgKGZpcnN0X2ZpbGUgIT0gKGVmZHJfdCAqKSBOVUxMKQotCWFzX2ZhdGFsIChfKCJmYWtlIC5maWxlIGFmdGVyIHJlYWwgb25lIikpOwotICAgICAgYXNfd2hlcmUgKCZmaWxlLCAodW5zaWduZWQgaW50ICopIE5VTEwpOwotICAgICAgZmlsZV9uYW1lID0gKGNvbnN0IGNoYXIgKikgZmlsZTsKLQotICAgICAgLyogQXV0b21hdGljYWxseSBnZW5lcmF0ZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHNpbmNlIEkKLSAgICAgICAgIHRoaW5rIHRoYXQncyB3aGF0IG90aGVyIEVDT0ZGIGFzc2VtYmxlcnMgZG8uICBXZSBkb24ndCBkbwotICAgICAgICAgdGhpcyBpZiB3ZSBzZWUgYSAuZmlsZSBkaXJlY3RpdmUgd2l0aCBhIHN0cmluZywgc2luY2UgdGhhdAotICAgICAgICAgaW1wbGllcyB0aGF0IHNvbWUgc29ydCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgYmVpbmcKLSAgICAgICAgIHByb3ZpZGVkLiAgKi8KLSAgICAgIGlmICghIHN5bWJvbF90YWJsZV9mcm96ZW4gJiYgZGVidWdfdHlwZSA9PSBERUJVR19OT05FKQotCWRlYnVnX3R5cGUgPSBERUJVR19FQ09GRjsKLSAgICB9Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICBpZiAobGlzdGluZykKLSAgICBsaXN0aW5nX3NvdXJjZV9maWxlIChmaWxlX25hbWUpOwotI2VuZGlmCi0KLSAgY3VycmVudF9zdGFic19maWxlbmFtZSA9IGZpbGVfbmFtZTsKLQotICAvKiBJZiB3ZSdyZSBjcmVhdGluZyBzdGFicywgdGhlbiB3ZSBkb24ndCBhY3R1YWxseSBtYWtlIGEgbmV3IEZEUi4KLSAgICAgSW5zdGVhZCwgd2UganVzdCBjcmVhdGUgYSBzdGFicyBzeW1ib2wuICAqLwotICBpZiAoc3RhYnNfc2VlbikKLSAgICB7Ci0gICAgICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoZmlsZV9uYW1lLCBzdF9OaWwsIHNjX05pbCwKLQkJCSAgICAgICBzeW1ib2xfbmV3ICgiTDBcMDAxIiwgbm93X3NlZywKLQkJCQkJICAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkJCQkgICBmcmFnX25vdyksCi0JCQkgICAgICAgKGJmZF92bWEpIDAsIDAsIEVDT0ZGX01BUktfU1RBQiAoTl9TT0wpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZmlyc3RfY2ggPSAqZmlsZV9uYW1lOwotCi0gIC8qIEZJWE1FOiBXZSBjYW4ndCBzYWZlbHkgbWVyZ2UgZmlsZXMgd2hpY2ggaGF2ZSBsaW5lIG51bWJlcgotICAgICBpbmZvcm1hdGlvbiAoZk1lcmdlIHdpbGwgYmUgemVybyBpbiB0aGlzIGNhc2UpLiAgT3RoZXJ3aXNlLCB3ZQotICAgICBnZXQgaW5jb3JyZWN0IGxpbmUgbnVtYmVyIGRlYnVnZ2luZyBpbmZvLiAgU2VlIGZvciBpbnN0YW5jZQotICAgICBlY29mZl9idWlsZF9saW5lbm8sIHdoaWNoIHdpbGwgZW5kIHVwIHNldHRpbmcgYWxsIGZpbGUtPmZkci4qCi0gICAgIGZpZWxkcyBtdWx0aXBsZSB0aW1lcywgcmVzdWx0aW5nIGluIGluY29ycmVjdCBkZWJ1ZyBpbmZvLiAgSW4KLSAgICAgb3JkZXIgdG8gbWFrZSB0aGlzIHdvcmsgcmlnaHQsIGFsbCBsaW5lIG51bWJlciBhbmQgc3ltYm9sIGluZm8KLSAgICAgZm9yIHRoZSBzYW1lIHNvdXJjZSBmaWxlIGhhcyB0byBiZSBhZGphY2VudCBpbiB0aGUgb2JqZWN0IGZpbGUsCi0gICAgIHNvIHRoYXQgYSBzaW5nbGUgZmlsZSBkZXNjcmlwdG9yIGNhbiBiZSB1c2VkIHRvIHBvaW50IHRvIHRoZW0uCi0gICAgIFRoaXMgd291bGQgcmVxdWlyZSBtYWludGFpbmluZyBmaWxlIHNwZWNpZmljIGxpc3RzIG9mIGxpbmUKLSAgICAgbnVtYmVycyBhbmQgc3ltYm9scyBmb3IgZWFjaCBmaWxlLCBzbyB0aGF0IHRoZXkgY2FuIGJlIG1lcmdlZAotICAgICB0b2dldGhlciAob3Igb3V0cHV0IHRvZ2V0aGVyKSB3aGVuIHR3byAuZmlsZSBwc2V1ZG8tb3BzIGFyZQotICAgICBtZXJnZWQgaW50byBvbmUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KLQotICAvKiBTZWUgaWYgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLiAgKi8KLSAgZm9yIChmaWxfcHRyID0gZmlyc3RfZmlsZTsKLSAgICAgICBmaWxfcHRyICE9IChlZmRyX3QgKikgTlVMTDsKLSAgICAgICBmaWxfcHRyID0gZmlsX3B0ci0+bmV4dF9maWxlKQotICAgIHsKLSAgICAgIGlmIChmaXJzdF9jaCA9PSBmaWxfcHRyLT5uYW1lWzBdCi0JICAmJiBzdHJjbXAgKGZpbGVfbmFtZSwgZmlsX3B0ci0+bmFtZSkgPT0gMAotCSAgJiYgZmlsX3B0ci0+ZmRyLmZNZXJnZSkKLQl7Ci0JICBjdXJfZmlsZV9wdHIgPSBmaWxfcHRyOwotCSAgaWYgKCEgZmFrZSkKLQkgICAgY3VyX2ZpbGVfcHRyLT5mYWtlID0gMDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIG5ldyBmaWxlLCBjcmVhdGUgaXQuICovCi0gIGlmIChmaWxfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlID09IGZpbGVfZGVzYy5vYmplY3RzX3Blcl9wYWdlKQotCWFkZF92YXJyYXlfcGFnZSAoJmZpbGVfZGVzYyk7Ci0KLSAgICAgIGZpbF9wdHIgPSBjdXJfZmlsZV9wdHIgPQotCSZmaWxlX2Rlc2MubGFzdC0+ZGF0dW0tPmZpbGVbZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlKytdOwotICAgICAgKmZpbF9wdHIgPSBpbml0X2ZpbGU7Ci0KLSAgICAgIGZpbF9wdHItPmZpbGVfaW5kZXggPSBjdXJyZW50X2ZpbGVfaWR4Kys7Ci0gICAgICArK2ZpbGVfZGVzYy5udW1fYWxsb2NhdGVkOwotCi0gICAgICBmaWxfcHRyLT5mYWtlID0gZmFrZTsKLQotICAgICAgLyogQWxsb2NhdGUgdGhlIHN0cmluZyBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGZpbF9wdHItPnN0cl9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSAwIGJ5dGUgaW4gc3RyaW5nIHRhYmxlIGlzIG51bGwgICovCi0gICAgICBhZGRfc3RyaW5nICgmZmlsX3B0ci0+c3RyaW5ncywKLQkJICBmaWxfcHRyLT5zdHJfaGFzaCwKLQkJICAiIiwKLQkJICAoc2hhc2hfdCAqKikwKTsKLQotICAgICAgaWYgKHN0cmxlbiAoZmlsZV9uYW1lKSA+IFBBR0VfVVNJWkUgLSAyKQotCWFzX2ZhdGFsIChfKCJGaWxlbmFtZSBnb2VzIG92ZXIgb25lIHBhZ2UgYm91bmRhcnkuIikpOwotCi0gICAgICAvKiBQdXNoIHRoZSBzdGFydCBvZiB0aGUgZmlsZW5hbWUuIFdlIGFzc3VtZSB0aGF0IHRoZSBmaWxlbmFtZQotICAgICAgICAgd2lsbCBiZSBzdG9yZWQgYXQgc3RyaW5nIG9mZnNldCAxLiAgKi8KLSAgICAgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sIChmaWxlX25hbWUsIHN0X0ZpbGUsIHNjX1RleHQsCi0JCQkgICAgICAgKHN5bWJvbFMgKikgTlVMTCwgKGJmZF92bWEpIDAsCi0JCQkgICAgICAgKHN5bWludF90KSAwLCAoc3ltaW50X3QpIDApOwotICAgICAgZmlsX3B0ci0+ZmRyLnJzcyA9IDE7Ci0gICAgICBmaWxfcHRyLT5uYW1lID0gJmZpbF9wdHItPnN0cmluZ3MubGFzdC0+ZGF0dW0tPmJ5dGVbMV07Ci0KLSAgICAgIC8qIFVwZGF0ZSB0aGUgbGlua2VkIGxpc3Qgb2YgZmlsZSBkZXNjcmlwdG9ycy4gICovCi0gICAgICAqbGFzdF9maWxlX3B0ciA9IGZpbF9wdHI7Ci0gICAgICBsYXN0X2ZpbGVfcHRyID0gJmZpbF9wdHItPm5leHRfZmlsZTsKLQotICAgICAgLyogQWRkIHZvaWQgJiBpbnQgdHlwZXMgdG8gdGhlIGZpbGUgKHZvaWQgc2hvdWxkIGJlIGZpcnN0IHRvIGNhdGNoCi0JIGVycmFudCAwJ3Mgd2l0aGluIHRoZSBpbmRleCBmaWVsZHMpLiAgKi8KLSAgICAgIGZpbF9wdHItPnZvaWRfdHlwZSA9IGFkZF9hdXhfc3ltX3RpciAoJnZvaWRfdHlwZV9pbmZvLAotCQkJCQkgICAgaGFzaF95ZXMsCi0JCQkJCSAgICAmY3VyX2ZpbGVfcHRyLT50aGFzaF9oZWFkWzBdKTsKLQotICAgICAgZmlsX3B0ci0+aW50X3R5cGUgPSBhZGRfYXV4X3N5bV90aXIgKCZpbnRfdHlwZV9pbmZvLAotCQkJCQkgICBoYXNoX3llcywKLQkJCQkJICAgJmN1cl9maWxlX3B0ci0+dGhhc2hfaGVhZFswXSk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgbm90aWNlcyBhIHByZXByb2Nlc3NvcgotICAgZGlyZWN0aXZlIHN3aXRjaGluZyB0byBhIG5ldyBmaWxlLiAgVGhpcyB3aWxsIG5vdCBoYXBwZW4gaW4KLSAgIGNvbXBpbGVyIG91dHB1dCwgb25seSBpbiBoYW5kIGNvZGVkIGFzc2VtYmxlci4gICovCi0KLXZvaWQKLWVjb2ZmX25ld19maWxlIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAoY3VyX2ZpbGVfcHRyICE9IE5VTEwgJiYgc3RyY21wIChjdXJfZmlsZV9wdHItPm5hbWUsIG5hbWUpID09IDApCi0gICAgcmV0dXJuOwotICBhZGRfZmlsZSAobmFtZSwgMCwgMCk7Ci0KLSAgLyogVGhpcyBpcyBhIGhhbmQgY29kZWQgYXNzZW1ibGVyIGZpbGUsIHNvIGF1dG9tYXRpY2FsbHkgdHVybiBvbgotICAgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBpZiAoZGVidWdfdHlwZSA9PSBERUJVR19OT05FKQotICAgIGRlYnVnX3R5cGUgPSBERUJVR19FQ09GRjsKLX0KLQwKLSNpZmRlZiBFQ09GRl9ERUJVRwotCi0vKiBDb252ZXJ0IHN0b3JhZ2UgY2xhc3MgdG8gc3RyaW5nLiAgKi8KLQotc3RhdGljIGNoYXIgKgotc2NfdG9fc3RyaW5nKHN0b3JhZ2VfY2xhc3MpCi0gICAgIHNjX3Qgc3RvcmFnZV9jbGFzczsKLXsKLSAgc3dpdGNoKHN0b3JhZ2VfY2xhc3MpCi0gICAgewotICAgIGNhc2Ugc2NfTmlsOgkgcmV0dXJuICJOaWwsIjsKLSAgICBjYXNlIHNjX1RleHQ6CSByZXR1cm4gIlRleHQsIjsKLSAgICBjYXNlIHNjX0RhdGE6CSByZXR1cm4gIkRhdGEsIjsKLSAgICBjYXNlIHNjX0JzczoJIHJldHVybiAiQnNzLCI7Ci0gICAgY2FzZSBzY19SZWdpc3RlcjoJIHJldHVybiAiUmVnaXN0ZXIsIjsKLSAgICBjYXNlIHNjX0FiczoJIHJldHVybiAiQWJzLCI7Ci0gICAgY2FzZSBzY19VbmRlZmluZWQ6CSByZXR1cm4gIlVuZGVmaW5lZCwiOwotICAgIGNhc2Ugc2NfQ2RiTG9jYWw6CSByZXR1cm4gIkNkYkxvY2FsLCI7Ci0gICAgY2FzZSBzY19CaXRzOgkgcmV0dXJuICJCaXRzLCI7Ci0gICAgY2FzZSBzY19DZGJTeXN0ZW06CSByZXR1cm4gIkNkYlN5c3RlbSwiOwotICAgIGNhc2Ugc2NfUmVnSW1hZ2U6CSByZXR1cm4gIlJlZ0ltYWdlLCI7Ci0gICAgY2FzZSBzY19JbmZvOgkgcmV0dXJuICJJbmZvLCI7Ci0gICAgY2FzZSBzY19Vc2VyU3RydWN0OgkgcmV0dXJuICJVc2VyU3RydWN0LCI7Ci0gICAgY2FzZSBzY19TRGF0YToJIHJldHVybiAiU0RhdGEsIjsKLSAgICBjYXNlIHNjX1NCc3M6CSByZXR1cm4gIlNCc3MsIjsKLSAgICBjYXNlIHNjX1JEYXRhOgkgcmV0dXJuICJSRGF0YSwiOwotICAgIGNhc2Ugc2NfVmFyOgkgcmV0dXJuICJWYXIsIjsKLSAgICBjYXNlIHNjX0NvbW1vbjoJIHJldHVybiAiQ29tbW9uLCI7Ci0gICAgY2FzZSBzY19TQ29tbW9uOgkgcmV0dXJuICJTQ29tbW9uLCI7Ci0gICAgY2FzZSBzY19WYXJSZWdpc3RlcjogcmV0dXJuICJWYXJSZWdpc3RlciwiOwotICAgIGNhc2Ugc2NfVmFyaWFudDoJIHJldHVybiAiVmFyaWFudCwiOwotICAgIGNhc2Ugc2NfU1VuZGVmaW5lZDoJIHJldHVybiAiU1VuZGVmaW5lZCwiOwotICAgIGNhc2Ugc2NfSW5pdDoJIHJldHVybiAiSW5pdCwiOwotICAgIGNhc2Ugc2NfTWF4OgkgcmV0dXJuICJNYXgsIjsKLSAgICB9Ci0KLSAgcmV0dXJuICI/Pz8sIjsKLX0KLQotI2VuZGlmIC8qIERFQlVHICovCi0MCi0jaWZkZWYgRUNPRkZfREVCVUcKLQotLyogQ29udmVydCBzeW1ib2wgdHlwZSB0byBzdHJpbmcuICAqLwotCi1zdGF0aWMgY2hhciAqCi1zdF90b19zdHJpbmcoc3ltYm9sX3R5cGUpCi0gICAgIHN0X3Qgc3ltYm9sX3R5cGU7Ci17Ci0gIHN3aXRjaChzeW1ib2xfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBzdF9OaWw6CXJldHVybiAiTmlsLCI7Ci0gICAgY2FzZSBzdF9HbG9iYWw6CXJldHVybiAiR2xvYmFsLCI7Ci0gICAgY2FzZSBzdF9TdGF0aWM6CXJldHVybiAiU3RhdGljLCI7Ci0gICAgY2FzZSBzdF9QYXJhbToJcmV0dXJuICJQYXJhbSwiOwotICAgIGNhc2Ugc3RfTG9jYWw6CXJldHVybiAiTG9jYWwsIjsKLSAgICBjYXNlIHN0X0xhYmVsOglyZXR1cm4gIkxhYmVsLCI7Ci0gICAgY2FzZSBzdF9Qcm9jOglyZXR1cm4gIlByb2MsIjsKLSAgICBjYXNlIHN0X0Jsb2NrOglyZXR1cm4gIkJsb2NrLCI7Ci0gICAgY2FzZSBzdF9FbmQ6CXJldHVybiAiRW5kLCI7Ci0gICAgY2FzZSBzdF9NZW1iZXI6CXJldHVybiAiTWVtYmVyLCI7Ci0gICAgY2FzZSBzdF9UeXBlZGVmOglyZXR1cm4gIlR5cGVkZWYsIjsKLSAgICBjYXNlIHN0X0ZpbGU6CXJldHVybiAiRmlsZSwiOwotICAgIGNhc2Ugc3RfUmVnUmVsb2M6CXJldHVybiAiUmVnUmVsb2MsIjsKLSAgICBjYXNlIHN0X0ZvcndhcmQ6CXJldHVybiAiRm9yd2FyZCwiOwotICAgIGNhc2Ugc3RfU3RhdGljUHJvYzoJcmV0dXJuICJTdGF0aWNQcm9jLCI7Ci0gICAgY2FzZSBzdF9Db25zdGFudDoJcmV0dXJuICJDb25zdGFudCwiOwotICAgIGNhc2Ugc3RfU3RyOglyZXR1cm4gIlN0cmluZywiOwotICAgIGNhc2Ugc3RfTnVtYmVyOglyZXR1cm4gIk51bWJlciwiOwotICAgIGNhc2Ugc3RfRXhwcjoJcmV0dXJuICJFeHByLCI7Ci0gICAgY2FzZSBzdF9UeXBlOglyZXR1cm4gIlR5cGUsIjsKLSAgICBjYXNlIHN0X01heDoJcmV0dXJuICJNYXgsIjsKLSAgICB9Ci0KLSAgcmV0dXJuICI/Pz8sIjsKLX0KLQotI2VuZGlmIC8qIERFQlVHICovCi0MCi0vKiBQYXJzZSAuYmVnaW4gZGlyZWN0aXZlcyB3aGljaCBoYXZlIGEgbGFiZWwgYXMgdGhlIGZpcnN0IGFyZ3VtZW50Ci0gICB3aGljaCBnaXZlcyB0aGUgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBibG9jay4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9iZWdpbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIG5hbWVfZW5kOwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5iZWdpbiBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZmlsZSBkaXJlY3RpdmUiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuYmVnaW4gZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmVudCBkaXJlY3RpdmUiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sICgoY29uc3QgY2hhciAqKSBOVUxMLCBzdF9CbG9jaywgc2NfVGV4dCwKLQkJCSAgIHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpLAotCQkJICAgKGJmZF92bWEpIDAsIChzeW1pbnRfdCkgMCwgKHN5bWludF90KSAwKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgLyogVGhlIGxpbmUgbnVtYmVyIGZvbGxvd3MsIGJ1dCB3ZSBkb24ndCB1c2UgaXQuICAqLwotICAodm9pZCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKiBQYXJzZSAuYmVuZCBkaXJlY3RpdmVzIHdoaWNoIGhhdmUgYSBsYWJlbCBhcyB0aGUgZmlyc3QgYXJndW1lbnQKLSAgIHdoaWNoIGdpdmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBibG9jay4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9iZW5kIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0gIHN5bWJvbFMgKmVuZHN5bTsKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuYmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZmlsZSBkaXJlY3RpdmUiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuYmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZSIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgLyogVGhlIHZhbHVlIGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSAuYmVuZCBkaXJlY3RpdmUgYW5kIHRoZQotICAgICBjb3JyZXNwb25kaW5nIHN5bWJvbC4gIFdlIGZpbGwgaW4gdGhlIG9mZnNldCB3aGVuIHdlIHdyaXRlIG91dAotICAgICB0aGUgc3ltYm9sLiAgKi8KLSAgZW5kc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotICBpZiAoZW5kc3ltID09IChzeW1ib2xTICopIE5VTEwpCi0gICAgYXNfd2FybiAoXygiLmJlbmQgZGlyZWN0aXZlIG5hbWVzIHVua25vd24gc3ltYm9sIikpOwotICBlbHNlCi0gICAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKChjb25zdCBjaGFyICopIE5VTEwsIHN0X0VuZCwgc2NfVGV4dCwgZW5kc3ltLAotCQkJICAgICAoYmZkX3ZtYSkgMCwgKHN5bWludF90KSAwLCAoc3ltaW50X3QpIDApOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICAvKiBUaGUgbGluZSBudW1iZXIgZm9sbG93cywgYnV0IHdlIGRvbid0IHVzZSBpdC4gICovCi0gICh2b2lkKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIGFzIGEgc2VyaWVzIG9mIGRpcmVjdGl2ZXMKLSAgICguZGVmLCAuc2NsLCBldGMuKS4gIFdlIGJ1aWxkIHVwIGluZm9ybWF0aW9uIGFzIHdlIHJlYWQgdGhlCi0gICBkaXJlY3RpdmVzIGluIHRoZSBmb2xsb3dpbmcgc3RhdGljIHZhcmlhYmxlcywgYW5kIGZpbGUgaXQgYXdheSB3aGVuCi0gICB3ZSByZWFjaCB0aGUgLmVuZGVmIGRpcmVjdGl2ZS4gICovCi1zdGF0aWMgY2hhciAqY29mZl9zeW1fbmFtZTsKLXN0YXRpYyB0eXBlX2luZm9fdCBjb2ZmX3R5cGU7Ci1zdGF0aWMgc2NfdCBjb2ZmX3N0b3JhZ2VfY2xhc3M7Ci1zdGF0aWMgc3RfdCBjb2ZmX3N5bWJvbF90eXA7Ci1zdGF0aWMgaW50IGNvZmZfaXNfZnVuY3Rpb247Ci1zdGF0aWMgY2hhciAqY29mZl90YWc7Ci1zdGF0aWMgdmFsdWVUIGNvZmZfdmFsdWU7Ci1zdGF0aWMgc3ltYm9sUyAqY29mZl9zeW1fdmFsdWU7Ci1zdGF0aWMgYmZkX3ZtYSBjb2ZmX3N5bV9hZGRlbmQ7Ci1zdGF0aWMgaW50IGNvZmZfaW5zaWRlX2VudW1lcmF0aW9uOwotCi0vKiBIYW5kbGUgYSAuZGVmIGRpcmVjdGl2ZTogc3RhcnQgZGVmaW5pbmcgYSBzeW1ib2wuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfZGVmIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0KLSAgZWNvZmZfZGVidWdnaW5nX3NlZW4gPSAxOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGlmIChjb2ZmX3N5bV9uYW1lICE9IChjaGFyICopIE5VTEwpCi0gICAgYXNfd2FybiAoXygiLmRlZiBwc2V1ZG8tb3AgdXNlZCBpbnNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7Ci0gIGVsc2UgaWYgKCpuYW1lID09ICdcMCcpCi0gICAgYXNfd2FybiAoXygiRW1wdHkgc3ltYm9sIG5hbWUgaW4gLmRlZjsgaWdub3JlZCIpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChjb2ZmX3N5bV9uYW1lICE9IChjaGFyICopIE5VTEwpCi0JZnJlZSAoY29mZl9zeW1fbmFtZSk7Ci0gICAgICBpZiAoY29mZl90YWcgIT0gKGNoYXIgKikgTlVMTCkKLQlmcmVlIChjb2ZmX3RhZyk7Ci0gICAgICBjb2ZmX3N5bV9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoKHVuc2lnbmVkIGxvbmcpIChzdHJsZW4gKG5hbWUpICsgMSkpOwotICAgICAgc3RyY3B5IChjb2ZmX3N5bV9uYW1lLCBuYW1lKTsKLSAgICAgIGNvZmZfdHlwZSA9IHR5cGVfaW5mb19pbml0OwotICAgICAgY29mZl9zdG9yYWdlX2NsYXNzID0gc2NfTmlsOwotICAgICAgY29mZl9zeW1ib2xfdHlwID0gc3RfTmlsOwotICAgICAgY29mZl9pc19mdW5jdGlvbiA9IDA7Ci0gICAgICBjb2ZmX3RhZyA9IChjaGFyICopIE5VTEw7Ci0gICAgICBjb2ZmX3ZhbHVlID0gMDsKLSAgICAgIGNvZmZfc3ltX3ZhbHVlID0gKHN5bWJvbFMgKikgTlVMTDsKLSAgICAgIGNvZmZfc3ltX2FkZGVuZCA9IDA7Ci0gICAgfQotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuZGltIGRpcmVjdGl2ZSwgdXNlZCB0byBnaXZlIGRpbWVuc2lvbnMgZm9yIGFuIGFycmF5LiAgVGhlCi0gICBhcmd1bWVudHMgYXJlIGNvbW1hIHNlcGFyYXRlZCBudW1iZXJzLiAgbWlwcy10ZmlsZSBhc3N1bWVzIHRoYXQKLSAgIHRoZXJlIHdpbGwgbm90IGJlIG1vcmUgdGhhbiA2IGRpbWVuc2lvbnMsIGFuZCBnZGIgd29uJ3QgcmVhZCBhbnkKLSAgIG1vcmUgdGhhbiB0aGF0IGFueWhvdywgc28gSSB3aWxsIGFsc28gbWFrZSB0aGF0IGFzc3VtcHRpb24uICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfZGltIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCBkaW1lbnNbTl9UUV07Ci0gIGludCBpOwotCi0gIGlmIChjb2ZmX3N5bV9uYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmRpbSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5fVFE7IGkrKykKLSAgICB7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBkaW1lbnNbaV0gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXG4nCi0JICAgICAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnOycpCi0JICAgIGFzX3dhcm4gKF8oIkJhZGx5IGZvcm1lZCAuZGltIGRpcmVjdGl2ZSIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGkgPT0gTl9UUSkKLSAgICAtLWk7Ci0KLSAgLyogVGhlIGRpbWVuc2lvbnMgYXJlIHN0b3JlZCBhd2F5IGluIHJldmVyc2Ugb3JkZXIuICAqLwotICBmb3IgKDsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgaWYgKGNvZmZfdHlwZS5udW1fZGltcyA+PSBOX1RRKQotCXsKLQkgIGFzX3dhcm4gKF8oIlRvbyBtYW55IC5kaW0gZW50cmllcyIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGNvZmZfdHlwZS5kaW1lbnNpb25zW2NvZmZfdHlwZS5udW1fZGltc10gPSBkaW1lbnNbaV07Ci0gICAgICArK2NvZmZfdHlwZS5udW1fZGltczsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLnNjbCBkaXJlY3RpdmUsIHdoaWNoIHNldHMgdGhlIENPRkYgc3RvcmFnZSBjbGFzcyBvZiB0aGUKLSAgIHN5bWJvbC4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9zY2wgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbG9uZyB2YWw7Ci0KLSAgaWYgKGNvZmZfc3ltX25hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuc2NsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB2YWwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBjb2ZmX3N5bWJvbF90eXAgPSBtYXBfY29mZl9zeW1fdHlwZVt2YWxdOwotICBjb2ZmX3N0b3JhZ2VfY2xhc3MgPSBtYXBfY29mZl9zdG9yYWdlW3ZhbF07Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLnNpemUgZGlyZWN0aXZlLiAgRm9yIHNvbWUgcmVhc29uIG1pcHMtdGZpbGUuYyB0aGlua3MgdGhhdAotICAgLnNpemUgY2FuIGhhdmUgbXVsdGlwbGUgYXJndW1lbnRzLiAgV2UgaHVtb3IgaXQsIGFsdGhvdWdoIGdjYyB3aWxsCi0gICBuZXZlciBnZW5lcmF0ZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX3NpemUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IHNpemVzW05fVFFdOwotICBpbnQgaTsKLQotICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zaXplIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgTl9UUTsgaSsrKQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIHNpemVzW2ldID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1xuJwotCSAgICAgICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJzsnKQotCSAgICBhc193YXJuIChfKCJCYWRseSBmb3JtZWQgLnNpemUgZGlyZWN0aXZlIikpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoaSA9PSBOX1RRKQotICAgIC0taTsKLQotICAvKiBUaGUgc2l6ZXMgYXJlIHN0b3JlZCBhd2F5IGluIHJldmVyc2Ugb3JkZXIuICAqLwotICBmb3IgKDsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgaWYgKGNvZmZfdHlwZS5udW1fc2l6ZXMgPj0gTl9UUSkKLQl7Ci0JICBhc193YXJuIChfKCJUb28gbWFueSAuc2l6ZSBlbnRyaWVzIikpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgY29mZl90eXBlLnNpemVzW2NvZmZfdHlwZS5udW1fc2l6ZXNdID0gc2l6ZXNbaV07Ci0gICAgICArK2NvZmZfdHlwZS5udW1fc2l6ZXM7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLnR5cGUgZGlyZWN0aXZlLCB3aGljaCBnaXZlcyB0aGUgQ09GRiB0eXBlIG9mIHRoZQotICAgc3ltYm9sLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX3R5cGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbG9uZyB2YWw7Ci0gIHRxX3QgKnRxX3B0cjsKLSAgdHFfdCAqdHFfc2hmdDsKLQotICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi50eXBlIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB2YWwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBjb2ZmX3R5cGUub3JpZ190eXBlID0gQlRZUEUgKHZhbCk7Ci0gIGNvZmZfdHlwZS5iYXNpY190eXBlID0gbWFwX2NvZmZfdHlwZXNbY29mZl90eXBlLm9yaWdfdHlwZV07Ci0KLSAgdHFfcHRyID0gJmNvZmZfdHlwZS50eXBlX3F1YWxpZmllcnNbTl9UUV07Ci0gIHdoaWxlICh2YWwgJn4gTl9CVE1BU0spCi0gICAgewotICAgICAgaWYgKHRxX3B0ciA9PSAmY29mZl90eXBlLnR5cGVfcXVhbGlmaWVyc1swXSkKLQl7Ci0JICAvKiBGSVhNRTogV2UgY291bGQgaGFuZGxlIHRoaXMgYnkgc2V0dGluZyB0aGUgY29udGludWVkIGJpdC4KLSAgICAgICAgICAgICBUaGVyZSB3b3VsZCBzdGlsbCBiZSBhIGxpbWl0OiB0aGUgLnR5cGUgYXJndW1lbnQgY2FuIG5vdAotICAgICAgICAgICAgIGJlIGluZmluaXRlLiAgKi8KLQkgIGFzX3dhcm4gKF8oIlRoZSB0eXBlIG9mICVzIGlzIHRvbyBjb21wbGV4OyBpdCB3aWxsIGJlIHNpbXBsaWZpZWQiKSwKLQkJICAgY29mZl9zeW1fbmFtZSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoSVNQVFIgKHZhbCkpCi0JKi0tdHFfcHRyID0gdHFfUHRyOwotICAgICAgZWxzZSBpZiAoSVNGQ04gKHZhbCkpCi0JKi0tdHFfcHRyID0gdHFfUHJvYzsKLSAgICAgIGVsc2UgaWYgKElTQVJZICh2YWwpKQotCSotLXRxX3B0ciA9IHRxX0FycmF5OwotICAgICAgZWxzZQotCWFzX2ZhdGFsIChfKCJVbnJlY29nbml6ZWQgLnR5cGUgYXJndW1lbnQiKSk7Ci0KLSAgICAgIHZhbCA9IERFQ1JFRiAodmFsKTsKLSAgICB9Ci0KLSAgdHFfc2hmdCA9ICZjb2ZmX3R5cGUudHlwZV9xdWFsaWZpZXJzWzBdOwotICB3aGlsZSAodHFfcHRyICE9ICZjb2ZmX3R5cGUudHlwZV9xdWFsaWZpZXJzW05fVFFdKQotICAgICp0cV9zaGZ0KysgPSAqdHFfcHRyKys7Ci0KLSAgaWYgKHRxX3NoZnQgIT0gJmNvZmZfdHlwZS50eXBlX3F1YWxpZmllcnNbMF0gJiYgdHFfc2hmdFstMV0gPT0gdHFfUHJvYykKLSAgICB7Ci0gICAgICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIGlnbm9yZSBpdCwgc28gdGhhdCB3ZSBkb24ndCBnZXQgdHdvCi0JIGVudHJpZXMgKG9uZSBmcm9tIHRoZSAuZW50LCBhbmQgb25lIGZvciB0aGUgLmRlZiB0aGF0Ci0JIHByZWNlZGVzIGl0KS4gIFNhdmUgdGhlIHR5cGUgaW5mb3JtYXRpb24gc28gdGhhdCB0aGUgZW5kCi0JIGJsb2NrIGNhbiBwcm9wZXJseSBhZGQgaXQgYWZ0ZXIgdGhlIGJlZ2luIGJsb2NrIGluZGV4LiAgRm9yCi0JIE1JUFMga25vd3Mgd2hhdCByZWFzb24sIHdlIG11c3Qgc3RyaXAgb2ZmIHRoZSBmdW5jdGlvbiB0eXBlCi0JIGF0IHRoaXMgcG9pbnQuICAqLwotICAgICAgY29mZl9pc19mdW5jdGlvbiA9IDE7Ci0gICAgICB0cV9zaGZ0Wy0xXSA9IHRxX05pbDsKLSAgICB9Ci0KLSAgd2hpbGUgKHRxX3NoZnQgIT0gJmNvZmZfdHlwZS50eXBlX3F1YWxpZmllcnNbTl9UUV0pCi0gICAgKnRxX3NoZnQrKyA9IHRxX05pbDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC50YWcgZGlyZWN0aXZlLCB3aGljaCBnaXZlcyB0aGUgbmFtZSBvZiBhIHN0cnVjdHVyZSwKLSAgIHVuaW9uIG9yIGVudW0uICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfdGFnIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0KLSAgaWYgKGNvZmZfc3ltX25hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudGFnIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGNvZmZfdGFnID0gKGNoYXIgKikgeG1hbGxvYyAoKHVuc2lnbmVkIGxvbmcpIChzdHJsZW4gKG5hbWUpICsgMSkpOwotICBzdHJjcHkgKGNvZmZfdGFnLCBuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAudmFsIGRpcmVjdGl2ZSwgd2hpY2ggZ2l2ZXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBJdAotICAgbWF5IGJlIHRoZSBuYW1lIG9mIGEgc3RhdGljIG9yIGdsb2JhbCBzeW1ib2wuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfdmFsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi52YWwgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGV4cHJlc3Npb24gKCZleHApOwotICBpZiAoZXhwLlhfb3AgIT0gT19jb25zdGFudCAmJiBleHAuWF9vcCAhPSBPX3N5bWJvbCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi52YWwgZXhwcmVzc2lvbiBpcyB0b28gY29wbWxleCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChleHAuWF9vcCA9PSBPX2NvbnN0YW50KQotICAgIGNvZmZfdmFsdWUgPSBleHAuWF9hZGRfbnVtYmVyOwotICBlbHNlCi0gICAgewotICAgICAgY29mZl9zeW1fdmFsdWUgPSBleHAuWF9hZGRfc3ltYm9sOwotICAgICAgY29mZl9zeW1fYWRkZW5kID0gZXhwLlhfYWRkX251bWJlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuZW5kZWYgZGlyZWN0aXZlLCB3aGljaCB0ZXJtaW5hdGVzIHByb2Nlc3Npbmcgb2YgQ09GRgotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9lbmRlZiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBzeW1pbnRfdCBpbmR4OwotICBsb2NhbHN5bV90ICpzeW07Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5lbmRlZiBwc2V1ZG8tb3AgdXNlZCBiZWZvcmUgLmRlZjsgaWdub3JlZCIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFtZSA9IGNvZmZfc3ltX25hbWU7Ci0gIGNvZmZfc3ltX25hbWUgPSAoY2hhciAqKSBOVUxMOwotCi0gIC8qIElmIHRoZSBzeW1ib2wgaXMgYSBzdGF0aWMgb3IgZXh0ZXJuYWwsIHdlIGhhdmUgYWxyZWFkeSBnb3R0ZW4gdGhlCi0gICAgIGFwcHJvcHJpYXRlIHR5cGUgYW5kIGNsYXNzLCBzbyBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcnJpZGUgdGhvc2UKLSAgICAgdmFsdWVzLiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGVyZSBhcmUgc29tZSB0eXBlIGFuZCBjbGFzc2VzCi0gICAgIHRoYXQgYXJlIG5vdCBpbiBDT0ZGLCBzdWNoIGFzIHNob3J0IGRhdGEsIGV0Yy4gICovCi0gIGlmIChjb2ZmX3N5bV92YWx1ZSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIGNvZmZfc3ltYm9sX3R5cCA9IHN0X05pbDsKLSAgICAgIGNvZmZfc3RvcmFnZV9jbGFzcyA9IHNjX05pbDsKLSAgICB9Ci0KLSAgY29mZl90eXBlLmV4dHJhX3NpemVzID0gY29mZl90YWcgIT0gKGNoYXIgKikgTlVMTDsKLSAgaWYgKGNvZmZfdHlwZS5udW1fZGltcyA+IDApCi0gICAgewotICAgICAgaW50IGRpZmYgPSBjb2ZmX3R5cGUubnVtX2RpbXMgLSBjb2ZmX3R5cGUubnVtX3NpemVzOwotICAgICAgaW50IGkgPSBjb2ZmX3R5cGUubnVtX2RpbXMgLSAxOwotICAgICAgaW50IGo7Ci0KLSAgICAgIGlmIChjb2ZmX3R5cGUubnVtX3NpemVzICE9IDEgfHwgZGlmZiA8IDApCi0JewotCSAgYXNfd2FybiAoXygiQmFkIENPRkYgZGVidWdnaW5nIGluZm8iKSk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIGlzIGFuIGFycmF5LCBtYWtlIHN1cmUgdGhlIHNhbWUgbnVtYmVyIG9mIGRpbWVuc2lvbnMKLQkgYW5kIHNpemVzIHdlcmUgcGFzc2VkLCBjcmVhdGluZyBleHRyYSBzaXplcyBmb3IgbXVsdGlwbHkKLQkgZGltZW5zaW9uZWQgYXJyYXlzIGlmIG5vdCBwYXNzZWQuICAqLwotICAgICAgY29mZl90eXBlLmV4dHJhX3NpemVzID0gMDsKLSAgICAgIGlmIChkaWZmKQotCXsKLQkgIGogPSAoc2l6ZW9mIChjb2ZmX3R5cGUuc2l6ZXMpIC8gc2l6ZW9mIChjb2ZmX3R5cGUuc2l6ZXNbMF0pKSAtIDE7Ci0JICB3aGlsZSAoaiA+PSAwKQotCSAgICB7Ci0JICAgICAgY29mZl90eXBlLnNpemVzW2pdID0gKCgoaiAtIGRpZmYpID49IDApCi0JCQkJICAgID8gY29mZl90eXBlLnNpemVzW2ogLSBkaWZmXQotCQkJCSAgICA6IDApOwotCSAgICAgIGotLTsKLQkgICAgfQotCi0JICBjb2ZmX3R5cGUubnVtX3NpemVzID0gaSArIDE7Ci0JICBmb3IgKGktLTsgaSA+PSAwOyBpLS0pCi0JICAgIGNvZmZfdHlwZS5zaXplc1tpXSA9IChjb2ZmX3R5cGUuZGltZW5zaW9uc1tpICsgMV0gPT0gMAotCQkJCSAgPyAwCi0JCQkJICA6IChjb2ZmX3R5cGUuc2l6ZXNbaSArIDFdCi0JCQkJICAgICAvIGNvZmZfdHlwZS5kaW1lbnNpb25zW2kgKyAxXSkpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGNvZmZfc3ltYm9sX3R5cCA9PSBzdF9NZW1iZXIKLQkgICAmJiBjb2ZmX3R5cGUubnVtX3NpemVzIC0gY29mZl90eXBlLmV4dHJhX3NpemVzID09IDEpCi0gICAgewotICAgICAgLyogSXMgdGhpcyBhIGJpdGZpZWxkPyAgVGhpcyBpcyBpbmRpY2F0ZWQgYnkgYSBzdHJ1Y3R1cmUgbWVtZWJlcgotCSBoYXZpbmcgYSBzaXplIGZpZWxkIHRoYXQgaXNuJ3QgYW4gYXJyYXkuICAqLwotICAgICAgY29mZl90eXBlLmJpdGZpZWxkID0gMTsKLSAgICB9Ci0KLSAgLyogRXhjZXB0IGZvciBlbnVtZXJhdGlvbiBtZW1iZXJzICYgYmVnaW4vZW5kaW5nIG9mIHNjb3BlcywgcHV0IHRoZQotICAgICB0eXBlIHdvcmQgaW4gdGhlIGF1eC4gc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKGNvZmZfc3ltYm9sX3R5cCA9PSBzdF9CbG9jayB8fCBjb2ZmX3N5bWJvbF90eXAgPT0gc3RfRW5kKQotICAgIGluZHggPSAwOwotICBlbHNlIGlmIChjb2ZmX2luc2lkZV9lbnVtZXJhdGlvbikKLSAgICBpbmR4ID0gY3VyX2ZpbGVfcHRyLT52b2lkX3R5cGU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoY29mZl90eXBlLmJhc2ljX3R5cGUgPT0gYnRfU3RydWN0Ci0JICB8fCBjb2ZmX3R5cGUuYmFzaWNfdHlwZSA9PSBidF9VbmlvbgotCSAgfHwgY29mZl90eXBlLmJhc2ljX3R5cGUgPT0gYnRfRW51bSkKLQl7Ci0JICBpZiAoY29mZl90YWcgPT0gKGNoYXIgKikgTlVMTCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oIk5vIHRhZyBzcGVjaWZpZWQgZm9yICVzIiksIG5hbWUpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBjb2ZmX3R5cGUudGFnX3B0ciA9IGdldF90YWcgKGNvZmZfdGFnLCAobG9jYWxzeW1fdCAqKSBOVUxMLAotCQkJCSAgICAgICBjb2ZmX3R5cGUuYmFzaWNfdHlwZSk7Ci0JfQotCi0gICAgICBpZiAoY29mZl9pc19mdW5jdGlvbikKLQl7Ci0JICBsYXN0X2Z1bmNfdHlwZV9pbmZvID0gY29mZl90eXBlOwotCSAgbGFzdF9mdW5jX3N5bV92YWx1ZSA9IGNvZmZfc3ltX3ZhbHVlOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaW5keCA9IGFkZF9hdXhfc3ltX3RpciAoJmNvZmZfdHlwZSwKLQkJCSAgICAgIGhhc2hfeWVzLAotCQkJICAgICAgJmN1cl9maWxlX3B0ci0+dGhhc2hfaGVhZFswXSk7Ci0gICAgfQotCi0gIC8qIERvIGFueSBsYXN0IG1pbnV0ZSBhZGp1c3RtZW50cyB0aGF0IGFyZSBuZWNlc3NhcnkuICAqLwotICBzd2l0Y2ggKGNvZmZfc3ltYm9sX3R5cCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBGb3IgdGhlIGJlZ2lubmluZyBvZiBzdHJ1Y3RzLCB1bmlvbnMsIGFuZCBlbnVtZXJhdGlvbnMsIHRoZQotCSBzaXplIGluZm8gbmVlZHMgdG8gYmUgcGFzc2VkIGluIHRoZSB2YWx1ZSBmaWVsZC4gICovCi0gICAgY2FzZSBzdF9CbG9jazoKLSAgICAgIGlmIChjb2ZmX3R5cGUubnVtX3NpemVzIC0gY29mZl90eXBlLm51bV9kaW1zIC0gY29mZl90eXBlLmV4dHJhX3NpemVzCi0JICAhPSAxKQotCXsKLQkgIGFzX3dhcm4gKF8oIkJhZCBDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JY29mZl92YWx1ZSA9IGNvZmZfdHlwZS5zaXplc1swXTsKLQotICAgICAgY29mZl9pbnNpZGVfZW51bWVyYXRpb24gPSAoY29mZl90eXBlLm9yaWdfdHlwZSA9PSBUX0VOVU0pOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIEZvciB0aGUgZW5kIG9mIHN0cnVjdHMsIHVuaW9ucywgYW5kIGVudW1lcmF0aW9ucywgb21pdCB0aGUKLQkgbmFtZSB3aGljaCBpcyBhbHdheXMgIi5lb3MiLiAgVGhpcyBuZWVkcyB0byBiZSBkb25lIGxhc3QsIHNvCi0JIHRoYXQgYW55IGVycm9yIHJlcG9ydGluZyBhYm92ZSBnaXZlcyB0aGUgY29ycmVjdCBuYW1lLiAgKi8KLSAgICBjYXNlIHN0X0VuZDoKLSAgICAgIGZyZWUgKG5hbWUpOwotICAgICAgbmFtZSA9IChjaGFyICopIE5VTEw7Ci0gICAgICBjb2ZmX3ZhbHVlID0gMDsKLSAgICAgIGNvZmZfaW5zaWRlX2VudW1lcmF0aW9uID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBNZW1iZXJzIG9mIHN0cnVjdHVyZXMgYW5kIHVuaW9ucyB0aGF0IGFyZW4ndCBiaXRmaWVsZHMsIG5lZWQKLQkgdG8gYWRqdXN0IHRoZSB2YWx1ZSBmcm9tIGEgYnl0ZSBvZmZzZXQgdG8gYSBiaXQgb2Zmc2V0LgotCSBNZW1iZXJzIG9mIGVudW1lcmF0aW9ucyBkbyBub3QgaGF2ZSB0aGUgdmFsdWUgYWRqdXN0ZWQsIGFuZAotCSBjYW4gYmUgZGlzdGluZ3Vpc2hlZCBieSBpbmR4ID09IGluZGV4TmlsLiAgRm9yIGVudW1lcmF0aW9ucywKLQkgdXBkYXRlIHRoZSBtYXhpbXVtIGVudW1lcmF0aW9uIHZhbHVlLiAgKi8KLSAgICBjYXNlIHN0X01lbWJlcjoKLSAgICAgIGlmICghIGNvZmZfdHlwZS5iaXRmaWVsZCAmJiAhIGNvZmZfaW5zaWRlX2VudW1lcmF0aW9uKQotCWNvZmZfdmFsdWUgKj0gODsKLQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIEFkZCB0aGUgc3ltYm9sLiAgKi8KLSAgc3ltID0gYWRkX2Vjb2ZmX3N5bWJvbCAobmFtZSwKLQkJCSAgY29mZl9zeW1ib2xfdHlwLAotCQkJICBjb2ZmX3N0b3JhZ2VfY2xhc3MsCi0JCQkgIGNvZmZfc3ltX3ZhbHVlLAotCQkJICBjb2ZmX3N5bV9hZGRlbmQsCi0JCQkgIChzeW1pbnRfdCkgY29mZl92YWx1ZSwKLQkJCSAgaW5keCk7Ci0KLSAgLyogZGVhbCB3aXRoIHN0cnVjdCwgdW5pb24sIGFuZCBlbnVtIHRhZ3MuICAqLwotICBpZiAoY29mZl9zeW1ib2xfdHlwID09IHN0X0Jsb2NrKQotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBvciB1cGRhdGUgdGhlIHRhZyBpbmZvcm1hdGlvbi4gICovCi0gICAgICB0YWdfdCAqdGFnX3B0ciA9IGdldF90YWcgKG5hbWUsCi0JCQkJc3ltLAotCQkJCWNvZmZfdHlwZS5iYXNpY190eXBlKTsKLSAgICAgIGZvcndhcmRfdCAqKnBmOwotCi0gICAgICAvKiBSZW1lbWJlciBhbnkgZm9yd2FyZCByZWZlcmVuY2VzLiAgKi8KLSAgICAgIGZvciAocGYgPSAmc3ltLT5mb3J3YXJkX3JlZjsKLQkgICAqcGYgIT0gKGZvcndhcmRfdCAqKSBOVUxMOwotCSAgIHBmID0gJigqcGYpLT5uZXh0KQotCTsKLSAgICAgICpwZiA9IHRhZ19wdHItPmZvcndhcmRfcmVmOwotICAgICAgdGFnX3B0ci0+Zm9yd2FyZF9yZWYgPSAoZm9yd2FyZF90ICopIE5VTEw7Ci0gICAgfQotfQotDAotLyogUGFyc2UgLmVuZCBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2VuZCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIG5hbWVfZW5kOwotICByZWdpc3RlciBpbnQgY2g7Ci0gIHN5bWJvbFMgKmVudDsKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5maWxlIGRpcmVjdGl2ZSIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmVudCBkaXJlY3RpdmUiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGNoID0gKm5hbWU7Ci0gIGlmICghIGlzX25hbWVfYmVnaW5uZXIgKGNoKSkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kIGRpcmVjdGl2ZSBoYXMgbm8gbmFtZSIpKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFRoZSB2YWx1ZSBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgLmVuZCBkaXJlY3RpdmUgYW5kIHRoZQotICAgICBjb3JyZXNwb25kaW5nIHN5bWJvbC4gIFdlIGNyZWF0ZSBhIGZha2Ugc3ltYm9sIHRvIGhvbGQgdGhlCi0gICAgIGN1cnJlbnQgbG9jYXRpb24sIGFuZCBwdXQgaW4gdGhlIG9mZnNldCB3aGVuIHdlIHdyaXRlIG91dCB0aGUKLSAgICAgc3ltYm9sLiAgKi8KLSAgZW50ID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotICBpZiAoZW50ID09IChzeW1ib2xTICopIE5VTEwpCi0gICAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgbmFtZXMgdW5rbm93biBzeW1ib2wiKSk7Ci0gIGVsc2UKLSAgICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoKGNvbnN0IGNoYXIgKikgTlVMTCwgc3RfRW5kLCBzY19UZXh0LAotCQkJICAgICBzeW1ib2xfbmV3ICgiTDBcMDAxIiwgbm93X3NlZywKLQkJCQkJICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwKLQkJCQkJIGZyYWdfbm93KSwKLQkJCSAgICAgKGJmZF92bWEpIDAsIChzeW1pbnRfdCkgMCwgKHN5bWludF90KSAwKTsKLQotICBjdXJfcHJvY19wdHIgPSAocHJvY190ICopIE5VTEw7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogUGFyc2UgLmVudCBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2VudCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIG5hbWVfZW5kOwotICByZWdpc3RlciBpbnQgY2g7Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgYWRkX2ZpbGUgKChjb25zdCBjaGFyICopIE5VTEwsIDAsIDEpOwotCi0gIGlmIChjdXJfcHJvY19wdHIgIT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oInNlY29uZCAuZW50IGRpcmVjdGl2ZSBmb3VuZCBiZWZvcmUgLmVuZCBkaXJlY3RpdmUiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGNoID0gKm5hbWU7Ci0gIGlmICghIGlzX25hbWVfYmVnaW5uZXIgKGNoKSkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW50IGRpcmVjdGl2ZSBoYXMgbm8gbmFtZSIpKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGFkZF9wcm9jZWR1cmUgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICAvKiBUaGUgLmVudCBkaXJlY3RpdmUgaXMgc29tZXRpbWVzIGZvbGxvd2VkIGJ5IGEgbnVtYmVyLiAgSSdtIG5vdAotICAgICByZWFsbHkgc3VyZSB3aGF0IHRoZSBudW1iZXIgbWVhbnMuICBJIGRvbid0IHNlZSBhbnkgd2F5IHRvIHN0b3JlCi0gICAgIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgUERSLiAgVGhlIElyaXggNCBhc3NlbWJsZXIgc2VlbXMgdG8gaWdub3JlCi0gICAgIHRoZSBpbmZvcm1hdGlvbi4gICovCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLSAgaWYgKGlzZGlnaXQgKCppbnB1dF9saW5lX3BvaW50ZXIpIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQotICAgICh2b2lkKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogUGFyc2UgLmV4dGVybiBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2V4dGVybiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9scDsKLSAgdmFsdWVUIHNpemU7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW1ib2xwID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xwKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBzeW1ib2xwLT5lY29mZl9leHRlcm5fc2l6ZSA9IHNpemU7Ci19Ci0MCi0vKiBQYXJzZSAuZmlsZSBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2ZpbGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IGluZHg7Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBsZW47Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciAhPSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiTm8gd2F5IHRvIGhhbmRsZSAuZmlsZSB3aXRoaW4gLmVudC8uZW5kIHNlY3Rpb24iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbmR4ID0gKGludCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgLyogRklYTUU6IHdlIGRvbid0IGhhdmUgdG8gc2F2ZSB0aGUgbmFtZSBoZXJlLiAgKi8KLSAgbmFtZSA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuKTsKLQotICBhZGRfZmlsZSAobmFtZSwgaW5keCAtIDEsIDApOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKiBQYXJzZSAuZm1hc2sgZGlyZWN0aXZlcy4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9mbWFzayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsb25nIHZhbDsKLQotICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZm1hc2sgb3V0c2lkZSBvZiAuZW50IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmdmFsKSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5mbWFzayBkaXJlY3RpdmUiKSk7Ci0gICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGN1cl9wcm9jX3B0ci0+cGRyLmZyZWdtYXNrID0gdmFsOwotICBjdXJfcHJvY19wdHItPnBkci5mcmVnb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIFBhcnNlIC5mcmFtZSBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2ZyYW1lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGxvbmcgdmFsOwotCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5mcmFtZSBvdXRzaWRlIG9mIC5lbnQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjdXJfcHJvY19wdHItPnBkci5mcmFtZXJlZyA9IHRjX2dldF9yZWdpc3RlciAoMSk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICcsJwotICAgICAgfHwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZ2YWwpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgLmZyYW1lIGRpcmVjdGl2ZSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY3VyX3Byb2NfcHRyLT5wZHIuZnJhbWVvZmZzZXQgPSB2YWw7Ci0KLSAgY3VyX3Byb2NfcHRyLT5wZHIucGNyZWcgPSB0Y19nZXRfcmVnaXN0ZXIgKDApOwotCi0jaWYgMCAvKiBBbHBoYS1PU0YxIGFkZHMgInRoZSBvZmZzZXQgb2Ygc2F2ZWQgJGEwIGZyb20gJHNwIiwgYWNjb3JkaW5nCi0JIHRvIFNhbmRyby4gIEkgZG9uJ3QgeWV0IGtub3cgd2hlcmUgdGhpcyB2YWx1ZSBzaG91bGQgYmUgc3RvcmVkLCBpZgotCSBhbnl3aGVyZS4gICovCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0jZWxzZQotICBzX2lnbm9yZSAoNDIpOwotI2VuZGlmCi19Ci0MCi0vKiBQYXJzZSAubWFzayBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX21hc2sgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbG9uZyB2YWw7Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLm1hc2sgb3V0c2lkZSBvZiAuZW50IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmdmFsKSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5tYXNrIGRpcmVjdGl2ZSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY3VyX3Byb2NfcHRyLT5wZHIucmVnbWFzayA9IHZhbDsKLSAgY3VyX3Byb2NfcHRyLT5wZHIucmVnb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIFBhcnNlIC5sb2MgZGlyZWN0aXZlcy4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9sb2MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbGluZW5vX2xpc3RfdCAqbGlzdDsKLSAgc3ltaW50X3QgbGluZW5vOwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5sb2MgYmVmb3JlIC5maWxlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKG5vd19zZWcgIT0gdGV4dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5sb2Mgb3V0c2lkZSBvZiAudGV4dCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFNraXAgdGhlIGZpbGUgbnVtYmVyLiAgKi8KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGxpbmVubyA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgaWYgKGxpc3RpbmcpCi0gICAgbGlzdGluZ19zb3VyY2VfbGluZSAobGluZW5vKTsKLSNlbmRpZgotCi0gIC8qIElmIHdlJ3JlIGJ1aWxkaW5nIHN0YWJzLCB0aGVuIG91dHB1dCBhIHNwZWNpYWwgbGFiZWwgcmF0aGVyIHRoYW4KLSAgICAgRUNPRkYgbGluZSBudW1iZXIgaW5mby4gICovCi0gIGlmIChzdGFic19zZWVuKQotICAgIHsKLSAgICAgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sICgoY2hhciAqKSBOVUxMLCBzdF9MYWJlbCwgc2NfVGV4dCwKLQkJCSAgICAgICBzeW1ib2xfbmV3ICgiTDBcMDAxIiwgbm93X3NlZywKLQkJCQkJICAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkJCQkgICBmcmFnX25vdyksCi0JCQkgICAgICAgKGJmZF92bWEpIDAsIDAsIGxpbmVubyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGxpc3QgPSBhbGxvY2F0ZV9saW5lbm9fbGlzdCAoKTsKLQotICBsaXN0LT5uZXh0ID0gKGxpbmVub19saXN0X3QgKikgTlVMTDsKLSAgbGlzdC0+ZmlsZSA9IGN1cl9maWxlX3B0cjsKLSAgbGlzdC0+cHJvYyA9IGN1cl9wcm9jX3B0cjsKLSAgbGlzdC0+ZnJhZyA9IGZyYWdfbm93OwotICBsaXN0LT5wYWRkciA9IGZyYWdfbm93X2ZpeCAoKTsKLSAgbGlzdC0+bGluZW5vID0gbGluZW5vOwotCi0gIC8qIFdlIGRvbid0IHdhbnQgdG8gbWVyZ2UgZmlsZXMgd2hpY2ggaGF2ZSBsaW5lIG51bWJlcnMuICAqLwotICBjdXJfZmlsZV9wdHItPmZkci5mTWVyZ2UgPSAwOwotCi0gIC8qIEEgLmxvYyBkaXJlY3RpdmUgd2lsbCBzb21ldGltZXMgYXBwZWFyIGJlZm9yZSBhIC5lbnQgZGlyZWN0aXZlLAotICAgICB3aGljaCBtZWFucyB0aGF0IGN1cl9wcm9jX3B0ciB3aWxsIGJlIE5VTEwgaGVyZS4gIEFycmFuZ2UgdG8KLSAgICAgcGF0Y2ggdGhpcyB1cC4gICovCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGxpbmVub19saXN0X3QgKipwbDsKLQotICAgICAgcGwgPSAmbm9wcm9jX2xpbmVubzsKLSAgICAgIHdoaWxlICgqcGwgIT0gKGxpbmVub19saXN0X3QgKikgTlVMTCkKLQlwbCA9ICYoKnBsKS0+bmV4dDsKLSAgICAgICpwbCA9IGxpc3Q7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbGFzdF9saW5lbm8gPSBsaXN0OwotICAgICAgKmxhc3RfbGluZW5vX3B0ciA9IGxpc3Q7Ci0gICAgICBsYXN0X2xpbmVub19wdHIgPSAmbGlzdC0+bmV4dDsKLSAgICB9Ci19Ci0KLS8qIFRoZSBNSVBTIGFzc2VtYmxlciBzb21ldGltZXMgaW5zZXJ0cyBub3AgaW5zdHJ1Y3Rpb25zIGluIHRoZQotICAgaW5zdHJ1Y3Rpb24gc3RyZWFtLiAgV2hlbiB0aGlzIGhhcHBlbnMsIHdlIG11c3QgcGF0Y2ggdXAgdGhlIC5sb2MKLSAgIGluZm9ybWF0aW9uIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBpbnN0cnVjdGlvbiBhZnRlciB0aGUgbm9wLiAgKi8KLQotdm9pZAotZWNvZmZfZml4X2xvYyAob2xkX2ZyYWcsIG9sZF9mcmFnX29mZnNldCkKLSAgICAgZnJhZ1MgKm9sZF9mcmFnOwotICAgICB1bnNpZ25lZCBsb25nIG9sZF9mcmFnX29mZnNldDsKLXsKLSAgaWYgKGxhc3RfbGluZW5vICE9IE5VTEwKLSAgICAgICYmIGxhc3RfbGluZW5vLT5mcmFnID09IG9sZF9mcmFnCi0gICAgICAmJiBsYXN0X2xpbmVuby0+cGFkZHIgPT0gb2xkX2ZyYWdfb2Zmc2V0KQotICAgIHsKLSAgICAgIGxhc3RfbGluZW5vLT5mcmFnID0gZnJhZ19ub3c7Ci0gICAgICBsYXN0X2xpbmVuby0+cGFkZHIgPSBmcmFnX25vd19maXggKCk7Ci0gICAgfQotfQotDAotLyogTWFrZSBzdXJlIHRoZSBAc3RhYnMgc3ltYm9sIGlzIGVtaXR0ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotbWFya19zdGFicyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoISBzdGFic19zZWVuKQotICAgIHsKLSAgICAgIC8qIEFkZCBhIGR1bW15IEBzdGFicyBkeW1ib2wuICovCi0gICAgICBzdGFic19zZWVuID0gMTsKLSAgICAgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sIChzdGFic19zeW1ib2wsIHN0TmlsLCBzY0luZm8sCi0JCQkgICAgICAgKHN5bWJvbFMgKikgTlVMTCwKLQkJCSAgICAgICAoYmZkX3ZtYSkgMCwgKHN5bWludF90KSAtMSwKLQkJCSAgICAgICBFQ09GRl9NQVJLX1NUQUIgKDApKTsKLSAgICB9Ci19Ci0MCi0vKiBQYXJzZSAud2Vha2V4dCBkaXJlY3RpdmVzLiAgKi8KLSNpZm5kZWYgVENfTUlQUwotLyogRm9yIFRDX01JUFMgdXNlIHRoZSB2ZXJzaW9uIGluIHRjLW1pcHMuYy4gKi8KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JewotCSAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAotCQkgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQl7Ci0JICBleHByZXNzaW9uICgmZXhwKTsKLQkgIGlmIChleHAuWF9vcCAhPSBPX3N5bWJvbCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiYmFkIC53ZWFrZXh0IGRpcmVjdGl2ZSIpKTsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBzeW1ib2xQLT5zeV92YWx1ZSA9IGV4cDsKLQl9Ci0gICAgfQotCi0gIFNfU0VUX1dFQUsgKHN5bWJvbFApOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0jZW5kaWYgLyogbm90IFRDX01JUFMgKi8KLQwKLS8qIEhhbmRsZSAuc3RhYnMgZGlyZWN0aXZlcy4gIFRoZSBhY3R1YWwgcGFyc2luZyByb3V0aW5lIGlzIGRvbmUgYnkgYQotICAgZ2VuZXJpYyByb3V0aW5lLiAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB2aWEgT0JKX1BST0NFU1NfU1RBQi4KLSAgIFdoZW4gdGhpcyBpcyBjYWxsZWQsIGlucHV0X2xpbmVfcG9pbnRlciB3aWxsIGJlIHBvaW50aW5nIGF0IHRoZQotICAgdmFsdWUgZmllbGQgb2YgdGhlIHN0YWIuCi0KLSAgIC5zdGFicyBkaXJlY3RpdmVzIGhhdmUgZml2ZSBmaWVsZHM6Ci0JInN0cmluZyIJYSBzdHJpbmcsIGVuY29kaW5nIHRoZSB0eXBlIGluZm9ybWF0aW9uLgotCWNvZGUJCWEgbnVtZXJpYyBjb2RlLCBkZWZpbmVkIGluIDxzdGFiLmg+Ci0JMAkJYSB6ZXJvCi0JZGVzYwkJYSB6ZXJvIG9yIGxpbmUgbnVtYmVyCi0JdmFsdWUJCWEgbnVtZXJpYyB2YWx1ZSBvciBhbiBhZGRyZXNzLgotCi0gICAgSWYgdGhlIHZhbHVlIGlzIHJlbG9jYXRhYmxlLCB3ZSB0cmFuc2Zvcm0gdGhpcyBpbnRvOgotCWlzcwkJcG9pbnRzIGFzIGFuIGluZGV4IGludG8gc3RyaW5nIHNwYWNlCi0JdmFsdWUJCXZhbHVlIGZyb20gbG9va3VwIG9mIHRoZSBuYW1lCi0Jc3QJCXN0IGZyb20gbG9va3VwIG9mIHRoZSBuYW1lCi0Jc2MJCXNjIGZyb20gbG9va3VwIG9mIHRoZSBuYW1lCi0JaW5kZXgJCWNvZGV8Q09ERV9NQVNLCi0KLSAgICBJZiB0aGUgdmFsdWUgaXMgbm90IHJlbG9jYXRhYmxlLCB3ZSB0cmFuc2Zvcm0gdGhpcyBpbnRvOgotCWlzcwkJcG9pbnRzIGFzIGFuIGluZGV4IGludG8gc3RyaW5nIHNwYWNlCi0JdmFsdWUJCXZhbHVlCi0Jc3QJCXN0X05pbAotCXNjCQlzY19OaWwKLQlpbmRleAkJY29kZXxDT0RFX01BU0sKLQotICAgIC5zdGFibiBkaXJlY3RpdmVzIGhhdmUgZm91ciBmaWVsZHMgKHN0cmluZyBpcyBudWxsKToKLQljb2RlCQlhIG51bWVyaWMgY29kZSwgZGVmaW5lZCBpbiA8c3RhYi5oPgotCTAJCWEgemVybwotCWRlc2MJCWEgemVybyBvciBhIGxpbmUgbnVtYmVyCi0JdmFsdWUJCWEgbnVtZXJpYyB2YWx1ZSBvciBhbiBhZGRyZXNzLiAgKi8KLQotdm9pZAotZWNvZmZfc3RhYiAoc2VjLCB3aGF0LCBzdHJpbmcsIHR5cGUsIG90aGVyLCBkZXNjKQotICAgICBzZWdUIHNlYzsKLSAgICAgaW50IHdoYXQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGludCBvdGhlcjsKLSAgICAgaW50IGRlc2M7Ci17Ci0gIGVmZHJfdCAqc2F2ZV9maWxlX3B0ciA9IGN1cl9maWxlX3B0cjsKLSAgc3ltYm9sUyAqc3ltOwotICBzeW1pbnRfdCB2YWx1ZTsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0gIHN0X3Qgc3Q7Ci0gIHNjX3Qgc2M7Ci0gIHN5bWludF90IGluZHg7Ci0gIGxvY2Fsc3ltX3QgKmhvbGQgPSBOVUxMOwotCi0gIGVjb2ZmX2RlYnVnZ2luZ19zZWVuID0gMTsKLQotICAvKiBXZSBkb24ndCBoYW5kbGUgLnN0YWJkLiAgKi8KLSAgaWYgKHdoYXQgIT0gJ3MnICYmIHdoYXQgIT0gJ24nKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLnN0YWIlYyBpcyBub3Qgc3VwcG9ydGVkIiksIHdoYXQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBBIC5zdGFibiB1c2VzIGEgbnVsbCBuYW1lLCBub3QgYW4gZW1wdHkgc3RyaW5nLiAgKi8KLSAgaWYgKHdoYXQgPT0gJ24nKQotICAgIHN0cmluZyA9IE5VTEw7Ci0KLSAgLyogV2UgaWdub3JlIHRoZSBvdGhlciBmaWVsZC4gICovCi0gIGlmIChvdGhlciAhPSAwKQotICAgIGFzX3dhcm4gKF8oIi5zdGFiJWM6IGlnbm9yaW5nIG5vbi16ZXJvIG90aGVyIGZpZWxkIiksIHdoYXQpOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgY3VycmVudCBmaWxlLiAgKi8KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgewotICAgICAgYWRkX2ZpbGUgKChjb25zdCBjaGFyICopIE5VTEwsIDAsIDEpOwotICAgICAgc2F2ZV9maWxlX3B0ciA9IGN1cl9maWxlX3B0cjsKLSAgICB9Ci0KLSAgLyogRm9yIHN0YWJzIGluIEVDT0ZGLCB0aGUgZmlyc3Qgc3ltYm9sIG11c3QgYmUgQHN0YWJzLiAgVGhpcyBpcyBhCi0gICAgIHNpZ25hbCB0byBnZGIuICAqLwotICBpZiAoc3RhYnNfc2VlbiA9PSAwKQotICAgIG1hcmtfc3RhYnMgKDApOwotCi0gIC8qIExpbmUgbnVtYmVyIHN0YWJzIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCBzaW5jZSB0aGV5IGhhdmUgdHdvCi0gICAgIHZhbHVlcywgdGhlIGxpbmUgbnVtYmVyIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUgbGFiZWwuICBXZSB1c2UgdGhlCi0gICAgIGluZGV4IGZpZWxkIChha2EgZGVzYykgdG8gaG9sZCB0aGUgbGluZSBudW1iZXIsIGFuZCB0aGUgdmFsdWUKLSAgICAgZmllbGQgdG8gaG9sZCB0aGUgYWRkcmVzcy4gIFRoZSBzeW1ib2wgdHlwZSBpcyBzdF9MYWJlbCwgd2hpY2gKLSAgICAgc2hvdWxkIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlciBzdGFicywgc28gdGhhdCBnZGIgY2FuCi0gICAgIHJlY29nbml6ZSBpdC4gICovCi0gIGlmICh0eXBlID09IE5fU0xJTkUpCi0gICAgewotICAgICAgU1lNUiBkdW1teV9zeW1yOwotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIGNoYXIgbmFtZV9lbmQ7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICAgICAgaWYgKGxpc3RpbmcpCi0JbGlzdGluZ19zb3VyY2VfbGluZSAoKHVuc2lnbmVkIGludCkgZGVzYyk7Ci0jZW5kaWYKLQotICAgICAgZHVtbXlfc3ltci5pbmRleCA9IGRlc2M7Ci0gICAgICBpZiAoZHVtbXlfc3ltci5pbmRleCAhPSBkZXNjKQotCXsKLQkgIGFzX3dhcm4gKF8oIkxpbmUgbnVtYmVyICglZCkgZm9yIC5zdGFiJWMgZGlyZWN0aXZlIGNhbm5vdCBmaXQgaW4gaW5kZXggZmllbGQgKDIwIGJpdHMpIiksCi0JCSAgIGRlc2MsIHdoYXQpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgICAgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gICAgICB2YWx1ZSA9IDA7Ci0gICAgICBhZGRlbmQgPSAwOwotICAgICAgc3QgPSBzdF9MYWJlbDsKLSAgICAgIHNjID0gc2NfVGV4dDsKLSAgICAgIGluZHggPSBkZXNjOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZm5kZWYgTk9fTElTVElORwotICAgICAgaWYgKGxpc3RpbmcgJiYgKHR5cGUgPT0gTl9TTyB8fCB0eXBlID09IE5fU09MKSkKLQlsaXN0aW5nX3NvdXJjZV9maWxlIChzdHJpbmcpOwotI2VuZGlmCi0KLSAgICAgIGlmIChpc2RpZ2l0ICgqaW5wdXRfbGluZV9wb2ludGVyKQotCSAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScKLQkgIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJysnKQotCXsKLQkgIHN0ID0gc3RfTmlsOwotCSAgc2MgPSBzY19OaWw7Ci0JICBzeW0gPSAoc3ltYm9sUyAqKSBOVUxMOwotCSAgdmFsdWUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIGFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoISBpc19uYW1lX2JlZ2lubmVyICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JewotCSAgYXNfd2FybiAoXygiSWxsZWdhbCAuc3RhYiVjIGRpcmVjdGl2ZSwgYmFkIGNoYXJhY3RlciIpLCB3aGF0KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXhwcmVzc2lvblMgZXhwOwotCi0JICBzYyA9IHNjX05pbDsKLQkgIHN0ID0gc3RfTmlsOwotCi0JICBleHByZXNzaW9uICgmZXhwKTsKLQkgIGlmIChleHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgc3ltID0gTlVMTDsKLQkgICAgICB2YWx1ZSA9IGV4cC5YX2FkZF9udW1iZXI7Ci0JICAgICAgYWRkZW5kID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoZXhwLlhfb3AgPT0gT19zeW1ib2wpCi0JICAgIHsKLQkgICAgICBzeW0gPSBleHAuWF9hZGRfc3ltYm9sOwotCSAgICAgIHZhbHVlID0gMDsKLQkgICAgICBhZGRlbmQgPSBleHAuWF9hZGRfbnVtYmVyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzeW0gPSBtYWtlX2V4cHJfc3ltYm9sICgmZXhwKTsKLQkgICAgICB2YWx1ZSA9IDA7Ci0JICAgICAgYWRkZW5kID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgaW5keCA9IEVDT0ZGX01BUktfU1RBQiAodHlwZSk7Ci0gICAgfQotCi0gIC8qIERvbid0IHN0b3JlIHRoZSBzdGFicyBzeW1ib2wgd2UgYXJlIGNyZWF0aW5nIGFzIHRoZSB0eXBlIG9mIHRoZQotICAgICBFQ09GRiBzeW1ib2wuICBXZSB3YW50IHRvIGNvbXB1dGUgdGhlIHR5cGUgb2YgdGhlIEVDT0ZGIHN5bWJvbAotICAgICBpbmRlcGVuZGVudGx5LiAgKi8KLSAgaWYgKHN5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIGhvbGQgPSBzeW0tPmVjb2ZmX3N5bWJvbDsKLQotICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoc3RyaW5nLCBzdCwgc2MsIHN5bSwgYWRkZW5kLCB2YWx1ZSwgaW5keCk7Ci0KLSAgaWYgKHN5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHN5bS0+ZWNvZmZfc3ltYm9sID0gaG9sZDsKLQotICAvKiBSZXN0b3JlIG5vcm1hbCBmaWxlIHR5cGUuICAqLwotICBjdXJfZmlsZV9wdHIgPSBzYXZlX2ZpbGVfcHRyOwotfQotDAotLyogRnJvYiBhbiBFQ09GRiBzeW1ib2wuICBTbWFsbCBjb21tb24gc3ltYm9scyBnbyBpbnRvIGEgc3BlY2lhbAotICAgLnNjb21tb24gc2VjdGlvbiByYXRoZXIgdGhhbiBiZmRfY29tX3NlY3Rpb24uICAqLwotCi12b2lkCi1lY29mZl9mcm9iX3N5bWJvbCAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIGlmIChTX0lTX0NPTU1PTiAoc3ltKQotICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bSkgPiAwCi0gICAgICAmJiBTX0dFVF9WQUxVRSAoc3ltKSA8PSBiZmRfZ2V0X2dwX3NpemUgKHN0ZG91dHB1dCkpCi0gICAgewotICAgICAgc3RhdGljIGFzZWN0aW9uIHNjb21fc2VjdGlvbjsKLSAgICAgIHN0YXRpYyBhc3ltYm9sIHNjb21fc3ltYm9sOwotCi0gICAgICAvKiBXZSBtdXN0IGNvbnN0cnVjdCBhIGZha2Ugc2VjdGlvbiBzaW1pbGFyIHRvIGJmZF9jb21fc2VjdGlvbgotCSBidXQgd2l0aCB0aGUgbmFtZSAuc2NvbW1vbi4gICovCi0gICAgICBpZiAoc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICBzY29tX3NlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb247Ci0JICBzY29tX3NlY3Rpb24ubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBzY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmc2NvbV9zZWN0aW9uOwotCSAgc2NvbV9zZWN0aW9uLnN5bWJvbCA9ICZzY29tX3N5bWJvbDsKLQkgIHNjb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZzY29tX3NlY3Rpb24uc3ltYm9sOwotCSAgc2NvbV9zeW1ib2wgPSAqYmZkX2NvbV9zZWN0aW9uLnN5bWJvbDsKLQkgIHNjb21fc3ltYm9sLm5hbWUgPSAiLnNjb21tb24iOwotCSAgc2NvbV9zeW1ib2wuc2VjdGlvbiA9ICZzY29tX3NlY3Rpb247Ci0JfQotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltLCAmc2NvbV9zZWN0aW9uKTsKLSAgICB9Ci0KLSAgLyogRG91YmxlIGNoZWNrIHdlYWsgc3ltYm9scy4gICovCi0gIGlmIChzeW0tPmJzeW0tPmZsYWdzICYgQlNGX1dFQUspCi0gICAgewotICAgICAgaWYgKFNfSVNfQ09NTU9OIChzeW0pKQotCWFzX2JhZCAoXygiU3ltYm9sIGAlcycgY2FuIG5vdCBiZSBib3RoIHdlYWsgYW5kIGNvbW1vbiIpLAotCQlTX0dFVF9OQU1FIChzeW0pKTsKLSAgICB9Ci19Ci0MCi0vKiBBZGQgYnl0ZXMgdG8gdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIGJ1ZmZlci4gICovCi0KLXN0YXRpYyBjaGFyICoKLWVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsIGJ1ZnB0ciwgbmVlZCkKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgY2hhciAqYnVmcHRyOwotICAgICB1bnNpZ25lZCBsb25nIG5lZWQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgYXQ7Ci0gIHVuc2lnbmVkIGxvbmcgd2FudDsKLQotICBhdCA9IGJ1ZnB0ciAtICpidWY7Ci0gIG5lZWQgLT0gKmJ1ZmVuZCAtIGJ1ZnB0cjsKLSAgaWYgKG5lZWQgPCBQQUdFX1NJWkUpCi0gICAgbmVlZCA9IFBBR0VfU0laRTsKLSAgd2FudCA9ICgqYnVmZW5kIC0gKmJ1ZikgKyBuZWVkOwotICAqYnVmID0geHJlYWxsb2MgKCpidWYsIHdhbnQpOwotICAqYnVmZW5kID0gKmJ1ZiArIHdhbnQ7Ci0gIHJldHVybiAqYnVmICsgYXQ7Ci19Ci0KLS8qIEFkanVzdCB0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24gYnVmZmVyIHRvIHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQKLSAgIGZvciB0aGUgRUNPRkYgdGFyZ2V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1lY29mZl9wYWRkaW5nX2FkanVzdCAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCwgYnVmcHRycHRyKQotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0gICAgIGNoYXIgKipidWZwdHJwdHI7Ci17Ci0gIGJmZF9zaXplX3R5cGUgYWxpZ247Ci0KLSAgYWxpZ24gPSBiYWNrZW5kLT5kZWJ1Z19hbGlnbjsKLSAgaWYgKChvZmZzZXQgJiAoYWxpZ24gLSAxKSkgIT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGFkZDsKLQotICAgICAgYWRkID0gYWxpZ24gLSAob2Zmc2V0ICYgKGFsaWduIC0gMSkpOwotICAgICAgaWYgKCpidWZlbmQgLSAoKmJ1ZiArIG9mZnNldCkgPCBhZGQpCi0JKHZvaWQpIGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsICpidWYgKyBvZmZzZXQsIGFkZCk7Ci0gICAgICBtZW1zZXQgKCpidWYgKyBvZmZzZXQsIDAsIGFkZCk7Ci0gICAgICBvZmZzZXQgKz0gYWRkOwotICAgICAgaWYgKGJ1ZnB0cnB0ciAhPSAoY2hhciAqKikgTlVMTCkKLQkqYnVmcHRycHRyID0gKmJ1ZiArIG9mZnNldDsKLSAgICB9Ci0KLSAgcmV0dXJuIG9mZnNldDsKLX0KLQotLyogQnVpbGQgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWVjb2ZmX2J1aWxkX2xpbmVubyAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCwgbGluZWNudHB0cikKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7Ci0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotICAgICBsb25nICpsaW5lY250cHRyOwotewotICBjaGFyICpidWZwdHI7Ci0gIHJlZ2lzdGVyIGxpbmVub19saXN0X3QgKmw7Ci0gIGxpbmVub19saXN0X3QgKmxhc3Q7Ci0gIGVmZHJfdCAqZmlsZTsKLSAgcHJvY190ICpwcm9jOwotICB1bnNpZ25lZCBsb25nIGM7Ci0gIGxvbmcgaWxpbmU7Ci0gIGxvbmcgdG90Y291bnQ7Ci0gIGxpbmVub19saXN0X3QgZmlyc3Q7Ci0gIGxpbmVub19saXN0X3QgKmxvY2FsX2ZpcnN0X2xpbmVubyA9IGZpcnN0X2xpbmVubzsKLQotICBpZiAobGluZWNudHB0ciAhPSAobG9uZyAqKSBOVUxMKQotICAgICpsaW5lY250cHRyID0gMDsKLQotICBidWZwdHIgPSAqYnVmICsgb2Zmc2V0OwotCi0gIGZpbGUgPSAoZWZkcl90ICopIE5VTEw7Ci0gIHByb2MgPSAocHJvY190ICopIE5VTEw7Ci0gIGxhc3QgPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMOwotICBjID0gb2Zmc2V0OwotICBpbGluZSA9IDA7Ci0gIHRvdGNvdW50ID0gMDsKLQotICAvKiBGb3Igc29tZSByZWFzb24gdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHByb2NlZHVyZSBpcyBpZ25vcmVkCi0gICAgIHdoZW4gcmVhZGluZyBsaW5lIG51bWJlcnMuICBUaGlzIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSBhZGRyZXNzIG9mCi0gICAgIHRoZSBmaXJzdCBwcm9jZWR1cmUgaXMgMCwgYnV0IHdoZW4gZ2NjIGlzIGdlbmVyYXRpbmcgTUlQUwotICAgICBlbWJlZGRlZCBQSUMgY29kZSwgaXQgd2lsbCBwdXQgc3RyaW5ncyBpbiB0aGUgLnRleHQgc2VjdGlvbgotICAgICBiZWZvcmUgdGhlIGZpcnN0IHByb2NlZHVyZS4gIFdlIGNvcGUgYnkgaW5zZXJ0aW5nIGEgZHVtbXkgbGluZSBpZgotICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgcHJvY2VkdXJlIGlzIG5vdCAwLiAgSG9wZWZ1bGx5IHRoaXMKLSAgICAgd29uJ3Qgc2NyZXcgdGhpbmdzIHVwIHRvbyBiYWRseS4gIAotCi0gICAgIERvbid0IGRvIHRoaXMgZm9yIEVDT0ZGIGFzc2VtYmx5IHNvdXJjZSBsaW5lIG51bWJlcnMuICBUaGV5IHdvcmsKLSAgICAgd2l0aG91dCB0aGlzIGV4dHJhIGF0dGVudGlvbi4gICovCi0gIGlmIChkZWJ1Z190eXBlICE9IERFQlVHX0VDT0ZGCi0gICAgICAmJiBmaXJzdF9wcm9jX3B0ciAhPSAocHJvY190ICopIE5VTEwKLSAgICAgICYmIGxvY2FsX2ZpcnN0X2xpbmVubyAhPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMCi0gICAgICAmJiAoKFNfR0VUX1ZBTFVFIChmaXJzdF9wcm9jX3B0ci0+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+ZWNvZmZfc3ltLmFzeW0pCi0JCQkgICAgICAmJiAoU19JU19FWFRFUk5BTCAoYXNfc3ltKQotCQkJCSAgfHwgU19JU19XRUFLIChhc19zeW0pCi0JCQkJICB8fCAhIFNfSVNfREVGSU5FRCAoYXNfc3ltKSkpCi0JCQkgICAgewotCQkJICAgICAgaWYgKChhc19zeW0tPmJzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAwKQotCQkJCXN0ID0gc3RfUHJvYzsKLQkJCSAgICAgIGVsc2UKLQkJCQlzdCA9IHN0X0dsb2JhbDsKLQkJCSAgICB9Ci0JCQkgIGVsc2UgaWYgKHNlZyA9PSB0ZXh0X3NlY3Rpb24pCi0JCQkgICAgc3QgPSBzdF9MYWJlbDsKLQkJCSAgZWxzZQotCQkJICAgIHN0ID0gc3RfU3RhdGljOwotCi0JCQkgIGlmICghIFNfSVNfREVGSU5FRCAoYXNfc3ltKSkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoYXNfc3ltLT5lY29mZl9leHRlcm5fc2l6ZSA9PSAwCi0JCQkJICB8fCAoYXNfc3ltLT5lY29mZl9leHRlcm5fc2l6ZQotCQkJCSAgICAgID4gYmZkX2dldF9ncF9zaXplIChzdGRvdXRwdXQpKSkKLQkJCQlzYyA9IHNjX1VuZGVmaW5lZDsKLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICBzYyA9IHNjX1NVbmRlZmluZWQ7Ci0JCQkJICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9Ci0JCQkJICAgIGFzX3N5bS0+ZWNvZmZfZXh0ZXJuX3NpemU7Ci0JCQkJfQotI2lmZGVmIFNfU0VUX1NJWkUKLQkJCSAgICAgIFNfU0VUX1NJWkUgKGFzX3N5bSwgYXNfc3ltLT5lY29mZl9leHRlcm5fc2l6ZSk7Ci0jZW5kaWYKLQkJCSAgICB9Ci0JCQkgIGVsc2UgaWYgKFNfSVNfQ09NTU9OIChhc19zeW0pKQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChTX0dFVF9WQUxVRSAoYXNfc3ltKSA+IDAKLQkJCQkgICYmIChTX0dFVF9WQUxVRSAoYXNfc3ltKQotCQkJCSAgICAgIDw9IGJmZF9nZXRfZ3Bfc2l6ZSAoc3Rkb3V0cHV0KSkpCi0JCQkJc2MgPSBzY19TQ29tbW9uOwotCQkJICAgICAgZWxzZQotCQkJCXNjID0gc2NfQ29tbW9uOwotCQkJICAgIH0KLQkJCSAgZWxzZSBpZiAoc2VnID09IHRleHRfc2VjdGlvbikKLQkJCSAgICBzYyA9IHNjX1RleHQ7Ci0JCQkgIGVsc2UgaWYgKHNlZyA9PSBkYXRhX3NlY3Rpb24pCi0JCQkgICAgc2MgPSBzY19EYXRhOwotCQkJICBlbHNlIGlmIChzdHJjbXAgKHNlZ25hbWUsICIucmRhdGEiKSA9PSAwCi0JCQkJICAgfHwgc3RyY21wIChzZWduYW1lLCAiLnJvZGF0YSIpID09IDApCi0JCQkgICAgc2MgPSBzY19SRGF0YTsKLQkJCSAgZWxzZSBpZiAoc3RyY21wIChzZWduYW1lLCAiLnNkYXRhIikgPT0gMCkKLQkJCSAgICBzYyA9IHNjX1NEYXRhOwotCQkJICBlbHNlIGlmIChzZWcgPT0gYnNzX3NlY3Rpb24pCi0JCQkgICAgc2MgPSBzY19Cc3M7Ci0JCQkgIGVsc2UgaWYgKHN0cmNtcCAoc2VnbmFtZSwgIi5zYnNzIikgPT0gMCkKLQkJCSAgICBzYyA9IHNjX1NCc3M7Ci0JCQkgIGVsc2UgaWYgKHNlZyA9PSAmYmZkX2Fic19zZWN0aW9uKQotCQkJICAgIHNjID0gc2NfQWJzOwotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgLyogVGhpcyBtdXN0IGJlIGEgdXNlciBuYW1lZCBzZWN0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBub3QgcG9zc2libGUgaW4gRUNPRkYsIGJ1dCBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW4gRUxGLiAgKi8KLQkJCSAgICAgIHNjID0gc2NfRGF0YTsKLQkJCSAgICB9Ci0KLQkJCSAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc3QgPSAoaW50KSBzdDsKLQkJCSAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc2MgPSAoaW50KSBzYzsKLQkJCX0KLQotCQkgICAgICAvKiBUaGlzIGlzIGp1c3QgYW4gZXh0ZXJuYWwgc3ltYm9sIGlmIGl0IGlzCi0JCQkgb3V0c2lkZSBhIHByb2NlZHVyZSBhbmQgaXQgaGFzIGEgdHlwZS4KLQkJCSBGSVhNRTogZysrIHdpbGwgZ2VuZXJhdGUgc3ltYm9scyB3aGljaCBoYXZlCi0JCQkgZGlmZmVyZW50IG5hbWVzIGluIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLQkJCSB0aGFuIHRoZSBhY3R1YWwgc3ltYm9sLiAgU2hvdWxkIHdlIGhhbmRsZQotCQkJIHRoZW0gaGVyZT8gICovCi0JCSAgICAgIGlmICgoU19JU19FWFRFUk5BTCAoYXNfc3ltKQotCQkJICAgfHwgU19JU19XRUFLIChhc19zeW0pCi0JCQkgICB8fCAhIFNfSVNfREVGSU5FRCAoYXNfc3ltKSkKLQkJCSAgJiYgc3ltX3B0ci0+cHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMCi0JCQkgICYmIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ICE9IChpbnQpIHN0X05pbAotCQkJICAmJiAhIEVDT0ZGX0lTX1NUQUIgKCZzeW1fcHRyLT5lY29mZl9zeW0uYXN5bSkpCi0JCQlsb2NhbCA9IDA7Ci0KLQkJICAgICAgLyogVGhpcyBpcyBqdXN0IGFuIGV4dGVybmFsIHN5bWJvbCBpZiBpdCBpcyBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uIHN5bWJvbC4gICovCi0JCSAgICAgIGlmIChTX0lTX0NPTU1PTiAoYXNfc3ltKSkKLQkJCWxvY2FsID0gMDsKLQotCQkgICAgICAvKiBJZiBhbiBzdF9lbmQgc3ltYm9sIGhhcyBhbiBhc3NvY2lhdGVkIGdhcwotCQkJIHN5bWJvbCwgdGhlbiBpdCBpcyBhIGxvY2FsIGxhYmVsIGNyZWF0ZWQgZm9yCi0JCQkgYSAuYmVuZCBvciAuZW5kIGRpcmVjdGl2ZS4gIFN0YWJzIGxpbmUKLQkJCSBudW1iZXJzIHdpbGwgaGF2ZSBcMDAxIGluIHRoZSBuYW1lcy4gICovCi0JCSAgICAgIGlmIChsb2NhbAotCQkJICAmJiBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCAhPSBzdF9FbmQKLQkJCSAgJiYgc3RyY2hyIChzeW1fcHRyLT5uYW1lLCAnXDAwMScpID09IDApCi0JCQlzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5pc3MgPQotCQkJICBhZGRfc3RyaW5nICgmZmlsX3B0ci0+c3RyaW5ncywKLQkJCQkgICAgICBmaWxfcHRyLT5zdHJfaGFzaCwKLQkJCQkgICAgICBzeW1fcHRyLT5uYW1lLAotCQkJCSAgICAgIChzaGFzaF90ICoqKSBOVUxMKTsKLQkJICAgIH0KLQotCQkgIC8qIFdlIG5vdyBrbm93IHRoZSBpbmRleCBvZiB0aGlzIHN5bWJvbDsgZmlsbCBpbgotCQkgICAgIGxvY2F0aW9ucyB0aGF0IGhhdmUgYmVlbiB3YWl0aW5nIGZvciB0aGF0Ci0JCSAgICAgaW5mb3JtYXRpb24uICAqLwotCQkgIGlmIChzeW1fcHRyLT5iZWdpbl9wdHIgIT0gKGxvY2Fsc3ltX3QgKikgTlVMTCkKLQkJICAgIHsKLQkJICAgICAgbG9jYWxzeW1fdCAqYmVnaW5fcHRyOwotCQkgICAgICBzdF90IGJlZ2luX3R5cGU7Ci0KLQkJICAgICAga25vdyAobG9jYWwpOwotCQkgICAgICBiZWdpbl9wdHIgPSBzeW1fcHRyLT5iZWdpbl9wdHI7Ci0JCSAgICAgIGtub3cgKGJlZ2luX3B0ci0+c3ltX2luZGV4ICE9IC0xKTsKLQkJICAgICAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uaW5kZXggPSBiZWdpbl9wdHItPnN5bV9pbmRleDsKLQkJICAgICAgaWYgKHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnNjICE9IChpbnQpIHNjX0luZm8pCi0JCQlzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5pc3MgPQotCQkJICBiZWdpbl9wdHItPmVjb2ZmX3N5bS5hc3ltLmlzczsKLQotCQkgICAgICBiZWdpbl90eXBlID0gYmVnaW5fcHRyLT5lY29mZl9zeW0uYXN5bS5zdDsKLQkJICAgICAgaWYgKGJlZ2luX3R5cGUgPT0gc3RfRmlsZQotCQkJICB8fCBiZWdpbl90eXBlID09IHN0X0Jsb2NrKQotCQkJewotCQkJICBiZWdpbl9wdHItPmVjb2ZmX3N5bS5hc3ltLmluZGV4ID0KLQkJCSAgICBpc3ltIC0gaWZpbGVzeW0gKyAxOwotCQkJICAoKnN3YXBfc3ltX291dCkgKHN0ZG91dHB1dCwKLQkJCQkJICAgJmJlZ2luX3B0ci0+ZWNvZmZfc3ltLmFzeW0sCi0JCQkJCSAgICgqYnVmCi0JCQkJCSAgICArIG9mZnNldAotCQkJCQkgICAgKyAoYmVnaW5fcHRyLT5zeW1faW5kZXgKLQkJCQkJICAgICAgICogZXh0ZXJuYWxfc3ltX3NpemUpKSk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAga25vdyAoYmVnaW5fcHRyLT5pbmRleF9wdHIgIT0gKGF1eF90ICopIE5VTEwpOwotCQkJICBiZWdpbl9wdHItPmluZGV4X3B0ci0+ZGF0YS5pc3ltID0KLQkJCSAgICBpc3ltIC0gaWZpbGVzeW0gKyAxOwotCQkJfQotCi0JCSAgICAgIC8qIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIG1hcmtpbmcgdGhlIGVuZCBvZiBhCi0JCQkgcHJvY2VkdXJlIGlzIHRoZSBzaXplIG9mIHRoZSBwcm9jZWR1cmUuICBUaGUKLQkJCSB2YWx1ZSBvZiB0aGUgc3ltYm9sIG1hcmtpbmcgdGhlIGVuZCBvZiBhCi0JCQkgYmxvY2sgaXMgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUKLQkJCSBwcm9jZWR1cmUgdG8gdGhlIGJsb2NrLiAgKi8KLQkJICAgICAgaWYgKGJlZ2luX3R5cGUgPT0gc3RfUHJvYwotCQkJICB8fCBiZWdpbl90eXBlID09IHN0X1N0YXRpY1Byb2MpCi0JCQl7Ci0JCQkgIGtub3cgKGFzX3N5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKTsKLQkJCSAga25vdyAoYmVnaW5fcHRyLT5hc19zeW0gIT0gKHN5bWJvbFMgKikgTlVMTCk7Ci0JCQkgIGlmIChTX0dFVF9TRUdNRU5UIChhc19zeW0pCi0JCQkgICAgICAhPSBTX0dFVF9TRUdNRU5UIChiZWdpbl9wdHItPmFzX3N5bSkpCi0JCQkgICAgYXNfd2FybiAoXygiLmJlZ2luLy5iZW5kIGluIGRpZmZlcmVudCBzZWdtZW50cyIpKTsKLQkJCSAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgPQotCQkJICAgIChTX0dFVF9WQUxVRSAoYXNfc3ltKQotCQkJICAgICAtIFNfR0VUX1ZBTFVFIChiZWdpbl9wdHItPmFzX3N5bSkpOwotCi0JCQkgIC8qIElmIHRoZSBzaXplIGlzIG9kZCwgdGhpcyBpcyBwcm9iYWJseSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pcHMxNiBmdW5jdGlvbjsgZm9yY2UgaXQgdG8gYmUgZXZlbi4gICovCi0JCQkgIGlmICgoc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgJiAxKSAhPSAwKQotCQkJICAgICsrc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWU7Ci0KLSNpZmRlZiBTX1NFVF9TSVpFCi0JCQkgIFNfU0VUX1NJWkUgKGJlZ2luX3B0ci0+YXNfc3ltLAotCQkJCSAgICAgIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnZhbHVlKTsKLSNlbmRpZgotCQkJfQotCQkgICAgICBlbHNlIGlmIChiZWdpbl90eXBlID09IHN0X0Jsb2NrCi0JCQkgICAgICAgJiYgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc2MgIT0gKGludCkgc2NfSW5mbykKLQkJCXsKLQkJCSAgc3ltYm9sUyAqYmVnaW5fc3ltOwotCi0JCQkgIGtub3cgKGFzX3N5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKTsKLQkJCSAga25vdyAoc3ltX3B0ci0+cHJvY19wdHIgIT0gKHByb2NfdCAqKSBOVUxMKTsKLQkJCSAgYmVnaW5fc3ltID0gc3ltX3B0ci0+cHJvY19wdHItPnN5bS0+YXNfc3ltOwotCQkJICBpZiAoU19HRVRfU0VHTUVOVCAoYXNfc3ltKQotCQkJICAgICAgIT0gU19HRVRfU0VHTUVOVCAoYmVnaW5fc3ltKSkKLQkJCSAgICBhc193YXJuIChfKCIuYmVnaW4vLmJlbmQgaW4gZGlmZmVyZW50IHNlZ21lbnRzIikpOwotCQkJICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9Ci0JCQkgICAgU19HRVRfVkFMVUUgKGFzX3N5bSkgLSBTX0dFVF9WQUxVRSAoYmVnaW5fc3ltKTsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGZvciAoZiA9IHN5bV9wdHItPmZvcndhcmRfcmVmOwotCQkgICAgICAgZiAhPSAoZm9yd2FyZF90ICopIE5VTEw7Ci0JCSAgICAgICBmID0gZi0+bmV4dCkKLQkJICAgIHsKLQkJICAgICAga25vdyAobG9jYWwpOwotCQkgICAgICBmLT5pZmRfcHRyLT5kYXRhLmlzeW0gPSBmaWxfcHRyLT5maWxlX2luZGV4OwotCQkgICAgICBmLT5pbmRleF9wdHItPmRhdGEucm5keC5pbmRleCA9IGlzeW0gLSBpZmlsZXN5bTsKLQkJICAgIH0KLQotCQkgIGlmIChsb2NhbCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCpidWZlbmQgLSBzeW1fb3V0IDwgZXh0ZXJuYWxfc3ltX3NpemUpCi0JCQlzeW1fb3V0ID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwKLQkJCQkJCSAgIHN5bV9vdXQsCi0JCQkJCQkgICBleHRlcm5hbF9zeW1fc2l6ZSk7Ci0JCSAgICAgICgqc3dhcF9zeW1fb3V0KSAoc3Rkb3V0cHV0LCAmc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0sCi0JCQkJICAgICAgIHN5bV9vdXQpOwotCQkgICAgICBzeW1fb3V0ICs9IGV4dGVybmFsX3N5bV9zaXplOwotCi0JCSAgICAgIHN5bV9wdHItPnN5bV9pbmRleCA9IGlzeW07Ci0KLQkJICAgICAgaWYgKHN5bV9wdHItPnByb2NfcHRyICE9IChwcm9jX3QgKikgTlVMTAotCQkJICAmJiBzeW1fcHRyLT5wcm9jX3B0ci0+c3ltID09IHN5bV9wdHIpCi0JCQlzeW1fcHRyLT5wcm9jX3B0ci0+cGRyLmlzeW0gPSBpc3ltIC0gaWZpbGVzeW07Ci0KLQkJICAgICAgKytpc3ltOwotCQkgICAgfQotCi0JCSAgLyogUmVjb3JkIHRoZSBsb2NhbCBzeW1ib2wgaW5kZXggYW5kIGZpbGUgbnVtYmVyIGluCi0JCSAgICAgY2FzZSB0aGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbC4gIE5vdGUgdGhhdCB0aGlzCi0JCSAgICAgZGVzdHJveXMgdGhlIGFzeW0uaW5kZXggZmllbGQuICAqLwotCQkgIGlmIChhc19zeW0gIT0gKHN5bWJvbFMgKikgTlVMTAotCQkgICAgICAmJiBhc19zeW0tPmVjb2ZmX3N5bWJvbCA9PSBzeW1fcHRyKQotCQkgICAgewotCQkgICAgICBpZiAoKHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ID09IHN0X1Byb2MKLQkJCSAgIHx8IHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ID09IHN0X1N0YXRpY1Byb2MpCi0JCQkgICYmIGxvY2FsKQotCQkJc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uaW5kZXggPSBpc3ltIC0gaWZpbGVzeW0gLSAxOwotCQkgICAgICBzeW1fcHRyLT5lY29mZl9zeW0uaWZkID0gZmlsX3B0ci0+ZmlsZV9pbmRleDsKLQotCQkgICAgICAvKiBEb24ndCB0cnkgdG8gbWVyZ2UgYW4gRkRSIHdoaWNoIGhhcyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHN5bWJvbCBhdHRhY2hlZCB0byBpdC4gICovCi0JCSAgICAgIGlmIChTX0lTX0VYVEVSTkFMIChhc19zeW0pIHx8IFNfSVNfV0VBSyAoYXNfc3ltKSkKLQkJCWZpbF9wdHItPmZkci5mTWVyZ2UgPSAwOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGZpbF9wdHItPmZkci5jc3ltID0gaXN5bSAtIGZpbF9wdHItPmZkci5pc3ltQmFzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBvZmZzZXQgKyBpc3ltICogZXh0ZXJuYWxfc3ltX3NpemU7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBwcm9jZWR1cmUgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWNvZmZfYnVpbGRfcHJvY3MgKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLCBvZmZzZXQpCi0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kOwotICAgICBjaGFyICoqYnVmOwotICAgICBjaGFyICoqYnVmZW5kOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLXsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9wZHJfc2l6ZSA9IGJhY2tlbmQtPmV4dGVybmFsX3Bkcl9zaXplOwotICB2b2lkICgqIGNvbnN0IHN3YXBfcGRyX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IFBEUiAqLCBQVFIpKQotICAgID0gYmFja2VuZC0+c3dhcF9wZHJfb3V0OwotICBjaGFyICpwZHJfb3V0OwotICBsb25nIGlwcm9jOwotICB2bGlua3NfdCAqZmlsZV9saW5rOwotCi0gIHBkcl9vdXQgPSAqYnVmICsgb2Zmc2V0OwotCi0gIGlwcm9jID0gMDsKLQotICAvKiBUaGUgcHJvY2VkdXJlcyBhcmUgc3RvcmVkIGJ5IGZpbGUuICAqLwotICBmb3IgKGZpbGVfbGluayA9IGZpbGVfZGVzYy5maXJzdDsKLSAgICAgICBmaWxlX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0gICAgICAgZmlsZV9saW5rID0gZmlsZV9saW5rLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBmaWxfY250OwotICAgICAgZWZkcl90ICpmaWxfcHRyOwotICAgICAgZWZkcl90ICpmaWxfZW5kOwotCi0gICAgICBpZiAoZmlsZV9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19sYXN0X3BhZ2U7Ci0gICAgICBlbHNlCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX3Blcl9wYWdlOwotICAgICAgZmlsX3B0ciA9IGZpbGVfbGluay0+ZGF0dW0tPmZpbGU7Ci0gICAgICBmaWxfZW5kID0gZmlsX3B0ciArIGZpbF9jbnQ7Ci0gICAgICBmb3IgKDsgZmlsX3B0ciA8IGZpbF9lbmQ7IGZpbF9wdHIrKykKLQl7Ci0JICB2bGlua3NfdCAqcHJvY19saW5rOwotCSAgaW50IGZpcnN0OwotCi0JICBmaWxfcHRyLT5mZHIuaXBkRmlyc3QgPSBpcHJvYzsKLQkgIGZpcnN0ID0gMTsKLQkgIGZvciAocHJvY19saW5rID0gZmlsX3B0ci0+cHJvY3MuZmlyc3Q7Ci0JICAgICAgIHByb2NfbGluayAhPSAodmxpbmtzX3QgKikgTlVMTDsKLQkgICAgICAgcHJvY19saW5rID0gcHJvY19saW5rLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaW50IHByY19jbnQ7Ci0JICAgICAgcHJvY190ICpwcm9jX3B0cjsKLQkgICAgICBwcm9jX3QgKnByb2NfZW5kOwotCi0JICAgICAgaWYgKHByb2NfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKLQkJcHJjX2NudCA9IGZpbF9wdHItPnByb2NzLm9iamVjdHNfbGFzdF9wYWdlOwotCSAgICAgIGVsc2UKLQkJcHJjX2NudCA9IGZpbF9wdHItPnByb2NzLm9iamVjdHNfcGVyX3BhZ2U7Ci0JICAgICAgcHJvY19wdHIgPSBwcm9jX2xpbmstPmRhdHVtLT5wcm9jOwotCSAgICAgIHByb2NfZW5kID0gcHJvY19wdHIgKyBwcmNfY250OwotCSAgICAgIGZvciAoOyBwcm9jX3B0ciA8IHByb2NfZW5kOyBwcm9jX3B0cisrKQotCQl7Ci0JCSAgc3ltYm9sUyAqYWRyX3N5bTsKLQkJICB1bnNpZ25lZCBsb25nIGFkcjsKLQotCQkgIGFkcl9zeW0gPSBwcm9jX3B0ci0+c3ltLT5hc19zeW07Ci0JCSAgYWRyID0gKFNfR0VUX1ZBTFVFIChhZHJfc3ltKQotCQkJICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LAotCQkJCQkJU19HRVRfU0VHTUVOVCAoYWRyX3N5bSkpKTsKLQkJICBpZiAoZmlyc3QpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgY29kZSB1c2VkIHRvIGZvcmNlIHRoZSBhZHIgb2YgdGhlIHZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCBmZHIgdG8gYmUgMC4gIEhvd2V2ZXIsIHRoZSBuYXRpdmUgdG9vbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBkbyB0aGF0LCBhbmQgSSBjYW4ndCByZW1lbWJlciB3aHkgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIHdvcmsgdGhhdCB3YXksIHNvIEkgdG9vayBpdCBvdXQuICAqLwotCQkgICAgICBmaWxfcHRyLT5mZHIuYWRyID0gYWRyOwotCQkgICAgICBmaXJzdCA9IDA7Ci0JCSAgICB9Ci0JCSAgcHJvY19wdHItPnBkci5hZHIgPSBhZHIgLSBmaWxfcHRyLT5mZHIuYWRyOwotCQkgIGlmICgqYnVmZW5kIC0gcGRyX291dCA8IGV4dGVybmFsX3Bkcl9zaXplKQotCQkgICAgcGRyX291dCA9IGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsCi0JCQkJCSAgICAgICBwZHJfb3V0LAotCQkJCQkgICAgICAgZXh0ZXJuYWxfcGRyX3NpemUpOwotCQkgICgqc3dhcF9wZHJfb3V0KSAoc3Rkb3V0cHV0LCAmcHJvY19wdHItPnBkciwgcGRyX291dCk7Ci0JCSAgcGRyX291dCArPSBleHRlcm5hbF9wZHJfc2l6ZTsKLQkJICArK2lwcm9jOwotCQl9Ci0JICAgIH0KLQkgIGZpbF9wdHItPmZkci5jcGQgPSBpcHJvYyAtIGZpbF9wdHItPmZkci5pcGRGaXJzdDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBvZmZzZXQgKyBpcHJvYyAqIGV4dGVybmFsX3Bkcl9zaXplOwotfQotCi0vKiBTd2FwIG91dCB0aGUgYXV4IGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWVjb2ZmX2J1aWxkX2F1eCAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCkKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7Ci0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotewotICBpbnQgYmlnZW5kaWFuOwotICB1bmlvbiBhdXhfZXh0ICphdXhfb3V0OwotICBsb25nIGlhdXg7Ci0gIHZsaW5rc190ICpmaWxlX2xpbms7Ci0KLSAgYmlnZW5kaWFuID0gYmZkX2JpZ19lbmRpYW4gKHN0ZG91dHB1dCk7Ci0KLSAgYXV4X291dCA9ICh1bmlvbiBhdXhfZXh0ICopICgqYnVmICsgb2Zmc2V0KTsKLQotICBpYXV4ID0gMDsKLQotICAvKiBUaGUgYXV4IGVudHJpZXMgYXJlIHN0b3JlZCBieSBmaWxlLiAgKi8KLSAgZm9yIChmaWxlX2xpbmsgPSBmaWxlX2Rlc2MuZmlyc3Q7Ci0gICAgICAgZmlsZV9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotICAgICAgIGZpbGVfbGluayA9IGZpbGVfbGluay0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgZmlsX2NudDsKLSAgICAgIGVmZHJfdCAqZmlsX3B0cjsKLSAgICAgIGVmZHJfdCAqZmlsX2VuZDsKLQotICAgICAgaWYgKGZpbGVfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlOwotICAgICAgZWxzZQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19wZXJfcGFnZTsKLSAgICAgIGZpbF9wdHIgPSBmaWxlX2xpbmstPmRhdHVtLT5maWxlOwotICAgICAgZmlsX2VuZCA9IGZpbF9wdHIgKyBmaWxfY250OwotICAgICAgZm9yICg7IGZpbF9wdHIgPCBmaWxfZW5kOyBmaWxfcHRyKyspCi0JewotCSAgdmxpbmtzX3QgKmF1eF9saW5rOwotCi0JICBmaWxfcHRyLT5mZHIuZkJpZ2VuZGlhbiA9IGJpZ2VuZGlhbjsKLQkgIGZpbF9wdHItPmZkci5pYXV4QmFzZSA9IGlhdXg7Ci0JICBmb3IgKGF1eF9saW5rID0gZmlsX3B0ci0+YXV4X3N5bXMuZmlyc3Q7Ci0JICAgICAgIGF1eF9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotCSAgICAgICBhdXhfbGluayA9IGF1eF9saW5rLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaW50IGF1eF9jbnQ7Ci0JICAgICAgYXV4X3QgKmF1eF9wdHI7Ci0JICAgICAgYXV4X3QgKmF1eF9lbmQ7Ci0KLQkgICAgICBpZiAoYXV4X2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCi0JCWF1eF9jbnQgPSBmaWxfcHRyLT5hdXhfc3ltcy5vYmplY3RzX2xhc3RfcGFnZTsKLQkgICAgICBlbHNlCi0JCWF1eF9jbnQgPSBmaWxfcHRyLT5hdXhfc3ltcy5vYmplY3RzX3Blcl9wYWdlOwotCSAgICAgIGF1eF9wdHIgPSBhdXhfbGluay0+ZGF0dW0tPmF1eDsKLQkgICAgICBhdXhfZW5kID0gYXV4X3B0ciArIGF1eF9jbnQ7Ci0JICAgICAgZm9yICg7IGF1eF9wdHIgPCBhdXhfZW5kOyBhdXhfcHRyKyspCi0JCXsKLQkJICBpZiAoKmJ1ZmVuZCAtIChjaGFyICopIGF1eF9vdXQgPCBzaXplb2YgKHVuaW9uIGF1eF9leHQpKQotCQkgICAgYXV4X291dCA9ICgodW5pb24gYXV4X2V4dCAqKQotCQkJICAgICAgIGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsCi0JCQkJCQkoY2hhciAqKSBhdXhfb3V0LAotCQkJCQkJc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSkpOwotCQkgIHN3aXRjaCAoYXV4X3B0ci0+dHlwZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgYXV4X3RpcjoKLQkJICAgICAgKCpiYWNrZW5kLT5zd2FwX3Rpcl9vdXQpIChiaWdlbmRpYW4sCi0JCQkJCQkmYXV4X3B0ci0+ZGF0YS50aSwKLQkJCQkJCSZhdXhfb3V0LT5hX3RpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGF1eF9ybmR4OgotCQkgICAgICAoKmJhY2tlbmQtPnN3YXBfcm5keF9vdXQpIChiaWdlbmRpYW4sCi0JCQkJCQkgJmF1eF9wdHItPmRhdGEucm5keCwKLQkJCQkJCSAmYXV4X291dC0+YV9ybmR4KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGF1eF9kbkxvdzoKLQkJICAgICAgQVVYX1BVVF9ETkxPVyAoYmlnZW5kaWFuLCBhdXhfcHRyLT5kYXRhLmRuTG93LAotCQkJCSAgICAgYXV4X291dCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBhdXhfZG5IaWdoOgotCQkgICAgICBBVVhfUFVUX0ROSElHSCAoYmlnZW5kaWFuLCBhdXhfcHRyLT5kYXRhLmRuSGlnaCwKLQkJCQkgICAgICBhdXhfb3V0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGF1eF9pc3ltOgotCQkgICAgICBBVVhfUFVUX0lTWU0gKGJpZ2VuZGlhbiwgYXV4X3B0ci0+ZGF0YS5pc3ltLAotCQkJCSAgICBhdXhfb3V0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGF1eF9pc3M6Ci0JCSAgICAgIEFVWF9QVVRfSVNTIChiaWdlbmRpYW4sIGF1eF9wdHItPmRhdGEuaXNzLAotCQkJCSAgIGF1eF9vdXQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgYXV4X3dpZHRoOgotCQkgICAgICBBVVhfUFVUX1dJRFRIIChiaWdlbmRpYW4sIGF1eF9wdHItPmRhdGEud2lkdGgsCi0JCQkJICAgICBhdXhfb3V0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGF1eF9jb3VudDoKLQkJICAgICAgQVVYX1BVVF9DT1VOVCAoYmlnZW5kaWFuLCBhdXhfcHRyLT5kYXRhLmNvdW50LAotCQkJCSAgICAgYXV4X291dCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCi0JCSAgKythdXhfb3V0OwotCQkgICsraWF1eDsKLQkJfQotCSAgICB9Ci0JICBmaWxfcHRyLT5mZHIuY2F1eCA9IGlhdXggLSBmaWxfcHRyLT5mZHIuaWF1eEJhc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gZWNvZmZfcGFkZGluZ19hZGp1c3QgKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLAotCQkJICAgICAgIG9mZnNldCArIGlhdXggKiBzaXplb2YgKHVuaW9uIGF1eF9leHQpLAotCQkJICAgICAgIChjaGFyICoqKSBOVUxMKTsKLX0KLQotLyogQ29weSBvdXQgdGhlIHN0cmluZ3MgZnJvbSBhIHZhcnJheV90LiAgVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YKLSAgIGJ5dGVzIGNvcGllZCwgcmF0aGVyIHRoYW4gdGhlIG5ldyBvZmZzZXQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWNvZmZfYnVpbGRfc3RyaW5ncyAoYnVmLCBidWZlbmQsIG9mZnNldCwgdnApCi0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotICAgICB2YXJyYXlfdCAqdnA7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaXN0cjsKLSAgY2hhciAqc3RyX291dDsKLSAgdmxpbmtzX3QgKnN0cl9saW5rOwotCi0gIHN0cl9vdXQgPSAqYnVmICsgb2Zmc2V0OwotCi0gIGlzdHIgPSAwOwotCi0gIGZvciAoc3RyX2xpbmsgPSB2cC0+Zmlyc3Q7Ci0gICAgICAgc3RyX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0gICAgICAgc3RyX2xpbmsgPSBzdHJfbGluay0+bmV4dCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHN0cl9jbnQ7Ci0KLSAgICAgIGlmIChzdHJfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKLQlzdHJfY250ID0gdnAtPm9iamVjdHNfbGFzdF9wYWdlOwotICAgICAgZWxzZQotCXN0cl9jbnQgPSB2cC0+b2JqZWN0c19wZXJfcGFnZTsKLQotICAgICAgaWYgKCpidWZlbmQgLSBzdHJfb3V0IDwgc3RyX2NudCkKLQlzdHJfb3V0ID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgc3RyX291dCwgc3RyX2NudCk7Ci0KLSAgICAgIG1lbWNweSAoc3RyX291dCwgc3RyX2xpbmstPmRhdHVtLT5ieXRlLCBzdHJfY250KTsKLSAgICAgIHN0cl9vdXQgKz0gc3RyX2NudDsKLSAgICAgIGlzdHIgKz0gc3RyX2NudDsKLSAgICB9Ci0KLSAgcmV0dXJuIGlzdHI7Ci19Ci0KLS8qIER1bXAgb3V0IHRoZSBsb2NhbCBzdHJpbmdzLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWVjb2ZmX2J1aWxkX3NzIChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0KQotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci17Ci0gIGxvbmcgaXNzOwotICB2bGlua3NfdCAqZmlsZV9saW5rOwotCi0gIGlzcyA9IDA7Ci0KLSAgZm9yIChmaWxlX2xpbmsgPSBmaWxlX2Rlc2MuZmlyc3Q7Ci0gICAgICAgZmlsZV9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotICAgICAgIGZpbGVfbGluayA9IGZpbGVfbGluay0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgZmlsX2NudDsKLSAgICAgIGVmZHJfdCAqZmlsX3B0cjsKLSAgICAgIGVmZHJfdCAqZmlsX2VuZDsKLQotICAgICAgaWYgKGZpbGVfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlOwotICAgICAgZWxzZQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19wZXJfcGFnZTsKLSAgICAgIGZpbF9wdHIgPSBmaWxlX2xpbmstPmRhdHVtLT5maWxlOwotICAgICAgZmlsX2VuZCA9IGZpbF9wdHIgKyBmaWxfY250OwotICAgICAgZm9yICg7IGZpbF9wdHIgPCBmaWxfZW5kOyBmaWxfcHRyKyspCi0JewotCSAgbG9uZyBzc19jbnQ7Ci0KLQkgIGZpbF9wdHItPmZkci5pc3NCYXNlID0gaXNzOwotCSAgc3NfY250ID0gZWNvZmZfYnVpbGRfc3RyaW5ncyAoYnVmLCBidWZlbmQsIG9mZnNldCArIGlzcywKLQkJCQkJJmZpbF9wdHItPnN0cmluZ3MpOwotCSAgZmlsX3B0ci0+ZmRyLmNiU3MgPSBzc19jbnQ7Ci0JICBpc3MgKz0gc3NfY250OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGVjb2ZmX3BhZGRpbmdfYWRqdXN0IChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0ICsgaXNzLAotCQkJICAgICAgIChjaGFyICoqKSBOVUxMKTsKLX0KLQotLyogU3dhcCBvdXQgdGhlIGZpbGUgZGVzY3JpcHRvcnMuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWNvZmZfYnVpbGRfZmRyIChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0KQotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci17Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZmRyX3NpemUgPSBiYWNrZW5kLT5leHRlcm5hbF9mZHJfc2l6ZTsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX2Zkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBGRFIgKiwgUFRSKSkKLSAgICA9IGJhY2tlbmQtPnN3YXBfZmRyX291dDsKLSAgbG9uZyBpZmlsZTsKLSAgY2hhciAqZmRyX291dDsKLSAgdmxpbmtzX3QgKmZpbGVfbGluazsKLQotICBpZmlsZSA9IDA7Ci0KLSAgZmRyX291dCA9ICpidWYgKyBvZmZzZXQ7Ci0KLSAgZm9yIChmaWxlX2xpbmsgPSBmaWxlX2Rlc2MuZmlyc3Q7Ci0gICAgICAgZmlsZV9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotICAgICAgIGZpbGVfbGluayA9IGZpbGVfbGluay0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgZmlsX2NudDsKLSAgICAgIGVmZHJfdCAqZmlsX3B0cjsKLSAgICAgIGVmZHJfdCAqZmlsX2VuZDsKLQotICAgICAgaWYgKGZpbGVfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlOwotICAgICAgZWxzZQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19wZXJfcGFnZTsKLSAgICAgIGZpbF9wdHIgPSBmaWxlX2xpbmstPmRhdHVtLT5maWxlOwotICAgICAgZmlsX2VuZCA9IGZpbF9wdHIgKyBmaWxfY250OwotICAgICAgZm9yICg7IGZpbF9wdHIgPCBmaWxfZW5kOyBmaWxfcHRyKyspCi0JewotCSAgaWYgKCpidWZlbmQgLSBmZHJfb3V0IDwgZXh0ZXJuYWxfZmRyX3NpemUpCi0JICAgIGZkcl9vdXQgPSBlY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLCBmZHJfb3V0LAotCQkJCSAgICAgICBleHRlcm5hbF9mZHJfc2l6ZSk7Ci0JICAoKnN3YXBfZmRyX291dCkgKHN0ZG91dHB1dCwgJmZpbF9wdHItPmZkciwgZmRyX291dCk7Ci0JICBmZHJfb3V0ICs9IGV4dGVybmFsX2Zkcl9zaXplOwotCSAgKytpZmlsZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBvZmZzZXQgKyBpZmlsZSAqIGV4dGVybmFsX2Zkcl9zaXplOwotfQotCi0vKiBTZXQgdXAgdGhlIGV4dGVybmFsIHN5bWJvbHMuICBUaGVzZSBhcmUgc3VwcG9zZWQgdG8gYmUgaGFuZGxlZCBieQotICAgdGhlIGJhY2tlbmQuICBUaGlzIHJvdXRpbmUganVzdCBnZXRzIHRoZSByaWdodCBpbmZvcm1hdGlvbiBhbmQKLSAgIGNhbGxzIGEgYmFja2VuZCBmdW5jdGlvbiB0byBkZWFsIHdpdGggaXQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc2V0dXBfZXh0ICgpCi17Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bTsKLQotICBmb3IgKHN5bSA9IHN5bWJvbF9yb290UDsgc3ltICE9IChzeW1ib2xTICopIE5VTEw7IHN5bSA9IHN5bWJvbF9uZXh0IChzeW0pKQotICAgIHsKLSAgICAgIGlmIChzeW0tPmVjb2ZmX3N5bWJvbCA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB0aGVuIGZvcmNlIHRoZSBmaWVsZHMgdG8gemVyby4gICovCi0gICAgICBpZiAoISBTX0lTX0VYVEVSTkFMIChzeW0pCi0JICAmJiAhIFNfSVNfV0VBSyAoc3ltKQotCSAgJiYgU19JU19ERUZJTkVEIChzeW0pKQotCXsKLQkgIHN5bS0+ZWNvZmZfc3ltYm9sLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9IDA7Ci0JICBzeW0tPmVjb2ZmX3N5bWJvbC0+ZWNvZmZfc3ltLmFzeW0uc3QgPSAoaW50KSBzdF9OaWw7Ci0JICBzeW0tPmVjb2ZmX3N5bWJvbC0+ZWNvZmZfc3ltLmFzeW0uc2MgPSAoaW50KSBzY19OaWw7Ci0JICBzeW0tPmVjb2ZmX3N5bWJvbC0+ZWNvZmZfc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKLQl9Ci0KLSAgICAgIG9ial9lY29mZl9zZXRfZXh0IChzeW0sICZzeW0tPmVjb2ZmX3N5bWJvbC0+ZWNvZmZfc3ltKTsKLSAgICB9Ci19Ci0KLS8qIEJ1aWxkIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi11bnNpZ25lZCBsb25nCi1lY29mZl9idWlsZF9kZWJ1ZyAoaGRyLCBidWZwLCBiYWNrZW5kKQotICAgICBIRFJSICpoZHI7Ci0gICAgIGNoYXIgKipidWZwOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKLXsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9wZHJfc2l6ZSA9IGJhY2tlbmQtPmV4dGVybmFsX3Bkcl9zaXplOwotICB0YWdfdCAqcHRhZzsKLSAgdGFnX3QgKnB0YWdfbmV4dDsKLSAgZWZkcl90ICpmaWxfcHRyOwotICBpbnQgZW5kX3dhcm5pbmc7Ci0gIGVmZHJfdCAqaG9sZF9maWxlX3B0cjsKLSAgcHJvY190ICogaG9sZF9wcm9jX3B0cjsKLSAgc3ltYm9sUyAqc3ltOwotICBjaGFyICpidWY7Ci0gIGNoYXIgKmJ1ZmVuZDsKLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBmaWxlLiAgKi8KLSAgaWYgKGZpcnN0X2ZpbGUgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIGFkZF9maWxlICgoY29uc3QgY2hhciAqKSBOVUxMLCAwLCAxKTsKLQotICAvKiBIYW5kbGUgYW55IHRvcCBsZXZlbCB0YWdzLiAgKi8KLSAgZm9yIChwdGFnID0gdG9wX3RhZ19oZWFkLT5maXJzdF90YWc7Ci0gICAgICAgcHRhZyAhPSAodGFnX3QgKikgTlVMTDsKLSAgICAgICBwdGFnID0gcHRhZ19uZXh0KQotICAgIHsKLSAgICAgIGlmIChwdGFnLT5mb3J3YXJkX3JlZiAhPSAoZm9yd2FyZF90ICopIE5VTEwpCi0JYWRkX3Vua25vd25fdGFnIChwdGFnKTsKLQotICAgICAgcHRhZ19uZXh0ID0gcHRhZy0+c2FtZV9ibG9jazsKLSAgICAgIHB0YWctPmhhc2hfcHRyLT50YWdfcHRyID0gcHRhZy0+c2FtZV9uYW1lOwotICAgICAgZnJlZV90YWcgKHB0YWcpOwotICAgIH0KLQotICBmcmVlX3RoZWFkICh0b3BfdGFnX2hlYWQpOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc3ltYm9scy4gIEFkZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGVhY2gKLSAgICAgc3ltYm9sIHRoYXQgaGFzIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGl0LiAgKi8KLSAgaG9sZF9maWxlX3B0ciA9IGN1cl9maWxlX3B0cjsKLSAgaG9sZF9wcm9jX3B0ciA9IGN1cl9wcm9jX3B0cjsKLSAgY3VyX3Byb2NfcHRyID0gKHByb2NfdCAqKSBOVUxMOwotICBmb3IgKHN5bSA9IHN5bWJvbF9yb290UDsgc3ltICE9IChzeW1ib2xTICopIE5VTEw7IHN5bSA9IHN5bWJvbF9uZXh0IChzeW0pKQotICAgIHsKLSAgICAgIGlmIChzeW0tPmVjb2ZmX3N5bWJvbCAhPSBOVUxMCi0JICB8fCBzeW0tPmVjb2ZmX2ZpbGUgPT0gKGVmZHJfdCAqKSBOVUxMCi0JICB8fCAoc3ltLT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgY3VyX2ZpbGVfcHRyID0gc3ltLT5lY29mZl9maWxlOwotICAgICAgYWRkX2Vjb2ZmX3N5bWJvbCAoKGNvbnN0IGNoYXIgKikgTlVMTCwgc3RfTmlsLCBzY19OaWwsIHN5bSwKLQkJCShiZmRfdm1hKSAwLCBTX0dFVF9WQUxVRSAoc3ltKSwgaW5kZXhOaWwpOwotICAgIH0KLSAgY3VyX3Byb2NfcHRyID0gaG9sZF9wcm9jX3B0cjsKLSAgY3VyX2ZpbGVfcHRyID0gaG9sZF9maWxlX3B0cjsKLQotICAvKiBPdXRwdXQgYW4gZW5kaW5nIHN5bWJvbCBmb3IgYWxsIHRoZSBmaWxlcy4gIFdlIGhhdmUgdG8gZG8gdGhpcwotICAgICBoZXJlIGZvciB0aGUgbGFzdCBmaWxlLCBzbyB3ZSBtYXkgYXMgd2VsbCBkbyBpdCBmb3IgYWxsIG9mIHRoZQotICAgICBmaWxlcy4gICovCi0gIGVuZF93YXJuaW5nID0gMDsKLSAgZm9yIChmaWxfcHRyID0gZmlyc3RfZmlsZTsKLSAgICAgICBmaWxfcHRyICE9IChlZmRyX3QgKikgTlVMTDsKLSAgICAgICBmaWxfcHRyID0gZmlsX3B0ci0+bmV4dF9maWxlKQotICAgIHsKLSAgICAgIGN1cl9maWxlX3B0ciA9IGZpbF9wdHI7Ci0gICAgICB3aGlsZSAoY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGUgIT0gKHNjb3BlX3QgKikgTlVMTAotCSAgICAgJiYgY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGUtPnByZXYgIT0gKHNjb3BlX3QgKikgTlVMTCkKLQl7Ci0JICBjdXJfZmlsZV9wdHItPmN1cl9zY29wZSA9IGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlLT5wcmV2OwotCSAgaWYgKCEgZW5kX3dhcm5pbmcgJiYgISBjdXJfZmlsZV9wdHItPmZha2UpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJNaXNzaW5nIC5lbmQgb3IgLmJlbmQgYXQgZW5kIG9mIGZpbGUiKSk7Ci0JICAgICAgZW5kX3dhcm5pbmcgPSAxOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlICE9IChzY29wZV90ICopIE5VTEwpCi0JKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJIHN0X0VuZCwgc2NfVGV4dCwKLQkJCQkgKHN5bWJvbFMgKikgTlVMTCwKLQkJCQkgKGJmZF92bWEpIDAsCi0JCQkJIChzeW1pbnRfdCkgMCwKLQkJCQkgKHN5bWludF90KSAwKTsKLSAgICB9Ci0KLSAgLyogQnVpbGQgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLSAgb2Zmc2V0ID0gMDsKLSAgYnVmID0geG1hbGxvYyAoUEFHRV9TSVpFKTsKLSAgYnVmZW5kID0gYnVmICsgUEFHRV9TSVpFOwotCi0gIC8qIEJ1aWxkIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gICovCi0gIGhkci0+Y2JMaW5lT2Zmc2V0ID0gb2Zmc2V0OwotICBvZmZzZXQgPSBlY29mZl9idWlsZF9saW5lbm8gKGJhY2tlbmQsICZidWYsICZidWZlbmQsIG9mZnNldCwKLQkJCSAgICAgICAmaGRyLT5pbGluZU1heCk7Ci0gIGhkci0+Y2JMaW5lID0gb2Zmc2V0IC0gaGRyLT5jYkxpbmVPZmZzZXQ7Ci0KLSAgLyogV2UgZG9uJ3QgdXNlIGRlbnNlIG51bWJlcnMgYXQgYWxsLiAgKi8KLSAgaGRyLT5pZG5NYXggPSAwOwotICBoZHItPmNiRG5PZmZzZXQgPSAwOwotCi0gIC8qIFdlIGNhbid0IGJ1aWxkIHRoZSBQRFIgdGFibGUgdW50aWwgd2UgaGF2ZSBidWlsdCB0aGUgc3ltYm9scywKLSAgICAgYmVjYXVzZSBhIFBEUiBjb250YWlucyBhIHN5bWJvbCBpbmRleC4gIEhvd2V2ZXIsIHdlIHNldCBhc2lkZQotICAgICBzcGFjZSBhdCB0aGlzIHBvaW50LiAgKi8KLSAgaGRyLT5pcGRNYXggPSBwcm9jX2NudDsKLSAgaGRyLT5jYlBkT2Zmc2V0ID0gb2Zmc2V0OwotICBpZiAoYnVmZW5kIC0gKGJ1ZiArIG9mZnNldCkgPCBwcm9jX2NudCAqIGV4dGVybmFsX3Bkcl9zaXplKQotICAgICh2b2lkKSBlY29mZl9hZGRfYnl0ZXMgKCZidWYsICZidWZlbmQsIGJ1ZiArIG9mZnNldCwKLQkJCSAgICBwcm9jX2NudCAqIGV4dGVybmFsX3Bkcl9zaXplKTsKLSAgb2Zmc2V0ICs9IHByb2NfY250ICogZXh0ZXJuYWxfcGRyX3NpemU7Ci0KLSAgLyogQnVpbGQgdGhlIGxvY2FsIHN5bWJvbHMuICAqLwotICBoZHItPmNiU3ltT2Zmc2V0ID0gb2Zmc2V0OwotICBvZmZzZXQgPSBlY29mZl9idWlsZF9zeW1ib2xzIChiYWNrZW5kLCAmYnVmLCAmYnVmZW5kLCBvZmZzZXQpOwotICBoZHItPmlzeW1NYXggPSAob2Zmc2V0IC0gaGRyLT5jYlN5bU9mZnNldCkgLyBiYWNrZW5kLT5leHRlcm5hbF9zeW1fc2l6ZTsKLQotICAvKiBCdWlsZGluZyB0aGUgc3ltYm9scyBpbml0aWFsaXplcyB0aGUgc3ltYm9sIGluZGV4IGluIHRoZSBQRFIncy4KLSAgICAgTm93IHdlIGNhbiBzd2FwIG91dCB0aGUgUERSJ3MuICAqLwotICAodm9pZCkgZWNvZmZfYnVpbGRfcHJvY3MgKGJhY2tlbmQsICZidWYsICZidWZlbmQsIGhkci0+Y2JQZE9mZnNldCk7Ci0KLSAgLyogV2UgZG9uJ3QgdXNlIG9wdGltaXphdGlvbiBzeW1ib2xzLiAgKi8KLSAgaGRyLT5pb3B0TWF4ID0gMDsKLSAgaGRyLT5jYk9wdE9mZnNldCA9IDA7Ci0KLSAgLyogU3dhcCBvdXQgdGhlIGF1eGlsaWFyeSB0eXBlIGluZm9ybWF0aW9uLiAgKi8KLSAgaGRyLT5jYkF1eE9mZnNldCA9IG9mZnNldDsKLSAgb2Zmc2V0ID0gZWNvZmZfYnVpbGRfYXV4IChiYWNrZW5kLCAmYnVmLCAmYnVmZW5kLCBvZmZzZXQpOwotICBoZHItPmlhdXhNYXggPSAob2Zmc2V0IC0gaGRyLT5jYkF1eE9mZnNldCkgLyBzaXplb2YgKHVuaW9uIGF1eF9leHQpOwotCi0gIC8qIENvcHkgb3V0IHRoZSBsb2NhbCBzdHJpbmdzLiAgKi8KLSAgaGRyLT5jYlNzT2Zmc2V0ID0gb2Zmc2V0OwotICBvZmZzZXQgPSBlY29mZl9idWlsZF9zcyAoYmFja2VuZCwgJmJ1ZiwgJmJ1ZmVuZCwgb2Zmc2V0KTsKLSAgaGRyLT5pc3NNYXggPSBvZmZzZXQgLSBoZHItPmNiU3NPZmZzZXQ7Ci0KLSAgLyogV2UgZG9uJ3QgdXNlIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvcnMuICAqLwotICBoZHItPmNyZmQgPSAwOwotICBoZHItPmNiUmZkT2Zmc2V0ID0gMDsKLQotICAvKiBTd2FwIG91dCB0aGUgZmlsZSBkZXNjcmlwdG9ycy4gICovCi0gIGhkci0+Y2JGZE9mZnNldCA9IG9mZnNldDsKLSAgb2Zmc2V0ID0gZWNvZmZfYnVpbGRfZmRyIChiYWNrZW5kLCAmYnVmLCAmYnVmZW5kLCBvZmZzZXQpOwotICBoZHItPmlmZE1heCA9IChvZmZzZXQgLSBoZHItPmNiRmRPZmZzZXQpIC8gYmFja2VuZC0+ZXh0ZXJuYWxfZmRyX3NpemU7Ci0KLSAgLyogU2V0IHVwIHRoZSBleHRlcm5hbCBzeW1ib2xzLCB3aGljaCBhcmUgaGFuZGxlZCBieSB0aGUgQkZEIGJhY2sKLSAgICAgZW5kLiAgKi8KLSAgaGRyLT5pc3NFeHRNYXggPSAwOwotICBoZHItPmNiU3NFeHRPZmZzZXQgPSAwOwotICBoZHItPmlleHRNYXggPSAwOwotICBoZHItPmNiRXh0T2Zmc2V0ID0gMDsKLSAgZWNvZmZfc2V0dXBfZXh0ICgpOwotCi0gIGtub3cgKChvZmZzZXQgJiAoYmFja2VuZC0+ZGVidWdfYWxpZ24gLSAxKSkgPT0gMCk7Ci0KLSAgLyogRklYTUU6IFRoaXMgdmFsdWUgc2hvdWxkIGJlIGRldGVybWluZWQgZnJvbSB0aGUgLnZlcnN0YW1wIGRpcmVjdGl2ZSwKLSAgICAgd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzIGluIGNvbmZpZyBmaWxlcy4gICovCi0jaWZkZWYgVENfQUxQSEEKLSAgaGRyLT52c3RhbXAgPSAweDAzMGI7Ci0jZWxzZQotICBoZHItPnZzdGFtcCA9IDB4MDIwYjsKLSNlbmRpZgotCi0gICpidWZwID0gYnVmOwotICByZXR1cm4gb2Zmc2V0OwotfQotDAotLyogQWxsb2NhdGUgYSBjbHVzdGVyIG9mIHBhZ2VzLiAgKi8KLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotc3RhdGljIHBhZ2VfdHlwZSAqCi1hbGxvY2F0ZV9jbHVzdGVyIChucGFnZXMpCi0gICAgIHVuc2lnbmVkIGxvbmcgbnBhZ2VzOwotewotICByZWdpc3RlciBwYWdlX3R5cGUgKnZhbHVlID0gKHBhZ2VfdHlwZSAqKSB4bWFsbG9jIChucGFnZXMgKiBQQUdFX1VTSVpFKTsKLQotI2lmZGVmIEVDT0ZGX0RFQlVHCi0gIGlmIChkZWJ1ZyA+IDMpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiXHRhbGxvY1x0bnBhZ2VzID0gJWQsIHZhbHVlID0gMHglLjh4XG4iLCBucGFnZXMsIHZhbHVlKTsKLSNlbmRpZgotCi0gIG1lbXNldCAodmFsdWUsIDAsIG5wYWdlcyAqIFBBR0VfVVNJWkUpOwotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotCi1zdGF0aWMgcGFnZV90eXBlICpjbHVzdGVyX3B0ciA9IE5VTEw7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlc19sZWZ0ID0gMDsKLQotI2VuZGlmIC8qIE1BTExPQ19DSEVDSyAqLwotCi0vKiBBbGxvY2F0ZSBvbmUgcGFnZSAod2hpY2ggaXMgaW5pdGlhbGl6ZWQgdG8gMCkuICAqLwotCi1zdGF0aWMgcGFnZV90eXBlICoKLWFsbG9jYXRlX3BhZ2UgKCkKLXsKLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgaWYgKHBhZ2VzX2xlZnQgPT0gMCkKLSAgICB7Ci0gICAgICBwYWdlc19sZWZ0ID0gTUFYX0NMVVNURVJfUEFHRVM7Ci0gICAgICBjbHVzdGVyX3B0ciA9IGFsbG9jYXRlX2NsdXN0ZXIgKHBhZ2VzX2xlZnQpOwotICAgIH0KLQotICBwYWdlc19sZWZ0LS07Ci0gIHJldHVybiBjbHVzdGVyX3B0cisrOwotCi0jZWxzZQkvKiBNQUxMT0NfQ0hFQ0sgKi8KLQotICBwYWdlX3R5cGUgKnB0cjsKLQotICBwdHIgPSB4bWFsbG9jIChQQUdFX1VTSVpFKTsKLSAgbWVtc2V0IChwdHIsIDAsIFBBR0VfVVNJWkUpOwotICByZXR1cm4gcHRyOwotCi0jZW5kaWYJLyogTUFMTE9DX0NIRUNLICovCi19Ci0MCi0vKiBBbGxvY2F0ZSBzY29waW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHNjb3BlX3QgKgotYWxsb2NhdGVfc2NvcGUgKCkKLXsKLSAgcmVnaXN0ZXIgc2NvcGVfdCAqcHRyOwotICBzdGF0aWMgc2NvcGVfdCBpbml0aWFsX3Njb3BlOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIHB0ciA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLmZyZWVfbGlzdC5mX3Njb3BlOwotICBpZiAocHRyICE9IChzY29wZV90ICopIE5VTEwpCi0gICAgYWxsb2NfY291bnRzWyAoaW50KWFsbG9jX3R5cGVfc2NvcGUgXS5mcmVlX2xpc3QuZl9zY29wZSA9IHB0ci0+ZnJlZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZAk9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLnVuYWxsb2NhdGVkOwotICAgICAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZQk9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLmN1cl9wYWdlOwotCi0gICAgICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKLQl7Ci0JICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAoc2NvcGVfdCk7Ci0JICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS5jdXJfcGFnZSA9IGN1cl9wYWdlID0gYWxsb2NhdGVfcGFnZSAoKTsKLQkgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLnRvdGFsX3BhZ2VzKys7Ci0JfQotCi0gICAgICBwdHIgPSAmY3VyX3BhZ2UtPnNjb3BlWy0tdW5hbGxvY2F0ZWRdOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKLSAgICB9Ci0KLSNlbHNlCi0KLSAgcHRyID0gKHNjb3BlX3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzY29wZV90KSk7Ci0KLSNlbmRpZgotCi0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLnRvdGFsX2FsbG9jKys7Ci0gICpwdHIgPSBpbml0aWFsX3Njb3BlOwotICByZXR1cm4gcHRyOwotfQotCi0vKiBGcmVlIHNjb3BpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotZnJlZV9zY29wZSAocHRyKQotICAgICBzY29wZV90ICpwdHI7Ci17Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLnRvdGFsX2ZyZWUrKzsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLSAgcHRyLT5mcmVlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0uZnJlZV9saXN0LmZfc2NvcGU7Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLmZyZWVfbGlzdC5mX3Njb3BlID0gcHRyOwotI2Vsc2UKLSAgZnJlZSAoKFBUUikgcHRyKTsKLSNlbmRpZgotfQotDAotLyogQWxsb2NhdGUgbGlua3MgZm9yIHBhZ2VzIGluIGEgdmlydHVhbCBhcnJheS4gICovCi0KLXN0YXRpYyB2bGlua3NfdCAqCi1hbGxvY2F0ZV92bGlua3MgKCkKLXsKLSAgcmVnaXN0ZXIgdmxpbmtzX3QgKnB0cjsKLSAgc3RhdGljIHZsaW5rc190IGluaXRpYWxfdmxpbmtzOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZCA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdmxpbmtzXS51bmFsbG9jYXRlZDsKLSAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdmxpbmtzXS5jdXJfcGFnZTsKLQotICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKLSAgICB7Ci0gICAgICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAodmxpbmtzX3QpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92bGlua3NdLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92bGlua3NdLnRvdGFsX3BhZ2VzKys7Ci0gICAgfQotCi0gIHB0ciA9ICZjdXJfcGFnZS0+dmxpbmtzWy0tdW5hbGxvY2F0ZWRdOwotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZsaW5rc10udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKLQotI2Vsc2UKLQotICBwdHIgPSAodmxpbmtzX3QgKikgeG1hbGxvYyAoc2l6ZW9mICh2bGlua3NfdCkpOwotCi0jZW5kaWYKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZsaW5rc10udG90YWxfYWxsb2MrKzsKLSAgKnB0ciA9IGluaXRpYWxfdmxpbmtzOwotICByZXR1cm4gcHRyOwotfQotDAotLyogQWxsb2NhdGUgc3RyaW5nIGhhc2ggYnVja2V0cy4gICovCi0KLXN0YXRpYyBzaGFzaF90ICoKLWFsbG9jYXRlX3NoYXNoICgpCi17Ci0gIHJlZ2lzdGVyIHNoYXNoX3QgKnB0cjsKLSAgc3RhdGljIHNoYXNoX3QgaW5pdGlhbF9zaGFzaDsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3NoYXNoXS51bmFsbG9jYXRlZDsKLSAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2hhc2hdLmN1cl9wYWdlOwotCi0gIGlmICh1bmFsbG9jYXRlZCA9PSAwKQotICAgIHsKLSAgICAgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mIChzaGFzaF90KTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2hhc2hdLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zaGFzaF0udG90YWxfcGFnZXMrKzsKLSAgICB9Ci0KLSAgcHRyID0gJmN1cl9wYWdlLT5zaGFzaFstLXVuYWxsb2NhdGVkXTsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zaGFzaF0udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKLQotI2Vsc2UKLQotICBwdHIgPSAoc2hhc2hfdCAqKSB4bWFsbG9jIChzaXplb2YgKHNoYXNoX3QpKTsKLQotI2VuZGlmCi0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zaGFzaF0udG90YWxfYWxsb2MrKzsKLSAgKnB0ciA9IGluaXRpYWxfc2hhc2g7Ci0gIHJldHVybiBwdHI7Ci19Ci0MCi0vKiBBbGxvY2F0ZSB0eXBlIGhhc2ggYnVja2V0cy4gICovCi0KLXN0YXRpYyB0aGFzaF90ICoKLWFsbG9jYXRlX3RoYXNoICgpCi17Ci0gIHJlZ2lzdGVyIHRoYXNoX3QgKnB0cjsKLSAgc3RhdGljIHRoYXNoX3QgaW5pdGlhbF90aGFzaDsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoYXNoXS51bmFsbG9jYXRlZDsKLSAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhhc2hdLmN1cl9wYWdlOwotCi0gIGlmICh1bmFsbG9jYXRlZCA9PSAwKQotICAgIHsKLSAgICAgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mICh0aGFzaF90KTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhhc2hdLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGFzaF0udG90YWxfcGFnZXMrKzsKLSAgICB9Ci0KLSAgcHRyID0gJmN1cl9wYWdlLT50aGFzaFstLXVuYWxsb2NhdGVkXTsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGFzaF0udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKLQotI2Vsc2UKLQotICBwdHIgPSAodGhhc2hfdCAqKSB4bWFsbG9jIChzaXplb2YgKHRoYXNoX3QpKTsKLQotI2VuZGlmCi0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGFzaF0udG90YWxfYWxsb2MrKzsKLSAgKnB0ciA9IGluaXRpYWxfdGhhc2g7Ci0gIHJldHVybiBwdHI7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBzdHJ1Y3R1cmUsIHVuaW9uLCBvciBlbnVtIHRhZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB0YWdfdCAqCi1hbGxvY2F0ZV90YWcgKCkKLXsKLSAgcmVnaXN0ZXIgdGFnX3QgKnB0cjsKLSAgc3RhdGljIHRhZ190IGluaXRpYWxfdGFnOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIHB0ciA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS5mcmVlX2xpc3QuZl90YWc7Ci0gIGlmIChwdHIgIT0gKHRhZ190ICopIE5VTEwpCi0gICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLmZyZWVfbGlzdC5mX3RhZyA9IHB0ci0+ZnJlZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZCA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS51bmFsbG9jYXRlZDsKLSAgICAgIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10uY3VyX3BhZ2U7Ci0KLSAgICAgIGlmICh1bmFsbG9jYXRlZCA9PSAwKQotCXsKLQkgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mICh0YWdfdCk7Ci0JICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10uY3VyX3BhZ2UgPSBjdXJfcGFnZSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0JICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10udG90YWxfcGFnZXMrKzsKLQl9Ci0KLSAgICAgIHB0ciA9ICZjdXJfcGFnZS0+dGFnWy0tdW5hbGxvY2F0ZWRdOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLnVuYWxsb2NhdGVkID0gdW5hbGxvY2F0ZWQ7Ci0gICAgfQotCi0jZWxzZQotCi0gIHB0ciA9ICh0YWdfdCAqKSB4bWFsbG9jIChzaXplb2YgKHRhZ190KSk7Ci0KLSNlbmRpZgotCi0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS50b3RhbF9hbGxvYysrOwotICAqcHRyID0gaW5pdGlhbF90YWc7Ci0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIEZyZWUgc2NvcGluZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1mcmVlX3RhZyAocHRyKQotICAgICB0YWdfdCAqcHRyOwotewotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10udG90YWxfZnJlZSsrOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotICBwdHItPmZyZWUgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10uZnJlZV9saXN0LmZfdGFnOwotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10uZnJlZV9saXN0LmZfdGFnID0gcHRyOwotI2Vsc2UKLSAgZnJlZSAoKFBUUl9UKSBwdHIpOwotI2VuZGlmCi19Ci0MCi0vKiBBbGxvY2F0ZSBmb3J3YXJkIHJlZmVyZW5jZSB0byBhIHlldCB1bmtub3duIHRhZy4gICovCi0KLXN0YXRpYyBmb3J3YXJkX3QgKgotYWxsb2NhdGVfZm9yd2FyZCAoKQotewotICByZWdpc3RlciBmb3J3YXJkX3QgKnB0cjsKLSAgc3RhdGljIGZvcndhcmRfdCBpbml0aWFsX2ZvcndhcmQ7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9mb3J3YXJkXS51bmFsbG9jYXRlZDsKLSAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfZm9yd2FyZF0uY3VyX3BhZ2U7Ci0KLSAgaWYgKHVuYWxsb2NhdGVkID09IDApCi0gICAgewotICAgICAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKGZvcndhcmRfdCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2ZvcndhcmRdLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9mb3J3YXJkXS50b3RhbF9wYWdlcysrOwotICAgIH0KLQotICBwdHIgPSAmY3VyX3BhZ2UtPmZvcndhcmRbLS11bmFsbG9jYXRlZF07Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfZm9yd2FyZF0udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKLQotI2Vsc2UKLQotICBwdHIgPSAoZm9yd2FyZF90ICopIHhtYWxsb2MgKHNpemVvZiAoZm9yd2FyZF90KSk7Ci0KLSNlbmRpZgotCi0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfZm9yd2FyZF0udG90YWxfYWxsb2MrKzsKLSAgKnB0ciA9IGluaXRpYWxfZm9yd2FyZDsKLSAgcmV0dXJuIHB0cjsKLX0KLQwKLS8qIEFsbG9jYXRlIGhlYWQgb2YgdHlwZSBoYXNoIGxpc3QuICAqLwotCi1zdGF0aWMgdGhlYWRfdCAqCi1hbGxvY2F0ZV90aGVhZCAoKQotewotICByZWdpc3RlciB0aGVhZF90ICpwdHI7Ci0gIHN0YXRpYyB0aGVhZF90IGluaXRpYWxfdGhlYWQ7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgcHRyID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0uZnJlZV9saXN0LmZfdGhlYWQ7Ci0gIGlmIChwdHIgIT0gKHRoZWFkX3QgKikgTlVMTCkKLSAgICBhbGxvY19jb3VudHNbIChpbnQpYWxsb2NfdHlwZV90aGVhZCBdLmZyZWVfbGlzdC5mX3RoZWFkID0gcHRyLT5mcmVlOwotICBlbHNlCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0udW5hbGxvY2F0ZWQ7Ci0gICAgICByZWdpc3RlciBwYWdlX3R5cGUgKmN1cl9wYWdlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0uY3VyX3BhZ2U7Ci0KLSAgICAgIGlmICh1bmFsbG9jYXRlZCA9PSAwKQotCXsKLQkgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mICh0aGVhZF90KTsKLQkgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOwotCSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0udG90YWxfcGFnZXMrKzsKLQl9Ci0KLSAgICAgIHB0ciA9ICZjdXJfcGFnZS0+dGhlYWRbLS11bmFsbG9jYXRlZF07Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS51bmFsbG9jYXRlZCA9IHVuYWxsb2NhdGVkOwotICAgIH0KLQotI2Vsc2UKLQotICBwdHIgPSAodGhlYWRfdCAqKSB4bWFsbG9jIChzaXplb2YgKHRoZWFkX3QpKTsKLQotI2VuZGlmCi0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0udG90YWxfYWxsb2MrKzsKLSAgKnB0ciA9IGluaXRpYWxfdGhlYWQ7Ci0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIEZyZWUgc2NvcGluZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1mcmVlX3RoZWFkIChwdHIpCi0gICAgIHRoZWFkX3QgKnB0cjsKLXsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0udG90YWxfZnJlZSsrOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotICBwdHItPmZyZWUgPSAodGhlYWRfdCAqKSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS5mcmVlX2xpc3QuZl90aGVhZDsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0uZnJlZV9saXN0LmZfdGhlYWQgPSBwdHI7Ci0jZWxzZQotICBmcmVlICgoUFRSX1QpIHB0cik7Ci0jZW5kaWYKLX0KLQwKLXN0YXRpYyBsaW5lbm9fbGlzdF90ICoKLWFsbG9jYXRlX2xpbmVub19saXN0ICgpCi17Ci0gIHJlZ2lzdGVyIGxpbmVub19saXN0X3QgKnB0cjsKLSAgc3RhdGljIGxpbmVub19saXN0X3QgaW5pdGlhbF9saW5lbm9fbGlzdDsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2xpbmVub10udW5hbGxvY2F0ZWQ7Ci0gIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2xpbmVub10uY3VyX3BhZ2U7Ci0KLSAgaWYgKHVuYWxsb2NhdGVkID09IDApCi0gICAgewotICAgICAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKGxpbmVub19saXN0X3QpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9saW5lbm9dLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9saW5lbm9dLnRvdGFsX3BhZ2VzKys7Ci0gICAgfQotCi0gIHB0ciA9ICZjdXJfcGFnZS0+bGluZW5vWy0tdW5hbGxvY2F0ZWRdOwotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2xpbmVub10udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKLQotI2Vsc2UKLQotICBwdHIgPSAobGluZW5vX2xpc3RfdCAqKSB4bWFsbG9jIChzaXplb2YgKGxpbmVub19saXN0X3QpKTsKLQotI2VuZGlmCi0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9saW5lbm9dLnRvdGFsX2FsbG9jKys7Ci0gICpwdHIgPSBpbml0aWFsX2xpbmVub19saXN0OwotICByZXR1cm4gcHRyOwotfQotCi12b2lkCi1lY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUgKHN6KQotICAgICBpbnQgc3o7Ci17Ci0gIGlmIChjdXJfcHJvY19wdHIgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgY3VyX3Byb2NfcHRyLT5wZHIuZ3BfcHJvbG9ndWUgPSBzejsKLSAgaWYgKGN1cl9wcm9jX3B0ci0+cGRyLmdwX3Byb2xvZ3VlICE9IHN6KQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkdQIHByb2xvZ3VlIHNpemUgZXhjZWVkcyBmaWVsZCBzaXplLCB1c2luZyAwIGluc3RlYWQiKSk7Ci0gICAgICBjdXJfcHJvY19wdHItPnBkci5ncF9wcm9sb2d1ZSA9IDA7Ci0gICAgfQotCi0gIGN1cl9wcm9jX3B0ci0+cGRyLmdwX3VzZWQgPSAxOwotfQotCi1pbnQgCi1lY29mZl9ub19jdXJyZW50X2ZpbGUgKCkKLXsKLSAgcmV0dXJuIGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEw7Ci19Ci0KLXZvaWQKLWVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8gKCkKLXsKLSAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIGxpbmVub19saXN0X3QgKmxpc3Q7Ci0KLSAgYXNfd2hlcmUgKCZmaWxlbmFtZSwgJmxpbmVubyk7Ci0KLSAgaWYgKGN1cnJlbnRfc3RhYnNfZmlsZW5hbWUgPT0gKGNoYXIgKilOVUxMCi0gICAgICB8fCBzdHJjbXAgKGN1cnJlbnRfc3RhYnNfZmlsZW5hbWUsIGZpbGVuYW1lKSkKLSAgICBhZGRfZmlsZSAoZmlsZW5hbWUsIDAsIDEpOwotCi0gIGxpc3QgPSBhbGxvY2F0ZV9saW5lbm9fbGlzdCAoKTsKLQotICBsaXN0LT5uZXh0ID0gKGxpbmVub19saXN0X3QgKikgTlVMTDsKLSAgbGlzdC0+ZmlsZSA9IGN1cl9maWxlX3B0cjsKLSAgbGlzdC0+cHJvYyA9IGN1cl9wcm9jX3B0cjsKLSAgbGlzdC0+ZnJhZyA9IGZyYWdfbm93OwotICBsaXN0LT5wYWRkciA9IGZyYWdfbm93X2ZpeCAoKTsKLSAgbGlzdC0+bGluZW5vID0gbGluZW5vOwotCi0gIC8qIFdlIGRvbid0IHdhbnQgdG8gbWVyZ2UgZmlsZXMgd2hpY2ggaGF2ZSBsaW5lIG51bWJlcnMuICAqLwotICBjdXJfZmlsZV9wdHItPmZkci5mTWVyZ2UgPSAwOwotCi0gIC8qIEEgLmxvYyBkaXJlY3RpdmUgd2lsbCBzb21ldGltZXMgYXBwZWFyIGJlZm9yZSBhIC5lbnQgZGlyZWN0aXZlLAotICAgICB3aGljaCBtZWFucyB0aGF0IGN1cl9wcm9jX3B0ciB3aWxsIGJlIE5VTEwgaGVyZS4gIEFycmFuZ2UgdG8KLSAgICAgcGF0Y2ggdGhpcyB1cC4gICovCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGxpbmVub19saXN0X3QgKipwbDsKLQotICAgICAgcGwgPSAmbm9wcm9jX2xpbmVubzsKLSAgICAgIHdoaWxlICgqcGwgIT0gKGxpbmVub19saXN0X3QgKikgTlVMTCkKLSAgICAgICAgcGwgPSAmKCpwbCktPm5leHQ7Ci0gICAgICAqcGwgPSBsaXN0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxhc3RfbGluZW5vID0gbGlzdDsKLSAgICAgICpsYXN0X2xpbmVub19wdHIgPSBsaXN0OwotICAgICAgbGFzdF9saW5lbm9fcHRyID0gJmxpc3QtPm5leHQ7Ci0gICAgfQotfQotCi0jZWxzZQotCi12b2lkCi1lY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vICgpCi17Ci19Ci0KLSNlbmRpZiAvKiBFQ09GRl9ERUJVR0dJTkcgKi8KZGlmZiAtLWdpdCBhL2dhcy9lY29mZi5oIGIvZ2FzL2Vjb2ZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOWI2ZmMuLjAwMDAwMDAKLS0tIGEvZ2FzL2Vjb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyogZWNvZmYuaCAtLSBoZWFkZXIgZmlsZSBmb3IgRUNPRkYgZGVidWdnaW5nIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotICAgUHV0IHRvZ2V0aGVyIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBHQVNfRUNPRkZfSAotI2RlZmluZSBHQVNfRUNPRkZfSAotCi0jaWZkZWYgRUNPRkZfREVCVUdHSU5HCi0KLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLQotLyogV2hldGhlciB3ZSBoYXZlIHNlZW4gYW55IEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gaW50IGVjb2ZmX2RlYnVnZ2luZ19zZWVuOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGFzc2VtYmx5LCBieQotICAgb2JqX3JlYWRfYmVnaW5faG9vay4gICovCi1leHRlcm4gdm9pZCBlY29mZl9yZWFkX2JlZ2luX2hvb2sgUEFSQU1TICgodm9pZCkpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgYXNzZW1ibGVyIHN3aXRjaGVzIHRvIGEgbmV3Ci0gICBmaWxlLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX25ld19maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIG5ldyBzeW1ib2wgaXMgY3JlYXRlZCwgYnkKLSAgIG9ial9zeW1ib2xfbmV3X2hvb2suICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfc3ltYm9sX25ld19ob29rIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIG9ial9mcm9iX3N5bWJvbCBob29rLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX2Zyb2Jfc3ltYm9sIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOwotCi0vKiBCdWlsZCB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5Ci0gICBvYmpfZnJvYl9maWxlLiAgVGhpcyBmaWxscyBpbiB0aGUgY291bnRzIGluICpIRFI7IHRoZSBvZmZzZXRzIGFyZQotICAgZmlsbGVkIGluIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgKkJVRlAuICBJdCBzZXRzICpCVUZQIHRvIGEKLSAgIGJsb2NrIG9mIG1lbW9yeSBob2xkaW5nIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBJdCByZXR1cm5zIHRoZQotICAgbGVuZ3RoIG9mICpCVUZQLiAgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIGVjb2ZmX2J1aWxkX2RlYnVnCi0gIFBBUkFNUyAoKEhEUlIgKmhkciwgY2hhciAqKmJ1ZnAsIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICopKTsKLQotLyogRnVuY3Rpb25zIHRvIGhhbmRsZSB0aGUgRUNPRkYgZGVidWdnaW5nIGRpcmVjdGl2ZXMuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2JlZ2luIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2JlbmQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZW5kIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2VudCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9mbWFzayBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9mcmFtZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9sb2MgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfbWFzayBQQVJBTVMgKChpbnQpKTsKLQotLyogT3RoZXIgRUNPRkYgZGlyZWN0aXZlcy4gICovCi1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZXh0ZXJuIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX3dlYWtleHQgUEFSQU1TICgoaW50KSk7Ci0KLS8qIEZ1bmN0aW9ucyB0byBoYW5kbGUgdGhlIENPRkYgZGVidWdnaW5nIGRpcmVjdGl2ZXMuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2RlZiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9kaW0gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZW5kZWYgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZmlsZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9zY2wgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfc2l6ZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV90YWcgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfdHlwZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV92YWwgUEFSQU1TICgoaW50KSk7Ci0KLS8qIEhhbmRsZSBzdGFicy4gICovCi1leHRlcm4gdm9pZCBlY29mZl9zdGFiIFBBUkFNUyAoKHNlZ1Qgc2VjLCBpbnQgd2hhdCwgY29uc3QgY2hhciAqc3RyaW5nLAotCQkJCWludCB0eXBlLCBpbnQgb3RoZXIsIGludCBkZXNjKSk7Ci0KLS8qIFNldCB0aGUgR1AgcHJvbG9ndWUgc2l6ZS4gICovCi1leHRlcm4gdm9pZCBlY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUgUEFSQU1TICgoaW50IHN6KSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSB0aGUgRUNPRkYgY29kZSB0byBzZXQgdGhlIGV4dGVybmFsCi0gICBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wuICAqLwotI2lmbmRlZiBvYmpfZWNvZmZfc2V0X2V4dAotZXh0ZXJuIHZvaWQgb2JqX2Vjb2ZmX3NldF9leHQgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqLCBFWFRSICopKTsKLSNlbmRpZgotCi0vKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBwYXRjaCB1cCBhIGxpbmUgbnVtYmVyIGRpcmVjdGl2ZSB3aGVuCi0gICBpbnN0cnVjdGlvbnMgYXJlIG1vdmVkIGFyb3VuZC4gICovCi1leHRlcm4gdm9pZCBlY29mZl9maXhfbG9jIFBBUkFNUyAoKGZyYWdTICosIHVuc2lnbmVkIGxvbmcpKTsKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSByZWFkLmMgdG8gcGVlayBhdCBjdXJfZmlsZV9wdHIuICAqLwotZXh0ZXJuIGludCBlY29mZl9ub19jdXJyZW50X2ZpbGUgUEFSQU1TICgodm9pZCkpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgcHJvYy4gICovCi1leHRlcm4gc3RydWN0IHN5bWJvbCAqZWNvZmZfZ2V0X2N1cl9wcm9jX3N5bSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZiAvKiBFQ09GRl9ERUJVR0dJTkcgKi8KLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHJlYWQuYyB0byBnZW5lcmF0ZSBsaW5lIG51bWJlciBmb3IgLnMgZmlsZS4gICovCi1leHRlcm4gdm9pZCBlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vIFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmIC8qICEgR0FTX0VDT0ZGX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9laG9wdC5jIGIvZ2FzL2Vob3B0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYTVmNjIuLjAwMDAwMDAKLS0tIGEvZ2FzL2Vob3B0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyogZWhvcHQuYy0tb3B0aW1pemUgZ2NjIGV4Y2VwdGlvbiBmcmFtZSBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+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+ZnJfb2Zmc2V0ID0gMDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9lbXVsLXRhcmdldC5oIGIvZ2FzL2VtdWwtdGFyZ2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MDQwNTAuLjAwMDAwMDAKLS0tIGEvZ2FzL2VtdWwtdGFyZ2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jaWZuZGVmIGVtdWxfaW5pdAotI2RlZmluZSBlbXVsX2luaXQJCQljb21tb25fZW11bF9pbml0Ci0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX2JmZF9uYW1lCi0jZGVmaW5lIGVtdWxfYmZkX25hbWUJCQlkZWZhdWx0X2VtdWxfYmZkX25hbWUKLSNlbmRpZgotCi0jaWZuZGVmIGVtdWxfbG9jYWxfbGFiZWxzX2ZiCi0jZGVmaW5lIGVtdWxfbG9jYWxfbGFiZWxzX2ZiCQkwCi0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX2xvY2FsX2xhYmVsc19kb2xsYXIKLSNkZWZpbmUgZW11bF9sb2NhbF9sYWJlbHNfZG9sbGFyCTAKLSNlbmRpZgotCi0jaWZuZGVmIGVtdWxfbGVhZGluZ191bmRlcnNjb3JlCi0jZGVmaW5lIGVtdWxfbGVhZGluZ191bmRlcnNjb3JlCQkyCi0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX3N0cmlwX3VuZGVyc2NvcmUKLSNkZWZpbmUgZW11bF9zdHJpcF91bmRlcnNjb3JlCQkwCi0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX2RlZmF1bHRfZW5kaWFuCi0jZGVmaW5lIGVtdWxfZGVmYXVsdF9lbmRpYW4JCTIKLSNlbmRpZgotCi0jaWZuZGVmIGVtdWxfZmFrZV9sYWJlbF9uYW1lCi0jZGVmaW5lIGVtdWxfZmFrZV9sYWJlbF9uYW1lCQkwCi0jZW5kaWYKLQotc3RydWN0IGVtdWxhdGlvbiBlbXVsX3N0cnVjdF9uYW1lID0gewotICAwLAotICBlbXVsX25hbWUsCi0gIGVtdWxfaW5pdCwKLSAgZW11bF9iZmRfbmFtZSwKLSAgZW11bF9sb2NhbF9sYWJlbHNfZmIsIGVtdWxfbG9jYWxfbGFiZWxzX2RvbGxhciwKLSAgZW11bF9sZWFkaW5nX3VuZGVyc2NvcmUsIGVtdWxfc3RyaXBfdW5kZXJzY29yZSwKLSAgZW11bF9kZWZhdWx0X2VuZGlhbiwKLSAgZW11bF9mYWtlX2xhYmVsX25hbWUsCi0gIGVtdWxfZm9ybWF0LAotfTsKZGlmZiAtLWdpdCBhL2dhcy9lbXVsLmggYi9nYXMvZW11bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2M0NmQ4Li4wMDAwMDAwCi0tLSBhL2dhcy9lbXVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jaWZuZGVmIEVNVUxfREVGUwotI2RlZmluZSBFTVVMX0RFRlMKLQotc3RydWN0IGVtdWxhdGlvbiB7Ci0gIHZvaWQgKCptYXRjaCkgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHZvaWQgKCppbml0KSBQQVJBTVMgKCh2b2lkKSk7Ci0gIGNvbnN0IGNoYXIgKigqYmZkX25hbWUpIFBBUkFNUyAoKHZvaWQpKTsKLSAgdW5zaWduZWQgbG9jYWxfbGFiZWxzX2ZiIDogMTsKLSAgdW5zaWduZWQgbG9jYWxfbGFiZWxzX2RvbGxhciA6IDE7Ci0gIHVuc2lnbmVkIGxlYWRpbmdfdW5kZXJzY29yZSA6IDI7Ci0gIHVuc2lnbmVkIHN0cmlwX3VuZGVyc2NvcmUgOiAxOwotICB1bnNpZ25lZCBkZWZhdWx0X2VuZGlhbiA6IDI7Ci0gIGNvbnN0IGNoYXIgKmZha2VfbGFiZWxfbmFtZTsKLSAgY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgKmZvcm1hdDsKLX07Ci0KLUNPTU1PTiBzdHJ1Y3QgZW11bGF0aW9uICp0aGlzX2VtdWxhdGlvbjsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmRlZmF1bHRfZW11bF9iZmRfbmFtZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBjb21tb25fZW11bF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvZXhwci5jIGIvZ2FzL2V4cHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5NzIwYy4uMDAwMDAwMAotLS0gYS9nYXMvZXhwci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg2MyArMCwwIEBACi0vKiBleHByLmMgLW9wZXJhbmRzLCBleHByZXNzaW9ucy0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0vKgotICogVGhpcyBpcyByZWFsbHkgYSBicmFuY2ggb2ZmaWNlIG9mIGFzLXJlYWQuYy4gSSBzcGxpdCBpdCBvdXQgdG8gY2xlYXJseQotICogZGlzdGluZ3Vpc2ggdGhlIHdvcmxkIG9mIGV4cHJlc3Npb25zIGZyb20gdGhlIHdvcmxkIG9mIHN0YXRlbWVudHMuCi0gKiAoSXQgYWxzbyBnaXZlcyBzbWFsbGVyIGZpbGVzIHRvIHJlLWNvbXBpbGUuKQotICogSGVyZSwgIm9wZXJhbmQicyBhcmUgb2YgZXhwcmVzc2lvbnMsIG5vdCBpbnN0cnVjdGlvbnMuCi0gKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZGVmaW5lIG1pbihhLCBiKSAgICAgICAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLXN0YXRpYyB2b2lkIGZsb2F0aW5nX2NvbnN0YW50IFBBUkFNUyAoKGV4cHJlc3Npb25TICogZXhwcmVzc2lvblApKTsKLXN0YXRpYyB2YWx1ZVQgZ2VuZXJpY19iaWdudW1fdG9faW50MzIgUEFSQU1TICgodm9pZCkpOwotI2lmZGVmIEJGRDY0Ci1zdGF0aWMgdmFsdWVUIGdlbmVyaWNfYmlnbnVtX3RvX2ludDY0IFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgaW50ZWdlcl9jb25zdGFudCBQQVJBTVMgKChpbnQgcmFkaXgsIGV4cHJlc3Npb25TICogZXhwcmVzc2lvblApKTsKLXN0YXRpYyB2b2lkIG1yaV9jaGFyX2NvbnN0YW50IFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyB2b2lkIGN1cnJlbnRfbG9jYXRpb24gUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOwotc3RhdGljIHZvaWQgY2xlYW5fdXBfZXhwcmVzc2lvbiBQQVJBTVMgKChleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgc2VnVCBvcGVyYW5kIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyBvcGVyYXRvclQgb3BlcmF0b3IgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gY29uc3QgY2hhciBFWFBfQ0hBUlNbXSwgRkxUX0NIQVJTW107Ci0KLS8qIFdlIGtlZXAgYSBtYXBwaW5nIG9mIGV4cHJlc3Npb24gc3ltYm9scyB0byBmaWxlIHBvc2l0aW9ucywgc28gdGhhdAotICAgd2UgY2FuIHByb3ZpZGUgYmV0dGVyIGVycm9yIG1lc3NhZ2VzLiAgKi8KLQotc3RydWN0IGV4cHJfc3ltYm9sX2xpbmUKLXsKLSAgc3RydWN0IGV4cHJfc3ltYm9sX2xpbmUgKm5leHQ7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci19OwotCi1zdGF0aWMgc3RydWN0IGV4cHJfc3ltYm9sX2xpbmUgKmV4cHJfc3ltYm9sX2xpbmVzOwotDAotLyogQnVpbGQgYSBkdW1teSBzeW1ib2wgdG8gaG9sZCBhIGNvbXBsZXggZXhwcmVzc2lvbi4gIFRoaXMgaXMgaG93IHdlCi0gICBidWlsZCBleHByZXNzaW9ucyB1cCBvdXQgb2Ygb3RoZXIgZXhwcmVzc2lvbnMuICBUaGUgc3ltYm9sIGlzIHB1dAotICAgaW50byB0aGUgZmFrZSBzZWN0aW9uIGV4cHJfc2VjdGlvbi4gICovCi0KLXN5bWJvbFMgKgotbWFrZV9leHByX3N5bWJvbCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgZXhwcmVzc2lvblMgemVybzsKLSAgY29uc3QgY2hhciAqZmFrZTsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgc3RydWN0IGV4cHJfc3ltYm9sX2xpbmUgKm47Ci0KLSAgaWYgKGV4cHJlc3Npb25QLT5YX29wID09IE9fc3ltYm9sCi0gICAgICAmJiBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID09IDApCi0gICAgcmV0dXJuIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2w7Ci0KLSAgaWYgKGV4cHJlc3Npb25QLT5YX29wID09IE9fYmlnKQotICAgIHsKLSAgICAgIC8qIFRoaXMgd29uJ3Qgd29yaywgYmVjYXVzZSB0aGUgYWN0dWFsIHZhbHVlIGlzIHN0b3JlZCBpbgotICAgICAgICAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgb3IgZ2VuZXJpY19iaWdudW0sIGFuZCB3ZSBhcmUKLSAgICAgICAgIGdvaW5nIHRvIGxvc2UgaXQgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID4gMCkKLQlhc19iYWQgKF8oImJpZ251bSBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJmbG9hdGluZyBwb2ludCBudW1iZXIgaW52YWxpZDsgemVybyBhc3N1bWVkIikpOwotICAgICAgemVyby5YX29wID0gT19jb25zdGFudDsKLSAgICAgIHplcm8uWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIHplcm8uWF91bnNpZ25lZCA9IDA7Ci0gICAgICBjbGVhbl91cF9leHByZXNzaW9uICgmemVybyk7Ci0gICAgICBleHByZXNzaW9uUCA9ICZ6ZXJvOwotICAgIH0KLQotICBmYWtlID0gRkFLRV9MQUJFTF9OQU1FOwotCi0gIC8qIFB1dHRpbmcgY29uc3RhbnQgc3ltYm9scyBpbiBhYnNvbHV0ZV9zZWN0aW9uIHJhdGhlciB0aGFuCi0gICAgIGV4cHJfc2VjdGlvbiBpcyBjb252ZW5pZW50IGZvciB0aGUgb2xkIGEub3V0IGNvZGUsIGZvciB3aGljaAotICAgICBTX0dFVF9TRUdNRU5UIGRvZXMgbm90IGFsd2F5cyByZXRyaWV2ZSB0aGUgdmFsdWUgcHV0IGluIGJ5Ci0gICAgIFNfU0VUX1NFR01FTlQuICAqLwotICBzeW1ib2xQID0gc3ltYm9sX2NyZWF0ZSAoZmFrZSwKLQkJCSAgIChleHByZXNzaW9uUC0+WF9vcCA9PSBPX2NvbnN0YW50Ci0JCQkgICAgPyBhYnNvbHV0ZV9zZWN0aW9uCi0JCQkgICAgOiBleHByX3NlY3Rpb24pLAotCQkJICAgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgc3ltYm9sUC0+c3lfdmFsdWUgPSAqZXhwcmVzc2lvblA7Ci0KLSAgaWYgKGV4cHJlc3Npb25QLT5YX29wID09IE9fY29uc3RhbnQpCi0gICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbFAsIDEpOwotCi0gIG4gPSAoc3RydWN0IGV4cHJfc3ltYm9sX2xpbmUgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLSAgbi0+c3ltID0gc3ltYm9sUDsKLSAgYXNfd2hlcmUgKCZuLT5maWxlLCAmbi0+bGluZSk7Ci0gIG4tPm5leHQgPSBleHByX3N5bWJvbF9saW5lczsKLSAgZXhwcl9zeW1ib2xfbGluZXMgPSBuOwotCi0gIHJldHVybiBzeW1ib2xQOwotfQotCi0vKiBSZXR1cm4gdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZvciBhbiBleHByIHN5bWJvbC4gIFJldHVybgotICAgbm9uLXplcm8gaWYgc29tZXRoaW5nIHdhcyBmb3VuZCwgMCBpZiBubyBpbmZvcm1hdGlvbiBpcyBrbm93biBmb3IKLSAgIHRoZSBzeW1ib2wuICAqLwotCi1pbnQKLWV4cHJfc3ltYm9sX3doZXJlIChzeW0sIHBmaWxlLCBwbGluZSkKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBjaGFyICoqcGZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCAqcGxpbmU7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBleHByX3N5bWJvbF9saW5lICpsOwotCi0gIGZvciAobCA9IGV4cHJfc3ltYm9sX2xpbmVzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChsLT5zeW0gPT0gc3ltKQotCXsKLQkgICpwZmlsZSA9IGwtPmZpbGU7Ci0JICAqcGxpbmUgPSBsLT5saW5lOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQwKLS8qIFV0aWxpdGllcyBmb3IgYnVpbGRpbmcgZXhwcmVzc2lvbnMuCi0gICBTaW5jZSBjb21wbGV4IGV4cHJlc3Npb25zIGFyZSByZWNvcmRlZCBhcyBzeW1ib2xzIGZvciB1c2UgaW4gb3RoZXIKLSAgIGV4cHJlc3Npb25zIHRoZXNlIHJldHVybiBhIHN5bWJvbFMgKiBhbmQgbm90IGFuIGV4cHJlc3Npb25TICouCi0gICBUaGVzZSBleHBsaWNpdGx5IGRvIG5vdCB0YWtlIGFuICJhZGRfbnVtYmVyIiBhcmd1bWVudC4gICovCi0vKiA/Pz8gRm9yIGNvbXBsZXRlbmVzcycgc2FrZSBvbmUgbWlnaHQgd2FudCBleHByX2J1aWxkX3N5bWJvbC4KLSAgIEl0IHdvdWxkIGp1c3QgcmV0dXJuIGl0cyBhcmd1bWVudC4gICovCi0KLS8qIEJ1aWxkIGFuIGV4cHJlc3Npb24gZm9yIGFuIHVuc2lnbmVkIGNvbnN0YW50LgotICAgVGhlIGNvcnJlc3BvbmRpbmcgb25lIGZvciBzaWduZWQgY29uc3RhbnRzIGlzIG1pc3NpbmcgYmVjYXVzZQotICAgdGhlcmUncyBjdXJyZW50bHkgbm8gbmVlZCBmb3IgaXQuICBPbmUgY291bGQgYWRkIGFuIHVuc2lnbmVkX3AgZmxhZwotICAgYnV0IHRoYXQgc2VlbXMgbW9yZSBjbHVtc3kuICAqLwotCi1zeW1ib2xTICoKLWV4cHJfYnVpbGRfdWNvbnN0YW50ICh2YWx1ZSkKLSAgICAgb2Zmc2V0VCB2YWx1ZTsKLXsKLSAgZXhwcmVzc2lvblMgZTsKLQotICBlLlhfb3AgPSBPX2NvbnN0YW50OwotICBlLlhfYWRkX251bWJlciA9IHZhbHVlOwotICBlLlhfdW5zaWduZWQgPSAxOwotICByZXR1cm4gbWFrZV9leHByX3N5bWJvbCAoJmUpOwotfQotCi0vKiBCdWlsZCBhbiBleHByZXNzaW9uIGZvciBPUCBzMS4gICovCi0KLXN5bWJvbFMgKgotZXhwcl9idWlsZF91bmFyeSAob3AsIHMxKQotICAgICBvcGVyYXRvclQgb3A7Ci0gICAgIHN5bWJvbFMgKnMxOwotewotICBleHByZXNzaW9uUyBlOwotCi0gIGUuWF9vcCA9IG9wOwotICBlLlhfYWRkX3N5bWJvbCA9IHMxOwotICBlLlhfYWRkX251bWJlciA9IDA7Ci0gIHJldHVybiBtYWtlX2V4cHJfc3ltYm9sICgmZSk7Ci19Ci0KLS8qIEJ1aWxkIGFuIGV4cHJlc3Npb24gZm9yIHMxIE9QIHMyLiAgKi8KLQotc3ltYm9sUyAqCi1leHByX2J1aWxkX2JpbmFyeSAob3AsIHMxLCBzMikKLSAgICAgb3BlcmF0b3JUIG9wOwotICAgICBzeW1ib2xTICpzMTsKLSAgICAgc3ltYm9sUyAqczI7Ci17Ci0gIGV4cHJlc3Npb25TIGU7Ci0KLSAgZS5YX29wID0gb3A7Ci0gIGUuWF9hZGRfc3ltYm9sID0gczE7Ci0gIGUuWF9vcF9zeW1ib2wgPSBzMjsKLSAgZS5YX2FkZF9udW1iZXIgPSAwOwotICByZXR1cm4gbWFrZV9leHByX3N5bWJvbCAoJmUpOwotfQotCi0vKiBCdWlsZCBhbiBleHByZXNzaW9uIGZvciB0aGUgY3VycmVudCBsb2NhdGlvbiAoJy4nKS4gICovCi0KLXN5bWJvbFMgKgotZXhwcl9idWlsZF9kb3QgKCkKLXsKLSAgZXhwcmVzc2lvblMgZTsKLQotICBjdXJyZW50X2xvY2F0aW9uICgmZSk7Ci0gIHJldHVybiBtYWtlX2V4cHJfc3ltYm9sICgmZSk7Ci19Ci0MCi0vKgotICogQnVpbGQgYW55IGZsb2F0aW5nLXBvaW50IGxpdGVyYWwgaGVyZS4KLSAqIEFsc28gYnVpbGQgYW55IGJpZ251bSBsaXRlcmFsIGhlcmUuCi0gKi8KLQotLyogU2VlbXMgYXRvZl9tYWNoaW5lIGNhbiBiYWNrc2NhbiB0aHJvdWdoIGdlbmVyaWNfYmlnbnVtIGFuZCBoaXQgd2hhdGV2ZXIKLSAgIGhhcHBlbnMgdG8gYmUgbG9hZGVkIGJlZm9yZSBpdCBpbiBtZW1vcnkuICBBbmQgaXRzIHdheSB0b28gY29tcGxpY2F0ZWQKLSAgIGZvciBtZSB0byBmaXggcmlnaHQuICBUaHVzIGEgaGFjay4gIEpGOiAgSnVzdCBtYWtlIGdlbmVyaWNfYmlnbnVtIGJpZ2dlciwKLSAgIGFuZCBuZXZlciB3cml0ZSBpbnRvIHRoZSBlYXJseSB3b3JkcywgdGh1cyB0aGV5J2xsIGFsd2F5cyBiZSB6ZXJvLgotICAgSSBoYXRlIERlYW4ncyBmbG9hdGluZy1wb2ludCBjb2RlLiAgQmxlaC4gICovCi1MSVRUTEVOVU1fVFlQRSBnZW5lcmljX2JpZ251bVtTSVpFX09GX0xBUkdFX05VTUJFUiArIDZdOwotRkxPTlVNX1RZUEUgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgPQotewotICAmZ2VuZXJpY19iaWdudW1bNl0sCQkvKiBsb3cgKEpGOiBXYXMgMCkgKi8KLSAgJmdlbmVyaWNfYmlnbnVtW1NJWkVfT0ZfTEFSR0VfTlVNQkVSICsgNiAtIDFdLCAvKiBoaWdoIEpGOiAoYWRkZWQgKzYpICovCi0gIDAsCQkJCS8qIGxlYWRlciAqLwotICAwLAkJCQkvKiBleHBvbmVudCAqLwotICAwCQkJCS8qIHNpZ24gKi8KLX07Ci0vKiBJZiBub256ZXJvLCB3ZSd2ZSBiZWVuIGFza2VkIHRvIGFzc2VtYmxlIG5hbiwgK2luZiBvciAtaW5mICovCi1pbnQgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9tYWdpYzsKLQwKLXN0YXRpYyB2b2lkCi1mbG9hdGluZ19jb25zdGFudCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgLyogaW5wdXRfbGluZV9wb2ludGVyLT4qLwotICAvKiBmbG9hdGluZy1wb2ludCBjb25zdGFudC4gKi8KLSAgaW50IGVycm9yX2NvZGU7Ci0KLSAgZXJyb3JfY29kZSA9IGF0b2ZfZ2VuZXJpYyAoJmlucHV0X2xpbmVfcG9pbnRlciwgIi4iLCBFWFBfQ0hBUlMsCi0JCQkgICAgICZnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcik7Ci0KLSAgaWYgKGVycm9yX2NvZGUpCi0gICAgewotICAgICAgaWYgKGVycm9yX2NvZGUgPT0gRVJST1JfRVhQT05FTlRfT1ZFUkZMT1cpCi0JewotCSAgYXNfYmFkIChfKCJiYWQgZmxvYXRpbmctcG9pbnQgY29uc3RhbnQ6IGV4cG9uZW50IG92ZXJmbG93LCBwcm9iYWJseSBhc3NlbWJsaW5nIGp1bmsiKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiYmFkIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50OiB1bmtub3duIGVycm9yIGNvZGU9JWQuIiksIGVycm9yX2NvZGUpOwotCX0KLSAgICB9Ci0gIGV4cHJlc3Npb25QLT5YX29wID0gT19iaWc7Ci0gIC8qIGlucHV0X2xpbmVfcG9pbnRlci0+anVzdCBhZnRlciBjb25zdGFudCwgKi8KLSAgLyogd2hpY2ggbWF5IHBvaW50IHRvIHdoaXRlc3BhY2UuICovCi0gIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAtMTsKLX0KLQotc3RhdGljIHZhbHVlVCAKLWdlbmVyaWNfYmlnbnVtX3RvX2ludDMyICgpIAotewotICB2YWx1ZVQgbnVtYmVyID0KLQkgICAoKGdlbmVyaWNfYmlnbnVtWzFdICYgTElUVExFTlVNX01BU0spIDw8IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkgICB8IChnZW5lcmljX2JpZ251bVswXSAmIExJVFRMRU5VTV9NQVNLKTsKLSAgbnVtYmVyICY9IDB4ZmZmZmZmZmY7Ci0gIHJldHVybiBudW1iZXI7Ci19Ci0KLSNpZmRlZiBCRkQ2NAotc3RhdGljIHZhbHVlVCAKLWdlbmVyaWNfYmlnbnVtX3RvX2ludDY0ICgpIAotewotICB2YWx1ZVQgbnVtYmVyID0gCi0JICAgKCgoKCgoKCh2YWx1ZVQpIGdlbmVyaWNfYmlnbnVtWzNdICYgTElUVExFTlVNX01BU0spCi0JCSA8PCBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JICAgICAgICB8ICgodmFsdWVUKSBnZW5lcmljX2JpZ251bVsyXSAmIExJVFRMRU5VTV9NQVNLKSkKLQkgICAgICAgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCSAgICAgIHwgKCh2YWx1ZVQpIGdlbmVyaWNfYmlnbnVtWzFdICYgTElUVExFTlVNX01BU0spKQotCSAgICAgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCSAgICB8ICgodmFsdWVUKSBnZW5lcmljX2JpZ251bVswXSAmIExJVFRMRU5VTV9NQVNLKSk7Ci0gIHJldHVybiBudW1iZXI7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQKLWludGVnZXJfY29uc3RhbnQgKHJhZGl4LCBleHByZXNzaW9uUCkKLSAgICAgaW50IHJhZGl4OwotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGNoYXIgKnN0YXJ0OwkJLyogc3RhcnQgb2YgbnVtYmVyLiAqLwotICBjaGFyICpzdWZmaXggPSBOVUxMOwotICBjaGFyIGM7Ci0gIHZhbHVlVCBudW1iZXI7CS8qIG9mZnNldCBvciAoYWJzb2x1dGUpIHZhbHVlICovCi0gIHNob3J0IGludCBkaWdpdDsJLyogdmFsdWUgb2YgbmV4dCBkaWdpdCBpbiBjdXJyZW50IHJhZGl4ICovCi0gIHNob3J0IGludCBtYXhkaWcgPSAwOy8qIGhpZ2hlc3QgcGVybWl0dGVkIGRpZ2l0IHZhbHVlLiAqLwotICBpbnQgdG9vX21hbnlfZGlnaXRzID0gMDsJLyogaWYgd2Ugc2VlID49IHRoaXMgbnVtYmVyIG9mICovCi0gIGNoYXIgKm5hbWU7CQkvKiBwb2ludHMgdG8gbmFtZSBvZiBzeW1ib2wgKi8KLSAgc3ltYm9sUyAqc3ltYm9sUDsJLyogcG9pbnRzIHRvIHN5bWJvbCAqLwotCi0gIGludCBzbWFsbDsJCQkvKiB0cnVlIGlmIGZpdHMgaW4gMzIgYml0cy4gKi8KLQotICAvKiBNYXkgYmUgYmlnbnVtLCBvciBtYXkgZml0IGluIDMyIGJpdHMuICovCi0gIC8qIE1vc3QgbnVtYmVycyBmaXQgaW50byAzMiBiaXRzLCBhbmQgd2Ugd2FudCB0aGlzIGNhc2UgdG8gYmUgZmFzdC4KLSAgICAgc28gd2UgcHJldGVuZCBpdCB3aWxsIGZpdCBpbnRvIDMyIGJpdHMuICBJZiwgYWZ0ZXIgbWFraW5nIHVwIGEgMzIKLSAgICAgYml0IG51bWJlciwgd2UgcmVhbGlzZSB0aGF0IHdlIGhhdmUgc2Nhbm5lZCBtb3JlIGRpZ2l0cyB0aGFuCi0gICAgIGNvbWZvcnRhYmx5IGZpdCBpbnRvIDMyIGJpdHMsIHdlIHJlLXNjYW4gdGhlIGRpZ2l0cyBjb2RpbmcgdGhlbQotICAgICBpbnRvIGEgYmlnbnVtLiAgRm9yIGRlY2ltYWwgYW5kIG9jdGFsIG51bWJlcnMgd2UgYXJlCi0gICAgIGNvbnNlcnZhdGl2ZTogU29tZSBudW1iZXJzIG1heSBiZSBhc3N1bWVkIGJpZ251bXMgd2hlbiBpbiBmYWN0Ci0gICAgIHRoZXkgZG8gZml0IGludG8gMzIgYml0cy4gIE51bWJlcnMgb2YgYW55IHJhZGl4IGNhbiBoYXZlIGV4Y2VzcwotICAgICBsZWFkaW5nIHplcm9zOiBXZSBzdHJpdmUgdG8gcmVjb2duaXNlIHRoaXMgYW5kIGNhc3QgdGhlbSBiYWNrCi0gICAgIGludG8gMzIgYml0cy4gIFdlIG11c3QgY2hlY2sgdGhhdCB0aGUgYmlnbnVtIHJlYWxseSBpcyBtb3JlIHRoYW4KLSAgICAgMzIgYml0cywgYW5kIGNoYW5nZSBpdCBiYWNrIHRvIGEgMzItYml0IG51bWJlciBpZiBpdCBmaXRzLiAgVGhlCi0gICAgIG51bWJlciB3ZSBhcmUgbG9va2luZyBmb3IgaXMgZXhwZWN0ZWQgdG8gYmUgcG9zaXRpdmUsIGJ1dCBpZiBpdAotICAgICBmaXRzIGludG8gMzIgYml0cyBhcyBhbiB1bnNpZ25lZCBudW1iZXIsIHdlIGxldCBpdCBiZSBhIDMyLWJpdAotICAgICBudW1iZXIuICBUaGUgY2F2YWxpZXIgYXBwcm9hY2ggaXMgZm9yIHNwZWVkIGluIG9yZGluYXJ5IGNhc2VzLiAqLwotICAvKiBUaGlzIGhhcyBiZWVuIGV4dGVuZGVkIGZvciA2NCBiaXRzLiAgV2UgYmxpbmRseSBhc3N1bWUgdGhhdCBpZgotICAgICB5b3UncmUgY29tcGlsaW5nIGluIDY0LWJpdCBtb2RlLCB0aGUgdGFyZ2V0IGlzIGEgNjQtYml0IG1hY2hpbmUuCi0gICAgIFRoaXMgc2hvdWxkIGJlIGNsZWFuZWQgdXAuICAqLwotCi0jaWZkZWYgQkZENjQKLSNkZWZpbmUgdmFsdWVzaXplIDY0Ci0jZWxzZSAvKiBpbmNsdWRlcyBub24tYmZkIGNhc2UsIG1vc3RseSAqLwotI2RlZmluZSB2YWx1ZXNpemUgMzIKLSNlbmRpZgotCi0gIGlmIChmbGFnX202OGtfbXJpICYmIHJhZGl4ID09IDApCi0gICAgewotICAgICAgaW50IGZsdCA9IDA7Ci0KLSAgICAgIC8qIEluIE1SSSBtb2RlLCB0aGUgbnVtYmVyIG1heSBoYXZlIGEgc3VmZml4IGluZGljYXRpbmcgdGhlCi0gICAgICAgICByYWRpeC4gIEZvciB0aGF0IG1hdHRlciwgaXQgbWlnaHQgYWN0dWFsbHkgYmUgYSBmbG9hdGluZwotICAgICAgICAgcG9pbnQgY29uc3RhbnQuICAqLwotICAgICAgZm9yIChzdWZmaXggPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpzdWZmaXgpOwotCSAgIHN1ZmZpeCsrKQotCXsKLQkgIGlmICgqc3VmZml4ID09ICdlJyB8fCAqc3VmZml4ID09ICdFJykKLQkgICAgZmx0ID0gMTsKLQl9Ci0KLSAgICAgIGlmIChzdWZmaXggPT0gaW5wdXRfbGluZV9wb2ludGVyKQotCXsKLQkgIHJhZGl4ID0gMTA7Ci0JICBzdWZmaXggPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjID0gKi0tc3VmZml4OwotCSAgaWYgKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSBjKSkKLQkgICAgYyA9IHRvdXBwZXIgKGMpOwotCSAgaWYgKGMgPT0gJ0InKQotCSAgICByYWRpeCA9IDI7Ci0JICBlbHNlIGlmIChjID09ICdEJykKLQkgICAgcmFkaXggPSAxMDsKLQkgIGVsc2UgaWYgKGMgPT0gJ08nIHx8IGMgPT0gJ1EnKQotCSAgICByYWRpeCA9IDg7Ci0JICBlbHNlIGlmIChjID09ICdIJykKLQkgICAgcmFkaXggPSAxNjsKLQkgIGVsc2UgaWYgKHN1ZmZpeFsxXSA9PSAnLicgfHwgYyA9PSAnRScgfHwgZmx0KQotCSAgICB7Ci0JICAgICAgZmxvYXRpbmdfY29uc3RhbnQgKGV4cHJlc3Npb25QKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJhZGl4ID0gMTA7Ci0JICAgICAgc3VmZml4ID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgc3dpdGNoIChyYWRpeCkKLSAgICB7Ci0gICAgY2FzZSAyOgotICAgICAgbWF4ZGlnID0gMjsKLSAgICAgIHRvb19tYW55X2RpZ2l0cyA9IHZhbHVlc2l6ZSArIDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICBtYXhkaWcgPSByYWRpeCA9IDg7Ci0gICAgICB0b29fbWFueV9kaWdpdHMgPSAodmFsdWVzaXplICsgMikgLyAzICsgMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBtYXhkaWcgPSByYWRpeCA9IDE2OwotICAgICAgdG9vX21hbnlfZGlnaXRzID0gKHZhbHVlc2l6ZSArIDMpIC8gNCArIDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEwOgotICAgICAgbWF4ZGlnID0gcmFkaXggPSAxMDsKLSAgICAgIHRvb19tYW55X2RpZ2l0cyA9ICh2YWx1ZXNpemUgKyAxMikgLyA0OyAvKiB2ZXJ5IHJvdWdoICovCi0gICAgfQotI3VuZGVmIHZhbHVlc2l6ZQotICBzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgZm9yIChudW1iZXIgPSAwOwotICAgICAgIChkaWdpdCA9IGhleF92YWx1ZSAoYykpIDwgbWF4ZGlnOwotICAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspCi0gICAgewotICAgICAgbnVtYmVyID0gbnVtYmVyICogcmFkaXggKyBkaWdpdDsKLSAgICB9Ci0gIC8qIGMgY29udGFpbnMgY2hhcmFjdGVyIGFmdGVyIG51bWJlci4gKi8KLSAgLyogaW5wdXRfbGluZV9wb2ludGVyLT5jaGFyIGFmdGVyIGMuICovCi0gIHNtYWxsID0gKGlucHV0X2xpbmVfcG9pbnRlciAtIHN0YXJ0IC0gMSkgPCB0b29fbWFueV9kaWdpdHM7Ci0KLSAgaWYgKHJhZGl4ID09IDE2ICYmIGMgPT0gJ18nKSAKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGxpdGVyYWwgb2YgdGhlIGZvcm0gMHgzMzNfMF8xMjM0NTY3OF8xLgotICAgICAgICAgVGhpcyBleGFtcGxlIGlzIGVxdWl2YWxlbnQgdG8gMHgwMDAwMDMzMzAwMDAwMDAwMTIzNDU2NzgwMDAwMDAwMS4gICovCi0KLSAgICAgIGludCBudW1fbGl0dGxlX2RpZ2l0cyA9IDA7Ci0gICAgICBpbnQgaTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OwkvKi0+MXN0IGRpZ2l0LiAqLwotCi0gICAgICBrbm93IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgPT0gMTYpOwotCi0gICAgICBmb3IgKGMgPSAnXyc7IGMgPT0gJ18nOyBudW1fbGl0dGxlX2RpZ2l0cys9MikKLQl7Ci0KLQkgIC8qIENvbnZlcnQgb25lIDY0LWJpdCB3b3JkLiAqLwotCSAgaW50IG5kaWdpdCA9IDA7IAotCSAgbnVtYmVyID0gMDsKLQkgIGZvciAoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgICAgKGRpZ2l0ID0gaGV4X3ZhbHVlIChjKSkgPCBtYXhkaWc7Ci0JICAgICAgIGMgPSAqKGlucHV0X2xpbmVfcG9pbnRlcisrKSkKLQkgICAgewotCSAgICAgIG51bWJlciA9IG51bWJlciAqIHJhZGl4ICsgZGlnaXQ7Ci0JICAgICAgbmRpZ2l0Kys7Ci0JICAgIH0KLQotCSAgLyogQ2hlY2sgZm9yIDggZGlnaXQgcGVyIHdvcmQgbWF4LiAgKi8KLQkgIGlmIChuZGlnaXQgPiA4KSAKLQkgICAgYXNfYmFkIChfKCJBIGJpZ251bSB3aXRoIHVuZGVyc2NvcmVzIG1heSBub3QgaGF2ZSBtb3JlIHRoYW4gOCBoZXggZGlnaXRzIGluIGFueSB3b3JkLiIpKTsKLQotCSAgLyogQWRkIHRoaXMgY2h1bmsgdG8gdGhlIGJpZ251bS4gIFNoaWZ0IHRoaW5ncyBkb3duIDIgbGl0dGxlIGRpZ2l0cy4qLwotCSAga25vdyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTID09IDE2KTsKLQkgIGZvciAoaSA9IG1pbiAobnVtX2xpdHRsZV9kaWdpdHMgKyAxLCBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDEpOyBpID49IDI7IGktLSkKLQkgICAgZ2VuZXJpY19iaWdudW1baV0gPSBnZW5lcmljX2JpZ251bVtpLTJdOwotCi0JICAvKiBBZGQgdGhlIG5ldyBkaWdpdHMgYXMgdGhlIGxlYXN0IHNpZ25pZmljYW50IG5ldyBvbmVzLiAqLwotCSAgZ2VuZXJpY19iaWdudW1bMF0gPSBudW1iZXIgJiAweGZmZmZmZmZmOwotCSAgZ2VuZXJpY19iaWdudW1bMV0gPSBudW1iZXIgPj4gMTY7Ci0JfQotCi0gICAgICAvKiBBZ2FpbiwgYyBpcyBjaGFyIGFmdGVyIG51bWJlciwgaW5wdXRfbGluZV9wb2ludGVyLT5hZnRlciBjLiAqLwotCi0gICAgICBpZiAobnVtX2xpdHRsZV9kaWdpdHMgPiBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDEpCi0JbnVtX2xpdHRsZV9kaWdpdHMgPSBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDE7Ci0KLSAgICAgIGFzc2VydCAobnVtX2xpdHRsZV9kaWdpdHMgPj0gNCk7Ci0KLSAgICAgIGlmIChudW1fbGl0dGxlX2RpZ2l0cyAhPSA4KQotCWFzX2JhZCAoXygiQSBiaWdudW0gd2l0aCB1bmRlcnNjb3JlcyBtdXN0IGhhdmUgZXhhY3RseSA0IHdvcmRzLiIpKTsKLQotICAgICAgLyogV2UgbWlnaHQgaGF2ZSBzb21lIGxlYWRpbmcgemVyb3MuICBUaGVzZSBjYW4gYmUgdHJpbW1lZCB0byBnaXZlCi0gICAgICAgKiB1cyBhIGNoYW5nZSB0byBmaXQgdGhpcyBjb25zdGFudCBpbnRvIGEgc21hbGwgbnVtYmVyLgotICAgICAgICovCi0gICAgICB3aGlsZSAoZ2VuZXJpY19iaWdudW1bbnVtX2xpdHRsZV9kaWdpdHMtMV0gPT0gMCAmJiBudW1fbGl0dGxlX2RpZ2l0cyA+IDEpCi0JbnVtX2xpdHRsZV9kaWdpdHMtLTsKLQkKLSAgICAgIGlmIChudW1fbGl0dGxlX2RpZ2l0cyA8PSAyKQotCXsKLQkgIC8qIHdpbGwgZml0IGludG8gMzIgYml0cy4gKi8KLQkgIG51bWJlciA9IGdlbmVyaWNfYmlnbnVtX3RvX2ludDMyICgpOwotCSAgc21hbGwgPSAxOwotCX0KLSNpZmRlZiBCRkQ2NAotICAgICAgZWxzZSBpZiAobnVtX2xpdHRsZV9kaWdpdHMgPD0gNCkKLQl7Ci0JICAvKiBXaWxsIGZpdCBpbnRvIDY0IGJpdHMuICAqLwotCSAgbnVtYmVyID0gZ2VuZXJpY19iaWdudW1fdG9faW50NjQgKCk7Ci0JICBzbWFsbCA9IDE7Ci0JfQotI2VuZGlmCi0gICAgICBlbHNlCi0JewotCSAgc21hbGwgPSAwOwotCSAgbnVtYmVyID0gbnVtX2xpdHRsZV9kaWdpdHM7IC8qIG51bWJlciBvZiBsaXR0bGVudW1zIGluIHRoZSBiaWdudW0uICovCi0JfQotICAgIH0KLSAgZWxzZSBpZiAoIXNtYWxsKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiB3ZSBzYXcgYSBsb3Qgb2YgZGlnaXRzLiBtYW51ZmFjdHVyZSBhIGJpZ251bSB0aGUgaGFyZCB3YXkuCi0gICAgICAgKi8KLSAgICAgIExJVFRMRU5VTV9UWVBFICpsZWFkZXI7CS8qLT5oaWdoIG9yZGVyIGxpdHRsZW51bSBvZiB0aGUgYmlnbnVtLiAqLwotICAgICAgTElUVExFTlVNX1RZUEUgKnBvaW50ZXI7CS8qLT5saXR0bGVudW0gd2UgYXJlIGZyb2JiaW5nIG5vdy4gKi8KLSAgICAgIGxvbmcgY2Fycnk7Ci0KLSAgICAgIGxlYWRlciA9IGdlbmVyaWNfYmlnbnVtOwotICAgICAgZ2VuZXJpY19iaWdudW1bMF0gPSAwOwotICAgICAgZ2VuZXJpY19iaWdudW1bMV0gPSAwOwotICAgICAgZ2VuZXJpY19iaWdudW1bMl0gPSAwOwotICAgICAgZ2VuZXJpY19iaWdudW1bM10gPSAwOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7CS8qLT4xc3QgZGlnaXQuICovCi0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgZm9yICg7Ci0JICAgKGNhcnJ5ID0gaGV4X3ZhbHVlIChjKSkgPCBtYXhkaWc7Ci0JICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykKLQl7Ci0JICBmb3IgKHBvaW50ZXIgPSBnZW5lcmljX2JpZ251bTsKLQkgICAgICAgcG9pbnRlciA8PSBsZWFkZXI7Ci0JICAgICAgIHBvaW50ZXIrKykKLQkgICAgewotCSAgICAgIGxvbmcgd29yazsKLQotCSAgICAgIHdvcmsgPSBjYXJyeSArIHJhZGl4ICogKnBvaW50ZXI7Ci0JICAgICAgKnBvaW50ZXIgPSB3b3JrICYgTElUVExFTlVNX01BU0s7Ci0JICAgICAgY2FycnkgPSB3b3JrID4+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgICAgfQotCSAgaWYgKGNhcnJ5KQotCSAgICB7Ci0JICAgICAgaWYgKGxlYWRlciA8IGdlbmVyaWNfYmlnbnVtICsgU0laRV9PRl9MQVJHRV9OVU1CRVIgLSAxKQotCQl7Ci0JCSAgLyogcm9vbSB0byBncm93IGEgbG9uZ2VyIGJpZ251bS4gKi8KLQkJICAqKytsZWFkZXIgPSBjYXJyeTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgLyogYWdhaW4sIGMgaXMgY2hhciBhZnRlciBudW1iZXIsICovCi0gICAgICAvKiBpbnB1dF9saW5lX3BvaW50ZXItPmFmdGVyIGMuICovCi0gICAgICBrbm93IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgPT0gMTYpOwotICAgICAgaWYgKGxlYWRlciA8IGdlbmVyaWNfYmlnbnVtICsgMikKLQl7Ci0JICAvKiB3aWxsIGZpdCBpbnRvIDMyIGJpdHMuICovCi0JICBudW1iZXIgPSBnZW5lcmljX2JpZ251bV90b19pbnQzMiAoKTsKLQkgIHNtYWxsID0gMTsKLQl9Ci0jaWZkZWYgQkZENjQKLSAgICAgIGVsc2UgaWYgKGxlYWRlciA8IGdlbmVyaWNfYmlnbnVtICsgNCkKLQl7Ci0JICAvKiBXaWxsIGZpdCBpbnRvIDY0IGJpdHMuICAqLwotCSAgbnVtYmVyID0gZ2VuZXJpY19iaWdudW1fdG9faW50NjQgKCk7Ci0JICBzbWFsbCA9IDE7Ci0JfQotI2VuZGlmCi0gICAgICBlbHNlCi0JewotCSAgbnVtYmVyID0gbGVhZGVyIC0gZ2VuZXJpY19iaWdudW0gKyAxOwkvKiBudW1iZXIgb2YgbGl0dGxlbnVtcyBpbiB0aGUgYmlnbnVtLiAqLwotCX0KLSAgICB9Ci0KLSAgaWYgKGZsYWdfbTY4a19tcmkgJiYgc3VmZml4ICE9IE5VTEwgJiYgaW5wdXRfbGluZV9wb2ludGVyIC0gMSA9PSBzdWZmaXgpCi0gICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotICBpZiAoc21hbGwpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIGhlcmUgd2l0aCBudW1iZXIsIGluIGNvcnJlY3QgcmFkaXguIGMgaXMgdGhlIG5leHQgY2hhci4KLSAgICAgICAqIG5vdGUgdGhhdCB1bmxpa2UgdW4qeCwgd2UgYWxsb3cgIjAxMWYiICIweDlmIiB0bwotICAgICAgICogYm90aCBtZWFuIHRoZSBzYW1lIGFzIHRoZSAoY29udmVudGlvbmFsKSAiOWYiLiB0aGlzIGlzIHNpbXBseSBlYXNpZXIKLSAgICAgICAqIHRoYW4gY2hlY2tpbmcgZm9yIHN0cmljdCBjYW5vbmljYWwgZm9ybS4gc3ludGF4IHN1eCEKLSAgICAgICAqLwotCi0gICAgICBpZiAoTE9DQUxfTEFCRUxTX0ZCICYmIGMgPT0gJ2InKQotCXsKLQkgIC8qCi0JICAgKiBiYWNrd2FyZCByZWYgdG8gbG9jYWwgbGFiZWwuCi0JICAgKiBiZWNhdXNlIGl0IGlzIGJhY2t3YXJkLCBleHBlY3QgaXQgdG8gYmUgZGVmaW5lZC4KLQkgICAqLwotCSAgLyogQ29uc3RydWN0IGEgbG9jYWwgbGFiZWwuICAqLwotCSAgbmFtZSA9IGZiX2xhYmVsX25hbWUgKChpbnQpIG51bWJlciwgMCk7Ci0KLQkgIC8qIHNlZW4gYmVmb3JlLCBvciBzeW1ib2wgaXMgZGVmaW5lZDogb2sgKi8KLQkgIHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0JICBpZiAoKHN5bWJvbFAgIT0gTlVMTCkgJiYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkpKQotCSAgICB7Ci0JICAgICAgLyogbG9jYWwgbGFiZWxzIGFyZSBuZXZlciBhYnNvbHV0ZS4gZG9uJ3Qgd2FzdGUgdGltZQotCQkgY2hlY2tpbmcgYWJzb2x1dGVuZXNzLiAqLwotCSAgICAgIGtub3cgKFNFR19OT1JNQUwgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApKSk7Ci0KLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xQOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBlaXRoZXIgbm90IHNlZW4gb3Igbm90IGRlZmluZWQuICovCi0JICAgICAgLyogQEAgU2hvdWxkIHByaW50IG91dCB0aGUgb3JpZ2luYWwgc3RyaW5nIGluc3RlYWQgb2YKLQkJIHRoZSBwYXJzZWQgbnVtYmVyLiAgKi8KLQkgICAgICBhc19iYWQgKF8oImJhY2t3LiByZWYgdG8gdW5rbm93biBsYWJlbCBcIiVkOlwiLCAwIGFzc3VtZWQuIiksCi0JCSAgICAgIChpbnQpIG51bWJlcik7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICB9Ci0KLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotCX0JCQkvKiBjYXNlICdiJyAqLwotICAgICAgZWxzZSBpZiAoTE9DQUxfTEFCRUxTX0ZCICYmIGMgPT0gJ2YnKQotCXsKLQkgIC8qCi0JICAgKiBmb3J3YXJkIHJlZmVyZW5jZS4gZXhwZWN0IHN5bWJvbCB0byBiZSB1bmRlZmluZWQgb3IKLQkgICAqIHVua25vd24uIHVuZGVmaW5lZDogc2VlbiBpdCBiZWZvcmUuIHVua25vd246IG5ldmVyIHNlZW4KLQkgICAqIGl0IGJlZm9yZS4KLQkgICAqIGNvbnN0cnVjdCBhIGxvY2FsIGxhYmVsIG5hbWUsIHRoZW4gYW4gdW5kZWZpbmVkIHN5bWJvbC4KLQkgICAqIGRvbid0IGNyZWF0ZSBhIHhzZWcgZnJhZyBmb3IgaXQ6IGNhbGxlciBtYXkgZG8gdGhhdC4KLQkgICAqIGp1c3QgcmV0dXJuIGl0IGFzIG5ldmVyIHNlZW4gYmVmb3JlLgotCSAgICovCi0JICBuYW1lID0gZmJfbGFiZWxfbmFtZSAoKGludCkgbnVtYmVyLCAxKTsKLQkgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQkgIC8qIHdlIGhhdmUgbm8gbmVlZCB0byBjaGVjayBzeW1ib2wgcHJvcGVydGllcy4gKi8KLSNpZm5kZWYgbWFueV9zZWdtZW50cwotCSAgLyogc2luY2UgImtub3ciIHB1dHMgaXRzIGFyZyBpbnRvIGEgInN0cmluZyIsIHdlCi0JICAgICBjYW4ndCBoYXZlIG5ld2xpbmVzIGluIHRoZSBhcmd1bWVudC4gICovCi0JICBrbm93IChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSB1bmRlZmluZWRfc2VjdGlvbiB8fCBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSB0ZXh0X3NlY3Rpb24gfHwgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gZGF0YV9zZWN0aW9uKTsKLSNlbmRpZgotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3N5bWJvbDsKLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xQOwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0JfQkJCS8qIGNhc2UgJ2YnICovCi0gICAgICBlbHNlIGlmIChMT0NBTF9MQUJFTFNfRE9MTEFSICYmIGMgPT0gJyQnKQotCXsKLQkgIC8qIElmIHRoZSBkb2xsYXIgbGFiZWwgaXMgKmN1cnJlbnRseSogZGVmaW5lZCwgdGhlbiB0aGlzIGlzIGp1c3QKLQkgICAgIGFub3RoZXIgcmVmZXJlbmNlIHRvIGl0LiAgSWYgaXQgaXMgbm90ICpjdXJyZW50bHkqIGRlZmluZWQsCi0JICAgICB0aGVuIHRoaXMgaXMgYSBmcmVzaCBpbnN0YW50aWF0aW9uIG9mIHRoYXQgbnVtYmVyLCBzbyBjcmVhdGUKLQkgICAgIGl0LiAgKi8KLQotCSAgaWYgKGRvbGxhcl9sYWJlbF9kZWZpbmVkICgobG9uZykgbnVtYmVyKSkKLQkgICAgewotCSAgICAgIG5hbWUgPSBkb2xsYXJfbGFiZWxfbmFtZSAoKGxvbmcpIG51bWJlciwgMCk7Ci0JICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKTsKLQkgICAgICBrbm93IChzeW1ib2xQICE9IE5VTEwpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gZG9sbGFyX2xhYmVsX25hbWUgKChsb25nKSBudW1iZXIsIDEpOwotCSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQkgICAgfQotCi0JICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IHN5bWJvbFA7Ci0JICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQl9CQkJLyogY2FzZSAnJCcgKi8KLSAgICAgIGVsc2UKLQl7Ci0JICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0jaWZkZWYgVEFSR0VUX1dPUkRfU0laRQotCSAgLyogU2lnbiBleHRlbmQgTlVNQkVSLiAgKi8KLQkgIG51bWJlciB8PSAoLShudW1iZXIgPj4gKFRBUkdFVF9XT1JEX1NJWkUgLSAxKSkpIDw8IChUQVJHRVRfV09SRF9TSVpFIC0gMSk7Ci0jZW5kaWYKLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSBudW1iZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXItLTsJLyogcmVzdG9yZSBmb2xsb3dpbmcgY2hhcmFjdGVyLiAqLwotCX0JCQkvKiByZWFsbHkganVzdCBhIG51bWJlciAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIG5vdCBhIHNtYWxsIG51bWJlciAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2JpZzsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSBudW1iZXI7CS8qIG51bWJlciBvZiBsaXR0bGVudW1zICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXItLTsJLyotPmNoYXIgZm9sbG93aW5nIG51bWJlci4gKi8KLSAgICB9Ci19Ci0KLS8qIFBhcnNlIGFuIE1SSSBtdWx0aSBjaGFyYWN0ZXIgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgdm9pZAotbXJpX2NoYXJfY29uc3RhbnQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCBpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycKLSAgICAgICYmIGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnXCcnKQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBJbiBvcmRlciB0byBnZXQgdGhlIGNvcnJlY3QgYnl0ZSBvcmRlcmluZywgd2UgbXVzdCBidWlsZCB0aGUKLSAgICAgbnVtYmVyIGluIHJldmVyc2UuICAqLwotICBmb3IgKGkgPSBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIGludCBqOwotCi0gICAgICBnZW5lcmljX2JpZ251bVtpXSA9IDA7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgQ0hBUlNfUEVSX0xJVFRMRU5VTTsgaisrKQotCXsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycpCi0JICAgIHsKLQkgICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICdcJycpCi0JCWJyZWFrOwotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICB9Ci0JICBnZW5lcmljX2JpZ251bVtpXSA8PD0gODsKLQkgIGdlbmVyaWNfYmlnbnVtW2ldICs9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0KLSAgICAgIGlmIChpIDwgU0laRV9PRl9MQVJHRV9OVU1CRVIgLSAxKQotCXsKLQkgIC8qIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgbGl0dGxlbnVtLCBsZWZ0IGp1c3RpZnkgdGhlCi0gICAgICAgICAgICAgbGFzdCBvbmUgdG8gbWFrZSBpdCBtYXRjaCB0aGUgZWFybGllciBvbmVzLiAgSWYgdGhlcmUgaXMKLSAgICAgICAgICAgICBvbmx5IG9uZSwgd2UgY2FuIGp1c3QgdXNlIHRoZSB2YWx1ZSBkaXJlY3RseS4gICovCi0JICBmb3IgKDsgaiA8IENIQVJTX1BFUl9MSVRUTEVOVU07IGorKykKLQkgICAgZ2VuZXJpY19iaWdudW1baV0gPDw9IDg7Ci0JfQotCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCcnCi0JICAmJiBpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJ1wnJykKLQlicmVhazsKLSAgICB9Ci0KLSAgaWYgKGkgPCAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiQ2hhcmFjdGVyIGNvbnN0YW50IHRvbyBsYXJnZSIpKTsKLSAgICAgIGkgPSAwOwotICAgIH0KLQotICBpZiAoaSA+IDApCi0gICAgewotICAgICAgaW50IGM7Ci0gICAgICBpbnQgajsKLQotICAgICAgYyA9IFNJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gaTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBjOyBqKyspCi0JZ2VuZXJpY19iaWdudW1bal0gPSBnZW5lcmljX2JpZ251bVtpICsgal07Ci0gICAgICBpID0gYzsKLSAgICB9Ci0KLSAga25vdyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTID09IDE2KTsKLSAgaWYgKGkgPiAyKQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19iaWc7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gaTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBpZiAoaSA8IDIpCi0JZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IGdlbmVyaWNfYmlnbnVtWzBdICYgTElUVExFTlVNX01BU0s7Ci0gICAgICBlbHNlCi0JZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9Ci0JICAoKChnZW5lcmljX2JpZ251bVsxXSAmIExJVFRMRU5VTV9NQVNLKQotCSAgICA8PCBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JICAgfCAoZ2VuZXJpY19iaWdudW1bMF0gJiBMSVRUTEVOVU1fTUFTSykpOwotICAgIH0KLQotICAvKiBTa2lwIHRoZSBmaW5hbCBjbG9zaW5nIHF1b3RlLiAgKi8KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci19Ci0KLS8qIFJldHVybiBhbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBsb2NhdGlvbi4gIFRoaXMKLSAgIGhhbmRsZXMgdGhlIG1hZ2ljIHN5bWJvbCBgLicuICAqLwotCi1zdGF0aWMgdm9pZAotY3VycmVudF9sb2NhdGlvbiAoZXhwcmVzc2lvbnApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9ucDsKLXsKLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICB7Ci0gICAgICBleHByZXNzaW9ucC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHByZXNzaW9ucC0+WF9hZGRfbnVtYmVyID0gYWJzX3NlY3Rpb25fb2Zmc2V0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5bWJvbHA7Ci0KLSAgICAgIHN5bWJvbHAgPSBzeW1ib2xfbmV3IChGQUtFX0xBQkVMX05BTUUsIG5vd19zZWcsCi0JCQkgICAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkJICAgIGZyYWdfbm93KTsKLSAgICAgIGV4cHJlc3Npb25wLT5YX29wID0gT19zeW1ib2w7Ci0gICAgICBleHByZXNzaW9ucC0+WF9hZGRfc3ltYm9sID0gc3ltYm9scDsKLSAgICAgIGV4cHJlc3Npb25wLT5YX2FkZF9udW1iZXIgPSAwOwotICAgIH0KLX0KLQotLyoKLSAqIFN1bW1hcnkgb2Ygb3BlcmFuZCgpLgotICoKLSAqIGluOglJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQsIHdoaWNoIG1heQotICoJYmUgYSBzcGFjZS4KLSAqCi0gKiBvdXQ6CUEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGVtcHR5OiBpbiB0aGlzIGNhc2UgWF9vcCA9PSBPX2Fic2VudC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQuCi0gKi8KLQotc3RhdGljIHNlZ1QKLW9wZXJhbmQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGNoYXIgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsJLyogcG9pbnRzIHRvIHN5bWJvbCAqLwotICBjaGFyICpuYW1lOwkJLyogcG9pbnRzIHRvIG5hbWUgb2Ygc3ltYm9sICovCi0gIHNlZ1Qgc2VnbWVudDsKLQotICAvKiBBbGwgaW50ZWdlcnMgYXJlIHJlZ2FyZGVkIGFzIHVuc2lnbmVkIHVubGVzcyB0aGV5IGFyZSBuZWdhdGVkLgotICAgICBUaGlzIGlzIGJlY2F1c2UgdGhlIG9ubHkgdGhpbmcgd2hpY2ggY2FyZXMgd2hldGhlciBhIG51bWJlciBpcwotICAgICB1bnNpZ25lZCBpcyB0aGUgY29kZSBpbiBlbWl0X2V4cHIgd2hpY2ggZXh0ZW5kcyBjb25zdGFudHMgaW50bwotICAgICBiaWdudW1zLiAgSXQgc2hvdWxkIG9ubHkgc2lnbiBleHRlbmQgbmVnYXRpdmUgbnVtYmVycywgc28gdGhhdAotICAgICBzb21ldGhpbmcgbGlrZSBgYC5xdWFkIDB4ODAwMDAwMDAnJyBpcyBub3Qgc2lnbiBleHRlbmRlZCBldmVuCi0gICAgIHRob3VnaCBpdCBhcHBlYXJzIG5lZ2F0aXZlIGlmIHZhbHVlVCBpcyAzMiBiaXRzLiAgKi8KLSAgZXhwcmVzc2lvblAtPlhfdW5zaWduZWQgPSAxOwotCi0gIC8qIGRpZ2l0cywgYXNzdW1lIGl0IGlzIGEgYmlnbnVtLiAqLwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsJCS8qIGxlYWRpbmcgd2hpdGVzcGFjZSBpcyBwYXJ0IG9mIG9wZXJhbmQuICovCi0gIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7CS8qIGlucHV0X2xpbmVfcG9pbnRlci0+cGFzdCBjaGFyIGluIGMuICovCi0KLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICcxJzoKLSAgICBjYXNlICcyJzoKLSAgICBjYXNlICczJzoKLSAgICBjYXNlICc0JzoKLSAgICBjYXNlICc1JzoKLSAgICBjYXNlICc2JzoKLSAgICBjYXNlICc3JzoKLSAgICBjYXNlICc4JzoKLSAgICBjYXNlICc5JzoKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotCi0gICAgICBpbnRlZ2VyX2NvbnN0YW50IChmbGFnX202OGtfbXJpID8gMCA6IDEwLCBleHByZXNzaW9uUCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzAnOgotICAgICAgLyogbm9uLWRlY2ltYWwgcmFkaXggKi8KLQotICAgICAgaWYgKGZsYWdfbTY4a19tcmkpCi0JewotCSAgY2hhciAqczsKLQotCSAgLyogQ2hlY2sgZm9yIGEgaGV4IGNvbnN0YW50LiAgKi8KLQkgIGZvciAocyA9IGlucHV0X2xpbmVfcG9pbnRlcjsgaGV4X3AgKCpzKTsgcysrKQotCSAgICA7Ci0JICBpZiAoKnMgPT0gJ2gnIHx8ICpzID09ICdIJykKLQkgICAgewotCSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGludGVnZXJfY29uc3RhbnQgKDAsIGV4cHJlc3Npb25QKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJ28nOgotCWNhc2UgJ08nOgotCWNhc2UgJ3EnOgotCWNhc2UgJ1EnOgotCWNhc2UgJzgnOgotCWNhc2UgJzknOgotCSAgaWYgKGZsYWdfbTY4a19tcmkpCi0JICAgIHsKLQkgICAgICBpbnRlZ2VyX2NvbnN0YW50ICgwLCBleHByZXNzaW9uUCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JZGVmYXVsdDoKLQlkZWZhdWx0X2Nhc2U6Ci0JICBpZiAoYyAmJiBzdHJjaHIgKEZMVF9DSEFSUywgYykpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgICBmbG9hdGluZ19jb25zdGFudCAoZXhwcmVzc2lvblApOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPQotCQktIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgYykgPyB0b2xvd2VyIChjKSA6IGMpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGUgc3RyaW5nIHdhcyBvbmx5IHplcm8gKi8KLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlICd4JzoKLQljYXNlICdYJzoKLQkgIGlmIChmbGFnX202OGtfbXJpKQotCSAgICBnb3RvIGRlZmF1bHRfY2FzZTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgaW50ZWdlcl9jb25zdGFudCAoMTYsIGV4cHJlc3Npb25QKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYic6Ci0JICBpZiAoTE9DQUxfTEFCRUxTX0ZCICYmICEgZmxhZ19tNjhrX21yaSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgY29kZSB1c2VkIHRvIGNoZWNrIGZvciAnKycgYW5kICctJyBoZXJlLCBhbmQsIGluCi0JCSBzb21lIGNvbmRpdGlvbnMsIGZhbGwgdGhyb3VnaCB0byBjYWxsCi0JCSBpbnRlZ2VyX2NvbnN0YW50LiAgSG93ZXZlciwgdGhhdCBkaWRuJ3QgbWFrZSBzZW5zZSwKLQkJIGFzIGludGVnZXJfY29uc3RhbnQgb25seSBhY2NlcHRzIGRpZ2l0cy4gICovCi0JICAgICAgLyogU29tZSBvZiBvdXIgY29kZSBlbHNld2hlcmUgZG9lcyBwZXJtaXQgZGlnaXRzIGdyZWF0ZXIKLQkJIHRoYW4gdGhlIGV4cGVjdGVkIGJhc2U7IGZvciBjb25zaXN0ZW5jeSwgZG8gdGhlIHNhbWUKLQkJIGhlcmUuICAqLwotCSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gPCAnMCcKLQkJICB8fCBpbnB1dF9saW5lX3BvaW50ZXJbMV0gPiAnOScpCi0JCXsKLQkJICAvKiBQYXJzZSB0aGlzIGFzIGEgYmFjayByZWZlcmVuY2UgdG8gbGFiZWwgMC4gICovCi0JCSAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0JCSAgaW50ZWdlcl9jb25zdGFudCAoMTAsIGV4cHJlc3Npb25QKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIC8qIE90aGVyd2lzZSwgcGFyc2UgdGhpcyBhcyBhIGJpbmFyeSBudW1iZXIuICAqLwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgJ0InOgotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBpZiAoZmxhZ19tNjhrX21yaSkKLQkgICAgZ290byBkZWZhdWx0X2Nhc2U7Ci0JICBpbnRlZ2VyX2NvbnN0YW50ICgyLCBleHByZXNzaW9uUCk7Ci0JICBicmVhazsKLQotCWNhc2UgJzAnOgotCWNhc2UgJzEnOgotCWNhc2UgJzInOgotCWNhc2UgJzMnOgotCWNhc2UgJzQnOgotCWNhc2UgJzUnOgotCWNhc2UgJzYnOgotCWNhc2UgJzcnOgotCSAgaW50ZWdlcl9jb25zdGFudCAoZmxhZ19tNjhrX21yaSA/IDAgOiA4LCBleHByZXNzaW9uUCk7Ci0JICBicmVhazsKLQotCWNhc2UgJ2YnOgotCSAgaWYgKExPQ0FMX0xBQkVMU19GQikKLQkgICAgewotCSAgICAgIC8qIElmIGl0IHNheXMgIjBmIiBhbmQgaXQgY291bGQgcG9zc2libHkgYmUgYSBmbG9hdGluZyBwb2ludAotCQkgbnVtYmVyLCBtYWtlIGl0IG9uZS4gIE90aGVyd2lzZSwgbWFrZSBpdCBhIGxvY2FsIGxhYmVsLAotCQkgYW5kIHRyeSB0byBkZWFsIHdpdGggcGFyc2luZyB0aGUgcmVzdCBsYXRlci4gICovCi0JICAgICAgaWYgKCFpbnB1dF9saW5lX3BvaW50ZXJbMV0KLQkJICB8fCAoaXNfZW5kX29mX2xpbmVbMHhmZiAmIGlucHV0X2xpbmVfcG9pbnRlclsxXV0pKQotCQlnb3RvIGlzXzBmX2xhYmVsOwotCSAgICAgIHsKLQkJY2hhciAqY3AgPSBpbnB1dF9saW5lX3BvaW50ZXIgKyAxOwotCQlpbnQgciA9IGF0b2ZfZ2VuZXJpYyAoJmNwLCAiLiIsIEVYUF9DSEFSUywKLQkJCQkgICAgICAmZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIpOwotCQlzd2l0Y2ggKHIpCi0JCSAgewotCQkgIGNhc2UgMDoKLQkJICBjYXNlIEVSUk9SX0VYUE9ORU5UX09WRVJGTE9XOgotCQkgICAgaWYgKCpjcCA9PSAnZicgfHwgKmNwID09ICdiJykKLQkJICAgICAgLyogbG9va3MgbGlrZSBhIGRpZmZlcmVuY2UgZXhwcmVzc2lvbiAqLwotCQkgICAgICBnb3RvIGlzXzBmX2xhYmVsOwotCQkgICAgZWxzZSBpZiAoY3AgPT0gaW5wdXRfbGluZV9wb2ludGVyICsgMSkKLQkJICAgICAgLyogTm8gY2hhcmFjdGVycyBoYXMgYmVlbiBhY2NlcHRlZCAtLSBsb29rcyBsaWtlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZW5kIG9mIG9wZXJhbmQuICovCi0JCSAgICAgIGdvdG8gaXNfMGZfbGFiZWw7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGdvdG8gaXNfMGZfZmxvYXQ7Ci0JCSAgZGVmYXVsdDoKLQkJICAgIGFzX2ZhdGFsIChfKCJleHByLmMob3BlcmFuZCk6IGJhZCBhdG9mX2dlbmVyaWMgcmV0dXJuIHZhbCAlZCIpLAotCQkJICAgICAgcik7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICAgIC8qIE9rYXksIG5vdyB3ZSd2ZSBzb3J0ZWQgaXQgb3V0LiAgV2UgcmVzdW1lIGF0IG9uZSBvZiB0aGVzZQotCQkgdHdvIGxhYmVscywgZGVwZW5kaW5nIG9uIHdoYXQgd2UndmUgZGVjaWRlZCB3ZSdyZSBwcm9iYWJseQotCQkgbG9va2luZyBhdC4gICovCi0JICAgIGlzXzBmX2xhYmVsOgotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotCSAgICAgIGludGVnZXJfY29uc3RhbnQgKDEwLCBleHByZXNzaW9uUCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgaXNfMGZfZmxvYXQ6Ci0JICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0JICAgICAgOwotCSAgICB9Ci0KLQljYXNlICdkJzoKLQljYXNlICdEJzoKLQkgIGlmIChmbGFnX202OGtfbXJpKQotCSAgICB7Ci0JICAgICAgaW50ZWdlcl9jb25zdGFudCAoMCwgZXhwcmVzc2lvblApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgJ0YnOgotCWNhc2UgJ3InOgotCWNhc2UgJ2UnOgotCWNhc2UgJ0UnOgotCWNhc2UgJ2cnOgotCWNhc2UgJ0cnOgotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBmbG9hdGluZ19jb25zdGFudCAoZXhwcmVzc2lvblApOwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9Ci0JICAgIC0gKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBjKSA/IHRvbG93ZXIgKGMpIDogYyk7Ci0JICBicmVhazsKLQotCWNhc2UgJyQnOgotCSAgaWYgKExPQ0FMX0xBQkVMU19ET0xMQVIpCi0JICAgIHsKLQkgICAgICBpbnRlZ2VyX2NvbnN0YW50ICgxMCwgZXhwcmVzc2lvblApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGdvdG8gZGVmYXVsdF9jYXNlOwotCX0KLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcoJzoKLSAgICBjYXNlICdbJzoKLSAgICAgIC8qIGRpZG4ndCBiZWdpbiB3aXRoIGRpZ2l0ICYgbm90IGEgbmFtZSAqLwotICAgICAgc2VnbWVudCA9IGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgICAgIC8qIEV4cHJlc3Npb24oKSB3aWxsIHBhc3MgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLwotICAgICAgaWYgKChjID09ICcoJyAmJiAqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJyknKQotCSAgfHwgKGMgPT0gJ1snICYmICppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnXScpKQotCXsKLQkgIGFzX2JhZCAoXygiTWlzc2luZyAnKScgYXNzdW1lZCIpKTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotCX0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIC8qIGhlcmUgd2l0aCBpbnB1dF9saW5lX3BvaW50ZXItPmNoYXIgYWZ0ZXIgIiguLi4pIiAqLwotICAgICAgcmV0dXJuIHNlZ21lbnQ7Ci0KLSAgICBjYXNlICdFJzoKLSAgICAgIGlmICghIGZsYWdfbTY4a19tcmkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXCcnKQotCWdvdG8gZGVfZmF1bHQ7Ci0gICAgICBhc19iYWQgKF8oIkVCQ0RJQyBjb25zdGFudHMgYXJlIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgJ0EnOgotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSB8fCAqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcJycpCi0JZ290byBkZV9mYXVsdDsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlICdcJyc6Ci0gICAgICBpZiAoISBmbGFnX202OGtfbXJpKQotCXsKLQkgIC8qIFdhcm5pbmc6IHRvIGNvbmZvcm0gdG8gb3RoZXIgcGVvcGxlJ3MgYXNzZW1ibGVycyBOTwotCSAgICAgRVNDQVBFTUVOVCBpcyBwZXJtaXR0ZWQgZm9yIGEgc2luZ2xlIHF1b3RlLiBUaGUgbmV4dAotCSAgICAgY2hhcmFjdGVyLCBwYXJpdHkgZXJyb3JzIGFuZCBhbGwsIGlzIHRha2VuIGFzIHRoZSB2YWx1ZQotCSAgICAgb2YgdGhlIG9wZXJhbmQuIFZFUlkgS0lOS1kuICAqLwotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgbXJpX2NoYXJfY29uc3RhbnQgKGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnKyc6Ci0gICAgICAodm9pZCkgb3BlcmFuZCAoZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICciJzoKLSAgICAgIC8qIERvdWJsZSBxdW90ZSBpcyB0aGUgYml0d2lzZSBub3Qgb3BlcmF0b3IgaW4gTVJJIG1vZGUuICAqLwotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLQlnb3RvIGRlX2ZhdWx0OwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlICd+JzoKLSAgICAgIC8qIH4gaXMgcGVybWl0dGVkIHRvIHN0YXJ0IGEgbGFiZWwgb24gdGhlIERlbHRhLiAgKi8KLSAgICAgIGlmIChpc19uYW1lX2JlZ2lubmVyIChjKSkKLQlnb3RvIGlzbmFtZTsKLSAgICBjYXNlICchJzoKLSAgICBjYXNlICctJzoKLSAgICAgIHsKLQlvcGVyYW5kIChleHByZXNzaW9uUCk7Ci0JaWYgKGV4cHJlc3Npb25QLT5YX29wID09IE9fY29uc3RhbnQpCi0JICB7Ci0JICAgIC8qIGlucHV0X2xpbmVfcG9pbnRlciAtPiBjaGFyIGFmdGVyIG9wZXJhbmQgKi8KLQkgICAgaWYgKGMgPT0gJy0nKQotCSAgICAgIHsKLQkJZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IC0gZXhwcmVzc2lvblAtPlhfYWRkX251bWJlcjsKLQkJLyogTm90aWNlOiAnLScgbWF5IG92ZXJmbG93OiBubyB3YXJuaW5nIGlzIGdpdmVuLiBUaGlzIGlzCi0JCSAgIGNvbXBhdGlibGUgd2l0aCBvdGhlciBwZW9wbGUncyBhc3NlbWJsZXJzLiBTaWdoLiAgKi8KLQkJZXhwcmVzc2lvblAtPlhfdW5zaWduZWQgPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoYyA9PSAnficgfHwgYyA9PSAnIicpCi0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IH4gZXhwcmVzc2lvblAtPlhfYWRkX251bWJlcjsKLQkgICAgZWxzZQotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAhIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXI7Ci0JICB9Ci0JZWxzZSBpZiAoZXhwcmVzc2lvblAtPlhfb3AgIT0gT19pbGxlZ2FsCi0JCSAmJiBleHByZXNzaW9uUC0+WF9vcCAhPSBPX2Fic2VudCkKLQkgIHsKLQkgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKGV4cHJlc3Npb25QKTsKLQkgICAgaWYgKGMgPT0gJy0nKQotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT191bWludXM7Ci0JICAgIGVsc2UgaWYgKGMgPT0gJ34nIHx8IGMgPT0gJyInKQotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19iaXRfbm90OwotCSAgICBlbHNlCi0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2xvZ2ljYWxfbm90OwotCSAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQkgIH0KLQllbHNlCi0JICBhc193YXJuIChfKCJVbmFyeSBvcGVyYXRvciAlYyBpZ25vcmVkIGJlY2F1c2UgYmFkIG9wZXJhbmQgZm9sbG93cyIpLAotCQkgICBjKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnJCc6Ci0gICAgICAvKiAkIGlzIHRoZSBwcm9ncmFtIGNvdW50ZXIgd2hlbiBpbiBNUkkgbW9kZSwgb3Igd2hlbiBET0xMQVJfRE9UCi0gICAgICAgICBpcyBkZWZpbmVkLiAgKi8KLSNpZm5kZWYgRE9MTEFSX0RPVAotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLQlnb3RvIGRlX2ZhdWx0OwotI2VuZGlmCi0gICAgICBpZiAoZmxhZ19tNjhrX21yaSAmJiBoZXhfcCAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JewotCSAgLyogSW4gTVJJIG1vZGUsICQgaXMgYWxzbyB1c2VkIGFzIHRoZSBwcmVmaXggZm9yIGEKLSAgICAgICAgICAgICBoZXhhZGVjaW1hbCBjb25zdGFudC4gICovCi0JICBpbnRlZ2VyX2NvbnN0YW50ICgxNiwgZXhwcmVzc2lvblApOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoaXNfcGFydF9vZl9uYW1lICgqaW5wdXRfbGluZV9wb2ludGVyKSkKLQlnb3RvIGlzbmFtZTsKLQotICAgICAgY3VycmVudF9sb2NhdGlvbiAoZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcuJzoKLSAgICAgIGlmICghaXNfcGFydF9vZl9uYW1lICgqaW5wdXRfbGluZV9wb2ludGVyKSkKLQl7Ci0JICBjdXJyZW50X2xvY2F0aW9uIChleHByZXNzaW9uUCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInN0YXJ0b2YuIiwgOCkgPT0gMAotCQkmJiAhIGlzX3BhcnRfb2ZfbmFtZSAoaW5wdXRfbGluZV9wb2ludGVyWzhdKSkKLQkgICAgICAgfHwgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJzaXplb2YuIiwgNykgPT0gMAotCQkgICAmJiAhIGlzX3BhcnRfb2ZfbmFtZSAoaW5wdXRfbGluZV9wb2ludGVyWzddKSkpCi0JewotCSAgaW50IHN0YXJ0OwotCi0JICBzdGFydCA9IChpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJ3QnCi0JCSAgIHx8IGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnVCcpOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IHN0YXJ0ID8gOCA6IDc7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnKCcpCi0JICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIC5zdGFydG9mLiBvciAuc2l6ZW9mLiIpKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKmJ1ZjsKLQotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxMCk7Ci0JICAgICAgaWYgKHN0YXJ0KQotCQlzcHJpbnRmIChidWYsICIuc3RhcnRvZi4lcyIsIG5hbWUpOwotCSAgICAgIGVsc2UKLQkJc3ByaW50ZiAoYnVmLCAiLnNpemVvZi4lcyIsIG5hbWUpOwotCSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbWFrZSAoYnVmKTsKLQkgICAgICBmcmVlIChidWYpOwotCi0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gc3ltYm9sUDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnKScpCi0JCWFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIC5zdGFydG9mLiBvciAuc2l6ZW9mLiIpKTsKLQkgICAgICBlbHNlCi0JCSsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZ290byBpc25hbWU7Ci0JfQotICAgIGNhc2UgJywnOgotICAgIGNhc2UgJ1xuJzoKLSAgICBjYXNlICdcMCc6Ci0gICAgZW9sOgotICAgICAgLyogY2FuJ3QgaW1hZ2luZSBhbnkgb3RoZXIga2luZCBvZiBvcGVyYW5kICovCi0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fYWJzZW50OwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyUnOgotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLQlnb3RvIGRlX2ZhdWx0OwotICAgICAgaW50ZWdlcl9jb25zdGFudCAoMiwgZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdAJzoKLSAgICAgIGlmICghIGZsYWdfbTY4a19tcmkpCi0JZ290byBkZV9mYXVsdDsKLSAgICAgIGludGVnZXJfY29uc3RhbnQgKDgsIGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnOic6Ci0gICAgICBpZiAoISBmbGFnX202OGtfbXJpKQotCWdvdG8gZGVfZmF1bHQ7Ci0KLSAgICAgIC8qIEluIE1SSSBtb2RlLCB0aGlzIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgcmVwcmVzZW50ZWQKLSAgICAgICAgIHVzaW5nIGhleGFkZWNpbWFsIGRpZ2l0cy4gICovCi0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW50ZWdlcl9jb25zdGFudCAoMTYsIGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnKic6Ci0gICAgICBpZiAoISBmbGFnX202OGtfbXJpIHx8IGlzX3BhcnRfb2ZfbmFtZSAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JZ290byBkZV9mYXVsdDsKLQotICAgICAgY3VycmVudF9sb2NhdGlvbiAoZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgIGRlX2ZhdWx0OgotICAgICAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSBjXSkKLQlnb3RvIGVvbDsKLSAgICAgIGlmIChpc19uYW1lX2JlZ2lubmVyIChjKSkJLyogaGVyZSBpZiBkaWQgbm90IGJlZ2luIHdpdGggYSBkaWdpdCAqLwotCXsKLQkgIC8qCi0JICAgKiBJZGVudGlmaWVyIGJlZ2lucyBoZXJlLgotCSAgICogVGhpcyBpcyBrbHVkZ2VkIGZvciBzcGVlZCwgc28gY29kZSBpcyByZXBlYXRlZC4KLQkgICAqLwotCWlzbmFtZToKLQkgIG5hbWUgPSAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotI2lmZGVmIG1kX3BhcnNlX25hbWUKLQkgIC8qIFRoaXMgaXMgYSBob29rIGZvciB0aGUgYmFja2VuZCB0byBwYXJzZSBjZXJ0YWluIG5hbWVzCi0gICAgICAgICAgICAgc3BlY2lhbGx5IGluIGNlcnRhaW4gY29udGV4dHMuICBJZiBhIG5hbWUgYWx3YXlzIGhhcyBhCi0gICAgICAgICAgICAgc3BlY2lmaWMgdmFsdWUsIGl0IGNhbiBvZnRlbiBiZSBoYW5kbGVkIGJ5IHNpbXBseQotICAgICAgICAgICAgIGVudGVyaW5nIGl0IGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCSAgaWYgKG1kX3BhcnNlX25hbWUgKG5hbWUsIGV4cHJlc3Npb25QKSkKLQkgICAgewotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIFRDX0k5NjAKLQkgIC8qIFRoZSBNUkkgaTk2MCBhc3NlbWJsZXIgcGVybWl0cwotCSAgICAgICAgIGxkYSBzaXplb2YgY29kZSxnMTMKLQkgICAgIEZJWE1FOiBUaGlzIHNob3VsZCB1c2UgbWRfcGFyc2VfbmFtZS4gICovCi0JICBpZiAoZmxhZ19tcmkKLQkgICAgICAmJiAoc3RyY2FzZWNtcCAobmFtZSwgInNpemVvZiIpID09IDAKLQkJICB8fCBzdHJjYXNlY21wIChuYW1lLCAic3RhcnRvZiIpID09IDApKQotCSAgICB7Ci0JICAgICAgaW50IHN0YXJ0OwotCSAgICAgIGNoYXIgKmJ1ZjsKLQotCSAgICAgIHN0YXJ0ID0gKG5hbWVbMV0gPT0gJ3QnCi0JCSAgICAgICB8fCBuYW1lWzFdID09ICdUJyk7Ci0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLQkgICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxMCk7Ci0JICAgICAgaWYgKHN0YXJ0KQotCQlzcHJpbnRmIChidWYsICIuc3RhcnRvZi4lcyIsIG5hbWUpOwotCSAgICAgIGVsc2UKLQkJc3ByaW50ZiAoYnVmLCAiLnNpemVvZi4lcyIsIG5hbWUpOwotCSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbWFrZSAoYnVmKTsKLQkgICAgICBmcmVlIChidWYpOwotCi0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gc3ltYm9sUDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotCSAgICAgIGJyZWFrOwotCSAgICB9CSAgICAgIAotI2VuZGlmCi0KLQkgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotCSAgLyogSWYgd2UgaGF2ZSBhbiBhYnNvbHV0ZSBzeW1ib2wgb3IgYSByZWcsIHRoZW4gd2Uga25vdyBpdHMKLQkgICAgIHZhbHVlIG5vdy4gICovCi0JICBzZWdtZW50ID0gU19HRVRfU0VHTUVOVCAoc3ltYm9sUCk7Ci0JICBpZiAoc2VnbWVudCA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNlZ21lbnQgPT0gcmVnX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gc3ltYm9sUDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQkgICAgfQotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIExldCB0aGUgdGFyZ2V0IHRyeSB0byBwYXJzZSBpdC4gIFN1Y2Nlc3MgaXMgaW5kaWNhdGVkIGJ5IGNoYW5naW5nCi0JICAgICB0aGUgWF9vcCBmaWVsZCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBPX2Fic2VudCBhbmQgcG9pbnRpbmcKLQkgICAgIGlucHV0X2xpbmVfcG9pbnRlciBwYXNzZWQgdGhlIGV4cHJlc3Npb24uICBJZiBpdCBjYW4ndCBwYXJzZSB0aGUKLQkgICAgIGV4cHJlc3Npb24sIFhfb3AgYW5kIGlucHV0X2xpbmVfcG9pbnRlciBzaG91bGQgYmUgdW5jaGFuZ2VkLiAgKi8KLQkgIGV4cHJlc3Npb25QLT5YX29wID0gT19hYnNlbnQ7Ci0JICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIG1kX29wZXJhbmQgKGV4cHJlc3Npb25QKTsKLQkgIGlmIChleHByZXNzaW9uUC0+WF9vcCA9PSBPX2Fic2VudCkKLQkgICAgewotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGFzX2JhZCAoXygiQmFkIGV4cHJlc3Npb24iKSk7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qCi0gICAqIEl0IGlzIG1vcmUgJ2VmZmljaWVudCcgdG8gY2xlYW4gdXAgdGhlIGV4cHJlc3Npb25TIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4KLSAgICogRG9pbmcgaXQgaGVyZSBzYXZlcyBsaW5lcyBvZiBjb2RlLgotICAgKi8KLSAgY2xlYW5fdXBfZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7CQkvKi0+MXN0IGNoYXIgYWZ0ZXIgb3BlcmFuZC4gKi8KLSAga25vdyAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnICcpOwotCi0gIC8qIFRoZSBQQSBwb3J0IG5lZWRzIHRoaXMgaW5mb3JtYXRpb24uICAqLwotICBpZiAoZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCkKLSAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sLT5zeV91c2VkID0gMTsKLQotICBzd2l0Y2ggKGV4cHJlc3Npb25QLT5YX29wKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGFic29sdXRlX3NlY3Rpb247Ci0gICAgY2FzZSBPX3N5bWJvbDoKLSAgICAgIHJldHVybiBTX0dFVF9TRUdNRU5UIChleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sKTsKLSAgICBjYXNlIE9fcmVnaXN0ZXI6Ci0gICAgICByZXR1cm4gcmVnX3NlY3Rpb247Ci0gICAgfQotfQkJCQkvKiBvcGVyYW5kKCkgKi8KLQwKLS8qIEludGVybmFsLiBTaW1wbGlmeSBhIHN0cnVjdCBleHByZXNzaW9uIGZvciB1c2UgYnkgZXhwcigpICovCi0KLS8qCi0gKiBJbjoJYWRkcmVzcyBvZiBhIGV4cHJlc3Npb25TLgotICoJVGhlIFhfb3AgZmllbGQgb2YgdGhlIGV4cHJlc3Npb25TIG1heSBvbmx5IHRha2UgY2VydGFpbiB2YWx1ZXMuCi0gKglFbHNld2lzZSB3ZSB3YXN0ZSB0aW1lIHNwZWNpYWwtY2FzZSB0ZXN0aW5nLiBTaWdoLiBEaXR0byBTRUdfQUJTRU5ULgotICogT3V0OglleHByZXNzaW9uUyBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkOgotICoJJ2Zvby1mb28nIHN5bWJvbCByZWZlcmVuY2VzIGNhbmNlbGxlZCB0byAwLAotICoJCXdoaWNoIGNoYW5nZXMgWF9vcCBmcm9tIE9fc3VidHJhY3QgdG8gT19jb25zdGFudC4KLSAqCVVudXNlZCBmaWVsZHMgemVyb2VkIHRvIGhlbHAgZXhwcigpLgotICovCi0KLXN0YXRpYyB2b2lkCi1jbGVhbl91cF9leHByZXNzaW9uIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBzd2l0Y2ggKGV4cHJlc3Npb25QLT5YX29wKQotICAgIHsKLSAgICBjYXNlIE9faWxsZWdhbDoKLSAgICBjYXNlIE9fYWJzZW50OgotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgT19iaWc6Ci0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgIGNhc2UgT19yZWdpc3RlcjoKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIE9fc3ltYm9sOgotICAgIGNhc2UgT191bWludXM6Ci0gICAgY2FzZSBPX2JpdF9ub3Q6Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX3N1YnRyYWN0OgotICAgICAgaWYgKGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9PSBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sCi0JICB8fCAoKGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbC0+c3lfZnJhZwotCSAgICAgICA9PSBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sLT5zeV9mcmFnKQotCSAgICAgICYmIFNFR19OT1JNQUwgKFNfR0VUX1NFR01FTlQgKGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wpKQotCSAgICAgICYmIChTX0dFVF9WQUxVRSAoZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sKQotCQkgID09IFNfR0VUX1ZBTFVFIChleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sKSkpKQotCXsKLQkgIGFkZHJlc3NUIGRpZmYgPSAoU19HRVRfVkFMVUUgKGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wpCi0JCQkgICAtIFNfR0VUX1ZBTFVFIChleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wpKTsKLQotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciArPSBkaWZmOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0MCi0vKiBFeHByZXNzaW9uIHBhcnNlci4gKi8KLQotLyoKLSAqIFdlIGFsbG93IGFuIGVtcHR5IGV4cHJlc3Npb24sIGFuZCBqdXN0IGFzc3VtZSAoYWJzb2x1dGUsMCkgc2lsZW50bHkuCi0gKiBVbmFyeSBvcGVyYXRvcnMgYW5kIHBhcmVudGhldGljYWwgZXhwcmVzc2lvbnMgYXJlIHRyZWF0ZWQgYXMgb3BlcmFuZHMuCi0gKiBBcyB1c3VhbCwgUT09cXVhbnRpdHk9PW9wZXJhbmQsIE89PW9wZXJhdG9yLCBYPT1leHByZXNzaW9uIG1uZW1vbmljcy4KLSAqCi0gKiBXZSB1c2VkIHRvIGRvIGEgYWhvL3VsbG1hbiBzaGlmdC1yZWR1Y2UgcGFyc2VyLCBidXQgdGhlIGxvZ2ljIGdvdCBzbwotICogd2FycGVkIHRoYXQgSSBmbHVzaGVkIGl0IGFuZCB3cm90ZSBhIHJlY3Vyc2l2ZS1kZXNjZW50IHBhcnNlciBpbnN0ZWFkLgotICogTm93IHRoaW5ncyBhcmUgc3RhYmxlLCB3b3VsZCBhbnlib2R5IGxpa2UgdG8gd3JpdGUgYSBmYXN0IHBhcnNlcj8KLSAqIE1vc3QgZXhwcmVzc2lvbnMgYXJlIGVpdGhlciByZWdpc3RlciAod2hpY2ggZG9lcyBub3QgZXZlbiByZWFjaCBoZXJlKQotICogb3IgMSBzeW1ib2wuIFRoZW4gInN5bWJvbCtjb25zdGFudCIgYW5kICJzeW1ib2wtc3ltYm9sIiBhcmUgY29tbW9uLgotICogU28gSSBndWVzcyBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgaG93IGluZWZmaWNpZW50IG1vcmUgY29tcGxleCBleHByZXNzaW9ucwotICogYXJlIHBhcnNlZC4KLSAqCi0gKiBBZnRlciBleHByKFJBTksscmVzdWx0UCkgaW5wdXRfbGluZV9wb2ludGVyLT5vcGVyYXRvciBvZiByYW5rIDw9IFJBTksuCi0gKiBBbHNvLCB3ZSBoYXZlIGNvbnN1bWVkIGFueSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyAob3BlcmFuZCBkb2VzIHRoYXQpCi0gKiBhbmQgZG9uZSBhbGwgaW50ZXJ2ZW5pbmcgb3BlcmF0b3JzLgotICoKLSAqIFRoaXMgcmV0dXJucyB0aGUgc2VnbWVudCBvZiB0aGUgcmVzdWx0LCB3aGljaCB3aWxsIGJlCi0gKiBhYnNvbHV0ZV9zZWN0aW9uIG9yIHRoZSBzZWdtZW50IG9mIGEgc3ltYm9sLgotICovCi0KLSN1bmRlZiBfXwotI2RlZmluZSBfXyBPX2lsbGVnYWwKLQotc3RhdGljIGNvbnN0IG9wZXJhdG9yVCBvcF9lbmNvZGluZ1syNTZdID0KLXsJCQkJLyogbWFwcyBBU0NJSS0+b3BlcmF0b3JzICovCi0KLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotCi0gIF9fLCBPX2JpdF9vcl9ub3QsIF9fLCBfXywgX18sIE9fbW9kdWx1cywgT19iaXRfYW5kLCBfXywKLSAgX18sIF9fLCBPX211bHRpcGx5LCBPX2FkZCwgX18sIE9fc3VidHJhY3QsIF9fLCBPX2RpdmlkZSwKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgT19sdCwgX18sIE9fZ3QsIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBPX2JpdF9leGNsdXNpdmVfb3IsIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgT19iaXRfaW5jbHVzaXZlX29yLCBfXywgX18sIF9fLAotCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXwotfTsKLQotCi0vKgotICoJUmFuawlFeGFtcGxlcwotICoJMAlvcGVyYW5kLCAoZXhwcmVzc2lvbikKLSAqCTEJfHwKLSAqCTIJJiYKLSAqCTMJPSA8PiA8IDw9ID49ID4KLSAqCTQJKyAtCi0gKgk1CXVzZWQgZm9yICogLyAlIGluIE1SSSBtb2RlCi0gKgk2CSYgXiAhIHwKLSAqCTcJKiAvICUgPDwgPj4KLSAqCTgJdW5hcnkgLSB1bmFyeSB+Ci0gKi8KLXN0YXRpYyBvcGVyYXRvcl9yYW5rVCBvcF9yYW5rW10gPQotewotICAwLAkvKiBPX2lsbGVnYWwgKi8KLSAgMCwJLyogT19hYnNlbnQgKi8KLSAgMCwJLyogT19jb25zdGFudCAqLwotICAwLAkvKiBPX3N5bWJvbCAqLwotICAwLAkvKiBPX3N5bWJvbF9ydmEgKi8KLSAgMCwJLyogT19yZWdpc3RlciAqLwotICAwLAkvKiBPX2JpdCAqLwotICA4LAkvKiBPX3VtaW51cyAqLwotICA4LAkvKiBPX2JpdF9ub3QgKi8KLSAgOCwJLyogT19sb2dpY2FsX25vdCAqLwotICA3LAkvKiBPX211bHRpcGx5ICovCi0gIDcsCS8qIE9fZGl2aWRlICovCi0gIDcsCS8qIE9fbW9kdWx1cyAqLwotICA3LAkvKiBPX2xlZnRfc2hpZnQgKi8KLSAgNywJLyogT19yaWdodF9zaGlmdCAqLwotICA2LAkvKiBPX2JpdF9pbmNsdXNpdmVfb3IgKi8KLSAgNiwJLyogT19iaXRfb3Jfbm90ICovCi0gIDYsCS8qIE9fYml0X2V4Y2x1c2l2ZV9vciAqLwotICA2LAkvKiBPX2JpdF9hbmQgKi8KLSAgNCwJLyogT19hZGQgKi8KLSAgNCwJLyogT19zdWJ0cmFjdCAqLwotICAzLAkvKiBPX2VxICovCi0gIDMsCS8qIE9fbmUgKi8KLSAgMywJLyogT19sdCAqLwotICAzLAkvKiBPX2xlICovCi0gIDMsCS8qIE9fZ2UgKi8KLSAgMywJLyogT19ndCAqLwotICAyLAkvKiBPX2xvZ2ljYWxfYW5kICovCi0gIDEJLyogT19sb2dpY2FsX29yICovCi19OwotCi0vKiBVbmZvcnR1bmF0ZWx5LCBpbiBNUkkgbW9kZSBmb3IgdGhlIG02OGssIG11bHRpcGxpY2F0aW9uIGFuZAotICAgZGl2aXNpb24gaGF2ZSBsb3dlciBwcmVjZWRlbmNlIHRoYW4gdGhlIGJpdCB3aXNlIG9wZXJhdG9ycy4gIFRoaXMKLSAgIGZ1bmN0aW9uIHNldHMgdGhlIG9wZXJhdG9yIHByZWNlZGVuY2VzIGNvcnJlY3RseSBmb3IgdGhlIGN1cnJlbnQKLSAgIG1vZGUuICBBbHNvLCBNUkkgdXNlcyBhIGRpZmZlcmVudCBiaXRfbm90IG9wZXJhdG9yLCBhbmQgdGhpcyBmaXhlcwotICAgdGhhdCBhcyB3ZWxsLiAgKi8KLQotI2RlZmluZSBTVEFOREFSRF9NVUxfUFJFQ0VERU5DRSAoNykKLSNkZWZpbmUgTVJJX01VTF9QUkVDRURFTkNFICg1KQotCi12b2lkCi1leHByX3NldF9wcmVjZWRlbmNlICgpCi17Ci0gIGlmIChmbGFnX202OGtfbXJpKQotICAgIHsKLSAgICAgIG9wX3JhbmtbT19tdWx0aXBseV0gPSBNUklfTVVMX1BSRUNFREVOQ0U7Ci0gICAgICBvcF9yYW5rW09fZGl2aWRlXSA9IE1SSV9NVUxfUFJFQ0VERU5DRTsKLSAgICAgIG9wX3JhbmtbT19tb2R1bHVzXSA9IE1SSV9NVUxfUFJFQ0VERU5DRTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvcF9yYW5rW09fbXVsdGlwbHldID0gU1RBTkRBUkRfTVVMX1BSRUNFREVOQ0U7Ci0gICAgICBvcF9yYW5rW09fZGl2aWRlXSA9IFNUQU5EQVJEX01VTF9QUkVDRURFTkNFOwotICAgICAgb3BfcmFua1tPX21vZHVsdXNdID0gU1RBTkRBUkRfTVVMX1BSRUNFREVOQ0U7Ci0gICAgfQotfQotCi0vKiBJbml0aWFsaXplIHRoZSBleHByZXNzaW9uIHBhcnNlci4gICovCi0KLXZvaWQKLWV4cHJfYmVnaW4gKCkKLXsKLSAgZXhwcl9zZXRfcHJlY2VkZW5jZSAoKTsKLQotICAvKiBWZXJpZnkgdGhhdCBYX29wIGZpZWxkIGlzIHdpZGUgZW5vdWdoLiAgKi8KLSAgewotICAgIGV4cHJlc3Npb25TIGU7Ci0gICAgZS5YX29wID0gT19tYXg7Ci0gICAgYXNzZXJ0IChlLlhfb3AgPT0gT19tYXgpOwotICB9Ci19Ci0MCi0vKiBSZXR1cm4gdGhlIGVuY29kaW5nIGZvciB0aGUgb3BlcmF0b3IgYXQgSU5QVVRfTElORV9QT0lOVEVSLgotICAgQWR2YW5jZSBJTlBVVF9MSU5FX1BPSU5URVIgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBvcGVyYXRvcgotICAgKGkuZS4sIGRvbid0IGNoYW5nZSBpdCBmb3IgYSBzaW5nbGUgY2hhcmFjdGVyIG9wZXJhdG9yKS4gICovCi0KLXN0YXRpYyBpbmxpbmUgb3BlcmF0b3JUCi1vcGVyYXRvciAoKQotewotICBpbnQgYzsKLSAgb3BlcmF0b3JUIHJldDsKLQotICBjID0gKmlucHV0X2xpbmVfcG9pbnRlciAmIDB4ZmY7Ci0KLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIG9wX2VuY29kaW5nW2NdOwotCi0gICAgY2FzZSAnPCc6Ci0gICAgICBzd2l0Y2ggKGlucHV0X2xpbmVfcG9pbnRlclsxXSkKLQl7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiBvcF9lbmNvZGluZ1tjXTsKLQljYXNlICc8JzoKLQkgIHJldCA9IE9fbGVmdF9zaGlmdDsKLQkgIGJyZWFrOwotCWNhc2UgJz4nOgotCSAgcmV0ID0gT19uZTsKLQkgIGJyZWFrOwotCWNhc2UgJz0nOgotCSAgcmV0ID0gT19sZTsKLQkgIGJyZWFrOwotCX0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcmV0dXJuIHJldDsKLQotICAgIGNhc2UgJz0nOgotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnPScpCi0JcmV0dXJuIG9wX2VuY29kaW5nW2NdOwotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHJldHVybiBPX2VxOwotCi0gICAgY2FzZSAnPic6Ci0gICAgICBzd2l0Y2ggKGlucHV0X2xpbmVfcG9pbnRlclsxXSkKLQl7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiBvcF9lbmNvZGluZ1tjXTsKLQljYXNlICc+JzoKLQkgIHJldCA9IE9fcmlnaHRfc2hpZnQ7Ci0JICBicmVhazsKLQljYXNlICc9JzoKLQkgIHJldCA9IE9fZ2U7Ci0JICBicmVhazsKLQl9Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBjYXNlICchJzoKLSAgICAgIC8qIFdlIGFjY2VwdCAhISBhcyBlcXVpdmFsZW50IHRvIF4gZm9yIE1SSSBjb21wYXRpYmlsaXR5LiAgKi8KLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJyEnKQotCXsKLQkgIGlmIChmbGFnX202OGtfbXJpKQotCSAgICByZXR1cm4gT19iaXRfaW5jbHVzaXZlX29yOwotCSAgcmV0dXJuIG9wX2VuY29kaW5nW2NdOwotCX0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcmV0dXJuIE9fYml0X2V4Y2x1c2l2ZV9vcjsKLQotICAgIGNhc2UgJ3wnOgotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnfCcpCi0JcmV0dXJuIG9wX2VuY29kaW5nW2NdOwotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHJldHVybiBPX2xvZ2ljYWxfb3I7Ci0KLSAgICBjYXNlICcmJzoKLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJyYnKQotCXJldHVybiBvcF9lbmNvZGluZ1tjXTsKLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICByZXR1cm4gT19sb2dpY2FsX2FuZDsKLSAgICB9Ci0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogUGFyc2UgYW4gZXhwcmVzc2lvbi4gICovCi0KLXNlZ1QKLWV4cHIgKHJhbmssIHJlc3VsdFApCi0gICAgIG9wZXJhdG9yX3JhbmtUIHJhbms7CS8qIExhcmdlciAjIGlzIGhpZ2hlciByYW5rLiAqLwotICAgICBleHByZXNzaW9uUyAqcmVzdWx0UDsJLyogRGVsaXZlciByZXN1bHQgaGVyZS4gKi8KLXsKLSAgc2VnVCByZXR2YWw7Ci0gIGV4cHJlc3Npb25TIHJpZ2h0OwotICBvcGVyYXRvclQgb3BfbGVmdDsKLSAgb3BlcmF0b3JUIG9wX3JpZ2h0OwotCi0gIGtub3cgKHJhbmsgPj0gMCk7Ci0KLSAgcmV0dmFsID0gb3BlcmFuZCAocmVzdWx0UCk7Ci0KLSAga25vdyAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnICcpOwkvKiBPcGVyYW5kKCkgZ29iYmxlcyBzcGFjZXMuICovCi0KLSAgb3BfbGVmdCA9IG9wZXJhdG9yICgpOwotICB3aGlsZSAob3BfbGVmdCAhPSBPX2lsbGVnYWwgJiYgb3BfcmFua1soaW50KSBvcF9sZWZ0XSA+IHJhbmspCi0gICAgewotICAgICAgc2VnVCByaWdodHNlZzsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CS8qLT5hZnRlciAxc3QgY2hhcmFjdGVyIG9mIG9wZXJhdG9yLiAqLwotCi0gICAgICByaWdodHNlZyA9IGV4cHIgKG9wX3JhbmtbKGludCkgb3BfbGVmdF0sICZyaWdodCk7Ci0gICAgICBpZiAocmlnaHQuWF9vcCA9PSBPX2Fic2VudCkKLQl7Ci0JICBhc193YXJuIChfKCJtaXNzaW5nIG9wZXJhbmQ7IHplcm8gYXNzdW1lZCIpKTsKLQkgIHJpZ2h0Llhfb3AgPSBPX2NvbnN0YW50OwotCSAgcmlnaHQuWF9hZGRfbnVtYmVyID0gMDsKLQkgIHJpZ2h0LlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICByaWdodC5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JfQotCi0gICAgICBrbm93ICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcgJyk7Ci0KLSAgICAgIGlmIChyZXR2YWwgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JewotCSAgaWYgKFNFR19OT1JNQUwgKHJpZ2h0c2VnKSkKLQkgICAgcmV0dmFsID0gcmlnaHRzZWc7Ci0JfQotICAgICAgZWxzZSBpZiAoISBTRUdfTk9STUFMIChyZXR2YWwpKQotCXJldHZhbCA9IHJpZ2h0c2VnOwotICAgICAgZWxzZSBpZiAoU0VHX05PUk1BTCAocmlnaHRzZWcpCi0JICAgICAgICYmIHJldHZhbCAhPSByaWdodHNlZwotI2lmZGVmIERJRkZfRVhQUl9PSwotCSAgICAgICAmJiBvcF9sZWZ0ICE9IE9fc3VidHJhY3QKLSNlbmRpZgotCSAgICAgICApCi0JYXNfYmFkIChfKCJvcGVyYXRpb24gY29tYmluZXMgc3ltYm9scyBpbiBkaWZmZXJlbnQgc2VnbWVudHMiKSk7Ci0KLSAgICAgIG9wX3JpZ2h0ID0gb3BlcmF0b3IgKCk7Ci0KLSAgICAgIGtub3cgKG9wX3JpZ2h0ID09IE9faWxsZWdhbCB8fCBvcF9yYW5rWyhpbnQpIG9wX3JpZ2h0XSA8PSBvcF9yYW5rWyhpbnQpIG9wX2xlZnRdKTsKLSAgICAgIGtub3cgKChpbnQpIG9wX2xlZnQgPj0gKGludCkgT19tdWx0aXBseQotCSAgICAmJiAoaW50KSBvcF9sZWZ0IDw9IChpbnQpIE9fbG9naWNhbF9vcik7Ci0KLSAgICAgIC8qIGlucHV0X2xpbmVfcG9pbnRlci0+YWZ0ZXIgcmlnaHQtaGFuZCBxdWFudGl0eS4gKi8KLSAgICAgIC8qIGxlZnQtaGFuZCBxdWFudGl0eSBpbiByZXN1bHRQICovCi0gICAgICAvKiByaWdodC1oYW5kIHF1YW50aXR5IGluIHJpZ2h0LiAqLwotICAgICAgLyogb3BlcmF0b3IgaW4gb3BfbGVmdC4gKi8KLQotICAgICAgaWYgKHJlc3VsdFAtPlhfb3AgPT0gT19iaWcpCi0JewotCSAgaWYgKHJlc3VsdFAtPlhfYWRkX251bWJlciA+IDApCi0JICAgIGFzX3dhcm4gKF8oImxlZnQgb3BlcmFuZCBpcyBhIGJpZ251bTsgaW50ZWdlciAwIGFzc3VtZWQiKSk7Ci0JICBlbHNlCi0JICAgIGFzX3dhcm4gKF8oImxlZnQgb3BlcmFuZCBpcyBhIGZsb2F0OyBpbnRlZ2VyIDAgYXNzdW1lZCIpKTsKLQkgIHJlc3VsdFAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0gMDsKLQkgIHJlc3VsdFAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICByZXN1bHRQLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JfQotICAgICAgaWYgKHJpZ2h0Llhfb3AgPT0gT19iaWcpCi0JewotCSAgaWYgKHJpZ2h0LlhfYWRkX251bWJlciA+IDApCi0JICAgIGFzX3dhcm4gKF8oInJpZ2h0IG9wZXJhbmQgaXMgYSBiaWdudW07IGludGVnZXIgMCBhc3N1bWVkIikpOwotCSAgZWxzZQotCSAgICBhc193YXJuIChfKCJyaWdodCBvcGVyYW5kIGlzIGEgZmxvYXQ7IGludGVnZXIgMCBhc3N1bWVkIikpOwotCSAgcmlnaHQuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICByaWdodC5YX2FkZF9udW1iZXIgPSAwOwotCSAgcmlnaHQuWF9hZGRfc3ltYm9sID0gTlVMTDsKLQkgIHJpZ2h0Llhfb3Bfc3ltYm9sID0gTlVMTDsKLQl9Ci0KLSAgICAgIC8qIE9wdGltaXplIGNvbW1vbiBjYXNlcy4gICovCi0gICAgICBpZiAob3BfbGVmdCA9PSBPX2FkZCAmJiByaWdodC5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgLyogWCArIGNvbnN0YW50LiAgKi8KLQkgIHJlc3VsdFAtPlhfYWRkX251bWJlciArPSByaWdodC5YX2FkZF9udW1iZXI7Ci0JfQotICAgICAgLyogVGhpcyBjYXNlIGNvbWVzIHVwIGluIFBJQyBjb2RlLiAgKi8KLSAgICAgIGVsc2UgaWYgKG9wX2xlZnQgPT0gT19zdWJ0cmFjdAotCSAgICAgICAmJiByaWdodC5YX29wID09IE9fc3ltYm9sCi0JICAgICAgICYmIHJlc3VsdFAtPlhfb3AgPT0gT19zeW1ib2wKLQkgICAgICAgJiYgKHJpZ2h0LlhfYWRkX3N5bWJvbC0+c3lfZnJhZwotCQkgICA9PSByZXN1bHRQLT5YX2FkZF9zeW1ib2wtPnN5X2ZyYWcpCi0JICAgICAgICYmIFNFR19OT1JNQUwgKFNfR0VUX1NFR01FTlQgKHJpZ2h0LlhfYWRkX3N5bWJvbCkpKQotCi0JewotCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyIC09IHJpZ2h0LlhfYWRkX251bWJlcjsKLQkgIHJlc3VsdFAtPlhfYWRkX251bWJlciArPSAoU19HRVRfVkFMVUUgKHJlc3VsdFAtPlhfYWRkX3N5bWJvbCkKLQkJCQkgICAgLSBTX0dFVF9WQUxVRSAocmlnaHQuWF9hZGRfc3ltYm9sKSk7Ci0JICByZXN1bHRQLT5YX29wID0gT19jb25zdGFudDsKLQkgIHJlc3VsdFAtPlhfYWRkX3N5bWJvbCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAob3BfbGVmdCA9PSBPX3N1YnRyYWN0ICYmIHJpZ2h0Llhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICAvKiBYIC0gY29uc3RhbnQuICAqLwotCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyIC09IHJpZ2h0LlhfYWRkX251bWJlcjsKLQl9Ci0gICAgICBlbHNlIGlmIChvcF9sZWZ0ID09IE9fYWRkICYmIHJlc3VsdFAtPlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICAvKiBDb25zdGFudCArIFguICAqLwotCSAgcmVzdWx0UC0+WF9vcCA9IHJpZ2h0Llhfb3A7Ci0JICByZXN1bHRQLT5YX2FkZF9zeW1ib2wgPSByaWdodC5YX2FkZF9zeW1ib2w7Ci0JICByZXN1bHRQLT5YX29wX3N5bWJvbCA9IHJpZ2h0Llhfb3Bfc3ltYm9sOwotCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyICs9IHJpZ2h0LlhfYWRkX251bWJlcjsKLQkgIHJldHZhbCA9IHJpZ2h0c2VnOwotCX0KLSAgICAgIGVsc2UgaWYgKHJlc3VsdFAtPlhfb3AgPT0gT19jb25zdGFudCAmJiByaWdodC5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgLyogQ29uc3RhbnQgT1AgY29uc3RhbnQuICAqLwotCSAgb2Zmc2V0VCB2ID0gcmlnaHQuWF9hZGRfbnVtYmVyOwotCSAgaWYgKHYgPT0gMCAmJiAob3BfbGVmdCA9PSBPX2RpdmlkZSB8fCBvcF9sZWZ0ID09IE9fbW9kdWx1cykpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJkaXZpc2lvbiBieSB6ZXJvIikpOwotCSAgICAgIHYgPSAxOwotCSAgICB9Ci0JICBzd2l0Y2ggKG9wX2xlZnQpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoJCQlhYm9ydCAoKTsKLQkgICAgY2FzZSBPX211bHRpcGx5OgkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyICo9IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fZGl2aWRlOgkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIC89IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fbW9kdWx1czoJCXJlc3VsdFAtPlhfYWRkX251bWJlciAlPSB2OyBicmVhazsKLQkgICAgY2FzZSBPX2xlZnRfc2hpZnQ6CQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgPDw9IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fcmlnaHRfc2hpZnQ6Ci0JICAgICAgLyogV2UgYWx3YXlzIHVzZSB1bnNpZ25lZCBzaGlmdHMsIHRvIGF2b2lkIHJlbHlpbmcgb24KLSAgICAgICAgICAgICAgICAgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBjb21waWxlciB1c2VkIHRvIGNvbXBpbGUgZ2FzLiAgKi8KLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPQotCQkob2Zmc2V0VCkgKCh2YWx1ZVQpIHJlc3VsdFAtPlhfYWRkX251bWJlciA+PiAodmFsdWVUKSB2KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2JpdF9pbmNsdXNpdmVfb3I6CXJlc3VsdFAtPlhfYWRkX251bWJlciB8PSB2OyBicmVhazsKLQkgICAgY2FzZSBPX2JpdF9vcl9ub3Q6CQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgfD0gfnY7IGJyZWFrOwotCSAgICBjYXNlIE9fYml0X2V4Y2x1c2l2ZV9vcjoJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIF49IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fYml0X2FuZDoJCXJlc3VsdFAtPlhfYWRkX251bWJlciAmPSB2OyBicmVhazsKLQkgICAgY2FzZSBPX2FkZDoJCQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgKz0gdjsgYnJlYWs7Ci0JICAgIGNhc2UgT19zdWJ0cmFjdDoJCXJlc3VsdFAtPlhfYWRkX251bWJlciAtPSB2OyBicmVhazsKLQkgICAgY2FzZSBPX2VxOgotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9Ci0JCXJlc3VsdFAtPlhfYWRkX251bWJlciA9PSB2ID8gfiAob2Zmc2V0VCkgMCA6IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19uZToKLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPQotCQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgIT0gdiA/IH4gKG9mZnNldFQpIDAgOiAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fbHQ6Ci0JICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0KLQkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIDwgIHYgPyB+IChvZmZzZXRUKSAwIDogMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2xlOgotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9Ci0JCXJlc3VsdFAtPlhfYWRkX251bWJlciA8PSB2ID8gfiAob2Zmc2V0VCkgMCA6IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19nZToKLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPQotCQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgPj0gdiA/IH4gKG9mZnNldFQpIDAgOiAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fZ3Q6Ci0JICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0KLQkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyID4gIHYgPyB+IChvZmZzZXRUKSAwIDogMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2xvZ2ljYWxfYW5kOgotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9IHJlc3VsdFAtPlhfYWRkX251bWJlciAmJiB2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fbG9naWNhbF9vcjoKLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPSByZXN1bHRQLT5YX2FkZF9udW1iZXIgfHwgdjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHJlc3VsdFAtPlhfb3AgPT0gT19zeW1ib2wKLQkgICAgICAgJiYgcmlnaHQuWF9vcCA9PSBPX3N5bWJvbAotCSAgICAgICAmJiAob3BfbGVmdCA9PSBPX2FkZAotCQkgICB8fCBvcF9sZWZ0ID09IE9fc3VidHJhY3QKLQkJICAgfHwgKHJlc3VsdFAtPlhfYWRkX251bWJlciA9PSAwCi0JCSAgICAgICAmJiByaWdodC5YX2FkZF9udW1iZXIgPT0gMCkpKQotCXsKLQkgIC8qIFN5bWJvbCBPUCBzeW1ib2wuICAqLwotCSAgcmVzdWx0UC0+WF9vcCA9IG9wX2xlZnQ7Ci0JICByZXN1bHRQLT5YX29wX3N5bWJvbCA9IHJpZ2h0LlhfYWRkX3N5bWJvbDsKLQkgIGlmIChvcF9sZWZ0ID09IE9fYWRkKQotCSAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgKz0gcmlnaHQuWF9hZGRfbnVtYmVyOwotCSAgZWxzZSBpZiAob3BfbGVmdCA9PSBPX3N1YnRyYWN0KQotCSAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgLT0gcmlnaHQuWF9hZGRfbnVtYmVyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGUgZ2VuZXJhbCBjYXNlLiAgKi8KLQkgIHJlc3VsdFAtPlhfYWRkX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKHJlc3VsdFApOwotCSAgcmVzdWx0UC0+WF9vcF9zeW1ib2wgPSBtYWtlX2V4cHJfc3ltYm9sICgmcmlnaHQpOwotCSAgcmVzdWx0UC0+WF9vcCA9IG9wX2xlZnQ7Ci0JICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgcmVzdWx0UC0+WF91bnNpZ25lZCA9IDE7Ci0JfQotCi0gICAgICBvcF9sZWZ0ID0gb3BfcmlnaHQ7Ci0gICAgfQkJCQkvKiBXaGlsZSBuZXh0IG9wZXJhdG9yIGlzID49IHRoaXMgcmFuay4gKi8KLQotICAvKiBUaGUgUEEgcG9ydCBuZWVkcyB0aGlzIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKHJlc3VsdFAtPlhfYWRkX3N5bWJvbCkKLSAgICByZXN1bHRQLT5YX2FkZF9zeW1ib2wtPnN5X3VzZWQgPSAxOwotCi0gIHJldHVybiByZXN1bHRQLT5YX29wID09IE9fY29uc3RhbnQgPyBhYnNvbHV0ZV9zZWN0aW9uIDogcmV0dmFsOwotfQotDAotLyoKLSAqCQkJZ2V0X3N5bWJvbF9lbmQoKQotICoKLSAqIFRoaXMgbGl2ZXMgaGVyZSBiZWNhdXNlIGl0IGJlbG9uZ3MgZXF1YWxseSBpbiBleHByLmMgJiByZWFkLmMuCi0gKiBFeHByLmMgaXMganVzdCBhIGJyYW5jaCBvZmZpY2UgcmVhZC5jIGFueXdheSwgYW5kIHB1dHRpbmcgaXQKLSAqIGhlcmUgbGVzc2VucyB0aGUgY3Jvd2QgYXQgcmVhZC5jLgotICoKLSAqIEFzc3VtZSBpbnB1dF9saW5lX3BvaW50ZXIgaXMgYXQgc3RhcnQgb2Ygc3ltYm9sIG5hbWUuCi0gKiBBZHZhbmNlIGlucHV0X2xpbmVfcG9pbnRlciBwYXN0IHN5bWJvbCBuYW1lLgotICogVHVybiB0aGF0IGNoYXJhY3RlciBpbnRvIGEgJ1wwJywgcmV0dXJuaW5nIGl0cyBmb3JtZXIgdmFsdWUuCi0gKiBUaGlzIGFsbG93cyBhIHN0cmluZyBjb21wYXJlIChSTVMgd2FudHMgc3ltYm9sIG5hbWVzIHRvIGJlIHN0cmluZ3MpCi0gKiBvZiB0aGUgc3ltYm9sIG5hbWUuCi0gKiBUaGVyZSB3aWxsIGFsd2F5cyBiZSBhIGNoYXIgZm9sbG93aW5nIHN5bWJvbCBuYW1lLCBiZWNhdXNlIGFsbCBnb29kCi0gKiBsaW5lcyBlbmQgaW4gZW5kLW9mLWxpbmUuCi0gKi8KLWNoYXIKLWdldF9zeW1ib2xfZW5kICgpCi17Ci0gIGNoYXIgYzsKLQotICAvKiBXZSBhY2NlcHQgXDAwMSBpbiBhIG5hbWUgaW4gY2FzZSB0aGlzIGlzIGJlaW5nIGNhbGxlZCB3aXRoIGEKLSAgICAgY29uc3RydWN0ZWQgc3RyaW5nLiAgKi8KLSAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspIHx8IGMgPT0gJ1wwMDEnKQotICAgIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspCi0JICAgfHwgYyA9PSAnXDAwMScpCi0gICAgICA7Ci0gICotLWlucHV0X2xpbmVfcG9pbnRlciA9IDA7Ci0gIHJldHVybiAoYyk7Ci19Ci0KLQotdW5zaWduZWQgaW50Ci1nZXRfc2luZ2xlX251bWJlciAoKQotewotICBleHByZXNzaW9uUyBleHA7Ci0gIG9wZXJhbmQgKCZleHApOwotICByZXR1cm4gZXhwLlhfYWRkX251bWJlcjsKLQotfQotCi0vKiBlbmQgb2YgZXhwci5jICovCmRpZmYgLS1naXQgYS9nYXMvZXhwci5oIGIvZ2FzL2V4cHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE5MDc0My4uMDAwMDAwMAotLS0gYS9nYXMvZXhwci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qIGV4cHIuaCAtPiBoZWFkZXIgZmlsZSBmb3IgZXhwci5jCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkyLTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogQnkgcG9wdWxhciBkZW1hbmQsIHdlIGRlZmluZSBhIHN0cnVjdCB0byByZXByZXNlbnQgYW4gZXhwcmVzc2lvbi4KLSAqIFRoaXMgd2lsbCBubyBkb3VidCBtdXRhdGUgYXMgZXhwcmVzc2lvbnMgYmVjb21lIGJhcm9xdWUuCi0gKgotICogQ3VycmVudGx5LCB3ZSBzdXBwb3J0IGV4cHJlc3Npb25zIGxpa2UgImZvbyBPUCBiYXIgKyA0MiIuICBJbiBvdGhlcgotICogd29yZHMgd2UgcGVybWl0IGEgKHBvc3NpYmx5IHVuZGVmaW5lZCkgc3ltYm9sLCBhIChwb3NzaWJseQotICogdW5kZWZpbmVkKSBzeW1ib2wgYW5kIHRoZSBvcGVyYXRpb24gdXNlZCB0byBjb21iaW5lIHRoZSBzeW1ib2xzLAotICogYW5kIGFuIChhYnNvbHV0ZSkgYXVnZW5kLiAgUk1TIHNheXMgdGhpcyBpcyBzbyB3ZSBjYW4gaGF2ZSAxLXBhc3MKLSAqIGFzc2VtYmx5IGZvciBhbnkgY29tcGlsZXIgZW1pc3Npb25zLCBhbmQgYSAnY2FzZScgc3RhdGVtZW50IG1pZ2h0Ci0gKiBlbWl0ICd1bmRlZmluZWQxIC0gdW5kZWZpbmVkMicuCi0gKgotICogVGhlIHR5cGUgb2YgYW4gZXhwcmVzc2lvbiB1c2VkIHRvIGJlIHN0b3JlZCBhcyBhIHNlZ21lbnQuICBUaGF0IGdvdAotICogY29uZnVzaW5nIGJlY2F1c2UgaXQgb3ZlcmxvYWRlZCB0aGUgY29uY2VwdCBvZiBhIHNlZ21lbnQuICBJIGFkZGVkCi0gKiBhbiBvcGVyYXRvciBmaWVsZCwgaW5zdGVhZC4KLSAqLwotCi0vKiBUaGlzIGlzIHRoZSB0eXBlIG9mIGFuIGV4cHJlc3Npb24uICBUaGUgb3BlcmF0b3IgdHlwZXMgYXJlIGFsc28KLSAgIHVzZWQgd2hpbGUgcGFyc2luZyBhbiBleHByZXNzaW9uLgotCi0gICBOT1RFOiBUaGlzIGVudW1lcmF0aW9uIG11c3QgbWF0Y2ggdGhlIG9wX3JhbmsgYXJyYXkgaW4gZXhwci5jLiAgKi8KLQotdHlwZWRlZiBlbnVtCi17Ci0gIC8qIEFuIGlsbGVnYWwgZXhwcmVzc2lvbi4gICovCi0gIE9faWxsZWdhbCwKLSAgLyogQSBub25leGlzdGVudCBleHByZXNzaW9uLiAgKi8KLSAgT19hYnNlbnQsCi0gIC8qIFhfYWRkX251bWJlciAoYSBjb25zdGFudCBleHByZXNzaW9uKS4gICovCi0gIE9fY29uc3RhbnQsCi0gIC8qIFhfYWRkX3N5bWJvbCArIFhfYWRkX251bWJlci4gICovCi0gIE9fc3ltYm9sLAotICAvKiBYX2FkZF9zeW1ib2wgKyBYX2FkZF9udW1iZXIgLSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBpbWFnZS4gICovCi0gIE9fc3ltYm9sX3J2YSwKLSAgLyogQSByZWdpc3RlciAoWF9hZGRfbnVtYmVyIGlzIHJlZ2lzdGVyIG51bWJlcikuICAqLwotICBPX3JlZ2lzdGVyLAotICAvKiBBIGJpZyB2YWx1ZS4gIElmIFhfYWRkX251bWJlciBpcyBuZWdhdGl2ZSBvciAwLCB0aGUgdmFsdWUgaXMgaW4KLSAgICAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuICBPdGhlcndpc2UgdGhlIHZhbHVlIGlzIGluCi0gICAgIGdlbmVyaWNfYmlnbnVtLCBhbmQgWF9hZGRfbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YgTElUVExFTlVNcyBpbgotICAgICB0aGUgdmFsdWUuICAqLwotICBPX2JpZywKLSAgLyogKC0gWF9hZGRfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fdW1pbnVzLAotICAvKiAofiBYX2FkZF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19iaXRfbm90LAotICAvKiAoISBYX2FkZF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19sb2dpY2FsX25vdCwKLSAgLyogKFhfYWRkX3N5bWJvbCAqIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fbXVsdGlwbHksCi0gIC8qIChYX2FkZF9zeW1ib2wgLyBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2RpdmlkZSwKLSAgLyogWF9hZGRfc3ltYm9sICUgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19tb2R1bHVzLAotICAvKiBYX2FkZF9zeW1ib2wgPDwgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19sZWZ0X3NoaWZ0LAotICAvKiBYX2FkZF9zeW1ib2wgPj4gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19yaWdodF9zaGlmdCwKLSAgLyogWF9hZGRfc3ltYm9sIHwgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19iaXRfaW5jbHVzaXZlX29yLAotICAvKiBYX2FkZF9zeW1ib2wgfH4gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19iaXRfb3Jfbm90LAotICAvKiBYX2FkZF9zeW1ib2wgXiBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2JpdF9leGNsdXNpdmVfb3IsCi0gIC8qIFhfYWRkX3N5bWJvbCAmIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fYml0X2FuZCwKLSAgLyogWF9hZGRfc3ltYm9sICsgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19hZGQsCi0gIC8qIFhfYWRkX3N5bWJvbCAtIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fc3VidHJhY3QsCi0gIC8qIChYX2FkZF9zeW1ib2wgPT0gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19lcSwKLSAgLyogKFhfYWRkX3N5bWJvbCAhPSBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX25lLAotICAvKiAoWF9hZGRfc3ltYm9sIDwgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19sdCwKLSAgLyogKFhfYWRkX3N5bWJvbCA8PSBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2xlLAotICAvKiAoWF9hZGRfc3ltYm9sID49IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fZ2UsCi0gIC8qIChYX2FkZF9zeW1ib2wgPiBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2d0LAotICAvKiAoWF9hZGRfc3ltYm9sICYmIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fbG9naWNhbF9hbmQsCi0gIC8qIChYX2FkZF9zeW1ib2wgfHwgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19sb2dpY2FsX29yLAotICAvKiB0aGlzIG11c3QgYmUgdGhlIGxhcmdlc3QgdmFsdWUgKi8KLSAgT19tYXgKLX0gb3BlcmF0b3JUOwotCi10eXBlZGVmIHN0cnVjdCBleHByZXNzaW9uUwotewotICAvKiBUaGUgbWFpbiBzeW1ib2wuICAqLwotICBzdHJ1Y3Qgc3ltYm9sICpYX2FkZF9zeW1ib2w7Ci0gIC8qIFRoZSBzZWNvbmQgc3ltYm9sLCBpZiBuZWVkZWQuICAqLwotICBzdHJ1Y3Qgc3ltYm9sICpYX29wX3N5bWJvbDsKLSAgLyogQSBudW1iZXIgdG8gYWRkLiAgKi8KLSAgb2Zmc2V0VCBYX2FkZF9udW1iZXI7Ci0gIC8qIFRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uLiAgV2UgY2FuJ3QgYXNzdW1lIHRoYXQgYW4gYXJiaXRyYXJ5Ci0gICAgIGNvbXBpbGVyIGNhbiBoYW5kbGUgYSBiaXRmaWVsZCBvZiBlbnVtIHR5cGUuICBGSVhNRTogV2UgY291bGQKLSAgICAgY2hlY2sgdGhpcyB1c2luZyBhdXRvY29uZi4gICovCi0jaWZkZWYgX19HTlVDX18KLSAgb3BlcmF0b3JUIFhfb3AgOiA1OwotI2Vsc2UKLSAgdW5zaWduZWQgWF9vcCA6IDU7Ci0jZW5kaWYKLSAgLyogTm9uLXplcm8gaWYgWF9hZGRfbnVtYmVyIHNob3VsZCBiZSByZWdhcmRlZCBhcyB1bnNpZ25lZC4gIFRoaXMgaXMKLSAgICAgb25seSB2YWxpZCBmb3IgT19jb25zdGFudCBleHByZXNzaW9ucy4gIEl0IGlzIG9ubHkgdXNlZCB3aGVuIGFuCi0gICAgIE9fY29uc3RhbnQgbXVzdCBiZSBleHRlbmRlZCBpbnRvIGEgYmlnbnVtIChpLmUuLCBpdCBpcyBub3QgdXNlZAotICAgICB3aGVuIHBlcmZvcm1pbmcgYXJpdGhtZXRpYyBvbiB0aGVzZSB2YWx1ZXMpLgotICAgICBGSVhNRTogVGhpcyBmaWVsZCBpcyBub3Qgc2V0IHZlcnkgcmVsaWFibHkuICAqLwotICB1bnNpZ25lZCBpbnQgWF91bnNpZ25lZCA6IDE7Ci19IGV4cHJlc3Npb25TOwotCi0vKiAicmVzdWx0IiBzaG91bGQgYmUgdHlwZSAoZXhwcmVzc2lvblMgKikuICovCi0jZGVmaW5lIGV4cHJlc3Npb24ocmVzdWx0KSBleHByICgwLCByZXN1bHQpCi0KLS8qIElmIGFuIGV4cHJlc3Npb24gaXMgT19iaWcsIGxvb2sgaGVyZSBmb3IgaXRzIHZhbHVlLiBUaGVzZSBjb21tb24KLSAgIGRhdGEgbWF5IGJlIGNsb2JiZXJlZCB3aGVuZXZlciBleHByKCkgaXMgY2FsbGVkLiAqLwotLyogRmxvbnVtcyByZXR1cm5lZCBoZXJlLiAgQmlnIGVub3VnaCB0byBob2xkIG1vc3QgcHJlY2lzZSBmbG9udW0uICovCi1leHRlcm4gRkxPTlVNX1RZUEUgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXI7Ci0vKiBCaWdudW1zIHJldHVybmVkIGhlcmUuICovCi1leHRlcm4gTElUVExFTlVNX1RZUEUgZ2VuZXJpY19iaWdudW1bXTsKLS8qIE51bWJlciBvZiBsaXR0bGVudW1zIGluIGFib3ZlLiAqLwotI2RlZmluZSBTSVpFX09GX0xBUkdFX05VTUJFUiAoMjApCi0KLXR5cGVkZWYgY2hhciBvcGVyYXRvcl9yYW5rVDsKLQotZXh0ZXJuIGNoYXIgZ2V0X3N5bWJvbF9lbmQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgZXhwcl9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBleHByX3NldF9wcmVjZWRlbmNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBzZWdUIGV4cHIgUEFSQU1TICgoaW50IHJhbmssIGV4cHJlc3Npb25TICogcmVzdWx0UCkpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBnZXRfc2luZ2xlX251bWJlciBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gc3RydWN0IHN5bWJvbCAqbWFrZV9leHByX3N5bWJvbCBQQVJBTVMgKChleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QKSk7Ci1leHRlcm4gaW50IGV4cHJfc3ltYm9sX3doZXJlCi0gIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKiwgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKLQotZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKiBleHByX2J1aWxkX3Vjb25zdGFudCBQQVJBTVMgKChvZmZzZXRUKSk7Ci1leHRlcm4gc3RydWN0IHN5bWJvbCAqIGV4cHJfYnVpbGRfdW5hcnkgUEFSQU1TICgob3BlcmF0b3JULCBzdHJ1Y3Qgc3ltYm9sICopKTsKLWV4dGVybiBzdHJ1Y3Qgc3ltYm9sICogZXhwcl9idWlsZF9iaW5hcnkKLSAgUEFSQU1TICgob3BlcmF0b3JULCBzdHJ1Y3Qgc3ltYm9sICosIHN0cnVjdCBzeW1ib2wgKikpOwotZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKiBleHByX2J1aWxkX2RvdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIGVuZCBvZiBleHByLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9mbG9udW0tY29weS5jIGIvZ2FzL2Zsb251bS1jb3B5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViY2M1Y2MuLjAwMDAwMDAKLS0tIGEvZ2FzL2Zsb251bS1jb3B5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiBmbG9udW1fY29weS5jIC0gY29weSBhIGZsb251bQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi12b2lkCi1mbG9udW1fY29weSAoaW4sIG91dCkKLSAgICAgRkxPTlVNX1RZUEUgKmluOwotICAgICBGTE9OVU1fVFlQRSAqb3V0OwotewotICB1bnNpZ25lZCBpbnQgaW5fbGVuZ3RoOwkJLyogMCBvcmlnaW4gKi8KLSAgdW5zaWduZWQgaW50IG91dF9sZW5ndGg7CQkvKiAwIG9yaWdpbiAqLwotCi0gIG91dC0+c2lnbiA9IGluLT5zaWduOwotICBpbl9sZW5ndGggPSBpbi0+bGVhZGVyIC0gaW4tPmxvdzsKLQotICBpZiAoaW4tPmxlYWRlciA8IGluLT5sb3cpCi0gICAgewotICAgICAgb3V0LT5sZWFkZXIgPSBvdXQtPmxvdyAtIDE7CS8qIDAuMCBjYXNlICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb3V0X2xlbmd0aCA9IG91dC0+aGlnaCAtIG91dC0+bG93OwotICAgICAgLyoKLSAgICAgICAqIEFzc3VtZSBubyBHQVBTIGluIHBhY2tpbmcgb2YgbGl0dGxlbnVtcy4KLSAgICAgICAqIEkuZS4gc2l6ZW9mKGFycmF5KSA9PSBzaXplb2YoZWxlbWVudCkgKiBudW1iZXJfb2ZfZWxlbWVudHMuCi0gICAgICAgKi8KLSAgICAgIGlmIChpbl9sZW5ndGggPD0gb3V0X2xlbmd0aCkKLQl7Ci0JICB7Ci0JICAgIC8qCi0JICAgICAqIEZvciBkZWZlbnNpdmUgcHJvZ3JhbW1pbmcsIHplcm8gYW55IGhpZ2gtb3JkZXIgbGl0dGxlbnVtcyB3ZSBkb24ndCBuZWVkLgotCSAgICAgKiBUaGlzIGlzIGRlc3Ryb3lpbmcgZXZpZGVuY2UgYW5kIHdhc3RpbmcgdGltZSwgc28gd2h5IGJvdGhlcj8/PwotCSAgICAgKi8KLQkgICAgaWYgKGluX2xlbmd0aCA8IG91dF9sZW5ndGgpCi0JICAgICAgewotCQltZW1zZXQgKChjaGFyICopIChvdXQtPmxvdyArIGluX2xlbmd0aCArIDEpLCAnXDAnLCBvdXRfbGVuZ3RoIC0gaW5fbGVuZ3RoKTsKLQkgICAgICB9Ci0JICB9Ci0JICBtZW1jcHkgKCh2b2lkICopIChvdXQtPmxvdyksICh2b2lkICopIChpbi0+bG93KSwgKChpbl9sZW5ndGggKyAxKSAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKSk7Ci0JICBvdXQtPmV4cG9uZW50ID0gaW4tPmV4cG9uZW50OwotCSAgb3V0LT5sZWFkZXIgPSBpbi0+bGVhZGVyIC0gaW4tPmxvdyArIG91dC0+bG93OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgc2hvcnRlbjsJCS8qIDEtb3JpZ2luLiBOdW1iZXIgb2YgbGl0dGxlbnVtcyB3ZSBkcm9wLiAqLwotCi0JICBzaG9ydGVuID0gaW5fbGVuZ3RoIC0gb3V0X2xlbmd0aDsKLQkgIC8qIEFzc3VtZSBvdXRfbGVuZ3RoID49IDAgISAqLwotCSAgbWVtY3B5ICgodm9pZCAqKSAob3V0LT5sb3cpLCAodm9pZCAqKSAoaW4tPmxvdyArIHNob3J0ZW4pLCAoKG91dF9sZW5ndGggKyAxKSAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKSk7Ci0JICBvdXQtPmxlYWRlciA9IG91dC0+aGlnaDsKLQkgIG91dC0+ZXhwb25lbnQgPSBpbi0+ZXhwb25lbnQgKyBzaG9ydGVuOwotCX0KLSAgICB9CQkJCS8qIGlmIGFueSBzaWduaWZpY2FudCBiaXRzICovCi19CQkJCS8qIGZsb251bV9jb3B5KCkgKi8KLQotLyogZW5kIG9mIGZsb251bV9jb3B5LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9mbG9udW0ta29uc3QuYyBiL2dhcy9mbG9udW0ta29uc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiYmEwNS4uMDAwMDAwMAotLS0gYS9nYXMvZmxvbnVtLWtvbnN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyogZmxvbnVtX2NvbnN0LmMgLSBVc2VmdWwgRmxvbnVtIGNvbnN0YW50cwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSAiZmxvbnVtLmgiCi0vKiBKRjogIEkgYWRkZWQgdGhlIGxhc3QgZW50cnkgdG8gdGhpcyB0YWJsZSwgYW5kIEknbSBub3QKLSAgIHN1cmUgaWYgaXRzIHJpZ2h0IG9yIG5vdC4gIENvdWxkIGdvIGVpdGhlciB3YXkuICBJIHdpc2gKLSAgIEkgcmVhbGx5IHVuZGVyc3Rvb2QgdGhpcyBzdHVmZi4gKi8KLQotCi1jb25zdCBpbnQgdGFibGVfc2l6ZV9vZl9mbG9udW1fcG93ZXJzX29mX3RlbiA9IDEzOwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgemVyb1tdID0KLXsxfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJCQkJCQkJCQkqCi0gKglXYXJuaW5nOiB0aGUgbG93IG9yZGVyIGJpdHMgbWF5IGJlIFdST05HIGhlcmUuCQkJKgotICoJSSB0b29rIHRoaXMgZnJvbSBhIHN1c3BlY3QgYmMoMSkgc2NyaXB0LgkJCSoKLSAqCSJtaW51c19YIltdIGlzIHN1cHBvc2VkIHRvIGJlIDEwXigyXi1YKSBleHByZXNzZWQgaW4gYmFzZSAyXjE2LgkqCi0gKglUaGUgcmFkaXggcG9pbnQgaXMganVzdCBBRlRFUiB0aGUgaGlnaGVzdCBlbGVtZW50IG9mIHRoZSBbXQkqCi0gKgkJCQkJCQkJCSoKLSAqCUJlY2F1c2UgYmMgcm91bmRzIERPV04gZm9yIHByaW50aW5nIChJIHRoaW5rKSwgdGhlIGxvd2VzdAkqCi0gKglzaWduaWZpY2FuY2UgbGl0dGxlbnVtcyBzaG91bGQgcHJvYmFibHkgaGF2ZSAxIGFkZGVkIHRvIHRoZW0uCSoKLSAqCQkJCQkJCQkJKgotIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogSkY6ICBJZiB0aGlzIGVxdWFscyA2NTUzLygyXjE2KSszOTMyMS8oMl4zMikrLi4uICBpdCBhcHByb2FjaGVzIC4xICovCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfMVtdID0KLXsKLSAgMzkzMjIsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsCi0gIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDY1NTN9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfMVtdID0KLXsxMH07Ci0KLS8qIEpGOiAgSWYgdGhpcyBlcXVhbHMgNjU1LygyXjE2KSArIDIzNTkyLygyXjMyKSArIC4uLiBpdCBhcHByb2FjaGVzIC4wMSAqLwotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzJbXSA9Ci17Ci0gIDEwNDg2LCAzNjcwMCwgNjI5MTQsIDIzNTkyLCA0OTgwNywgMTA0ODUsIDM2NzAwLCA2MjkxNCwgMjM1OTIsIDQ5ODA3LAotICAxMDQ4NSwgMzY3MDAsIDYyOTE0LCAyMzU5MiwgNDk4MDcsIDEwNDg1LCAzNjcwMCwgNjI5MTQsIDIzNTkyLCA2NTV9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfMltdID0KLXsxMDB9OwotCi0vKiBUaGlzIGFwcHJvYWNoZXMgLjAwMDEgKi8KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c18zW10gPQotewotICA1MjUzNCwgMjAwMjcsIDM3MzI5LCA2NTExNiwgNjQwNjcsIDYwMzk3LCAxNDc4NCwgMTg5NzksIDMzNjU5LCAxOTUwMywKLSAgMjcyNiwgOTU0MiwgNjI5LCAyMjAyLCA0MDQ3NSwgMTA1OTAsIDQyOTksIDQ3ODE1LCAzNjI4MCwgNn07Ci1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c18zW10gPQotezEwMDAwfTsKLQotLyogSkY6IHRoaXMgYXBwcm9hY2hlcyAxZS04ICovCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfNFtdID0KLXsKLSAgMjI1MTcsIDQ5NTAxLCA1NDI5MywgMTk0MjQsIDYwNjk5LCA2NzE2LCAyNDM0OCwgMjI2MTgsIDIzOTA0LCAyMTMyNywKLSAgMzkxOSwgNDQ3MDMsIDE5MTQ5LCAyODgwMywgNDg5NTksIDYyNTksIDUwMjczLCA2MjIzNywgNDJ9OwotLyogVGhpcyBlcXVhbHMgMTUyNSAqIDJeMTYgKyA1NzYwMCAqLwotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfNFtdID0KLXs1NzYwMCwgMTUyNX07Ci0KLS8qIFRoaXMgYXBwcm9hY2hlcyAxZS0xNiAqLwotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzVbXSA9Ci17Ci0gIDIyMTk5LCA0NTk1NywgMTcwMDUsIDI2MjY2LCAxMDUyNiwgMTYyNjAsIDU1MDE3LCAzNTY4MCwgNDA0NDMsIDE5Nzg5LAotICAxNzM1NiwgMzAxOTUsIDU1OTA1LCAyODQyNiwgNjMwMTAsIDQ0MTk3LCAxODQ0fTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzVbXSA9Ci17Mjg2MDksIDM0NTQ2LCAzNX07Ci0KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c182W10gPQotewotICAzMDkyNiwgMjY1MTgsIDEzMTEwLCA0MzAxOCwgNTQ5ODIsIDQ4MjU4LCAyNDY1OCwgMTUyMDksIDYzMzY2LCAxMTkyOSwKLSAgMjAwNjksIDQzODU3LCA2MDQ4NywgNTF9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfNltdID0KLXs2MTMxMywgMzQyMjAsIDE2NzMxLCAxMTYyOSwgMTI2Mn07Ci0KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c183W10gPQotewotICAyOTgxOSwgMTQ3MzMsIDIxNDkwLCA0MDYwMiwgMzEzMTUsIDY1MTg2LCAyNjk1fTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzdbXSA9Ci17Ci0gIDc5MzcsIDQ5MDAyLCA2MDc3MiwgMjgyMTYsIDM4ODkzLCA1NTk3NSwgNjM5ODgsIDU5NzExLCAyMDIyNywgMjR9OwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfOFtdID0KLXsKLSAgMjc1NzksIDY0ODA3LCAxMjU0MywgNzk0LCAxMzkwNywgNjEyOTcsIDEyMDEzLCA2NDM2MCwgMTU5NjEsIDIwNTY2LAotICAyNDE3OCwgMTU5MjIsIDU5NDI3LCAxMTB9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfOFtdID0KLXsKLSAgMTU4NzMsIDExOTI1LCAzOTE3NywgOTkxLCAxNDU4OSwgMzg2MSwgNTg0MTUsIDkwNzYsIDYyOTU2LCA1NDIyMywKLSAgNTYzMjgsIDUwMTgwLCA0NTI3NCwgNDgzMzMsIDMyNTM3LCA0MjU0NywgOTczMSwgNTk2NzksIDU5MH07Ci0KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c185W10gPQotewotICAxMTA0MiwgODQ2NCwgNTg5NzEsIDYzNDI5LCA2MDIyLCA2MzQ4NSwgNTUwMCwgNTM0NjQsIDQ3NTQ1LCA1MDA2OCwKLSAgNTY5ODgsIDIyODE5LCA0OTcwOCwgNTQ0OTMsIDk5MjAsIDQ3NjY3LCA0MDQwOSwgMzU3NjQsIDEwMzgzLCA1NDQ2NiwKLSAgMzI3MDIsIDE3NDkzLCAzMjQyMCwgMzQzODIsIDIyNzUwLCAyMDY4MSwgMTIzMDB9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfOVtdID0KLXsKLSAgMjA2NzgsIDI3NjE0LCAyODI3MiwgNTMwNjYsIDU1MzExLCA1NDY3NywgMjkwMzgsIDk5MDYsIDI2Mjg4LCA0NDQ4NiwKLSAgMTM4NjAsIDc0NDUsIDU0MTA2LCAxNTQyNiwgMjE1MTgsIDI1NTk5LCAyOTYzMiwgNTIzMDksIDYxMjA3LCAyNjEwNSwKLSAgMTA0ODIsIDIxOTQ4LCA1MTE5MSwgMzI5ODgsIDYwODkyLCA2MjU3NCwgNjEzOTAsIDI0NTQwLCAyMTQ5NSwgNX07Ci0KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c18xMFtdID0KLXsKLSAgNjIxNCwgNDg3NzEsIDIzNDcxLCAzMDE2MywgMzE3NjMsIDM4MDEzLCA1NzAwMSwgMTE3NzAsIDE4MjYzLCAzNjM2NiwKLSAgMjA3NDIsIDQ1MDg2LCA1Njk2OSwgNTMyMzEsIDM3ODU2LCA1NTgxNCwgMzgwNTcsIDE1NjkyLCA0Njc2MSwgODcxMywKLSAgNjEwMiwgMjAwODMsIDgyNjksIDExODM5LCAxMTU3MSwgNTA5NjMsIDE1NjQ5LCAxMTY5OCwgNDA2NzUsIDIzMDh9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfMTBbXSA9Ci17Ci0gIDYzODM5LCAzNjU3NiwgNDU3MTIsIDQ0NTE2LCAzNzgwMywgMjk0ODIsIDQ5NjYsIDMwNTU2LCAzNzk2MSwgMjMzMTAsCi0gIDI3MDcwLCA0NDk3MiwgMjk1MDcsIDQ4MjU3LCA0NTIwOSwgNzQ5NCwgMTc4MzEsIDM4NzI4LCA0MTU3NywgMjk0NDMsCi0gIDM2MDE2LCA3OTU1LCAzNTMzOSwgMzU0NzksIDM2MDExLCAxNDU1MywgNDk2MTgsIDU1ODgsIDI1Mzk2LCAyOH07Ci0KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c18xMVtdID0KLXsKLSAgMTY2NjMsIDU2ODgyLCA2MTk4MywgNzgwNCwgMzY1NTUsIDMyMDYwLCAzNDUwMiwgMTAwMCwgMTQzNTYsIDIxNjgxLAotICA2NjA1LCAzNDc2NywgNTE0MTEsIDU5MDQ4LCA1MzYxNCwgMzk4NTAsIDMwMDc5LCA2NDk2LCA2ODQ2LCAyNjg0MSwKLSAgNDA3NzgsIDE5NTc4LCA1OTg5OSwgNDQwODUsIDU0MDE2LCAyNDI1OSwgMTEyMzIsIDIxMjI5LCAyMTMxMywgODF9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfMTFbXSA9Ci17Ci0gIDkyLCA5MDU0LCA2MjcwNywgMTc5OTMsIDc4MjEsIDU2ODM4LCAxMzk5MiwgMjEzMjEsIDI5NjM3LCA0ODQyNiwKLSAgNDI5ODIsIDM4NjY4LCA0OTU3NCwgMjg4MjAsIDE4MjAwLCAxODkyNywgNTM5NzksIDE2MjE5LCAzNzQ4NCwgMjUxNiwKLSAgNDQ2NDIsIDE0NjY1LCAxMTU4NywgNDE5MjYsIDEzNTU2LCAyMzk1NiwgNTQzMjAsIDY2NjEsIDU1NzY2LCA4MDV9OwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfMTJbXSA9Ci17Ci0gIDMzMjAyLCA0NTk2OSwgNTg4MDQsIDU2NzM0LCAxNjQ4MiwgMjYwMDcsIDQ0OTg0LCA0OTMzNCwgMzEwMDcsIDMyOTQ0LAotICA0NDUxNywgNjMzMjksIDQ3MTMxLCAxNTI5MSwgNTk0NjUsIDIyNjQsIDIzMjE4LCAxMTgyOSwgNTk3NzEsIDM4Nzk4LAotICAzMTA1MSwgMjg3NDgsIDIzMTI5LCA0MDU0MSwgNDE1NjIsIDM1MTA4LCA1MDYyMCwgNTkwMTQsIDUxODE3LCA2NjEzfTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzEyW10gPQotewotICAxMDA5OCwgMzc5MjIsIDU4MDcwLCA3NDMyLCAxMDQ3MCwgNjM0NjUsIDIzNzE4LCA2MjE5MCwgNDc0MjAsIDcwMDksCi0gIDM4NDQzLCA0NTg3LCA0NTU5NiwgMzg0NzIsIDUyMTI5LCA1Mjc3OSwgMjkwMTIsIDEzNTU5LCA0ODY4OCwgMzE2NzgsCi0gIDQxNzUzLCA1ODY2MiwgMTA2NjgsIDM2MDY3LCAyOTkwNiwgNTY5MDYsIDIxNDYxLCA0NjU1NiwgNTk1NzEsIDl9OwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfMTNbXSA9Ci17Ci0gIDQ1MzA5LCAyNzU5MiwgMzcxNDQsIDM0NjM3LCAzNDMyOCwgNDE2NzEsIDM0NjIwLCAyNDEzNSwgNTM0MDEsIDIyMTEyLAotICAyMTU3NiwgNDUxNDcsIDM5MzEwLCA0NDA1MSwgNDg1NzIsIDM2NzYsIDQ2NTQ0LCA1OTc2OCwgMzMzNTAsIDIzMjMsCi0gIDQ5NTI0LCA2MTU2OCwgMzkwMywgMzY0ODcsIDM2MzU2LCAzMDkwMywgMTQ5NzUsIDkwMzUsIDI5NzE1LCA2Njd9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfMTNbXSA9Ci17Ci0gIDE4Nzg4LCAxNjk2MCwgNjMxOCwgNDU2ODUsIDU1NDAwLCA0NjIzMCwgMzU3OTQsIDI1NTg4LCA3MjUzLCA1NTU0MSwKLSAgNDk3MTYsIDU5NzYwLCA2MzU5MiwgODE5MSwgNjM3NjUsIDU4NTMwLCA0NDY2NywgMTMyOTQsIDEwMDAxLCA1NTU4NiwKLSAgNDc4ODcsIDE4NzM4LCA5NTA5LCA0MDg5NiwgNDI1MDYsIDUyNTgwLCA0MTcxLCAzMjUsIDEyMzI5LCA5OH07Ci0KLS8qIFNodXQgdXAgY29tcGxhaW50cyBhYm91dCBkaWZmZXJpbmcgcG9pbnRlciB0eXBlcy4gIFRoZXkgb25seSBkaWZmZXIKLSAgIGluIHRoZSBjb25zdCBhdHRyaWJ1dGUsIGJ1dCB0aGVyZSBpc24ndCBhbnkgZWFzeSB3YXkgdG8gZG8gdGhpcwotICAgKi8KLSNkZWZpbmUgWCAoTElUVExFTlVNX1RZUEUgKikKLQotY29uc3QgRkxPTlVNX1RZUEUgZmxvbnVtX25lZ2F0aXZlX3Bvd2Vyc19vZl90ZW5bXSA9Ci17Ci0gIHtYIHplcm8sIFggemVybywgWCB6ZXJvLCAwLCAnKyd9LAotICB7WCBtaW51c18xLCBYIG1pbnVzXzEgKyAxOSwgWCBtaW51c18xICsgMTksIC0yMCwgJysnfSwKLSAge1ggbWludXNfMiwgWCBtaW51c18yICsgMTksIFggbWludXNfMiArIDE5LCAtMjAsICcrJ30sCi0gIHtYIG1pbnVzXzMsIFggbWludXNfMyArIDE5LCBYIG1pbnVzXzMgKyAxOSwgLTIwLCAnKyd9LAotICB7WCBtaW51c180LCBYIG1pbnVzXzQgKyAxOCwgWCBtaW51c180ICsgMTgsIC0yMCwgJysnfSwKLSAge1ggbWludXNfNSwgWCBtaW51c181ICsgMTYsIFggbWludXNfNSArIDE2LCAtMjAsICcrJ30sCi0gIHtYIG1pbnVzXzYsIFggbWludXNfNiArIDEzLCBYIG1pbnVzXzYgKyAxMywgLTIwLCAnKyd9LAotICB7WCBtaW51c183LCBYIG1pbnVzXzcgKyA2LCBYIG1pbnVzXzcgKyA2LCAtMjAsICcrJ30sCi0gIHtYIG1pbnVzXzgsIFggbWludXNfOCArIDEzLCBYIG1pbnVzXzggKyAxMywgLTQwLCAnKyd9LAotICB7WCBtaW51c185LCBYIG1pbnVzXzkgKyAyNiwgWCBtaW51c185ICsgMjYsIC04MCwgJysnfSwKLSAge1ggbWludXNfMTAsIFggbWludXNfMTAgKyAyOSwgWCBtaW51c18xMCArIDI5LCAtMTM2LCAnKyd9LAotICB7WCBtaW51c18xMSwgWCBtaW51c18xMSArIDI5LCBYIG1pbnVzXzExICsgMjksIC0yNDIsICcrJ30sCi0gIHtYIG1pbnVzXzEyLCBYIG1pbnVzXzEyICsgMjksIFggbWludXNfMTIgKyAyOSwgLTQ1NSwgJysnfSwKLSAge1ggbWludXNfMTMsIFggbWludXNfMTMgKyAyOSwgWCBtaW51c18xMyArIDI5LCAtODgwLCAnKyd9LAotfTsKLQotY29uc3QgRkxPTlVNX1RZUEUgZmxvbnVtX3Bvc2l0aXZlX3Bvd2Vyc19vZl90ZW5bXSA9Ci17Ci0gIHtYIHplcm8sIFggemVybywgWCB6ZXJvLCAwLCAnKyd9LAotICB7WCBwbHVzXzEsIFggcGx1c18xICsgMCwgWCBwbHVzXzEgKyAwLCAwLCAnKyd9LAotICB7WCBwbHVzXzIsIFggcGx1c18yICsgMCwgWCBwbHVzXzIgKyAwLCAwLCAnKyd9LAotICB7WCBwbHVzXzMsIFggcGx1c18zICsgMCwgWCBwbHVzXzMgKyAwLCAwLCAnKyd9LAotICB7WCBwbHVzXzQsIFggcGx1c180ICsgMSwgWCBwbHVzXzQgKyAxLCAwLCAnKyd9LAotICB7WCBwbHVzXzUsIFggcGx1c181ICsgMiwgWCBwbHVzXzUgKyAyLCAxLCAnKyd9LAotICB7WCBwbHVzXzYsIFggcGx1c182ICsgNCwgWCBwbHVzXzYgKyA0LCAyLCAnKyd9LAotICB7WCBwbHVzXzcsIFggcGx1c183ICsgOSwgWCBwbHVzXzcgKyA5LCA0LCAnKyd9LAotICB7WCBwbHVzXzgsIFggcGx1c184ICsgMTgsIFggcGx1c184ICsgMTgsIDgsICcrJ30sCi0gIHtYIHBsdXNfOSwgWCBwbHVzXzkgKyAyOSwgWCBwbHVzXzkgKyAyOSwgMjQsICcrJ30sCi0gIHtYIHBsdXNfMTAsIFggcGx1c18xMCArIDI5LCBYIHBsdXNfMTAgKyAyOSwgNzcsICcrJ30sCi0gIHtYIHBsdXNfMTEsIFggcGx1c18xMSArIDI5LCBYIHBsdXNfMTEgKyAyOSwgMTgzLCAnKyd9LAotICB7WCBwbHVzXzEyLCBYIHBsdXNfMTIgKyAyOSwgWCBwbHVzXzEyICsgMjksIDM5NiwgJysnfSwKLSAge1ggcGx1c18xMywgWCBwbHVzXzEzICsgMjksIFggcGx1c18xMyArIDI5LCA4MjEsICcrJ30sCi19OwotCi0jaWZkZWYgVk1TCi12b2lkIGR1bW15MSAoKSB7IH0KLSNlbmRpZgotLyogZW5kIG9mIGZsb251bV9jb25zdC5jICovCmRpZmYgLS1naXQgYS9nYXMvZmxvbnVtLW11bHQuYyBiL2dhcy9mbG9udW0tbXVsdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzRhNzNiLi4wMDAwMDAwCi0tLSBhL2dhcy9mbG9udW0tbXVsdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qIGZsb251bV9tdWx0LmMgLSBtdWx0aXBseSB0d28gZmxvbnVtcwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHYXMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBUaGUgR05VIGFzc2VtYmxlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLSAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLiAgTm8gYXV0aG9yIG9yIGRpc3RyaWJ1dG9yCi0gICBhY2NlcHRzIHJlc3BvbnNpYmlsaXR5IHRvIGFueW9uZSBmb3IgdGhlIGNvbnNlcXVlbmNlcyBvZiB1c2luZyBpdAotICAgb3IgZm9yIHdoZXRoZXIgaXQgc2VydmVzIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igd29ya3MgYXQgYWxsLAotICAgdW5sZXNzIGhlIHNheXMgc28gaW4gd3JpdGluZy4gIFJlZmVyIHRvIHRoZSBHTlUgQXNzZW1ibGVyIEdlbmVyYWwKLSAgIFB1YmxpYyBMaWNlbnNlIGZvciBmdWxsIGRldGFpbHMuCi0KLSAgIEV2ZXJ5b25lIGlzIGdyYW50ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZQotICAgdGhlIEdOVSBBc3NlbWJsZXIsIGJ1dCBvbmx5IHVuZGVyIHRoZSBjb25kaXRpb25zIGRlc2NyaWJlZCBpbiB0aGUKLSAgIEdOVSBBc3NlbWJsZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEEgY29weSBvZiB0aGlzIGxpY2Vuc2UgaXMKLSAgIHN1cHBvc2VkIHRvIGhhdmUgYmVlbiBnaXZlbiB0byB5b3UgYWxvbmcgd2l0aCB0aGUgR05VIEFzc2VtYmxlcgotICAgc28geW91IGNhbiBrbm93IHlvdXIgcmlnaHRzIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgSXQgc2hvdWxkIGJlCi0gICBpbiBhIGZpbGUgbmFtZWQgQ09QWUlORy4gIEFtb25nIG90aGVyIHRoaW5ncywgdGhlIGNvcHlyaWdodAotICAgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBtdXN0IGJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLiAgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSAiZmxvbnVtLmgiCi0KLS8qCXBsYW4gZm9yIGEgLiBiID0+IHAocm9kdWN0KQotCQotCQotCSstLS0tLS0tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0tLS0tLS0rCi0JfCBhCXwgYQl8ICAuLi4JfCBhCXwgYQl8Ci0JfCAgQQl8ICBBLTEJfAl8ICAxCXwgIDAJfAotCSstLS0tLS0tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0tLS0tLS0rCi0JCi0JCi0JKy0tLS0tLS0rLS0tLS0tLSstLyAgIC8tKy0tLS0tLS0rLS0tLS0tLSsKLQl8IGIJfCBiCXwgIC4uLgl8IGIJfCBiCXwKLQl8ICBCCXwgIEItMQl8CXwgIDEJfCAgMAl8Ci0JKy0tLS0tLS0rLS0tLS0tLSstLyAgIC8tKy0tLS0tLS0rLS0tLS0tLSsKLQkKLQkKLQkrLS0tLS0tLSstLS0tLS0tKy0vICAgLy0rLS0tLS0tLSstLyAgIC8tKy0tLS0tLS0rLS0tLS0tLSsKLQl8IHAJfCBwCXwgIC4uLgl8IHAJfCAgLi4uCXwgcAl8IHAJfAotCXwgIEErQisxfCAgQStCCXwJfCAgTgl8CXwgIDEJfCAgMAl8Ci0JKy0tLS0tLS0rLS0tLS0tLSstLyAgIC8tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0tLS0tLS0rCi0JCi0JL15cCi0JKGNhcnJ5KSBhIC5iCSAgIC4uLgkgICAgfAkgICAuLi4JIGEgLmIJIGEgLmIKLQlBICBCIAkJICAgIHwJCSAgMCAgMQkgIDAgIDAKLQl8Ci0JLi4uCSAgICB8CSAgIC4uLgkgYSAuYgotCXwJCSAgMSAgMAotCXwKLQl8CSAgIC4uLgotCXwKLQl8Ci0JfAotCXwJCSAgX19fCi0JfAkJICBcCi0JKy0tLS0tICBQICA9ICAgPiAgYSAuYgotCU4JICAvX18gIGkgIGoKLQkKLQlOID0gMCAuLi4gQStCCi0JCi0JZm9yIGFsbCBpLGogd2hlcmUgaStqPU4KLQlbaSxqIGludGVnZXJzID4gMF0KLQkKLQlhW10sIGJbXSwgcFtdIG1heSBub3QgaW50ZXJzZWN0LgotCVplcm8gbGVuZ3RoIGZhY3RvcnMgc2lnbmlmeSAwIHNpZ25pZmljYW50IGJpdHM6IHRyZWF0IGFzIDAuMC4KLQkwLjAgZmFjdG9ycyBkbyB0aGUgcmlnaHQgdGhpbmcuCi0JWmVybyBsZW5ndGggcHJvZHVjdCBPSy4KLQkKLQlJIGNob3NlIHRoZSBGb3JUcmFuIGFjY2VudCAiZm9vW2Jhcl0iIGluc3RlYWQgb2YgdGhlIEMgYWNjZW50ICIqZ2FycGx5IgotCWJlY2F1c2UgSSBmZWx0IHRoZSBGb3JUcmFuIHdheSB3YXMgbW9yZSBpbnR1aXRpdmUuIFRoZSBDIHdheSB3b3VsZAotCXByb2JhYmx5IHlpZWxkIGJldHRlciBjb2RlIG9uIG1vc3QgQyBjb21waWxlcnMuIERlYW4gRWxzbmVyLgotCShDIHN0eWxlIGFsc28gZ2l2ZXMgZGVlcGVyIGluc2lnaHQgW3RvIG1lXSAuLi4gb2ggd2VsbCAuLi4pCi0JKi8KLQwKLXZvaWQgCi1mbG9udW1fbXVsdGlwIChhLCBiLCBwcm9kdWN0KQotICAgICBjb25zdCBGTE9OVU1fVFlQRSAqYTsKLSAgICAgY29uc3QgRkxPTlVNX1RZUEUgKmI7Ci0gICAgIEZMT05VTV9UWVBFICpwcm9kdWN0OwotewotICBpbnQgc2l6ZV9vZl9hOwkJLyogMCBvcmlnaW4gKi8KLSAgaW50IHNpemVfb2ZfYjsJCS8qIDAgb3JpZ2luICovCi0gIGludCBzaXplX29mX3Byb2R1Y3Q7CQkvKiAwIG9yaWdpbiAqLwotICBpbnQgc2l6ZV9vZl9zdW07CQkvKiAwIG9yaWdpbiAqLwotICBpbnQgZXh0cmFfcHJvZHVjdF9wb3NpdGlvbnM7CS8qIDEgb3JpZ2luICovCi0gIHVuc2lnbmVkIGxvbmcgd29yazsKLSAgdW5zaWduZWQgbG9uZyBjYXJyeTsKLSAgbG9uZyBleHBvbmVudDsKLSAgTElUVExFTlVNX1RZUEUgKnE7Ci0gIGxvbmcgc2lnbmlmaWNhbnQ7CQkvKiBUUlVFIHdoZW4gd2UgZW1pdCBhIG5vbi0wIGxpdHRsZW51bSAgKi8KLSAgLyogRm9yVHJhbiBhY2NlbnQgZm9sbG93cy4gKi8KLSAgaW50IFA7CQkJLyogU2NhbiBwcm9kdWN0IGxvdy1vcmRlciAtPiBoaWdoLiAqLwotICBpbnQgTjsJCQkvKiBBcyBpbiBzdW0gYWJvdmUuICAqLwotICBpbnQgQTsJCQkvKiBXaGljaCBbXSBvZiBhPyAqLwotICBpbnQgQjsJCQkvKiBXaGljaCBbXSBvZiBiPyAqLwotCi0gIGlmICgoYS0+c2lnbiAhPSAnLScgJiYgYS0+c2lnbiAhPSAnKycpIHx8IChiLT5zaWduICE9ICctJyAmJiBiLT5zaWduICE9ICcrJykpCi0gICAgewotICAgICAgLyogLi4uCi0JCSAgIEdvdCB0byBmYWlsIHNvbWVob3cuICBBbnkgc3VnZ2VzdGlvbnM/ICovCi0gICAgICBwcm9kdWN0LT5zaWduID0gMDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHByb2R1Y3QtPnNpZ24gPSAoYS0+c2lnbiA9PSBiLT5zaWduKSA/ICcrJyA6ICctJzsKLSAgc2l6ZV9vZl9hID0gYS0+bGVhZGVyIC0gYS0+bG93OwotICBzaXplX29mX2IgPSBiLT5sZWFkZXIgLSBiLT5sb3c7Ci0gIGV4cG9uZW50ID0gYS0+ZXhwb25lbnQgKyBiLT5leHBvbmVudDsKLSAgc2l6ZV9vZl9wcm9kdWN0ID0gcHJvZHVjdC0+aGlnaCAtIHByb2R1Y3QtPmxvdzsKLSAgc2l6ZV9vZl9zdW0gPSBzaXplX29mX2EgKyBzaXplX29mX2I7Ci0gIGV4dHJhX3Byb2R1Y3RfcG9zaXRpb25zID0gc2l6ZV9vZl9wcm9kdWN0IC0gc2l6ZV9vZl9zdW07Ci0gIGlmIChleHRyYV9wcm9kdWN0X3Bvc2l0aW9ucyA8IDApCi0gICAgewotICAgICAgUCA9IGV4dHJhX3Byb2R1Y3RfcG9zaXRpb25zOwkvKiBQIDwgMCAqLwotICAgICAgZXhwb25lbnQgLT0gZXh0cmFfcHJvZHVjdF9wb3NpdGlvbnM7CS8qIEluY3JlYXNlcyBleHBvbmVudC4gKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBQID0gMDsKLSAgICB9Ci0gIGNhcnJ5ID0gMDsKLSAgc2lnbmlmaWNhbnQgPSAwOwotICBmb3IgKE4gPSAwOyBOIDw9IHNpemVfb2Zfc3VtOyBOKyspCi0gICAgewotICAgICAgd29yayA9IGNhcnJ5OwotICAgICAgY2FycnkgPSAwOwotICAgICAgZm9yIChBID0gMDsgQSA8PSBOOyBBKyspCi0JewotCSAgQiA9IE4gLSBBOwotCSAgaWYgKEEgPD0gc2l6ZV9vZl9hICYmIEIgPD0gc2l6ZV9vZl9iICYmIEIgPj0gMCkKLQkgICAgewotI2lmZGVmIFRSQUNFCi0JICAgICAgcHJpbnRmICgiYTpsb3dbJWQuXT0lMDR4IGI6bG93WyVkLl09JTA0eCB3b3JrX2JlZm9yZT0lMDh4XG4iLCBBLCBhLT5sb3dbQV0sIEIsIGItPmxvd1tCXSwgd29yayk7Ci0jZW5kaWYKLQkgICAgICAvKiBXYXRjaCBvdXQgZm9yIHNpZ24gZXh0ZW5zaW9uISAgV2l0aG91dCB0aGUgY2FzdHMsIG9uCi0JCSB0aGUgREVDIEFscGhhLCB0aGUgbXVsdGlwbGljYXRpb24gcmVzdWx0IGlzICpzaWduZWQqCi0JCSBpbnQsIHdoaWNoIGdldHMgc2lnbi1leHRlbmRlZCB0byBjb252ZXJ0IHRvIHRoZQotCQkgdW5zaWduZWQgbG9uZyEgICovCi0JICAgICAgd29yayArPSAodW5zaWduZWQgbG9uZykgYS0+bG93W0FdICogKHVuc2lnbmVkIGxvbmcpIGItPmxvd1tCXTsKLQkgICAgICBjYXJyeSArPSB3b3JrID4+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgICAgICB3b3JrICY9IExJVFRMRU5VTV9NQVNLOwotI2lmZGVmIFRSQUNFCi0JICAgICAgcHJpbnRmICgid29yaz0lMDh4IGNhcnJ5PSUwNHhcbiIsIHdvcmssIGNhcnJ5KTsKLSNlbmRpZgotCSAgICB9Ci0JfQotICAgICAgc2lnbmlmaWNhbnQgfD0gd29yazsKLSAgICAgIGlmIChzaWduaWZpY2FudCB8fCBQIDwgMCkKLQl7Ci0JICBpZiAoUCA+PSAwKQotCSAgICB7Ci0JICAgICAgcHJvZHVjdC0+bG93W1BdID0gd29yazsKLSNpZmRlZiBUUkFDRQotCSAgICAgIHByaW50ZiAoIlA9JWQuIHdvcmtbcF06PSUwNHhcbiIsIFAsIHdvcmspOwotI2VuZGlmCi0JICAgIH0KLQkgIFArKzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXh0cmFfcHJvZHVjdF9wb3NpdGlvbnMrKzsKLQkgIGV4cG9uZW50Kys7Ci0JfQotICAgIH0KLSAgLyoKLSAgICogW1BdLT4gcG9zaXRpb24gIyBzaXplX29mX3N1bSArIDEuCi0gICAqIFRoaXMgaXMgd2hlcmUgJ2NhcnJ5JyBzaG91bGQgZ28uCi0gICAqLwotI2lmZGVmIFRSQUNFCi0gIHByaW50ZiAoImZpbmFsIGNhcnJ5ID0lMDR4XG4iLCBjYXJyeSk7Ci0jZW5kaWYKLSAgaWYgKGNhcnJ5KQotICAgIHsKLSAgICAgIGlmIChleHRyYV9wcm9kdWN0X3Bvc2l0aW9ucyA+IDApCi0JewotCSAgcHJvZHVjdC0+bG93W1BdID0gY2Fycnk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIE5vIHJvb20gYXQgaGlnaCBvcmRlciBmb3IgY2FycnkgbGl0dGxlbnVtLiAqLwotCSAgLyogU2hpZnQgcmlnaHQgMSB0byBtYWtlIHJvb20gZm9yIG1vc3Qgc2lnbmlmaWNhbnQgbGl0dGxlbnVtLiAqLwotCSAgZXhwb25lbnQrKzsKLQkgIFAtLTsKLQkgIGZvciAocSA9IHByb2R1Y3QtPmxvdyArIFA7IHEgPj0gcHJvZHVjdC0+bG93OyBxLS0pCi0JICAgIHsKLQkgICAgICB3b3JrID0gKnE7Ci0JICAgICAgKnEgPSBjYXJyeTsKLQkgICAgICBjYXJyeSA9IHdvcms7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgUC0tOwotICAgIH0KLSAgcHJvZHVjdC0+bGVhZGVyID0gcHJvZHVjdC0+bG93ICsgUDsKLSAgcHJvZHVjdC0+ZXhwb25lbnQgPSBleHBvbmVudDsKLX0KLQotLyogZW5kIG9mIGZsb251bV9tdWx0LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9mbG9udW0uaCBiL2dhcy9mbG9udW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4NGY0OS4uMDAwMDAwMAotLS0gYS9nYXMvZmxvbnVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyogZmxvbnVtLmggLSBGbG9hdGluZyBwb2ludCBwYWNrYWdlCi0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gKgkJCQkJCQkJCSoKLSAqCUFyYml0cmFyeS1wcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYy4JCQkqCi0gKgkJCQkJCQkJCSoKLSAqCQkJCQkJCQkJKgotICoJTm90YXRpb246IGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGlzIGV4cHJlc3NlZCBhcwkJKgotICoJTUFOVElTU0EgKiAoMiAqKiBFWFBPTkVOVCkuCQkJCQkqCi0gKgkJCQkJCQkJCSoKLSAqCUlmIHRoaXMgb2ZmZW5kcyBtb3JlIHRyYWRpdGlvbmFsIG1hdGhlbWF0aWNpYW5zLCB0aGVuCQkqCi0gKglwbGVhc2UgdGVsbCBtZSB5b3VyIG5vbWVuY2xhdHVyZSBmb3IgZmxvbnVtcyEJCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJiaWdudW0uaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJCQkJCQkJCQkqCi0gKglWYXJpYWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4JCQkqCi0gKgkJCQkJCQkJCSoKLSAqCUV4cG9uZW50IGlzIHRoZSBwbGFjZSB2YWx1ZSBvZiB0aGUgbG93IGxpdHRsZW51bS4gRS5nLjoJCSoKLSAqCUlmICAwOiAgbG93IHBvaW50cyB0byB0aGUgdW5pdHMgICAgICAgICAgICAgbGl0dGxlbnVtLgkJKgotICoJSWYgIDE6ICBsb3cgcG9pbnRzIHRvIHRoZSBMSVRUTEVOVU1fUkFESVggICBsaXR0bGVudW0uCQkqCi0gKglJZiAtMTogIGxvdyBwb2ludHMgdG8gdGhlIDEvTElUVExFTlVNX1JBRElYIGxpdHRsZW51bS4JCSoKLSAqCQkJCQkJCQkJKgotIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogSkY6ICBBIHNpZ24gdmFsdWUgb2YgMCBtZWFucyB3ZSBoYXZlIGJlZW4gYXNrZWQgdG8gYXNzZW1ibGUgTmFOCi0gICBBIHNpZ24gdmFsdWUgb2YgJ1AnIG1lYW5zIHdlJ3ZlIGJlZW4gYXNrZWQgdG8gYXNzZW1ibGUgK0luZgotICAgQSBzaWduIHZhbHVlIG9mICdOJyBtZWFucyB3ZSd2ZSBiZWVuIGFza2VkIHRvIGFzc2VtYmxlIC1JbmYKLSAgICovCi1zdHJ1Y3QgRkxPTlVNX1NUUlVDVAotewotICBMSVRUTEVOVU1fVFlQRSAqbG93OwkJLyogbG93IG9yZGVyIGxpdHRsZW51bSBvZiBhIGJpZ251bSAqLwotICBMSVRUTEVOVU1fVFlQRSAqaGlnaDsJCS8qIGhpZ2ggb3JkZXIgbGl0dGxlbnVtIG9mIGEgYmlnbnVtICovCi0gIExJVFRMRU5VTV9UWVBFICpsZWFkZXI7CS8qIC0+IDFzdCBub24temVybyBsaXR0bGVudW0gKi8KLSAgLyogSWYgZmxvbnVtIGlzIDAuMCwgbGVhZGVyPT1sb3ctMSAqLwotICBsb25nIGV4cG9uZW50OwkJLyogYmFzZSBMSVRUTEVOVU1fUkFESVggKi8KLSAgY2hhciBzaWduOwkJCS8qICcrJyBvciAnLScgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IEZMT05VTV9TVFJVQ1QgRkxPTlVNX1RZUEU7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJCQkJCQkJCQkqCi0gKglTaW5jZSB3ZSBjYW4gKCYgZG8pIG1lZXQgd2l0aCBleHBvbmVudHMgbGlrZSAxMF41MDAwLCBpdAkqCi0gKglpcyBzaWxseSB0byBtYWtlIGEgdGFibGUgb2YgfiAxMCwwMDAgZW50cmllcywgb25lIGZvciBlYWNoCSoKLSAqCXBvd2VyIG9mIDEwLiBXZSBrZWVwIGEgdGFibGUgd2hlcmUgaXRlbSBbbl0gaXMgYSBzdHJ1Y3QJCSoKLSAqCUZMT05VTV9GTE9BVElOR19QT0lOVCByZXByZXNlbnRpbmcgMTBeKDJebikuIFdlIHRoZW4JCSoKLSAqCW11bHRpcGx5IGFwcHJvcHJpYXRlIGVudHJpZXMgZnJvbSB0aGlzIHRhYmxlIHRvIGdldCBhbnkJCSoKLSAqCXBhcnRpY3VsYXIgcG93ZXIgb2YgMTAuIEZvciB0aGUgZXhhbXBsZSBvZiAxMF41MDAwLCBhIHRhYmxlCSoKLSAqCW9mIGp1c3QgMjUgZW50cmllcyBzdWZmaWNlczogMTBeKDJeLTEyKS4uLjEwXigyXisxMikuCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotZXh0ZXJuIGNvbnN0IEZMT05VTV9UWVBFIGZsb251bV9wb3NpdGl2ZV9wb3dlcnNfb2ZfdGVuW107Ci1leHRlcm4gY29uc3QgRkxPTlVNX1RZUEUgZmxvbnVtX25lZ2F0aXZlX3Bvd2Vyc19vZl90ZW5bXTsKLWV4dGVybiBjb25zdCBpbnQgdGFibGVfc2l6ZV9vZl9mbG9udW1fcG93ZXJzX29mX3RlbjsKLS8qIEZsb251bV9YWFhfcG93ZXJzX29mX3RlbltdIHRhYmxlIGhhcyAqLwotLyogbGVnYWwgaW5kaWNlcyBmcm9tIDAgdG8gKi8KLS8qICsgdGhpcyBudW1iZXIgaW5jbHVzaXZlLiAqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJCQkJCQkJCQkqCi0gKglEZWNsYXJlIHdvcmtlciBmdW5jdGlvbnMuCQkJCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWludCBhdG9mX2dlbmVyaWMgUEFSQU1TICgoY2hhciAqKmFkZHJlc3Nfb2Zfc3RyaW5nX3BvaW50ZXIsCi0JCQkgIGNvbnN0IGNoYXIgKnN0cmluZ19vZl9kZWNpbWFsX21hcmtzLAotCQkJICBjb25zdCBjaGFyICpzdHJpbmdfb2ZfZGVjaW1hbF9leHBvbmVudF9tYXJrcywKLQkJCSAgRkxPTlVNX1RZUEUgKiBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKSk7Ci0KLXZvaWQgZmxvbnVtX2NvcHkgUEFSQU1TICgoRkxPTlVNX1RZUEUgKiBpbiwgRkxPTlVNX1RZUEUgKiBvdXQpKTsKLXZvaWQgZmxvbnVtX211bHRpcCBQQVJBTVMgKChjb25zdCBGTE9OVU1fVFlQRSAqIGEsIGNvbnN0IEZMT05VTV9UWVBFICogYiwKLQkJCSAgICBGTE9OVU1fVFlQRSAqIHByb2R1Y3QpKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJCQkJCQkJCQkqCi0gKglEZWNsYXJlIGVycm9yIGNvZGVzLgkJCQkJCSoKLSAqCQkJCQkJCQkJKgotIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFUlJPUl9FWFBPTkVOVF9PVkVSRkxPVyAoMikKLQotLyogZW5kIG9mIGZsb251bS5oICovCmRpZmYgLS1naXQgYS9nYXMvZnJhZ3MuYyBiL2dhcy9mcmFncy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBiMmVlLi4wMDAwMDAwCi0tLSBhL2dhcy9mcmFncy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qIGZyYWdzLmMgLSBtYW5hZ2UgZnJhZ3MgLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi1leHRlcm4gZnJhZ1MgemVyb19hZGRyZXNzX2ZyYWc7Ci1leHRlcm4gZnJhZ1MgYnNzX2FkZHJlc3NfZnJhZzsKLQwKLS8qIEluaXRpYWxpemF0aW9uIGZvciBmcmFnIHJvdXRpbmVzLiAgKi8KLXZvaWQKLWZyYWdfaW5pdCAoKQotewotICB6ZXJvX2FkZHJlc3NfZnJhZy5mcl90eXBlID0gcnNfZmlsbDsKLSAgYnNzX2FkZHJlc3NfZnJhZy5mcl90eXBlID0gcnNfZmlsbDsKLX0KLQwKLS8qIEFsbG9jYXRlIGEgZnJhZyBvbiB0aGUgc3BlY2lmaWVkIG9ic3RhY2suCi0gICBDYWxsIHRoaXMgcm91dGluZSBmcm9tIGV2ZXJ5d2hlcmUgZWxzZSwgc28gdGhhdCBhbGwgdGhlIHdlaXJkIGFsaWdubWVudAotICAgaGFja2VyeSBjYW4gYmUgZG9uZSBpbiBqdXN0IG9uZSBwbGFjZS4gICovCi1mcmFnUyAqCi1mcmFnX2FsbG9jIChvYikKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9iOwotewotICBmcmFnUyAqcHRyOwotICBpbnQgb2FsaWduOwotCi0gICh2b2lkKSBvYnN0YWNrX2FsbG9jIChvYiwgMCk7Ci0gIG9hbGlnbiA9IG9ic3RhY2tfYWxpZ25tZW50X21hc2sgKG9iKTsKLSAgb2JzdGFja19hbGlnbm1lbnRfbWFzayAob2IpID0gMDsKLSAgcHRyID0gKGZyYWdTICopIG9ic3RhY2tfYWxsb2MgKG9iLCBTSVpFT0ZfU1RSVUNUX0ZSQUcpOwotICBvYnN0YWNrX2FsaWdubWVudF9tYXNrIChvYikgPSBvYWxpZ247Ci0gIG1lbXNldCAocHRyLCAwLCBTSVpFT0ZfU1RSVUNUX0ZSQUcpOwotICByZXR1cm4gcHRyOwotfQotDAotLyoKLSAqCQkJZnJhZ19ncm93KCkKLSAqCi0gKiBUcnkgdG8gYXVnbWVudCBjdXJyZW50IGZyYWcgYnkgbmNoYXJzIGNoYXJzLgotICogSWYgdGhlcmUgaXMgbm8gcm9vbSwgY2xvc2Ugb2YgdGhlIGN1cnJlbnQgZnJhZyB3aXRoIGEgIi5maWxsIDAiCi0gKiBhbmQgYmVnaW4gYSBuZXcgZnJhZy4gVW5sZXNzIHRoZSBuZXcgZnJhZyBoYXMgbmNoYXJzIGNoYXJzIGF2YWlsYWJsZQotICogZG8gbm90IHJldHVybi4gRG8gbm90IHNldCB1cCBhbnkgZmllbGRzIG9mICpub3dfZnJhZy4KLSAqLwotdm9pZCAKLWZyYWdfZ3JvdyAobmNoYXJzKQotICAgICB1bnNpZ25lZCBpbnQgbmNoYXJzOwotewotICBpZiAob2JzdGFja19yb29tICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykgPCBuY2hhcnMpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG47Ci0gICAgICBsb25nIG9sZGM7Ci0KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19uZXcgKDApOwotICAgICAgb2xkYyA9IGZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2suY2h1bmtfc2l6ZTsKLSAgICAgIGZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2suY2h1bmtfc2l6ZSA9IDIgKiBuY2hhcnMgKyBTSVpFT0ZfU1RSVUNUX0ZSQUc7Ci0gICAgICB3aGlsZSAoKG4gPSBvYnN0YWNrX3Jvb20gKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrKSkgPCBuY2hhcnMpCi0JewotCSAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0JICBmcmFnX25ldyAoMCk7Ci0JfQotICAgICAgZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjay5jaHVua19zaXplID0gb2xkYzsKLSAgICB9Ci0gIGlmIChvYnN0YWNrX3Jvb20gKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrKSA8IG5jaGFycykKLSAgICBhc19mYXRhbCAoXygiQ2FuJ3QgZXh0ZW5kIGZyYWcgJWQuIGNoYXJzIiksIG5jaGFycyk7Ci19Ci0MCi0vKgotICoJCQlmcmFnX25ldygpCi0gKgotICogQ2FsbCB0aGlzIHRvIGNsb3NlIG9mZiBhIGNvbXBsZXRlZCBmcmFnLCBhbmQgc3RhcnQgdXAgYSBuZXcgKGVtcHR5KQotICogZnJhZywgaW4gdGhlIHNhbWUgc3Vic2VnbWVudCBhcyB0aGUgb2xkIGZyYWcuCi0gKiBbZnJjaGFpbl9ub3cgcmVtYWlucyB0aGUgc2FtZSBidXQgZnJhZ19ub3cgaXMgdXBkYXRlZC5dCi0gKiBCZWNhdXNlIHRoaXMgY2FsY3VsYXRlcyB0aGUgY29ycmVjdCB2YWx1ZSBvZiBmcl9maXggYnkKLSAqIGxvb2tpbmcgYXQgdGhlIG9ic3RhY2sgJ2ZyYWdzJywgaXQgbmVlZHMgdG8ga25vdyBob3cgbWFueQotICogY2hhcmFjdGVycyBhdCB0aGUgZW5kIG9mIHRoZSBvbGQgZnJhZyBiZWxvbmcgdG8gKHRoZSBtYXhpbWFsKQotICogZnJfdmFyOiB0aGUgcmVzdCBtdXN0IGJlbG9uZyB0byBmcl9maXguCi0gKiBJdCBkb2Vzbid0IGFjdHVhbGx5IHNldCB1cCB0aGUgb2xkIGZyYWcncyBmcl92YXI6IHlvdSBtYXkgaGF2ZQotICogc2V0IGZyX3ZhciA9PSAxLCBidXQgYWxsb2NhdGVkIDEwIGNoYXJzIHRvIHRoZSBlbmQgb2YgdGhlIGZyYWc6Ci0gKiBpbiB0aGlzIGNhc2UgeW91IHBhc3Mgb2xkX2ZyYWdzX3Zhcl9tYXhfc2l6ZSA9PSAxMC4KLSAqCi0gKiBNYWtlIGEgbmV3IGZyYWcsIGluaXRpYWxpc2luZyBzb21lIGNvbXBvbmVudHMuIExpbmsgbmV3IGZyYWcgYXQgZW5kCi0gKiBvZiBmcmNoYWluX25vdy4KLSAqLwotdm9pZCAKLWZyYWdfbmV3IChvbGRfZnJhZ3NfdmFyX21heF9zaXplKQotICAgICAvKiBOdW1iZXIgb2YgY2hhcnMgKGFscmVhZHkgYWxsb2NhdGVkIG9uIG9ic3RhY2sgZnJhZ3MpIGluCi0JdmFyaWFibGVfbGVuZ3RoIHBhcnQgb2YgZnJhZy4gKi8KLSAgICAgaW50IG9sZF9mcmFnc192YXJfbWF4X3NpemU7Ci17Ci0gIGZyYWdTICpmb3JtZXJfbGFzdF9mcmFnUDsKLSAgZnJjaGFpblMgKmZyY2hQOwotCi0gIGFzc2VydCAoZnJjaGFpbl9ub3ctPmZyY2hfbGFzdCA9PSBmcmFnX25vdyk7Ci0KLSAgLyogRml4IHVwIG9sZCBmcmFnJ3MgZnJfZml4LiAgKi8KLSAgZnJhZ19ub3ctPmZyX2ZpeCA9IGZyYWdfbm93X2ZpeCAoKSAtIG9sZF9mcmFnc192YXJfbWF4X3NpemU7Ci0gIC8qIE1ha2Ugc3VyZSBpdHMgdHlwZSBpcyB2YWxpZC4gICovCi0gIGFzc2VydCAoZnJhZ19ub3ctPmZyX3R5cGUgIT0gMCk7Ci0KLSAgLyogVGhpcyB3aWxsIGFsaWduIHRoZSBvYnN0YWNrIHNvIHRoZSBuZXh0IHN0cnVjdCB3ZSBhbGxvY2F0ZSBvbiBpdAotICAgICB3aWxsIGJlZ2luIGF0IGEgY29ycmVjdCBib3VuZGFyeS4gKi8KLSAgb2JzdGFja19maW5pc2ggKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrKTsKLSAgZnJjaFAgPSBmcmNoYWluX25vdzsKLSAga25vdyAoZnJjaFApOwotICBmb3JtZXJfbGFzdF9mcmFnUCA9IGZyY2hQLT5mcmNoX2xhc3Q7Ci0gIGFzc2VydCAoZm9ybWVyX2xhc3RfZnJhZ1AgIT0gMCk7Ci0gIGFzc2VydCAoZm9ybWVyX2xhc3RfZnJhZ1AgPT0gZnJhZ19ub3cpOwotICBmcmFnX25vdyA9IGZyYWdfYWxsb2MgKCZmcmNoUC0+ZnJjaF9vYnN0YWNrKTsKLQotICBhc193aGVyZSAoJmZyYWdfbm93LT5mcl9maWxlLCAmZnJhZ19ub3ctPmZyX2xpbmUpOwotCi0gIC8qIEdlbmVyYWxseSwgZnJhZ19ub3ctPnBvaW50cyB0byBhbiBhZGRyZXNzIHJvdW5kZWQgdXAgdG8gbmV4dAotICAgICBhbGlnbm1lbnQuICBIb3dldmVyLCBjaGFyYWN0ZXJzIHdpbGwgYWRkIHRvIG9ic3RhY2sgZnJhZ3MKLSAgICAgSU1NRURJQVRFTFkgYWZ0ZXIgdGhlIHN0cnVjdCBmcmFnLCBldmVuIGlmIHRoZXkgYXJlIG5vdCBzdGFydGluZwotICAgICBhdCBhbiBhbGlnbm1lbnQgYWRkcmVzcy4gKi8KLSAgZm9ybWVyX2xhc3RfZnJhZ1AtPmZyX25leHQgPSBmcmFnX25vdzsKLSAgZnJjaFAtPmZyY2hfbGFzdCA9IGZyYWdfbm93OwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgewotICAgIGV4dGVybiBzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqbGlzdGluZ190YWlsOwotICAgIGZyYWdfbm93LT5saW5lID0gbGlzdGluZ190YWlsOwotICB9Ci0jZW5kaWYKLQotICBhc3NlcnQgKGZyY2hhaW5fbm93LT5mcmNoX2xhc3QgPT0gZnJhZ19ub3cpOwotCi0gIGZyYWdfbm93LT5mcl9uZXh0ID0gTlVMTDsKLX0JCQkJLyogZnJhZ19uZXcoKSAqLwotDAotLyoKLSAqCQkJZnJhZ19tb3JlKCkKLSAqCi0gKiBTdGFydCBhIG5ldyBmcmFnIHVubGVzcyB3ZSBoYXZlIG4gbW9yZSBjaGFycyBvZiByb29tIGluIHRoZSBjdXJyZW50IGZyYWcuCi0gKiBDbG9zZSBvZmYgdGhlIG9sZCBmcmFnIHdpdGggYSAuZmlsbCAwLgotICoKLSAqIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgMXN0IGNoYXIgdG8gd3JpdGUgaW50by4gQWR2YW5jZQotICogZnJhZ19ub3dfZ3Jvd3RoIHBhc3QgdGhlIG5ldyBjaGFycy4KLSAqLwotCi1jaGFyICoKLWZyYWdfbW9yZSAobmNoYXJzKQotICAgICBpbnQgbmNoYXJzOwotewotICByZWdpc3RlciBjaGFyICpyZXR2YWw7Ci0KLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImF0dGVtcHQgdG8gYWxsb2NhdGUgZGF0YSBpbiBhYnNvbHV0ZSBzZWN0aW9uIikpOwotICAgICAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCAwKTsKLSAgICB9Ci0KLSAgaWYgKG1yaV9jb21tb25fc3ltYm9sICE9IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJhdHRlbXB0IHRvIGFsbG9jYXRlIGRhdGEgaW4gY29tbW9uIHNlY3Rpb24iKSk7Ci0gICAgICBtcmlfY29tbW9uX3N5bWJvbCA9IE5VTEw7Ci0gICAgfQotCi0gIGZyYWdfZ3JvdyAobmNoYXJzKTsKLSAgcmV0dmFsID0gb2JzdGFja19uZXh0X2ZyZWUgKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrKTsKLSAgb2JzdGFja19ibGFua19mYXN0ICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaywgbmNoYXJzKTsKLSAgcmV0dXJuIChyZXR2YWwpOwotfQkJCQkvKiBmcmFnX21vcmUoKSAqLwotDAotLyoKLSAqCQkJZnJhZ192YXIoKQotICoKLSAqIFN0YXJ0IGEgbmV3IGZyYWcgdW5sZXNzIHdlIGhhdmUgbWF4X2NoYXJzIG1vcmUgY2hhcnMgb2Ygcm9vbSBpbiB0aGUgY3VycmVudCBmcmFnLgotICogQ2xvc2Ugb2ZmIHRoZSBvbGQgZnJhZyB3aXRoIGEgLmZpbGwgMC4KLSAqCi0gKiBTZXQgdXAgYSBtYWNoaW5lX2RlcGVuZGVudCByZWxheGFibGUgZnJhZywgdGhlbiBzdGFydCBhIG5ldyBmcmFnLgotICogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSAxc3QgY2hhciBvZiB0aGUgdmFyIHBhcnQgb2YgdGhlIG9sZCBmcmFnCi0gKiB0byB3cml0ZSBpbnRvLgotICovCi0KLWNoYXIgKgotZnJhZ192YXIgKHR5cGUsIG1heF9jaGFycywgdmFyLCBzdWJ0eXBlLCBzeW1ib2wsIG9mZnNldCwgb3Bjb2RlKQotICAgICByZWxheF9zdGF0ZVQgdHlwZTsKLSAgICAgaW50IG1heF9jaGFyczsKLSAgICAgaW50IHZhcjsKLSAgICAgcmVsYXhfc3Vic3RhdGVUIHN1YnR5cGU7Ci0gICAgIHN5bWJvbFMgKnN5bWJvbDsKLSAgICAgb2Zmc2V0VCBvZmZzZXQ7Ci0gICAgIGNoYXIgKm9wY29kZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqcmV0dmFsOwotCi0gIGZyYWdfZ3JvdyAobWF4X2NoYXJzKTsKLSAgcmV0dmFsID0gb2JzdGFja19uZXh0X2ZyZWUgKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrKTsKLSAgb2JzdGFja19ibGFua19mYXN0ICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaywgbWF4X2NoYXJzKTsKLSAgZnJhZ19ub3ctPmZyX3ZhciA9IHZhcjsKLSAgZnJhZ19ub3ctPmZyX3R5cGUgPSB0eXBlOwotICBmcmFnX25vdy0+ZnJfc3VidHlwZSA9IHN1YnR5cGU7Ci0gIGZyYWdfbm93LT5mcl9zeW1ib2wgPSBzeW1ib2w7Ci0gIGZyYWdfbm93LT5mcl9vZmZzZXQgPSBvZmZzZXQ7Ci0gIGZyYWdfbm93LT5mcl9vcGNvZGUgPSBvcGNvZGU7Ci0jaWZkZWYgVVNJTkdfQ0dFTgotICBmcmFnX25vdy0+ZnJfY2dlbi5pbnNuID0gMDsKLSAgZnJhZ19ub3ctPmZyX2NnZW4ub3BpbmRleCA9IDA7Ci0gIGZyYWdfbm93LT5mcl9jZ2VuLm9waW5mbyA9IDA7Ci0jZW5kaWYKLSNpZmRlZiBUQ19GUkFHX0lOSVQKLSAgVENfRlJBR19JTklUIChmcmFnX25vdyk7Ci0jZW5kaWYKLSAgYXNfd2hlcmUgKCZmcmFnX25vdy0+ZnJfZmlsZSwgJmZyYWdfbm93LT5mcl9saW5lKTsKLSAgZnJhZ19uZXcgKG1heF9jaGFycyk7Ci0gIHJldHVybiAocmV0dmFsKTsKLX0KLQwKLS8qCi0gKgkJCWZyYWdfdmFyaWFudCgpCi0gKgotICogT1ZFOiBUaGlzIHZhcmlhbnQgb2YgZnJhZ192YXIgYXNzdW1lcyB0aGF0IHNwYWNlIGZvciB0aGUgdGFpbCBoYXMgYmVlbgotICogICAgICBhbGxvY2F0ZWQgYnkgY2FsbGVyLgotICogICAgICBObyBjYWxsIHRvIGZyYWdfZ3JvdyBpcyBkb25lLgotICovCi0KLWNoYXIgKgotZnJhZ192YXJpYW50ICh0eXBlLCBtYXhfY2hhcnMsIHZhciwgc3VidHlwZSwgc3ltYm9sLCBvZmZzZXQsIG9wY29kZSkKLSAgICAgcmVsYXhfc3RhdGVUIHR5cGU7Ci0gICAgIGludCBtYXhfY2hhcnM7Ci0gICAgIGludCB2YXI7Ci0gICAgIHJlbGF4X3N1YnN0YXRlVCBzdWJ0eXBlOwotICAgICBzeW1ib2xTICpzeW1ib2w7Ci0gICAgIG9mZnNldFQgb2Zmc2V0OwotICAgICBjaGFyICpvcGNvZGU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnJldHZhbDsKLQotICByZXR2YWwgPSBvYnN0YWNrX25leHRfZnJlZSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spOwotICBmcmFnX25vdy0+ZnJfdmFyID0gdmFyOwotICBmcmFnX25vdy0+ZnJfdHlwZSA9IHR5cGU7Ci0gIGZyYWdfbm93LT5mcl9zdWJ0eXBlID0gc3VidHlwZTsKLSAgZnJhZ19ub3ctPmZyX3N5bWJvbCA9IHN5bWJvbDsKLSAgZnJhZ19ub3ctPmZyX29mZnNldCA9IG9mZnNldDsKLSAgZnJhZ19ub3ctPmZyX29wY29kZSA9IG9wY29kZTsKLSNpZmRlZiBVU0lOR19DR0VOCi0gIGZyYWdfbm93LT5mcl9jZ2VuLmluc24gPSAwOwotICBmcmFnX25vdy0+ZnJfY2dlbi5vcGluZGV4ID0gMDsKLSAgZnJhZ19ub3ctPmZyX2NnZW4ub3BpbmZvID0gMDsKLSNlbmRpZgotI2lmZGVmIFRDX0ZSQUdfSU5JVAotICBUQ19GUkFHX0lOSVQgKGZyYWdfbm93KTsKLSNlbmRpZgotICBhc193aGVyZSAoJmZyYWdfbm93LT5mcl9maWxlLCAmZnJhZ19ub3ctPmZyX2xpbmUpOwotICBmcmFnX25ldyAobWF4X2NoYXJzKTsKLSAgcmV0dXJuIChyZXR2YWwpOwotfQkJCQkvKiBmcmFnX3ZhcmlhbnQoKSAqLwotDAotLyoKLSAqCQkJZnJhZ193YW5lKCkKLSAqCi0gKiBSZWR1Y2UgdGhlIHZhcmlhYmxlIGVuZCBvZiBhIGZyYWcgdG8gYSBoYXJtbGVzcyBzdGF0ZS4KLSAqLwotdm9pZCAKLWZyYWdfd2FuZSAoZnJhZ1ApCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLXsKLSAgZnJhZ1AtPmZyX3R5cGUgPSByc19maWxsOwotICBmcmFnUC0+ZnJfb2Zmc2V0ID0gMDsKLSAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci19Ci0MCi0vKiBNYWtlIGFuIGFsaWdubWVudCBmcmFnLiAgVGhlIHNpemUgb2YgdGhpcyBmcmFnIHdpbGwgYmUgYWRqdXN0ZWQgdG8KLSAgIGZvcmNlIHRoZSBuZXh0IGZyYWcgdG8gaGF2ZSB0aGUgYXBwcm9wcmlhdGUgYWxpZ25tZW50LiAgQUxJR05NRU5UCi0gICBpcyB0aGUgcG93ZXIgb2YgdHdvIHRvIHdoaWNoIHRvIGFsaWduLiAgRklMTF9DSEFSQUNURVIgaXMgdGhlCi0gICBjaGFyYWN0ZXIgdG8gdXNlIHRvIGZpbGwgaW4gYW55IGJ5dGVzIHdoaWNoIGFyZSBza2lwcGVkLiAgTUFYIGlzCi0gICB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lwIHdoZW4gZG9pbmcgdGhlIGFsaWdubWVudCwKLSAgIG9yIDAgaWYgdGhlcmUgaXMgbm8gbWF4aW11bS4gICovCi0KLXZvaWQgCi1mcmFnX2FsaWduIChhbGlnbm1lbnQsIGZpbGxfY2hhcmFjdGVyLCBtYXgpCi0gICAgIGludCBhbGlnbm1lbnQ7Ci0gICAgIGludCBmaWxsX2NoYXJhY3RlcjsKLSAgICAgaW50IG1heDsKLXsKLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICB7Ci0gICAgICBhZGRyZXNzVCBuZXdfb2ZmOwotCi0gICAgICBuZXdfb2ZmID0gKChhYnNfc2VjdGlvbl9vZmZzZXQgKyBhbGlnbm1lbnQgLSAxKQotCQkgJn4gKCgxIDw8IGFsaWdubWVudCkgLSAxKSk7Ci0gICAgICBpZiAobWF4ID09IDAgfHwgbmV3X29mZiAtIGFic19zZWN0aW9uX29mZnNldCA8PSAoYWRkcmVzc1QpIG1heCkKLQlhYnNfc2VjdGlvbl9vZmZzZXQgPSBuZXdfb2ZmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIHAgPSBmcmFnX3ZhciAocnNfYWxpZ24sIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIG1heCwKLQkJICAgIChzeW1ib2xTICopIDAsIChvZmZzZXRUKSBhbGlnbm1lbnQsIChjaGFyICopIDApOwotICAgICAgKnAgPSBmaWxsX2NoYXJhY3RlcjsKLSAgICB9Ci19Ci0KLS8qIE1ha2UgYW4gYWxpZ25tZW50IGZyYWcgbGlrZSBmcmFnX2FsaWduLCBidXQgZmlsbCB3aXRoIGEgcmVwZWF0aW5nCi0gICBwYXR0ZXJuIHJhdGhlciB0aGFuIGEgc2luZ2xlIGJ5dGUuICBBTElHTk1FTlQgaXMgdGhlIHBvd2VyIG9mIHR3bwotICAgdG8gd2hpY2ggdG8gYWxpZ24uICBGSUxMX1BBVFRFUk4gaXMgdGhlIGZpbGwgcGF0dGVybiB0byByZXBlYXQgaW4KLSAgIHRoZSBieXRlcyB3aGljaCBhcmUgc2tpcHBlZC4gIE5fRklMTCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluCi0gICBGSUxMX1BBVFRFUk4uICBNQVggaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcCB3aGVuCi0gICBkb2luZyB0aGUgYWxpZ25tZW50LCBvciAwIGlmIHRoZXJlIGlzIG5vIG1heGltdW0uICAqLwotCi12b2lkIAotZnJhZ19hbGlnbl9wYXR0ZXJuIChhbGlnbm1lbnQsIGZpbGxfcGF0dGVybiwgbl9maWxsLCBtYXgpCi0gICAgIGludCBhbGlnbm1lbnQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGxfcGF0dGVybjsKLSAgICAgaW50IG5fZmlsbDsKLSAgICAgaW50IG1heDsKLXsKLSAgY2hhciAqcDsKLQotICBwID0gZnJhZ192YXIgKHJzX2FsaWduLCBuX2ZpbGwsIG5fZmlsbCwgKHJlbGF4X3N1YnN0YXRlVCkgbWF4LAotCQkoc3ltYm9sUyAqKSAwLCAob2Zmc2V0VCkgYWxpZ25tZW50LCAoY2hhciAqKSAwKTsKLSAgbWVtY3B5IChwLCBmaWxsX3BhdHRlcm4sIG5fZmlsbCk7Ci19Ci0KLWFkZHJlc3NUCi1mcmFnX25vd19maXggKCkKLXsKLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICByZXR1cm4gYWJzX3NlY3Rpb25fb2Zmc2V0OwotICByZXR1cm4gKGFkZHJlc3NUKSAoKGNoYXIqKSBvYnN0YWNrX25leHRfZnJlZSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spCi0JCSAgICAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCk7Ci19Ci0KLXZvaWQKLWZyYWdfYXBwZW5kXzFfY2hhciAoZGF0dW0pCi0gICAgIGludCBkYXR1bTsKLXsKLSAgaWYgKG9ic3RhY2tfcm9vbSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spIDw9IDEpCi0gICAgewotICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gICAgICBmcmFnX25ldyAoMCk7Ci0gICAgfQotICBvYnN0YWNrXzFncm93ICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaywgZGF0dW0pOwotfQotCi0vKiBlbmQgb2YgZnJhZ3MuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2ZyYWdzLmggYi9nYXMvZnJhZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5MDI5Mi4uMDAwMDAwMAotLS0gYS9nYXMvZnJhZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKiBmcmFncy5oIC0gSGVhZGVyIGZpbGUgZm9yIHRoZSBmcmFnIGNvbmNlcHQuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkyLCA5MywgOTQsIDk1LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgRlJBR1NfSAotI2RlZmluZSBGUkFHU19ICi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBvYnN0YWNrOwotI2VuZGlmCi0KLS8qCi0gKiBBIGNvZGUgZnJhZ21lbnQgKGZyYWcpIGlzIHNvbWUga25vd24gbnVtYmVyIG9mIGNoYXJzLCBmb2xsb3dlZCBieSBzb21lCi0gKiB1bmtub3duIG51bWJlciBvZiBjaGFycy4gVHlwaWNhbGx5IHRoZSB1bmtub3duIG51bWJlciBvZiBjaGFycyBpcyBhbgotICogaW5zdHJ1Y3Rpb24gYWRkcmVzcyB3aG9zZSBzaXplIGlzIHlldCB1bmtub3duLiBXZSBhbHdheXMga25vdyB0aGUgZ3JlYXRlc3QKLSAqIHBvc3NpYmxlIHNpemUgdGhlIHVua25vd24gbnVtYmVyIG9mIGNoYXJzIG1heSBiZWNvbWUsIGFuZCByZXNlcnZlIHRoYXQKLSAqIG11Y2ggcm9vbSBhdCB0aGUgZW5kIG9mIHRoZSBmcmFnLgotICogT25jZSBjcmVhdGVkLCBmcmFncyBkbyBub3QgY2hhbmdlIGFkZHJlc3MgZHVyaW5nIGFzc2VtYmx5LgotICogV2UgY2hhaW4gdGhlIGZyYWdzIGluIChhKSBmb3J3YXJkLWxpbmtlZCBsaXN0KHMpLiBUaGUgb2JqZWN0LWZpbGUgYWRkcmVzcwotICogb2YgdGhlIDFzdCBjaGFyIG9mIGEgZnJhZyBpcyBnZW5lcmFsbHkgbm90IGtub3duIHVudGlsIGFmdGVyIHJlbGF4KCkuCi0gKiBNYW55IHRoaW5ncyBhdCBhc3NlbWJseSB0aW1lIGRlc2NyaWJlIGFuIGFkZHJlc3MgYnkge29iamVjdC1maWxlLWFkZHJlc3MKLSAqIG9mIGEgcGFydGljdWxhciBmcmFnfStvZmZzZXQuCi0KLSBCVUc6IGl0IG1heSBiZSBzbWFydGVyIHRvIGhhdmUgYSBzaW5nbGUgcG9pbnRlciBvZmYgdG8gdmFyaW91cyBkaWZmZXJlbnQKLSBub3RlcyBmb3IgZGlmZmVyZW50IGZyYWcga2luZHMuIFNlZSBob3cgY29kZSBwYW5zCi0gKi8KLQotc3RydWN0IGZyYWcKLXsKLSAgLyogT2JqZWN0IGZpbGUgYWRkcmVzcy4gKi8KLSAgYWRkcmVzc1QgZnJfYWRkcmVzczsKLSAgLyogQ2hhaW4gZm9yd2FyZDsgYXNjZW5kaW5nIGFkZHJlc3Mgb3JkZXIuICBSb290ZWQgaW4gZnJjaF9yb290LiAqLwotICBzdHJ1Y3QgZnJhZyAqZnJfbmV4dDsKLQotICAvKiAoRml4ZWQpIG51bWJlciBvZiBjaGFycyB3ZSBrbm93IHdlIGhhdmUuICBNYXkgYmUgMC4gKi8KLSAgb2Zmc2V0VCBmcl9maXg7Ci0gIC8qIChWYXJpYWJsZSkgbnVtYmVyIG9mIGNoYXJzIGFmdGVyIGFib3ZlLiAgTWF5IGJlIDAuICovCi0gIG9mZnNldFQgZnJfdmFyOwotICAvKiBGb3IgdmFyaWFibGUtbGVuZ3RoIHRhaWwuICovCi0gIHN0cnVjdCBzeW1ib2wgKmZyX3N5bWJvbDsKLSAgLyogRm9yIHZhcmlhYmxlLWxlbmd0aCB0YWlsLiAqLwotICBvZmZzZXRUIGZyX29mZnNldDsKLSAgLyogUG9pbnRzIHRvIG9wY29kZSBsb3cgYWRkciBieXRlLCBmb3IgcmVsYXhhdGlvbi4gICovCi0gIGNoYXIgKmZyX29wY29kZTsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICpsaW5lOwotI2VuZGlmCi0KLSAgLyogV2hhdCBzdGF0ZSBpcyBteSB0YWlsIGluPyAqLwotICByZWxheF9zdGF0ZVQgZnJfdHlwZTsKLSAgcmVsYXhfc3Vic3RhdGVUIGZyX3N1YnR5cGU7Ci0KLSNpZmRlZiBVU0lOR19DR0VOCi0gIC8qIERvbid0IGluY2x1ZGUgdGhpcyB1bmxlc3MgdXNpbmcgQ0dFTiB0byBrZWVwIGZyYWcgc2l6ZSBkb3duLiAgKi8KLSAgc3RydWN0IHsKLSAgICAvKiBDR0VOX0lOU04gZW50cnkgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uICAqLwotICAgIGNvbnN0IHN0cnVjdCBjZ2VuX2luc24gKmluc247Ci0gICAgLyogSW5kZXggaW50byBvcGVyYW5kIHRhYmxlLiAgKi8KLSAgICBpbnQgb3BpbmRleDsKLSAgICAvKiBUYXJnZXQgc3BlY2lmaWMgZGF0YSwgdXN1YWxseSByZWxvYyBudW1iZXIuICAqLwotICAgIGludCBvcGluZm87Ci0gIH0gZnJfY2dlbjsKLSNlbmRpZgotCi0jaWZkZWYgVENfRlJBR19UWVBFCi0gIFRDX0ZSQUdfVFlQRSB0Y19mcmFnX2RhdGE7Ci0jZW5kaWYKLQotICAvKiBXaGVyZSB0aGUgZnJhZyB3YXMgY3JlYXRlZCwgb3Igd2hlcmUgaXQgYmVjYW1lIGEgdmFyaWFudCBmcmFnLiAgKi8KLSAgY2hhciAqZnJfZmlsZTsKLSAgdW5zaWduZWQgaW50IGZyX2xpbmU7Ci0KLSAgLyogRGF0YSBiZWdpbnMgaGVyZS4gICovCi0gIGNoYXIgZnJfbGl0ZXJhbFsxXTsKLX07Ci0KLSNkZWZpbmUgU0laRU9GX1NUUlVDVF9GUkFHIFwKLSgoY2hhciAqKXplcm9fYWRkcmVzc19mcmFnLmZyX2xpdGVyYWwtKGNoYXIgKikmemVyb19hZGRyZXNzX2ZyYWcpCi0vKiBXZSB3YW50IHRvIHNheSBmcl9saXRlcmFsWzBdIGFib3ZlLiAqLwotCi0vKiBDdXJyZW50IGZyYWcgd2UgYXJlIGJ1aWxkaW5nLiAgVGhpcyBmcmFnIGlzIGluY29tcGxldGUuICBJdCBpcywKLSAgIGhvd2V2ZXIsIGluY2x1ZGVkIGluIGZyY2hhaW5fbm93LiAgVGhlIGZyX2ZpeCBmaWVsZCBpcyBib2d1czsKLSAgIGluc3RlYWQsIHVzZSBmcmFnX25vd19maXggKCkuICAqLwotQ09NTU9OIGZyYWdTICpmcmFnX25vdzsKLWV4dGVybiBhZGRyZXNzVCBmcmFnX25vd19maXggUEFSQU1TICgodm9pZCkpOwotCi0vKiBGb3IgZm9yZWlnbi1zZWdtZW50IHN5bWJvbCBmaXh1cHMuICovCi1DT01NT04gZnJhZ1MgemVyb19hZGRyZXNzX2ZyYWc7Ci0vKiBGb3IgbG9jYWwgY29tbW9uIChOX0JTUyBzZWdtZW50KSBmaXh1cHMuICovCi1DT01NT04gZnJhZ1MgYnNzX2FkZHJlc3NfZnJhZzsKLQotI2lmIDAKLS8qCi0gKiBBIG1hY3JvIHRvIHNwZWVkIHVwIGFwcGVuZGluZyBleGFjdGx5IDEgY2hhcgotICogdG8gY3VycmVudCBmcmFnLgotICovCi0vKiBKRiBjaGFuZ2VkIDwgMSB0byA8PSAxIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRvbiAqLwotI2RlZmluZSBGUkFHX0FQUEVORF8xX0NIQVIoZGF0dW0pCVwKLXsJCQkJCVwKLSAgaWYgKG9ic3RhY2tfcm9vbSggJmZyYWdzICkgPD0gMSkge1wKLSAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsJXAotICAgIGZyYWdfbmV3ICgwKTsJCVwKLSAgfQkJCQlcCi0gIG9ic3RhY2tfMWdyb3coICZmcmFncywgZGF0dW0gKTsJXAotfQotI2Vsc2UKLWV4dGVybiB2b2lkIGZyYWdfYXBwZW5kXzFfY2hhciBQQVJBTVMgKChpbnQpKTsKLSNkZWZpbmUgRlJBR19BUFBFTkRfMV9DSEFSKFgpIGZyYWdfYXBwZW5kXzFfY2hhciAoWCkKLSNlbmRpZgotCi0KLXZvaWQgZnJhZ19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLWZyYWdTICpmcmFnX2FsbG9jIFBBUkFNUyAoKHN0cnVjdCBvYnN0YWNrICopKTsKLXZvaWQgZnJhZ19ncm93IFBBUkFNUyAoKHVuc2lnbmVkIGludCBuY2hhcnMpKTsKLWNoYXIgKmZyYWdfbW9yZSBQQVJBTVMgKChpbnQgbmNoYXJzKSk7Ci12b2lkIGZyYWdfYWxpZ24gUEFSQU1TICgoaW50IGFsaWdubWVudCwgaW50IGZpbGxfY2hhcmFjdGVyLCBpbnQgbWF4KSk7Ci12b2lkIGZyYWdfYWxpZ25fcGF0dGVybiBQQVJBTVMgKChpbnQgYWxpZ25tZW50LAotCQkJCSBjb25zdCBjaGFyICpmaWxsX3BhdHRlcm4sCi0JCQkJIGludCBuX2ZpbGwsCi0JCQkJIGludCBtYXgpKTsKLXZvaWQgZnJhZ19uZXcgUEFSQU1TICgoaW50IG9sZF9mcmFnc192YXJfbWF4X3NpemUpKTsKLXZvaWQgZnJhZ193YW5lIFBBUkFNUyAoKGZyYWdTICogZnJhZ1ApKTsKLQotY2hhciAqZnJhZ192YXJpYW50IFBBUkFNUyAoKHJlbGF4X3N0YXRlVCB0eXBlLAotCQkJICAgIGludCBtYXhfY2hhcnMsCi0JCQkgICAgaW50IHZhciwKLQkJCSAgICByZWxheF9zdWJzdGF0ZVQgc3VidHlwZSwKLQkJCSAgICBzeW1ib2xTICogc3ltYm9sLAotCQkJICAgIG9mZnNldFQgb2Zmc2V0LAotCQkJICAgIGNoYXIgKm9wY29kZSkpOwotCi1jaGFyICpmcmFnX3ZhciBQQVJBTVMgKChyZWxheF9zdGF0ZVQgdHlwZSwKLQkJCWludCBtYXhfY2hhcnMsCi0JCQlpbnQgdmFyLAotCQkJcmVsYXhfc3Vic3RhdGVUIHN1YnR5cGUsCi0JCQlzeW1ib2xTICogc3ltYm9sLAotCQkJb2Zmc2V0VCBvZmZzZXQsCi0JCQljaGFyICpvcGNvZGUpKTsKLQotI2VuZGlmIC8qIEZSQUdTX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9nYXNwLmMgYi9nYXMvZ2FzcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmI2NWUzLi4wMDAwMDAwCi0tLSBhL2dhcy9nYXNwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQ1ICswLDAgQEAKLS8qIGdhc3AuYyAtIEdudSBhc3NlbWJsZXIgcHJlcHJvY2Vzc29yIG1haW4gcHJvZ3JhbS4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgU3RldmUgYW5kIEp1ZHkgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQsCi0gICAgICBzYWNAY3lnbnVzLmNvbQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVNQLCB0aGUgR05VIEFzc2VtYmxlciBQcmVwcm9jZXNzb3IuCi0KLSAgIEdBU1AgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVNQIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTUDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotLyoKLQotVGhpcyBwcm9ncmFtIHRyYW5zbGF0ZXMgdGhlIGlucHV0IG1hY3JvcyBhbmQgc3R1ZmYgaW50byBhIGZvcm0KLXN1aXRhYmxlIGZvciBnYXMgdG8gY29uc3VtZS4KLQotCi0gIGdhc3AgWy1zZGhhdV0gWy1jIGNoYXJdIFstbyA8b3V0ZmlsZT5dIDxpbmZpbGU+KgotCi0gIC1zIGNvcHkgc291cmNlIHRvIG91dHB1dAotICAtYyA8Y2hhcj4gY29tbWVudHMgYXJlIHN0YXJ0ZWQgd2l0aCA8Y2hhcj4gaW5zdGVhZCBvZiAhCi0gIC11IGFsbG93IHVucmVhc29uYWJsZSBzdHVmZgotICAtcCBwcmludCBsaW5lIG51bWJlcnMKLSAgLWQgcHJpbnQgZGVidWdnaW5nIHN0YXRzCi0gIC1zIHNlbWkgY29sb25zIHN0YXJ0IGNvbW1lbnRzCi0gIC1hIHVzZSBhbHRlcm5hdGUgc3ludGF4Ci0gICAgIFBzZXVkbyBvcHMgY2FuIHN0YXJ0IHdpdGggb3Igd2l0aG91dCBhIC4KLSAgICAgTGFiZWxzIGhhdmUgdG8gYmUgaW4gZmlyc3QgY29sdW1uLgotICAtSSBzcGVjaWZ5IGluY2x1ZGUgZGlyCi0gICAgTWFjcm8gYXJnIHBhcmFtZXRlcnMgc3Vic2l0dXRlZCBieSBuYW1lLCBkb24ndCBuZWVkIHRoZSAmLgotICAgICBTdHJpbmcgY2FuIHN0YXJ0IHdpdGggJyB0b28uCi0gICAgIFN0cmluZ3MgY2FuIGJlIHN1cnJvdW5kZWQgYnkgPC4uPgotICAgICBBICU8ZXhwPiBpbiBhIHN0cmluZyBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gCi0gICAgIExpdGVyYWwgY2hhciBpbiBhIHN0cmluZyB3aXRoICEKLQotCi0qLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfTUFMTE9DX0RFQ0xBUkFUSU9OCi1leHRlcm4gY2hhciAqbWFsbG9jICgpOwotI2VuZGlmCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInNiLmgiCi0jaW5jbHVkZSAibWFjcm8uaCIKLSNpbmNsdWRlICJhc2ludGwuaCIKLQotY2hhciAqcHJvZ3JhbV92ZXJzaW9uID0gIjEuMiI7Ci0KLS8qIFRoaXMgaXMgbm9ybWFsbHkgZGVjbGFyZWQgaW4gYXMuaCwgYnV0IHdlIGRvbid0IGluY2x1ZGUgdGhhdC4gIFdlCi0gICBuZWVkIHRoZSBmdW5jdGlvbiBiZWNhdXNlIG90aGVyIGZpbGVzIGxpbmtlZCB3aXRoIGdhc3AuYyBtaWdodCBjYWxsCi0gICBpdC4gICovCi1leHRlcm4gdm9pZCBhc19hYm9ydCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKSk7Ci0KLSNkZWZpbmUgTUFYX0lOQ0xVREVTIDMwCQkvKiBNYXhpbXVtIGluY2x1ZGUgZGVwdGggKi8KLSNkZWZpbmUgTUFYX1JFQVNPTkFCTEUgMTAwMAkvKiBNYXhpbXVtIG51bWJlciBvZiBleHBhbnNpb25zICovCi0KLWludCB1bnJlYXNvbmFibGU7CQkvKiAtdSBvbiBjb21tYW5kIGxpbmUgKi8KLWludCBzdGF0czsJCQkvKiAtZCBvbiBjb21tYW5kIGxpbmUgKi8KLWludCBwcmludF9saW5lX251bWJlcjsJCS8qIC1wIGZsYWcgb24gY29tbWFuZCBsaW5lICovCi1pbnQgY29weXNvdXJjZTsJCQkvKiAtYyBmbGFnIG9uIGNvbW1hbmQgbGluZSAqLwotaW50IHdhcm5pbmdzOwkJCS8qIE51bWJlciBvZiBXQVJOSU5HcyBnZW5lcmF0ZWQgc28gZmFyLiAqLwotaW50IGVycm9yczsJCQkvKiBOdW1iZXIgb2YgRVJST1JzIGdlbmVyYXRlZCBzbyBmYXIuICovCi1pbnQgZmF0YWxzOwkJCS8qIE51bWJlciBvZiBmYXRhbCBFUlJPUnMgZ2VuZXJhdGVkIHNvIGZhciAoZWl0aGVyIDAgb3IgMSkuICovCi1pbnQgYWx0ZXJuYXRlID0gMDsgICAgICAgICAgICAgIC8qIC1hIG9uIGNvbW1hbmQgbGluZSAqLwotaW50IG1yaSA9IDA7CQkJLyogLU0gb24gY29tbWFuZCBsaW5lICovCi1jaGFyIGNvbW1lbnRfY2hhciA9ICchJzsKLWludCByYWRpeCA9IDEwOwkJCS8qIERlZmF1bHQgcmFkaXggKi8KLQotaW50IGhhZF9lbmQ7IC8qIFNlZW4gLkVORCAqLwotCi0vKiBUaGUgb3V0cHV0IHN0cmVhbSAqLwotRklMRSAqb3V0ZmlsZTsKLQotLyogdGhlIGF0dHJpYnV0ZXMgb2YgZWFjaCBjaGFyYWN0ZXIgYXJlIHN0b3JlZCBhcyBhIGJpdCBwYXR0ZXJuCi0gICBjaGFydHlwZSwgd2hpY2ggZ2l2ZXMgdXMgcXVpY2sgdGVzdHMuICovCi0KLQotI2RlZmluZSBGSVJTVEJJVCAxCi0jZGVmaW5lIE5FWFRCSVQgIDIKLSNkZWZpbmUgU0VQQklUICAgNAotI2RlZmluZSBXSElURUJJVCA4Ci0jZGVmaW5lIENPTU1FTlRCSVQgMTYKLSNkZWZpbmUgQkFTRUJJVCAgMzIKLSNkZWZpbmUgSVNDT01NRU5UQ0hBUih4KSAoY2hhcnR5cGVbKHVuc2lnbmVkIGNoYXIpKHgpXSAmIENPTU1FTlRCSVQpCi0jZGVmaW5lIElTRklSU1RDSEFSKHgpICAoY2hhcnR5cGVbKHVuc2lnbmVkIGNoYXIpKHgpXSAmIEZJUlNUQklUKQotI2RlZmluZSBJU05FWFRDSEFSKHgpICAgKGNoYXJ0eXBlWyh1bnNpZ25lZCBjaGFyKSh4KV0gJiBORVhUQklUKQotI2RlZmluZSBJU1NFUCh4KSAgICAgICAgKGNoYXJ0eXBlWyh1bnNpZ25lZCBjaGFyKSh4KV0gJiBTRVBCSVQpCi0jZGVmaW5lIElTV0hJVEUoeCkgICAgICAoY2hhcnR5cGVbKHVuc2lnbmVkIGNoYXIpKHgpXSAmIFdISVRFQklUKQotI2RlZmluZSBJU0JBU0UoeCkgICAgICAgKGNoYXJ0eXBlWyh1bnNpZ25lZCBjaGFyKSh4KV0gJiBCQVNFQklUKQotc3RhdGljIGNoYXIgY2hhcnR5cGVbMjU2XTsKLQotCi0vKiBDb25kaXRpb25hbCBhc3NlbWJseSB1c2VzIHRoZSBgaWZzdGFjaycuICBFYWNoIGFpZiBwdXNoZXMgYW5vdGhlcgotICAgZW50cnkgb250byB0aGUgc3RhY2ssIGFuZCBzZXRzIHRoZSBvbiBmbGFnIGlmIGl0IHNob3VsZC4gIFRoZSBhZWxzZQotICAgc2V0cyBoYWRlbHNlLCBhbmQgdG9nZ2xlcyBvbi4gIEFuIGFlbmQgcG9wcyBhIGxldmVsLiAgV2UgbGltaXQgdG8KLSAgIDEwMCBsZXZlbHMgb2YgbmVzdGluZywgbm90IGJlY2F1c2Ugd2UncmUgZmFjaXN0cyBwaWdzIHdpdGggcmVhZAotICAgb25seSBtaW5kcywgYnV0IGJlY2F1c2UgbW9yZSB0aGFuIDEwMCBsZXZlbHMgb2YgbmVzdGluZyBpcyBwcm9iYWJseQotICAgYSBidWcgaW4gdGhlIHVzZXIncyBtYWNybyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIElGTkVTVElORyAxMDAKLXN0cnVjdAotICB7Ci0gICAgaW50IG9uOwkJCS8qIGlzIHRoZSBsZXZlbCBiZWluZyBvdXRwdXQgKi8KLSAgICBpbnQgaGFkZWxzZTsJCS8qIGhhcyBhbiBhZWxzZSBiZWVuIHNlZW4gKi8KLSAgfQotaWZzdGFja1tJRk5FU1RJTkddOwotaW50IGlmaTsKLQotLyogVGhlIGZpbmFsIGFuZCBpbnRlcm1lZGlhdGUgcmVzdWx0cyBvZiBleHByZXNzaW9uIGV2YWx1YXRpb24gYXJlIGtlcHQgaW4KLSAgIGV4cF90J3MuICBOb3RlIHRoYXQgYSBzeW1ib2wgaXMgbm90IGFuIHNiLCBidXQgYSBwb2ludGVyIGludG8gdGhlIGlucHV0Ci0gICBsaW5lLiAgSXQgbXVzdCBiZSBjb3BlZCBzb21ld2hlcmUgc2FmZSBiZWZvcmUgdGhlIG5leHQgbGluZSBpcyByZWFkIGluLiAqLwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgbGVuOwotICB9Ci1zeW1ib2w7Ci0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBpbnQgdmFsdWU7CQkJLyogY29uc3RhbnQgcGFydCAqLwotICAgIHN5bWJvbCBhZGRfc3ltYm9sOwkJLyogbmFtZSBwYXJ0ICovCi0gICAgc3ltYm9sIHN1Yl9zeW1ib2w7CQkvKiBuYW1lIHBhcnQgKi8KLSAgfQotZXhwX3Q7Ci0KLQotLyogSGFzaGluZyBpcyBkb25lIGluIGEgcHJldHR5IHN0YW5kYXJkIHdheS4gIEEgaGFzaF90YWJsZSBoYXMgYQotICAgcG9pbnRlciB0byBhIHZlY3RvciBvZiBwb2ludGVycyB0byBoYXNoX2VudHJ5cywgYW5kIHRoZSBzaXplIG9mIHRoZQotICAgdmVjdG9yLiAgQSBoYXNoX2VudHJ5IGNvbnRhaW5zIGEgdW5pb24gb2YgYWxsIHRoZSBpbmZvIHdlIGxpa2UgdG8KLSAgIHN0b3JlIGluIGhhc2ggdGFibGUuICBJZiB0aGVyZSBpcyBhIGhhc2ggY29sbGlzaW9uLCBoYXNoX2VudHJpZXMKLSAgIHdpdGggdGhlIHNhbWUgaGFzaCBhcmUga2VwdCBpbiBhIGNoYWluLiAqLwotCi0vKiBXaGF0IHRoZSBkYXRhIGluIGEgaGFzaF9lbnRyeSBtZWFucyAqLwotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBoYXNoX2ludGVnZXIsCQkvKiBuYW1lLT5pbnRlZ2VyIG1hcHBpbmcgKi8KLSAgICBoYXNoX3N0cmluZywJCS8qIG5hbWUtPnN0cmluZyBtYXBwaW5nICovCi0gICAgaGFzaF9tYWNybywJCQkvKiBuYW1lIGlzIGEgbWFjcm8gKi8KLSAgICBoYXNoX2Zvcm1hbAkJCS8qIG5hbWUgaXMgYSBmb3JtYWwgYXJndW1lbnQgKi8KLSAgfSBoYXNoX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGhzCi0gIHsKLSAgICBzYiBrZXk7CQkJLyogc3ltYm9sIG5hbWUgKi8KLSAgICBoYXNoX3R5cGUgdHlwZTsJCS8qIHN5bWJvbCBtZWFuaW5nICovCi0gICAgdW5pb24KLSAgICAgIHsKLQlzYiBzOwotCWludCBpOwotCXN0cnVjdCBtYWNyb19zdHJ1Y3QgKm07Ci0Jc3RydWN0IGZvcm1hbF9zdHJ1Y3QgKmY7Ci0gICAgICB9IHZhbHVlOwotICAgIHN0cnVjdCBocyAqbmV4dDsJCS8qIG5leHQgaGFzaF9lbnRyeSB3aXRoIHNhbWUgaGFzaCBrZXkgKi8KLSAgfSBoYXNoX2VudHJ5OwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgaGFzaF9lbnRyeSAqKnRhYmxlOwotICAgIGludCBzaXplOwotICB9IGhhc2hfdGFibGU7Ci0KLQotLyogU3RydWN0dXJlcyB1c2VkIHRvIHN0b3JlIG1hY3Jvcy4gCi0KLSAgIEVhY2ggbWFjcm8ga25vd3MgaXRzIG5hbWUgYW5kIGluY2x1ZGVkIHRleHQuICBJdCBnZXRzIGJ1aWx0IHdpdGggYQotICAgbGlzdCBvZiBmb3JtYWwgYXJndW1lbnRzLCBhbmQgYWxzbyBrZWVwcyBhIGhhc2ggdGFibGUgd2hpY2ggcG9pbnRzCi0gICBpbnRvIHRoZSBsaXN0IHRvIHNwZWVkIHVwIGZvcm1hbCBzZWFyY2guICBFYWNoIGZvcm1hbCBrbm93cyBpdHMKLSAgIG5hbWUgYW5kIGl0cyBkZWZhdWx0IHZhbHVlLiAgRWFjaCB0aW1lIHRoZSBtYWNybyBpcyBleHBhbmRlZCwgdGhlCi0gICBmb3JtYWxzIGdldCB0aGUgYWN0dWFsIHZhbHVlcyBhdHRhdGNoZWQgdG8gdGhlbS4gKi8KLQotLyogZGVzY3JpYmUgdGhlIGZvcm1hbCBhcmd1bWVudHMgdG8gYSBtYWNybyAqLwotCi10eXBlZGVmIHN0cnVjdCBmb3JtYWxfc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3QgZm9ybWFsX3N0cnVjdCAqbmV4dDsJLyogbmV4dCBmb3JtYWwgaW4gbGlzdCAqLwotICAgIHNiIG5hbWU7CQkJLyogbmFtZSBvZiB0aGUgZm9ybWFsICovCi0gICAgc2IgZGVmOwkJCS8qIHRoZSBkZWZhdWx0IHZhbHVlICovCi0gICAgc2IgYWN0dWFsOwkJCS8qIHRoZSBhY3R1YWwgYXJndW1lbnQgKGNoYW5nZWQgb24gZWFjaCBleHBhbnNpb24pICovCi0gICAgaW50IGluZGV4OwkJCS8qIHRoZSBpbmRleCBvZiB0aGUgZm9ybWFsIDAuLmZvcm1hbF9jb3VudC0xICovCi0gIH0KLWZvcm1hbF9lbnRyeTsKLQotLyogZGVzY3JpYmUgdGhlIG1hY3JvLiAqLwotCi10eXBlZGVmIHN0cnVjdCBtYWNyb19zdHJ1Y3QKLSAgewotICAgIHNiIHN1YjsJCQkvKiBzdWJzdGl0dXRpb24gdGV4dC4gKi8KLSAgICBpbnQgZm9ybWFsX2NvdW50OwkJLyogbnVtYmVyIG9mIGZvcm1hbCBhcmdzLiAqLwotICAgIGZvcm1hbF9lbnRyeSAqZm9ybWFsczsJLyogcG9pbnRlciB0byBsaXN0IG9mIGZvcm1hbF9zdHJ1Y3RzICovCi0gICAgaGFzaF90YWJsZSBmb3JtYWxfaGFzaDsJLyogaGFzaCB0YWJsZSBvZiBmb3JtYWxzLiAqLwotICB9Ci1tYWNyb19lbnRyeTsKLQotLyogaG93IHdlIG5lc3QgZmlsZXMgYW5kIGV4cGFuZCBtYWNyb3MgZXRjLgotCi0gICB3ZSBrZWVwIGEgc3RhY2sgb2Ygb2YgaW5jbHVkZV9zdGFjayBzdHJ1Y3RzLiAgZWFjaCBpbmNsdWRlIGZpbGUKLSAgIHB1c2hlcyBhIG5ldyBsZXZlbCBvbnRvIHRoZSBzdGFjay4gIHdlIGtlZXAgYW4gc2Igd2l0aCBhIHB1c2hiYWNrCi0gICB0b28uICB1bmdldCBjaGFycyBhcmUgcHVzaGVkIG9udG8gdGhlIHB1c2hiYWNrIHNiLCBnZXRjaGFycyBmaXJzdAotICAgY2hlY2tzIHRoZSBwdXNoYmFjayBzYiBiZWZvcmUgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uCi0KLSAgIHNtYWxsIHRoaW5ncyBhcmUgZXhwYW5kZWQgYnkgYWRkaW5nIHRoZSB0ZXh0IG9mIHRoZSBpdGVtIG9udG8gdGhlCi0gICBwdXNoYmFjayBzYi4gIGxhcmdlciBpdGVtcyBhcmUgZ3Jvd24gYnkgcHVzaGluZyBhIG5ldyBsZXZlbCBhbmQKLSAgIGFsbG9jYXRpbmcgdGhlIGVudGlyZSBwdXNoYmFjayBidWYgZm9yIHRoZSBpdGVtLiAgZWFjaCB0aW1lCi0gICBzb21ldGhpbmcgbGlrZSBhIG1hY3JvIGlzIGV4cGFuZGVkLCB0aGUgc3RhY2sgaW5kZXggaXMgY2hhbmdlZC4gd2UKLSAgIGNhbiB0aGVuIHBlcmZvcm0gYW4gZXhpdG0gYnkgcG9wcGluZyBhbGwgZW50cmllcyBvZmYgdGhlIHN0YWNrIHdpdGgKLSAgIHRoZSBzYW1lIHN0YWNrIGluZGV4LiAgaWYgd2UncmUgYmVpbmcgcmVhc29uYWJsZSwgd2UgY2FuIGRldGVjdAotICAgcmVjdXNpdmUgZXhwYW5zaW9uIGJ5IGNoZWNraW5nIHRoZSBpbmRleCBpcyByZWFzb25hYmx5IHNtYWxsLgotICovCi0KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgaW5jbHVkZV9maWxlLCBpbmNsdWRlX3JlcGVhdCwgaW5jbHVkZV93aGlsZSwgaW5jbHVkZV9tYWNybwotICB9IGluY2x1ZGVfdHlwZTsKLQotc3RydWN0IGluY2x1ZGVfc3RhY2sKLSAgewotICAgIHNiIHB1c2hiYWNrOwkJLyogY3VycmVudCBwdXNoYmFjayBzdHJlYW0gKi8KLSAgICBpbnQgcHVzaGJhY2tfaW5kZXg7CQkvKiBuZXh0IGNoYXIgdG8gcmVhZCBmcm9tIHN0cmVhbSAqLwotICAgIEZJTEUgKmhhbmRsZTsJCS8qIG9wZW4gZmlsZSAqLwotICAgIHNiIG5hbWU7CQkJLyogbmFtZSBvZiBmaWxlICovCi0gICAgaW50IGxpbmVjb3VudDsJCS8qIG51bWJlciBvZiBsaW5lcyByZWFkIHNvIGZhciAqLwotICAgIGluY2x1ZGVfdHlwZSB0eXBlOwotICAgIGludCBpbmRleDsJCQkvKiBpbmRleCBvZiB0aGlzIGxheWVyICovCi0gIH0KLWluY2x1ZGVfc3RhY2tbTUFYX0lOQ0xVREVTXTsKLQotc3RydWN0IGluY2x1ZGVfc3RhY2sgKnNwOwotI2RlZmluZSBpc3AgKHNwIC0gaW5jbHVkZV9zdGFjaykKLQotLyogSW5jbHVkZSBmaWxlIGxpc3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgaW5jbHVkZV9wYXRoIAotewotICBzdHJ1Y3QgaW5jbHVkZV9wYXRoICpuZXh0OwotICBzYiBwYXRoOwotfSAgaW5jbHVkZV9wYXRoOwotCi1pbmNsdWRlX3BhdGggKnBhdGhzX2hlYWQ7Ci1pbmNsdWRlX3BhdGggKnBhdGhzX3RhaWw7Ci0KLQotc3RhdGljIHZvaWQgcXVpdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBoYXNoX25ld190YWJsZSBQQVJBTVMgKChpbnQsIGhhc2hfdGFibGUgKikpOwotc3RhdGljIGludCBoYXNoIFBBUkFNUyAoKHNiICopKTsKLXN0YXRpYyBoYXNoX2VudHJ5ICpoYXNoX2NyZWF0ZSBQQVJBTVMgKChoYXNoX3RhYmxlICosIHNiICopKTsKLXN0YXRpYyB2b2lkIGhhc2hfYWRkX3RvX3N0cmluZ190YWJsZSBQQVJBTVMgKChoYXNoX3RhYmxlICosIHNiICosIHNiICosIGludCkpOwotc3RhdGljIHZvaWQgaGFzaF9hZGRfdG9faW50X3RhYmxlIFBBUkFNUyAoKGhhc2hfdGFibGUgKiwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgaGFzaF9lbnRyeSAqaGFzaF9sb29rdXAgUEFSQU1TICgoaGFzaF90YWJsZSAqLCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBjaGVja2NvbnN0IFBBUkFNUyAoKGludCwgZXhwX3QgKikpOwotc3RhdGljIGludCBzYl9zdHJ0b2wgUEFSQU1TICgoaW50LCBzYiAqLCBpbnQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzAgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzEgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzIgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzMgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzQgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzUgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGV4cF9wYXJzZSBQQVJBTVMgKChpbnQsIHNiICosIGV4cF90ICopKTsKLXN0YXRpYyB2b2lkIGV4cF9zdHJpbmcgUEFSQU1TICgoZXhwX3QgKiwgc2IgKikpOwotc3RhdGljIGludCBleHBfZ2V0X2FicyBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgc2IgKiwgaW50ICopKTsKLSNpZiAwCi1zdGF0aWMgdm9pZCBzdHJpcF9jb21tZW50cyBQQVJBTVMgKChzYiAqKSk7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIHVuZ2V0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgaW5jbHVkZV9idWYgUEFSQU1TICgoc2IgKiwgc2IgKiwgaW5jbHVkZV90eXBlLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGluY2x1ZGVfcHJpbnRfd2hlcmVfbGluZSBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkIGluY2x1ZGVfcHJpbnRfbGluZSBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQgZ2V0X2xpbmUgUEFSQU1TICgoc2IgKikpOwotc3RhdGljIGludCBncmFiX2xhYmVsIFBBUkFNUyAoKHNiICosIHNiICopKTsKLXN0YXRpYyB2b2lkIGNoYW5nZV9iYXNlIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fZW5kIFBBUkFNUyAoKHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX2Fzc2lnbiBQQVJBTVMgKChpbnQsIGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fcmFkaXggUEFSQU1TICgoc2IgKikpOwotc3RhdGljIGludCBnZXRfb3BzaXplIFBBUkFNUyAoKGludCwgc2IgKiwgaW50ICopKTsKLXN0YXRpYyBpbnQgZW9sIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fZGF0YSBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOwotc3RhdGljIHZvaWQgZG9fZGF0YWIgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19hbGlnbiBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX3JlcyBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOwotc3RhdGljIHZvaWQgZG9fZXhwb3J0IFBBUkFNUyAoKHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX3ByaW50IFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9faGVhZGluZyBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX3BhZ2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZG9fZm9ybSBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyBpbnQgZ2V0X2FueV9zdHJpbmcgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqLCBpbnQsIGludCkpOwotc3RhdGljIGludCBza2lwX29wZW5wIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIGludCBza2lwX2Nsb3NlcCBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyBpbnQgZG9sZW4gUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgaW50IGRvaW5zdHIgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgaW50IGRvc3Vic3RyIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIHZvaWQgcHJvY2Vzc19hc3NpZ25zIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIGludCBnZXRfYW5kX3Byb2Nlc3MgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBwcm9jZXNzX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZnJlZV9vbGRfZW50cnkgUEFSQU1TICgoaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgdm9pZCBkb19hc3NpZ25hIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fYXNzaWduYyBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX3JlZyBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyBpbnQgY29uZGFzc19sb29rdXBfbmFtZSBQQVJBTVMgKChzYiAqLCBpbnQsIHNiICosIGludCkpOwotc3RhdGljIGludCB3aGF0Y29uZCBQQVJBTVMgKChpbnQsIHNiICosIGludCAqKSk7Ci1zdGF0aWMgaW50IGlzdHJ1ZSBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX2FpZiBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX2FlbHNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGRvX2FlbmRpIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgY29uZGFzc19vbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19pZiBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOwotc3RhdGljIGludCBnZXRfbXJpX3N0cmluZyBQQVJBTVMgKChpbnQsIHNiICosIHNiICosIGludCkpOwotc3RhdGljIHZvaWQgZG9faWZjIFBBUkFNUyAoKGludCwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkb19hZW5kciBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19hd2hpbGUgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19hZW5kdyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19leGl0bSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19hcmVwZWF0IFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fZW5kbSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19pcnAgUEFSQU1TICgoaW50LCBzYiAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRvX2xvY2FsIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fbWFjcm8gUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgaW50IG1hY3JvX29wIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIGludCBnZXRzdHJpbmcgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19zZGF0YSBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOwotc3RhdGljIHZvaWQgZG9fc2RhdGFiIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIGludCBuZXdfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX2luY2x1ZGUgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBpbmNsdWRlX3BvcCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGdldCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGxpbmVjb3VudCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGluY2x1ZGVfbmV4dF9pbmRleCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBjaGFydHlwZV9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgcHJvY2Vzc19wc2V1ZG9fb3AgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBhZGRfa2V5d29yZCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgcHJvY2Vzc19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGRvX2RlZmluZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHNob3dfdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNob3dfaGVscCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgRkFUQUwoeCkgXAotICBkbyB7IGluY2x1ZGVfcHJpbnRfd2hlcmVfbGluZSAoc3RkZXJyKTsgZnByaW50ZiB4IDsgZmF0YWxzKys7IHF1aXQoKTsgfSB3aGlsZSgwKSAKLSNkZWZpbmUgRVJST1IoeCkgXAotICBkbyB7IGluY2x1ZGVfcHJpbnRfd2hlcmVfbGluZSAoc3RkZXJyKTsgZnByaW50ZiB4OyBlcnJvcnMrKzsgfSB3aGlsZSgwKQotI2RlZmluZSBXQVJOSU5HKHgpIFwKLSAgZG8geyBpbmNsdWRlX3ByaW50X3doZXJlX2xpbmUgKHN0ZGVycik7IGZwcmludGYgeDsgd2FybmluZ3MrKzt9IHdoaWxlKDApIAotCi0KLQotLyogZXhpdCB0aGUgcHJvZ3JhbSBhbmQgcmV0dXJuIHRoZSByaWdodCBFUlJPUiBjb2RlLiAqLwotc3RhdGljIHZvaWQKLXF1aXQgKCkKLXsKLSAgaW50IGV4aXRjb2RlOwotICBpZiAoZmF0YWxzICsgZXJyb3JzKQotICAgIGV4aXRjb2RlID0gMTsKLSAgZWxzZQotICAgIGV4aXRjb2RlID0gMDsKLQotICBpZiAoc3RhdHMpIAotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNiX21heF9wb3dlcl90d287IGkrKykgCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAic3RyaW5ncyBzaXplICU4ZCA6ICVkXG4iLCAxPDxpLCBzdHJpbmdfY291bnRbaV0pOwotCX0KLSAgICB9Ci0gIGV4aXQgKGV4aXRjb2RlKTsKLX0KLQotLyogaGFzaCB0YWJsZSBtYWludGVuYW5jZS4gKi8KLQotLyogYnVpbGQgYSBuZXcgaGFzaCB0YWJsZSB3aXRoIHNpemUgYnVja2V0cywgYW5kIGZpbGwgaW4gdGhlIGluZm8gYXQgcHRyLiAqLwotCi1zdGF0aWMgdm9pZAotaGFzaF9uZXdfdGFibGUgKHNpemUsIHB0cikKLSAgICAgaW50IHNpemU7Ci0gICAgIGhhc2hfdGFibGUgKnB0cjsKLXsKLSAgaW50IGk7Ci0gIHB0ci0+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+YWRkX3N5bWJvbC5sZW4pOwotICAgICAgbnAgPSAwOwotICAgICAgYWQgPSAxOwotICAgIH0KLQotICBpZiAoIWFkKQotICAgIHNiX2FkZF9jaGFyIChzdHJpbmcsICcwJyk7Ci19Ci0KLQotLyogcGFyc2UgdGhlIGV4cHJlc3Npb24gYXQgb2Zmc2V0IGlkeCBpbnRvIHNiIGluLCByZXR1cm4gdGhlIHZhbHVlIGluIHZhbC4gIAotICAgaWYgdGhlIGV4cHJlc3Npb24gaXMgbm90IGNvbnN0YW50LCBnaXZlIEVSUk9SIGVtc2cuICByZXR1cm5zIHRoZSBpbmRleAotICAgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBwYXN0IHRoZSBlbmQgb2YgdGhlIGV4cHJlc3Npb24uICovCi0KLXN0YXRpYyBpbnQKLWV4cF9nZXRfYWJzIChlbXNnLCBpZHgsIGluLCB2YWwpCi0gICAgIGNvbnN0IGNoYXIgKmVtc2c7Ci0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgaW50ICp2YWw7Ci17Ci0gIGV4cF90IHJlczsKLSAgaWR4ID0gZXhwX3BhcnNlIChpZHgsIGluLCAmcmVzKTsKLSAgaWYgKHJlcy5hZGRfc3ltYm9sLmxlbiB8fCByZXMuc3ViX3N5bWJvbC5sZW4pCi0gICAgRVJST1IgKChzdGRlcnIsIGVtc2cpKTsKLSAgKnZhbCA9IHJlcy52YWx1ZTsKLSAgcmV0dXJuIGlkeDsKLX0KLQotCi1zYiBsYWJlbDsgLyogY3VycmVudCBsYWJlbCBwYXJzZWQgZnJvbSBsaW5lICovCi1oYXNoX3RhYmxlIGFzc2lnbl9oYXNoX3RhYmxlOyAgIC8qIGhhc2ggdGFibGUgZm9yIGFsbCBhc3NpZ25lZCB2YXJpYWJsZXMgKi8KLWhhc2hfdGFibGUga2V5d29yZF9oYXNoX3RhYmxlOyAgLyogaGFzaCB0YWJsZSBmb3Iga2V5d29yZCAqLwotaGFzaF90YWJsZSB2YXJzOyAgLyogaGFzaCB0YWJsZSBmb3IgIGVxIHZhcmlhYmxlcyAqLwotCi0jZGVmaW5lIGluX2NvbW1lbnQgJzsnCi0KLSNpZiAwCi1zdGF0aWMgdm9pZAotc3RyaXBfY29tbWVudHMgKG91dCkKLSAgICAgc2IgKm91dDsKLXsKLSAgY2hhciAqcyA9IG91dC0+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+cHRyW2lkeF0gPT0gJyInKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCAmYWNjKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhY2MubGVuOyBpKyspCi0JewotCSAgaWYgKGkpCi0JICAgIGZwcmludGYob3V0ZmlsZSwiLCIpOwotCSAgZnByaW50ZiAob3V0ZmlsZSwgIiVkIiwgYWNjLnB0cltpXSk7Ci0JfQotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICB3aGlsZSAoIWVvbCAoaWR4LCBpbikpCi0JewotCSAgZXhwX3QgZTsKLQkgIGlkeCA9IGV4cF9wYXJzZSAoaWR4LCBpbiwgJmUpOwotCSAgZXhwX3N0cmluZyAoJmUsICZhY2MpOwotCSAgc2JfYWRkX2NoYXIgKCZhY2MsIDApOwotCSAgZnByaW50ZiAob3V0ZmlsZSwgYWNjLnB0cik7Ci0JICBpZiAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gPT0gJywnKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIiwiKTsKLQkgICAgICBpZHgrKzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHNiX2tpbGwgKCZhY2MpOwotICBzYl9wcmludF9hdCAob3V0ZmlsZSwgaWR4LCBpbik7Ci0gIGZwcmludGYgKG91dGZpbGUsICJcbiIpOwotfQotCi0vKiAuZGF0YWIgWy5ifC53fC5sXSA8cmVwZWF0Piw8ZmlsbD4gKi8KLQotc3RhdGljIHZvaWQKLWRvX2RhdGFiIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGludCBvcHNpemU7Ci0gIGludCByZXBlYXQ7Ci0gIGludCBmaWxsOwotCi0gIGlkeCA9IGdldF9vcHNpemUgKGlkeCwgaW4sICZvcHNpemUpOwotCi0gIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJkYXRhYiByZXBlYXQgbXVzdCBiZSBjb25zdGFudC5cbiIpLCBpZHgsIGluLCAmcmVwZWF0KTsKLSAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJkYXRhYiBkYXRhIG11c3QgYmUgYWJzb2x1dGUuXG4iKSwgaWR4LCBpbiwgJmZpbGwpOwotCi0gIGZwcmludGYgKG91dGZpbGUsICIuZmlsbFx0JWQsJWQsJWRcbiIsIHJlcGVhdCwgb3BzaXplLCBmaWxsKTsKLX0KLQotLyogLmFsaWduIDxzaXplPiAqLwotCi1zdGF0aWMgdm9pZAotZG9fYWxpZ24gKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaW50IGFsLCBoYXZlX2ZpbGwsIGZpbGw7Ci0KLSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oImFsaWduIG5lZWRzIGFic29sdXRlIGV4cHJlc3Npb24uXG4iKSwgaWR4LCBpbiwgJmFsKTsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gIGhhdmVfZmlsbCA9IDA7Ci0gIGZpbGwgPSAwOwotICBpZiAoISBlb2wgKGlkeCwgaW4pKQotICAgIHsKLSAgICAgIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICAgICAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIi5hbGlnbiBuZWVkcyBhYnNvbHV0ZSBmaWxsIHZhbHVlLlxuIiksIGlkeCwgaW4sCi0JCQkgJmZpbGwpOwotICAgICAgaGF2ZV9maWxsID0gMTsKLSAgICB9Ci0KLSAgaWYgKGFsICE9IDEKLSAgICAgICYmIGFsICE9IDIKLSAgICAgICYmIGFsICE9IDQpCi0gICAgV0FSTklORyAoKHN0ZGVyciwgXygiYWxpZ25tZW50IG11c3QgYmUgb25lIG9mIDEsIDIgb3IgNC5cbiIpKSk7Ci0KLSAgZnByaW50ZiAob3V0ZmlsZSwgIi5hbGlnbgklZCIsIGFsKTsKLSAgaWYgKGhhdmVfZmlsbCkKLSAgICBmcHJpbnRmIChvdXRmaWxlLCAiLCVkIiwgZmlsbCk7Ci0gIGZwcmludGYgKG91dGZpbGUsICJcbiIpOwotfQotCi0vKiAucmVzWy5ifC53fC5sXSA8c2l6ZT4gKi8KLQotc3RhdGljIHZvaWQKLWRvX3JlcyAoaWR4LCBpbiwgdHlwZSkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgdHlwZTsKLXsKLSAgaW50IHNpemUgPSA0OwotICBpbnQgY291bnQgPSAwOwotCi0gIGlkeCA9IGdldF9vcHNpemUgKGlkeCwgaW4sICZzaXplKTsKLSAgd2hpbGUgKCFlb2woaWR4LCBpbikpCi0gICAgewotICAgICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gICAgICBpZiAoaW4tPnB0cltpZHhdID09ICcsJykKLQlpZHgrKzsKLSAgICAgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJyZXMgbmVlZHMgYWJzb2x1dGUgZXhwcmVzc2lvbiBmb3IgZmlsbCBjb3VudC5cbiIpLCBpZHgsIGluLCAmY291bnQpOwotCi0gICAgICBpZiAodHlwZSA9PSAnYycgfHwgdHlwZSA9PSAneicpCi0JY291bnQrKzsKLQotICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIi5zcGFjZQklZFxuIiwgY291bnQgKiBzaXplKTsKLSAgICB9Ci19Ci0KLQotLyogLmV4cG9ydCAqLwotCi1zdGF0aWMgdm9pZAotZG9fZXhwb3J0IChpbikKLSAgICAgc2IgKmluOwotewotICBmcHJpbnRmIChvdXRmaWxlLCAiLmdsb2JhbAklc1xuIiwgc2JfbmFtZSAoaW4pKTsKLX0KLQotLyogLnByaW50IFtsaXN0XSBbbm9saXN0XSAqLwotCi1zdGF0aWMgdm9pZAotZG9fcHJpbnQgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gIHdoaWxlIChpZHggPCBpbi0+bGVuKQotICAgIHsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoaW4tPnB0ciArIGlkeCwgIkxJU1QiLCA0KSA9PSAwKQotCXsKLQkgIGZwcmludGYgKG91dGZpbGUsICIubGlzdFxuIik7Ci0JICBpZHggKz0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW4tPnB0ciArIGlkeCwgIk5PTElTVCIsIDYpID09IDApCi0JewotCSAgZnByaW50ZiAob3V0ZmlsZSwgIi5ub2xpc3RcbiIpOwotCSAgaWR4ICs9IDY7Ci0JfQotICAgICAgaWR4Kys7Ci0gICAgfQotfQotCi0vKiAuaGVhZCAqLwotc3RhdGljIHZvaWQKLWRvX2hlYWRpbmcgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgc2IgaGVhZDsKLSAgc2JfbmV3ICgmaGVhZCk7Ci0gIGlkeCA9IGdldHN0cmluZyAoaWR4LCBpbiwgJmhlYWQpOwotICBmcHJpbnRmIChvdXRmaWxlLCAiLnRpdGxlCVwiJXNcIlxuIiwgc2JfbmFtZSAoJmhlYWQpKTsKLSAgc2Jfa2lsbCAoJmhlYWQpOwotfQotCi0vKiAucGFnZSAqLwotCi1zdGF0aWMgdm9pZAotZG9fcGFnZSAoKQotewotICBmcHJpbnRmIChvdXRmaWxlLCAiLmVqZWN0XG4iKTsKLX0KLQotLyogLmZvcm0gW2xpbj08dmFsdWU+XSBbY29sPTx2YWx1ZT5dICovCi1zdGF0aWMgdm9pZAotZG9fZm9ybSAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBpbnQgbGluZXMgPSA2MDsKLSAgaW50IGNvbHVtbnMgPSAxMzI7Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCi0gIHdoaWxlIChpZHggPCBpbi0+bGVuKQotICAgIHsKLQotICAgICAgaWYgKHN0cm5jYXNlY21wIChpbi0+cHRyICsgaWR4LCAiTElOPSIsIDQpID09IDApCi0JewotCSAgaWR4ICs9IDQ7Ci0JICBpZHggPSBleHBfZ2V0X2FicyAoXygiZm9ybSBMSU49IG5lZWRzIGFic29sdXRlIGV4cHJlc3NzaW9uLlxuIiksIGlkeCwgaW4sICZsaW5lcyk7Ci0JfQotCi0gICAgICBpZiAoc3RybmNhc2VjbXAgKGluLT5wdHIgKyBpZHgsIF8oIkNPTD0iKSwgNCkgPT0gMCkKLQl7Ci0JICBpZHggKz0gNDsKLQkgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJmb3JtIENPTD0gbmVlZHMgYWJzb2x1dGUgZXhwcmVzc3Npb24uXG4iKSwgaWR4LCBpbiwgJmNvbHVtbnMpOwotCX0KLQotICAgICAgaWR4Kys7Ci0gICAgfQotICBmcHJpbnRmIChvdXRmaWxlLCAiLnBzaXplICVkLCVkXG4iLCBsaW5lcywgY29sdW1ucyk7Ci0KLX0KLQotCi0vKiBGZXRjaCBzdHJpbmcgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLAotICAgcnVsZXM6Ci0gICAgJ0J4eXg8d2hpdGVzcGFjZT4gIAktPiByZXR1cm4gJ0J4eXphCi0gICAgJTxjaGFyPgkJLT4gcmV0dXJuIHN0cmluZyBvZiBkZWNpbWFsIHZhbHVlIG9mIHgKLSAgICAiPHN0cmluZz4iCQktPiByZXR1cm4gc3RyaW5nCi0gICAgeHl4PHdoaXRlc3BhY2U+ICAgICAtPiByZXR1cm4geHl6Ci0qLwotc3RhdGljIGludAotZ2V0X2FueV9zdHJpbmcgKGlkeCwgaW4sIG91dCwgZXhwYW5kLCBwcmV0ZW5kX3F1b3RlZCkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqb3V0OwotICAgICBpbnQgZXhwYW5kOwotICAgICBpbnQgcHJldGVuZF9xdW90ZWQ7Ci17Ci0gIHNiX3Jlc2V0IChvdXQpOwotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQotICBpZiAoaWR4IDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBpZiAoaW4tPmxlbiA+IDIgJiYgaW4tPnB0cltpZHgrMV0gPT0gJ1wnJyAmJiBJU0JBU0UgKGluLT5wdHJbaWR4XSkpCi0JewotCSAgd2hpbGUgKCFJU1NFUCAoaW4tPnB0cltpZHhdKSkKLQkgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHgrK10pOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnJScKLQkgICAgICAgJiYgYWx0ZXJuYXRlCi0JICAgICAgICYmIGV4cGFuZCkKLQl7Ci0JICBpbnQgdmFsOwotCSAgY2hhciBidWZbMjBdOwotCSAgLyogVHVybnMgdGhlIG5leHQgZXhwcmVzc2lvbiBpbnRvIGEgc3RyaW5nICovCi0JICBpZHggPSBleHBfZ2V0X2FicyAoXygiJSBvcGVyYXRvciBuZWVkcyBhYnNvbHV0ZSBleHByZXNzaW9uIiksCi0JCQkgICAgIGlkeCArIDEsCi0JCQkgICAgIGluLAotCQkJICAgICAmdmFsKTsKLQkgIHNwcmludGYoYnVmLCAiJWQiLCB2YWwpOwotCSAgc2JfYWRkX3N0cmluZyAob3V0LCBidWYpOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicKLQkgICAgICAgfHwgaW4tPnB0cltpZHhdID09ICc8JwotCSAgICAgICB8fCAoYWx0ZXJuYXRlICYmIGluLT5wdHJbaWR4XSA9PSAnXCcnKSkKLQl7Ci0JICBpZiAoYWx0ZXJuYXRlICYmIGV4cGFuZCkKLQkgICAgewotCSAgICAgIC8qIEtlZXAgdGhlIHF1b3RlcyAqLwotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICAnXCInKTsKLQkJICAgIAotCSAgICAgIGlkeCA9ICBnZXRzdHJpbmcgKGlkeCwgaW4sIG91dCk7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgICdcIicpOwotCi0JICAgIH0KLQkgIGVsc2UgewotCSAgICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sIG91dCk7Ci0JICB9Ci0JfQotICAgICAgZWxzZSAKLQl7Ci0JICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAKLQkJICYmIChpbi0+cHRyW2lkeF0gPT0gJyInCi0JCSAgICAgfHwgaW4tPnB0cltpZHhdID09ICdcJycKLQkJICAgICB8fCBwcmV0ZW5kX3F1b3RlZCAKLQkJICAgICB8fCAhSVNTRVAgKGluLT5wdHJbaWR4XSkpKQotCSAgICB7Ci0JICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicgCi0JCSAgfHwgaW4tPnB0cltpZHhdID09ICdcJycpCi0JCXsKLQkJICBjaGFyIHRjaGFyID0gaW4tPnB0cltpZHhdOwotCQkgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4KytdKTsKLQkJICB3aGlsZSAoaWR4IDwgaW4tPmxlbgotCQkJICYmIGluLT5wdHJbaWR4XSAhPSB0Y2hhcikKLQkJICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4KytdKTsJCSAgICAKLQkJICBpZiAoaWR4ID09IGluLT5sZW4pCi0JCSAgICByZXR1cm4gaWR4OwkgICAgICAKLQkJfQotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4KytdKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGlkeDsKLX0KLQotCi0vKiBza2lwIGFsb25nIHNiIGluIHN0YXJ0aW5nIGF0IGlkeCwgc3VjayBvZmYgd2hpdGVzcGFjZSBhICggYW5kIG1vcmUKLSAgIHdoaXRlc3BhY2UuICByZXR1cm4gdGhlIGlkeCBvZiB0aGUgbmV4dCBjaGFyICovCi0KLXN0YXRpYyBpbnQKLXNraXBfb3BlbnAgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gIGlmIChpbi0+cHRyW2lkeF0gIT0gJygnKQotICAgIEVSUk9SICgoc3RkZXJyLCBfKCJtaXNwbGFjZWQgKCAuXG4iKSkpOwotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHggKyAxLCBpbik7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIHNraXAgYWxvbmcgc2IgaW4gc3RhcnRpbmcgYXQgaWR4LCBzdWNrIG9mZiB3aGl0ZXNwYWNlIGEgKSBhbmQgbW9yZQotICAgd2hpdGVzcGFjZS4gIHJldHVybiB0aGUgaWR4IG9mIHRoZSBuZXh0IGNoYXIgKi8KLQotc3RhdGljIGludAotc2tpcF9jbG9zZXAgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gIGlmIChpbi0+cHRyW2lkeF0gIT0gJyknKQotICAgIEVSUk9SICgoc3RkZXJyLCBfKCJtaXNwbGFjZWQgKS5cbiIpKSk7Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCArIDEsIGluKTsKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogLmxlbiAqLwotCi1zdGF0aWMgaW50Ci1kb2xlbiAoaWR4LCBpbiwgb3V0KQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci17Ci0KLSAgc2Igc3RyaW5nb3V0OwotICBjaGFyIGJ1ZmZlclsxMF07Ci0KLSAgc2JfbmV3ICgmc3RyaW5nb3V0KTsKLSAgaWR4ID0gc2tpcF9vcGVucCAoaWR4LCBpbik7Ci0gIGlkeCA9IGdldF9hbmRfcHJvY2VzcyAoaWR4LCBpbiwgJnN0cmluZ291dCk7Ci0gIGlkeCA9IHNraXBfY2xvc2VwIChpZHgsIGluKTsKLSAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCBzdHJpbmdvdXQubGVuKTsKLSAgc2JfYWRkX3N0cmluZyAob3V0LCBidWZmZXIpOwotCi0gIHNiX2tpbGwgKCZzdHJpbmdvdXQpOwotICByZXR1cm4gaWR4OwotfQotCi0KLS8qIC5pbnN0ciAqLwotCi1zdGF0aWMKLWludAotZG9pbnN0ciAoaWR4LCBpbiwgb3V0KQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci17Ci0gIHNiIHN0cmluZzsKLSAgc2Igc2VhcmNoOwotICBpbnQgaTsKLSAgaW50IHN0YXJ0OwotICBpbnQgcmVzOwotICBjaGFyIGJ1ZmZlclsxMF07Ci0KLSAgc2JfbmV3ICgmc3RyaW5nKTsKLSAgc2JfbmV3ICgmc2VhcmNoKTsKLSAgaWR4ID0gc2tpcF9vcGVucCAoaWR4LCBpbik7Ci0gIGlkeCA9IGdldF9hbmRfcHJvY2VzcyAoaWR4LCBpbiwgJnN0cmluZyk7Ci0gIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICBpZHggPSBnZXRfYW5kX3Byb2Nlc3MgKGlkeCwgaW4sICZzZWFyY2gpOwotICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeF0pKQotICAgIHsKLSAgICAgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCIuaW5zdHIgbmVlZHMgYWJzb2x1dGUgZXhwcmVzc29uLlxuIiksIGlkeCwgaW4sICZzdGFydCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RhcnQgPSAwOwotICAgIH0KLSAgaWR4ID0gc2tpcF9jbG9zZXAgKGlkeCwgaW4pOwotICByZXMgPSAtMTsKLSAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdHJpbmcubGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKHN0cmluZy5wdHIgKyBpLCBzZWFyY2gucHRyLCBzZWFyY2gubGVuKSA9PSAwKQotCXsKLQkgIHJlcyA9IGk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBzcHJpbnRmIChidWZmZXIsICIlZCIsIHJlcyk7Ci0gIHNiX2FkZF9zdHJpbmcgKG91dCwgYnVmZmVyKTsKLSAgc2Jfa2lsbCAoJnN0cmluZyk7Ci0gIHNiX2tpbGwgKCZzZWFyY2gpOwotICByZXR1cm4gaWR4OwotfQotCi0KLXN0YXRpYyBpbnQKLWRvc3Vic3RyIChpZHgsIGluLCBvdXQpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKm91dDsKLXsKLSAgc2Igc3RyaW5nOwotICBpbnQgcG9zOwotICBpbnQgbGVuOwotICBzYl9uZXcgKCZzdHJpbmcpOwotCi0gIGlkeCA9IHNraXBfb3BlbnAgKGlkeCwgaW4pOwotICBpZHggPSBnZXRfYW5kX3Byb2Nlc3MgKGlkeCwgaW4sICZzdHJpbmcpOwotICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIm5lZWQgYWJzb2x1dGUgcG9zaXRpb24uXG4iKSwgaWR4LCBpbiwgJnBvcyk7Ci0gIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICBpZHggPSBleHBfZ2V0X2FicyAoXygibmVlZCBhYnNvbHV0ZSBsZW5ndGguXG4iKSwgaWR4LCBpbiwgJmxlbik7Ci0gIGlkeCA9IHNraXBfY2xvc2VwIChpZHgsIGluKTsKLQotCi0gIGlmIChsZW4gPCAwIHx8IHBvcyA8IDAgfHwKLSAgICAgIHBvcyA+IHN0cmluZy5sZW4KLSAgICAgIHx8IHBvcyArIGxlbiA+IHN0cmluZy5sZW4pCi0gICAgewotICAgICAgc2JfYWRkX3N0cmluZyAob3V0LCAiICIpOwotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICBzYl9hZGRfY2hhciAob3V0LCAnIicpOwotICAgICAgd2hpbGUgKGxlbiA+IDApCi0JewotCSAgc2JfYWRkX2NoYXIgKG91dCwgc3RyaW5nLnB0cltwb3MrK10pOwotCSAgbGVuLS07Ci0JfQotICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJyInKTsKLSAgICB9Ci0gIHNiX2tpbGwoJnN0cmluZyk7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIHNjYW4gbGluZSwgY2hhbmdlIHRva2VucyBpbiB0aGUgaGFzaCB0YWJsZSB0byB0aGVpciByZXBsYWNlbWVudHMgKi8KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2Fzc2lnbnMgKGlkeCwgaW4sIGJ1ZikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqYnVmOwotewotICB3aGlsZSAoaWR4IDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBoYXNoX2VudHJ5ICpwdHI7Ci0gICAgICBpZiAoaW4tPnB0cltpZHhdID09ICdcXCcKLQkgICYmIGlkeCArIDEgPCBpbi0+bGVuCi0JICAmJiBpbi0+cHRyW2lkeCArIDFdID09ICcoJykKLQl7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgc2JfYWRkX2NoYXIgKGJ1ZiwgaW4tPnB0cltpZHhdKTsKLQkgICAgICBpZHgrKzsKLQkgICAgfQotCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHggLSAxXSAhPSAnKScpOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnXFwnCi0JICAmJiBpZHggKyAxIDwgaW4tPmxlbgotCSAgJiYgaW4tPnB0cltpZHggKyAxXSA9PSAnJicpCi0JewotCSAgaWR4ID0gY29uZGFzc19sb29rdXBfbmFtZSAoaW4sIGlkeCArIDIsIGJ1ZiwgMSk7Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICdcXCcKLQkgICAgICAgJiYgaWR4ICsgMSA8IGluLT5sZW4KLQkgICAgICAgJiYgaW4tPnB0cltpZHggKyAxXSA9PSAnJCcpCi0JewotCSAgaWR4ID0gY29uZGFzc19sb29rdXBfbmFtZSAoaW4sIGlkeCArIDIsIGJ1ZiwgMCk7Ci0JfQotICAgICAgZWxzZSBpZiAoaWR4ICsgMyA8IGluLT5sZW4KLQkgICAgICAgJiYgaW4tPnB0cltpZHhdID09ICcuJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAxXSkgPT0gJ0wnCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDJdKSA9PSAnRScKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgM10pID09ICdOJykKLQlpZHggPSBkb2xlbiAoaWR4ICsgNCwgaW4sIGJ1Zik7Ci0gICAgICBlbHNlIGlmIChpZHggKyA2IDwgaW4tPmxlbgotCSAgICAgICAmJiBpbi0+cHRyW2lkeF0gPT0gJy4nCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDFdKSA9PSAnSScKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgMl0pID09ICdOJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAzXSkgPT0gJ1MnCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDRdKSA9PSAnVCcKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgNV0pID09ICdSJykKLQlpZHggPSBkb2luc3RyIChpZHggKyA2LCBpbiwgYnVmKTsKLSAgICAgIGVsc2UgaWYgKGlkeCArIDcgPCBpbi0+bGVuCi0JICAgICAgICYmIGluLT5wdHJbaWR4XSA9PSAnLicKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgMV0pID09ICdTJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAyXSkgPT0gJ1UnCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDNdKSA9PSAnQicKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgNF0pID09ICdTJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyA1XSkgPT0gJ1QnCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDZdKSA9PSAnUicpCi0JaWR4ID0gZG9zdWJzdHIgKGlkeCArIDcsIGluLCBidWYpOwotICAgICAgZWxzZSBpZiAoSVNGSVJTVENIQVIgKGluLT5wdHJbaWR4XSkpCi0JewotCSAgLyogbWF5IGJlIGEgc2ltcGxlIG5hbWUgc3Vic2l0dXRpb24sIHNlZSBpZiB3ZSBoYXZlIGEgd29yZCAqLwotCSAgc2IgYWNjOwotCSAgaW50IGN1ciA9IGlkeCArIDE7Ci0JICB3aGlsZSAoY3VyIDwgaW4tPmxlbgotCQkgJiYgKElTTkVYVENIQVIgKGluLT5wdHJbY3VyXSkpKQotCSAgICBjdXIrKzsKLQotCSAgc2JfbmV3ICgmYWNjKTsKLQkgIHNiX2FkZF9idWZmZXIgKCZhY2MsIGluLT5wdHIgKyBpZHgsIGN1ciAtIGlkeCk7Ci0JICBwdHIgPSBoYXNoX2xvb2t1cCAoJmFzc2lnbl9oYXNoX3RhYmxlLCAmYWNjKTsKLQkgIGlmIChwdHIpCi0JICAgIHsKLQkgICAgICAvKiBGb3VuZCBhIGRlZmluaXRpb24gZm9yIGl0ICovCi0JICAgICAgc2JfYWRkX3NiIChidWYsICZwdHItPnZhbHVlLnMpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBObyBkZWZpbml0aW9uLCBqdXN0IGNvcHkgdGhlIHdvcmQgKi8KLQkgICAgICBzYl9hZGRfc2IgKGJ1ZiwgJmFjYyk7Ci0JICAgIH0KLQkgIHNiX2tpbGwgKCZhY2MpOwotCSAgaWR4ID0gY3VyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzYl9hZGRfY2hhciAoYnVmLCBpbi0+cHRyW2lkeCsrXSk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIGludAotZ2V0X2FuZF9wcm9jZXNzIChpZHgsIGluLCBvdXQpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKm91dDsKLXsKLSAgc2IgdDsKLSAgc2JfbmV3ICgmdCk7Ci0gIGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHgsIGluLCAmdCwgMSwgMCk7Ci0gIHByb2Nlc3NfYXNzaWducyAoMCwgJnQsIG91dCk7Ci0gIHNiX2tpbGwgKCZ0KTsKLSAgcmV0dXJuIGlkeDsKLX0KLQotc3RhdGljCi12b2lkCi1wcm9jZXNzX2ZpbGUgKCkKLXsKLSAgc2IgbGluZTsKLSAgc2IgdDEsIHQyOwotICBzYiBhY2M7Ci0gIHNiIGxhYmVsX2luOwotICBpbnQgbW9yZTsKLQotICBzYl9uZXcgKCZsaW5lKTsKLSAgc2JfbmV3ICgmdDEpOwotICBzYl9uZXcgKCZ0Mik7Ci0gIHNiX25ldygmYWNjKTsKLSAgc2JfbmV3ICgmbGFiZWxfaW4pOwotICBzYl9yZXNldCAoJmxpbmUpOwotICBtb3JlID0gZ2V0X2xpbmUgKCZsaW5lKTsKLSAgd2hpbGUgKG1vcmUpCi0gICAgewotICAgICAgLyogRmluZCBhbnkgbGFiZWwgYW5kIHBzZXVkbyBvcCB0aGF0IHdlJ3JlIGludGVzdGVkIGluICovCi0gICAgICBpbnQgbDsKLSAgICAgIGlmIChsaW5lLmxlbiA9PSAwKQotCXsKLQkgIGlmIChjb25kYXNzX29uICgpKQotCSAgICBmcHJpbnRmIChvdXRmaWxlLCAiXG4iKTsKLQl9Ci0gICAgICBlbHNlIGlmIChtcmkKLQkgICAgICAgJiYgKGxpbmUucHRyWzBdID09ICcqJwotCQkgICB8fCBsaW5lLnB0clswXSA9PSAnIScpKQotCXsKLQkgIC8qIE1SSSBsaW5lIGNvbW1lbnQuICAqLwotCSAgZnByaW50ZiAob3V0ZmlsZSwgc2JfbmFtZSAoJmxpbmUpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbCA9IGdyYWJfbGFiZWwgKCZsaW5lLCAmbGFiZWxfaW4pOwotCSAgc2JfcmVzZXQgKCZsYWJlbCk7CSAgCSAgCi0KLQkgIGlmIChsaW5lLnB0cltsXSA9PSAnOicpCi0JICAgIGwrKzsKLQkgIHdoaWxlIChJU1dISVRFIChsaW5lLnB0cltsXSkgJiYgbCA8IGxpbmUubGVuKQotCSAgICBsKys7Ci0KLQkgIGlmIChsYWJlbF9pbi5sZW4pCi0JICAgIHsKLQkgICAgICBpbnQgZG9fYXNzaWduczsKLQotCSAgICAgIC8qIE11bmdlIHRoZSBsYWJlbCwgdW5sZXNzIHRoaXMgaXMgRVFVIG9yIEFTU0lHTi4gICovCi0JICAgICAgZG9fYXNzaWducyA9IDE7Ci0JICAgICAgaWYgKGwgPCBsaW5lLmxlbgotCQkgICYmIChsaW5lLnB0cltsXSA9PSAnLicgfHwgYWx0ZXJuYXRlIHx8IG1yaSkpCi0JCXsKLQkJICBpbnQgbHggPSBsOwotCi0JCSAgaWYgKGxpbmUucHRyW2x4XSA9PSAnLicpCi0JCSAgICArK2x4OwotCQkgIGlmIChseCArIDMgPD0gbGluZS5sZW4KLQkJICAgICAgJiYgc3RybmNhc2VjbXAgKCJFUVUiLCBsaW5lLnB0ciArIGx4LCAzKSA9PSAwCi0JCSAgICAgICYmIChseCArIDMgPT0gbGluZS5sZW4KLQkJCSAgfHwgISBJU0ZJUlNUQ0hBUiAobGluZS5wdHJbbHggKyAzXSkpKQotCQkgICAgZG9fYXNzaWducyA9IDA7Ci0JCSAgZWxzZSBpZiAobHggKyA2IDw9IGxpbmUubGVuCi0JCQkgICAmJiBzdHJuY2FzZWNtcCAoIkFTU0lHTiIsIGxpbmUucHRyICsgbHgsIDYpID09IDAKLQkJCSAgICYmIChseCArIDYgPT0gbGluZS5sZW4KLQkJCSAgICAgICB8fCAhIElTRklSU1RDSEFSIChsaW5lLnB0cltseCArIDZdKSkpCi0JCSAgICBkb19hc3NpZ25zID0gMDsKLQkJfQotCi0JICAgICAgaWYgKGRvX2Fzc2lnbnMpCi0JCXByb2Nlc3NfYXNzaWducyAoMCwgJmxhYmVsX2luLCAmbGFiZWwpOwotCSAgICAgIGVsc2UKLQkJc2JfYWRkX3NiICgmbGFiZWwsICZsYWJlbF9pbik7Ci0JICAgIH0KLQotCSAgaWYgKGwgPCBsaW5lLmxlbikKLQkgICAgewotCSAgICAgIGlmIChwcm9jZXNzX3BzZXVkb19vcCAobCwgJmxpbmUsICZhY2MpKQotCQl7Ci0KLQotCi0JCX0KLQkgICAgICBlbHNlIGlmIChjb25kYXNzX29uICgpKQotCQl7Ci0JCSAgaWYgKG1hY3JvX29wIChsLCAmbGluZSkpCi0JCSAgICB7Ci0KLQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgewotCQkJaWYgKGxhYmVsLmxlbikKLQkJCSAgewotCQkJICAgIGZwcmludGYgKG91dGZpbGUsICIlczpcdCIsIHNiX25hbWUgKCZsYWJlbCkpOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIGZwcmludGYgKG91dGZpbGUsICJcdCIpOwotCQkJc2JfcmVzZXQoJnQxKTsKLQkJCXByb2Nlc3NfYXNzaWducyAobCwgJmxpbmUsICZ0MSk7Ci0JCQlzYl9yZXNldCAoJnQyKTsKLQkJCWNoYW5nZV9iYXNlICgwLCAmdDEsICZ0Mik7Ci0JCQlmcHJpbnRmIChvdXRmaWxlLCAiJXNcbiIsIHNiX25hbWUgKCZ0MikpOwotCQkgICAgICB9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZSB7Ci0JICAgIC8qIE9ubHkgYSBsYWJlbCBvbiB0aGlzIGxpbmUgKi8KLQkgICAgaWYgKGxhYmVsLmxlbiAmJiBjb25kYXNzX29uKCkpCi0JICAgICAgewotCQlmcHJpbnRmIChvdXRmaWxlLCAiJXM6XG4iLCBzYl9uYW1lICgmbGFiZWwpKTsKLQkgICAgICB9Ci0JICB9Ci0JfQotCi0gICAgICBpZiAoaGFkX2VuZCkKLQlicmVhazsKLSAgICAgIHNiX3Jlc2V0ICgmbGluZSk7Ci0gICAgICBtb3JlID0gZ2V0X2xpbmUgKCZsaW5lKTsKLSAgICB9Ci0KLSAgaWYgKCFoYWRfZW5kICYmICFtcmkpCi0gICAgV0FSTklORyAoKHN0ZGVyciwgXygiRU5EIG1pc3NpbmcgZnJvbSBlbmQgb2YgZmlsZS5cbiIpKSk7Ci19Ci0KLQotCi0KLQotc3RhdGljIHZvaWQKLWZyZWVfb2xkX2VudHJ5IChwdHIpCi0gICAgIGhhc2hfZW50cnkgKnB0cjsKLXsKLSAgaWYgKHB0cikKLSAgICB7Ci0gICAgICBpZiAocHRyLT50eXBlID09IGhhc2hfc3RyaW5nKQotCXNiX2tpbGwoJnB0ci0+dmFsdWUucyk7Ci0gICAgfQotfQotCi0vKiBuYW1lOiAuQVNTSUdOQSA8dmFsdWU+ICovCi0KLXN0YXRpYyB2b2lkCi1kb19hc3NpZ25hIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIHNiIHRtcDsKLSAgaW50IHZhbDsKLSAgc2JfbmV3ICgmdG1wKTsKLQotICBwcm9jZXNzX2Fzc2lnbnMgKGlkeCwgaW4sICZ0bXApOwotICBpZHggPSBleHBfZ2V0X2FicyAoXygiLkFTU0lHTkEgbmVlZHMgY29uc3RhbnQgZXhwcmVzc2lvbiBhcmd1bWVudC5cbiIpLCAwLCAmdG1wLCAmdmFsKTsKLQotICBpZiAoIWxhYmVsLmxlbikKLSAgICB7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygiLkFTU0lHTkEgd2l0aG91dCBsYWJlbC5cbiIpKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaGFzaF9lbnRyeSAqcHRyID0gaGFzaF9jcmVhdGUgKCZ2YXJzLCAmbGFiZWwpOwotICAgICAgZnJlZV9vbGRfZW50cnkgKHB0cik7Ci0gICAgICBwdHItPnR5cGUgPSBoYXNoX2ludGVnZXI7Ci0gICAgICBwdHItPnZhbHVlLmkgPSB2YWw7Ci0gICAgfQotICBzYl9raWxsICgmdG1wKTsKLX0KLQotLyogbmFtZTogLkFTU0lHTkMgPHN0cmluZz4gKi8KLQotc3RhdGljIHZvaWQKLWRvX2Fzc2lnbmMgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgc2IgYWNjOwotICBzYl9uZXcgKCZhY2MpOwotICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sICZhY2MpOwotCi0gIGlmICghbGFiZWwubGVuKQotICAgIHsKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCIuQVNTSUdOUyB3aXRob3V0IGxhYmVsLlxuIikpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoYXNoX2VudHJ5ICpwdHIgPSBoYXNoX2NyZWF0ZSAoJnZhcnMsICZsYWJlbCk7Ci0gICAgICBmcmVlX29sZF9lbnRyeSAocHRyKTsKLSAgICAgIHB0ci0+dHlwZSA9IGhhc2hfc3RyaW5nOwotICAgICAgc2JfbmV3ICgmcHRyLT52YWx1ZS5zKTsKLSAgICAgIHNiX2FkZF9zYiAoJnB0ci0+dmFsdWUucywgJmFjYyk7Ci0gICAgfQotICBzYl9raWxsICgmYWNjKTsKLX0KLQotCi0vKiBuYW1lOiAuUkVHIChyZWcpICovCi0KLXN0YXRpYyB2b2lkCi1kb19yZWcgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgLyogcmVtb3ZlIHJlZyBzdHVmZiBmcm9tIGluc2lkZSBwYXJlbnMgKi8KLSAgc2Igd2hhdDsKLSAgaWYgKCFtcmkpCi0gICAgaWR4ID0gc2tpcF9vcGVucCAoaWR4LCBpbik7Ci0gIGVsc2UKLSAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgc2JfbmV3ICgmd2hhdCk7Ci0gIHdoaWxlIChpZHggPCBpbi0+bGVuCi0JICYmIChtcmkKLQkgICAgID8gISBlb2wgKGlkeCwgaW4pCi0JICAgICA6IGluLT5wdHJbaWR4XSAhPSAnKScpKQotICAgIHsKLSAgICAgIHNiX2FkZF9jaGFyICgmd2hhdCwgaW4tPnB0cltpZHhdKTsKLSAgICAgIGlkeCsrOwotICAgIH0KLSAgaGFzaF9hZGRfdG9fc3RyaW5nX3RhYmxlICgmYXNzaWduX2hhc2hfdGFibGUsICZsYWJlbCwgJndoYXQsIDEpOwotICBzYl9raWxsICgmd2hhdCk7Ci19Ci0KLQotc3RhdGljIGludAotY29uZGFzc19sb29rdXBfbmFtZSAoaW5idWYsIGlkeCwgb3V0LCB3YXJuKQotICAgICBzYiAqaW5idWY7Ci0gICAgIGludCBpZHg7Ci0gICAgIHNiICpvdXQ7Ci0gICAgIGludCB3YXJuOwotewotICBoYXNoX2VudHJ5ICpwdHI7Ci0gIHNiIGNvbmRhc3NfYWNjOwotICBzYl9uZXcgKCZjb25kYXNzX2FjYyk7Ci0KLSAgd2hpbGUgKGlkeCA8IGluYnVmLT5sZW4KLQkgJiYgSVNORVhUQ0hBUiAoaW5idWYtPnB0cltpZHhdKSkKLSAgICB7Ci0gICAgICBzYl9hZGRfY2hhciAoJmNvbmRhc3NfYWNjLCBpbmJ1Zi0+cHRyW2lkeCsrXSk7Ci0gICAgfQotCi0gIGlmIChpbmJ1Zi0+cHRyW2lkeF0gPT0gJ1wnJykKLSAgICBpZHgrKzsKLSAgcHRyID0gaGFzaF9sb29rdXAgKCZ2YXJzLCAmY29uZGFzc19hY2MpOwotCi0KLSAgaWYgKCFwdHIpCi0gICAgewotICAgICAgaWYgKHdhcm4pIAotCXsKLQkgIFdBUk5JTkcgKChzdGRlcnIsIF8oIkNhbid0IGZpbmQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlICVzLlxuIiksIHNiX25hbWUgKCZjb25kYXNzX2FjYykpKTsKLQl9Ci0gICAgICBlbHNlIAotCXsKLQkgIHNiX2FkZF9zdHJpbmcgKG91dCwgIjAiKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHB0ci0+dHlwZSA9PSBoYXNoX2ludGVnZXIpCi0JewotCSAgY2hhciBidWZmZXJbMzBdOwotCSAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCBwdHItPnZhbHVlLmkpOwotCSAgc2JfYWRkX3N0cmluZyAob3V0LCBidWZmZXIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzYl9hZGRfc2IgKG91dCwgJnB0ci0+dmFsdWUucyk7Ci0JfQotICAgIH0KLSAgc2Jfa2lsbCAoJmNvbmRhc3NfYWNjKTsKLSAgcmV0dXJuIGlkeDsKLX0KLQotI2RlZmluZSBFUSAxCi0jZGVmaW5lIE5FIDIKLSNkZWZpbmUgR0UgMwotI2RlZmluZSBMVCA0Ci0jZGVmaW5lIExFIDUKLSNkZWZpbmUgR1QgNgotI2RlZmluZSBORVZFUiA3Ci0KLXN0YXRpYyBpbnQKLXdoYXRjb25kIChpZHgsIGluLCB2YWwpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgaW50ICp2YWw7Ci17Ci0gIGludCBjb25kOwotCi0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICBjb25kID0gTkVWRVI7Ci0gIGlmIChpZHggKyAxIDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBjaGFyICpwOwotICAgICAgY2hhciBhLCBiOwotCi0gICAgICBwID0gaW4tPnB0ciArIGlkeDsKLSAgICAgIGEgPSB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgcFswXSk7Ci0gICAgICBiID0gdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIHBbMV0pOwotICAgICAgaWYgKGEgPT0gJ0UnICYmIGIgPT0gJ1EnKQotCWNvbmQgPSBFUTsKLSAgICAgIGVsc2UgaWYgKGEgPT0gJ04nICYmIGIgPT0gJ0UnKQotCWNvbmQgPSBORTsKLSAgICAgIGVsc2UgaWYgKGEgPT0gJ0wnICYmIGIgPT0gJ1QnKQotCWNvbmQgPSBMVDsKLSAgICAgIGVsc2UgaWYgKGEgPT0gJ0wnICYmIGIgPT0gJ0UnKQotCWNvbmQgPSBMRTsKLSAgICAgIGVsc2UgaWYgKGEgPT0gJ0cnICYmIGIgPT0gJ1QnKQotCWNvbmQgPSBHVDsKLSAgICAgIGVsc2UgaWYgKGEgPT0gJ0cnICYmIGIgPT0gJ0UnKQotCWNvbmQgPSBHRTsKLSAgICB9Ci0gIGlmIChjb25kID09IE5FVkVSKQotICAgIHsKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJDb21wYXJpc29uIG9wZXJhdG9yIG11c3QgYmUgb25lIG9mIEVRLCBORSwgTFQsIExFLCBHVCBvciBHRS5cbiIpKSk7Ci0gICAgICBjb25kID0gTkVWRVI7Ci0gICAgfQotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHggKyAyLCBpbik7Ci0gICp2YWwgPSBjb25kOwotICByZXR1cm4gaWR4OwotfQotCi1zdGF0aWMgaW50Ci1pc3RydWUgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaW50IHJlczsKLSAgc2IgYWNjX2E7Ci0gIHNiIGNvbmQ7Ci0gIHNiIGFjY19iOwotICBzYl9uZXcgKCZhY2NfYSk7Ci0gIHNiX25ldyAoJmNvbmQpOwotICBzYl9uZXcgKCZhY2NfYik7Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCi0gIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInKQotICAgIHsKLSAgICAgIGludCBjb25kOwotICAgICAgaW50IHNhbWU7Ci0gICAgICAvKiBUaGlzIGlzIGEgc3RyaW5nIGNvbXBhcmlzaW9uICovCi0gICAgICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sICZhY2NfYSk7Ci0gICAgICBpZHggPSB3aGF0Y29uZCAoaWR4LCBpbiwgJmNvbmQpOwotICAgICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCAmYWNjX2IpOwotICAgICAgc2FtZSA9IGFjY19hLmxlbiA9PSBhY2NfYi5sZW4gJiYgKHN0cm5jbXAgKGFjY19hLnB0ciwgYWNjX2IucHRyLCBhY2NfYS5sZW4pID09IDApOwotCi0gICAgICBpZiAoY29uZCAhPSBFUSAmJiBjb25kICE9IE5FKQotCXsKLQkgIEVSUk9SICgoc3RkZXJyLCBfKCJDb21wYXJpc29uIG9wZXJhdG9yIGZvciBzdHJpbmdzIG11c3QgYmUgRVEgb3IgTkVcbiIpKSk7Ci0JICByZXMgPSAwOwotCX0KLSAgICAgIGVsc2UKLQlyZXMgPSAoY29uZCAhPSBFUSkgXiBzYW1lOwotICAgIH0KLSAgZWxzZQotICAgIC8qIFRoaXMgaXMgYSBudW1lcmljIGV4cHJlc3Npb24gKi8KLSAgICB7Ci0gICAgICBpbnQgdmFsYTsKLSAgICAgIGludCB2YWxiOwotICAgICAgaW50IGNvbmQ7Ci0gICAgICBpZHggPSBleHBfZ2V0X2FicyAoXygiQ29uZGl0aW9uYWwgb3BlcmF0b3IgbXVzdCBoYXZlIGFic29sdXRlIG9wZXJhbmRzLlxuIiksIGlkeCwgaW4sICZ2YWxhKTsKLSAgICAgIGlkeCA9IHdoYXRjb25kIChpZHgsIGluLCAmY29uZCk7Ci0gICAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInKQotCXsKLQkgIFdBUk5JTkcgKChzdGRlcnIsIF8oIlN0cmluZyBjb21wYXJlZCBhZ2FpbnN0IGV4cHJlc3Npb24uXG4iKSkpOwotCSAgcmVzID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIkNvbmRpdGlvbmFsIG9wZXJhdG9yIG11c3QgaGF2ZSBhYnNvbHV0ZSBvcGVyYW5kcy5cbiIpLCBpZHgsIGluLCAmdmFsYik7Ci0JICBzd2l0Y2ggKGNvbmQpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXMgPSA0MjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBFUToKLQkgICAgICByZXMgPSB2YWxhID09IHZhbGI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTkU6Ci0JICAgICAgcmVzID0gdmFsYSAhPSB2YWxiOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIExUOgotCSAgICAgIHJlcyA9IHZhbGEgPCB2YWxiOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIExFOgotCSAgICAgIHJlcyA9IHZhbGEgPD0gdmFsYjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBHVDoKLQkgICAgICByZXMgPSB2YWxhID4gdmFsYjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBHRToKLQkgICAgICByZXMgPSB2YWxhID49IHZhbGI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTkVWRVI6Ci0JICAgICAgcmVzID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgc2Jfa2lsbCAoJmFjY19hKTsKLSAgc2Jfa2lsbCAoJmNvbmQpOwotICBzYl9raWxsICgmYWNjX2IpOwotICByZXR1cm4gcmVzOwotfQotCi0vKiAuQUlGICovCi1zdGF0aWMgdm9pZAotZG9fYWlmIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGlmIChpZmkgPj0gSUZORVNUSU5HKQotICAgIHsKLSAgICAgIEZBVEFMICgoc3RkZXJyLCBfKCJBSUYgbmVzdGluZyB1bnJlYXNvbmFibGUuXG4iKSkpOwotICAgIH0KLSAgaWZpKys7Ci0gIGlmc3RhY2tbaWZpXS5vbiA9IGlmc3RhY2tbaWZpLTFdLm9uID8gaXN0cnVlIChpZHgsIGluKSA6IDA7Ci0gIGlmc3RhY2tbaWZpXS5oYWRlbHNlID0gMDsKLX0KLQotCi0vKiAuQUVMU0UgKi8KLXN0YXRpYyB2b2lkCi1kb19hZWxzZSAoKQotewotICBpZnN0YWNrW2lmaV0ub24gPSBpZnN0YWNrW2lmaS0xXS5vbiA/ICFpZnN0YWNrW2lmaV0ub24gOiAwOwotICBpZiAoaWZzdGFja1tpZmldLmhhZGVsc2UpCi0gICAgewotICAgICAgRVJST1IgKChzdGRlcnIsIF8oIk11bHRpcGxlIEFFTFNFcyBpbiBBSUYuXG4iKSkpOwotICAgIH0KLSAgaWZzdGFja1tpZmldLmhhZGVsc2UgPSAxOwotfQotCi0KLS8qIC5BRU5ESSAqLwotc3RhdGljIHZvaWQKLWRvX2FlbmRpICgpCi17Ci0gIGlmIChpZmkgIT0gMCkKLSAgICB7Ci0gICAgICBpZmktLTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygiQUVOREkgd2l0aG91dCBBSUYuXG4iKSkpOwotICAgIH0KLX0KLQotc3RhdGljIGludAotY29uZGFzc19vbiAoKQotewotICByZXR1cm4gaWZzdGFja1tpZmldLm9uOwotfQotCi0vKiBNUkkgSUZFUSwgSUZORSwgSUZMVCwgSUZMRSwgSUZHRSwgSUZHVC4gICovCi0KLXN0YXRpYyB2b2lkCi1kb19pZiAoaWR4LCBpbiwgY29uZCkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgY29uZDsKLXsKLSAgaW50IHZhbDsKLSAgaW50IHJlczsKLQotICBpZiAoaWZpID49IElGTkVTVElORykKLSAgICB7Ci0gICAgICBGQVRBTCAoKHN0ZGVyciwgXygiSUYgbmVzdGluZyB1bnJlYXNvbmFibGUuXG4iKSkpOwotICAgIH0KLQotICBpZHggPSBleHBfZ2V0X2FicyAoXygiQ29uZGl0aW9uYWwgb3BlcmF0b3IgbXVzdCBoYXZlIGFic29sdXRlIG9wZXJhbmRzLlxuIiksCi0JCSAgICAgaWR4LCBpbiwgJnZhbCk7Ci0gIHN3aXRjaCAoY29uZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIEVROiByZXMgPSB2YWwgPT0gMDsgYnJlYWs7Ci0gICAgY2FzZSBORTogcmVzID0gdmFsICE9IDA7IGJyZWFrOwotICAgIGNhc2UgTFQ6IHJlcyA9IHZhbCA8ICAwOyBicmVhazsKLSAgICBjYXNlIExFOiByZXMgPSB2YWwgPD0gMDsgYnJlYWs7Ci0gICAgY2FzZSBHRTogcmVzID0gdmFsID49IDA7IGJyZWFrOwotICAgIGNhc2UgR1Q6IHJlcyA9IHZhbCA+ICAwOyBicmVhazsKLSAgICB9Ci0KLSAgaWZpKys7Ci0gIGlmc3RhY2tbaWZpXS5vbiA9IGlmc3RhY2tbaWZpLTFdLm9uID8gcmVzOiAwOwotICBpZnN0YWNrW2lmaV0uaGFkZWxzZSA9IDA7Ci19Ci0KLS8qIEdldCBhIHN0cmluZyBmb3IgdGhlIE1SSSBJRkMgb3IgSUZOQyBwc2V1ZG8tb3BzLiAgKi8KLQotc3RhdGljIGludAotZ2V0X21yaV9zdHJpbmcgKGlkeCwgaW4sIHZhbCwgdGVybWluYXRvcikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqdmFsOwotICAgICBpbnQgdGVybWluYXRvcjsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0KLSAgaWYgKGlkeCA8IGluLT5sZW4KLSAgICAgICYmIGluLT5wdHJbaWR4XSA9PSAnXCcnKQotICAgIHsKLSAgICAgIHNiX2FkZF9jaGFyICh2YWwsICdcJycpOwotICAgICAgZm9yICgrK2lkeDsgaWR4IDwgaW4tPmxlbjsgKytpZHgpCi0JewotCSAgc2JfYWRkX2NoYXIgKHZhbCwgaW4tPnB0cltpZHhdKTsKLQkgIGlmIChpbi0+cHRyW2lkeF0gPT0gJ1wnJykKLQkgICAgewotCSAgICAgICsraWR4OwotCSAgICAgIGlmIChpZHggPj0gaW4tPmxlbgotCQkgIHx8IGluLT5wdHJbaWR4XSAhPSAnXCcnKQotCQlicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICB3aGlsZSAoaWR4IDwgaW4tPmxlbgotCSAgICAgJiYgaW4tPnB0cltpZHhdICE9IHRlcm1pbmF0b3IpCi0JewotCSAgc2JfYWRkX2NoYXIgKHZhbCwgaW4tPnB0cltpZHhdKTsKLQkgICsraWR4OwotCX0KLSAgICAgIGkgPSB2YWwtPmxlbiAtIDE7Ci0gICAgICB3aGlsZSAoaSA+PSAwICYmIElTV0hJVEUgKHZhbC0+cHRyW2ldKSkKLQktLWk7Ci0gICAgICB2YWwtPmxlbiA9IGkgKyAxOwotICAgIH0KLQotICByZXR1cm4gaWR4OwotfQotCi0vKiBNUkkgSUZDLCBJRk5DLiAgKi8KLQotc3RhdGljIHZvaWQKLWRvX2lmYyAoaWR4LCBpbiwgaWZuYykKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgaWZuYzsKLXsKLSAgc2IgZmlyc3Q7Ci0gIHNiIHNlY29uZDsKLSAgaW50IHJlczsKLQotICBpZiAoaWZpID49IElGTkVTVElORykKLSAgICB7Ci0gICAgICBGQVRBTCAoKHN0ZGVyciwgXygiSUYgbmVzdGluZyB1bnJlYXNvbmFibGUuXG4iKSkpOwotICAgIH0KLQotICBzYl9uZXcgKCZmaXJzdCk7Ci0gIHNiX25ldyAoJnNlY29uZCk7Ci0KLSAgaWR4ID0gZ2V0X21yaV9zdHJpbmcgKGlkeCwgaW4sICZmaXJzdCwgJywnKTsKLQotICBpZiAoaWR4ID49IGluLT5sZW4gfHwgaW4tPnB0cltpZHhdICE9ICcsJykKLSAgICB7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygiQmFkIGZvcm1hdCBmb3IgSUYgb3IgSUZOQy5cbiIpKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlkeCA9IGdldF9tcmlfc3RyaW5nIChpZHggKyAxLCBpbiwgJnNlY29uZCwgJzsnKTsKLQotICByZXMgPSAoZmlyc3QubGVuID09IHNlY29uZC5sZW4KLQkgJiYgc3RybmNtcCAoZmlyc3QucHRyLCBzZWNvbmQucHRyLCBmaXJzdC5sZW4pID09IDApOwotICByZXMgXj0gaWZuYzsKLQotICBpZmkrKzsKLSAgaWZzdGFja1tpZmldLm9uID0gaWZzdGFja1tpZmktMV0ub24gPyByZXMgOiAwOwotICBpZnN0YWNrW2lmaV0uaGFkZWxzZSA9IDA7Ci19Ci0KLS8qIC5FTkRSICovCi1zdGF0aWMgdm9pZAotZG9fYWVuZHIgKCkKLXsKLSAgaWYgKCFtcmkpCi0gICAgRVJST1IgKChzdGRlcnIsIF8oIkFFTkRSIHdpdGhvdXQgYSBBUkVQRUFULlxuIikpKTsKLSAgZWxzZQotICAgIEVSUk9SICgoc3RkZXJyLCBfKCJFTkRSIHdpdGhvdXQgYSBSRVBULlxuIikpKTsKLX0KLQotLyogLkFXSElMRSAqLwotCi1zdGF0aWMKLXZvaWQKLWRvX2F3aGlsZSAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBpbnQgbGluZSA9IGxpbmVjb3VudCAoKTsKLSAgc2IgZXhwOwotICBzYiBzdWI7Ci0gIGludCBkb2l0OwotCi0gIHNiX25ldyAoJnN1Yik7Ci0gIHNiX25ldyAoJmV4cCk7Ci0KLSAgcHJvY2Vzc19hc3NpZ25zIChpZHgsIGluLCAmZXhwKTsKLSAgZG9pdCA9IGlzdHJ1ZSAoMCwgJmV4cCk7Ci0KLSAgaWYgKCEgYnVmZmVyX2FuZF9uZXN0ICgiQVdISUxFIiwgIkFFTkRXIiwgJnN1YiwgZ2V0X2xpbmUpKQotICAgIEZBVEFMICgoc3RkZXJyLCBfKCJBV0hJTEUgd2l0aG91dCBhIEFFTkRXIGF0ICVkLlxuIiksIGxpbmUgLSAxKSk7Ci0KLSAgLyogVHVybgotICAgICAJLkFXSElMRSBleHAKLQkgICAgIGZvbwotCS5BRU5EVwotICAgICBpbnRvCi0gICAgICAgIGZvbwotCS5BV0hJTEUgZXhwCi0JZm9vCi0JLkVORFcKLSAgICovCi0KLSAgaWYgKGRvaXQpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gaW5jbHVkZV9uZXh0X2luZGV4ICgpOwotCi0gICAgICBzYiBjb3B5OwotICAgICAgc2JfbmV3ICgmY29weSk7Ci0gICAgICBzYl9hZGRfc2IgKCZjb3B5LCAmc3ViKTsKLSAgICAgIHNiX2FkZF9zYiAoJmNvcHksIGluKTsKLSAgICAgIHNiX2FkZF9zdHJpbmcgKCZjb3B5LCAiXG4iKTsKLSAgICAgIHNiX2FkZF9zYiAoJmNvcHksICZzdWIpOwotICAgICAgc2JfYWRkX3N0cmluZyAoJmNvcHksICJcdC5BRU5EV1xuIik7Ci0gICAgICAvKiBQdXNoIGFub3RoZXIgV0hJTEUgKi8KLSAgICAgIGluY2x1ZGVfYnVmICgmZXhwLCAmY29weSwgaW5jbHVkZV93aGlsZSwgaW5kZXgpOwotICAgICAgc2Jfa2lsbCAoJmNvcHkpOwotICAgIH0KLSAgc2Jfa2lsbCAoJmV4cCk7Ci0gIHNiX2tpbGwgKCZzdWIpOwotfQotCi0KLS8qIC5BRU5EVyAqLwotCi1zdGF0aWMgdm9pZAotZG9fYWVuZHcgKCkKLXsKLSAgRVJST1IgKChzdGRlcnIsIF8oIkFFTkRXIHdpdGhvdXQgYSBBRU5EVy5cbiIpKSk7Ci19Ci0KLQotLyogLkVYSVRNCi0gICAKLSAgIFBvcCB0aGluZ3Mgb2ZmIHRoZSBpbmNsdWRlIHN0YWNrIHVudGlsIHRoZSB0eXBlIGFuZCBpbmRleCBjaGFuZ2VzICovCi0KLXN0YXRpYyB2b2lkCi1kb19leGl0bSAoKQotewotICBpbmNsdWRlX3R5cGUgdHlwZSA9IHNwLT50eXBlOwotICBpZiAodHlwZSA9PSBpbmNsdWRlX3JlcGVhdAotICAgICAgfHwgdHlwZSA9PSBpbmNsdWRlX3doaWxlCi0gICAgICB8fCB0eXBlID09IGluY2x1ZGVfbWFjcm8pCi0gICAgewotICAgICAgaW50IGluZGV4ID0gc3AtPmluZGV4OwotICAgICAgaW5jbHVkZV9wb3AgKCk7Ci0gICAgICB3aGlsZSAoc3AtPmluZGV4ID09IGluZGV4Ci0JICAgICAmJiBzcC0+dHlwZSA9PSB0eXBlKQotCXsKLQkgIGluY2x1ZGVfcG9wICgpOwotCX0KLSAgICB9Ci19Ci0KLS8qIC5BUkVQRUFUICovCi0KLXN0YXRpYyB2b2lkCi1kb19hcmVwZWF0IChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGludCBsaW5lID0gbGluZWNvdW50ICgpOwotICBzYiBleHA7CQkJLyogYnVmZmVyIHdpdGggZXhwcmVzc2lvbiBpbiBpdCAqLwotICBzYiBjb3B5OwkJCS8qIGV4cGFuZGVkIHJlcGVhdCBibG9jayAqLwotICBzYiBzdWI7CQkJLyogY29udGVudHMgb2YgQVJFUEVBVCAqLwotICBpbnQgcmM7Ci0gIGludCByZXQ7Ci0gIGNoYXIgYnVmZmVyWzMwXTsKLQotICBzYl9uZXcgKCZleHApOwotICBzYl9uZXcgKCZjb3B5KTsKLSAgc2JfbmV3ICgmc3ViKTsKLSAgcHJvY2Vzc19hc3NpZ25zIChpZHgsIGluLCAmZXhwKTsKLSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIkFSRVBFQVQgbXVzdCBoYXZlIGFic29sdXRlIG9wZXJhbmQuXG4iKSwgMCwgJmV4cCwgJnJjKTsKLSAgaWYgKCFtcmkpCi0gICAgcmV0ID0gYnVmZmVyX2FuZF9uZXN0ICgiQVJFUEVBVCIsICJBRU5EUiIsICZzdWIsIGdldF9saW5lKTsKLSAgZWxzZQotICAgIHJldCA9IGJ1ZmZlcl9hbmRfbmVzdCAoIlJFUFQiLCAiRU5EUiIsICZzdWIsIGdldF9saW5lKTsKLSAgaWYgKCEgcmV0KQotICAgIEZBVEFMICgoc3RkZXJyLCBfKCJBUkVQRUFUIHdpdGhvdXQgYSBBRU5EUiBhdCAlZC5cbiIpLCBsaW5lIC0gMSkpOwotICBpZiAocmMgPiAwKQotICAgIHsKLSAgICAgIC8qIFB1c2ggYmFjayB0aGUgdGV4dCBmb2xsb3dpbmcgdGhlIHJlcGVhdCwgYW5kIGFub3RoZXIgcmVwZWF0IGJsb2NrCi0JIHNvCi0JIC5BUkVQRUFUIDIwCi0JIGZvbwotCSAuQUVORFIKLQkgZ2V0cyB0dXJuZWQgaW50bwotCSBmb28KLQkgLkFSRVBFQVQgMTkKLQkgZm9vCi0JIC5BRU5EUgotCSAqLwotICAgICAgaW50IGluZGV4ID0gaW5jbHVkZV9uZXh0X2luZGV4ICgpOwotICAgICAgc2JfYWRkX3NiICgmY29weSwgJnN1Yik7Ci0gICAgICBpZiAocmMgPiAxKQotCXsKLQkgIGlmICghbXJpKQotCSAgICBzcHJpbnRmIChidWZmZXIsICJcdC5BUkVQRUFUCSVkXG4iLCByYyAtIDEpOwotCSAgZWxzZQotCSAgICBzcHJpbnRmIChidWZmZXIsICJcdFJFUFQJJWRcbiIsIHJjIC0gMSk7Ci0JICBzYl9hZGRfc3RyaW5nICgmY29weSwgYnVmZmVyKTsKLQkgIHNiX2FkZF9zYiAoJmNvcHksICZzdWIpOwotCSAgaWYgKCFtcmkpCi0JICAgIHNiX2FkZF9zdHJpbmcgKCZjb3B5LCAiCS5BRU5EUlxuIik7Ci0JICBlbHNlCi0JICAgIHNiX2FkZF9zdHJpbmcgKCZjb3B5LCAiCUVORFJcbiIpOwotCX0KLQotICAgICAgaW5jbHVkZV9idWYgKCZleHAsICZjb3B5LCBpbmNsdWRlX3JlcGVhdCwgaW5kZXgpOwotICAgIH0KLSAgc2Jfa2lsbCAoJmV4cCk7Ci0gIHNiX2tpbGwgKCZzdWIpOwotICBzYl9raWxsICgmY29weSk7Ci19Ci0KLS8qIC5FTkRNICovCi0KLXN0YXRpYyB2b2lkCi1kb19lbmRtICgpCi17Ci0gIEVSUk9SICgoc3RkZXJyLCBfKCIuRU5ETSB3aXRob3V0IGEgbWF0Y2hpbmcgLk1BQ1JPLlxuIikpKTsKLX0KLQotLyogTVJJIElSUCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotZG9faXJwIChpZHgsIGluLCBpcnBjKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIGludCBpcnBjOwotewotICBjb25zdCBjaGFyICplcnI7Ci0gIHNiIG91dDsKLQotICBzYl9uZXcgKCZvdXQpOwotCi0gIGVyciA9IGV4cGFuZF9pcnAgKGlycGMsIGlkeCwgaW4sICZvdXQsIGdldF9saW5lLCBjb21tZW50X2NoYXIpOwotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgRVJST1IgKChzdGRlcnIsICIlc1xuIiwgZXJyKSk7Ci0KLSAgZnByaW50ZiAob3V0ZmlsZSwgIiVzIiwgc2JfdGVybWluYXRlICgmb3V0KSk7Ci0KLSAgc2Jfa2lsbCAoJm91dCk7Ci19Ci0KLS8qIE1BQ1JPIFBST0NFU1NJTkcgKi8KLQotLyogUGFyc2Ugb2ZmIExPQ0FMIG4xLCBuMiwuLi4gSW52ZW50IGEgbGFiZWwgbmFtZSBmb3IgaXQgKi8KLXN0YXRpYwotdm9pZCAKLWRvX2xvY2FsIChpZHgsIGxpbmUpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpsaW5lOwotewotICBFUlJPUiAoKHN0ZGVyciwgXygiTE9DQUwgb3V0c2lkZSBvZiBNQUNSTyIpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19tYWNybyAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBjb25zdCBjaGFyICplcnI7Ci0gIGludCBsaW5lID0gbGluZWNvdW50ICgpOwotCi0gIGVyciA9IGRlZmluZV9tYWNybyAoaWR4LCBpbiwgJmxhYmVsLCBnZXRfbGluZSwgKGNvbnN0IGNoYXIgKiopIE5VTEwpOwotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgRVJST1IgKChzdGRlcnIsIF8oIm1hY3JvIGF0IGxpbmUgJWQ6ICVzXG4iKSwgbGluZSAtIDEsIGVycikpOwotfQotCi1zdGF0aWMgaW50Ci1tYWNyb19vcCAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBjb25zdCBjaGFyICplcnI7Ci0gIHNiIG91dDsKLSAgc2IgbmFtZTsKLQotICBpZiAoISBtYWNyb19kZWZpbmVkKQotICAgIHJldHVybiAwOwotCi0gIHNiX3Rlcm1pbmF0ZSAoaW4pOwotICBpZiAoISBjaGVja19tYWNybyAoaW4tPnB0ciArIGlkeCwgJm91dCwgY29tbWVudF9jaGFyLCAmZXJyKSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgRVJST1IgKChzdGRlcnIsICIlc1xuIiwgZXJyKSk7Ci0KLSAgc2JfbmV3ICgmbmFtZSk7Ci0gIHNiX2FkZF9zdHJpbmcgKCZuYW1lLCBfKCJtYWNybyBleHBhbnNpb24iKSk7Ci0KLSAgaW5jbHVkZV9idWYgKCZuYW1lLCAmb3V0LCBpbmNsdWRlX21hY3JvLCBpbmNsdWRlX25leHRfaW5kZXggKCkpOwotCi0gIHNiX2tpbGwgKCZuYW1lKTsKLSAgc2Jfa2lsbCAoJm91dCk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFNUUklORyBIQU5ETElORyAqLwotCi1zdGF0aWMgaW50Ci1nZXRzdHJpbmcgKGlkeCwgaW4sIGFjYykKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqYWNjOwotewotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQotICB3aGlsZSAoaWR4IDwgaW4tPmxlbgotCSAmJiAoaW4tPnB0cltpZHhdID09ICciJyAKLQkgICAgIHx8IGluLT5wdHJbaWR4XSA9PSAnPCcgCi0JICAgICB8fCAoaW4tPnB0cltpZHhdID09ICdcJycgJiYgYWx0ZXJuYXRlKSkpCi0gICAgewotICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnPCcpCi0JewotCSAgaWYgKGFsdGVybmF0ZSB8fCBtcmkpCi0JICAgIHsKLQkgICAgICBpbnQgbmVzdCA9IDA7Ci0JICAgICAgaWR4Kys7Ci0JICAgICAgd2hpbGUgKChpbi0+cHRyW2lkeF0gIT0gJz4nIHx8IG5lc3QpCi0JCSAgICAgJiYgaWR4IDwgaW4tPmxlbikKLQkJewotCQkgIGlmIChpbi0+cHRyW2lkeF0gPT0gJyEnKQotCQkgICAgewotCQkgICAgICBpZHgrKyAgOwotCQkgICAgICBzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeCsrXSk7Ci0JCSAgICB9Ci0JCSAgZWxzZSB7Ci0JCSAgICBpZiAoaW4tPnB0cltpZHhdID09ICc+JykKLQkJICAgICAgbmVzdC0tOwotCQkgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnPCcpCi0JCSAgICAgIG5lc3QrKzsKLQkJICAgIHNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4KytdKTsKLQkJICB9Ci0JCX0KLQkgICAgICBpZHgrKzsKLQkgICAgfQotCSAgZWxzZSB7Ci0JICAgIGludCBjb2RlOwotCSAgICBpZHgrKzsKLQkgICAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIkNoYXJhY3RlciBjb2RlIGluIHN0cmluZyBtdXN0IGJlIGFic29sdXRlIGV4cHJlc3Npb24uXG4iKSwKLQkJCSAgICAgICBpZHgsIGluLCAmY29kZSk7Ci0JICAgIHNiX2FkZF9jaGFyIChhY2MsIGNvZGUpOwotCi0JICAgIGlmIChpbi0+cHRyW2lkeF0gIT0gJz4nKQotCSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJNaXNzaW5nID4gZm9yIGNoYXJhY3RlciBjb2RlLlxuIikpKTsKLQkgICAgaWR4Kys7Ci0JICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICciJyB8fCBpbi0+cHRyW2lkeF0gPT0gJ1wnJykKLQl7Ci0JICBjaGFyIHRjaGFyID0gaW4tPnB0cltpZHhdOwotCSAgaWR4Kys7Ci0JICB3aGlsZSAoaWR4IDwgaW4tPmxlbikKLQkgICAgewotCSAgICAgIGlmIChhbHRlcm5hdGUgJiYgaW4tPnB0cltpZHhdID09ICchJykKLQkJewotCQkgIGlkeCsrICA7Ci0JCSAgc2JfYWRkX2NoYXIgKGFjYywgaW4tPnB0cltpZHgrK10pOwotCQl9Ci0JICAgICAgZWxzZSB7Ci0JCWlmIChpbi0+cHRyW2lkeF0gPT0gdGNoYXIpCi0JCSAgewotCQkgICAgaWR4Kys7Ci0JCSAgICBpZiAoaWR4ID49IGluLT5sZW4gfHwgaW4tPnB0cltpZHhdICE9IHRjaGFyKQotCQkgICAgICBicmVhazsKLQkJICB9Ci0JCXNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4XSk7Ci0JCWlkeCsrOwotCSAgICAgIH0KLQkgICAgfQotCX0KLSAgICB9Ci0gIAotICByZXR1cm4gaWR4OwotfQotCi0vKiAuU0RBVEFbQ3xaXSA8c3RyaW5nPiAqLwotCi1zdGF0aWMKLXZvaWQKLWRvX3NkYXRhIChpZHgsIGluLCB0eXBlKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIGludCB0eXBlOwotewotICBpbnQgbmMgPSAwOwotICBpbnQgcGlkeCA9IC0xOwotICBzYiBhY2M7Ci0gIHNiX25ldyAoJmFjYyk7Ci0gIGZwcmludGYgKG91dGZpbGUsICIuYnl0ZVx0Iik7Ci0KLSAgd2hpbGUgKCFlb2wgKGlkeCwgaW4pKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgc2JfcmVzZXQgKCZhY2MpOwotICAgICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gICAgICB3aGlsZSAoIWVvbCAoaWR4LCBpbikpCi0JewotCSAgcGlkeCA9IGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHgsIGluLCAmYWNjLCAwLCAxKTsKLQkgIGlmICh0eXBlID09ICdjJykKLQkgICAgewotCSAgICAgIGlmIChhY2MubGVuID4gMjU1KQotCQl7Ci0JCSAgRVJST1IgKChzdGRlcnIsIF8oInN0cmluZyBmb3IgU0RBVEFDIGxvbmdlciB0aGFuIDI1NSBjaGFyYWN0ZXJzICglZCkuXG4iKSwgYWNjLmxlbikpOwotCQl9Ci0JICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIiVkIiwgYWNjLmxlbik7Ci0JICAgICAgbmMgPSAxOwotCSAgICB9Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBhY2MubGVuOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAobmMpCi0JCXsKLQkJICBmcHJpbnRmIChvdXRmaWxlLCAiLCIpOwotCQl9Ci0JICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIiVkIiwgYWNjLnB0cltpXSk7Ci0JICAgICAgbmMgPSAxOwotCSAgICB9Ci0KLQkgIGlmICh0eXBlID09ICd6JykKLQkgICAgewotCSAgICAgIGlmIChuYykKLQkJZnByaW50ZiAob3V0ZmlsZSwgIiwiKTsKLQkgICAgICBmcHJpbnRmIChvdXRmaWxlLCAiMCIpOwotCSAgICB9Ci0JICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLQkgIGlmIChpZHggPT0gcGlkeCkgYnJlYWs7Ci0JfQotICAgICAgaWYgKCFhbHRlcm5hdGUgJiYgaW4tPnB0cltpZHhdICE9ICcsJyAmJiBpZHggIT0gaW4tPmxlbikKLQl7Ci0JICBmcHJpbnRmIChvdXRmaWxlLCAiXG4iKTsKLQkgIEVSUk9SICgoc3RkZXJyLCBfKCJpbGxlZ2FsIGNoYXJhY3RlciBpbiBTREFUQSBsaW5lICgweCV4KS5cbiIpLCBpbi0+cHRyW2lkeF0pKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlkeCsrOwotICAgIH0KLSAgc2Jfa2lsbCAoJmFjYyk7Ci0gIGZwcmludGYgKG91dGZpbGUsICJcbiIpOwotfQotCi0vKiAuU0RBVEFCIDxjb3VudD4gPHN0cmluZz4gKi8KLQotc3RhdGljIHZvaWQKLWRvX3NkYXRhYiAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBpbnQgcmVwZWF0OwotICBpbnQgaTsKLSAgc2IgYWNjOwotICBzYl9uZXcgKCZhY2MpOwotCi0gIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJNdXN0IGhhdmUgYWJzb2x1dGUgU0RBVEFCIHJlcGVhdCBjb3VudC5cbiIpLCBpZHgsIGluLCAmcmVwZWF0KTsKLSAgaWYgKHJlcGVhdCA8PSAwKQotICAgIHsKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJNdXN0IGhhdmUgcG9zaXRpdmUgU0RBVEFCIHJlcGVhdCBjb3VudCAoJWQpLlxuIiksIHJlcGVhdCkpOwotICAgICAgcmVwZWF0ID0gMTsKLSAgICB9Ci0KLSAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gIGlkeCA9IGdldHN0cmluZyAoaWR4LCBpbiwgJmFjYyk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHJlcGVhdDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpKQotCWZwcmludGYgKG91dGZpbGUsICJcdCIpOwotICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIi5ieXRlXHQiKTsKLSAgICAgIHNiX3ByaW50IChvdXRmaWxlLCAmYWNjKTsKLSAgICAgIGZwcmludGYgKG91dGZpbGUsICJcbiIpOwotICAgIH0KLSAgc2Jfa2lsbCAoJmFjYyk7Ci0KLX0KLQotc3RhdGljIGludAotbmV3X2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIEZJTEUgKm5ld29uZSA9IGZvcGVuIChuYW1lLCAiciIpOwotICBpZiAoIW5ld29uZSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoaXNwID09IE1BWF9JTkNMVURFUykKLSAgICBGQVRBTCAoKHN0ZGVyciwgXygiVW5yZWFzb25hYmxlIGluY2x1ZGUgZGVwdGggKCVsZCkuXG4iKSwgKGxvbmcpIGlzcCkpOwotCi0gIHNwKys7Ci0gIHNwLT5oYW5kbGUgPSBuZXdvbmU7Ci0KLSAgc2JfbmV3ICgmc3AtPm5hbWUpOwotICBzYl9hZGRfc3RyaW5nICgmc3AtPm5hbWUsIG5hbWUpOwotCi0gIHNwLT5saW5lY291bnQgPSAxOwotICBzcC0+cHVzaGJhY2tfaW5kZXggPSAwOwotICBzcC0+dHlwZSA9IGluY2x1ZGVfZmlsZTsKLSAgc3AtPmluZGV4ID0gMDsKLSAgc2JfbmV3ICgmc3AtPnB1c2hiYWNrKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19pbmNsdWRlIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIHNiIHQ7Ci0gIHNiIGNhdDsKLSAgaW5jbHVkZV9wYXRoICppbmNsdWRlczsKLQotICBzYl9uZXcgKCZ0KTsKLSAgc2JfbmV3ICgmY2F0KTsKLQotICBpZiAoISBtcmkpCi0gICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCAmdCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgICAgIHdoaWxlIChpZHggPCBpbi0+bGVuICYmICEgSVNXSElURSAoaW4tPnB0cltpZHhdKSkKLQl7Ci0JICBzYl9hZGRfY2hhciAoJnQsIGluLT5wdHJbaWR4XSk7Ci0JICArK2lkeDsKLQl9Ci0gICAgfQotCi0gIGZvciAoaW5jbHVkZXMgPSBwYXRoc19oZWFkOyBpbmNsdWRlczsgaW5jbHVkZXMgPSBpbmNsdWRlcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzYl9yZXNldCAoJmNhdCk7Ci0gICAgICBzYl9hZGRfc2IgKCZjYXQsICZpbmNsdWRlcy0+cGF0aCk7Ci0gICAgICBzYl9hZGRfY2hhciAoJmNhdCwgJy8nKTsKLSAgICAgIHNiX2FkZF9zYiAoJmNhdCwgJnQpOwotICAgICAgaWYgKG5ld19maWxlIChzYl9uYW1lICgmY2F0KSkpCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgaWYgKCFpbmNsdWRlcykKLSAgICB7Ci0gICAgICBpZiAoISBuZXdfZmlsZSAoc2JfbmFtZSAoJnQpKSkKLQlGQVRBTCAoKHN0ZGVyciwgXygiQ2FuJ3Qgb3BlbiBpbmNsdWRlIGZpbGUgYCVzJy5cbiIpLCBzYl9uYW1lICgmdCkpKTsKLSAgICB9Ci0gIHNiX2tpbGwgKCZjYXQpOwotICBzYl9raWxsICgmdCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbmNsdWRlX3BvcCAoKQotewotICBpZiAoc3AgIT0gaW5jbHVkZV9zdGFjaykKLSAgICB7Ci0gICAgICBpZiAoc3AtPmhhbmRsZSkKLQlmY2xvc2UgKHNwLT5oYW5kbGUpOwotICAgICAgc3AtLTsKLSAgICB9Ci19Ci0KLS8qIEdldCB0aGUgbmV4dCBjaGFyYWN0ZXIgZnJvbSB0aGUgaW5jbHVkZSBzdGFjay4gIElmIHRoZXJlJ3MgYW55dGhpbmcKLSAgIGluIHRoZSBwdXNoYmFjayBidWZmZXIsIHRha2UgdGhhdCBmaXJzdC4gIElmIHdlJ3JlIGF0IGVvZiwgcG9wIGZyb20KLSAgIHRoZSBzdGFjayBhbmQgdHJ5IGFnYWluLiAgS2VlcCB0aGUgbGluZWNvdW50IHVwIHRvIGRhdGUuICovCi0KLXN0YXRpYyBpbnQKLWdldCAoKQotewotICBpbnQgcjsKLQotICBpZiAoc3AtPnB1c2hiYWNrLmxlbiAhPSBzcC0+cHVzaGJhY2tfaW5kZXgpCi0gICAgewotICAgICAgciA9IChjaGFyKSAoc3AtPnB1c2hiYWNrLnB0cltzcC0+cHVzaGJhY2tfaW5kZXgrK10pOwotICAgICAgLyogV2hlbiB0aGV5J3ZlIGFsbCBnb25lLCByZXNldCB0aGUgcG9pbnRlciAqLwotICAgICAgaWYgKHNwLT5wdXNoYmFja19pbmRleCA9PSBzcC0+cHVzaGJhY2subGVuKQotCXsKLQkgIHNwLT5wdXNoYmFjay5sZW4gPSAwOwotCSAgc3AtPnB1c2hiYWNrX2luZGV4ID0gMDsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChzcC0+aGFuZGxlKQotICAgIHsKLSAgICAgIHIgPSBnZXRjIChzcC0+aGFuZGxlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByID0gRU9GOwotCi0gIGlmIChyID09IEVPRiAmJiBpc3ApCi0gICAgewotICAgICAgaW5jbHVkZV9wb3AgKCk7Ci0gICAgICByID0gZ2V0ICgpOwotICAgICAgd2hpbGUgKHIgPT0gRU9GICYmIGlzcCkKLQl7Ci0JICBpbmNsdWRlX3BvcCAoKTsKLQkgIHIgPSBnZXQgKCk7Ci0JfQotICAgICAgcmV0dXJuIHI7Ci0gICAgfQotICBpZiAociA9PSAnXG4nKQotICAgIHsKLSAgICAgIHNwLT5saW5lY291bnQrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyBpbnQKLWxpbmVjb3VudCAoKQotewotICByZXR1cm4gc3AtPmxpbmVjb3VudDsKLX0KLQotc3RhdGljIGludAotaW5jbHVkZV9uZXh0X2luZGV4ICgpCi17Ci0gIHN0YXRpYyBpbnQgaW5kZXg7Ci0gIGlmICghdW5yZWFzb25hYmxlCi0gICAgICAmJiBpbmRleCA+IE1BWF9SRUFTT05BQkxFKQotICAgIEZBVEFMICgoc3RkZXJyLCBfKCJVbnJlYXNvbmFibGUgZXhwYW5zaW9uICgtdSB0dXJucyBvZmYgY2hlY2spLlxuIikpKTsKLSAgcmV0dXJuICsraW5kZXg7Ci19Ci0KLQotLyogSW5pdGlhbGl6ZSB0aGUgY2hhcnR5cGUgdmVjdG9yLiAqLwotCi1zdGF0aWMgdm9pZAotY2hhcnR5cGVfaW5pdCAoKQotewotICBpbnQgeDsKLSAgZm9yICh4ID0gMDsgeCA8IDI1NjsgeCsrKQotICAgIHsKLSAgICAgIGlmIChpc2FscGhhICh4KSB8fCB4ID09ICdfJyB8fCB4ID09ICckJykKLQljaGFydHlwZVt4XSB8PSBGSVJTVEJJVDsKLQotICAgICAgaWYgKG1yaSAmJiB4ID09ICcuJykKLQljaGFydHlwZVt4XSB8PSBGSVJTVEJJVDsKLQotICAgICAgaWYgKGlzZGlnaXQgKHgpIHx8IGlzYWxwaGEgKHgpIHx8IHggPT0gJ18nIHx8IHggPT0gJyQnKQotCWNoYXJ0eXBlW3hdIHw9IE5FWFRCSVQ7Ci0KLSAgICAgIGlmICh4ID09ICcgJyB8fCB4ID09ICdcdCcgfHwgeCA9PSAnLCcgfHwgeCA9PSAnIicgfHwgeCA9PSAnOycKLQkgIHx8IHggPT0gJyInIHx8IHggPT0gJzwnIHx8IHggPT0gJz4nIHx8IHggPT0gJyknIHx8IHggPT0gJygnKQotCWNoYXJ0eXBlW3hdIHw9IFNFUEJJVDsKLQotICAgICAgaWYgKHggPT0gJ2InIHx8IHggPT0gJ0InCi0JICB8fCB4ID09ICdxJyB8fCB4ID09ICdRJwotCSAgfHwgeCA9PSAnaCcgfHwgeCA9PSAnSCcKLQkgIHx8IHggPT0gJ2QnIHx8IHggPT0gJ0QnKQotCWNoYXJ0eXBlIFt4XSB8PSBCQVNFQklUOwotCSAgCi0gICAgICBpZiAoeCA9PSAnICcgfHwgeCA9PSAnXHQnKQotCWNoYXJ0eXBlW3hdIHw9IFdISVRFQklUOwotCi0gICAgICBpZiAoeCA9PSBjb21tZW50X2NoYXIpCi0JY2hhcnR5cGVbeF0gfD0gQ09NTUVOVEJJVDsKLSAgICB9Ci19Ci0KLQotCi0vKiBXaGF0IHRvIGRvIHdpdGggYWxsIHRoZSBrZXl3b3JkcyAqLwotI2RlZmluZSBQUk9DRVNTIAkweDEwMDAgIC8qIFJ1biBzdWJzdGl0dXRpb24gb3ZlciB0aGUgbGluZSAqLwotI2RlZmluZSBMQUIJCTB4MjAwMCAgLyogU3BpdCBvdXQgdGhlIGxhYmVsICovCi0KLSNkZWZpbmUgS19FUVUgCQkoUFJPQ0VTU3wxKQotI2RlZmluZSBLX0FTU0lHTiAJKFBST0NFU1N8MikKLSNkZWZpbmUgS19SRUcgCQkoUFJPQ0VTU3wzKQotI2RlZmluZSBLX09SRyAJCShQUk9DRVNTfDQpCi0jZGVmaW5lIEtfUkFESVggCShQUk9DRVNTfDUpCi0jZGVmaW5lIEtfREFUQSAJCShMQUJ8UFJPQ0VTU3w2KQotI2RlZmluZSBLX0RBVEFCIAkoTEFCfFBST0NFU1N8NykKLSNkZWZpbmUgS19TREFUQSAJKExBQnxQUk9DRVNTfDgpCi0jZGVmaW5lIEtfU0RBVEFCIAkoTEFCfFBST0NFU1N8OSkKLSNkZWZpbmUgS19TREFUQUMgCShMQUJ8UFJPQ0VTU3wxMCkKLSNkZWZpbmUgS19TREFUQVoJKExBQnxQUk9DRVNTfDExKQotI2RlZmluZSBLX1JFUyAJCShMQUJ8UFJPQ0VTU3wxMikKLSNkZWZpbmUgS19TUkVTIAkJKExBQnxQUk9DRVNTfDEzKQotI2RlZmluZSBLX1NSRVNDIAkoTEFCfFBST0NFU1N8MTQpCi0jZGVmaW5lIEtfU1JFU1ogCShMQUJ8UFJPQ0VTU3wxNSkKLSNkZWZpbmUgS19FWFBPUlQgCShMQUJ8UFJPQ0VTU3wxNikKLSNkZWZpbmUgS19HTE9CQUwgCShMQUJ8UFJPQ0VTU3wxNykKLSNkZWZpbmUgS19QUklOVCAJKExBQnxQUk9DRVNTfDE5KQotI2RlZmluZSBLX0ZPUk0gCQkoTEFCfFBST0NFU1N8MjApCi0jZGVmaW5lIEtfSEVBRElORwkoTEFCfFBST0NFU1N8MjEpCi0jZGVmaW5lIEtfUEFHRQkJKExBQnxQUk9DRVNTfDIyKQotI2RlZmluZSBLX0lNUE9SVAkoTEFCfFBST0NFU1N8MjMpCi0jZGVmaW5lIEtfUFJPR1JBTQkoTEFCfFBST0NFU1N8MjQpCi0jZGVmaW5lIEtfRU5ECQkoUFJPQ0VTU3wyNSkKLSNkZWZpbmUgS19JTkNMVURFCShQUk9DRVNTfDI2KQotI2RlZmluZSBLX0lHTk9SRUQJKFBST0NFU1N8MjcpCi0jZGVmaW5lIEtfQVNTSUdOQQkoUFJPQ0VTU3wyOCkKLSNkZWZpbmUgS19BU1NJR05DCSgyOSkKLSNkZWZpbmUgS19BSUYJCShQUk9DRVNTfDMwKQotI2RlZmluZSBLX0FFTFNFCQkoUFJPQ0VTU3wzMSkKLSNkZWZpbmUgS19BRU5ESQkJKFBST0NFU1N8MzIpCi0jZGVmaW5lIEtfQVJFUEVBVAkoUFJPQ0VTU3wzMykKLSNkZWZpbmUgS19BRU5EUgkJKFBST0NFU1N8MzQpCi0jZGVmaW5lIEtfQVdISUxFCSgzNSkKLSNkZWZpbmUgS19BRU5EVwkJKFBST0NFU1N8MzYpCi0jZGVmaW5lIEtfRVhJVE0JCSgzNykKLSNkZWZpbmUgS19NQUNSTwkJKFBST0NFU1N8MzgpCi0jZGVmaW5lIEtfRU5ETQkJKDM5KQotI2RlZmluZSBLX0FMSUdOCQkoUFJPQ0VTU3xMQUJ8NDApCi0jZGVmaW5lIEtfQUxURVJOQVRFICAgICAoNDEpCi0jZGVmaW5lIEtfREIJCShMQUJ8UFJPQ0VTU3w0MikKLSNkZWZpbmUgS19EVwkJKExBQnxQUk9DRVNTfDQzKQotI2RlZmluZSBLX0RMCQkoTEFCfFBST0NFU1N8NDQpCi0jZGVmaW5lIEtfTE9DQUwJCSg0NSkKLSNkZWZpbmUgS19JRkVRCQkoUFJPQ0VTU3w0NikKLSNkZWZpbmUgS19JRk5FCQkoUFJPQ0VTU3w0NykKLSNkZWZpbmUgS19JRkxUCQkoUFJPQ0VTU3w0OCkKLSNkZWZpbmUgS19JRkxFCQkoUFJPQ0VTU3w0OSkKLSNkZWZpbmUgS19JRkdFCQkoUFJPQ0VTU3w1MCkKLSNkZWZpbmUgS19JRkdUCQkoUFJPQ0VTU3w1MSkKLSNkZWZpbmUgS19JRkMJCShQUk9DRVNTfDUyKQotI2RlZmluZSBLX0lGTkMJCShQUk9DRVNTfDUzKQotI2RlZmluZSBLX0lSUAkJKFBST0NFU1N8NTQpCi0jZGVmaW5lIEtfSVJQQwkJKFBST0NFU1N8NTUpCi0KLQotc3RydWN0IGtleXdvcmQKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGNvZGU7Ci0gIGludCBleHRyYTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qga2V5d29yZCBraW5mb1tdID0KLXsKLSAgeyAiRVFVIiwgS19FUVUsIDAgfSwKLSAgeyAiQUxURVJOQVRFIiwgS19BTFRFUk5BVEUsIDAgfSwKLSAgeyAiQVNTSUdOIiwgS19BU1NJR04sIDAgfSwKLSAgeyAiUkVHIiwgS19SRUcsIDAgfSwKLSAgeyAiT1JHIiwgS19PUkcsIDAgfSwKLSAgeyAiUkFESVgiLCBLX1JBRElYLCAwIH0sCi0gIHsgIkRBVEEiLCBLX0RBVEEsIDAgfSwKLSAgeyAiREIiLCBLX0RCLCAwIH0sCi0gIHsgIkRXIiwgS19EVywgMCB9LAotICB7ICJETCIsIEtfREwsIDAgfSwKLSAgeyAiREFUQUIiLCBLX0RBVEFCLCAwIH0sCi0gIHsgIlNEQVRBIiwgS19TREFUQSwgMCB9LAotICB7ICJTREFUQUIiLCBLX1NEQVRBQiwgMCB9LAotICB7ICJTREFUQVoiLCBLX1NEQVRBWiwgMCB9LAotICB7ICJTREFUQUMiLCBLX1NEQVRBQywgMCB9LAotICB7ICJSRVMiLCBLX1JFUywgMCB9LAotICB7ICJTUkVTIiwgS19TUkVTLCAwIH0sCi0gIHsgIlNSRVNDIiwgS19TUkVTQywgMCB9LAotICB7ICJTUkVTWiIsIEtfU1JFU1osIDAgfSwKLSAgeyAiRVhQT1JUIiwgS19FWFBPUlQsIDAgfSwKLSAgeyAiR0xPQkFMIiwgS19HTE9CQUwsIDAgfSwKLSAgeyAiUFJJTlQiLCBLX1BSSU5ULCAwIH0sCi0gIHsgIkZPUk0iLCBLX0ZPUk0sIDAgfSwKLSAgeyAiSEVBRElORyIsIEtfSEVBRElORywgMCB9LAotICB7ICJQQUdFIiwgS19QQUdFLCAwIH0sCi0gIHsgIlBST0dSQU0iLCBLX0lHTk9SRUQsIDAgfSwKLSAgeyAiRU5EIiwgS19FTkQsIDAgfSwKLSAgeyAiSU5DTFVERSIsIEtfSU5DTFVERSwgMCB9LAotICB7ICJBU1NJR05BIiwgS19BU1NJR05BLCAwIH0sCi0gIHsgIkFTU0lHTkMiLCBLX0FTU0lHTkMsIDAgfSwKLSAgeyAiQUlGIiwgS19BSUYsIDAgfSwKLSAgeyAiQUVMU0UiLCBLX0FFTFNFLCAwIH0sCi0gIHsgIkFFTkRJIiwgS19BRU5ESSwgMCB9LAotICB7ICJBUkVQRUFUIiwgS19BUkVQRUFULCAwIH0sCi0gIHsgIkFFTkRSIiwgS19BRU5EUiwgMCB9LAotICB7ICJFWElUTSIsIEtfRVhJVE0sIDAgfSwKLSAgeyAiTUFDUk8iLCBLX01BQ1JPLCAwIH0sCi0gIHsgIkVORE0iLCBLX0VORE0sIDAgfSwKLSAgeyAiQVdISUxFIiwgS19BV0hJTEUsIDAgfSwKLSAgeyAiQUxJR04iLCBLX0FMSUdOLCAwIH0sCi0gIHsgIkFFTkRXIiwgS19BRU5EVywgMCB9LAotICB7ICJBTFRFUk5BVEUiLCBLX0FMVEVSTkFURSwgMCB9LAotICB7ICJMT0NBTCIsIEtfTE9DQUwsIDAgfSwKLSAgeyBOVUxMLCAwLCAwIH0KLX07Ci0KLS8qIEFsdGhvdWdoIHRoZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgYXJlIGhhbmRsZWQgYnkgZ2FzLCB3ZSBuZWVkIHRvCi0gICBoYW5kbGUgdGhlbSBoZXJlIGFzIHdlbGwsIGluIGNhc2UgdGhleSBhcmUgdXNlZCBpbiBhIHJlY3Vyc2l2ZQotICAgbWFjcm8gdG8gZW5kIHRoZSByZWN1cnNpb24uICAqLwotCi1zdGF0aWMgc3RydWN0IGtleXdvcmQgbXJpa2luZm9bXSA9Ci17Ci0gIHsgIklGRVEiLCBLX0lGRVEsIDAgfSwKLSAgeyAiSUZORSIsIEtfSUZORSwgMCB9LAotICB7ICJJRkxUIiwgS19JRkxULCAwIH0sCi0gIHsgIklGTEUiLCBLX0lGTEUsIDAgfSwKLSAgeyAiSUZHRSIsIEtfSUZHRSwgMCB9LAotICB7ICJJRkdUIiwgS19JRkdULCAwIH0sCi0gIHsgIklGQyIsIEtfSUZDLCAwIH0sCi0gIHsgIklGTkMiLCBLX0lGTkMsIDAgfSwKLSAgeyAiRUxTRUMiLCBLX0FFTFNFLCAwIH0sCi0gIHsgIkVOREMiLCBLX0FFTkRJLCAwIH0sCi0gIHsgIk1FWElUIiwgS19FWElUTSwgMCB9LAotICB7ICJSRVBUIiwgS19BUkVQRUFULCAwIH0sCi0gIHsgIklSUCIsIEtfSVJQLCAwIH0sCi0gIHsgIklSUEMiLCBLX0lSUEMsIDAgfSwKLSAgeyAiRU5EUiIsIEtfQUVORFIsIDAgfSwKLSAgeyBOVUxMLCAwLCAwIH0KLX07Ci0KLS8qIExvb2sgZm9yIGEgcHNldWRvIG9wIG9uIHRoZSBsaW5lLiBJZiBvbmUncyB0aGVyZSB0aGVuIGNhbGwKLSAgIGl0cyBoYW5kbGVyLiAqLwotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3BzZXVkb19vcCAoaWR4LCBsaW5lLCBhY2MpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpsaW5lOwotICAgICBzYiAqYWNjOwotewotICBpbnQgb2lkeCA9IGlkeDsKLQotICBpZiAobGluZS0+cHRyW2lkeF0gPT0gJy4nIHx8IGFsdGVybmF0ZSB8fCBtcmkpCi0gICAgewotICAgICAgLyogU2NhbiBmb3J3YXJkIGFuZCBmaW5kIHBzZXVkbyBuYW1lICovCi0gICAgICBjaGFyICppbjsKLSAgICAgIGhhc2hfZW50cnkgKnB0cjsKLQotICAgICAgY2hhciAqczsKLSAgICAgIGNoYXIgKmU7Ci0gICAgICBpZiAobGluZS0+cHRyW2lkeF0gPT0gJy4nKQotCWlkeCsrOwotICAgICAgaW4gPSBsaW5lLT5wdHIgKyBpZHg7Ci0gICAgICBzID0gaW47Ci0gICAgICBlID0gczsKLSAgICAgIHNiX3Jlc2V0IChhY2MpOwotCi0gICAgICB3aGlsZSAoaWR4IDwgbGluZS0+bGVuICYmICplICYmIElTRklSU1RDSEFSICgqZSkpCi0JewotCSAgc2JfYWRkX2NoYXIgKGFjYywgKmUpOwotCSAgZSsrOwotCSAgaWR4Kys7Ci0JfQotCi0gICAgICBwdHIgPSBoYXNoX2xvb2t1cCAoJmtleXdvcmRfaGFzaF90YWJsZSwgYWNjKTsKLQotICAgICAgaWYgKCFwdHIpCi0JewotI2lmIDAKLQkgIC8qIFRoaXMgb25lIGNhdXNlcyBsb3RzIG9mIHBhaW4gd2hlbiB0cnlpbmcgdG8gcHJlcHJvY2VzcwotCSAgICAgb3JkaW5hcnkgY29kZSAqLwotCSAgV0FSTklORyAoKHN0ZGVyciwgXygiVW5yZWNvZ25pc2VkIHBzZXVkbyBvcCBgJXMnLlxuIiksIHNiX25hbWUgKGFjYykpKTsKLSNlbmRpZgotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgaWYgKHB0ci0+dmFsdWUuaSAmIExBQikKLQl7CQkJLyogb3V0cHV0IHRoZSBsYWJlbCAqLwotCSAgaWYgKGxhYmVsLmxlbikKLQkgICAgewotCSAgICAgIGZwcmludGYgKG91dGZpbGUsICIlczpcdCIsIHNiX25hbWUgKCZsYWJlbCkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGZwcmludGYgKG91dGZpbGUsICJcdCIpOwotCX0KLQotICAgICAgaWYgKG1yaSAmJiBwdHItPnZhbHVlLmkgPT0gS19FTkQpCi0JewotCSAgc2IgdDsKLQotCSAgc2JfbmV3ICgmdCk7Ci0JICBzYl9hZGRfYnVmZmVyICgmdCwgbGluZS0+cHRyICsgb2lkeCwgaWR4IC0gb2lkeCk7Ci0JICBmcHJpbnRmIChvdXRmaWxlLCAiXHQlcyIsIHNiX25hbWUgKCZ0KSk7Ci0JICBzYl9raWxsICgmdCk7Ci0JfQotCi0gICAgICBpZiAocHRyLT52YWx1ZS5pICYgUFJPQ0VTUykKLQl7Ci0JICAvKiBQb2xpc2ggdGhlIHJlc3Qgb2YgdGhlIGxpbmUgYmVmb3JlIGhhbmRsaW5nIHRoZSBwc2V1ZG8gb3AgKi8KLSNpZiAwCi0JICBzdHJpcF9jb21tZW50cyhsaW5lKTsKLSNlbmRpZgotCSAgc2JfcmVzZXQgKGFjYyk7Ci0JICBwcm9jZXNzX2Fzc2lnbnMgKGlkeCwgbGluZSwgYWNjKTsKLQkgIHNiX3Jlc2V0KGxpbmUpOwotCSAgY2hhbmdlX2Jhc2UgKDAsIGFjYywgbGluZSk7Ci0JICBpZHggPSAwOwotCX0KLSAgICAgIGlmICghY29uZGFzc19vbiAoKSkKLQl7Ci0JICBzd2l0Y2ggKHB0ci0+dmFsdWUuaSkKLQkgICAgewotCSAgICBjYXNlIEtfQUlGOgotCSAgICAgIGRvX2FpZiAoaWR4LCBsaW5lKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBLX0FFTFNFOgotCSAgICAgIGRvX2FlbHNlICgpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEtfQUVOREk6Ci0JICAgICAgZG9fYWVuZGkgKCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHJldHVybiAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKHB0ci0+dmFsdWUuaSkKLQkgICAgewotCSAgICBjYXNlIEtfQUxURVJOQVRFOgotCSAgICAgIGFsdGVybmF0ZSA9IDE7Ci0JICAgICAgbWFjcm9faW5pdCAoMSwgbXJpLCAwLCBleHBfZ2V0X2Ficyk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BRUxTRToKLQkgICAgICBkb19hZWxzZSAoKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0FFTkRJOgotCSAgICAgIGRvX2FlbmRpICgpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfT1JHOgotCSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJPUkcgY29tbWFuZCBub3QgYWxsb3dlZC5cbiIpKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgS19SQURJWDoKLQkgICAgICBkb19yYWRpeCAobGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19EQjoKLQkgICAgICBkb19kYXRhIChpZHgsIGxpbmUsIDEpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfRFc6Ci0JICAgICAgZG9fZGF0YSAoaWR4LCBsaW5lLCAyKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0RMOgotCSAgICAgIGRvX2RhdGEgKGlkeCwgbGluZSwgNCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19EQVRBOgotCSAgICAgIGRvX2RhdGEgKGlkeCwgbGluZSwgMCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19EQVRBQjoKLQkgICAgICBkb19kYXRhYiAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1NEQVRBOgotCSAgICAgIGRvX3NkYXRhIChpZHgsIGxpbmUsIDApOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfU0RBVEFCOgotCSAgICAgIGRvX3NkYXRhYiAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1NEQVRBQzoKLQkgICAgICBkb19zZGF0YSAoaWR4LCBsaW5lLCAnYycpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfU0RBVEFaOgotCSAgICAgIGRvX3NkYXRhIChpZHgsIGxpbmUsICd6Jyk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BU1NJR046Ci0JICAgICAgZG9fYXNzaWduICgwLCAwLCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0FJRjoKLQkgICAgICBkb19haWYgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BUkVQRUFUOgotCSAgICAgIGRvX2FyZXBlYXQgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BRU5EVzoKLQkgICAgICBkb19hZW5kdyAoKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0FXSElMRToKLQkgICAgICBkb19hd2hpbGUgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BRU5EUjoKLQkgICAgICBkb19hZW5kciAoKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0VRVToKLQkgICAgICBkb19hc3NpZ24gKDEsIGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BTElHTjoKLQkgICAgICBkb19hbGlnbiAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1JFUzoKLQkgICAgICBkb19yZXMgKGlkeCwgbGluZSwgMCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19TUkVTOgotCSAgICAgIGRvX3JlcyAoaWR4LCBsaW5lLCAncycpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSU5DTFVERToKLQkgICAgICBkb19pbmNsdWRlIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfTE9DQUw6Ci0JICAgICAgZG9fbG9jYWwgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19NQUNSTzoKLQkgICAgICBkb19tYWNybyAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0VORE06Ci0JICAgICAgZG9fZW5kbSAoKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1NSRVNDOgotCSAgICAgIGRvX3JlcyAoaWR4LCBsaW5lLCAnYycpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfUFJJTlQ6Ci0JICAgICAgZG9fcHJpbnQgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19GT1JNOgotCSAgICAgIGRvX2Zvcm0gKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19IRUFESU5HOgotCSAgICAgIGRvX2hlYWRpbmcgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19QQUdFOgotCSAgICAgIGRvX3BhZ2UgKCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19HTE9CQUw6Ci0JICAgIGNhc2UgS19FWFBPUlQ6Ci0JICAgICAgZG9fZXhwb3J0IChsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lNUE9SVDoKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1NSRVNaOgotCSAgICAgIGRvX3JlcyAoaWR4LCBsaW5lLCAneicpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSUdOT1JFRDoKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0VORDoKLQkgICAgICBkb19lbmQgKGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQVNTSUdOQToKLQkgICAgICBkb19hc3NpZ25hIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQVNTSUdOQzoKLQkgICAgICBkb19hc3NpZ25jIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfRVhJVE06Ci0JICAgICAgZG9fZXhpdG0gKCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19SRUc6Ci0JICAgICAgZG9fcmVnIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSUZFUToKLQkgICAgICBkb19pZiAoaWR4LCBsaW5lLCBFUSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JRk5FOgotCSAgICAgIGRvX2lmIChpZHgsIGxpbmUsIE5FKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lGTFQ6Ci0JICAgICAgZG9faWYgKGlkeCwgbGluZSwgTFQpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSUZMRToKLQkgICAgICBkb19pZiAoaWR4LCBsaW5lLCBMRSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JRkdFOgotCSAgICAgIGRvX2lmIChpZHgsIGxpbmUsIEdFKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lGR1Q6Ci0JICAgICAgZG9faWYgKGlkeCwgbGluZSwgR1QpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSUZDOgotCSAgICAgIGRvX2lmYyAoaWR4LCBsaW5lLCAwKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lGTkM6Ci0JICAgICAgZG9faWZjIChpZHgsIGxpbmUsIDEpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSVJQOgotCSAgICAgIGRvX2lycCAoaWR4LCBsaW5lLCAwKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lSUEM6Ci0JICAgICAgZG9faXJwIChpZHgsIGxpbmUsIDEpOwotCSAgICAgIHJldHVybiAxOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotCi0vKiBBZGQgYSBrZXl3b3JkIHRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF9rZXl3b3JkIChuYW1lLCBjb2RlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgY29kZTsKLXsKLSAgc2IgbGFiZWw7Ci0gIGludCBqOwotCi0gIHNiX25ldyAoJmxhYmVsKTsKLSAgc2JfYWRkX3N0cmluZyAoJmxhYmVsLCBuYW1lKTsKLQotICBoYXNoX2FkZF90b19pbnRfdGFibGUgKCZrZXl3b3JkX2hhc2hfdGFibGUsICZsYWJlbCwgY29kZSk7Ci0KLSAgc2JfcmVzZXQgKCZsYWJlbCk7Ci0gIGZvciAoaiA9IDA7IG5hbWVbal07IGorKykKLSAgICBzYl9hZGRfY2hhciAoJmxhYmVsLCBuYW1lW2pdIC0gJ0EnICsgJ2EnKTsKLSAgaGFzaF9hZGRfdG9faW50X3RhYmxlICgma2V5d29yZF9oYXNoX3RhYmxlLCAmbGFiZWwsIGNvZGUpOwotCi0gIHNiX2tpbGwgKCZsYWJlbCk7Ci19ICAKLQotLyogQnVpbGQgdGhlIGtleXdvcmQgaGFzaCB0YWJsZSAtIHB1dCBlYWNoIGtleXdvcmQgaW4gdGhlIHRhYmxlIHR3aWNlLAotICAgb25jZSB1cHBlciBhbmQgb25jZSBsb3dlciBjYXNlLiovCi0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2luaXQgKCkKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsga2luZm9baV0ubmFtZTsgaSsrKQotICAgIGFkZF9rZXl3b3JkIChraW5mb1tpXS5uYW1lLCBraW5mb1tpXS5jb2RlKTsKLQotICBpZiAobXJpKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IG1yaWtpbmZvW2ldLm5hbWU7IGkrKykKLQlhZGRfa2V5d29yZCAobXJpa2luZm9baV0ubmFtZSwgbXJpa2luZm9baV0uY29kZSk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1kb19kZWZpbmUgKHN0cmluZykKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzYiBsYWJlbDsKLSAgaW50IHJlcyA9IDE7Ci0gIGhhc2hfZW50cnkgKnB0cjsKLSAgc2JfbmV3ICgmbGFiZWwpOwotCi0KLSAgd2hpbGUgKCpzdHJpbmcpCi0gICAgewotICAgICAgaWYgKCpzdHJpbmcgPT0gJz0nKSAKLQl7Ci0JICBzYiB2YWx1ZTsKLQkgIHNiX25ldyAoJnZhbHVlKTsKLQkgIHN0cmluZysrOwotCSAgd2hpbGUgKCpzdHJpbmcpCi0JICAgIHsKLQkgICAgICBzYl9hZGRfY2hhciAoJnZhbHVlLCAqc3RyaW5nKTsKLQkgICAgICBzdHJpbmcrKzsKLQkgICAgfQotCSAgZXhwX2dldF9hYnMgKF8oIkludmFsaWQgZXhwcmVzc2lvbiBvbiBjb21tYW5kIGxpbmUuXG4iKSwgMCwgJnZhbHVlLCAmcmVzKTsKLQkgIHNiX2tpbGwgKCZ2YWx1ZSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBzYl9hZGRfY2hhciAoJmxhYmVsLCAqc3RyaW5nKTsKLQotICAgICAgc3RyaW5nICsrOwotICAgIH0KLQotICBwdHIgPSBoYXNoX2NyZWF0ZSAoJnZhcnMsICZsYWJlbCk7Ci0gIGZyZWVfb2xkX2VudHJ5IChwdHIpOwotICBwdHItPnR5cGUgPSBoYXNoX2ludGVnZXI7Ci0gIHB0ci0+dmFsdWUuaSA9IHJlczsKLSAgc2Jfa2lsbCAoJmxhYmVsKTsKLX0KLWNoYXIgKnByb2dyYW1fbmFtZTsKLQotLyogVGhlIGxpc3Qgb2YgbG9uZyBvcHRpb25zLiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgeyAiYWx0ZXJuYXRlIiwgbm9fYXJndW1lbnQsIDAsICdhJyB9LAotICB7ICJpbmNsdWRlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJyB9LAotICB7ICJjb21tZW50Y2hhciIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnYycgfSwKLSAgeyAiY29weXNvdXJjZSIsIG5vX2FyZ3VtZW50LCAwLCAncycgfSwKLSAgeyAiZGVidWciLCBub19hcmd1bWVudCwgMCwgJ2QnIH0sCi0gIHsgImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnIH0sCi0gIHsgIm1yaSIsIG5vX2FyZ3VtZW50LCAwLCAnTScgfSwKLSAgeyAib3V0cHV0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdvJyB9LAotICB7ICJwcmludCIsIG5vX2FyZ3VtZW50LCAwLCAncCcgfSwKLSAgeyAidW5yZWFzb25hYmxlIiwgbm9fYXJndW1lbnQsIDAsICd1JyB9LAotICB7ICJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICd2JyB9LAotICB7ICJkZWZpbmUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2QnIH0sCi0gIHsgTlVMTCwgbm9fYXJndW1lbnQsIDAsIDAgfQotfTsKLQotLyogU2hvdyBhIHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuICAqLwotc3RhdGljIHZvaWQKLXNob3dfdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiXAotVXNhZ2U6ICVzIFxuXAotICBbLWFdICAgICAgWy0tYWx0ZXJuYXRlXSAgICAgICAgIGVudGVyIGFsdGVybmF0ZSBtYWNybyBtb2RlXG5cCi0gIFstYyBjaGFyXSBbLS1jb21tZW50Y2hhciBjaGFyXSAgY2hhbmdlIHRoZSBjb21tZW50IGNoYXJhY3RlciBmcm9tICFcblwKLSAgWy1kXSAgICAgIFstLWRlYnVnXSAgICAgICAgICAgICBwcmludCBzb21lIGRlYnVnZ2luZyBpbmZvXG5cCi0gIFstaF0gICAgICBbLS1oZWxwXSAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlXG5cCi0gIFstTV0gICAgICBbLS1tcmldICAgICAgICAgICAgICAgZW50ZXIgTVJJIGNvbXBhdGliaWxpdHkgbW9kZVxuXAotICBbLW8gb3V0XSAgWy0tb3V0cHV0IG91dF0gICAgICAgIHNldCB0aGUgb3V0cHV0IGZpbGVcblwKLSAgWy1wXSAgICAgIFstLXByaW50XSAgICAgICAgICAgICBwcmludCBsaW5lIG51bWJlcnNcbiIpLCBwcm9ncmFtX25hbWUpOwotICBmcHJpbnRmIChmaWxlLCBfKCJcCi0gIFstc10gICAgICBbLS1jb3B5c291cmNlXSAgICAgICAgY29weSBzb3VyY2UgdGhyb3VnaCBhcyBjb21tZW50cyBcblwKLSAgWy11XSAgICAgIFstLXVucmVhc29uYWJsZV0gICAgICBhbGxvdyB1bnJlYXNvbmFibGUgbmVzdGluZ1xuXAotICBbLXZdICAgICAgWy0tdmVyc2lvbl0gICAgICAgICAgIHByaW50IHRoZSBwcm9ncmFtIHZlcnNpb25cblwKLSAgWy1EbmFtZT12YWx1ZV0gICAgICAgICAgICAgICAgICBjcmVhdGUgcHJlcHJvY2Vzc29yIHZhcmlhYmxlIGNhbGxlZCBuYW1lLCB3aXRoIHZhbHVlXG5cCi0gIFstSXBhdGhdICAgICAgICAgICAgICAgICAgICAgICAgYWRkIHRvIGluY2x1ZGUgcGF0aCBsaXN0XG5cCi0gIFtpbi1maWxlXVxuIikpOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgcHJpbnRmIChfKCJcblJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotICBleGl0IChzdGF0dXMpOwotfQotCi0vKiBEaXNwbGF5IGEgaGVscCBtZXNzYWdlIGFuZCBleGl0LiAgKi8KLXN0YXRpYyB2b2lkCi1zaG93X2hlbHAgKCkKLXsKLSAgcHJpbnRmIChfKCIlczogR251IEFzc2VtYmxlciBNYWNybyBQcmVwcm9jZXNzb3JcbiIpLAotCSAgcHJvZ3JhbV9uYW1lKTsKLSAgc2hvd191c2FnZSAoc3Rkb3V0LCAwKTsKLX0KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBvcHQ7Ci0gIGNoYXIgKm91dF9uYW1lID0gMDsKLSAgc3AgPSBpbmNsdWRlX3N0YWNrOwotCi0gIGlmc3RhY2tbMF0ub24gPSAxOwotICBpZmkgPSAwOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIGhhc2hfbmV3X3RhYmxlICgxMDEsICZrZXl3b3JkX2hhc2hfdGFibGUpOwotICBoYXNoX25ld190YWJsZSAoMTAxLCAmYXNzaWduX2hhc2hfdGFibGUpOwotICBoYXNoX25ld190YWJsZSAoMTAxLCAmdmFycyk7Ci0KLSAgc2JfbmV3ICgmbGFiZWwpOwotCi0gIHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJJOnNkaGF2Yzp1cG86RDpNIiwgbG9uZ19vcHRpb25zLAotCQkJICAgICAoaW50ICopIE5VTEwpKQotCSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChvcHQpCi0JewotCWNhc2UgJ28nOgotCSAgb3V0X25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICd1JzoKLQkgIHVucmVhc29uYWJsZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdJJzoKLQkgIHsKLQkgICAgaW5jbHVkZV9wYXRoICpwID0gKGluY2x1ZGVfcGF0aCAqKSB4bWFsbG9jIChzaXplb2YgKGluY2x1ZGVfcGF0aCkpOwotCSAgICBwLT5uZXh0ID0gTlVMTDsKLQkgICAgc2JfbmV3ICgmcC0+cGF0aCk7Ci0JICAgIHNiX2FkZF9zdHJpbmcgKCZwLT5wYXRoLCBvcHRhcmcpOwotCSAgICBpZiAocGF0aHNfdGFpbCkKLQkgICAgICBwYXRoc190YWlsLT5uZXh0ID0gcDsKLQkgICAgZWxzZQotCSAgICAgIHBhdGhzX2hlYWQgPSBwOwotCSAgICBwYXRoc190YWlsID0gcDsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgcHJpbnRfbGluZV9udW1iZXIgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnYyc6Ci0JICBjb21tZW50X2NoYXIgPSBvcHRhcmdbMF07Ci0JICBicmVhazsKLQljYXNlICdhJzoKLQkgIGFsdGVybmF0ZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGNvcHlzb3VyY2UgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBzdGF0cyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdEJzoKLQkgIGRvX2RlZmluZSAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ00nOgotCSAgbXJpID0gMTsKLQkgIGNvbW1lbnRfY2hhciA9ICc7JzsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgc2hvd19oZWxwICgpOwotCSAgLypOT1RSRUFDSEVEKi8KLQljYXNlICd2JzoKLQkgIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0JICBwcmludGYgKF8oIkdOVSBhc3NlbWJsZXIgcHJlLXByb2Nlc3NvciAlc1xuIiksIHByb2dyYW1fdmVyc2lvbik7Ci0JICBwcmludGYgKF8oIkNvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIikpOwotCSAgcHJpbnRmIChfKCJcCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG5cCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iKSk7Ci0JICBleGl0ICgwKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JY2FzZSAwOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHNob3dfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCX0KLSAgICB9Ci0KLSAgcHJvY2Vzc19pbml0ICgpOwotCi0gIG1hY3JvX2luaXQgKGFsdGVybmF0ZSwgbXJpLCAwLCBleHBfZ2V0X2Ficyk7Ci0KLSAgaWYgKG91dF9uYW1lKSB7Ci0gICAgb3V0ZmlsZSA9IGZvcGVuIChvdXRfbmFtZSwgInciKTsKLSAgICBpZiAoIW91dGZpbGUpCi0gICAgICB7Ci0JZnByaW50ZiAoc3RkZXJyLCBfKCIlczogQ2FuJ3Qgb3BlbiBvdXRwdXQgZmlsZSBgJXMnLlxuIiksCi0JCSBwcm9ncmFtX25hbWUsIG91dF9uYW1lKTsKLQlleGl0ICgxKTsKLSAgICAgIH0KLSAgfQotICBlbHNlICB7Ci0gICAgb3V0ZmlsZSA9IHN0ZG91dDsKLSAgfQotCi0gIGNoYXJ0eXBlX2luaXQgKCk7Ci0gIGlmICghb3V0ZmlsZSkKLSAgICBvdXRmaWxlID0gc3Rkb3V0OwotCi0gIC8qIFByb2Nlc3MgYWxsIHRoZSBpbnB1dCBmaWxlcyAqLwotCi0gIHdoaWxlIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIGlmIChuZXdfZmlsZSAoYXJndltvcHRpbmRdKSkKLQl7Ci0JICBwcm9jZXNzX2ZpbGUgKCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IENhbid0IG9wZW4gaW5wdXQgZmlsZSBgJXMnLlxuIiksCi0JCSAgIHByb2dyYW1fbmFtZSwgYXJndltvcHRpbmRdKTsKLQkgIGV4aXQgKDEpOwotCX0KLSAgICAgIG9wdGluZCsrOwotICAgIH0KLQotICBxdWl0ICgpOwotICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJlY2F1c2UgYW4gYWJvcnQgaW4gc29tZSBvZiB0aGUgb3RoZXIgZmlsZXMKLSAgIG1heSBiZSBjb21waWxlZCBpbnRvIGFzX2Fib3J0IGJlY2F1c2UgdGhleSBpbmNsdWRlIGFzLmguICAqLwotCi12b2lkCi1hc19hYm9ydCAoZmlsZSwgbGluZSwgZm4pCi0gICAgIGNvbnN0IGNoYXIgKmZpbGUsICpmbjsKLSAgICAgaW50IGxpbmU7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiSW50ZXJuYWwgZXJyb3IsIGFib3J0aW5nIGF0ICVzIGxpbmUgJWQiKSwgZmlsZSwgbGluZSk7Ci0gIGlmIChmbikKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgaW4gJXMiLCBmbik7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiXG5QbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIikpOwotICBleGl0ICgxKTsKLX0KZGlmZiAtLWdpdCBhL2dhcy9nZGJpbml0LmluIGIvZ2FzL2dkYmluaXQuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDY3MjYuLjAwMDAwMDAKLS0tIGEvZ2FzL2dkYmluaXQuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1kaXIgQHNyY2RpckAKLWRpciAuCi0KLWJyZWFrIGFzX3dhcm4KLWJyZWFrIGFzX3dhcm5fd2hlcmUKLWJyZWFrIGFzX2JhZAotYnJlYWsgYXNfYmFkX3doZXJlCi1icmVhayBhc19mYXRhbAotYnJlYWsgYXNfcGVycm9yCi1icmVhayBhc19hc3NlcnQKLWJyZWFrIGFzX2Fib3J0Ci0KLWRlZmluZSBwZQotY2FsbCBwcmludF9leHByICgkKQotZW5kCi0KLWRvY3VtZW50IHBlCi1QcmludCAqJCBhcyBhbiBleHByZXNzaW9uUywgZXhwYW5kaW5nIHBhcmFtZXRlcnMuCi1lbmQKLQotZGVmaW5lIHBzCi1jYWxsIHByaW50X3N5bWJvbF92YWx1ZSAoJCkKLWVuZAotCi1kb2N1bWVudCBwcwotUHJpbnQgKiQgYXMgYSBzeW1ib2xTLCBpbmNsdWRpbmcgZXhwcmVzc2lvbiB2YWx1ZS4KLWVuZAotCi1kZWZpbmUgcGYKLWNhbGwgcHJpbnRfZml4dXAgKCQpCi1lbmQKLQotZG9jdW1lbnQgcGYKLVByaW50ICokIGFzIGEgZml4UywgaW5jbHVkaW5nIHN5bWJvbCB2YWx1ZS4KLWVuZAotCi0jIFB1dCB0aGlzIGxhc3QsIGluIGNhc2UgaXQgZmFpbHMuCi0KLWJyZWFrIGFib3J0CmRpZmYgLS1naXQgYS9nYXMvaGFzaC5jIGIvZ2FzL2hhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjZDY2MC4uMDAwMDAwMAotLS0gYS9nYXMvaGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAyOCArMCwwIEBACi0vKiBoYXNoLmMgLSBoYXNoIHRhYmxlIGxvb2t1cCBzdHJpbmdzIC0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBCVUdTLCBHUklQRVMsIEFQT0xPR0lBIGV0Yy4KLSAqCi0gKiBBIHR5cGljYWwgdXNlciBkb2Vzbid0IG5lZWQgQUxMIHRoaXM6IEkgaW50ZW5kIHRvIG1ha2UgYSBsaWJyYXJ5IG91dAotICogb2YgaXQgb25lIGRheSAtIERlYW4gRWxzbmVyLgotICogQWxzbywgSSB3YW50IHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiBhIHN5bWJvbCB0byAoYWRkcmVzcyxsZW5ndGgpCi0gKiBzbyBJIGNhbiBwdXQgYXJiaXRyYXJ5IGJpbmFyeSBpbiB0aGUgbmFtZXMgc3RvcmVkLiBbc2VlIGhzaC5jIGZvciB0aGF0XQotICoKLSAqIFRoaXMgc2xpbWUgaXMgY29tbW9uIGNvdXBsZWQgaW5zaWRlIHRoZSBtb2R1bGUuIENvbS1jb3VwbGluZyAoYW5kIG90aGVyCi0gKiB2YW5kYWxpc20pIHdhcyBkb25lIHRvIHNwZWVkIHJ1bm5pbmcgdGltZS4gVGhlIGludGVyZmFjZXMgYXQgdGhlCi0gKiBtb2R1bGUncyBlZGdlcyBhcmUgYWRlcXVhdGVseSBjbGVhbi4KLSAqCi0gKiBUaGVyZSBpcyBubyB3YXkgdG8gKGEpIHJ1biBhIHRlc3Qgc2NyaXB0IHRocm91Z2ggdGhpcyBoZWFwIGFuZCAoYikKLSAqIGNvbXBhcmUgcmVzdWx0cyB3aXRoIHByZXZpb3VzIHNjcmlwdHMsIHRvIHNlZSBpZiB3ZSBoYXZlIGJyb2tlbiBhbnkKLSAqIGNvZGUuIFVzZSBHTlUgKGYpdXRpbGl0aWVzIHRvIGRvIHRoaXMuIEEgZmV3IGNvbW1hbmRzIGFzc2lzdCB0ZXN0LgotICogVGhlIHRlc3RpbmcgaXMgYXdrd2FyZDogaXQgdHJpZXMgdG8gYmUgYm90aCBiYXRjaCAmIGludGVyYWN0aXZlLgotICogRm9yIG5vdywgaW50ZXJhY3RpdmUgcnVsZXMhCi0gKi8KLQwKLS8qCi0gKiAgVGhlIGlkZWEgaXMgdG8gaW1wbGVtZW50IGEgc3ltYm9sIHRhYmxlLiBBIHRlc3QgamlnIGlzIGhlcmUuCi0gKiAgU3ltYm9scyBhcmUgYXJiaXRyYXJ5IHN0cmluZ3M7IHRoZXkgY2FuJ3QgY29udGFpbiAnXDAnLgotICoJW1NlZSBoc2guYyBmb3IgYSBtb3JlIGdlbmVyYWwgc3ltYm9sIGZsYXZvdXIuXQotICogIEVhY2ggc3ltYm9sIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGNoYXIqLCB3aGljaCBjYW4gcG9pbnQgdG8gYW55dGhpbmcKLSAqICB5b3Ugd2FudCwgYWxsb3dpbmcgYW4gYXJiaXRyYXJ5IHByb3BlcnR5IGxpc3QgZm9yIGVhY2ggc3ltYm9sLgotICoKLSAqICBUaGUgYmFzaWMgb3BlcmF0aW9ucyBhcmU6Ci0gKgotICogICAgbmV3ICAgICAgICAgICAgICAgICAgICAgY3JlYXRlcyBzeW1ib2wgdGFibGUsIHJldHVybnMgaGFuZGxlCi0gKiAgICBmaW5kIChzeW1ib2wpICAgICAgICAgICByZXR1cm5zIGNoYXIqCi0gKiAgICBpbnNlcnQgKHN5bWJvbCxjaGFyKikgICBlcnJvciBpZiBzeW1ib2wgYWxyZWFkeSBpbiB0YWJsZQotICogICAgZGVsZXRlIChzeW1ib2wpICAgICAgICAgcmV0dXJucyBjaGFyKiBpZiBzeW1ib2wgd2FzIGluIHRhYmxlCi0gKiAgICBhcHBseSAgICAgICAgICAgICAgICAgICBzbyB5b3UgY2FuIGRlbGV0ZSBhbGwgc3ltYm9scyBiZWZvcmUgZGllKCkKLSAqICAgIGRpZSAgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3kgc3ltYm9sIHRhYmxlIChmcmVlIHVwIG1lbW9yeSkKLSAqCi0gKiAgU3VwcGxlbWVudGFyeSBmdW5jdGlvbnMgaW5jbHVkZToKLSAqCi0gKiAgICBzYXkgICAgICAgICAgICAgICAgICAgICBob3cgYmlnPyB3aGF0ICUgZnVsbD8KLSAqICAgIHJlcGxhY2UgKHN5bWJvbCxuZXd2YWwpIHJlcG9ydCBwcmV2aW91cyB2YWx1ZQotICogICAgamFtIChzeW1ib2wsdmFsdWUpICAgICAgYXNzZXJ0IHN5bWJvbDo9dmFsdWUKLSAqCi0gKiAgWW91LCB0aGUgY2FsbGVyLCBoYXZlIGNvbnRyb2wgb3ZlciBlcnJvcnM6IHRoaXMganVzdCByZXBvcnRzIHRoZW0uCi0gKgotICogIFRoaXMgcGFja2FnZSByZXF1aXJlcyBtYWxsb2MoKSwgZnJlZSgpLgotICogIE1hbGxvYyhzaXplKSByZXR1cm5zIE5VTEwgb3IgYWRkcmVzcyBvZiBjaGFyW3NpemVdLgotICogIEZyZWUoYWRkcmVzcykgZnJlZXMgc2FtZS4KLSAqLwotDAotLyoKLSAqICBUaGUgY29kZSBhbmQgaXRzIHN0cnVjdHVyZXMgYXJlIHJlLWVudGVyZW50LgotICoKLSAqICBCZWZvcmUgeW91IGRvIGFueXRoaW5nIGVsc2UsIHlvdSBtdXN0IGNhbGwgaGFzaF9uZXcoKSB3aGljaCB3aWxsCi0gKiAgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIGEgaGFzaC10YWJsZS1jb250cm9sLWJsb2NrLiAgWW91IHRoZW4gdXNlCi0gKiAgdGhpcyBhZGRyZXNzIGFzIGEgaGFuZGxlIG9mIHRoZSBzeW1ib2wgdGFibGUgYnkgcGFzc2luZyBpdCB0byBhbGwKLSAqICB0aGUgb3RoZXIgaGFzaF8uLi4oKSBmdW5jdGlvbnMuICBUaGUgb25seSBhcHByb3ZlZCB3YXkgdG8gcmVjb3ZlcgotICogIHRoZSBtZW1vcnkgdXNlZCBieSB0aGUgc3ltYm9sIHRhYmxlIGlzIHRvIGNhbGwgaGFzaF9kaWUoKSB3aXRoIHRoZQotICogIGhhbmRsZSBvZiB0aGUgc3ltYm9sIHRhYmxlLgotICoKLSAqICBCZWZvcmUgeW91IGNhbGwgaGFzaF9kaWUoKSB5b3Ugbm9ybWFsbHkgZGVsZXRlIGFueXRoaW5nIHBvaW50ZWQgdG8KLSAqICBieSBpbmRpdmlkdWFsIHN5bWJvbHMuIEFmdGVyIGhhc2hfZGllKCkgeW91IGNhbid0IHVzZSB0aGF0IHN5bWJvbAotICogIHRhYmxlIGFnYWluLgotICoKLSAqICBUaGUgY2hhciogeW91IGFzc29jaWF0ZSB3aXRoIGEgc3ltYm9sIG1heSBub3QgYmUgTlVMTCAoMCkgYmVjYXVzZQotICogIE5VTEwgaXMgcmV0dXJuZWQgd2hlbmV2ZXIgYSBzeW1ib2wgaXMgbm90IGluIHRoZSB0YWJsZS4gQW55IG90aGVyCi0gKiAgdmFsdWUgaXMgT0ssIGV4Y2VwdCBERUxFVEVELCAjZGVmaW5lZCBiZWxvdy4KLSAqCi0gKiAgV2hlbiB5b3Ugc3VwcGx5IGEgc3ltYm9sIHN0cmluZyBmb3IgaW5zZXJ0aW9uLCBZT1UgTVVTVCBQUkVTRVJWRSBUSEUKLSAqICBTVFJJTkcgdW50aWwgdGhhdCBzeW1ib2wgaXMgZGVsZXRlZCBmcm9tIHRoZSB0YWJsZS4gVGhlIHJlYXNvbiBpcyB0aGF0Ci0gKiAgb25seSB0aGUgYWRkcmVzcyB5b3Ugc3VwcGx5LCBOT1QgdGhlIHN5bWJvbCBzdHJpbmcgaXRzZWxmLCBpcyBzdG9yZWQKLSAqICBpbiB0aGUgc3ltYm9sIHRhYmxlLgotICoKLSAqICBZb3UgbWF5IGRlbGV0ZSBhbmQgYWRkIHN5bWJvbHMgYXJiaXRyYXJpbHkuCi0gKiAgQW55IG9yIGFsbCBzeW1ib2xzIG1heSBoYXZlIHRoZSBzYW1lICd2YWx1ZScgKGNoYXIgKikuIEluIGZhY3QsIHRoZXNlCi0gKiAgcm91dGluZXMgZG9uJ3QgZG8gYW55dGhpbmcgd2l0aCB5b3VyIHN5bWJvbCB2YWx1ZXMuCi0gKgotICogIFlvdSBoYXZlIG5vIHJpZ2h0IHRvIGtub3cgd2hlcmUgdGhlIHN5bWJvbDpjaGFyKiBtYXBwaW5nIGlzIHN0b3JlZCwKLSAqICBiZWNhdXNlIGl0IG1vdmVzIGFyb3VuZCBpbiBtZW1vcnk7IGFsc28gYmVjYXVzZSB3ZSBtYXkgY2hhbmdlIGhvdyBpdAotICogIHdvcmtzIGFuZCB3ZSBkb24ndCB3YW50IHRvIGJyZWFrIHlvdXIgY29kZSBkbyB3ZT8gSG93ZXZlciB0aGUgaGFuZGxlCi0gKiAgKGFkZHJlc3Mgb2Ygc3RydWN0IGhhc2hfY29udHJvbCkgaXMgbmV2ZXIgY2hhbmdlZCBpbgotICogIHRoZSBsaWZlIG9mIHRoZSBzeW1ib2wgdGFibGUuCi0gKgotICogIFdoYXQgeW91IENBTiBmaW5kIG91dCBhYm91dCBhIHN5bWJvbCB0YWJsZSBpczoKLSAqICAgIGhvdyBtYW55IHNsb3RzIGFyZSBpbiB0aGUgaGFzaCB0YWJsZT8KLSAqICAgIGhvdyBtYW55IHNsb3RzIGFyZSBmaWxsZWQgd2l0aCBzeW1ib2xzPwotICogICAgKHRvdGFsIGhhc2hlcyxjb2xsaXNpb25zKSBmb3IgKHJlYWRzLHdyaXRlcykgKCopCi0gKiAgQWxsIG9mIHRoZSBhYm92ZSB2YWx1ZXMgdmFyeSBpbiB0aW1lLgotICogICgqKSBzb21lIG9mIHRoZXNlIG51bWJlcnMgd2lsbCBub3QgYmUgbWVhbmluZ2Z1bCBpZiB3ZSBjaGFuZ2UgdGhlCi0gKiAgaW50ZXJuYWxzLiAqLwotDAotLyoKLSAqICBJIE4gVCBFIFIgTiBBIEwKLSAqCi0gKiAgSGFzaCB0YWJsZSBpcyBhbiBhcnJheSBvZiBoYXNoX2VudHJpZXM7IGVhY2ggZW50cnkgaXMgYSBwb2ludGVyIHRvIGEKLSAqICBhIHN0cmluZyBhbmQgYSB1c2VyLXN1cHBsaWVkIHZhbHVlIDEgY2hhciogd2lkZS4KLSAqCi0gKiAgVGhlIGFycmF5IGFsd2F5cyBoYXMgMiAqKiBuIGVsZW1lbnRzLCBuPjAsIG4gaW50ZWdlci4KLSAqICBUaGVyZSBpcyBhbHNvIGEgJ3dhbGwnIGVudHJ5IGFmdGVyIHRoZSBhcnJheSwgd2hpY2ggaXMgYWx3YXlzIGVtcHR5Ci0gKiAgYW5kIGFjdHMgYXMgYSBzZW50aW5lbCB0byBzdG9wIHJ1bm5pbmcgb2ZmIHRoZSBlbmQgb2YgdGhlIGFycmF5LgotICogIFdoZW4gdGhlIGFycmF5IGdldHMgdG9vIGZ1bGwsIHdlIGNyZWF0ZSBhIG5ldyBhcnJheSB0d2ljZSBhcyBsYXJnZQotICogIGFuZCByZS1oYXNoIHRoZSBzeW1ib2xzIGludG8gdGhlIG5ldyBhcnJheSwgdGhlbiBmb3JnZXQgdGhlIG9sZCBhcnJheS4KLSAqICAoT2YgY291cnNlLCB3ZSBjb3B5IHRoZSB2YWx1ZXMgaW50byB0aGUgbmV3IGFycmF5IGJlZm9yZSB3ZSBqdW5rIHRoZQotICogIG9sZCBhcnJheSEpCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFCSgwKQotI2RlZmluZSBUUlVFCSghRkFMU0UpCi0jZW5kaWYgLyogbm8gRkFMU0UgeWV0ICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBtaW4oYSwgYikJKChhKSA8IChiKSA/IChhKSA6IChiKSkKLQotI2luY2x1ZGUgImFzLmgiCi0KLSNkZWZpbmUgZXJyb3IJYXNfZmF0YWwKLQotc3RhdGljIGNoYXIgX2RlbGV0ZWRfWzFdOwotI2RlZmluZSBERUxFVEVEICAgICAoKFBUUilfZGVsZXRlZF8pCS8qIGd1YXJlbnRlZWQgdW5pcXVlIGFkZHJlc3MgKi8KLSNkZWZpbmUgU1RBUlRfUE9XRVIgICAgKDEwKQkvKiBwb3dlciBvZiB0d286IHNpemUgb2YgbmV3IGhhc2ggdGFibGUgKi8KLQotLyogVFJVRSBpZiBhIHN5bWJvbCBpcyBpbiBlbnRyeSBAIHB0ci4gICovCi0jZGVmaW5lIGlzbGl2ZShwdHIpIChwdHItPmhhc2hfc3RyaW5nICYmIHB0ci0+aGFzaF9zdHJpbmchPURFTEVURUQpCi0KLWVudW0gc3RhdF9lbnVtIHsKLSAgLyogTnVtYmVyIG9mIHNsb3RzIGluIGhhc2ggdGFibGUuICBUaGUgd2FsbCBkb2VzIG5vdCBjb3VudCBoZXJlLgotICAgICBXZSBleHBlY3QgdGhpcyBpcyBhbHdheXMgYSBwb3dlciBvZiAyLiAgKi8KLSAgU1RBVF9TSVpFID0gMCwKLSAgLyogTnVtYmVyIG9mIGhhc2hfYXNrIGNhbGxzLiAgKi8KLSAgU1RBVF9BQ0NFU1MsCi0gIFNUQVRfQUNDRVNTX3csCi0gIC8qIE51bWJlciBvZiBjb2xsaXNpb25zICh0b3RhbCkuICBUaGlzIG1heSBleGNlZWQgU1RBVF9BQ0NFU1MgaWYgd2UKLSAgICAgaGF2ZSBsb3RzIG9mIGNvbGxpc2lvbnMvYWNjZXNzLiAgKi8KLSAgU1RBVF9DT0xMSURFLAotICBTVEFUX0NPTExJREVfdywKLSAgLyogU2xvdHMgdXNlZCByaWdodCBub3cuICAqLwotICBTVEFUX1VTRUQsCi0gIC8qIEhvdyBtYW55IHN0cmluZyBjb21wYXJlcz8gICovCi0gIFNUQVRfU1RSQ01QLAotICBTVEFUX1NUUkNNUF93LAotICAvKiBTaXplIG9mIHN0YXRpc3RpY3MgYmxvY2suLi4gdGhpcyBtdXN0IGJlIGxhc3QuICAqLwotICBTVEFUTEVOR1RICi19OwotI2RlZmluZSBTVEFUX19SRUFEICAgICAoMCkJLyogcmVhZGluZyAqLwotI2RlZmluZSBTVEFUX19XUklURSAgICAoMSkJLyogd3JpdGluZyAqLwotCi0vKiBXaGVuIHdlIGdyb3cgYSBoYXNoIHRhYmxlLCBieSB3aGF0IHBvd2VyIG9mIHR3byBkbyB3ZSBpbmNyZWFzZSBpdD8gICovCi0jZGVmaW5lIEdST1dfRkFDVE9SIDEKLS8qIFdoZW4gc2hvdWxkIHdlIGdyb3cgaXQ/ICAqLwotI2RlZmluZSBGVUxMX1ZBTFVFKE4pCSgoTikgLyAyKQotCi0vKiAjZGVmaW5lIFNVU1BFQ1QgdG8gZG8gcnVudGltZSBjaGVja3MgKi8KLS8qICNkZWZpbmUgVEVTVCB0byBiZSBhIHRlc3QgamlnIGZvciBoYXNoLi4uKCkgKi8KLQotI2lmZGVmIFRFU1QKLS8qIFRFU1Q6IHVzZSBzbWFsbGVyIGhhc2ggdGFibGUgKi8KLSN1bmRlZiAgU1RBUlRfUE9XRVIKLSNkZWZpbmUgU1RBUlRfUE9XRVIgKDMpCi0jdW5kZWYgIFNUQVJUX1NJWkUKLSNkZWZpbmUgU1RBUlRfU0laRSAgKDgpCi0jdW5kZWYgIFNUQVJUX0ZVTEwKLSNkZWZpbmUgU1RBUlRfRlVMTCAgKDQpCi0jZW5kaWYKLQwKLXN0cnVjdCBoYXNoX2VudHJ5Ci17Ci0gIGNvbnN0IGNoYXIgKmhhc2hfc3RyaW5nOwkvKiBwb2ludHMgdG8gd2hlcmUgdGhlIHN5bWJvbCBzdHJpbmcgaXMgKi8KLSAgLyogTlVMTCBtZWFucyBzbG90IGlzIG5vdCB1c2VkICovCi0gIC8qIERFTEVURUQgbWVhbnMgc2xvdCB3YXMgZGVsZXRlZCAqLwotICBQVFIgaGFzaF92YWx1ZTsJCS8qIHVzZXIncyBkYXR1bSwgYXNzb2NpYXRlZCB3aXRoIHN5bWJvbCAqLwotICB1bnNpZ25lZCBsb25nIGg7Ci19OwotCi1zdHJ1Y3QgaGFzaF9jb250cm9sIHsKLSAgc3RydWN0IGhhc2hfZW50cnkgKmhhc2hfd2hlcmU7LyogYWRkcmVzcyBvZiBoYXNoIHRhYmxlICovCi0gIGludCBoYXNoX3NpemVsb2c7CQkvKiBMb2cgb2YgKCBoYXNoX21hc2sgKyAxICkgKi8KLSAgaW50IGhhc2hfbWFzazsJCS8qIG1hc2tzIGEgaGFzaCBpbnRvIGluZGV4IGludG8gdGFibGUgKi8KLSAgaW50IGhhc2hfZnVsbDsJCS8qIHdoZW4gaGFzaF9zdGF0W1NUQVRfVVNFRF0gZXhjZWVkcyB0aGlzLCAqLwotICAvKiBncm93IHRhYmxlICovCi0gIHN0cnVjdCBoYXNoX2VudHJ5ICpoYXNoX3dhbGw7CS8qIHBvaW50IGp1c3QgYWZ0ZXIgbGFzdCAodXNhYmxlKSBlbnRyeSAqLwotICAvKiBoZXJlIHdlIGhhdmUgc29tZSBzdGF0aXN0aWNzICovCi0gIGludCBoYXNoX3N0YXRbU1RBVExFTkdUSF07CS8qIGxpZXMgJiBzdGF0aXN0aWNzICovCi19OwotDAotLyotLS0tLS0tLS0tLS0tLS0tLS0gcGxhbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGkgPSBpbnRlcm5hbAotCi0gIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBjOwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAgICogZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaQotICBpbnQgICAgICAgICAgICAgICAgICAgYlt6XTsgICAgIGJ1ZmZlciBmb3Igc3RhdGlzdGljcwotICB6ICAgICAgICAgc2l6ZSBvZiBiCi0gIGNoYXIgICAgICAgICAgICAgICAgKiBzOyAgICAgICAgc3ltYm9sIHN0cmluZyAoYWRkcmVzcykgWyBrZXkgXQotICBjaGFyICAgICAgICAgICAgICAgICogdjsgICAgICAgIHZhbHVlIHN0cmluZyAoYWRkcmVzcykgIFtkYXR1bV0KLSAgYm9vbGVhbiAgICAgICAgICAgICAgIGY7ICAgICAgICBUUlVFIGlmIHdlIGZvdW5kIHMgaW4gaGFzaCB0YWJsZSAgICAgICAgICAgIGkKLSAgY2hhciAgICAgICAgICAgICAgICAqIHQ7ICAgICAgICBlcnJvciBzdHJpbmc7IDAgbWVhbnMgT0sKLSAgaW50ICAgICAgICAgICAgICAgICAgIGE7ICAgICAgICBhY2Nlc3MgdHlwZSBbMC4uLm4pICAgICAgICAgICAgICAgICAgICAgICAgIGkKLQotICBjPWhhc2hfbmV3ICAgICAgICgpICAgICAgICAgICAgIGNyZWF0ZSBuZXcgaGFzaF9jb250cm9sCi0KLSAgaGFzaF9kaWUgICAgICAgICAoYykgICAgICAgICAgICBkZXN0cm95IGhhc2hfY29udHJvbCAoYW5kIGhhc2ggdGFibGUpCi0gIHRhYmxlIHNob3VsZCBiZSBlbXB0eS4KLSAgZG9lc24ndCBjaGVjayBpZiB0YWJsZSBpcyBlbXB0eS4KLSAgYyBoYXMgbm8gbWVhbmluZyBhZnRlciB0aGlzLgotCi0gIGhhc2hfc2F5ICAgICAgICAgKGMsYix6KSAgICAgICAgcmVwb3J0IHN0YXRpc3RpY3Mgb2YgaGFzaF9jb250cm9sLgotICBhbHNvIHJlcG9ydCBudW1iZXIgb2YgYXZhaWxhYmxlIHN0YXRpc3RpY3MuCi0KLSAgdj1oYXNoX2RlbGV0ZSAgICAoYyxzKSAgICAgICAgICBkZWxldGUgc3ltYm9sLCByZXR1cm4gb2xkIHZhbHVlIGlmIGFueS4KLSAgYXNrKCkgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgbWVhbnMgbm8gb2xkIHZhbHVlLgotICBmCi0KLSAgdj1oYXNoX3JlcGxhY2UgICAoYyxzLHYpICAgICAgICByZXBsYWNlIG9sZCB2YWx1ZSBvZiBzIHdpdGggdi4KLSAgYXNrKCkgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgbWVhbnMgbm8gb2xkIHZhbHVlOiBubyB0YWJsZSBjaGFuZ2UuCi0gIGYKLQotICB0PWhhc2hfaW5zZXJ0ICAgIChjLHMsdikgICAgICAgIGluc2VydCAocyx2KSBpbiBjLgotICBhc2soKSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yIHN0cmluZy4KLSAgZiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIGFuIGVycm9yIHRvIGluc2VydCBpZiBzIGlzIGFscmVhZHkKLSAgaW4gdGFibGUuCi0gIGlmIGFueSBlcnJvciwgYyBpcyB1bmNoYW5nZWQuCi0KLSAgdD1oYXNoX2phbSAgICAgICAoYyxzLHYpICAgICAgICBhc3NlcnQgdGhhdCBuZXcgdmFsdWUgb2YgcyB3aWxsIGJlIHYuICAgICAgIGkKLSAgYXNrKCkgICAgICAgICAgICAgICAgICAgICAgIGl0IG1heSBkZWNpZGUgdG8gR1JPVyB0aGUgdGFibGUuICAgICAgICAgICAgaQotICBmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpCi0gIGdyb3coKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkKLSAgdD1oYXNoX2dyb3cgICAgICAoYykgICAgICAgICAgICBncm93IHRoZSBoYXNoIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgIGkKLSAgamFtKCkgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgaW52b2tlIEpBTS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaQotCi0gID89aGFzaF9hcHBseSAgICAgKGMseSkgICAgICAgICAgYXBwbHkgeSgpIHRvIGV2ZXJ5IHN5bWJvbCBpbiBjLgotICB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0cmllcyB2aXNpdGVkIGluICd1bnNwZWNpZmllZCcgb3JkZXIuCi0KLSAgdj1oYXNoX2ZpbmQgICAgICAoYyxzKSAgICAgICAgICByZXR1cm4gdmFsdWUgb2Ygcywgb3IgTlVMTCBpZiBzIG5vdCBpbiBjLgotICBhc2soKQotICBmCi0KLSAgZixlPWhhc2hfYXNrKCkgICAoYyxzLGEpICAgICAgICByZXR1cm4gc2xvdCB3aGVyZSBzIFNIT1VMRCBsaXZlLiAgICAgICAgICAgIGkKLSAgY29kZSgpICAgICAgICAgICAgICAgICAgICAgIG1haW50YWluIGNvbGxpc2lvbiBzdGF0cyBpbiBjLiAgICAgICAgICAgICAgaQotCi0gIC49aGFzaF9jb2RlICAgICAgKGMscykgICAgICAgICAgY29tcHV0ZSBoYXNoLWNvZGUgZm9yIHMsICAgICAgICAgICAgICAgICAgICBpCi0gIGZyb20gcGFyYW1ldGVycyBvZiBjLiAgICAgICAgICAgICAgICAgICAgICAgaQotCi0gICovCi0MCi0vKiBSZXR1cm5lZCBieSBoYXNoX2FzaygpIHRvIHN0b3AgZXh0cmEgdGVzdGluZy4gaGFzaF9hc2soKSB3YW50cyB0bwotICAgcmV0dXJuIGJvdGggYSBzbG90IGFuZCBhIHN0YXR1cy4gVGhpcyBpcyB0aGUgc3RhdHVzLiAgVFJVRTogZm91bmQKLSAgIHN5bWJvbCBGQUxTRTogYWJzZW50OiBlbXB0eSBvciBkZWxldGVkIHNsb3QgQWxzbyByZXR1cm5lZCBieQotICAgaGFzaF9qYW0oKS4gIFRSVUU6IHdlIHJlcGxhY2VkIGEgdmFsdWUgRkFMU0U6IHdlIGluc2VydGVkIGEgdmFsdWUuICAqLwotc3RhdGljIGNoYXIgaGFzaF9mb3VuZDsKLQotc3RhdGljIHN0cnVjdCBoYXNoX2VudHJ5ICpoYXNoX2FzayBQQVJBTVMgKChzdHJ1Y3QgaGFzaF9jb250cm9sICosCi0JCQkJCSAgICBjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIGludCBoYXNoX2NvZGUgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBjb25zdCBjaGFyICpoYXNoX2dyb3cgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqKSk7Ci0MCi0vKiBDcmVhdGUgYSBuZXcgaGFzaCB0YWJsZS4gIFJldHVybiBOVUxMIGlmIGZhaWxlZDsgb3RoZXJ3aXNlIHJldHVybiBoYW5kbGUKLSAgIChhZGRyZXNzIG9mIHN0cnVjdCBoYXNoKS4gICovCi1zdHJ1Y3QgaGFzaF9jb250cm9sICoKLWhhc2hfbmV3ICgpCi17Ci0gIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnJldHZhbDsKLSAgc3RydWN0IGhhc2hfZW50cnkgKnJvb207CS8qIHBvaW50cyB0byBoYXNoIHRhYmxlICovCi0gIHN0cnVjdCBoYXNoX2VudHJ5ICp3YWxsOwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqZW50cnk7Ci0gIGludCAqaXA7CQkvKiBzY2FuIHN0YXRzIGJsb2NrIG9mIHN0cnVjdCBoYXNoX2NvbnRyb2wgKi8KLSAgaW50ICpuZDsJCS8qIGxpbWl0IG9mIHN0YXRzIGJsb2NrICovCi0KLSAgcm9vbSA9IChzdHJ1Y3QgaGFzaF9lbnRyeSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBoYXNoX2VudHJ5KQotCQkJCQkvKiArMSBmb3IgdGhlIHdhbGwgZW50cnkgKi8KLQkJCQkJKiAoKDEgPDwgU1RBUlRfUE9XRVIpICsgMSkpOwotICByZXR2YWwgPSAoc3RydWN0IGhhc2hfY29udHJvbCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBoYXNoX2NvbnRyb2wpKTsKLQotICBuZCA9IHJldHZhbC0+aGFzaF9zdGF0ICsgU1RBVExFTkdUSDsKLSAgZm9yIChpcCA9IHJldHZhbC0+aGFzaF9zdGF0OyBpcCA8IG5kOyBpcCsrKQotICAgICppcCA9IDA7Ci0KLSAgcmV0dmFsLT5oYXNoX3N0YXRbU1RBVF9TSVpFXSA9IDEgPDwgU1RBUlRfUE9XRVI7Ci0gIHJldHZhbC0+aGFzaF9tYXNrID0gKDEgPDwgU1RBUlRfUE9XRVIpIC0gMTsKLSAgcmV0dmFsLT5oYXNoX3NpemVsb2cgPSBTVEFSVF9QT1dFUjsKLSAgLyogd29ya3MgZm9yIDEncyBjb21wbCBvayAqLwotICByZXR2YWwtPmhhc2hfd2hlcmUgPSByb29tOwotICByZXR2YWwtPmhhc2hfd2FsbCA9Ci0gICAgd2FsbCA9IHJvb20gKyAoMSA8PCBTVEFSVF9QT1dFUik7Ci0gIHJldHZhbC0+aGFzaF9mdWxsID0gRlVMTF9WQUxVRSAoMSA8PCBTVEFSVF9QT1dFUik7Ci0gIGZvciAoZW50cnkgPSByb29tOyBlbnRyeSA8PSB3YWxsOyBlbnRyeSsrKQotICAgIGVudHJ5LT5oYXNoX3N0cmluZyA9IE5VTEw7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qCi0gKiAgICAgICAgICAgaCBhIHMgaCBfIGQgaSBlICggKQotICoKLSAqIFRhYmxlIHNob3VsZCBiZSBlbXB0eSwgYnV0IHRoaXMgaXMgbm90IGNoZWNrZWQuCi0gKiBUbyBlbXB0eSB0aGUgdGFibGUsIHRyeSBoYXNoX2FwcGx5KClpbmcgYSBzeW1ib2wgZGVsZXRlci4KLSAqIFJldHVybiB0byBmcmVlIG1lbW9yeSBib3RoIHRoZSBoYXNoIHRhYmxlIGFuZCBpdCdzIGNvbnRyb2wKLSAqIGJsb2NrLgotICogJ2hhbmRsZScgaGFzIG5vIG1lYW5pbmcgYWZ0ZXIgdGhpcyBmdW5jdGlvbi4KLSAqIE5vIGVycm9ycyBhcmUgcmVjb3ZlcmFibGUuCi0gKi8KLXZvaWQKLWhhc2hfZGllIChoYW5kbGUpCi0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhbmRsZTsKLXsKLSAgZnJlZSAoKGNoYXIgKikgaGFuZGxlLT5oYXNoX3doZXJlKTsKLSAgZnJlZSAoKGNoYXIgKikgaGFuZGxlKTsKLX0KLQwKLSNpZmRlZiBURVNUCi0vKgotICogICAgICAgICAgIGggYSBzIGggXyBzIGEgeSAoICkKLSAqCi0gKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHN0YXRpc3RpY3MgdGFibGUsIGFuZCBhcyBtYW55IHN0YXRpc3RpY3MgYXMKLSAqIHdlIGNhbiB1bnRpbCBlaXRoZXIgKGEpIHdlIGhhdmUgcnVuIG91dCBvZiBzdGF0aXN0aWNzIG9yIChiKSBjYWxsZXIKLSAqIGhhcyBydW4gb3V0IG9mIGJ1ZmZlci4KLSAqIE5PVEU6IGhhc2hfc2F5IHRyZWF0cyBhbGwgc3RhdGlzdGljcyBhbGlrZS4KLSAqIFRoZXNlIG51bWJlcnMgbWF5IGNoYW5nZSB3aXRoIHRpbWUsIGR1ZSB0byBpbnNlcnRpb25zLCBkZWxldGlvbnMKLSAqIGFuZCBleHBhbnNpb25zIG9mIHRoZSB0YWJsZS4KLSAqIFRoZSBmaXJzdCAic3RhdGlzdGljIiByZXR1cm5lZCBpcyB0aGUgbGVuZ3RoIG9mIGhhc2hfc3RhdFtdLgotICogVGhlbiBjb250ZW50cyBvZiBoYXNoX3N0YXRbXSBhcmUgcmVhZCBvdXQgKGluIGFzY2VuZGluZyBvcmRlcikKLSAqIHVudGlsIHlvdXIgYnVmZmVyIG9yIGhhc2hfc3RhdFtdIGlzIGV4YXVzdGVkLgotICovCi1zdGF0aWMgdm9pZAotaGFzaF9zYXkgKGhhbmRsZSwgYnVmZmVyLCBidWZzaXopCi0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhbmRsZTsKLSAgICAgaW50IGJ1ZmZlclsgLypidWZzaXoqLyBdOwotICAgICBpbnQgYnVmc2l6OwotewotICBpbnQgKm5kOwkJLyogbGltaXQgb2Ygc3RhdGlzdGljcyBibG9jayAqLwotICBpbnQgKmlwOwkJLyogc2NhbiBzdGF0aXN0aWNzICovCi0KLSAgaXAgPSBoYW5kbGUtPmhhc2hfc3RhdDsKLSAgbmQgPSBpcCArIG1pbiAoYnVmc2l6IC0gMSwgU1RBVExFTkdUSCk7Ci0gIGlmIChidWZzaXogPiAwKQkJLyogdHJ1c3Qgbm90aGluZyEgYnVmc2l6PD0wIGlzIGRhbmdlcm91cyAqLwotICAgIHsKLSAgICAgICpidWZmZXIrKyA9IFNUQVRMRU5HVEg7Ci0gICAgICBmb3IgKDsgaXAgPCBuZDsgaXArKywgYnVmZmVyKyspCi0JewotCSAgKmJ1ZmZlciA9ICppcDsKLQl9Ci0gICAgfQotfQotI2VuZGlmCi0MCi0vKgotICogICAgICAgICAgIGggYSBzIGggXyBkIGUgbCBlIHQgZSAoICkKLSAqCi0gKiBUcnkgdG8gZGVsZXRlIGEgc3ltYm9sIGZyb20gdGhlIHRhYmxlLgotICogSWYgaXQgd2FzIHRoZXJlLCByZXR1cm4gaXRzIHZhbHVlIChhbmQgYWRqdXN0IFNUQVRfVVNFRCkuCi0gKiBPdGhlcndpc2UsIHJldHVybiBOVUxMLgotICogQW55d2F5LCB0aGUgc3ltYm9sIGlzIG5vdCBwcmVzZW50IGFmdGVyIHRoaXMgZnVuY3Rpb24uCi0gKgotICovCi1QVFIJCQkJLyogTlVMTCBpZiBzdHJpbmcgbm90IGluIHRhYmxlLCBlbHNlICovCi0vKiByZXR1cm5zIHZhbHVlIG9mIGRlbGV0ZWQgc3ltYm9sICovCi1oYXNoX2RlbGV0ZSAoaGFuZGxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBQVFIgcmV0dmFsOwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqZW50cnk7Ci0KLSAgZW50cnkgPSBoYXNoX2FzayAoaGFuZGxlLCBzdHJpbmcsIFNUQVRfX1dSSVRFKTsKLSAgaWYgKGhhc2hfZm91bmQpCi0gICAgewotICAgICAgcmV0dmFsID0gZW50cnktPmhhc2hfdmFsdWU7Ci0gICAgICBlbnRyeS0+aGFzaF9zdHJpbmcgPSBERUxFVEVEOwotICAgICAgaGFuZGxlLT5oYXNoX3N0YXRbU1RBVF9VU0VEXSAtPSAxOwotI2lmZGVmIFNVU1BFQ1QKLSAgICAgIGlmIChoYW5kbGUtPmhhc2hfc3RhdFtTVEFUX1VTRURdIDwgMCkKLQl7Ci0JICBlcnJvciAoImhhc2hfZGVsZXRlIik7Ci0JfQotI2VuZGlmIC8qIGRlZiBTVVNQRUNUICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmV0dmFsID0gTlVMTDsKLSAgICB9Ci0gIHJldHVybiAocmV0dmFsKTsKLX0KLQwKLS8qCi0gKiAgICAgICAgICAgICAgICAgICBoIGEgcyBoIF8gciBlIHAgbCBhIGMgZSAoICkKLSAqCi0gKiBUcnkgdG8gcmVwbGFjZSB0aGUgb2xkIHZhbHVlIG9mIGEgc3ltYm9sIHdpdGggYSBuZXcgdmFsdWUuCi0gKiBOb3JtYWxseSByZXR1cm4gdGhlIG9sZCB2YWx1ZS4KLSAqIFJldHVybiBOVUxMIGFuZCBkb24ndCBjaGFuZ2UgdGhlIHRhYmxlIGlmIHRoZSBzeW1ib2wgaXMgbm90IGFscmVhZHkKLSAqIGluIHRoZSB0YWJsZS4KLSAqLwotUFRSCi1oYXNoX3JlcGxhY2UgKGhhbmRsZSwgc3RyaW5nLCB2YWx1ZSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIFBUUiB2YWx1ZTsKLXsKLSAgc3RydWN0IGhhc2hfZW50cnkgKmVudHJ5OwotICBjaGFyICpyZXR2YWw7Ci0KLSAgZW50cnkgPSBoYXNoX2FzayAoaGFuZGxlLCBzdHJpbmcsIFNUQVRfX1dSSVRFKTsKLSAgaWYgKGhhc2hfZm91bmQpCi0gICAgewotICAgICAgcmV0dmFsID0gZW50cnktPmhhc2hfdmFsdWU7Ci0gICAgICBlbnRyeS0+aGFzaF92YWx1ZSA9IHZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJldHZhbCA9IE5VTEw7Ci0gICAgfQotICA7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0MCi0vKgotICogICAgICAgICAgICAgICAgICAgaCBhIHMgaCBfIGkgbiBzIGUgciB0ICggKQotICoKLSAqIEluc2VydCBhIChzeW1ib2wtc3RyaW5nLCB2YWx1ZSkgaW50byB0aGUgaGFzaCB0YWJsZS4KLSAqIFJldHVybiBhbiBlcnJvciBzdHJpbmcsIDAgbWVhbnMgT0suCi0gKiBJdCBpcyBhbiAnZXJyb3InIHRvIGluc2VydCBhbiBleGlzdGluZyBzeW1ib2wuCi0gKi8KLQotY29uc3QgY2hhciAqCQkJLyogcmV0dXJuIGVycm9yIHN0cmluZyAqLwotaGFzaF9pbnNlcnQgKGhhbmRsZSwgc3RyaW5nLCB2YWx1ZSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIFBUUiB2YWx1ZTsKLXsKLSAgc3RydWN0IGhhc2hfZW50cnkgKmVudHJ5OwotICBjb25zdCBjaGFyICpyZXR2YWw7Ci0KLSAgcmV0dmFsID0gMDsKLSAgaWYgKGhhbmRsZS0+aGFzaF9zdGF0W1NUQVRfVVNFRF0gPiBoYW5kbGUtPmhhc2hfZnVsbCkKLSAgICB7Ci0gICAgICByZXR2YWwgPSBoYXNoX2dyb3cgKGhhbmRsZSk7Ci0gICAgfQotICBpZiAoIXJldHZhbCkKLSAgICB7Ci0gICAgICBlbnRyeSA9IGhhc2hfYXNrIChoYW5kbGUsIHN0cmluZywgU1RBVF9fV1JJVEUpOwotICAgICAgaWYgKGhhc2hfZm91bmQpCi0JewotCSAgcmV0dmFsID0gImV4aXN0cyI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGVudHJ5LT5oYXNoX3ZhbHVlID0gdmFsdWU7Ci0JICBlbnRyeS0+aGFzaF9zdHJpbmcgPSBzdHJpbmc7Ci0JICBoYW5kbGUtPmhhc2hfc3RhdFtTVEFUX1VTRURdICs9IDE7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQwKLS8qCi0gKiAgICAgICAgICAgICAgIGggYSBzIGggXyBqIGEgbSAoICkKLSAqCi0gKiBSZWdhcmRsZXNzIG9mIHdoYXQgd2FzIGluIHRoZSBzeW1ib2wgdGFibGUgYmVmb3JlLCBhZnRlciBoYXNoX2phbSgpCi0gKiB0aGUgbmFtZWQgc3ltYm9sIGhhcyB0aGUgZ2l2ZW4gdmFsdWUuIFRoZSBzeW1ib2wgaXMgZWl0aGVyIGluc2VydGVkIG9yCi0gKiAoaXRzIHZhbHVlIGlzKSByZXBsYWNlZC4KLSAqIEFuIGVycm9yIG1lc3NhZ2Ugc3RyaW5nIGlzIHJldHVybmVkLCAwIG1lYW5zIE9LLgotICoKLSAqIFdBUk5JTkc6IHRoaXMgbWF5IGRlY2lkZSB0byBncm93IHRoZSBoYXNoZWQgc3ltYm9sIHRhYmxlLgotICogVG8gZG8gdGhpcywgd2UgY2FsbCBoYXNoX2dyb3coKSwgV0hJQ0ggV0lMTCByZWN1cnNpdmVseSBDQUxMIFVTLgotICoKLSAqIFdlIHJlcG9ydCBzdGF0dXMgaW50ZXJuYWxseTogaGFzaF9mb3VuZCBpcyBUUlVFIGlmIHdlIHJlcGxhY2VkLCBidXQKLSAqIGZhbHNlIGlmIHdlIGluc2VydGVkLgotICovCi1jb25zdCBjaGFyICoKLWhhc2hfamFtIChoYW5kbGUsIHN0cmluZywgdmFsdWUpCi0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBQVFIgdmFsdWU7Ci17Ci0gIGNvbnN0IGNoYXIgKnJldHZhbDsKLSAgc3RydWN0IGhhc2hfZW50cnkgKmVudHJ5OwotCi0gIHJldHZhbCA9IDA7Ci0gIGlmIChoYW5kbGUtPmhhc2hfc3RhdFtTVEFUX1VTRURdID4gaGFuZGxlLT5oYXNoX2Z1bGwpCi0gICAgewotICAgICAgcmV0dmFsID0gaGFzaF9ncm93IChoYW5kbGUpOwotICAgIH0KLSAgaWYgKCFyZXR2YWwpCi0gICAgewotICAgICAgZW50cnkgPSBoYXNoX2FzayAoaGFuZGxlLCBzdHJpbmcsIFNUQVRfX1dSSVRFKTsKLSAgICAgIGlmICghaGFzaF9mb3VuZCkKLQl7Ci0JICBlbnRyeS0+aGFzaF9zdHJpbmcgPSBzdHJpbmc7Ci0JICBoYW5kbGUtPmhhc2hfc3RhdFtTVEFUX1VTRURdICs9IDE7Ci0JfQotICAgICAgZW50cnktPmhhc2hfdmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qCi0gKiAgICAgICAgICAgICAgIGggYSBzIGggXyBnIHIgbyB3ICggKQotICoKLSAqIEdyb3cgYSBuZXcgKGJpZ2dlcikgaGFzaCB0YWJsZSBmcm9tIHRoZSBvbGQgb25lLgotICogV2UgY2hvb3NlIHRvIGRvdWJsZSB0aGUgaGFzaCB0YWJsZSdzIHNpemUuCi0gKiBSZXR1cm4gYSBodW1hbi1zY3J1dGlibGUgZXJyb3Igc3RyaW5nOiAwIGlmIE9LLgotICogV2FybmluZyEgVGhpcyB1c2VzIGhhc2hfamFtKCksIHdoaWNoIGhhZCBiZXR0ZXIgbm90IHJlY3Vyc2UKLSAqIGJhY2sgaGVyZSEgSGFzaF9qYW0oKSBjb25kaXRpb25hbGx5IGNhbGxzIHVzLCBidXQgd2UgQUxXQVlTCi0gKiBjYWxsIGhhc2hfamFtKCkhCi0gKiBJbnRlcm5hbC4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotaGFzaF9ncm93IChoYW5kbGUpCQkvKiBtYWtlIGEgaGFzaCB0YWJsZSBncm93ICovCi0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhbmRsZTsKLXsKLSAgc3RydWN0IGhhc2hfZW50cnkgKm5ld3dhbGw7Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICpuZXd3aGVyZTsKLSAgc3RydWN0IGhhc2hfZW50cnkgKm5ld3RyYWNrOwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqb2xkdHJhY2s7Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICpvbGR3aGVyZTsKLSAgc3RydWN0IGhhc2hfZW50cnkgKm9sZHdhbGw7Ci0gIGludCB0ZW1wOwotICBpbnQgbmV3c2l6ZTsKLSAgY29uc3QgY2hhciAqc3RyaW5nOwotICBjb25zdCBjaGFyICpyZXR2YWw7Ci0jaWZkZWYgU1VTUEVDVAotICBpbnQgb2xkdXNlZDsKLSNlbmRpZgotCi0gIC8qCi0gICAqIGNhcHR1cmUgaW5mbyBhYm91dCBvbGQgaGFzaCB0YWJsZQotICAgKi8KLSAgb2xkd2hlcmUgPSBoYW5kbGUtPmhhc2hfd2hlcmU7Ci0gIG9sZHdhbGwgPSBoYW5kbGUtPmhhc2hfd2FsbDsKLSNpZmRlZiBTVVNQRUNUCi0gIG9sZHVzZWQgPSBoYW5kbGUtPmhhc2hfc3RhdFtTVEFUX1VTRURdOwotI2VuZGlmCi0gIC8qCi0gICAqIGF0dGVtcHQgdG8gZ2V0IGVub3VnaCByb29tIGZvciBhIGhhc2ggdGFibGUgdHdpY2UgYXMgYmlnCi0gICAqLwotICB0ZW1wID0gaGFuZGxlLT5oYXNoX3N0YXRbU1RBVF9TSVpFXTsKLSAgbmV3d2hlcmUgPSAoKHN0cnVjdCBoYXNoX2VudHJ5ICopCi0JICAgICAgeG1hbGxvYyAoKHVuc2lnbmVkIGxvbmcpICgodGVtcCA8PCAoR1JPV19GQUNUT1IgKyAxKSkKLQkJCQkJLyogKzEgZm9yIHdhbGwgc2xvdCAqLwotCQkJCQkqIHNpemVvZiAoc3RydWN0IGhhc2hfZW50cnkpKSkpOwotICBpZiAobmV3d2hlcmUgPT0gTlVMTCkKLSAgICByZXR1cm4gIm5vX3Jvb20iOwotCi0gIC8qCi0gICAqIGhhdmUgZW5vdWdoIHJvb206IG5vdyB3ZSBkbyBhbGwgdGhlIHdvcmsuCi0gICAqIGRvdWJsZSB0aGUgc2l6ZSBvZiBldmVyeXRoaW5nIGluIGhhbmRsZS4KLSAgICovCi0gIGhhbmRsZS0+aGFzaF9tYXNrID0gKChoYW5kbGUtPmhhc2hfbWFzayArIDEpIDw8IEdST1dfRkFDVE9SKSAtIDE7Ci0gIGhhbmRsZS0+aGFzaF9zdGF0W1NUQVRfU0laRV0gPDw9IEdST1dfRkFDVE9SOwotICBuZXdzaXplID0gaGFuZGxlLT5oYXNoX3N0YXRbU1RBVF9TSVpFXTsKLSAgaGFuZGxlLT5oYXNoX3doZXJlID0gbmV3d2hlcmU7Ci0gIGhhbmRsZS0+aGFzaF9mdWxsIDw8PSBHUk9XX0ZBQ1RPUjsKLSAgaGFuZGxlLT5oYXNoX3NpemVsb2cgKz0gR1JPV19GQUNUT1I7Ci0gIGhhbmRsZS0+aGFzaF93YWxsID0gbmV3d2FsbCA9IG5ld3doZXJlICsgbmV3c2l6ZTsKLSAgLyogU2V0IGFsbCB0aG9zZSBwZXNreSBuZXcgc2xvdHMgdG8gdmFjYW50LiAgKi8KLSAgZm9yIChuZXd0cmFjayA9IG5ld3doZXJlOyBuZXd0cmFjayA8PSBuZXd3YWxsOyBuZXd0cmFjaysrKQotICAgIG5ld3RyYWNrLT5oYXNoX3N0cmluZyA9IE5VTEw7Ci0gIC8qIFdlIHdpbGwgZG8gYSBzY2FuIG9mIHRoZSBvbGQgdGFibGUsIHRoZSBoYXJkIHdheSwgdXNpbmcgdGhlCi0gICAqIG5ldyBjb250cm9sIGJsb2NrIHRvIHJlLWluc2VydCB0aGUgZGF0YSBpbnRvIG5ldyBoYXNoIHRhYmxlLiAgKi8KLSAgaGFuZGxlLT5oYXNoX3N0YXRbU1RBVF9VU0VEXSA9IDA7Ci0gIGZvciAob2xkdHJhY2sgPSBvbGR3aGVyZTsgb2xkdHJhY2sgPCBvbGR3YWxsOyBvbGR0cmFjaysrKQotICAgIGlmICgoKHN0cmluZyA9IG9sZHRyYWNrLT5oYXNoX3N0cmluZykgIT0gTlVMTCkgJiYgc3RyaW5nICE9IERFTEVURUQpCi0gICAgICBpZiAoKHJldHZhbCA9IGhhc2hfamFtIChoYW5kbGUsIHN0cmluZywgb2xkdHJhY2stPmhhc2hfdmFsdWUpKSkKLQlyZXR1cm4gcmV0dmFsOwotCi0jaWZkZWYgU1VTUEVDVAotICBpZiAoaGFuZGxlLT5oYXNoX3N0YXRbU1RBVF9VU0VEXSAhPSBvbGR1c2VkKQotICAgIHJldHVybiAiaGFzaF91c2VkIjsKLSNlbmRpZgotCi0gIC8qIFdlIGhhdmUgYSBjb21wbGV0ZWx5IGZha2VkIHVwIGNvbnRyb2wgYmxvY2suCi0gICAgIFJldHVybiB0aGUgb2xkIGhhc2ggdGFibGUuICAqLwotICBmcmVlICgoY2hhciAqKSBvbGR3aGVyZSk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0MCi0jaWZkZWYgVEVTVAotLyoKLSAqICAgICAgICAgIGggYSBzIGggXyBhIHAgcCBsIHkgKCApCi0gKgotICogVXNlIHRoaXMgdG8gc2NhbiBlYWNoIGVudHJ5IGluIHN5bWJvbCB0YWJsZS4KLSAqIEZvciBlYWNoIHN5bWJvbCwgdGhpcyBjYWxscyAoYXBwbHlzKSBhIG5vbWluYXRlZCBmdW5jdGlvbiBzdXBwbHlpbmcgdGhlCi0gKiBzeW1ib2wncyB2YWx1ZSAoYW5kIHRoZSBzeW1ib2wncyBuYW1lKS4KLSAqIFRoZSBpZGVhIGlzIHlvdSB1c2UgdGhpcyB0byBkZXN0cm95IHdoYXRldmVyIGlzIGFzc29jaXRlZCB3aXRoCi0gKiBhbnkgdmFsdWVzIGluIHRoZSB0YWJsZSBCRUZPUkUgeW91IGRlc3Ryb3kgdGhlIHRhYmxlIHdpdGggaGFzaF9kaWUuCi0gKiBPZiBjb3Vyc2UsIHlvdSBjYW4gdXNlIGl0IGZvciBvdGhlciBqb2JzOyB3aGVuZXZlciB5b3UgbmVlZCB0bwotICogdmlzaXQgYWxsIGV4dGFudCBzeW1ib2xzIGluIHRoZSB0YWJsZS4KLSAqCi0gKiBXZSBjaG9vc2UgdG8gaGF2ZSBhIGNhbGwteW91LWJhY2sgaWRlYSBmb3IgdHdvIHJlYXNvbnM6Ci0gKiAgYXN0aGV0aWM6IGl0IGlzIGEgbmVhdGVyIGlkZWEgdG8gdXNlIGFwcGx5IHRoYW4gYW4gZXhwbGljaXQgbG9vcAotICogIHNlbnNpYmxlOiBpZiB3ZSBldmVyIGhhZCB0byBncm93IHRoZSBzeW1ib2wgdGFibGUgKGR1ZSB0byBpbnNlcnRpb25zKQotICogICAgICAgICAgICB0aGVuIHdlIHdvdWxkIGxvc2Ugb3VyIHBsYWNlIGluIHRoZSB0YWJsZSB3aGVuIHdlIHJlLWhhc2hlZAotICogICAgICAgICAgICBzeW1ib2xzIGludG8gdGhlIG5ldyB0YWJsZSBpbiBhIGRpZmZlcmVudCBvcmRlci4KLSAqCi0gKiBUaGUgb3JkZXIgc3ltYm9scyBhcmUgdmlzaXRlZCBkZXBlbmRzIGVudGlyZWx5IG9uIHRoZSBoYXNoaW5nIGZ1bmN0aW9uLgotICogV2hlbmV2ZXIgeW91IGluc2VydCBhIChzeW1ib2wsIHZhbHVlKSB5b3UgcmlzayBleHBhbmRpbmcgdGhlIHRhYmxlLiBJZgotICogeW91IGRvIGV4cGFuZCB0aGUgdGFibGUsIHRoZW4gdGhlIGhhc2hpbmcgZnVuY3Rpb24gV0lMTCBjaGFuZ2UsIHNvIHlvdQotICogTUlHSFQgZ2V0IGEgZGlmZmVyZW50IG9yZGVyIG9mIHN5bWJvbHMgdmlzaXRlZC4gSW4gb3RoZXIgd29yZHMsIGlmIHlvdQotICogd2FudCB0aGUgc2FtZSBvcmRlciBvZiB2aXNpdGluZyBzeW1ib2xzIGFzIHRoZSBsYXN0IHRpbWUgeW91IHVzZWQKLSAqIGhhc2hfYXBwbHkoKSB0aGVuIHlvdSBiZXR0ZXIgbm90IGhhdmUgZG9uZSBhbnkgaGFzaF9pbnNlcnQoKXMgb3IKLSAqIGhhc2hfamFtKClzIHNpbmNlIHRoZSBsYXN0IHRpbWUgeW91IHVzZWQgaGFzaF9hcHBseSgpLgotICoKLSAqIEluIGZ1dHVyZSB3ZSBtYXkgdXNlIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB5b3VyIG5vbWluYXRlZCBmdW5jdGlvbi4KLSAqIE9uZSBpZGVhIGlzIHRvIGFib3J0IHRoZSBzY2FuIGlmLCBhZnRlciBhcHBseWluZyB0aGUgZnVuY3Rpb24gdG8gYQotICogY2VydGFpbiBub2RlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIGNlcnRhaW4gY29kZS4KLSAqCi0gKiBUaGUgZnVuY3Rpb24geW91IHN1cHBseSBzaG91bGQgYmUgb2YgdGhlIGZvcm06Ci0gKiAgICAgIHZvaWQgbXlmdW5jdChzdHJpbmcsdmFsdWUpCi0gKiAgICAgICAgICAgICAgY2hhciAqIHN0cmluZzsgICAgICAgIHwqIHRoZSBzeW1ib2wncyBuYW1lICp8Ci0gKiAgICAgICAgICAgICAgY2hhciAqIHZhbHVlOyAgICAgICAgIHwqIHRoZSBzeW1ib2wncyB2YWx1ZSAqfAotICogICAgICB7Ci0gKiAgICAgICAgfCogLi4uICp8Ci0gKiAgICAgIH0KLSAqCi0gKi8KLXZvaWQKLWhhc2hfYXBwbHkgKGhhbmRsZSwgZnVuY3Rpb24pCi0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhbmRsZTsKLSAgICAgdm9pZCAoKmZ1bmN0aW9uKSAoKTsKLXsKLSAgc3RydWN0IGhhc2hfZW50cnkgKmVudHJ5OwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqd2FsbDsKLQotICB3YWxsID0gaGFuZGxlLT5oYXNoX3dhbGw7Ci0gIGZvciAoZW50cnkgPSBoYW5kbGUtPmhhc2hfd2hlcmU7IGVudHJ5IDwgd2FsbDsgZW50cnkrKykKLSAgICB7Ci0gICAgICBpZiAoaXNsaXZlIChlbnRyeSkpCS8qIHNpbGx5IGNvZGU6IHRlc3RzIGVudHJ5LT5zdHJpbmcgdHdpY2UhICovCi0JewotCSAgKCpmdW5jdGlvbikgKGVudHJ5LT5oYXNoX3N0cmluZywgZW50cnktPmhhc2hfdmFsdWUpOwotCX0KLSAgICB9Ci19Ci0jZW5kaWYKLQwKLS8qCi0gKiAgICAgICAgICBoIGEgcyBoIF8gZiBpIG4gZCAoICkKLSAqCi0gKiBHaXZlbiBzeW1ib2wgc3RyaW5nLCBmaW5kIHZhbHVlIChpZiBhbnkpLgotICogUmV0dXJuIGZvdW5kIHZhbHVlIG9yIE5VTEwuCi0gKi8KLVBUUgotaGFzaF9maW5kIChoYW5kbGUsIHN0cmluZykKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeTsKLQotICBlbnRyeSA9IGhhc2hfYXNrIChoYW5kbGUsIHN0cmluZywgU1RBVF9fUkVBRCk7Ci0gIGlmIChoYXNoX2ZvdW5kKQotICAgIHJldHVybiBlbnRyeS0+aGFzaF92YWx1ZTsKLSAgZWxzZQotICAgIHJldHVybiBOVUxMOwotfQotDAotLyoKLSAqICAgICAgICAgIGggYSBzIGggXyBhIHMgayAoICkKLSAqCi0gKiBTZWFyY2hlcyBmb3IgZ2l2ZW4gc3ltYm9sIHN0cmluZy4KLSAqIFJldHVybiB0aGUgc2xvdCB3aGVyZSBpdCBPVUdIVCB0byBsaXZlLiBJdCBtYXkgYmUgdGhlcmUuCi0gKiBSZXR1cm4gaGFzaF9mb3VuZDogVFJVRSBvbmx5IGlmIHN5bWJvbCBpcyBpbiB0aGF0IHNsb3QuCi0gKiBBY2Nlc3MgYXJndW1lbnQgaXMgdG8gaGVscCBrZWVwIHN0YXRpc3RpY3MgaW4gY29udHJvbCBibG9jay4KLSAqIEludGVybmFsLgotICovCi1zdGF0aWMgc3RydWN0IGhhc2hfZW50cnkgKgkvKiBzdHJpbmcgc2xvdCwgbWF5IGJlIGVtcHR5IG9yIGRlbGV0ZWQgKi8KLWhhc2hfYXNrIChoYW5kbGUsIHN0cmluZywgYWNjZXNzX3R5cGUpCi0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBpbnQgYWNjZXNzX3R5cGU7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICpzbG90OwotICBpbnQgY29sbGlzaW9uOwkvKiBjb3VudCBjb2xsaXNpb25zICovCi0gIGludCBzdHJjbXBzOwotICBpbnQgaGNvZGU7Ci0KLSAgLyogc3RhcnQgbG9va2luZyBoZXJlICovCi0gIGhjb2RlID0gaGFzaF9jb2RlIChoYW5kbGUsIHN0cmluZyk7Ci0gIHNsb3QgPSBoYW5kbGUtPmhhc2hfd2hlcmUgKyAoaGNvZGUgJiBoYW5kbGUtPmhhc2hfbWFzayk7Ci0KLSAgaGFuZGxlLT5oYXNoX3N0YXRbU1RBVF9BQ0NFU1MgKyBhY2Nlc3NfdHlwZV0gKz0gMTsKLSAgY29sbGlzaW9uID0gc3RyY21wcyA9IDA7Ci0gIGhhc2hfZm91bmQgPSBGQUxTRTsKLSAgd2hpbGUgKCgocyA9IHNsb3QtPmhhc2hfc3RyaW5nKSAhPSBOVUxMKSAmJiBzICE9IERFTEVURUQpCi0gICAgewotICAgICAgaWYgKHN0cmluZyA9PSBzKQotCXsKLQkgIGhhc2hfZm91bmQgPSBUUlVFOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKHNsb3QtPmggPT0gKHVuc2lnbmVkIGxvbmcpIGhjb2RlKQotCXsKLQkgIGlmICghc3RyY21wIChzdHJpbmcsIHMpKQotCSAgICB7Ci0JICAgICAgaGFzaF9mb3VuZCA9IFRSVUU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHN0cmNtcHMrKzsKLQl9Ci0gICAgICBjb2xsaXNpb24rKzsKLSAgICAgIHNsb3QrKzsKLSAgICB9Ci0gIC8qCi0gICAqIHNsb3Q6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOgotICAgKiAgICAgICBpbiB1c2U6ICAgICB3ZSBmb3VuZCBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90Ci0gICAqICAgICAgIGF0IGVtcHR5OgotICAgKiAgICAgICAgICAgICAgICAgICBhdCB3YWxsOiAgICAgICAgd2UgZmVsbCBvZmY6IHdyYXAgcm91bmQgICA/Pz8/Ci0gICAqICAgICAgICAgICAgICAgICAgIGluIHRhYmxlOiAgICAgICBkaWcgaGVyZSAgICAgICAgICAgICAgICAgIHNsb3QKLSAgICogICAgICAgYXQgREVMRVRFRDogZGlnIGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdAotICAgKi8KLSAgaWYgKHNsb3QgPT0gaGFuZGxlLT5oYXNoX3dhbGwpCi0gICAgewotICAgICAgc2xvdCA9IGhhbmRsZS0+aGFzaF93aGVyZTsvKiBub3cgbG9vayBhZ2FpbiAqLwotICAgICAgd2hpbGUgKCgocyA9IHNsb3QtPmhhc2hfc3RyaW5nKSAhPSBOVUxMKSAmJiBzICE9IERFTEVURUQpCi0JewotCSAgaWYgKHN0cmluZyA9PSBzKQotCSAgICB7Ci0JICAgICAgaGFzaF9mb3VuZCA9IFRSVUU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlmIChzbG90LT5oID09ICh1bnNpZ25lZCBsb25nKSBoY29kZSkKLQkgICAgewotCSAgICAgIGlmICghc3RyY21wIChzdHJpbmcsIHMpKQotCQl7Ci0JCSAgaGFzaF9mb3VuZCA9IFRSVUU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBzdHJjbXBzKys7Ci0JICAgIH0KLQkgIGNvbGxpc2lvbisrOwotCSAgc2xvdCsrOwotCX0KLSAgICAgIC8qCi0gICAgICAgKiBzbG90OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjoKLSAgICAgICAqICAgICAgIGluIHVzZTogd2UgZm91bmQgaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QKLSAgICAgICAqICAgICAgIGVtcHR5OiAgd2FsbDogICAgICAgICBFUlJPUiBJTVBPU1NJQkxFICAgICAgICAgICAgICEhISEKLSAgICAgICAqICAgICAgICAgICAgICAgaW4gdGFibGU6ICAgICBkaWcgaGVyZSAgICAgICAgICAgICAgICAgICAgIHNsb3QKLSAgICAgICAqICAgICAgIERFTEVURUQ6ZGlnIGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QKLSAgICAgICAqLwotICAgIH0KLSAgaGFuZGxlLT5oYXNoX3N0YXRbU1RBVF9DT0xMSURFICsgYWNjZXNzX3R5cGVdICs9IGNvbGxpc2lvbjsKLSAgaGFuZGxlLT5oYXNoX3N0YXRbU1RBVF9TVFJDTVAgKyBhY2Nlc3NfdHlwZV0gKz0gc3RyY21wczsKLSAgaWYgKCFoYXNoX2ZvdW5kKQotICAgIHNsb3QtPmggPSBoY29kZTsKLSAgcmV0dXJuIHNsb3Q7CQkJLyogYWxzbyByZXR1cm4gaGFzaF9mb3VuZCAqLwotfQotDAotLyoKLSAqICAgICAgICAgICBoIGEgcyBoIF8gYyBvIGQgZQotICoKLSAqIERvZXMgaGFzaGluZyBvZiBzeW1ib2wgc3RyaW5nIHRvIGhhc2ggbnVtYmVyLgotICogSW50ZXJuYWwuCi0gKi8KLXN0YXRpYyBpbnQKLWhhc2hfY29kZSAoaGFuZGxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotI2lmIDEgLyogVGhlcmUgc2VlbXMgdG8gYmUgc29tZSBpbnRlcmVzdGluZyBwcm9wZXJ0eSBvZiB0aGlzIGZ1bmN0aW9uCi0JIHRoYXQgcHJldmVudHMgdGhlIGJmZCB2ZXJzaW9uIGJlbG93IGZyb20gYmVpbmcgYW4gYWRlcXVhdGUKLQkgc3Vic3RpdHV0ZS4gIEBAIEZpZ3VyZSBvdXQgd2hhdCB0aGlzIHByb3BlcnR5IGlzISAgKi8KLSAgbG9uZyBoOwkJLyogaGFzaCBjb2RlIGJ1aWx0IGhlcmUgKi8KLSAgbG9uZyBjOwkJLyogZWFjaCBjaGFyYWN0ZXIgbGFuZHMgaGVyZSAqLwotICBpbnQgbjsJCS8qIEFtb3VudCB0byBzaGlmdCBoIGJ5ICovCi0KLSAgbiA9IChoYW5kbGUtPmhhc2hfc2l6ZWxvZyAtIDMpOwotICBoID0gMDsKLSAgd2hpbGUgKChjID0gKnN0cmluZysrKSAhPSAwKQotICAgIHsKLSAgICAgIGggKz0gYzsKLSAgICAgIGggPSAoaCA8PCAzKSArIChoID4+IG4pICsgYzsKLSAgICB9Ci0gIHJldHVybiBoOwotI2Vsc2UKLSAgLyogZnJvbSBiZmQgKi8KLSAgdW5zaWduZWQgbG9uZyBoID0gMDsKLSAgdW5zaWduZWQgaW50IGxlbiA9IDA7Ci0gIHVuc2lnbmVkIGludCBjOwotCi0gIHdoaWxlICgoYyA9ICpzdHJpbmcrKykgIT0gMCkKLSAgICB7Ci0gICAgICBoICs9IGMgKyAoYyA8PCAxNyk7Ci0gICAgICBoIF49IGggPj4gMjsKLSAgICAgICsrbGVuOwotICAgIH0KLSAgaCArPSBsZW4gKyAobGVuIDw8IDE3KTsKLSAgaCBePSBoID4+IDI7Ci0gIHJldHVybiBoOwotI2VuZGlmCi19Ci0MCi12b2lkCi1oYXNoX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUsIG5hbWUsIGgpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmg7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgc3osIHVzZWQsIHBjdDsKLQotICBpZiAoaCA9PSAwKQotICAgIHJldHVybjsKLQotICBzeiA9IGgtPmhhc2hfc3RhdFtTVEFUX1NJWkVdOwotICB1c2VkID0gaC0+aGFzaF9zdGF0W1NUQVRfVVNFRF07Ci0gIHBjdCA9ICh1c2VkICogMTAwICsgc3ogLyAyKSAvIHN6OwotCi0gIGZwcmludGYgKGZpbGUsICIlcyBoYXNoIHN0YXRpc3RpY3M6XG5cdCVsdS8lbHUgc2xvdHMgdXNlZCAoJWx1JSUpXG4iLAotCSAgIG5hbWUsIHVzZWQsIHN6LCBwY3QpOwotCi0jZGVmaW5lIFAobmFtZSwgb2ZmKQkJCQkJCQlcCi0gIGZwcmludGYgKGZpbGUsICJcdCUtMTZzICU2ZHIgKyAlNmR3ID0gJTdkXG4iLCBuYW1lLAkJCVwKLQkgICBoLT5oYXNoX3N0YXRbb2ZmK1NUQVRfX1JFQURdLAkJCQlcCi0JICAgaC0+aGFzaF9zdGF0W29mZitTVEFUX19XUklURV0sCQkJCVwKLQkgICBoLT5oYXNoX3N0YXRbb2ZmK1NUQVRfX1JFQURdICsgaC0+aGFzaF9zdGF0W29mZitTVEFUX19XUklURV0pCi0KLSAgUCAoImFjY2Vzc2VzOiIsIFNUQVRfQUNDRVNTKTsKLSAgUCAoImNvbGxpc2lvbnM6IiwgU1RBVF9DT0xMSURFKTsKLSAgUCAoInN0cmluZyBjb21wYXJlczoiLCBTVEFUX1NUUkNNUCk7Ci0KLSN1bmRlZiBQCi19Ci0MCi0vKgotICogSGVyZSBpcyBhIHRlc3QgcHJvZ3JhbSB0byBleGVyY2lzZSBhYm92ZS4KLSAqLwotI2lmZGVmIFRFU1QKLQotI2RlZmluZSBUQUJMRVMgKDYpCQkvKiBudW1iZXIgb2YgaGFzaCB0YWJsZXMgdG8gbWFpbnRhaW4gKi8KLS8qIChhdCBvbmNlKSBpbiBhbnkgdGVzdGluZyAqLwotI2RlZmluZSBTVEFUQlVGU0laRSAoMTIpCS8qIHdlIGNhbiBoYXZlIDEyIHN0YXRpc3RpY3MgKi8KLQotaW50IHN0YXRidWZbU1RBVEJVRlNJWkVdOwkvKiBkaXNwbGF5IHN0YXRpc3RpY3MgaGVyZSAqLwotY2hhciBhbnN3ZXJbMTAwXTsJCS8qIGh1bWFuIGZhcnRzIGhlcmUgKi8KLWNoYXIgKmhhc2h0YWJsZVtUQUJMRVNdOwkvKiB3ZSB0ZXN0IG1hbnkgaGFzaCB0YWJsZXMgYXQgb25jZSAqLwotY2hhciAqaDsJCQkvKiBwb2ludHMgdG8gY3VyZW50IGhhc2hfY29udHJvbCAqLwotY2hhciAqKnBwOwotY2hhciAqcDsKLWNoYXIgKm5hbWU7Ci1jaGFyICp2YWx1ZTsKLWludCBzaXplOwotaW50IHVzZWQ7Ci1jaGFyIGNvbW1hbmQ7Ci1pbnQgbnVtYmVyOwkJCS8qIG51bWJlciAwOlRBQkxFUy0xIG9mIGN1cnJlbnQgaGFzaGVkICovCi0vKiBzeW1ib2wgdGFibGUgKi8KLQotbWFpbiAoKQotewotICB2b2lkIGFwcGxpY2F0ZWUgKCk7Ci0gIHZvaWQgZGVzdHJveSAoKTsKLSAgY2hhciAqd2hhdCAoKTsKLSAgaW50ICppcDsKLQotICBudW1iZXIgPSAwOwotICBoID0gMDsKLSAgcHJpbnRmICgidHlwZSBoIDxSRVRVUk4+IGZvciBoZWxwXG4iKTsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBwcmludGYgKCJoYXNoX3Rlc3QgY29tbWFuZDogIik7Ci0gICAgICBnZXRzIChhbnN3ZXIpOwotICAgICAgY29tbWFuZCA9IGFuc3dlclswXTsKLSAgICAgIGlmIChpc3VwcGVyIChjb21tYW5kKSkKLQljb21tYW5kID0gdG9sb3dlciAoY29tbWFuZCk7CS8qIGVjY2ghICovCi0gICAgICBzd2l0Y2ggKGNvbW1hbmQpCi0JewotCWNhc2UgJyMnOgotCSAgcHJpbnRmICgib2xkIGhhc2ggdGFibGUgIz0lZC5cbiIsIG51bWJlcik7Ci0JICB3aGF0dGFibGUgKCk7Ci0JICBicmVhazsKLQljYXNlICc/JzoKLQkgIGZvciAocHAgPSBoYXNodGFibGU7IHBwIDwgaGFzaHRhYmxlICsgVEFCTEVTOyBwcCsrKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiYWRkcmVzcyBvZiBoYXNoIHRhYmxlICMlZCBjb250cm9sIGJsb2NrIGlzICV4eFxuIgotCQkgICAgICAscHAgLSBoYXNodGFibGUsICpwcCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ2EnOgotCSAgaGFzaF9hcHBseSAoaCwgYXBwbGljYXRlZSk7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGhhc2hfYXBwbHkgKGgsIGRlc3Ryb3kpOwotCSAgaGFzaF9kaWUgKGgpOwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICBwID0gaGFzaF9maW5kIChoLCBuYW1lID0gd2hhdCAoInN5bWJvbCIpKTsKLQkgIHByaW50ZiAoInZhbHVlIG9mIFwiJXNcIiBpcyBcIiVzXCJcbiIsIG5hbWUsIHAgPyBwIDogIk5PVC1QUkVTRU5UIik7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIHByaW50ZiAoIiMgc2hvdyBvbGQsIHNlbGVjdCBuZXcgZGVmYXVsdCBoYXNoIHRhYmxlIG51bWJlclxuIik7Ci0JICBwcmludGYgKCI/IGRpc3BsYXkgYWxsIGhhc2h0YWJsZSBjb250cm9sIGJsb2NrIGFkZHJlc3Nlc1xuIik7Ci0JICBwcmludGYgKCJhIGFwcGx5IGEgc2ltcGxlIGRpc3BsYXktZXIgdG8gZWFjaCBzeW1ib2wgaW4gdGFibGVcbiIpOwotCSAgcHJpbnRmICgiZCBkaWU6IGRlc3Ryb3kgaGFzaHRhYmxlXG4iKTsKLQkgIHByaW50ZiAoImYgZmluZCB2YWx1ZSBvZiBub21pbmF0ZWQgc3ltYm9sXG4iKTsKLQkgIHByaW50ZiAoImggdGhpcyBoZWxwXG4iKTsKLQkgIHByaW50ZiAoImkgaW5zZXJ0IHZhbHVlIGludG8gc3ltYm9sXG4iKTsKLQkgIHByaW50ZiAoImogamFtIHZhbHVlIGludG8gc3ltYm9sXG4iKTsKLQkgIHByaW50ZiAoIm4gbmV3IGhhc2h0YWJsZVxuIik7Ci0JICBwcmludGYgKCJyIHJlcGxhY2UgYSB2YWx1ZSB3aXRoIGFub3RoZXJcbiIpOwotCSAgcHJpbnRmICgicyBzYXkgd2hhdCAlJSBvZiB0YWJsZSBpcyB1c2VkXG4iKTsKLQkgIHByaW50ZiAoInEgZXhpdCB0aGlzIHByb2dyYW1cbiIpOwotCSAgcHJpbnRmICgieCBkZWxldGUgYSBzeW1ib2wgZnJvbSB0YWJsZSwgcmVwb3J0IGl0cyB2YWx1ZVxuIik7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQkgIHAgPSBoYXNoX2luc2VydCAoaCwgbmFtZSA9IHdoYXQgKCJzeW1ib2wiKSwgdmFsdWUgPSB3aGF0ICgidmFsdWUiKSk7Ci0JICBpZiAocCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoInN5bWJvbD1cIiVzXCIgIHZhbHVlPVwiJXNcIiAgZXJyb3I9JXNcbiIsIG5hbWUsIHZhbHVlLAotCQkgICAgICBwKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAnaic6Ci0JICBwID0gaGFzaF9qYW0gKGgsIG5hbWUgPSB3aGF0ICgic3ltYm9sIiksIHZhbHVlID0gd2hhdCAoInZhbHVlIikpOwotCSAgaWYgKHApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJzeW1ib2w9XCIlc1wiICB2YWx1ZT1cIiVzXCIgIGVycm9yPSVzXG4iLCBuYW1lLCB2YWx1ZSwgcCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ24nOgotCSAgaCA9IGhhc2h0YWJsZVtudW1iZXJdID0gKGNoYXIgKikgaGFzaF9uZXcgKCk7Ci0JICBicmVhazsKLQljYXNlICdxJzoKLQkgIGV4aXQgKEVYSVRfU1VDQ0VTUyk7Ci0JY2FzZSAncic6Ci0JICBwID0gaGFzaF9yZXBsYWNlIChoLCBuYW1lID0gd2hhdCAoInN5bWJvbCIpLCB2YWx1ZSA9IHdoYXQgKCJ2YWx1ZSIpKTsKLQkgIHByaW50ZiAoIm9sZCB2YWx1ZSB3YXMgXCIlc1wiXG4iLCBwID8gcCA6ICJ7fSIpOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBoYXNoX3NheSAoaCwgc3RhdGJ1ZiwgU1RBVEJVRlNJWkUpOwotCSAgZm9yIChpcCA9IHN0YXRidWY7IGlwIDwgc3RhdGJ1ZiArIFNUQVRCVUZTSVpFOyBpcCsrKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiJWQgIiwgKmlwKTsKLQkgICAgfQotCSAgcHJpbnRmICgiXG4iKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgcCA9IGhhc2hfZGVsZXRlIChoLCBuYW1lID0gd2hhdCAoInN5bWJvbCIpKTsKLQkgIHByaW50ZiAoIm9sZCB2YWx1ZSB3YXMgXCIlc1wiXG4iLCBwID8gcCA6ICJ7fSIpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHByaW50ZiAoIkkgY2FuJ3QgdW5kZXJzdGFuZCBjb21tYW5kIFwiJWNcIlxuIiwgY29tbWFuZCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi1jaGFyICoKLXdoYXQgKGRlc2NyaXB0aW9uKQotICAgICBjaGFyICpkZXNjcmlwdGlvbjsKLXsKLSAgY2hhciAqcmV0dmFsOwotICBjaGFyICptYWxsb2MgKCk7Ci0KLSAgcHJpbnRmICgiICAgJXMgOiAiLCBkZXNjcmlwdGlvbik7Ci0gIGdldHMgKGFuc3dlcik7Ci0gIC8qIHdpbGwgb25lIGRheSBjbGVhbiB1cCBhbnN3ZXIgaGVyZSAqLwotICByZXR2YWwgPSBtYWxsb2MgKHN0cmxlbiAoYW5zd2VyKSArIDEpOwotICBpZiAoIXJldHZhbCkKLSAgICB7Ci0gICAgICBlcnJvciAoInJvb20iKTsKLSAgICB9Ci0gICh2b2lkKSBzdHJjcHkgKHJldHZhbCwgYW5zd2VyKTsKLSAgcmV0dXJuIChyZXR2YWwpOwotfQotCi12b2lkCi1kZXN0cm95IChzdHJpbmcsIHZhbHVlKQotICAgICBjaGFyICpzdHJpbmc7Ci0gICAgIGNoYXIgKnZhbHVlOwotewotICBmcmVlIChzdHJpbmcpOwotICBmcmVlICh2YWx1ZSk7Ci19Ci0KLQotdm9pZAotYXBwbGljYXRlZSAoc3RyaW5nLCB2YWx1ZSkKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBjaGFyICp2YWx1ZTsKLXsKLSAgcHJpbnRmICgiJS4yMHMtJS4yMHNcbiIsIHN0cmluZywgdmFsdWUpOwotfQotCi13aGF0dGFibGUgKCkJCQkvKiBkZXRlcm1pbmUgbnVtYmVyOiB3aGF0IGhhc2ggdGFibGUgdG8gdXNlICovCi0gICAgIC8qIGFsc28gZGV0ZXJtaW5lIGg6IHBvaW50cyB0byBoYXNoX2NvbnRyb2wgKi8KLXsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAgIHdoYXQgaGFzaCB0YWJsZSAoJWQ6JWQpID8gICIsIDAsIFRBQkxFUyAtIDEpOwotICAgICAgZ2V0cyAoYW5zd2VyKTsKLSAgICAgIHNzY2FuZiAoYW5zd2VyLCAiJWQiLCAmbnVtYmVyKTsKLSAgICAgIGlmIChudW1iZXIgPj0gMCAmJiBudW1iZXIgPCBUQUJMRVMpCi0JewotCSAgaCA9IGhhc2h0YWJsZVtudW1iZXJdOwotCSAgaWYgKCFoKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgid2FybmluZzogY3VycmVudCBoYXNoLXRhYmxlLSMlZC4gaGFzIG5vIGhhc2gtY29udHJvbFxuIiwgbnVtYmVyKTsKLQkgICAgfQotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCJpbnZhbGlkIGhhc2ggdGFibGUgbnVtYmVyOiAlZFxuIiwgbnVtYmVyKTsKLQl9Ci0gICAgfQotfQotCi0KLQotI2VuZGlmIC8qICNpZmRlZiBURVNUICovCi0KLS8qIGVuZCBvZiBoYXNoLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9oYXNoLmggYi9nYXMvaGFzaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGViMzQ3Li4wMDAwMDAwCi0tLSBhL2dhcy9oYXNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiBoYXNoLmggLSBmb3IgaGFzaC5jCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBoYXNoSAotI2RlZmluZSBoYXNoSAotCi1zdHJ1Y3QgaGFzaF9jb250cm9sOwotCi0vKiByZXR1cm5zIGNvbnRyb2wgYmxvY2sgKi8KLXN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhc2hfbmV3IFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgaGFzaF9kaWUgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqKSk7Ci0vKiByZXR1cm5zIHByZXZpb3VzIHZhbHVlICovCi1QVFIgaGFzaF9kZWxldGUgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICpzdHIpKTsKLS8qIHJldHVybnMgcHJldmlvdXMgdmFsdWUgKi8KLVBUUiBoYXNoX3JlcGxhY2UgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICpzdHIsIFBUUiB2YWwpKTsKLS8qIHJldHVybnMgZXJyb3Igc3RyaW5nIG9yIG51bGwgKi8KLWNvbnN0IGNoYXIgKmhhc2hfaW5zZXJ0IFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqc3RyLAotCQkJCSBQVFIgdmFsKSk7Ci0vKiByZXR1cm5zIHZhbHVlICovCi1QVFIgaGFzaF9maW5kIFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqc3RyKSk7Ci0vKiByZXR1cm5zIGVycm9yIHRleHQgb3IgbnVsbCAoaW50ZXJuYWwpICovCi1jb25zdCBjaGFyICpoYXNoX2phbSBQQVJBTVMgKChzdHJ1Y3QgaGFzaF9jb250cm9sICosIGNvbnN0IGNoYXIgKnN0ciwKLQkJCSAgICAgIFBUUiB2YWwpKTsKLQotdm9pZCBoYXNoX3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoRklMRSAqLCBjb25zdCBjaGFyICosCi0JCQkJICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKikpOwotI2VuZGlmIC8qICNpZmRlZiBoYXNoSCAqLwotCi0vKiBlbmQgb2YgaGFzaC5oICovCmRpZmYgLS1naXQgYS9nYXMvaW5wdXQtZmlsZS5jIGIvZ2FzL2lucHV0LWZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzZjdjOS4uMDAwMDAwMAotLS0gYS9nYXMvaW5wdXQtZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qIGlucHV0X2ZpbGUuYyAtIERlYWwgd2l0aCBJbnB1dCBGaWxlcyAtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIENvbmZpbmVzIGFsbCBkZXRhaWxzIG9mIHJlYWRpbmcgc291cmNlIGJ5dGVzIHRvIHRoaXMgbW9kdWxlLgotICogQWxsIE8vUyBzcGVjaWZpYyBjcm9ja3Mgc2hvdWxkIGxpdmUgaGVyZS4KLSAqIFdoYXQgd2UgbG9zZSBpbiAiZWZmaWNpZW5jeSIgd2UgZ2FpbiBpbiBtb2R1bGFyaXR5LgotICogTm90ZSB3ZSBkb24ndCBuZWVkIHRvICNpbmNsdWRlIHRoZSAiYXMuaCIgZmlsZS4gTm8gY29tbW9uIGNvdXBsaW5nIQotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJpbnB1dC1maWxlLmgiCi0KLXN0YXRpYyBpbnQgaW5wdXRfZmlsZV9nZXQgUEFSQU1TICgoY2hhciAqKikpOwotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIG5vbi16ZXJvIGlmIHRoZSBmaWxlIGN1cnJlbnRseSBiZWluZyByZWFkIHNob3VsZCBiZQotICAgcHJlcHJvY2Vzc2VkIGJ5IGFwcC4gIEl0IGlzIHplcm8gaWYgdGhlIGZpbGUgY2FuIGJlIHJlYWQgc3RyYWlnaHQgaW4uCi0gICAqLwotaW50IHByZXByb2Nlc3MgPSAwOwotCi0vKgotICogVGhpcyBjb2RlIG9wZW5zIGEgZmlsZSwgdGhlbiBkZWxpdmVycyBCVUZGRVJfU0laRSBjaGFyYWN0ZXIKLSAqIGNodW5rcyBvZiB0aGUgZmlsZSBvbiBkZW1hbmQuCi0gKiBCVUZGRVJfU0laRSBpcyBzdXBwb3NlZCB0byBiZSBhIG51bWJlciBjaG9zZW4gZm9yIHNwZWVkLgotICogVGhlIGNhbGxlciBvbmx5IGFza3Mgb25jZSB3aGF0IEJVRkZFUl9TSVpFIGlzLCBhbmQgYXNrcyBiZWZvcmUKLSAqIHRoZSBuYXR1cmUgb2YgdGhlIGlucHV0IGZpbGVzIChpZiBhbnkpIGlzIGtub3duLgotICovCi0KLSNkZWZpbmUgQlVGRkVSX1NJWkUgKDMyICogMTAyNCkKLQotLyoKLSAqIFdlIHVzZSBzdGF0aWMgZGF0YTogdGhlIGRhdGEgYXJlYSBpcyBub3Qgc2hhcmFibGUuCi0gKi8KLQotc3RhdGljIEZJTEUgKmZfaW47Ci1zdGF0aWMgY2hhciAqZmlsZV9uYW1lOwotCi0vKiBTdHJ1Y3QgZm9yIHNhdmluZyB0aGUgc3RhdGUgb2YgdGhpcyBtb2R1bGUgZm9yIGZpbGUgaW5jbHVkZXMuICAqLwotc3RydWN0IHNhdmVkX2ZpbGUKLSAgewotICAgIEZJTEUgKmZfaW47Ci0gICAgY2hhciAqZmlsZV9uYW1lOwotICAgIGludCBwcmVwcm9jZXNzOwotICAgIGNoYXIgKmFwcF9zYXZlOwotICB9OwotDAotLyogVGhlc2UgaG9va3MgYWNjb21vZGF0ZSBtb3N0IG9wZXJhdGluZyBzeXN0ZW1zLiAqLwotCi12b2lkIAotaW5wdXRfZmlsZV9iZWdpbiAoKQotewotICBmX2luID0gKEZJTEUgKikgMDsKLX0KLQotdm9pZCAKLWlucHV0X2ZpbGVfZW5kICgpCi17Ci19Ci0KLS8qIFJldHVybiBCVUZGRVJfU0laRS4gKi8KLXVuc2lnbmVkIGludCAKLWlucHV0X2ZpbGVfYnVmZmVyX3NpemUgKCkKLXsKLSAgcmV0dXJuIChCVUZGRVJfU0laRSk7Ci19Ci0KLWludCAKLWlucHV0X2ZpbGVfaXNfb3BlbiAoKQotewotICByZXR1cm4gZl9pbiAhPSAoRklMRSAqKSAwOwotfQotCi0vKiBQdXNoIHRoZSBzdGF0ZSBvZiBvdXIgaW5wdXQsIHJldHVybmluZyBhIHBvaW50ZXIgdG8gc2F2ZWQgaW5mbyB0aGF0Ci0gICBjYW4gYmUgcmVzdG9yZWQgd2l0aCBpbnB1dF9maWxlX3BvcCAoKS4gICovCi1jaGFyICoKLWlucHV0X2ZpbGVfcHVzaCAoKQotewotICByZWdpc3RlciBzdHJ1Y3Qgc2F2ZWRfZmlsZSAqc2F2ZWQ7Ci0KLSAgc2F2ZWQgPSAoc3RydWN0IHNhdmVkX2ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mICpzYXZlZCk7Ci0KLSAgc2F2ZWQtPmZfaW4gPSBmX2luOwotICBzYXZlZC0+ZmlsZV9uYW1lID0gZmlsZV9uYW1lOwotICBzYXZlZC0+cHJlcHJvY2VzcyA9IHByZXByb2Nlc3M7Ci0gIGlmIChwcmVwcm9jZXNzKQotICAgIHNhdmVkLT5hcHBfc2F2ZSA9IGFwcF9wdXNoICgpOwotCi0gIGlucHV0X2ZpbGVfYmVnaW4gKCk7CQkvKiBJbml0aWFsaXplIGZvciBuZXcgZmlsZSAqLwotCi0gIHJldHVybiAoY2hhciAqKSBzYXZlZDsKLX0KLQotdm9pZAotaW5wdXRfZmlsZV9wb3AgKGFyZykKLSAgICAgY2hhciAqYXJnOwotewotICByZWdpc3RlciBzdHJ1Y3Qgc2F2ZWRfZmlsZSAqc2F2ZWQgPSAoc3RydWN0IHNhdmVkX2ZpbGUgKikgYXJnOwotCi0gIGlucHV0X2ZpbGVfZW5kICgpOwkJLyogQ2xvc2Ugb3V0IG9sZCBmaWxlICovCi0KLSAgZl9pbiA9IHNhdmVkLT5mX2luOwotICBmaWxlX25hbWUgPSBzYXZlZC0+ZmlsZV9uYW1lOwotICBwcmVwcm9jZXNzID0gc2F2ZWQtPnByZXByb2Nlc3M7Ci0gIGlmIChwcmVwcm9jZXNzKQotICAgIGFwcF9wb3AgKHNhdmVkLT5hcHBfc2F2ZSk7Ci0KLSAgZnJlZSAoYXJnKTsKLX0KLQwKLXZvaWQKLWlucHV0X2ZpbGVfb3BlbiAoZmlsZW5hbWUsIHByZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7CQkvKiAiIiBtZWFucyB1c2Ugc3RkaW4uIE11c3Qgbm90IGJlIDAuICovCi0gICAgIGludCBwcmU7Ci17Ci0gIGludCBjOwotICBjaGFyIGJ1Zls4MF07Ci0KLSAgcHJlcHJvY2VzcyA9IHByZTsKLQotICBhc3NlcnQgKGZpbGVuYW1lICE9IDApOwkvKiBGaWxlbmFtZSBtYXkgbm90IGJlIE5VTEwuICovCi0gIGlmIChmaWxlbmFtZVswXSkKLSAgICB7CQkJCS8qIFdlIGhhdmUgYSBmaWxlIG5hbWUuIFN1Y2sgaXQgYW5kIHNlZS4gKi8KLSAgICAgIGZfaW4gPSBmb3BlbiAoZmlsZW5hbWUsICJyIik7Ci0gICAgICBmaWxlX25hbWUgPSBmaWxlbmFtZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7CQkJCS8qIHVzZSBzdGRpbiBmb3IgdGhlIGlucHV0IGZpbGUuICovCi0gICAgICBmX2luID0gc3RkaW47Ci0gICAgICBmaWxlX25hbWUgPSBfKCJ7c3RhbmRhcmQgaW5wdXR9Iik7CS8qIEZvciBlcnJvciBtZXNzYWdlcy4gKi8KLSAgICB9Ci0gIGlmIChmX2luID09IChGSUxFICopIDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJDYW4ndCBvcGVuICVzIGZvciByZWFkaW5nLiIpLCBmaWxlX25hbWUpOwotICAgICAgYXNfcGVycm9yICgiJXMiLCBmaWxlX25hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjID0gZ2V0YyAoZl9pbik7Ci0gIGlmIChjID09ICcjJykKLSAgICB7CQkJCS8qIEJlZ2lucyB3aXRoIGNvbW1lbnQsIG1heSBub3Qgd2FudCB0byBwcmVwcm9jZXNzICovCi0gICAgICBjID0gZ2V0YyAoZl9pbik7Ci0gICAgICBpZiAoYyA9PSAnTicpCi0JewotCSAgZmdldHMgKGJ1ZiwgODAsIGZfaW4pOwotCSAgaWYgKCFzdHJjbXAgKGJ1ZiwgIk9fQVBQXG4iKSkKLQkgICAgcHJlcHJvY2VzcyA9IDA7Ci0JICBpZiAoIXN0cmNociAoYnVmLCAnXG4nKSkKLQkgICAgdW5nZXRjICgnIycsIGZfaW4pOwkvKiBJdCB3YXMgbG9uZ2VyICovCi0JICBlbHNlCi0JICAgIHVuZ2V0YyAoJ1xuJywgZl9pbik7Ci0JfQotICAgICAgZWxzZSBpZiAoYyA9PSAnXG4nKQotCXVuZ2V0YyAoJ1xuJywgZl9pbik7Ci0gICAgICBlbHNlCi0JdW5nZXRjICgnIycsIGZfaW4pOwotICAgIH0KLSAgZWxzZQotICAgIHVuZ2V0YyAoYywgZl9pbik7Ci19Ci0KLS8qIENsb3NlIGlucHV0IGZpbGUuICAqLwotdm9pZCAKLWlucHV0X2ZpbGVfY2xvc2UgKCkKLXsKLSAgaWYgKGZfaW4gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmY2xvc2UgKGZfaW4pOwotICAgIH0JCQkJLyogZG9uJ3QgY2xvc2UgYSBudWxsIGZpbGUgcG9pbnRlciAqLwotICBmX2luID0gMDsKLX0JCQkJLyogaW5wdXRfZmlsZV9jbG9zZSgpICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIGRvX3NjcnViX2NoYXJzLiAgKi8KLQotc3RhdGljIGludAotaW5wdXRfZmlsZV9nZXQgKGZyb20pCi0gICAgIGNoYXIgKipmcm9tOwotewotICBzdGF0aWMgY2hhciBidWZbQlVGRkVSX1NJWkVdOwotICBpbnQgc2l6ZTsKLQotICBzaXplID0gZnJlYWQgKGJ1Ziwgc2l6ZW9mIChjaGFyKSwgc2l6ZW9mIGJ1ZiwgZl9pbik7Ci0gIGlmIChzaXplIDwgMCkKLSAgICB7Ci0gICAgICBhc19wZXJyb3IgKF8oIkNhbid0IHJlYWQgZnJvbSAlcyIpLCBmaWxlX25hbWUpOwotICAgICAgc2l6ZSA9IDA7Ci0gICAgfQotICAqZnJvbSA9IGJ1ZjsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qIFJlYWQgYSBidWZmZXIgZnJvbSB0aGUgaW5wdXQgZmlsZS4gICovCi0KLWNoYXIgKgotaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyICh3aGVyZSkKLSAgICAgY2hhciAqd2hlcmU7CQkvKiBXaGVyZSB0byBwbGFjZSAxc3QgY2hhcmFjdGVyIG9mIG5ldyBidWZmZXIuICovCi17Ci0gIGNoYXIgKnJldHVybl92YWx1ZTsJCS8qIC0+IExhc3QgY2hhciBvZiB3aGF0IHdlIHJlYWQsICsgMS4gKi8KLSAgcmVnaXN0ZXIgaW50IHNpemU7Ci0KLSAgaWYgKGZfaW4gPT0gKEZJTEUgKikgMCkKLSAgICByZXR1cm4gMDsKLSAgLyoKLSAgICogZmZsdXNoIChzdGRpbik7IGNvdWxkIGJlIGRvbmUgaGVyZSBpZiB5b3Ugd2FudCB0byBzeW5jaHJvbmlzZQotICAgKiBzdGRpbiBhbmQgc3Rkb3V0LCBmb3IgdGhlIGNhc2Ugd2hlcmUgb3VyIGlucHV0IGZpbGUgaXMgc3RkaW4uCi0gICAqIFNpbmNlIHRoZSBhc3NlbWJsZXIgc2hvdWxkbid0IGRvIGFueSBvdXRwdXQgdG8gc3Rkb3V0LCB3ZQotICAgKiBkb24ndCBib3RoZXIgdG8gc3luY2ggb3V0cHV0IGFuZCBpbnB1dC4KLSAgICovCi0gIGlmIChwcmVwcm9jZXNzKQotICAgIHNpemUgPSBkb19zY3J1Yl9jaGFycyAoaW5wdXRfZmlsZV9nZXQsIHdoZXJlLCBCVUZGRVJfU0laRSk7Ci0gIGVsc2UKLSAgICBzaXplID0gZnJlYWQgKHdoZXJlLCBzaXplb2YgKGNoYXIpLCBCVUZGRVJfU0laRSwgZl9pbik7Ci0gIGlmIChzaXplIDwgMCkKLSAgICB7Ci0gICAgICBhc19wZXJyb3IgKF8oIkNhbid0IHJlYWQgZnJvbSAlcyIpLCBmaWxlX25hbWUpOwotICAgICAgc2l6ZSA9IDA7Ci0gICAgfQotICBpZiAoc2l6ZSkKLSAgICByZXR1cm5fdmFsdWUgPSB3aGVyZSArIHNpemU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZmNsb3NlIChmX2luKSkKLQlhc19wZXJyb3IgKF8oIkNhbid0IGNsb3NlICVzIiksIGZpbGVfbmFtZSk7Ci0gICAgICBmX2luID0gKEZJTEUgKikgMDsKLSAgICAgIHJldHVybl92YWx1ZSA9IDA7Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19Ci0KLS8qIGVuZCBvZiBpbnB1dC1maWxlLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9pbnB1dC1maWxlLmggYi9nYXMvaW5wdXQtZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjliZjI4Li4wMDAwMDAwCi0tLSBhL2dhcy9pbnB1dC1maWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKiBpbnB1dF9maWxlLmggaGVhZGVyIGZvciBpbnB1dC1maWxlLmMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiJpbnB1dF9maWxlLmMiOk9wZXJhdGluZy1zeXN0ZW0gZGVwZW5kYW50IGZ1bmN0aW9ucyB0byByZWFkIHNvdXJjZSBmaWxlcy4qLwotCi0KLS8qCi0gKiBObyBtYXR0ZXIgd2hhdCB0aGUgb3BlcmF0aW5nIHN5c3RlbSwgdGhpcyBtb2R1bGUgbXVzdCBwcm92aWRlIHRoZQotICogZm9sbG93aW5nIHNlcnZpY2VzIHRvIGl0cyBjYWxsZXJzLgotICoKLSAqIGlucHV0X2ZpbGVfYmVnaW4oKQkJCUNhbGwgb25jZSBiZWZvcmUgYW55dGhpbmcgZWxzZS4KLSAqCi0gKiBpbnB1dF9maWxlX2VuZCgpCQkJQ2FsbCBvbmNlIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZS4KLSAqCi0gKiBpbnB1dF9maWxlX2J1ZmZlcl9zaXplKCkJCUNhbGwgYW55dGltZS4gUmV0dXJucyBsYXJnZXN0IHBvc3NpYmxlCi0gKgkJCQkJZGVsaXZlcnkgZnJvbQotICoJCQkJCWlucHV0X2ZpbGVfZ2l2ZV9uZXh0X2J1ZmZlcigpLgotICoKLSAqIGlucHV0X2ZpbGVfb3BlbihuYW1lKQkJQ2FsbCBvbmNlIGZvciBlYWNoIGlucHV0IGZpbGUuCi0gKgotICogaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyKHdoZXJlKQlDYWxsIG9uY2UgdG8gZ2V0IGVhY2ggbmV3IGJ1ZmZlci4KLSAqCQkJCQlSZXR1cm4gMDogbm8gbW9yZSBjaGFycyBsZWZ0IGluIGZpbGUsCi0gKgkJCQkJICAgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuCi0gKgkJCQkJT3RoZXJ3aXNlOiByZXR1cm4gYSBwb2ludGVyIHRvIGp1c3QKLSAqCQkJCQkgICBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgd2UgcmVhZAotICoJCQkJCSAgIGludG8gdGhlIGJ1ZmZlci4KLSAqCQkJCQlJZiB3ZSBjYW4gb25seSByZWFkIDAgY2hhcmFjdGVycywgdGhlbgotICoJCQkJCWVuZC1vZi1maWxlIGlzIGZha2VkLgotICoKLSAqIGlucHV0X2ZpbGVfcHVzaCgpCQkJUHVzaCBzdGF0ZSwgd2hpY2ggY2FuIGJlIHJlc3RvcmVkCi0gKgkJCQkJbGF0ZXIuICBEb2VzIGltcGxpY2l0IGlucHV0X2ZpbGVfYmVnaW4uCi0gKgkJCQkJUmV0dXJucyBjaGFyICogdG8gc2F2ZWQgc3RhdGUuCi0gKgotICogaW5wdXRfZmlsZV9wb3AgKGFyZykJCQlQb3BzIHByZXZpb3VzbHkgc2F2ZWQgc3RhdGUuCi0gKgotICogaW5wdXRfZmlsZV9jbG9zZSAoKQkJCUNsb3NlcyBvcGVuZWQgZmlsZS4KLSAqCi0gKiBBbGwgZXJyb3JzIGFyZSByZXBvcnRlZCAodXNpbmcgYXNfcGVycm9yKSBzbyBjYWxsZXIgZG9lc24ndCBoYXZlIHRvIHRoaW5rCi0gKiBhYm91dCBJL08gZXJyb3JzLiBObyBJL08gZXJyb3JzIGFyZSBmYXRhbDogYW4gZW5kLW9mLWZpbGUgbWF5IGJlIGZha2VkLgotICovCi0KLWNoYXIgKmlucHV0X2ZpbGVfZ2l2ZV9uZXh0X2J1ZmZlciBQQVJBTVMgKChjaGFyICp3aGVyZSkpOwotY2hhciAqaW5wdXRfZmlsZV9wdXNoIFBBUkFNUyAoKHZvaWQpKTsKLXVuc2lnbmVkIGludCBpbnB1dF9maWxlX2J1ZmZlcl9zaXplIFBBUkFNUyAoKHZvaWQpKTsKLWludCBpbnB1dF9maWxlX2lzX29wZW4gUEFSQU1TICgodm9pZCkpOwotdm9pZCBpbnB1dF9maWxlX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgaW5wdXRfZmlsZV9jbG9zZSBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGlucHV0X2ZpbGVfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgaW5wdXRfZmlsZV9vcGVuIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lLCBpbnQgcHJlKSk7Ci12b2lkIGlucHV0X2ZpbGVfcG9wIFBBUkFNUyAoKGNoYXIgKmFyZykpOwotCi0vKiBlbmQgb2YgaW5wdXRfZmlsZS5oICovCmRpZmYgLS1naXQgYS9nYXMvaW5wdXQtc2NydWIuYyBiL2dhcy9pbnB1dC1zY3J1Yi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmEzYmIzLi4wMDAwMDAwCi0tLSBhL2dhcy9pbnB1dC1zY3J1Yi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIxICswLDAgQEAKLS8qIGlucHV0X3NjcnViLmMgLSBCcmVhayB1cCBpbnB1dCBidWZmZXJzIGludG8gd2hvbGUgbnVtYmVycyBvZiBsaW5lcy4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgkJLyogTmVlZCB0aGlzIHRvIG1ha2UgZXJybm8gZGVjbGFyYXRpb24gcmlnaHQgKi8KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImlucHV0LWZpbGUuaCIKLSNpbmNsdWRlICJzYi5oIgotI2luY2x1ZGUgImxpc3RpbmcuaCIKLQotLyoKLSAqIE8vUyBpbmRlcGVuZGVudCBtb2R1bGUgdG8gc3VwcGx5IGJ1ZmZlcnMgb2Ygc2FuaXRpc2VkIHNvdXJjZSBjb2RlCi0gKiB0byByZXN0IG9mIGFzc2VtYmxlci4gIFdlIGdldCBzYW5pdGlzZWQgaW5wdXQgZGF0YSBvZiBhcmJpdHJhcnkgbGVuZ3RoLgotICogV2UgYnJlYWsgdGhlc2UgYnVmZmVycyBvbiBsaW5lIGJvdW5kYXJpZXMsIHJlY29tYmluZSBwaWVjZXMgdGhhdAotICogd2VyZSBicm9rZW4gYWNyb3NzIGJ1ZmZlcnMsIGFuZCByZXR1cm4gYSBidWZmZXIgb2YgZnVsbCBsaW5lcyB0bwotICogdGhlIGNhbGxlci4KLSAqIFRoZSBsYXN0IHBhcnRpYWwgbGluZSBiZWdpbnMgdGhlIG5leHQgYnVmZmVyIHdlIGJ1aWxkIGFuZCByZXR1cm4gdG8gY2FsbGVyLgotICogVGhlIGJ1ZmZlciByZXR1cm5lZCB0byBjYWxsZXIgaXMgcHJlY2VlZGVkIGJ5IEJFRk9SRV9TVFJJTkcgYW5kIGZvbGxvd2VkCi0gKiBieSBBRlRFUl9TVFJJTkcsIGFzIHNlbnRpbmVscy4gVGhlIGxhc3QgY2hhcmFjdGVyIGJlZm9yZSBBRlRFUl9TVFJJTkcKLSAqIGlzIGEgbmV3bGluZS4KLSAqIEFsc28gbG9va3MgYWZ0ZXIgbGluZSBudW1iZXJzLCBmb3IgZS5nLiBlcnJvciBtZXNzYWdlcy4KLSAqLwotCi0vKgotICogV2UgZG9uJ3QgY2FyZSBob3cgZmlsdGh5IG91ciBidWZmZXJzIGFyZSwgYnV0IG91ciBjYWxsZXJzIGFzc3VtZQotICogdGhhdCB0aGUgZm9sbG93aW5nIHNhbml0YXRpb24gaGFzIGFscmVhZHkgYmVlbiBkb25lLgotICoKLSAqIE5vIGNvbW1lbnRzLCByZWR1Y2UgYSBjb21tZW50IHRvIGEgc3BhY2UuCi0gKiBSZWR1Y2UgYSB0YWIgdG8gYSBzcGFjZSB1bmxlc3MgaXQgaXMgMXN0IGNoYXIgb2YgbGluZS4KLSAqIEFsbCBtdWx0aXBsZSB0YWJzIGFuZCBzcGFjZXMgY29sbGFwc2VkIGludG8gMSBjaGFyLiBUYWIgb25seQotICogICBsZWdhbCBpZiAxc3QgY2hhciBvZiBsaW5lLgotICogIyBsaW5lIGZpbGUgc3RhdGVtZW50cyBjb252ZXJ0ZWQgdG8gLmxpbmUgeDsuZmlsZSB5OyBzdGF0ZW1lbnRzLgotICogRXNjYXBlZCBuZXdsaW5lcyBhdCBlbmQgb2YgbGluZTogcmVtb3ZlIHRoZW0gYnV0IGFkZCBhcyBtYW55IG5ld2xpbmVzCi0gKiAgIHRvIGVuZCBvZiBzdGF0ZW1lbnQgYXMgeW91IHJlbW92ZWQgaW4gdGhlIG1pZGRsZSwgdG8gc3luY2ggbGluZSBudW1iZXJzLgotICovCi0MCi0jZGVmaW5lIEJFRk9SRV9TVFJJTkcgKCJcbiIpCi0jZGVmaW5lIEFGVEVSX1NUUklORyAoIlwwIikJLyogbWVtY3B5IG9mIDAgY2hhcnMgbWlnaHQgY2hva2UuICovCi0jZGVmaW5lIEJFRk9SRV9TSVpFICgxKQotI2RlZmluZSBBRlRFUl9TSVpFICAoMSkKLQotc3RhdGljIGNoYXIgKmJ1ZmZlcl9zdGFydDsJLyotPjFzdCBjaGFyIG9mIGZ1bGwgYnVmZmVyIGFyZWEuICovCi1zdGF0aWMgY2hhciAqcGFydGlhbF93aGVyZTsJLyotPmFmdGVyIGxhc3QgZnVsbCBsaW5lIGluIGJ1ZmZlci4gKi8KLXN0YXRpYyBpbnQgcGFydGlhbF9zaXplOwkvKiA+PTAuIE51bWJlciBvZiBjaGFycyBpbiBwYXJ0aWFsIGxpbmUgaW4gYnVmZmVyLiAqLwotc3RhdGljIGNoYXIgc2F2ZV9zb3VyY2VbQUZURVJfU0laRV07Ci0vKiBCZWNhdXNlIHdlIG5lZWQgQUZURVJfU1RSSU5HIGp1c3QgYWZ0ZXIgbGFzdCAqLwotLyogZnVsbCBsaW5lLCBpdCBjbG9iYmVycyAxc3QgcGFydCBvZiBwYXJ0aWFsICovCi0vKiBsaW5lLiBTbyB3ZSBwcmVzZXJ2ZSAxc3QgcGFydCBvZiBwYXJ0aWFsICovCi0vKiBsaW5lIGhlcmUuICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGJ1ZmZlcl9sZW5ndGg7CS8qIFdoYXQgaXMgdGhlIGxhcmdlc3Qgc2l6ZSBidWZmZXIgdGhhdCAqLwotLyogaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyKCkgY291bGQgKi8KLS8qIHJldHVybiB0byB1cz8gKi8KLQotLyogVGhlIGluZGV4IGludG8gYW4gc2Igc3RydWN0dXJlIHdlIGFyZSByZWFkaW5nIGZyb20uICAtMSBpZiBub25lLiAgKi8KLXN0YXRpYyBpbnQgc2JfaW5kZXggPSAtMTsKLQotLyogSWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBhbiBzYiBzdHJ1Y3R1cmUsIHRoaXMgaXMgaXQuICAqLwotc3RhdGljIHNiIGZyb21fc2I7Ci0KLS8qIFRoZSBudW1iZXIgb2YgbmVzdGVkIHNiIHN0cnVjdHVyZXMgd2UgaGF2ZSBpbmNsdWRlZC4gICovCi1pbnQgbWFjcm9fbmVzdDsKLQotLyogV2UgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBzb3VyY2UgZmlsZSBvcGVuIGF0IG9uY2UsIHRob3VnaCB0aGUgaW5mbyBmb3IgYWxsCi0gICBidXQgdGhlIGxhdGVzdCBvbmUgYXJlIHNhdmVkIG9mZiBpbiBhIHN0cnVjdCBpbnB1dF9zYXZlLiAgVGhlc2UgZmlsZXMgcmVtYWluCi0gICBvcGVuLCBzbyB3ZSBhcmUgbGltaXRlZCBieSB0aGUgbnVtYmVyIG9mIG9wZW4gZmlsZXMgYWxsb3dlZCBieSB0aGUKLSAgIHVuZGVybHlpbmcgT1MuIFdlIG1heSBhbHNvIHNlcXVlbnRpYWxseSByZWFkIG1vcmUgdGhhbiBvbmUgc291cmNlIGZpbGUgaW4gYW4KLSAgIGFzc2VtYmx5LiAqLwotCi0vKiBXZSBtdXN0IHRyYWNrIHRoZSBwaHlzaWNhbCBmaWxlIGFuZCBsaW5lIG51bWJlciBmb3IgZXJyb3IgbWVzc2FnZXMuIFdlIGFsc28KLSAgIHRyYWNrIGEgImxvZ2ljYWwiIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gKEM/KSAgY29tcGlsZXIKLSAgIHNvdXJjZSBsaW5lIG51bWJlcnMuICBXaGVuZXZlciB3ZSBvcGVuIGEgZmlsZSB3ZSBtdXN0IGZpbGwgaW4KLSAgIHBoeXNpY2FsX2lucHV0X2ZpbGUuIFNvIGlmIGl0IGlzIE5VTEwgd2UgaGF2ZSBub3Qgb3BlbmVkIGFueSBmaWxlcyB5ZXQuICovCi0KLXN0YXRpYyBjaGFyICpwaHlzaWNhbF9pbnB1dF9maWxlOwotc3RhdGljIGNoYXIgKmxvZ2ljYWxfaW5wdXRfZmlsZTsKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgbGluZV9udW1iZXJUOwkvKiAxLW9yaWdpbiBsaW5lIG51bWJlciBpbiBhIHNvdXJjZSBmaWxlLiAqLwotLyogQSBsaW5lIGVuZHMgaW4gJ1xuJyBvciBlb2YuICovCi0KLXN0YXRpYyBsaW5lX251bWJlclQgcGh5c2ljYWxfaW5wdXRfbGluZTsKLXN0YXRpYyBpbnQgbG9naWNhbF9pbnB1dF9saW5lOwotCi0vKiBTdHJ1Y3QgdXNlZCB0byBzYXZlIHRoZSBzdGF0ZSBvZiB0aGUgaW5wdXQgaGFuZGxlciBkdXJpbmcgaW5jbHVkZSBmaWxlcyAqLwotc3RydWN0IGlucHV0X3NhdmUKLSAgewotICAgIGNoYXIgKmJ1ZmZlcl9zdGFydDsKLSAgICBjaGFyICpwYXJ0aWFsX3doZXJlOwotICAgIGludCBwYXJ0aWFsX3NpemU7Ci0gICAgY2hhciBzYXZlX3NvdXJjZVtBRlRFUl9TSVpFXTsKLSAgICB1bnNpZ25lZCBpbnQgYnVmZmVyX2xlbmd0aDsKLSAgICBjaGFyICpwaHlzaWNhbF9pbnB1dF9maWxlOwotICAgIGNoYXIgKmxvZ2ljYWxfaW5wdXRfZmlsZTsKLSAgICBsaW5lX251bWJlclQgcGh5c2ljYWxfaW5wdXRfbGluZTsKLSAgICBpbnQgbG9naWNhbF9pbnB1dF9saW5lOwotICAgIGludCBzYl9pbmRleDsKLSAgICBzYiBmcm9tX3NiOwotICAgIHN0cnVjdCBpbnB1dF9zYXZlICpuZXh0X3NhdmVkX2ZpbGU7CS8qIENoYWluIG9mIGlucHV0X3NhdmVzICovCi0gICAgY2hhciAqaW5wdXRfZmlsZV9zYXZlOwkvKiBTYXZlZCBzdGF0ZSBvZiBpbnB1dCByb3V0aW5lcyAqLwotICAgIGNoYXIgKnNhdmVkX3Bvc2l0aW9uOwkvKiBDYWxsZXIncyBzYXZlZCBwb3NpdGlvbiBpbiBidWYgKi8KLSAgfTsKLQotc3RhdGljIHN0cnVjdCBpbnB1dF9zYXZlICppbnB1dF9zY3J1Yl9wdXNoIFBBUkFNUyAoKGNoYXIgKnNhdmVkX3Bvc2l0aW9uKSk7Ci1zdGF0aWMgY2hhciAqaW5wdXRfc2NydWJfcG9wIFBBUkFNUyAoKHN0cnVjdCBpbnB1dF9zYXZlICphcmcpKTsKLXN0YXRpYyB2b2lkIGFzXzFfY2hhciBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgYywgRklMRSAqIHN0cmVhbSkpOwotCi0vKiBTYXZlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZSB0aGF0IC5pbmNsdWRlJ2QgdGhpcyBvbmUuICBXaGVuIHdlIGhpdCBFT0YsCi0gICB3ZSBhdXRvbWF0aWNhbGx5IHBvcCB0byB0aGF0IGZpbGUuICovCi0KLXN0YXRpYyBzdHJ1Y3QgaW5wdXRfc2F2ZSAqbmV4dF9zYXZlZF9maWxlOwotCi0vKiBQdXNoIHRoZSBzdGF0ZSBvZiBpbnB1dCByZWFkaW5nIGFuZCBzY3J1YmJpbmcgc28gdGhhdCB3ZSBjYW4gI2luY2x1ZGUuCi0gICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgJ3ZvaWQgKicgKGZ1ZGdlZCBmb3Igb2xkIGNvbXBpbGVycykgdG8gYSBzYXZlCi0gICBhcmVhLCB3aGljaCBjYW4gYmUgcmVzdG9yZWQgYnkgcGFzc2luZyBpdCB0byBpbnB1dF9zY3J1Yl9wb3AoKS4gKi8KLXN0YXRpYyBzdHJ1Y3QgaW5wdXRfc2F2ZSAqCi1pbnB1dF9zY3J1Yl9wdXNoIChzYXZlZF9wb3NpdGlvbikKLSAgICAgY2hhciAqc2F2ZWRfcG9zaXRpb247Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBpbnB1dF9zYXZlICpzYXZlZDsKLQotICBzYXZlZCA9IChzdHJ1Y3QgaW5wdXRfc2F2ZSAqKSB4bWFsbG9jIChzaXplb2YgKnNhdmVkKTsKLQotICBzYXZlZC0+c2F2ZWRfcG9zaXRpb24gPSBzYXZlZF9wb3NpdGlvbjsKLSAgc2F2ZWQtPmJ1ZmZlcl9zdGFydCA9IGJ1ZmZlcl9zdGFydDsKLSAgc2F2ZWQtPnBhcnRpYWxfd2hlcmUgPSBwYXJ0aWFsX3doZXJlOwotICBzYXZlZC0+cGFydGlhbF9zaXplID0gcGFydGlhbF9zaXplOwotICBzYXZlZC0+YnVmZmVyX2xlbmd0aCA9IGJ1ZmZlcl9sZW5ndGg7Ci0gIHNhdmVkLT5waHlzaWNhbF9pbnB1dF9maWxlID0gcGh5c2ljYWxfaW5wdXRfZmlsZTsKLSAgc2F2ZWQtPmxvZ2ljYWxfaW5wdXRfZmlsZSA9IGxvZ2ljYWxfaW5wdXRfZmlsZTsKLSAgc2F2ZWQtPnBoeXNpY2FsX2lucHV0X2xpbmUgPSBwaHlzaWNhbF9pbnB1dF9saW5lOwotICBzYXZlZC0+bG9naWNhbF9pbnB1dF9saW5lID0gbG9naWNhbF9pbnB1dF9saW5lOwotICBzYXZlZC0+c2JfaW5kZXggPSBzYl9pbmRleDsKLSAgc2F2ZWQtPmZyb21fc2IgPSBmcm9tX3NiOwotICBtZW1jcHkgKHNhdmVkLT5zYXZlX3NvdXJjZSwgc2F2ZV9zb3VyY2UsIHNpemVvZiAoc2F2ZV9zb3VyY2UpKTsKLSAgc2F2ZWQtPm5leHRfc2F2ZWRfZmlsZSA9IG5leHRfc2F2ZWRfZmlsZTsKLSAgc2F2ZWQtPmlucHV0X2ZpbGVfc2F2ZSA9IGlucHV0X2ZpbGVfcHVzaCAoKTsKLQotICBpbnB1dF9maWxlX2JlZ2luICgpOwkJLyogUmVpbml0aWFsaXplISAqLwotICBsb2dpY2FsX2lucHV0X2xpbmUgPSAtMTsKLSAgbG9naWNhbF9pbnB1dF9maWxlID0gKGNoYXIgKikgTlVMTDsKLSAgYnVmZmVyX2xlbmd0aCA9IGlucHV0X2ZpbGVfYnVmZmVyX3NpemUgKCk7Ci0gIHNiX2luZGV4ID0gLTE7Ci0KLSAgYnVmZmVyX3N0YXJ0ID0geG1hbGxvYyAoKEJFRk9SRV9TSVpFICsgYnVmZmVyX2xlbmd0aCArIGJ1ZmZlcl9sZW5ndGggKyBBRlRFUl9TSVpFKSk7Ci0gIG1lbWNweSAoYnVmZmVyX3N0YXJ0LCBCRUZPUkVfU1RSSU5HLCAoaW50KSBCRUZPUkVfU0laRSk7Ci0KLSAgcmV0dXJuIHNhdmVkOwotfQkJCQkvKiBpbnB1dF9zY3J1Yl9wdXNoKCkgKi8KLQotc3RhdGljIGNoYXIgKgotaW5wdXRfc2NydWJfcG9wIChzYXZlZCkKLSAgICAgc3RydWN0IGlucHV0X3NhdmUgKnNhdmVkOwotewotICBjaGFyICpzYXZlZF9wb3NpdGlvbjsKLQotICBpbnB1dF9zY3J1Yl9lbmQgKCk7CQkvKiBGaW5pc2ggb2ZmIG9sZCBidWZmZXIgKi8KLQotICBpbnB1dF9maWxlX3BvcCAoc2F2ZWQtPmlucHV0X2ZpbGVfc2F2ZSk7Ci0gIHNhdmVkX3Bvc2l0aW9uID0gc2F2ZWQtPnNhdmVkX3Bvc2l0aW9uOwotICBidWZmZXJfc3RhcnQgPSBzYXZlZC0+YnVmZmVyX3N0YXJ0OwotICBidWZmZXJfbGVuZ3RoID0gc2F2ZWQtPmJ1ZmZlcl9sZW5ndGg7Ci0gIHBoeXNpY2FsX2lucHV0X2ZpbGUgPSBzYXZlZC0+cGh5c2ljYWxfaW5wdXRfZmlsZTsKLSAgbG9naWNhbF9pbnB1dF9maWxlID0gc2F2ZWQtPmxvZ2ljYWxfaW5wdXRfZmlsZTsKLSAgcGh5c2ljYWxfaW5wdXRfbGluZSA9IHNhdmVkLT5waHlzaWNhbF9pbnB1dF9saW5lOwotICBsb2dpY2FsX2lucHV0X2xpbmUgPSBzYXZlZC0+bG9naWNhbF9pbnB1dF9saW5lOwotICBzYl9pbmRleCA9IHNhdmVkLT5zYl9pbmRleDsKLSAgZnJvbV9zYiA9IHNhdmVkLT5mcm9tX3NiOwotICBwYXJ0aWFsX3doZXJlID0gc2F2ZWQtPnBhcnRpYWxfd2hlcmU7Ci0gIHBhcnRpYWxfc2l6ZSA9IHNhdmVkLT5wYXJ0aWFsX3NpemU7Ci0gIG5leHRfc2F2ZWRfZmlsZSA9IHNhdmVkLT5uZXh0X3NhdmVkX2ZpbGU7Ci0gIG1lbWNweSAoc2F2ZV9zb3VyY2UsIHNhdmVkLT5zYXZlX3NvdXJjZSwgc2l6ZW9mIChzYXZlX3NvdXJjZSkpOwotCi0gIGZyZWUgKHNhdmVkKTsKLSAgcmV0dXJuIHNhdmVkX3Bvc2l0aW9uOwotfQotDAotCi12b2lkCi1pbnB1dF9zY3J1Yl9iZWdpbiAoKQotewotICBrbm93IChzdHJsZW4gKEJFRk9SRV9TVFJJTkcpID09IEJFRk9SRV9TSVpFKTsKLSAga25vdyAoc3RybGVuIChBRlRFUl9TVFJJTkcpID09IEFGVEVSX1NJWkUgfHwgKEFGVEVSX1NUUklOR1swXSA9PSAnXDAnICYmIEFGVEVSX1NJWkUgPT0gMSkpOwotCi0gIGlucHV0X2ZpbGVfYmVnaW4gKCk7Ci0KLSAgYnVmZmVyX2xlbmd0aCA9IGlucHV0X2ZpbGVfYnVmZmVyX3NpemUgKCk7Ci0KLSAgYnVmZmVyX3N0YXJ0ID0geG1hbGxvYyAoKEJFRk9SRV9TSVpFICsgYnVmZmVyX2xlbmd0aCArIGJ1ZmZlcl9sZW5ndGggKyBBRlRFUl9TSVpFKSk7Ci0gIG1lbWNweSAoYnVmZmVyX3N0YXJ0LCBCRUZPUkVfU1RSSU5HLCAoaW50KSBCRUZPUkVfU0laRSk7Ci0KLSAgLyogTGluZSBudW1iZXIgdGhpbmdzLiAqLwotICBsb2dpY2FsX2lucHV0X2xpbmUgPSAtMTsKLSAgbG9naWNhbF9pbnB1dF9maWxlID0gKGNoYXIgKikgTlVMTDsKLSAgcGh5c2ljYWxfaW5wdXRfZmlsZSA9IE5VTEw7CS8qIE5vIGZpbGUgcmVhZCB5ZXQuICovCi0gIG5leHRfc2F2ZWRfZmlsZSA9IE5VTEw7CS8qIEF0IEVPRiwgZG9uJ3QgcG9wIHRvIGFueSBvdGhlciBmaWxlICovCi0gIGRvX3NjcnViX2JlZ2luIChmbGFnX202OGtfbXJpKTsKLX0KLQotdm9pZAotaW5wdXRfc2NydWJfZW5kICgpCi17Ci0gIGlmIChidWZmZXJfc3RhcnQpCi0gICAgewotICAgICAgZnJlZSAoYnVmZmVyX3N0YXJ0KTsKLSAgICAgIGJ1ZmZlcl9zdGFydCA9IDA7Ci0gICAgICBpbnB1dF9maWxlX2VuZCAoKTsKLSAgICB9Ci19Ci0KLS8qIFN0YXJ0IHJlYWRpbmcgaW5wdXQgZnJvbSBhIG5ldyBmaWxlLiAqLwotCi1jaGFyICoJCQkJLyogUmV0dXJuIHN0YXJ0IG9mIGNhbGxlcidzIHBhcnQgb2YgYnVmZmVyLiAqLwotaW5wdXRfc2NydWJfbmV3X2ZpbGUgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgaW5wdXRfZmlsZV9vcGVuIChmaWxlbmFtZSwgIWZsYWdfbm9fY29tbWVudHMpOwotICBwaHlzaWNhbF9pbnB1dF9maWxlID0gZmlsZW5hbWVbMF0gPyBmaWxlbmFtZSA6IF8oIntzdGFuZGFyZCBpbnB1dH0iKTsKLSAgcGh5c2ljYWxfaW5wdXRfbGluZSA9IDA7Ci0KLSAgcGFydGlhbF9zaXplID0gMDsKLSAgcmV0dXJuIChidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRSk7Ci19Ci0KLQotLyogSW5jbHVkZSBhIGZpbGUgZnJvbSB0aGUgY3VycmVudCBmaWxlLiAgU2F2ZSBvdXIgc3RhdGUsIGNhdXNlIGl0IHRvCi0gICBiZSByZXN0b3JlZCBvbiBFT0YsIGFuZCBiZWdpbiBoYW5kbGluZyBhIG5ldyBmaWxlLiAgU2FtZSByZXN1bHQgYXMKLSAgIGlucHV0X3NjcnViX25ld19maWxlLiAqLwotCi1jaGFyICoKLWlucHV0X3NjcnViX2luY2x1ZGVfZmlsZSAoZmlsZW5hbWUsIHBvc2l0aW9uKQotICAgICBjaGFyICpmaWxlbmFtZTsKLSAgICAgY2hhciAqcG9zaXRpb247Ci17Ci0gIG5leHRfc2F2ZWRfZmlsZSA9IGlucHV0X3NjcnViX3B1c2ggKHBvc2l0aW9uKTsKLSAgcmV0dXJuIGlucHV0X3NjcnViX25ld19maWxlIChmaWxlbmFtZSk7Ci19Ci0KLS8qIFN0YXJ0IGdldHRpbmcgaW5wdXQgZnJvbSBhbiBzYiBzdHJ1Y3R1cmUuICBUaGlzIGlzIHVzZWQgd2hlbgotICAgZXhwYW5kaW5nIGEgbWFjcm8uICAqLwotCi12b2lkCi1pbnB1dF9zY3J1Yl9pbmNsdWRlX3NiIChmcm9tLCBwb3NpdGlvbikKLSAgICAgc2IgKmZyb207Ci0gICAgIGNoYXIgKnBvc2l0aW9uOwotewotICBpZiAobWFjcm9fbmVzdCA+IG1heF9tYWNyb19uZXN0KQotICAgIGFzX2ZhdGFsIChfKCJtYWNyb3MgbmVzdGVkIHRvbyBkZWVwbHkiKSk7Ci0gICsrbWFjcm9fbmVzdDsKLQotICBuZXh0X3NhdmVkX2ZpbGUgPSBpbnB1dF9zY3J1Yl9wdXNoIChwb3NpdGlvbik7Ci0KLSAgc2JfbmV3ICgmZnJvbV9zYik7Ci0gIGlmIChmcm9tLT5sZW4gPj0gMSAmJiBmcm9tLT5wdHJbMF0gIT0gJ1xuJykKLSAgICB7Ci0gICAgICAvKiBBZGQgdGhlIHNlbnRpbmVsIHJlcXVpcmVkIGJ5IHJlYWQuYy4gICovCi0gICAgICBzYl9hZGRfY2hhciAoJmZyb21fc2IsICdcbicpOwotICAgIH0KLSAgc2JfYWRkX3NiICgmZnJvbV9zYiwgZnJvbSk7Ci0gIHNiX2luZGV4ID0gMTsKLQotICAvKiBUaGVzZSB2YXJpYWJsZXMgYXJlIHJlc2V0IGJ5IGlucHV0X3NjcnViX3B1c2guICBSZXN0b3JlIHRoZW0KLSAgICAgc2luY2Ugd2UgYXJlLCBhZnRlciBhbGwsIHN0aWxsIGF0IHRoZSBzYW1lIHBvaW50IGluIHRoZSBmaWxlLiAgKi8KLSAgbG9naWNhbF9pbnB1dF9saW5lID0gbmV4dF9zYXZlZF9maWxlLT5sb2dpY2FsX2lucHV0X2xpbmU7Ci0gIGxvZ2ljYWxfaW5wdXRfZmlsZSA9IG5leHRfc2F2ZWRfZmlsZS0+bG9naWNhbF9pbnB1dF9maWxlOwotfQotCi12b2lkCi1pbnB1dF9zY3J1Yl9jbG9zZSAoKQotewotICBpbnB1dF9maWxlX2Nsb3NlICgpOwotfQotCi1jaGFyICoKLWlucHV0X3NjcnViX25leHRfYnVmZmVyIChidWZwKQotICAgICBjaGFyICoqYnVmcDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbGltaXQ7CQkvKi0+anVzdCBhZnRlciBsYXN0IGNoYXIgb2YgYnVmZmVyLiAqLwotCi0gIGlmIChzYl9pbmRleCA+PSAwKQotICAgIHsKLSAgICAgIGlmIChzYl9pbmRleCA+PSBmcm9tX3NiLmxlbikKLQl7Ci0JICBzYl9raWxsICgmZnJvbV9zYik7Ci0JICBjb25kX2ZpbmlzaF9jaGVjayAobWFjcm9fbmVzdCk7Ci0JICAtLW1hY3JvX25lc3Q7Ci0JICBwYXJ0aWFsX3doZXJlID0gTlVMTDsKLQkgIGlmIChuZXh0X3NhdmVkX2ZpbGUgIT0gTlVMTCkKLQkgICAgKmJ1ZnAgPSBpbnB1dF9zY3J1Yl9wb3AgKG5leHRfc2F2ZWRfZmlsZSk7Ci0JICByZXR1cm4gcGFydGlhbF93aGVyZTsKLQl9Ci0KLSAgICAgIHBhcnRpYWxfd2hlcmUgPSBmcm9tX3NiLnB0ciArIGZyb21fc2IubGVuOwotICAgICAgcGFydGlhbF9zaXplID0gMDsKLSAgICAgICpidWZwID0gZnJvbV9zYi5wdHIgKyBzYl9pbmRleDsKLSAgICAgIHNiX2luZGV4ID0gZnJvbV9zYi5sZW47Ci0gICAgICByZXR1cm4gcGFydGlhbF93aGVyZTsKLSAgICB9Ci0KLSAgKmJ1ZnAgPSBidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRTsKLQotICBpZiAocGFydGlhbF9zaXplKQotICAgIHsKLSAgICAgIG1lbWNweSAoYnVmZmVyX3N0YXJ0ICsgQkVGT1JFX1NJWkUsIHBhcnRpYWxfd2hlcmUsCi0JICAgICAgKHVuc2lnbmVkIGludCkgcGFydGlhbF9zaXplKTsKLSAgICAgIG1lbWNweSAoYnVmZmVyX3N0YXJ0ICsgQkVGT1JFX1NJWkUsIHNhdmVfc291cmNlLCBBRlRFUl9TSVpFKTsKLSAgICB9Ci0gIGxpbWl0ID0gaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyIChidWZmZXJfc3RhcnQKLQkJCQkgICAgICAgKyBCRUZPUkVfU0laRQotCQkJCSAgICAgICArIHBhcnRpYWxfc2l6ZSk7Ci0gIGlmIChsaW1pdCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBjaGFyICpwOwkJLyogRmluZCBsYXN0IG5ld2xpbmUuICovCi0KLSAgICAgIGZvciAocCA9IGxpbWl0IC0gMTsgKnAgIT0gJ1xuJzsgLS1wKQotCTsKLSAgICAgICsrcDsKLQotICAgICAgd2hpbGUgKHAgPD0gYnVmZmVyX3N0YXJ0ICsgQkVGT1JFX1NJWkUpCi0JewotCSAgaW50IGxpbW9mZjsKLQotCSAgbGltb2ZmID0gbGltaXQgLSBidWZmZXJfc3RhcnQ7Ci0JICBidWZmZXJfbGVuZ3RoICs9IGlucHV0X2ZpbGVfYnVmZmVyX3NpemUgKCk7Ci0JICBidWZmZXJfc3RhcnQgPSB4cmVhbGxvYyAoYnVmZmVyX3N0YXJ0LAotCQkJCSAgIChCRUZPUkVfU0laRQotCQkJCSAgICArIDIgKiBidWZmZXJfbGVuZ3RoCi0JCQkJICAgICsgQUZURVJfU0laRSkpOwotCSAgKmJ1ZnAgPSBidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRTsKLQkgIGxpbWl0ID0gaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyIChidWZmZXJfc3RhcnQgKyBsaW1vZmYpOwotCi0JICBpZiAobGltaXQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oInBhcnRpYWwgbGluZSBhdCBlbmQgb2YgZmlsZSBpZ25vcmVkIikpOwotCSAgICAgIHBhcnRpYWxfd2hlcmUgPSBOVUxMOwotCSAgICAgIGlmIChuZXh0X3NhdmVkX2ZpbGUpCi0JCSpidWZwID0gaW5wdXRfc2NydWJfcG9wIChuZXh0X3NhdmVkX2ZpbGUpOwotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0KLQkgIGZvciAocCA9IGxpbWl0IC0gMTsgKnAgIT0gJ1xuJzsgLS1wKQotCSAgICA7Ci0JICArK3A7Ci0JfQotCi0gICAgICBwYXJ0aWFsX3doZXJlID0gcDsKLSAgICAgIHBhcnRpYWxfc2l6ZSA9IGxpbWl0IC0gcDsKLSAgICAgIG1lbWNweSAoc2F2ZV9zb3VyY2UsIHBhcnRpYWxfd2hlcmUsIChpbnQpIEFGVEVSX1NJWkUpOwotICAgICAgbWVtY3B5IChwYXJ0aWFsX3doZXJlLCBBRlRFUl9TVFJJTkcsIChpbnQpIEFGVEVSX1NJWkUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHBhcnRpYWxfd2hlcmUgPSAwOwotICAgICAgaWYgKHBhcnRpYWxfc2l6ZSA+IDApCi0JewotCSAgYXNfd2FybiAoXygiUGFydGlhbCBsaW5lIGF0IGVuZCBvZiBmaWxlIGlnbm9yZWQiKSk7Ci0JfQotCi0gICAgICAvKiBUZWxsIHRoZSBsaXN0aW5nIHdlJ3ZlIGZpbmlzaGVkIHRoZSBmaWxlLiAgKi8KLSAgICAgIExJU1RJTkdfRU9GICgpOwotCi0gICAgICAvKiBJZiB3ZSBzaG91bGQgcG9wIHRvIGFub3RoZXIgZmlsZSBhdCBFT0YsIGRvIGl0LiAqLwotICAgICAgaWYgKG5leHRfc2F2ZWRfZmlsZSkKLQl7Ci0JICAqYnVmcCA9IGlucHV0X3NjcnViX3BvcCAobmV4dF9zYXZlZF9maWxlKTsJLyogUG9wIHN0YXRlICovCi0JICAvKiBwYXJ0aWFsX3doZXJlIGlzIG5vdyBjb3JyZWN0IHRvIHJldHVybiwgc2luY2Ugd2UgcG9wcGVkIGl0LiAqLwotCX0KLSAgICB9Ci0gIHJldHVybiAocGFydGlhbF93aGVyZSk7Ci19CQkJCS8qIGlucHV0X3NjcnViX25leHRfYnVmZmVyKCkgKi8KLQwKLS8qCi0gKiBUaGUgcmVtYWluaW5nIHBhcnQgb2YgdGhpcyBmaWxlIGRlYWxzIHdpdGggbGluZSBudW1iZXJzLCBlcnJvcgotICogbWVzc2FnZXMgYW5kIHNvIG9uLgotICovCi0KLQotaW50Ci1zZWVuX2F0X2xlYXN0XzFfZmlsZSAoKQkJLyogVFJVRSBpZiB3ZSBvcGVuZWQgYW55IGZpbGUuICovCi17Ci0gIHJldHVybiAocGh5c2ljYWxfaW5wdXRfZmlsZSAhPSBOVUxMKTsKLX0KLQotdm9pZAotYnVtcF9saW5lX2NvdW50ZXJzICgpCi17Ci0gIGlmIChzYl9pbmRleCA8IDApCi0gICAgewotICAgICAgKytwaHlzaWNhbF9pbnB1dF9saW5lOwotICAgICAgaWYgKGxvZ2ljYWxfaW5wdXRfbGluZSA+PSAwKQotCSsrbG9naWNhbF9pbnB1dF9saW5lOwotICAgIH0KLX0KLQwKLS8qCi0gKgkJCW5ld19sb2dpY2FsX2xpbmUoKQotICoKLSAqIFRlbGxzIHVzIHdoYXQgdGhlIG5ldyBsb2dpY2FsIGxpbmUgbnVtYmVyIGFuZCBmaWxlIGFyZS4KLSAqIElmIHRoZSBsaW5lX251bWJlciBpcyAtMSwgd2UgZG9uJ3QgY2hhbmdlIHRoZSBjdXJyZW50IGxvZ2ljYWwgbGluZQotICogbnVtYmVyLiAgSWYgaXQgaXMgLTIsIHdlIGRlY3JlbWVudCB0aGUgbG9naWNhbCBsaW5lIG51bWJlciAodGhpcyBpcwotICogdG8gc3VwcG9ydCB0aGUgLmFwcGZpbGUgcHNldWRvLW9wIGluc2VydGVkIGludG8gdGhlIHN0cmVhbSBieQotICogZG9fc2NydWJfY2hhcnMpLgotICogSWYgdGhlIGZuYW1lIGlzIE5VTEwsIHdlIGRvbid0IGNoYW5nZSB0aGUgY3VycmVudCBsb2dpY2FsIGZpbGUgbmFtZS4KLSAqIFJldHVybnMgbm9uemVybyBpZiB0aGUgZmlsZW5hbWUgYWN0dWFsbHkgY2hhbmdlcy4KLSAqLwotaW50Ci1uZXdfbG9naWNhbF9saW5lIChmbmFtZSwgbGluZV9udW1iZXIpCi0gICAgIGNoYXIgKmZuYW1lOwkJLyogRE9OJ1QgZGVzdHJveSBpdCEgV2UgcG9pbnQgdG8gaXQhICovCi0gICAgIGludCBsaW5lX251bWJlcjsKLXsKLSAgaWYgKGxpbmVfbnVtYmVyID49IDApCi0gICAgbG9naWNhbF9pbnB1dF9saW5lID0gbGluZV9udW1iZXI7Ci0gIGVsc2UgaWYgKGxpbmVfbnVtYmVyID09IC0yICYmIGxvZ2ljYWxfaW5wdXRfbGluZSA+IDApCi0gICAgLS1sb2dpY2FsX2lucHV0X2xpbmU7Ci0KLSAgaWYgKGZuYW1lCi0gICAgICAmJiAobG9naWNhbF9pbnB1dF9maWxlID09IE5VTEwKLQkgIHx8IHN0cmNtcCAobG9naWNhbF9pbnB1dF9maWxlLCBmbmFtZSkpKQotICAgIHsKLSAgICAgIGxvZ2ljYWxfaW5wdXRfZmlsZSA9IGZuYW1lOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19CQkJCS8qIG5ld19sb2dpY2FsX2xpbmUoKSAqLwotDAotLyoKLSAqCQkJYSBzIF8gdyBoIGUgciBlICgpCi0gKgotICogUmV0dXJuIHRoZSBjdXJyZW50IGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIuCi0gKiBuYW1lcCBzaG91bGQgYmUgY2hhciAqIGNvbnN0ICosIGJ1dCB0aGVyZSBhcmUgY29tcGlsZXJzIHdoaWNoIHNjcmV3Ci0gKiB1cCBkZWNsYXJhdGlvbnMgbGlrZSB0aGF0LCBhbmQgaXQncyBlYXNpZXIgdG8gYXZvaWQgaXQuCi0gKi8KLXZvaWQgCi1hc193aGVyZSAobmFtZXAsIGxpbmVwKQotICAgICBjaGFyICoqbmFtZXA7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZXA7Ci17Ci0gIGlmIChsb2dpY2FsX2lucHV0X2ZpbGUgIT0gTlVMTAotICAgICAgJiYgKGxpbmVwID09IE5VTEwgfHwgbG9naWNhbF9pbnB1dF9saW5lID49IDApKQotICAgIHsKLSAgICAgICpuYW1lcCA9IGxvZ2ljYWxfaW5wdXRfZmlsZTsKLSAgICAgIGlmIChsaW5lcCAhPSBOVUxMKQotCSpsaW5lcCA9IGxvZ2ljYWxfaW5wdXRfbGluZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHBoeXNpY2FsX2lucHV0X2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAqbmFtZXAgPSBwaHlzaWNhbF9pbnB1dF9maWxlOwotICAgICAgaWYgKGxpbmVwICE9IE5VTEwpCi0JKmxpbmVwID0gcGh5c2ljYWxfaW5wdXRfbGluZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqbmFtZXAgPSAwOwotICAgICAgaWYgKGxpbmVwICE9IE5VTEwpCi0JKmxpbmVwID0gMDsKLSAgICB9Ci19CQkJCS8qIGFzX3doZXJlKCkgKi8KLQwKLQotCi0KLS8qCi0gKgkJCWEgcyBfIGggbyB3IG0gdSBjIGggKCkKLSAqCi0gKiBPdXRwdXQgdG8gZ2l2ZW4gc3RyZWFtIGhvdyBtdWNoIG9mIGxpbmUgd2UgaGF2ZSBzY2FubmVkIHNvIGZhci4KLSAqIEFzc3VtZXMgd2UgaGF2ZSBzY2FubmVkIHVwIHRvIGFuZCBpbmNsdWRpbmcgaW5wdXRfbGluZV9wb2ludGVyLgotICogTm8gZnJlZSAnXG4nIGF0IGVuZCBvZiBsaW5lLgotICovCi12b2lkCi1hc19ob3dtdWNoIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsJCS8qIE9wZW5lZCBmb3Igd3JpdGUgcGxlYXNlLiAqLwotewotICByZWdpc3RlciBjaGFyICpwOwkJLyogU2NhbiBpbnB1dCBsaW5lLiAqLwotICAvKiByZWdpc3RlciBjaGFyIGM7IEpGIHVudXNlZCAqLwotCi0gIGZvciAocCA9IGlucHV0X2xpbmVfcG9pbnRlciAtIDE7ICpwICE9ICdcbic7IC0tcCkKLSAgICB7Ci0gICAgfQotICArK3A7CQkJCS8qIHAtPjFzdCBjaGFyIG9mIGxpbmUuICovCi0gIGZvciAoOyBwIDw9IGlucHV0X2xpbmVfcG9pbnRlcjsgcCsrKQotICAgIHsKLSAgICAgIC8qIEFzc3VtZSBBU0NJSS4gRUJDRElDICYgb3RoZXIgbWljcm8tY29tcHV0ZXIgY2hhciBzZXRzIGlnbm9yZWQuICovCi0gICAgICBhc18xX2NoYXIgKCh1bnNpZ25lZCBjaGFyKSAqcCwgc3RyZWFtKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIAotYXNfMV9jaGFyIChjLCBzdHJlYW0pCi0gICAgIHVuc2lnbmVkIGludCBjOwotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGlmIChjID4gMTI3KQotICAgIHsKLSAgICAgICh2b2lkKSBwdXRjICgnJScsIHN0cmVhbSk7Ci0gICAgICBjIC09IDEyODsKLSAgICB9Ci0gIGlmIChjIDwgMzIpCi0gICAgewotICAgICAgKHZvaWQpIHB1dGMgKCdeJywgc3RyZWFtKTsKLSAgICAgIGMgKz0gJ0AnOwotICAgIH0KLSAgKHZvaWQpIHB1dGMgKGMsIHN0cmVhbSk7Ci19Ci0KLS8qIGVuZCBvZiBpbnB1dF9zY3J1Yi5jICovCmRpZmYgLS1naXQgYS9nYXMvaXRibC1sZXgubCBiL2dhcy9pdGJsLWxleC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTA1ZGRkLi4wMDAwMDAwCi0tLSBhL2dhcy9pdGJsLWxleC5sCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qIGl0YmwtbGV4LmwKLSAgIENvcHlyaWdodCAoQykgMTk5NyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0lewotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJpdGJsLXBhcnNlLmgiCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBEQkcoeCkgcHJpbnRmIHgKLSNkZWZpbmUgTURCRyh4KSBwcmludGYgeAotI2Vsc2UKLSNkZWZpbmUgREJHKHgpCi0jZGVmaW5lIE1EQkcoeCkKLSNlbmRpZgotCi1pbnQgaW5zbnRibF9saW5lID0gMTsKLSV9Ci0KLUFMTlVNCVtBLVphLXowLTlfXQotRElHSVQJWzAtOV0KLUFMUEhBCVtBLVphLXpfXQotSEVYCVswLTlBLUZhLWZdCi0KLSUlCi0KLSJjcmVnInwiQ1JFRyIgewotICAgIHJldHVybiBDUkVHOwotICB9Ci0iZHJlZyJ8IkRSRUciIHsKLSAgICByZXR1cm4gRFJFRzsKLSAgfQotImdyZWcifCJHUkVHIiB7Ci0gICAgcmV0dXJuIEdSRUc7Ci0gIH0KLSJpbW1lZCJ8IklNTUVEIiB7Ci0gICAgcmV0dXJuIElNTUVEOwotICB9Ci0iYWRkciJ8IkFERFIiIHsKLSAgICByZXR1cm4gQUREUjsKLSAgfQotImluc24ifCJJTlNOIiB7Ci0gICAgcmV0dXJuIElOU047Ci0gIH0KLSJwIntESUdJVH0gewotICAgIHl5dGV4dFt5eWxlbmddID0gMDsKLSAgICB5eWx2YWwucHJvY2Vzc29yID0gc3RydG91bCAoeXl0ZXh0KzEsIDAsIDApOwotICAgIHJldHVybiBQTlVNOwotICB9Ci17RElHSVR9KyB7Ci0gICAgeXl0ZXh0W3l5bGVuZ10gPSAwOwotICAgIHl5bHZhbC5udW0gPSBzdHJ0b3VsICh5eXRleHQsIDAsIDApOwotICAgIHJldHVybiBOVU07Ci0gIH0KLSIweCJ7SEVYfSsgewotICAgIHl5dGV4dFt5eWxlbmddID0gMDsKLSAgICB5eWx2YWwubnVtID0gc3RydG91bCAoeXl0ZXh0LCAwLCAwKTsKLSAgICByZXR1cm4gTlVNOwotICB9Ci17QUxQSEF9e0FMTlVNfSoJewotICAgIHl5dGV4dFt5eWxlbmddID0gMDsKLSAgICB5eWx2YWwuc3RyID0gc3RyZHVwICh5eXRleHQpOwotICAgIHJldHVybiBJRDsKLSAgfQotIjsifCIjIgl7Ci0gICAgaW50IGM7Ci0gICAgd2hpbGUgKChjID0gaW5wdXQgKCkpICE9ICBFT0YpIAotICAgICAgewotICAgICAgICBpZiAoYyA9PSAgJ1xuJykgCi0gICAgCXsKLSAgICAJCXVucHV0IChjKTsKLSAgICAJCWJyZWFrOwotICAgIAl9Ci0gICAgICB9Ci0gIH0KLSJcbiIJeyAKLSAgICBpbnNudGJsX2xpbmUrKzsgCi0gICAgTURCRyAoKCJpbiBsZXgsIE5MID0gJWQgKHgleClcbiIsIE5MLCBOTCkpOwotICAgIHJldHVybiBOTDsgCi0gIH0KLSIgInwiXHQiIHsgCi0gIH0KLS4gewotICAgIE1EQkcgKCgiY2hhciA9ICV4LCAlZFxuIiwgeXl0ZXh0WzBdLCB5eXRleHRbMF0pKTsKLSAgICByZXR1cm4geXl0ZXh0WzBdOwotICB9Ci0lJQotCi0jaWZuZGVmIHl5d3JhcAotaW50IAoteXl3cmFwICgpIAotICB7IAotICAgIHJldHVybiAxOyAKLSAgfQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvaXRibC1vcHMuYyBiL2dhcy9pdGJsLW9wcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDA4ZGNhLi4wMDAwMDAwCi0tLSBhL2dhcy9pdGJsLW9wcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTIxICswLDAgQEAKLS8qIGl0Ymwtb3BzLmMKLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKgotICogSGVyZWluIGxpZXMgdGhlIHN1cHBvcnQgZm9yIGR5bmFtaWMgc3BlY2lmaWNhdGlvbiBvZiBwcm9jZXNzb3IKLSAqIGluc3RydWN0aW9ucyBhbmQgcmVnaXN0ZXJzLiAgTW5lbW9uaWNzLCB2YWx1ZXMsIGFuZCBmb3JtYXRzIGZvciBlYWNoCi0gKiBpbnN0cnVjdGlvbiBhbmQgcmVnaXN0ZXIgYXJlIHNwZWNpZmllZCBpbiBhbiBhc2NpaSBmaWxlIGNvbnNpc3Rpbmcgb2YKLSAqIHRhYmxlIGVudHJpZXMuICBUaGUgZ3JhbW1hciBmb3IgdGhlIHRhYmxlIGlzIGRlZmluZWQgaW4gdGhlIGRvY3VtZW50Ci0gKiAiUHJvY2Vzc29yIGluc3RydWN0aW9uIHRhYmxlIHNwZWNpZmljYXRpb24iLgotICoKLSAqIEluc3RydWN0aW9ucyB1c2UgdGhlIGdudSBhc3NlbWJsZXIgc3ludGF4LCB3aXRoIHRoZSBhZGRpdGlvbiBvZgotICogYWxsb3dpbmcgbW5lbW9uaWNzIGZvciByZWdpc3Rlci4KLSAqIEVnLiAiZnVuYyAkMixyZWczLDB4MTAwLHN5bWJvbCA7IGNvbW1lbnQiCi0gKiAJZnVuYyAtIG9wY29kZSBuYW1lCi0gKiAJJG4gLSByZWdpc3RlciBuCi0gKiAJcmVnMyAtIG1uZW1vbmljIGZvciBwcm9jZXNzb3IncyByZWdpc3RlciBkZWZpbmVkIGluIHRhYmxlCi0gKiAJMHhkZGQuLmQgLSBpbW1lZGlhdGUgdmFsdWUKLSAqIAlzeW1ib2wgLSBhZGRyZXNzIG9mIGxhYmVsIG9yIGV4dGVybmFsIHN5bWJvbAotICoKLSAqIEZpcnN0LCBpdGJsX3BhcnNlIHJlYWRzIGluIHRoZSB0YWJsZSBvZiByZWdpc3RlciBhbmQgaW5zdHJ1Y3Rpb24KLSAqIG5hbWVzIGFuZCBmb3JtYXRzLCBhbmQgYnVpbGRzIGEgbGlzdCBvZiBlbnRyaWVzIGZvciBlYWNoCi0gKiBwcm9jZXNzb3IvdHlwZSBjb21iaW5hdGlvbi4gIGxleCBhbmQgeWFjYyBhcmUgdXNlZCB0byBwYXJzZQotICogdGhlIGVudHJpZXMgaW4gdGhlIHRhYmxlIGFuZCBjYWxsIGZ1bmN0aW9ucyBkZWZpbmVkIGhlcmUgdG8KLSAqIGFkZCBlYWNoIGVudHJ5IHRvIG91ciBsaXN0LgotICoKLSAqIFRoZW4sIHdoZW4gYXNzZW1ibGluZyBvciBkaXNhc3NlbWJsaW5nLCB0aGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCB0bwotICogMSkgZ2V0IGluZm9ybWF0aW9uIG9uIGEgcHJvY2Vzc29yJ3MgcmVnaXN0ZXJzIGFuZAotICogMikgYXNzZW1ibGUvZGlzYXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24uCi0gKiBUbyBhc3NlbWJsZShkaXNhc3NlbWJsZSkgYW4gaW5zdHJ1Y3Rpb24sIHRoZSBmdW5jdGlvbgotICogaXRibF9hc3NlbWJsZShpdGJsX2Rpc2Fzc2VtYmxlKSBpcyBjYWxsZWQgdG8gc2VhcmNoIHRoZSBsaXN0IG9mCi0gKiBpbnN0cnVjdGlvbiBlbnRyaWVzLCBhbmQgaWYgYSBtYXRjaCBpcyBmb3VuZCwgdXNlcyB0aGUgZm9ybWF0Ci0gKiBkZXNjcmliZWQgaW4gdGhlIGluc3RydWN0aW9uIGVudHJ5IHN0cnVjdHVyZSB0byBjb21wbGV0ZSB0aGUgYWN0aW9uLgotICoKLSAqIEVnLiBTdXBwb3NlIHdlIGhhdmUgYSBNaXBzIGNvcHJvY2Vzc29yICJjb3AzIiB3aXRoIGRhdGEgcmVnaXN0ZXIgImQyIgotICogYW5kIHdlIHdhbnQgdG8gZGVmaW5lIGZ1bmN0aW9uICJwaWciIHdoaWNoIHRha2VzIHR3byBvcGVyYW5kcy4KLSAqCi0gKiBHaXZlbiB0aGUgdGFibGUgZW50cmllczoKLSAqIAkicDMgaW5zbiBwaWcgMHgxOjI0LTIxIGRyZWc6MjAtMTYgaW1tZWQ6MTUtMCIKLSAqIAkicDMgZHJlZyBkMiAweDIiCi0gKiBhbmQgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcgZm9yIGNvcHJvY2Vzc29yIHB6IGhhcyBlbmNvZGluZzoKLSAqIAkjZGVmaW5lIE1JUFNfRU5DT0RFX0NPUF9OVU0oeikgKCgweDIxfCh6PDwxKSk8PDI1KQotICogCSNkZWZpbmUgSVRCTF9FTkNPREVfUE5VTShwbnVtKSBNSVBTX0VOQ09ERV9DT1BfTlVNKHBudW0pCi0gKgotICogYSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgdGhlIGluc3RydWN0aW9uIG1pZ2h0IGxvb2sgc29tZXRoaW5nIGxpa2U6Ci0gKiAgICAgIHN0cnVjdCBpdGJsX2VudHJ5ID0gewotICogICAgICBlX3Byb2Nlc3NvciBwcm9jZXNzb3IgPSBlX3AzCi0gKiAgICAgIGVfdHlwZSB0eXBlID0gZV9pbnNuCi0gKiAgICAgIGNoYXIgKm5hbWUgPSAicGlnIgotICogICAgICB1aW50IHZhbHVlID0gMHgxCi0gKiAgICAgIHVpbnQgZmxhZ3MgPSAwCi0gKiAgICAgIHN0cnVjdCBpdGJsX3JhbmdlIHJhbmdlID0gMjQtMjEKLSAqICAgICAgc3RydWN0IGl0YmxfZmllbGQgKmZpZWxkID0gewotICogICAgICAgICAgICAgIGVfdHlwZSB0eXBlID0gZV9kcmVnCi0gKiAgICAgICAgICAgICAgc3RydWN0IGl0YmxfcmFuZ2UgcmFuZ2UgPSAyMC0xNgotICogICAgICAgICAgICAgIHN0cnVjdCBpdGJsX2ZpZWxkICpuZXh0ID0gewotICogICAgICAgICAgICAgICAgICAgICAgZV90eXBlIHR5cGUgPSBlX2ltbWVkCi0gKiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXRibF9yYW5nZSByYW5nZSA9IDE1LTAKLSAqICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpdGJsX2ZpZWxkICpuZXh0ID0gMAotICogICAgICAgICAgICAgICAgICAgICAgfTsKLSAqICAgICAgICAgICAgICB9OwotICogICAgICBzdHJ1Y3QgaXRibF9lbnRyeSAqbmV4dCA9IDAKLSAqICAgICAgfTsKLSAqCi0gKiBBbmQgdGhlIGFzc2VtYmxlciBpbnN0cnVjdGlvbnM6Ci0gKiAJInBpZyBkMiwweDEwMCIKLSAqIAkicGlnICQyLDB4MTAwIgotICoKLSAqIHdvdWxkIGJvdGggYXNzZW1ibGUgdG8gdGhlIGhleCB2YWx1ZToKLSAqIAkiMHg0ZTIyMDEwMCIKLSAqCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiaXRibC1vcHMuaCIKLSNpbmNsdWRlICJpdGJsLXBhcnNlLmgiCi0KLS8qICNkZWZpbmUgREVCVUcgKi8KLQotI2lmZGVmIERFQlVHCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZGVmaW5lIEFTU0VSVCh4KSBhc3NlcnQoeCkKLSNkZWZpbmUgREJHKHgpIHByaW50ZiB4Ci0jZWxzZQotI2RlZmluZSBBU1NFUlQoeCkKLSNkZWZpbmUgREJHKHgpCi0jZW5kaWYKLQotI2lmbmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKGE8Yj9hOmIpCi0jZW5kaWYKLQotaW50IGl0YmxfaGF2ZV9lbnRyaWVzID0gMDsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIHN0cnVjdHVyZXMgZm9yIGtlZXBpbmcgaXRibCBmb3JtYXQgZW50cmllcyAqLwotCi1zdHJ1Y3QgaXRibF9yYW5nZQotICB7Ci0gICAgaW50IHNiaXQ7CQkJLyogbWFzayBzdGFydGluZyBiaXQgcG9zaXRpb24gKi8KLSAgICBpbnQgZWJpdDsJCQkvKiBtYXNrIGVuZGluZyBiaXQgcG9zaXRpb24gKi8KLSAgfTsKLQotc3RydWN0IGl0YmxfZmllbGQKLSAgewotICAgIGVfdHlwZSB0eXBlOwkJLyogZHJlZy9jcmVnL2dyZWcvaW1tZWQvc3ltYiAqLwotICAgIHN0cnVjdCBpdGJsX3JhbmdlIHJhbmdlOwkvKiBmaWVsZCdzIGJpdGZpZWxkIHJhbmdlIHdpdGhpbiBpbnN0cnVjdGlvbiAqLwotICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CS8qIGZpZWxkIGZsYWdzICovCi0gICAgc3RydWN0IGl0YmxfZmllbGQgKm5leHQ7CS8qIG5leHQgZmllbGQgaW4gbGlzdCAqLwotICB9OwotCi0KLS8qIFRoZXNlIHN0cnVjdHVyZXMgZGVmaW5lIHRoZSBpbnN0cnVjdGlvbnMgYW5kIHJlZ2lzdGVycyBmb3IgYSBwcm9jZXNzb3IuCi0gKiBJZiB0aGUgdHlwZSBpcyBhbiBpbnN0cnVjdGlvbiwgdGhlIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBmb3JtYXQgb2YgYW4KLSAqIGluc3RydWN0aW9uIHdoZXJlIHRoZSBmaWVsZHMgYXJlIHRoZSBsaXN0IG9mIG9wZXJhbmRzLgotICogVGhlIGZsYWdzIGZpZWxkIGJlbG93IHVzZXMgdGhlIHNhbWUgdmFsdWVzIGFzIHRob3NlIGRlZmluZWQgaW4gdGhlCi0gKiBnbnUgYXNzZW1ibGVyIGFuZCBhcmUgbWFjaGluZSBzcGVjaWZpYy4gKi8KLXN0cnVjdCBpdGJsX2VudHJ5Ci0gIHsKLSAgICBlX3Byb2Nlc3NvciBwcm9jZXNzb3I7CS8qIHByb2Nlc3NvciBudW1iZXIgKi8KLSAgICBlX3R5cGUgdHlwZTsJCS8qIGRyZWcvY3JlZy9ncmVnL2luc24gKi8KLSAgICBjaGFyICpuYW1lOwkJCS8qIG1uZW1pb25pYyBuYW1lIGZvciBpbnNuL3JlZ2lzdGVyICovCi0gICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsJLyogb3Bjb2RlL2luc3RydWN0aW9uIG1hc2svcmVnaXN0ZXIgbnVtYmVyICovCi0gICAgdW5zaWduZWQgbG9uZyBmbGFnczsJLyogZWZmZWN0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKi8KLSAgICBzdHJ1Y3QgaXRibF9yYW5nZSByYW5nZTsJLyogYml0IHJhbmdlIHdpdGhpbiBpbnN0cnVjdGlvbiBmb3IgdmFsdWUgKi8KLSAgICBzdHJ1Y3QgaXRibF9maWVsZCAqZmllbGRzOwkvKiBsaXN0IG9mIG9wZXJhbmQgZGVmaW5pdGlvbnMgKGlmIGFueSkgKi8KLSAgICBzdHJ1Y3QgaXRibF9lbnRyeSAqbmV4dDsJLyogbmV4dCBlbnRyeSAqLwotICB9OwotCi0KLS8qIGxvY2FsIGRhdGEgYW5kIHN0cnVjdHVyZXMgKi8KLQotc3RhdGljIGludCBpdGJsX251bV9vcGNvZGVzID0gMDsKLS8qIEFycmF5IG9mIGVudHJpZXMgZm9yIGVhY2ggcHJvY2Vzc29yIGFuZCBlbnRyeSB0eXBlICovCi1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKmVudHJpZXNbZV9ucHJvY3NdW2VfbnR5cGVzXSA9Ci17Ci0gIHswLCAwLCAwLCAwLCAwLCAwfSwKLSAgezAsIDAsIDAsIDAsIDAsIDB9LAotICB7MCwgMCwgMCwgMCwgMCwgMH0sCi0gIHswLCAwLCAwLCAwLCAwLCAwfQotfTsKLQotLyogbG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgYnVpbGRfb3Bjb2RlIFBBUkFNUyAoKHN0cnVjdCBpdGJsX2VudHJ5ICplKSk7Ci1zdGF0aWMgZV90eXBlIGdldF90eXBlIFBBUkFNUyAoKGludCB5eXR5cGUpKTsKLXN0YXRpYyBlX3Byb2Nlc3NvciBnZXRfcHJvY2Vzc29yIFBBUkFNUyAoKGludCB5eXByb2MpKTsKLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqKmdldF9lbnRyaWVzIFBBUkFNUyAoKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgCi0JCQkJCQllX3R5cGUgdHlwZSkpOwotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICpmaW5kX2VudHJ5X2J5bmFtZSBQQVJBTVMgKChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIAotCQkJCQllX3R5cGUgdHlwZSwgY2hhciAqbmFtZSkpOwotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICpmaW5kX2VudHJ5X2J5dmFsIFBBUkFNUyAoKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgCi0JCQllX3R5cGUgdHlwZSwgdW5zaWduZWQgbG9uZyB2YWwsIHN0cnVjdCBpdGJsX3JhbmdlICpyKSk7Ci1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKmFsbG9jX2VudHJ5IFBBUkFNUyAoKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgCi0JCWVfdHlwZSB0eXBlLCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIHZhbHVlKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBhcHBseV9yYW5nZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIHZhbHVlLCAKLQkJCQkJCXN0cnVjdCBpdGJsX3JhbmdlIHIpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGV4dHJhY3RfcmFuZ2UgUEFSQU1TICgodW5zaWduZWQgbG9uZyB2YWx1ZSwgCi0JCQkJCQlzdHJ1Y3QgaXRibF9yYW5nZSByKSk7Ci1zdGF0aWMgc3RydWN0IGl0YmxfZmllbGQgKmFsbG9jX2ZpZWxkIFBBUkFNUyAoKGVfdHlwZSB0eXBlLCBpbnQgc2JpdCwgCi0JCQkJCWludCBlYml0LCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIEludGVyZmFjZXMgdG8gdGhlIHBhcnNlciAqLwotCi0KLS8qIE9wZW4gdGhlIHRhYmxlIGFuZCB1c2UgbGV4IGFuZCB5YWNjIHRvIHBhcnNlIHRoZSBlbnRyaWVzLgotICogUmV0dXJuIDEgZm9yIGZhaWx1cmU7IDAgZm9yIHN1Y2Nlc3MuICAqLwotCi1pbnQgCi1pdGJsX3BhcnNlIChjaGFyICppbnNudGJsKQotewotICBleHRlcm4gRklMRSAqeXlpbjsKLSAgZXh0ZXJuIGludCB5eXBhcnNlICh2b2lkKTsKLSAgeXlpbiA9IGZvcGVuIChpbnNudGJsLCAiciIpOwotICBpZiAoeXlpbiA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoIkNhbid0IG9wZW4gcHJvY2Vzc29yIGluc3RydWN0aW9uIHNwZWNpZmljYXRpb24gZmlsZSBcIiVzXCJcbiIsCi0JICAgICAgaW5zbnRibCk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAoeXlwYXJzZSAoKSk7Ci0gICAgfQotICBmY2xvc2UgKHl5aW4pOwotICBpdGJsX2hhdmVfZW50cmllcyA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBBZGQgYSByZWdpc3RlciBlbnRyeSAqLwotCi1zdHJ1Y3QgaXRibF9lbnRyeSAqCi1pdGJsX2FkZF9yZWcgKGludCB5eXByb2Nlc3NvciwgaW50IHl5dHlwZSwgY2hhciAqcmVnbmFtZSwKLQkgICAgICBpbnQgcmVnbnVtKQotewotI2lmIDAJCQkJCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzeW1ib2xzLmgiCi0gIC8qIFNpbmNlIHJlZ2lzdGVyIG5hbWVzIGRvbid0IGhhdmUgYSBwcmVmaXgsIHdlIHB1dCB0aGVtIGluIHRoZSBzeW1ib2wgdGFibGUgc28KLSAgICAgdGhleSBjYW4ndCBiZSB1c2VkIGFzIHN5bWJvbHMuICBUaGlzIGFsc28gc2ltcGxpZmllcyBhcmd1bWVudCBwYXJzaW5nIGFzCi0gICAgIHdlIGNhbiBsZXQgZ2FzIHBhcnNlIHJlZ2lzdGVycyBmb3IgdXMuICBUaGUgcmVjb3JkZWQgcmVnaXN0ZXIgbnVtYmVyIGlzCi0gICAgIHJlZ251bS4gICovCi0gIC8qIFVzZSBzeW1ib2xfY3JlYXRlIGhlcmUgaW5zdGVhZCBvZiBzeW1ib2xfbmV3IHNvIHdlIGRvbid0IHRyeSB0bwotICAgICBvdXRwdXQgcmVnaXN0ZXJzIGludG8gdGhlIG9iamVjdCBmaWxlJ3Mgc3ltYm9sIHRhYmxlLiAgKi8KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX2NyZWF0ZSAocmVnbmFtZSwgcmVnX3NlY3Rpb24sCi0JCQkJICAgICAgcmVnbnVtLCAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSNlbmRpZgotICByZXR1cm4gYWxsb2NfZW50cnkgKGdldF9wcm9jZXNzb3IgKHl5cHJvY2Vzc29yKSwgZ2V0X3R5cGUgKHl5dHlwZSksIHJlZ25hbWUsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKSByZWdudW0pOwotfQotCi0vKiBBZGQgYW4gaW5zdHJ1Y3Rpb24gZW50cnkgKi8KLQotc3RydWN0IGl0YmxfZW50cnkgKgotaXRibF9hZGRfaW5zbiAoaW50IHl5cHJvY2Vzc29yLCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIHZhbHVlLAotCSAgICAgICBpbnQgc2JpdCwgaW50IGViaXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICplOwotICBlID0gYWxsb2NfZW50cnkgKGdldF9wcm9jZXNzb3IgKHl5cHJvY2Vzc29yKSwgZV9pbnNuLCBuYW1lLCB2YWx1ZSk7Ci0gIGlmIChlKQotICAgIHsKLSAgICAgIGUtPnJhbmdlLnNiaXQgPSBzYml0OwotICAgICAgZS0+cmFuZ2UuZWJpdCA9IGViaXQ7Ci0gICAgICBlLT5mbGFncyA9IGZsYWdzOwotICAgICAgaXRibF9udW1fb3Bjb2RlcysrOwotICAgIH0KLSAgcmV0dXJuIGU7Ci19Ci0KLS8qIEFkZCBhbiBvcGVyYW5kIHRvIGFuIGluc3RydWN0aW9uIGVudHJ5ICovCi0KLXN0cnVjdCBpdGJsX2ZpZWxkICoKLWl0YmxfYWRkX29wZXJhbmQgKHN0cnVjdCBpdGJsX2VudHJ5ICplLCBpbnQgeXl0eXBlLCBpbnQgc2JpdCwKLQkJICBpbnQgZWJpdCwgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLSAgc3RydWN0IGl0YmxfZmllbGQgKmYsICoqbGFzdF9mOwotICBpZiAoIWUpCi0gICAgcmV0dXJuIDA7Ci0gIC8qIEFkZCB0byBlbmQgb2YgZmllbGRzJyBsaXN0LiAqLwotICBmID0gYWxsb2NfZmllbGQgKGdldF90eXBlICh5eXR5cGUpLCBzYml0LCBlYml0LCBmbGFncyk7Ci0gIGlmIChmKQotICAgIHsKLSAgICAgIGxhc3RfZiA9ICZlLT5maWVsZHM7Ci0gICAgICB3aGlsZSAoKmxhc3RfZikKLQlsYXN0X2YgPSAmKCpsYXN0X2YpLT5uZXh0OwotICAgICAgKmxhc3RfZiA9IGY7Ci0gICAgICBmLT5uZXh0ID0gMDsKLSAgICB9Ci0gIHJldHVybiBmOwotfQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBJbnRlcmZhY2VzIGZvciBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciAqLwotCi0jaWZuZGVmIFNUQU5EX0FMT05FCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzeW1ib2xzLmgiCi1zdGF0aWMgdm9pZCBhcHBlbmRfaW5zbnNfYXNfbWFjcm9zICh2b2lkKTsKLQotLyogaW5pdGlhbGl6ZSBmb3IgZ2FzICovCi12b2lkIAotaXRibF9pbml0ICh2b2lkKQotewotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZSwgKiplczsKLSAgZV9wcm9jZXNzb3IgcHJvY247Ci0gIGVfdHlwZSB0eXBlOwotCi0gIGlmICghaXRibF9oYXZlX2VudHJpZXMpCi0JcmV0dXJuOwotCi0gIC8qIFNpbmNlIHJlZ2lzdGVyIG5hbWVzIGRvbid0IGhhdmUgYSBwcmVmaXgsIHB1dCB0aGVtIGluIHRoZSBzeW1ib2wgdGFibGUgc28KLSAgICAgdGhleSBjYW4ndCBiZSB1c2VkIGFzIHN5bWJvbHMuICBUaGlzIHNpbXBsaWZpZXMgYXJndW1lbnQgcGFyc2luZyBhcwotICAgICB3ZSBjYW4gbGV0IGdhcyBwYXJzZSByZWdpc3RlcnMgZm9yIHVzLiAqLwotICAvKiBVc2Ugc3ltYm9sX2NyZWF0ZSBpbnN0ZWFkIG9mIHN5bWJvbF9uZXcgc28gd2UgZG9uJ3QgdHJ5IHRvCi0gICAgIG91dHB1dCByZWdpc3RlcnMgaW50byB0aGUgb2JqZWN0IGZpbGUncyBzeW1ib2wgdGFibGUuICAqLwotCi0gIGZvciAodHlwZSA9IGVfcmVndHlwZTA7IHR5cGUgPCBlX25yZWd0eXBlczsgdHlwZSsrKQotICAgIGZvciAocHJvY24gPSBlX3AwOyBwcm9jbiA8IGVfbnByb2NzOyBwcm9jbisrKQotICAgICAgewotCWVzID0gZ2V0X2VudHJpZXMgKHByb2NuLCB0eXBlKTsKLQlmb3IgKGUgPSAqZXM7IGU7IGUgPSBlLT5uZXh0KQotCSAgewotCSAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfY3JlYXRlIChlLT5uYW1lLCByZWdfc2VjdGlvbiwKLQkJCQkJICAgICBlLT52YWx1ZSwgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0JICB9Ci0gICAgICB9Ci0gIGFwcGVuZF9pbnNuc19hc19tYWNyb3MgKCk7Ci19Ci0KLQotLyogQXBwZW5kIGluc25zIHRvIG9wY29kZXMgdGFibGUgYW5kIGluY3JlYXNlIG51bWJlciBvZiBvcGNvZGVzIAotICogU3RydWN0dXJlIG9mIG9wY29kZXMgdGFibGU6IAotICogc3RydWN0IGl0Ymxfb3Bjb2RlCi0gKiB7Ci0gKiAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gKiAgIGNvbnN0IGNoYXIgKmFyZ3M7IAkJLSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgYXJndW1lbnRzLiAgCi0gKiAgIHVuc2lnbmVkIGxvbmcgbWF0Y2g7IAktIG9wY29kZSwgb3IgSVNBIGxldmVsIGlmIHBpbmZvPUlOU05fTUFDUk8gCi0gKiAgIHVuc2lnbmVkIGxvbmcgbWFzazsgCS0gb3Bjb2RlIG1hc2ssIG9yIG1hY3JvIGlkIGlmIHBpbmZvPUlOU05fTUFDUk8gCi0gKiAgIHVuc2lnbmVkIGxvbmcgcGluZm87IAktIGluc24gZmxhZ3MsIG9yIElOU05fTUFDUk8gCi0gKiB9OwotICogZXhhbXBsZXM6Ci0gKgl7ImxpIiwgICAgICAidCxpIiwgIDB4MzQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QgICAgfSwKLSAqCXsibGkiLCAgICAgICJ0LEkiLCAgMCwgICAgKGludCkgTV9MSSwgICBJTlNOX01BQ1JPICB9LAotICovCi0KLXN0YXRpYyBjaGFyICpmb3JtX2FyZ3MgKHN0cnVjdCBpdGJsX2VudHJ5ICplKTsKLXN0YXRpYyB2b2lkIAotYXBwZW5kX2luc25zX2FzX21hY3JvcyAodm9pZCkKLXsKLSAgc3RydWN0IElUQkxfT1BDT0RFX1NUUlVDVCAqbmV3X29wY29kZXMsICpvOwotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZSwgKiplczsKLSAgaW50IG4sIGlkLCBzaXplLCBuZXdfc2l6ZSwgbmV3X251bV9vcGNvZGVzOwotCi0gIGlmICghaXRibF9oYXZlX2VudHJpZXMpCi0JcmV0dXJuOwotCi0gIGlmICghaXRibF9udW1fb3Bjb2RlcykJLyogbm8gbmV3IGluc3RydWN0aW9ucyB0byBhZGQhICovCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgREJHICgoInByZXZpb3VzIG51bV9vcGNvZGVzPSVkXG4iLCBJVEJMX05VTV9PUENPREVTKSk7Ci0KLSAgbmV3X251bV9vcGNvZGVzID0gSVRCTF9OVU1fT1BDT0RFUyArIGl0YmxfbnVtX29wY29kZXM7Ci0gIEFTU0VSVCAobmV3X251bV9vcGNvZGVzID49IGl0YmxfbnVtX29wY29kZXMpOwotCi0gIHNpemUgPSBzaXplb2YgKHN0cnVjdCBJVEJMX09QQ09ERV9TVFJVQ1QpICogSVRCTF9OVU1fT1BDT0RFUzsKLSAgQVNTRVJUIChzaXplID49IDApOwotICBEQkcgKCgiSSBnZXQ9JWRcbiIsIHNpemUgLyBzaXplb2YgKElUQkxfT1BDT0RFU1swXSkpKTsKLQotICBuZXdfc2l6ZSA9IHNpemVvZiAoc3RydWN0IElUQkxfT1BDT0RFX1NUUlVDVCkgKiBuZXdfbnVtX29wY29kZXM7Ci0gIEFTU0VSVCAobmV3X3NpemUgPiBzaXplKTsKLQotICAvKiBGSVhNRSBzaW5jZSBJVEJMX09QQ09ERVMgY3VsZCBiZSBhIHN0YXRpYyB0YWJsZSwKLQkJd2UgY2FuJ3QgcmVhbGxvYyBvciBkZWxldGUgdGhlIG9sZCBtZW1vcnkuICovCi0gIG5ld19vcGNvZGVzID0gKHN0cnVjdCBJVEJMX09QQ09ERV9TVFJVQ1QgKikgbWFsbG9jIChuZXdfc2l6ZSk7Ci0gIGlmICghbmV3X29wY29kZXMpCi0gICAgewotICAgICAgcHJpbnRmIChfKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBuZXcgaW5zdHJ1Y3Rpb25zXG4iKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc2l6ZSkJCQkvKiBjb3B5IHByZXhpc3Rpbmcgb3Bjb2RlcyB0YWJsZSAqLwotICAgIG1lbWNweSAobmV3X29wY29kZXMsIElUQkxfT1BDT0RFUywgc2l6ZSk7Ci0KLSAgLyogRklYTUUhIHNvbWUgTlVNT1BDT0RFUyBhcmUgY2FsY3VsYXRlZCBleHByZXNzaW9ucy4KLQkJVGhlc2UgbmVlZCB0byBiZSBjaGFuZ2VkIGJlZm9yZSBpdGJscyBjYW4gYmUgc3VwcG9ydGVkLiAqLwotCi0gIGlkID0gSVRCTF9OVU1fTUFDUk9TOwkJLyogYmVnaW4gdGhlIG5leHQgbWFjcm8gaWQgYWZ0ZXIgdGhlIGxhc3QgKi8KLSAgbyA9ICZuZXdfb3Bjb2Rlc1tJVEJMX05VTV9PUENPREVTXTsJLyogYXBwZW5kIG1hY3JvIHRvIG9wY29kZXMgbGlzdCAqLwotICBmb3IgKG4gPSBlX3AwOyBuIDwgZV9ucHJvY3M7IG4rKykKLSAgICB7Ci0gICAgICBlcyA9IGdldF9lbnRyaWVzIChuLCBlX2luc24pOwotICAgICAgZm9yIChlID0gKmVzOyBlOyBlID0gZS0+bmV4dCkKLQl7Ci0JICAvKiBuYW1lLCAgICBhcmdzLCAgIG1hc2ssICAgICAgIG1hdGNoLCAgcGluZm8KLQkJICogeyJsaSIsICAgICAgInQsaSIsICAweDM0MDAwMDAwLCAweGZmZTAwMDAwLCBXUl90ICAgIH0sCi0JCSAqIHsibGkiLCAgICAgICJ0LEkiLCAgMCwgICAgKGludCkgTV9MSSwgICBJTlNOX01BQ1JPICB9LAotCQkgKiBDb25zdHJ1Y3QgYXJncyBmcm9tIGl0YmxfZmllbGRzLgotCQkqLwotCSAgby0+bmFtZSA9IGUtPm5hbWU7Ci0JICBvLT5hcmdzID0gc3RyZHVwIChmb3JtX2FyZ3MgKGUpKTsKLQkgIG8tPm1hc2sgPSBhcHBseV9yYW5nZSAoZS0+dmFsdWUsIGUtPnJhbmdlKTsKLQkgIC8qIEZJWE1FIGhvdyB0byBjYXRjaCBkdXJyaW5nIGFzc2VtYmx5PyAqLwotCSAgLyogbWFzayB0byBpZGVudGlmeSB0aGlzIGluc24gKi8KLQkgIG8tPm1hdGNoID0gYXBwbHlfcmFuZ2UgKGUtPnZhbHVlLCBlLT5yYW5nZSk7Ci0JICBvLT5waW5mbyA9IDA7Ci0KLSNpZmRlZiBVU0VfTUFDUk9TCi0JICBvLT5tYXNrID0gaWQrKzsJLyogRklYTUUgaG93IHRvIGNhdGNoIGR1cnJpbmcgYXNzZW1ibHk/ICovCi0JICBvLT5tYXRjaCA9IDA7CQkvKiBmb3IgbWFjcm9zLCB0aGUgaW5zbl9pc2EgbnVtYmVyICovCi0JICBvLT5waW5mbyA9IElOU05fTUFDUk87Ci0jZW5kaWYKLQotCSAgLyogRG9uJ3QgYWRkIGluc3RydWN0aW9ucyB3aGljaCBjYXVzZWQgYW4gZXJyb3IgKi8KLQkgIGlmIChvLT5hcmdzKQotCSAgICBvKys7Ci0JICBlbHNlCi0JICAgIG5ld19udW1fb3Bjb2Rlcy0tOwotCX0KLSAgICB9Ci0gIElUQkxfT1BDT0RFUyA9IG5ld19vcGNvZGVzOwotICBJVEJMX05VTV9PUENPREVTID0gbmV3X251bV9vcGNvZGVzOwotCi0gIC8qIEZJWE1FCi0JCUF0IHRoaXMgcG9pbnQsIHdlIGNhbiBmcmVlIHRoZSBlbnRyaWVzLCBhcyB0aGV5IHNob3VsZCBoYXZlCi0JCWJlZW4gYWRkZWQgdG8gdGhlIGFzc2VtYmxlcidzIHRhYmxlcy4KLQkJRG9uJ3QgZnJlZSBuYW1lIHRob3VnaCwgc2luY2UgbmFtZSBpcyBiZWluZyB1c2VkIGJ5IHRoZSBuZXcKLQkJb3Bjb2RlcyB0YWJsZS4KLQotCQlFdmVudHVhbGx5LCB3ZSBzaG91bGQgYWxzbyBmcmVlIHRoZSBuZXcgb3Bjb2RlcyB0YWJsZSBpdHNlbGYgCi0JCW9uIGV4aXQuCi0JKi8KLX0KLQotc3RhdGljIGNoYXIgKgotZm9ybV9hcmdzIChzdHJ1Y3QgaXRibF9lbnRyeSAqZSkKLXsKLSAgc3RhdGljIGNoYXIgc1szMV07Ci0gIGNoYXIgYyA9IDAsICpwID0gczsKLSAgc3RydWN0IGl0YmxfZmllbGQgKmY7Ci0KLSAgQVNTRVJUIChlKTsKLSAgZm9yIChmID0gZS0+ZmllbGRzOyBmOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGYtPnR5cGUpCi0JewotCWNhc2UgZV9kcmVnOgotCSAgYyA9ICdkJzsKLQkgIGJyZWFrOwotCWNhc2UgZV9jcmVnOgotCSAgYyA9ICd0JzsKLQkgIGJyZWFrOwotCWNhc2UgZV9ncmVnOgotCSAgYyA9ICdzJzsKLQkgIGJyZWFrOwotCWNhc2UgZV9pbW1lZDoKLQkgIGMgPSAnaSc7Ci0JICBicmVhazsKLQljYXNlIGVfYWRkcjoKLQkgIGMgPSAnYSc7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYyA9IDA7CQkvKiBpZ25vcmU7IHVua25vd24gZmllbGQgdHlwZSAqLwotCX0KLSAgICAgIGlmIChjKQotCXsKLQkgIGlmIChwICE9IHMpCi0JICAgICpwKysgPSAnLCc7Ci0JICAqcCsrID0gYzsKLQl9Ci0gICAgfQotICAqcCA9IDA7Ci0gIHJldHVybiBzOwotfQotI2VuZGlmIC8qICFTVEFORF9BTE9ORSAqLwotCi0KLS8qIEdldCBwcm9jZXNzb3IncyByZWdpc3RlciBuYW1lIGZyb20gdmFsICovCi0KLXVuc2lnbmVkIGxvbmcgCi1pdGJsX2dldF9yZWdfdmFsIChjaGFyICpuYW1lKQotewotICBlX3R5cGUgdDsKLSAgZV9wcm9jZXNzb3IgcDsKLSAgaW50IHIgPSAwOwotICBmb3IgKHAgPSBlX3AwOyBwIDwgZV9ucHJvY3M7IHArKykKLSAgICBmb3IgKHQgPSBlX3JlZ3R5cGUwOyB0IDwgZV9ucmVndHlwZXM7IHQrKykKLSAgICAgIHsKLQlpZiAociA9IGl0YmxfZ2V0X3ZhbCAocCwgdCwgbmFtZSksIHIpCi0JICByZXR1cm4gcjsKLSAgICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWNoYXIgKgotaXRibF9nZXRfbmFtZSAoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCBlX3R5cGUgdHlwZSwgdW5zaWduZWQgbG9uZyB2YWwpCi17Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICpyOwotICAvKiB0eXBlIGRlcGVuZHMgb24gaW5zdHJ1Y3Rpb24gcGFzc2VkICovCi0gIHIgPSBmaW5kX2VudHJ5X2J5dmFsIChwcm9jZXNzb3IsIHR5cGUsIHZhbCwgMCk7Ci0gIGlmIChyKQotICAgIHJldHVybiByLT5uYW1lOwotICBlbHNlCi0gICAgcmV0dXJuIDA7CQkJLyogZXJyb3I7IGludmFsaWQgb3BlcmFuZCAqLwotfQotCi0vKiBHZXQgcHJvY2Vzc29yJ3MgcmVnaXN0ZXIgdmFsdWUgZnJvbSBuYW1lICovCi0KLXVuc2lnbmVkIGxvbmcgCi1pdGJsX2dldF92YWwgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsIGNoYXIgKm5hbWUpCi17Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICpyOwotICAvKiB0eXBlIGRlcGVuZHMgb24gaW5zdHJ1Y3Rpb24gcGFzc2VkICovCi0gIHIgPSBmaW5kX2VudHJ5X2J5bmFtZSAocHJvY2Vzc29yLCB0eXBlLCBuYW1lKTsKLSAgaWYgKHIpCi0gICAgcmV0dXJuIHItPnZhbHVlOwotICBlbHNlCi0gICAgcmV0dXJuIDA7CQkJLyogZXJyb3I7IGludmFsaWQgb3BlcmFuZCAqLwotfQotCi0KLS8qIEFzc2VtYmxlIGluc3RydWN0aW9uICJuYW1lIiB3aXRoIG9wZXJhbmRzICJzIi4KLSAqIG5hbWUgLSBuYW1lIG9mIGluc3RydWN0aW9uCi0gKiBzIC0gb3BlcmFuZHMKLSAqIHJldHVybnMgLSBsb25nIHdvcmQgZm9yIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiAqLwotCi11bnNpZ25lZCBsb25nIAotaXRibF9hc3NlbWJsZSAoY2hhciAqbmFtZSwgY2hhciAqcykKLXsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICplOwotICBzdHJ1Y3QgaXRibF9maWVsZCAqZjsKLSAgY2hhciAqbjsKLSAgaW50IHByb2Nlc3NvcjsKLQotICBpZiAoIW5hbWUgfHwgISpuYW1lKQotICAgIHJldHVybiAwOwkJCS8qIGVycm9yISAgbXVzdCBoYXZlIGEgb3Bjb2RlIG5hbWUvZXhwciAqLwotCi0gIC8qIGZpbmQgZW50cnkgaW4gbGlzdCBvZiBpbnN0cnVjdGlvbnMgZm9yIGFsbCBwcm9jZXNzb3JzICovCi0gIGZvciAocHJvY2Vzc29yID0gMDsgcHJvY2Vzc29yIDwgZV9ucHJvY3M7IHByb2Nlc3NvcisrKQotICAgIHsKLSAgICAgIGUgPSBmaW5kX2VudHJ5X2J5bmFtZSAocHJvY2Vzc29yLCBlX2luc24sIG5hbWUpOwotICAgICAgaWYgKGUpCi0JYnJlYWs7Ci0gICAgfQotICBpZiAoIWUpCi0gICAgcmV0dXJuIDA7CQkJLyogb3Bjb2RlIG5vdCBpbiB0YWJsZTsgaW52YWxpZCBpbnN0cnVzdGlvbiAqLwotICBvcGNvZGUgPSBidWlsZF9vcGNvZGUgKGUpOwotCi0gIC8qIHBhcnNlIG9wY29kZSdzIGFyZ3MgKGlmIGFueSkgKi8KLSAgZm9yIChmID0gZS0+ZmllbGRzOyBmOyBmID0gZi0+bmV4dCkJLyogZm9yIGVhY2ggYXJnLCAuLi4gKi8KLSAgICB7Ci0gICAgICBzdHJ1Y3QgaXRibF9lbnRyeSAqcjsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgICBpZiAoIXMgfHwgISpzKQotCXJldHVybiAwOwkJLyogZXJyb3IgLSBub3QgZW5vdWdoIG9wZXJhbmRzICovCi0gICAgICBuID0gaXRibF9nZXRfZmllbGQgKCZzKTsKLSAgICAgIC8qIG4gc2hvdWxkIGJlIGluIGZvcm0gJG4gb3IgMHhoaGggKGFyZSBzeW1ib2wgbmFtZXMgdmFsaWQ/PyAqLwotICAgICAgc3dpdGNoIChmLT50eXBlKQotCXsKLQljYXNlIGVfZHJlZzoKLQljYXNlIGVfY3JlZzoKLQljYXNlIGVfZ3JlZzoKLQkgIC8qIEFjY2VwdCBlaXRoZXIgYSBzdHJpbmcgbmFtZQotCQkJICogb3IgJyQnIGZvbGxvd2VkIGJ5IHRoZSByZWdpc3RlciBudW1iZXIgKi8KLQkgIGlmICgqbiA9PSAnJCcpCi0JICAgIHsKLQkgICAgICBuKys7Ci0JICAgICAgdmFsdWUgPSBzdHJ0b2wgKG4sIDAsIDEwKTsKLQkgICAgICAvKiBGSVhNRSEgY291bGQgaGF2ZSAiMGwiLi4uIHRoZW4gd2hhdD8/ICovCi0JICAgICAgaWYgKHZhbHVlID09IDAgJiYgKm4gIT0gJzAnKQotCQlyZXR1cm4gMDsJLyogZXJyb3I7IGludmFsaWQgb3BlcmFuZCAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByID0gZmluZF9lbnRyeV9ieW5hbWUgKGUtPnByb2Nlc3NvciwgZi0+dHlwZSwgbik7Ci0JICAgICAgaWYgKHIpCi0JCXZhbHVlID0gci0+dmFsdWU7Ci0JICAgICAgZWxzZQotCQlyZXR1cm4gMDsJLyogZXJyb3I7IGludmFsaWQgb3BlcmFuZCAqLwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIGVfYWRkcjoKLQkgIC8qIHVzZSBhc3NlbWJsZXIncyBzeW1ib2wgdGFibGUgdG8gZmluZCBzeW1ib2wgKi8KLQkgIC8qIEZJWE1FISEgRG8gd2UgbmVlZCB0aGlzPwotCQkJCWlmIHNvLCB3aGF0IGFib3V0IHJlbG9jcz8/Ci0JCQkJbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkJCQlyZXR1cm4gMDsJLy0qIGVycm9yOyBpbnZhbGlkIG9wZXJhbmQgKi0vCi0JCQkJYnJlYWs7Ci0JCQkqLwotCSAgLyogSWYgbm90IGEgc3ltYm9sLCBmYWxsIHRocnUgdG8gSU1NRUQgKi8KLQljYXNlIGVfaW1tZWQ6Ci0JICBpZiAoKm4gPT0gJzAnICYmICoobiArIDEpID09ICd4JykJLyogaGV4IGJlZ2lucyAweC4uLiAqLwotCSAgICB7Ci0JICAgICAgbiArPSAyOwotCSAgICAgIHZhbHVlID0gc3RydG9sIChuLCAwLCAxNik7Ci0JICAgICAgLyogRklYTUUhIGNvdWxkIGhhdmUgIjB4bCIuLi4gdGhlbiB3aGF0Pz8gKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdmFsdWUgPSBzdHJ0b2wgKG4sIDAsIDEwKTsKLQkgICAgICAvKiBGSVhNRSEgY291bGQgaGF2ZSAiMGwiLi4uIHRoZW4gd2hhdD8/ICovCi0JICAgICAgaWYgKHZhbHVlID09IDAgJiYgKm4gIT0gJzAnKQotCQlyZXR1cm4gMDsJLyogZXJyb3I7IGludmFsaWQgb3BlcmFuZCAqLwotCSAgICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcmV0dXJuIDA7CQkvKiBlcnJvcjsgaW52YWxpZCBmaWVsZCBzcGVjICovCi0JfQotICAgICAgb3Bjb2RlIHw9IGFwcGx5X3JhbmdlICh2YWx1ZSwgZi0+cmFuZ2UpOwotICAgIH0KLSAgaWYgKHMgJiYgKnMpCi0gICAgcmV0dXJuIDA7CQkJLyogZXJyb3IgLSB0b28gbWFueSBvcGVyYW5kcyAqLwotICByZXR1cm4gb3Bjb2RlOwkJLyogZG9uZSEgKi8KLX0KLQotLyogRGlzYXNzZW1ibGUgaW5zdHJ1Y3Rpb24gImluc24iLgotICogaW5zbiAtIGluc3RydWN0aW9uCi0gKiBzIC0gYnVmZmVyIHRvIGhvbGQgZGlzYXNzZW1ibGVkIGluc3RydWN0aW9uCi0gKiByZXR1cm5zIC0gMSBpZiBzdWNjZWVkZWQ7IDAgaWYgZmFpbGVkCi0gKi8KLQotaW50IAotaXRibF9kaXNhc3NlbWJsZSAoY2hhciAqcywgdW5zaWduZWQgbG9uZyBpbnNuKQotewotICBlX3Byb2Nlc3NvciBwcm9jZXNzb3I7Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICplOwotICBzdHJ1Y3QgaXRibF9maWVsZCAqZjsKLQotICBpZiAoIUlUQkxfSVNfSU5TTiAoaW5zbikpCi0gICAgcmV0dXJuIDA7CQkJLyogZXJyb3IqLwotICBwcm9jZXNzb3IgPSBnZXRfcHJvY2Vzc29yIChJVEJMX0RFQ09ERV9QTlVNIChpbnNuKSk7Ci0KLSAgLyogZmluZCBlbnRyeSBpbiBsaXN0ICovCi0gIGUgPSBmaW5kX2VudHJ5X2J5dmFsIChwcm9jZXNzb3IsIGVfaW5zbiwgaW5zbiwgMCk7Ci0gIGlmICghZSkKLSAgICByZXR1cm4gMDsJCQkvKiBvcGNvZGUgbm90IGluIHRhYmxlOyBpbnZhbGlkIGluc3RydXN0aW9uICovCi0gIHN0cmNweSAocywgZS0+bmFtZSk7Ci0KLSAgLyogcGFyc2UgaW5zbidzIGFyZ3MgKGlmIGFueSkgKi8KLSAgZm9yIChmID0gZS0+ZmllbGRzOyBmOyBmID0gZi0+bmV4dCkJLyogZm9yIGVhY2ggYXJnLCAuLi4gKi8KLSAgICB7Ci0gICAgICBzdHJ1Y3QgaXRibF9lbnRyeSAqcjsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0KLSAgICAgIGlmIChmID09IGUtPmZpZWxkcykJLyogZmlyc3Qgb3BlcmFuZCBpcyBwcmVjZWVkZWQgYnkgdGFiICovCi0Jc3RyY2F0IChzLCAiXHQiKTsKLSAgICAgIGVsc2UJCQkvKiAnLCdzIHNlcGFyYXRlIGZvbGxvd2luZyBvcGVyYW5kcyAqLwotCXN0cmNhdCAocywgIiwiKTsKLSAgICAgIHZhbHVlID0gZXh0cmFjdF9yYW5nZSAoaW5zbiwgZi0+cmFuZ2UpOwotICAgICAgLyogbiBzaG91bGQgYmUgaW4gZm9ybSAkbiBvciAweGhoaCAoYXJlIHN5bWJvbCBuYW1lcyB2YWxpZD8/ICovCi0gICAgICBzd2l0Y2ggKGYtPnR5cGUpCi0JewotCWNhc2UgZV9kcmVnOgotCWNhc2UgZV9jcmVnOgotCWNhc2UgZV9ncmVnOgotCSAgLyogQWNjZXB0IGVpdGhlciBhIHN0cmluZyBuYW1lCi0JCQkgKiBvciAnJCcgZm9sbG93ZWQgYnkgdGhlIHJlZ2lzdGVyIG51bWJlciAqLwotCSAgciA9IGZpbmRfZW50cnlfYnl2YWwgKGUtPnByb2Nlc3NvciwgZi0+dHlwZSwgdmFsdWUsICZmLT5yYW5nZSk7Ci0JICBpZiAocikKLQkgICAgc3RyY2F0IChzLCByLT5uYW1lKTsKLQkgIGVsc2UKLQkgICAgc3ByaW50ZiAocywgIiVzJCVkIiwgcywgdmFsdWUpOwotCSAgYnJlYWs7Ci0JY2FzZSBlX2FkZHI6Ci0JICAvKiB1c2UgYXNzZW1ibGVyJ3Mgc3ltYm9sIHRhYmxlIHRvIGZpbmQgc3ltYm9sICovCi0JICAvKiBGSVhNRSEhIERvIHdlIG5lZWQgdGhpcz8KLQkJCSAqICAgaWYgc28sIHdoYXQgYWJvdXQgcmVsb2NzPz8KLQkJCSovCi0JICAvKiBJZiBub3QgYSBzeW1ib2wsIGZhbGwgdGhydSB0byBJTU1FRCAqLwotCWNhc2UgZV9pbW1lZDoKLQkgIHNwcmludGYgKHMsICIlczB4JXgiLCBzLCB2YWx1ZSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcmV0dXJuIDA7CQkvKiBlcnJvcjsgaW52YWxpZCBmaWVsZCBzcGVjICovCi0JfQotICAgIH0KLSAgcmV0dXJuIDE7CQkJLyogZG9uZSEgKi8KLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qCi0gKiBMb2NhbCBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBwcml2YXRlIHN0cnVjdHVyZXMgY29udGFpbmluZwotICogdGhlIG5hbWVzIGFuZCBmb3JtYXQgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zIGFuZCByZWdpc3RlcnMKLSAqIGZvciBlYWNoIHByb2Nlc3Nvci4KLSAqLwotCi0vKiBDYWxjdWxhdGUgaW5zdHJ1Y3Rpb24ncyBvcGNvZGUgYW5kIGZ1bmN0aW9uIHZhbHVlcyBmcm9tIGVudHJ5ICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIAotYnVpbGRfb3Bjb2RlIChzdHJ1Y3QgaXRibF9lbnRyeSAqZSkKLXsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0KLSAgb3Bjb2RlID0gYXBwbHlfcmFuZ2UgKGUtPnZhbHVlLCBlLT5yYW5nZSk7Ci0gIG9wY29kZSB8PSBJVEJMX0VOQ09ERV9QTlVNIChlLT5wcm9jZXNzb3IpOwotICByZXR1cm4gb3Bjb2RlOwotfQotCi0vKiBDYWxjdWxhdGUgYWJzb2x1dGUgdmFsdWUgZ2l2ZW4gdGhlIHJlbGF0aXZlIHZhbHVlIGFuZCBiaXQgcG9zaXRpb24gcmFuZ2UKLSAqIHdpdGhpbiB0aGUgaW5zdHJ1Y3Rpb24uCi0gKiBUaGUgcmFuZ2UgaXMgaW5jbHVzaXZlIHdoZXJlIDAgaXMgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LgotICogQSByYW5nZSBvZiB7IDI0LCAyMCB9IHdpbGwgaGF2ZSBhIG1hc2sgb2YKLSAqIGJpdCAgIDMgICAgICAgICAgIDIgICAgICAgICAgICAxCi0gKiBwb3M6IDEwOTggNzY1NCAzMjEwIDk4NzYgNTQzMiAxMDk4IDc2NTQgMzIxMAotICogYmluOiAwMDAwIDAwMDEgMTExMSAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAKLSAqIGhleDogICAgMCAgICAxICAgIGYgICAgMCAgICAwICAgIDAgICAgMCAgICAwCi0gKiBtYXNrOiAweDAxZjAwMDAwLgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIAotYXBwbHlfcmFuZ2UgKHVuc2lnbmVkIGxvbmcgcnZhbCwgc3RydWN0IGl0YmxfcmFuZ2UgcikKLXsKLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotICB1bnNpZ25lZCBsb25nIGF2YWw7Ci0gIGludCBsZW4gPSBNQVhfQklUUE9TIC0gci5zYml0OwotCi0gIEFTU0VSVCAoci5zYml0ID49IHIuZWJpdCk7Ci0gIEFTU0VSVCAoTUFYX0JJVFBPUyA+PSByLnNiaXQpOwotICBBU1NFUlQgKHIuZWJpdCA+PSAwKTsKLQotICAvKiBjcmVhdGUgbWFzayBieSB0cnVuY2F0aW5nIDFzIGJ5IHNoaWZ0aW5nICovCi0gIG1hc2sgPSAweGZmZmZmZmZmIDw8IGxlbjsKLSAgbWFzayA9IG1hc2sgPj4gbGVuOwotICBtYXNrID0gbWFzayA+PiByLmViaXQ7Ci0gIG1hc2sgPSBtYXNrIDw8IHIuZWJpdDsKLQotICBhdmFsID0gKHJ2YWwgPDwgci5lYml0KSAmIG1hc2s7Ci0gIHJldHVybiBhdmFsOwotfQotCi0vKiBDYWxjdWxhdGUgcmVsYXRpdmUgdmFsdWUgZ2l2ZW4gdGhlIGFic29sdXRlIHZhbHVlIGFuZCBiaXQgcG9zaXRpb24gcmFuZ2UKLSAqIHdpdGhpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyAKLWV4dHJhY3RfcmFuZ2UgKHVuc2lnbmVkIGxvbmcgYXZhbCwgc3RydWN0IGl0YmxfcmFuZ2UgcikKLXsKLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotICB1bnNpZ25lZCBsb25nIHJ2YWw7Ci0gIGludCBsZW4gPSBNQVhfQklUUE9TIC0gci5zYml0OwotCi0gIC8qIGNyZWF0ZSBtYXNrIGJ5IHRydW5jYXRpbmcgMXMgYnkgc2hpZnRpbmcgKi8KLSAgbWFzayA9IDB4ZmZmZmZmZmYgPDwgbGVuOwotICBtYXNrID0gbWFzayA+PiBsZW47Ci0gIG1hc2sgPSBtYXNrID4+IHIuZWJpdDsKLSAgbWFzayA9IG1hc2sgPDwgci5lYml0OwotCi0gIHJ2YWwgPSAoYXZhbCAmIG1hc2spID4+IHIuZWJpdDsKLSAgcmV0dXJuIHJ2YWw7Ci19Ci0KLS8qIEV4dHJhY3QgcHJvY2Vzc29yJ3MgYXNzZW1ibHkgaW5zdHJ1Y3Rpb24gZmllbGQgbmFtZSBmcm9tIHM7Ci0gKiBmb3JtcyBhcmUgIm4gYXJncyIgIm4sYXJncyIgb3IgIm4iICovCi0vKiBSZXR1cm4gbmV4dCBhcmd1bWVudCBmcm9tIHN0cmluZyBwb2ludGVyICJzIiBhbmQgYWR2YW5jZSBzLgotICogZGVsaW1pdGVycyBhcmUgIiAsXDAiICovCi0KLWNoYXIgKgotaXRibF9nZXRfZmllbGQgKGNoYXIgKipTKQotewotICBzdGF0aWMgY2hhciBuWzEyOF07Ci0gIGNoYXIgKnAsICpwcywgKnM7Ci0gIGludCBsZW47Ci0KLSAgcyA9ICpTOwotICBpZiAoIXMgfHwgISpzKQotICAgIHJldHVybiAwOwotICBwID0gcyArIHN0cmxlbiAocyk7Ci0gIGlmIChwcyA9IHN0cmNociAocywgJywnKSwgcHMpCi0gICAgcCA9IHBzOwotICBpZiAocHMgPSBzdHJjaHIgKHMsICcgJyksIHBzKQotICAgIHAgPSBtaW4gKHAsIHBzKTsKLSAgaWYgKHBzID0gc3RyY2hyIChzLCAnXDAnKSwgcHMpCi0gICAgcCA9IG1pbiAocCwgcHMpOwotICBpZiAocCA9PSAwKQotICAgIHJldHVybiAwOwkJCS8qIGVycm9yISAqLwotICBsZW4gPSBwIC0gczsKLSAgQVNTRVJUICgxMjggPiBsZW4gKyAxKTsKLSAgc3RybmNweSAobiwgcywgbGVuKTsKLSAgbltsZW5dID0gMDsKLSAgaWYgKHNbbGVuXSA9PSAnXDAnKQotICAgIHMgPSAwOwkJCS8qIG5vIG1vcmUgYXJncyAqLwotICBlbHNlCi0gICAgcyArPSBsZW4gKyAxOwkJLyogYWR2YW5jZSB0byBuZXh0IGFyZyAqLwotCi0gICpTID0gczsKLSAgcmV0dXJuIG47Ci19Ci0KLS8qIFNlYXJjaCBlbnRyaWVzIGZvciBhIGdpdmVuIHByb2Nlc3NvciBhbmQgdHlwZQotICogdG8gZmluZCBvbmUgbWF0Y2hpbmcgdGhlIG5hbWUgIm4iLgotICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZW50cnkgKi8KLQotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICoKLWZpbmRfZW50cnlfYnluYW1lIChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsCi0JCSAgIGVfdHlwZSB0eXBlLCBjaGFyICpuKQotewotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZSwgKiplczsKLQotICBlcyA9IGdldF9lbnRyaWVzIChwcm9jZXNzb3IsIHR5cGUpOwotICBmb3IgKGUgPSAqZXM7IGU7IGUgPSBlLT5uZXh0KQkvKiBmb3IgZWFjaCBlbnRyeSwgLi4uICovCi0gICAgewotICAgICAgaWYgKCFzdHJjbXAgKGUtPm5hbWUsIG4pKQotCXJldHVybiBlOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNlYXJjaCBlbnRyaWVzIGZvciBhIGdpdmVuIHByb2Nlc3NvciBhbmQgdHlwZQotICogdG8gZmluZCBvbmUgbWF0Y2hpbmcgdGhlIHZhbHVlICJ2YWwiIGZvciB0aGUgcmFuZ2UgInIiLgotICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZW50cnkuCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIGRpc2Fzc2VtYmxpbmcgZmllbGRzIG9mIGFuIGluc3RydWN0aW9uLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqCi1maW5kX2VudHJ5X2J5dmFsIChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLAotCQkgIHVuc2lnbmVkIGxvbmcgdmFsLCBzdHJ1Y3QgaXRibF9yYW5nZSAqcikKLXsKLSAgc3RydWN0IGl0YmxfZW50cnkgKmUsICoqZXM7Ci0gIHVuc2lnbmVkIGxvbmcgZXZhbDsKLQotICBlcyA9IGdldF9lbnRyaWVzIChwcm9jZXNzb3IsIHR5cGUpOwotICBmb3IgKGUgPSAqZXM7IGU7IGUgPSBlLT5uZXh0KQkvKiBmb3IgZWFjaCBlbnRyeSwgLi4uICovCi0gICAgewotICAgICAgaWYgKHByb2Nlc3NvciAhPSBlLT5wcm9jZXNzb3IpCi0JY29udGludWU7Ci0gICAgICAvKiBGb3IgaW5zbnMsIHdlIG1pZ2h0IG5vdCBrbm93IHRoZSByYW5nZSBvZiB0aGUgb3Bjb2RlLAotCSAqIHNvIGEgcmFuZ2Ugb2YgMCB3aWxsIGFsbG93IHRoaXMgcm91dGluZSB0byBtYXRjaCBhZ2FpbnN0Ci0JICogdGhlIHJhbmdlIG9mIHRoZSBlbnRyeSB0byBiZSBjb21wYXJlZCB3aXRoLgotCSAqIFRoaXMgY291bGQgY2F1c2UgYW1iaWd1aXRpZXMuCi0JICogRm9yIG9wZXJhbmRzLCB3ZSBnZXQgYW4gZXh0cmFjdGVkIHZhbHVlIGFuZCBhIHJhbmdlLgotCSAqLwotICAgICAgLyogaWYgcmFuZ2UgaXMgMCwgbWFzayB2YWwgYWdhaW5zdCB0aGUgcmFuZ2Ugb2YgdGhlIGNvbXBhcmVkIGVudHJ5LiAqLwotICAgICAgaWYgKHIgPT0gMCkJCS8qIGlmIG5vIHJhbmdlIHBhc3NlZCwgbXVzdCBiZSB3aG9sZSAzMi1iaXRzCi0JCQkgKiBzbyBjcmVhdGUgMzItYml0IHZhbHVlIGZyb20gZW50cnkncyByYW5nZSAqLwotCXsKLQkgIGV2YWwgPSBhcHBseV9yYW5nZSAoZS0+dmFsdWUsIGUtPnJhbmdlKTsKLQkgIHZhbCAmPSBhcHBseV9yYW5nZSAoMHhmZmZmZmZmZiwgZS0+cmFuZ2UpOwotCX0KLSAgICAgIGVsc2UgaWYgKHItPnNiaXQgPT0gZS0+cmFuZ2Uuc2JpdCAmJiByLT5lYml0ID09IGUtPnJhbmdlLmViaXQKLQkgICAgICAgfHwgZS0+cmFuZ2Uuc2JpdCA9PSAwICYmIGUtPnJhbmdlLmViaXQgPT0gMCkKLQl7Ci0JICBldmFsID0gYXBwbHlfcmFuZ2UgKGUtPnZhbHVlLCAqcik7Ci0JICB2YWwgPSBhcHBseV9yYW5nZSAodmFsLCAqcik7Ci0JfQotICAgICAgZWxzZQotCWNvbnRpbnVlOwotICAgICAgaWYgKHZhbCA9PSBldmFsKQotCXJldHVybiBlOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGxpc3Qgb2YgZW50cmllcyBmb3IgYSBnaXZlbiBwcm9jZXNzb3IgYW5kIHR5cGUuICovCi0KLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqKgotZ2V0X2VudHJpZXMgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUpCi17Ci0gIHJldHVybiAmZW50cmllc1twcm9jZXNzb3JdW3R5cGVdOwotfQotCi0vKiBSZXR1cm4gYW4gaW50ZWdyYWwgdmFsdWUgZm9yIHRoZSBwcm9jZXNzb3IgcGFzc2VkIGZyb20geXlwYXJzZS4gKi8KLQotc3RhdGljIGVfcHJvY2Vzc29yIAotZ2V0X3Byb2Nlc3NvciAoaW50IHl5cHJvYykKLXsKLSAgLyogdHJhbnNsYXRlIGZyb20geWFjYydzIHByb2Nlc3NvciB0byBlbnVtICovCi0gIGlmICh5eXByb2MgPj0gZV9wMCAmJiB5eXByb2MgPCBlX25wcm9jcykKLSAgICByZXR1cm4gKGVfcHJvY2Vzc29yKSB5eXByb2M7Ci0gIHJldHVybiBlX2ludnByb2M7CQkvKiBlcnJvcjsgaW52YWxpZCBwcm9jZXNzb3IgKi8KLX0KLQotLyogUmV0dXJuIGFuIGludGVncmFsIHZhbHVlIGZvciB0aGUgZW50cnkgdHlwZSBwYXNzZWQgZnJvbSB5eXBhcnNlLiAqLwotCi1zdGF0aWMgZV90eXBlIAotZ2V0X3R5cGUgKGludCB5eXR5cGUpCi17Ci0gIHN3aXRjaCAoeXl0eXBlKQotICAgIHsKLSAgICAgIC8qIHRyYW5zbGF0ZSBmcm9tIHlhY2MncyB0eXBlIHRvIGVudW0gKi8KLSAgICBjYXNlIElOU046Ci0gICAgICByZXR1cm4gZV9pbnNuOwotICAgIGNhc2UgRFJFRzoKLSAgICAgIHJldHVybiBlX2RyZWc7Ci0gICAgY2FzZSBDUkVHOgotICAgICAgcmV0dXJuIGVfY3JlZzsKLSAgICBjYXNlIEdSRUc6Ci0gICAgICByZXR1cm4gZV9ncmVnOwotICAgIGNhc2UgQUREUjoKLSAgICAgIHJldHVybiBlX2FkZHI7Ci0gICAgY2FzZSBJTU1FRDoKLSAgICAgIHJldHVybiBlX2ltbWVkOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZV9pbnZ0eXBlOwkJLyogZXJyb3I7IGludmFsaWQgdHlwZSAqLwotICAgIH0KLX0KLQotCi0vKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBlbnRyeSAqLwotCi1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKgotYWxsb2NfZW50cnkgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsCi0JICAgICBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIHZhbHVlKQotewotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZSwgKiplczsKLSAgaWYgKCFuYW1lKQotICAgIHJldHVybiAwOwotICBlID0gKHN0cnVjdCBpdGJsX2VudHJ5ICopIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgaXRibF9lbnRyeSkpOwotICBpZiAoZSkKLSAgICB7Ci0gICAgICBtZW1zZXQgKGUsIDAsIHNpemVvZiAoc3RydWN0IGl0YmxfZW50cnkpKTsKLSAgICAgIGUtPm5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKHNpemVvZiAoc3RybGVuIChuYW1lKSkgKyAxKTsKLSAgICAgIGlmIChlLT5uYW1lKQotCXN0cmNweSAoZS0+bmFtZSwgbmFtZSk7Ci0gICAgICBlLT5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7Ci0gICAgICBlLT50eXBlID0gdHlwZTsKLSAgICAgIGUtPnZhbHVlID0gdmFsdWU7Ci0gICAgICBlcyA9IGdldF9lbnRyaWVzIChlLT5wcm9jZXNzb3IsIGUtPnR5cGUpOwotICAgICAgZS0+bmV4dCA9ICplczsKLSAgICAgICplcyA9IGU7Ci0gICAgfQotICByZXR1cm4gZTsKLX0KLQotLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gZW50cnkncyBmaWVsZCAqLwotCi1zdGF0aWMgc3RydWN0IGl0YmxfZmllbGQgKgotYWxsb2NfZmllbGQgKGVfdHlwZSB0eXBlLCBpbnQgc2JpdCwgaW50IGViaXQsCi0JICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotICBzdHJ1Y3QgaXRibF9maWVsZCAqZjsKLSAgZiA9IChzdHJ1Y3QgaXRibF9maWVsZCAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGl0YmxfZmllbGQpKTsKLSAgaWYgKGYpCi0gICAgewotICAgICAgbWVtc2V0IChmLCAwLCBzaXplb2YgKHN0cnVjdCBpdGJsX2ZpZWxkKSk7Ci0gICAgICBmLT50eXBlID0gdHlwZTsKLSAgICAgIGYtPnJhbmdlLnNiaXQgPSBzYml0OwotICAgICAgZi0+cmFuZ2UuZWJpdCA9IGViaXQ7Ci0gICAgICBmLT5mbGFncyA9IGZsYWdzOwotICAgIH0KLSAgcmV0dXJuIGY7Ci19CmRpZmYgLS1naXQgYS9nYXMvaXRibC1vcHMuaCBiL2dhcy9pdGJsLW9wcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTQ2ZWZmLi4wMDAwMDAwCi0tLSBhL2dhcy9pdGJsLW9wcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qIGl0Ymwtb3BzLmgKLSAgIENvcHlyaWdodCAoQykgMTk5NyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEV4dGVybmFsIGZ1bmN0aW9ucywgY29uc3RhbnRzIGFuZCBkZWZpbmVzIGZvciBpdGJsIHN1cHBvcnQgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIEluY2x1ZGUgZmlsZSBub3RlczogImV4cHIuaCIgbmVlZGVkIGJlZm9yZSB0YXJnLSouaCwKLSAqICJ0YXJnLWVudi5oIiBpbmNsdWRlcyB0aGUgY2hhaW4gb2YgdGFyZ2V0IGRlcGVuZGFudCBoZWFkZXJzLAotICogInRhcmctY3B1LmgiIGhhcyB0aGUgSEFWRV9JVEJMX0NQVSBkZWZpbmUsIGFuZAotICogYXMuaCBpbmNsdWRlcyB0aGVtIGFsbCAqLwotI2luY2x1ZGUgImFzLmgiCi0KLSNpZmRlZiBIQVZFX0lUQkxfQ1BVCi0jaW5jbHVkZSAiaXRibC1jcHUuaCIKLSNlbmRpZgotCi0vKiBEZWZhdWx0cyBmb3IgZGVmaW5pdGlvbnMgcmVxdWlyZWQgYnkgZ2VuZXJpYyBjb2RlICovCi0jaWZuZGVmIElUQkxfTlVNQkVSX09GX1BST0NFU1NPUlMKLSNkZWZpbmUgSVRCTF9OVU1CRVJfT0ZfUFJPQ0VTU09SUyAxCi0jZW5kaWYKLQotI2lmbmRlZiBJVEJMX01BWF9CSVRQT1MKLSNkZWZpbmUgSVRCTF9NQVhfQklUUE9TIDMxCi0jZW5kaWYKLQotI2lmbmRlZiBJVEJMX1RZUEUKLSNkZWZpbmUgSVRCTF9UWVBFIHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi0jaWZuZGVmIElUQkxfSVNfSU5TTgotI2RlZmluZSBJVEJMX0lTX0lOU04oaW5zbikgMQotI2VuZGlmCi0KLSNpZm5kZWYgSVRCTF9ERUNPREVfUE5VTQotI2RlZmluZSBJVEJMX0RFQ09ERV9QTlVNKGluc24pIDAKLSNlbmRpZgotCi0jaWZuZGVmIElUQkxfRU5DT0RFX1BOVU0KLSNkZWZpbmUgSVRCTF9FTkNPREVfUE5VTShwbnVtKSAwCi0jZW5kaWYKLQotdHlwZWRlZiBJVEJMX1RZUEUgdF9pbnNuOwotCi0vKiB0eXBlcyBvZiBlbnRyaWVzICovCi10eXBlZGVmIGVudW0KLSAgewotICAgIGVfaW5zbiwKLSAgICBlX2RyZWcsCi0gICAgZV9yZWd0eXBlMCA9IGVfZHJlZywKLSAgICBlX2NyZWcsCi0gICAgZV9ncmVnLAotICAgIGVfYWRkciwKLSAgICBlX25yZWd0eXBlcyA9IGVfZ3JlZyArIDEsCi0gICAgZV9pbW1lZCwKLSAgICBlX250eXBlcywKLSAgICBlX2ludnR5cGUJCQkvKiBpbnZhbGlkIHR5cGUgKi8KLSAgfSBlX3R5cGU7Ci0KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgZV9wMCwKLSAgICBlX25wcm9jcyA9IE5VTUJFUl9PRl9QUk9DRVNTT1JTLAotICAgIGVfaW52cHJvYwkJCS8qIGludmFsaWQgcHJvY2Vzc29yICovCi0gIH0gZV9wcm9jZXNzb3I7Ci0KLS8qIDAgbWVhbnMgYW4gaW5zdHJ1Y3Rpb24gdGFibGUgd2FzIG5vdCBzcGVjaWZpZWQuICovCi1leHRlcm4gaW50IGl0YmxfaGF2ZV9lbnRyaWVzOwotCi0vKiBUaGVzZSByb3V0aW5lcyBhcmUgdmlzaWJsZSB0byB0aGUgbWFpbiBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgKi8KLQotaW50IGl0YmxfcGFyc2UgUEFSQU1TICgoY2hhciAqaW5zbnRibCkpOwotdm9pZCBpdGJsX2luaXQgUEFSQU1TICgodm9pZCkpOwotY2hhciAqaXRibF9nZXRfZmllbGQgUEFSQU1TICgoY2hhciAqKnMpKTsKLXVuc2lnbmVkIGxvbmcgaXRibF9hc3NlbWJsZSBQQVJBTVMgKChjaGFyICpuYW1lLCBjaGFyICpvcGVyYW5kcykpOwotaW50IGl0YmxfZGlzYXNzZW1ibGUgUEFSQU1TICgoY2hhciAqc3RyLCB1bnNpZ25lZCBsb25nIGluc24pKTsKLWludCBpdGJsX3BhcnNlIFBBUkFNUyAoKGNoYXIgKnRibCkpOwkvKiBwYXJzZXMgaW5zbiB0YmwgKi8KLXVuc2lnbmVkIGxvbmcgaXRibF9nZXRfcmVnX3ZhbCBQQVJBTVMgKChjaGFyICpuYW1lKSk7Ci11bnNpZ25lZCBsb25nIGl0YmxfZ2V0X3ZhbCBQQVJBTVMgKChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLAotCQkJCSAgICBjaGFyICpuYW1lKSk7Ci1jaGFyICppdGJsX2dldF9uYW1lIFBBUkFNUyAoKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgdmFsKSk7Ci0KLS8qIFRoZXNlIHJvdXRpbmVzIGFyZSBjYWxsZWQgYnkgdGhlIHRhYmxlIHBhcnNlciB1c2VkIHRvIGJ1aWxkIHRoZQotICAgZHluYW1pYyBsaXN0IG9mIG5ldyBwcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIGFuZCByZWdpc3RlcnMuICovCi0KLXN0cnVjdCBpdGJsX2VudHJ5ICppdGJsX2FkZF9yZWcgUEFSQU1TICgoaW50IHl5cHJvYywgaW50IHl5dHlwZSwKLQkJCQkJIGNoYXIgKnJlZ25hbWUsIGludCByZWdudW0pKTsKLXN0cnVjdCBpdGJsX2VudHJ5ICppdGJsX2FkZF9pbnNuIFBBUkFNUyAoKGludCB5eXByb2MsIGNoYXIgKm5hbWUsCi0JICAgICB1bnNpZ25lZCBsb25nIHZhbHVlLCBpbnQgc2JpdCwgaW50IGViaXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0cnVjdCBpdGJsX2ZpZWxkICppdGJsX2FkZF9vcGVyYW5kIFBBUkFNUyAoKHN0cnVjdCBpdGJsX2VudHJ5ICogZSwgaW50IHl5dHlwZSwKLQkJCQkgIGludCBzYml0LCBpbnQgZWJpdCwgdW5zaWduZWQgbG9uZyBmbGFncykpOwpkaWZmIC0tZ2l0IGEvZ2FzL2l0YmwtcGFyc2UueSBiL2dhcy9pdGJsLXBhcnNlLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NjZlZTguLjAwMDAwMDAKLS0tIGEvZ2FzL2l0YmwtcGFyc2UueQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vKiBpdGJsLXBhcnNlLnkKLSAgIENvcHlyaWdodCAoQykgMTk5NyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSV7Ci0KLS8qIAotCi1ZYWNjIGdyYW1tYXIgZm9yIGluc3RydWN0aW9uIHRhYmxlIGVudHJpZXMuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1PcmlnaW5hbCBJbnN0cnVjdGlvbiB0YWJsZSBzcGVjaWZpY2F0aW9uIGRvY3VtZW50OgotCi0JICAgIE1JUFMgQ29wcm9jZXNzb3IgVGFibGUgU3BlY2lmaWNhdGlvbgotCSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGZvcm1hdCBvZiB0aGUgTUlQUyBjb3Byb2Nlc3NvciB0YWJsZS4gIFRoZQotdGFibGUgc3BlY2lmaWVzIGEgbGlzdCBvZiB2YWxpZCBmdW5jdGlvbnMsIGRhdGEgcmVnaXN0ZXJzIGFuZCBjb250cm9sCi1yZWdpc3RlcnMgdGhhdCBjYW4gYmUgdXNlZCBpbiBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMuICBUaGlzIGxpc3QsCi10b2dldGhlciB3aXRoIHRoZSBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiBjbGFzc2VzIGxpc3RlZCBiZWxvdywKLXNwZWNpZmllcyB0aGUgY29tcGxldGUgbGlzdCBvZiBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgdGhhdCB3aWxsCi1iZSByZWNvZ25pemVkIGFuZCBhc3NlbWJsZWQgYnkgdGhlIEdOVSBhc3NlbWJsZXIuICBJbiBlZmZlY3QsCi10aGlzIG1ha2VzIHRoZSBHTlUgYXNzZW1ibGVyIHRhYmxlLWRyaXZlbiwgd2hlcmUgdGhlIHRhYmxlIGlzCi1zcGVjaWZpZWQgYnkgdGhlIHByb2dyYW1tZXIuCi0KLVRoZSB0YWJsZSBpcyBhbiBvcmRpbmFyeSB0ZXh0IGZpbGUgdGhhdCB0aGUgR05VIGFzc2VtYmxlciByZWFkcyB3aGVuCi1pdCBzdGFydHMuICBVc2luZyB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHRhYmxlLCB0aGUgYXNzZW1ibGVyCi1nZW5lcmF0ZXMgYW4gaW50ZXJuYWwgbGlzdCBvZiB2YWxpZCBjb3Byb2Nlc3NvciByZWdpc3RlcnMgYW5kCi1mdW5jdGlvbnMuICBUaGUgYXNzZW1ibGVyIHVzZXMgdGhpcyBpbnRlcm5hbCBsaXN0IGluIGFkZGl0aW9uIHRvIHRoZQotc3RhbmRhcmQgTUlQUyByZWdpc3RlcnMgYW5kIGluc3RydWN0aW9ucyB3aGljaCBhcmUgYnVpbHQtaW4gdG8gdGhlIAotYXNzZW1ibGVyIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0KLVRvIHNwZWNpZnkgdGhlIGNvcHJvY2Vzc29yIHRhYmxlIHdoZW4gaW52b2tpbmcgdGhlIEdOVSBhc3NlbWJsZXIsIHVzZQotdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gIi0taXRibCBmaWxlIiwgd2hlcmUgZmlsZSBpcyB0aGUKLWNvbXBsZXRlIG5hbWUgb2YgdGhlIHRhYmxlLCBpbmNsdWRpbmcgcGF0aCBhbmQgZXh0ZW5zaW9uLgotCi1FeGFtcGxlczoKLQotCSAgICBnYXMgLXQgY29wLnRibCB0ZXN0LnMgLW8gdGVzdC5vCi0JICAgIGdhcyAtdCAvdXNyL2xvY2FsL2xpYi9jb3AudGJsIHRlc3QucyAtbyB0ZXN0Lm8KLQkgICAgZ2FzIC0taXRibCBkOlxnbnVcZGF0YVxjb3AudGJsIHRlc3QucyAtbyB0ZXN0Lm8KLQotT25seSBvbmUgdGFibGUgbWF5IGJlIHN1cHBsaWVkIGR1cmluZyBhIHNpbmdsZSBpbnZvY2F0aW9uIG9mCi10aGUgYXNzZW1ibGVyLgotCi0KLUluc3RydWN0aW9uIGNsYXNzZXMKLT09PT09PT09PT09PT09PT09PT0KLQotQmVsb3cgaXMgYSBsaXN0IG9mIHRoZSB2YWxpZCBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiBjbGFzc2VzIGZvcgotYW55IGdpdmVuIGNvcHJvY2Vzc29yICJ6Ii4gIFRoZXNlIGluc3RydWN0aW9ucyBhcmUgYWxyZWFkeSByZWNvZ25pemVkCi1ieSB0aGUgYXNzZW1ibGVyLCBhbmQgYXJlIGxpc3RlZCBoZXJlIG9ubHkgZm9yIHJlZmVyZW5jZS4KLQotQ2xhc3MgICBmb3JtYXQJICAgIAkgICAgCSAgICAgIGluc3RydWN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ2xhc3MxOgotCW9wIGJhc2UgcnQgb2Zmc2V0Ci0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIExXQ3ogcnQsb2Zmc2V0IChiYXNlKQotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBTV0N6IHJ0LG9mZnNldCAoYmFzZSkKLUNsYXNzMjoKLQlDT1B6IHN1YiBydCByZCAwCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIE1UQ3ogcnQscmQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgTUZDeiBydCxyZAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBDVEN6IHJ0LHJkCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIENGQ3ogcnQscmQKLUNsYXNzMzoKLQlDT1B6IENPIGNvZnVuCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIENPUHogY29mdW4KLUNsYXNzNDoKLQlDT1B6IEJDIGJyIG9mZnNldAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBCQ3pUIG9mZnNldAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBCQ3pGIG9mZnNldAotQ2xhc3M1OgotCUNPUHogc3ViIHJ0IHJkIDAKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgRE1GQ3ogcnQscmQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgRE1UQ3ogcnQscmQKLUNsYXNzNjoKLQlvcCBiYXNlIHJ0IG9mZnNldAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBMREN6IHJ0LG9mZnNldCAoYmFzZSkKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgU0RDeiBydCxvZmZzZXQgKGJhc2UpCi1DbGFzczc6Ci0JQ09QeiBCQyBiciBvZmZzZXQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgQkN6VEwgb2Zmc2V0Ci0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIEJDekZMIG9mZnNldAotCi1UaGUgY29wcm9jZXNzb3IgdGFibGUgZGVmaW5lcyBjb3Byb2Nlc3Nvci1zcGVjaWZpYyByZWdpc3RlcnMgdGhhdCBjYW4KLWJlIHVzZWQgd2l0aCBhbGwgb2YgdGhlIGFib3ZlIGNsYXNzZXMgb2YgaW5zdHJ1Y3Rpb25zLCB3aGVyZQotYXBwcm9wcmlhdGUuICBJdCBhbHNvIGRlZmluZXMgYWRkaXRpb25hbCBjb3Byb2Nlc3Nvci1zcGVjaWZpYwotZnVuY3Rpb25zIGZvciBDbGFzczMgKENPUHogY29mdW4pIGluc3RydWN0aW9ucywgVGh1cywgdGhlIHRhYmxlIGFsbG93cwotdGhlIHByb2dyYW1tZXIgdG8gdXNlIGNvbnZlbmllbnQgbW5lbW9uaWNzIGFuZCBvcGVyYW5kcyBmb3IgdGhlc2UKLWZ1bmN0aW9ucywgaW5zdGVhZCBvZiB0aGUgQ09QeiBtbWVubW9uaWMgYW5kIGNvZnVuIG9wZXJhbmQuCi0KLVRoZSBuYW1lcyBvZiB0aGUgTUlQUyBnZW5lcmFsIHJlZ2lzdGVycyBhbmQgdGhlaXIgYWxpYXNlcyBhcmUgZGVmaW5lZAotYnkgdGhlIGFzc2VtYmxlciBhbmQgd2lsbCBiZSByZWNvZ25pemVkIGFzIHZhbGlkIHJlZ2lzdGVyIG5hbWVzIGJ5IHRoZQotYXNzZW1ibGVyIHdoZW4gdXNlZCAod2hlcmUgYWxsb3dlZCkgaW4gY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zLgotSG93ZXZlciwgdGhlIG5hbWVzIGFuZCB2YWx1ZXMgb2YgYWxsIGNvcHJvY2Vzc29yIGRhdGEgYW5kIGNvbnRyb2wKLXJlZ2lzdGVyIG1uZW1vbmljcyBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgY29wcm9jZXNzb3IgdGFibGUuCi0KLQotVGFibGUgR3JhbW1hcgotPT09PT09PT09PT09PQotCi1IZXJlIGlzIHRoZSBncmFtbWFyIGZvciB0aGUgY29wcm9jZXNzb3IgdGFibGU6Ci0KLQkgICAgdGFibGUgLT4gZW50cnkqCi0KLQkgICAgZW50cnkgLT4gW3ogZW50cnlkZWZdIFtjb21tZW50XSAnXG4nCi0KLQkgICAgZW50cnlkZWYgLT4gdHlwZSBuYW1lIHZhbAotCSAgICBlbnRyeWRlZiAtPiAnaW5zbicgbmFtZSB2YWwgZnVuY2RlZiA7IHR5cGUgb2YgZW50cnkgKGluc3RydWN0aW9uKQotCi0JICAgIHogLT4gJ3AnWycwJy4uJzMnXQkgICAgCSAgICAgOyBwcm9jZXNzb3IgbnVtYmVyIAotCSAgICB0eXBlIC0+IFsnZHJlZycgfCAnY3JlZycgfCAnZ3JlZycgXQkgICAgIDsgdHlwZSBvZiBlbnRyeSAocmVnaXN0ZXIpCi0JOyAnZHJlZycsICdjcmVnJyBvciAnZ3JlZycgc3BlY2lmaWVzIGEgZGF0YSwgY29udHJvbCwgb3IgZ2VuZXJhbAotCTsJICAgIHJlZ2lzdGVyIG1uZW1vbmljLCByZXNwZWN0aXZlbHkKLQkgICAgbmFtZSAtPiBbbHRyfGRlY10qCSAgICAJICAgICA7IG1uZW1vbmljIG9mIHJlZ2lzdGVyL2Z1bmN0aW9uCi0JICAgIHZhbCAtPiBbZGVjfGhleF0JICAgIAkgICAgIDsgcmVnaXN0ZXIvZnVuY3Rpb24gbnVtYmVyIChpbnRlZ2VyIGNvbnN0YW50KQotCi0JICAgIGZ1bmNkZWYgLT4gZnJhbmdlIGZsYWdzIGZpZWxkcwotCSAgICAJICAgIAkgICAgCTsgYml0ZmllbGQgcmFuZ2UgZm9yIG9wY29kZQotCSAgICAJICAgIAkgICAgCTsgbGlzdCBvZiBmaWVsZHMnIGZvcm1hdHMKLQkgICAgZmllbGRzIC0+IGZpZWxkKgotCSAgICBmaWVsZCAtPiBbJywnXSBmdHlwZSBmcmFuZ2UgZmxhZ3MKLQkgICAgZmxhZ3MgLT4gWycqJyBmbGFnZXhwcl0KLQkgICAgZmxhZ2V4cHIgLT4gJ1snIGZsYWdleHByICddJwotCSAgICBmbGFnZXhwciAtPiB2YWwgJ3wnIGZsYWdleHByIAotCSAgICBmdHlwZSAtPiBbIHR5cGUgfCAnaW1tZWQnIHwgJ2FkZHInIF0KLQk7ICdpbW1lZCcgc3BlY2lmaWVzIGFuIGltbWVkaWF0ZSB2YWx1ZTsgc2VlIGdyYW1tYXIgZm9yICJ2YWwiIGFib3ZlCi0JICAgIAk7ICdhZGRyJyBzcGVjaWZpZXMgYSBDIGlkZW50aWZpZXI7IG5hbWUgb2Ygc3ltYm9sIHRvIGJlIHJlc29sdmVkIGF0IAotCTsJICAgIGxpbmsgdGltZQotCSAgICBmcmFuZ2UgLT4gJzonIHZhbCAnLScgdmFsCTsgc3RhcnRpbmcgdG8gZW5kaW5nIGJpdCBwb3NpdGlvbnMsIHdoZXJlCi0JICAgIAkgICAgCSAgICAJOyB3aGVyZSAwIGlzIGxlYXN0IHNpZ25pZmljYW50IGJpdAotCSAgICBmcmFuZ2UgLT4gKG51bGwpCSAgICAJOyBkZWZhdWx0IHJhbmdlIG9mIDMxLTAgd2lsbCBiZSBhc3N1bWVkCi0KLQkgICAgY29tbWVudCAtPiBbJzsnfCcjJ10gW2NoYXJdKgotCSAgICBjaGFyIC0+IGFueSBwcmludGFibGUgY2hhcmFjdGVyCi0JICAgIGx0ciAtPiBbJ2EnLi4neid8J0EnLi4nWiddIAotCSAgICBkZWMgLT4gWycwJy4uJzknXSoJICAgIAkgICAgCSAgICAJICAgIAkgICAgIDsgdmFsdWUgaW4gZGVjaW1hbAotCSAgICBoZXggLT4gJzB4J1snMCcuLic5JyB8ICdhJy4uJ2YnIHwgJ0EnLi4nRiddKgk7IHZhbHVlIGluIGhleGlkZWNpbWFsIAotCi0KLUV4YW1wbGVzCi09PT09PT09PQotCi1FeGFtcGxlIDE6Ci0KLVRoZSB0YWJsZToKLQotCSAgICBwMSBkcmVnIGQxIDEJICAgICA7IGRhdGEgcmVnaXN0ZXIgImQxIiBmb3IgQ09QMSBoYXMgdmFsdWUgMQotCSAgICBwMSBjcmVnIGMzIDMJICAgICA7IGN0cmwgcmVnaXN0ZXIgImMzIiBmb3IgQ09QMSBoYXMgdmFsdWUgMwotCSAgICBwMyBmdW5jIGZpbGwgMHgxZjoyNC0yMAkgICAgICA7IGZ1bmN0aW9uICJmaWxsIiBmb3IgQ09QMyBoYXMgdmFsdWUgMzEgYW5kIAotCSAgICAJICAgIAk7IG5vIGZpZWxkcwotCi13aWxsIGFsbG93IHRoZSBhc3NlbWJsZXIgdG8gYWNjZXB0IHRoZSBmb2xsb3dpbmcgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zOgotCi0JICAgIExXQzEgZDEsMHgxMDAgKCQyKQotCSAgICBmaWxsCi0KLUhlcmUsIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgIiQyIiwgYW5kIGluc3RydWN0aW9uICJMV0MxIiwgYXJlIHN0YW5kYXJkIAotbW5lbW9uaWNzIGJ1aWx0LWluIHRvIHRoZSBNSVBTIGFzc2VtYmxlci4gIAotCi0KLUV4YW1wbGUgMjoKLQotVGhlIHRhYmxlOgotCi0JICAgIHAzIGRyZWcgZDMgMwkgICAgIDsgZGF0YSByZWdpc3RlciAiZDMiIGZvciBDT1AzIGhhcyB2YWx1ZSAzCi0JICAgIHAzIGNyZWcgYzIgMjIJICAgICA7IGNvbnRyb2wgcmVnaXN0ZXIgImMyIiBmb3IgQ09QMyBoYXMgdmFsdWUgMjIKLQkgICAgcDMgZnVuYyBmZWUgMHgxZjoyNC0yMCBkcmVnOjE3LTEzIGNyZWc6MTItOCBpbW1lZDo3LTAgCi0JICAgIAk7IGZ1bmN0aW9uICJmZWUiIGZvciBDT1AzIGhhcyB2YWx1ZSAzMSwgYW5kIDMgZmllbGRzIAotCSAgICAJOyBjb25zaXN0aW5nIG9mIGEgZGF0YSByZWdpc3RlciwgYSBjb250cm9sIHJlZ2lzdGVyLCAKLQkgICAgCTsgYW5kIGFuIGltbWVkaWF0ZSB2YWx1ZS4KLQotd2lsbCBhbGxvdyB0aGUgYXNzZW1ibGVyIHRvIGFjY2VwdCB0aGUgZm9sbG93aW5nIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uOgotCi0JICAgIGZlZSBkMyxjMiwweDEKLQotYW5kIHdpbGwgZW1pdCB0aGUgb2JqZWN0IGNvZGU6Ci0KLQkgICAgMzEtMjYgIDI1IDI0LTIwIDE5LTE4ICAxNy0xMyAxMi04ICA3LTAKLQkgICAgQ09QeiAgIENPIGZ1bgkgICAgCSAgICAgIGRyZWcgIGNyZWcgIGltbWVkCi0JICAgIDAxMDAxMSAxICAxMTExMSAwMAkgICAgIDAwMDExIDEwMTEwIDAwMDAwMDAxIAotCi0JICAgIDB4NGZmMDc2MDEKLQotCi1FeGFtcGxlIDM6Ci0KLVRoZSB0YWJsZToKLQotCSAgICBwMyBkcmVnIGQzIDMJICAgICA7IGRhdGEgcmVnaXN0ZXIgImQzIiBmb3IgQ09QMyBoYXMgdmFsdWUgMwotCSAgICBwMyBjcmVnIGMyIDIyCSAgICAgOyBjb250cm9sIHJlZ2lzdGVyICJjMiIgZm9yIENPUDMgaGFzIHZhbHVlIDIyCi0JICAgIHAzIGZ1bmMgZnV1IDB4MDFmMDAwMDEgZHJlZzoxNy0xMyBjcmVnOjEyLTgKLQotd2lsbCBhbGxvdyB0aGUgYXNzZW1ibGVyIHRvIGFjY2VwdCB0aGUgZm9sbG93aW5nIGNvcHJvY2Vzc29yCi1pbnN0cnVjdGlvbjoKLQotCSAgICBmdXUgZDMsYzIKLQotYW5kIHdpbGwgZW1pdCB0aGUgb2JqZWN0IGNvZGU6Ci0KLQkgICAgMzEtMjYgIDI1IDI0LTIwIDE5LTE4ICAxNy0xMyAxMi04ICA3LTAKLQkgICAgQ09QeiAgIENPIGZ1bgkgICAgCSAgICAgIGRyZWcgIGNyZWcgIAotCSAgICAwMTAwMTEgMSAgMTExMTEgMDAJICAgICAwMDAxMSAxMDExMCAwMDAwMDAwMSAKLQotCSAgICAweDRmZjA3NjAxCi0KLUluIHRoaXMgd2F5LCB0aGUgcHJvZ3JhbW1lciBjYW4gZm9yY2UgYXJiaXRyYXJ5IGJpdHMgb2YgYW4gaW5zdHJ1Y3Rpb24KLXRvIGhhdmUgcHJlZGVmaW5lZCB2YWx1ZXMuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1BZGRpdGlvbmFsIG5vdGVzOgotCi1FbmNvZGluZyBvZiByYW5nZXM6Ci1UbyBoYW5kbGUgbW9yZSB0aGFuIG9uZSBiaXQgcG9zaXRpb24gcmFuZ2Ugd2l0aGluIGFuIGluc3RydWN0aW9uLAotdXNlIDBzIHRvIG1hc2sgb3V0IHRoZSByYW5nZXMgd2hpY2ggZG9uJ3QgYXBwbHkuCi1NYXkgZGVjaWRlIHRvIG1vZGlmeSB0aGUgc3ludGF4IHRvIGFsbG93IGNvbW1hcyBzZXBhcmF0ZSBtdWx0aXBsZSAKLXJhbmdlcyB3aXRoaW4gYW4gaW5zdHJ1Y3Rpb24gKHJhbmdlJywncmFuZ2UpLgotCi1DaGFuZ2VzIGluIGdyYW1tYXI6Ci0JVGhlIG51bWJlciBvZiBwYXJtcyBhcmd1bWVudCB0byB0aGUgZnVuY3Rpb24gZW50cnkKLXdhcyBkZWxldGVkIGZyb20gdGhlIG9yaWdpbmFsIGZvcm1hdCBzdWNoIHRoYXQgd2Ugbm93IGNvdW50IHRoZSBmaWVsZHMuCi0KLS0tLS0KLUZJWE1FISBzaG91bGQgcmVhbGx5IGNoYW5nZSBsZXhpY2FsIGFuYWx5emVyIAotdG8gcmVjb2duaXplICdkcmVnJyBldGMuIGluIGNvbnRleHQgc2Vuc2F0aXZlIHdheS4KLUN1cnJlbnRseSBmdW5jdGlvbiBuYW1lcyBvciBtbmVtb25pY3MgbWF5IGJlIGluY29ycmVjdGx5IHBhcnNlZCBhcyBrZXl3b3JkcwotCi1GSVhNRSEgaGV4IGlzIGFtYmlndW91cyB3aXRoIGFueSBkaWdpdAotCi0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJpdGJsLW9wcy5oIgotCi0vKiAjZGVmaW5lIERFQlVHICovCi0KLSNpZmRlZiBERUJVRwotI2lmbmRlZiBEQkdfTFZMCi0jZGVmaW5lIERCR19MVkwgMQotI2VuZGlmCi0jZWxzZQotI2RlZmluZSBEQkdfTFZMIDAKLSNlbmRpZgotCi0jaWYgREJHX0xWTCA+PSAxCi0jZGVmaW5lIERCRyh4KSBwcmludGYgeAotI2Vsc2UKLSNkZWZpbmUgREJHKHgpIAotI2VuZGlmCi0KLSNpZiBEQkdfTFZMID49IDIKLSNkZWZpbmUgREJHTDIoeCkgcHJpbnRmIHgKLSNlbHNlCi0jZGVmaW5lIERCR0wyKHgpIAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgc2JpdCwgZWJpdDsKLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqaW5zbj0wOwotZXh0ZXJuIGludCBpbnNudGJsX2xpbmU7Ci1pbnQgeXlwYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1pbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0lfQotCi0ldW5pb24gCi0gIHsKLSAgICBjaGFyICpzdHI7Ci0gICAgaW50IG51bTsKLSAgICBpbnQgcHJvY2Vzc29yOwotICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotICB9Ci0KLSV0b2tlbgkgICAgRFJFRyBDUkVHIEdSRUcgSU1NRUQgQUREUiBJTlNOIE5VTSBJRCBOTCBQTlVNCi0ldHlwZQkgICAgPHZhbD4gdmFsdWUgZmxhZ3MgZmxhZ2V4cHIKLSV0eXBlCSAgICA8bnVtPiBudW1iZXIgTlVNIGZ0eXBlIHJlZ3R5cGUgcG51bSBQTlVNCi0ldHlwZQkgICAgPHN0cj4gSUQgbmFtZQotCi0lc3RhcnQgaW5zbnRibAotCi0lJQotCi1pbnNudGJsOgotCWVudHJ5cwotCTsKLQotZW50cnlzOgotCWVudHJ5IGVudHJ5cwotCXwKLQk7Ci0KLWVudHJ5OgotCXBudW0gcmVndHlwZSBuYW1lIHZhbHVlIE5MCi0JICB7Ci0JICAgIERCRyAoKCJsaW5lICVkOiBlbnRyeSBwbnVtPSVkIHR5cGU9JWQgbmFtZT0lcyB2YWx1ZT14JXhcbiIsIAotCSAgICAJICAgIGluc250YmxfbGluZSwgJDEsICQyLCAkMywgJDQpKTsKLQkgICAgaXRibF9hZGRfcmVnICgkMSwgJDIsICQzLCAkNCk7Ci0JICB9Ci0JfCBwbnVtIElOU04gbmFtZSB2YWx1ZSByYW5nZSBmbGFncwotCSAgewotCSAgICBEQkcgKCgibGluZSAlZDogZW50cnkgcG51bT0lZCB0eXBlPUlOU04gbmFtZT0lcyB2YWx1ZT14JXgiLAotCSAgICAJICAgIGluc250YmxfbGluZSwgJDEsICQzLCAkNCkpOwotCSAgICBEQkcgKCgiIHNiaXQ9JWQgZWJpdD0lZCBmbGFncz0weCV4XG4iLCBzYml0LCBlYml0LCAkNikpOwotCSAgICBpbnNuPWl0YmxfYWRkX2luc24gKCQxLCAkMywgJDQsIHNiaXQsIGViaXQsICQ2KTsKLQkgIH0KLQlmaWVsZHNwZWNzIE5MCi0JfCBOTAotCXwgZXJyb3IgTkwKLQk7Ci0KLWZpZWxkc3BlY3M6Ci0JJywnIGZpZWxkc3BlYyBmaWVsZHNwZWNzCi0JfCBmaWVsZHNwZWMgZmllbGRzcGVjcwotCXwKLQk7Ci0KLWZ0eXBlOgotCXJlZ3R5cGUgCi0JICB7Ci0JICAgIERCR0wyICgoImZ0eXBlXG4iKSk7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCBBRERSIAotCSAgewotCSAgICBEQkdMMiAoKCJhZGRyXG4iKSk7Ci0JICAgICQkID0gQUREUjsKLQkgIH0KLQl8IElNTUVECi0JICB7Ci0JICAgIERCR0wyICgoImltbWVkXG4iKSk7Ci0JICAgICQkID0gSU1NRUQ7Ci0JICB9Ci0JOwotCi1maWVsZHNwZWM6Ci0JZnR5cGUgcmFuZ2UgZmxhZ3MKLQkgIHsKLQkgICAgREJHICgoImxpbmUgJWQ6IGZpZWxkIHR5cGU9JWQgc2JpdD0lZCBlYml0PSVkLCBmbGFncz0weCV4XG4iLCAKLQkgICAgCSAgICBpbnNudGJsX2xpbmUsICQxLCBzYml0LCBlYml0LCAkMykpOwotCSAgICBpdGJsX2FkZF9vcGVyYW5kIChpbnNuLCAkMSwgc2JpdCwgZWJpdCwgJDMpOwotCSAgfQotCTsKLQotZmxhZ2V4cHI6Ci0JTlVNICd8JyBmbGFnZXhwcgotCSAgewotCSAgICAkJCA9ICQxIHwgJDM7Ci0JICB9Ci0JfCAnWycgZmxhZ2V4cHIgJ10nCi0JICB7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JfCBOVU0KLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLWZsYWdzOgotCScqJyBmbGFnZXhwcgotCSAgewotCSAgICBEQkdMMiAoKCJmbGFncz0lZFxuIiwgJDIpKTsKLQkgICAgJCQgPSAkMjsKLQkgIH0KLQl8IAotCSAgewotCSAgICAkJCA9IDA7Ci0JICB9Ci0JOwotCi1yYW5nZToKLQknOicgTlVNICctJyBOVU0KLQkgIHsKLQkgICAgREJHTDIgKCgicmFuZ2UgJWQgJWRcbiIsICQyLCAkNCkpOwotCSAgICBzYml0ID0gJDI7Ci0JICAgIGViaXQgPSAkNDsKLQkgIH0KLQl8Ci0JICB7Ci0JICAgIHNiaXQgPSAzMTsKLQkgICAgZWJpdCA9IDA7Ci0JICB9Ci0JOwotCSAgICAKLXBudW06Ci0JUE5VTQotCSAgewotCSAgICBEQkdMMiAoKCJwbnVtPSVkXG4iLCQxKSk7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotCi1yZWd0eXBlOgotCSAgICAgRFJFRwotCSAgewotCSAgICBEQkdMMiAoKCJkcmVnXG4iKSk7Ci0JICAgICQkID0gRFJFRzsKLQkgIH0KLQl8IENSRUcKLQkgIHsKLQkgICAgREJHTDIgKCgiY3JlZ1xuIikpOwotCSAgICAkJCA9IENSRUc7Ci0JICB9Ci0JfCBHUkVHCi0JICB7Ci0JICAgIERCR0wyICgoImdyZWdcbiIpKTsKLQkgICAgJCQgPSBHUkVHOwotCSAgfQotCTsKLQotbmFtZToKLQlJRAotCSAgewotCSAgICBEQkdMMiAoKCJuYW1lPSVzXG4iLCQxKSk7Ci0JICAgICQkID0gJDE7IAotCSAgfQotCTsKLQotbnVtYmVyOgotCU5VTQotCSAgewotCSAgICBEQkdMMiAoKCJudW09JWRcbiIsJDEpKTsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLXZhbHVlOgotCU5VTQotCSAgewotCSAgICBEQkdMMiAoKCJ2YWw9eCV4XG4iLCQxKSk7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotJSUKLQotc3RhdGljIGludAoteXllcnJvciAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIHByaW50ZiAoImxpbmUgJWQ6ICVzXG4iLCBpbnNudGJsX2xpbmUsIG1zZyk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2xpbmsuY21kIGIvZ2FzL2xpbmsuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDM1Y2E4Li4wMDAwMDAwCi0tLSBhL2dhcy9saW5rLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUFMSUdOPTEwMjQKLVJFU05VTSAweDAwMDAsIDB4ODAwMAotOyBQdXR0aW5nIGluIC5saXQxIGdpdmVzIGVycm9ycy4KLU9SREVSIC5kYXRhPTB4ODAwMDIwMDAsIC5kYXRhMSwgLmxpdCwgLmJzcwotOyBMZXQncyBwdXQgdGhpcyBvbiB0aGUgY29tbWFuZCBsaW5lIHNvIGl0IGdvZXMgZmlyc3QsIHdoaWNoIGlzIHdoYXQKLTsgR0RCIGV4cGVjdHMuCi07IExPQUQgL3MyL2FtZC8yOWsvbGliL2NydDAubwotTE9BRCAvczIvYW1kLzI5ay9saWIvbGlicWNiMGgubGliCi1MT0FEIC9zMi9hbWQvMjlrL2xpYi9saWJzY2IwaC5saWIKLUxPQUQgL3MyL2FtZC8yOWsvbGliL2xpYmFjYjBoLmxpYgpkaWZmIC0tZ2l0IGEvZ2FzL2xpc3RpbmcuYyBiL2dhcy9saXN0aW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYjE3M2IuLjAwMDAwMDAKLS0tIGEvZ2FzL2xpc3RpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MjAgKzAsMCBAQAotLyogbGlzdGluZy5jIC0gbWFpbnRpbmcgYXNzZW1ibHkgbGlzdGluZ3MKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICovCi0KLS8qCi0gQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAJCXNhY0BjeWdudXMuY29tCi0KLQotIEEgbGlzdGluZyBwYWdlIGxvb2tzIGxpa2U6Ci0KLSBMSVNUSU5HX0hFQURFUiAgc291cmNlZmlsZW5hbWUgcGFnZW51bWJlcgotIFRJVExFIExJTkUKLSBTVUJUSVRMRSBMSU5FCi0gbGluZW51bWJlciBhZGRyZXNzIGRhdGEgIHNvdXJjZQotIGxpbmVudW1iZXIgYWRkcmVzcyBkYXRhICBzb3VyY2UKLSBsaW5lbnVtYmVyIGFkZHJlc3MgZGF0YSAgc291cmNlCi0gbGluZW51bWJlciBhZGRyZXNzIGRhdGEgIHNvdXJjZQotCi0gSWYgbm90IG92ZXJyaWRkZW4sIHRoZSBsaXN0aW5nIGNvbW1hbmRzIGFyZToKLQotIC50aXRsZSAgInN0dWZmIgotIAlQdXQgInN0dWZmIiBvbnRvIHRoZSB0aXRsZSBsaW5lCi0gLnNidHRsICAic3R1ZmYiCi0gICAgICAgIFB1dCBzdHVmZiBvbnRvIHRoZSBzdWJ0aXRsZSBsaW5lCi0KLSAgSWYgdGhlc2UgY29tbWFuZHMgY29tZSB3aXRoaW4gMTAgbGluZXMgb2YgdGhlIHRvcCBvZiB0aGUgcGFnZSwgdGhleQotICB3aWxsIGFmZmVjdCB0aGUgcGFnZSB0aGV5IGFyZSBvbiwgYXMgd2VsbCBhcyBhbnkgc3Vic2VxdWVudCBwYWdlCi0KLSAuZWplY3QKLSAJVGhvdyBhIHBhZ2UKLSAubGlzdAotIAlJbmNyZW1lbnQgdGhlIGVuYWJsZSBsaXN0aW5nIGNvdW50ZXIKLSAubm9saXN0Ci0gCURlY3JlbWVudCB0aGUgZW5hYmxlIGxpc3RpbmcgY291bnRlcgotCi0gLnBzaXplIFlbLFhdCi0gCVNldCB0aGUgcGFwZXIgc2l6ZSB0byBYIHdpZGUgYW5kIFkgaGlnaC4gU2V0dGluZyBhIHBzaXplIFkgb2YKLQl6ZXJvIHdpbGwgc3VwcHJlc3MgZm9ybSBmZWVkcyBleGNlcHQgd2hlcmUgZGVtYW5kZWQgYnkgLmVqZWN0Ci0KLSBJZiB0aGUgY291bnRlciBnb2VzIGJlbG93IHplcm8sIGxpc3RpbmcgaXMgc3VwcHJlc3NlZC4KLQotCi0gTGlzdGluZ3MgYXJlIGEgbWFpbnRhaW5lZCBieSByZWFkIGNhbGxpbmcgdmFyaW91cyBsaXN0aW5nXzxmb28+Ci0gZnVuY3Rpb25zLiAgV2hhdCBoYXBwZW5zIG1vc3QgaXMgdGhhdCB0aGUgbWFjcm8gTk9fTElTVElORyBpcyBub3QKLSBkZWZpbmVkIChmcm9tIHRoZSBNYWtlZmlsZSksIHRoZW4gdGhlIG1hY3JvIExJU1RJTkdfTkVXTElORSBleHBhbmRzCi0gaW50byBhIGNhbGwgdG8gbGlzdGluZ19uZXdsaW5lLiAgVGhlIGNhbGwgaXMgZG9uZSBmcm9tIHJlYWQuYywgZXZlcnkKLSB0aW1lIGl0IHNlZXMgYSBuZXdsaW5lLCBhbmQgLWwgaXMgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotIFRoZSBmdW5jdGlvbiBsaXN0aW5nX25ld2xpbmUgcmVtZW1iZXJzIHRoZSBmcmFnIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSBuZXdsaW5lLCBhbmQgY3JlYXRlcyBhIG5ldyBmcmFnIC0gbm90ZSB0aGF0IHRoaXMgaXMgd2FzdGVmdWwsIGJ1dCBub3QKLSBhIGJpZyBkZWFsLCBzaW5jZSBsaXN0aW5nIHNsb3dzIHRoaW5ncyBkb3duIGEgbG90IGFueXdheS4gIFRoZQotIGZ1bmN0aW9uIGFsc28gcmVtZW1lYmVycyB3aGVuIHRoZSBmaWxlbmFtZSBjaGFuZ2VzLgotCi0gV2hlbiBhbGwgdGhlIGlucHV0IGhhcyBmaW5pc2hlZCwgYW5kIGdhcyBoYXMgaGFkIGEgY2hhbmNlIHRvIHNldHRsZQotIGRvd24sIHRoZSBsaXN0aW5nIGlzIG91dHB1dC4gVGhpcyBpcyBkb25lIGJ5IHJ1bm5pbmcgZG93biB0aGUgbGlzdCBvZgotIGZyYWcvc291cmNlIGZpbGUgcmVjb3JkcywgYW5kIG9wZW5pbmcgdGhlIGZpbGVzIGFzIG5lZWRlZCBhbmQgcHJpbnRpbmcKLSBvdXQgdGhlIGJ5dGVzIGFuZCBjaGFycyBhc3NvY2lhdGVkIHdpdGggdGhlbS4KLQotIFRoZSBvbmx5IHRoaW5ncyB3aGljaCB0aGUgYXJjaGl0ZWN0dXJlIGNhbiBjaGFuZ2UgYWJvdXQgdGhlIGxpc3RpbmcKLSBhcmUgZGVmaW5lZCBpbiB0aGVzZSBtYWNyb3M6Ci0KLSBMSVNUSU5HX0hFQURFUgkJVGhlIG5hbWUgb2YgdGhlIGFyY2hpdGVjdHVyZQotIExJU1RJTkdfV09SRF9TSVpFICAgICAgVGhlIG1ha2Ugb2YgdGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHdvcmQsIHRoaXMgZGV0ZXJtaW5lcwotIAkJCXRoZSBjbHVtcGluZyBvZiB0aGUgb3V0cHV0IGRhdGEuIGVnIGEgdmFsdWUgb2YKLQkJCTIgbWFrZXMgd29yZHMgbG9vayBsaWtlIDEyMzQgNTY3OCwgd2hpbHN0IDEKLQkJCXdvdWxkIG1ha2UgdGhlIHNhbWUgdmFsdWUgbG9vayBsaWtlIDEyIDM0IDU2Ci0JCQk3OAotIExJU1RJTkdfTEhTX1dJRFRIICAgICAgTnVtYmVyIG9mIHdvcmRzIG9mIGFib3ZlIHNpemUgZm9yIHRoZSBsaHMKLQotIExJU1RJTkdfTEhTX1dJRFRIX1NFQ09ORCAgIE51bWJlciBvZiB3b3JkcyBmb3IgdGhlIGRhdGEgb24gdGhlIGxocwotIAkJCWZvciB0aGUgc2Vjb25kIGxpbmUKLQotIExJU1RJTkdfTEhTX0NPTlRfTElORVMJTWF4IG51bWJlciBvZiBsaW5lcyB0byB1c2UgdXAgZm9yIGEgY29udGludXRhdGlvbgotIExJU1RJTkdfUkhTX1dJRFRIICAgICAgTnVtYmVyIG9mIGNoYXJzIGZyb20gdGhlIGlucHV0IGZpbGUgdG8gcHJpbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uIGEgbGluZQotKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgPG9ic3RhY2suaD4KLSNpbmNsdWRlICJpbnB1dC1maWxlLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLQotI2lmbmRlZiBMSVNUSU5HX0hFQURFUgotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiR0FTIExJU1RJTkciCi0jZW5kaWYKLSNpZm5kZWYgTElTVElOR19XT1JEX1NJWkUKLSNkZWZpbmUgTElTVElOR19XT1JEX1NJWkUgNAotI2VuZGlmCi0jaWZuZGVmIExJU1RJTkdfTEhTX1dJRFRICi0jZGVmaW5lIExJU1RJTkdfTEhTX1dJRFRIIDEKLSNlbmRpZgotI2lmbmRlZiBMSVNUSU5HX0xIU19XSURUSF9TRUNPTkQKLSNkZWZpbmUgTElTVElOR19MSFNfV0lEVEhfU0VDT05EIDEKLSNlbmRpZgotI2lmbmRlZiBMSVNUSU5HX1JIU19XSURUSAotI2RlZmluZSBMSVNUSU5HX1JIU19XSURUSCAxMDAKLSNlbmRpZgotI2lmbmRlZiBMSVNUSU5HX0xIU19DT05UX0xJTkVTCi0jZGVmaW5lIExJU1RJTkdfTEhTX0NPTlRfTElORVMgNAotI2VuZGlmCi0KLS8qIFRoaXMgc3RydWN0dXJlIHJlbWVtYmVycyB3aGljaCAucyB3ZXJlIHVzZWQgKi8KLXR5cGVkZWYgc3RydWN0IGZpbGVfaW5mb19zdHJ1Y3QKLXsKLSAgc3RydWN0IGZpbGVfaW5mb19zdHJ1Y3QgKiBuZXh0OwotICBjaGFyICogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOwotICBsb25nICAgICAgICAgICAgICAgICAgICAgIHBvczsKLSAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICBsaW5lbnVtOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGF0X2VuZDsKLX0KLWZpbGVfaW5mb190eXBlOwotCi0vKiBUaGlzIHN0cnVjdHVyZSByZW1lbWVicnMgd2hpY2ggbGluZSBmcm9tIHdoaWNoIGZpbGUgZ29lcyBpbnRvIHdoaWNoCi0gICBmcmFnICovCi1zdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdAotewotICAvKiBGcmFnIHdoaWNoIHRoaXMgbGluZSBvZiBzb3VyY2UgaXMgbmVhcmVzdCB0byAqLwotICBmcmFnUyAqIGZyYWc7Ci0KLSAgLyogVGhlIGFjdHVhbCBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSAqLwotICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgLyogUG9pbnRlciB0byB0aGUgZmlsZSBpbmZvIHN0cnVjdCBmb3IgdGhlIGZpbGUgd2hpY2ggdGhpcyBsaW5lCi0gICAgIGJlbG9uZ3MgdG8gKi8KLSAgZmlsZV9pbmZvX3R5cGUgKiBmaWxlOwotCi0gIC8qIFRoZSBleHBhbmRlZCB0ZXh0IG9mIGFueSBtYWNybyB0aGF0IG1heSBoYXZlIGJlZW4gZXhlY3V0aW5nLiAgKi8KLSAgY2hhciAqIGxpbmVfY29udGVudHM7Ci0KLSAgLyogTmV4dCBpbiBsaXN0ICovCi0gIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICogbmV4dDsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBmaWxlIGluZm8gc3RydWN0IGZvciB0aGUgaGlnaCBsZXZlbCBsYW5ndWFnZQotICAgICBzb3VyY2UgbGluZSB0aGF0IGJlbG9uZ3MgaGVyZSAqLwotICBmaWxlX2luZm9fdHlwZSAqIGhsbF9maWxlOwotICAvKiBIaWdoIGxldmVsIGxhbmd1YWdlIHNvdXJjZSBsaW5lICovCi0gIHVuc2lnbmVkIGludCBobGxfbGluZTsKLQotICAvKiBQb2ludGVyIHRvIGFueSBlcnJvciBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpbmUgKi8KLSAgY2hhciAqIG1lc3NhZ2U7Ci0KLSAgZW51bQotICAgIHsKLSAgICAgIEVESUNUX05PTkUsCi0gICAgICBFRElDVF9TQlRUTCwKLSAgICAgIEVESUNUX1RJVExFLAotICAgICAgRURJQ1RfTk9MSVNULAotICAgICAgRURJQ1RfTElTVCwKLSAgICAgIEVESUNUX05PTElTVF9ORVhULAotICAgICAgRURJQ1RfRUpFQ1QKLSAgICB9IGVkaWN0OwotICBjaGFyICogZWRpY3RfYXJnOwotCi0gIC8qIE5vbnplcm8gaWYgdGhpcyBsaW5lIGlzIHRvIGJlIG9taXR0ZWQgYmVjYXVzZSBpdCBjb250YWlucwotICAgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGNhbiBiZWNvbWUgYSBmbGFncyBmaWVsZCBpZiB3ZSBjb21lCi0gICAgIHVwIHdpdGggbW9yZSBpbmZvcm1hdGlvbiB0byBzdG9yZSBoZXJlLiAgKi8KLSAgaW50IGRlYnVnZ2luZzsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QgbGlzdF9pbmZvX3R5cGU7Ci0KLQotaW50IGxpc3RpbmdfbGhzX3dpZHRoICAgICAgICA9IExJU1RJTkdfTEhTX1dJRFRIOwotaW50IGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCA9IExJU1RJTkdfTEhTX1dJRFRIX1NFQ09ORDsKLWludCBsaXN0aW5nX2xoc19jb250X2xpbmVzICAgPSBMSVNUSU5HX0xIU19DT05UX0xJTkVTOwotaW50IGxpc3RpbmdfcmhzX3dpZHRoICAgICAgICA9IExJU1RJTkdfUkhTX1dJRFRIOwotCi1zdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqICAgICAgICBsaXN0aW5nX3RhaWw7Ci0KLXN0YXRpYyBmaWxlX2luZm9fdHlwZSAqICAgICAgICAgIGZpbGVfaW5mb19oZWFkOwotc3RhdGljIGZpbGVfaW5mb190eXBlICogICAgICAgICAgbGFzdF9vcGVuX2ZpbGVfaW5mbzsKLXN0YXRpYyBGSUxFICogICAgICAgICAgICAgICAgICAgIGxhc3Rfb3Blbl9maWxlOwotc3RhdGljIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICogaGVhZDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgICAgICAgIHBhcGVyX3dpZHRoID0gMjAwOwotc3RhdGljIGludCAgICAgICAgICAgICAgICAgICAgICAgcGFwZXJfaGVpZ2h0ID0gNjA7Ci0KLWV4dGVybiBpbnQgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rpbmc7Ci0KLS8qIEZpbGUgdG8gb3V0cHV0IGxpc3RpbmdzIHRvLiAgKi8KLXN0YXRpYyBGSUxFICogbGlzdF9maWxlOwotCi0vKiBUaGlzIHN0YXRpYyBhcnJheSBpcyB1c2VkIHRvIGtlZXAgdGhlIHRleHQgb2YgZGF0YSB0byBiZSBwcmludGVkCi0gICBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLiAgKi8KLQotI2RlZmluZSBNQVhfQllURVMJCQkJCQkJXAotICAoKChMSVNUSU5HX1dPUkRfU0laRSAqIDIpICsgMSkgKiBsaXN0aW5nX2xoc193aWR0aAkJCVwKLSAgICsgKCgoKExJU1RJTkdfV09SRF9TSVpFICogMikgKyAxKSAqIGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCkJXAotICAgICAgKiBsaXN0aW5nX2xoc19jb250X2xpbmVzKQkJCQkJCVwKLSAgICsgMjApCi0KLXN0YXRpYyBjaGFyICogZGF0YV9idWZmZXI7Ci0KLS8qIFByb3RvdHlwZXMuICAqLwotc3RhdGljIHZvaWQgbGlzdGluZ19tZXNzYWdlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpKTsKLXN0YXRpYyBmaWxlX2luZm9fdHlwZSAqIGZpbGVfaW5mbyBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlX25hbWUpKTsKLXN0YXRpYyB2b2lkIG5ld19mcmFnIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjaGFyICogYnVmZmVyX2xpbmUgUEFSQU1TICgoZmlsZV9pbmZvX3R5cGUgKmZpbGUsCi0JCQkJICBjaGFyICpsaW5lLCB1bnNpZ25lZCBpbnQgc2l6ZSkpOwotc3RhdGljIHZvaWQgbGlzdGluZ19wYWdlIFBBUkFNUyAoKGxpc3RfaW5mb190eXBlICpsaXN0KSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNhbGNfaGV4IFBBUkFNUyAoKGxpc3RfaW5mb190eXBlICpsaXN0KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9saW5lcyBQQVJBTVMgKChsaXN0X2luZm9fdHlwZSAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJIGNoYXIgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBsaXN0X3N5bWJvbF90YWJsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zb3VyY2UgUEFSQU1TICgoZmlsZV9pbmZvX3R5cGUgKmN1cnJlbnRfZmlsZSwKLQkJCQkgIGxpc3RfaW5mb190eXBlICpsaXN0LAotCQkJCSAgY2hhciAqYnVmZmVyLAotCQkJCSAgdW5zaWduZWQgaW50IHdpZHRoKSk7Ci1zdGF0aWMgaW50IGRlYnVnZ2luZ19wc2V1ZG8gUEFSQU1TICgobGlzdF9pbmZvX3R5cGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBsaXN0aW5nX2xpc3RpbmcgUEFSQU1TICgoY2hhciAqbmFtZSkpOwotCi0KLXN0YXRpYyB2b2lkCi1saXN0aW5nX21lc3NhZ2UgKG5hbWUsIG1lc3NhZ2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIHVuc2lnbmVkIGludCBsID0gc3RybGVuIChuYW1lKSArIHN0cmxlbiAobWVzc2FnZSkgKyAxOwotICBjaGFyICpuID0gKGNoYXIgKikgeG1hbGxvYyAobCk7Ci0gIHN0cmNweSAobiwgbmFtZSk7Ci0gIHN0cmNhdCAobiwgbWVzc2FnZSk7Ci0gIGlmIChsaXN0aW5nX3RhaWwgIT0gKGxpc3RfaW5mb190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgbGlzdGluZ190YWlsLT5tZXNzYWdlID0gbjsKLSAgICB9Ci19Ci0KLXZvaWQKLWxpc3Rpbmdfd2FybmluZyAobWVzc2FnZSkKLSAgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKLXsKLSAgbGlzdGluZ19tZXNzYWdlIChfKCJXYXJuaW5nOiIpLCBtZXNzYWdlKTsKLX0KLQotdm9pZAotbGlzdGluZ19lcnJvciAobWVzc2FnZSkKLSAgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKLXsKLSAgbGlzdGluZ19tZXNzYWdlIChfKCJFcnJvcjoiKSwgbWVzc2FnZSk7Ci19Ci0KLXN0YXRpYyBmaWxlX2luZm9fdHlwZSAqCi1maWxlX2luZm8gKGZpbGVfbmFtZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lOwotewotICAvKiBGaW5kIGFuIGVudHJ5IHdpdGggdGhpcyBmaWxlIG5hbWUgKi8KLSAgZmlsZV9pbmZvX3R5cGUgKnAgPSBmaWxlX2luZm9faGVhZDsKLQotICB3aGlsZSAocCAhPSAoZmlsZV9pbmZvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChwLT5maWxlbmFtZSwgZmlsZV9uYW1lKSA9PSAwKQotCXJldHVybiBwOwotICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgfQotCi0gIC8qIE1ha2UgbmV3IGVudHJ5ICovCi0KLSAgcCA9IChmaWxlX2luZm9fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKGZpbGVfaW5mb190eXBlKSk7Ci0gIHAtPm5leHQgPSBmaWxlX2luZm9faGVhZDsKLSAgZmlsZV9pbmZvX2hlYWQgPSBwOwotICBwLT5maWxlbmFtZSA9IHhtYWxsb2MgKCh1bnNpZ25lZCBsb25nKSBzdHJsZW4gKGZpbGVfbmFtZSkgKyAxKTsKLSAgc3RyY3B5IChwLT5maWxlbmFtZSwgZmlsZV9uYW1lKTsKLSAgcC0+cG9zID0gMDsKLSAgcC0+bGluZW51bSA9IDA7Ci0gIHAtPmF0X2VuZCA9IDA7Ci0KLSAgcmV0dXJuIHA7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW5ld19mcmFnICgpCi17Ci0KLSAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gIGZyYWdfbmV3ICgwKTsKLQotfQotCi12b2lkCi1saXN0aW5nX25ld2xpbmUgKHBzKQotICAgICBjaGFyICpwczsKLXsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0gIHN0YXRpYyB1bnNpZ25lZCBpbnQgbGFzdF9saW5lID0gMHhmZmZmOwotICBzdGF0aWMgY2hhciAqbGFzdF9maWxlID0gTlVMTDsKLSAgbGlzdF9pbmZvX3R5cGUgKm5ldyA9IE5VTEw7Ci0KLSAgaWYgKGxpc3RpbmcgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICByZXR1cm47Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIC8qIEluIEVMRiwgYW55dGhpbmcgaW4gYSBzZWN0aW9uIGJlZ2lubmluZyB3aXRoIC5kZWJ1ZyBvciAubGluZSBpcwotICAgICBjb25zaWRlcmVkIHRvIGJlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgaW5jbHVkZXMgdGhlCi0gICAgIHN0YXRlbWVudCB3aGljaCBzd2l0Y2hlcyB1cyBpbnRvIHRoZSBkZWJ1Z2dpbmcgc2VjdGlvbiwgd2hpY2ggd2UKLSAgICAgY2FuIG9ubHkgc2V0IGFmdGVyIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBkZWJ1Z2dpbmcgc2VjdGlvbi4gICovCi0gIGlmICgobGlzdGluZyAmIExJU1RJTkdfTk9ERUJVRykgIT0gMAotICAgICAgJiYgbGlzdGluZ190YWlsICE9IE5VTEwKLSAgICAgICYmICEgbGlzdGluZ190YWlsLT5kZWJ1Z2dpbmcpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc2VnbmFtZTsKLQotICAgICAgc2VnbmFtZSA9IHNlZ21lbnRfbmFtZSAobm93X3NlZyk7Ci0gICAgICBpZiAoc3RybmNtcCAoc2VnbmFtZSwgIi5kZWJ1ZyIsIHNpemVvZiAiLmRlYnVnIiAtIDEpID09IDAKLQkgIHx8IHN0cm5jbXAgKHNlZ25hbWUsICIubGluZSIsIHNpemVvZiAiLmxpbmUiIC0gMSkgPT0gMCkKLQlsaXN0aW5nX3RhaWwtPmRlYnVnZ2luZyA9IDE7Ci0gICAgfQotI2VuZGlmCi0KLSAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7Ci0gIGlmIChwcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChsaW5lID09IGxhc3RfbGluZSAmJiAhKGxhc3RfZmlsZSAmJiBmaWxlICYmIHN0cmNtcCAoZmlsZSwgbGFzdF9maWxlKSkpCi0JcmV0dXJuOwotCi0gICAgICBuZXcgPSAobGlzdF9pbmZvX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChsaXN0X2luZm9fdHlwZSkpOwotCi0gICAgICAvKiBEZXRlY3QgaWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBzdGRpbiBieSBleGFtaW5pbmcgdGhlIGZpbGUKLQkgbmFtZSByZXR1cm5lZCBieSBhc193aGVyZSgpLgotCi0JIFtGSVhNRTogV2UgcmVseSB1cG9uIHRoZSBuYW1lIGluIHRoZSBzdHJjbXAgYmVsb3cgYmVpbmcgdGhlCi0JIHNhbWUgYXMgdGhlIG9uZSB1c2VkIGJ5IGlucHV0X3NjcnViX25ld19maWxlKCksIGlmIHRoYXQgaXMKLQkgbm90IHRydWUsIHRoZW4gdGhpcyBjb2RlIHdpbGwgZmFpbF0uCi0KLQkgSWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBzdGRpbiwgdGhlbiB3ZSBuZWVkIHRvIHNhdmUgZWFjaCBpbnB1dCBsaW5lCi0JIGhlcmUgKGFzc3VtaW5nIG9mIGNvdXJzZSB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgYSBsaW5lIG9mIGlucHV0IHRvIHJlYWQpLAotCSBzbyB0aGF0IGl0IGNhbiBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3RpbmcgdGhhdCBpcyBwcm9kdWNlZCBhdCB0aGUgZW5kCi0JIG9mIHRoZSBhc3NlbWJseS4gICovCi0gICAgICBpZiAoc3RyY21wIChmaWxlLCBfKCJ7c3RhbmRhcmQgaW5wdXR9IikpID09IDAKLQkgICYmIGlucHV0X2xpbmVfcG9pbnRlciAhPSBOVUxMKQotCXsKLQkgIGNoYXIgKiBjb3B5OwotCSAgaW50IGxlbjsKLQkgIGludCBzZWVuX3F1b3RlID0gMDsKLQotCSAgZm9yIChjb3B5ID0gaW5wdXRfbGluZV9wb2ludGVyIC0gMTsKLQkgICAgICAgKiBjb3B5ICYmIChzZWVuX3F1b3RlCi0JCQkgIHx8ICghIGlzX2VuZF9vZl9saW5lIFsodW5zaWduZWQgY2hhcikgKiBjb3B5XSkpOwotCSAgICAgICBjb3B5ICsrKQotCSAgICBpZiAoKiBjb3B5ID09ICciJyAmJiBjb3B5Wy0xXSAhPSAnXFwnKQotCSAgICAgIHNlZW5fcXVvdGUgPSAhIHNlZW5fcXVvdGU7Ci0KLQkgIGxlbiA9IChjb3B5IC0gaW5wdXRfbGluZV9wb2ludGVyKSArIDI7Ci0KLQkgIGNvcHkgPSB4bWFsbG9jIChsZW4pOwotCi0JICBpZiAoY29weSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqIHNyYyA9IGlucHV0X2xpbmVfcG9pbnRlciAtIDE7Ci0JICAgICAgY2hhciAqIGRlc3QgPSBjb3B5OwotCSAgICAgIAotCSAgICAgIHdoaWxlICgtLWxlbikKLQkJewotCQkgIGNoYXIgYyA9ICogc3JjICsrOwotCi0JCSAgLyogT21pdCBjb250cm9sIGNoYXJhY3RlcnMgaW4gdGhlIGxpc3RpbmcuICAqLwotCQkgIGlmIChpc2FzY2lpIChjKSAmJiAhIGlzY250cmwgKGMpKQotCQkgICAgKiBkZXN0ICsrID0gYzsKLQkJfQotCSAgICAgIAotCSAgICAgICpkZXN0ID0gMDsKLQkgICAgfQotCSAgCi0JICBuZXctPmxpbmVfY29udGVudHMgPSBjb3B5OwotCX0KLSAgICAgIGVsc2UKLQluZXctPmxpbmVfY29udGVudHMgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5ldyA9IChsaXN0X2luZm9fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKGxpc3RfaW5mb190eXBlKSk7Ci0gICAgICBuZXctPmxpbmVfY29udGVudHMgPSBwczsKLSAgICB9Ci0KLSAgbGFzdF9saW5lID0gbGluZTsKLSAgbGFzdF9maWxlID0gZmlsZTsKLSAgCi0gIG5ld19mcmFnICgpOwotCi0gIGlmIChsaXN0aW5nX3RhaWwpCi0gICAgbGlzdGluZ190YWlsLT5uZXh0ID0gbmV3OwotICBlbHNlCi0gICAgaGVhZCA9IG5ldzsKLSAgCi0gIGxpc3RpbmdfdGFpbCA9IG5ldzsKLQotICBuZXctPmZyYWcgPSBmcmFnX25vdzsKLSAgbmV3LT5saW5lID0gbGluZTsKLSAgbmV3LT5maWxlID0gZmlsZV9pbmZvIChmaWxlKTsKLSAgbmV3LT5uZXh0ID0gKGxpc3RfaW5mb190eXBlICopIE5VTEw7Ci0gIG5ldy0+bWVzc2FnZSA9IChjaGFyICopIE5VTEw7Ci0gIG5ldy0+ZWRpY3QgPSBFRElDVF9OT05FOwotICBuZXctPmhsbF9maWxlID0gKGZpbGVfaW5mb190eXBlICopIE5VTEw7Ci0gIG5ldy0+aGxsX2xpbmUgPSAwOwotICBuZXctPmRlYnVnZ2luZyA9IDA7Ci0gIAotICBuZXdfZnJhZyAoKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogSW4gRUxGLCBhbnl0aGluZyBpbiBhIHNlY3Rpb24gYmVnaW5uaW5nIHdpdGggLmRlYnVnIG9yIC5saW5lIGlzCi0gICAgIGNvbnNpZGVyZWQgdG8gYmUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKChsaXN0aW5nICYgTElTVElOR19OT0RFQlVHKSAhPSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0KLSAgICAgIHNlZ25hbWUgPSBzZWdtZW50X25hbWUgKG5vd19zZWcpOwotICAgICAgaWYgKHN0cm5jbXAgKHNlZ25hbWUsICIuZGVidWciLCBzaXplb2YgIi5kZWJ1ZyIgLSAxKSA9PSAwCi0JICB8fCBzdHJuY21wIChzZWduYW1lLCAiLmxpbmUiLCBzaXplb2YgIi5saW5lIiAtIDEpID09IDApCi0JbmV3LT5kZWJ1Z2dpbmcgPSAxOwotICAgIH0KLSNlbmRpZgotfQotCi0vKiBBdHRhY2ggYWxsIGN1cnJlbnQgZnJhZ3MgdG8gdGhlIHByZXZpb3VzIGxpbmUgaW5zdGVhZCBvZiB0aGUKLSAgIGN1cnJlbnQgbGluZS4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBNSVBTIGJhY2tlbmQgd2hlbiBpdCBkaXNjb3ZlcnMKLSAgIHRoYXQgaXQgbmVlZHMgdG8gYWRkIHNvbWUgTk9QIGluc3RydWN0aW9uczsgdGhlIGFkZGVkIE5PUAotICAgaW5zdHJ1Y3Rpb25zIHNob3VsZCBnbyB3aXRoIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGhhcyB0aGUgZGVsYXksIG5vdAotICAgd2l0aCB0aGUgbmV3IGluc3RydWN0aW9uLiAgKi8KLQotdm9pZAotbGlzdGluZ19wcmV2X2xpbmUgKCkKLXsKLSAgbGlzdF9pbmZvX3R5cGUgKmw7Ci0gIGZyYWdTICpmOwotCi0gIGlmIChoZWFkID09IChsaXN0X2luZm9fdHlwZSAqKSBOVUxMCi0gICAgICB8fCBoZWFkID09IGxpc3RpbmdfdGFpbCkKLSAgICByZXR1cm47Ci0KLSAgbmV3X2ZyYWcgKCk7Ci0KLSAgZm9yIChsID0gaGVhZDsgbC0+bmV4dCAhPSBsaXN0aW5nX3RhaWw7IGwgPSBsLT5uZXh0KQotICAgIDsKLQotICBmb3IgKGYgPSBmcmNoYWluX25vdy0+ZnJjaF9yb290OyBmICE9IChmcmFnUyAqKSBOVUxMOyBmID0gZi0+ZnJfbmV4dCkKLSAgICBpZiAoZi0+bGluZSA9PSBsaXN0aW5nX3RhaWwpCi0gICAgICBmLT5saW5lID0gbDsKLQotICBsaXN0aW5nX3RhaWwtPmZyYWcgPSBmcmFnX25vdzsKLSAgbmV3X2ZyYWcgKCk7Ci19Ci0KLS8qCi0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBuZXh0IHNvdXJjZSBsaW5lIGZyb20gdGhlIGZpbGUgc3VwcGxpZWQsCi0gdHJ1bmNhdGVkIHRvIHNpemUuICBJdCBhcHBlbmRzIGEgZmFrZSBsaW5lIHRvIHRoZSBlbmQgb2YgZWFjaCBpbnB1dAotIGZpbGUgdG8gbWFrZQotKi8KLQotc3RhdGljIGNoYXIgKgotYnVmZmVyX2xpbmUgKGZpbGUsIGxpbmUsIHNpemUpCi0gICAgIGZpbGVfaW5mb190eXBlICogZmlsZTsKLSAgICAgY2hhciAqbGluZTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0gIGludCBjOwotCi0gIGNoYXIgKnAgPSBsaW5lOwotCi0gIC8qIElmIHdlIGNvdWxkbid0IG9wZW4gdGhlIGZpbGUsIHJldHVybiBhbiBlbXB0eSBsaW5lICovCi0gIGlmIChmaWxlLT5hdF9lbmQpCi0gICAgcmV0dXJuICIiOwotCi0gIC8qIENoZWNrIHRoZSBjYWNoZSBhbmQgc2VlIGlmIHdlIGxhc3QgdXNlZCB0aGlzIGZpbGUuICAqLwotICBpZiAoIWxhc3Rfb3Blbl9maWxlX2luZm8gfHwgZmlsZSAhPSBsYXN0X29wZW5fZmlsZV9pbmZvKQotICAgIHsKLSAgICAgIGlmIChsYXN0X29wZW5fZmlsZSkKLQl7Ci0JICBsYXN0X29wZW5fZmlsZV9pbmZvLT5wb3MgPSBmdGVsbCAobGFzdF9vcGVuX2ZpbGUpOwotCSAgZmNsb3NlIChsYXN0X29wZW5fZmlsZSk7Ci0JfQotCi0gICAgICBsYXN0X29wZW5fZmlsZV9pbmZvID0gZmlsZTsKLSAgICAgIGxhc3Rfb3Blbl9maWxlID0gZm9wZW4gKGZpbGUtPmZpbGVuYW1lLCAiciIpOwotICAgICAgaWYgKGxhc3Rfb3Blbl9maWxlID09IE5VTEwpCi0JewotCSAgZmlsZS0+YXRfZW5kID0gMTsKLQkgIHJldHVybiAiIjsKLQl9Ci0gICAgICAKLSAgICAgIC8qIFNlZWsgdG8gd2hlcmUgd2Ugd2VyZSBsYXN0IHRpbWUgdGhpcyBmaWxlIHdhcyBvcGVuLiAgKi8KLSAgICAgIGlmIChmaWxlLT5wb3MpCi0JZnNlZWsobGFzdF9vcGVuX2ZpbGUsIGZpbGUtPnBvcywgU0VFS19TRVQpOwotICAgIH0KLQotICBjID0gZmdldGMgKGxhc3Rfb3Blbl9maWxlKTsKLQotICBzaXplIC09IDE7CQkJLyogbGVhdmUgcm9vbSBmb3IgbnVsbCAqLwotCi0gIHdoaWxlIChjICE9IEVPRiAmJiBjICE9ICdcbicpCi0gICAgewotICAgICAgaWYgKGNvdW50IDwgc2l6ZSkKLQkqcCsrID0gYzsKLSAgICAgIGNvdW50Kys7Ci0KLSAgICAgIGMgPSBmZ2V0YyAobGFzdF9vcGVuX2ZpbGUpOwotCi0gICAgfQotICBpZiAoYyA9PSBFT0YpCi0gICAgewotICAgICAgZmlsZS0+YXRfZW5kID0gMTsKLSAgICAgICpwKysgPSAnLic7Ci0gICAgICAqcCsrID0gJy4nOwotICAgICAgKnArKyA9ICcuJzsKLSAgICB9Ci0gIGZpbGUtPmxpbmVudW0rKzsKLSAgKnArKyA9IDA7Ci0gIHJldHVybiBsaW5lOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICpmbjsKLQotc3RhdGljIHVuc2lnbmVkIGludCBlamVjdDsJLyogRWplY3QgcGVuZGluZyAqLwotc3RhdGljIHVuc2lnbmVkIGludCBwYWdlOwkvKiBDdXJyZW50IHBhZ2UgbnVtYmVyICovCi1zdGF0aWMgY2hhciAqdGl0bGU7CQkvKiBjdXJyZW50IHRpdGxlICovCi1zdGF0aWMgY2hhciAqc3VidGl0bGU7CQkvKiBjdXJyZW50IHN1YnRpdGxlICovCi1zdGF0aWMgdW5zaWduZWQgaW50IG9uX3BhZ2U7CS8qIG51bWJlciBvZiBsaW5lcyBwcmludGVkIG9uIGN1cnJlbnQgcGFnZSAqLwotCi0KLXN0YXRpYyB2b2lkCi1saXN0aW5nX3BhZ2UgKGxpc3QpCi0gICAgIGxpc3RfaW5mb190eXBlICpsaXN0OwotewotICAvKiBHcm9wZSBhcm91bmQsIHNlZSBpZiB3ZSBjYW4gc2VlIGEgdGl0bGUgb3Igc3VidGl0bGUgZWRpY3QgY29taW5nIHVwCi0gICAgIHNvb24gICh3ZSBsb29rIGRvd24gMTAgbGluZXMgb2YgdGhlIHBhZ2UgYW5kIHNlZSBpZiBpdCdzIHRoZXJlKSovCi0gIGlmICgoZWplY3QgfHwgKG9uX3BhZ2UgPj0gKHVuc2lnbmVkIGludCkgcGFwZXJfaGVpZ2h0KSkgJiYgcGFwZXJfaGVpZ2h0ICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGMgPSAxMDsKLSAgICAgIGludCBoYWRfdGl0bGUgPSAwOwotICAgICAgaW50IGhhZF9zdWJ0aXRsZSA9IDA7Ci0KLSAgICAgIHBhZ2UrKzsKLQotICAgICAgd2hpbGUgKGMgIT0gMCAmJiBsaXN0KQotCXsKLQkgIGlmIChsaXN0LT5lZGljdCA9PSBFRElDVF9TQlRUTCAmJiAhaGFkX3N1YnRpdGxlKQotCSAgICB7Ci0JICAgICAgaGFkX3N1YnRpdGxlID0gMTsKLQkgICAgICBzdWJ0aXRsZSA9IGxpc3QtPmVkaWN0X2FyZzsKLQkgICAgfQotCSAgaWYgKGxpc3QtPmVkaWN0ID09IEVESUNUX1RJVExFICYmICFoYWRfdGl0bGUpCi0JICAgIHsKLQkgICAgICBoYWRfdGl0bGUgPSAxOwotCSAgICAgIHRpdGxlID0gbGlzdC0+ZWRpY3RfYXJnOwotCSAgICB9Ci0JICBsaXN0ID0gbGlzdC0+bmV4dDsKLQkgIGMtLTsKLQl9Ci0KLQotICAgICAgaWYgKHBhZ2UgPiAxKQotCXsKLQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIlxmIik7Ci0JfQotCi0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlcyAlcyBcdFx0XHRwYWdlICVkXG4iLCBMSVNUSU5HX0hFQURFUiwgZm4sIHBhZ2UpOwotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiJXNcbiIsIHRpdGxlKTsKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiVzXG4iLCBzdWJ0aXRsZSk7Ci0gICAgICBvbl9wYWdlID0gMzsKLSAgICAgIGVqZWN0ID0gMDsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY2FsY19oZXggKGxpc3QpCi0gICAgIGxpc3RfaW5mb190eXBlICogbGlzdDsKLXsKLSAgaW50IGRhdGFfYnVmZmVyX3NpemU7Ci0gIGxpc3RfaW5mb190eXBlICpmaXJzdCA9IGxpc3Q7Ci0gIHVuc2lnbmVkIGludCBhZGRyZXNzID0gfiAodW5zaWduZWQgaW50KSAwOwotICBmcmFnUyAqZnJhZzsKLSAgZnJhZ1MgKmZyYWdfcHRyOwotICB1bnNpZ25lZCBpbnQgYnl0ZV9pbl9mcmFnOwotCi0gIC8qIEZpbmQgZmlyc3QgZnJhZyB3aGljaCBzYXlzIGl0IGJlbG9uZ3MgdG8gdGhpcyBsaW5lICovCi0gIGZyYWcgPSBsaXN0LT5mcmFnOwotICB3aGlsZSAoZnJhZyAmJiBmcmFnLT5saW5lICE9IGxpc3QpCi0gICAgZnJhZyA9IGZyYWctPmZyX25leHQ7Ci0KLSAgZnJhZ19wdHIgPSBmcmFnOwotCi0gIGRhdGFfYnVmZmVyX3NpemUgPSAwOwotCi0gIC8qIER1bXAgYWxsIHRoZSBmcmFncyB3aGljaCBiZWxvbmcgdG8gdGhpcyBsaW5lICovCi0gIHdoaWxlIChmcmFnX3B0ciAhPSAoZnJhZ1MgKikgTlVMTCAmJiBmcmFnX3B0ci0+bGluZSA9PSBmaXJzdCkKLSAgICB7Ci0gICAgICAvKiBQcmludCBhcyBtYW55IGJ5dGVzIGZyb20gdGhlIGZpeGVkIHBhcnQgYXMgaXMgc2Vuc2libGUgKi8KLSAgICAgIGJ5dGVfaW5fZnJhZyA9IDA7Ci0gICAgICB3aGlsZSAoKG9mZnNldFQpIGJ5dGVfaW5fZnJhZyA8IGZyYWdfcHRyLT5mcl9maXgKLQkgICAgICYmIGRhdGFfYnVmZmVyX3NpemUgPCBNQVhfQllURVMgLSAzKQotCXsKLQkgIGlmIChhZGRyZXNzID09IH4gKHVuc2lnbmVkIGludCkgMCkKLQkgICAgewotCSAgICAgIGFkZHJlc3MgPSBmcmFnX3B0ci0+ZnJfYWRkcmVzczsKLQkgICAgfQotCi0JICBzcHJpbnRmIChkYXRhX2J1ZmZlciArIGRhdGFfYnVmZmVyX3NpemUsCi0JCSAgICIlMDJYIiwKLQkJICAgKGZyYWdfcHRyLT5mcl9saXRlcmFsW2J5dGVfaW5fZnJhZ10pICYgMHhmZik7Ci0JICBkYXRhX2J1ZmZlcl9zaXplICs9IDI7Ci0JICBieXRlX2luX2ZyYWcrKzsKLQl9Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IHZhcl9yZXBfbWF4ID0gYnl0ZV9pbl9mcmFnOwotCXVuc2lnbmVkIGludCB2YXJfcmVwX2lkeCA9IGJ5dGVfaW5fZnJhZzsKLQotCS8qIFByaW50IGFzIG1hbnkgYnl0ZXMgZnJvbSB0aGUgdmFyaWFibGUgcGFydCBhcyBpcyBzZW5zaWJsZSAqLwotCXdoaWxlICgoKG9mZnNldFQpIGJ5dGVfaW5fZnJhZwotCQk8IGZyYWdfcHRyLT5mcl9maXggKyBmcmFnX3B0ci0+ZnJfdmFyICogZnJhZ19wdHItPmZyX29mZnNldCkKLQkgICAgICAgJiYgZGF0YV9idWZmZXJfc2l6ZSA8IE1BWF9CWVRFUyAtIDMpCi0JICB7Ci0JICAgIGlmIChhZGRyZXNzID09IH4gKHVuc2lnbmVkIGludCkgMCkKLQkgICAgICB7Ci0JCWFkZHJlc3MgPSBmcmFnX3B0ci0+ZnJfYWRkcmVzczsKLQkgICAgICB9Ci0JICAgIHNwcmludGYgKGRhdGFfYnVmZmVyICsgZGF0YV9idWZmZXJfc2l6ZSwKLQkJICAgICAiJTAyWCIsCi0JCSAgICAgKGZyYWdfcHRyLT5mcl9saXRlcmFsW3Zhcl9yZXBfaWR4XSkgJiAweGZmKTsKLSNpZiAwCi0JICAgIGRhdGFfYnVmZmVyW2RhdGFfYnVmZmVyX3NpemUrK10gPSAnKic7Ci0JICAgIGRhdGFfYnVmZmVyW2RhdGFfYnVmZmVyX3NpemUrK10gPSAnKic7Ci0jZW5kaWYKLQkgICAgZGF0YV9idWZmZXJfc2l6ZSArPSAyOwotCi0JICAgIHZhcl9yZXBfaWR4Kys7Ci0JICAgIGJ5dGVfaW5fZnJhZysrOwotCi0JICAgIGlmICgob2Zmc2V0VCkgdmFyX3JlcF9pZHggPj0gZnJhZ19wdHItPmZyX2ZpeCArIGZyYWdfcHRyLT5mcl92YXIpCi0JICAgICAgdmFyX3JlcF9pZHggPSB2YXJfcmVwX21heDsKLQkgIH0KLSAgICAgIH0KLQotICAgICAgZnJhZ19wdHIgPSBmcmFnX3B0ci0+ZnJfbmV4dDsKLSAgICB9Ci0gIGRhdGFfYnVmZmVyW2RhdGFfYnVmZmVyX3NpemVdID0gJ1wwJzsKLSAgcmV0dXJuIGFkZHJlc3M7Ci19Ci0KLQotCi0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfbGluZXMgKGxpc3QsIGxpbmVubywgc3RyaW5nLCBhZGRyZXNzKQotICAgICBsaXN0X2luZm9fdHlwZSAqbGlzdDsKLSAgICAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICB1bnNpZ25lZCBpbnQgYWRkcmVzczsKLXsKLSAgdW5zaWduZWQgaW50IGlkeDsKLSAgdW5zaWduZWQgaW50IG5jaGFyczsKLSAgdW5zaWduZWQgaW50IGxpbmVzOwotICB1bnNpZ25lZCBpbnQgYnl0ZV9pbl93b3JkID0gMDsKLSAgY2hhciAqc3JjID0gZGF0YV9idWZmZXI7Ci0KLSAgLyogUHJpbnQgdGhlIHN0dWZmIG9uIHRoZSBmaXJzdCBsaW5lICovCi0gIGxpc3RpbmdfcGFnZSAobGlzdCk7Ci0gIG5jaGFycyA9IChMSVNUSU5HX1dPUkRfU0laRSAqIDIgKyAxKSAqIGxpc3RpbmdfbGhzX3dpZHRoOwotICAKLSAgLyogUHJpbnQgdGhlIGhleCBmb3IgdGhlIGZpcnN0IGxpbmUgKi8KLSAgaWYgKGFkZHJlc3MgPT0gfiAodW5zaWduZWQgaW50KSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiUgNGQgICAgICIsIGxpbmVubyk7Ci0gICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5jaGFyczsgaWR4KyspCi0JZnByaW50ZiAobGlzdF9maWxlLCAiICIpOwotCi0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICJcdCVzXG4iLCBzdHJpbmcgPyBzdHJpbmcgOiAiIik7Ci0gICAgICAKLSAgICAgIG9uX3BhZ2UgKys7Ci0gICAgICAKLSAgICAgIGxpc3RpbmdfcGFnZSAoMCk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGhhZF9lcnJvcnMgKCkpCi0gICAgZnByaW50ZiAobGlzdF9maWxlLCAiJSA0ZCA/Pz8/ICIsIGxpbmVubyk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlIDRkICUwNHggIiwgbGluZW5vLCBhZGRyZXNzKTsKLQotICAvKiBBbmQgdGhlIGRhdGEgdG8gZ28gYWxvbmcgd2l0aCBpdCAqLwotICBpZHggPSAwOwotICAKLSAgd2hpbGUgKCpzcmMgJiYgaWR4IDwgbmNoYXJzKQotICAgIHsKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiVjJWMiLCBzcmNbMF0sIHNyY1sxXSk7Ci0gICAgICBzcmMgKz0gMjsKLSAgICAgIGJ5dGVfaW5fd29yZCsrOwotICAgICAgCi0gICAgICBpZiAoYnl0ZV9pbl93b3JkID09IExJU1RJTkdfV09SRF9TSVpFKQotCXsKLQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIiAiKTsKLQkgIGlkeCsrOwotCSAgYnl0ZV9pbl93b3JkID0gMDsKLQl9Ci0gICAgICAKLSAgICAgIGlkeCArPSAyOwotICAgIH0KLSAgCi0gIGZvciAoOyBpZHggPCBuY2hhcnM7IGlkeCsrKQotICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiAiKTsKLSAgCi0gIGZwcmludGYgKGxpc3RfZmlsZSwgIlx0JXNcbiIsIHN0cmluZyA/IHN0cmluZyA6ICIiKTsKLSAgb25fcGFnZSsrOwotICBsaXN0aW5nX3BhZ2UgKGxpc3QpOwotICAKLSAgaWYgKGxpc3QtPm1lc3NhZ2UpCi0gICAgewotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiKioqKiAgJXNcbiIsIGxpc3QtPm1lc3NhZ2UpOwotICAgICAgbGlzdGluZ19wYWdlIChsaXN0KTsKLSAgICAgIG9uX3BhZ2UrKzsKLSAgICB9Ci0gIAotICBmb3IgKGxpbmVzID0gMDsKLSAgICAgICBsaW5lcyA8ICh1bnNpZ25lZCBpbnQpIGxpc3RpbmdfbGhzX2NvbnRfbGluZXMKLQkgJiYgKnNyYzsKLSAgICAgICBsaW5lcyArKykKLSAgICB7Ci0gICAgICBuY2hhcnMgPSAoKExJU1RJTkdfV09SRF9TSVpFICogMikgKyAxKQotCSogbGlzdGluZ19saHNfd2lkdGhfc2Vjb25kIC0gMTsKLSAgICAgIGlkeCA9IDA7Ci0gICAgICAKLSAgICAgIC8qIFByaW50IGFueSBtb3JlIGxpbmVzIG9mIGRhdGEsIGJ1dCBtb3JlIGNvbXBhY3RseSAqLwotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiJSA0ZCAgICAgICIsIGxpbmVubyk7Ci0gICAgICAKLSAgICAgIHdoaWxlICgqc3JjICYmIGlkeCA8IG5jaGFycykKLQl7Ci0JICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlYyVjIiwgc3JjWzBdLCBzcmNbMV0pOwotCSAgc3JjICs9IDI7Ci0JICBpZHggKz0gMjsKLQkgIGJ5dGVfaW5fd29yZCsrOwotCSAgCi0JICBpZiAoYnl0ZV9pbl93b3JkID09IExJU1RJTkdfV09SRF9TSVpFKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiICIpOwotCSAgICAgIGlkeCsrOwotCSAgICAgIGJ5dGVfaW5fd29yZCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICAKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIlxuIik7Ci0gICAgICBvbl9wYWdlICsrOwotICAgICAgbGlzdGluZ19wYWdlIChsaXN0KTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWxpc3Rfc3ltYm9sX3RhYmxlICgpCi17Ci0gIGV4dGVybiBzeW1ib2xTICpzeW1ib2xfcm9vdFA7Ci0gIGludCBnb3Rfc29tZSA9IDA7Ci0KLSAgc3ltYm9sUyAqcHRyOwotICBlamVjdCA9IDE7Ci0gIGxpc3RpbmdfcGFnZSAoMCk7Ci0KLSAgZm9yIChwdHIgPSBzeW1ib2xfcm9vdFA7IHB0ciAhPSAoc3ltYm9sUyAqKSBOVUxMOyBwdHIgPSBzeW1ib2xfbmV4dCAocHRyKSkKLSAgICB7Ci0gICAgICBpZiAoU0VHX05PUk1BTCAoU19HRVRfU0VHTUVOVCAocHRyKSkKLQkgIHx8IFNfR0VUX1NFR01FTlQgKHB0cikgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQl7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgLyogRG9uJ3QgcmVwb3J0IHNlY3Rpb24gc3ltYm9scy4gIFRoZXkgYXJlIG5vdCBpbnRlcmVzdGluZy4gICovCi0JICBpZiAocHRyLT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQkgICAgY29udGludWU7Ci0jZW5kaWYKLQkgIGlmIChTX0dFVF9OQU1FIChwdHIpKQotCSAgICB7Ci0JICAgICAgY2hhciBidWZbMzBdLCBmbXRbOF07Ci0JICAgICAgdmFsdWVUIHZhbCA9IFNfR0VUX1ZBTFVFIChwdHIpOwotCi0JICAgICAgLyogQEAgTm90ZSB0aGF0IHRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSBjb21waWxhdGlvbiBvcHRpb25zLAotCQkgbm90IHNvbGVseSBvbiB0aGUgdGFyZ2V0IGNoYXJhY3RlcmlzdGljcy4gICovCi0JICAgICAgaWYgKHNpemVvZiAodmFsKSA9PSA0ICYmIHNpemVvZiAoaW50KSA9PSA0KQotCQlzcHJpbnRmIChidWYsICIlMDhseCIsICh1bnNpZ25lZCBsb25nKSB2YWwpOwotCSAgICAgIGVsc2UgaWYgKHNpemVvZiAodmFsKSA8PSBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKQotCQl7Ci0JCSAgc3ByaW50ZiAoZm10LCAiJSUwJWx1bHgiLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIChzaXplb2YgKHZhbCkgKiAyKSk7Ci0JCSAgc3ByaW50ZiAoYnVmLCBmbXQsICh1bnNpZ25lZCBsb25nKSB2YWwpOwotCQl9Ci0jaWYgZGVmaW5lZCAoQkZENjQpCi0JICAgICAgZWxzZSBpZiAoc2l6ZW9mICh2YWwpID4gNCkKLQkJc3ByaW50Zl92bWEgKGJ1ZiwgdmFsKTsKLSNlbmRpZgotCSAgICAgIGVsc2UKLQkJYWJvcnQgKCk7Ci0KLQkgICAgICBpZiAoIWdvdF9zb21lKQotCQl7Ci0JCSAgZnByaW50ZiAobGlzdF9maWxlLCAiREVGSU5FRCBTWU1CT0xTXG4iKTsKLQkJICBvbl9wYWdlKys7Ci0JCSAgZ290X3NvbWUgPSAxOwotCQl9Ci0KLQkgICAgICBpZiAocHRyLT5zeV9mcmFnICYmIHB0ci0+c3lfZnJhZy0+bGluZSkKLQkJewotCQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIiUyMHM6JS01ZCAgJXM6JXMgJXNcbiIsCi0JCQkgICBwdHItPnN5X2ZyYWctPmxpbmUtPmZpbGUtPmZpbGVuYW1lLAotCQkJICAgcHRyLT5zeV9mcmFnLT5saW5lLT5saW5lLAotCQkJICAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChwdHIpKSwKLQkJCSAgIGJ1ZiwgU19HRVRfTkFNRSAocHRyKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlMzNzOiVzICVzXG4iLAotCQkJICAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChwdHIpKSwKLQkJCSAgIGJ1ZiwgU19HRVRfTkFNRSAocHRyKSk7Ci0JCX0KLQotCSAgICAgIG9uX3BhZ2UgKys7Ci0JICAgICAgbGlzdGluZ19wYWdlICgwKTsKLQkgICAgfQotCX0KLQotICAgIH0KLSAgaWYgKCFnb3Rfc29tZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICJOTyBERUZJTkVEIFNZTUJPTFNcbiIpOwotICAgICAgb25fcGFnZSsrOwotICAgIH0KLSAgZnByaW50ZiAobGlzdF9maWxlLCAiXG4iKTsKLSAgb25fcGFnZSsrOwotICBsaXN0aW5nX3BhZ2UgKDApOwotCi0gIGdvdF9zb21lID0gMDsKLQotICBmb3IgKHB0ciA9IHN5bWJvbF9yb290UDsgcHRyICE9IChzeW1ib2xTICopIE5VTEw7IHB0ciA9IHN5bWJvbF9uZXh0IChwdHIpKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9OQU1FIChwdHIpICYmIHN0cmxlbiAoU19HRVRfTkFNRSAocHRyKSkgIT0gMCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAocHRyKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGlmICghZ290X3NvbWUpCi0JCXsKLQkJICBnb3Rfc29tZSA9IDE7Ci0JCSAgZnByaW50ZiAobGlzdF9maWxlLCAiVU5ERUZJTkVEIFNZTUJPTFNcbiIpOwotCQkgIG9uX3BhZ2UrKzsKLQkJICBsaXN0aW5nX3BhZ2UgKDApOwotCQl9Ci0JICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiJXNcbiIsIFNfR0VUX05BTUUgKHB0cikpOwotCSAgICAgIG9uX3BhZ2UrKzsKLQkgICAgICBsaXN0aW5nX3BhZ2UgKDApOwotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKCFnb3Rfc29tZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICJOTyBVTkRFRklORUQgU1lNQk9MU1xuIik7Ci0gICAgICBvbl9wYWdlKys7Ci0gICAgICBsaXN0aW5nX3BhZ2UgKDApOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3NvdXJjZSAoY3VycmVudF9maWxlLCBsaXN0LCBidWZmZXIsIHdpZHRoKQotICAgICBmaWxlX2luZm9fdHlwZSAqY3VycmVudF9maWxlOwotICAgICBsaXN0X2luZm9fdHlwZSAqbGlzdDsKLSAgICAgY2hhciAqYnVmZmVyOwotICAgICB1bnNpZ25lZCBpbnQgd2lkdGg7Ci17Ci0gIGlmICghY3VycmVudF9maWxlLT5hdF9lbmQpCi0gICAgewotICAgICAgd2hpbGUgKGN1cnJlbnRfZmlsZS0+bGluZW51bSA8IGxpc3QtPmhsbF9saW5lCi0JICAgICAmJiAhY3VycmVudF9maWxlLT5hdF9lbmQpCi0JewotCSAgY2hhciAqcCA9IGJ1ZmZlcl9saW5lIChjdXJyZW50X2ZpbGUsIGJ1ZmZlciwgd2lkdGgpOwotCSAgZnByaW50ZiAobGlzdF9maWxlLCAiJTR1OiUtMTNzICoqKiogJXNcbiIsIGN1cnJlbnRfZmlsZS0+bGluZW51bSwKLQkJICAgY3VycmVudF9maWxlLT5maWxlbmFtZSwgcCk7Ci0JICBvbl9wYWdlKys7Ci0JICBsaXN0aW5nX3BhZ2UgKGxpc3QpOwotCX0KLSAgICB9Ci19Ci0KLS8qIFNvbWV0aW1lcyB0aGUgdXNlciBkb2Vzbid0IHdhbnQgdG8gYmUgYm90aGVyZWQgYnkgdGhlIGRlYnVnZ2luZwotICAgcmVjb3JkcyBpbnNlcnRlZCBieSB0aGUgY29tcGlsZXIsIHNlZSBpZiB0aGUgbGluZSBpcyBzdXNwaWNpb3VzLiAgKi8KLQotc3RhdGljIGludAotZGVidWdnaW5nX3BzZXVkbyAobGlzdCwgbGluZSkKLSAgICAgbGlzdF9pbmZvX3R5cGUgKmxpc3Q7Ci0gICAgIGNvbnN0IGNoYXIgKmxpbmU7Ci17Ci0gIHN0YXRpYyBpbnQgaW5fZGVidWc7Ci0gIGludCB3YXNfZGVidWc7Ci0KLSAgaWYgKGxpc3QtPmRlYnVnZ2luZykKLSAgICB7Ci0gICAgICBpbl9kZWJ1ZyA9IDE7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgd2FzX2RlYnVnID0gaW5fZGVidWc7Ci0gIGluX2RlYnVnID0gMDsKLQotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpsaW5lKSkKLSAgICBsaW5lKys7Ci0KLSAgaWYgKCpsaW5lICE9ICcuJykKLSAgICB7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgLyogVGhlIEVMRiBjb21waWxlciBzb21ldGltZXMgZW1pdHMgYmxhbmsgbGluZXMgYWZ0ZXIgc3dpdGNoaW5nCi0gICAgICAgICBvdXQgb2YgYSBkZWJ1Z2dpbmcgc2VjdGlvbi4gIElmIHRoZSBuZXh0IGxpbmUgZHJvcHMgdXMgYmFjawotICAgICAgICAgaW50byBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHRoZW4gZG9uJ3QgcHJpbnQgdGhlIGJsYW5rIGxpbmUuCi0gICAgICAgICBUaGlzIGlzIGEgaGFjayBmb3IgYSBwYXJ0aWN1bGFyIGNvbXBpbGVyIGJlaGF2aW91ciwgbm90IGEKLSAgICAgICAgIGdlbmVyYWwgY2FzZS4gICovCi0gICAgICBpZiAod2FzX2RlYnVnCi0JICAmJiAqbGluZSA9PSAnXDAnCi0JICAmJiBsaXN0LT5uZXh0ICE9IE5VTEwKLQkgICYmIGxpc3QtPm5leHQtPmRlYnVnZ2luZykKLQl7Ci0JICBpbl9kZWJ1ZyA9IDE7Ci0JICByZXR1cm4gMTsKLQl9Ci0jZW5kaWYKLQotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGxpbmUrKzsKLQotICBpZiAoc3RybmNtcCAobGluZSwgImRlZiIsIDMpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAidmFsIiwgMykgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJzY2wiLCAzKSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgImxpbmUiLCA0KSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgImVuZGVmIiwgNSkgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJsbiIsIDIpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAidHlwZSIsIDQpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAic2l6ZSIsIDQpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAiZGltIiwgMykgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJ0YWciLCAzKSA9PSAwKQotICAgIHJldHVybiAxOwotCi0gIGlmIChzdHJuY21wIChsaW5lLCAic3RhYnMiLCA1KSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgInN0YWJuIiwgNSkgPT0gMCkKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLWxpc3RpbmdfbGlzdGluZyAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgbGlzdF9pbmZvX3R5cGUgKmxpc3QgPSBoZWFkOwotICBmaWxlX2luZm9fdHlwZSAqY3VycmVudF9obGxfZmlsZSA9IChmaWxlX2luZm9fdHlwZSAqKSBOVUxMOwotICBjaGFyICptZXNzYWdlOwotICBjaGFyICpidWZmZXI7Ci0gIGNoYXIgKnA7Ci0gIGludCBzaG93X2xpc3RpbmcgPSAxOwotICB1bnNpZ25lZCBpbnQgd2lkdGg7Ci0KLSAgYnVmZmVyID0geG1hbGxvYyAobGlzdGluZ19yaHNfd2lkdGgpOwotICBkYXRhX2J1ZmZlciA9IHhtYWxsb2MgKE1BWF9CWVRFUyk7Ci0gIGVqZWN0ID0gMTsKLSAgbGlzdCA9IGhlYWQ7Ci0KLSAgd2hpbGUgKGxpc3QgIT0gKGxpc3RfaW5mb190eXBlICopIE5VTEwgJiYgMCkKLSAgICB7Ci0gICAgICBpZiAobGlzdC0+bmV4dCkKLQlsaXN0LT5mcmFnID0gbGlzdC0+bmV4dC0+ZnJhZzsKLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotCi0gICAgfQotCi0gIGxpc3QgPSBoZWFkLT5uZXh0OwotCi0KLSAgd2hpbGUgKGxpc3QpCi0gICAgewotICAgICAgaW50IGxpc3RfbGluZTsKLQotICAgICAgd2lkdGggPSBsaXN0aW5nX3Joc193aWR0aCA+IHBhcGVyX3dpZHRoID8gcGFwZXJfd2lkdGggOgotCWxpc3RpbmdfcmhzX3dpZHRoOwotCi0gICAgICBsaXN0X2xpbmUgPSBsaXN0LT5saW5lOwotICAgICAgc3dpdGNoIChsaXN0LT5lZGljdCkKLQl7Ci0JY2FzZSBFRElDVF9MSVNUOgotCSAgLyogU2tpcCBhbGwgbGluZXMgdXAgdG8gdGhlIGN1cnJlbnQuICAqLwotCSAgbGlzdF9saW5lLS07Ci0JICBicmVhazsKLQljYXNlIEVESUNUX05PTElTVDoKLQkgIHNob3dfbGlzdGluZy0tOwotCSAgYnJlYWs7Ci0JY2FzZSBFRElDVF9OT0xJU1RfTkVYVDoKLQkgIGJyZWFrOwotCWNhc2UgRURJQ1RfRUpFQ1Q6Ci0JICBicmVhazsKLQljYXNlIEVESUNUX05PTkU6Ci0JICBicmVhazsKLQljYXNlIEVESUNUX1RJVExFOgotCSAgdGl0bGUgPSBsaXN0LT5lZGljdF9hcmc7Ci0JICBicmVhazsKLQljYXNlIEVESUNUX1NCVFRMOgotCSAgc3VidGl0bGUgPSBsaXN0LT5lZGljdF9hcmc7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBpZiAoc2hvd19saXN0aW5nIDw9IDApCi0JewotCSAgd2hpbGUgKGxpc3QtPmZpbGUtPmxpbmVudW0gPCBsaXN0X2xpbmUKLQkJICYmICFsaXN0LT5maWxlLT5hdF9lbmQpCi0JICAgIHAgPSBidWZmZXJfbGluZSAobGlzdC0+ZmlsZSwgYnVmZmVyLCB3aWR0aCk7Ci0JfQotCi0gICAgICBpZiAobGlzdC0+ZWRpY3QgPT0gRURJQ1RfTElTVCkKLQl7Ci0JICAvKiBFbmFibGUgbGlzdGluZyBmb3IgdGhlIHNpbmdsZSBsaW5lIHRoYXQgY2F1c2VkIHRoZSBlbmFibGUuICAqLwotCSAgbGlzdF9saW5lKys7Ci0JICBzaG93X2xpc3RpbmcrKzsKLQl9Ci0KLSAgICAgIGlmIChzaG93X2xpc3RpbmcgPiAwKQotCXsKLQkgIC8qIFNjYW4gZG93biB0aGUgbGlzdCBhbmQgcHJpbnQgYWxsIHRoZSBzdHVmZiB3aGljaCBjYW4gYmUgZG9uZQotCSAgICAgd2l0aCB0aGlzIGxpbmUgKG9yIGxpbmVzKS4gICovCi0JICBtZXNzYWdlID0gMDsKLQotCSAgaWYgKGxpc3QtPmhsbF9maWxlKQotCSAgICB7Ci0JICAgICAgY3VycmVudF9obGxfZmlsZSA9IGxpc3QtPmhsbF9maWxlOwotCSAgICB9Ci0KLQkgIGlmIChjdXJyZW50X2hsbF9maWxlICYmIGxpc3QtPmhsbF9saW5lICYmIChsaXN0aW5nICYgTElTVElOR19ITEwpKQotCSAgICB7Ci0JICAgICAgcHJpbnRfc291cmNlIChjdXJyZW50X2hsbF9maWxlLCBsaXN0LCBidWZmZXIsIHdpZHRoKTsKLQkgICAgfQotCi0JICBpZiAobGlzdC0+bGluZV9jb250ZW50cykKLQkgICAgewotCSAgICAgIGlmICghKChsaXN0aW5nICYgTElTVElOR19OT0RFQlVHKQotCQkgICAgJiYgZGVidWdnaW5nX3BzZXVkbyAobGlzdCwgbGlzdC0+bGluZV9jb250ZW50cykpKQotCQl7Ci0gCQkgIHByaW50X2xpbmVzIChsaXN0LAotCQkJICAgICAgIGxpc3QtPmZpbGUtPmxpbmVudW0gPT0gMCA/IGxpc3QtPmxpbmUgOiBsaXN0LT5maWxlLT5saW5lbnVtLAotCQkJICAgICAgIGxpc3QtPmxpbmVfY29udGVudHMsIGNhbGNfaGV4IChsaXN0KSk7Ci0JCX0KLQkgICAgICBmcmVlIChsaXN0LT5saW5lX2NvbnRlbnRzKTsKLQkgICAgICBsaXN0LT5saW5lX2NvbnRlbnRzID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgd2hpbGUgKGxpc3QtPmZpbGUtPmxpbmVudW0gPCBsaXN0X2xpbmUKLQkJICAgICAmJiAhbGlzdC0+ZmlsZS0+YXRfZW5kKQotCQl7Ci0JCSAgdW5zaWduZWQgaW50IGFkZHJlc3M7Ci0KLQkJICBwID0gYnVmZmVyX2xpbmUgKGxpc3QtPmZpbGUsIGJ1ZmZlciwgd2lkdGgpOwotCi0JCSAgaWYgKGxpc3QtPmZpbGUtPmxpbmVudW0gPCBsaXN0X2xpbmUpCi0JCSAgICBhZGRyZXNzID0gfiAodW5zaWduZWQgaW50KSAwOwotCQkgIGVsc2UKLQkJICAgIGFkZHJlc3MgPSBjYWxjX2hleCAobGlzdCk7Ci0KLQkJICBpZiAoISgobGlzdGluZyAmIExJU1RJTkdfTk9ERUJVRykKLQkJCSYmIGRlYnVnZ2luZ19wc2V1ZG8gKGxpc3QsIHApKSkKLQkJICAgIHByaW50X2xpbmVzIChsaXN0LCBsaXN0LT5maWxlLT5saW5lbnVtLCBwLCBhZGRyZXNzKTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChsaXN0LT5lZGljdCA9PSBFRElDVF9FSkVDVCkKLQkgICAgewotCSAgICAgIGVqZWN0ID0gMTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGxpc3QtPmVkaWN0ID09IEVESUNUX05PTElTVF9ORVhUKQotCS0tc2hvd19saXN0aW5nOwotCi0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgICB9Ci0KLSAgZnJlZSAoYnVmZmVyKTsKLSAgZnJlZSAoZGF0YV9idWZmZXIpOwotICBkYXRhX2J1ZmZlciA9IE5VTEw7Ci19Ci0KLXZvaWQKLWxpc3RpbmdfcHJpbnQgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGludCB1c2luZ19zdGRvdXQ7Ci0gIAotICB0aXRsZSA9ICIiOwotICBzdWJ0aXRsZSA9ICIiOwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgewotICAgICAgbGlzdF9maWxlID0gc3Rkb3V0OwotICAgICAgdXNpbmdfc3Rkb3V0ID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsaXN0X2ZpbGUgPSBmb3BlbiAobmFtZSwgInciKTsKLSAgICAgIGlmIChsaXN0X2ZpbGUgIT0gTlVMTCkKLQl1c2luZ19zdGRvdXQgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIGFzX3BlcnJvciAoXygiY2FuJ3Qgb3BlbiBsaXN0IGZpbGU6ICVzIiksIG5hbWUpOwotCSAgbGlzdF9maWxlID0gc3Rkb3V0OwotCSAgdXNpbmdfc3Rkb3V0ID0gMTsKLQl9Ci0gICAgfQotCi0gIGlmIChsaXN0aW5nICYgTElTVElOR19OT0ZPUk0pCi0gICAgewotICAgICAgcGFwZXJfaGVpZ2h0ID0gMDsKLSAgICB9Ci0KLSAgaWYgKGxpc3RpbmcgJiBMSVNUSU5HX0xJU1RJTkcpCi0gICAgewotICAgICAgbGlzdGluZ19saXN0aW5nIChuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKGxpc3RpbmcgJiBMSVNUSU5HX1NZTUJPTFMpCi0gICAgewotICAgICAgbGlzdF9zeW1ib2xfdGFibGUgKCk7Ci0gICAgfQotCi0gIGlmICghIHVzaW5nX3N0ZG91dCkKLSAgICB7Ci0gICAgICBpZiAoZmNsb3NlIChsaXN0X2ZpbGUpID09IEVPRikKLQlhc19wZXJyb3IgKF8oImVycm9yIGNsb3NpbmcgbGlzdCBmaWxlOiAlcyIpLCBuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKGxhc3Rfb3Blbl9maWxlKQotICAgIHsKLSAgICAgIGZjbG9zZSAobGFzdF9vcGVuX2ZpbGUpOwotICAgIH0KLX0KLQotCi12b2lkCi1saXN0aW5nX2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGZuID0gbmFtZTsKLX0KLQotdm9pZAotbGlzdGluZ19lamVjdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAobGlzdGluZykKLSAgICBsaXN0aW5nX3RhaWwtPmVkaWN0ID0gRURJQ1RfRUpFQ1Q7Ci19Ci0KLXZvaWQKLWxpc3RpbmdfZmxhZ3MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgd2hpbGUgKCgqaW5wdXRfbGluZV9wb2ludGVyKyspICYmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcbicpKQotICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCi19Ci0KLS8qIFR1cm4gbGlzdGluZyBvbiBvciBvZmYuICBBbiBhcmd1bWVudCBvZiAwIG1lYW5zIHRvIHR1cm4gb2ZmCi0gICBsaXN0aW5nLiAgQW4gYXJndW1lbnQgb2YgMSBtZWFucyB0byB0dXJuIG9uIGxpc3RpbmcuICBBbiBhcmd1bWVudAotICAgb2YgMiBtZWFucyB0byB0dXJuIG9mZiBsaXN0aW5nLCBidXQgYXMgb2YgdGhlIG5leHQgbGluZTsgdGhhdCBpcywKLSAgIHRoZSBjdXJyZW50IGxpbmUgc2hvdWxkIGJlIGxpc3RlZCwgYnV0IHRoZSBuZXh0IGxpbmUgc2hvdWxkIG5vdC4gICovCi0KLXZvaWQKLWxpc3RpbmdfbGlzdCAob24pCi0gICAgIGludCBvbjsKLXsKLSAgaWYgKGxpc3RpbmcpCi0gICAgewotICAgICAgc3dpdGNoIChvbikKLQl7Ci0JY2FzZSAwOgotCSAgaWYgKGxpc3RpbmdfdGFpbC0+ZWRpY3QgPT0gRURJQ1RfTElTVCkKLQkgICAgbGlzdGluZ190YWlsLT5lZGljdCA9IEVESUNUX05PTkU7Ci0JICBlbHNlCi0JICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3QgPSBFRElDVF9OT0xJU1Q7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICBpZiAobGlzdGluZ190YWlsLT5lZGljdCA9PSBFRElDVF9OT0xJU1QKLQkgICAgICB8fCBsaXN0aW5nX3RhaWwtPmVkaWN0ID09IEVESUNUX05PTElTVF9ORVhUKQotCSAgICBsaXN0aW5nX3RhaWwtPmVkaWN0ID0gRURJQ1RfTk9ORTsKLQkgIGVsc2UKLQkgICAgbGlzdGluZ190YWlsLT5lZGljdCA9IEVESUNUX0xJU1Q7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBsaXN0aW5nX3RhaWwtPmVkaWN0ID0gRURJQ1RfTk9MSVNUX05FWFQ7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLX0KLQotCi12b2lkCi1saXN0aW5nX3BzaXplICh3aWR0aF9vbmx5KQotICAgICBpbnQgd2lkdGhfb25seTsKLXsKLSAgaWYgKCEgd2lkdGhfb25seSkKLSAgICB7Ci0gICAgICBwYXBlcl9oZWlnaHQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICAgICAgaWYgKHBhcGVyX2hlaWdodCA8IDAgfHwgcGFwZXJfaGVpZ2h0ID4gMTAwMCkKLQl7Ci0JICBwYXBlcl9oZWlnaHQgPSAwOwotCSAgYXNfd2FybiAoXygic3RyYW5nZSBwYXBlciBoZWlnaHQsIHNldCB0byBubyBmb3JtIikpOwotCX0KLQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCXsKLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgcGFwZXJfd2lkdGggPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi1saXN0aW5nX25vcGFnZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBwYXBlcl9oZWlnaHQgPSAwOwotfQotCi12b2lkCi1saXN0aW5nX3RpdGxlIChkZXB0aCkKLSAgICAgaW50IGRlcHRoOwotewotICBpbnQgcXVvdGVkOwotICBjaGFyICpzdGFydDsKLSAgY2hhciAqdHRsOwotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wiJykKLSAgICBxdW90ZWQgPSAwOwotICBlbHNlCi0gICAgewotICAgICAgcXVvdGVkID0gMTsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcikKLSAgICB7Ci0gICAgICBpZiAocXVvdGVkCi0JICA/ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wiJwotCSAgOiBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JewotCSAgaWYgKGxpc3RpbmcpCi0JICAgIHsKLQkgICAgICBsZW5ndGggPSBpbnB1dF9saW5lX3BvaW50ZXIgLSBzdGFydDsKLQkgICAgICB0dGwgPSB4bWFsbG9jIChsZW5ndGggKyAxKTsKLQkgICAgICBtZW1jcHkgKHR0bCwgc3RhcnQsIGxlbmd0aCk7Ci0JICAgICAgdHRsW2xlbmd0aF0gPSAwOwotCSAgICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3QgPSBkZXB0aCA/IEVESUNUX1NCVFRMIDogRURJQ1RfVElUTEU7Ci0JICAgICAgbGlzdGluZ190YWlsLT5lZGljdF9hcmcgPSB0dGw7Ci0JICAgIH0KLQkgIGlmIChxdW90ZWQpCi0JICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JewotCSAgYXNfYmFkIChfKCJOZXcgbGluZSBpbiB0aXRsZSIpKTsKLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCX0KLSAgICB9Ci19Ci0KLQotCi12b2lkCi1saXN0aW5nX3NvdXJjZV9saW5lIChsaW5lKQotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLXsKLSAgaWYgKGxpc3RpbmcpCi0gICAgewotICAgICAgbmV3X2ZyYWcgKCk7Ci0gICAgICBsaXN0aW5nX3RhaWwtPmhsbF9saW5lID0gbGluZTsKLSAgICAgIG5ld19mcmFnICgpOwotICAgIH0KLX0KLQotdm9pZAotbGlzdGluZ19zb3VyY2VfZmlsZSAoZmlsZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLXsKLSAgaWYgKGxpc3RpbmcpCi0gICAgbGlzdGluZ190YWlsLT5obGxfZmlsZSA9IGZpbGVfaW5mbyAoZmlsZSk7Ci19Ci0KLQotCi0jZWxzZQotCi0KLS8qIER1bW15IGZ1bmN0aW9ucyBmb3Igd2hlbiBjb21waWxlZCB3aXRob3V0IGxpc3RpbmcgZW5hYmxlZCAqLwotCi12b2lkCi1saXN0aW5nX2ZsYWdzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHNfaWdub3JlICgwKTsKLX0KLQotdm9pZCAKLWxpc3RpbmdfbGlzdCAob24pCi0gICAgIGludCBvbjsKLXsKLSAgc19pZ25vcmUgKDApOwotfQotCi12b2lkIAotbGlzdGluZ19lamVjdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzX2lnbm9yZSAoMCk7Ci19Ci0KLXZvaWQgCi1saXN0aW5nX3BzaXplIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHNfaWdub3JlICgwKTsKLX0KLQotdm9pZAotbGlzdGluZ19ub3BhZ2UgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc19pZ25vcmUgKDApOwotfQotCi12b2lkIAotbGlzdGluZ190aXRsZSAoZGVwdGgpCi0gICAgIGludCBkZXB0aDsKLXsKLSAgc19pZ25vcmUgKDApOwotfQotCi12b2lkCi1saXN0aW5nX2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0KLX0KLQotdm9pZCAKLWxpc3RpbmdfbmV3bGluZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLQotfQotCi12b2lkIAotbGlzdGluZ19zb3VyY2VfbGluZSAobikKLSAgICAgdW5zaWduZWQgaW50IG47Ci17Ci0KLX0KLXZvaWQgCi1saXN0aW5nX3NvdXJjZV9maWxlIChuKQotICAgICBjb25zdCBjaGFyICpuOwotewotCi19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2xpc3RpbmcuaCBiL2dhcy9saXN0aW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZDVjMzcuLjAwMDAwMDAKLS0tIGEvZ2FzL2xpc3RpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBsaXN0aW5nLmgKLSAgIENvcHlyaWdodCAoQykgMTk4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfX2xpc3RpbmdfaF9fCi0jZGVmaW5lIF9fbGlzdGluZ19oX18KLQotI2RlZmluZSBMSVNUSU5HX0xJU1RJTkcgICAgMQotI2RlZmluZSBMSVNUSU5HX1NZTUJPTFMgICAgMgotI2RlZmluZSBMSVNUSU5HX05PRk9STSAgICAgNAotI2RlZmluZSBMSVNUSU5HX0hMTCAgICAgICAgOAotI2RlZmluZSBMSVNUSU5HX05PREVCVUcgICAxNgotI2RlZmluZSBMSVNUSU5HX05PQ09ORAkgIDMyCi0jZGVmaW5lIExJU1RJTkdfTUFDRVhQCSAgNjQKLQotI2RlZmluZSBMSVNUSU5HX0RFRkFVTFQgICAgKExJU1RJTkdfTElTVElORyB8IExJU1RJTkdfSExMIHwgTElTVElOR19TWU1CT0xTKQotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSNkZWZpbmUgTElTVElOR19ORVdMSU5FKCkgeyBpZiAobGlzdGluZykgbGlzdGluZ19uZXdsaW5lKE5VTEwpOyB9Ci0jZWxzZQotI2RlZmluZSBMSVNUSU5HX05FV0xJTkUoKSB7O30KLSNlbmRpZgotI2RlZmluZSBMSVNUSU5HX0VPRigpICAgICBMSVNUSU5HX05FV0xJTkUoKQotCi0jZGVmaW5lIExJU1RJTkdfU0tJUF9DT05EKCkgKChsaXN0aW5nICYgTElTVElOR19OT0NPTkQpICE9IDApCi0KLXZvaWQgbGlzdGluZ19lamVjdCBQQVJBTVMgKChpbnQpKTsKLXZvaWQgbGlzdGluZ19lcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICptZXNzYWdlKSk7Ci12b2lkIGxpc3RpbmdfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci12b2lkIGxpc3RpbmdfZmxhZ3MgUEFSQU1TICgoaW50KSk7Ci12b2lkIGxpc3RpbmdfbGlzdCBQQVJBTVMgKChpbnQgb24pKTsKLXZvaWQgbGlzdGluZ19uZXdsaW5lIFBBUkFNUyAoKGNoYXIgKnBzKSk7Ci12b2lkIGxpc3RpbmdfcHJldl9saW5lIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgbGlzdGluZ19wcmludCBQQVJBTVMgKChjaGFyICpuYW1lKSk7Ci12b2lkIGxpc3RpbmdfcHNpemUgUEFSQU1TICgoaW50KSk7Ci12b2lkIGxpc3Rpbmdfbm9wYWdlIFBBUkFNUyAoKGludCkpOwotdm9pZCBsaXN0aW5nX3NvdXJjZV9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotdm9pZCBsaXN0aW5nX3NvdXJjZV9saW5lIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotdm9pZCBsaXN0aW5nX3RpdGxlIFBBUkFNUyAoKGludCBkZXB0aCkpOwotdm9pZCBsaXN0aW5nX3dhcm5pbmcgUEFSQU1TICgoY29uc3QgY2hhciAqbWVzc2FnZSkpOwotdm9pZCBsaXN0aW5nX3dpZHRoIFBBUkFNUyAoKHVuc2lnbmVkIGludCB4KSk7Ci0KLWV4dGVybiBpbnQgbGlzdGluZ19saHNfd2lkdGg7Ci1leHRlcm4gaW50IGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZDsKLWV4dGVybiBpbnQgbGlzdGluZ19saHNfY29udF9saW5lczsKLWV4dGVybiBpbnQgbGlzdGluZ19yaHNfd2lkdGg7Ci0KLSNlbmRpZiAvKiBfX2xpc3RpbmdfaF9fICovCi0KLS8qIGVuZCBvZiBsaXN0aW5nLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9saXRlcmFsLmMgYi9nYXMvbGl0ZXJhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2Y4ZmM0Li4wMDAwMDAwCi0tLSBhL2dhcy9saXRlcmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKiBhcy5jIC0gR0FTIGxpdGVyYWwgcG9vbCBtYW5hZ2VtZW50LgotICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBLZW4gUmFlYnVybiAocmFlYnVybkBjeWdudXMuY29tKS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qIFRoaXMgaXNuJ3QgcXVpdGUgYSAiY29uc3RhbnQiIHBvb2wuICBTb21lIG9mIHRoZSB2YWx1ZXMgbWF5IGdldAotICAgYWRqdXN0ZWQgYXQgcnVuIHRpbWUsIGUuZy4sIGZvciBzeW1ib2xpYyByZWxvY2F0aW9ucyB3aGVuIHNoYXJlZAotICAgbGlicmFyaWVzIGFyZSBpbiB1c2UuICBJdCdzIG1vcmUgb2YgYSAibGl0ZXJhbCIgcG9vbC4KLQotICAgT24gdGhlIEFscGhhLCB0aGlzIHNob3VsZCBiZSB1c2VkIGZvciAubGl0YSBhbmQgLmxpdDguICAoSXMgdGhlcmUKLSAgIGV2ZXIgYSAubGl0ND8pICBPbiB0aGUgTUlQUywgaXQgY291bGQgYmUgdXNlZCBmb3IgLmxpdDQgYXMgd2VsbC4KLQotICAgVGhlIGV4cHJlc3Npb25zIHBhc3NlZCBoZXJlIHNob3VsZCBjb250YWluIGVpdGhlciBjb25zdGFudHMgb3Igc3ltYm9scywKLSAgIG5vdCBhIGNvbWJpbmF0aW9uIG9mIGJvdGguICBUeXBpY2FsbHksIHRoZSBjb25zdGFudCBwb29sIGlzIGFjY2Vzc2VkCi0gICB3aXRoIHNvbWUgc29ydCBvZiBHUCByZWdpc3Rlciwgc28gdGhlIHNpemUgb2YgdGhlIHBvb2wgbXVzdCBiZSBrZXB0IGRvd24KLSAgIGlmIHBvc3NpYmxlLiAgVGhlIGV4Y2VwdGlvbiBpcyBzZWN0aW9uIG9mZnNldHMgLS0gaWYgeW91J3JlIHN0b3JpbmcgYQotICAgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgLmRhdGEsIGZvciBleGFtcGxlLCBhbmQgeW91ciBtYWNoaW5lIHByb3ZpZGVzCi0gICBmb3IgMTYtYml0IHNpZ25lZCBhZGRlbmRzLCB5b3UgbWlnaHQgd2FudCB0byBzdG9yZSAuZGF0YSszMkssIHNvIHRoYXQKLSAgIHlvdSBjYW4gYWNjZXNzIGFsbCBvZiB0aGUgZmlyc3QgNjRLIG9mIC5kYXRhIHdpdGggdGhlIG9uZSBwb2ludGVyLgotCi0gICBUaGlzIGlzbid0IGEgcmVxdWlyZW1lbnQsIGp1c3QgYSBndWlkZWxpbmUgdGhhdCBjYW4gaGVscCBrZWVwIC5vIGZpbGUKLSAgIHNpemUgZG93bi4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICYmIGRlZmluZWQgKE5FRURfTElURVJBTF9QT09MKQotCi12YWx1ZVQKLWFkZF90b19saXRlcmFsX3Bvb2wgKHN5bSwgYWRkZW5kLCBzZWMsIHNpemUpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgdmFsdWVUIGFkZGVuZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGludCBzaXplOwotewotICBzZWdUIGN1cnJlbnRfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIGludCBjdXJyZW50X3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvY190eXBlOwotICBjaGFyICpwOwotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBmaXhTICpmaXhwOwotCi0gIG9mZnNldCA9IDA7Ci0gIC8qIEBAIFRoaXMgYXNzdW1lcyBhbGwgZW50cmllcyBpbiBhIGdpdmVuIHNlY3Rpb24gd2lsbCBiZSBvZiB0aGUgc2FtZQotICAgICBzaXplLi4uICBQcm9iYWJseSBjb3JyZWN0LCBidXQgdW53aXNlIHRvIHJlbHkgb24uICAqLwotICAvKiBUaGlzIG11c3QgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIHRoZSBzYW1lIHN1YnNlZ21lbnQuICAqLwotICBpZiAoc2VnaW5mby0+ZnJjaGFpblApCi0gICAgZm9yIChmaXhwID0gc2VnaW5mby0+ZnJjaGFpblAtPmZpeF9yb290OwotCSBmaXhwICE9IChmaXhTICopIE5VTEw7Ci0JIGZpeHAgPSBmaXhwLT5meF9uZXh0LCBvZmZzZXQgKz0gc2l6ZSkKLSAgICAgIHsKLQlpZiAoZml4cC0+ZnhfYWRkc3kgPT0gc3ltICYmIGZpeHAtPmZ4X29mZnNldCA9PSBhZGRlbmQpCi0JICByZXR1cm4gb2Zmc2V0OwotICAgICAgfQotCi0gIHN1YnNlZ19zZXQgKHNlYywgMCk7Ci0gIHAgPSBmcmFnX21vcmUgKHNpemUpOwotICBtZW1zZXQgKHAsIDAsIHNpemUpOwotCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSA0OgotICAgICAgcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ18zMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSAgICAgIHJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfNjQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBzaXplLCBzeW0sIGFkZGVuZCwgMCwKLQkgICByZWxvY190eXBlKTsKLQotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlY3Rpb24sIGN1cnJlbnRfc3Vic2VjKTsKLSAgb2Zmc2V0ID0gc2VnaW5mby0+bGl0ZXJhbF9wb29sX3NpemU7Ci0gIHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplICs9IHNpemU7Ci0gIHJldHVybiBvZmZzZXQ7Ci19Ci0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwpkaWZmIC0tZ2l0IGEvZ2FzL21hYy1hcy5yIGIvZ2FzL21hYy1hcy5yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzZjMDMzLi4wMDAwMDAwCi0tLSBhL2dhcy9tYWMtYXMucgorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIFJlc291cmNlcyBmb3IgR05VIEFTLiAqLwotCi0jaW5jbHVkZSAiU3lzVHlwZXMuciIKLQotLyogVmVyc2lvbiByZXNvdXJjZXMuICovCi0KLXJlc291cmNlICd2ZXJzJyAoMSkgIHsKLQkwLAotCTAsCi0JMCwKLQkwLAotCXZlclVzLAotCVZFUlNJT05fU1RSSU5HLAotCVZFUlNJT05fU1RSSU5HICAiIChDKSAxOTg2LTk1IEZTRiwgSW5jLiIKLX07Ci0KLXJlc291cmNlICd2ZXJzJyAoMiwgcHVyZ2VhYmxlKSAgewotCTAsCi0JMCwKLQkwLAotCTAsCi0JdmVyVXMsCi0JVkVSU0lPTl9TVFJJTkcsCi0JIkdBUyAiIFZFUlNJT05fU1RSSU5HICIgZm9yIE1QVyIKLX07Ci0KLSNpZmRlZiBXQU5UX0NGUkcKLQotI2luY2x1ZGUgIkNvZGVGcmFnbWVudFR5cGVzLnIiCi0KLXJlc291cmNlICdjZnJnJyAoMCkgewotCXsKLQkJa1Bvd2VyUEMsCi0JCWtGdWxsTGliLAotCQlrTm9WZXJzaW9uTnVtLCBrTm9WZXJzaW9uTnVtLAotCQkwLDAsCi0JCWtJc0FwcCwga09uRGlza0ZsYXQsIGtaZXJvT2Zmc2V0LCBrV2hvbGVGb3JrLAotCQlQUk9HX05BTUUKLQl9Ci19OwotCi0jZW5kaWYgLyogV0FOVF9DRlJHICovCmRpZmYgLS1naXQgYS9nYXMvbWFjcm8uYyBiL2dhcy9tYWNyby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDkyZmY0Li4wMDAwMDAwCi0tLSBhL2dhcy9tYWNyby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI1OSArMCwwIEBACi0vKiBtYWNyby5jIC0gbWFjcm8gc3VwcG9ydCBmb3IgZ2FzIGFuZCBnYXNwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgU3RldmUgYW5kIEp1ZHkgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQsCi0gICAgICBzYWNAY3lnbnVzLmNvbQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotLyogQUlYIHJlcXVpcmVzIHRoaXMgdG8gYmUgdGhlIGZpcnN0IHRoaW5nIGluIHRoZSBmaWxlLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotIyBpZm5kZWYgYWxsb2NhCi0jICBpZmRlZiBfX1NURENfXwotZXh0ZXJuIHZvaWQgKmFsbG9jYSAoKTsKLSMgIGVsc2UKLWV4dGVybiBjaGFyICphbGxvY2EgKCk7Ci0jICBlbmRpZgotIyBlbmRpZgotI2Vsc2UKLSMgaWYgSEFWRV9BTExPQ0FfSAotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsc2UKLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgZWxzZQotIyAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi0jICAgIGlmICFkZWZpbmVkIChfX1NURENfXykgJiYgIWRlZmluZWQgKF9faHB1eCkKLWV4dGVybiBjaGFyICphbGxvY2EgKCk7Ci0jICAgIGVsc2UKLWV4dGVybiB2b2lkICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmIC8qIF9fU1REQ19fLCBfX2hwdXggKi8KLSMgICBlbmRpZiAvKiBhbGxvY2EgKi8KLSMgIGVuZGlmIC8qIF9BSVggKi8KLSMgZW5kaWYgLyogSEFWRV9BTExPQ0FfSCAqLwotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJzYi5oIgotI2luY2x1ZGUgImhhc2guaCIKLSNpbmNsdWRlICJtYWNyby5oIgotCi0jaW5jbHVkZSAiYXNpbnRsLmgiCi0KLS8qIFRoZSByb3V0aW5lcyBpbiB0aGlzIGZpbGUgaGFuZGxlIG1hY3JvIGRlZmluaXRpb24gYW5kIGV4cGFuc2lvbi4KLSAgIFRoZXkgYXJlIGNhbGxlZCBieSBib3RoIGdhc3AgYW5kIGdhcy4gICovCi0KLS8qIFN0cnVjdHVyZXMgdXNlZCB0byBzdG9yZSBtYWNyb3MuIAotCi0gICBFYWNoIG1hY3JvIGtub3dzIGl0cyBuYW1lIGFuZCBpbmNsdWRlZCB0ZXh0LiAgSXQgZ2V0cyBidWlsdCB3aXRoIGEKLSAgIGxpc3Qgb2YgZm9ybWFsIGFyZ3VtZW50cywgYW5kIGFsc28ga2VlcHMgYSBoYXNoIHRhYmxlIHdoaWNoIHBvaW50cwotICAgaW50byB0aGUgbGlzdCB0byBzcGVlZCB1cCBmb3JtYWwgc2VhcmNoLiAgRWFjaCBmb3JtYWwga25vd3MgaXRzCi0gICBuYW1lIGFuZCBpdHMgZGVmYXVsdCB2YWx1ZS4gIEVhY2ggdGltZSB0aGUgbWFjcm8gaXMgZXhwYW5kZWQsIHRoZQotICAgZm9ybWFscyBnZXQgdGhlIGFjdHVhbCB2YWx1ZXMgYXR0YXRjaGVkIHRvIHRoZW0uICovCi0KLS8qIGRlc2NyaWJlIHRoZSBmb3JtYWwgYXJndW1lbnRzIHRvIGEgbWFjcm8gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZm9ybWFsX3N0cnVjdAotICB7Ci0gICAgc3RydWN0IGZvcm1hbF9zdHJ1Y3QgKm5leHQ7CS8qIG5leHQgZm9ybWFsIGluIGxpc3QgKi8KLSAgICBzYiBuYW1lOwkJCS8qIG5hbWUgb2YgdGhlIGZvcm1hbCAqLwotICAgIHNiIGRlZjsJCQkvKiB0aGUgZGVmYXVsdCB2YWx1ZSAqLwotICAgIHNiIGFjdHVhbDsJCQkvKiB0aGUgYWN0dWFsIGFyZ3VtZW50IChjaGFuZ2VkIG9uIGVhY2ggZXhwYW5zaW9uKSAqLwotICAgIGludCBpbmRleDsJCQkvKiB0aGUgaW5kZXggb2YgdGhlIGZvcm1hbCAwLi5mb3JtYWxfY291bnQtMSAqLwotICB9Ci1mb3JtYWxfZW50cnk7Ci0KLS8qIE90aGVyIHZhbHVlcyBmb3VuZCBpbiB0aGUgaW5kZXggZmllbGQgb2YgYSBmb3JtYWxfZW50cnkuICAqLwotI2RlZmluZSBRVUFMX0lOREVYICgtMSkKLSNkZWZpbmUgTkFSR19JTkRFWCAoLTIpCi0jZGVmaW5lIExPQ0FMX0lOREVYICgtMykKLQotLyogZGVzY3JpYmUgdGhlIG1hY3JvLiAqLwotCi10eXBlZGVmIHN0cnVjdCBtYWNyb19zdHJ1Y3QKLSAgewotICAgIHNiIHN1YjsJCQkvKiBzdWJzdGl0dXRpb24gdGV4dC4gKi8KLSAgICBpbnQgZm9ybWFsX2NvdW50OwkJLyogbnVtYmVyIG9mIGZvcm1hbCBhcmdzLiAqLwotICAgIGZvcm1hbF9lbnRyeSAqZm9ybWFsczsJLyogcG9pbnRlciB0byBsaXN0IG9mIGZvcm1hbF9zdHJ1Y3RzICovCi0gICAgc3RydWN0IGhhc2hfY29udHJvbCAqZm9ybWFsX2hhc2g7IC8qIGhhc2ggdGFibGUgb2YgZm9ybWFscy4gKi8KLSAgfQotbWFjcm9fZW50cnk7Ci0KLS8qIEludGVybmFsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyBpbnQgZ2V0X3Rva2VuIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIGludCBnZXRzdHJpbmcgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgaW50IGdldF9hbnlfc3RyaW5nIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgZG9fZm9ybWFscyBQQVJBTVMgKChtYWNyb19lbnRyeSAqLCBpbnQsIHNiICopKTsKLXN0YXRpYyBpbnQgZ2V0X2Fwb3N0X3Rva2VuIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgaW50IHN1Yl9hY3R1YWwKLSAgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqLCBzdHJ1Y3QgaGFzaF9jb250cm9sICosIGludCwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqbWFjcm9fZXhwYW5kX2JvZHkKLSAgUEFSQU1TICgoc2IgKiwgc2IgKiwgZm9ybWFsX2VudHJ5ICosIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICptYWNyb19leHBhbmQgUEFSQU1TICgoaW50LCBzYiAqLCBtYWNyb19lbnRyeSAqLCBzYiAqLCBpbnQpKTsKLQotI2RlZmluZSBJU1dISVRFKHgpICgoeCkgPT0gJyAnIHx8ICh4KSA9PSAnXHQnKQotCi0jZGVmaW5lIElTU0VQKHgpIFwKLSAoKHgpID09ICcgJyB8fCAoeCkgPT0gJ1x0JyB8fCAoeCkgPT0gJywnIHx8ICh4KSA9PSAnIicgfHwgKHgpID09ICc7JyBcCi0gIHx8ICh4KSA9PSAnKScgfHwgKHgpID09ICcoJyBcCi0gIHx8ICgobWFjcm9fYWx0ZXJuYXRlIHx8IG1hY3JvX21yaSkgJiYgKCh4KSA9PSAnPCcgfHwgKHgpID09ICc+JykpKQotCi0jZGVmaW5lIElTQkFTRSh4KSBcCi0gICgoeCkgPT0gJ2InIHx8ICh4KSA9PSAnQicgXAotICAgfHwgKHgpID09ICdxJyB8fCAoeCkgPT0gJ1EnIFwKLSAgIHx8ICh4KSA9PSAnaCcgfHwgKHgpID09ICdIJyBcCi0gICB8fCAoeCkgPT0gJ2QnIHx8ICh4KSA9PSAnRCcpCi0KLS8qIFRoZSBtYWNybyBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm1hY3JvX2hhc2g7Ci0KLS8qIFdoZXRoZXIgYW55IG1hY3JvcyBoYXZlIGJlZW4gZGVmaW5lZC4gICovCi0KLWludCBtYWNyb19kZWZpbmVkOwotCi0vKiBXaGV0aGVyIHdlIGFyZSBpbiBHQVNQIGFsdGVybmF0ZSBtb2RlLiAgKi8KLQotc3RhdGljIGludCBtYWNyb19hbHRlcm5hdGU7Ci0KLS8qIFdoZXRoZXIgd2UgYXJlIGluIE1SSSBtb2RlLiAgKi8KLQotc3RhdGljIGludCBtYWNyb19tcmk7Ci0KLS8qIFdoZXRoZXIgd2Ugc2hvdWxkIHN0cmlwICdAJyBjaGFyYWN0ZXJzLiAgKi8KLQotc3RhdGljIGludCBtYWNyb19zdHJpcF9hdDsKLQotLyogRnVuY3Rpb24gdG8gdXNlIHRvIHBhcnNlIGFuIGV4cHJlc3Npb24uICAqLwotCi1zdGF0aWMgaW50ICgqbWFjcm9fZXhwcikgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIHNiICosIGludCAqKSk7Ci0KLS8qIE51bWJlciBvZiBtYWNybyBleHBhbnNpb25zIHRoYXQgaGF2ZSBiZWVuIGRvbmUuICAqLwotCi1zdGF0aWMgaW50IG1hY3JvX251bWJlcjsKLQotLyogSW5pdGlhbGl6ZSBtYWNybyBwcm9jZXNzaW5nLiAgKi8KLQotdm9pZAotbWFjcm9faW5pdCAoYWx0ZXJuYXRlLCBtcmksIHN0cmlwX2F0LCBleHByKQotICAgICBpbnQgYWx0ZXJuYXRlOwotICAgICBpbnQgbXJpOwotICAgICBpbnQgc3RyaXBfYXQ7Ci0gICAgIGludCAoKmV4cHIpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBzYiAqLCBpbnQgKikpOwotewotICBtYWNyb19oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIG1hY3JvX2RlZmluZWQgPSAwOwotICBtYWNyb19hbHRlcm5hdGUgPSBhbHRlcm5hdGU7Ci0gIG1hY3JvX21yaSA9IG1yaTsKLSAgbWFjcm9fc3RyaXBfYXQgPSBzdHJpcF9hdDsKLSAgbWFjcm9fZXhwciA9IGV4cHI7Ci19Ci0KLS8qIFN3aXRjaCBpbiBhbmQgb3V0IG9mIE1SSSBtb2RlIG9uIHRoZSBmbHkuICAqLwotCi12b2lkCi1tYWNyb19tcmlfbW9kZSAobXJpKQotICAgICBpbnQgbXJpOwotewotICBtYWNyb19tcmkgPSBtcmk7Ci19Ci0KLS8qIFJlYWQgaW5wdXQgbGluZXMgdGlsbCB3ZSBnZXQgdG8gYSBUTyBzdHJpbmcuCi0gICBJbmNyZWFzZSBuZXN0aW5nIGRlcHRoIGlmIHdlIGdldCBhIEZST00gc3RyaW5nLgotICAgUHV0IHRoZSByZXN1bHRzIGludG8gc2IgYXQgUFRSLgotICAgQWRkIGEgbmV3IGlucHV0IGxpbmUgdG8gYW4gc2IgdXNpbmcgR0VUX0xJTkUuCi0gICBSZXR1cm4gMSBvbiBzdWNjZXNzLCAwIG9uIHVuZXhwZWN0ZWQgRU9GLiAgKi8KLQotaW50Ci1idWZmZXJfYW5kX25lc3QgKGZyb20sIHRvLCBwdHIsIGdldF9saW5lKQotICAgICBjb25zdCBjaGFyICpmcm9tOwotICAgICBjb25zdCBjaGFyICp0bzsKLSAgICAgc2IgKnB0cjsKLSAgICAgaW50ICgqZ2V0X2xpbmUpIFBBUkFNUyAoKHNiICopKTsKLXsKLSAgaW50IGZyb21fbGVuID0gc3RybGVuIChmcm9tKTsKLSAgaW50IHRvX2xlbiA9IHN0cmxlbiAodG8pOwotICBpbnQgZGVwdGggPSAxOwotICBpbnQgbGluZV9zdGFydCA9IHB0ci0+bGVuOwotCi0gIGludCBtb3JlID0gZ2V0X2xpbmUgKHB0cik7Ci0KLSAgd2hpbGUgKG1vcmUpCi0gICAgewotICAgICAgLyogVHJ5IGFuZCBmaW5kIHRoZSBmaXJzdCBwc2V1ZG8gb3Agb24gdGhlIGxpbmUgKi8KLSAgICAgIGludCBpID0gbGluZV9zdGFydDsKLQotICAgICAgaWYgKCEgbWFjcm9fYWx0ZXJuYXRlICYmICEgbWFjcm9fbXJpKQotCXsKLQkgIC8qIFdpdGggbm9ybWFsIHN5bnRheCB3ZSBjYW4gc3VjayB3aGF0IHdlIHdhbnQgdGlsbCB3ZSBnZXQKLQkgICAgIHRvIHRoZSBkb3QuICBXaXRoIHRoZSBhbHRlcm5hdGUsIGxhYmVscyBoYXZlIHRvIHN0YXJ0IGluCi0JICAgICB0aGUgZmlyc3QgY29sdW1uLCBzaW5jZSB3ZSBjYW50IHRlbGwgd2hhdCdzIGEgbGFiZWwgYW5kCi0JICAgICB3aGF0cyBhIHBzZXVkb29wICovCi0KLQkgIC8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0JICB3aGlsZSAoaSA8IHB0ci0+bGVuICYmIElTV0hJVEUgKHB0ci0+cHRyW2ldKSkKLQkgICAgaSsrOwotCi0JICAvKiBTa2lwIG92ZXIgYSBsYWJlbCAqLwotCSAgd2hpbGUgKGkgPCBwdHItPmxlbgotCQkgJiYgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBwdHItPnB0cltpXSkKLQkJICAgICB8fCBwdHItPnB0cltpXSA9PSAnXycKLQkJICAgICB8fCBwdHItPnB0cltpXSA9PSAnJCcpKQotCSAgICBpKys7Ci0KLQkgIC8qIEFuZCBhIGNvbG9uICovCi0JICBpZiAoaSA8IHB0ci0+bGVuCi0JICAgICAgJiYgcHRyLT5wdHJbaV0gPT0gJzonKQotCSAgICBpKys7Ci0KLQl9Ci0gICAgICAvKiBTa2lwIHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KLSAgICAgIHdoaWxlIChpIDwgcHRyLT5sZW4gJiYgSVNXSElURSAocHRyLT5wdHJbaV0pKQotCWkrKzsKLQotICAgICAgaWYgKGkgPCBwdHItPmxlbiAmJiAocHRyLT5wdHJbaV0gPT0gJy4nCi0JCQkgICB8fCBtYWNyb19hbHRlcm5hdGUKLQkJCSAgIHx8IG1hY3JvX21yaSkpCi0JewotCSAgaWYgKHB0ci0+cHRyW2ldID09ICcuJykKLQkgICAgICBpKys7Ci0JICBpZiAoc3RybmNhc2VjbXAgKHB0ci0+cHRyICsgaSwgZnJvbSwgZnJvbV9sZW4pID09IDApCi0JICAgIGRlcHRoKys7Ci0JICBpZiAoc3RybmNhc2VjbXAgKHB0ci0+cHRyICsgaSwgdG8sIHRvX2xlbikgPT0gMCkKLQkgICAgewotCSAgICAgIGRlcHRoLS07Ci0JICAgICAgaWYgKGRlcHRoID09IDApCi0JCXsKLQkJICAvKiBSZXNldCB0aGUgc3RyaW5nIHRvIG5vdCBpbmNsdWRlIHRoZSBlbmRpbmcgcnVuZSAqLwotCQkgIHB0ci0+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+cHRyW3NyYysrXSk7Ci0JfQotICAgIH0KLQotICBzYl9raWxsICgmdCk7Ci0KLSAgd2hpbGUgKGxvY2xpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3JtYWxfZW50cnkgKmY7Ci0KLSAgICAgIGYgPSBsb2NsaXN0LT5uZXh0OwotICAgICAgaGFzaF9kZWxldGUgKGZvcm1hbF9oYXNoLCBzYl90ZXJtaW5hdGUgKCZsb2NsaXN0LT5uYW1lKSk7Ci0gICAgICBzYl9raWxsICgmbG9jbGlzdC0+bmFtZSk7Ci0gICAgICBzYl9raWxsICgmbG9jbGlzdC0+ZGVmKTsKLSAgICAgIHNiX2tpbGwgKCZsb2NsaXN0LT5hY3R1YWwpOwotICAgICAgZnJlZSAobG9jbGlzdCk7Ci0gICAgICBsb2NsaXN0ID0gZjsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEFzc2lnbiB2YWx1ZXMgdG8gdGhlIGZvcm1hbCBwYXJhbWV0ZXJzIG9mIGEgbWFjcm8sIGFuZCBleHBhbmQgdGhlCi0gICBib2R5LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotbWFjcm9fZXhwYW5kIChpZHgsIGluLCBtLCBvdXQsIGNvbW1lbnRfY2hhcikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBtYWNyb19lbnRyeSAqbTsKLSAgICAgc2IgKm91dDsKLSAgICAgaW50IGNvbW1lbnRfY2hhcjsKLXsKLSAgc2IgdDsKLSAgZm9ybWFsX2VudHJ5ICpwdHI7Ci0gIGZvcm1hbF9lbnRyeSAqZjsKLSAgaW50IGlzX3Bvc2l0aW9uYWwgPSAwOwotICBpbnQgaXNfa2V5d29yZCA9IDA7Ci0gIGludCBuYXJnID0gMDsKLSAgY29uc3QgY2hhciAqZXJyOwotCi0gIHNiX25ldyAoJnQpOwotICAKLSAgLyogUmVzZXQgYW55IG9sZCB2YWx1ZSB0aGUgYWN0dWFscyBtYXkgaGF2ZSAqLwotICBmb3IgKGYgPSBtLT5mb3JtYWxzOyBmOyBmID0gZi0+bmV4dCkKLSAgICAgIHNiX3Jlc2V0ICgmZi0+YWN0dWFsKTsKLSAgZiA9IG0tPmZvcm1hbHM7Ci0gIHdoaWxlIChmICE9IE5VTEwgJiYgZi0+aW5kZXggPCAwKQotICAgIGYgPSBmLT5uZXh0OwotCi0gIGlmIChtYWNyb19tcmkpCi0gICAgewotICAgICAgLyogVGhlIG1hY3JvIG1heSBiZSBjYWxsZWQgd2l0aCBhbiBvcHRpb25hbCBxdWFsaWZpZXIsIHdoaWNoIG1heQotICAgICAgICAgYmUgcmVmZXJyZWQgdG8gaW4gdGhlIG1hY3JvIGJvZHkgYXMgXDAuICAqLwotICAgICAgaWYgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHhdID09ICcuJykKLQl7Ci0JICBmb3JtYWxfZW50cnkgKm47Ci0KLQkgIG4gPSAoZm9ybWFsX2VudHJ5ICopIHhtYWxsb2MgKHNpemVvZiAoZm9ybWFsX2VudHJ5KSk7Ci0JICBzYl9uZXcgKCZuLT5uYW1lKTsKLQkgIHNiX25ldyAoJm4tPmRlZik7Ci0JICBzYl9uZXcgKCZuLT5hY3R1YWwpOwotCSAgbi0+aW5kZXggPSBRVUFMX0lOREVYOwotCi0JICBuLT5uZXh0ID0gbS0+Zm9ybWFsczsKLQkgIG0tPmZvcm1hbHMgPSBuOwotCi0JICBpZHggPSBnZXRfYW55X3N0cmluZyAoaWR4ICsgMSwgaW4sICZuLT5hY3R1YWwsIDEsIDApOwotCX0KLSAgICB9Ci0KLSAgLyogUGVlbCBvZmYgdGhlIGFjdHVhbHMgYW5kIHN0b3JlIHRoZW0gYXdheSBpbiB0aGUgaGFzaCB0YWJsZXMnIGFjdHVhbHMgKi8KLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gIHdoaWxlIChpZHggPCBpbi0+bGVuICYmIGluLT5wdHJbaWR4XSAhPSBjb21tZW50X2NoYXIpCi0gICAgewotICAgICAgaW50IHNjYW47Ci0KLSAgICAgIC8qIExvb2sgYW5kIHNlZSBpZiBpdCdzIGEgcG9zaXRpb25hbCBvciBrZXl3b3JkIGFyZyAqLwotICAgICAgc2NhbiA9IGlkeDsKLSAgICAgIHdoaWxlIChzY2FuIDwgaW4tPmxlbgotCSAgICAgJiYgIUlTU0VQIChpbi0+cHRyW3NjYW5dKQotCSAgICAgJiYgIShtYWNyb19tcmkgJiYgaW4tPnB0cltzY2FuXSA9PSAnXCcnKQotCSAgICAgJiYgKCFtYWNyb19hbHRlcm5hdGUgJiYgaW4tPnB0cltzY2FuXSAhPSAnPScpKQotCXNjYW4rKzsKLSAgICAgIGlmIChzY2FuIDwgaW4tPmxlbiAmJiAhbWFjcm9fYWx0ZXJuYXRlICYmIGluLT5wdHJbc2Nhbl0gPT0gJz0nKQotCXsKLQkgIGlzX2tleXdvcmQgPSAxOwotCi0JICAvKiBJdCdzIE9LIHRvIGdvIGZyb20gcG9zaXRpb25hbCB0byBrZXl3b3JkLiAgKi8KLQotCSAgLyogVGhpcyBpcyBhIGtleXdvcmQgYXJnLCBmZXRjaCB0aGUgZm9ybWFsIG5hbWUgYW5kCi0JICAgICB0aGVuIHRoZSBhY3R1YWwgc3R1ZmYgKi8KLQkgIHNiX3Jlc2V0ICgmdCk7Ci0JICBpZHggPSBnZXRfdG9rZW4gKGlkeCwgaW4sICZ0KTsKLQkgIGlmIChpbi0+cHRyW2lkeF0gIT0gJz0nKQotCSAgICByZXR1cm4gXygiY29uZnVzaW9uIGluIGZvcm1hbCBwYXJhbWV0ZXJzIik7Ci0KLQkgIC8qIExvb2t1cCB0aGUgZm9ybWFsIGluIHRoZSBtYWNybydzIGxpc3QgKi8KLQkgIHB0ciA9IChmb3JtYWxfZW50cnkgKikgaGFzaF9maW5kIChtLT5mb3JtYWxfaGFzaCwgc2JfdGVybWluYXRlICgmdCkpOwotCSAgaWYgKCFwdHIpCi0JICAgIHJldHVybiBfKCJtYWNybyBmb3JtYWwgYXJndW1lbnQgZG9lcyBub3QgZXhpc3QiKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEluc2VydCB0aGlzIHZhbHVlIGludG8gdGhlIHJpZ2h0IHBsYWNlICovCi0JICAgICAgc2JfcmVzZXQgKCZwdHItPmFjdHVhbCk7Ci0JICAgICAgaWR4ID0gZ2V0X2FueV9zdHJpbmcgKGlkeCArIDEsIGluLCAmcHRyLT5hY3R1YWwsIDAsIDApOwotCSAgICAgIGlmIChwdHItPmFjdHVhbC5sZW4gPiAwKQotCQkrK25hcmc7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhpcyBpcyBhIHBvc2l0aW9uYWwgYXJnICovCi0JICBpc19wb3NpdGlvbmFsID0gMTsKLQkgIGlmIChpc19rZXl3b3JkKQotCSAgICByZXR1cm4gXygiY2FuJ3QgbWl4IHBvc2l0aW9uYWwgYW5kIGtleXdvcmQgYXJndW1lbnRzIik7Ci0KLQkgIGlmICghZikKLQkgICAgewotCSAgICAgIGZvcm1hbF9lbnRyeSAqKnBmOwotCSAgICAgIGludCBjOwotCi0JICAgICAgaWYgKCFtYWNyb19tcmkpCi0JCXJldHVybiBfKCJ0b28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cyIpOwotCi0JICAgICAgZiA9IChmb3JtYWxfZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChmb3JtYWxfZW50cnkpKTsKLQkgICAgICBzYl9uZXcgKCZmLT5uYW1lKTsKLQkgICAgICBzYl9uZXcgKCZmLT5kZWYpOwotCSAgICAgIHNiX25ldyAoJmYtPmFjdHVhbCk7Ci0JICAgICAgZi0+bmV4dCA9IE5VTEw7Ci0KLQkgICAgICBjID0gLTE7Ci0JICAgICAgZm9yIChwZiA9ICZtLT5mb3JtYWxzOyAqcGYgIT0gTlVMTDsgcGYgPSAmKCpwZiktPm5leHQpCi0JCWlmICgoKnBmKS0+aW5kZXggPj0gYykKLQkJICBjID0gKCpwZiktPmluZGV4ICsgMTsKLQkgICAgICBpZiAoYyA9PSAtMSkKLQkJYyA9IDA7Ci0JICAgICAgKnBmID0gZjsKLQkgICAgICBmLT5pbmRleCA9IGM7Ci0JICAgIH0KLQotCSAgc2JfcmVzZXQgKCZmLT5hY3R1YWwpOwotCSAgaWR4ID0gZ2V0X2FueV9zdHJpbmcgKGlkeCwgaW4sICZmLT5hY3R1YWwsIDEsIDApOwotCSAgaWYgKGYtPmFjdHVhbC5sZW4gPiAwKQotCSAgICArK25hcmc7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgZiA9IGYtPm5leHQ7Ci0JICAgIH0KLQkgIHdoaWxlIChmICE9IE5VTEwgJiYgZi0+aW5kZXggPCAwKTsKLQl9Ci0KLSAgICAgIGlmICghIG1hY3JvX21yaSkKLQlpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaW4tPnB0cltpZHhdID09ICcsJykKLQkgICAgKytpZHg7Ci0JICBpZiAoSVNXSElURSAoaW4tPnB0cltpZHhdKSkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAobWFjcm9fbXJpKQotICAgIHsKLSAgICAgIGNoYXIgYnVmZmVyWzIwXTsKLQotICAgICAgc2JfcmVzZXQgKCZ0KTsKLSAgICAgIHNiX2FkZF9zdHJpbmcgKCZ0LCBtYWNyb19zdHJpcF9hdCA/ICIkTkFSRyIgOiAiTkFSRyIpOwotICAgICAgcHRyID0gKGZvcm1hbF9lbnRyeSAqKSBoYXNoX2ZpbmQgKG0tPmZvcm1hbF9oYXNoLCBzYl90ZXJtaW5hdGUgKCZ0KSk7Ci0gICAgICBzYl9yZXNldCAoJnB0ci0+YWN0dWFsKTsKLSAgICAgIHNwcmludGYgKGJ1ZmZlciwgIiVkIiwgbmFyZyk7Ci0gICAgICBzYl9hZGRfc3RyaW5nICgmcHRyLT5hY3R1YWwsIGJ1ZmZlcik7Ci0gICAgfQotCi0gIGVyciA9IG1hY3JvX2V4cGFuZF9ib2R5ICgmbS0+c3ViLCBvdXQsIG0tPmZvcm1hbHMsIG0tPmZvcm1hbF9oYXNoLAotCQkJICAgY29tbWVudF9jaGFyLCAxKTsKLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIHJldHVybiBlcnI7Ci0KLSAgLyogRGlzY2FyZCBhbnkgdW5uYW1lZCBmb3JtYWwgYXJndW1lbnRzLiAgKi8KLSAgaWYgKG1hY3JvX21yaSkKLSAgICB7Ci0gICAgICBmb3JtYWxfZW50cnkgKipwZjsKLQotICAgICAgcGYgPSAmbS0+Zm9ybWFsczsKLSAgICAgIHdoaWxlICgqcGYgIT0gTlVMTCkKLQl7Ci0JICBpZiAoKCpwZiktPm5hbWUubGVuICE9IDApCi0JICAgIHBmID0gJigqcGYpLT5uZXh0OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2Jfa2lsbCAoJigqcGYpLT5uYW1lKTsKLQkgICAgICBzYl9raWxsICgmKCpwZiktPmRlZik7Ci0JICAgICAgc2Jfa2lsbCAoJigqcGYpLT5hY3R1YWwpOwotCSAgICAgIGYgPSAoKnBmKS0+bmV4dDsKLQkgICAgICBmcmVlICgqcGYpOwotCSAgICAgICpwZiA9IGY7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHNiX2tpbGwgKCZ0KTsKLSAgbWFjcm9fbnVtYmVyKys7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIENoZWNrIGZvciBhIG1hY3JvLiAgSWYgb25lIGlzIGZvdW5kLCBwdXQgdGhlIGV4cGFuc2lvbiBpbnRvCi0gICAqRVhQQU5ELiAgQ09NTUVOVF9DSEFSIGlzIHRoZSBjb21tZW50IGNoYXJhY3Rlci0tdGhpcyBpcyB1c2VkIGJ5Ci0gICBnYXNwLiAgUmV0dXJuIDEgaWYgYSBtYWNybyBpcyBmb3VuZCwgMCBvdGhlcndpc2UuICAqLwotCi1pbnQKLWNoZWNrX21hY3JvIChsaW5lLCBleHBhbmQsIGNvbW1lbnRfY2hhciwgZXJyb3IpCi0gICAgIGNvbnN0IGNoYXIgKmxpbmU7Ci0gICAgIHNiICpleHBhbmQ7Ci0gICAgIGludCBjb21tZW50X2NoYXI7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJvcjsKLXsKLSAgY29uc3QgY2hhciAqczsKLSAgY2hhciAqY29weSwgKmNzOwotICBtYWNyb19lbnRyeSAqbWFjcm87Ci0gIHNiIGxpbmVfc2I7Ci0KLSAgaWYgKCEgaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpICpsaW5lKQotICAgICAgJiYgKmxpbmUgIT0gJ18nCi0gICAgICAmJiAqbGluZSAhPSAnJCcKLSAgICAgICYmICghIG1hY3JvX21yaSB8fCAqbGluZSAhPSAnLicpKQotICAgIHJldHVybiAwOwotCi0gIHMgPSBsaW5lICsgMTsKLSAgd2hpbGUgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcykKLQkgfHwgKnMgPT0gJ18nCi0JIHx8ICpzID09ICckJykKLSAgICArK3M7Ci0KLSAgY29weSA9IChjaGFyICopIGFsbG9jYSAocyAtIGxpbmUgKyAxKTsKLSAgbWVtY3B5IChjb3B5LCBsaW5lLCBzIC0gbGluZSk7Ci0gIGNvcHlbcyAtIGxpbmVdID0gJ1wwJzsKLSAgZm9yIChjcyA9IGNvcHk7ICpjcyAhPSAnXDAnOyBjcysrKQotICAgIGlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgKmNzKSkKLSAgICAgICpjcyA9IHRvbG93ZXIgKCpjcyk7Ci0KLSAgbWFjcm8gPSAobWFjcm9fZW50cnkgKikgaGFzaF9maW5kIChtYWNyb19oYXNoLCBjb3B5KTsKLQotICBpZiAobWFjcm8gPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICAvKiBXcmFwIHRoZSBsaW5lIHVwIGluIGFuIHNiLiAgKi8KLSAgc2JfbmV3ICgmbGluZV9zYik7Ci0gIHdoaWxlICgqcyAhPSAnXDAnICYmICpzICE9ICdcbicgJiYgKnMgIT0gJ1xyJykKLSAgICBzYl9hZGRfY2hhciAoJmxpbmVfc2IsICpzKyspOwotCi0gIHNiX25ldyAoZXhwYW5kKTsKLSAgKmVycm9yID0gbWFjcm9fZXhwYW5kICgwLCAmbGluZV9zYiwgbWFjcm8sIGV4cGFuZCwgY29tbWVudF9jaGFyKTsKLQotICBzYl9raWxsICgmbGluZV9zYik7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIERlbGV0ZSBhIG1hY3JvLiAgKi8KLQotdm9pZAotZGVsZXRlX21hY3JvIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBoYXNoX2RlbGV0ZSAobWFjcm9faGFzaCwgbmFtZSk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIElSUCBhbmQgSVJQQyBwc2V1ZG8tb3BzLiAgVGhlc2UgYXJlIGhhbmRsZWQgYXMgYQotICAgY29tYmluZWQgbWFjcm8gZGVmaW5pdGlvbiBhbmQgZXhlY3V0aW9uLiAgVGhpcyByZXR1cm5zIE5VTEwgb24KLSAgIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLiAgKi8KLQotY29uc3QgY2hhciAqCi1leHBhbmRfaXJwIChpcnBjLCBpZHgsIGluLCBvdXQsIGdldF9saW5lLCBjb21tZW50X2NoYXIpCi0gICAgIGludCBpcnBjOwotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci0gICAgIGludCAoKmdldF9saW5lKSBQQVJBTVMgKChzYiAqKSk7Ci0gICAgIGludCBjb21tZW50X2NoYXI7Ci17Ci0gIGNvbnN0IGNoYXIgKm1uOwotICBzYiBzdWI7Ci0gIGZvcm1hbF9lbnRyeSBmOwotICBzdHJ1Y3QgaGFzaF9jb250cm9sICpoOwotICBjb25zdCBjaGFyICplcnI7Ci0KLSAgaWYgKGlycGMpCi0gICAgbW4gPSAiSVJQQyI7Ci0gIGVsc2UKLSAgICBtbiA9ICJJUlAiOwotCi0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCi0gIHNiX25ldyAoJnN1Yik7Ci0gIGlmICghIGJ1ZmZlcl9hbmRfbmVzdCAobW4sICJFTkRSIiwgJnN1YiwgZ2V0X2xpbmUpKQotICAgIHJldHVybiBfKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGlycCBvciBpcnBjIik7Ci0gIAotICBzYl9uZXcgKCZmLm5hbWUpOwotICBzYl9uZXcgKCZmLmRlZik7Ci0gIHNiX25ldyAoJmYuYWN0dWFsKTsKLQotICBpZHggPSBnZXRfdG9rZW4gKGlkeCwgaW4sICZmLm5hbWUpOwotICBpZiAoZi5uYW1lLmxlbiA9PSAwKQotICAgIHJldHVybiBfKCJtaXNzaW5nIG1vZGVsIHBhcmFtZXRlciIpOwotCi0gIGggPSBoYXNoX25ldyAoKTsKLSAgZXJyID0gaGFzaF9qYW0gKGgsIHNiX3Rlcm1pbmF0ZSAoJmYubmFtZSksICZmKTsKLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIHJldHVybiBlcnI7Ci0KLSAgZi5pbmRleCA9IDE7Ci0gIGYubmV4dCA9IE5VTEw7Ci0KLSAgc2JfcmVzZXQgKG91dCk7Ci0KLSAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gIGlmIChpZHggPj0gaW4tPmxlbiB8fCBpbi0+cHRyW2lkeF0gPT0gY29tbWVudF9jaGFyKQotICAgIHsKLSAgICAgIC8qIEV4cGFuZCBvbmNlIHdpdGggYSBudWxsIHN0cmluZy4gICovCi0gICAgICBlcnIgPSBtYWNyb19leHBhbmRfYm9keSAoJnN1Yiwgb3V0LCAmZiwgaCwgY29tbWVudF9jaGFyLCAwKTsKLSAgICAgIGlmIChlcnIgIT0gTlVMTCkKLQlyZXR1cm4gZXJyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpcnBjICYmIGluLT5wdHJbaWR4XSA9PSAnIicpCi0JKytpZHg7Ci0gICAgICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gIT0gY29tbWVudF9jaGFyKQotCXsKLQkgIGlmICghaXJwYykKLQkgICAgaWR4ID0gZ2V0X2FueV9zdHJpbmcgKGlkeCwgaW4sICZmLmFjdHVhbCwgMSwgMCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaW4tPnB0cltpZHhdID09ICciJykKLQkJewotCQkgIGludCBueHQ7Ci0KLQkJICBueHQgPSBzYl9za2lwX3doaXRlIChpZHggKyAxLCBpbik7Ci0JCSAgaWYgKG54dCA+PSBpbi0+bGVuIHx8IGluLT5wdHJbbnh0XSA9PSBjb21tZW50X2NoYXIpCi0JCSAgICB7Ci0JCSAgICAgIGlkeCA9IG54dDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBzYl9yZXNldCAoJmYuYWN0dWFsKTsKLQkgICAgICBzYl9hZGRfY2hhciAoJmYuYWN0dWFsLCBpbi0+cHRyW2lkeF0pOwotCSAgICAgICsraWR4OwotCSAgICB9Ci0JICBlcnIgPSBtYWNyb19leHBhbmRfYm9keSAoJnN1Yiwgb3V0LCAmZiwgaCwgY29tbWVudF9jaGFyLCAwKTsKLQkgIGlmIChlcnIgIT0gTlVMTCkKLQkgICAgcmV0dXJuIGVycjsKLQkgIGlmICghaXJwYykKLQkgICAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0JICBlbHNlCi0JICAgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCX0KLSAgICB9Ci0KLSAgaGFzaF9kaWUgKGgpOwotICBzYl9raWxsICgmc3ViKTsKLQotICByZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9tYWNyby5oIGIvZ2FzL21hY3JvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZWVhNGEuLjAwMDAwMDAKLS0tIGEvZ2FzL21hY3JvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiBtYWNyby5oIC0gaGVhZGVyIGZpbGUgZm9yIG1hY3JvIHN1cHBvcnQgZm9yIGdhcyBhbmQgZ2FzcAotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFN0ZXZlIGFuZCBKdWR5IENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LAotICAgICAgc2FjQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaWZuZGVmIE1BQ1JPX0gKLQotI2RlZmluZSBNQUNST19ICi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgInNiLmgiCi0KLS8qIFdoZXRoZXIgYW55IG1hY3JvcyBoYXZlIGJlZW4gZGVmaW5lZC4gICovCi0KLWV4dGVybiBpbnQgbWFjcm9fZGVmaW5lZDsKLQotLyogVGhlIG1hY3JvIG5lc3RpbmcgbGV2ZWwuICAqLwotCi1leHRlcm4gaW50IG1hY3JvX25lc3Q7Ci0KLWV4dGVybiBpbnQgYnVmZmVyX2FuZF9uZXN0Ci0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBzYiAqLCBpbnQgKCopIFBBUkFNUyAoKHNiICopKSkpOwotZXh0ZXJuIHZvaWQgbWFjcm9faW5pdAotICBQQVJBTVMgKChpbnQgYWx0ZXJuYXRlLCBpbnQgbXJpLCBpbnQgc3RyaXBfYXQsCi0JICAgaW50ICgqKSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgc2IgKiwgaW50ICopKSkpOwotZXh0ZXJuIHZvaWQgbWFjcm9fbXJpX21vZGUgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gY29uc3QgY2hhciAqZGVmaW5lX21hY3JvCi0gIFBBUkFNUyAoKGludCBpZHgsIHNiICppbiwgc2IgKmxhYmVsLCBpbnQgKCpnZXRfbGluZSkgUEFSQU1TICgoc2IgKikpLAotCSAgIGNvbnN0IGNoYXIgKipuYW1lcCkpOwotZXh0ZXJuIGludCBjaGVja19tYWNybyBQQVJBTVMgKChjb25zdCBjaGFyICosIHNiICosIGludCwgY29uc3QgY2hhciAqKikpOwotZXh0ZXJuIHZvaWQgZGVsZXRlX21hY3JvIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmV4cGFuZF9pcnAKLSAgUEFSQU1TICgoaW50LCBpbnQsIHNiICosIHNiICosIGludCAoKikgUEFSQU1TICgoc2IgKikpLCBpbnQpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvbWFrZWZpbGUudm1zIGIvZ2FzL21ha2VmaWxlLnZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRjMzBkNC4uMDAwMDAwMAotLS0gYS9nYXMvbWFrZWZpbGUudm1zCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLSMKLSMgbWFrZWZpbGUgZm9yIGdhcwotIwotIyBDcmVhdGVkIGJ5IEtsYXVzIEsiYW1wZiwga2thZW1wZkBwcm9naXMuZGUKLSMKLUNDPWdjYwotaWZlcSAoJChBUkNIKSxBTFBIQSkKLWlmZXEgKCQoQ0MpLGdjYykKLURFRlM9Ci1DRkxBR1M9L2luY2x1ZGU9KFtdLFstLmJmZF0sWy5jb25maWddLFstLmluY2x1ZGVdLFstXSkkKERFRlMpCi1MRkxBR1M9Ci1MSUJTPSxHTlVfQ0NfTElCUkFSWTpsaWJnY2MvbGliLHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIsR05VX0NDX0xJQlJBUlk6Y3J0MC5vYmoKLWVsc2UKLURFRlM9L2RlZmluZT0oInRhYmxlX3NpemVfb2ZfZmxvbnVtX3Bvd2Vyc19vZl90ZW4iPSJ0YWJzaXpfZmxvbnVtX3Bvd2Vyc19vZl90ZW4iLFwKLSJfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ij0iX2JmZF9nZW5lcmljX2dldF93aW5fc2VjdGlvbl9jb250IixcCi0iX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24iPSJfYmZkX2VsZl9zZWNfZnJvbV9iZmRfc2VjIiwiY29uc3Q9IikKLUNGTEFHUz0vbm9vcHQvbm9kZWJ1Zy9pbmNsdWRlPShbXSxbLS5iZmRdLFsuY29uZmlnXSxbLS5pbmNsdWRlXSxbLV0pJChERUZTKVwKLS93YXJuaW5ncz1kaXNhYmxlPShtaXNzaW5ncmV0dXJuLGltcGxpY2l0ZnVuYyxwdHJtaXNtYXRjaCx1bmRlZmVzY2FwLGxvbmdleHRlcm4sZHVwdHlwZXNwZWMpCi1MRkxBR1M9Ci1MSUJTPSxzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliCi1lbmRpZgotCi1lbHNlCSMgQVJDSCBub3QgQUxQSEEKLQotaWZlcSAoJChDQyksZ2NjKQotREVGUz0KLUNGTEFHUz0vaW5jbHVkZT0oW10sWy5jb25maWddLFstLmluY2x1ZGVdLFstXSkkKERFRlMpCi1MRkxBR1M9Ci1MSUJTPSxHTlVfQ0NfTElCUkFSWTpsaWJnY2MvbGliLHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIsR05VX0NDX0xJQlJBUlk6Y3J0YmVnaW4ub2JqLEdOVV9DQ19MSUJSQVJZOmNydGVuZC5vYmoKLSNMSUJTPSxnbnVfY2M6WzAwMDAwMF1nY2NsaWIub2xiL2xpYixzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliCi1lbHNlCi1lcnJvciBERUNDIGlzIGJyb2tlbiBvbiBWQVgKLURFRlM9L2RlZmluZT0oInRhYmxlX3NpemVfb2ZfZmxvbnVtX3Bvd2Vyc19vZl90ZW4iPSJ0YWJzaXpfZmxvbnVtX3Bvd2Vyc19vZl90ZW4iLCJjb25zdD0iKQotQ0ZMQUdTPS9ub29wdC9kZWJ1Zy9pbmNsdWRlPShbXSxbLmNvbmZpZ10sWy0uaW5jbHVkZV0sWy1dKSQoREVGUylcCi0vd2FybmluZ3M9ZGlzYWJsZT0obWlzc2luZ3JldHVybixpbXBsaWNpdGZ1bmMscHRybWlzbWF0Y2gsdW5kZWZlc2NhcCxsb25nZXh0ZXJuLGR1cHR5cGVzcGVjKQotTEZMQUdTPQotTElCUz0sc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYgotZW5kaWYKLWVuZGlmCi0KLQotT0JKUz10YXJnLWNwdS5vYmosb2JqLWZvcm1hdC5vYmosYXRvZi10YXJnLm9iaixhcHAub2JqLGFzLm9iaixhdG9mLWdlbmVyaWMub2JqLFwKLSAgYmlnbnVtLWNvcHkub2JqLGNvbmQub2JqLGRlcGVuZC5vYmosZXhwci5vYmosZmxvbnVtLWtvbnN0Lm9iaixmbG9udW0tY29weS5vYmosXAotICBmbG9udW0tbXVsdC5vYmosZnJhZ3Mub2JqLGhhc2gub2JqLGlucHV0LWZpbGUub2JqLGlucHV0LXNjcnViLm9iaixcCi0gIGxpdGVyYWwub2JqLG1lc3NhZ2VzLm9iaixvdXRwdXQtZmlsZS5vYmoscmVhZC5vYmosc3Vic2Vncy5vYmosc3ltYm9scy5vYmosXAotICB3cml0ZS5vYmosbGlzdGluZy5vYmosZWNvZmYub2JqLHN0YWJzLm9iaixzYi5vYmosbWFjcm8ub2JqLGVob3B0Lm9iagotCi1HQVNQT0JKUyA9IGdhc3Aub2JqLG1hY3JvLm9iaixzYi5vYmosaGFzaC5vYmoKLQotTElCSUJFUlRZID0gWy0ubGliaWJlcnR5XWxpYmliZXJ0eS5vbGIKLQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLUxJQkJGRCA9IFstLmJmZF1saWJiZmQub2xiCi1MSUJPUENPREVTID0gWy0ub3Bjb2Rlc11saWJvcGNvZGVzLm9sYgotQkZEREVQID0gWy0uYmZkXWJmZC5oCi1lbHNlCi1MSUJCRkQgPQotTElCT1BDT0RFUyA9Ci1CRkRERVAgPQotZW5kaWYKLQotYWxsOiBjb25maWcuc3RhdHVzICQoQkZEREVQKSBhcy5leGUgZ2FzcC5leGUKLQotYXMuZXhlOiAkKE9CSlMpICQoTElCT1BDT0RFUykgJChMSUJCRkQpICQoTElCSUJFUlRZKQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLQlsaW5rJChMRkxBR1MpL2V4ZT0kQCAkKE9CSlMpLCQoTElCT1BDT0RFUykvbGliLCQoTElCQkZEKS9saWIsJChMSUJJQkVSVFkpL2xpYiQoTElCUykKLWVsc2UKLQlsaW5rJChMRkxBR1MpL2V4ZT0kQCAkKE9CSlMpLCQoTElCSUJFUlRZKS9saWIkKExJQlMpCi1lbmRpZgotCi1nYXNwLmV4ZTogJChHQVNQT0JKUykgJChMSUJCRkQpICQoTElCSUJFUlRZKQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLQlsaW5rJChMRkxBR1MpL2V4ZT0kQCAkKEdBU1BPQkpTKSwkKExJQkJGRCkvbGliLCQoTElCSUJFUlRZKS9saWIkKExJQlMpCi1lbHNlCi0JbGluayQoTEZMQUdTKS9leGU9JEAgJChHQVNQT0JKUyksJChMSUJJQkVSVFkpL2xpYiQoTElCUykKLWVuZGlmCi0KLWNvbmZpZy5zdGF0dXM6Ci0JJCQgQGNvbmZpZy1nYXMKLQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLUNQVT1hbHBoYQotT0JKRk9STUFUPWV2YXgKLUZMVEZPUk1BVD1pZWVlCi1lbHNlCi1DUFU9dmF4Ci1PQkpGT1JNQVQ9dm1zCi1GTFRGT1JNQVQ9dmF4Ci1lbmRpZgotCi10YXJnLWNwdS5jOiBbLmNvbmZpZ110Yy0kKENQVSkuYwotCWNvcHkgJDwgJEAKLXRhcmctY3B1Lmg6IFsuY29uZmlnXXRjLSQoQ1BVKS5oCi0JY29weSAkPCAkQAotdGFyZy1lbnYuaDogWy5jb25maWdddGUtZ2VuZXJpYy5oCi0JY29weSAkPCAkQAotb2JqLWZvcm1hdC5oOiBbLmNvbmZpZ11vYmotJChPQkpGT1JNQVQpLmgKLQljb3B5ICQ8ICRACi1vYmotZm9ybWF0LmM6IFsuY29uZmlnXW9iai0kKE9CSkZPUk1BVCkuYwotCWNvcHkgJDwgJEAKLWF0b2YtdGFyZy5jOiBbLmNvbmZpZ11hdG9mLSQoRkxURk9STUFUKS5jCi0JY29weSAkPCAkQAotCi10YXJnLWNwdS5vYmo6IHRhcmctY3B1LmMgdGFyZy1jcHUuaCBbLmNvbmZpZ11hdG9mLXZheC5jCi0KLVstLmJmZF1iZmQuaDoKLQkkKENEKSBbLS5iZmRdCi0JZ21ha2UgLWYgbWFrZWZpbGUudm1zICJDQz0kKENDKSIKLQkkKENEKSBbLS5nYXNdCi0KLWluc3RhbGw6IGFzLmV4ZSBnYXNwLmV4ZQotCSQoQ1ApICReIEdOVV9ST09UXDpbQklOXQotCi1jbGVhbjoKLQkkJCBwdXJnZQotCSQoUk0pICoub2JqOwotCSQoUk0pICouZXhlOwotCSQoUk0pIGF0b2YtdGFyZy5jOwotCSQoUk0pIG9iai1mb3JtYXQuYzsKLQkkKFJNKSBvYmotZm9ybWF0Lmg7Ci0JJChSTSkgdGFyZy1lbnYuaDsKLQkkKFJNKSB0YXJnLWNwdS5oOwotCSQoUk0pIHRhcmctY3B1LmM7Ci0JJChSTSkgY29uZmlnLnN0YXR1czsKZGlmZiAtLWdpdCBhL2dhcy9tZXNzYWdlcy5jIGIvZ2FzL21lc3NhZ2VzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YjdhZDAuLjAwMDAwMDAKLS0tIGEvZ2FzL21lc3NhZ2VzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDEgKzAsMCBAQAotLyogbWVzc2FnZXMuYyAtIGVycm9yIHJlcG9ydGVyIC0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9FUlJOT19ICi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNlbmRpZgotCi0jaWZkZWYgVVNFX1NUREFSRwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBVU0VfVkFSQVJHUwotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKFVTRV9TVERBUkcpICYmICFkZWZpbmVkIChVU0VfVkFSQVJHUykKLS8qIFJvbGwgb3VyIG93bi4gICovCi0jZGVmaW5lIHZhX2FsaXN0IFJFU1QKLSNkZWZpbmUgdmFfZGNsCi10eXBlZGVmIGludCAqIHZhX2xpc3Q7Ci0jZGVmaW5lIHZhX3N0YXJ0KEFSR1MpCUFSR1MgPSAmUkVTVAotI2RlZmluZSB2YV9lbmQoQVJHUykKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBpZGVudGlmeSBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGFzX3Nob3dfd2hlcmUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgYXNfd2Fybl9pbnRlcm5hbCBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGludCwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBhc19iYWRfaW50ZXJuYWwgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBpbnQsIGNoYXIgKikpOwotCi0vKgotICogRGVzcGl0ZSB0aGUgcmVzdCBvZiB0aGUgY29tbWVudHMgaW4gdGhpcyBmaWxlLCAoRklYTUUtU09PTiksCi0gKiBoZXJlIGlzIHRoZSBjdXJyZW50IHNjaGVtZSBmb3IgZXJyb3IgbWVzc2FnZXMgZXRjOgotICoKLSAqIGFzX2ZhdGFsKCkgaXMgdXNlZCB3aGVuIGdhcyBpcyBxdWl0ZSBjb25mdXNlZCBhbmQKLSAqIGNvbnRpbnVpbmcgdGhlIGFzc2VtYmx5IGlzIHBvaW50bGVzcy4gIEluIHRoaXMgY2FzZSB3ZQotICogZXhpdCBpbW1lZGlhdGVseSB3aXRoIGVycm9yIHN0YXR1cy4KLSAqCi0gKiBhc19iYWQoKSBpcyB1c2VkIHRvIG1hcmsgZXJyb3JzIHRoYXQgcmVzdWx0IGluIHdoYXQgd2UKLSAqIHByZXN1bWUgdG8gYmUgYSB1c2VsZXNzIG9iamVjdCBmaWxlLiAgU2F5LCB3ZSBpZ25vcmVkCi0gKiBzb21ldGhpbmcgdGhhdCBtaWdodCBoYXZlIGJlZW4gdml0YWwuICBJZiB3ZSBzZWUgYW55IG9mCi0gKiB0aGVzZSwgYXNzZW1ibHkgd2lsbCBjb250aW51ZSB0byB0aGUgZW5kIG9mIHRoZSBzb3VyY2UsCi0gKiBubyBvYmplY3QgZmlsZSB3aWxsIGJlIHByb2R1Y2VkLCBhbmQgd2Ugd2lsbCB0ZXJtaW5hdGUKLSAqIHdpdGggZXJyb3Igc3RhdHVzLiAgVGhlIG5ldyBvcHRpb24sIC1aLCB0ZWxscyB1cyB0bwotICogcHJvZHVjZSBhbiBvYmplY3QgZmlsZSBhbnl3YXkgYnV0IHdlIHN0aWxsIGV4aXQgd2l0aAotICogZXJyb3Igc3RhdHVzLiAgVGhlIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IHlvdSBkb24ndCB3YW50Ci0gKiB0aGlzIG9iamVjdCBmaWxlIGJ1dCB3ZSBjb3VsZCBiZSB3cm9uZy4KLSAqCi0gKiBhc193YXJuKCkgaXMgdXNlZCB3aGVuIHdlIGhhdmUgYW4gZXJyb3IgZnJvbSB3aGljaCB3ZQotICogaGF2ZSBhIHBsYXVzaWJsZSBlcnJvciByZWNvdmVyeS4gIGVnLCBtYXNraW5nIHRoZSB0b3AKLSAqIGJpdHMgb2YgYSBjb25zdGFudCB0aGF0IGlzIGxvbmdlciB0aGFuIHdpbGwgZml0IGluIHRoZQotICogZGVzdGluYXRpb24uICBJbiB0aGlzIGNhc2Ugd2Ugd2lsbCBjb250aW51ZSB0byBhc3NlbWJsZQotICogdGhlIHNvdXJjZSwgYWx0aG91Z2ggd2UgbWF5IGhhdmUgbWFkZSBhIGJhZCBhc3N1bXB0aW9uLAotICogYW5kIHdlIHdpbGwgcHJvZHVjZSBhbiBvYmplY3QgZmlsZSBhbmQgcmV0dXJuIG5vcm1hbCBleGl0Ci0gKiBzdGF0dXMgKGllLCBubyBlcnJvcikuICBUaGUgbmV3IG9wdGlvbiAtWCB0ZWxscyB1cyB0bwotICogdHJlYXQgYWxsIGFzX3dhcm4oKSBlcnJvcnMgYXMgYXNfYmFkKCkgZXJyb3JzLiAgVGhhdCBpcywKLSAqIG5vIG9iamVjdCBmaWxlIHdpbGwgYmUgcHJvZHVjZWQgYW5kIHdlIHdpbGwgZXhpdCB3aXRoCi0gKiBlcnJvciBzdGF0dXMuICBUaGUgaWRlYSBoZXJlIGlzIHRoYXQgd2UgZG9uJ3Qga2lsbCBhbgotICogZW50aXJlIG1ha2UgYmVjYXVzZSBvZiBhbiBlcnJvciB0aGF0IHdlIGtuZXcgaG93IHRvCi0gKiBjb3JyZWN0LiAgT24gdGhlIG90aGVyIGhhbmQsIHNvbWV0aW1lcyB5b3UgbWlnaHQgd2FudCB0bwotICogc3RvcCB0aGUgbWFrZSBhdCB0aGVzZSBwb2ludHMuCi0gKgotICogYXNfdHNrdHNrKCkgaXMgdXNlZCB3aGVuIHdlIHNlZSBhIG1pbm9yIGVycm9yIGZvciB3aGljaAotICogb3VyIGVycm9yIHJlY292ZXJ5IGFjdGlvbiBpcyBhbG1vc3QgY2VydGFpbmx5IGNvcnJlY3QuCi0gKiBJbiB0aGlzIGNhc2UsIHdlIHByaW50IGEgbWVzc2FnZSBhbmQgdGhlbiBhc3NlbWJseQotICogY29udGludWVzIGFzIHRob3VnaCBubyBlcnJvciBvY2N1cnJlZC4KLSAqLwotCi1zdGF0aWMgdm9pZAotaWRlbnRpZnkgKGZpbGUpCi0gICAgIGNoYXIgKmZpbGU7Ci17Ci0gIHN0YXRpYyBpbnQgaWRlbnRpZmllZDsKLSAgaWYgKGlkZW50aWZpZWQpCi0gICAgcmV0dXJuOwotICBpZGVudGlmaWVkKys7Ci0KLSAgaWYgKCFmaWxlKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCB4OwotICAgICAgYXNfd2hlcmUgKCZmaWxlLCAmeCk7Ci0gICAgfQotCi0gIGlmIChmaWxlKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBmaWxlKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJBc3NlbWJsZXIgbWVzc2FnZXM6XG4iKSk7Ci19Ci0KLXN0YXRpYyBpbnQgd2FybmluZ19jb3VudDsJLyogQ291bnQgb2YgbnVtYmVyIG9mIHdhcm5pbmdzIGlzc3VlZCAqLwotCi1pbnQgCi1oYWRfd2FybmluZ3MgKCkKLXsKLSAgcmV0dXJuICh3YXJuaW5nX2NvdW50KTsKLX0KLQotLyogTm9uemVybyBpZiB3ZSd2ZSBoaXQgYSAnYmFkIGVycm9yJywgYW5kIHNob3VsZCBub3Qgd3JpdGUgYW4gb2JqIGZpbGUsCi0gICBhbmQgZXhpdCB3aXRoIGEgbm9uemVybyBlcnJvciBjb2RlICovCi0KLXN0YXRpYyBpbnQgZXJyb3JfY291bnQ7Ci0KLWludCAKLWhhZF9lcnJvcnMgKCkKLXsKLSAgcmV0dXJuIChlcnJvcl9jb3VudCk7Ci19Ci0KLQotLyogUHJpbnQgdGhlIGN1cnJlbnQgbG9jYXRpb24gdG8gc3RkZXJyLiAgKi8KLQotc3RhdGljIHZvaWQKLWFzX3Nob3dfd2hlcmUgKCkKLXsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0KLSAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7Ci0gIGlkZW50aWZ5IChmaWxlKTsKLSAgaWYgKGZpbGUpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXU6ICIsIGZpbGUsIGxpbmUpOwotfQotCi0vKgotICoJCQlhIHMgXyBwIGUgciByIG8gcgotICoKLSAqIExpa2UgcGVycm9yKDMpLCBidXQgd2l0aCBtb3JlIGluZm8uCi0gKi8KLQotdm9pZCAKLWFzX3BlcnJvciAoZ3JpcGUsIGZpbGVuYW1lKQotICAgICBjb25zdCBjaGFyICpncmlwZTsJCS8qIFVucHVuY3R1YXRlZCBlcnJvciB0aGVtZS4gKi8KLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGNvbnN0IGNoYXIgKmVycnR4dDsKLQotICBhc19zaG93X3doZXJlICgpOwotICBmcHJpbnRmIChzdGRlcnIsIGdyaXBlLCBmaWxlbmFtZSk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBlcnJ0eHQgPSBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKTsKLSNlbHNlCi0gIGVycnR4dCA9IHhzdHJlcnJvciAoZXJybm8pOwotI2VuZGlmCi0gIGZwcmludGYgKHN0ZGVyciwgIjogJXNcbiIsIGVycnR4dCk7Ci0gIGVycm5vID0gMDsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19lcnJvcik7Ci0jZW5kaWYKLX0KLQotLyoKLSAqCQkJYSBzIF8gdCBzIGsgdCBzIGsgKCkKLSAqCi0gKiBTZW5kIHRvIHN0ZGVyciBhIHN0cmluZyBhcyBhIHdhcm5pbmcsIGFuZCBsb2NhdGUgd2FybmluZwotICogaW4gaW5wdXQgZmlsZShzKS4KLSAqIFBsZWFzZSBvbmx5IHVzZSB0aGlzIGZvciB3aGVuIHdlIGhhdmUgc29tZSByZWNvdmVyeSBhY3Rpb24uCi0gKiBQbGVhc2UgZXhwbGFpbiBpbiBzdHJpbmcgKHdoaWNoIG1heSBoYXZlICdcbidzKSB3aGF0IHJlY292ZXJ5IHdhcyBkb25lLgotICovCi0KLSNpZmRlZiBVU0VfU1REQVJHCi12b2lkIAotYXNfdHNrdHNrIChjb25zdCBjaGFyICpmb3JtYXQsLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgYXNfc2hvd193aGVyZSAoKTsKLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gICh2b2lkKSBwdXRjICgnXG4nLCBzdGRlcnIpOwotfQkJCQkvKiBhc190c2t0c2soKSAqLwotI2Vsc2UKLXZvaWQgCi1hc190c2t0c2sgKGZvcm1hdCwgdmFfYWxpc3QpCi0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfZGNsCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICBhc19zaG93X3doZXJlICgpOwotICB2YV9zdGFydCAoYXJncyk7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gICh2b2lkKSBwdXRjICgnXG4nLCBzdGRlcnIpOwotfQkJCQkvKiBhc190c2t0c2soKSAqLwotI2VuZGlmIC8qIG5vdCBOT19TVERBUkcgKi8KLQotLyogVGhlIGNvbW1vbiBwb3J0aW9uIG9mIGFzX3dhcm4gYW5kIGFzX3dhcm5fd2hlcmUuICAqLwotCi1zdGF0aWMgdm9pZAotYXNfd2Fybl9pbnRlcm5hbCAoZmlsZSwgbGluZSwgYnVmZmVyKQotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgY2hhciAqYnVmZmVyOwotewotICArK3dhcm5pbmdfY291bnQ7Ci0KLSAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICBhc193aGVyZSAoJmZpbGUsICZsaW5lKTsKLQotICBpZGVudGlmeSAoZmlsZSk7Ci0gIGlmIChmaWxlKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiV1OiAiLCBmaWxlLCBsaW5lKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJXYXJuaW5nOiAiKSk7Ci0gIGZwdXRzIChidWZmZXIsIHN0ZGVycik7Ci0gICh2b2lkKSBwdXRjICgnXG4nLCBzdGRlcnIpOwotI2lmbmRlZiBOT19MSVNUSU5HCi0gIGxpc3Rpbmdfd2FybmluZyAoYnVmZmVyKTsKLSNlbmRpZgotfQotCi0vKgotICoJCQlhIHMgXyB3IGEgciBuICgpCi0gKgotICogU2VuZCB0byBzdGRlcnIgYSBzdHJpbmcgYXMgYSB3YXJuaW5nLCBhbmQgbG9jYXRlIHdhcm5pbmcKLSAqIGluIGlucHV0IGZpbGUocykuCi0gKiBQbGVhc2Ugb25seSB1c2UgdGhpcyBmb3Igd2hlbiB3ZSBoYXZlIHNvbWUgcmVjb3ZlcnkgYWN0aW9uLgotICogUGxlYXNlIGV4cGxhaW4gaW4gc3RyaW5nICh3aGljaCBtYXkgaGF2ZSAnXG4ncykgd2hhdCByZWNvdmVyeSB3YXMgZG9uZS4KLSAqLwotCi0jaWZkZWYgVVNFX1NUREFSRwotdm9pZCAKLWFzX3dhcm4gKGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciBidWZmZXJbMjAwMF07Ci0KLSAgaWYgKCFmbGFnX25vX3dhcm5pbmdzKQotICAgIHsKLSAgICAgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICAgICAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKLSAgICAgIHZhX2VuZCAoYXJncyk7Ci0gICAgICBhc193YXJuX2ludGVybmFsICgoY2hhciAqKSBOVUxMLCAwLCBidWZmZXIpOwotICAgIH0KLX0JCQkJLyogYXNfd2FybigpICovCi0jZWxzZQotLypWQVJBUkdTMSAqLwotdm9pZCAKLWFzX3dhcm4gKGZvcm1hdCwgdmFfYWxpc3QpCi0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfZGNsCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciBidWZmZXJbMjAwMF07Ci0KLSAgaWYgKCFmbGFnX25vX3dhcm5pbmdzKQotICAgIHsKLSAgICAgIHZhX3N0YXJ0IChhcmdzKTsKLSAgICAgIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7Ci0gICAgICB2YV9lbmQgKGFyZ3MpOwotICAgICAgYXNfd2Fybl9pbnRlcm5hbCAoKGNoYXIgKikgTlVMTCwgMCwgYnVmZmVyKTsKLSAgICB9Ci19CQkJCS8qIGFzX3dhcm4oKSAqLwotI2VuZGlmIC8qIG5vdCBOT19TVERBUkcgKi8KLQotLyogYXNfd2Fybl93aGVyZSwgbGlrZSBhc19iYWQgYnV0IHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGFyZQotICAgcGFzc2VkIGluLiAgVW5mb3J0dW5hdGVseSwgd2UgaGF2ZSB0byByZXBlYXQgdGhlIGZ1bmN0aW9uIGluIG9yZGVyCi0gICB0byBoYW5kbGUgdGhlIHZhcmFyZ3MgY29ycmVjdGx5IGFuZCBwb3J0YWJseS4gICovCi0KLSNpZmRlZiBVU0VfU1REQVJHCi12b2lkIAotYXNfd2Fybl93aGVyZSAoY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciBidWZmZXJbMjAwMF07Ci0KLSAgaWYgKCFmbGFnX25vX3dhcm5pbmdzKQotICAgIHsKLSAgICAgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICAgICAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKLSAgICAgIHZhX2VuZCAoYXJncyk7Ci0gICAgICBhc193YXJuX2ludGVybmFsIChmaWxlLCBsaW5lLCBidWZmZXIpOwotICAgIH0KLX0JCQkJLyogYXNfd2FybigpICovCi0jZWxzZQotLypWQVJBUkdTMSAqLwotdm9pZCAKLWFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsIGZvcm1hdCwgdmFfYWxpc3QpCi0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2RjbAotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgYnVmZmVyWzIwMDBdOwotCi0gIGlmICghZmxhZ19ub193YXJuaW5ncykKLSAgICB7Ci0gICAgICB2YV9zdGFydCAoYXJncyk7Ci0gICAgICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOwotICAgICAgdmFfZW5kIChhcmdzKTsKLSAgICAgIGFzX3dhcm5faW50ZXJuYWwgKGZpbGUsIGxpbmUsIGJ1ZmZlcik7Ci0gICAgfQotfQkJCQkvKiBhc193YXJuKCkgKi8KLSNlbmRpZiAvKiBub3QgTk9fU1REQVJHICovCi0KLS8qIFRoZSBjb21tb24gcG9ydGlvbiBvZiBhc19iYWQgYW5kIGFzX2JhZF93aGVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1hc19iYWRfaW50ZXJuYWwgKGZpbGUsIGxpbmUsIGJ1ZmZlcikKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgIGNoYXIgKmJ1ZmZlcjsKLXsKLSAgKytlcnJvcl9jb3VudDsKLQotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIGFzX3doZXJlICgmZmlsZSwgJmxpbmUpOwotCi0gIGlkZW50aWZ5IChmaWxlKTsKLSAgaWYgKGZpbGUpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXU6ICIsIGZpbGUsIGxpbmUpOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIkVycm9yOiAiKSk7Ci0gIGZwdXRzIChidWZmZXIsIHN0ZGVycik7Ci0gICh2b2lkKSBwdXRjICgnXG4nLCBzdGRlcnIpOwotI2lmbmRlZiBOT19MSVNUSU5HCi0gIGxpc3RpbmdfZXJyb3IgKGJ1ZmZlcik7Ci0jZW5kaWYKLX0KLQotLyoKLSAqCQkJYSBzIF8gYiBhIGQgKCkKLSAqCi0gKiBTZW5kIHRvIHN0ZGVyciBhIHN0cmluZyBhcyBhIHdhcm5pbmcsIGFuZCBsb2NhdGUgd2FybmluZyBpbiBpbnB1dCBmaWxlKHMpLgotICogUGxlYXNlIHVzIHdoZW4gdGhlcmUgaXMgbm8gcmVjb3ZlcnksIGJ1dCB3ZSB3YW50IHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcKLSAqIGJ1dCBub3QgcHJvZHVjZSBhbiBvYmplY3QgZmlsZS4KLSAqIFBsZWFzZSBleHBsYWluIGluIHN0cmluZyAod2hpY2ggbWF5IGhhdmUgJ1xuJ3MpIHdoYXQgcmVjb3Zlcnkgd2FzIGRvbmUuCi0gKi8KLQotI2lmZGVmIFVTRV9TVERBUkcKLXZvaWQgCi1hc19iYWQgKGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciBidWZmZXJbMjAwMF07Ci0KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0KLSAgYXNfYmFkX2ludGVybmFsICgoY2hhciAqKSBOVUxMLCAwLCBidWZmZXIpOwotfQotCi0jZWxzZQotLypWQVJBUkdTMSAqLwotdm9pZCAKLWFzX2JhZCAoZm9ybWF0LCB2YV9hbGlzdCkKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICB2YV9kY2wKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyIGJ1ZmZlclsyMDAwXTsKLQotICB2YV9zdGFydCAoYXJncyk7Ci0gIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0KLSAgYXNfYmFkX2ludGVybmFsICgoY2hhciAqKSBOVUxMLCAwLCBidWZmZXIpOwotfQotI2VuZGlmIC8qIG5vdCBOT19TVERBUkcgKi8KLQotLyogYXNfYmFkX3doZXJlLCBsaWtlIGFzX2JhZCBidXQgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgYXJlCi0gICBwYXNzZWQgaW4uICBVbmZvcnR1bmF0ZWx5LCB3ZSBoYXZlIHRvIHJlcGVhdCB0aGUgZnVuY3Rpb24gaW4gb3JkZXIKLSAgIHRvIGhhbmRsZSB0aGUgdmFyYXJncyBjb3JyZWN0bHkgYW5kIHBvcnRhYmx5LiAgKi8KLQotI2lmZGVmIFVTRV9TVERBUkcKLXZvaWQgCi1hc19iYWRfd2hlcmUgKGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBjaGFyICpmb3JtYXQsLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgYnVmZmVyWzIwMDBdOwotCi0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotCi0gIGFzX2JhZF9pbnRlcm5hbCAoZmlsZSwgbGluZSwgYnVmZmVyKTsKLX0KLQotI2Vsc2UKLS8qVkFSQVJHUzEgKi8KLXZvaWQgCi1hc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsIGZvcm1hdCwgdmFfYWxpc3QpCi0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2RjbAotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgYnVmZmVyWzIwMDBdOwotCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLQotICBhc19iYWRfaW50ZXJuYWwgKGZpbGUsIGxpbmUsIGJ1ZmZlcik7Ci19Ci0jZW5kaWYgLyogbm90IE5PX1NUREFSRyAqLwotCi0vKgotICoJCQlhIHMgXyBmIGEgdCBhIGwgKCkKLSAqCi0gKiBTZW5kIHRvIHN0ZGVyciBhIHN0cmluZyBhcyBhIGZhdGFsIG1lc3NhZ2UsIGFuZCBwcmludCBsb2NhdGlvbiBvZiBlcnJvciBpbgotICogaW5wdXQgZmlsZShzKS4KLSAqIFBsZWFzZSBvbmx5IHVzZSB0aGlzIGZvciB3aGVuIHdlIERPTidUIGhhdmUgc29tZSByZWNvdmVyeSBhY3Rpb24uCi0gKiBJdCB4ZXhpdCgpcyB3aXRoIGEgd2FybmluZyBzdGF0dXMuCi0gKi8KLQotI2lmZGVmIFVTRV9TVERBUkcKLXZvaWQgCi1hc19mYXRhbCAoY29uc3QgY2hhciAqZm9ybWF0LC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotCi0gIGFzX3Nob3dfd2hlcmUgKCk7Ci0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIkZhdGFsIGVycm9yOiAiKSk7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJncyk7Ci0gICh2b2lkKSBwdXRjICgnXG4nLCBzdGRlcnIpOwotICB2YV9lbmQgKGFyZ3MpOwotICB4ZXhpdCAoRVhJVF9GQUlMVVJFKTsKLX0JCQkJLyogYXNfZmF0YWwoKSAqLwotI2Vsc2UKLS8qVkFSQVJHUzEqLwotdm9pZCAKLWFzX2ZhdGFsIChmb3JtYXQsIHZhX2FsaXN0KQotICAgICBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2RjbAotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgYXNfc2hvd193aGVyZSAoKTsKLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIkZhdGFsIGVycm9yOiAiKSk7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJncyk7Ci0gICh2b2lkKSBwdXRjICgnXG4nLCBzdGRlcnIpOwotICB2YV9lbmQgKGFyZ3MpOwotICB4ZXhpdCAoRVhJVF9GQUlMVVJFKTsKLX0JCQkJLyogYXNfZmF0YWwoKSAqLwotI2VuZGlmIC8qIG5vdCBOT19TVERBUkcgKi8KLQotLyoKLSAqIGFzX2Fzc2VydDogSW5kaWNhdGUgYXNzZXJ0aW9uIGZhaWx1cmUuCi0gKiBBcmd1bWVudHM6IEZpbGVuYW1lLCBsaW5lIG51bWJlciwgb3B0aW9uYWwgZnVuY3Rpb24gbmFtZS4KLSAqLwotCi12b2lkCi1hc19hc3NlcnQgKGZpbGUsIGxpbmUsIGZuKQotICAgICBjb25zdCBjaGFyICpmaWxlLCAqZm47Ci0gICAgIGludCBsaW5lOwotewotICBhc19zaG93X3doZXJlICgpOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIkludGVybmFsIGVycm9yIVxuIikpOwotICBpZiAoZm4pCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCJBc3NlcnRpb24gZmFpbHVyZSBpbiAlcyBhdCAlcyBsaW5lICVkLlxuIiksCi0JICAgICBmbiwgZmlsZSwgbGluZSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIkFzc2VydGlvbiBmYWlsdXJlIGF0ICVzIGxpbmUgJWQuXG4iKSwgZmlsZSwgbGluZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiUGxlYXNlIHJlcG9ydCB0aGlzIGJ1Zy5cbiIpKTsKLSAgeGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci19Ci0KLS8qIGFzX2Fib3J0OiBQcmludCBhIGZyaWVuZGx5IG1lc3NhZ2Ugc2F5aW5nIGhvdyB0b3RhbGx5IGhvc2VkIHdlIGFyZSwKLSAgIGFuZCBleGl0IHdpdGhvdXQgcHJvZHVjaW5nIGEgY29yZSBmaWxlLiAgKi8KLXZvaWQKLWFzX2Fib3J0IChmaWxlLCBsaW5lLCBmbikKLSAgICAgY29uc3QgY2hhciAqZmlsZSwgKmZuOwotICAgICBpbnQgbGluZTsKLXsKLSAgYXNfc2hvd193aGVyZSAoKTsKLSAgaWYgKGZuKQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiSW50ZXJuYWwgZXJyb3IsIGFib3J0aW5nIGF0ICVzIGxpbmUgJWQgaW4gJXNcbiIpLAotCSAgICAgZmlsZSwgbGluZSwgZm4pOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJbnRlcm5hbCBlcnJvciwgYWJvcnRpbmcgYXQgJXMgbGluZSAlZFxuIiksCi0JICAgICBmaWxlLCBsaW5lKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJQbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIikpOwotICB4ZXhpdCAoRVhJVF9GQUlMVVJFKTsKLX0KLQotLyogU3VwcG9ydCByb3V0aW5lcy4gICovCi0KLXZvaWQKLWZwcmludF92YWx1ZSAoZmlsZSwgdmFsKQotICAgICBGSUxFICpmaWxlOwotICAgICB2YWx1ZVQgdmFsOwotewotICBpZiAoc2l6ZW9mICh2YWwpIDw9IHNpemVvZiAobG9uZykpCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsZSwgIiVsZCIsIChsb25nKSB2YWwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChzaXplb2YgKHZhbCkgPD0gc2l6ZW9mIChiZmRfdm1hKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmX3ZtYSAoZmlsZSwgdmFsKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSAgYWJvcnQgKCk7Ci19Ci0KLXZvaWQKLXNwcmludF92YWx1ZSAoYnVmLCB2YWwpCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLXsKLSAgaWYgKHNpemVvZiAodmFsKSA8PSBzaXplb2YgKGxvbmcpKQotICAgIHsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVsZCIsIChsb25nKSB2YWwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChzaXplb2YgKHZhbCkgPD0gc2l6ZW9mIChiZmRfdm1hKSkKLSAgICB7Ci0gICAgICBzcHJpbnRmX3ZtYSAoYnVmLCB2YWwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotICBhYm9ydCAoKTsKLX0KLQotLyogZW5kIG9mIG1lc3NhZ2VzLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9tcHctY29uZmlnLmluIGIvZ2FzL21wdy1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjliMWQuLjAwMDAwMDAKLS0tIGEvZ2FzL21wdy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIGZyYWdtZW50IGZvciBHQVMuCi0KLVNldCB0YXJnZXRfYXJjaCBgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgLWUgJ3MvLS4qLS4qLy8nYAotCi1JZiAie3RhcmdldF9hcmNofSIgPX4gL3Bvd2VycGMvCi0JU2V0IHNob3J0X2FyY2hfbmFtZSAicHBjIgotCVNldCB0YXJnZXRfY3B1ICJwb3dlcnBjIgotRWxzZQotCVNldCBzaG9ydF9hcmNoX25hbWUgInt0YXJnZXRfYXJjaH0iCi1FbmQgSWYKLQotIyBUaGUgZm9sbG93aW5nIHdvcmtzIGZvciBtYW55IGNvbmZpZ3VyYXRpb25zLCB0aG91Z2ggbm90IGFsbC4KLQotU2V0IG9ial9mb3JtYXQgYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkIC1lICdzLy4qLS4qLS8vJ2AKLVNldCB0YXJnZXRfb3MgYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkIC1lICdzLy4qLS4qLS8vJ2AKLQotU2V0IGJmZF9nYXMgbm8KLQotU2V0IFRERUZJTkVTICIiCi0KLVNldCBFWFRSQV9PQkpFQ1RTICIiCi0KLSMgRGVmYXVsdCBlbXVsYXRpb24uCi0KLVNldCBlbSBnZW5lcmljCi0KLUlmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9tNjhrLWFwcGxlLW1hY29zLwotCVNldCBvYmpfZm9ybWF0ICJjb2ZmIgotCVNldCBUREVGSU5FUyAnLWQgTTY4S0NPRkYnCi0JU2V0IEVYVFJBX09CSkVDVFMgJyJ7b30ibTY4ay1wYXJzZS5jLm8nCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL3Bvd2VycGMtYXBwbGUtbWFjb3MvCi0JU2V0IG9ial9mb3JtYXQgImNvZmYiCi0JU2V0IGJmZF9nYXMgeWVzCi0JU2V0IGVtIG1hY29zCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL2kzODYtXE9wdGlvbi14LWdvMzIvCi0JU2V0IG9ial9mb3JtYXQgImNvZmYiCi0JU2V0IFRERUZJTkVTICctZCBJMzg2Q09GRicKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbTY4ay1cT3B0aW9uLXgtY29mZi8KLQlTZXQgVERFRklORVMgJy1kIE02OEtDT0ZGJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9taXBzLWlkdC1lY29mZi8KLQlTZXQgYmZkX2dhcyB5ZXMKLQlTZXQgVERFRklORVMgJy1kIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOPTEnCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL21pcHMtXE9wdGlvbi14LVxPcHRpb24teC8KLQkjIEFzc3VtZSBvdGhlciBPU2VzIGV0YyB1c2UgRUxGCi0JU2V0IG9ial9mb3JtYXQgImVsZiIKLQlTZXQgYmZkX2dhcyB5ZXMKLQlTZXQgVERFRklORVMgJy1kIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOPTEnCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iYmZkOmVsZi1iZmQuaCAnYmZkL2VsZi1iZmQuaCcKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvc2gtXE9wdGlvbi14LWhtcy8KLQlTZXQgb2JqX2Zvcm1hdCAiY29mZiIKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJvcGNvZGVzOnNoLW9wYy5oICdvcGNvZGVzL3NoLW9wYy5oJwotRW5kIElmCi0KLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOnRjLXtzaG9ydF9hcmNoX25hbWV9LmMgdGFyZy1jcHUuYwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6dGMte3Nob3J0X2FyY2hfbmFtZX0uaCB0YXJnLWNwdS5oCi0KLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOm9iai17b2JqX2Zvcm1hdH0uYyBvYmotZm9ybWF0LmMKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOm9iai17b2JqX2Zvcm1hdH0uaCBvYmotZm9ybWF0LmgKLQotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6dGUte2VtfS5oIHRhcmctZW52LmgKLQotIyBTcGVjaWFsIGNhc2VzIGZvciBmbG9hdCBoYW5kbGluZy4KLQotSWYgInt0YXJnZXRfYXJjaH0iID1+IC9uczMyay8KLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzphdG9mLW5zMzJrLmMgYXRvZi10YXJnLmMKLUVsc2UgSWYgInt0YXJnZXRfYXJjaH0iID1+IC90YWhvZS8KLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzphdG9mLXRhaG9lLmMgYXRvZi10YXJnLmMKLUVsc2UgSWYgInt0YXJnZXRfYXJjaH0iID1+IC92YXgvCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6YXRvZi12YXguYyBhdG9mLXRhcmcuYwotRWxzZQotCSMgVXNlIElFRUUgYnkgZGVmYXVsdC4KLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzphdG9mLWllZWUuYyBhdG9mLXRhcmcuYwotRW5kIElmCi0KLUVjaG8gJyMgRnJvbSBtcHctY29uZmlnLmluJyAgICAgCQkgPiAie299Im1rLnRtcAotRWNobyAiVERFRklORVMgPSAiIHtUREVGSU5FU30JCQk+PiAie299Im1rLnRtcAotRWNobyAiRVhUUkFfT0JKRUNUUyA9ICIge0VYVFJBX09CSkVDVFN9CQk+PiAie299Im1rLnRtcAotIyAoV2UgdXNlIHRoZSAtbiBvcHRpb24gaGVyZSBzbyBhcyBub3QgdG8gZ2V0IGV4dHJhIHNwYWNlcyBpbnNlcnRlZCkKLUVjaG8gLW4gJ1RBUkdfQ1BVX0RFUCA9IHtUQVJHX0NQVV9ERVBfJwkJPj4gIntvfSJtay50bXAKLUVjaG8gLW4ge3Nob3J0X2FyY2hfbmFtZX0JCQk+PiAie299Im1rLnRtcAotRWNobyAtbiAnfScJCQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICcjIEVuZCBmcm9tIG1wdy1jb25maWcuaW4nCQkJPj4gIntvfSJtay50bXAKLQotRWNobyAnLyogY29uZi4gIEdlbmVyYXRlZCBieSBtcHctY29uZmlndXJlLiAgKi8nID4gIntvfSJjb25mLm5ldwotRWNobyAtbiAnI2RlZmluZSBUQVJHRVRfQ1BVICAgICAgICInICAgICAgIAk+PiAie299ImNvbmYubmV3Ci1FY2hvIC1uICJ7dGFyZ2V0X2NwdX0iICAgICAgIAkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gICAgJyInICAgICAgIAkJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvIC1uICcjZGVmaW5lIFRBUkdFVF9PUyAgICAgICAiJyAgICAgICAJPj4gIntvfSJjb25mLm5ldwotRWNobyAtbiAie3RhcmdldF9vc30iICAgICAgIAkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gICAgJyInICAgICAgIAkJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvIC1uICcjZGVmaW5lIFRBUkdFVF9BTElBUyAgICAgICAiJyAgICAgICAJPj4gIntvfSJjb25mLm5ldwotRWNobyAtbiAie3RhcmdldF9hbGlhc30iICAgICAgIAkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gICAgJyInICAgICAgIAkJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvIC1uICcjZGVmaW5lIFRBUkdFVF9DQU5PTklDQUwgICAgICAgIicgICAgIAk+PiAie299ImNvbmYubmV3Ci1FY2hvIC1uICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAgICAnIicgICAgICAgCQkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gJyNpbmNsdWRlICJtcHcuaCInCQkJCT4+ICJ7b30iY29uZi5uZXcKLUlmICJ7YmZkX2dhc30iID1+IC95ZXMvCi0JRWNobyAiI2RlZmluZSBCRkRfQVNTRU1CTEVSIgkJPj4gIntvfSJjb25mLm5ldwotRWxzZQotCUVjaG8gIiNkZWZpbmUgTUFOWV9TRUdNRU5UUyIJCT4+ICJ7b30iY29uZi5uZXcKLUVuZCBJZgotRWNobyAnI2RlZmluZSBDUl9FT0wnCQkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gJyNkZWZpbmUgT0JKX0NPRkZfT01JVF9USU1FU1RBTVAnCQk+PiAie299ImNvbmYubmV3Ci1FY2hvICcjZGVmaW5lIExPU0lOR19DT01QSUxFUicJCQk+PiAie299ImNvbmYubmV3Ci0KLU1vdmVJZkNoYW5nZSAie299ImNvbmYubmV3ICJ7b30iY29uZgotCi1zZWQgLWUgInMvQHNyY2RpckAve3NyY2Rpcn0vIiAie3NyY2Rpcn0iZ2RiaW5pdC5pbiA+ICJ7b30iX2dkYmluaXQKZGlmZiAtLWdpdCBhL2dhcy9tcHctbWFrZS5zZWQgYi9nYXMvbXB3LW1ha2Uuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmYxMmE1Li4wMDAwMDAwCi0tLSBhL2dhcy9tcHctbWFrZS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotIyBTZWQgY29tbWFuZHMgdGhhdCBmaW5pc2ggdHJhbnNsYXRpbmcgdGhlIEdBUyBVbml4IE1ha2VmaWxlIHRvIE1QVyBzeW50YXguCi0KLS9eIyBAdGFyZ2V0X2ZyYWdAL2FcCi1cCi1IREVGSU5FUyA9IFwKLUxPQ0FMX0xPQURMSUJFUyA9IFwKLQotL15zcmNyb290ID0gL3MvXi8jLwotL150YXJnZXRfYWxpYXMgPSAvcy9eLyMvCi0KLS9JTkNMVURFUy9zLy1pICJ7c3JjZGlyfSI6XChbYS16XSpcKS8taSAie3RvcHNyY2Rpcn0iXDEvCi0vSU5DTFVERVMvcy8taSAie3NyY2Rpcn0iXC5cLi8taSAie3RvcHNyY2Rpcn0iLwotCi0vXklOQ0xVREVTID0gLiokL3MvJC8gLWkgInt0b3BzcmNkaXJ9ImluY2x1ZGU6bXB3OiAtaSA6OmV4dHJhLWluY2x1ZGU6LwotCi0vJChUQVJHX0NQVV9ERVBfQHRhcmdldF9jcHVfdHlwZUApL3MvJChUQVJHX0NQVV9ERVBfQHRhcmdldF9jcHVfdHlwZUApL3tUQVJHX0NQVV9ERVB9LwotCi0vQE9QQ09ERVNfTElCQC9zL0BPUENPREVTX0xJQkAvOjpvcGNvZGVzOmxpYm9wY29kZXMuby8KLS9AQkZETElCQC9zL0BCRkRMSUJALzo6YmZkOmxpYmJmZC5vLwotCi0jIFBvaW50IGF0IHRoZSBsaWJyYXJpZXMgZGlyZWN0bHkuCi0vQE9QQ09ERVNfREVQQC9zL0BPUENPREVTX0RFUEAvOjpvcGNvZGVzOmxpYm9wY29kZXMuby8KLS9AQkZEREVQQC9zL0BCRkRERVBALzo6YmZkOmxpYmJmZC5vLwotCi0jIERvbid0IG5lZWQgdGhpcy4KLS9ASExERkxBR1NAL3MvQEhMREZMQUdTQC8vCi0KLS9leHRyYV9vYmplY3RzQC9zL2V4dHJhX29iamVjdHNAL3tFWFRSQV9PQkpFQ1RTfS8KLQotL0xPQURMSUJFUy9zL3tMT0FETElCRVN9L3tFWFRSQUxJQlN9LwotCi0vQEFMTF9PQkpfREVQU0Avcy9AQUxMX09CSl9ERVBTQC86OmJmZDpiZmQuaC8KLQotIyBUaGlzIGNhdXNlcyBwcm9ibGVtcyAtIG5vdCBzdXJlIHdoeS4KLS9edGFncyBUQUdTLywvZXRhZ3MgL2QKLQotL15tYWtlLWdhcy5jb20vcy9eLyMvCi0KLS90cnVlL3MvIDsgQHRydWUkLy8KLQotIyBSZW1vdmUgcmVmZXJlbmNlcyB0byBjb25mLmluLCB3ZSBkb24ndCBuZWVkIHRoZW0uCi0vY29uZlwuaW4vcy9jb25mXC5pbi8vZwotCi0jIFVzZSBfZ2RiaW5pdCBldmVyeXdoZXJlIGluc3RlYWQgb2YgLmdkYmluaXQuCi0vZ2RiaW5pdC9zL1wuZ2RiaW5pdC9fZ2RiaW5pdC9nCi0KLS9hdG9mLXRhcmcvcy8ie3N9ImF0b2YtdGFyZ1wuYy8ie299ImF0b2YtdGFyZy5jL2cKLS9jb25maWcvcy8ie3N9ImNvbmZpZ1wuaC8ie299ImNvbmZpZy5oL2cKLS9jb25maWcvcy9eY29uZmlnXC5oLyJ7b30iY29uZmlnLmgvCi0vb2JqLWZvcm1hdC9zLyJ7c30ib2JqLWZvcm1hdFwuYy8ie299Im9iai1mb3JtYXQuYy9nCi0vb2JqLWZvcm1hdC9zLyJ7c30ib2JqLWZvcm1hdFwuaC8ie299Im9iai1mb3JtYXQuaC9nCi0vdGFyZy1jcHUvcy8ie3N9InRhcmctY3B1XC5jLyJ7b30idGFyZy1jcHUuYy9nCi0vdGFyZy1jcHUvcy8ie3N9InRhcmctY3B1XC5oLyJ7b30idGFyZy1jcHUuaC9nCi0vdGFyZy1lbnYvcy8ie3N9InRhcmctZW52XC5oLyJ7b30idGFyZy1lbnYuaC9nCi0KLS9tNjhrLXBhcnNlLmMvcy8ie3N9Im02OGstcGFyc2VcLmMvIntvfSJtNjhrLXBhcnNlLmMvZwotL202OGstcGFyc2UuYy9zL15tNjhrLXBhcnNlXC5jLyJ7b30ibTY4ay1wYXJzZS5jLwotCi0jIFdoYWNrIG91dCB0aGUgY29uZmlnLmggZGVwZW5kZW5jeSwgaXQgb25seSBjYXVzZXMgZXhjZXNzIHJlYnVpbGRzLgotL3tPQkpTfS9zL3tPQkpTfSBcXE9wdGlvbi1mICJ7b30iY29uZmlnLmgve09CSlN9IFxcT3B0aW9uLWYvCi0vZ2FzcC5jL3MvZ2FzcFwuYyAie299ImNvbmZpZy5oL2dhc3AuYy8KLQotIyBBTExfQ0ZMQUdTIGluY2x1ZGVzIFRERUZJTkVTLCB3aGljaCBpcyBub3QgZGVzaXJhYmxlIGF0IGxpbmsgdGltZS4KLS9DQ19MRC9zL0FMTF9DRkxBR1MvQ0ZMQUdTL2cKLQotIyBUaGUgcmVzb3VyY2UgZmlsZSBpcyBjYWxsZWQgbWFjLWFzLnIuCi0vYXMubmV3LnIvcy9hc1wubmV3XC5yL21hYy1hcy5yLwotL2dhc3AubmV3LnIvcy9nYXNwXC5uZXdcLnIvbWFjLWFzLnIvCi0KLSMgLi4uYW5kIHRoZSBQUk9HX05BTUUgZG9lc24ndCBoYXZlIGEgLm5ldyBpbiBpdC4KLS9QUk9HX05BTUUvcy9QUk9HX05BTUU9JyInYXMubmV3JyInL1BST0dfTkFNRT0nIidhcyciJy8KLS9QUk9HX05BTUUvcy9QUk9HX05BTUU9JyInZ2FzcC5uZXcnIicvUFJPR19OQU1FPSciJ2dhc3AnIicvCi0KLSMgV2hhY2sgb3V0IHJlY3Vyc2l2ZSBtYWtlcywgdGhleSB3b24ndCB3b3JrLgotL15bIAldWyAJXSpzcmNyb290PS8sL15bIAldWyAJXSooY2QgL2QKLQotIyBXb3JrIGFyb3VuZCBxdW90aW5nIHByb2JsZW1zIGJ5IHVzaW5nIG11bHRpcGxlIGVjaG8gY29tbWFuZHMuCi0vJyNkZWZpbmUgR0FTX1ZFUlNJT04gIntWRVJTSU9OfSInL2NcCi0JRWNobyAtbiAnI2RlZmluZSBHQVNfVkVSU0lPTiAiJyA+PiAie299ImNvbmZpZy5uZXdcCi0JRWNobyAtbiAie1ZFUlNJT059IiA+PiAie299ImNvbmZpZy5uZXdcCi0JRWNobyAtbiAnIicgPj4gIntvfSJjb25maWcubmV3Ci0KLSMgQWRkIGEgInN0YW1wcyIgdGFyZ2V0LgotJGFcCi1zdGFtcHMgXFxPcHRpb24tZiBjb25maWctc3RhbXBcCi0KLS9eaW5zdGFsbCBcXE9wdGlvbi1mLywvXiQvY1wKLWluc3RhbGwgXFxPcHRpb24tZiBhbGwgaW5zdGFsbC1vbmx5XAotXAotaW5zdGFsbC1vbmx5IFxcT3B0aW9uLWZcCi0JTmV3Rm9sZGVyUmVjdXJzaXZlICJ7YmluZGlyfSJcCi0JRHVwbGljYXRlIC15IDphcy5uZXcgIntiaW5kaXJ9ImFzXAotCUR1cGxpY2F0ZSAteSA6Z2FzcC5uZXcgIntiaW5kaXJ9Imdhc3BcCi0KLQotIyBXaGFjayBvdXQgY29uZmlnLXJlYnVpbGRpbmcgdGFyZ2V0cywgdGhleSB3b24ndCB3b3JrLgotL15NYWtlZmlsZSBcXE9wdGlvbi1mLywvXiQvZAotL15jb25maWcuc3RhdHVzIFxcT3B0aW9uLWYvLC9eJC9kCi0KLS9eIntvfSJjb25maWcuaCBcXE9wdGlvbi1mL3MvXi8jLwpkaWZmIC0tZ2l0IGEvZ2FzL29iai5oIGIvZ2FzL29iai5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTVlNzVjLi4wMDAwMDAwCi0tLSBhL2dhcy9vYmouaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qIG9iai5oIC0gZGVmaW5lcyB0aGUgb2JqZWN0IGRlcGVuZGVudCBob29rcyBmb3IgYWxsIG9iamVjdAotICAgZm9ybWF0IGJhY2tlbmRzLgotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NSwgOTYsIDk3LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotY2hhciAqb2JqX2RlZmF1bHRfb3V0cHV0X2ZpbGVfbmFtZSBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIG9ial9lbWl0X3JlbG9jYXRpb25zIFBBUkFNUyAoKGNoYXIgKip3aGVyZSwgZml4UyAqIGZpeFAsCi0JCQkJICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpKTsKLXZvaWQgb2JqX2VtaXRfc3RyaW5ncyBQQVJBTVMgKChjaGFyICoqd2hlcmUpKTsKLXZvaWQgb2JqX2VtaXRfc3ltYm9scyBQQVJBTVMgKChjaGFyICoqd2hlcmUsIHN5bWJvbFMgKiBzeW1ib2xzKSk7Ci0jaWZuZGVmIG9ial9yZWFkX2JlZ2luX2hvb2sKLXZvaWQgb2JqX3JlYWRfYmVnaW5faG9vayBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotdm9pZCBvYmpfY3Jhd2xfc3ltYm9sX2NoYWluIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycykpOwotdm9pZCBvYmpfaGVhZGVyX2FwcGVuZCBQQVJBTVMgKChjaGFyICoqd2hlcmUsIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykpOwotI2lmbmRlZiBvYmpfcHJlX3dyaXRlX2hvb2sKLXZvaWQgb2JqX3ByZV93cml0ZV9ob29rIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycykpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBvYmpfc3ltYm9sX25ld19ob29rCi12b2lkIG9ial9zeW1ib2xfbmV3X2hvb2sgUEFSQU1TICgoc3ltYm9sUyAqIHN5bWJvbFApKTsKLSNlbmRpZgotCi12b2lkIG9ial9zeW1ib2xfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqKndoZXJlLCBzeW1ib2xTICogc3ltYm9sUCkpOwotCi1leHRlcm4gY29uc3QgcHNldWRvX3R5cGVTIG9ial9wc2V1ZG9fdGFibGVbXTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0cnVjdCBmb3JtYXRfb3BzIHsKLSAgaW50IGZsYXZvcjsKLSAgdW5zaWduZWQgZGZsX2xlYWRpbmdfdW5kZXJzY29yZSA6IDE7Ci0gIHVuc2lnbmVkIGVtaXRfc2VjdGlvbl9zeW1ib2xzIDogMTsKLSAgdm9pZCAoKmZyb2Jfc3ltYm9sKSBQQVJBTVMgKChzeW1ib2xTICosIGludCAqKSk7Ci0gIHZvaWQgKCpmcm9iX2ZpbGUpIFBBUkFNUyAoKHZvaWQpKTsKLSAgdm9pZCAoKmZyb2JfZmlsZV9hZnRlcl9yZWxvY3MpIFBBUkFNUyAoKHZvaWQpKTsKLSAgYmZkX3ZtYSAoKnNfZ2V0X3NpemUpIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotICB2b2lkICgqc19zZXRfc2l6ZSkgUEFSQU1TICgoc3ltYm9sUyAqLCBiZmRfdm1hKSk7Ci0gIGJmZF92bWEgKCpzX2dldF9hbGlnbikgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0gIHZvaWQgKCpzX3NldF9hbGlnbikgUEFSQU1TICgoc3ltYm9sUyAqLCBiZmRfdm1hKSk7Ci0gIHZvaWQgKCpjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzKSBQQVJBTVMgKChzeW1ib2xTICosIHN5bWJvbFMgKikpOwotICB2b2lkICgqZ2VuZXJhdGVfYXNtX2xpbmVubykgUEFSQU1TICgodm9pZCkpOwotICB2b2lkICgqcHJvY2Vzc19zdGFiKSBQQVJBTVMgKChzZWdULCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCkpOwotICBpbnQgKCpzZWNfc3ltX29rX2Zvcl9yZWxvYykgUEFSQU1TICgoYXNlY3Rpb24gKikpOwotICB2b2lkICgqcG9wX2luc2VydCkgUEFSQU1TICgodm9pZCkpOwotICAvKiBGb3IgY29uZmlndXJhdGlvbnMgdXNpbmcgRUNPRkZfREVCVUdHSU5HLCB0aGlzIGNhbGxiYWNrIGlzIHVzZWQuICAqLwotICB2b2lkICgqZWNvZmZfc2V0X2V4dCkgUEFSQU1TICgoc3ltYm9sUyAqLCBzdHJ1Y3QgZWNvZmZfZXh0ciAqKSk7Ci0KLSAgdm9pZCAoKnJlYWRfYmVnaW5faG9vaykgUEFSQU1TICgodm9pZCkpOwotICB2b2lkICgqc3ltYm9sX25ld19ob29rKSBQQVJBTVMgKChzeW1ib2xTICopKTsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyBlbGZfZm9ybWF0X29wczsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyBlY29mZl9mb3JtYXRfb3BzOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmb3JtYXRfb3BzIGNvZmZfZm9ybWF0X29wczsKLQotI2lmbmRlZiB0aGlzX2Zvcm1hdAotQ09NTU9OIGNvbnN0IHN0cnVjdCBmb3JtYXRfb3BzICp0aGlzX2Zvcm1hdDsKLSNlbmRpZgotI2VuZGlmCi0KLS8qIGVuZCBvZiBvYmouaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL291dHB1dC1maWxlLmMgYi9nYXMvb3V0cHV0LWZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA1YWY0OC4uMDAwMDAwMAotLS0gYS9nYXMvb3V0cHV0LWZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKiBvdXRwdXQtZmlsZS5jIC0gIERlYWwgd2l0aCB0aGUgb3V0cHV0IGZpbGUKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MywgOTIsIDk0LCA5NSwgOTYsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2luY2x1ZGUgIm91dHB1dC1maWxlLmgiCi0KLSNpZmRlZiBCRkRfSEVBREVSUwotI2RlZmluZSBVU0VfQkZECi0jZW5kaWYKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgVVNFX0JGRAotI2lmbmRlZiBUQVJHRVRfTUFDSAotI2RlZmluZSBUQVJHRVRfTUFDSCAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgVVNFX0JGRAotI2luY2x1ZGUgImJmZC5oIgotYmZkICpzdGRvdXRwdXQ7Ci0KLXZvaWQKLW91dHB1dF9maWxlX2NyZWF0ZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaWYgKG5hbWVbMF0gPT0gJy0nICYmIG5hbWVbMV0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiQ2FuJ3Qgb3BlbiBhIGJmZCBvbiBzdGRvdXQgJXMgIiksIG5hbWUpOwotICAgIH0KLSAgZWxzZSBpZiAoIShzdGRvdXRwdXQgPSBiZmRfb3BlbncgKG5hbWUsIFRBUkdFVF9GT1JNQVQpKSkKLSAgICB7Ci0gICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCBjcmVhdGUgJXMiKSwgbmFtZSk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgYmZkX3NldF9mb3JtYXQgKHN0ZG91dHB1dCwgYmZkX29iamVjdCk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBUQVJHRVRfQVJDSCwgVEFSR0VUX01BQ0gpOwotI2VuZGlmCi0gIGlmIChmbGFnX3RyYWRpdGlvbmFsX2Zvcm1hdCkKLSAgICBzdGRvdXRwdXQtPmZsYWdzIHw9IEJGRF9UUkFESVRJT05BTF9GT1JNQVQ7Ci19Ci0KLXZvaWQKLW91dHB1dF9maWxlX2Nsb3NlIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAvKiBDbG9zZSB0aGUgYmZkLiAgKi8KLSAgaWYgKGJmZF9jbG9zZSAoc3Rkb3V0cHV0KSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9wZXJyb3IgKGZpbGVuYW1lKTsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNsb3NlICVzXG4iKSwgZmlsZW5hbWUpOwotICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0jZWxzZQotICAvKiBDbG9zZSB0aGUgYmZkIHdpdGhvdXQgZ2V0dGluZyBiZmQgdG8gd3JpdGUgb3V0IGFueXRoaW5nIGJ5IGl0c2VsZiAqLwotICBpZiAoYmZkX2Nsb3NlX2FsbF9kb25lIChzdGRvdXRwdXQpID09IDApCi0gICAgewotICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3QgY2xvc2UgJXNcbiIpLCBmaWxlbmFtZSk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSNlbmRpZgotICBzdGRvdXRwdXQgPSBOVUxMOwkJLyogVHJ1c3Qgbm9ib2R5ISAqLwotfQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLXZvaWQKLW91dHB1dF9maWxlX2FwcGVuZCAod2hlcmUsIGxlbmd0aCwgZmlsZW5hbWUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBsb25nIGxlbmd0aDsKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGFib3J0ICgpOwotfQotI2VuZGlmCi0KLSNlbHNlCi0KLXN0YXRpYyBGSUxFICpzdGRvdXRwdXQ7Ci0KLXZvaWQKLW91dHB1dF9maWxlX2NyZWF0ZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaWYgKG5hbWVbMF0gPT0gJy0nICYmIG5hbWVbMV0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICBzdGRvdXRwdXQgPSBzdGRvdXQ7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN0ZG91dHB1dCA9IGZvcGVuIChuYW1lLCAid2IiKTsKLQotICAvKiBTb21lIHN5c3RlbXMgZG9uJ3QgZ3JvayAiYiIgaW4gZm9wZW4gbW9kZXMuICAqLwotICBpZiAoc3Rkb3V0cHV0ID09IE5VTEwpCi0gICAgc3Rkb3V0cHV0ID0gZm9wZW4gKG5hbWUsICJ3Iik7Ci0KLSAgaWYgKHN0ZG91dHB1dCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNyZWF0ZSAlcyIpLCBuYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotfQotCi12b2lkCi1vdXRwdXRfZmlsZV9jbG9zZSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBpZiAoRU9GID09IGZjbG9zZSAoc3Rkb3V0cHV0KSkKLSAgICB7Ci0gICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCBjbG9zZSAlcyIpLCBmaWxlbmFtZSk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgc3Rkb3V0cHV0ID0gTlVMTDsJCS8qIFRydXN0IG5vYm9keSEgKi8KLX0KLQotdm9pZAotb3V0cHV0X2ZpbGVfYXBwZW5kICh3aGVyZSwgbGVuZ3RoLCBmaWxlbmFtZSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIGxvbmcgbGVuZ3RoOwotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgZm9yICg7IGxlbmd0aDsgbGVuZ3RoLS0sIHdoZXJlKyspCi0gICAgewotICAgICAgKHZvaWQpIHB1dGMgKCp3aGVyZSwgc3Rkb3V0cHV0KTsKLSAgICAgIGlmIChmZXJyb3IgKHN0ZG91dHB1dCkpCi0JLyogaWYgKCBFT0YgPT0gKHB1dGMoICp3aGVyZSwgc3Rkb3V0cHV0ICkpICkgKi8KLQl7Ci0JICBhc19wZXJyb3IgKF8oIkZhaWxlZCB0byBlbWl0IGFuIG9iamVjdCBieXRlIiksIGZpbGVuYW1lKTsKLQkgIGFzX2ZhdGFsIChfKCJDYW4ndCBjb250aW51ZSIpKTsKLQl9Ci0gICAgfQotfQotCi0jZW5kaWYKLQotLyogZW5kIG9mIG91dHB1dC1maWxlLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9vdXRwdXQtZmlsZS5oIGIvZ2FzL291dHB1dC1maWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MmYxZWYuLjAwMDAwMDAKLS0tIGEvZ2FzL291dHB1dC1maWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgb3V0cHV0LWZpbGUuaAotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi12b2lkIG91dHB1dF9maWxlX2FwcGVuZCBQQVJBTVMgKChjaGFyICp3aGVyZSwgbG9uZyBsZW5ndGgsIGNoYXIgKmZpbGVuYW1lKSk7Ci12b2lkIG91dHB1dF9maWxlX2Nsb3NlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci12b2lkIG91dHB1dF9maWxlX2NyZWF0ZSBQQVJBTVMgKChjaGFyICpuYW1lKSk7Ci0KLS8qIGVuZCBvZiBvdXRwdXQtZmlsZS5oICovCmRpZmYgLS1naXQgYS9nYXMvcG8vTWFrZS1pbiBiL2dhcy9wby9NYWtlLWluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTUyZGIxLi4wMDAwMDAwCi0tLSBhL2dhcy9wby9NYWtlLWluCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHByb2dyYW0gc291cmNlIGRpcmVjdG9yeSBpbiBHTlUgTkxTIHV0aWxpdGllcyBwYWNrYWdlLgotIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+Ci0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi1AU0VUX01BS0VACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSAkKHByZWZpeCkvc2hhcmUvZ2V0dGV4dC9wbwotc3ViZGlyID0gcG8KLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLQotQ0MgPSBAQ0NACi1HRU5DQVQgPSBAR0VOQ0FUQAotR01TR0ZNVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAR01TR0ZNVEAKLU1TR0ZNVCA9IEBNU0dGTVRACi1YR0VUVEVYVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAWEdFVFRFWFRACi1NU0dNRVJHRSA9IFBBVEg9Li4vc3JjOiQkUEFUSCBtc2dtZXJnZQotCi1ERUZTID0gQERFRlNACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi0KLUlOQ0xVREVTID0gLUkuLiAtSSQodG9wX3NyY2RpcikvaW50bAotCi1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotCi1TT1VSQ0VTID0gY2F0LWlkLXRibC5jCi1QT0ZJTEVTID0gQFBPRklMRVNACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLURJU1RGSUxFUyA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbi5pbiBQT1RGSUxFUy5pbiAkKFBBQ0tBR0UpLnBvdCBcCi1zdGFtcC1jYXQtaWQgJChQT0ZJTEVTKSAkKEdNT0ZJTEVTKSAkKFNPVVJDRVMpCi0KLVBPVEZJTEVTID0gXAotCi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLnBvIC5wb3ggLmdtbyAubW8gLm1zZyAuY2F0Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotCi0ucG8ucG94OgotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQkkKE1TR01FUkdFKSAkPCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgLW8gJCoucG94Ci0KLS5wby5tbzoKLQkkKE1TR0ZNVCkgLW8gJEAgJDwKLQotLnBvLmdtbzoKLQlmaWxlPSQoc3JjZGlyKS9gZWNobyAkKiB8IHNlZCAncywuKi8sLCdgLmdtbyBcCi0JICAmJiBybSAtZiAkJGZpbGUgJiYgJChHTVNHRk1UKSAtbyAkJGZpbGUgJDwKLQotLnBvLmNhdDoKLQlzZWQgLWYgLi4vaW50bC9wbzJtc2cuc2VkIDwgJDwgPiAkKi5tc2cgXAotCSAgJiYgcm0gLWYgJEAgJiYgJChHRU5DQVQpICRAICQqLm1zZwotCi0KLWFsbDogYWxsLUBVU0VfTkxTQAotCi1hbGwteWVzOiAkKENBVEFMT0dTKSBATUFJTlRAICQoUEFDS0FHRSkucG90Ci1hbGwtbm86Ci0KLSQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdDogJChQT1RGSUxFUykKLQkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoUEFDS0FHRSkgLS1kaXJlY3Rvcnk9JCh0b3Bfc3JjZGlyKSBcCi0JICAtLWFkZC1jb21tZW50cyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gXAotCSAgLS1maWxlcy1mcm9tPSQoc3JjZGlyKS9QT1RGSUxFUy5pbgotCXJtIC1mICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCW12ICQoUEFDS0FHRSkucG8gJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0KLSQoc3JjZGlyKS9jYXQtaWQtdGJsLmM6IHN0YW1wLWNhdC1pZDsgQDoKLSQoc3JjZGlyKS9zdGFtcC1jYXQtaWQ6ICQoUEFDS0FHRSkucG90Ci0Jcm0gLWYgY2F0LWlkLXRibC50bXAKLQlzZWQgLWYgLi4vaW50bC9wbzJ0Ymwuc2VkICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCBcCi0JCXwgc2VkIC1lICJzL0BQQUNLQUdFIE5BTUVALyQoUEFDS0FHRSkvIiA+IGNhdC1pZC10YmwudG1wCi0JaWYgY21wIC1zIGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IHRoZW4gXAotCSAgcm0gY2F0LWlkLXRibC50bXA7IFwKLQllbHNlIFwKLQkgIGVjaG8gY2F0LWlkLXRibC5jIGNoYW5nZWQ7IFwKLQkgIHJtIC1mICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQkgIG12IGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQlmaQotCWNkICQoc3JjZGlyKSAmJiBybSAtZiBzdGFtcC1jYXQtaWQgJiYgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1jYXQtaWQKLQotCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6Ci1pbnN0YWxsLWluZm86Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKLWluc3RhbGwtZGF0YS1ubzogYWxsCi1pbnN0YWxsLWRhdGEteWVzOiBhbGwKLQlpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgJChNS0lOU1RBTExESVJTKSAkKGRhdGFkaXIpOyBcCi0JZWxzZSBcCi0JICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChkYXRhZGlyKTsgXAotCWZpCi0JQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBjYXNlICIkJGNhdCIgaW4gXAotCSAgICAqLmdtbykgZGVzdGRpcj0kKGdudWxvY2FsZWRpcik7OyBcCi0JICAgICopICAgICBkZXN0ZGlyPSQobG9jYWxlZGlyKTs7IFwKLQkgIGVzYWM7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgZGlyPSQkZGVzdGRpci8kJGxhbmcvTENfTUVTU0FHRVM7IFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJCRkaXI7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJCRkaXI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0OyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQgYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBlbHNlIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQubTsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdC5tICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdC5tIGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICBlbHNlIFwKLQkgICAgaWYgdGVzdCAtciAkKHNyY2RpcikvJCRjYXQubSA7IHRoZW4gXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQubSBcCi0JCSQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgICAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlkb25lCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL01ha2VmaWxlLmluLmluIFwKLQkJCSAgJChnZXR0ZXh0c3JjZGlyKS9NYWtlZmlsZS5pbi5pbjsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi1pbnN0YWxsY2hlY2s6Ci0KLXVuaW5zdGFsbDoKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCWRvbmUKLQlybSAtZiAkKGdldHRleHRzcmNkaXIpL3BvLU1ha2VmaWxlLmluLmluCi0KLWNoZWNrOiBhbGwKLQotY2F0LWlkLXRibC5vOiAuLi9pbnRsL2xpYmdldHRleHQuaAotCi1kdmkgaW5mbyB0YWdzIFRBR1MgSUQ6Ci0KLW1vc3RseWNsZWFuOgotCXJtIC1mIGNvcmUgY29yZS4qICoucG94ICQoUEFDS0FHRSkucG8gKi5vbGQucG8gY2F0LWlkLXRibC50bXAKLQlybSAtZnIgKi5vCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgTWFrZWZpbGUuaW4gUE9URklMRVMgKi5tbyAqLm1zZyAqLmNhdCAqLmNhdC5tCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCXJtIC1mICQoR01PRklMRVMpCi0KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IHVwZGF0ZS1wbyAkKERJU1RGSUxFUykKLQlkaXN0cz0iJChESVNURklMRVMpIjsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIGxuICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKLQlkb25lCi0KLXVwZGF0ZS1wbzogTWFrZWZpbGUKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JUEFUSD1gcHdkYC8uLi9zcmM6JCRQQVRIOyBcCi0JY2QgJChzcmNkaXIpOyBcCi0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgbXYgJCRsYW5nLnBvICQkbGFuZy5vbGQucG87IFwKLQkgIGVjaG8gIiQkbGFuZzoiOyBcCi0JICBpZiAkKE1TR01FUkdFKSAkJGxhbmcub2xkLnBvICQoUEFDS0FHRSkucG90IC1vICQkbGFuZy5wbzsgdGhlbiBcCi0JICAgIHJtIC1mICQkbGFuZy5vbGQucG87IFwKLQkgIGVsc2UgXAotCSAgICBlY2hvICJtc2dtZXJnZSBmb3IgJCRjYXQgZmFpbGVkISI7IFwKLQkgICAgcm0gLWYgJCRsYW5nLnBvOyBcCi0JICAgIG12ICQkbGFuZy5vbGQucG8gJCRsYW5nLnBvOyBcCi0JICBmaTsgXAotCWRvbmUKLQotUE9URklMRVM6IFBPVEZJTEVTLmluCi0JKCBpZiB0ZXN0ICd4JChzcmNkaXIpJyAhPSAneC4nOyB0aGVuIFwKLQkgICAgcG9zcmNwcmVmaXg9JyQodG9wX3NyY2RpcikvJzsgXAotCSAgZWxzZSBcCi0JICAgIHBvc3JjcHJlZml4PSIuLi8iOyBcCi0JICBmaTsgXAotCSAgcm0gLWYgJEAtdCAkQCBcCi0JICAgICYmIChzZWQgLWUgJy9eIy9kJyAtZSAnL15bIAldKiQkL2QnIFwKLQkJICAgIC1lICJzQC4qQAkkJHBvc3JjcHJlZml4JiBcXFxcQCIgPCAkKHNyY2RpcikvJEAuaW4gXAotCQl8IHNlZCAtZSAnJCRzL1xcJCQvLycpID4gJEAtdCBcCi0JICAgICYmIGNobW9kIGEtdyAkQC10IFwKLQkgICAgJiYgbXYgJEAtdCAkQCApCi0KLVBPVEZJTEVTLmluOiBATUFJTlRAIC4uL01ha2VmaWxlCi0JY2QgLi4gJiYgJChNQUtFKSBwby9QT1RGSUxFUy5pbgotCi1NYWtlZmlsZTogTWFrZS1pbiAuLi9jb25maWcuc3RhdHVzIFBPVEZJTEVTCi0JY2QgLi4gXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS9NYWtlZmlsZS5pbjokKHN1YmRpcikvTWFrZS1pbiBcCi0JICAgICBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2dhcy9wby9QT1RGSUxFUy5pbiBiL2dhcy9wby9QT1RGSUxFUy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyM2I3YS4uMDAwMDAwMAotLS0gYS9nYXMvcG8vUE9URklMRVMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotY29uZmlnL3RjLWhwcGEuYwotY29uZmlnL3RjLW0zMnIuYwotY29uZmlnL2FvdXRfZ251LmgKLWNvbmZpZy9hdG9mLWllZWUuYwotY29uZmlnL2F0b2YtdGFob2UuYwotY29uZmlnL2F0b2YtdmF4LmMKLWNvbmZpZy9lLWkzODZjb2ZmLmMKLWNvbmZpZy9lLWkzODZlbGYuYwotY29uZmlnL2UtbWlwc2Vjb2ZmLmMKLWNvbmZpZy9lLW1pcHNlbGYuYwotY29uZmlnL2l0YmwtbWlwcy5oCi1jb25maWcvbTY4ay1wYXJzZS5oCi1jb25maWcvbTg4ay1vcGNvZGUuaAotY29uZmlnL29iai1hb3V0LmMKLWNvbmZpZy9vYmotYW91dC5oCi1jb25maWcvb2JqLWJvdXQuYwotY29uZmlnL29iai1ib3V0LmgKLWNvbmZpZy9vYmotY29mZi5jCi1jb25maWcvb2JqLWNvZmYuaAotY29uZmlnL29iai1lY29mZi5jCi1jb25maWcvb2JqLWVjb2ZmLmgKLWNvbmZpZy9vYmotZWxmLmMKLWNvbmZpZy9vYmotZWxmLmgKLWNvbmZpZy9vYmotZXZheC5jCi1jb25maWcvb2JqLWV2YXguaAotY29uZmlnL29iai1nZW5lcmljLmMKLWNvbmZpZy9vYmotZ2VuZXJpYy5oCi1jb25maWcvb2JqLWhwMzAwLmMKLWNvbmZpZy9vYmotaHAzMDAuaAotY29uZmlnL29iai1pZWVlLmMKLWNvbmZpZy9vYmotaWVlZS5oCi1jb25maWcvb2JqLW11bHRpLmMKLWNvbmZpZy9vYmotbXVsdGkuaAotY29uZmlnL29iai1zb20uYwotY29uZmlnL29iai1zb20uaAotY29uZmlnL29iai12bXMuYwotY29uZmlnL29iai12bXMuaAotY29uZmlnL3RjLWEyOWsuYwotY29uZmlnL3RjLWEyOWsuaAotY29uZmlnL3RjLWFscGhhLmMKLWNvbmZpZy90Yy1hbHBoYS5oCi1jb25maWcvdGMtYXJjLmMKLWNvbmZpZy90Yy1hcmMuaAotY29uZmlnL3RjLWFybS5jCi1jb25maWcvdGMtYXJtLmgKLWNvbmZpZy90Yy1kMTB2LmMKLWNvbmZpZy90Yy1kMTB2LmgKLWNvbmZpZy90Yy1kMzB2LmMKLWNvbmZpZy90Yy1kMzB2LmgKLWNvbmZpZy90Yy1tY29yZS5jCi1jb25maWcvdGMtZnIzMC5jCi1jb25maWcvdGMtZnIzMC5oCi1jb25maWcvdGMtZ2VuZXJpYy5jCi1jb25maWcvdGMtZ2VuZXJpYy5oCi1jb25maWcvdGMtaDgzMDAuYwotY29uZmlnL3RjLWg4MzAwLmgKLWNvbmZpZy90Yy1oODUwMC5jCi1jb25maWcvdGMtaDg1MDAuaAotY29uZmlnL3RjLW1pcHMuYwotY29uZmlnL3RjLWhwcGEuaAotY29uZmlnL3RjLWkzODYuYwotY29uZmlnL3RjLWkzODYuaAotY29uZmlnL3RjLWk4NjAuYwotY29uZmlnL3RjLWk4NjAuaAotY29uZmlnL3RjLWk5NjAuYwotY29uZmlnL3RjLWk5NjAuaAotY29uZmlnL3RjLW1uMTAzMDAuYwotY29uZmlnL3RjLW0zMnIuaAotY29uZmlnL3RjLW02ODg1MS5oCi1jb25maWcvdGMtbTY4ay5jCi1jb25maWcvdGMtbTY4ay5oCi1jb25maWcvdGMtbTg4ay5jCi1jb25maWcvdGMtbTg4ay5oCi1jb25maWcvdGMtbWNvcmUuaAotY29uZmlnL3RjLW1pcHMuaAotY29uZmlnL3RjLW1uMTAyMDAuYwotY29uZmlnL3RjLW1uMTAyMDAuaAotY29uZmlnL3RjLW1uMTAzMDAuaAotY29uZmlnL3RjLW5zMzJrLmMKLWNvbmZpZy90Yy1uczMyay5oCi1jb25maWcvdGMtcHBjLmMKLWNvbmZpZy90Yy1wcGMuaAotY29uZmlnL3RjLXNoLmMKLWNvbmZpZy90Yy1zaC5oCi1jb25maWcvdGMtc3BhcmMuYwotY29uZmlnL3RjLXNwYXJjLmgKLWNvbmZpZy90Yy10YWhvZS5jCi1jb25maWcvdGMtdGFob2UuaAotY29uZmlnL3RjLXRpYzMwLmMKLWNvbmZpZy90Yy10aWMzMC5oCi1jb25maWcvdGMtdGljODAuYwotY29uZmlnL3RjLXRpYzgwLmgKLWNvbmZpZy90Yy12ODUwLmMKLWNvbmZpZy90Yy12ODUwLmgKLWNvbmZpZy90Yy12YXguYwotY29uZmlnL3RjLXZheC5oCi1jb25maWcvdGMtdzY1LmMKLWNvbmZpZy90Yy13NjUuaAotY29uZmlnL3RjLXo4ay5jCi1jb25maWcvdGMtejhrLmgKLWNvbmZpZy90ZS0zODZic2QuaAotY29uZmlnL3RlLWF1eC5oCi1jb25maWcvdGUtZGVsdDg4LmgKLWNvbmZpZy90ZS1kZWx0YS5oCi1jb25maWcvdGUtZHB4Mi5oCi1jb25maWcvdGUtZHluaXguaAotY29uZmlnL3RlLWVwb2MtcGUuaAotY29uZmlnL3RlLWdlbmVyaWMuaAotY29uZmlnL3RlLWdvMzIuaAotY29uZmlnL3RlLWhwMzAwLmgKLWNvbmZpZy90ZS1ocHBhLmgKLWNvbmZpZy90ZS1pMzg2YWl4LmgKLWNvbmZpZy90ZS1pYzk2MC5oCi1jb25maWcvdGUtbGludXguaAotY29uZmlnL3RlLWxuZXdzLmgKLWNvbmZpZy90ZS1seW54LmgKLWNvbmZpZy90ZS1tYWNoLmgKLWNvbmZpZy90ZS1tYWNvcy5oCi1jb25maWcvdGUtbXVsdGkuaAotY29uZmlnL3RlLW5ic2QuaAotY29uZmlnL3RlLW5ic2Q1MzIuaAotY29uZmlnL3RlLXBjNTMybWFjaC5oCi1jb25maWcvdGUtcGUuaAotY29uZmlnL3RlLXBwY253LmgKLWNvbmZpZy90ZS1wc29zLmgKLWNvbmZpZy90ZS1yaXNjaXguaAotY29uZmlnL3RlLXNwYXJjYW91dC5oCi1jb25maWcvdGUtc3VuMy5oCi1jb25maWcvdGUtc3ZyNC5oCi1jb25maWcvdGUtc3lzdjMyLmgKLWNvbmZpZy92YXgtaW5zdC5oCi1jb25maWcvdm1zLWEtY29uZi5oCi1jb25maWcvdm1zLWNvbmYuaAotYXBwLmMKLWFzLmMKLWFzLmgKLWFzaW50bC5oCi1hdG9mLWdlbmVyaWMuYwotYmlnbnVtLWNvcHkuYwotYmlnbnVtLmgKLWJpdF9maXguaAotY2dlbi5jCi1jZ2VuLmgKLWNvbmQuYwotZGVidWcuYwotZGVwZW5kLmMKLWVjb2ZmLmMKLWVjb2ZmLmgKLWVob3B0LmMKLWVtdWwtdGFyZ2V0LmgKLWVtdWwuaAotZXhwci5jCi1leHByLmgKLWZsb251bS1jb3B5LmMKLWZsb251bS1rb25zdC5jCi1mbG9udW0tbXVsdC5jCi1mbG9udW0uaAotZnJhZ3MuYwotZnJhZ3MuaAotZ2FzcC5jCi1oYXNoLmMKLWhhc2guaAotaW5wdXQtZmlsZS5jCi1pbnB1dC1maWxlLmgKLWlucHV0LXNjcnViLmMKLWl0Ymwtb3BzLmMKLWl0Ymwtb3BzLmgKLWxpc3RpbmcuYwotbGlzdGluZy5oCi1saXRlcmFsLmMKLW1hY3JvLmMKLW1hY3JvLmgKLW1lc3NhZ2VzLmMKLW9iai5oCi1vdXRwdXQtZmlsZS5jCi1vdXRwdXQtZmlsZS5oCi1yZWFkLmMKLXJlYWQuaAotc2IuYwotc2IuaAotc3RhYnMuYwotc3RydWMtc3ltYm9sLmgKLXN1YnNlZ3MuYwotc3Vic2Vncy5oCi1zeW1ib2xzLmMKLXN5bWJvbHMuaAotdGMuaAotd3JpdGUuYwotd3JpdGUuaAotdGVzdHN1aXRlL2dhcy9hbGwvaXRibC10ZXN0LmMKLXRlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFncy5jCi10ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEuYwotdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLmMKZGlmZiAtLWdpdCBhL2dhcy9wby9nYXMucG90IGIvZ2FzL3BvL2dhcy5wb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOWFiYmEuLjAwMDAwMDAKLS0tIGEvZ2FzL3BvL2dhcy5wb3QKKysrIC9kZXYvbnVsbApAQCAtMSwzODUzICswLDAgQEAKLSMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KLSMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgotIwotIywgZnV6enkKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAxOTk5LTA0LTE4IDE4OjMxLTA0MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKLSJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgotCi0jOiBhcHAuYzo0MzUgYXBwLmM6NDQ5Ci1tc2dpZCAiZW5kIG9mIGZpbGUgaW4gY29tbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBhcHAuYzo1MjgKLW1zZ2lkICJlbmQgb2YgZmlsZSBpbiBzdHJpbmc6IGluc2VydGVkICdcIiciCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6NTk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gZXNjYXBlICdcXCVjJyBpbiBzdHJpbmc6IElnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6NjAzCi1tc2dpZCAiRW5kIG9mIGZpbGUgaW4gc3RyaW5nOiAnXCInIGluc2VydGVkIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjcyMwotbXNnaWQgImVuZCBvZiBmaWxlIG5vdCBhdCBlbmQgb2YgYSBsaW5lOyBuZXdsaW5lIGluc2VydGVkIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjg2OQotbXNnaWQgImVuZCBvZiBmaWxlIGluIG11bHRpbGluZSBjb21tZW50IgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjkxOAotbXNnaWQgImVuZCBvZiBmaWxlIGFmdGVyIGEgb25lLWNoYXJhY3RlciBxdW90ZTsgXFwwIGluc2VydGVkIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjkyNgotbXNnaWQgImVuZCBvZiBmaWxlIGluIGVzY2FwZSBjaGFyYWN0ZXIiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6OTM4Ci1tc2dpZCAiTWlzc2luZyBjbG9zZSBxdW90ZTogKGFzc3VtZWQpIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjk5NyBhcHAuYzoxMDUxIGFwcC5jOjExMjAKLW1zZ2lkICJlbmQgb2YgZmlsZSBpbiBjb21tZW50OyBuZXdsaW5lIGluc2VydGVkIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjEwNjEKLW1zZ2lkICJFT0YgaW4gQ29tbWVudDogTmV3bGluZSBpbnNlcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJHTlUgYXNzZW1ibGVyIHZlcnNpb24gJXMgKCVzKSB1c2luZyBCRkQgdmVyc2lvbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjEyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJHTlUgYXNzZW1ibGVyIHZlcnNpb24gJXMgKCVzKSIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjEzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2FnZTogJXMgW29wdGlvbi4uLl0gW2FzbWZpbGUuLi5dXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoxMzUKLW1zZ2lkICIiCi0iT3B0aW9uczpcbiIKLSIgIC1hW3N1Yi1vcHRpb24uLi5dXHR0dXJuIG9uIGxpc3RpbmdzXG4iCi0iICAgIFN1Yi1vcHRpb25zIFtkZWZhdWx0IGhsc106XG4iCi0iICAgIGMgICBvbWl0IGZhbHNlIGNvbmRpdGlvbmFsc1xuIgotIiAgICBkICAgb21pdCBkZWJ1Z2dpbmcgZGlyZWN0aXZlc1xuIgotIiAgICBoICAgaW5jbHVkZSBoaWdoLWxldmVsIHNvdXJjZVxuIgotIiAgICBsICAgaW5jbHVkZSBhc3NlbWJseVxuIgotIiAgICBtICAgaW5jbHVkZSBtYWNybyBleHBhbnNpb25zXG4iCi0iICAgIG4gICBvbWl0IGZvcm1zIHByb2Nlc3NpbmdcbiIKLSIgICAgcyAgIGluY2x1ZGUgc3ltYm9sc1xuIgotIiAgICA9ZmlsZSBzZXQgbGlzdGluZyBmaWxlIG5hbWUgKG11c3QgYmUgbGFzdCBzdWItb3B0aW9uKVxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MTQ4Ci1tc2dpZCAiIgotIiAgLURcdFx0ICAgICAgICAgIHByb2R1Y2UgYXNzZW1ibGVyIGRlYnVnZ2luZyBtZXNzYWdlc1xuIgotIiAgLS1kZWZzeW0gU1lNPVZBTCAgICAgICAgZGVmaW5lIHN5bWJvbCBTWU0gdG8gZ2l2ZW4gdmFsdWVcbiIKLSIgIC1mXHRcdCAgICAgICAgICBza2lwIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQgcHJlcHJvY2Vzc2luZ1xuIgotIiAgLS1nc3RhYnNcdCAgICAgICAgICBnZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiIKLSIgIC0taGVscFx0XHQgIHNob3cgdGhpcyBtZXNzYWdlIGFuZCBleGl0XG4iCi0iICAtSSBESVJcdFx0ICBhZGQgRElSIHRvIHNlYXJjaCBsaXN0IGZvciAuaW5jbHVkZSBkaXJlY3RpdmVzXG4iCi0iICAtSlx0XHQgICAgICAgICAgZG9uJ3Qgd2FybiBhYm91dCBzaWduZWQgb3ZlcmZsb3dcbiIKLSIgIC1LXHRcdCAgICAgICAgICB3YXJuIHdoZW4gZGlmZmVyZW5jZXMgYWx0ZXJlZCBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzXG4iCi0iICAtTCwtLWtlZXAtbG9jYWxzICAgICAgICBrZWVwIGxvY2FsIHN5bWJvbHMgKGUuZy4gc3RhcnRpbmcgd2l0aCBgTCcpXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoxNTkKLW1zZ2lkICIiCi0iICAtTSwtLW1yaVx0ICAgICAgICAgIGFzc2VtYmxlIGluIE1SSSBjb21wYXRpYmlsaXR5IG1vZGVcbiIKLSIgIC0tTUQgRklMRVx0ICAgICAgICAgIHdyaXRlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gaW4gRklMRSAoZGVmYXVsdCBub25lKVxuIgotIiAgLW5vY3BwXHRcdCAgaWdub3JlZFxuIgotIiAgLW8gT0JKRklMRVx0ICAgICAgICAgIG5hbWUgdGhlIG9iamVjdC1maWxlIG91dHB1dCBPQkpGSUxFIChkZWZhdWx0IGEub3V0KVxuIgotIiAgLVJcdFx0ICAgICAgICAgIGZvbGQgZGF0YSBzZWN0aW9uIGludG8gdGV4dCBzZWN0aW9uXG4iCi0iICAtLXN0YXRpc3RpY3NcdCAgICAgICAgICBwcmludCB2YXJpb3VzIG1lYXN1cmVkIHN0YXRpc3RpY3MgZnJvbSBleGVjdXRpb25cbiIKLSIgIC0tc3RyaXAtbG9jYWwtYWJzb2x1dGUgIHN0cmlwIGxvY2FsIGFic29sdXRlIHN5bWJvbHNcbiIKLSIgIC0tdHJhZGl0aW9uYWwtZm9ybWF0XHQgIFVzZSBzYW1lIGZvcm1hdCBhcyBuYXRpdmUgYXNzZW1ibGVyIHdoZW4gcG9zc2libGVcbiIKLSIgIC0tdmVyc2lvblx0XHQgIHByaW50IGFzc2VtYmxlciB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdFxuIgotIiAgLVdcdFx0XHQgIHN1cHByZXNzIHdhcm5pbmdzXG4iCi0iICAtLWl0YmwgSU5TVFRCTFx0ICBleHRlbmQgaW5zdHJ1Y3Rpb24gc2V0IHRvIGluY2x1ZGUgaW5zdHJ1Y3Rpb25zXG4iCi0iXHRcdFx0ICBtYXRjaGluZyB0aGUgc3BlY2lmaWNhdGlvbnMgZGVmaW5lZCBpbiBmaWxlIElOU1RUQkxcbiIKLSIgIC13XHRcdFx0ICBpZ25vcmVkXG4iCi0iICAtWFx0XHRcdCAgaWdub3JlZFxuIgotIiAgLVpcdFx0XHQgIGdlbmVyYXRlIG9iamVjdCBmaWxlIGV2ZW4gYWZ0ZXIgZXJyb3JzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoxNzYKLW1zZ2lkICIiCi0iICAtLWxpc3RpbmctbGhzLXdpZHRoXHQgIHNldCB0aGUgd2lkdGggaW4gd29yZHMgb2YgdGhlIG91dHB1dCBkYXRhIGNvbHVtbiAiCi0ib2ZcbiIKLSJcdFx0XHQgIHRoZSBsaXN0aW5nXG4iCi0iICAtLWxpc3RpbmctbGhzLXdpZHRoMlx0ICBzZXQgdGhlIHdpZHRoIGluIHdvcmRzIG9mIHRoZSBjb250aW51YXRpb24gbGluZXNcbiIKLSJcdFx0XHQgIG9mIHRoZSBvdXRwdXQgZGF0YSBjb2x1bW47IGlnbm9yZWQgaWYgc21hbGxlciB0aGFuXG4iCi0iXHRcdFx0ICB0aGUgd2lkdGggb2YgdGhlIGZpcnN0IGxpbmVcbiIKLSIgIC0tbGlzdGluZy1yaHMtd2lkdGhcdCAgc2V0IHRoZSBtYXggd2lkdGggaW4gY2hhcmFjdGVycyBvZiB0aGUgbGluZXMgZnJvbVxuIgotIlx0XHRcdCAgdGhlIHNvdXJjZSBmaWxlXG4iCi0iICAtLWxpc3RpbmctY29udC1saW5lc1x0ICBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRpbnVhdGlvbiBsaW5lcyB1c2VkXG4iCi0iXHRcdFx0ICBmb3IgdGhlIG91dHB1dCBkYXRhIGNvbHVtbiBvZiB0aGUgbGlzdGluZ1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MTg5IGdhc3AuYzozNTgzCi1tc2dpZCAiIgotIlxuIgotIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MjI2Ci1tc2dpZCAibWlzc2luZyBlbXVsYXRpb24gbW9kZSBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MjQxCi0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXplZCBlbXVsYXRpb24gbmFtZSBgJXMnIgotbXNnc3RyICIiCi0KLSMuIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4KLSM6IGFzLmM6NDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkdOVSBhc3NlbWJsZXIgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjQ2MAotbXNnaWQgIkNvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDYxIGdhc3AuYzozNjc3Ci1tc2dpZCAiIgotIlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcbiIKLSJ0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVGhpcyBhc3NlbWJsZXIgd2FzIGNvbmZpZ3VyZWQgZm9yIGEgdGFyZ2V0IG9mIGAlcycuXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0NzEKLW1zZ2lkICJtdWx0aXBsZSBlbXVsYXRpb24gbmFtZXMgc3BlY2lmaWVkIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDczCi1tc2dpZCAiZW11bGF0aW9ucyBub3QgaGFuZGxlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYWxpYXMgPSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm9uaWNhbCA9ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY3B1LXR5cGUgPSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDgyCi0jLCBjLWZvcm1hdAotbXNnaWQgImZvcm1hdCA9ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmZkLXRhcmdldCA9ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0OTgKLW1zZ2lkICJiYWQgZGVmc3ltOyBmb3JtYXQgaXMgLS1kZWZzeW0gbmFtZT12YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjUxOAotbXNnaWQgIk5vIGZpbGUgbmFtZSBmb2xsb3dpbmcgLXQgb3B0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo1MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRmFpbGVkIHRvIHJlYWQgaW5zdHJ1Y3Rpb24gdGFibGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjYzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGxpc3Rpbmcgb3B0aW9uIGAlYyciCi1tc2dzdHIgIiIKLQotIzogYXMuYzo4NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHRvdGFsIHRpbWUgaW4gYXNzZW1ibHk6ICVsZC4lMDZsZFxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6ODU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkYXRhIHNpemUgJWxkXG4iCi1tc2dzdHIgIiIKLQotIy4KLSMuICogV2UgaGF2ZSBhIEdST1NTIGludGVybmFsIGVycm9yLgotIy4gKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCi0jLgotIzogYXRvZi1nZW5lcmljLmM6NDM4IGNvbmZpZy90Yy1hMjlrLmM6NTQ0IGNvbmZpZy90Yy1pODYwLmM6MzM1Ci0jOiBjb25maWcvdGMtaTg2MC5jOjcwOCBjb25maWcvdGMtbTY4ay5jOjMwNDUgY29uZmlnL3RjLW02OGsuYzozMDc0Ci0jOiBjb25maWcvdGMtc3BhcmMuYzoyMTU3Ci1tc2dpZCAiZmFpbGVkIHNhbml0eSBjaGVjay4iCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjc1Ci1tc2dpZCAiaW52YWxpZCBpZGVudGlmaWVyIGZvciBcIi5pZmRlZlwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzoxMjgKLW1zZ2lkICJub24tY29uc3RhbnQgZXhwcmVzc2lvbiBpbiBcIi5pZlwiIHN0YXRlbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6MjI0Ci1tc2dpZCAiYmFkIGZvcm1hdCBmb3IgaWZjIG9yIGlmbmMiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjI1NwotbXNnaWQgIlwiLmVuZGlmXCIgd2l0aG91dCBcIi5pZlwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzoyODcKLW1zZ2lkICIuZWxzZSB3aXRob3V0IG1hdGNoaW5nIC5pZiAtIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjI5MgotbXNnaWQgImR1cGxpY2F0ZSBcImVsc2VcIiAtIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjI5NQotbXNnaWQgImhlcmUgaXMgdGhlIHByZXZpb3VzIFwiZWxzZVwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzoyOTgKLW1zZ2lkICJoZXJlIGlzIHRoZSBwcmV2aW91cyBcImlmXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjM0MwotbXNnaWQgIi5pZmVxcyBzeW50YXggZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjQzMAotbXNnaWQgImVuZCBvZiBtYWNybyBpbnNpZGUgY29uZGl0aW9uYWwiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjQzMgotbXNnaWQgImVuZCBvZiBmaWxlIGluc2lkZSBjb25kaXRpb25hbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6NDM1Ci1tc2dpZCAiaGVyZSBpcyB0aGUgc3RhcnQgb2YgdGhlIHVudGVybWluYXRlZCBjb25kaXRpb25hbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6NDM5Ci1tc2dpZCAiaGVyZSBpcyB0aGUgXCJlbHNlXCIgb2YgdGhlIHVudGVybWluYXRlZCBjb25kaXRpb25hbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWFvdXQuYzoxNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXR0ZW1wdCB0byBwdXQgYSBjb21tb24gc3ltYm9sIGludG8gc2V0ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjE2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJBdHRlbXB0IHRvIHB1dCBhbiB1bmRlZmluZWQgc3ltYm9sIGludG8gc2V0ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjE5MiBjb25maWcvb2JqLWVsZi5jOjE1MjcgZWNvZmYuYzozNjYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCBgJXMnIGNhbiBub3QgYmUgYm90aCB3ZWFrIGFuZCBjb21tb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6MjUwIGNvbmZpZy9vYmotY29mZi5jOjE3NjYKLW1zZ2lkICJ1bnJlc29sdmVkIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6MjUyIGNvbmZpZy9vYmotY29mZi5jOjE3NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIHJlbG9jYXRpb246IHN5bWJvbCBgJXMnIG5vdCBpbiBzeW1ib2wgdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6MzM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiYWQgdHlwZSBmb3Igd2VhayBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6NDUzIGNvbmZpZy9vYmotY29mZi5jOjI3MDAgd3JpdGUuYzoxNzk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBnbG9iYWwgc3ltYm9scyBub3Qgc3VwcG9ydGVkIGluIGNvbW1vbiBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWFvdXQuYzo1MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTG9jYWwgc3ltYm9sICVzIG5ldmVyIGRlZmluZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjYwOAotbXNnaWQgInN1YnNlZ21lbnQgaW5kZXggdG9vIGhpZ2giCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1ib3V0LmM6MzEyIGNvbmZpZy9vYmotdm1zLmM6NTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxvY2FsIHN5bWJvbCAlcyBuZXZlciBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjEzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnNlcnRpbmcgXCIlc1wiIGludG8gc3RydWN0dXJlIHRhYmxlIGZhaWxlZDogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NDUyIGNvbmZpZy9vYmotY29mZi5jOjIxMTMKLW1zZ2lkICIubG4gcHNldWRvLW9wIGluc2lkZSAuZGVmLy5lbmRlZjogaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NTEyIGNvbmZpZy9vYmotY29mZi5jOjIxNzAKLW1zZ2lkICIuZGVmIHBzZXVkby1vcCB1c2VkIGluc2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NTU4IGNvbmZpZy9vYmotY29mZi5jOjIyMjMKLW1zZ2lkICIuZW5kZWYgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NTkyCi0jLCBjLWZvcm1hdAotbXNnaWQgImAlcycgc3ltYm9sIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjYzNCBjb25maWcvb2JqLWNvZmYuYzoyMjk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgc3RvcmFnZSBjbGFzcyAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo3MzYgY29uZmlnL29iai1jb2ZmLmM6MjQwNQotbXNnaWQgIi5kaW0gcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NzU2IGNvbmZpZy9vYmotY29mZi5jOjI0MjUKLW1zZ2lkICJiYWRseSBmb3JtZWQgLmRpbSBkaXJlY3RpdmUgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo4MDcgY29uZmlnL29iai1jb2ZmLmM6MjQ4OAotbXNnaWQgIi5zaXplIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6ODIzIGNvbmZpZy9vYmotY29mZi5jOjI1MDQKLW1zZ2lkICIuc2NsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6ODQxIGNvbmZpZy9vYmotY29mZi5jOjI1MjIKLW1zZ2lkICIudGFnIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6ODYwIGNvbmZpZy9vYmotY29mZi5jOjI1NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGFnIG5vdCBmb3VuZCBmb3IgLnRhZyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo4NzUgY29uZmlnL29iai1jb2ZmLmM6MjU1NQotbXNnaWQgIi50eXBlIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6ODk3IGNvbmZpZy9vYmotY29mZi5jOjI1NzcKLW1zZ2lkICIudmFsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MTAyNiBjb25maWcvb2JqLWNvZmYuYzoyNzczCi1tc2dpZCAibWlzbWF0Y2hlZCAuZWIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MTA0NCBjb25maWcvb2JqLWNvZmYuYzoyODEzCi1tc2dpZCAiQ19FRkNOIHN5bWJvbCBvdXQgb2Ygc2NvcGUiCi1tc2dzdHIgIiIKLQotIy4gU1RZUF9JTkZPCi0jLiBTVFlQX0xJQgotIy4gU1RZUF9PVkVSCi0jOiBjb25maWcvb2JqLWNvZmYuYzoxMjUzCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydGVkIHNlY3Rpb24gYXR0cmlidXRlICclYyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MTI1OCBjb25maWcvb2JqLWNvZmYuYzozNTE2IGNvbmZpZy90Yy1wcGMuYzozNzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gc2VjdGlvbiBhdHRyaWJ1dGUgJyVjJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzoxMjgwIGNvbmZpZy90Yy1wcGMuYzozNzk2IHJlYWQuYzoyNDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHNldHRpbmcgZmxhZ3MgZm9yIFwiJXNcIjogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MTM5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIweCVseDogXCIlc1wiIHR5cGUgPSAlbGQsIGNsYXNzID0gJWQsIHNlZ21lbnQgPSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjE1OTMgY29uZmlnL29iai1pZWVlLmM6NjkKLW1zZ2lkICJPdXQgb2Ygc3RlcFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjIwMjgKLW1zZ2lkICJiZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQgZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjIyNTUKLW1zZ2lkICJgLmJmJyBzeW1ib2wgd2l0aG91dCBwcmVjZWRpbmcgZnVuY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzozMjE2IGNvbmZpZy9vYmotaWVlZS5jOjUyMiBvdXRwdXQtZmlsZS5jOjUyCi0jOiBvdXRwdXQtZmlsZS5jOjExOQotIywgYy1mb3JtYXQKLW1zZ2lkICJGQVRBTDogQ2FuJ3QgY3JlYXRlICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjMzOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgY2xvc2UgJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjM0MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVG9vIG1hbnkgbmV3IHNlY3Rpb25zOyBjYW4ndCBhZGQgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjM4MzQgY29uZmlnL3RjLW04OGsuYzoxMjYwIGNvbmZpZy90Yy1zcGFyYy5jOjMwMTUKLW1zZ2lkICJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjM4NDAgcmVhZC5jOjE5MzQKLW1zZ2lkICJNaXNzaW5nIHNpemUgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzozODQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxjb21tIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6Mzg3NCByZWFkLmM6MjE2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjM5NjggY29uZmlnL3RjLWk5NjAuYzozMjAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIk5vICdiYWwnIGVudHJ5IHBvaW50IGZvciBsZWFmcHJvYyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo0MDQ3IHdyaXRlLmM6MjUwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJOZWdhdGl2ZSBvZiBub24tYWJzb2x1dGUgc3ltYm9sICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjQwNjggd3JpdGUuYzoyNTE1Ci1tc2dpZCAiY2FsbGogdG8gZGlmZmVyZW5jZSBvZiAyIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NDExNAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBlbWl0IHJlbG9jIHstICVzLXNlZyBzeW1ib2wgXCIlc1wifSBAIGZpbGUgYWRkcmVzcyAlbGQuIgotbXNnc3RyICIiCi0KLSMuIFRoaXMgaXMgYSBDT0JSIGluc3RydWN0aW9uLiAgVGhleSBoYXZlIG9ubHkgYSAxMy1iaXQKLSMuIGRpc3BsYWNlbWVudCBhbmQgYXJlIG9ubHkgdG8gYmUgdXNlZCBmb3IgbG9jYWwgYnJhbmNoZXM6Ci0jLiBmbGFnIGFzIGVycm9yLCBkb24ndCBnZW5lcmF0ZSByZWxvY2F0aW9uLgotIzogY29uZmlnL29iai1jb2ZmLmM6NDIwNCBjb25maWcvdGMtaTk2MC5jOjMyMjEgd3JpdGUuYzoyNjU5Ci1tc2dpZCAiY2FuJ3QgdXNlIENPQlIgZm9ybWF0IHdpdGggZXh0ZXJuYWwgbGFiZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NDI3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJWYWx1ZSBvZiAlbGQgdG9vIGxhcmdlIGZvciBmaWVsZCBvZiAlZCBieXRlcyBhdCAweCVseCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo0MjkyIHdyaXRlLmM6Mjc0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJTaWduZWQgLndvcmQgb3ZlcmZsb3c7IHN3aXRjaCBtYXkgYmUgdG9vIGxhcmdlOyAlbGQgYXQgMHglbHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lY29mZi5jOjIzOQotbXNnaWQgIkNhbid0IHNldCBHUCB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVjb2ZmLmM6MjQ2Ci1tc2dpZCAiQ2FuJ3Qgc2V0IHJlZ2lzdGVyIG1hc2tzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6Mjc0IGNvbmZpZy90Yy1zcGFyYy5jOjMxNTYgY29uZmlnL3RjLXY4NTAuYzoyNjMKLW1zZ2lkICJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjI4MSBjb25maWcvdGMtYXJjLmM6Nzc4IGNvbmZpZy90Yy1zcGFyYy5jOjMxNjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLkNPTU1vbiBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MjkxIGNvbmZpZy90Yy1hbHBoYS5jOjM0MjkgY29uZmlnL3RjLXNwYXJjLmM6MzE3MwotIzogY29uZmlnL3RjLXY4NTAuYzoyODUKLW1zZ2lkICJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoyOTkgY29uZmlnL3RjLWFyYy5jOjc5NiBjb25maWcvdGMtc3BhcmMuYzozMTgxCi0jOiBjb25maWcvdGMtdjg1MC5jOjI5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzozMjIgY29uZmlnL3RjLWFyYy5jOjgxNSBjb25maWcvdGMtdjg1MC5jOjMyMgotbXNnaWQgIkNvbW1vbiBhbGlnbm1lbnQgbmVnYXRpdmU7IDAgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjM0MSBjb25maWcvdGMtbTMyci5jOjEyOTggY29uZmlnL3RjLXBwYy5jOjEzODkKLSM6IGNvbmZpZy90Yy12ODUwLmM6Mzg1Ci1tc2dpZCAiQ29tbW9uIGFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6NDA0IGNvbmZpZy90Yy1hcmMuYzo4NzUgY29uZmlnL3RjLXNwYXJjLmM6MzMwNQotIzogY29uZmlnL3RjLXY4NTAuYzo1NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIC5jb21tb24gc2VnbWVudCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjU4OQotbXNnaWQgIk1pc3Npbmcgc2VjdGlvbiBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6NjU0Ci1tc2dpZCAiQmFkIC5zZWN0aW9uIGRpcmVjdGl2ZTogd2FudCBhLHcseCBpbiBzdHJpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo3MDMKLW1zZ2lkICJVbnJlY29nbml6ZWQgc2VjdGlvbiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6NzE3Ci1tc2dpZCAiQmFkIC5zZWN0aW9uIGRpcmVjdGl2ZSAtIGNoYXJhY3RlciBmb2xsb3dpbmcgbmFtZSBpcyBub3QgJyMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6NzQ5Ci1tc2dpZCAiVW5yZWNvZ25pemVkIHNlY3Rpb24gYXR0cmlidXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6NzcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlNldHRpbmcgaW5jb3JyZWN0IHNlY3Rpb24gdHlwZSBmb3IgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo3ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2V0dGluZyBpbmNvcnJlY3Qgc2VjdGlvbiBhdHRyaWJ1dGVzIGZvciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjkwNQotbXNnaWQgIi5wcmV2aW91cyB3aXRob3V0IGNvcnJlc3BvbmRpbmcgLnNlY3Rpb247IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo5NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibXVsdGlwbGUgLnN5bXZlciBkaXJlY3RpdmVzIGZvciBzeW1ib2wgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjk2MwotbXNnaWQgImV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgaW4gLnN5bXZlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjk4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJtaXNzaW5nIHZlcnNpb24gbmFtZSBpbiBgJXMnIGZvciBzeW1ib2wgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjExODcgY29uZmlnL29iai1zb20uYzoxNDggY29uZmlnL29iai1zb20uYzoxOTMKLW1zZ2lkICJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTIwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJleHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIGAlcycgaW4gLnNpemUgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTIxNwotbXNnaWQgIm1pc3NpbmcgZXhwcmVzc2lvbiBpbiAuc2l6ZSBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxMjgzCi0jLCBjLWZvcm1hdAotbXNnaWQgImlnbm9yaW5nIHVucmVjb2duaXplZCBzeW1ib2wgdHlwZSBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxNDUzCi1tc2dpZCAiLnNpemUgZXhwcmVzc2lvbiB0b28gY29tcGxpY2F0ZWQgdG8gZml4IHVwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTQ4NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iaW52YWxpZCBhdHRlbXB0IHRvIGRlY2xhcmUgZXh0ZXJuYWwgdmVyc2lvbiBuYW1lIGFzIGRlZmF1bHQgaW4gc3ltYm9sIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxNjEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkZhaWxlZCB0byBzZXQgdXAgZGVidWdnaW5nIGluZm9ybWF0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjE2MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3Qgc3RhcnQgd3JpdGluZyAubWRlYnVnIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTYzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJDb3VsZCBub3Qgd3JpdGUgLm1kZWJ1ZyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWllZWUuYzo0NjAKLW1zZ2lkICJ0b28gbWFueSBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXNvbS5jOjEzMQotbXNnaWQgIk9ubHkgb25lIC52ZXJzaW9uIHBzZXVkby1vcCBwZXIgZmlsZSEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1zb20uYzoxNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRkFUQUw6IEF0dGFjaGluZyB2ZXJzaW9uIGhlYWRlciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXNvbS5jOjE3NgotbXNnaWQgIk9ubHkgb25lIC5jb3B5cmlnaHQgcHNldWRvLW9wIHBlciBmaWxlISIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXNvbS5jOjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJGQVRBTDogQXR0YWNoaW5nIGNvcHlyaWdodCBoZWFkZXIgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY29tcGlsZXIgZW1pdHRlZCB6ZXJvLXNpemUgY29tbW9uIHN5bWJvbCBgJXMnIGFscmVhZHkgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjb21waWxlciByZWRlZmluZWQgemVyby1zaXplIGNvbW1vbiBzeW1ib2wgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjU5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJDb3VsZG4ndCBjcmVhdGUgVk1TIG9iamVjdCBmaWxlIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjYyMwotbXNnaWQgIkkvTyBlcnJvciB3cml0aW5nIFZNUyBvYmplY3QgZmlsZSAobGVuZ3RoIHByZWZpeCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo2MzcKLW1zZ2lkICJJL08gZXJyb3Igd3JpdGluZyBWTVMgb2JqZWN0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzoxMjQwCi1tc2dpZCAiQ291bGRuJ3QgZmluZCBzb3VyY2UgZmlsZSBcIiVzXCIsIHN0YXR1cz0lJVgleCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjE3NDkgY29uZmlnL29iai12bXMuYzoyOTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImRlYnVnZ2VyIGZvcndhcmQgcmVmZXJlbmNlIGVycm9yLCBkYnggdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjE4MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVmFyaWFibGUgZGVzY3JpcHRvciAlZCB0b28gY29tcGxpY2F0ZWQuICBEZWZpbmVkIGFzIGB2b2lkIConLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjIxNDQKLW1zZ2lkICIiCi0iKioqV2FybmluZyAtIHRoZSBhc3NlbWJseSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIgaGFzIHBsYWNlZCBcbiIKLSIgZ2xvYmFsIGNvbnN0YW50KHMpIGluIHRoZSB0ZXh0IHBzZWN0LiAgVGhlc2Ugd2lsbCBub3QgYmUgYXZhaWxhYmxlIHRvIFxuIgotIiBvdGhlciBtb2R1bGVzLCBzaW5jZSB0aGlzIGlzIG5vdCB0aGUgY29ycmVjdCB3YXkgdG8gaGFuZGxlIHRoaXMuIFlvdSBcbiIKLSIgaGF2ZSB0d28gb3B0aW9uczogMSkgZ2V0IGEgcGF0Y2hlZCBjb21waWxlciB0aGF0IGRvZXMgbm90IHB1dCBnbG9iYWwgXG4iCi0iIGNvbnN0YW50cyBpbiB0aGUgdGV4dCBwc2VjdCwgb3IgMikgcmVtb3ZlIHRoZSAnY29uc3QnIGtleXdvcmQgZnJvbSBcbiIKLSIgZGVmaW5pdGlvbnMgb2YgZ2xvYmFsIHZhcmlhYmxlcyBpbiB5b3VyIHNvdXJjZSBtb2R1bGUocykuICBEb24ndCBzYXkgXG4iCi0iIEkgZGlkbid0IHdhcm4geW91ISBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjI0NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVidWdnaW5lciBvdXRwdXQ6ICVkIGlzIGFuIHVua25vd24gdW50eXBlZCB2YXJpYWJsZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzoyNjgxCi0jLCBjLWZvcm1hdAotbXNnaWQgImRlYnVnZ2VyIG91dHB1dDogc3RydWN0dXJlIGVsZW1lbnQgYCVzJyBoYXMgdW5kZWZpbmVkIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzoyNzkyCi0jLCBjLWZvcm1hdAotbXNnaWQgImRlYnVnZ2VyIG91dHB1dDogJWQgaXMgYW4gdW5rbm93biB0eXBlIG9mIHZhcmlhYmxlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjI5MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVidWdnZXIgb3V0cHV0OiBVbmFibGUgdG8gcmVzb2x2ZSAlZCBjaXJjdWxhciByZWZlcmVuY2VzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjMxMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTW9kdWxlIG5hbWUgdHJ1bmNhdGVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MzQxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgJXMgcmVwbGFjZWQgYnkgJXNcbiIKLW1zZ3N0ciAiIgotCi0jLiBpbXBvc3NpYmxlCi0jOiBjb25maWcvb2JqLXZtcy5jOjM2OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBWTVMgcHNlY3QgdHlwZSAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjM3MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR2xvYmFsc3ltYm9sIGF0dHJpYnV0ZSBmb3Igc3ltYm9sICVzIHdhcyB1bmV4cGVjdGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjM4ODUKLW1zZ2lkICJJbnZhbGlkIGRhdGEgdHlwZSBmb3IgZ2xvYmFsdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzozODk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgZ2xvYmFsdmFsdWUgb2YgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0MjQ3Ci1tc2dpZCAiQ291bGRuJ3QgZmluZCBmaXh1cCBmcmFnbWVudCB3aGVuIGNoZWNraW5nIGZvciBpbmRpcmVjdCByZWZlcmVuY2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0NTkxIGNvbmZpZy9vYmotdm1zLmM6NDczMwotbXNnaWQgIkZpeHVwIGRhdGEgYWRkc3kgYW5kIHN1YnN5IGRvbid0IGhhdmUgdGhlIHNhbWUgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ1OTUgY29uZmlnL29iai12bXMuYzo0NzM3Ci1tc2dpZCAiRml4dXAgZGF0YSBhZGRzeSBhbmQgc3Vic3kgZG9uJ3QgaGF2ZSBhbiBhcHByb3ByaWF0ZSB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NDU5OCBjb25maWcvb2JqLXZtcy5jOjQ3NDAKLW1zZ2lkICJGaXh1cCBkYXRhIGlzIGVycm9uZW91c2x5IFwicGNyZWxcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ2MTQgY29uZmlnL29iai12bXMuYzo0NzU5Ci1tc2dpZCAiRml4dXAgZGF0dW0gaXMgbm90IGEgbG9uZ3dvcmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0NjE4IGNvbmZpZy9vYmotdm1zLmM6NDc2MwotbXNnaWQgIkZpeHVwIGRhdHVtIGlzIG5vdCBcImZpeFAtPmZ4X2FkZHN5XCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0ODM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJnKysgd3JvdGUgYW4gZXh0ZXJuIHJlZmVyZW5jZSB0byBgJXMnIGFzIGEgcm91dGluZS5cbiIKLSJJIHdpbGwgZml4IGl0LCBidXQgSSBob3BlIHRoYXQgaXQgd2FzIG5vdGUgcmVhbGx5IGEgcm91dGluZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0OTY2Ci1tc2dpZCAiQ2FuJ3QgaGFuZGxlIGdsb2JhbCB4dG9ycyBzeW1ib2xzIHlldC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0OTY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gJXMiCi1tc2dzdHIgIiIKLQotIy4KLSMuICoJRXJyb3Igb3RoZXJ3aXNlLgotIy4KLSM6IGNvbmZpZy9vYmotdm1zLmM6NTA1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmhhbmRsZWQgc3RhYiB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6MTYwIGNvbmZpZy90Yy1zcGFyYy5jOjMzNTcKLW1zZ2lkICJVbmtub3duIHNlZ21lbnQgdHlwZSIKLW1zZ3N0ciAiIgotCi0jLiBQcm9iYWJseSBhIG1lbW9yeSBhbGxvY2F0aW9uIHByb2JsZW0/ICBHaXZlIHVwIG5vdy4KLSM6IGNvbmZpZy90Yy1hMjlrLmM6MzMwIGNvbmZpZy90Yy1ocHBhLmM6MTM1NCBjb25maWcvdGMtaTg2MC5jOjIwMgotIzogY29uZmlnL3RjLW1pcHMuYzoxMTAyIGNvbmZpZy90Yy1taXBzLmM6MTE0NCBjb25maWcvdGMtc3BhcmMuYzo3MTUKLW1zZ2lkICJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjM3NSBjb25maWcvdGMtYXJjLmM6NTM0IGNvbmZpZy90Yy1kMTB2LmM6NDgxCi0jOiBjb25maWcvdGMtZDMwdi5jOjU0MCBjb25maWcvdGMtaDgzMDAuYzozMDUgY29uZmlnL3RjLWg4NTAwLmM6Mjk3Ci0jOiBjb25maWcvdGMtbWNvcmUuYzozODAgY29uZmlnL3RjLW1uMTAyMDAuYzo5MzYgY29uZmlnL3RjLW1uMTAzMDAuYzoxMzA3Ci0jOiBjb25maWcvdGMtcHBjLmM6MTg0NCBjb25maWcvdGMtc2guYzo0NzggY29uZmlnL3RjLXRpYzgwLmM6MjkxCi0jOiBjb25maWcvdGMtdjg1MC5jOjIwMzMgY29uZmlnL3RjLXc2NS5jOjI1NyBjb25maWcvdGMtejhrLmM6MzQxCi1tc2dpZCAibWlzc2luZyBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6NDE1IGNvbmZpZy90Yy1ocHBhLmM6MTQ3MSBjb25maWcvdGMtaTg2MC5jOjQwNwotIzogY29uZmlnL3RjLWk4NjAuYzo0MjMgY29uZmlnL3RjLXNwYXJjLmM6MTE5MSBjb25maWcvdGMtc3BhcmMuYzoxMTk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gb3Bjb2RlOiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6NDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gb3Bjb2RlIGAlcycuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6NDUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlRvbyBtYW55IG9wZXJhbmRzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjQ3NCBjb25maWcvdGMtYTI5ay5jOjUwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbW1lZGlhdGUgdmFsdWUgb2YgJWxkIGlzIHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjg5MiBjb25maWcvdGMtaTg2MC5jOjk0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgcmVsb2NhdGlvbiB0eXBlOiAweCUwMngiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzo5MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibmVlZCAlbzNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjkzMgotbXNnaWQgImEyOWtfY29udmVydF9mcmFnXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzo5NDEKLW1zZ2lkICJhMjlrX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzoxMDkyCi0jLCBjLWZvcm1hdAotbXNnaWQgImxhYmVsIFwiJCVkXCIgcmVkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6MTE2NQotbXNnaWQgIkludmFsaWQgZXhwcmVzc2lvbiBhZnRlciAlJSUlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzoxMTc2Ci1tc2dpZCAiSW52YWxpZCByZWdpc3RlciBpbiAmIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NzIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIG9wY29kZSBgJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo3NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggbWFjcm8gYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6ODMyIGNvbmZpZy90Yy1pOTYwLmM6MjcxMQotbXNnaWQgInN5bnRheCBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo5MDUgY29uZmlnL3RjLWFybS5jOjQ5ODIgY29uZmlnL3RjLWg4MzAwLmM6MTQxMwotIzogY29uZmlnL3RjLWg4NTAwLmM6MTIyMiBjb25maWcvdGMtaHBwYS5jOjM2NTEgY29uZmlnL3RjLWk4NjAuYzo4MTMKLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDAwMyBjb25maWcvdGMtbTg4ay5jOjExMDYgY29uZmlnL3RjLW5zMzJrLmM6MTU4OAotIzogY29uZmlnL3RjLXNwYXJjLmM6MjQzMyBjb25maWcvdGMtejhrLmM6MTM1NQotbXNnaWQgIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo5NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBDUFUgaWRlbnRpZmllciBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjk5OQotbXNnaWQgIiIKLSJBbHBoYSBvcHRpb25zOlxuIgotIi0zMmFkZHJcdFx0XHR0cmVhdCBhZGRyZXNzZXMgYXMgMzItYml0IHZhbHVlc1xuIgotIi1GXHRcdFx0bGFjayBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgc3VwcG9ydFxuIgotIi1tZXY0IHwgLW1ldjQ1IHwgLW1ldjUgfCAtbWV2NTYgfCAtbXBjYTU2IHwgLW1ldjYgfCAtbWFsbFxuIgotIlx0XHRcdHNwZWNpZnkgdmFyaWFudCBvZiBBbHBoYSBhcmNoaXRlY3R1cmVcbiIKLSItbTIxMDY0IHwgLW0yMTA2NiB8IC1tMjExNjQgfCAtbTIxMTY0YSB8IC1tMjExNjRwYyB8IC1tMjEyNjRcbiIKLSJcdFx0XHR0aGVzZSB2YXJpYW50cyBpbmNsdWRlIFBBTGNvZGUgb3Bjb2Rlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjEwMDkKLW1zZ2lkICIiCi0iVk1TIG9wdGlvbnM6XG4iCi0iLStcdFx0XHRoYXNoIGVuY29kZSAoZG9uJ3QgdHJ1bmNhdGUpIG5hbWVzIGxvbmdlciB0aGFuIDY0IGNoYXJhY3RlcnNcbiIKLSItSFx0XHRcdHNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxMTY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGUgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTE3OAotbXNnaWQgIm5vbi1hYnNvbHV0ZSBleHByZXNzaW9uIGluIGNvbnN0YW50IGZpZWxkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjExOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidHlwZSAlZCByZWxvYyBkb25lP1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjEyNDMgY29uZmlnL3RjLWFscGhhLmM6MTI1MCBjb25maWcvdGMtbWlwcy5jOjc3NzcKLW1zZ2lkICJVc2VkICRhdCB3aXRob3V0IFwiLnNldCBub2F0XCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTQwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVwcmVzZW50IGAlcycgcmVsb2NhdGlvbiBpbiBvYmplY3QgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxNDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yPyBjYW5ub3QgZ2VuZXJhdGUgYCVzJyByZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjE0NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZnJhbWUgcmVnIGV4cGVjdGVkLCB1c2luZyAkJWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjE3OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVzIG5vdCBiZXR3ZWVuICVkIGFuZCAlZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTg5MCBjb25maWcvdGMtYXJjLmM6NTQ3IGNvbmZpZy90Yy1kMTB2LmM6NTcwCi0jOiBjb25maWcvdGMtZDMwdi5jOjYyMyBjb25maWcvdGMtbW4xMDIwMC5jOjk5MSBjb25maWcvdGMtbW4xMDMwMC5jOjEzODIKLSM6IGNvbmZpZy90Yy1wcGMuYzoxODEwIGNvbmZpZy90Yy1wcGMuYzoxOTE3IGNvbmZpZy90Yy1wcGMuYzoxOTI5Ci0jOiBjb25maWcvdGMtdjg1MC5jOjE4MTkgY29uZmlnL3RjLXY4NTAuYzoxODQyIGNvbmZpZy90Yy12ODUwLmM6MjA1NQotbXNnaWQgInRvbyBtYW55IGZpeHVwcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyMDE1IGNvbmZpZy90Yy1hbHBoYS5jOjIwNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW5hcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIG9wY29kZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjIwMTcgY29uZmlnL3RjLWFscGhhLmM6MjA3NQotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGNvZGUgYCVzJyBub3Qgc3VwcG9ydGVkIGZvciB0YXJnZXQgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjAyMSBjb25maWcvdGMtYWxwaGEuYzoyMDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb3Bjb2RlIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjEzMAotbXNnaWQgImNhbiBub3QgcmVzb2x2ZSBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjIyNjggY29uZmlnL3RjLWFscGhhLmM6MjQ0NQotbXNnaWQgIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXRhKSB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyMjc1IGNvbmZpZy90Yy1hbHBoYS5jOjIyOTcgY29uZmlnL3RjLWFscGhhLmM6MjQ1OAotIzogY29uZmlnL3RjLWFscGhhLmM6MjY4MCBjb25maWcvdGMtYWxwaGEuYzoyNzI3IGNvbmZpZy90Yy1hbHBoYS5jOjI3NzUKLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjI4NjQgY29uZmlnL3RjLWFscGhhLmM6MzA2NSBjb25maWcvdGMtYWxwaGEuYzozMTY2Ci1tc2dpZCAibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjIyNzcgY29uZmlnL3RjLWFscGhhLmM6MjI5OSBjb25maWcvdGMtYWxwaGEuYzoyNDYwCi1tc2dpZCAibWFjcm8gcmVxdWlyZXMgJGF0IHdoaWxlICRhdCBpbiB1c2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjQwNyBleHByLmM6ODIgcmVhZC5jOjMxMDEKLW1zZ2lkICJiaWdudW0gaW52YWxpZDsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjI0MDkgZXhwci5jOjg0IHJlYWQuYzozMTAzIHJlYWQuYzozNDMyIHJlYWQuYzo0MzI4Ci1tc2dpZCAiZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludmFsaWQ7IHplcm8gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyNDE0Ci1tc2dpZCAiY2FuJ3QgaGFuZGxlIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjQ1MQotbXNnaWQgIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXQ4KSB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNDAwIGNvbmZpZy90Yy1wcGMuYzoxMzM4IGNvbmZpZy90Yy1wcGMuYzozNTQyCi0jOiByZWFkLmM6MTM1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM0MzggY29uZmlnL3RjLWFscGhhLmM6MzQ0NyBjb25maWcvdGMtcHBjLmM6MzU3OQotIzogcmVhZC5jOjEzNzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNTQ5IGVjb2ZmLmM6MzEwNQotbXNnaWQgIi5lbnQgZGlyZWN0aXZlIGhhcyBubyBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM1NTcKLW1zZ2lkICJuZXN0ZWQgLmVudCBkaXJlY3RpdmVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM1OTMgZWNvZmYuYzozMDUzCi1tc2dpZCAiLmVuZCBkaXJlY3RpdmUgaGFzIG5vIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzYwMgotbXNnaWQgIi5lbmQgZGlyZWN0aXZlIG5hbWVzIGRpZmZlcmVudCBzeW1ib2wgdGhhbiAuZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM2NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBhcmd1bWVudCAlZCB0byAucHJvbG9ndWUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM3MDQKLW1zZ2lkICJFQ09GRiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM3MjUKLW1zZ2lkICJVbmtub3duIHNlY3Rpb24gZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM3NjIKLW1zZ2lkICIuZW50IGRpcmVjdGl2ZSBoYXMgbm8gc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM3OTAKLW1zZ2lkICJCYWQgLmZyYW1lIGRpcmVjdGl2ZSAxLi8yLiBwYXJhbSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozODAyCi1tc2dpZCAiQmFkIC5mcmFtZSBkaXJlY3RpdmUgMy4vNC4gcGFyYW0iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzgyNwotbXNnaWQgIi5wZGVzYyBkaXJlY3RpdmUgbm90IGluIGxpbmsgKC5saW5rKSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM4MzUKLW1zZ2lkICIucGRlc2MgaGFzIG5vIG1hdGNoaW5nIC5lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6Mzg0NQotbXNnaWQgIi5wZGVzYyBkaXJlY3RpdmUgaGFzIG5vIGVudHJ5IHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozODU3Ci1tc2dpZCAiTm8gY29tbWEgYWZ0ZXIgLnBkZXNjIDxlbnRyeW5hbWU+IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM4ODAKLW1zZ2lkICJ1bmtub3duIHByb2NlZHVyZSBraW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM5NzUKLW1zZ2lkICIubmFtZSBkaXJlY3RpdmUgbm90IGluIGxpbmsgKC5saW5rKSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM5ODMKLW1zZ2lkICIubmFtZSBkaXJlY3RpdmUgaGFzIG5vIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0MDE4Ci1tc2dpZCAiTm8gc3ltYm9sIGFmdGVyIC5saW5rYWdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQwNDcKLW1zZ2lkICJObyBzeW1ib2wgYWZ0ZXIgLmNvZGVfYWRkcmVzcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0MDgyIGVjb2ZmLmM6MzI2OQotbXNnaWQgIkJhZCAubWFzayBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDEwNCBlY29mZi5jOjMyMDAKLW1zZ2lkICJCYWQgLmZtYXNrIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0Mjc1IHJlYWQuYzoyMTIzIHJlYWQuYzoyNjc1IHN0YWJzLmM6NDYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgXCIlc1wiIgotbXNnc3RyICIiCi0KLSMuIHN5bWJvbFAtPnN5X290aGVyID0gKHNpZ25lZCBjaGFyKSB0ZW1wOwotIzogY29uZmlnL3RjLWFscGhhLmM6NDI4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmhhbmRsZWQ6IC5wcm9jICVzLCVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQzMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVHJpZWQgdG8gLnNldCB1bnJlY29nbml6ZWQgbW9kZSBgJXMnIgotbXNnc3RyICIiCi0KLSMuIG5vdCBmYXRhbCwgYnV0IGl0IG1pZ2h0IG5vdCB3b3JrIGluIHRoZSBlbmQKLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQzMzgKLW1zZ2lkICJGaWxlIG92ZXJyaWRlcyBuby1iYXNlLXJlZ2lzdGVyIG9wdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDM1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJCYWQgYmFzZSByZWdpc3RlciwgdXNpbmcgJCVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0Mzc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFsaWdubWVudCB0b28gbGFyZ2U6ICVkLiBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQzODEgY29uZmlnL3RjLWQzMHYuYzoyMTYzCi1tc2dpZCAiQWxpZ25tZW50IG5lZ2F0aXZlOiAwIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDY5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJDaG9zZSBHUCB2YWx1ZSBvZiAlbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTM2Ci1tc2dpZCAiIgotIkFSQyBvcHRpb25zOlxuIgotIi1FQlx0XHRcdGdlbmVyYXRlIGJpZyBlbmRpYW4gb3V0cHV0XG4iCi0iLUVMXHRcdFx0Z2VuZXJhdGUgbGl0dGxlIGVuZGlhbiBvdXRwdXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTU0IGNvbmZpZy90Yy1hcmMuYzoxNzcgY29uZmlnL3RjLWFyYy5jOjkyMQotIzogY29uZmlnL3RjLWhwcGEuYzoxMzE2IGNvbmZpZy90Yy1ocHBhLmM6NjQxMCBjb25maWcvdGMtaHBwYS5jOjY0MTYKLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjQyMiBjb25maWcvdGMtbW4xMDMwMC5jOjg5MCBjb25maWcvdGMtbW4xMDMwMC5jOjIwMjMKLW1zZ2lkICJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTc0Ci1tc2dpZCAidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoyNTMgY29uZmlnL3RjLW1uMTAyMDAuYzoxMzU0IGNvbmZpZy90Yy1tbjEwMzAwLmM6MTkzMAotIzogY29uZmlnL3RjLXBwYy5jOjEwOTUgY29uZmlnL3RjLXY4NTAuYzoxNjE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjM4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIHN5bnRheCBmb3JtYXQgY2hhcmFjdGVyIGAlYyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjQ4NwotbXNnaWQgInRvbyBtYW55IHN1ZmZpeGVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo1MzIgY29uZmlnL3RjLWQxMHYuYzo0NzkgY29uZmlnL3RjLWQzMHYuYzo1MzgKLSM6IGNvbmZpZy90Yy1tbjEwMjAwLmM6OTMzIGNvbmZpZy90Yy1tbjEwMzAwLmM6MTMwNCBjb25maWcvdGMtcHBjLmM6MTg0MgotIzogY29uZmlnL3RjLXRpYzgwLmM6Mjg3IGNvbmZpZy90Yy12ODUwLmM6MjAzMAotbXNnaWQgImlsbGVnYWwgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6NjE5IGNvbmZpZy90Yy1tbjEwMjAwLmM6MTAzMiBjb25maWcvdGMtbW4xMDMwMC5jOjE0NTIKLSM6IGNvbmZpZy90Yy1wcGMuYzoxOTY2IGNvbmZpZy90Yy12ODUwLmM6MjEwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJqdW5rIGF0IGVuZCBvZiBsaW5lOiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo2NTkKLW1zZ2lkICI4IGJ5dGUgaW5zdHJ1Y3Rpb24gaW4gZGVsYXkgc2xvdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6NjYxCi1tc2dpZCAiOCBieXRlIGp1bXAgaW5zdHJ1Y3Rpb24gd2l0aCBkZWxheSBzbG90IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo2NjkKLW1zZ2lkICJjb25kaXRpb25hbCBicmFuY2ggZm9sbG93cyBzZXQgb2YgZmxhZ3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjc0OCBjb25maWcvdGMtYXJtLmM6NjA0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgaW5zdHJ1Y3Rpb24gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6NzcxCi1tc2dpZCAiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjc4OAotbXNnaWQgImlnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6ODAzCi1tc2dpZCAiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgY29tbW9uIGxlbmd0aCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6ODk2Ci1tc2dpZCAiLmNwdSBjb21tYW5kIG11c3QgYXBwZWFyIGJlZm9yZSBhbnkgaW5zdHJ1Y3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo5MTUKLW1zZ2lkICIuY3B1IGNvbmZsaWN0cyB3aXRoIHByZXZpb3VzIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo5MjYKLW1zZ2lkICJiYWQgLmNwdSBvcCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6OTUwIGNvbmZpZy90Yy1wcGMuYzoyNjE1Ci1tc2dpZCAibWlzc2luZyByZW5hbWUgc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo5NjIKLW1zZ2lkICJpbnZhbGlkIHN5bWJvbCB0byByZW5hbWUgdG8iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjEwMDkgY29uZmlnL3RjLWQxMHYuYzoyNzQgY29uZmlnL3RjLWQzMHYuYzozNTMKLSM6IGNvbmZpZy90Yy1taXBzLmM6OTMxNyBjb25maWcvdGMtbW4xMDIwMC5jOjM1NiBjb25maWcvdGMtcHBjLmM6NDM2MwotIzogY29uZmlnL3RjLXNoLmM6MTE4NyBjb25maWcvdGMtdjg1MC5jOjEyNzYKLW1zZ2lkICJiYWQgY2FsbCB0byBtZF9hdG9mIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoxMDk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1pc3NpbmcgJyknIGluICUtb3AiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjExMzAKLW1zZ2lkICJleHByZXNzaW9uIHRvbyBjb21wbGV4IGZvciAlJXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoxMzI0IGNvbmZpZy90Yy1hcm0uYzoyOTM3IGNvbmZpZy90Yy1kMTB2LmM6MTQ0OAotIzogY29uZmlnL3RjLWQzMHYuYzoxODEwIGNvbmZpZy90Yy1taXBzLmM6MzM2MSBjb25maWcvdGMtbWlwcy5jOjQzMTcKLSM6IGNvbmZpZy90Yy1taXBzLmM6NTEwMiBjb25maWcvdGMtbWlwcy5jOjU2NDggY29uZmlnL3RjLXBwYy5jOjQ2OTgKLSM6IGNvbmZpZy90Yy12ODUwLmM6MjMzOQotbXNnaWQgImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjEzOTAgY29uZmlnL3RjLXBwYy5jOjQ4MDEgY29uZmlnL3RjLXY4NTAuYzoyMzgzCi1tc2dpZCAidW5yZXNvbHZlZCBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSByZXNvbHZlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTQ1NCBjb25maWcvdGMtc3BhcmMuYzoyODgwCi0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yOiBjYW4ndCBleHBvcnQgcmVsb2MgdHlwZSAlZCAoYCVzJykiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjk4MwotbXNnaWQgIkxpdGVyYWwgUG9vbCBPdmVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTEwMwotbXNnaWQgIkludmFsaWQgc3ludGF4IGZvciAucmVxIGRpcmVjdGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjExMzkKLW1zZ2lkICJOb3RoaW5nIHRvIHB1dCBpbiB0aGUgcG9vbFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMTUxCi1tc2dpZCAiSW5zZXJ0aW5nIGltcGxpY2l0IHBvb2wgYXQgY2hhbmdlIG9mIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjExODMgY29uZmlnL3RjLW1pcHMuYzoxMDYwMyByZWFkLmM6MjAxNwotIywgYy1mb3JtYXQKLW1zZ2lkICJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZC4gYXNzdW1lZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjExODYgcmVhZC5jOjIwMjIKLW1zZ2lkICJBbGlnbm1lbnQgbmVnYXRpdmUuIDAgYXNzdW1lZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjEyNTEKLW1zZ2lkICJzZWxlY3RlZCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBUSFVNQiBvcGNvZGVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMjYzCi1tc2dpZCAic2VsZWN0ZWQgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgQVJNIG9wY29kZXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjEyNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBpbnN0cnVjdGlvbiBzaXplIHNlbGVjdGVkICglZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjEzMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBvcGVyYW5kIHRvIC5jb2RlIGRpcmVjdGl2ZSAoJWQpIChleHBlY3RpbmcgMTYgb3IgMzIpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMzE5Ci1tc2dpZCAiR2FyYmFnZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIy4gSW4gdGhlIGZldyBjYXNlcyB3aGVyZSB3ZSBtaWdodCBiZSBhYmxlIHRvIGFjY2VwdCBzb21ldGhpbmcgZWxzZQotIy4gdGhpcyBlcnJvciBjYW4gYmUgb3ZlcnJpZGRlbgotIzogY29uZmlnL3RjLWFybS5jOjEzNjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUmVnaXN0ZXIgZXhwZWN0ZWQsIG5vdCAnJS4xMDBzJyIKLW1zZ3N0ciAiIgotCi0jLiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0jLiB0aGlzIGVycm9yIGNhbiBiZSBvdmVycmlkZGVuCi0jOiBjb25maWcvdGMtYXJtLmM6MTM5MwotbXNnaWQgIjxwc3IoZik+IGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNDI0Ci1tc2dpZCAiSWxsZWdhbCBjby1wcm9jZXNzb3IgbnVtYmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNDMxCi1tc2dpZCAiQmFkIG9yIG1pc3NpbmcgY28tcHJvY2Vzc29yIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTQ1NgotbXNnaWQgImJhZCBvciBtaXNzaW5nIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE0NjIKLW1zZ2lkICJpbW1lZGlhdGUgY28tcHJvY2Vzc29yIGV4cHJlc3Npb24gdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSMuIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKLSMuIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNDg3Ci1tc2dpZCAiQ28tcHJvY2Vzc29yIHJlZ2lzdGVyIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSMuIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKLSMuIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNTExCi1tc2dpZCAiRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE1MjkKLW1zZ2lkICJpbW1lZGlhdGUgZXhwcmVzc2lvbiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTU0NAotbXNnaWQgImNvLXByb2Nlc3NvciBhZGRyZXNzIG11c3QgYmUgd29yZCBhbGlnbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNTUwCi1tc2dpZCAib2Zmc2V0IHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTYwMAotbXNnaWQgInBjIG1heSBub3QgYmUgdXNlZCBpbiBwb3N0LWluY3JlbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTYxNiBjb25maWcvdGMtYXJtLmM6MjcyNwotbXNnaWQgInByZS1pbmRleGVkIGV4cHJlc3Npb24gZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE2MzAgY29uZmlnL3RjLWFybS5jOjI3NDAgY29uZmlnL3RjLWFybS5jOjMwODkKLW1zZ2lkICJtaXNzaW5nIF0iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE2NDEKLW1zZ2lkICJwYyBtYXkgbm90IGJlIHVzZWQgd2l0aCB3cml0ZS1iYWNrIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNjk2Ci1tc2dpZCAiPHBzcj4gZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE3NTggY29uZmlnL3RjLWFybS5jOjIzNzgKLW1zZ2lkICJSZWdpc3RlciBvciBzaGlmdCBleHByZXNzaW9uIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNzcyIGNvbmZpZy90Yy1hcm0uYzoyMDkwIGNvbmZpZy90Yy1hcm0uYzoyMzQ1Ci0jOiBjb25maWcvdGMtYXJtLmM6MjM2NQotbXNnaWQgIkludmFsaWQgY29uc3RhbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE3ODMKLW1zZ2lkICJFcnJvcjogdW5yZWNvZ25pc2VkIHN5bnRheCBmb3Igc2Vjb25kIGFyZ3VtZW50IHRvIG1zciBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTgzMwotbXNnaWQgInJkaGksIHJkbG8gYW5kIHJtIG11c3QgYWxsIGJlIGRpZmZlcmVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTg5MAotbXNnaWQgInJkIGFuZCBybSBzaG91bGQgYmUgZGlmZmVyZW50IGluIG11bCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTk0NwotbXNnaWQgInJkIGFuZCBybSBzaG91bGQgYmUgZGlmZmVyZW50IGluIG1sYSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjA3NAotbXNnaWQgImJhZF9zZWdtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyMTIxIGNvbmZpZy90Yy1hcm0uYzoyMTk5Ci1tc2dpZCAiU2hpZnQgZXhwcmVzc2lvbiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjE2MwotbXNnaWQgIkludmFsaWQgaW1tZWRpYXRlIHNoaWZ0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyMTkyCi1tc2dpZCAic2hpZnQgcmVxdWlyZXMgcmVnaXN0ZXIgb3IgI2V4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjIxOTMKLW1zZ2lkICJzaGlmdCByZXF1aXJlcyAjZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjMzNiBjb25maWcvdGMtYXJtLmM6Mjc3MAotbXNnaWQgIkNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI0MzIKLW1zZ2lkICJJbnZhbGlkIGZsb2F0aW5nIHBvaW50IGltbWVkaWF0ZSBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyNDM1Ci1tc2dpZCAiRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgb3IgaW1tZWRpYXRlIGV4cHJlc3Npb24gZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI1NzQKLW1zZ2lkICJhZGRyZXNzIG9mZnNldCB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI2NDUKLW1zZ2lkICJQcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBoYWxmd29yZHMgb3Igc2lnbmVkIGJ5dGVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyNjY3Ci1tc2dpZCAiQWRkcmVzcyBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjY5OCBjb25maWcvdGMtYXJtLmM6MjcxMiBjb25maWcvdGMtYXJtLmM6Mjc1MAotbXNnaWQgImRlc3RpbmF0aW9uIHJlZ2lzdGVyIHNhbWUgYXMgd3JpdGUtYmFjayBiYXNlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI3OTAKLW1zZ2lkICJsaXRlcmFsIHBvb2wgaW5zZXJ0aW9uIGZhaWxlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjgyNgotbXNnaWQgIlByZS1pbmNyZW1lbnQgaW5zdHJ1Y3Rpb24gd2l0aCB0cmFuc2xhdGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI4NjgKLW1zZ2lkICJCYWQgcmFuZ2UgaW4gcmVnaXN0ZXIgbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mjg3NiBjb25maWcvdGMtYXJtLmM6Mjg4NSBjb25maWcvdGMtYXJtLmM6MjkyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBEdXBsaWNhdGVkIHJlZ2lzdGVyIChyJWQpIGluIHJlZ2lzdGVyIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI4ODgKLW1zZ2lkICJXYXJuaW5nOiBSZWdpc3RlciByYW5nZSBub3QgaW4gYXNjZW5kaW5nIG9yZGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyOTAwCi1tc2dpZCAiTWlzc2luZyBgfSciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI5MTYKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIG1hc2siCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI5NzcKLW1zZ2lkICJyMTUgbm90IGFsbG93ZWQgYXMgYmFzZSByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzA0NyBjb25maWcvdGMtYXJtLmM6MzA2MQotbXNnaWQgInIxNSBub3QgYWxsb3dlZCBpbiBzd2FwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozMTU4Ci1tc2dpZCAiVXNlIG9mIHIxNSBpbiBieCBoYXMgdW5kZWZpbmVkIGJlaGF2aW91ciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzQxNyBjb25maWcvdGMtdjg1MC5jOjE5MjEgY29uZmlnL3RjLXY4NTAuYzoxOTQyCi1tc2dpZCAiY29uc3RhbnQgZXhwcmVzc2lvbiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzQyMwotbXNnaWQgIkNvbnN0YW50IHZhbHVlIHJlcXVpcmVkIGZvciBudW1iZXIgb2YgcmVnaXN0ZXJzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozNDMxCi1tc2dpZCAibnVtYmVyIG9mIHJlZ2lzdGVycyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMTo0XSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzQ5MwotbXNnaWQgIlIxNSBub3QgYWxsb3dlZCBhcyBiYXNlIHJlZ2lzdGVyIHdpdGggd3JpdGUtYmFjayIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mzc0NQotbXNnaWQgImxvIHJlZ2lzdGVyIHJlcXVpcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozNzUzCi1tc2dpZCAiaGkgcmVnaXN0ZXIgcmVxdWlyZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM4MjMKLW1zZ2lkICJkZXN0IGFuZCBzb3VyY2UxIG11c3QgYmUgdGhlIHNhbWUgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM4MzAKLW1zZ2lkICJzdWJ0cmFjdCB2YWxpZCBvbmx5IG9uIGxvIHJlZ3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM4NTQKLW1zZ2lkICJpbnZhbGlkIEhpIHJlZ2lzdGVyIHdpdGggaW1tZWRpYXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozODgxIGNvbmZpZy90Yy1hcm0uYzozOTE0IGNvbmZpZy90Yy1hcm0uYzozOTI0Ci1tc2dpZCAiaW1tZWRpYXRlIHZhbHVlIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mzg5MgotbXNnaWQgImludmFsaWQgaW1tZWRpYXRlIHZhbHVlIGZvciBzdGFjayBhZGp1c3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM5MDMKLW1zZ2lkICJpbnZhbGlkIGltbWVkaWF0ZSBmb3IgYWRkcmVzcyBjYWxjdWxhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mzk5MAotbXNnaWQgInNvdXJjZTEgYW5kIGRlc3QgbXVzdCBiZSBzYW1lIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MDI1Ci1tc2dpZCAiSW52YWxpZCBpbW1lZGlhdGUgZm9yIHNoaWZ0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MTA0Ci1tc2dpZCAib25seSBsbyByZWdzIGFsbG93ZWQgd2l0aCBpbW1lZGlhdGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQxMjMKLW1zZ2lkICJpbnZhbGlkIGltbWVkaWF0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDE3OAotbXNnaWQgImV4cGVjdGVkICddJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDI0NQotbXNnaWQgImJ5dGUgb3IgaGFsZndvcmQgbm90IHZhbGlkIGZvciBiYXNlIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MjUwCi1tc2dpZCAiUjE1IGJhc2VkIHN0b3JlIG5vdCBhbGxvd2VkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MjU1Ci1tc2dpZCAiSW52YWxpZCBiYXNlIHJlZ2lzdGVyIGZvciByZWdpc3RlciBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQyNzMKLW1zZ2lkICJpbnZhbGlkIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDI4NAotbXNnaWQgImludmFsaWQgYmFzZSByZWdpc3RlciBpbiBsb2FkL3N0b3JlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MzA4IGNvbmZpZy90Yy1hcm0uYzo1NDcxIGNvbmZpZy90Yy1hcm0uYzo1NDgwCi0jOiBjb25maWcvdGMtYXJtLmM6NTQ4NyBjb25maWcvdGMtYXJtLmM6NTQ5NCBjb25maWcvdGMtYXJtLmM6NTUwMQotbXNnaWQgIkludmFsaWQgb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0Mzg2Ci1tc2dpZCAiZGVzdCBhbmQgc291cmNlMSBvbmUgbXVzdCBiZSB0aGUgc2FtZSByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDM5NAotbXNnaWQgIlJzIGFuZCBSZCBtdXN0IGJlIGRpZmZlcmVudCBpbiBNVUwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQ1MzkKLW1zZ2lkICIiCi0iSW5zZXJ0ZWQgbWlzc2luZyAnISc6IGxvYWQvc3RvcmUgbXVsdGlwbGUgYWx3YXlzIHdyaXRlcyBiYWNrIGJhc2UgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQ1NTUgY29uZmlnL3RjLWFybS5jOjQ2NTcKLW1zZ2lkICJFeHByZXNzaW9uIHRvbyBjb21wbGV4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0NTYxCi1tc2dpZCAib25seSBsby1yZWdzIHZhbGlkIGluIGxvYWQvc3RvcmUgbXVsdGlwbGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQ2MDgKLW1zZ2lkICJTeW50YXg6IGxkcnNbYl0gUmQsIFtSYiwgUm9dIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0NjczCi1tc2dpZCAiaW52YWxpZCByZWdpc3RlciBsaXN0IHRvIHB1c2gvcG9wIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0ODExCi1tc2dpZCAiVmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1MjAzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgY29uc3RhbnQgKCV4KSBhZnRlciBmaXh1cFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1MjE1IGNvbmZpZy90Yy1hcm0uYzo1MjM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBpbW1lZGlhdGUgdmFsdWUgZm9yIG9mZnNldCAoJWQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1MjM0IGNvbmZpZy90Yy1hcm0uYzo1MjU3Ci1tc2dpZCAiaW52YWxpZCBsaXRlcmFsIGNvbnN0YW50OiBwb29sIG5lZWRzIHRvIGJlIGNsb3NlclxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1Mjc0Ci1tc2dpZCAic2hpZnQgZXhwcmVzc2lvbiBpcyB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjUyOTIgY29uZmlnL3RjLWFybS5jOjUzMDEKLW1zZ2lkICJJbnZhbGlkIHN3aSBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1MzExCi1tc2dpZCAiSW52YWxpZCBleHByZXNzaW9uIGluIGxvYWQvc3RvcmUgbXVsdGlwbGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjUzNDEgY29uZmlnL3RjLWFybS5jOjUzNTcgY29uZmlnL3RjLW1pcHMuYzoxMDQzMAotbXNnaWQgIkJyYW5jaCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjUzNzYKLW1zZ2lkICJCcmFuY2ggd2l0aCBsaW5rIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTQ0MwotbXNnaWQgIklsbGVnYWwgdmFsdWUgZm9yIGNvLXByb2Nlc3NvciBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU0NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBvZmZzZXQsIHRhcmdldCBub3Qgd29yZCBhbGlnbmVkICgweCUwOFgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NTM3Ci1tc2dpZCAiSW52YWxpZCBpbW1lZGlhdGUgZm9yIHN0YWNrIGFkZHJlc3MgY2FsY3VsYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU1NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBpbW1lZGlhdGUgZm9yIGFkZHJlc3MgY2FsY3VsYXRpb24gKHZhbHVlID0gMHglMDhYKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTU1NQotbXNnaWQgIkludmFsaWQgOGJpdCBpbW1lZGlhdGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU1NjMKLW1zZ2lkICJJbnZhbGlkIDNiaXQgaW1tZWRpYXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NTc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgaW1tZWRpYXRlOiAlZCBpcyB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU1OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWxsZWdhbCBUaHVtYiBzaGlmdCB2YWx1ZTogJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU2MDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQmFkIHJlbG9jYXRpb24gZml4dXAgdHlwZSAoJWQpXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU2NzYKLW1zZ2lkICJMaXRlcmFsIHJlZmVyZW5jZWQgYWNyb3NzIHNlY3Rpb24gYm91bmRyeSAoSW1wbGljaXQgZHVtcD8pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1Njk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsX3JlbG9jYXRpb24gKHR5cGUgJWQpIG5vdCBmaXhlZCB1cCAoSU1NRURJQVRFKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTcwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbF9yZWxvY2F0aW9uICh0eXBlICVkKSBub3QgZml4ZWQgdXAgKE9GRlNFVF9JTU0pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NzI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgcmVwcmVzZW50ICVzIHJlbG9jYXRpb24gaW4gdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQgKCVkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTc0MiBjb25maWcvdGMtbWlwcy5jOjExOTA5IGNvbmZpZy90Yy1zaC5jOjIyNzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG5vdCByZXByZXNlbnQgJXMgcmVsb2NhdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTc1NQotbXNnaWQgIm1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU4MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTm8gb3BlcmF0b3IgLS0gc3RhdGVtZW50IGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTg3NSBjb25maWcvdGMtYXJtLmM6NTkyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJPcGNvZGUgYCVzJyBtdXN0IGhhdmUgc3VmZml4IGZyb20gPCVzPlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1OTAwCi1tc2dpZCAiV2FybmluZzogVXNlIG9mIHRoZSAnbnYnIGNvbmRpdGlvbmFsIGlzIGRlcHJlY2F0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjAxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWdpc3RlciAnJXMnIGRvZXMgbm90IGV4aXN0XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjYwMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWdub3JpbmcgcmVkZWZpbml0aW9uIG9mIHJlZ2lzdGVyIGFsaWFzICclcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjYwMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImlnbm9yaW5nIHJlZGVmaW5pdGlvbiBvZiByZWdpc3RlciBhbGlhcyAnJXMnIHRvIG5vbi1leGlzdGFudCByZWdpc3RlciAnJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2MDM0Ci1tc2dpZCAiaWdub3JpbmcgaW5jb21wbGV0ZSAucmVxIHBzZXVzbyBvcCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjIxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbmlzZWQgQVBDUyBzd2l0Y2ggLW0lcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjMzNiBjb25maWcvdGMtYXJtLmM6NjM0NyBjb25maWcvdGMtYXJtLmM6NjM1OAotIzogY29uZmlnL3RjLWFybS5jOjYzNjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBhcmNoaXRlY3R1cmUgdmFyaWFudCAtbSVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2MzcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgcHJvY2Vzc29yIHZhcmlhbnQgLW0lcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjM5MgotbXNnaWQgIiIKLSIgQVJNIFNwZWNpZmljIEFzc2VtYmxlciBPcHRpb25zOlxuIgotIiAgLW1bYXJtXVs8cHJvY2Vzc29yIG5hbWU+XSBzZWxlY3QgcHJvY2Vzc29yIHZhcmlhbnRcbiIKLSIgIC1tW2FybV12WzJ8MmF8M3wzbXw0fDR0XSAgc2VsZWN0IGFyY2hpdGVjdHVyZSB2YXJpYW50XG4iCi0iICAtbXRodW1iICAgICAgICAgICAgICAgICAgIG9ubHkgYWxsb3cgVGh1bWIgaW5zdHJ1Y3Rpb25zXG4iCi0iICAtbXRodW1iLWludGVyd29yayAgICAgICAgIG1hcmsgdGhlIGFzc2VtYmxlZCBjb2RlIGFzIHN1cHBvcnRpbmcgIgotImludGVyd29ya2luZ1xuIgotIiAgLW1hbGwgICAgICAgICAgICAgICAgICAgICBhbGxvdyBhbnkgaW5zdHJ1Y3Rpb25cbiIKLSIgIC1tZnBhMTAsIC1tZnBhMTEgICAgICAgICAgc2VsZWN0IGZsb2F0aW5nIHBvaW50IGFyY2hpdGVjdHVyZVxuIgotIiAgLW1mcGUtb2xkICAgICAgICAgICAgICAgICBkb24ndCBhbGxvdyBmbG9hdGluZy1wb2ludCBtdWx0aXBsZSAiCi0iaW5zdHJ1Y3Rpb25zXG4iCi0iICAtbW5vLWZwdSAgICAgICAgICAgICAgICAgIGRvbid0IGFsbG93IGFueSBmbG9hdGluZy1wb2ludCBpbnN0cnVjdGlvbnMuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjY0MDMKLW1zZ2lkICIgIC1rICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgUElDIGNvZGUuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjY0MDcKLW1zZ2lkICIiCi0iICAtbWFwY3MtMzIsIC1tYXBjcy0yNiAgICAgIHNwZWNpZnkgd2hpY2ggQVJNIFByb2NlZHVyZSBDYWxsaW5nIFN0YW5kYXJkIHRvICIKLSJ1c2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjQxMAotbXNnaWQgIiAgLW1hcGNzLWZsb2F0ICAgICAgICAgICAgICBmbG9hdGluZyBwb2ludCBhcmdzIGFyZSBwYXNzZWQgaW4gRlAgcmVnc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2NDEzCi1tc2dpZCAiIgotIiAgLW1hcGNzLXJlZW50cmFudCAgICAgICAgICB0aGUgY29kZSBpcyBwb3NpdGlvbiBpbmRlcGVuZGVudC9yZWVudHJhbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjQxOAotbXNnaWQgIiAgLW1vYWJpICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBvbGQgRUxGIEFCSVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2NDIzCi1tc2dpZCAiIgotIiAgLUVCICAgICAgICAgICAgICAgICAgICAgICBhc3NlbWJsZSBjb2RlIGZvciBhIGJpZyBlbmRpYW4gY3B1XG4iCi0iICAtRUwgICAgICAgICAgICAgICAgICAgICAgIGFzc2VtYmxlIGNvZGUgZm9yIGEgbGl0dGxlIGVuZGlhbiBjcHVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjU5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5leHBlY3RlZCBmdW5jdGlvbiB0eXBlOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjIxOAotbXNnaWQgIiIKLSJEMTBWIG9wdGlvbnM6XG4iCi0iLU8gICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemUuICBXaWxsIGRvIHNvbWUgb3BlcmF0aW9ucyBpbiBwYXJhbGxlbC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjUyMSBjb25maWcvdGMtZDEwdi5jOjYwMyBjb25maWcvdGMtZDMwdi5jOjYzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZTogJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo2NjQKLW1zZ2lkICJJbnN0cnVjdGlvbiBtdXN0IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIHdpdGggYW5vdGhlciBpbnN0cnVjdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo3MTYKLW1zZ2lkICJJbnN0cnVjdGlvbiBtdXN0IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NzE5Ci1tc2dpZCAiTG9uZyBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBjb21iaW5lZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo3NTkKLW1zZ2lkICJPbmUgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NzY0IGNvbmZpZy90Yy1kMzB2LmM6ODQzCi1tc2dpZCAiVHdvIElVIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NzY2IGNvbmZpZy90Yy1kMTB2LmM6Nzc0IGNvbmZpZy90Yy1kMTB2LmM6Nzg5Ci0jOiBjb25maWcvdGMtZDEwdi5jOjgwMiBjb25maWcvdGMtZDMwdi5jOjg0NCBjb25maWcvdGMtZDMwdi5jOjg1MwotbXNnaWQgIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NzcyIGNvbmZpZy90Yy1kMzB2LmM6ODUwCi1tc2dpZCAiVHdvIE1VIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NzkzIGNvbmZpZy90Yy1kMzB2LmM6ODY5Ci1tc2dpZCAiSVUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBpbiB0aGUgbGVmdCBjb250YWluZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo4MDYgY29uZmlnL3RjLWQzMHYuYzo4ODIKLW1zZ2lkICJNVSBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIGluIHRoZSByaWdodCBjb250YWluZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo4MTAgY29uZmlnL3RjLWQzMHYuYzo4OTAKLW1zZ2lkICJ1bmtub3duIGV4ZWN1dGlvbiB0eXBlIHBhc3NlZCB0byB3cml0ZV8yX3Nob3J0KCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMDIzIGNvbmZpZy90Yy1kMTB2LmM6MTAzNyBjb25maWcvdGMtaDgzMDAuYzoxMjc5Ci0jOiBjb25maWcvdGMtaDg1MDAuYzoxMTIyIGNvbmZpZy90Yy1tY29yZS5jOjcwOSBjb25maWcvdGMtc2guYzoxMDQwCi0jOiBjb25maWcvdGMtejhrLmM6MTIyMwotbXNnaWQgImNhbid0IGZpbmQgb3Bjb2RlICIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjEwNTAgY29uZmlnL3RjLWQxMHYuYzoxMDY4IGNvbmZpZy90Yy1kMzB2LmM6MTM2OAotbXNnaWQgIlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjExMTYgY29uZmlnL3RjLWQzMHYuYzoxNTAzCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb3Bjb2RlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjExOTcgY29uZmlnL3RjLWQxMHYuYzoxMzQzIGNvbmZpZy90Yy10aWM4MC5jOjUzNwotbXNnaWQgImJhZCBvcGNvZGUgb3Igb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMjQ2IGNvbmZpZy90Yy1tNjhrLmM6NDExMAotbXNnaWQgInZhbHVlIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjEzMTgKLW1zZ2lkICJpbGxlZ2FsIG9wZXJhbmQgLSByZWdpc3RlciBuYW1lIGZvdW5kIHdoZXJlIG5vbmUgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMzU0IGNvbmZpZy90Yy10aWM4MC5jOjU0OAotbXNnaWQgIlJlZ2lzdGVyIG51bWJlciBtdXN0IGJlIEVWRU4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMzg1IGNvbmZpZy90Yy1kMzB2LmM6MTc1NCBjb25maWcvdGMtbW4xMDIwMC5jOjEyMzQKLSM6IGNvbmZpZy90Yy1tbjEwMzAwLmM6MTc4NiBjb25maWcvdGMtcHBjLmM6NDk5NyBjb25maWcvdGMtdjg1MC5jOjIyNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVsb2MgJWQgbm90IHN1cHBvcnRlZCBieSBvYmplY3QgZmlsZSBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxNDk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxpbmUgJWQ6IHJlcCBvciByZXBpIG11c3QgaW5jbHVkZSBhdCBsZWFzdCA0IGluc3RydWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjE1MTcgY29uZmlnL3RjLWQzMHYuYzoxOTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxpbmUgJWQ6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlOiAweCV4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlJlZ2lzdGVyIG5hbWUgJXMgY29uZmxpY3RzIHdpdGggc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoyNzYKLW1zZ2lkICIiCi0iXG4iCi0iRDMwViBvcHRpb25zOlxuIgotIi1PICAgICAgICAgICAgICAgICAgICAgIE1ha2UgYWRqYWNlbnQgc2hvcnQgaW5zdHJ1Y3Rpb25zIHBhcmFsbGVsIGlmICIKLSJwb3NzaWJsZS5cbiIKLSItbiAgICAgICAgICAgICAgICAgICAgICBXYXJuIGFib3V0IGFsbCBOT1BzIGluc2VydGVkIGJ5IHRoZSBhc3NlbWJsZXIuXG4iCi0iLU5cdFx0XHRXYXJuIGFib3V0IE5PUHMgaW5zZXJ0ZWQgYWZ0ZXIgd29yZCBtdWx0aXBsaWVzLlxuIgotIi1jICAgICAgICAgICAgICAgICAgICAgIFdhcm4gYWJvdXQgc3ltYm9scyB3aG9lcyBuYW1lcyBtYXRjaCByZWdpc3RlciAiCi0ibmFtZXMuXG4iCi0iLUMgICAgICAgICAgICAgICAgICAgICAgT3Bwb3NpdGUgb2YgLUMuICAtYyBpcyB0aGUgZGVmYXVsdC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjQ1MAotbXNnaWQgInVuZXhwZWN0ZWQgMTItYml0IHJlbG9jIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzo0NTcKLW1zZ2lkICJ1bmV4cGVjdGVkIDE4LWJpdCByZWxvYyB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6NzAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIE5PUCBpbnNlcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjcwMgotbXNnaWQgInNlcXVlbnRpYWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzo3MDIKLW1zZ2lkICJwYXJhbGxlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjgzOQotbXNnaWQgIkluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6ODUyIGNvbmZpZy90Yy1kMzB2LmM6ODU5IGNvbmZpZy90Yy1kMzB2LmM6ODc1Ci0jOiBjb25maWcvdGMtZDMwdi5jOjg4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJFeGVjdXRpbmcgJXMgaW4gSVUgbWF5IG5vdCB3b3JrIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6ODcxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNwZWNpYWwgbGVmdCBpbnN0cnVjdGlvbiBgJXMnIGtpbGxzIGluc3RydWN0aW9uIGAlcycgaW4gcmlnaHQgY29udGFpbmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTI1MCBjb25maWcvdGMtZDMwdi5jOjEyNjcKLW1zZ2lkICJDYW5ub3QgYXNzZW1ibGUgaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxMjUyCi1tc2dpZCAiRmlyc3Qgb3Bjb2RlIGlzIGxvbmcuICBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTMyMAotbXNnaWQgIndvcmQgb2YgTk9QcyBhZGRlZCBiZXR3ZWVuIHdvcmQgbXVsdGlwbHkgYW5kIGxvYWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxMzIyCi1tc2dpZCAid29yZCBvZiBOT1BzIGFkZGVkIGJldHdlZW4gd29yZCBtdWx0aXBseSBhbmQgMTYtYml0IG11bHRpcGx5IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTM1MgotbXNnaWQgIkluc3RydWN0aW9uIHVzZXMgbG9uZyB2ZXJzaW9uLCBzbyBpdCBjYW5ub3QgYmUgbWl4ZWQgYXMgc3BlY2lmaWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTQzNiBjb25maWcvdGMtZDMwdi5jOjE0NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBjb25kaXRpb24gY29kZTogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxNDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNtcHUgZG9lc24ndCBzdXBwb3J0IGNvbmRpdGlvbiBjb2RlICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTUxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kcyBmb3Igb3Bjb2RlIGAlcycgZG8gbm90IG1hdGNoIGFueSB2YWxpZCBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxNzI3Ci1tc2dpZCAiT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTgyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgYWRkcmVzcyBvZiBzeW1ib2wgJyVzJyBpbnRvIGEgYnl0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE4MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIHZhbHVlICV4IGludG8gYSBieXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTgzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgYWRkcmVzcyBvZiBzeW1ib2wgJyVzJyBpbnRvIGEgc2hvcnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxODM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSB2YWx1ZSAleCBpbnRvIGEgc2hvcnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxODQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSBhZGRyZXNzIG9mIHN5bWJvbCAnJXMnIGludG8gYSBxdWFkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MjAxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJ2YWx1ZSB0b28gbGFyZ2UgdG8gZml0IGluICVkIGJpdHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoyMTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFsaWdubWVudCB0b28gbGFyZ2U6ICVkIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MjU0IGNvbmZpZy90Yy1oODMwMC5jOjI2MgotbXNnaWQgIlJlZyBub3QgdmFsaWQgZm9yIEg4LzMwMCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzo0MjMgY29uZmlnL3RjLWg4MzAwLmM6NDI2IGNvbmZpZy90Yy1oODMwMC5jOjQyOQotIzogY29uZmlnL3RjLWg4MzAwLmM6NDMzCi1tc2dpZCAiSW52YWxpZCByZWdpc3RlciBsaXN0IGZvciBsZG0vc3RtXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6NDkwIGNvbmZpZy90Yy1oODMwMC5jOjU1MyBjb25maWcvdGMtaDgzMDAuYzo1NjAKLW1zZ2lkICJXcm9uZyBzaXplIHBvaW50ZXIgcmVnaXN0ZXIgZm9yIGFyY2hpdGVjdHVyZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6NTE4IGNvbmZpZy90Yy1oODMwMC5jOjUyNyBjb25maWcvdGMtaDgzMDAuYzo1MzcKLW1zZ2lkICJleHBlY3RlZCBAKGV4cCwgcmVnMTYpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjYxNwotbXNnaWQgImV4cGVjdCA6OCBvciA6MTYgaGVyZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzo4MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZCAlczB4JWx4IG91dCBvZiByYW5nZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6OTEwCi1tc2dpZCAiQ2FuJ3Qgd29yayBvdXQgc2l6ZSBvZiBvcGVyYW5kLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjk2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJPcGNvZGUgYCVzJyB3aXRoIHRoZXNlIG9wZXJhbmQgdHlwZXMgbm90IGF2YWlsYWJsZSBpbiBIOC8zMDAgbW9kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMDE2IGNvbmZpZy90Yy1oODMwMC5jOjEwMzYKLW1zZ2lkICJOZWVkICMxIG9yICMyIGhlcmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTAzMQotbXNnaWQgIiM0IG5vdCB2YWxpZCBvbiBIOC8zMDAuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjExMTIgY29uZmlnL3RjLWg4MzAwLmM6MTE1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJicmFuY2ggb3BlcmFuZCBoYXMgb2RkIG9mZnNldCAoJWx4KVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjExOTEKLW1zZ2lkICJkZXN0aW5hdGlvbiBvcGVyYW5kIG11c3QgYmUgMTYgYml0IHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEyMDEKLW1zZ2lkICJzb3VyY2Ugb3BlcmFuZCBtdXN0IGJlIDggYml0IHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEyMDkKLW1zZ2lkICJkZXN0aW5hdGlvbiBvcGVyYW5kIG11c3QgYmUgMTZiaXQgYWJzb2x1dGUgYWRkcmVzcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMjE2Ci1tc2dpZCAiZGVzdGluYXRpb24gb3BlcmFuZCBtdXN0IGJlIDggYml0IHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEyMjUKLW1zZ2lkICJzb3VyY2Ugb3BlcmFuZCBtdXN0IGJlIDE2Yml0IGFic29sdXRlIGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTIzMwotbXNnaWQgImludmFsaWQgb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTI5MCBjb25maWcvdGMtaDg1MDAuYzoxMTI5IGNvbmZpZy90Yy1taXBzLmM6ODUxMwotIzogY29uZmlnL3RjLXNoLmM6MTA0NyBjb25maWcvdGMtdzY1LmM6NzU5IGNvbmZpZy90Yy16OGsuYzoxMjM1Ci1tc2dpZCAidW5rbm93biBvcGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTMzNgotbXNnaWQgIm1pc21hdGNoIGJldHdlZW4gb3Bjb2RlIHNpemUgYW5kIG9wZXJhbmQgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMzQ4IGNvbmZpZy90Yy1oODUwMC5jOjExNTcgY29uZmlnL3RjLXNoLmM6MTE0NAotIzogY29uZmlnL3RjLXc2NS5jOjc5MSBjb25maWcvdGMtejhrLmM6MTI5MAotbXNnaWQgImNhbGwgdG8gdGNfY3Jhd2xfc3ltYm9sX2NoYWluIFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEzNjIgY29uZmlnL3RjLWg4NTAwLmM6MTE3MSBjb25maWcvdGMtc2guYzoxMTUxCi0jOiBjb25maWcvdGMtdzY1LmM6ODA1IGNvbmZpZy90Yy16OGsuYzoxMzA0Ci1tc2dpZCAiY2FsbCB0byB0Y19oZWFkZXJzX2hvb2sgXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTQ1MSBjb25maWcvdGMtaDg1MDAuYzoxMjYwIGNvbmZpZy90Yy16OGsuYzoxNDE1Ci1tc2dpZCAiY2FsbCB0byB0Y19hb3V0X2ZpeF90b19jaGFycyBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxNDYxIGNvbmZpZy90Yy16OGsuYzoxNDI1Ci1tc2dpZCAiY2FsbCB0byBtZF9jb252ZXJ0X2ZyYWcgXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTUwNiBjb25maWcvdGMtejhrLmM6MTUwMAotbXNnaWQgImNhbGwgdG9tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzozMzcKLW1zZ2lkICI6MjQgbm90IHZhbGlkIGZvciB0aGlzIG9wY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzozNDQKLW1zZ2lkICJleHBlY3QgOjgsOjE2IG9yIDoyNCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzo0MDEKLW1zZ2lkICJzeW50YXggZXJyb3IgaW4gcmVnIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6NDE5Ci1tc2dpZCAibWlzc2luZyBmaW5hbCByZWdpc3RlciBpbiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzo1MDYgY29uZmlnL3RjLWg4NTAwLmM6NTEzIGNvbmZpZy90Yy1oODUwMC5jOjUxOQotbXNnaWQgImV4cGVjdGVkIEAoZXhwLCBSbikiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6NTM1Ci1tc2dpZCAiQFJuKyBuZWVkcyB3b3JkIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjU0NQotbXNnaWQgIkBSbiBuZWVkcyB3b3JkIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjg0NSBjb25maWcvdGMtc2guYzo4NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5oYW5kbGVkICVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6ODczIGNvbmZpZy90Yy1zaC5jOjg2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjk2MyBjb25maWcvdGMtc2guYzo5ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmFpbGVkIGZvciAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjExNDUgY29uZmlnL3RjLXNoLmM6MTA4MiBjb25maWcvdGMtdzY1LmM6Nzc5Ci1tc2dpZCAiaW52YWxpZCBvcGVyYW5kcyBmb3Igb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTExNAotbXNnaWQgIk1pc3NpbmcgLmV4aXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjExMTcKLW1zZ2lkICJNaXNzaW5nIC5wcm9jZW5kXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxMTI2Ci1tc2dpZCAiTm90IGluIGEgc3BhY2UuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxMTI5Ci1tc2dpZCAiTm90IGluIGEgc3Vic3BhY2UuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxMjkxCi1tc2dpZCAiSW52YWxpZCBmaWVsZCBzZWxlY3Rvci4gIEFzc3VtaW5nIEYlJS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxMzIyCi1tc2dpZCAiLVIgb3B0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyB0YXJnZXQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTMzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBgJXMnOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTM0NCBjb25maWcvdGMtaTg2MC5jOjE5MSBjb25maWcvdGMtc3BhcmMuYzo3MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGxvc2luZyBvcGNvZGU6IGAlcycgXCIlc1wiXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxNDA2IGNvbmZpZy90Yy1ocHBhLmM6NjUzOSBjb25maWcvdGMtaHBwYS5jOjY1OTEKLW1zZ2lkICJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIChjb3JydXB0ZWQgbGFiZWwgY2hhaW4pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTQwOSBjb25maWcvdGMtaHBwYS5jOjY1OTQKLW1zZ2lkICJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTUxOCBjb25maWcvdGMtaHBwYS5jOjQ0MzAKLW1zZ2lkICJjb3VsZCBub3QgdXBkYXRlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE3MTQKLW1zZ2lkICJJbnZhbGlkIEluZGV4ZWQgTG9hZCBDb21wbGV0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTcyMwotbXNnaWQgIkludmFsaWQgSW5kZXhlZCBMb2FkIENvbXBsZXRlciBTeW50YXguIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTc1NgotbXNnaWQgIkludmFsaWQgU2hvcnQgTG9hZC9TdG9yZSBDb21wbGV0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTgwNyBjb25maWcvdGMtaHBwYS5jOjE4MTIKLW1zZ2lkICJJbnZhbGlkIFN0b3JlIEJ5dGVzIFNob3J0IENvbXBsZXRlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE4MjIgY29uZmlnL3RjLWhwcGEuYzoxODY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgQ29tcGFyZS9TdWJ0cmFjdCBDb25kaXRpb246ICVjIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTg0MCBjb25maWcvdGMtaHBwYS5jOjIzNzUKLW1zZ2lkICJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE4ODEKLW1zZ2lkICJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTk3MCBjb25maWcvdGMtaHBwYS5jOjIwNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBBZGQgQ29uZGl0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjIxMzIgY29uZmlnL3RjLWhwcGEuYzoyMjQ1Ci1tc2dpZCAiSW52YWxpZCBMb2dpY2FsIEluc3RydWN0aW9uIENvbmRpdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoyMzAxCi1tc2dpZCAiSW52YWxpZCBTaGlmdC9FeHRyYWN0L0RlcG9zaXQgQ29uZGl0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjIzMzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBCaXQgQnJhbmNoIENvbmRpdGlvbjogJWMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoyNzc2IGNvbmZpZy90Yy1ocHBhLmM6Mjc5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIENCaXQgU3BlY2lmaWNhdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoyOTc3IGNvbmZpZy90Yy1ocHBhLmM6MzAxMCBjb25maWcvdGMtaHBwYS5jOjMwNDcKLW1zZ2lkICJCcmFuY2ggdG8gdW5hbGlnbmVkIGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozMTQ3Ci1tc2dpZCAiSW52YWxpZCBTRlUgaWRlbnRpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjMyMDcKLW1zZ2lkICJJbnZhbGlkIENPUFIgaWRlbnRpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjM0NDcgY29uZmlnL3RjLWhwcGEuYzozNDczIGNvbmZpZy90Yy1ocHBhLmM6MzQ5OAotIzogY29uZmlnL3RjLWhwcGEuYzozNTIzIGNvbmZpZy90Yy1ocHBhLmM6MzU0OAotbXNnaWQgIkludmFsaWQgcmVnaXN0ZXIgZm9yIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZCBvciBmbXB5c3ViIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzU3MgotbXNnaWQgIkludmFsaWQgRmxvYXRpbmcgUG9pbnQgT3BlcmFuZCBGb3JtYXQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzU5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIG9wZXJhbmRzICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDEzMAotbXNnaWQgIlVua25vd24gcmVsb2NhdGlvbiBlbmNvdW50ZXJlZCBpbiBtZF9hcHBseV9maXguIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDE0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJubyBocHBhX2ZpeHVwIGVudHJ5IGZvciB0aGlzIGZpeHVwIChmaXhQID0gMHgleCwgdHlwZSA9IDB4JXgpXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0MjgyIGNvbmZpZy90Yy1ocHBhLmM6NDMwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmRlZmluZWQgcmVnaXN0ZXI6ICclcycuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDM0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJOb24tYWJzb2x1dGUgc3ltYm9sOiAnJXMnLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQzNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5kZWZpbmVkIGFic29sdXRlIGNvbnN0YW50OiAnJXMnLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ0NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBGUCBDb21wYXJlIENvbmRpdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NTI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgRlRFU1QgY29tcGxldGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ1OTMgY29uZmlnL3RjLWhwcGEuYzo0NjMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgRlAgT3BlcmFuZCBGb3JtYXQ6ICUzcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ3MTMKLW1zZ2lkICJCYWQgc2VnbWVudCBpbiBleHByZXNzaW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ3NzIKLW1zZ2lkICJCYWQgc2VnbWVudCAoc2hvdWxkIGJlIGFic29sdXRlKS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0ODcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgYXJndW1lbnQgbG9jYXRpb246ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0OTAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgYXJndW1lbnQgZGVzY3JpcHRpb246ICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDkyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIE51bGxpZmljYXRpb246ICglYykiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1NjU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgLkNBTEwgYXJndW1lbnQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTc3NgotbXNnaWQgIi5jYWxsaW5mbyBpcyBub3Qgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1Nzk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkZSQU1FIHBhcmFtZXRlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgODogJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjU4MTUKLW1zZ2lkICJWYWx1ZSBmb3IgRU5UUllfR1IgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMy4uMThcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjU4MjcKLW1zZ2lkICJWYWx1ZSBmb3IgRU5UUllfRlIgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMTIuLjIxXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1ODM3Ci1tc2dpZCAiVmFsdWUgZm9yIEVOVFJZX1NSIG11c3QgYmUgM1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTg5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIC5DQUxMSU5GTyBhcmd1bWVudDogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1OTgzCi1tc2dpZCAiVGhlIC5FTlRFUiBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjU5OTcKLW1zZ2lkICJNaXNwbGFjZWQgLmVudHJ5LiBJZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjYwMDEKLW1zZ2lkICJNaXNzaW5nIC5jYWxsaW5mby4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2MDQ5Ci1tc2dpZCAiLlJFRyBtdXN0IHVzZSBhIGxhYmVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjA1MQotbXNnaWQgIi5FUVUgbXVzdCB1c2UgYSBsYWJlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjYxMDIKLW1zZ2lkICIuRVhJVCBtdXN0IGFwcGVhciB3aXRoaW4gYSBwcm9jZWR1cmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2MTA2Ci1tc2dpZCAiTWlzc2luZyAuY2FsbGluZm8iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2MTEwCi1tc2dpZCAiTm8gLkVOVFJZIGZvciB0aGlzIC5FWElUIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjEzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3QgZGVmaW5lIGV4cG9ydCBzeW1ib2w6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2MTkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVzaW5nIEVOVFJZIHJhdGhlciB0aGFuIENPREUgaW4gZXhwb3J0IGRpcmVjdGl2ZSBmb3IgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2MjkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuZGVmaW5lZCAuRVhQT1JULy5JTVBPUlQgYXJndW1lbnQgKGlnbm9yZWQpOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjYzNzMKLW1zZ2lkICJNaXNzaW5nIGxhYmVsIG5hbWUgb24gLkxBQkVMIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjM3OAotbXNnaWQgImV4dHJhIC5MQUJFTCBhcmd1bWVudHMgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2MzkzCi1tc2dpZCAiVGhlIC5MRUFWRSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjY0MjYKLW1zZ2lkICJVbnJlY29nbml6ZWQgLkxFVkVMIGFyZ3VtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2NDYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCBkZWZpbmUgc3RhdGljIHN5bWJvbDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjY0OTMKLW1zZ2lkICJOZXN0ZWQgcHJvY2VkdXJlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjY1MDMKLW1zZ2lkICJDYW5ub3QgYWxsb2NhdGUgdW53aW5kIGRlc2NyaXB0b3JcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjY1OTgKLW1zZ2lkICJtaXNwbGFjZWQgLnByb2NlbmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2NjAxCi1tc2dpZCAiTWlzc2luZyAuY2FsbGluZm8gZm9yIHRoaXMgcHJvY2VkdXJlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjYwNAotbXNnaWQgIk1pc3NpbmcgLkVYSVQgZm9yIGEgLkVOVFJZIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjcwNAotbXNnaWQgIkludmFsaWQgLlNQQUNFIGFyZ3VtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6Njc1MgotbXNnaWQgIkNhbid0IGNoYW5nZSBzcGFjZXMgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uIElnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2ODc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuZGVmaW5lZCBzcGFjZTogJyVzJyBBc3N1bWluZyBzcGFjZSBudW1iZXIgPSAwLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjY5MjEKLW1zZ2lkICJNdXN0IGJlIGluIGEgc3BhY2UgYmVmb3JlIGNoYW5naW5nIG9yIGRlY2xhcmluZyBzdWJzcGFjZXMuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2OTI1Ci1tc2dpZCAiQ2FuJ3QgY2hhbmdlIHN1YnNwYWNlcyB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbi4gSWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjY5NjEKLW1zZ2lkICJQYXJhbWV0ZXJzIG9mIGFuIGV4aXN0aW5nIHN1YnNwYWNlIGNhbid0IGJlIG1vZGlmaWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NzAxNAotbXNnaWQgIkFsaWdubWVudCBtdXN0IGJlIGEgcG93ZXIgb2YgMiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjcwNTYKLW1zZ2lkICJGSVJTVCBub3Qgc3VwcG9ydGVkIGFzIGEgLlNVQlNQQUNFIGFyZ3VtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NzA1OAotbXNnaWQgIkludmFsaWQgLlNVQlNQQUNFIGFyZ3VtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NzA5OAotbXNnaWQgIklnbm9yaW5nIHN1YnNwYWNlIGRlY2wgZHVlIHRvIEVMRiBCRkQgYnVncy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo3MjYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGVycm9yOiBVbmFibGUgdG8gZmluZCBjb250YWluaW5nIHNwYWNlIGZvciAlcy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo3MzAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIk91dCBvZiBtZW1vcnk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgc3BhY2UgY2hhaW4gZW50cnk6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo3Mzg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk91dCBvZiBtZW1vcnk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgc3Vic3BhY2UgY2hhaW4gZW50cnk6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo4MDQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCAnJXMnIGNvdWxkIG5vdCBiZSBjcmVhdGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjgwNDgKLW1zZ2lkICJObyBtZW1vcnkgZm9yIHN5bWJvbCBuYW1lLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjUwMgotbXNnaWQgInNhbWUgdHlwZSBvZiBwcmVmaXggdXNlZCB0d2ljZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjUzNgotbXNnaWQgIkJhZCBhcmd1bWVudCB0byBzeW50YXggZGlyZWN0aXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjYxOSBjb25maWcvdGMtbTY4ay5jOjM2MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgRXJyb3I6ICBDYW4ndCBoYXNoICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjg1MAotbXNnaWQgIlVua25vd24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzo4OTggY29uZmlnL3RjLWkzODYuYzo0MzYwIGNvbmZpZy90Yy1tNjhrLmM6NzYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6OTA4IGNvbmZpZy90Yy1pMzg2LmM6NDM2MyBjb25maWcvdGMtbTY4ay5jOjc2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IGRvICVkIGJ5dGUgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjEwMDkgY29uZmlnL3RjLWkzODYuYzoxMDk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIHN1Y2ggMzg2IGluc3RydWN0aW9uOiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTAxOAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGNoYXJhY3RlciAlcyBpbiBtbmVtb25pYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjEwMjUKLW1zZ2lkICJleHBlY3RpbmcgcHJlZml4OyBnb3Qgbm90aGluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjEwMjcKLW1zZ2lkICJleHBlY3RpbmcgbW5lbW9uaWM7IGdvdCBub3RoaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTA0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWR1bmRhbnQgJXMgcHJlZml4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTEwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJleHBlY3Rpbmcgc3RyaW5nIGluc3RydWN0aW9uIGFmdGVyIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMTI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgY2hhcmFjdGVyICVzIGJlZm9yZSBvcGVyYW5kICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTE0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmJhbGFuY2VkIHBhcmVudGhlc2lzIGluIG9wZXJhbmQgJWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTE0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmJhbGFuY2VkIGJyYWNrZXRzIGluIG9wZXJhbmQgJWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTE1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGNoYXJhY3RlciAlcyBpbiBvcGVyYW5kICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTE4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJzcHVyaW91cyBvcGVyYW5kczsgKCVkIG9wZXJhbmRzL2luc3RydWN0aW9uIG1heCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMjAxCi1tc2dpZCAiZXhwZWN0aW5nIG9wZXJhbmQgYWZ0ZXIgJywnOyBnb3Qgbm90aGluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjEyMDYKLW1zZ2lkICJleHBlY3Rpbmcgb3BlcmFuZCBiZWZvcmUgJywnOyBnb3Qgbm90aGluZyIKLW1zZ3N0ciAiIgotCi0jLiB3ZSBmb3VuZCBubyBtYXRjaAotIzogY29uZmlnL3RjLWkzODYuYzoxNDMzCi0jLCBjLWZvcm1hdAotbXNnaWQgInN1ZmZpeCBvciBvcGVyYW5kcyBpbnZhbGlkIGZvciBgJXMnIgotbXNnc3RyICIiCi0KLSMuIFdhcm4gdGhlbSB0aGF0IGEgZGF0YSBvciBhZGRyZXNzIHNpemUgcHJlZml4IGRvZXNuJ3QgYWZmZWN0Ci0jLiBhc3NlbWJseSBvZiB0aGUgbmV4dCBsaW5lIG9mIGNvZGUuCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE0NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3RhbmQtYWxvbmUgYCVzJyBwcmVmaXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxNDY2IGNvbmZpZy90Yy1pMzg2LmM6MTQ4MQotbXNnaWQgImAlcycgb3BlcmFuZCAlZCBtdXN0IHVzZSBgJSVlcycgc2VnbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE1NDcgY29uZmlnL3RjLWkzODYuYzoxNTg2IGNvbmZpZy90Yy1pMzg2LmM6MTYxMwotbXNnaWQgInVzaW5nIGAlJSVzJyBpbnN0ZWFkIG9mIGAlJSVzJyBkdWUgdG8gYCVjJyBzdWZmaXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxNTU4IGNvbmZpZy90Yy1pMzg2LmM6MTU3NSBjb25maWcvdGMtaTM4Ni5jOjE2MDIKLW1zZ2lkICJgJSUlcycgbm90IGFsbG93ZWQgd2l0aCBgJXMlYyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxNjQyIGNvbmZpZy90Yy1pMzg2LmM6MTY2MgotbXNnaWQgIm5vIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBnaXZlbjsgY2FuJ3QgZGV0ZXJtaW5lIGltbWVkaWF0ZSBzaXplIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTY4NwotbXNnaWQgIiIKLSJubyBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggZ2l2ZW4gYW5kIG5vIHJlZ2lzdGVyIG9wZXJhbmRzOyBjYW4ndCBzaXplICIKLSJpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jLiByZXZlcnNlZCBhcmd1bWVudHMgb24gZmFkZHAsIGZzdWJwLCBldGMuCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE4MDAKLW1zZ2lkICJ0cmFuc2xhdGluZyB0byBgJXMgJSUlcywlJSVzJyIKLW1zZ3N0ciAiIgotCi0jLiBleHRyYW5lb3VzIGBsJyBzdWZmaXggb24gZnAgaW5zbgotIzogY29uZmlnL3RjLWkzODYuYzoxODA3Ci1tc2dpZCAidHJhbnNsYXRpbmcgdG8gYCVzICUlJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjAzMwotbXNnaWQgInlvdSBjYW4ndCBgcG9wICUlY3MnIgotbXNnc3RyICIiCi0KLSMuIFVuaXhXYXJlIGZzdWIgbm8gYXJncyBpcyBhbGlhcyBmb3IgZnN1YnAsIGZhZGQgLT4gZmFkZHAsIGV0YwotIzogY29uZmlnL3RjLWkzODYuYzoyMDY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInRyYW5zbGF0aW5nIHRvIGAlc3AnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjA5NSBjb25maWcvdGMtaTM4Ni5jOjIxOTggY29uZmlnL3RjLWkzODYuYzoyMjU4Ci1tc2dpZCAic2tpcHBpbmcgcHJlZml4ZXMgb24gdGhpcyBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjIxMTUgY29uZmlnL3RjLWkzODYuYzoyMjIyIGNvbmZpZy90Yy1pMzg2LmM6MjI3MQotbXNnaWQgIjE2LWJpdCBqdW1wIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjIyMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYCVzJyBvbmx5IHRha2VzIGJ5dGUgZGlzcGxhY2VtZW50OyAlbGQgc2hvcnRlbmVkIHRvICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjI4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBoYW5kbGUgbm9uIGFic29sdXRlIHNlZ21lbnQgaW4gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjI1MzcKLW1zZ2lkICJPbmx5IDEgb3IgMiBpbW1lZGlhdGUgb3BlcmFuZHMgYXJlIGFsbG93ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyNTY4IGNvbmZpZy90Yy1pMzg2LmM6Mjc5NwotbXNnaWQgIkdPVCByZWxvY2F0aW9ucyBub3Qgc3VwcG9ydGVkIGluIDE2IGJpdCBtb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjU4OSBjb25maWcvdGMtaTM4Ni5jOjI4MTgKLW1zZ2lkICJCYWQgcmVsb2Mgc3BlY2lmaWVyIGluIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyNjA2IGNvbmZpZy90Yy1pMzg2LmM6Mjg1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJZ25vcmluZyBqdW5rIGAlcycgYWZ0ZXIgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jLiBtaXNzaW5nIG9yIGJhZCBleHByIGJlY29tZXMgYWJzb2x1dGUgMAotIzogY29uZmlnL3RjLWkzODYuYzoyNjEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIk1pc3Npbmcgb3IgaW52YWxpZCBpbW1lZGlhdGUgZXhwcmVzc2lvbiBgJXMnIHRha2VuIGFzIDAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyNjQ4IGNvbmZpZy90Yy1pMzg2LmM6Mjg3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmltcGxlbWVudGVkIHNlZ21lbnQgdHlwZSAlZCBpbiBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjY5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJleHBlY3Rpbmcgc2NhbGUgZmFjdG9yIG9mIDEsIDIsIDQsIG9yIDg6IGdvdCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjY5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzY2FsZSBmYWN0b3Igb2YgJWQgd2l0aG91dCBhbiBpbmRleCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjMwNDUgY29uZmlnL3RjLWkzODYuYzozMDUxIGNvbmZpZy90Yy1pMzg2LmM6MzA2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgc2VnbWVudCBuYW1lIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozMjI2IGNvbmZpZy90Yy1pMzg2LmM6MzQ4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ0b28gbWFueSBtZW1vcnkgcmVmZXJlbmNlcyBmb3IgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjMzMzcgY29uZmlnL3RjLWkzODYuYzozMzUwIGNvbmZpZy90Yy1pMzg2LmM6MzY2MgotIzogY29uZmlnL3RjLWkzODYuYzozNjc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImAlcycgaXMgbm90IGEgdmFsaWQgJXMgYml0IGJhc2UvaW5kZXggZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjM0MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIG1lbW9yeSBvcGVyYW5kIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozNDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkp1bmsgYCVzJyBhZnRlciByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjM1OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwZWN0aW5nIGAsJyBvciBgKScgYWZ0ZXIgaW5kZXggcmVnaXN0ZXIgaW4gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjM2MDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwZWN0aW5nIGApJyBhZnRlciBzY2FsZSBmYWN0b3IgaW4gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjM2MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwZWN0aW5nIGluZGV4IHJlZ2lzdGVyIG9yIHNjYWxlIGZhY3RvciBhZnRlciBgLCc7IGdvdCAnJWMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzYyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJleHBlY3RpbmcgYCwnIG9yIGApJyBhZnRlciBiYXNlIHJlZ2lzdGVyIGluIGAlcyciCi1tc2dzdHIgIiIKLQotIy4gaXQncyBub3QgYSBtZW1vcnkgb3BlcmFuZDsgYXJnaCEKLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzY4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGNoYXIgJXMgYmVnaW5uaW5nIG9wZXJhbmQgJWQgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjQwODcKLW1zZ2lkICJCYWQgY2FsbCB0byBtZF9hdG9mICgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6NDE0OCBjb25maWcvdGMtaTM4Ni5jOjQxNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIHJlZ2lzdGVyIG5hbWUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjQyMTUKLW1zZ2lkICItbVx0XHRcdGRvIGxvbmcganVtcFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6NDI1NQotbXNnaWQgIkdPVCBhbHJlYWR5IGluIHN5bWJvbCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjQzOTUgY29uZmlnL3RjLW1jb3JlLmM6MjAxNyBjb25maWcvdGMtc2guYzoyNDE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCByZXByZXNlbnQgcmVsb2NhdGlvbiB0eXBlICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6MTU3IGNvbmZpZy90Yy1pODYwLmM6MTYxCi1tc2dpZCAiVW5rbm93biB0ZW1wb3JhcnkgcHNldWRvIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6MTgzIGNvbmZpZy90Yy1taXBzLmM6MTA5OSBjb25maWcvdGMtc3BhcmMuYzo2OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjM0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJFeHBhbmRlZCBvcGNvZGUgYWZ0ZXIgZGVsYXllZCBicmFuY2g6IGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzozNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXhwYW5kZWQgb3Bjb2RlIGluIGR1YWwgbW9kZTogYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjU4MAotbXNnaWQgIkZzcjEgZXF1YWxzIGZkZXN0IHdpdGggUGlwZWxpbmluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjYzMQotbXNnaWQgIjUtYml0IGltbWVkaWF0ZSB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo3MjUKLW1zZ2lkICJJbGxlZ2FsIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6NzQ5IGNvbmZpZy90Yy1zcGFyYy5jOjIzMzgKLW1zZ2lkICJiYWQgc2VnbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjg3OAotIywgYy1mb3JtYXQKLW1zZ2lkICIyNi1iaXQgYnJhbmNoIHcvbyBwYyByZWxhdGl2ZSBzZXQ6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jLiBhbGlnbiBwY3JlbCBvZmZzZXQsIHNlZSBtYW51YWwKLSMuIGNoZWNrIGZvciBvdmVyZmxvdwotIzogY29uZmlnL3RjLWk4NjAuYzo4ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiMjYtYml0IGJyYW5jaCBvZmZzZXQgb3ZlcmZsb3c6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjg5MSBjb25maWcvdGMtaTg2MC5jOjkyMgotIywgYy1mb3JtYXQKLW1zZ2lkICIxNi1iaXQgaW1tZWRpYXRlIDQtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjg5NiBjb25maWcvdGMtaTg2MC5jOjkyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIxNi1iaXQgaW1tZWRpYXRlIDItYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjkwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIxNi1iaXQgYnJhbmNoIG9mZnNldCBvdmVyZmxvdzogMHglMDh4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6OTEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIjE2LWJpdCBpbW1lZGlhdGUgMTYtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjkxNwotIywgYy1mb3JtYXQKLW1zZ2lkICIxNi1iaXQgaW1tZWRpYXRlIDgtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjkzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIxNi1iaXQgaW1tZWRpYXRlIG92ZXJmbG93OiAweCUwOHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo5NTEKLW1zZ2lkICJtZF9udW1iZXJfdG9fZGlzcFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6OTYxCi1tc2dpZCAiaTg2MF9udW1iZXJfdG9fZmllbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjEwMDEKLW1zZ2lkICJpODYwX2NvbnZlcnRfZnJhZ1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6MTAxMAotbXNnaWQgImk4NjBfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjU0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJIYXNoaW5nIHJldHVybmVkIFwiJXNcIi4iCi1tc2dzdHIgIiIKLQotIy4gT2Zmc2V0IG9mIGxhc3QgY2hhcmFjdGVyIGluIG9wY29kZSBtbmVtb25pYwotIzogY29uZmlnL3RjLWk5NjAuYzo1NzgKLW1zZ2lkICJicmFuY2ggcHJlZGljdGlvbiBpbnZhbGlkIG9uIHRoaXMgb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6NjIxCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgb3Bjb2RlLCBcIiVzXCIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6NjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImltcHJvcGVyIG51bWJlciBvZiBvcGVyYW5kcy4gIGV4cGVjdGluZyAlZCwgZ290ICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6NzcxIGNvbmZpZy90Yy1tMzJyLmM6MTg3MwotbXNnaWQgIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjg2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJGaXh1cCBvZiAlbGQgdG9vIGxhcmdlIGZvciBmaWVsZCB3aWR0aCBvZiAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjk3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGFyY2hpdGVjdHVyZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjk5OQotbXNnaWQgIkk5NjAgb3B0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjEwMDIKLW1zZ2lkICIiCi0iXG4iCi0iXHRcdFx0c3BlY2lmeSB2YXJpYW50IG9mIDk2MCBhcmNoaXRlY3R1cmVcbiIKLSItYlx0XHRcdGFkZCBjb2RlIHRvIGNvbGxlY3Qgc3RhdGlzdGljcyBhYm91dCBicmFuY2hlcyB0YWtlblxuIgotIi1saW5rLXJlbGF4XHRcdHByZXNlcnZlIGluZGl2aWR1YWwgYWxpZ25tZW50IGRpcmVjdGl2ZXMgc28gbGlua2VyXG4iCi0iXHRcdFx0Y2FuIGRvIHJlbGF4aW5nIChiLm91dCBmb3JtYXQgb25seSlcbiIKLSItbm8tcmVsYXhcdFx0ZG9uJ3QgYWx0ZXIgY29tcGFyZS1hbmQtYnJhbmNoIGluc3RydWN0aW9ucyBmb3JcbiIKLSJcdFx0XHRsb25nIGRpc3BsYWNlbWVudHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjE0MDAKLW1zZ2lkICJ0b28gbWFueSBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjE0NjAgY29uZmlnL3RjLWk5NjAuYzoxNjkwCi1tc2dpZCAiZXhwcmVzc2lvbiBzeW50YXggZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxNDk4Ci1tc2dpZCAiYXR0ZW1wdCB0byBicmFuY2ggaW50byBkaWZmZXJlbnQgc2VnbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjE1MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGFyZ2V0IG9mICVzIGluc3RydWN0aW9uIG11c3QgYmUgYSBsYWJlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjE1NDIKLW1zZ2lkICJ1bm1hdGNoZWQgJ1snIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTU1MwotbXNnaWQgImdhcmJhZ2UgYWZ0ZXIgaW5kZXggc3BlYyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSMuIFdlIG5ldmVyIG1vdmVkOiB0aGVyZSB3YXMgbm8gb3Bjb2RlIGVpdGhlciEKLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTYyMAotbXNnaWQgIm1pc3Npbmcgb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTkyOAotbXNnaWQgImludmFsaWQgY29uc3RhbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyMDQxCi1tc2dpZCAiaW52YWxpZCBpbmRleCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjIwNjQKLW1zZ2lkICJpbnZhbGlkIHNjYWxlIGZhY3RvciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjIyNDcKLW1zZ2lkICJ1bmFsaWduZWQgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyMjcwCi1tc2dpZCAibm8gc3VjaCBzZnIgaW4gdGhpcyBhcmNoaXRlY3R1cmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyMzA4Ci1tc2dpZCAiaWxsZWdhbCBsaXRlcmFsIgotbXNnc3RyICIiCi0KLSMuIFNob3VsZCBub3QgaGFwcGVuOiBzZWUgYmxvY2sgY29tbWVudCBhYm92ZQotIzogY29uZmlnL3RjLWk5NjAuYzoyNTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlRyeWluZyB0byAnYmFsJyB0byAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI1NTIKLW1zZ2lkICJMb29rcyBsaWtlIGEgcHJvYywgYnV0IGNhbid0IHRlbGwgd2hhdCBraW5kLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjU4NAotbXNnaWQgInNob3VsZCBoYXZlIDEgb3IgMiBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI1OTMgY29uZmlnL3RjLWk5NjAuYzoyNjEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlJlZGVmaW5pbmcgbGVhZnByb2MgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyNjQyCi1tc2dpZCAic2hvdWxkIGhhdmUgdHdvIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjY1MgotbXNnaWQgIidlbnRyeV9udW0nIG11c3QgYmUgYWJzb2x1dGUgbnVtYmVyIGluIFswLDMxXSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI2NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUmVkZWZpbmluZyBlbnRyeW51bSBmb3Igc3lzcHJvYyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI3NzIKLW1zZ2lkICJhcmNoaXRlY3R1cmUgb2Ygb3Bjb2RlIGNvbmZsaWN0cyB3aXRoIHRoYXQgb2YgZWFybGllciBpbnN0cnVjdGlvbihzKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI3OTMKLW1zZ2lkICJiaWcgZW5kaWFuIG1vZGUgaXMgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI3OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWdub3JpbmcgdW5yZWNvZ25pemVkIC5lbmRpYW4gdHlwZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MzA1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJsZWFmcHJvYyBzeW1ib2wgJyVzJyB1bmRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzozMDYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IG1ha2luZyBsZWFmcHJvYyBlbnRyaWVzICVzIGFuZCAlcyBib3RoIGdsb2JhbFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MzE2OQotbXNnaWQgIm9wdGlvbiAtLWxpbmstcmVsYXggaXMgb25seSBzdXBwb3J0ZWQgaW4gYi5vdXQgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MzIxMgotbXNnaWQgImNhbGxqIHRvIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIy4gUHJldGVuZCB0aGF0IHdlIGRvIG5vdCByZWNvZ25pc2UgdGhpcyBvcHRpb24uCi0jOiBjb25maWcvdGMtbTMyci5jOjIzMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5yZWNvZ25pc2VkIG9wdGlvbjogLWhpZGRlblxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MjY1Ci1tc2dpZCAiIE0zMlIgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoyODcKLW1zZ2lkICIiCi0iICAtd2Fybi11bm1hdGNoZWQtaGlnaCAgICB3YXJuIHdoZW4gYW4gKHMpaGlnaCByZWxvYyBoYXMgbm8gbWF0Y2hpbmcgbG93ICIKLSJyZWxvY1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6Mjg5Ci1tc2dpZCAiICAtbm8td2Fybi11bm1hdGNoZWQtaGlnaCBkbyBub3Qgd2FybiBhYm91dCBtaXNzaW5nIGxvdyByZWxvY3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjI5MQotbXNnaWQgIiAgLVd1aCAgICAgICAgICAgICAgICAgICAgc3lub255bSBmb3IgLXdhcm4tdW5tYXRjaGVkLWhpZ2hcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjI5MwotbXNnaWQgIiAgLVdudWggICAgICAgICAgICAgICAgICAgc3lub255bSBmb3IgLW5vLXdhcm4tdW5tYXRjaGVkLWhpZ2hcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjI5NwotbXNnaWQgIiAgLXJlbGF4ICAgICAgICAgICAgICAgICBjcmVhdGUgbGlua2VyIHJlbGF4YWJsZSBjb2RlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoyOTkKLW1zZ2lkICIgIC1jcHUtZGVzYyAgICAgICAgICAgICAgcHJvdmlkZSBydW50aW1lIGNwdSBkZXNjcmlwdGlvbiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzo0MjkgcmVhZC5jOjI3MzQgcmVhZC5jOjQ3OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6NzAwCi1tc2dpZCAiSW5zdHJ1Y3Rpb25zIHdyaXRlIHRvIHRoZSBzYW1lIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjcwOAotbXNnaWQgIkluc3RydWN0aW9ucyBkbyBub3QgdXNlIHBhcmFsbGVsIGV4ZWN1dGlvbiBwaXBlbGluZXMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6NzE1Ci1tc2dpZCAiSW5zdHJ1Y3Rpb25zIHNoYXJlIHRoZSBzYW1lIGV4ZWN1dGlvbiBwaXBlbGluZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjc4NCBjb25maWcvdGMtbTMyci5jOjg3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJub3QgYSAxNiBiaXQgaW5zdHJ1Y3Rpb24gJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjc5MSBjb25maWcvdGMtbTMyci5jOjg3NyBjb25maWcvdGMtbTMyci5jOjEwMzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBpbnN0cnVjdGlvbiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6Nzk5IGNvbmZpZy90Yy1tMzJyLmM6ODg0IGNvbmZpZy90Yy1tMzJyLmM6MTA0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnN0cnVjdGlvbiAnJXMnIGlzIGZvciB0aGUgTTMyUlggb25seSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjgwNyBjb25maWcvdGMtbTMyci5jOjg5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnN0cnVjdGlvbiAnJXMnIGNhbm5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzo4NTQgY29uZmlnL3RjLW0zMnIuYzo5MTcgY29uZmlnL3RjLW0zMnIuYzoxMDk4Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGxvb2t1cC9nZXQgb3BlcmFuZHMgZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6OTAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiclcyc6IG9ubHkgdGhlIE5PUCBpbnN0cnVjdGlvbiBjYW4gYmUgaXNzdWVkIGluIHBhcmFsbGVsIG9uIHRoZSBtMzJyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6OTMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogb3V0cHV0IG9mIDFzdCBpbnN0cnVjdGlvbiBpcyB0aGUgc2FtZSBhcyBhbiBpbnB1dCB0byAybmQgaW5zdHJ1Y3Rpb24gLSAiCi0iaXMgdGhpcyBpbnRlbnRpb25hbCA/IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6OTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogb3V0cHV0IG9mIDJuZCBpbnN0cnVjdGlvbiBpcyB0aGUgc2FtZSBhcyBhbiBpbnB1dCB0byAxc3QgaW5zdHJ1Y3Rpb24gLSAiCi0iaXMgdGhpcyBpbnRlbnRpb25hbCA/IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MTI2NCBjb25maWcvdGMtcHBjLmM6MTMzMCBjb25maWcvdGMtcHBjLmM6MzUzNCByZWFkLmM6MTM0OQotbXNnaWQgIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lOiByZXN0IG9mIGxpbmUgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoxMjczCi0jLCBjLWZvcm1hdAotbXNnaWQgIi5TQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MTI4NyBjb25maWcvdGMtcHBjLmM6MTM1MiBjb25maWcvdGMtcHBjLmM6MjI2MQotIzogY29uZmlnL3RjLXBwYy5jOjM1NTgKLW1zZ2lkICJpZ25vcmluZyBiYWQgYWxpZ25tZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MTMxMyBjb25maWcvdGMtcHBjLmM6MTM2MyBjb25maWcvdGMtcHBjLmM6MzU3MCByZWFkLmM6MTM2OQotIzogcmVhZC5jOjIwODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIGAlcycuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MTMyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJMZW5ndGggb2YgLnNjb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjE1NjYKLW1zZ2lkICJBZGRlbmQgdG8gdW5yZXNvbHZlZCBzeW1ib2wgbm90IG9uIHdvcmQgYm91bmRhcnkuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MTc5NQotbXNnaWQgIlVubWF0Y2hlZCBoaWdoL3NoaWdoIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjM2Ci1tc2dpZCAiVW5rbm93biBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjc2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IGRvICVkIGJ5dGUgcGMtcmVsYXRpdmUgcGljIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo3NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG5vdCBkbyAlZCBieXRlIHBpYyByZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6ODc1IGNvbmZpZy90Yy1taXBzLmM6MTE4OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IG1ha2UgJXMgcmVsb2NhdGlvbiBQQyByZWxhdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjk4NyBjb25maWcvdGMtdGFob2UuYzoxNTA1IGNvbmZpZy90Yy12YXguYzoxNzczCi1tc2dpZCAiTm8gb3BlcmF0b3IiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxMDE3IGNvbmZpZy90Yy10YWhvZS5jOjE1MjIgY29uZmlnL3RjLXZheC5jOjE3OTAKLW1zZ2lkICJVbmtub3duIG9wZXJhdG9yIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTc2NAotbXNnaWQgImludmFsaWQgaW5zdHJ1Y3Rpb24gZm9yIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxNzY5Ci1tc2dpZCAiZnB1ICg2ODA0MCwgNjgwNjAgb3IgNjg4ODEvNjg4ODIpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTc3MgotbXNnaWQgIm1tdSAoNjgwMzAgb3IgNjg4NTEpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTc3NQotbXNnaWQgIjY4MDIwIG9yIGhpZ2hlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjE3NzgKLW1zZ2lkICI2ODAwMCBvciBoaWdoZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxNzgxCi1tc2dpZCAiNjgwMTAgb3IgaGlnaGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTgwOQotbXNnaWQgIm9wZXJhbmRzIG1pc21hdGNoIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTg2NiBjb25maWcvdGMtbTY4ay5jOjE4NzIgY29uZmlnL3RjLW02OGsuYzoxODc4Ci1tc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxOTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJpZ251bSB0b28gYmlnIGZvciAlYyBmb3JtYXQ7IHRydW5jYXRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjIwMDMKLW1zZ2lkICJkaXNwbGFjZW1lbnQgdG9vIGxhcmdlIGZvciB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgNjgwMjAgb3IgaGlnaGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjExMwotbXNnaWQgIiIKLSJzY2FsZSBmYWN0b3IgaW52YWxpZCBvbiB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgY3B1MzIgb3IgNjgwMjAgb3IgaGlnaGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjE2NwotbXNnaWQgIkZvcmNpbmcgYnl0ZSBkaXNwbGFjZW1lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyMTY5Ci1tc2dpZCAiYnl0ZSBkaXNwbGFjZW1lbnQgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjIxNiBjb25maWcvdGMtbTY4ay5jOjIyNTQKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmQgbW9kZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmU7IG5lZWRzIDY4MDIwIG9yIGhpZ2hlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjIyNDAgY29uZmlnL3RjLW02OGsuYzoyMjc0Ci1tc2dpZCAiOmIgbm90IHBlcm1pdHRlZDsgZGVmYXVsdGluZyB0byA6dyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjIzNTYKLW1zZ2lkICJ1bnN1cHBvcnRlZCBieXRlIHZhbHVlOyB1c2UgYSBkaWZmZXJlbnQgc3VmZml4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjM3MAotbXNnaWQgInVua25vd24vaW5jb3JyZWN0IG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyNDAzIGNvbmZpZy90Yy1tNjhrLmM6MjQxMSBjb25maWcvdGMtbTY4ay5jOjI0MTgKLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjQyNQotbXNnaWQgIm91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI0NzUKLW1zZ2lkICJDYW4ndCB1c2UgbG9uZyBicmFuY2hlcyBvbiA2ODAwMC82ODAxMC81MjAwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjU2MwotbXNnaWQgIkV4cHJlc3Npb24gb3V0IG9mIHJhbmdlLCB1c2luZyAwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjY2OCBjb25maWcvdGMtbTY4ay5jOjI2ODQKLW1zZ2lkICJGbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiByZWdpc3RlciBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjY3NAotbXNnaWQgIldyb25nIHJlZ2lzdGVyIGluIGZsb2F0aW5nLXBvaW50IHJlZ2xpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyNjkwCi1tc2dpZCAiaW5jb3JyZWN0IHJlZ2lzdGVyIGluIHJlZ2xpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyNjk2Ci1tc2dpZCAid3JvbmcgcmVnaXN0ZXIgaW4gZmxvYXRpbmctcG9pbnQgcmVnbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI3NzIKLW1zZ2lkICJmYWlsZWQgc2FuaXR5IGNoZWNrIgotbXNnc3RyICIiCi0KLSMuIEVSUk9SCi0jOiBjb25maWcvdGMtbTY4ay5jOjMxMDgKLW1zZ2lkICJFeHRyYSApIgotbXNnc3RyICIiCi0KLSMuIEVSUk9SCi0jOiBjb25maWcvdGMtbTY4ay5jOjMxMTkKLW1zZ2lkICJNaXNzaW5nICkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozMTM2Ci1tc2dpZCAiTWlzc2luZyBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MzQyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAtLSBzdGF0ZW1lbnQgYCVzJyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MzQ3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJEb24ndCBrbm93IGhvdyB0byBmaWd1cmUgd2lkdGggb2YgJWMgaW4gbWRfYXNzZW1ibGUoKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjM2MzkgY29uZmlnL3RjLW02OGsuYzozNjc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIEVycm9yOiBDYW4ndCBmaW5kICVzIGluIGhhc2ggdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozNjQyIGNvbmZpZy90Yy1tNjhrLmM6MzY3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgaGFzaCAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozODA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXplZCBkZWZhdWx0IGNwdSBgJXMnID8/PyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjM4MTYKLW1zZ2lkICI2ODA0MCBhbmQgNjg4NTEgc3BlY2lmaWVkOyBtbXUgaW5zdHJ1Y3Rpb25zIG1heSBhc3NlbWJsZSBpbmNvcnJlY3RseSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjM4MzYKLW1zZ2lkICJvcHRpb25zIGZvciA2ODg4MSBhbmQgbm8tNjg4ODEgYm90aCBnaXZlbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjM4MzgKLW1zZ2lkICJvcHRpb25zIGZvciA2ODg1MSBhbmQgbm8tNjg4NTEgYm90aCBnaXZlbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjM5MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGV4dCBsYWJlbCBgJXMnIGFsaWduZWQgdG8gb2RkIGJvdW5kYXJ5IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDEyNgotbXNnaWQgImludmFsaWQgYnl0ZSBicmFuY2ggb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDE4MwotbXNnaWQgInNob3J0IGJyYW5jaCB3aXRoIHplcm8gb2Zmc2V0OiB1c2UgOnciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0MjI5Ci1tc2dpZCAiTG9uZyBicmFuY2ggb2Zmc2V0IG5vdCBzdXBwb3J0ZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDI5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvciAobG9uZyBQQy1yZWxhdGl2ZSBvcGVyYW5kKSBmb3IgaW5zbiAweCUwNHggYXQgMHglbHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0MzIxCi1tc2dpZCAiZGlzcGxhY2VtZW50IGRvZXNuJ3QgZml0IGluIG9uZSBieXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDQzNAotbXNnaWQgIkxvbmcgYnJhbmNoIG9mZnNldCB0byBleHRlcm4gc3ltYm9sIG5vdCBzdXBwb3J0ZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDc4MyBjb25maWcvdGMtbTY4ay5jOjQ3OTQKLW1zZ2lkICJleHByZXNzaW9uIG91dCBvZiByYW5nZTogZGVmYXVsdGluZyB0byAxIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDgyNgotbXNnaWQgImV4cHJlc3Npb24gb3V0IG9mIHJhbmdlOiBkZWZhdWx0aW5nIHRvIDAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0ODU5IGNvbmZpZy90Yy1tNjhrLmM6NDg3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBkZWFsIHdpdGggZXhwcmVzc2lvbjsgZGVmYXVsdGluZyB0byAlbGQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0ODg1Ci1tc2dpZCAiZXhwcmVzc2lvbiBkb2Vzbid0IGZpdCBpbiBCWVRFIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDg4OQotbXNnaWQgImV4cHJlc3Npb24gZG9lc24ndCBmaXQgaW4gV09SRCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQ5ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVucmVjb2duaXplZCBwcm9jZXNzb3IgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjUwNDcKLW1zZ2lkICJiYWQgY29wcm9jZXNzb3IgaWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1MDUzCi1tc2dpZCAidW5yZWNvZ25pemVkIGZvcHQgb3B0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTE4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJvcHRpb24gYCVzJyBtYXkgbm90IGJlIG5lZ2F0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1MTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9wdGlvbiBgJXMnIG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTIzMQotbXNnaWQgImJhZCBmb3JtYXQgb2YgT1BUIE5FU1Q9ZGVwdGgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1Mjk0Ci1tc2dpZCAibWlzc2luZyBsYWJlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjUzMTggY29uZmlnL3RjLW02OGsuYzo1MzQ3Ci1tc2dpZCAiYmFkIHJlZ2lzdGVyIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1MzIwCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCByZWdpc3RlciBsaXN0OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjU0MTgKLW1zZ2lkICJyZXN0b3JlIHdpdGhvdXQgc2F2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjU1OTUgY29uZmlnL3RjLW02OGsuYzo1OTQ0Ci1tc2dpZCAic3ludGF4IGVycm9yIGluIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1NjQ2Ci1tc2dpZCAibWlzc2luZyBjb25kaXRpb24gY29kZSBpbiBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTk3OAotbXNnaWQgIm1pc3NpbmcgdGhlbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjYwNjAKLW1zZ2lkICJlbHNlIHdpdGhvdXQgbWF0Y2hpbmcgaWYiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2MDk0Ci1tc2dpZCAiZW5kaSB3aXRob3V0IG1hdGNoaW5nIGlmIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjEzNQotbXNnaWQgImJyZWFrIG91dHNpZGUgb2Ygc3RydWN0dXJlZCBsb29wIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjE3NAotbXNnaWQgIm5leHQgb3V0c2lkZSBvZiBzdHJ1Y3R1cmVkIGxvb3AiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2MjI2Ci1tc2dpZCAibWlzc2luZyA9IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjI2NAotbXNnaWQgIm1pc3NpbmcgdG8gb3IgZG93bnRvIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjMwMCBjb25maWcvdGMtbTY4ay5jOjYzMzQgY29uZmlnL3RjLW02OGsuYzo2NTQ0Ci1tc2dpZCAibWlzc2luZyBkbyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY0MzcKLW1zZ2lkICJlbmRmIHdpdGhvdXQgZm9yIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjQ5MwotbXNnaWQgInVudGlsIHdpdGhvdXQgcmVwZWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjU4MAotbXNnaWQgImVuZHcgd2l0aG91dCB3aGlsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY2OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5yZWNvZ25pemVkIG9wdGlvbiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Njc0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbml6ZWQgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY4MTEKLW1zZ2lkICIiCi0iNjgwWDAgb3B0aW9uczpcbiIKLSItbFx0XHRcdHVzZSAxIHdvcmQgZm9yIHJlZnMgdG8gdW5kZWZpbmVkIHN5bWJvbHMgW2RlZmF1bHQgMl1cbiIKLSItbTY4MDAwIHwgLW02ODAwOCB8IC1tNjgwMTAgfCAtbTY4MDIwIHwgLW02ODAzMCB8IC1tNjgwNDAgfCAtbTY4MDYwXG4iCi0iIHwgLW02ODMwMiB8IC1tNjgzMzEgfCAtbTY4MzMyIHwgLW02ODMzMyB8IC1tNjgzNDAgfCAtbTY4MzYwXG4iCi0iIHwgLW1jcHUzMiB8IC1tNTIwMFxuIgotIlx0XHRcdHNwZWNpZnkgdmFyaWFudCBvZiA2ODBYMCBhcmNoaXRlY3R1cmUgW2RlZmF1bHQgNjgwMjBdXG4iCi0iLW02ODg4MSB8IC1tNjg4ODIgfCAtbW5vLTY4ODgxIHwgLW1uby02ODg4MlxuIgotIlx0XHRcdHRhcmdldCBoYXMvbGFja3MgZmxvYXRpbmctcG9pbnQgY29wcm9jZXNzb3JcbiIKLSJcdFx0XHRbZGVmYXVsdCB5ZXMgZm9yIDY4MDIwLCA2ODAzMCwgYW5kIGNwdTMyXVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjgyMQotbXNnaWQgIiIKLSItbTY4ODUxIHwgLW1uby02ODg1MVxuIgotIlx0XHRcdHRhcmdldCBoYXMvbGFja3MgbWVtb3J5LW1hbmFnZW1lbnQgdW5pdCBjb3Byb2Nlc3NvclxuIgotIlx0XHRcdFtkZWZhdWx0IHllcyBmb3IgNjgwMjAgYW5kIHVwXVxuIgotIi1waWMsIC1rXHRcdGdlbmVyYXRlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGVcbiIKLSItU1x0XHRcdHR1cm4gamJzciBpbnRvIGpzclxuIgotIi0tcmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsXG4iCi0iXHRcdFx0cmVjb2duaXplIHJlZ2lzdGVyIG5hbWVzIHdpdGhvdXQgcHJlZml4IGNoYXJhY3RlclxuIgotIi0tYml0d2lzZS1vclx0XHRkbyBub3QgdHJlYXQgYHwnIGFzIGEgY29tbWVudCBjaGFyYWN0ZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY4MzAKLW1zZ2lkICIiCi0iLS1iYXNlLXNpemUtZGVmYXVsdC0xNlx0YmFzZSByZWcgd2l0aG91dCBzaXplIGlzIDE2IGJpdHNcbiIKLSItLWJhc2Utc2l6ZS1kZWZhdWx0LTMyXHRiYXNlIHJlZyB3aXRob3V0IHNpemUgaXMgMzIgYml0cyAoZGVmYXVsdClcbiIKLSItLWRpc3Atc2l6ZS1kZWZhdWx0LTE2XHRkaXNwbGFjZW1lbnQgd2l0aCB1bmtub3duIHNpemUgaXMgMTYgYml0c1xuIgotIi0tZGlzcC1zaXplLWRlZmF1bHQtMzJcdGRpc3BsYWNlbWVudCB3aXRoIHVua25vd24gc2l6ZSBpcyAzMiBiaXRzIChkZWZhdWx0KVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Njg2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvciAlcyBpbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Njg2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJPcGNvZGUoJWQuJXMpOiAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoyMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgaGFzaCBpbnN0cnVjdGlvbiAnJXMnOiVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MjU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgbW5lbW9uaWMgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjI3OAotbXNnaWQgIlBhcmFtZXRlciBzeW50YXggZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzozMzMKLW1zZ2lkICJVbmtub3duIHJlbG9jYXRpb24gdHlwZSIKLW1zZ3N0ciAiIgotCi0jLiBIYXZpbmcgdGhpcyBoZXJlIHJlcGVhdHMgdGhlIHdhcm5pbmcgc29tdGltZXMuCi0jLiBCdXQgY2FuJ3Qgd2Ugc3RhbmQgdGhhdD8KLSM6IGNvbmZpZy90Yy1tODhrLmM6NDQ2Ci1tc2dpZCAiVXNlIG9mIG9ic29sZXRlIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6NTYzCi1tc2dpZCAiRXhwcmVzc2lvbiB0cnVuY2F0ZWQgdG8gMTYgYml0cyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjYyOSBjb25maWcvdGMtbTg4ay5jOjY1MQotbXNnaWQgIkV4cHJlc3Npb24gdHJ1bmNhdGVkIHRvIDUgYml0cyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjg3MwotbXNnaWQgIkV4cHJlc3Npb24gdHJ1bmNhdGVkIHRvIDkgYml0cyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjg5NQotbXNnaWQgIlJlbW92ZWQgbG93ZXIgMiBiaXRzIG9mIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoxMDM0Ci1tc2dpZCAiQmFkIHJlbG9jYXRpb24gdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjEwNDcKLW1zZ2lkICJtZF9udW1iZXJfdG9fZGlzcCBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjEwNTcKLW1zZ2lkICJtZF9udW1iZXJfdG9fZmllbGQgbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoxMTcwCi1tc2dpZCAiUmVsYXhhdGlvbiBzaG91bGQgbmV2ZXIgb2NjdXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoxMjY3IGNvbmZpZy90Yy1zcGFyYy5jOjMwMjQgcmVhZC5jOjE5NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQlNTIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoxMzExCi0jLCBjLWZvcm1hdAotbXNnaWQgIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCAlcy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MjczCi0jLCBjLWZvcm1hdAotbXNnaWQgInJlZ2lzdGVyIGV4cGVjdGVkLCBidXQgc2F3ICclLjZzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzozNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY29udHJvbCByZWdpc3RlciBleHBlY3RlZCwgYnV0IHNhdyAnJS42cyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6NTEzCi1tc2dpZCAibW9yZSB0aGFuIDY1SyBsaXRlcmFsIHBvb2xzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjU2NwotbXNnaWQgIm1pc3NpbmcgJ10nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjYwNwotbXNnaWQgIm9wZXJhbmQgbXVzdCBiZSBhIGNvbnN0YW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjYwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkLCBub3QgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6NjQ2Ci1tc2dpZCAib3BlcmFuZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo2NTMKLW1zZ2lkICJvcGVyYW5kIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjY2NyBjb25maWcvdGMtbWNvcmUuYzoxMTc3IGNvbmZpZy90Yy1tY29yZS5jOjEyMzEKLW1zZ2lkICJiYXNlIHJlZ2lzdGVyIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjcxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG9wY29kZSBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6NzU5Ci1tc2dpZCAiaW52YWxpZCByZWdpc3RlcjogcjE1IGlsbGVnYWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6ODA4Ci1tc2dpZCAiTTM0MCBzcGVjaWZpYyBvcGNvZGUgdXNlZCB3aGVuIGFzc2VtYmxpbmcgZm9yIE0yMTAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6ODI3IGNvbmZpZy90Yy1tY29yZS5jOjg2NiBjb25maWcvdGMtbWNvcmUuYzo4ODUKLSM6IGNvbmZpZy90Yy1tY29yZS5jOjkwNCBjb25maWcvdGMtbWNvcmUuYzo5MzEgY29uZmlnL3RjLW1jb3JlLmM6OTYwCi0jOiBjb25maWcvdGMtbWNvcmUuYzo5OTcgY29uZmlnL3RjLW1jb3JlLmM6MTAzMiBjb25maWcvdGMtbWNvcmUuYzoxMDUxCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMDcwIGNvbmZpZy90Yy1tY29yZS5jOjExMDIgY29uZmlnL3RjLW1jb3JlLmM6MTEyNAotIzogY29uZmlnL3RjLW1jb3JlLmM6MTE4MCBjb25maWcvdGMtbWNvcmUuYzoxMjM0IGNvbmZpZy90Yy1tY29yZS5jOjEyNjkKLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEzMjMgY29uZmlnL3RjLW1jb3JlLmM6MTM0NSBjb25maWcvdGMtbWNvcmUuYzoxMzY4Ci1tc2dpZCAic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo4NDIKLW1zZ2lkICJkZXN0aW5hdGlvbiByZWdpc3RlciBtdXN0IGJlIHIxIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjg2MwotbXNnaWQgInNvdXJjZSByZWdpc3RlciBtdXN0IGJlIHIxIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjkyNiBjb25maWcvdGMtbWNvcmUuYzo5ODMKLW1zZ2lkICJpbW1lZGlhdGUgaXMgbm90IGEgcG93ZXIgb2YgdHdvIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjk1NAotbXNnaWQgInRyYW5zbGF0aW5nIGJnZW5pIHRvIG1vdmkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6OTkxCi1tc2dpZCAidHJhbnNsYXRpbmcgbWdlbmkgdG8gbW92aSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMDIzCi1tc2dpZCAidHJhbnNsYXRpbmcgYm1hc2tpIHRvIG1vdmkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTA5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJkaXNwbGFjZW1lbnQgdG9vIGxhcmdlICglZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTExMQotbXNnaWQgIkludmFsaWQgcmVnaXN0ZXI6IHIwIGFuZCByMTUgaWxsZWdhbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMTM4Ci1tc2dpZCAiYmFkIHN0YXJ0aW5nIHJlZ2lzdGVyOiByMCBhbmQgcjE1IGludmFsaWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTE1MQotbXNnaWQgImVuZGluZyByZWdpc3RlciBtdXN0IGJlIHIxNSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMTcxCi1tc2dpZCAiYmFkIGJhc2UgcmVnaXN0ZXI6IG11c3QgYmUgcjAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTE4OQotbXNnaWQgImZpcnN0IHJlZ2lzdGVyIG11c3QgYmUgcjQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTIwMAotbXNnaWQgImxhc3QgcmVnaXN0ZXIgbXVzdCBiZSByNyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMjM3Ci1tc2dpZCAicmVnLXJlZyBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMzQyCi1tc2dpZCAic2Vjb25kIG9wZXJhbmQgbXVzdCBiZSAxIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEzNjMKLW1zZ2lkICJ6ZXJvIHVzZWQgYXMgaW1tZWRpYXRlIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEzNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5pbXBsZW1lbnRlZCBvcGNvZGUgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE0NDQgY29uZmlnL3RjLXc2NS5jOjg1NgotbXNnaWQgIkJhZCBjYWxsIHRvIE1EX05UT0YoKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxNTEzCi0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXNlZCBjcHUgdHlwZSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE1MzUKLW1zZ2lkICIiCi0iTUNPUkUgc3BlY2lmaWMgb3B0aW9uczpcbiIKLSIgIC17bm8tfWpzcmkyYnNyXHQgIGRpc2FibGUvZW5hYmxlIGpzcmkgdG8gYnNyIHRyYW5zZm9ybWF0aW9uIChkZWY6IG9uKVxuIgotIiAgLXtuby19c2lmaWx0ZXJcdCAgZGlzYWJsZS9lbmFibGUgc2lsaWNvbiBmaWx0ZXIgYmVoYXZpb3IgKGRlZjogb2ZmKVxuIgotIiAgLXJlbGF4XHRcdCAgYWx0ZXIganVtcCBpbnN0cnVjdGlvbnMgZm9yIGxvbmcgZGlzcGxhY2VtZW50c1xuIgotbXNnc3RyICIiCi0KZGlmZiAtLWdpdCBhL2dhcy9yZWFkLmMgYi9nYXMvcmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmVlNzQ5Li4wMDAwMDAwCi0tLSBhL2dhcy9yZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYyICswLDAgQEAKLS8qIHJlYWQuYyAtIHJlYWQgYSBzb3VyY2UgZmlsZSAtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODYsIDg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaWYgMAotI2RlZmluZSBNQVNLX0NIQVIgKDB4RkYpCS8qIElmIHlvdXIgY2hhcnMgYXJlbid0IDggYml0cywgeW91IHdpbGwKLQkJCQkgICBjaGFuZ2UgdGhpcyBhIGJpdC4gIEJ1dCB0aGVuLCBHTlUgaXNuJ3QKLQkJCQkgICBzcG96ZWQgdG8gcnVuIG9uIHlvdXIgbWFjaGluZSBhbnl3YXkuCi0JCQkJICAgKFJNUyBpcyBzbyBzaG9ydHNpZ2h0ZWQgc29tZXRpbWVzLikKLQkJCQkgICAqLwotI2Vsc2UKLSNkZWZpbmUgTUFTS19DSEFSICgoaW50KSh1bnNpZ25lZCBjaGFyKS0xKQotI2VuZGlmCi0KLQotLyogVGhpcyBpcyB0aGUgbGFyZ2VzdCBrbm93biBmbG9hdGluZyBwb2ludCBmb3JtYXQgKGZvciBub3cpLiBJdCB3aWxsCi0gICBncm93IHdoZW4gd2UgZG8gNDM2MSBzdHlsZSBmbG9udW1zLiAqLwotCi0jZGVmaW5lIE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCAoMTYpCi0KLS8qIFJvdXRpbmVzIHRoYXQgcmVhZCBhc3NlbWJsZXIgc291cmNlIHRleHQgdG8gYnVpbGQgc3BhZ2V0dGkgaW4gbWVtb3J5LgotICAgQW5vdGhlciBncm91cCBvZiB0aGVzZSBmdW5jdGlvbnMgaXMgaW4gdGhlIGV4cHIuYyBtb2R1bGUuICAqLwotCi0vKiBmb3IgaXNkaWdpdCgpICovCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgInNiLmgiCi0jaW5jbHVkZSAibWFjcm8uaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAibGlzdGluZy5oIgotI2luY2x1ZGUgImVjb2ZmLmgiCi0KLSNpZm5kZWYgVENfU1RBUlRfTEFCRUwKLSNkZWZpbmUgVENfU1RBUlRfTEFCRUwoeCx5KSAoeD09JzonKQotI2VuZGlmCi0KLS8qIFRoZSBOT1BfT1BDT0RFIGlzIGZvciB0aGUgYWxpZ25tZW50IGZpbGwgdmFsdWUuCi0gKiBmaWxsIGl0IGEgbm9wIGluc3RydWN0aW9uIHNvIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciBkb2VzIG5vdCBjaG9rZQotICogb24gaXQKLSAqLwotI2lmbmRlZiBOT1BfT1BDT0RFCi0jZGVmaW5lIE5PUF9PUENPREUgMHgwMAotI2VuZGlmCi0KLWNoYXIgKmlucHV0X2xpbmVfcG9pbnRlcjsJLyotPm5leHQgY2hhciBvZiBzb3VyY2UgZmlsZSB0byBwYXJzZS4gKi8KLQotI2lmIEJJVFNfUEVSX0NIQVIgIT0gOAotLyogIFRoZSBmb2xsb3dpbmcgdGFibGUgaXMgaW5kZXhlZCBieVsoY2hhcildIGFuZCB3aWxsIGJyZWFrIGlmCi0gICAgYSBjaGFyIGRvZXMgbm90IGhhdmUgZXhhY3RseSAyNTYgc3RhdGVzIChob3BlZnVsbHkgMDoyNTUhKSEgICovCi1kaWUgaG9ycmlibHk7Ci0jZW5kaWYKLQotI2lmbmRlZiBMRVhfQVQKLS8qIFRoZSBtODhrIHVuZm9ydHVuYXRlbHkgdXNlcyBAIGFzIGEgbGFiZWwgYmVnaW5uZXIuICAqLwotI2RlZmluZSBMRVhfQVQgMAotI2VuZGlmCi0KLSNpZm5kZWYgTEVYX0JSCi0vKiBUaGUgUlMvNjAwMCBhc3NlbWJsZXIgdXNlcyB7LH0sWyxdIGFzIHBhcnRzIG9mIHN5bWJvbCBuYW1lcy4gICovCi0jZGVmaW5lIExFWF9CUiAwCi0jZW5kaWYKLQotI2lmbmRlZiBMRVhfUENUCi0vKiBUaGUgRGVsdGEgNjhrIGFzc2VtYmxlciBwZXJtaXRzICUgaW5zaWRlIGxhYmVsIG5hbWVzLiAgKi8KLSNkZWZpbmUgTEVYX1BDVCAwCi0jZW5kaWYKLQotI2lmbmRlZiBMRVhfUU0KLS8qIFRoZSBQb3dlclBDIFdpbmRvd3MgTlQgYXNzZW1ibGVycyBwZXJtaXRzID8gaW5zaWRlIGxhYmVsIG5hbWVzLiAgKi8KLSNkZWZpbmUgTEVYX1FNIDAKLSNlbmRpZgotCi0jaWZuZGVmIExFWF9ET0xMQVIKLS8qIFRoZSBhMjlrIGFzc2VtYmxlciBkb2VzIG5vdCBwZXJtaXRzIGxhYmVscyB0byBzdGFydCB3aXRoICQuICAqLwotI2RlZmluZSBMRVhfRE9MTEFSIDMKLSNlbmRpZgotCi0jaWZuZGVmIExFWF9USUxERQotLyogVGhlIERlbHRhIDY4ayBhc3NlbWJsZXIgcGVybWl0cyB+IGF0IHN0YXJ0IG9mIGxhYmVsIG5hbWVzLiAgKi8KLSNkZWZpbmUgTEVYX1RJTERFIDAKLSNlbmRpZgotCi0vKiB1c2VkIGJ5IGlzXy4uLiBtYWNyb3MuIG91ciBjdHlwZVtdICovCi1jaGFyIGxleF90eXBlWzI1Nl0gPQotewotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiBAQUJDREVGR0hJSktMTU5PICovCi0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIFBRUlNUVVZXWFlaW1xdXl8gKi8KLSAgMCwgMCwgMCwgMCwgTEVYX0RPTExBUiwgTEVYX1BDVCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMywgMCwgLyogXyEiIyQlJicoKSorLC0uLyAqLwotICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCBMRVhfUU0sCS8qIDAxMjM0NTY3ODk6Ozw9Pj8gKi8KLSAgTEVYX0FULCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAkvKiBAQUJDREVGR0hJSktMTU5PICovCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIExFWF9CUiwgMCwgTEVYX0JSLCAwLCAzLCAvKiBQUVJTVFVWV1hZWltcXV5fICovCi0gIDAsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCS8qIGBhYmNkZWZnaGlqa2xtbm8gKi8KLSAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgTEVYX0JSLCAwLCBMRVhfQlIsIExFWF9USUxERSwgMCwgLyogcHFyc3R1dnd4eXp7fH1+LiAqLwotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzCi19OwotCi0KLS8qCi0gKiBJbjogYSBjaGFyYWN0ZXIuCi0gKiBPdXQ6IDEgaWYgdGhpcyBjaGFyYWN0ZXIgZW5kcyBhIGxpbmUuCi0gKi8KLSNkZWZpbmUgWl8gKDApCi1jaGFyIGlzX2VuZF9vZl9saW5lWzI1Nl0gPQotewotI2lmZGVmIENSX0VPTAotICA5OSwgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgOTksIFpfLCBaXywgOTksIFpfLCBaXywJLyogQGFiY2RlZmdoaWprbG1ubyAqLwotI2Vsc2UKLSAgOTksIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIDk5LCBaXywgWl8sIFpfLCBaXywgWl8sCS8qIEBhYmNkZWZnaGlqa2xtbm8gKi8KLSNlbmRpZgotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSNpZmRlZiBUQ19IUFBBCi0gIFpfLDk5LCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qIF8hIiMkJSYnKCkqKywtLi8gKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qIDAxMjM0NTY3ODk6Ozw9Pj8gKi8KLSNlbHNlCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIDk5LCBaXywgWl8sIFpfLCBaXywJLyogMDEyMzQ1Njc4OTo7PD0+PyAqLwotI2VuZGlmCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi19OwotI3VuZGVmIFpfCi0KLS8qIEZ1bmN0aW9ucyBwcml2YXRlIHRvIHRoaXMgZmlsZS4gKi8KLQotc3RhdGljIGNoYXIgKmJ1ZmZlcjsJLyogMXN0IGNoYXIgb2YgZWFjaCBidWZmZXIgb2YgbGluZXMgaXMgaGVyZS4gKi8KLXN0YXRpYyBjaGFyICpidWZmZXJfbGltaXQ7CS8qLT4xICsgbGFzdCBjaGFyIGluIGJ1ZmZlci4gKi8KLQotLyogVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gaXMgcmVxdWlyZWQgdG8gYmUgZGVmaW5lZCB0byBlaXRoZXIgMCBvciAxIGluIHRoZQotICAgdGMtPENQVT4uaCBmaWxlLiAgU2VlIHRoZSAiUG9ydGluZyBHQVMiIHNlY3Rpb24gb2YgdGhlIGludGVybmFscyBtYW51YWwuICovCi1pbnQgdGFyZ2V0X2JpZ19lbmRpYW4gPSBUQVJHRVRfQllURVNfQklHX0VORElBTjsKLQotc3RhdGljIGNoYXIgKm9sZF9idWZmZXI7CS8qIEpGIGEgaGFjayAqLwotc3RhdGljIGNoYXIgKm9sZF9pbnB1dDsKLXN0YXRpYyBjaGFyICpvbGRfbGltaXQ7Ci0KLS8qIFZhcmlhYmxlcyBmb3IgaGFuZGxpbmcgaW5jbHVkZSBmaWxlIGRpcmVjdG9yeSB0YWJsZS4gKi8KLQotY2hhciAqKmluY2x1ZGVfZGlyczsJLyogVGFibGUgb2YgcG9pbnRlcnMgdG8gZGlyZWN0b3JpZXMgdG8KLQkJCSAgIHNlYXJjaCBmb3IgLmluY2x1ZGUncyAqLwotaW50IGluY2x1ZGVfZGlyX2NvdW50OwkvKiBIb3cgbWFueSBhcmUgaW4gdGhlIHRhYmxlICovCi1pbnQgaW5jbHVkZV9kaXJfbWF4bGVuID0gMTsvKiBMZW5ndGggb2YgbG9uZ2VzdCBpbiB0YWJsZSAqLwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLXN0cnVjdCBicm9rZW5fd29yZCAqYnJva2VuX3dvcmRzOwotaW50IG5ld19icm9rZW5fd29yZHM7Ci0jZW5kaWYKLQotLyogVGhlIGN1cnJlbnQgb2Zmc2V0IGludG8gdGhlIGFic29sdXRlIHNlY3Rpb24uICBXZSBkb24ndCB0cnkgdG8KLSAgIGJ1aWxkIGZyYWdzIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLCBzaW5jZSBubyBkYXRhIGNhbiBiZSBzdG9yZWQKLSAgIHRoZXJlLiAgV2UganVzdCBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IG9mZnNldC4gICovCi1hZGRyZXNzVCBhYnNfc2VjdGlvbl9vZmZzZXQ7Ci0KLS8qIElmIHRoaXMgbGluZSBoYWQgYW4gTVJJIHN0eWxlIGxhYmVsLCBpdCBpcyBzdG9yZWQgaW4gdGhpcyB2YXJpYWJsZS4KLSAgIFRoaXMgaXMgdXNlZCBieSBzb21lIG9mIHRoZSBNUkkgcHNldWRvLW9wcy4gICovCi1zeW1ib2xTICpsaW5lX2xhYmVsOwotCi0vKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyB1c2VkIHRvIHN1cHBvcnQgTVJJIGNvbW1vbiBzZWN0aW9ucy4gIFdlCi0gICB0cmFuc2xhdGUgc3VjaCBzZWN0aW9ucyBpbnRvIGEgY29tbW9uIHN5bWJvbC4gIFRoaXMgdmFyaWFibGUgaXMKLSAgIG5vbi1OVUxMIHdoZW4gd2UgYXJlIGluIGFuIE1SSSBjb21tb24gc2VjdGlvbi4gICovCi1zeW1ib2xTICptcmlfY29tbW9uX3N5bWJvbDsKLQotLyogSW4gTVJJIG1vZGUsIGFmdGVyIGEgZGMuYiBwc2V1ZG8tb3Agd2l0aCBhbiBvZGQgbnVtYmVyIG9mIGJ5dGVzLCB3ZQotICAgbmVlZCB0byBhbGlnbiB0byBhbiBldmVuIGJ5dGUgYm91bmRhcnkgdW5sZXNzIHRoZSBuZXh0IHBzZXVkby1vcCBpcwotICAgZGMuYiwgZHMuYiwgb3IgZGNiLmIuICBUaGlzIHZhcmlhYmxlIGlzIHNldCB0byAxIGlmIGFuIGFsaWdubWVudAotICAgbWF5IGJlIG5lZWRlZC4gICovCi1zdGF0aWMgaW50IG1yaV9wZW5kaW5nX2FsaWduOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSNpZmRlZiBPQkpfRUxGCi0vKiBUaGlzIHZhcmlhYmxlIGlzIHNldCB0byBiZSBub24temVybyBpZiB0aGUgbmV4dCBzdHJpbmcgd2Ugc2VlIG1pZ2h0Ci0gICBiZSB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgaW4gRFdBUkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgU2VlCi0gICB0aGUgY29tbWVudCBpbiBlbWl0X2V4cHIgZm9yIHRoZSBmb3JtYXQgd2UgbG9vayBmb3IuICAqLwotc3RhdGljIGludCBkd2FyZl9maWxlX3N0cmluZzsKLSNlbmRpZgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGNvbnNfd29ya2VyIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgaW50IHNjcnViX2Zyb21fc3RyaW5nIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIGRvX2FsaWduIFBBUkFNUyAoKGludCwgY2hhciAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgc19hbGlnbiBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgc19sY29tbV9pbnRlcm5hbCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIGludCBoZXhfZmxvYXQgUEFSQU1TICgoaW50LCBjaGFyICopKTsKLXN0YXRpYyBpbmxpbmUgaW50IHNpemVvZl9zbGViMTI4IFBBUkFNUyAoKG9mZnNldFQpKTsKLXN0YXRpYyBpbmxpbmUgaW50IHNpemVvZl91bGViMTI4IFBBUkFNUyAoKHZhbHVlVCkpOwotc3RhdGljIGlubGluZSBpbnQgb3V0cHV0X3NsZWIxMjggUEFSQU1TICgoY2hhciAqLCBvZmZzZXRUKSk7Ci1zdGF0aWMgaW5saW5lIGludCBvdXRwdXRfdWxlYjEyOCBQQVJBTVMgKChjaGFyICosIHZhbHVlVCkpOwotc3RhdGljIGlubGluZSBpbnQgb3V0cHV0X2JpZ19zbGViMTI4IFBBUkFNUyAoKGNoYXIgKiwgTElUVExFTlVNX1RZUEUgKiwgaW50KSk7Ci1zdGF0aWMgaW5saW5lIGludCBvdXRwdXRfYmlnX3VsZWIxMjggUEFSQU1TICgoY2hhciAqLCBMSVRUTEVOVU1fVFlQRSAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgb3V0cHV0X2JpZ19sZWIxMjggUEFSQU1TICgoY2hhciAqLCBMSVRUTEVOVU1fVFlQRSAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgZG9fb3JnIFBBUkFNUyAoKHNlZ1QsIGV4cHJlc3Npb25TICosIGludCkpOwotY2hhciAqZGVtYW5kX2NvcHlfc3RyaW5nIFBBUkFNUyAoKGludCAqbGVuUCkpOwotc3RhdGljIHNlZ1QgZ2V0X3NlZ21lbnRlZF9leHByZXNzaW9uIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHBQKSk7Ci1zdGF0aWMgc2VnVCBnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24gUEFSQU1TICgoZXhwcmVzc2lvblMgKiBleHBQKSk7Ci1zdGF0aWMgdm9pZCBwb2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgZ2V0X2xpbmVfc2IgUEFSQU1TICgoc2IgKikpOwotc3RhdGljIHZvaWQgZ2VuZXJhdGVfZmlsZV9kZWJ1ZyBQQVJBTVMgKCh2b2lkKSk7Ci0MCi0KLXZvaWQKLXJlYWRfYmVnaW4gKCkKLXsKLSAgY29uc3QgY2hhciAqcDsKLQotICBwb2JlZ2luICgpOwotICBvYmpfcmVhZF9iZWdpbl9ob29rICgpOwotCi0gIC8qIFNvbWV0aGluZyBjbG9zZSAtLSBidXQgbm90IHRvbyBjbG9zZSAtLSB0byBhIG11bHRpcGxlIG9mIDEwMjQuCi0gICAgIFRoZSBkZWJ1Z2dpbmcgbWFsbG9jIEknbSB1c2luZyBoYXMgMjQgYnl0ZXMgb2Ygb3ZlcmhlYWQuICAqLwotICBvYnN0YWNrX2JlZ2luICgmbm90ZXMsIGNodW5rc2l6ZSk7Ci0gIG9ic3RhY2tfYmVnaW4gKCZjb25kX29ic3RhY2ssIGNodW5rc2l6ZSk7Ci0KLSAgLyogVXNlIG1hY2hpbmUgZGVwZW5kZW50IHN5bnRheCAqLwotICBmb3IgKHAgPSBsaW5lX3NlcGFyYXRvcl9jaGFyczsgKnA7IHArKykKLSAgICBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnBdID0gMTsKLSAgLyogVXNlIG1vcmUuICBGSVhNRS1TT01FREFZLiAqLwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBsZXhfdHlwZVsnPyddID0gMzsKLX0KLQwKLS8qIHNldCB1cCBwc2V1ZG8tb3AgdGFibGVzICovCi0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpwb19oYXNoOwotCi1zdGF0aWMgY29uc3QgcHNldWRvX3R5cGVTIHBvdGFibGVbXSA9Ci17Ci0gIHsiYWJvcnQiLCBzX2Fib3J0LCAwfSwKLSAgeyJhbGlnbiIsIHNfYWxpZ25fcHR3bywgMH0sCi0gIHsiYXNjaWkiLCBzdHJpbmdlciwgMH0sCi0gIHsiYXNjaXoiLCBzdHJpbmdlciwgMX0sCi0gIHsiYmFsaWduIiwgc19hbGlnbl9ieXRlcywgMH0sCi0gIHsiYmFsaWdudyIsIHNfYWxpZ25fYnl0ZXMsIC0yfSwKLSAgeyJiYWxpZ25sIiwgc19hbGlnbl9ieXRlcywgLTR9LAotLyogYmxvY2sgKi8KLSAgeyJieXRlIiwgY29ucywgMX0sCi0gIHsiY29tbSIsIHNfY29tbSwgMH0sCi0gIHsiY29tbW9uIiwgc19tcmlfY29tbW9uLCAwfSwKLSAgeyJjb21tb24ucyIsIHNfbXJpX2NvbW1vbiwgMX0sCi0gIHsiZGF0YSIsIHNfZGF0YSwgMH0sCi0gIHsiZGMiLCBjb25zLCAyfSwKLSAgeyJkYy5iIiwgY29ucywgMX0sCi0gIHsiZGMuZCIsIGZsb2F0X2NvbnMsICdkJ30sCi0gIHsiZGMubCIsIGNvbnMsIDR9LAotICB7ImRjLnMiLCBmbG9hdF9jb25zLCAnZid9LAotICB7ImRjLnciLCBjb25zLCAyfSwKLSAgeyJkYy54IiwgZmxvYXRfY29ucywgJ3gnfSwKLSAgeyJkY2IiLCBzX3NwYWNlLCAyfSwKLSAgeyJkY2IuYiIsIHNfc3BhY2UsIDF9LAotICB7ImRjYi5kIiwgc19mbG9hdF9zcGFjZSwgJ2QnfSwKLSAgeyJkY2IubCIsIHNfc3BhY2UsIDR9LAotICB7ImRjYi5zIiwgc19mbG9hdF9zcGFjZSwgJ2YnfSwKLSAgeyJkY2IudyIsIHNfc3BhY2UsIDJ9LAotICB7ImRjYi54Iiwgc19mbG9hdF9zcGFjZSwgJ3gnfSwKLSAgeyJkcyIsIHNfc3BhY2UsIDJ9LAotICB7ImRzLmIiLCBzX3NwYWNlLCAxfSwKLSAgeyJkcy5kIiwgc19zcGFjZSwgOH0sCi0gIHsiZHMubCIsIHNfc3BhY2UsIDR9LAotICB7ImRzLnAiLCBzX3NwYWNlLCAxMn0sCi0gIHsiZHMucyIsIHNfc3BhY2UsIDR9LAotICB7ImRzLnciLCBzX3NwYWNlLCAyfSwKLSAgeyJkcy54Iiwgc19zcGFjZSwgMTJ9LAotICB7ImRlYnVnIiwgc19pZ25vcmUsIDB9LAotI2lmZGVmIFNfU0VUX0RFU0MKLSAgeyJkZXNjIiwgc19kZXNjLCAwfSwKLSNlbmRpZgotLyogZGltICovCi0gIHsiZG91YmxlIiwgZmxvYXRfY29ucywgJ2QnfSwKLS8qIGRzZWN0ICovCi0gIHsiZWplY3QiLCBsaXN0aW5nX2VqZWN0LCAwfSwJLyogRm9ybWZlZWQgbGlzdGluZyAqLwotICB7ImVsc2UiLCBzX2Vsc2UsIDB9LAotICB7ImVsc2VjIiwgc19lbHNlLCAwfSwKLSAgeyJlbmQiLCBzX2VuZCwgMH0sCi0gIHsiZW5kYyIsIHNfZW5kaWYsIDB9LAotICB7ImVuZGZ1bmMiLCBzX2Z1bmMsIDF9LAotICB7ImVuZGlmIiwgc19lbmRpZiwgMH0sCi0vKiBlbmRlZiAqLwotICB7ImVxdSIsIHNfc2V0LCAwfSwKLSAgeyJlcXVpdiIsIHNfc2V0LCAxfSwKLSAgeyJlcnIiLCBzX2VyciwgMH0sCi0gIHsiZXhpdG0iLCBzX21leGl0LCAwfSwKLS8qIGV4dGVuZCAqLwotICB7ImV4dGVybiIsIHNfaWdub3JlLCAwfSwJLyogV2UgdHJlYXQgYWxsIHVuZGVmIGFzIGV4dCAqLwotICB7ImFwcGZpbGUiLCBzX2FwcF9maWxlLCAxfSwKLSAgeyJhcHBsaW5lIiwgc19hcHBfbGluZSwgMH0sCi0gIHsiZmFpbCIsIHNfZmFpbCwgMH0sCi0gIHsiZmlsZSIsIHNfYXBwX2ZpbGUsIDB9LAotICB7ImZpbGwiLCBzX2ZpbGwsIDB9LAotICB7ImZsb2F0IiwgZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJmb3JtYXQiLCBzX2lnbm9yZSwgMH0sCi0gIHsiZnVuYyIsIHNfZnVuYywgMH0sCi0gIHsiZ2xvYmFsIiwgc19nbG9ibCwgMH0sCi0gIHsiZ2xvYmwiLCBzX2dsb2JsLCAwfSwKLSAgeyJod29yZCIsIGNvbnMsIDJ9LAotICB7ImlmIiwgc19pZiwgKGludCkgT19uZX0sCi0gIHsiaWZjIiwgc19pZmMsIDB9LAotICB7ImlmZGVmIiwgc19pZmRlZiwgMH0sCi0gIHsiaWZlcSIsIHNfaWYsIChpbnQpIE9fZXF9LAotICB7ImlmZXFzIiwgc19pZmVxcywgMH0sCi0gIHsiaWZnZSIsIHNfaWYsIChpbnQpIE9fZ2V9LAotICB7ImlmZ3QiLCBzX2lmLCAoaW50KSBPX2d0fSwKLSAgeyJpZmxlIiwgc19pZiwgKGludCkgT19sZX0sCi0gIHsiaWZsdCIsIHNfaWYsIChpbnQpIE9fbHR9LAotICB7ImlmbmMiLCBzX2lmYywgMX0sCi0gIHsiaWZuZGVmIiwgc19pZmRlZiwgMX0sCi0gIHsiaWZuZSIsIHNfaWYsIChpbnQpIE9fbmV9LAotICB7ImlmbmVzIiwgc19pZmVxcywgMX0sCi0gIHsiaWZub3RkZWYiLCBzX2lmZGVmLCAxfSwKLSAgeyJpbmNsdWRlIiwgc19pbmNsdWRlLCAwfSwKLSAgeyJpbnQiLCBjb25zLCA0fSwKLSAgeyJpcnAiLCBzX2lycCwgMH0sCi0gIHsiaXJlcCIsIHNfaXJwLCAwfSwKLSAgeyJpcnBjIiwgc19pcnAsIDF9LAotICB7ImlyZXBjIiwgc19pcnAsIDF9LAotICB7Imxjb21tIiwgc19sY29tbSwgMH0sCi0gIHsibGZsYWdzIiwgbGlzdGluZ19mbGFncywgMH0sCS8qIExpc3RpbmcgZmxhZ3MgKi8KLSAgeyJsaW5rb25jZSIsIHNfbGlua29uY2UsIDB9LAotICB7Imxpc3QiLCBsaXN0aW5nX2xpc3QsIDF9LAkvKiBUdXJuIGxpc3Rpbmcgb24gKi8KLSAgeyJsbGVuIiwgbGlzdGluZ19wc2l6ZSwgMX0sCi0gIHsibG9uZyIsIGNvbnMsIDR9LAotICB7ImxzeW0iLCBzX2xzeW0sIDB9LAotICB7Im1hY3JvIiwgc19tYWNybywgMH0sCi0gIHsibWV4aXQiLCBzX21leGl0LCAwfSwKLSAgeyJtcmkiLCBzX21yaSwgMH0sCi0gIHsiLm1yaSIsIHNfbXJpLCAwfSwJLyogU3BlY2lhbCBjYXNlIHNvIC5tcmkgd29ya3MgaW4gTVJJIG1vZGUuICAqLwotICB7Im5hbWUiLCBzX2lnbm9yZSwgMH0sCi0gIHsibm9mb3JtYXQiLCBzX2lnbm9yZSwgMH0sCi0gIHsibm9saXN0IiwgbGlzdGluZ19saXN0LCAwfSwJLyogVHVybiBsaXN0aW5nIG9mZiAqLwotICB7Im5vcGFnZSIsIGxpc3Rpbmdfbm9wYWdlLCAwfSwKLSAgeyJvY3RhIiwgY29ucywgMTZ9LAotICB7Im9mZnNldCIsIHNfc3RydWN0LCAwfSwKLSAgeyJvcmciLCBzX29yZywgMH0sCi0gIHsicDJhbGlnbiIsIHNfYWxpZ25fcHR3bywgMH0sCi0gIHsicDJhbGlnbnciLCBzX2FsaWduX3B0d28sIC0yfSwKLSAgeyJwMmFsaWdubCIsIHNfYWxpZ25fcHR3bywgLTR9LAotICB7InBhZ2UiLCBsaXN0aW5nX2VqZWN0LCAwfSwKLSAgeyJwbGVuIiwgbGlzdGluZ19wc2l6ZSwgMH0sCi0gIHsicHJpbnQiLCBzX3ByaW50LCAwfSwKLSAgeyJwc2l6ZSIsIGxpc3RpbmdfcHNpemUsIDB9LAkvKiBzZXQgcGFwZXIgc2l6ZSAqLwotICB7InB1cmdlbSIsIHNfcHVyZ2VtLCAwfSwKLSAgeyJxdWFkIiwgY29ucywgOH0sCi0gIHsicmVwIiwgc19yZXB0LCAwfSwKLSAgeyJyZXB0Iiwgc19yZXB0LCAwfSwKLSAgeyJydmEiLCBzX3J2YSwgNH0sCi0gIHsic2J0dGwiLCBsaXN0aW5nX3RpdGxlLCAxfSwJLyogU3VidGl0bGUgb2YgbGlzdGluZyAqLwotLyogc2NsICovCi0vKiBzZWN0ICovCi0gIHsic2V0Iiwgc19zZXQsIDB9LAotICB7InNob3J0IiwgY29ucywgMn0sCi0gIHsic2luZ2xlIiwgZmxvYXRfY29ucywgJ2YnfSwKLS8qIHNpemUgKi8KLSAgeyJzcGFjZSIsIHNfc3BhY2UsIDB9LAotICB7InNraXAiLCBzX3NwYWNlLCAwfSwKLSAgeyJzbGViMTI4Iiwgc19sZWIxMjgsIDF9LAotICB7InNwYyIsIHNfaWdub3JlLCAwfSwKLSAgeyJzdGFiZCIsIHNfc3RhYiwgJ2QnfSwKLSAgeyJzdGFibiIsIHNfc3RhYiwgJ24nfSwKLSAgeyJzdGFicyIsIHNfc3RhYiwgJ3MnfSwKLSAgeyJzdHJpbmciLCBzdHJpbmdlciwgMX0sCi0gIHsic3RydWN0Iiwgc19zdHJ1Y3QsIDB9LAotLyogdGFnICovCi0gIHsidGV4dCIsIHNfdGV4dCwgMH0sCi0KLSAgLyogVGhpcyBpcyBmb3IgZ2NjIHRvIHVzZS4gIEl0J3Mgb25seSBqdXN0IGJlZW4gYWRkZWQgKDIvOTQpLCBzbyBnY2MKLSAgICAgd29uJ3QgYmUgYWJsZSB0byB1c2UgaXQgZm9yIGEgd2hpbGUgLS0gcHJvYmFibHkgYSB5ZWFyIG9yIG1vcmUuCi0gICAgIEJ1dCBvbmNlIHRoaXMgaGFzIGJlZW4gcmVsZWFzZWQsIGNoZWNrIHdpdGggZ2NjIG1haW50YWluZXJzCi0gICAgIGJlZm9yZSBkZWxldGluZyBpdCBvciBldmVuIGNoYW5naW5nIHRoZSBzcGVsbGluZy4gICovCi0gIHsidGhpc19HQ0NfcmVxdWlyZXNfdGhlX0dOVV9hc3NlbWJsZXIiLCBzX2lnbm9yZSwgMH0sCi0gIC8qIElmIHdlJ3JlIGZvbGRpbmcgY2FzZSAtLSBkb25lIGZvciBzb21lIHRhcmdldHMsIG5vdCBuZWNlc3NhcmlseQotICAgICBhbGwgLS0gdGhlIGFib3ZlIHN0cmluZyBpbiBhbiBpbnB1dCBmaWxlIHdpbGwgYmUgY29udmVydGVkIHRvCi0gICAgIHRoaXMgb25lLiAgTWF0Y2ggaXQgZWl0aGVyIHdheS4uLiAgKi8KLSAgeyJ0aGlzX2djY19yZXF1aXJlc190aGVfZ251X2Fzc2VtYmxlciIsIHNfaWdub3JlLCAwfSwKLQotICB7InRpdGxlIiwgbGlzdGluZ190aXRsZSwgMH0sCS8qIExpc3RpbmcgdGl0bGUgKi8KLSAgeyJ0dGwiLCBsaXN0aW5nX3RpdGxlLCAwfSwKLS8qIHR5cGUgKi8KLSAgeyJ1bGViMTI4Iiwgc19sZWIxMjgsIDB9LAotLyogdXNlICovCi0vKiB2YWwgKi8KLSAgeyJ4Y29tIiwgc19jb21tLCAwfSwKLSAgeyJ4ZGVmIiwgc19nbG9ibCwgMH0sCi0gIHsieHJlZiIsIHNfaWdub3JlLCAwfSwKLSAgeyJ4c3RhYnMiLCBzX3hzdGFiLCAncyd9LAotICB7IndvcmQiLCBjb25zLCAyfSwKLSAgeyJ6ZXJvIiwgc19zcGFjZSwgMH0sCi0gIHtOVUxMfQkJCS8qIGVuZCBzZW50aW5lbCAqLwotfTsKLQotc3RhdGljIGludCBwb3Bfb3ZlcnJpZGVfb2sgPSAwOwotc3RhdGljIGNvbnN0IGNoYXIgKnBvcF90YWJsZV9uYW1lOwotCi12b2lkCi1wb3BfaW5zZXJ0ICh0YWJsZSkKLSAgICAgY29uc3QgcHNldWRvX3R5cGVTICp0YWJsZTsKLXsKLSAgY29uc3QgY2hhciAqZXJydHh0OwotICBjb25zdCBwc2V1ZG9fdHlwZVMgKnBvcDsKLSAgZm9yIChwb3AgPSB0YWJsZTsgcG9wLT5wb2NfbmFtZTsgcG9wKyspCi0gICAgewotICAgICAgZXJydHh0ID0gaGFzaF9pbnNlcnQgKHBvX2hhc2gsIHBvcC0+cG9jX25hbWUsIChjaGFyICopIHBvcCk7Ci0gICAgICBpZiAoZXJydHh0ICYmICghcG9wX292ZXJyaWRlX29rIHx8IHN0cmNtcCAoZXJydHh0LCAiZXhpc3RzIikpKQotCWFzX2ZhdGFsIChfKCJlcnJvciBjb25zdHJ1Y3RpbmcgJXMgcHNldWRvLW9wIHRhYmxlOiAlcyIpLCBwb3BfdGFibGVfbmFtZSwKLQkJICBlcnJ0eHQpOwotICAgIH0KLX0KLQotI2lmbmRlZiBtZF9wb3BfaW5zZXJ0Ci0jZGVmaW5lIG1kX3BvcF9pbnNlcnQoKQkJcG9wX2luc2VydChtZF9wc2V1ZG9fdGFibGUpCi0jZW5kaWYKLQotI2lmbmRlZiBvYmpfcG9wX2luc2VydAotI2RlZmluZSBvYmpfcG9wX2luc2VydCgpCXBvcF9pbnNlcnQob2JqX3BzZXVkb190YWJsZSkKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCAKLXBvYmVnaW4gKCkKLXsKLSAgcG9faGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIC8qIERvIHRoZSB0YXJnZXQtc3BlY2lmaWMgcHNldWRvIG9wcy4gKi8KLSAgcG9wX3RhYmxlX25hbWUgPSAibWQiOwotICBtZF9wb3BfaW5zZXJ0ICgpOwotCi0gIC8qIE5vdyBvYmplY3Qgc3BlY2lmaWMuICBTa2lwIGFueSB0aGF0IHdlcmUgaW4gdGhlIHRhcmdldCB0YWJsZS4gKi8KLSAgcG9wX3RhYmxlX25hbWUgPSAib2JqIjsKLSAgcG9wX292ZXJyaWRlX29rID0gMTsKLSAgb2JqX3BvcF9pbnNlcnQgKCk7Ci0KLSAgLyogTm93IHBvcnRhYmxlIG9uZXMuICBTa2lwIGFueSB0aGF0IHdlJ3ZlIHNlZW4gYWxyZWFkeS4gKi8KLSAgcG9wX3RhYmxlX25hbWUgPSAic3RhbmRhcmQiOwotICBwb3BfaW5zZXJ0IChwb3RhYmxlKTsKLX0KLQwKLSNkZWZpbmUgSEFORExFX0NPTkRJVElPTkFMX0FTU0VNQkxZKCkJCQkJCVwKLSAgaWYgKGlnbm9yZV9pbnB1dCAoKSkJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcisrXSkJXAotCWlmIChpbnB1dF9saW5lX3BvaW50ZXIgPT0gYnVmZmVyX2xpbWl0KQkJCQlcCi0JICBicmVhazsJCQkJCQkJXAotICAgICAgY29udGludWU7CQkJCQkJCQlcCi0gICAgfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIHNjcnViYmluZyB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuICNBUFAKLSAgIGFuZCAjTk9fQVBQLiAgKi8KLQotc3RhdGljIGNoYXIgKnNjcnViX3N0cmluZzsKLXN0YXRpYyBjaGFyICpzY3J1Yl9zdHJpbmdfZW5kOwotCi1zdGF0aWMgaW50Ci1zY3J1Yl9mcm9tX3N0cmluZyAoZnJvbSkKLSAgICAgY2hhciAqKmZyb207Ci17Ci0gIGludCBzaXplOwotCi0gICpmcm9tID0gc2NydWJfc3RyaW5nOwotICBzaXplID0gc2NydWJfc3RyaW5nX2VuZCAtIHNjcnViX3N0cmluZzsKLSAgc2NydWJfc3RyaW5nID0gc2NydWJfc3RyaW5nX2VuZDsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qCXJlYWRfYV9zb3VyY2VfZmlsZSgpCi0gKgotICogV2UgcmVhZCB0aGUgZmlsZSwgcHV0dGluZyB0aGluZ3MgaW50byBhIHdlYiB0aGF0Ci0gKiByZXByZXNlbnRzIHdoYXQgd2UgaGF2ZSBiZWVuIHJlYWRpbmcuCi0gKi8KLXZvaWQgCi1yZWFkX2Ffc291cmNlX2ZpbGUgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgYzsKLSAgcmVnaXN0ZXIgY2hhciAqczsJCS8qIHN0cmluZyBvZiBzeW1ib2wsICdcMCcgYXBwZW5kZWQgKi8KLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gIHBzZXVkb190eXBlUyAqcG9wOwotCi0gIGJ1ZmZlciA9IGlucHV0X3NjcnViX25ld19maWxlIChuYW1lKTsKLQotICBsaXN0aW5nX2ZpbGUgKG5hbWUpOwotICBsaXN0aW5nX25ld2xpbmUgKE5VTEwpOwotICByZWdpc3Rlcl9kZXBlbmRlbmN5IChuYW1lKTsKLQotICAvKiBHZW5lcmF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYmVmb3JlIHdlJ3ZlIHJlYWQgYW55dGhpbmcgaW4gdG8gZGVub3RlCi0gICAgIHRoaXMgZmlsZSBhcyB0aGUgIm1haW4iIHNvdXJjZSBmaWxlIGFuZCBub3QgYSBzdWJvcmRpbmF0ZSBvbmUKLSAgICAgKGUuZy4gTl9TTyB2cyBOX1NPTCBpbiBzdGFicykuICAqLwotICBnZW5lcmF0ZV9maWxlX2RlYnVnICgpOwotCi0gIHdoaWxlICgoYnVmZmVyX2xpbWl0ID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIpKSAhPSAwKQotICAgIHsJCQkJLyogV2UgaGF2ZSBhbm90aGVyIGxpbmUgdG8gcGFyc2UuICovCi0gICAgICBrbm93IChidWZmZXJfbGltaXRbLTFdID09ICdcbicpOwkvKiBNdXN0IGhhdmUgYSBzZW50aW5lbC4gKi8KLSAgICBjb250aW46CQkJLyogSkYgdGhpcyBnb3RvIGlzIG15IGZhdWx0IEkgYWRtaXQgaXQuCi0JCQkJICAgU29tZW9uZSBicmF2ZSBwbGVhc2UgcmUtd3JpdGUgdGhlIHdob2xlCi0JCQkJICAgaW5wdXQgc2VjdGlvbiBoZXJlPyAgUGxlZXplPz8/ICAqLwotICAgICAgd2hpbGUgKGlucHV0X2xpbmVfcG9pbnRlciA8IGJ1ZmZlcl9saW1pdCkKLQl7Ci0JICAvKiBXZSBoYXZlIG1vcmUgb2YgdGhpcyBidWZmZXIgdG8gcGFyc2UuICovCi0KLQkgIC8qCi0JICAgKiBXZSBub3cgaGF2ZSBpbnB1dF9saW5lX3BvaW50ZXItPjFzdCBjaGFyIG9mIG5leHQgbGluZS4KLQkgICAqIElmIGlucHV0X2xpbmVfcG9pbnRlciBbLTFdID09ICdcbicgdGhlbiB3ZSBqdXN0Ci0JICAgKiBzY2FubmVkIGFub3RoZXIgbGluZTogc28gYnVtcCBsaW5lIGNvdW50ZXJzLgotCSAgICovCi0JICBpZiAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpIGlucHV0X2xpbmVfcG9pbnRlclstMV1dKQotCSAgICB7Ci0jaWZkZWYgbWRfc3RhcnRfbGluZV9ob29rCi0JICAgICAgbWRfc3RhcnRfbGluZV9ob29rICgpOwotI2VuZGlmCi0KLQkgICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWy0xXSA9PSAnXG4nKQotCQlidW1wX2xpbmVfY291bnRlcnMgKCk7Ci0KLQkgICAgICBsaW5lX2xhYmVsID0gTlVMTDsKLQotCSAgICAgIGlmIChmbGFnX202OGtfbXJpCi0jaWZkZWYgTEFCRUxTX1dJVEhPVVRfQ09MT05TCi0JCSAgfHwgMQotI2VuZGlmCi0JCSAgKQotCQl7Ci0JCSAgLyogVGV4dCBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lIG11c3QgYmUgYSBsYWJlbCwgd2UKLQkJICAgICBydW4gZG93biBhbmQgc3RpY2sgYSBjb2xvbiBpbi4gICovCi0JCSAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKCppbnB1dF9saW5lX3BvaW50ZXIpKQotCQkgICAgewotCQkgICAgICBjaGFyICpsaW5lX3N0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQkgICAgICBjaGFyIGM7Ci0JCSAgICAgIGludCBtcmlfbGluZV9tYWNybzsKLQotCQkgICAgICBMSVNUSU5HX05FV0xJTkUgKCk7Ci0JCSAgICAgIEhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSAoKTsKLQotCQkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkJICAgICAgLyogSW4gTVJJIG1vZGUsIHRoZSBFUVUgYW5kIE1BQ1JPIHBzZXVkb29wcyBtdXN0Ci0JCQkgYmUgaGFuZGxlZCBzcGVjaWFsbHkuICAqLwotCQkgICAgICBtcmlfbGluZV9tYWNybyA9IDA7Ci0JCSAgICAgIGlmIChmbGFnX202OGtfbXJpKQotCQkJewotCQkJICBjaGFyICpyZXN0ID0gaW5wdXRfbGluZV9wb2ludGVyICsgMTsKLQotCQkJICBpZiAoKnJlc3QgPT0gJzonKQotCQkJICAgICsrcmVzdDsKLQkJCSAgaWYgKCpyZXN0ID09ICcgJyB8fCAqcmVzdCA9PSAnXHQnKQotCQkJICAgICsrcmVzdDsKLQkJCSAgaWYgKChzdHJuY2FzZWNtcCAocmVzdCwgIkVRVSIsIDMpID09IDAKLQkJCSAgICAgICB8fCBzdHJuY2FzZWNtcCAocmVzdCwgIlNFVCIsIDMpID09IDApCi0JCQkgICAgICAmJiAocmVzdFszXSA9PSAnICcgfHwgcmVzdFszXSA9PSAnXHQnKSkKLQkJCSAgICB7Ci0JCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSByZXN0ICsgMzsKLQkJCSAgICAgIGVxdWFscyAobGluZV9zdGFydCwKLQkJCQkgICAgICBzdHJuY2FzZWNtcCAocmVzdCwgIlNFVCIsIDMpID09IDApOwotCQkJICAgICAgY29udGludWU7Ci0JCQkgICAgfQotCQkJICBpZiAoc3RybmNhc2VjbXAgKHJlc3QsICJNQUNSTyIsIDUpID09IDAKLQkJCSAgICAgICYmIChyZXN0WzVdID09ICcgJwotCQkJCSAgfHwgcmVzdFs1XSA9PSAnXHQnCi0JCQkJICB8fCBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgcmVzdFs1XV0pKQotCQkJICAgIG1yaV9saW5lX21hY3JvID0gMTsKLQkJCX0KLQotCQkgICAgICAvKiBJbiBNUkkgbW9kZSwgd2UgbmVlZCB0byBoYW5kbGUgdGhlIE1BQ1JPCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHNldWRvLW9wIHNwZWNpYWxseTogd2UgZG9uJ3Qgd2FudCB0byBwdXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCQkgICAgICBpZiAoISBtcmlfbGluZV9tYWNybykKLQkJCWxpbmVfbGFiZWwgPSBjb2xvbiAobGluZV9zdGFydCk7Ci0JCSAgICAgIGVsc2UKLQkJCWxpbmVfbGFiZWwgPSBzeW1ib2xfY3JlYXRlIChsaW5lX3N0YXJ0LAotCQkJCQkJICAgIGFic29sdXRlX3NlY3Rpb24sCi0JCQkJCQkgICAgKHZhbHVlVCkgMCwKLQkJCQkJCSAgICAmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgICBpZiAoYyA9PSAnOicpCi0JCQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIC8qCi0JICAgKiBXZSBhcmUgYXQgdGhlIGJlZ2luaW5nIG9mIGEgbGluZSwgb3Igc2ltaWxhciBwbGFjZS4KLQkgICAqIFdlIGV4cGVjdCBhIHdlbGwtZm9ybWVkIGFzc2VtYmxlciBzdGF0ZW1lbnQuCi0JICAgKiBBICJzeW1ib2wtbmFtZToiIGlzIGEgc3RhdGVtZW50LgotCSAgICoKLQkgICAqIERlcGVuZGluZyBvbiB3aGF0IGNvbXBpbGVyIGlzIHVzZWQsIHRoZSBvcmRlciBvZiB0aGVzZSB0ZXN0cwotCSAgICogbWF5IHZhcnkgdG8gY2F0Y2ggbW9zdCBjb21tb24gY2FzZSAxc3QuCi0JICAgKiBFYWNoIHRlc3QgaXMgaW5kZXBlbmRlbnQgb2YgYWxsIG90aGVyIHRlc3RzIGF0IHRoZSAodG9wKSBsZXZlbC4KLQkgICAqIFBMRUFTRSBtYWtlIGEgY29tcGlsZXIgdGhhdCBkb2Vzbid0IHVzZSB0aGlzIGFzc2VtYmxlci4KLQkgICAqIEl0IGlzIGNydWZ0eSB0byB3YXN0ZSBhIGNvbXBpbGVyJ3MgdGltZSBlbmNvZGluZyB0aGluZ3MgZm9yIHRoaXMKLQkgICAqIGFzc2VtYmxlciwgd2hpY2ggdGhlbiB3YXN0ZXMgbW9yZSB0aW1lIGRlY29kaW5nIGl0LgotCSAgICogKEFuZCBjb21tdW5pY2F0aW5nIHZpYSAobGluZWFyKSBmaWxlcyBpcyBzaWxseSEKLQkgICAqIElmIHlvdSBtdXN0IHBhc3Mgc3R1ZmYsIHBsZWFzZSBwYXNzIGEgdHJlZSEpCi0JICAgKi8KLQkgIGlmICgoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykgPT0gJ1x0JwotCSAgICAgIHx8IGMgPT0gJyAnCi0JICAgICAgfHwgYyA9PSAnXGYnCi0JICAgICAgfHwgYyA9PSAwKQotCSAgICB7Ci0JICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgfQotCSAga25vdyAoYyAhPSAnICcpOwkvKiBObyBmdXJ0aGVyIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi8KLQotI2lmbmRlZiBOT19MSVNUSU5HCi0JICAvKiBJZiBsaXN0aW5nIGlzIG9uLCBhbmQgd2UgYXJlIGV4cGFuZGluZyBhIG1hY3JvLCB0aGVuIGdpdmUKLQkgICAgIHRoZSBsaXN0aW5nIGNvZGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBleHBhbmRlZCBsaW5lLiAgKi8KLQkgIGlmIChsaXN0aW5nKQotCSAgICB7Ci0JICAgICAgaWYgKChsaXN0aW5nICYgTElTVElOR19NQUNFWFApICYmIG1hY3JvX25lc3QgPiAwKQotCQl7Ci0JCSAgY2hhciAqY29weTsKLQkJICBpbnQgbGVuOwotCi0JCSAgLyogRmluZCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGV4cGFuZGVkIG1hY3JvIGxpbmUuICAqLwotCQkgIGZvciAocyA9IGlucHV0X2xpbmVfcG9pbnRlci0xOyAqcyA7ICsrcykKLQkJICAgIGlmIChpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnNdKQotCQkgICAgICBicmVhazsKLQotCQkgIC8qIENvcHkgaXQgZm9yIHNhZmUga2VlcGluZy4gIEFsc28gZ2l2ZSBhbiBpbmRpY2F0aW9uIG9mCi0JCSAgICAgaG93IG11Y2ggbWFjcm8gbmVzdGluZyBpcyBpbnZvbHZlZCBhdCB0aGlzIHBvaW50LiAgKi8KLQkJICBsZW4gPSBzIC0gKGlucHV0X2xpbmVfcG9pbnRlci0xKTsKLQkJICBjb3B5ID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgbWFjcm9fbmVzdCArIDIpOwotCQkgIG1lbXNldCAoY29weSwgJz4nLCBtYWNyb19uZXN0KTsKLQkJICBjb3B5W21hY3JvX25lc3RdID0gJyAnOwotCQkgIG1lbWNweSAoY29weSArIG1hY3JvX25lc3QgKyAxLCBpbnB1dF9saW5lX3BvaW50ZXItMSwgbGVuKTsKLQkJICBjb3B5W21hY3JvX25lc3QrMStsZW5dID0gJ1wwJzsKLQotCQkgIC8qIEluc3RhbGwgdGhlIGxpbmUgd2l0aCB0aGUgbGlzdGluZyBmYWNpbGl0eS4gICovCi0JCSAgbGlzdGluZ19uZXdsaW5lIChjb3B5KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJbGlzdGluZ19uZXdsaW5lIChOVUxMKTsKLQkgICAgfQotI2VuZGlmCi0KLQkgIC8qCi0JICAgKiBDIGlzIHRoZSAxc3Qgc2lnbmlmaWNhbnQgY2hhcmFjdGVyLgotCSAgICogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyBhZnRlciB0aGF0IGNoYXJhY3Rlci4KLQkgICAqLwotCSAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKGMpKQotCSAgICB7Ci0JICAgICAgLyogd2FudCB1c2VyLWRlZmluZWQgbGFiZWwgb3IgcHNldWRvL29wY29kZSAqLwotCSAgICAgIEhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSAoKTsKLQotCSAgICAgIHMgPSAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CS8qIG5hbWUncyBkZWxpbWl0ZXIgKi8KLQkgICAgICAvKgotCSAgICAgICAqIEMgaXMgY2hhcmFjdGVyIGFmdGVyIHN5bWJvbC4KLQkgICAgICAgKiBUaGF0IGNoYXJhY3RlcidzIHBsYWNlIGluIHRoZSBpbnB1dCBsaW5lIGlzIG5vdyAnXDAnLgotCSAgICAgICAqIFMgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN5bWJvbC4KLQkgICAgICAgKiAgIFtJbiBjYXNlIG9mIHBzZXVkby1vcCwgcy0+Jy4nLl0KLQkgICAgICAgKiBJbnB1dF9saW5lX3BvaW50ZXItPidcMCcgd2hlcmUgYyB3YXMuCi0JICAgICAgICovCi0JICAgICAgaWYgKFRDX1NUQVJUX0xBQkVMKGMsIGlucHV0X2xpbmVfcG9pbnRlcikpCi0JCXsKLQkJICBpZiAoZmxhZ19tNjhrX21yaSkKLQkJICAgIHsKLQkJICAgICAgY2hhciAqcmVzdCA9IGlucHV0X2xpbmVfcG9pbnRlciArIDE7Ci0KLQkJICAgICAgLyogSW4gTVJJIG1vZGUsIFx0c3ltOiBzZXQgMCBpcyBwZXJtaXR0ZWQuICAqLwotCi0JCSAgICAgIGlmICgqcmVzdCA9PSAnOicpCi0JCQkrK3Jlc3Q7Ci0JCSAgICAgIGlmICgqcmVzdCA9PSAnICcgfHwgKnJlc3QgPT0gJ1x0JykKLQkJCSsrcmVzdDsKLQkJICAgICAgaWYgKChzdHJuY2FzZWNtcCAocmVzdCwgIkVRVSIsIDMpID09IDAKLQkJCSAgIHx8IHN0cm5jYXNlY21wIChyZXN0LCAiU0VUIiwgMykgPT0gMCkKLQkJCSAgJiYgKHJlc3RbM10gPT0gJyAnIHx8IHJlc3RbM10gPT0gJ1x0JykpCi0JCQl7Ci0JCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHJlc3QgKyAzOwotCQkJICBlcXVhbHMgKHMsIDEpOwotCQkJICBjb250aW51ZTsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGxpbmVfbGFiZWwgPSBjb2xvbiAocyk7CS8qIHVzZXItZGVmaW5lZCBsYWJlbCAqLwotCQkgICppbnB1dF9saW5lX3BvaW50ZXIrKyA9ICc6JzsJLyogUHV0ICc6JyBiYWNrIGZvciBlcnJvciBtZXNzYWdlcycgc2FrZS4gKi8KLQkJICAvKiBJbnB1dF9saW5lX3BvaW50ZXItPmFmdGVyICc6Jy4gKi8KLQkJICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLQotCQl9Ci0JICAgICAgZWxzZSBpZiAoYyA9PSAnPScKLQkJICAgICAgIHx8ICgoYyA9PSAnICcgfHwgYyA9PSAnXHQnKQotCQkJICAgJiYgaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICc9JwotI2lmZGVmIFRDX0VRVUFMX0lOX0lOU04KLQkJCSAgICYmICEgVENfRVFVQUxfSU5fSU5TTiAoYywgaW5wdXRfbGluZV9wb2ludGVyKQotI2VuZGlmCi0JCQkgICApKQotCQl7Ci0JCSAgZXF1YWxzIChzLCAxKTsKLQkJICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7CQkvKiBleHBlY3QgcHNldWRvLW9wIG9yIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gKi8KLQkJICBwb3AgPSBOVUxMOwotCi0jZGVmaW5lIElHTk9SRV9PUENPREVfQ0FTRQotI2lmZGVmIElHTk9SRV9PUENPREVfQ0FTRQotCQkgIHsKLQkJICAgIGNoYXIgKnMyID0gczsKLQkJICAgIHdoaWxlICgqczIpCi0JCSAgICAgIHsKLQkJCWlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgKnMyKSkKLQkJCSAgKnMyID0gdG9sb3dlciAoKnMyKTsKLQkJCXMyKys7Ci0JCSAgICAgIH0KLQkJICB9Ci0jZW5kaWYKLQotCQkgIGlmIChmbGFnX202OGtfbXJpCi0jaWZkZWYgTk9fUFNFVURPX0RPVAotCQkgICAgICB8fCAxCi0jZW5kaWYKLQkJICAgICAgKQotCQkgICAgewotCQkgICAgICAvKiBUaGUgTVJJIGFzc2VtYmxlciBhbmQgdGhlIG04OGsgdXNlIHBzZXVkby1vcHMKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IGEgcGVyaW9kLiAgKi8KLQkJICAgICAgcG9wID0gKHBzZXVkb190eXBlUyAqKSBoYXNoX2ZpbmQgKHBvX2hhc2gsIHMpOwotCQkgICAgICBpZiAocG9wICE9IE5VTEwgJiYgcG9wLT5wb2NfaGFuZGxlciA9PSBOVUxMKQotCQkJcG9wID0gTlVMTDsKLQkJICAgIH0KLQotCQkgIGlmIChwb3AgIT0gTlVMTAotCQkgICAgICB8fCAoISBmbGFnX202OGtfbXJpICYmICpzID09ICcuJykpCi0JCSAgICB7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqIFBTRVVETyAtIE9QLgotCQkgICAgICAgKgotCQkgICAgICAgKiBXQVJOSU5HOiBjIGhhcyBuZXh0IGNoYXIsIHdoaWNoIG1heSBiZSBlbmQtb2YtbGluZS4KLQkJICAgICAgICogV2UgbG9va3VwIHRoZSBwc2V1ZG8tb3AgdGFibGUgd2l0aCBzKzEgYmVjYXVzZSB3ZQotCQkgICAgICAgKiBhbHJlYWR5IGtub3cgdGhhdCB0aGUgcHNldWRvLW9wIGJlZ2lucyB3aXRoIGEgJy4nLgotCQkgICAgICAgKi8KLQotCQkgICAgICBpZiAocG9wID09IE5VTEwpCi0JCQlwb3AgPSAocHNldWRvX3R5cGVTICopIGhhc2hfZmluZCAocG9faGFzaCwgcyArIDEpOwotCi0JCSAgICAgIC8qIEluIE1SSSBtb2RlLCB3ZSBtYXkgbmVlZCB0byBpbnNlcnQgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWMgYWxpZ25tZW50IGRpcmVjdGl2ZS4gIFdoYXQgYSBoYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcy4gICovCi0JCSAgICAgIGlmIChtcmlfcGVuZGluZ19hbGlnbgotCQkJICAmJiAocG9wID09IE5VTEwKLQkJCSAgICAgIHx8ICEgKChwb3AtPnBvY19oYW5kbGVyID09IGNvbnMKLQkJCQkgICAgICYmIHBvcC0+cG9jX3ZhbCA9PSAxKQotCQkJCSAgICB8fCAocG9wLT5wb2NfaGFuZGxlciA9PSBzX3NwYWNlCi0JCQkJCSYmIHBvcC0+cG9jX3ZhbCA9PSAxKQotI2lmZGVmIHRjX2NvbmRpdGlvbmFsX3BzZXVkb29wCi0JCQkJICAgIHx8IHRjX2NvbmRpdGlvbmFsX3BzZXVkb29wIChwb3ApCi0jZW5kaWYKLQkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2lmCi0JCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19pZmRlZgotCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfaWZjCi0JCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19pZmVxcwotCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfZWxzZQotCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfZW5kaWYKLQkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2dsb2JsCi0JCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19pZ25vcmUpKSkKLQkJCXsKLQkJCSAgZG9fYWxpZ24gKDEsIChjaGFyICopIE5VTEwsIDAsIDApOwotCQkJICBtcmlfcGVuZGluZ19hbGlnbiA9IDA7Ci0JCQkgIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCi0JCQkgICAgewotCQkJICAgICAgbGluZV9sYWJlbC0+c3lfZnJhZyA9IGZyYWdfbm93OwotCQkJICAgICAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIGZyYWdfbm93X2ZpeCAoKSk7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIC8qIFByaW50IHRoZSBlcnJvciBtc2cgbm93LCB3aGlsZSB3ZSBzdGlsbCBjYW4gKi8KLQkJICAgICAgaWYgKHBvcCA9PSBOVUxMKQotCQkJewotCQkJICBhc19iYWQgKF8oIlVua25vd24gcHNldWRvLW9wOiAgYCVzJyIpLCBzKTsKLQkJCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCQkgIHNfaWdub3JlICgwKTsKLQkJCSAgY29udGludWU7Ci0JCQl9Ci0KLQkJICAgICAgLyogUHV0IGl0IGJhY2sgZm9yIGVycm9yIG1lc3NhZ2VzIGV0Yy4gKi8KLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICAgIC8qIFRoZSBmb2xsb3dpbmcgc2tpcCBvZiB3aGl0ZXNwYWNlIGlzIGNvbXB1bHNvcnkuCi0JCQkgQSB3ZWxsIHNoYXBlZCBzcGFjZSBpcyBzb21ldGltZXMgYWxsIHRoYXQgc2VwYXJhdGVzCi0JCQkga2V5d29yZCBmcm9tIG9wZXJhbmRzLiAqLwotCQkgICAgICBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKQotCQkJaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqIElucHV0X2xpbmUgaXMgcmVzdG9yZWQuCi0JCSAgICAgICAqIElucHV0X2xpbmVfcG9pbnRlci0+MXN0IG5vbi1ibGFuayBjaGFyCi0JCSAgICAgICAqIGFmdGVyIHBzZXVkby1vcGVyYXRpb24uCi0JCSAgICAgICAqLwotCQkgICAgICAoKnBvcC0+cG9jX2hhbmRsZXIpIChwb3AtPnBvY192YWwpOwotCi0JCSAgICAgIC8qIElmIHRoYXQgd2FzIC5lbmQsIGp1c3QgZ2V0IG91dCBub3cuICAqLwotCQkgICAgICBpZiAocG9wLT5wb2NfaGFuZGxlciA9PSBzX2VuZCkKLQkJCWdvdG8gcXVpdDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGludCBpbnF1b3RlID0gMDsKLQotCQkgICAgICAvKiBXQVJOSU5HOiBjIGhhcyBjaGFyLCB3aGljaCBtYXkgYmUgZW5kLW9mLWxpbmUuICovCi0JCSAgICAgIC8qIEFsc286IGlucHV0X2xpbmVfcG9pbnRlci0+YFwwYCB3aGVyZSBjIHdhcy4gKi8KLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICAgIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdCi0JCQkgICAgIHx8IGlucXVvdGUKLSNpZmRlZiBUQ19FT0xfSU5fSU5TTgotCQkJICAgICB8fCBUQ19FT0xfSU5fSU5TTiAoaW5wdXRfbGluZV9wb2ludGVyKQotI2VuZGlmCi0JCQkgICAgICkKLQkJCXsKLQkJCSAgaWYgKGZsYWdfbTY4a19tcmkgJiYgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCcnKQotCQkJICAgIGlucXVvdGUgPSAhIGlucXVvdGU7Ci0JCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkJfQotCi0JCSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLQotCQkgICAgICBnZW5lcmF0ZV9saW5lbm9fZGVidWcgKCk7Ci0KLQkJICAgICAgaWYgKG1hY3JvX2RlZmluZWQpCi0JCQl7Ci0JCQkgIHNiIG91dDsKLQkJCSAgY29uc3QgY2hhciAqZXJyOwotCi0JCQkgIGlmIChjaGVja19tYWNybyAocywgJm91dCwgJ1wwJywgJmVycikpCi0JCQkgICAgewotCQkJICAgICAgaWYgKGVyciAhPSBOVUxMKQotCQkJCWFzX2JhZCAoZXJyKTsKLQkJCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIrKyA9IGM7Ci0JCQkgICAgICBpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiICgmb3V0LAotCQkJCQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyKTsKLQkJCSAgICAgIHNiX2tpbGwgKCZvdXQpOwotCQkJICAgICAgYnVmZmVyX2xpbWl0ID0KLQkJCQlpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmlucHV0X2xpbmVfcG9pbnRlcik7Ci0JCQkgICAgICBjb250aW51ZTsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgaWYgKG1yaV9wZW5kaW5nX2FsaWduKQotCQkJewotCQkJICBkb19hbGlnbiAoMSwgKGNoYXIgKikgTlVMTCwgMCwgMCk7Ci0JCQkgIG1yaV9wZW5kaW5nX2FsaWduID0gMDsKLQkJCSAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLQkJCSAgICB7Ci0JCQkgICAgICBsaW5lX2xhYmVsLT5zeV9mcmFnID0gZnJhZ19ub3c7Ci0JCQkgICAgICBTX1NFVF9WQUxVRSAobGluZV9sYWJlbCwgZnJhZ19ub3dfZml4ICgpKTsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgbWRfYXNzZW1ibGUgKHMpOwkvKiBBc3NlbWJsZSAxIGluc3RydWN0aW9uLiAqLwotCi0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIrKyA9IGM7Ci0KLQkJICAgICAgLyogV2UgcmVzdW1lIGxvb3AgQUZURVIgdGhlIGVuZC1vZi1saW5lIGZyb20KLQkJCSB0aGlzIGluc3RydWN0aW9uLiAqLwotCQkgICAgfQkJLyogaWYgKCpzPT0nLicpICovCi0JCX0JCS8qIGlmIGM9PSc6JyAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9CQkJLyogaWYgKGlzX25hbWVfYmVnaW5uZXIoYykgKi8KLQotCi0JICAvKiBFbXB0eSBzdGF0ZW1lbnQ/ICAqLwotCSAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSBjXSkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmICgoTE9DQUxfTEFCRUxTX0RPTExBUiB8fCBMT0NBTF9MQUJFTFNfRkIpCi0JICAgICAgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpKQotCSAgICB7Ci0JICAgICAgLyogbG9jYWwgbGFiZWwgICgiNDoiKSAqLwotCSAgICAgIGNoYXIgKmJhY2t1cCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotCSAgICAgIEhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSAoKTsKLQotCSAgICAgIHRlbXAgPSBjIC0gJzAnOwotCi0JICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLQkJewotCQkgIHRlbXAgPSAodGVtcCAqIDEwKSArICppbnB1dF9saW5lX3BvaW50ZXIgLSAnMCc7Ci0JCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCX0JCS8qIHJlYWQgdGhlIHdob2xlIG51bWJlciAqLwotCi0JICAgICAgaWYgKExPQ0FMX0xBQkVMU19ET0xMQVIKLQkJICAmJiAqaW5wdXRfbGluZV9wb2ludGVyID09ICckJwotCQkgICYmICooaW5wdXRfbGluZV9wb2ludGVyICsgMSkgPT0gJzonKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0KLQkJICBpZiAoZG9sbGFyX2xhYmVsX2RlZmluZWQgKHRlbXApKQotCQkgICAgewotCQkgICAgICBhc19mYXRhbCAoXygibGFiZWwgXCIlZCRcIiByZWRlZmluZWQiKSwgdGVtcCk7Ci0JCSAgICB9Ci0KLQkJICBkZWZpbmVfZG9sbGFyX2xhYmVsICh0ZW1wKTsKLQkJICBjb2xvbiAoZG9sbGFyX2xhYmVsX25hbWUgKHRlbXAsIDApKTsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgICAgaWYgKExPQ0FMX0xBQkVMU19GQgotCQkgICYmICppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnOicpCi0JCXsKLQkJICBmYl9sYWJlbF9pbnN0YW5jZV9pbmMgKHRlbXApOwotCQkgIGNvbG9uIChmYl9sYWJlbF9uYW1lICh0ZW1wLCAwKSk7Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGJhY2t1cDsKLQkgICAgfQkJCS8qIGxvY2FsIGxhYmVsICAoIjQ6IikgKi8KLQotCSAgaWYgKGMgJiYgc3RyY2hyIChsaW5lX2NvbW1lbnRfY2hhcnMsIGMpKQotCSAgICB7CQkJLyogSXRzIGEgY29tbWVudC4gIEJldHRlciBzYXkgQVBQIG9yIE5PX0FQUCAqLwotCSAgICAgIGNoYXIgKmVuZHM7Ci0JICAgICAgY2hhciAqbmV3X2J1ZjsKLQkgICAgICBjaGFyICpuZXdfdG1wOwotCSAgICAgIHVuc2lnbmVkIGludCBuZXdfbGVuZ3RoOwotCSAgICAgIGNoYXIgKnRtcF9idWYgPSAwOwotCi0JICAgICAgYnVtcF9saW5lX2NvdW50ZXJzICgpOwotCSAgICAgIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICJBUFBcbiIsIDQpKQotCQljb250aW51ZTsJLyogV2UgaWdub3JlIGl0ICovCi0JICAgICAgcyArPSA0OwotCi0JICAgICAgZW5kcyA9IHN0cnN0ciAocywgIiNOT19BUFBcbiIpOwotCi0JICAgICAgaWYgKCFlbmRzKQotCQl7Ci0JCSAgdW5zaWduZWQgaW50IHRtcF9sZW47Ci0JCSAgdW5zaWduZWQgaW50IG51bTsKLQotCQkgIC8qIFRoZSBlbmQgb2YgdGhlICNBUFAgd2Fzbid0IGluIHRoaXMgYnVmZmVyLiAgV2UKLQkJICAgICBrZWVwIHJlYWRpbmcgaW4gYnVmZmVycyB1bnRpbCB3ZSBmaW5kIHRoZSAjTk9fQVBQCi0JCSAgICAgdGhhdCBnb2VzIHdpdGggdGhpcyAjQVBQICBUaGVyZSBpcyBvbmUuICBUaGUgc3BlY3MKLQkJICAgICBndWFyZW50ZWUgaXQuIC4gLiAqLwotCQkgIHRtcF9sZW4gPSBidWZmZXJfbGltaXQgLSBzOwotCQkgIHRtcF9idWYgPSB4bWFsbG9jICh0bXBfbGVuICsgMSk7Ci0JCSAgbWVtY3B5ICh0bXBfYnVmLCBzLCB0bXBfbGVuKTsKLQkJICBkbwotCQkgICAgewotCQkgICAgICBuZXdfdG1wID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZidWZmZXIpOwotCQkgICAgICBpZiAoIW5ld190bXApCi0JCQlicmVhazsKLQkJICAgICAgZWxzZQotCQkJYnVmZmVyX2xpbWl0ID0gbmV3X3RtcDsKLQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gYnVmZmVyOwotCQkgICAgICBlbmRzID0gc3Ryc3RyIChidWZmZXIsICIjTk9fQVBQXG4iKTsKLQkJICAgICAgaWYgKGVuZHMpCi0JCQludW0gPSBlbmRzIC0gYnVmZmVyOwotCQkgICAgICBlbHNlCi0JCQludW0gPSBidWZmZXJfbGltaXQgLSBidWZmZXI7Ci0KLQkJICAgICAgdG1wX2J1ZiA9IHhyZWFsbG9jICh0bXBfYnVmLCB0bXBfbGVuICsgbnVtKTsKLQkJICAgICAgbWVtY3B5ICh0bXBfYnVmICsgdG1wX2xlbiwgYnVmZmVyLCBudW0pOwotCQkgICAgICB0bXBfbGVuICs9IG51bTsKLQkJICAgIH0KLQkJICB3aGlsZSAoIWVuZHMpOwotCi0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gZW5kcyA/IGVuZHMgKyA4IDogTlVMTDsKLQotCQkgIHMgPSB0bXBfYnVmOwotCQkgIGVuZHMgPSBzICsgdG1wX2xlbjsKLQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gZW5kcyArIDg7Ci0JCX0KLQotCSAgICAgIHNjcnViX3N0cmluZyA9IHM7Ci0JICAgICAgc2NydWJfc3RyaW5nX2VuZCA9IGVuZHM7Ci0KLQkgICAgICBuZXdfbGVuZ3RoID0gZW5kcyAtIHM7Ci0JICAgICAgbmV3X2J1ZiA9IChjaGFyICopIHhtYWxsb2MgKG5ld19sZW5ndGgpOwotCSAgICAgIG5ld190bXAgPSBuZXdfYnVmOwotCSAgICAgIGZvciAoOzspCi0JCXsKLQkJICBpbnQgc3BhY2U7Ci0JCSAgaW50IHNpemU7Ci0KLQkJICBzcGFjZSA9IChuZXdfYnVmICsgbmV3X2xlbmd0aCkgLSBuZXdfdG1wOwotCQkgIHNpemUgPSBkb19zY3J1Yl9jaGFycyAoc2NydWJfZnJvbV9zdHJpbmcsIG5ld190bXAsIHNwYWNlKTsKLQotCQkgIGlmIChzaXplIDwgc3BhY2UpCi0JCSAgICB7Ci0JCSAgICAgIG5ld190bXAgKz0gc2l6ZTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBuZXdfYnVmID0geHJlYWxsb2MgKG5ld19idWYsIG5ld19sZW5ndGggKyAxMDApOwotCQkgIG5ld190bXAgPSBuZXdfYnVmICsgbmV3X2xlbmd0aDsKLQkJICBuZXdfbGVuZ3RoICs9IDEwMDsKLQkJfQotCi0JICAgICAgaWYgKHRtcF9idWYpCi0JCWZyZWUgKHRtcF9idWYpOwotCSAgICAgIG9sZF9idWZmZXIgPSBidWZmZXI7Ci0JICAgICAgb2xkX2lucHV0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIG9sZF9saW1pdCA9IGJ1ZmZlcl9saW1pdDsKLQkgICAgICBidWZmZXIgPSBuZXdfYnVmOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IG5ld19idWY7Ci0JICAgICAgYnVmZmVyX2xpbWl0ID0gbmV3X3RtcDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBIQU5ETEVfQ09ORElUSU9OQUxfQVNTRU1CTFkgKCk7Ci0KLSNpZmRlZiB0Y191bnJlY29nbml6ZWRfbGluZQotCSAgaWYgKHRjX3VucmVjb2duaXplZF9saW5lIChjKSkKLQkgICAgY29udGludWU7Ci0jZW5kaWYKLQotCSAgLyogYXNfd2FybigiSnVuayBjaGFyYWN0ZXIgJWQuIixjKTsgIE5vdyBkb25lIGJ5IGlnbm9yZV9yZXN0ICovCi0JICBpbnB1dF9saW5lX3BvaW50ZXItLTsJLyogUmVwb3J0IHVua25vd24gY2hhciBhcyBpZ25vcmVkLiAqLwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQl9CQkJLyogd2hpbGUgKGlucHV0X2xpbmVfcG9pbnRlcjxidWZmZXJfbGltaXQpICovCi0KLSNpZmRlZiBtZF9hZnRlcl9wYXNzX2hvb2sKLSAgICAgIG1kX2FmdGVyX3Bhc3NfaG9vayAoKTsKLSNlbmRpZgotCi0gICAgICBpZiAob2xkX2J1ZmZlcikKLQl7Ci0JICBmcmVlIChidWZmZXIpOwotCSAgYnVtcF9saW5lX2NvdW50ZXJzICgpOwotCSAgaWYgKG9sZF9pbnB1dCAhPSAwKQotCSAgICB7Ci0JICAgICAgYnVmZmVyID0gb2xkX2J1ZmZlcjsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvbGRfaW5wdXQ7Ci0JICAgICAgYnVmZmVyX2xpbWl0ID0gb2xkX2xpbWl0OwotCSAgICAgIG9sZF9idWZmZXIgPSAwOwotCSAgICAgIGdvdG8gY29udGluOwotCSAgICB9Ci0JfQotICAgIH0JCQkJLyogd2hpbGUgKG1vcmUgYnVmZmVycyB0byBzY2FuKSAqLwotCi0gcXVpdDoKLQotI2lmZGVmIG1kX2NsZWFudXAKLSAgbWRfY2xlYW51cCgpOwotI2VuZGlmCi0gIGlucHV0X3NjcnViX2Nsb3NlICgpOwkJLyogQ2xvc2UgdGhlIGlucHV0IGZpbGUgKi8KLX0KLQotLyogRm9yIG1vc3QgTVJJIHBzZXVkby1vcHMsIHRoZSBsaW5lIGFjdHVhbGx5IGVuZHMgYXQgdGhlIGZpcnN0Ci0gICBub25xdW90ZWQgc3BhY2UuICBUaGlzIGZ1bmN0aW9uIGxvb2tzIGZvciB0aGF0IHBvaW50LCBzdHVmZnMgYSBudWxsCi0gICBpbiwgYW5kIHNldHMgKlNUT1BDUCB0byB0aGUgY2hhcmFjdGVyIHRoYXQgdXNlZCB0byBiZSB0aGVyZSwgYW5kCi0gICByZXR1cm5zIHRoZSBsb2NhdGlvbi4KLQotICAgVW50aWwgSSBoZWFyIG90aGVyd2lzZSwgSSBhbSBnb2luZyB0byBhc3N1bWUgdGhhdCB0aGlzIGlzIG9ubHkgdHJ1ZQotICAgZm9yIHRoZSBtNjhrIE1SSSBhc3NlbWJsZXIuICAqLwotCi1jaGFyICoKLW1yaV9jb21tZW50X2ZpZWxkIChzdG9wY3ApCi0gICAgIGNoYXIgKnN0b3BjcDsKLXsKLSNpZmRlZiBUQ19NNjhLCi0KLSAgY2hhciAqczsKLSAgaW50IGlucXVvdGUgPSAwOwotCi0gIGtub3cgKGZsYWdfbTY4a19tcmkpOwotCi0gIGZvciAocyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICAoKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICpzXSAmJiAqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JykKLQl8fCBpbnF1b3RlKTsKLSAgICAgICBzKyspCi0gICAgewotICAgICAgaWYgKCpzID09ICdcJycpCi0JaW5xdW90ZSA9ICEgaW5xdW90ZTsKLSAgICB9Ci0gICpzdG9wY3AgPSAqczsKLSAgKnMgPSAnXDAnOwotICByZXR1cm4gczsKLQotI2Vsc2UKLQotICBjaGFyICpzOwotCi0gIGZvciAocyA9IGlucHV0X2xpbmVfcG9pbnRlcjsgISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnNdOyBzKyspCi0gICAgOwotICAqc3RvcGNwID0gKnM7Ci0gICpzID0gJ1wwJzsKLSAgcmV0dXJuIHM7Ci0KLSNlbmRpZgotCi19Ci0KLS8qIFNraXAgdG8gdGhlIGVuZCBvZiBhbiBNUkkgY29tbWVudCBmaWVsZC4gICovCi0KLXZvaWQKLW1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpCi0gICAgIGNoYXIgKnN0b3A7Ci0gICAgIGludCBzdG9wYzsKLXsKLSAga25vdyAoZmxhZ19tcmkpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0b3A7Ci0gICpzdG9wID0gc3RvcGM7Ci0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLX0KLQotdm9pZCAKLXNfYWJvcnQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgYXNfZmF0YWwgKF8oIi5hYm9ydCBkZXRlY3RlZC4gIEFiYW5kb25pbmcgc2hpcC4iKSk7Ci19Ci0KLS8qIEd1dHMgb2YgLmFsaWduIGRpcmVjdGl2ZS4gIE4gaXMgdGhlIHBvd2VyIG9mIHR3byB0byB3aGljaCB0byBhbGlnbi4KLSAgIEZJTEwgbWF5IGJlIE5VTEwsIG9yIGl0IG1heSBwb2ludCB0byB0aGUgYnl0ZXMgb2YgdGhlIGZpbGwgcGF0dGVybi4KLSAgIExFTiBpcyB0aGUgbGVuZ3RoIG9mIHdoYXRldmVyIEZJTEwgcG9pbnRzIHRvLCBpZiBhbnl0aGluZy4gIE1BWCBpcwotICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcCB3aGVuIGRvaW5nIHRoZSBhbGlnbm1lbnQsCi0gICBvciAwIGlmIHRoZXJlIGlzIG5vIG1heGltdW0uICAqLwotCi1zdGF0aWMgdm9pZCAKLWRvX2FsaWduIChuLCBmaWxsLCBsZW4sIG1heCkKLSAgICAgaW50IG47Ci0gICAgIGNoYXIgKmZpbGw7Ci0gICAgIGludCBsZW47Ci0gICAgIGludCBtYXg7Ci17Ci0gIGNoYXIgZGVmYXVsdF9maWxsOwotCi0jaWZkZWYgbWRfZG9fYWxpZ24KLSAgbWRfZG9fYWxpZ24gKG4sIGZpbGwsIGxlbiwgbWF4LCBqdXN0X3JlY29yZF9hbGlnbm1lbnQpOwotI2VuZGlmCi0KLSAgaWYgKGZpbGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgbWF5YmVfdGV4dDsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5vd19zZWcpICYgU0VDX0NPREUpICE9IDApCi0JbWF5YmVfdGV4dCA9IDE7Ci0gICAgICBlbHNlCi0JbWF5YmVfdGV4dCA9IDA7Ci0jZWxzZQotICAgICAgaWYgKG5vd19zZWcgIT0gZGF0YV9zZWN0aW9uICYmIG5vd19zZWcgIT0gYnNzX3NlY3Rpb24pCi0JbWF5YmVfdGV4dCA9IDE7Ci0gICAgICBlbHNlCi0JbWF5YmVfdGV4dCA9IDA7Ci0jZW5kaWYKLQotICAgICAgaWYgKG1heWJlX3RleHQpCi0JZGVmYXVsdF9maWxsID0gTk9QX09QQ09ERTsKLSAgICAgIGVsc2UKLQlkZWZhdWx0X2ZpbGwgPSAwOwotICAgICAgZmlsbCA9ICZkZWZhdWx0X2ZpbGw7Ci0gICAgICBsZW4gPSAxOwotICAgIH0KLQotICAvKiBPbmx5IG1ha2UgYSBmcmFnIGlmIHdlIEhBVkUgdG8uIC4gLiAqLwotICBpZiAobiAhPSAwICYmICFuZWVkX3Bhc3NfMikKLSAgICB7Ci0gICAgICBpZiAobGVuIDw9IDEpCi0JZnJhZ19hbGlnbiAobiwgKmZpbGwsIG1heCk7Ci0gICAgICBlbHNlCi0JZnJhZ19hbGlnbl9wYXR0ZXJuIChuLCBmaWxsLCBsZW4sIG1heCk7Ci0gICAgfQotCi0jaWZkZWYgbWRfZG9fYWxpZ24KLSBqdXN0X3JlY29yZF9hbGlnbm1lbnQ6Ci0jZW5kaWYKLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCBuKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYWxpZ24gcHNldWRvLW9wLiAgQSBwb3NpdGl2ZSBBUkcgaXMgYSBkZWZhdWx0IGFsaWdubWVudAotICAgKGluIGJ5dGVzKS4gIEEgbmVnYXRpdmUgQVJHIGlzIHRoZSBuZWdhdGl2ZSBvZiB0aGUgbGVuZ3RoIG9mIHRoZQotICAgZmlsbCBwYXR0ZXJuLiAgQllURVNfUCBpcyBub24temVybyBpZiB0aGUgYWxpZ25tZW50IHZhbHVlIHNob3VsZCBiZQotICAgaW50ZXJwcmV0ZWQgYXMgdGhlIGJ5dGUgYm91bmRhcnksIHJhdGhlciB0aGFuIHRoZSBwb3dlciBvZiAyLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxpZ24gKGFyZywgYnl0ZXNfcCkKLSAgICAgaW50IGFyZzsKLSAgICAgaW50IGJ5dGVzX3A7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBhbGlnbjsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0gIG9mZnNldFQgZmlsbCA9IDA7Ci0gIGludCBtYXg7Ci0gIGludCBmaWxsX3A7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBpZiAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlmIChhcmcgPCAwKQotCWFsaWduID0gMDsKLSAgICAgIGVsc2UKLQlhbGlnbiA9IGFyZzsJLyogRGVmYXVsdCB2YWx1ZSBmcm9tIHBzZXVkby1vcCB0YWJsZSAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotCi0gIGlmIChieXRlc19wKQotICAgIHsKLSAgICAgIC8qIENvbnZlcnQgdG8gYSBwb3dlciBvZiAyLiAgKi8KLSAgICAgIGlmIChhbGlnbiAhPSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBpOwotCi0JICBmb3IgKGkgPSAwOyAoYWxpZ24gJiAxKSA9PSAwOyBhbGlnbiA+Pj0gMSwgKytpKQotCSAgICA7Ci0JICBpZiAoYWxpZ24gIT0gMSkKLQkgICAgYXNfYmFkIChfKCJBbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkgIGFsaWduID0gaTsKLQl9Ci0gICAgfQotCi0gIGlmIChhbGlnbiA+IDE1KQotICAgIHsKLSAgICAgIGFsaWduID0gMTU7Ci0gICAgICBhc19iYWQgKF8oIkFsaWdubWVudCB0b28gbGFyZ2U6ICV1IGFzc3VtZWQiKSwgYWxpZ24pOwotICAgIH0KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgZmlsbF9wID0gMDsKLSAgICAgIG1heCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JZmlsbF9wID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBmaWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBmaWxsX3AgPSAxOwotCX0KLQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCW1heCA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBtYXggPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQl9Ci0gICAgfQotCi0gIGlmICghIGZpbGxfcCkKLSAgICB7Ci0gICAgICBpZiAoYXJnIDwgMCkKLQlhc193YXJuIChfKCJleHBlY3RlZCBmaWxsIHBhdHRlcm4gbWlzc2luZyIpKTsKLSAgICAgIGRvX2FsaWduIChhbGlnbiwgKGNoYXIgKikgTlVMTCwgMCwgbWF4KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgZmlsbF9sZW47Ci0KLSAgICAgIGlmIChhcmcgPj0gMCkKLQlmaWxsX2xlbiA9IDE7Ci0gICAgICBlbHNlCi0JZmlsbF9sZW4gPSAtIGFyZzsKLSAgICAgIGlmIChmaWxsX2xlbiA8PSAxKQotCXsKLQkgIGNoYXIgZmlsbF9jaGFyOwotCi0JICBmaWxsX2NoYXIgPSBmaWxsOwotCSAgZG9fYWxpZ24gKGFsaWduLCAmZmlsbF9jaGFyLCBmaWxsX2xlbiwgbWF4KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciBhYlsxNl07Ci0KLQkgIGlmICgoc2l6ZV90KSBmaWxsX2xlbiA+IHNpemVvZiBhYikKLQkgICAgYWJvcnQgKCk7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGFiLCBmaWxsLCBmaWxsX2xlbik7Ci0JICBkb19hbGlnbiAoYWxpZ24sIGFiLCBmaWxsX2xlbiwgbWF4KTsKLQl9Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5hbGlnbiBwc2V1ZG8tb3Agb24gbWFjaGluZXMgd2hlcmUgIi5hbGlnbiA0IiBtZWFucwotICAgYWxpZ24gdG8gYSA0IGJ5dGUgYm91bmRhcnkuICAqLwotCi12b2lkIAotc19hbGlnbl9ieXRlcyAoYXJnKQotICAgICBpbnQgYXJnOwotewotICBzX2FsaWduIChhcmcsIDEpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5hbGlnbiBwc2V1ZG8tb3Agb24gbWFjaGluZXMgd2hlcmUgIi5hbGlnbiA0IiBtZWFucyBhbGlnbgotICAgdG8gYSAyKio0IGJvdW5kYXJ5LiAgKi8KLQotdm9pZCAKLXNfYWxpZ25fcHR3byAoYXJnKQotICAgICBpbnQgYXJnOwotewotICBzX2FsaWduIChhcmcsIDApOwotfQotCi12b2lkIAotc19jb21tIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKm5hbWU7Ci0gIHJlZ2lzdGVyIGNoYXIgYzsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgb2Zmc2V0VCB0ZW1wOwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZTogcmVzdCBvZiBsaW5lIGlnbm9yZWQuIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIGlmIChmbGFnX21yaSkKLQltcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogc2tpcCAnLCcgKi8KLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIiksIChsb25nKSB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBpZiAoZmxhZ19tcmkpCi0JbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBpZiAoZmxhZ19tcmkpCi0JbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gKHZhbHVlVCkgdGVtcCkKLQlhc19iYWQgKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iKSwKLQkJU19HRVRfTkFNRSAoc3ltYm9sUCksCi0JCShsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksCi0JCShsb25nKSB0ZW1wKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgdGVtcCk7Ci0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0gICAgfQotI2lmZGVmIE9CSl9WTVMKLSAgewotICAgIGV4dGVybiBpbnQgZmxhZ19vbmU7Ci0gICAgaWYgKCAoIXRlbXApIHx8ICFmbGFnX29uZSkKLSAgICAgIFNfR0VUX09USEVSKHN5bWJvbFApID0gY29uc3RfZmxhZzsKLSAgfQotI2VuZGlmIC8qIG5vdCBPQkpfVk1TICovCi0gIGtub3cgKHN5bWJvbFAtPnN5X2ZyYWcgPT0gJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0JCQkJLyogc19jb21tKCkgKi8KLQotLyogVGhlIE1SSSBDT01NT04gcHNldWRvLW9wLiAgV2UgaGFuZGxlIHRoaXMgYnkgY3JlYXRpbmcgYSBjb21tb24KLSAgIHN5bWJvbCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBuYW1lLiAgV2UgbWFrZSBzX3NwYWNlIGRvIHRoZSByaWdodAotICAgdGhpbmcgYnkgaW5jcmVhc2luZyB0aGUgc2l6ZS4gICovCi0KLXZvaWQKLXNfbXJpX2NvbW1vbiAoc21hbGwpCi0gICAgIGludCBzbWFsbDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICphbGMgPSBOVUxMOwotICBzeW1ib2xTICpzeW07Ci0gIG9mZnNldFQgYWxpZ247Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlmICghIGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHNfY29tbSAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpuYW1lKSkKLSAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkbwotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLQotICAgICAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLQl7Ci0JICBhbGMgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKFNfR0VUX05BTUUgKGxpbmVfbGFiZWwpKQotCQkJCSAgKyAoaW5wdXRfbGluZV9wb2ludGVyIC0gbmFtZSkKLQkJCQkgICsgMSk7Ci0JICBzcHJpbnRmIChhbGMsICIlcyVzIiwgbmFtZSwgU19HRVRfTkFNRSAobGluZV9sYWJlbCkpOwotCSAgbmFtZSA9IGFsYzsKLQl9Ci0gICAgfQotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgaWYgKGFsYyAhPSBOVUxMKQotICAgIGZyZWUgKGFsYyk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIGFsaWduID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0KLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltKSAmJiAhIFNfSVNfQ09NTU9OIChzeW0pKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIGAlcyciKSwgU19HRVRfTkFNRSAoc3ltKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNfU0VUX0VYVEVSTkFMIChzeW0pOwotICBtcmlfY29tbW9uX3N5bWJvbCA9IHN5bTsKLQotI2lmZGVmIFNfU0VUX0FMSUdOCi0gIGlmIChhbGlnbiAhPSAwKQotICAgIFNfU0VUX0FMSUdOIChzeW0sIGFsaWduKTsKLSNlbmRpZgotCi0gIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCi0gICAgewotICAgICAgbGluZV9sYWJlbC0+c3lfdmFsdWUuWF9vcCA9IE9fc3ltYm9sOwotICAgICAgbGluZV9sYWJlbC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sID0gc3ltOwotICAgICAgbGluZV9sYWJlbC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyID0gU19HRVRfVkFMVUUgKHN5bSk7Ci0gICAgICBsaW5lX2xhYmVsLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOwotICAgICAgU19TRVRfU0VHTUVOVCAobGluZV9sYWJlbCwgZXhwcl9zZWN0aW9uKTsKLSAgICB9Ci0KLSAgLyogRklYTUU6IFdlIGp1c3QgaWdub3JlIHRoZSBzbWFsbCBhcmd1bWVudCwgd2hpY2ggZGlzdGluZ3Vpc2hlcwotICAgICBDT01NT04gYW5kIENPTU1PTi5TLiAgSSBkb24ndCBrbm93IHdoYXQgd2UgY2FuIGRvIGFib3V0IGl0LiAgKi8KLQotICAvKiBJZ25vcmUgdGhlIHR5cGUgYW5kIGhwdHlwZS4gICovCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci19Ci0KLXZvaWQKLXNfZGF0YSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzZWdUIHNlY3Rpb247Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KQotICAgIHsKLSAgICAgIHNlY3Rpb24gPSB0ZXh0X3NlY3Rpb247Ci0gICAgICB0ZW1wICs9IDEwMDA7Ci0gICAgfQotICBlbHNlCi0gICAgc2VjdGlvbiA9IGRhdGFfc2VjdGlvbjsKLQotICBzdWJzZWdfc2V0IChzZWN0aW9uLCAoc3Vic2VnVCkgdGVtcCk7Ci0KLSNpZmRlZiBPQkpfVk1TCi0gIGNvbnN0X2ZsYWcgPSAwOwotI2VuZGlmCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmFwcGZpbGUgcHNldWRvLW9wLiAgVGhpcyBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieQotICAgZG9fc2NydWJfY2hhcnMgd2hlbiBhIHByZXByb2Nlc3NvciAjIGxpbmUgY29tbWVudCBpcyBzZWVuIHdpdGggYQotICAgZmlsZSBuYW1lLiAgVGhpcyBkZWZhdWx0IGRlZmluaXRpb24gbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIG9iamVjdAotICAgb3IgQ1BVIHNwZWNpZmljIHBzZXVkby1vcHMuICBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdGhlIGRlZmF1bHQKLSAgIGRlZmluaXRpb24gZm9yIC5maWxlOyB0aGUgQVBQRklMRSBhcmd1bWVudCBpcyAxIGZvciAuYXBwZmlsZSwgMCBmb3IKLSAgIC5maWxlLiAgKi8KLQotdm9pZCAKLXNfYXBwX2ZpbGUgKGFwcGZpbGUpCi0gICAgIGludCBhcHBmaWxlOwotewotICByZWdpc3RlciBjaGFyICpzOwotICBpbnQgbGVuZ3RoOwotCi0gIC8qIFNvbWUgYXNzZW1ibGVycyB0b2xlcmF0ZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgJyInICovCi0gIGlmICgocyA9IGRlbWFuZF9jb3B5X3N0cmluZyAoJmxlbmd0aCkpICE9IDApCi0gICAgewotICAgICAgLyogSWYgdGhpcyBpcyBhIGZha2UgLmFwcGZpbGUsIGEgZmFrZSBuZXdsaW5lIHdhcyBpbnNlcnRlZCBpbnRvCi0JIHRoZSBidWZmZXIuICBQYXNzaW5nIC0yIHRvIG5ld19sb2dpY2FsX2xpbmUgdGVsbHMgaXQgdG8KLQkgYWNjb3VudCBmb3IgaXQuICAqLwotICAgICAgaW50IG1heV9vbWl0Ci0JPSAoISBuZXdfbG9naWNhbF9saW5lIChzLCBhcHBmaWxlID8gLTIgOiAtMSkgJiYgYXBwZmlsZSk7Ci0KLSAgICAgIC8qIEluIE1SSSBtb2RlLCB0aGUgcHJlcHJvY2Vzc29yIG1heSBoYXZlIGluc2VydGVkIGFuIGV4dHJhbmVvdXMKLSAgICAgICAgIGJhY2txdW90ZS4gICovCi0gICAgICBpZiAoZmxhZ19tNjhrX21yaQotCSAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCcnCi0JICAmJiBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzFdXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIGlmICghIG1heV9vbWl0KQotCXsKLSNpZmRlZiBMSVNUSU5HCi0JICBpZiAobGlzdGluZykKLQkgICAgbGlzdGluZ19zb3VyY2VfZmlsZSAocyk7Ci0jZW5kaWYKLQkgIHJlZ2lzdGVyX2RlcGVuZGVuY3kgKHMpOwotI2lmZGVmIG9ial9hcHBfZmlsZQotCSAgb2JqX2FwcF9maWxlIChzKTsKLSNlbmRpZgotCX0KLSAgICB9Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmFwcGxpbmUgcHNldWRvLW9wLiAgVGhpcyBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieQotICAgZG9fc2NydWJfY2hhcnMgd2hlbiBhIHByZXByb2Nlc3NvciAjIGxpbmUgY29tbWVudCBpcyBzZWVuLiAgVGhpcwotICAgZGVmYXVsdCBkZWZpbml0aW9uIG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBvYmplY3Qgb3IgQ1BVIHNwZWNpZmljCi0gICBwc2V1ZG8tb3BzLiAgKi8KLQotdm9pZAotc19hcHBfbGluZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgbDsKLQotICAvKiBUaGUgZ2l2ZW4gbnVtYmVyIGlzIHRoYXQgb2YgdGhlIG5leHQgbGluZS4gICovCi0gIGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSAtIDE7Ci0gIGlmIChsIDwgMCkKLSAgICAvKiBTb21lIG9mIHRoZSBiYWNrIGVuZHMgY2FuJ3QgZGVhbCB3aXRoIG5vbi1wb3NpdGl2ZSBsaW5lIG51bWJlcnMuCi0gICAgICAgQmVzaWRlcywgaXQncyBzaWxseS4gICovCi0gICAgYXNfd2FybiAoXygiTGluZSBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmU7IGxpbmUgbnVtYmVyICVkIHJlamVjdGVkLiIpLCBsKzEpOwotICBlbHNlCi0gICAgewotICAgICAgbmV3X2xvZ2ljYWxfbGluZSAoKGNoYXIgKikgTlVMTCwgbCk7Ci0jaWZkZWYgTElTVElORwotICAgICAgaWYgKGxpc3RpbmcpCi0JbGlzdGluZ19zb3VyY2VfbGluZSAobCk7Ci0jZW5kaWYKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmVuZCBwc2V1ZG8tb3AuICBBY3R1YWxseSwgdGhlIHJlYWwgd29yayBpcyBkb25lIGluCi0gICByZWFkX2Ffc291cmNlX2ZpbGUuICAqLwotCi12b2lkCi1zX2VuZCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgLyogVGhlIE1SSSBhc3NlbWJsZXIgcGVybWl0cyB0aGUgc3RhcnQgc3ltYm9sIHRvIGZvbGxvdyAuZW5kLAotICAgICAgICAgYnV0IHdlIGRvbid0IHN1cHBvcnQgdGhhdC4gICovCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0KLQkgICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyonCi0JICAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICchJykKLQlhc193YXJuIChfKCJzdGFydCBhZGRyZXNzIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgfQotfQotCi0vKiBIYW5kbGUgdGhlIC5lcnIgcHNldWRvLW9wLiAgKi8KLQotdm9pZAotc19lcnIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgYXNfYmFkIChfKCIuZXJyIGVuY291bnRlcmVkIikpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBmYWlsIHBzZXVkby1vcC4gICovCi0KLXZvaWQKLXNfZmFpbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBvZmZzZXRUIHRlbXA7Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAodGVtcCA+PSA1MDApCi0gICAgYXNfd2FybiAoXygiLmZhaWwgJWxkIGVuY291bnRlcmVkIiksIChsb25nKSB0ZW1wKTsKLSAgZWxzZQotICAgIGFzX2JhZCAoXygiLmZhaWwgJWxkIGVuY291bnRlcmVkIiksIChsb25nKSB0ZW1wKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0KLQotdm9pZCAKLXNfZmlsbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBleHByZXNzaW9uUyByZXBfZXhwOwotICBsb25nIHNpemUgPSAxOwotICByZWdpc3RlciBsb25nIGZpbGwgPSAwOwotICBjaGFyICpwOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24gKCZyZXBfZXhwKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCX0KLSAgICB9Ci0KLSAgLyogVGhpcyBpcyB0byBiZSBjb21wYXRpYmxlIHdpdGggQlNEIDQuMiBBUywgbm90IGZvciBhbnkgcmF0aW9uYWwgcmVhc29uLiAgKi8KLSNkZWZpbmUgQlNEX0ZJTExfU0laRV9DUk9DS184ICg4KQotICBpZiAoc2l6ZSA+IEJTRF9GSUxMX1NJWkVfQ1JPQ0tfOCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZmlsbCBzaXplIGNsYW1wZWQgdG8gJWQuIiksIEJTRF9GSUxMX1NJWkVfQ1JPQ0tfOCk7Ci0gICAgICBzaXplID0gQlNEX0ZJTExfU0laRV9DUk9DS184OwotICAgIH0KLSAgaWYgKHNpemUgPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIlNpemUgbmVnYXRpdmU6IC5maWxsIGlnbm9yZWQuIikpOwotICAgICAgc2l6ZSA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChyZXBfZXhwLlhfb3AgPT0gT19jb25zdGFudCAmJiByZXBfZXhwLlhfYWRkX251bWJlciA8PSAwKQotICAgIHsKLSAgICAgIGlmIChyZXBfZXhwLlhfYWRkX251bWJlciA8IDApCi0JYXNfd2FybiAoXygiUmVwZWF0IDwgMCwgLmZpbGwgaWdub3JlZCIpKTsKLSAgICAgIHNpemUgPSAwOwotICAgIH0KLQotICBpZiAoc2l6ZSAmJiAhbmVlZF9wYXNzXzIpCi0gICAgewotICAgICAgaWYgKHJlcF9leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIHAgPSBmcmFnX3ZhciAocnNfZmlsbCwgKGludCkgc2l6ZSwgKGludCkgc2l6ZSwKLQkJCShyZWxheF9zdWJzdGF0ZVQpIDAsIChzeW1ib2xTICopIDAsCi0JCQkob2Zmc2V0VCkgcmVwX2V4cC5YX2FkZF9udW1iZXIsCi0JCQkoY2hhciAqKSAwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgZG9uJ3QgaGF2ZSBhIGNvbnN0YW50IHJlcGVhdCBjb3VudCwgc28gd2UgY2FuJ3QgdXNlCi0JICAgICByc19maWxsLiAgV2UgY2FuIGdldCB0aGUgc2FtZSByZXN1bHRzIG91dCBvZiByc19zcGFjZSwKLQkgICAgIGJ1dCBpdHMgYXJndW1lbnQgaXMgaW4gYnl0ZXMsIHNvIHdlIG11c3QgbXVsdGlwbHkgdGhlCi0JICAgICByZXBlYXQgY291bnQgYnkgc2l6ZS4gICovCi0KLQkgIHN5bWJvbFMgKnJlcF9zeW07Ci0JICByZXBfc3ltID0gbWFrZV9leHByX3N5bWJvbCAoJnJlcF9leHApOwotCSAgaWYgKHNpemUgIT0gMSkKLQkgICAgewotCSAgICAgIGV4cHJlc3Npb25TIHNpemVfZXhwOwotCSAgICAgIHNpemVfZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICAgIHNpemVfZXhwLlhfYWRkX251bWJlciA9IHNpemU7Ci0KLQkgICAgICByZXBfZXhwLlhfb3AgPSBPX211bHRpcGx5OwotCSAgICAgIHJlcF9leHAuWF9hZGRfc3ltYm9sID0gcmVwX3N5bTsKLQkgICAgICByZXBfZXhwLlhfb3Bfc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAoJnNpemVfZXhwKTsKLQkgICAgICByZXBfZXhwLlhfYWRkX251bWJlciA9IDA7Ci0JICAgICAgcmVwX3N5bSA9IG1ha2VfZXhwcl9zeW1ib2wgKCZyZXBfZXhwKTsKLQkgICAgfQotCi0JICBwID0gZnJhZ192YXIgKHJzX3NwYWNlLCAoaW50KSBzaXplLCAoaW50KSBzaXplLAotCQkJKHJlbGF4X3N1YnN0YXRlVCkgMCwgcmVwX3N5bSwgKG9mZnNldFQpIDAsIChjaGFyICopIDApOwotCX0KLSAgICAgIG1lbXNldCAocCwgMCwgKHVuc2lnbmVkIGludCkgc2l6ZSk7Ci0gICAgICAvKiBUaGUgbWFnaWMgbnVtYmVyIEJTRF9GSUxMX1NJWkVfQ1JPQ0tfNCBpcyBmcm9tIEJTRCA0LjIgVkFYCi0gICAgICAgKiBmbGF2b3VyZWQgQVMuICBUaGUgZm9sbG93aW5nIGJpenphcmUgYmVoYXZpb3VyIGlzIHRvIGJlCi0gICAgICAgKiBjb21wYXRpYmxlIHdpdGggYWJvdmUuICBJIGd1ZXNzIHRoZXkgdHJpZWQgdG8gdGFrZSB1cCB0byA4Ci0gICAgICAgKiBieXRlcyBmcm9tIGEgNC1ieXRlIGV4cHJlc3Npb24gYW5kIHRoZXkgZm9yZ290IHRvIHNpZ24KLSAgICAgICAqIGV4dGVuZC4gVW4qeCBTdXguICovCi0jZGVmaW5lIEJTRF9GSUxMX1NJWkVfQ1JPQ0tfNCAoNCkKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgZmlsbCwKLQkJCSAgKHNpemUgPiBCU0RfRklMTF9TSVpFX0NST0NLXzQKLQkJCSAgID8gQlNEX0ZJTExfU0laRV9DUk9DS180Ci0JCQkgICA6IChpbnQpIHNpemUpKTsKLSAgICAgIC8qIE5vdGU6IC5maWxsICgpLDAgZW1pdHMgbm8gZnJhZyAoc2luY2Ugd2UgYXJlIGFza2VkIHRvIC5maWxsIDAgYnl0ZXMpCi0gICAgICAgKiBidXQgZW1pdHMgbm8gZXJyb3IgbWVzc2FnZSBiZWNhdXNlIGl0IHNlZW1zIGEgbGVnYWwgdGhpbmcgdG8gZG8uCi0gICAgICAgKiBJdCBpcyBhIGRlZ2VuZXJhdGUgY2FzZSBvZiAuZmlsbCBidXQgY291bGQgYmUgZW1pdHRlZCBieSBhIGNvbXBpbGVyLgotICAgICAgICovCi0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkIAotc19nbG9ibCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBkbwotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLSAgICAgIGlmIChjID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JICAgIGMgPSAnXG4nOwotCX0KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIElSUCBhbmQgSVJQQyBwc2V1ZG8tb3BzLiAgKi8KLQotdm9pZAotc19pcnAgKGlycGMpCi0gICAgIGludCBpcnBjOwotewotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgc2IgczsKLSAgY29uc3QgY2hhciAqZXJyOwotICBzYiBvdXQ7Ci0KLSAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7Ci0KLSAgc2JfbmV3ICgmcyk7Ci0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICBzYl9hZGRfY2hhciAoJnMsICppbnB1dF9saW5lX3BvaW50ZXIrKyk7Ci0KLSAgc2JfbmV3ICgmb3V0KTsKLQotICBlcnIgPSBleHBhbmRfaXJwIChpcnBjLCAwLCAmcywgJm91dCwgZ2V0X2xpbmVfc2IsICdcMCcpOwotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCAiJXMiLCBlcnIpOwotCi0gIHNiX2tpbGwgKCZzKTsKLQotICBpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiICgmb3V0LCBpbnB1dF9saW5lX3BvaW50ZXIpOwotICBzYl9raWxsICgmb3V0KTsKLSAgYnVmZmVyX2xpbWl0ID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5saW5rb25jZSBwc2V1ZG8tb3AuICBUaGlzIHRlbGxzIHRoZSBhc3NlbWJsZXIgdG8gbWFyawotICAgdGhlIHNlY3Rpb24gdG8gb25seSBiZSBsaW5rZWQgb25jZS4gIEhvd2V2ZXIsIHRoaXMgaXMgbm90IHN1cHBvcnRlZAotICAgYnkgbW9zdCBvYmplY3QgZmlsZSBmb3JtYXRzLiAgVGhpcyB0YWtlcyBhbiBvcHRpb25hbCBhcmd1bWVudCwKLSAgIHdoaWNoIGlzIHdoYXQgdG8gZG8gYWJvdXQgZHVwbGljYXRlcy4gICovCi0KLXZvaWQKLXNfbGlua29uY2UgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZW51bSBsaW5rb25jZV90eXBlIHR5cGU7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIHR5cGUgPSBMSU5LT05DRV9ESVNDQVJEOwotCi0gIGlmICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBjaGFyICpzOwotICAgICAgY2hhciBjOwotCi0gICAgICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgaWYgKHN0cmNhc2VjbXAgKHMsICJkaXNjYXJkIikgPT0gMCkKLQl0eXBlID0gTElOS09OQ0VfRElTQ0FSRDsKLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHMsICJvbmVfb25seSIpID09IDApCi0JdHlwZSA9IExJTktPTkNFX09ORV9PTkxZOwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAocywgInNhbWVfc2l6ZSIpID09IDApCi0JdHlwZSA9IExJTktPTkNFX1NBTUVfU0laRTsKLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHMsICJzYW1lX2NvbnRlbnRzIikgPT0gMCkKLQl0eXBlID0gTElOS09OQ0VfU0FNRV9DT05URU5UUzsKLSAgICAgIGVsc2UKLQlhc193YXJuIChfKCJ1bnJlY29nbml6ZWQgLmxpbmtvbmNlIHR5cGUgYCVzJyIpLCBzKTsKLQotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgfQotCi0jaWZkZWYgb2JqX2hhbmRsZV9saW5rX29uY2UKLSAgb2JqX2hhbmRsZV9saW5rX29uY2UgKHR5cGUpOwotI2Vsc2UgLyogISBkZWZpbmVkIChvYmpfaGFuZGxlX2xpbmtfb25jZSkgKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHsKLSAgICBmbGFnd29yZCBmbGFnczsKLQotICAgIGlmICgoYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KSAmIFNFQ19MSU5LX09OQ0UpID09IDApCi0gICAgICBhc193YXJuIChfKCIubGlua29uY2UgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQiKSk7Ci0KLSAgICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBub3dfc2VnKTsKLSAgICBmbGFncyB8PSBTRUNfTElOS19PTkNFOwotICAgIHN3aXRjaCAodHlwZSkKLSAgICAgIHsKLSAgICAgIGRlZmF1bHQ6Ci0JYWJvcnQgKCk7Ci0gICAgICBjYXNlIExJTktPTkNFX0RJU0NBUkQ6Ci0JZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOwotCWJyZWFrOwotICAgICAgY2FzZSBMSU5LT05DRV9PTkVfT05MWToKLQlmbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZOwotCWJyZWFrOwotICAgICAgY2FzZSBMSU5LT05DRV9TQU1FX1NJWkU6Ci0JZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkU7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIExJTktPTkNFX1NBTUVfQ09OVEVOVFM6Ci0JZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTOwotCWJyZWFrOwotICAgICAgfQotICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBub3dfc2VnLCBmbGFncykpCi0gICAgICBhc19iYWQgKF8oImJmZF9zZXRfc2VjdGlvbl9mbGFnczogJXMiKSwKLQkgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gIH0KLSNlbHNlIC8qICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgKi8KLSAgYXNfd2FybiAoXygiLmxpbmtvbmNlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IikpOwotI2VuZGlmIC8qICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKG9ial9oYW5kbGVfbGlua19vbmNlKSAqLwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIAotc19sY29tbV9pbnRlcm5hbCAobmVlZHNfYWxpZ24sIGJ5dGVzX3ApCi0gICAgIC8qIDEgaWYgdGhpcyB3YXMgYSAiLmJzcyIgZGlyZWN0aXZlLCB3aGljaCBtYXkgcmVxdWlyZSBhIDNyZCBhcmd1bWVudAotCShhbGlnbm1lbnQpOyAwIGlmIGl0IHdhcyBhbiAiLmxjb21tIiAoMiBhcmdzIG9ubHkpICAqLwotICAgICBpbnQgbmVlZHNfYWxpZ247Ci0gICAgIC8qIDEgaWYgdGhlIGFsaWdubWVudCB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgdGhlIGJ5dGUgYm91bmRhcnksCi0JcmF0aGVyIHRoYW4gdGhlIHBvd2VyIG9mIDIuICovCi0gICAgIGludCBieXRlc19wOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsKLSAgc3Vic2VnVCBjdXJyZW50X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIGNvbnN0IGludCBtYXhfYWxpZ25tZW50ID0gMTU7Ci0gIGludCBhbGlnbiA9IDA7Ci0gIHNlZ1QgYnNzX3NlZyA9IGJzc19zZWN0aW9uOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgLyogQWNjZXB0IGFuIG9wdGlvbmFsIGNvbW1hIGFmdGVyIHRoZSBuYW1lLiAgVGhlIGNvbW1hIHVzZWQgdG8gYmUKLSAgICAgcmVxdWlyZWQsIGJ1dCBJcml4IDUgY2MgZG9lcyBub3QgZ2VuZXJhdGUgaXQuICAqLwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJNaXNzaW5nIHNpemUgZXhwcmVzc2lvbiIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCU1MgbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIpLCB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0jaWYgZGVmaW5lZCAoVENfTUlQUykgfHwgZGVmaW5lZCAoVENfQUxQSEEpCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHsKLSAgICAgIC8qIEZvciBNSVBTIGFuZCBBbHBoYSBFQ09GRiBvciBFTEYsIHNtYWxsIG9iamVjdHMgYXJlIHB1dCBpbiAuc2Jzcy4gICovCi0gICAgICBpZiAodGVtcCA8PSBiZmRfZ2V0X2dwX3NpemUgKHN0ZG91dHB1dCkpCi0JewotCSAgYnNzX3NlZyA9IHN1YnNlZ19uZXcgKCIuc2JzcyIsIDEpOwotCSAgc2VnX2luZm8gKGJzc19zZWcpLT5ic3MgPSAxOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBic3Nfc2VnLCBTRUNfQUxMT0MpKQotCSAgICBhc193YXJuIChfKCJlcnJvciBzZXR0aW5nIGZsYWdzIGZvciBcIi5zYnNzXCI6ICVzIiksCi0JCSAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotI2VuZGlmCi0JfQotICAgIH0KLSNlbmRpZgotICAgaWYgKCFuZWVkc19hbGlnbikKLSAgICAgewotICAgICAgIC8qIEZJWE1FLiBUaGlzIG5lZWRzIHRvIGJlIG1hY2hpbmUgaW5kZXBlbmRlbnQuICovCi0gICAgICAgaWYgKHRlbXAgPj0gOCkKLQkgYWxpZ24gPSAzOwotICAgICAgIGVsc2UgaWYgKHRlbXAgPj0gNCkKLQkgYWxpZ24gPSAyOwotICAgICAgIGVsc2UgaWYgKHRlbXAgPj0gMikKLQkgYWxpZ24gPSAxOwotICAgICAgIGVsc2UKLQkgYWxpZ24gPSAwOwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgICAgICAvKiBGSVhNRTogVGhpcyBuZWVkcyB0byBiZSBkb25lIGluIGEgbW9yZSBnZW5lcmFsIGZhc2hpb24uICAqLwotICAgICAgIGFsaWduID0gMzsKLSNlbmRpZgotCi0gICAgICAgcmVjb3JkX2FsaWdubWVudChic3Nfc2VnLCBhbGlnbik7Ci0gICAgIH0KLQotICBpZiAobmVlZHNfYWxpZ24pCi0gICAgewotICAgICAgYWxpZ24gPSAwOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCXsKLQkgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc2l6ZSIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCXsKLQkgIGFzX2JhZCAoXygiTWlzc2luZyBhbGlnbm1lbnQiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmIChieXRlc19wKQotCXsKLQkgIC8qIENvbnZlcnQgdG8gYSBwb3dlciBvZiAyLiAgKi8KLQkgIGlmIChhbGlnbiAhPSAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLQkgICAgICBmb3IgKGkgPSAwOyAoYWxpZ24gJiAxKSA9PSAwOyBhbGlnbiA+Pj0gMSwgKytpKQotCQk7Ci0JICAgICAgaWYgKGFsaWduICE9IDEpCi0JCWFzX2JhZCAoXygiQWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7Ci0JICAgICAgYWxpZ24gPSBpOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGFsaWduID4gbWF4X2FsaWdubWVudCkKLQl7Ci0JICBhbGlnbiA9IG1heF9hbGlnbm1lbnQ7Ci0JICBhc193YXJuIChfKCJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZC4gYXNzdW1lZC4iKSwgYWxpZ24pOwotCX0KLSAgICAgIGVsc2UgaWYgKGFsaWduIDwgMCkKLQl7Ci0JICBhbGlnbiA9IDA7Ci0JICBhc193YXJuIChfKCJBbGlnbm1lbnQgbmVnYXRpdmUuIDAgYXNzdW1lZC4iKSk7Ci0JfQotICAgICAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlZywgYWxpZ24pOwotICAgIH0JCQkJLyogaWYgbmVlZHMgYWxpZ24gKi8KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFzc3VtZSBzb21lIG9iamVjdHMgbWF5IHJlcXVpcmUgYWxpZ25tZW50IG9uIHNvbWUgc3lzdGVtcy4gICovCi0jaWYgZGVmaW5lZCAoVENfQUxQSEEpICYmICEgZGVmaW5lZCAoVk1TKQotICAgICAgaWYgKHRlbXAgPiAxKQotCXsKLQkgIGFsaWduID0gZmZzICh0ZW1wKSAtIDE7Ci0JICBpZiAodGVtcCAlICgxIDw8IGFsaWduKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotI2VuZGlmCi0gICAgfQotCi0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0KLSAgaWYgKAotI2lmIGRlZmluZWQoT0JKX0FPVVQpIHwgZGVmaW5lZChPQkpfQk9VVCkKLSAgICAgICBTX0dFVF9PVEhFUiAoc3ltYm9sUCkgPT0gMCAmJgotICAgICAgIFNfR0VUX0RFU0MgKHN5bWJvbFApID09IDAgJiYKLSNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLwotICAgICAgIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VnCi0JfHwgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApICYmIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSA9PSAwKSkpCi0gICAgewotICAgICAgY2hhciAqcGZyYWc7Ci0KLSAgICAgIHN1YnNlZ19zZXQgKGJzc19zZWcsIDEpOwotCi0gICAgICBpZiAoYWxpZ24pCi0JZnJhZ19hbGlnbiAoYWxpZ24sIDAsIDApOwotCQkJCQkvKiBkZXRhY2ggZnJvbSBvbGQgZnJhZwkqLwotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWcpCi0Jc3ltYm9sUC0+c3lfZnJhZy0+ZnJfc3ltYm9sID0gTlVMTDsKLQotICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWdfbm93OwotICAgICAgcGZyYWcgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKTAsIHN5bWJvbFAsCi0JCQkob2Zmc2V0VCkgdGVtcCwgKGNoYXIgKikgMCk7Ci0gICAgICAqcGZyYWcgPSAwOwotCi0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBic3Nfc2VnKTsKLQotI2lmZGVmIE9CSl9DT0ZGCi0gICAgICAvKiBUaGUgc3ltYm9sIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSBwcmVjZWRpbmcKLSAgICAgICAgICIuZ2xvYmwiIGRpcmVjdGl2ZSAtLSBiZSBjYXJlZnVsIG5vdCB0byBzdGVwIG9uIHN0b3JhZ2UgY2xhc3MKLSAgICAgICAgIGluIHRoYXQgY2FzZS4gIE90aGVyd2lzZSwgc2V0IGl0IHRvIHN0YXRpYy4gKi8KLSAgICAgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSAhPSBDX0VYVCkKLQl7Ci0JICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX1NUQVQpOwotCX0KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCi0jaWZkZWYgU19TRVRfU0laRQotICAgICAgU19TRVRfU0laRSAoc3ltYm9sUCwgdGVtcCk7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAotCSAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0KLSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWcsIGN1cnJlbnRfc3Vic2VnKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzX2xjb21tX2ludGVybmFsKCkgKi8KLQotdm9pZAotc19sY29tbSAobmVlZHNfYWxpZ24pCi0gICAgIGludCBuZWVkc19hbGlnbjsKLXsKLSAgc19sY29tbV9pbnRlcm5hbCAobmVlZHNfYWxpZ24sIDApOwotfQotCi12b2lkIHNfbGNvbW1fYnl0ZXMgKG5lZWRzX2FsaWduKQotICAgICBpbnQgbmVlZHNfYWxpZ247Ci17Ci0gIHNfbGNvbW1faW50ZXJuYWwgKG5lZWRzX2FsaWduLCAxKTsKLX0KLQotdm9pZCAKLXNfbHN5bSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLQotICAvKiB3ZSBwZXJtaXQgQU5ZIGRlZmluZWQgZXhwcmVzc2lvbjogQlNENC4yIGRlbWFuZHMgY29uc3RhbnRzICovCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICAqcCA9IDA7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgXCIlc1wiIiksIG5hbWUpOwotICAgICAgKnAgPSBjOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBleHByZXNzaW9uICgmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQKLSAgICAgICYmIGV4cC5YX29wICE9IE9fcmVnaXN0ZXIpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgZXhwcmVzc2lvbiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAvKiBGSVhNRS1TT09OIEkgcHVsbGVkIGEgKCYmIHN5bWJvbFAtPnN5X290aGVyID09IDAgJiYKLSAgICAgc3ltYm9sUC0+c3lfZGVzYyA9PSAwKSBvdXQgb2YgdGhpcyB0ZXN0IGJlY2F1c2UgY29mZiBkb2Vzbid0IGhhdmUKLSAgICAgdGhvc2UgZmllbGRzLCBhbmQgSSBjYW4ndCBzZWUgd2hlbiB0aGV5J2QgZXZlciBiZSB0cmlwcGVkLiAgSQotICAgICBkb24ndCB0aGluayBJIHVuZGVyc3RhbmQgd2h5IHRoZXkgd2VyZSBoZXJlIHNvIEkgbWF5IGhhdmUKLSAgICAgaW50cm9kdWNlZCBhIGJ1Zy4gQXMgcmVjZW50bHkgYXMgMS4zNyBkaWRuJ3QgaGF2ZSB0aGlzIHRlc3QKLSAgICAgYW55d2F5LiAgeG94b3JpY2guICovCi0KLSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHVuZGVmaW5lZF9zZWN0aW9uCi0gICAgICAmJiBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGUgbmFtZSBtaWdodCBiZSBhbiB1bmRlZmluZWQgLmdsb2JhbCBzeW1ib2w7IGJlIHN1cmUgdG8KLQkga2VlcCB0aGUgImV4dGVybmFsIiBiaXQuICovCi0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLAotCQkgICAgIChleHAuWF9vcCA9PSBPX2NvbnN0YW50Ci0JCSAgICAgID8gYWJzb2x1dGVfc2VjdGlvbgotCQkgICAgICA6IHJlZ19zZWN0aW9uKSk7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgZXhwLlhfYWRkX251bWJlcik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJTeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkIiksIG5hbWUpOwotICAgIH0KLSAgKnAgPSBjOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzX2xzeW0oKSAqLwotCi0vKiBSZWFkIGEgbGluZSBpbnRvIGFuIHNiLiAgKi8KLQotc3RhdGljIGludAotZ2V0X2xpbmVfc2IgKGxpbmUpCi0gICAgIHNiICpsaW5lOwotewotICBjaGFyIHF1b3RlMSwgcXVvdGUyLCBpbnF1b3RlOwotCi0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbLTFdID09ICdcbicpCi0gICAgYnVtcF9saW5lX2NvdW50ZXJzICgpOwotCi0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXIgPj0gYnVmZmVyX2xpbWl0KQotICAgIHsKLSAgICAgIGJ1ZmZlcl9saW1pdCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgICAgIGlmIChidWZmZXJfbGltaXQgPT0gMCkKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogSWYgYXBwLmMgc2V0cyBhbnkgb3RoZXIgY2hhcmFjdGVycyB0byBMRVhfSVNfU1RSSU5HUVVPVEUsIHRoaXMKLSAgICAgY29kZSBuZWVkcyB0byBiZSBjaGFuZ2VkLiAgKi8KLSAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLSAgICBxdW90ZTEgPSAnIic7Ci0gIGVsc2UKLSAgICBxdW90ZTEgPSAnXDAnOwotCi0gIHF1b3RlMiA9ICdcMCc7Ci0gIGlmIChmbGFnX202OGtfbXJpKQotICAgIHF1b3RlMiA9ICdcJyc7Ci0jaWZkZWYgTEVYX0lTX1NUUklOR1FVT1RFCi0gIHF1b3RlMiA9ICdcJyc7Ci0jZW5kaWYKLQotICBpbnF1b3RlID0gJ1wwJzsKLSAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdCi0JIHx8IChpbnF1b3RlICE9ICdcMCcgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXG4nKSkKLSAgICB7Ci0gICAgICBpZiAoaW5xdW90ZSA9PSAqaW5wdXRfbGluZV9wb2ludGVyKQotCWlucXVvdGUgPSAnXDAnOwotICAgICAgZWxzZSBpZiAoaW5xdW90ZSA9PSAnXDAnKQotCXsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09IHF1b3RlMSkKLQkgICAgaW5xdW90ZSA9IHF1b3RlMTsKLQkgIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gcXVvdGUyKQotCSAgICBpbnF1b3RlID0gcXVvdGUyOwotCX0KLSAgICAgIHNiX2FkZF9jaGFyIChsaW5lLCAqaW5wdXRfbGluZV9wb2ludGVyKyspOwotICAgIH0KLSAgd2hpbGUgKGlucHV0X2xpbmVfcG9pbnRlciA8IGJ1ZmZlcl9saW1pdAotCSAmJiBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclstMV0gPT0gJ1xuJykKLQlidW1wX2xpbmVfY291bnRlcnMgKCk7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi0vKiBEZWZpbmUgYSBtYWNyby4gIFRoaXMgaXMgYW4gaW50ZXJmYWNlIHRvIG1hY3JvLmMsIHdoaWNoIGlzIHNoYXJlZAotICAgYmV0d2VlbiBnYXMgYW5kIGdhc3AuICAqLwotCi12b2lkCi1zX21hY3JvIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotICBzYiBzOwotICBzYiBsYWJlbDsKLSAgY29uc3QgY2hhciAqZXJyOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGFzX3doZXJlICgmZmlsZSwgJmxpbmUpOwotCi0gIHNiX25ldyAoJnMpOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgc2JfYWRkX2NoYXIgKCZzLCAqaW5wdXRfbGluZV9wb2ludGVyKyspOwotCi0gIHNiX25ldyAoJmxhYmVsKTsKLSAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLSAgICBzYl9hZGRfc3RyaW5nICgmbGFiZWwsIFNfR0VUX05BTUUgKGxpbmVfbGFiZWwpKTsKLQotICBlcnIgPSBkZWZpbmVfbWFjcm8gKDAsICZzLCAmbGFiZWwsIGdldF9saW5lX3NiLCAmbmFtZSk7Ci0gIGlmIChlcnIgIT0gTlVMTCkKLSAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsICIlcyIsIGVycik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotCXsKLQkgIFNfU0VUX1NFR01FTlQgKGxpbmVfbGFiZWwsIHVuZGVmaW5lZF9zZWN0aW9uKTsKLQkgIFNfU0VUX1ZBTFVFIChsaW5lX2xhYmVsLCAwKTsKLQkgIGxpbmVfbGFiZWwtPnN5X2ZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0JfQotCi0gICAgICBpZiAoKChmbGFnX202OGtfbXJpCi0jaWZkZWYgTk9fUFNFVURPX0RPVAotCSAgICB8fCAxCi0jZW5kaWYKLQkgICAgKQotCSAgICYmIGhhc2hfZmluZCAocG9faGFzaCwgbmFtZSkgIT0gTlVMTCkKLQkgIHx8ICghIGZsYWdfbTY4a19tcmkKLQkgICAgICAmJiAqbmFtZSA9PSAnLicKLQkgICAgICAmJiBoYXNoX2ZpbmQgKHBvX2hhc2gsIG5hbWUgKyAxKSAhPSBOVUxMKSkKLQlhc193YXJuIChfKCJhdHRlbXB0IHRvIHJlZGVmaW5lIHBzZXVkby1vcCBgJXMnIGlnbm9yZWQiKSwKLQkJIG5hbWUpOwotICAgIH0KLQotICBzYl9raWxsICgmcyk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLm1leGl0IHBzZXVkby1vcCwgd2hpY2ggaW1tZWRpYXRlbHkgZXhpdHMgYSBtYWNybwotICAgZXhwYW5zaW9uLiAgKi8KLQotdm9pZAotc19tZXhpdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjb25kX2V4aXRfbWFjcm8gKG1hY3JvX25lc3QpOwotICBidWZmZXJfbGltaXQgPSBpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmlucHV0X2xpbmVfcG9pbnRlcik7Ci19Ci0KLS8qIFN3aXRjaCBpbiBhbmQgb3V0IG9mIE1SSSBtb2RlLiAgKi8KLQotdm9pZAotc19tcmkgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IG9uLCBvbGRfZmxhZzsKLQotICBvbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBvbGRfZmxhZyA9IGZsYWdfbXJpOwotICBpZiAob24gIT0gMCkKLSAgICB7Ci0gICAgICBmbGFnX21yaSA9IDE7Ci0jaWZkZWYgVENfTTY4SwotICAgICAgZmxhZ19tNjhrX21yaSA9IDE7Ci0jZW5kaWYKLSAgICAgIG1hY3JvX21yaV9tb2RlICgxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmbGFnX21yaSA9IDA7Ci0gICAgICBmbGFnX202OGtfbXJpID0gMDsKLSAgICAgIG1hY3JvX21yaV9tb2RlICgwKTsKLSAgICB9Ci0KLSAgLyogT3BlcmF0b3IgcHJlY2VkZW5jZSBjaGFuZ2VzIGluIG02OGsgTVJJIG1vZGUsIHNvIHdlIG5lZWQgdG8KLSAgICAgdXBkYXRlIHRoZSBvcGVyYXRvciByYW5raW5ncy4gICovCi0gIGV4cHJfc2V0X3ByZWNlZGVuY2UgKCk7Ci0KLSNpZmRlZiBNUklfTU9ERV9DSEFOR0UKLSAgaWYgKG9uICE9IG9sZF9mbGFnKQotICAgIE1SSV9NT0RFX0NIQU5HRSAob24pOwotI2VuZGlmCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGNoYW5naW5nIHRoZSBsb2NhdGlvbiBjb3VudGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWRvX29yZyAoc2VnbWVudCwgZXhwLCBmaWxsKQotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIGludCBmaWxsOwotewotICBpZiAoc2VnbWVudCAhPSBub3dfc2VnICYmIHNlZ21lbnQgIT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICBhc19iYWQgKF8oImludmFsaWQgc2VnbWVudCBcIiVzXCI7IHNlZ21lbnQgXCIlc1wiIGFzc3VtZWQiKSwKLQkgICAgc2VnbWVudF9uYW1lIChzZWdtZW50KSwgc2VnbWVudF9uYW1lIChub3dfc2VnKSk7Ci0KLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICB7Ci0gICAgICBpZiAoZmlsbCAhPSAwKQotCWFzX3dhcm4gKF8oImlnbm9yaW5nIGZpbGwgdmFsdWUgaW4gYWJzb2x1dGUgc2VjdGlvbiIpKTsKLSAgICAgIGlmIChleHAtPlhfb3AgIT0gT19jb25zdGFudCkKLQl7Ci0JICBhc19iYWQgKF8oIm9ubHkgY29uc3RhbnQgb2Zmc2V0cyBzdXBwb3J0ZWQgaW4gYWJzb2x1dGUgc2VjdGlvbiIpKTsKLQkgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLQl9Ci0gICAgICBhYnNfc2VjdGlvbl9vZmZzZXQgPSBleHAtPlhfYWRkX251bWJlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpwOwotCi0gICAgICBwID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgZXhwLT5YX2FkZF9zeW1ib2wsCi0JCSAgICBleHAtPlhfYWRkX251bWJlciwgKGNoYXIgKikgTlVMTCk7Ci0gICAgICAqcCA9IGZpbGw7Ci0gICAgfQotfQotCi12b2lkIAotc19vcmcgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50OwotICBleHByZXNzaW9uUyBleHA7Ci0gIHJlZ2lzdGVyIGxvbmcgdGVtcF9maWxsOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICAvKiBUaGUgbTY4ayBNUkkgYXNzZW1ibGVyIGhhcyBhIGRpZmZlcmVudCBtZWFuaW5nIGZvciAub3JnLiAgSXQKLSAgICAgbWVhbnMgdG8gY3JlYXRlIGFuIGFic29sdXRlIHNlY3Rpb24gYXQgYSBnaXZlbiBhZGRyZXNzLiAgV2UgY2FuJ3QKLSAgICAgc3VwcG9ydCB0aGF0LS11c2UgYSBsaW5rZXIgc2NyaXB0IGluc3RlYWQuICAqLwotICBpZiAoZmxhZ19tNjhrX21yaSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIk1SSSBzdHlsZSBPUkcgcHNldWRvLW9wIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBEb24ndCBiZWxpZXZlIHRoZSBkb2N1bWVudGF0aW9uIG9mIEJTRCA0LjIgQVMuICBUaGVyZSBpcyBubyBzdWNoCi0gICAgIHRoaW5nIGFzIGEgc3ViLXNlZ21lbnQtcmVsYXRpdmUgb3JpZ2luLiAgQW55IGFic29sdXRlIG9yaWdpbiBpcwotICAgICBnaXZlbiBhIHdhcm5pbmcsIHRoZW4gYXNzdW1lZCB0byBiZSBzZWdtZW50LXJlbGF0aXZlLiAgQW55Ci0gICAgIHNlZ21lbnRlZCBvcmlnaW4gZXhwcmVzc2lvbiAoImZvbys0MiIpIGhhZCBiZXR0ZXIgYmUgaW4gdGhlIHJpZ2h0Ci0gICAgIHNlZ21lbnQgb3IgdGhlIC5vcmcgaXMgaWdub3JlZC4KLQotICAgICBCU0QgNC4yIEFTIHdhcm5zIGlmIHlvdSB0cnkgdG8gLm9yZyBiYWNrd2FyZHMuIFdlIGNhbm5vdCBiZWNhdXNlCi0gICAgIHdlIG5ldmVyIGtub3cgc3ViLXNlZ21lbnQgc2l6ZXMgd2hlbiB3ZSBhcmUgcmVhZGluZyBjb2RlLiAgQlNECi0gICAgIHdpbGwgY3Jhc2ggdHJ5aW5nIHRvIGVtaXQgbmVnYXRpdmUgbnVtYmVycyBvZiBmaWxsZXIgYnl0ZXMgaW4KLSAgICAgY2VydGFpbiAub3Jncy4gV2UgZG9uJ3QgY3Jhc2gsIGJ1dCBzZWUgYXMtd3JpdGUgZm9yIHRoYXQgY29kZS4KLQotICAgICBEb24ndCBtYWtlIGZyYWcgaWYgbmVlZF9wYXNzXzI9PTEuICAqLwotICBzZWdtZW50ID0gZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uICgmZXhwKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgdGVtcF9maWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgdGVtcF9maWxsID0gMDsKLQotICBpZiAoIW5lZWRfcGFzc18yKQotICAgIGRvX29yZyAoc2VnbWVudCwgJmV4cCwgdGVtcF9maWxsKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzX29yZygpICovCi0KLS8qIEhhbmRsZSBwYXJzaW5nIGZvciB0aGUgTVJJIFNFQ1QvU0VDVElPTiBwc2V1ZG8tb3AuICBUaGlzIHNob3VsZCBiZQotICAgY2FsbGVkIGJ5IHRoZSBvYmotZm9ybWF0IHJvdXRpbmUgd2hpY2ggaGFuZGxlcyBzZWN0aW9uIGNoYW5naW5nCi0gICB3aGVuIGluIE1SSSBtb2RlLiAgSXQgd2lsbCBjcmVhdGUgYSBuZXcgc2VjdGlvbiwgYW5kIHJldHVybiBpdC4gIEl0Ci0gICB3aWxsIHNldCAqVFlQRSB0byB0aGUgc2VjdGlvbiB0eXBlOiBvbmUgb2YgJ0MnIChjb2RlKSwgJ0QnIChkYXRhKSwKLSAgICdNJyAobWl4ZWQpLCBvciAnUicgKHJvbWFibGUpLiAgSWYgQkZEX0FTU0VNQkxFUiBpcyBkZWZpbmVkLCB0aGUKLSAgIGZsYWdzIHdpbGwgYmUgc2V0IGluIHRoZSBzZWN0aW9uLiAgKi8KLQotdm9pZAotc19tcmlfc2VjdCAodHlwZSkKLSAgICAgY2hhciAqdHlwZTsKLXsKLSNpZmRlZiBUQ19NNjhLCi0KLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBzZWdUIHNlZzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIAotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKm5hbWUpKQotICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGRvCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSk7Ci0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOwotICAgIH0KLQotICBuYW1lID0geHN0cmR1cCAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgc2VnID0gc3Vic2VnX25ldyAobmFtZSwgMCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGludCBhbGlnbjsKLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgcmVjb3JkX2FsaWdubWVudCAoc2VnLCBhbGlnbik7Ci0gICAgfQotCi0gICp0eXBlID0gJ0MnOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgYyA9ICorK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgYyk7Ci0gICAgICBpZiAoYyA9PSAnQycgfHwgYyA9PSAnRCcgfHwgYyA9PSAnTScgfHwgYyA9PSAnUicpCi0JKnR5cGUgPSBjOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygidW5yZWNvZ25pemVkIHNlY3Rpb24gdHlwZSIpKTsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgewotCWZsYWd3b3JkIGZsYWdzOwotCi0JZmxhZ3MgPSBTRUNfTk9fRkxBR1M7Ci0JaWYgKCp0eXBlID09ICdDJykKLQkgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERTsKLQllbHNlIGlmICgqdHlwZSA9PSAnRCcgfHwgKnR5cGUgPT0gJ00nKQotCSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19EQVRBOwotCWVsc2UgaWYgKCp0eXBlID09ICdSJykKLQkgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19SRUFET05MWSB8IFNFQ19ST007Ci0JaWYgKGZsYWdzICE9IFNFQ19OT19GTEFHUykKLQkgIHsKLQkgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywgZmxhZ3MpKQotCSAgICAgIGFzX3dhcm4gKF8oImVycm9yIHNldHRpbmcgZmxhZ3MgZm9yIFwiJXNcIjogJXMiKSwKLQkJICAgICAgIGJmZF9zZWN0aW9uX25hbWUgKHN0ZG91dHB1dCwgc2VnKSwKLQkJICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgIH0KLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotICAvKiBJZ25vcmUgdGhlIEhQIHR5cGUuICAqLwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotI2Vsc2UgLyogISBUQ19NNjhLICovCi0jaWZkZWYgVENfSTk2MAotCi0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgc2VnVCBzZWc7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBuYW1lID0geHN0cmR1cCAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgc2VnID0gc3Vic2VnX25ldyAobmFtZSwgMCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgICp0eXBlID0gJ0MnOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqc2VjdHlwZTsKLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBzZWN0eXBlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgaWYgKCpzZWN0eXBlID09ICdcMCcpCi0JKnR5cGUgPSAnQyc7Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChzZWN0eXBlLCAidGV4dCIpID09IDApCi0JKnR5cGUgPSAnQyc7Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChzZWN0eXBlLCAiZGF0YSIpID09IDApCi0JKnR5cGUgPSAnRCc7Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChzZWN0eXBlLCAicm9tZGF0YSIpID09IDApCi0JKnR5cGUgPSAnUic7Ci0gICAgICBlbHNlCi0JYXNfd2FybiAoXygidW5yZWNvZ25pemVkIHNlY3Rpb24gdHlwZSBgJXMnIiksIHNlY3R5cGUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgfQotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBjaGFyICpzZWNjbWQ7Ci0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgc2VjY21kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgaWYgKHN0cmNhc2VjbXAgKHNlY2NtZCwgImFic29sdXRlIikgPT0gMCkKLQl7Ci0JICBhc19iYWQgKF8oImFic29sdXRlIHNlY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIikpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHNlY2NtZCwgImFsaWduIikgPT0gMCkKLQl7Ci0JICBpbnQgYWxpZ247Ci0KLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIHJlY29yZF9hbGlnbm1lbnQgKHNlZywgYWxpZ24pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc193YXJuIChfKCJ1bnJlY29nbml6ZWQgc2VjdGlvbiBjb21tYW5kIGAlcyciKSwgc2VjY21kKTsKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCX0KLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsJICAKLQotI2Vsc2UgLyogISBUQ19JOTYwICovCi0gIC8qIFRoZSBNUkkgYXNzZW1ibGVyIHNlZW1zIHRvIHVzZSBkaWZmZXJlbnQgZm9ybXMgb2YgLnNlY3QgZm9yCi0gICAgIGRpZmZlcmVudCB0YXJnZXRzLiAgKi8KLSAgYXNfYmFkICgiTVJJIG1vZGUgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB0YXJnZXQiKTsKLSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSNlbmRpZiAvKiAhIFRDX0k5NjAgKi8KLSNlbmRpZiAvKiAhIFRDX002OEsgKi8KLX0KLQotLyogSGFuZGxlIHRoZSAucHJpbnQgcHNldWRvLW9wLiAgKi8KLQotdm9pZAotc19wcmludCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpzOwotICBpbnQgbGVuOwotCi0gIHMgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbik7Ci0gIHByaW50ZiAoIiVzXG4iLCBzKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAucHVyZ2VtIHBzZXVkby1vcC4gICovCi0KLXZvaWQKLXNfcHVyZ2VtIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRvCi0gICAgewotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIGNoYXIgYzsKLQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIGRlbGV0ZV9tYWNybyAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAucmVwdCBwc2V1ZG8tb3AuICAqLwotCi12b2lkCi1zX3JlcHQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IGNvdW50OwotICBzYiBvbmU7Ci0gIHNiIG1hbnk7Ci0KLSAgY291bnQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBzYl9uZXcgKCZvbmUpOwotICBpZiAoISBidWZmZXJfYW5kX25lc3QgKCJSRVBUIiwgIkVORFIiLCAmb25lLCBnZXRfbGluZV9zYikpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJyZXB0IHdpdGhvdXQgZW5kciIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc2JfbmV3ICgmbWFueSk7Ci0gIHdoaWxlIChjb3VudC0tID4gMCkKLSAgICBzYl9hZGRfc2IgKCZtYW55LCAmb25lKTsKLQotICBzYl9raWxsICgmb25lKTsKLQotICBpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiICgmbWFueSwgaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgc2Jfa2lsbCAoJm1hbnkpOwotICBidWZmZXJfbGltaXQgPSBpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmlucHV0X2xpbmVfcG9pbnRlcik7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmVxdSwgLmVxdWl2IGFuZCAuc2V0IGRpcmVjdGl2ZXMuICBJZiBFUVVJViBpcyAxLCB0aGVuCi0gICB0aGlzIGlzIC5lcXVpdiwgYW5kIGl0IGlzIGFuIGVycm9yIGlmIHRoZSBzeW1ib2wgaXMgYWxyZWFkeQotICAgZGVmaW5lZC4gICovCi0KLXZvaWQgCi1zX3NldCAoZXF1aXYpCi0gICAgIGludCBlcXVpdjsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciBkZWxpbTsKLSAgcmVnaXN0ZXIgY2hhciAqZW5kX25hbWU7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgLyoKLSAgICogRXNwZWNpYWwgYXBvbG9naWVzIGZvciB0aGUgcmFuZG9tIGxvZ2ljOgotICAgKiB0aGlzIGp1c3QgZ3JldywgYW5kIGNvdWxkIGJlIHBhcnNlZCBtdWNoIG1vcmUgc2ltcGx5IQotICAgKiBEZWFuIGluIGhhc3RlLgotICAgKi8KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZGVsaW0gPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgZW5kX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICplbmRfbmFtZSA9IGRlbGltOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgICplbmRfbmFtZSA9IDA7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgXCIlc1wiIiksIG5hbWUpOwotICAgICAgKmVuZF9uYW1lID0gZGVsaW07Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgKmVuZF9uYW1lID0gMDsKLQotICBpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIFR1cm4gJy4gPSBtdW1ibGUnIGludG8gYSAub3JnIG11bWJsZSAqLwotICAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50OwotICAgICAgZXhwcmVzc2lvblMgZXhwOwotCi0gICAgICBzZWdtZW50ID0gZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uICgmZXhwKTsKLQotICAgICAgaWYgKCFuZWVkX3Bhc3NfMikKLQlkb19vcmcgKHNlZ21lbnQsICZleHAsIDApOwotCi0gICAgICAqZW5kX25hbWUgPSBkZWxpbTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKChzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpKSA9PSBOVUxMCi0gICAgICAmJiAoc3ltYm9sUCA9IG1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpKSA9PSBOVUxMKQotICAgIHsKLSNpZm5kZWYgTk9fTElTVElORwotICAgICAgLyogV2hlbiBkb2luZyBzeW1ib2wgbGlzdGluZ3MsIHBsYXkgZ2FtZXMgd2l0aCBkdW1teSBmcmFnbWVudHMgbGl2aW5nCi0JIG91dHNpZGUgdGhlIG5vcm1hbCBmcmFnbWVudCBjaGFpbiB0byByZWNvcmQgdGhlIGZpbGUgYW5kIGxpbmUgaW5mbwotICAgICAgICAgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChsaXN0aW5nICYgTElTVElOR19TWU1CT0xTKQotCXsKLQkgIGV4dGVybiBzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqbGlzdGluZ190YWlsOwotCSAgZnJhZ1MgKmR1bW15X2ZyYWcgPSAoZnJhZ1MgKikgeG1hbGxvYyAoc2l6ZW9mKGZyYWdTKSk7Ci0JICBtZW1zZXQgKGR1bW15X2ZyYWcsIDAsIHNpemVvZihmcmFnUykpOwotCSAgZHVtbXlfZnJhZy0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0JICBkdW1teV9mcmFnLT5saW5lID0gbGlzdGluZ190YWlsOwotCSAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLCAwLCBkdW1teV9mcmFnKTsKLQkgIGR1bW15X2ZyYWctPmZyX3N5bWJvbCA9IHN5bWJvbFA7Ci0JfQotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQkJCSAgICAKLSNpZmRlZiBPQkpfQ09GRgotICAgICAgLyogInNldCIgc3ltYm9scyBhcmUgbG9jYWwgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuICovCi0gICAgICBTRl9TRVRfTE9DQUwgKHN5bWJvbFApOwotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0KLSAgICB9CQkJCS8qIG1ha2UgYSBuZXcgc3ltYm9sICovCi0KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCk7Ci0KLSAgKmVuZF9uYW1lID0gZGVsaW07Ci0KLSAgaWYgKGVxdWl2Ci0gICAgICAmJiBTX0lTX0RFRklORUQgKHN5bWJvbFApCi0gICAgICAmJiBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSAhPSByZWdfc2VjdGlvbikKLSAgICBhc19iYWQgKF8oInN5bWJvbCBgJXMnIGFscmVhZHkgZGVmaW5lZCIpLCBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0KLSAgcHNldWRvX3NldCAoc3ltYm9sUCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfc2V0KCkgKi8KLQotdm9pZCAKLXNfc3BhY2UgKG11bHQpCi0gICAgIGludCBtdWx0OwotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGV4cHJlc3Npb25TIHZhbDsKLSAgY2hhciAqcCA9IDA7Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotICBpbnQgYnl0ZXM7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgLyogSW4gbTY4ayBNUkkgbW9kZSwgd2UgbmVlZCB0byBhbGlnbiB0byBhIHdvcmQgYm91bmRhcnksIHVubGVzcwotICAgICB0aGlzIGlzIGRzLmIuICAqLwotICBpZiAoZmxhZ19tNjhrX21yaSAmJiBtdWx0ID4gMSkKLSAgICB7Ci0gICAgICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCXsKLQkgIGFic19zZWN0aW9uX29mZnNldCArPSBhYnNfc2VjdGlvbl9vZmZzZXQgJiAxOwotCSAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLQkgICAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIGFic19zZWN0aW9uX29mZnNldCk7Ci0JfQotICAgICAgZWxzZSBpZiAobXJpX2NvbW1vbl9zeW1ib2wgIT0gTlVMTCkKLQl7Ci0JICB2YWx1ZVQgdmFsOwotCi0JICB2YWwgPSBTX0dFVF9WQUxVRSAobXJpX2NvbW1vbl9zeW1ib2wpOwotCSAgaWYgKCh2YWwgJiAxKSAhPSAwKQotCSAgICB7Ci0JICAgICAgU19TRVRfVkFMVUUgKG1yaV9jb21tb25fc3ltYm9sLCB2YWwgKyAxKTsKLQkgICAgICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotCQl7Ci0JCSAga25vdyAobGluZV9sYWJlbC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbCk7Ci0JCSAga25vdyAobGluZV9sYWJlbC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sID09IG1yaV9jb21tb25fc3ltYm9sKTsKLQkJICBsaW5lX2xhYmVsLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIgKz0gMTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRvX2FsaWduICgxLCAoY2hhciAqKSBOVUxMLCAwLCAwKTsKLQkgIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBsaW5lX2xhYmVsLT5zeV9mcmFnID0gZnJhZ19ub3c7Ci0JICAgICAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIGZyYWdfbm93X2ZpeCAoKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGJ5dGVzID0gbXVsdDsKLQotICBleHByZXNzaW9uICgmZXhwKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGV4cHJlc3Npb24gKCZ2YWwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbC5YX29wID0gT19jb25zdGFudDsKLSAgICAgIHZhbC5YX2FkZF9udW1iZXIgPSAwOwotICAgIH0KLQotICBpZiAodmFsLlhfb3AgIT0gT19jb25zdGFudAotICAgICAgfHwgdmFsLlhfYWRkX251bWJlciA8IC0gMHg4MAotICAgICAgfHwgdmFsLlhfYWRkX251bWJlciA+IDB4ZmYKLSAgICAgIHx8IChtdWx0ICE9IDAgJiYgbXVsdCAhPSAxICYmIHZhbC5YX2FkZF9udW1iZXIgIT0gMCkpCi0gICAgewotICAgICAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJVbnN1cHBvcnRlZCB2YXJpYWJsZSBzaXplIG9yIGZpbGwgdmFsdWUiKSk7Ci0gICAgICBlbHNlCi0JewotCSAgb2Zmc2V0VCBpOwotCi0JICBpZiAobXVsdCA9PSAwKQotCSAgICBtdWx0ID0gMTsKLQkgIGJ5dGVzID0gbXVsdCAqIGV4cC5YX2FkZF9udW1iZXI7Ci0JICBmb3IgKGkgPSAwOyBpIDwgZXhwLlhfYWRkX251bWJlcjsgaSsrKQotCSAgICBlbWl0X2V4cHIgKCZ2YWwsIG11bHQpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICBsb25nIHJlcGVhdDsKLQotCSAgcmVwZWF0ID0gZXhwLlhfYWRkX251bWJlcjsKLQkgIGlmIChtdWx0KQotCSAgICByZXBlYXQgKj0gbXVsdDsKLQkgIGJ5dGVzID0gcmVwZWF0OwotCSAgaWYgKHJlcGVhdCA8PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZmxhZ19tcmkpCi0JCWFzX3dhcm4gKF8oIi5zcGFjZSByZXBlYXQgY291bnQgaXMgemVybywgaWdub3JlZCIpKTsKLQkgICAgICBlbHNlIGlmIChyZXBlYXQgPCAwKQotCQlhc193YXJuIChfKCIuc3BhY2UgcmVwZWF0IGNvdW50IGlzIG5lZ2F0aXZlLCBpZ25vcmVkIikpOwotCSAgICAgIGdvdG8gZ2V0b3V0OwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGFyZSBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbiwganVzdCBidW1wIHRoZSBvZmZzZXQuICAqLwotCSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGFic19zZWN0aW9uX29mZnNldCArPSByZXBlYXQ7Ci0JICAgICAgZ290byBnZXRvdXQ7Ci0JICAgIH0KLQotCSAgLyogSWYgd2UgYXJlIHNlY3JldGx5IGluIGFuIE1SSSBjb21tb24gc2VjdGlvbiwgdGhlbgotCSAgICAgY3JlYXRpbmcgc3BhY2UganVzdCBpbmNyZWFzZXMgdGhlIHNpemUgb2YgdGhlIGNvbW1vbgotCSAgICAgc3ltYm9sLiAgKi8KLQkgIGlmIChtcmlfY29tbW9uX3N5bWJvbCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgU19TRVRfVkFMVUUgKG1yaV9jb21tb25fc3ltYm9sLAotCQkJICAgU19HRVRfVkFMVUUgKG1yaV9jb21tb25fc3ltYm9sKSArIHJlcGVhdCk7Ci0JICAgICAgZ290byBnZXRvdXQ7Ci0JICAgIH0KLQotCSAgaWYgKCFuZWVkX3Bhc3NfMikKLQkgICAgcCA9IGZyYWdfdmFyIChyc19maWxsLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCAoc3ltYm9sUyAqKSAwLAotCQkJICAob2Zmc2V0VCkgcmVwZWF0LCAoY2hhciAqKSAwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygic3BhY2UgYWxsb2NhdGlvbiB0b28gY29tcGxleCBpbiBhYnNvbHV0ZSBzZWN0aW9uIikpOwotCSAgICAgIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgMCk7Ci0JICAgIH0KLQkgIGlmIChtcmlfY29tbW9uX3N5bWJvbCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJzcGFjZSBhbGxvY2F0aW9uIHRvbyBjb21wbGV4IGluIGNvbW1vbiBzZWN0aW9uIikpOwotCSAgICAgIG1yaV9jb21tb25fc3ltYm9sID0gTlVMTDsKLQkgICAgfQotCSAgaWYgKCFuZWVkX3Bhc3NfMikKLQkgICAgcCA9IGZyYWdfdmFyIChyc19zcGFjZSwgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwKLQkJCSAgbWFrZV9leHByX3N5bWJvbCAoJmV4cCksIChvZmZzZXRUKSAwLCAoY2hhciAqKSAwKTsKLQl9Ci0KLSAgICAgIGlmIChwKQotCSpwID0gdmFsLlhfYWRkX251bWJlcjsKLSAgICB9Ci0KLSBnZXRvdXQ6Ci0KLSAgLyogSW4gTVJJIG1vZGUsIGFmdGVyIGFuIG9kZCBudW1iZXIgb2YgYnl0ZXMsIHdlIG11c3QgYWxpZ24gdG8gYW4KLSAgICAgZXZlbiB3b3JkIGJvdW5kYXJ5LCB1bmxlc3MgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgYSBkYy5iLCBkcy5iCi0gICAgIG9yIGRjYi5iLiAgKi8KLSAgaWYgKGZsYWdfbXJpICYmIChieXRlcyAmIDEpICE9IDApCi0gICAgbXJpX3BlbmRpbmdfYWxpZ24gPSAxOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi0vKiBUaGlzIGlzIGxpa2Ugc19zcGFjZSwgYnV0IHRoZSB2YWx1ZSBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciB3aXRoCi0gICB0aGUgZ2l2ZW4gcHJlY2lzaW9uLiAgVGhpcyBpcyBmb3IgdGhlIE1SSSBkY2IucyBwc2V1ZG8tb3AgYW5kCi0gICBmcmllbmRzLiAgKi8KLQotdm9pZAotc19mbG9hdF9zcGFjZSAoZmxvYXRfdHlwZSkKLSAgICAgaW50IGZsb2F0X3R5cGU7Ci17Ci0gIG9mZnNldFQgY291bnQ7Ci0gIGludCBmbGVuOwotICBjaGFyIHRlbXBbTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUXTsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBjb3VudCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyB2YWx1ZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBpZiAoZmxhZ19tcmkpCi0JbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAvKiBTa2lwIGFueSAwe2xldHRlcn0gdGhhdCBtYXkgYmUgcHJlc2VudC4gIERvbid0IGV2ZW4gY2hlY2sgaWYgdGhlCi0gICAqIGxldHRlciBpcyBsZWdhbC4gICovCi0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJzAnCi0gICAgICAmJiBpc2FscGhhICgodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzFdKSkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQotICAvKiBBY2NlcHQgOnh4eHgsIHdoZXJlIHRoZSB4J3MgYXJlIGhleCBkaWdpdHMsIGZvciBhIGZsb2F0aW5nIHBvaW50Ci0gICAgIHdpdGggdGhlIGV4YWN0IGRpZ2l0cyBzcGVjaWZpZWQuICAqLwotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICc6JykKLSAgICB7Ci0gICAgICBmbGVuID0gaGV4X2Zsb2F0IChmbG9hdF90eXBlLCB0ZW1wKTsKLSAgICAgIGlmIChmbGVuIDwgMCkKLQl7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgaWYgKGZsYWdfbXJpKQotCSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqZXJyOwotCi0gICAgICBlcnIgPSBtZF9hdG9mIChmbG9hdF90eXBlLCB0ZW1wLCAmZmxlbik7Ci0gICAgICBrbm93IChmbGVuIDw9IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCk7Ci0gICAgICBrbm93IChmbGVuID4gMCk7Ci0gICAgICBpZiAoZXJyKQotCXsKLQkgIGFzX2JhZCAoXygiQmFkIGZsb2F0aW5nIGxpdGVyYWw6ICVzIiksIGVycik7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgaWYgKGZsYWdfbXJpKQotCSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIHdoaWxlICgtLWNvdW50ID49IDApCi0gICAgewotICAgICAgY2hhciAqcDsKLQotICAgICAgcCA9IGZyYWdfbW9yZSAoZmxlbik7Ci0gICAgICBtZW1jcHkgKHAsIHRlbXAsICh1bnNpZ25lZCBpbnQpIGZsZW4pOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuc3RydWN0IHBzZXVkby1vcCwgYXMgZm91bmQgaW4gTUlQUyBhc3NlbWJsZXJzLiAgKi8KLQotdm9pZAotc19zdHJ1Y3QgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLSAgYWJzX3NlY3Rpb25fb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN1YnNlZ19zZXQgKGFic29sdXRlX3NlY3Rpb24sIDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci19Ci0KLXZvaWQKLXNfdGV4dCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICByZWdpc3RlciBpbnQgdGVtcDsKLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgKHN1YnNlZ1QpIHRlbXApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotI2lmZGVmIE9CSl9WTVMKLSAgY29uc3RfZmxhZyAmPSB+SU5fREVGQVVMVF9TRUNUSU9OOwotI2VuZGlmCi19CQkJCS8qIHNfdGV4dCgpICovCi0MCi0KLXZvaWQgCi1kZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpCi17Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgLyogUmV0dXJuIGhhdmluZyBhbHJlYWR5IHN3YWxsb3dlZCBlbmQtb2YtbGluZS4gKi8KLX0JCQkJLyogUmV0dXJuIHBvaW50aW5nIGp1c3QgYWZ0ZXIgZW5kLW9mLWxpbmUuICovCi0KLXZvaWQKLWlnbm9yZV9yZXN0X29mX2xpbmUgKCkJCS8qIEZvciBzdXNwZWN0IGxpbmVzOiBnaXZlcyB3YXJuaW5nLiAqLwotewotICBpZiAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpZiAoaXNwcmludCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKQotCWFzX2JhZCAoXygiUmVzdCBvZiBsaW5lIGlnbm9yZWQuIEZpcnN0IGlnbm9yZWQgY2hhcmFjdGVyIGlzIGAlYycuIiksCi0JCSppbnB1dF9saW5lX3BvaW50ZXIpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiUmVzdCBvZiBsaW5lIGlnbm9yZWQuIEZpcnN0IGlnbm9yZWQgY2hhcmFjdGVyIHZhbHVlZCAweCV4LiIpLAotCQkqaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgICAgIHdoaWxlIChpbnB1dF9saW5lX3BvaW50ZXIgPCBidWZmZXJfbGltaXQKLQkgICAgICYmICFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JfQotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7CQkvKiBSZXR1cm4gcG9pbnRpbmcganVzdCBhZnRlciBlbmQtb2YtbGluZS4gKi8KLSAga25vdyAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpIGlucHV0X2xpbmVfcG9pbnRlclstMV1dKTsKLX0KLQotdm9pZAotZGlzY2FyZF9yZXN0X29mX2xpbmUgKCkKLXsKLSAgd2hpbGUgKGlucHV0X2xpbmVfcG9pbnRlciA8IGJ1ZmZlcl9saW1pdAotICAgICAgICAgJiYgIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOyAgICAgICAgIC8qIFJldHVybiBwb2ludGluZyBqdXN0IGFmdGVyIGVuZC1vZi1saW5lLiAqLwotICBrbm93IChpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWy0xXV0pOwotfQotCi0vKgotICoJCQlwc2V1ZG9fc2V0KCkKLSAqCi0gKiBJbjoJUG9pbnRlciB0byBhIHN5bWJvbC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+ZXhwcmVzc2lvbi4KLSAqCi0gKiBPdXQ6CUlucHV0X2xpbmVfcG9pbnRlci0+anVzdCBhZnRlciBhbnkgd2hpdGVzcGFjZSBhZnRlciBleHByZXNzaW9uLgotICoJVHJpZWQgdG8gc2V0IHN5bWJvbCB0byB2YWx1ZSBvZiBleHByZXNzaW9uLgotICoJV2lsbCBjaGFuZ2Ugc3ltYm9scyB0eXBlLCB2YWx1ZSwgYW5kIGZyYWc7Ci0gKi8KLXZvaWQKLXBzZXVkb19zZXQgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSNpZiAoZGVmaW5lZCAoT0JKX0FPVVQpIHx8IGRlZmluZWQgKE9CSl9CT1VUKSkgJiYgISBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICBpbnQgZXh0OwotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0KLSAga25vdyAoc3ltYm9sUCk7CQkvKiBOVUxMIHBvaW50ZXIgaXMgbG9naWMgZXJyb3IuICovCi0jaWYgKGRlZmluZWQgKE9CSl9BT1VUKSB8fCBkZWZpbmVkIChPQkpfQk9VVCkpICYmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAgZXh0ID0gU19JU19FWFRFUk5BTCAoc3ltYm9sUCk7Ci0jZW5kaWYgLyogT0JKX0FPVVQgb3IgT0JKX0JPVVQgKi8KLQotICAodm9pZCkgZXhwcmVzc2lvbiAoJmV4cCk7Ci0KLSAgaWYgKGV4cC5YX29wID09IE9faWxsZWdhbCkKLSAgICBhc19iYWQgKF8oImlsbGVnYWwgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIikpOwotICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX2Fic2VudCkKLSAgICBhc19iYWQgKF8oIm1pc3NpbmcgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIikpOwotICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX2JpZykKLSAgICB7Ci0gICAgICBpZiAoZXhwLlhfYWRkX251bWJlciA+IDApCi0JYXNfYmFkIChfKCJiaWdudW0gaW52YWxpZDsgemVybyBhc3N1bWVkIikpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGV4cC5YX29wID09IE9fc3VidHJhY3QKLQkgICAmJiAoU19HRVRfU0VHTUVOVCAoZXhwLlhfYWRkX3N5bWJvbCkKLQkgICAgICAgPT0gU19HRVRfU0VHTUVOVCAoZXhwLlhfb3Bfc3ltYm9sKSkKLQkgICAmJiBTRUdfTk9STUFMIChTX0dFVF9TRUdNRU5UIChleHAuWF9hZGRfc3ltYm9sKSkKLQkgICAmJiBleHAuWF9hZGRfc3ltYm9sLT5zeV9mcmFnID09IGV4cC5YX29wX3N5bWJvbC0+c3lfZnJhZykKLSAgICB7Ci0gICAgICBleHAuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHAuWF9hZGRfbnVtYmVyID0gKFNfR0VUX1ZBTFVFIChleHAuWF9hZGRfc3ltYm9sKQotCQkJICAtIFNfR0VUX1ZBTFVFIChleHAuWF9vcF9zeW1ib2wpKTsKLSAgICB9Ci0KLSAgc3dpdGNoIChleHAuWF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2lsbGVnYWw6Ci0gICAgY2FzZSBPX2Fic2VudDoKLSAgICBjYXNlIE9fYmlnOgotICAgICAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGFic29sdXRlX3NlY3Rpb24pOwotI2lmIChkZWZpbmVkIChPQkpfQU9VVCkgfHwgZGVmaW5lZCAoT0JKX0JPVVQpKSAmJiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gICAgICBpZiAoZXh0KQotCVNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLSAgICAgIGVsc2UKLQlTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLSNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLwotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIGV4cC5YX2FkZF9udW1iZXIpOwotICAgICAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgICAgIHN5bWJvbFAtPnN5X2ZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19yZWdpc3RlcjoKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHJlZ19zZWN0aW9uKTsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBleHAuWF9hZGRfbnVtYmVyKTsKLSAgICAgIHN5bWJvbFAtPnN5X2ZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZXhwLlhfYWRkX3N5bWJvbCkgPT0gdW5kZWZpbmVkX3NlY3Rpb24KLQkgIHx8IGV4cC5YX2FkZF9udW1iZXIgIT0gMCkKLQlzeW1ib2xQLT5zeV92YWx1ZSA9IGV4cDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xTICpzID0gZXhwLlhfYWRkX3N5bWJvbDsKLQotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgU19HRVRfU0VHTUVOVCAocykpOwotI2lmIChkZWZpbmVkIChPQkpfQU9VVCkgfHwgZGVmaW5lZCAoT0JKX0JPVVQpKSAmJiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0JICBpZiAoZXh0KQotCSAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICBlbHNlCi0JICAgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOwotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0JICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwKLQkJICAgICAgIGV4cC5YX2FkZF9udW1iZXIgKyBTX0dFVF9WQUxVRSAocykpOwotCSAgc3ltYm9sUC0+c3lfZnJhZyA9IHMtPnN5X2ZyYWc7Ci0JICBjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzIChzeW1ib2xQLCBzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBUaGUgdmFsdWUgaXMgc29tZSBjb21wbGV4IGV4cHJlc3Npb24uCi0JIEZJWE1FOiBTaG91bGQgd2Ugc2V0IHRoZSBzZWdtZW50IHRvIGFueXRoaW5nPyAgKi8KLSAgICAgIHN5bWJvbFAtPnN5X3ZhbHVlID0gZXhwOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotDAotLyoKLSAqCQkJY29ucygpCi0gKgotICogQ09OU3RydWN0IG1vcmUgZnJhZyBvZiAuYnl0ZXMsIG9yIC53b3JkcyBldGMuCi0gKiBTaG91bGQgbmVlZF9wYXNzXzIgYmUgMSB0aGVuIGVtaXQgbm8gZnJhZyhzKS4KLSAqIFRoaXMgdW5kZXJzdGFuZHMgRVhQUkVTU0lPTlMuCi0gKgotICogQnVnICg/KQotICoKLSAqIFRoaXMgaGFzIGEgc3BsaXQgcGVyc29uYWxpdHkuIFdlIHVzZSBleHByZXNzaW9uKCkgdG8gcmVhZCB0aGUKLSAqIHZhbHVlLiBXZSBjYW4gZGV0ZWN0IGlmIHRoZSB2YWx1ZSB3b24ndCBmaXQgaW4gYSBieXRlIG9yIHdvcmQuCi0gKiBCdXQgd2UgY2FuJ3QgZGV0ZWN0IGlmIGV4cHJlc3Npb24oKSBkaXNjYXJkZWQgc2lnbmlmaWNhbnQgZGlnaXRzCi0gKiBpbiB0aGUgY2FzZSBvZiBhIGxvbmcuIE5vdCB3b3J0aCB0aGUgY3JvY2tzIHJlcXVpcmVkIHRvIGZpeCBpdC4KLSAqLwotCi0vKiBTZWxlY3QgYSBwYXJzZXIgZm9yIGNvbnMgZXhwcmVzc2lvbnMuICAqLwotCi0vKiBTb21lIHRhcmdldHMgbmVlZCB0byBwYXJzZSB0aGUgZXhwcmVzc2lvbiBpbiB2YXJpb3VzIGZhbmN5IHdheXMuCi0gICBZb3UgY2FuIGRlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04gdG8gZG8gd2hhdGV2ZXIgeW91IGxpa2UKLSAgIChmb3IgZXhhbXBsZSwgdGhlIEhQUEEgZG9lcyB0aGlzKS4gIE90aGVyd2lzZSwgeW91IGNhbiBkZWZpbmUKLSAgIEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMgdG8gcGVybWl0IGJpdGZpZWxkcyB0byBiZSBzcGVjaWZpZWQsIG9yCi0gICBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyB0byBwZXJtaXQgcmVwZWF0IGNvdW50cy4gIElmIG5vbmUgb2YgdGhlc2UKLSAgIGFyZSBkZWZpbmVkLCB3aGljaCBpcyB0aGUgbm9ybWFsIGNhc2UsIHRoZW4gb25seSBzaW1wbGUgZXhwcmVzc2lvbnMKLSAgIGFyZSBwZXJtaXR0ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotcGFyc2VfbXJpX2NvbnMgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cCwgdW5zaWduZWQgaW50IG5ieXRlcykpOwotCi0jaWZuZGVmIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTgotI2lmZGVmIEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMKLSNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSBwYXJzZV9iaXRmaWVsZF9jb25zIChFWFAsIE5CWVRFUykKLXN0YXRpYyB2b2lkIAotcGFyc2VfYml0ZmllbGRfY29ucyBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKSk7Ci0jZW5kaWYKLSNpZmRlZiBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUwotI2RlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04oRVhQLCBOQllURVMpIHBhcnNlX3JlcGVhdF9jb25zIChFWFAsIE5CWVRFUykKLXN0YXRpYyB2b2lkCi1wYXJzZV9yZXBlYXRfY29ucyBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKSk7Ci0jZW5kaWYKLQotLyogSWYgd2UgaGF2ZW4ndCBnb3R0ZW4gb25lIHlldCwganVzdCBjYWxsIGV4cHJlc3Npb24uICAqLwotI2lmbmRlZiBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04KLSNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSBleHByZXNzaW9uIChFWFApCi0jZW5kaWYKLSNlbmRpZgotCi0vKiB3b3JrZXIgdG8gZG8gLmJ5dGUgZXRjIHN0YXRlbWVudHMgKi8KLS8qIGNsb2JiZXJzIGlucHV0X2xpbmVfcG9pbnRlciwgY2hlY2tzICovCi0vKiBlbmQtb2YtbGluZS4gKi8KLXN0YXRpYyB2b2lkIAotY29uc193b3JrZXIgKG5ieXRlcywgcnZhKQotICAgICByZWdpc3RlciBpbnQgbmJ5dGVzOwkvKiAxPS5ieXRlLCAyPS53b3JkLCA0PS5sb25nICovCi0gICAgIGludCBydmE7Ci17Ci0gIGludCBjOwotICBleHByZXNzaW9uUyBleHA7Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIGlmIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBpZiAoZmxhZ19tcmkpCi0JbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0jaWZkZWYgbWRfY29uc19hbGlnbgotICBtZF9jb25zX2FsaWduIChuYnl0ZXMpOwotI2VuZGlmCi0KLSAgYyA9IDA7Ci0gIGRvCi0gICAgewotICAgICAgaWYgKGZsYWdfbTY4a19tcmkpCi0JcGFyc2VfbXJpX2NvbnMgKCZleHAsICh1bnNpZ25lZCBpbnQpIG5ieXRlcyk7Ci0gICAgICBlbHNlCi0JVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OICgmZXhwLCAodW5zaWduZWQgaW50KSBuYnl0ZXMpOwotCi0gICAgICBpZiAocnZhKQotCXsKLQkgIGlmIChleHAuWF9vcCA9PSBPX3N5bWJvbCkKLQkgICAgZXhwLlhfb3AgPSBPX3N5bWJvbF9ydmE7Ci0JICBlbHNlCi0JICAgIGFzX2ZhdGFsIChfKCJydmEgd2l0aG91dCBzeW1ib2wiKSk7Ci0JfQotICAgICAgZW1pdF9leHByICgmZXhwLCAodW5zaWduZWQgaW50KSBuYnl0ZXMpOwotICAgICAgKytjOwotICAgIH0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCi0gIC8qIEluIE1SSSBtb2RlLCBhZnRlciBhbiBvZGQgbnVtYmVyIG9mIGJ5dGVzLCB3ZSBtdXN0IGFsaWduIHRvIGFuCi0gICAgIGV2ZW4gd29yZCBib3VuZGFyeSwgdW5sZXNzIHRoZSBuZXh0IGluc3RydWN0aW9uIGlzIGEgZGMuYiwgZHMuYgotICAgICBvciBkY2IuYi4gICovCi0gIGlmIChmbGFnX21yaSAmJiBuYnl0ZXMgPT0gMSAmJiAoYyAmIDEpICE9IDApCi0gICAgbXJpX3BlbmRpbmdfYWxpZ24gPSAxOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlci0tOwkJLyogUHV0IHRlcm1pbmF0b3IgYmFjayBpbnRvIHN0cmVhbS4gKi8KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0KLQotCi12b2lkCi1jb25zIChzaXplKQotICAgICBpbnQgc2l6ZTsKLXsKLSAgY29uc193b3JrZXIgKHNpemUsIDApOwotfQotCi12b2lkIAotc19ydmEgKHNpemUpCi0gICAgIGludCBzaXplOwotewotICBjb25zX3dvcmtlciAoc2l6ZSwgMSk7Ci19Ci0KLS8qIFB1dCB0aGUgY29udGVudHMgb2YgZXhwcmVzc2lvbiBFWFAgaW50byB0aGUgb2JqZWN0IGZpbGUgdXNpbmcKLSAgIE5CWVRFUyBieXRlcy4gIElmIG5lZWRfcGFzc18yIGlzIDEsIHRoaXMgZG9lcyBub3RoaW5nLiAgKi8KLQotdm9pZAotZW1pdF9leHByIChleHAsIG5ieXRlcykKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgdW5zaWduZWQgaW50IG5ieXRlczsKLXsKLSAgb3BlcmF0b3JUIG9wOwotICByZWdpc3RlciBjaGFyICpwOwotICB2YWx1ZVQgZXh0cmFfZGlnaXQgPSAwOwotCi0gIC8qIERvbid0IGRvIGFueXRoaW5nIGlmIHdlIGFyZSBnb2luZyB0byBtYWtlIGFub3RoZXIgcGFzcy4gICovCi0gIGlmIChuZWVkX3Bhc3NfMikKLSAgICByZXR1cm47Ci0KLSNpZm5kZWYgTk9fTElTVElORwotI2lmZGVmIE9CSl9FTEYKLSAgLyogV2hlbiBnY2MgZW1pdHMgRFdBUkYgMSBkZWJ1Z2dpbmcgcHNldWRvLW9wcywgYSBsaW5lIG51bWJlciB3aWxsCi0gICAgIGFwcGVhciBhcyBhIGZvdXIgYnl0ZSBwb3NpdGl2ZSBjb25zdGFudCBpbiB0aGUgLmxpbmUgc2VjdGlvbiwKLSAgICAgZm9sbG93ZWQgYnkgYSAyIGJ5dGUgMHhmZmZmLiAgTG9vayBmb3IgdGhhdCBjYXNlIGhlcmUuICAqLwotICB7Ci0gICAgc3RhdGljIGludCBkd2FyZl9saW5lID0gLTE7Ci0KLSAgICBpZiAoc3RyY21wIChzZWdtZW50X25hbWUgKG5vd19zZWcpLCAiLmxpbmUiKSAhPSAwKQotICAgICAgZHdhcmZfbGluZSA9IC0xOwotICAgIGVsc2UgaWYgKGR3YXJmX2xpbmUgPj0gMAotCSAgICAgJiYgbmJ5dGVzID09IDIKLQkgICAgICYmIGV4cC0+WF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgICAmJiAoZXhwLT5YX2FkZF9udW1iZXIgPT0gLTEgfHwgZXhwLT5YX2FkZF9udW1iZXIgPT0gMHhmZmZmKSkKLSAgICAgIGxpc3Rpbmdfc291cmNlX2xpbmUgKCh1bnNpZ25lZCBpbnQpIGR3YXJmX2xpbmUpOwotICAgIGVsc2UgaWYgKG5ieXRlcyA9PSA0Ci0JICAgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPj0gMCkKLSAgICAgIGR3YXJmX2xpbmUgPSBleHAtPlhfYWRkX251bWJlcjsKLSAgICBlbHNlCi0gICAgICBkd2FyZl9saW5lID0gLTE7Ci0gIH0KLQotICAvKiBXaGVuIGdjYyBlbWl0cyBEV0FSRiAxIGRlYnVnZ2luZyBwc2V1ZG8tb3BzLCBhIGZpbGUgbmFtZSB3aWxsCi0gICAgIGFwcGVhciBhcyBhIDIgYnl0ZSBUQUdfY29tcGlsZV91bml0ICgweDExKSBmb2xsb3dlZCBieSBhIDIgYnl0ZQotICAgICBBVF9zaWJsaW5nICgweDEyKSBmb2xsb3dlZCBieSBhIGZvdXIgYnl0ZSBhZGRyZXNzIG9mIHRoZSBzaWJsaW5nCi0gICAgIGZvbGxvd2VkIGJ5IGEgMiBieXRlIEFUX25hbWUgKDB4MzgpIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIHRoZQotICAgICBmaWxlLiAgV2UgbG9vayBmb3IgdGhhdCBjYXNlIGhlcmUuICAqLwotICB7Ci0gICAgc3RhdGljIGludCBkd2FyZl9maWxlID0gMDsKLQotICAgIGlmIChzdHJjbXAgKHNlZ21lbnRfbmFtZSAobm93X3NlZyksICIuZGVidWciKSAhPSAwKQotICAgICAgZHdhcmZfZmlsZSA9IDA7Ci0gICAgZWxzZSBpZiAoZHdhcmZfZmlsZSA9PSAwCi0JICAgICAmJiBuYnl0ZXMgPT0gMgotCSAgICAgJiYgZXhwLT5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICYmIGV4cC0+WF9hZGRfbnVtYmVyID09IDB4MTEpCi0gICAgICBkd2FyZl9maWxlID0gMTsKLSAgICBlbHNlIGlmIChkd2FyZl9maWxlID09IDEKLQkgICAgICYmIG5ieXRlcyA9PSAyCi0JICAgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPT0gMHgxMikKLSAgICAgIGR3YXJmX2ZpbGUgPSAyOwotICAgIGVsc2UgaWYgKGR3YXJmX2ZpbGUgPT0gMgotCSAgICAgJiYgbmJ5dGVzID09IDQpCi0gICAgICBkd2FyZl9maWxlID0gMzsKLSAgICBlbHNlIGlmIChkd2FyZl9maWxlID09IDMKLQkgICAgICYmIG5ieXRlcyA9PSAyCi0JICAgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPT0gMHgzOCkKLSAgICAgIGR3YXJmX2ZpbGUgPSA0OwotICAgIGVsc2UKLSAgICAgIGR3YXJmX2ZpbGUgPSAwOwotCi0gICAgLyogVGhlIHZhcmlhYmxlIGR3YXJmX2ZpbGVfc3RyaW5nIHRlbGxzIHN0cmluZ2VyIHRoYXQgdGhlIHN0cmluZwotICAgICAgIG1heSBiZSB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuICAqLwotICAgIGlmIChkd2FyZl9maWxlID09IDQpCi0gICAgICBkd2FyZl9maWxlX3N0cmluZyA9IDE7Ci0gICAgZWxzZQotICAgICAgZHdhcmZfZmlsZV9zdHJpbmcgPSAwOwotICB9Ci0jZW5kaWYKLSNlbmRpZgotCi0gIGlmIChjaGVja19laF9mcmFtZSAoZXhwLCAmbmJ5dGVzKSkKLSAgICByZXR1cm47Ci0KLSAgb3AgPSBleHAtPlhfb3A7Ci0KLSAgLyogQWxsb3cgYC53b3JkIDAnIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLiAgKi8KLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICB7Ci0gICAgICBpZiAob3AgIT0gT19jb25zdGFudCB8fCBleHAtPlhfYWRkX251bWJlciAhPSAwKQotCWFzX2JhZCAoXygiYXR0ZW1wdCB0byBzdG9yZSB2YWx1ZSBpbiBhYnNvbHV0ZSBzZWN0aW9uIikpOwotICAgICAgYWJzX3NlY3Rpb25fb2Zmc2V0ICs9IG5ieXRlczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIGEgbmVnYXRpdmUgYmlnbnVtLiAgKi8KLSAgaWYgKG9wID09IE9fdW1pbnVzCi0gICAgICAmJiBleHAtPlhfYWRkX251bWJlciA9PSAwCi0gICAgICAmJiBleHAtPlhfYWRkX3N5bWJvbC0+c3lfdmFsdWUuWF9vcCA9PSBPX2JpZwotICAgICAgJiYgZXhwLT5YX2FkZF9zeW1ib2wtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA+IDApCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICB1bnNpZ25lZCBsb25nIGNhcnJ5OwotCi0gICAgICBleHAgPSAmZXhwLT5YX2FkZF9zeW1ib2wtPnN5X3ZhbHVlOwotCi0gICAgICAvKiBOZWdhdGUgdGhlIGJpZ251bTogb25lJ3MgY29tcGxlbWVudCBlYWNoIGRpZ2l0IGFuZCBhZGQgMS4gICovCi0gICAgICBjYXJyeSA9IDE7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZXhwLT5YX2FkZF9udW1iZXI7IGkrKykKLQl7Ci0JICB1bnNpZ25lZCBsb25nIG5leHQ7Ci0KLQkgIG5leHQgPSAoKCh+IChnZW5lcmljX2JpZ251bVtpXSAmIExJVFRMRU5VTV9NQVNLKSkKLQkJICAgJiBMSVRUTEVOVU1fTUFTSykKLQkJICArIGNhcnJ5KTsKLQkgIGdlbmVyaWNfYmlnbnVtW2ldID0gbmV4dCAmIExJVFRMRU5VTV9NQVNLOwotCSAgY2FycnkgPSBuZXh0ID4+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQl9Ci0KLSAgICAgIC8qIFdlIGNhbiBpZ25vcmUgYW55IGNhcnJ5IG91dCwgYmVjYXVzZSBpdCB3aWxsIGJlIGhhbmRsZWQgYnkKLQkgZXh0cmFfZGlnaXQgaWYgaXQgaXMgbmVlZGVkLiAgKi8KLQotICAgICAgZXh0cmFfZGlnaXQgPSAodmFsdWVUKSAtMTsKLSAgICAgIG9wID0gT19iaWc7Ci0gICAgfQotCi0gIGlmIChvcCA9PSBPX2Fic2VudCB8fCBvcCA9PSBPX2lsbGVnYWwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiemVybyBhc3N1bWVkIGZvciBtaXNzaW5nIGV4cHJlc3Npb24iKSk7Ci0gICAgICBleHAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBvcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotICBlbHNlIGlmIChvcCA9PSBPX2JpZyAmJiBleHAtPlhfYWRkX251bWJlciA8PSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG9wID0gT19jb25zdGFudDsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wID09IE9fcmVnaXN0ZXIpCi0gICAgewotICAgICAgYXNfd2FybiAoXygicmVnaXN0ZXIgdmFsdWUgdXNlZCBhcyBleHByZXNzaW9uIikpOwotICAgICAgb3AgPSBPX2NvbnN0YW50OwotICAgIH0KLQotICBwID0gZnJhZ19tb3JlICgoaW50KSBuYnl0ZXMpOwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLSAgLyogSWYgd2UgaGF2ZSB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpbiBhIHdvcmQsIHNhdmUgaXQgb24KLSAgICAgdGhlIGJyb2tlbl93b3JkcyBsaXN0LiAgU2VlIHRoZSBjb2RlIGluIHdyaXRlLmMuICAqLwotICBpZiAob3AgPT0gT19zdWJ0cmFjdCAmJiBuYnl0ZXMgPT0gMikKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYnJva2VuX3dvcmQgKng7Ci0KLSAgICAgIHggPSAoc3RydWN0IGJyb2tlbl93b3JkICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGJyb2tlbl93b3JkKSk7Ci0gICAgICB4LT5uZXh0X2Jyb2tlbl93b3JkID0gYnJva2VuX3dvcmRzOwotICAgICAgYnJva2VuX3dvcmRzID0geDsKLSAgICAgIHgtPnNlZyA9IG5vd19zZWc7Ci0gICAgICB4LT5zdWJzZWcgPSBub3dfc3Vic2VnOwotICAgICAgeC0+ZnJhZyA9IGZyYWdfbm93OwotICAgICAgeC0+d29yZF9nb2VzX2hlcmUgPSBwOwotICAgICAgeC0+ZGlzcGZyYWcgPSAwOwotICAgICAgeC0+YWRkID0gZXhwLT5YX2FkZF9zeW1ib2w7Ci0gICAgICB4LT5zdWIgPSBleHAtPlhfb3Bfc3ltYm9sOwotICAgICAgeC0+YWRkbnVtID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gICAgICB4LT5hZGRlZCA9IDA7Ci0gICAgICBuZXdfYnJva2VuX3dvcmRzKys7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogSWYgd2UgaGF2ZSBhbiBpbnRlZ2VyLCBidXQgdGhlIG51bWJlciBvZiBieXRlcyBpcyB0b28gbGFyZ2UgdG8KLSAgICAgcGFzcyB0byBtZF9udW1iZXJfdG9fY2hhcnMsIGhhbmRsZSBpdCBhcyBhIGJpZ251bS4gICovCi0gIGlmIChvcCA9PSBPX2NvbnN0YW50ICYmIG5ieXRlcyA+IHNpemVvZiAodmFsdWVUKSkKLSAgICB7Ci0gICAgICB2YWx1ZVQgdmFsOwotICAgICAgaW50IGdlbmNudDsKLQotICAgICAgaWYgKCEgZXhwLT5YX3Vuc2lnbmVkICYmIGV4cC0+WF9hZGRfbnVtYmVyIDwgMCkKLQlleHRyYV9kaWdpdCA9ICh2YWx1ZVQpIC0xOwotICAgICAgdmFsID0gKHZhbHVlVCkgZXhwLT5YX2FkZF9udW1iZXI7Ci0gICAgICBnZW5jbnQgPSAwOwotICAgICAgZG8KLQl7Ci0JICBnZW5lcmljX2JpZ251bVtnZW5jbnRdID0gdmFsICYgTElUVExFTlVNX01BU0s7Ci0JICB2YWwgPj49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgICsrZ2VuY250OwotCX0KLSAgICAgIHdoaWxlICh2YWwgIT0gMCk7Ci0gICAgICBvcCA9IGV4cC0+WF9vcCA9IE9fYmlnOwotICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSBnZW5jbnQ7Ci0gICAgfQotCi0gIGlmIChvcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHZhbHVlVCBnZXQ7Ci0gICAgICByZWdpc3RlciB2YWx1ZVQgdXNlOwotICAgICAgcmVnaXN0ZXIgdmFsdWVUIG1hc2s7Ci0gICAgICB2YWx1ZVQgaGliaXQ7Ci0gICAgICByZWdpc3RlciB2YWx1ZVQgdW5tYXNrOwotCi0gICAgICAvKiBKRiA8PCBvZiA+PSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb2JqZWN0IGlzIHVuZGVmaW5lZC4gIEluCi0JIHBhcnRpY3VsYXIgU1BBUkMgKFN1biA0KSBoYXMgcHJvYmxlbXMgKi8KLSAgICAgIGlmIChuYnl0ZXMgPj0gc2l6ZW9mICh2YWx1ZVQpKQotCXsKLQkgIG1hc2sgPSAwOwotCSAgaWYgKG5ieXRlcyA+IHNpemVvZiAodmFsdWVUKSkKLQkgICAgaGliaXQgPSAwOwotCSAgZWxzZQotCSAgICBoaWJpdCA9ICh2YWx1ZVQpIDEgPDwgKG5ieXRlcyAqIEJJVFNfUEVSX0NIQVIgLSAxKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogRG9uJ3Qgc3RvcmUgdGhlc2UgYml0cy4gKi8KLQkgIG1hc2sgPSB+KHZhbHVlVCkgMCA8PCAoQklUU19QRVJfQ0hBUiAqIG5ieXRlcyk7Ci0JICBoaWJpdCA9ICh2YWx1ZVQpIDEgPDwgKG5ieXRlcyAqIEJJVFNfUEVSX0NIQVIgLSAxKTsKLQl9Ci0KLSAgICAgIHVubWFzayA9IH5tYXNrOwkJLyogRG8gc3RvcmUgdGhlc2UgYml0cy4gKi8KLQotI2lmZGVmIE5FVkVSCi0gICAgICAiRG8gdGhpcyBtb2QgaWYgeW91IHdhbnQgZXZlcnkgb3ZlcmZsb3cgY2hlY2sgdG8gYXNzdW1lIFNJR05FRCAyJ3MgY29tcGxlbWVudCBkYXRhLiI7Ci0gICAgICBtYXNrID0gfih1bm1hc2sgPj4gMSk7CS8qIEluY2x1ZGVzIHNpZ24gYml0IG5vdy4gKi8KLSNlbmRpZgotCi0gICAgICBnZXQgPSBleHAtPlhfYWRkX251bWJlcjsKLSAgICAgIHVzZSA9IGdldCAmIHVubWFzazsKLSAgICAgIGlmICgoZ2V0ICYgbWFzaykgIT0gMAotCSAgJiYgKChnZXQgJiBtYXNrKSAhPSBtYXNrCi0JICAgICAgfHwgKGdldCAmIGhpYml0KSA9PSAwKSkKLQl7CQkvKiBMZWFkaW5nIGJpdHMgY29udGFpbiBib3RoIDBzICYgMXMuICovCi0JICBhc193YXJuIChfKCJWYWx1ZSAweCVseCB0cnVuY2F0ZWQgdG8gMHglbHguIiksCi0JCSAgICh1bnNpZ25lZCBsb25nKSBnZXQsICh1bnNpZ25lZCBsb25nKSB1c2UpOwotCX0KLSAgICAgIC8qIHB1dCBieXRlcyBpbiByaWdodCBvcmRlci4gKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgdXNlLCAoaW50KSBuYnl0ZXMpOwotICAgIH0KLSAgZWxzZSBpZiAob3AgPT0gT19iaWcpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgICBMSVRUTEVOVU1fVFlQRSAqbnVtczsKLQotICAgICAga25vdyAobmJ5dGVzICUgQ0hBUlNfUEVSX0xJVFRMRU5VTSA9PSAwKTsKLQotICAgICAgc2l6ZSA9IGV4cC0+WF9hZGRfbnVtYmVyICogQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLSAgICAgIGlmIChuYnl0ZXMgPCBzaXplKQotCXsKLQkgIGFzX3dhcm4gKF8oIkJpZ251bSB0cnVuY2F0ZWQgdG8gJWQgYnl0ZXMiKSwgbmJ5dGVzKTsKLQkgIHNpemUgPSBuYnl0ZXM7Ci0JfQotCi0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JewotCSAgd2hpbGUgKG5ieXRlcyA+IHNpemUpCi0JICAgIHsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIGV4dHJhX2RpZ2l0LCBDSEFSU19QRVJfTElUVExFTlVNKTsKLQkgICAgICBuYnl0ZXMgLT0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgICBwICs9IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgIH0KLQotCSAgbnVtcyA9IGdlbmVyaWNfYmlnbnVtICsgc2l6ZSAvIENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICB3aGlsZSAoc2l6ZSA+IDApCi0JICAgIHsKLQkgICAgICAtLW51bXM7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSAqbnVtcywgQ0hBUlNfUEVSX0xJVFRMRU5VTSk7Ci0JICAgICAgc2l6ZSAtPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICAgIHAgKz0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBudW1zID0gZ2VuZXJpY19iaWdudW07Ci0JICB3aGlsZSAoc2l6ZSA+IDApCi0JICAgIHsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpICpudW1zLCBDSEFSU19QRVJfTElUVExFTlVNKTsKLQkgICAgICArK251bXM7Ci0JICAgICAgc2l6ZSAtPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICAgIHAgKz0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgICBuYnl0ZXMgLT0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgfQotCi0JICB3aGlsZSAobmJ5dGVzID4gMCkKLQkgICAgewotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgZXh0cmFfZGlnaXQsIENIQVJTX1BFUl9MSVRUTEVOVU0pOwotCSAgICAgIG5ieXRlcyAtPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICAgIHAgKz0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtZW1zZXQgKHAsIDAsIG5ieXRlcyk7Ci0KLSAgICAgIC8qIE5vdyB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4UyB0byByZWNvcmQgdGhlIHN5bWJvbCB2YWx1ZS4KLQkgVGhpcyBpcyBlYXN5IGZvciBCRkQuICBGb3Igb3RoZXIgdGFyZ2V0cyBpdCBjYW4gYmUgbW9yZQotCSBjb21wbGV4LiAgRm9yIHZlcnkgY29tcGxleCBjYXNlcyAoY3VycmVudGx5LCB0aGUgSFBQQSBhbmQKLQkgTlMzMkspLCB5b3UgY2FuIGRlZmluZSBUQ19DT05TX0ZJWF9ORVcgdG8gZG8gd2hhdGV2ZXIgeW91Ci0JIHdhbnQuICBGb3Igc2ltcGxlciBjYXNlcywgeW91IGNhbiBkZWZpbmUgVENfQ09OU19SRUxPQyB0byBiZQotCSB0aGUgbmFtZSBvZiB0aGUgcmVsb2MgY29kZSB0aGF0IHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIGZpeFMuCi0JIElmIG5laXRoZXIgaXMgZGVmaW5lZCwgdGhlIGNvZGUgdXNlcyBOT19SRUxPQyBpZiBpdCBpcwotCSBkZWZpbmVkLCBhbmQgb3RoZXJ3aXNlIHVzZXMgMC4gICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jaWZkZWYgVENfQ09OU19GSVhfTkVXCi0gICAgICBUQ19DT05TX0ZJWF9ORVcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIG5ieXRlcywgZXhwKTsKLSNlbHNlCi0gICAgICB7Ci0JYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHI7Ci0KLQlzd2l0Y2ggKG5ieXRlcykKLQkgIHsKLQkgIGNhc2UgMToKLQkgICAgciA9IEJGRF9SRUxPQ184OwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkgICAgciA9IEJGRF9SRUxPQ18xNjsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDQ6Ci0JICAgIHIgPSBCRkRfUkVMT0NfMzI7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA4OgotCSAgICByID0gQkZEX1JFTE9DXzY0OwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIGFzX2JhZCAoXygidW5zdXBwb3J0ZWQgQkZEIHJlbG9jYXRpb24gc2l6ZSAldSIpLCBuYnl0ZXMpOwotCSAgICByID0gQkZEX1JFTE9DXzMyOwotCSAgICBicmVhazsKLQkgIH0KLQlmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgKGludCkgbmJ5dGVzLCBleHAsCi0JCSAgICAgMCwgcik7Ci0gICAgICB9Ci0jZW5kaWYKLSNlbHNlCi0jaWZkZWYgVENfQ09OU19GSVhfTkVXCi0gICAgICBUQ19DT05TX0ZJWF9ORVcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIG5ieXRlcywgZXhwKTsKLSNlbHNlCi0gICAgICAvKiBGaWd1cmUgb3V0IHdoaWNoIHJlbG9jIG51bWJlciB0byB1c2UuICBVc2UgVENfQ09OU19SRUxPQyBpZgotCSBpdCBpcyBkZWZpbmVkLCBvdGhlcndpc2UgdXNlIE5PX1JFTE9DIGlmIGl0IGlzIGRlZmluZWQsCi0JIG90aGVyd2lzZSB1c2UgMC4gICovCi0jaWZuZGVmIFRDX0NPTlNfUkVMT0MKLSNpZmRlZiBOT19SRUxPQwotI2RlZmluZSBUQ19DT05TX1JFTE9DIE5PX1JFTE9DCi0jZWxzZQotI2RlZmluZSBUQ19DT05TX1JFTE9DIDAKLSNlbmRpZgotI2VuZGlmCi0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgKGludCkgbmJ5dGVzLCBleHAsIDAsCi0JCSAgIFRDX0NPTlNfUkVMT0MpOwotI2VuZGlmIC8qIFRDX0NPTlNfRklYX05FVyAqLwotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLSAgICB9Ci19Ci0MCi0jaWZkZWYgQklURklFTERfQ09OU19FWFBSRVNTSU9OUwotCi0vKiBpOTYwIGFzc2VtYmxlcnMsIChlZywgYXNtOTYwKSwgYWxsb3cgYml0ZmllbGRzIGFmdGVyICIuYnl0ZSIgYXMKLSAgIHc6eCx5OnosIHdoZXJlIHcgYW5kIHkgYXJlIGJpdHdpZHRocyBhbmQgeCBhbmQgeSBhcmUgdmFsdWVzLiAgVGhleQotICAgdGhlbiBwYWNrIHRoZW0gYWxsIHRvZ2V0aGVyLiBXZSBkbyBhIGxpdHRsZSBiZXR0ZXIgaW4gdGhhdCB3ZSBhbGxvdwotICAgdGhlbSBpbiB3b3JkcywgbG9uZ3MsIGV0Yy4gYW5kIHdlJ2xsIHBhY2sgdGhlbSBpbiB0YXJnZXQgYnl0ZSBvcmRlcgotICAgZm9yIHlvdS4KLQotICAgVGhlIHJ1bGVzIGFyZTogcGFjayBsZWFzdCBzaWduaWZpY2F0IGJpdCBmaXJzdCwgaWYgYSBmaWVsZCBkb2Vzbid0Ci0gICBlbnRpcmVseSBmaXQsIHB1dCBpdCBpbiB0aGUgbmV4dCB1bml0LiAgT3ZlcmZsb3dpbmcgdGhlIGJpdGZpZWxkIGlzCi0gICBleHBsaWNpdGx5ICpub3QqIGV2ZW4gYSB3YXJuaW5nLiAgVGhlIGJpdHdpZHRoIHNob3VsZCBiZSBjb25zaWRlcmVkCi0gICBhICJtYXNrIi4KLQotICAgVG8gdXNlIHRoaXMgZnVuY3Rpb24gdGhlIHRjLVhYWC5oIGZpbGUgc2hvdWxkIGRlZmluZQotICAgQklURklFTERfQ09OU19FWFBSRVNTSU9OUy4gICovCi0KLXN0YXRpYyB2b2lkIAotcGFyc2VfYml0ZmllbGRfY29ucyAoZXhwLCBuYnl0ZXMpCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIHVuc2lnbmVkIGludCBuYnl0ZXM7Ci17Ci0gIHVuc2lnbmVkIGludCBiaXRzX2F2YWlsYWJsZSA9IEJJVFNfUEVSX0NIQVIgKiBuYnl0ZXM7Ci0gIGNoYXIgKmhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgKHZvaWQpIGV4cHJlc3Npb24gKGV4cCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJzonKQotICAgIHsJCQkvKiBiaXRmaWVsZHMgKi8KLSAgICAgIGxvbmcgdmFsdWUgPSAwOwotCi0gICAgICBmb3IgKDs7KQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgd2lkdGg7Ci0KLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICc6JykKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0JCQkvKiBuZXh0IHBpZWNlIGlzIG5vdCBhIGJpdGZpZWxkICovCi0KLQkgIC8qIEluIHRoZSBnZW5lcmFsIGNhc2UsIHdlIGNhbid0IGFsbG93Ci0JICAgICBmdWxsIGV4cHJlc3Npb25zIHdpdGggc3ltYm9sCi0JICAgICBkaWZmZXJlbmNlcyBhbmQgc3VjaC4gIFRoZSByZWxvY2F0aW9uCi0JICAgICBlbnRyaWVzIGZvciBzeW1ib2xzIG5vdCBkZWZpbmVkIGluIHRoaXMKLQkgICAgIGFzc2VtYmx5IHdvdWxkIHJlcXVpcmUgYXJiaXRyYXJ5IGZpZWxkCi0JICAgICB3aWR0aHMsIHBvc2l0aW9ucywgYW5kIG1hc2tzIHdoaWNoIG1vc3QKLQkgICAgIG9mIG91ciBjdXJyZW50IG9iamVjdCBmb3JtYXRzIGRvbid0Ci0JICAgICBzdXBwb3J0LgotCi0JICAgICBJbiB0aGUgc3BlY2lmaWMgY2FzZSB3aGVyZSBhIHN5bWJvbAotCSAgICAgKmlzKiBkZWZpbmVkIGluIHRoaXMgYXNzZW1ibHksIHdlCi0JICAgICAqY291bGQqIGJ1aWxkIGZpeHVwcyBhbmQgdHJhY2sgaXQsIGJ1dAotCSAgICAgdGhpcyBjb3VsZCBsZWFkIHRvIGNvbmZ1c2lvbiBmb3IgdGhlCi0JICAgICBiYWNrZW5kcy4gIEknbSBsYXp5LiBJJ2xsIHRha2UgYW55Ci0JICAgICBTRUdfQUJTT0xVVEUuIEkgdGhpbmsgdGhhdCBtZWFucyB0aGF0Ci0JICAgICB5b3UgY2FuIHVzZSBhIHByZXZpb3VzIC5zZXQgb3IKLQkgICAgIC5lcXUgdHlwZSBzeW1ib2wuICB4b3hvcmljaC4gKi8KLQotCSAgaWYgKGV4cC0+WF9vcCA9PSBPX2Fic2VudCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oInVzaW5nIGEgYml0IGZpZWxkIHdpZHRoIG9mIHplcm8iKSk7Ci0JICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgICAgIGV4cC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICAgIH0JCQkvKiBpbXBsaWVkIHplcm8gd2lkdGggYml0ZmllbGQgKi8KLQotCSAgaWYgKGV4cC0+WF9vcCAhPSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7Ci0JICAgICAgYXNfYmFkIChfKCJmaWVsZCB3aWR0aCBcIiVzXCIgdG9vIGNvbXBsZXggZm9yIGEgYml0ZmllbGQiKSwgaG9sZCk7Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICc6JzsKLQkgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQkJCS8qIHRvbyBjb21wbGV4ICovCi0KLQkgIGlmICgod2lkdGggPSBleHAtPlhfYWRkX251bWJlcikgPiAoQklUU19QRVJfQ0hBUiAqIG5ieXRlcykpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJmaWVsZCB3aWR0aCAlbHUgdG9vIGJpZyB0byBmaXQgaW4gJWQgYnl0ZXM6IHRydW5jYXRlZCB0byAlZCBiaXRzIiksCi0JCSAgICAgICB3aWR0aCwgbmJ5dGVzLCAoQklUU19QRVJfQ0hBUiAqIG5ieXRlcykpOwotCSAgICAgIHdpZHRoID0gQklUU19QRVJfQ0hBUiAqIG5ieXRlczsKLQkgICAgfQkJCS8qIHRvbyBiaWcgKi8KLQotCSAgaWYgKHdpZHRoID4gYml0c19hdmFpbGFibGUpCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRS1TT01FREFZOiBiYWNraW5nIHVwIGFuZCByZXBhcnNpbmcgaXMgd2FzdGVmdWwuICAqLwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSB2YWx1ZTsKLQkgICAgICBicmVhazsKLQkgICAgfQkJCS8qIHdvbid0IGZpdCAqLwotCi0JICBob2xkID0gKytpbnB1dF9saW5lX3BvaW50ZXI7IC8qIHNraXAgJzonICovCi0KLQkgICh2b2lkKSBleHByZXNzaW9uIChleHApOwotCSAgaWYgKGV4cC0+WF9vcCAhPSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgY2hhciBjYWNoZSA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLQkgICAgICBhc19iYWQgKF8oImZpZWxkIHZhbHVlIFwiJXNcIiB0b28gY29tcGxleCBmb3IgYSBiaXRmaWVsZCIpLCBob2xkKTsKLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gY2FjaGU7Ci0JICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0JCQkvKiB0b28gY29tcGxleCAqLwotCi0JICB2YWx1ZSB8PSAoKH4oLTEgPDwgd2lkdGgpICYgZXhwLT5YX2FkZF9udW1iZXIpCi0JCSAgICA8PCAoKEJJVFNfUEVSX0NIQVIgKiBuYnl0ZXMpIC0gYml0c19hdmFpbGFibGUpKTsKLQotCSAgaWYgKChiaXRzX2F2YWlsYWJsZSAtPSB3aWR0aCkgPT0gMAotCSAgICAgIHx8IGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkKLQkgICAgICB8fCAqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9CQkJLyogYWxsIHRoZSBiaXRmaWVsZHMgd2UncmUgZ29ubmEgZ2V0ICovCi0KLQkgIGhvbGQgPSArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICh2b2lkKSBleHByZXNzaW9uIChleHApOwotCX0JCQkvKiBmb3JldmVyIGxvb3AgKi8KLQotICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSB2YWx1ZTsKLSAgICAgIGV4cC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHAtPlhfdW5zaWduZWQgPSAxOwotICAgIH0JCQkJLyogaWYgbG9va3MgbGlrZSBhIGJpdGZpZWxkICovCi19CQkJCS8qIHBhcnNlX2JpdGZpZWxkX2NvbnMoKSAqLwotCi0jZW5kaWYgLyogQklURklFTERfQ09OU19FWFBSRVNTSU9OUyAqLwotDAotLyogSGFuZGxlIGFuIE1SSSBzdHlsZSBzdHJpbmcgZXhwcmVzc2lvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1wYXJzZV9tcmlfY29ucyAoZXhwLCBuYnl0ZXMpCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIHVuc2lnbmVkIGludCBuYnl0ZXM7Ci17Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcJycKLSAgICAgICYmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJ1wnJwotCSAgfHwgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ0EnCi0JICAgICAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnRScpKSkKLSAgICBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04gKGV4cCwgbmJ5dGVzKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzY2FuOwotICAgICAgdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7Ci0KLSAgICAgIC8qIEFuIE1SSSBzdHlsZSBzdHJpbmcuICBDdXQgaW50byBhcyBtYW55IGJ5dGVzIGFzIHdpbGwgZml0IGludG8KLQkgYSBuYnl0ZSBjaHVuaywgbGVmdCBqdXN0aWZ5IGlmIG5lY2Vzc2FyeSwgYW5kIHNlcGFyYXRlIHdpdGgKLQkgY29tbWFzIHNvIHdlIGNhbiB0cnkgYWdhaW4gbGF0ZXIuICAqLwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ0EnKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZWxzZSBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnRScpCi0JewotCSAgYXNfYmFkIChfKCJFQkNESUMgY29uc3RhbnRzIGFyZSBub3Qgc3VwcG9ydGVkIikpOwotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIGZvciAoc2NhbiA9IDA7IHNjYW4gPCBuYnl0ZXM7IHNjYW4rKykKLQl7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCcnKQotCSAgICB7Ci0JICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnXCcnKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWJyZWFrOwotCSAgICB9Ci0JICByZXN1bHQgPSAocmVzdWx0IDw8IDgpIHwgKCppbnB1dF9saW5lX3BvaW50ZXIrKyk7Ci0JfQotCi0gICAgICAvKiBMZWZ0IGp1c3RpZnkgKi8KLSAgICAgIHdoaWxlIChzY2FuIDwgbmJ5dGVzKQotCXsKLQkgIHJlc3VsdCA8PD0gODsKLQkgIHNjYW4rKzsKLQl9Ci0gICAgICAvKiBDcmVhdGUgY29ycmVjdCBleHByZXNzaW9uICovCi0gICAgICBleHAtPlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSByZXN1bHQ7Ci0gICAgICAvKiBGYWtlIGl0IHNvIHRoYXQgd2UgY2FuIHJlYWQgdGhlIG5leHQgY2hhciB0b28gKi8KLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gIT0gJ1wnJyB8fAotCSAgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnXCcnICYmIGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnXCcnKSkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgLT0gMjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlclswXSA9ICcsJzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlclsxXSA9ICdcJyc7Ci0JfQotICAgICAgZWxzZQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLX0KLQwKLSNpZmRlZiBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUwotCi0vKiBQYXJzZSBhIHJlcGVhdCBleHByZXNzaW9uIGZvciBjb25zLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBNSVBTCi0gICBhc3NlbWJsZXIuICBUaGUgZm9ybWF0IGlzIE5VTUJFUjpDT1VOVDsgTlVNQkVSIGFwcGVhcnMgaW4gdGhlCi0gICBvYmplY3QgZmlsZSBDT1VOVCB0aW1lcy4KLQotICAgVG8gdXNlIHRoaXMgZm9yIGEgdGFyZ2V0LCBkZWZpbmUgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMuICAqLwotCi1zdGF0aWMgdm9pZAotcGFyc2VfcmVwZWF0X2NvbnMgKGV4cCwgbmJ5dGVzKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzOwotewotICBleHByZXNzaW9uUyBjb3VudDsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0KLSAgZXhwcmVzc2lvbiAoZXhwKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnOicpCi0gICAgewotICAgICAgLyogTm8gcmVwZWF0IGNvdW50LiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGV4cHJlc3Npb24gKCZjb3VudCk7Ci0gIGlmIChjb3VudC5YX29wICE9IE9fY29uc3RhbnQKLSAgICAgIHx8IGNvdW50LlhfYWRkX251bWJlciA8PSAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIlVucmVzb2x2YWJsZSBvciBub25wb3NpdGl2ZSByZXBlYXQgY291bnQ7IHVzaW5nIDEiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFRoZSBjb25zIGZ1bmN0aW9uIGlzIGdvaW5nIHRvIG91dHB1dCB0aGlzIGV4cHJlc3Npb24gb25jZS4gIFNvIHdlCi0gICAgIG91dHB1dCBpdCBjb3VudCAtIDEgdGltZXMuICAqLwotICBmb3IgKGkgPSBjb3VudC5YX2FkZF9udW1iZXIgLSAxOyBpID4gMDsgaS0tKQotICAgIGVtaXRfZXhwciAoZXhwLCBuYnl0ZXMpOwotfQotCi0jZW5kaWYgLyogUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMgKi8KLQwKLS8qIFBhcnNlIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHJlcHJlc2VudGVkIGFzIGEgaGV4IGNvbnN0YW50LiAgVGhpcwotICAgcGVybWl0cyB1c2VycyB0byBzcGVjaWZ5IHRoZSBleGFjdCBiaXRzIHRoZXkgd2FudCBpbiB0aGUgZmxvYXRpbmcKLSAgIHBvaW50IG51bWJlci4gICovCi0KLXN0YXRpYyBpbnQKLWhleF9mbG9hdCAoZmxvYXRfdHlwZSwgYnl0ZXMpCi0gICAgIGludCBmbG9hdF90eXBlOwotICAgICBjaGFyICpieXRlczsKLXsKLSAgaW50IGxlbmd0aDsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoIChmbG9hdF90eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIGxlbmd0aCA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgbGVuZ3RoID0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBsZW5ndGggPSAxMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBsZW5ndGggPSAxMjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygiVW5rbm93biBmbG9hdGluZyB0eXBlIHR5cGUgJyVjJyIpLCBmbG9hdF90eXBlKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogSXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBnbyB0aHJvdWdoIGV4cHJlc3Npb24gdG8gcGFyc2UgdGhlCi0gICAgIGhleCBjb25zdGFudCwgYnV0IGlmIHdlIGdldCBhIGJpZ251bSBpdCdzIGEgcGFpbiB0byBzb3J0IGl0IGludG8KLSAgICAgdGhlIGJ1ZmZlciBjb3JyZWN0bHkuICAqLwotICBpID0gMDsKLSAgd2hpbGUgKGhleF9wICgqaW5wdXRfbGluZV9wb2ludGVyKSB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICdfJykKLSAgICB7Ci0gICAgICBpbnQgZDsKLQotICAgICAgLyogVGhlIE1SSSBhc3NlbWJsZXIgYWNjZXB0cyBhcmJpdHJhcnkgdW5kZXJzY29yZXMgc3RyZXduIGFib3V0Ci0JIHRocm91Z2ggdGhlIGhleCBjb25zdGFudCwgc28gd2UgaWdub3JlIHRoZW0gYXMgd2VsbC4gKi8KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdfJykKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKGkgPj0gbGVuZ3RoKQotCXsKLQkgIGFzX3dhcm4gKF8oIkZsb2F0aW5nIHBvaW50IGNvbnN0YW50IHRvbyBsYXJnZSIpKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBkID0gaGV4X3ZhbHVlICgqaW5wdXRfbGluZV9wb2ludGVyKSA8PCA0OwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXycpCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpZiAoaGV4X3AgKCppbnB1dF9saW5lX3BvaW50ZXIpKQotCXsKLQkgIGQgKz0gaGV4X3ZhbHVlICgqaW5wdXRfbGluZV9wb2ludGVyKTsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlieXRlc1tpXSA9IGQ7Ci0gICAgICBlbHNlCi0JYnl0ZXNbbGVuZ3RoIC0gaSAtIDFdID0gZDsKLSAgICAgICsraTsKLSAgICB9Ci0KLSAgaWYgKGkgPCBsZW5ndGgpCi0gICAgewotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCW1lbXNldCAoYnl0ZXMgKyBpLCAwLCBsZW5ndGggLSBpKTsKLSAgICAgIGVsc2UKLQltZW1zZXQgKGJ5dGVzLCAwLCBsZW5ndGggLSBpKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotLyoKLSAqCQkJZmxvYXRfY29ucygpCi0gKgotICogQ09OU3RydWN0IHNvbWUgbW9yZSBmcmFnIGNoYXJzIG9mIC5mbG9hdHMgLmZmbG9hdHMgZXRjLgotICogTWFrZXMgMCBvciBtb3JlIG5ldyBmcmFncy4KLSAqIElmIG5lZWRfcGFzc18yID09IDEsIG5vIGZyYWdzIGFyZSBlbWl0dGVkLgotICogVGhpcyB1bmRlcnN0YW5kcyBvbmx5IGZsb2F0aW5nIGxpdGVyYWxzLCBub3QgZXhwcmVzc2lvbnMuIFNvcnJ5LgotICoKLSAqIEEgZmxvYXRpbmcgY29uc3RhbnQgaXMgZGVmaW5lZCBieSBhdG9mX2dlbmVyaWMoKSwgZXhjZXB0IGl0IGlzIHByZWNlZGVkCi0gKiBieSAwZCAwZiAwZyBvciAwaC4gQWZ0ZXIgb2JzZXJ2aW5nIHRoZSBTVFJBTkdFIHdheSBteSBCU0QgQVMgZG9lcyBpdHMKLSAqIHJlYWRpbmcsIEkgZGVjaWRlZCB0byBiZSBpbmNvbXBhdGlibGUuIFRoaXMgYWx3YXlzIHRyaWVzIHRvIGdpdmUgeW91Ci0gKiByb3VuZGVkIGJpdHMgdG8gdGhlIHByZWNpc2lvbiBvZiB0aGUgcHNldWRvLW9wLiBGb3JtZXIgQVMgZGlkIHByZW1hdHVyZQotICogdHJ1bmNhdGF0aW9uLCByZXN0b3JlZCBub2lzeSBiaXRzIGluc3RlYWQgb2YgdHJhaWxpbmcgMHMgQU5EIGdhdmUgeW91Ci0gKiBhIGNob2ljZSBvZiAyIGZsYXZvdXJzIG9mIG5vaXNlIGFjY29yZGluZyB0byB3aGljaCBvZiAyIGZsb2F0aW5nLXBvaW50Ci0gKiBzY2FubmVycyB5b3UgZGlyZWN0ZWQgQVMgdG8gdXNlLgotICoKLSAqIEluOglpbnB1dF9saW5lX3BvaW50ZXItPndoaXRlc3BhY2UgYmVmb3JlLCBvciAnMCcgb2YgZmxvbnVtLgotICoKLSAqLwotCi12b2lkCi1mbG9hdF9jb25zIChmbG9hdF90eXBlKQotICAgICAvKiBDbG9iYmVycyBpbnB1dF9saW5lLXBvaW50ZXIsIGNoZWNrcyBlbmQtb2YtbGluZS4gKi8KLSAgICAgcmVnaXN0ZXIgaW50IGZsb2F0X3R5cGU7CS8qICdmJzouZmZsb2F0IC4uLiAnRic6LmZsb2F0IC4uLiAqLwotewotICByZWdpc3RlciBjaGFyICpwOwotICBpbnQgbGVuZ3RoOwkJCS8qIE51bWJlciBvZiBjaGFycyBpbiBhbiBvYmplY3QuICovCi0gIHJlZ2lzdGVyIGNoYXIgKmVycjsJCS8qIEVycm9yIGZyb20gc2Nhbm5pbmcgZmxvYXRpbmcgbGl0ZXJhbC4gKi8KLSAgY2hhciB0ZW1wW01BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVF07Ci0KLSAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIGRvCi0gICAgewotICAgICAgLyogaW5wdXRfbGluZV9wb2ludGVyLT4xc3QgY2hhciBvZiBhIGZsb251bSAod2UgaG9wZSEpLiAqLwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICAgICAvKiBTa2lwIGFueSAwe2xldHRlcn0gdGhhdCBtYXkgYmUgcHJlc2VudC4gRG9uJ3QgZXZlbiBjaGVjayBpZiB0aGUKLSAgICAgICAqIGxldHRlciBpcyBsZWdhbC4gU29tZW9uZSBtYXkgaW52ZW50IGEgInoiIGZvcm1hdCBhbmQgdGhpcyByb3V0aW5lCi0gICAgICAgKiBoYXMgbm8gdXNlIGZvciBzdWNoIGluZm9ybWF0aW9uLiBMdXNlcnMgYmV3YXJlOiB5b3UgZ2V0Ci0gICAgICAgKiBkaWFnbm9zdGljcyBpZiB5b3VyIGlucHV0IGlzIGlsbC1jb25kaXRpb25lZC4KLSAgICAgICAqLwotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnMCcKLQkgICYmIGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBpbnB1dF9saW5lX3BvaW50ZXJbMV0pKQotCWlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCi0gICAgICAvKiBBY2NlcHQgOnh4eHgsIHdoZXJlIHRoZSB4J3MgYXJlIGhleCBkaWdpdHMsIGZvciBhIGZsb2F0aW5nCi0gICAgICAgICBwb2ludCB3aXRoIHRoZSBleGFjdCBkaWdpdHMgc3BlY2lmaWVkLiAgKi8KLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJzonKQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgbGVuZ3RoID0gaGV4X2Zsb2F0IChmbG9hdF90eXBlLCB0ZW1wKTsKLQkgIGlmIChsZW5ndGggPCAwKQotCSAgICB7Ci0JICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXJyID0gbWRfYXRvZiAoZmxvYXRfdHlwZSwgdGVtcCwgJmxlbmd0aCk7Ci0JICBrbm93IChsZW5ndGggPD0gTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUKTsKLQkgIGtub3cgKGxlbmd0aCA+IDApOwotCSAgaWYgKGVycikKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiQmFkIGZsb2F0aW5nIGxpdGVyYWw6ICVzIiksIGVycik7Ci0JICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghbmVlZF9wYXNzXzIpCi0JewotCSAgaW50IGNvdW50OwotCi0JICBjb3VudCA9IDE7Ci0KLSNpZmRlZiBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJzonKQotCSAgICB7Ci0JICAgICAgZXhwcmVzc2lvblMgY291bnRfZXhwOwotCi0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgZXhwcmVzc2lvbiAoJmNvdW50X2V4cCk7Ci0JICAgICAgaWYgKGNvdW50X2V4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJICB8fCBjb3VudF9leHAuWF9hZGRfbnVtYmVyIDw9IDApCi0JCXsKLQkJICBhc193YXJuIChfKCJ1bnJlc29sdmFibGUgb3Igbm9ucG9zaXRpdmUgcmVwZWF0IGNvdW50OyB1c2luZyAxIikpOwotCQl9Ci0JICAgICAgZWxzZQotCQljb3VudCA9IGNvdW50X2V4cC5YX2FkZF9udW1iZXI7Ci0JICAgIH0KLSNlbmRpZgotCi0JICB3aGlsZSAoLS1jb3VudCA+PSAwKQotCSAgICB7Ci0JICAgICAgcCA9IGZyYWdfbW9yZSAobGVuZ3RoKTsKLQkgICAgICBtZW1jcHkgKHAsIHRlbXAsICh1bnNpZ25lZCBpbnQpIGxlbmd0aCk7Ci0JICAgIH0KLQl9Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICcsJyk7Ci0KLSAgLS1pbnB1dF9saW5lX3BvaW50ZXI7CQkvKiBQdXQgdGVybWluYXRvciBiYWNrIGludG8gc3RyZWFtLiAgKi8KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogZmxvYXRfY29ucygpICovCi0MCi0vKiBSZXR1cm4gdGhlIHNpemUgb2YgYSBMRUIxMjggdmFsdWUgKi8KLQotc3RhdGljIGlubGluZSBpbnQKLXNpemVvZl9zbGViMTI4ICh2YWx1ZSkKLSAgICAgb2Zmc2V0VCB2YWx1ZTsKLXsKLSAgcmVnaXN0ZXIgaW50IHNpemUgPSAwOwotICByZWdpc3RlciB1bnNpZ25lZCBieXRlOwotCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9ICh2YWx1ZSAmIDB4N2YpOwotICAgICAgLyogU2FkbHksIHdlIGNhbm5vdCByZWx5IG9uIHR5cGljYWwgYXJpdGhtZXRpYyByaWdodCBzaGlmdCBiZWhhdmlvdXIuCi0JIEZvcnR1bmF0ZWx5LCB3ZSBjYW4gc3RydWN0dXJlIHRoaW5ncyBzbyB0aGF0IHRoZSBleHRyYSB3b3JrIHJlZHVjZXMKLQkgdG8gYSBub29wIG9uIHN5c3RlbXMgdGhhdCBkbyB0aGluZ3MgInByb3Blcmx5Ii4gICovCi0gICAgICB2YWx1ZSA9ICh2YWx1ZSA+PiA3KSB8IH4oLShvZmZzZXRUKTEgPj4gNyk7Ci0gICAgICBzaXplICs9IDE7Ci0gICAgfQotICB3aGlsZSAoISgoKHZhbHVlID09IDApICYmICgoYnl0ZSAmIDB4NDApID09IDApKQotCSAgIHx8ICgodmFsdWUgPT0gLTEpICYmICgoYnl0ZSAmIDB4NDApICE9IDApKSkpOwotCi0gIHJldHVybiBzaXplOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotc2l6ZW9mX3VsZWIxMjggKHZhbHVlKQotICAgICB2YWx1ZVQgdmFsdWU7Ci17Ci0gIHJlZ2lzdGVyIGludCBzaXplID0gMDsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgYnl0ZTsKLQotICBkbwotICAgIHsKLSAgICAgIGJ5dGUgPSAodmFsdWUgJiAweDdmKTsKLSAgICAgIHZhbHVlID4+PSA3OwotICAgICAgc2l6ZSArPSAxOwotICAgIH0KLSAgd2hpbGUgKHZhbHVlICE9IDApOwotCi0gIHJldHVybiBzaXplOwotfQotCi1pbnQKLXNpemVvZl9sZWIxMjggKHZhbHVlLCBzaWduKQotICAgICB2YWx1ZVQgdmFsdWU7Ci0gICAgIGludCBzaWduOwotewotICBpZiAoc2lnbikKLSAgICByZXR1cm4gc2l6ZW9mX3NsZWIxMjggKChvZmZzZXRUKSB2YWx1ZSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gc2l6ZW9mX3VsZWIxMjggKHZhbHVlKTsKLX0KLQotLyogT3V0cHV0IGEgTEVCMTI4IHZhbHVlLiAgKi8KLQotc3RhdGljIGlubGluZSBpbnQKLW91dHB1dF9zbGViMTI4IChwLCB2YWx1ZSkKLSAgICAgY2hhciAqcDsKLSAgICAgb2Zmc2V0VCB2YWx1ZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqb3JpZyA9IHA7Ci0gIHJlZ2lzdGVyIGludCBtb3JlOwotCi0gIGRvCi0gICAgewotICAgICAgdW5zaWduZWQgYnl0ZSA9ICh2YWx1ZSAmIDB4N2YpOwotCi0gICAgICAvKiBTYWRseSwgd2UgY2Fubm90IHJlbHkgb24gdHlwaWNhbCBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IGJlaGF2aW91ci4KLQkgRm9ydHVuYXRlbHksIHdlIGNhbiBzdHJ1Y3R1cmUgdGhpbmdzIHNvIHRoYXQgdGhlIGV4dHJhIHdvcmsgcmVkdWNlcwotCSB0byBhIG5vb3Agb24gc3lzdGVtcyB0aGF0IGRvIHRoaW5ncyAicHJvcGVybHkiLiAgKi8KLSAgICAgIHZhbHVlID0gKHZhbHVlID4+IDcpIHwgfigtKG9mZnNldFQpMSA+PiA3KTsKLQotICAgICAgbW9yZSA9ICEoKCgodmFsdWUgPT0gMCkgJiYgKChieXRlICYgMHg0MCkgPT0gMCkpCi0JCXx8ICgodmFsdWUgPT0gLTEpICYmICgoYnl0ZSAmIDB4NDApICE9IDApKSkpOwotICAgICAgaWYgKG1vcmUpCi0JYnl0ZSB8PSAweDgwOwotCi0gICAgICAqcCsrID0gYnl0ZTsKLSAgICB9Ci0gIHdoaWxlIChtb3JlKTsKLQotICByZXR1cm4gcCAtIG9yaWc7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1vdXRwdXRfdWxlYjEyOCAocCwgdmFsdWUpCi0gICAgIGNoYXIgKnA7Ci0gICAgIHZhbHVlVCB2YWx1ZTsKLXsKLSAgY2hhciAqb3JpZyA9IHA7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICB1bnNpZ25lZCBieXRlID0gKHZhbHVlICYgMHg3Zik7Ci0gICAgICB2YWx1ZSA+Pj0gNzsKLSAgICAgIGlmICh2YWx1ZSAhPSAwKQotCS8qIE1vcmUgYnl0ZXMgdG8gZm9sbG93LiAgKi8KLQlieXRlIHw9IDB4ODA7Ci0KLSAgICAgICpwKysgPSBieXRlOwotICAgIH0KLSAgd2hpbGUgKHZhbHVlICE9IDApOwotCi0gIHJldHVybiBwIC0gb3JpZzsKLX0KLQotaW50Ci1vdXRwdXRfbGViMTI4IChwLCB2YWx1ZSwgc2lnbikKLSAgICAgY2hhciAqcDsKLSAgICAgdmFsdWVUIHZhbHVlOwotICAgICBpbnQgc2lnbjsKLXsKLSAgaWYgKHNpZ24pCi0gICAgcmV0dXJuIG91dHB1dF9zbGViMTI4IChwLCAob2Zmc2V0VCkgdmFsdWUpOwotICBlbHNlCi0gICAgcmV0dXJuIG91dHB1dF91bGViMTI4IChwLCB2YWx1ZSk7Ci19Ci0KLS8qIERvIHRoZSBzYW1lIGZvciBiaWdudW1zLiAgV2UgY29tYmluZSBzaXplb2Ygd2l0aCBvdXRwdXQgaGVyZSBpbiB0aGF0Ci0gICB3ZSBkb24ndCBvdXRwdXQgZm9yIE5VTEwgdmFsdWVzIG9mIFAuICBJdCBpc24ndCByZWFsbHkgYXMgY3JpdGljYWwgYXMKLSAgIGZvciAibm9ybWFsIiB2YWx1ZXMgdGhhdCB0aGlzIGJlIHN0cmVhbWxpbmVkLiAgKi8KLQotc3RhdGljIGlubGluZSBpbnQKLW91dHB1dF9iaWdfc2xlYjEyOCAocCwgYmlnbnVtLCBzaXplKQotICAgICBjaGFyICpwOwotICAgICBMSVRUTEVOVU1fVFlQRSAqYmlnbnVtOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgY2hhciAqb3JpZyA9IHA7Ci0gIHZhbHVlVCB2YWwgPSAwOwotICBpbnQgbG9hZGVkID0gMDsKLSAgdW5zaWduZWQgYnl0ZTsKLQotICAvKiBTdHJpcCBsZWFkaW5nIHNpZ24gZXh0ZW5zaW9ucyBvZmYgdGhlIGJpZ251bS4gICovCi0gIHdoaWxlIChzaXplID4gMCAmJiBiaWdudW1bc2l6ZS0xXSA9PSAoTElUVExFTlVNX1RZUEUpLTEpCi0gICAgc2l6ZS0tOwotCi0gIGRvCi0gICAgewotICAgICAgaWYgKGxvYWRlZCA8IDcgJiYgc2l6ZSA+IDApCi0JewotCSAgdmFsIHw9ICgqYmlnbnVtIDw8IGxvYWRlZCk7Ci0JICBsb2FkZWQgKz0gOCAqIENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICBzaXplLS07Ci0JICBiaWdudW0rKzsKLQl9Ci0KLSAgICAgIGJ5dGUgPSB2YWwgJiAweDdmOwotICAgICAgbG9hZGVkIC09IDc7Ci0gICAgICB2YWwgPj49IDc7Ci0KLSAgICAgIGlmIChzaXplID09IDApCi0JewotCSAgaWYgKCh2YWwgPT0gMCAmJiAoYnl0ZSAmIDB4NDApID09IDApCi0JICAgICAgfHwgKH4odmFsIHwgfigoKHZhbHVlVCkxIDw8IGxvYWRlZCkgLSAxKSkgPT0gMAotCQkgICYmIChieXRlICYgMHg0MCkgIT0gMCkpCi0JICAgIGJ5dGUgfD0gMHg4MDsKLQl9Ci0KLSAgICAgIGlmIChvcmlnKQotCSpwID0gYnl0ZTsKLSAgICAgIHArKzsKLSAgICB9Ci0gIHdoaWxlIChieXRlICYgMHg4MCk7Ci0KLSAgcmV0dXJuIHAgLSBvcmlnOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotb3V0cHV0X2JpZ191bGViMTI4IChwLCBiaWdudW0sIHNpemUpCi0gICAgIGNoYXIgKnA7Ci0gICAgIExJVFRMRU5VTV9UWVBFICpiaWdudW07Ci0gICAgIGludCBzaXplOwotewotICBjaGFyICpvcmlnID0gcDsKLSAgdmFsdWVUIHZhbCA9IDA7Ci0gIGludCBsb2FkZWQgPSAwOwotICB1bnNpZ25lZCBieXRlOwotCi0gIC8qIFN0cmlwIGxlYWRpbmcgemVyb3Mgb2ZmIHRoZSBiaWdudW0uICAqLwotICAvKiBYWFg6IElzIHRoaXMgbmVlZGVkPyAgKi8KLSAgd2hpbGUgKHNpemUgPiAwICYmIGJpZ251bVtzaXplLTFdID09IDApCi0gICAgc2l6ZS0tOwotCi0gIGRvCi0gICAgewotICAgICAgaWYgKGxvYWRlZCA8IDcgJiYgc2l6ZSA+IDApCi0JewotCSAgdmFsIHw9ICgqYmlnbnVtIDw8IGxvYWRlZCk7Ci0JICBsb2FkZWQgKz0gOCAqIENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICBzaXplLS07Ci0JICBiaWdudW0rKzsKLQl9Ci0KLSAgICAgIGJ5dGUgPSB2YWwgJiAweDdmOwotICAgICAgbG9hZGVkIC09IDc7Ci0gICAgICB2YWwgPj49IDc7Ci0KLSAgICAgIGlmIChzaXplID4gMCB8fCB2YWwpCi0JYnl0ZSB8PSAweDgwOwotCi0gICAgICBpZiAob3JpZykKLQkqcCA9IGJ5dGU7Ci0gICAgICBwKys7Ci0gICAgfQotICB3aGlsZSAoYnl0ZSAmIDB4ODApOwotCi0gIHJldHVybiBwIC0gb3JpZzsKLX0KLQotc3RhdGljIGludAotb3V0cHV0X2JpZ19sZWIxMjggKHAsIGJpZ251bSwgc2l6ZSwgc2lnbikKLSAgICAgY2hhciAqcDsKLSAgICAgTElUVExFTlVNX1RZUEUgKmJpZ251bTsKLSAgICAgaW50IHNpemUsIHNpZ247Ci17Ci0gIGlmIChzaWduKQotICAgIHJldHVybiBvdXRwdXRfYmlnX3NsZWIxMjggKHAsIGJpZ251bSwgc2l6ZSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gb3V0cHV0X2JpZ191bGViMTI4IChwLCBiaWdudW0sIHNpemUpOwotfQotCi0vKiBHZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgZnJhZ21lbnRzIGZvciBhIGdpdmVuIGV4cHJlc3Npb24gdG8gZW1pdCBhCi0gICBsZWIxMjggdmFsdWUuICAqLwotCi12b2lkCi1lbWl0X2xlYjEyOF9leHByKGV4cCwgc2lnbikKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgaW50IHNpZ247Ci17Ci0gIG9wZXJhdG9yVCBvcCA9IGV4cC0+WF9vcDsKLQotICBpZiAob3AgPT0gT19hYnNlbnQgfHwgb3AgPT0gT19pbGxlZ2FsKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oInplcm8gYXNzdW1lZCBmb3IgbWlzc2luZyBleHByZXNzaW9uIikpOwotICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgb3AgPSBPX2NvbnN0YW50OwotICAgIH0KLSAgZWxzZSBpZiAob3AgPT0gT19iaWcgJiYgZXhwLT5YX2FkZF9udW1iZXIgPD0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImZsb2F0aW5nIHBvaW50IG51bWJlciBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBleHAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBvcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotICBlbHNlIGlmIChvcCA9PSBPX3JlZ2lzdGVyKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oInJlZ2lzdGVyIHZhbHVlIHVzZWQgYXMgZXhwcmVzc2lvbiIpKTsKLSAgICAgIG9wID0gT19jb25zdGFudDsKLSAgICB9Ci0KLSAgaWYgKG9wID09IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgLyogSWYgd2UndmUgZ290IGEgY29uc3RhbnQsIGVtaXQgdGhlIHRoaW5nIGRpcmVjdGx5IHJpZ2h0IG5vdy4gICovCi0KLSAgICAgIHZhbHVlVCB2YWx1ZSA9IGV4cC0+WF9hZGRfbnVtYmVyOwotICAgICAgaW50IHNpemU7Ci0gICAgICBjaGFyICpwOwotCi0gICAgICBzaXplID0gc2l6ZW9mX2xlYjEyOCAodmFsdWUsIHNpZ24pOwotICAgICAgcCA9IGZyYWdfbW9yZSAoc2l6ZSk7Ci0gICAgICBvdXRwdXRfbGViMTI4IChwLCB2YWx1ZSwgc2lnbik7Ci0gICAgfQotICBlbHNlIGlmIChvcCA9PSBPX2JpZykKLSAgICB7Ci0gICAgICAvKiBPX2JpZyBpcyBhIGRpZmZlcmVudCBzb3J0IG9mIGNvbnN0YW50LiAgKi8KLQotICAgICAgaW50IHNpemU7Ci0gICAgICBjaGFyICpwOwotCi0gICAgICBzaXplID0gb3V0cHV0X2JpZ19sZWIxMjggKE5VTEwsIGdlbmVyaWNfYmlnbnVtLCBleHAtPlhfYWRkX251bWJlciwgc2lnbik7Ci0gICAgICBwID0gZnJhZ19tb3JlIChzaXplKTsKLSAgICAgIG91dHB1dF9iaWdfbGViMTI4IChwLCBnZW5lcmljX2JpZ251bSwgZXhwLT5YX2FkZF9udW1iZXIsIHNpZ24pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBjcmVhdGUgYSB2YXJpYWJsZSBzaXplZCBmcmFnbWVudCBhbmQgCi0JIHJlc29sdmUgdGhpbmdzIGxhdGVyLiAgKi8KLQotICAgICAgZnJhZ192YXIgKHJzX2xlYjEyOCwgc2l6ZW9mX3VsZWIxMjggKH4odmFsdWVUKTApLCAwLCBzaWduLAotCQltYWtlX2V4cHJfc3ltYm9sIChleHApLCAwLCAoY2hhciAqKSBOVUxMKTsKLSAgICB9Ci19Ci0KLS8qIFBhcnNlIHRoZSAuc2xlYjEyOCBhbmQgLnVsZWIxMjggcHNldWRvcy4gICovCi0KLXZvaWQKLXNfbGViMTI4IChzaWduKQotICAgICBpbnQgc2lnbjsKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotCi0gIGRvIHsKLSAgICBleHByZXNzaW9uICgmZXhwKTsKLSAgICBlbWl0X2xlYjEyOF9leHByICgmZXhwLCBzaWduKTsKLSAgfSB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICcsJyk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKgotICoJCQlzdHJpbmdlcigpCi0gKgotICogV2UgcmVhZCAwIG9yIG1vcmUgJywnIHNlcGVyYXRlZCwgZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotICoKLSAqIENhbGxlciBzaG91bGQgaGF2ZSBjaGVja2VkIG5lZWRfcGFzc18yIGlzIEZBTFNFIGJlY2F1c2Ugd2UgZG9uJ3QgY2hlY2sgaXQuCi0gKi8KLQotCi12b2lkIAotc3RyaW5nZXIgKGFwcGVuZF96ZXJvKQkJLyogV29ya2VyIHRvIGRvIC5hc2NpaSBldGMgc3RhdGVtZW50cy4gKi8KLSAgICAgLyogQ2hlY2tzIGVuZC1vZi1saW5lLiAqLwotICAgICByZWdpc3RlciBpbnQgYXBwZW5kX3plcm87CS8qIDA6IGRvbid0IGFwcGVuZCAnXDAnLCBlbHNlIDEgKi8KLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGM7Ci0gIGNoYXIgKnN0YXJ0OwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICAvKgotICAgKiBUaGUgZm9sbG93aW5nIGF3a3dhcmQgbG9naWMgaXMgdG8gcGFyc2UgWkVSTyBvciBtb3JlIHN0cmluZ3MsCi0gICAqIGNvbW1hIHNlcGFyYXRlZC4gUmVjYWxsIGEgc3RyaW5nIGV4cHJlc3Npb24gaW5jbHVkZXMgc3BhY2VzCi0gICAqIGJlZm9yZSB0aGUgb3BlbmluZyAnXCInIGFuZCBzcGFjZXMgYWZ0ZXIgdGhlIGNsb3NpbmcgJ1wiJy4KLSAgICogV2UgZmFrZSBhIGxlYWRpbmcgJywnIGlmIHRoZXJlIGlzIChzdXBwb3NlZCB0byBiZSkKLSAgICogYSAxc3QsIGV4cHJlc3Npb24uIFdlIGtlZXAgZGVtYW5kaW5nIGV4cHJlc3Npb25zIGZvciBlYWNoCi0gICAqICcsJy4KLSAgICovCi0gIGlmIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGMgPSAwOwkJCS8qIFNraXAgbG9vcC4gKi8KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwkvKiBDb21wZW5zYXRlIGZvciBlbmQgb2YgbG9vcC4gKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjID0gJywnOwkJCS8qIERvIGxvb3AuICovCi0gICAgfQotICB3aGlsZSAoYyA9PSAnLCcgfHwgYyA9PSAnPCcgfHwgYyA9PSAnIicpCi0gICAgewotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCXsKLQljYXNlICdcIic6Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsJLyotPjFzdCBjaGFyIG9mIHN0cmluZy4gKi8KLQkgIHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgd2hpbGUgKGlzX2FfY2hhciAoYyA9IG5leHRfY2hhcl9vZl9zdHJpbmcgKCkpKQotCSAgICB7Ci0JICAgICAgRlJBR19BUFBFTkRfMV9DSEFSIChjKTsKLQkgICAgfQotCSAgaWYgKGFwcGVuZF96ZXJvKQotCSAgICB7Ci0JICAgICAgRlJBR19BUFBFTkRfMV9DSEFSICgwKTsKLQkgICAgfQotCSAga25vdyAoaW5wdXRfbGluZV9wb2ludGVyWy0xXSA9PSAnXCInKTsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0jaWZkZWYgT0JKX0VMRgotCSAgLyogSW4gRUxGLCB3aGVuIGdjYyBpcyBlbWl0dGluZyBEV0FSRiAxIGRlYnVnZ2luZyBvdXRwdXQsIGl0Ci0gICAgICAgICAgICAgd2lsbCBlbWl0IC5zdHJpbmcgd2l0aCBhIGZpbGVuYW1lIGluIHRoZSAuZGVidWcgc2VjdGlvbgotICAgICAgICAgICAgIGFmdGVyIGEgc2VxdWVuY2Ugb2YgY29uc3RhbnRzLiAgU2VlIHRoZSBjb21tZW50IGluCi0gICAgICAgICAgICAgZW1pdF9leHByIGZvciB0aGUgc2VxdWVuY2UuICBlbWl0X2V4cHIgd2lsbCBzZXQKLSAgICAgICAgICAgICBkd2FyZl9maWxlX3N0cmluZyB0byBub24temVybyBpZiB0aGlzIHN0cmluZyBtaWdodCBiZSBhCi0gICAgICAgICAgICAgc291cmNlIGZpbGUgbmFtZS4gICovCi0JICBpZiAoc3RyY21wIChzZWdtZW50X25hbWUgKG5vd19zZWcpLCAiLmRlYnVnIikgIT0gMCkKLQkgICAgZHdhcmZfZmlsZV9zdHJpbmcgPSAwOwotCSAgZWxzZSBpZiAoZHdhcmZfZmlsZV9zdHJpbmcpCi0JICAgIHsKLQkgICAgICBjID0gaW5wdXRfbGluZV9wb2ludGVyWy0xXTsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXJbLTFdID0gJ1wwJzsKLQkgICAgICBsaXN0aW5nX3NvdXJjZV9maWxlIChzdGFydCk7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyWy0xXSA9IGM7Ci0JICAgIH0KLSNlbmRpZgotI2VuZGlmCi0KLQkgIGJyZWFrOwotCWNhc2UgJzwnOgotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBjID0gZ2V0X3NpbmdsZV9udW1iZXIgKCk7Ci0JICBGUkFHX0FQUEVORF8xX0NIQVIgKGMpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz4nKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCA8bm4+IikpOwotCSAgICB9Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGJyZWFrOwotCWNhc2UgJywnOgotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBicmVhazsKLQl9Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc3RyaW5nZXIoKSAqLwotDAotLyogRklYTUUtU09NRURBWTogSSBoYWQgdHJvdWJsZSBoZXJlIG9uIGNoYXJhY3RlcnMgd2l0aCB0aGUKLSAgICBoaWdoIGJpdHMgc2V0LiAgV2UnbGwgcHJvYmFibHkgYWxzbyBoYXZlIHRyb3VibGUgd2l0aAotICAgIG11bHRpYnl0ZSBjaGFycywgd2lkZSBjaGFycywgZXRjLiAgQWxzbyBiZSBjYXJlZnVsIGFib3V0Ci0gICAgcmV0dXJuaW5nIHZhbHVlcyBiaWdnZXIgdGhhbiAxIGJ5dGUuICB4b3hvcmljaC4gKi8KLQotdW5zaWduZWQgaW50IAotbmV4dF9jaGFyX29mX3N0cmluZyAoKQotewotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYzsKLQotICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrICYgQ0hBUl9NQVNLOwotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ1wiJzoKLSAgICAgIGMgPSBOT1RfQV9DSEFSOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdcbic6Ci0gICAgICBhc193YXJuIChfKCJVbnRlcm1pbmF0ZWQgc3RyaW5nOiBOZXdsaW5lIGluc2VydGVkLiIpKTsKLSAgICAgIGJ1bXBfbGluZV9jb3VudGVycyAoKTsKLSAgICAgIGJyZWFrOwotCi0jaWZuZGVmIE5PX1NUUklOR19FU0NBUEVTCi0gICAgY2FzZSAnXFwnOgotICAgICAgc3dpdGNoIChjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrKQotCXsKLQljYXNlICdiJzoKLQkgIGMgPSAnXGInOwotCSAgYnJlYWs7Ci0KLQljYXNlICdmJzoKLQkgIGMgPSAnXGYnOwotCSAgYnJlYWs7Ci0KLQljYXNlICduJzoKLQkgIGMgPSAnXG4nOwotCSAgYnJlYWs7Ci0KLQljYXNlICdyJzoKLQkgIGMgPSAnXHInOwotCSAgYnJlYWs7Ci0KLQljYXNlICd0JzoKLQkgIGMgPSAnXHQnOwotCSAgYnJlYWs7Ci0KLQljYXNlICd2JzoKLQkgIGMgPSAnXDAxMyc7Ci0JICBicmVhazsKLQotCWNhc2UgJ1xcJzoKLQljYXNlICciJzoKLQkgIGJyZWFrOwkJLyogQXMgaXRzZWxmLiAqLwotCi0JY2FzZSAnMCc6Ci0JY2FzZSAnMSc6Ci0JY2FzZSAnMic6Ci0JY2FzZSAnMyc6Ci0JY2FzZSAnNCc6Ci0JY2FzZSAnNSc6Ci0JY2FzZSAnNic6Ci0JY2FzZSAnNyc6Ci0JY2FzZSAnOCc6Ci0JY2FzZSAnOSc6Ci0JICB7Ci0JICAgIGxvbmcgbnVtYmVyOwotCSAgICBpbnQgaTsKLQotCSAgICBmb3IgKGkgPSAwLCBudW1iZXIgPSAwOyBpc2RpZ2l0IChjKSAmJiBpIDwgMzsgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKywgaSsrKQotCSAgICAgIHsKLQkJbnVtYmVyID0gbnVtYmVyICogOCArIGMgLSAnMCc7Ci0JICAgICAgfQotCSAgICBjID0gbnVtYmVyICYgMHhmZjsKLQkgIH0KLQkgIC0taW5wdXRfbGluZV9wb2ludGVyOwotCSAgYnJlYWs7Ci0KLQljYXNlICd4JzoKLQljYXNlICdYJzoKLQkgIHsKLQkgICAgbG9uZyBudW1iZXI7Ci0KLQkgICAgbnVtYmVyID0gMDsKLQkgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgd2hpbGUgKGlzeGRpZ2l0IChjKSkKLQkgICAgICB7Ci0JCWlmIChpc2RpZ2l0IChjKSkKLQkJICBudW1iZXIgPSBudW1iZXIgKiAxNiArIGMgLSAnMCc7Ci0JCWVsc2UgaWYgKGlzdXBwZXIgKGMpKQotCQkgIG51bWJlciA9IG51bWJlciAqIDE2ICsgYyAtICdBJyArIDEwOwotCQllbHNlCi0JCSAgbnVtYmVyID0gbnVtYmVyICogMTYgKyBjIC0gJ2EnICsgMTA7Ci0JCWMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAgfQotCSAgICBjID0gbnVtYmVyICYgMHhmZjsKLQkgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ1xuJzoKLQkgIC8qIFRvIGJlIGNvbXBhdGlibGUgd2l0aCBCU0QgNC4yIGFzOiBnaXZlIHRoZSBsdXNlciBhIGxpbmVmZWVkISEgKi8KLQkgIGFzX3dhcm4gKF8oIlVudGVybWluYXRlZCBzdHJpbmc6IE5ld2xpbmUgaW5zZXJ0ZWQuIikpOwotCSAgYyA9ICdcbic7Ci0JICBidW1wX2xpbmVfY291bnRlcnMgKCk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0KLSNpZmRlZiBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMKLQkgIGFzX2JhZCAoXygiQmFkIGVzY2FwZWQgY2hhcmFjdGVyIGluIHN0cmluZywgJz8nIGFzc3VtZWQiKSk7Ci0JICBjID0gJz8nOwotI2VuZGlmIC8qIE9OTFlfU1RBTkRBUkRfRVNDQVBFUyAqLwotCi0JICBicmVhazsKLQl9CQkJLyogc3dpdGNoIG9uIGVzY2FwZWQgY2hhciAqLwotICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogISBkZWZpbmVkIChOT19TVFJJTkdfRVNDQVBFUykgKi8KLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9CQkJCS8qIHN3aXRjaCBvbiBjaGFyICovCi0gIHJldHVybiAoYyk7Ci19CQkJCS8qIG5leHRfY2hhcl9vZl9zdHJpbmcoKSAqLwotDAotc3RhdGljIHNlZ1QKLWdldF9zZWdtZW50ZWRfZXhwcmVzc2lvbiAoZXhwUCkKLSAgICAgcmVnaXN0ZXIgZXhwcmVzc2lvblMgKmV4cFA7Ci17Ci0gIHJlZ2lzdGVyIHNlZ1QgcmV0dmFsOwotCi0gIHJldHZhbCA9IGV4cHJlc3Npb24gKGV4cFApOwotICBpZiAoZXhwUC0+WF9vcCA9PSBPX2lsbGVnYWwKLSAgICAgIHx8IGV4cFAtPlhfb3AgPT0gT19hYnNlbnQKLSAgICAgIHx8IGV4cFAtPlhfb3AgPT0gT19iaWcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJleHBlY3RlZCBhZGRyZXNzIGV4cHJlc3Npb247IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGV4cFAtPlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwUC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIHJldHZhbCA9IGFic29sdXRlX3NlY3Rpb247Ci0gICAgfQotICByZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgc2VnVCAKLWdldF9rbm93bl9zZWdtZW50ZWRfZXhwcmVzc2lvbiAoZXhwUCkKLSAgICAgcmVnaXN0ZXIgZXhwcmVzc2lvblMgKmV4cFA7Ci17Ci0gIHJlZ2lzdGVyIHNlZ1QgcmV0dmFsOwotCi0gIGlmICgocmV0dmFsID0gZ2V0X3NlZ21lbnRlZF9leHByZXNzaW9uIChleHBQKSkgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0gICAgewotICAgICAgLyogVGhlcmUgaXMgbm8gZWFzeSB3YXkgdG8gZXh0cmFjdCB0aGUgdW5kZWZpbmVkIHN5bWJvbCBmcm9tIHRoZQotCSBleHByZXNzaW9uLiAgKi8KLSAgICAgIGlmIChleHBQLT5YX2FkZF9zeW1ib2wgIT0gTlVMTAotCSAgJiYgU19HRVRfU0VHTUVOVCAoZXhwUC0+WF9hZGRfc3ltYm9sKSAhPSBleHByX3NlY3Rpb24pCi0JYXNfd2FybiAoXygic3ltYm9sIFwiJXNcIiB1bmRlZmluZWQ7IHplcm8gYXNzdW1lZCIpLAotCQkgU19HRVRfTkFNRSAoZXhwUC0+WF9hZGRfc3ltYm9sKSk7Ci0gICAgICBlbHNlCi0JYXNfd2FybiAoXygic29tZSBzeW1ib2wgdW5kZWZpbmVkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICByZXR2YWwgPSBhYnNvbHV0ZV9zZWN0aW9uOwotICAgICAgZXhwUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHBQLT5YX2FkZF9udW1iZXIgPSAwOwotICAgIH0KLSAga25vdyAocmV0dmFsID09IGFic29sdXRlX3NlY3Rpb24gfHwgU0VHX05PUk1BTCAocmV0dmFsKSk7Ci0gIHJldHVybiAocmV0dmFsKTsKLX0JCQkJLyogZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uKCkgKi8KLQotb2Zmc2V0VAotZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotCi0gIGV4cHJlc3Npb24gKCZleHApOwotICBpZiAoZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBpZiAoZXhwLlhfb3AgIT0gT19hYnNlbnQpCi0JYXNfYmFkIChfKCJiYWQgb3IgaXJyZWR1Y2libGUgYWJzb2x1dGUgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIikpOwotICAgICAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gICAgfQotICByZXR1cm4gZXhwLlhfYWRkX251bWJlcjsKLX0KLQotY2hhcgkJCQkvKiByZXR1cm4gdGVybWluYXRvciAqLwotZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKHZhbF9wb2ludGVyKQotICAgICBsb25nICp2YWxfcG9pbnRlcjsJCS8qIHJldHVybiB2YWx1ZSBvZiBleHByZXNzaW9uICovCi17Ci0gIC8qIEZJWE1FOiB2YWxfcG9pbnRlciBzaG91bGQgcHJvYmFibHkgYmUgb2Zmc2V0VCAqLiAgKi8KLSAgKnZhbF9wb2ludGVyID0gKGxvbmcpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICByZXR1cm4gKCppbnB1dF9saW5lX3BvaW50ZXIrKyk7Ci19Ci0MCi0vKgotICoJCQlkZW1hbmRfY29weV9DX3N0cmluZygpCi0gKgotICogTGlrZSBkZW1hbmRfY29weV9zdHJpbmcsIGJ1dCByZXR1cm4gTlVMTCBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGFueSAnXDAncy4KLSAqIEdpdmUgYSB3YXJuaW5nIGlmIHRoYXQgaGFwcGVucy4KLSAqLwotY2hhciAqCi1kZW1hbmRfY29weV9DX3N0cmluZyAobGVuX3BvaW50ZXIpCi0gICAgIGludCAqbGVuX3BvaW50ZXI7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnM7Ci0KLSAgaWYgKChzID0gZGVtYW5kX2NvcHlfc3RyaW5nIChsZW5fcG9pbnRlcikpICE9IDApCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IGxlbjsKLQotICAgICAgZm9yIChsZW4gPSAqbGVuX3BvaW50ZXI7IGxlbiA+IDA7IGxlbi0tKQotCXsKLQkgIGlmICgqcyA9PSAwKQotCSAgICB7Ci0JICAgICAgcyA9IDA7Ci0JICAgICAgbGVuID0gMTsKLQkgICAgICAqbGVuX3BvaW50ZXIgPSAwOwotCSAgICAgIGFzX2JhZCAoXygiVGhpcyBzdHJpbmcgbWF5IG5vdCBjb250YWluIFwnXFwwXCciKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gczsKLX0KLQwKLS8qCi0gKgkJCWRlbWFuZF9jb3B5X3N0cmluZygpCi0gKgotICogRGVtYW5kIHN0cmluZywgYnV0IHJldHVybiBhIHNhZmUgKD1wcml2YXRlKSBjb3B5IG9mIHRoZSBzdHJpbmcuCi0gKiBSZXR1cm4gTlVMTCBpZiB3ZSBjYW4ndCByZWFkIGEgc3RyaW5nIGhlcmUuCi0gKi8KLWNoYXIgKgotZGVtYW5kX2NvcHlfc3RyaW5nIChsZW5QKQotICAgICBpbnQgKmxlblA7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBjOwotICByZWdpc3RlciBpbnQgbGVuOwotICBjaGFyICpyZXR2YWw7Ci0KLSAgbGVuID0gMDsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCInKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwkvKiBTa2lwIG9wZW5pbmcgcXVvdGUuICovCi0KLSAgICAgIHdoaWxlIChpc19hX2NoYXIgKGMgPSBuZXh0X2NoYXJfb2Zfc3RyaW5nICgpKSkKLQl7Ci0JICBvYnN0YWNrXzFncm93ICgmbm90ZXMsIGMpOwotCSAgbGVuKys7Ci0JfQotICAgICAgLyogSkYgdGhpcyBuZXh0IGxpbmUgaXMgc28gZGVtYW5kX2NvcHlfQ19zdHJpbmcgd2lsbCByZXR1cm4gYQotCSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nLiAqLwotICAgICAgb2JzdGFja18xZ3JvdyAoJm5vdGVzLCAnXDAnKTsKLSAgICAgIHJldHZhbCA9IG9ic3RhY2tfZmluaXNoICgmbm90ZXMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIk1pc3Npbmcgc3RyaW5nIikpOwotICAgICAgcmV0dmFsID0gTlVMTDsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotICAqbGVuUCA9IGxlbjsKLSAgcmV0dXJuIChyZXR2YWwpOwotfQkJCQkvKiBkZW1hbmRfY29weV9zdHJpbmcoKSAqLwotDAotLyoKLSAqCQlpc19pdF9lbmRfb2Zfc3RhdGVtZW50KCkKLSAqCi0gKiBJbjoJSW5wdXRfbGluZV9wb2ludGVyLT5uZXh0IGNoYXJhY3Rlci4KLSAqCi0gKiBEbzoJU2tpcCBpbnB1dF9saW5lX3BvaW50ZXIgb3ZlciBhbGwgd2hpdGVzcGFjZS4KLSAqCi0gKiBPdXQ6CTEgaWYgaW5wdXRfbGluZV9wb2ludGVyLT5lbmQtb2YtbGluZS4KLSovCi1pbnQgCi1pc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpCi17Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgcmV0dXJuIChpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pOwotfQkJCQkvKiBpc19pdF9lbmRfb2Zfc3RhdGVtZW50KCkgKi8KLQotdm9pZCAKLWVxdWFscyAoc3ltX25hbWUsIHJlYXNzaWduKQotICAgICBjaGFyICpzeW1fbmFtZTsKLSAgICAgaW50IHJlYXNzaWduOwotewotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwkvKiBzeW1ib2wgd2UgYXJlIHdvcmtpbmcgd2l0aCAqLwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJz0nKQotICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCi0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcgJyB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICdcdCcpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBpZiAoc3ltX25hbWVbMF0gPT0gJy4nICYmIHN5bV9uYW1lWzFdID09ICdcMCcpCi0gICAgewotICAgICAgLyogVHVybiAnLiA9IG11bWJsZScgaW50byBhIC5vcmcgbXVtYmxlICovCi0gICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnQ7Ci0gICAgICBleHByZXNzaW9uUyBleHA7Ci0KLSAgICAgIHNlZ21lbnQgPSBnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24gKCZleHApOwotICAgICAgaWYgKCFuZWVkX3Bhc3NfMikKLQlkb19vcmcgKHNlZ21lbnQsICZleHAsIDApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChzeW1fbmFtZSk7Ci0gICAgICAvKiBQZXJtaXQgcmVnaXN0ZXIgbmFtZXMgdG8gYmUgcmVkZWZpbmVkLiAgKi8KLSAgICAgIGlmICghIHJlYXNzaWduCi0JICAmJiBTX0lTX0RFRklORUQgKHN5bWJvbFApCi0JICAmJiBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSAhPSByZWdfc2VjdGlvbikKLQlhc19iYWQgKF8oInN5bWJvbCBgJXMnIGFscmVhZHkgZGVmaW5lZCIpLCBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0gICAgICBwc2V1ZG9fc2V0IChzeW1ib2xQKTsKLSAgICB9Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgICB7Ci0gICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsgLyogY2hlY2sgZ2FyYmFnZSBhZnRlciB0aGUgZXhwcmVzc2lvbiAqLwotICAgICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotICAgICB9Ci19CQkJCS8qIGVxdWFscygpICovCi0KLS8qIC5pbmNsdWRlIC0tIGluY2x1ZGUgYSBmaWxlIGF0IHRoaXMgcG9pbnQuICovCi0KLS8qIEFSR1NVU0VEICovCi12b2lkIAotc19pbmNsdWRlIChhcmcpCi0gICAgIGludCBhcmc7Ci17Ci0gIGNoYXIgKm5ld2J1ZjsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIGludCBpOwotICBGSUxFICp0cnk7Ci0gIGNoYXIgKnBhdGg7Ci0KLSAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLSAgICB7Ci0gICAgICBmaWxlbmFtZSA9IGRlbWFuZF9jb3B5X3N0cmluZyAoJmkpOwotICAgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpCi0JewotCSAgLyogZGVtYW5kX2NvcHlfc3RyaW5nIGhhcyBhbHJlYWR5IHByaW50ZWQgYW4gZXJyb3IgYW5kCi0gICAgICAgICAgICAgY2FsbGVkIGlnbm9yZV9yZXN0X29mX2xpbmUuICAqLwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpID0gMDsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXQotCSAgICAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnICcKLQkgICAgICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1x0JykKLQl7Ci0JICBvYnN0YWNrXzFncm93ICgmbm90ZXMsICppbnB1dF9saW5lX3BvaW50ZXIpOwotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICArK2k7Ci0JfQotICAgICAgb2JzdGFja18xZ3JvdyAoJm5vdGVzLCAnXDAnKTsKLSAgICAgIGZpbGVuYW1lID0gb2JzdGFja19maW5pc2ggKCZub3Rlcyk7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBwYXRoID0geG1hbGxvYyAoKHVuc2lnbmVkIGxvbmcpIGkgKyBpbmNsdWRlX2Rpcl9tYXhsZW4gKyA1IC8qIHNsb3AgKi8gKTsKLSAgZm9yIChpID0gMDsgaSA8IGluY2x1ZGVfZGlyX2NvdW50OyBpKyspCi0gICAgewotICAgICAgc3RyY3B5IChwYXRoLCBpbmNsdWRlX2RpcnNbaV0pOwotICAgICAgc3RyY2F0IChwYXRoLCAiLyIpOwotICAgICAgc3RyY2F0IChwYXRoLCBmaWxlbmFtZSk7Ci0gICAgICBpZiAoMCAhPSAodHJ5ID0gZm9wZW4gKHBhdGgsICJyIikpKQotCXsKLQkgIGZjbG9zZSAodHJ5KTsKLQkgIGdvdG8gZ290aXQ7Ci0JfQotICAgIH0KLSAgZnJlZSAocGF0aCk7Ci0gIHBhdGggPSBmaWxlbmFtZTsKLWdvdGl0OgotICAvKiBtYWxsb2MgU3RvcmFnZSBsZWFrIHdoZW4gZmlsZSBpcyBmb3VuZCBvbiBwYXRoLiAgRklYTUUtU09NRURBWS4gKi8KLSAgcmVnaXN0ZXJfZGVwZW5kZW5jeSAocGF0aCk7Ci0gIG5ld2J1ZiA9IGlucHV0X3NjcnViX2luY2x1ZGVfZmlsZSAocGF0aCwgaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgYnVmZmVyX2xpbWl0ID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIpOwotfQkJCQkvKiBzX2luY2x1ZGUoKSAqLwotCi12b2lkIAotYWRkX2luY2x1ZGVfZGlyIChwYXRoKQotICAgICBjaGFyICpwYXRoOwotewotICBpbnQgaTsKLQotICBpZiAoaW5jbHVkZV9kaXJfY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBpbmNsdWRlX2RpcnMgPSAoY2hhciAqKikgeG1hbGxvYyAoMiAqIHNpemVvZiAoKmluY2x1ZGVfZGlycykpOwotICAgICAgaW5jbHVkZV9kaXJzWzBdID0gIi4iOwkvKiBDdXJyZW50IGRpciAqLwotICAgICAgaW5jbHVkZV9kaXJfY291bnQgPSAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGluY2x1ZGVfZGlyX2NvdW50Kys7Ci0gICAgICBpbmNsdWRlX2RpcnMgPSAoY2hhciAqKikgcmVhbGxvYyAoaW5jbHVkZV9kaXJzLAotCQkJCWluY2x1ZGVfZGlyX2NvdW50ICogc2l6ZW9mICgqaW5jbHVkZV9kaXJzKSk7Ci0gICAgfQotCi0gIGluY2x1ZGVfZGlyc1tpbmNsdWRlX2Rpcl9jb3VudCAtIDFdID0gcGF0aDsJLyogTmV3IG9uZSAqLwotCi0gIGkgPSBzdHJsZW4gKHBhdGgpOwotICBpZiAoaSA+IGluY2x1ZGVfZGlyX21heGxlbikKLSAgICBpbmNsdWRlX2Rpcl9tYXhsZW4gPSBpOwotfQkJCQkvKiBhZGRfaW5jbHVkZV9kaXIoKSAqLwotDAotLyogT3V0cHV0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBkZW5vdGUgdGhlIHNvdXJjZSBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdlbmVyYXRlX2ZpbGVfZGVidWcgKCkKLXsKLSAgaWYgKGRlYnVnX3R5cGUgPT0gREVCVUdfU1RBQlMpCi0gICAgc3RhYnNfZ2VuZXJhdGVfYXNtX2ZpbGUgKCk7Ci19Ci0KLS8qIE91dHB1dCBsaW5lIG51bWJlciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IHNvdXJjZSBsaW5lLiAgKi8KLQotdm9pZAotZ2VuZXJhdGVfbGluZW5vX2RlYnVnICgpCi17Ci0jaWZkZWYgRUNPRkZfREVCVUdHSU5HCi0gIC8qIEVDT0ZGIGFzc2VtYmxlcnMgYXV0b21hdGljYWxseSBnZW5lcmF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uIAotICAgICBGSVhNRTogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgaGFuZGxlZCBlbHNld2hlcmUuICAqLwotICBpZiAoZGVidWdfdHlwZSA9PSBERUJVR19VTlNQRUNJRklFRCkKLSAgICB7Ci0gICAgICBpZiAoRUNPRkZfREVCVUdHSU5HICYmIGVjb2ZmX25vX2N1cnJlbnRfZmlsZSAoKSkKLSAgICAgICAgZGVidWdfdHlwZSA9IERFQlVHX0VDT0ZGOwotICAgICAgZWxzZQotCWRlYnVnX3R5cGUgPSBERUJVR19OT05FOwotICAgIH0KLSNlbmRpZgotCi0gIHN3aXRjaCAoZGVidWdfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBERUJVR19VTlNQRUNJRklFRDoKLSAgICBjYXNlIERFQlVHX05PTkU6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX1NUQUJTOgotICAgICAgc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfRUNPRkY6Ci0gICAgICBlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vICgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19EV0FSRjoKLSAgICBjYXNlIERFQlVHX0RXQVJGMjoKLSAgICAgIC8qIEZJWE1FLiAgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogT3V0cHV0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBtYXJrIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQgb3IgZW5kIHBvaW50LgotICAgRU5EX1AgaXMgemVybyBmb3IgLmZ1bmMsIGFuZCBub24temVybyBmb3IgLmVuZGZ1bmMuICAqLwotCi12b2lkCi1zX2Z1bmMgKGVuZF9wKQotICAgICBpbnQgZW5kX3A7Ci17Ci0gIGRvX3NfZnVuYyAoZW5kX3AsIE5VTEwpOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIHNfZnVuYyBzbyB0YXJnZXRzIGNhbiBjaG9vc2UgYSBkaWZmZXJlbnQgZGVmYXVsdCBwcmVmaXguCi0gICBJZiBERUZBVUxUX1BSRUZJWCBpcyBOVUxMLCB1c2UgdGhlIHRhcmdldCdzICJsZWFkaW5nIGNoYXIiLiAgKi8KLQotdm9pZAotZG9fc19mdW5jIChlbmRfcCwgZGVmYXVsdF9wcmVmaXgpCi0gICAgIGludCBlbmRfcDsKLSAgICAgY29uc3QgY2hhciAqZGVmYXVsdF9wcmVmaXg7Ci17Ci0gIC8qIFJlY29yZCB0aGUgY3VycmVudCBmdW5jdGlvbiBzbyB0aGF0IHdlIGNhbiBpc3N1ZSBhbiBlcnJvciBtZXNzYWdlIGZvcgotICAgICBtaXNwbGFjZWQgLmZ1bmMsLmVuZGZ1bmMsIGFuZCBhbHNvIHNvIHRoYXQgLmVuZGZ1bmMgbmVlZHMgbm8KLSAgICAgYXJndW1lbnRzLiAgKi8KLSAgc3RhdGljIGNoYXIgKmN1cnJlbnRfbmFtZTsKLSAgc3RhdGljIGNoYXIgKmN1cnJlbnRfbGFiZWw7Ci0KLSAgaWYgKGVuZF9wKQotICAgIHsKLSAgICAgIGlmIChjdXJyZW50X25hbWUgPT0gTlVMTCkKLQl7Ci0JICBhc19iYWQgKF8oIm1pc3NpbmcgLmZ1bmMiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGRlYnVnX3R5cGUgPT0gREVCVUdfU1RBQlMpCi0Jc3RhYnNfZ2VuZXJhdGVfYXNtX2VuZGZ1bmMgKGN1cnJlbnRfbmFtZSwgY3VycmVudF9sYWJlbCk7Ci0KLSAgICAgIGN1cnJlbnRfbmFtZSA9IGN1cnJlbnRfbGFiZWwgPSBOVUxMOwotICAgIH0KLSAgZWxzZSAvKiAhIGVuZF9wICovCi0gICAgewotICAgICAgY2hhciAqbmFtZSwqbGFiZWw7Ci0gICAgICBjaGFyIGRlbGltMSxkZWxpbTI7Ci0KLSAgICAgIGlmIChjdXJyZW50X25hbWUgIT0gTlVMTCkKLQl7Ci0JICBhc19iYWQgKF8oIi5lbmRmdW5jIG1pc3NpbmcgZm9yIHByZXZpb3VzIC5mdW5jIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZWxpbTEgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIG5hbWUgPSB4c3RyZHVwIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBkZWxpbTE7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0JewotCSAgaWYgKGRlZmF1bHRfcHJlZml4KQotCSAgICBhc3ByaW50ZiAoJmxhYmVsLCAiJXMlcyIsIGRlZmF1bHRfcHJlZml4LCBuYW1lKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgbGVhZGluZ19jaGFyID0gMDsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICAgICAgbGVhZGluZ19jaGFyID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChzdGRvdXRwdXQpOwotI2VuZGlmCi0JICAgICAgLyogTWlzc2luZyBlbnRyeSBwb2ludCwgdXNlIGZ1bmN0aW9uJ3MgbmFtZSB3aXRoIHRoZSBsZWFkaW5nCi0JCSBjaGFyIHByZXBlbmRlZC4gICovCi0JICAgICAgaWYgKGxlYWRpbmdfY2hhcikKLQkJYXNwcmludGYgKCZsYWJlbCwgIiVjJXMiLCBsZWFkaW5nX2NoYXIsIG5hbWUpOwotCSAgICAgIGVsc2UKLQkJbGFiZWwgPSBuYW1lOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgbGFiZWwgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBkZWxpbTIgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgIGxhYmVsID0geHN0cmR1cCAobGFiZWwpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGRlbGltMjsKLQl9Ci0KLSAgICAgIGlmIChkZWJ1Z190eXBlID09IERFQlVHX1NUQUJTKQotCXN0YWJzX2dlbmVyYXRlX2FzbV9mdW5jIChuYW1lLCBsYWJlbCk7Ci0KLSAgICAgIGN1cnJlbnRfbmFtZSA9IG5hbWU7Ci0gICAgICBjdXJyZW50X2xhYmVsID0gbGFiZWw7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi12b2lkIAotc19pZ25vcmUgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgd2hpbGUgKCFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLX0KLQotCi12b2lkCi1yZWFkX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUpCi0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGhhc2hfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSwgInBzZXVkby1vcCB0YWJsZSIsIHBvX2hhc2gpOwotfQotCi0vKiBlbmQgb2YgcmVhZC5jICovCmRpZmYgLS1naXQgYS9nYXMvcmVhZC5oIGIvZ2FzL3JlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlMjAxNy4uMDAwMDAwMAotLS0gYS9nYXMvcmVhZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qIHJlYWQuaCAtIG9mIHJlYWQuYwotICAgQ29weXJpZ2h0IChDKSAxOTg2LCA5MCwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1leHRlcm4gY2hhciAqaW5wdXRfbGluZV9wb2ludGVyOy8qIC0+IGNoYXIgd2UgYXJlIHBhcnNpbmcgbm93LiAqLwotCi0jZGVmaW5lIFBFUk1JVF9XSElURVNQQUNFCS8qIERlZmluZSB0byBtYWtlIHdoaXRlc3BhY2UgYmUgYWxsb3dlZCBpbiAqLwotLyogbWFueSBzeW50YWN0aWNhbGx5IHVubmVjZXNzYXJ5IHBsYWNlcy4gKi8KLS8qIE5vcm1hbGx5IHVuZGVmaW5lZC4gRm9yIGNvbXBhdGliaWxpdHkgKi8KLS8qIHdpdGggYW5jaWVudCBHTlUgY2MuICovCi0vKiAjdW5kZWYgUEVSTUlUX1dISVRFU1BBQ0UgKi8KLQotI2lmZGVmIFBFUk1JVF9XSElURVNQQUNFCi0jZGVmaW5lIFNLSVBfV0hJVEVTUEFDRSgpIHtpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJyAnKSArKyBpbnB1dF9saW5lX3BvaW50ZXI7fQotI2Vsc2UKLSNkZWZpbmUgU0tJUF9XSElURVNQQUNFKCkga25vdygqaW5wdXRfbGluZV9wb2ludGVyICE9ICcgJyApCi0jZW5kaWYKLQotCi0jZGVmaW5lCUxFWF9OQU1FCSgxKQkvKiBtYXkgY29udGludWUgYSBuYW1lICovCi0jZGVmaW5lIExFWF9CRUdJTl9OQU1FCSgyKQkvKiBtYXkgYmVnaW4gYSBuYW1lICovCi0KLSNkZWZpbmUgaXNfbmFtZV9iZWdpbm5lcihjKSBcCi0gICggbGV4X3R5cGVbKHVuc2lnbmVkIGNoYXIpIChjKV0gJiBMRVhfQkVHSU5fTkFNRSApCi0jZGVmaW5lIGlzX3BhcnRfb2ZfbmFtZShjKSBcCi0gICggbGV4X3R5cGVbKHVuc2lnbmVkIGNoYXIpIChjKV0gJiBMRVhfTkFNRSAgICAgICApCi0KLSNpZm5kZWYgaXNfYV9jaGFyCi0jZGVmaW5lIENIQVJfTUFTSwkoMHhmZikKLSNkZWZpbmUgTk9UX0FfQ0hBUgkoQ0hBUl9NQVNLKzEpCi0jZGVmaW5lIGlzX2FfY2hhcihjKQkoKCh1bnNpZ25lZCkoYykpIDw9IENIQVJfTUFTSykKLSNlbmRpZiAvKiBpc19hX2NoYXIoKSAqLwotCi1leHRlcm4gY2hhciBsZXhfdHlwZVtdOwotZXh0ZXJuIGNoYXIgaXNfZW5kX29mX2xpbmVbXTsKLQotZXh0ZXJuIGludCBpc19pdF9lbmRfb2Zfc3RhdGVtZW50IFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIGludCB0YXJnZXRfYmlnX2VuZGlhbjsKLQotLyogVGhlc2UgYXJlIGluaXRpYWxpemVkIGJ5IHRoZSBDUFUgc3BlY2lmaWMgdGFyZ2V0IGZpbGVzICh0Yy0qLmMpLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXTsKLWV4dGVybiBjb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdOwotZXh0ZXJuIGNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXTsKLQotLyogVGFibGUgb2YgLUkgZGlyZWN0b3JpZXMuICAqLwotZXh0ZXJuIGNoYXIgKippbmNsdWRlX2RpcnM7Ci1leHRlcm4gaW50IGluY2x1ZGVfZGlyX2NvdW50OwotZXh0ZXJuIGludCBpbmNsdWRlX2Rpcl9tYXhsZW47Ci0KLS8qIFRoZSBvZmZzZXQgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24uICAqLwotZXh0ZXJuIGFkZHJlc3NUIGFic19zZWN0aW9uX29mZnNldDsKLQotLyogVGhlIGxhYmVsIG9uIGEgbGluZSwgdXNlZCBieSBzb21lIG9mIHRoZSBwc2V1ZG8tb3BzLiAgKi8KLWV4dGVybiBzeW1ib2xTICpsaW5lX2xhYmVsOwotCi0vKiBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydCBNUkkgY29tbW9uIHNlY3Rpb25zLiAgKi8KLWV4dGVybiBzeW1ib2xTICptcmlfY29tbW9uX3N5bWJvbDsKLQotLyogUG9zc2libGUgYXJndW1lbnRzIHRvIC5saW5rb25jZS4gICovCi1lbnVtIGxpbmtvbmNlX3R5cGUKLXsKLSAgTElOS09OQ0VfVU5TRVQgPSAwLAotICBMSU5LT05DRV9ESVNDQVJELAotICBMSU5LT05DRV9PTkVfT05MWSwKLSAgTElOS09OQ0VfU0FNRV9TSVpFLAotICBMSU5LT05DRV9TQU1FX0NPTlRFTlRTCi19OwotCi1leHRlcm4gdm9pZCBwb3BfaW5zZXJ0IFBBUkFNUyAoKGNvbnN0IHBzZXVkb190eXBlUyAqKSk7Ci1leHRlcm4gdW5zaWduZWQgaW50IGdldF9zdGFiX3N0cmluZ19vZmZzZXQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpzdGFic3RyX3NlY25hbWUpKTsKLWV4dGVybiBjaGFyICpkZW1hbmRfY29weV9DX3N0cmluZyBQQVJBTVMgKChpbnQgKmxlbl9wb2ludGVyKSk7Ci1leHRlcm4gY2hhciBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvcgotICBQQVJBTVMgKChsb25nICp2YWxfcG9pbnRlcikpOwotZXh0ZXJuIG9mZnNldFQgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBuZXh0X2NoYXJfb2Zfc3RyaW5nIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHNfbXJpX3NlY3QgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gY2hhciAqbXJpX2NvbW1lbnRfZmllbGQgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBtcmlfY29tbWVudF9lbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIGFkZF9pbmNsdWRlX2RpciBQQVJBTVMgKChjaGFyICpwYXRoKSk7Ci1leHRlcm4gdm9pZCBjb25zIFBBUkFNUyAoKGludCBuYnl0ZXMpKTsKLWV4dGVybiB2b2lkIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgZW1pdF9leHByIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHAsIHVuc2lnbmVkIGludCBuYnl0ZXMpKTsKLWV4dGVybiB2b2lkIGVtaXRfbGViMTI4X2V4cHIgUEFSQU1TICgoZXhwcmVzc2lvblMgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBlcXVhbHMgUEFSQU1TICgoY2hhciAqc3ltX25hbWUsIGludCByZWFzc2lnbikpOwotZXh0ZXJuIHZvaWQgZmxvYXRfY29ucyBQQVJBTVMgKChpbnQgZmxvYXRfdHlwZSkpOwotZXh0ZXJuIHZvaWQgaWdub3JlX3Jlc3Rfb2ZfbGluZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBkaXNjYXJkX3Jlc3Rfb2ZfbGluZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gaW50IG91dHB1dF9sZWIxMjggUEFSQU1TICgoY2hhciAqLCB2YWx1ZVQsIGludCBzaWduKSk7Ci1leHRlcm4gdm9pZCBwc2V1ZG9fc2V0IFBBUkFNUyAoKHN5bWJvbFMgKiBzeW1ib2xQKSk7Ci1leHRlcm4gdm9pZCByZWFkX2Ffc291cmNlX2ZpbGUgUEFSQU1TICgoY2hhciAqbmFtZSkpOwotZXh0ZXJuIHZvaWQgcmVhZF9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCByZWFkX3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoRklMRSAqKSk7Ci1leHRlcm4gaW50IHNpemVvZl9sZWIxMjggUEFSQU1TICgodmFsdWVULCBpbnQgc2lnbikpOwotZXh0ZXJuIHZvaWQgc3RhYnNfZ2VuZXJhdGVfYXNtX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBzdGFic19nZW5lcmF0ZV9hc21fZnVuYyBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgc3RhYnNfZ2VuZXJhdGVfYXNtX2VuZGZ1bmMgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQotZXh0ZXJuIHZvaWQgZ2VuZXJhdGVfbGluZW5vX2RlYnVnIFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIHZvaWQgc19hYm9ydCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfYWxpZ25fYnl0ZXMgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19hbGlnbl9wdHdvIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19hcHBfZmlsZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfYXBwX2xpbmUgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2NvbW0gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2RhdGEgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2Rlc2MgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2Vsc2UgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19lbmQgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19lbmRpZiBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2VyciBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfZmFpbCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfZmlsbCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfZmxvYXRfc3BhY2UgUEFSQU1TICgoaW50IG11bHQpKTsKLWV4dGVybiB2b2lkIHNfZnVuYyBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGRvX3NfZnVuYyBQQVJBTVMgKChpbnQsIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgc19nbG9ibCBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2lmIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfaWZjIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfaWZkZWYgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19pZmVxcyBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2lnbm9yZSBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2luY2x1ZGUgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19pcnAgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19sY29tbSBQQVJBTVMgKChpbnQgbmVlZHNfYWxpZ24pKTsKLWV4dGVybiB2b2lkIHNfbGNvbW1fYnl0ZXMgUEFSQU1TICgoaW50IG5lZWRzX2FsaWduKSk7Ci1leHRlcm4gdm9pZCBzX2xlYjEyOCBQQVJBTVMgKChpbnQgc2lnbikpOwotZXh0ZXJuIHZvaWQgc19saW5rb25jZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfbHN5bSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfbWFjcm8gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX21leGl0IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19tcmkgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX21yaV9jb21tb24gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX29yZyBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfcHJpbnQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX3B1cmdlbSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfcmVwdCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfc2V0IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19zcGFjZSBQQVJBTVMgKChpbnQgbXVsdCkpOwotZXh0ZXJuIHZvaWQgc19zdGFiIFBBUkFNUyAoKGludCB3aGF0KSk7Ci1leHRlcm4gdm9pZCBzX3N0cnVjdCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfdGV4dCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHN0cmluZ2VyIFBBUkFNUyAoKGludCBhcHBlbmRfemVybykpOwotZXh0ZXJuIHZvaWQgc194c3RhYiBQQVJBTVMgKChpbnQgd2hhdCkpOwotZXh0ZXJuIHZvaWQgc19ydmEgUEFSQU1TICgoaW50KSk7Ci0KLS8qIGVuZCBvZiByZWFkLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9zYi5jIGIvZ2FzL3NiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYzIzZmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3NiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyogc2IuYyAtIHN0cmluZyBidWZmZXIgbWFuaXB1bGF0aW9uIHJvdXRpbmVzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgU3RldmUgYW5kIEp1ZHkgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQsCi0gICAgICBzYWNAY3lnbnVzLmNvbQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAic2IuaCIKLQotLyogVGhlc2Ugcm91dGluZXMgYXJlIGFib3V0IG1hbmlwdWxhdGluZyBzdHJpbmdzLgotCi0gICBUaGV5IGFyZSBtYW5hZ2VkIGluIHRoaW5ncyBjYWxsZWQgYHNiJ3Mgd2hpY2ggaXMgYW4gYWJicmV2aWF0aW9uCi0gICBmb3Igc3RyaW5nIGJ1ZmZlcnMuICBBbiBzYiBoYXMgdG8gYmUgY3JlYXRlZCwgdGhpbmdzIGNhbiBiZSBnbHVlZAotICAgb24gdG8gaXQsIGFuZCBhdCB0aGUgZW5kIG9mIGl0J3MgbGlmZSBpdCBzaG91bGQgYmUgZnJlZWQuICBUaGUKLSAgIGNvbnRlbnRzIHNob3VsZCBuZXZlciBiZSBwb2ludGVkIGF0IHdoaWxzdCBpdCBpcyBzdGlsbCBncm93aW5nLAotICAgc2luY2UgaXQgY291bGQgYmUgbW92ZWQgYXQgYW55IHRpbWUKLQotICAgZWc6Ci0gICBzYl9uZXcgKCZmb28pOwotICAgc2JfZ3Jvdy4uLiAoJmZvbywuLi4pOwotICAgdXNlIGZvby0+cHRyWypdOwotICAgc2Jfa2lsbCAoJmZvbyk7Ci0KLSovCi0KLSNkZWZpbmUgZHNpemUgNQotCi1zdGF0aWMgdm9pZCBzYl9jaGVjayBQQVJBTVMgKChzYiAqLCBpbnQpKTsKLQotLyogU3RhdGlzdGljcyBvZiBzYiBzdHJ1Y3R1cmVzLiAgKi8KLQotaW50IHN0cmluZ19jb3VudFtzYl9tYXhfcG93ZXJfdHdvXTsKLQotLyogRnJlZSBsaXN0IG9mIHNiIHN0cnVjdHVyZXMuICAqLwotCi1zdGF0aWMgc2JfbGlzdF92ZWN0b3IgZnJlZV9saXN0OwotCi0vKiBpbml0aWFsaXplcyBhbiBzYi4gKi8KLQotdm9pZAotc2JfYnVpbGQgKHB0ciwgc2l6ZSkKLSAgICAgc2IgKnB0cjsKLSAgICAgaW50IHNpemU7Ci17Ci0gIC8qIHNlZSBpZiB3ZSBjYW4gZmluZCBvbmUgdG8gYWxsb2NhdGUgKi8KLSAgc2JfZWxlbWVudCAqZTsKLQotICBpZiAoc2l6ZSA+IHNiX21heF9wb3dlcl90d28pCi0gICAgYWJvcnQgKCk7Ci0KLSAgZSA9IGZyZWVfbGlzdC5zaXplW3NpemVdOwotICBpZiAoIWUpCi0gICAgewotICAgICAgLyogbm90aGluZyB0aGVyZSwgYWxsb2NhdGUgb25lIGFuZCBzdGljayBpbnRvIHRoZSBmcmVlIGxpc3QgKi8KLSAgICAgIGUgPSAoc2JfZWxlbWVudCAqKSB4bWFsbG9jIChzaXplb2YgKHNiX2VsZW1lbnQpICsgKDEgPDwgc2l6ZSkpOwotICAgICAgZS0+bmV4dCA9IGZyZWVfbGlzdC5zaXplW3NpemVdOwotICAgICAgZS0+c2l6ZSA9IDEgPDwgc2l6ZTsKLSAgICAgIGZyZWVfbGlzdC5zaXplW3NpemVdID0gZTsKLSAgICAgIHN0cmluZ19jb3VudFtzaXplXSsrOwotICAgIH0KLQotICAvKiByZW1vdmUgZnJvbSBmcmVlIGxpc3QgKi8KLQotICBmcmVlX2xpc3Quc2l6ZVtzaXplXSA9IGUtPm5leHQ7Ci0KLSAgLyogY29weSBpbnRvIGNhbGxlcnMgd29ybGQgKi8KLSAgcHRyLT5wdHIgPSBlLT5kYXRhOwotICBwdHItPnBvdCA9IHNpemU7Ci0gIHB0ci0+bGVuID0gMDsKLSAgcHRyLT5pdGVtID0gZTsKLX0KLQotCi12b2lkCi1zYl9uZXcgKHB0cikKLSAgICAgc2IgKnB0cjsKLXsKLSAgc2JfYnVpbGQgKHB0ciwgZHNpemUpOwotfQotCi0vKiBkZWFsbG9jYXRlIHRoZSBzYiBhdCBwdHIgKi8KLQotdm9pZAotc2Jfa2lsbCAocHRyKQotICAgICBzYiAqcHRyOwotewotICAvKiByZXR1cm4gaXRlbSB0byBmcmVlIGxpc3QgKi8KLSAgcHRyLT5pdGVtLT5uZXh0ID0gZnJlZV9saXN0LnNpemVbcHRyLT5wb3RdOwotICBmcmVlX2xpc3Quc2l6ZVtwdHItPnBvdF0gPSBwdHItPml0ZW07Ci19Ci0KLS8qIGFkZCB0aGUgc2IgYXQgcyB0byB0aGUgZW5kIG9mIHRoZSBzYiBhdCBwdHIgKi8KLQotdm9pZAotc2JfYWRkX3NiIChwdHIsIHMpCi0gICAgIHNiICpwdHI7Ci0gICAgIHNiICpzOwotewotICBzYl9jaGVjayAocHRyLCBzLT5sZW4pOwotICBtZW1jcHkgKHB0ci0+cHRyICsgcHRyLT5sZW4sIHMtPnB0ciwgcy0+bGVuKTsKLSAgcHRyLT5sZW4gKz0gcy0+bGVuOwotfQotCi0vKiBtYWtlIHN1cmUgdGhhdCB0aGUgc2IgYXQgcHRyIGhhcyByb29tIGZvciBhbm90aGVyIGxlbiBjaGFyYWN0ZXJzLAotICAgYW5kIGdyb3cgaXQgaWYgaXQgZG9lc24ndC4gKi8KLQotc3RhdGljIHZvaWQKLXNiX2NoZWNrIChwdHIsIGxlbikKLSAgICAgc2IgKnB0cjsKLSAgICAgaW50IGxlbjsKLXsKLSAgaWYgKHB0ci0+bGVuICsgbGVuID49IDEgPDwgcHRyLT5wb3QpCi0gICAgewotICAgICAgc2IgdG1wOwotICAgICAgaW50IHBvdCA9IHB0ci0+cG90OwotICAgICAgd2hpbGUgKHB0ci0+bGVuICsgbGVuID49IDEgPDwgcG90KQotCXBvdCsrOwotICAgICAgc2JfYnVpbGQgKCZ0bXAsIHBvdCk7Ci0gICAgICBzYl9hZGRfc2IgKCZ0bXAsIHB0cik7Ci0gICAgICBzYl9raWxsIChwdHIpOwotICAgICAgKnB0ciA9IHRtcDsKLSAgICB9Ci19Ci0KLS8qIG1ha2UgdGhlIHNiIGF0IHB0ciBwb2ludCBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuICAqLwotCi12b2lkCi1zYl9yZXNldCAocHRyKQotICAgICBzYiAqcHRyOwotewotICBwdHItPmxlbiA9IDA7Ci19Ci0KLS8qIGFkZCBjaGFyYWN0ZXIgYyB0byB0aGUgZW5kIG9mIHRoZSBzYiBhdCBwdHIuICovCi0KLXZvaWQKLXNiX2FkZF9jaGFyIChwdHIsIGMpCi0gICAgIHNiICpwdHI7Ci0gICAgIGludCBjOwotewotICBzYl9jaGVjayAocHRyLCAxKTsKLSAgcHRyLT5wdHJbcHRyLT5sZW4rK10gPSBjOwotfQotCi0vKiBhZGQgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBzIHRvIHRoZSBlbmQgb2Ygc2IgYXQgcHRyLiAqLwotCi12b2lkCi1zYl9hZGRfc3RyaW5nIChwdHIsIHMpCi0gICAgIHNiICpwdHI7Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGludCBsZW4gPSBzdHJsZW4gKHMpOwotICBzYl9jaGVjayAocHRyLCBsZW4pOwotICBtZW1jcHkgKHB0ci0+cHRyICsgcHRyLT5sZW4sIHMsIGxlbik7Ci0gIHB0ci0+bGVuICs9IGxlbjsKLX0KLQotLyogYWRkIHN0cmluZyBhdCBzIG9mIGxlbmd0aCBsZW4gdG8gc2IgYXQgcHRyICovCi0KLXZvaWQKLXNiX2FkZF9idWZmZXIgKHB0ciwgcywgbGVuKQotICAgICBzYiAqcHRyOwotICAgICBjb25zdCBjaGFyICpzOwotICAgICBpbnQgbGVuOwotewotICBzYl9jaGVjayAocHRyLCBsZW4pOwotICBtZW1jcHkgKHB0ci0+cHRyICsgcHRyLT5sZW4sIHMsIGxlbik7Ci0gIHB0ci0+bGVuICs9IGxlbjsKLX0KLQotLyogcHJpbnQgdGhlIHNiIGF0IHB0ciB0byB0aGUgb3V0cHV0IGZpbGUgKi8KLQotdm9pZAotc2JfcHJpbnQgKG91dGZpbGUsIHB0cikKLSAgICAgRklMRSAqb3V0ZmlsZTsKLSAgICAgc2IgKnB0cjsKLXsKLSAgaW50IGk7Ci0gIGludCBuYyA9IDA7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHB0ci0+bGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKG5jKQotCXsKLQkgIGZwcmludGYgKG91dGZpbGUsICIsIik7Ci0JfQotICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIiVkIiwgcHRyLT5wdHJbaV0pOwotICAgICAgbmMgPSAxOwotICAgIH0KLX0KLQotdm9pZCAKLXNiX3ByaW50X2F0IChvdXRmaWxlLCBpZHgsIHB0cikKLSAgICAgRklMRSAqb3V0ZmlsZTsKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKnB0cjsKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IGlkeDsgaSA8IHB0ci0+bGVuOyBpKyspCi0gICAgcHV0YyAocHRyLT5wdHJbaV0sIG91dGZpbGUpOwotfQotCi0vKiBwdXQgYSBudWxsIGF0IHRoZSBlbmQgb2YgdGhlIHNiIGF0IGluIGFuZCByZXR1cm4gdGhlIHN0YXJ0IG9mIHRoZQotICAgc3RyaW5nLCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGFzIGFuIGFyZyB0byBwcmludGYgJXMuICovCi0KLWNoYXIgKgotc2JfbmFtZSAoaW4pCi0gICAgIHNiICppbjsKLXsKLSAgLyogc3RpY2sgYSBudWxsIG9uIHRoZSBlbmQgb2YgdGhlIHN0cmluZyAqLwotICBzYl9hZGRfY2hhciAoaW4sIDApOwotICByZXR1cm4gaW4tPnB0cjsKLX0KLQotLyogbGlrZSBzYl9uYW1lLCBidXQgZG9uJ3QgaW5jbHVkZSB0aGUgbnVsbCBieXRlIGluIHRoZSBzdHJpbmcuICAqLwotCi1jaGFyICoKLXNiX3Rlcm1pbmF0ZSAoaW4pCi0gICAgIHNiICppbjsKLXsKLSAgc2JfYWRkX2NoYXIgKGluLCAwKTsKLSAgLS1pbi0+bGVuOwotICByZXR1cm4gaW4tPnB0cjsKLX0KLQotLyogc3RhcnQgYXQgdGhlIGluZGV4IGlkeCBpbnRvIHRoZSBzdHJpbmcgaW4gc2IgYXQgcHRyIGFuZCBza2lwCi0gICB3aGl0ZXNwYWNlLiByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBub24gd2hpdGVzcGFjZSBjaGFyYWN0ZXIgKi8KLQotaW50Ci1zYl9za2lwX3doaXRlIChpZHgsIHB0cikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKnB0cjsKLXsKLSAgd2hpbGUgKGlkeCA8IHB0ci0+bGVuCi0JICYmIChwdHItPnB0cltpZHhdID09ICcgJwotCSAgICAgfHwgcHRyLT5wdHJbaWR4XSA9PSAnXHQnKSkKLSAgICBpZHgrKzsKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogc3RhcnQgYXQgdGhlIGluZGV4IGlkeCBpbnRvIHRoZSBzYiBhdCBwdHIuIHNraXBzIHdoaXRlc3BhY2UsCi0gICBhIGNvbW1hIGFuZCBhbnkgZm9sbG93aW5nIHdoaXRlc3BhY2UuIHJldHVybmVzIHRoZSBpbmRleCBvZiB0aGUKLSAgIG5leHQgY2hhcmFjdGVyLiAqLwotCi1pbnQKLXNiX3NraXBfY29tbWEgKGlkeCwgcHRyKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqcHRyOwotewotICB3aGlsZSAoaWR4IDwgcHRyLT5sZW4KLQkgJiYgKHB0ci0+cHRyW2lkeF0gPT0gJyAnCi0JICAgICB8fCBwdHItPnB0cltpZHhdID09ICdcdCcpKQotICAgIGlkeCsrOwotCi0gIGlmIChpZHggPCBwdHItPmxlbgotICAgICAgJiYgcHRyLT5wdHJbaWR4XSA9PSAnLCcpCi0gICAgaWR4Kys7Ci0KLSAgd2hpbGUgKGlkeCA8IHB0ci0+bGVuCi0JICYmIChwdHItPnB0cltpZHhdID09ICcgJwotCSAgICAgfHwgcHRyLT5wdHJbaWR4XSA9PSAnXHQnKSkKLSAgICBpZHgrKzsKLQotICByZXR1cm4gaWR4OwotfQpkaWZmIC0tZ2l0IGEvZ2FzL3NiLmggYi9nYXMvc2IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U2ZGFmMS4uMDAwMDAwMAotLS0gYS9nYXMvc2IuaAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qIHNiLmggLSBoZWFkZXIgZmlsZSBmb3Igc3RyaW5nIGJ1ZmZlciBtYW5pcHVsYXRpb24gcm91dGluZXMKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBTdGV2ZSBhbmQgSnVkeSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCwKLSAgICAgIHNhY0BjeWdudXMuY29tCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2lmbmRlZiBTQl9ICi0KLSNkZWZpbmUgU0JfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0vKiBzdHJpbmcgYmxvY2tzCi0KLSAgIEkgaGFkIGEgY291cGxlIG9mIGNob2ljZXMgd2hlbiBkZWNpZGluZyB1cG9uIHRoaXMgZGF0YSBzdHJ1Y3R1cmUuCi0gICBnYXMgdXNlcyBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncyBmb3IgYWxsIGl0cyBpbnRlcm5hbCB3b3JrLiAgVGhpcwotICAgb2Z0ZW4gbWVhbnMgdGhhdCBwYXJ0cyBvZiB0aGUgcHJvZ3JhbSB0aGF0IHdhbnQgdG8gZXhhbWluZQotICAgc3Vic3RyaW5ncyBoYXZlIHRvIG1hbmlwdWxhdGUgdGhlIGRhdGEgaW4gdGhlIHN0cmluZyB0byBkbyB0aGUKLSAgIHJpZ2h0IHRoaW5nIChhIGNvbW1vbiBvcGVyYXRpb24gaXMgdG8gc2luZ2xlIG91dCBhIGJpdCBvZiB0ZXh0IGJ5Ci0gICBzYXZpbmcgYXdheSB0aGUgY2hhcmFjdGVyIGFmdGVyIGl0LCBudWxsaW5nIGl0IG91dCwgb3BlcmF0aW5nIG9uCi0gICB0aGUgc3Vic3RyaW5nIGFuZCB0aGVuIHJlcGxhY2luZyB0aGUgY2hhcmFjdGVyIHdoaWNoIHdhcyB1bmRlciB0aGUKLSAgIG51bGwpLiAgVGhpcyBpcyBhIHBhaW4gYW5kIEkgcmVtZW1iZXIgYSBsb2FkIG9mIHByb2JsZW1zIHRoYXQgSSBoYWQgd2l0aAotICAgY29kZSBpbiBnYXMgd2hpY2ggYWxtb3N0IGdvdCB0aGlzIHJpZ2h0LiAgQWxzbywgaXQncyBoYXJkZXIgdG8gZ3JvdyBhbmQKLSAgIGFsbG9jYXRlIG51bGwgdGVybWluYXRlZCBzdHJpbmdzIGVmZmljaWVudGx5LgotCi0gICBPYnN0YWNrcyBwcm92aWRlIGFsbCB0aGUgZnVuY3Rpb25hbGl0eSBuZWVkZWQsIGJ1dCBhcmUgdG9vCi0gICBjb21wbGljYXRlZCwgaGVuY2UgdGhlIHNiLgotCi0gICBBbiBzYiBpcyBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlciwgYW5kIGlzIGluaXRpYWx6ZWQgdG8gcG9pbnQgdG8gYW4KLSAgIHNiX2VsZW1lbnQuICBzYl9lbGVtZW50cyBhcmUga2VwdCBvbiBhIGZyZWUgbGlzdHMsIGFuZCB1c2VkIHdoZW4KLSAgIG5lZWRlZCwgcmVwbGFjZWQgb250byB0aGUgZnJlZSBsaXN0IHdoZW4gdW51c2VkLgotICovCi0KLSNkZWZpbmUgc2JfbWF4X3Bvd2VyX3R3byAgICAzMAkvKiBkb24ndCBhbGxvdyBzdHJpbmdzIG1vcmUgdGhhbgotCQkJICAgICAgICAgICAyXnNiX21heF9wb3dlcl90d28gbG9uZyAqLwotLyogc3RydWN0dXJlIG9mIGFuIHNiICovCi10eXBlZGVmIHN0cnVjdCBzYgotICB7Ci0gICAgY2hhciAqcHRyOwkJCS8qIHBvaW50cyB0byB0aGUgY3VycmVudCBibG9jay4gKi8KLSAgICBpbnQgbGVuOwkJCS8qIGhvdyBtdWNoIGlzIHVzZWQuICovCi0gICAgaW50IHBvdDsJCQkvKiB0aGUgbWF4aW11bSBsZW5ndGggaXMgMTw8cG90ICovCi0gICAgc3RydWN0IGxlICppdGVtOwotICB9Ci1zYjsKLQotLyogU3RydWN0dXJlIG9mIHRoZSBmcmVlIGxpc3Qgb2JqZWN0IG9mIGFuIHNiICovCi10eXBlZGVmIHN0cnVjdCBsZQotICB7Ci0gICAgc3RydWN0IGxlICpuZXh0OwotICAgIGludCBzaXplOwotICAgIGNoYXIgZGF0YVsxXTsKLSAgfQotc2JfZWxlbWVudDsKLQotLyogVGhlIGZyZWUgbGlzdCAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHNiX2VsZW1lbnQgKnNpemVbc2JfbWF4X3Bvd2VyX3R3b107Ci0gIH0gc2JfbGlzdF92ZWN0b3I7Ci0KLWV4dGVybiBpbnQgc3RyaW5nX2NvdW50W3NiX21heF9wb3dlcl90d29dOwotCi1leHRlcm4gdm9pZCBzYl9idWlsZCBQQVJBTVMgKChzYiAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIHNiX25ldyBQQVJBTVMgKChzYiAqKSk7Ci1leHRlcm4gdm9pZCBzYl9raWxsIFBBUkFNUyAoKHNiICopKTsKLWV4dGVybiB2b2lkIHNiX2FkZF9zYiBQQVJBTVMgKChzYiAqLCBzYiAqKSk7Ci1leHRlcm4gdm9pZCBzYl9yZXNldCBQQVJBTVMgKChzYiAqKSk7Ci1leHRlcm4gdm9pZCBzYl9hZGRfY2hhciBQQVJBTVMgKChzYiAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIHNiX2FkZF9zdHJpbmcgUEFSQU1TICgoc2IgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBzYl9hZGRfYnVmZmVyIFBBUkFNUyAoKHNiICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBzYl9wcmludCBQQVJBTVMgKChGSUxFICosIHNiICopKTsKLWV4dGVybiB2b2lkIHNiX3ByaW50X2F0IFBBUkFNUyAoKEZJTEUgKiwgaW50LCBzYiAqKSk7Ci1leHRlcm4gY2hhciAqc2JfbmFtZSBQQVJBTVMgKChzYiAqKSk7Ci1leHRlcm4gY2hhciAqc2JfdGVybWluYXRlIFBBUkFNUyAoKHNiICopKTsKLWV4dGVybiBpbnQgc2Jfc2tpcF93aGl0ZSBQQVJBTVMgKChpbnQsIHNiICopKTsKLWV4dGVybiBpbnQgc2Jfc2tpcF9jb21tYSBQQVJBTVMgKChpbnQsIHNiICopKTsKLQotLyogQWN0dWFsbHkgaW4gaW5wdXQtc2NydWIuYy4gICovCi1leHRlcm4gdm9pZCBpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiIFBBUkFNUyAoKHNiICosIGNoYXIgKikpOwotCi0jZW5kaWYgLyogU0JfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3N0YWJzLmMgYi9nYXMvc3RhYnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3ZTFiZi4uMDAwMDAwMAotLS0gYS9nYXMvc3RhYnMuYworKysgL2Rldi9udWxsCkBAIC0xLDYzMiArMCwwIEBACi0vKiBHZW5lcmljIHN0YWJzIHBhcnNpbmcgZm9yIGdhcy4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi1vciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci1XSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAiZWNvZmYuaCIKLQotLyogV2UgbmVlZCB0aGlzLCBkZXNwaXRlIHRoZSBhcHBhcmVudCBvYmplY3QgZm9ybWF0IGRlcGVuZGVuY3ksIHNpbmNlCi0gICBpdCBkZWZpbmVzIHN0YWIgdHlwZXMsIHdoaWNoIGFsbCBvYmplY3QgZm9ybWF0cyBjYW4gdXNlIG5vdy4gKi8KLQotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLQotc3RhdGljIHZvaWQgc19zdGFiX2dlbmVyaWMgUEFSQU1TICgoaW50LCBjaGFyICosIGNoYXIgKikpOwotc3RhdGljIHZvaWQgZ2VuZXJhdGVfYXNtX2ZpbGUgUEFSQU1TICgoaW50LCBjaGFyICopKTsKLQotLyogQWxsb3cgYmFja2VuZHMgdG8gb3ZlcnJpZGUgdGhlIG5hbWVzIHVzZWQgZm9yIHRoZSBzdGFiIHNlY3Rpb25zLiAgKi8KLSNpZm5kZWYgU1RBQl9TRUNUSU9OX05BTUUKLSNkZWZpbmUgU1RBQl9TRUNUSU9OX05BTUUgIi5zdGFiIgotI2VuZGlmCi0KLSNpZm5kZWYgU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FCi0jZGVmaW5lIFNUQUJfU1RSSU5HX1NFQ1RJT05fTkFNRSAiLnN0YWJzdHIiCi0jZW5kaWYKLQotLyogTm9uLXplcm8gaWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIC5mdW5jIGZ1bmN0aW9uLCBpbiB3aGljaCBjYXNlCi0gICBzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vIGVtaXRzIGZ1bmN0aW9uIHJlbGF0aXZlIGxpbmUgbnVtYmVyIHN0YWJzLgotICAgT3RoZXJ3aXNlIGl0IGVtaXRzIGxpbmUgbnVtYmVyIHN0YWJzIHdpdGggYWJzb2x1dGUgYWRkcmVzc2VzLiAgTm90ZSB0aGF0Ci0gICBib3RoIGNhc2VzIG9ubHkgYXBwbHkgdG8gYXNzZW1ibGVyIGNvZGUgYXNzZW1ibGVkIHdpdGggLWdzdGFicy4gICovCi1zdGF0aWMgaW50IGluX2RvdF9mdW5jX3A7Ci0KLS8qIExhYmVsIGF0IHN0YXJ0IG9mIGN1cnJlbnQgZnVuY3Rpb24gaWYgaW5fZG90X2Z1bmNfcCAhPSAwLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjdXJyZW50X2Z1bmN0aW9uX2xhYmVsOwotCi0vKgotICogSGFuZGxlIC5zdGFiWCBkaXJlY3RpdmVzLCB3aGljaCB1c2VkIHRvIGJlIG9wZW4tY29kZWQuCi0gKiBTbyBtdWNoIGNyZWVwaW5nIGZlYXR1cmlzbSBvdmVybG9hZGVkIHRoZSBzZW1hbnRpY3MgdGhhdCB3ZSBkZWNpZGVkCi0gKiB0byBwdXQgYWxsIC5zdGFiWCB0aGlua2luZyBpbiBvbmUgcGxhY2UuIEhlcmUuCi0gKgotICogV2UgdHJ5IHRvIG1ha2UgYW55IC5zdGFiWCBkaXJlY3RpdmUgbGVnYWwuIE90aGVyIHBlb3BsZSdzIEFTIHdpbGwgb2Z0ZW4KLSAqIGRvIGFzc2VtYmx5LXRpbWUgY29uc2lzdGVuY3kgY2hlY2tzOiBlZyBhc3NpZ25pbmcgbWVhbmluZyB0byBuX3R5cGUgYml0cwotICogYW5kICJwcm90ZWN0aW5nIiB5b3UgZnJvbSBzZXR0aW5nIHRoZW0gdG8gY2VydGFpbiB2YWx1ZXMuIChUaGV5IGFsc28gemVybwotICogY2VydGFpbiBiaXRzIGJlZm9yZSBlbWl0dGluZyBzeW1ib2xzLiBUdXQgdHV0LikKLSAqCi0gKiBJZiBhbiBleHByZXNzaW9uIGlzIG5vdCBhYnNvbHV0ZSB3ZSBlaXRoZXIgZ3JpcGUgb3IgdXNlIHRoZSByZWxvY2F0aW9uCi0gKiBpbmZvcm1hdGlvbi4gT3RoZXIgcGVvcGxlJ3MgYXNzZW1ibGVycyBzaWxlbnRseSBmb3JnZXQgaW5mb3JtYXRpb24gdGhleQotICogZG9uJ3QgbmVlZCBhbmQgaW52ZW50IGluZm9ybWF0aW9uIHRoZXkgbmVlZCB0aGF0IHlvdSBkaWRuJ3Qgc3VwcGx5LgotICovCi0KLS8qCi0gKiBCdWlsZCBhIHN0cmluZyBkaWN0aW9uYXJ5IGVudHJ5IGZvciBhIC5zdGFiWCBzeW1ib2wuCi0gKiBUaGUgc3ltYm9sIGlzIGFkZGVkIHRvIHRoZSAuPHNlY25hbWU+c3RyIHNlY3Rpb24uCi0gKi8KLQotI2lmbmRlZiBTRVBBUkFURV9TVEFCX1NFQ1RJT05TCi0jZGVmaW5lIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMgMAotI2VuZGlmCi0KLXVuc2lnbmVkIGludAotZ2V0X3N0YWJfc3RyaW5nX29mZnNldCAoc3RyaW5nLCBzdGFic3RyX3NlY25hbWUpCi0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgY29uc3QgY2hhciAqc3RhYnN0cl9zZWNuYW1lOwotewotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotICB1bnNpZ25lZCBpbnQgcmV0dmFsOwotICBzZWdUIHNhdmVfc2VnOwotICBzdWJzZWdUIHNhdmVfc3Vic2VnOwotICBzZWdUIHNlZzsKLSAgY2hhciAqcDsKLQotICBpZiAoISBTRVBBUkFURV9TVEFCX1NFQ1RJT05TKQotICAgIGFib3J0ICgpOwotCi0gIGxlbmd0aCA9IHN0cmxlbiAoc3RyaW5nKTsKLQotICBzYXZlX3NlZyA9IG5vd19zZWc7Ci0gIHNhdmVfc3Vic2VnID0gbm93X3N1YnNlZzsKLQotICAvKiBDcmVhdGUgdGhlIHN0YWIgc3RyaW5nIHNlY3Rpb24uICAqLwotICBzZWcgPSBzdWJzZWdfbmV3IChzdGFic3RyX3NlY25hbWUsIDApOwotCi0gIHJldHZhbCA9IHNlZ19pbmZvIChzZWcpLT5zdGFidS5zdGFiX3N0cmluZ19zaXplOwotICBpZiAocmV0dmFsIDw9IDApCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHRoZSBmaXJzdCBzdHJpbmcgaXMgZW1wdHkuICAqLwotICAgICAgcCA9IGZyYWdfbW9yZSAoMSk7Ci0gICAgICAqcCA9IDA7Ci0gICAgICByZXR2YWwgPSBzZWdfaW5mbyAoc2VnKS0+c3RhYnUuc3RhYl9zdHJpbmdfc2l6ZSA9IDE7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywgU0VDX1JFQURPTkxZIHwgU0VDX0RFQlVHR0lORyk7Ci0gICAgICBpZiAoc2VnLT5uYW1lID09IHN0YWJzdHJfc2VjbmFtZSkKLQlzZWctPm5hbWUgPSB4c3RyZHVwIChzdGFic3RyX3NlY25hbWUpOwotI2VuZGlmCi0gICAgfQotCi0gIGlmIChsZW5ndGggPiAwKQotICAgIHsJCQkJLyogT3JkaW5hcnkgY2FzZS4gKi8KLSAgICAgIHAgPSBmcmFnX21vcmUgKGxlbmd0aCArIDEpOwotICAgICAgc3RyY3B5IChwLCBzdHJpbmcpOwotCi0gICAgICBzZWdfaW5mbyAoc2VnKS0+c3RhYnUuc3RhYl9zdHJpbmdfc2l6ZSArPSBsZW5ndGggKyAxOwotICAgIH0KLSAgZWxzZQotICAgIHJldHZhbCA9IDA7Ci0KLSAgc3Vic2VnX3NldCAoc2F2ZV9zZWcsIHNhdmVfc3Vic2VnKTsKLQotICByZXR1cm4gcmV0dmFsOwotfQotCi0jaWZkZWYgQU9VVF9TVEFCUwotI2lmbmRlZiBPQkpfUFJPQ0VTU19TVEFCCi0jZGVmaW5lIE9CSl9QUk9DRVNTX1NUQUIoU0VHLFcsUyxULE8sRCkJYW91dF9wcm9jZXNzX3N0YWIoVyxTLFQsTyxEKQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGFvdXRfcHJvY2Vzc19zdGFiIFBBUkFNUyAoKGludCwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1hb3V0X3Byb2Nlc3Nfc3RhYiAod2hhdCwgc3RyaW5nLCB0eXBlLCBvdGhlciwgZGVzYykKLSAgICAgaW50IHdoYXQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgaW50IHR5cGUsIG90aGVyLCBkZXNjOwotewotICAvKiBQdXQgdGhlIHN0YWIgaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIHN5bWJvbFMgKnN5bWJvbDsKLQotICAvKiBDcmVhdGUgdGhlIHN5bWJvbCBub3csIGJ1dCBvbmx5IGluc2VydCBpdCBpbnRvIHRoZSBzeW1ib2wgY2hhaW4KLSAgICAgYWZ0ZXIgYW55IHN5bWJvbHMgbWVudGlvbmVkIGluIHRoZSB2YWx1ZSBleHByZXNzaW9uIGdldCBpbnRvIHRoZQotICAgICBzeW1ib2wgY2hhaW4uICBUaGlzIGlzIHRvIGF2b2lkICJjb250aW51YXRpb24gc3ltYm9scyIgKHdoZXJlIG9uZQotICAgICBlbmRzIGluICJcIiBhbmQgdGhlIGRlYnVnIGluZm8gaXMgY29udGludWVkIGluIHRoZSBuZXh0IC5zdGFicwotICAgICBkaXJlY3RpdmUpIGZyb20gYmVpbmcgc2VwYXJhdGVkIGJ5IG90aGVyIHJhbmRvbSBzeW1ib2xzLiAgKi8KLSAgc3ltYm9sID0gc3ltYm9sX2NyZWF0ZSAoc3RyaW5nLCB1bmRlZmluZWRfc2VjdGlvbiwgMCwKLQkJCSAgKHN0cnVjdCBmcmFnICopIE5VTEwpOwotICBpZiAod2hhdCA9PSAncycgfHwgd2hhdCA9PSAnbicpCi0gICAgewotICAgICAgLyogUGljayB1cCB0aGUgdmFsdWUgZnJvbSB0aGUgaW5wdXQgbGluZS4gICovCi0gICAgICBzeW1ib2wtPnN5X2ZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0gICAgICBwc2V1ZG9fc2V0IChzeW1ib2wpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIC5zdGFiZCBzZXRzIHRoZSBuYW1lIHRvIE5VTEwuICBXaHk/ICAqLwotICAgICAgU19TRVRfTkFNRSAoc3ltYm9sLCBOVUxMKTsKLSAgICAgIHN5bWJvbC0+c3lfZnJhZyA9IGZyYWdfbm93OwotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLSAgICB9Ci0KLSAgc3ltYm9sX2FwcGVuZCAoc3ltYm9sLCBzeW1ib2xfbGFzdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0gIFNfU0VUX1RZUEUgKHN5bWJvbCwgdHlwZSk7Ci0gIFNfU0VUX09USEVSIChzeW1ib2wsIG90aGVyKTsKLSAgU19TRVRfREVTQyAoc3ltYm9sLCBkZXNjKTsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGNhbiBoYW5kbGUgZGlmZmVyZW50IGtpbmRzIG9mIHN0YWJzIChzLG4sZCkgYW5kIGRpZmZlcmVudAotICAga2luZHMgb2Ygc3RhYiBzZWN0aW9ucy4gKi8KLQotc3RhdGljIHZvaWQgCi1zX3N0YWJfZ2VuZXJpYyAod2hhdCwgc3RhYl9zZWNuYW1lLCBzdGFic3RyX3NlY25hbWUpCi0gICAgIGludCB3aGF0OwotICAgICBjaGFyICpzdGFiX3NlY25hbWU7Ci0gICAgIGNoYXIgKnN0YWJzdHJfc2VjbmFtZTsKLXsKLSAgbG9uZyBsb25naW50OwotICBjaGFyICpzdHJpbmc7Ci0gIGludCB0eXBlOwotICBpbnQgb3RoZXI7Ci0gIGludCBkZXNjOwotCi0gIC8qIFRoZSBnZW5lcmFsIGZvcm1hdCBpczoKLSAgICAgLnN0YWJzICJTVFJJTkciLFRZUEUsT1RIRVIsREVTQyxWQUxVRQotICAgICAuc3RhYm4gVFlQRSxPVEhFUixERVNDLFZBTFVFCi0gICAgIC5zdGFiZCBUWVBFLE9USEVSLERFU0MKLSAgICAgQXQgdGhpcyBwb2ludCBpbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIGFmdGVyIHRoZSBwc2V1ZG8tb3AgYW5kCi0gICAgIGFueSB0cmFpbGluZyB3aGl0ZXNwYWNlLiAgVGhlIGFyZ3VtZW50IHdoYXQgaXMgb25lIG9mICdzJywgJ24nIG9yCi0gICAgICdkJyBpbmRpY2F0aW5nIHdoaWNoIHR5cGUgb2YgLnN0YWIgdGhpcyBpcy4gICovCi0KLSAgaWYgKHdoYXQgIT0gJ3MnKQotICAgIHN0cmluZyA9ICIiOwotICBlbHNlCi0gICAgewotICAgICAgaW50IGxlbmd0aDsKLQotICAgICAgc3RyaW5nID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW5ndGgpOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgZWxzZQotCXsKLQkgIGFzX3dhcm4gKF8oIi5zdGFiczogTWlzc2luZyBjb21tYSIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZsb25naW50KSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnN0YWIlYzogTWlzc2luZyBjb21tYSIpLCB3aGF0KTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB0eXBlID0gbG9uZ2ludDsKLQotICBpZiAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZsb25naW50KSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnN0YWIlYzogTWlzc2luZyBjb21tYSIpLCB3aGF0KTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBvdGhlciA9IGxvbmdpbnQ7Ci0KLSAgZGVzYyA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAod2hhdCA9PSAncycgfHwgd2hhdCA9PSAnbicpCi0gICAgewotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCXsKLQkgIGFzX3dhcm4gKF8oIi5zdGFiJWM6IE1pc3NpbmcgY29tbWEiKSwgd2hhdCk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLQotI2lmZGVmIFRDX1BQQwotI2lmZGVmIE9CSl9FTEYKLSAgLyogU29sYXJpcyBvbiBQb3dlclBDIGhhcyBkZWNpZGVkIHRoYXQgLnN0YWJkIGNhbiB0YWtlIDQgYXJndW1lbnRzLCBzbyBpZiB3ZSB3ZXJlCi0gICAgIGdpdmVuIDQgYXJndW1lbnRzLCBtYWtlIGl0IGEgLnN0YWJuICovCi0gIGVsc2UgaWYgKHdoYXQgPT0gJ2QnKQotICAgIHsKLSAgICAgIGNoYXIgKnNhdmVfbG9jYXRpb24gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHdoYXQgPSAnbic7Ci0JfQotICAgICAgZWxzZQotCWlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfbG9jYXRpb247Ci0gICAgfQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLSNlbmRpZiAvKiBUQ19QUEMgKi8KLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIGlmIChsaXN0aW5nKQotICAgIHsKLSAgICAgIHN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSBOX1NMSU5FOgotCSAgbGlzdGluZ19zb3VyY2VfbGluZSAoKHVuc2lnbmVkIGludCkgZGVzYyk7Ci0JICBicmVhazsKLQljYXNlIE5fU086Ci0JY2FzZSBOX1NPTDoKLQkgIGxpc3Rpbmdfc291cmNlX2ZpbGUgKHN0cmluZyk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmIC8qICEgTk9fTElTVElORyAqLwotCi0gIC8qIFdlIGhhdmUgbm93IGdhdGhlcmVkIHRoZSB0eXBlLCBvdGhlciwgYW5kIGRlc2MgaW5mb3JtYXRpb24uICBGb3IKLSAgICAgLnN0YWJzIG9yIC5zdGFibiwgaW5wdXRfbGluZV9wb2ludGVyIGlzIG5vdyBwb2ludGluZyBhdCB0aGUKLSAgICAgdmFsdWUuICAqLwotCi0gIGlmIChTRVBBUkFURV9TVEFCX1NFQ1RJT05TKQotICAgIC8qIE91dHB1dCB0aGUgc3RhYiBpbmZvcm1hdGlvbiBpbiBhIHNlcGFyYXRlIHNlY3Rpb24uICBUaGlzIGlzIHVzZWQKLSAgICAgICBhdCBsZWFzdCBmb3IgQ09GRiBhbmQgRUxGLiAgKi8KLSAgICB7Ci0gICAgICBzZWdUIHNhdmVkX3NlZyA9IG5vd19zZWc7Ci0gICAgICBzdWJzZWdUIHNhdmVkX3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gICAgICBmcmFnUyAqc2F2ZWRfZnJhZyA9IGZyYWdfbm93OwotICAgICAgdmFsdWVUIGRvdDsKLSAgICAgIHNlZ1Qgc2VnOwotICAgICAgdW5zaWduZWQgaW50IHN0cm9mZjsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIHN0YXRpYyBzZWdUIGNhY2hlZF9zZWM7Ci0gICAgICBzdGF0aWMgY2hhciAqY2FjaGVkX3NlY25hbWU7Ci0KLSAgICAgIGRvdCA9IGZyYWdfbm93X2ZpeCAoKTsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gICAgICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gICAgICBpZiAoY2FjaGVkX3NlY25hbWUgJiYgIXN0cmNtcCAoY2FjaGVkX3NlY25hbWUsIHN0YWJfc2VjbmFtZSkpCi0JewotCSAgc2VnID0gY2FjaGVkX3NlYzsKLQkgIHN1YnNlZ19zZXQgKHNlZywgMCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNlZyA9IHN1YnNlZ19uZXcgKHN0YWJfc2VjbmFtZSwgMCk7Ci0JICBpZiAoY2FjaGVkX3NlY25hbWUpCi0JICAgIGZyZWUgKGNhY2hlZF9zZWNuYW1lKTsKLQkgIGNhY2hlZF9zZWNuYW1lID0geHN0cmR1cCAoc3RhYl9zZWNuYW1lKTsKLQkgIGNhY2hlZF9zZWMgPSBzZWc7Ci0JfQotCi0gICAgICBpZiAoISBzZWdfaW5mbyAoc2VnKS0+aGFkb25lKQotCXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnLAotCQkJCSBTRUNfUkVBRE9OTFkgfCBTRUNfUkVMT0MgfCBTRUNfREVCVUdHSU5HKTsKLSNlbmRpZgotI2lmZGVmIElOSVRfU1RBQl9TRUNUSU9OCi0JICBJTklUX1NUQUJfU0VDVElPTiAoc2VnKTsKLSNlbmRpZgotCSAgc2VnX2luZm8gKHNlZyktPmhhZG9uZSA9IDE7Ci0JfQotCi0gICAgICBzdHJvZmYgPSBnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0IChzdHJpbmcsIHN0YWJzdHJfc2VjbmFtZSk7Ci0gICAgICBpZiAod2hhdCA9PSAncycpCi0JewotCSAgLyogcmVsZWFzZSB0aGUgc3RyaW5nICovCi0JICBvYnN0YWNrX2ZyZWUgKCZub3Rlcywgc3RyaW5nKTsKLQl9Ci0KLSAgICAgIC8qIEF0IGxlYXN0IGZvciBub3csIHN0YWJzIGluIGEgc3BlY2lhbCBzdGFiIHNlY3Rpb24gYXJlIGFsd2F5cwotCSBvdXRwdXQgYXMgMTIgYnl0ZSBibG9ja3Mgb2YgaW5mb3JtYXRpb24uICAqLwotICAgICAgcCA9IGZyYWdfbW9yZSAoOCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIHN0cm9mZiwgNCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyA0LCAodmFsdWVUKSB0eXBlLCAxKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCArIDUsICh2YWx1ZVQpIG90aGVyLCAxKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCArIDYsICh2YWx1ZVQpIGRlc2MsIDIpOwotCi0gICAgICBpZiAod2hhdCA9PSAncycgfHwgd2hhdCA9PSAnbicpCi0JewotCSAgLyogUGljayB1cCB0aGUgdmFsdWUgZnJvbSB0aGUgaW5wdXQgbGluZS4gICovCi0JICBjb25zICg0KTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICpmYWtlOwotCSAgc3ltYm9sUyAqc3ltYm9sOwotCSAgZXhwcmVzc2lvblMgZXhwOwotCi0JICAvKiBBcnJhbmdlIGZvciBhIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBsb2NhdGlvbi4gICovCi0JICBmYWtlID0gRkFLRV9MQUJFTF9OQU1FOwotCSAgc3ltYm9sID0gc3ltYm9sX25ldyAoZmFrZSwgc2F2ZWRfc2VnLCBkb3QsIHNhdmVkX2ZyYWcpOwotCi0JICBleHAuWF9vcCA9IE9fc3ltYm9sOwotCSAgZXhwLlhfYWRkX3N5bWJvbCA9IHN5bWJvbDsKLQkgIGV4cC5YX2FkZF9udW1iZXIgPSAwOwotCi0JICBlbWl0X2V4cHIgKCZleHAsIDQpOwotCX0KLQotI2lmZGVmIE9CSl9QUk9DRVNTX1NUQUIKLSAgICAgIE9CSl9QUk9DRVNTX1NUQUIgKHNlZywgd2hhdCwgc3RyaW5nLCB0eXBlLCBvdGhlciwgZGVzYyk7Ci0jZW5kaWYKLQotICAgICAgc3Vic2VnX3NldCAoc2F2ZWRfc2VnLCBzYXZlZF9zdWJzZWcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZmRlZiBPQkpfUFJPQ0VTU19TVEFCCi0gICAgICBPQkpfUFJPQ0VTU19TVEFCICgwLCB3aGF0LCBzdHJpbmcsIHR5cGUsIG90aGVyLCBkZXNjKTsKLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZgotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBSZWd1bGFyIHN0YWIgZGlyZWN0aXZlLiAqLwotCi12b2lkCi1zX3N0YWIgKHdoYXQpCi0gICAgIGludCB3aGF0OwotewotICBzX3N0YWJfZ2VuZXJpYyAod2hhdCwgU1RBQl9TRUNUSU9OX05BTUUsIFNUQUJfU1RSSU5HX1NFQ1RJT05fTkFNRSk7Ci19Ci0KLS8qICJFeHRlbmRlZCBzdGFicyIsIHVzZWQgaW4gU29sYXJpcyBvbmx5IG5vdy4gKi8KLQotdm9pZAotc194c3RhYiAod2hhdCkKLSAgICAgaW50IHdoYXQ7Ci17Ci0gIGludCBsZW5ndGg7Ci0gIGNoYXIgKnN0YWJfc2VjbmFtZSwgKnN0YWJzdHJfc2VjbmFtZTsKLSAgc3RhdGljIGNoYXIgKnNhdmVkX3NlY25hbWUsICpzYXZlZF9zdHJzZWNuYW1lOwotCi0gIC8qIEBAIE1FTU9SWSBMRUFLOiBUaGlzIGFsbG9jYXRlcyBhIGNvcHkgb2YgdGhlIHN0cmluZywgYnV0IGluIG1vc3QKLSAgICAgY2FzZXMgaXQgd2lsbCBiZSB0aGUgc2FtZSBzdHJpbmcsIHNvIHdlIGNvdWxkIHJlbGVhc2UgdGhlIHN0b3JhZ2UKLSAgICAgYmFjayB0byB0aGUgb2JzdGFjayBpdCBjYW1lIGZyb20uICAqLwotICBzdGFiX3NlY25hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbmd0aCk7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJjb21tYSBtaXNzaW5nIGluIC54c3RhYnMiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBUbyBnZXQgdGhlIG5hbWUgb2YgdGhlIHN0YWIgc3RyaW5nIHNlY3Rpb24sIHNpbXBseSBhZGQgInN0ciIgdG8KLSAgICAgdGhlIHN0YWIgc2VjdGlvbiBuYW1lLiAgKi8KLSAgaWYgKHNhdmVkX3NlY25hbWUgPT0gMCB8fCBzdHJjbXAgKHNhdmVkX3NlY25hbWUsIHN0YWJfc2VjbmFtZSkpCi0gICAgewotICAgICAgc3RhYnN0cl9zZWNuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzdGFiX3NlY25hbWUpICsgNCk7Ci0gICAgICBzdHJjcHkgKHN0YWJzdHJfc2VjbmFtZSwgc3RhYl9zZWNuYW1lKTsKLSAgICAgIHN0cmNhdCAoc3RhYnN0cl9zZWNuYW1lLCAic3RyIik7Ci0gICAgICBpZiAoc2F2ZWRfc2VjbmFtZSkKLQl7Ci0JICBmcmVlIChzYXZlZF9zZWNuYW1lKTsKLQkgIGZyZWUgKHNhdmVkX3N0cnNlY25hbWUpOwotCX0KLSAgICAgIHNhdmVkX3NlY25hbWUgPSBzdGFiX3NlY25hbWU7Ci0gICAgICBzYXZlZF9zdHJzZWNuYW1lID0gc3RhYnN0cl9zZWNuYW1lOwotICAgIH0KLSAgc19zdGFiX2dlbmVyaWMgKHdoYXQsIHNhdmVkX3NlY25hbWUsIHNhdmVkX3N0cnNlY25hbWUpOwotfQotCi0jaWZkZWYgU19TRVRfREVTQwotCi0vKiBGcm9iIGludmVudGVkIGF0IFJNUycgcmVxdWVzdC4gU2V0IHRoZSBuX2Rlc2Mgb2YgYSBzeW1ib2wuICAqLwotCi12b2lkIAotc19kZXNjIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgY2hhciAqcDsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgaW50IHRlbXA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgICpwID0gMDsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBcIiVzXCIiKSwgbmFtZSk7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgKnAgPSAwOwotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAgICAgKnAgPSBjOwotICAgICAgU19TRVRfREVTQyAoc3ltYm9sUCwgdGVtcCk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzX2Rlc2MoKSAqLwotCi0jZW5kaWYgLyogZGVmaW5lZCAoU19TRVRfREVTQykgKi8KLQotLyogR2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGRlbm90ZSB0aGUgbWFpbiBzb3VyY2UgZmlsZS4gICovCi0KLXZvaWQKLXN0YWJzX2dlbmVyYXRlX2FzbV9maWxlICgpCi17Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lbm87Ci0KLSAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZW5vKTsKLSAgZ2VuZXJhdGVfYXNtX2ZpbGUgKE5fU08sIGZpbGUpOwotfQotCi0vKiBHZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gZGVub3RlIHRoZSBzb3VyY2UgZmlsZS4KLSAgIFRZUEUgaXMgb25lIG9mIE5fU08sIE5fU09MLiAgKi8KLQotc3RhdGljIHZvaWQKLWdlbmVyYXRlX2FzbV9maWxlICh0eXBlLCBmaWxlKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqZmlsZTsKLXsKLSAgc3RhdGljIGNoYXIgKmxhc3RfZmlsZTsKLSAgc3RhdGljIGludCBsYWJlbF9jb3VudDsKLSAgY2hhciAqaG9sZDsKLSAgY2hhciBidWZbMTAwXTsKLSAgY2hhciBzeW1bMzBdOwotCi0gIC8qIFJhdGhlciB0aGFuIHRyeSB0byBkbyB0aGlzIGluIHNvbWUgZWZmaWNpZW50IGZhc2hpb24sIHdlIGp1c3QKLSAgICAgZ2VuZXJhdGUgYSBzdHJpbmcgYW5kIHRoZW4gcGFyc2UgaXQgYWdhaW4uICBUaGF0IGxldHMgdXMgdXNlIHRoZQotICAgICBleGlzdGluZyBzdGFicyBob29rLCB3aGljaCBleHBlY3QgdG8gc2VlIGEgc3RyaW5nLCByYXRoZXIgdGhhbgotICAgICBpbnZlbnRpbmcgbmV3IG9uZXMuICAqLwotCi0gIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgaWYgKGxhc3RfZmlsZSA9PSBOVUxMCi0gICAgICB8fCBzdHJjbXAgKGxhc3RfZmlsZSwgZmlsZSkgIT0gMCkKLSAgICB7Ci0gICAgICBzcHJpbnRmIChzeW0sICIlc0YlZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQpOwotICAgICAgKytsYWJlbF9jb3VudDsKLQotICAgICAgc3ByaW50ZiAoYnVmLCAiXCIlc1wiLCVkLDAsMCwlc1xuIiwgZmlsZSwgdHlwZSwgc3ltKTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGJ1ZjsKLSAgICAgIHNfc3RhYiAoJ3MnKTsKLSAgICAgIGNvbG9uIChzeW0pOwotCi0gICAgICBpZiAobGFzdF9maWxlICE9IE5VTEwpCi0JZnJlZSAobGFzdF9maWxlKTsKLSAgICAgIGxhc3RfZmlsZSA9IHhzdHJkdXAgKGZpbGUpOwotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotfQotCi0vKiBHZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IGxpbmUuICBUaGlzIGlzCi0gICB1c2VkIHRvIHByb2R1Y2UgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJsZXIgZmlsZS4gICovCi0KLXZvaWQKLXN0YWJzX2dlbmVyYXRlX2FzbV9saW5lbm8gKCkKLXsKLSAgc3RhdGljIGludCBsYWJlbF9jb3VudDsKLSAgY2hhciAqaG9sZDsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgY2hhciAqYnVmOwotICBjaGFyIHN5bVszMF07Ci0KLSAgLyogUmF0aGVyIHRoYW4gdHJ5IHRvIGRvIHRoaXMgaW4gc29tZSBlZmZpY2llbnQgZmFzaGlvbiwgd2UganVzdAotICAgICBnZW5lcmF0ZSBhIHN0cmluZyBhbmQgdGhlbiBwYXJzZSBpdCBhZ2Fpbi4gIFRoYXQgbGV0cyB1cyB1c2UgdGhlCi0gICAgIGV4aXN0aW5nIHN0YWJzIGhvb2ssIHdoaWNoIGV4cGVjdCB0byBzZWUgYSBzdHJpbmcsIHJhdGhlciB0aGFuCi0gICAgIGludmVudGluZyBuZXcgb25lcy4gICovCi0KLSAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBhc193aGVyZSAoJmZpbGUsICZsaW5lbm8pOwotCi0gIGdlbmVyYXRlX2FzbV9maWxlIChOX1NPTCwgZmlsZSk7Ci0KLSAgc3ByaW50ZiAoc3ltLCAiJXNMJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KTsKLSAgKytsYWJlbF9jb3VudDsKLQotICBpZiAoaW5fZG90X2Z1bmNfcCkKLSAgICB7Ci0gICAgICBidWYgPSAoY2hhciAqKSBhbGxvY2EgKDEwMCArIHN0cmxlbiAoY3VycmVudF9mdW5jdGlvbl9sYWJlbCkpOwotICAgICAgc3ByaW50ZiAoYnVmLCAiJWQsMCwlZCwlcy0lc1xuIiwgTl9TTElORSwgbGluZW5vLAotCSAgICAgICBzeW0sIGN1cnJlbnRfZnVuY3Rpb25fbGFiZWwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJ1ZiA9IChjaGFyICopIGFsbG9jYSAoMTAwKTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVkLDAsJWQsJXNcbiIsIE5fU0xJTkUsIGxpbmVubywgc3ltKTsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGJ1ZjsKLSAgc19zdGFiICgnbicpOwotICBjb2xvbiAoc3ltKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotfQotCi0vKiBFbWl0IGEgZnVuY3Rpb24gc3RhYi4KLSAgIEFsbCBhc3NlbWJsZXIgZnVuY3Rpb25zIGFyZSBhc3N1bWVkIHRvIGhhdmUgcmV0dXJuIHR5cGUgYHZvaWQnLiAgKi8KLQotdm9pZAotc3RhYnNfZ2VuZXJhdGVfYXNtX2Z1bmMgKGZ1bmNuYW1lLCBzdGFydGxhYm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmZ1bmNuYW1lOwotICAgICBjb25zdCBjaGFyICpzdGFydGxhYm5hbWU7Ci17Ci0gIHN0YXRpYyBpbnQgdm9pZF9lbWl0dGVkX3A7Ci0gIGNoYXIgKmhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmVubzsKLQotICBpZiAoISB2b2lkX2VtaXR0ZWRfcCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSAiXCJ2b2lkOnQxPTFcIiwxMjgsMCwwLDAiOwotICAgICAgc19zdGFiICgncycpOwotICAgICAgdm9pZF9lbWl0dGVkX3AgPSAxOwotICAgIH0KLQotICBhc193aGVyZSAoJmZpbGUsICZsaW5lbm8pOwotICBhc3ByaW50ZiAoJmJ1ZiwgIlwiJXM6RjFcIiwlZCwwLCVkLCVzIiwKLQkgICAgZnVuY25hbWUsIE5fRlVOLCBsaW5lbm8gKyAxLCBzdGFydGxhYm5hbWUpOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBidWY7Ci0gIHNfc3RhYiAoJ3MnKTsKLSAgZnJlZSAoYnVmKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotICBjdXJyZW50X2Z1bmN0aW9uX2xhYmVsID0geHN0cmR1cCAoc3RhcnRsYWJuYW1lKTsKLSAgaW5fZG90X2Z1bmNfcCA9IDE7Ci19Ci0KLS8qIEVtaXQgYSBzdGFiIHRvIHJlY29yZCB0aGUgZW5kIG9mIGEgZnVuY3Rpb24uICAqLwotCi12b2lkCi1zdGFic19nZW5lcmF0ZV9hc21fZW5kZnVuYyAoZnVuY25hbWUsIHN0YXJ0bGFibmFtZSkKLSAgICAgY29uc3QgY2hhciAqZnVuY25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YXJ0bGFibmFtZTsKLXsKLSAgc3RhdGljIGludCBsYWJlbF9jb3VudDsKLSAgY2hhciAqaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2hhciAqYnVmOwotICBjaGFyIHN5bVszMF07Ci0KLSAgc3ByaW50ZiAoc3ltLCAiJXNlbmRmdW5jJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KTsKLSAgKytsYWJlbF9jb3VudDsKLSAgY29sb24gKHN5bSk7Ci0KLSAgYXNwcmludGYgKCZidWYsICJcIlwiLCVkLDAsMCwlcy0lcyIsIE5fRlVOLCBzeW0sIHN0YXJ0bGFibmFtZSk7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGJ1ZjsKLSAgc19zdGFiICgncycpOwotICBmcmVlIChidWYpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0gIGluX2RvdF9mdW5jX3AgPSAwOwotICBjdXJyZW50X2Z1bmN0aW9uX2xhYmVsID0gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9zdGFtcC1oLmluIGIvZ2FzL3N0YW1wLWguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODhmNzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3N0YW1wLWguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10aW1lc3RhbXAKZGlmZiAtLWdpdCBhL2dhcy9zdHJ1Yy1zeW1ib2wuaCBiL2dhcy9zdHJ1Yy1zeW1ib2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViMDQwNS4uMDAwMDAwMAotLS0gYS9nYXMvc3RydWMtc3ltYm9sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyogc3RydWN0X3N5bWJvbC5oIC0gSW50ZXJuYWwgc3ltYm9sIHN0cnVjdHVyZQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfX3N0cnVjX3N5bWJvbF9oX18KLSNkZWZpbmUgX19zdHJ1Y19zeW1ib2xfaF9fCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0vKiBUaGUgQkZEIGNvZGUgd2FudHMgdG8gd2FsayB0aGUgbGlzdCBpbiBib3RoIGRpcmVjdGlvbnMuICAqLwotI3VuZGVmICBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0jZGVmaW5lIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSNlbmRpZgotCi0vKiBvdXIgdmVyc2lvbiBvZiBhbiBubGlzdCBub2RlICovCi1zdHJ1Y3Qgc3ltYm9sCi17Ci0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogVGhlICg0LW9yaWdpbikgcG9zaXRpb24gb2Ygc3lfbmFtZSBpbiB0aGUgc3ltYm9sIHRhYmxlIG9mIHRoZSBvYmplY3QKLSAgICAgZmlsZS4gIFRoaXMgd2lsbCBiZSAwIGZvciAobmFtZWxlc3MpIC5zdGFiZCBzeW1ib2xzLgotCi0gICAgIE5vdCB1c2VkIHVudGlsIHdyaXRlX29iamVjdF9maWxlKCkgdGltZS4gKi8KLSAgdW5zaWduZWQgbG9uZyBzeV9uYW1lX29mZnNldDsKLQotICAvKiBXaGF0IHdlIHdyaXRlIGluIC5vIGZpbGUgKGlmIHBlcm1pdHRlZCkuICAqLwotICBvYmpfc3ltYm9sX3R5cGUgc3lfc3ltYm9sOwotCi0gIC8qIFRoZSAyNCBiaXQgc3ltYm9sIG51bWJlci4gIFN5bWJvbCBudW1iZXJzIHN0YXJ0IGF0IDAgYW5kIGFyZSB1bnNpZ25lZC4gKi8KLSAgbG9uZyBzeV9udW1iZXI7Ci0jZWxzZQotICAvKiBCRkQgc3ltYm9sICovCi0gIGFzeW1ib2wgKmJzeW07Ci0jZW5kaWYKLQotICAvKiBUaGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gICovCi0gIGV4cHJlc3Npb25TIHN5X3ZhbHVlOwotCi0gIC8qIEZvcndhcmRzIGFuZCAob3B0aW9uYWxseSkgYmFja3dhcmRzIGNoYWluIHBvaW50ZXJzLiAgKi8KLSAgc3RydWN0IHN5bWJvbCAqc3lfbmV4dDsKLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0gIHN0cnVjdCBzeW1ib2wgKnN5X3ByZXZpb3VzOwotI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KLQotICAvKiBQb2ludGVyIHRvIHRoZSBmcmFnIHRoaXMgc3ltYm9sIGlzIGF0dGFjaGVkIHRvLCBpZiBhbnkuCi0gICAgIE90aGVyd2lzZSwgTlVMTC4gICovCi0gIHN0cnVjdCBmcmFnICpzeV9mcmFnOwotCi0gIHVuc2lnbmVkIGludCB3cml0dGVuIDogMTsKLSAgLyogV2hldGhlciBzeW1ib2wgdmFsdWUgaGFzIGJlZW4gY29tcGxldGVseSByZXNvbHZlZCAodXNlZCBkdXJpbmcKLSAgICAgZmluYWwgcGFzcyBvdmVyIHN5bWJvbCB0YWJsZSkuICAqLwotICB1bnNpZ25lZCBpbnQgc3lfcmVzb2x2ZWQgOiAxOwotICAvKiBXaGV0aGVyIHRoZSBzeW1ib2wgdmFsdWUgaXMgY3VycmVudGx5IGJlaW5nIHJlc29sdmVkICh1c2VkIHRvCi0gICAgIGRldGVjdCBsb29wcyBpbiBzeW1ib2wgZGVwZW5kZW5jaWVzKS4gICovCi0gIHVuc2lnbmVkIGludCBzeV9yZXNvbHZpbmcgOiAxOwotICAvKiBXaGV0aGVyIHRoZSBzeW1ib2wgdmFsdWUgaXMgdXNlZCBpbiBhIHJlbG9jLiAgVGhpcyBpcyB1c2VkIHRvCi0gICAgIGVuc3VyZSB0aGF0IHN5bWJvbHMgdXNlZCBpbiByZWxvY3MgYXJlIHdyaXR0ZW4gb3V0LCBldmVuIGlmIHRoZXkKLSAgICAgYXJlIGxvY2FsIGFuZCB3b3VsZCBvdGhlcndpc2Ugbm90IGJlLiAgKi8KLSAgdW5zaWduZWQgaW50IHN5X3VzZWRfaW5fcmVsb2MgOiAxOwotCi0gIC8qIFdoZXRoZXIgdGhlIHN5bWJvbCBpcyB1c2VkIGFzIGFuIG9wZXJhbmQgb3IgaW4gYW4gZXhwcmVzc2lvbi4gIAotICAgICBOT1RFOiAgTm90IGFsbCB0aGUgYmFja2VuZHMga2VlcCB0aGlzIGluZm9ybWF0aW9uIGFjY3VyYXRlOwotICAgICBiYWNrZW5kcyB3aGljaCB1c2UgdGhpcyBiaXQgYXJlIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIGl0IHdoZW4KLSAgICAgYSBzeW1ib2wgaXMgdXNlZCBpbiBiYWNrZW5kIHJvdXRpbmVzLiAgKi8KLSAgdW5zaWduZWQgaW50IHN5X3VzZWQgOiAxOwotCi0gIC8qIFRoaXMgaXMgc2V0IGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpbiBhbiBNUkkgY29tbW9uIHNlY3Rpb24uCi0gICAgIFdlIGhhbmRsZSBzdWNoIHNlY3Rpb25zIGFzIHNpbmdsZSBjb21tb24gc3ltYm9scywgc28gc3ltYm9scwotICAgICBkZWZpbmVkIHdpdGhpbiB0aGVtIG11c3QgYmUgdHJlYXRlZCBzcGVjaWFsbHkgYnkgdGhlIHJlbG9jYXRpb24KLSAgICAgcm91dGluZXMuICAqLwotICB1bnNpZ25lZCBpbnQgc3lfbXJpX2NvbW1vbiA6IDE7Ci0KLSNpZmRlZiBPQkpfU1lNRklFTERfVFlQRQotICBPQkpfU1lNRklFTERfVFlQRSBzeV9vYmo7Ci0jZW5kaWYKLQotI2lmZGVmIFRDX1NZTUZJRUxEX1RZUEUKLSAgVENfU1lNRklFTERfVFlQRSBzeV90YzsKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX1NZTUJPTF9GSUVMRFMKLSAgVEFSR0VUX1NZTUJPTF9GSUVMRFMKLSNlbmRpZgotfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgc3ltYm9sIHN5bWJvbFM7Ci0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotc3RydWN0IGJyb2tlbl93b3JkCi0gIHsKLSAgICAvKiBMaW5rZWQgbGlzdCAtLSBvbmUgb2YgdGhlc2Ugc3RydWN0dXJlcyBwZXIgIi53b3JkIHgteStDIgotICAgICAgIGV4cHJlc3Npb24uICAqLwotICAgIHN0cnVjdCBicm9rZW5fd29yZCAqbmV4dF9icm9rZW5fd29yZDsKLSAgICAvKiBTZWdtZW50IGFuZCBzdWJzZWdtZW50IGZvciBicm9rZW4gd29yZC4gICovCi0gICAgc2VnVCBzZWc7Ci0gICAgc3Vic2VnVCBzdWJzZWc7Ci0gICAgLyogV2hpY2ggZnJhZyBpcyB0aGlzIGJyb2tlbiB3b3JkIGluPyAgKi8KLSAgICBmcmFnUyAqZnJhZzsKLSAgICAvKiBXaGVyZSBpbiB0aGUgZnJhZyBpcyBpdD8gICovCi0gICAgY2hhciAqd29yZF9nb2VzX2hlcmU7Ci0gICAgLyogV2hlcmUgdG8gYWRkIHRoZSBicmVhay4gICovCi0gICAgZnJhZ1MgKmRpc3BmcmFnOwkJLyogd2hlcmUgdG8gYWRkIHRoZSBicmVhayAqLwotICAgIC8qIE9wZXJhbmRzIG9mIGV4cHJlc3Npb24uICAqLwotICAgIHN5bWJvbFMgKmFkZDsKLSAgICBzeW1ib2xTICpzdWI7Ci0gICAgb2Zmc2V0VCBhZGRudW07Ci0KLSAgICBpbnQgYWRkZWQ7CQkJLyogbmFzdHkgdGhpbmcgaGFwcGVuZCB5ZXQ/ICovCi0gICAgLyogMTogYWRkZWQgYW5kIGhhcyBhIGxvbmctanVtcCAqLwotICAgIC8qIDI6IGFkZGVkIGJ1dCB1c2VzIHNvbWVvbmUgZWxzZXMgbG9uZy1qdW1wICovCi0KLSAgICAvKiBQb2ludGVyIHRvIGJyb2tlbl93b3JkIHdpdGggYSBzaW1pbGFyIGxvbmctanVtcC4gICovCi0gICAgc3RydWN0IGJyb2tlbl93b3JkICp1c2VfanVtcDsKLSAgfTsKLWV4dGVybiBzdHJ1Y3QgYnJva2VuX3dvcmQgKmJyb2tlbl93b3JkczsKLSNlbmRpZiAvKiBuZGVmIFdPUktJTkdfRE9UX1dPUkQgKi8KLQotLyoKLSAqIEN1cnJlbnQgbWVhbnMgZm9yIGdldHRpbmcgZnJvbSBzeW1ib2xzIHRvIHNlZ21lbnRzIGFuZCB2aWNlIHZlcnNlLgotICogVGhpcyB3aWxsIGNoYW5nZSBmb3IgaW5maW5pdGUtc2VnbWVudHMgc3VwcG9ydCAoZS5nLiBDT0ZGKS4KLSAqLwotZXh0ZXJuIGNvbnN0IHNlZ1QgTl9UWVBFX3NlZ1tdOwkvKiBzdWJzZWcuYyAqLwotCi0jZGVmaW5lCVNFR01FTlRfVE9fU1lNQk9MX1RZUEUoc2VnKSAgKCBzZWdfTl9UWVBFIFsoaW50KSAoc2VnKV0gKQotZXh0ZXJuIGNvbnN0IHNob3J0IHNlZ19OX1RZUEVbXTsvKiBzdWJzZWcuYyAqLwotCi0jZGVmaW5lCU5fUkVHSVNURVIJMzAJLyogRmFrZSBOX1RZUEUgdmFsdWUgZm9yIFNFR19SRUdJU1RFUiAqLwotCi12b2lkIHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzIFBBUkFNUyAoKHN5bWJvbFMgKiBzeW1ib2xQKSk7Ci0KLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0KLXZvaWQgc3ltYm9sX2luc2VydCBQQVJBTVMgKChzeW1ib2xTICogYWRkbWUsIHN5bWJvbFMgKiB0YXJnZXQsCi0JCQkgICAgc3ltYm9sUyAqKiByb290UCwgc3ltYm9sUyAqKiBsYXN0UCkpOwotdm9pZCBzeW1ib2xfcmVtb3ZlIFBBUkFNUyAoKHN5bWJvbFMgKiBzeW1ib2xQLCBzeW1ib2xTICoqIHJvb3RQLAotCQkJICAgIHN5bWJvbFMgKiogbGFzdFApKTsKLQotI2RlZmluZSBzeW1ib2xfcHJldmlvdXMocykgKChzKS0+c3lfcHJldmlvdXMpCi0KLSNlbmRpZiAvKiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTICovCi0KLXZvaWQgdmVyaWZ5X3N5bWJvbF9jaGFpbiBQQVJBTVMgKChzeW1ib2xTICogcm9vdFAsIHN5bWJvbFMgKiBsYXN0UCkpOwotdm9pZCB2ZXJpZnlfc3ltYm9sX2NoYWluXzIgUEFSQU1TICgoc3ltYm9sUyAqIHN5bVApKTsKLQotdm9pZCBzeW1ib2xfYXBwZW5kIFBBUkFNUyAoKHN5bWJvbFMgKiBhZGRtZSwgc3ltYm9sUyAqIHRhcmdldCwKLQkJCSAgICBzeW1ib2xTICoqIHJvb3RQLCBzeW1ib2xTICoqIGxhc3RQKSk7Ci0KLSNkZWZpbmUgc3ltYm9sX25leHQocykJKChzKS0+c3lfbmV4dCkKLQotI2VuZGlmIC8qIF9fc3RydWNfc3ltYm9sX2hfXyAqLwotCi0vKiBlbmQgb2Ygc3RydWMtc3ltYm9sLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9zdWJzZWdzLmMgYi9nYXMvc3Vic2Vncy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGYyODY4Li4wMDAwMDAwCi0tLSBhL2dhcy9zdWJzZWdzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTggKzAsMCBAQAotLyogc3Vic2Vncy5jIC0gc3Vic2VnbWVudHMgLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NwotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBTZWdtZW50cyAmIHN1Yi1zZWdtZW50cy4KLSAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLWZyY2hhaW5TICpmcmNoYWluX3Jvb3QsICpmcmNoYWluX25vdzsKLQotc3RhdGljIHN0cnVjdCBvYnN0YWNrIGZyY2hhaW5zOwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBNQU5ZX1NFR01FTlRTCi1zZWdtZW50X2luZm9fdHlwZSBzZWdtZW50X2luZm9bU0VHX01BWElNVU1fT1JESU5BTF07Ci0KLSNlbHNlCi0vKiBDb21tZW50ZWQgaW4gInN1YnNlZ3MuaCIuICovCi1mcmNoYWluUyAqZGF0YTBfZnJjaGFpblAsICpic3MwX2ZyY2hhaW5QOwotCi0jZW5kaWYgLyogTUFOWV9TRUdNRU5UUyAqLwotY2hhciBjb25zdCAqY29uc3Qgc2VnX25hbWVbXSA9Ci17Ci0gICJhYnNvbHV0ZSIsCi0jaWZkZWYgTUFOWV9TRUdNRU5UUwotICAiZTAiLCAiZTEiLCAiZTIiLCAiZTMiLCAiZTQiLCAiZTUiLCAiZTYiLCAiZTciLCAiZTgiLCAiZTkiLAotICAiZTEwIiwgImUxMSIsICJlMTIiLCAiZTEzIiwgImUxNCIsICJlMTUiLCAiZTE2IiwgImUxNyIsICJlMTgiLCAiZTE5IiwKLSAgImUyMCIsICJlMjEiLCAiZTIyIiwgImUyMyIsICJlMjQiLCAiZTI1IiwgImUyNiIsICJlMjciLCAiZTI4IiwgImUyOSIsCi0gICJlMzAiLCAiZTMxIiwgImUzMiIsICJlMzMiLCAiZTM0IiwgImUzNSIsICJlMzYiLCAiZTM3IiwgImUzOCIsICJlMzkiLAotI2Vsc2UKLSAgInRleHQiLAotICAiZGF0YSIsCi0gICJic3MiLAotI2VuZGlmIC8qIE1BTllfU0VHTUVOVFMgKi8KLSAgInVua25vd24iLAotICAiQVNTRU1CTEVSLUlOVEVSTkFMLUxPR0lDLUVSUk9SISIsCi0gICJleHByIiwKLSAgImRlYnVnIiwKLSAgInRyYW5zZmVydCB2ZWN0b3IgcHJlbG9hZCIsCi0gICJ0cmFuc2ZlcnQgdmVjdG9yIHBvc3Rsb2FkIiwKLSAgInJlZ2lzdGVyIiwKLSAgIiIsCi19OwkJCQkvKiBVc2VkIGJ5IGVycm9yIHJlcG9ydGVycywgZHVtcGVycyBldGMuICovCi0jZWxzZSAvKiBCRkRfQVNTRU1CTEVSICovCi0KLS8qIEdhcyBzZWdtZW50IGluZm9ybWF0aW9uIGZvciBiZmRfYWJzX3NlY3Rpb25fcHRyIGFuZAotICAgYmZkX3VuZF9zZWN0aW9uX3B0ci4gICovCi1zdGF0aWMgc2VnbWVudF9pbmZvX3R5cGUgKmFic19zZWdfaW5mbzsKLXN0YXRpYyBzZWdtZW50X2luZm9fdHlwZSAqdW5kX3NlZ19pbmZvOwotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi1zdGF0aWMgdm9pZCBzdWJzZWdfc2V0X3Jlc3QgUEFSQU1TICgoc2VnVCwgc3Vic2VnVCkpOwotCi1zdGF0aWMgZnJhZ1MgZHVtbXlfZnJhZzsKLQotc3RhdGljIGZyY2hhaW5TIGFic29sdXRlX2ZyY2hhaW47Ci0MCi12b2lkCi1zdWJzZWdzX2JlZ2luICgpCi17Ci0gIC8qIENoZWNrIHRhYmxlKHMpIHNlZ19uYW1lW10sIHNlZ19OX1RZUEVbXSBpcyBpbiBjb3JyZWN0IG9yZGVyICovCi0jaWYgIWRlZmluZWQgKE1BTllfU0VHTUVOVFMpICYmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICBrbm93IChTRUdfQUJTT0xVVEUgPT0gMCk7Ci0gIGtub3cgKFNFR19URVhUID09IDEpOwotICBrbm93IChTRUdfREFUQSA9PSAyKTsKLSAga25vdyAoU0VHX0JTUyA9PSAzKTsKLSAga25vdyAoU0VHX1VOS05PV04gPT0gNCk7Ci0gIGtub3cgKFNFR19HT09GID09IDUpOwotICBrbm93IChTRUdfRVhQUiA9PSA2KTsKLSAga25vdyAoU0VHX0RFQlVHID09IDcpOwotICBrbm93IChTRUdfTlRWID09IDgpOwotICBrbm93IChTRUdfUFRWID09IDkpOwotICBrbm93IChTRUdfUkVHSVNURVIgPT0gMTApOwotICBrbm93IChTRUdfTUFYSU1VTV9PUkRJTkFMID09IFNFR19SRUdJU1RFUik7Ci0jZW5kaWYKLQotICBvYnN0YWNrX2JlZ2luICgmZnJjaGFpbnMsIGNodW5rc2l6ZSk7Ci0jaWYgX19HTlVDX18gPj0gMgotICBvYnN0YWNrX2FsaWdubWVudF9tYXNrICgmZnJjaGFpbnMpID0gX19hbGlnbm9mX18gKGZyY2hhaW5TKSAtIDE7Ci0jZW5kaWYKLQotICBmcmNoYWluX3Jvb3QgPSBOVUxMOwotICBmcmNoYWluX25vdyA9IE5VTEw7CQkvKiBXYXJuIG5ld19zdWJzZWcoKSB0aGF0IHdlIGFyZSBib290aW5nLiAqLwotCi0gIGZyYWdfbm93ID0gJmR1bW15X2ZyYWc7Ci0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICBub3dfc3Vic2VnID0gNDI7CQkvKiBMaWUgZm9yIDFzdCBjYWxsIHRvIHN1YnNlZ19uZXcuICovCi0jaWZkZWYgTUFOWV9TRUdNRU5UUwotICB7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICAgIHsKLQlzdWJzZWdfc2V0IChpLCAwKTsKLQlzZWdtZW50X2luZm9baV0uZnJjaGFpblAgPSBmcmNoYWluX25vdzsKLSAgICAgIH0KLSAgfQotI2Vsc2UKLSAgc3Vic2VnX3NldCAoU0VHX0RBVEEsIDApOwkvKiAuZGF0YSAwICovCi0gIGRhdGEwX2ZyY2hhaW5QID0gZnJjaGFpbl9ub3c7Ci0KLSAgc3Vic2VnX3NldCAoU0VHX0JTUywgMCk7Ci0gIGJzczBfZnJjaGFpblAgPSBmcmNoYWluX25vdzsKLQotI2VuZGlmIC8qICEgTUFOWV9TRUdNRU5UUyAqLwotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0gIGFic29sdXRlX2ZyY2hhaW4uZnJjaF9zZWcgPSBhYnNvbHV0ZV9zZWN0aW9uOwotICBhYnNvbHV0ZV9mcmNoYWluLmZyY2hfc3Vic2VnID0gMDsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGFic29sdXRlX2ZyY2hhaW4uZml4X3Jvb3QgPSBhYnNvbHV0ZV9mcmNoYWluLmZpeF90YWlsID0gMDsKLSNlbmRpZgotICBhYnNvbHV0ZV9mcmNoYWluLmZyY2hfZnJhZ19ub3cgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0gIGFic29sdXRlX2ZyY2hhaW4uZnJjaF9yb290ID0gYWJzb2x1dGVfZnJjaGFpbi5mcmNoX2xhc3QgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci19Ci0MCi0vKgotICoJCQlzdWJzZWdfY2hhbmdlKCkKLSAqCi0gKiBDaGFuZ2UgdGhlIHN1YnNlZ21lbnQgd2UgYXJlIGluLCBCVVQgRE8gTk9UIE1BS0UgQSBORVcgRlJBRyBmb3IgdGhlCi0gKiBzdWJzZWdtZW50LiBJZiB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBzdWJzZWdtZW50LCBjaGFuZ2Ugbm90aGluZy4KLSAqIFRoaXMgaXMgdXNlZCBlZyBhcyBhIHdvcmtlciBmb3Igc3Vic2VnX3NldCBbd2hpY2ggZG9lcyBtYWtlIGEgbmV3IGZyYWdfbm93XQotICogYW5kIGZvciBjaGFuZ2luZyBzZWdtZW50cyBhZnRlciB3ZSBoYXZlIHJlYWQgdGhlIHNvdXJjZS4gV2UgY29uc3RydWN0IGVnCi0gKiBmaXhTcyBldmVuIGFmdGVyIHRoZSBzb3VyY2UgZmlsZSBpcyByZWFkLCBzbyB3ZSBkbyBoYXZlIHRvIGtlZXAgdGhlCi0gKiBzZWdtZW50IGNvbnRleHQgY29ycmVjdC4KLSAqLwotdm9pZAotc3Vic2VnX2NoYW5nZSAoc2VnLCBzdWJzZWcpCi0gICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnOwotICAgICByZWdpc3RlciBpbnQgc3Vic2VnOwotewotICBub3dfc2VnID0gc2VnOwotICBub3dfc3Vic2VnID0gc3Vic2VnOwotCi0gIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgcmV0dXJuOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICB7Ci0gICAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0gICAgc2VnaW5mbyA9IChzZWdtZW50X2luZm9fdHlwZSAqKSBiZmRfZ2V0X3NlY3Rpb25fdXNlcmRhdGEgKHN0ZG91dHB1dCwgc2VnKTsKLSAgICBpZiAoISBzZWdpbmZvKQotICAgICAgewotCXNlZ2luZm8gPSAoc2VnbWVudF9pbmZvX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICgqc2VnaW5mbykpOwotCW1lbXNldCAoKFBUUikgc2VnaW5mbywgMCwgc2l6ZW9mICgqc2VnaW5mbykpOwotCXNlZ2luZm8tPmZpeF9yb290ID0gTlVMTDsKLQlzZWdpbmZvLT5maXhfdGFpbCA9IE5VTEw7Ci0Jc2VnaW5mby0+YmZkX3NlY3Rpb24gPSBzZWc7Ci0Jc2VnaW5mby0+c3ltID0gMDsKLQlpZiAoc2VnID09IGJmZF9hYnNfc2VjdGlvbl9wdHIpCi0JICBhYnNfc2VnX2luZm8gPSBzZWdpbmZvOwotCWVsc2UgaWYgKHNlZyA9PSBiZmRfdW5kX3NlY3Rpb25fcHRyKQotCSAgdW5kX3NlZ19pbmZvID0gc2VnaW5mbzsKLQllbHNlCi0JICBiZmRfc2V0X3NlY3Rpb25fdXNlcmRhdGEgKHN0ZG91dHB1dCwgc2VnLCAoUFRSKSBzZWdpbmZvKTsKLSAgICAgIH0KLSAgfQotI2Vsc2UKLSNpZmRlZiBNQU5ZX1NFR01FTlRTCi0gIHNlZ19maXhfcm9vdFAgPSAmc2VnbWVudF9pbmZvW3NlZ10uZml4X3Jvb3Q7Ci0gIHNlZ19maXhfdGFpbFAgPSAmc2VnbWVudF9pbmZvW3NlZ10uZml4X3RhaWw7Ci0jZWxzZQotICBpZiAoc2VnID09IFNFR19EQVRBKQotICAgIHsKLSAgICAgIHNlZ19maXhfcm9vdFAgPSAmZGF0YV9maXhfcm9vdDsKLSAgICAgIHNlZ19maXhfdGFpbFAgPSAmZGF0YV9maXhfdGFpbDsKLSAgICB9Ci0gIGVsc2UgaWYgKHNlZyA9PSBTRUdfVEVYVCkKLSAgICB7Ci0gICAgICBzZWdfZml4X3Jvb3RQID0gJnRleHRfZml4X3Jvb3Q7Ci0gICAgICBzZWdfZml4X3RhaWxQID0gJnRleHRfZml4X3RhaWw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAga25vdyAoc2VnID09IFNFR19CU1MpOwotICAgICAgc2VnX2ZpeF9yb290UCA9ICZic3NfZml4X3Jvb3Q7Ci0gICAgICBzZWdfZml4X3RhaWxQID0gJmJzc19maXhfdGFpbDsKLSAgICB9Ci0KLSNlbmRpZgotI2VuZGlmCi19Ci0MCi1zdGF0aWMgdm9pZAotc3Vic2VnX3NldF9yZXN0IChzZWcsIHN1YnNlZykKLSAgICAgc2VnVCBzZWc7Ci0gICAgIHN1YnNlZ1Qgc3Vic2VnOwotewotICByZWdpc3RlciBmcmNoYWluUyAqZnJjUDsJLyogY3Jhd2wgZnJjaGFpbiBjaGFpbiAqLwotICByZWdpc3RlciBmcmNoYWluUyAqKmxhc3RQUDsJLyogYWRkcmVzcyBvZiBsYXN0IHBvaW50ZXIgKi8KLSAgZnJjaGFpblMgKm5ld1A7CQkvKiBhZGRyZXNzIG9mIG5ldyBmcmNoYWluICovCi0KLSAgbXJpX2NvbW1vbl9zeW1ib2wgPSBOVUxMOwotCi0gIGlmIChmcmFnX25vdyAmJiBmcmNoYWluX25vdykKLSAgICBmcmNoYWluX25vdy0+ZnJjaF9mcmFnX25vdyA9IGZyYWdfbm93OwotCi0gIGFzc2VydCAoZnJjaGFpbl9ub3cgPT0gMAotCSAgfHwgbm93X3NlZyA9PSB1bmRlZmluZWRfc2VjdGlvbgotCSAgfHwgbm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uCi0JICB8fCBmcmNoYWluX25vdy0+ZnJjaF9sYXN0ID09IGZyYWdfbm93KTsKLQotICBzdWJzZWdfY2hhbmdlIChzZWcsIChpbnQpIHN1YnNlZyk7Ci0KLSAgaWYgKHNlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGZyY2hhaW5fbm93ID0gJmFic29sdXRlX2ZyY2hhaW47Ci0gICAgICBmcmFnX25vdyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYXNzZXJ0IChmcmNoYWluX25vdyA9PSAwCi0JICB8fCBub3dfc2VnID09IHVuZGVmaW5lZF9zZWN0aW9uCi0JICB8fCBmcmNoYWluX25vdy0+ZnJjaF9sYXN0ID09IGZyYWdfbm93KTsKLQotICAvKgotICAgKiBBdHRlbXB0IHRvIGZpbmQgb3IgbWFrZSBhIGZyY2hhaW4gZm9yIHRoYXQgc3ViIHNlZy4KLSAgICogQ3Jhd2wgYWxvbmcgY2hhaW4gb2YgZnJjaGFpblNzLCBiZWdpbnMgQCBmcmNoYWluX3Jvb3QuCi0gICAqIElmIHdlIG5lZWQgdG8gbWFrZSBhIGZyY2hhaW5TLCBsaW5rIGl0IGludG8gY29ycmVjdAotICAgKiBwb3NpdGlvbiBvZiBjaGFpbiByb290ZWQgaW4gZnJjaGFpbl9yb290LgotICAgKi8KLSAgZm9yIChmcmNQID0gKihsYXN0UFAgPSAmZnJjaGFpbl9yb290KTsKLSAgICAgICBmcmNQICYmIGZyY1AtPmZyY2hfc2VnIDw9IHNlZzsKLSAgICAgICBmcmNQID0gKihsYXN0UFAgPSAmZnJjUC0+ZnJjaF9uZXh0KSkKLSAgICB7Ci0gICAgICBpZiAoZnJjUC0+ZnJjaF9zZWcgPT0gc2VnCi0JICAmJiBmcmNQLT5mcmNoX3N1YnNlZyA+PSBzdWJzZWcpCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgLyoKLSAgICogZnJjUDoJCUFkZHJlc3Mgb2YgdGhlIDFzdCBmcmNoYWluUyBpbiBjb3JyZWN0IHNlZ21lbnQgd2l0aAotICAgKgkJZnJjaF9zdWJzZWcgPj0gc3Vic2VnLgotICAgKgkJV2Ugd2FudCB0byBlaXRoZXIgdXNlIHRoaXMgZnJjaGFpblMsIG9yIHdlIHdhbnQKLSAgICoJCXRvIGluc2VydCBhIG5ldyBmcmNoYWluUyBqdXN0IGJlZm9yZSBpdC4KLSAgICoKLSAgICoJCUlmIGZyY1A9PU5VTEwsIHRoZW4gd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGNoYWluCi0gICAqCQlvZiBmcmNoYWluUy1zLiBBIE5VTEwgZnJjUCBtZWFucyB3ZSBmZWxsIG9mZiB0aGUgZW5kCi0gICAqCQlvZiB0aGUgY2hhaW4gbG9va2luZyBmb3IgYQotICAgKgkJZnJjaF9zdWJzZWcgPj0gc3Vic2VnLCBzbyB3ZQotICAgKgkJbXVzdCBtYWtlIGEgbmV3IGZyY2hhaW5TLgotICAgKgotICAgKgkJSWYgd2UgZXZlciBtYWludGFpbiBhIHBvaW50ZXIgdG8KLSAgICoJCXRoZSBsYXN0IGZyY2hhaW5TIGluIHRoZSBjaGFpbiwgd2UgY2hhbmdlIHRoYXQgcG9pbnRlcgotICAgKgkJT05MWSB3aGVuIGZyY1A9PU5VTEwuCi0gICAqCi0gICAqIGxhc3RQUDoJQWRkcmVzcyBvZiB0aGUgcG9pbnRlciB3aXRoIHZhbHVlIGZyY1A7Ci0gICAqCQlOZXZlciBOVUxMLgotICAgKgkJTWF5IHBvaW50IHRvIGZyY2hhaW5fcm9vdC4KLSAgICoKLSAgICovCi0gIGlmICghZnJjUAotICAgICAgfHwgKGZyY1AtPmZyY2hfc2VnID4gc2VnCi0JICB8fCBmcmNQLT5mcmNoX3N1YnNlZyA+IHN1YnNlZykpCS8qIEtpbmt5IGxvZ2ljIG9ubHkgd29ya3Mgd2l0aCAyIHNlZ21lbnRzLiAqLwotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBUaGlzIHNob3VsZCBiZSB0aGUgb25seSBjb2RlIHRoYXQgY3JlYXRlcyBhIGZyY2hhaW5TLgotICAgICAgICovCi0gICAgICBuZXdQID0gKGZyY2hhaW5TICopIG9ic3RhY2tfYWxsb2MgKCZmcmNoYWlucywgc2l6ZW9mIChmcmNoYWluUykpOwotICAgICAgbmV3UC0+ZnJjaF9zdWJzZWcgPSBzdWJzZWc7Ci0gICAgICBuZXdQLT5mcmNoX3NlZyA9IHNlZzsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBuZXdQLT5maXhfcm9vdCA9IE5VTEw7Ci0gICAgICBuZXdQLT5maXhfdGFpbCA9IE5VTEw7Ci0jZW5kaWYKLSAgICAgIG9ic3RhY2tfYmVnaW4gKCZuZXdQLT5mcmNoX29ic3RhY2ssIGNodW5rc2l6ZSk7Ci0jaWYgX19HTlVDX18gPj0gMgotICAgICAgb2JzdGFja19hbGlnbm1lbnRfbWFzayAoJm5ld1AtPmZyY2hfb2JzdGFjaykgPSBfX2FsaWdub2ZfXyAoZnJhZ1MpIC0gMTsKLSNlbmRpZgotICAgICAgbmV3UC0+ZnJjaF9mcmFnX25vdyA9IGZyYWdfYWxsb2MgKCZuZXdQLT5mcmNoX29ic3RhY2spOwotICAgICAgbmV3UC0+ZnJjaF9mcmFnX25vdy0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0KLSAgICAgIG5ld1AtPmZyY2hfcm9vdCA9IG5ld1AtPmZyY2hfbGFzdCA9IG5ld1AtPmZyY2hfZnJhZ19ub3c7Ci0KLSAgICAgICpsYXN0UFAgPSBuZXdQOwotICAgICAgbmV3UC0+ZnJjaF9uZXh0ID0gZnJjUDsJLyogcGVyaGFwcyBOVUxMICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICB7Ci0Jc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0Jc2VnaW5mbyA9IHNlZ19pbmZvIChzZWcpOwotCWlmIChzZWdpbmZvICYmIHNlZ2luZm8tPmZyY2hhaW5QID09IGZyY1ApCi0JICBzZWdpbmZvLT5mcmNoYWluUCA9IG5ld1A7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIAotICAgICAgZnJjUCA9IG5ld1A7Ci0gICAgfQotICAvKgotICAgKiBIZXJlIHdpdGggZnJjUCBwb2ludGluZyB0byB0aGUgZnJjaGFpblMgZm9yIHN1YnNlZy4KLSAgICovCi0gIGZyY2hhaW5fbm93ID0gZnJjUDsKLSAgZnJhZ19ub3cgPSBmcmNQLT5mcmNoX2ZyYWdfbm93OwotCi0gIGFzc2VydCAoZnJjaGFpbl9ub3ctPmZyY2hfbGFzdCA9PSBmcmFnX25vdyk7Ci19Ci0KLS8qCi0gKgkJCXN1YnNlZ19zZXQoc2VnVCwgc3Vic2VnVCkKLSAqCi0gKiBJZiB5b3UgYXR0ZW1wdCB0byBjaGFuZ2UgdG8gdGhlIGN1cnJlbnQgc3Vic2VnbWVudCwgbm90aGluZyBoYXBwZW5zLgotICoKLSAqIEluOglzZWdULCBzdWJzZWdUIGNvZGUgZm9yIG5ldyBzdWJzZWdtZW50LgotICoJZnJhZ19ub3cgLT4gaW5jb21wbGV0ZSBmcmFnIGZvciBjdXJyZW50IHN1YnNlZ21lbnQuCi0gKglJZiBmcmFnX25vdz09TlVMTCwgdGhlbiB0aGVyZSBpcyBubyBvbGQsIGluY29tcGxldGUgZnJhZywgc28KLSAqCXRoZSBvbGQgZnJhZyBpcyBub3QgY2xvc2VkIG9mZi4KLSAqCi0gKiBPdXQ6CW5vd19zdWJzZWcsIG5vd19zZWcgdXBkYXRlZC4KLSAqCUZyY2hhaW5fbm93IHBvaW50cyB0byB0aGUgKHBvc3NpYmx5IG5ldykgc3RydWN0IGZyY2hhaW4gZm9yIHRoaXMKLSAqCXN1Yi1zZWdtZW50LgotICoJRnJjaGFpbl9yb290IHVwZGF0ZWQgaWYgbmVlZGVkLgotICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotCi1zZWdUCi1zdWJzZWdfbmV3IChzZWduYW1lLCBzdWJzZWcpCi0gICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0gICAgIHN1YnNlZ1Qgc3Vic2VnOwotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgKGludCkgU0VHX01BWElNVU1fT1JESU5BTDsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnM7Ci0KLSAgICAgIHMgPSBzZWdtZW50X25hbWUgKChzZWdUKSBpKTsKLSAgICAgIGlmIChzdHJjbXAgKHNlZ25hbWUsIHMpID09IDAKLQkgIHx8IChzZWduYW1lWzBdID09ICcuJwotCSAgICAgICYmIHN0cmNtcCAoc2VnbmFtZSArIDEsIHMpID09IDApKQotCXsKLQkgIHN1YnNlZ19zZXQgKChzZWdUKSBpLCBzdWJzZWcpOwotCSAgcmV0dXJuIChzZWdUKSBpOwotCX0KLSNpZmRlZiBvYmpfc2VnbWVudF9uYW1lCi0gICAgICBzID0gb2JqX3NlZ21lbnRfbmFtZSAoKHNlZ1QpIGkpOwotICAgICAgaWYgKHN0cmNtcCAoc2VnbmFtZSwgcykgPT0gMAotCSAgfHwgKHNlZ25hbWVbMF0gPT0gJy4nCi0JICAgICAgJiYgc3RyY21wIChzZWduYW1lICsgMSwgcykgPT0gMCkpCi0JewotCSAgc3Vic2VnX3NldCAoKHNlZ1QpIGksIHN1YnNlZyk7Ci0JICByZXR1cm4gKHNlZ1QpIGk7Ci0JfQotI2VuZGlmCi0gICAgfQotCi0jaWZkZWYgb2JqX2FkZF9zZWdtZW50Ci0gIHsKLSAgICBzZWdUIG5ld19zZWc7Ci0gICAgbmV3X3NlZyA9IG9ial9hZGRfc2VnbWVudCAoc2VnbmFtZSk7Ci0gICAgc3Vic2VnX3NldCAobmV3X3NlZywgc3Vic2VnKTsKLSAgICByZXR1cm4gbmV3X3NlZzsKLSAgfQotI2Vsc2UKLSAgYXNfYmFkIChfKCJBdHRlbXB0IHRvIHN3aXRjaCB0byBub25leGlzdGVudCBzZWdtZW50IFwiJXNcIiIpLCBzZWduYW1lKTsKLSAgcmV0dXJuIG5vd19zZWc7Ci0jZW5kaWYKLX0KLQotdm9pZAotc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpCS8qIGJlZ2luIGFzc2VtYmx5IGZvciBhIG5ldyBzdWItc2VnbWVudCAqLwotICAgICByZWdpc3RlciBzZWdUIHNlZzsJCS8qIFNFR19EQVRBIG9yIFNFR19URVhUICovCi0gICAgIHJlZ2lzdGVyIHN1YnNlZ1Qgc3Vic2VnOwotewotI2lmbmRlZiBNQU5ZX1NFR01FTlRTCi0gIGtub3cgKHNlZyA9PSBTRUdfREFUQQotCXx8IHNlZyA9PSBTRUdfVEVYVAotCXx8IHNlZyA9PSBTRUdfQlNTCi0JfHwgc2VnID09IFNFR19BQlNPTFVURSk7Ci0jZW5kaWYKLQotICBpZiAoc2VnICE9IG5vd19zZWcgfHwgc3Vic2VnICE9IG5vd19zdWJzZWcpCi0gICAgewkJCQkvKiB3ZSBqdXN0IGNoYW5nZWQgc3ViLXNlZ21lbnRzICovCi0gICAgICBzdWJzZWdfc2V0X3Jlc3QgKHNlZywgc3Vic2VnKTsKLSAgICB9Ci0gIG1yaV9jb21tb25fc3ltYm9sID0gTlVMTDsKLX0KLQotI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLwotCi1zZWdUCi1zdWJzZWdfZ2V0IChzZWduYW1lLCBmb3JjZV9uZXcpCi0gICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0gICAgIGludCBmb3JjZV9uZXc7Ci17Ci0gIHNlZ1Qgc2VjcHRyOwotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbzsKLSAgY29uc3QgY2hhciAqbm93X3NlZ19uYW1lID0gKG5vd19zZWcKLQkJCSAgICAgID8gYmZkX2dldF9zZWN0aW9uX25hbWUgKHN0ZG91dHB1dCwgbm93X3NlZykKLQkJCSAgICAgIDogMCk7Ci0KLSAgaWYgKCFmb3JjZV9uZXcKLSAgICAgICYmIG5vd19zZWdfbmFtZQotICAgICAgJiYgKG5vd19zZWdfbmFtZSA9PSBzZWduYW1lCi0JICB8fCAhc3RyY21wIChub3dfc2VnX25hbWUsIHNlZ25hbWUpKSkKLSAgICByZXR1cm4gbm93X3NlZzsKLQotICBpZiAoIWZvcmNlX25ldykKLSAgICBzZWNwdHIgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHN0ZG91dHB1dCwgc2VnbmFtZSk7Ci0gIGVsc2UKLSAgICBzZWNwdHIgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoc3Rkb3V0cHV0LCBzZWduYW1lKTsKLQotICBzZWdpbmZvID0gc2VnX2luZm8gKHNlY3B0cik7Ci0gIGlmICghIHNlZ2luZm8pCi0gICAgewotICAgICAgLyogQ2hlY2sgd2hldGhlciBvdXRwdXRfc2VjdGlvbiBpcyBzZXQgZmlyc3QgYmVjYXVzZSBzZWNwdHIgbWF5Ci0gICAgICAgICBiZSBiZmRfYWJzX3NlY3Rpb25fcHRyLiAgKi8KLSAgICAgIGlmIChzZWNwdHItPm91dHB1dF9zZWN0aW9uICE9IHNlY3B0cikKLQlzZWNwdHItPm91dHB1dF9zZWN0aW9uID0gc2VjcHRyOwotICAgICAgc2VnaW5mbyA9IChzZWdtZW50X2luZm9fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKCpzZWdpbmZvKSk7Ci0gICAgICBtZW1zZXQgKChQVFIpIHNlZ2luZm8sIDAsIHNpemVvZiAoKnNlZ2luZm8pKTsKLSAgICAgIHNlZ2luZm8tPmZpeF9yb290ID0gTlVMTDsKLSAgICAgIHNlZ2luZm8tPmZpeF90YWlsID0gTlVMTDsKLSAgICAgIHNlZ2luZm8tPmJmZF9zZWN0aW9uID0gc2VjcHRyOwotICAgICAgaWYgKHNlY3B0ciA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQotCWFic19zZWdfaW5mbyA9IHNlZ2luZm87Ci0gICAgICBlbHNlIGlmIChzZWNwdHIgPT0gYmZkX3VuZF9zZWN0aW9uX3B0cikKLQl1bmRfc2VnX2luZm8gPSBzZWdpbmZvOwotICAgICAgZWxzZQotCWJmZF9zZXRfc2VjdGlvbl91c2VyZGF0YSAoc3Rkb3V0cHV0LCBzZWNwdHIsIChQVFIpIHNlZ2luZm8pOwotICAgICAgc2VnaW5mby0+ZnJjaGFpblAgPSBOVUxMOwotICAgICAgc2VnaW5mby0+bGluZW5vX2xpc3RfaGVhZCA9IHNlZ2luZm8tPmxpbmVub19saXN0X3RhaWwgPSBOVUxMOwotICAgICAgc2VnaW5mby0+c3ltID0gTlVMTDsKLSAgICAgIHNlZ2luZm8tPmRvdCA9IE5VTEw7Ci0gICAgfQotICByZXR1cm4gc2VjcHRyOwotfQotCi1zZWdUCi1zdWJzZWdfbmV3IChzZWduYW1lLCBzdWJzZWcpCi0gICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0gICAgIHN1YnNlZ1Qgc3Vic2VnOwotewotICBzZWdUIHNlY3B0cjsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0KLSAgc2VjcHRyID0gc3Vic2VnX2dldCAoc2VnbmFtZSwgMCk7Ci0gIHN1YnNlZ19zZXRfcmVzdCAoc2VjcHRyLCBzdWJzZWcpOwotICBzZWdpbmZvID0gc2VnX2luZm8gKHNlY3B0cik7Ci0gIGlmICghIHNlZ2luZm8tPmZyY2hhaW5QKQotICAgIHNlZ2luZm8tPmZyY2hhaW5QID0gZnJjaGFpbl9ub3c7Ci0gIHJldHVybiBzZWNwdHI7Ci19Ci0KLS8qIExpa2Ugc3Vic2VnX25ldywgZXhjZXB0IGEgbmV3IHNlY3Rpb24gaXMgYWx3YXlzIGNyZWF0ZWQsIGV2ZW4gaWYKLSAgIGEgc2VjdGlvbiB3aXRoIHRoYXQgbmFtZSBhbHJlYWR5IGV4aXN0cy4gICovCi1zZWdUCi1zdWJzZWdfZm9yY2VfbmV3IChzZWduYW1lLCBzdWJzZWcpCi0gICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0gICAgIHN1YnNlZ1Qgc3Vic2VnOwotewotICBzZWdUIHNlY3B0cjsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0KLSAgc2VjcHRyID0gc3Vic2VnX2dldCAoc2VnbmFtZSwgMSk7Ci0gIHN1YnNlZ19zZXRfcmVzdCAoc2VjcHRyLCBzdWJzZWcpOwotICBzZWdpbmZvID0gc2VnX2luZm8gKHNlY3B0cik7Ci0gIGlmICghIHNlZ2luZm8tPmZyY2hhaW5QKQotICAgIHNlZ2luZm8tPmZyY2hhaW5QID0gZnJjaGFpbl9ub3c7Ci0gIHJldHVybiBzZWNwdHI7Ci19Ci0KLXZvaWQKLXN1YnNlZ19zZXQgKHNlY3B0ciwgc3Vic2VnKQotICAgICBzZWdUIHNlY3B0cjsKLSAgICAgc3Vic2VnVCBzdWJzZWc7Ci17Ci0gIGlmICghIChzZWNwdHIgPT0gbm93X3NlZyAmJiBzdWJzZWcgPT0gbm93X3N1YnNlZykpCi0gICAgc3Vic2VnX3NldF9yZXN0IChzZWNwdHIsIHN1YnNlZyk7Ci0gIG1yaV9jb21tb25fc3ltYm9sID0gTlVMTDsKLX0KLQotI2lmbmRlZiBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MKLSNkZWZpbmUgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKFNFQykJMAotI2VuZGlmCi0KLS8qIEdldCB0aGUgZ2FzIGluZm9ybWF0aW9uIHdlIGFyZSBzdG9yaW5nIGZvciBhIHNlY3Rpb24uICAqLwotCi1zZWdtZW50X2luZm9fdHlwZSAqCi1zZWdfaW5mbyAoc2VjKQotICAgICBzZWdUIHNlYzsKLXsKLSAgaWYgKHNlYyA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQotICAgIHJldHVybiBhYnNfc2VnX2luZm87Ci0gIGVsc2UgaWYgKHNlYyA9PSBiZmRfdW5kX3NlY3Rpb25fcHRyKQotICAgIHJldHVybiB1bmRfc2VnX2luZm87Ci0gIGVsc2UKLSAgICByZXR1cm4gKHNlZ21lbnRfaW5mb190eXBlICopIGJmZF9nZXRfc2VjdGlvbl91c2VyZGF0YSAoc3Rkb3V0cHV0LCBzZWMpOwotfQotCi1zeW1ib2xTICoKLXNlY3Rpb25fc3ltYm9sIChzZWMpCi0gICAgIHNlZ1Qgc2VjOwotewotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBzeW1ib2xTICpzOwotCi0gIGlmIChzZWdpbmZvID09IDApCi0gICAgYWJvcnQgKCk7Ci0gIGlmIChzZWdpbmZvLT5zeW0pCi0gICAgcmV0dXJuIHNlZ2luZm8tPnN5bTsKLQotI2lmbmRlZiBFTUlUX1NFQ1RJT05fU1lNQk9MUwotI2RlZmluZSBFTUlUX1NFQ1RJT05fU1lNQk9MUyAxCi0jZW5kaWYKLQotICBpZiAoISBFTUlUX1NFQ1RJT05fU1lNQk9MUwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIHx8IHN5bWJvbF90YWJsZV9mcm96ZW4KLSNlbmRpZgotICAgICAgKQotICAgIHsKLSAgICAgIC8qIEhlcmUgd2Uga25vdyBpdCB3b24ndCBiZSBnb2luZyBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICAgICAgcyA9IHN5bWJvbF9jcmVhdGUgKHNlYy0+bmFtZSwgc2VjLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHMgPSBzeW1ib2xfZmluZF9iYXNlIChzZWMtPm5hbWUsIDApOwotICAgICAgaWYgKHMgPT0gTlVMTCkKLQlzID0gc3ltYm9sX25ldyAoc2VjLT5uYW1lLCBzZWMsIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKFNfR0VUX1NFR01FTlQgKHMpID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgU19TRVRfU0VHTUVOVCAocywgc2VjKTsKLQkgICAgICBzLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBTX0NMRUFSX0VYVEVSTkFMIChzKTsKLQotICAvKiBVc2UgdGhlIEJGRCBzZWN0aW9uIHN5bWJvbCwgaWYgcG9zc2libGUuICAqLwotICBpZiAob2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jIChzZWMpKQotICAgIHMtPmJzeW0gPSBzZWMtPnN5bWJvbDsKLQotICBzZWdpbmZvLT5zeW0gPSBzOwotICByZXR1cm4gczsKLX0KLQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotdm9pZAotc3Vic2Vnc19wcmludF9zdGF0aXN0aWNzIChmaWxlKQotICAgICBGSUxFICpmaWxlOwotewotICBmcmNoYWluUyAqZnJjaHA7Ci0gIGZwcmludGYgKGZpbGUsICJmcmFnIGNoYWluczpcbiIpOwotICBmb3IgKGZyY2hwID0gZnJjaGFpbl9yb290OyBmcmNocDsgZnJjaHAgPSBmcmNocC0+ZnJjaF9uZXh0KQotICAgIHsKLSAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICBmcmFnUyAqZnJhZ3A7Ci0KLSAgICAgIC8qIElmIGZyY2hfc3Vic2VnIGlzIG5vbi16ZXJvLCBpdCdzIHByb2JhYmx5IGJlZW4gY2hhaW5lZCBvbnRvCi0JIHRoZSBlbmQgb2YgYSBwcmV2aW91cyBzdWJzZWN0aW9uLiAgRG9uJ3QgY291bnQgaXQgYWdhaW4uICAqLwotICAgICAgaWYgKGZyY2hwLT5mcmNoX3N1YnNlZyAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTa2lwIGdhcy1pbnRlcm5hbCBzZWN0aW9ucy4gICovCi0gICAgICBpZiAoc2VnbWVudF9uYW1lIChmcmNocC0+ZnJjaF9zZWcpWzBdID09ICcqJykKLQljb250aW51ZTsKLQotICAgICAgZm9yIChmcmFncCA9IGZyY2hwLT5mcmNoX3Jvb3Q7IGZyYWdwOyBmcmFncCA9IGZyYWdwLT5mcl9uZXh0KQotCXsKLSNpZiAwCi0JICBzd2l0Y2ggKGZyYWdwLT5mcl90eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgcnNfZmlsbDoKLQkgICAgICBmcHJpbnRmIChmaWxlLCAiZiIpOyBicmVhazsKLQkgICAgY2FzZSByc19hbGlnbjoKLQkgICAgICBmcHJpbnRmIChmaWxlLCAiYSIpOyBicmVhazsKLQkgICAgY2FzZSByc19hbGlnbl9jb2RlOgotCSAgICAgIGZwcmludGYgKGZpbGUsICJjIik7IGJyZWFrOwotCSAgICBjYXNlIHJzX29yZzoKLQkgICAgICBmcHJpbnRmIChmaWxlLCAibyIpOyBicmVhazsKLQkgICAgY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKLQkgICAgICBmcHJpbnRmIChmaWxlLCAibSIpOyBicmVhazsKLQkgICAgY2FzZSByc19zcGFjZToKLQkgICAgICBmcHJpbnRmIChmaWxlLCAicyIpOyBicmVhazsKLQkgICAgY2FzZSAwOgotCSAgICAgIGZwcmludGYgKGZpbGUsICIwIik7IGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGZwcmludGYgKGZpbGUsICI/Iik7IGJyZWFrOwotCSAgICB9Ci0jZW5kaWYKLQkgIGNvdW50Kys7Ci0JfQotICAgICAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiXHQlcCAlLTEwc1x0JTEwZCBmcmFnc1xuIiwgZnJjaHAsCi0JICAgICAgIHNlZ21lbnRfbmFtZSAoZnJjaHAtPmZyY2hfc2VnKSwgY291bnQpOwotICAgIH0KLX0KLQotLyogZW5kIG9mIHN1YnNlZ3MuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3N1YnNlZ3MuaCBiL2dhcy9zdWJzZWdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDBkNWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3N1YnNlZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKiBzdWJzZWdzLmggLT4gc3Vic2Vncy5jCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIEZvciBldmVyeSBzdWItc2VnbWVudCB0aGUgdXNlciBtZW50aW9ucyBpbiB0aGUgQVNzZW1ibGVyIHByb2dyYW0sCi0gKiB3ZSBtYWtlIG9uZSBzdHJ1Y3QgZnJjaGFpbi4gRWFjaCBzdWItc2VnbWVudCBoYXMgZXhhY3RseSBvbmUgc3RydWN0IGZyY2hhaW4KLSAqIGFuZCB2aWNlIHZlcnNhLgotICoKLSAqIFN0cnVjdCBmcmNoYWluJ3MgYXJlIGZvcndhcmQgY2hhaW5lZCAoaW4gYXNjZW5kaW5nIG9yZGVyIG9mIHN1Yi1zZWdtZW50Ci0gKiBjb2RlIG51bWJlcikuIFRoZSBjaGFpbiBydW5zIHRocm91Z2ggZnJjaF9uZXh0IG9mIGVhY2ggc3Vic2VnbWVudC4KLSAqIFRoaXMgbWFrZXMgaXQgaGFyZCB0byBmaW5kIGEgc3Vic2VnbWVudCdzIGZyYWdzCi0gKiBpZiBwcm9ncmFtbWVyIHVzZXMgYSBsb3Qgb2YgdGhlbS4gTW9zdCBwcm9ncmFtcyBvbmx5IHVzZSB0ZXh0MCBhbmQKLSAqIGRhdGEwLCBzbyB0aGV5IGRvbid0IHN1ZmZlci4gQXQgbGVhc3QgdGhpcyB3YXk6Ci0gKiAoMSkJVGhlcmUgYXJlIG5vICJhcmJpdHJhcnkiIHJlc3RyaWN0aW9ucyBvbiBob3cgbWFueSBzdWJzZWdtZW50cwotICoJY2FuIGJlIHByb2dyYW1tZWQ7Ci0gKiAoMikJU3Vic2VnbWVudHMnIGZyY2hhaW4tcyBhcmUgKGxhdGVyKSBjaGFpbmVkIHRvZ2V0aGVyIGluIHRoZSBvcmRlciBpbgotICoJd2hpY2ggdGhleSBhcmUgZW1pdHRlZCBmb3Igb2JqZWN0IGZpbGUgdml6IHRleHQgdGhlbiBkYXRhLgotICoKLSAqIEZyb20gZWFjaCBzdHJ1Y3QgZnJjaGFpbiBkYW5nbGVzIGEgY2hhaW4gb2Ygc3RydWN0IGZyYWdzLiBUaGUgZnJhZ3MKLSAqIHJlcHJlc2VudCBjb2RlIGZyYWdtZW50cywgZm9yIHRoYXQgc3ViLXNlZ21lbnQsIGZvcndhcmQgY2hhaW5lZC4KLSAqLwotCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi1zdHJ1Y3QgZnJjaGFpbgkJCS8qIGNvbnRyb2wgYnVpbGRpbmcgb2YgYSBmcmFnIGNoYWluICovCi17CQkJCS8qIEZSQ0ggPSBGUmFnbWVudCBDSGFpbiBjb250cm9sICovCi0gIHN0cnVjdCBmcmFnICpmcmNoX3Jvb3Q7CS8qIDFzdCBzdHJ1Y3QgZnJhZyBpbiBjaGFpbiwgb3IgTlVMTCAqLwotICBzdHJ1Y3QgZnJhZyAqZnJjaF9sYXN0OwkvKiBsYXN0IHN0cnVjdCBmcmFnIGluIGNoYWluLCBvciBOVUxMICovCi0gIHN0cnVjdCBmcmNoYWluICpmcmNoX25leHQ7CS8qIG5leHQgaW4gY2hhaW4gb2Ygc3RydWN0IGZyY2hhaW4tcyAqLwotICBzZWdUIGZyY2hfc2VnOwkJLyogU0VHX1RFWFQgb3IgU0VHX0RBVEEuICovCi0gIHN1YnNlZ1QgZnJjaF9zdWJzZWc7CQkvKiBzdWJzZWdtZW50IG51bWJlciBvZiB0aGlzIGNoYWluICovCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBmaXhTICpmaXhfcm9vdDsJCS8qIFJvb3Qgb2YgZml4dXBzIGZvciB0aGlzIHN1YnNlZ21lbnQuICAqLwotICBmaXhTICpmaXhfdGFpbDsJCS8qIExhc3QgZml4dXAgZm9yIHRoaXMgc3Vic2VnbWVudC4gICovCi0jZW5kaWYKLSAgc3RydWN0IG9ic3RhY2sgZnJjaF9vYnN0YWNrOwkvKiBmb3Igb2JqZWN0cyBpbiB0aGlzIGZyYWcgY2hhaW4gKi8KLSAgZnJhZ1MgKmZyY2hfZnJhZ19ub3c7CQkvKiBmcmFnX25vdyBmb3IgdGhpcyBzdWJzZWdtZW50ICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBmcmNoYWluIGZyY2hhaW5TOwotCi0vKiBBbGwgc3Vic2VnbWVudHMnIGNoYWlucyBoYW5nIG9mZiBoZXJlLiAgTlVMTCBtZWFucyBubyBmcmNoYWlucyB5ZXQuICAqLwotZXh0ZXJuIGZyY2hhaW5TICpmcmNoYWluX3Jvb3Q7Ci0KLS8qIEZyY2hhaW4gd2UgYXJlIGFzc2VtYmxpbmcgaW50byBub3cuICBUaGF0IGlzLCB0aGUgY3VycmVudCBzZWdtZW50J3MKLSAgIGZyYWcgY2hhaW4sIGV2ZW4gaWYgaXQgY29udGFpbnMgbm8gKGNvbXBsZXRlKSBmcmFncy4gKi8KLWV4dGVybiBmcmNoYWluUyAqZnJjaGFpbl9ub3c7Ci0KLQotdHlwZWRlZiBzdHJ1Y3Qgc2VnbWVudF9pbmZvX3N0cnVjdAotewotICBmcmNoYWluUyAqZnJjaGFpblA7Ci0gIHVuc2lnbmVkIGludCBoYWRvbmUgOiAxOwotCi0gIC8qIFRoaXMgZmllbGQgaXMgc2V0IGlmIHRoaXMgaXMgYSAuYnNzIHNlY3Rpb24gd2hpY2ggZG9lcyBub3QgcmVhbGx5Ci0gICAgIGhhdmUgYW55IGNvbnRlbnRzLiAgT25jZSB1cG9uIGEgdGltZSBhIC5ic3Mgc2VjdGlvbiBkaWQgbm90IGhhdmUKLSAgICAgYW55IGZyYWdzLCBidXQgdGhhdCBpcyBubyBsb25nZXIgdHJ1ZS4gIFRoaXMgZmllbGQgcHJldmVudCB0aGUKLSAgICAgU0VDX0hBU19DT05URU5UUyBmbGFnIGZyb20gYmVpbmcgc2V0IGZvciB0aGUgc2VjdGlvbiBldmVuIGlmCi0gICAgIHRoZXJlIGFyZSBmcmFncy4gICovCi0gIHVuc2lnbmVkIGludCBic3MgOiAxOwotCi0gIGludCB1c2VyX3N0dWZmOwotCi0gIC8qIEZpeHVwcyBmb3IgdGhpcyBzZWdtZW50LiAgSWYgQkZEX0FTU0VNQkxFUiwgdGhpcyBpcyBvbmx5IHZhbGlkCi0gICAgIGFmdGVyIHRoZSBmcmNoYWlucyBhcmUgcnVuIHRvZ2V0aGVyLiAgKi8KLSAgZml4UyAqZml4X3Jvb3Q7Ci0gIGZpeFMgKmZpeF90YWlsOwotCi0jaWYgZGVmaW5lZCAoTUFOWV9TRUdNRU5UUykgJiYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgc2NuaGRyOwotICBlbnVtIGxpbmtvbmNlX3R5cGUgbGlua29uY2U7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0jZW5kaWYKLQotICBzeW1ib2xTICpkb3Q7Ci0KLSAgc3RydWN0IGxpbmVub19saXN0ICpsaW5lbm9fbGlzdF9oZWFkOwotICBzdHJ1Y3QgbGluZW5vX2xpc3QgKmxpbmVub19saXN0X3RhaWw7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIC8qIFdoaWNoIEJGRCBzZWN0aW9uIGRvZXMgdGhpcyBnYXMgc2VnbWVudCBjb3JyZXNwb25kIHRvPyAgKi8KLSAgYXNlY3Rpb24gKmJmZF9zZWN0aW9uOwotCi0gIC8qIE5VTEwsIG9yIHBvaW50ZXIgdG8gdGhlIGdhcyBzeW1ib2wgdGhhdCBpcyB0aGUgc2VjdGlvbiBzeW1ib2wgZm9yCi0gICAgIHRoaXMgc2VjdGlvbi4gIHN5bS0+YnN5bSBhbmQgYmZkX3NlY3Rpb24tPnN5bWJvbCBzaG91bGQgYmUgdGhlIHNhbWUuICAqLwotICBzeW1ib2xTICpzeW07Ci0jZW5kaWYKLQotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIEN1cnJlbnQgc2l6ZSBvZiBzZWN0aW9uIGhvbGRpbmcgc3RhYnMgc3RyaW5ncy4gICovCi0gICAgICB1bnNpZ25lZCBsb25nIHN0YWJfc3RyaW5nX3NpemU7Ci0gICAgICAvKiBJbml0aWFsIGZyYWcgZm9yIEVMRi4gICovCi0gICAgICBjaGFyICpwOwotICAgIH0KLSAgc3RhYnU7Ci0KLSNpZmRlZiBORUVEX0xJVEVSQUxfUE9PTAotICB1bnNpZ25lZCBsb25nIGxpdGVyYWxfcG9vbF9zaXplOwotI2VuZGlmCi0KLSNpZmRlZiBUQ19TRUdNRU5UX0lORk9fVFlQRQotICBUQ19TRUdNRU5UX0lORk9fVFlQRSB0Y19zZWdtZW50X2luZm9fZGF0YTsKLSNlbmRpZgotfSBzZWdtZW50X2luZm9fdHlwZTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotZXh0ZXJuIHNlZ21lbnRfaW5mb190eXBlICpzZWdfaW5mbyBQQVJBTVMgKChzZWdUKSk7Ci1leHRlcm4gc3ltYm9sUyAqc2VjdGlvbl9zeW1ib2wgUEFSQU1TICgoc2VnVCkpOwotCi0jZWxzZSAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmZGVmIE1BTllfU0VHTUVOVFMKLQotZXh0ZXJuIHNlZ21lbnRfaW5mb190eXBlIHNlZ21lbnRfaW5mb1tdOwotCi0jZGVmaW5lIHNlZ19pbmZvKFNFQykJKCZzZWdtZW50X2luZm9bU0VDXSkKLQotI2Vsc2UKLQotLyogU2VudGluZWwgZm9yIGZyY2hhaW4gY3Jhd2xpbmcuICBQb2ludHMgdG8gdGhlIDFzdCBkYXRhLXNlZ21lbnQKLSAgIGZyY2hhaW4uICAoV2hpY2ggaXMgcG9pbnRlZCB0byBieSB0aGUgbGFzdCB0ZXh0LXNlZ21lbnQgZnJjaGFpbi4pICovCi1leHRlcm4gZnJjaGFpblMgKmRhdGEwX2ZyY2hhaW5QOwotZXh0ZXJuIGZyY2hhaW5TICpic3MwX2ZyY2hhaW5QOwotCi0vKiBEdW1teSBzbyBzdHVmZiBjYW4gY29tcGlsZS4gIFNob3VsZCBuZXZlciBiZSB1c2VkLiAgKi8KLXN0cnVjdCBzZWdfaW5mb190cmFzaCB7Ci0gIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgc3RhYl9zdHJpbmdfc2l6ZSA6IDE7Ci0gIH0gc3RhYnU7Ci0gIHVuc2lnbmVkIGhhZG9uZSA6IDE7Ci19OwotI2RlZmluZSBzZWdfaW5mbyhTKQkoYWJvcnQgKCksIChzdHJ1Y3Qgc2VnX2luZm9fdHJhc2ggKikgMCkKLQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotZXh0ZXJuIHZvaWQgc3Vic2Vnc19wcmludF9zdGF0aXN0aWNzIFBBUkFNUyAoKEZJTEUgKikpOwotCi0vKiBlbmQgb2Ygc3Vic2Vncy5oICovCmRpZmYgLS1naXQgYS9nYXMvc3ltYm9scy5jIGIvZ2FzL3N5bWJvbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwNWUxZi4uMDAwMDAwMAotLS0gYS9nYXMvc3ltYm9scy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc5MiArMCwwIEBACi0vKiBzeW1ib2xzLmMgLXN5bWJvbCB0YWJsZS0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogI2RlZmluZSBERUJVR19TWU1TIC8gKiB0byBkZWJ1ZyBzeW1ib2wgbGlzdCBtYWludGVuYW5jZSAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJvYnN0YWNrLmgiCQkvKiBGb3IgInN5bWJvbHMuaCIgKi8KLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLS8qIFRoaXMgaXMgbm9uLXplcm8gaWYgc3ltYm9scyBhcmUgY2FzZSBzZW5zaXRpdmUsIHdoaWNoIGlzIHRoZQotICAgZGVmYXVsdC4gICovCi1pbnQgc3ltYm9sc19jYXNlX3NlbnNpdGl2ZSA9IDE7Ci0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotZXh0ZXJuIGludCBuZXdfYnJva2VuX3dvcmRzOwotI2VuZGlmCi0KLS8qIHN5bWJvbC1uYW1lID0+IHN0cnVjdCBzeW1ib2wgcG9pbnRlciAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnN5X2hhc2g7Ci0KLS8qIEJlbG93IGFyZSBjb21tZW50ZWQgaW4gInN5bWJvbHMuaCIuICovCi1zeW1ib2xTICpzeW1ib2xfcm9vdFA7Ci1zeW1ib2xTICpzeW1ib2xfbGFzdFA7Ci1zeW1ib2xTIGFic19zeW1ib2w7Ci0KLSNpZmRlZiBERUJVR19TWU1TCi0jZGVmaW5lIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbiB2ZXJpZnlfc3ltYm9sX2NoYWluCi0jZWxzZQotI2RlZmluZSBkZWJ1Z192ZXJpZnlfc3ltY2hhaW4ocm9vdCwgbGFzdCkgKCh2b2lkKSAwKQotI2VuZGlmCi0KLXN0cnVjdCBvYnN0YWNrIG5vdGVzOwotCi1zdGF0aWMgdm9pZCBmYl9sYWJlbF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBsb25nIGRvbGxhcl9sYWJlbF9pbnN0YW5jZSBQQVJBTVMgKChsb25nKSk7Ci1zdGF0aWMgbG9uZyBmYl9sYWJlbF9pbnN0YW5jZSBQQVJBTVMgKChsb25nKSk7Ci0KLXN0YXRpYyB2b2lkIHByaW50X2JpbmFyeSBQQVJBTVMgKChGSUxFICosIGNvbnN0IGNoYXIgKiwgZXhwcmVzc2lvblMgKikpOwotCi0vKiBzeW1ib2xfbmV3KCkKLSAgCi0gICBSZXR1cm4gYSBwb2ludGVyIHRvIGEgbmV3IHN5bWJvbC4gIERpZSBpZiB3ZSBjYW4ndCBtYWtlIGEgbmV3Ci0gICBzeW1ib2wuICBGaWxsIGluIHRoZSBzeW1ib2wncyB2YWx1ZXMuICBBZGQgc3ltYm9sIHRvIGVuZCBvZiBzeW1ib2wKLSAgIGNoYWluLgotIAotICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBnZW5lcmFsIGNhc2Ugb2YgY3JlYXRpbmcgYQotICAgc3ltYm9sLiAgSG93ZXZlciwgaWYgdGhlIG91dHB1dCBmaWxlIHN5bWJvbCB0YWJsZSBoYXMgYWxyZWFkeSBiZWVuCi0gICBzZXQsIGFuZCB5b3UgYXJlIGNlcnRhaW4gdGhhdCB0aGlzIHN5bWJvbCB3b24ndCBiZSB3YW50ZWQgaW4gdGhlCi0gICBvdXRwdXQgZmlsZSwgeW91IGNhbiBjYWxsIHN5bWJvbF9jcmVhdGUuICAqLwotCi1zeW1ib2xTICoKLXN5bWJvbF9uZXcgKG5hbWUsIHNlZ21lbnQsIHZhbHUsIGZyYWcpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHZhbHU7Ci0gICAgIGZyYWdTICpmcmFnOwotewotICBzeW1ib2xTICpzeW1ib2xQID0gc3ltYm9sX2NyZWF0ZSAobmFtZSwgc2VnbWVudCwgdmFsdSwgZnJhZyk7Ci0KLSAgLyoKLSAgICogTGluayB0byBlbmQgb2Ygc3ltYm9sIGNoYWluLgotICAgKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHsKLSAgICBleHRlcm4gaW50IHN5bWJvbF90YWJsZV9mcm96ZW47Ci0gICAgaWYgKHN5bWJvbF90YWJsZV9mcm96ZW4pCi0gICAgICBhYm9ydCAoKTsKLSAgfQotI2VuZGlmCi0gIHN5bWJvbF9hcHBlbmQgKHN5bWJvbFAsIHN5bWJvbF9sYXN0UCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0KLSAgcmV0dXJuIHN5bWJvbFA7Ci19Ci0KLXN5bWJvbFMgKgotc3ltYm9sX2NyZWF0ZSAobmFtZSwgc2VnbWVudCwgdmFsdSwgZnJhZykKLSAgICAgY29uc3QgY2hhciAqbmFtZTsJCS8qIEl0IGlzIGNvcGllZCwgdGhlIGNhbGxlciBjYW4gZGVzdHJveS9tb2RpZnkgKi8KLSAgICAgc2VnVCBzZWdtZW50OwkJLyogU2VnbWVudCBpZGVudGlmaWVyIChTRUdfPHNvbWV0aGluZz4pICovCi0gICAgIHZhbHVlVCB2YWx1OwkJLyogU3ltYm9sIHZhbHVlICovCi0gICAgIGZyYWdTICpmcmFnOwkJLyogQXNzb2NpYXRlZCBmcmFnbWVudCAqLwotewotICB1bnNpZ25lZCBpbnQgbmFtZV9sZW5ndGg7Ci0gIGNoYXIgKnByZXNlcnZlZF9jb3B5X29mX25hbWU7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgbmFtZV9sZW5ndGggPSBzdHJsZW4gKG5hbWUpICsgMTsJLyogKzEgZm9yIFwwICovCi0gIG9ic3RhY2tfZ3JvdyAoJm5vdGVzLCBuYW1lLCBuYW1lX2xlbmd0aCk7Ci0gIHByZXNlcnZlZF9jb3B5X29mX25hbWUgPSBvYnN0YWNrX2ZpbmlzaCAoJm5vdGVzKTsKLSNpZmRlZiBTVFJJUF9VTkRFUlNDT1JFCi0gIGlmIChwcmVzZXJ2ZWRfY29weV9vZl9uYW1lWzBdID09ICdfJykKLSAgICBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lKys7Ci0jZW5kaWYKLQotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lID0KLSAgICB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHByZXNlcnZlZF9jb3B5X29mX25hbWUpOwotI2VuZGlmCi0KLSAgaWYgKCEgc3ltYm9sc19jYXNlX3NlbnNpdGl2ZSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpzOwotCi0gICAgICBmb3IgKHMgPSAodW5zaWduZWQgY2hhciAqKSBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lOyAqcyAhPSAnXDAnOyBzKyspCi0JaWYgKGlzbG93ZXIgKCpzKSkKLQkgICpzID0gdG91cHBlciAoKnMpOwotICAgIH0KLQotICBzeW1ib2xQID0gKHN5bWJvbFMgKikgb2JzdGFja19hbGxvYyAoJm5vdGVzLCBzaXplb2YgKHN5bWJvbFMpKTsKLQotICAvKiBzeW1ib2wgbXVzdCBiZSBib3JuIGluIHNvbWUgZml4ZWQgc3RhdGUuICBUaGlzIHNlZW1zIGFzIGdvb2QgYXMgYW55LiAqLwotICBtZW1zZXQgKHN5bWJvbFAsIDAsIHNpemVvZiAoc3ltYm9sUykpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBzeW1ib2xQLT5ic3ltID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChzdGRvdXRwdXQpOwotICBpZiAoc3ltYm9sUC0+YnN5bSA9PSBOVUxMKQotICAgIGFzX3BlcnJvciAoIiVzIiwgImJmZF9tYWtlX2VtcHR5X3N5bWJvbCIpOwotICBzeW1ib2xQLT5ic3ltLT51ZGF0YS5wID0gKFBUUikgc3ltYm9sUDsKLSNlbmRpZgotICBTX1NFVF9OQU1FIChzeW1ib2xQLCBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lKTsKLQotICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBzZWdtZW50KTsKLSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsIHZhbHUpOwotICBzeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycyAoc3ltYm9sUCk7Ci0KLSAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWc7Ci0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAgc3ltYm9sUC0+c3lfbnVtYmVyID0gfjA7Ci0gIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gKHVuc2lnbmVkIGludCkgfjA7Ci0jZW5kaWYKLQotICBvYmpfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKTsKLQotI2lmZGVmIHRjX3N5bWJvbF9uZXdfaG9vawotICB0Y19zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApOwotI2VuZGlmCi0KLSAgcmV0dXJuIHN5bWJvbFA7Ci19Ci0MCi0KLS8qCi0gKgkJCWNvbG9uKCkKLSAqCi0gKiBXZSBoYXZlIGp1c3Qgc2VlbiAiPG5hbWU+OiIuCi0gKiBDcmVhdGVzIGEgc3RydWN0IHN5bWJvbCB1bmxlc3MgaXQgYWxyZWFkeSBleGlzdHMuCi0gKgotICogR3JpcGVzIGlmIHdlIGFyZSByZWRlZmluaW5nIGEgc3ltYm9sIGluY29tcGF0aWJseSAoYW5kIGlnbm9yZXMgaXQpLgotICoKLSAqLwotc3ltYm9sUyAqCi1jb2xvbiAoc3ltX25hbWUpCQkvKiBqdXN0IHNlZW4gIng6IiAtIHJhdHRsZSBzeW1ib2xzICYgZnJhZ3MgKi8KLSAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7CS8qIHN5bWJvbCBuYW1lLCBhcyBhIGNhbm5vbmljYWwgc3RyaW5nICovCi0gICAgIC8qIFdlIGNvcHkgdGhpcyBzdHJpbmc6IE9LIHRvIGFsdGVyIGxhdGVyLiAqLwotewotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwkvKiBzeW1ib2wgd2UgYXJlIHdvcmtpbmcgd2l0aCAqLwotCi0gIC8qIFN1biBsb2NhbCBsYWJlbHMgZ28gb3V0IG9mIHNjb3BlIHdoZW5ldmVyIGEgbm9uLWxvY2FsIHN5bWJvbCBpcwotICAgICBkZWZpbmVkLiAgKi8KLSAgaWYgKExPQ0FMX0xBQkVMU19ET0xMQVIpCi0gICAgewotICAgICAgaW50IGxvY2FsOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgbG9jYWwgPSBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoc3Rkb3V0cHV0LCBzeW1fbmFtZSk7Ci0jZWxzZQotICAgICAgbG9jYWwgPSBMT0NBTF9MQUJFTCAoc3ltX25hbWUpOwotI2VuZGlmCi0KLSAgICAgIGlmICghIGxvY2FsKQotCWRvbGxhcl9sYWJlbF9jbGVhciAoKTsKLSAgICB9Ci0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotICBpZiAobmV3X2Jyb2tlbl93b3JkcykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYnJva2VuX3dvcmQgKmE7Ci0gICAgICBpbnQgcG9zc2libGVfYnl0ZXM7Ci0gICAgICBmcmFnUyAqZnJhZ190bXA7Ci0gICAgICBjaGFyICpmcmFnX29wY29kZTsKLQotICAgICAgZXh0ZXJuIGNvbnN0IGludCBtZF9zaG9ydF9qdW1wX3NpemU7Ci0gICAgICBleHRlcm4gY29uc3QgaW50IG1kX2xvbmdfanVtcF9zaXplOwotICAgICAgcG9zc2libGVfYnl0ZXMgPSAobWRfc2hvcnRfanVtcF9zaXplCi0JCQkrIG5ld19icm9rZW5fd29yZHMgKiBtZF9sb25nX2p1bXBfc2l6ZSk7Ci0KLSAgICAgIGZyYWdfdG1wID0gZnJhZ19ub3c7Ci0gICAgICBmcmFnX29wY29kZSA9IGZyYWdfdmFyIChyc19icm9rZW5fd29yZCwKLQkJCSAgICAgIHBvc3NpYmxlX2J5dGVzLAotCQkJICAgICAgcG9zc2libGVfYnl0ZXMsCi0JCQkgICAgICAocmVsYXhfc3Vic3RhdGVUKSAwLAotCQkJICAgICAgKHN5bWJvbFMgKikgYnJva2VuX3dvcmRzLAotCQkJICAgICAgKG9mZnNldFQpIDAsCi0JCQkgICAgICBOVUxMKTsKLQotICAgICAgLyogV2Ugd2FudCB0byBzdG9yZSB0aGUgcG9pbnRlciB0byB3aGVyZSB0byBpbnNlcnQgdGhlIGp1bXAgdGFibGUgaW4gdGhlCi0JIGZyX29wY29kZSBvZiB0aGUgcnNfYnJva2VuX3dvcmQgZnJhZy4gIFRoaXMgcmVxdWlyZXMgYSBsaXR0bGUKLQkgaGFja2VyeS4gICovCi0gICAgICB3aGlsZSAoZnJhZ190bXAKLQkgICAgICYmIChmcmFnX3RtcC0+ZnJfdHlwZSAhPSByc19icm9rZW5fd29yZAotCQkgfHwgZnJhZ190bXAtPmZyX29wY29kZSkpCi0JZnJhZ190bXAgPSBmcmFnX3RtcC0+ZnJfbmV4dDsKLSAgICAgIGtub3cgKGZyYWdfdG1wKTsKLSAgICAgIGZyYWdfdG1wLT5mcl9vcGNvZGUgPSBmcmFnX29wY29kZTsKLSAgICAgIG5ld19icm9rZW5fd29yZHMgPSAwOwotCi0gICAgICBmb3IgKGEgPSBicm9rZW5fd29yZHM7IGEgJiYgYS0+ZGlzcGZyYWcgPT0gMDsgYSA9IGEtPm5leHRfYnJva2VuX3dvcmQpCi0JYS0+ZGlzcGZyYWcgPSBmcmFnX3RtcDsKLSAgICB9Ci0jZW5kaWYgLyogV09SS0lOR19ET1RfV09SRCAqLwotCi0gIGlmICgoc3ltYm9sUCA9IHN5bWJvbF9maW5kIChzeW1fbmFtZSkpICE9IDApCi0gICAgewotI2lmZGVmIFJFU09MVkVfU1lNQk9MX1JFREVGSU5JVElPTgotICAgICAgaWYgKFJFU09MVkVfU1lNQk9MX1JFREVGSU5JVElPTiAoc3ltYm9sUCkpCi0JcmV0dXJuIHN5bWJvbFA7Ci0jZW5kaWYKLSAgICAgIC8qCi0gICAgICAgKglOb3cgY2hlY2sgZm9yIHVuZGVmaW5lZCBzeW1ib2xzCi0gICAgICAgKi8KLSAgICAgIGlmICghU19JU19ERUZJTkVEIChzeW1ib2xQKSB8fCBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCi0JewotCSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSA9PSAwKQotCSAgICB7Ci0JICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWdfbm93OwotI2lmZGVmIE9CSl9WTVMKLQkgICAgICBTX1NFVF9PVEhFUihzeW1ib2xQLCBjb25zdF9mbGFnKTsKLSNlbmRpZgotCSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIG5vd19zZWcpOwotI2lmZGVmIE5fVU5ERgotCSAgICAgIGtub3cgKE5fVU5ERiA9PSAwKTsKLSNlbmRpZiAvKiBpZiB3ZSBoYXZlIG9uZSwgaXQgYmV0dGVyIGJlIHplcm8uICovCi0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKglUaGVyZSBhcmUgc3RpbGwgc2V2ZXJhbCBjYXNlcyB0byBjaGVjazoKLQkgICAgICAgKgkJQSAuY29tbS8ubGNvbW0gc3ltYm9sIGJlaW5nIHJlZGVmaW5lZCBhcwotCSAgICAgICAqCQkJaW5pdGlhbGl6ZWQgZGF0YSBpcyBPSwotCSAgICAgICAqCQlBIC5jb21tLy5sY29tbSBzeW1ib2wgYmVpbmcgcmVkZWZpbmVkIHdpdGgKLQkgICAgICAgKgkJCWEgbGFyZ2VyIHNpemUgaXMgYWxzbyBPSwotCSAgICAgICAqCi0JICAgICAgICogVGhpcyBvbmx5IHVzZWQgdG8gYmUgYWxsb3dlZCBvbiBWTVMgZ2FzLCBidXQgU3VuIGNjCi0JICAgICAgICogb24gdGhlIHNwYXJjIGFsc28gZGVwZW5kcyBvbiBpdC4KLQkgICAgICAgKi8KLQotCSAgICAgIGlmICgoKCFTX0lTX0RFQlVHIChzeW1ib2xQKQotCQkgICAgJiYgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApIHx8IFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLQkJICAgICYmIFNfSVNfRVhURVJOQUwgKHN5bWJvbFApKQotCQkgICB8fCBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VjdGlvbikKLQkJICAmJiAobm93X3NlZyA9PSBkYXRhX3NlY3Rpb24KLQkJICAgICAgfHwgbm93X3NlZyA9PSBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSkpCi0JCXsKLQkJICAvKgotCQkgICAqCVNlbGVjdCB3aGljaCBvZiB0aGUgMiBjYXNlcyB0aGlzIGlzCi0JCSAgICovCi0JCSAgaWYgKG5vd19zZWcgIT0gZGF0YV9zZWN0aW9uKQotCQkgICAgewotCQkgICAgICAvKgotCQkgICAgICAgKiAgIE5ldyAuY29tbSBmb3IgcHJldiAuY29tbSBzeW1ib2wuCi0JCSAgICAgICAqCUlmIHRoZSBuZXcgc2l6ZSBpcyBsYXJnZXIgd2UganVzdAotCQkgICAgICAgKgljaGFuZ2UgaXRzIHZhbHVlLiAgSWYgdGhlIG5ldyBzaXplCi0JCSAgICAgICAqCWlzIHNtYWxsZXIsIHdlIGlnbm9yZSB0aGlzIHN5bWJvbAotCQkgICAgICAgKi8KLQkJICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKQotCQkJICA8ICgodW5zaWduZWQpIGZyYWdfbm93X2ZpeCAoKSkpCi0JCQl7Ci0JCQkgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogSXQgaXMgYSAuY29tbS8ubGNvbW0gYmVpbmcgY29udmVydGVkIHRvIGluaXRpYWxpemVkCi0JCQkgZGF0YS4gICovCi0JCSAgICAgIHN5bWJvbFAtPnN5X2ZyYWcgPSBmcmFnX25vdzsKLSNpZmRlZiBPQkpfVk1TCi0JCSAgICAgIFNfU0VUX09USEVSKHN5bWJvbFAsIGNvbnN0X2ZsYWcpOwotI2VuZGlmCi0JCSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBub3dfc2VnKTsJLyoga2VlcCBOX0VYVCBiaXQgKi8KLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotI2lmIGRlZmluZWQgKFNfR0VUX09USEVSKSAmJiBkZWZpbmVkIChTX0dFVF9ERVNDKQotCQkgIGFzX2ZhdGFsIChfKCJTeW1ib2wgXCIlc1wiIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBcIiVzXCIvJWQuJWQuJWxkLiIpLAotCQkJICAgIHN5bV9uYW1lLAotCQkJICAgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkpLAotCQkJICAgIFNfR0VUX09USEVSIChzeW1ib2xQKSwgU19HRVRfREVTQyAoc3ltYm9sUCksCi0JCQkgICAgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSk7Ci0jZWxzZQotCQkgIGFzX2ZhdGFsIChfKCJTeW1ib2wgXCIlc1wiIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBcIiVzXCIvJWxkLiIpLAotCQkJICAgIHN5bV9uYW1lLAotCQkJICAgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkpLAotCQkJICAgIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCkpOwotI2VuZGlmCi0JCX0KLQkgICAgfQkJCS8qIGlmIHRoZSB1bmRlZmluZWQgc3ltYm9sIGhhcyBubyB2YWx1ZSAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBEb24ndCBibG93IHVwIGlmIHRoZSBkZWZpbml0aW9uIGlzIHRoZSBzYW1lICovCi0JICBpZiAoIShmcmFnX25vdyA9PSBzeW1ib2xQLT5zeV9mcmFnCi0JCSYmIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSA9PSBmcmFnX25vd19maXggKCkKLQkJJiYgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gbm93X3NlZykpCi0JICAgIGFzX2ZhdGFsIChfKCJTeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkLiIpLCBzeW1fbmFtZSk7Ci0JfQkJCS8qIGlmIHRoaXMgc3ltYm9sIGlzIG5vdCB5ZXQgZGVmaW5lZCAqLwotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKHN5bV9uYW1lLCBub3dfc2VnLCAodmFsdWVUKSBmcmFnX25vd19maXggKCksCi0JCQkgICAgZnJhZ19ub3cpOwotI2lmZGVmIE9CSl9WTVMKLSAgICAgIFNfU0VUX09USEVSIChzeW1ib2xQLCBjb25zdF9mbGFnKTsKLSNlbmRpZiAvKiBPQkpfVk1TICovCi0KLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbFApOwotICAgIH0JCQkJLyogaWYgd2UgaGF2ZSBzZWVuIHRoaXMgc3ltYm9sIGJlZm9yZSAqLwotCi0gIGlmIChtcmlfY29tbW9uX3N5bWJvbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIGFjdHVhbGx5IGJlaW5nIGRlZmluZWQgd2l0aGluIGFuIE1SSSBjb21tb24KLSAgICAgICAgIHNlY3Rpb24uICBUaGlzIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcuICAqLwotICAgICAgc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9IE9fc3ltYm9sOwotICAgICAgc3ltYm9sUC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sID0gbXJpX2NvbW1vbl9zeW1ib2w7Ci0gICAgICBzeW1ib2xQLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIgPSBTX0dFVF9WQUxVRSAobXJpX2NvbW1vbl9zeW1ib2wpOwotICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGV4cHJfc2VjdGlvbik7Ci0gICAgICBzeW1ib2xQLT5zeV9tcmlfY29tbW9uID0gMTsKLSAgICB9Ci0KLSNpZmRlZiB0Y19mcm9iX2xhYmVsCi0gIHRjX2Zyb2JfbGFiZWwgKHN5bWJvbFApOwotI2VuZGlmCi0jaWZkZWYgb2JqX2Zyb2JfbGFiZWwKLSAgb2JqX2Zyb2JfbGFiZWwgKHN5bWJvbFApOwotI2VuZGlmCi0KLSAgcmV0dXJuIHN5bWJvbFA7Ci19Ci0MCi0KLS8qCi0gKgkJCXN5bWJvbF90YWJsZV9pbnNlcnQoKQotICoKLSAqIERpZSBpZiB3ZSBjYW4ndCBpbnNlcnQgdGhlIHN5bWJvbC4KLSAqCi0gKi8KLQotdm9pZCAKLXN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmVycm9yX3N0cmluZzsKLQotICBrbm93IChzeW1ib2xQKTsKLSAga25vdyAoU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCi0gIGlmICgoZXJyb3Jfc3RyaW5nID0gaGFzaF9qYW0gKHN5X2hhc2gsIFNfR0VUX05BTUUgKHN5bWJvbFApLCAoUFRSKSBzeW1ib2xQKSkpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIkluc2VydGluZyBcIiVzXCIgaW50byBzeW1ib2wgdGFibGUgZmFpbGVkOiAlcyIpLAotCQlTX0dFVF9OQU1FIChzeW1ib2xQKSwgZXJyb3Jfc3RyaW5nKTsKLSAgICB9CQkJCS8qIG9uIGVycm9yICovCi19CQkJCS8qIHN5bWJvbF90YWJsZV9pbnNlcnQoKSAqLwotDAotLyoKLSAqCQkJc3ltYm9sX2ZpbmRfb3JfbWFrZSgpCi0gKgotICogSWYgYSBzeW1ib2wgbmFtZSBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIGl0IGFzIHVuZGVmaW5lZCwgYW5kIGluc2VydAotICogaXQgaW50byB0aGUgc3ltYm9sIHRhYmxlLiBSZXR1cm4gYSBwb2ludGVyIHRvIGl0LgotICovCi1zeW1ib2xTICoKLXN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKTsKLQotICBpZiAoc3ltYm9sUCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbWFrZSAobmFtZSk7Ci0KLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbFApOwotICAgIH0JCQkJLyogaWYgc3ltYm9sIHdhc24ndCBmb3VuZCAqLwotCi0gIHJldHVybiAoc3ltYm9sUCk7Ci19CQkJCS8qIHN5bWJvbF9maW5kX29yX21ha2UoKSAqLwotCi1zeW1ib2xTICoKLXN5bWJvbF9tYWtlIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIC8qIExldCB0aGUgbWFjaGluZSBkZXNjcmlwdGlvbiBkZWZhdWx0IGl0LCBlLmcuIGZvciByZWdpc3RlciBuYW1lcy4gKi8KLSAgc3ltYm9sUCA9IG1kX3VuZGVmaW5lZF9zeW1ib2wgKChjaGFyICopIG5hbWUpOwotCi0gIGlmICghc3ltYm9sUCkKLSAgICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sICh2YWx1ZVQpIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0KLSAgcmV0dXJuIChzeW1ib2xQKTsKLX0JCQkJLyogc3ltYm9sX21ha2UoKSAqLwotCi0vKgotICoJCQlzeW1ib2xfZmluZCgpCi0gKgotICogSW1wbGVtZW50IHN5bWJvbCB0YWJsZSBsb29rdXAuCi0gKiBJbjoJQSBzeW1ib2wncyBuYW1lIGFzIGEgc3RyaW5nOiAnXDAnIGNhbid0IGJlIHBhcnQgb2YgYSBzeW1ib2wgbmFtZS4KLSAqIE91dDoJTlVMTCBpZiB0aGUgbmFtZSB3YXMgbm90IGluIHRoZSBzeW1ib2wgdGFibGUsIGVsc2UgdGhlIGFkZHJlc3MKLSAqCW9mIGEgc3RydWN0IHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggdGhhdCBuYW1lLgotICovCi0KLXN5bWJvbFMgKgotc3ltYm9sX2ZpbmQgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0jaWZkZWYgU1RSSVBfVU5ERVJTQ09SRQotICByZXR1cm4gKHN5bWJvbF9maW5kX2Jhc2UgKG5hbWUsIDEpKTsKLSNlbHNlIC8qIFNUUklQX1VOREVSU0NPUkUgKi8KLSAgcmV0dXJuIChzeW1ib2xfZmluZF9iYXNlIChuYW1lLCAwKSk7Ci0jZW5kaWYgLyogU1RSSVBfVU5ERVJTQ09SRSAqLwotfQkJCQkvKiBzeW1ib2xfZmluZCgpICovCi0KLXN5bWJvbFMgKgotc3ltYm9sX2ZpbmRfYmFzZSAobmFtZSwgc3RyaXBfdW5kZXJzY29yZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgaW50IHN0cmlwX3VuZGVyc2NvcmU7Ci17Ci0gIGlmIChzdHJpcF91bmRlcnNjb3JlICYmICpuYW1lID09ICdfJykKLSAgICBuYW1lKys7Ci0KLSNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKLSAgewotICAgIGNoYXIgKmNvcHk7Ci0gICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAobmFtZSkgKyAxOwotCi0gICAgY29weSA9IChjaGFyICopIGFsbG9jYSAobGVuKTsKLSAgICBtZW1jcHkgKGNvcHksIG5hbWUsIGxlbik7Ci0gICAgbmFtZSA9IHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAoY29weSk7Ci0gIH0KLSNlbmRpZgotCi0gIGlmICghIHN5bWJvbHNfY2FzZV9zZW5zaXRpdmUpCi0gICAgewotICAgICAgY2hhciAqY29weTsKLSAgICAgIGNvbnN0IGNoYXIgKm9yaWc7Ci0gICAgICB1bnNpZ25lZCBjaGFyIGM7Ci0KLSAgICAgIG9yaWcgPSBuYW1lOwotICAgICAgbmFtZSA9IGNvcHkgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAobmFtZSkgKyAxKTsKLQotICAgICAgd2hpbGUgKChjID0gKm9yaWcrKykgIT0gJ1wwJykKLQl7Ci0JICBpZiAoaXNsb3dlciAoYykpCi0JICAgIGMgPSB0b3VwcGVyIChjKTsKLQkgICpjb3B5KysgPSBjOwotCX0KLSAgICAgICpjb3B5ID0gJ1wwJzsKLSAgICB9Ci0KLSAgcmV0dXJuICgoc3ltYm9sUyAqKSBoYXNoX2ZpbmQgKHN5X2hhc2gsIG5hbWUpKTsKLX0KLQotLyoKLSAqIE9uY2UgdXBvbiBhIHRpbWUsIHN5bWJvbHMgd2VyZSBrZXB0IGluIGEgc2luZ2x5IGxpbmtlZCBsaXN0LiAgQXQKLSAqIGxlYXN0IGNvZmYgbmVlZHMgdG8gYmUgYWJsZSB0byByZWFycmFuZ2UgdGhlbSBmcm9tIHRpbWUgdG8gdGltZSwgZm9yCi0gKiB3aGljaCBhIGRvdWJseSBsaW5rZWQgbGlzdCBpcyBtdWNoIG1vcmUgY29udmVuaWVudC4gIExvaWMgZGlkIHRoZXNlCi0gKiBhcyBtYWNyb3Mgd2hpY2ggc2VlbWVkIGRhbmdlcm91cyB0byBtZSBzbyB0aGV5J3JlIG5vdyBmdW5jdGlvbnMuCi0gKiB4b3hvcmljaC4KLSAqLwotCi0vKiBMaW5rIHN5bWJvbCBBRERNRSBhZnRlciBzeW1ib2wgVEFSR0VUIGluIHRoZSBjaGFpbi4gKi8KLXZvaWQgCi1zeW1ib2xfYXBwZW5kIChhZGRtZSwgdGFyZ2V0LCByb290UFAsIGxhc3RQUCkKLSAgICAgc3ltYm9sUyAqYWRkbWU7Ci0gICAgIHN5bWJvbFMgKnRhcmdldDsKLSAgICAgc3ltYm9sUyAqKnJvb3RQUDsKLSAgICAgc3ltYm9sUyAqKmxhc3RQUDsKLXsKLSAgaWYgKHRhcmdldCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGtub3cgKCpyb290UFAgPT0gTlVMTCk7Ci0gICAgICBrbm93ICgqbGFzdFBQID09IE5VTEwpOwotICAgICAgYWRkbWUtPnN5X25leHQgPSBOVUxMOwotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSAgICAgIGFkZG1lLT5zeV9wcmV2aW91cyA9IE5VTEw7Ci0jZW5kaWYKLSAgICAgICpyb290UFAgPSBhZGRtZTsKLSAgICAgICpsYXN0UFAgPSBhZGRtZTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIHRoZSBsaXN0IGlzIGVtcHR5ICovCi0KLSAgaWYgKHRhcmdldC0+c3lfbmV4dCAhPSBOVUxMKQotICAgIHsKLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0gICAgICB0YXJnZXQtPnN5X25leHQtPnN5X3ByZXZpb3VzID0gYWRkbWU7Ci0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGtub3cgKCpsYXN0UFAgPT0gdGFyZ2V0KTsKLSAgICAgICpsYXN0UFAgPSBhZGRtZTsKLSAgICB9CQkJCS8qIGlmIHdlIGhhdmUgYSBuZXh0ICovCi0KLSAgYWRkbWUtPnN5X25leHQgPSB0YXJnZXQtPnN5X25leHQ7Ci0gIHRhcmdldC0+c3lfbmV4dCA9IGFkZG1lOwotCi0jaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotICBhZGRtZS0+c3lfcHJldmlvdXMgPSB0YXJnZXQ7Ci0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotCi0gIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbiAoc3ltYm9sX3Jvb3RQLCBzeW1ib2xfbGFzdFApOwotfQotCi0vKiBTZXQgdGhlIGNoYWluIHBvaW50ZXJzIG9mIFNZTUJPTCB0byBudWxsLiAqLwotdm9pZCAKLXN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBzeW1ib2xQLT5zeV9uZXh0ID0gTlVMTDsKLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0gIHN5bWJvbFAtPnN5X3ByZXZpb3VzID0gTlVMTDsKLSNlbmRpZgotfQotCi0jaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotLyogUmVtb3ZlIFNZTUJPTFAgZnJvbSB0aGUgbGlzdC4gKi8KLXZvaWQgCi1zeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCByb290UFAsIGxhc3RQUCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgICAgc3ltYm9sUyAqKnJvb3RQUDsKLSAgICAgc3ltYm9sUyAqKmxhc3RQUDsKLXsKLSAgaWYgKHN5bWJvbFAgPT0gKnJvb3RQUCkKLSAgICB7Ci0gICAgICAqcm9vdFBQID0gc3ltYm9sUC0+c3lfbmV4dDsKLSAgICB9CQkJCS8qIGlmIGl0IHdhcyB0aGUgcm9vdCAqLwotCi0gIGlmIChzeW1ib2xQID09ICpsYXN0UFApCi0gICAgewotICAgICAgKmxhc3RQUCA9IHN5bWJvbFAtPnN5X3ByZXZpb3VzOwotICAgIH0JCQkJLyogaWYgaXQgd2FzIHRoZSB0YWlsICovCi0KLSAgaWYgKHN5bWJvbFAtPnN5X25leHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xQLT5zeV9uZXh0LT5zeV9wcmV2aW91cyA9IHN5bWJvbFAtPnN5X3ByZXZpb3VzOwotICAgIH0JCQkJLyogaWYgbm90IGxhc3QgKi8KLQotICBpZiAoc3ltYm9sUC0+c3lfcHJldmlvdXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xQLT5zeV9wcmV2aW91cy0+c3lfbmV4dCA9IHN5bWJvbFAtPnN5X25leHQ7Ci0gICAgfQkJCQkvKiBpZiBub3QgZmlyc3QgKi8KLQotICBkZWJ1Z192ZXJpZnlfc3ltY2hhaW4gKCpyb290UFAsICpsYXN0UFApOwotfQotCi0vKiBMaW5rIHN5bWJvbCBBRERNRSBiZWZvcmUgc3ltYm9sIFRBUkdFVCBpbiB0aGUgY2hhaW4uICovCi12b2lkIAotc3ltYm9sX2luc2VydCAoYWRkbWUsIHRhcmdldCwgcm9vdFBQLCBsYXN0UFApCi0gICAgIHN5bWJvbFMgKmFkZG1lOwotICAgICBzeW1ib2xTICp0YXJnZXQ7Ci0gICAgIHN5bWJvbFMgKipyb290UFA7Ci0gICAgIHN5bWJvbFMgKipsYXN0UFA7Ci17Ci0gIGlmICh0YXJnZXQtPnN5X3ByZXZpb3VzICE9IE5VTEwpCi0gICAgewotICAgICAgdGFyZ2V0LT5zeV9wcmV2aW91cy0+c3lfbmV4dCA9IGFkZG1lOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGtub3cgKCpyb290UFAgPT0gdGFyZ2V0KTsKLSAgICAgICpyb290UFAgPSBhZGRtZTsKLSAgICB9CQkJCS8qIGlmIG5vdCBmaXJzdCAqLwotCi0gIGFkZG1lLT5zeV9wcmV2aW91cyA9IHRhcmdldC0+c3lfcHJldmlvdXM7Ci0gIHRhcmdldC0+c3lfcHJldmlvdXMgPSBhZGRtZTsKLSAgYWRkbWUtPnN5X25leHQgPSB0YXJnZXQ7Ci0KLSAgZGVidWdfdmVyaWZ5X3N5bWNoYWluICgqcm9vdFBQLCAqbGFzdFBQKTsKLX0KLQotI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KLQotdm9pZCAKLXZlcmlmeV9zeW1ib2xfY2hhaW4gKHJvb3RQLCBsYXN0UCkKLSAgICAgc3ltYm9sUyAqcm9vdFA7Ci0gICAgIHN5bWJvbFMgKmxhc3RQOwotewotICBzeW1ib2xTICpzeW1ib2xQID0gcm9vdFA7Ci0KLSAgaWYgKHN5bWJvbFAgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZm9yICg7IHN5bWJvbF9uZXh0IChzeW1ib2xQKSAhPSBOVUxMOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0gICAgICBhc3NlcnQgKHN5bWJvbFAtPnN5X25leHQtPnN5X3ByZXZpb3VzID09IHN5bWJvbFApOwotI2Vsc2UKLSAgICAgIC8qIFdhbGsgdGhlIGxpc3QgYW55d2F5cywgdG8gbWFrZSBzdXJlIHBvaW50ZXJzIGFyZSBzdGlsbCBnb29kLiAgKi8KLSAgICAgIDsKLSNlbmRpZiAvKiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTICovCi0gICAgfQotCi0gIGFzc2VydCAobGFzdFAgPT0gc3ltYm9sUCk7Ci19Ci0KLXZvaWQKLXZlcmlmeV9zeW1ib2xfY2hhaW5fMiAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHN5bWJvbFMgKnAgPSBzeW0sICpuID0gc3ltOwotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSAgd2hpbGUgKHN5bWJvbF9wcmV2aW91cyAocCkpCi0gICAgcCA9IHN5bWJvbF9wcmV2aW91cyAocCk7Ci0jZW5kaWYKLSAgd2hpbGUgKHN5bWJvbF9uZXh0IChuKSkKLSAgICBuID0gc3ltYm9sX25leHQgKG4pOwotICB2ZXJpZnlfc3ltYm9sX2NoYWluIChwLCBuKTsKLX0KLQotLyogUmVzb2x2ZSB0aGUgdmFsdWUgb2YgYSBzeW1ib2wuICBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgdGhlIGZpbmFsCi0gICBwYXNzIG92ZXIgdGhlIHN5bWJvbCB0YWJsZSB0byByZXNvbHZlIGFueSBzeW1ib2xzIHdpdGggY29tcGxleAotICAgdmFsdWVzLiAgKi8KLQotdmFsdWVUCi1yZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltcCwgZmluYWxpemUpCi0gICAgIHN5bWJvbFMgKnN5bXA7Ci0gICAgIGludCBmaW5hbGl6ZTsKLXsKLSAgaW50IHJlc29sdmVkOwotICB2YWx1ZVQgZmluYWxfdmFsOwotICBzZWdUIGZpbmFsX3NlZzsKLQotICBpZiAoc3ltcC0+c3lfcmVzb2x2ZWQpCi0gICAgewotICAgICAgaWYgKHN5bXAtPnN5X3ZhbHVlLlhfb3AgPT0gT19jb25zdGFudCkKLQlyZXR1cm4gKHZhbHVlVCkgc3ltcC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyOwotICAgICAgZWxzZQotCXJldHVybiAwOwotICAgIH0KLQotICByZXNvbHZlZCA9IDA7Ci0gIGZpbmFsX3NlZyA9IFNfR0VUX1NFR01FTlQgKHN5bXApOwotCi0gIGlmIChzeW1wLT5zeV9yZXNvbHZpbmcpCi0gICAgewotICAgICAgaWYgKGZpbmFsaXplKQotCWFzX2JhZCAoXygiU3ltYm9sIGRlZmluaXRpb24gbG9vcCBlbmNvdW50ZXJlZCBhdCAlcyIpLCBTX0dFVF9OQU1FIChzeW1wKSk7Ci0gICAgICBmaW5hbF92YWwgPSAwOwotICAgICAgcmVzb2x2ZWQgPSAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bWJvbFMgKmFkZF9zeW1ib2wsICpvcF9zeW1ib2w7Ci0gICAgICBvZmZzZXRUIGxlZnQsIHJpZ2h0OwotICAgICAgc2VnVCBzZWdfbGVmdCwgc2VnX3JpZ2h0OwotICAgICAgb3BlcmF0b3JUIG9wOwotCi0gICAgICBzeW1wLT5zeV9yZXNvbHZpbmcgPSAxOwotCi0gICAgICAvKiBIZWxwIG91dCB3aXRoIENTRS4gICovCi0gICAgICBhZGRfc3ltYm9sID0gc3ltcC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sOwotICAgICAgb3Bfc3ltYm9sID0gc3ltcC0+c3lfdmFsdWUuWF9vcF9zeW1ib2w7Ci0gICAgICBmaW5hbF92YWwgPSBzeW1wLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7Ci0gICAgICBvcCA9IHN5bXAtPnN5X3ZhbHVlLlhfb3A7Ci0KLSAgICAgIHN3aXRjaCAob3ApCi0JewotCWRlZmF1bHQ6Ci0JICBCQURfQ0FTRSAob3ApOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9fYWJzZW50OgotCSAgZmluYWxfdmFsID0gMDsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0KLQljYXNlIE9fY29uc3RhbnQ6Ci0JICBmaW5hbF92YWwgKz0gc3ltcC0+c3lfZnJhZy0+ZnJfYWRkcmVzczsKLQkgIGlmIChmaW5hbF9zZWcgPT0gZXhwcl9zZWN0aW9uKQotCSAgICBmaW5hbF9zZWcgPSBhYnNvbHV0ZV9zZWN0aW9uOwotCSAgcmVzb2x2ZWQgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9fc3ltYm9sOgotCWNhc2UgT19zeW1ib2xfcnZhOgotCSAgbGVmdCA9IHJlc29sdmVfc3ltYm9sX3ZhbHVlIChhZGRfc3ltYm9sLCBmaW5hbGl6ZSk7Ci0JZG9fc3ltYm9sOgotCi0JICBpZiAoc3ltcC0+c3lfbXJpX2NvbW1vbikKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBzeW1ib2wgaW5zaWRlIGFuIE1SSSBjb21tb24gc2VjdGlvbi4gIFRoZQotICAgICAgICAgICAgICAgICByZWxvY2F0aW9uIHJvdXRpbmVzIGFyZSBnb2luZyB0byBoYW5kbGUgaXQgc3BlY2lhbGx5LgotICAgICAgICAgICAgICAgICBEb24ndCBjaGFuZ2UgdGhlIHZhbHVlLiAgKi8KLQkgICAgICByZXNvbHZlZCA9IGFkZF9zeW1ib2wtPnN5X3Jlc29sdmVkOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChmaW5hbGl6ZSAmJiBmaW5hbF92YWwgPT0gMCkKLQkgICAgY29weV9zeW1ib2xfYXR0cmlidXRlcyAoc3ltcCwgYWRkX3N5bWJvbCk7Ci0KLQkgIC8qIElmIHdlIGhhdmUgZXF1YXRlZCB0aGlzIHN5bWJvbCB0byBhbiB1bmRlZmluZWQgc3ltYm9sLCB3ZQotICAgICAgICAgICAgIGtlZXAgWF9vcCBzZXQgdG8gT19zeW1ib2wsIGFuZCB3ZSBkb24ndCBjaGFuZ2UKLSAgICAgICAgICAgICBYX2FkZF9udW1iZXIuICBUaGlzIHBlcm1pdHMgdGhlIHJvdXRpbmUgd2hpY2ggd3JpdGVzIG91dAotICAgICAgICAgICAgIHJlbG9jYXRpb24gdG8gZGV0ZWN0IHRoaXMgY2FzZSwgYW5kIGNvbnZlcnQgdGhlCi0gICAgICAgICAgICAgcmVsb2NhdGlvbiB0byBiZSBhZ2FpbnN0IHRoZSBzeW1ib2wgdG8gd2hpY2ggdGhpcyBzeW1ib2wKLSAgICAgICAgICAgICBpcyBlcXVhdGVkLiAgKi8KLQkgIGlmICghIFNfSVNfREVGSU5FRCAoYWRkX3N5bWJvbCkgfHwgU19JU19DT01NT04gKGFkZF9zeW1ib2wpKQotCSAgICB7Ci0JICAgICAgaWYgKGZpbmFsaXplKQotCQl7Ci0JCSAgU19TRVRfU0VHTUVOVCAoc3ltcCwgU19HRVRfU0VHTUVOVCAoYWRkX3N5bWJvbCkpOwotCQkgIHN5bXAtPnN5X3ZhbHVlLlhfb3AgPSBPX3N5bWJvbDsKLQkJICBzeW1wLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wgPSBhZGRfc3ltYm9sOwotCQkgIHN5bXAtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA9IGZpbmFsX3ZhbDsKLQkJfQotCSAgICAgIGZpbmFsX3ZhbCA9IDA7Ci0JICAgICAgcmVzb2x2ZWQgPSBhZGRfc3ltYm9sLT5zeV9yZXNvbHZlZDsKLQkgICAgICBnb3RvIGV4aXRfZG9udF9zZXRfdmFsdWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZpbmFsX3ZhbCArPSBzeW1wLT5zeV9mcmFnLT5mcl9hZGRyZXNzICsgbGVmdDsKLQkgICAgICBpZiAoZmluYWxfc2VnID09IGV4cHJfc2VjdGlvbiB8fCBmaW5hbF9zZWcgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JCWZpbmFsX3NlZyA9IFNfR0VUX1NFR01FTlQgKGFkZF9zeW1ib2wpOwotCSAgICB9Ci0KLQkgIHJlc29sdmVkID0gYWRkX3N5bWJvbC0+c3lfcmVzb2x2ZWQ7Ci0JICBicmVhazsKLQotCWNhc2UgT191bWludXM6Ci0JY2FzZSBPX2JpdF9ub3Q6Ci0JY2FzZSBPX2xvZ2ljYWxfbm90OgotCSAgbGVmdCA9IHJlc29sdmVfc3ltYm9sX3ZhbHVlIChhZGRfc3ltYm9sLCBmaW5hbGl6ZSk7Ci0KLQkgIGlmIChvcCA9PSBPX3VtaW51cykKLQkgICAgbGVmdCA9IC1sZWZ0OwotCSAgZWxzZSBpZiAob3AgPT0gT19sb2dpY2FsX25vdCkKLQkgICAgbGVmdCA9ICFsZWZ0OwotCSAgZWxzZQotCSAgICBsZWZ0ID0gfmxlZnQ7Ci0KLQkgIGZpbmFsX3ZhbCArPSBsZWZ0ICsgc3ltcC0+c3lfZnJhZy0+ZnJfYWRkcmVzczsKLQkgIGlmIChmaW5hbF9zZWcgPT0gZXhwcl9zZWN0aW9uIHx8IGZpbmFsX3NlZyA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkgICAgZmluYWxfc2VnID0gYWJzb2x1dGVfc2VjdGlvbjsKLQotCSAgcmVzb2x2ZWQgPSBhZGRfc3ltYm9sLT5zeV9yZXNvbHZlZDsKLQkgIGJyZWFrOwotCi0JY2FzZSBPX211bHRpcGx5OgotCWNhc2UgT19kaXZpZGU6Ci0JY2FzZSBPX21vZHVsdXM6Ci0JY2FzZSBPX2xlZnRfc2hpZnQ6Ci0JY2FzZSBPX3JpZ2h0X3NoaWZ0OgotCWNhc2UgT19iaXRfaW5jbHVzaXZlX29yOgotCWNhc2UgT19iaXRfb3Jfbm90OgotCWNhc2UgT19iaXRfZXhjbHVzaXZlX29yOgotCWNhc2UgT19iaXRfYW5kOgotCWNhc2UgT19hZGQ6Ci0JY2FzZSBPX3N1YnRyYWN0OgotCWNhc2UgT19lcToKLQljYXNlIE9fbmU6Ci0JY2FzZSBPX2x0OgotCWNhc2UgT19sZToKLQljYXNlIE9fZ2U6Ci0JY2FzZSBPX2d0OgotCWNhc2UgT19sb2dpY2FsX2FuZDoKLQljYXNlIE9fbG9naWNhbF9vcjoKLQkgIGxlZnQgPSByZXNvbHZlX3N5bWJvbF92YWx1ZSAoYWRkX3N5bWJvbCwgZmluYWxpemUpOwotCSAgcmlnaHQgPSByZXNvbHZlX3N5bWJvbF92YWx1ZSAob3Bfc3ltYm9sLCBmaW5hbGl6ZSk7Ci0JICBzZWdfbGVmdCA9IFNfR0VUX1NFR01FTlQgKGFkZF9zeW1ib2wpOwotCSAgc2VnX3JpZ2h0ID0gU19HRVRfU0VHTUVOVCAob3Bfc3ltYm9sKTsKLQotCSAgLyogU2ltcGxpZnkgYWRkaXRpb24gb3Igc3VidHJhY3Rpb24gb2YgYSBjb25zdGFudCBieSBmb2xkaW5nIHRoZQotCSAgICAgY29uc3RhbnQgaW50byBYX2FkZF9udW1iZXIuICAqLwotCSAgaWYgKG9wID09IE9fYWRkIHx8IG9wID09IE9fc3VidHJhY3QpCi0JICAgIHsKLQkgICAgICBpZiAoc2VnX3JpZ2h0ID09IGFic29sdXRlX3NlY3Rpb24pCi0JCXsKLQkJICBpZiAob3AgPT0gT19hZGQpCi0JCSAgICBmaW5hbF92YWwgKz0gcmlnaHQ7Ci0JCSAgZWxzZQotCQkgICAgZmluYWxfdmFsIC09IHJpZ2h0OwotCQkgIG9wID0gT19zeW1ib2w7Ci0JCSAgb3Bfc3ltYm9sID0gTlVMTDsKLQkJICBnb3RvIGRvX3N5bWJvbDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHNlZ19sZWZ0ID09IGFic29sdXRlX3NlY3Rpb24gJiYgb3AgPT0gT19hZGQpCi0JCXsKLQkJICBvcCA9IE9fc3ltYm9sOwotCQkgIGZpbmFsX3ZhbCArPSBsZWZ0OwotCQkgIGFkZF9zeW1ib2wgPSBvcF9zeW1ib2w7Ci0JCSAgbGVmdCA9IHJpZ2h0OwotCQkgIG9wX3N5bWJvbCA9IE5VTEw7Ci0JCSAgZ290byBkb19zeW1ib2w7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBTdWJ0cmFjdGlvbiBpcyBwZXJtaXR0ZWQgaWYgYm90aCBvcGVyYW5kcyBhcmUgaW4gdGhlIHNhbWUKLQkgICAgIHNlY3Rpb24uICBPdGhlcndpc2UsIGJvdGggb3BlcmFuZHMgbXVzdCBiZSBhYnNvbHV0ZS4gIFdlCi0JICAgICBhbHJlYWR5IGhhbmRsZWQgdGhlIGNhc2Ugb2YgYWRkaXRpb24gb3Igc3VidHJhY3Rpb24gb2YgYQotCSAgICAgY29uc3RhbnQgYWJvdmUuICBUaGlzIHdpbGwgcHJvYmFibHkgbmVlZCB0byBiZSBjaGFuZ2VkCi0JICAgICBmb3IgYW4gb2JqZWN0IGZpbGUgZm9ybWF0IHdoaWNoIHN1cHBvcnRzIGFyYml0cmFyeQotCSAgICAgZXhwcmVzc2lvbnMsIHN1Y2ggYXMgSUVFRS02OTUuICAqLwotCSAgLyogRG9uJ3QgZW1pdCBtZXNzYWdlcyB1bmxlc3Mgd2UncmUgZmluYWxpemluZyB0aGUgc3ltYm9sIHZhbHVlLAotCSAgICAgb3RoZXJ3aXNlIHdlIG1heSBnZXQgdGhlIHNhbWUgbWVzc2FnZSBtdWx0aXBsZSB0aW1lcy4gICovCi0JICBpZiAoKHNlZ19sZWZ0ICE9IGFic29sdXRlX3NlY3Rpb24gfHwgc2VnX3JpZ2h0ICE9IGFic29sdXRlX3NlY3Rpb24pCi0JICAgICAgJiYgKG9wICE9IE9fc3VidHJhY3QgfHwgc2VnX2xlZnQgIT0gc2VnX3JpZ2h0KQotCSAgICAgICYmIGZpbmFsaXplKQotCSAgICB7Ci0JICAgICAgY2hhciAqZmlsZTsKLQkgICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLQotCSAgICAgIGlmIChleHByX3N5bWJvbF93aGVyZSAoc3ltcCwgJmZpbGUsICZsaW5lKSkKLQkJewotCQkgIGlmIChzZWdfbGVmdCA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkJICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwKLQkJCQkgIF8oInVuZGVmaW5lZCBzeW1ib2wgJXMgaW4gb3BlcmF0aW9uIiksCi0JCQkJICBTX0dFVF9OQU1FIChzeW1wLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wpKTsKLQkJICBpZiAoc2VnX3JpZ2h0ID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCQkgICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLAotCQkJCSAgXygidW5kZWZpbmVkIHN5bWJvbCAlcyBpbiBvcGVyYXRpb24iKSwKLQkJCQkgIFNfR0VUX05BTUUgKHN5bXAtPnN5X3ZhbHVlLlhfb3Bfc3ltYm9sKSk7Ci0JCSAgaWYgKHNlZ19sZWZ0ICE9IHVuZGVmaW5lZF9zZWN0aW9uCi0JCSAgICAgICYmIHNlZ19yaWdodCAhPSB1bmRlZmluZWRfc2VjdGlvbikKLQkJICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgXygiaW52YWxpZCBzZWN0aW9uIGZvciBvcGVyYXRpb24iKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoc2VnX2xlZnQgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JCSAgICBhc19iYWQgKF8oInVuZGVmaW5lZCBzeW1ib2wgJXMgaW4gb3BlcmF0aW9uIHNldHRpbmcgJXMiKSwKLQkJCSAgICBTX0dFVF9OQU1FIChzeW1wLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wpLAotCQkJICAgIFNfR0VUX05BTUUgKHN5bXApKTsKLQkJICBpZiAoc2VnX3JpZ2h0ID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCQkgICAgYXNfYmFkIChfKCJ1bmRlZmluZWQgc3ltYm9sICVzIGluIG9wZXJhdGlvbiBzZXR0aW5nICVzIiksCi0JCQkgICAgU19HRVRfTkFNRSAoc3ltcC0+c3lfdmFsdWUuWF9vcF9zeW1ib2wpLAotCQkJICAgIFNfR0VUX05BTUUgKHN5bXApKTsKLQkJICBpZiAoc2VnX2xlZnQgIT0gdW5kZWZpbmVkX3NlY3Rpb24KLQkJICAgICAgJiYgc2VnX3JpZ2h0ICE9IHVuZGVmaW5lZF9zZWN0aW9uKQotCQkgICAgYXNfYmFkIChfKCJpbnZhbGlkIHNlY3Rpb24gZm9yIG9wZXJhdGlvbiBzZXR0aW5nICVzIiksCi0JCQkgICAgU19HRVRfTkFNRSAoc3ltcCkpOwotCQl9Ci0JICAgIH0KLQotCSAgLyogQ2hlY2sgZm9yIGRpdmlzaW9uIGJ5IHplcm8uICAqLwotCSAgaWYgKChvcCA9PSBPX2RpdmlkZSB8fCBvcCA9PSBPX21vZHVsdXMpICYmIHJpZ2h0ID09IDApCi0JICAgIHsKLQkgICAgICAvKiBJZiBzZWdfcmlnaHQgaXMgbm90IGFic29sdXRlX3NlY3Rpb24sIHRoZW4gd2UndmUKLSAgICAgICAgICAgICAgICAgYWxyZWFkeSBpc3N1ZWQgYSB3YXJuaW5nIGFib3V0IHVzaW5nIGEgYmFkIHN5bWJvbC4gICovCi0JICAgICAgaWYgKHNlZ19yaWdodCA9PSBhYnNvbHV0ZV9zZWN0aW9uICYmIGZpbmFsaXplKQotCQl7Ci0JCSAgY2hhciAqZmlsZTsKLQkJICB1bnNpZ25lZCBpbnQgbGluZTsKLQotCQkgIGlmIChleHByX3N5bWJvbF93aGVyZSAoc3ltcCwgJmZpbGUsICZsaW5lKSkKLQkJICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgXygiZGl2aXNpb24gYnkgemVybyIpKTsKLQkJICBlbHNlCi0JCSAgICBhc19iYWQgKF8oImRpdmlzaW9uIGJ5IHplcm8gd2hlbiBzZXR0aW5nICVzIiksCi0JCQkgICAgU19HRVRfTkFNRSAoc3ltcCkpOwotCQl9Ci0KLQkgICAgICByaWdodCA9IDE7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChzeW1wLT5zeV92YWx1ZS5YX29wKQotCSAgICB7Ci0JICAgIGNhc2UgT19tdWx0aXBseToJCWxlZnQgKj0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fZGl2aWRlOgkJbGVmdCAvPSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19tb2R1bHVzOgkJbGVmdCAlPSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19sZWZ0X3NoaWZ0OgkJbGVmdCA8PD0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fcmlnaHRfc2hpZnQ6CQlsZWZ0ID4+PSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19iaXRfaW5jbHVzaXZlX29yOglsZWZ0IHw9IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX2JpdF9vcl9ub3Q6CQlsZWZ0IHw9IH5yaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19iaXRfZXhjbHVzaXZlX29yOglsZWZ0IF49IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX2JpdF9hbmQ6CQlsZWZ0ICY9IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX2FkZDoJCQlsZWZ0ICs9IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX3N1YnRyYWN0OgkJbGVmdCAtPSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19lcToJbGVmdCA9IGxlZnQgPT0gcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19uZToJbGVmdCA9IGxlZnQgIT0gcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19sdDoJbGVmdCA9IGxlZnQgPCAgcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19sZToJbGVmdCA9IGxlZnQgPD0gcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19nZToJbGVmdCA9IGxlZnQgPj0gcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19ndDoJbGVmdCA9IGxlZnQgPiAgcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19sb2dpY2FsX2FuZDoJbGVmdCA9IGxlZnQgJiYgcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fbG9naWNhbF9vcjoJbGVmdCA9IGxlZnQgfHwgcmlnaHQ7IGJyZWFrOwotCSAgICBkZWZhdWx0OgkJYWJvcnQgKCk7Ci0JICAgIH0KLQotCSAgZmluYWxfdmFsICs9IHN5bXAtPnN5X2ZyYWctPmZyX2FkZHJlc3MgKyBsZWZ0OwotCSAgaWYgKGZpbmFsX3NlZyA9PSBleHByX3NlY3Rpb24gfHwgZmluYWxfc2VnID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCSAgICBmaW5hbF9zZWcgPSBhYnNvbHV0ZV9zZWN0aW9uOwotCSAgcmVzb2x2ZWQgPSAoYWRkX3N5bWJvbC0+c3lfcmVzb2x2ZWQgJiYgb3Bfc3ltYm9sLT5zeV9yZXNvbHZlZCk7Ci0gICAJICBicmVhazsKLQotCWNhc2UgT19yZWdpc3RlcjoKLQljYXNlIE9fYmlnOgotCWNhc2UgT19pbGxlZ2FsOgotCSAgLyogR2l2ZSBhbiBlcnJvciAoYmVsb3cpIGlmIG5vdCBpbiBleHByX3NlY3Rpb24uICBXZSBkb24ndAotCSAgICAgd2FudCB0byB3b3JyeSBhYm91dCBleHByX3NlY3Rpb24gc3ltYm9scywgYmVjYXVzZSB0aGV5Ci0JICAgICBhcmUgZmljdGlvbmFsICh0aGV5IGFyZSBjcmVhdGVkIGFzIHBhcnQgb2YgZXhwcmVzc2lvbgotCSAgICAgcmVzb2x1dGlvbiksIGFuZCBhbnkgcHJvYmxlbXMgbWF5IG5vdCBhY3R1YWxseSBtZWFuCi0JICAgICBhbnl0aGluZy4gICovCi0JICBicmVhazsKLQl9Ci0KLSAgICAgIHN5bXAtPnN5X3Jlc29sdmluZyA9IDA7Ci0gICAgfQotCi0gIGlmIChmaW5hbGl6ZSkKLSAgICB7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltcCwgZmluYWxfdmFsKTsKLQotI2lmIGRlZmluZWQgKE9CSl9BT1VUKSAmJiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gICAgICAvKiBUaGUgb2xkIGEub3V0IGJhY2tlbmQgZG9lcyBub3QgaGFuZGxlIFNfU0VUX1NFR01FTlQgY29ycmVjdGx5Ci0gICAgICAgICBmb3IgYSBzdGFiIHN5bWJvbCwgc28gd2UgdXNlIHRoaXMgYmFkIGhhY2suICAqLwotICAgICAgaWYgKGZpbmFsX3NlZyAhPSBTX0dFVF9TRUdNRU5UIChzeW1wKSkKLSNlbmRpZgotCVNfU0VUX1NFR01FTlQgKHN5bXAsIGZpbmFsX3NlZyk7Ci0gICAgfQotCi1leGl0X2RvbnRfc2V0X3ZhbHVlOgotICAvKiBEb24ndCB3b3JyeSBpZiB3ZSBjYW4ndCByZXNvbHZlIGFuIGV4cHJfc2VjdGlvbiBzeW1ib2wuICAqLwotICBpZiAoZmluYWxpemUpCi0gICAgewotICAgICAgaWYgKHJlc29sdmVkKQotCXN5bXAtPnN5X3Jlc29sdmVkID0gMTsKLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN5bXApICE9IGV4cHJfc2VjdGlvbikKLQl7Ci0JICBhc19iYWQgKF8oImNhbid0IHJlc29sdmUgdmFsdWUgZm9yIHN5bWJvbCBcIiVzXCIiKSwgU19HRVRfTkFNRSAoc3ltcCkpOwotCSAgc3ltcC0+c3lfcmVzb2x2ZWQgPSAxOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZpbmFsX3ZhbDsKLX0KLQotLyogRG9sbGFyIGxhYmVscyBsb29rIGxpa2UgYSBudW1iZXIgZm9sbG93ZWQgYnkgYSBkb2xsYXIgc2lnbi4gIEVnLCAiNDIkIi4KLSAgIFRoZXkgYXJlICpyZWFsbHkqIGxvY2FsLiAgVGhhdCBpcywgdGhleSBnbyBvdXQgb2Ygc2NvcGUgd2hlbmV2ZXIgd2Ugc2VlIGEKLSAgIGxhYmVsIHRoYXQgaXNuJ3QgbG9jYWwuICBBbHNvLCBsaWtlIGZiIGxhYmVscywgdGhlcmUgY2FuIGJlIG11bHRpcGxlCi0gICBpbnN0YW5jZXMgb2YgYSBkb2xsYXIgbGFiZWwuICBUaGVyZWZvciwgd2UgbmFtZSBlbmNvZGUgZWFjaCBpbnN0YW5jZSB3aXRoCi0gICB0aGUgaW5zdGFuY2UgbnVtYmVyLCBrZWVwIGEgbGlzdCBvZiBkZWZpbmVkIHN5bWJvbHMgc2VwYXJhdGUgZnJvbSB0aGUgcmVhbAotICAgc3ltYm9sIHRhYmxlLCBhbmQgd2UgdHJlYXQgdGhlc2UgYnVnZ2VycyBhcyBhIHNwYXJzZSBhcnJheS4gICovCi0KLXN0YXRpYyBsb25nICpkb2xsYXJfbGFiZWxzOwotc3RhdGljIGxvbmcgKmRvbGxhcl9sYWJlbF9pbnN0YW5jZXM7Ci1zdGF0aWMgY2hhciAqZG9sbGFyX2xhYmVsX2RlZmluZXM7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBkb2xsYXJfbGFiZWxfY291bnQ7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBkb2xsYXJfbGFiZWxfbWF4OwotCi1pbnQgCi1kb2xsYXJfbGFiZWxfZGVmaW5lZCAobGFiZWwpCi0gICAgIGxvbmcgbGFiZWw7Ci17Ci0gIGxvbmcgKmk7Ci0KLSAga25vdyAoKGRvbGxhcl9sYWJlbHMgIT0gTlVMTCkgfHwgKGRvbGxhcl9sYWJlbF9jb3VudCA9PSAwKSk7Ci0KLSAgZm9yIChpID0gZG9sbGFyX2xhYmVsczsgaSA8IGRvbGxhcl9sYWJlbHMgKyBkb2xsYXJfbGFiZWxfY291bnQ7ICsraSkKLSAgICBpZiAoKmkgPT0gbGFiZWwpCi0gICAgICByZXR1cm4gZG9sbGFyX2xhYmVsX2RlZmluZXNbaSAtIGRvbGxhcl9sYWJlbHNdOwotCi0gIC8qIGlmIHdlIGdldCBoZXJlLCBsYWJlbCBpc24ndCBkZWZpbmVkICovCi0gIHJldHVybiAwOwotfQkJCQkvKiBkb2xsYXJfbGFiZWxfZGVmaW5lZCgpICovCi0KLXN0YXRpYyBsb25nCi1kb2xsYXJfbGFiZWxfaW5zdGFuY2UgKGxhYmVsKQotICAgICBsb25nIGxhYmVsOwotewotICBsb25nICppOwotCi0gIGtub3cgKChkb2xsYXJfbGFiZWxzICE9IE5VTEwpIHx8IChkb2xsYXJfbGFiZWxfY291bnQgPT0gMCkpOwotCi0gIGZvciAoaSA9IGRvbGxhcl9sYWJlbHM7IGkgPCBkb2xsYXJfbGFiZWxzICsgZG9sbGFyX2xhYmVsX2NvdW50OyArK2kpCi0gICAgaWYgKCppID09IGxhYmVsKQotICAgICAgcmV0dXJuIChkb2xsYXJfbGFiZWxfaW5zdGFuY2VzW2kgLSBkb2xsYXJfbGFiZWxzXSk7Ci0KLSAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlIGhhdmVuJ3Qgc2VlbiB0aGUgbGFiZWwgYmVmb3JlLCB0aGVyZWZvcmUgaXRzIGluc3RhbmNlCi0gICAgIGNvdW50IGlzIHplcm8uICAqLwotICByZXR1cm4gMDsKLX0KLQotdm9pZCAKLWRvbGxhcl9sYWJlbF9jbGVhciAoKQotewotICBtZW1zZXQgKGRvbGxhcl9sYWJlbF9kZWZpbmVzLCAnXDAnLCAodW5zaWduZWQgaW50KSBkb2xsYXJfbGFiZWxfY291bnQpOwotfQotCi0jZGVmaW5lIERPTExBUl9MQUJFTF9CVU1QX0JZIDEwCi0KLXZvaWQgCi1kZWZpbmVfZG9sbGFyX2xhYmVsIChsYWJlbCkKLSAgICAgbG9uZyBsYWJlbDsKLXsKLSAgbG9uZyAqaTsKLQotICBmb3IgKGkgPSBkb2xsYXJfbGFiZWxzOyBpIDwgZG9sbGFyX2xhYmVscyArIGRvbGxhcl9sYWJlbF9jb3VudDsgKytpKQotICAgIGlmICgqaSA9PSBsYWJlbCkKLSAgICAgIHsKLQkrK2RvbGxhcl9sYWJlbF9pbnN0YW5jZXNbaSAtIGRvbGxhcl9sYWJlbHNdOwotCWRvbGxhcl9sYWJlbF9kZWZpbmVzW2kgLSBkb2xsYXJfbGFiZWxzXSA9IDE7Ci0JcmV0dXJuOwotICAgICAgfQotCi0gIC8qIGlmIHdlIGdldCB0byBoZXJlLCB3ZSBkb24ndCBoYXZlIGxhYmVsIGxpc3RlZCB5ZXQuICovCi0KLSAgaWYgKGRvbGxhcl9sYWJlbHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkb2xsYXJfbGFiZWxzID0gKGxvbmcgKikgeG1hbGxvYyAoRE9MTEFSX0xBQkVMX0JVTVBfQlkgKiBzaXplb2YgKGxvbmcpKTsKLSAgICAgIGRvbGxhcl9sYWJlbF9pbnN0YW5jZXMgPSAobG9uZyAqKSB4bWFsbG9jIChET0xMQVJfTEFCRUxfQlVNUF9CWSAqIHNpemVvZiAobG9uZykpOwotICAgICAgZG9sbGFyX2xhYmVsX2RlZmluZXMgPSB4bWFsbG9jIChET0xMQVJfTEFCRUxfQlVNUF9CWSk7Ci0gICAgICBkb2xsYXJfbGFiZWxfbWF4ID0gRE9MTEFSX0xBQkVMX0JVTVBfQlk7Ci0gICAgICBkb2xsYXJfbGFiZWxfY291bnQgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoZG9sbGFyX2xhYmVsX2NvdW50ID09IGRvbGxhcl9sYWJlbF9tYXgpCi0gICAgewotICAgICAgZG9sbGFyX2xhYmVsX21heCArPSBET0xMQVJfTEFCRUxfQlVNUF9CWTsKLSAgICAgIGRvbGxhcl9sYWJlbHMgPSAobG9uZyAqKSB4cmVhbGxvYyAoKGNoYXIgKikgZG9sbGFyX2xhYmVscywKLQkJCQkJIGRvbGxhcl9sYWJlbF9tYXggKiBzaXplb2YgKGxvbmcpKTsKLSAgICAgIGRvbGxhcl9sYWJlbF9pbnN0YW5jZXMgPSAobG9uZyAqKSB4cmVhbGxvYyAoKGNoYXIgKikgZG9sbGFyX2xhYmVsX2luc3RhbmNlcywKLQkJCQkJICBkb2xsYXJfbGFiZWxfbWF4ICogc2l6ZW9mIChsb25nKSk7Ci0gICAgICBkb2xsYXJfbGFiZWxfZGVmaW5lcyA9IHhyZWFsbG9jIChkb2xsYXJfbGFiZWxfZGVmaW5lcywgZG9sbGFyX2xhYmVsX21heCk7Ci0gICAgfQkJCQkvKiBpZiB3ZSBuZWVkZWQgdG8gZ3JvdyAqLwotCi0gIGRvbGxhcl9sYWJlbHNbZG9sbGFyX2xhYmVsX2NvdW50XSA9IGxhYmVsOwotICBkb2xsYXJfbGFiZWxfaW5zdGFuY2VzW2RvbGxhcl9sYWJlbF9jb3VudF0gPSAxOwotICBkb2xsYXJfbGFiZWxfZGVmaW5lc1tkb2xsYXJfbGFiZWxfY291bnRdID0gMTsKLSAgKytkb2xsYXJfbGFiZWxfY291bnQ7Ci19Ci0KLS8qCi0gKgkJCWRvbGxhcl9sYWJlbF9uYW1lKCkKLSAqCi0gKiBDYWxsZXIgbXVzdCBjb3B5IHJldHVybmVkIG5hbWU6IHdlIHJlLXVzZSB0aGUgYXJlYSBmb3IgdGhlIG5leHQgbmFtZS4KLSAqCi0gKiBUaGUgbXRoIG9jY3VyZW5jZSBvZiBsYWJlbCBuOiBpcyB0dXJuZWQgaW50byB0aGUgc3ltYm9sICJMbl5BbSIKLSAqIHdoZXJlIG4gaXMgdGhlIGxhYmVsIG51bWJlciBhbmQgbSBpcyB0aGUgaW5zdGFuY2UgbnVtYmVyLiAiTCIgbWFrZXMKLSAqIGl0IGEgbGFiZWwgZGlzY2FyZGVkIHVubGVzcyBkZWJ1Z2dpbmcgYW5kICJeQSIoJ1wxJykgZW5zdXJlcyBubwotICogb3JkaW5hcnkgc3ltYm9sIFNIT1VMRCBnZXQgdGhlIHNhbWUgbmFtZSBhcyBhIGxvY2FsIGxhYmVsCi0gKiBzeW1ib2wuIFRoZSBmaXJzdCAiNDoiIGlzICJMNF5BMSIgLSB0aGUgbSBudW1iZXJzIGJlZ2luIGF0IDEuCi0gKgotICogZmIgbGFiZWxzIGdldCB0aGUgc2FtZSB0cmVhdG1lbnQsIGV4Y2VwdCB0aGF0IF5CIGlzIHVzZWQgaW4gcGxhY2Ugb2YgXkEuCi0gKi8KLQotY2hhciAqCQkJCS8qIFJldHVybiBsb2NhbCBsYWJlbCBuYW1lLiAqLwotZG9sbGFyX2xhYmVsX25hbWUgKG4sIGF1Z2VuZCkKLSAgICAgcmVnaXN0ZXIgbG9uZyBuOwkJLyogd2UganVzdCBzYXcgIm4kOiIgOiBuIGEgbnVtYmVyICovCi0gICAgIHJlZ2lzdGVyIGludCBhdWdlbmQ7CS8qIDAgZm9yIGN1cnJlbnQgaW5zdGFuY2UsIDEgZm9yIG5ldyBpbnN0YW5jZSAqLwotewotICBsb25nIGk7Ci0gIC8qIFJldHVybmVkIHRvIGNhbGxlciwgdGhlbiBjb3BpZWQuICB1c2VkIGZvciBjcmVhdGVkIG5hbWVzICgiNGYiKSAqLwotICBzdGF0aWMgY2hhciBzeW1ib2xfbmFtZV9idWlsZFsyNF07Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIHJlZ2lzdGVyIGNoYXIgKnE7Ci0gIGNoYXIgc3ltYm9sX25hbWVfdGVtcG9yYXJ5WzIwXTsJLyogYnVpbGQgdXAgYSBudW1iZXIsIEJBQ0tXQVJEUyAqLwotCi0gIGtub3cgKG4gPj0gMCk7Ci0gIGtub3cgKGF1Z2VuZCA9PSAwIHx8IGF1Z2VuZCA9PSAxKTsKLSAgcCA9IHN5bWJvbF9uYW1lX2J1aWxkOwotICAqcCsrID0gJ0wnOwotCi0gIC8qIE5leHQgY29kZSBqdXN0IGRvZXMgc3ByaW50Zigge30sICIlZCIsIG4pOyAqLwotICAvKiBsYWJlbCBudW1iZXIgKi8KLSAgcSA9IHN5bWJvbF9uYW1lX3RlbXBvcmFyeTsKLSAgZm9yICgqcSsrID0gMCwgaSA9IG47IGk7ICsrcSkKLSAgICB7Ci0gICAgICAqcSA9IGkgJSAxMCArICcwJzsKLSAgICAgIGkgLz0gMTA7Ci0gICAgfQotICB3aGlsZSAoKCpwID0gKi0tcSkgIT0gJ1wwJykKLSAgICArK3A7Ci0KLSAgKnArKyA9IDE7CQkJLyogXkEgKi8KLQotICAvKiBpbnN0YW5jZSBudW1iZXIgKi8KLSAgcSA9IHN5bWJvbF9uYW1lX3RlbXBvcmFyeTsKLSAgZm9yICgqcSsrID0gMCwgaSA9IGRvbGxhcl9sYWJlbF9pbnN0YW5jZSAobikgKyBhdWdlbmQ7IGk7ICsrcSkKLSAgICB7Ci0gICAgICAqcSA9IGkgJSAxMCArICcwJzsKLSAgICAgIGkgLz0gMTA7Ci0gICAgfQotICB3aGlsZSAoKCpwKysgPSAqLS1xKSAhPSAnXDAnKTs7Ci0KLSAgLyogVGhlIGxhYmVsLCBhcyBhICdcMCcgZW5kZWQgc3RyaW5nLCBzdGFydHMgYXQgc3ltYm9sX25hbWVfYnVpbGQuICovCi0gIHJldHVybiBzeW1ib2xfbmFtZV9idWlsZDsKLX0KLQotLyoKLSAqIFNvbWJvZHkgZWxzZSdzIGlkZWEgb2YgbG9jYWwgbGFiZWxzLiBUaGV5IGFyZSBtYWRlIGJ5ICJuOiIgd2hlcmUgbgotICogaXMgYW55IGRlY2ltYWwgZGlnaXQuIFJlZmVyIHRvIHRoZW0gd2l0aAotICogICJuYiIgZm9yIHByZXZpb3VzIChiYWNrd2FyZCkgbjoKLSAqICBvciAibmYiIGZvciBuZXh0IChmb3J3YXJkKSBuOi4KLSAqCi0gKiBXZSBkbyBhIGxpdHRsZSBiZXR0ZXIgYW5kIGxldCBuIGJlIGFueSBudW1iZXIsIG5vdCBqdXN0IGEgc2luZ2xlIGRpZ2l0LCBidXQKLSAqIHNpbmNlIHRoZSBvdGhlciBndXkncyBhc3NlbWJsZXIgb25seSBkb2VzIHRlbiwgd2UgdHJlYXQgdGhlIGZpcnN0IHRlbgotICogc3BlY2lhbGx5LgotICoKLSAqIExpa2Ugc29tZW9uZSBlbHNlJ3MgYXNzZW1ibGVyLCB3ZSBoYXZlIG9uZSBzZXQgb2YgbG9jYWwgbGFiZWwgY291bnRlcnMgZm9yCi0gKiBlbnRpcmUgYXNzZW1ibHksIG5vdCBvbmUgc2V0IHBlciAoc3ViKXNlZ21lbnQgbGlrZSBpbiBtb3N0IGFzc2VtYmxlcnMuIFRoaXMKLSAqIGltcGxpZXMgdGhhdCBvbmUgY2FuIHJlZmVyIHRvIGEgbGFiZWwgaW4gYW5vdGhlciBzZWdtZW50LCBhbmQgaW5kZWVkIHNvbWUKLSAqIGNydWZ0eSBjb21waWxlcnMgaGF2ZSBkb25lIGp1c3QgdGhhdC4KLSAqCi0gKiBTaW5jZSB0aGVyZSBjb3VsZCBiZSBhIExPVCBvZiB0aGVzZSB0aGluZ3MsIHRyZWF0IHRoZW0gYXMgYSBzcGFyc2UgYXJyYXkuCi0gKi8KLQotI2RlZmluZSBGQl9MQUJFTF9TUEVDSUFMICgxMCkKLQotc3RhdGljIGxvbmcgZmJfbG93X2NvdW50ZXJbRkJfTEFCRUxfU1BFQ0lBTF07Ci1zdGF0aWMgbG9uZyAqZmJfbGFiZWxzOwotc3RhdGljIGxvbmcgKmZiX2xhYmVsX2luc3RhbmNlczsKLXN0YXRpYyBsb25nIGZiX2xhYmVsX2NvdW50Owotc3RhdGljIGxvbmcgZmJfbGFiZWxfbWF4OwotCi0vKiB0aGlzIG11c3QgYmUgbW9yZSB0aGFuIEZCX0xBQkVMX1NQRUNJQUwgKi8KLSNkZWZpbmUgRkJfTEFCRUxfQlVNUF9CWSAoRkJfTEFCRUxfU1BFQ0lBTCArIDYpCi0KLXN0YXRpYyB2b2lkIAotZmJfbGFiZWxfaW5pdCAoKQotewotICBtZW1zZXQgKCh2b2lkICopIGZiX2xvd19jb3VudGVyLCAnXDAnLCBzaXplb2YgKGZiX2xvd19jb3VudGVyKSk7Ci19CQkJCS8qIGZiX2xhYmVsX2luaXQoKSAqLwotCi0vKiBhZGQgb25lIHRvIHRoZSBpbnN0YW5jZSBudW1iZXIgb2YgdGhpcyBmYiBsYWJlbCAqLwotdm9pZCAKLWZiX2xhYmVsX2luc3RhbmNlX2luYyAobGFiZWwpCi0gICAgIGxvbmcgbGFiZWw7Ci17Ci0gIGxvbmcgKmk7Ci0KLSAgaWYgKGxhYmVsIDwgRkJfTEFCRUxfU1BFQ0lBTCkKLSAgICB7Ci0gICAgICArK2ZiX2xvd19jb3VudGVyW2xhYmVsXTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGZiX2xhYmVscyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoaSA9IGZiX2xhYmVscyArIEZCX0xBQkVMX1NQRUNJQUw7Ci0JICAgaSA8IGZiX2xhYmVscyArIGZiX2xhYmVsX2NvdW50OyArK2kpCi0JewotCSAgaWYgKCppID09IGxhYmVsKQotCSAgICB7Ci0JICAgICAgKytmYl9sYWJlbF9pbnN0YW5jZXNbaSAtIGZiX2xhYmVsc107Ci0JICAgICAgcmV0dXJuOwotCSAgICB9CQkJLyogaWYgd2UgZmluZCBpdCAqLwotCX0JCQkvKiBmb3IgZWFjaCBleGlzdGluZyBsYWJlbCAqLwotICAgIH0KLQotICAvKiBpZiB3ZSBnZXQgdG8gaGVyZSwgd2UgZG9uJ3QgaGF2ZSBsYWJlbCBsaXN0ZWQgeWV0LiAqLwotCi0gIGlmIChmYl9sYWJlbHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmYl9sYWJlbHMgPSAobG9uZyAqKSB4bWFsbG9jIChGQl9MQUJFTF9CVU1QX0JZICogc2l6ZW9mIChsb25nKSk7Ci0gICAgICBmYl9sYWJlbF9pbnN0YW5jZXMgPSAobG9uZyAqKSB4bWFsbG9jIChGQl9MQUJFTF9CVU1QX0JZICogc2l6ZW9mIChsb25nKSk7Ci0gICAgICBmYl9sYWJlbF9tYXggPSBGQl9MQUJFTF9CVU1QX0JZOwotICAgICAgZmJfbGFiZWxfY291bnQgPSBGQl9MQUJFTF9TUEVDSUFMOwotCi0gICAgfQotICBlbHNlIGlmIChmYl9sYWJlbF9jb3VudCA9PSBmYl9sYWJlbF9tYXgpCi0gICAgewotICAgICAgZmJfbGFiZWxfbWF4ICs9IEZCX0xBQkVMX0JVTVBfQlk7Ci0gICAgICBmYl9sYWJlbHMgPSAobG9uZyAqKSB4cmVhbGxvYyAoKGNoYXIgKikgZmJfbGFiZWxzLAotCQkJCSAgICAgZmJfbGFiZWxfbWF4ICogc2l6ZW9mIChsb25nKSk7Ci0gICAgICBmYl9sYWJlbF9pbnN0YW5jZXMgPSAobG9uZyAqKSB4cmVhbGxvYyAoKGNoYXIgKikgZmJfbGFiZWxfaW5zdGFuY2VzLAotCQkJCQkgICAgICBmYl9sYWJlbF9tYXggKiBzaXplb2YgKGxvbmcpKTsKLSAgICB9CQkJCS8qIGlmIHdlIG5lZWRlZCB0byBncm93ICovCi0KLSAgZmJfbGFiZWxzW2ZiX2xhYmVsX2NvdW50XSA9IGxhYmVsOwotICBmYl9sYWJlbF9pbnN0YW5jZXNbZmJfbGFiZWxfY291bnRdID0gMTsKLSAgKytmYl9sYWJlbF9jb3VudDsKLX0KLQotc3RhdGljIGxvbmcgCi1mYl9sYWJlbF9pbnN0YW5jZSAobGFiZWwpCi0gICAgIGxvbmcgbGFiZWw7Ci17Ci0gIGxvbmcgKmk7Ci0KLSAgaWYgKGxhYmVsIDwgRkJfTEFCRUxfU1BFQ0lBTCkKLSAgICB7Ci0gICAgICByZXR1cm4gKGZiX2xvd19jb3VudGVyW2xhYmVsXSk7Ci0gICAgfQotCi0gIGlmIChmYl9sYWJlbHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBmYl9sYWJlbHMgKyBGQl9MQUJFTF9TUEVDSUFMOwotCSAgIGkgPCBmYl9sYWJlbHMgKyBmYl9sYWJlbF9jb3VudDsgKytpKQotCXsKLQkgIGlmICgqaSA9PSBsYWJlbCkKLQkgICAgewotCSAgICAgIHJldHVybiAoZmJfbGFiZWxfaW5zdGFuY2VzW2kgLSBmYl9sYWJlbHNdKTsKLQkgICAgfQkJCS8qIGlmIHdlIGZpbmQgaXQgKi8KLQl9CQkJLyogZm9yIGVhY2ggZXhpc3RpbmcgbGFiZWwgKi8KLSAgICB9Ci0KLSAgLyogV2UgZGlkbid0IGZpbmQgdGhlIGxhYmVsLCBzbyB0aGlzIG11c3QgYmUgYSByZWZlcmVuY2UgdG8gdGhlCi0gICAgIGZpcnN0IGluc3RhbmNlLiAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKgkJCWZiX2xhYmVsX25hbWUoKQotICoKLSAqIENhbGxlciBtdXN0IGNvcHkgcmV0dXJuZWQgbmFtZTogd2UgcmUtdXNlIHRoZSBhcmVhIGZvciB0aGUgbmV4dCBuYW1lLgotICoKLSAqIFRoZSBtdGggb2NjdXJlbmNlIG9mIGxhYmVsIG46IGlzIHR1cm5lZCBpbnRvIHRoZSBzeW1ib2wgIkxuXkJtIgotICogd2hlcmUgbiBpcyB0aGUgbGFiZWwgbnVtYmVyIGFuZCBtIGlzIHRoZSBpbnN0YW5jZSBudW1iZXIuICJMIiBtYWtlcwotICogaXQgYSBsYWJlbCBkaXNjYXJkZWQgdW5sZXNzIGRlYnVnZ2luZyBhbmQgIl5CIignXDInKSBlbnN1cmVzIG5vCi0gKiBvcmRpbmFyeSBzeW1ib2wgU0hPVUxEIGdldCB0aGUgc2FtZSBuYW1lIGFzIGEgbG9jYWwgbGFiZWwKLSAqIHN5bWJvbC4gVGhlIGZpcnN0ICI0OiIgaXMgIkw0XkIxIiAtIHRoZSBtIG51bWJlcnMgYmVnaW4gYXQgMS4KLSAqCi0gKiBkb2xsYXIgbGFiZWxzIGdldCB0aGUgc2FtZSB0cmVhdG1lbnQsIGV4Y2VwdCB0aGF0IF5BIGlzIHVzZWQgaW4gcGxhY2Ugb2YgXkIuICovCi0KLWNoYXIgKgkJCQkvKiBSZXR1cm4gbG9jYWwgbGFiZWwgbmFtZS4gKi8KLWZiX2xhYmVsX25hbWUgKG4sIGF1Z2VuZCkKLSAgICAgbG9uZyBuOwkJCS8qIHdlIGp1c3Qgc2F3ICJuOiIsICJuZiIgb3IgIm5iIiA6IG4gYSBudW1iZXIgKi8KLSAgICAgbG9uZyBhdWdlbmQ7CQkvKiAwIGZvciBuYiwgMSBmb3IgbjosIG5mICovCi17Ci0gIGxvbmcgaTsKLSAgLyogUmV0dXJuZWQgdG8gY2FsbGVyLCB0aGVuIGNvcGllZC4gIHVzZWQgZm9yIGNyZWF0ZWQgbmFtZXMgKCI0ZiIpICovCi0gIHN0YXRpYyBjaGFyIHN5bWJvbF9uYW1lX2J1aWxkWzI0XTsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgcmVnaXN0ZXIgY2hhciAqcTsKLSAgY2hhciBzeW1ib2xfbmFtZV90ZW1wb3JhcnlbMjBdOwkvKiBidWlsZCB1cCBhIG51bWJlciwgQkFDS1dBUkRTICovCi0KLSAga25vdyAobiA+PSAwKTsKLSAga25vdyAoYXVnZW5kID09IDAgfHwgYXVnZW5kID09IDEpOwotICBwID0gc3ltYm9sX25hbWVfYnVpbGQ7Ci0gICpwKysgPSAnTCc7Ci0KLSAgLyogTmV4dCBjb2RlIGp1c3QgZG9lcyBzcHJpbnRmKCB7fSwgIiVkIiwgbik7ICovCi0gIC8qIGxhYmVsIG51bWJlciAqLwotICBxID0gc3ltYm9sX25hbWVfdGVtcG9yYXJ5OwotICBmb3IgKCpxKysgPSAwLCBpID0gbjsgaTsgKytxKQotICAgIHsKLSAgICAgICpxID0gaSAlIDEwICsgJzAnOwotICAgICAgaSAvPSAxMDsKLSAgICB9Ci0gIHdoaWxlICgoKnAgPSAqLS1xKSAhPSAnXDAnKQotICAgICsrcDsKLQotICAqcCsrID0gMjsJCQkvKiBeQiAqLwotCi0gIC8qIGluc3RhbmNlIG51bWJlciAqLwotICBxID0gc3ltYm9sX25hbWVfdGVtcG9yYXJ5OwotICBmb3IgKCpxKysgPSAwLCBpID0gZmJfbGFiZWxfaW5zdGFuY2UgKG4pICsgYXVnZW5kOyBpOyArK3EpCi0gICAgewotICAgICAgKnEgPSBpICUgMTAgKyAnMCc7Ci0gICAgICBpIC89IDEwOwotICAgIH0KLSAgd2hpbGUgKCgqcCsrID0gKi0tcSkgIT0gJ1wwJyk7OwotCi0gIC8qIFRoZSBsYWJlbCwgYXMgYSAnXDAnIGVuZGVkIHN0cmluZywgc3RhcnRzIGF0IHN5bWJvbF9uYW1lX2J1aWxkLiAqLwotICByZXR1cm4gKHN5bWJvbF9uYW1lX2J1aWxkKTsKLX0JCQkJLyogZmJfbGFiZWxfbmFtZSgpICovCi0KLS8qCi0gKiBkZWNvZGUgbmFtZSB0aGF0IG1heSBoYXZlIGJlZW4gZ2VuZXJhdGVkIGJ5IGZvb19sYWJlbF9uYW1lKCkgYWJvdmUuICBJZgotICogdGhlIG5hbWUgd2Fzbid0IGdlbmVyYXRlZCBieSBmb29fbGFiZWxfbmFtZSgpLCB0aGVuIHJldHVybiBpdCB1bmFsdGVyZWQuCi0gKiBUaGlzIGlzIHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLgotICovCi0KLWNoYXIgKgotZGVjb2RlX2xvY2FsX2xhYmVsX25hbWUgKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgKnN5bWJvbF9kZWNvZGU7Ci0gIGludCBsYWJlbF9udW1iZXI7Ci0gIGludCBpbnN0YW5jZV9udW1iZXI7Ci0gIGNoYXIgKnR5cGU7Ci0gIGNvbnN0IGNoYXIgKm1lc3NhZ2VfZm9ybWF0ID0gXygiXCIlZFwiIChpbnN0YW5jZSBudW1iZXIgJWQgb2YgYSAlcyBsYWJlbCkiKTsKLQotICBpZiAoc1swXSAhPSAnTCcpCi0gICAgcmV0dXJuIHM7Ci0KLSAgZm9yIChsYWJlbF9udW1iZXIgPSAwLCBwID0gcyArIDE7IGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcCk7ICsrcCkKLSAgICBsYWJlbF9udW1iZXIgPSAoMTAgKiBsYWJlbF9udW1iZXIpICsgKnAgLSAnMCc7Ci0KLSAgaWYgKCpwID09IDEpCi0gICAgdHlwZSA9ICJkb2xsYXIiOwotICBlbHNlIGlmICgqcCA9PSAyKQotICAgIHR5cGUgPSAiZmIiOwotICBlbHNlCi0gICAgcmV0dXJuIHM7Ci0KLSAgZm9yIChpbnN0YW5jZV9udW1iZXIgPSAwLCBwKys7IGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcCk7ICsrcCkKLSAgICBpbnN0YW5jZV9udW1iZXIgPSAoMTAgKiBpbnN0YW5jZV9udW1iZXIpICsgKnAgLSAnMCc7Ci0KLSAgc3ltYm9sX2RlY29kZSA9IG9ic3RhY2tfYWxsb2MgKCZub3Rlcywgc3RybGVuIChtZXNzYWdlX2Zvcm1hdCkgKyAzMCk7Ci0gIHNwcmludGYgKHN5bWJvbF9kZWNvZGUsIG1lc3NhZ2VfZm9ybWF0LCBsYWJlbF9udW1iZXIsIGluc3RhbmNlX251bWJlciwgdHlwZSk7Ci0KLSAgcmV0dXJuIHN5bWJvbF9kZWNvZGU7Ci19Ci0KLS8qIEdldCB0aGUgdmFsdWUgb2YgYSBzeW1ib2wuICAqLwotCi12YWx1ZVQKLVNfR0VUX1ZBTFVFIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoIXMtPnN5X3Jlc29sdmVkICYmIHMtPnN5X3ZhbHVlLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAocywgMSk7Ci0gIGlmIChzLT5zeV92YWx1ZS5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgc3RhdGljIHN5bWJvbFMgKnJlY3VyOwotCi0gICAgICAvKiBGSVhNRTogSW4gbm9uIEJGRCBhc3NlbWJsZXJzLCBTX0lTX0RFRklORUQgYW5kIFNfSVNfQ09NTU9OCi0gICAgICAgICBtYXkgY2FsbCBTX0dFVF9WQUxVRS4gIFdlIHVzZSBhIHN0YXRpYyBzeW1ib2wgdG8gYXZvaWQgdGhlCi0gICAgICAgICBpbW1lZGlhdGUgcmVjdXJzaW9uLiAgKi8KLSAgICAgIGlmIChyZWN1ciA9PSBzKQotCXJldHVybiAodmFsdWVUKSBzLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7Ci0gICAgICByZWN1ciA9IHM7Ci0gICAgICBpZiAoISBzLT5zeV9yZXNvbHZlZAotCSAgfHwgcy0+c3lfdmFsdWUuWF9vcCAhPSBPX3N5bWJvbAotCSAgfHwgKFNfSVNfREVGSU5FRCAocykgJiYgISBTX0lTX0NPTU1PTiAocykpKQotCWFzX2JhZCAoXygiQXR0ZW1wdCB0byBnZXQgdmFsdWUgb2YgdW5yZXNvbHZlZCBzeW1ib2wgJXMiKSwKLQkJU19HRVRfTkFNRSAocykpOwotICAgICAgcmVjdXIgPSBOVUxMOwotICAgIH0KLSAgcmV0dXJuICh2YWx1ZVQpIHMtPnN5X3ZhbHVlLlhfYWRkX251bWJlcjsKLX0KLQotLyogU2V0IHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4gICovCi0KLXZvaWQKLVNfU0VUX1ZBTFVFIChzLCB2YWwpCi0gICAgIHN5bWJvbFMgKnM7Ci0gICAgIHZhbHVlVCB2YWw7Ci17Ci0gIHMtPnN5X3ZhbHVlLlhfb3AgPSBPX2NvbnN0YW50OwotICBzLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIgPSAob2Zmc2V0VCkgdmFsOwotICBzLT5zeV92YWx1ZS5YX3Vuc2lnbmVkID0gMDsKLX0KLQotdm9pZAotY29weV9zeW1ib2xfYXR0cmlidXRlcyAoZGVzdCwgc3JjKQotICAgICBzeW1ib2xTICpkZXN0LCAqc3JjOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogSW4gYW4gZXhwcmVzc2lvbiwgdHJhbnNmZXIgdGhlIHNldHRpbmdzIG9mIHRoZXNlIGZsYWdzLgotICAgICBUaGUgdXNlciBjYW4gb3ZlcnJpZGUgbGF0ZXIsIG9mIGNvdXJzZS4gICovCi0jZGVmaW5lIENPUElFRF9TWU1GTEFHUwkoQlNGX0ZVTkNUSU9OIHwgQlNGX09CSkVDVCkKLSAgZGVzdC0+YnN5bS0+ZmxhZ3MgfD0gc3JjLT5ic3ltLT5mbGFncyAmIENPUElFRF9TWU1GTEFHUzsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMKLSAgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMgKGRlc3QsIHNyYyk7Ci0jZW5kaWYKLX0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotaW50Ci1TX0lTX0ZVTkNUSU9OIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBmbGFnd29yZCBmbGFncyA9IHMtPmJzeW0tPmZsYWdzOwotCi0gIHJldHVybiAoZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pICE9IDA7Ci19Ci0KLWludAotU19JU19FWFRFUk5BTCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3MgPSBzLT5ic3ltLT5mbGFnczsKLQotICAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgaWYgKChmbGFncyAmIEJTRl9MT0NBTCkgJiYgKGZsYWdzICYgQlNGX0dMT0JBTCkpCi0gICAgYWJvcnQgKCk7Ci0KLSAgcmV0dXJuIChmbGFncyAmIEJTRl9HTE9CQUwpICE9IDA7Ci19Ci0KLWludAotU19JU19XRUFLIChzKQotICAgICBzeW1ib2xTICpzOwotewotICByZXR1cm4gKHMtPmJzeW0tPmZsYWdzICYgQlNGX1dFQUspICE9IDA7Ci19Ci0KLWludAotU19JU19DT01NT04gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIHJldHVybiBiZmRfaXNfY29tX3NlY3Rpb24gKHMtPmJzeW0tPnNlY3Rpb24pOwotfQotCi1pbnQKLVNfSVNfREVGSU5FRCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgcmV0dXJuIHMtPmJzeW0tPnNlY3Rpb24gIT0gdW5kZWZpbmVkX3NlY3Rpb247Ci19Ci0KLWludAotU19JU19ERUJVRyAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKHMtPmJzeW0tPmZsYWdzICYgQlNGX0RFQlVHR0lORykKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotU19JU19MT0NBTCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3MgPSBzLT5ic3ltLT5mbGFnczsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgaWYgKChmbGFncyAmIEJTRl9MT0NBTCkgJiYgKGZsYWdzICYgQlNGX0dMT0JBTCkpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbiAocy0+YnN5bSkgPT0gcmVnX3NlY3Rpb24pCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGUKLSAgICAgICYmIChmbGFncyAmIEJTRl9HTE9CQUwpID09IDAKLSAgICAgICYmIGJmZF9nZXRfc2VjdGlvbiAocy0+YnN5bSkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICByZXR1cm4gMTsKLQotICBuYW1lID0gU19HRVRfTkFNRSAocyk7Ci0gIHJldHVybiAobmFtZSAhPSBOVUxMCi0JICAmJiAhIFNfSVNfREVCVUcgKHMpCi0JICAmJiAoc3RyY2hyIChuYW1lLCAnXDAwMScpCi0JICAgICAgfHwgc3RyY2hyIChuYW1lLCAnXDAwMicpCi0JICAgICAgfHwgKCEgZmxhZ19rZWVwX2xvY2FscwotCQkgICYmIChiZmRfaXNfbG9jYWxfbGFiZWwgKHN0ZG91dHB1dCwgcy0+YnN5bSkKLQkJICAgICAgfHwgKGZsYWdfbXJpCi0JCQkgICYmIG5hbWVbMF0gPT0gJz8nCi0JCQkgICYmIG5hbWVbMV0gPT0gJz8nKSkpKSk7Ci19Ci0KLWludAotU19JU19FWFRFUk4gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIHJldHVybiBTX0lTX0VYVEVSTkFMIChzKTsKLX0KLQotaW50Ci1TX0lTX1NUQUJEIChzKQotICAgICBzeW1ib2xTICpzOwotewotICByZXR1cm4gU19HRVRfTkFNRSAocykgPT0gMDsKLX0KLQotQ09OU1QgY2hhciAqCi1TX0dFVF9OQU1FIChzKQotICAgICBzeW1ib2xTICpzOwotewotICByZXR1cm4gcy0+YnN5bS0+bmFtZTsKLX0KLQotc2VnVAotU19HRVRfU0VHTUVOVCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgcmV0dXJuIHMtPmJzeW0tPnNlY3Rpb247Ci19Ci0KLXZvaWQKLVNfU0VUX1NFR01FTlQgKHMsIHNlZykKLSAgICAgc3ltYm9sUyAqczsKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIC8qIERvbid0IHJlYXNzaWduIHNlY3Rpb24gc3ltYm9scy4gIFRoZSBkaXJlY3QgcmVhc29uIGlzIHRvIHByZXZlbnQgc2VnCi0gICAgIGZhdWx0cyBhc3NpZ25pbmcgYmFjayB0byBjb25zdCBnbG9iYWwgc3ltYm9scyBzdWNoIGFzICpBQlMqLCBidXQgaXQKLSAgICAgc2hvdWxkbid0IGhhcHBlbiBhbnl3YXkuICAqLwotCi0gIGlmIChzLT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICB7Ci0gICAgICBpZiAocy0+YnN5bS0+c2VjdGlvbiAhPSBzZWcpCi0JYWJvcnQoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBzLT5ic3ltLT5zZWN0aW9uID0gc2VnOwotfQotCi12b2lkCi1TX1NFVF9FWFRFUk5BTCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKChzLT5ic3ltLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIExldCAud2VhayBvdmVycmlkZSAuZ2xvYmFsLiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHMtPmJzeW0tPmZsYWdzIHw9IEJTRl9HTE9CQUw7Ci0gIHMtPmJzeW0tPmZsYWdzICY9IH4oQlNGX0xPQ0FMfEJTRl9XRUFLKTsKLX0KLQotdm9pZAotU19DTEVBUl9FWFRFUk5BTCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKChzLT5ic3ltLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIExldCAud2VhayBvdmVycmlkZS4gICovCi0gICAgICByZXR1cm47Ci0gICAgfQotICBzLT5ic3ltLT5mbGFncyB8PSBCU0ZfTE9DQUw7Ci0gIHMtPmJzeW0tPmZsYWdzICY9IH4oQlNGX0dMT0JBTHxCU0ZfV0VBSyk7Ci19Ci0KLXZvaWQKLVNfU0VUX1dFQUsgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIHMtPmJzeW0tPmZsYWdzIHw9IEJTRl9XRUFLOwotICBzLT5ic3ltLT5mbGFncyAmPSB+KEJTRl9HTE9CQUx8QlNGX0xPQ0FMKTsKLX0KLQotdm9pZAotU19TRVRfTkFNRSAocywgbmFtZSkKLSAgICAgc3ltYm9sUyAqczsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcy0+YnN5bS0+bmFtZSA9IG5hbWU7Ci19Ci0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi12b2lkCi1zeW1ib2xfYmVnaW4gKCkKLXsKLSAgc3ltYm9sX2xhc3RQID0gTlVMTDsKLSAgc3ltYm9sX3Jvb3RQID0gTlVMTDsJCS8qIEluIGNhc2Ugd2UgaGF2ZSAwIHN5bWJvbHMgKCEhKSAqLwotICBzeV9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgbWVtc2V0ICgoY2hhciAqKSAoJmFic19zeW1ib2wpLCAnXDAnLCBzaXplb2YgKGFic19zeW1ib2wpKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jaWYgZGVmaW5lZCAoRU1JVF9TRUNUSU9OX1NZTUJPTFMpIHx8ICFkZWZpbmVkIChSRUxPQ19SRVFVSVJFU19TWU1CT0wpCi0gIGFic19zeW1ib2wuYnN5bSA9IGJmZF9hYnNfc2VjdGlvbi5zeW1ib2w7Ci0jZW5kaWYKLSNlbHNlCi0gIC8qIENhbid0IGluaXRpYWxpc2UgYSB1bmlvbi4gU2lnaC4gKi8KLSAgU19TRVRfU0VHTUVOVCAoJmFic19zeW1ib2wsIGFic29sdXRlX3NlY3Rpb24pOwotI2VuZGlmCi0gIGFic19zeW1ib2wuc3lfdmFsdWUuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGFic19zeW1ib2wuc3lfZnJhZyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKLQotICBpZiAoTE9DQUxfTEFCRUxTX0ZCKQotICAgIGZiX2xhYmVsX2luaXQgKCk7Ci19Ci0KLQwKLWludCBpbmRlbnRfbGV2ZWw7Ci0KLS8qIE1heGltdW0gaW5kZW50IGxldmVsLgotICAgQXZhaWxhYmxlIGZvciBtb2RpZmljYXRpb24gaW5zaWRlIGEgZ2RiIHNlc3Npb24uICAqLwotaW50IG1heF9pbmRlbnRfbGV2ZWwgPSA4OwotCi0jaWYgMAotCi1zdGF0aWMgdm9pZAotaW5kZW50ICgpCi17Ci0gIHByaW50ZiAoIiUqcyIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLX0KLQotI2VuZGlmCi0KLXZvaWQKLXByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBzeW0pCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgY29uc3QgY2hhciAqbmFtZSA9IFNfR0VUX05BTUUgKHN5bSk7Ci0gIGlmICghbmFtZSB8fCAhbmFtZVswXSkKLSAgICBuYW1lID0gIih1bm5hbWVkKSI7Ci0gIGZwcmludGYgKGZpbGUsICJzeW0gJWx4ICVzIiwgKHVuc2lnbmVkIGxvbmcpIHN5bSwgbmFtZSk7Ci0gIGlmIChzeW0tPnN5X2ZyYWcgIT0gJnplcm9fYWRkcmVzc19mcmFnKQotICAgIGZwcmludGYgKGZpbGUsICIgZnJhZyAlbHgiLCAobG9uZykgc3ltLT5zeV9mcmFnKTsKLSAgaWYgKHN5bS0+d3JpdHRlbikKLSAgICBmcHJpbnRmIChmaWxlLCAiIHdyaXR0ZW4iKTsKLSAgaWYgKHN5bS0+c3lfcmVzb2x2ZWQpCi0gICAgZnByaW50ZiAoZmlsZSwgIiByZXNvbHZlZCIpOwotICBlbHNlIGlmIChzeW0tPnN5X3Jlc29sdmluZykKLSAgICBmcHJpbnRmIChmaWxlLCAiIHJlc29sdmluZyIpOwotICBpZiAoc3ltLT5zeV91c2VkX2luX3JlbG9jKQotICAgIGZwcmludGYgKGZpbGUsICIgdXNlZC1pbi1yZWxvYyIpOwotICBpZiAoc3ltLT5zeV91c2VkKQotICAgIGZwcmludGYgKGZpbGUsICIgdXNlZCIpOwotICBpZiAoU19JU19MT0NBTCAoc3ltKSkKLSAgICBmcHJpbnRmIChmaWxlLCAiIGxvY2FsIik7Ci0gIGlmIChTX0lTX0VYVEVSTiAoc3ltKSkKLSAgICBmcHJpbnRmIChmaWxlLCAiIGV4dGVybiIpOwotICBpZiAoU19JU19ERUJVRyAoc3ltKSkKLSAgICBmcHJpbnRmIChmaWxlLCAiIGRlYnVnIik7Ci0gIGlmIChTX0lTX0RFRklORUQgKHN5bSkpCi0gICAgZnByaW50ZiAoZmlsZSwgIiBkZWZpbmVkIik7Ci0gIGZwcmludGYgKGZpbGUsICIgJXMiLCBzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKHN5bSkpKTsKLSAgaWYgKHN5bS0+c3lfcmVzb2x2ZWQpCi0gICAgewotICAgICAgc2VnVCBzID0gU19HRVRfU0VHTUVOVCAoc3ltKTsKLQotICAgICAgaWYgKHMgIT0gdW5kZWZpbmVkX3NlY3Rpb24KLSAgICAgICAgICAmJiBzICE9IGV4cHJfc2VjdGlvbikKLQlmcHJpbnRmIChmaWxlLCAiICVseCIsIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltKSk7Ci0gICAgfQotICBlbHNlIGlmIChpbmRlbnRfbGV2ZWwgPCBtYXhfaW5kZW50X2xldmVsCi0JICAgJiYgU19HRVRfU0VHTUVOVCAoc3ltKSAhPSB1bmRlZmluZWRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBpbmRlbnRfbGV2ZWwrKzsKLSAgICAgIGZwcmludGYgKGZpbGUsICJcbiUqczwiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci0gICAgICBwcmludF9leHByXzEgKGZpbGUsICZzeW0tPnN5X3ZhbHVlKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICI+Iik7Ci0gICAgICBpbmRlbnRfbGV2ZWwtLTsKLSAgICB9Ci0gIGZmbHVzaCAoZmlsZSk7Ci19Ci0KLXZvaWQKLXByaW50X3N5bWJvbF92YWx1ZSAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIGluZGVudF9sZXZlbCA9IDA7Ci0gIHByaW50X3N5bWJvbF92YWx1ZV8xIChzdGRlcnIsIHN5bSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9iaW5hcnkgKGZpbGUsIG5hbWUsIGV4cCkKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgY29uc3QgY2hhciAqIG5hbWU7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIGluZGVudF9sZXZlbCsrOwotICBmcHJpbnRmIChmaWxlLCAiJXNcbiUqczwiLCBuYW1lLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci0gIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfYWRkX3N5bWJvbCk7Ci0gIGZwcmludGYgKGZpbGUsICI+XG4lKnM8IiwgaW5kZW50X2xldmVsICogNCwgIiIpOwotICBwcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgZXhwLT5YX29wX3N5bWJvbCk7Ci0gIGZwcmludGYgKGZpbGUsICI+Iik7Ci0gIGluZGVudF9sZXZlbC0tOwotfQotCi12b2lkCi1wcmludF9leHByXzEgKGZpbGUsIGV4cCkKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgZnByaW50ZiAoZmlsZSwgImV4cHIgJWx4ICIsIChsb25nKSBleHApOwotICBzd2l0Y2ggKGV4cC0+WF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2lsbGVnYWw6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiaWxsZWdhbCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2Fic2VudDoKLSAgICAgIGZwcmludGYgKGZpbGUsICJhYnNlbnQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICAgIGZwcmludGYgKGZpbGUsICJjb25zdGFudCAlbHgiLCAobG9uZykgZXhwLT5YX2FkZF9udW1iZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX3N5bWJvbDoKLSAgICAgIGluZGVudF9sZXZlbCsrOwotICAgICAgZnByaW50ZiAoZmlsZSwgInN5bWJvbFxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLSAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfYWRkX3N5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiPiIpOwotICAgIG1heWJlX3ByaW50X2FkZG51bToKLSAgICAgIGlmIChleHAtPlhfYWRkX251bWJlcikKLQlmcHJpbnRmIChmaWxlLCAiXG4lKnMlbHgiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIiwKLQkJIChsb25nKSBleHAtPlhfYWRkX251bWJlcik7Ci0gICAgICBpbmRlbnRfbGV2ZWwtLTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19yZWdpc3RlcjoKLSAgICAgIGZwcmludGYgKGZpbGUsICJyZWdpc3RlciAjJWQiLCAoaW50KSBleHAtPlhfYWRkX251bWJlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fYmlnOgotICAgICAgZnByaW50ZiAoZmlsZSwgImJpZyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX3VtaW51czoKLSAgICAgIGZwcmludGYgKGZpbGUsICJ1bWludXMgLTwiKTsKLSAgICAgIGluZGVudF9sZXZlbCsrOwotICAgICAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9hZGRfc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICI+Iik7Ci0gICAgICBnb3RvIG1heWJlX3ByaW50X2FkZG51bTsKLSAgICBjYXNlIE9fYml0X25vdDoKLSAgICAgIGZwcmludGYgKGZpbGUsICJiaXRfbm90Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fbXVsdGlwbHk6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJtdWx0aXBseSIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fZGl2aWRlOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAiZGl2aWRlIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19tb2R1bHVzOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAibW9kdWx1cyIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fbGVmdF9zaGlmdDoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImxzaGlmdCIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fcmlnaHRfc2hpZnQ6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJyc2hpZnQiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2JpdF9pbmNsdXNpdmVfb3I6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJiaXRfaW9yIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19iaXRfZXhjbHVzaXZlX29yOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAiYml0X3hvciIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fYml0X2FuZDoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImJpdF9hbmQiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2VxOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAiZXEiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX25lOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAibmUiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2x0OgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAibHQiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2xlOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAibGUiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2dlOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAiZ2UiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2d0OgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAiZ3QiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2xvZ2ljYWxfYW5kOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAibG9naWNhbF9hbmQiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2xvZ2ljYWxfb3I6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJsb2dpY2FsX29yIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19hZGQ6Ci0gICAgICBpbmRlbnRfbGV2ZWwrKzsKLSAgICAgIGZwcmludGYgKGZpbGUsICJhZGRcbiUqczwiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci0gICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgZXhwLT5YX2FkZF9zeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIj5cbiUqczwiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci0gICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgZXhwLT5YX29wX3N5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiPiIpOwotICAgICAgZ290byBtYXliZV9wcmludF9hZGRudW07Ci0gICAgY2FzZSBPX3N1YnRyYWN0OgotICAgICAgaW5kZW50X2xldmVsKys7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAic3VidHJhY3RcbiUqczwiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci0gICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgZXhwLT5YX2FkZF9zeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIj5cbiUqczwiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci0gICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgZXhwLT5YX29wX3N5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiPiIpOwotICAgICAgZ290byBtYXliZV9wcmludF9hZGRudW07Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKGZpbGUsICJ7dW5rbm93biBvcGNvZGUgJWR9IiwgKGludCkgZXhwLT5YX29wKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgZmZsdXNoIChzdGRvdXQpOwotfQotCi12b2lkCi1wcmludF9leHByIChleHApCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIHByaW50X2V4cHJfMSAoc3RkZXJyLCBleHApOwotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotfQotCi12b2lkCi1zeW1ib2xfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSkKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgaGFzaF9wcmludF9zdGF0aXN0aWNzIChmaWxlLCAic3ltYm9sIHRhYmxlIiwgc3lfaGFzaCk7Ci19Ci0KLS8qIGVuZCBvZiBzeW1ib2xzLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9zeW1ib2xzLmggYi9nYXMvc3ltYm9scy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmVmYmRiLi4wMDAwMDAwCi0tLSBhL2dhcy9zeW1ib2xzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKiBzeW1ib2xzLmggLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLWV4dGVybiBzdHJ1Y3Qgb2JzdGFjayBub3RlczsJLyogZWcgRml4UyBsaXZlIGhlcmUuICovCi0KLWV4dGVybiBzdHJ1Y3Qgb2JzdGFjayBjb25kX29ic3RhY2s7CS8qIHRoaXMgaXMgd2hlcmUgd2UgdHJhY2sgLmlmZGVmLy5lbmRpZgotCQkJCSAgICAgICAoaWYgd2UgZG8gdGhhdCBhdCBhbGwpLiAgKi8KLQotZXh0ZXJuIHN5bWJvbFMgKnN5bWJvbF9yb290UDsJLyogYWxsIHRoZSBzeW1ib2wgbm9kZXMgKi8KLWV4dGVybiBzeW1ib2xTICpzeW1ib2xfbGFzdFA7CS8qIGxhc3Qgc3RydWN0IHN5bWJvbCB3ZSBtYWRlLCBvciBOVUxMICovCi0KLWV4dGVybiBzeW1ib2xTIGFic19zeW1ib2w7Ci0KLWV4dGVybiBpbnQgc3ltYm9sX3RhYmxlX2Zyb3plbjsKLQotLyogVGhpcyBpcyBub24temVybyBpZiBzeW1ib2xzIGFyZSBjYXNlIHNlbnNpdGl2ZSwgd2hpY2ggaXMgdGhlCi0gICBkZWZhdWx0LiAgKi8KLWV4dGVybiBpbnQgc3ltYm9sc19jYXNlX3NlbnNpdGl2ZTsKLQotY2hhciAqZGVjb2RlX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoY2hhciAqcykpOwotc3ltYm9sUyAqc3ltYm9sX2ZpbmQgUEFSQU1TICgoQ09OU1QgY2hhciAqbmFtZSkpOwotc3ltYm9sUyAqc3ltYm9sX2ZpbmRfYmFzZSBQQVJBTVMgKChDT05TVCBjaGFyICpuYW1lLCBpbnQgc3RyaXBfdW5kZXJzY29yZSkpOwotc3ltYm9sUyAqc3ltYm9sX2ZpbmRfb3JfbWFrZSBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci1zeW1ib2xTICpzeW1ib2xfbWFrZSBQQVJBTVMgKChDT05TVCBjaGFyICpuYW1lKSk7Ci1zeW1ib2xTICpzeW1ib2xfbmV3IFBBUkFNUyAoKENPTlNUIGNoYXIgKm5hbWUsIHNlZ1Qgc2VnbWVudCwgdmFsdWVUIHZhbHVlLAotCQkJICAgICBmcmFnUyAqIGZyYWcpKTsKLXN5bWJvbFMgKnN5bWJvbF9jcmVhdGUgUEFSQU1TICgoQ09OU1QgY2hhciAqbmFtZSwgc2VnVCBzZWdtZW50LCB2YWx1ZVQgdmFsdWUsCi0JCQkJZnJhZ1MgKiBmcmFnKSk7Ci1zeW1ib2xTICpjb2xvbiBQQVJBTVMgKChjb25zdCBjaGFyICpzeW1fbmFtZSkpOwotdm9pZCBsb2NhbF9jb2xvbiBQQVJBTVMgKChpbnQgbikpOwotdm9pZCBzeW1ib2xfYmVnaW4gUEFSQU1TICgodm9pZCkpOwotdm9pZCBzeW1ib2xfcHJpbnRfc3RhdGlzdGljcyBQQVJBTVMgKChGSUxFICopKTsKLXZvaWQgc3ltYm9sX3RhYmxlX2luc2VydCBQQVJBTVMgKChzeW1ib2xTICogc3ltYm9sUCkpOwotdmFsdWVUIHJlc29sdmVfc3ltYm9sX3ZhbHVlIFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50KSk7Ci0KLXZvaWQgcHJpbnRfc3ltYm9sX3ZhbHVlIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotdm9pZCBwcmludF9leHByIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLXZvaWQgcHJpbnRfZXhwcl8xIFBBUkFNUyAoKEZJTEUgKiwgZXhwcmVzc2lvblMgKikpOwotdm9pZCBwcmludF9zeW1ib2xfdmFsdWVfMSBQQVJBTVMgKChGSUxFICosIHN5bWJvbFMgKikpOwotCi1pbnQgZG9sbGFyX2xhYmVsX2RlZmluZWQgUEFSQU1TICgobG9uZyBsKSk7Ci12b2lkIGRvbGxhcl9sYWJlbF9jbGVhciBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGRlZmluZV9kb2xsYXJfbGFiZWwgUEFSQU1TICgobG9uZyBsKSk7Ci1jaGFyICpkb2xsYXJfbGFiZWxfbmFtZSBQQVJBTVMgKChsb25nIGwsIGludCBhdWdlbmQpKTsKLQotdm9pZCBmYl9sYWJlbF9pbnN0YW5jZV9pbmMgUEFSQU1TICgobG9uZyBsYWJlbCkpOwotY2hhciAqZmJfbGFiZWxfbmFtZSBQQVJBTVMgKChsb25nIG4sIGxvbmcgYXVnZW5kKSk7Ci0KLWV4dGVybiB2b2lkIGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMgUEFSQU1TICgoc3ltYm9sUyAqLCBzeW1ib2xTICopKTsKLQotLyogR2V0IGFuZCBzZXQgdGhlIHZhbHVlcyBvZiBzeW1ib2xzLiAgVGhlc2UgdXNlZCB0byBiZSBtYWNyb3MuICAqLwotZXh0ZXJuIHZhbHVlVCBTX0dFVF9WQUxVRSBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIFNfU0VUX1ZBTFVFIFBBUkFNUyAoKHN5bWJvbFMgKiwgdmFsdWVUKSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1leHRlcm4gaW50IFNfSVNfRVhURVJOQUwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IFNfSVNfV0VBSyBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19DT01NT04gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IFNfSVNfREVGSU5FRCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19ERUJVRyBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19MT0NBTCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19FWFRFUk4gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IFNfSVNfU1RBQkQgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gQ09OU1QgY2hhciAqU19HRVRfTkFNRSBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBzZWdUIFNfR0VUX1NFR01FTlQgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBTX1NFVF9TRUdNRU5UIFBBUkFNUyAoKHN5bWJvbFMgKiwgc2VnVCkpOwotZXh0ZXJuIHZvaWQgU19TRVRfRVhURVJOQUwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBTX1NFVF9OQU1FIFBBUkFNUyAoKHN5bWJvbFMgKiwgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBTX0NMRUFSX0VYVEVSTkFMIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgU19TRVRfV0VBSyBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNlbmRpZgotCi0vKiBlbmQgb2Ygc3ltYm9scy5oICovCmRpZmYgLS1naXQgYS9nYXMvdGMuaCBiL2dhcy90Yy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTQwNDZjLi4wMDAwMDAwCi0tLSBhL2dhcy90Yy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qIHRjLmggLSB0YXJnZXQgY3B1IGRlcGVuZGVudAotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogSW4gdGhlb3J5IChtaW5lLCBhdCBsZWFzdCEpIHRoZSBtYWNoaW5lIGRlcGVuZGVudCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIKLSAgIHNob3VsZCBvbmx5IGhhdmUgdG8gaW5jbHVkZSBvbmUgZmlsZS4gIFRoaXMgb25lLiAgLS0gSkYgKi8KLQotZXh0ZXJuIGNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXTsKLQotLyogSkYgbW92ZWQgdGhpcyBoZXJlIGZyb20gYXMuaCB1bmRlciB0aGUgdGhlb3J5IHRoYXQgbm9ib2R5IGV4Y2VwdCBNQUNISU5FLmMKLSAgIGFuZCB3cml0ZS5jIGNhcmUgYWJvdXQgaXQgYW55d2F5LiAqLwotCi1zdHJ1Y3QgcmVsYXhfdHlwZQotewotICAvKiBGb3J3YXJkIHJlYWNoLiBTaWduZWQgbnVtYmVyLiA+IDAuICovCi0gIGxvbmcgcmx4X2ZvcndhcmQ7Ci0gIC8qIEJhY2t3YXJkIHJlYWNoLiBTaWduZWQgbnVtYmVyLiA8IDAuICovCi0gIGxvbmcgcmx4X2JhY2t3YXJkOwotCi0gIC8qIEJ5dGVzIGxlbmd0aCBvZiB0aGlzIGFkZHJlc3MuICovCi0gIHVuc2lnbmVkIGNoYXIgcmx4X2xlbmd0aDsKLQotICAvKiBOZXh0IGxvbmdlciByZWxheC1zdGF0ZS4gIDAgbWVhbnMgdGhlcmUgaXMgbm8gJ25leHQnIHJlbGF4LXN0YXRlLiAqLwotICByZWxheF9zdWJzdGF0ZVQgcmx4X21vcmU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCByZWxheF90eXBlIHJlbGF4X3R5cGVTOwotCi1leHRlcm4gY29uc3QgaW50IG1kX3JlbG9jX3NpemU7CS8qIFNpemUgb2YgYSByZWxvY2F0aW9uIHJlY29yZCAqLwotCi1jaGFyICptZF9hdG9mIFBBUkFNUyAoKGludCB3aGF0X3N0YXRlbWVudF90eXBlLCBjaGFyICpsaXRlcmFsUCwgaW50ICpzaXplUCkpOwotI2lmbmRlZiBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheAotaW50IG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IFBBUkFNUyAoKGZyYWdTICogZnJhZ1AsIHNlZ1Qgc2VnbWVudCkpOwotI2VuZGlmCi1pbnQgbWRfcGFyc2Vfb3B0aW9uIFBBUkFNUyAoKGludCBjLCBjaGFyICphcmcpKTsKLXZvaWQgbWRfc2hvd191c2FnZSBQQVJBTVMgKChGSUxFICopKTsKLWxvbmcgbWRfcGNyZWxfZnJvbSBQQVJBTVMgKChmaXhTICogZml4UCkpOwotc2hvcnQgdGNfY29mZl9maXgycnR5cGUgUEFSQU1TICgoZml4UyAqIGZpeFApKTsKLXZvaWQgbWRfYXNzZW1ibGUgUEFSQU1TICgoY2hhciAqc3RyKSk7Ci12b2lkIG1kX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLSNpZm5kZWYgbWRfY3JlYXRlX2xvbmdfanVtcAotdm9pZCBtZF9jcmVhdGVfbG9uZ19qdW1wIFBBUkFNUyAoKGNoYXIgKnB0ciwgYWRkcmVzc1QgZnJvbV9hZGRyLAotCQkJCSAgYWRkcmVzc1QgdG9fYWRkciwgZnJhZ1MgKiBmcmFnLAotCQkJCSAgc3ltYm9sUyAqIHRvX3N5bWJvbCkpOwotI2VuZGlmCi0jaWZuZGVmIG1kX2NyZWF0ZV9zaG9ydF9qdW1wCi12b2lkIG1kX2NyZWF0ZV9zaG9ydF9qdW1wIFBBUkFNUyAoKGNoYXIgKnB0ciwgYWRkcmVzc1QgZnJvbV9hZGRyLAotCQkJCSAgIGFkZHJlc3NUIHRvX2FkZHIsIGZyYWdTICogZnJhZywKLQkJCQkgICBzeW1ib2xTICogdG9fc3ltYm9sKSk7Ci0jZW5kaWYKLXZvaWQgbWRfbnVtYmVyX3RvX2NoYXJzIFBBUkFNUyAoKGNoYXIgKmJ1ZiwgdmFsdWVUIHZhbCwgaW50IG4pKTsKLQotI2lmbmRlZiBtZF9vcGVyYW5kCi12b2lkIG1kX29wZXJhbmQgUEFSQU1TICgoZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUCkpOwotI2VuZGlmCi0KLSNpZmRlZiBNRF9BUFBMWV9GSVgzCi1pbnQgbWRfYXBwbHlfZml4MyBQQVJBTVMgKChmaXhTICogZml4UCwgdmFsdWVUICp2YWwsIHNlZ1Qgc2VnKSk7Ci0jZW5kaWYKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1pbnQgbWRfYXBwbHlfZml4IFBBUkFNUyAoKGZpeFMgKiBmaXhQLCB2YWx1ZVQgKnZhbCkpOwotI2lmbmRlZiBtZF9jb252ZXJ0X2ZyYWcKLXZvaWQgbWRfY29udmVydF9mcmFnIFBBUkFNUyAoKGJmZCAqIGhlYWRlcnMsIHNlZ1Qgc2VjLCBmcmFnUyAqIGZyYWdQKSk7Ci0jZW5kaWYKLSNpZm5kZWYgdGNfaGVhZGVyc19ob29rCi12b2lkIHRjX2hlYWRlcnNfaG9vayBQQVJBTVMgKChzZWdUICosIGZpeFMgKikpOwotI2VuZGlmCi0jaWZuZGVmIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotZXh0ZXJuIGFyZWxlbnQgKnRjX2dlbl9yZWxvYyBQQVJBTVMgKChhc2VjdGlvbiAqLCBmaXhTICopKTsKLSNlbHNlCi1leHRlcm4gYXJlbGVudCAqKnRjX2dlbl9yZWxvYyBQQVJBTVMgKChhc2VjdGlvbiAqLCBmaXhTICopKTsKLSNlbmRpZgotI2Vsc2UgLyogbm90IEJGRF9BU1NFTUJMRVIgKi8KLXZvaWQgbWRfYXBwbHlfZml4IFBBUkFNUyAoKGZpeFMgKiBmaXhQLCBsb25nIHZhbCkpOwotI2lmbmRlZiBtZF9jb252ZXJ0X2ZyYWcKLXZvaWQgbWRfY29udmVydF9mcmFnIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycywgc2VnVCwgZnJhZ1MgKiBmcmFnUCkpOwotI2VuZGlmCi0KLSNpZm5kZWYgdGNfY3Jhd2xfc3ltYm9sX2NoYWluCi12b2lkIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBQQVJBTVMgKChvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpKTsKLSNlbmRpZiAvKiB0Y19jcmF3bF9zeW1ib2xfY2hhaW4gKi8KLQotI2lmbmRlZiB0Y19oZWFkZXJzX2hvb2sKLXZvaWQgdGNfaGVhZGVyc19ob29rIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycykpOwotI2VuZGlmIC8qIHRjX2hlYWRlcnNfaG9vayAqLwotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmbmRlZiBtZF9zZWN0aW9uX2FsaWduCi12YWx1ZVQgbWRfc2VjdGlvbl9hbGlnbiBQQVJBTVMgKChzZWdUIHNlZywgdmFsdWVUIHNpemUpKTsKLSNlbmRpZgotCi0jaWZuZGVmIG1kX3VuZGVmaW5lZF9zeW1ib2wKLXN5bWJvbFMgKm1kX3VuZGVmaW5lZF9zeW1ib2wgUEFSQU1TICgoY2hhciAqbmFtZSkpOwotI2VuZGlmCi0KLS8qIGVuZCBvZiB0Yy5oICovCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL0NoYW5nZUxvZyBiL2dhcy90ZXN0c3VpdGUvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2RmZmRlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMjM1MiArMCwwIEBACi0xOTk5LTA1LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvbWNvcmUvYWxsaW5zbi5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBvYmpkdW1wIG91dHB1dC4KLQotMTk5OS0wNS0xMiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni9vcGNvZGUuZDogTW9kaWZ5IGNhbGx3IHRvIHN1aXQgZGlzYXNtIGZpeC4KLQotCSogZ2FzL2kzODYvYW1kLmQ6IE1vZGlmeSBhICcoYmFkKScgdG8gU0lNRCBpbnN0cnVjdGlvbi4KLQotCSogZ2FzL2kzODYvYW1kLnM6IFBhZCB0byBtdWx0aXBsZSBvZiA4Ci0JKiBnYXMvaTM4Ni9hbWQuZDogSGVyZSB0b28uCi0KLQkqIGdhcy9pMzg2L3ByZWZpeC5bc2RdOiBBbGlnbiB3aXRoIG5vcHMKLQkqIGdhcy9pMzg2L3JlbG9jLltzZF06IEhlcmUgdG9vLgotCi0JKiBnYXMvaTM4Ni9rYXRtYWkuW3NkXTogTmV3IGZvciBQSUlJIFNJTUQKLQkqIGdhcy9pMzg2L2kzODYuZXhwOiBDYWxsIGl0LgotCi0xOTk5LTA1LTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvbWNvcmUvYWxsaW5zbi5kOiBVcGRhdGUgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlcgotCW9wZXJhdGlvbnMuIAotCi0xOTk5LTA0LTE2ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2kzODYvYW1kLnM6IEFkZCBOT1BzIHRvIGFsaWduIGZvciBjb2ZmIHRhcmdldHMKLQkqIGdhcy9pMzg2L2FtZC5kOiBhbmQgY2hlY2sgZm9yIHRoZW0uCi0KLVRodSBBcHIgMTUgMTU6MDM6NDMgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAgKGRvX2NvcHJtZW0pOiBObyBsb25nZXIgZXhwZWN0ZWQgdG8gZmlsZS4KLQotV2VkIEFwciAxNCAxMzo0MzowNiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2JyYW5jaC5zOiBEbyBub3QgdXNlIGltbWVkaWF0ZSB2YWx1ZSB3aGVyZSB3ZQotCXJlYWxseSB3YW50IGEgcmVnaXN0ZXIuCi0JKiBnYXMvaHBwYS9iYXNpYy9jb3BybWVtLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvYmFzaWMvZm1lbUxSYnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvYmFzaWMvY29wcm1lbS5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL2Jhc2ljL3Nwb3AuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9iYXNpYy9pbWVtLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcGFyc2UvYmFkZm1weWFkZC5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3BhcnNlL2NhbGxkYXRhYnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcGFyc2UvZW50cnlidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9wYXJzZS9leHByYnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcGFyc2UvZml4dXA3YnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcGFyc2UvbGFiZWxidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9yZWxvYy9hcHBseWJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL2Z1bmNyZWxvY2J1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL2xhYmVsb3BidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9yZWxvYy9sb25nY2FsbC5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL3BsYWJlbGJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlZHVjZS5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlZHVjZTIuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWR1Y2UzLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvYnJsZW5idWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9pbXBvcnRidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9sYXNiZWxkaWZmcy5zOiBMaWtld2lzZS4KLQotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwIChkb19pbWVtKTogSGFuZGxlIG11bHRpcGxlIGVuY29kaW5ncwotCWZvciBsb2FkcyBhbmQgc3RvcmVzIHVzaW5nIHJlZyArIHNtYWxsIGQgYWRkcmVzc2VzLgotCU5vIGxvbmdlciBleHBlY3QgZmFpbHVyZSBmb3IgbWlzLXBhcnNlIG9mIGltbSAlcmVnLgotCi0xOTk5LTA0LTEzICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+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+aTM4NiBhbHNvLgotCi0JKiBsaWIvZG8qOiBTY3JpcHRzIG1vdmVkIGhlcmUgZnJvbSBnYXMvdGVzdHNjcmlwdHMuICBNYXkgYmUgdXNlZnVsCi0Jc29tZWRheSBmb3Igd3JpdGluZyBtb3JlIHRlc3QgY2FzZXM7IG5vdCBjdXJyZW50bHkgdXNlZC4KLQotVHVlIE1hciAzMCAxMTo0NToyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGdhcy9zb2wtZ2NjLnMsIGdhcy9zb2wtY2MucywgZ2FzL3AyNDI1YS5zLCBnYXMvcDIzODkuczogTmV3IHRlc3QKLQljYXNlcy4KLQkqIGdhcy9nYXMuZXhwOiBFbmFibGUgdGhlbSBmb3IgYXBwcm9wcmlhdGUgdGFyZ2V0cy4gIFJlbW92ZWQgc29tZQotCXVzZWxlc3MgY29tbWVudHMgJmMuICBDaGFuZ2VkIG02OGsgdGFyZ2V0IHRlc3QgdG8gYmUgbW9yZSBnZW5lcmFsLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChnYXNfZXhpdCwgZ2FzX2luaXQpOiBOZXcgcHJvY3MuCi0JKiBnYXMvZ2FzLmV4cDogQ2FsbCBnYXNfaW5pdC4KLQotTW9uIE1hciAyOSAwMDowMDowMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogVGVzdCBzdWl0ZSBjcmVhdGVkLgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cCBiL2dhcy90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTM0YTAzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotbG9hZF9saWIgZ2FzLWRlZnMuZXhwCi0KLWdsb2JhbCBBUwotaWYgIVtpbmZvIGV4aXN0cyBBU10gdGhlbiB7Ci0gICAgc2V0IEFTIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vYXMtbmV3ICIuLi9hcy1uZXciIFt0cmFuc2Zvcm0gYXNdXQotfQotCi1nbG9iYWwgR0FTUAotaWYgIVtpbmZvIGV4aXN0cyBHQVNQXSB0aGVuIHsKLSAgICBzZXQgR0FTUCBbZmluZGZpbGUgJGJhc2VfZGlyLy4uL2dhc3AtbmV3ICIuLi9nYXNwLW5ldyIgW3RyYW5zZm9ybSBnYXNwXV0KLX0KLQotZ2xvYmFsIEFTRkxBR1MKLWlmICFbaW5mbyBleGlzdHMgQVNGTEFHU10gdGhlbiB7Ci0gICAgc2V0IEFTRkxBR1MgIiIKLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBPQkpEVU1QXSB0aGVuIHsKLSAgICBzZXQgT0JKRFVNUCBbZmluZGZpbGUgJGJhc2VfZGlyLy4uLy4uL2JpbnV0aWxzL29iamR1bXAgXAotCQkJICAkYmFzZV9kaXIvLi4vLi4vYmludXRpbHMvb2JqZHVtcCBcCi0JCQkgIFt0cmFuc2Zvcm0gb2JqZHVtcF1dCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgT0JKRFVNUEZMQUdTXSB0aGVuIHsKLSAgICBzZXQgT0JKRFVNUEZMQUdTIHt9Ci19Ci0KLWlmICFbaW5mbyBleGlzdHMgTk1dIHRoZW4gewotICAgIHNldCBOTSBbZmluZGZpbGUgJGJhc2VfZGlyLy4uLy4uL2JpbnV0aWxzL25tLW5ldyBcCi0JCSAgICAgJGJhc2VfZGlyLy4uLy4uL2JpbnV0aWxzL25tLW5ldyBcCi0JCSAgICAgW3RyYW5zZm9ybSBubV1dCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgTk1GTEFHU10gdGhlbiB7Ci0gICAgc2V0IE5NRkxBR1Mge30KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBPQkpDT1BZXSB0aGVuIHsKLSAgICBzZXQgT0JKQ09QWSBbZmluZGZpbGUgJGJhc2VfZGlyLy4uLy4uL2JpbnV0aWxzL29iamNvcHldCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgT0JKQ09QWUZMQUdTXSB0aGVuIHsKLSAgICBzZXQgT0JKQ09QWUZMQUdTIHt9Ci19Ci0KLWdhc19pbml0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvYWxpZ24uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9hbGlnbi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmVkZTYxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9hbGlnbi5kCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI29iamR1bXA6IC1zIC1qIC50ZXh0Ci0jbmFtZTogYWxpZ24KLQotIyBUZXN0IHRoZSBhbGlnbm1lbnQgcHNldWRvLW9wLgotCi0uKjogLioKLQotQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDoKLSAwMDAwIGZmMDBmZjAxIGZmMDIwMjAyIGZmZmYwMzAzIDA0MDQwNDA0ICAuLi4uLi4uLi4uLi4uLi4uCi0gMDAxMCBmZmZmZmZmZiAwNTA1MDUwNSBmZjA5MGEwYSAwYTBhMGEwYSAgLi4uLi4uLi4uLi4uLi4uLgotIDAwMjAgZmYwMGZmMDEgZmYwMjAyMDIgZmZmZjAzMDMgMDQwNDA0MDQgIC4uLi4uLi4uLi4uLi4uLi4KLSAwMDMwIGZmZmZmZmZmIDA1MDUwNTA1IGZmMDkwYTBhIDBhMGEwYTBhICAuLi4uLi4uLi4uLi4uLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvYWxpZ24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9hbGlnbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2NjYTEzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9hbGlnbi5zCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyogVGVzdCB0aGUgYWxpZ25tZW50IHBzZXVkby1vcHMuICAqLwotCS50ZXh0Ci0KLQkuYnl0ZQkweGZmCi0JLnAyYWxpZ24gMSwwCi0KLQkuYnl0ZQkweGZmCi0JLnAyYWxpZ24gMSwxCi0KLQkuYnl0ZQkweGZmCi0JLnAyYWxpZ24gMiwyCi0KLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5wMmFsaWdudyAyLDB4MDMwMwotCi0JLnAyYWxpZ24gMyw0Ci0JLmJ5dGUJMHhmZgotCS5ieXRlCTB4ZmYKLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5wMmFsaWdubCAzLDB4MDUwNTA1MDUKLQotCS5wMmFsaWduIDEsNgotCS5wMmFsaWduIDEsNwotCi0JLmJ5dGUJMHhmZgotCS5wMmFsaWduIDMsOCw1Ci0JLmJ5dGUJOQotCS5wMmFsaWduIDMsMHhhCi0KLQkuYnl0ZQkweGZmCi0JLmJhbGlnbgkyLDAKLQotCS5ieXRlCTB4ZmYKLQkuYmFsaWduCTIsMQotCi0JLmJ5dGUJMHhmZgotCS5iYWxpZ24JNCwyCi0KLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5iYWxpZ253IDQsMHgwMzAzCi0KLQkuYmFsaWduCTgsNAotCS5ieXRlCTB4ZmYKLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5ieXRlCTB4ZmYKLQkuYmFsaWdubCA4LDB4MDUwNTA1MDUKLQotCS5iYWxpZ24gMiw2Ci0JLmJhbGlnbiAyLDcKLQotCS5ieXRlCTB4ZmYKLQkuYmFsaWduCTgsOCw1Ci0JLmJ5dGUJOQotCS5iYWxpZ24JOCwweGEKLQotCS5wMmFsaWduIDUKLQkuYmFsaWduIDMyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvZmZ0YWcuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk4OThiNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI29iamR1bXA6IC10Ci0jbmFtZTogY29mZnRhZwotCi0uKjogICAgIGZpbGUgZm9ybWF0IC4qCi0KLVNZTUJPTCBUQUJMRToKLVxbICAwXF1cKHNlYyAtMlwpXChmbCAweDAwXClcKHR5ICAgMFwpXChzY2wgMTAzXCkgXChueCAxXCkgMHgwKzAwMDAgZm9vLmMKLUZpbGUgCi1cWyAgMlxdXChzZWMgIDFcKVwoZmwgMHgwMFwpXCh0eSAgIDBcKVwoc2NsICAgNlwpIFwobnggMFwpIDB4MCswMDAwIGdjYzJfY29tcGlsZWQuCi1cWyAgM1xdXChzZWMgIDFcKVwoZmwgMHgwMFwpXCh0eSAgIDBcKVwoc2NsICAgNlwpIFwobnggMFwpIDB4MCswMDAwIF9fX2dudV9jb21waWxlZF9jCi1cWyAgNFxdXChzZWMgLTJcKVwoZmwgMHgwMFwpXCh0eSAgIGFcKVwoc2NsICAxNVwpIFwobnggMVwpIDB4MCswMDAwIF90b2tlbgotQVVYIGxubm8gMCBzaXplIDB4NCB0YWduZHggMCBlbmRuZHggMTAKLVxbICA2XF1cKHNlYyAtMVwpXChmbCAweDAwXClcKHR5ICAgYlwpXChzY2wgIDE2XCkgXChueCAwXCkgMHgwKzAwMDAgX29wZXJhdG9yCi1cWyAgN1xdXChzZWMgLTFcKVwoZmwgMHgwMFwpXCh0eSAgIGJcKVwoc2NsICAxNlwpIFwobnggMFwpIDB4MCswMDAxIF9mbGFncwotXFsgIDhcXVwoc2VjIC0xXClcKGZsIDB4MDBcKVwodHkgICAwXClcKHNjbCAxMDJcKSBcKG54IDFcKSAweDArMDAwNCAuZW9zCi1BVVggbG5ubyAwIHNpemUgMHg0IHRhZ25keCA0Ci1cWyAxMFxdXChzZWMgIDFcKVwoZmwgMHgwMFwpXCh0eSAgIDBcKVwoc2NsICAgM1wpIFwobnggMVwpIDB4WzAtOWEtZl0rIC50ZXh0Ci1BVVggc2NubGVuIDB4WzAtOWEtZl0rIG5yZWxvYyAwIG5sbm5vIDAKLVxbIDEyXF1cKHNlYyAgMlwpXChmbCAweDAwXClcKHR5ICAgMFwpXChzY2wgICAzXCkgXChueCAxXCkgMHhbMC05YS1mXSsgLmRhdGEKLUFVWCBzY25sZW4gMHhbMC05YS1mXSsgbnJlbG9jIDAgbmxubm8gMAotXFsgMTRcXVwoc2VjICAzXClcKGZsIDB4MDBcKVwodHkgICAwXClcKHNjbCAgIDNcKSBcKG54IDFcKSAweFswLTlhLWZdKyAuYnNzCi1BVVggc2NubGVuIDB4WzAtOWEtZl0rIG5yZWxvYyAwIG5sbm5vIDAKLVxbIDE2XF1cKHNlYyAgMlwpXChmbCAweDAwXClcKHR5ICAgMlwpXChzY2wgICAyXCkgXChueCAwXCkgMHgwKzAwMDAgX3Rva2VuCi1cWyAxN1xdXChzZWMgIDJcKVwoZmwgMHgwMFwpXCh0eSAgIGFcKVwoc2NsICAgMlwpIFwobnggMVwpIDB4WzAtOWEtZl0rIF93aGF0Ci1BVVggbG5ubyAwIHNpemUgMHg0IHRhZ25keCA0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvZmZ0YWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1NjU5OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogVGhpcyBmaWxlIHdhcyBjb21waWxlZCBmcm9tIHRoaXMgQyBzb3VyY2U6Ci0JY2hhciB0b2tlbiA9MDsKLQllbnVtIHRva2VuIHsKLQkgICAgICAgIG9wZXJhdG9yLAotCSAgICAgICAgZmxhZ3MKLQl9OwotCSAKLQllbnVtIHRva2VuIHdoYXQ9IG9wZXJhdG9yOwotICovCi0KLQkuZmlsZQkiZm9vLmMiCi1nY2MyX2NvbXBpbGVkLjoKLV9fX2dudV9jb21waWxlZF9jOgotLmdsb2JsIF90b2tlbgotLmRhdGEKLV90b2tlbjoKLQkuYnl0ZSAwCi0udGV4dAotCS5kZWYJX3Rva2VuCi0JLnNjbAkxNQotCS50eXBlCTAxMgotCS5zaXplCTQKLQkuZW5kZWYKLQkuZGVmCV9vcGVyYXRvcgotCS52YWwJMAotCS5zY2wJMTYKLQkudHlwZQkwMTMKLQkuZW5kZWYKLQkuZGVmCV9mbGFncwotCS52YWwJMQotCS5zY2wJMTYKLQkudHlwZQkwMTMKLQkuZW5kZWYKLQkuZGVmCS5lb3MKLQkudmFsCTQKLQkuc2NsCTEwMgotCS50YWcJX3Rva2VuCi0JLnNpemUJNAotCS5lbmRlZgotLmdsb2JsIF93aGF0Ci0uZGF0YQotCS5wMmFsaWduIDIKLV93aGF0OgotCS5sb25nIDAKLS50ZXh0Ci0JLmRlZglfdG9rZW4KLQkudmFsCV90b2tlbgotCS5zY2wJMgotCS50eXBlCTAyCi0JLmVuZGVmCi0JLmRlZglfd2hhdAotCS52YWwJX3doYXQKLQkuc2NsCTIKLQkudGFnCV90b2tlbgotCS5zaXplCTQKLQkudHlwZQkwMTIKLQkuZW5kZWYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb21tZW50LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29tbWVudC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmJjNjQxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb21tZW50LnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgVGhpcyB0ZXN0IGZpbGUgaXMgdG8gc2VlIHdoZXRoZXIgY29tbWVudHMgZ2V0IHdyaXR0ZW4gaW50byBsaXN0aW5ncwotIyBjb3JyZWN0bHkuICBUaGUgZmlsZSBoYXMgbm8gcmVhbCBjb250ZW50cy4KLS8qIEMgY29tbWVudHMgdG9vISAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbmQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb25kLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZTM5NDIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbmQuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgVGhpcyBzaG91bGQgbWF0Y2ggdGhlIG91dHB1dCBvZiBnYXMgLWFsYyBjb25kLnMuCi0KLS4qY29uZC5zLioKLQotCi0gICAxWyAJXSsuaWYJMAotICAgOFsgCV0rLmVsc2UKLSAgIDlbIAldKy5pZgkxCi0gIDEwWyAJXSsuZW5kYwotICAxMSAwMDAwIDBbMDJdMDAgPzAwMFswMl1bIAldKy5sb25nWyAJXSsyCi0gIDEyWyAJXSsuaWYJMAotICAxNFsgCV0rLmVsc2UKLSAgMTUgMDAwNCAwWzA0XTAwID8wMDBbMDRdWyAJXSsubG9uZ1sgCV0rNAotICAxNlsgCV0rLmVuZGMKLSAgMTdbIAldKy5lbmRjCi0gIDE4IDAwMDggMDAwMCA/MDAwMFsgCV0rLnAyYWxpZ24gNSwwCi0gIDE4WyAJXSswMDAwID8wMDAwIAotICAxOFsgCV0rMDAwMCA/MDAwMCAKLSAgMThbIAldKzAwMDAgPzAwMDAgCi0gIDE4WyAJXSswMDAwID8wMDAwIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb25kLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NTgzMjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbmQucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQkuaWYJMAotCS5pZgkxCi0JLmVuZGMKLQkubG9uZwkwCi0JLmlmCTAKLQkubG9uZwkxCi0JLmVuZGMKLQkuZWxzZQotCS5pZgkxCi0JLmVuZGMKLQkubG9uZwkyCi0JLmlmCTAKLQkubG9uZwkzCi0JLmVsc2UKLQkubG9uZwk0Ci0JLmVuZGMKLQkuZW5kYwotCS5wMmFsaWduIDUsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2RpZmYxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZGlmZjEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhODlmZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZGlmZjEucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBEaWZmZXJlbmNlIG9mIHR3byB1bmRlZmluZWQgc3ltYm9scy4KLSMgVGhlIGFzc2VtYmxlciBzaG91bGQgcmVqZWN0IHRoaXMuCi0JLnRleHQKLQkuZ2xvYmwgX2ZvbwotX2ZvbzoJLmxvbmcgX2EgLSBfYgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2Zsb2F0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZmxvYXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA5OGNhZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZmxvYXQucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCS50ZXh0Ci1mb286CS5zaW5nbGUJMHIxLjIzNDVlKzA2Ci0JLnNpbmdsZSAwZjMuMTQxNTkKLQkuZG91YmxlIDByMi43MTgyODIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9nYXMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2dhcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NDQ1NTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2dhcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIwotIyBUaGVzZSB0ZXN0cyBzaG91bGQgYmUgdmFsaWQgb24gYWxsIHRhcmdldHMuCi0jCi0KLSMgSSB0aGluayBjdXJyZW50bHkgYWxsIHRhcmdldHMgZmFpbCB0aGlzIG9uZSB3aGVuIGxpc3RpbmdzIGFyZSBlbmFibGVkLgotZ2FzX3Rlc3QgInAyNDI1LnMiICIiICAgIiIgInBjcmVsIHZhbHVlcyBpbiBhc3NpZ25tZW50IgotCi0jIHAxNDgwLnMgdXNlcyBhICIuc3BhY2UiIGRpcmVjdGl2ZSB3aGljaCBmb3IgbW9zdCBhc3NlbWJsZXJzIG1lYW5zCi0jICJhbGxvY2F0ZSBzb21lIHNwYWNlIi4gIE9uIHRoZSBQQSBpdCBtZWFucyAic3dpdGNoIGludG8gdGhpcyBzcGFjZSIuCi0jCi0jIFRoZXJlZm9yZSB0aGlzIHRlc3QgKGFzIGl0IGlzIGN1cnJlbnRseSB3cml0dGVuKSBpcyBjb21wbGV0ZWx5IGJvZ3VzCi0jIGZvciBhbnkgUEEgdGFyZ2V0LiAgRG8gbm90IGJvdGhlciB0cnlpbmcgdG8gcnVuIGl0IGFuZCBqdXN0IGNsYWltCi0jIGl0IGZhaWxzLgotaWYgW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7Ci0gICAgc2V0dXBfeGZhaWwgKi0qLSoKLSAgICBmYWlsICJzaW1wbGlmaWFibGUgZG91YmxlIHN1YnRyYWN0aW9uIgotfSBlbHNlIHsKLSAgICBnYXNfdGVzdCAicDE0ODAucyIgIiIgIi1hPiIgInNpbXBsaWZpYWJsZSBkb3VibGUgc3VidHJhY3Rpb24iCi19Ci0KLWdhc190ZXN0ICJmbG9hdC5zIiAiIiAgICIiICJzaW1wbGUgRlAgY29uc3RhbnRzIgotCi0jIFRoaXMgdGVzdCBpcyBtZWFuaW5nbGVzcyBmb3IgdGhlIFBBOyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gdW5kZWZpbmVkCi0jIHN5bWJvbHMgaXMgc29tZXRoaW5nIHRoYXQgaXMgKGFuZCBtdXN0IGJlKSBzdXBwb3J0ZWQgb24gdGhlIFBBLgotaWYgIVtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4gewotICAgIGdhc190ZXN0X2Vycm9yICJkaWZmMS5zIiAiIiAiZGlmZmVyZW5jZSBvZiB0d28gdW5kZWZpbmVkIHN5bWJvbHMiCi19Ci0KLXByb2MgZG9fY29tbWVudCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb21tZW50LnM6IGNvbW1lbnRzIGluIGxpc3RpbmdzIgotICAgIHNldCB4MSAwCi0gICAgc2V0IHgyIDAKLSAgICBzZXQgeDMgMAotICAgIHNldCB3aGl0ZSB7WyBcdF0qfQotICAgIGdhc19zdGFydCAiY29tbWVudC5zIiAiLWFsIgotICAgIHdoaWxlIDEgewotIyBBcHBhcmVudGx5IENSTEYgaXMgcmVjZWl2ZWQgd2hlbiB1c2luZyBwdHlzIGZvciBzdWJwcm9jZXNzZXM7IGhlbmNlIHRoZQotIyBcclxuIGZvciBsaW5lIDMuCi0JZXhwZWN0IHsKLQkgICAgLXJlICJeICsxXFsgXHRcXSsjIFRoaXNcW15cblxdKlxuIgkJeyBzZXQgeDEgMSB9Ci0JICAgIC1yZSAiXiArMlxbIFx0XF0rIyBjb3JyZWN0bHlcW15cblxdKlxuIgl7IHNldCB4MiAxIH0KLQkgICAgLXJlICJeICszXFsgXHRcXSsvLiBDIGNvbW1lbnRzIHRvby4gLi9ccj9cbiIgeyBzZXQgeDMgMSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotICAgIGdhc19maW5pc2gKLSAgICBpZiBbYWxsX29uZXMgJHgxICR4MiAkeDNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLWRvX2NvbW1lbnQKLQotIwotIyBUZXN0IHg5MzA1MDlhIC0tIGNvcnJlY3QgYXNzZW1ibHkgb2YgZGlmZmVyZW5jZXMgaW52b2x2aW5nIGZvcndhcmQKLSMgcmVmZXJlbmNlcy4KLSMKLQotcHJvYyBkb185MzA1MDlhIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRpZmZlcmVuY2UgYmV0d2VlbiBmb3J3YXJkIHJlZmVyZW5jZXMiCi0gICAgc2V0IHggMAotICAgIGdhc19zdGFydCAieDkzMDUwOS5zIiAiLWFsIgotICAgIHdoaWxlIDEgewotIyBXZSBuZWVkIHRvIGFjY29tb2RhdGUgYm90aCBieXRlIG9yZGVycyBoZXJlLgotIyBJZiAiLmxvbmciIG1lYW5zIGFuIDgtYnl0ZSB2YWx1ZSBvbiBzb21lIHRhcmdldCBzb21lZGF5LCB0aGlzIHRlc3Qgd2lsbCBoYXZlCi0jIHRvIGJlIGZpeGVkLgotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArMSAuLi4uIDAwMDAgKjAwMDAiIHsgZmFpbCAkdGVzdG5hbWU7IHNldCB4IDEgfQotCSAgICAtcmUgIl4gKzEgLi4uLiAwNDAwICowMDAwIiB7IHBhc3MgJHRlc3RuYW1lOyBzZXQgeCAxIH0KLQkgICAgLXJlICJeICsxIC4uLi4gMDAwMCAqMDAwNCIgeyBwYXNzICR0ZXN0bmFtZTsgc2V0IHggMSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIgeyB9Ci0JICAgIHRpbWVvdXQgeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mIHsgYnJlYWsgfQotCX0KLSAgICB9Ci0gICAgZ2FzX2ZpbmlzaAotICAgIGlmICEkeCB0aGVuIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi0jIFRoaXMgdGVzdCBpcyBtZWFuaW5nbGVzcyBmb3IgdGhlIFBBOyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scwotIyBtdXN0IG5vdCBiZSByZXNvbHZlZCBieSB0aGUgYXNzZW1ibGVyLgotaWYgIVtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4gewotICAgICMgdGhlIHZheCBmYWlscyBiZWNhdXNlIFZNUyBjYW4gYXBwYXJlbnRseSBhY3R1YWxseSBoYW5kbGUgdGhpcwotICAgICMgY2FzZSBpbiByZWxvY3MsIHNvIGdhcyBkb2Vzbid0IGhhbmRsZSBpdCBpdHNlbGYuCi0gICAgc2V0dXBfeGZhaWwgInZheCotKi12bXMqIgotICAgIHNldHVwX3hmYWlsICJtbjEwMzAwKi0qLSoiCi0gICAgc2V0dXBfeGZhaWwgIm1uMTAyMDAqLSotKiIKLSAgICBkb185MzA1MDlhCi19Ci0KLWNhc2UgJHRhcmdldF90cmlwbGV0IGluIHsKLSAgICB7IGhwcGEqLSotKiB9IHsgfQotICAgIGRlZmF1bHQgewotCXJ1bl9kdW1wX3Rlc3Qgc3RydWN0Ci0JcnVuX2R1bXBfdGVzdCBhbGlnbgotICAgIH0KLX0KLQotIyBUaGlzIHRlc3QgaXMgZm9yIGFueSBDT0ZGIHRhcmdldC4KLSMgV2Ugb21pdCBtODhrIENPRkYgYmVjYXVzZSBpdCB1c2VzIHdlaXJkIHBzZXVkby1vcCBuYW1lcy4KLSMgV2Ugb21pdCB0aGUgQVJNIHRvb2xjaGFpbnMgYmVjYXVzZSB0aGV5IGRlZmluZSBsb2NhbHMgdG8KLSMgIHN0YXJ0IHdpdGggJy4nLCB3aGljaCBlbGltaW5hdGVzIC5lb3MsIC50ZXh0IGV0YyBmcm9tIHRoZSBvdXRwdXQuCi1pZiB7ICAgKFtpc3RhcmdldCAqLSotY29mZipdICYmICFbaXN0YXJnZXQgbTg4Ki0qLSpdICYmICFbaXN0YXJnZXQgKmFybSotKi1jb2ZmXSAmJiAhW2lzdGFyZ2V0IHRodW1iKi0qLWNvZmZdKSBcCi0gICAgIHx8KFtpc3RhcmdldCAqLSotcGUqXSAmJiAhW2lzdGFyZ2V0IGFybSotKi1wZSpdICYmICFbaXN0YXJnZXQgdGh1bWIqLSotcGUqXSkgXAotICAgICB8fCBbaXN0YXJnZXQgYTI5ay0qLXVkaSpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGEyOWstKi1lYm1vbipdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGEyOWstKi1zeW0qXSBcCi0gICAgIHx8IFtpc3RhcmdldCBhMjlrLSotdnh3b3JrcypdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGkqODYtKi1haXgqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBpKjg2LSotc2NvKl0gXAotICAgICB8fCBbaXN0YXJnZXQgaSo4Ni0qLWlzYypdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGkqODYtKi1nbzMyKl0gXAotICAgICB8fCBbaXN0YXJnZXQgaSo4Ni0qLWN5Z3dpbipdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGkqODYtKi0qbnRdIFwKLSAgICAgfHwgKFtpc3RhcmdldCBpOTYwLSotdnh3b3JrczUuKl0gJiYgIVtpc3RhcmdldCBpOTYwLSotdnh3b3JrczUuMCpdKSB9IHsKLSAgICBydW5fZHVtcF90ZXN0IGNvZmZ0YWcKLX0KLQotIyBUZXN0IG9taXR0aW5nIGNvbmRpdGlvbmFscyBmcm9tIGxpc3RpbmdzLgotcHJvYyB0ZXN0X2NvbmQge30gewotICAgIGdsb2JhbCBjb21wX291dHB1dAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0KLSAgICBzZXQgdGVzdG5hbWUgImNvbmRpdGlvbmFsIGxpc3RpbmdzIgotICAgIGdhc19ydW4gY29uZC5zIC1hbGMgIj5kdW1wLm91dCIKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHsKLQlzZW5kX2xvZyAiJGNvbXBfb3V0cHV0XG4iCi0JZmFpbCAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCWlmIHsgW3JlZ2V4cF9kaWZmIGR1bXAub3V0ICRzcmNkaXIvJHN1YmRpci9jb25kLmRdIH0gewotCSAgICBmYWlsICR0ZXN0bmFtZQotCX0gZWxzZSB7Ci0JICAgIHBhc3MgJHRlc3RuYW1lCi0JfQotICAgIH0KLX0KLQotdGVzdF9jb25kCi0KLSMgRklYTUU6IHRoaXMgaXMgaGVyZSBjYXVzZSBvZiBhIGJ1ZyBpbiBEZWphR251IDEuMS4xLiBXaGVuIGl0IGlzIG5vIGxvbmdlcgotIyAgICAgICAgaW4gdXNlLCB0aGVuIHRoaXMgY2FuIGJlIHJlbW92ZWQuCi1pZiBbaW5mbyBleGlzdHMgZXJyb3JJbmZvXSB0aGVuIHsKLSAgICB1bnNldCBlcnJvckluZm8KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNjZkZmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0KLSAgICA7IFRlc3QgY2FzZSBmb3IgYXNzZW1ibGVyIG9wdGlvbiAiaXRibCIuCi0gICAgOyBSdW4gYXMgImFzIC0taXRibCBpdGJsIGl0YmwucyIKLSAgICA7IG9yIHdpdGggc3RhbmQtYWxvbmUgdGVzdCBjYXNlICJpdGJsLXRlc3QgaXRibCBpdGJsLnMiLgotICAgIDsgVGhlICJwPG4+IiByZXByZXNlbnQgcHJvY2Vzc29ycyBvZiBhIG11bHRpLXByb2Nlc3NvciBzeXN0ZW0uCi0KLSAgICBwMSBkcmVnIGQxIDEgICAgICAgIDsgZGF0YSByZWdpc3RlciAiZDEiIGZvciBDT1AxIGhhcyB2YWx1ZSAxCi0gICAgcDEgY3JlZyBjMyAzICAgICAgICA7IGN0cmwgcmVnaXN0ZXIgImMzIiBmb3IgQ09QMSBoYXMgdmFsdWUgMwotICAgIHAzIGluc24gZmllIDB4MWU6MjQtMjAgICAgICA7IGZ1bmN0aW9uICJmaWxsIiBmb3IgQ09QMyBoYXMgdmFsdWUgMzEKLSAgICBwMyBkcmVnIGQzIDMgICAgICAgIDsgZGF0YSByZWdpc3RlciAiZDMiIGZvciBDT1AzIGhhcyB2YWx1ZSAzCi0gICAgcDMgY3JlZyBjMiAyMiAgICAgICA7IGNvbnRyb2wgcmVnaXN0ZXIgImMyIiBmb3IgQ09QMyBoYXMgdmFsdWUgMjIKLSAgICBwMyBpbnNuIGZlZSAweDFlOjI0LTIwLGRyZWc6MTctMTMsY3JlZzoxMi04LGltbWVkOjctMAotCi0gICAgcDMgZHJlZyBkMyAzICAgICAgICA7IGRhdGEgcmVnaXN0ZXIgImQzIiBmb3IgQ09QMyBoYXMgdmFsdWUgMwotICAgIHAzIGNyZWcgYzIgMjIgICAgICAgOyBjb250cm9sIHJlZ2lzdGVyICJjMiIgZm9yIENPUDMgaGFzIHZhbHVlIDIyCi0gICAgcDMgaW5zbiBmdW0gMHgwMWUwMDAwMSBkcmVnOjE3LTEzIGNyZWc6MTItOAotICAgIHAzIGluc24gZm9oIDB4ZjoyNC0yMSBkcmVnOjIwLTE2IGltbWVkOjE1LTAKLQotICAgIHAzIGluc24gcGlnIDB4MToyNC0yMSpbMHgxMDB8MHgyXSwgZHJlZzoyMC0xNiwgaW1tZWQ6MTUtMCoweDEwMDAwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLXRlc3QuYyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLXRlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIzZjVkOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC10ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotCi0KLS8qIGl0YmwtdGVzdC5jCi0KLSAgIENvcHlyaWdodCAoQykgMTk5NyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBTdGFuZC1hbG9uZSB0ZXN0IGZvciBpbnN0cnVjdGlvbiBzcGVjaWZpY2F0aW9uIHRhYmxlIHN1cHBvcnQuCi0gICBSdW4gdXNpbmcgIml0YmwtdGVzdCA8aXRibD4gPGFzbS5zPiIKLSAgIHdoZXJlIDxpdGJsPiBpcyB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gdGFibGUsCi0gICBhbmQgPGFzbS5zPiBpcyB0aGUgbmFtZSBvZiB0aGUgYXNzZW1ibGVyIGZpZS4gKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJpdGJsLW9wcy5oIgotCi1zdGF0aWMgaW50IHRlc3RfcmVnIChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLCBjaGFyICpuYW1lLAotCQkgICAgIHVuc2lnbmVkIGxvbmcgdmFsKTsKLQotaW50IAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgRklMRSAqZmFzOwotICBpbnQgYWxpbmUgPSAwOwotICBjaGFyIHNbODFdLCAqbmFtZTsKLQotICBpZiAoYXJnYyA8IDMpCi0gICAgewotICAgICAgcHJpbnRmICgidXNhZ2U6ICVzIGl0YmwgYXNtLnNcbiIsIGFyZ3ZbMF0pOwotICAgICAgZXhpdCAoMCk7Ci0gICAgfQotICBpZiAoaXRibF9wYXJzZSAoYXJndlsxXSkgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsZWQgdG8gcGFyc2UgaXRibFxuIik7Ci0gICAgICBleGl0ICgwKTsKLSAgICB9Ci0KLSAgZmFzID0gZm9wZW4gKGFyZ3ZbMl0sICJyIik7Ci0gIGlmIChmYXMgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsZWQgdG8gb3BlbiBhc20gZmlsZSAlc1xuIiwgYXJndlsyXSk7Ci0gICAgICBleGl0ICgwKTsKLSAgICB9Ci0gIHdoaWxlIChmZ2V0cyAocywgODAsIGZhcykpCi0gICAgewotICAgICAgY2hhciAqcDsKLSAgICAgIGFsaW5lKys7Ci0KLSAgICAgIGlmIChwID0gc3RyY2hyIChzLCAnOycpLCBwKQkvKiBzdHJpcCBjb21tZW50cyAqLwotCSpwID0gMDsKLSAgICAgIGlmIChwID0gc3RyY2hyIChzLCAnIycpLCBwKQkvKiBzdHJpcCBjb21tZW50cyAqLwotCSpwID0gMDsKLSAgICAgIHAgPSBzICsgc3RybGVuIChzKSAtIDE7Ci0gICAgICB3aGlsZSAocCA+PSBzICYmICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnXG4nKSkJLyogc3RyaXAgdHJhaWxpbmcgc3BhY2VzICovCi0JcC0tOwotICAgICAgKihwICsgMSkgPSAwOwotICAgICAgcCA9IHM7Ci0gICAgICB3aGlsZSAoKnAgJiYgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICdcbicpKQkvKiBzdHJpcCBsZWFkaW5nIHNwYWNlcyAqLwotCXArKzsKLSAgICAgIGlmICghKnApCi0JY29udGludWU7Ci0KLSAgICAgIG5hbWUgPSBpdGJsX2dldF9maWVsZCAoJnApOwotICAgICAgaW5zbiA9IGl0YmxfYXNzZW1ibGUgKG5hbWUsIHApOwotICAgICAgaWYgKGluc24gPT0gMCkKLQlwcmludGYgKCJsaW5lICVkOiBJbnZhbGlkIGluc3RydWN0aW9uICglcylcbiIsIGFsaW5lLCBzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyIGJ1ZlsxMjhdOwotCSAgcHJpbnRmICgibGluZSAlZDogaW5zbiglcykgPSAweCV4KVxuIiwgYWxpbmUsIHMsIGluc24pOwotCSAgaWYgKCFpdGJsX2Rpc2Fzc2VtYmxlIChidWYsIGluc24pKQotCSAgICBwcmludGYgKCJsaW5lICVkOiBDYW4ndCBkaXNhc3NlbWJsZSBpbnN0cnVjdGlvbiAiCi0JCSAgICAiKDB4JXgpXG4iLCBhbGluZSwgaW5zbik7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoImxpbmUgJWQ6IGRpc2FzbSgweCV4KSA9ICVzKVxuIiwgYWxpbmUsIGluc24sIGJ1Zik7Ci0JfQotICAgIH0KLQotICB0ZXN0X3JlZyAoMSwgZV9kcmVnLCAiZDEiLCAxKTsKLSAgdGVzdF9yZWcgKDMsIGVfY3JlZywgImMyIiwgMjIpOwotICB0ZXN0X3JlZyAoMywgZV9kcmVnLCAiZDMiLCAzKTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCAKLXRlc3RfcmVnIChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLCBjaGFyICpuYW1lLAotCSAgdW5zaWduZWQgbG9uZyB2YWwpCi17Ci0gIGNoYXIgKm47Ci0gIHVuc2lnbmVkIGxvbmcgdjsKLQotICBuID0gaXRibF9nZXRfbmFtZSAocHJvY2Vzc29yLCB0eXBlLCB2YWwpOwotICBpZiAoIW4gfHwgc3RyY21wIChuLCBuYW1lKSkKLSAgICBwcmludGYgKCJFcnJvciAtIHJlZyBuYW1lIG5vdCBmb3VuZCBmb3IgcHJvZXNzb3I9JWQsIHR5cGU9JWQsIHZhbD0lZFxuIiwKLQkgICAgcHJvY2Vzc29yLCB0eXBlLCB2YWwpOwotICBlbHNlCi0gICAgcHJpbnRmICgibmFtZT0lcyBmb3VuZCBmb3IgcHJvY2Vzc29yPSVkLCB0eXBlPSVkLCB2YWw9JWRcbiIsCi0JICAgIG4sIHByb2Nlc3NvciwgdHlwZSwgdmFsKTsKLQotICAvKiBXZSByZXF1aXJlIHRoYXQgbmFtZXMgYmUgdW5pcXVlIGFtb3VuZyBwcm9jZXNzb3JzIGFuZCB0eXBlcy4gKi8KLSAgdiA9IGl0YmxfZ2V0X3JlZ192YWwgKG5hbWUpOwotICBpZiAoIXYgfHwgdiAhPSB2YWwpCi0gICAgcHJpbnRmICgiRXJyb3IgLSByZWcgdmFsIG5vdCBmb3VuZCBmb3IgcHJvY2Vzc29yPSVkLCB0eXBlPSVkLCBuYW1lPSVzXG4iLAotCSAgICBwcm9jZXNzb3IsIHR5cGUsIG5hbWUpOwotICBlbHNlCi0gICAgcHJpbnRmICgidmFsPTB4JXggZm91bmQgZm9yIHByb2Nlc3Nvcj0lZCwgdHlwZT0lZCwgbmFtZT0lc1xuIiwKLQkgICAgdiwgcHJvY2Vzc29yLCB0eXBlLCBuYW1lKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1MWFhNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCi0gICAgOyBUZXN0IGNhc2UgZm9yIGFzc2VtYmxlciBvcHRpb24gIml0YmwiLgotICAgIDsgUnVuIGFzICJhcyAtLWl0YmwgaXRibCBpdGJsLnMiCi0gICAgOyBvciB3aXRoIHN0YW5kLWFsb25lIHRlc3QgY2FzZSAiaXRibC10ZXN0IGl0YmwgaXRibC5zIi4KLQotICAgIDsgQXNzZW1ibGUgcHJvY2Vzc29yIGluc3RydWN0aW9ucyBhcyBkZWZpbmVkIGluICJpdGJsIi4KLQotICAgIGZlZSAkZDMsJGMyLDB4MSAJOyAgMHg0ZmYwNzYwMQotICAgIGZpZSAJICAJOyAgMHg0ZmYwMDAwMAotICAgIGZvaCAkMiwweDEwMAotICAgIGZ1bSAkZDMsJGMyICAgICAJOyAgMHg0ZmYwNzYwMQotICAgIHBpZyAkMiwweDEwMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvcDE0ODAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9wMTQ4MC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDBiYTgxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9wMTQ4MC5zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1zdGFydDoJLmxvbmcgMCwgMSwgMiwgMywgNCwgNSwgNiwgNwotCS5zcGFjZSAweDgwIC0gKC4gLSBzdGFydCkKLWZvbzoJLmxvbmcgNDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9wMjQyNS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3AyNDI1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOWRjOTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3AyNDI1LnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLQkudGV4dAotCS5nbG9ibCBfZnJvYm5pdHoKLV9mcm9ibml0ejoKLQkubG9uZyAxLCAyLCAzLCA0LCA1LCA2LCA3LCBHUlVNUCwgNDIKLQlHUlVNUD0uLV9mcm9ibml0egotCUhBTEZHUlVNUD1HUlVNUC8yCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvc3RydWN0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvc3RydWN0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzVkZDQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5kCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jbm06IC0tZXh0ZXJuLW9ubHkKLSNuYW1lOiBzdHJ1Y3QKLQotIyBUZXN0IHRoZSAuc3RydWN0IHBzZXVkby1vcC4KLQotMCswMCBBIHcxCi0wKzAyIEEgdzIKLTArMDQgQSB3MwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWNmZDBiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9zdHJ1Y3QucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkuZ2xvYmwJdzEKLQkuZ2xvYmwJdzIKLQkuZ2xvYmwJdzMKLQkubG9uZwkwCi0JLnN0cnVjdAkwCi13MToJLnNob3J0CTAKLXcyOgkuc2hvcnQJMAotdzM6CS5zaG9ydAkwCi0JLnRleHQKLQkubG9uZwkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwveDkzMDUwOS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3g5MzA1MDkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5OTk5MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwveDkzMDUwOS5zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0JLmxvbmcgTDItTDEKLUwxOgkubG9uZyAweDEyMzQKLUwyOgkubG9uZyAweDU2NzgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTZmN2U5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLmQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQotLio6ICAgICBmaWxlIGZvcm1hdCBlY29mZi1saXR0bGVhbHBoYQotCi1Db250ZW50cyBvZiBzZWN0aW9uIC5yZGF0YToKLSAwMDAwIDcxYTM3OTA5IDRmOTMwYTQwIDU0NDE3ODlhIGNkNGI4ODFiICBxLnkuTy4uQFRBeC4uSy4uCi0gMDAxMCAyYTQwNGY5MyA3OTA5NzFhMyA3ODlhNTQ0MCA1NDQxNzg5YSAgLkBPLnkucS54LlRAVEF4LgotIDAwMjAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgIC4uLi4uLi4uLi4uLi4uLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlYzg4MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jCi0jIEFscGhhIE9TRi8xIHRlc3RzCi0jCi0KLWlmIFtpc3RhcmdldCBhbHBoYS0qLW9zZipdIHRoZW4gewotICAgIHNldCB0ZXN0bmFtZSAiZnAgY29uc3RhbnRzIChwYXJ0IDIpIgotICAgIGlmIFtnYXNfdGVzdF9vbGQgImZwLnMiICIiICJmcCBjb25zdGFudHMgKHBhcnQgMSkiXSB0aGVuIHsKLQlvYmpkdW1wICItcyAtaiAucmRhdGEgPiBhLmR1bXAiCi0JaWYgeyBbcmVnZXhwX2RpZmYgImEuZHVtcCIgIiRzcmNkaXIvJHN1YmRpci9mcC5kIl0gPT0gMCB9IHRoZW4gewotCSAgICBwYXNzICR0ZXN0bmFtZQotCX0gZWxzZSB7Ci0JICAgIGZhaWwgJHRlc3RuYW1lCi0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2ViYmJlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0JLnJkYXRhCi0jIFRoZXNlIHRocmVlIGZvcm1hdHMgYXJlIDggYnl0ZXMgZWFjaC4KLQkudF9mbG9hdGluZyAzLjMyMTkyODA5NDg4NzM2MjE4MTcxZTAKLSMJLmJ5dGUgMHg3MSwgMHhhMywgMHg3OSwgMHgwOSwgMHg0ZiwgMHg5MywgMHgwYSwgMHg0MAotCS5kX2Zsb2F0aW5nIDMuMzIxOTI4MDk0ODg3MzYyMTgxNzFlMAotIwkuYnl0ZSAweDU0LCAweDQxLCAweDc4LCAweDlhLCAweGNkLCAweDRiLCAweDg4LCAweDFiCi0JLmdfZmxvYXRpbmcgMy4zMjE5MjgwOTQ4ODczNjIxODE3MWUwCi0jCS5ieXRlIDB4MmEsIDB4NDAsIDB4NGYsIDB4OTMsIDB4NzksIDB4MDksIDB4NzEsIDB4YTMKLSMgVGhlIG5leHQgdHdvIGFyZSBmb3VyIGJ5dGVzIGVhY2guCi0JLnNfZmxvYXRpbmcgMy4zMjE5MjgwOTQ4ODczNjIxODE3MWUwCi0jCS5ieXRlIDB4NzgsIDB4OWEsIDB4NTQsIDB4NDAsIDAsIDAsIDAsIDAKLQkuZl9mbG9hdGluZyAzLjMyMTkyODA5NDg4NzM2MjE4MTcxZTAKLSMJLmJ5dGUgMHg1NCwgMHg0MSwgMHg3OCwgMHg5YSwgMCwgMCwgMCwgMAotCS5sb25nIDAsIDAsIDAsIDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hbGlhcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2FsaWFzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWFjZjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2FsaWFzLmQKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogQE9DQAotCi0jIFRlc3QgdGhlIEBPQ0AgaW5zbi4KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi0uKmFyYwotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgQElDKzBAMDA4MjAwCUBPQ0AgcjAscjEKLTAwMDAwMDA0IEBJQyszQDZlMzgwMAlAT0NAIGZwLHNwCi0wMDAwMDAwOCBASUMrMEAxZmZlMDAJQE9DQCByMCwwCi0wMDAwMDAwYyBASUMrMEAzZmZmZmYJQE9DQCByMSwtMQotMDAwMDAwMTAgQElDKzdAZTEwNDAwCUBPQ0AgMCxyMgotMDAwMDAwMTQgQElDKzdAZTE4N2ZmCUBPQ0AgLTEscjMKLTAwMDAwMDE4IEBJQyswQDlmZmVmZglAT0NAIHI0LDI1NQotMDAwMDAwMWMgQElDKzdAZTI4YWZmCUBPQ0AgMjU1LHI1Ci0wMDAwMDAyMCBASUMrMEBkZmZmMDAJQE9DQCByNiwtMjU2Ci0wMDAwMDAyNCBASUMrN0BlMzhmMDAJQE9DQCAtMjU2LHI3Ci0wMDAwMDAyOCBASUMrMUAxZjdjMDAJQE9DQCByOCwyNTYKLTAwMDAwMDMwIEBJQysxQDNmN2MwMAlAT0NAIHI5LC0yNTcKLTAwMDAwMDM4IEBJQys3QGM1MTQwMAlAT0NAIDUxMSxyMTAKLTAwMDAwMDQwIEBJQysxQDdmN2MwMAlAT0NAIHIxMSwxMTExNjM4NTk0Ci0wMDAwMDA0OCBASUMrN0BjNjE4MDAJQE9DQCAzMDU0MTk4OTYscjEyCi0wMDAwMDA1MCBASUMrN0BmZjdjZmYJQE9DQCAyNTUsMjU2Ci0wMDAwMDA1OCBASUMrN0BkZmZlZmYJQE9DQCAyNTYsMjU1Ci0wMDAwMDA2MCBASUMrMEAxZjdjMDAJQE9DQCByMCwwCi0JCVJFTE9DOiAwMDAwMDA2NCBSX0FSQ18zMiBmb28KLTAwMDAwMDY4IEBJQyswQDAwODIwMAlAT0NAIHIwLHIxCi0wMDAwMDA2YyBASUMrMEA2MjA4MDAJQE9DQCByMyxyNAotMDAwMDAwNzAgQElDKzBAYzM4ZTAxCUBPQ0AuZXEgcjYscjcKLTAwMDAwMDc0IEBJQysxQDI1MTQwMQlAT0NALmVxIHI5LHIxMAotMDAwMDAwNzggQElDKzFAODY5YTAyCUBPQ0AubmUgcjEyLHIxMwotMDAwMDAwN2MgQElDKzFAZTgyMDAyCUBPQ0AubmUgcjE1LHIxNgotMDAwMDAwODAgQElDKzJANDlhNjAzCUBPQ0AucCByMTgscjE5Ci0wMDAwMDA4NCBASUMrMkBhYjJjMDMJQE9DQC5wIHIyMSxyMjIKLTAwMDAwMDg4IEBJQyszQDBjYjIwNAlAT0NALm4gcjI0LHIyNQotMDAwMDAwOGMgQElDKzNANmUzODA0CUBPQ0AubiBmcCxzcAotMDAwMDAwOTAgQElDKzNAY2ZiZTA1CUBPQ0AuYyBpbGluazIsYmxpbmsKLTAwMDAwMDk0IEBJQys0QDMxNDQwNQlAT0NALmMgcjMzLHIzNAotMDAwMDAwOTggQElDKzRAOTJjYTA1CUBPQ0AuYyByMzYscjM3Ci0wMDAwMDA5YyBASUMrNEBmNDUwMDYJQE9DQC5uYyByMzkscjQwCi0wMDAwMDBhMCBASUMrNUA1NWQ2MDYJQE9DQC5uYyByNDIscjQzCi0wMDAwMDBhNCBASUMrNUBiNzVjMDYJQE9DQC5uYyByNDUscjQ2Ci0wMDAwMDBhOCBASUMrNkAxOGUyMDcJQE9DQC52IHI0OCxyNDkKLTAwMDAwMGFjIEBJQys2QDdhNjgwNwlAT0NALnYgcjUxLHI1MgotMDAwMDAwYjAgQElDKzZAZGJlZTA4CUBPQ0AubnYgcjU0LHI1NQotMDAwMDAwYjQgQElDKzdAM2Q3NDA4CUBPQ0AubnYgcjU3LHI1OAotMDAwMDAwYjggQElDKzdAOWU3ODA5CUBPQ0AuZ3QgbHBfY291bnQsbHBfY291bnQKLTAwMDAwMGJjIEBJQyswQDFmN2MwYQlAT0NALmdlIHIwLDAKLTAwMDAwMGM0IEBJQys3QGMwODIwYglAT0NALmx0IDEscjEKLTAwMDAwMGNjIEBJQys3QGRmN2MwYwlAT0NALmxlIDIsMgotMDAwMDAwZDQgQElDKzBANjE4NjBkCUBPQ0AuaGkgcjMscjMKLTAwMDAwMGQ4IEBJQyswQDgyMDgwZQlAT0NALmxzIHI0LHI0Ci0wMDAwMDBkYyBASUMrMEBhMjhhMGYJQE9DQC5wbnogcjUscjUKLTAwMDAwMGUwIEBJQyswQDAwODMwMAlAT0NALmYgcjAscjEKLTAwMDAwMGU0IEBJQyswQDVlZmEwMQlAT0NALmYgcjIsMQotMDAwMDAwZTggQElDKzdAYTE4NjAxCUBPQ0AuZiAxLHIzCi0wMDAwMDBlYyBASUMrN0BhMjA4MDAJQE9DQC5mIDAscjQKLTAwMDAwMGYwIEBJQyswQGJmN2QwMAlAT0NALmYgcjUsNTEyCi0wMDAwMDBmOCBASUMrN0BjMzBkMDAJQE9DQC5mIDUxMixyNgotMDAwMDAxMDAgQElDKzdAZGY3ZDAwCUBPQ0AuZiA1MTIsNTEyCi0wMDAwMDEwOCBASUMrMEAwMDgzMDEJQE9DQC5lcS5mIHIwLHIxCi0wMDAwMDEwYyBASUMrMEAzZjdkMDIJQE9DQC5uZS5mIHIxLDAKLTAwMDAwMTE0IEBJQys3QGMxMDUwYglAT0NALmx0LmYgMCxyMgotMDAwMDAxMWMgQElDKzdAYzEwNTA5CUBPQ0AuZ3QuZiAxLHIyCi0wMDAwMDEyNCBASUMrMEAxZjdkMGMJQE9DQC5sZS5mIHIwLDUxMgotMDAwMDAxMmMgQElDKzdAYzEwNTBhCUBPQ0AuZ2UuZiA1MTIscjIKLTAwMDAwMTM0IEBJQys3QGRmN2QwNAlAT0NALm4uZiA1MTIsNTEyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYWxpYXMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hbGlhcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI0NDQwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hbGlhcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotIyBAT0NAIHRlc3QKLQotIyByZWcscmVnCi0JQE9DQCByMCxyMQotCUBPQ0AgZnAsc3AKLQotIyBzaGltbSB2YWx1ZXMKLQlAT0NAIHIwLDAKLQlAT0NAIHIxLC0xCi0JQE9DQCAwLHIyCi0JQE9DQCAtMSxyMwotCUBPQ0AgcjQsMjU1Ci0JQE9DQCAyNTUscjUKLQlAT0NAIHI2LC0yNTYKLQlAT0NAIC0yNTYscjcKLQotIyBsaW1tIHZhbHVlcwotCUBPQ0AgcjgsMjU2Ci0JQE9DQCByOSwtMjU3Ci0JQE9DQCA1MTEscjEwCi0JQE9DQCByMTEsMHg0MjQyNDI0MgotCUBPQ0AgMHgxMjM0NTY3OCxyMTIKLQotIyBzaGltbSBhbmQgbGltbQotCUBPQ0AgMjU1LDI1NgotCUBPQ0AgMjU2LDI1NQotCi0jIHN5bWJvbHMKLQlAT0NAIHIwLGZvbwotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgotCUBPQ0AuYWwgcjAscjEKLQlAT0NALnJhIHIzLHI0Ci0JQE9DQC5lcSByNixyNwotCUBPQ0AueiByOSxyMTAKLQlAT0NALm5lIHIxMixyMTMKLQlAT0NALm56IHIxNSxyMTYKLQlAT0NALnBsIHIxOCxyMTkKLQlAT0NALnAgcjIxLHIyMgotCUBPQ0AubWkgcjI0LHIyNQotCUBPQ0AubiByMjcscjI4Ci0JQE9DQC5jcyByMzAscjMxCi0JQE9DQC5jIHIzMyxyMzQKLQlAT0NALmxvIHIzNixyMzcKLQlAT0NALmNjIHIzOSxyNDAKLQlAT0NALm5jIHI0MixyNDMKLQlAT0NALmhzIHI0NSxyNDYKLQlAT0NALnZzIHI0OCxyNDkKLQlAT0NALnYgcjUxLHI1MgotCUBPQ0AudmMgcjU0LHI1NQotCUBPQ0AubnYgcjU3LHI1OAotCUBPQ0AuZ3QgcjYwLHI2MAotCUBPQ0AuZ2UgcjAsMAotCUBPQ0AubHQgMSxyMQotCUBPQ0AubGUgMiwyCi0JQE9DQC5oaSByMyxyMwotCUBPQ0AubHMgcjQscjQKLQlAT0NALnBueiByNSxyNQotCi0jIGZsYWcgc2V0dGluZwotCUBPQ0AuZiByMCxyMQotCUBPQ0AuZiByMiwxCi0JQE9DQC5mIDEscjMKLQlAT0NALmYgMCxyNAotCUBPQ0AuZiByNSw1MTIKLQlAT0NALmYgNTEyLHI2Ci0JQE9DQC5mIDUxMiw1MTIKLQotIyBjb25kaXRpb25hbCBleGVjdXRpb24gKyBmbGFnIHNldHRpbmcKLQlAT0NALmVxLmYgcjAscjEKLQlAT0NALm5lLmYgcjEsMAotCUBPQ0AubHQuZiAwLHIyCi0JQE9DQC5ndC5mIDEscjIKLQlAT0NALmxlLmYgcjAsNTEyCi0JQE9DQC5nZS5mIDUxMixyMgotCUBPQ0Aubi5mIDUxMiw1MTIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hcmMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2FyYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOTg0NTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2FyYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotIyBBUkMgZ2FzIHRlc3RzdWl0ZQotCi0jIFRlc3QgYW4gaW5zbiBmcm9tIGEgdGVtcGxhdGUgLnMvLmQuCi0jIFRoZSBiZXN0IHdheSB0byBjcmVhdGUgdGhlIC5kIGZpbGUgaXMgdG8gcnVuIHRoZSB0ZXN0cyB3aXRob3V0IGl0LCBsZXQKLSMgZGVqYWdudSBjcmFzaCwgcnVuIGFzLm5ldyBvbiB0aGUganVzdCBidWlsdCAucyBmaWxlLCBydW4gb2JqZHVtcCAtZHIgb24KLSMgdGhlIHJlc3VsdCBvZiB0aGF0LCBjb3B5IHRoZSByZXN1bHQgaW50byB0aGUgLmQgZmlsZSwgYW5kIGVkaXQgaW4gdGhlCi0jIG5lY2Vzc2FyeSBwYXR0ZXJucyAoQE9DQCwgZXRjLikuICBTb3VuZHMgY29tcGxpY2F0ZWQgYnV0IGl0J3MgZWFzeS4gIFRoZQotIyBjYXRjaCBpcyB0aGF0IHdlIGFzc3VtZSBhIHdvcmtpbmcgYXNzZW1ibGVyIGlzIHVzZWQgdG8gYnVpbGQgaXQuICBUaGF0J3MKLSMgb2J2aW91c2x5IG5vdCBlbnRpcmVseSBrb3NoZXIsIGJ1dCBvbmNlIHRoZSAuZCBmaWxlIGlzIGNyZWF0ZWQgb25lIGNhbgotIyB2ZXJpZnkgaXQncyBjb250ZW50cyBvdmVyIHRpbWUuCi0jCi0jIFRlbXBsYXRlIHBhdHRlcm5zOgotIyBAT0NAIC0gcGxhY2Vob2xkZXIgZm9yIHRoZSBvcGNvZGUKLSMgQElDKz9AIC0gcGxhY2UgaG9sZGVyIGZvciB0aGUgaW5zbiBjb2RlCi0jIEBJMys/P0AgLSBwbGFjZSBob2xkZXIgZm9yIHRoZSBvcGVyYXRpb24gY29kZSBvZiBjb2RlIDMgaW5zbnMuCi0KLXByb2MgdGVzdF90ZW1wbGF0ZV9pbnNuIHsgY3B1IHRtcGwgb3Bjb2RlIGljb2RlIH0gewotICAgIGdsb2JhbCBzcmNkaXIgc3ViZGlyIG9iamRpcgotCi0gICAgIyBDaGFuZ2UgQE9DQCBpbiB0aGUgdGVtcGxhdGUgZmlsZSB0byAkb3Bjb2RlCi0KLSAgICBzZXQgaW5fZmQgW29wZW4gJHNyY2Rpci8kc3ViZGlyLyR0bXBsLnMgcl0KLSAgICBzZXQgb3V0X2ZkIFtvcGVuICRvYmpkaXIvJG9wY29kZS5zIHddCi0gICAgIyBGSVhNRTogY2hlY2sgcmV0dXJuIGNvZGVzCi0KLSAgICBwdXRzICRvdXRfZmQgIlx0LmNwdSAkY3B1XG4iCi0gICAgd2hpbGUgeyBbZ2V0cyAkaW5fZmQgbGluZV0gPj0gMCB9IHsKLQlyZWdzdWIgIkBPQ0AiICRsaW5lICRvcGNvZGUgbGluZQotCXB1dHMgJG91dF9mZCAkbGluZQotICAgIH0KLQotICAgIGNsb3NlICRpbl9mZAotICAgIGNsb3NlICRvdXRfZmQKLQotICAgICMgQ3JlYXRlIG91dHB1dCB0ZW1wbGF0ZS4KLQotICAgIHNldCBpbl9mZCBbb3BlbiAkc3JjZGlyLyRzdWJkaXIvJHRtcGwuZCByXQotICAgIHNldCBvdXRfZmQgW29wZW4gJG9iamRpci8kb3Bjb2RlLmQgd10KLSAgICAjIEZJWE1FOiBjaGVjayByZXR1cm4gY29kZXMKLQotICAgIHdoaWxlIHsgW2dldHMgJGluX2ZkIGxpbmVdID49IDAgfSB7Ci0JcmVnc3ViICJAT0NAIiAkbGluZSAkb3Bjb2RlIGxpbmUKLQkjc2VuZF91c2VyICIkbGluZVxuIgotCWlmIFtzdHJpbmcgbWF0Y2ggIipASUMrP0AqIiAkbGluZV0gewotCSAgICAjIEluc2VydCB0aGUgb3Bjb2RlLiAgSXQgb2NjdXBpZXMgdGhlIHRvcCA1IGJpdHMuCi0JICAgIHJlZ2V4cCAiXiguKilASUNcXCsoLilAKC4qKSQiICRsaW5lIGp1bmsgbGVmdHBhcnQgbiByaWdodHBhcnQKLQkgICAgc2V0IG4gW2V4cHIgKCRpY29kZSA8PCAzKSArICRuXQotCSAgICBzZXQgbiBbZm9ybWF0ICIlMDJ4IiAkbl0KLQkgICAgcHV0cyAkb3V0X2ZkICIkbGVmdHBhcnQkbiRyaWdodHBhcnQiCi0JfSBlbHNlaWYgW3N0cmluZyBtYXRjaCAiKkBJMys/P0AqIiAkbGluZV0gewotCSAgICAjIEluc2VydCBpbnNuIDMgY29kZSAocmVnaXN0ZXIgQyBmaWVsZCkKLQkgICAgIyBiMTU9OC8wLCBiOD0xLzAgKHRoZWlyIHJlc3BlY3RpdmUgaGV4IHZhbHVlcyBpbiB0aGUgb2JqZHVtcCkKLQkgICAgcmVnZXhwICJeKC4qKUBJM1xcKyguKSguKUAoLiopJCIgJGxpbmUganVuayBsZWZ0cGFydCBiMTUgYjggcmlnaHRwYXJ0Ci0JICAgIHNldCBuIFtleHByICgkaWNvZGUgPDwgMSkgKyAoJGIxNSA8PCA0KSArICgkYjggPDwgMCldCi0JICAgIHNldCBuIFtmb3JtYXQgIiUwMngiICRuXQotCSAgICBwdXRzICRvdXRfZmQgIiRsZWZ0cGFydCRuJHJpZ2h0cGFydCIKLQl9IGVsc2UgewotCSAgICBwdXRzICRvdXRfZmQgJGxpbmUKLQl9Ci0gICAgfQotCi0gICAgY2xvc2UgJGluX2ZkCi0gICAgY2xvc2UgJG91dF9mZAotCi0gICAgIyBGaW5hbGx5LCBydW4gdGhlIHRlc3QuCi0KLSAgICBydW5fZHVtcF90ZXN0ICRvYmpkaXIvJG9wY29kZQotCi0gICAgIyAibWFrZSBjbGVhbiIgd29uJ3QgZGVsZXRlIHRoZXNlLCBzbyBmb3Igbm93IHdlIG11c3QuCi0gICAgY2F0Y2ggImV4ZWMgcm0gLWYgJG9iamRpci8kb3Bjb2RlLnMgJG9iamRpci8kb3Bjb2RlLmQiCi19Ci0KLSMgUnVuIHRoZSB0ZXN0cy4KLQotaWYgW2lzdGFyZ2V0IGFyYyotKi0qXSB0aGVuIHsKLQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIG1hdGggYWRjIDkKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIGFkZCA4Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCBhbmQgMTIKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIGJpYyAxNAotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIG1hdGggb3IgMTMKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIHNiYyAxMQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIG1hdGggc3ViIDEwCi0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCB4b3IgMTUKLQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGFsaWFzIG1vdiAxMgotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGFsaWFzIHJsYyA5Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgYWxpYXMgYXNsIDgKLSMgYGxzbCcgZ2V0cyBkdW1wZWQgYXMgYGFzbCcgc28gdGhpcyBtdXN0IGJlIHRlc3RlZCBlbHNld2hlcmUuCi0jICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgYWxpYXMgbHNsIDgKLQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIHNzaGlmdCBhc3IgMQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIHNzaGlmdCBsc3IgMgotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIHNzaGlmdCByb3IgMwotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIHNzaGlmdCBycmMgNAotCi0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgYnJhbmNoIGIgNAotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGJyYW5jaCBibCA1Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgYnJhbmNoIGxwIDYKLQotICAgIHJ1bl9kdW1wX3Rlc3QgImoiCi0KLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBpbnNuMyBzZXhiIDUKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBpbnNuMyBzZXh3IDYKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBpbnNuMyBleHRiIDcKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBpbnNuMyBleHR3IDgKLQotICAgIHJ1bl9kdW1wX3Rlc3QgImZsYWciCi0jICAgIHJ1bl9kdW1wX3Rlc3QgIm5vcCIKLQotICAgIHJ1bl9kdW1wX3Rlc3QgImxkIgotICAgIHJ1bl9kdW1wX3Rlc3QgInN0IgotCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYnJhbmNoLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYnJhbmNoLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOWIwMTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2JyYW5jaC5kCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEBPQ0AKLQotIyBUZXN0IHRoZSBAT0NAIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDx0ZXh0X2xhYmVsPiBASUMrN0BmZmZmODAJQE9DQCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDA0IDx0ZXh0X2xhYmVsXCs0PiBASUMrN0BmZmZmMDAJQE9DQCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDA4IDx0ZXh0X2xhYmVsXCs4PiBASUMrN0BmZmZlODAJQE9DQCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDBjIDx0ZXh0X2xhYmVsXCtjPiBASUMrN0BmZmZlMDEJQE9DQGVxIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMTAgPHRleHRfbGFiZWxcKzEwPiBASUMrN0BmZmZkODEJQE9DQGVxIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMTQgPHRleHRfbGFiZWxcKzE0PiBASUMrN0BmZmZkMDIJQE9DQG5lIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMTggPHRleHRfbGFiZWxcKzE4PiBASUMrN0BmZmZjODIJQE9DQG5lIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMWMgPHRleHRfbGFiZWxcKzFjPiBASUMrN0BmZmZjMDMJQE9DQHAgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAyMCA8dGV4dF9sYWJlbFwrMjA+IEBJQys3QGZmZmI4MwlAT0NAcCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDI0IDx0ZXh0X2xhYmVsXCsyND4gQElDKzdAZmZmYjA0CUBPQ0BuIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMjggPHRleHRfbGFiZWxcKzI4PiBASUMrN0BmZmZhODQJQE9DQG4gMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAyYyA8dGV4dF9sYWJlbFwrMmM+IEBJQys3QGZmZmEwNQlAT0NAYyAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDMwIDx0ZXh0X2xhYmVsXCszMD4gQElDKzdAZmZmOTg1CUBPQ0BjIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMzQgPHRleHRfbGFiZWxcKzM0PiBASUMrN0BmZmY5MDUJQE9DQGMgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAzOCA8dGV4dF9sYWJlbFwrMzg+IEBJQys3QGZmZjg4NglAT0NAbmMgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAzYyA8dGV4dF9sYWJlbFwrM2M+IEBJQys3QGZmZjgwNglAT0NAbmMgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA0MCA8dGV4dF9sYWJlbFwrNDA+IEBJQys3QGZmZjc4NglAT0NAbmMgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA0NCA8dGV4dF9sYWJlbFwrNDQ+IEBJQys3QGZmZjcwNwlAT0NAdiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDQ4IDx0ZXh0X2xhYmVsXCs0OD4gQElDKzdAZmZmNjg3CUBPQ0B2IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNGMgPHRleHRfbGFiZWxcKzRjPiBASUMrN0BmZmY2MDgJQE9DQG52IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNTAgPHRleHRfbGFiZWxcKzUwPiBASUMrN0BmZmY1ODgJQE9DQG52IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNTQgPHRleHRfbGFiZWxcKzU0PiBASUMrN0BmZmY1MDkJQE9DQGd0IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNTggPHRleHRfbGFiZWxcKzU4PiBASUMrN0BmZmY0OGEJQE9DQGdlIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNWMgPHRleHRfbGFiZWxcKzVjPiBASUMrN0BmZmY0MGIJQE9DQGx0IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNjAgPHRleHRfbGFiZWxcKzYwPiBASUMrN0BmZmYzOGMJQE9DQGxlIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNjQgPHRleHRfbGFiZWxcKzY0PiBASUMrN0BmZmYzMGQJQE9DQGhpIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNjggPHRleHRfbGFiZWxcKzY4PiBASUMrN0BmZmYyOGUJQE9DQGxzIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNmMgPHRleHRfbGFiZWxcKzZjPiBASUMrN0BmZmYyMGYJQE9DQHBueiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDcwIDx0ZXh0X2xhYmVsXCs3MD4gQElDKzdAZmZmZjgwCUBPQ0AgMDAwMDAwNzAgPHRleHRfbGFiZWxcKzcwPgotCQlSRUxPQzogMDAwMDAwNzAgUl9BUkNfQjIyX1BDUkVMIGV4dGVybmFsX3RleHRfbGFiZWwKLTAwMDAwMDc0IDx0ZXh0X2xhYmVsXCs3ND4gQElDKzBAMDAwMDAwCUBPQ0AgMDAwMDAwNzggPHRleHRfbGFiZWxcKzc4PgotMDAwMDAwNzggPHRleHRfbGFiZWxcKzc4PiBASUMrN0BmZmYwYTAJQE9DQC5kIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwN2MgPHRleHRfbGFiZWxcKzdjPiBASUMrN0BmZmYwMDAJQE9DQCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDgwIDx0ZXh0X2xhYmVsXCs4MD4gQElDKzdAZmZlZmMwCUBPQ0AuamQgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA4NCA8dGV4dF9sYWJlbFwrODQ+IEBJQys3QGZmZWYyMQlAT0NAZXEuZCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDg4IDx0ZXh0X2xhYmVsXCs4OD4gQElDKzdAZmZlZTgyCUBPQ0BuZSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDhjIDx0ZXh0X2xhYmVsXCs4Yz4gQElDKzdAZmZlZTQ2CUBPQ0BuYy5qZCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9icmFuY2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9icmFuY2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmMTYxOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYnJhbmNoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jIEBPQ0AgdGVzdAotCQotdGV4dF9sYWJlbDoKLQotIyBDb25kaXRpb24gdGVzdHMKLQlAT0NACXRleHRfbGFiZWwKLQlAT0NAYWwJdGV4dF9sYWJlbAotCUBPQ0ByYQl0ZXh0X2xhYmVsCi0JQE9DQGVxCXRleHRfbGFiZWwKLQlAT0NAegl0ZXh0X2xhYmVsCi0JQE9DQG5lCXRleHRfbGFiZWwKLQlAT0NAbnoJdGV4dF9sYWJlbAotCUBPQ0BwbAl0ZXh0X2xhYmVsCi0JQE9DQHAJdGV4dF9sYWJlbAotCUBPQ0BtaQl0ZXh0X2xhYmVsCi0JQE9DQG4JdGV4dF9sYWJlbAotCUBPQ0Bjcwl0ZXh0X2xhYmVsCi0JQE9DQGMJdGV4dF9sYWJlbAotCUBPQ0Bsbwl0ZXh0X2xhYmVsCi0JQE9DQGNjCXRleHRfbGFiZWwKLQlAT0NAbmMJdGV4dF9sYWJlbAotCUBPQ0Bocwl0ZXh0X2xhYmVsCi0JQE9DQHZzCXRleHRfbGFiZWwKLQlAT0NAdgl0ZXh0X2xhYmVsCi0JQE9DQHZjCXRleHRfbGFiZWwKLQlAT0NAbnYJdGV4dF9sYWJlbAotCUBPQ0BndAl0ZXh0X2xhYmVsCi0JQE9DQGdlCXRleHRfbGFiZWwKLQlAT0NAbHQJdGV4dF9sYWJlbAotCUBPQ0BsZQl0ZXh0X2xhYmVsCi0JQE9DQGhpCXRleHRfbGFiZWwKLQlAT0NAbHMJdGV4dF9sYWJlbAotCUBPQ0BwbnoJdGV4dF9sYWJlbAotCi0JQE9DQAlleHRlcm5hbF90ZXh0X2xhYmVsCi0KLQlAT0NACTAKLQotIyBEZWxheSBzbG90cwotCUBPQ0AuZAl0ZXh0X2xhYmVsCi0JQE9DQC5uZAl0ZXh0X2xhYmVsCi0JQE9DQC5qZAl0ZXh0X2xhYmVsCi0KLSMgQ29uZGl0aW9uIHRlc3RzIGFuZCBkZWxheSBzbG90cwotCUBPQ0BlcS5kCXRleHRfbGFiZWwKLQlAT0NAbmUubmQJdGV4dF9sYWJlbAotCUBPQ0BjYy5qZAl0ZXh0X2xhYmVsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvZmxhZy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhmMzZkMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvZmxhZy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IGZsYWcKLQotIyBUZXN0IHRoZSBmbGFnIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCi0KLU5vIHN5bWJvbHMgaW4gImEub3V0Ii4KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCAxZmEwMDAwMAlmbGFnIHIwCi0wMDAwMDAwNCAxZmJmODAwMQlmbGFnIDEKLTAwMDAwMDA4IDFmYmY4MDAyCWZsYWcgMgotMDAwMDAwMGMgMWZiZjgwMDQJZmxhZyA0Ci0wMDAwMDAxMCAxZmJmODAwOAlmbGFnIDgKLTAwMDAwMDE0IDFmYmY4MDEwCWZsYWcgMTYKLTAwMDAwMDE4IDFmYmY4MDIwCWZsYWcgMzIKLTAwMDAwMDFjIDFmYmY4MDQwCWZsYWcgNjQKLTAwMDAwMDIwIDFmYmY4MDgwCWZsYWcgMTI4Ci0wMDAwMDAyNCAxZmJmMDAwMAlmbGFnIC0yMTQ3NDgzNjQ3Ci0wMDAwMDAyYyAxZmEwMDAwYglmbGFnLmx0IHIwCi0wMDAwMDAzMCAxZmJmMDAwOQlmbGFnLmd0IDEKLTAwMDAwMDM4IDFmYmYwMDA5CWZsYWcuZ3QgMgotMDAwMDAwNDAgMWZiZjAwMDkJZmxhZy5ndCA0Ci0wMDAwMDA0OCAxZmJmMDAwOQlmbGFnLmd0IDgKLTAwMDAwMDUwIDFmYmYwMDA5CWZsYWcuZ3QgMTYKLTAwMDAwMDU4IDFmYmYwMDA5CWZsYWcuZ3QgMzIKLTAwMDAwMDYwIDFmYmYwMDA5CWZsYWcuZ3QgNjQKLTAwMDAwMDY4IDFmYmYwMDA5CWZsYWcuZ3QgMTI4Ci0wMDAwMDA3MCAxZmJmMDAwYQlmbGFnLmdlIC0yMTQ3NDgzNjQ3CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvZmxhZy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA2N2FhNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvZmxhZy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBmbGFnIHRlc3QKLQotCWZsYWcJcjAKLQotCWZsYWcJMQotCWZsYWcJMgotCWZsYWcJNAotCWZsYWcJOAotCWZsYWcJMTYKLQlmbGFnCTMyCi0JZmxhZwk2NAotCWZsYWcJMTI4Ci0KLQlmbGFnCTB4ODAwMDAwMDEKLQotCWZsYWcubHQJcjAKLQotCWZsYWcuZ3QJMQotCWZsYWcuZ3QJMgotCWZsYWcuZ3QJNAotCWZsYWcuZ3QJOAotCWZsYWcuZ3QJMTYKLQlmbGFnLmd0CTMyCi0JZmxhZy5ndAk2NAotCWZsYWcuZ3QJMTI4Ci0KLQlmbGFnLmdlCTB4ODAwMDAwMDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9pbnNuMy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2luc24zLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMjA3YTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2luc24zLmQKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogQE9DQAotCi0jIFRlc3QgdGhlIEBPQ0AgaW5zbi4KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi0uKmFyYwotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgMTgwMEBJMys4MEAwMAlAT0NAIHIwLHIxCi0wMDAwMDAwNCAxYjZlQEkzKzAwQDAwCUBPQ0AgZnAsc3AKLTAwMDAwMDA4IDE4MWZASTMrODBAMDAJQE9DQCByMCwwCi0wMDAwMDAwYyAxODNmQEkzKzgxQGZmCUBPQ0AgcjEsLTEKLTAwMDAwMDEwIDFmZTFASTMrMDBAMDAJQE9DQCAwLHIyCi0wMDAwMDAxNCAxZmUxQEkzKzgxQGZmCUBPQ0AgLTEscjMKLTAwMDAwMDE4IDE4OWZASTMrODBAZmYJQE9DQCByNCwyNTUKLTAwMDAwMDFjIDFmZTJASTMrODBAZmYJQE9DQCAyNTUscjUKLTAwMDAwMDIwIDE4ZGZASTMrODFAMDAJQE9DQCByNiwtMjU2Ci0wMDAwMDAyNCAxZmUzQEkzKzgxQDAwCUBPQ0AgLTI1NixyNwotMDAwMDAwMjggMTkxZkBJMyswMEAwMAlAT0NAIHI4LDI1NgotMDAwMDAwMzAgMTkzZkBJMyswMEAwMAlAT0NAIHI5LC0yNTcKLTAwMDAwMDM4IDFmYzVASTMrMDBAMDAJQE9DQCA1MTEscjEwCi0wMDAwMDA0MCAxOTdmQEkzKzAwQDAwCUBPQ0AgcjExLDExMTE2Mzg1OTQKLTAwMDAwMDQ4IDFmYzZASTMrMDBAMDAJQE9DQCAzMDU0MTk4OTYscjEyCi0wMDAwMDA1MCAxZmZmQEkzKzAwQGZmCUBPQ0AgMjU1LDI1NgotMDAwMDAwNTggMWZkZkBJMys4MEBmZglAT0NAIDI1NiwyNTUKLTAwMDAwMDYwIDE4MWZASTMrMDBAMDAJQE9DQCByMCwwCi0JCVJFTE9DOiAwMDAwMDA2NCBSX0FSQ18zMiBmb28KLTAwMDAwMDY4IDE5NDVASTMrODBAMDEJQE9DQC5lcSByMTAscjExCi0wMDAwMDA2YyAxOTg2QEkzKzgwQDAyCUBPQ0AubmUgcjEyLHIxMwotMDAwMDAwNzAgMTlkZkBJMyswMEAwYglAT0NALmx0IHIxNCwwCi0wMDAwMDA3OCAxOWZmQEkzKzAwQDA5CUBPQ0AuZ3QgcjE1LDUxMgotMDAwMDAwODAgMTgwMEBJMys4MUAwMAlAT0NALmYgcjAscjEKLTAwMDAwMDg0IDE4NWVASTMrODBAMDEJQE9DQC5mIHIyLDEKLTAwMDAwMDg4IDFmYTJASTMrMDBAMDAJQE9DQC5mIDAscjQKLTAwMDAwMDhjIDE4YmZASTMrMDFAMDAJQE9DQC5mIHI1LDUxMgotMDAwMDAwOTQgMWZjM0BJMyswMUAwMAlAT0NALmYgNTEyLHI2Ci0wMDAwMDA5YyAxZmRmQEkzKzAxQDAwCUBPQ0AuZiA1MTIsNTEyCi0wMDAwMDBhNCAxODAwQEkzKzgxQDAxCUBPQ0AuZXEuZiByMCxyMQotMDAwMDAwYTggMTgzZkBJMyswMUAwMglAT0NALm5lLmYgcjEsMAotMDAwMDAwYjAgMWZjMUBJMyswMUAwYglAT0NALmx0LmYgMCxyMgotMDAwMDAwYjggMWZjMUBJMyswMUAwOQlAT0NALmd0LmYgMSxyMgotMDAwMDAwYzAgMTgxZkBJMyswMUAwYwlAT0NALmxlLmYgcjAsNTEyCi0wMDAwMDBjOCAxZmMxQEkzKzAxQDBhCUBPQ0AuZ2UuZiA1MTIscjIKLTAwMDAwMGQwIDFmZGZASTMrMDFAMDQJQE9DQC5uLmYgNTEyLDUxMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2luc24zLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvaW5zbjMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyZmI4OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvaW5zbjMucworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSMgSW5zbiAzIEBPQ0AgdGVzdAotCi0jIHJlZyxyZWcKLQlAT0NAIHIwLHIxCi0JQE9DQCBmcCxzcAotCi0jIHNoaW1tIHZhbHVlcwotCUBPQ0AgcjAsMAotCUBPQ0AgcjEsLTEKLQlAT0NAIDAscjIKLQlAT0NAIC0xLHIzCi0JQE9DQCByNCwyNTUKLQlAT0NAIDI1NSxyNQotCUBPQ0AgcjYsLTI1NgotCUBPQ0AgLTI1NixyNwotCi0jIGxpbW0gdmFsdWVzCi0JQE9DQCByOCwyNTYKLQlAT0NAIHI5LC0yNTcKLQlAT0NAIDUxMSxyMTAKLQlAT0NAIHIxMSwweDQyNDI0MjQyCi0JQE9DQCAweDEyMzQ1Njc4LHIxMgotCi0jIHNoaW1tIGFuZCBsaW1tCi0JQE9DQCAyNTUsMjU2Ci0JQE9DQCAyNTYsMjU1Ci0KLSMgc3ltYm9scwotCUBPQ0AgcjAsZm9vCi0KLSMgY29uZGl0aW9uYWwgZXhlY3V0aW9uCi0JQE9DQC5lcSByMTAscjExCi0JQE9DQC5uZSByMTIscjEzCi0JQE9DQC5sdCByMTQsMAotCUBPQ0AuZ3QgcjE1LDUxMgotCi0jIGZsYWcgc2V0dGluZwotCUBPQ0AuZiByMCxyMQotCUBPQ0AuZiByMiwxCi0JQE9DQC5mIDAscjQKLQlAT0NALmYgcjUsNTEyCi0JQE9DQC5mIDUxMixyNgotCUBPQ0AuZiA1MTIsNTEyCi0KLSMgY29uZGl0aW9uYWwgZXhlY3V0aW9uICsgZmxhZyBzZXR0aW5nCi0JQE9DQC5lcS5mIHIwLHIxCi0JQE9DQC5uZS5mIHIxLDAKLQlAT0NALmx0LmYgMCxyMgotCUBPQ0AuZ3QuZiAxLHIyCi0JQE9DQC5sZS5mIHIwLDUxMgotCUBPQ0AuZ2UuZiA1MTIscjIKLQlAT0NALm4uZiA1MTIsNTEyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvai5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ouZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxMDNmMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvai5kCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IGoKLQotIyBUZXN0IHRoZSBqIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDx0ZXh0X2xhYmVsPiAzODAwMDAwMAlqIHIwCi0wMDAwMDAwNCA8dGV4dF9sYWJlbFwrND4gMzgwMDAwMjAJai5kIHIwCi0wMDAwMDAwOCA8dGV4dF9sYWJlbFwrOD4gMzgwMDAwNDAJai5qZCByMAotMDAwMDAwMGMgPHRleHRfbGFiZWxcK2M+IDM4MDAwMDAwCWogcjAKLTAwMDAwMDEwIDx0ZXh0X2xhYmVsXCsxMD4gMzgwMDgwMDAJaiByMQotMDAwMDAwMTQgPHRleHRfbGFiZWxcKzE0PiAzODAwODAyMAlqLmQgcjEKLTAwMDAwMDE4IDx0ZXh0X2xhYmVsXCsxOD4gMzgwMDgwNDAJai5qZCByMQotMDAwMDAwMWMgPHRleHRfbGFiZWxcKzFjPiAzODAwODAwMAlqIHIxCi0wMDAwMDAyMCA8dGV4dF9sYWJlbFwrMjA+IDM4MWYwMDAwCWogMAotCQlSRUxPQzogMDAwMDAwMjQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDI4IDx0ZXh0X2xhYmVsXCsyOD4gMzgxZjAwMDAJaiAwCi0JCVJFTE9DOiAwMDAwMDAyYyBSX0FSQ18zMiAudGV4dAotMDAwMDAwMzAgPHRleHRfbGFiZWxcKzMwPiAzODFmMDAwMAlqIDAKLQkJUkVMT0M6IDAwMDAwMDM0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDAzOCA8dGV4dF9sYWJlbFwrMzg+IDM4MWYwMDAxCWplcSAwCi0JCVJFTE9DOiAwMDAwMDAzYyBSX0FSQ18zMiAudGV4dAotMDAwMDAwNDAgPHRleHRfbGFiZWxcKzQwPiAzODFmMDAwMQlqZXEgMAotCQlSRUxPQzogMDAwMDAwNDQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDQ4IDx0ZXh0X2xhYmVsXCs0OD4gMzgxZjAwMDIJam5lIDAKLQkJUkVMT0M6IDAwMDAwMDRjIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDA1MCA8dGV4dF9sYWJlbFwrNTA+IDM4MWYwMDAyCWpuZSAwCi0JCVJFTE9DOiAwMDAwMDA1NCBSX0FSQ18zMiAudGV4dAotMDAwMDAwNTggPHRleHRfbGFiZWxcKzU4PiAzODFmMDAwMwlqcCAwCi0JCVJFTE9DOiAwMDAwMDA1YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwNjAgPHRleHRfbGFiZWxcKzYwPiAzODFmMDAwMwlqcCAwCi0JCVJFTE9DOiAwMDAwMDA2NCBSX0FSQ18zMiAudGV4dAotMDAwMDAwNjggPHRleHRfbGFiZWxcKzY4PiAzODFmMDAwNAlqbiAwCi0JCVJFTE9DOiAwMDAwMDA2YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwNzAgPHRleHRfbGFiZWxcKzcwPiAzODFmMDAwNAlqbiAwCi0JCVJFTE9DOiAwMDAwMDA3NCBSX0FSQ18zMiAudGV4dAotMDAwMDAwNzggPHRleHRfbGFiZWxcKzc4PiAzODFmMDAwNQlqYyAwCi0JCVJFTE9DOiAwMDAwMDA3YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwODAgPHRleHRfbGFiZWxcKzgwPiAzODFmMDAwNQlqYyAwCi0JCVJFTE9DOiAwMDAwMDA4NCBSX0FSQ18zMiAudGV4dAotMDAwMDAwODggPHRleHRfbGFiZWxcKzg4PiAzODFmMDAwNQlqYyAwCi0JCVJFTE9DOiAwMDAwMDA4YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwOTAgPHRleHRfbGFiZWxcKzkwPiAzODFmMDAwNglqbmMgMAotCQlSRUxPQzogMDAwMDAwOTQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDk4IDx0ZXh0X2xhYmVsXCs5OD4gMzgxZjAwMDYJam5jIDAKLQkJUkVMT0M6IDAwMDAwMDljIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBhMCA8dGV4dF9sYWJlbFwrYTA+IDM4MWYwMDA2CWpuYyAwCi0JCVJFTE9DOiAwMDAwMDBhNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwYTggPHRleHRfbGFiZWxcK2E4PiAzODFmMDAwNwlqdiAwCi0JCVJFTE9DOiAwMDAwMDBhYyBSX0FSQ18zMiAudGV4dAotMDAwMDAwYjAgPHRleHRfbGFiZWxcK2IwPiAzODFmMDAwNwlqdiAwCi0JCVJFTE9DOiAwMDAwMDBiNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwYjggPHRleHRfbGFiZWxcK2I4PiAzODFmMDAwOAlqbnYgMAotCQlSRUxPQzogMDAwMDAwYmMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGMwIDx0ZXh0X2xhYmVsXCtjMD4gMzgxZjAwMDgJam52IDAKLQkJUkVMT0M6IDAwMDAwMGM0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBjOCA8dGV4dF9sYWJlbFwrYzg+IDM4MWYwMDA5CWpndCAwCi0JCVJFTE9DOiAwMDAwMDBjYyBSX0FSQ18zMiAudGV4dAotMDAwMDAwZDAgPHRleHRfbGFiZWxcK2QwPiAzODFmMDAwYQlqZ2UgMAotCQlSRUxPQzogMDAwMDAwZDQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGQ4IDx0ZXh0X2xhYmVsXCtkOD4gMzgxZjAwMGIJamx0IDAKLQkJUkVMT0M6IDAwMDAwMGRjIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBlMCA8dGV4dF9sYWJlbFwrZTA+IDM4MWYwMDBjCWpsZSAwCi0JCVJFTE9DOiAwMDAwMDBlNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwZTggPHRleHRfbGFiZWxcK2U4PiAzODFmMDAwZAlqaGkgMAotCQlSRUxPQzogMDAwMDAwZWMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGYwIDx0ZXh0X2xhYmVsXCtmMD4gMzgxZjAwMGUJamxzIDAKLQkJUkVMT0M6IDAwMDAwMGY0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBmOCA8dGV4dF9sYWJlbFwrZjg+IDM4MWYwMDBmCWpwbnogMAotCQlSRUxPQzogMDAwMDAwZmMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMTAwIDx0ZXh0X2xhYmVsXCsxMDA+IDM4MWYwMDAwCWogMAotCQlSRUxPQzogMDAwMDAxMDQgUl9BUkNfMzIgZXh0ZXJuYWxfdGV4dF9sYWJlbAotMDAwMDAxMDggPHRleHRfbGFiZWxcKzEwOD4gMzgxZjAwMDAJaiAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvai5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2oucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2MWFmMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvai5zCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyBqIHRlc3QKLQkKLXRleHRfbGFiZWw6CQotCWoJcjAKLQlqLmQJcjAKLQlqLmpkCXIwCi0Jai5uZAlyMAotCi0Jai5mCVtyMV0KLQlqLmQuZglbcjFdCi0Jai5qZC5mCVtyMV0KLQlqLm5kLmYJW3IxXQotCi0Jagl0ZXh0X2xhYmVsCi0JamFsCXRleHRfbGFiZWwKLQlqcmEJdGV4dF9sYWJlbAotCWplcQl0ZXh0X2xhYmVsCi0JanoJdGV4dF9sYWJlbAotCWpuZQl0ZXh0X2xhYmVsCi0Jam56CXRleHRfbGFiZWwKLQlqcGwJdGV4dF9sYWJlbAotCWpwCXRleHRfbGFiZWwKLQlqbWkJdGV4dF9sYWJlbAotCWpuCXRleHRfbGFiZWwKLQlqY3MJdGV4dF9sYWJlbAotCWpjCXRleHRfbGFiZWwKLQlqbG8JdGV4dF9sYWJlbAotCWpjYwl0ZXh0X2xhYmVsCi0Jam5jCXRleHRfbGFiZWwKLQlqaHMJdGV4dF9sYWJlbAotCWp2cwl0ZXh0X2xhYmVsCi0JanYJdGV4dF9sYWJlbAotCWp2Ywl0ZXh0X2xhYmVsCi0Jam52CXRleHRfbGFiZWwKLQlqZ3QJdGV4dF9sYWJlbAotCWpnZQl0ZXh0X2xhYmVsCi0Jamx0CXRleHRfbGFiZWwKLQlqbGUJdGV4dF9sYWJlbAotCWpoaQl0ZXh0X2xhYmVsCi0JamxzCXRleHRfbGFiZWwKLQlqcG56CXRleHRfbGFiZWwKLQotCWoJZXh0ZXJuYWxfdGV4dF9sYWJlbAotCi0JagkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbGQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9sZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmRkMGExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9sZC5kCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IGxkL2xyCi0KLSMgVGVzdCB0aGUgbGQvbHIgaW5zbi4KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi0uKmFyYwotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgMDgwMDgwMDAJbGQgcjAsXFtyMVxdCi0wMDAwMDAwNCAwMDQxODgwMAlsZCByMixcW3IzLHI0XF0KLTAwMDAwMDA4IDA4YTMwMDAxCWxkIHI1LFxbcjYsMVxdCi0wMDAwMDAwYyAwOGU0MDFmZglsZCByNyxcW3I4LC0xXF0KLTAwMDAwMDEwIDA5MjUwMGZmCWxkIHI5LFxbcjEwLDI1NVxdCi0wMDAwMDAxNCAwOTY2MDEwMAlsZCByMTEsXFtyMTIsLTI1NlxdCi0wMDAwMDAxOCAwMWE3N2MwMAlsZCByMTMsXFtyMTQsMjU2XF0KLTAwMDAwMDIwIDAxZTg3YzAwCWxkIHIxNSxcW3IxNiwtMjU3XF0KLTAwMDAwMDI4IDAyM2YzODAwCWxkIHIxNyxcWzMwNTQxOTg5NixzcFxdCi0wMDAwMDAzMCAwYTdmMDAwMAlsZCByMTksXFswXF0KLQkJUkVMT0M6IDAwMDAwMDM0IFJfQVJDXzMyIGZvbwotMDAwMDAwMzggMGE5ZjAwMDAJbGQgcjIwLFxbNFxdCi0JCVJFTE9DOiAwMDAwMDAzYyBSX0FSQ18zMiBmb28KLTAwMDAwMDQwIDA4MWY4NDAwCWxkYiByMCxcWzBcXQotMDAwMDAwNDQgMDgxZjg4MDAJbGR3IHIwLFxbMFxdCi0wMDAwMDA0OCAwODFmODIwMAlsZC54IHIwLFxbMFxdCi0wMDAwMDA0YyAwODFmOTAwMAlsZC5hIHIwLFxbMFxdCi0wMDAwMDA1MCAwODFmYzAwMAlsZC5kaSByMCxcWzBcXQotMDAwMDAwNTQgMDgwMDU2MDAJbGRiLnguYS5kaSByMCxcW3IwXF0KLTAwMDAwMDU4IDA4MDBhMDAwCWxyIHIwLFxbcjFcXQotMDAwMDAwNWMgMDg1ZmEwMDAJbHIgcjIsXFtzdGF0dXNcXQotMDAwMDAwNjAgMDg3ZjIwMDAJbHIgcjMsXFszMDU0MTk4OTZcXQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2xkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyNjcxOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbGQucworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMgbGQvbHIgdGVzdAotCQotCWxkCXIwLFtyMV0KLQlsZAlyMixbcjMscjRdCi0JbGQJcjUsW3I2LDFdCi0JbGQJcjcsW3I4LC0xXQotCWxkCXI5LFtyMTAsMjU1XQotCWxkCXIxMSxbcjEyLC0yNTZdCi0JbGQJcjEzLFtyMTQsMjU2XQotCWxkCXIxNSxbcjE2LC0yNTddCi0JbGQJcjE3LFsweDEyMzQ1Njc4LHIyOF0KLQlsZAlyMTksW2Zvb10KLQlsZAlyMjAsW2Zvbys0XQotCi0JbGRiCXIwLFswXQotCWxkdwlyMCxbMF0KLQlsZC54CXIwLFswXQotCWxkLmEJcjAsWzBdCi0JbGQuZGkJcjAsWzBdCi0JbGRiLnguYS5kaSByMCxbcjBdCi0KLQlscglyMCxbcjFdCi0JbHIJcjIsW3N0YXR1c10KLQlscglyMyxbMHgxMjM0NTY3OF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9tYXRoLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbWF0aC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2I3OWM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9tYXRoLmQKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogQE9DQAotCi0jIFRlc3QgdGhlIEBPQ0AgaW5zbi4KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi0uKmFyYwotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgQElDKzBAMDA4NDAwCUBPQ0AgcjAscjEscjIKLTAwMDAwMDA0IEBJQyszQDRkYjgwMAlAT0NAIHIyNixmcCxzcAotMDAwMDAwMDggQElDKzNAYWYzZTAwCUBPQ0AgaWxpbmsxLGlsaW5rMixibGluawotMDAwMDAwMGMgQElDKzdANWRmODAwCUBPQ0AgcjU4LHI1OSxscF9jb3VudAotMDAwMDAwMTAgQElDKzBAMDBmZTAwCUBPQ0AgcjAscjEsMAotMDAwMDAwMTQgQElDKzBAMWY4NDAwCUBPQ0AgcjAsMCxyMgotMDAwMDAwMTggQElDKzdAZTA4NDAwCUBPQ0AgMCxyMSxyMgotMDAwMDAwMWMgQElDKzBAMDBmZmZmCUBPQ0AgcjAscjEsLTEKLTAwMDAwMDIwIEBJQyswQDFmODVmZglAT0NAIHIwLC0xLHIyCi0wMDAwMDAyNCBASUMrN0BlMDg1ZmYJQE9DQCAtMSxyMSxyMgotMDAwMDAwMjggQElDKzBAMDBmZWZmCUBPQ0AgcjAscjEsMjU1Ci0wMDAwMDAyYyBASUMrMEAxZjg0ZmYJQE9DQCByMCwyNTUscjIKLTAwMDAwMDMwIEBJQys3QGUwODRmZglAT0NAIDI1NSxyMSxyMgotMDAwMDAwMzQgQElDKzBAMDBmZjAwCUBPQ0AgcjAscjEsLTI1NgotMDAwMDAwMzggQElDKzBAMWY4NTAwCUBPQ0AgcjAsLTI1NixyMgotMDAwMDAwM2MgQElDKzdAZTA4NTAwCUBPQ0AgLTI1NixyMSxyMgotMDAwMDAwNDAgQElDKzBAMDBmYzAwCUBPQ0AgcjAscjEsMjU2Ci0wMDAwMDA0OCBASUMrMEAxZjA0MDAJQE9DQCByMCwtMjU3LHIyCi0wMDAwMDA1MCBASUMrN0BjMDg0MDAJQE9DQCA1MTEscjEscjIKLTAwMDAwMDU4IEBJQyswQDFmMDQwMAlAT0NAIHIwLDExMTE2Mzg1OTQscjIKLTAwMDAwMDYwIEBJQys3QGMwZmMwMAlAT0NAIDMwNTQxOTg5NixyMSwzMDU0MTk4OTYKLTAwMDAwMDY4IEBJQyswQDFmZmNmZglAT0NAIHIwLDI1NSwyNTYKLTAwMDAwMDcwIEBJQyswQDFmN2VmZglAT0NAIHIwLDI1NiwyNTUKLTAwMDAwMDc4IEBJQys3QGUwZmNmZglAT0NAIDI1NSxyMSwyNTYKLTAwMDAwMDgwIEBJQys3QGZmMDRmZglAT0NAIDI1NSwyNTYscjIKLTAwMDAwMDg4IEBJQys3QGMwZmVmZglAT0NAIDI1NixyMSwyNTUKLTAwMDAwMDkwIEBJQys3QGRmODRmZglAT0NAIDI1NiwyNTUscjIKLTAwMDAwMDk4IEBJQyswQDAwZmMwMAlAT0NAIHIwLHIxLDAKLQkJUkVMT0M6IDAwMDAwMDljIFJfQVJDXzMyIGZvbwotMDAwMDAwYTAgQElDKzBAMDA4NDAwCUBPQ0AgcjAscjEscjIKLTAwMDAwMGE0IEBJQyswQDYyMGEwMAlAT0NAIHIzLHI0LHI1Ci0wMDAwMDBhOCBASUMrMEBjMzkwMDEJQE9DQC5lcSByNixyNyxyOAotMDAwMDAwYWMgQElDKzFAMjUxNjAxCUBPQ0AuZXEgcjkscjEwLHIxMQotMDAwMDAwYjAgQElDKzFAODY5YzAyCUBPQ0AubmUgcjEyLHIxMyxyMTQKLTAwMDAwMGI0IEBJQysxQGU4MjIwMglAT0NALm5lIHIxNSxyMTYscjE3Ci0wMDAwMDBiOCBASUMrMkA0OWE4MDMJQE9DQC5wIHIxOCxyMTkscjIwCi0wMDAwMDBiYyBASUMrMkBhYjJlMDMJQE9DQC5wIHIyMSxyMjIscjIzCi0wMDAwMDBjMCBASUMrM0AwY2I0MDQJQE9DQC5uIHIyNCxyMjUscjI2Ci0wMDAwMDBjNCBASUMrM0A2ZTNhMDQJQE9DQC5uIGZwLHNwLGlsaW5rMQotMDAwMDAwYzggQElDKzNAY2ZjMDA1CUBPQ0AuYyBpbGluazIsYmxpbmsscjMyCi0wMDAwMDBjYyBASUMrNEAzMTQ2MDUJQE9DQC5jIHIzMyxyMzQscjM1Ci0wMDAwMDBkMCBASUMrNEA5MmNjMDUJQE9DQC5jIHIzNixyMzcscjM4Ci0wMDAwMDBkNCBASUMrNEBmNDUyMDYJQE9DQC5uYyByMzkscjQwLHI0MQotMDAwMDAwZDggQElDKzVANTVkODA2CUBPQ0AubmMgcjQyLHI0MyxyNDQKLTAwMDAwMGRjIEBJQys1QGI3NWUwNglAT0NALm5jIHI0NSxyNDYscjQ3Ci0wMDAwMDBlMCBASUMrNkAxOGU0MDcJQE9DQC52IHI0OCxyNDkscjUwCi0wMDAwMDBlNCBASUMrNkA3YTZhMDcJQE9DQC52IHI1MSxyNTIscjUzCi0wMDAwMDBlOCBASUMrNkBkYmYwMDgJQE9DQC5udiByNTQscjU1LHI1NgotMDAwMDAwZWMgQElDKzdAM2Q3NjA4CUBPQ0AubnYgcjU3LHI1OCxyNTkKLTAwMDAwMGYwIEBJQys3QDllMDAwOQlAT0NALmd0IGxwX2NvdW50LGxwX2NvdW50LHIwCi0wMDAwMDBmNCBASUMrMEAwMDdjMGEJQE9DQC5nZSByMCxyMCwwCi0wMDAwMDBmYyBASUMrMEAzZjAyMGIJQE9DQC5sdCByMSwxLHIxCi0wMDAwMDEwNCBASUMrN0BjMDg0MGMJQE9DQC5sZSAyLHIxLHIyCi0wMDAwMDEwYyBASUMrMEA3ZjA2MGQJQE9DQC5oaSByMywzLHIzCi0wMDAwMDExNCBASUMrN0BkZjA4MGUJQE9DQC5scyA0LDQscjQKLTAwMDAwMTFjIEBJQys3QGMyZmMwZglAT0NALnBueiA1LHI1LDUKLTAwMDAwMTI0IEBJQyswQDAwODUwMAlAT0NALmYgcjAscjEscjIKLTAwMDAwMTI4IEBJQyswQDAwZmEwMQlAT0NALmYgcjAscjEsMQotMDAwMDAxMmMgQElDKzBAMWU4NDAxCUBPQ0AuZiByMCwxLHIyCi0wMDAwMDEzMCBASUMrN0BhMDg0MDAJQE9DQC5mIDAscjEscjIKLTAwMDAwMTM0IEBJQyswQDAwZmQwMAlAT0NALmYgcjAscjEsNTEyCi0wMDAwMDEzYyBASUMrMEAxZjA1MDAJQE9DQC5mIHIwLDUxMixyMgotMDAwMDAxNDQgQElDKzdAYzA4NTAwCUBPQ0AuZiA1MTIscjEscjIKLTAwMDAwMTRjIEBJQyswQDAwODUwMQlAT0NALmVxLmYgcjAscjEscjIKLTAwMDAwMTUwIEBJQyswQDAwZmQwMglAT0NALm5lLmYgcjAscjEsMAotMDAwMDAxNTggQElDKzBAMWYwNTBiCUBPQ0AubHQuZiByMCwwLHIyCi0wMDAwMDE2MCBASUMrN0BjMDg1MDkJQE9DQC5ndC5mIDAscjEscjIKLTAwMDAwMTY4IEBJQyswQDAwZmQwYwlAT0NALmxlLmYgcjAscjEsNTEyCi0wMDAwMDE3MCBASUMrMEAxZjA1MGEJQE9DQC5nZS5mIHIwLDUxMixyMgotMDAwMDAxNzggQElDKzdAYzA4NTA0CUBPQ0Aubi5mIDUxMixyMSxyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL21hdGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9tYXRoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NTE2OWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL21hdGgucworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLSMgQE9DQCB0ZXN0Ci0KLSMgU3RheSBhd2F5IGZyb20gb3BlcmFuZHMgd2l0aCBkdXBsaWNhdGUgYXJndW1lbnRzIChlZzoJYWRkIHIwLHIxLHIxKS4KLSMgVGhleSB3aWxsIGJlIGRpc2Fzc2VtYmxlZCBhcyB0aGV5J3JlIG1hY3JvIGNvdW50ZXJwYXJ0cyAoZWc6IGFzbCByMCxyMSkuCi0KLSMgcmVnLHJlZyxyZWcKLQlAT0NAIHIwLHIxLHIyCi0JQE9DQCByMjYsZnAsc3AKLQlAT0NAIGlsaW5rMSxpbGluazIsYmxpbmsKLQlAT0NAIHI1OCxyNTksbHBfY291bnQKLQotIyBzaGltbSB2YWx1ZXMKLQlAT0NAIHIwLHIxLDAKLQlAT0NAIHIwLDAscjIKLQlAT0NAIDAscjEscjIKLQlAT0NAIHIwLHIxLC0xCi0JQE9DQCByMCwtMSxyMgotCUBPQ0AgLTEscjEscjIKLQlAT0NAIHIwLHIxLDI1NQotCUBPQ0AgcjAsMjU1LHIyCi0JQE9DQCAyNTUscjEscjIKLQlAT0NAIHIwLHIxLC0yNTYKLQlAT0NAIHIwLC0yNTYscjIKLQlAT0NAIC0yNTYscjEscjIKLQotIyBsaW1tIHZhbHVlcwotCUBPQ0AgcjAscjEsMjU2Ci0JQE9DQCByMCwtMjU3LHIyCi0JQE9DQCA1MTEscjEscjIKLQlAT0NAIHIwLDB4NDI0MjQyNDIscjIKLQlAT0NAIDB4MTIzNDU2NzgscjEsMHgxMjM0NTY3OAotCi0jIHNoaW1tIGFuZCBsaW1tCi0JQE9DQCByMCwyNTUsMjU2Ci0JQE9DQCByMCwyNTYsMjU1Ci0JQE9DQCAyNTUscjEsMjU2Ci0JQE9DQCAyNTUsMjU2LHIyCi0JQE9DQCAyNTYscjEsMjU1Ci0JQE9DQCAyNTYsMjU1LHIyCi0KLSMgc3ltYm9scwotCUBPQ0AgcjAscjEsZm9vCi0KLSMgY29uZGl0aW9uYWwgZXhlY3V0aW9uCi0JQE9DQC5hbCByMCxyMSxyMgotCUBPQ0AucmEgcjMscjQscjUKLQlAT0NALmVxIHI2LHI3LHI4Ci0JQE9DQC56IHI5LHIxMCxyMTEKLQlAT0NALm5lIHIxMixyMTMscjE0Ci0JQE9DQC5ueiByMTUscjE2LHIxNwotCUBPQ0AucGwgcjE4LHIxOSxyMjAKLQlAT0NALnAgcjIxLHIyMixyMjMKLQlAT0NALm1pIHIyNCxyMjUscjI2Ci0JQE9DQC5uIHIyNyxyMjgscjI5Ci0JQE9DQC5jcyByMzAscjMxLHIzMgotCUBPQ0AuYyByMzMscjM0LHIzNQotCUBPQ0AubG8gcjM2LHIzNyxyMzgKLQlAT0NALmNjIHIzOSxyNDAscjQxCi0JQE9DQC5uYyByNDIscjQzLHI0NAotCUBPQ0AuaHMgcjQ1LHI0NixyNDcKLQlAT0NALnZzIHI0OCxyNDkscjUwCi0JQE9DQC52IHI1MSxyNTIscjUzCi0JQE9DQC52YyByNTQscjU1LHI1NgotCUBPQ0AubnYgcjU3LHI1OCxyNTkKLQlAT0NALmd0IHI2MCxyNjAscjAKLQlAT0NALmdlIHIwLHIwLDAKLQlAT0NALmx0IHIxLDEscjEKLQlAT0NALmxlIDIscjEscjIKLQlAT0NALmhpIHIzLDMscjMKLQlAT0NALmxzIDQsNCxyNAotCUBPQ0AucG56IDUscjUsNQotCi0jIGZsYWcgc2V0dGluZwotCUBPQ0AuZiByMCxyMSxyMgotCUBPQ0AuZiByMCxyMSwxCi0JQE9DQC5mIHIwLDEscjIKLQlAT0NALmYgMCxyMSxyMgotCUBPQ0AuZiByMCxyMSw1MTIKLQlAT0NALmYgcjAsNTEyLHIyCi0JQE9DQC5mIDUxMixyMSxyMgotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiArIGZsYWcgc2V0dGluZwotCUBPQ0AuZXEuZiByMCxyMSxyMgotCUBPQ0AubmUuZiByMCxyMSwwCi0JQE9DQC5sdC5mIHIwLDAscjIKLQlAT0NALmd0LmYgMCxyMSxyMgotCUBPQ0AubGUuZiByMCxyMSw1MTIKLQlAT0NALmdlLmYgcjAsNTEyLHIyCi0JQE9DQC5uLmYgNTEyLHIxLHIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3NoaWZ0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3NoaWZ0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMjA3YTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3NzaGlmdC5kCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEBPQ0AKLQotIyBUZXN0IHRoZSBAT0NAIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDE4MDBASTMrODBAMDAJQE9DQCByMCxyMQotMDAwMDAwMDQgMWI2ZUBJMyswMEAwMAlAT0NAIGZwLHNwCi0wMDAwMDAwOCAxODFmQEkzKzgwQDAwCUBPQ0AgcjAsMAotMDAwMDAwMGMgMTgzZkBJMys4MUBmZglAT0NAIHIxLC0xCi0wMDAwMDAxMCAxZmUxQEkzKzAwQDAwCUBPQ0AgMCxyMgotMDAwMDAwMTQgMWZlMUBJMys4MUBmZglAT0NAIC0xLHIzCi0wMDAwMDAxOCAxODlmQEkzKzgwQGZmCUBPQ0AgcjQsMjU1Ci0wMDAwMDAxYyAxZmUyQEkzKzgwQGZmCUBPQ0AgMjU1LHI1Ci0wMDAwMDAyMCAxOGRmQEkzKzgxQDAwCUBPQ0AgcjYsLTI1NgotMDAwMDAwMjQgMWZlM0BJMys4MUAwMAlAT0NAIC0yNTYscjcKLTAwMDAwMDI4IDE5MWZASTMrMDBAMDAJQE9DQCByOCwyNTYKLTAwMDAwMDMwIDE5M2ZASTMrMDBAMDAJQE9DQCByOSwtMjU3Ci0wMDAwMDAzOCAxZmM1QEkzKzAwQDAwCUBPQ0AgNTExLHIxMAotMDAwMDAwNDAgMTk3ZkBJMyswMEAwMAlAT0NAIHIxMSwxMTExNjM4NTk0Ci0wMDAwMDA0OCAxZmM2QEkzKzAwQDAwCUBPQ0AgMzA1NDE5ODk2LHIxMgotMDAwMDAwNTAgMWZmZkBJMyswMEBmZglAT0NAIDI1NSwyNTYKLTAwMDAwMDU4IDFmZGZASTMrODBAZmYJQE9DQCAyNTYsMjU1Ci0wMDAwMDA2MCAxODFmQEkzKzAwQDAwCUBPQ0AgcjAsMAotCQlSRUxPQzogMDAwMDAwNjQgUl9BUkNfMzIgZm9vCi0wMDAwMDA2OCAxOTQ1QEkzKzgwQDAxCUBPQ0AuZXEgcjEwLHIxMQotMDAwMDAwNmMgMTk4NkBJMys4MEAwMglAT0NALm5lIHIxMixyMTMKLTAwMDAwMDcwIDE5ZGZASTMrMDBAMGIJQE9DQC5sdCByMTQsMAotMDAwMDAwNzggMTlmZkBJMyswMEAwOQlAT0NALmd0IHIxNSw1MTIKLTAwMDAwMDgwIDE4MDBASTMrODFAMDAJQE9DQC5mIHIwLHIxCi0wMDAwMDA4NCAxODVlQEkzKzgwQDAxCUBPQ0AuZiByMiwxCi0wMDAwMDA4OCAxZmEyQEkzKzAwQDAwCUBPQ0AuZiAwLHI0Ci0wMDAwMDA4YyAxOGJmQEkzKzAxQDAwCUBPQ0AuZiByNSw1MTIKLTAwMDAwMDk0IDFmYzNASTMrMDFAMDAJQE9DQC5mIDUxMixyNgotMDAwMDAwOWMgMWZkZkBJMyswMUAwMAlAT0NALmYgNTEyLDUxMgotMDAwMDAwYTQgMTgwMEBJMys4MUAwMQlAT0NALmVxLmYgcjAscjEKLTAwMDAwMGE4IDE4M2ZASTMrMDFAMDIJQE9DQC5uZS5mIHIxLDAKLTAwMDAwMGIwIDFmYzFASTMrMDFAMGIJQE9DQC5sdC5mIDAscjIKLTAwMDAwMGI4IDFmYzFASTMrMDFAMDkJQE9DQC5ndC5mIDEscjIKLTAwMDAwMGMwIDE4MWZASTMrMDFAMGMJQE9DQC5sZS5mIHIwLDUxMgotMDAwMDAwYzggMWZjMUBJMyswMUAwYQlAT0NALmdlLmYgNTEyLHIyCi0wMDAwMDBkMCAxZmRmQEkzKzAxQDA0CUBPQ0Aubi5mIDUxMiw1MTIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zc2hpZnQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zc2hpZnQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmYTY2MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3NoaWZ0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIFNpbmdsZSBzaGlmdCBAT0NAIHRlc3QKLQotIyByZWcscmVnCi0JQE9DQCByMCxyMQotCUBPQ0AgZnAsc3AKLQotIyBzaGltbSB2YWx1ZXMKLQlAT0NAIHIwLDAKLQlAT0NAIHIxLC0xCi0JQE9DQCAwLHIyCi0JQE9DQCAtMSxyMwotCUBPQ0AgcjQsMjU1Ci0JQE9DQCAyNTUscjUKLQlAT0NAIHI2LC0yNTYKLQlAT0NAIC0yNTYscjcKLQotIyBsaW1tIHZhbHVlcwotCUBPQ0AgcjgsMjU2Ci0JQE9DQCByOSwtMjU3Ci0JQE9DQCA1MTEscjEwCi0JQE9DQCByMTEsMHg0MjQyNDI0MgotCUBPQ0AgMHgxMjM0NTY3OCxyMTIKLQotIyBzaGltbSBhbmQgbGltbQotCUBPQ0AgMjU1LDI1NgotCUBPQ0AgMjU2LDI1NQotCi0jIHN5bWJvbHMKLQlAT0NAIHIwLGZvbwotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgotCUBPQ0AuZXEgcjEwLHIxMQotCUBPQ0AubmUgcjEyLHIxMwotCUBPQ0AubHQgcjE0LDAKLQlAT0NALmd0IHIxNSw1MTIKLQotIyBmbGFnIHNldHRpbmcKLQlAT0NALmYgcjAscjEKLQlAT0NALmYgcjIsMQotCUBPQ0AuZiAwLHI0Ci0JQE9DQC5mIHI1LDUxMgotCUBPQ0AuZiA1MTIscjYKLQlAT0NALmYgNTEyLDUxMgotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiArIGZsYWcgc2V0dGluZwotCUBPQ0AuZXEuZiByMCxyMQotCUBPQ0AubmUuZiByMSwwCi0JQE9DQC5sdC5mIDAscjIKLQlAT0NALmd0LmYgMSxyMgotCUBPQ0AubGUuZiByMCw1MTIKLQlAT0NALmdlLmYgNTEyLHIyCi0JQE9DQC5uLmYgNTEyLDUxMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhOTlhOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBzdC9zcgotCi0jIFRlc3QgdGhlIHN0L3NyIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDEwMDA4MDAwCXN0IHIwLFxbcjFcXQotMDAwMDAwMDQgMTAwMzBhMDEJc3QgcjUsXFtyNiwxXF0KLTAwMDAwMDA4IDEwMDQwZmZmCXN0IHI3LFxbcjgsLTFcXQotMDAwMDAwMGMgMTAwNTEyZmYJc3QgcjksXFtyMTAsMjU1XF0KLTAwMDAwMDEwIDEwMDYxNzAwCXN0IHIxMSxcW3IxMiwtMjU2XF0KLTAwMDAwMDE0IDEwMWYyNjAwCXN0IHIxOSxcWzBcXQotCQlSRUxPQzogMDAwMDAwMTggUl9BUkNfMzIgZm9vCi0wMDAwMDAxYyAxMDFmMjgwMAlzdCByMjAsXFs0XF0KLQkJUkVMT0M6IDAwMDAwMDIwIFJfQVJDXzMyIGZvbwotMDAwMDAwMjQgMTA1ZjAwMDAJc3RiIHIwLFxbMFxdCi0wMDAwMDAyYyAxMDlmMDAwMAlzdHcgcjAsXFswXF0KLTAwMDAwMDM0IDExMWYwMDAwCXN0LmEgcjAsXFswXF0KLTAwMDAwMDNjIDE0MWYwMDAwCXN0LmRpIHIwLFxbMFxdCi0wMDAwMDA0NCAxNTQwMDAwMAlzdGIuYS5kaSByMCxcW3IwXF0KLTAwMDAwMDQ4IDEyMDA4MDAwCXNyIHIwLFxbcjFcXQotMDAwMDAwNGMgMTIxZjg0MDAJc3IgcjIsXFtzdGF0dXNcXQotMDAwMDAwNTAgMTIxZjA2MDAJc3IgcjMsXFszMDU0MTk4OTZcXQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhZjE5OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3QucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgc3Qvc3IgdGVzdAotCQotCXN0CXIwLFtyMV0KLQlzdAlyNSxbcjYsMV0KLQlzdAlyNyxbcjgsLTFdCi0Jc3QJcjksW3IxMCwyNTVdCi0Jc3QJcjExLFtyMTIsLTI1Nl0KLQlzdAlyMTksW2Zvb10KLQlzdAlyMjAsW2Zvbys0XQotCi0Jc3RiCXIwLFswXQotCXN0dwlyMCxbMF0KLQlzdC5hCXIwLFswXQotCXN0LmRpCXIwLFswXQotCXN0Yi5hLmRpIHIwLFtyMF0KLQotCXNyCXIwLFtyMV0KLQlzcglyMixbc3RhdHVzXQotCXNyCXIzLFsweDEyMzQ1Njc4XQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3dhcm4uZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3dhcm4uZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWZmMTI2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy93YXJuLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgVGVzdCBhc3NlbWJsZXIgd2FybmluZ3MuCi0KLWlmIFtpc3RhcmdldCBhcmMqLSotKl0gewotCi0gICAgbG9hZF9saWIgZ2FzLWRnLmV4cAotCi0gICAgZGctaW5pdAotCi0gICAgZGctcnVudGVzdCBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3ViZGlyL3dhcm4qLnNdXSAiIiAiIgotCi0gICAgZGctZmluaXNoCi0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy93YXJuLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvd2Fybi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmNiNDM3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy93YXJuLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi07IFRlc3QgQVJDIHNwZWNpZmljIGFzc2VtYmxlciB3YXJuaW5ncwotOwotOyB7IGRnLWRvIGFzc2VtYmxlIHsgdGFyZ2V0IGFyYy0qLSogfSB9Ci0KLQliLmQgZm9vCi0JbW92IHIwLDI1Ngk7IHsgZGctd2FybmluZyAiOCBieXRlIGluc3RydWN0aW9uIGluIGRlbGF5IHNsb3QiICI4IGJ5dGUgaW5zbiBpbiBkZWxheSBzbG90IiB9Ci0KLQlqLmQgZm9vCQk7IHsgZGctd2FybmluZyAiOCBieXRlIGp1bXAgaW5zdHJ1Y3Rpb24gd2l0aCBkZWxheSBzbG90IiAiOCBieXRlIGp1bXAgd2l0aCBkZWxheSBzbG90IiB9Ci0JbW92IHIwLHIxCi0KLQlzdWIuZiAwLHIwLHIyCi0JYmVxIGZvbwkJOyB7IGRnLXdhcm5pbmcgImNvbmRpdGlvbmFsIGJyYW5jaCBmb2xsb3dzIHNldCBvZiBmbGFncyIgImNjIHNldC9icmFuY2ggbm9wIHRlc3QiIH0KLQotZm9vOgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FyY2g0dC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FyY2g0dC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDI4ZjdmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcmNoNHQucworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCQotCWJ4CXIwCi0JYnhlcQlyMQotCi1mb286CQotCWxkcmgJcjMsIGZvbwotCWxkcnNoCXI0LCBbcjVdCi0JbGRyc2IJcjQsIFtyMSwgcjNdCi0JbGRyc2gJcjEsIFtyNCwgcjRdIQotCWxkcmVxc2IJcjEsIFtyNSwgLXIzXQotCWxkcm5laAlyMiwgW3I2XSwgcjcKLQlsZHJjY3NoIHIyLCBbcjddLCArcjgKLQlsZHJzYglyMiwgW3IzLCAjMjU1XQotCWxkcnNoCXIxLCBbcjQsICMtMjUwXQotCWxkcnNiCXIxLCBbcjUsICMrMjQwXQotCi0Jc3RyaAlyMiwgYmFyCi0Jc3RybmVoCXIzLCBbcjNdCi1iYXI6CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm0uZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjFjNTRkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm0uZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIwotIyBTb21lIEFSTSB0ZXN0cwotIwotaWYgW2lzdGFyZ2V0IGFybS0qLSpdIHRoZW4gewotICAgIHJ1bl9kdW1wX3Rlc3QgImluc3QiCi0KLSAgICBnYXNfdGVzdCAiYXJtMy5zIiAiIiAkc3Rkb3B0bGlzdCAiQXJtIDMgaW5zdHJ1Y3Rpb25zIgotCi0gICAgZ2FzX3Rlc3QgImFybTYucyIgIiIgJHN0ZG9wdGxpc3QgIkFybSA2IGluc3RydWN0aW9ucyIKLQotICAgIGdhc190ZXN0ICJhcm03ZG0ucyIgIiIgJHN0ZG9wdGxpc3QgIkFybSA3RE0gaW5zdHJ1Y3Rpb25zIgotCi0gICAgcnVuX2R1bXBfdGVzdCAiYXJtN3QiCi0KLSAgICBnYXNfdGVzdCAidGh1bWIucyIgIiIgJHN0ZG9wdGxpc3QgIlRodW1iIGluc3RydWN0aW9ucyIKLQotICAgIGdhc190ZXN0ICJhcmNoNHQucyIgIiIgJHN0ZG9wdGxpc3QgIkFybSBhcmNoaXRlY3R1cmUgNHQgaW5zdHJ1Y3Rpb25zIgotCi0gICAgZ2FzX3Rlc3QgImNvcHJvLnMiICIiICRzdGRvcHRsaXN0ICJDbyBwcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIgotCi0gICAgZ2FzX3Rlc3QgImltbWVkLnMiICIiICRzdGRvcHRsaXN0ICJpbW1lZGlhdGUgZXhwcmVzc2lvbnMiCi0KLSAgICBnYXNfdGVzdCAiZmxvYXQucyIgIiIgJHN0ZG9wdGxpc3QgIkNvcmUgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIgotfQotCi0jIE5vdCBhbGwgYXJtIHRhcmdldHMgYXJlIGJpLWVuZGlhbiwgc28gb25seSBydW4gdGhpcyB0ZXN0IG9uIG9uZXMKLSMgd2Uga25vdyB0aGF0IGFyZS4gIEZJWE1FOiBXZSBzaG91bGQgcHJvYmFibHkgYWxzbyBrZXkgb2ZmIGFybWViL2FybWVsLgotCi1pZiBbaXN0YXJnZXQgYXJtLSotcGVdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJsZS1mcGNvbnN0IgotCi0gICAgIyBTaW5jZSBiaWctZW5kaWFuIG51bWJlcnMgaGF2ZSB0aGUgbm9ybWFsIGZvcm1hdCwgdGhpcyBkb2Vzbid0IGV4aXN0LgotICAgICNydW5fZHVtcF90ZXN0ICJiZS1mcGNvbnN0IgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm0zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViY2Y5MTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTMucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotLnRleHQKLS5hbGlnbiAwCi0Jc3dwCXIwLCByMSwgW3I4XQotCXN3cGIJcjIsIHIzLCBbcjNdCi0Jc3dwZ2ViCXI0LCByMSwgW3I0XQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtNi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1MTcxMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtNi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLnRleHQKLS5hbGlnbiAwCi0JCi0JbXJzCXI4LCBjcHNyCi0JbXJzZXEJcjksIGNwc3JfYWxsCi0JbXJzCXIyLCBzcHNyCi0KLQltc3IJY3BzciwgcjEKLQltc3JuZQljcHNyX2ZsZywgIzB4ZjAwMDAwMDAKLQltc3IJc3Bzcl9mbGcsIHI4Ci0JbXNyCXNwc3JfYWxsLCByOQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN2RtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN2RtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OTZjNzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTdkbS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLnRleHQKLS5hbGlnbiAwCi0JCi0Jc211bGwJcjAsIHIxLCByMiwgcjMKLQl1bXVsbAlyMCwgcjEsIHIyLCByMwotCXNtbGFsCXIwLCByMSwgcjIsIHIzCi0JdW1sYWwJcjAsIHIxLCByNCwgcjMKLQotCXNtdWxsbmUJcjAsIHIxLCByMywgcjQKLQlzbXVsbHMJcjEsIHIwLCByOSwgcjExCi0JdW1sYWxlcXMgcjIsIHI5LCByNCwgcjkKLQlzbWxhbGdlIHIxNCwgcjEwLCByOCwgcjE0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm03dC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDNhMTYxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm03dC5kCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLS1zaG93LXJhdy1pbnNuCi0jbmFtZTogQVJNIGFybTd0Ci0jYXM6IC1tYXJtN3QgLUVMCi0KLSMgVGVzdCB0aGUgaGFsZndvcmQgYW5kIHNpZ25leHRlbmQgbWVtb3J5IHRyYW5zZmVyczoKLQotLio6ICtmaWxlIGZvcm1hdCAuKmFybS4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCA8W14+XSo+IGUxZDEwMGIwID8JbGRyaAlyMCwgXFtyMVxdCi0wMDAwMDAwNCA8W14+XSo+IGUxZjEwMGIwID8JbGRyaAlyMCwgXFtyMVxdIQotMDAwMDAwMDggPFtePl0qPiBlMTkxMDBiMiA/CWxkcmgJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMDBjIDxbXj5dKj4gZTFiMTAwYjIgPwlsZHJoCXIwLCBcW3IxLCByMlxdIQotMDAwMDAwMTAgPFtePl0qPiBlMWQxMDBiYyA/CWxkcmgJcjAsIFxbcjEsICMxMlxdCi0wMDAwMDAxNCA8W14+XSo+IGUxZjEwMGJjID8JbGRyaAlyMCwgXFtyMSwgIzEyXF0hCi0wMDAwMDAxOCA8W14+XSo+IGUxNTEwMGJjID8JbGRyaAlyMCwgXFtyMSwgLSMxMlxdCi0wMDAwMDAxYyA8W14+XSo+IGUwOTEwMGIyID8JbGRyaAlyMCwgXFtyMVxdLCByMgotMDAwMDAwMjAgPFtePl0qPiBlM2EwMGNmZiA/CW1vdglyMCwgIzY1MjgwCi0wMDAwMDAyNCA8W14+XSo+IGUxZGYwYmI0ID8JbGRyaAlyMCwgMDAwMDAwZTAgPFwkXCRsaXRfAjE+Ci0wMDAwMDAyOCA8W14+XSo+IGUxZGYwYWJjID8JbGRyaAlyMCwgMDAwMDAwZGMgPC5MMj4KLTAwMDAwMDJjIDxbXj5dKj4gZTFjMTAwYjAgPwlzdHJoCXIwLCBcW3IxXF0KLTAwMDAwMDMwIDxbXj5dKj4gZTFlMTAwYjAgPwlzdHJoCXIwLCBcW3IxXF0hCi0wMDAwMDAzNCA8W14+XSo+IGUxODEwMGIyID8Jc3RyaAlyMCwgXFtyMSwgcjJcXQotMDAwMDAwMzggPFtePl0qPiBlMWExMDBiMiA/CXN0cmgJcjAsIFxbcjEsIHIyXF0hCi0wMDAwMDAzYyA8W14+XSo+IGUxYzEwMGJjID8Jc3RyaAlyMCwgXFtyMSwgIzEyXF0KLTAwMDAwMDQwIDxbXj5dKj4gZTFlMTAwYmMgPwlzdHJoCXIwLCBcW3IxLCAjMTJcXSEKLTAwMDAwMDQ0IDxbXj5dKj4gZTE0MTAwYmMgPwlzdHJoCXIwLCBcW3IxLCAtIzEyXF0KLTAwMDAwMDQ4IDxbXj5dKj4gZTA4MTAwYjIgPwlzdHJoCXIwLCBcW3IxXF0sIHIyCi0wMDAwMDA0YyA8W14+XSo+IGUxY2YwOGI4ID8Jc3RyaAlyMCwgMDAwMDAwZGMgPC5MMj4KLTAwMDAwMDUwIDxbXj5dKj4gZTFkMTAwZDAgPwlsZHJzYglyMCwgXFtyMVxdCi0wMDAwMDA1NCA8W14+XSo+IGUxZjEwMGQwID8JbGRyc2IJcjAsIFxbcjFcXSEKLTAwMDAwMDU4IDxbXj5dKj4gZTE5MTAwZDIgPwlsZHJzYglyMCwgXFtyMSwgcjJcXQotMDAwMDAwNWMgPFtePl0qPiBlMWIxMDBkMiA/CWxkcnNiCXIwLCBcW3IxLCByMlxdIQotMDAwMDAwNjAgPFtePl0qPiBlMWQxMDBkYyA/CWxkcnNiCXIwLCBcW3IxLCAjMTJcXQotMDAwMDAwNjQgPFtePl0qPiBlMWYxMDBkYyA/CWxkcnNiCXIwLCBcW3IxLCAjMTJcXSEKLTAwMDAwMDY4IDxbXj5dKj4gZTE1MTAwZGMgPwlsZHJzYglyMCwgXFtyMSwgLSMxMlxdCi0wMDAwMDA2YyA8W14+XSo+IGUwOTEwMGQyID8JbGRyc2IJcjAsIFxbcjFcXSwgcjIKLTAwMDAwMDcwIDxbXj5dKj4gZTNhMDAwZGUgPwltb3YJcjAsICMyMjIKLTAwMDAwMDc0IDxbXj5dKj4gZTFkZjA2ZDAgPwlsZHJzYglyMCwgMDAwMDAwZGMgPC5MMj4KLTAwMDAwMDc4IDxbXj5dKj4gZTFkMTAwZjAgPwlsZHJzaAlyMCwgXFtyMVxdCi0wMDAwMDA3YyA8W14+XSo+IGUxZjEwMGYwID8JbGRyc2gJcjAsIFxbcjFcXSEKLTAwMDAwMDgwIDxbXj5dKj4gZTE5MTAwZjIgPwlsZHJzaAlyMCwgXFtyMSwgcjJcXQotMDAwMDAwODQgPFtePl0qPiBlMWIxMDBmMiA/CWxkcnNoCXIwLCBcW3IxLCByMlxdIQotMDAwMDAwODggPFtePl0qPiBlMWQxMDBmYyA/CWxkcnNoCXIwLCBcW3IxLCAjMTJcXQotMDAwMDAwOGMgPFtePl0qPiBlMWYxMDBmYyA/CWxkcnNoCXIwLCBcW3IxLCAjMTJcXSEKLTAwMDAwMDkwIDxbXj5dKj4gZTE1MTAwZmMgPwlsZHJzaAlyMCwgXFtyMSwgLSMxMlxdCi0wMDAwMDA5NCA8W14+XSo+IGUwOTEwMGYyID8JbGRyc2gJcjAsIFxbcjFcXSwgcjIKLTAwMDAwMDk4IDxbXj5dKj4gZTNhMDBjZmYgPwltb3YJcjAsICM2NTI4MAotMDAwMDAwOWMgPFtePl0qPiBlMWRmMDNmYyA/CWxkcnNoCXIwLCAwMDAwMDBlMCA8XCRcJGxpdF8CMT4KLTAwMDAwMGEwIDxbXj5dKj4gZTFkZjAzZjQgPwlsZHJzaAlyMCwgMDAwMDAwZGMgPC5MMj4KLTAwMDAwMGE0IDxbXj5dKj4gZTE5MTAwYjIgPwlsZHJoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBhOCA8W14+XSo+IDExOTEwMGIyID8JbGRybmVoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBhYyA8W14+XSo+IDgxOTEwMGIyID8JbGRyaGloCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBiMCA8W14+XSo+IGIxOTEwMGIyID8JbGRybHRoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBiNCA8W14+XSo+IGUxOTEwMGYyID8JbGRyc2gJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGI4IDxbXj5dKj4gMTE5MTAwZjIgPwlsZHJuZXNoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBiYyA8W14+XSo+IDgxOTEwMGYyID8JbGRyaGlzaAlyMCwgXFtyMSwgcjJcXQotMDAwMDAwYzAgPFtePl0qPiBiMTkxMDBmMiA/CWxkcmx0c2gJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGM0IDxbXj5dKj4gZTE5MTAwZDIgPwlsZHJzYglyMCwgXFtyMSwgcjJcXQotMDAwMDAwYzggPFtePl0qPiAxMTkxMDBkMiA/CWxkcm5lc2IJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGNjIDxbXj5dKj4gODE5MTAwZDIgPwlsZHJoaXNiCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBkMCA8W14+XSo+IGIxOTEwMGQyID8JbGRybHRzYglyMCwgXFtyMSwgcjJcXQotMDAwMDAwZDQgPFtePl0qPiBlMWRmMDBmNCA/CWxkcnNoCXIwLCAwMDAwMDBlMCA8XCRcJGxpdF8CMT4KLTAwMDAwMGQ4IDxbXj5dKj4gZTFkZjAwZjQgPwlsZHJzaAlyMCwgMDAwMDAwZTQgPFwkXCRsaXRfAjFcKzB4ND4KLTAwMDAwMGRjIDxbXj5dKj4gMDAwMDAwMDAgPwlhbmRlcQlyMCwgcjAsIHIwCi1bCQldKmRjOi4qLkxDMAotMDAwMDAwZTAgPFtePl0qPiAwMDAwYzBkZSA/CS4qCi0wMDAwMDBlNCA8W14+XSo+IDAwMDBkZWFkID8JLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm03dC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTd0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NmU5MGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTd0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0JLnNlY3Rpb24JLnJkYXRhCi0JLmFsaWduCTAKLS5MQzA6Ci0JLmFzY2lpCSJzb21lIGRhdGFcMDAwIgotCi0JLnRleHQKLQkuYWxpZ24JMAotCi1sb2FkaGFsZndvcmRzOgotCWxkcmgJcjAsIFtyMV0KLQlsZHJoCXIwLCBbcjFdIQotCWxkcmgJcjAsIFtyMSwgcjJdCi0JbGRyaAlyMCwgW3IxLCByMl0hCi0JbGRyaAlyMCwgW3IxLCMweDBDXQotCWxkcmgJcjAsIFtyMSwjMHgwQ10hCi0JbGRyaAlyMCwgW3IxLCMtMHgwQ10KLQlsZHJoCXIwLCBbcjFdLCByMgotCWxkcmgJcjAsID0weEZGMDAKLQlsZHJoCXIwLCA9MHhDMERFCi0JbGRyaAlyMCwgLkwyCi0KLXN0b3JlaGFsZndvcmRzOgotCXN0cmgJcjAsIFtyMV0KLQlzdHJoCXIwLCBbcjFdIQotCXN0cmgJcjAsIFtyMSwgcjJdCi0Jc3RyaAlyMCwgW3IxLCByMl0hCi0Jc3RyaAlyMCwgW3IxLCMweDBDXQotCXN0cmgJcjAsIFtyMSwjMHgwQ10hCi0Jc3RyaAlyMCwgW3IxLCMtMHgwQ10KLQlzdHJoCXIwLCBbcjFdLCByMgotCXN0cmgJcjAsIC5MMgotCi1sb2Fkc2lnbmVkYnl0ZXM6Ci0JbGRyc2IJcjAsIFtyMV0KLQlsZHJzYglyMCwgW3IxXSEKLQlsZHJzYglyMCwgW3IxLCByMl0KLQlsZHJzYglyMCwgW3IxLCByMl0hCi0JbGRyc2IJcjAsIFtyMSwjMHgwQ10KLQlsZHJzYglyMCwgW3IxLCMweDBDXSEKLQlsZHJzYglyMCwgW3IxLCMtMHgwQ10KLQlsZHJzYglyMCwgW3IxXSwgcjIKLQlsZHJzYglyMCwgPTB4REUKLQlsZHJzYglyMCwgLkwyCi0KLWxvYWRzaWduZWRoYWxmd29yZHM6Ci0JbGRyc2gJcjAsIFtyMV0KLQlsZHJzaAlyMCwgW3IxXSEKLQlsZHJzaAlyMCwgW3IxLCByMl0KLQlsZHJzaAlyMCwgW3IxLCByMl0hCi0JbGRyc2gJcjAsIFtyMSwgIzB4MENdCi0JbGRyc2gJcjAsIFtyMSwgIzB4MENdIQotCWxkcnNoCXIwLCBbcjEsICMtMHgwQ10KLQlsZHJzaAlyMCwgW3IxXSwgcjIKLQlsZHJzaAlyMCwgPTB4RkYwMAotCWxkcnNoCXIwLCA9MHhDMERFCi0JbGRyc2gJcjAsIC5MMgotCQotbWlzYzoKLQlsZHJhbGgJcjAsIFtyMSwgcjJdCi0JbGRybmVoCXIwLCBbcjEsIHIyXQotCWxkcmhpaAlyMCwgW3IxLCByMl0KLQlsZHJsdGgJcjAsIFtyMSwgcjJdCi0KLQlsZHJhbHNoCXIwLCBbcjEsIHIyXQotCWxkcm5lc2gJcjAsIFtyMSwgcjJdCi0JbGRyaGlzaAlyMCwgW3IxLCByMl0KLQlsZHJsdHNoCXIwLCBbcjEsIHIyXQotCi0JbGRyYWxzYglyMCwgW3IxLCByMl0KLQlsZHJuZXNiCXIwLCBbcjEsIHIyXQotCWxkcmhpc2IJcjAsIFtyMSwgcjJdCi0JbGRybHRzYglyMCwgW3IxLCByMl0KLQotCWxkcnNoCXIwLCA9MHhDMERFCi0JbGRyc2gJcjAsID0weERFQUQKLQotCS5hbGlnbgotLkwyOgotCS53b3JkCS5MQzAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9jb3Byby5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2NvcHJvLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YzliOTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2NvcHJvLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0udGV4dAotLmFsaWduIDAKLQljZHAJcDEsIDQsIGNyMSwgY3IyLCBjcjMKLQljZHBlcQk0LCAzLCBjMSwgYzQsIGNyNSwgNQotCi0JbGRjCTUsIGNyOSwgW3IzXQotCWxkY2wJMSwgY3IxNCwgW3IxLCAjMzJdCi0JbGRjbWkJMCwgY3IwLCBbcjIsICMxMDIwXSEKLQlsZGNwbGwJcDcsIGMxLCBbcjNdLCAjNjQKLQlsZGMJcDAsIGM4LCBmb28KLWZvbzoKLQotCXN0Ywk1LCBjcjAsIFtyM10KLQlzdGNsCTMsIGNyMTUsIFtyMCwgIzhdCi0Jc3RjZXEJcDQsIGNyMTIsIFtyMiwgIzEwMF0hCi0Jc3RjY2MJcDYsIGM4LCBbcjRdLCAjNDgKLQlzdGMJcDEsIGM3LCBiYXIKLWJhcjoKLQotCW1yYwkyLCAzLCByNSwgYzEsIGMyCi0JbXJjZ2UJcDQsIDUsIHIxNSwgY3IxLCBjcjIsIDcKLQotCW1jcglwNywgMSwgcjE1LCBjcjEsIGNyMQotCW1jcmx0CTUsIDEsIHI4LCBjcjIsIGNyOSwgMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2Zsb2F0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vZmxvYXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhZWU5Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vZmxvYXQucworKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0udGV4dAotLmFsaWduIDAKLQltdmZlCWYwLCBmMQotCW12ZmVxZQlmMywgZjUKLQltdmZlcWQJZjQsICMxLjAKLQltdmZzCWY0LCBmNwotCW12ZnNwCWYwLCBmMQotCW12ZmRtCWYzLCBmNAotCW12ZmV6CWY3LCBmNwotCi0JYWRmZQlmMCwgZjEsICMyLjAKLQlhZGZlcWUJZjEsIGYyLCAjMC41Ci0JYWRmc20JZjMsIGY0LCBmNQotCQotCXN1ZmQJZjAsIGYwLCAjMi4wCi0Jc3VmcwlmMSwgZjIsICMxMC4wCi0Jc3VmbmVleiBmMywgZjQsIGY1Ci0KLQlyc2ZzCWYxLCBmMSwgIzAuMAotCXJzZmRwCWYzLCBmMCwgIzUuMAotCXJzZmxlZAlmNywgZjYsIGYwCi0KLQltdWZkCWYwLCBmMCwgZjAKLQltdWZleglmMSwgZjIsICMzLjAKLQltdWZhbHMJZjAsIGYwLCAjNC4wCi0KLQlkdmZkCWYwLCBmMCwgIzEuMDAwMAotCWR2ZmV6CWYwLCBmMSwgIzEwZTAKLQlkdmZtaXNtIGYzLCBmNCwgZjUKLQotCXJkZmUJZjAsIGYxLCAjMS4wZTEKLQlyZGZzCWYzLCBmNywgIzBmMQotCXJkZmNjZHAJZjQsIGY0LCBmMwotCi0JcG93ZAlmMCwgZjIsIGYzCi0JcG93cwlmMSwgZjMsICMwZTFlMQotCXBvd2NzZXoJZjQsIGY3LCAjMQotCi0JcnB3cwlmNywgZjYsIGY3Ci0JcnB3ZXFkCWYwLCBmMSwgZjIKLQlycHdlbQlmMiwgZjIsIGYzCi0KLQlybWZkCWYxLCBmMiwgIzMKLQlybWZ2c3MJZjMsIGY0LCBmNAotCXJtZmVwCWY0LCBmNywgZjAKLQotCWZtbHMJZjAsIGYxLCBmMgotCWZtbGVxcwlmMSwgZjMsIGY1Ci0JZm1scGxzeglmNCwgZjYsIGYwCi0KLQlmZHZzCWYxLCBmMywgIzEwCi0JZmR2c3AJZjAsIGYxLCBmMgotCWZkdmhzc20JZjQsIGY0LCBmNAotCi0JZnJkcwlmMSwgZjEsICMxLjAKLQlmcmRndHMJZjIsIGYxLCBmMAotCWZyZGd0c3oJZjQsIGY0LCBmNQotCi0JcG9sZAlmMCwgZjEsIGYyCi0JcG9sc3oJZjQsIGY2LCAjMy4wCi0JcG9sZXFlCWY1LCBmNiwgZjcKLQotCW1uZnMJZjAsIGYxCi0JbW5mZAlmMCwgIzMuMAotCW1uZmV6CWYwLCAjNC4wCi0JbW5mZXFleiBmMCwgZjUKLQltbmZzcAlmMCwgZjQKLQltbmZkbQlmMSwgZjcKLQotCWFic2QJZjAsIGYxCi0JYWJzc3AJZjEsICMzLjAKLQlhYnNlcWUJZjQsIGY1Ci0KLQlybmRzCWYxLCBmMgotCXJuZGQJZjMsIGY0Ci0Jcm5kZXFleglmNiwgIzQuMAotCi0Jc3F0cwlmNSwgZjUKLQlzcXRkcAlmNiwgZjYKLQlzcXRwbGV6IGY3LCBmNgotCi0JbG9ncwlmMCwgIzEwCi0JbG9nZQlmMCwgIzBmMTAKLQlsb2duZWR6CWYwLCBmMQotCi0JbGduZQlmMSwgZjIKLQlsZ25keglmMSwgZjMKLQlsZ252Y3MJZjMsIGY0Ci0KLQlleHBzCWYxLCBmMwotCWV4cGVtCWYzLCAjMTAuMAotCWV4cHBsZAlmNiwgZjcKLQotCXNpbmQJZjAsIGYxCi0Jc2luc20JZjEsIGYyCi0Jc2luZ3RlCWY0LCAjNQotCi0JY29zZAlmMSwgZjMKLQljb3NlbQlmNCwgZjUKLQljb3NuZWRwCWY2LCBmMQotCi0JdGFuZQlmMSwgZjUKLQl0YW5zeglmNCwgZjcKLQl0YW5nZWR6CWYxLCAjNC4wCi0KLQlhc25lCWY0LCBmNQotCWFzbnNwCWY2LCAjNWUtMQotCWFzbm1pZHoJZjUsIGY1Ci0KLQlhY3NzCWY1LCBmNgotCWFjc2QJZjYsIGYwCi0JYWNzaHNlbQlmMSwgIzAuMDVlMQotCi0JYXRuZQlmMCwgZjUKLQlhdG5zeglmMSwgIzUKLQlhdG5sdGQJZjMsIGYyCi0KLQl1cmRlCWY1LCBmNAotCW5ybWUJZjYsIGY1Ci0JbnJtcGxkeglmNywgZjUKLQotCWZsdHNwCWYwLCByOAotCWZsdGUJZjEsIHIwCi0JZmx0ZXFkeglmNSwgcjcKLQotCWZpeAlyMCwgZjEKLQlmaXh6CXIxLCBmNwotCWZpeGNzbQlyNSwgZjUKLQotCXdmYwlyMAotCXdmcwlyMQotCXJmc2VxCXIyCi0JcmZjCXI0Ci0KLQljbWYJZjAsICMxCi0JY21mCWYxLCBmMgotCWNtZmVxCWYwLCBmMQotCi0JY25mCWYwLCAjMwotCWNuZglmMSwgIzAuNQotCWNuZnZzCWYzLCBmNAotCi0JY21mZQlmMCwgZjEKLQljbWZlZXEJZjEsIGYyCi0JY21mZXFlCWYzLCAjNS4wCi0KLQljbmZlCWYxLCBmMwotCWNuZmVlcQlmMywgZjQKLQljbmZlcWUJZjQsIGY3Ci0JY25mYWxlCWY0LCAjNS4wCi0KLQlsZm0JZjAsIDQsIFtyMF0KLQlsZm0JZjAsIDQsIFtyMCwgIzBdCi0JbGZtCWYxLCA0LCBbcjEsICM2NF0KLQlzZm0JZjIsIDQsIFtyMTQsICMxMDIwXSEKLQlzZm1lcQlmNywgMywgW3I4XSwgIy0xMDIwCi0KLQlsZm1mZAlmNiwgMiwgW3IxNV0KLQlzZm1lYQlmNywgMSwgW3I4XSEKLQlsZm1lcWVhCWY1LCA0LCBbcjZdCi0Jc2ZtbmVmZAlmNCwgMywgW3IyXQotCXNmbW5lZmQJZjQsIDMsIFtyMl0hCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vaW1tZWQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbW1lZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDIwOTJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbW1lZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotQAlUZXN0cyBmb3IgY29tcGxleCBpbW1lZGlhdGUgZXhwcmVzc2lvbnMgLSBub25lIG9mIHRoZXNlIG5lZWQgCi1ACXJlbG9jYXRpb25zCi0JLnRleHQKLWJhcjoKLQltb3YJcjAsICMwCi0JbW92CXIwLCAjKC4gLSBiYXIgLSA4KQotCWxkcglyMCwgYmFyCi0JbGRyCXIwLCBbcGMsICMgKGJhciAtIC4gLTgpXQotCS5zcGFjZSA0MDk2Ci0JbW92CXIwLCAjKC4gLSBiYXIgLSA4KSAmIDB4ZmYKLQlsZHIJcjAsIFtwYywgIyAoYmFyIC0gLiAtOCkgJiAweGZmXQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2luc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbnN0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlY2I4ZjAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2luc3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtLXNob3ctcmF3LWluc24KLSNuYW1lOiBBUk0gYmFzaWMgaW5zdHJ1Y3Rpb25zCi0jYXM6IC1tYXJtMiAtRUwKLQotIyBUZXN0IHRoZSBzdGFuZGFyZCBBUk0gaW5zdHJ1Y3Rpb25zOgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qYXJtLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDxbXj5dKj4gZTNhMDAwMDAgPwltb3YJcjAsICMwCi0wMDAwMDAwNCA8W14+XSo+IGUxYTAxMDAyID8JbW92CXIxLCByMgotMDAwMDAwMDggPFtePl0qPiBlMWEwMzE4NCA/CW1vdglyMywgcjQsIGxzbCAjMwotMDAwMDAwMGMgPFtePl0qPiBlMWEwNTczNiA/CW1vdglyNSwgcjYsIGxzciByNwotMDAwMDAwMTAgPFtePl0qPiBlMWEwOGE1OSA/CW1vdglyOCwgcjksIGFzciBzbAotMDAwMDAwMTQgPFtePl0qPiBlMWEwYmQxYyA/CW1vdglmcCwgaXAsIGxzbCBzcAotMDAwMDAwMTggPFtePl0qPiBlMWEwZTA2ZiA/CW1vdglsciwgcGMsIHJyeAotMDAwMDAwMWMgPFtePl0qPiBlMWEwMTAwMiA/CW1vdglyMSwgcjIKLTAwMDAwMDIwIDxbXj5dKj4gMDFhMDIwMDMgPwltb3ZlcQlyMiwgcjMKLTAwMDAwMDI0IDxbXj5dKj4gMTFhMDQwMDUgPwltb3ZuZQlyNCwgcjUKLTAwMDAwMDI4IDxbXj5dKj4gYjFhMDYwMDcgPwltb3ZsdAlyNiwgcjcKLTAwMDAwMDJjIDxbXj5dKj4gYTFhMDgwMDkgPwltb3ZnZQlyOCwgcjkKLTAwMDAwMDMwIDxbXj5dKj4gZDFhMGEwMGIgPwltb3ZsZQlzbCwgZnAKLTAwMDAwMDM0IDxbXj5dKj4gYzFhMGMwMGQgPwltb3ZndAlpcCwgc3AKLTAwMDAwMDM4IDxbXj5dKj4gMzFhMDEwMDIgPwltb3ZjYwlyMSwgcjIKLTAwMDAwMDNjIDxbXj5dKj4gMjFhMDEwMDMgPwltb3ZjcwlyMSwgcjMKLTAwMDAwMDQwIDxbXj5dKj4gNDFhMDMwMDYgPwltb3ZtaQlyMywgcjYKLTAwMDAwMDQ0IDxbXj5dKj4gNTFhMDcwMDkgPwltb3ZwbAlyNywgcjkKLTAwMDAwMDQ4IDxbXj5dKj4gNjFhMDEwMDggPwltb3Z2cwlyMSwgcjgKLTAwMDAwMDRjIDxbXj5dKj4gNzFhMDlmYTEgPwltb3Z2YwlyOSwgcjEsIGxzciAjMzEKLTAwMDAwMDUwIDxbXj5dKj4gODFhMDgwMGYgPwltb3ZoaQlyOCwgcGMKLTAwMDAwMDU0IDxbXj5dKj4gOTFhMGYwMGUgPwltb3ZscwlwYywgbHIKLTAwMDAwMDU4IDxbXj5dKj4gMjFhMDkwMDggPwltb3ZjcwlyOSwgcjgKLTAwMDAwMDVjIDxbXj5dKj4gMzFhMDEwMDMgPwltb3ZjYwlyMSwgcjMKLTAwMDAwMDYwIDxbXj5dKj4gZTFiMDAwMDggPwltb3ZzCXIwLCByOAotMDAwMDAwNjQgPFtePl0qPiAzMWIwMDAwNyA/CW1vdmNjcwlyMCwgcjcKLTAwMDAwMDY4IDxbXj5dKj4gZTI4MTAwMGEgPwlhZGQJcjAsIHIxLCAjMTAKLTAwMDAwMDZjIDxbXj5dKj4gZTA4MzIwMDQgPwlhZGQJcjIsIHIzLCByNAotMDAwMDAwNzAgPFtePl0qPiBlMDg2NTI4NyA/CWFkZAlyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMDc0IDxbXj5dKj4gZTA4MjExMTMgPwlhZGQJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDA3OCA8W14+XSo+IGUyMDEwMDBhID8JYW5kCXIwLCByMSwgIzEwCi0wMDAwMDA3YyA8W14+XSo+IGUwMDMyMDA0ID8JYW5kCXIyLCByMywgcjQKLTAwMDAwMDgwIDxbXj5dKj4gZTAwNjUyODcgPwlhbmQJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDA4NCA8W14+XSo+IGUwMDIxMTEzID8JYW5kCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwODggPFtePl0qPiBlMjIxMDAwYSA/CWVvcglyMCwgcjEsICMxMAotMDAwMDAwOGMgPFtePl0qPiBlMDIzMjAwNCA/CWVvcglyMiwgcjMsIHI0Ci0wMDAwMDA5MCA8W14+XSo+IGUwMjY1Mjg3ID8JZW9yCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwOTQgPFtePl0qPiBlMDIyMTExMyA/CWVvcglyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMDk4IDxbXj5dKj4gZTI0MTAwMGEgPwlzdWIJcjAsIHIxLCAjMTAKLTAwMDAwMDljIDxbXj5dKj4gZTA0MzIwMDQgPwlzdWIJcjIsIHIzLCByNAotMDAwMDAwYTAgPFtePl0qPiBlMDQ2NTI4NyA/CXN1YglyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMGE0IDxbXj5dKj4gZTA0MjExMTMgPwlzdWIJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDBhOCA8W14+XSo+IGUyYTEwMDBhID8JYWRjCXIwLCByMSwgIzEwCi0wMDAwMDBhYyA8W14+XSo+IGUwYTMyMDA0ID8JYWRjCXIyLCByMywgcjQKLTAwMDAwMGIwIDxbXj5dKj4gZTBhNjUyODcgPwlhZGMJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDBiNCA8W14+XSo+IGUwYTIxMTEzID8JYWRjCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwYjggPFtePl0qPiBlMmMxMDAwYSA/CXNiYwlyMCwgcjEsICMxMAotMDAwMDAwYmMgPFtePl0qPiBlMGMzMjAwNCA/CXNiYwlyMiwgcjMsIHI0Ci0wMDAwMDBjMCA8W14+XSo+IGUwYzY1Mjg3ID8Jc2JjCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwYzQgPFtePl0qPiBlMGMyMTExMyA/CXNiYwlyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMGM4IDxbXj5dKj4gZTI2MTAwMGEgPwlyc2IJcjAsIHIxLCAjMTAKLTAwMDAwMGNjIDxbXj5dKj4gZTA2MzIwMDQgPwlyc2IJcjIsIHIzLCByNAotMDAwMDAwZDAgPFtePl0qPiBlMDY2NTI4NyA/CXJzYglyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMGQ0IDxbXj5dKj4gZTA2MjExMTMgPwlyc2IJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDBkOCA8W14+XSo+IGUyZTEwMDBhID8JcnNjCXIwLCByMSwgIzEwCi0wMDAwMDBkYyA8W14+XSo+IGUwZTMyMDA0ID8JcnNjCXIyLCByMywgcjQKLTAwMDAwMGUwIDxbXj5dKj4gZTBlNjUyODcgPwlyc2MJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDBlNCA8W14+XSo+IGUwZTIxMTEzID8JcnNjCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwZTggPFtePl0qPiBlMzgxMDAwYSA/CW9ycglyMCwgcjEsICMxMAotMDAwMDAwZWMgPFtePl0qPiBlMTgzMjAwNCA/CW9ycglyMiwgcjMsIHI0Ci0wMDAwMDBmMCA8W14+XSo+IGUxODY1Mjg3ID8Jb3JyCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwZjQgPFtePl0qPiBlMTgyMTExMyA/CW9ycglyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMGY4IDxbXj5dKj4gZTNjMTAwMGEgPwliaWMJcjAsIHIxLCAjMTAKLTAwMDAwMGZjIDxbXj5dKj4gZTFjMzIwMDQgPwliaWMJcjIsIHIzLCByNAotMDAwMDAxMDAgPFtePl0qPiBlMWM2NTI4NyA/CWJpYwlyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMTA0IDxbXj5dKj4gZTFjMjExMTMgPwliaWMJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDEwOCA8W14+XSo+IGUzZTAwMDBhID8JbXZuCXIwLCAjMTAKLTAwMDAwMTBjIDxbXj5dKj4gZTFlMDIwMDQgPwltdm4JcjIsIHI0Ci0wMDAwMDExMCA8W14+XSo+IGUxZTA1Mjg3ID8JbXZuCXI1LCByNywgbHNsICM1Ci0wMDAwMDExNCA8W14+XSo+IGUxZTAxMTEzID8JbXZuCXIxLCByMywgbHNsIHIxCi0wMDAwMDExOCA8W14+XSo+IGUzMTAwMDBhID8JdHN0CXIwLCAjMTAKLTAwMDAwMTFjIDxbXj5dKj4gZTExMjAwMDQgPwl0c3QJcjIsIHI0Ci0wMDAwMDEyMCA8W14+XSo+IGUxMTUwMjg3ID8JdHN0CXI1LCByNywgbHNsICM1Ci0wMDAwMDEyNCA8W14+XSo+IGUxMTEwMTEzID8JdHN0CXIxLCByMywgbHNsIHIxCi0wMDAwMDEyOCA8W14+XSo+IGUzMzAwMDBhID8JdGVxCXIwLCAjMTAKLTAwMDAwMTJjIDxbXj5dKj4gZTEzMjAwMDQgPwl0ZXEJcjIsIHI0Ci0wMDAwMDEzMCA8W14+XSo+IGUxMzUwMjg3ID8JdGVxCXI1LCByNywgbHNsICM1Ci0wMDAwMDEzNCA8W14+XSo+IGUxMzEwMTEzID8JdGVxCXIxLCByMywgbHNsIHIxCi0wMDAwMDEzOCA8W14+XSo+IGUzNTAwMDBhID8JY21wCXIwLCAjMTAKLTAwMDAwMTNjIDxbXj5dKj4gZTE1MjAwMDQgPwljbXAJcjIsIHI0Ci0wMDAwMDE0MCA8W14+XSo+IGUxNTUwMjg3ID8JY21wCXI1LCByNywgbHNsICM1Ci0wMDAwMDE0NCA8W14+XSo+IGUxNTEwMTEzID8JY21wCXIxLCByMywgbHNsIHIxCi0wMDAwMDE0OCA8W14+XSo+IGUzNzAwMDBhID8JY21uCXIwLCAjMTAKLTAwMDAwMTRjIDxbXj5dKj4gZTE3MjAwMDQgPwljbW4JcjIsIHI0Ci0wMDAwMDE1MCA8W14+XSo+IGUxNzUwMjg3ID8JY21uCXI1LCByNywgbHNsICM1Ci0wMDAwMDE1NCA8W14+XSo+IGUxNzEwMTEzID8JY21uCXIxLCByMywgbHNsIHIxCi0wMDAwMDE1OCA8W14+XSo+IGUzMzBmMDBhID8JdGVxcAlyMCwgIzEwCi0wMDAwMDE1YyA8W14+XSo+IGUxMzJmMDA0ID8JdGVxcAlyMiwgcjQKLTAwMDAwMTYwIDxbXj5dKj4gZTEzNWYyODcgPwl0ZXFwCXI1LCByNywgbHNsICM1Ci0wMDAwMDE2NCA8W14+XSo+IGUxMzFmMTEzID8JdGVxcAlyMSwgcjMsIGxzbCByMQotMDAwMDAxNjggPFtePl0qPiBlMzcwZjAwYSA/CWNtbnAJcjAsICMxMAotMDAwMDAxNmMgPFtePl0qPiBlMTcyZjAwNCA/CWNtbnAJcjIsIHI0Ci0wMDAwMDE3MCA8W14+XSo+IGUxNzVmMjg3ID8JY21ucAlyNSwgcjcsIGxzbCAjNQotMDAwMDAxNzQgPFtePl0qPiBlMTcxZjExMyA/CWNtbnAJcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTc4IDxbXj5dKj4gZTM1MGYwMGEgPwljbXBwCXIwLCAjMTAKLTAwMDAwMTdjIDxbXj5dKj4gZTE1MmYwMDQgPwljbXBwCXIyLCByNAotMDAwMDAxODAgPFtePl0qPiBlMTU1ZjI4NyA/CWNtcHAJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTg0IDxbXj5dKj4gZTE1MWYxMTMgPwljbXBwCXIxLCByMywgbHNsIHIxCi0wMDAwMDE4OCA8W14+XSo+IGUzMTBmMDBhID8JdHN0cAlyMCwgIzEwCi0wMDAwMDE4YyA8W14+XSo+IGUxMTJmMDA0ID8JdHN0cAlyMiwgcjQKLTAwMDAwMTkwIDxbXj5dKj4gZTExNWYyODcgPwl0c3RwCXI1LCByNywgbHNsICM1Ci0wMDAwMDE5NCA8W14+XSo+IGUxMTFmMTEzID8JdHN0cAlyMSwgcjMsIGxzbCByMQotMDAwMDAxOTggPFtePl0qPiBlMDAwMDI5MSA/CW11bAlyMCwgcjEsIHIyCi0wMDAwMDE5YyA8W14+XSo+IGUwMTEwMzkyID8JbXVscwlyMSwgcjIsIHIzCi0wMDAwMDFhMCA8W14+XSo+IDEwMDAwMDkxID8JbXVsbmUJcjAsIHIxLCByMAotMDAwMDAxYTQgPFtePl0qPiA5MDE5MDc5OCA/CW11bGxzcwlyOSwgcjgsIHI3Ci0wMDAwMDFhOCA8W14+XSo+IGUwMjFiYTk5ID8JbWxhCXIxLCByOSwgc2wsIGZwCi0wMDAwMDFhYyA8W14+XSo+IGUwMzNjOTk0ID8JbWxhcwlyMywgcjQsIHI5LCBpcAotMDAwMDAxYjAgPFtePl0qPiBiMDI5ZDc5OCA/CW1sYWx0CXI5LCByOCwgcjcsIHNwCi0wMDAwMDFiNCA8W14+XSo+IGEwMzRlMzkxID8JbWxhZ2VzCXI0LCByMSwgcjMsIGxyCi0wMDAwMDFiOCA8W14+XSo+IGU1OTEwMDAwID8JbGRyCXIwLCBcW3IxXF0KLTAwMDAwMWJjIDxbXj5dKj4gZTc5MTEwMDIgPwlsZHIJcjEsIFxbcjEsIHIyXF0KLTAwMDAwMWMwIDxbXj5dKj4gZTdiMzIwMDQgPwlsZHIJcjIsIFxbcjMsIHI0XF0hCi0wMDAwMDFjNCA8W14+XSo+IGU1OTIyMDIwID8JbGRyCXIyLCBcW3IyLCAjMzJcXQotMDAwMDAxYzggPFtePl0qPiBlNzkzMjQyNCA/CWxkcglyMiwgXFtyMywgcjQsIGxzciAjOFxdCi0wMDAwMDFjYyA8W14+XSo+IDA3YjU0NDg0ID8JbGRyZXEJcjQsIFxbcjUsIHI0LCBsc2wgIzlcXSEKLTAwMDAwMWQwIDxbXj5dKj4gMTQ5NTQwMDYgPwlsZHJuZQlyNCwgXFtyNVxdLCAjNgotMDAwMDAxZDQgPFtePl0qPiBlNmIyMTAwMyA/CWxkcnQJcjEsIFxbcjJcXSwgcjMKLTAwMDAwMWQ4IDxbXj5dKj4gZTY5NDI0MjUgPwlsZHIJcjIsIFxbcjRcXSwgcjUsIGxzciAjOAotMDAwMDAxZGMgPFtePl0qPiBlNTFmMDAwOCA/CWxkcglyMCwgMDAwMDAxZGMgPFtePl0qPgotMDAwMDAxZTAgPFtePl0qPiBlNWQ0MzAwMCA/CWxkcmIJcjMsIFxbcjRcXQotMDAwMDAxZTQgPFtePl0qPiAxNGY4NTAwMCA/CWxkcm5lYnQJcjUsIFxbcjhcXQotMDAwMDAxZTggPFtePl0qPiBlNTgxMDAwMCA/CXN0cglyMCwgXFtyMVxdCi0wMDAwMDFlYyA8W14+XSo+IGU3ODExMDAyID8Jc3RyCXIxLCBcW3IxLCByMlxdCi0wMDAwMDFmMCA8W14+XSo+IGU3YTMzMDA0ID8Jc3RyCXIzLCBcW3IzLCByNFxdIQotMDAwMDAxZjQgPFtePl0qPiBlNTgyMjAyMCA/CXN0cglyMiwgXFtyMiwgIzMyXF0KLTAwMDAwMWY4IDxbXj5dKj4gZTc4MzI0MjQgPwlzdHIJcjIsIFxbcjMsIHI0LCBsc3IgIzhcXQotMDAwMDAxZmMgPFtePl0qPiAwN2E1NDQ4NCA/CXN0cmVxCXI0LCBcW3I1LCByNCwgbHNsICM5XF0hCi0wMDAwMDIwMCA8W14+XSo+IDE0ODU0MDA2ID8Jc3RybmUJcjQsIFxbcjVcXSwgIzYKLTAwMDAwMjA0IDxbXj5dKj4gZTY4MjEwMDMgPwlzdHIJcjEsIFxbcjJcXSwgcjMKLTAwMDAwMjA4IDxbXj5dKj4gZTZhNDI0MjUgPwlzdHJ0CXIyLCBcW3I0XF0sIHI1LCBsc3IgIzgKLTAwMDAwMjBjIDxbXj5dKj4gZTUwZjEwMDQgPwlzdHIJcjEsIDAwMDAwMjEwIDxbXj5dKj4KLTAwMDAwMjEwIDxbXj5dKj4gZTVjNzEwMDAgPwlzdHJiCXIxLCBcW3I3XF0KLTAwMDAwMjE0IDxbXj5dKj4gZTRlMDIwMDAgPwlzdHJidAlyMiwgXFtyMFxdCi0wMDAwMDIxOCA8W14+XSo+IGU4OTAwMDAyID8JbGRtaWEJcjAsIHtyMX0KLTAwMDAwMjFjIDxbXj5dKj4gMDk5MjAwMzggPwlsZG1lcWliCXIyLCB7cjMsIHI0LCByNX0KLTAwMDAwMjIwIDxbXj5dKj4gZTg1M2ZmZmYgPwlsZG1kYQlyMywge3IwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNywgcjgsIHI5LCBzbCwgZnAsIGlwLCBzcCwgbHIsIHBjfVxeCi0wMDAwMDIyNCA8W14+XSo+IGU5M2IwNWZmID8JbGRtZGIJZnAhLCB7cjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCByOCwgc2x9Ci0wMDAwMDIyOCA8W14+XSo+IGU5OTEwMGY3ID8JbGRtaWIJcjEsIHtyMCwgcjEsIHIyLCByNCwgcjUsIHI2LCByN30KLTAwMDAwMjJjIDxbXj5dKj4gZTg5MjAxZjggPwlsZG1pYQlyMiwge3IzLCByNCwgcjUsIHI2LCByNywgcjh9Ci0wMDAwMDIzMCA8W14+XSo+IGU5MTMwMDAzID8JbGRtZGIJcjMsIHtyMCwgcjF9Ci0wMDAwMDIzNCA8W14+XSo+IGU4NzQwMzAwID8JbGRtZGEJcjQhLCB7cjgsIHI5fVxeCi0wMDAwMDIzOCA8W14+XSo+IGU4ODAwMDAyID8Jc3RtaWEJcjAsIHtyMX0KLTAwMDAwMjNjIDxbXj5dKj4gMDk4MjAwMzggPwlzdG1lcWliCXIyLCB7cjMsIHI0LCByNX0KLTAwMDAwMjQwIDxbXj5dKj4gZTg0M2ZmZmYgPwlzdG1kYQlyMywge3IwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNywgcjgsIHI5LCBzbCwgZnAsIGlwLCBzcCwgbHIsIHBjfVxeCi0wMDAwMDI0NCA8W14+XSo+IGU5MmEwNWZmID8Jc3RtZGIJc2whLCB7cjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCByOCwgc2x9Ci0wMDAwMDI0OCA8W14+XSo+IGU4MDEwMDA3ID8Jc3RtZGEJcjEsIHtyMCwgcjEsIHIyfQotMDAwMDAyNGMgPFtePl0qPiBlOTAyMDAxOCA/CXN0bWRiCXIyLCB7cjMsIHI0fQotMDAwMDAyNTAgPFtePl0qPiBlODgzMDAwMyA/CXN0bWlhCXIzLCB7cjAsIHIxfQotMDAwMDAyNTQgPFtePl0qPiBlOWU0MDMwMCA/CXN0bWliCXI0ISwge3I4LCByOX1cXgotMDAwMDAyNTggPFtePl0qPiBlZjEyMzQ1NiA/CXN3aQkweDAwMTIzNDU2Ci0wMDAwMDI1YyA8W14+XSo+IDJmMDAwMDMzID8Jc3dpY3MJMHgwMDAwMDAzMwotMDAwMDAyNjAgPFtePl0qPiBlYmZmZmZmZSA/CWJsCTAwMDAwMjYwIDxbXj5dKj4KLVsJCV0qMjYwOi4qX3dvbWJhdC4qCi0wMDAwMDI2NCA8W14+XSo+IDViZmZmZmU5ID8JYmxwbAkwMDAwMDIxMCA8YmFyPgotMDAwMDAyNjggPFtePl0qPiBlYWZmZmZmZSA/CWIJMDAwMDAyNjggPFtePl0qPgotWwkJXSoyNjg6Lipfd2liYmxlLioKLTAwMDAwMjZjIDxbXj5dKj4gZGFmZmZmZmUgPwlibGUJMDAwMDAyNmMgPFtePl0qPgotWwkJXSoyNmM6Lip0ZXN0ZXJmdW5jLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbnN0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vaW5zdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjA5MmM5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbnN0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotQAlUZXN0IGZpbGUgZm9yIEFSTS9HQVMgLS0gYmFzaWMgaW5zdHJ1Y3Rpb25zCi0KLS50ZXh0Ci0uYWxpZ24KLQltb3YJcjAsICMwCi0JbW92CXIxLCByMgotCW1vdglyMywgcjQsIGxzbCAjMwotCW1vdglyNSwgcjYsIGxzciByNwotCW1vdglyOCwgcjksIGFzciByMTAKLQltb3YJcjExLCByMTIsIGFzbCByMTMKLQltb3YJcjE0LCByMTUsIHJyeAotCW1vdmFsCXIxLCByMgotCW1vdmVxCXIyLCByMwotCW1vdm5lCXI0LCByNQotCW1vdmx0CXI2LCByNwotCW1vdmdlCXI4LCByOQotCW1vdmxlCXIxMCwgcjExCi0JbW92Z3QJcjEyLCByMTMKLQltb3ZjYwlyMSwgcjIKLQltb3ZjcwlyMSwgcjMKLQltb3ZtaQlyMywgcjYKLQltb3ZwbAlyNywgcjkKLQltb3Z2cwlyMSwgcjgKLQltb3Z2YwlyOSwgcjEsIGxzciAjMzEKLQltb3ZoaQlyOCwgcjE1Ci0JbW92bHMJcjE1LCByMTQKLQltb3ZocwlyOSwgcjgKLQltb3Z1bAlyMSwgcjMKLQltb3ZzCXIwLCByOAotCW1vdnVscwlyMCwgcjcKLQkKLQlhZGQJcjAsIHIxLCAjMTAKLQlhZGQJcjIsIHIzLCByNAotCWFkZAlyNSwgcjYsIHI3LCBhc2wgIzUKLQlhZGQJcjEsIHIyLCByMywgbHNsIHIxCi0KLQlhbmQJcjAsIHIxLCAjMTAKLQlhbmQJcjIsIHIzLCByNAotCWFuZAlyNSwgcjYsIHI3LCBhc2wgIzUKLQlhbmQJcjEsIHIyLCByMywgbHNsIHIxCi0KLQllb3IJcjAsIHIxLCAjMTAKLQllb3IJcjIsIHIzLCByNAotCWVvcglyNSwgcjYsIHI3LCBhc2wgIzUKLQllb3IJcjEsIHIyLCByMywgbHNsIHIxCi0KLQlzdWIJcjAsIHIxLCAjMTAKLQlzdWIJcjIsIHIzLCByNAotCXN1YglyNSwgcjYsIHI3LCBhc2wgIzUKLQlzdWIJcjEsIHIyLCByMywgbHNsIHIxCi0KLQlhZGMJcjAsIHIxLCAjMTAKLQlhZGMJcjIsIHIzLCByNAotCWFkYwlyNSwgcjYsIHI3LCBhc2wgIzUKLQlhZGMJcjEsIHIyLCByMywgbHNsIHIxCi0KLQlzYmMJcjAsIHIxLCAjMTAKLQlzYmMJcjIsIHIzLCByNAotCXNiYwlyNSwgcjYsIHI3LCBhc2wgIzUKLQlzYmMJcjEsIHIyLCByMywgbHNsIHIxCi0KLQlyc2IJcjAsIHIxLCAjMTAKLQlyc2IJcjIsIHIzLCByNAotCXJzYglyNSwgcjYsIHI3LCBhc2wgIzUKLQlyc2IJcjEsIHIyLCByMywgbHNsIHIxCi0KLQlyc2MJcjAsIHIxLCAjMTAKLQlyc2MJcjIsIHIzLCByNAotCXJzYwlyNSwgcjYsIHI3LCBhc2wgIzUKLQlyc2MJcjEsIHIyLCByMywgbHNsIHIxCi0KLQlvcnIJcjAsIHIxLCAjMTAKLQlvcnIJcjIsIHIzLCByNAotCW9ycglyNSwgcjYsIHI3LCBhc2wgIzUKLQlvcnIJcjEsIHIyLCByMywgbHNsIHIxCi0KLQliaWMJcjAsIHIxLCAjMTAKLQliaWMJcjIsIHIzLCByNAotCWJpYwlyNSwgcjYsIHI3LCBhc2wgIzUKLQliaWMJcjEsIHIyLCByMywgbHNsIHIxCi0KLQltdm4JcjAsICMxMAotCW12bglyMiwgcjQKLQltdm4JcjUsIHI3LCBhc2wgIzUKLQltdm4JcjEsIHIzLCBsc2wgcjEKLQotCXRzdAlyMCwgIzEwCi0JdHN0CXIyLCByNAotCXRzdAlyNSwgcjcsIGFzbCAjNQotCXRzdAlyMSwgcjMsIGxzbCByMQotCi0JdGVxCXIwLCAjMTAKLQl0ZXEJcjIsIHI0Ci0JdGVxCXI1LCByNywgYXNsICM1Ci0JdGVxCXIxLCByMywgbHNsIHIxCi0KLQljbXAJcjAsICMxMAotCWNtcAlyMiwgcjQKLQljbXAJcjUsIHI3LCBhc2wgIzUKLQljbXAJcjEsIHIzLCBsc2wgcjEKLQotCWNtbglyMCwgIzEwCi0JY21uCXIyLCByNAotCWNtbglyNSwgcjcsIGFzbCAjNQotCWNtbglyMSwgcjMsIGxzbCByMQotCi0JdGVxcAlyMCwgIzEwCi0JdGVxcAlyMiwgcjQKLQl0ZXFwCXI1LCByNywgYXNsICM1Ci0JdGVxcAlyMSwgcjMsIGxzbCByMQotCi0JY21ucAlyMCwgIzEwCi0JY21ucAlyMiwgcjQKLQljbW5wCXI1LCByNywgYXNsICM1Ci0JY21ucAlyMSwgcjMsIGxzbCByMQotCi0JY21wcAlyMCwgIzEwCi0JY21wcAlyMiwgcjQKLQljbXBwCXI1LCByNywgYXNsICM1Ci0JY21wcAlyMSwgcjMsIGxzbCByMQotCi0JdHN0cAlyMCwgIzEwCi0JdHN0cAlyMiwgcjQKLQl0c3RwCXI1LCByNywgYXNsICM1Ci0JdHN0cAlyMSwgcjMsIGxzbCByMQotCi0JbXVsCXIwLCByMSwgcjIKLQltdWxzCXIxLCByMiwgcjMKLQltdWxuZQlyMCwgcjEsIHIwCi0JbXVsbHNzCXI5LCByOCwgcjcKLQotCW1sYQlyMSwgcjksIHIxMCwgcjExCi0JbWxhcwlyMywgcjQsIHI5LCByMTIKLQltbGFsdAlyOSwgcjgsIHI3LCByMTMKLQltbGFnZXMJcjQsIHIxLCByMywgcjE0Ci0KLQlsZHIJcjAsIFtyMV0KLQlsZHIJcjEsIFtyMSwgcjJdCi0JbGRyCXIyLCBbcjMsIHI0XSEKLQlsZHIJcjIsIFtyMiwgIzMyXQotCWxkcglyMiwgW3IzLCByNCwgbHNyICM4XQotCWxkcmVxCXI0LCBbcjUsIHI0LCBhc2wgIzldIQotCWxkcm5lCXI0LCBbcjVdLCAjNgotCWxkcnQJcjEsIFtyMl0sIHIzCi0JbGRyCXIyLCBbcjRdLCByNSwgbHNyICM4Ci1mb286Ci0JbGRyCXIwLCBmb28KLQlsZHJiCXIzLCBbcjRdCi0JbGRybmVidAlyNSwgW3I4XQotCQotCXN0cglyMCwgW3IxXQotCXN0cglyMSwgW3IxLCByMl0KLQlzdHIJcjMsIFtyMywgcjRdIQotCXN0cglyMiwgW3IyLCAjMzJdCi0Jc3RyCXIyLCBbcjMsIHI0LCBsc3IgIzhdCi0Jc3RyZXEJcjQsIFtyNSwgcjQsIGFzbCAjOV0hCi0Jc3RybmUJcjQsIFtyNV0sICM2Ci0Jc3RyCXIxLCBbcjJdLCByMwotCXN0cnQJcjIsIFtyNF0sIHI1LCBsc3IgIzgKLQlzdHIJcjEsIGJhcgotYmFyOgotCXN0cmFsYglyMSwgW3I3XQotCXN0cmJ0CXIyLCBbcjBdCi0KLQlsZG1pYQlyMCwge3IxfQotCWxkbWVxaWIJcjIsIHtyMywgcjQsIHI1fQotCWxkbWFsZGEJcjMsIHtyMC1yMTV9XgotCWxkbWRiCXIxMSEsIHtyMC1yOCwgcjEwfQotCWxkbWVkCXIxLCB7cjAsIHIxLCByMn18MHhmMAotCWxkbWZkCXIyLCB7cjMsIHI0fSt7cjUsIHI2LCByNywgcjh9Ci0JbGRtZWEJcjMsIDMKLQlsZG1mYQlyNCEsIHtyOCwgcjl9XgotCQotCXN0bWlhCXIwLCB7cjF9Ci0Jc3RtZXFpYglyMiwge3IzLCByNCwgcjV9Ci0Jc3RtYWxkYQlyMywge3IwLXIxNX1eCi0Jc3RtZGIJcjEwISwge3IwLXI4LCByMTB9Ci0Jc3RtZWQJcjEsIHtyMCwgcjEsIHIyfQotCXN0bWZkCXIyLCB7cjMsIHI0fQotCXN0bWVhCXIzLCAzCi0Jc3RtZmEJcjQhLCB7cjgsIHI5fV4KLQotCXN3aQkweDEyMzQ1NgotCXN3aWhzCTB4MzMKLQotCWJsCV93b21iYXQKLQlibHBsCWJhcgotCWIJX3dpYmJsZQotCWJsZQl0ZXN0ZXJmdW5jCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vbGUtZnBjb25zdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2xlLWZwY29uc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU0ZTBlMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vbGUtZnBjb25zdC5kCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jb2JqZHVtcDogLXMKLSNhczogLUVMCi0jbmFtZTogYXJtIGxpdHRsZS1lbmRpYW4gZnBjb25zdAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qYXJtLioKLQotQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDoKLSAwMDAwIGNkY2M4YzNmIDAwMDAwMDAwIDk5OTlmMTNmIDlhOTk5OTk5IC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vbGUtZnBjb25zdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2xlLWZwY29uc3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzYzNkNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vbGUtZnBjb25zdC5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIFRlc3QgZnAgY29uc3RhbnRzLgotIyBUaGVzZSBuZWVkIEFSTSBzcGVjaWZpYyBzdXBwb3J0IGJlY2F1c2UgOCBieXRlIGZwIGNvbnN0YW50cyBpbiBsaXR0bGUKLSMgZW5kaWFuIG1vZGUgYXJlIHJlcHJlc2VudGVkIGFibm9ybWFsbHkuCi0JCi0JLnRleHQKLQkuZmxvYXQgMS4xCi0JLmZsb2F0IDAKLQkuZG91YmxlIDEuMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL3RodW1iLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vdGh1bWIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0YjgyZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vdGh1bWIucworKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0JLnRleHQKLQkuY29kZSAxNgotLmZvbzoJCi0JbHNsCXIyLCByMSwgIzMKLQlsc3IJcjMsIHI0LCAjMzEKLXdpYmJsZS9kYXRhOgkKLQlhc3IJcjcsIHIwLCAjNQotCi0JbHNsCXIxLCByMiwgIzAKLQlsc3IJcjMsIHI0LCAjMAotCWFzcglyNCwgcjUsICMwCi0KLQlsc3IJcjYsIHI3LCAjMzIKLQlhc3IJcjAsIHIxLCAjMzIKLQotCWFkZAlyMSwgcjIsIHIzCi0JYWRkCXIyLCByNCwgIzIKLQlzdWIJcjMsIHI1LCByNwotCXN1YglyMiwgcjQsICM3Ci0KLQltb3YJcjQsICMyNTUKLQljbXAJcjMsICMyNTAKLQlhZGQJcjYsICMxMjMKLQlzdWIJcjUsICMxMjgKLQotCWFuZAlyMywgcjUKLQllb3IJcjQsIHI2Ci0JbHNsCXIxLCByMAotCWxzcglyMiwgcjMKLQlhc3IJcjQsIHI2Ci0JYWRjCXI1LCByNwotCXNiYwlyMCwgcjQKLQlyb3IJcjEsIHI0Ci0JdHN0CXIyLCByNQotCW5lZwlyMSwgcjEKLQljbXAJcjIsIHIzCi0JY21uCXIxLCByNAotCW9ycglyMCwgcjMKLQltdWwJcjQsIHI1Ci0JYmljCXI1LCByNwotCW12bglyNSwgcjUKLQotCWFkZAlyMSwgcjEzCi0JYWRkCXIxMiwgcjIKLQlhZGQJcjksIHI5Ci0JY21wCXIxLCByMTQKLQljbXAJcjgsIHIwCi0JY21wCXIxMiwgcjE0Ci0JbW92CXIwLCByOQotCW1vdglyOSwgcjQKLQltb3YJcjgsIHI4Ci0JYngJcjcKLQlieAlyOAotCS5hbGlnbiAwCi0JYngJcGMKLQotCWxkcglyMywgW3BjLCAjMTI4XQotCWxkcglyNCwgYmFyCi0KLQlzdHIJcjAsIFtyMSwgcjJdCi0Jc3RyYglyMSwgW3IyLCByNF0KLQlsZHIJcjUsIFtyNiwgcjddCi0JbGRyYglyMiwgW3I0LCByNV0KLQkKLQkuYWxpZ24gMAotYmFyOgkKLQlzdHJoCXIxLCBbcjIsIHIzXQotCWxkcmgJcjMsIFtyNCwgcjBdCi0JbGRzYglyMSwgW3I2LCByN10KLQlsZHNoCXIyLCBbcjAsIHI1XQotCi0Jc3RyCXIzLCBbcjMsICMxMjRdCi0JbGRyCXIxLCBbcjQsICMxMjRdCi0JbGRyCXI1LCBbcjVdCi0Jc3RyYglyMSwgW3I1LCAjMzFdCi0Jc3RyYglyMSwgW3I0LCAjNV0KLQlzdHJiCXIyLCBbcjZdCi0KLQlzdHJoCXI0LCBbcjUsICM2Ml0KLQlsZHJoCXI1LCBbcjAsICM0XQotCWxkcmgJcjMsIFtyMl0KLQotCXN0cglyMywgW3IxMywgIzEwMjBdCi0JbGRyCXIxLCBbcjEzLCAjNDRdCi0JbGRyCXIyLCBbcjEzXQotCi0JYWRkCXI3LCByMTUsICMxMDIwCi0JYWRkCXI0LCByMTMsICM1MTIKLQotCWFkZAlyMTMsICMyNjgKLQlhZGQJcjEzLCAjLTEwNAotCXN1YglyMTMsICMyNjgKLQlzdWIJcjEzLCAjLTEwOAotCi0JcHVzaAl7cjAsIHIxLCByMiwgcjR9Ci0JcHVzaAl7cjAsIHIzLXI3LCBscn0KLQlwb3AJe3IzLCByNCwgcjd9Ci0JcG9wCXtyMC1yNywgcjE1fQotCi0Jc3RtaWEJcjMhLCB7cjAsIHIxLCByNC1yN30KLQlsZG1pYQlyMCEsIHtyMS1yN30KLQotCWJlcQliYXIKLQlibmUJYmFyCi0JYmNzCWJhcgotCWJjYwliYXIKLQlibWkJYmFyCi0JYnBsCWJhcgotCWJ2cwliYXIKLQlidmMJYmFyCi0JYmhpCWJhcgotCWJscwliYXIKLQliZ2UJYmFyCi0JYmd0CWJhcgotCWJsdAliYXIKLQliZ3QJYmFyCi0JYmxlCWJhcgotCWJoaQliYXIKLQlibG8JYmFyCi0JYnVsCWJhcgotCi1jbG9zZToKLQlsc2wJcjQsIHI1LCAjbmVhciAtIGNsb3NlCi1uZWFyOgotCWFkZAlyMiwgcjMsICNuZWFyIC0gY2xvc2UKLQotCWFkZAlzcCwgc3AsICMxMjcgPDwgMgotCXN1YglzcCwgc3AsICMxMjcgPDwgMgotCWFkZAlyMCwgc3AsICMyNTUgPDwgMgotCWFkZAlyMCwgcGMsICMyNTUgPDwgMgotCi0JYWRkCXNwLCBzcCwgI2JhciAtIC5mb28KLQlzdWIJc3AsIHNwLCAjYmFyIC0gLmZvbwotCWFkZAlyMCwgc3AsICNiYXIgLSAuZm9vCi0JYWRkCXIwLCBwYywgI2JhciAtIC5mb28KLQotCWFkZAlyMSwgI2JhciAtIC5mb28KLQltb3YJcjYsICNiYXIgLSAuZm9vCi0JY21wCXI3LCAjYmFyIC0gLmZvbwotCi0Jbm9wCi0Jbm9wCi0KLQkuYXJtCi0ubG9jYWxiYXI6Ci0JYgkubG9jYWxiYXIKLQliCS53b21iYXQKLQlibAkubG9jYWxiYXIKLQlibAkud29tYmF0Ci0KLQlieAlyMAotCXN3aQkweDEyMzQ1NgotCi0JLnRodW1iCi0JQCBUaGUgZm9sbG93aW5nIHdpbGwgYmUgZGlzYXNzZW1ibGVkIGluY29ycmVjdGx5IGlmIHdlIGRvIG5vdAotCUAgaGF2ZSBhIFRodW1iIHN5bWJvbCBkZWZpbmVkIGJlZm9yZSB0aGUgZmlyc3QgVGh1bWIgaW5zdHJ1Y3Rpb246Ci1tb3JldGh1bWI6Ci0JYWRyCXIwLCBmb3J3YXJkb25seQotCi0JYgkuZm9vCi0JYgkud29tYmF0Ci0JYmwJLmZvbwotCWJsCS53b21iYXQKLQotCWJ4CXIwCi0KLQlzd2kJMHhmZgotCS5hbGlnbgkwCi1mb3J3YXJkb25seToKLQliZXEJLndvbWJhdAotCWJuZQkud29tYmF0Ci0JYmNzCS53b21iYXQKLQliY2MJLndvbWJhdAotCWJtaQkud29tYmF0Ci0JYnBsCS53b21iYXQKLQlidnMJLndvbWJhdAotCWJ2Ywkud29tYmF0Ci0JYmhpCS53b21iYXQKLQlibHMJLndvbWJhdAotCWJnZQkud29tYmF0Ci0JYmd0CS53b21iYXQKLQlibHQJLndvbWJhdAotCWJndAkud29tYmF0Ci0JYmxlCS53b21iYXQKLQliaGkJLndvbWJhdAotCWJsbwkud29tYmF0Ci0JYnVsCS53b21iYXQKLQotLmJhY2s6Ci0JYmwJLmxvY2FsCi0JLnNwYWNlCSgxIDw8IDExKQlAIGxlYXZlIHNwYWNlIHRvIGZvcmNlIGxvbmcgb2Zmc2V0cwotLmxvY2FsOgotCWJsCS5iYWNrCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Njc2OGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hbGlnbi5kCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgYWxpZ25tZW50IHRlc3QKLSNhczoKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwMCA8c3RhcnQ+OgotICAgMDoJMDg4MTVhODAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCi0gICA4OgkwODgxNWE4MCAwMGYwMDAwMCAJYWJzCXIyMSwgcjQyCXx8CW5vcAkKLSAgMTA6CTA4ODE1YTgwIDAwZjAwMDAwIAlhYnMJcjIxLCByNDIJfHwJbm9wCQotICAxODoJMDBmMDAwMDAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCi0gIDIwOgkwODgxNWE4MCAwMGYwMDAwMCAJYWJzCXIyMSwgcjQyCXx8CW5vcAkKLSAgMjg6CTA4ODE1YTgwIDAwZjAwMDAwIAlhYnMJcjIxLCByNDIJfHwJbm9wCQotICAzMDoJMDg4MTVhODAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMDAzOWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hbGlnbi5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyB0ZXN0cyBwcm9wZXIgaGFuZGxpbmcgb2YgYWxpZ25zIG9uIEQzMFYKLQotCS50ZXh0Ci0JLmFsaWduIDMKLXN0YXJ0OgotCWFicwlyMjEscjQyCi0JLmFsaWduIDMKLQlhYnMJcjIxLHI0MgotCS5hbGlnbiA0Ci0JYWJzCXIyMSxyNDIKLQkuYWxpZ24gNAotCWFicwlyMjEscjQyCi0JCi0JLmRhdGEKLQkubG9uZwkweGRlYWRiZWVmCi0JCi0JLnRleHQKLQlhYnMJcjIxLHI0MgotCi0JLmRhdGEKLQkuYWxpZ24gNAotCS5sb25nCTB4ZGVhZGJlZWYKLQkKLQkudGV4dAotCS5hbGlnbiAzCi0JYWJzCXIyMSxyNDIKLQkuZW5kCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYXJyYXkuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYXJyYXkuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxYmMzMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FycmF5LmQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBhcnJheSB0ZXN0Ci0jYXM6Ci0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAgPF9fZm9vLTB4NDg+OgotICAgMDoJODgwODIwYzAgODAwMDAwNDggCWFkZC5sCXIyLCByMywgMHg0OAotCQkJMDogUl9EMzBWXzMyCS50ZXh0Ci0gICA4Ogk4ODA4MjBjMCA4MDAwMDA0OSAJYWRkLmwJcjIsIHIzLCAweDQ5Ci0JCQk4OiBSX0QzMFZfMzIJLnRleHQKLSAgMTA6CTg4MDgyMGMwIDgwMDAwMDRhIAlhZGQubAlyMiwgcjMsIDB4NGEKLQkJCTEwOiBSX0QzMFZfMzIJLnRleHQKLSAgMTg6CTg4MDgyMGMwIDgwMDAwMDRiIAlhZGQubAlyMiwgcjMsIDB4NGIKLQkJCTE4OiBSX0QzMFZfMzIJLnRleHQKLSAgMjA6CTg4MDgyMGMwIDgwMDAwMDRjIAlhZGQubAlyMiwgcjMsIDB4NGMKLQkJCTIwOiBSX0QzMFZfMzIJLnRleHQKLSAgMjg6CTg4MDgyMGMwIDgwMDAwMDRkIAlhZGQubAlyMiwgcjMsIDB4NGQKLQkJCTI4OiBSX0QzMFZfMzIJLnRleHQKLSAgMzA6CTg4MDgyMGMwIDgwMDAwMDRlIAlhZGQubAlyMiwgcjMsIDB4NGUKLQkJCTMwOiBSX0QzMFZfMzIJLnRleHQKLSAgMzg6CTg4MDgyMGMwIDgwMDAwMDRmIAlhZGQubAlyMiwgcjMsIDB4NGYKLQkJCTM4OiBSX0QzMFZfMzIJLnRleHQKLSAgNDA6CTg4MDgyMGMwIDgwMDAwMDUwIAlhZGQubAlyMiwgcjMsIDB4NTAKLQkJCTQwOiBSX0QzMFZfMzIJLnRleHQKLQotMCswMDQ4IDxfX2Zvbz46Ci0gIDQ4OgkxMjM0NTY3OCAxMjM0NTY3OCAJLmxvbmcJMHgxMjM0NTY3OAl8fAkubG9uZwkweDEyMzQ1Njc4Ci0gIDUwOgkxMjM0NTY3OCAwMDAwMDAwMCAgICAgIAkubG9uZwkweDEyMzQ1Njc4CXx8CWJyYS5zCXIwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FycmF5LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FycmF5LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMTg3ZGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hcnJheS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyBEMzBWIGFycmF5IHRlc3QKLQkudGV4dAotCWFkZCByMiwgcjMgLCBfX2ZvbwotCWFkZCByMiwgcjMgLCBfX2ZvbysxCi0JYWRkIHIyLCByMyAsIF9fZm9vKzIKLQlhZGQgcjIsIHIzICwgX19mb28rMwotCWFkZCByMiwgcjMgLCBfX2Zvbys0Ci0JYWRkIHIyLCByMyAsIF9fZm9vKzUKLQlhZGQgcjIsIHIzICwgX19mb28rNgotCWFkZCByMiwgcjMgLCBfX2Zvbys3Ci0JYWRkIHIyLCByMyAsIF9fZm9vKzgKLV9fZm9vOgotCS5pbnQgMHgxMjM0NTY3OAotICAgICAgICAuaW50IDB4MTIzNDU2NzgKLSAgICAgICAgLmludCAweDEyMzQ1Njc4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTZhYjQ2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgYml0dGVzdCBvcHQKLSNhczogLVdPCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMDBmMDAwMDAgODQ0MDEwODMgCW5vcAkJLT4JbGR3LnMJcjEsIEBcKHIyLCByM1wpCi0gICA4OgkwNDQwNjE0NCAwMGYwMDAwMCAJbGR3LnMJcjYsIEBcKHI1LCByNFwpCXx8CW5vcAkKLSAgMTA6CTAwZjAwMDAwIDgyMjAxMDgzIAlub3AJCS0+CWJzZXQJcjEsIHIyLCByMwotICAxODoJODBmMDAwMDAgMDIwMDEwODMgCW5vcAkJPC0JYnRzdAlmMSwgcjIsIHIzCi0gIDIwOgkwMGYwMDAwMCAwMjMwMTA4MyAJbm9wCQl8fAliY2xyCXIxLCByMiwgcjMKLSAgMjg6CTAwZjAwMDAwIDgyMTAxMDgzIAlub3AJCS0+CWJub3QJcjEsIHIyLCByMwotICAzMDoJMDIxMDEwODMgODBmMDAwMDAgCWJub3QJcjEsIHIyLCByMwktPglub3AJCi0gIDM4OgkwNDdjMDEwNSAwMjIwMTA4MyAJbW9kZGVjCXI0LCAweDUJfHwJYnNldAlyMSwgcjIsIHIzCi0gIDQwOgkwMjIwMTA4MyA4NDdjMDEwNSAJYnNldAlyMSwgcjIsIHIzCS0+CW1vZGRlYwlyNCwgMHg1Ci0gIDQ4OgkwMjIwMTA4MyAwOGMwNDE0NiAJYnNldAlyMSwgcjIsIHIzCXx8CWpvaW5sbC5zCXI0LCByNSwgcjYKLSAgNTA6CTAyMjAxMDgzIDA4YzA0MTQ2IAlic2V0CXIxLCByMiwgcjMJfHwJam9pbmxsLnMJcjQsIHI1LCByNgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZDFiN2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LmwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0uKjogQXNzZW1ibGVyIG1lc3NhZ2VzOgotLio6IFdhcm5pbmc6IFN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyCi0uKjogV2FybmluZzogRXhlY3V0aW5nIGJzZXQgaW4gSVUgbWF5IG5vdCB3b3JrCi0uKjogV2FybmluZzogRXhlY3V0aW5nIGJ0c3QgaW4gSVUgbWF5IG5vdCB3b3JrCi0uKjogV2FybmluZzogRXhlY3V0aW5nIGJjbHIgaW4gSVUgbWF5IG5vdCB3b3JrCi0uKjogV2FybmluZzogRXhlY3V0aW5nIGJub3QgaW4gSVUgbWF5IG5vdCB3b3JrCi0uKjogV2FybmluZzogRXhlY3V0aW5nIGJzZXQgaW4gSVUgbWF5IG5vdCB3b3JrCi0uKjogV2FybmluZzogU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIKLUdBUyBMSVNUSU5HIC4qCi0KLQotICAgMSAgICAgICAgICAgICAgCSMgYml0dGVzdC5zCi0gICAyICAgICAgICAgICAgICAJIwotICAgMyAgICAgICAgICAgICAgCSMgQml0IG9wZXJhdGlvbiBpbnN0cnVjdGlvbnMgXChCQ0xSLCBCTk9ULCBCU0VULCBCVFNUXCkgc2hvdWxkIG5vdCBiZSBwbGFjZWQgaW4gSVUuCi0gICA0ICAgICAgICAgICAgICAJIyBJZiB0aGUgdXNlciBzcGVjaWZpY2FsbHkgaW5kaWNhdGVzIHRoZXkgc2hvdWxkIGJlIGluIHRoZSBJVSwgR0FTIHdpbGwKLSAgIDUgICAgICAgICAgICAgIAkjIGdlbmVyYXRlIHdhcm5pbmdzLiBUaGUgcmVhc29uIHdoeSB0aGlzIGlzIG5vdCBhbiBlcnJvciBpcyB0aGF0IHRob3NlIGluc3RydWN0aW9ucyAKLSAgIDYgICAgICAgICAgICAgIAkjIHdpbGwgZmFpbCBpbiBJVSBvbmx5IG9jY2FzaW9uYWxseS4gVGh1cyBHQVMgc2hvdWxkIHBhY2sgdGhlbSBpbiBNVSBmb3IKLSAgIDcgICAgICAgICAgICAgIAkjIHNhZmV0eSwgYW5kIGl0IGp1c3QgbmVlZHMgdG8gZHJhdyBhdHRlbnRpb24gd2hlbiBhIHZpb2xhdGlvbiBpcyBnaXZlbi4gCi0gICA4ICAgICAgICAgICAgICAJCi0gICA5ICAgICAgICAgICAgICAJCQotICAxMCAwMDAwIDAwRjAwMDAwIAkJbm9wIC0+IGxkdyBSMSwgQFwoUjIsUjNcKQotICAxMCAgICAgIDg0NDAxMDgzIAotICAxMSAwMDA4IDA0NDA2MTQ0IAkgICAgICAgIG5vcCB8fCBsZHcgUjYsIEBcKFI1LFI0XCkKLS4qICBXYXJuaW5nOlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyCi0gIDExICAgICAgMDBGMDAwMDAgCi0gIDEyICAgICAgICAgICAgICAJICAgICAgICAKLSAgMTMgMDAxMCAwMEYwMDAwMCAJICAgICAgICBub3AgLT4gQlNFVCBSMSwgUjIsIFIzIAotLiogIFdhcm5pbmc6RXhlY3V0aW5nIGJzZXQgaW4gSVUgbWF5IG5vdCB3b3JrCi0gIDEzICAgICAgODIyMDEwODMgCi0gIDE0IDAwMTggODBGMDAwMDAgCSAgICAgICAgbm9wIDwtIEJUU1QgRjEsIFIyLCBSMyAKLS4qICBXYXJuaW5nOkV4ZWN1dGluZyBidHN0IGluIElVIG1heSBub3Qgd29yawotICAxNCAgICAgIDAyMDAxMDgzIAotICAxNSAwMDIwIDAwRjAwMDAwIAkgICAgICAgIG5vcCB8fCBCQ0xSIFIxLCBSMiwgUjMKLS4qICBXYXJuaW5nOkV4ZWN1dGluZyBiY2xyIGluIElVIG1heSBub3Qgd29yawotICAxNSAgICAgIDAyMzAxMDgzIAotICAxNiAwMDI4IDAwRjAwMDAwIAkgICAgICAgIG5vcCAtPiBCTk9UIFIxLCBSMiwgUjMKLS4qICBXYXJuaW5nOkV4ZWN1dGluZyBibm90IGluIElVIG1heSBub3Qgd29yawotICAxNiAgICAgIDgyMTAxMDgzIAotICAxNyAwMDMwIDAyMTAxMDgzIAkgICAgICAgIEJOT1QgcjEsIHIyLCByMyAtPiBub3AKLSAgMTcgICAgICA4MEYwMDAwMCAKLSAgMTggICAgICAgICAgICAgIAkgICAgICAgIAotICAxOSAwMDM4IDA0N0MwMTA1IAkgICAgICAgIGJzZXQgcjEsIHIyLCByMyB8fCBtb2RkZWMgcjQsIDUKLS4qICBXYXJuaW5nOlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyCi0gIDE5ICAgICAgMDIyMDEwODMgCi0gIDIwICAgICAgICAgICAgICAJCi0gIDIxICAgICAgICAgICAgICAJICAgICAgICBic2V0IHIxLCByMiwgcjMKLSAgMjIgMDA0MCAwMjIwMTA4MyAJICAgICAgICBtb2RkZWMgcjQsIDUKLSAgMjIgICAgICA4NDdDMDEwNSAKLSAgMjMgICAgICAgICAgICAgIAkKLSAgMjQgICAgICAgICAgICAgIAkgICAgICAgIGJzZXQgcjEsIHIyLCByMwotICAyNSAwMDQ4IDAyMjAxMDgzIAkgICAgICAgIGpvaW5sbCByNCwgcjUsIHI2Ci0gIDI1ICAgICAgODhDMDQxNDYgCi0gIDI2ICAgICAgICAgICAgICAJCi0gIDI3ICAgICAgICAgICAgICAJICAgICAgICBqb2lubGwgcjQsIHI1LCByNgotICAyOCAwMDUwIDgyMjAxMDgzIAkgICAgICAgIGJzZXQgcjEsIHIyLCByMwotICAyOCAgICAgIDA4QzA0MTQ2IApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5YTU2Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QucworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMgYml0dGVzdC5zCi0jCi0jIEJpdCBvcGVyYXRpb24gaW5zdHJ1Y3Rpb25zIChCQ0xSLCBCTk9ULCBCU0VULCBCVFNUKSBzaG91bGQgbm90IGJlIHBsYWNlZCBpbiBJVS4KLSMgSWYgdGhlIHVzZXIgc3BlY2lmaWNhbGx5IGluZGljYXRlcyB0aGV5IHNob3VsZCBiZSBpbiB0aGUgSVUsIEdBUyB3aWxsCi0jIGdlbmVyYXRlIHdhcm5pbmdzLiBUaGUgcmVhc29uIHdoeSB0aGlzIGlzIG5vdCBhbiBlcnJvciBpcyB0aGF0IHRob3NlIGluc3RydWN0aW9ucyAKLSMgd2lsbCBmYWlsIGluIElVIG9ubHkgb2NjYXNpb25hbGx5LiBUaHVzIEdBUyBzaG91bGQgcGFjayB0aGVtIGluIE1VIGZvcgotIyBzYWZldHksIGFuZCBpdCBqdXN0IG5lZWRzIHRvIGRyYXcgYXR0ZW50aW9uIHdoZW4gYSB2aW9sYXRpb24gaXMgZ2l2ZW4uIAotCi0JCi0Jbm9wIC0+IGxkdyBSMSwgQChSMixSMykKLSAgICAgICAgbm9wIHx8IGxkdyBSNiwgQChSNSxSNCkKLSAgICAgICAgCi0gICAgICAgIG5vcCAtPiBCU0VUIFIxLCBSMiwgUjMgCi0gICAgICAgIG5vcCA8LSBCVFNUIEYxLCBSMiwgUjMgCi0gICAgICAgIG5vcCB8fCBCQ0xSIFIxLCBSMiwgUjMKLSAgICAgICAgbm9wIC0+IEJOT1QgUjEsIFIyLCBSMwotICAgICAgICBCTk9UIHIxLCByMiwgcjMgLT4gbm9wCi0gICAgICAgIAotICAgICAgICBic2V0IHIxLCByMiwgcjMgfHwgbW9kZGVjIHI0LCA1Ci0KLSAgICAgICAgYnNldCByMSwgcjIsIHIzCi0gICAgICAgIG1vZGRlYyByNCwgNQotCi0gICAgICAgIGJzZXQgcjEsIHIyLCByMwotICAgICAgICBqb2lubGwgcjQsIHI1LCByNgotCi0gICAgICAgIGpvaW5sbCByNCwgcjUsIHI2Ci0gICAgICAgIGJzZXQgcjEsIHIyLCByMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9kMzAuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9kMzAuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzViMGUwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZDMwLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMKLSMgRDMwViBhc3NlbWJsZXIgdGVzdHMKLSMKLQotcHJvYyBydW5fbGlzdF90ZXN0IHsgbmFtZSBvcHRzIH0gewotICBnbG9iYWwgc3JjZGlyIHN1YmRpcgotICBzZXQgdGVzdG5hbWUgIkQzMFYgJG5hbWUiCi0gIHNldCBmaWxlICRzcmNkaXIvJHN1YmRpci8kbmFtZQotICBnYXNfcnVuICR7bmFtZX0ucyAkb3B0cyAiPiZkdW1wLm91dCIKLSAgaWYge1tyZWdleHBfZGlmZiAiZHVtcC5vdXQiICIke2ZpbGV9LmwiXSB9IHsKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHZlcmJvc2UgIm91dHB1dCBpcyBbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXSIgMgotICAgIHJldHVybgotICB9Ci0gIHBhc3MgJHRlc3RuYW1lCi19Ci0KLWlmIHtbaXN0YXJnZXQgZDMwdi0qLSpdfSB7Ci0gIHJ1bl9kdW1wX3Rlc3QgImluc3QiCi0gIHJ1bl9kdW1wX3Rlc3QgImFsaWduIgotICBydW5fZHVtcF90ZXN0ICJndWFyZCIKLSAgcnVuX2R1bXBfdGVzdCAiZ3VhcmQtZGVidWciCi0gIHJ1bl9kdW1wX3Rlc3QgInJlbG9jIgotICBydW5fZHVtcF90ZXN0ICJvcHQiCi0gIHJ1bl9kdW1wX3Rlc3QgImFycmF5IgotICBydW5fZHVtcF90ZXN0ICJsYWJlbCIKLSAgcnVuX2xpc3RfdGVzdCAid2Fybl9vZGRyZWciICItYWwiCi0gIHJ1bl9saXN0X3Rlc3QgImJpdHRlc3QiICItYWwiCi0gIHJ1bl9kdW1wX3Rlc3QgImJpdHRlc3QiCi0gIHJ1bl9saXN0X3Rlc3QgInNlcmlhbCIgIi1hbCIKLSAgcnVuX2xpc3RfdGVzdCAic2VyaWFsMiIgIi1hbCIKLSAgcnVuX2xpc3RfdGVzdCAic2VyaWFsMk8iICItYWwgLU8iCi0gIHJ1bl9kdW1wX3Rlc3QgIm11bCIKLX0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWExNTRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQtZGVidWcuZAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNvYmpkdW1wOiAtbGRyCi0jbmFtZTogRDMwViBkZWJ1ZyAoLWcpIHRlc3QKLSNhczogLWcKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0uKjpbMC05XSsKLSAgIDA6CTA4MDAxMDgzIDAwZjAwMDAwIAlhZGQucwlyMSwgcjIsIHIzCXx8CW5vcAkKLS4qOlswLTldKwotICAgODoJMDgwMDEwODMgMDBmMDAwMDAgCWFkZC5zCXIxLCByMiwgcjMJfHwJbm9wCQotLio6WzAtOV0rCi0gIDEwOgkxODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMvdHgJcjEsIHIyLCByMwl8fAlub3AJCi0uKjpbMC05XSsKLSAgMTg6CTI4MDAxMDgzIDAwZjAwMDAwIAlhZGQucy9meAlyMSwgcjIsIHIzCXx8CW5vcAkKLS4qOlswLTldKwotICAyMDoJMzgwMDEwODMgMDBmMDAwMDAgCWFkZC5zL3h0CXIxLCByMiwgcjMJfHwJbm9wCQotLio6WzAtOV0rCi0gIDI4Ogk0ODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMveGYJcjEsIHIyLCByMwl8fAlub3AJCi0uKjpbMC05XSsKLSAgMzA6CTU4MDAxMDgzIDAwZjAwMDAwIAlhZGQucy90dAlyMSwgcjIsIHIzCXx8CW5vcAkKLS4qOlswLTldKwotICAzODoJNjgwMDEwODMgMDBmMDAwMDAgCWFkZC5zL3RmCXIxLCByMiwgcjMJfHwJbm9wCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjIwZjdiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQtZGVidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgU2FtZSBhcyBndWFyZC5zIGJ1dCBoZXJlIHdlIGFyZSB0ZXN0aW5nIGRlYnVnICgtZykgYXNzZW1ibHkKLSMgT24gdGhlIEQzMFYsIGFzc2VtYmxpbmcgd2l0aCAtZyBzaG91bGQgZGlzYWJsZSB0aGUgVkxJVyBwYWNraW5nCi0jIGFuZCBwdXQgb25seSBvbmUgaW5zdHJ1Y3Rpb24gcGVyIGxpbmUuCQotCi0JLnRleHQKLQotCWFkZAlyMSxyMixyMwotCWFkZC9hbAlyMSxyMixyMwotCWFkZC90eAlyMSxyMixyMwotCWFkZC9meAlyMSxyMixyMwotCWFkZC94dAlyMSxyMixyMwotCWFkZC94ZglyMSxyMixyMwotCWFkZC90dAlyMSxyMixyMwotCWFkZC90ZglyMSxyMixyMwotCi0JCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmYTJkYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBndWFyZGVkIGV4ZWN1dGlvbiB0ZXN0Ci0jYXM6Ci0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAgPC50ZXh0PjoKLSAgIDA6CTA4MDAxMDgzIDg4MDAxMDgzIAlhZGQucwlyMSwgcjIsIHIzCS0+CWFkZC5zCXIxLCByMiwgcjMKLSAgIDg6CTE4MDAxMDgzIGE4MDAxMDgzIAlhZGQucy90eAlyMSwgcjIsIHIzCS0+CWFkZC5zL2Z4CXIxLCByMiwgcjMKLSAgMTA6CTM4MDAxMDgzIGM4MDAxMDgzIAlhZGQucy94dAlyMSwgcjIsIHIzCS0+CWFkZC5zL3hmCXIxLCByMiwgcjMKLSAgMTg6CTU4MDAxMDgzIGU4MDAxMDgzIAlhZGQucy90dAlyMSwgcjIsIHIzCS0+CWFkZC5zL3RmCXIxLCByMiwgcjMKLSAgMjA6CTA4MDAxMDgzIDg4MDAxMDgzIAlhZGQucwlyMSwgcjIsIHIzCS0+CWFkZC5zCXIxLCByMiwgcjMKLSAgMjg6CTE4MDAxMDgzIGE4MDAxMDgzIAlhZGQucy90eAlyMSwgcjIsIHIzCS0+CWFkZC5zL2Z4CXIxLCByMiwgcjMKLSAgMzA6CTM4MDAxMDgzIGM4MDAxMDgzIAlhZGQucy94dAlyMSwgcjIsIHIzCS0+CWFkZC5zL3hmCXIxLCByMiwgcjMKLSAgMzg6CTU4MDAxMDgzIGU4MDAxMDgzIAlhZGQucy90dAlyMSwgcjIsIHIzCS0+CWFkZC5zL3RmCXIxLCByMiwgcjMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5Y2QzMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIEQzMFYgZ3VhcmRlZCBleGVjdXRpb24gYXNzZW1ibHkgdGVzdAotCi0JLnRleHQKLQotCWFkZAlyMSxyMixyMwotCWFkZC9hbAlyMSxyMixyMwotCWFkZC90eAlyMSxyMixyMwotCWFkZC9meAlyMSxyMixyMwotCWFkZC94dAlyMSxyMixyMwotCWFkZC94ZglyMSxyMixyMwotCWFkZC90dAlyMSxyMixyMwotCWFkZC90ZglyMSxyMixyMwotCi0jIGNoZWNrIGNhc2Ugc2Vuc2l0aXZpdHkgdG9vCi0JQURECXIxLHIyLHIzCi0JQUREL0FMCXIxLHIyLHIzCi0JQUREL3R4CXIxLHIyLHIzCi0JYWRkL0ZYCXIxLHIyLHIzCi0JQUREL1hUCXIxLHIyLHIzCi0JQUREL1hGCXIxLHIyLHIzCi0JYWRkL1RUCXIxLHIyLHIzCi0JQUREL3RmCXIxLHIyLHIzCi0JCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvaW5zdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9pbnN0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NjFjYmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9pbnN0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgYmFzaWMgaW5zdHJ1Y3Rpb24gdGVzdAotI2FzOgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPHN0YXJ0PjoKLSAgIDA6CTA4ODE1YTgwIDg4MDAxMDgzIAlhYnMJcjIxLCByNDIJLT4JYWRkLnMJcjEsIHIyLCByMwotICAgODoJMDgwYjJjZGEgMDBmMDAwMDAgCWFkZC5zCXI1MCwgcjUxLCAweDFhCXx8CW5vcAkKLSAgMTA6CTg4MGIyY2Y3IDhhYjFiZWVmIAlhZGQubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICAxODoJMDgxMDEwODMgODgxYjJjZGEgCWFkZDJoLnMJcjEsIHIyLCByMwktPglhZGQyaC5zCXI1MCwgcjUxLCAweDFhCi0gIDIwOgk4ODFiMmNmNyA4YWIxYmVlZiAJYWRkMmgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICAyODoJMDg0MDEwODMgODg0YjJjZGEgCWFkZGMucwlyMSwgcjIsIHIzCS0+CWFkZGMucwlyNTAsIHI1MSwgMHgxYQotICAzMDoJODg0YjJjZjcgOGFiMWJlZWYgCWFkZGMubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICAzODoJMDkwMDEwODMgODkwYjJjZGEgCWFkZGhsbGwucwlyMSwgcjIsIHIzCS0+CWFkZGhsbGwucwlyNTAsIHI1MSwgMHgxYQotICA0MDoJODkwYjJjZjcgOGFiMWJlZWYgCWFkZGhsbGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA0ODoJMDkxMDEwODMgODkxYjJjZGEgCWFkZGhsbGgucwlyMSwgcjIsIHIzCS0+CWFkZGhsbGgucwlyNTAsIHI1MSwgMHgxYQotICA1MDoJODkxYjJjZjcgOGFiMWJlZWYgCWFkZGhsbGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA1ODoJMDkyMDEwODMgODkyYjJjZGEgCWFkZGhsaGwucwlyMSwgcjIsIHIzCS0+CWFkZGhsaGwucwlyNTAsIHI1MSwgMHgxYQotICA2MDoJODkyYjJjZjcgOGFiMWJlZWYgCWFkZGhsaGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA2ODoJMDkzMDEwODMgODkzYjJjZGEgCWFkZGhsaGgucwlyMSwgcjIsIHIzCS0+CWFkZGhsaGgucwlyNTAsIHI1MSwgMHgxYQotICA3MDoJODkzYjJjZjcgOGFiMWJlZWYgCWFkZGhsaGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA3ODoJMDk0MDEwODMgODk0YjJjZGEgCWFkZGhobGwucwlyMSwgcjIsIHIzCS0+CWFkZGhobGwucwlyNTAsIHI1MSwgMHgxYQotICA4MDoJODk0YjJjZjcgOGFiMWJlZWYgCWFkZGhobGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA4ODoJMDk1MDEwODMgODk1YjJjZGEgCWFkZGhobGgucwlyMSwgcjIsIHIzCS0+CWFkZGhobGgucwlyNTAsIHI1MSwgMHgxYQotICA5MDoJODk1YjJjZjcgOGFiMWJlZWYgCWFkZGhobGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA5ODoJMDk2MDEwODMgODk2YjJjZGEgCWFkZGhoaGwucwlyMSwgcjIsIHIzCS0+CWFkZGhoaGwucwlyNTAsIHI1MSwgMHgxYQotICBhMDoJODk2YjJjZjcgOGFiMWJlZWYgCWFkZGhoaGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICBhODoJMDk3MDEwODMgODk3YjJjZGEgCWFkZGhoaGgucwlyMSwgcjIsIHIzCS0+CWFkZGhoaGgucwlyNTAsIHI1MSwgMHgxYQotICBiMDoJODk3YjJjZjcgOGFiMWJlZWYgCWFkZGhoaGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICBiODoJMDg2MDEwODMgODg2YjJjZGEgCWFkZHMucwlyMSwgcjIsIHIzCS0+CWFkZHMucwlyNTAsIHI1MSwgMHgxYQotICBjMDoJODg2YjJjZjcgOGFiMWJlZWYgCWFkZHMubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICBjODoJMDg3MDEwODMgODg3YjJjZGEgCWFkZHMyaC5zCXIxLCByMiwgcjMJLT4JYWRkczJoLnMJcjUwLCByNTEsIDB4MWEKLSAgZDA6CTg4N2IyY2Y3IDhhYjFiZWVmIAlhZGRzMmgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICBkODoJMDM4MDEwODMgODM4YjJjZGEgCWFuZC5zCXIxLCByMiwgcjMJLT4JYW5kLnMJcjUwLCByNTEsIDB4MWEKLSAgZTA6CTgzOGIyY2Y3IDhhYjFiZWVmIAlhbmQubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICBlODoJMDI4MDAwNDIgODI4ODMxMDUgCWFuZGZnCWYwLCBmMSwgZjIJLT4JYW5kZmcJZjMsIHMsIDB4NQotICBmMDoJMDhhMDEwODMgODhhODQxNDYgCWF2Zy5zCXIxLCByMiwgcjMJLT4JYXZnLnMJcjQsIHI1LCAweDYKLSAgZjg6CTg4YWIyY2Y3IDhhYjFiZWVmIAlhdmcubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDEwMDoJMDhiMDEwODMgODhiODQxNDYgCWF2ZzJoLnMJcjEsIHIyLCByMwktPglhdmcyaC5zCXI0LCByNSwgMHg2Ci0gMTA4Ogk4OGJiMmNmNyA4YWIxYmVlZiAJYXZnMmgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDExMDoJMDIzMDEwODMgODIzODQxNDYgCWJjbHIJcjEsIHIyLCByMwktPgliY2xyCXI0LCByNSwgMHg2Ci0gMTE4OgkwMjEwMTA4MyA4MjE4NWNjNiAJYm5vdAlyMSwgcjIsIHIzCS0+CWJub3QJcjUsIHI1MSwgMHg2Ci0gMTIwOgkwMDAwMDAyOSAwMGYwMDAwMCAJYnJhLnMJcjQxCXx8CW5vcAkKLSAxMjg6CTAwMDgwMDA4IDAwZjAwMDAwIAlicmEucwk0MAlcKDE2OCA8c3RhcnRcKzB4MTY4PlwpCXx8CW5vcAkKLSAxMzA6CTAwMDgxZTAxIDAwZjAwMDAwIAlicmEucwlmMDA4CVwoZjEzOCA8c3RhcnRcKzB4ZjEzOD5cKQl8fAlub3AJCi0gMTM4OgkwMDQ2OTAyYSAwMGYwMDAwMCAJYnJhdG56LnMJcjQxLCByNDIJfHwJbm9wCQotIDE0MDoJODA0YzEwMDAgODAwMGYwMGQgCWJyYXRuei5sCXIxLCBmMDBkCVwoZjE0ZCA8c3RhcnRcKzB4ZjE0ZD5cKQotIDE0ODoJODA0YzEwMzcgOGFiMWYwMGQgCWJyYXRuei5sCXIxLCAtMjE1MjBmZjMJXChkZWFkZjE1NSA8c3RhcnRcKzB4ZGVhZGYxNTU+XCkKLSAxNTA6CTAwNDI5MDJhIDAwZjAwMDAwIAlicmF0enIucwlyNDEsIHI0Mgl8fAlub3AJCi0gMTU4Ogk4MDQ4MTAwMCA4MDAwZjAwZCAJYnJhdHpyLmwJcjEsIGYwMGQJXChmMTY1IDxzdGFydFwrMHhmMTY1PlwpCi0gMTYwOgk4MDQ4MTAzNyA4YWIxZjAwZCAJYnJhdHpyLmwJcjEsIC0yMTUyMGZmMwlcKGRlYWRmMTZkIDxzdGFydFwrMHhkZWFkZjE2ZD5cKQotIDE2ODoJMDIyMDEwODMgODIyODVjYzYgCWJzZXQJcjEsIHIyLCByMwktPglic2V0CXI1LCByNTEsIDB4NgotIDE3MDoJMDAyMDAwMjkgMDBmMDAwMDAgCWJzci5zCXI0MQl8fAlub3AJCi0gMTc4OgkwMDI4MWUwMSAwMGYwMDAwMCAJYnNyLnMJZjAwOAlcKGYxODAgPHN0YXJ0XCsweGYxODA+XCkJfHwJbm9wCQotIDE4MDoJODAyODAwMzcgOGFiMWYwMGQgCWJzci5sCS0yMTUyMGZmMwlcKGRlYWRmMThkIDxzdGFydFwrMHhkZWFkZjE4ZD5cKQotIDE4ODoJMDA2NjkwMmEgMDBmMDAwMDAgCWJzcnRuei5zCXI0MSwgcjQyCXx8CW5vcAkKLSAxOTA6CTgwNmMxMDAwIDgwMDBmMDBkIAlic3J0bnoubAlyMSwgZjAwZAlcKGYxOWQgPHN0YXJ0XCsweGYxOWQ+XCkKLSAxOTg6CTgwNmMxMDM3IDhhYjFmMDBkIAlic3J0bnoubAlyMSwgLTIxNTIwZmYzCVwoZGVhZGYxYTUgPHN0YXJ0XCsweGRlYWRmMWE1PlwpCi0gMWEwOgkwMDYyOTAyYSAwMGYwMDAwMCAJYnNydHpyLnMJcjQxLCByNDIJfHwJbm9wCQotIDFhODoJODA2ODEwMDAgODAwMGYwMGQgCWJzcnR6ci5sCXIxLCBmMDBkCVwoZjFiNSA8c3RhcnRcKzB4ZjFiNT5cKQotIDFiMDoJODA2ODEwMzcgOGFiMWYwMGQgCWJzcnR6ci5sCXIxLCAtMjE1MjBmZjMJXChkZWFkZjFiZCA8c3RhcnRcKzB4ZGVhZGYxYmQ+XCkKLSAxYjg6CTAyMDAxMDgzIDgyMDg1Y2M2IAlidHN0CWYxLCByMiwgcjMJLT4JYnRzdAl2LCByNTEsIDB4NgotIDFjMDoJMDJjMDAwYzEgODJjMDk1MTUgCWNtcGVxLnMJZjAsIHIzLCByMQktPgljbXBuZS5zCWYxLCByMjAsIHIyMQotIDFjODoJMDJjMTI3ZTAgODJjMWIwYzQgCWNtcGd0LnMJZjIsIHIzMSwgcjMyCS0+CWNtcGdlLnMJZjMsIHIzLCByNAotIDFkMDoJMDJjMjQwYzQgODJjMmQwYzQgCWNtcGx0LnMJcywgcjMsIHI0CS0+CWNtcGxlLnMJdiwgcjMsIHI0Ci0gMWQ4OgkwMmMzNjBjNCA4MmMzZjBjNCAJY21wcHMucwl2YSwgcjMsIHI0CS0+CWNtcG5nLnMJYywgcjMsIHI0Ci0gMWUwOgkwMmQxMjdlMCA4MmQxYjBjNCAJY21wdWd0LnMJZjIsIHIzMSwgcjMyCS0+CWNtcHVnZS5zCWYzLCByMywgcjQKLSAxZTg6CTAyZDI0MGM0IDgyZDJkMGM0IAljbXB1bHQucwlzLCByMywgcjQJLT4JY21wdWxlLnMJdiwgcjMsIHI0Ci0gMWYwOgkwMTAwMTAwOCA4MTA4MTAyMCAJZGJyYS5zCXIxLCByOAktPglkYnJhLnMJcjEsIDEwMAlcKDJmMCA8c3RhcnRcKzB4MmYwPlwpCi0gMWY4Ogk4MTA4MTAzNyA4YWIxZjAwZCAJZGJyYS5sCXIxLCAtMjE1MjBmZjMJXChkZWFkZjIwNSA8c3RhcnRcKzB4ZGVhZGYyMDU+XCkKLSAyMDA6CTAxNDAyMDFmIDgxNDgyMDIwIAlkYnJhaS5zCTEwLCByMzEJLT4JZGJyYWkucwkxMCwgMTAwCVwoMzAwIDxzdGFydFwrMHgzMDA+XCkKLSAyMDg6CTgxNDgyMDM3IDhhYjFmMDBkIAlkYnJhaS5sCTEwLCAtMjE1MjBmZjMJXChkZWFkZjIxNSA8c3RhcnRcKzB4ZGVhZGYyMTU+XCkKLSAyMTA6CTAxMjAxMDA4IDAwZjAwMDAwIAlkYnNyLnMJcjEsIHI4CXx8CW5vcAkKLSAyMTg6CTAxMjgxMDIwIDAwZjAwMDAwIAlkYnNyLnMJcjEsIDEwMAlcKDMxOCA8c3RhcnRcKzB4MzE4PlwpCXx8CW5vcAkKLSAyMjA6CTgxMjgxMDM3IDhhYjFmMDBkIAlkYnNyLmwJcjEsIC0yMTUyMGZmMwlcKGRlYWRmMjJkIDxzdGFydFwrMHhkZWFkZjIyZD5cKQotIDIyODoJMDE2MDQwMWYgMDBmMDAwMDAgCWRic3JpLnMJMjAsIHIzMQl8fAlub3AJCi0gMjMwOgkwMTY4NDAyMCAwMGYwMDAwMCAJZGJzcmkucwkyMCwgMTAwCVwoMzMwIDxzdGFydFwrMHgzMzA+XCkJfHwJbm9wCQotIDIzODoJODE2ODQwMzcgOGFiMWYwMGQgCWRic3JpLmwJMjAsIC0yMTUyMGZmMwlcKGRlYWRmMjQ1IDxzdGFydFwrMHhkZWFkZjI0NT5cKQotIDI0MDoJMDExMDEwMjAgMDBmMDAwMDAgCWRqbXAucwlyMSwgcjMyCXx8CW5vcAkKLSAyNDg6CTgxMTgxMDAwIDgwMDBmMDBkIAlkam1wLmwJcjEsIGYwMGQgPHN0YXJ0XCsweGYwMGQ+Ci0gMjUwOgk4MTE4MTAzNyA4YWIxZjAwZCAJZGptcC5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMjU4OgkwMTUwNjAyMCAwMGYwMDAwMCAJZGptcGkucwkzMCwgcjMyCXx8CW5vcAkKLSAyNjA6CTgxNTg2MDAwIDgwMDBmMDBkIAlkam1waS5sCTMwLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDI2ODoJODE1ODYwMzcgOGFiMWYwMGQgCWRqbXBpLmwJMzAsIGRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAyNzA6CTAxMzAxMDIwIDAwZjAwMDAwIAlkanNyLnMJcjEsIHIzMgl8fAlub3AJCi0gMjc4Ogk4MTM4MTAwMCA4MDAwZjAwZCAJZGpzci5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDI4MDoJODEzODEwMzcgOGFiMWYwMGQgCWRqc3IubAlyMSwgZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgotIDI4ODoJMDE3MDIwMjAgMDBmMDAwMDAgCWRqc3JpLnMJMTAsIHIzMgl8fAlub3AJCi0gMjkwOgk4MTc4NDAwMCA4MDAwZjAwZCAJZGpzcmkubAkyMCwgZjAwZCA8c3RhcnRcKzB4ZjAwZD4KLSAyOTg6CTgxNzg4MDM3IDhhYjFmMDBkIAlkanNyaS5sCTQwLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMmEwOgkwMDEwMDAyOSAwMGYwMDAwMCAJam1wLnMJcjQxCXx8CW5vcAkKLSAyYTg6CTAwMTgxZTAxIDAwZjAwMDAwIAlqbXAucwlmMDA4IDxzdGFydFwrMHhmMDA4Pgl8fAlub3AJCi0gMmIwOgk4MDE4MDAzNyA4YWIxZjAwZCAJam1wLmwJZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgotIDJiODoJMDA1NjkwMmEgMDBmMDAwMDAgCWptcHRuei5zCXI0MSwgcjQyCXx8CW5vcAkKLSAyYzA6CTgwNWMxMDAwIDgwMDBmMDBkIAlqbXB0bnoubAlyMSwgZjAwZCA8c3RhcnRcKzB4ZjAwZD4KLSAyYzg6CTgwNWMxMDM3IDhhYjFmMDBkIAlqbXB0bnoubAlyMSwgZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgotIDJkMDoJMDA1MjkwMmEgMDBmMDAwMDAgCWptcHR6ci5zCXI0MSwgcjQyCXx8CW5vcAkKLSAyZDg6CTgwNTgxMDAwIDgwMDBmMDBkIAlqbXB0enIubAlyMSwgZjAwZCA8c3RhcnRcKzB4ZjAwZD4KLSAyZTA6CTgwNTgxMDM3IDhhYjFmMDBkIAlqbXB0enIubAlyMSwgZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgotIDJlODoJMDhjMDEwODQgODhjODEwOGYgCWpvaW5sbC5zCXIxLCByMiwgcjQJLT4Jam9pbmxsLnMJcjEsIHIyLCAweGYKLSAyZjA6CTg4YzgxMGI3IDhhYjFmMDBkIAlqb2lubGwubAlyMSwgcjIsIDB4ZGVhZGYwMGQKLSAyZjg6CTA4ZDAxMDg0IDg4ZDgxMDhmIAlqb2lubGgucwlyMSwgcjIsIHI0CS0+CWpvaW5saC5zCXIxLCByMiwgMHhmCi0gMzAwOgk4OGQ4MTBiNyA4YWIxZjAwZCAJam9pbmxoLmwJcjEsIHIyLCAweGRlYWRmMDBkCi0gMzA4OgkwOGUwMTA4NCA4OGU4MTA4ZiAJam9pbmhsLnMJcjEsIHIyLCByNAktPglqb2luaGwucwlyMSwgcjIsIDB4ZgotIDMxMDoJODhlODEwYjcgOGFiMWYwMGQgCWpvaW5obC5sCXIxLCByMiwgMHhkZWFkZjAwZAotIDMxODoJMDhmMDEwODQgODhmODEwOGYgCWpvaW5oaC5zCXIxLCByMiwgcjQJLT4Jam9pbmhoLnMJcjEsIHIyLCAweGYKLSAzMjA6CTg4ZjgxMGI3IDhhYjFmMDBkIAlqb2luaGgubAlyMSwgcjIsIDB4ZGVhZGYwMGQKLSAzMjg6CTAwMzAwMDI5IDAwZjAwMDAwIAlqc3IucwlyNDEJfHwJbm9wCQotIDMzMDoJMDAzODFlMDEgMDBmMDAwMDAgCWpzci5zCWYwMDggPHN0YXJ0XCsweGYwMDg+CXx8CW5vcAkKLSAzMzg6CTgwMzgwMDM3IDhhYjFmMDBkIAlqc3IubAlkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMzQwOgkwMDc2OTAyYSAwMGYwMDAwMCAJanNydG56LnMJcjQxLCByNDIJfHwJbm9wCQotIDM0ODoJODA3YzEwMDAgODAwMGYwMGQgCWpzcnRuei5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDM1MDoJODA3YzEwMzcgOGFiMWYwMGQgCWpzcnRuei5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMzU4OgkwMDcyOTAyYSAwMGYwMDAwMCAJanNydHpyLnMJcjQxLCByNDIJfHwJbm9wCQotIDM2MDoJODA3ODEwMDAgODAwMGYwMGQgCWpzcnR6ci5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDM2ODoJODA3ODEwMzcgOGFiMWYwMGQgCWpzcnR6ci5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMzcwOgkwNDMwNjFjOCA4NDM0NjFjOCAJbGQyaC5zCXI2LCBAXChyNywgcjhcKQktPglsZDJoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSAzNzg6CTA0M2M2MWM4IDg0Mzg2MWRhIAlsZDJoLnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZDJoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzODA6CTg0Mzg2MWMwIDgwMDAxMjM0IAlsZDJoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDM4ODoJMDQ2MDYxYzggODQ2NDYxYzggCWxkMncucwlyNiwgQFwocjcsIHI4XCkJLT4JbGQydy5zCXI2LCBAXChyN1wrLCByOFwpCi0gMzkwOgkwNDZjNjFjOCA4NDY4NjFkYSAJbGQydy5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGQydy5zCXI2LCBAXChyNywgMHgxYVwpCi0gMzk4Ogk4NDY4NjFjMCA4MDAwMTIzNCAJbGQydy5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSAzYTA6CTA0NTA2MWM4IDg0NTQ2MWM4IAlsZDRiaC5zCXI2LCBAXChyNywgcjhcKQktPglsZDRiaC5zCXI2LCBAXChyN1wrLCByOFwpCi0gM2E4OgkwNDVjNjFjOCA4NDU4NjFkYSAJbGQ0YmgucwlyNiwgQFwocjctLCByOFwpCS0+CWxkNGJoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzYjA6CTg0NTg2MWMwIDgwMDAxMjM0IAlsZDRiaC5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSAzYjg6CTA0ZDA2MWM4IDg0ZDQ2MWM4IAlsZDRiaHUucwlyNiwgQFwocjcsIHI4XCkJLT4JbGQ0Ymh1LnMJcjYsIEBcKHI3XCssIHI4XCkKLSAzYzA6CTA0ZGM2MWM4IDg0ZDg2MWRhIAlsZDRiaHUucwlyNiwgQFwocjctLCByOFwpCS0+CWxkNGJodS5zCXI2LCBAXChyNywgMHgxYVwpCi0gM2M4Ogk4NGQ4NjFjMCA4MDAwMTIzNCAJbGQ0Ymh1LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDNkMDoJMDQwMDYxYzggODQwNDYxYzggCWxkYi5zCXI2LCBAXChyNywgcjhcKQktPglsZGIucwlyNiwgQFwocjdcKywgcjhcKQotIDNkODoJMDQwYzYxYzggODQwODYxZGEgCWxkYi5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGRiLnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzZTA6CTg0MDg2MWMwIDgwMDAxMjM0IAlsZGIubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gM2U4OgkwNDkwNjFjOCA4NDk0NjFjOCAJbGRidS5zCXI2LCBAXChyNywgcjhcKQktPglsZGJ1LnMJcjYsIEBcKHI3XCssIHI4XCkKLSAzZjA6CTA0OWM2MWM4IDg0OTg2MWRhIAlsZGJ1LnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZGJ1LnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzZjg6CTg0OTg2MWMwIDgwMDAxMjM0IAlsZGJ1LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDQwMDoJMDQyMDYxYzggODQyNDYxYzggCWxkaC5zCXI2LCBAXChyNywgcjhcKQktPglsZGgucwlyNiwgQFwocjdcKywgcjhcKQotIDQwODoJMDQyYzYxYzggODQyODYxZGEgCWxkaC5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGRoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA0MTA6CTg0Mjg2MWMwIDgwMDAxMjM0IAlsZGgubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNDE4OgkwNDEwNjFjOCA4NDE0NjFjOCAJbGRoaC5zCXI2LCBAXChyNywgcjhcKQktPglsZGhoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSA0MjA6CTA0MWM2MWM4IDg0MTg2MWRhIAlsZGhoLnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZGhoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA0Mjg6CTg0MTg2MWMwIDgwMDAxMjM0IAlsZGhoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDQzMDoJMDRhMDYxYzggODRhNDYxYzggCWxkaHUucwlyNiwgQFwocjcsIHI4XCkJLT4JbGRodS5zCXI2LCBAXChyN1wrLCByOFwpCi0gNDM4OgkwNGFjNjFjOCA4NGE4NjFkYSAJbGRodS5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGRodS5zCXI2LCBAXChyNywgMHgxYVwpCi0gNDQwOgk4NGE4NjFjMCA4MDAwMTIzNCAJbGRodS5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA0NDg6CTA0NDA2MWM4IDg0NDQ2MWM4IAlsZHcucwlyNiwgQFwocjcsIHI4XCkJLT4JbGR3LnMJcjYsIEBcKHI3XCssIHI4XCkKLSA0NTA6CTA0NGM2MWM4IDg0NDg2MWRhIAlsZHcucwlyNiwgQFwocjctLCByOFwpCS0+CWxkdy5zCXI2LCBAXChyNywgMHgxYVwpCi0gNDU4Ogk4NDQ4NjFjMCA4MDAwMTIzNCAJbGR3LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDQ2MDoJOGI0ODEwOWYgMGI0MDEwODQgCW1hYzAJcjEsIHIyLCAweDFmCTwtCW1hYzAJcjEsIHIyLCByNAotIDQ2ODoJOGI0YzEwOWYgMGI0NDEwODQgCW1hYzEJcjEsIHIyLCAweDFmCTwtCW1hYzEJcjEsIHIyLCByNAotIDQ3MDoJOGI1ODEwOWYgMGI1MDEwODQgCW1hY3MwCXIxLCByMiwgMHgxZgk8LQltYWNzMAlyMSwgcjIsIHI0Ci0gNDc4Ogk4YjVjMTA5ZiAwYjU0MTA4NCAJbWFjczEJcjEsIHIyLCAweDFmCTwtCW1hY3MxCXIxLCByMiwgcjQKLSA0ODA6CTA0N2MwMDRhIDg0NzQwMDRhIAltb2RkZWMJcjEsIDB4YQktPgltb2RpbmMJcjEsIDB4YQotIDQ4ODoJOGI2ODEwOWYgMGI2MDEwODQgCW1zdWIwCXIxLCByMiwgMHgxZgk8LQltc3ViMAlyMSwgcjIsIHI0Ci0gNDkwOgk4YjZjMTA5ZiAwYjY0MTA4NCAJbXN1YjEJcjEsIHIyLCAweDFmCTwtCW1zdWIxCXIxLCByMiwgcjQKLSA0OTg6CThiMDgxMDhhIDBiMDAxMDg0IAltdWwJcjEsIHIyLCAweGEJPC0JbXVsCXIxLCByMiwgcjQKLSA0YTA6CThiNzgxMDlmIDBiNzAxMDg0IAltc3ViczAJcjEsIHIyLCAweDFmCTwtCW1zdWJzMAlyMSwgcjIsIHI0Ci0gNGE4Ogk4YjdjMTA5ZiAwYjc0MTA4NCAJbXN1YnMxCXIxLCByMiwgMHgxZgk8LQltc3ViczEJcjEsIHIyLCByNAotIDRiMDoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotIDRiODoJOGEwODEwOGEgMGEwMDEwODQgCW11bDJoCXIxLCByMiwgMHhhCTwtCW11bDJoCXIxLCByMiwgcjQKLSA0YzA6CThhNDgxMDhhIDBhNDAxMDg0IAltdWxoeGxsCXIxLCByMiwgMHhhCTwtCW11bGh4bGwJcjEsIHIyLCByNAotIDRjODoJOGE1ODEwOGEgMGE1MDEwODQgCW11bGh4bGgJcjEsIHIyLCAweGEJPC0JbXVsaHhsaAlyMSwgcjIsIHI0Ci0gNGQwOgk4YTY4MTA4YSAwYTYwMTA4NCAJbXVsaHhobAlyMSwgcjIsIDB4YQk8LQltdWxoeGhsCXIxLCByMiwgcjQKLSA0ZDg6CThhNzgxMDhhIDBhNzAxMDg0IAltdWxoeGhoCXIxLCByMiwgMHhhCTwtCW11bGh4aGgJcjEsIHIyLCByNAotIDRlMDoJOGI5MDAwNDQgMGExMDgwODQgCW11bHhzCWEwLCByMSwgcjQJPC0JbXVseDJoCXI4LCByMiwgcjQKLSA0ZTg6CThiODgxMDhhIDBiODAwMDQ0IAltdWx4CWExLCByMiwgMHhhCTwtCW11bHgJYTAsIHIxLCByNAotIDRmMDoJOGJmODIwNGEgMGJmMDEwMDQgCW12ZmFjYwlyMiwgYTEsIDB4YQk8LQltdmZhY2MJcjEsIGEwLCByNAotIDRmODoJOGI5ODEwOGEgMGExODgwOGEgCW11bHhzCWExLCByMiwgMHhhCTwtCW11bHgyaAlyOCwgcjIsIDB4YQotIDUwMDoJMDFlMGEwODAgODFlMGExYzAgCW12ZnN5cwlyMTAsIHBjCS0+CW12ZnN5cwlyMTAsIHJwdF9jCi0gNTA4OgkwMWUwYTAwMCA4MWUwYTAwMiAJbXZmc3lzCXIxMCwgcHN3CS0+CW12ZnN5cwlyMTAsIHBzd2gKLSA1MTA6CTAxZTBhMDAxIDgxZTBhMDAzIAltdmZzeXMJcjEwLCBwc3dsCS0+CW12ZnN5cwlyMTAsIGYwCi0gNTE4OgkwMWUwYTEwMyA4YWYwMTA4NCAJbXZmc3lzCXIxMCwgcwktPgltdnRhY2MJYTEsIHIyLCByNAotIDUyMDoJMDBlMDcyODAgODBlMDAyODAgCW12dHN5cwlycHRfYywgcjEwCS0+CW12dHN5cwlwc3csIHIxMAotIDUyODoJMDBlMDAyODIgODBlMDAyODEgCW12dHN5cwlwc3doLCByMTAJLT4JbXZ0c3lzCXBzd2wsIHIxMAotIDUzMDoJMDBlMDAyODMgODBlMDMyODMgCW12dHN5cwlmMCwgcjEwCS0+CW12dHN5cwlmMywgcjEwCi0gNTM4OgkwMGUwNDI4MyA4MGUwNTI4MyAJbXZ0c3lzCXMsIHIxMAktPgltdnRzeXMJdiwgcjEwCi0gNTQwOgkwMGUwNjI4MyA4MGUwNzI4MyAJbXZ0c3lzCXZhLCByMTAJLT4JbXZ0c3lzCWMsIHIxMAotIDU0ODoJMDBmMDAwMDAgODM5MDEwODAgCW5vcAkJLT4Jbm90CXIxLCByMgotIDU1MDoJMDI5MDEwODAgODNhMDEwODQgCW5vdGZnCWYxLCBmMgktPglvci5zCXIxLCByMiwgcjQKLSA1NTg6CTAzYTgxMDlhIDAwZjAwMDAwIAlvci5zCXIxLCByMiwgMHgxYQl8fAlub3AJCi0gNTYwOgk4M2E4MTBiNyA4YWIxZjAwZCAJb3IubAlyMSwgcjIsIDB4ZGVhZGYwMGQKLSA1Njg6CTAyYTAxMDg0IDgyYTg0MDgxIAlvcmZnCWYxLCBmMiwgcwktPglvcmZnCXMsIGYyLCAweDEKLSA1NzA6CTAwODAwMDAwIDAwZjAwMDAwIAlyZWl0CQl8fAlub3AJCi0gNTc4OgkwMTgwMTAwMiAwMGYwMDAwMCAJcmVwZWF0LnMJcjEsIHIyCXx8CW5vcAkKLSA1ODA6CTgxODg0MDAwIDgwMDBkZWFkIAlyZXBlYXQubAlyNCwgZGVhZAlcKGU0MmQgPHN0YXJ0XCsweGU0MmQ+XCkKLSA1ODg6CTgxODg0MDM3IDhhYjFmMDBkIAlyZXBlYXQubAlyNCwgLTIxNTIwZmYzCVwoZGVhZGY1OTUgPHN0YXJ0XCsweGRlYWRmNTk1PlwpCi0gNTkwOgkwMWEwYTAwMSA4MWE4YTIwMCAJcmVwZWF0aS5zCWEJXCg1OWEgPHN0YXJ0XCsweDU5YT5cKSwgcjEJLT4JcmVwZWF0aS5zCWEJXCg1OWEgPHN0YXJ0XCsweDU5YT5cKSwgMTAwMAlcKDE1OTAgPHN0YXJ0XCsweDE1OTA+XCkKLSA1OTg6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKLSA1YTA6CTAzNDAxMDg0IDgzNDgxMDhhIAlyb3QJcjEsIHIyLCByNAktPglyb3QJcjEsIHIyLCAweGEKLSA1YTg6CTAzNTAxMDg0IDgzNTgxMDhhIAlyb3QyaAlyMSwgcjIsIHI0CS0+CXJvdDJoCXIxLCByMiwgMHhhCi0gNWIwOgk4YTg4MTA4YSAwYTgwMTA4NCAJc2F0CXIxLCByMiwgMHhhCTwtCXNhdAlyMSwgcjIsIHI0Ci0gNWI4Ogk4YTk4MTA4YSAwYTkwMTA4NCAJc2F0MmgJcjEsIHIyLCAweGEJPC0Jc2F0MmgJcjEsIHIyLCByNAotIDVjMDoJOGJjODEwOGEgMGJjMDEwODQgCXNhdGhsCXIxLCByMiwgMHhhCTwtCXNhdGhsCXIxLCByMiwgcjQKLSA1Yzg6CThiZDgxMDhhIDBiZDAxMDg0IAlzYXRoaAlyMSwgcjIsIDB4YQk8LQlzYXRoaAlyMSwgcjIsIHI0Ci0gNWQwOgk4YWE4MTA4YSAwYWEwMTA4NCAJc2F0eglyMSwgcjIsIDB4YQk8LQlzYXR6CXIxLCByMiwgcjQKLSA1ZDg6CThhYjgxMDhhIDBhYjAxMDg0IAlzYXR6MmgJcjEsIHIyLCAweGEJPC0Jc2F0ejJoCXIxLCByMiwgcjQKLSA1ZTA6CTAzMDAxMDg0IDgzMDgxMDhhIAlzcmEJcjEsIHIyLCByNAktPglzcmEJcjEsIHIyLCAweGEKLSA1ZTg6CTAzMTAxMDg0IDgzMTgxMDhhIAlzcmEyaAlyMSwgcjIsIHI0CS0+CXNyYTJoCXIxLCByMiwgMHhhCi0gNWYwOgkwMzYwMTA4NCA4MzY4MTA4YSAJc3JjCXIxLCByMiwgcjQJLT4Jc3JjCXIxLCByMiwgMHhhCi0gNWY4OgkwMzIwMTA4NCA4MzI4MTA4YSAJc3JsCXIxLCByMiwgcjQJLT4Jc3JsCXIxLCByMiwgMHhhCi0gNjAwOgkwMzMwMTA4NCA4MzM4MTA4YSAJc3JsMmgJcjEsIHIyLCByNAktPglzcmwyaAlyMSwgcjIsIDB4YQotIDYwODoJMDUzMDYxYzggODUzNDYxYzggCXN0MmgucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3QyaC5zCXI2LCBAXChyN1wrLCByOFwpCi0gNjEwOgkwNTNjNjFjOCA4NTM4NjFkYSAJc3QyaC5zCXI2LCBAXChyNy0sIHI4XCkJLT4Jc3QyaC5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjE4Ogk4NTM4NjFjMCA4MDAwMTIzNCAJc3QyaC5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA2MjA6CTA1NjA2MWM4IDg1NjQ2MWM4IAlzdDJ3LnMJcjYsIEBcKHI3LCByOFwpCS0+CXN0MncucwlyNiwgQFwocjdcKywgcjhcKQotIDYyODoJMDU2YzYxYzggODU2ODYxZGEgCXN0MncucwlyNiwgQFwocjctLCByOFwpCS0+CXN0MncucwlyNiwgQFwocjcsIDB4MWFcKQotIDYzMDoJODU2ODYxYzAgODAwMDEyMzQgCXN0MncubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNjM4OgkwNTUwNjFjOCA4NTU0NjFjOCAJc3Q0aGIucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3Q0aGIucwlyNiwgQFwocjdcKywgcjhcKQotIDY0MDoJMDU1YzYxYzggODU1ODYxZGEgCXN0NGhiLnMJcjYsIEBcKHI3LSwgcjhcKQktPglzdDRoYi5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjQ4Ogk4NTU4NjFjMCA4MDAwMTIzNCAJc3Q0aGIubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNjUwOgkwNTAwNjFjOCA4NTA0NjFjOCAJc3RiLnMJcjYsIEBcKHI3LCByOFwpCS0+CXN0Yi5zCXI2LCBAXChyN1wrLCByOFwpCi0gNjU4OgkwNTBjNjFjOCA4NTA4NjFkYSAJc3RiLnMJcjYsIEBcKHI3LSwgcjhcKQktPglzdGIucwlyNiwgQFwocjcsIDB4MWFcKQotIDY2MDoJODUwODYxYzAgODAwMDEyMzQgCXN0Yi5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA2Njg6CTA1MjA2MWM4IDg1MjQ2MWM4IAlzdGgucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3RoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSA2NzA6CTA1MmM2MWM4IDg1Mjg2MWRhIAlzdGgucwlyNiwgQFwocjctLCByOFwpCS0+CXN0aC5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjc4Ogk4NTI4NjFjMCA4MDAwMTIzNCAJc3RoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDY4MDoJMDUxMDYxYzggODUxNDYxYzggCXN0aGgucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3RoaC5zCXI2LCBAXChyN1wrLCByOFwpCi0gNjg4OgkwNTFjNjFjOCA4NTE4NjFkYSAJc3RoaC5zCXI2LCBAXChyNy0sIHI4XCkJLT4Jc3RoaC5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjkwOgk4NTE4NjFjMCA4MDAwMTIzNCAJc3RoaC5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA2OTg6CTA1NDA2MWM4IDg1NDQ2MWM4IAlzdHcucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3R3LnMJcjYsIEBcKHI3XCssIHI4XCkKLSA2YTA6CTA1NGM2MWM4IDg1NDg2MWRhIAlzdHcucwlyNiwgQFwocjctLCByOFwpCS0+CXN0dy5zCXI2LCBAXChyNywgMHgxYVwpCi0gNmE4Ogk4NTQ4NjFjMCA4MDAwMTIzNCAJc3R3LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDZiMDoJMDgyMDEwODMgODgyYjJjZGEgCXN1Yi5zCXIxLCByMiwgcjMJLT4Jc3ViLnMJcjUwLCByNTEsIDB4MWEKLSA2Yjg6CTg4MmIyY2Y3IDhhYjFiZWVmIAlzdWIubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDZjMDoJMDgzMDEwODMgODgzYjJjZGEgCXN1YjJoLnMJcjEsIHIyLCByMwktPglzdWIyaC5zCXI1MCwgcjUxLCAweDFhCi0gNmM4Ogk4ODNiMmNmNyA4YWIxYmVlZiAJc3ViMmgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDZkMDoJMDg1MDEwODMgODg1YjJjZGEgCXN1YmIucwlyMSwgcjIsIHIzCS0+CXN1YmIucwlyNTAsIHI1MSwgMHgxYQotIDZkODoJODg1YjJjZjcgOGFiMWJlZWYgCXN1YmIubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDZlMDoJMDk4MDEwODMgODk4YjJjZGEgCXN1YmhsbGwucwlyMSwgcjIsIHIzCS0+CXN1YmhsbGwucwlyNTAsIHI1MSwgMHgxYQotIDZlODoJODk4YjJjZjcgOGFiMWJlZWYgCXN1YmhsbGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDZmMDoJMDk5MDEwODMgODk5YjJjZGEgCXN1YmhsbGgucwlyMSwgcjIsIHIzCS0+CXN1YmhsbGgucwlyNTAsIHI1MSwgMHgxYQotIDZmODoJODk5YjJjZjcgOGFiMWJlZWYgCXN1YmhsbGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDcwMDoJMDlhMDEwODMgODlhYjJjZGEgCXN1YmhsaGwucwlyMSwgcjIsIHIzCS0+CXN1YmhsaGwucwlyNTAsIHI1MSwgMHgxYQotIDcwODoJODlhYjJjZjcgOGFiMWJlZWYgCXN1YmhsaGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDcxMDoJMDliMDEwODMgODliYjJjZGEgCXN1YmhsaGgucwlyMSwgcjIsIHIzCS0+CXN1YmhsaGgucwlyNTAsIHI1MSwgMHgxYQotIDcxODoJODliYjJjZjcgOGFiMWJlZWYgCXN1YmhsaGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDcyMDoJMDljMDEwODMgODljYjJjZGEgCXN1YmhobGwucwlyMSwgcjIsIHIzCS0+CXN1YmhobGwucwlyNTAsIHI1MSwgMHgxYQotIDcyODoJODljYjJjZjcgOGFiMWJlZWYgCXN1YmhobGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDczMDoJMDlkMDEwODMgODlkYjJjZGEgCXN1YmhobGgucwlyMSwgcjIsIHIzCS0+CXN1YmhobGgucwlyNTAsIHI1MSwgMHgxYQotIDczODoJODlkYjJjZjcgOGFiMWJlZWYgCXN1YmhobGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDc0MDoJMDllMDEwODMgODllYjJjZGEgCXN1YmhoaGwucwlyMSwgcjIsIHIzCS0+CXN1YmhoaGwucwlyNTAsIHI1MSwgMHgxYQotIDc0ODoJODllYjJjZjcgOGFiMWJlZWYgCXN1YmhoaGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDc1MDoJMDlmMDEwODMgODlmYjJjZGEgCXN1YmhoaGgucwlyMSwgcjIsIHIzCS0+CXN1YmhoaGgucwlyNTAsIHI1MSwgMHgxYQotIDc1ODoJODlmYjJjZjcgOGFiMWJlZWYgCXN1YmhoaGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDc2MDoJMDA5MDAwMDEgMDBmMDAwMDAgCXRyYXAucwlyMQl8fAlub3AJCi0gNzY4OgkwMDk4MDAwYSAwMGYwMDAwMCAJdHJhcC5zCTB4YQl8fAlub3AJCi0gNzcwOgkwM2IwMTA4NCA4M2I4MTA4YSAJeG9yLnMJcjEsIHIyLCByNAktPgl4b3IucwlyMSwgcjIsIDB4YQotIDc3ODoJODNiODEwYjcgOGFiMWYwMGQgCXhvci5sCXIxLCByMiwgMHhkZWFkZjAwZAotIDc4MDoJMDJiMDEwODQgODJiODExMGEgCXhvcmZnCWYxLCBmMiwgcwktPgl4b3JmZwlmMSwgcywgMHhhCi0gNzg4OgkwMGYwMDAwMCA4MGYwMDAwMCAJbm9wCQktPglub3AJCi0gNzkwOgkwMGYwMDAwMCA4MGYwMDAwMCAJbm9wCQktPglub3AJCi0gNzk4OgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0gN2EwOgk4MGYwMDAwMCAwMGYwMDAwMCAJbm9wCQk8LQlub3AJCi0gN2E4OgkwMzkwMTA4MCAwMGYwMDAwMCAJbm90CXIxLCByMgl8fAlub3AJCi0gN2IwOgkwMzkwMjBjMCA4MGYwMDAwMCAJbm90CXIyLCByMwktPglub3AJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2luc3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvaW5zdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTY2MTFlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvaW5zdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTA0ICswLDAgQEAKLSMgdGVzdCBhbGwgaW5zdHJ1Y3Rpb25zCi0KLXN0YXJ0OgotCWFicwlyMjEscjQyCi0KLQlhZGQJcjEscjIscjMKLQlhZGQJcjUwLHI1MSwweDFhCi0JYWRkCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkMmgJcjEscjIscjMKLQlhZGQyaAlyNTAscjUxLDB4MWEKLQlhZGQyaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGMJcjEscjIscjMKLQlhZGRjCXI1MCxyNTEsMHgxYQotCWFkZGMJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGRobGxsCXIxLHIyLHIzCi0JYWRkaGxsbAlyNTAscjUxLDB4MWEKLQlhZGRobGxsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkaGxsaAlyMSxyMixyMwotCWFkZGhsbGgJcjUwLHI1MSwweDFhCi0JYWRkaGxsaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGhsaGwJcjEscjIscjMKLQlhZGRobGhsCXI1MCxyNTEsMHgxYQotCWFkZGhsaGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGRobGhoCXIxLHIyLHIzCi0JYWRkaGxoaAlyNTAscjUxLDB4MWEKLQlhZGRobGhoCXI1MCxyNTEsMHhkZWFkYmVlZgotCQkKLQlhZGRoaGxsCXIxLHIyLHIzCi0JYWRkaGhsbAlyNTAscjUxLDB4MWEKLQlhZGRoaGxsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkaGhsaAlyMSxyMixyMwotCWFkZGhobGgJcjUwLHI1MSwweDFhCi0JYWRkaGhsaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGhoaGwJcjEscjIscjMKLQlhZGRoaGhsCXI1MCxyNTEsMHgxYQotCWFkZGhoaGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGRoaGhoCXIxLHIyLHIzCi0JYWRkaGhoaAlyNTAscjUxLDB4MWEKLQlhZGRoaGhoCXI1MCxyNTEsMHhkZWFkYmVlZgotCQotCWFkZHMJcjEscjIscjMKLQlhZGRzCXI1MCxyNTEsMHgxYQotCWFkZHMJcjUwLHI1MSwweGRlYWRiZWVmCi0JCQotCWFkZHMyaAlyMSxyMixyMwotCWFkZHMyaAlyNTAscjUxLDB4MWEKLQlhZGRzMmgJcjUwLHI1MSwweGRlYWRiZWVmCi0JCQotCWFuZAlyMSxyMixyMwotCWFuZAlyNTAscjUxLDB4MWEKLQlhbmQJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhbmRmZwlmMCxmMSxmMgotCWFuZGZnCWYzLGY0LDUKLQkKLQlhdmcJcjEscjIscjMKLQlhdmcJcjQscjUsNgotCWF2ZwlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWF2ZzJoCXIxLHIyLHIzCi0JYXZnMmgJcjQscjUsNgotCWF2ZzJoCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYmNscglyMSxyMixyMwotCWJjbHIJcjQscjUsNgotCQotCWJub3QJcjEscjIscjMKLQlibm90CXI1LHI1MSw2Ci0JCQkKLQlicmEJcjQxCi0JYnJhCTB4NDAKLQlicmEJMHhmMDBkCi0KLQlicmF0bnoJcjQxLHI0MgotCWJyYXRueglyMSwweGYwMGQKLQlicmF0bnoJcjEsMHhkZWFkZjAwZAotCi0JYnJhdHpyCXI0MSxyNDIKLQlicmF0enIJcjEsMHhmMDBkCi0JYnJhdHpyCXIxLDB4ZGVhZGYwMGQKLQotCWJzZXQJcjEscjIscjMKLQlic2V0CXI1LHI1MSw2Ci0KLQlic3IJcjQxCi0JYnNyCTB4ZjAwZAotCWJzcgkweGRlYWRmMDBkCi0KLQlic3J0bnoJcjQxLHI0MgotCWJzcnRueglyMSwweGYwMGQKLQlic3J0bnoJcjEsMHhkZWFkZjAwZAotCi0JYnNydHpyCXI0MSxyNDIKLQlic3J0enIJcjEsMHhmMDBkCi0JYnNydHpyCXIxLDB4ZGVhZGYwMGQKLQotCWJ0c3QJZjEscjIscjMKLQlidHN0CWY1LHI1MSw2Ci0JCQkJCQkKLQljbXBlcQlmMCxyMyxyMQotCWNtcG5lCWYxLHIyMCxyMjEKLQljbXBndAlmMixyMzEscjMyCi0JY21wZ2UJZjMscjMscjQKLQljbXBsdAlmNCxyMyxyNAotCWNtcGxlCWY1LHIzLHI0Ci0JY21wcHMJZjYscjMscjQKLQljbXBuZwlmNyxyMyxyNAkJCQkKLQotCWNtcHVndAlmMixyMzEscjMyCi0JY21wdWdlCWYzLHIzLHI0Ci0JY21wdWx0CWY0LHIzLHI0Ci0JY21wdWxlCWY1LHIzLHI0Ci0JCQotCWRicmEJcjEscjggCi0JZGJyYQlyMSwweDEwMAotCWRicmEJcjEsMHhkZWFkZjAwZAotCi0JZGJyYWkJMHgxMCxyMzEKLQlkYnJhaQkweDEwLDB4MTAwCi0JZGJyYWkJMHgxMCwweGRlYWRmMDBkCi0KLQlkYnNyCXIxLHI4IHx8IG5vcAotCWRic3IJcjEsMHgxMDAgfHwgbm9wCi0JZGJzcglyMSwweGRlYWRmMDBkCi0KLQlkYnNyaQkweDIwLHIzMSB8fCBub3AKLQlkYnNyaQkweDIwLDB4MTAwIHx8IG5vcAotCWRic3JpCTB4MjAsMHhkZWFkZjAwZAotCi0JZGptcAlyMSxyMzIKLQlkam1wCXIxLDB4ZjAwZAotCWRqbXAJcjEsMHhkZWFkZjAwZAotCi0JZGptcGkJMHgzMCxyMzIKLQlkam1waQkweDMwLDB4ZjAwZAotCWRqbXBpCTB4MzAsMHhkZWFkZjAwZAotCi0JZGpzcglyMSxyMzIKLQlkanNyCXIxLDB4ZjAwZAotCWRqc3IJcjEsMHhkZWFkZjAwZAotCi0JZGpzcmkJMHgxMCxyMzIKLQlkanNyaQkweDIwLDB4ZjAwZAotCWRqc3JpCTB4NDAsMHhkZWFkZjAwZAotCQotCWptcAlyNDEKLQlqbXAJMHhmMDBkCi0Jam1wCTB4ZGVhZGYwMGQKLQotCWptcHRueglyNDEscjQyCi0Jam1wdG56CXIxLDB4ZjAwZAotCWptcHRueglyMSwweGRlYWRmMDBkCi0KLQlqbXB0enIJcjQxLHI0MgotCWptcHR6cglyMSwweGYwMGQKLQlqbXB0enIJcjEsMHhkZWFkZjAwZAotCi0Jam9pbmxsCXIxLHIyLHI0Ci0Jam9pbmxsCXIxLHIyLDB4ZgotCWpvaW5sbAlyMSxyMiwweGRlYWRmMDBkCQotCi0Jam9pbmxoCXIxLHIyLHI0Ci0Jam9pbmxoCXIxLHIyLDB4ZgotCWpvaW5saAlyMSxyMiwweGRlYWRmMDBkCQotCi0Jam9pbmhsCXIxLHIyLHI0Ci0Jam9pbmhsCXIxLHIyLDB4ZgotCWpvaW5obAlyMSxyMiwweGRlYWRmMDBkCQotCi0Jam9pbmhoCXIxLHIyLHI0Ci0Jam9pbmhoCXIxLHIyLDB4ZgotCWpvaW5oaAlyMSxyMiwweGRlYWRmMDBkCQotCi0JanNyCXI0MQotCWpzcgkweGYwMGQKLQlqc3IJMHhkZWFkZjAwZAotCi0JanNydG56CXI0MSxyNDIKLQlqc3J0bnoJcjEsMHhmMDBkCi0JanNydG56CXIxLDB4ZGVhZGYwMGQKLQotCWpzcnR6cglyNDEscjQyCi0JanNydHpyCXIxLDB4ZjAwZAotCWpzcnR6cglyMSwweGRlYWRmMDBkCi0JCQkJCQotCWxkMmgJcjYsQChyNyxyOCkKLQlsZDJoCXI2LEAocjcrLHI4KQotCWxkMmgJcjYsQChyNy0scjgpCi0JbGQyaAlyNixAKHI3LDB4MWEpCi0JbGQyaAlyNixAKHI3LDB4MTIzNCkKLQkKLQlsZDJ3CXI2LEAocjcscjgpCi0JbGQydwlyNixAKHI3KyxyOCkKLQlsZDJ3CXI2LEAocjctLHI4KQotCWxkMncJcjYsQChyNywweDFhKQotCWxkMncJcjYsQChyNywweDEyMzQpCi0JCi0JbGQ0YmgJcjYsQChyNyxyOCkKLQlsZDRiaAlyNixAKHI3KyxyOCkKLQlsZDRiaAlyNixAKHI3LSxyOCkKLQlsZDRiaAlyNixAKHI3LDB4MWEpCi0JbGQ0YmgJcjYsQChyNywweDEyMzQpCi0KLQlsZDRiaHUJcjYsQChyNyxyOCkKLQlsZDRiaHUJcjYsQChyNysscjgpCi0JbGQ0Ymh1CXI2LEAocjctLHI4KQotCWxkNGJodQlyNixAKHI3LDB4MWEpCi0JbGQ0Ymh1CXI2LEAocjcsMHgxMjM0KQotCi0JbGRiCXI2LEAocjcscjgpCi0JbGRiCXI2LEAocjcrLHI4KQotCWxkYglyNixAKHI3LSxyOCkKLQlsZGIJcjYsQChyNywweDFhKQotCWxkYglyNixAKHI3LDB4MTIzNCkKLQotCWxkYnUJcjYsQChyNyxyOCkKLQlsZGJ1CXI2LEAocjcrLHI4KQotCWxkYnUJcjYsQChyNy0scjgpCi0JbGRidQlyNixAKHI3LDB4MWEpCi0JbGRidQlyNixAKHI3LDB4MTIzNCkKLQotCWxkaAlyNixAKHI3LHI4KQotCWxkaAlyNixAKHI3KyxyOCkKLQlsZGgJcjYsQChyNy0scjgpCi0JbGRoCXI2LEAocjcsMHgxYSkKLQlsZGgJcjYsQChyNywweDEyMzQpCi0KLQlsZGhoCXI2LEAocjcscjgpCi0JbGRoaAlyNixAKHI3KyxyOCkKLQlsZGhoCXI2LEAocjctLHI4KQotCWxkaGgJcjYsQChyNywweDFhKQotCWxkaGgJcjYsQChyNywweDEyMzQpCi0KLQlsZGh1CXI2LEAocjcscjgpCi0JbGRodQlyNixAKHI3KyxyOCkKLQlsZGh1CXI2LEAocjctLHI4KQotCWxkaHUJcjYsQChyNywweDFhKQotCWxkaHUJcjYsQChyNywweDEyMzQpCi0KLQlsZHcJcjYsQChyNyxyOCkKLQlsZHcJcjYsQChyNysscjgpCi0JbGR3CXI2LEAocjctLHI4KQotCWxkdwlyNixAKHI3LDB4MWEpCi0JbGR3CXI2LEAocjcsMHgxMjM0KQotCQkJCQkJCQotCW1hYzAJcjEscjIscjQKLQltYWMwCXIxLHIyLDB4MWYKLQltYWMxCXIxLHIyLHI0Ci0JbWFjMQlyMSxyMiwweDFmCi0KLQltYWNzMAlyMSxyMixyNAotCW1hY3MwCXIxLHIyLDB4MWYKLQltYWNzMQlyMSxyMixyNAotCW1hY3MxCXIxLHIyLDB4MWYKLQotCW1vZGRlYwlyMSwweGEKLQotCW1vZGluYwlyMSwweGEKLQotCW1zdWIwCXIxLHIyLHI0Ci0JbXN1YjAJcjEscjIsMHgxZgotCW1zdWIxCXIxLHIyLHI0Ci0JbXN1YjEJcjEscjIsMHgxZgotCi0JbXVsCXIxLHIyLHI0Ci0JbXVsCXIxLHIyLDB4YQotCi0JbXN1YnMwCXIxLHIyLHI0Ci0JbXN1YnMwCXIxLHIyLDB4MWYKLQltc3ViczEJcjEscjIscjQKLQltc3ViczEJcjEscjIsMHgxZgotCi0JbXVsMmgJcjEscjIscjQKLQltdWwyaAlyMSxyMiwweGEKLQkKLQltdWxoeGxsCXIxLHIyLHI0Ci0JbXVsaHhsbAlyMSxyMiwweGEKLQotCW11bGh4bGgJcjEscjIscjQKLQltdWxoeGxoCXIxLHIyLDB4YQotCi0JbXVsaHhobAlyMSxyMixyNAotCW11bGh4aGwJcjEscjIsMHhhCi0KLQltdWxoeGhoCXIxLHIyLHI0Ci0JbXVsaHhoaAlyMSxyMiwweGEKLQotCW11bHgyaAlyOCxyMixyNAotCW11bHhzCWEwLHIxLHI0Ci0JCi0JbXVseAlhMCxyMSxyNAotCW11bHgJYTEscjIsMHhhCi0KLQltdmZhY2MJcjEsYTAscjQKLQltdmZhY2MJcjIsYTEsMHhhCi0KLQltdWx4MmgJcjgscjIsMHhhCi0JbXVseHMJYTEscjIsMHhhCi0JCQotCW12ZnN5cwlyMTAscGMKLQltdmZzeXMJcjEwLHJwdF9jCi0JbXZmc3lzCXIxMCxwc3cKLQltdmZzeXMJcjEwLHBzd2gKLQltdmZzeXMJcjEwLHBzd2wKLQltdmZzeXMJcjEwLGYwCi0JbXZmc3lzCXIxMCxTCi0KLQltdnRhY2MJYTEscjIscjQKLQotCW12dHN5cwlycHRfYywgcjEwCi0JbXZ0c3lzCXBzdywgcjEwCi0JbXZ0c3lzCXBzd2gsIHIxMAotCW12dHN5cwlwc3dsLCByMTAKLQltdnRzeXMJZjAsIHIxMAotCW12dHN5cwlmMywgcjEwCi0JbXZ0c3lzCVMsIHIxMAotCW12dHN5cwlWLCByMTAKLQltdnRzeXMJVkEsIHIxMAotCW12dHN5cwlDLCByMTAKLQotCW5vcAotCi0Jbm90CXIxLHIyCi0KLQlub3RmZwlmMSxmMgotCi0Jb3IJcjEscjIscjQKLQlvcglyMSxyMiwweDFhCi0Jb3IJcjEscjIsMHhkZWFkZjAwZAotCi0Jb3JmZwlmMSxmMixmNAotCW9yZmcJZjQsZjIsMHgxCi0JCi0JcmVpdAotCi0JcmVwZWF0CXIxLHIyCi0JcmVwZWF0CXI0LDB4ZGVhZAotCXJlcGVhdAlyNCwweGRlYWRmMDBkCi0KLQlyZXBlYXRpCTB4YSxyMQotCXJlcGVhdGkJMHhhLDB4MTAwMQotCi0Jbm9wIHx8IG5vcAotCQotCXJvdAlyMSxyMixyNAotCXJvdAlyMSxyMiwweGEKLQotCXJvdDJoCXIxLHIyLHI0Ci0Jcm90MmgJcjEscjIsMHhhCi0KLQlzYXQJcjEscjIscjQKLQlzYXQJcjEscjIsMHhhCi0KLQlzYXQyaAlyMSxyMixyNAotCXNhdDJoCXIxLHIyLDB4YQotCi0Jc2F0aGwJcjEscjIscjQKLQlzYXRobAlyMSxyMiwweGEKLQotCXNhdGhoCXIxLHIyLHI0Ci0Jc2F0aGgJcjEscjIsMHhhCi0JCQotCXNhdHoJcjEscjIscjQKLQlzYXR6CXIxLHIyLDB4YQotCi0Jc2F0ejJoCXIxLHIyLHI0Ci0Jc2F0ejJoCXIxLHIyLDB4YQotCQkJCi0Jc3JhCXIxLHIyLHI0Ci0Jc3JhCXIxLHIyLDB4YQotCi0Jc3JhMmgJcjEscjIscjQKLQlzcmEyaAlyMSxyMiwweGEKLQotCXNyYwlyMSxyMixyNAotCXNyYwlyMSxyMiwweGEKLQkKLQlzcmwJcjEscjIscjQKLQlzcmwJcjEscjIsMHhhCi0KLQlzcmwyaAlyMSxyMixyNAotCXNybDJoCXIxLHIyLDB4YQotCi0JCi0Jc3QyaAlyNixAKHI3LHI4KQotCXN0MmgJcjYsQChyNysscjgpCi0Jc3QyaAlyNixAKHI3LSxyOCkKLQlzdDJoCXI2LEAocjcsMHgxYSkKLQlzdDJoCXI2LEAocjcsMHgxMjM0KQotCQkKLQlzdDJ3CXI2LEAocjcscjgpCi0Jc3QydwlyNixAKHI3KyxyOCkKLQlzdDJ3CXI2LEAocjctLHI4KQotCXN0MncJcjYsQChyNywweDFhKQotCXN0MncJcjYsQChyNywweDEyMzQpCi0KLQlzdDRoYglyNixAKHI3LHI4KQotCXN0NGhiCXI2LEAocjcrLHI4KQotCXN0NGhiCXI2LEAocjctLHI4KQotCXN0NGhiCXI2LEAocjcsMHgxYSkKLQlzdDRoYglyNixAKHI3LDB4MTIzNCkKLQotCXN0YglyNixAKHI3LHI4KQotCXN0YglyNixAKHI3KyxyOCkKLQlzdGIJcjYsQChyNy0scjgpCi0Jc3RiCXI2LEAocjcsMHgxYSkKLQlzdGIJcjYsQChyNywweDEyMzQpCi0KLQlzdGgJcjYsQChyNyxyOCkKLQlzdGgJcjYsQChyNysscjgpCi0Jc3RoCXI2LEAocjctLHI4KQotCXN0aAlyNixAKHI3LDB4MWEpCi0Jc3RoCXI2LEAocjcsMHgxMjM0KQotCi0Jc3RoaAlyNixAKHI3LHI4KQotCXN0aGgJcjYsQChyNysscjgpCi0Jc3RoaAlyNixAKHI3LSxyOCkKLQlzdGhoCXI2LEAocjcsMHgxYSkKLQlzdGhoCXI2LEAocjcsMHgxMjM0KQotCi0Jc3R3CXI2LEAocjcscjgpCi0Jc3R3CXI2LEAocjcrLHI4KQotCXN0dwlyNixAKHI3LSxyOCkKLQlzdHcJcjYsQChyNywweDFhKQotCXN0dwlyNixAKHI3LDB4MTIzNCkKLQkJCQkJCQkJCi0Jc3ViCXIxLHIyLHIzCi0Jc3ViCXI1MCxyNTEsMHgxYQotCXN1YglyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YjJoCXIxLHIyLHIzCi0Jc3ViMmgJcjUwLHI1MSwweDFhCi0Jc3ViMmgJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJiCXIxLHIyLHIzCi0Jc3ViYglyNTAscjUxLDB4MWEKLQlzdWJiCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViaGxsbAlyMSxyMixyMwotCXN1YmhsbGwJcjUwLHI1MSwweDFhCi0Jc3ViaGxsbAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YmhsbGgJcjEscjIscjMKLQlzdWJobGxoCXI1MCxyNTEsMHgxYQotCXN1YmhsbGgJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJobGhsCXIxLHIyLHIzCi0Jc3ViaGxobAlyNTAscjUxLDB4MWEKLQlzdWJobGhsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViaGxoaAlyMSxyMixyMwotCXN1YmhsaGgJcjUwLHI1MSwweDFhCi0Jc3ViaGxoaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQkJCi0Jc3ViaGhsbAlyMSxyMixyMwotCXN1YmhobGwJcjUwLHI1MSwweDFhCi0Jc3ViaGhsbAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YmhobGgJcjEscjIscjMKLQlzdWJoaGxoCXI1MCxyNTEsMHgxYQotCXN1YmhobGgJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJoaGhsCXIxLHIyLHIzCi0Jc3ViaGhobAlyNTAscjUxLDB4MWEKLQlzdWJoaGhsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViaGhoaAlyMSxyMixyMwotCXN1YmhoaGgJcjUwLHI1MSwweDFhCi0Jc3ViaGhoaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQkKLQl0cmFwCXIxCi0JdHJhcAkweGEKLQotCXhvcglyMSxyMixyNAotCXhvcglyMSxyMiwweGEKLQl4b3IJcjEscjIsMHhkZWFkZjAwZAotCi0JeG9yZmcJZjEsZjIsZjQKLQl4b3JmZwlmMSxmNCwweGEKLQotIyBWTElXIHN5bnRheCB0ZXN0Ci0Jbm9wCi0Jbm9wCi0Jbm9wCS0+CW5vcAotCW5vcAl8fAlub3AKLQlub3AJPC0Jbm9wCi0KLSMgdHJ5IGNoYW5naW5nIHNlY3Rpb25zCi0Jbm90CXIxLHIyCi0JLnNlY3Rpb24gLmZvbwotCWFkZAlyMTAscjEyLDYKLQkudGV4dAotCW5vdAlyMixyMwotCW5vcAotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyOWY4MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLWRlYnVnLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jb2JqZHVtcDogLWxkcgotI25hbWU6IEQzMFYgZGVidWcgKC1nKSB0ZXN0Ci0jYXM6IC1nCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8X2FiYy0weDE4PjoKLS4qbGFiZWwtZGVidWcuczo0Ci0gICAwOgkxMDA4MDAwMyAwMGYwMDAwMCAJYnJhLnNcL3R4CTE4CVwoMTggPF9hYmM+XCkJXHxcfAlub3AJCi0uKmxhYmVsLWRlYnVnLnM6NQotICAgODoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotICAxMDoJMGUwMDAwMDQgMDBmMDAwMDAgCS5sb25nCTB4ZTAwMDAwNAl8fAlub3AJCi0KLTAwMDAwMDE4IDxfYWJjPjoKLS4qbGFiZWwtZGVidWcuczo4Ci0gIDE4OgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0uKmxhYmVsLWRlYnVnLnM6OQotICAyMDoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotLipsYWJlbC1kZWJ1Zy5zOjEwCi0gIDI4OgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0uKmxhYmVsLWRlYnVnLnM6MTEKLSAgMzA6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0MGFhNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLWRlYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIGxhYmVscyBzaG91bGQgYmUgYWxpZ25lZCBvbiA4LWJ5dGUgYm91bmRyaWVzCi0JCi0JLnRleHQKLQlicmEucy90eCBfYWJjICAgfHwgbm9wIAotCW5vcCAgICAgfHwgbm9wIAotCS53b3JkIDB4MGUwMDAwMDQKLV9hYmM6Ci0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2Y2ZjZGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgbGFiZWwgYWxpZ25tZW50IHRlc3QKLSNhczoKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDxfYWJjLTB4MTg+OgotICAgMDoJMTAwODAwMDMgMDBmMDAwMDAgCWJyYS5zL3R4CTE4CSgxOCA8X2FiYz4pCXx8CW5vcAkKLSAgIDg6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKLSAgMTA6CTBlMDAwMDA0IDAwZjAwMDAwIAkubG9uZwkweGUwMDAwMDQJfHwJbm9wCQotCi0wMDAwMDAxOCA8X2FiYz46Ci0gIDE4OgkwMGYwMDAwMCA4MGYwMDAwMCAJbm9wCQktPglub3AJCi0gIDIwOgkwMGYwMDAwMCA4MGYwMDAwMCAJbm9wCQktPglub3AJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NDBhYTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyBsYWJlbHMgc2hvdWxkIGJlIGFsaWduZWQgb24gOC1ieXRlIGJvdW5kcmllcwotCQotCS50ZXh0Ci0JYnJhLnMvdHggX2FiYyAgIHx8IG5vcCAKLQlub3AgICAgIHx8IG5vcCAKLQkud29yZCAweDBlMDAwMDA0Ci1fYWJjOgotCW5vcAotCW5vcAotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbXVsLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTBhNTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBEMzBWIGFsaWdubWVudCB0ZXN0Ci0jYXM6IC1XTwotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CThhMTA1MTg3IDBhMTAyMGM0IAltdWx4MmgJcjUsIHI2LCByNwk8LQltdWx4MmgJcjIsIHIzLCByNAotICAgODoJMDBmMDAwMDAgMGExMDgyNGEgCW5vcAkJfHwJbXVseDJoCXI4LCByOSwgcjEwCi0gIDEwOgkwMGYwMDAwMCAwYTEwYjMwZCAJbm9wCQl8fAltdWx4MmgJcjExLCByMTIsIHIxMwotICAxODoJOGExMTE0OTMgMGExMGUzZDAgCW11bHgyaAlyMTcsIHIxOCwgcjE5CTwtCW11bHgyaAlyMTQsIHIxNSwgcjE2Ci0gIDIwOgk4YTExNzYxOSAwYTExNDU1NiAJbXVseDJoCXIyMywgcjI0LCByMjUJPC0JbXVseDJoCXIyMCwgcjIxLCByMjIKLSAgMjg6CThiMDFkNzlmIDBhMTFhNmRjIAltdWwJcjI5LCByMzAsIHIzMQk8LQltdWx4MmgJcjI2LCByMjcsIHIyOAotICAzMDoJOGIwMDUxODcgMGIwMDIwYzQgCW11bAlyNSwgcjYsIHI3CTwtCW11bAlyMiwgcjMsIHI0Ci0gIDM4Ogk4YTEwYjMwZCAwYTEwODI0YSAJbXVseDJoCXIxMSwgcjEyLCByMTMJPC0JbXVseDJoCXI4LCByOSwgcjEwCi0gIDQwOgk4MGYwMDAwMCAwYjAwZTNkMCAJbm9wCQk8LQltdWwJcjE0LCByMTUsIHIxNgotICA0ODoJMDBmMDAwMDAgMGExMTE0OTMgCW5vcAkJfHwJbXVseDJoCXIxNywgcjE4LCByMTkKLSAgNTA6CThiMDE3NjE5IDBhMTE0NTU2IAltdWwJcjIzLCByMjQsIHIyNQk8LQltdWx4MmgJcjIwLCByMjEsIHIyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbXVsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNjc4NTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgIE9uZSBvZiB0aGUgcnVsZSBvbiByZXN0cmljdGVkIHNlcXVlbmNlIGlzIGNvbnNlY3V0aXZlIElVIGluc3RydWN0aW9uIAotIyAgICAgICBJVTogTVVMLCBNQUMsIE1BQ1MsIE1TVUIsIE1TVUJTICAoYSkgICAgCi0jICAgICAgIElVOiBNVUxIWHBwLCBNVUxYMkgsIE1VTDJIICAgICAgKGIpCi0jIFRoaXMgbWVhbnMgdGhhdCBpbnN0cnVjdGlvbnMgaW4gZ3JvdXAgKGEpIGFuZCBpbiAoYikgc2hvdWxkIG5vdCBiZSBleGVjdXRlZAotIyBpbiBJVSBpbiBjb25zZWN1dGl2ZSBjeWNsZXMgaW4gdGhlIG9yZGVyIChhKS0+KGIpLiBJdCBkb2VzIG5laXRoZXIgcHJvaGliaXQKLSMgZXhlY3V0aW9ucyBpbiB0aGUgcmV2ZXJzZSBvcmRlciAoYiktPiAoYSkgbm9yIGNvbnNlY3V0aXZlIGV4ZWN1dGlvbiBvZgotIyBncm91cCAoYSktPihhKSBvciAoYiktPihiKQotCi0JbXVseDJoIHI1LHI2LHI3CQk8LQltdWx4MmggcjIscjMscjQKLQlub3AJfHwJbXVseDJoIHI4LHI5LHIxMAotCW5vcAl8fAltdWx4MmggcjExLHIxMixyMTMgICAgICAgCi0JbXVseDJoIHIxNCxyMTUscjE2Ci0JbXVseDJoIHIxNyxyMTgscjE5ICAgICAgCi0JbXVseDJoIHIyMyxyMjQscjI1ICAgICA8LQltdWx4MmggcjIwLHIyMSxyMjIKLQltdWwgICAgcjI5LHIzMCxyMzEgICAgIDwtCW11bHgyaCByMjYscjI3LHIyOAotCW11bCAgICByNSwgcjYsIHI3ICAgICAgPC0JbXVsIHIyLCByMywgcjQKLQltdWx4MmggcjExLCByMTIsIHIxMyAgIDwtCW11bHgyaCByOCwgcjksIHIxMAotCW11bHgyaCByMTcsIHIxOCwgcjE5ICAgPC0JbXVsIHIxNCwgcjE1LCByMTYKLQltdWwgICAgcjIzLCByMjQsIHIyNSAgIDwtCW11bHgyaCByMjAsIHIyMSwgcjIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9vcHQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiZmE5Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5kCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgb3B0aW1pemF0aW9uIHRlc3QKLSNhczogLU8KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDxzdGFydD46Ci0gICAwOgkwODgwMTA4MCAwODgwMzEwMCAJYWJzCXIxLCByMgl8fAlhYnMJcjMsIHI0Ci0gICA4OgkwMjkwMDEwMCAwMjkwMTA4MCAJbm90ZmcJZjAsIHMJfHwJbm90ZmcJZjEsIGYyCi0gIDEwOgkwODgwMTA4MCAwMjkwMTA4MCAJYWJzCXIxLCByMgl8fAlub3RmZwlmMSwgZjIKLSAgMTg6CTA4MDAxMDgzIDgyOTA3MDAwIAlhZGQucwlyMSwgcjIsIHIzCS0+CW5vdGZnCWMsIGYwCi0gIDIwOgkwODAwMTA4MyA4MjkwMDFjMCAJYWRkLnMJcjEsIHIyLCByMwktPglub3RmZwlmMCwgYwotICAyODoJMDAwODAwMDAgMDBmMDAwMDAgCWJyYS5zCTAJXCgyOCA8c3RhcnRcKzB4Mjg+XCkJfHwJbm9wCQotICAzMDoJMDg4MDEwODAgODg4MDEwODAgCWFicwlyMSwgcjIJLT4JYWJzCXIxLCByMgotICAzODoJMDAwODAwMDAgMDBmMDAwMDAgCWJyYS5zCTAJXCgzOCA8c3RhcnRcKzB4Mzg+XCkJfHwJbm9wCQotICA0MDoJMDAyYmZmZmYgMDBmMDAwMDAgCWJzci5zCS04CVwoMzggPHN0YXJ0XCsweDM4PlwpCXx8CW5vcAkKLSAgNDg6CTA4ODAxMDgwIDg4ODAxMDgwIAlhYnMJcjEsIHIyCS0+CWFicwlyMSwgcjIKLSAgNTA6CTAwMjgwMDAwIDA4ODAxMDgwIAlic3IucwkwCVwoNTAgPHN0YXJ0XCsweDUwPlwpCXx8CWFicwlyMSwgcjIKLSAgNTg6CTA0MDAxMDgzIDg1MDA3MjA5IAlsZGIucwlyMSwgQFwocjIsIHIzXCkJLT4Jc3RiLnMJcjcsIEBcKHI4LCByOVwpCi0gIDYwOgkwNTAwNzIwOSA4NDAwMTA4MyAJc3RiLnMJcjcsIEBcKHI4LCByOVwpCS0+CWxkYi5zCXIxLCBAXChyMiwgcjNcKQotICA2ODoJMDQwMDcyMDkgODQwMDEwODMgCWxkYi5zCXI3LCBAXChyOCwgcjlcKQktPglsZGIucwlyMSwgQFwocjIsIHIzXCkKLSAgNzA6CTA1MDA3MjA5IDg1MDAxMDgzIAlzdGIucwlyNywgQFwocjgsIHI5XCkJLT4Jc3RiLnMJcjEsIEBcKHIyLCByM1wpCi0gIDc4OgkwODAwMzBjNiA4NTQ4MjBjMCAJYWRkLnMJcjMsIHIzLCByNgktPglzdHcucwlyMiwgQFwocjMsIDB4MFwpCi0gIDgwOgkwMmMyODEwNSA5MDE4MDAwMCAJY21wbGUucwlmMCwgcjQsIHI1CS0+CWptcC5zL3R4CTAgPHN0YXJ0PgotICA4ODoJMDJjMjgxMDUgYTAxODAwMDAgCWNtcGxlLnMJZjAsIHI0LCByNQktPglqbXAucy9meAkwIDxzdGFydD4KLSAgOTA6CTMwMTgwMDAwIDAyYzI4MTA1IAlqbXAucy94dAkwIDxzdGFydD4JfHwJY21wbGUucwlmMCwgcjQsIHI1Ci0gIDk4Ogk0MDE4MDAwMCAwMmMyODEwNSAJam1wLnMveGYJMCA8c3RhcnQ+CXx8CWNtcGxlLnMJZjAsIHI0LCByNQotICBhMDoJMDJjMjgxMDUgZDAxODAwMDAgCWNtcGxlLnMJZjAsIHI0LCByNQktPglqbXAucy90dAkwIDxzdGFydD4KLSAgYTg6CTAyYzI4MTA1IGUwMTgwMDAwIAljbXBsZS5zCWYwLCByNCwgcjUJLT4Jam1wLnMvdGYJMCA8c3RhcnQ+Ci0gIGIwOgkxMDE4MDAwMCAwMmMyOTEwNSAJam1wLnMvdHgJMCA8c3RhcnQ+CXx8CWNtcGxlLnMJZjEsIHI0LCByNQotICBiODoJMDJjMjkxMDUgYjAxODAwMDAgCWNtcGxlLnMJZjEsIHI0LCByNQktPglqbXAucy94dAkwIDxzdGFydD4KLSAgYzA6CTA4MDg0MDAxIDgyYzI4MTA1IAlhZGQucwlyNCwgcjAsIDB4MQktPgljbXBsZS5zCWYwLCByNCwgcjUKLSAgYzg6CTA4MDg0MDAxIDAyYzI4MGM1IAlhZGQucwlyNCwgcjAsIDB4MQl8fAljbXBsZS5zCWYwLCByMywgcjUKLSAgZDA6CTA0NjA0MDA2IDg4NjA1NGQ0IAlsZDJ3LnMJcjQsIEBcKHIwLCByNlwpCS0+CWFkZHMucwlyNSwgcjE5LCByMjAKLSAgZDg6CTA0NjA0MDA2IDg4NjAzMTU0IAlsZDJ3LnMJcjQsIEBcKHIwLCByNlwpCS0+CWFkZHMucwlyMywgcjUsIHIyMAotICBlMDoJMDQ2MDQwMDYgMDg2MDY0ZDQgCWxkMncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI2LCByMTksIHIyMAotICBlODoJMDQ2MDQwMDYgMDg2MDc0ZDQgCWxkMncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI3LCByMTksIHIyMAotICBmMDoJMDQ2MDQwMDYgMDg2MDcwMTQgCWxkMncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI3LCByMCwgcjIwCi0gIGY4OgkwNTYwNDAwNiAwODYwNTRkNCAJc3Qydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjUsIHIxOSwgcjIwCi0gMTAwOgkwNTYwNDAwNiAwODYwMzE1NCAJc3Qydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjMsIHI1LCByMjAKLSAxMDg6CTA1NjA0MDA2IDA4NjA2NGQ0IAlzdDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyNiwgcjE5LCByMjAKLSAxMTA6CTA1NjA0MDA2IDA4NjA3NGQ0IAlzdDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyNywgcjE5LCByMjAKLSAxMTg6CTA1NjA0MDA2IDA4NjA3MDE0IAlzdDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyNywgcjAsIHIyMAotIDEyMDoJMDU2MGEwYzQgODU2MjhhZWMgCXN0MncucwlyMTAsIEBcKHIzLCByNFwpCS0+CXN0MncucwlyNDAsIEBcKHI0MywgcjQ0XCkKLSAxMjg6CTA1NDAxMDgzIDg0NDI5YWFiIAlzdHcucwlyMSwgQFwocjIsIHIzXCkJLT4JbGR3LnMJcjQxLCBAXChyNDIsIHI0M1wpCi0gMTMwOgkwNDQwMTA4MyA4NDAyOWFhYiAJbGR3LnMJcjEsIEBcKHIyLCByM1wpCS0+CWxkYi5zCXI0MSwgQFwocjQyLCByNDNcKQotIDEzODoJMDQ0NDQxOGIgODg2ODkxODIgCWxkdy5zCXI0LCBAXChyNlwrLCByMTFcKQktPglhZGRzLnMJcjksIHI2LCAweDIKLSAxNDA6CTA0NGM0MThiIDA4Njg5MTgyIAlsZHcucwlyNCwgQFwocjYtLCByMTFcKQl8fAlhZGRzLnMJcjksIHI2LCAweDIKLSAxNDg6CTA1NGM0MThiIDg4Njg5MTgyIAlzdHcucwlyNCwgQFwocjYtLCByMTFcKQktPglhZGRzLnMJcjksIHI2LCAweDIKLSAxNTA6CTA0NDA0MThiIDA4Njg5MTgyIAlsZHcucwlyNCwgQFwocjYsIHIxMVwpCXx8CWFkZHMucwlyOSwgcjYsIDB4MgotIDE1ODoJMDQ0MDQxOGIgMDg2ODkxODIgCWxkdy5zCXI0LCBAXChyNiwgcjExXCkJfHwJYWRkcy5zCXI5LCByNiwgMHgyCi0gMTYwOgkwMDE4MDAwMCAwMGYwMDAwMCAJam1wLnMJMCA8c3RhcnQ+CXx8CW5vcAkKLSAxNjg6CTAwMzgwMDAwIDA4ODAxMDgwIAlqc3IucwkwIDxzdGFydD4JfHwJYWJzCXIxLCByMgotIDE3MDoJMDg4MDEwODAgMDBmMDAwMDAgCWFicwlyMSwgcjIJfHwJbm9wCQotIDE3ODoJMDAwODAwMDAgMDBmMDAwMDAgCWJyYS5zCTAJXCgxNzggPHN0YXJ0XCsweDE3OD5cKQl8fAlub3AJCi0gMTgwOgkwMDI4MDAwMCAwODgwMTA4MCAJYnNyLnMJMAlcKDE4MCA8c3RhcnRcKzB4MTgwPlwpCXx8CWFicwlyMSwgcjIKLSAxODg6CTA4ODAxMDgwIDAwZjAwMDAwIAlhYnMJcjEsIHIyCXx8CW5vcAkKLQotMDAwMDAxOTAgPGxhYmVsMT46Ci0gMTkwOgkwNTYwMjA4MyA4OTAwNDE0NiAJc3Qydy5zCXIyLCBAXChyMiwgcjNcKQktPglhZGRobGxsLnMJcjQsIHI1LCByNgotCi0wMDAwMDE5OCA8bGFiZWwyPjoKLSAxOTg6CTA1NTA4MjA5IDg5OTBhMmNjIAlzdDRoYi5zCXI4LCBAXChyOCwgcjlcKQktPglzdWJobGxoLnMJcjEwLCByMTEsIHIxMgotCi0wMDAwMDFhMCA8bGFiZWwzPjoKLSAxYTA6CTA0NjBlMzhmIDhhNjEwNDUyIAlsZDJ3LnMJcjE0LCBAXChyMTQsIHIxNVwpCS0+CW11bGh4aGwJcjE2LCByMTcsIHIxOAotCi0wMDAwMDFhOCA8bGFiZWw0PjoKLSAxYTg6CTA0NDEzNTE1IDhhMTE2NWQ4IAlsZHcucwlyMTksIEBcKHIyMCwgcjIxXCkJLT4JbXVseDJoCXIyMiwgcjIzLCByMjQKLQotMDAwMDAxYjAgPGxhYmVsNT46Ci0gMWIwOgkwNDIxOTY5YiA4YTAxYzc1ZSAJbGRoLnMJcjI1LCBAXChyMjYsIHIyN1wpCS0+CW11bDJoCXIyOCwgcjI5LCByMzAKLQotMDAwMDAxYjggPGxhYmVsNj46Ci0gMWI4Ogk4MGYwMDAwMCAwYjAwMTA4MyAJbm9wCQk8LQltdWwJcjEsIHIyLCByMwotIDFjMDoJMDgwMDcyMDkgMGE0MDQxNDYgCWFkZC5zCXI3LCByOCwgcjkJfHwJbXVsaHhsbAlyNCwgcjUsIHI2Ci0KLTAwMDAwMWM4IDxsYWJlbDc+OgotIDFjODoJMDQ0MDUxODAgMGIwMDIwYzQgCWxkdy5zCXI1LCBAXChyNiwgcjBcKQl8fAltdWwJcjIsIHIzLCByNAotIDFkMDoJODBmMDAwMDAgMGIwMDcyMDkgCW5vcAkJPC0JbXVsCXI3LCByOCwgcjkKLSAxZDg6CTA0NDBhMmMwIDAwZjAwMDAwIAlsZHcucwlyMTAsIEBcKHIxMSwgcjBcKQl8fAlub3AJCi0gMWUwOgk4MGYwMDAwMCAwYjAwYzM0ZSAJbm9wCQk8LQltdWwJcjEyLCByMTMsIHIxNAotIDFlODoJMDQ0MGY0MDAgMGI0NDIwYzQgCWxkdy5zCXIxNSwgQFwocjE2LCByMFwpCXx8CW1hYzEJcjIsIHIzLCByNAotIDFmMDoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotIDFmODoJMDQ0MDUxODAgMDBmMDAwMDAgCWxkdy5zCXI1LCBAXChyNiwgcjBcKQl8fAlub3AJCi0gMjAwOgk4MGYwMDAwMCAwYjQwNzIwOSAJbm9wCQk8LQltYWMwCXI3LCByOCwgcjkKLSAyMDg6CTA0NDBhMmMwIDg0NDBhMmMwIAlsZHcucwlyMTAsIEBcKHIxMSwgcjBcKQktPglsZHcucwlyMTAsIEBcKHIxMSwgcjBcKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9vcHQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvb3B0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzMzMDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9vcHQucworKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0jIEQzMFYgcGFyYWxsZWwgb3B0aW1pemF0aW9uIHRlc3QKLSMgYXNzZW1ibGUgd2l0aCAiLU8iCi0JCi0JLnRleHQKLXN0YXJ0OgkKLQlhYnMJcjEscjIKLQlhYnMJcjMscjQKLQotCW5vdGZnCWYwLGY0Ci0Jbm90ZmcJZjEsZjIKLQkJCi0JYWJzCXIxLHIyCi0Jbm90ZmcJZjEsZjIKLQotIyBib3RoIGNoYW5nZSBDIGZsYWcKLQlhZGQJcjEscjIscjMKLQlub3RmZwlDLGYwCi0KLSMgb25lIHVzZXMgYW5kIG9uZSBjaGFuZ2VzIEMgZmxhZwkKLQlhZGQJcjEscjIscjMKLQlub3RmZwlmMCxDCi0KLQlicmEJLgotCWFicwlyMSxyMgotCi0JYWJzCXIxLHIyCQotCWJyYQkuCi0KLQlic3IJLgotCWFicwlyMSxyMgotCQotCWFicwlyMSxyMgkKLQlhYnMJcjEscjIJCi0JYnNyCS4KLQkKLQlsZGIJcjEsQChyMixyMykKLQlzdGIJcjcsQChyOCxyOSkKLQotCXN0YglyNyxAKHI4LHI5KQkKLQlsZGIJcjEsQChyMixyMykKLQotCWxkYglyNyxAKHI4LHI5KQkKLQlsZGIJcjEsQChyMixyMykKLQotCXN0YglyNyxAKHI4LHI5KQkKLQlzdGIJcjEsQChyMixyMykKLQotCWFkZCAgICAgcjMsIHIzLCByNgotCXN0dyAgICAgcjIsIEAocjMsIDApCi0JCQkKLSMgc2hvdWxkIGJlIHNlcmlhbCBiZWNhdXNlIG9mIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgotICAgICAgICBjbXBsZSAgIGYwLHI0LHI1Ci0gICAgICAgIGptcC90eCAgMHgwCi0KLSAgICAgICAgY21wbGUgICBmMCxyNCxyNQotICAgICAgICBqbXAvZnggIDB4MAotCi0gICAgICAgIGNtcGxlICAgZjAscjQscjUKLSAgICAgICAgam1wL3h0ICAweDAKLQotICAgICAgICBjbXBsZSAgIGYwLHI0LHI1Ci0gICAgICAgIGptcC94ZiAgMHgwCi0KLSAgICAgICAgY21wbGUgICBmMCxyNCxyNQotICAgICAgICBqbXAvdHQgIDB4MAotCi0gICAgICAgIGNtcGxlICAgZjAscjQscjUKLSAgICAgICAgam1wL3RmICAweDAKLQkJCQkJCi0gICAgICAgIGNtcGxlICAgZjEscjQscjUKLSAgICAgICAgam1wL3R4ICAweDAKLQotICAgICAgICBjbXBsZSAgIGYxLHI0LHI1Ci0gICAgICAgIGptcC94dCAgMHgwCi0KLQkjIHNlcmlhbCBiZWNhdXNlIG9mIHRoZSByNCBkZXBlbmRlbmN5Ci0JYWRkCXI0LCByMCwgMQotCWNtcGxlCWYwLCByNCwgcjUKLQotCSMgcGFyYWxsZWwKLQlhZGQJcjQsIHIwLCAxCi0JY21wbGUJZjAsIHIzLCByNQotCi0JIyBzZXJpYWwgYmVjYXVzZSBsZDJ3IGxvYWRzIHI1Ci0JbGQydwlyNCxAKHIwLHI2KQotCWFkZHMJcjUscjE5LHIyMAotCi0JIyBzZXJpYWwgYmVjYXVzZSBsZDJ3IGxvYWRzIHI1Ci0JbGQydwlyNCxAKHIwLHI2KQotCWFkZHMJcjMscjUscjIwCi0KLQkjIHBhcmFsbGVsIGV2ZW4gdGhvdWdoIGxkMncgdXNlcyByNiBhbmQgYWRkcyBjaGFuZ2VzIGl0Ci0JbGQydwlyNCxAKHIwLHI2KQotCWFkZHMJcjYscjE5LHIyMAotCi0JIyBwYXJhbGxlbAotCWxkMncJcjQsQChyMCxyNikKLQlhZGRzCXI3LHIxOSxyMjAKLQotCSMgcGFyYWxsZWwKLQlsZDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNyxyMCxyMjAKLQotCSMgcGFyYWxsZWwgZXZlbiB0aG91Z2ggc3QydyB1c2VzIHI1IGFuZCBhZGRzIG1vZGlmaWVzIGl0Ci0Jc3QydwlyNCxAKHIwLHI2KQotCWFkZHMJcjUscjE5LHIyMAotCi0JIyBwYXJhbGxlbCwgYm90aCB1c2UgYnV0IGRvbid0IG1vZGlmeSByNQotCXN0MncJcjQsQChyMCxyNikKLQlhZGRzCXIzLHI1LHIyMAotCi0JIyBwYXJhbGxlbCBldmVuIHRob3VnaCBzdDJ3IHVzZXMgcjYgYW5kIGFkZHMgY2hhbmdlcyBpdAotCXN0MncJcjQsQChyMCxyNikKLQlhZGRzCXI2LHIxOSxyMjAKLQotCSMgcGFyYWxsZWwKLQlzdDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNyxyMTkscjIwCi0KLQkjIHBhcmFsbGVsCi0Jc3QydwlyNCxAKHIwLHI2KQotCWFkZHMJcjcscjAscjIwCi0JCQkJCQkKLSMgdGVzdCBtZW1vcnkgZGVwZW5kZW5jaWVzCi0KLQkjIGFsd2F5cyBzZXJpYWwgYmVjYXVzZSBvbmUgY291bGQgb3ZlcndyaXRlIHRoZSBvdGhlcgotCXN0MncJcjEwLEAocjMscjQpCi0Jc3QydwlyNDAsQChyNDMscjQ0KQotCi0JIyBhbHdheXMgc2VyaWFsCi0Jc3R3CXIxLEAocjIscjMpCi0JbGR3CXI0MSxAKHI0MixyNDMpCQkJCi0KLQkjIHJlYWRzIGNhbiBoYXBwZW4gaW4gcGFyYWxsZWwgYnV0IHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSAKLQkjIGRvZXNuJ3Qgc3VwcG9ydCBpdAotCWxkdwlyMSxAKHIyLHIzKQotCWxkYglyNDEsQChyNDIscjQzKQkJCQotCi0jIHRlc3QgcG9zdCBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBkZXBlbmRlbmNpZXMKLQotCSMgc2VyaWFsCi0JbGR3CXI0LEAocjYrLHIxMSkKLQlhZGRzCXI5LHI2LDIKLQotCSMgcGFyYWxsZWwsIG1vZGlmaWNhdGlvbiB0byByNiBoYXBwZW5zIGxhc3QKLQlhZGRzCXI5LHI2LDIJCi0JbGR3CXI0LEAocjYtLHIxMSkKLQotCSMgc2VyaWFsCi0Jc3R3CXI0LEAocjYtLHIxMSkKLQlhZGRzCXI5LHI2LDIKLQkKLQkjIHBhcmFsbGVsCi0JbGR3CXI0LEAocjYscjExKQotCWFkZHMJcjkscjYsMgotCi0JIyBwYXJhbGxlbAotCWFkZHMJcjkscjYsMgkKLQlsZHcJcjQsQChyNixyMTEpCi0JCi0jIGlmIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpcyBhIGptcCwgZG9uJ3QgcGFyYWxsZWxpemUKLQlqbXAJMAotCWFicwlyMSxyMgkKLQotCWpzcgkwCi0JYWJzCXIxLHIyCQotCi0JLmFsaWduCTMKLQkKLQlicmEJMAotCWFicwlyMSxyMgkKLQkKLQlic3IJMAotCWFicwlyMSxyMgkKLQotIyBFeHBsaWNpdGx5IHByb2hpYml0ZWQgZnJvbSBwYXJhbGxlbCBleGVjdXRpb24uCi0jIFRoZSBsYWJlbHMgYXJlIGhlcmUgdG8gcHJldmVudCBpbnN0cnVjdGlvbiBwYWlycwotIyAgZnJvbSBiZWluZyBtZXJnZWQgd2l0aCBmb2xsb3dpbmcgcGFpcnMuCi0JCi1sYWJlbDE6CQotCXN0MncgICAgIHIyLCBAKHIyLCByMykKLQlhZGRobGxsICByNCwgcjUsIHI2Ci1sYWJlbDI6Ci0Jc3Q0aGIgICAgcjgsIEAocjgsIHI5KQotCXN1YmhsbGggIHIxMCwgcjExLCByMTIKLWxhYmVsMzoKLQlsZDJ3ICAgICByMTQsIEAocjE0LCByMTUpCi0JbXVsaHhobCAgcjE2LCByMTcsIHIxOAotbGFiZWw0OgotCWxkdyAgICAgIHIxOSwgQChyMjAsIHIyMSkKLQltdWx4MmggICByMjIsIHIyMywgcjI0Ci1sYWJlbDU6Ci0JbGRoICAgICAgcjI1LCBAKHIyNiwgcjI3KQotCW11bDJoICAgIHIyOCwgcjI5LCByMzAKLQotIyBJbnNlcnRpb24gb2YgTk9QcyByZXF1aXJlZCB0byBwcmV2ZW50IHBpcGVsaW5lIGNsYXNoZXMuCi0KLWxhYmVsNjoKLQltdWwgcjEscjIscjMKLQltdWxoeGxsIHI0LHI1LHI2Ci0gICAgICAgIGFkZCByNywgcjgsIHI5Ci1sYWJlbDc6Ci0JCi0gICAgICAgIG11bCAgcjIscjMscjQKLSAgICAgICAgbGR3ICByNSwgQChyNixyMCkKLSAKLSAgICAgICAgbGR3ICByMTAsIEAocjExLCByMCkgPC0gbXVsIHI3LHI4LHI5Ci0JCi0gICAgICAgIG11bCAgcjEyLHIxMyxyMTQgLT4gbGR3IHIxNSwgQChyMTYsIHIwKQotCi0gICAgICAgIG1hYzEgcjIscjMscjQKLSAgICAgICAgbGR3ICByNSwgQChyNixyMCkKLSAKLSAgICAgICAgbGR3ICByMTAsIEAocjExLCByMCkgPC0gbWFjMCByNyxyOCxyOQotICAgICAgICBsZHcgIHIxMCwgQChyMTEsIHIwKSAKLQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlMjc4MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3JlbG9jLmQKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViByZWxvY2F0aW9uIHRlc3QKLSNhczoKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDxzdGFydD46Ci0gICAgICAgMDoJODgwODIwMDAgODAwMDAwMjggCWFkZC5sCXIyLCByMCwgMHgyOAotCQkJMDogUl9EMzBWXzMyCS50ZXh0Ci0gICAgICAgODoJODgwODQwMDAgODAwMDAwMDAgCWFkZC5sCXI0LCByMCwgMHgwCi0JCQk4OiBSX0QzMFZfMzIJLmRhdGEKLSAgICAgIDEwOgk4ODA4NDAwMCA4MDAwMDAwNiAJYWRkLmwJcjQsIHIwLCAweDYKLQkJCTEwOiBSX0QzMFZfMzIJLmRhdGEKLSAgICAgIDE4Ogk4ODA4NDAwMCA4MDAwMDAwMCAJYWRkLmwJcjQsIHIwLCAweDAKLQkJCTE4OiBSX0QzMFZfMzIJdW5rCi0gICAgICAyMDoJODAwODAwMDAgODAwMDAwMTggCWJyYS5sCTE4CVwoMzggPGNvbnQ+XCkKLQotMDAwMDAwMjggPGhlbGxvPjoKLSAgICAgIDI4Ogk0ODY1NmM2YyA2ZjIwNTc2ZiAJLmxvbmcJMHg0ODY1NmM2Ywl8fAkubG9uZwkweDZmMjA1NzZmCi0gICAgICAzMDoJNzI2YzY0MGEgMDBmMDAwMDAgCS5sb25nCTB4NzI2YzY0MGEJfHwJbm9wCQotCi0wMDAwMDAzOCA8Y29udD46Ci0gICAgICAzODoJODAxODAwMDAgODAwMDAwNDggCWptcC5sCTQ4IDxjb250Mj4KLQkJCTM4OiBSX0QzMFZfMzIJLnRleHQKLSAgICAgIDQwOgkwODgwMjBjMCAwMGYwMDAwMCAJYWJzCXIyLCByMwl8fAlub3AJCi0KLTAwMDAwMDQ4IDxjb250Mj46Ci0gICAgICA0ODoJMDAwYmZmZjcgMDBmMDAwMDAgCWJyYS5zCS00OAlcKDAgPHN0YXJ0PlwpCXx8CW5vcAkKLSAgICAgIDUwOgkwMDA4MDIwNSAwMGYwMDAwMCAJYnJhLnMJMTAyOAlcKDEwNzggPGV4aXQ+XCkJfHwJbm9wCQotICAgICAgNTg6CTAwMTgwMDAwIDAwZjAwMDAwIAlqbXAucwkwIDxzdGFydD4JfHwJbm9wCQotICAgICAgNjA6CTAwNmMxZmZiIDAwZjAwMDAwIAlic3J0bnoucwlyMSwgLTI4CVwoMzggPGNvbnQ+XCkJfHwJbm9wCQotICAgICAgNjg6CTAwNmMxZmZhIDAwZjAwMDAwIAlic3J0bnoucwlyMSwgLTMwCVwoMzggPGNvbnQ+XCkJfHwJbm9wCQotICAgICAgNzA6CTAwNGMxZmY5IDAwZjAwMDAwIAlicmF0bnoucwlyMSwgLTM4CVwoMzggPGNvbnQ+XCkJfHwJbm9wCQotICAgICAgNzg6CTAwNGMxZmY4IDAwZjAwMDAwIAlicmF0bnoucwlyMSwgLTQwCVwoMzggPGNvbnQ+XCkJfHwJbm9wCQotICAgICAgODA6CTAwNWMxMDA3IDAwZjAwMDAwIAlqbXB0bnoucwlyMSwgMzggPGNvbnQ+CXx8CW5vcAkKLQkJCTgwOiBSX0QzMFZfMTUJLnRleHQKLSAgICAgIDg4OgkwMDZjMTFmMSAwMGYwMDAwMCAJYnNydG56LnMJcjEsIGY4OAlcKDEwMTAgPGZvbz5cKQl8fAlub3AJCi0gICAgICA5MDoJMDA1YzEwMDAgMDBmMDAwMDAgCWptcHRuei5zCXIxLCAwIDxzdGFydD4JfHwJbm9wCQotCQkJOTA6IFJfRDMwVl8xNQl1bmsKLSAgICAgIDk4OgkwMDZjMTAwMCAwMGYwMDAwMCAJYnNydG56LnMJcjEsIDAJXCg5OCA8Y29udDJcKzB4NTA+XCkJfHwJbm9wCQotCQkJOTg6IFJfRDMwVl8xNV9QQ1JFTAl1bmsKLSAgICAgIGEwOgk4MDVjMTAwMCA4MDAwMDAwMCAJam1wdG56LmwJcjEsIDAgPHN0YXJ0PgotCQkJYTA6IFJfRDMwVl8zMgl1bmsKLSAgICAgIGE4Ogk4MDZjMTAwMCA4MDAwMDAwMCAJYnNydG56LmwJcjEsIDAJXChhOCA8Y29udDJcKzB4NjA+XCkKLQkJCWE4OiBSX0QzMFZfMzJfUENSRUwJdW5rCi0gICAgICBiMDoJMDAwODAxZWMgMDBmMDAwMDAgCWJyYS5zCWY2MAlcKDEwMTAgPGZvbz5cKQl8fAlub3AJCi0gICAgICBiODoJODAwODAwMDAgODAwMDBmNTggCWJyYS5sCWY1OAlcKDEwMTAgPGZvbz5cKQotICAgICAgYzA6CTAwMGJmZmU4IDAwZjAwMDAwIAlicmEucwktYzAJXCgwIDxzdGFydD5cKQl8fAlub3AJCi0gICAgICBjODoJODAxODAwMDAgODAwMDAwMDAgCWptcC5sCTAgPHN0YXJ0PgotCQkJYzg6IFJfRDMwVl8zMgkudGV4dAotICAgICAgZDA6CTgwMTgwMDAwIDgwMDAwMDAwIAlqbXAubAkwIDxzdGFydD4KLQkJCWQwOiBSX0QzMFZfMzIJLnRleHQKLSAgICAgIGQ4OgkwMDE4MDAwMCAwMGYwMDAwMCAJam1wLnMJMCA8c3RhcnQ+CXx8CW5vcAkKLQkJCWQ4OiBSX0QzMFZfMjEJLnRleHQKLSAgICAgIGUwOgkwMDE4MDIwMiAwMGYwMDAwMCAJam1wLnMJMTAxMCA8Zm9vPgl8fAlub3AJCi0JCQllMDogUl9EMzBWXzIxCS50ZXh0Ci0gICAgICBlODoJMDAwYmZmZTMgMDBmMDAwMDAgCWJyYS5zCS1lOAlcKDAgPHN0YXJ0PlwpCXx8CW5vcAkKLSAgICAgIGYwOgk4MDA4MDAwMCA4MDAwMDAwMCAJYnJhLmwJMAlcKGYwIDxjb250MlwrMHhhOD5cKQotCQkJZjA6IFJfRDMwVl8zMl9QQ1JFTAl1bmtub3duCi0gICAgICBmODoJODAxODAwMDAgODAwMDAwMDAgCWptcC5sCTAgPHN0YXJ0PgotCQkJZjg6IFJfRDMwVl8zMgl1bmtub3duCi0gICAgIDEwMDoJMDAxODAwMDAgMDBmMDAwMDAgCWptcC5zCTAgPHN0YXJ0Pgl8fAlub3AJCi0JCQkxMDA6IFJfRDMwVl8yMQl1bmtub3duCi0gICAgIDEwODoJMDAwODAwMDAgMDBmMDAwMDAgCWJyYS5zCTAJXCgxMDggPGNvbnQyXCsweGMwPlwpCXx8CW5vcAkKLQkJCTEwODogUl9EMzBWXzIxX1BDUkVMCXVua25vd24KLQkuLi4KLQotMDAwMDEwMTAgPGZvbz46Ci0gICAgMTAxMDoJMDgwMDEwMDAgMDBmMDAwMDAgCWFkZC5zCXIxLCByMCwgcjAJfHwJbm9wCQotICAgIDEwMTg6CTg0NmJjMDAwIDgwMDAxMDcwIAlsZDJ3LmwJcjYwLCBAXChyMCwgMHgxMDcwXCkKLQkJCTEwMTg6IFJfRDMwVl8zMgkudGV4dAotICAgIDEwMjA6CTA4MDNlMDAwIDgwMjgwMDBiIAlhZGQucwlyNjIsIHIwLCByMAktPglic3Iucwk1OAlcKDEwNzggPGV4aXQ+XCkKLSAgICAxMDI4OgkwMDJiZmZmZCAwMGYwMDAwMCAJYnNyLnMJLTE4CVwoMTAxMCA8Zm9vPlwpCXx8CW5vcAkKLSAgICAxMDMwOgkwMDBiZmUwMyAwMGYwMDAwMCAJYnJhLnMJLWZlOAlcKDQ4IDxjb250Mj5cKQl8fAlub3AJCi0gICAgMTAzODoJMDAwYmZlMDIgMDBmMDAwMDAgCWJyYS5zCS1mZjAJXCg0OCA8Y29udDI+XCkJfHwJbm9wCQotICAgIDEwNDA6CTAwMjgwMDA3IDAwZjAwMDAwIAlic3IucwkzOAlcKDEwNzggPGV4aXQ+XCkJfHwJbm9wCQotICAgIDEwNDg6CTAwMTgwMjBmIDAwZjAwMDAwIAlqbXAucwkxMDc4IDxleGl0Pgl8fAlub3AJCi0JCQkxMDQ4OiBSX0QzMFZfMjEJLnRleHQKLSAgICAxMDUwOgkwMDE4MDIwZiAwMGYwMDAwMCAJam1wLnMJMTA3OCA8ZXhpdD4JfHwJbm9wCQotCQkJMTA1MDogUl9EMzBWXzIxCS50ZXh0Ci0gICAgMTA1ODoJMDAxODAyMGYgMDBmMDAwMDAgCWptcC5zCTEwNzggPGV4aXQ+CXx8CW5vcAkKLQkJCTEwNTg6IFJfRDMwVl8yMQkudGV4dAotICAgIDEwNjA6CTgwMjgwMDAwIDgwMDAwMDE4IAlic3IubAkxOAlcKDEwNzggPGV4aXQ+XCkKLSAgICAxMDY4Ogk4MDE4MDAwMCA4MDAwMTA3OCAJam1wLmwJMTA3OCA8ZXhpdD4KLQkJCTEwNjg6IFJfRDMwVl8zMgkudGV4dAotCi0wMDAwMTA3MCA8bG9uZ3plcm8+OgotCS4uLgotCi0wMDAwMTA3OCA8ZXhpdD46Ci0gICAgMTA3ODoJMDAxMDAwM2UgMDBmMDAwMDAgCWptcC5zCXI2Mgl8fAlub3AJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3JlbG9jLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3JlbG9jLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOTliZjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9yZWxvYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotIyBEMzBWIHJlbG9jYXRpb24gdGVzdAotCQotCS50ZXh0Ci1zdGFydDoKLQlhZGQJcjIsIHIwLCBoZWxsbwotCWFkZAlyNCwgcjAsIGJhcgotCWFkZAlyNCwgcjAsIGJhcjIKLQlhZGQJcjQsIHIwLCB1bmsJCi0JYnJhCWNvbnQKLWhlbGxvOgkuYXNjaWkgIkhlbGxvIFdvcmxkXG4iCi0JLmFsaWduIDMKLWNvbnQ6CWptcAljb250MgotCWFicwlyMixyMwotY29udDI6Ci0JYnJhCXN0YXJ0CXx8CW5vcAotCWJyYS5zCWV4aXQKLQlqbXAJMAl8fAlub3AKLQlic3J0bnoucwlyMSxjb250Ci0JYnNydG56CXIxLGNvbnQJCi0JYnJhdG56LnMJcjEsY29udAotCWJyYXRueglyMSxjb250Ci0Jam1wdG56LnMJcjEsY29udAkJCi0JYnNydG56LnMJcjEsIGZvbwotCWptcHRuei5zCXIxLCB1bmsJCi0JYnNydG56LnMJcjEsIHVuawotCWptcHRueglyMSwgdW5rCQotCWJzcnRueglyMSwgdW5rCi0JYnJhLnMJZm9vCi0JYnJhCWZvbwkKLQlicmEJc3RhcnQKLQlqbXAJc3RhcnQKLQlqbXAJc3RhcnQKLQlqbXAucwlzdGFydAotCWptcC5zCWZvbwotCWJyYQlzdGFydAotCWJyYQl1bmtub3duCi0Jam1wCXVua25vd24KLQlqbXAucwl1bmtub3duCQotCWJyYS5zCXVua25vd24KLQkKLQkuZGF0YQotYmFyOgkuYXNjaXoJIlhZWlpZIgotYmFyMjoJLmxvbmcJMHhkZWFkYmVlZgotCQotCS50ZXh0Ci0JLnNwYWNlIDB4RjAwLDAKLQotZm9vOgotCWFkZAlyMSxyMCxyMAotCWxkMncJcjYwLCBAKHIwLGxvbmd6ZXJvKQotCWFkZAlyNjIscjAscjAKLQlic3IucwlleGl0Ci0JYnNyLnMJZm9vCi0JYnJhLnMJY29udDIKLQlicmEucwljb250MgkJCQkKLQlic3IucwlleGl0CQotCWptcC5zCWV4aXQKLQlqbXAucwlleGl0Ci0Jam1wLnMJZXhpdAkJCi0JYnNyCWV4aXQKLQlqbXAJZXhpdAotCi1sb25nemVybzoKLQkucXVhZAkwCi0KLQkudGV4dAotZXhpdDoJCi0Jam1wCXI2MgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YTVhNjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwubAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjo2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo3OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo4OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo5OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi1HQVMgTElTVElORyAuKgotCi0KLSAgIDEgICAgICAgICAgICAgIAkjIHNlcmlhbC5zCi0gICAyICAgICAgICAgICAgICAJIwotICAgMyAgICAgICAgICAgICAgCSMgSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlcywgdGhlIHJpZ2h0LXN1Ymluc3RydWN0aW9ucwotICAgNCAgICAgICAgICAgICAgCSMgd2lsbCBuZXZlciBiZSBleGVjdXRlZC4gIEdBUyBzaG91bGQgZGV0ZWN0IHRoaXMuCi0gICA1ICAgICAgICAgICAgICAJCQotICAgNiBcP1w/XD9cPyAwMDAwMDBGMCAJCXRyYXAgcjIxIC0+IGFkZCByMiwgcjAsIHIwIDsgcmlnaHQgaW5zdHJ1Y3Rpb24gd2lsbCBuZXZlciBiZSBleGVjdXRlZC4KLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDYgICAgICAwMDAwMDBGMCAKLSAgIDYgICAgICAwMDAwMDBGMCAKLSAgIDYgICAgICAwMDAwMDA5MCAKLSAgIDYgICAgICAwMDE1MDBGMCAKLSAgIDcgXD9cP1w/XD8gMDgwMDIwMDAgCQlkYnQgICAgIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgICAgICAgOyBkaXR0bwotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgNyAgICAgIDAwRjAwMDAwIAotICAgNyAgICAgIDAwQjAwMDAwIAotICAgNyAgICAgIDAwRjAwMDAwIAotICAgOCBcP1w/XD9cPyAwODAwMjAwMCAJCXJ0ZCAgICAgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICAgICAgICA7IGRpdHRvCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA4ICAgICAgMDBBMDAwMDAgCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA5IFw/XD9cP1w/IDA4MDAyMDAwIAkJcmVpdCAgICAtPiBhZGQgcjIsIHIwLCByMCAgICAgICAgICAgICAgIDsgZGl0dG8KLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDkgICAgICAwMEYwMDAwMCAKLSAgIDkgICAgICAwMDgwMDAwMCAKLSAgIDkgICAgICAwMEYwMDAwMCAKLSAgMTAgXD9cP1w/XD8gMDgwMDIwMDAgCQltdnRzeXMgcHN3LCAgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgOyBPSwotICAxMCAgICAgIDAwRjAwMDAwIAotICAxMCAgICAgIDAwRTAwMDQwIAotICAxMCAgICAgIDg4MDAyMDAwIAotICAxMSBcP1w/XD9cPyAwMEUwMDA0MiAJCW12dHN5cyBwc3doLCByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgICA7IE9LCi0gIDExICAgICAgODgwMDIwMDAgCi0gIDEyIFw/XD9cP1w/IDAwRTAwMDQxIAkJbXZ0c3lzIHBzd2wsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgIDsgT0sKLSAgMTIgICAgICA4ODAwMjAwMCAKLSAgMTMgXD9cP1w/XD8gMDBFMDAwNDMgCQltdnRzeXMgZjAsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgOyBPSwotICAxMyAgICAgIDg4MDAyMDAwIAotICAxNCBcP1w/XD9cPyAwMEUwQTA0MCAJCW12dHN5cyBtb2RfcywgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICA7IE9LCi0gIDE0ICAgICAgODgwMDIwMDAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5NWQ2My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyBzZXJpYWwucwotIwotIyBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGVzLCB0aGUgcmlnaHQtc3ViaW5zdHJ1Y3Rpb25zCi0jIHdpbGwgbmV2ZXIgYmUgZXhlY3V0ZWQuICBHQVMgc2hvdWxkIGRldGVjdCB0aGlzLgotCQotCXRyYXAgcjIxIC0+IGFkZCByMiwgcjAsIHIwIDsgcmlnaHQgaW5zdHJ1Y3Rpb24gd2lsbCBuZXZlciBiZSBleGVjdXRlZC4KLQlkYnQgICAgIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgICAgICAgOyBkaXR0bwotCXJ0ZCAgICAgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICAgICAgICA7IGRpdHRvCi0JcmVpdCAgICAtPiBhZGQgcjIsIHIwLCByMCAgICAgICAgICAgICAgIDsgZGl0dG8KLQltdnRzeXMgcHN3LCAgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgOyBPSwotCW12dHN5cyBwc3doLCByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgICA7IE9LCi0JbXZ0c3lzIHBzd2wsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgIDsgT0sKLQltdnRzeXMgZjAsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgOyBPSwotCW12dHN5cyBtb2RfcywgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICA7IE9LCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDIubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMi5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGUwNGRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMi5sCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjo1OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo4OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo5OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxMTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTI6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjEzOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxNDogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTY6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjE3OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxODogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTk6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjIxOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyMjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MjM6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjI0OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyNjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6Mjc6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjI4OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyOTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotR0FTIExJU1RJTkcgLioKLQotCi0gICAxICAgICAgICAgICAgICAJIyBEMzBWIHNlcmlhbCBleGVjdXRpb24gdGVzdAotICAgMiAgICAgICAgICAgICAgCQkKLSAgIDMgICAgICAgICAgICAgIAkJLnRleHQKLSAgIDQgICAgICAgICAgICAgIAkJCi0gICA1IFw/XD9cP1w/IDAwMDAwMEYwIAkJYnJhIC0zIC0+IGFkZCByMyxyMCwwCTsgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgNSAgICAgIDAwMDAwMEYwIAotICAgNSAgICAgIDAwMDAwMEYwIAotICAgNSAgICAgIDAwMDAwMDBCIAotICAgNSAgICAgIEZGRkYwMEYwIAotICAgNiBcP1w/XD9cPyAwODA4MzAwMCAJCWJzciAtMyAtPiBhZGQgcjMscjAsMAk7IEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDYgICAgICAwMEYwMDAwMCAKLSAgIDYgICAgICAwMDJCRkZGRiAKLSAgIDYgICAgICAwMEYwMDAwMCAKLSAgIDcgICAgICAgICAgICAgIAkKLSAgIDggXD9cP1w/XD8gMDgwODMwMDAgCQlicmEvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgOCAgICAgIDAwRjAwMDAwIAotICAgOCAgICAgIDEwMEJGRkZGIAotICAgOCAgICAgIDAwRjAwMDAwIAotICAgOSBcP1w/XD9cPyAwODA4MzAwMCAJCWJzci90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA5ICAgICAgMDBGMDAwMDAgCi0gICA5ICAgICAgMTAyQkZGRkYgCi0gICA5ICAgICAgMDBGMDAwMDAgCi0gIDEwICAgICAgICAgICAgICAJCi0gIDExIFw/XD9cP1w/IDA4MDgzMDAwIAkJYnNyIC0zIC0+IGJzciAtMTAJOyAgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDExICAgICAgMDBGMDAwMDAgCi0gIDExICAgICAgMDAyQkZGRkYgCi0gIDExICAgICAgMDBGMDAwMDAgCi0gIDEyIFw/XD9cP1w/IDAwMkJGRkZFIAkJYnNyIC0zIC0+IGJzci94dCAtMTAgICAgOyAgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDEyICAgICAgMDBGMDAwMDAgCi0gIDEyICAgICAgMDAyQkZGRkYgCi0gIDEyICAgICAgMDBGMDAwMDAgCi0gIDEzIFw/XD9cP1w/IDMwMkJGRkZFIAkJYnNyL3R4IC0zIC0+IGJzciAtMTAgICAgOyAgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxMyAgICAgIDAwRjAwMDAwIAotICAxMyAgICAgIDEwMkJGRkZGIAotICAxMyAgICAgIDAwRjAwMDAwIAotICAxNCBcP1w/XD9cPyAwMDJCRkZGRSAJCWJzci90eCAtMyAtPiBic3IvZnggLTEwIDsgICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTQgICAgICAwMEYwMDAwMCAKLSAgMTQgICAgICAxMDJCRkZGRiAKLSAgMTQgICAgICAwMEYwMDAwMCAKLSAgMTUgICAgICAgICAgICAgIAkKLSAgMTYgXD9cP1w/XD8gMjAyQkZGRkUgCQlicmEgLTMgLT4gYnJhICAxMCAgICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxNiAgICAgIDAwRjAwMDAwIAotICAxNiAgICAgIDAwMEJGRkZGIAotICAxNiAgICAgIDAwRjAwMDAwIAotICAxNyBcP1w/XD9cPyAwMDA4MDAwMSAJCWJyYSAtMyAtPiBicmEvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDE3ICAgICAgMDBGMDAwMDAgCi0gIDE3ICAgICAgMDAwQkZGRkYgCi0MR0FTIExJU1RJTkcgLioKLQotCi0gIDE3ICAgICAgMDBGMDAwMDAgCi0gIDE4IFw/XD9cP1w/IDEwMDgwMDAxIAkJYnJhL3R4IC0zIC0+IGJyYSAxMCAgICAgOyAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDE4ICAgICAgMDBGMDAwMDAgCi0gIDE4ICAgICAgMTAwQkZGRkYgCi0gIDE4ICAgICAgMDBGMDAwMDAgCi0gIDE5IFw/XD9cP1w/IDAwMDgwMDAxIAkJYnJhL3R4IC0zIC0+IGJyYS9meCAxMCAgOyAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDE5ICAgICAgMDBGMDAwMDAgCi0gIDE5ICAgICAgMTAwQkZGRkYgCi0gIDE5ICAgICAgMDBGMDAwMDAgCi0gIDIwICAgICAgICAgICAgICAJCi0gIDIxIFw/XD9cP1w/IDIwMDgwMDAxIAkJYnNyIC0zIC0+IGJyYSAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjEgICAgICAwMEYwMDAwMCAKLSAgMjEgICAgICAwMDJCRkZGRiAKLSAgMjEgICAgICAwMEYwMDAwMCAKLSAgMjIgXD9cP1w/XD8gMDAwODAwMDEgCQlic3IgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyMiAgICAgIDAwRjAwMDAwIAotICAyMiAgICAgIDAwMkJGRkZGIAotICAyMiAgICAgIDAwRjAwMDAwIAotICAyMyBcP1w/XD9cPyAxMDA4MDAwMSAJCWJzci90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyMyAgICAgIDAwRjAwMDAwIAotICAyMyAgICAgIDEwMkJGRkZGIAotICAyMyAgICAgIDAwRjAwMDAwIAotICAyNCBcP1w/XD9cPyAwMDA4MDAwMSAJCWJzci90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyNCAgICAgIDAwRjAwMDAwIAotICAyNCAgICAgIDEwMkJGRkZGIAotICAyNCAgICAgIDAwRjAwMDAwIAotICAyNSAgICAgICAgICAgICAgCQotICAyNiBcP1w/XD9cPyAyMDA4MDAwMSAJCWJyYSAtMyAtPiBic3IgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDI2ICAgICAgMDBGMDAwMDAgCi0gIDI2ICAgICAgMDAwQkZGRkYgCi0gIDI2ICAgICAgMDBGMDAwMDAgCi0gIDI3IFw/XD9cP1w/IDAwMjgwMDAxIAkJYnJhIC0zIC0+IGJzci90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjcgICAgICAwMEYwMDAwMCAKLSAgMjcgICAgICAwMDBCRkZGRiAKLSAgMjcgICAgICAwMEYwMDAwMCAKLSAgMjggXD9cP1w/XD8gMTAyODAwMDEgCQlicmEvdHggLTMgLT4gYnNyIDEwICAgICA7ICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjggICAgICAwMEYwMDAwMCAKLSAgMjggICAgICAxMDBCRkZGRiAKLSAgMjggICAgICAwMEYwMDAwMCAKLSAgMjkgXD9cP1w/XD8gMDAyODAwMDEgCQlicmEvdHggLTMgLT4gYnNyL2Z4IDEwICA7ICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjkgICAgICAwMEYwMDAwMCAKLSAgMjkgICAgICAxMDBCRkZGRiAKLSAgMjkgICAgICAwMEYwMDAwMCAKLSAgMjkgICAgICAyMDI4MDAwMSAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTMxNTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIEQzMFYgc2VyaWFsIGV4ZWN1dGlvbiB0ZXN0Ci0JCi0JLnRleHQKLQkKLQlicmEgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi0JYnNyIC0zIC0+IGFkZCByMyxyMCwwCTsgSW52YWxpZAotCi0JYnJhL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKLQlic3IvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAotCi0JYnNyIC0zIC0+IGJzciAtMTAJOyAgICAgICBJbnZhbGlkCi0JYnNyIC0zIC0+IGJzci94dCAtMTAgICAgOyAgICAgICBJbnZhbGlkCi0JYnNyL3R4IC0zIC0+IGJzciAtMTAgICAgOyAgICAgICBWYWxpZAotCWJzci90eCAtMyAtPiBic3IvZnggLTEwIDsgICAgICAgVmFsaWQKLQotCWJyYSAtMyAtPiBicmEgIDEwICAgICAgIDsgICAgICBJbnZhbGlkCi0JYnJhIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLQlicmEvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKLQlicmEvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKLQotCWJzciAtMyAtPiBicmEgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCi0JYnNyIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLQlic3IvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKLQlic3IvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKLQotCWJyYSAtMyAtPiBic3IgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCi0JYnJhIC0zIC0+IGJzci90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLQlicmEvdHggLTMgLT4gYnNyIDEwICAgICA7ICAgICAgVmFsaWQKLQlicmEvdHggLTMgLT4gYnNyL2Z4IDEwICA7ICAgICAgVmFsaWQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMk8ubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMk8ubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDllYjA1Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDJPLmwKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0uKjogQXNzZW1ibGVyIG1lc3NhZ2VzOgotLio6NTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6NjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTE6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjEyOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxNjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTc6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjIxOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyMjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MjY6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjI3OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi1HQVMgTElTVElORyAuKgotCi0KLSAgIDEgICAgICAgICAgICAgIAkjIEQzMFYgc2VyaWFsIGV4ZWN1dGlvbiB0ZXN0Ci0gICAyICAgICAgICAgICAgICAJCQotICAgMyAgICAgICAgICAgICAgCQkudGV4dAotICAgNCAgICAgICAgICAgICAgCQkKLSAgIDUgXD9cP1w/XD8gMDAwMDAwRjAgCQlicmEgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA1ICAgICAgMDAwMDAwRjAgCi0gICA1ICAgICAgMDAwMDAwRjAgCi0gICA1ICAgICAgMDAwMDAwMEIgCi0gICA1ICAgICAgRkZGRjAwRjAgCi0gICA2IFw/XD9cP1w/IDA4MDgzMDAwIAkJYnNyIC0zIC0+IGFkZCByMyxyMCwwCTsgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgNiAgICAgIDAwRjAwMDAwIAotICAgNiAgICAgIDAwMkJGRkZGIAotICAgNiAgICAgIDAwRjAwMDAwIAotICAgNyAgICAgICAgICAgICAgCQotICAgOCBcP1w/XD9cPyAwODA4MzAwMCAJCWJyYS90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA4ICAgICAgMTAwQkZGRkYgCi0gICA4ICAgICAgODgwODMwMDAgCi0gICA5IFw/XD9cP1w/IDEwMkJGRkZGIAkJYnNyL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKLSAgIDkgICAgICA4ODA4MzAwMCAKLSAgMTAgICAgICAgICAgICAgIAkKLSAgMTEgXD9cP1w/XD8gMDAyQkZGRkYgCQlic3IgLTMgLT4gYnNyIC0xMAk7ICAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTEgICAgICAwMEYwMDAwMCAKLSAgMTIgXD9cP1w/XD8gMDAyQkZGRkUgCQlic3IgLTMgLT4gYnNyL3h0IC0xMCAgICA7ICAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTIgICAgICAwMEYwMDAwMCAKLSAgMTIgICAgICAwMDJCRkZGRiAKLSAgMTIgICAgICAwMEYwMDAwMCAKLSAgMTMgXD9cP1w/XD8gMzAyQkZGRkUgCQlic3IvdHggLTMgLT4gYnNyIC0xMCAgICA7ICAgICAgIFZhbGlkCi0gIDEzICAgICAgMDBGMDAwMDAgCi0gIDEzICAgICAgMTAyQkZGRkYgCi0gIDEzICAgICAgODAyQkZGRkUgCi0gIDE0IFw/XD9cP1w/IDEwMkJGRkZGIAkJYnNyL3R4IC0zIC0+IGJzci9meCAtMTAgOyAgICAgICBWYWxpZAotICAxNCAgICAgIEEwMkJGRkZFIAotICAxNSAgICAgICAgICAgICAgCQotICAxNiBcP1w/XD9cPyAwMDBCRkZGRiAJCWJyYSAtMyAtPiBicmEgIDEwICAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDE2ICAgICAgMDBGMDAwMDAgCi0gIDE3IFw/XD9cP1w/IDAwMDgwMDAxIAkJYnJhIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTcgICAgICAwMEYwMDAwMCAKLSAgMTcgICAgICAwMDBCRkZGRiAKLSAgMTcgICAgICAwMEYwMDAwMCAKLSAgMTggXD9cP1w/XD8gMTAwODAwMDEgCQlicmEvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKLSAgMTggICAgICAwMEYwMDAwMCAKLSAgMTggICAgICAxMDBCRkZGRiAKLSAgMTggICAgICA4MDA4MDAwMSAKLSAgMTkgXD9cP1w/XD8gMTAwQkZGRkYgCQlicmEvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKLSAgMTkgICAgICBBMDA4MDAwMSAKLSAgMjAgICAgICAgICAgICAgIAkKLSAgMjEgXD9cP1w/XD8gMDAyQkZGRkYgCQlic3IgLTMgLT4gYnJhIDEwICAgICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyMSAgICAgIDAwRjAwMDAwIAotICAyMiBcP1w/XD9cPyAwMDA4MDAwMSAJCWJzciAtMyAtPiBicmEvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi0MR0FTIExJU1RJTkcgLioKLQotCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDIyICAgICAgMDBGMDAwMDAgCi0gIDIyICAgICAgMDAyQkZGRkYgCi0gIDIyICAgICAgMDBGMDAwMDAgCi0gIDIzIFw/XD9cP1w/IDEwMDgwMDAxIAkJYnNyL3R4IC0zIC0+IGJyYSAxMCAgICAgOyAgICAgIFZhbGlkCi0gIDIzICAgICAgMDBGMDAwMDAgCi0gIDIzICAgICAgMTAyQkZGRkYgCi0gIDIzICAgICAgODAwODAwMDEgCi0gIDI0IFw/XD9cP1w/IDEwMkJGRkZGIAkJYnNyL3R4IC0zIC0+IGJyYS9meCAxMCAgOyAgICAgIFZhbGlkCi0gIDI0ICAgICAgQTAwODAwMDEgCi0gIDI1ICAgICAgICAgICAgICAJCi0gIDI2IFw/XD9cP1w/IDAwMEJGRkZGIAkJYnJhIC0zIC0+IGJzciAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjYgICAgICAwMEYwMDAwMCAKLSAgMjcgXD9cP1w/XD8gMDAyODAwMDEgCQlicmEgLTMgLT4gYnNyL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyNyAgICAgIDAwRjAwMDAwIAotICAyNyAgICAgIDAwMEJGRkZGIAotICAyNyAgICAgIDAwRjAwMDAwIAotICAyOCBcP1w/XD9cPyAxMDI4MDAwMSAJCWJyYS90eCAtMyAtPiBic3IgMTAgICAgIDsgICAgICBWYWxpZAotICAyOCAgICAgIDAwRjAwMDAwIAotICAyOCAgICAgIDEwMEJGRkZGIAotICAyOCAgICAgIDgwMjgwMDAxIAotICAyOSBcP1w/XD9cPyAxMDBCRkZGRiAJCWJyYS90eCAtMyAtPiBic3IvZnggMTAgIDsgICAgICBWYWxpZAotICAyOSAgICAgIEEwMjgwMDAxIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyTy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyTy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDUzMTU5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMk8ucworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgRDMwViBzZXJpYWwgZXhlY3V0aW9uIHRlc3QKLQkKLQkudGV4dAotCQotCWJyYSAtMyAtPiBhZGQgcjMscjAsMAk7IEludmFsaWQKLQlic3IgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi0KLQlicmEvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAotCWJzci90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi0KLQlic3IgLTMgLT4gYnNyIC0xMAk7ICAgICAgIEludmFsaWQKLQlic3IgLTMgLT4gYnNyL3h0IC0xMCAgICA7ICAgICAgIEludmFsaWQKLQlic3IvdHggLTMgLT4gYnNyIC0xMCAgICA7ICAgICAgIFZhbGlkCi0JYnNyL3R4IC0zIC0+IGJzci9meCAtMTAgOyAgICAgICBWYWxpZAotCi0JYnJhIC0zIC0+IGJyYSAgMTAgICAgICAgOyAgICAgIEludmFsaWQKLQlicmEgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJyYS90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotCWJyYS90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotCi0JYnNyIC0zIC0+IGJyYSAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLQlic3IgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJzci90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotCWJzci90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotCi0JYnJhIC0zIC0+IGJzciAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLQlicmEgLTMgLT4gYnNyL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJyYS90eCAtMyAtPiBic3IgMTAgICAgIDsgICAgICBWYWxpZAotCWJyYS90eCAtMyAtPiBic3IvZnggMTAgIDsgICAgICBWYWxpZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi93YXJuX29kZHJlZy5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi93YXJuX29kZHJlZy5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWZiNDNjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvd2Fybl9vZGRyZWcubAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjo1OiBXYXJuaW5nOiBPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLS4qOjY6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6NzogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0uKjo4OiBXYXJuaW5nOiBPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLS4qOjk6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6MTA6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6MTE6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6MTI6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotR0FTIExJU1RJTkcgLioKLQotCi0gICAxICAgICAgICAgICAgICAJIyBHQVMgc2hvdWxkIHByaW50IGEgd2FybmluZyAgd2hlbiBhbiBvZGQgcmVnaXN0ZXIgaXMgdXNlZCBhcyBhIHRhcmdldCAKLSAgIDIgICAgICAgICAgICAgIAkjIG9mIG11bHRpLXdvcmQgaW5zdHJ1Y3Rpb25zOiBsZDJ3LCBsZDRiaCwgbGQ0Ymh1LCBsZDJoLCBzdDJ3LCBzdDRoYiwgc3QyaCwgCi0gICAzICAgICAgICAgICAgICAJIyBhbmQgbXVseDJoCi0gICA0ICAgICAgICAgICAgICAJCi0gICA1IDAwMDAgMDU2ODEwMDAgCXN0MncgcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAgNSAgICAgIDAwRjAwMDAwIAotICAgNiAwMDA4IDA0NjgxMDAwIAlsZDJ3IHIxLCBAKHIwLCAwKQl8fAlub3AgCi0uKiAgV2FybmluZzpPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLSAgIDYgICAgICAwMEYwMDAwMCAKLSAgIDcgMDAxMCAwNDU4MTAwMCAJbGQ0YmggcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAgNyAgICAgIDAwRjAwMDAwIAotICAgOCAwMDE4IDA0RDgxMDAwIAlsZDRiaHUgcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAgOCAgICAgIDAwRjAwMDAwIAotICAgOSAwMDIwIDA0MzgxMDAwIAlsZDJoIHIxLCBAKHIwLCAwKQl8fAlub3AgCi0uKiAgV2FybmluZzpPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLSAgIDkgICAgICAwMEYwMDAwMCAKLSAgMTAgMDAyOCAwNTU4MTAwMCAJc3Q0aGIgcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAxMCAgICAgIDAwRjAwMDAwIAotICAxMSAwMDMwIDA1MzgxMDAwIAlzdDJoIHIxLCBAKHIwLCAwKQl8fAlub3AgCi0uKiAgV2FybmluZzpPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLSAgMTEgICAgICAwMEYwMDAwMCAKLSAgMTIgMDAzOCAwMEYwMDAwMCAJbm9wCXx8CW11bHgyaCByMSwgcjUsIHI2ICAgCi0uKiAgV2FybmluZzpPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLSAgMTIgICAgICAwQTEwMTE0NiAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvd2Fybl9vZGRyZWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvd2Fybl9vZGRyZWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5Zjc1MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3dhcm5fb2RkcmVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIEdBUyBzaG91bGQgcHJpbnQgYSB3YXJuaW5nICB3aGVuIGFuIG9kZCByZWdpc3RlciBpcyB1c2VkIGFzIGEgdGFyZ2V0IAotIyBvZiBtdWx0aS13b3JkIGluc3RydWN0aW9uczogbGQydywgbGQ0YmgsIGxkNGJodSwgbGQyaCwgc3Qydywgc3Q0aGIsIHN0MmgsIAotIyBhbmQgbXVseDJoCi0KLXN0MncgcjEsIEAocjAsIDApCXx8CW5vcCAKLWxkMncgcjEsIEAocjAsIDApCXx8CW5vcCAKLWxkNGJoIHIxLCBAKHIwLCAwKQl8fAlub3AgCi1sZDRiaHUgcjEsIEAocjAsIDApCXx8CW5vcCAKLWxkMmggcjEsIEAocjAsIDApCXx8CW5vcCAKLXN0NGhiIHIxLCBAKHIwLCAwKQl8fAlub3AgCi1zdDJoIHIxLCBAKHIwLCAwKQl8fAlub3AgCi1ub3AJfHwJbXVseDJoIHIxLCByNSwgcjYgICAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYWM3NjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLmQKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotI2FzOgotI29iamR1bXA6IC1kcgotI25hbWU6IGFsbGluc24KLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAgPGFkZD46Ci0gICAwOglhNiAwMSAgICAgICAJYWRkIHIwLHIxCi0gICAyOglhNCAwMiAgICAgICAJYWRkIDB4MCxyMgotCi0wKzAwMDQgPGFkZDI+OgotICAgNDoJYTUgZjMgICAgICAgCWFkZDIgLTEscjMKLQotMCswMDA2IDxhZGRjPjoKLSAgIDY6CWE3IDQ1ICAgICAgIAlhZGRjIHI0LHI1Ci0KLTArMDAwOCA8YWRkbj46Ci0gICA4OglhMiA2NyAgICAgICAJYWRkbiByNixyNwotICAgYToJYTAgZjggICAgICAgCWFkZG4gMHhmLHI4Ci0KLTArMDAwYyA8YWRkbjI+OgotICAgYzoJYTEgMDkgICAgICAgCWFkZG4yIC0xNixyOQotCi0wKzAwMGUgPHN1Yj46Ci0gICBlOglhYyBhYiAgICAgICAJc3ViIHIxMCxyMTEKLQotMCswMDEwIDxzdWJjPjoKLSAgMTA6CWFkIGNkICAgICAgIAlzdWJjIHIxMixyMTMKLQotMCswMDEyIDxzdWJuPjoKLSAgMTI6CWFlIGVmICAgICAgIAlzdWJuIHIxNCxyMTUKLQotMCswMDE0IDxjbXA+OgotICAxNDoJYWEgZGUgICAgICAgCWNtcCByMTMscjE0Ci0gIDE2OglhOCAxZiAgICAgICAJY21wIDB4MSxyMTUKLQotMCswMDE4IDxjbXAyPjoKLSAgMTg6CWE5IDEwICAgICAgIAljbXAyIC0xNSxyMAotCi0wKzAwMWEgPGFuZD46Ci0gIDFhOgk4MiAxMiAgICAgICAJYW5kIHIxLHIyCi0gIDFjOgk4NCAzNCAgICAgICAJYW5kIHIzLEByNAotCi0wKzAwMWUgPGFuZGg+OgotICAxZToJODUgNTYgICAgICAgCWFuZGggcjUsQHI2Ci0KLTArMDAyMCA8YW5kYj46Ci0gIDIwOgk4NiA3OCAgICAgICAJYW5kYiByNyxAcjgKLQotMCswMDIyIDxvcj46Ci0gIDIyOgk5MiA5YSAgICAgICAJb3IgcjkscjEwCi0gIDI0Ogk5NCBiYyAgICAgICAJb3IgcjExLEByMTIKLQotMCswMDI2IDxvcmg+OgotICAyNjoJOTUgZGUgICAgICAgCW9yaCByMTMsQHIxNAotCi0wKzAwMjggPG9yYj46Ci0gIDI4Ogk5NiBmZCAgICAgICAJb3JiIHIxNSxAcjEzCi0KLTArMDAyYSA8ZW9yPjoKLSAgMmE6CTlhIGVmICAgICAgIAllb3IgcjE0LHIxNQotICAyYzoJOWMgMDEgICAgICAgCWVvciByMCxAcjEKLQotMCswMDJlIDxlb3JoPjoKLSAgMmU6CTlkIDIzICAgICAgIAllb3JoIHIyLEByMwotCi0wKzAwMzAgPGVvcmI+OgotICAzMDoJOWUgNDUgICAgICAgCWVvcmIgcjQsQHI1Ci0KLTArMDAzMiA8YmFuZGw+OgotICAzMjoJODAgZjYgICAgICAgCWJhbmRsIDB4ZixAcjYKLQotMCswMDM0IDxuYWRoPjoKLSAgMzQ6CTgxIDc3ICAgICAgIAliYW5kaCAweDcsQHI3Ci0KLTArMDAzNiA8Ym9ybD46Ci0gIDM2Ogk5MCAzOCAgICAgICAJYm9ybCAweDMsQHI4Ci0KLTArMDAzOCA8Ym9yaD46Ci0gIDM4Ogk5MSBkOSAgICAgICAJYm9yaCAweGQsQHI5Ci0KLTArMDAzYSA8YmVvcmw+OgotICAzYToJOTggZmEgICAgICAgCWJlb3JsIDB4ZixAcjEwCi0KLTArMDAzYyA8YmVvcmg+OgotICAzYzoJOTkgMWIgICAgICAgCWJlb3JoIDB4MSxAcjExCi0KLTArMDAzZSA8YnRzdGw+OgotICAzZToJODggMGMgICAgICAgCWJ0c3RsIDB4MCxAcjEyCi0KLTArMDA0MCA8YnRzdGg+OgotICA0MDoJODkgOGQgICAgICAgCWJ0c3RoIDB4OCxAcjEzCi0KLTArMDA0MiA8bXVsPjoKLSAgNDI6CWFmIGVmICAgICAgIAltdWwgcjE0LHIxNQotCi0wKzAwNDQgPG11bHU+OgotICA0NDoJYWIgZGUgICAgICAgCW11bHUgcjEzLHIxNAotCi0wKzAwNDYgPG11bHVoPjoKLSAgNDY6CWJiIGYwICAgICAgIAltdWx1aCByMTUscjAKLQotMCswMDQ4IDxtdWxoPjoKLSAgNDg6CWJmIDEyICAgICAgIAltdWxoIHIxLHIyCi0KLTArMDA0YSA8ZGl2MHM+OgotICA0YToJOTcgNDMgICAgICAgCWRpdjBzIHIzCi0KLTArMDA0YyA8ZGl2MHU+OgotICA0YzoJOTcgNTQgICAgICAgCWRpdjB1IHI0Ci0KLTArMDA0ZSA8ZGl2MT46Ci0gIDRlOgk5NyA2NSAgICAgICAJZGl2MSByNQotCi0wKzAwNTAgPGRpdjI+OgotICA1MDoJOTcgNzYgICAgICAgCWRpdjIgcjYKLQotMCswMDUyIDxkaXYzPjoKLSAgNTI6CTlmIDYwICAgICAgIAlkaXYzCi0KLTArMDA1NCA8ZGl2NHM+OgotICA1NDoJOWYgNzAgICAgICAgCWRpdjRzCi0KLTArMDA1NiA8bHNsPjoKLSAgNTY6CWI2IDc4ICAgICAgIAlsc2wgcjcscjgKLSAgNTg6CWI0IDM5ICAgICAgIAlsc2wgMHgzLHI5Ci0KLTArMDA1YSA8bHNsMj46Ci0gIDVhOgliNSAwYSAgICAgICAJbHNsMiAweDAscjEwCi0KLTArMDA1YyA8bHNyPjoKLSAgNWM6CWIyIGJjICAgICAgIAlsc3IgcjExLHIxMgotICA1ZToJYjAgZmQgICAgICAgCWxzciAweGYscjEzCi0KLTArMDA2MCA8bHNyMj46Ci0gIDYwOgliMSBmZSAgICAgICAJbHNyMiAweGYscjE0Ci0KLTArMDA2MiA8YXNyPjoKLSAgNjI6CWJhIGZkICAgICAgIAlhc3IgcjE1LHIxMwotICA2NDoJYjggNmUgICAgICAgCWFzciAweDYscjE0Ci0KLTArMDA2NiA8YXNyMj46Ci0gIDY2OgliOSA3ZiAgICAgICAJYXNyMiAweDcscjE1Ci0KLTArMDA2OCA8bGRpXzg+OgotICA2ODoJY2YgZjIgICAgICAgCWxkaTo4IDB4ZmYscjIKLQotMCswMDZhIDxsZD46Ci0gIDZhOgkwNCAzNCAgICAgICAJbGQgQHIzLHI0Ci0gIDZjOgkwMCA1NiAgICAgICAJbGQgQFwocjEzLHI1XCkscjYKLSAgNmU6CTI3IGY3ICAgICAgIAlsZCBAXChyMTQsNTA4XCkscjcKLSAgNzA6CTAzIGY4ICAgICAgIAlsZCBAXChyMTUsMHgzY1wpLHI4Ci0gIDcyOgkwNyAwOSAgICAgICAJbGQgQHIxNVwrLHI5Ci0gIDc0OgkwNyA5MCAgICAgICAJbGQgQHIxNVwrLHBzCi0gIDc2OgkwNyA4MCAgICAgICAJbGQgQHIxNVwrLHRicgotICA3ODoJMDcgODEgICAgICAgCWxkIEByMTVcKyxycAotICA3YToJMDcgODIgICAgICAgCWxkIEByMTVcKyxzc3AKLQotMCswMDdjIDxsZHVoPjoKLSAgN2M6CTA1IGFiICAgICAgIAlsZHVoIEByMTAscjExCi0gIDdlOgkwMSBjZCAgICAgICAJbGR1aCBAXChyMTMscjEyXCkscjEzCi0gIDgwOgk0OCAwZiAgICAgICAJbGR1aCBAXChyMTQsLTI1NlwpLHIxNQotCi0wKzAwODIgPGxkdWI+OgotICA4MjoJMDYgZGUgICAgICAgCWxkdWIgQHIxMyxyMTQKLSAgODQ6CTAyIGYwICAgICAgIAlsZHViIEBcKHIxMyxyMTVcKSxyMAotICA4NjoJNjggMDEgICAgICAgCWxkdWIgQFwocjE0LC0xMjhcKSxyMQotCi0wKzAwODggPHN0PjoKLSAgODg6CTE0IDMyICAgICAgIAlzdCByMixAcjMKLSAgOGE6CTEwIDU0ICAgICAgIAlzdCByNCxAXChyMTMscjVcKQotICA4YzoJMzggMDYgICAgICAgCXN0IHI2LEBcKHIxNCwtNTEyXCkKLSAgOGU6CTEzIGY3ICAgICAgIAlzdCByNyxAXChyMTUsMHgzY1wpCi0gIDkwOgkxNyAwOCAgICAgICAJc3QgcjgsQC1yMTUKLSAgOTI6CTE3IDg0ICAgICAgIAlzdCBtZGgsQC1yMTUKLSAgOTQ6CTE3IDkwICAgICAgIAlzdCBwcyxALXIxNQotCi0wKzAwOTYgPHN0aD46Ci0gIDk2OgkxNSBhOSAgICAgICAJc3RoIHI5LEByMTAKLSAgOTg6CTExIGNiICAgICAgIAlzdGggcjExLEBcKHIxMyxyMTJcKQotICA5YToJNTQgMGQgICAgICAgCXN0aCByMTMsQFwocjE0LDEyOFwpCi0KLTArMDA5YyA8c3RiPjoKLSAgOWM6CTE2IGZlICAgICAgIAlzdGIgcjE0LEByMTUKLSAgOWU6CTEyIDEwICAgICAgIAlzdGIgcjAsQFwocjEzLHIxXCkKLSAgYTA6CTc4IDAyICAgICAgIAlzdGIgcjIsQFwocjE0LC0xMjhcKQotCi0wKzAwYTIgPG1vdj46Ci0gIGEyOgk4YiAzNCAgICAgICAJbW92IHIzLHI0Ci0gIGE0OgliNyA1NSAgICAgICAJbW92IG1kbCxyNQotICBhNjoJMTcgMTYgICAgICAgCW1vdiBwcyxyNgotICBhODoJYjMgMzcgICAgICAgCW1vdiByNyx1c3AKLSAgYWE6CTA3IDE4ICAgICAgIAltb3YgcjgscHMKLQotMCswMGFjIDxqbXA+OgotICBhYzoJOTcgMDkgICAgICAgCWptcCBAcjkKLQotMCswMGFlIDxyZXQ+OgotICBhZToJOTcgMjAgICAgICAgCXJldAotCi0wKzAwYjAgPGJyYT46Ci0gIGIwOgllMCBhNyAgICAgICAJYnJhIDAgXDxhZGRcPgotCi0wKzAwYjIgPGJubz46Ci0gIGIyOgllMSBhNiAgICAgICAJYm5vIDAgXDxhZGRcPgotCi0wKzAwYjQgPGJlcT46Ci0gIGI0OgllMiBhNSAgICAgICAJYmVxIDAgXDxhZGRcPgotCi0wKzAwYjYgPGJuZT46Ci0gIGI2OgllMyBhNCAgICAgICAJYm5lIDAgXDxhZGRcPgotCi0wKzAwYjggPGJjPjoKLSAgYjg6CWU0IGEzICAgICAgIAliYyAwIFw8YWRkXD4KLQotMCswMGJhIDxibmM+OgotICBiYToJZTUgYTIgICAgICAgCWJuYyAwIFw8YWRkXD4KLQotMCswMGJjIDxibj46Ci0gIGJjOgllNiBhMSAgICAgICAJYm4gMCBcPGFkZFw+Ci0KLTArMDBiZSA8YnA+OgotICBiZToJZTcgYTAgICAgICAgCWJwIDAgXDxhZGRcPgotCi0wKzAwYzAgPGJ2PjoKLSAgYzA6CWU4IDlmICAgICAgIAlidiAwIFw8YWRkXD4KLQotMCswMGMyIDxibnY+OgotICBjMjoJZTkgOWUgICAgICAgCWJudiAwIFw8YWRkXD4KLQotMCswMGM0IDxibHQ+OgotICBjNDoJZWEgOWQgICAgICAgCWJsdCAwIFw8YWRkXD4KLQotMCswMGM2IDxiZ2U+OgotICBjNjoJZWIgOWMgICAgICAgCWJnZSAwIFw8YWRkXD4KLQotMCswMGM4IDxibGU+OgotICBjODoJZWMgOWIgICAgICAgCWJsZSAwIFw8YWRkXD4KLQotMCswMGNhIDxiZ3Q+OgotICBjYToJZWQgOWEgICAgICAgCWJndCAwIFw8YWRkXD4KLQotMCswMGNjIDxibHM+OgotICBjYzoJZWUgOTkgICAgICAgCWJscyAwIFw8YWRkXD4KLQotMCswMGNlIDxiaGk+OgotICBjZToJZWYgOTggICAgICAgCWJoaSAwIFw8YWRkXD4KLQotMCswMGQwIDxqbXBfZD46Ci0gIGQwOgk5ZiAwYiAgICAgICAJam1wOmQgQHIxMQotICBkMjoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZDQgPHJldF9kPjoKLSAgZDQ6CTlmIDIwICAgICAgIAlyZXQ6ZAotICBkNjoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZDggPGJyYV9kPjoKLSAgZDg6CWYwIGZiICAgICAgIAlicmE6ZCBkMCBcPGptcF9kXD4KLSAgZGE6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGRjIDxibm9fZD46Ci0gIGRjOglmMSBmOSAgICAgICAJYm5vOmQgZDAgXDxqbXBfZFw+Ci0gIGRlOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDBlMCA8YmVxX2Q+OgotICBlMDoJZjIgZjcgICAgICAgCWJlcTpkIGQwIFw8am1wX2RcPgotICBlMjoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZTQgPGJuZV9kPjoKLSAgZTQ6CWYzIGY1ICAgICAgIAlibmU6ZCBkMCBcPGptcF9kXD4KLSAgZTY6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGU4IDxiY19kPjoKLSAgZTg6CWY0IGYzICAgICAgIAliYzpkIGQwIFw8am1wX2RcPgotICBlYToJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZWMgPGJuY19kPjoKLSAgZWM6CWY1IGYxICAgICAgIAlibmM6ZCBkMCBcPGptcF9kXD4KLSAgZWU6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGYwIDxibl9kPjoKLSAgZjA6CWY2IGVmICAgICAgIAlibjpkIGQwIFw8am1wX2RcPgotICBmMjoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZjQgPGJwX2Q+OgotICBmNDoJZjcgZWQgICAgICAgCWJwOmQgZDAgXDxqbXBfZFw+Ci0gIGY2Ogk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDBmOCA8YnZfZD46Ci0gIGY4OglmOCBlYiAgICAgICAJYnY6ZCBkMCBcPGptcF9kXD4KLSAgZmE6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGZjIDxibnZfZD46Ci0gIGZjOglmOSBlOSAgICAgICAJYm52OmQgZDAgXDxqbXBfZFw+Ci0gIGZlOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDEwMCA8Ymx0X2Q+OgotIDEwMDoJZmEgZTcgICAgICAgCWJsdDpkIGQwIFw8am1wX2RcPgotIDEwMjoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAxMDQgPGJnZV9kPjoKLSAxMDQ6CWZiIGU1ICAgICAgIAliZ2U6ZCBkMCBcPGptcF9kXD4KLSAxMDY6CTlmIGEwICAgICAgIAlub3AKLQotMCswMTA4IDxibGVfZD46Ci0gMTA4OglmYyBlMyAgICAgICAJYmxlOmQgZDAgXDxqbXBfZFw+Ci0gMTBhOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDEwYyA8Ymd0X2Q+OgotIDEwYzoJZmQgZTEgICAgICAgCWJndDpkIGQwIFw8am1wX2RcPgotIDEwZToJOWYgYTAgICAgICAgCW5vcAotCi0wKzAxMTAgPGJsc19kPjoKLSAxMTA6CWZlIGRmICAgICAgIAlibHM6ZCBkMCBcPGptcF9kXD4KLSAxMTI6CTlmIGEwICAgICAgIAlub3AKLQotMCswMTE0IDxiaGlfZD46Ci0gMTE0OglmZiBkZCAgICAgICAJYmhpOmQgZDAgXDxqbXBfZFw+Ci0gMTE2Ogk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDExOCA8bGRyZXM+OgotIDExODoJYmMgODIgICAgICAgCWxkcmVzIEByMlwrLDB4OAotCi0wKzAxMWEgPHN0cmVzPjoKLSAxMWE6CWJkIGYzICAgICAgIAlzdHJlcyAweGYsQHIzXCsKLQotMCswMTFjIDxub3A+OgotIDExYzoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAxMWUgPGFuZGNjcj46Ci0gMTFlOgk4MyBmZiAgICAgICAJYW5kY2NyIDB4ZmYKLQotMCswMTIwIDxvcmNjcj46Ci0gMTIwOgk5MyA3ZCAgICAgICAJb3JjY3IgMHg3ZAotCi0wKzAxMjIgPHN0aWxtPjoKLSAxMjI6CTg3IDYxICAgICAgIAlzdGlsbSAweDYxCi0KLTArMDEyNCA8YWRkc3A+OgotIDEyNDoJYTMgODAgICAgICAgCWFkZHNwIC01MTIKLQotMCswMTI2IDxleHRzYj46Ci0gMTI2Ogk5NyA4OSAgICAgICAJZXh0c2IgcjkKLQotMCswMTI4IDxleHR1Yj46Ci0gMTI4Ogk5NyA5YSAgICAgICAJZXh0dWIgcjEwCi0KLTArMDEyYSA8ZXh0c2g+OgotIDEyYToJOTcgYWIgICAgICAgCWV4dHNoIHIxMQotCi0wKzAxMmMgPGV4dHVoPjoKLSAxMmM6CTk3IGJjICAgICAgIAlleHR1aCByMTIKLQotMCswMTJlIDxlbnRlcj46Ci0gMTJlOgkwZiBmZiAgICAgICAJZW50ZXIgMHgzZmMKLQotMCswMTMwIDxsZWF2ZT46Ci0gMTMwOgk5ZiA5MCAgICAgICAJbGVhdmUKLQotMCswMTMyIDx4Y2hiPjoKLSAxMzI6CThhIGVmICAgICAgIAl4Y2hiIEByMTQscjE1Ci0KLTArMDEzNCA8bGRpXzMyPjoKLSAxMzQ6CTlmIDgwIDEyIDM0IAlsZGk6MzIgMHgxMjM0NTY3OCxyMAotIDEzODoJNTYgNzggCi0KLTArMDEzYSA8Y29wb3A+OgotIDEzYToJOWYgY2YgMDEgMzQgCWNvcG9wIDB4ZiwweDEsY3IzLGNyNAotIDEzZToJOWYgY2YgMDQgNTYgCWNvcG9wIDB4ZiwweDQsY3I1LGNyNgotIDE0MjoJOWYgY2YgZmYgNzAgCWNvcG9wIDB4ZiwweGZmLGNyNyxjcjAKLQotMCswMTQ2IDxjb3BsZD46Ci0gMTQ2Ogk5ZiBkMCAwMCA0MCAJY29wbGQgMHgwLDB4MCxyNCxjcjAKLQotMCswMTRhIDxjb3BzdD46Ci0gMTRhOgk5ZiBlNyAwMiAxNSAJY29wc3QgMHg3LDB4MixjcjEscjUKLQotMCswMTRlIDxjb3Bzdj46Ci0gMTRlOgk5ZiBmOCAwMyAyNiAJY29wc3YgMHg4LDB4MyxjcjIscjYKLQotMCswMTUyIDxsZG0wPjoKLSAxNTI6CThjIDhkICAgICAgIAlsZG0wIFwocjAscjIscjMscjdcKQotCi0wKzAxNTQgPGxkbTE+OgotIDE1NDoJOGQgODkgICAgICAgCWxkbTEgXChyOCxyMTEscjE1XCkKLQotMCswMTU2IDxzdG0wPjoKLSAxNTY6CThlIDMwICAgICAgIAlzdG0wIFwocjIscjNcKQotCi0wKzAxNTggPHN0bTE+OgotIDE1ODoJOGYgMDYgICAgICAgCXN0bTEgXChyMTMscjE0XCkKLQotMCswMTVhIDxjYWxsPjoKLSAxNWE6CWQ3IDUyICAgICAgIAljYWxsIDAgXDxhZGRcPgotIDE1YzoJOTcgMWEgICAgICAgCWNhbGwgQHIxMAotCi0wKzAxNWUgPGNhbGxfZD46Ci0gMTVlOglkZiA1MCAgICAgICAJY2FsbDpkIDAgXDxhZGRcPgotIDE2MDoJOWYgYTAgICAgICAgCW5vcAotIDE2MjoJOWYgMWMgICAgICAgCWNhbGw6ZCBAcjEyCi0gMTY0Ogk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDE2NiA8ZG1vdj46Ci0gMTY2OgkwOCAyMiAgICAgICAJZG1vdiBAMHg4OCxyMTMKLSAxNjg6CTE4IDE1ICAgICAgIAlkbW92IHIxMyxAMHg1NAotIDE2YToJMGMgMTEgICAgICAgCWRtb3YgQDB4NDQsQHIxM1wrCi0gMTZjOgkxYyAwMCAgICAgICAJZG1vdiBAcjEzXCssQDB4MAotIDE2ZToJMGIgMGIgICAgICAgCWRtb3YgQDB4MmMsQC1yMTUKLSAxNzA6CTFiIDA5ICAgICAgIAlkbW92IEByMTVcKyxAMHgyNAotCi0wKzAxNzIgPGRtb3ZoPjoKLSAxNzI6CTA5IDQ0ICAgICAgIAlkbW92aCBAMHg4OCxyMTMKLSAxNzQ6CTE5IDI5ICAgICAgIAlkbW92aCByMTMsQDB4NTIKLSAxNzY6CTBkIDFhICAgICAgIAlkbW92aCBAMHgzNCxAcjEzXCsKLSAxNzg6CTFkIDI5ICAgICAgIAlkbW92aCBAcjEzXCssQDB4NTIKLQotMCswMTdhIDxkbW92Yj46Ci0gMTdhOgkwYSA5MSAgICAgICAJZG1vdmIgQDB4OTEscjEzCi0gMTdjOgkxYSA1MyAgICAgICAJZG1vdmIgcjEzLEAweDUzCi0gMTdlOgkwZSA0NyAgICAgICAJZG1vdmIgQDB4NDcsQHIxM1wrCi0gMTgwOgkxZSAwMCAgICAgICAJZG1vdmIgQHIxM1wrLEAweDAKLQotMCswMTgyIDxsZGlfMjA+OgotIDE4MjoJOWIgZjEgZmYgZmYgCWxkaToyMCAweGZmZmZmLHIxCi0KLTArMDE4NiA8ZmluaXNoPjoKLSAxODY6CTlmIDgwIDAwIDAwIAlsZGk6MzIgMHg4MDAwLHIwCi0gMThhOgk4MCAwMCAKLSAxOGM6CWIzIDIwICAgICAgIAltb3YgcjAsc3NwCi0gMThlOgk5ZiA4MCAwMCAwMCAJbGRpOjMyIDB4MSxyMAotIDE5MjoJMDAgMDEgCi0gMTk0OgkxZiAwYSAgICAgICAJaW50IDB4YQotCi0wKzAxOTYgPGludGU+OgotIDE5NjoJOWYgMzAgICAgICAgCWludGUKLQotMCswMTk4IDxyZXRpPjoKLSAxOTg6CTk3IDMwICAgICAgIAlyZXRpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24uZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjZmUxOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24uZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIEZSMzAgYXNzZW1ibGVyIHRlc3RzdWl0ZS4KLQotaWYgW2lzdGFyZ2V0IGZyMzAqLSotKl0gewotICAgIHJ1bl9kdW1wX3Rlc3QgImFsbGluc24iCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODNkMjRhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5zCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLSAuZGF0YQotZm9vZGF0YTogLndvcmQgNDIKLQkgLnRleHQKLWZvb3RleHQ6Ci0JLmdsb2JhbCBhZGQKLWFkZDoKLQlhZGQgcjAsIHIxCi0JYWRkICMwLCByMgotCS5nbG9iYWwgYWRkMgotYWRkMjoKLQlhZGQyICMtMSwgcjMKLQkuZ2xvYmFsIGFkZGMKLWFkZGM6Ci0JYWRkYyByNCwgcjUKLQkuZ2xvYmFsIGFkZG4KLWFkZG46Ci0JYWRkbiByNiwgcjcKLQlhZGRuICMxNSwgcjgKLQkuZ2xvYmFsIGFkZG4yCi1hZGRuMjoKLQlhZGRuMiAjLTE2LCByOQotCS5nbG9iYWwgc3ViCi1zdWI6Ci0Jc3ViIHIxMCwgcjExCi0JLmdsb2JhbCBzdWJjCi1zdWJjOgotCXN1YmMgcjEyLCByMTMKLQkuZ2xvYmFsIHN1Ym4KLXN1Ym46Ci0Jc3VibiByMTQsIHIxNQotCS5nbG9iYWwgY21wCi1jbXA6Ci0JY21wIGFjLCBmcAotCWNtcCAjMSwgc3AKLQkuZ2xvYmFsIGNtcDIKLWNtcDI6Ci0JY21wMiAjLTE1LCByMAotCS5nbG9iYWwgYW5kCi1hbmQ6Ci0JYW5kIHIxLCByMgotCWFuZCByMywgQHI0Ci0JLmdsb2JhbCBhbmRoCi1hbmRoOgotCWFuZGggcjUsIEByNgotCS5nbG9iYWwgYW5kYgotYW5kYjoKLQlhbmRiIHI3LCBAcjgKLQkuZ2xvYmFsIG9yCi1vcjoKLQlvciByOSwgcjEwCi0Jb3IgcjExLCBAcjEyCi0JLmdsb2JhbCBvcmgKLW9yaDoKLQlvcmggcjEzLCBAcjE0Ci0JLmdsb2JhbCBvcmIKLW9yYjoKLQlvcmIgcjE1LCBAYWMKLQkuZ2xvYmFsIGVvcgotZW9yOgotCWVvciBmcCwgc3AKLQllb3IgcjAsIEByMQotCS5nbG9iYWwgZW9yaAotZW9yaDoKLQllb3JoIHIyLCBAcjMKLQkuZ2xvYmFsIGVvcmIKLWVvcmI6Ci0JZW9yYiByNCwgQHI1Ci0JLmdsb2JhbCBiYW5kbAotYmFuZGw6Ci0JYmFuZGwgIzE1LCBAcjYKLQkuZ2xvYmFsIGJhbmRoCi1uYWRoOgotCWJhbmRoICM3LCBAcjcKLQkuZ2xvYmFsIGJvcmwKLWJvcmw6Ci0JYm9ybCAjMywgQHI4Ci0JLmdsb2JhbCBib3JoCi1ib3JoOgotCWJvcmggIzEzLCBAcjkKLQkuZ2xvYmFsIGJlb3JsCi1iZW9ybDoKLQliZW9ybCAjMTUsIEByMTAKLQkuZ2xvYmFsIGJlb3JoCi1iZW9yaDoKLQliZW9yaCAjMSwgQHIxMQotCS5nbG9iYWwgYnRzdGwKLWJ0c3RsOgotCWJ0c3RsICMwLCBAcjEyCi0JLmdsb2JhbCBidHN0aAotYnRzdGg6Ci0JYnRzdGggIzgsIEByMTMKLQkuZ2xvYmFsIG11bAotbXVsOgotCW11bCByMTQsIHIxNQotCS5nbG9iYWwgbXVsdQotbXVsdToKLQltdWx1IGFjLCBmcAotCS5nbG9iYWwgbXVsdWgKLW11bHVoOgkKLQltdWx1aCBzcCwgcjAKLQkuZ2xvYmFsIG11bGgKLW11bGg6CQotCW11bGggcjEsIHIyCi0JLmdsb2JhbCBkaXYwcwotZGl2MHM6Ci0JZGl2MHMgcjMKLQkuZ2xvYmFsIGRpdjB1Ci1kaXYwdToKLQlkaXYwdSByNAotCS5nbG9iYWwgZGl2MQotZGl2MToKLQlkaXYxIHI1Ci0JLmdsb2JhbCBkaXYyCi1kaXYyOgotCWRpdjIgcjYKLQkuZ2xvYmFsIGRpdjMKLWRpdjM6Ci0JZGl2MwotCS5nbG9iYWwgZGl2NHMKLWRpdjRzOgotCWRpdjRzCi0JLmdsb2JhbCBsc2wKLWxzbDoKLQlsc2wgcjcsIHI4Ci0JbHNsICMzLCByOQotCS5nbG9iYWwgbHNsMgotbHNsMjoKLQlsc2wyICMwLCByMTAKLQkuZ2xvYmFsIGxzcgotbHNyOgotCWxzciByMTEsIHIxMgotCWxzciAjMTUsIHIxMwotCS5nbG9iYWwgbHNyMgotbHNyMjoKLQlsc3IyICMxNSwgcjE0Ci0JLmdsb2JhbCBhc3IKLWFzcjoKLQlhc3IgcjE1LCBhYwotCWFzciAjNiwgZnAKLQkuZ2xvYmFsIGFzcjIKLWFzcjI6Ci0JYXNyMiAjNywgc3AKLQkuZ2xvYmFsIGxkaV84Ci1sZGlfODoKLQlsZGk6OCAjMHhmZiwgcjIKLQkuZ2xvYmFsIGxkCi1sZDoKLQlsZCBAcjMsIHI0Ci0JbGQgQChSMTMsIHI1KSwgcjYKLQlsZCBAKFIxNCwgMHgxZmMpLCByNwotCWxkIEAoUjE1LCAweDNjKSwgcjgKLQlsZCBAcjE1KywgcjkKLQlsZCBAcjE1KywgcHMKLQlsZCBAUjE1KywgdGJyCi0JbGQgQHIxNSssIHJwCi0JbGQgQFIxNSssIHNzcAotCS5nbG9iYWwgbGR1aAotbGR1aDoKLQlsZHVoIEByMTAsIHIxMQotCWxkdWggQChyMTMsIHIxMiksIHIxMwotCWxkdWggQChyMTQsICMtMjU2KSwgcjE1Ci0JLmdsb2JhbCBsZHViCi1sZHViOgotCWxkdWIgQGFjLCBmcAotCWxkdWIgQChyMTMsIHNwKSwgcjAKLQlsZHViIEAocjE0LCAtMTI4KSwgcjEKLQkuZ2xvYmFsIHN0Ci1zdDoKLQlzdCByMiwgQHIzCi0Jc3QgcjQsIEAocjEzLCByNSkKLQlzdCByNiwgQChyMTQsIC01MTIpCi0Jc3QgcjcsIEAocjE1LCAweDNjKQotCXN0IHI4LCBAIC0gcjE1Ci0Jc3QgTURILCBALXIxNQotCXN0IFBTLCBAIC0gcjE1Ci0JLmdsb2JhbCBsc3RoCi1zdGg6Ci0Jc3RoIHI5LCBAcjEwCi0Jc3RoIHIxMSwgQChyMTMsIHIxMikKLQlzdGggcjEzLCBAKHIxNCwgMTI4KQotCS5nbG9iYWwgc3RiCi1zdGI6Ci0JU1RCIHIxNCwgQHIxNQotCXN0YiByMCwgQChyMTMsIHIxKQotCVNUQiByMiwgQChyMTQsIC0xMjgpCi0JLmdsb2JhbCBtb3YKLW1vdjoKLQltb3YgcjMsIHI0Ci0JTU9WIG1kbCwgcjUKLQltb3YgcHMsIHI2Ci0JbW92IHI3LCB1c3AKLQltb3YgcjgsIHBzCi0JLmdsb2JhbCBqbXAKLWptcDoKLQlqbXAgQHI5Ci0JLmdsb2JhbCByZXQKLXJldDoKLQlyZXQKLQkuZ2xvYmFsIGJyYQotYnJhOgotCWJyYSBmb290ZXh0Ci0JLmdsb2JhbCBibm8KLWJubzoKLQlibm8gZm9vdGV4dAotCS5nbG9iYWwgYmVxCi1iZXE6Ci0JYmVxIGZvb3RleHQKLQkuZ2xvYmFsIGJuZQotYm5lOgotCWJuZSBmb290ZXh0Ci0JLmdsb2JhbCBiYwotYmM6Ci0JYmMgZm9vdGV4dAotCS5nbG9iYWwgYm5jCi1ibmM6Ci0JYm5jIGZvb3RleHQKLQkuZ2xvYmFsIGJuCi1ibjoKLQlibiBmb290ZXh0Ci0JLmdsb2JhbCBicAotYnA6Ci0JYnAgZm9vdGV4dAotCS5nbG9iYWwgYnYKLWJ2OgotCWJ2IGZvb3RleHQKLQkuZ2xvYmFsIGJudgotYm52OgotCWJudiBmb290ZXh0Ci0JLmdsb2JhbCBibHQKLWJsdDoKLQlibHQgZm9vdGV4dAotCS5nbG9iYWwgYmdlCi1iZ2U6Ci0JYmdlIGZvb3RleHQKLQkuZ2xvYmFsIGJsZQotYmxlOgotCWJsZSBmb290ZXh0Ci0JLmdsb2JhbCBiZ3QKLWJndDoKLQliZ3QgZm9vdGV4dAotCS5nbG9iYWwgYmxzCi1ibHM6Ci0JYmxzIGZvb3RleHQKLQkuZ2xvYmFsIGJoaQotYmhpOgotCWJoaSBmb290ZXh0Ci1kZWxheV9mb290ZXh0OgkJCi0JLmdsb2JhbCBqbXBfZAotam1wX2Q6Ci0Jam1wOmQgQHIxMQotCW5vcAotCS5nbG9iYWwgcmV0X2QKLXJldF9kOgotCXJldDpkCi0Jbm9wCi0JLmdsb2JhbCBicmFfZAotYnJhX2Q6Ci0JYnJhOkQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYm5vX2QKLWJub19kOgotCWJubzpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJlcV9kCi1iZXFfZDoKLQliZXE6RCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBibmVfZAotYm5lX2Q6Ci0JYm5lOmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYmNfZAotYmNfZDoKLQliYzpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJuY19kCi1ibmNfZDoKLQlibmM6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBibl9kCi1ibl9kOgotCWJuOmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYnBfZAotYnBfZDoKLQlicDpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJ2X2QKLWJ2X2Q6Ci0JYnY6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBibnZfZAotYm52X2Q6Ci0JYm52OmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYmx0X2QKLWJsdF9kOgotCWJsdDpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJnZV9kCi1iZ2VfZDoKLQliZ2U6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBibGVfZAotYmxlX2Q6Ci0JYmxlOmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYmd0X2QKLWJndF9kOgotCWJndDpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJsc19kCi1ibHNfZDoKLQlibHM6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBiaGlfZAotYmhpX2Q6Ci0JYmhpOmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgbGRyZXMKLWxkcmVzOgotCWxkcmVzIEByMissICM4Ci0JLmdsb2JhbCBzdHJlcwotc3RyZXM6Ci0Jc3RyZXMgIzE1LCBAcjMrCi0JLmdsb2JhbCBub3AKLW5vcDoKLQlub3AKLQkuZ2xvYmFsIGFuZGNjcgotYW5kY2NyOgotCWFuZGNjciAjMjU1Ci0JLmdsb2JhbCBvcmNjcgotb3JjY3I6Ci0Jb3JjY3IgIzEyNQotCS5nbG9iYWwgc3RpbG0KLXN0aWxtOgotCXN0aWxtICM5NwotCS5nbG9iYWwgYWRkc3AKLWFkZHNwOgotCWFkZHNwICMtNTEyCi0JLmdsb2JhbCBleHRzYgotZXh0c2I6Ci0JZXh0c2IgcjkKLQkuZ2xvYmFsIGV4dHViCi1leHR1YjoKLQlleHR1YiByMTAKLQkuZ2xvYmFsIGV4dHNoCi1leHRzaDoKLQlleHRzaCByMTEKLQkuZ2xvYmFsIGV4dHVoCi1leHR1aDoKLQlleHR1aCByMTIKLQkuZ2xvYmFsIGVudGVyCi1lbnRlcjoKLQllbnRlciAjMTAyMAotCS5nbG9iYWwgbGVhdmUKLWxlYXZlOgotCWxlYXZlIAotCS5nbG9iYWwgeGNoYgoteGNoYjoKLQl4Y2hiIEByMTQsIHIxNQotCS5nbG9iYWwgbGRpXzMyCi1sZGlfMzI6Ci0JbGRpOjMyICMweDEyMzQ1Njc4LCByMAotCS5nbG9iYWwgY29wb3AKLWNvcG9wOgotCWNvcG9wICMxNSwgIzEsIGNyMywgY3I0Ci0JY29wb3AgIzE1LCAjNCwgY3I1LCBjcjYKLQljb3BvcCAjMTUsICMyNTUsIGNyNywgY3IwCi0JLmdsb2JhbCBjb3BsZAotY29wbGQ6Ci0JY29wbGQgIzAsICMwLCByNCwgY3IwCi0JLmdsb2JhbCBjb3BzdAotY29wc3Q6Ci0JY29wc3QgIzcsICMyLCBjcjEsIHI1Ci0JLmdsb2JhbCBjb3BzdgotY29wc3Y6Ci0JY29wc3YgIzgsICMzLCBjcjIsIHI2Ci0JLmdsb2JhbCBsZG0wCi1sZG0wOgotCWxkbTAgKHIwLCByMiwgcjMsIHI3KQotCS5nbG9iYWwgbGRtMQotbGRtMToKLQlsZG0xIChyOCwgcjExLCByMTUpCi0JLmdsb2JhbCBzdG0wCi1zdG0wOgotCXN0bTAgKHIyLCByMykKLQkuZ2xvYmFsIHN0bTEKLXN0bTE6Ci0Jc3RtMSAocjEzLCByMTQpCi0JLmdsb2JhbCBjYWxsCi1jYWxsOgotCWNhbGwgZm9vdGV4dAotCWNhbGwgQHIxMAotCS5nbG9iYWwgY2FsbF9kCi1jYWxsX2Q6Ci0JY2FsbDpEIGZvb3RleHQKLQlub3AKLQljYWxsOmQgQHIxMgotCW5vcAotCS5nbG9iYWwgZG1vdgotZG1vdjoKLQlkbW92IEAweDg4LCByMTMKLQlkbW92IHIxMywgQDB4NTQKLQlkbW92IEAweDQ0LCBAcjEzKwotCWRtb3YgQFIxMyssIEAweDIKLQlkbW92IEAweDJjLCBALXIxNQotCWRtb3YgQHIxNSssIEAzOAotCS5nbG9iYWwgZG1vdmgKLWRtb3ZoOgotCWRtb3ZoIEAweDg4LCByMTMKLQlkbW92aCByMTMsIEAweDUyCi0JZG1vdmggQDB4MzQsIEByMTMgKwotCWRtb3ZoIEByMTMrLCBAMHg1MgotCS5nbG9iYWwgZG1vdmIKLWRtb3ZiOgotCWRtb3ZiIEAweDkxLCByMTMKLQlkbW92YiByMTMsIEAweDUzCi0JZG1vdmIgQDcxLCBAcjEzKwotCWRtb3ZiIEByMTMrLCBAMHgwCi0JLmdsb2JhbCBsZGlfMjAKLWxkaV8yMDoKLSAJbGRpOjIwICMweDAwMGZmZmZmLCByMQotZmluaXNoOgkKLSAgICAgICAgbGRpOjMyICMweDgwMDAscjAKLQltb3YgICAgcjAsc3NwCi0gICAgICAgIGxkaTozMiAjMSxyMAotCWludCAgICAjMTAKLQkuZ2xvYmFsIGludGUKLWludGU6Ci0JaW50ZQotCS5nbG9iYWwgcmV0aQotcmV0aToKLQlyZXRpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2ZyMzAuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9mcjMwLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyODZiMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2ZyMzAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIEZSMzAgdGVzdGNhc2VzCi0KLWlmIFtpc3RhcmdldCBmcjMwKi0qLSpdIHsKLSMgICAgcnVuX2R1bXBfdGVzdCAiaGlnaC0xIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3ViLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyYjBkNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWIucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQkudGV4dAotaDgzMDBfYWRkX3N1YjoKLQlhZGQuYiAjMTYscjFsCi0JYWRkLmIgcjFoLHIxbAotCWFkZC53IHIxLHIyCi0JYWRkcyAjMSxyNAotCWFkZHMgIzIscjUKLQlhZGR4IHIwbCxyMWwKLQlhZGR4ICMxNixyMmgKLQlzdWIuYiByMGwscjFsCi0Jc3ViLncgcjAscjEKLQlzdWJzICMxLHI0Ci0Jc3VicyAjMixyNQotCXN1YnggcjBsLHIxbAotCXN1YnggIzE2LHIyaAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWJoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWJoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmODg1ZDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3ViaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2FkZF9zdWI6Ci0JYWRkLmIgIzE2LHIxbAotCWFkZC5iIHIxaCxyMWwKLQlhZGQudyAjMzIscjEKLQlhZGQudyByMSxyMgotCWFkZC5sICM2NCxlcjEKLQlhZGQubCBlcjEsZXIyCi0JYWRkcyAjMSxlcjQKLQlhZGRzICMyLGVyNQotCWFkZHMgIzQsZXI2Ci0JYWRkeCByMGwscjFsCi0JYWRkeCAjMTYscjJoCi0Jc3ViLmIgcjBsLHIxbAotCXN1Yi53ICMxNixyMQotCXN1Yi53IHIwLHIxCi0Jc3ViLmwgIzY0LGVyMQotCXN1Yi5sIGVyMSxlcjIKLQlzdWJzICMxLGVyNAotCXN1YnMgIzIsZXI1Ci0Jc3VicyAjNCxlcjYKLQlzdWJ4IHIwbCxyMWwKLQlzdWJ4ICMxNixyMmgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3Vicy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3Vicy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGIzNjk5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1YnMucworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19hZGRfc3ViOgotCWFkZC5iICMxNixyMWwKLQlhZGQuYiByMWgscjFsCi0JYWRkLncgIzMyLHIxCi0JYWRkLncgcjEscjIKLQlhZGQubCAjNjQsZXIxCi0JYWRkLmwgZXIxLGVyMgotCWFkZHMgIzEsZXI0Ci0JYWRkcyAjMixlcjUKLQlhZGRzICM0LGVyNgotCWFkZHggcjBsLHIxbAotCWFkZHggIzE2LHIyaAotCXN1Yi5iIHIwbCxyMWwKLQlzdWIudyAjMTYscjEKLQlzdWIudyByMCxyMQotCXN1Yi5sICM2NCxlcjEKLQlzdWIubCBlcjEsZXIyCi0Jc3VicyAjMSxlcjQKLQlzdWJzICMyLGVyNQotCXN1YnMgIzQsZXI2Ci0Jc3VieCByMGwscjFsCi0Jc3VieCAjMTYscjJoCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MxMDdhMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLnRleHQKLWg4MzAwX2JpdF9vcHNfMToKLQliYW5kICMwLHIwbAotCWJhbmQgIzAsQHIwCi0JYmFuZCAjMCxANjQ6OAotCWJjbHIgIzAscjBsCi0JYmNsciAjMCxAcjAKLQliY2xyICMwLEA2NDo4Ci0JYmNsciByMWwscjBsCi0JYmNsciByMWwsQHIwCi0JYmNsciByMWwsQDY0OjgKLQliaWFuZCAjMCxyMGwKLQliaWFuZCAjMCxAcjAKLQliaWFuZCAjMCxANjQ6OAotCWJpbGQgIzAscjBsCi0JYmlsZCAjMCxAcjAKLQliaWxkICMwLEA2NDo4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczFoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTM5YTU5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczFoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfYml0X29wc18xOgotCWJhbmQgIzAscjBsCi0JYmFuZCAjMCxAZXIwCi0JYmFuZCAjMCxANjQ6OAotCWJjbHIgIzAscjBsCi0JYmNsciAjMCxAZXIwCi0JYmNsciAjMCxANjQ6OAotCWJjbHIgcjFsLHIwbAotCWJjbHIgcjFsLEBlcjAKLQliY2xyIHIxbCxANjQ6OAotCWJpYW5kICMwLHIwbAotCWJpYW5kICMwLEBlcjAKLQliaWFuZCAjMCxANjQ6OAotCWJpbGQgIzAscjBsCi0JYmlsZCAjMCxAZXIwCi0JYmlsZCAjMCxANjQ6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMXMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY1OTlkNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2JpdF9vcHNfMToKLQliYW5kICMwLHIwbAotCWJhbmQgIzAsQGVyMAotCWJhbmQgIzAsQDY0OjgKLQliYW5kICMwLEAxMjg6MTYKLQliYW5kICMwLEA2NTUzNjozMgotCWJjbHIgIzAscjBsCi0JYmNsciAjMCxAZXIwCi0JYmNsciAjMCxANjQ6OAotCWJjbHIgIzAsQDEyODoxNgotCWJjbHIgIzAsQDY1NTM2OjMyCi0JYmNsciByMWwscjBsCi0JYmNsciByMWwsQGVyMAotCWJjbHIgcjFsLEA2NDo4Ci0JYmNsciByMWwsQDEyODoxNgotCWJjbHIgcjFsLEA2NTUzNjozMgotCWJpYW5kICMwLHIwbAotCWJpYW5kICMwLEBlcjAKLQliaWFuZCAjMCxANjQ6OAotCWJpYW5kICMwLEAxMjg6MTYKLQliaWFuZCAjMCxANjU1MzY6MzIKLQliaWxkICMwLHIwbAotCWJpbGQgIzAsQGVyMAotCWJpbGQgIzAsQDY0OjgKLQliaWxkICMwLEAxMjg6MTYKLQliaWxkICMwLEA2NTUzNjozMgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OTZlNWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9iaXRfb3BzXzI6Ci0JYmlvciAjMCxyMGwKLQliaW9yICMwLEByMAotCWJpb3IgIzAsQDY0OjgKLQliaXN0ICMwLHIwbAotCWJpc3QgIzAsQHIwCi0JYmlzdCAjMCxANjQ6OAotCWJpeG9yICMwLHIwbAotCWJpeG9yICMwLEByMAotCWJpeG9yICMwLEA2NDo4Ci0JYmxkICMwLHIwbAotCWJsZCAjMCxAcjAKLQlibGQgIzAsQDY0OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMmgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczJoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYmU3NGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMmgucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9iaXRfb3BzXzI6Ci0JYmlvciAjMCxyMGwKLQliaW9yICMwLEBlcjAKLQliaW9yICMwLEA2NDo4Ci0JYmlzdCAjMCxyMGwKLQliaXN0ICMwLEBlcjAKLQliaXN0ICMwLEA2NDo4Ci0JYml4b3IgIzAscjBsCi0JYml4b3IgIzAsQGVyMAotCWJpeG9yICMwLEA2NDo4Ci0JYmxkICMwLHIwbAotCWJsZCAjMCxAZXIwCi0JYmxkICMwLEA2NDo4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczJzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMycy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDcwNTIwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczJzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfYml0X29wc18yOgotCWJpb3IgIzAscjBsCi0JYmlvciAjMCxAZXIwCi0JYmlvciAjMCxANjQ6OAotCWJpb3IgIzAsQDEyODoxNgotCWJpb3IgIzAsQDY1NTM2OjMyCi0JYmlzdCAjMCxyMGwKLQliaXN0ICMwLEBlcjAKLQliaXN0ICMwLEA2NDo4Ci0JYmlzdCAjMCxAMTI4OjE2Ci0JYmlzdCAjMCxANjU1MzY6MzIKLQliaXhvciAjMCxyMGwKLQliaXhvciAjMCxAZXIwCi0JYml4b3IgIzAsQDY0OjgKLQliaXhvciAjMCxAMTI4OjE2Ci0JYml4b3IgIzAsQDY1NTM2OjMyCi0JYmxkICMwLHIwbAotCWJsZCAjMCxAZXIwCi0JYmxkICMwLEA2NDo4Ci0JYmxkICMwLEAxMjg6MTYKLQlibGQgIzAsQDY1NTM2OjMyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YzliZmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9iaXRfb3BzXzM6Ci0JYm5vdCAjMCxyMGwKLQlibm90ICMwLEByMAotCWJub3QgIzAsQDY0OjgKLQlibm90IHIxbCxyMGwKLQlibm90IHIxbCxAcjAKLQlibm90IHIxbCxANjQ6OAotCWJzZXQgIzAscjBsCi0JYnNldCAjMCxAcjAKLQlic2V0ICMwLEA2NDo4Ci0JYnNldCByMWwscjBsCi0JYnNldCByMWwsQHIwCi0JYnNldCByMWwsQDY0OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzM2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZWRhNjAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzM2gucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9iaXRfb3BzXzM6Ci0JYm5vdCAjMCxyMGwKLQlibm90ICMwLEBlcjAKLQlibm90ICMwLEA2NDo4Ci0JYm5vdCByMWwscjBsCi0JYm5vdCByMWwsQGVyMAotCWJub3QgcjFsLEA2NDo4Ci0JYnNldCAjMCxyMGwKLQlic2V0ICMwLEBlcjAKLQlic2V0ICMwLEA2NDo4Ci0JYnNldCByMWwscjBsCi0JYnNldCByMWwsQGVyMAotCWJzZXQgcjFsLEA2NDo4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczNzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMzcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzY0ZTA2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczNzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfYml0X29wc18zOgotCWJub3QgIzAscjBsCi0JYm5vdCAjMCxAZXIwCi0JYm5vdCAjMCxANjQ6OAotCWJub3QgIzAsQDEyODoxNgotCWJub3QgIzAsQDY1NTM2OjMyCi0JYm5vdCByMWwscjBsCi0JYm5vdCByMWwsQGVyMAotCWJub3QgcjFsLEA2NDo4Ci0JYm5vdCByMWwsQDEyODoxNgotCWJub3QgcjFsLEA2NTUzNjozMgotCWJzZXQgIzAscjBsCi0JYnNldCAjMCxAZXIwCi0JYnNldCAjMCxANjQ6OAotCWJzZXQgIzAsQDEyODoxNgotCWJzZXQgIzAsQDY1NTM2OjMyCi0JYnNldCByMWwscjBsCi0JYnNldCByMWwsQGVyMAotCWJzZXQgcjFsLEA2NDo4Ci0JYnNldCByMWwsQDEyODoxNgotCWJzZXQgcjFsLEA2NTUzNjozMgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHM0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHM0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTY2ZDguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9iaXRfb3BzXzQ6Ci0JYm9yICMwLHIwbAotCWJvciAjMCxAcjAKLQlib3IgIzAsQDY0OjgKLQlic3QgIzAscjBsCi0JYnN0ICMwLEByMAotCWJzdCAjMCxANjQ6OAotCWJ0c3QgIzAscjBsCi0JYnRzdCAjMCxAcjAKLQlidHN0ICMwLEA2NDo4Ci0JYnRzdCByMWwscjBsCi0JYnRzdCByMWwsQHIwCi0JYnRzdCByMWwsQDY0OjgKLQlieG9yICMwLHIwbAotCWJ4b3IgIzAsQHIwCi0JYnhvciAjMCxANjQ6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHM0aC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQzNWUxNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHM0aC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2JpdF9vcHNfNDoKLQlib3IgIzAscjBsCi0JYm9yICMwLEBlcjAKLQlib3IgIzAsQDY0OjgKLQlic3QgIzAscjBsCi0JYnN0ICMwLEBlcjAKLQlic3QgIzAsQDY0OjgKLQlidHN0ICMwLHIwbAotCWJ0c3QgIzAsQGVyMAotCWJ0c3QgIzAsQDY0OjgKLQlidHN0IHIxbCxyMGwKLQlidHN0IHIxbCxAZXIwCi0JYnRzdCByMWwsQDY0OjgKLQlieG9yICMwLHIwbAotCWJ4b3IgIzAsQGVyMAotCWJ4b3IgIzAsQDY0OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczRzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZjQ3YjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNHMucworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19iaXRfb3BzXzQ6Ci0JYm9yICMwLHIwbAotCWJvciAjMCxAZXIwCi0JYm9yICMwLEA2NDo4Ci0JYm9yICMwLEAxMjg6MTYKLQlib3IgIzAsQDY1NTM2OjMyCi0JYnN0ICMwLHIwbAotCWJzdCAjMCxAZXIwCi0JYnN0ICMwLEA2NDo4Ci0JYnN0ICMwLEAxMjg6MTYKLQlic3QgIzAsQDY1NTM2OjMyCi0JYnRzdCAjMCxyMGwKLQlidHN0ICMwLEBlcjAKLQlidHN0ICMwLEA2NDo4Ci0JYnRzdCAjMCxAMTI4OjE2Ci0JYnRzdCAjMCxANjU1MzY6MzIKLQlidHN0IHIxbCxyMGwKLQlidHN0IHIxbCxAZXIwCi0JYnRzdCByMWwsQDY0OjgKLQlidHN0IHIxbCxAMTI4OjE2Ci0JYnRzdCByMWwsQDY1NTM2OjMyCi0JYnhvciAjMCxyMGwKLQlieG9yICMwLEBlcjAKLQlieG9yICMwLEA2NDo4Ci0JYnhvciAjMCxAMTI4OjE2Ci0JYnhvciAjMCxANjU1MzY6MzIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9icmFuY2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4MDYxNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9icmFuY2gucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkudGV4dAotaDgzMDBfYnJhbmNoZXM6Ci0JYnNyIGg4MzAwX2JyYW5jaGVzCi0Jam1wIGg4MzAwX2JyYW5jaGVzCi0Jam1wIEByMAotCWptcCBAQDE2OjgKLQlqc3IgaDgzMDBfYnJhbmNoZXMKLQlqc3IgQHIwCi0JanNyIEBAMTY6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9icmFuY2hoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9icmFuY2hoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYmM2MmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNoaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2JyYW5jaGVzOgotCWJzciBoODMwMGhfYnJhbmNoZXM6OAotCWJzciBoODMwMGhfYnJhbmNoZXM6MTYKLQlqbXAgaDgzMDBoX2JyYW5jaGVzCi0Jam1wIEBlcjAKLQlqbXAgQEAxNjo4Ci0JanNyIGg4MzAwaF9icmFuY2hlcwotCWpzciBAZXIwCi0JanNyIEBAMTY6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9icmFuY2hzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9icmFuY2hzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMzNlMTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNocy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2JyYW5jaGVzOgotCWJzciBoODMwMHNfYnJhbmNoZXM6OAotCWJzciBoODMwMHNfYnJhbmNoZXM6MTYKLQlqbXAgaDgzMDBzX2JyYW5jaGVzCi0Jam1wIEBlcjAKLQlqbXAgQEAxNjo4Ci0JanNyIGg4MzAwc19icmFuY2hlcwotCWpzciBAZXIwCi0JanNyIEBAMTY6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlM2Q1M2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9jYnJhbmNoOgotCWJyYSBoODMwMF9jYnJhbmNoCi0JYnQgaDgzMDBfY2JyYW5jaAotCWJybiBoODMwMF9jYnJhbmNoCi0JYmYgaDgzMDBfY2JyYW5jaAotCWJoaSBoODMwMF9jYnJhbmNoCi0JYmxzIGg4MzAwX2NicmFuY2gKLQliY2MgaDgzMDBfY2JyYW5jaAotCWJocyBoODMwMF9jYnJhbmNoCi0JYmNzIGg4MzAwX2NicmFuY2gKLQlibG8gaDgzMDBfY2JyYW5jaAotCWJuZSBoODMwMF9jYnJhbmNoCi0JYmVxIGg4MzAwX2NicmFuY2gKLQlidmMgaDgzMDBfY2JyYW5jaAotCWJ2cyBoODMwMF9jYnJhbmNoCi0JYnBsIGg4MzAwX2NicmFuY2gKLQlibWkgaDgzMDBfY2JyYW5jaAotCWJnZSBoODMwMF9jYnJhbmNoCi0JYmx0IGg4MzAwX2NicmFuY2gKLQliZ3QgaDgzMDBfY2JyYW5jaAotCWJsZSBoODMwMF9jYnJhbmNoCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NicmFuY2hoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNoaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjRlMWEyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NicmFuY2hoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0JLnRleHQKLQkuaDgzMDBoCi1oODMwMGhfY2JyYW5jaDoKLQlicmEgaDgzMDBoX2NicmFuY2g6OAotCWJ0IGg4MzAwaF9jYnJhbmNoOjgKLQlicm4gaDgzMDBoX2NicmFuY2g6OAotCWJmIGg4MzAwaF9jYnJhbmNoOjgKLQliaGkgaDgzMDBoX2NicmFuY2g6OAotCWJscyBoODMwMGhfY2JyYW5jaDo4Ci0JYmNjIGg4MzAwaF9jYnJhbmNoOjgKLQliaHMgaDgzMDBoX2NicmFuY2g6OAotCWJjcyBoODMwMGhfY2JyYW5jaDo4Ci0JYmxvIGg4MzAwaF9jYnJhbmNoOjgKLQlibmUgaDgzMDBoX2NicmFuY2g6OAotCWJlcSBoODMwMGhfY2JyYW5jaDo4Ci0JYnZjIGg4MzAwaF9jYnJhbmNoOjgKLQlidnMgaDgzMDBoX2NicmFuY2g6OAotCWJwbCBoODMwMGhfY2JyYW5jaDo4Ci0JYm1pIGg4MzAwaF9jYnJhbmNoOjgKLQliZ2UgaDgzMDBoX2NicmFuY2g6OAotCWJsdCBoODMwMGhfY2JyYW5jaDo4Ci0JYmd0IGg4MzAwaF9jYnJhbmNoOjgKLQlibGUgaDgzMDBoX2NicmFuY2g6OAotCWJyYSBoODMwMGhfY2JyYW5jaDoxNgotCWJ0IGg4MzAwaF9jYnJhbmNoOjE2Ci0JYnJuIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmYgaDgzMDBoX2NicmFuY2g6MTYKLQliaGkgaDgzMDBoX2NicmFuY2g6MTYKLQlibHMgaDgzMDBoX2NicmFuY2g6MTYKLQliY2MgaDgzMDBoX2NicmFuY2g6MTYKLQliaHMgaDgzMDBoX2NicmFuY2g6MTYKLQliY3MgaDgzMDBoX2NicmFuY2g6MTYKLQlibG8gaDgzMDBoX2NicmFuY2g6MTYKLQlibmUgaDgzMDBoX2NicmFuY2g6MTYKLQliZXEgaDgzMDBoX2NicmFuY2g6MTYKLQlidmMgaDgzMDBoX2NicmFuY2g6MTYKLQlidnMgaDgzMDBoX2NicmFuY2g6MTYKLQlicGwgaDgzMDBoX2NicmFuY2g6MTYKLQlibWkgaDgzMDBoX2NicmFuY2g6MTYKLQliZ2UgaDgzMDBoX2NicmFuY2g6MTYKLQlibHQgaDgzMDBoX2NicmFuY2g6MTYKLQliZ3QgaDgzMDBoX2NicmFuY2g6MTYKLQlibGUgaDgzMDBoX2NicmFuY2g6MTYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NicmFuY2hzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MjIyZWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaHMucworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLQkudGV4dAotCS5oODMwMHMKLWg4MzAwc19jYnJhbmNoOgotCWJyYSBoODMwMHNfY2JyYW5jaDo4Ci0JYnQgaDgzMDBzX2NicmFuY2g6OAotCWJybiBoODMwMHNfY2JyYW5jaDo4Ci0JYmYgaDgzMDBzX2NicmFuY2g6OAotCWJoaSBoODMwMHNfY2JyYW5jaDo4Ci0JYmxzIGg4MzAwc19jYnJhbmNoOjgKLQliY2MgaDgzMDBzX2NicmFuY2g6OAotCWJocyBoODMwMHNfY2JyYW5jaDo4Ci0JYmNzIGg4MzAwc19jYnJhbmNoOjgKLQlibG8gaDgzMDBzX2NicmFuY2g6OAotCWJuZSBoODMwMHNfY2JyYW5jaDo4Ci0JYmVxIGg4MzAwc19jYnJhbmNoOjgKLQlidmMgaDgzMDBzX2NicmFuY2g6OAotCWJ2cyBoODMwMHNfY2JyYW5jaDo4Ci0JYnBsIGg4MzAwc19jYnJhbmNoOjgKLQlibWkgaDgzMDBzX2NicmFuY2g6OAotCWJnZSBoODMwMHNfY2JyYW5jaDo4Ci0JYmx0IGg4MzAwc19jYnJhbmNoOjgKLQliZ3QgaDgzMDBzX2NicmFuY2g6OAotCWJsZSBoODMwMHNfY2JyYW5jaDo4Ci0JYnJhIGg4MzAwc19jYnJhbmNoOjE2Ci0JYnQgaDgzMDBzX2NicmFuY2g6MTYKLQlicm4gaDgzMDBzX2NicmFuY2g6MTYKLQliZiBoODMwMHNfY2JyYW5jaDoxNgotCWJoaSBoODMwMHNfY2JyYW5jaDoxNgotCWJscyBoODMwMHNfY2JyYW5jaDoxNgotCWJjYyBoODMwMHNfY2JyYW5jaDoxNgotCWJocyBoODMwMHNfY2JyYW5jaDoxNgotCWJjcyBoODMwMHNfY2JyYW5jaDoxNgotCWJsbyBoODMwMHNfY2JyYW5jaDoxNgotCWJuZSBoODMwMHNfY2JyYW5jaDoxNgotCWJlcSBoODMwMHNfY2JyYW5jaDoxNgotCWJ2YyBoODMwMHNfY2JyYW5jaDoxNgotCWJ2cyBoODMwMHNfY2JyYW5jaDoxNgotCWJwbCBoODMwMHNfY2JyYW5jaDoxNgotCWJtaSBoODMwMHNfY2JyYW5jaDoxNgotCWJnZSBoODMwMHNfY2JyYW5jaDoxNgotCWJsdCBoODMwMHNfY2JyYW5jaDoxNgotCWJndCBoODMwMHNfY2JyYW5jaDoxNgotCWJsZSBoODMwMHNfY2JyYW5jaDoxNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jbXBzaTIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NtcHNpMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjdmMDNhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NtcHNpMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyAxICJsaWJnY2MxLlMiCi07OyBsaWJnY2MxIHJvdXRpbmVzIGZvciB0aGUgSGl0YWNoaSBoOC8zMDAgY3B1LgotOzsgQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4uCi07OyBzYWNAY3lnbnVzLmNvbQotCS5zZWN0aW9uIC50ZXh0Ci0JLmFsaWduIDIKLQkuZ2xvYmFsIF9fX2NtcHNpMgotX19fY21wc2kyOgotCWNtcC53CXIyICxyMCAKLQlibmUJLkwyCi0JY21wLncJcjMgLHIxIAotCWJuZQkuTDIKLQltb3YudwkjMSxyMCAKLQlydHMKLS5MMjoKLQljbXAudwlyMCAscjIgCi0JYmd0CS5MNAotCWJuZQkuTDMKLQljbXAudwlyMSAscjMgCi0JYmxzCS5MMwotLkw0OgotCXN1Yi53CXIwICxyMCAKLQlydHMKLS5MMzoKLQltb3YudwkjMixyMCAKLS5MNToKLQlydHMKLQkuZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYzFhNDEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZS5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0JLnRleHQKLWg4MzAwX2NtcDoKLQljbXAuYiAjMCxyMGwKLQljbXAuYiByMGgscjBsCi0JY21wLncgcjAscjEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZWgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmVoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MWU4OGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZWgucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9jbXA6Ci0JY21wLmIgIzAscjBsCi0JY21wLmIgcjBoLHIwbAotCWNtcC53ICMzMixyMAotCWNtcC53IHIwLHIxCi0JY21wLmwgIzY0LGVyMAotCWNtcC5sIGVyMCxlcjEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZXMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmVzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyM2YzZmUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZXMucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19jbXA6Ci0JY21wLmIgIzAscjBsCi0JY21wLmIgcjBoLHIwbAotCWNtcC53ICMzMixyMAotCWNtcC53IHIwLHIxCi0JY21wLmwgIzY0LGVyMAotCWNtcC5sIGVyMCxlcjEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDRjMGEwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWwucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9kZWNpbWFsOgotCWRhYSByMGwKLQlkYXMgcjBsCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWxoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFsaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzkyNDA1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWxoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9kZWNpbWFsOgotCWRhYSByMGwKLQlkYXMgcjBsCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWxzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFscy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzgwMmZjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWxzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19kZWNpbWFsOgotCWRhYSByMGwKLQlkYXMgcjBsCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGl2bXVsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MzcyY2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGl2bXVsLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotaDgzMDBfZGl2X211bDoKLQlkaXZ4dSByMGwscjEKLQltdWx4dSByMGwscjEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGl2bXVsaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGl2bXVsaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjYwZjhmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bGgucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9kaXZfbXVsOgotCWRpdnh1LmIgcjBsLHIxCi0JZGl2eHUudyByMCxlcjEKLQlkaXZ4cy5iIHIwbCxyMQotCWRpdnhzLncgcjAsZXIxCi0JbXVseHUuYiByMGwscjEKLQltdWx4dS53IHIwLGVyMQotCW11bHhzLmIgcjBsLHIxCi0JbXVseHMudyByMCxlcjEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGl2bXVscy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGl2bXVscy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjYwZjhmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bHMucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9kaXZfbXVsOgotCWRpdnh1LmIgcjBsLHIxCi0JZGl2eHUudyByMCxlcjEKLQlkaXZ4cy5iIHIwbCxyMQotCWRpdnhzLncgcjAsZXIxCi0JbXVseHUuYiByMGwscjEKLQltdWx4dS53IHIwLGVyMQotCW11bHhzLmIgcjBsLHIxCi0JbXVseHMudyByMCxlcjEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZXh0ZW5kaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZXh0ZW5kaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDM0YzgzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2V4dGVuZGgucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2V4dGVuZDoKLQlleHRzLncgcjAKLQlleHRzLmwgZXIwCi0JZXh0dS53IHIwCi0JZXh0dS5sIGVyMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9leHRlbmRzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9leHRlbmRzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNmU5YmEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZXh0ZW5kcy5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfZXh0ZW5kOgotCWV4dHMudyByMAotCWV4dHMubCBlcjAKLQlleHR1LncgcjAKLQlleHR1LmwgZXIwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2ZmeHgxLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9mZnh4MS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzQ1NWQ1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2ZmeHgxLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jb2JqZHVtcDogLS1wcmVmaXgtYWRkcmVzc2VzIC1kcgotI25hbWU6IEZGeHgxCi0KLSMgVGVzdCBmb3IgRkZ4eDo4IGFkZHJlc3NpbmcuCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgLipoODMwMC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0JLi4uCi0JCQkwOiAxNgltYWluCi0wKzA0MDAgPG1haW4+IGY4IDdmICAgICAgICAgICAgIG1vdi5iCSMweDdmLHIwbAotMCswNDAyIDxtYWluWytdKDB4fCkyPiAyOCBiYiAgICAgICAgICAgICBtb3YuYglAMHhiYjo4LHIwbAotMCswNDA0IDxtYWluWytdKDB4fCk0PiA2YSA4OCBmZiBiOSAgICAgICBtb3YuYglyMGwsQDB4ZmZiOToxNgotMCswNDA4IDxtYWluWytdKDB4fCk4PiBmOCAwMSAgICAgICAgICAgICBtb3YuYgkjMHgxLHIwbAotMCswNDBhIDxsb29wPiA2YSA4OCBmZiBiYiAgICAgICBtb3YuYglyMGwsQDB4ZmZiYjoxNgotMCswNDBlIDxkZWxheT4gNzkgMDEgMDAgMDAgICAgICAgbW92LncJIzB4MCxyMQotMCswNDEyIDxkZWxvb3A+IDBiIDAxICAgICAgICAgICAgIGFkZHMJIzB4MSxlcjEKLTArMDQxNCA8ZGVsb29wWytdKDB4fCkyPiA0NiAwMCAgICAgICAgICAgICBibmUJLjAgXCg0MTZcKQotCQkJNDE1OiBESVNQOAlkZWxvb3BbK10weGZmZmZmZmZmCi0wKzA0MTYgPGRlbG9vcFsrXSgweHwpND4gMTIgODggICAgICAgICAgICAgcm90bAlyMGwKLTArMDQxOCA8ZGVsb29wWytdKDB4fCk2PiA0MCAwMCAgICAgICAgICAgICBicmEJLjAgXCg0MWFcKQotCQkJNDE5OiBESVNQOAlsb29wWytdMHhmZmZmZmZmZgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZmZ4eDEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2ZmeHgxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZmM4NDEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZmZ4eDEucworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQkuZXF1ICAgIHA2ZGRyLCAgMHhmZmI5ICAgICAgICAgIDsweDdmIGZvciBvdXRwdXQgCi0JLmVxdSAgICBwNmRyLCAgICAweGZmYmIKLQkuZXF1ICAgIHNlZWQsICAgIDB4MDEKLQkudGV4dAotCS5vcmcgICAgMAotcmVzZXQ6ICAud29yZCAgIG1haW4gICAgICAgICAgICA7cmVzZXQgdmVjdG9yIAotOwotCS5vcmcgICAgMHg0MDAKLW1haW46ICAgbW92LmIgICAjMHg3ZixyMGwgICAgICAgO3BvcnQgNiBkZHIgPSA3RiAKLQltb3YuYiAgIEAweGZmYmI6OCxyMGwgICA7KioqdGVzdCoqKgotCW1vdi5iICAgcjBsLEBwNmRkcjoxNgotOwotCW1vdi5iICAgI3NlZWQscjBsICAgICAgIDtzdGFydCB3aXRoIDAwMDAwMDEKLWxvb3A6ICAgbW92LmIgICByMGwsQHA2ZHI6MTYgICAgO291dHB1dCB0byBwb3J0IDYgCi1kZWxheTogIG1vdi53ICAgIzB4MDAwMCxyMQotZGVsb29wOiBhZGRzLncgICMxLHIxCi0JYm5lICAgICBkZWxvb3A6OCAgICAgICAgO25vdCA9IDAKLQlyb3RsICAgIHIwbAotICAgICAgICBicmEgICAgIGxvb3A6OAotCS53b3JkCTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2g4MzAwLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2g4MzAwLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3ZDQxZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9oODMwMC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTgzICswLDAgQEAKLSMKLSMgU29tZSBIOC8zMDAgdGVzdHMKLSMKLXByb2MgZG9faDgzMDBfYWRkX3N1YiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhZGRzdWIuczogaDgzMDAgYWRkL3N1YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFkZHN1Yi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgODkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDA4MTlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAwOTEyXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgMEIwNFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDBCODVcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSAwRTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgOTIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDE4ODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAxOTAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMUIwNFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDFCODVcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiAxRTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggQjIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDEzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2xvZ2ljYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9naWNhbC5zOiBoODMwMCBsb2dpY2FsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9naWNhbC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgRTkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDE2OTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAwNjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgQzgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDE0OThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSAwNDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgRDgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDE1ODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwNTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMTc4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDE3MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9jYnJhbmNoIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNicmFuY2guczogaDgzMDAgY29uZGl0aW9uYWwgYnJhbmNoIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY2JyYW5jaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDQwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA0MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNDEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDQyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA0MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNDQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDQ0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA0NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgNDUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDQ2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA0NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNDgwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDQ5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyA0QTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNEIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDRDMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA0RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgNEUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDRGMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9iaXRvcHMxIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczEuczogaDgzMDAgYml0b3BzIHRlc3RzICMxIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzMS5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3MjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDcyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNzIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDYyOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3RDAwNjI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdGNDA2MjkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNzY4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdDMDA3NjgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0U0MDc2ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA3Nzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgN0MwMDc3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSA3RTQwNzc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2JpdG9wczIge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzMi5zOiBoODMwMCBiaXRvcHMgdGVzdHMgIzIiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHMyLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3NDg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0MwMDc0ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RTQwNzQ4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDY3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3RDAwNjc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDdGNDA2NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNzU4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDdDMDA3NTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0U0MDc1ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3NzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0MwMDc3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3RTQwNzcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2JpdG9wczMge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzMy5zOiBoODMwMCBiaXRvcHMgdGVzdHMgIzMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHMzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3MTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0QwMDcxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RjQwNzEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDYxOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3RDAwNjE5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDdGNDA2MTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNzAwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDdEMDA3MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0Y0MDcwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA2MDk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0QwMDYwOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3RjQwNjA5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2JpdG9wczQge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzNC5zOiBoODMwMCBiaXRvcHMgdGVzdHMgIzQiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHM0LnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3NDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0MwMDc0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RTQwNzQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDY3MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3RDAwNjcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDdGNDA2NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNzMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDdDMDA3MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0U0MDczMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA2Mzk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0MwMDYzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3RTQwNjM5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDc1MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSA3QzAwNzUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDdFNDA3NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfYnJhbmNoIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJyYW5jaC5zOiBoODMwMCBicmFuY2ggdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJicmFuY2gucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDU1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA1QTAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDU5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA1QjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNUUwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA1RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgNUYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfY29tcGFyZSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb21wYXJlLnM6IGg4MzAwIGNvbXBhcmUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjb21wYXJlLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCBBODAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMUMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDFEMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2RlY2ltYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAiZGVjaW1hbC5zOiBoODMwMCBkZWNpbWFsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZGVjaW1hbC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFGMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9pbmNkZWMge30gewotICAgIHNldCB0ZXN0bmFtZSAiaW5jZGVjLnM6IGg4MzAwIGluY2RlYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImluY2RlYy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMUEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDBBMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9kaXZtdWwge30gewotICAgIHNldCB0ZXN0bmFtZSAiZGl2bXVsLnM6IGg4MzAwIGRpdm11bCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImRpdm11bC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNTE4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDUwODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9taXNjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1pc2MuczogaDgzMDAgbWlzYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1pc2MucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDdCNUM1OThGXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDAzMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNTY3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDU0NzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAwMTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotCi0gICAgc2V0dXBfeGZhaWwgImg4MzAwKi0qLSoiCi0gICAgZmFpbCAiaDgzMDAgbW92ZnBlL21vdnRwZSB0ZXN0cyIKLX0KLQotcHJvYyBkb19oODMwMF9tb3ZiIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmIuczogaDgzMDAgbW92YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdmIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBDODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiBGODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNjgxOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDZFMTgwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNkMxOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDI4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA2QTA4MDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDY4OThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA2RTk4MDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDZDOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSAzODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgNkE4ODAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfbW92dyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3Z3LnM6IGg4MzAwIG1vdncgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3Z3LnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwRDAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNzkwMDAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA2OTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggNkYxMDAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA2RDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNkIwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA2OTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNkY5MDAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCA2RDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNkI4MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfcHVzaHBvcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJwdXNocG9wLnM6IGg4MzAwIHB1c2hwb3AgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJwdXNocG9wLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA2RDcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX3JvdGF0ZV9zaGlmdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJyb3RzaC5zOiBoODMwMCByb3RhdGUgYW5kIHNoaWZ0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicm90c2gucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDEyODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxMzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMTIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDEzMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAxMDg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMTE4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDEwMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAxMTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2FkZF9zdWIge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWRkc3ViaC5zOiBoODMwMGggYWRkL3N1YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFkZHN1YmgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDg5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwODE5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNzkxMTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwOTEyXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgN0ExMTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDBBOTJcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAwQjA0XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMEI4NVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDBCOTZcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCAwRTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgOTIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDE4ODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3OTMxMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDE5MDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3QTMxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgMUE5MlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJjIDFCMDRcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSAxQjg1XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgMUI5NlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDFFODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCBCMjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2xvZ2ljYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9naWNhbGguczogaDgzMDBoIGxvZ2ljYWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsb2dpY2FsaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgRTkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDE2OTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA3OTYxMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDY2MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3QTYxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDFGMDY2MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAwNjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgQzgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDE0OThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3OTQxMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDY0MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA3QTQxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgMDFGMDY0MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAwNDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmMgRDgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDE1ODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCA3OTUxMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM0IDY1MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiA3QTUxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2MgMDFGMDY1MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCAwNTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDIgMTc4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ0IDE3OTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NiAxN0IwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDggMTcwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRhIDE3MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YyAxNzMwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2NicmFuY2gge30gewotICAgIHNldCB0ZXN0bmFtZSAiY2JyYW5jaGguczogaDgzMDBoIGNvbmRpdGlvbmFsIGJyYW5jaCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNicmFuY2hoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA0MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDQxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA0MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggNDIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDQzMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA0NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNDQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDQ1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA0NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNDYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDQ3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCA0ODAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNDkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDRBMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA0QjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgNEMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDREMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA0RTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgNEYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDU4MDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmMgNTgwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCA1ODEwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM0IDU4MTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzggNTgyMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYyA1ODMwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQwIDU4NDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDQgNTg0MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0OCA1ODUwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRjIDU4NTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTAgNTg2MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1NCA1ODcwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU4IDU4ODAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNWMgNTg5MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2MCA1OEEwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDY0IDU4QjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjggNThDMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2YyA1OEQwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDcwIDU4RTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNzQgNThGMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA0MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLXByb2MgZG9faDgzMDBoX2JpdG9wczEge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzMWguczogaDgzMDBoIGJpdG9wcyB0ZXN0cyAjMSIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczFoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3NjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0MwMDc2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RTQwNzYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDcyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3RDAwNzIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDdGNDA3MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNjI5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDdEMDA2MjkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0Y0MDYyOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3Njg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0MwMDc2ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3RTQwNzY4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDc3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSA3QzAwNzc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDdFNDA3NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2JpdG9wczIge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzMmguczogaDgzMDBoIGJpdG9wcyB0ZXN0cyAjMiIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczJoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3NDg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0MwMDc0ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RTQwNzQ4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDY3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3RDAwNjc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDdGNDA2NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNzU4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDdDMDA3NTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0U0MDc1ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3NzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0MwMDc3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3RTQwNzcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9iaXRvcHMzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczNoLnM6IGg4MzAwaCBiaXRvcHMgdGVzdHMgIzMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHMzaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdEMDA3MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0Y0MDcxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2MTk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDYxOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNjE5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDcwMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3RDAwNzAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdGNDA3MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNjA5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdEMDA2MDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0Y0MDYwOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfYml0b3BzNCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXRvcHM0aC5zOiBoODMwMGggYml0b3BzIHRlc3RzICM0IgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzNGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDc0MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QzAwNzQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdFNDA3NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNjcwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDdEMDA2NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgN0Y0MDY3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA3MzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgN0MwMDczMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RTQwNzMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDYzOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA3QzAwNjM5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdFNDA2MzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNzUwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDdDMDA3NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgN0U0MDc1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfYnJhbmNoIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJyYW5jaGguczogaDgzMDBoIGJyYW5jaCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJyYW5jaGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDU1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA1QzAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDVBMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNTkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDVCMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA1RTAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDVEMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA1RjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfY29tcGFyZSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb21wYXJlaC5zOiBoODMwMGggY29tcGFyZSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNvbXBhcmVoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCBBODAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMUMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDc5MjAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMUQwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDdBMjAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAxRjgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfZGVjaW1hbCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkZWNpbWFsaC5zOiBoODMwMGggZGVjaW1hbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImRlY2ltYWxoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwRjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMUYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9pbmNkZWMge30gewotICAgIHNldCB0ZXN0bmFtZSAiaW5jZGVjaC5zOiBoODMwMGggaW5jZGVjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiaW5jZGVjaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMUEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFCNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAxQkQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgMUI3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDFCRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSAwQTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgMEI1MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDBCRDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwQjcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMEJGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfZGl2bXVsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRpdm11bGguczogaDgzMDBoIGRpdm11bCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImRpdm11bGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDUxODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA1MzAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMDFEMDUxODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMUQwNTMwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDUwODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA1MjAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDFDMDUwODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAwMUMwNTIwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9taXNjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1pc2NoLnM6IGg4MzAwaCBtaXNjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibWlzY2gucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDdCNUM1OThGXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgN0JENDU5OEZcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwNzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMDMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDAxNDA2OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDE0MDZGMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDAxNDA3ODAwXFteXG5cXSpcbiArXFswLTlcXSsgKzZCMjAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCAwMTQwNkQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDAxNDA2QjAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAwMTQwNkIyMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCA1NjcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgNTQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM4IDAxODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYSAwMjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2MgMDE0MDY5ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCAwMTQwNkY4MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDYgMDE0MDc4MDBcW15cblxdKlxuICtcWzAtOVxdKyArNkJBMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUwIDAxNDA2RDgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTQgMDE0MDZCODBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDVhIDAxNDA2QkEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDIxXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotCi0gICAgc2V0dXBfeGZhaWwgImg4MzAwKi0qLSoiCi0gICAgZmFpbCAiaDgzMDBoIG1vdmZwZS9tb3Z0cGUgdGVzdHMiCi19Ci0KLXByb2MgZG9faDgzMDBoX21vdmIge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92YmguczogaDgzMDBoIG1vdmIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZiaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEM4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIEY4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA2ODE4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNkUxODAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3ODEwNkEyOFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDZDMThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAyODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgNkEwODAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA2QTI4MDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgNjg5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDZFOTgwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgNzgxMDZBQThcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSA2Qzk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgMzgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDZBODgwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgNkFBODAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfbW92dyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3Z3aC5zOiBoODMwMGggbW92dyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdndoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwRDAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNzkwMDAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA2OTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggNkYxMDAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3ODEwNkIyMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDZEMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA2QjAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDZCMjAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA2OTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNkY5MDAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiA3ODEwNkJBMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDZEOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCA2QjgwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM0IDZCQTAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX21vdmwge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92bGguczogaDgzMDBoIG1vdmwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZsaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEY4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdBMDAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMTAwNjkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDAxMDA2RjEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAwMTAwNzgxMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgMDEwMDZEMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCAwMTAwNkIwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgMDEwMDZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSAwMTAwNjk5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDAxMDA2RjkwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCAwMTAwNzg5MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QkEwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDIgMDEwMDZEOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NiAwMTAwNkI4MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGMgMDEwMDZCQTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX3B1c2hwb3Age30gewotICAgIHNldCB0ZXN0bmFtZSAicHVzaHBvcGguczogaDgzMDBoIHB1c2hwb3AgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJwdXNocG9waC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNkQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDAxMDA2RDcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDAxMDA2REYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX3JvdGF0ZV9zaGlmdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJyb3RzaGguczogaDgzMDBoIHJvdGF0ZSBhbmQgc2hpZnQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJyb3RzaGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDEyODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxMjkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMTJCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDEzODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAxMzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMTNCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDEyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAxMjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMTIzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDEzMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAxMzEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgMTMzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDEwODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSAxMDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgMTBCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDExODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCAxMTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgMTFCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDEwMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiAxMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggMTAzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDExMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYyAxMTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgMTEzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfZXh0ZW5kIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImV4dGVuZGguczogaDgzMDBoIGV4dGVuZCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImV4dGVuZGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDE3RDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxN0YwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMTc1MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDE3NzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfYWRkX3N1YiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhZGRzdWJzLnM6IGg4MzAwcyBhZGQvc3ViIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYWRkc3Vicy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgODkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDA4MTlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA3OTExMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDA5MTJcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3QTExMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMEE5MlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDBCMDRcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAwQjg1XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgMEI5NlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDBFODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA5MjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgMTg4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDc5MzEwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgMTkwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdBMzEwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAxQTkyXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmMgMUIwNFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDFCODVcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCAxQjk2XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgMUU4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM0IEIyMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfbG9naWNhbCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsb2dpY2Fscy5zOiBoODMwMHMgbG9naWNhbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImxvZ2ljYWxzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCBFOTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTY5MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDc5NjEwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggNjYxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDdBNjEwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwMUYwNjYxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDA2MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiAwMTQxMDYxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIEM4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyAxNDk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNzk0MTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2NDExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0E0MTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDAxRjA2NDExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgMDQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDAxNDEwNDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCBEODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgMTU4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM4IDc5NTEwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2MgNjUxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNlIDdBNTEwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NCAwMUYwNjUxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDA1MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YSAwMTQxMDUxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRlIDE3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MCAxNzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTIgMTdCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU0IDE3MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1NiAxNzEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTggMTczMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDMwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19jYnJhbmNoIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNicmFuY2hzLnM6IGg4MzAwcyBjb25kaXRpb25hbCBicmFuY2ggdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjYnJhbmNocy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDQwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA0MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNDEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDQyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA0MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNDQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDQ0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA0NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgNDUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDQ2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA0NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNDgwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDQ5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyA0QTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNEIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDRDMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA0RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgNEUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDRGMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA1ODAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJjIDU4MDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNTgxMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCA1ODEwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM4IDU4MjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2MgNTgzMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCA1ODQwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ0IDU4NDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDggNTg1MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YyA1ODUwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUwIDU4NjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTQgNTg3MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1OCA1ODgwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDVjIDU4OTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjAgNThBMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2NCA1OEIwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDY4IDU4QzAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNmMgNThEMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA3MCA1OEUwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDc0IDU4RjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNDBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci1wcm9jIGRvX2g4MzAwc19iaXRvcHMxIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczFzLnM6IGg4MzAwcyBiaXRvcHMgdGVzdHMgIzEiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHMxcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3NjAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzYwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNzIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdEMDA3MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgN0Y0MDcyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3MjAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzIwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNjI5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDdEMDA2MjkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgN0Y0MDYyOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYSA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2MjkwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNjI5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDggNzY4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRhIDdDMDA3NjgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGUgN0U0MDc2ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MiA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3NjgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1OCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzY4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjAgNzc4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDYyIDdDMDA3NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjYgN0U0MDc3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2YSA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3NzgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA3MCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzc4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2JpdG9wczIge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzMnMuczogaDgzMDBzIGJpdG9wcyB0ZXN0cyAjMiIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczJzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3NDg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0MwMDc0ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RTQwNzQ4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzc0ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3NDgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCA2Nzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0QwMDY3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3RjQwNjc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDZBMTgwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzY3ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDZBMzgwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA2NzgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCi0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDc1ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiA3QzAwNzU4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDdFNDA3NTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2EgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzU4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDc1ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDc3MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YSA3QzAwNzcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRlIDdFNDA3NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTIgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzcwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTggNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDc3MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDIwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19iaXRvcHMzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczNzLnM6IGg4MzAwcyBiaXRvcHMgdGVzdHMgIzMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHMzcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdEMDA3MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0Y0MDcxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3MTAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzEwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNjE5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdEMDA2MTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgN0Y0MDYxOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2MTkwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNjE5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNzAwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDdEMDA3MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgN0Y0MDcwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYSA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3MDAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzAwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDggNjA5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRhIDdEMDA2MDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGUgN0Y0MDYwOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MiA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2MDkwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1OCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNjA5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2JpdG9wczQge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzNHMuczogaDgzMDBzIGJpdG9wcyB0ZXN0cyAjNCIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczRzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3NDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0MwMDc0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RTQwNzQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzc0MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3NDAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCA2NzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0QwMDY3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3RjQwNjcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDZBMTgwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzY3MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDZBMzgwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA2NzAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCA3MzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgN0MwMDczMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiA3RTQwNzMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNhIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzczMDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQwIDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3MzAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0OCA2Mzk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGEgN0MwMDYzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0ZSA3RTQwNjM5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUyIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzYzOTAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU4IDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA2MzkwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2MCA3NTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjIgN0MwMDc1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2NiA3RTQwNzUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDZhIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzc1MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDcwIDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3NTAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfYnJhbmNoIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJyYW5jaHMuczogaDgzMDBzIGJyYW5jaCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJyYW5jaHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDU1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA1QzAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDVBMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNTkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDVCMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA1RTAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDVEMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA1RjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfY29tcGFyZSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb21wYXJlcy5zOiBoODMwMHMgY29tcGFyZSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNvbXBhcmVzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCBBODAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMUMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDc5MjAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMUQwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDdBMjAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAxRjgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfZGVjaW1hbCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkZWNpbWFscy5zOiBoODMwMHMgZGVjaW1hbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImRlY2ltYWxzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwRjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMUYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19pbmNkZWMge30gewotICAgIHNldCB0ZXN0bmFtZSAiaW5jZGVjcy5zOiBoODMwMHMgaW5jZGVjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiaW5jZGVjcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMUEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFCNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAxQkQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgMUI3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDFCRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSAwQTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgMEI1MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDBCRDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwQjcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMEJGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfZGl2bXVsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRpdm11bHMuczogaDgzMDBzIGRpdm11bCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImRpdm11bHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDUxODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA1MzAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMDFEMDUxODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMUQwNTMwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDUwODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA1MjAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDFDMDUwODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAwMUMwNTIwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19taXNjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1pc2NzLnM6IGg4MzAwcyBtaXNjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibWlzY3MucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDdCNUM1OThGXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgN0JENDU5OEZcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwNzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMDMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDAxNDEwNzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDMxOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDAxNDA2OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgMDE0MDZGMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDAxNDA3ODAwXFteXG5cXSpcbiArXFswLTlcXSsgKzZCMjAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiAwMTQwNkQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDAxNDA2QjAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCAwMTQwNkIyMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM4IDAxNDE2OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2MgMDE0MTZGMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQyIDAxNDE3ODAwXFteXG5cXSpcbiArXFswLTlcXSsgKzZCMjAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YyAwMTQxNkQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUwIDAxNDE2QjAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1NiAwMTQxNkIyMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDVlIDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2MCA1NjcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjIgNTQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDY0IDAxODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2NiAwMjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjggMDIxOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDZhIDAxNDA2OTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNmUgMDE0MDZGODBcW15cblxdKlxuICtcWzAtOVxdKyArMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDc0IDAxNDA3ODAwXFteXG5cXSpcbiArXFswLTlcXSsgKzZCQTAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA3ZSAwMTQwNkQ4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDgyIDAxNDA2QjgwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA4OCAwMTQwNkJBMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDkwIDAxNDE2OTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwOTQgMDE0MTZGODBcW15cblxdKlxuICtcWzAtOVxdKyArMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDlhIDAxNDE3ODAwXFteXG5cXSpcbiArXFswLTlcXSsgKzZCQTAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDBhNCAwMTQxNkQ4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMGE4IDAxNDE2QjgwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDBhZSAwMTQxNkJBMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAzNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQotICAgIHNldHVwX3hmYWlsICJoODMwMCotKi0qIgotICAgIGZhaWwgImg4MzAwcyBtb3ZmcGUvbW92dHBlIHRlc3RzIgotfQotCi1wcm9jIGRvX2g4MzAwc19tb3ZiIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmJzLnM6IGg4MzAwcyBtb3ZiIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92YnMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBDODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiBGODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNjgxOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDZFMTgwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNzgxMDZBMjhcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA2QzE4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMjgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDZBMDgwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNkEyODAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDY4OThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2RTk4MDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDc4MTA2QUE4XFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgNkM5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDM4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiA2QTg4MDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDZBQTgwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX21vdncge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92d3MuczogaDgzMDBzIG1vdncgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3Z3cy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEQwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDc5MDAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNjkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDZGMTAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNzgxMDZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA2RDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgNkIwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgNjk5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDZGOTAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgNzgxMDZCQTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSA2RDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNkI4MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCA2QkEwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi0KLXByb2MgZG9faDgzMDBzX21vdmwge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92bHMuczogaDgzMDBzIG1vdmwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3Zscy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEY4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdBMDAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMTAwNjkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDAxMDA2RjEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAwMTAwNzgxMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgMDEwMDZEMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCAwMTAwNkIwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgMDEwMDZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSAwMTAwNjk5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDAxMDA2RjkwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCAwMTAwNzg5MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QkEwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDIgMDEwMDZEOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NiAwMTAwNkI4MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGMgMDEwMDZCQTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX3B1c2hwb3Age30gewotICAgIHNldCB0ZXN0bmFtZSAicHVzaHBvcHMuczogaDgzMDBzIHB1c2hwb3AgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJwdXNocG9wcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNkQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDAxMDA2RDcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDAxMDA2REYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX3JvdGF0ZV9zaGlmdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJyb3RzaHMuczogaDgzMDBzIHJvdGF0ZSBhbmQgc2hpZnQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJyb3RzaHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDEyODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxMkM4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMTI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDEyRDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAxMkIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMTJGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDEzODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAxM0M4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMTM5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDEzRDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAxM0IwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgMTNGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDEyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSAxMjQ4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgMTIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDEyNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCAxMjMwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgMTI3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDEzMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiAxMzQ4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggMTMxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDEzNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYyAxMzMwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgMTM3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDEwODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiAxMEM4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgMTA5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDEwRDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCAxMEIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2EgMTBGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDExODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzZSAxMUM4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgMTE5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQyIDExRDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NCAxMUIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDYgMTFGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDEwMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YSAxMDQ4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGMgMTAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRlIDEwNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MCAxMDMwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTIgMTA3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU0IDExMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1NiAxMTQ4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTggMTExMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDVhIDExNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1YyAxMTMwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNWUgMTE3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA0OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfZXh0ZW5kIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImV4dGVuZHMuczogaDgzMDBzIGV4dGVuZCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImV4dGVuZHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDE3RDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxN0YwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMTc1MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDE3NzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfbWFjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1hY3MuczogaDgzMDBzIG1hYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1hY3MucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDAxQTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwMzIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMDMzMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDAxNjA2RDAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMDIyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDAyMzFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfbXVsdGlwbGUge30gewotICAgIHNldCB0ZXN0bmFtZSAibXVsdGlwbGVzLnM6IGg4MzAwcyBtdWx0aXBsZSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm11bHRpcGxlcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMDExMDZENzFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAwMTIwNkQ3MlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDAxMzA2RDczXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgMDExMDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwMTIwNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDAxMzA2REYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX21vdjMyYnVnIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdjMyYnVnLnM6IGg4MzAwaCBtb3YzMmJ1ZyB0ZXN0IgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgIm1vdjMyYnVnLnMiICIiICJQcm9wZXIgcmVsb2NhdGlvbiBmb3IgbW92LmwgKHBhcnQgMSkiXSB0aGVuIHsKLSAgICAgICAgb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICIwMDAwMDAwMlxbXlxuXF0qMzJcW15cblxdKl9hLjB4MCo4OGNhNmMwMFxbXlxuXF0qXG4iCi0JCQkJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJdGltZW91dCAJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBvYmpkdW1wX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLWlmIFtpc3RhcmdldCBoODMwMCotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGg4MzAwIGluc3RydWN0aW9uIHBhcnNlcgotICAgIGRvX2g4MzAwX2FkZF9zdWIKLSAgICBkb19oODMwMF9sb2dpY2FsCi0gICAgZG9faDgzMDBfY2JyYW5jaAotICAgIGRvX2g4MzAwX2JpdG9wczEKLSAgICBkb19oODMwMF9iaXRvcHMyCi0gICAgZG9faDgzMDBfYml0b3BzMwotICAgIGRvX2g4MzAwX2JpdG9wczQKLSAgICBkb19oODMwMF9icmFuY2gKLSAgICBkb19oODMwMF9jb21wYXJlCi0gICAgZG9faDgzMDBfZGVjaW1hbAotICAgIGRvX2g4MzAwX2luY2RlYwotICAgIGRvX2g4MzAwX2Rpdm11bAotICAgIGRvX2g4MzAwX21pc2MKLSAgICBkb19oODMwMF9tb3ZiCi0gICAgZG9faDgzMDBfbW92dwotICAgIGRvX2g4MzAwX3B1c2hwb3AKLSAgICBkb19oODMwMF9yb3RhdGVfc2hpZnQKLQotICAgICMgTm93IHRlc3QgdGhlIGg4MzAwaCBpbnN0cnVjdGlvbiBwYXJzZXIKLSAgICBkb19oODMwMGhfYWRkX3N1YgotICAgIGRvX2g4MzAwaF9sb2dpY2FsCi0gICAgZG9faDgzMDBoX2NicmFuY2gKLSAgICBkb19oODMwMGhfYml0b3BzMQotICAgIGRvX2g4MzAwaF9iaXRvcHMyCi0gICAgZG9faDgzMDBoX2JpdG9wczMKLSAgICBkb19oODMwMGhfYml0b3BzNAotICAgIGRvX2g4MzAwaF9icmFuY2gKLSAgICBkb19oODMwMGhfY29tcGFyZQotICAgIGRvX2g4MzAwaF9kZWNpbWFsCi0gICAgZG9faDgzMDBoX2luY2RlYwotICAgIGRvX2g4MzAwaF9kaXZtdWwKLSAgICBkb19oODMwMGhfbWlzYwotICAgIGRvX2g4MzAwaF9tb3ZiCi0gICAgZG9faDgzMDBoX21vdncKLSAgICBkb19oODMwMGhfbW92bAotICAgIGRvX2g4MzAwX3B1c2hwb3AKLSAgICBkb19oODMwMGhfcm90YXRlX3NoaWZ0Ci0gICAgZG9faDgzMDBoX2V4dGVuZAotCi0gICAgIyBOb3cgdGVzdCB0aGUgaDgzMDBzIGluc3RydWN0aW9uIHBhcnNlcgotICAgIGRvX2g4MzAwc19hZGRfc3ViCi0gICAgZG9faDgzMDBzX2xvZ2ljYWwKLSAgICBkb19oODMwMHNfY2JyYW5jaAotICAgIGRvX2g4MzAwc19iaXRvcHMxCi0gICAgZG9faDgzMDBzX2JpdG9wczIKLSAgICBkb19oODMwMHNfYml0b3BzMwotICAgIGRvX2g4MzAwc19iaXRvcHM0Ci0gICAgZG9faDgzMDBzX2JyYW5jaAotICAgIGRvX2g4MzAwc19jb21wYXJlCi0gICAgZG9faDgzMDBzX2RlY2ltYWwKLSAgICBkb19oODMwMHNfaW5jZGVjCi0gICAgZG9faDgzMDBzX2Rpdm11bAotICAgIGRvX2g4MzAwc19taXNjCi0gICAgZG9faDgzMDBzX21vdmIKLSAgICBkb19oODMwMHNfbW92dwotICAgIGRvX2g4MzAwc19tb3ZsCi0gICAgZG9faDgzMDBfcHVzaHBvcAotICAgIGRvX2g4MzAwc19yb3RhdGVfc2hpZnQKLSAgICBkb19oODMwMHNfZXh0ZW5kCi0gICAgZG9faDgzMDBzX21hYwotICAgIGRvX2g4MzAwc19tdWx0aXBsZQotCi0gICAgZG9faDgzMDBoX21vdjMyYnVnCi0KLSAgICAjIE5vdyBzb21lIHJhbmRvbSB0ZXN0cwotICAgIHNldCBzdnI0cGljIFtleHByIFtpc3RhcmdldCAqLSotZWxmKl0gfHwgW2lzdGFyZ2V0ICotKi1pcml4NSpdIF0KLSAgICBzZXQgZW1waWMgW2V4cHIgW2lzdGFyZ2V0ICotKi1lY29mZipdIHx8IFtpc3RhcmdldCAqLSotdWx0cml4Kl0gfHwgW2lzdGFyZ2V0ICotKi1pcml4XFsxLTRcXSpdIF0KLSAgICBzZXQgYW91dCBbZXhwciBbaXN0YXJnZXQgKi0qLWJzZCpdIHx8IFtpc3RhcmdldCAqLSotbmV0YnNkKl1dCi0KLSAgICBydW5fZHVtcF90ZXN0ICJmZnh4MSIKLSAgICBnYXNfdGVzdCAiY21wc2kyLnMiICIiICIiICJjbXBzaTIucyIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MTg4MjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotaDgzMDBfaW5jZGVjOgotCWRlYyByMGwKLQlpbmMgcjBsCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlY2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlY2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI5M2ZjNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWNoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfaW5jZGVjOgotCWRlYy5iIHIwbAotCWRlYy53ICMxLHIwCi0JZGVjLncgIzIscjAKLQlkZWMubCAjMSxlcjAKLQlkZWMubCAjMixlcjAKLQlpbmMuYiByMGwKLQlpbmMudyAjMSxyMAotCWluYy53ICMyLHIwCi0JaW5jLmwgIzEsZXIwCi0JaW5jLmwgIzIsZXIwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlY3MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlY3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NTcwOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWNzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfaW5jZGVjOgotCWRlYy5iIHIwbAotCWRlYy53ICMxLHIwCi0JZGVjLncgIzIscjAKLQlkZWMubCAjMSxlcjAKLQlkZWMubCAjMixlcjAKLQlpbmMuYiByMGwKLQlpbmMudyAjMSxyMAotCWluYy53ICMyLHIwCi0JaW5jLmwgIzEsZXIwCi0JaW5jLmwgIzIsZXIwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y3ZTNiNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2FsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0JLnRleHQKLWg4MzAwX2xvZ2ljYWw6Ci0JYW5kICMxNixyMWwKLQlhbmQgcjFsLHIxaAotCWFuZGMgIzE2LGNjcgotCW9yICMxNixyMGwKLQlvciByMWwscjBsCi0Jb3JjICMxNixjY3IKLQl4b3IgIzE2LHIwbAotCXhvciByMGwscjFsCi0JeG9yYyAjMTYsY2NyCi0JbmVnIHIwbAotCW5vdCByMGwKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWxoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOTVmMTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbGgucworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9sb2dpY2FsOgotCWFuZC5iICMxNixyMWwKLQlhbmQuYiByMWwscjFoCi0JYW5kLncgIzMyLHIxCi0JYW5kLncgcjEscjEKLQlhbmQubCAjNjQsZXIxCi0JYW5kLmwgZXIxLGVyMQotCWFuZGMgIzE2LGNjcgotCW9yLmIgIzE2LHIwbAotCW9yLmIgcjFsLHIwbAotCW9yLncgIzMyLHIxCi0Jb3IudyByMSxyMQotCW9yLmwgIzY0LGVyMQotCW9yLmwgZXIxLGVyMQotCW9yYyAjMTYsY2NyCi0JeG9yLmIgIzE2LHIwbAotCXhvci5iIHIwbCxyMWwKLQl4b3IudyAjMzIscjEKLQl4b3IudyByMSxyMQotCXhvci5sICM2NCxlcjEKLQl4b3IubCBlcjEsZXIxCi0JeG9yYyAjMTYsY2NyCi0JbmVnLmIgcjBsCi0JbmVnLncgcjAKLQluZWcubCBlcjAKLQlub3QuYiByMGwKLQlub3QudyByMAotCW5vdC5sIGVyMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2Fscy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjNGNiYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2Fscy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2xvZ2ljYWw6Ci0JYW5kLmIgIzE2LHIxbAotCWFuZC5iIHIxbCxyMWgKLQlhbmQudyAjMzIscjEKLQlhbmQudyByMSxyMQotCWFuZC5sICM2NCxlcjEKLQlhbmQubCBlcjEsZXIxCi0JYW5kYyAjMTYsY2NyCi0JYW5kYyAjMTYsZXhyCi0Jb3IuYiAjMTYscjBsCi0Jb3IuYiByMWwscjBsCi0Jb3IudyAjMzIscjEKLQlvci53IHIxLHIxCi0Jb3IubCAjNjQsZXIxCi0Jb3IubCBlcjEsZXIxCi0Jb3JjICMxNixjY3IKLQlvcmMgIzE2LGV4cgotCXhvci5iICMxNixyMGwKLQl4b3IuYiByMGwscjFsCi0JeG9yLncgIzMyLHIxCi0JeG9yLncgcjEscjEKLQl4b3IubCAjNjQsZXIxCi0JeG9yLmwgZXIxLGVyMQotCXhvcmMgIzE2LGNjcgotCXhvcmMgIzE2LGV4cgotCW5lZy5iIHIwbAotCW5lZy53IHIwCi0JbmVnLmwgZXIwCi0Jbm90LmIgcjBsCi0Jbm90LncgcjAKLQlub3QubCBlcjAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWFjcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWFjcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmRmNmRkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21hY3MucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19tYWM6Ci0JY2xybWFjCi0JbGRtYWMgZXIwLG1hY2gKLQlsZG1hYyBlcjEsbWFjbAotCW1hYyBAZXIwKyxAZXIxKwotCXN0bWFjIG1hY2gsZXIwCi0Jc3RtYWMgbWFjbCxlcjEKLQkKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjZmODA4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2MucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQkudGV4dAotaDgzMDBfbWlzYzoKLQllZXBtb3YKLQlsZGMgIzAsY2NyCi0JbGRjIHIwbCxjY3IKLTsJbW92ZnBlIDE2OjE2LHIwbAotOwltb3Z0cGUgcjBsLDE2OjE2Ci0Jbm9wCi0JcnRlCi0JcnRzCi0Jc2xlZXAKLQlzdGMgY2NyLHIwbAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzY2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlY2IzZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX21pc2M6Ci0JZWVwbW92LmIKLSAJZWVwbW92LncKLQlsZGMuYiAjMCxjY3IKLQlsZGMuYiByMGwsY2NyCi0JbGRjLncgQGVyMCxjY3IKLQlsZGMudyBAKDE2OjE2LGVyMCksY2NyCi0JbGRjLncgQCgzMjoyNCxlcjApLGNjcgotCWxkYy53IEBlcjArLGNjcgotCWxkYy53IEBoODMwMGhfbWlzYzoxNixjY3IKLQlsZGMudyBAaDgzMDBoX21pc2M6MjQsY2NyCi07CW1vdmZwZSAxNjoxNixyMGwKLTsJbW92dHBlIHIwbCwxNjoxNgotCW5vcAotCXJ0ZQotCXJ0cwotCXNsZWVwCi0Jc3RjLmIgY2NyLHIwbAotCXN0Yy53IGNjcixAZXIwCi0Jc3RjLncgY2NyLEAoMTY6MTYsZXIwKQotCXN0Yy53IGNjcixAKDMyOjI0LGVyMCkKLQlzdGMudyBjY3IsQC1lcjAKLQlzdGMudyBjY3IsQGg4MzAwaF9taXNjOjE2Ci0Jc3RjLncgY2NyLEBoODMwMGhfbWlzYzoyNAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzY3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3YTE3Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX21pc2M6Ci0JZWVwbW92LmIKLSAJZWVwbW92LncKLQlsZGMuYiAjMCxjY3IKLQlsZGMuYiByMGwsY2NyCi0JbGRjLmIgIzAsZXhyCi0JbGRjLmIgcjBsLGV4cgotCWxkYy53IEBlcjAsY2NyCi0JbGRjLncgQCgxNjoxNixlcjApLGNjcgotCWxkYy53IEAoMzI6MzIsZXIwKSxjY3IKLQlsZGMudyBAZXIwKyxjY3IKLQlsZGMudyBAaDgzMDBzX21pc2M6MTYsY2NyCi0JbGRjLncgQGg4MzAwc19taXNjOjMyLGNjcgotCWxkYy53IEBlcjAsZXhyCi0JbGRjLncgQCgxNjoxNixlcjApLGV4cgotCWxkYy53IEAoMzI6MzIsZXIwKSxleHIKLQlsZGMudyBAZXIwKyxleHIKLQlsZGMudyBAaDgzMDBzX21pc2M6MTYsZXhyCi0JbGRjLncgQGg4MzAwc19taXNjOjMyLGV4cgotOwltb3ZmcGUgMTY6MTYscjBsCi07CW1vdnRwZSByMGwsMTY6MTYKLQlub3AKLQlydGUKLQlydHMKLQlzbGVlcAotCXN0Yy5iIGNjcixyMGwKLQlzdGMuYiBleHIscjBsCi0Jc3RjLncgY2NyLEBlcjAKLQlzdGMudyBjY3IsQCgxNjoxNixlcjApCi0Jc3RjLncgY2NyLEAoMzI6MzIsZXIwKQotCXN0Yy53IGNjcixALWVyMAotCXN0Yy53IGNjcixAaDgzMDBzX21pc2M6MTYKLQlzdGMudyBjY3IsQGg4MzAwc19taXNjOjMyCi0Jc3RjLncgZXhyLEBlcjAKLQlzdGMudyBleHIsQCgxNjoxNixlcjApCi0Jc3RjLncgZXhyLEAoMzI6MzIsZXIwKQotCXN0Yy53IGV4cixALWVyMAotCXN0Yy53IGV4cixAaDgzMDBzX21pc2M6MTYKLQlzdGMudyBleHIsQGg4MzAwc19taXNjOjMyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3YzMmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92MzJidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzOTNlMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3YzMmJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0JLmg4MzAwaAotCS5nbG9iYWwgX2EKLWJsYWg6Ci0JbW92LmwgICAjX2EtMjAwMDAwMDAwMCxlcjIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEwNDBjMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZiLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLnRleHQKLWg4MzAwX21vdmI6Ci0JbW92LmIgcjBsLHIxbAotCW1vdi5iICMxNixyMGwKLQltb3YuYiBAcjEscjBsCi0JbW92LmIgQCgxNjoxNixyMSkscjBsCi0JbW92LmIgQHIxKyxyMGwKLQltb3YuYiBAMTY6OCxyMGwKLQltb3YuYiBAaDgzMDBfbW92YjoxNixyMGwKLQltb3YuYiByMGwsQHIxCi0JbW92LmIgcjBsLEAoMTY6MTYscjEpCi0JbW92LmIgcjBsLEAtcjEKLQltb3YuYiByMGwsQDE2OjgKLQltb3YuYiByMGwsQGg4MzAwX21vdmI6MTYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92YmgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmJoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNzExZjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92YmgucworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9tb3ZiOgotCW1vdi5iIHIwbCxyMWwKLQltb3YuYiAjMTYscjBsCi0JbW92LmIgQGVyMSxyMGwKLQltb3YuYiBAKDE2OjE2LGVyMSkscjBsCi0JbW92LmIgQCgzMjoyNCxlcjEpLHIwbAotCW1vdi5iIEBlcjErLHIwbAotCW1vdi5iIEAxNjo4LHIwbAotCW1vdi5iIEBoODMwMGhfbW92YjoxNixyMGwKLQltb3YuYiBAaDgzMDBoX21vdmI6MjQscjBsCi0JbW92LmIgcjBsLEBlcjEKLQltb3YuYiByMGwsQCgxNjoxNixlcjEpCi0JbW92LmIgcjBsLEAoMzI6MjQsZXIxKQotCW1vdi5iIHIwbCxALWVyMQotCW1vdi5iIHIwbCxAMTY6OAotCW1vdi5iIHIwbCxAaDgzMDBoX21vdmI6MTYKLQltb3YuYiByMGwsQGg4MzAwaF9tb3ZiOjI0Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmJzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Zicy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjUwMDJjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmJzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfbW92YjoKLQltb3YuYiByMGwscjFsCi0JbW92LmIgIzE2LHIwbAotCW1vdi5iIEBlcjEscjBsCi0JbW92LmIgQCgxNjoxNixlcjEpLHIwbAotCW1vdi5iIEAoMzI6MzIsZXIxKSxyMGwKLQltb3YuYiBAZXIxKyxyMGwKLQltb3YuYiBAMTY6OCxyMGwKLQltb3YuYiBAaDgzMDBzX21vdmI6MTYscjBsCi0JbW92LmIgQGg4MzAwc19tb3ZiOjMyLHIwbAotCW1vdi5iIHIwbCxAZXIxCi0JbW92LmIgcjBsLEAoMTY6MTYsZXIxKQotCW1vdi5iIHIwbCxAKDMyOjMyLGVyMSkKLQltb3YuYiByMGwsQC1lcjEKLQltb3YuYiByMGwsQDE2OjgKLQltb3YuYiByMGwsQGg4MzAwc19tb3ZiOjE2Ci0JbW92LmIgcjBsLEBoODMwMHNfbW92YjozMgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZsaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92bGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjNzhlOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZsaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX21vdmw6Ci0JbW92LmwgZXIwLGVyMQotCW1vdi5sICM2NCxlcjAKLQltb3YubCBAZXIxLGVyMAotCW1vdi5sIEAoMTY6MTYsZXIxKSxlcjAKLQltb3YubCBAKDMyOjI0LGVyMSksZXIwCi0JbW92LmwgQGVyMSssZXIwCi0JbW92LmwgQGg4MzAwaF9tb3ZsOjE2LGVyMAotCW1vdi5sIEBoODMwMGhfbW92bDoyNCxlcjAKLQltb3YubCBlcjAsQGVyMQotCW1vdi5sIGVyMCxAKDE2OjE2LGVyMSkKLQltb3YubCBlcjAsQCgzMjoyNCxlcjEpCi0JbW92LmwgZXIwLEAtZXIxCi0JbW92LmwgZXIwLEBoODMwMGhfbW92bDoxNgotCW1vdi5sIGVyMCxAaDgzMDBoX21vdmw6MjQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92bHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmxzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NDM3NjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92bHMucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19tb3ZsOgotCW1vdi5sIGVyMCxlcjEKLQltb3YubCAjNjQsZXIwCi0JbW92LmwgQGVyMSxlcjAKLQltb3YubCBAKDE2OjE2LGVyMSksZXIwCi0JbW92LmwgQCgzMjozMixlcjEpLGVyMAotCW1vdi5sIEBlcjErLGVyMAotCW1vdi5sIEBoODMwMHNfbW92bDoxNixlcjAKLQltb3YubCBAaDgzMDBzX21vdmw6MzIsZXIwCi0JbW92LmwgZXIwLEBlcjEKLQltb3YubCBlcjAsQCgxNjoxNixlcjEpCi0JbW92LmwgZXIwLEAoMzI6MzIsZXIxKQotCW1vdi5sIGVyMCxALWVyMQotCW1vdi5sIGVyMCxAaDgzMDBzX21vdmw6MTYKLQltb3YubCBlcjAsQGg4MzAwc19tb3ZsOjMyCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdncucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdncucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjNjRmOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0JLnRleHQKLWg4MzAwX21vdnc6Ci0JbW92LncgcjAscjEKLQltb3YudyAjMTYscjAKLQltb3YudyBAcjEscjAKLQltb3YudyBAKDE2OjE2LHIxKSxyMAotCW1vdi53IEByMSsscjAKLQltb3YudyBAaDgzMDBfbW92dzoxNixyMAotCW1vdi53IHIwLEByMQotCW1vdi53IHIwLEAoMTY6MTYscjEpCi0JbW92LncgcjAsQC1yMQotCW1vdi53IHIwLEBoODMwMF9tb3Z3OjE2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdndoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3aC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTUwNTdjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdndoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfbW92dzoKLQltb3YudyByMCxyMQotCW1vdi53ICMxNixyMAotCW1vdi53IEBlcjEscjAKLQltb3YudyBAKDE2OjE2LGVyMSkscjAKLQltb3YudyBAKDMyOjI0LGVyMSkscjAKLQltb3YudyBAZXIxKyxyMAotCW1vdi53IEBoODMwMGhfbW92dzoxNixyMAotCW1vdi53IEBoODMwMGhfbW92dzoyNCxyMAotCW1vdi53IHIwLEBlcjEKLQltb3YudyByMCxAKDE2OjE2LGVyMSkKLQltb3YudyByMCxAKDMyOjI0LGVyMSkKLQltb3YudyByMCxALWVyMQotCW1vdi53IHIwLEBoODMwMGhfbW92dzoxNgotCW1vdi53IHIwLEBoODMwMGhfbW92dzoyNAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3cy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92d3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmMjFkZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3cy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX21vdnc6Ci0JbW92LncgcjAscjEKLQltb3YudyAjMTYscjAKLQltb3YudyBAZXIxLHIwCi0JbW92LncgQCgxNjoxNixlcjEpLHIwCi0JbW92LncgQCgzMjozMixlcjEpLHIwCi0JbW92LncgQGVyMSsscjAKLQltb3YudyBAaDgzMDBzX21vdnc6MTYscjAKLQltb3YudyBAaDgzMDBzX21vdnc6MzIscjAKLQltb3YudyByMCxAZXIxCi0JbW92LncgcjAsQCgxNjoxNixlcjEpCi0JbW92LncgcjAsQCgzMjozMixlcjEpCi0JbW92LncgcjAsQC1lcjEKLQltb3YudyByMCxAaDgzMDBzX21vdnc6MTYKLQltb3YudyByMCxAaDgzMDBzX21vdnc6MzIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbXVsdGlwbGVzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tdWx0aXBsZXMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwNzliNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tdWx0aXBsZXMucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19tdWx0aXBsZToKLQlsZG0ubCBAc3ArLGVyMC1lcjEKLQlsZG0ubCBAc3ArLGVyMC1lcjIKLQlsZG0ubCBAc3ArLGVyMC1lcjMKLQlzdG0ubCBlcjAtZXIxLEAtc3AKLQlzdG0ubCBlcjAtZXIyLEAtc3AKLQlzdG0ubCBlcjAtZXIzLEAtc3AKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDFiNzM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3AucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9wdXNoX3BvcDoKLQlwb3AgcjAKLQlwdXNoIHIwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3BoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9waC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQ5NjM5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3BoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9wdXNoX3BvcDoKLQlwb3AudyByMAotCXBvcC5sIGVyMAotCXB1c2gudyByMAotCXB1c2gubCBlcjAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3BzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWRmMDQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcHMucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX3B1c2hfcG9wOgotCXBvcC53IHIwCi0JcG9wLmwgZXIwCi0JcHVzaC53IHIwCi0JcHVzaC5sIGVyMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlhYTg3ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9yb3RhdGVfc2hpZnQ6Ci0Jcm90bCByMGwKLQlyb3RyIHIwbAotCXJvdHhsIHIwbAotCXJvdHhyIHIwbAotCXNoYWwgcjBsCi0Jc2hhciByMGwKLQlzaGxsIHIwbAotCXNobHIgcjBsCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNoaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2hoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YWJlNDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2hoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfcm90YXRlX3NoaWZ0OgotCXJvdGwuYiByMGwKLQlyb3RsLncgcjAKLQlyb3RsLmwgZXIwCi0Jcm90ci5iIHIwbAotCXJvdHIudyByMAotCXJvdHIubCBlcjAKLQlyb3R4bC5iIHIwbAotCXJvdHhsLncgcjAKLQlyb3R4bC5sIGVyMAotCXJvdHhyLmIgcjBsCi0Jcm90eHIudyByMAotCXJvdHhyLmwgZXIwCi0Jc2hhbC5iIHIwbAotCXNoYWwudyByMAotCXNoYWwubCBlcjAKLQlzaGFyLmIgcjBsCi0Jc2hhci53IHIwCi0Jc2hhci5sIGVyMAotCXNobGwuYiByMGwKLQlzaGxsLncgcjAKLQlzaGxsLmwgZXIwCi0Jc2hsci5iIHIwbAotCXNobHIudyByMAotCXNobHIubCBlcjAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNocy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2hzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YzQxY2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2hzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfcm90YXRlX3NoaWZ0OgotCXJvdGwuYiByMGwKLQlyb3RsLmIgIzIscjBsCi0Jcm90bC53IHIwCi0Jcm90bC53ICMyLHIwCi0Jcm90bC5sIGVyMAotCXJvdGwubCAjMixlcjAKLQlyb3RyLmIgcjBsCi0Jcm90ci5iICMyLHIwbAotCXJvdHIudyByMAotCXJvdHIudyAjMixyMAotCXJvdHIubCBlcjAKLQlyb3RyLmwgIzIsZXIwCi0Jcm90eGwuYiByMGwKLQlyb3R4bC5iICMyLHIwbAotCXJvdHhsLncgcjAKLQlyb3R4bC53ICMyLHIwCi0Jcm90eGwubCBlcjAKLQlyb3R4bC5sICMyLGVyMAotCXJvdHhyLmIgcjBsCi0Jcm90eHIuYiAjMixyMGwKLQlyb3R4ci53IHIwCi0Jcm90eHIudyAjMixyMAotCXJvdHhyLmwgZXIwCi0Jcm90eHIubCAjMixlcjAKLQlzaGFsLmIgcjBsCi0Jc2hhbC5iICMyLHIwbAotCXNoYWwudyByMAotCXNoYWwudyAjMixyMAotCXNoYWwubCBlcjAKLQlzaGFsLmwgIzIsZXIwCi0Jc2hhci5iIHIwbAotCXNoYXIuYiAjMixyMGwKLQlzaGFyLncgcjAKLQlzaGFyLncgIzIscjAKLQlzaGFyLmwgZXIwCi0Jc2hhci5sICMyLGVyMAotCXNobGwuYiByMGwKLQlzaGxsLmIgIzIscjBsCi0Jc2hsbC53IHIwCi0Jc2hsbC53ICMyLHIwCi0Jc2hsbC5sIGVyMAotCXNobGwubCAjMixlcjAKLQlzaGxyLmIgcjBsCi0Jc2hsci5iICMyLHIwbAotCXNobHIudyByMAotCXNobHIudyAjMixyMAotCXNobHIubCBlcjAKLQlzaGxyLmwgIzIsZXIwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL1JFQURNRSBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmIxNzRhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotTm90ZXMgb24gaG93IHRoZSBIUFBBIHRlc3RzdWl0ZSBpcyBvcmdhbml6ZWQ6Ci0KLWJhc2ljLnBhcnNlIC0tIHRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBwYXJzaW5nCi10ZXN0cyBhbmQgYSBzaW1wbGUgLnN0YWIgcGFyc2luZyB0ZXN0LiAgVGhpcyB3b3VsZCBiZSB3aGVyZSB5b3UnZAotYWRkIGNvZGUgdG8gbWFrZSBzdXJlIG5ldyBpbnN0cnVjdGlvbnMgYXJlIHBhcnNlZCBjb3JyZWN0bHksIG5ldwotY29tcGxldGVycyAoc3VjaCBhcyBjYWNoZSBoaXRzKSBhcmUgcGFyc2VkIGNvcnJlY3RseSwgZXRjLgotCi1JdCdzIGFsc28gYSByZWFzb25hYmxlIHBsYWNlIHRvIG1ha2Ugc3VyZSBwYXJzaW5nIG9mIHRoZSB2YXJpb3VzCi1hc3NlbWJsZXIgZGlyZWN0aXZlcyBpcyBoYW5kbGVkIGNvcnJlY3RseS4gIElmIHlvdSdyZSBnb2luZyB0byBhZGQKLXN1Y2ggY29kZSwgdHJ5IHRvIGJlIHJlYXNvbmFibHkgY29tcGxldGUuICBBZGQgdGVzdCBjb2RlIGZvciBlYWNoCi1iYXNpYyBkaXJlY3RpdmUgYW5kIHRlc3QgYWxsIChvciBhIG5vdGV3b3J0aHkpIHN1YnNldCBvZiBhcmd1bWVudHMuCi0KLUl0IHNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSB0byBoYXZlIGFuIGFzc2VtYmxlciB0byBydW4gdGhlc2UgdGVzdHM7Ci1jYWxsaW5nIG9iamR1bXBfc3RhcnQgb3Igc29tZXRoaW5nIHNpbWlsYXIgc2hvdWxkIG5vdCBiZSBkb25lIGZyb20KLXRoaXMgZGlyZWN0b3J5LgotCi0KLW1vcmUucGFyc2UgLS0gdGhpcyBpcyB3aGVyZSB5b3Ugc2hvdWxkIHB1dCBhZGRpdGlvbmFsIHBhcnNpbmcgdGVzdHMsIHN1Y2gKLWFzIHRlc3RzIHRvIGNoZWNrIG1vZGUgc2VsZWN0b3IgcGFyc2luZywgc3RyaW5nIHBhcnNpbmcsIGV4cHJlc3Npb24gcGFyc2luZywKLWV0Yy4gIEl0J3MgYWxzbyBhIHJlYXNvbmFibGUgcGxhY2UgdG8gcHV0IHBhcnNpbmcgdGVzdHMgd2hpY2ggYXJlIG5vdCBjb21wbGV0ZQotZW5vdWdoICh3aGF0ZXZlciB0aGF0IG1lYW5zKSBmb3IgYmFzaWMucGFyc2UuICAKLQotSXQgc2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IHRvIGhhdmUgYW4gYXNzZW1ibGVyIHRvIHJ1biB0aGVzZSB0ZXN0czsKLWNhbGxpbmcgb2JqZHVtcF9zdGFydCBvciBzb21ldGhpbmcgc2ltaWxhciBzaG91bGQgbm90IGJlIGRvbmUgZnJvbQotdGhpcyBkaXJlY3RvcnkuCi0KLQotcmVsb2MgLS0gdGhpcyBpcyB3aGVyZSB5b3UgdGVzdHMgd2hpY2ggZXhhbWluZSByZWxvY2F0aW9ucyBwcm9kdWNlZAotYnkgR0FTIGJlbG9uZy4gIFRvIHJ1biB0aGVzZSB0ZXN0cyB5b3UgbXVzdCBoYXZlIGEgZnVuY3Rpb25pbmcgb2JqZHVtcC4KLQotCi11bnNvcnRlZCAtLSB0aGlzIGlzIHdoZXJlIGV2ZXJ5dGhpbmcgZWxzZSBnb2VzLiAgQXMgZ3JvdXBzIG9mIHJlbGF0ZWQgdGVzdHMKLWVuZCB1cCBpbiB0aGlzIGRpcmVjdG9yeSwgdGhleSBzaG91bGQgYmUgYnJva2VuIG91dCBpbnRvIGEgbmV3IGNsYXNzIG9mCi10ZXN0cy4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDFkNGNkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGFkZC9zaD9hZGQgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWFkZCAgJXI0LCVyNSwlcjYKLQlhZGQsPSAgJXI0LCVyNSwlcjYKLQlhZGQsPCAgJXI0LCVyNSwlcjYKLQlhZGQsPD0gICVyNCwlcjUsJXI2Ci0JYWRkLG51diAgJXI0LCVyNSwlcjYKLQlhZGQsem52ICAlcjQsJXI1LCVyNgotCWFkZCxzdiAgJXI0LCVyNSwlcjYKLQlhZGQsb2QgICVyNCwlcjUsJXI2Ci0JYWRkLHRyICAlcjQsJXI1LCVyNgotCWFkZCw8PiAgJXI0LCVyNSwlcjYKLQlhZGQsPj0gICVyNCwlcjUsJXI2Ci0JYWRkLD4gICVyNCwlcjUsJXI2Ci0JYWRkLHV2ICAlcjQsJXI1LCVyNgotCWFkZCx2bnogICVyNCwlcjUsJXI2Ci0JYWRkLG5zdiAgJXI0LCVyNSwlcjYKLQlhZGQsZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGRsICAlcjQsJXI1LCVyNgotCWFkZGwsPSAgJXI0LCVyNSwlcjYKLQlhZGRsLDwgICVyNCwlcjUsJXI2Ci0JYWRkbCw8PSAgJXI0LCVyNSwlcjYKLQlhZGRsLG51diAgJXI0LCVyNSwlcjYKLQlhZGRsLHpudiAgJXI0LCVyNSwlcjYKLQlhZGRsLHN2ICAlcjQsJXI1LCVyNgotCWFkZGwsb2QgICVyNCwlcjUsJXI2Ci0JYWRkbCx0ciAgJXI0LCVyNSwlcjYKLQlhZGRsLDw+ICAlcjQsJXI1LCVyNgotCWFkZGwsPj0gICVyNCwlcjUsJXI2Ci0JYWRkbCw+ICAlcjQsJXI1LCVyNgotCWFkZGwsdXYgICVyNCwlcjUsJXI2Ci0JYWRkbCx2bnogICVyNCwlcjUsJXI2Ci0JYWRkbCxuc3YgICVyNCwlcjUsJXI2Ci0JYWRkbCxldiAgJXI0LCVyNSwlcjYKLQotCWFkZG8gICVyNCwlcjUsJXI2Ci0JYWRkbyw9ICAlcjQsJXI1LCVyNgotCWFkZG8sPCAgJXI0LCVyNSwlcjYKLQlhZGRvLDw9ICAlcjQsJXI1LCVyNgotCWFkZG8sbnV2ICAlcjQsJXI1LCVyNgotCWFkZG8sem52ICAlcjQsJXI1LCVyNgotCWFkZG8sc3YgICVyNCwlcjUsJXI2Ci0JYWRkbyxvZCAgJXI0LCVyNSwlcjYKLQlhZGRvLHRyICAlcjQsJXI1LCVyNgotCWFkZG8sPD4gICVyNCwlcjUsJXI2Ci0JYWRkbyw+PSAgJXI0LCVyNSwlcjYKLQlhZGRvLD4gICVyNCwlcjUsJXI2Ci0JYWRkbyx1diAgJXI0LCVyNSwlcjYKLQlhZGRvLHZueiAgJXI0LCVyNSwlcjYKLQlhZGRvLG5zdiAgJXI0LCVyNSwlcjYKLQlhZGRvLGV2ICAlcjQsJXI1LCVyNgotCi0JYWRkYyAgJXI0LCVyNSwlcjYKLQlhZGRjLD0gICVyNCwlcjUsJXI2Ci0JYWRkYyw8ICAlcjQsJXI1LCVyNgotCWFkZGMsPD0gICVyNCwlcjUsJXI2Ci0JYWRkYyxudXYgICVyNCwlcjUsJXI2Ci0JYWRkYyx6bnYgICVyNCwlcjUsJXI2Ci0JYWRkYyxzdiAgJXI0LCVyNSwlcjYKLQlhZGRjLG9kICAlcjQsJXI1LCVyNgotCWFkZGMsdHIgICVyNCwlcjUsJXI2Ci0JYWRkYyw8PiAgJXI0LCVyNSwlcjYKLQlhZGRjLD49ICAlcjQsJXI1LCVyNgotCWFkZGMsPiAgJXI0LCVyNSwlcjYKLQlhZGRjLHV2ICAlcjQsJXI1LCVyNgotCWFkZGMsdm56ICAlcjQsJXI1LCVyNgotCWFkZGMsbnN2ICAlcjQsJXI1LCVyNgotCWFkZGMsZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGRjbyAgJXI0LCVyNSwlcjYKLQlhZGRjbyw9ICAlcjQsJXI1LCVyNgotCWFkZGNvLDwgICVyNCwlcjUsJXI2Ci0JYWRkY28sPD0gICVyNCwlcjUsJXI2Ci0JYWRkY28sbnV2ICAlcjQsJXI1LCVyNgotCWFkZGNvLHpudiAgJXI0LCVyNSwlcjYKLQlhZGRjbyxzdiAgJXI0LCVyNSwlcjYKLQlhZGRjbyxvZCAgJXI0LCVyNSwlcjYKLQlhZGRjbyx0ciAgJXI0LCVyNSwlcjYKLQlhZGRjbyw8PiAgJXI0LCVyNSwlcjYKLQlhZGRjbyw+PSAgJXI0LCVyNSwlcjYKLQlhZGRjbyw+ICAlcjQsJXI1LCVyNgotCWFkZGNvLHV2ICAlcjQsJXI1LCVyNgotCWFkZGNvLHZueiAgJXI0LCVyNSwlcjYKLQlhZGRjbyxuc3YgICVyNCwlcjUsJXI2Ci0JYWRkY28sZXYgICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZGkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDM2YjgwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkaS5zCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JYWRkaSAgMTIzLCVyNSwlcjYKLQlhZGRpLD0gIDEyMywlcjUsJXI2Ci0JYWRkaSw8ICAxMjMsJXI1LCVyNgotCWFkZGksPD0gIDEyMywlcjUsJXI2Ci0JYWRkaSxudXYgIDEyMywlcjUsJXI2Ci0JYWRkaSx6bnYgIDEyMywlcjUsJXI2Ci0JYWRkaSxzdiAgMTIzLCVyNSwlcjYKLQlhZGRpLG9kICAxMjMsJXI1LCVyNgotCWFkZGksdHIgIDEyMywlcjUsJXI2Ci0JYWRkaSw8PiAgMTIzLCVyNSwlcjYKLQlhZGRpLD49ICAxMjMsJXI1LCVyNgotCWFkZGksPiAgMTIzLCVyNSwlcjYKLQlhZGRpLHV2ICAxMjMsJXI1LCVyNgotCWFkZGksdm56ICAxMjMsJXI1LCVyNgotCWFkZGksbnN2ICAxMjMsJXI1LCVyNgotCWFkZGksZXYgIDEyMywlcjUsJXI2Ci0KLQlhZGRpbyAgMTIzLCVyNSwlcjYKLQlhZGRpbyw9ICAxMjMsJXI1LCVyNgotCWFkZGlvLDwgIDEyMywlcjUsJXI2Ci0JYWRkaW8sPD0gIDEyMywlcjUsJXI2Ci0JYWRkaW8sbnV2ICAxMjMsJXI1LCVyNgotCWFkZGlvLHpudiAgMTIzLCVyNSwlcjYKLQlhZGRpbyxzdiAgMTIzLCVyNSwlcjYKLQlhZGRpbyxvZCAgMTIzLCVyNSwlcjYKLQlhZGRpbyx0ciAgMTIzLCVyNSwlcjYKLQlhZGRpbyw8PiAgMTIzLCVyNSwlcjYKLQlhZGRpbyw+PSAgMTIzLCVyNSwlcjYKLQlhZGRpbyw+ICAxMjMsJXI1LCVyNgotCWFkZGlvLHV2ICAxMjMsJXI1LCVyNgotCWFkZGlvLHZueiAgMTIzLCVyNSwlcjYKLQlhZGRpbyxuc3YgIDEyMywlcjUsJXI2Ci0JYWRkaW8sZXYgIDEyMywlcjUsJXI2Ci0KLQlhZGRpdCAgMTIzLCVyNSwlcjYKLQlhZGRpdCw9ICAxMjMsJXI1LCVyNgotCWFkZGl0LDwgIDEyMywlcjUsJXI2Ci0JYWRkaXQsPD0gIDEyMywlcjUsJXI2Ci0JYWRkaXQsbnV2ICAxMjMsJXI1LCVyNgotCWFkZGl0LHpudiAgMTIzLCVyNSwlcjYKLQlhZGRpdCxzdiAgMTIzLCVyNSwlcjYKLQlhZGRpdCxvZCAgMTIzLCVyNSwlcjYKLQlhZGRpdCx0ciAgMTIzLCVyNSwlcjYKLQlhZGRpdCw8PiAgMTIzLCVyNSwlcjYKLQlhZGRpdCw+PSAgMTIzLCVyNSwlcjYKLQlhZGRpdCw+ICAxMjMsJXI1LCVyNgotCWFkZGl0LHV2ICAxMjMsJXI1LCVyNgotCWFkZGl0LHZueiAgMTIzLCVyNSwlcjYKLQlhZGRpdCxuc3YgIDEyMywlcjUsJXI2Ci0JYWRkaXQsZXYgIDEyMywlcjUsJXI2Ci0KLQlhZGRpdG8gIDEyMywlcjUsJXI2Ci0JYWRkaXRvLD0gIDEyMywlcjUsJXI2Ci0JYWRkaXRvLDwgIDEyMywlcjUsJXI2Ci0JYWRkaXRvLDw9ICAxMjMsJXI1LCVyNgotCWFkZGl0byxudXYgIDEyMywlcjUsJXI2Ci0JYWRkaXRvLHpudiAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sc3YgIDEyMywlcjUsJXI2Ci0JYWRkaXRvLG9kICAxMjMsJXI1LCVyNgotCWFkZGl0byx0ciAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sPD4gIDEyMywlcjUsJXI2Ci0JYWRkaXRvLD49ICAxMjMsJXI1LCVyNgotCWFkZGl0byw+ICAxMjMsJXI1LCVyNgotCWFkZGl0byx1diAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sdm56ICAxMjMsJXI1LCVyNgotCWFkZGl0byxuc3YgIDEyMywlcjUsJXI2Ci0JYWRkaXRvLGV2ICAxMjMsJXI1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliYTVlYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIyNjIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyaXN0eSBvZiBVdGFoCi0jIGFuZCBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19pbWVtIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImltZW0uczogaW50ZWdlciBtZW1vcnkgbG9hZHMgYW5kIHN0b3JlcyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImltZW0ucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCA0ODlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMEM4MDEwOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDQ0OUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwQzgwMTA1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggNDA5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDBDODAxMDFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyA2ODlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMEM5QTEyODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDY0OUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwQzlBMTI0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgNjA5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDBDOUExMjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCA0QzlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgNkM5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDBDODUwMDlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwQzg1MjA5QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMEM4NTAwQkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDBDODUyMEJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwQzg1MDA1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMEM4NTIwNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDBDODUwMDdBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwQzg1MjA3QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMEM4NTAwMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDBDODUyMDFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwQzg1MDAzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMEM4NTIwM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDBDODUwMTlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwQzg1MjE5QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMEM4NTAxQkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDBDODUyMUJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwQzg1MDFEQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMEM4NTIxREFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDBDODUwMUZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwQzg1MjFGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMEM4MDEwOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDBDODAzMEJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwQzgwMTBCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMEM4MDEwNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDBDODAzMDdBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwQzgwMTA3QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMEM4MDEwMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDBDODAzMDNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwQzgwMTAzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMEM4MDExOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDBDODAzMUJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwQzgwMTFCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMEM4MDExREFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDBDODAzMUZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwQzgwMTFGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMEM5QTEyODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDBDOUEzMkEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwQzlBMTJBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMEM5QTEyNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDBDOUEzMjYwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAwQzlBMTI2MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMEM5QTEyMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDBDOUEzMjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAwQzlBMTIyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMEM5QTEzODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDBDOUEzM0EwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAwQzlBMTNBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMEM5QTEzMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDBDOUExMzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAwQzlBMzMwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMEM5QTEzMjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDBDOUEzMzIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19pbW1lZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJpbW1lZC5zOiBpbW1lZGlhdGUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJpbW1lZC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDM3NUEwMDBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAyMzRERkJENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjhBREZCRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQgCi0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JyYW5jaCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJicmFuY2guczogYnJhbmNoIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYnJhbmNoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTg1RjFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEU4NUYxRkVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBFODFGMUZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRTgxRjFGREZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEU4NUYzRkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBFODVGM0ZDRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRTg0NDQwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEU4NDQ0MDAyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBFODA0NDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRTgwNDQwMDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEU4NDBDMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBFODQwQzAwMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRTA0MDQ0NkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEUwNDA0NDZFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBFNDQwNDQ2Q1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRTQ0MDQ0NkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIENCNDQxRkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBDQjQ0M0ZFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggQ0I0NDVGRTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIENCNDQ3RkREXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBDQjQ0OUZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgQ0I0NEJGQ0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IENCNDRERkM1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBDQjQ0RkZCRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgQ0I0NDFGQjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IENCNDQzRkFGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBDQjQ0NUZBN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgQ0I0NDdGOUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIENCNDQ5Rjk3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBDQjQ0QkY4RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggQ0I0NERGODdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIENCNDRGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCBDRjRBMUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgQ0Y0QTNGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IENGNEE1RkU1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyBDRjRBN0ZERFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgQ0Y0QTlGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IENGNEFCRkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCBDRjRBREZDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgQ0Y0QUZGQkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIENGNEExRkI3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCBDRjRBM0ZBRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggQ0Y0QTVGQTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIENGNEE3RjlGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCBDRjRBOUY5N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgQ0Y0QUJGOEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IENGNEFERjg3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyBDRjRBRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgODA4MDFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDgwODAzRkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCA4MDgwNUZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgODA4MDdGRERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDgwODA5RkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCA4MDgwQkZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggODA4MERGQzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIDgwODBGRkJEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCA4ODgwMUZCNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgODg4MDNGQURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IDg4ODA1RkE1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyA4ODgwN0Y5RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgODg4MDlGOTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IDg4ODBCRjhEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCA4ODgwREY4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgODg4MEZGN0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAwIDgwODAxRjc3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCA4MDgwM0Y2RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDggODA4MDVGNjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTBjIDgwODA3RjVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCA4MDgwOUY1N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTQgODA4MEJGNEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE4IDgwODBERjQ3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyA4MDgwRkYzRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjAgODg4MDFGMzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI0IDg4ODAzRjJGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyOCA4ODgwNUYyN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmMgODg4MDdGMUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTMwIDg4ODA5RjE3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCA4ODgwQkYwRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzggODg4MERGMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTNjIDg4ODBGRUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0MCA4NDgwMUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDQgODQ4MDVGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ4IDg0ODA3RkU1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0YyA4NDgwOUZERFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTAgODQ4MEJGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU0IDg0ODBERkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1OCA4NDgwRkZDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNWMgOEM4MDFGQkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTYwIDhDODAzRkI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2NCA4QzgwNUZBRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjggOEM4MDdGQTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTZjIDhDODA5RjlEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3MCA4QzgwQkY5NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzQgOEM4MERGOERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc4IDhDODBGRTg1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3YyA4NDgwMUY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODAgODQ4MDNGNzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTg0IDg0ODA1RjZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4OCA4NDgwN0Y2N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOGMgODQ4MDlGNUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTkwIDg0ODBCRjU3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5NCA4NDgwREY0RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTggODQ4MEZGNDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTljIDhDODAxRjNGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhMCA4QzgwM0YzN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTQgOEM4MDVGMkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE4IDhDODA3RjI3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhYyA4QzgwOUYxRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjAgOEM4MEJGMTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWI0IDhDODBERjBGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiOCA4QzgwRkYwN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYmMgQTA4MTFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWMwIEEwODEzRkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjNCBBMDgxNUZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzggQTA4MTdGRERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWNjIEEwODE5RkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkMCBBMDgxQkZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDQgQTA4MURGQzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQ4IEEwODFGRkJEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkYyBBODgxMUZCNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTAgQTg4MTNGQURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWU0IEE4ODE1RkE1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlOCBBODgxN0Y5RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZWMgQTg4MTlGOTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWYwIEE4ODFCRjhEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmNCBBODgxREY4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjggQTg4MUZGN0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWZjIEEwODExRjc3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwMCBBMDgxM0Y2RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDQgQTA4MTVGNjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjA4IEEwODE3RjVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwYyBBMDgxOUY1N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTAgQTA4MUJGNEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjE0IEEwODFERjQ3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxOCBBMDgxRkYzRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMWMgQTg4MTFGMzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjIwIEE4ODEzRjJGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyNCBBODgxNUYyN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjggQTg4MTdGMUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjJjIEE4ODE5RjE3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzMCBBODgxQkYwRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzQgQTg4MURGMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjM4IEE4ODFGRUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzYyBBNDlGMUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNDAgQTQ5RjNGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjQ0IEE0OUY1RkU1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI0OCBBNDlGN0ZERFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNGMgQTQ5RjlGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjUwIEE0OUZCRkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI1NCBBNDlGREZDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNTggQTQ5RkZGQkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjVjIEFDOUYxRkI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI2MCBBQzlGM0ZBRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNjQgQUM5RjVGQTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjY4IEFDOUY3RjlEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI2YyBBQzlGOUY5NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNzAgQUM5RkJGOERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjc0IEFDOUZERjg1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI3OCBBQzlGRkM4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyN2MgQTQ5RjFGNzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjgwIEE0OUYzRjZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI4NCBBNDlGNUY2N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyODggQTQ5RjdGNUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjhjIEE0OUY5RjU3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI5MCBBNDlGQkY0RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyOTQgQTQ5RkRGNDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjk4IEE0OUZGRjNGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI5YyBBQzlGMUYzN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYTAgQUM5RjNGMkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmE0IEFDOUY1RjI3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJhOCBBQzlGN0YxRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYWMgQUM5RjlGMTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmIwIEFDOUZCRjBGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJiNCBBQzlGREYwN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYjggQUM5RkZFRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmJjIEMwMDQ1RkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJjMCBDMDA0REZFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYzQgQzAwNDVGRTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmM4IEMwMDRERkRGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJjYyBDNEE0NUZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyZDAgQzRBNERGQ0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmQ0IEM0QTQ1RkM3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJkOCBDNEE0REZCRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTgzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2FkZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhZGQuczogYWRkIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYWRkLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDA2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDY2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTQ4NjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0QTYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNEM2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTRFNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0MTYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDM2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQ1NjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0NzYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDk2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTRCNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RDYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNEY2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4QTQwQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0MkEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDRBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4QTQ2QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0OEEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNEFBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4QTRDQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0RUEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNDFBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA4QTQzQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0NUEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDdBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDA4QTQ5QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0QkEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNERBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDA4QTRGQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0MEUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDJFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDA4QTQ0RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0NkUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMDhBNDhFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDA4QTRBRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwOEE0Q0UwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMDhBNEVFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDA4QTQxRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAwOEE0M0UwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMDhBNDVFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDA4QTQ3RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAwOEE0OUUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMDhBNEJFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDA4QTRERTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAwOEE0RkUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgMDhBNDA3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDA4QTQyNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCAwOEE0NDcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgMDhBNDY3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDA4QTQ4NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCAwOEE0QTcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggMDhBNEM3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIDA4QTRFNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCAwOEE0MTcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgMDhBNDM3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IDA4QTQ1NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyAwOEE0NzcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgMDhBNDk3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IDA4QTRCNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCAwOEE0RDcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgMDhBNEY3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAwIDA4QTQwRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCAwOEE0MkYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDggMDhBNDRGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTBjIDA4QTQ2RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCAwOEE0OEYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTQgMDhBNEFGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE4IDA4QTRDRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyAwOEE0RUYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjAgMDhBNDFGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI0IDA4QTQzRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyOCAwOEE0NUYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmMgMDhBNDdGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTMwIDA4QTQ5RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCAwOEE0QkYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzggMDhBNERGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTNjIDA4QTRGRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT04MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zaDFhZGQge30gewotICAgIHNldCB0ZXN0bmFtZSAic2gxYWRkLnM6IHNoMWFkZCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInNoMWFkZC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0E0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0E0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDBFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NEU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDZFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QUU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNENFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MUU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDNFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0N0U0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDlFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0REU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEZFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTQ4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NoMmFkZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzaDJhZGQuczogc2gyYWRkIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic2gyYWRkLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDA2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDY2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTQ4Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0QTY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNEM2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTRFNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0MTY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDM2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQ1Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0NzY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDk2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTRCNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RDY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNEY2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4QTQwQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0MkE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDRBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4QTQ2QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0OEE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNEFBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4QTRDQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0RUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNDFBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA4QTQzQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0NUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDdBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDA4QTQ5QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0QkE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNERBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDA4QTRGQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0MEU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDJFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDA4QTQ0RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0NkU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMDhBNDhFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDA4QTRBRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwOEE0Q0U4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMDhBNEVFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDA4QTQxRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAwOEE0M0U4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMDhBNDVFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDA4QTQ3RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAwOEE0OUU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMDhBNEJFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDA4QTRERTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAwOEE0RkU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc2gzYWRkIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNoM2FkZC5zOiBzaDNhZGQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzaDNhZGQucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNDBBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTQyQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0NEFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDZBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQ4QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0QUFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNENBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTRFQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MUFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDNBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQ1QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0N0FDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNDlBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRCQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0REFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNEZBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQwRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0MkVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNDRFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTQ2RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0OEVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNEFFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDA4QTRDRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0RUVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMDhBNDFFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDA4QTQzRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwOEE0NUVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMDhBNDdFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDA4QTQ5RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwOEE0QkVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMDhBNERFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDA4QTRGRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zdWIge30gewotICAgIHNldCB0ZXN0bmFtZSAic3ViLnM6IHN1YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInN1Yi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0MwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0MwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDA1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NDUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDY1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QTUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNEM1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MTUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDM1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0NzUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDk1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0RDUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEY1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDA4QTQwRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAwOEE0MkQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMDhBNDREMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDA4QTQ2RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAwOEE0OEQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgMDhBNEFEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDA4QTRDRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAwOEE0RUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgMDhBNDFEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IDA4QTQzRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAwOEE0NUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgMDhBNDdEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIDA4QTQ5RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCAwOEE0QkQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggMDhBNEREMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIDA4QTRGRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCAwOEE0MDRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgMDhBNDI0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IDA4QTQ0NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyAwOEE0NjRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgMDhBNDg0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IDA4QTRBNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCAwOEE0QzRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgMDhBNEU0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIwIDA4QTQxNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCAwOEE0MzRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggMDhBNDU0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJjIDA4QTQ3NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCAwOEE0OTRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgMDhBNEI0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM4IDA4QTRENEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyAwOEE0RjRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgMDhBNDBDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IDA4QTQyQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCAwOEE0NENDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgMDhBNDZDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIDA4QTQ4Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCAwOEE0QUNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggMDhBNENDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIDA4QTRFQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCAwOEE0MUNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgMDhBNDNDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IDA4QTQ1Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyAwOEE0N0NDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgMDhBNDlDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IDA4QTRCQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCAwOEE0RENDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgMDhBNEZDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTk2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2RzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRzLnM6IGRzIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0NDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3NDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fY29tY2xyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNvbWNsci5zOiBjb21jbHIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjb21jbHIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0ODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0Njg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0Qzg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0Mzg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3ODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTREODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0Rjg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgOTBBNjAwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDkwQTYyMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCA5MEE2NDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgOTBBNjYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDkwQTY4MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCA5MEE2QTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggOTBBNkMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDkwQTZFMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCA5MEE2MTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgOTBBNjMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDkwQTY1MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyA5MEE2NzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgOTBBNjkwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDkwQTZCMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCA5MEE2RDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgOTBBNkYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTMyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2xvZ2ljYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9naWNhbC5zOiBsb2dpY2FsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9naWNhbC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2MjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0RTI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNDEyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTQzMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0NTI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDcyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTRGMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0MDI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDIyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ0Mjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0NjI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEUyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTQxMjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MzI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDUyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ3Mjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0RjI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTQyMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0NDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNDYyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTRFMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0MTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDMyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ1MjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0NzIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEYyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTQwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0MjAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDQwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQ2MDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0RTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQzMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0NTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNDcwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRGMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb191bml0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInVuaXQuczogdW5pdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInVuaXQucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0NDM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NjM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0ODM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0QzM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0RTM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0MTM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0NTM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0NzM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0OTM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0RDM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0RjM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0MDk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0NDk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0Njk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0ODk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0Qzk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0RTk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0MTk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NTk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0Nzk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0OTk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0RDk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0Rjk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0NDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0NjlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0ODlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0QzlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0RTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0MTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0NTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0NzlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0OTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0RDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0RjlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19kY29yIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRjb3IuczogZGNvciB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImRjb3IucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwODgwMEI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwODgwNEI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwODgwNkI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwODgwOEI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwODgwQ0I4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwODgwRUI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwODgwMUI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwODgwNUI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwODgwN0I4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwODgwOUI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwODgwREI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwODgwRkI4NVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwODgwMEJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwODgwNEJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwODgwNkJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwODgwOEJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwODgwQ0JDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwODgwRUJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwODgwMUJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwODgwNUJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwODgwN0JDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwODgwOUJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwODgwREJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwODgwRkJDNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19hZGRpIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFkZGkuczogYWRkaSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFkZGkucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBCNEE2MDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQjRBNjIwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEI0QTY0MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBCNEE2NjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgQjRBNjgwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEI0QTZBMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBCNEE2QzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgQjRBNkUwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEI0QTYxMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBCNEE2MzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggQjRBNjUwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEI0QTY3MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBCNEE2OTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgQjRBNkIwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEI0QTZEMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBCNEE2RjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgQjRBNjA4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IEI0QTYyOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBCNEE2NDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgQjRBNjY4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIEI0QTY4OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCBCNEE2QThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggQjRBNkM4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIEI0QTZFOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCBCNEE2MThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgQjRBNjM4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IEI0QTY1OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyBCNEE2NzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgQjRBNjk4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IEI0QTZCOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBCNEE2RDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgQjRBNkY4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIEIwQTYwMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCBCMEE2MjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggQjBBNjQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIEIwQTY2MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCBCMEE2ODBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgQjBBNkEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IEIwQTZDMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyBCMEE2RTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgQjBBNjEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IEIwQTYzMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCBCMEE2NTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgQjBBNjcwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIEIwQTY5MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCBCMEE2QjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggQjBBNkQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIEIwQTZGMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCBCMEE2MDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgQjBBNjI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IEIwQTY0OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyBCMEE2NjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgQjBBNjg4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IEIwQTZBOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCBCMEE2QzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgQjBBNkU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIEIwQTYxOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCBCMEE2MzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggQjBBNjU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIEIwQTY3OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCBCMEE2OThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgQjBBNkI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IEIwQTZEOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyBCMEE2RjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NjRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc3ViaSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzdWJpLnM6IHN1YmkgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzdWJpLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgOTRBNjAwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDk0QTYyMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCA5NEE2NDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgOTRBNjYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDk0QTY4MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCA5NEE2QTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggOTRBNkMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDk0QTZFMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCA5NEE2MTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgOTRBNjMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDk0QTY1MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyA5NEE2NzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgOTRBNjkwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDk0QTZCMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCA5NEE2RDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgOTRBNkYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDk0QTYwOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCA5NEE2MjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggOTRBNjQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDk0QTY2OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCA5NEE2ODhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgOTRBNkE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDk0QTZDOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyA5NEE2RThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgOTRBNjE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDk0QTYzOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCA5NEE2NThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgOTRBNjc4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDk0QTY5OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCA5NEE2QjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggOTRBNkQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDk0QTZGOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zaGlmdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzaGlmdC5zOiBzaGlmdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInNoaWZ0LnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRDBBNDAwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRDBBNDIwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRDBBNDQwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRDBBNDYwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRDBBNDgwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRDBBNEEwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRDBBNEMwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRDBBNEUwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRDBBNDBCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRDBBNDJCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRDBBNDRCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRDBBNDZCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRDBBNDhCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRDBBNEFCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRDBBNENCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRDBBNEVCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZXh0cmFjdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleHRyYWN0LnM6IGV4dHJhY3QgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJleHRyYWN0LnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRDA4NjE4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRDA4NjM4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRDA4NjU4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRDA4Njc4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRDA4Njk4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRDA4NkI4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRDA4NkQ4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRDA4NkY4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRDA4NjFDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRDA4NjNDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRDA4NjVDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRDA4NjdDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRDA4NjlDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRDA4NkJDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRDA4NkRDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRDA4NkZDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgRDA4NjEwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRDA4NjMwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRDA4NjUwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgRDA4NjcwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRDA4NjkwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRDA4NkIwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggRDA4NkQwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRDA4NkYwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgRDA4NjE0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgRDA4NjM0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggRDA4NjU0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgRDA4Njc0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgRDA4Njk0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRDA4NkI0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggRDA4NkQ0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgRDA4NkY0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MzJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZGVwb3NpdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkZXBvc2l0LnM6IGRlcG9zaXQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkZXBvc2l0LnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRDRDNDBCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRDRDNDJCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRDRDNDRCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRDRDNDZCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRDRDNDhCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRDRDNEFCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRDRDNENCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRDRDNEVCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRDRDNDBGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRDRDNDJGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRDRDNDRGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRDRDNDZGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRDRDNDhGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRDRDNEFGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRDRDNENGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRDRDNEVGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgRDRDNDAwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRDRDNDIwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRDRDNDQwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgRDRDNDYwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRDRDNDgwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRDRDNEEwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggRDRDNEMwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRDRDNEUwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgRDRDNDA0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgRDRDNDI0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggRDRDNDQ0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgRDRDNDY0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgRDRDNDg0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRDRDNEE0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggRDRDNEM0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgRDRDNEU0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgRDRERjE0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgRDRERjM0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggRDRERjU0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgRDRERjc0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgRDRERjk0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgRDRERkI0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggRDRERkQ0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgRDRERkY0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgRDRERjEwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgRDRERjMwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggRDRERjUwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgRDRERjcwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgRDRERjkwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgRDRERkIwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggRDRERkQwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgRDRERkYwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgRDRERjFGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgRDRERjNGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggRDRERjVGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgRDRERjdGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgRDRERjlGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgRDRERkJGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggRDRERkRGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgRDRERkZGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgRDRERjFCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgRDRERjNCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggRDRERjVCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgRDRERjdCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgRDRERjlCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgRDRERkJCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggRDRERkRCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgRDRERkZCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NjRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc3lzdGVtIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInN5c3RlbS5zOiBzeXN0ZW0gdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzeXN0ZW0ucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwMDAxODAwNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwMDAwMEMwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwMDAwMENBMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwMDA1MEQ2NFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwMDA1MEU2NFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwMDA0MTg2MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwMEEwMTBBNFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwMDA0MTgyMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwMTQ0MTg0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwMDAwMDRBNFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwMTQwMDhBNFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwMDAwMDQwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwMDEwMDQwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAxNDAwMDREMlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwNEE2MTE4N1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwNEExMzE4N1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwNEE2MTFDN1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwNEExMzFDN1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwNEE0MTM0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwNEE0MTM2NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwNEE0MTMwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwNEE0MTMyNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwNEE0MTMwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwNEE0MTA0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwNEE0MjA0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwNEE0MTAwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwNEE0MjAwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yN10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19wdXJnZSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJwdXJnZS5zOiBwdXJnZSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInB1cmdlLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDRBNDEyMDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDRBNDEyMjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDRBNDIyMDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDRBNDIyMjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDRBNDEyNDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDRBNDEyNjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDRBNDIyNDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDRBNDIyNjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDRBNDEzODBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDRBNDEzQTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDRBNDEyODBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDRBNDEyQTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDRBNDIyODBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDRBNDIyQTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDRBNDEyQzBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDRBNDEyRTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDRBNDIyQzBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDRBNDIyRTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCi0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mcF9taXNjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZwX21pc2MuczogZnBfbWlzYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZwX21pc2MucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzMDAwMjQyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mbWVtIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZtZW0uczogZm1lbSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZtZW0ucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyNEE0MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMjRBNDIwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDI0QTQwMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAyNEE0MjAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMkNBNDAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDJDQTQyMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAyQ0E0MDAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMkNBNDIwMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDI0QTQwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAyNEE0MjIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMjRBNDAyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDI0QTQyMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAyQ0E0MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMkNBNDIyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDJDQTQwMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAyQ0E0MjIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgM0NBNDAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDNDQTQyMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAzQ0E0MDIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgM0NBNDIyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDI0QTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAyNEEwMzAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMjRBMDEwMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDJDQTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAyQ0EwMzAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMkNBMDEwMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDI0QTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAyNEEwMzIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMjRBMDEyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDJDQTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAyQ0EwMzIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMkNBMDEyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDNDQTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAzQ0EwMzIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggM0NBMDEyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTM1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2ZwX2NvbXAge30gewotICAgIHNldCB0ZXN0bmFtZSAiZnBfY29tcC5zOiBmcF9jb21wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZnBfY29tcC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDMwQTA0MDBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAzMEEwNDgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMzBBMDU4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDMyODA0MDE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAzMjgwNDgxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMzBBMDYwMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDMwQTA2ODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAzMEEwNzgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMzI4MDYwMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDMyODA2ODE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAzMEEwODAwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMzBBMDg4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDMwQTA5ODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAzMjgwODAxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMzI4MDg4MThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDMwQTBBMDBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAzMEEwQTgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMzBBMEI4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDMyODBBMDE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAzMjgwQTgxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMzA4ODA2MENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDMwODgwRTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAzMDg4MUUwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMzI5ODA2MUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDMyOTgwRTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAzMjk4MUUxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMzA4ODI2MENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDMwODgyRTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAzMDg4M0UwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMzI5ODI2MUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDMyOTgyRTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAzMjk4M0UxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMzA4ODQ2MENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDMwODg0RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAzMDg4NUUwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMzI5ODQ2MUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDMyOTg0RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAzMjk4NUUxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMzA4ODY2MENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDMwODg2RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAzMDg4N0UwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMzI5ODY2MUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDMyOTg2RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAzMjk4N0UxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMzA4ODg2MENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDMwODg4RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAzMDg4OUUwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMzI5ODg2MUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDMyOTg4RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAzMjk4OUUxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMTgwMTIwRTJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDFBMTFBNEQyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCA5ODAxMjBFMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgOUExMUE0RDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDM4ODU0NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT01NV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mcF9jb252IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZwX2NvbnYuczogZnBfY29udiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZwX2NvbnYucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzMEEwMDIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMzBBMDIyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDMwQTA2MjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAzMEEwMEEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMzBBMDJBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDMwQTA2QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAzMEEwMUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMzBBMDNBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDMwQTA3QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAzMjgwMDIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMzI4MDIyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDMyODA2MjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAzMjgwMEExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMzI4MDJBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDMyODA2QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAzMjgwMUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMzI4MDNBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDMyODA3QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAzMEEwODIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMzBBMEEyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDMwQTBFMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAzMEEwOEEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMzBBMEFBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDMwQTBFQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAzMEEwOUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMzBBMEJBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDMwQTBGQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAzMjgwODIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMzI4MEEyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDMyODBFMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAzMjgwOEExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMzI4MEFBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDMyODBFQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAzMjgwOUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMzI4MEJBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDMyODBGQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAzMEExMDIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMzBBMTIyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDMwQTE2MjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAzMEExMEEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMzBBMTJBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDMwQTE2QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAzMEExMUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMzBBMTNBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDMwQTE3QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAzMjgxMDIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMzI4MTIyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDMyODE2MjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAzMjgxMEExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMzI4MTJBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDMyODE2QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAzMjgxMUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMzI4MTNBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDMyODE3QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAzMEExODIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMzBBMUEyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDMwQTFFMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAzMEExOEEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMzBBMUFBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDMwQTFFQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCAzMEExOUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgMzBBMUJBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IDMwQTFGQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyAzMjgxODIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDAgMzI4MUEyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IDMyODFFMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCAzMjgxOEExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGMgMzI4MUFBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEwIDMyODFFQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCAzMjgxOUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggMzI4MUJBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIDMyODFGQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT03Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mcF9mY21wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZwX2ZjbXAuczogZnBfZmNtcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZwX2ZjbXAucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzMDg1MDQwMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAzMDg1MDQwMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAzMDg1MDQwMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAzMDg1MDQwM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAzMDg1MDQwNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAzMDg1MDQwNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAzMDg1MDQwNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAzMDg1MDQwN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAzMDg1MDQwOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAzMDg1MDQwOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAzMDg1MDQwQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAzMDg1MDQwQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAzMDg1MDQwQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAzMDg1MDQwRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAzMDg1MDQwRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAzMDg1MDQwRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAzMDg1MDQxMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAzMDg1MDQxMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAzMDg1MDQxMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAzMDg1MDQxM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAzMDg1MDQxNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAzMDg1MDQxNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAzMDg1MDQxNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAzMDg1MDQxN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAzMDg1MDQxOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAzMDg1MDQxOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAzMDg1MDQxQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAzMDg1MDQxQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAzMDg1MDQxQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAzMDg1MDQxRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAzMDg1MDQxRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAzMDg1MDQxRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAzMDg1MEMwMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAzMDg1MEMwMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAzMDg1MEMwMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAzMDg1MEMwM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAzMDg1MEMwNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAzMDg1MEMwNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAzMDg1MEMwNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAzMDg1MEMwN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAzMDg1MEMwOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAzMDg1MEMwOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAzMDg1MEMwQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAzMDg1MEMwQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAzMDg1MEMwQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAzMDg1MEMwRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAzMDg1MEMwRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAzMDg1MEMwRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAzMDg1MEMxMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAzMDg1MEMxMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCAzMDg1MEMxMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAzMDg1MEMxM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAzMDg1MEMxNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCAzMDg1MEMxNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAzMDg1MEMxNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAzMDg1MEMxN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCAzMDg1MEMxOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAzMDg1MEMxOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAzMDg1MEMxQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyAzMDg1MEMxQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCAzMDg1MEMxQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCAzMDg1MEMxRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCAzMDg1MEMxRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyAzMDg1MEMxRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCAzMDg1MUMwMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCAzMDg1MUMwMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCAzMDg1MUMwMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyAzMDg1MUMwM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCAzMDg1MUMwNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCAzMDg1MUMwNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCAzMDg1MUMwNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyAzMDg1MUMwN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyMCAzMDg1MUMwOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCAzMDg1MUMwOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyOCAzMDg1MUMwQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyYyAzMDg1MUMwQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCAzMDg1MUMwQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCAzMDg1MUMwRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzOCAzMDg1MUMwRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyAzMDg1MUMwRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0MCAzMDg1MUMxMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0NCAzMDg1MUMxMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCAzMDg1MUMxMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0YyAzMDg1MUMxM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1MCAzMDg1MUMxNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCAzMDg1MUMxNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1OCAzMDg1MUMxNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1YyAzMDg1MUMxN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCAzMDg1MUMxOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2NCAzMDg1MUMxOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2OCAzMDg1MUMxQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyAzMDg1MUMxQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3MCAzMDg1MUMxQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3NCAzMDg1MUMxRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCAzMDg1MUMxRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3YyAzMDg1MUMxRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT05Nl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zcGVjaWFsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNwZWNpYWwuczogc3BlY2lhbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInNwZWNpYWwucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwNEE0MTY4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDRBNDE2QTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA0QTQxQTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwNEE0MUFBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zcG9wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNwb3Auczogc3BvcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICAjIFRoaXMgdGlja2xlcyBhIGJ1ZyBpbiB0aGUgZXhwcmVzc2lvbiBwYXJzZXIuCi0gICAgZ2FzX3N0YXJ0ICJzcG9wLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMTAwMDAxMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDEwMDAxOTEzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAxMDAwMDEyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMTAwMDE5MzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDEwMDAyQjA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAxMDAzOUIwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMTAwMDJCMjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDEwMDM5QjI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAxMEEwMDUwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMTBBMDFEMTNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDEwQTAwNTI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAxMEEwMUQzM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMTBDNTA3MDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDEwQzUxRjEzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAxMEM1MDcyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMTBDNTFGMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2NvcHIge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29wci5zOiBjb3ByIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY29wci5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDMwMDAwMTA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAzMDAwMDcxM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMzAwMDAxMjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDMwMDAwNzMzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2NvcHJtZW0ge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29wcm1lbS5zOiBjb3ByIG1lbW9yeSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNvcHJtZW0ucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyNDg1MDExQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMjQ4NTIxMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDI0ODUwMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAyNDg1MjEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMkM4NTAxMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDJDODUyMTFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAyQzg1MDEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMkM4NTIxM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDI0ODUwMzFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAyNDg1MjMxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMjQ4NTAzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDI0ODUyMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAyQzg1MDMxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMkM4NTIzMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDJDODUwMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAyQzg1MjMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMjQ4MDExMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDI0ODAzMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAyNDgwMTEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMkM4MDExMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDJDODAzMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAyQzgwMTEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMjQ4MDEzMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDI0ODAzMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAyNDgwMTMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMkM4MDEzMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDJDODAzMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAyQzgwMTMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZm1lbV9MUl90ZXN0cyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmbWVtTFJidWcuczogTFIgcmVnaXN0ZXIgc2VsZWN0aW9uIG9uIGZwIG1lbSBpbnN0cnVjdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJmbWVtTFJidWcucyIgIi1hbCIKLQotICAgICMgTWFrZSBzdXJlIHdlIGNvcnJlY3RseSBoYW5kbGUgZmllbGQgc2VsZWN0b3JzLiAKLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMjc0MDEyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDI3NDgxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAyNzUwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMkY0MDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDJGNDgxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAyRjUwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMjc0MDEwNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDI3NDgxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAyNzUwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMkY0MDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDJGNDgxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAyRjUwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMjc0MDEyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDI3NDgxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAyNzUwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMkY0MDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDJGNDgxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAyRjUwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMjc0MDEwNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDI3NDgxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAyNzUwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMkY0MDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDJGNDgxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAyRjUwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMjc1OTAyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDI3NTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAyNzU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMkY1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDJGNTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAyRjU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMjc1OTAwNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDI3NTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAyNzU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMkY1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDJGNTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAyRjU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMjc1OTAyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDI3NTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAyNzU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMkY1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDJGNTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAyRjU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMjc1OTAwNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDI3NTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAyNzU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMkY1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDJGNTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAyRjU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgRTg0MEMwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDA4MDAwMjQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT01MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotaWYgW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7Ci0gICAgIyBUZXN0IHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBwYXJzZXIuCi0gICAgZG9faW1lbQotICAgIGRvX2ltbWVkCi0gICAgZG9fYnJhbmNoCi0gICAgZG9fYWRkCi0gICAgZG9fc2gxYWRkCi0gICAgZG9fc2gyYWRkCi0gICAgZG9fc2gzYWRkCi0gICAgZG9fc3ViCi0gICAgZG9fZHMKLSAgICBkb19jb21jbHIKLSAgICBkb19sb2dpY2FsCi0gICAgZG9fdW5pdAotICAgIGRvX2Rjb3IKLSAgICBkb19hZGRpCi0gICAgZG9fc3ViaQotICAgIGRvX3NoaWZ0Ci0gICAgZG9fZXh0cmFjdAotICAgIGRvX2RlcG9zaXQKLSAgICBkb19zeXN0ZW0KLSAgICBkb19wdXJnZQotICAgIGRvX2ZwX21pc2MKLSAgICBkb19mbWVtCi0gICAgZG9fZnBfY29tcAotICAgIGRvX2ZwX2NvbnYKLSAgICBkb19mcF9mY21wCi0gICAgZG9fc3BlY2lhbAotICAgIGRvX3Nwb3AKLSAgICBkb19jb3ByCi0gICAgZG9fY29wcm1lbQotCi0gICAgIyBUaGUgIndlaXJkLnMiIGZpbGUgZnJvbSB0aGUgZ2RiIHRlc3RzdWl0ZS4gIFNpbXBseSB2ZXJpZnkgaXQKLSAgICAjIGFzc2VtYmxlcy4KLSAgICBnYXNfdGVzdCAid2VpcmQucyIgIiIgIiIgInN0YWJzIHBhcnNpbmciCi0KLSAgICAjIFRlc3QgdGhhdCB3ZSBjb3JyZWN0bHkgYXNzZW1ibGUgc29tZSBGUCBtZW1vcnkgdGVzdHMgd2hpY2gKLSAgICAjIEwvUiByZWdpc3RlciBzZWxlY3RzLiAgKFJlZ3Jlc3Npb24gdGVzdCBmb3IgYSBidWcgVGVnZSBmb3VuZCkuCi0gICAgZG9fZm1lbV9MUl90ZXN0cwotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9icmFuY2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYnJhbmNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZjgzOWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9icmFuY2gucworKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgTW9yZSBicmFuY2hpbmcgaW5zdHJ1Y3Rpb25zIHRoYW4geW91IGV2ZXIga25ldyB3aGF0IHRvIGRvIHdpdGguCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLWJyYW5jaF90ZXN0czogCi0JYmwgYnJhbmNoX3Rlc3RzLCVyMgotCWJsLG4gYnJhbmNoX3Rlc3RzLCVyMgotCWIgYnJhbmNoX3Rlc3RzCi0JYixuIGJyYW5jaF90ZXN0cwotCWdhdGUgYnJhbmNoX3Rlc3RzLCVyMgotCWdhdGUsbiBicmFuY2hfdGVzdHMsJXIyCi0JYmxyICVyNCwlcjIKLQlibHIsbiAlcjQsJXIyCi0JYmxyICVyNCwlcjAKLQlibHIsbiAlcjQsJXIwCi0JYnYgJXIwKCVyMikKLQlidixuICVyMCglcjIpCi0JYmUgMHgxMjM0KCVzcjEsJXIyKQotCWJlLG4gMHgxMjM0KCVzcjEsJXIyKQotCWJsZSAweDEyMzQoJXNyMSwlcjIpCi0JYmxlLG4gMHgxMjM0KCVzcjEsJXIyKQotCi1tb3ZiX3Rlc3RzOiAKLQltb3ZiICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLD0gJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsPCAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92YixvZCAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yix0ciAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yiw8PiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yiw+PSAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92YixldiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi1tb3ZiX251bGxpZmllZF90ZXN0czogCi0JbW92YixuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLD0sbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yiw8LG4gJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsb2QsbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yix0cixuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLDw+LG4gJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsPj0sbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92YixldixuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQotbW92aWJfdGVzdHM6IAotCW1vdmliIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLD0gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsPCA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYixvZCA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYix0ciA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw8PiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw+PSA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYixldiA1LCVyMjYsbW92aWJfdGVzdHMKLW1vdmliX251bGxpZmllZF90ZXN0czogCi0JbW92aWIsbiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw9LG4gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsPCxuIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLG9kLG4gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsdHIsbiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw8PixuIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLD49LG4gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsZXYsbiA1LCVyMjYsbW92aWJfdGVzdHMKLQotY29tYl90ZXN0czogCi0JY29tYiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD0gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPD0gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8PCAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDw8PSAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLHN2ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsb2QgJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYix0ciAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDw+ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPj0gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPj49ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPj4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYixuc3YgJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYixldiAlcjAsJXI0LGNvbWJfdGVzdHMKLWNvbWJfbnVsbGlmaWVkX3Rlc3RzOiAKLQljb21iLG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw9LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8PSxuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPDwsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDw8PSxuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsc3YsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLG9kLG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYix0cixuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPD4sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD49LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+Pj0sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD4+LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYixuc3YsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLGV2LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0KLWNvbWliX3Rlc3RzOiAKLQljb21pYiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDwgMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8PSAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDw8IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPDw9IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsc3YgMCwlcjQsY29taWJfdGVzdHMKLQljb21pYixvZCAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLHRyIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPD4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+PSAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+Pj0gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+PiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLG5zdiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLGV2IDAsJXI0LGNvbWJfdGVzdHMKLQotY29taWJfbnVsbGlmaWVkX3Rlc3RzOiAKLQljb21pYixuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPSxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPCxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPD0sbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDw8LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8PD0sbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLHN2LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYixvZCxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsdHIsbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDw+LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+PSxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPixuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPj49LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+PixuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsbnN2LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYixldixuIDAsJXI0LGNvbWliX3Rlc3RzCi0KLQotCi1hZGRiX3Rlc3RzOiAKLQlhZGRiICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPSAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDwgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw8PSAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLG51diAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHpudiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHN2ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsb2QgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix0ciAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDw+ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPj0gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw+ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsdXYgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix2bnogJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixuc3YgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixldiAlcjEsJXI0LGFkZGJfdGVzdHMKLWFkZGJfbnVsbGlmaWVkX3Rlc3RzOiAKLQlhZGRiLG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw9LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw8LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw8PSxuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsbnV2LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix6bnYsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHN2LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixvZCxuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsdHIsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDw+LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw+PSxuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPixuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsdXYsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHZueixuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsbnN2LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixldixuICVyMSwlcjQsYWRkYl90ZXN0cwotCi1hZGRpYl90ZXN0czogCi0JYWRkaWIgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPSAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw8IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLDw9IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLG51diAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix6bnYgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsc3YgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsb2QgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsdHIgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPD4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPj0gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix1diAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix2bnogLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsbnN2IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLGV2IC0xLCVyNCxjb21iX3Rlc3RzCi0KLWFkZGliX251bGxpZmllZF90ZXN0czogCi0JYWRkaWIsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw9LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPCxuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLDw9LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsbnV2LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsem52LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsc3YsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixvZCxuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHRyLG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPD4sbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw+PSxuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLD4sbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix1dixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHZueixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLG5zdixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLGV2LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0KLQotOyBOZWVkcyB0byBjaGVjayBsb3RzIG9mIHN0dWZmIChsaWtlIGNvcm5lciBiaXQgY2FzZXMpCi1iYl90ZXN0czogCi0JYnZiLDwgJXI0LGJiX3Rlc3RzCi0JYnZiLD49ICVyNCxiYl90ZXN0cwotCWJ2Yiw8LG4gJXI0LGJiX3Rlc3RzCi0JYnZiLD49LG4gJXI0LGJiX3Rlc3RzCi0JYmIsPCAlcjQsNSxiYl90ZXN0cwotCWJiLD49ICVyNCw1LGJiX3Rlc3RzCi0JYmIsPCxuICVyNCw1LGJiX3Rlc3RzCi0JYmIsPj0sbiAlcjQsNSxiYl90ZXN0cwotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb21jbHIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29tY2xyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZTVhYTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb21jbHIucworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWNvbWNsciAlcjQsJXI1LCVyNgotCWNvbWNsciw9ICVyNCwlcjUsJXI2Ci0JY29tY2xyLDwgJXI0LCVyNSwlcjYKLQljb21jbHIsPD0gJXI0LCVyNSwlcjYKLQljb21jbHIsPDwgJXI0LCVyNSwlcjYKLQljb21jbHIsPDw9ICVyNCwlcjUsJXI2Ci0JY29tY2xyLHN2ICVyNCwlcjUsJXI2Ci0JY29tY2xyLG9kICVyNCwlcjUsJXI2Ci0JY29tY2xyLHRyICVyNCwlcjUsJXI2Ci0JY29tY2xyLDw+ICVyNCwlcjUsJXI2Ci0JY29tY2xyLD49ICVyNCwlcjUsJXI2Ci0JY29tY2xyLD4gJXI0LCVyNSwlcjYKLQljb21jbHIsPj49ICVyNCwlcjUsJXI2Ci0JY29tY2xyLD4+ICVyNCwlcjUsJXI2Ci0JY29tY2xyLG5zdiAlcjQsJXI1LCVyNgotCWNvbWNscixldiAlcjQsJXI1LCVyNgotCi0JY29taWNsciAxMjMsJXI1LCVyNgotCWNvbWljbHIsPSAxMjMsJXI1LCVyNgotCWNvbWljbHIsPCAxMjMsJXI1LCVyNgotCWNvbWljbHIsPD0gMTIzLCVyNSwlcjYKLQljb21pY2xyLDw8IDEyMywlcjUsJXI2Ci0JY29taWNsciw8PD0gMTIzLCVyNSwlcjYKLQljb21pY2xyLHN2IDEyMywlcjUsJXI2Ci0JY29taWNscixvZCAxMjMsJXI1LCVyNgotCWNvbWljbHIsdHIgMTIzLCVyNSwlcjYKLQljb21pY2xyLDw+IDEyMywlcjUsJXI2Ci0JY29taWNsciw+PSAxMjMsJXI1LCVyNgotCWNvbWljbHIsPiAxMjMsJXI1LCVyNgotCWNvbWljbHIsPj49IDEyMywlcjUsJXI2Ci0JY29taWNsciw+PiAxMjMsJXI1LCVyNgotCWNvbWljbHIsbnN2IDEyMywlcjUsJXI2Ci0JY29taWNscixldiAxMjMsJXI1LCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2NvcHIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29wci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2NiNmEyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29wci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLWNvcHJfdGVzdHM6IAotCWNvcHIsNCw1Ci0JY29wciw0LDExNQotCWNvcHIsNCw1LG4KLQljb3ByLDQsMTE1LG4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29wcm1lbS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb3BybWVtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZmYxNTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb3BybWVtLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgY29wciBtZW1vcnkgdGVzdHMgd2hpY2ggYWxzbyB0ZXN0IHRoZSB2YXJpb3VzIAotOyBhZGRyZXNzaW5nIG1vZGVzIGFuZCBjb21wbGV0ZXJzLgotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi07IAotY29wcl9pbmRleGluZ19sb2FkIAotCi0JY2xkd3gsNCAlcjUoJXNyMCwlcjQpLCVyMjYKLQljbGR3eCw0LHMgJXI1KCVzcjAsJXI0KSwlcjI2Ci0JY2xkd3gsNCxtICVyNSglc3IwLCVyNCksJXIyNgotCWNsZHd4LDQsc20gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHgsNCAlcjUoJXNyMCwlcjQpLCVyMjYKLQljbGRkeCw0LHMgJXI1KCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHgsNCxtICVyNSglc3IwLCVyNCksJXIyNgotCWNsZGR4LDQsc20gJXI1KCVzcjAsJXI0KSwlcjI2Ci0KLWNvcHJfaW5kZXhpbmdfc3RvcmUgCi0JY3N0d3gsNCAlcjI2LCVyNSglc3IwLCVyNCkKLQljc3R3eCw0LHMgJXIyNiwlcjUoJXNyMCwlcjQpCi0JY3N0d3gsNCxtICVyMjYsJXI1KCVzcjAsJXI0KQotCWNzdHd4LDQsc20gJXIyNiwlcjUoJXNyMCwlcjQpCi0JY3N0ZHgsNCAlcjI2LCVyNSglc3IwLCVyNCkKLQljc3RkeCw0LHMgJXIyNiwlcjUoJXNyMCwlcjQpCi0JY3N0ZHgsNCxtICVyMjYsJXI1KCVzcjAsJXI0KQotCWNzdGR4LDQsc20gJXIyNiwlcjUoJXNyMCwlcjQpCi0KLWNvcHJfc2hvcnRfbWVtb3J5IAotCWNsZHdzLDQgMCglc3IwLCVyNCksJXIyNgotCWNsZHdzLDQsbWIgMCglc3IwLCVyNCksJXIyNgotCWNsZHdzLDQsbWEgMCglc3IwLCVyNCksJXIyNgotCWNsZGRzLDQgMCglc3IwLCVyNCksJXIyNgotCWNsZGRzLDQsbWIgMCglc3IwLCVyNCksJXIyNgotCWNsZGRzLDQsbWEgMCglc3IwLCVyNCksJXIyNgotCWNzdHdzLDQgJXIyNiwwKCVzcjAsJXI0KQotCWNzdHdzLDQsbWIgJXIyNiwwKCVzcjAsJXI0KQotCWNzdHdzLDQsbWEgJXIyNiwwKCVzcjAsJXI0KQotCWNzdGRzLDQgJXIyNiwwKCVzcjAsJXI0KQotCWNzdGRzLDQsbWIgJXIyNiwwKCVzcjAsJXI0KQotCWNzdGRzLDQsbWEgJXIyNiwwKCVzcjAsJXI0KQotCi07IGdhcyBmdWNrcyB0aGlzIHVwIHRoaW5rcyBpdCBnZXRzIHRoZSBleHByZXNzaW9uIDQgbW9kdWxvIDUKLTsJY2xkd3gsNCAlcjUoMCwlcjQpLCVyJXIyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kY29yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Rjb3IucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3NDU1NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Rjb3IucworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWRjb3IgJXI0LCVyNQotCWRjb3Isc2J6ICVyNCwlcjUKLQlkY29yLHNoeiAlcjQsJXI1Ci0JZGNvcixzZGMgJXI0LCVyNQotCWRjb3Isc2JjICVyNCwlcjUKLQlkY29yLHNoYyAlcjQsJXI1Ci0JZGNvcix0ciAlcjQsJXI1Ci0JZGNvcixuYnogJXI0LCVyNQotCWRjb3Isbmh6ICVyNCwlcjUKLQlkY29yLG5kYyAlcjQsJXI1Ci0JZGNvcixuYmMgJXI0LCVyNQotCWRjb3IsbmhjICVyNCwlcjUKLQotCWlkY29yICVyNCwlcjUKLQlpZGNvcixzYnogJXI0LCVyNQotCWlkY29yLHNoeiAlcjQsJXI1Ci0JaWRjb3Isc2RjICVyNCwlcjUKLQlpZGNvcixzYmMgJXI0LCVyNQotCWlkY29yLHNoYyAlcjQsJXI1Ci0JaWRjb3IsdHIgJXI0LCVyNQotCWlkY29yLG5ieiAlcjQsJXI1Ci0JaWRjb3Isbmh6ICVyNCwlcjUKLQlpZGNvcixuZGMgJXI0LCVyNQotCWlkY29yLG5iYyAlcjQsJXI1Ci0JaWRjb3IsbmhjICVyNCwlcjUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGVwb3NpdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kZXBvc2l0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwODUzYjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kZXBvc2l0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQl6ZGVwICVyNCw1LDEwLCVyNgotCXpkZXAsPSAlcjQsNSwxMCwlcjYKLQl6ZGVwLDwgJXI0LDUsMTAsJXI2Ci0JemRlcCxvZCAlcjQsNSwxMCwlcjYKLQl6ZGVwLHRyICVyNCw1LDEwLCVyNgotCXpkZXAsPD4gJXI0LDUsMTAsJXI2Ci0JemRlcCw+PSAlcjQsNSwxMCwlcjYKLQl6ZGVwLGV2ICVyNCw1LDEwLCVyNgotCi0JZGVwICVyNCw1LDEwLCVyNgotCWRlcCw9ICVyNCw1LDEwLCVyNgotCWRlcCw8ICVyNCw1LDEwLCVyNgotCWRlcCxvZCAlcjQsNSwxMCwlcjYKLQlkZXAsdHIgJXI0LDUsMTAsJXI2Ci0JZGVwLDw+ICVyNCw1LDEwLCVyNgotCWRlcCw+PSAlcjQsNSwxMCwlcjYKLQlkZXAsZXYgJXI0LDUsMTAsJXI2Ci0KLQl6dmRlcCAlcjQsNSwlcjYKLQl6dmRlcCw9ICVyNCw1LCVyNgotCXp2ZGVwLDwgJXI0LDUsJXI2Ci0JenZkZXAsb2QgJXI0LDUsJXI2Ci0JenZkZXAsdHIgJXI0LDUsJXI2Ci0JenZkZXAsPD4gJXI0LDUsJXI2Ci0JenZkZXAsPj0gJXI0LDUsJXI2Ci0JenZkZXAsZXYgJXI0LDUsJXI2Ci0KLQl2ZGVwICVyNCw1LCVyNgotCXZkZXAsPSAlcjQsNSwlcjYKLQl2ZGVwLDwgJXI0LDUsJXI2Ci0JdmRlcCxvZCAlcjQsNSwlcjYKLQl2ZGVwLHRyICVyNCw1LCVyNgotCXZkZXAsPD4gJXI0LDUsJXI2Ci0JdmRlcCw+PSAlcjQsNSwlcjYKLQl2ZGVwLGV2ICVyNCw1LCVyNgotCi0JdmRlcGkgLTEsNSwlcjYKLQl2ZGVwaSw9IC0xLDUsJXI2Ci0JdmRlcGksPCAtMSw1LCVyNgotCXZkZXBpLG9kIC0xLDUsJXI2Ci0JdmRlcGksdHIgLTEsNSwlcjYKLQl2ZGVwaSw8PiAtMSw1LCVyNgotCXZkZXBpLD49IC0xLDUsJXI2Ci0JdmRlcGksZXYgLTEsNSwlcjYKLQotCXp2ZGVwaSAtMSw1LCVyNgotCXp2ZGVwaSw9IC0xLDUsJXI2Ci0JenZkZXBpLDwgLTEsNSwlcjYKLQl6dmRlcGksb2QgLTEsNSwlcjYKLQl6dmRlcGksdHIgLTEsNSwlcjYKLQl6dmRlcGksPD4gLTEsNSwlcjYKLQl6dmRlcGksPj0gLTEsNSwlcjYKLQl6dmRlcGksZXYgLTEsNSwlcjYKLQotCWRlcGkgLTEsNCwxMCwlcjYKLQlkZXBpLD0gLTEsNCwxMCwlcjYKLQlkZXBpLDwgLTEsNCwxMCwlcjYKLQlkZXBpLG9kIC0xLDQsMTAsJXI2Ci0JZGVwaSx0ciAtMSw0LDEwLCVyNgotCWRlcGksPD4gLTEsNCwxMCwlcjYKLQlkZXBpLD49IC0xLDQsMTAsJXI2Ci0JZGVwaSxldiAtMSw0LDEwLCVyNgotCi0JemRlcGkgLTEsNCwxMCwlcjYKLQl6ZGVwaSw9IC0xLDQsMTAsJXI2Ci0JemRlcGksPCAtMSw0LDEwLCVyNgotCXpkZXBpLG9kIC0xLDQsMTAsJXI2Ci0JemRlcGksdHIgLTEsNCwxMCwlcjYKLQl6ZGVwaSw8PiAtMSw0LDEwLCVyNgotCXpkZXBpLD49IC0xLDQsMTAsJXI2Ci0JemRlcGksZXYgLTEsNCwxMCwlcjYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODMxZTI2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZHMucworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWRzICVyNCwlcjUsJXI2Ci0JZHMsPSAlcjQsJXI1LCVyNgotCWRzLDwgJXI0LCVyNSwlcjYKLQlkcyw8PSAlcjQsJXI1LCVyNgotCWRzLDw8ICVyNCwlcjUsJXI2Ci0JZHMsPDw9ICVyNCwlcjUsJXI2Ci0JZHMsc3YgJXI0LCVyNSwlcjYKLQlkcyxvZCAlcjQsJXI1LCVyNgotCWRzLHRyICVyNCwlcjUsJXI2Ci0JZHMsPD4gJXI0LCVyNSwlcjYKLQlkcyw+PSAlcjQsJXI1LCVyNgotCWRzLD4gJXI0LCVyNSwlcjYKLQlkcyw+Pj0gJXI0LCVyNSwlcjYKLQlkcyw+PiAlcjQsJXI1LCVyNgotCWRzLG5zdiAlcjQsJXI1LCVyNgotCWRzLGV2ICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2V4dHJhY3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTAzMGY0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JZXh0cnUgJXI0LDUsMTAsJXI2Ci0JZXh0cnUsPSAlcjQsNSwxMCwlcjYKLQlleHRydSw8ICVyNCw1LDEwLCVyNgotCWV4dHJ1LG9kICVyNCw1LDEwLCVyNgotCWV4dHJ1LHRyICVyNCw1LDEwLCVyNgotCWV4dHJ1LDw+ICVyNCw1LDEwLCVyNgotCWV4dHJ1LD49ICVyNCw1LDEwLCVyNgotCWV4dHJ1LGV2ICVyNCw1LDEwLCVyNgotCi0JZXh0cnMgJXI0LDUsMTAsJXI2Ci0JZXh0cnMsPSAlcjQsNSwxMCwlcjYKLQlleHRycyw8ICVyNCw1LDEwLCVyNgotCWV4dHJzLG9kICVyNCw1LDEwLCVyNgotCWV4dHJzLHRyICVyNCw1LDEwLCVyNgotCWV4dHJzLDw+ICVyNCw1LDEwLCVyNgotCWV4dHJzLD49ICVyNCw1LDEwLCVyNgotCWV4dHJzLGV2ICVyNCw1LDEwLCVyNgotCi0JdmV4dHJ1ICVyNCw1LCVyNgotCXZleHRydSw9ICVyNCw1LCVyNgotCXZleHRydSw8ICVyNCw1LCVyNgotCXZleHRydSxvZCAlcjQsNSwlcjYKLQl2ZXh0cnUsdHIgJXI0LDUsJXI2Ci0JdmV4dHJ1LDw+ICVyNCw1LCVyNgotCXZleHRydSw+PSAlcjQsNSwlcjYKLQl2ZXh0cnUsZXYgJXI0LDUsJXI2Ci0KLQl2ZXh0cnMgJXI0LDUsJXI2Ci0JdmV4dHJzLD0gJXI0LDUsJXI2Ci0JdmV4dHJzLDwgJXI0LDUsJXI2Ci0JdmV4dHJzLG9kICVyNCw1LCVyNgotCXZleHRycyx0ciAlcjQsNSwlcjYKLQl2ZXh0cnMsPD4gJXI0LDUsJXI2Ci0JdmV4dHJzLD49ICVyNCw1LCVyNgotCXZleHRycyxldiAlcjQsNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZm1lbS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mbWVtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MzBiNDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mbWVtLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlmbGR3eCAlcjQoJXNyMCwlcjUpLCVmcjYKLQlmbGR3eCxzICVyNCglc3IwLCVyNSksJWZyNgotCWZsZHd4LG0gJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZmxkd3gsc20gJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZmxkZHggJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZmxkZHgscyAlcjQoJXNyMCwlcjUpLCVmcjYKLQlmbGRkeCxtICVyNCglc3IwLCVyNSksJWZyNgotCWZsZGR4LHNtICVyNCglc3IwLCVyNSksJWZyNgotCWZzdHd4ICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdHd4LHMgJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0d3gsbSAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3R3eCxzbSAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RkeCAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RkeCxzICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdGR4LG0gJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0ZHgsc20gJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0cXggJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0cXgscyAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RxeCxtICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdHF4LHNtICVmcjYsJXI0KCVzcjAsJXI1KQotCi0JZmxkd3MgMCglc3IwLCVyNSksJWZyNgotCWZsZHdzLG1iIDAoJXNyMCwlcjUpLCVmcjYKLQlmbGR3cyxtYSAwKCVzcjAsJXI1KSwlZnI2Ci0JZmxkZHMgMCglc3IwLCVyNSksJWZyNgotCWZsZGRzLG1iIDAoJXNyMCwlcjUpLCVmcjYKLQlmbGRkcyxtYSAwKCVzcjAsJXI1KSwlZnI2Ci0JZnN0d3MgJWZyNiwwKCVzcjAsJXI1KQotCWZzdHdzLG1iICVmcjYsMCglc3IwLCVyNSkKLQlmc3R3cyxtYSAlZnI2LDAoJXNyMCwlcjUpCi0JZnN0ZHMgJWZyNiwwKCVzcjAsJXI1KQotCWZzdGRzLG1iICVmcjYsMCglc3IwLCVyNSkKLQlmc3RkcyxtYSAlZnI2LDAoJXNyMCwlcjUpCi0JZnN0cXMgJWZyNiwwKCVzcjAsJXI1KQotCWZzdHFzLG1iICVmcjYsMCglc3IwLCVyNSkKLQlmc3RxcyxtYSAlZnI2LDAoJXNyMCwlcjUpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZtZW1MUmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mbWVtTFJidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEzMzBiYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZtZW1MUmJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotCS5jb2RlCi0JLmV4cG9ydAkJZgotZgotCS5wcm9jCi0JLmNhbGxpbmZvCWZyYW1lPTAsbm9fY2FsbHMKLQkuZW50cnkKLQotCWZzdHdzCQklZnI2UiwwKCVyMjYpCi0JZnN0d3MJCSVmcjZMLDQoJXIyNikKLQlmc3R3cwkJJWZyNiw4KCVyMjYpCi0KLQlmc3RkcwkJJWZyNlIsMCglcjI2KQotCWZzdGRzCQklZnI2TCw0KCVyMjYpCi0JZnN0ZHMJCSVmcjYsOCglcjI2KQotCi0JZmxkd3MJCTAoJXIyNiksJWZyNlIKLQlmbGR3cwkJNCglcjI2KSwlZnI2TAotCWZsZHdzCQk4KCVyMjYpLCVmcjYKLQotCWZsZGRzCQkwKCVyMjYpLCVmcjZSCi0JZmxkZHMJCTQoJXIyNiksJWZyNkwKLQlmbGRkcwkJOCglcjI2KSwlZnI2Ci0KLQlmc3R3cwkJJWZyNlIsMCglc3IwLCVyMjYpCi0JZnN0d3MJCSVmcjZMLDQoJXNyMCwlcjI2KQotCWZzdHdzCQklZnI2LDgoJXNyMCwlcjI2KQotCi0JZnN0ZHMJCSVmcjZSLDAoJXNyMCwlcjI2KQotCWZzdGRzCQklZnI2TCw0KCVzcjAsJXIyNikKLQlmc3RkcwkJJWZyNiw4KCVzcjAsJXIyNikKLQotCWZsZHdzCQkwKCVzcjAsJXIyNiksJWZyNlIKLQlmbGR3cwkJNCglc3IwLCVyMjYpLCVmcjZMCi0JZmxkd3MJCTgoJXNyMCwlcjI2KSwlZnI2Ci0KLQlmbGRkcwkJMCglc3IwLCVyMjYpLCVmcjZSCi0JZmxkZHMJCTQoJXNyMCwlcjI2KSwlZnI2TAotCWZsZGRzCQk4KCVzcjAsJXIyNiksJWZyNgotCi0JZnN0d3gJCSVmcjZSLCVyMjUoJXIyNikKLQlmc3R3eAkJJWZyNkwsJXIyNSglcjI2KQotCWZzdHd4CQklZnI2LCVyMjUoJXIyNikKLQotCWZzdGR4CQklZnI2UiwlcjI1KCVyMjYpCi0JZnN0ZHgJCSVmcjZMLCVyMjUoJXIyNikKLQlmc3RkeAkJJWZyNiwlcjI1KCVyMjYpCi0KLQlmbGR3eAkJJXIyNSglcjI2KSwlZnI2UgotCWZsZHd4CQklcjI1KCVyMjYpLCVmcjZMCi0JZmxkd3gJCSVyMjUoJXIyNiksJWZyNgotCi0JZmxkZHgJCSVyMjUoJXIyNiksJWZyNlIKLQlmbGRkeAkJJXIyNSglcjI2KSwlZnI2TAotCWZsZGR4CQklcjI1KCVyMjYpLCVmcjYKLQotCWZzdHd4CQklZnI2UiwlcjI1KCVzcjAsJXIyNikKLQlmc3R3eAkJJWZyNkwsJXIyNSglc3IwLCVyMjYpCi0JZnN0d3gJCSVmcjYsJXIyNSglc3IwLCVyMjYpCi0KLQlmc3RkeAkJJWZyNlIsJXIyNSglc3IwLCVyMjYpCi0JZnN0ZHgJCSVmcjZMLCVyMjUoJXNyMCwlcjI2KQotCWZzdGR4CQklZnI2LCVyMjUoJXNyMCwlcjI2KQotCi0JZmxkd3gJCSVyMjUoJXNyMCwlcjI2KSwlZnI2UgotCWZsZHd4CQklcjI1KCVzcjAsJXIyNiksJWZyNkwKLQlmbGR3eAkJJXIyNSglc3IwLCVyMjYpLCVmcjYKLQotCWZsZGR4CQklcjI1KCVzcjAsJXIyNiksJWZyNlIKLQlmbGRkeAkJJXIyNSglc3IwLCVyMjYpLCVmcjZMCi0JZmxkZHgJCSVyMjUoJXNyMCwlcjI2KSwlZnI2Ci0KLQlidgkJJXIwKCVyMikKLQlub3AKLQotCS5leGl0Ci0JLnByb2NlbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfY29tcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb21wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMDE3ZjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb21wLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlmY3B5LHNnbCAlZnI1LCVmcjEwCi0JZmNweSxkYmwgJWZyNSwlZnIxMAotCWZjcHkscXVhZCAlZnI1LCVmcjEwCi0JZmNweSxzZ2wgJWZyMjAsJWZyMjQKLQlmY3B5LGRibCAlZnIyMCwlZnIyNAotCi0JZmFicyxzZ2wgJWZyNSwlZnIxMAotCWZhYnMsZGJsICVmcjUsJWZyMTAKLQlmYWJzLHF1YWQgJWZyNSwlZnIxMAotCWZhYnMsc2dsICVmcjIwLCVmcjI0Ci0JZmFicyxkYmwgJWZyMjAsJWZyMjQKLQotCWZzcXJ0LHNnbCAlZnI1LCVmcjEwCi0JZnNxcnQsZGJsICVmcjUsJWZyMTAKLQlmc3FydCxxdWFkICVmcjUsJWZyMTAKLQlmc3FydCxzZ2wgJWZyMjAsJWZyMjQKLQlmc3FydCxkYmwgJWZyMjAsJWZyMjQKLQotCWZybmQsc2dsICVmcjUsJWZyMTAKLQlmcm5kLGRibCAlZnI1LCVmcjEwCi0JZnJuZCxxdWFkICVmcjUsJWZyMTAKLQlmcm5kLHNnbCAlZnIyMCwlZnIyNAotCWZybmQsZGJsICVmcjIwLCVmcjI0Ci0JCi0JZmFkZCxzZ2wgJWZyNCwlZnI4LCVmcjEyCi0JZmFkZCxkYmwgJWZyNCwlZnI4LCVmcjEyCi0JZmFkZCxxdWFkICVmcjQsJWZyOCwlZnIxMgotCWZhZGQsc2dsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZmFkZCxkYmwgJWZyMjAsJWZyMjQsJWZyMjgKLQlmYWRkLHF1YWQgJWZyMjAsJWZyMjQsJWZyMjgKLQotCWZzdWIsc2dsICVmcjQsJWZyOCwlZnIxMgotCWZzdWIsZGJsICVmcjQsJWZyOCwlZnIxMgotCWZzdWIscXVhZCAlZnI0LCVmcjgsJWZyMTIKLQlmc3ViLHNnbCAlZnIyMCwlZnIyNCwlZnIyOAotCWZzdWIsZGJsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZnN1YixxdWFkICVmcjIwLCVmcjI0LCVmcjI4Ci0KLQlmbXB5LHNnbCAlZnI0LCVmcjgsJWZyMTIKLQlmbXB5LGRibCAlZnI0LCVmcjgsJWZyMTIKLQlmbXB5LHF1YWQgJWZyNCwlZnI4LCVmcjEyCi0JZm1weSxzZ2wgJWZyMjAsJWZyMjQsJWZyMjgKLQlmbXB5LGRibCAlZnIyMCwlZnIyNCwlZnIyOAotCWZtcHkscXVhZCAlZnIyMCwlZnIyNCwlZnIyOAotCi0JZmRpdixzZ2wgJWZyNCwlZnI4LCVmcjEyCi0JZmRpdixkYmwgJWZyNCwlZnI4LCVmcjEyCi0JZmRpdixxdWFkICVmcjQsJWZyOCwlZnIxMgotCWZkaXYsc2dsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZmRpdixkYmwgJWZyMjAsJWZyMjQsJWZyMjgKLQlmZGl2LHF1YWQgJWZyMjAsJWZyMjQsJWZyMjgKLQotCWZyZW0sc2dsICVmcjQsJWZyOCwlZnIxMgotCWZyZW0sZGJsICVmcjQsJWZyOCwlZnIxMgotCWZyZW0scXVhZCAlZnI0LCVmcjgsJWZyMTIKLQlmcmVtLHNnbCAlZnIyMCwlZnIyNCwlZnIyOAotCWZyZW0sZGJsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZnJlbSxxdWFkICVmcjIwLCVmcjI0LCVmcjI4Ci0KLQlmbXB5YWRkLHNnbCAlZnIxNiwlZnIxNywlZnIxOCwlZnIxOSwlZnIyMAotCWZtcHlhZGQsZGJsICVmcjE2LCVmcjE3LCVmcjE4LCVmcjE5LCVmcjIwCi0JZm1weXN1YixzZ2wgJWZyMTYsJWZyMTcsJWZyMTgsJWZyMTksJWZyMjAKLQlmbXB5c3ViLGRibCAlZnIxNiwlZnIxNywlZnIxOCwlZnIxOSwlZnIyMAotCi0JeG1weXUgJWZyNCwlZnI1LCVmcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfY29udi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb252LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNDRjYjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb252LnMKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlmY252ZmYsc2dsLHNnbCAlZnI1LCVmcjEwCi0JZmNudmZmLHNnbCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmZixzZ2wscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZmLGRibCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmZixkYmwsZGJsICVmcjUsJWZyMTAKLQlmY252ZmYsZGJsLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmZixxdWFkLHNnbCAlZnI1LCVmcjEwCi0JZmNudmZmLHF1YWQsZGJsICVmcjUsJWZyMTAKLQlmY252ZmYscXVhZCxxdWFkICVmcjUsJWZyMTAKLQlmY252ZmYsc2dsLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZmZixzZ2wsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZmLHNnbCxxdWFkICVmcjIwLCVmcjI0Ci0JZmNudmZmLGRibCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252ZmYsZGJsLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmZixkYmwscXVhZCAlZnIyMCwlZnIyNAotCWZjbnZmZixxdWFkLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZmZixxdWFkLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmZixxdWFkLHF1YWQgJWZyMjAsJWZyMjQKLQotCWZjbnZ4ZixzZ2wsc2dsICVmcjUsJWZyMTAKLQlmY252eGYsc2dsLGRibCAlZnI1LCVmcjEwCi0JZmNudnhmLHNnbCxxdWFkICVmcjUsJWZyMTAKLQlmY252eGYsZGJsLHNnbCAlZnI1LCVmcjEwCi0JZmNudnhmLGRibCxkYmwgJWZyNSwlZnIxMAotCWZjbnZ4ZixkYmwscXVhZCAlZnI1LCVmcjEwCi0JZmNudnhmLHF1YWQsc2dsICVmcjUsJWZyMTAKLQlmY252eGYscXVhZCxkYmwgJWZyNSwlZnIxMAotCWZjbnZ4ZixxdWFkLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZ4ZixzZ2wsc2dsICVmcjIwLCVmcjI0Ci0JZmNudnhmLHNnbCxkYmwgJWZyMjAsJWZyMjQKLQlmY252eGYsc2dsLHF1YWQgJWZyMjAsJWZyMjQKLQlmY252eGYsZGJsLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZ4ZixkYmwsZGJsICVmcjIwLCVmcjI0Ci0JZmNudnhmLGRibCxxdWFkICVmcjIwLCVmcjI0Ci0JZmNudnhmLHF1YWQsc2dsICVmcjIwLCVmcjI0Ci0JZmNudnhmLHF1YWQsZGJsICVmcjIwLCVmcjI0Ci0JZmNudnhmLHF1YWQscXVhZCAlZnIyMCwlZnIyNAotCi0JZmNudmZ4LHNnbCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeCxzZ2wsZGJsICVmcjUsJWZyMTAKLQlmY252Zngsc2dsLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmeCxkYmwsc2dsICVmcjUsJWZyMTAKLQlmY252ZngsZGJsLGRibCAlZnI1LCVmcjEwCi0JZmNudmZ4LGRibCxxdWFkICVmcjUsJWZyMTAKLQlmY252ZngscXVhZCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeCxxdWFkLGRibCAlZnI1LCVmcjEwCi0JZmNudmZ4LHF1YWQscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZ4LHNnbCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252Zngsc2dsLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmeCxzZ2wscXVhZCAlZnIyMCwlZnIyNAotCWZjbnZmeCxkYmwsc2dsICVmcjIwLCVmcjI0Ci0JZmNudmZ4LGRibCxkYmwgJWZyMjAsJWZyMjQKLQlmY252ZngsZGJsLHF1YWQgJWZyMjAsJWZyMjQKLQlmY252ZngscXVhZCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252ZngscXVhZCxkYmwgJWZyMjAsJWZyMjQKLQlmY252ZngscXVhZCxxdWFkICVmcjIwLCVmcjI0Ci0KLQlmY252Znh0LHNnbCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeHQsc2dsLGRibCAlZnI1LCVmcjEwCi0JZmNudmZ4dCxzZ2wscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZ4dCxkYmwsc2dsICVmcjUsJWZyMTAKLQlmY252Znh0LGRibCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmeHQsZGJsLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmeHQscXVhZCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeHQscXVhZCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmeHQscXVhZCxxdWFkICVmcjUsJWZyMTAKLQlmY252Znh0LHNnbCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252Znh0LHNnbCxkYmwgJWZyMjAsJWZyMjQKLQlmY252Znh0LHNnbCxxdWFkICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxkYmwsc2dsICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxkYmwsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxkYmwscXVhZCAlZnIyMCwlZnIyNAotCWZjbnZmeHQscXVhZCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252Znh0LHF1YWQsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxxdWFkLHF1YWQgJWZyMjAsJWZyMjQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9mY21wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2ZjbXAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJkMDkyYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2ZjbXAucworKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlmY21wLHNnbCxmYWxzZT8gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsZmFsc2UgJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPyAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPD0+ICVmcjQsJWZyNQotCWZjbXAsc2dsLD0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPVQgJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPz0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsITw+ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE/Pj0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPCAlZnI0LCVmcjUKLQlmY21wLHNnbCw/PCAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPj0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT8+ICVmcjQsJWZyNQotCWZjbXAsc2dsLDw9ICVmcjQsJWZyNQotCWZjbXAsc2dsLD88PSAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPiAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPzw9ICVmcjQsJWZyNQotCWZjbXAsc2dsLD4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPz4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsITw9ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE/PCAlZnI0LCVmcjUKLQlmY21wLHNnbCw+PSAlZnI0LCVmcjUKLQlmY21wLHNnbCw/Pj0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsITwgJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT89ICVmcjQsJWZyNQotCWZjbXAsc2dsLDw+ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE9ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE9VCAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPyAlZnI0LCVmcjUKLQlmY21wLHNnbCw8PT4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsdHJ1ZT8gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsdHJ1ZSAlZnI0LCVmcjUKLQotCWZjbXAsZGJsLGZhbHNlPyAlZnI0LCVmcjUKLQlmY21wLGRibCxmYWxzZSAlZnI0LCVmcjUKLQlmY21wLGRibCw/ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE8PT4gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPSAlZnI0LCVmcjUKLQlmY21wLGRibCw9VCAlZnI0LCVmcjUKLQlmY21wLGRibCw/PSAlZnI0LCVmcjUKLQlmY21wLGRibCwhPD4gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT8+PSAlZnI0LCVmcjUKLQlmY21wLGRibCw8ICVmcjQsJWZyNQotCWZjbXAsZGJsLD88ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE+PSAlZnI0LCVmcjUKLQlmY21wLGRibCwhPz4gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPD0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPzw9ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE+ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE/PD0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPiAlZnI0LCVmcjUKLQlmY21wLGRibCw/PiAlZnI0LCVmcjUKLQlmY21wLGRibCwhPD0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT88ICVmcjQsJWZyNQotCWZjbXAsZGJsLD49ICVmcjQsJWZyNQotCWZjbXAsZGJsLD8+PSAlZnI0LCVmcjUKLQlmY21wLGRibCwhPCAlZnI0LCVmcjUKLQlmY21wLGRibCwhPz0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPD4gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT1UICVmcjQsJWZyNQotCWZjbXAsZGJsLCE/ICVmcjQsJWZyNQotCWZjbXAsZGJsLDw9PiAlZnI0LCVmcjUKLQlmY21wLGRibCx0cnVlPyAlZnI0LCVmcjUKLQlmY21wLGRibCx0cnVlICVmcjQsJWZyNQotCi0JZmNtcCxxdWFkLGZhbHNlPyAlZnI0LCVmcjUKLQlmY21wLHF1YWQsZmFsc2UgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD8gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE8PT4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD1UICVmcjQsJWZyNQotCWZjbXAscXVhZCw/PSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsITw+ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPz49ICVmcjQsJWZyNQotCWZjbXAscXVhZCw8ICVmcjQsJWZyNQotCWZjbXAscXVhZCw/PCAlZnI0LCVmcjUKLQlmY21wLHF1YWQsIT49ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPz4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLDw9ICVmcjQsJWZyNQotCWZjbXAscXVhZCw/PD0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE+ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPzw9ICVmcjQsJWZyNQotCWZjbXAscXVhZCw+ICVmcjQsJWZyNQotCWZjbXAscXVhZCw/PiAlZnI0LCVmcjUKLQlmY21wLHF1YWQsITw9ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPzwgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD49ICVmcjQsJWZyNQotCWZjbXAscXVhZCw/Pj0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE8ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPz0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLDw+ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsIT1UICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPyAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPD0+ICVmcjQsJWZyNQotCWZjbXAscXVhZCx0cnVlPyAlZnI0LCVmcjUKLQlmY21wLHF1YWQsdHJ1ZSAlZnI0LCVmcjUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfbWlzYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9taXNjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NmFjMDQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9taXNjLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLWZwdV9taXNjX3Rlc3RzOiAKLQlmdGVzdApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9pbWVtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ltZW0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0OWMxMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ltZW0ucworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgaW50ZWdlcl9tZW1vcnlfdGVzdHMsQ09ERQotCS5FWFBPUlQgaW50ZWdlcl9pbmRleGluZ19sb2FkLENPREUKLQkuRVhQT1JUIGludGVnZXJfbG9hZF9zaG9ydF9tZW1vcnksQ09ERQotCS5FWFBPUlQgaW50ZWdlcl9zdG9yZV9zaG9ydF9tZW1vcnksQ09ERQotCS5FWFBPUlQgbWFpbixDT0RFCi0JLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi07IEJhc2ljIGludGVnZXIgbWVtb3J5IHRlc3RzIHdoaWNoIGFsc28gdGVzdCB0aGUgdmFyaW91cyAKLTsgYWRkcmVzc2luZyBtb2RlcyBhbmQgY29tcGxldGVycy4KLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotOyAKLWludGVnZXJfbWVtb3J5X3Rlc3RzOiAKLQlsZHcgMCglc3IwLCVyNCksJXIyNgotCWxkaCAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRiIDAoJXNyMCwlcjQpLCVyMjYKLQlzdHcgJXIyNiwwKCVzcjAsJXI0KQotCXN0aCAlcjI2LDAoJXNyMCwlcjQpCi0Jc3RiICVyMjYsMCglc3IwLCVyNCkKLQotOyBTaG91bGQgbWFrZSBzdXJlIHByZS9wb3N0IG1vZGVzIGFyZSByZWNvZ25pemVkIGNvcnJlY3RseS4KLQlsZHdtIDAoJXNyMCwlcjQpLCVyMjYKLQlzdHdtICVyMjYsMCglc3IwLCVyNCkKLQotaW50ZWdlcl9pbmRleGluZ19sb2FkOiAKLQlsZHd4ICVyNSglc3IwLCVyNCksJXIyNgotCWxkd3gscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZHd4LG0gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGR3eCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGh4ICVyNSglc3IwLCVyNCksJXIyNgotCWxkaHgscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGh4LG0gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRoeCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGJ4ICVyNSglc3IwLCVyNCksJXIyNgotCWxkYngscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGJ4LG0gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRieCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZHdheCAlcjUoJXI0KSwlcjI2Ci0JbGR3YXgscyAlcjUoJXI0KSwlcjI2Ci0JbGR3YXgsbSAlcjUoJXI0KSwlcjI2Ci0JbGR3YXgsc20gJXI1KCVyNCksJXIyNgotCWxkY3d4ICVyNSglc3IwLCVyNCksJXIyNgotCWxkY3d4LHMgJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRjd3gsbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGN3eCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQotaW50ZWdlcl9sb2FkX3Nob3J0X21lbW9yeTogCi0JbGR3cyAwKCVzcjAsJXI0KSwlcjI2Ci0JbGR3cyxtYiAwKCVzcjAsJXI0KSwlcjI2Ci0JbGR3cyxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRocyAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRocyxtYiAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRocyxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRicyAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRicyxtYiAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRicyxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0JbGR3YXMgMCglcjQpLCVyMjYKLQlsZHdhcyxtYiAwKCVyNCksJXIyNgotCWxkd2FzLG1hIDAoJXI0KSwlcjI2Ci0JbGRjd3MgMCglc3IwLCVyNCksJXIyNgotCWxkY3dzLG1iIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGN3cyxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0KLWludGVnZXJfc3RvcmVfc2hvcnRfbWVtb3J5OiAKLQlzdHdzICVyMjYsMCglc3IwLCVyNCkKLQlzdHdzLG1iICVyMjYsMCglc3IwLCVyNCkKLQlzdHdzLG1hICVyMjYsMCglc3IwLCVyNCkKLQlzdGhzICVyMjYsMCglc3IwLCVyNCkKLQlzdGhzLG1iICVyMjYsMCglc3IwLCVyNCkKLQlzdGhzLG1hICVyMjYsMCglc3IwLCVyNCkKLQlzdGJzICVyMjYsMCglc3IwLCVyNCkKLQlzdGJzLG1iICVyMjYsMCglc3IwLCVyNCkKLQlzdGJzLG1hICVyMjYsMCglc3IwLCVyNCkKLQlzdHdhcyAlcjI2LDAoJXI0KQotCXN0d2FzLG1iICVyMjYsMCglcjQpCi0Jc3R3YXMsbWEgJXIyNiwwKCVyNCkKLQlzdGJ5cyAlcjI2LDAoJXNyMCwlcjQpCi0Jc3RieXMsYiAlcjI2LDAoJXNyMCwlcjQpCi0Jc3RieXMsZSAlcjI2LDAoJXNyMCwlcjQpCi0Jc3RieXMsYixtICVyMjYsMCglc3IwLCVyNCkKLQlzdGJ5cyxlLG0gJXIyNiwwKCVzcjAsJXI0KQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9pbW1lZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9pbW1lZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDI3ZDJmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvaW1tZWQucworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotaW1tZWRpYXRlX3Rlc3RzOiAKLQlsZG8gNSglcjI2KSwlcjI2Ci0JbGRpbCBMJTB4ZGVhZGJlZWYsJXIyNgotCWFkZGlsIEwlMHhkZWFkYmVlZiwlcjUKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9sb2dpY2FsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2xvZ2ljYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcxMDU5ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2xvZ2ljYWwucworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCW9yICVyNCwlcjUsJXI2Ci0Jb3IsPSAlcjQsJXI1LCVyNgotCW9yLDwgJXI0LCVyNSwlcjYKLQlvciw8PSAlcjQsJXI1LCVyNgotCW9yLG9kICVyNCwlcjUsJXI2Ci0Jb3IsdHIgJXI0LCVyNSwlcjYKLQlvciw8PiAlcjQsJXI1LCVyNgotCW9yLD49ICVyNCwlcjUsJXI2Ci0Jb3IsPiAlcjQsJXI1LCVyNgotCW9yLGV2ICVyNCwlcjUsJXI2Ci0KLQl4b3IgJXI0LCVyNSwlcjYKLQl4b3IsPSAlcjQsJXI1LCVyNgotCXhvciw8ICVyNCwlcjUsJXI2Ci0JeG9yLDw9ICVyNCwlcjUsJXI2Ci0JeG9yLG9kICVyNCwlcjUsJXI2Ci0JeG9yLHRyICVyNCwlcjUsJXI2Ci0JeG9yLDw+ICVyNCwlcjUsJXI2Ci0JeG9yLD49ICVyNCwlcjUsJXI2Ci0JeG9yLD4gJXI0LCVyNSwlcjYKLQl4b3IsZXYgJXI0LCVyNSwlcjYKLQotCWFuZCAlcjQsJXI1LCVyNgotCWFuZCw9ICVyNCwlcjUsJXI2Ci0JYW5kLDwgJXI0LCVyNSwlcjYKLQlhbmQsPD0gJXI0LCVyNSwlcjYKLQlhbmQsb2QgJXI0LCVyNSwlcjYKLQlhbmQsdHIgJXI0LCVyNSwlcjYKLQlhbmQsPD4gJXI0LCVyNSwlcjYKLQlhbmQsPj0gJXI0LCVyNSwlcjYKLQlhbmQsPiAlcjQsJXI1LCVyNgotCWFuZCxldiAlcjQsJXI1LCVyNgotCi0JYW5kY20gJXI0LCVyNSwlcjYKLQlhbmRjbSw9ICVyNCwlcjUsJXI2Ci0JYW5kY20sPCAlcjQsJXI1LCVyNgotCWFuZGNtLDw9ICVyNCwlcjUsJXI2Ci0JYW5kY20sb2QgJXI0LCVyNSwlcjYKLQlhbmRjbSx0ciAlcjQsJXI1LCVyNgotCWFuZGNtLDw+ICVyNCwlcjUsJXI2Ci0JYW5kY20sPj0gJXI0LCVyNSwlcjYKLQlhbmRjbSw+ICVyNCwlcjUsJXI2Ci0JYW5kY20sZXYgJXI0LCVyNSwlcjYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9wdXJnZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9wdXJnZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzE5ZjkwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvcHVyZ2UucworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXBkdGxiICVyNCglc3IwLCVyNSkKLQlwZHRsYixtICVyNCglc3IwLCVyNSkKLQlwaXRsYiAlcjQoJXNyNCwlcjUpCi0JcGl0bGIsbSAlcjQoJXNyNCwlcjUpCi0JcGR0bGJlICVyNCglc3IwLCVyNSkKLQlwZHRsYmUsbSAlcjQoJXNyMCwlcjUpCi0JcGl0bGJlICVyNCglc3I0LCVyNSkKLQlwaXRsYmUsbSAlcjQoJXNyNCwlcjUpCi0JcGRjICVyNCglc3IwLCVyNSkKLQlwZGMsbSAlcjQoJXNyMCwlcjUpCi0JZmRjICVyNCglc3IwLCVyNSkKLQlmZGMsbSAlcjQoJXNyMCwlcjUpCi0JZmljICVyNCglc3I0LCVyNSkKLQlmaWMsbSAlcjQoJXNyNCwlcjUpCi0JZmRjZSAlcjQoJXNyMCwlcjUpCi0JZmRjZSxtICVyNCglc3IwLCVyNSkKLQlmaWNlICVyNCglc3I0LCVyNSkKLQlmaWNlLG0gJXI0KCVzcjQsJXI1KQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoMWFkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDFhZGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI1ZDZjYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoMWFkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc2gxYWRkICAlcjQsJXI1LCVyNgotCXNoMWFkZCw9ICAlcjQsJXI1LCVyNgotCXNoMWFkZCw8ICAlcjQsJXI1LCVyNgotCXNoMWFkZCw8PSAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsbnV2ICAlcjQsJXI1LCVyNgotCXNoMWFkZCx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLHN2ICAlcjQsJXI1LCVyNgotCXNoMWFkZCxvZCAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsdHIgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLDw+ICAlcjQsJXI1LCVyNgotCXNoMWFkZCw+PSAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsPiAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsdXYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLHZueiAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsbnN2ICAlcjQsJXI1LCVyNgotCXNoMWFkZCxldiAgJXI0LCVyNSwlcjYKLQotCXNoMWFkZGwgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCw9ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsPCAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLDw9ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsbnV2ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsem52ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsc3YgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCxvZCAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLHRyICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsPD4gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCw+PSAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLD4gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCx1diAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLHZueiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLGV2ICAlcjQsJXI1LCVyNgotCi0Jc2gxYWRkbyAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLD0gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyw8ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sPD0gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyxudXYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyxzdiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLG9kICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sdHIgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyw8PiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLD49ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sPiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLHV2ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sdm56ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sbnN2ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sZXYgICVyNCwlcjUsJXI2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gyYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoMmFkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTljOTliLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gyYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlzaDJhZGQgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLD0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLDwgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLDw9ICAlcjQsJXI1LCVyNgotCXNoMmFkZCxudXYgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLHpudiAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsc3YgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLG9kICAlcjQsJXI1LCVyNgotCXNoMmFkZCx0ciAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsPD4gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLD49ICAlcjQsJXI1LCVyNgotCXNoMmFkZCw+ICAlcjQsJXI1LCVyNgotCXNoMmFkZCx1diAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsdm56ICAlcjQsJXI1LCVyNgotCXNoMmFkZCxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLGV2ICAlcjQsJXI1LCVyNgotCi0Jc2gyYWRkbCAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLD0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCw8ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsPD0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCxudXYgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCxzdiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLG9kICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsdHIgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCw8PiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLD49ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsPiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLHV2ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsdm56ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsbnN2ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsZXYgICVyNCwlcjUsJXI2Ci0KLQlzaDJhZGRvICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sPSAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLDwgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyw8PSAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLG51diAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLHpudiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLHN2ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sb2QgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyx0ciAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLDw+ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sPj0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyw+ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sdXYgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyx2bnogICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyxldiAgJXI0LCVyNSwlcjYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDNhZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gzYWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWU2ZTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDNhZGQucworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXNoM2FkZCAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsPSAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsPCAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsPD0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLG51diAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsem52ICAlcjQsJXI1LCVyNgotCXNoM2FkZCxzdiAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsb2QgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLHRyICAlcjQsJXI1LCVyNgotCXNoM2FkZCw8PiAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsPj0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLD4gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLHV2ICAlcjQsJXI1LCVyNgotCXNoM2FkZCx2bnogICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsZXYgICVyNCwlcjUsJXI2Ci0KLQlzaDNhZGRsICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsPSAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLDwgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCw8PSAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLG51diAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLHpudiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLHN2ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsb2QgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCx0ciAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLDw+ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsPj0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCw+ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsdXYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCx2bnogICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCxldiAgJXI0LCVyNSwlcjYKLQotCXNoM2FkZG8gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyw9ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sPCAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLDw9ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sbnV2ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sem52ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sc3YgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyxvZCAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLHRyICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sPD4gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyw+PSAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLD4gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyx1diAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLHZueiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLGV2ICAlcjQsJXI1LCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoaWZ0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoaWZ0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYzYyMWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGlmdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JdnNoZCAlcjQsJXI1LCVyNgotCXZzaGQsPSAlcjQsJXI1LCVyNgotCXZzaGQsPCAlcjQsJXI1LCVyNgotCXZzaGQsb2QgJXI0LCVyNSwlcjYKLQl2c2hkLHRyICVyNCwlcjUsJXI2Ci0JdnNoZCw8PiAlcjQsJXI1LCVyNgotCXZzaGQsPj0gJXI0LCVyNSwlcjYKLQl2c2hkLGV2ICVyNCwlcjUsJXI2Ci0KLQlzaGQgJXI0LCVyNSw1LCVyNgotCXNoZCw9ICVyNCwlcjUsNSwlcjYKLQlzaGQsPCAlcjQsJXI1LDUsJXI2Ci0Jc2hkLG9kICVyNCwlcjUsNSwlcjYKLQlzaGQsdHIgJXI0LCVyNSw1LCVyNgotCXNoZCw8PiAlcjQsJXI1LDUsJXI2Ci0Jc2hkLD49ICVyNCwlcjUsNSwlcjYKLQlzaGQsZXYgJXI0LCVyNSw1LCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NwZWNpYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BlY2lhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQxNjY3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BlY2lhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JZ2Z3ICVyNCglc3IwLCVyNSkKLQlnZncsbSAlcjQoJXNyMCwlcjUpCi0JZ2ZyICVyNCglc3IwLCVyNSkKLQlnZnIsbSAlcjQoJXNyMCwlcjUpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3Nwb3AucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BvcC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDc2YTk1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BvcC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLXNwb3BfdGVzdHM6IAotCXNwb3AwLDQsNQotCXNwb3AwLDQsMTE1Ci0Jc3BvcDAsNCw1LG4KLQlzcG9wMCw0LDExNSxuCi0Jc3BvcDEsNCw1ICVyNQotCXNwb3AxLDQsMTE1ICVyNQotCXNwb3AxLDQsNSxuICVyNQotCXNwb3AxLDQsMTE1LG4gJXI1Ci0Jc3BvcDIsNCw1ICVyNQotCXNwb3AyLDQsMTE1ICVyNQotCXNwb3AyLDQsNSxuICVyNQotCXNwb3AyLDQsMTE1LG4gJXI1Ci0Jc3BvcDMsNCw1ICVyNSwlcjYKLQlzcG9wMyw0LDExNSAlcjUsJXI2Ci0Jc3BvcDMsNCw1LG4gJXI1LCVyNgotCXNwb3AzLDQsMTE1LG4gJXI1LCVyNgotCi07IEdhcyBmdWNrcyB0aGlzIHVwLi4uICBUaGlua3MgaXQgaGFzIHRoZSBleHByZXNzaW9uIDUgbW9kIHI1LgotOwlzcG9wMSw0LDUgJXI1CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1Yi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zdWIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmZjBkZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1Yi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXN1YiAlcjQsJXI1LCVyNgotCXN1Yiw9ICVyNCwlcjUsJXI2Ci0Jc3ViLDwgJXI0LCVyNSwlcjYKLQlzdWIsPD0gJXI0LCVyNSwlcjYKLQlzdWIsPDwgJXI0LCVyNSwlcjYKLQlzdWIsPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHN2ICVyNCwlcjUsJXI2Ci0Jc3ViLG9kICVyNCwlcjUsJXI2Ci0Jc3ViLHRyICVyNCwlcjUsJXI2Ci0Jc3ViLDw+ICVyNCwlcjUsJXI2Ci0Jc3ViLD49ICVyNCwlcjUsJXI2Ci0Jc3ViLD4gJXI0LCVyNSwlcjYKLQlzdWIsPj49ICVyNCwlcjUsJXI2Ci0Jc3ViLD4+ICVyNCwlcjUsJXI2Ci0Jc3ViLG5zdiAlcjQsJXI1LCVyNgotCXN1YixldiAlcjQsJXI1LCVyNgotCi0Jc3VibyAlcjQsJXI1LCVyNgotCXN1Ym8sPSAlcjQsJXI1LCVyNgotCXN1Ym8sPCAlcjQsJXI1LCVyNgotCXN1Ym8sPD0gJXI0LCVyNSwlcjYKLQlzdWJvLDw8ICVyNCwlcjUsJXI2Ci0Jc3Vibyw8PD0gJXI0LCVyNSwlcjYKLQlzdWJvLHN2ICVyNCwlcjUsJXI2Ci0Jc3VibyxvZCAlcjQsJXI1LCVyNgotCXN1Ym8sdHIgJXI0LCVyNSwlcjYKLQlzdWJvLDw+ICVyNCwlcjUsJXI2Ci0Jc3Vibyw+PSAlcjQsJXI1LCVyNgotCXN1Ym8sPiAlcjQsJXI1LCVyNgotCXN1Ym8sPj49ICVyNCwlcjUsJXI2Ci0Jc3Vibyw+PiAlcjQsJXI1LCVyNgotCXN1Ym8sbnN2ICVyNCwlcjUsJXI2Ci0Jc3VibyxldiAlcjQsJXI1LCVyNgotCi0Jc3ViYiAlcjQsJXI1LCVyNgotCXN1YmIsPSAlcjQsJXI1LCVyNgotCXN1YmIsPCAlcjQsJXI1LCVyNgotCXN1YmIsPD0gJXI0LCVyNSwlcjYKLQlzdWJiLDw8ICVyNCwlcjUsJXI2Ci0Jc3ViYiw8PD0gJXI0LCVyNSwlcjYKLQlzdWJiLHN2ICVyNCwlcjUsJXI2Ci0Jc3ViYixvZCAlcjQsJXI1LCVyNgotCXN1YmIsdHIgJXI0LCVyNSwlcjYKLQlzdWJiLDw+ICVyNCwlcjUsJXI2Ci0Jc3ViYiw+PSAlcjQsJXI1LCVyNgotCXN1YmIsPiAlcjQsJXI1LCVyNgotCXN1YmIsPj49ICVyNCwlcjUsJXI2Ci0Jc3ViYiw+PiAlcjQsJXI1LCVyNgotCXN1YmIsbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViYixldiAlcjQsJXI1LCVyNgotCi0Jc3ViYm8gJXI0LCVyNSwlcjYKLQlzdWJibyw9ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPCAlcjQsJXI1LCVyNgotCXN1YmJvLDw9ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPDwgJXI0LCVyNSwlcjYKLQlzdWJibyw8PD0gJXI0LCVyNSwlcjYKLQlzdWJibyxzdiAlcjQsJXI1LCVyNgotCXN1YmJvLG9kICVyNCwlcjUsJXI2Ci0Jc3ViYm8sdHIgJXI0LCVyNSwlcjYKLQlzdWJibyw8PiAlcjQsJXI1LCVyNgotCXN1YmJvLD49ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPiAlcjQsJXI1LCVyNgotCXN1YmJvLD4+PSAlcjQsJXI1LCVyNgotCXN1YmJvLD4+ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sZXYgJXI0LCVyNSwlcjYKLQotCXN1YnQgJXI0LCVyNSwlcjYKLQlzdWJ0LD0gJXI0LCVyNSwlcjYKLQlzdWJ0LDwgJXI0LCVyNSwlcjYKLQlzdWJ0LDw9ICVyNCwlcjUsJXI2Ci0Jc3VidCw8PCAlcjQsJXI1LCVyNgotCXN1YnQsPDw9ICVyNCwlcjUsJXI2Ci0Jc3VidCxzdiAlcjQsJXI1LCVyNgotCXN1YnQsb2QgJXI0LCVyNSwlcjYKLQlzdWJ0LHRyICVyNCwlcjUsJXI2Ci0Jc3VidCw8PiAlcjQsJXI1LCVyNgotCXN1YnQsPj0gJXI0LCVyNSwlcjYKLQlzdWJ0LD4gJXI0LCVyNSwlcjYKLQlzdWJ0LD4+PSAlcjQsJXI1LCVyNgotCXN1YnQsPj4gJXI0LCVyNSwlcjYKLQlzdWJ0LG5zdiAlcjQsJXI1LCVyNgotCXN1YnQsZXYgJXI0LCVyNSwlcjYKLQotCXN1YnRvICVyNCwlcjUsJXI2Ci0Jc3VidG8sPSAlcjQsJXI1LCVyNgotCXN1YnRvLDwgJXI0LCVyNSwlcjYKLQlzdWJ0byw8PSAlcjQsJXI1LCVyNgotCXN1YnRvLDw8ICVyNCwlcjUsJXI2Ci0Jc3VidG8sPDw9ICVyNCwlcjUsJXI2Ci0Jc3VidG8sc3YgJXI0LCVyNSwlcjYKLQlzdWJ0byxvZCAlcjQsJXI1LCVyNgotCXN1YnRvLHRyICVyNCwlcjUsJXI2Ci0Jc3VidG8sPD4gJXI0LCVyNSwlcjYKLQlzdWJ0byw+PSAlcjQsJXI1LCVyNgotCXN1YnRvLD4gJXI0LCVyNSwlcjYKLQlzdWJ0byw+Pj0gJXI0LCVyNSwlcjYKLQlzdWJ0byw+PiAlcjQsJXI1LCVyNgotCXN1YnRvLG5zdiAlcjQsJXI1LCVyNgotCXN1YnRvLGV2ICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1YmkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3ViaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjMyNjdjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3ViaS5zCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc3ViaSAxMjMsJXI1LCVyNgotCXN1YmksPSAxMjMsJXI1LCVyNgotCXN1YmksPCAxMjMsJXI1LCVyNgotCXN1YmksPD0gMTIzLCVyNSwlcjYKLQlzdWJpLDw8IDEyMywlcjUsJXI2Ci0Jc3ViaSw8PD0gMTIzLCVyNSwlcjYKLQlzdWJpLHN2IDEyMywlcjUsJXI2Ci0Jc3ViaSxvZCAxMjMsJXI1LCVyNgotCXN1YmksdHIgMTIzLCVyNSwlcjYKLQlzdWJpLDw+IDEyMywlcjUsJXI2Ci0Jc3ViaSw+PSAxMjMsJXI1LCVyNgotCXN1YmksPiAxMjMsJXI1LCVyNgotCXN1YmksPj49IDEyMywlcjUsJXI2Ci0Jc3ViaSw+PiAxMjMsJXI1LCVyNgotCXN1YmksbnN2IDEyMywlcjUsJXI2Ci0Jc3ViaSxldiAxMjMsJXI1LCVyNgotCi0Jc3ViaW8gMTIzLCVyNSwlcjYKLQlzdWJpbyw9IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPCAxMjMsJXI1LCVyNgotCXN1YmlvLDw9IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPDwgMTIzLCVyNSwlcjYKLQlzdWJpbyw8PD0gMTIzLCVyNSwlcjYKLQlzdWJpbyxzdiAxMjMsJXI1LCVyNgotCXN1YmlvLG9kIDEyMywlcjUsJXI2Ci0Jc3ViaW8sdHIgMTIzLCVyNSwlcjYKLQlzdWJpbyw8PiAxMjMsJXI1LCVyNgotCXN1YmlvLD49IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPiAxMjMsJXI1LCVyNgotCXN1YmlvLD4+PSAxMjMsJXI1LCVyNgotCXN1YmlvLD4+IDEyMywlcjUsJXI2Ci0Jc3ViaW8sbnN2IDEyMywlcjUsJXI2Ci0Jc3ViaW8sZXYgMTIzLCVyNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3lzdGVtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N5c3RlbS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjJlN2JmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3lzdGVtLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlicmVhayA1LDEyCi0JcmZpCi0JcmZpcgotCXNzbSA1LCVyNAotCXJzbSA1LCVyNAotCW10c20gJXI0Ci0JbGRzaWQgKCVzcjAsJXI1KSwlcjQKLQltdHNwICVyNCwlc3IwCi0JbXRjdGwgJXI0LCVjcjEwCi0JbWZzcCAlc3IwLCVyNAotCW1mY3RsICVjcjEwLCVyNAotCXN5bmMKLQlzeW5jZG1hCi0JZGlhZyAxMjM0Ci0KLQlwcm9iZXIgKCVzcjAsJXI1KSwlcjYsJXI3Ci0JcHJvYmVyaSAoJXNyMCwlcjUpLDEsJXI3Ci0JcHJvYmV3ICglc3IwLCVyNSksJXI2LCVyNwotCXByb2Jld2kgKCVzcjAsJXI1KSwxLCVyNwotCQotCWxwYSAlcjQoJXNyMCwlcjUpLCVyNgotCWxwYSxtICVyNCglc3IwLCVyNSksJXI2Ci0JbGhhICVyNCglc3IwLCVyNSksJXI2Ci0JbGhhLG0gJXI0KCVzcjAsJXI1KSwlcjYKLQlsY2kgJXI0KCVzcjAsJXI1KSwlcjYKLQotCWlkdGxiYSAlcjQsKCVzcjAsJXI1KQotCWlpdGxiYSAlcjQsKCVzcjQsJXI1KQotCWlkdGxicCAlcjQsKCVzcjAsJXI1KQotCWlpdGxicCAlcjQsKCVzcjQsJXI1KQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy91bml0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3VuaXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5YjEwZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3VuaXQucworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCi0JdXhvciAlcjQsJXI1LCVyNgotCXV4b3Isc2J6ICVyNCwlcjUsJXI2Ci0JdXhvcixzaHogJXI0LCVyNSwlcjYKLQl1eG9yLHNkYyAlcjQsJXI1LCVyNgotCXV4b3Isc2JjICVyNCwlcjUsJXI2Ci0JdXhvcixzaGMgJXI0LCVyNSwlcjYKLQl1eG9yLHRyICVyNCwlcjUsJXI2Ci0JdXhvcixuYnogJXI0LCVyNSwlcjYKLQl1eG9yLG5oeiAlcjQsJXI1LCVyNgotCXV4b3IsbmRjICVyNCwlcjUsJXI2Ci0JdXhvcixuYmMgJXI0LCVyNSwlcjYKLQl1eG9yLG5oYyAlcjQsJXI1LCVyNgotCi0JdWFkZGNtICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHNieiAlcjQsJXI1LCVyNgotCXVhZGRjbSxzaHogJXI0LCVyNSwlcjYKLQl1YWRkY20sc2RjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHNiYyAlcjQsJXI1LCVyNgotCXVhZGRjbSxzaGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sdHIgJXI0LCVyNSwlcjYKLQl1YWRkY20sbmJ6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLG5oeiAlcjQsJXI1LCVyNgotCXVhZGRjbSxuZGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sbmJjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLG5oYyAlcjQsJXI1LCVyNgotCi0JdWFkZGNtdCAlcjQsJXI1LCVyNgotCXVhZGRjbXQsc2J6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxzaHogJXI0LCVyNSwlcjYKLQl1YWRkY210LHNkYyAlcjQsJXI1LCVyNgotCXVhZGRjbXQsc2JjICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxzaGMgJXI0LCVyNSwlcjYKLQl1YWRkY210LHRyICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxuYnogJXI0LCVyNSwlcjYKLQl1YWRkY210LG5oeiAlcjQsJXI1LCVyNgotCXVhZGRjbXQsbmRjICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxuYmMgJXI0LCVyNSwlcjYKLQl1YWRkY210LG5oYyAlcjQsJXI1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy93ZWlyZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy93ZWlyZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGY0ZWExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvd2VpcmQucworKysgL2Rldi9udWxsCkBAIC0xLDg3MCArMCwwIEBACi0JLnN0YWJzICJ3ZWlyZC5jIiwweDY0LDAsMCxMYWJlbDAKLUxhYmVsMDoKLQkuc3RhYnMgImludHR5cGU6dDE9YnU0OzA7MzI7IiwweDgwLDAsMCwwCi0KLQotCS5zdGFicyAic3ltMzI6ICAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCi0JLnN0YWJzICJ0eXBlMzI6dDMyPSAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCi0JLnN0YWJzICJhdHRyMTA0Okc0MDQ9QGggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEwNTpHNDA1PUBpICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5zdGFicyAidmFyMDpHMzAwPUBhODsxIiwweDIwLDAsMCwgMAotCS5leHBvcnQgdmFyMAotCS5kYXRhCi0JLmFsaWduIDQKLXZhcjA6Ci0JLmxvbmcgNDIKLQotCS5zdGFicyAic3ltMzM6ISAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMzU6IyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMzY6JCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMzc6JSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMzg6JiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMzk6JyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNDA6KCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNDE6KSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNDI6KiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNDM6KyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNDQ6LCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNDU6LSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCi0JLmV4cG9ydCBhdHRyMTIyCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEyMjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEyMwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMjM6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMjQKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTI0OgotCS5sb25nIDQyCi0KLQkuc3RhYnMgInN5bTQ2Oi4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQ3Oi8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQ4OjAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQ5OjEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTUwOjIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCS5zdGFicyAiYXR0cjk2OkczOTY9QGAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjk3OkczOTc9QGEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjk4OkczOTg9QGIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjk5OkczOTk9QGMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLnN0YWJzICJzeW01MTozICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01Mjo0ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01Mzo1ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01NDo2ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01NTo3ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01Njo4ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01Nzo5ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01ODo6ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01OTo7ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02MDo8ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02MTo9ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02Mjo+ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02Mzo/ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02NDpAICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02NTpBICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02NjpCICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02NzpDICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02ODpEICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW02OTpFICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03MDpGICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03MTpHICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03MjpIICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03MzpJICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03NDpKICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03NTpLICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03NjpMICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03NzpNICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03ODpOICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW03OTpPICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04MDpQICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04MTpRICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04MjpSICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04MzpTICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04NDpUICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04NTpVICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04NjpWICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04NzpXICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04ODpYICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW04OTpZICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW05MDpaICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW05MTpbICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0KLQkuc3RhYnMgInN5bTkzOl0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTk0Ol4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTk1Ol8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTk2OmAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTk3OmEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTk4OmIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTk5OmMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEwMDpkICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMDE6ZSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTAyOmYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEwMzpnICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMDQ6aCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTA1OmkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEwNjpqICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMDc6ayAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTA4OmwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEwOTptICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMTA6biAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTExOm8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTExMjpwICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMTM6cSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTE0OnIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTExNTpzICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMTY6dCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTE3OnUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTExODp2ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMTk6dyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTIwOnggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEyMTp5ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMjI6eiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTIzOnsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEyNDp8ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMjU6fSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTI2On4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCS5zdGFicyAidHlwZTMzOnQzMz0hICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMzU6dDM1PSMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUzNjp0MzY9JCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTM3OnQzNz0lICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMzg6dDM4PSYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUzOTp0Mzk9JyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTQwOnQ0MD0oICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNDE6dDQxPSkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU0Mjp0NDI9KiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTQzOnQ0Mz0rICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNDQ6dDQ0PSwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU0NTp0NDU9LSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTQ2OnQ0Nj0uICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNDc6dDQ3PS8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU0ODp0NDg9MCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTQ5OnQ0OT0xICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNTA6dDUwPTIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU1MTp0NTE9MyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTUyOnQ1Mj00ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNTM6dDUzPTUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU1NDp0NTQ9NiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTU1OnQ1NT03ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNTY6dDU2PTggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU1Nzp0NTc9OSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTU4OnQ1OD06ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNTk6dDU5PTsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU2MDp0NjA9PCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTYxOnQ2MT09ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNjI6dDYyPT4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU2Mzp0NjM9PyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTY0OnQ2ND1AICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNjU6dDY1PUEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU2Njp0NjY9QiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTY3OnQ2Nz1DICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0KLQkuZXhwb3J0IGF0dHI2NgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI2NjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjY3Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjY3OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNjgKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNjg6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI2OQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI2OToKLQkubG9uZyA0MgotCi0JLnN0YWJzICJ0eXBlNjg6dDY4PUQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU2OTp0Njk9RSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTcwOnQ3MD1GICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNzE6dDcxPUcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU3Mjp0NzI9SCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTczOnQ3Mz1JICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNzQ6dDc0PUogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU3NTp0NzU9SyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTc2OnQ3Nj1MICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNzc6dDc3PU0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU3ODp0Nzg9TiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTc5OnQ3OT1PICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlODA6dDgwPVAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU4MTp0ODE9USAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTgyOnQ4Mj1SICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlODM6dDgzPVMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU4NDp0ODQ9VCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTg1OnQ4NT1VICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlODY6dDg2PVYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU4Nzp0ODc9VyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCi0JLnN0YWJzICJhdHRyNjk6RzM2OT1ARSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzA6RzM3MD1ARiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzE6RzM3MT1ARyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQkuc3RhYnMgInR5cGU4ODp0ODg9WCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTg5OnQ4OT1ZICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlOTA6dDkwPVogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU5MTp0OTE9WyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCi0JLnN0YWJzICJ0eXBlOTM6dDkzPV0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU5NDp0OTQ9XiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTk1OnQ5NT1fICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlOTY6dDk2PWAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU5Nzp0OTc9YSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTk4OnQ5OD1iICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlOTk6dDk5PWMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMDA6dDEwMD1kICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTAxOnQxMDE9ZSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEwMjp0MTAyPWYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMDM6dDEwMz1nICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTA0OnQxMDQ9aCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEwNTp0MTA1PWkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMDY6dDEwNj1qICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTA3OnQxMDc9ayAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEwODp0MTA4PWwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMDk6dDEwOT1tICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTEwOnQxMTA9biAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTExMTp0MTExPW8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMTI6dDExMj1wICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTEzOnQxMTM9cSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTExNDp0MTE0PXIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMTU6dDExNT1zICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTE2OnQxMTY9dCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTExNzp0MTE3PXUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMTg6dDExOD12ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTE5OnQxMTk9dyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEyMDp0MTIwPXggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMjE6dDEyMT15ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTIyOnQxMjI9eiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEyMzp0MTIzPXsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMjQ6dDEyND18ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTI1OnQxMjU9fSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEyNjp0MTI2PX4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCS5zdGFicyAiYXR0cjMyOkczMzI9QCAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjMzOkczMzM9QCEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjM1OkczMzQ9QCMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLnN0YWJzICJwcmltYXJ5OkcyMDA9ZXJlZDowLGdyZWVuOjEsYmx1ZToyLDsiLCAweDIwLDAsMCwgMAotCi0JLnN0YWJzICJhdHRyMzY6RzMzNT1AJCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQkuZXhwb3J0IHByaW1hcnkKLQkuZGF0YQotCS5hbGlnbiA0Ci1wcmltYXJ5OgotCS5sb25nIDQyCi0KLQkuc3RhYnMgImF0dHIzNzpHMzM3PUAlICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5zdGFicyAiY29uc3Q2OTpjPWUxLDY5IiwgMHg4MCwwLDAsIDAKLQotCS5zdGFicyAiY29uc3Q3MDpjPWUxOTA9YnMyOzA7MTY7LDcwIiwgMHg4MCwwLDAsIDAKLQotCS5zdGFicyAiYXR0cjM4OkczMzg9QCYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLnN0YWJzICJiYWRfbmVnMHR5cGU6dDIwMT1zOGZpZWxkMDoxLDAsMzI7ZmllbGQyOi01MzQsMzIsNjQ7ZmllbGQzOi0xLDk2LDMyOzsiLCAweDgwLDAsMCwgMAotCi0JLnN0YWJzICJiYWRfbmVnMDpHMjAxIiwgMHgyMCwwLDAsIDAKLQotCS5leHBvcnQgYmFkX25lZzAKLQkuZGF0YQotCS5hbGlnbiA0Ci1iYWRfbmVnMDoKLQkubG9uZyA0MgotCS5sb25nIDQzLCA0NCwgNDUKLQotCS5zdGFicyAiYXR0cjM5OkczMzk9QCcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjQxOkczNDE9QCkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjQyOkczNDI9QCogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjQzOkczNDM9QCsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjQ0OkczNDQ9QCwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjQ2OkczNDY9QC4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjQ3OkczNDc9QC8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjU4OkczNTg9QDogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLnN0YWJzICJhdHRyNTk6RzM1OT1AO0AgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLnN0YWJzICJhdHRyNjA6RzM2MD1APCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNjE6RzM2MT1APSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNjI6RzM2Mj1APiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNjM6RzM2Mz1APyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNjQ6RzM2ND1AQCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNjU6RzM2NT1AQSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNjY6RzM2Nj1AQiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNjc6RzM2Nz1AQyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNjg6RzM2OD1ARCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzI6RzM3Mj1ASCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzM6RzM3Mz1ASSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzQ6RzM3ND1ASiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzU6RzM3NT1ASyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzY6RzM3Nj1ATCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzc6RzM3Nz1ATSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzg6RzM3OD1ATiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNzk6RzM3OT1ATyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODA6RzM4MD1AUCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODE6RzM4MT1AUSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODI6RzM4Mj1AUiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODM6RzM4Mz1AUyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODQ6RzM4ND1AVCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODU6RzM4NT1AVSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODY6RzM4Nj1AViAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODc6RzM4Nz1AVyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODg6RzM4OD1AWCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyODk6RzM4OT1AWSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyOTA6RzM5MD1AWiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyOTE6RzM5MT1AWyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQkuc3RhYnMgImF0dHI5MzpHMzkzPUBdICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCi0JLmV4cG9ydCBfY29tbW9uMAotCS5kYXRhCi0JLmFsaWduIDQKLV9jb21tb24wOgotCS5sb25nIDQyCi0JLmxvbmcgMjQKLQkubG9uZyAyMgotCS5leHBvcnQgY29tbW9uMAotCS5kYXRhCi0JLmFsaWduIDQKLWNvbW1vbjA6Ci0JLmxvbmcgNDIKLQkubG9uZyAyNAotCS5sb25nIDIyCi0JLnN0YWJzICAiY29tbW9uMCIsMHhlMiwwLDAsMAotCS5zdGFicyAiY29tbW9uMHZhcjA6UzEiLCAweDIwLDAsMCwgMAotCS5zdGFicyAiY29tbW9uMHZhcjE6UzEiLCAweDIwLDAsMCwgNAotCS5zdGFicyAiY29tbW9uMHZhcjI6UzEiLCAweDIwLDAsMCwgOAotCS5zdGFicyAgImNvbW1vbjAiLDB4ZTQsMCwwLDAKLQotCS5zdGFicyAiYXR0cjk0OkczOTQ9QF4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjk1OkczOTU9QF8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEwMDpHNDAwPUBkICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMDE6RzQwMT1AZSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTAyOkc0MDI9QGYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEwMzpHNDAzPUBnICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMDY6RzQwNj1AaiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTA3Okc0MDc9QGsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEwODpHNDA4PUBsICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMDk6RzQwOT1AbSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTEwOkc0MTA9QG4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjExMTpHNDExPUBvICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMTI6RzQxMj1AcCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTEzOkc0MTM9QHEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjExNDpHNDE0PUByICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMTU6RzQxNT1AcyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTE2Okc0MTY9QHQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjExNzpHNDE3PUB1ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMTg6RzQxOD1AdiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTE5Okc0MTk9QHcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEyMDpHNDIwPUB4ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMjE6RzQyMT1AeSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTIyOkc0MjI9QHogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEyMzpHNDIzPUB7ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMjQ6RzQyND1AfCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTI1Okc0MjU9QH0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEyNjpHNDI2PUB+ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5leHBvcnQgYXR0cjMyCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjMyOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMzMKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMzM6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIzNQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIzNToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjM2Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjM2OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMzcKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMzc6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIzOAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIzODoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjM5Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjM5OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNDEKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNDE6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI0MgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI0MjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjQzCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjQzOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNDQKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNDQ6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI0NgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI0NjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjQ3Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjQ3OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNTgKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNTg6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI1OQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI1OToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjYwCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjYwOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNjEKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNjE6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI2MgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI2MjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjYzCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjYzOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNjQKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNjQ6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI2NQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI2NToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjcwCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjcwOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNzEKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNzE6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI3MgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI3MjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjczCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjczOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNzQKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNzQ6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI3NQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI3NToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjc2Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjc2OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNzcKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNzc6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI3OAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI3ODoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjc5Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjc5OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyODAKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODA6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI4MQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI4MToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjgyCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjgyOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyODMKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODM6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI4NAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI4NDoKLQkubG9uZyA0MgotCi0JLnN0YWJzICJmbG9hdDcydHlwZTp0MjAyPVI4Nzs5OyIsIDB4ODAsMCwwLCAwCi0KLQkuc3RhYnMgImludDI1NnZhcjpHMjAzPWJ1MzI7MDsyNTY7IiwgMHgyMCwwLDAsIDAKLQkuZXhwb3J0IGludDI1NnZhcgotCS5kYXRhCi0JLmFsaWduIDQKLWludDI1NnZhcjoKLQkubG9uZyA0MgotCS5sb25nIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmQsIDB4MmMsIDB4MmIsIDB4MmEKLQotCi0JLnN0YWJzICJjb25zdGg6Yz1lMSw0Mjk0OTY3Mjk2IiwgMHg4MCwwLDAsIDAKLQotCS5zdGFicyAiY29uc3RoMjpjPWUxLC03MzQ3MjM5ODU3MzI2NDI3NTg5Mjg0NzU2Nzg5ODcyMzQ1NjMyODQ5Mzc0NTYiLCAweDgwLDAsMCwgMAotCi0JLnN0YWJzICJiYWRfbmVnMGNvbnN0OmM9UzIwMSwxMjgsMTI4LDExMjIyMjExMzQzNDM0MzQ1NjU2NTY1Njc3ODg4ODc3IiwgMHg4MCwwLDAsIDAKLQotCS5zdGFicyAiYmFkX3R5cGUwOnQoLTMsNykiLCAweDgwLDAsMCwgMAotCS5zdGFicyAiYmFkX3R5cGUxOnQoNDIsNikiLCAweDgwLDAsMCwgMAotCi0JLnN0YWJzICJhcnJheV9pbmRleDA6dDIwNT1yMTswOzU7IiwgMHg4MCwwLDAsIDAKLQkuc3RhYnMgImFycmF5MDpHMjA2PWEyMDU7MSIsIDB4MjAsMCwwLCAwCi0JLmV4cG9ydCBhcnJheTAKLQkuZGF0YQotCS5hbGlnbiA0Ci1hcnJheTA6Ci0JLmxvbmcgNDIKLQkubG9uZyA0MywgNDQsIDQ1LCA0NiwgNDcKLQotCS5zdGFicyAiYXJyYXlfaW5kZXgxOnQyMDc9IiwgMHg4MCwwLDAsIDAKLQkuc3RhYnMgImFycmF5MTpHMjA4PWFlYWkxX3JlZDowLGFpMV9ncmVlbjoxLGFpMV9ibHVlOjIsOzsxIiwgMHgyMCwwLDAsIDAKLQkuZXhwb3J0IGFycmF5MQotCS5kYXRhCi0JLmFsaWduIDQKLWFycmF5MToKLQkubG9uZyA0MgotCS5sb25nIDQzLCA0NAotCi0JLnN0YWJzICJpbnR0eXBlX29uZTp0MjA5PTEiLCAweDgwLDAsMCwgMAotCS5zdGFicyAiaW50dHlwZV90d286dDIxMD0xIiwgMHg4MCwwLDAsIDAKLQkuc3RhYnMgIm9uZV92YXI6RzIwOSIsIDB4MjAsMCwwLCAwCi0JLmV4cG9ydCBvbmVfdmFyCi0JLmRhdGEKLQkuYWxpZ24gNAotb25lX3ZhcjoKLQkubG9uZyA0MgotCS5zdGFicyAidHdvX3ZhcjpHMjEwIiwgMHgyMCwwLDAsIDAKLQkuZXhwb3J0IHR3b192YXIKLQkuZGF0YQotCS5hbGlnbiA0Ci10d29fdmFyOgotCS5sb25nIDQyCi0KLQkuc3RhYnMgImludHA6dDIxMT0qMSIsIDB4ODAsMCwwLCAwCi0JLnN0YWJzICJwb2ludGVyX3RvX2ludF92YXI6RzIxMj0qMSIsIDB4ODAsMCwwLCAwCi0JLnN0YWJzICJpbnRwX3ZhcjpHMjExIiwgMHgyMCwwLDAsIDAKLQkuZXhwb3J0IGludHBfdmFyCi0JLmRhdGEKLQkuYWxpZ24gNAotaW50cF92YXI6Ci0JLmxvbmcgNDIKLQotCS5zdGFicyAidW5yZWNvZ19jb25zdDpjPXhqa3NkZmxza2QzMyw0OzQ3MzsiLCAweDgwLDAsMCwgMAotCi0JLmV4cG9ydCBhdHRyODUKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODU6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI4NgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI4NjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjg3Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjg3OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyODgKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODg6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI4OQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI4OToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjkwCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjkwOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyOTEKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyOTE6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI5MgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI5MjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjkzCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjkzOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyOTQKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyOTQ6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI5NQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI5NToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjk2Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjk2OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyOTcKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyOTc6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI5OAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI5ODoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjk5Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjk5OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTAwCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEwMDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEwMQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMDE6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMDIKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTAyOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTAzCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEwMzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEwNAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMDQ6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMDUKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTA1OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTA2Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEwNjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEwNwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMDc6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMDgKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTA4OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTA5Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEwOToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjExMAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMTA6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMTEKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTExOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTEyCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjExMjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjExMwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMTM6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMTQKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTE0OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTE1Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjExNToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjExNgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMTY6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMTcKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTE3OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTE4Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjExODoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjExOQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMTk6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMjAKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTIwOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTIxCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEyMToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEyNQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMjU6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMjYKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTI2OgotCS5sb25nIDQyCi0KLQkuc3RhYnMgInZhcjE6RzMwMT1AczMyOzEiLDB4MjAsMCwwLCAwCi0JLmV4cG9ydCB2YXIxCi0JLmRhdGEKLQkuYWxpZ24gNAotdmFyMToKLQkubG9uZyA0MgotCS5zdGFicyAidmFyMjpHMzAyPUBwNDI7MSIsMHgyMCwwLDAsIDAKLQkuZXhwb3J0IHZhcjIKLQkuZGF0YQotCS5hbGlnbiA0Ci12YXIyOgotCS5sb25nIDQyCi0JLnN0YWJzICJ2YXIzOkczMDM9QFA7MSIsMHgyMCwwLDAsIDAKLQkuZXhwb3J0IHZhcjMKLQkuZGF0YQotCS5hbGlnbiA0Ci12YXIzOgotCS5sb25nIDQyCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0JLnN0YWJzICJ2X2NvbWI6RzQ0OD1zMjQhMiwwMjAsNDQ1PXMxMiExLDEyMCw0NDQ9czR4OjEsMCwzMjs7OyR2YjQ0NDo0NDY9KjQ0NCwwO2E6LzAxLDMyLDMyOzs7MDI2NCw0NDc9czEyITEsMTIwLDQ0NDskdmI0NDQ6NDQ2LDA7YjovMDEsMzIsMzI7Oztjb21iOi8wMSwxMjgsMzI7OyIsIDB4MjAsMCwwLCAwCi0KLQkuZXhwb3J0IHZfY29tYgotCS5hbGlnbiAxCi12X2NvbWI6Ci0JLmxvbmcgdl9jb21iX3NoYXJlZCAKLQkubG9uZyA0MyAKLQkubG9uZyB2X2NvbWJfc2hhcmVkIAotCS5sb25nIDQ0IAotCS5sb25nIDQ1IAotdl9jb21iX3NoYXJlZDoKLQkubG9uZyA0MiAKLQotCS5zdGFicyAic3ltOTI6XFwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU5Mjp0OTI9XFwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgImF0dHI5MjpHMzkyPUBcXCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FsaWduMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9hbGlnbjEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4MWU5Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FsaWduMS5zCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiAxCi0JLmFsaWduIDgKLQlub3AKLTsgIjgiIGFzc3VtZWQgaWYgbm8gYWxpZ25tZW50IGdpdmVuLgotCS5hbGlnbgotCW5vcAotCS5hbGlnbiA0MDk2Ci0Jbm9wCi0KLQotICAgICAgICAuU1BBQ0UgICRQUklWQVRFJAotICAgICAgICAuU1VCU1BBICRCU1MkCi0KLSAgICAgICAgLkFMSUdOICA4Ci0kTDAwQlNTOgotaG9tZV9idWZmOgotICAgICAgICAuQkxPQ0sgIDEwMjQKLSAgICAgICAgLkFMSUdOICA4Ci1jdXJyZW50X2J1ZmY6Ci0gICAgICAgIC5CTE9DSyAgMTAyNAotICAgICAgICAuQUxJR04gIDQKLWxvY2tfZmlsZToKLSAgICAgICAgLkJMT0NLICA0Ci0gICAgICAgIC5BTElHTiAgOAotTDMzMi5uYW1lOgotICAgICAgICAuQkxPQ0sgIDMwCi0gICAgICAgIC5BTElHTiAgNAotTDM1Mi5sYXN0X2Nhc2Vfd2E6Ci0gICAgICAgIC5CTE9DSyAgNAotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYWxpZ24yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FsaWduMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjczNGM4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYWxpZ24yLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDMKLQotCQotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYXBwYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FwcGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTM3ZjllLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYXBwYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIDEgImNydDAucyIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmFkZm1weWFkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9iYWRmbXB5YWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMWMxZjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9iYWRmbXB5YWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBmb29iYXIsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1GUixBUkdXMT1GVSxBUkdXMj1GUixBUkdXMz1GVSxSVE5WQUw9RlIKLWZvb2JhcgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQlsZG8gLTY0KCVyMzApLCVyMjAKLQlhZGRpbCBMUid4LSRnbG9iYWwkLCVyMjcKLQlmbGRkcyA4KCVyMjApLCVmcjQKLQlmbGRkcyAwKCVyMjApLCVmcjIyCi0JbGRvIFJSJ3gtJGdsb2JhbCQoJXIxKSwlcjE5Ci0JZm1weXN1YixzZ2wgJWZyNUwsJWZyN0wsJWZyNUwsJWZyMjJMLCVmcjRMCi0JYnYgJXIwKCVyMikKLQlmc3RkcyAlZnI1LDAoJXIxOSkKLQkuRVhJVAotCS5QUk9DRU5ECi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJEJTUyQKLQoteAkuY29tbSA4Ci15CS5jb21tIDgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmxvY2sxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2Jsb2NrMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTc2OTlmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmxvY2sxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICREQVRBJAotCi1mb286Ci0JLmJsb2NrCi1iYXI6Ci0JLmJsb2NrIDB4N2ZmZmZmZmYKLWNvbToKLQotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmxvY2syLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2Jsb2NrMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTNiNWYxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmxvY2syLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICREQVRBJAotCi1mb286Ci0JLmJsb2NrIC0xCi0KLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2NhbGxkYXRhYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2NhbGxkYXRhYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjODBjZjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9jYWxsZGF0YWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5JTVBPUlQgcHJpbnRmLENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci1MQyQwMDAwOgotCS5TVFJJTkcgIiVkICVsZiAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBlcnJvcl9fM0FBQWlpZGkKLQkuRVhQT1JUIGVycm9yX18zQUFBaWlkaSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUZSLEFSR1c0PUZVLFJUTlZBTD1HUgotZXJyb3JfXzNBQUFpaWRpOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOSw4KCVyNCkKLQlzdHcgJXI4LDEyKCVyNCkKLQlzdHcgJXI3LDE2KCVyNCkKLQlzdHcgJXI2LDIwKCVyNCkKLQlzdHcgJXI1LDI0KCVyNCkKLQljb3B5ICVyMjYsJXI1Ci0JbGRvIC04KCVyMCksJXI2Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjYsJXI3Ci0Jc3R3ICVyMjUsMCglcjcpCi0JbGRvIC0xMiglcjApLCVyOAotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI4LCVyOQotCXN0dyAlcjI0LDAoJXI5KQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtMjQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZG8gLTI4KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01MiglcjMwKQotCWxkaWwgTCdMQyQwMDAwLCVyMjYKLQlsZG8gUidMQyQwMDAwKCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JZmxkZHMgMCglcjIwKSwlZnI3Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9RlIsQVJHVzM9RlUKLQlibCBwcmludGYsJXIyCi0Jbm9wCi0JYmwsbiBMJDAwMDIsJXIwCi0JYmwsbiBMJDAwMDEsJXIwCi1MJDAwMDI6Ci1MJDAwMDE6Ci0JbGR3IDgoJXI0KSwlcjkKLQlsZHcgMTIoJXI0KSwlcjgKLQlsZHcgMTYoJXI0KSwlcjcKLQlsZHcgMjAoJXI0KSwlcjYKLQlsZHcgMjQoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIG9rX18zQUFBaWRpCi0JLkVYUE9SVCBva19fM0FBQWlkaSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUZSLEFSR1czPUZVLFJUTlZBTD1HUgotb2tfXzNBQUFpZGk6Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI5LDgoJXI0KQotCXN0dyAlcjgsMTIoJXI0KQotCXN0dyAlcjcsMTYoJXI0KQotCXN0dyAlcjYsMjAoJXI0KQotCXN0dyAlcjUsMjQoJXI0KQotCWNvcHkgJXIyNiwlcjUKLQlsZG8gLTgoJXIwKSwlcjYKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNiwlcjcKLQlzdHcgJXIyNSwwKCVyNykKLQlsZG8gLTE2KCVyMCksJXI4Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjgsJXI5Ci0JZnN0ZHMgJWZyNywwKCVyOSkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTE2KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGRvIC0yMCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlzdHcgJXIyMiwtNTIoJXIzMCkKLQlsZGlsIEwnTEMkMDAwMCwlcjI2Ci0JbGRvIFInTEMkMDAwMCglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCWZsZGRzIDAoJXIyMCksJWZyNwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUZSLEFSR1czPUZVCi0JYmwgcHJpbnRmLCVyMgotCW5vcAotCWJsLG4gTCQwMDA0LCVyMAotCWJsLG4gTCQwMDAzLCVyMAotTCQwMDA0OgotTCQwMDAzOgotCWxkdyA4KCVyNCksJXI5Ci0JbGR3IDEyKCVyNCksJXI4Ci0JbGR3IDE2KCVyNCksJXI3Ci0JbGR3IDIwKCVyNCksJXI2Ci0JbGR3IDI0KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgX19tYWluLENPREUKLQkuYWxpZ24gOAotTEMkMDAwMToKLQk7IC5kb3VibGUgNS41MDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAKLQkud29yZCAxMDc1MTgzNjE2IDsgPSAweDQwMTYwMDAwCi0JLndvcmQgMCA7ID0gMHgwCi0JLmFsaWduIDQKLQkuRVhQT1JUIG1haW4KLQkuRVhQT1JUIG1haW4sUFJJVl9MRVY9MyxSVE5WQUw9R1IKLW1haW46Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQkuQ0FMTCAKLQlibCBfX21haW4sJXIyCi0Jbm9wCi0JbGRvIC0yNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyMzApLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAwMSwlcjIwCi0JbGRvIFInTEMkMDAwMSglcjIwKSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0KCVyMjEpLCVyMjMKLQlzdHcgJXIyMiwwKCVyMTkpCi0Jc3R3ICVyMjMsNCglcjE5KQotCWxkbyAzKCVyMCksJXIxOQotCXN0dyAlcjE5LC02MCglcjMwKQotCWxkbyA4KCVyNCksJXIyNgotCWxkbyAxKCVyMCksJXIyNQotCWxkbyA0KCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgZXJyb3JfXzNBQUFpaWRpLCVyMgotCW5vcAotCWxkbyAzKCVyMCksJXIxOQotCXN0dyAlcjE5LC01MiglcjMwKQotCWxkbyA4KCVyNCksJXIyNgotCWxkbyAxKCVyMCksJXIyNQotCWxkaWwgTCdMQyQwMDAxLCVyMTkKLQlsZG8gUidMQyQwMDAxKCVyMTkpLCVyMjAKLQlmbGRkcyAwKCVyMjApLCVmcjcKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1GUixBUkdXMz1GVQotCWJsIG9rX18zQUFBaWRpLCVyMgotCW5vcAotCWNvcHkgJXIwLCVyMjgKLQlibCxuIEwkMDAwNSwlcjAKLQlibCxuIEwkMDAwNSwlcjAKLUwkMDAwNToKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGluZm9idWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGluZm9idWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4Yzc3My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2NhbGxpbmZvYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkuc3BhY2UgJFRFWFQkCi0JLnN1YnNwYSAkQ09ERSQKLQkuYWxpZ24gNAotCS5leHBvcnQgZGl2dSxtaWxsaWNvZGUKLQkucHJvYwotCS5jYWxsaW5mbyBtaWxsaWNvZGUKLWRpdnUKLQkucHJvY2VuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9kZWZidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZGVmYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NGNhZjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9kZWZidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5pbXBvcnQJX3NldGVycm5vCi0gCS5leHBvcnQgICB2Zm9yayAgIQkubGFiZWwgICB2Zm9yayAgIQkucHJvYyEJLmNhbGxpbmZvIG5vX2NhbGxzIQkuZW50cnkgIQkgCS5sYWJlbAlfX3Zmb3JrICAhCW10c3AJJXIwLCVzcjAhCWxkaWwJTCUweGMwMDAwMDA0LCVyMSEJYmxlCVIlMHhjMDAwMDAwNCglc3IwLCVyMSkhCWxkaQk2NiAgICwlcjIyICEJYixuCXl5eSEJYixuCV9fdmZvcmsgIQliCV9zZXRlcnJubyEJY29weQklcjI4LCVyMjYhCS5sYWJlbAl5eXkgCi0JYWRkLD0JJXIwLCVyMjksJXIwCQkgCi0JY29weQklcjAsJXIyOAkJIAotCWJ2LG4JKCVyMikKLQkuZXhpdAotIAkucHJvY2VuZCAJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2VudHJ5YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2VudHJ5YnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZmU3YTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9lbnRyeWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5QQVJBTSBmb28sUlROVkFMPUdSCi1mb286Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LE5PX0NBTExTLEVOVFJZX0dSPTEsRU5UUllfRlI9MTEKLQkuRU5UUlkKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORAotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZXhwb3J0YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2V4cG9ydGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTY2NDE1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZXhwb3J0YnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLSAgICAgICAgLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9leHByYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2V4cHJidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiYWQ0Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2V4cHJidWcucworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSAgICAgICAgLnNwYWNlCSRURVhUJAotICAgICAgICAuc3Vic3BhCSRDT0RFJAotCi0JLmFsaWduCTgKLQkuZXhwb3J0CWljb2RlLGRhdGEKLWljb2RlOgotCS5wcm9jCi0JLmNhbGxpbmZvCWZyYW1lPTAsbm9fY2FsbHMKLQkuZW50cnkKLQlidixuCSVyMCglcjIpCi0JLmV4aXQKLQlub3AKLQkucHJvY2VuZAotCi0JOwotCTsgRklSU1QsIGFyZ3YgYXJyYXkgb2YgcG9pbnRlcnMgdG8gYXJncywgMXN0IGlzIHNhbWUgYXMgcGF0aC4KLQk7Ci0JLmFsaWduCTgKLWljX2FyZ3Y6Ci0JLndvcmQJaWNfYXJndjEtaWNvZGUJOyBzZWNvbmQsIHBvaW50ZXIgdG8gMXN0IGFyZ3VtZW50Ci0JLndvcmQJaWNfcGF0aC1pY29kZQkJOyBmaXJzdCwgIHBvaW50ZXIgdG8gaW5pdCBwYXRoCi0JLndvcmQJMAkJCTsgZm91cnRoLCBOVUxMIGFyZ3YgdGVybWluYXRvciAocGFkKQotCS53b3JkCTAJCQk7IHRoaXJkLCAgTlVMTCBhcmd2IHRlcm1pbmF0b3IKLQotaWNfcGF0aDoKLQkuYmxvY2t6CTQwOTYJCQk7IG11c3QgYmUgbXVsdGlwbGUgb2YgNCBieXRlcwotCS53b3JkCTAJCQk7IGluIGNhc2UgZnVsbCBzdHJpbmcgaXMgdXNlZAotCS53b3JkCTAJCQk7IHRoaXMgd2lsbCBiZSB0aGUgc3RyaW5nIHRlcm1pbmF0b3IKLQotaWNfYXJndjE6Ci0JLmJsb2Nregk0MDk2CQkJOyBtdXN0IGJlIG11bHRpcGxlIG9mIDQgYnl0ZXMKLQkud29yZAkwCQkJOyBpbiBjYXNlIGZ1bGwgc3RyaW5nIGlzIHVzZWQKLQkud29yZAkwCQkJOyB0aGlzIHdpbGwgYmUgdGhlIHN0cmluZyB0ZXJtaW5hdG9yCi0KLQkuZXhwb3J0CXN6aWNvZGUsZGF0YQotc3ppY29kZToKLQkud29yZAlzemljb2RlLWljb2RlCi0JLndvcmQJMAkJCTsgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBmaWxsZXIgYXQgZW5kCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZml4dXA3YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2ZpeHVwN2J1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2M4NzQwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZml4dXA3YnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTkyICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5JTVBPUlQgeG1hbGxvYyxDT0RFCi0JLklNUE9SVCBfb2JzdGFja19uZXdjaHVuayxDT0RFCi0JLklNUE9SVCBtZW1zZXQsQ09ERQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGFsbG9jX3R5cGUsQ09ERQotCS5FWFBPUlQgYWxsb2NfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotYWxsb2NfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXI3LDMyKCVyNCkKLQlzdHcgJXI2LDM2KCVyNCkKLQlzdHcgJXI1LDQwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMDIsJXIwCi0Jbm9wCi0JbGRvIDUyKCVyMCksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgeG1hbGxvYywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI3Ci0JYmwsbiBMJDAwMDMsJXIwCi1MJDAwMDI6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gMTIwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwxMiglcjQpCi0JbGRvIDUyKCVyMCksJXIxOQotCXN0dyAlcjE5LDE2KCVyNCkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyAxNiglcjE5KSwlcjE5Ci0JbGR3IDEyKCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMTYoJXI0KSwlcjIwCi0JY29tY2xyLDwgJXIxOSwlcjIwLCVyMAotCWJsIEwkMDAwNCwlcjAKLQlub3AKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGR3IDE2KCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgX29ic3RhY2tfbmV3Y2h1bmssJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIxOQotCWJsLG4gTCQwMDA1LCVyMAotTCQwMDA0OiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAwMDU6IAotCWxkdyAxMiglcjQpLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlsZHcgMTYoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDIwKCVyNCkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCXN0dyAlcjIwLDI0KCVyNCkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JY29tY2xyLD0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDAwNiwlcjAKLQlub3AKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDQwKCVyMTkpLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCWRlcGkgLTEsMSwxLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotTCQwMDA2OiAKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMTIoJXIyMCksJXIyMAotCWxkdyAyNCglcjIxKSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDIwKCVyNCksJXIyMQotCWxkdyAyNCglcjIxKSwlcjIyCi0JdWFkZGNtICVyMCwlcjIyLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTIoJXIxOSksJXIxOQotCWxkdyA0KCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDIwKCVyNCksJXIyMQotCWxkdyAxNiglcjIwKSwlcjIwCi0JbGR3IDQoJXIyMSksJXIyMQotCXN1YiAlcjIwLCVyMjEsJXIyMAotCWNvbWNsciw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAwMDcsJXIwCi0Jbm9wCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JY29weSAlcjIxLCVyMTkKLQlibCxuIEwkMDAwOCwlcjAKLUwkMDAwNzogCi0JY29weSAlcjAsJXIxOQotTCQwMDA4OiAKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsOCglcjE5KQotCWxkdyAyNCglcjQpLCVyNwotTCQwMDAzOiAKLQljb3B5ICVyNywlcjI2Ci0JY29weSAlcjAsJXIyNQotCWxkbyA1MiglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG1lbXNldCwlcjIKLQlub3AKLQlzdHcgJXIwLDAoJXI3KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxMiglcjcpCi0JbGRvIC0xKCVyMCksJXIxOQotCXN0dyAlcjE5LDQ0KCVyNykKLQljb3B5ICVyNywlcjI4Ci0JYmwsbiBMJDAwMDEsJXIwCi1MJDAwMDE6IAotCWxkdyAzMiglcjQpLCVyNwotCWxkdyAzNiglcjQpLCVyNgotCWxkdyA0MCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFrZV9wb2ludGVyX3R5cGUsQ09ERQotCS5FWFBPUlQgbWFrZV9wb2ludGVyX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLW1ha2VfcG9pbnRlcl90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjksMTYoJXI0KQotCXN0dyAlcjgsMjAoJXI0KQotCXN0dyAlcjcsMjQoJXI0KQotCXN0dyAlcjYsMjgoJXI0KQotCXN0dyAlcjUsMzIoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMjAoJXIxOSksJXI5Ci0JY29taWNsciw8PiAwLCVyOSwlcjAKLQlibCBMJDAwMTAsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDExLCVyMAotCW5vcAotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAwOSwlcjAKLQlibCxuIEwkMDAxMiwlcjAKLUwkMDAxMTogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAxMywlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwwKCVyMTkpCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMDA5LCVyMAotTCQwMDEzOiAKLUwkMDAxMjogCi1MJDAwMTA6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwMTUsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAxNCwlcjAKLQlub3AKLQlibCxuIEwkMDAxNSwlcjAKLUwkMDAxNTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMDE2LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDAoJXIxOSkKLUwkMDAxNjogCi0JYmwsbiBMJDAwMTcsJXIwCi1MJDAwMTQ6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjkKLQlsZHcgMTIoJXI5KSwlcjE5Ci0Jc3R3ICVyMTksOCglcjQpCi0JY29weSAlcjksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQlsZG8gNTIoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1zZXQsJXIyCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMTIoJXI5KQotTCQwMDE3OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMTYoJXI5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDIwKCVyMTkpCi0JbGRvIDQoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksOCglcjkpCi0JbGRvIDEoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksMCglcjkpCi0JbGRoIDMyKCVyOSksJXIxOQotCWNvcHkgJXIxOSwlcjIwCi0JZGVwaSAtMSwzMSwxLCVyMjAKLQlzdGggJXIyMCwzMiglcjkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAyMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMTgsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMjAoJXIxOSkKLUwkMDAxODogCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMDA5LCVyMAotTCQwMDA5OiAKLQlsZHcgMTYoJXI0KSwlcjkKLQlsZHcgMjAoJXI0KSwlcjgKLQlsZHcgMjQoJXI0KSwlcjcKLQlsZHcgMjgoJXI0KSwlcjYKLQlsZHcgMzIoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9wb2ludGVyX3R5cGUsQ09ERQotCS5FWFBPUlQgbG9va3VwX3BvaW50ZXJfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotbG9va3VwX3BvaW50ZXJfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDgoJXI0KQotCXN0dyAlcjUsMTIoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBtYWtlX3BvaW50ZXJfdHlwZSwlcjIKLQlub3AKLQlibCxuIEwkMDAxOSwlcjAKLUwkMDAxOTogCi0JbGR3IDgoJXI0KSwlcjYKLQlsZHcgMTIoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIG1ha2VfcmVmZXJlbmNlX3R5cGUsQ09ERQotCS5FWFBPUlQgbWFrZV9yZWZlcmVuY2VfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotbWFrZV9yZWZlcmVuY2VfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXI5LDE2KCVyNCkKLQlzdHcgJXI4LDIwKCVyNCkKLQlzdHcgJXI3LDI0KCVyNCkKLQlzdHcgJXI2LDI4KCVyNCkKLQlzdHcgJXI1LDMyKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDI0KCVyMTkpLCVyOQotCWNvbWljbHIsPD4gMCwlcjksJXIwCi0JYmwgTCQwMDIxLCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAyMiwlcjAKLQlub3AKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMjAsJXIwCi0JYmwsbiBMJDAwMjMsJXIwCi1MJDAwMjI6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMjQsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMCglcjE5KQotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAyMCwlcjAKLUwkMDAyNDogCi1MJDAwMjM6IAotTCQwMDIxOiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMDI2LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMjUsJXIwCi0Jbm9wCi0JYmwsbiBMJDAwMjYsJXIwCi1MJDAwMjY6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgYWxsb2NfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDAyNywlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwwKCVyMTkpCi1MJDAwMjc6IAotCWJsLG4gTCQwMDI4LCVyMAotTCQwMDI1OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXI5Ci0JbGR3IDEyKCVyOSksJXIxOQotCXN0dyAlcjE5LDgoJXI0KQotCWNvcHkgJXI5LCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JbGRvIDUyKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDEyKCVyOSkKLUwkMDAyODogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDE2KCVyOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwyNCglcjE5KQotCWxkbyA0KCVyMCksJXIxOQotCXN0dyAlcjE5LDgoJXI5KQotCWxkbyAxNiglcjApLCVyMTkKLQlzdHcgJXIxOSwwKCVyOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDI0KCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAyOSwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwyNCglcjE5KQotTCQwMDI5OiAKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMjAsJXIwCi1MJDAwMjA6IAotCWxkdyAxNiglcjQpLCVyOQotCWxkdyAyMCglcjQpLCVyOAotCWxkdyAyNCglcjQpLCVyNwotCWxkdyAyOCglcjQpLCVyNgotCWxkdyAzMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3JlZmVyZW5jZV90eXBlLENPREUKLQkuRVhQT1JUIGxvb2t1cF9yZWZlcmVuY2VfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotbG9va3VwX3JlZmVyZW5jZV90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsOCglcjQpCi0Jc3R3ICVyNSwxMiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIG1ha2VfcmVmZXJlbmNlX3R5cGUsJXIyCi0Jbm9wCi0JYmwsbiBMJDAwMzAsJXIwCi1MJDAwMzA6IAotCWxkdyA4KCVyNCksJXI2Ci0JbGR3IDEyKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBtYWtlX2Z1bmN0aW9uX3R5cGUsQ09ERQotCS5FWFBPUlQgbWFrZV9mdW5jdGlvbl90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCi1tYWtlX2Z1bmN0aW9uX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyOSwxNiglcjQpCi0Jc3R3ICVyOCwyMCglcjQpCi0Jc3R3ICVyNywyNCglcjQpCi0Jc3R3ICVyNiwyOCglcjQpCi0Jc3R3ICVyNSwzMiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAyOCglcjE5KSwlcjkKLQljb21pY2xyLDw+IDAsJXI5LCVyMAotCWJsIEwkMDAzMiwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMzMsJXIwCi0Jbm9wCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMDMxLCVyMAotCWJsLG4gTCQwMDM0LCVyMAotTCQwMDMzOiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDM1LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDAoJXIxOSkKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMzEsJXIwCi1MJDAwMzU6IAotTCQwMDM0OiAKLUwkMDAzMjogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDAzNywlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDM2LCVyMAotCW5vcAotCWJsLG4gTCQwMDM3LCVyMAotTCQwMDM3OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGFsbG9jX3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwMzgsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMCglcjE5KQotTCQwMDM4OiAKLQlibCxuIEwkMDAzOSwlcjAKLUwkMDAzNjogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyOQotCWxkdyAxMiglcjkpLCVyMTkKLQlzdHcgJXIxOSw4KCVyNCkKLQljb3B5ICVyOSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCWxkbyA1MiglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG1lbXNldCwlcjIKLQlub3AKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwxMiglcjkpCi1MJDAwMzk6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxNiglcjkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMjgoJXIxOSkKLQlsZG8gMSglcjApLCVyMTkKLQlzdHcgJXIxOSw4KCVyOSkKLQlsZG8gNiglcjApLCVyMTkKLQlzdHcgJXIxOSwwKCVyOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDI4KCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDA0MCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwyOCglcjE5KQotTCQwMDQwOiAKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMzEsJXIwCi1MJDAwMzE6IAotCWxkdyAxNiglcjQpLCVyOQotCWxkdyAyMCglcjQpLCVyOAotCWxkdyAyNCglcjQpLCVyNwotCWxkdyAyOCglcjQpLCVyNgotCWxkdyAzMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX2Z1bmN0aW9uX3R5cGUsQ09ERQotCS5FWFBPUlQgbG9va3VwX2Z1bmN0aW9uX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixSVE5WQUw9R1IKLWxvb2t1cF9mdW5jdGlvbl90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsOCglcjQpCi0Jc3R3ICVyNSwxMiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIG1ha2VfZnVuY3Rpb25fdHlwZSwlcjIKLQlub3AKLQlibCxuIEwkMDA0MSwlcjAKLUwkMDA0MTogCi0JbGR3IDgoJXI0KSwlcjYKLQlsZHcgMTIoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBzbWFzaF90b19tZW1iZXJfdHlwZSxDT0RFCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9tZW1iZXJfdHlwZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfbWVtYmVyX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLWxvb2t1cF9tZW1iZXJfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI4LDgoJXI0KQotCXN0dyAlcjcsMTIoJXI0KQotCXN0dyAlcjYsMTYoJXI0KQotCXN0dyAlcjUsMjAoJXI0KQotCWxkbyAyNCglcjQpLCVyMQotCWZzdGRzLG1hICVmcjEyLDgoJXIxKQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgYWxsb2NfdHlwZSwlcjIKLQlub3AKLQlzdHcgJXIyOCwtMTYoJXIzMCkKLQlmbGR3cyAtMTYoJXIzMCksJWZyMTIKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlmc3R3cyAlZnIxMiwtMTYoJXIzMCkKLQlsZHcgLTE2KCVyMzApLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JbGR3IDAoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgc21hc2hfdG9fbWVtYmVyX3R5cGUsJXIyCi0Jbm9wCi0JZnN0d3MgJWZyMTIsLTE2KCVyMzApCi0JbGR3IC0xNiglcjMwKSwlcjI4Ci0JYmwsbiBMJDAwNDIsJXIwCi1MJDAwNDI6IAotCWxkdyA4KCVyNCksJXI4Ci0JbGR3IDEyKCVyNCksJXI3Ci0JbGR3IDE2KCVyNCksJXI2Ci0JbGR3IDIwKCVyNCksJXI1Ci0JbGRvIDI0KCVyNCksJXIxCi0JZmxkZHMsbWEgOCglcjEpLCVmcjEyCi0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBhbGxvY2F0ZV9zdHViX21ldGhvZCxDT0RFCi0JLkVYUE9SVCBhbGxvY2F0ZV9zdHViX21ldGhvZCxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotYWxsb2NhdGVfc3R1Yl9tZXRob2Q6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyNiwxNiglcjQpCi0Jc3R3ICVyNSwyMCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCXN0dyAlcjI4LDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxNiglcjE5KQotCWxkdyA4KCVyNCksJXIxOQotCWxkbyA0KCVyMCksJXIyMAotCXN0aCAlcjIwLDMyKCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDE1KCVyMCksJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMSglcjApLCVyMjAKLQlzdHcgJXIyMCw4KCVyMTkpCi0JbGR3IDgoJXI0KSwlcjI4Ci0JYmwsbiBMJDAwNDMsJXIwCi1MJDAwNDM6IAotCWxkdyAxNiglcjQpLCVyNgotCWxkdyAyMCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGJ1aWx0aW5fdHlwZV9pbnQsREFUQQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBjcmVhdGVfYXJyYXlfdHlwZSxDT0RFCi0JLkVYUE9SVCBjcmVhdGVfYXJyYXlfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotY3JlYXRlX2FycmF5X3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTAsNTYoJXI0KQotCXN0dyAlcjksNjAoJXI0KQotCXN0dyAlcjgsNjQoJXI0KQotCXN0dyAlcjcsNjgoJXI0KQotCXN0dyAlcjYsNzIoJXI0KQotCXN0dyAlcjUsNzYoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgYWxsb2NfdHlwZSwlcjIKLQlub3AKLQlzdHcgJXIyOCw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMiglcjApLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDE2KCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIzCi0JYWRkICVyMjMsJXIyMSwlcjIyCi0JbGR3IDAoJXIyMiksJXIyMQotCWxkdyAwKCVyMjApLCVyMjAKLQlsZHcgOCglcjIxKSwlcjIxCi0Jc3R3ICVyMjAsLTE2KCVyMzApCi0JZmxkd3MgLTE2KCVyMzApLCVmcjUKLQlzdHcgJXIyMSwtMTYoJXIzMCkKLQlmbGR3cyAtMTYoJXIzMCksJWZyNVIKLQl4bXB5dSAlZnI1LCVmcjVSLCVmcjQKLQlmc3R3cyAlZnI0UiwtMTYoJXIzMCkKLQlsZHcgLTE2KCVyMzApLCVyMjQKLQlzdHcgJXIyNCw4KCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDEoJXIwKSwlcjIwCi0Jc3RoICVyMjAsMzQoJXIxOSkKLQlsZHcgOCglcjQpLCVyOQotCWxkdyA4KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMDUwLCVyMAotCW5vcAotCWxkdyA4KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGRvIDEyMCglcjIwKSwlcjE5Ci0Jc3R3ICVyMTksMTYoJXI0KQotCWxkdyAxNiglcjQpLCVyMTkKLQlzdHcgJXIxOSwyMCglcjQpCi0JbGRvIDE2KCVyMCksJXIxOQotCXN0dyAlcjE5LDI0KCVyNCkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxNiglcjE5KSwlcjE5Ci0JbGR3IDEyKCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMjQoJXI0KSwlcjIwCi0JY29tY2xyLDwgJXIxOSwlcjIwLCVyMAotCWJsIEwkMDA0NSwlcjAKLQlub3AKLQlsZHcgMjAoJXI0KSwlcjI2Ci0JbGR3IDI0KCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgX29ic3RhY2tfbmV3Y2h1bmssJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIxOQotCWJsLG4gTCQwMDQ2LCVyMAotTCQwMDQ1OiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAwNDY6IAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlsZHcgMjQoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyAxNiglcjQpLCVyMTkKLQlzdHcgJXIxOSwyOCglcjQpCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwzMiglcjQpCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDMyKCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAwNDcsJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDA0NzogCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyAyOCglcjQpLCVyMjAKLQlsZHcgMjgoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAyOCglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyAyOCglcjQpLCVyMTkKLQlsZHcgMjgoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDI4KCVyNCksJXIyMAotCWxkdyAyOCglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMDQ4LCVyMAotCW5vcAotCWxkdyAyOCglcjQpLCVyMTkKLQlsZHcgMjgoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAwNDksJXIwCi1MJDAwNDg6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDA0OTogCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyAyOCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgMzIoJXI0KSwlcjEwCi0JYmwsbiBMJDAwNTEsJXIwCi1MJDAwNTA6IAotCWxkbyAxNiglcjApLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHhtYWxsb2MsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTAKLUwkMDA1MTogCi0Jc3R3ICVyMTAsMzYoJXI5KQotCWxkdyA4KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCXN0dyAlcjI4LDEyKCVyNCkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGRvIDExKCVyMCksJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JYWRkaWwgTCdidWlsdGluX3R5cGVfaW50LSRnbG9iYWwkLCVyMjcKLQlsZHcgUididWlsdGluX3R5cGVfaW50LSRnbG9iYWwkKCVyMSksJXIyMAotCXN0dyAlcjIwLDE2KCVyMTkpCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkbyA0KCVyMCksJXIyMAotCXN0dyAlcjIwLDgoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGRvIDIoJXIwKSwlcjIwCi0Jc3RoICVyMjAsMzQoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwNTcsJXIwCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGRvIDEyMCglcjIwKSwlcjE5Ci0Jc3R3ICVyMTksMzYoJXI0KQotCWxkdyAzNiglcjQpLCVyMTkKLQlzdHcgJXIxOSw0MCglcjQpCi0JbGRvIDMyKCVyMCksJXIxOQotCXN0dyAlcjE5LDQ0KCVyNCkKLQlsZHcgNDAoJXI0KSwlcjE5Ci0JbGR3IDQwKCVyNCksJXIyMAotCWxkdyAxNiglcjE5KSwlcjE5Ci0JbGR3IDEyKCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgNDQoJXI0KSwlcjIwCi0JY29tY2xyLDwgJXIxOSwlcjIwLCVyMAotCWJsIEwkMDA1MiwlcjAKLQlub3AKLQlsZHcgNDAoJXI0KSwlcjI2Ci0JbGR3IDQ0KCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgX29ic3RhY2tfbmV3Y2h1bmssJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIxOQotCWJsLG4gTCQwMDUzLCVyMAotTCQwMDUyOiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAwNTM6IAotCWxkdyA0MCglcjQpLCVyMTkKLQlsZHcgNDAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlsZHcgNDQoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyAzNiglcjQpLCVyMTkKLQlzdHcgJXIxOSw0OCglcjQpCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw1MiglcjQpCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDUyKCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAwNTQsJXIwCi0Jbm9wCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDA1NDogCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA0OCglcjQpLCVyMjAKLQlsZHcgNDgoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyA0OCglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyA0OCglcjQpLCVyMTkKLQlsZHcgNDgoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDQ4KCVyNCksJXIyMAotCWxkdyA0OCglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMDU1LCVyMAotCW5vcAotCWxkdyA0OCglcjQpLCVyMTkKLQlsZHcgNDgoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAwNTYsJXIwCi1MJDAwNTU6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDA1NjogCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA0OCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgNTIoJXI0KSwlcjEwCi0JYmwsbiBMJDAwNTgsJXIwCi1MJDAwNTc6IAotCWxkbyAzMiglcjApLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHhtYWxsb2MsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTAKLUwkMDA1ODogCi0Jc3R3ICVyMTAsMzYoJXI5KQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZHcgMzYoJXIxOSksJXIyMAotCXN0dyAlcjAsMCglcjIwKQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZG8gMTYoJXIwKSwlcjIwCi0JbGR3IDM2KCVyMTkpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGRvIC0xKCVyMjApLCVyMjEKLQlzdHcgJXIyMSwwKCVyMTkpCi0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyAzNiglcjIwKSwlcjE5Ci0JYWRkaWwgTCdidWlsdGluX3R5cGVfaW50LSRnbG9iYWwkLCVyMjcKLQlsZHcgUididWlsdGluX3R5cGVfaW50LSRnbG9iYWwkKCVyMSksJXIyMAotCXN0dyAlcjIwLDgoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGRvIDE2KCVyMCksJXIyMAotCWxkdyAzNiglcjE5KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjE5Ci0JYWRkaWwgTCdidWlsdGluX3R5cGVfaW50LSRnbG9iYWwkLCVyMjcKLQlsZHcgUididWlsdGluX3R5cGVfaW50LSRnbG9iYWwkKCVyMSksJXIyMAotCXN0dyAlcjIwLDgoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZHcgMzYoJXIxOSksJXIyMAotCWxkdyAxMiglcjQpLCVyMTkKLQlzdHcgJXIxOSw4KCVyMjApCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIC0xKCVyMCksJXIyMAotCXN0dyAlcjIwLDQ0KCVyMTkpCi0JbGR3IDgoJXI0KSwlcjI4Ci0JYmwsbiBMJDAwNDQsJXIwCi1MJDAwNDQ6IAotCWxkdyA1NiglcjQpLCVyMTAKLQlsZHcgNjAoJXI0KSwlcjkKLQlsZHcgNjQoJXI0KSwlcjgKLQlsZHcgNjgoJXI0KSwlcjcKLQlsZHcgNzIoJXI0KSwlcjYKLQlsZHcgNzYoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIHNtYXNoX3RvX21lbWJlcl90eXBlLENPREUKLQkuRVhQT1JUIHNtYXNoX3RvX21lbWJlcl90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLXNtYXNoX3RvX21lbWJlcl90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjEwLDE2KCVyNCkKLQlzdHcgJXI5LDIwKCVyNCkKLQlzdHcgJXI4LDI0KCVyNCkKLQlzdHcgJXI3LDI4KCVyNCkKLQlzdHcgJXI2LDMyKCVyNCkKLQlzdHcgJXI1LDM2KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTEyKCVyMCksJXI5Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjksJXIxMAotCXN0dyAlcjI0LDAoJXIxMCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCWxkbyA1MiglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG1lbXNldCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0Jc3R3ICVyMjAsMTIoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC0xMiglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxNiglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIDEoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsOCglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gMTQoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsMCglcjE5KQotTCQwMDU5OiAKLQlsZHcgMTYoJXI0KSwlcjEwCi0JbGR3IDIwKCVyNCksJXI5Ci0JbGR3IDI0KCVyNCksJXI4Ci0JbGR3IDI4KCVyNCksJXI3Ci0JbGR3IDMyKCVyNCksJXI2Ci0JbGR3IDM2KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBzbWFzaF90b19tZXRob2RfdHlwZSxDT0RFCi0JLkVYUE9SVCBzbWFzaF90b19tZXRob2RfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi1zbWFzaF90b19tZXRob2RfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxMiwxNiglcjQpCi0Jc3R3ICVyMTEsMjAoJXI0KQotCXN0dyAlcjEwLDI0KCVyNCkKLQlzdHcgJXI5LDI4KCVyNCkKLQlzdHcgJXI4LDMyKCVyNCkKLQlzdHcgJXI3LDM2KCVyNCkKLQlzdHcgJXI2LDQwKCVyNCkKLQlzdHcgJXI1LDQ0KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTEyKCVyMCksJXI5Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjksJXIxMAotCXN0dyAlcjI0LDAoJXIxMCkKLQlsZG8gLTE2KCVyMCksJXIxMQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXIxMSwlcjEyCi0Jc3R3ICVyMjMsMCglcjEyKQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JbGRvIDUyKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQlzdHcgJXIyMCwxMiglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTEyKCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDE2KCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTE2KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDQ4KCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAxKCVyMCksJXIyMAotCXN0dyAlcjIwLDgoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIDE1KCVyMCksJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLUwkMDA2MDogCi0JbGR3IDE2KCVyNCksJXIxMgotCWxkdyAyMCglcjQpLCVyMTEKLQlsZHcgMjQoJXI0KSwlcjEwCi0JbGR3IDI4KCVyNCksJXI5Ci0JbGR3IDMyKCVyNCksJXI4Ci0JbGR3IDM2KCVyNCksJXI3Ci0JbGR3IDQwKCVyNCksJXI2Ci0JbGR3IDQ0KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgc3RybmNtcCxDT0RFCi0JLmFsaWduIDQKLUxDJDAwMDA6IAotCS5TVFJJTkcgInN0cnVjdCBceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDAxOiAKLQkuU1RSSU5HICJ1bmlvbiBceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDAyOiAKLQkuU1RSSU5HICJlbnVtIFx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIHR5cGVfbmFtZV9ub190YWcsQ09ERQotCS5FWFBPUlQgdHlwZV9uYW1lX25vX3RhZyxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotdHlwZV9uYW1lX25vX3RhZzogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDgoJXI0KQotCXN0dyAlcjUsMTIoJXI0KQotCWNvcHkgJXIyNiwlcjUKLQlsZHcgNCglcjUpLCVyNgotCWNvbWljbHIsPD4gMCwlcjYsJXIwCi0JYmwgTCQwMDYyLCVyMAotCW5vcAotCWxkdyAwKCVyNSksJXIxOQotCWNvbWljbHIsPD4gNCwlcjE5LCVyMAotCWJsIEwkMDA2NiwlcjAKLQlub3AKLQljb21pY2xyLD49IDQsJXIxOSwlcjAKLQlibCBMJDAwNzIsJXIwCi0Jbm9wCi0JY29taWNsciw8PiAzLCVyMTksJXIwCi0JYmwgTCQwMDY0LCVyMAotCW5vcAotCWJsLG4gTCQwMDcwLCVyMAotTCQwMDcyOiAKLQljb21pY2xyLDw+IDUsJXIxOSwlcjAKLQlibCBMJDAwNjgsJXIwCi0Jbm9wCi0JYmwsbiBMJDAwNzAsJXIwCi1MJDAwNjQ6IAotCWNvcHkgJXI2LCVyMjYKLQlsZGlsIEwnTEMkMDAwMCwlcjI1Ci0JbGRvIFInTEMkMDAwMCglcjI1KSwlcjI1Ci0JbGRvIDcoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdHJuY21wLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAwNjUsJXIwCi0Jbm9wCi0JbGRvIDcoJXI2KSwlcjYKLUwkMDA2NTogCi0JYmwsbiBMJDAwNjMsJXIwCi1MJDAwNjY6IAotCWNvcHkgJXI2LCVyMjYKLQlsZGlsIEwnTEMkMDAwMSwlcjI1Ci0JbGRvIFInTEMkMDAwMSglcjI1KSwlcjI1Ci0JbGRvIDYoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdHJuY21wLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAwNjcsJXIwCi0Jbm9wCi0JbGRvIDYoJXI2KSwlcjYKLUwkMDA2NzogCi0JYmwsbiBMJDAwNjMsJXIwCi1MJDAwNjg6IAotCWNvcHkgJXI2LCVyMjYKLQlsZGlsIEwnTEMkMDAwMiwlcjI1Ci0JbGRvIFInTEMkMDAwMiglcjI1KSwlcjI1Ci0JbGRvIDUoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdHJuY21wLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAwNjksJXIwCi0Jbm9wCi0JbGRvIDUoJXI2KSwlcjYKLUwkMDA2OTogCi0JYmwsbiBMJDAwNjMsJXIwCi1MJDAwNzA6IAotCWJsLG4gTCQwMDYzLCVyMAotTCQwMDYzOiAKLUwkMDA2MjogCi0JY29weSAlcjYsJXIyOAotCWJsLG4gTCQwMDYxLCVyMAotTCQwMDYxOiAKLQlsZHcgOCglcjQpLCVyNgotCWxkdyAxMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGN1cnJlbnRfbGFuZ3VhZ2UsREFUQQotCS5JTVBPUlQgc3RyY21wLENPREUKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3ByaW1pdGl2ZV90eXBlbmFtZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfcHJpbWl0aXZlX3R5cGVuYW1lLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1sb29rdXBfcHJpbWl0aXZlX3R5cGVuYW1lOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsMTYoJXI0KQotCXN0dyAlcjUsMjAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWFkZGlsIEwnY3VycmVudF9sYW5ndWFnZS0kZ2xvYmFsJCwlcjI3Ci0JbGR3IFInY3VycmVudF9sYW5ndWFnZS0kZ2xvYmFsJCglcjEpLCVyMTkKLQlsZHcgOCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi1MJDAwNzQ6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwNzUsJXIwCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgNCglcjE5KSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAwNzcsJXIwCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkdyAwKCVyMjApLCVyMjgKLQlibCxuIEwkMDA3MywlcjAKLUwkMDA3NzogCi1MJDAwNzY6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkbyA0KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlibCxuIEwkMDA3NCwlcjAKLUwkMDA3NTogCi0JY29weSAlcjAsJXIyOAotCWJsLG4gTCQwMDczLCVyMAotTCQwMDczOiAKLQlsZHcgMTYoJXI0KSwlcjYKLQlsZHcgMjAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBsb29rdXBfc3ltYm9sLENPREUKLQkuSU1QT1JUIGVycm9yLENPREUKLQkuYWxpZ24gNAotTEMkMDAwMzogCi0JLlNUUklORyAiTm8gdHlwZSBuYW1lZCAlcy5ceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfdHlwZW5hbWUsQ09ERQotCS5FWFBPUlQgbG9va3VwX3R5cGVuYW1lLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsUlROVkFMPUdSCi1sb29rdXBfdHlwZW5hbWU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTIsOCglcjQpCi0Jc3R3ICVyMTEsMTIoJXI0KQotCXN0dyAlcjEwLDE2KCVyNCkKLQlzdHcgJXI5LDIwKCVyNCkKLQlzdHcgJXI4LDI0KCVyNCkKLQlzdHcgJXI3LDI4KCVyNCkKLQlzdHcgJXI2LDMyKCVyNCkKLQlzdHcgJXI1LDM2KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTEyKCVyMCksJXI5Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjksJXIxMAotCXN0dyAlcjI0LDAoJXIxMCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlzdHcgJXIwLC01MiglcjMwKQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JbGRvIDEoJXIwKSwlcjI0Ci0JY29weSAlcjAsJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgbG9va3VwX3N5bWJvbCwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMQotCWNvbWljbHIsPD4gMCwlcjExLCVyMAotCWJsIEwkMDA4MCwlcjAKLQlub3AKLQlsZHcgOCglcjExKSwlcjE5Ci0JY29taWNsciw9IDgsJXIxOSwlcjAKLQlibCBMJDAwODAsJXIwCi0Jbm9wCi0JYmwsbiBMJDAwNzksJXIwCi1MJDAwODA6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGxvb2t1cF9wcmltaXRpdmVfdHlwZW5hbWUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTIKLQljb21pY2xyLDw+IDAsJXIxMiwlcjAKLQlibCBMJDAwODEsJXIwCi0Jbm9wCi0JY29weSAlcjEyLCVyMjgKLQlibCxuIEwkMDA3OCwlcjAKLQlibCxuIEwkMDA4MiwlcjAKLUwkMDA4MTogCi0JY29taWNsciw9IDAsJXIxMiwlcjAKLQlibCBMJDAwODMsJXIwCi0Jbm9wCi0JbGRvIC0xMiglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwODMsJXIwCi0Jbm9wCi0JY29weSAlcjAsJXIyOAotCWJsLG4gTCQwMDc4LCVyMAotCWJsLG4gTCQwMDg0LCVyMAotTCQwMDgzOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAwMywlcjI2Ci0JbGRvIFInTEMkMDAwMyglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAwODQ6IAotTCQwMDgyOiAKLUwkMDA3OTogCi0JbGR3IDEyKCVyMTEpLCVyMjgKLQlibCxuIEwkMDA3OCwlcjAKLUwkMDA3ODogCi0JbGR3IDgoJXI0KSwlcjEyCi0JbGR3IDEyKCVyNCksJXIxMQotCWxkdyAxNiglcjQpLCVyMTAKLQlsZHcgMjAoJXI0KSwlcjkKLQlsZHcgMjQoJXI0KSwlcjgKLQlsZHcgMjgoJXI0KSwlcjcKLQlsZHcgMzIoJXI0KSwlcjYKLQlsZHcgMzYoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBhbGxvY2EsQ09ERQotCS5JTVBPUlQgc3RybGVuLENPREUKLQkuSU1QT1JUIHN0cmNweSxDT0RFCi0JLmFsaWduIDQKLUxDJDAwMDQ6IAotCS5TVFJJTkcgInVuc2lnbmVkIFx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF91bnNpZ25lZF90eXBlbmFtZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfdW5zaWduZWRfdHlwZW5hbWUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixSVE5WQUw9R1IKLWxvb2t1cF91bnNpZ25lZF90eXBlbmFtZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBzdHJsZW4sJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlsZG8gMTAoJXIxOSksJXIyMAotCWxkbyA3KCVyMjApLCVyMjEKLQljb3B5ICVyMjEsJXIxOQotCWxkbyA2MyglcjE5KSwlcjIwCi0JZXh0cnUgJXIyMCwyNSwyNiwlcjE5Ci0JemRlcCAlcjE5LDI1LDI2LCVyMjAKLQlsZG8gLTk2KCVyMzApLCVyMTkKLQlhZGQgJXIzMCwlcjIwLCVyMzAKLQlsZG8gNyglcjE5KSwlcjIwCi0JZXh0cnUgJXIyMCwyOCwyOSwlcjE5Ci0JemRlcCAlcjE5LDI4LDI5LCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMjYKLQlsZGlsIEwnTEMkMDAwNCwlcjI1Ci0JbGRvIFInTEMkMDAwNCglcjI1KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjcHksJXIyCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjIwCi0JbGRvIDkoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY3B5LCVyMgotCW5vcAotCWxkdyA4KCVyNCksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBsb29rdXBfdHlwZW5hbWUsJXIyCi0Jbm9wCi0JYmwsbiBMJDAwODUsJXIwCi1MJDAwODU6IAotCWxkdyAxNiglcjQpLCVyNgotCWxkdyAyMCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotTEMkMDAwNTogCi0JLlNUUklORyAic2lnbmVkIFx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9zaWduZWRfdHlwZW5hbWUsQ09ERQotCS5FWFBPUlQgbG9va3VwX3NpZ25lZF90eXBlbmFtZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotbG9va3VwX3NpZ25lZF90eXBlbmFtZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBzdHJsZW4sJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlsZG8gOCglcjE5KSwlcjIwCi0JbGRvIDcoJXIyMCksJXIyMQotCWNvcHkgJXIyMSwlcjE5Ci0JbGRvIDYzKCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI1LDI2LCVyMTkKLQl6ZGVwICVyMTksMjUsMjYsJXIyMAotCWxkbyAtOTYoJXIzMCksJXIxOQotCWFkZCAlcjMwLCVyMjAsJXIzMAotCWxkbyA3KCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI4LDI5LCVyMTkKLQl6ZGVwICVyMTksMjgsMjksJXIyMAotCXN0dyAlcjIwLDEyKCVyNCkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwMDUsJXIyNQotCWxkbyBSJ0xDJDAwMDUoJXIyNSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY3B5LCVyMgotCW5vcAotCWxkdyAxMiglcjQpLCVyMjAKLQlsZG8gNyglcjIwKSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JY29weSAlcjE5LCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjcHksJXIyCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIGxvb2t1cF90eXBlbmFtZSwlcjIKLQlub3AKLQlzdHcgJXIyOCw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAwODcsJXIwCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjI4Ci0JYmwsbiBMJDAwODYsJXIwCi1MJDAwODc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JY29weSAlcjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbG9va3VwX3R5cGVuYW1lLCVyMgotCW5vcAotCWJsLG4gTCQwMDg2LCVyMAotTCQwMDg2OiAKLQlsZHcgMTYoJXI0KSwlcjYKLQlsZHcgMjAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLUxDJDAwMDY6IAotCS5TVFJJTkcgIk5vIHN0cnVjdCB0eXBlIG5hbWVkICVzLlx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMDc6IAotCS5TVFJJTkcgIlRoaXMgY29udGV4dCBoYXMgY2xhc3MsIHVuaW9uIG9yIGVudW0gJXMsIG5vdCBhIHN0cnVjdC5ceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfc3RydWN0LENPREUKLQkuRVhQT1JUIGxvb2t1cF9zdHJ1Y3QsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLWxvb2t1cF9zdHJ1Y3Q6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOSw4KCVyNCkKLQlzdHcgJXI4LDEyKCVyNCkKLQlzdHcgJXI3LDE2KCVyNCkKLQlzdHcgJXI2LDIwKCVyNCkKLQlzdHcgJXI1LDI0KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlzdHcgJXIwLC01MiglcjMwKQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JY29weSAlcjAsJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgbG9va3VwX3N5bWJvbCwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JY29taWNsciw9IDAsJXI5LCVyMAotCWJsIEwkMDA4OSwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAwNiwlcjI2Ci0JbGRvIFInTEMkMDAwNiglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAwODk6IAotCWxkdyAxMiglcjkpLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAzLCVyMjAsJXIwCi0JYmwgTCQwMDkwLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDA3LCVyMjYKLQlsZG8gUidMQyQwMDA3KCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA5MDogCi0JbGR3IDEyKCVyOSksJXIyOAotCWJsLG4gTCQwMDg4LCVyMAotTCQwMDg4OiAKLQlsZHcgOCglcjQpLCVyOQotCWxkdyAxMiglcjQpLCVyOAotCWxkdyAxNiglcjQpLCVyNwotCWxkdyAyMCglcjQpLCVyNgotCWxkdyAyNCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotTEMkMDAwODogCi0JLlNUUklORyAiTm8gdW5pb24gdHlwZSBuYW1lZCAlcy5ceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDA5OiAKLQkuU1RSSU5HICJUaGlzIGNvbnRleHQgaGFzIGNsYXNzLCBzdHJ1Y3Qgb3IgZW51bSAlcywgbm90IGEgdW5pb24uXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3VuaW9uLENPREUKLQkuRVhQT1JUIGxvb2t1cF91bmlvbixFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotbG9va3VwX3VuaW9uOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjksOCglcjQpCi0Jc3R3ICVyOCwxMiglcjQpCi0Jc3R3ICVyNywxNiglcjQpCi0Jc3R3ICVyNiwyMCglcjQpCi0Jc3R3ICVyNSwyNCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0Jc3R3ICVyMCwtNTIoJXIzMCkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWNvcHkgJXIwLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGxvb2t1cF9zeW1ib2wsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWNvbWljbHIsPSAwLCVyOSwlcjAKLQlibCBMJDAwOTIsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMDgsJXIyNgotCWxkbyBSJ0xDJDAwMDgoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDkyOiAKLQlsZHcgMTIoJXI5KSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gNCwlcjIwLCVyMAotCWJsIEwkMDA5MywlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAwOSwlcjI2Ci0JbGRvIFInTEMkMDAwOSglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAwOTM6IAotCWxkdyAxMiglcjkpLCVyMjgKLQlibCxuIEwkMDA5MSwlcjAKLUwkMDA5MTogCi0JbGR3IDgoJXI0KSwlcjkKLQlsZHcgMTIoJXI0KSwlcjgKLQlsZHcgMTYoJXI0KSwlcjcKLQlsZHcgMjAoJXI0KSwlcjYKLQlsZHcgMjQoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLUxDJDAwMTA6IAotCS5TVFJJTkcgIk5vIGVudW0gdHlwZSBuYW1lZCAlcy5ceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDExOiAKLQkuU1RSSU5HICJUaGlzIGNvbnRleHQgaGFzIGNsYXNzLCBzdHJ1Y3Qgb3IgdW5pb24gJXMsIG5vdCBhbiBlbnVtLlx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9lbnVtLENPREUKLQkuRVhQT1JUIGxvb2t1cF9lbnVtLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCi1sb29rdXBfZW51bTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI5LDgoJXI0KQotCXN0dyAlcjgsMTIoJXI0KQotCXN0dyAlcjcsMTYoJXI0KQotCXN0dyAlcjYsMjAoJXI0KQotCXN0dyAlcjUsMjQoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCXN0dyAlcjAsLTUyKCVyMzApCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQljb3B5ICVyMCwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBsb29rdXBfc3ltYm9sLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQljb21pY2xyLD0gMCwlcjksJXIwCi0JYmwgTCQwMDk1LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDEwLCVyMjYKLQlsZG8gUidMQyQwMDEwKCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA5NTogCi0JbGR3IDEyKCVyOSksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDUsJXIyMCwlcjAKLQlibCBMJDAwOTYsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMTEsJXIyNgotCWxkbyBSJ0xDJDAwMTEoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDk2OiAKLQlsZHcgMTIoJXI5KSwlcjI4Ci0JYmwsbiBMJDAwOTQsJXIwCi1MJDAwOTQ6IAotCWxkdyA4KCVyNCksJXI5Ci0JbGR3IDEyKCVyNCksJXI4Ci0JbGR3IDE2KCVyNCksJXI3Ci0JbGR3IDIwKCVyNCksJXI2Ci0JbGR3IDI0KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgc3RyY2F0LENPREUKLQkuYWxpZ24gNAotTEMkMDAxMjogCi0JLlNUUklORyAiPFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMTM6IAotCS5TVFJJTkcgIiA+XHgwMCIKLQkuYWxpZ24gNAotTEMkMDAxNDogCi0JLlNUUklORyAiTm8gdGVtcGxhdGUgdHlwZSBuYW1lZCAlcy5ceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfdGVtcGxhdGVfdHlwZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfdGVtcGxhdGVfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLFJUTlZBTD1HUgotbG9va3VwX3RlbXBsYXRlX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTEsMTYoJXI0KQotCXN0dyAlcjEwLDIwKCVyNCkKLQlzdHcgJXI5LDI0KCVyNCkKLQlzdHcgJXI4LDI4KCVyNCkKLQlzdHcgJXI3LDMyKCVyNCkKLQlzdHcgJXI2LDM2KCVyNCkKLQlzdHcgJXI1LDQwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTEyKCVyMCksJXI5Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjksJXIxMAotCXN0dyAlcjI0LDAoJXIxMCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBzdHJsZW4sJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTEKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgc3RybGVuLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JYWRkICVyMTEsJXIxOSwlcjIwCi0JbGRvIDQoJXIyMCksJXIxOQotCWxkbyA3KCVyMTkpLCVyMjAKLQljb3B5ICVyMjAsJXIxOQotCWxkbyA2MyglcjE5KSwlcjIwCi0JZXh0cnUgJXIyMCwyNSwyNiwlcjE5Ci0JemRlcCAlcjE5LDI1LDI2LCVyMjAKLQlsZG8gLTk2KCVyMzApLCVyMTkKLQlhZGQgJXIzMCwlcjIwLCVyMzAKLQlsZG8gNyglcjE5KSwlcjIwCi0JZXh0cnUgJXIyMCwyOCwyOSwlcjE5Ci0JemRlcCAlcjE5LDI4LDI5LCVyMjAKLQlzdHcgJXIyMCwxMiglcjQpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNweSwlcjIKLQlub3AKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwMTIsJXIyNQotCWxkbyBSJ0xDJDAwMTIoJXIyNSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY2F0LCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGR3IDQoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY2F0LCVyMgotCW5vcAotCWxkdyAxMiglcjQpLCVyMjYKLQlsZGlsIEwnTEMkMDAxMywlcjI1Ci0JbGRvIFInTEMkMDAxMyglcjI1KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjYXQsJXIyCi0Jbm9wCi0JbGRvIC0xMiglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCXN0dyAlcjAsLTUyKCVyMzApCi0JbGR3IDEyKCVyNCksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQljb3B5ICVyMCwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBsb29rdXBfc3ltYm9sLCVyMgotCW5vcAotCXN0dyAlcjI4LDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCWNvbWljbHIsPSAwLCVyMTksJXIwCi0JYmwgTCQwMDk4LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDE0LCVyMjYKLQlsZG8gUidMQyQwMDE0KCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA5ODogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JY29taWNsciw8PiAzLCVyMTksJXIwCi0JYmwgTCQwMDk5LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDA3LCVyMjYKLQlsZG8gUidMQyQwMDA3KCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA5OTogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjgKLQlibCxuIEwkMDA5NywlcjAKLUwkMDA5NzogCi0JbGR3IDE2KCVyNCksJXIxMQotCWxkdyAyMCglcjQpLCVyMTAKLQlsZHcgMjQoJXI0KSwlcjkKLQlsZHcgMjgoJXI0KSwlcjgKLQlsZHcgMzIoJXI0KSwlcjcKLQlsZHcgMzYoJXI0KSwlcjYKLQlsZHcgNDAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBjdXJyZW50X3RhcmdldCxEQVRBCi0JLklNUE9SVCBmZmx1c2gsQ09ERQotCS5JTVBPUlQgX19pb2IsREFUQQotCS5JTVBPUlQgZnByaW50ZixDT0RFCi0JLmFsaWduIDQKLUxDJDAwMTU6IAotCS5TVFJJTkcgIlR5cGUgXHgwMCIKLQkuSU1QT1JUIHR5cGVfcHJpbnQsQ09ERQotCS5hbGlnbiA0Ci1MQyQwMDE2OiAKLQkuU1RSSU5HICJceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDE3OiAKLQkuU1RSSU5HICIgaXMgbm90IGEgc3RydWN0dXJlIG9yIHVuaW9uIHR5cGUuXHgwMCIKLQkuSU1QT1JUIGNoZWNrX3N0dWJfdHlwZSxDT0RFCi0JLmFsaWduIDQKLUxDJDAwMTg6IAotCS5TVFJJTkcgIiBoYXMgbm8gY29tcG9uZW50IG5hbWVkIFx4MDAiCi0JLklNUE9SVCBmcHV0c19maWx0ZXJlZCxDT0RFCi0JLmFsaWduIDQKLUxDJDAwMTk6IAotCS5TVFJJTkcgIi5ceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfc3RydWN0X2VsdF90eXBlLENPREUKLQkuRVhQT1JUIGxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixSVE5WQUw9R1IKLWxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTEsMjQoJXI0KQotCXN0dyAlcjEwLDI4KCVyNCkKLQlzdHcgJXI5LDMyKCVyNCkKLQlzdHcgJXI4LDM2KCVyNCkKLQlzdHcgJXI3LDQwKCVyNCkKLQlzdHcgJXI2LDQ0KCVyNCkKLQlzdHcgJXI1LDQ4KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTEyKCVyMCksJXI5Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjksJXIxMAotCXN0dyAlcjI0LDAoJXIxMCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMSwlcjIwLCVyMAotCWJsIEwkMDEwMiwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyAxNiglcjApLCVyMTkKLQljb21jbHIsPD4gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDEwMiwlcjAKLQlub3AKLQlibCxuIEwkMDEwMSwlcjAKLUwkMDEwMjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAxNiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsMCglcjE5KQotTCQwMTAxOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMywlcjIwLCVyMAotCWJsIEwkMDEwMywlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gNCwlcjIwLCVyMAotCWJsIEwkMDEwMywlcjAKLQlub3AKLQlhZGRpbCBMJ2N1cnJlbnRfdGFyZ2V0LSRnbG9iYWwkLCVyMjcKLQlsZHcgUidjdXJyZW50X3RhcmdldC0kZ2xvYmFsJCglcjEpLCVyMTkKLQlsZHcgNzYoJXIxOSksJXIxMQotCWNvcHkgJXIxMSwlcjIyCi0JLkNBTEwJQVJHVzA9R1IKLQlibCAkJGR5bmNhbGwsJXIzMQotCWNvcHkgJXIzMSwlcjIKLQlhZGRpbCBMJ19faW9iLSRnbG9iYWwkKzE2LCVyMjcKLQlsZG8gUidfX2lvYi0kZ2xvYmFsJCsxNiglcjEpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZmbHVzaCwlcjIKLQlub3AKLQlhZGRpbCBMJ19faW9iLSRnbG9iYWwkKzMyLCVyMjcKLQlsZG8gUidfX2lvYi0kZ2xvYmFsJCszMiglcjEpLCVyMjYKLQlsZGlsIEwnTEMkMDAxNSwlcjI1Ci0JbGRvIFInTEMkMDAxNSglcjI1KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBmcHJpbnRmLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDAxNiwlcjI1Ci0JbGRvIFInTEMkMDAxNiglcjI1KSwlcjI1Ci0JYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCszMiwlcjI3Ci0JbGRvIFInX19pb2ItJGdsb2JhbCQrMzIoJXIxKSwlcjI0Ci0JbGRvIC0xKCVyMCksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgdHlwZV9wcmludCwlcjIKLQlub3AKLQlsZGlsIEwnTEMkMDAxNywlcjI2Ci0JbGRvIFInTEMkMDAxNyglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDEwMzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgY2hlY2tfc3R1Yl90eXBlLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzQoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsMTYsJXIxOQotCWxkbyAtMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi1MJDAxMDQ6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkaCAwKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQljb21jbHIsPj0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDEwNSwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI3LDI4LCVyMjEKLQlsZHcgMzYoJXIxOSksJXIyMAotCWFkZCAlcjIxLCVyMjAsJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMTIoJXI0KQotCWxkdyAxMiglcjQpLCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAxMDcsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxOQotCWNvbWljbHIsPSAwLCVyMTksJXIwCi0JYmwgTCQwMTA3LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjcsMjgsJXIyMQotCWxkdyAzNiglcjE5KSwlcjIwCi0JYWRkICVyMjEsJXIyMCwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyOAotCWJsLG4gTCQwMTAwLCVyMAotTCQwMTA3OiAKLUwkMDEwNjogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIC0xKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlibCxuIEwkMDEwNCwlcjAKLUwkMDEwNTogCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGRoIDAoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIxOQotCWxkbyAtMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi1MJDAxMDg6IAotCWxkdyA4KCVyNCksJXIxOQotCWNvbWljbHIsPD0gMCwlcjE5LCVyMAotCWJsIEwkMDEwOSwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI3LDI4LCVyMjEKLQlsZHcgMzYoJXIxOSksJXIyMAotCWFkZCAlcjIxLCVyMjAsJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyA4KCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbG9va3VwX3N0cnVjdF9lbHRfdHlwZSwlcjIKLQlub3AKLQlzdHcgJXIyOCwxNiglcjQpCi0JbGR3IDE2KCVyNCksJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsIEwkMDExMSwlcjAKLQlub3AKLQlsZHcgMTYoJXI0KSwlcjI4Ci0JYmwsbiBMJDAxMDAsJXIwCi1MJDAxMTE6IAotTCQwMTEwOiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gLTEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWJsLG4gTCQwMTA4LCVyMAotTCQwMTA5OiAKLQlsZG8gLTEyKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDExMiwlcjAKLQlub3AKLQljb3B5ICVyMCwlcjI4Ci0JYmwsbiBMJDAxMDAsJXIwCi1MJDAxMTI6IAotCWFkZGlsIEwnY3VycmVudF90YXJnZXQtJGdsb2JhbCQsJXIyNwotCWxkdyBSJ2N1cnJlbnRfdGFyZ2V0LSRnbG9iYWwkKCVyMSksJXIxOQotCWxkdyA3NiglcjE5KSwlcjExCi0JY29weSAlcjExLCVyMjIKLQkuQ0FMTAlBUkdXMD1HUgotCWJsICQkZHluY2FsbCwlcjMxCi0JY29weSAlcjMxLCVyMgotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMTYsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzE2KCVyMSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZmZsdXNoLCVyMgotCW5vcAotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMzIsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzMyKCVyMSksJXIyNgotCWxkaWwgTCdMQyQwMDE1LCVyMjUKLQlsZG8gUidMQyQwMDE1KCVyMjUpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGZwcmludGYsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDE2LCVyMjUKLQlsZG8gUidMQyQwMDE2KCVyMjUpLCVyMjUKLQlhZGRpbCBMJ19faW9iLSRnbG9iYWwkKzMyLCVyMjcKLQlsZG8gUidfX2lvYi0kZ2xvYmFsJCszMiglcjEpLCVyMjQKLQlsZG8gLTEoJXIwKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCB0eXBlX3ByaW50LCVyMgotCW5vcAotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMzIsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzMyKCVyMSksJXIyNgotCWxkaWwgTCdMQyQwMDE4LCVyMjUKLQlsZG8gUidMQyQwMDE4KCVyMjUpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGZwcmludGYsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMzIsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzMyKCVyMSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZnB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwMTksJXIyNgotCWxkbyBSJ0xDJDAwMTkoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi0JbGRvIC0xKCVyMCksJXIyOAotCWJsLG4gTCQwMTAwLCVyMAotTCQwMTAwOiAKLQlsZHcgMjQoJXI0KSwlcjExCi0JbGR3IDI4KCVyNCksJXIxMAotCWxkdyAzMiglcjQpLCVyOQotCWxkdyAzNiglcjQpLCVyOAotCWxkdyA0MCglcjQpLCVyNwotCWxkdyA0NCglcjQpLCVyNgotCWxkdyA0OCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgZmlsbF9pbl92cHRyX2ZpZWxkbm8sQ09ERQotCS5FWFBPUlQgZmlsbF9pbl92cHRyX2ZpZWxkbm8sRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUgotZmlsbF9pbl92cHRyX2ZpZWxkbm86IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyNiwxNiglcjQpCi0Jc3R3ICVyNSwyMCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0NCglcjE5KSwlcjIwCi0JY29taWNsciw+IDAsJXIyMCwlcjAKLQlibCBMJDAxMTQsJXIwCi0Jbm9wCi0JbGRvIDEoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksOCglcjQpCi1MJDAxMTU6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkaCAwKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQljb21jbHIsPCAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMTE2LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjcsMjgsJXIyMQotCWxkdyAzNiglcjE5KSwlcjIwCi0JYWRkICVyMjEsJXIyMCwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZmlsbF9pbl92cHRyX2ZpZWxkbm8sJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCXpkZXAgJXIyMCwyNywyOCwlcjIxCi0JbGR3IDM2KCVyMTkpLCVyMjAKLQlhZGQgJXIyMSwlcjIwLCVyMTkKLQlsZHcgOCglcjE5KSwlcjIwCi0JbGR3IDQ0KCVyMjApLCVyMTkKLQljb21pY2xyLDw9IDAsJXIxOSwlcjAKLQlibCBMJDAxMTgsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgOCglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjcsMjgsJXIyMgotCWxkdyAzNiglcjIwKSwlcjIxCi0JYWRkICVyMjIsJXIyMSwlcjIwCi0JbGR3IDgoJXIyMCksJXIyMQotCWxkdyA0NCglcjIxKSwlcjIwCi0Jc3R3ICVyMjAsNDQoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyA4KCVyNCksJXIyMQotCXpkZXAgJXIyMSwyNywyOCwlcjIyCi0JbGR3IDM2KCVyMjApLCVyMjEKLQlhZGQgJXIyMiwlcjIxLCVyMjAKLQlsZHcgOCglcjIwKSwlcjIxCi0JbGR3IDQwKCVyMjEpLCVyMjAKLQlzdHcgJXIyMCw0MCglcjE5KQotCWJsLG4gTCQwMTE2LCVyMAotTCQwMTE4OiAKLUwkMDExNzogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWJsLG4gTCQwMTE1LCVyMAotTCQwMTE2OiAKLUwkMDExNDogCi1MJDAxMTM6IAotCWxkdyAxNiglcjQpLCVyNgotCWxkdyAyMCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuRVhQT1JUIHN0dWJfbm9uYW1lX2NvbXBsYWludCxEQVRBCi0JLmFsaWduIDQKLUxDJDAwMjA6IAotCS5TVFJJTkcgInN0dWIgdHlwZSBoYXMgTlVMTCBuYW1lXHgwMCIKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotCS5hbGlnbiA0Ci1zdHViX25vbmFtZV9jb21wbGFpbnQ6IAotCS53b3JkIExDJDAwMjAKLQkud29yZCAwCi0JLndvcmQgMAotCS5JTVBPUlQgY29tcGxhaW4sQ09ERQotCS5JTVBPUlQgbWVtY3B5LENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBjaGVja19zdHViX3R5cGUsQ09ERQotCS5FWFBPUlQgY2hlY2tfc3R1Yl90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IKLWNoZWNrX3N0dWJfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRoIDMyKCVyMTkpLCVyMjAKLQlsZG8gNCglcjApLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMTkKLQlleHRycyAlcjE5LDMxLDE2LCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAxMjAsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgdHlwZV9uYW1lX25vX3RhZywlcjIKLQlub3AKLQlzdHcgJXIyOCw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDEyMSwlcjAKLQlub3AKLQlhZGRpbCBMJ3N0dWJfbm9uYW1lX2NvbXBsYWludC0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFInc3R1Yl9ub25hbWVfY29tcGxhaW50LSRnbG9iYWwkKCVyMSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGNvbXBsYWluLCVyMgotCW5vcAotCWJsLG4gTCQwMTE5LCVyMAotTCQwMTIxOiAKLQlzdHcgJXIwLC01MiglcjMwKQotCWxkdyA4KCVyNCksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQljb3B5ICVyMCwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBsb29rdXBfc3ltYm9sLCVyMgotCW5vcAotCXN0dyAlcjI4LDEyKCVyNCkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JY29taWNsciw8PiAwLCVyMTksJXIwCi0JYmwgTCQwMTIyLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGR3IDEyKCVyMjApLCVyMjUKLQlsZG8gNTIoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1jcHksJXIyCi0Jbm9wCi1MJDAxMjI6IAotTCQwMTIwOiAKLUwkMDExOTogCi0JbGR3IDE2KCVyNCksJXI2Ci0JbGR3IDIwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgZ2RiX21hbmdsZV9uYW1lLENPREUKLQkuSU1QT1JUIGNwbHVzX2RlbWFuZ2xlLENPREUKLQkuYWxpZ24gNAotTEMkMDAyMTogCi0JLlNUUklORyAiSW50ZXJuYWw6IENhbm5vdCBkZW1hbmdsZSBtYW5nbGVkIG5hbWUgYCVzJy5ceDAwIgotCS5JTVBPUlQgc3RyY2hyLENPREUKLQkuSU1QT1JUIHBhcnNlX2FuZF9ldmFsX3R5cGUsQ09ERQotCS5JTVBPUlQgYnVpbHRpbl90eXBlX3ZvaWQsREFUQQotCS5JTVBPUlQgZnJlZSxDT0RFCi0JLmFsaWduIDQKLQkuRVhQT1JUIGNoZWNrX3N0dWJfbWV0aG9kLENPREUKLQkuRVhQT1JUIGNoZWNrX3N0dWJfbWV0aG9kLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLWNoZWNrX3N0dWJfbWV0aG9kOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjExLDY0KCVyNCkKLQlzdHcgJXIxMCw2OCglcjQpCi0Jc3R3ICVyOSw3MiglcjQpCi0Jc3R3ICVyOCw3NiglcjQpCi0Jc3R3ICVyNyw4MCglcjQpCi0Jc3R3ICVyNiw4NCglcjQpCi0Jc3R3ICVyNSw4OCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC0xMiglcjApLCVyOQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI5LCVyMTAKLQlzdHcgJXIyNCwwKCVyMTApCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGRvIC0xMiglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JbGR3IDAoJXIyMSksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgZ2RiX21hbmdsZV9uYW1lLCVyMgotCW5vcAotCXN0dyAlcjI4LDEyKCVyNCkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGRvIDMoJXIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBjcGx1c19kZW1hbmdsZSwlcjIKLQlub3AKLQlzdHcgJXIyOCwxNiglcjQpCi0Jc3R3ICVyMCwyOCglcjQpCi0JbGRvIDEoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksMzIoJXI0KQotCWxkdyAxNiglcjQpLCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDEyNCwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDAyMSwlcjI2Ci0JbGRvIFInTEMkMDAyMSglcjI2KSwlcjI2Ci0JbGR3IDEyKCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAxMjQ6IAotCWxkdyAxNiglcjQpLCVyMjYKLQlsZG8gNDAoJXIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjaHIsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjAoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlzdHcgJXIxOSwyNCglcjQpCi1MJDAxMjU6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAxMjYsJXIwCi0Jbm9wCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0MCglcjApLCVyMjAKLQljb21jbHIsPSAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTI3LCVyMAotCW5vcAotCWxkdyAyOCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjgoJXI0KQotCWJsLG4gTCQwMTI4LCVyMAotTCQwMTI3OiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQxKCVyMCksJXIyMAotCWNvbWNsciw9ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxMjksJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkbyAtMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjgoJXI0KQotCWJsLG4gTCQwMTMwLCVyMAotTCQwMTI5OiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQ0KCVyMCksJXIyMAotCWNvbWNsciw9ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxMzEsJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWNvbWljbHIsPSAwLCVyMTksJXIwCi0JYmwgTCQwMTMxLCVyMAotCW5vcAotCWxkdyAzMiglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMzIoJXI0KQotTCQwMTMxOiAKLUwkMDEzMDogCi1MJDAxMjg6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjQoJXI0KQotCWJsLG4gTCQwMTI1LCVyMAotTCQwMTI2OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAxMzcsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGRvIDEyMCglcjIwKSwlcjE5Ci0Jc3R3ICVyMTksNDQoJXI0KQotCWxkdyA0NCglcjQpLCVyMTkKLQlzdHcgJXIxOSw0OCglcjQpCi0JbGR3IDMyKCVyNCksJXIyMAotCWxkbyAyKCVyMjApLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIyMAotCXN0dyAlcjIwLDUyKCVyNCkKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDQ4KCVyNCksJXIyMAotCWxkdyAxNiglcjE5KSwlcjE5Ci0JbGR3IDEyKCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgNTIoJXI0KSwlcjIwCi0JY29tY2xyLDwgJXIxOSwlcjIwLCVyMAotCWJsIEwkMDEzMiwlcjAKLQlub3AKLQlsZHcgNDgoJXI0KSwlcjI2Ci0JbGR3IDUyKCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgX29ic3RhY2tfbmV3Y2h1bmssJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIxOQotCWJsLG4gTCQwMTMzLCVyMAotTCQwMTMyOiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAxMzM6IAotCWxkdyA0OCglcjQpLCVyMTkKLQlsZHcgNDgoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlsZHcgNTIoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyA0NCglcjQpLCVyMTkKLQlzdHcgJXIxOSw1NiglcjQpCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw2MCglcjQpCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDYwKCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAxMzQsJXIwCi0Jbm9wCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDEzNDogCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA1NiglcjQpLCVyMjAKLQlsZHcgNTYoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyA1NiglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyA1NiglcjQpLCVyMTkKLQlsZHcgNTYoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDU2KCVyNCksJXIyMAotCWxkdyA1NiglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTM1LCVyMAotCW5vcAotCWxkdyA1NiglcjQpLCVyMTkKLQlsZHcgNTYoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAxMzYsJXIwCi1MJDAxMzU6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDEzNjogCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA1NiglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgNjAoJXI0KSwlcjExCi0JYmwsbiBMJDAxMzgsJXIwCi1MJDAxMzc6IAotCWxkdyAzMiglcjQpLCVyMjAKLQlsZG8gMiglcjIwKSwlcjE5Ci0JemRlcCAlcjE5LDI5LDMwLCVyMjAKLQljb3B5ICVyMjAsJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgeG1hbGxvYywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMQotTCQwMTM4OiAKLQlzdHcgJXIxMSwzNiglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCXN0dyAlcjE5LDI0KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBsb29rdXBfcG9pbnRlcl90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JbGR3IDM2KCVyNCksJXIyMAotCXN0dyAlcjE5LDAoJXIyMCkKLQlsZG8gMSglcjApLCVyMTkKLQlzdHcgJXIxOSwzMiglcjQpCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0MSglcjApLCVyMjAKLQljb21jbHIsPD4gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDEzOSwlcjAKLQlub3AKLQlzdHcgJXIwLDI4KCVyNCkKLUwkMDE0MDogCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsIEwkMDE0MSwlcjAKLQlub3AKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JY29taWNsciw+PSAwLCVyMTksJXIwCi0JYmwgTCQwMTQyLCVyMAotCW5vcAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQlsZG8gNDQoJXIwKSwlcjIwCi0JY29tY2xyLDw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNDMsJXIwCi0Jbm9wCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0MSglcjApLCVyMjAKLQljb21jbHIsPD4gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE0MywlcjAKLQlub3AKLQlibCxuIEwkMDE0MiwlcjAKLUwkMDE0MzogCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjI2Ci0JY29weSAlcjE5LCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHBhcnNlX2FuZF9ldmFsX3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlsZHcgMzIoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjEKLQlsZHcgMzYoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0Jc3R3ICVyMTksMCglcjIwKQotCWxkdyAzMiglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMzIoJXI0KQotCWxkdyAyNCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjAoJXI0KQotTCQwMTQyOiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQwKCVyMCksJXIyMAotCWNvbWNsciw9ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNDQsJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyOCglcjQpCi0JYmwsbiBMJDAxNDUsJXIwCi1MJDAxNDQ6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQlsZG8gNDEoJXIwKSwlcjIwCi0JY29tY2xyLD0gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE0NiwlcjAKLQlub3AKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGRvIC0xKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyOCglcjQpCi1MJDAxNDY6IAotTCQwMTQ1OiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDI0KCVyNCkKLQlibCxuIEwkMDE0MCwlcjAKLUwkMDE0MTogCi1MJDAxMzk6IAotCWxkbyAtMiglcjApLCVyMTkKLQlsZHcgMjQoJXI0KSwlcjIwCi0JYWRkICVyMTksJXIyMCwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQ2KCVyMCksJXIyMAotCWNvbWNsciw8PiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTQ3LCVyMAotCW5vcAotCWxkdyAzMiglcjQpLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIyMAotCWxkdyAzNiglcjQpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMTkKLQlhZGRpbCBMJ2J1aWx0aW5fdHlwZV92b2lkLSRnbG9iYWwkLCVyMjcKLQlsZHcgUididWlsdGluX3R5cGVfdm9pZC0kZ2xvYmFsJCglcjEpLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTkpCi0JYmwsbiBMJDAxNDgsJXIwCi1MJDAxNDc6IAotCWxkdyAzMiglcjQpLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIyMAotCWxkdyAzNiglcjQpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMTkKLQlzdHcgJXIwLDAoJXIxOSkKLUwkMDE0ODogCi0JbGR3IDE2KCVyNCksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGR3IDQ4KCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JemRlcCAlcjIxLDMwLDMxLCVyMjAKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIyMAotCWxkdyAyMCglcjE5KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkbyAtMTIoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMTkKLQlhZGQgJXIxOSwlcjIwLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWFkZCAlcjE5LCVyMjAsJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTkpCi0JbGRvIC0xMiglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIxOQotCWFkZCAlcjE5LCVyMjAsJXIxOQotCXpkZXAgJXIxOSwyOSwzMCwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JYWRkICVyMTksJXIyMCwlcjE5Ci0JbGR3IDQoJXIxOSksJXIyMAotCXN0dyAlcjIwLDQwKCVyNCkKLQlsZHcgNDAoJXI0KSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDQwKCVyMTkpCi0JbGR3IDQwKCVyNCksJXIxOQotCWxkdyAzNiglcjQpLCVyMjAKLQlzdHcgJXIyMCw0OCglcjE5KQotCWxkdyA0MCglcjQpLCVyMTkKLQlsZHcgNDAoJXI0KSwlcjIwCi0JbGRoIDMyKCVyMjApLCVyMjEKLQljb3B5ICVyMjEsJXIyMAotCWRlcGkgMCwyOSwxLCVyMjAKLQlzdGggJXIyMCwzMiglcjE5KQotCWxkbyAtMTIoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMTkKLQlhZGQgJXIxOSwlcjIwLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWFkZCAlcjE5LCVyMjAsJXIxOQotCWxkdyAxNiglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIDAsNCwxLCVyMjEKLQlzdHcgJXIyMSwxNiglcjE5KQotTCQwMTIzOiAKLQlsZHcgNjQoJXI0KSwlcjExCi0JbGR3IDY4KCVyNCksJXIxMAotCWxkdyA3MiglcjQpLCVyOQotCWxkdyA3NiglcjQpLCVyOAotCWxkdyA4MCglcjQpLCVyNwotCWxkdyA4NCglcjQpLCVyNgotCWxkdyA4OCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgYWxsb2NhdGVfY3BsdXNfc3RydWN0X3R5cGUsQ09ERQotCS5FWFBPUlQgYWxsb2NhdGVfY3BsdXNfc3RydWN0X3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUgotYWxsb2NhdGVfY3BsdXNfc3RydWN0X3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyOCwzMiglcjQpCi0Jc3R3ICVyNywzNiglcjQpCi0Jc3R3ICVyNiw0MCglcjQpCi0Jc3R3ICVyNSw0NCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkdyA0OCglcjIwKSwlcjE5Ci0JbGRpbCBMJ2NwbHVzX3N0cnVjdF9kZWZhdWx0LCVyMjAKLQlsZG8gUidjcGx1c19zdHJ1Y3RfZGVmYXVsdCglcjIwKSwlcjIwCi0JY29tY2xyLD0gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE1MCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjcKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAxNTYsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGRvIDEyMCglcjIwKSwlcjE5Ci0Jc3R3ICVyMTksOCglcjQpCi0JbGR3IDgoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMTIoJXI0KQotCWxkbyAyNCglcjApLCVyMTkKLQlzdHcgJXIxOSwxNiglcjQpCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgMTYoJXIxOSksJXIxOQotCWxkdyAxMiglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDE2KCVyNCksJXIyMAotCWNvbWNsciw8ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNTEsJXIwCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyNgotCWxkdyAxNiglcjQpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIF9vYnN0YWNrX25ld2NodW5rLCVyMgotCW5vcAotCWNvcHkgJXIwLCVyMTkKLQlibCxuIEwkMDE1MiwlcjAKLUwkMDE1MTogCi0JY29weSAlcjAsJXIxOQotTCQwMTUyOiAKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0JbGR3IDE2KCVyNCksJXIyMgotCWFkZCAlcjIxLCVyMjIsJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwyMCglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyNCglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDI0KCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAxNTMsJXIwCi0Jbm9wCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDE1MzogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTU0LCVyMAotCW5vcAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAxNTUsJXIwCi1MJDAxNTQ6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDE1NTogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgMjQoJXI0KSwlcjgKLQlibCxuIEwkMDE1NywlcjAKLUwkMDE1NjogCi0JbGRvIDI0KCVyMCksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgeG1hbGxvYywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI4Ci1MJDAxNTc6IAotCXN0dyAlcjgsNDgoJXI3KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkaWwgTCdjcGx1c19zdHJ1Y3RfZGVmYXVsdCwlcjE5Ci0JY29weSAlcjIwLCVyMjEKLQlsZG8gUidjcGx1c19zdHJ1Y3RfZGVmYXVsdCglcjE5KSwlcjIyCi0JbGR3cyxtYSA0KCVyMjIpLCVyMTkKLQlsZHdzLG1hIDQoJXIyMiksJXIyMAotCXN0d3MsbWEgJXIxOSw0KCVyMjEpCi0JbGR3cyxtYSA0KCVyMjIpLCVyMTkKLQlzdHdzLG1hICVyMjAsNCglcjIxKQotCWxkd3MsbWEgNCglcjIyKSwlcjIwCi0Jc3R3cyxtYSAlcjE5LDQoJXIyMSkKLQlsZHdzLG1hIDQoJXIyMiksJXIxOQotCXN0d3MsbWEgJXIyMCw0KCVyMjEpCi0JbGR3cyxtYSA0KCVyMjIpLCVyMjAKLQlzdHdzLG1hICVyMTksNCglcjIxKQotCXN0dyAlcjIwLDAoJXIyMSkKLUwkMDE1MDogCi1MJDAxNDk6IAotCWxkdyAzMiglcjQpLCVyOAotCWxkdyAzNiglcjQpLCVyNwotCWxkdyA0MCglcjQpLCVyNgotCWxkdyA0NCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIG9ic2F2ZXN0cmluZyxDT0RFCi0JLmFsaWduIDQKLQkuRVhQT1JUIGluaXRfdHlwZSxDT0RFCi0JLkVYUE9SVCBpbml0X3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUixSVE5WQUw9R1IKLWluaXRfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxNCw4KCVyNCkKLQlzdHcgJXIxMywxMiglcjQpCi0Jc3R3ICVyMTIsMTYoJXI0KQotCXN0dyAlcjExLDIwKCVyNCkKLQlzdHcgJXIxMCwyNCglcjQpCi0Jc3R3ICVyOSwyOCglcjQpCi0Jc3R3ICVyOCwzMiglcjQpCi0Jc3R3ICVyNywzNiglcjQpCi0Jc3R3ICVyNiw0MCglcjQpCi0Jc3R3ICVyNSw0NCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC0xMiglcjApLCVyOQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI5LCVyMTAKLQlzdHcgJXIyNCwwKCVyMTApCi0JbGRvIC0xNiglcjApLCVyMTEKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyMTEsJXIxMgotCXN0dyAlcjIzLDAoJXIxMikKLQlsZG8gLTIwKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgYWxsb2NfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMwotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTMpCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXIxMykKLQlsZG8gLTEyKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRoIDMyKCVyMTMpLCVyMjAKLQlsZGggMiglcjE5KSwlcjE5Ci0Jb3IgJXIyMCwlcjE5LCVyMjAKLQlzdGggJXIyMCwzMiglcjEzKQotCWxkbyAtMTYoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMTU5LCVyMAotCW5vcAotCWxkbyAtMjAoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMTU5LCVyMAotCW5vcAotCWxkbyAtMTYoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTQKLQlsZG8gLTE2KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgc3RybGVuLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JbGRvIC0yMCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlsZG8gMTIwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE0KSwlcjI2Ci0JY29weSAlcjE5LCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgb2JzYXZlc3RyaW5nLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0Jc3R3ICVyMTksNCglcjEzKQotCWJsLG4gTCQwMTYwLCVyMAotTCQwMTU5OiAKLQlsZG8gLTE2KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDQoJXIxMykKLUwkMDE2MDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMywlcjIwLCVyMAotCWJsIEwkMDE2MiwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiA0LCVyMjAsJXIwCi0JYmwgTCQwMTYyLCVyMAotCW5vcAotCWJsLG4gTCQwMTYxLCVyMAotTCQwMTYyOiAKLQlsZGlsIEwnY3BsdXNfc3RydWN0X2RlZmF1bHQsJXIxOQotCWxkbyBSJ2NwbHVzX3N0cnVjdF9kZWZhdWx0KCVyMTkpLCVyMTkKLQlzdHcgJXIxOSw0OCglcjEzKQotTCQwMTYxOiAKLQljb3B5ICVyMTMsJXIyOAotCWJsLG4gTCQwMTU4LCVyMAotTCQwMTU4OiAKLQlsZHcgOCglcjQpLCVyMTQKLQlsZHcgMTIoJXI0KSwlcjEzCi0JbGR3IDE2KCVyNCksJXIxMgotCWxkdyAyMCglcjQpLCVyMTEKLQlsZHcgMjQoJXI0KSwlcjEwCi0JbGR3IDI4KCVyNCksJXI5Ci0JbGR3IDMyKCVyNCksJXI4Ci0JbGR3IDM2KCVyNCksJXI3Ci0JbGR3IDQwKCVyNCksJXI2Ci0JbGR3IDQ0KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci1MQyQwMDIyOiAKLQkuU1RSSU5HICJpbnRlcm5hbCBlcnJvciAtIGludmFsaWQgZnVuZGFtZW50YWwgdHlwZSBpZCAlZFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMjM6IAotCS5TVFJJTkcgImludGVybmFsIGVycm9yOiB1bmhhbmRsZWQgdHlwZSBpZCAlZFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMjQ6IAotCS5TVFJJTkcgInZvaWRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDI1OiAKLQkuU1RSSU5HICJib29sZWFuXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAyNjogCi0JLlNUUklORyAic3RyaW5nXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAyNzogCi0JLlNUUklORyAiY2hhclx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMjg6IAotCS5TVFJJTkcgInNpZ25lZCBjaGFyXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAyOTogCi0JLlNUUklORyAidW5zaWduZWQgY2hhclx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMzA6IAotCS5TVFJJTkcgInNob3J0XHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzMTogCi0JLlNUUklORyAidW5zaWduZWQgc2hvcnRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDMyOiAKLQkuU1RSSU5HICJpbnRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDMzOiAKLQkuU1RSSU5HICJ1bnNpZ25lZCBpbnRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDM0OiAKLQkuU1RSSU5HICJmaXhlZCBkZWNpbWFsXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzNTogCi0JLlNUUklORyAibG9uZ1x4MDAiCi0JLmFsaWduIDQKLUxDJDAwMzY6IAotCS5TVFJJTkcgInVuc2lnbmVkIGxvbmdceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDM3OiAKLQkuU1RSSU5HICJsb25nIGxvbmdceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDM4OiAKLQkuU1RSSU5HICJzaWduZWQgbG9uZyBsb25nXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzOTogCi0JLlNUUklORyAidW5zaWduZWQgbG9uZyBsb25nXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0MDogCi0JLlNUUklORyAiZmxvYXRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQxOiAKLQkuU1RSSU5HICJkb3VibGVceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQyOiAKLQkuU1RSSU5HICJmbG9hdGluZyBkZWNpbWFsXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0MzogCi0JLlNUUklORyAibG9uZyBkb3VibGVceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQ0OiAKLQkuU1RSSU5HICJjb21wbGV4XHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0NTogCi0JLlNUUklORyAiZG91YmxlIGNvbXBsZXhceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQ2OiAKLQkuU1RSSU5HICJsb25nIGRvdWJsZSBjb21wbGV4XHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUsQ09ERQotCS5FWFBPUlQgbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLWxvb2t1cF9mdW5kYW1lbnRhbF90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjEyLDMyKCVyNCkKLQlzdHcgJXIxMSwzNiglcjQpCi0Jc3R3ICVyMTAsNDAoJXI0KQotCXN0dyAlcjksNDQoJXI0KQotCXN0dyAlcjgsNDgoJXI0KQotCXN0dyAlcjcsNTIoJXI0KQotCXN0dyAlcjYsNTYoJXI0KQotCXN0dyAlcjUsNjAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWNvcHkgJXIwLCVyOQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw9IDAsJXIyMCwlcjAKLQlibCBMJDAxNjUsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyAyNSglcjApLCVyMTkKLQljb21jbHIsPD0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDE2NSwlcjAKLQlub3AKLQlibCxuIEwkMDE2NCwlcjAKLUwkMDE2NTogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMjIsJXIyNgotCWxkbyBSJ0xDJDAwMjIoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotCWJsLG4gTCQwMTY2LCVyMAotTCQwMTY0OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDE5NiglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAxNjcsJXIwCi0Jbm9wCi0JbGRvIDEwNCglcjApLCVyMTEKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjEyCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAxMjAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDEyKCVyNCkKLQlzdHcgJXIxMSwxNiglcjQpCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgMTYoJXIxOSksJXIxOQotCWxkdyAxMiglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDE2KCVyNCksJXIyMAotCWNvbWNsciw8ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNjgsJXIwCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyNgotCWxkdyAxNiglcjQpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIF9vYnN0YWNrX25ld2NodW5rLCVyMgotCW5vcAotCWNvcHkgJXIwLCVyMTkKLQlibCxuIEwkMDE2OSwlcjAKLUwkMDE2ODogCi0JY29weSAlcjAsJXIxOQotTCQwMTY5OiAKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0JbGR3IDE2KCVyNCksJXIyMgotCWFkZCAlcjIxLCVyMjIsJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwyMCglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyNCglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDI0KCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAxNzAsJXIwCi0Jbm9wCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDE3MDogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTcxLCVyMAotCW5vcAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAxNzIsJXIwCi1MJDAxNzE6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDE3MjogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgMjQoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMTk2KCVyMTIpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxOTYoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQljb3B5ICVyMTEsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotTCQwMTY3OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JbGR3IDE5NiglcjE5KSwlcjE5Ci0JYWRkICVyMjAsJXIxOSwlcjEwCi0JbGR3IDAoJXIxMCksJXI5Ci0JY29taWNsciw9IDAsJXI5LCVyMAotCWJsIEwkMDE3MywlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JYWRkaSx1diAtMjYsJXIyMCwlcjAKLQlibHIsbiAlcjIwLCVyMAotCWIsbiBMJDAxNzUKLUwkMDIwMjogCi0JYiBMJDAxNzYKLQlub3AKLQliIEwkMDE3NwotCW5vcAotCWIgTCQwMTc5Ci0Jbm9wCi0JYiBMJDAxODAKLQlub3AKLQliIEwkMDE4MQotCW5vcAotCWIgTCQwMTgyCi0Jbm9wCi0JYiBMJDAxODMKLQlub3AKLQliIEwkMDE4NAotCW5vcAotCWIgTCQwMTg1Ci0Jbm9wCi0JYiBMJDAxODYKLQlub3AKLQliIEwkMDE4NwotCW5vcAotCWIgTCQwMTg5Ci0Jbm9wCi0JYiBMJDAxOTAKLQlub3AKLQliIEwkMDE5MQotCW5vcAotCWIgTCQwMTkyCi0Jbm9wCi0JYiBMJDAxOTMKLQlub3AKLQliIEwkMDE5NAotCW5vcAotCWIgTCQwMTk1Ci0Jbm9wCi0JYiBMJDAxOTYKLQlub3AKLQliIEwkMDE5OAotCW5vcAotCWIgTCQwMTk5Ci0Jbm9wCi0JYiBMJDAyMDAKLQlub3AKLQliIEwkMDIwMQotCW5vcAotCWIgTCQwMTc4Ci0Jbm9wCi0JYiBMJDAxODgKLQlub3AKLQliIEwkMDE5NwotCW5vcAotTCQwMTc1OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAyMywlcjI2Ci0JbGRvIFInTEMkMDAyMyglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxNzY6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOSglcjApLCVyMjYKLQlsZG8gMSglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMjQsJXIyMwotCWxkbyBSJ0xDJDAwMjQoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE3NzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDI1LCVyMjMKLQlsZG8gUidMQyQwMDI1KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxNzg6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gMTIoJXIwKSwlcjI2Ci0JbGRvIDEoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDI2LCVyMjMKLQlsZG8gUidMQyQwMDI2KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxNzk6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gMSglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMjcsJXIyMwotCWxkbyBSJ0xDJDAwMjcoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4MDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyAxKCVyMCksJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDI4LCVyMjMKLQlsZG8gUidMQyQwMDI4KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODE6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gMSglcjApLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAyOSwlcjIzCi0JbGRvIFInTEMkMDAyOSglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTgyOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDIoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDMwLCVyMjMKLQlsZG8gUidMQyQwMDMwKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODM6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gMiglcjApLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAzMCwlcjIzCi0JbGRvIFInTEMkMDAzMCglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTg0OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDIoJXIwKSwlcjI1Ci0JbGRvIDEoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzEsJXIyMwotCWxkbyBSJ0xDJDAwMzEoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4NTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDAzMiwlcjIzCi0JbGRvIFInTEMkMDAzMiglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTg2OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzIsJXIyMwotCWxkbyBSJ0xDJDAwMzIoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4NzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDMzLCVyMjMKLQlsZG8gUidMQyQwMDMzKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODg6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gNCglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzQsJXIyMwotCWxkbyBSJ0xDJDAwMzQoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4OTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDAzNSwlcjIzCi0JbGRvIFInTEMkMDAzNSglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTkwOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzUsJXIyMwotCWxkbyBSJ0xDJDAwMzUoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5MTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDM2LCVyMjMKLQlsZG8gUidMQyQwMDM2KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTI6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gOCglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzcsJXIyMwotCWxkbyBSJ0xDJDAwMzcoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5MzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA4KCVyMCksJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDM4LCVyMjMKLQlsZG8gUidMQyQwMDM4KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTQ6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gOCglcjApLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAzOSwlcjIzCi0JbGRvIFInTEMkMDAzOSglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTk1OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDgoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQwLCVyMjMKLQlsZG8gUidMQyQwMDQwKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTY6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOCglcjApLCVyMjYKLQlsZG8gOCglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwNDEsJXIyMwotCWxkbyBSJ0xDJDAwNDEoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5NzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA4KCVyMCksJXIyNgotCWxkbyA4KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDA0MiwlcjIzCi0JbGRvIFInTEMkMDA0MiglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTk4OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDgoJXIwKSwlcjI2Ci0JbGRvIDE2KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDA0MywlcjIzCi0JbGRvIFInTEMkMDA0MyglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTk5OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDgoJXIwKSwlcjI2Ci0JbGRvIDgoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQ0LCVyMjMKLQlsZG8gUidMQyQwMDQ0KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAyMDA6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOCglcjApLCVyMjYKLQlsZG8gMTYoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQ1LCVyMjMKLQlsZG8gUidMQyQwMDQ1KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAyMDE6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOCglcjApLCVyMjYKLQlsZG8gMTYoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQ2LCVyMjMKLQlsZG8gUidMQyQwMDQ2KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxNzQ6IAotCXN0dyAlcjksMCglcjEwKQotTCQwMTczOiAKLUwkMDE2NjogCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMTYzLCVyMAotTCQwMTYzOiAKLQlsZHcgMzIoJXI0KSwlcjEyCi0JbGR3IDM2KCVyNCksJXIxMQotCWxkdyA0MCglcjQpLCVyMTAKLQlsZHcgNDQoJXI0KSwlcjkKLQlsZHcgNDgoJXI0KSwlcjgKLQlsZHcgNTIoJXI0KSwlcjcKLQlsZHcgNTYoJXI0KSwlcjYKLQlsZHcgNjAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBwdXRzX2ZpbHRlcmVkLENPREUKLQkuYWxpZ24gNAotTEMkMDA0NzogCi0JLlNUUklORyAiIFx4MDAiCi0JLklNUE9SVCBwcmludGZfZmlsdGVyZWQsQ09ERQotCS5hbGlnbiA0Ci1MQyQwMDQ4OiAKLQkuU1RSSU5HICIxXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0OTogCi0JLlNUUklORyAiMFx4MDAiCi0JLmFsaWduIDQKLXByaW50X2JpdF92ZWN0b3I6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOCwxNiglcjQpCi0Jc3R3ICVyNywyMCglcjQpCi0Jc3R3ICVyNiwyNCglcjQpCi0Jc3R3ICVyNSwyOCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0Jc3R3ICVyMCw4KCVyNCkKLUwkMDIwNDogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JbGR3IDAoJXIxOSksJXIxOQotCWNvbWNsciw8ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAyMDUsJXIwCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JY29taWNsciw+IDAsJXIxOSwlcjAKLQlibCBMJDAyMDgsJXIwCi0Jbm9wCi0JbGRvIDcoJXIxOSksJXIxOQotTCQwMjA4OiAKLQlleHRycyAlcjE5LDI4LDI5LCVyMTkKLQl6ZGVwICVyMTksMjgsMjksJXIyMQotCXN1YiAlcjIwLCVyMjEsJXIxOQotCWNvbWljbHIsPSAwLCVyMTksJXIwCi0JYmwgTCQwMjA3LCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMDQ3LCVyMjYKLQlsZG8gUidMQyQwMDQ3KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi1MJDAyMDc6IAotCWxkdyA4KCVyNCksJXIyMAotCWV4dHJzICVyMjAsMjgsMjksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlhZGQgJXIxOSwlcjIxLCVyMjAKLQlsZGIgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JZXh0cnUgJXIyMCwzMSwzLCVyMjEKLQlzdWJpLD4+PSAzMSwlcjIxLCVyMjAKLQljb3B5ICVyMCwlcjIwCi0JbXRzYXIgJXIyMAotCXZleHRycyAlcjE5LDMyLCVyMTkKLQlleHRydSAlcjE5LDMxLDEsJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDIwOSwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDA0OCwlcjI2Ci0JbGRvIFInTEMkMDA0OCglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMTAsJXIwCi1MJDAyMDk6IAotCWxkaWwgTCdMQyQwMDQ5LCVyMjYKLQlsZG8gUidMQyQwMDQ5KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIxMDogCi1MJDAyMDY6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlibCxuIEwkMDIwNCwlcjAKLUwkMDIwNTogCi1MJDAyMDM6IAotCWxkdyAxNiglcjQpLCVyOAotCWxkdyAyMCglcjQpLCVyNwotCWxkdyAyNCglcjQpLCVyNgotCWxkdyAyOCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsQ09ERQotCS5hbGlnbiA0Ci1wcmludF9hcmdfdHlwZXM6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOCw4KCVyNCkKLQlzdHcgJXI3LDEyKCVyNCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjEyLCVyMAotCW5vcAotTCQwMjEzOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDIxNCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkbyAyKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyA0KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwwKCVyMTkpCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gOSwlcjIwLCVyMAotCWJsIEwkMDIxNSwlcjAKLQlub3AKLQlibCxuIEwkMDIxNCwlcjAKLUwkMDIxNTogCi0JYmwsbiBMJDAyMTMsJXIwCi1MJDAyMTQ6IAotTCQwMjEyOiAKLUwkMDIxMTogCi0JbGR3IDgoJXI0KSwlcjgKLQlsZHcgMTIoJXI0KSwlcjcKLQlsZHcgMTYoJXI0KSwlcjYKLQlsZHcgMjAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBwcmludGZpX2ZpbHRlcmVkLENPREUKLQkuYWxpZ24gNAotTEMkMDA1MDogCi0JLlNUUklORyAiZm5fZmllbGRsaXN0cyAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNTE6IAotCS5TVFJJTkcgIlslZF0gbmFtZSAnJXMnICgweCV4KSBsZW5ndGggJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1MjogCi0JLlNUUklORyAiWyVkXSBwaHlzbmFtZSAnJXMnICgweCV4KVx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDUzOiAKLQkuU1RSSU5HICJ0eXBlIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1NDogCi0JLlNUUklORyAiYXJncyAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNTU6IAotCS5TVFJJTkcgImZjb250ZXh0IDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1NjogCi0JLlNUUklORyAiaXNfY29uc3QgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1NzogCi0JLlNUUklORyAiaXNfdm9sYXRpbGUgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1ODogCi0JLlNUUklORyAiaXNfcHJpdmF0ZSAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDU5OiAKLQkuU1RSSU5HICJpc19wcm90ZWN0ZWQgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA2MDogCi0JLlNUUklORyAiaXNfc3R1YiAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDYxOiAKLQkuU1RSSU5HICJ2b2Zmc2V0ICV1XHgwYVx4MDAiCi0JLmFsaWduIDQKLWR1bXBfZm5fZmllbGRsaXN0czogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXI4LDI0KCVyNCkKLQlzdHcgJXI3LDI4KCVyNCkKLQlzdHcgJXI2LDMyKCVyNCkKLQlzdHcgJXI1LDM2KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGR3IDQ4KCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTAsJXIyNQotCWxkbyBSJ0xDJDAwNTAoJXIyNSksJXIyNQotCWxkdyAyMCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCXN0dyAlcjAsOCglcjQpCi1MJDAyMTc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkaCAyKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQljb21jbHIsPCAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMjE4LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMQotCXpkZXAgJXIyMSwzMCwzMSwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMjAoJXIxOSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxNiglcjQpCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyAyKCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGR3IDQ4KCVyMjEpLCVyMjAKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMzAsMzEsJXIyMQotCWFkZCAlcjIxLCVyMjIsJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIxCi0JbGR3IDIwKCVyMjApLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjAKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIxLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0JbGR3IDQ4KCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjMKLQl6ZGVwICVyMjMsMzAsMzEsJXIyMgotCWFkZCAlcjIyLCVyMjMsJXIyMgotCXpkZXAgJXIyMiwyOSwzMCwlcjIyCi0JbGR3IDIwKCVyMjEpLCVyMjMKLQlhZGQgJXIyMiwlcjIzLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0Jc3R3ICVyMjIsLTUyKCVyMzApCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0OCglcjIyKSwlcjIxCi0JbGR3IDgoJXI0KSwlcjIzCi0JemRlcCAlcjIzLDMwLDMxLCVyMjIKLQlhZGQgJXIyMiwlcjIzLCVyMjIKLQl6ZGVwICVyMjIsMjksMzAsJXIyMgotCWxkdyAyMCglcjIxKSwlcjIzCi0JYWRkICVyMjIsJXIyMywlcjIxCi0JbGR3IDQoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01NiglcjMwKQotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTEsJXIyNQotCWxkbyBSJ0xDJDAwNTEoJXIyNSksJXIyNQotCWxkdyA4KCVyNCksJXIyNAotCWxkdyAwKCVyMjApLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0Jc3R3ICVyMCwxMiglcjQpCi1MJDAyMjA6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMQotCXpkZXAgJXIyMSwzMCwzMSwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMjAoJXIxOSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgNCglcjE5KSwlcjE5Ci0JY29tY2xyLDwgJXIyMCwlcjE5LCVyMAotCWJsIEwkMDIyMSwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDQoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAxMiglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjksMzAsJXIyMQotCWFkZCAlcjIxLCVyMjIsJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIxCi0JbGR3IDE2KCVyNCksJXIyMgotCWFkZCAlcjIxLCVyMjIsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlzdHcgJXIyMiwtNTIoJXIzMCkKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMDUyLCVyMjUKLQlsZG8gUidMQyQwMDUyKCVyMjUpLCVyMjUKLQlsZHcgMTIoJXI0KSwlcjI0Ci0JbGR3IDAoJXIyMCksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDgoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTMsJXIyNQotCWxkbyBSJ0xDJDAwNTMoJXIyNSksJXIyNQotCWxkdyA0KCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjE5Ci0JYWRkICVyMTksJXIyMCwlcjE5Ci0JemRlcCAlcjE5LDI5LDMwLCVyMTkKLQlsZHcgMTYoJXI0KSwlcjIwCi0JYWRkICVyMTksJXIyMCwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkbyAxMCglcjIxKSwlcjIwCi0JbGR3IDQoJXIxOSksJXIyNgotCWNvcHkgJXIyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWN1cnNpdmVfZHVtcF90eXBlLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIyCi0JYWRkICVyMjAsJXIyMiwlcjIxCi0JbGR3IDQoJXIyMSksJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTQsJXIyNQotCWxkbyBSJ0xDJDAwNTQoJXIyNSksJXIyNQotCWxkdyA0OCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkdyAxMiglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIxOQotCWFkZCAlcjE5LCVyMjAsJXIxOQotCXpkZXAgJXIxOSwyOSwzMCwlcjE5Ci0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjE5LCVyMjEsJXIyMAotCWxkdyA0KCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgNDgoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2FyZ190eXBlcywlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDgoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTUsJXIyNQotCWxkbyBSJ0xDJDAwNTUoJXIyNSksJXIyNQotCWxkdyAxMiglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDArMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTYsJXIyNQotCWxkbyBSJ0xDJDAwNTYoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDErMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTcsJXIyNQotCWxkbyBSJ0xDJDAwNTcoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDIrMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTgsJXIyNQotCWxkbyBSJ0xDJDAwNTgoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDMrMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTksJXIyNQotCWxkbyBSJ0xDJDAwNTkoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDQrMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjAsJXIyNQotCWxkbyBSJ0xDJDAwNjAoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDgrMjQtMSwyNCwlcjIyCi0JbGRvIC0yKCVyMjIpLCVyMjAKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMDYxLCVyMjUKLQlsZG8gUidMQyQwMDYxKCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIyMjogCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxMiglcjQpCi0JYmwsbiBMJDAyMjAsJXIwCi1MJDAyMjE6IAotTCQwMjE5OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi0JYmwsbiBMJDAyMTcsJXIwCi1MJDAyMTg6IAotTCQwMjE2OiAKLQlsZHcgMjQoJXI0KSwlcjgKLQlsZHcgMjgoJXI0KSwlcjcKLQlsZHcgMzIoJXI0KSwlcjYKLQlsZHcgMzYoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLUxDJDAwNjI6IAotCS5TVFJJTkcgIm5fYmFzZWNsYXNzZXMgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA2MzogCi0JLlNUUklORyAibmZuX2ZpZWxkcyAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDY0OiAKLQkuU1RSSU5HICJuZm5fZmllbGRzX3RvdGFsICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNjU6IAotCS5TVFJJTkcgInZpcnR1YWxfZmllbGRfYml0cyAoJWQgYml0cyBhdCAqMHgleClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDY2OiAKLQkuU1RSSU5HICJceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA2NzogCi0JLlNUUklORyAicHJpdmF0ZV9maWVsZF9iaXRzICglZCBiaXRzIGF0ICoweCV4KVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNjg6IAotCS5TVFJJTkcgInByb3RlY3RlZF9maWVsZF9iaXRzICglZCBiaXRzIGF0ICoweCV4KVx4MDAiCi0JLmFsaWduIDQKLXByaW50X2NwbHVzX3N0dWZmOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjgsMTYoJXI0KQotCXN0dyAlcjcsMjAoJXI0KQotCXN0dyAlcjYsMjQoJXI0KQotCXN0dyAlcjUsMjgoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIyMQotCWxkaCAwKCVyMjEpLCVyMjIKLQlleHRycyAlcjIyLDMxLDE2LCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjIsJXIyNQotCWxkbyBSJ0xDJDAwNjIoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIyMQotCWxkaCAyKCVyMjEpLCVyMjIKLQlleHRycyAlcjIyLDMxLDE2LCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjMsJXIyNQotCWxkbyBSJ0xDJDAwNjMoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlsZHcgNDgoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA2NCwlcjI1Ci0JbGRvIFInTEMkMDA2NCglcjI1KSwlcjI1Ci0JbGR3IDQoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQ4KCVyMTkpLCVyMjAKLQlsZGggMCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjE5Ci0JY29taWNsciw8IDAsJXIxOSwlcjAKLQlibCBMJDAyMjQsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyA0OCglcjIwKSwlcjIxCi0JbGRoIDAoJXIyMSksJXIyMgotCWV4dHJzICVyMjIsMzEsMTYsJXIyMAotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlsZHcgNDgoJXIyMiksJXIyMQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA2NSwlcjI1Ci0JbGRvIFInTEMkMDA2NSglcjI1KSwlcjI1Ci0JY29weSAlcjIwLCVyMjQKLQlsZHcgOCglcjIxKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIyMQotCWxkaCAwKCVyMjEpLCVyMjIKLQlleHRycyAlcjIyLDMxLDE2LCVyMjAKLQlsZHcgOCglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2JpdF92ZWN0b3IsJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIyNDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkaCAzNCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSwxNiwlcjE5Ci0JY29taWNsciw8IDAsJXIxOSwlcjAKLQlibCBMJDAyMjUsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAyMjYsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkaCAzNCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjIwCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0OCglcjIyKSwlcjIxCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDY3LCVyMjUKLQlsZG8gUidMQyQwMDY3KCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCWxkdyAxMiglcjIxKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZGggMzQoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIyMAotCWxkdyAxMiglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2JpdF92ZWN0b3IsJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIyNjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAyMjcsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkaCAzNCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjIwCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0OCglcjIyKSwlcjIxCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDY4LCVyMjUKLQlsZG8gUidMQyQwMDY4KCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCWxkdyAxNiglcjIxKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZGggMzQoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIyMAotCWxkdyAxNiglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2JpdF92ZWN0b3IsJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIyNzogCi1MJDAyMjU6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkaCAyKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMTkKLQljb21pY2xyLDwgMCwlcjE5LCVyMAotCWJsIEwkMDIyOCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZHVtcF9mbl9maWVsZGxpc3RzLCVyMgotCW5vcAotTCQwMjI4OiAKLUwkMDIyMzogCi0JbGR3IDE2KCVyNCksJXI4Ci0JbGR3IDIwKCVyNCksJXI3Ci0JbGR3IDI0KCVyNCksJXI2Ci0JbGR3IDI4KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci1MQyQwMDY5OiAKLQkuU1RSSU5HICJ0eXBlIG5vZGUgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDcwOiAKLQkuU1RSSU5HICJuYW1lICclcycgKDB4JXgpXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzE6IAotCS5TVFJJTkcgIjxOVUxMPlx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzI6IAotCS5TVFJJTkcgImNvZGUgMHgleCBceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDczOiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1VOREVGKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzQ6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfUFRSKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzU6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfQVJSQVkpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3NjogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9TVFJVQ1QpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3NzogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9VTklPTilceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDc4OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX0VOVU0pXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3OTogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9GVU5DKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODA6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfSU5UKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODE6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfRkxUKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODI6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfVk9JRClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDgzOiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1NFVClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDg0OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1JBTkdFKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODU6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfUEFTQ0FMX0FSUkFZKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODY6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfRVJST1IpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4NzogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9NRU1CRVIpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4ODogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9NRVRIT0QpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4OTogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9SRUYpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5MDogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9DSEFSKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTE6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfQk9PTClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDkyOiAKLQkuU1RSSU5HICIoVU5LTk9XTiBUWVBFIENPREUpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5MzogCi0JLlNUUklORyAibGVuZ3RoICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTQ6IAotCS5TVFJJTkcgIm9iamZpbGUgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDk1OiAKLQkuU1RSSU5HICJ0YXJnZXRfdHlwZSAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTY6IAotCS5TVFJJTkcgInBvaW50ZXJfdHlwZSAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTc6IAotCS5TVFJJTkcgInJlZmVyZW5jZV90eXBlIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5ODogCi0JLlNUUklORyAiZnVuY3Rpb25fdHlwZSAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTk6IAotCS5TVFJJTkcgImZsYWdzIDB4JXhceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTAwOiAKLQkuU1RSSU5HICIgVFlQRV9GTEFHX1VOU0lHTkVEXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwMTogCi0JLlNUUklORyAiIFRZUEVfRkxBR19TSUdORURceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTAyOiAKLQkuU1RSSU5HICIgVFlQRV9GTEFHX1NUVUJceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTAzOiAKLQkuU1RSSU5HICJuZmllbGRzICVkIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwNDogCi0JLlNUUklORyAiWyVkXSBiaXRwb3MgJWQgYml0c2l6ZSAlZCB0eXBlIDB4JXggbmFtZSAnJXMnICgweCV4KVx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTA1OiAKLQkuU1RSSU5HICJ2cHRyX2Jhc2V0eXBlIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwNjogCi0JLlNUUklORyAidnB0cl9maWVsZG5vICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAxMDc6IAotCS5TVFJJTkcgImFyZ190eXBlcyAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAxMDg6IAotCS5TVFJJTkcgImNwbHVzX3N0dWZmIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwOTogCi0JLlNUUklORyAidHlwZV9zcGVjaWZpYyAweCV4XHgwMCIKLQkuYWxpZ24gNAotTEMkMDExMDogCi0JLlNUUklORyAiICh1bmtub3duIGRhdGEgZm9ybSlceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCByZWN1cnNpdmVfZHVtcF90eXBlLENPREUKLQkuRVhQT1JUIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUgotcmVjdXJzaXZlX2R1bXBfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI4LDE2KCVyNCkKLQlzdHcgJXI3LDIwKCVyNCkKLQlzdHcgJXI2LDI0KCVyNCkKLQlzdHcgJXI1LDI4KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjksJXIyNQotCWxkbyBSJ0xDJDAwNjkoJXIyNSksJXIyNQotCWxkdyAwKCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlsZHcgNCglcjIyKSwlcjIxCi0JbGRvIC00KCVyMCksJXIyMgotCWxkbyAtMzIoJXI0KSwlcjI0Ci0JYWRkICVyMjQsJXIyMiwlcjIzCi0JbGR3IDAoJXIyMyksJXIyMgotCWxkdyA0KCVyMjIpLCVyMjMKLQljb21pY2xyLD0gMCwlcjIzLCVyMAotCWJsIEwkMDIzMCwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDA3MSwlcjIxCi0JbGRvIFInTEMkMDA3MSglcjIxKSwlcjIxCi1MJDAyMzA6IAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA3MCwlcjI1Ci0JbGRvIFInTEMkMDA3MCglcjI1KSwlcjI1Ci0JbGR3IDQoJXIyMCksJXIyNAotCWNvcHkgJXIyMSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNzIsJXIyNQotCWxkbyBSJ0xDJDAwNzIoJXIyNSksJXIyNQotCWxkdyAwKCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlhZGRpLHV2IC0xOSwlcjIwLCVyMAotCWJscixuICVyMjAsJXIwCi0JYixuIEwkMDI1MQotTCQwMjUyOiAKLQliIEwkMDIzMgotCW5vcAotCWIgTCQwMjMzCi0Jbm9wCi0JYiBMJDAyMzQKLQlub3AKLQliIEwkMDIzNQotCW5vcAotCWIgTCQwMjM2Ci0Jbm9wCi0JYiBMJDAyMzcKLQlub3AKLQliIEwkMDIzOAotCW5vcAotCWIgTCQwMjM5Ci0Jbm9wCi0JYiBMJDAyNDAKLQlub3AKLQliIEwkMDI0MQotCW5vcAotCWIgTCQwMjQyCi0Jbm9wCi0JYiBMJDAyNDMKLQlub3AKLQliIEwkMDI0NAotCW5vcAotCWIgTCQwMjQ1Ci0Jbm9wCi0JYiBMJDAyNDYKLQlub3AKLQliIEwkMDI0NwotCW5vcAotCWIgTCQwMjQ4Ci0Jbm9wCi0JYiBMJDAyNDkKLQlub3AKLQliIEwkMDI1MAotCW5vcAotTCQwMjMyOiAKLQlsZGlsIEwnTEMkMDA3MywlcjI2Ci0JbGRvIFInTEMkMDA3MyglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyMzM6IAotCWxkaWwgTCdMQyQwMDc0LCVyMjYKLQlsZG8gUidMQyQwMDc0KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDIzNDogCi0JbGRpbCBMJ0xDJDAwNzUsJXIyNgotCWxkbyBSJ0xDJDAwNzUoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjM1OiAKLQlsZGlsIEwnTEMkMDA3NiwlcjI2Ci0JbGRvIFInTEMkMDA3NiglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyMzY6IAotCWxkaWwgTCdMQyQwMDc3LCVyMjYKLQlsZG8gUidMQyQwMDc3KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDIzNzogCi0JbGRpbCBMJ0xDJDAwNzgsJXIyNgotCWxkbyBSJ0xDJDAwNzgoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjM4OiAKLQlsZGlsIEwnTEMkMDA3OSwlcjI2Ci0JbGRvIFInTEMkMDA3OSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyMzk6IAotCWxkaWwgTCdMQyQwMDgwLCVyMjYKLQlsZG8gUidMQyQwMDgwKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0MDogCi0JbGRpbCBMJ0xDJDAwODEsJXIyNgotCWxkbyBSJ0xDJDAwODEoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQxOiAKLQlsZGlsIEwnTEMkMDA4MiwlcjI2Ci0JbGRvIFInTEMkMDA4MiglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDI6IAotCWxkaWwgTCdMQyQwMDgzLCVyMjYKLQlsZG8gUidMQyQwMDgzKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0MzogCi0JbGRpbCBMJ0xDJDAwODQsJXIyNgotCWxkbyBSJ0xDJDAwODQoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQ0OiAKLQlsZGlsIEwnTEMkMDA4NSwlcjI2Ci0JbGRvIFInTEMkMDA4NSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDU6IAotCWxkaWwgTCdMQyQwMDg2LCVyMjYKLQlsZG8gUidMQyQwMDg2KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0NjogCi0JbGRpbCBMJ0xDJDAwODcsJXIyNgotCWxkbyBSJ0xDJDAwODcoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQ3OiAKLQlsZGlsIEwnTEMkMDA4OCwlcjI2Ci0JbGRvIFInTEMkMDA4OCglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDg6IAotCWxkaWwgTCdMQyQwMDg5LCVyMjYKLQlsZG8gUidMQyQwMDg5KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0OTogCi0JbGRpbCBMJ0xDJDAwOTAsJXIyNgotCWxkbyBSJ0xDJDAwOTAoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjUwOiAKLQlsZGlsIEwnTEMkMDA5MSwlcjI2Ci0JbGRvIFInTEMkMDA5MSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNTE6IAotCWxkaWwgTCdMQyQwMDkyLCVyMjYKLQlsZG8gUidMQyQwMDkyKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDIzMTogCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDkzLCVyMjUKLQlsZG8gUidMQyQwMDkzKCVyMjUpLCVyMjUKLQlsZHcgOCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwOTQsJXIyNQotCWxkbyBSJ0xDJDAwOTQoJXIyNSksJXIyNQotCWxkdyAxMiglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwOTUsJXIyNQotCWxkbyBSJ0xDJDAwOTUoJXIyNSksJXIyNQotCWxkdyAxNiglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTYoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDI1MywlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkbyAyKCVyMjEpLCVyMjAKLQlsZHcgMTYoJXIxOSksJXIyNgotCWNvcHkgJXIyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWN1cnNpdmVfZHVtcF90eXBlLCVyMgotCW5vcAotTCQwMjUzOiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDk2LCVyMjUKLQlsZG8gUidMQyQwMDk2KCVyMjUpLCVyMjUKLQlsZHcgMjAoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDk3LCVyMjUKLQlsZG8gUidMQyQwMDk3KCVyMjUpLCVyMjUKLQlsZHcgMjQoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDk4LCVyMjUKLQlsZG8gUidMQyQwMDk4KCVyMjUpLCVyMjUKLQlsZHcgMjgoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGRoIDMyKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwOTksJXIyNQotCWxkbyBSJ0xDJDAwOTkoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzIoJXIxOSksJXIyMAotCWV4dHJ1ICVyMjAsMzEsMSwlcjE5Ci0JZXh0cnMgJXIxOSwzMSwxNiwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjU0LCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMTAwLCVyMjYKLQlsZG8gUidMQyQwMTAwKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi1MJDAyNTQ6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzIoJXIxOSksJXIyMAotCWxkbyAyKCVyMCksJXIyMQotCWFuZCAlcjIwLCVyMjEsJXIxOQotCWV4dHJzICVyMTksMzEsMTYsJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDI1NSwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDEwMSwlcjI2Ci0JbGRvIFInTEMkMDEwMSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwdXRzX2ZpbHRlcmVkLCVyMgotCW5vcAotTCQwMjU1OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRoIDMyKCVyMTkpLCVyMjAKLQlsZG8gNCglcjApLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMTkKLQlleHRycyAlcjE5LDMxLDE2LCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAyNTYsJXIwCi0Jbm9wCi0JbGRpbCBMJ0xDJDAxMDIsJXIyNgotCWxkbyBSJ0xDJDAxMDIoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDI1NjogCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGRoIDM0KCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMjAKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjMKLQlhZGQgJXIyMywlcjIxLCVyMjIKLQlsZHcgMCglcjIyKSwlcjIxCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMTAzLCVyMjUKLQlsZG8gUidMQyQwMTAzKCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCWxkdyAzNiglcjIxKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCXN0dyAlcjAsOCglcjQpCi1MJDAyNTc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzQoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsMTYsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWNvbWNsciw8ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAyNTgsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyAyKCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDgoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDI3LDI4LCVyMjIKLQlsZHcgMzYoJXIyMCksJXIyMQotCWFkZCAlcjIyLCVyMjEsJXIyMAotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMwotCWFkZCAlcjIzLCVyMjEsJXIyMgotCWxkdyAwKCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjcsMjgsJXIyMwotCWxkdyAzNiglcjIxKSwlcjIyCi0JYWRkICVyMjMsJXIyMiwlcjIxCi0JbGR3IDQoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01MiglcjMwKQotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMwotCWFkZCAlcjIzLCVyMjEsJXIyMgotCWxkdyAwKCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjcsMjgsJXIyMwotCWxkdyAzNiglcjIxKSwlcjIyCi0JYWRkICVyMjMsJXIyMiwlcjIxCi0JbGR3IDgoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01NiglcjMwKQotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMwotCWFkZCAlcjIzLCVyMjEsJXIyMgotCWxkdyAwKCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjcsMjgsJXIyMwotCWxkdyAzNiglcjIxKSwlcjIyCi0JYWRkICVyMjMsJXIyMiwlcjIxCi0JbGR3IDEyKCVyMjEpLCVyMjIKLQlzdHcgJXIyMiwtNjAoJXIzMCkKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjMKLQlhZGQgJXIyMywlcjIxLCVyMjIKLQlsZHcgMCglcjIyKSwlcjIxCi0JbGR3IDgoJXI0KSwlcjIyCi0JemRlcCAlcjIyLDI3LDI4LCVyMjMKLQlsZHcgMzYoJXIyMSksJXIyMgotCWFkZCAlcjIzLCVyMjIsJXIyMQotCWxkdyAxMiglcjIxKSwlcjIyCi0Jc3R3ICVyMjIsLTY0KCVyMzApCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIzCi0JYWRkICVyMjMsJXIyMSwlcjIyCi0JbGR3IDAoJXIyMiksJXIyMQotCWxkdyA4KCVyNCksJXIyMgotCXpkZXAgJXIyMiwyNywyOCwlcjIzCi0JbGR3IDM2KCVyMjEpLCVyMjIKLQlhZGQgJXIyMywlcjIyLCVyMjEKLQlsZHcgMTIoJXIyMSksJXIyMgotCWNvbWljbHIsPSAwLCVyMjIsJXIwCi0JYmwgTCQwMjYwLCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMDcxLCVyMjEKLQlsZG8gUidMQyQwMDcxKCVyMjEpLCVyMjEKLQlzdHcgJXIyMSwtNjQoJXIzMCkKLUwkMDI2MDogCi0JY29weSAlcjE5LCVyMjYKLQlsZGlsIEwnTEMkMDEwNCwlcjI1Ci0JbGRvIFInTEMkMDEwNCglcjI1KSwlcjI1Ci0JbGR3IDgoJXI0KSwlcjI0Ci0JbGR3IDAoJXIyMCksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI3LDI4LCVyMjEKLQlsZHcgMzYoJXIxOSksJXIyMAotCWFkZCAlcjIxLCVyMjAsJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAyNjEsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCXpkZXAgJXIyMCwyNywyOCwlcjIxCi0JbGR3IDM2KCVyMTkpLCVyMjAKLQlhZGQgJXIyMSwlcjIwLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGRvIDQoJXIyMSksJXIyMAotCWxkdyA4KCVyMTkpLCVyMjYKLQljb3B5ICVyMjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVjdXJzaXZlX2R1bXBfdHlwZSwlcjIKLQlub3AKLUwkMDI2MTogCi1MJDAyNTk6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlibCxuIEwkMDI1NywlcjAKLUwkMDI1ODogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDEwNSwlcjI1Ci0JbGRvIFInTEMkMDEwNSglcjI1KSwlcjI1Ci0JbGR3IDQwKCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjYyLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGRvIDIoJXIyMSksJXIyMAotCWxkdyA0MCglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsJXIyCi0Jbm9wCi1MJDAyNjI6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAxMDYsJXIyNQotCWxkbyBSJ0xDJDAxMDYoJXIyNSksJXIyNQotCWxkdyA0NCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JY29taWNsciw8PiA2LCVyMTksJXIwCi0JYmwgTCQwMjY1LCVyMAotCW5vcAotCWNvbWljbHIsPj0gNiwlcjE5LCVyMAotCWJsIEwkMDI3MCwlcjAKLQlub3AKLQljb21pY2xyLDw+IDMsJXIxOSwlcjAKLQlibCBMJDAyNjYsJXIwCi0Jbm9wCi0JYmwsbiBMJDAyNjcsJXIwCi1MJDAyNzA6IAotCWNvbWljbHIsPD4gMTUsJXIxOSwlcjAKLQlibCBMJDAyNjQsJXIwCi0Jbm9wCi0JYmwsbiBMJDAyNjcsJXIwCi1MJDAyNjQ6IAotTCQwMjY1OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMTA3LCVyMjUKLQlsZG8gUidMQyQwMTA3KCVyMjUpLCVyMjUKLQlsZHcgNDgoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDQ4KCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBwcmludF9hcmdfdHlwZXMsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyNjMsJXIwCi1MJDAyNjY6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAxMDgsJXIyNQotCWxkbyBSJ0xDJDAxMDgoJXIyNSksJXIyNQotCWxkdyA0OCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBwcmludF9jcGx1c19zdHVmZiwlcjIKLQlub3AKLQlibCxuIEwkMDI2MywlcjAKLUwkMDI2NzogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDEwOSwlcjI1Ci0JbGRvIFInTEMkMDEwOSglcjI1KSwlcjI1Ci0JbGR3IDQ4KCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjY4LCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMTEwLCVyMjYKLQlsZG8gUidMQyQwMTEwKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDI2ODogCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjYzLCVyMAotTCQwMjYzOiAKLUwkMDIyOTogCi0JbGR3IDE2KCVyNCksJXI4Ci0JbGR3IDIwKCVyNCksJXI3Ci0JbGR3IDI0KCVyNCksJXI2Ci0JbGR3IDI4KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICRCU1MkCi0KLWNwbHVzX3N0cnVjdF9kZWZhdWx0OiAuY29tbSAyNAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2dsb2JhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9nbG9iYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwYzRhNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2dsb2JhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQkuSU1QT1JUIGZvbyxkYXRhCi0KLQkuYWxpZ24gNAotOyBPZmZpY2lhbCBnYXMgY29kZSB3aWxsIG5vdCBhY2NlcHQgc3ltLSRnbG9iYWwkLgotCWFkZGlsIEwlZm9vLSRnbG9iYWwkLCVyMjcKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9sYWJlbGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9sYWJlbGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjM2YTcxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbGFiZWxidWcucworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFCSRURVhUJCwgU09SVD04Ci0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEEgY29tbWVudC4gIFRoaXMgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyBhIGxhYmVsLCBidXQgYm90aCBvZiB0aGUKLTsgZm9sbG93aW5nIHN0YXRlbWVudHMgc2hvdWxkLgotbGFiZWxfd2l0aG91dF9jb2xvbgotbGFiZWxfd2l0aF9jb2xvbjoKLQotOyBBIHByb2JsZW0gdGVnZSBmb3VuZC4uLgotOyBJbnB1dCBzY3J1YmJpbmcgaW4gZ2FzIG1ha2VzIGxpZmUgYSByZWFsIG5pZ2h0bWFyZSBmb3IgYXNzZW1ibGVycwotOyBpbiB3aGljaCB0aGUgKnBvc2l0aW9uKiB3aXRoaW4gYSBsaW5lIGRldGVybWluZXMgaG93IHRvIGludGVycHJldAotOyBhIHN0cmVhbSBhIGNoYXJhY3RlcnMuICBUaGVzZSB0ZXN0IG9uZSBwYXJ0aWN1bGFyIGNhc2Ugd2hlcmUgZ2FzCi07IGhhZCB0aGUgdGVuZGVuY3kgdG8gZGVsZXRlIHRoZSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlIG9wY29kZSBhbmQKLTsgb3BlcmFuZHMgaWYgYSBsYWJlbCB3aXRob3V0IGEgY29sb24gYmVnYW4gYSBsaW5lLCBhbmQgdGhlIG9wZXJhbmRzCi07IHN0YXJ0ZWQgd2l0aCBhIG5vbi1udW1lcmljIGNoYXJhY3Rlci4KLUwkMQlhZGQgJXIyLCVyMiwlcjIKLUwkMjoJYWRkICVyMiwlcjIsJXIyCi1MJDMKLQlhZGQgJXIyLCVyMiwlcjIKLQotTCQ0CWFkZCAlcjIsJXIyLCVyMgotTCQ1OglhZGQgJXIyLCVyMiwlcjIKLUwkNgotCWFkZCAlcjIsJXIyLCVyMgotCi07IEFuIGluc3RydWN0aW9uIG9yIHBzZXVkby1vcCBtYXkgYmVnaW4gYW55d2hlcmUgYWZ0ZXIgY29sdW1uIDAuCi0gYixuIGxhYmVsX3dpdGhvdXRfY29sb24KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbGluZXNlcGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9saW5lc2VwYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTljMTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9saW5lc2VwYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQotZm9vOgotCS5XT1JEIDAgIS5JTVBPUlQgJGJhciQsREFUQQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xzZWxidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbHNlbGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWNkOTk3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbHNlbGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEluIGdhcy0xLjM2IHRoZSBsZGlsIGluc3RydWN0aW9uIHVzaW5nIHBhcmVudGhlc2lzIGdlbmVyYXRlZAotOyBnYXJiYWdlIGJpdHMgd2hpbGUgdGhlIG9uZSB3aXRob3V0IHBhcmVucyB3b3JrZWQgZmluZS4KLQlsZGlsIEwlKDB4MDAwNDAwMDAgfCAweDAwMDAwMDA4IHwgMHgwMDAwMDAwMiksJXIyMQotCWxkbyBMJSgweDAwMDQwMDAwIHwgMHgwMDAwMDAwOCB8IDB4MDAwMDAwMDIpICglcjIxKSwlcjIxCi0JbGRpbCBMJTB4MDAwNDAwMDAgfCAweDAwMDAwMDA4IHwgMHgwMDAwMDAwMiwlcjIxCi0JbGRvIEwlMHgwMDA0MDAwMCB8IDB4MDAwMDAwMDggfCAweDAwMDAwMDAyICglcjIxKSwlcjIxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvbm9zdWJzcGFjZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ub3N1YnNwYWNlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MDQ2MDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ub3N1YnNwYWNlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0JLlNQQUNFICRURVhUJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIG1wbl9hZGRfbgotCS5FWFBPUlQgbXBuX2FkZF9uLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IsUlROVkFMPUdSCi1tcG5fYWRkX246Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MCxOT19DQUxMUwotCS5FTlRSWQotCi0JYWRkCSVyMCwlcjAsJXIwCQk7IHJlc2V0IGN5Ci1Mb29wOgotCWxkd3MsbWEJIDQoMCwlcjI1KSwlcjIwCi0JbGR3cyxtYQkgNCgwLCVyMjQpLCVyMTkKLQotCWFkZGMJICVyMTksJXIyMCwlcjE5Ci0JYWRkaWIsPD4gLTEsJXIyMyxMb29wCi0Jc3R3cyxtYQkgJXIxOSw0KDAsJXIyNikKLQotCWJ2CTAoMikKLQkgYWRkYwklcjAsJXIwLCVyMjgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvcGFyc2UuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wYXJzZS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNGMyYTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wYXJzZS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoCi0jIGFuZCBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19zdHJpbmdfdGVzdHMge30gewotICAgIHNldCB0ZXN0bmFtZSAic3RyaW5nZXIuczogVGVzdCBlbWJlZGRlZCBxdW90ZXMgYW5kIG9jdGFsIGVzY2FwZXMgaW4gc3RyaW5ncyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInN0cmluZ2VyLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMjM2OTZFNjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAgICAgIDZDNzU2NDY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgICAgICA2QjJFNjQ2NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rICAgICAgNjYyMjBBMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA5MzA3ODMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgICAgICAzMjMzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2xzZWxfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsc2VsYnVncy5zOiBsc2VsYnVnIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibHNlbGJ1Zy5zIiAiLWFsIgotCi0gICAgIyBNYWtlIHN1cmUgd2UgY29ycmVjdGx5IGhhbmRsZSBmaWVsZCBzZWxlY3RvcnMuIAotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyMkEwNDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMzZCNTAxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDIyQTA0MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAzNkI1MDEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb192YWxpZF9hbGlnbl90ZXN0cyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhbGlnbjEuczogdmFsaWQgYWxpZ25tZW50IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYWxpZ24xLnMiICItYWwiCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBjb3JyZWN0bHkgaGFuZGxlIGZpZWxkIHNlbGVjdG9ycy4gCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4MDAwMjQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwODAwMDI0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDEwMDAgMDgwMDAyNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwXFteXG5cXSpCTE9DS1xbXlxuXF0qMTAyNFxbXlxuXF0qXG4iCi0JCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDA0MDBcW15cblxdKkJMT0NLXFteXG5cXSoxMDI0XFteXG5cXSpcbiIKLQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDgwMFxbXlxuXF0qQkxPQ0tcW15cblxdKjRcW15cblxdKlxuIgotCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwODA0XFteXG5cXSpBTElHTlxbXlxuXF0qOFxbXlxuXF0qXG4iCi0JCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDA4MDhcW15cblxdKkJMT0NLXFteXG5cXSozMFxbXlxuXF0qXG4iCi0JCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDA4MjZcW15cblxdKkFMSUdOXFteXG5cXSo0XFteXG5cXSpcbiIKLQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDgyOFxbXlxuXF0qQkxPQ0tcW15cblxdKjRcW15cblxdKlxuIgotCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1pZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgICAjIEdBUy0yLjAgZG9lcyBub3QgYWx3YXlzIHBhcnNlICEgYXMgYSBsaW5lIHNlcGFyYXRvciB3aGVuIGl0IHNob3VsZC4KLSAgICBzZXR1cF94ZmFpbCBocHBhKi0qLSoKLSAgICBnYXNfdGVzdCAibGluZXNlcGJ1Zy5zIiAiIiAiIiAibGluZSBzZXBhcmF0b3IgYnVnIgotCi0gICAgIyBNYWtlIHN1cmUgR0FTIGFjY2VwdHMgc3ludGF4IGZvciBhY2Nlc3Npbmcgc3RhdGljIGRhdGEuCi0gICAgZ2FzX3Rlc3QgImdsb2JhbC5zIiAiIiAiIiAiY2hlY2sgZm9yIHN5bS1cJGdsb2JhbFwkIGFjY2VwdGFuY2UiCi0KLSAgICAjIEdBUy0yLjAgKGFuZCAxLjM2IGZvciB0aGF0IG1hdHRlcikgY2FuIG5vdCBoYW5kbGUgYSAucHJvYyB3aGljaAotICAgICMgaGFzIG5vIGxhYmVsIGJlZm9yZSBpdC4KLSAgICBnYXNfdGVzdCAicHJvY2J1Zy5zIiAiIiAiIiAiTGFiZWwgZm9sbG93aW5nIC5wcm9jIgotCi0gICAgIyBPbmUgaXMgcmVxdWlyZWQgdG8gZXhwbGljaXRseSBJTVBPUlQgYW55IG5vbi1sb2NhbCBzeW1ib2wgdXNlZAotICAgICMgaW4gYW4gYXNzZW1ibHkgZmlsZS4gIE1ha2Ugc3VyZSB3ZSBnaXZlIGFuIGVycm9yIGlmIHdlIHVzZQotICAgICMgYW4gdW5kZWZpbmVkIHN5bWJvbC4KLSAgICBzZXR1cF94ZmFpbCBocHBhKi0qLSoKLSAgICBnYXNfdGVzdF9lcnJvciAidW5kZWZidWcucyIgIiIgIkNoZWNrIGZvciBlcnJvciB3aGVuIHVzaW5nIHVuZGVmaW5lZCBzeW1ib2wiCi0KLSAgICAjIFRoaXMgZmlsZSBoYXMgY29kZSBhbmQgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgYmVmb3JlIHN3aXRjaGluZyBpbnRvIGFueQotICAgICMgc3BhY2Uvc3Vic3BhY2UgcGFpci4gIFRoaXMgc2hvdWxkIHJlcG9ydCBhbiBlcnJvciBmb3IgU09NIChpdCBpcyBub3QKLSAgICAjIGFuIGVycm9yIGZvciBFTEYuICBUaGUgZmlsZSBhbHNvIGhhcyBtaXNtYXRjaGVkIGVudHJ5L2V4aXQgYW5kCi0gICAgIyBwcm9jL3Byb2NlbmQgcGFpcnMgd2hpY2ggYXJlIGVycm9ycyBmb3IgYm90aCBTT00gYW5kIEVMRi4KLSAgICBnYXNfdGVzdF9lcnJvciAibm9zdWJzcGFjZS5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yKHMpIGluIGlucHV0IGZpbGUgIgotCi0gICAgIyBUaGlzIGZpbGUgc2hvdWxkIHJldHVybiBlcnJvcnMgZm9yIGJvdGggdGhlIEVOVFJZX0dSIGFuZCBFTlRSWV9GUgotICAgICMgZGlyZWN0aXZlcyAodGhleSBhcmUgb3V0LW9mLXJhbmdlKQotICAgIGdhc190ZXN0X2Vycm9yICJlbnRyeWJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGVudHJ5X2dyIGFuZCBlbnRyeV9mciIKLQotICAgICMgTWFrZSBzdXJlIGVtYmVkZGVkIHF1b3RlcyBhbmQgb2N0YWwgZXNjYXBlcyBpbiBzdHJpbmdzIHdvcmsKLSAgICBkb19zdHJpbmdfdGVzdHMKLQotICAgICMgTWFrZSBzdXJlIHdlIGRvIG5vdCBkaWUgb24gYSAudmVyc2lvbiBkaXJlY3RpdmUKLSAgICBnYXNfdGVzdCAidmVyc2lvbmJ1Zy5zIiAiIiAiIiAiLnZlcnNpb24gZGlyZWN0aXZlIgotCi0gICAgIyBNYWtlIHN1cmUgd2UgZ2l2ZSBhbiBlcnJvciBvbiBhIGJvZ3VzIC5zcGFjZSBkaXJlY3RpdmUuCi0gICAgIyByZWNlbnQgdmVyc2lvbiBvZiBnYXMyIHdlbnQgaW50byBpbmZpbml0ZSBsb29wcyBwcmludGluZwotICAgICMgZXJyb3JzIG9uIHRoaXMgdGVzdC4KLSAgICBnYXNfdGVzdF9lcnJvciAic3BhY2VidWcucyIgIiIgIkNoZWNrIGZvciBlcnJvciBvbiBib2d1cyAuc3BhY2UgZGlyZWN0aXZlIgotCi0gICAgIyBHQVMgc2hvdWxkIGdpdmUgYW4gZXJyb3IgZm9yIHRoaXMgdGVzdC4KLSAgICBnYXNfdGVzdF9lcnJvciAiY2FsbGRhdGFidWcucyIgIiIgIkNoZWNrIGZvciBpbnZhbGlkIGFndW1lbnRzIG9uIC5jYWxsIgotCi0gICAgIyBPbGQgdmVyc2lvbnMgb2YgZ2FzIGluY29ycmVjdGx5IGdhdmUgZXJyb3JzIG9uIHNvbWUgdmFsaWQgLkVYUE9SVCBsaW5lcwotICAgIGdhc190ZXN0ICJleHBvcnRidWcucyIgIiIgIiIgInN5bnRheCBjaGVjayBmb3IgYW4gb2xkIC5FWFBPUlQgYnVnIgotCi0gICAgIyBPbGQgdmVyc2lvbnMgb2YgZ2FzIGNob2tlZCBvbiB0aGlzIGZpbGUgZm9yIHNvbWUgcmVhc29uCi0gICAgZ2FzX3Rlc3QgImZpeHVwN2J1Zy5zIiAiIiAiIiAiY2hlY2sgZm9yIG9sZCBcImZpeHVwN1wiIGdhcyBidWciCi0KLSAgICAjIFRlc3QgYW4gTCUgc2VsZWN0b3IgcGFyc2luZyBidWcgd2hpY2ggZXhpc3RlZCBpbiBnYXMtMS4zNiAgIAotICAgIGRvX2xzZWxfdGVzdAotCi0gICAgIyBGaXJzdCBjaGVjayBob3cgc29tZSB2YWxpZCBhbGlnbm1lbnRzIGFyZSBoYW5kbGVkLgotICAgIGRvX3ZhbGlkX2FsaWduX3Rlc3RzCi0KLSAgICAjIE5vdyBjaGVjayB0byBtYWtlIHN1cmUgYW4gaW52YWxpZCBhcmd1bWVudCBpcyBmbGFnZ2VkIGFzIGFuIGVycm9yLgotICAgIGdhc190ZXN0X2Vycm9yICJhbGlnbjIucyIgIiIgIkNoZWNrIGZvciBlcnJvciBvbiBib2d1cyBhcmd1bWVudCB0byAuYWxpZ24iCi0KLSAgICAjIEdBUyBjYW4ndCBoYW5kbGUgdXBwZXIgYm91bmQgZm9yIGEgUEEgLmJsb2NrW3pdIGRpcmVjdGl2ZQotICAgIHNldHVwX3hmYWlsIGhwcGEqLSotKgotICAgIGdhc190ZXN0ICJibG9jazEucyIgIiIgIiIgIkNoZWNrIG1pbi9tYXggdmFsdWVzIGZvciAuYmxvY2siCi0KLSAgICAjIE5vdyBjaGVjayBmb3IgYW4gaW52YWxpZCBhcmd1bWVudAotICAgIGdhc190ZXN0X2Vycm9yICJibG9jazIucyIgIiIgIkNoZWNrIGZvciBlcnJvciBvbiBib2d1cyBhcmd1bWVudCB0byAuYmxvY2siCi0KLSAgICAjIEdBUy0xLjM2IGNob2tlZCBvbiB0aGlzIGZpbGUuCi0gICAgIyBGSVhNRS4gIFNob3VsZCBjaGVjayByZWxvY2F0aW9ucyBtYWRlIGZvciB0aGlzIHRlc3QhCi0gICAgZ2FzX3Rlc3QgImV4cHJidWcucyIgIiIgIiIgIkNoZWNrIGZvciBzeW0xLXN5bTIgYWNjZXB0YW5jZSIKLQotICAgICMgQmFkIHRoaW5ncyBoYXBwZW4gaW4gdGhlIFBBIEVMRiBiYWNrZW5kIChvdGhlcnMgdG9vPykgaWYgYSBub24tZGVmYXVsdAotICAgICMgc2VjdGlvbiBpcyBjcmVhdGVkLi4uCi0gICAgc2V0dXBfeGZhaWwgaHBwYSotKi0qZWxmKgotICAgIGdhc190ZXN0ICJzc2J1Zy5zIiAiIiAiIiAiQ2hlY2sgZm9yIGFjY2VwdGFuY2Ugb2Ygbm9uLWRlZmF1bHQgc3Vic3BhY2VzIgotCi0gICAgIyBUbyBiZSBjb21wYXRhYmxlIHdpdGggY2VydGFpbiAiZmVhdHVyZXMiIG9mIHRoZSBIUCBjb21waWxlcgotICAgICMgbm9uLWV4aXN0YW50IHJlZ2lzdGVycyBzaG91bGQgZGVmYXVsdCB0byAlcjAuCi0gICAgZ2FzX3Rlc3QgImRlZmJ1Zy5zIiAiIiAiIiAiTWlzc2luZyByZWdpc3RlciBzaG91bGQgZGVmYXVsdCB0byAlJXIwIgotCi0gICAgIyBNYWtlIHN1cmUgR0FTIHVuZGVyc3RhbmRzIGEgcmVhc29uYWJsZSBzZXQgb2Ygc3RhbmRhcmQgcHJlZGVmaW5lZAotICAgICMgcmVnaXN0ZXJzLiAgZWcgJXJwLCAlZHAsICVzcCwgZXRjLgotICAgIGdhc190ZXN0ICJzdGRyZWcucyIgIiIgIiIgIlRlc3Qgc3RhbmRhcmQgcHJlZGVmaW5lZCByZWdpc3RlcnMiCi0KLSAgICAjIE1ha2Ugc3VyZSBHQVMgd2lsbCBhY2NlcHQgYSBsYWJlbCB3aXRob3V0IGEgY29sb24uCi0gICAgZ2FzX3Rlc3QgImxhYmVsYnVnLnMiICIiICIiICJUZXN0IGxhYmVsIHdpdGhvdXQgY29sb24iCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBncm9rICMgbGluZSBkaXJlY3RpdmVzLgotICAgIGdhc190ZXN0ICJhcHBidWcucyIgIiIgIiIgIlRlc3QgYWNjZXB0YW5jZSBvZiAjbGluZSBkaXJlY3RpdmVzIgotCi0gICAgIyBNYWtlIHN1cmUgd2UgZ2l2ZSBlcnJvcnMgaWYgYSBmbG9hdGluZyBwb2ludCBmb3JtYXQgaXMgc3BlY2lmaWVkCi0gICAgIyBmb3IgYW4geG1weXUgaW5zdHJ1Y3Rpb24gKGludGVnZXIgbXVsdGlwbGUpCi0gICAgZ2FzX3Rlc3RfZXJyb3IgInhtcHl1YnVnLnMiICIiICJDaGVjayBmb3IgZXJyb3Igb24gYm9ndXMgYXJndW1lbnQgdG8geG1weXUiCi0KLSAgICAjIE1ha2Ugc3VyZSBnYXMgaGFuZGxlcyB2YXJpb3VzIGtpbmRzIG9mIC5yZWcgcHNldWRvLW9wcwotICAgIGdhc190ZXN0ICJyZWdwb3BidWcucyIgIiIgIiIgIlRlc3QgZm9yIGJ1Z3MgaW4gLnJlZyBwc2V1ZG8tb3AiCi0KLSAgICAjIENoZWNrIHNvbWUgYnVncyB0aGF0IGhhdmUgYXBwZWFyZWQgaW4gcGFyc2luZyAuY2FsbGluZm8gZGlyZWN0aXZlcwotICAgIGdhc190ZXN0ICJjYWxsaW5mb2J1Zy5zIiAiIiAiIiAiVGVzdCBmb3IgYnVncyBpbiAuY2FsbGluZm8gZGlyZWN0aXZlIgotCi0gICAgIyBDaGVjayBmb3IgYm9ndXMgcmVnaXN0ZXJzIGluIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZC9mbXB5c3ViCi0gICAgIyBpbnN0cnVjdGlvbnMKLSAgICBnYXNfdGVzdF9lcnJvciAiYmFkZm1weWFkZC5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGJhZCBmbXB5YWRkIGluc24iCi19Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvcHJvY2J1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wcm9jYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZTUwNTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wcm9jYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0JLnNwYWNlICRURVhUJAotCS5zdWJzcGEgJENPREUkCi0JLmFsaWduIDQKLQkuZXhwb3J0IGRpdnUsZW50cnkKLQkucHJvYwotCS5jYWxsaW5mbwotZGl2dToJc3R3cyxtYQkJJXI0LDQoJXI1KQkJOyBzYXZlIHJlZ2lzdGVycyBvbiBzdGFjawotCS5wcm9jZW5kCi0KLQkuZXhwb3J0IGRpdnUyLGVudHJ5Ci0JLnByb2MKLQkuY2FsbGluZm8KLQkuZW50cnkKLWRpdnUyOglzdHdzLG1hCQklcjQsNCglcjUpCQk7IHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCi0JLmV4aXQKLQkucHJvY2VuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9yZWdwb3BidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvcmVncG9wYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZGIyNjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9yZWdwb3BidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLXIwCS5yZWcJJXIwCi1zaGlmdAkucmVnCSVzYXIKLWZwcmVnMTAJLnJlZwklZnIxMAotc2hpZnQyCS5yZWcJc2hpZnQKLQotOyBNYWtlIHN1cmUgd2UgZGlkbid0IGJvdGNoIC5lcXUuLi4KLXlhYmJhCS5lcXUJcjAgKyBzaGlmdApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zcGFjZWJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zcGFjZWJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODNiNDAxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3BhY2VidWcucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotc3RhcnQ6CS5sb25nIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcKLQkuc3BhY2UgMHgyMCAtICguIC0gc3RhcnQpCi1mb286CS5sb25nIDQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NzYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NzYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NjBlMGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zc2J1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1VCU1BBICRTSE9SVEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MAotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3RkcmVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3N0ZHJlZy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDI5NzhlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3RkcmVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuZXhwb3J0IGZvbwotZm9vOgotCS5wcm9jCi0JLmNhbGxpbmZvIG5vX2NhbGxzCi0JLmVudHJ5Ci0JbGRpIDE1LCVzcAotCWxkaSAxNSwlcnAKLQlsZGkgMTUsJWRwCi0JbGRpIDE1LCVyZXQwCi0JbGRpIDE1LCVyZXQxCi0JbGRpIDE1LCVhcmcwCi0JbGRpIDE1LCVhcmcxCi0JbGRpIDE1LCVhcmcyCi0JbGRpIDE1LCVhcmczCi0JLmV4aXQKLSAJLnByb2NlbmQgCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zdHJpbmdlci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zdHJpbmdlci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmM1ZTZkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3RyaW5nZXIucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkCi0KLQotOyBHQVMgdXNlZCB0byBtaXMtcGFyc2UgdGhlIGVtYmVkZGVkIHF1b3RlcwotCS5TVFJJTkcgIiNpbmNsdWRlIFwiYXdrLmRlZlwiXHgwYVx4MDAiCi0KLTsgT2N0YWwgZXNjYXBlcyB1c2VkIHRvIGNvbnN1bWUgPiAzIGNoYXJzIHdoaWNoIGxlZCB0byB0aGlzCi07IHN0cmluZyBiZWluZyBzY3Jld2VkIGluIGEgYmlnIHdheS4KLQkuU1RSSU5HICJcMDExMHgxMjMiCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS91bmRlZmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS91bmRlZmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWVkYTkyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvdW5kZWZidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCWJsIHNvbWV3aGVyZSwlcjIKLQlub3AKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS92ZXJzaW9uYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3ZlcnNpb25idWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZlZjFiNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3ZlcnNpb25idWcucworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuVkVSU0lPTiAiYWJjMTIzIgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3htcHl1YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3htcHl1YnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZTcyNzQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS94bXB5dWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IE5vIGZvcm1hdCBzZWxlY3RvciBmb3IgeG1weXUhCi0JeG1weXUsc2dsICVmcjQsJWZyNSwlZnI2Ci0JeG1weXUsZGJsICVmcjQsJWZyNSwlZnI2Ci0JeG1weXUscXVhZCAlZnI0LCVmcjUsJWZyNgotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYXBwbHlidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYXBwbHlidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhlZDZlOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2FwcGx5YnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkCi0KLQkuYWxpZ24gNAotdGFiX19fMgotCS53b3JkIEwkMDAwMgotCS53b3JkIEwkMDAwMwotCS53b3JkIEwkMDAwNAotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGV4ZWN1dGUsQ09ERQotCS5FWFBPUlQgZXhlY3V0ZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotZXhlY3V0ZQotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQlhZGRpbCBMJ2J1Zi0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFInYnVmLSRnbG9iYWwkKCVyMSksJXIyMAotCWxkaWwgTCdMJDAwMDIsJXIxOQotCW1vdmIsPD4gJXIyNiwlcjI2LEwkMDAwMgotCWxkbyBSJ0wkMDAwMiglcjE5KSwlcjIyCi0JY29weSAlcjAsJXIyMQotCWFkZGlsIEwndGFiX19fMi0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFIndGFiX19fMi0kZ2xvYmFsJCglcjEpLCVyMjMKLQlhZGRpbCBMJ29wdGFiLSRnbG9iYWwkLCVyMjcKLQlsZG8gUidvcHRhYi0kZ2xvYmFsJCglcjEpLCVyMjAKLUwkMDAwOQotCXNoMmFkZCAlcjIxLCVyMjMsJXIxOQotCWxkaCAyKCVyMTkpLCVyMTkKLQlsZG8gMSglcjIxKSwlcjIxCi0Jc3ViICVyMTksJXIyMiwlcjE5Ci0JY29taWIsPj0gMiwlcjIxLEwkMDAwOQotCXN0aHMsbWEgJXIxOSwyKCVyMjApCi0JYnYsbiAlcjAoJXIyKQotTCQwMDAyCi0JbGRpIDEyMCwlcjE5Ci0Jc3RicyxtYSAlcjE5LDEoJXIyMCkKLQlsZGhzLG1hIDIoJXIyNiksJXIxOQotCWFkZCAlcjIyLCVyMTksJXIxOQotCWJ2LG4gJXIwKCVyMTkpCi1MJDAwMDMKLQlsZGkgMTIxLCVyMTkKLQlzdGJzLG1hICVyMTksMSglcjIwKQotCWxkaHMsbWEgMiglcjI2KSwlcjE5Ci0JYWRkICVyMjIsJXIxOSwlcjE5Ci0JYnYsbiAlcjAoJXIxOSkKLUwkMDAwNAotCWxkaSAxMjIsJXIxOQotCXN0YiAlcjE5LDAoJXIyMCkKLQlidiAlcjAoJXIyKQotCXN0YnMsbWIgJXIwLDEoJXIyMCkKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBfX21haW4sQ09ERQotCS5JTVBPUlQgc3RyY21wLENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJAotCi0JLmFsaWduIDQKLUwkQzAwMDAKLQkuU1RSSU5HICJ4eXh5elx4MDAiCi0JLklNUE9SVCBhYm9ydCxDT0RFCi0JLklNUE9SVCBleGl0LENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBtYWluLENPREUKLQkuRVhQT1JUIG1haW4sRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLW1haW4KLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JLkNBTEwgCi0JYmwgX19tYWluLCVyMgotCWxkbyAxMjgoJXIzMCksJXIzMAotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZXhlY3V0ZSwlcjIKLQljb3B5ICVyMCwlcjI2Ci0JYWRkaWwgTCdvcHRhYi0kZ2xvYmFsJCwlcjI3Ci0JY29weSAlcjEsJXIxOQotCWxkbyBSJ29wdGFiLSRnbG9iYWwkKCVyMTkpLCVyMjEKLQlsZGggMiglcjIxKSwlcjIwCi0JbGRoIFInb3B0YWItJGdsb2JhbCQoJXIxOSksJXIxOQotCWFkZGlsIEwncC0kZ2xvYmFsJCwlcjI3Ci0JY29weSAlcjEsJXIyMgotCXN0aCAlcjIwLFIncC0kZ2xvYmFsJCglcjIyKQotCWxkbyBSJ3AtJGdsb2JhbCQoJXIyMiksJXIyNgotCXN0aCAlcjIwLDQoJXIyNikKLQlzdGggJXIxOSwyKCVyMjYpCi0JbGRoIDQoJXIyMSksJXIxOQotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZXhlY3V0ZSwlcjIKLQlzdGggJXIxOSw2KCVyMjYpCi0JYWRkaWwgTCdidWYtJGdsb2JhbCQsJXIyNwotCWNvcHkgJXIxLCVyMTkKLQlsZG8gUididWYtJGdsb2JhbCQoJXIxOSksJXIyNgotCWxkaWwgTCdMJEMwMDAwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIKLQlsZG8gUidMJEMwMDAwKCVyMjUpLCVyMjUKLQljb21pYiw9LG4gMCwlcjI4LEwkMDAxMQotCS5DQUxMIAotCWJsIGFib3J0LCVyMgotCW5vcAotTCQwMDExCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBleGl0LCVyMgotCWNvcHkgJXIwLCVyMjYKLQlub3AKLQkuRVhJVAotCS5QUk9DRU5ECi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJEJTUyQKLQotb3B0YWIJLmNvbW0gMTAKLWJ1ZgkuY29tbSAxMAotcAkuY29tbSAxMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MzA3NzQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5JTVBPUlQJJCRkeW5jYWxsLE1JTExJQ09ERSA7IENvZGUgZm9yIGR5bmFtaWMgZnVuY3Rpb24gY2FsbHMuCi0KLV9zaWd0cmFtcDoKLQlsZGlsCUwlJCRkeW5jYWxsLCVyMgk7ICAgd2hvc2UgYWRkcmVzcyBpcyBpbiByMjIuCi0JYmxlCVIlJCRkeW5jYWxsKCVzcjQsJXIyKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWcyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2JsZWJ1ZzIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3N2I1My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2JsZWJ1ZzIucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCi0gIAlsZGlsCUwlMHhjMDAwMTAwNCwlcjEKLSAgCWJsZQlSJTB4YzAwMDEwMDQoJXNyNywlcjEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2JsZWJ1ZzMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWU5YjNiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLmltcG9ydCB5YWJiYSxjb2RlCi0KLSAgCWJsZQlSJXlhYmJhKCVzcjQsJXIwKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9leGl0YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2V4aXRidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5OGUzNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2V4aXRidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGZvbyxDT0RFCi0JLkVYUE9SVCBmb28sRU5UUlksUFJJVl9MRVY9MwotZm9vOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9maXh1cGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9maXh1cGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTU4ZDAyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvZml4dXBidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5TVUJTUEEgJE1JTExJQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LFNPUlQ9OAotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQliLG4JJCRmb28KLQlub3AKLQlub3AKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRNSUxMSUNPREUkCi0kJGZvbzoKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvZnVuY3JlbG9jYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2Z1bmNyZWxvY2J1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmE0M2JjNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2Z1bmNyZWxvY2J1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGcsQ09ERQotCS5FWFBPUlQgZyxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLFJUTlZBTD1HUgotZwotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQLFNBVkVfU1AsRU5UUllfR1I9MwotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjMsJXIxCi0JY29weSAlcjMwLCVyMwotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjI2LC0zNiglcjMpCi0Jc3R3ICVyMjUsLTQwKCVyMykKLQlzdHcgJXIyNCwtNDQoJXIzKQotCWxkdyAtMzYoJXIzKSwlcjI2Ci0JbGR3IC00MCglcjMpLCVyMjUKLQlsZHcgLTQ0KCVyMyksJXIxOQotCWNvcHkgJXIxOSwlcjIyCi0JLkNBTEwJQVJHVzA9R1IKLQlibCAkJGR5bmNhbGwsJXIzMQotCWNvcHkgJXIzMSwlcjIKLQljb3B5ICVyMjgsJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsLG4gTCQwMDAyLCVyMAotCWxkdyAtMzYoJXIzKSwlcjI4Ci0JYmwsbiBMJDAwMDEsJXIwCi0JYmwsbiBMJDAwMDMsJXIwCi1MJDAwMDIKLQlsZHcgLTQwKCVyMyksJXIyOAotCWJsLG4gTCQwMDAxLCVyMAotTCQwMDAzCi1MJDAwMDEKLQlsZHcgLTIwKCVyMyksJXIyCi0JbGRvIDY0KCVyMyksJXIzMAotCWxkd20gLTY0KCVyMzApLCVyMwotCWJ2LG4gJXIwKCVyMikKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLWYyX19fNAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTY0LE5PX0NBTExTLFNBVkVfU1AsRU5UUllfR1I9MwotCS5FTlRSWQotCWNvcHkgJXIzLCVyMQotCWNvcHkgJXIzMCwlcjMKLQlzdHdtICVyMSw2NCglcjMwKQotCXN0dyAlcjI5LDgoJXIzKQotCXN0dyAlcjI2LC0zNiglcjMpCi0Jc3R3ICVyMjUsLTQwKCVyMykKLQlsZHcgLTM2KCVyMyksJXIxOQotCWxkdyAtNDAoJXIzKSwlcjIwCi0JY29tY2xyLD49ICVyMjAsJXIxOSwlcjE5Ci0JbGRpIDEsJXIxOQotCWNvcHkgJXIxOSwlcjI4Ci0JYmwsbiBMJDAwMDUsJXIwCi1MJDAwMDUKLQlsZG8gNjQoJXIzKSwlcjMwCi0JbGR3bSAtNjQoJXIzMCksJXIzCi0JYnYsbiAlcjAoJXIyKQotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGFib3J0LENPREUKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotCS5hbGlnbiA0Ci1MJFRSQU1QMDAwMAotCWxkdwkzNiglcjIyKSwlcjIxCi0JYmIsPj0sbgklcjIxLDMwLC4rMTYKLQlkZXBpCTAsMzEsMiwlcjIxCi0JbGR3CTQoJXIyMSksJXIxOQotCWxkdwkwKCVyMjEpLCVyMjEKLQlsZHNpZAkoJXIyMSksJXIxCi0JbXRzcAklcjEsJXNyMAotCWJlCTAoJXNyMCwlcjIxKQotCWxkdwk0MCglcjIyKSwlcjI5Ci0JLndvcmQJMAotCS53b3JkCTAKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBmLENPREUKLQkuRVhQT1JUIGYsRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLWYKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUCxTQVZFX1NQLEVOVFJZX0dSPTMKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXIzLCVyMQotCWNvcHkgJXIzMCwlcjMKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlsZG8gMTYoJXIzKSwlcjE5Ci0JYWRkaWwgTCdMJFRSQU1QMDAwMC0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFInTCRUUkFNUDAwMDAtJGdsb2JhbCQoJXIxKSwlcjIyCi0JbGRvIDQwKCVyMCksJXIyMAotCWxkd3MsbWEgNCglcjIyKSwlcjIxCi0JYWRkaWIsPj0gLTQsJXIyMCwuLTQKLQlzdHdzLG1hICVyMjEsNCglcjE5KQotCWxkaWwgTCdmMl9fXzQsJXIyMAotCWxkbyBSJ2YyX19fNCglcjIwKSwlcjE5Ci0Jc3R3ICVyMTksNTIoJXIzKQotCWxkbyA4KCVyMyksJXIxOQotCXN0dyAlcjE5LDU2KCVyMykKLQlsZG8gMTYoJXIzKSwlcjE5Ci0JbGRvIDQ4KCVyMyksJXIyMAotCWZkYyAlcjAoJXIxOSkKLQlmZGMgJXIwKCVyMjApCi0Jc3luYwotCWxkbyAzMiglcjE5KSwlcjIyCi0JbWZzcCAlc3IwLCVyMjEKLQlsZHNpZCAoJXIxOSksJXIyMAotCW10c3AgJXIyMCwlc3IwCi0JZmljICVyMCglc3IwLCVyMTkpCi0JZmljICVyMCglc3IwLCVyMjIpCi0Jc3luYwotCW10c3AgJXIyMSwlc3IwCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0JbGRvIDE2KCVyMyksJXIxOQotCWxkaSAxLCVyMjYKLQlsZGkgMiwlcjI1Ci0JY29weSAlcjE5LCVyMjQKLQkuQ0FMTCBBUkdXMD1OTyxBUkdXMT1OTyxBUkdXMj1OTyxBUkdXMz1OTwotCWJsIGcsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQljb21pY2xyLDw+IDIsJXIxOSwlcjAKLQlibCxuIEwkMDAwNiwlcjAKLQkuQ0FMTCBBUkdXMD1OTyxBUkdXMT1OTyxBUkdXMj1OTyxBUkdXMz1OTwotCWJsIGFib3J0LCVyMgotCW5vcAotTCQwMDA2Ci1MJDAwMDQKLQlsZHcgLTIwKCVyMyksJXIyCi0JbGRvIDY0KCVyMyksJXIzMAotCWxkd20gLTY0KCVyMzApLCVyMwotCWJ2LG4gJXIwKCVyMikKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBfX21haW4sQ09ERQotCS5JTVBPUlQgZXhpdCxDT0RFCi0JLmFsaWduIDQKLQkuRVhQT1JUIG1haW4sQ09ERQotCS5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotbWFpbgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQLFNBVkVfU1AsRU5UUllfR1I9MwotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjMsJXIxCi0JY29weSAlcjMwLCVyMwotCXN0d20gJXIxLDEyOCglcjMwKQotCS5DQUxMIEFSR1cwPU5PLEFSR1cxPU5PLEFSR1cyPU5PLEFSR1czPU5PCi0JYmwgX19tYWluLCVyMgotCW5vcAotCS5DQUxMIEFSR1cwPU5PLEFSR1cxPU5PLEFSR1cyPU5PLEFSR1czPU5PCi0JYmwgZiwlcjIKLQlub3AKLQljb3B5ICVyMCwlcjI2Ci0JLkNBTEwgQVJHVzA9Tk8sQVJHVzE9Tk8sQVJHVzI9Tk8sQVJHVzM9Tk8KLQlibCBleGl0LCVyMgotCW5vcAotTCQwMDA3Ci0JbGR3IC0yMCglcjMpLCVyMgotCWxkbyA2NCglcjMpLCVyMzAKLQlsZHdtIC02NCglcjMwKSwlcjMKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9sYWJlbG9wYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2xhYmVsb3BidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkYzQyMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2xhYmVsb3BidWcucworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLXM6Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXIzMCwxMiglcjQpCi0JbGRpbCBMJ0wkMDAwNywlcjE5Ci0JbGRvIFInTCQwMDA3KCVyMTkpLCVyMTkKLQljb21pYiw+PSAwLCVyMjYsTCQwMDAyCi0Jc3R3ICVyMTksOCglcjQpCi1MJDAwMDM6Ci1MJDAwMDI6Ci0JYiBMJDAwMDEKLQlsZG8gMSglcjApLCVyMjgKLUwkMDAwNzoKLQlsZGlsIEwnTCQwMDAyLCVyMTkKLQlsZG8gUidMJDAwMDIoJXIxOSksJXIxOQotCWNvbWIsPSAlcjI5LCVyMTksTCQwMDAyCi0JbGRvIC04KCVyNCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9sb25nY2FsbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9sb25nY2FsbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzM5OTZmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvbG9uZ2NhbGwucworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5JTVBPUlQgYmFyLENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBmb28sQ09ERQotCS5FWFBPUlQgZm9vLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1mb28KLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT02NCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQkuQ0FMTCAKLQlibCBiYXIsJXIyCi0JbGRvIDY0KCVyMzApLCVyMzAKLQkuYmxvY2t6IDI2MjE0NAotCWxkdyAtODQoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZG8gLTY0KCVyMzApLCVyMzAKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIGJhcixDT0RFCi0JLkVYUE9SVCBiYXIsRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLWJhcgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9waWNyZWxvYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9waWNyZWxvYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzlhNDRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcGljcmVsb2MucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotCS5TUEFDRQkkVEVYVCQsU09SVD04Ci0JLlNVQlNQQQkkQ09ERSQsUVVBRD0wLEFMSUdOPTQsQUNDRVNTPTB4MmMsQ09ERV9PTkxZLFNPUlQ9MjQKLQkuU1BBQ0UJJFBSSVZBVEUkLFNPUlQ9MTYKLQkuU1VCU1BBCSREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MHgxZixTT1JUPTE2Ci1ib2dvCi0JLkFMSUdOCTgKLQkuV09SRCAgYm9nbys0CTsgPSAweDQKLQkuU1RSSU5HCSJceDAwXHgwMFx4MDB7XHgwMFx4MDBceDAxXHhDOFx4MDBceDAwXHgwM1x4MTUiCi0JLlNQQUNFCSRQUklWQVRFJAotCS5TVUJTUEEJJERBVEEkCi0JLkVYUE9SVAlib2dvCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9wbGFiZWxidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcGxhYmVsYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMDViMzIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9wbGFiZWxidWcucworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5JTVBPUlQgYWJvcnQsQ09ERQotCS5FWFBPUlQgZixEQVRBCi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkCi0KLQkuYWxpZ24gNAotZjoKLQkud29yZCBQJWFib3J0Ci0JLndvcmQgUCVhYm9ydAotCS5JTVBPUlQgX19tYWluLENPREUKLQkuSU1QT1JUIHByaW50ZixDT0RFCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotTEMkMDAwMDoKLQkuU1RSSU5HICJmcm9iXHgwYVx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIG1haW4sQ09ERQotCS5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotbWFpbjoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JbGRvIDEyOCglcjMwKSwlcjMwCi0JLkNBTEwgCi0JYmwgX19tYWluLCVyMgotCW5vcAotCWxkaWwgTCdMQyQwMDAwLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50ZiwlcjIKLQlsZG8gUidMQyQwMDAwKCVyMjYpLCVyMjYKLQlsZHcgLTE0OCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkbyAtMTI4KCVyMzApLCVyMzAKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3Jfbm9fcmVsb2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcl9ub19yZWxvYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjZmMmQwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcl9ub19yZWxvYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotCS5DT1BZUklHSFQgIk1ldGFXYXJlIEluY29ycG9yYXRlZCwgMTk5MiIKLQkuVkVSU0lPTgkiaGMyLjZhIC1PMSB0My5jXG4iCi0KLQkuU1BBQ0UJJFBSSVZBVEUkLFNPUlQ9MTYKLQkuU1VCU1BBCSRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0weDFGLFNPUlQ9ODAsWkVSTwotCS5TVUJTUEEJJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0weDFGLFNPUlQ9MTYKLQotCS5TUEFDRQkkVEVYVCQsU09SVD04Ci0JLlNVQlNQQQkkQ09ERSQsUVVBRD0wLEFMSUdOPTQsQUNDRVNTPTQ0LENPREVfT05MWSxTT1JUPTI0Ci0KLQkuU1BBQ0UJJFBSSVZBVEUkCi0JLlNVQlNQQQkkREFUQSQKLQkuQUxJR04JOAotJEwwMERBVEEKLQkuQUxJR04JOAotCS5FWFBPUlQJcwotcwotCS5XT1JECTB4MAotCS5CTE9DS1oJNzg2NDI1Ci0JLkJMT0NLWgk3Ci0KLQkuU1BBQ0UJJFRFWFQkCi0JLlNVQlNQQQkkQ09ERSQKLUwkMDAxLjMKLWcJLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MCxOT19DQUxMUwotCS5FTlRSWQotCTtsZG8JMTIwKCVyMCksJXIyOCAtLT4gdG8gZGVsYXkgc2xvdAotCWJ2CSVyMCglcjIpCi0JLkVYSVQKLQlsZG8JMTIwKCVyMCksJXIyOAotCS5QUk9DRU5ECi0KLQotCS5TUEFDRQkkUFJJVkFURSQKLQkuU1VCU1BBCSREQVRBJAotCS5BTElHTgk0Ci0JLkVYUE9SVAlsCi1sCi0JLldPUkQJUCdnCi0JLklNUE9SVAljb21tb24sREFUQQk7IGNvbW1vbiBzZWN0aW9uLCBzaXplPTAKLQkuSU1QT1JUCSRnbG9iYWwkLERBVEEKLQkuRVhQT1JUCWcsRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLQkuRU5ECi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlZHVjZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mzc3NTJmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLlBBUkFNIGZvbyxSVE5WQUw9R1IKLWZvbzoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0wLE5PX0NBTExTCi0JLkVOVFJZCi0JYnYsbiAlcjAoJXIyKQotCS5FWElUCi0JLlBST0NFTkQKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci1MQyQwMDAwOgotCS53b3JkIFAlZm9vCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgYmFyLENPREUKLQkuRVhQT1JUIGJhcixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotYmFyOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0JbGRpbCBMJ0xDJDAwMDAsJXIxOQotCWxkdyBSJ0xDJDAwMDAoJXIxOSksJXIyNgotCXN0dyAlcjIsLTIwKCVyMzApCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmb28sJXIyCi0JbGRvIDEyOCglcjMwKSwlcjMwCi0JbGR3IC0xNDgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZG8gLTEyOCglcjMwKSwlcjMwCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlZHVjZTIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzZmEzNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlZHVjZTIucworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkCi0KLQkuYWxpZ24gOAotTCRQMDAwMAotCS53b3JkIDB4MTIzNDU2NzgKLQkud29yZCAweDAKLQotCS5hbGlnbiA4Ci1MJEMwMDAwCi0JLndvcmQgMHgzZmYwMDAwMAotCS53b3JkIDB4MAotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGcsRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9RlIKLWcKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0wLE5PX0NBTExTCi0JLkVOVFJZCi0Jc3R3ICVyMTksLTMyKCVyMzApCi0JbGR3IFQnTCRDMDAwMCglcjE5KSwlcjIwCi0JYnYgJXIwKCVyMikKLQlmbGRkcyAwKCVyMjApLCVmcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBhYm9ydCxDT0RFCi0JLklNUE9SVCBleGl0LENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJAotCi0JLmFsaWduIDgKLUwkQzAwMDEKLQkud29yZCAweDNmZjAwMDAwCi0JLndvcmQgMHgwCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotbWFpbgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQLEVOVFJZX0dSPTMKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWxkbyAxMjgoJXIzMCksJXIzMAotCXN0dyAlcjE5LC0zMiglcjMwKQotCXN0dyAlcjQsLTEyOCglcjMwKQotCi0JY29weSAlcjE5LCVyNAotCS5DQUxMIAotCWJsIGcsJXIyCi0JY29weSAlcjQsJXIxOQotCWNvcHkgJXI0LCVyMTkKLQlsZHcgVCdMJEMwMDAxKCVyMTkpLCVyMjAKLQlmbGRkcyAwKCVyMjApLCVmcjgKLQlmY21wLGRibCw9ICVmcjQsJWZyOAotCWZ0ZXN0Ci0JYWRkLHRyICVyMCwlcjAsJXIwCi0JYixuIEwkMDAwMwotCS5DQUxMIAotCWJsIGFib3J0LCVyMgotCW5vcAotTCQwMDAzCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBleGl0LCVyMgotCWxkaSAwLCVyMjYKLQlub3AKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlZHVjZTMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjcxZTc4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLkVYUE9SVCBibGFoLERBVEEKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotCS5hbGlnbiA4Ci1ibGFoCi0JOyAuZG91YmxlIDBlKzAwCi0JLndvcmQgMCA7ID0gMHgwCi0JLndvcmQgMCA7ID0gMHgwCi0JLkVYUE9SVCBmb28sREFUQQotCS5hbGlnbiA4Ci1mb28KLQk7IC5kb3VibGUgMGUrMDAKLQkud29yZCAwIDsgPSAweDAKLQkud29yZCAwIDsgPSAweDAKLQkuRVhQT1JUIHlhYmJhLERBVEEKLQkuYWxpZ24gNAoteWFiYmEKLQkud29yZCAxCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgYmFyLENPREUKLQkuRVhQT1JUIGJhcixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotYmFyCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9NjQsTk9fQ0FMTFMsU0FWRV9TUCxFTlRSWV9HUj0zCi0JLkVOVFJZCi0JY29weSAlcjMsJXIxCi0JY29weSAlcjMwLCVyMwotCXN0d20gJXIxLDY0KCVyMzApCi0JYWRkaWwgTCd5YWJiYS0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFIneWFiYmEtJGdsb2JhbCQoJXIxKSwlcjE5Ci0JbGRpIDIsJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLUwkMDAwMQotCWxkbyA2NCglcjMpLCVyMzAKLQlsZHdtIC02NCglcjMwKSwlcjMKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiMjM2Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDY3OSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5MywgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKLSMgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1wcm9jIGRvX2JsZV9yZWxvY2F0aW9uX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiYmxlYnVnLnM6IFRlc3QgZm9yIHByb3BlciByZWxvY2F0aW9uIGZvciBCTEUgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAiYmxlYnVnLnMiICIiICJQcm9wZXIgcmVsb2NhdGlvbiBmb3IgQkxFIChwYXJ0IDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLSAgICAgICAgaWYgIVtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQkgICAgIyBBdCBvbmUgdGltZSBib3RoIHZlcnNpb25zIG9mIHRoZSBhc3NlbWJsZXIgd291bGQgaW5jb3JyZWN0bHkgdXNlIAotCSAgICAjIGEgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbiBmb3IgYSBCTEUgaW5zdHJ1Y3Rpb24uCi0JICAgIHdoaWxlIDEgewotCQlleHBlY3QgewotCQkgICAgLXJlICJeMDAwMDAwMDRcW15cblxdKkFCU19DQUxMXFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KLQkJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCSAgICB0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkJfQotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgIyBBdCBvbmUgdGltZSBib3RoIHZlcnNpb25zIG9mIHRoZSBhc3NlbWJsZXIgd291bGQgaW5jb3JyZWN0bHkgdXNlIAotCSAgICAjIGEgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbiBmb3IgYSBCTEUgaW5zdHJ1Y3Rpb24uCi0JICAgIHdoaWxlIDEgewotCQlleHBlY3QgewotCQkgICAgLXJlICJeMDAwMDAwMDBcW15cblxdKkRJUjIxTFxbXlxuXF0qXG4iCXsgc2V0IHggMSB9Ci0JCSAgICAtcmUgIl4wMDAwMDAwNFxbXlxuXF0qRElSMTdSXFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KLQkJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCSAgICB0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIG9iamR1bXBfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fcmVsb2NhdGlvbl9yZWR1Y3Rpb25fdGVzdHMge30gewotICAgIHNldCB0ZXN0bmFtZSAicmVkdWNlLnM6IFRlc3QgcmVsb2NhdGlvbiByZWR1Y3Rpb25zIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInJlZHVjZS5zIiAiIiAiUmVsb2NhdGlvbiByZWR1Y3Rpb25zIChwYXJ0MSkiXSB0aGVuIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHJlbG9jYXRpb25zIGludm9sdmluZyBwcm9jZWR1cmUgbGFiZWxzIAotCSMgYXJlIG5vdCByZWR1Y2VkIHRvIGEgcmVsb2NhdGlvbiBpbnZvbHZpbmcgc29tZSBvdGhlciBzeW1ib2wuCi0JIyBEb2luZyBzbyBtYWtlcyBnZW5lcmF0aW5nIHBhcmFtZXRlciByZWxvY2F0aW9uIHN0dWJzIGltcG9zc2libGUuCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXjAwMDAwMDA0XFteXG5cXSpQTEFCRUxcW15cblxdKmZvb1xbXlxuXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMDAwMDAwMTRcW15cblxdKlBDUkVMXFteXG5cXSpmb29cW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLSAgICAgICAgICAgIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgb2JqZHVtcF9maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQotICAgIHNldCB0ZXN0bmFtZSAicmVkdWNlMi5zOiBNb3JlIHJlbG9jYXRpb24gcmVkdWN0aW9uIHRlc3RzIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInJlZHVjZTIucyIgIiIgIk1vcmUgcmVsb2NhdG9pbiAgcmVkdWN0aW9ucyAocGFydDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIENoZWNrIHRvIG1ha2Ugc3VyZSBETFQgcmVsYXRpdmUgcmVsb2NzIGFyZSBub3QgcmVkdWNlZCB0byBzeW0rYWRkZW5kCi0JIyBEb2luZyBzbyBkb2Vzbid0IHdvcmsgYXMgb25lIG1pZ2h0IGV4cGVjdAotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCQktcmUgIl4wMDAwMDAwNFxbXlxuXF0qRExUXFteXG5cXSpMLkMwMDAwXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wMDAwMDAxY1xbXlxuXF0qRExUXFteXG5cXSpMLkMwMDAwXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wMDAwMDAzMFxbXlxuXF0qRExUXFteXG5cXSpMLkMwMDAxXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wMDAwMDA0OFxbXlxuXF0qRExUXFteXG5cXSpMLkMwMDAxXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0gICAgICAgICAgICB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIG9iamR1bXBfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0KLSAgICBzZXQgdGVzdG5hbWUgInJlZHVjZTMuczogVGVzdCBldmVuIG1vcmUgcmVsb2NhdGlvbiByZWR1Y3Rpb25zIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInJlZHVjZTMucyIgIiIgIkV2ZW4gbW9yZSByZWxvY2F0aW9uIHJlZHVjdGlvbnMgKHBhcnQxKSJdIHRoZW4gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBDaGVjayB0byBtYWtlIHN1cmUgcmVsb2NhdGlvbnMgaW52b2x2aW5nIHByb2NlZHVyZSBsYWJlbHMgCi0JIyBhcmUgbm90IHJlZHVjZWQgdG8gYSByZWxvY2F0aW9uIGludm9sdmluZyBzb21lIG90aGVyIHN5bWJvbC4KLQkjIERvaW5nIHNvIG1ha2VzIGdlbmVyYXRpbmcgcGFyYW1ldGVyIHJlbG9jYXRpb24gc3R1YnMgaW1wb3NzaWJsZS4KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJeMDAwMDAwMGNcW15cblxdKnlhYmJhXFteXG5cK1xdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjAwMDAwMDBjXFteXG5cXSp5YWJiYVwrXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggMDsgYnJlYWsgfQotCQktcmUgIl4wMDAwMDAxMFxbXlxuXF0qeWFiYmFcW15cblwrXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMDAwMDAwMTBcW15cblxdKnlhYmJhXCtcW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCAwOyBicmVhayB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLSAgICAgICAgICAgIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgb2JqZHVtcF9maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19ibGVfbW9kZV9zZWxlY3Rvcl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJsZWJ1ZzIuczogYmxlYnVnMiIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJsZWJ1ZzIucyIgIi1hbCIKLQotICAgICMgR0FTIHVzZXMgdG9vIG1hbnkgYml0cyBvbiB0aGUgQkxFIGluc3RydWN0aW9uLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyMDIwMjgwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRTQyMEUwMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYmxlX3JlbG9jYXRpb25fdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJibGVidWczLnM6IGJsZWJ1ZzMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJibGVidWczLnMiICItYWwiCi0KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTQwMDIwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fcGxhYmVsX3JlbG9jYXRpb25fdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJwbGFiZWxidWcuczogT2xkIGdhcy0xLjM2IHBsYWJlbCBidWcgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAicGxhYmVsYnVnLnMiICIiICJPbGQgZ2FzLTEuMzYgcGxhYmVsIGJ1ZyAocGFydCAxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgQ2hlY2sgdGhhdCB3ZSBtYWtlIFBMQUJFTCByZWxvY2F0aW9uIGVudHJpZXMgd2hlbiB0aGV5J3JlIG5lZWRlZC4KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJeMDAwMDAwMDBcW15cblxdKlBMQUJFTFxbXlxuXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMDAwMDAwMDRcW15cblxdKlBMQUJFTFxbXlxuXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLSAgICAJICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19zZWxlY3Rvcl9zY29wZV90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNlbGVjdG9yYnVnLnM6IFRlc3Qgc2NvcGUgb2YgZmllbGQgc2VsZWN0b3IiIAotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInNlbGVjdG9yYnVnLnMiICIiICJUZXN0IHNjb3BlIG9mIGZpZWxkIHNlbGVjdG9yIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHJlbG9jYXRpb24gZW50cnkgYWZ0ZXIgdGhlIHBsYWJlbCBpcyBjb3JyZWN0LgotCSMgSWYgYW4gb2xkIGZpZWxkIHNlbGVjdG9yIHdhcyBpbmNvcnJlY3RseSAiY2FycmllZCIgb3ZlciwgdGhlbiAKLQkjIHRoaXMgdGVzdCB3aWxsIGZhaWwuCi0gICAgICAgIGlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCB7Ci0JICAgICAgICAgICAgLXJlICJeMDAwMDAwMTRcW15cblxdKkRJUjMyXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggMSB9Ci0JCSAgICAtcmUgIl4wMDAwMDAxNFxbXlxuXF0qUExBQkVMXFteXG5cXSpmb29cW15cblxdKlxuIgotCQkJeyBzZXQgeCAwIH0KLQkgICAgICAgICAgICAtcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkgICAgICAgICAgICB0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0JCX0KLSAgICAgICAgICAgIH0KLQl9IGVsc2UgewotCSAgICB3aGlsZSAxIHsKLQkJZXhwZWN0IHsKLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAxNFxbXlxuXF0qREFUQV9PTkVcW15cblxdKlxuIgotCQkJeyBzZXQgeCAxIH0KLQkJICAgIC1yZSAiXjAwMDAwMDE0XFteXG5cXSpQTEFCRUxcW15cblxdKmZvb1xbXlxuXF0qXG4iCi0JCQl7IHNldCB4IDAgfQotCSAgICAgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgICAgIHRpbWVvdXQJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkJfQotICAgICAgICAgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX2xvY2FsX2xhYmVsX2FzX29wZXJhbmRfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsYWJlbG9wYnVnLnM6IFRlc3QgbG9jYWwgbGFiZWwgYXMgb3BlcmFuZCAobm9uLWJyYW5jaGluZykiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAibGFiZWxvcGJ1Zy5zIiAiIiAiTG9jYWwgbGFiZWwgYXMgb3BlcmFuZCAocGFydCAxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhbmRsZSBkaWZmZXJlbmNlIG9mIGxvY2FsIGxhYmxlcyBhcyBhbiBvcGVyYW5kCi0JIyB0byBhIG5vbi1icmFuY2hpbmcgaW5zdHJ1Y3Rpb24gY29ycmVjdGx5LgotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCSAgICAgICAgLXJlICJeMDAwMDAwMmNcW15cblxdKjB4MDAwMDAwMjRcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJeMDAwMDAwMzBcW15cblxdKjB4MDAwMDAwMjRcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0gICAgICAgICAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fZXhpdF9yZWxvY2F0aW9uX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiZXhpdGJ1Zy5zOiBUZXN0IGZvciBib2d1cyBSX0VYSVQgcmVsb2NhdGlvbiAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICAjIEVsZiAob3NmKSBkb2VzIG5vdCB1c2UgRU5UUlkvRVhJVCByZWxvY2F0aW9ucy4KLSAgICAjIEkgZ3Vlc3Mgd2UgY291bGQgbG9vayBhdCB0aGUgdW53aW5kIHN1YnNwYWNlcyBpdCBidWlsZHMuLi4KLSAgICAjIFVudGlsIHRoZW4sIG1ha2Ugc3VyZSBpdCBzdGlsbCBhc3NlbWJsZXMuCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCWdhc190ZXN0X29sZCAiZXhpdGJ1Zy5zIiAiIiAiVGVzdCBmb3IgYm9ndXMgUl9FWElUIHJlbG9jYXRpb24gKHBhcnQgMSkiCi0JcmV0dXJuOwotICAgIH0KLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImV4aXRidWcucyIgIiIgIlRlc3QgZm9yIGJvZ3VzIFJfRVhJVCByZWxvY2F0aW9uIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBOb3RlIHRoYXQgYSBtYXRjaCBoZXJlIGlzIHJlYWxseSBhIEZBSUxVUkUhCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JICAgICAgICAtcmUgIl4wMDAwMDAwMFxbXlxuXF0qUl9FWElUXFteXG5cXSpcbiIgCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotICAgICAgICAgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX2Nyb3NzX3NwYWNlX2ZpeHVwX3Rlc3RfMSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmaXh1cGJ1Zy5zOiBUZXN0IGNyb3NzIHNwYWNlIGp1bXAvY2FsbCBmaXh1cCBidWcgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgIyBFTEYgKG9zZikgZG9lc24ndCByZWFsbHkgaGFuZGxlIGV4dHJhIHNlY3Rpb25zIHRvbyB3ZWxsLi4uCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJmaXh1cGJ1Zy5zIiAiIiAiVGVzdCBjcm9zcyBzcGFjZSBqdW1wL2NhbGwgZml4dXAgYnVnIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBNYWtlIHN1cmUgR0FTIGdlbmVyYXRlZCBhIGZpeHVwL3JlbG9jYXRpb24gZm9yIHRoZSBjcm9zcy1zcGFjZQotCSMgYnJhbmNoL2NhbGwKLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkgICAgICAgIC1yZSAiXjAwMDAwMDAwXFteXG5cXSpQQ1JFTF9DQUxMXFteXG5cXSpcbiIgCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotICAgICAgICAgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX2Nyb3NzX3NwYWNlX2ZpeHVwX3Rlc3RfMiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmaXh1cGJ1Zy5zOiBUZXN0IGNyb3NzIHNwYWNlIGp1bXAvY2FsbCBmaXh1cCBidWcgKHBhcnQgMykiCi0gICAgc2V0IHggMAotCi0gICAgIyBFTEYgKG9zZikgZG9lc24ndCByZWFsbHkgaGFuZGxlIGV4dHJhIHNlY3Rpb25zIHRvbyB3ZWxsLi4uCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCXJldHVybjsKLSAgICB9Ci0KLSAgICBnYXNfc3RhcnQgImZpeHVwYnVnLnMiICItYWwiCi0KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTgwMDAwMDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fcm91bmRfbW9kZV90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInJvdW5kbW9kZS5zOiBUZXN0IHN3aXRjaGluZyBvZiByb3VuZGluZyBtb2RlcyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJyb3VuZG1vZGUucyIgIiIgIlRlc3Qgc3dpdGNoIG9mIHJvdW5kaW5nIG1vZGVzKHBhcnQgMSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIE1ha2Ugc3VyZSBHQVMgZ2VuZXJhdGVkIGNvcnJlY3QgcmVsb2NhdGlvbnMgdG8gc3dpdGNoIHJvdW5kaW5nIG1vZGVzLgotCSMgQWxzbyBtYWtlIHN1cmUgKGZvciBTT00pIHRoYXQgcmVkdW5kYW50IHJvdW5kaW5nIG1vZGUgcmVsb2NhdGlvbnMKLQkjIHdlcmUgZWxpbWluYXRlZC4KLQlpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7Ci0JICAgIHdoaWxlIDEgewotCQlleHBlY3QgewotCSAgICAgICAgICAgIC1yZSAiXjAwMDAwMDAwXFteXG5cXSpESVIyMUxcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMDAwMDAwMDRcW15cblxdKkRJUjE0UlxbXlxuXF0qXG4iIAotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMDAwMDAwMDhcW15cblxdKkRJUjIxTFxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAwY1xbXlxuXF0qRElSMTRSXFteXG5cXSpcbiIgCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAxMFxbXlxuXF0qRElSMjFMXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXjAwMDAwMDE0XFteXG5cXSpESVIxNFJcW15cblxdKlxuIiAKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXjAwMDAwMDE4XFteXG5cXSpESVIyMUxcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMDAwMDAwMWNcW15cblxdKkRJUjE0UlxbXlxuXF0qXG4iIAotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0JCX0KLSAgICAgICAgICAgIH0KLQl9IGVsc2UgewotCSAgICB3aGlsZSAxIHsKLQkJZXhwZWN0IHsKLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAwMFxbXlxuXF0qUl9SX01PREVcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMDAwMDAwMDRcW15cblxdKlJfUl9NT0RFXFteXG5cXSpcbiIgCi0JCQl7IGZhaWwgJHRlc3RuYW1lIH0KLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAwOFxbXlxuXF0qUl9OX01PREVcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMDAwMDAwMGNcW15cblxdKlJfTl9NT0RFXFteXG5cXSpcbiIgCi0JCQl7IGZhaWwgJHRlc3RuYW1lIH0KLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAxMFxbXlxuXF0qUl9SX01PREVcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMDAwMDAwMTRcW15cblxdKlJfUl9NT0RFXFteXG5cXSpcbiIgCi0JCQl7IGZhaWwgJHRlc3RuYW1lIH0KLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAxY1xbXlxuXF0qUl9SX01PREVcW15cblxdKlxuIiAKLQkJCXsgZmFpbCAkdGVzdG5hbWUgfQotCSAgICAgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotCQl9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQkgICAgaWYgW2V4cHIgJHg9PThdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0JfSBlbHNlIHsKLQkgICAgaWYgW2V4cHIgJHg9PTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0JfQotICAgIH0KLX0KLQotcHJvYyBkb19mdW5jdGlvbl9yZWxvY19idWcge30gewotICAgIHNldCB0ZXN0bmFtZSAiZnVuY3JlbG9jYnVnLnM6IFRlc3QgZm9yIHJlbG9jIGJ1ZyBpbiBub24tcGxhYmVsIGZ1bmN0aW9uIHJlZmVyZW5jZSAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJmdW5jcmVsb2NidWcucyIgIiIgIlRlc3QgZm9yIHJlbG9jIGJ1ZyBpbiBub24tcGxhYmVsIGZ1bmN0aW9uIHJlZmVyZW5jZSAocGFydCAxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgTWFrZSBzdXJlIEdBUyBnZW5lcmF0ZWQgYSBjb3JyZWN0IHJlbG9jYXRpb24gZm9yIHRoZSByZWZlcmVuY2UuCi0JIyBicmFuY2gvY2FsbAotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCSAgICAgICAgLXJlICJeMDAwMDAwY2NcW15cblxdKmYyX19fNFxbXlxuK1xdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJeMDAwMDAwZDBcW15cblxdKmYyX19fNFxbXlxuK1xdKlxuIiAgCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotICAgICAgICAgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0KLQlzZXQgdGVzdG5hbWUgImZ1bmNyZWxvY2J1Zy5zOiBUZXN0IGZvciByZWxvYyBidWcgaW4gbm9uLXBsYWJlbCBmdW5jdGlvbiByZWZlcmVuY2UgKHBhcnQzKSIKLQlzZXQgeCAwCi0KLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItLXByZWZpeC1hZGRyZXNzZXMgLWQiCi0JIyBNYWtlIHN1cmUgd2UgZGlkbid0IHB1dCBhbnl0aGluZyBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmIQotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCSAgICAgICAgLXJlICJeMDAwMDAwY2NcW15cblxdKmxkaWwgMCxyMjBcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJeMDAwMDAwZDBcW15cblxdKmxkbyAwXFtcKFxdK3IyMFxbXClcXSsscjE5XFteXG5cXSpcbiIgCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci0KLX0KLQotcHJvYyBkb19yX25vX3JlbG9jIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInJfbm9fcmVsb2MuczogVGVzdCBmb3IgcmVsb2MgYnVnIGluIDQtYnl0ZSBSX05PX1JFTENPQVRJT04gZml4dXBzIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInJfbm9fcmVsb2MucyIgIiIgIlRlc3QgZm9yIHJlbG9jIGJ1ZyBpbiA0LWJ5dGUgUl9OT19SRUxPQ0FUSU9OIGZpeHVwcyAocGFydCAxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgTWFrZSBzdXJlIEdBUyBnZW5lcmF0ZWQgYSBjb3JyZWN0IHJlbG9jYXRpb24gZm9yIHRoZSByZWZlcmVuY2UuCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JICAgICAgICAtcmUgIl4wMDBjMDAwNFxbXlxuXF0qUExBQkVMXFteXG5dKmdcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0gICAgICAgICAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQotICAgIH0KLX0KLQotcHJvYyBkb19waWNfcmVsb2NhdGlvbl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInBpY3JlbG9jLnM6IFRlc3QgZm9yIHByb3BlciBQSUMgcmVsb2NhdGlvbiAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICAjIEVMRiAob3NmKSBkb2Vzbid0IHJlYWxseSBoYW5kbGUgZXh0cmEgc2VjdGlvbnMgdG9vIHdlbGwuLi4KLSAgICBpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGdhc19zdGFydCAicGljcmVsb2MucyIgIi1hbCIKLQotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwMDAwMDAwNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19hcHBseV90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFwcGx5YnVnLnM6IFRlc3QgZm9yIHByb3BlciBmaXh1cCBhcHBsaWF0aW9uIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgICMgRUxGIChvc2YpIGRvZXNuJ3QgcmVhbGx5IGhhbmRsZSBleHRyYSBzZWN0aW9ucyB0b28gd2VsbC4uLgotICAgIGlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgZ2FzX3N0YXJ0ICJhcHBseWJ1Zy5zIiAiLWFsIgotCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDAwMDAwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwMDAwMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDAwMDAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci1pZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgICAjIE1ha2Ugc3VyZSB3ZSBwdXQgdGhlIHJpZ2h0IHJlbG9jYXRpb24gZW50cnkgb24gYSBCTEUgaW5zdHJ1Y3Rpb24uCi0gICAgZG9fYmxlX3JlbG9jYXRpb25fdGVzdAotCi0gICAgIyBNYWtlIHN1cmUgcmVsb2NhdGlvbiByZWR1Y3Rpb25zIGFyZSBub3QgdG9vIGFncmVzc2l2ZSBhYm91dAotICAgICMgYWRqdXN0aW5nIHJlbG9jYXRpb25zIGFnYWluc3Qgc29tZSBzeW1ib2xzLgotICAgIGRvX3JlbG9jYXRpb25fcmVkdWN0aW9uX3Rlc3RzCi0KLSAgICAjIENoZWNrIHRoYXQgbW9kZSBzZWxlY3RvcnMgb24gYSBibGUgaW5zdHJ1Y3Rpb24gYWN0dWFsbHkgd29yay4KLSAgICBkb19ibGVfbW9kZV9zZWxlY3Rvcl90ZXN0Ci0KLSAgICAjIENoZWNrIHRoYXQgd2UgdGFrZSB0aGUgLTggYWRqdXN0bWVudCBpbnRvIGFjY291bnQgd2hlbiB6ZXJvaW5nCi0gICAgIyBvdXQgdGhlIGRpc3BsYWNlbWVudCBmaWVsZCBpbiBhIGJsZSBpbnN0cnVjdGlvbiB3aXRoIGEgcmVsb2MKLSAgICBkb19ibGVfcmVsb2NhdGlvbl90ZXN0Ci0KLSAgICAjIDEuMzYgc2ltcGx5IGRpZG4ndCBnZW5lcmF0ZSBhbGwgdGhlIHBsYWJlbHMgaXQgc2hvdWxkIGhhdmUuICBNYWtlCi0gICAgIyBzdXJlIGdhcy0yIGRvZXMuCi0gICAgZG9fcGxhYmVsX3JlbG9jYXRpb25fdGVzdAotCi0gICAgIyBNYWtlIHN1cmUgYSBmaWVsZCBzZWxlY3RvciBvbmx5IGVmZmVjdHMgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24KLSAgICAjIG9yIGFzc2VtYmxlciBkaXJlY3RpdmUuCi0gICAgZG9fc2VsZWN0b3Jfc2NvcGVfdGVzdAotCi0gICAgIyBUaGlzIHNob3VsZCByZWFsbHkgZ2VuZXJhdGUgYSByZWxvY2F0aW9uLiAgSXQgd291bGQgbWFrZSBsaWZlIG11Y2gKLSAgICAjIGVhc2llciBvbiB0aGUgb3B0aW1pemluZyBsaW5rZXIuICBVbnRpbCB0aGVuIGp1c3QgbWFrZSBzdXJlIHRoZSAKLSAgICAjIGRpZmZlcmVuY2UgaXMgY29tcHV0ZWQgY29ycmVjdGx5LgotICAgIGRvX2xvY2FsX2xhYmVsX2FzX29wZXJhbmRfdGVzdAotCi0gICAgIyBHQVMyIGluY29ycmVjdGx5IGdlbmVyYXRlZCBSX0VYSVQgcmVsb2NhdGlvbnMgd2hlbiAuZXhpdCBkaXJlY3RpdmVzCi0gICAgIyB3ZXJlIG5vdCBpbiB0aGUgc291cmNlIGNvZGUuCi0gICAgZG9fZXhpdF9yZWxvY2F0aW9uX3Rlc3QKLQotICAgICMgR0FTMiBpbmNvcnJlY3RseSB0aG91Z2h0IGl0IGNvdWxkIGFwcGx5IGEgZml4dXAgZm9yIGEgcGMtcmVsYXRpdmUKLSAgICAjIGJyYW5jaC9jYWxsIHdoaWNoIGNyb3NzZWQgZGlmZmVyZW50IHN1YnNwYWNlcy4KLSAgICAjIEFsc28gY2hlY2sgdGhhdCB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGlzIGNvcnJlY3QKLSAgICBkb19jcm9zc19zcGFjZV9maXh1cF90ZXN0XzEKLSAgICBkb19jcm9zc19zcGFjZV9maXh1cF90ZXN0XzIKLQotICAgICMgTWFrZSBzdXJlIHdlIHN3aXRjaCByb3VuZGluZyBtb2RlcyBjb3JyZWN0bHkKLSAgICBkb19yb3VuZF9tb2RlX3Rlc3QKLQotICAgICMgVGVzdCBmb3IgYSBidWcgZm91bmQgd2hlbiBhIGZ1bmN0aW9uIHdhcyB1c2VkIGluIGEgbm9uLWJyYW5jaGluZwotICAgICMgaW5zdHJ1Y3Rpb24gKndpdGhvdXQqIGEgcGxhYmVsIChmb3IgcG9ydGFibGUgcnVudGltZSBtb2RlbCkKLSAgICBkb19mdW5jdGlvbl9yZWxvY19idWcKLQotICAgICMgVGVzdCBmb3IgYW4gb2ZmLWJ5LW9uZSBidWcgaW4gdGhlIGhhbmRsaW5nIG9mIDQtYnl0ZSBSX05PX1JFTE9DQVRJT04KLSAgICAjIGZpeHVwcy4KLSAgICBkb19yX25vX3JlbG9jCi0KLSAgICAjIFRlc3QgYSByZWxvY2F0aW9uIHByb2JsZW0gd2hpY2ggc2hvd3MgdXAgd2hlbiBidWlsZGluZyBzaGFyZWQKLSAgICAjIGxpYnJhcmllcyBpbiBTT00KLSAgICBkb19waWNfcmVsb2NhdGlvbl90ZXN0Ci0KLSAgICAjIFRlc3QgYSBwcm9ibGVtIHdpdGggbWRfYXBwbHlfZml4IHRoYXQgd2FzIGludHJvZHVjZWQgd2hlbiBmaXhpbmcKLSAgICAjIHRoZSBwaWMgcmVsb2NhdGlvbiB0ZXN0LgotICAgIGRvX2FwcGx5X3Rlc3QKLQotICAgICMgTWFrZSBzdXJlIGdhcyBkb2Vzbid0IHJlc29sdmUgbG9uZy1jYWxscyB3aGljaCBhcmUgdG8gYmUgZml4ZWQKLSAgICAjIGJ5IHRoZSBsaW5rZXIKLSAgICBnYXNfdGVzdCAibG9uZ2NhbGwucyIgIiIgIiIgIkF2b2lkIHJlc29sdmluZyBsb25nLWNhbGxzIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yb3VuZG1vZGUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcm91bmRtb2RlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhODdlNjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yb3VuZG1vZGUucworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5JTVBPUlQgZm9vLGRhdGEKLQotOyBTd2l0Y2ggaW4vb3V0IG9mIGRpZmZlcmVudCByb3VuZGluZyBtb2Rlcy4KLTsgQWxzbyBtYWtlIHN1cmUgd2UgIm9wdGltaXplIiBhd2F5IHVzZWxlc3Mgcm91bmRpbmcgbW9kZSByZWxvY2F0aW9ucwotCWFkZGlsICAgTFInZm9vLTB4MTIzNDUsJXIyNwotCWxkbwlSUidmb28tMHgxMjM0NSglcjEpLCVyMQotCWFkZGlsICAgTCdmb28tMHgxMjM0NSwlcjI3Ci0JbGRvCVInZm9vLTB4MTIzNDUoJXIxKSwlcjEKLQlhZGRpbCAgIExSJ2Zvby0weDEyMzQ1LCVyMjcKLQlsZG8JUlInZm9vLTB4MTIzNDUoJXIxKSwlcjEKLQlhZGRpbCAgIExSJ2Zvby0weDEyMzQ1LCVyMjcKLQlsZG8JUlInZm9vLTB4MTIzNDUoJXIxKSwlcjEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvc2VsZWN0b3JidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvc2VsZWN0b3JidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyNWQzOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3NlbGVjdG9yYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuRVhQT1JUIGludFZlY19lcnJvcl9oYW5kbGVyLERBVEEKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotaW50VmVjX2Vycm9yX2hhbmRsZXI6Ci0JLndvcmQgUCVkZWZhdWx0X2ludFZlY19lcnJvcl9oYW5kbGVyX19GUENjCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgZm9vLENPREUKLQkuRVhQT1JUIGZvbyxFTlRSWSxQUklWX0xFVj0zCi1mb286Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MAotCS5FTlRSWQotCS5zdGFiZCA2OCwwLDQxCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9hbGlnbjMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ24zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZDI0MDguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9hbGlnbjMucworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5ibG9ja3ogNAotCi1tYWluOgotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJAotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0wCi0JLkVOVFJZCi0Jbm9wCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9hbGlnbjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ240LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMmY5OWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9hbGlnbjQucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCS5zcGFjZSAkVEVYVCQKLQkuc3Vic3BhICRZQUJCQSQKLQkuc3Vic3BhICRNSUxMSUNPREUkCi0JLmFsaWduIDY0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2JybGVuYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2JybGVuYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZTVjN2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9icmxlbmJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzUwMiArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotCS5hbGlnbiA0Ci1kb25lX19fMgotCS53b3JkIDAKLQkuSU1QT1JUIG1lbXNldCxDT0RFCi0JLkVYUE9SVCByZV9zeW50YXhfb3B0aW9ucyxEQVRBCi0JLmFsaWduIDQKLXJlX3N5bnRheF9vcHRpb25zCi0JLndvcmQgMAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJAotCi0JLmFsaWduIDQKLXJlX2Vycm9yX21zZwotCS53b3JkIDAKLQkud29yZCBMJEMwMDAwCi0JLndvcmQgTCRDMDAwMQotCS53b3JkIEwkQzAwMDIKLQkud29yZCBMJEMwMDAzCi0JLndvcmQgTCRDMDAwNAotCS53b3JkIEwkQzAwMDUKLQkud29yZCBMJEMwMDA2Ci0JLndvcmQgTCRDMDAwNwotCS53b3JkIEwkQzAwMDgKLQkud29yZCBMJEMwMDA5Ci0JLndvcmQgTCRDMDAxMAotCS53b3JkIEwkQzAwMTEKLQkud29yZCBMJEMwMDEyCi0JLndvcmQgTCRDMDAxMwotCS53b3JkIEwkQzAwMTQKLQkud29yZCBMJEMwMDE1Ci0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQKLQotCS5hbGlnbiA0Ci1MJEMwMDE1Ci0JLlNUUklORyAiVW5tYXRjaGVkICkgb3IgXFwpXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAxNAotCS5TVFJJTkcgIlJlZ3VsYXIgZXhwcmVzc2lvbiB0b28gYmlnXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAxMwotCS5TVFJJTkcgIlByZW1hdHVyZSBlbmQgb2YgcmVndWxhciBleHByZXNzaW9uXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAxMgotCS5TVFJJTkcgIkludmFsaWQgcHJlY2VkaW5nIHJlZ3VsYXIgZXhwcmVzc2lvblx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMTEKLQkuU1RSSU5HICJNZW1vcnkgZXhoYXVzdGVkXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAxMAotCS5TVFJJTkcgIkludmFsaWQgcmFuZ2UgZW5kXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwOQotCS5TVFJJTkcgIkludmFsaWQgY29udGVudCBvZiBcXHtcXH1ceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDA4Ci0JLlNUUklORyAiVW5tYXRjaGVkIFxce1x4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDcKLQkuU1RSSU5HICJVbm1hdGNoZWQgKCBvciBcXChceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDA2Ci0JLlNUUklORyAiVW5tYXRjaGVkIFsgb3IgW15ceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDA1Ci0JLlNUUklORyAiSW52YWxpZCBiYWNrIHJlZmVyZW5jZVx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDQKLQkuU1RSSU5HICJUcmFpbGluZyBiYWNrc2xhc2hceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDAzCi0JLlNUUklORyAiSW52YWxpZCBjaGFyYWN0ZXIgY2xhc3MgbmFtZVx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDIKLQkuU1RSSU5HICJJbnZhbGlkIGNvbGxhdGlvbiBjaGFyYWN0ZXJceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDAxCi0JLlNUUklORyAiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25ceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDAwCi0JLlNUUklORyAiTm8gbWF0Y2hceDAwIgotCS5FWFBPUlQgcmVfbWF4X2ZhaWx1cmVzLERBVEEKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotCS5hbGlnbiA0Ci1yZV9tYXhfZmFpbHVyZXMKLQkud29yZCAyMDAwCi0JLklNUE9SVCBtYWxsb2MsQ09ERQotCS5JTVBPUlQgcmVhbGxvYyxDT0RFCi0JLklNUE9SVCBmcmVlLENPREUKLQkuSU1QT1JUIHN0cmNtcCxDT0RFCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQKLQotCS5hbGlnbiA0Ci1MJEMwMDE2Ci0JLlNUUklORyAiYWxudW1ceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDE3Ci0JLlNUUklORyAiYWxwaGFceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDE4Ci0JLlNUUklORyAiYmxhbmtceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDE5Ci0JLlNUUklORyAiY250cmxceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDIwCi0JLlNUUklORyAiZGlnaXRceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDIxCi0JLlNUUklORyAiZ3JhcGhceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDIyCi0JLlNUUklORyAibG93ZXJceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDIzCi0JLlNUUklORyAicHJpbnRceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDI0Ci0JLlNUUklORyAicHVuY3RceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDI1Ci0JLlNUUklORyAic3BhY2VceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDI2Ci0JLlNUUklORyAidXBwZXJceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDI3Ci0JLlNUUklORyAieGRpZ2l0XHgwMCIKLQkuSU1QT1JUIF9fYWxudW0sREFUQQotCS5JTVBPUlQgX19jdHlwZTIsREFUQQotCS5JTVBPUlQgX19jdHlwZSxEQVRBCi0JLklNUE9SVCBhdF9iZWdsaW5lX2xvY19wLENPREUKLQkuSU1QT1JUIGF0X2VuZGxpbmVfbG9jX3AsQ09ERQotCS5JTVBPUlQgc3RvcmVfb3AxLENPREUKLQkuSU1QT1JUIGluc2VydF9vcDEsQ09ERQotCS5JTVBPUlQgc3RvcmVfb3AyLENPREUKLQkuSU1QT1JUIGluc2VydF9vcDIsQ09ERQotCS5JTVBPUlQgY29tcGlsZV9yYW5nZSxDT0RFCi0JLklNUE9SVCBncm91cF9pbl9jb21waWxlX3N0YWNrLENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci1yZWdleF9jb21waWxlCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MzIwLENBTExTLFNBVkVfUlAsRU5UUllfR1I9MTgKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKSA7IyA4OTg5IHJlbG9hZF9vdXRzaSsyLzYKLQlsZG8gMzIwKCVyMzApLCVyMzAgOyMgODk5MSBhZGRzaTMvMgotCXN0dyAlcjE4LC0xNjgoJXIzMCkgOyMgODk5MyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTcsLTE2NCglcjMwKSA7IyA4OTk1IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxNiwtMTYwKCVyMzApIDsjIDg5OTcgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjE1LC0xNTYoJXIzMCkgOyMgODk5OSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTQsLTE1MiglcjMwKSA7IyA5MDAxIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxMywtMTQ4KCVyMzApIDsjIDkwMDMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjEyLC0xNDQoJXIzMCkgOyMgOTAwNSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTEsLTE0MCglcjMwKSA7IyA5MDA3IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxMCwtMTM2KCVyMzApIDsjIDkwMDkgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjksLTEzMiglcjMwKSA7IyA5MDExIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI4LC0xMjgoJXIzMCkgOyMgOTAxMyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNywtMTI0KCVyMzApIDsjIDkwMTUgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjYsLTEyMCglcjMwKSA7IyA5MDE3IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI1LC0xMTYoJXIzMCkgOyMgOTAxOSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNCwtMTEyKCVyMzApIDsjIDkwMjEgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsLTEwOCglcjMwKSA7IyA5MDIzIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIyNiwtMjc2KCVyMzApIDsjIDQgcmVsb2FkX291dHNpKzIvNgotCWxkaSAwLCVyOSA7IyAyNSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDAsJXI4IDsjIDI4IHJlbG9hZF9vdXRzaSsyLzIKLQlzdHcgJXIwLC0yNjAoJXIzMCkgOyMgMzQgcmVsb2FkX291dHNpKzIvNgotCWxkaSAwLCVyMTAgOyMgMzEgcmVsb2FkX291dHNpKzIvMgotCWxkaSA2NDAsJXIyNiA7IyAzNyByZWxvYWRfb3V0c2krMi8yCi0JbGR3IC0yNzYoJXIzMCksJXIxIDsjIDg3NzQgcmVsb2FkX291dHNpKzIvNQotCWNvcHkgJXIyNCwlcjE1IDsjIDggcmVsb2FkX291dHNpKzIvMQotCXN0dyAlcjEsLTI5NiglcjMwKSA7IyAyMzI1IHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMjMsJXI1IDsjIDEwIHJlbG9hZF9vdXRzaSsyLzEKLQlhZGRsICVyMSwlcjI1LCVyMTYgOyMgMTkgYWRkc2kzLzEKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIG1hbGxvYywlcjIgOyMgMzkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgMjAoJXI1KSwlcjE0IDsjIDIyIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw8PiAwLCVyMjgsTCQwMDIxIDsjIDQ4IGJsZXUrMQotCXN0dyAlcjI4LC0zMTIoJXIzMCkgOyMgNDMgcmVsb2FkX291dHNpKzIvNgotTCQwOTUzCi0JYmwgTCQwODY3LCVyMCA7IyA1MyBqdW1wCi0JbGRpIDEyLCVyMjggOyMgNTEgcmVsb2FkX291dHNpKzIvMgotTCQwMDIxCi0JbGRpIDMyLCVyMTkgOyMgNTggcmVsb2FkX291dHNpKzIvMgotCXN0dyAlcjE5LC0zMDgoJXIzMCkgOyMgNTkgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjAsLTMwNCglcjMwKSA7IyA2MiByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTUsMTIoJXI1KSA7IyA2NSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMCw4KCVyNSkgOyMgODUgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjAsMjQoJXI1KSA7IyA4OCByZWxvYWRfb3V0c2krMi82Ci0JYWRkaWwgTFInZG9uZV9fXzItJGdsb2JhbCQsJXIyNyA7IyA5MiBwaWMyX2xvX3N1bSsxCi0JbGR3IDI4KCVyNSksJXIxOSA7IyA2OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IFJSJ2RvbmVfX18yLSRnbG9iYWwkKCVyMSksJXIyMCA7IyA5NCByZWxvYWRfb3V0c2krMi81Ci0JZGVwaSAwLDMsMSwlcjE5IDsjIDY5IGFuZHNpMy8yCi0JZGVwaSAwLDYsMiwlcjE5IDsjIDgwIGFuZHNpMy8yCi0JY29taWIsPD4gMCwlcjIwLEwkMDAyMiA7IyA5NSBibGV1KzEKLQlzdHcgJXIxOSwyOCglcjUpIDsjIDgyIHJlbG9hZF9vdXRzaSsyLzYKLQlhZGRpbCBMUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQsJXIyNyA7IyA5OSBwaWMyX2xvX3N1bSsxCi0JbGRvIFJSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCglcjEpLCVyNCA7IyAxMDAgbW92aGktMgotCWNvcHkgJXI0LCVyMjYgOyMgMTAxIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMCwlcjI1IDsjIDEwMiByZWxvYWRfb3V0c2krMi8yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1zZXQsJXIyIDsjIDEwNCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkaSAyNTYsJXIyNCA7IyAxMDMgcmVsb2FkX291dHNpKzIvMgotCWxkaSAxLCVyMjAgOyMgODczMiBtb3ZxaSsxLzIKLQlsZG8gOTcoJXI0KSwlcjE5IDsjIDg3MzYgYWRkc2kzLzIKLQlsZG8gMTIyKCVyNCksJXI0IDsjIDg3MzggYWRkc2kzLzIKLQlzdGJzLG1hICVyMjAsMSglcjE5KSA7IyAxMTUgbW92cWkrMS82Ci1MJDExNTUKLQljb21iLD49LG4gJXI0LCVyMTksTCQxMTU1IDsjIDEyMSBibGV1KzEKLQlzdGJzLG1hICVyMjAsMSglcjE5KSA7IyAxMTUgbW92cWkrMS82Ci0JbGRpIDEsJXIyMSA7IyA4NzE3IG1vdnFpKzEvMgotCWFkZGlsIExSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCwlcjI3IDsjIDg3MTIgcGljMl9sb19zdW0rMQotCWxkbyBSUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQoJXIxKSwlcjE5IDsjIDg3MTUgbW92aGktMgotCWxkbyA2NSglcjE5KSwlcjIwIDsjIDg3MjEgYWRkc2kzLzIKLQlsZG8gOTAoJXIxOSksJXIxOSA7IyA4NzIzIGFkZHNpMy8yCi0Jc3RicyxtYSAlcjIxLDEoJXIyMCkgOyMgMTM4IG1vdnFpKzEvNgotTCQxMTU2Ci0JY29tYiw+PSxuICVyMTksJXIyMCxMJDExNTYgOyMgMTQ0IGJsZXUrMQotCXN0YnMsbWEgJXIyMSwxKCVyMjApIDsjIDEzOCBtb3ZxaSsxLzYKLQlsZGkgNDgsJXIyMCA7IyAxNTEgcmVsb2FkX291dHNpKzIvMgotCWxkaSA1NywlcjIyIDsjIDc5NzYgcmVsb2FkX291dHNpKzIvMgotCWxkaSAxLCVyMjEgOyMgODcwNyBtb3ZxaSsxLzIKLQlhZGRpbCBMUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQrNDgsJXIyNyA7IyA4NzA1IHBpYzJfbG9fc3VtKzEKLQlsZG8gUlIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkKzQ4KCVyMSksJXIxOSA7IyA4NzExIG1vdmhpLTIKLUwkMDAzNwotCWxkbyAxKCVyMjApLCVyMjAgOyMgMTY0IGFkZHNpMy8yCi0JY29tYiw+PSAlcjIyLCVyMjAsTCQwMDM3IDsjIDE2NyBibGV1KzEKLQlzdGJzLG1hICVyMjEsMSglcjE5KSA7IyAxNjEgbW92cWkrMS82Ci0JYWRkaWwgTFIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkLCVyMjcgOyMgMTc0IHBpYzJfbG9fc3VtKzEKLQlsZG8gUlIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkKCVyMSksJXIxOSA7IyAxNzUgbW92aGktMgotCWxkaSAxLCVyMjAgOyMgMTc2IG1vdnFpKzEvMgotCXN0YiAlcjIwLDk1KCVyMTkpIDsjIDE3NyBtb3ZxaSsxLzYKLQlhZGRpbCBMUidkb25lX19fMi0kZ2xvYmFsJCwlcjI3IDsjIDE3OCBwaWMyX2xvX3N1bSsxCi0JbGRpIDEsJXIxOSA7IyAxODAgcmVsb2FkX291dHNpKzIvMgotCXN0dyAlcjE5LFJSJ2RvbmVfX18yLSRnbG9iYWwkKCVyMSkgOyMgMTgxIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDAyMgotCWxkdyA0KCVyNSksJXIxOSA7IyAxODcgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+LG4gMCwlcjE5LEwkMDAzOSA7IyAxODkgYmxldSsxCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDE5MyByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSxuIDAsJXIyNixMJDAwNDAgOyMgMTk1IGJsZXUrMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgMjA1IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGRpIDMyLCVyMjUgOyMgMjAzIHJlbG9hZF9vdXRzaSsyLzIKLQlibCBMJDExNTcsJXIwIDsjIDIxMSBqdW1wCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDIyMyByZWxvYWRfb3V0c2krMi82Ci1MJDAwNDAKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIG1hbGxvYywlcjIgOyMgMjE5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGRpIDMyLCVyMjYgOyMgMjE3IHJlbG9hZF9vdXRzaSsyLzIKLQlzdHcgJXIyOCwwKCVyNSkgOyMgMjIzIHJlbG9hZF9vdXRzaSsyLzYKLUwkMTE1NwotCWxkdyAwKCVyNSksJXIxOSA7IyAyMjggcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+IDAsJXIxOSxMJDAwNDIgOyMgMjMwIGJsZXUrMQotCWxkaSAzMiwlcjE5IDsjIDI0MyByZWxvYWRfb3V0c2krMi8yCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyAyMzQgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDIzMiByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyAyMzgganVtcAotCWxkaSAxMiwlcjI4IDsjIDUxIHJlbG9hZF9vdXRzaSsyLzIKLUwkMDA0MgotCXN0dyAlcjE5LDQoJXI1KSA7IyAyNDQgcmVsb2FkX291dHNpKzIvNgotTCQwMDM5Ci0JbGR3IDAoJXI1KSwlcjYgOyMgMjQ5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDc5ODEgcmVsb2FkX291dHNpKzIvNQotCWNvbWNsciw8PiAlcjE2LCVyMTksJXIwIDsjIDc5ODIgYmxldSsxCi0JYmwgTCQwMDQ0LCVyMAotCWNvcHkgJXI2LCVyMTIgOyMgMjUzIHJlbG9hZF9vdXRzaSsyLzEKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDIzMzQgcmVsb2FkX291dHNpKzIvNQotTCQxMTc4Ci0JbGRicyxtYSAxKCVyMTkpLCVyNyA7IyAyNzcgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSAwLCVyMTQsTCQwMDQ3IDsjIDI4MiBibGV1KzEKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDIzMzcgcmVsb2FkX291dHNpKzIvNgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyAyODMgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgMjg2IHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwMDQ3Ci0JbGRvIC0xMCglcjcpLCVyMTkgOyMgNzg5NSBhZGRzaTMvMgotCWFkZGksdXYgLTExNSwlcjE5LCVyMCA7IyA3ODk2IGNhc2VzaTAKLQlibHIsbiAlcjE5LCVyMAotCWIsbiBMJDAwNzYKLUwkMDg2MwotCWJsIEwkMDM3NiwlcjAKLQlub3AgOyMgOTA5MiBzd2l0Y2hfanVtcAotTCQwOTU0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MDk1IHN3aXRjaF9qdW1wCi1MJDA5NTUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkwOTggc3dpdGNoX2p1bXAKLUwkMDk1NgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEwMSBzd2l0Y2hfanVtcAotTCQwOTU3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTA0IHN3aXRjaF9qdW1wCi1MJDA5NTgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMDcgc3dpdGNoX2p1bXAKLUwkMDk1OQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTExMCBzd2l0Y2hfanVtcAotTCQwOTYwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTEzIHN3aXRjaF9qdW1wCi1MJDA5NjEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMTYgc3dpdGNoX2p1bXAKLUwkMDk2MgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTExOSBzd2l0Y2hfanVtcAotTCQwOTYzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTIyIHN3aXRjaF9qdW1wCi1MJDA5NjQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMjUgc3dpdGNoX2p1bXAKLUwkMDk2NQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEyOCBzd2l0Y2hfanVtcAotTCQwOTY2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTMxIHN3aXRjaF9qdW1wCi1MJDA5NjcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMzQgc3dpdGNoX2p1bXAKLUwkMDk2OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEzNyBzd2l0Y2hfanVtcAotTCQwOTY5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTQwIHN3aXRjaF9qdW1wCi1MJDA5NzAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNDMgc3dpdGNoX2p1bXAKLUwkMDk3MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE0NiBzd2l0Y2hfanVtcAotTCQwOTcyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTQ5IHN3aXRjaF9qdW1wCi1MJDA5NzMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNTIgc3dpdGNoX2p1bXAKLUwkMDk3NAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE1NSBzd2l0Y2hfanVtcAotTCQwOTc1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTU4IHN3aXRjaF9qdW1wCi1MJDA5NzYKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNjEgc3dpdGNoX2p1bXAKLUwkMDk3NwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE2NCBzd2l0Y2hfanVtcAotTCQwOTc4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTY3IHN3aXRjaF9qdW1wCi1MJDA5NzkKLQlibCBMJDAwNzcsJXIwIDsjIDkxNzAgc3dpdGNoX2p1bXAKLQlsZHcgLTI5NiglcjMwKSwlcjI2IDsjIDIzNDkgcmVsb2FkX291dHNpKzIvNQotTCQwOTgwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTczIHN3aXRjaF9qdW1wCi1MJDA5ODEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNzYgc3dpdGNoX2p1bXAKLUwkMDk4MgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE3OSBzd2l0Y2hfanVtcAotTCQwOTgzCi0JYmwgTCQwMzY4LCVyMAotCW5vcCA7IyA5MTgyIHN3aXRjaF9qdW1wCi1MJDA5ODQKLQlibCBMJDAzNzIsJXIwCi0Jbm9wIDsjIDkxODUgc3dpdGNoX2p1bXAKLUwkMDk4NQotCWJsIEwkMDEwNCwlcjAKLQlub3AgOyMgOTE4OCBzd2l0Y2hfanVtcAotTCQwOTg2Ci0JYmwgTCQxMTU4LCVyMCA7IyA5MTkxIHN3aXRjaF9qdW1wCi0JbGRpIDEwMjYsJXIxOSA7IyA2NjIgcmVsb2FkX291dHNpKzIvMgotTCQwOTg3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTk0IHN3aXRjaF9qdW1wCi1MJDA5ODgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxOTcgc3dpdGNoX2p1bXAKLUwkMDk4OQotCWJsIEwkMDE5NiwlcjAgOyMgOTIwMCBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgwMjcgcmVsb2FkX291dHNpKzIvNQotTCQwOTkwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjAzIHN3aXRjaF9qdW1wCi1MJDA5OTEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMDYgc3dpdGNoX2p1bXAKLUwkMDk5MgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIwOSBzd2l0Y2hfanVtcAotTCQwOTkzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjEyIHN3aXRjaF9qdW1wCi1MJDA5OTQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMTUgc3dpdGNoX2p1bXAKLUwkMDk5NQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIxOCBzd2l0Y2hfanVtcAotTCQwOTk2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjIxIHN3aXRjaF9qdW1wCi1MJDA5OTcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMjQgc3dpdGNoX2p1bXAKLUwkMDk5OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIyNyBzd2l0Y2hfanVtcAotTCQwOTk5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjMwIHN3aXRjaF9qdW1wCi1MJDEwMDAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMzMgc3dpdGNoX2p1bXAKLUwkMTAwMQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIzNiBzd2l0Y2hfanVtcAotTCQxMDAyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjM5IHN3aXRjaF9qdW1wCi1MJDEwMDMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNDIgc3dpdGNoX2p1bXAKLUwkMTAwNAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI0NSBzd2l0Y2hfanVtcAotTCQxMDA1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjQ4IHN3aXRjaF9qdW1wCi1MJDEwMDYKLQlibCBMJDAxMDEsJXIwIDsjIDkyNTEgc3dpdGNoX2p1bXAKLQlsZGkgMTAyNiwlcjE5IDsjIDY2MiByZWxvYWRfb3V0c2krMi8yCi1MJDEwMDcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNTQgc3dpdGNoX2p1bXAKLUwkMTAwOAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI1NyBzd2l0Y2hfanVtcAotTCQxMDA5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjYwIHN3aXRjaF9qdW1wCi1MJDEwMTAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNjMgc3dpdGNoX2p1bXAKLUwkMTAxMQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI2NiBzd2l0Y2hfanVtcAotTCQxMDEyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjY5IHN3aXRjaF9qdW1wCi1MJDEwMTMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNzIgc3dpdGNoX2p1bXAKLUwkMTAxNAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI3NSBzd2l0Y2hfanVtcAotTCQxMDE1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mjc4IHN3aXRjaF9qdW1wCi1MJDEwMTYKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyODEgc3dpdGNoX2p1bXAKLUwkMTAxNwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI4NCBzd2l0Y2hfanVtcAotTCQxMDE4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mjg3IHN3aXRjaF9qdW1wCi1MJDEwMTkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyOTAgc3dpdGNoX2p1bXAKLUwkMTAyMAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI5MyBzd2l0Y2hfanVtcAotTCQxMDIxCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mjk2IHN3aXRjaF9qdW1wCi1MJDEwMjIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyOTkgc3dpdGNoX2p1bXAKLUwkMTAyMwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMwMiBzd2l0Y2hfanVtcAotTCQxMDI0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzA1IHN3aXRjaF9qdW1wCi1MJDEwMjUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMDggc3dpdGNoX2p1bXAKLUwkMTAyNgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMxMSBzd2l0Y2hfanVtcAotTCQxMDI3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzE0IHN3aXRjaF9qdW1wCi1MJDEwMjgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMTcgc3dpdGNoX2p1bXAKLUwkMTAyOQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMyMCBzd2l0Y2hfanVtcAotTCQxMDMwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzIzIHN3aXRjaF9qdW1wCi1MJDEwMzEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMjYgc3dpdGNoX2p1bXAKLUwkMTAzMgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMyOSBzd2l0Y2hfanVtcAotTCQxMDMzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzMyIHN3aXRjaF9qdW1wCi1MJDEwMzQKLQlibCBMJDAyMTYsJXIwIDsjIDkzMzUgc3dpdGNoX2p1bXAKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI0MTggcmVsb2FkX291dHNpKzIvNQotTCQxMDM1Ci0JYmwgTCQwMzg3LCVyMCA7IyA5MzM4IHN3aXRjaF9qdW1wCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAzNzk3IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTAzNgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM0MSBzd2l0Y2hfanVtcAotTCQxMDM3Ci0JYmwgTCQwMDUzLCVyMCA7IyA5MzQ0IHN3aXRjaF9qdW1wCi0JbGR3IC0yNzYoJXIzMCksJXIxIDsjIDg3NzcgcmVsb2FkX291dHNpKzIvNQotTCQxMDM4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzQ3IHN3aXRjaF9qdW1wCi1MJDEwMzkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNTAgc3dpdGNoX2p1bXAKLUwkMTA0MAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM1MyBzd2l0Y2hfanVtcAotTCQxMDQxCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzU2IHN3aXRjaF9qdW1wCi1MJDEwNDIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNTkgc3dpdGNoX2p1bXAKLUwkMTA0MwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM2MiBzd2l0Y2hfanVtcAotTCQxMDQ0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzY1IHN3aXRjaF9qdW1wCi1MJDEwNDUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNjggc3dpdGNoX2p1bXAKLUwkMTA0NgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM3MSBzd2l0Y2hfanVtcAotTCQxMDQ3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mzc0IHN3aXRjaF9qdW1wCi1MJDEwNDgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNzcgc3dpdGNoX2p1bXAKLUwkMTA0OQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM4MCBzd2l0Y2hfanVtcAotTCQxMDUwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzgzIHN3aXRjaF9qdW1wCi1MJDEwNTEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzODYgc3dpdGNoX2p1bXAKLUwkMTA1MgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM4OSBzd2l0Y2hfanVtcAotTCQxMDUzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzkyIHN3aXRjaF9qdW1wCi1MJDEwNTQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzOTUgc3dpdGNoX2p1bXAKLUwkMTA1NQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM5OCBzd2l0Y2hfanVtcAotTCQxMDU2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDAxIHN3aXRjaF9qdW1wCi1MJDEwNTcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MDQgc3dpdGNoX2p1bXAKLUwkMTA1OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQwNyBzd2l0Y2hfanVtcAotTCQxMDU5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDEwIHN3aXRjaF9qdW1wCi1MJDEwNjAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MTMgc3dpdGNoX2p1bXAKLUwkMTA2MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQxNiBzd2l0Y2hfanVtcAotTCQxMDYyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDE5IHN3aXRjaF9qdW1wCi1MJDEwNjMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MjIgc3dpdGNoX2p1bXAKLUwkMTA2NAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQyNSBzd2l0Y2hfanVtcAotTCQxMDY1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDI4IHN3aXRjaF9qdW1wCi1MJDEwNjYKLQlibCBMJDAzODMsJXIwIDsjIDk0MzEgc3dpdGNoX2p1bXAKLQlsZGkgNDYwOCwlcjIwIDsjIDM3NzggcmVsb2FkX291dHNpKzIvMgotTCQxMDY3Ci0JYmwgTCQwMzgwLCVyMAotCW5vcCA7IyA5NDM0IHN3aXRjaF9qdW1wCi1MJDEwNjgKLQlibCxuIEwkMDA3NiwlcjAgOyMgNzg5OSBqdW1wCi1MJDAwNTMKLQlsZHcgLTI5NiglcjMwKSwlcjI1IDsjIDIzNDMgcmVsb2FkX291dHNpKzIvNQotCWxkbyAxKCVyMSksJXIxOSA7IyAzMDYgYWRkc2kzLzIKLQljb21iLD0sbiAlcjE5LCVyMjUsTCQwMDU1IDsjIDMwOCBibGV1KzEKLQliYiw8ICVyMTUsMjgsTCQwMDU1IDsjIDMxMyBibGV1KzMKLQlsZHcgLTI3NiglcjMwKSwlcjI2IDsjIDMxNSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBhdF9iZWdsaW5lX2xvY19wLCVyMiA7IyAzMjEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMTUsJXIyNCA7IyAzMTkgcmVsb2FkX291dHNpKzIvMQotCWV4dHJzICVyMjgsMzEsOCwlcjI4IDsjIDMyNCBleHRlbmRxaXNpMgotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyAzMjYgYmxldSsxCi0JYmwsbiBMJDAwNzYsJXIwCi1MJDAwNTUKLQlsZHcgMCglcjUpLCVyNCA7IyA3OTg2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNzk4OSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3OTg3IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA3OTg4IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwMDYwIDsjIDc5OTAgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NzAxIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDA2MQotCWNvbWNsciw8PiAlcjMsJXIyMCwlcjAgOyMgMzU3IGJsZXUrMQotCWJsIEwkMDk0NCwlcjAKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyAzNjcgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwMDY2IDsjIDM3NSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMzY5IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyAzNzggcmVsb2FkX291dHNpKzIvNgotTCQwMDY2Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDM4NSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAzODkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgMzg3IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMzk3IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAzOTMgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDAwNTkgOyMgNDA3IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDA5IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDQxMiBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDQxMyBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDA2OSA7IyA0MTggYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA0MTYgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA0MTkgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDQyMiBhZGRzaTMvMQotTCQwMDY5Ci0JY29taWIsPSAwLCVyOCxMJDAwNzAgOyMgNDI1IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNDI2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDQyOSBhZGRzaTMvMQotTCQwMDcwCi0JY29taWIsPSAwLCVyOSxMJDAwNTkgOyMgNDMyIGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNDMzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDQzNiBhZGRzaTMvMQotTCQwMDU5Ci0JbGR3IDAoJXI1KSwlcjQgOyMgMzM3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgMzQxIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDMzOCBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMzM5IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMDYxCi0Jbm9wIDsjIDM0MyBibGV1KzEKLUwkMDA2MAotCWxkaSA4LCVyMTkgOyMgNDU4IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNDc5IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDQ1OSBtb3ZxaSsxLzYKLUwkMDA3NwotCWNvbWIsPSxuICVyMTYsJXIyNixMJDAwNzkgOyMgNDg1IGJsZXUrMQotCWJiLDwgJXIxNSwyOCxMJDAwNzkgOyMgNDkwIGJsZXUrMwotCWNvcHkgJXIxNiwlcjI1IDsjIDQ5NCByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBhdF9lbmRsaW5lX2xvY19wLCVyMiA7IyA0OTggY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMTUsJXIyNCA7IyA0OTYgcmVsb2FkX291dHNpKzIvMQotCWV4dHJzICVyMjgsMzEsOCwlcjI4IDsjIDUwMSBleHRlbmRxaXNpMgotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA1MDMgYmxldSsxCi0JYmwsbiBMJDAwNzYsJXIwCi1MJDAwNzkKLQlsZHcgMCglcjUpLCVyNCA7IyA3OTk0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNzk5NyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3OTk1IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA3OTk2IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwMDg0IDsjIDc5OTggYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4Njk5IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDA4NQotCWNvbWNsciw8PiAlcjMsJXIyMCwlcjAgOyMgNTM0IGJsZXUrMQotCWJsIEwkMDk0NCwlcjAKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA1NDQgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwMDkwIDsjIDU1MiBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNTQ2IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA1NTUgcmVsb2FkX291dHNpKzIvNgotTCQwMDkwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDU2MiByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA1NjYgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNTY0IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNTc0IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyA1NzAgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDAwODMgOyMgNTg0IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNTg2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDU4OSBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDU5MCBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDA5MyA7IyA1OTUgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA1OTMgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA1OTYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDU5OSBhZGRzaTMvMQotTCQwMDkzCi0JY29taWIsPSAwLCVyOCxMJDAwOTQgOyMgNjAyIGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNjAzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDYwNiBhZGRzaTMvMQotTCQwMDk0Ci0JY29taWIsPSAwLCVyOSxMJDAwODMgOyMgNjA5IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNjEwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDYxMyBhZGRzaTMvMQotTCQwMDgzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNTE0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNTE4IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDUxNSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNTE2IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMDg1Ci0Jbm9wIDsjIDUyMCBibGV1KzEKLUwkMDA4NAotCWxkaSA5LCVyMTkgOyMgNjM1IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNjU2IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDYzNiBtb3ZxaSsxLzYKLUwkMDg3NwotCWJsIEwkMDExMCwlcjAgOyMgODk3IGp1bXAKLQlzdHcgJXIyMSwtMjk2KCVyMzApIDsjIDIzOTEgcmVsb2FkX291dHNpKzIvNgotTCQwMTAxCi1MJDExNTgKLQlhbmQgJXIxNSwlcjE5LCVyMTkgOyMgNjYzIGFuZHNpMy8xCi0JY29taWNsciw9IDAsJXIxOSwlcjAgOyMgNjY1IGJsZXUrMQotCWJsLG4gTCQwMDc2LCVyMAotTCQwMTA0Ci0JY29taWIsPD4gMCwlcjgsTCQwMTA1IDsjIDY3NCBibGV1KzEKLQlsZGkgMCwlcjEzIDsjIDcxMSByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMsPj0gJXIxNSwyNiwxLCVyMCA7IyA2ODEgYmxldSszCi0JZXh0cnMsPCAlcjE1LDI3LDEsJXIwIDsjIDcwMCBtb3ZzaS00Ci0Jbm9wCi0JYmwsbiBMJDAwNzYsJXIwCi1MJDAxMDUKLQlsZGkgMCwlcjExIDsjIDcxNCByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDAsJXIyMiA7IyA3MTYgcmVsb2FkX291dHNpKzIvMgotCWxkaSA0MywlcjI0IDsjIDg2ODggcmVsb2FkX291dHNpKzIvMgotCWxkaSA2MywlcjIzIDsjIDg2OTAgcmVsb2FkX291dHNpKzIvMgotCWxkaSA0MiwlcjI4IDsjIDg2OTIgcmVsb2FkX291dHNpKzIvMgotCWxkaSAyLCVyMTkgOyMgODY5NCByZWxvYWRfb3V0c2krMi8yCi0JYW5kICVyMTUsJXIxOSwlcjI1IDsjIDg2OTUgYW5kc2kzLzEKLQlsZGkgOTIsJXIyNiA7IyA4Njk3IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDEwOQotCWNvbWIsPSAlcjI0LCVyNyxMJDAxMTIgOyMgNzI3IGJsZXUrMQotCWNvcHkgJXIxMSwlcjE5IDsjIDg3ODAgcmVsb2FkX291dHNpKzIvMQotCWRlcGkgLTEsMzEsMSwlcjE5IDsjIDcyOSBpb3JzaTMrMS8yCi0JYmwgTCQwMTEzLCVyMCA7IyA3MzEganVtcAotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDczMCBleHRlbmRxaXNpMgotTCQwMTEyCi0JZXh0cnMgJXIxMSwzMSw4LCVyMTkgOyMgNzM0IGV4dGVuZHFpc2kyCi1MJDAxMTMKLUwkMTE1OQotCWNvbWIsPSAlcjIzLCVyNyxMJDAxMTQgOyMgNzQ0IGJsZXUrMQotCWNvcHkgJXIxOSwlcjExIDsjIDczNyByZWxvYWRfb3V0c2krMi8xCi0JY29weSAlcjIyLCVyMTkgOyMgODc4MyByZWxvYWRfb3V0c2krMi8xCi0JZGVwaSAtMSwzMSwxLCVyMTkgOyMgNzQ2IGlvcnNpMysxLzIKLQlibCBMJDAxMTUsJXIwIDsjIDc0OCBqdW1wCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgNzQ3IGV4dGVuZHFpc2kyCi1MJDAxMTQKLQlleHRycyAlcjIyLDMxLDgsJXIxOSA7IyA3NTEgZXh0ZW5kcWlzaTIKLUwkMDExNQotCWxkdyAtMjk2KCVyMzApLCVyMjEgOyMgMjM1NSByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIyMSxMJDAxMTAgOyMgNzU3IGJsZXUrMQotCWNvcHkgJXIxOSwlcjIyIDsjIDc1NCByZWxvYWRfb3V0c2krMi8xCi0JY29weSAlcjIxLCVyMjAgOyMgODc0MyByZWxvYWRfb3V0c2krMi8xCi0JbGRicyxtYSAxKCVyMjApLCVyNyA7IyA3NzYgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSAwLCVyMTQsTCQwMTE4IDsjIDc4MSBibGV1KzEKLQlzdHcgJXIyMCwtMjk2KCVyMzApIDsjIDIzNjQgcmVsb2FkX291dHNpKzIvNgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA3ODIgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNzg1IHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwMTE4Ci0JY29tYiw9ICVyMjgsJXI3LEwkMDEwOQotCW5vcCA7IyA4MDIgYmxldSsxCi0JY29taWIsPD4sbiAwLCVyMjUsTCQwODY5IDsjIDgwNyBibGV1KzEKLQljb21iLD0gJXIyNCwlcjcsTCQxMTU5IDsjIDgxMSBibGV1KzEKLQlleHRycyAlcjExLDMxLDgsJXIxOSA7IyA3MzQgZXh0ZW5kcWlzaTIKLQljb21iLD0gJXIyMywlcjcsTCQwMTA5IDsjIDgxNSBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI0MDAgcmVsb2FkX291dHNpKzIvNQotCWJsLG4gTCQxMTYwLCVyMCA7IyA4MjcganVtcAotTCQwODY5Ci0JY29tYiw8PiAlcjI2LCVyNyxMJDAxMjYgOyMgODMxIGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQwMCByZWxvYWRfb3V0c2krMi81Ci0JY29tY2xyLDw+ICVyMTYsJXIyMCwlcjAgOyMgODM1IGJsZXUrMQotCWJsIEwkMDkwMywlcjAKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDg2MyBhZGRzaTMvMgotCWxkYiAxKCVyMjEpLCVyMyA7IyA4NjAgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSAwLCVyMTQsTCQwMTI5IDsjIDg2NSBibGV1KzEKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDIzNzkgcmVsb2FkX291dHNpKzIvNgotCWFkZGwgJXIxNCwlcjMsJXIxOSA7IyA4NjYgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjMgOyMgODY5IHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwMTI5Ci0JY29tYiw9ICVyMjQsJXIzLEwkMDEwOSA7IyA4ODYgYmxldSsxCi0JY29weSAlcjMsJXI3IDsjIDkwMyByZWxvYWRfb3V0c2krMi8xCi0JY29tYiw8PiAlcjIzLCVyMyxMJDA4NzcKLQlub3AgOyMgODkwIGJsZXUrMQotCWJsLG4gTCQwMTA5LCVyMCA7IyA5MDUganVtcAotTCQwMTI2Ci1MJDExNjAKLQlsZG8gLTEoJXIxOSksJXIxOSA7IyA5MTAgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDIzOTcgcmVsb2FkX291dHNpKzIvNgotTCQwMTEwCi0JY29taWNsciw8PiAwLCVyOCwlcjAgOyMgOTI3IGJsZXUrMQotCWJsIEwkMTE2MSwlcjAKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDIzMjggcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0sbiAwLCVyMjIsTCQwMTM3IDsjIDkzNCBibGV1KzEKLQlsZHcgMCglcjUpLCVyMyA7IyA4MDAyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODAwNSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MDAzIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MDA0IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwMTM5IDsjIDgwMDYgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4Njg2IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDE0MAotCWNvbWNsciw8PiAlcjQsJXIyMCwlcjAgOyMgOTYxIGJsZXUrMQotCWJsIEwkMDk0NCwlcjAKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA5NzEgYXNobHNpMysxCi0JY29tYiw+Pj0gJXI0LCVyMTksTCQwMTQ1IDsjIDk3OSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgOTczIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyA5ODIgcmVsb2FkX291dHNpKzIvNgotTCQwMTQ1Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDk4OSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA5OTMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgOTkxIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMTAwMSBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgOTk3IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwMTM4IDsjIDEwMTEgYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxMDEzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDEwMTYgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyAxMDE3IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMTQ4IDsjIDEwMjIgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxMDIwIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgMTAyMyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTAyNiBhZGRzaTMvMQotTCQwMTQ4Ci0JY29taWIsPSAwLCVyOCxMJDAxNDkgOyMgMTAyOSBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDEwMzAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTAzMyBhZGRzaTMvMQotTCQwMTQ5Ci0JY29taWIsPSAwLCVyOSxMJDAxMzggOyMgMTAzNiBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDEwMzcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTA0MCBhZGRzaTMvMQotTCQwMTM4Ci0JbGR3IDAoJXI1KSwlcjMgOyMgOTQxIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgOTQ1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDk0MiBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgOTQzIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMTQwCi0Jbm9wIDsjIDk0NyBibGV1KzEKLUwkMDEzOQotCWNvbWliLD0gMCwlcjE0LEwkMDE1NCA7IyAxMDYzIGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQwMyByZWxvYWRfb3V0c2krMi81Ci0JbGRiIC0yKCVyMTkpLCVyMTkgOyMgMTA2NiB6ZXJvX2V4dGVuZHFpc2kyLzIKLQlhZGRsICVyMTQsJXIxOSwlcjE5IDsjIDEwNjcgYWRkc2kzLzEKLQlibCBMJDA5NDcsJXIwIDsjIDEwNzEganVtcAotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMTA2OSBtb3ZxaSsxLzUKLUwkMDE1NAotCWxkYiAtMiglcjE5KSwlcjE5IDsjIDEwNzUgbW92cWkrMS81Ci1MJDA5NDcKLQljb21pYiw9IDAsJXIxNCxMJDAxNTYgOyMgMTA3OSBibGV1KzEKLQlleHRycyAlcjE5LDMxLDgsJXIyMCA7IyAxMDc2IGV4dGVuZHFpc2kyCi0JbGRiIDQ2KCVyMTQpLCVyMTkgOyMgMTA4MSBtb3ZxaSsxLzUKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAxMDgyIGV4dGVuZHFpc2kyCi0JY29tYiw9ICVyMTksJXIyMCxMJDAxNTcgOyMgMTA4NCBibGV1KzEKLQlsZGkgMTcsJXIyNiA7IyAxMTU5IHJlbG9hZF9vdXRzaSsyLzIKLQlibCxuIEwkMTE2MiwlcjAgOyMgMTA4NSBqdW1wCi1MJDAxNTYKLQlsZGkgNDYsJXIxOSA7IyAxMDg5IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw+ICVyMTksJXIyMCxMJDExNjIgOyMgMTA5MSBibGV1KzEKLQlsZGkgMTcsJXIyNiA7IyAxMTU5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDE1NwotCWNvbWliLD0gMCwlcjExLEwkMDE1MyA7IyAxMDk2IGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQwOSByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw8PD0gJXIxNiwlcjE5LEwkMTE2MiA7IyAxMDk4IGJsZXUrMQotCWxkaSAxNywlcjI2IDsjIDExNTkgcmVsb2FkX291dHNpKzIvMgotCWNvbWliLD0sbiAwLCVyMTQsTCQwMTU4IDsjIDExMDAgYmxldSsxCi0JbGRiIDAoJXIxOSksJXIxOSA7IyAxMTAzIHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjE5LCVyMTkgOyMgMTEwNCBhZGRzaTMvMQotTCQwMTU4Ci0JbGRiIDAoJXIxOSksJXIxOSA7IyAxMTEyIG1vdnFpKzEvNQotCWNvbWliLD0gMCwlcjE0LEwkMDE2MCA7IyAxMTE2IGJsZXUrMQotCWV4dHJzICVyMTksMzEsOCwlcjIwIDsjIDExMTMgZXh0ZW5kcWlzaTIKLQlsZGIgMTAoJXIxNCksJXIxOSA7IyAxMTE4IG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDExMTkgZXh0ZW5kcWlzaTIKLQljb21iLD0gJXIxOSwlcjIwLEwkMDE2MSA7IyAxMTIxIGJsZXUrMQotCWxkaSAxNywlcjI2IDsjIDExNTkgcmVsb2FkX291dHNpKzIvMgotCWJsLG4gTCQxMTYyLCVyMCA7IyAxMTIyIGp1bXAKLUwkMDE2MAotCWNvbWliLDw+IDEwLCVyMjAsTCQxMTYyIDsjIDExMjYgYmxldSsxCi0JbGRpIDE3LCVyMjYgOyMgMTE1OSByZWxvYWRfb3V0c2krMi8yCi1MJDAxNjEKLQliYiw8ICVyMTUsMjUsTCQxMTYyIDsjIDExMzQgYmxldSszCi0JbGRpIDE3LCVyMjYgOyMgMTE1OSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDEyLCVyMjYgOyMgMTE0MCByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjYsJXIyNSA7IyAxMTQyIHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI4LCVyNiwlcjI0IDsjIDExMzcgc3Vic2kzLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0b3JlX29wMSwlcjIgOyMgMTE0NiBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkbyAtMyglcjI0KSwlcjI0IDsjIDExNDQgYWRkc2kzLzIKLQlibCBMJDAxNjIsJXIwIDsjIDExNTEganVtcAotCWxkaSAxLCVyMTMgOyMgMTE0OSByZWxvYWRfb3V0c2krMi8yCi1MJDAxNTMKLQlsZGkgMTcsJXIyNiA7IyAxMTU5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMTE2MgotCWNvcHkgJXI2LCVyMjUgOyMgMTE2MSByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyOCwlcjYsJXIyNCA7IyAxMTU2IHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdG9yZV9vcDEsJXIyIDsjIDExNjUgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZG8gLTYoJXIyNCksJXIyNCA7IyAxMTYzIGFkZHNpMy8yCi1MJDAxNjIKLQlsZG8gMyglcjYpLCVyNiA7IyAxMTY4IGFkZHNpMy8yCi1MJDAxMzcKLQlsZHcgMCglcjUpLCVyMyA7IyA4MDEwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODAxMyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MDExIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MDEyIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwMTY0IDsjIDgwMTQgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4Njg0IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDE2NQotCWNvbWNsciw8PiAlcjQsJXIyMCwlcjAgOyMgMTE5NSBibGV1KzEKLQlibCBMJDA5NDQsJXIwCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTIwNSBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjQsJXIxOSxMJDAxNzAgOyMgMTIxMyBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTIwNyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNCw0KCVyNSkgOyMgMTIxNiByZWxvYWRfb3V0c2krMi82Ci1MJDAxNzAKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTIyMyByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxMjI3IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDEyMjUgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxMjM1IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxMjMxIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwMTYzIDsjIDEyNDUgYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxMjQ3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDEyNTAgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyAxMjUxIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMTczIDsjIDEyNTYgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxMjU0IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgMTI1NyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTI2MCBhZGRzaTMvMQotTCQwMTczCi0JY29taWIsPSAwLCVyOCxMJDAxNzQgOyMgMTI2MyBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDEyNjQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTI2NyBhZGRzaTMvMQotTCQwMTc0Ci0JY29taWIsPSAwLCVyOSxMJDAxNjMgOyMgMTI3MCBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDEyNzEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTI3NCBhZGRzaTMvMQotTCQwMTYzCi0JbGR3IDAoJXI1KSwlcjMgOyMgMTE3NSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDExNzkgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgMTE3NiBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgMTE3NyBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDE2NQotCW5vcCA7IyAxMTgxIGJsZXUrMQotTCQwMTY0Ci0JbGRpIDE0LCVyMjYgOyMgODc4NiByZWxvYWRfb3V0c2krMi8yCi0JY29taWNsciw9IDAsJXIxMywlcjAgOyMgMTMxMCBiZXEtMS8yCi0JbGRpIDE1LCVyMjYKLQljb3B5ICVyOCwlcjI1IDsjIDEzMTIgcmVsb2FkX291dHNpKzIvMQotCXN1YiAlcjYsJXI4LCVyMjQgOyMgMTMxNCBzdWJzaTMvMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5zZXJ0X29wMSwlcjIgOyMgMTMxOCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI2LCVyMjMgOyMgMTMxNiByZWxvYWRfb3V0c2krMi8xCi0JbGRpIDAsJXI5IDsjIDEzMjEgcmVsb2FkX291dHNpKzIvMgotCWNvbWliLDw+IDAsJXIxMSxMJDAwNDMgOyMgMTMyNiBibGV1KzEKLQlsZG8gMyglcjYpLCVyNiA7IyAxMzIzIGFkZHNpMy8yCi0JbGR3IDAoJXI1KSwlcjMgOyMgODAxOSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgwMjIgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgODAyMCBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgODAyMSBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDE4MiA7IyA4MDIzIGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjQgOyMgODY4MiByZWxvYWRfb3V0c2krMi8zCi1MJDAxODMKLQljb21iLD0gJXI0LCVyMjAsTCQwOTQ0IDsjIDEzNTIgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTM2MiBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjQsJXIxOSxMJDAxODggOyMgMTM3MCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTM2NCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNCw0KCVyNSkgOyMgMTM3MyByZWxvYWRfb3V0c2krMi82Ci1MJDAxODgKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTM4MCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxMzg0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDEzODIgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxMzkyIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxMzg4IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwMTgxIDsjIDE0MDIgYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxNDA0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDE0MDcgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyAxNDA4IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMTkxIDsjIDE0MTMgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxNDExIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgMTQxNCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTQxNyBhZGRzaTMvMQotTCQwMTkxCi0JY29taWIsPSAwLCVyOCxMJDAxOTIgOyMgMTQyMCBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDE0MjEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTQyNCBhZGRzaTMvMQotTCQwMTkyCi0JY29taWIsPSAwLCVyOSxMJDAxODEgOyMgMTQyNyBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDE0Mjggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTQzMSBhZGRzaTMvMQotTCQwMTgxCi0JbGR3IDAoJXI1KSwlcjMgOyMgMTMzMiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDEzMzYgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgMTMzMyBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgMTMzNCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDE4MwotCW5vcCA7IyAxMzM4IGJsZXUrMQotTCQwMTgyCi0JbGRpIDE4LCVyMjYgOyMgMTQ1NCByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjgsJXIyNSA7IyAxNDU2IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMywlcjI0IDsjIDE0NTggcmVsb2FkX291dHNpKzIvMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5zZXJ0X29wMSwlcjIgOyMgMTQ2MiBjYWxsX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI2LCVyMjMgOyMgMTQ2MCByZWxvYWRfb3V0c2krMi8xCi0JYmwgTCQwMDQzLCVyMCA7IyAxNDcwIGp1bXAKLQlsZG8gMyglcjYpLCVyNiA7IyAxNDY0IGFkZHNpMy8yCi1MJDAxOTYKLQlsZHcgNCglcjUpLCVyMjAgOyMgODAzMCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MDI4IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MDI5IGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDIwMSA7IyA4MDMxIGJsZXUrMQotCWNvcHkgJXI2LCVyOCA7IyAxNDc1IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg2ODAgcmVsb2FkX291dHNpKzIvMwotTCQwMjAyCi0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyAxNTAzIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDE1MTMgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwMjA3IDsjIDE1MjEgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDE1MTUgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDE1MjQgcmVsb2FkX291dHNpKzIvNgotTCQwMjA3Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDE1MzEgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgMTUzNSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyAxNTMzIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMTU0MyBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgMTUzOSByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDIwMCA7IyAxNTUzIGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMTU1NSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyAxNTU4IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgMTU1OSBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDIxMCA7IyAxNTY0IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgMTU2MiBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDE1NjUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDE1NjggYWRkc2kzLzEKLUwkMDIxMAotCWNvbWliLD0gMCwlcjgsTCQwMjExIDsjIDE1NzEgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyAxNTcyIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDE1NzUgYWRkc2kzLzEKLUwkMDIxMQotCWNvbWliLD0gMCwlcjksTCQwMjAwIDsjIDE1NzggYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyAxNTc5IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDE1ODIgYWRkc2kzLzEKLUwkMDIwMAotCWxkdyAwKCVyNSksJXI0IDsjIDE0ODMgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyAxNDg3IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDE0ODQgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDE0ODUgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAyMDIKLQlub3AgOyMgMTQ4OSBibGV1KzEKLUwkMDIwMQotCWxkaSAyLCVyMTkgOyMgMTYwNCBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDE2MTcganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgMTYwNSBtb3ZxaSsxLzYKLUwkMDIxNgotCWNvbWIsPSAlcjE2LCVyMTksTCQwOTAyIDsjIDE2MjYgYmxldSsxCi0JbGRpIDAsJXIxMyA7IyAxNjIzIHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgMCglcjUpLCVyMyA7IyA4MDM1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODAzOCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MDM2IHN1YnNpMy8xCi0JbGRvIDM0KCVyMTkpLCVyMTkgOyMgODAzNyBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDAyMTkgOyMgODAzOSBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXI0IDsjIDg2NzggcmVsb2FkX291dHNpKzIvMwotTCQwMjIwCi0JY29tYiw9ICVyNCwlcjIwLEwkMDk0NCA7IyAxNjYxIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDE2NzEgYXNobHNpMysxCi0JY29tYiw+Pj0gJXI0LCVyMTksTCQwMjI1IDsjIDE2NzkgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDE2NzMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjQsNCglcjUpIDsjIDE2ODIgcmVsb2FkX291dHNpKzIvNgotTCQwMjI1Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDE2ODkgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgMTY5MyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyAxNjkxIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMTcwMSBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgMTY5NyByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXIzLEwkMDIxOCA7IyAxNzExIGJsZXUrMQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgMTcxMyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyAxNzE2IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXIzLCVyMTkgOyMgMTcxNyBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDIyOCA7IyAxNzIyIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgMTcyMCBhZGRzaTMvMQotCXN1YiAlcjEwLCVyMywlcjE5IDsjIDE3MjMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDE3MjYgYWRkc2kzLzEKLUwkMDIyOAotCWNvbWliLD0gMCwlcjgsTCQwMjI5IDsjIDE3MjkgYmxldSsxCi0Jc3ViICVyOCwlcjMsJXIxOSA7IyAxNzMwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDE3MzMgYWRkc2kzLzEKLUwkMDIyOQotCWNvbWliLD0gMCwlcjksTCQwMjE4IDsjIDE3MzYgYmxldSsxCi0Jc3ViICVyOSwlcjMsJXIxOSA7IyAxNzM3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDE3NDAgYWRkc2kzLzEKLUwkMDIxOAotCWxkdyAwKCVyNSksJXIzIDsjIDE2NDEgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyAxNjQ1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDE2NDIgc3Vic2kzLzEKLQlsZG8gMzQoJXIxOSksJXIxOSA7IyAxNjQzIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMjIwCi0Jbm9wIDsjIDE2NDcgYmxldSsxCi1MJDAyMTkKLQlsZHcgMCglcjUpLCVyNCA7IyA4MDQzIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODA0NiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MDQ0IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MDQ1IGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDIzNyA7IyA4MDQ3IGJsZXUrMQotCWNvcHkgJXI2LCVyOCA7IyAxNzYzIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg2NzYgcmVsb2FkX291dHNpKzIvMwotTCQwMjM4Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyAxNzkxIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDE4MDEgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwMjQzIDsjIDE4MDkgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDE4MDMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDE4MTIgcmVsb2FkX291dHNpKzIvNgotTCQwMjQzCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDE4MTkgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgMTgyMyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyAxODIxIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMTgzMSBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgMTgyNyByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDIzNiA7IyAxODQxIGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMTg0MyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyAxODQ2IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgMTg0NyBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDI0NiA7IyAxODUyIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgMTg1MCBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDE4NTMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDE4NTYgYWRkc2kzLzEKLUwkMDI0NgotCWNvbWliLD0gMCwlcjgsTCQwMjQ3IDsjIDE4NTkgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyAxODYwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDE4NjMgYWRkc2kzLzEKLUwkMDI0NwotCWNvbWliLD0gMCwlcjksTCQwMjM2IDsjIDE4NjYgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyAxODY3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDE4NzAgYWRkc2kzLzEKLUwkMDIzNgotCWxkdyAwKCVyNSksJXI0IDsjIDE3NzEgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyAxNzc1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDE3NzIgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDE3NzMgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAyMzgKLQlub3AgOyMgMTc3NyBibGV1KzEKLUwkMDIzNwotCWNvcHkgJXI2LCVyMjIgOyMgMTkwOSByZWxvYWRfb3V0c2krMi8xCi0JbGRvIDEoJXI2KSwlcjYgOyMgMTg5MSBhZGRzaTMvMgotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQyMSByZWxvYWRfb3V0c2krMi81Ci0JbGRiIDAoJXIxOSksJXIxOSA7IyAxODkzIG1vdnFpKzEvNQotCWxkaSA5NCwlcjIxIDsjIDE4OTYgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDE4OTQgZXh0ZW5kcWlzaTIKLQljb21iLDw+ICVyMjEsJXIxOSxMJDAyNTEgOyMgMTg5OCBibGV1KzEKLQlsZGkgMywlcjIwIDsjIDgwNTEgbW92cWkrMS8yCi0JbGRpIDQsJXIyMCA7IyAxOTAwIG1vdnFpKzEvMgotTCQwMjUxCi0Jc3RiICVyMjAsMCglcjIyKSA7IyAxOTExIG1vdnFpKzEvNgotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjQyNCByZWxvYWRfb3V0c2krMi81Ci0JbGRiIDAoJXIyMCksJXIxOSA7IyAxOTIzIG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDE5MjQgZXh0ZW5kcWlzaTIKLQljb21iLDw+ICVyMjEsJXIxOSxMJDAyNTQgOyMgMTkyOCBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDE5MzAgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDI0MjcgcmVsb2FkX291dHNpKzIvNgotTCQwMjU0Ci0JbGR3IDAoJXI1KSwlcjQgOyMgODA1MiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgwNTUgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjk2KCVyMzApLCVyMSA7IyAyNDMzIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgwNTMgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgwNTQgYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwMjU5IDsjIDgwNTYgYmxldSsxCi0Jc3R3ICVyMSwtMjY4KCVyMzApIDsjIDg3ODkgcmVsb2FkX291dHNpKzIvNgotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODY3NCByZWxvYWRfb3V0c2krMi8zCi1MJDAyNjAKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDE5NjIgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTk3MiBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDAyNjUgOyMgMTk4MCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTk3NCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgMTk4MyByZWxvYWRfb3V0c2krMi82Ci1MJDAyNjUKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTk5MCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxOTk0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDE5OTIgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAyMDAyIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxOTk4IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwMjU4IDsjIDIwMTIgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyAyMDE0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDIwMTcgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyAyMDE4IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMjY4IDsjIDIwMjMgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAyMDIxIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgMjAyNCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMjAyNyBhZGRzaTMvMQotTCQwMjY4Ci0JY29taWIsPSAwLCVyOCxMJDAyNjkgOyMgMjAzMCBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDIwMzEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMjAzNCBhZGRzaTMvMQotTCQwMjY5Ci0JY29taWIsPSAwLCVyOSxMJDAyNTggOyMgMjAzNyBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDIwMzggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMjA0MSBhZGRzaTMvMQotTCQwMjU4Ci0JbGR3IDAoJXI1KSwlcjQgOyMgMTk0MiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDE5NDYgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMTk0MyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMTk0NCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDI2MAotCW5vcCA7IyAxOTQ4IGJsZXUrMQotTCQwMjU5Ci0JbGRpIDMyLCVyMTkgOyMgMjA2MyBtb3ZxaSsxLzIKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDIwNjQgbW92cWkrMS82Ci0JY29weSAlcjYsJXIyNiA7IyAyMDc3IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMCwlcjI1IDsjIDIwNzkgcmVsb2FkX291dHNpKzIvMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMiA7IyAyMDgzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGRpIDMyLCVyMjQgOyMgMjA4MSByZWxvYWRfb3V0c2krMi8yCi0JbGRiIC0yKCVyNiksJXIxOSA7IyAyMDg3IHplcm9fZXh0ZW5kcWlzaTIvMgotCWNvbWliLDw+IDQsJXIxOSxMJDAyNzQgOyMgMjA4OSBibGV1KzEKLQlsZGkgOTMsJXIxNyA7IyA4NjIyIHJlbG9hZF9vdXRzaSsyLzIKLQliYiw+PSxuICVyMTUsMjMsTCQwMjc0IDsjIDIwOTQgbW92c2ktNAotCWxkYiAxKCVyNiksJXIxOSA7IyAyMDk3IG1vdnFpKzEvNQotCWRlcGkgLTEsMjksMSwlcjE5IDsjIDIwOTkgaW9yc2kzKzEvMgotCXN0YiAlcjE5LDEoJXI2KSA7IyAyMTAxIG1vdnFpKzEvNgotTCQwMjc0Ci0JbGRpIDQsJXIxOCA7IyA4NjI4IHJlbG9hZF9vdXRzaSsyLzIKLQlhbmQgJXIxNSwlcjE4LCVyMSA7IyA4NjI5IGFuZHNpMy8xCi0Jc3R3ICVyMSwtMjUyKCVyMzApIDsjIDg3OTIgcmVsb2FkX291dHNpKzIvNgotCWxkbyAtMjg4KCVyMzApLCVyMTEgOyMgODYzMiBhZGRzaTMvMgotTCQwMjc1Ci0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNDM2IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE2NQotCWNvbWIsPSAlcjE2LCVyMjAsTCQwOTAyIDsjIDIxMDkgYmxldSsxCi0JY29weSAlcjIwLCVyMjEgOyMgODc0NSByZWxvYWRfb3V0c2krMi8xCi0JbGRicyxtYSAxKCVyMjEpLCVyNyA7IyAyMTM0IHplcm9fZXh0ZW5kcWlzaTIvMgotCWNvbWliLD0gMCwlcjE0LEwkMDI4MCA7IyAyMTM5IGJsZXUrMQotCXN0dyAlcjIxLC0yOTYoJXIzMCkgOyMgMjQ0NSByZWxvYWRfb3V0c2krMi82Ci0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDIxNDAgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgMjE0MyB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDI4MAotCWJiLD49ICVyMTUsMzEsTCQwMjg1IDsjIDIxNTkgbW92c2ktNAotCWxkaSA5MiwlcjE5IDsjIDIxNjEgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4sbiAlcjE5LCVyNyxMJDAyODUgOyMgMjE2MyBibGV1KzEKLQljb21iLD0gJXIxNiwlcjIxLEwkMDkwMyA7IyAyMTY3IGJsZXUrMQotCWxkbyAxKCVyMjEpLCVyMTkgOyMgMjE5NSBhZGRzaTMvMgotCWxkYiAxKCVyMjApLCVyMyA7IyAyMTkyIHplcm9fZXh0ZW5kcWlzaTIvMgotCWNvbWliLD0gMCwlcjE0LEwkMDI4OCA7IyAyMTk3IGJsZXUrMQotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjQ2MCByZWxvYWRfb3V0c2krMi82Ci0JYWRkbCAlcjE0LCVyMywlcjE5IDsjIDIxOTggYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjMgOyMgMjIwMSB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDI4OAotCWV4dHJ1ICVyMywyOCwyOSwlcjE5IDsjIDIyMTYgbHNocnNpMy8yCi0JYWRkbCAlcjYsJXIxOSwlcjE5IDsjIDIyMTkgYWRkc2kzLzEKLQlibCBMJDA5NDgsJXIwIDsjIDIyMzUganVtcAotCWV4dHJ1ICVyMywzMSwzLCVyMjAgOyMgMjIyMiBhbmRzaTMvMQotTCQwMjg1Ci0JY29tYiw8PixuICVyMTcsJXI3LEwkMDI5MyA7IyAyMjQzIGJsZXUrMQotCWxkdyAtMjY4KCVyMzApLCVyMSA7IyA4Nzk4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI0NjYgcmVsb2FkX291dHNpKzIvNQotCWxkbyAxKCVyMSksJXIxOSA7IyAyMjQ0IGFkZHNpMy8yCi0JY29tYiw8PixuICVyMTksJXIyMCxMJDAyNzYgOyMgMjI0NiBibGV1KzEKLUwkMDI5MwotCWNvbWliLD0gMCwlcjEzLEwkMDI5NCA7IyAyMjUzIGJsZXUrMQotCWxkaSA0NSwlcjEgOyMgODgwMSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PiAlcjEsJXI3LEwkMTE2MyA7IyAyMjU3IGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjUyNCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDY5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDIyNTkgbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMjI2MCBleHRlbmRxaXNpMgotCWNvbWIsPD4sbiAlcjE3LCVyMTksTCQwODk1IDsjIDIyNjQgYmxldSsxCi1MJDAyOTQKLQlsZGkgNDUsJXIxIDsjIDg4MDQgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4gJXIxLCVyNyxMJDExNjMgOyMgMjI4MCBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI1MjQgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjc2KCVyMzApLCVyMSA7IyA4ODA3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZG8gLTIoJXIyMCksJXIxOSA7IyAyMjgxIGFkZHNpMy8yCi0JY29tYiw+PixuICVyMSwlcjE5LEwkMTE3OSA7IyAyMjgzIGJsZXUrMQotCWxkYiAtMiglcjIwKSwlcjE5IDsjIDIyODUgbW92cWkrMS81Ci0JbGRpIDkxLCVyMSA7IyA4ODEwIHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyMjg2IGV4dGVuZHFpc2kyCi0JY29tYiw9ICVyMSwlcjE5LEwkMTE2MyA7IyAyMjkwIGJsZXUrMQotCWxkdyAtMjc2KCVyMzApLCVyMSA7IyA4ODEzIHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE3OQotCWxkbyAtMyglcjIwKSwlcjE5IDsjIDIyOTQgYWRkc2kzLzIKLQljb21iLD4+LG4gJXIxLCVyMTksTCQwMjk3IDsjIDIyOTYgYmxldSsxCi0JbGRiIC0zKCVyMjApLCVyMTkgOyMgMjI5OCBtb3ZxaSsxLzUKLQlsZGkgOTEsJXIxIDsjIDg4MTYgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDIyOTkgZXh0ZW5kcWlzaTIKLQljb21iLDw+ICVyMSwlcjE5LEwkMTE2NCA7IyAyMzAzIGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQ4NyByZWxvYWRfb3V0c2krMi81Ci0JbGRiIC0yKCVyMjApLCVyMTkgOyMgMjMwNSBtb3ZxaSsxLzUKLQlsZGkgOTQsJXIyMCA7IyAyMzA4IHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyMzA2IGV4dGVuZHFpc2kyCi0JY29tYiw9ICVyMjAsJXIxOSxMJDExNjMgOyMgMjMxMCBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI1MjQgcmVsb2FkX291dHNpKzIvNQotTCQwMjk3Ci0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDg3IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE2NAotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMjMxNSBtb3ZxaSsxLzUKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyMzE2IGV4dGVuZHFpc2kyCi0JY29tYiw8PiAlcjE3LCVyMTksTCQwMzAyIDsjIDIzMjAgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNTI0IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE2MwotCWxkYiAwKCVyMjApLCVyMTkgOyMgMjUyNiBtb3ZxaSsxLzUKLQlsZGkgNDUsJXIxIDsjIDg4MTkgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDI1MjcgZXh0ZW5kcWlzaTIKLQljb21iLDw+LG4gJXIxLCVyMTksTCQwMzAwIDsjIDI1MzEgYmxldSsxCi0JbGRiIDEoJXIyMCksJXIxOSA7IyAyNTM1IG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDI1MzYgZXh0ZW5kcWlzaTIKLQljb21iLD0sbiAlcjE3LCVyMTksTCQwMzAwIDsjIDI1NDAgYmxldSsxCi0JY29tYiw9ICVyMTYsJXIyMCxMJDA5MjIgOyMgMjU1MCBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDI1NTkgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDI1NjEgcmVsb2FkX291dHNpKzIvNgotTCQwMzAyCi0Jc3R3ICVyNiwtNTIoJXIzMCkgOyMgMjU4OCByZWxvYWRfb3V0c2krMi82Ci0JbGRvIC0yOTYoJXIzMCksJXIyNiA7IyAyNTkwIGFkZHNpMy8yCi0JY29weSAlcjE2LCVyMjUgOyMgMjU5MiByZWxvYWRfb3V0c2krMi8xCi0JY29weSAlcjE0LCVyMjQgOyMgMjU5NCByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBjb21waWxlX3JhbmdlLCVyMiA7IyAyNTk4IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjE1LCVyMjMgOyMgMjU5NiByZWxvYWRfb3V0c2krMi8xCi0JbW92Yiw9ICVyMjgsJXI0LEwkMTE2NSA7IyAyNjAzIGRlY3JlbWVudF9hbmRfYnJhbmNoX3VudGlsX3plcm8rMi8xCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNDM2IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDI2MDcgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDI2MDUgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgMjYxMSBqdW1wCi0JY29weSAlcjQsJXIyOCA7IyAyNjA5IHJlbG9hZF9vdXRzaSsyLzEKLUwkMDMwMAotCWxkdyAtMjUyKCVyMzApLCVyMSA7IyA4ODIyIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDMwOSA7IyAyNjI0IGJsZXUrMQotCWxkaSA5MSwlcjEgOyMgODgyNSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PiAlcjEsJXI3LEwkMTE2NiA7IyAyNjI4IGJsZXUrMQotCWxkaSAwLCVyMTMgOyMgMzYyNCByZWxvYWRfb3V0c2krMi8yCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNjMwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgMCglcjIwKSwlcjE5IDsjIDI2MzIgbW92cWkrMS81Ci0JbGRpIDU4LCVyMSA7IyA4ODI4IHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyNjMzIGV4dGVuZHFpc2kyCi0JY29tYiw8PixuICVyMSwlcjE5LEwkMTE2NiA7IyAyNjM3IGJsZXUrMQotCWNvbWIsPSAlcjE2LCVyMjAsTCQwOTIyIDsjIDI2NDcgYmxldSsxCi0JbGRvIDEoJXIyMCksJXIxOSA7IyAyNjU2IGFkZHNpMy8yCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyAyNjU4IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIxNiwlcjE5LEwkMDkwMiA7IyAyNjg5IGJsZXUrMQotCWxkaSAwLCVyMyA7IyAyNjg0IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDMxNwotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjcwOSByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIxOSxMJDA5MjIgOyMgMjcxMSBibGV1KzEKLQlsZG8gMSglcjE5KSwlcjIwIDsjIDI3MjAgYWRkc2kzLzIKLQlzdHcgJXIyMCwtMjk2KCVyMzApIDsjIDI3MjIgcmVsb2FkX291dHNpKzIvNgotCWNvbWliLD0gMCwlcjE0LEwkMDMyMSA7IyAyNzI5IGJsZXUrMQotCWxkYiAwKCVyMTkpLCVyNyA7IyAyNzI1IHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyAyNzMwIGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDI3MzMgemVyb19leHRlbmRxaXNpMi8yCi1MJDAzMjEKLQlsZGkgNTgsJXIxIDsjIDg4MzEgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSAlcjEsJXI3LEwkMTE2NyA7IyAyNzUwIGJsZXUrMQotCWFkZGwgJXIxMSwlcjMsJXIxOSA7IyAyNzg5IGFkZHNpMy8xCi0JY29tYiw9LG4gJXIxNywlcjcsTCQxMTY3IDsjIDI3NTQgYmxldSsxCi0JY29tYiw9LG4gJXIxNiwlcjIwLEwkMTE2NyA7IyAyNzU4IGJsZXUrMQotCWNvbWliLD0gNiwlcjMsTCQxMTY3IDsjIDI3NjAgYmxldSsxCi0JY29weSAlcjMsJXIyMCA7IyAyNzcwIHJlbG9hZF9vdXRzaSsyLzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDI3NzEgYWRkc2kzLzIKLQlleHRydSAlcjE5LDMxLDgsJXIzIDsjIDI3NzIgemVyb19leHRlbmRxaXNpMi8xCi0JYWRkbCAlcjExLCVyMjAsJXIyMCA7IyAyNzc2IGFkZHNpMy8xCi0JYmwgTCQwMzE3LCVyMCA7IyAyNzgzIGp1bXAKLQlzdGIgJXI3LDAoJXIyMCkgOyMgMjc3OCBtb3ZxaSsxLzYKLUwkMTE2NwotCWNvbWIsPD4gJXIxLCVyNyxMJDAzMjggOyMgMjc5NiBibGV1KzEKLQlzdGIgJXIwLDAoJXIxOSkgOyMgMjc5MSBtb3ZxaSsxLzYKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI3OTggcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMjgwMCBtb3ZxaSsxLzUKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyODAxIGV4dGVuZHFpc2kyCi0JY29tYiw8PiAlcjE3LCVyMTksTCQxMTY4IDsjIDI4MDUgYmxldSsxCi0JbGRpIDI1NSwlcjE5IDsjIDgwNjkgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXIxMSwlcjI2IDsjIDI4MTMgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxNiwlcjEgOyMgODgzNSBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTYoJXIxKSwlcjEgOyMgODgzNiBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI4MTcgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDI4MTUgcmVsb2FkX291dHNpKzIvMQotCWNvcHkgJXIxMSwlcjI2IDsjIDI4MjkgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxNywlcjEgOyMgODgzNyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTcoJXIxKSwlcjEgOyMgODgzOCBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyODMxIHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI4MjEgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyODMzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTI0NCglcjMwKSA7IyA4ODQxIHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyODQ1IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMTgsJXIxIDsjIDg4NDIgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDE4KCVyMSksJXIxIDsjIDg4NDMgbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjg0NyByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyODM3IHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjg0OSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0yMzYoJXIzMCkgOyMgODg0NiByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjg2MSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE5LCVyMSA7IyA4ODQ3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxOSglcjEpLCVyMSA7IyA4ODQ4IG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI4NjMgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjg1MyBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI4NjUgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMjI4KCVyMzApIDsjIDg4NTEgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI4NzcgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyMCwlcjEgOyMgODg1MiBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjAoJXIxKSwlcjEgOyMgODg1MyBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyODc5IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI4Njkgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyODgxIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTIyMCglcjMwKSA7IyA4ODU2IHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyODkzIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjEsJXIxIDsjIDg4NTcgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDIxKCVyMSksJXIxIDsjIDg4NTggbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjg5NSByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyODg1IHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjg5NyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0yMTIoJXIzMCkgOyMgODg2MSByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjkwOSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIyLCVyMSA7IyA4ODYyIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMiglcjEpLCVyMSA7IyA4ODYzIG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI5MTEgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjkwMSBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI5MTMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMjA0KCVyMzApIDsjIDg4NjYgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI5MjUgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyMywlcjEgOyMgODg2NyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjMoJXIxKSwlcjEgOyMgODg2OCBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyOTI3IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI5MTcgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyOTI5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTE5NiglcjMwKSA7IyA4ODcxIHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyOTQxIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjQsJXIxIDsjIDg4NzIgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDI0KCVyMSksJXIxIDsjIDg4NzMgbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjk0MyByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyOTMzIHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjk0NSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0xODgoJXIzMCkgOyMgODg3NiByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjk1NyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDI1LCVyMSA7IyA4ODc3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyNSglcjEpLCVyMSA7IyA4ODc4IG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI5NTkgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjk0OSBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI5NjEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMTgwKCVyMzApIDsjIDg4ODEgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI5NzMgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyNiwlcjE5IDsjIDI5NzAgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDI2KCVyMTkpLCVyMyA7IyAyOTcxIG1vdmhpLTIKLQljb3B5ICVyMywlcjI1IDsjIDI5NzUgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjk2NSBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI5NzcgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMTcyKCVyMzApIDsjIDg4ODQgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI5ODkgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyNywlcjE5IDsjIDI5ODYgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDI3KCVyMTkpLCVyNCA7IyAyOTg3IG1vdmhpLTIKLQljb21pY2xyLDw+IDAsJXIyOCwlcjEzIDsjIDI5ODEgc2NjCi0JbGRpIDEsJXIxMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyOTkzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjQsJXIyNSA7IyAyOTkxIHJlbG9hZF9vdXRzaSsyLzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDA1IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMTcsJXIxIDsjIDg4ODUgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDE3KCVyMSksJXIxIDsjIDg4ODYgbW92aGktMgotCWNvbWljbHIsPD4gMCwlcjI4LCVyNyA7IyAyOTk3IHNjYwotCWxkaSAxLCVyNwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAzMDA5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjEsJXIyNSA7IyAzMDA3IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzAxMyBibGV1KzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDE4IHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzAyMiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIzLCVyMjUgOyMgMzAyMCByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwMjYgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzAzMSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIyLCVyMSA7IyA4ODg3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMiglcjEpLCVyMSA7IyA4ODg4IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzAzNSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzAzMyByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwMzkgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzA0NCByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIwLCVyMSA7IyA4ODg5IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMCglcjEpLCVyMSA7IyA4ODkwIG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzA0OCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzA0NiByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwNTIgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzA1NyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE2LCVyMSA7IyA4ODkxIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxNiglcjEpLCVyMSA7IyA4ODkyIG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzA2MSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzA1OSByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwNjUgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzA3MCByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMwNzQgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyNCwlcjI1IDsjIDMwNzIgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMDc4IGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMwODMgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyNSwlcjEgOyMgODg5MyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjUoJXIxKSwlcjEgOyMgODg5NCBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMwODcgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMwODUgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMDkxIGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMwOTYgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyMywlcjEgOyMgODg5NSBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjMoJXIxKSwlcjEgOyMgODg5NiBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMxMDAgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMwOTggcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMTA0IGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMxMDkgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyNCwlcjEgOyMgODg5NyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjQoJXIxKSwlcjEgOyMgODg5OCBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMxMTMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMxMTEgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMTE3IGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMxMjIgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyMSwlcjEgOyMgODg5OSBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjEoJXIxKSwlcjEgOyMgODkwMCBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMxMjYgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMxMjQgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMTMwIGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMxMzUgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxOSwlcjEgOyMgODkwMSBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTkoJXIxKSwlcjEgOyMgODkwMiBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMxMzkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMxMzcgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMTQzIGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMxNDggcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxOCwlcjEgOyMgODkwMyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTgoJXIxKSwlcjEgOyMgODkwNCBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMxNTIgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMxNTAgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLDw+LG4gMCwlcjI4LEwkMDkwMCA7IyAzMTU2IGJsZXUrMQotTCQwMzI5Ci0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAzMTczIHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjE5LEwkMDkyMiA7IyAzMTc1IGJsZXUrMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMzE4NCBhZGRzaTMvMgotCWNvbWIsPSAlcjE2LCVyMTksTCQwOTAyIDsjIDMyMTQgYmxldSsxCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyAzMTg2IHJlbG9hZF9vdXRzaSsyLzYKLQlsZGkgMCwlcjIyIDsjIDMyMjcgcmVsb2FkX291dHNpKzIvMgotCWFkZGlsIExSJ19fYWxudW0tJGdsb2JhbCQsJXIyNyA7IyA4NTk2IHBpYzJfbG9fc3VtKzEKLQljb3B5ICVyMSwlcjIgOyMgODkwNyByZWxvYWRfb3V0c2krMi8xCi0JYWRkaWwgTFInX19jdHlwZTItJGdsb2JhbCQsJXIyNyA7IyA4NTk4IHBpYzJfbG9fc3VtKzEKLQljb3B5ICVyMSwlcjIzIDsjIDg5MTAgcmVsb2FkX291dHNpKzIvMQotCWFkZGlsIExSJ19fY3R5cGUtJGdsb2JhbCQsJXIyNyA7IyA4NjAwIHBpYzJfbG9fc3VtKzEKLQljb3B5ICVyMSwlcjQgOyMgODkxMyByZWxvYWRfb3V0c2krMi8xCi0JbGRpIDMyLCVyMjUgOyMgODYwNSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDIsJXIyNCA7IyA4NjA3IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMTYsJXIzMSA7IyA4NjA5IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgOCwlcjI5IDsjIDg2MTEgcmVsb2FkX291dHNpKzIvMgotCWxkaSAxMjgsJXIyOCA7IyA4NjEzIHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMjU1LCVyMjYgOyMgODYxNSByZWxvYWRfb3V0c2krMi8yCi0JbGR3IC0yNDQoJXIzMCksJXIxIDsjIDg5MTYgcmVsb2FkX291dHNpKzIvNQotTCQxMTczCi0JY29taWIsPSxuIDAsJXIxLEwkMDM0MyA7IyAzMjQwIGJsZXUrMQotCXN0dyAlcjIyLFJSJ19fYWxudW0tJGdsb2JhbCQoJXIyKSA7IyAzMjQ0IHJlbG9hZF9vdXRzaSsyLzYKLQlsZHcgUlInX19jdHlwZTItJGdsb2JhbCQoJXIyMyksJXIxOSA7IyAzMjQ4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjQpLCVyMjEgOyMgMzI2MCByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzMjUzIGFkZHNpMy8xCi0JYWRkbCAlcjIxLCVyMjIsJXIyMSA7IyAzMjY1IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIyMCA7IyAzMjU1IG1vdnFpKzEvNQotCWxkYiAwKCVyMjEpLCVyMTkgOyMgMzI2NyBtb3ZxaSsxLzUKLQlleHRydSAlcjIwLDMxLDEsJXIyMCA7IyAzMjU2IGFuZHNpMy8xCi0JYW5kICVyMTksJXIxOCwlcjE5IDsjIDMyNzAgYW5kc2kzLzEKLQlvciAlcjIwLCVyMTksJXIyMCA7IyAzMjc4IHhvcmRpMy0xCi0JY29taWIsPD4gMCwlcjIwLEwkMTE2OSA7IyAzMjgwIGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDMzMzAgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNDMKLQlsZHcgLTIzNiglcjMwKSwlcjEgOyMgODkxOSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMSxMJDAzNDQgOyMgMzI4NSBibGV1KzEKLQlsZHcgUlInX19jdHlwZTItJGdsb2JhbCQoJXIyMyksJXIxOSA7IyAzMjg5IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDMyOTAgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDMyOTIgbW92cWkrMS81Ci0JYmIsPCAlcjE5LDMxLEwkMTE2OSA7IyAzMjk2IGJsZXUrMwotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDMzMzAgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNDQKLQlsZHcgLTIyOCglcjMwKSwlcjEgOyMgODkyMiByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSxuIDAsJXIxLEwkMDM0NSA7IyAzMzAxIGJsZXUrMQotCWNvbWIsPSAlcjI1LCVyMjIsTCQxMTY5IDsjIDMzMDUgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzMzMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLQljb21pYiw9IDksJXIyMixMJDExNzAgOyMgMzMwNyBibGV1KzEKLQlleHRydSAlcjE5LDI4LDI5LCVyMjEgOyMgMzMzMiBsc2hyc2kzLzIKLUwkMDM0NQotCWxkdyAtMjIwKCVyMzApLCVyMSA7IyA4OTI1IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM0MSA7IyAzMzEyIGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzMzE2IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDMzMTcgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDMzMTkgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyNSwlcjE5IDsjIDMzMjIgYW5kc2kzLzEKLQljb21pYiw9IDAsJXIxOSxMJDAzNDEgOyMgMzMyNSBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzMzMwIHplcm9fZXh0ZW5kcWlzaTIvMQotTCQxMTY5Ci0JZXh0cnUgJXIxOSwyOCwyOSwlcjIxIDsjIDMzMzIgbHNocnNpMy8yCi1MJDExNzAKLQlhZGRsICVyNiwlcjIxLCVyMjEgOyMgMzMzNSBhZGRzaTMvMQotCWV4dHJ1ICVyMTksMzEsMywlcjE5IDsjIDMzMzkgYW5kc2kzLzEKLQlzdWJpIDMxLCVyMTksJXIxOSA7IyAzMzQwIHN1YnNpMy8yCi0JbGRiIDAoJXIyMSksJXIyMCA7IyAzMzQzIG1vdnFpKzEvNQotCW10c2FyICVyMTkgOyMgODkyOCByZWxvYWRfb3V0c2krMi83Ci0JdmRlcGkgLTEsMSwlcjIwIDsjIDMzNDggdmRlcGlfaW9yCi0Jc3RiICVyMjAsMCglcjIxKSA7IyAzMzUwIG1vdnFpKzEvNgotTCQwMzQxCi0JbGR3IC0yMTIoJXIzMCksJXIxIDsjIDg5MzEgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzQ4IDsjIDMzNTQgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDMzNTggcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzM1OSBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzM2MSBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjE4LCVyMTkgOyMgMzM2NCBhbmRzaTMvMQotCWNvbWliLDw+IDAsJXIxOSxMJDExNzEgOyMgMzM2NyBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNDI2IHplcm9fZXh0ZW5kcWlzaTIvMQotTCQwMzQ4Ci0JbGR3IC0yMDQoJXIzMCksJXIxIDsjIDg5MzQgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzQ5IDsjIDMzNzIgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUyLSRnbG9iYWwkKCVyMjMpLCVyMTkgOyMgMzM3NiByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzMzc3IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyAzMzc5IG1vdnFpKzEvNQotCWFuZCAlcjE5LCVyMjQsJXIxOSA7IyAzMzgyIGFuZHNpMy8xCi0JY29taWIsPD4gMCwlcjE5LEwkMTE3MSA7IyAzMzg1IGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM0MjYgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNDkKLQlsZHcgLTE5NiglcjMwKSwlcjEgOyMgODkzNyByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMSxMJDAzNTAgOyMgMzM5MCBibGV1KzEKLQlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjQpLCVyMTkgOyMgMzM5NCByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzMzk1IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyAzMzk3IG1vdnFpKzEvNQotCWFuZCAlcjE5LCVyMjQsJXIxOSA7IyAzNDAwIGFuZHNpMy8xCi0JY29taWIsPD4gMCwlcjE5LEwkMTE3MSA7IyAzNDAzIGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM0MjYgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNTAKLQlsZHcgLTE4OCglcjMwKSwlcjEgOyMgODk0MCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMSxMJDAzNDYgOyMgMzQwOCBibGV1KzEKLQlsZHcgUlInX19jdHlwZTItJGdsb2JhbCQoJXIyMyksJXIxOSA7IyAzNDEyIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDM0MTMgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDM0MTUgbW92cWkrMS81Ci0JYW5kICVyMTksJXIxOCwlcjE5IDsjIDM0MTggYW5kc2kzLzEKLQljb21pYiw9IDAsJXIxOSxMJDAzNDYgOyMgMzQyMSBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNDI2IHplcm9fZXh0ZW5kcWlzaTIvMQotTCQxMTcxCi0JZXh0cnUgJXIxOSwyOCwyOSwlcjIxIDsjIDM0MjggbHNocnNpMy8yCi0JYWRkbCAlcjYsJXIyMSwlcjIxIDsjIDM0MzEgYWRkc2kzLzEKLQlleHRydSAlcjE5LDMxLDMsJXIxOSA7IyAzNDM1IGFuZHNpMy8xCi0Jc3ViaSAzMSwlcjE5LCVyMTkgOyMgMzQzNiBzdWJzaTMvMgotCWxkYiAwKCVyMjEpLCVyMjAgOyMgMzQzOSBtb3ZxaSsxLzUKLQltdHNhciAlcjE5IDsjIDg5NDMgcmVsb2FkX291dHNpKzIvNwotCXZkZXBpIC0xLDEsJXIyMCA7IyAzNDQ0IHZkZXBpX2lvcgotCXN0YiAlcjIwLDAoJXIyMSkgOyMgMzQ0NiBtb3ZxaSsxLzYKLUwkMDM0NgotCWxkdyAtMTgwKCVyMzApLCVyMSA7IyA4OTQ2IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM1MyA7IyAzNDUwIGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzNDU0IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDM0NTUgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDM0NTcgbW92cWkrMS81Ci0JYW5kICVyMTksJXIzMSwlcjE5IDsjIDM0NjAgYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQxMTcyIDsjIDM0NjMgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzUyMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM1MwotCWxkdyAtMTcyKCVyMzApLCVyMSA7IyA4OTQ5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM1NCA7IyAzNDY4IGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzNDcyIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDM0NzMgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDM0NzUgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyOSwlcjE5IDsjIDM0NzggYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQxMTcyIDsjIDM0ODEgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzUyMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM1NAotCWNvbWliLD0gMCwlcjEzLEwkMDM1NSA7IyAzNDg2IGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzNDkwIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDM0OTEgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDM0OTMgbW92cWkrMS81Ci0JYmIsPCAlcjE5LDMxLEwkMTE3MiA7IyAzNDk3IGJsZXUrMwotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM1MjAgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNTUKLQljb21pYiw9IDAsJXI3LEwkMDMzOSA7IyAzNTAyIGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzNTA2IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDM1MDcgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDM1MDkgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyOCwlcjE5IDsjIDM1MTIgYW5kc2kzLzEKLQljb21pYiw9IDAsJXIxOSxMJDAzMzkgOyMgMzUxNSBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNTIwIHplcm9fZXh0ZW5kcWlzaTIvMQotTCQxMTcyCi0JZXh0cnUgJXIxOSwyOCwyOSwlcjIxIDsjIDM1MjIgbHNocnNpMy8yCi0JYWRkbCAlcjYsJXIyMSwlcjIxIDsjIDM1MjUgYWRkc2kzLzEKLQlleHRydSAlcjE5LDMxLDMsJXIxOSA7IyAzNTI5IGFuZHNpMy8xCi0Jc3ViaSAzMSwlcjE5LCVyMTkgOyMgMzUzMCBzdWJzaTMvMgotCWxkYiAwKCVyMjEpLCVyMjAgOyMgMzUzMyBtb3ZxaSsxLzUKLQltdHNhciAlcjE5IDsjIDg5NTIgcmVsb2FkX291dHNpKzIvNwotCXZkZXBpIC0xLDEsJXIyMCA7IyAzNTM4IHZkZXBpX2lvcgotCXN0YiAlcjIwLDAoJXIyMSkgOyMgMzU0MCBtb3ZxaSsxLzYKLUwkMDMzOQotCWxkbyAxKCVyMjIpLCVyMjIgOyMgMzU0NiBhZGRzaTMvMgotCWNvbWIsPj0sbiAlcjI2LCVyMjIsTCQxMTczIDsjIDMyMzMgYmxldSsxCi0JbGR3IC0yNDQoJXIzMCksJXIxIDsjIDg5MTYgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDI3NSwlcjAgOyMgMzU1OSBqdW1wCi0JbGRpIDEsJXIxMyA7IyAzNTU2IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDMyOAotCWxkaSAyNTUsJXIxOSA7IyA4MDY5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMTE2OAotCWNvbWIsPSAlcjE5LCVyMyxMJDAzNTkgOyMgODA3MCBibGV1KzEKLQljb3B5ICVyMTksJXIyMSA7IyA4NTk1IHJlbG9hZF9vdXRzaSsyLzEKLUwkMDM2MAotCWxkbyAtMSglcjMpLCVyMjAgOyMgMzU3MSBhZGRzaTMvMgotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMzU4MyByZWxvYWRfb3V0c2krMi81Ci0JZXh0cnUgJXIyMCwzMSw4LCVyMyA7IyAzNTcyIHplcm9fZXh0ZW5kcWlzaTIvMQotCWxkbyAtMSglcjE5KSwlcjE5IDsjIDM1ODQgYWRkc2kzLzIKLQljb21iLDw+ICVyMjEsJXIzLEwkMDM2MCA7IyAzNTc3IGJsZXUrMQotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMzU4OCByZWxvYWRfb3V0c2krMi82Ci1MJDAzNTkKLQlsZGIgMTEoJXI2KSwlcjE5IDsjIDM1OTkgbW92cWkrMS81Ci0JZGVwaSAtMSwyOCwxLCVyMTkgOyMgMzYwMSBpb3JzaTMrMS8yCi0Jc3RiICVyMTksMTEoJXI2KSA7IyAzNjAzIG1vdnFpKzEvNgotCWxkYiA3KCVyNiksJXIxOSA7IyAzNjA2IG1vdnFpKzEvNQotCWxkaSAwLCVyMTMgOyMgMzYxMyByZWxvYWRfb3V0c2krMi8yCi0JZGVwaSAtMSwyOSwxLCVyMTkgOyMgMzYwOCBpb3JzaTMrMS8yCi0JYmwgTCQwMjc1LCVyMCA7IyAzNjE4IGp1bXAKLQlzdGIgJXIxOSw3KCVyNikgOyMgMzYxMCBtb3ZxaSsxLzYKLUwkMDMwOQotCWxkaSAwLCVyMTMgOyMgMzYyNCByZWxvYWRfb3V0c2krMi8yCi1MJDExNjYKLQlleHRydSAlcjcsMjErOC0xLDgsJXIxOSA7IyAzNjI3IGV4dHp2Ci0JYWRkbCAlcjYsJXIxOSwlcjE5IDsjIDM2MzAgYWRkc2kzLzEKLQlleHRydSAlcjcsMzEsMywlcjIwIDsjIDM2MzMgYW5kc2kzLzEKLUwkMDk0OAotCXN1YmkgMzEsJXIyMCwlcjIwIDsjIDM2MzQgc3Vic2kzLzIKLQlsZGIgMCglcjE5KSwlcjIxIDsjIDM2MzcgbW92cWkrMS81Ci0JbXRzYXIgJXIyMCA7IyA4OTU1IHJlbG9hZF9vdXRzaSsyLzcKLQl2ZGVwaSAtMSwxLCVyMjEgOyMgMzY0MiB2ZGVwaV9pb3IKLQlibCBMJDAyNzUsJXIwIDsjIDM2NTMganVtcAotCXN0YiAlcjIxLDAoJXIxOSkgOyMgMzY0NCBtb3ZxaSsxLzYKLUwkMDI3NgotCWxkYiAtMSglcjYpLCVyMjAgOyMgODA3NCBtb3ZxaSsxLzUKLQlleHRydSAlcjIwLDMxLDgsJXIxOSA7IyA4MDc1IHplcm9fZXh0ZW5kcWlzaTIvMQotCWNvbWliLD0gMCwlcjE5LEwkMDM2NCA7IyA4MDc2IGJsZXUrMQotCWFkZGwgJXIxOSwlcjYsJXIxOSA7IyA4MDc5IGFkZHNpMy8xCi0JbGRiIC0xKCVyMTkpLCVyMTkgOyMgODA4MiB6ZXJvX2V4dGVuZHFpc2kyLzIKLQljb21pYiw8PiAwLCVyMTksTCQwMzY0IDsjIDgwODMgYmxldSsxCi0JbGRvIC0xKCVyMjApLCVyMTkgOyMgODI0MiBhZGRzaTMvMgotCWJsIEwkMTE4MywlcjAgOyMgODI1MyBqdW1wCi0Jc3RiICVyMTksLTEoJXI2KSA7IyAzNjg4IG1vdnFpKzEvNgotTCQwMzY1Ci0JbGRvIC0xKCVyMTkpLCVyMTkgOyMgMzY4NiBhZGRzaTMvMgotCXN0YiAlcjE5LC0xKCVyNikgOyMgMzY4OCBtb3ZxaSsxLzYKLUwkMTE4MwotCWV4dHJ1ICVyMTksMzEsOCwlcjE5IDsjIDM2NjIgemVyb19leHRlbmRxaXNpMi8xCi0JY29taWIsPSAwLCVyMTksTCQwMzY0IDsjIDM2NjQgYmxldSsxCi0JYWRkbCAlcjE5LCVyNiwlcjE5IDsjIDM2NjggYWRkc2kzLzEKLQlsZGIgLTEoJXIxOSksJXIxOSA7IyAzNjcyIHplcm9fZXh0ZW5kcWlzaTIvMgotCWNvbWliLD0sbiAwLCVyMTksTCQwMzY1IDsjIDM2NzQgYmxldSsxCi0JbGRiIC0xKCVyNiksJXIxOSA7IyAzNjgzIG1vdnFpKzEvNQotTCQwMzY0Ci0JbGRiIC0xKCVyNiksJXIxOSA7IyAzNzAwIHplcm9fZXh0ZW5kcWlzaTIvMgotCWJsIEwkMDA0MywlcjAgOyMgMzcwNSBqdW1wCi0JYWRkbCAlcjYsJXIxOSwlcjYgOyMgMzcwMSBhZGRzaTMvMQotTCQwMzY4Ci0JYmIsPj0sbiAlcjE1LDE4LEwkMDA3NiA7IyAzNzEzIG1vdnNpLTQKLQlibCBMJDExODEsJXIwIDsjIDM3MjEganVtcAotCWxkdyAyNCglcjUpLCVyMTkgOyMgMzg2MSByZWxvYWRfb3V0c2krMi81Ci1MJDAzNzIKLQliYiw+PSxuICVyMTUsMTgsTCQwMDc2IDsjIDM3MzAgbW92c2ktNAotCWJsLG4gTCQwMzc0LCVyMCA7IyAzNzM4IGp1bXAKLUwkMDM3NgotCWJiLD49LG4gJXIxNSwyMCxMJDAwNzYgOyMgMzc0NyBtb3ZzaS00Ci0JYmwsbiBMJDAzNzgsJXIwIDsjIDM3NTUganVtcAotTCQwMzgwCi0JYmIsPj0sbiAlcjE1LDE2LEwkMDA3NiA7IyAzNzY0IG1vdnNpLTQKLQlibCxuIEwkMDM3OCwlcjAgOyMgMzc3MiBqdW1wCi1MJDAzODMKLQlhbmQgJXIxNSwlcjIwLCVyMTkgOyMgMzc3OSBhbmRzaTMvMQotCWNvbWIsPSAlcjIwLCVyMTksTCQxMTc0IDsjIDM3ODMgYmxldSsxCi0JbGRpIC0xLCVyNCA7IyA1MDc0IHJlbG9hZF9vdXRzaSsyLzIKLQlibCxuIEwkMDA3NiwlcjAgOyMgMzc5MSBqdW1wCi1MJDAzODcKLQljb21iLD0sbiAlcjE2LCVyMTksTCQwOTAzIDsjIDM3OTkgYmxldSsxCi0JbGRiIDAoJXIxOSksJXI3IDsjIDM4MzEgemVyb19leHRlbmRxaXNpMi8yCi0JbGRvIDEoJXIxOSksJXIxOSA7IyAzODI2IGFkZHNpMy8yCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyAzODI4IHJlbG9hZF9vdXRzaSsyLzYKLQlsZG8gLTM5KCVyNyksJXIxOSA7IyA3NDQ2IGFkZHNpMy8yCi0JYWRkaSx1diAtODYsJXIxOSwlcjAgOyMgNzQ0NyBjYXNlc2kwCi0JYmxyLG4gJXIxOSwlcjAKLQliLG4gTCQwMzk3Ci1MJDA4MTcKLQlibCBMJDA3NTksJXIwIDsjIDk0Mzcgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MjA0IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTA2OQotCWJsIEwkMDM5NSwlcjAKLQlub3AgOyMgOTQ0MCBzd2l0Y2hfanVtcAotTCQxMDcwCi0JYmwgTCQwNDIyLCVyMAotCW5vcCA7IyA5NDQzIHN3aXRjaF9qdW1wCi1MJDEwNzEKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0NDYgc3dpdGNoX2p1bXAKLUwkMTA3MgotCWJsIEwkMDgxMSwlcjAKLQlub3AgOyMgOTQ0OSBzd2l0Y2hfanVtcAotTCQxMDczCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NDUyIHN3aXRjaF9qdW1wCi1MJDEwNzQKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0NTUgc3dpdGNoX2p1bXAKLUwkMTA3NQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTQ1OCBzd2l0Y2hfanVtcAotTCQxMDc2Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NDYxIHN3aXRjaF9qdW1wCi1MJDEwNzcKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0NjQgc3dpdGNoX2p1bXAKLUwkMTA3OAotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ2NyBzd2l0Y2hfanVtcAotTCQxMDc5Ci0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDcwIHN3aXRjaF9qdW1wCi1MJDEwODAKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0NzMgc3dpdGNoX2p1bXAKLUwkMTA4MQotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ3NiBzd2l0Y2hfanVtcAotTCQxMDgyCi0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDc5IHN3aXRjaF9qdW1wCi1MJDEwODMKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0ODIgc3dpdGNoX2p1bXAKLUwkMTA4NAotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ4NSBzd2l0Y2hfanVtcAotTCQxMDg1Ci0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDg4IHN3aXRjaF9qdW1wCi1MJDEwODYKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0OTEgc3dpdGNoX2p1bXAKLUwkMTA4NwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTQ5NCBzd2l0Y2hfanVtcAotTCQxMDg4Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NDk3IHN3aXRjaF9qdW1wCi1MJDEwODkKLQlibCBMJDA2NTksJXIwIDsjIDk1MDAgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTY0IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTA5MAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUwMyBzd2l0Y2hfanVtcAotTCQxMDkxCi0JYmwgTCQwNjc5LCVyMCA7IyA5NTA2IHN3aXRjaF9qdW1wCi0JbGR3IDAoJXI1KSwlcjQgOyMgODE3MiByZWxvYWRfb3V0c2krMi81Ci1MJDEwOTIKLQlibCBMJDA4MTEsJXIwCi0Jbm9wIDsjIDk1MDkgc3dpdGNoX2p1bXAKLUwkMTA5MwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUxMiBzd2l0Y2hfanVtcAotTCQxMDk0Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTE1IHN3aXRjaF9qdW1wCi1MJDEwOTUKLQlibCBMJDA3MTksJXIwIDsjIDk1MTggc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTg4IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTA5NgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUyMSBzd2l0Y2hfanVtcAotTCQxMDk3Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTI0IHN3aXRjaF9qdW1wCi1MJDEwOTgKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1Mjcgc3dpdGNoX2p1bXAKLUwkMTA5OQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUzMCBzd2l0Y2hfanVtcAotTCQxMTAwCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTMzIHN3aXRjaF9qdW1wCi1MJDExMDEKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1MzYgc3dpdGNoX2p1bXAKLUwkMTEwMgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUzOSBzd2l0Y2hfanVtcAotTCQxMTAzCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTQyIHN3aXRjaF9qdW1wCi1MJDExMDQKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NDUgc3dpdGNoX2p1bXAKLUwkMTEwNQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU0OCBzd2l0Y2hfanVtcAotTCQxMTA2Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTUxIHN3aXRjaF9qdW1wCi1MJDExMDcKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NTQgc3dpdGNoX2p1bXAKLUwkMTEwOAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU1NyBzd2l0Y2hfanVtcAotTCQxMTA5Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTYwIHN3aXRjaF9qdW1wCi1MJDExMTAKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NjMgc3dpdGNoX2p1bXAKLUwkMTExMQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU2NiBzd2l0Y2hfanVtcAotTCQxMTEyCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTY5IHN3aXRjaF9qdW1wCi1MJDExMTMKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NzIgc3dpdGNoX2p1bXAKLUwkMTExNAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU3NSBzd2l0Y2hfanVtcAotTCQxMTE1Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTc4IHN3aXRjaF9qdW1wCi1MJDExMTYKLQlibCBMJDA2MzksJXIwIDsjIDk1ODEgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTU2IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTExNwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU4NCBzd2l0Y2hfanVtcAotTCQxMTE4Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTg3IHN3aXRjaF9qdW1wCi1MJDExMTkKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1OTAgc3dpdGNoX2p1bXAKLUwkMTEyMAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU5MyBzd2l0Y2hfanVtcAotTCQxMTIxCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTk2IHN3aXRjaF9qdW1wCi1MJDExMjIKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1OTkgc3dpdGNoX2p1bXAKLUwkMTEyMwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYwMiBzd2l0Y2hfanVtcAotTCQxMTI0Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjA1IHN3aXRjaF9qdW1wCi1MJDExMjUKLQlibCBMJDA3MzksJXIwIDsjIDk2MDggc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTk2IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTEyNgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYxMSBzd2l0Y2hfanVtcAotTCQxMTI3Ci0JYmwgTCQwNjk5LCVyMCA7IyA5NjE0IHN3aXRjaF9qdW1wCi0JbGR3IDAoJXI1KSwlcjQgOyMgODE4MCByZWxvYWRfb3V0c2krMi81Ci1MJDExMjgKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MTcgc3dpdGNoX2p1bXAKLUwkMTEyOQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYyMCBzd2l0Y2hfanVtcAotTCQxMTMwCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjIzIHN3aXRjaF9qdW1wCi1MJDExMzEKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MjYgc3dpdGNoX2p1bXAKLUwkMTEzMgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYyOSBzd2l0Y2hfanVtcAotTCQxMTMzCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjMyIHN3aXRjaF9qdW1wCi1MJDExMzQKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MzUgc3dpdGNoX2p1bXAKLUwkMTEzNQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYzOCBzd2l0Y2hfanVtcAotTCQxMTM2Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjQxIHN3aXRjaF9qdW1wCi1MJDExMzcKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NDQgc3dpdGNoX2p1bXAKLUwkMTEzOAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY0NyBzd2l0Y2hfanVtcAotTCQxMTM5Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjUwIHN3aXRjaF9qdW1wCi1MJDExNDAKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NTMgc3dpdGNoX2p1bXAKLUwkMTE0MQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY1NiBzd2l0Y2hfanVtcAotTCQxMTQyCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjU5IHN3aXRjaF9qdW1wCi1MJDExNDMKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NjIgc3dpdGNoX2p1bXAKLUwkMTE0NAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY2NSBzd2l0Y2hfanVtcAotTCQxMTQ1Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjY4IHN3aXRjaF9qdW1wCi1MJDExNDYKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NzEgc3dpdGNoX2p1bXAKLUwkMTE0NwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY3NCBzd2l0Y2hfanVtcAotTCQxMTQ4Ci0JYmwgTCQwNjE5LCVyMCA7IyA5Njc3IHN3aXRjaF9qdW1wCi0JbGR3IDAoJXI1KSwlcjQgOyMgODE0OCByZWxvYWRfb3V0c2krMi81Ci1MJDExNDkKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2ODAgc3dpdGNoX2p1bXAKLUwkMTE1MAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY4MyBzd2l0Y2hfanVtcAotTCQxMTUxCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5Njg2IHN3aXRjaF9qdW1wCi1MJDExNTIKLQlibCBMJDA1MDYsJXIwCi0Jbm9wIDsjIDk2ODkgc3dpdGNoX2p1bXAKLUwkMTE1MwotCWJsIEwkMDQ3MiwlcjAgOyMgOTY5MiBzd2l0Y2hfanVtcAotCWxkaWwgTCczMzc5MiwlcjE5IDsjIDQ3MjQgYWRkX2hpZ2hfY29uc3QrMwotTCQxMTU0Ci0JYmwsbiBMJDAzOTcsJXIwIDsjIDc0NTAganVtcAotTCQwMzk1Ci0JYmIsPCxuICVyMTUsMTgsTCQwMzk3IDsjIDM4NTMgYmxldSszCi0JbGR3IDI0KCVyNSksJXIxOSA7IyAzODYxIHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE4MQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMzg2MiBhZGRzaTMvMgotCXN0dyAlcjE5LDI0KCVyNSkgOyMgMzg2NiByZWxvYWRfb3V0c2krMi82Ci0JbGR3IC0zMDQoJXIzMCksJXIyMCA7IyAzODcxIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI2MCglcjMwKSwlcjEgOyMgODk1OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0zMDgoJXIzMCksJXIxOSA7IyAzODczIHJlbG9hZF9vdXRzaSsyLzUKLQlsZG8gMSglcjEpLCVyMSA7IyAzODY4IGFkZHNpMy8yCi0JY29tYiw8PiAlcjE5LCVyMjAsTCQwMzk4IDsjIDM4NzUgYmxldSsxCi0Jc3R3ICVyMSwtMjYwKCVyMzApIDsjIDg5NjEgcmVsb2FkX291dHNpKzIvNgotCXpkZXAgJXIyMCwyOCwyOSwlcjI1IDsjIDM4ODUgYXNobHNpMysxCi0Jc2gxYWRkbCAlcjIwLCVyMjUsJXIyNSA7IyAzODg2IGFzaGxzaTMtMgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgMzg5MCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAzODk0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JemRlcCAlcjI1LDI5LDMwLCVyMjUgOyMgMzg5MiBhc2hsc2kzKzEKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMzkwMyBibGV1KzEKLQlzdHcgJXIyOCwtMzEyKCVyMzApIDsjIDM4OTggcmVsb2FkX291dHNpKzIvNgotCWxkdyAtMzA4KCVyMzApLCVyMTkgOyMgMzkxMiByZWxvYWRfb3V0c2krMi81Ci0JemRlcCAlcjE5LDMwLDMxLCVyMTkgOyMgMzkxNCBhc2hsc2kzKzEKLQlzdHcgJXIxOSwtMzA4KCVyMzApIDsjIDM5MTYgcmVsb2FkX291dHNpKzIvNgotTCQwMzk4Ci0JbGR3IC0zMDQoJXIzMCksJXIyMCA7IyAzOTIxIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTMxMiglcjMwKSwlcjIxIDsjIDM5MjMgcmVsb2FkX291dHNpKzIvNQotCWxkdyAwKCVyNSksJXIxOSA7IyAzOTMzIHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMjAsJXIyMCwlcjIwIDsjIDM5MjggYXNobHNpMy0yCi0Jc2gyYWRkbCAlcjIwLCVyMjEsJXIyMSA7IyAzOTMxIGFzaGxzaTMtMgotCXN1YiAlcjEyLCVyMTksJXIxOSA7IyAzOTM0IHN1YnNpMy8xCi0Jc3R3ICVyMTksMCglcjIxKSA7IyAzOTM2IHJlbG9hZF9vdXRzaSsyLzYKLQlsZHcgLTMwNCglcjMwKSwlcjE5IDsjIDM5MzkgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMzEyKCVyMzApLCVyMjAgOyMgMzk0MSByZWxvYWRfb3V0c2krMi81Ci0Jc2gyYWRkbCAlcjE5LCVyMTksJXIxOSA7IyAzOTQ2IGFzaGxzaTMtMgotCWNvbWliLD0gMCwlcjEwLEwkMDQwMCA7IyAzOTUxIGJsZXUrMQotCXNoMmFkZGwgJXIxOSwlcjIwLCVyMjAgOyMgMzk0OSBhc2hsc2kzLTIKLQlsZHcgMCglcjUpLCVyMTkgOyMgMzk1MyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyMTAsJXIxOSwlcjE5IDsjIDM5NTQgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDM5NTUgYWRkc2kzLzIKLQlibCBMJDA0MDEsJXIwIDsjIDM5NTgganVtcAotCXN0dyAlcjE5LDQoJXIyMCkgOyMgMzk1NyByZWxvYWRfb3V0c2krMi82Ci1MJDA0MDAKLQlzdHcgJXIwLDQoJXIyMCkgOyMgMzk2MiByZWxvYWRfb3V0c2krMi82Ci1MJDA0MDEKLQlsZHcgLTMwNCglcjMwKSwlcjIwIDsjIDM5NjYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMzEyKCVyMzApLCVyMjEgOyMgMzk2OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDAoJXI1KSwlcjE5IDsjIDM5NzggcmVsb2FkX291dHNpKzIvNQotCXNoMmFkZGwgJXIyMCwlcjIwLCVyMjAgOyMgMzk3MyBhc2hsc2kzLTIKLQlzaDJhZGRsICVyMjAsJXIyMSwlcjIxIDsjIDM5NzYgYXNobHNpMy0yCi0Jc3ViICVyNiwlcjE5LCVyMTkgOyMgMzk3OSBzdWJzaTMvMQotCXN0dyAlcjE5LDEyKCVyMjEpIDsjIDM5ODEgcmVsb2FkX291dHNpKzIvNgotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgMzk4NCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0zMTIoJXIzMCksJXIyMCA7IyAzOTg2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI2MCglcjMwKSwlcjEgOyMgODk2NCByZWxvYWRfb3V0c2krMi81Ci0Jc2gyYWRkbCAlcjE5LCVyMTksJXIxOSA7IyAzOTkxIGFzaGxzaTMtMgotCXNoMmFkZGwgJXIxOSwlcjIwLCVyMjAgOyMgMzk5NCBhc2hsc2kzLTIKLQlsZGkgMjU1LCVyMTkgOyMgMzk5OSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PCAlcjE5LCVyMSxMJDA0MDIgOyMgNDAwMSBibGV1KzEKLQlzdHcgJXIxLDE2KCVyMjApIDsjIDM5OTYgcmVsb2FkX291dHNpKzIvNgotCWxkdyAtMzA0KCVyMzApLCVyMjAgOyMgNDAwNSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0zMTIoJXIzMCksJXIyMSA7IyA0MDA3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgMCglcjUpLCVyMTkgOyMgNDAxNyByZWxvYWRfb3V0c2krMi81Ci0Jc2gyYWRkbCAlcjIwLCVyMjAsJXIyMCA7IyA0MDEyIGFzaGxzaTMtMgotCXNoMmFkZGwgJXIyMCwlcjIxLCVyMjEgOyMgNDAxNSBhc2hsc2kzLTIKLQlzdWIgJXI2LCVyMTksJXIxOSA7IyA0MDE4IHN1YnNpMy8xCi0JbGRvIDIoJXIxOSksJXIxOSA7IyA0MDE5IGFkZHNpMy8yCi0Jc3R3ICVyMTksOCglcjIxKSA7IyA0MDIxIHJlbG9hZF9vdXRzaSsyLzYKLQlsZHcgMCglcjUpLCVyNCA7IyA4MDg3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODA5MCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MDg4IHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MDg5IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNDA3IDsjIDgwOTEgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTkzIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDQwOAotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNDA0OSBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA0MDU5IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDQxMyA7IyA0MDY3IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA0MDYxIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA0MDcwIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQxMwotCWxkdyAwKCVyNSksJXIyNiA7IyA0MDc3IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDQwODEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNDA3OSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDQwODkgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDQwODUgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA0MDYgOyMgNDA5OSBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDQxMDEgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA0MTYgOyMgNDExMCBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNDEwNCBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDQxMTEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDQxMTQgYWRkc2kzLzEKLUwkMDQxNgotCWNvbWliLD0gMCwlcjgsTCQwNDE3IDsjIDQxMTcgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA0MTE4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDQxMjEgYWRkc2kzLzEKLUwkMDQxNwotCWNvbWliLD0gMCwlcjksTCQwNDA2IDsjIDQxMjQgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA0MTI1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDQxMjggYWRkc2kzLzEKLUwkMDQwNgotCWxkdyAwKCVyNSksJXI0IDsjIDQwMjkgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA0MDMzIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDQwMzAgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDQwMzEgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA0MDgKLQlub3AgOyMgNDAzNSBibGV1KzEKLUwkMDQwNwotCWxkaSA1LCVyMTkgOyMgNDE1MCBtb3ZxaSsxLzIKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDQxNTEgbW92cWkrMS82Ci0JbGRiIC0yNTcoJXIzMCksJXIxIDsjIDQxNTYgbW92cWkrMS81Ci0Jc3RicyxtYSAlcjEsMSglcjYpIDsjIDg5NjggbW92cWkrMS82Ci0Jc3RicyxtYSAlcjAsMSglcjYpIDsjIDQxNTkgbW92cWkrMS82Ci1MJDA0MDIKLQlsZGkgMCwlcjEwIDsjIDQxODIgcmVsb2FkX291dHNpKzIvMgotCWxkaSAwLCVyOCA7IyA0MTg1IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyNiwlcjEyIDsjIDQxODggcmVsb2FkX291dHNpKzIvMQotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgNDE3NCByZWxvYWRfb3V0c2krMi81Ci0JbGRpIDAsJXI5IDsjIDQxOTEgcmVsb2FkX291dHNpKzIvMgotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNDE3NSBhZGRzaTMvMgotCWJsIEwkMDA0MywlcjAgOyMgNDE5MyBqdW1wCi0Jc3R3ICVyMTksLTMwNCglcjMwKSA7IyA0MTc5IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQyMgotCWJiLDwgJXIxNSwxOCxMJDAzOTcgOyMgNDIwMSBibGV1KzMKLQlsZHcgLTMwNCglcjMwKSwlcjE5IDsjIDQyMDcgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+LG4gMCwlcjE5LEwkMDM3NCA7IyA0MjA5IGJsZXUrMQotCWJiLD49LG4gJXIxNSwxNCxMJDA5NTAgOyMgNDIxNSBtb3ZzaS00Ci0JYmwsbiBMJDAzOTcsJXIwIDsjIDQyMzAganVtcAotTCQwMzc0Ci0JY29taWIsPSxuIDAsJXIxMCxMJDA0MjcgOyMgNDIzNyBibGV1KzEKLQlsZHcgMCglcjUpLCVyNCA7IyA4MDk1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODA5OCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MDk2IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MDk3IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNDMyIDsjIDgwOTkgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTkxIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDQzMwotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNDI2NiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA0Mjc2IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDQzOCA7IyA0Mjg0IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA0Mjc4IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA0Mjg3IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQzOAotCWxkdyAwKCVyNSksJXIyNiA7IyA0Mjk0IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDQyOTggY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNDI5NiByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDQzMDYgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDQzMDIgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA0MzEgOyMgNDMxNiBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDQzMTggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNDMyMSBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDQzMjIgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA0NDEgOyMgNDMyNyBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDQzMjUgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA0MzI4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA0MzMxIGFkZHNpMy8xCi1MJDA0NDEKLQljb21pYiw9IDAsJXI4LEwkMDQ0MiA7IyA0MzM0IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNDMzNSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA0MzM4IGFkZHNpMy8xCi1MJDA0NDIKLQljb21pYiw9IDAsJXI5LEwkMDQzMSA7IyA0MzQxIGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNDM0MiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA0MzQ1IGFkZHNpMy8xCi1MJDA0MzEKLQlsZHcgMCglcjUpLCVyNCA7IyA0MjQ2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNDI1MCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA0MjQ3IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA0MjQ4IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNDMzCi0Jbm9wIDsjIDQyNTIgYmxldSsxCi1MJDA0MzIKLQlsZGkgMTksJXIxOSA7IyA0MzY3IG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNDM2OCBtb3ZxaSsxLzYKLQl1YWRkY20gJXI2LCVyMTAsJXIyNCA7IyA0MzgxIGFkZGRpMysxCi0JbGRpIDEzLCVyMjYgOyMgNDM4NCByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjEwLCVyMjUgOyMgNDM4NiByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdG9yZV9vcDEsJXIyIDsjIDQzOTAgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZG8gLTMoJXIyNCksJXIyNCA7IyA0Mzg4IGFkZHNpMy8yCi1MJDA0MjcKLQlsZHcgLTMwNCglcjMwKSwlcjE5IDsjIDQzOTUgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+LG4gMCwlcjE5LEwkMDQ0NyA7IyA0Mzk3IGJsZXUrMQotCWJiLDwsbiAlcjE1LDE0LEwkMDA3NiA7IyA0NDAzIGJsZXUrMwotTCQwOTUwCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA0NDE0IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA0NDEyIHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDQ0MTgganVtcAotCWxkaSAxNiwlcjI4IDsjIDQ0MTYgcmVsb2FkX291dHNpKzIvMgotTCQwNDQ3Ci0JbGRvIC0xKCVyMTkpLCVyMTkgOyMgNDQyNyBhZGRzaTMvMgotCXN0dyAlcjE5LC0zMDQoJXIzMCkgOyMgNDQzMSByZWxvYWRfb3V0c2krMi82Ci0JbGR3IC0zMTIoJXIzMCksJXIyMCA7IyA0NDM2IHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMTksJXIxOSwlcjE5IDsjIDQ0NDEgYXNobHNpMy0yCi0Jc2gyYWRkbCAlcjE5LCVyMjAsJXIyMCA7IyA0NDQ0IGFzaGxzaTMtMgotCWxkdyAwKCVyNSksJXIyMSA7IyA0NDQ2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgMCglcjIwKSwlcjE5IDsjIDQ0NDggcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyMjApLCVyMjAgOyMgNDQ2NCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjAsTCQwNDUwIDsjIDQ0NjYgYmxldSsxCi0JYWRkbCAlcjIxLCVyMTksJXIxMiA7IyA0NDQ5IGFkZHNpMy8xCi0JYWRkbCAlcjIxLCVyMjAsJXIxOSA7IyA0NDgzIGFkZHNpMy8xCi0JYmwgTCQwNDUxLCVyMCA7IyA0NDg1IGp1bXAKLQlsZG8gLTEoJXIxOSksJXIxMCA7IyA0NDg0IGFkZHNpMy8yCi1MJDA0NTAKLQlsZGkgMCwlcjEwIDsjIDQ0ODkgcmVsb2FkX291dHNpKzIvMgotTCQwNDUxCi0JbGR3IC0zMDQoJXIzMCksJXIxOSA7IyA0NDkzIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTMxMiglcjMwKSwlcjIwIDsjIDQ0OTUgcmVsb2FkX291dHNpKzIvNQotCWxkdyAwKCVyNSksJXIyMSA7IyA0NTA1IHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMTksJXIxOSwlcjE5IDsjIDQ1MDAgYXNobHNpMy0yCi0Jc2gyYWRkbCAlcjE5LCVyMjAsJXIyMCA7IyA0NTAzIGFzaGxzaTMtMgotCWxkdyAxMiglcjIwKSwlcjE5IDsjIDQ1MDcgcmVsb2FkX291dHNpKzIvNQotCWxkdyAxNiglcjIwKSwlcjcgOyMgNDUyMyByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjIxLCVyMTksJXI4IDsjIDQ1MDggYWRkc2kzLzEKLQlsZGkgMjU1LCVyMTkgOyMgNDUyOSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PCAlcjE5LCVyNyxMJDAwNDMgOyMgNDUzMSBibGV1KzEKLQlsZGkgMCwlcjkgOyMgNDUyNiByZWxvYWRfb3V0c2krMi8yCi0JbGR3IDgoJXIyMCksJXIxOSA7IyA0NTUwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI2MCglcjMwKSwlcjEgOyMgODk3MSByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjIxLCVyMTksJXIxOSA7IyA0NTUxIGFkZHNpMy8xCi0Jc3ViICVyMSwlcjcsJXIyMCA7IyA0NTU3IHN1YnNpMy8xCi0Jc3RiICVyMjAsMCglcjE5KSA7IyA0NTU5IG1vdnFpKzEvNgotCWxkdyAwKCVyNSksJXI0IDsjIDgxMDMgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTA2IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxMDQgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgxMDUgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA0NTcgOyMgODEwNyBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1ODkgcmVsb2FkX291dHNpKzIvMwotTCQwNDU4Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA0NTg3IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDQ1OTcgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNDYzIDsjIDQ2MDUgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDQ1OTkgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDQ2MDggcmVsb2FkX291dHNpKzIvNgotTCQwNDYzCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDQ2MTUgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNDYxOSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA0NjE3IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNDYyNyBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNDYyMyByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDQ1NiA7IyA0NjM3IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDYzOSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA0NjQyIGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNDY0MyBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDQ2NiA7IyA0NjQ4IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNDY0NiBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDQ2NDkgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDQ2NTIgYWRkc2kzLzEKLUwkMDQ2NgotCWNvbWliLD0gMCwlcjgsTCQwNDY3IDsjIDQ2NTUgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA0NjU2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDQ2NTkgYWRkc2kzLzEKLUwkMDQ2NwotCWNvbWliLD0gMCwlcjksTCQwNDU2IDsjIDQ2NjIgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA0NjYzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDQ2NjYgYWRkc2kzLzEKLUwkMDQ1NgotCWxkdyAwKCVyNSksJXI0IDsjIDQ1NjcgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA0NTcxIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDQ1Njggc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDQ1NjkgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA0NTgKLQlub3AgOyMgNDU3MyBibGV1KzEKLUwkMDQ1NwotCWxkaSA2LCVyMTkgOyMgNDY4OCBtb3ZxaSsxLzIKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDQ2ODkgbW92cWkrMS82Ci0Jc3RicyxtYSAlcjcsMSglcjYpIDsjIDQ2OTQgbW92cWkrMS82Ci0JbGR3IC0yNjAoJXIzMCksJXIxIDsjIDg5NzQgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjEsJXI3LCVyMTkgOyMgNDcwMCBzdWJzaTMvMQotCWJsIEwkMDA0MywlcjAgOyMgNDcyMCBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA0NzAyIG1vdnFpKzEvNgotTCQwNDcyCi0JbGRvIFInMzM3OTIoJXIxOSksJXIxOSA7IyA0NzI1IG1vdmhpLTIKLQlhbmQgJXIxNSwlcjE5LCVyMTkgOyMgNDcyNiBhbmRzaTMvMQotCWNvbWliLDw+LG4gMCwlcjE5LEwkMDM5NyA7IyA0NzI4IGJsZXUrMQotTCQwMzc4Ci0JYmIsPCxuICVyMTUsMjEsTCQwMDc2IDsjIDQ3MzkgYmxldSszCi0JbGR3IDAoJXI1KSwlcjMgOyMgODExMSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxMTQgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgODExMiBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgODExMyBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDQ3NiA7IyA4MTE1IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjQgOyMgODU4NyByZWxvYWRfb3V0c2krMi8zCi1MJDA0NzcKLQljb21iLD0gJXI0LCVyMjAsTCQwOTQ0IDsjIDQ3NjggYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNDc3OCBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjQsJXIxOSxMJDA0ODIgOyMgNDc4NiBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNDc4MCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNCw0KCVyNSkgOyMgNDc4OSByZWxvYWRfb3V0c2krMi82Ci1MJDA0ODIKLQlsZHcgMCglcjUpLCVyMjYgOyMgNDc5NiByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA0ODAwIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDQ3OTggcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyA0ODA4IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyA0ODA0IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwNDc1IDsjIDQ4MTggYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyA0ODIwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDQ4MjMgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyA0ODI0IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNDg1IDsjIDQ4MjkgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA0ODI3IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgNDgzMCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNDgzMyBhZGRzaTMvMQotTCQwNDg1Ci0JY29taWIsPSAwLCVyOCxMJDA0ODYgOyMgNDgzNiBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDQ4Mzcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNDg0MCBhZGRzaTMvMQotTCQwNDg2Ci0JY29taWIsPSAwLCVyOSxMJDA0NzUgOyMgNDg0MyBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDQ4NDQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNDg0NyBhZGRzaTMvMQotTCQwNDc1Ci0JbGR3IDAoJXI1KSwlcjMgOyMgNDc0OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDQ3NTIgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgNDc0OSBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgNDc1MCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDQ3NwotCW5vcCA7IyA0NzU0IGJsZXUrMQotTCQwNDc2Ci0JbGRpIDE0LCVyMjYgOyMgNDg3MyByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjEyLCVyMjUgOyMgNDg3NSByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyNiwlcjI1LCVyMjQgOyMgNDg3MCBzdWJzaTMvMQotCWxkbyAzKCVyMjQpLCVyMjQgOyMgNDg3NyBhZGRzaTMvMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5zZXJ0X29wMSwlcjIgOyMgNDg4MSBjYWxsX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI2LCVyMjMgOyMgNDg3OSByZWxvYWRfb3V0c2krMi8xCi0JbGRpIDAsJXI5IDsjIDQ4ODQgcmVsb2FkX291dHNpKzIvMgotCWNvbWliLD0gMCwlcjEwLEwkMDQ5MCA7IyA0ODg5IGJsZXUrMQotCWxkbyAzKCVyNiksJXI2IDsjIDQ4ODYgYWRkc2kzLzIKLQlsZGkgMTMsJXIyNiA7IyA0ODk0IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMTAsJXIyNSA7IyA0ODk2IHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI2LCVyMjUsJXIyNCA7IyA0ODkxIHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdG9yZV9vcDEsJXIyIDsjIDQ5MDAgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZG8gLTMoJXIyNCksJXIyNCA7IyA0ODk4IGFkZHNpMy8yCi1MJDA0OTAKLQlsZHcgMCglcjUpLCVyMyA7IyA4MTE5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODEyMiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MTIwIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MTIxIGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDQ5MiA7IyA4MTIzIGJsZXUrMQotCWNvcHkgJXI2LCVyMTAgOyMgNDkwNCByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4NTg1IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDQ5MwotCWNvbWIsPSAlcjQsJXIyMCxMJDA5NDQgOyMgNDkyOSBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA0OTM5IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNCwlcjE5LEwkMDQ5OCA7IyA0OTQ3IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA0OTQxIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyA0OTUwIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQ5OAotCWxkdyAwKCVyNSksJXIyNiA7IyA0OTU3IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDQ5NjEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNDk1OSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDQ5NjkgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDQ5NjUgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDA0OTEgOyMgNDk3OSBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDQ5ODEgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA1MDEgOyMgNDk5MCBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNDk4NCBhZGRzaTMvMQotCXN1YiAlcjEwLCVyMywlcjE5IDsjIDQ5OTEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDQ5OTQgYWRkc2kzLzEKLUwkMDUwMQotCWNvbWliLD0gMCwlcjgsTCQwNTAyIDsjIDQ5OTcgYmxldSsxCi0Jc3ViICVyOCwlcjMsJXIxOSA7IyA0OTk4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDUwMDEgYWRkc2kzLzEKLUwkMDUwMgotCWNvbWliLD0gMCwlcjksTCQwNDkxIDsjIDUwMDQgYmxldSsxCi0Jc3ViICVyOSwlcjMsJXIxOSA7IyA1MDA1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDUwMDggYWRkc2kzLzEKLUwkMDQ5MQotCWxkdyAwKCVyNSksJXIzIDsjIDQ5MDkgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA0OTEzIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDQ5MTAgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDQ5MTEgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA0OTMKLQlub3AgOyMgNDkxNSBibGV1KzEKLUwkMDQ5MgotCWxkbyAzKCVyNiksJXI2IDsjIDUwMzAgYWRkc2kzLzIKLQlsZGkgMCwlcjggOyMgNTAzMyByZWxvYWRfb3V0c2krMi8yCi0JYmwgTCQwMDQzLCVyMCA7IyA1MDM4IGp1bXAKLQljb3B5ICVyNiwlcjEyIDsjIDUwMzYgcmVsb2FkX291dHNpKzIvMQotTCQwNTA2Ci0JYmIsPj0gJXIxNSwyMixMJDAzOTcgOyMgNTA0NiBtb3ZzaS00Ci0JbGRpIDQ2MDgsJXIyMCA7IyA1MDQ4IHJlbG9hZF9vdXRzaSsyLzIKLQlhbmQgJXIxNSwlcjIwLCVyMTkgOyMgNTA0OSBhbmRzaTMvMQotCWNvbWIsPSAlcjIwLCVyMTksTCQwMzk3IDsjIDUwNTMgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyA1MDU1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI3NiglcjMwKSwlcjEgOyMgODk3NyByZWxvYWRfb3V0c2krMi81Ci0JbGRvIC0yKCVyMjApLCVyMTkgOyMgNTA1NiBhZGRzaTMvMgotCWNvbWIsPD4gJXIxLCVyMTksTCQxMTc1IDsjIDUwNTggYmxldSsxCi0JbGRpIC0xLCVyNCA7IyA1MDc0IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLD0sbiAlcjE2LCVyMjAsTCQwMzk3IDsjIDUwNjIgYmxldSsxCi1MJDExNzQKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDUwNzkgcmVsb2FkX291dHNpKzIvNQotTCQxMTc1Ci0JY29weSAlcjQsJXIxMSA7IyA1MDc2IHJlbG9hZF9vdXRzaSsyLzEKLQljb21iLDw+ICVyMTYsJXIyMCxMJDA1MTcgOyMgNTA4NSBibGV1KzEKLQlsZG8gLTEoJXIyMCksJXIyMyA7IyA1MDgwIGFkZHNpMy8yCi0JYmIsPj0sbiAlcjE1LDE5LEwkMDkxNSA7IyA1MDkyIG1vdnNpLTQKLQlibCBMJDExODIsJXIwIDsjIDUxMDcganVtcAotCXN0dyAlcjIzLC0yOTYoJXIzMCkgOyMgNTk2OCByZWxvYWRfb3V0c2krMi82Ci1MJDA1MTcKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDUxMzQgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDUxMzYgcmVsb2FkX291dHNpKzIvNgotCWNvbWliLD0gMCwlcjE0LEwkMDUxNSA7IyA1MTQzIGJsZXUrMQotCWxkYiAwKCVyMjApLCVyNyA7IyA1MTM5IHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA1MTQ0IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDUxNDcgemVyb19leHRlbmRxaXNpMi8yCi1MJDA1MTUKLQlhZGRpbCBMUidfX2N0eXBlLSRnbG9iYWwkLCVyMjcgOyMgODI1NyBwaWMyX2xvX3N1bSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXIxKSwlcjIxIDsjIDgyNTkgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIyMSwlcjcsJXIxOSA7IyA4MjYwIGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyA4MjYxIG1vdnFpKzEvNQotCWJiLD49ICVyMTksMjksTCQwNTEzIDsjIDgyNjUgbW92c2ktNAotCWxkaSA0LCVyMjAgOyMgODI2MyByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjIwLCVyMjIgOyMgODU4MyByZWxvYWRfb3V0c2krMi8xCi1MJDA1MjIKLQljb21pY2xyLDwgLTEsJXIxMSwlcjAgOyMgODEyOCBtb3ZzaWNjKzEvMQotCWxkaSAwLCVyMTEKLQlzaDJhZGRsICVyMTEsJXIxMSwlcjE5IDsjIDUxODggYXNobHNpMy0yCi0Jc2gxYWRkbCAlcjE5LCVyNywlcjE5IDsjIDUxOTEgYXNobHNpMy0yCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyA1MTk0IHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjIwLEwkMDUxMyA7IyA1MTk2IGJsZXUrMQotCWxkbyAtNDgoJXIxOSksJXIxMSA7IyA1MTkyIGFkZHNpMy8yCi0JbGRvIDEoJXIyMCksJXIxOSA7IyA1MjE1IGFkZHNpMy8yCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyA1MjE3IHJlbG9hZF9vdXRzaSsyLzYKLQljb21pYiw9IDAsJXIxNCxMJDA1MjAgOyMgNTIyNCBibGV1KzEKLQlsZGIgMCglcjIwKSwlcjcgOyMgNTIyMCB6ZXJvX2V4dGVuZHFpc2kyLzIKLQlhZGRsICVyMTQsJXI3LCVyMTkgOyMgNTIyNSBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyNyA7IyA1MjI4IHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwNTIwCi0JYWRkbCAlcjIxLCVyNywlcjE5IDsjIDUxNjYgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDUxNjggbW92cWkrMS81Ci0JYW5kICVyMTksJXIyMiwlcjE5IDsjIDUxNzIgYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQwNTIyCi0Jbm9wIDsjIDUxNzQgYmxldSsxCi1MJDA1MTMKLQlsZGkgNDQsJXIxOSA7IyA1MjUyIHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw+ICVyMTksJXI3LEwkMDUzMiA7IyA1MjU0IGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgNTI1OSByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIyMCxMJDA1MzMgOyMgNTI2MSBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDUyNzggYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDUyODAgcmVsb2FkX291dHNpKzIvNgotCWNvbWliLD0gMCwlcjE0LEwkMDUzNSA7IyA1Mjg3IGJsZXUrMQotCWxkYiAwKCVyMjApLCVyNyA7IyA1MjgzIHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA1Mjg4IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDUyOTEgemVyb19leHRlbmRxaXNpMi8yCi1MJDA1MzUKLQlhZGRpbCBMUidfX2N0eXBlLSRnbG9iYWwkLCVyMjcgOyMgODI2OSBwaWMyX2xvX3N1bSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXIxKSwlcjIxIDsjIDgyNzEgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIyMSwlcjcsJXIxOSA7IyA4MjcyIGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyA4MjczIG1vdnFpKzEvNQotCWJiLD49ICVyMTksMjksTCQwNTMzIDsjIDgyNzcgbW92c2ktNAotCWxkaSA0LCVyMjAgOyMgODI3NSByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjIwLCVyMjIgOyMgODU3OCByZWxvYWRfb3V0c2krMi8xCi1MJDA1NDIKLQljb21pY2xyLDwgLTEsJXI0LCVyMCA7IyA4MTMyIG1vdnNpY2MrMS8xCi0JbGRpIDAsJXI0Ci0Jc2gyYWRkbCAlcjQsJXI0LCVyMTkgOyMgNTMzMiBhc2hsc2kzLTIKLQlzaDFhZGRsICVyMTksJXI3LCVyMTkgOyMgNTMzNSBhc2hsc2kzLTIKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDUzMzggcmVsb2FkX291dHNpKzIvNQotCWNvbWIsPSAlcjE2LCVyMjAsTCQwNTMzIDsjIDUzNDAgYmxldSsxCi0JbGRvIC00OCglcjE5KSwlcjQgOyMgNTMzNiBhZGRzaTMvMgotCWxkbyAxKCVyMjApLCVyMTkgOyMgNTM1OSBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgNTM2MSByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwNTQwIDsjIDUzNjggYmxldSsxCi0JbGRiIDAoJXIyMCksJXI3IDsjIDUzNjQgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDUzNjkgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNTM3MiB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDU0MAotCWFkZGwgJXIyMSwlcjcsJXIxOSA7IyA1MzEwIGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyA1MzEyIG1vdnFpKzEvNQotCWFuZCAlcjE5LCVyMjIsJXIxOSA7IyA1MzE2IGFuZHNpMy8xCi0JY29taWIsPD4gMCwlcjE5LEwkMDU0MgotCW5vcCA7IyA1MzE4IGJsZXUrMQotTCQwNTMzCi0JY29taWNsciw8IC0xLCVyNCwlcjAgOyMgODEzNiBiZXEtMS80Ci0JemRlcGkgLTEsMzEsMTUsJXI0Ci0JYmwsbiBMJDA1NTMsJXIwIDsjIDU0MDEganVtcAotTCQwNTMyCi0JY29weSAlcjExLCVyNCA7IyA1NDA2IHJlbG9hZF9vdXRzaSsyLzEKLUwkMDU1MwotCWNvbWliLD4gMCwlcjExLEwkMDk1MSA7IyA1NDEwIGJsZXUrMQotCXpkZXBpIC0xLDMxLDE1LCVyMTkgOyMgNTQxMiByZWxvYWRfb3V0c2krMi80Ci0JY29tYiw8LG4gJXIxOSwlcjQsTCQwOTUxIDsjIDU0MTQgYmxldSsxCi0JY29tYiw8LG4gJXI0LCVyMTEsTCQwOTUxIDsjIDU0MTYgYmxldSsxCi0JYmIsPCAlcjE1LDE5LEwkMTE3NiA7IyA1NDUxIGJsZXUrMwotCWxkaSAxMjUsJXIxOSA7IyA1NTE0IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgOTIsJXIxOSA7IyA1NDU1IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw+ICVyMTksJXI3LEwkMDkxNSA7IyA1NDU3IGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgNTQ3MyByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIyMCxMJDA5MjIgOyMgNTQ3NSBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDU0ODQgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDU0ODYgcmVsb2FkX291dHNpKzIvNgotCWNvbWliLD0gMCwlcjE0LEwkMDU1OCA7IyA1NDkzIGJsZXUrMQotCWxkYiAwKCVyMjApLCVyNyA7IyA1NDg5IHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA1NDk0IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDU0OTcgemVyb19leHRlbmRxaXNpMi8yCi1MJDA1NTgKLQlsZGkgMTI1LCVyMTkgOyMgNTUxNCByZWxvYWRfb3V0c2krMi8yCi1MJDExNzYKLQljb21iLD0sbiAlcjE5LCVyNyxMJDA1NjYgOyMgNTUxNiBibGV1KzEKLUwkMDk1MQotCWJiLDwsbiAlcjE1LDE5LEwkMDUxMSA7IyA1NTIzIGJsZXUrMwotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgNTUzNCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgNTUzMiByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyA1NTM4IGp1bXAKLQlsZGkgMTAsJXIyOCA7IyA1NTM2IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDU2NgotCWNvbWliLDw+LG4gMCwlcjgsTCQwNTY5IDsjIDU1NDUgYmxldSsxCi0JYmIsPCxuICVyMTUsMjYsTCQwOTE3IDsjIDU1NTIgYmxldSszCi0JYmIsPj0sbiAlcjE1LDI3LEwkMDUxMSA7IyA1NTcxIG1vdnNpLTQKLQljb3B5ICVyNiwlcjggOyMgNTU3NCByZWxvYWRfb3V0c2krMi8xCi1MJDA1NjkKLQljb21pYiw8PiAwLCVyNCxMJDA1NzQgOyMgNTU4NyBibGV1KzEKLQlsZGkgMTAsJXIxMyA7IyA4OTgwIHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgMCglcjUpLCVyMyA7IyA4MTM5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODE0MiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MTQwIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MTQxIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNTc2IDsjIDgxNDMgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4NTczIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDU3NwotCWNvbWIsPSAlcjQsJXIyMCxMJDA5NDQgOyMgNTYxMyBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA1NjIzIGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNCwlcjE5LEwkMDU4MiA7IyA1NjMxIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA1NjI1IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyA1NjM0IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDU4MgotCWxkdyAwKCVyNSksJXIyNiA7IyA1NjQxIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDU2NDUgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNTY0MyByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDU2NTMgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDU2NDkgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDA1NzUgOyMgNTY2MyBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDU2NjUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNTY2OCBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDU2Njkgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA1ODUgOyMgNTY3NCBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDU2NzIgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyA1Njc1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA1Njc4IGFkZHNpMy8xCi1MJDA1ODUKLQljb21pYiw9IDAsJXI4LEwkMDU4NiA7IyA1NjgxIGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgNTY4MiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA1Njg1IGFkZHNpMy8xCi1MJDA1ODYKLQljb21pYiw9IDAsJXI5LEwkMDU3NSA7IyA1Njg4IGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgNTY4OSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA1NjkyIGFkZHNpMy8xCi1MJDA1NzUKLQlsZHcgMCglcjUpLCVyMyA7IyA1NTkzIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNTU5NyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA1NTk0IHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA1NTk1IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNTc3Ci0Jbm9wIDsjIDU1OTkgYmxldSsxCi1MJDA1NzYKLQlsZGkgMTIsJXIyNiA7IyA1NzE4IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyOCwlcjI1IDsjIDU3MjAgcmVsb2FkX291dHNpKzIvMQotCXN1YiAlcjYsJXI4LCVyMjQgOyMgNTcyMiBzdWJzaTMvMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5zZXJ0X29wMSwlcjIgOyMgNTcyNiBjYWxsX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI2LCVyMjMgOyMgNTcyNCByZWxvYWRfb3V0c2krMi8xCi0JYmwgTCQwNTkwLCVyMCA7IyA1NzMwIGp1bXAKLQlsZG8gMyglcjYpLCVyNiA7IyA1NzI4IGFkZHNpMy8yCi1MJDA1NzQKLQljb21pY2xyLD4gMiwlcjQsJXIwIDsjIDgyODIgYmVxLTEvMgotCWxkaSAyMCwlcjEzCi0JbGR3IDAoJXI1KSwlcjMgOyMgODI4NSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgyODggcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgODI4NiBzdWJzaTMvMQotCWFkZGwgJXIxOSwlcjEzLCVyMTkgOyMgODI4NyBhZGRzaTMvMQotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDg2OCA7IyA4Mjg5IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjcgOyMgODU3MSByZWxvYWRfb3V0c2krMi8zCi1MJDA1OTUKLQljb21iLD0gJXI3LCVyMjAsTCQwOTQ0IDsjIDU3NjkgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNTc3OSBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjcsJXIxOSxMJDA2MDAgOyMgNTc4NyBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNTc4MSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNyw0KCVyNSkgOyMgNTc5MCByZWxvYWRfb3V0c2krMi82Ci1MJDA2MDAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNTc5NyByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA1ODAxIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDU3OTkgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyA1ODA5IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyA1ODA1IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwNTkzIDsjIDU4MTkgYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyA1ODIxIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDU4MjQgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyA1ODI1IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNjAzIDsjIDU4MzAgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA1ODI4IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgNTgzMSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNTgzNCBhZGRzaTMvMQotTCQwNjAzCi0JY29taWIsPSAwLCVyOCxMJDA2MDQgOyMgNTgzNyBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDU4Mzggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNTg0MSBhZGRzaTMvMQotTCQwNjA0Ci0JY29taWIsPSAwLCVyOSxMJDA1OTMgOyMgNTg0NCBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDU4NDUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNTg0OCBhZGRzaTMvMQotTCQwNTkzCi0JbGR3IDAoJXI1KSwlcjMgOyMgNTc0OSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDU3NTMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgNTc1MCBzdWJzaTMvMQotCWFkZGwgJXIxOSwlcjEzLCVyMTkgOyMgNTc1MSBhZGRzaTMvMQotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDU5NQotCW5vcCA7IyA1NzU1IGJsZXUrMQotTCQwODY4Ci0JY29taWIsPj0gMSwlcjQsTCQwNjA4IDsjIDU4NzIgYmxldSsxCi0JbGRvIDUoJXI2KSwlcjE5IDsjIDU4NzAgYWRkc2kzLzIKLQlzdWIgJXIxOSwlcjgsJXIxOSA7IyA1ODc0IHN1YnNpMy8xCi0JYmwgTCQwNjA5LCVyMCA7IyA1ODc2IGp1bXAKLQlsZG8gMiglcjE5KSwlcjI0IDsjIDU4NzUgYWRkc2kzLzIKLUwkMDYwOAotCXN1YiAlcjE5LCVyOCwlcjE5IDsjIDU4Nzkgc3Vic2kzLzEKLQlsZG8gLTMoJXIxOSksJXIyNCA7IyA1ODgwIGFkZHNpMy8yCi1MJDA2MDkKLQlsZGkgMjAsJXIyNiA7IyA1ODg1IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyOCwlcjI1IDsjIDU4ODcgcmVsb2FkX291dHNpKzIvMQotCWNvcHkgJXIxMSwlcjIzIDsjIDU4OTEgcmVsb2FkX291dHNpKzIvMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5zZXJ0X29wMiwlcjIgOyMgNTg5MyBjYWxsX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjYsLTUyKCVyMzApIDsjIDU4ODMgcmVsb2FkX291dHNpKzIvNgotCWxkbyA1KCVyNiksJXI2IDsjIDU4OTUgYWRkc2kzLzIKLQlsZGkgMjIsJXIyNiA7IyA1OTAwIHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyOCwlcjI1IDsjIDU5MDIgcmVsb2FkX291dHNpKzIvMQotCWxkaSA1LCVyMjQgOyMgNTkwNCByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjExLCVyMjMgOyMgNTkwNiByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AyLCVyMiA7IyA1OTA4IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyNiwtNTIoJXIzMCkgOyMgNTg5OCByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPj0gMSwlcjQsTCQwNTkwIDsjIDU5MTMgYmxldSsxCi0JbGRvIDUoJXI2KSwlcjYgOyMgNTkxMCBhZGRzaTMvMgotCWxkaSAyMSwlcjI2IDsjIDU5MjEgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI2LCVyMjUgOyMgNTkyMyByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyOCwlcjYsJXIyNCA7IyA1OTE3IHN1YnNpMy8xCi0JbGRvIDIoJXIyNCksJXIyNCA7IyA1OTI1IGFkZHNpMy8yCi0JbGRvIC0xKCVyNCksJXI0IDsjIDU5MTkgYWRkc2kzLzIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIHN0b3JlX29wMiwlcjIgOyMgNTkyOSBjYWxsX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI0LCVyMjMgOyMgNTkyNyByZWxvYWRfb3V0c2krMi8xCi0JbGRvIDUoJXI2KSwlcjYgOyMgNTkzMSBhZGRzaTMvMgotCXN0dyAlcjYsLTUyKCVyMzApIDsjIDU5MzYgcmVsb2FkX291dHNpKzIvNgotCWxkaSAyMiwlcjI2IDsjIDU5MzggcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI4LCVyMjUgOyMgNTk0MCByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyNiwlcjgsJXIyNCA7IyA1OTQyIHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AyLCVyMiA7IyA1OTQ2IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjQsJXIyMyA7IyA1OTQ0IHJlbG9hZF9vdXRzaSsyLzEKLQlsZG8gNSglcjYpLCVyNiA7IyA1OTQ4IGFkZHNpMy8yCi1MJDA1OTAKLQlibCBMJDAwNDMsJXIwIDsjIDU5NjMganVtcAotCWxkaSAwLCVyOSA7IyA1OTU2IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDUxMQotCXN0dyAlcjIzLC0yOTYoJXIzMCkgOyMgNTk2OCByZWxvYWRfb3V0c2krMi82Ci1MJDExODIKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDU5NzcgcmVsb2FkX291dHNpKzIvNQotCWNvbWIsPSAlcjE2LCVyMjAsTCQwOTIyIDsjIDU5NzkgYmxldSsxCi0JbGRvIDEoJXIyMCksJXIyMSA7IyA1OTg4IGFkZHNpMy8yCi0JbGRiIDAoJXIyMCksJXIyMCA7IyA1OTkyIG1vdnFpKzEvNQotCXN0dyAlcjIxLC0yOTYoJXIzMCkgOyMgNTk5MCByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwNjEyIDsjIDU5OTcgYmxldSsxCi0JZXh0cnUgJXIyMCwzMSw4LCVyNyA7IyA1OTkzIHplcm9fZXh0ZW5kcWlzaTIvMQotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA1OTk4IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDYwMDEgemVyb19leHRlbmRxaXNpMi8yCi1MJDA2MTIKLQliYiw8ICVyMTUsMTksTCQwMDc2IDsjIDYwMTkgYmxldSszCi0JbGR3IC0yNzYoJXIzMCksJXIxIDsjIDg5ODMgcmVsb2FkX291dHNpKzIvNQotCWNvbWIsPj49ICVyMSwlcjIxLEwkMDA3NiA7IyA2MDI1IGJsZXUrMQotCWV4dHJzICVyMjAsMzEsOCwlcjIwIDsjIDYwMzAgZXh0ZW5kcWlzaTIKLQlsZGkgOTIsJXIxOSA7IyA2MDMyIHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLD0sbiAlcjE5LCVyMjAsTCQwMzk3IDsjIDYwMzQgYmxldSsxCi0JYmwsbiBMJDAwNzYsJXIwIDsjIDYwNDIganVtcAotTCQwNjE5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxNTEgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODE0OSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODE1MCBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDA2MjQgOyMgODE1MiBibGV1KzEKLQljb3B5ICVyNiwlcjggOyMgNjA0NyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTY5IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDYyNQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNjA3NSBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA2MDg1IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDYzMCA7IyA2MDkzIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA2MDg3IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA2MDk2IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDYzMAotCWxkdyAwKCVyNSksJXIyNiA7IyA2MTAzIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDYxMDcgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNjEwNSByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDYxMTUgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA2MTExIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNjIzIDsjIDYxMjUgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2MTI3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDYxMzAgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA2MTMxIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNjMzIDsjIDYxMzYgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA2MTM0IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNjEzNyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNjE0MCBhZGRzaTMvMQotTCQwNjMzCi0JY29taWIsPSAwLCVyOCxMJDA2MzQgOyMgNjE0MyBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDYxNDQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjE0NyBhZGRzaTMvMQotTCQwNjM0Ci0JY29taWIsPSAwLCVyOSxMJDA2MjMgOyMgNjE1MCBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDYxNTEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjE1NCBhZGRzaTMvMQotTCQwNjIzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNjA1NSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDYwNTkgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjA1NiBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNjA1NyBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDYyNQotCW5vcCA7IyA2MDYxIGJsZXUrMQotTCQwNjI0Ci0JbGRpIDIzLCVyMTkgOyMgNjE3NiBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDYxODkganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjE3NyBtb3ZxaSsxLzYKLUwkMDYzOQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTU5IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxNTcgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgxNTggYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwNjQ0IDsjIDgxNjAgYmxldSsxCi0JY29weSAlcjYsJXI4IDsjIDYxOTQgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU2NyByZWxvYWRfb3V0c2krMi8zCi1MJDA2NDUKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDYyMjIgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNjIzMiBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA2NTAgOyMgNjI0MCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNjIzNCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNjI0MyByZWxvYWRfb3V0c2krMi82Ci1MJDA2NTAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNjI1MCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA2MjU0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDYyNTIgcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA2MjYyIGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNjI1OCByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDY0MyA7IyA2MjcyIGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjI3NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA2Mjc3IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNjI3OCBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDY1MyA7IyA2MjgzIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNjI4MSBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDYyODQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDYyODcgYWRkc2kzLzEKLUwkMDY1MwotCWNvbWliLD0gMCwlcjgsTCQwNjU0IDsjIDYyOTAgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA2MjkxIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDYyOTQgYWRkc2kzLzEKLUwkMDY1NAotCWNvbWliLD0gMCwlcjksTCQwNjQzIDsjIDYyOTcgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA2Mjk4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDYzMDEgYWRkc2kzLzEKLUwkMDY0MwotCWxkdyAwKCVyNSksJXI0IDsjIDYyMDIgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA2MjA2IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDYyMDMgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDYyMDQgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA2NDUKLQlub3AgOyMgNjIwOCBibGV1KzEKLUwkMDY0NAotCWxkaSAyNCwlcjE5IDsjIDYzMjMgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA2MzM2IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDYzMjQgbW92cWkrMS82Ci1MJDA2NTkKLQlsZHcgNCglcjUpLCVyMjAgOyMgODE2NyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MTY1IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MTY2IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNjY0IDsjIDgxNjggYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTY1IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDY2NQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNjM2NiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA2Mzc2IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDY3MCA7IyA2Mzg0IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA2Mzc4IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA2Mzg3IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDY3MAotCWxkdyAwKCVyNSksJXIyNiA7IyA2Mzk0IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDYzOTggY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNjM5NiByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDY0MDYgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA2NDAyIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNjYzIDsjIDY0MTYgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2NDE4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDY0MjEgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA2NDIyIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNjczIDsjIDY0MjcgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA2NDI1IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNjQyOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNjQzMSBhZGRzaTMvMQotTCQwNjczCi0JY29taWIsPSAwLCVyOCxMJDA2NzQgOyMgNjQzNCBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDY0MzUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjQzOCBhZGRzaTMvMQotTCQwNjc0Ci0JY29taWIsPSAwLCVyOSxMJDA2NjMgOyMgNjQ0MSBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDY0NDIgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjQ0NSBhZGRzaTMvMQotTCQwNjYzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNjM0NiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDYzNTAgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjM0NyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNjM0OCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDY2NQotCW5vcCA7IyA2MzUyIGJsZXUrMQotTCQwNjY0Ci0JbGRpIDI1LCVyMTkgOyMgNjQ2NyBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDY0ODAganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjQ2OCBtb3ZxaSsxLzYKLUwkMDY3OQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTc1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxNzMgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgxNzQgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA2ODQgOyMgODE3NiBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NjMgcmVsb2FkX291dHNpKzIvMwotTCQwNjg1Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA2NTEwIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDY1MjAgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNjkwIDsjIDY1MjggYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDY1MjIgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDY1MzEgcmVsb2FkX291dHNpKzIvNgotTCQwNjkwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDY1MzggcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNjU0MiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA2NTQwIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNjU1MCBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDY1NDYgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA2ODMgOyMgNjU2MCBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY1NjIgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNjU2NSBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDY1NjYgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA2OTMgOyMgNjU3MSBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDY1NjkgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA2NTcyIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA2NTc1IGFkZHNpMy8xCi1MJDA2OTMKLQljb21pYiw9IDAsJXI4LEwkMDY5NCA7IyA2NTc4IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNjU3OSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA2NTgyIGFkZHNpMy8xCi1MJDA2OTQKLQljb21pYiw9IDAsJXI5LEwkMDY4MyA7IyA2NTg1IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNjU4NiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA2NTg5IGFkZHNpMy8xCi1MJDA2ODMKLQlsZHcgMCglcjUpLCVyNCA7IyA2NDkwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNjQ5NCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2NDkxIHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA2NDkyIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNjg1Ci0Jbm9wIDsjIDY0OTYgYmxldSsxCi1MJDA2ODQKLQlsZGkgMjYsJXIxOSA7IyA2NjExIG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNjYyNCBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA2NjEyIG1vdnFpKzEvNgotTCQwNjk5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxODMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODE4MSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODE4MiBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDcwNCA7IyA4MTg0IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU2MSByZWxvYWRfb3V0c2krMi8zCi1MJDA3MDUKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDY2NTQgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNjY2NCBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA3MTAgOyMgNjY3MiBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNjY2NiByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNjY3NSByZWxvYWRfb3V0c2krMi82Ci1MJDA3MTAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNjY4MiByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA2Njg2IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDY2ODQgcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA2Njk0IGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNjY5MCByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDcwMyA7IyA2NzA0IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjcwNiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA2NzA5IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNjcxMCBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDcxMyA7IyA2NzE1IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNjcxMyBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDY3MTYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDY3MTkgYWRkc2kzLzEKLUwkMDcxMwotCWNvbWliLD0gMCwlcjgsTCQwNzE0IDsjIDY3MjIgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA2NzIzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDY3MjYgYWRkc2kzLzEKLUwkMDcxNAotCWNvbWliLD0gMCwlcjksTCQwNzAzIDsjIDY3MjkgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA2NzMwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDY3MzMgYWRkc2kzLzEKLUwkMDcwMwotCWxkdyAwKCVyNSksJXI0IDsjIDY2MzQgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA2NjM4IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY2MzUgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDY2MzYgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA3MDUKLQlub3AgOyMgNjY0MCBibGV1KzEKLUwkMDcwNAotCWxkaSAyNywlcjE5IDsjIDY3NTUgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA2NzY4IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDY3NTYgbW92cWkrMS82Ci1MJDA3MTkKLQlsZHcgNCglcjUpLCVyMjAgOyMgODE5MSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MTg5IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MTkwIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNzI0IDsjIDgxOTIgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTU5IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDcyNQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNjc5OCBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA2ODA4IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDczMCA7IyA2ODE2IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA2ODEwIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA2ODE5IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDczMAotCWxkdyAwKCVyNSksJXIyNiA7IyA2ODI2IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDY4MzAgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNjgyOCByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDY4MzggYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA2ODM0IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNzIzIDsjIDY4NDggYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2ODUwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDY4NTMgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA2ODU0IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNzMzIDsjIDY4NTkgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA2ODU3IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNjg2MCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNjg2MyBhZGRzaTMvMQotTCQwNzMzCi0JY29taWIsPSAwLCVyOCxMJDA3MzQgOyMgNjg2NiBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDY4Njcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjg3MCBhZGRzaTMvMQotTCQwNzM0Ci0JY29taWIsPSAwLCVyOSxMJDA3MjMgOyMgNjg3MyBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDY4NzQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjg3NyBhZGRzaTMvMQotTCQwNzIzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNjc3OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDY3ODIgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjc3OSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNjc4MCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDcyNQotCW5vcCA7IyA2Nzg0IGJsZXUrMQotTCQwNzI0Ci0JbGRpIDI4LCVyMTkgOyMgNjg5OSBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDY5MTIganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjkwMCBtb3ZxaSsxLzYKLUwkMDczOQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTk5IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxOTcgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgxOTggYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA3NDQgOyMgODIwMCBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NTcgcmVsb2FkX291dHNpKzIvMwotTCQwNzQ1Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA2OTQyIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDY5NTIgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNzUwIDsjIDY5NjAgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDY5NTQgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDY5NjMgcmVsb2FkX291dHNpKzIvNgotTCQwNzUwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDY5NzAgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNjk3NCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA2OTcyIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNjk4MiBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDY5NzggcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA3NDMgOyMgNjk5MiBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY5OTQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNjk5NyBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDY5OTggc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA3NTMgOyMgNzAwMyBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDcwMDEgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA3MDA0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA3MDA3IGFkZHNpMy8xCi1MJDA3NTMKLQljb21pYiw9IDAsJXI4LEwkMDc1NCA7IyA3MDEwIGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNzAxMSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA3MDE0IGFkZHNpMy8xCi1MJDA3NTQKLQljb21pYiw9IDAsJXI5LEwkMDc0MyA7IyA3MDE3IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNzAxOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA3MDIxIGFkZHNpMy8xCi1MJDA3NDMKLQlsZHcgMCglcjUpLCVyNCA7IyA2OTIyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNjkyNiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2OTIzIHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA2OTI0IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNzQ1Ci0Jbm9wIDsjIDY5MjggYmxldSsxCi1MJDA3NDQKLQlsZGkgMTAsJXIxOSA7IyA3MDQzIG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNzA1NiBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA3MDQ0IG1vdnFpKzEvNgotTCQwNzU5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgyMDcgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODIwNSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODIwNiBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDc2NCA7IyA4MjA4IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU1NSByZWxvYWRfb3V0c2krMi8zCi1MJDA3NjUKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDcwODYgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNzA5NiBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA3NzAgOyMgNzEwNCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNzA5OCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNzEwNyByZWxvYWRfb3V0c2krMi82Ci1MJDA3NzAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNzExNCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA3MTE4IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDcxMTYgcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA3MTI2IGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNzEyMiByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDc2MyA7IyA3MTM2IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzEzOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA3MTQxIGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNzE0MiBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDc3MyA7IyA3MTQ3IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNzE0NSBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDcxNDggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDcxNTEgYWRkc2kzLzEKLUwkMDc3MwotCWNvbWliLD0gMCwlcjgsTCQwNzc0IDsjIDcxNTQgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA3MTU1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDcxNTggYWRkc2kzLzEKLUwkMDc3NAotCWNvbWliLD0gMCwlcjksTCQwNzYzIDsjIDcxNjEgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA3MTYyIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDcxNjUgYWRkc2kzLzEKLUwkMDc2MwotCWxkdyAwKCVyNSksJXI0IDsjIDcwNjYgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA3MDcwIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDcwNjcgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDcwNjggYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA3NjUKLQlub3AgOyMgNzA3MiBibGV1KzEKLUwkMDc2NAotCWxkaSAxMSwlcjE5IDsjIDcxODcgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA3MjAwIGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDcxODggbW92cWkrMS82Ci1MJDA3ODcKLQliYiw8ICVyMTUsMTcsTCQwMDc2IDsjIDcyMTYgYmxldSszCi0JbGRvIC00OCglcjcpLCVyMTkgOyMgNzIyNCBhZGRzaTMvMgotCWxkdyAtMjYwKCVyMzApLCVyMSA7IyA4OTg2IHJlbG9hZF9vdXRzaSsyLzUKLQlleHRydSAlcjE5LDMxLDgsJXIzIDsjIDcyMjUgemVyb19leHRlbmRxaXNpMi8xCi0JY29tYiw8PCAlcjEsJXIzLEwkMDkzOSA7IyA3MjMwIGJsZXUrMQotCWxkbyAtMzEyKCVyMzApLCVyMjYgOyMgNzI0NCBhZGRzaTMvMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZ3JvdXBfaW5fY29tcGlsZV9zdGFjaywlcjIgOyMgNzI0OCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIzLCVyMjUgOyMgNzI0NiByZWxvYWRfb3V0c2krMi8xCi0JZXh0cnMgJXIyOCwzMSw4LCVyMjggOyMgNzI1MSBleHRlbmRxaXNpMgotCWNvbWliLDw+LG4gMCwlcjI4LEwkMDA3NiA7IyA3MjUzIGJsZXUrMQotCWxkdyAwKCVyNSksJXI0IDsjIDgyMTIgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MjE1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgyMTMgc3Vic2kzLzEKLQlsZG8gMiglcjE5KSwlcjE5IDsjIDgyMTQgYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwNzk1IDsjIDgyMTYgYmxldSsxCi0JY29weSAlcjYsJXI4IDsjIDcyNjAgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTCc2NTUzNiwlcjcgOyMgODU1MyByZWxvYWRfb3V0c2krMi8zCi1MJDA3OTYKLQljb21iLD0gJXI3LCVyMjAsTCQwOTQ0IDsjIDcyODggYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNzI5OCBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjcsJXIxOSxMJDA4MDEgOyMgNzMwNiBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNzMwMCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNyw0KCVyNSkgOyMgNzMwOSByZWxvYWRfb3V0c2krMi82Ci1MJDA4MDEKLQlsZHcgMCglcjUpLCVyMjYgOyMgNzMxNiByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA3MzIwIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDczMTggcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA3MzI4IGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNzMyNCByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDc5NCA7IyA3MzM4IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzM0MCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA3MzQzIGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNzM0NCBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDgwNCA7IyA3MzQ5IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNzM0NyBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDczNTAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDczNTMgYWRkc2kzLzEKLUwkMDgwNAotCWNvbWliLD0gMCwlcjgsTCQwODA1IDsjIDczNTYgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA3MzU3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDczNjAgYWRkc2kzLzEKLUwkMDgwNQotCWNvbWliLD0gMCwlcjksTCQwNzk0IDsjIDczNjMgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA3MzY0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDczNjcgYWRkc2kzLzEKLUwkMDc5NAotCWxkdyAwKCVyNSksJXI0IDsjIDcyNjggcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA3MjcyIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDcyNjkgc3Vic2kzLzEKLQlsZG8gMiglcjE5KSwlcjE5IDsjIDcyNzAgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA3OTYKLQlub3AgOyMgNzI3NCBibGV1KzEKLUwkMDc5NQotCWxkaSA3LCVyMTkgOyMgNzM4OSBtb3ZxaSsxLzIKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDczOTAgbW92cWkrMS82Ci0JYmwgTCQwMDQzLCVyMCA7IyA3NDA1IGp1bXAKLQlzdGJzLG1hICVyMywxKCVyNikgOyMgNzM5MyBtb3ZxaSsxLzYKLUwkMDgxMQotCWJiLDwgJXIxNSwzMCxMJDAxMDQKLQlub3AgOyMgNzQxNCBibGV1KzMKLUwkMDM5NwotCWNvbWliLD0gMCwlcjE0LEwkMDgxNSA7IyA3NDI5IGJsZXUrMQotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA3NDMwIGFkZHNpMy8xCi0JYmwgTCQwODE2LCVyMCA7IyA3NDM0IGp1bXAKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDc0MzMgemVyb19leHRlbmRxaXNpMi8yCi1MJDA4MTUKLQljb3B5ICVyNywlcjE5IDsjIDc0MzggcmVsb2FkX291dHNpKzIvMQotTCQwODE2Ci0JY29weSAlcjE5LCVyNyA7IyA3NDQxIHJlbG9hZF9vdXRzaSsyLzEKLUwkMDA3NgotCWNvbWliLD0sbiAwLCVyOSxMJDA4MjAgOyMgNzQ2MCBibGV1KzEKLQlsZGIgMCglcjkpLCVyMjAgOyMgNzQ2MyB6ZXJvX2V4dGVuZHFpc2kyLzIKLQlhZGRsICVyOSwlcjIwLCVyMTkgOyMgNzQ2NCBhZGRzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNzQ2NSBhZGRzaTMvMgotCWNvbWIsPD4gJXI2LCVyMTksTCQwODIwIDsjIDc0NjcgYmxldSsxCi0JbGRpIDI1NSwlcjE5IDsjIDc0NzIgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSAlcjE5LCVyMjAsTCQwODIwIDsjIDc0NzQgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMSA7IyA3NDc2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgMCglcjIxKSwlcjE5IDsjIDc0NzggbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMjAgOyMgNzQ3OSBleHRlbmRxaXNpMgotCWxkaSA0MiwlcjE5IDsjIDc0ODEgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSAlcjE5LCVyMjAsTCQwODIwIDsjIDc0ODMgYmxldSsxCi0JbGRpIDk0LCVyMTkgOyMgNzQ5MCByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9LG4gJXIxOSwlcjIwLEwkMDgyMCA7IyA3NDkyIGJsZXUrMQotCWJiLD49ICVyMTUsMzAsTCQwODIxIDsjIDc0OTcgbW92c2ktNAotCWxkaSA5MiwlcjE5IDsjIDc1MDQgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4sbiAlcjE5LCVyMjAsTCQwODIyIDsjIDc1MDYgYmxldSsxCi0JbGRiIDEoJXIyMSksJXIxOSA7IyA3NTEwIG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjIwIDsjIDc1MTEgZXh0ZW5kcWlzaTIKLUwkMDgyMQotCWxkaSA0MywlcjE5IDsjIDc1MzQgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSAlcjE5LCVyMjAsTCQwODIwIDsjIDc1MzYgYmxldSsxCi0JbGRpIDYzLCVyMTkgOyMgNzU0MyByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9LG4gJXIxOSwlcjIwLEwkMDgyMCA7IyA3NTQ1IGJsZXUrMQotTCQwODIyCi0JYmIsPj0sbiAlcjE1LDIyLEwkMDgxOSA7IyA3NTUzIG1vdnNpLTQKLQliYiw+PSAlcjE1LDE5LEwkMDgyMyA7IyA3NTU4IG1vdnNpLTQKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDc1NjAgcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgNzU2MiBtb3ZxaSsxLzUKLQlsZGkgMTIzLCVyMjAgOyMgNzU2NSByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgNzU2MyBleHRlbmRxaXNpMgotCWNvbWIsPSxuICVyMjAsJXIxOSxMJDA4MjAgOyMgNzU2NyBibGV1KzEKLQlsZHcgMCglcjUpLCVyNCA7IyA4MjI4IHJlbG9hZF9vdXRzaSsyLzUKLQlibCxuIEwkMTE3NywlcjAgOyMgNzU2OCBqdW1wCi1MJDA4MjMKLQlsZHcgLTI5NiglcjMwKSwlcjIxIDsjIDc1NzIgcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMjEpLCVyMTkgOyMgNzU3NCBtb3ZxaSsxLzUKLQlsZGkgOTIsJXIyMCA7IyA3NTc3IHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyA3NTc1IGV4dGVuZHFpc2kyCi0JY29tYiw8PixuICVyMjAsJXIxOSxMJDA4MTkgOyMgNzU3OSBibGV1KzEKLQlsZGIgMSglcjIxKSwlcjE5IDsjIDc1ODMgbW92cWkrMS81Ci0JbGRpIDEyMywlcjIwIDsjIDc1ODYgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDc1ODQgZXh0ZW5kcWlzaTIKLQljb21iLDw+LG4gJXIyMCwlcjE5LEwkMDgxOSA7IyA3NTg4IGJsZXUrMQotTCQwODIwCi0JbGR3IDAoJXI1KSwlcjQgOyMgODIyMCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgyMjMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODIyMSBzdWJzaTMvMQotCWxkbyAyKCVyMTkpLCVyMTkgOyMgODIyMiBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDA4MjkgOyMgODIyNCBibGV1KzEKLQljb3B5ICVyNiwlcjggOyMgNzU5NiByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTUxIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDgzMAotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNzYyNCBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA3NjM0IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDgzNSA7IyA3NjQyIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA3NjM2IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA3NjQ1IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDgzNQotCWxkdyAwKCVyNSksJXIyNiA7IyA3NjUyIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDc2NTYgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNzY1NCByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDc2NjQgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA3NjYwIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwODI4IDsjIDc2NzQgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3Njc2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDc2NzkgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA3NjgwIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwODM4IDsjIDc2ODUgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA3NjgzIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNzY4NiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNzY4OSBhZGRzaTMvMQotTCQwODM4Ci0JY29taWIsPSAwLCVyOCxMJDA4MzkgOyMgNzY5MiBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDc2OTMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNzY5NiBhZGRzaTMvMQotTCQwODM5Ci0JY29taWIsPSAwLCVyOSxMJDA4MjggOyMgNzY5OSBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDc3MDAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNzcwMyBhZGRzaTMvMQotTCQwODI4Ci0JbGR3IDAoJXI1KSwlcjQgOyMgNzYwNCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDc2MDggcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzYwNSBzdWJzaTMvMQotCWxkbyAyKCVyMTkpLCVyMTkgOyMgNzYwNiBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDgzMAotCW5vcCA7IyA3NjEwIGJsZXUrMQotTCQwODI5Ci0JbGRpIDEsJXIxOSA7IyA3NzI1IG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNzcyNiBtb3ZxaSsxLzYKLQlzdGJzLG1hICVyMCwxKCVyNikgOyMgNzcyOSBtb3ZxaSsxLzYKLQlsZG8gLTEoJXI2KSwlcjkgOyMgNzc0MSBhZGRzaTMvMgotTCQwODE5Ci0JbGR3IDAoJXI1KSwlcjQgOyMgODIyOCByZWxvYWRfb3V0c2krMi81Ci1MJDExNzcKLQlsZHcgNCglcjUpLCVyMjAgOyMgODIzMSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MjI5IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MjMwIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwODQ4IDsjIDgyMzIgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTQ5IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDg0OQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNzc3MSBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA3NzgxIGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDg1NCA7IyA3Nzg5IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA3NzgzIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA3NzkyIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDg1NAotCWxkdyAwKCVyNSksJXIyNiA7IyA3Nzk5IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDc4MDMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNzgwMSByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDc4MTEgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA3ODA3IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwODQ3IDsjIDc4MjEgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3ODIzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDc4MjYgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA3ODI3IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwODU3IDsjIDc4MzIgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA3ODMwIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNzgzMyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNzgzNiBhZGRzaTMvMQotTCQwODU3Ci0JY29taWIsPSAwLCVyOCxMJDA4NTggOyMgNzgzOSBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDc4NDAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNzg0MyBhZGRzaTMvMQotTCQwODU4Ci0JY29taWIsPSAwLCVyOSxMJDA4NDcgOyMgNzg0NiBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDc4NDcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNzg1MCBhZGRzaTMvMQotTCQwODQ3Ci0JbGR3IDAoJXI1KSwlcjQgOyMgNzc1MSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDc3NTUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzc1MiBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNzc1MyBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDg0OQotCW5vcCA7IyA3NzU3IGJsZXUrMQotTCQwODQ4Ci0Jc3RicyxtYSAlcjcsMSglcjYpIDsjIDc4NzIgbW92cWkrMS82Ci0JbGRiIDAoJXI5KSwlcjE5IDsjIDc4ODUgbW92cWkrMS81Ci0JbGRvIDEoJXIxOSksJXIxOSA7IyA3ODg4IGFkZHNpMy8yCi0Jc3RiICVyMTksMCglcjkpIDsjIDc4OTAgbW92cWkrMS82Ci1MJDAwNDMKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDIzMjggcmVsb2FkX291dHNpKzIvNQotTCQxMTYxCi0JY29tY2xyLD0gJXIxNiwlcjE5LCVyMCA7IyAyNTggYmxldSsxCi0JYmwgTCQxMTc4LCVyMAotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjMzNCByZWxvYWRfb3V0c2krMi81Ci1MJDAwNDQKLQljb21pYiw9IDAsJXIxMCxMJDA4NjUgOyMgNzkxMyBibGV1KzEKLQlsZGkgMTMsJXIyNiA7IyA3OTE4IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMTAsJXIyNSA7IyA3OTIwIHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI2LCVyMjUsJXIyNCA7IyA3OTE1IHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdG9yZV9vcDEsJXIyIDsjIDc5MjQgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZG8gLTMoJXIyNCksJXIyNCA7IyA3OTIyIGFkZHNpMy8yCi1MJDA4NjUKLQlsZHcgLTMwNCglcjMwKSwlcjE5IDsjIDc5MjggcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+LG4gMCwlcjE5LEwkMDg2NiA7IyA3OTMwIGJsZXUrMQotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgNzk0NiBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgNzk0NCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDAoJXI1KSwlcjE5IDsjIDc5NDkgcmVsb2FkX291dHNpKzIvNQotCWxkaSAwLCVyMjggOyMgNzk1NSByZWxvYWRfb3V0c2krMi8yCi0Jc3ViICVyNiwlcjE5LCVyMTkgOyMgNzk1MCBzdWJzaTMvMQotCWJsIEwkMDg2NywlcjAgOyMgNzk1NyBqdW1wCi0Jc3R3ICVyMTksOCglcjUpIDsjIDc5NTIgcmVsb2FkX291dHNpKzIvNgotTCQwODk1Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyAyMjY5IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyAyMjY3IHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDIyNzMganVtcAotCWxkaSAxMSwlcjI4IDsjIDIyNzEgcmVsb2FkX291dHNpKzIvMgotTCQwOTAwCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyAzMTYxIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyAzMTU5IHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDMxNjUganVtcAotCWxkaSA0LCVyMjggOyMgMzE2MyByZWxvYWRfb3V0c2krMi8yCi1MJDA5MDIKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDMyMTggY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDMyMTYgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgMzIyMiBqdW1wCi0JbGRpIDcsJXIyOCA7IyAzMjIwIHJlbG9hZF9vdXRzaSsyLzIKLUwkMDkwMwotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgMzgwMyBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgMzgwMSByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyAzODA3IGp1bXAKLQlsZGkgNSwlcjI4IDsjIDM4MDUgcmVsb2FkX291dHNpKzIvMgotTCQwOTE1Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA1NDYxIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA1NDU5IHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDU0NjUganVtcAotCWxkaSA5LCVyMjggOyMgNTQ2MyByZWxvYWRfb3V0c2krMi8yCi1MJDA5MTcKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDU1NTcgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDU1NTUgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgNTU2MSBqdW1wCi0JbGRpIDEzLCVyMjggOyMgNTU1OSByZWxvYWRfb3V0c2krMi8yCi1MJDA5MjIKLQlibCBMJDA4NjcsJXIwIDsjIDU5ODMganVtcAotCWxkaSAxNCwlcjI4IDsjIDU5ODEgcmVsb2FkX291dHNpKzIvMgotTCQwOTM5Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA3MjM1IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA3MjMzIHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDcyMzkganVtcAotCWxkaSA2LCVyMjggOyMgNzIzNyByZWxvYWRfb3V0c2krMi8yCi1MJDA5NDQKLQlibCBMJDA4NjcsJXIwIDsjIDc3NzUganVtcAotCWxkaSAxNSwlcjI4IDsjIDc3NzMgcmVsb2FkX291dHNpKzIvMgotTCQwODY2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA3OTM1IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA3OTMzIHJlbG9hZF9vdXRzaSsyLzUKLQlsZGkgOCwlcjI4IDsjIDc5MzcgcmVsb2FkX291dHNpKzIvMgotTCQwODY3Ci0JbGR3IC0zNDAoJXIzMCksJXIyIDsjIDkwMjYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTY4KCVyMzApLCVyMTggOyMgOTAyOCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNjQoJXIzMCksJXIxNyA7IyA5MDMwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTE2MCglcjMwKSwlcjE2IDsjIDkwMzIgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTU2KCVyMzApLCVyMTUgOyMgOTAzNCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNTIoJXIzMCksJXIxNCA7IyA5MDM2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTE0OCglcjMwKSwlcjEzIDsjIDkwMzggcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTQ0KCVyMzApLCVyMTIgOyMgOTA0MCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNDAoJXIzMCksJXIxMSA7IyA5MDQyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTEzNiglcjMwKSwlcjEwIDsjIDkwNDQgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTMyKCVyMzApLCVyOSA7IyA5MDQ2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTEyOCglcjMwKSwlcjggOyMgOTA0OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xMjQoJXIzMCksJXI3IDsjIDkwNTAgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTIwKCVyMzApLCVyNiA7IyA5MDUyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTExNiglcjMwKSwlcjUgOyMgOTA1NCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xMTIoJXIzMCksJXI0IDsjIDkwNTYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTA4KCVyMzApLCVyMyA7IyA5MDU4IHJlbG9hZF9vdXRzaSsyLzUKLQlidiAlcjAoJXIyKSA7IyA5MDYxIHJldHVybl9pbnRlcm5hbAotCWxkbyAtMzIwKCVyMzApLCVyMzAgOyMgOTA2MCBhZGRzaTMvMgotCS5FWElUCi0JLlBST0NFTkQKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkQlNTJAotCi0JLmFsaWduIDEKLXJlX3N5bnRheF90YWJsZQotCS5ibG9jayAyNTYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvY29tbW9uLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2NvbW1vbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTJiMGNiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvY29tbW9uLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkudGV4dAotdGV4dF9zeW1ib2w6CQotCS5sb25nCTEKLQkubG9uZwlleHRlcm5hbF9zeW1ib2wKLQkuZGF0YQotZGF0YV9zeW1ib2w6Ci0JLmxvbmcJMgotY29tbW9uX3N5bWJvbAkuY29tbQk0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2ZyYWdidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZnJhZ2J1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM0MTkzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZnJhZ2J1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0JLlNQQUNFICRURVhUJAkKLQkuU1VCU1BBICRDT0RFJAkKLQlub3AJCQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZ2xvYmFsYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2dsb2JhbGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGYwNWY2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZ2xvYmFsYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0KLQkuc3BhY2UgJFBSSVZBVEUkCi0JLnN1YnNwYSAkR0xPQkFMJAotCS5leHBvcnQgJGdsb2JhbCQKLSRnbG9iYWwkCi0JLnNwYWNlICRURVhUJAotCS5zdWJzcGEgJENPREUkCi0KLQkucHJvYwotCS5jYWxsaW5mbwotaXZhYWRkcgotCW5vcAotCW5vcAotCWFkZGlsIEwlaXZhYWRkci0kZ2xvYmFsJCwlZHAKLQlsZG8gICBSJWl2YWFkZHItJGdsb2JhbCQoJXIxKSwlcjE5Ci0JLnByb2NlbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvaW1wb3J0YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2ltcG9ydGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDRhZmI2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvaW1wb3J0YnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuRVhQT1JUIGZvbyxEQVRBCi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkCi0KLQkuYWxpZ24gNAotZm9vOgotCS53b3JkIDAKLQkuSU1QT1JUIF9fbWFpbixDT0RFCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFpbixDT0RFCi0JLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1tYWluOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTY0LENBTExTLFNBVkVfUlAsU0FWRV9TUCxFTlRSWV9HUj0zCi0JLkVOVFJZCi0JLmltcG9ydCBmb28KLQlzdHcgJXIyLC0yMCgwLCVyMzApCi0JY29weSAlcjMsJXIxCi0JY29weSAlcjMwLCVyMwotCXN0d20gJXIxLDY0KCVyMzApCi0JLkNBTEwgCi0JYmwgX19tYWluLCVyMgotCW5vcAotTCQwMDAxOgotCWxkdyAtMjAoJXIzKSwlcjIKLQlsZG8gNjQoJXIzKSwlcjMwCi0JbGR3bSAtNjQoJXIzMCksJXIzCi0JYnYsbiAlcjAoJXIyKQotCS5FWElUCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvbGFiZWxkaWZmcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9sYWJlbGRpZmZzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZTY2ZjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9sYWJlbGRpZmZzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi07IFNob3VsZCBjaGVjayB0byBtYWtlIHN1cmUgc29tZXRoaW5nIHVzZWZ1bCBnZXRzIHB1dCBvbiB0aG9zZSAud29yZAotOyBzdGF0ZW1lbnRzLgotICAgICAgICAuc3BhY2UJJFRFWFQkCi0gICAgICAgIC5zdWJzcGEJJENPREUkCi0KLQkuYWxpZ24JOAotCS5leHBvcnQJaWNvZGUsZGF0YQotaWNvZGU6Ci0JLnByb2MKLQkuY2FsbGluZm8JZnJhbWU9MCxub19jYWxscwotCS5lbnRyeQotCWJ2LG4JJXIwKCVyMikKLQkuZXhpdAotCW5vcAotCS5wcm9jZW5kCi0KLQk7Ci0JOyBGSVJTVCwgYXJndiBhcnJheSBvZiBwb2ludGVycyB0byBhcmdzLCAxc3QgaXMgc2FtZSBhcyBwYXRoLgotCTsKLQkuYWxpZ24JOAotaWNfYXJndjoKLQkud29yZAlpY19hcmd2MS1pY29kZQk7IHNlY29uZCwgcG9pbnRlciB0byAxc3QgYXJndW1lbnQKLQkud29yZAlpY19wYXRoLWljb2RlCQk7IGZpcnN0LCAgcG9pbnRlciB0byBpbml0IHBhdGgKLQkud29yZAkwCQkJOyBmb3VydGgsIE5VTEwgYXJndiB0ZXJtaW5hdG9yIChwYWQpCi0JLndvcmQJMAkJCTsgdGhpcmQsICBOVUxMIGFyZ3YgdGVybWluYXRvcgotCi1pY19wYXRoOgotCS5ibG9ja3oJNDA5NgkJCTsgbXVzdCBiZSBtdWx0aXBsZSBvZiA0IGJ5dGVzCi0JLndvcmQJMAkJCTsgaW4gY2FzZSBmdWxsIHN0cmluZyBpcyB1c2VkCi0JLndvcmQJMAkJCTsgdGhpcyB3aWxsIGJlIHRoZSBzdHJpbmcgdGVybWluYXRvcgotCi1pY19hcmd2MToKLQkuYmxvY2t6CTQwOTYJCQk7IG11c3QgYmUgbXVsdGlwbGUgb2YgNCBieXRlcwotCS53b3JkCTAJCQk7IGluIGNhc2UgZnVsbCBzdHJpbmcgaXMgdXNlZAotCS53b3JkCTAJCQk7IHRoaXMgd2lsbCBiZSB0aGUgc3RyaW5nIHRlcm1pbmF0b3IKLQotCS5leHBvcnQJc3ppY29kZSxkYXRhCi1zemljb2RlOgotCS53b3JkCXN6aWNvZGUtaWNvZGUKLQkud29yZAkwCQkJOyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGZpbGxlciBhdCBlbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvbG9jYWxsYWJlbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9sb2NhbGxhYmVsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNTcyMWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9sb2NhbGxhYmVsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQotTGFiZWw6Ci1MJDAxMjM0OgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL3NzX2FsaWduLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL3NzX2FsaWduLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOThlYjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9zc19hbGlnbi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049NjQsQUNDRVNTPTMxCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJAotc3ltMToJLldPUkQgMgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTMwMGM3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBEZWphR251QGN5Z251cy5jb20KLQotIyBXcml0dGVuIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaAotIyBhbmQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLXByb2MgZG9fc3Vic3BhY2VfYWxpZ25fdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzc19hbGlnbi5zOiBUZXN0IHN1YnNwYWNlIGFsaWdubWVudCAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJzc19hbGlnbi5zIiAiIiAic3Vic3BhY2UgYWxpZ25tZW50IChwYXJ0IDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLWgiCi0KLSAgICAjIENoZWNrIHRoZSBoZWFkZXJzIGZvciB0aGUgY29ycmVjdCBhbGlnbm1lbnQgdmFsdWUgZm9yIHRoZQotICAgICMgLmRhdGEgc2VjdGlvbiAoZWxmKSBvciB0aGUgJERBVEEkIHN1YnNwYWNlIChzb20pLgotCWlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCB7Ci0JCSAgICAtcmUgImRhdGFcW15cblxdKiAyLi42XFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KLQkJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCSAgICB0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkJfQotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCAgewotCQkgICAgLXJlICJEQVRBXFteXG5cXSogMi4uNlxbXlxuXF0qXG4iCXsgc2V0IHggMSB9Ci0JCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCQkgICAgdGltZW91dAkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCSAgICBlb2YJCQkJeyBicmVhayB9Ci0JCX0KLQkgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX2xvY2FsX2xhYmVsX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9jYWxsYWJlbC5zOiBFbGltaW5hdGlvbiBvZiBsb2NhbCBsYWJlbHMgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAibG9jYWxsYWJlbC5zIiAiIiAiRWxpbWluYXRpb24gb2YgbG9jYWwgbGFiZWxzIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXQiCi0KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJeMDAwMDAwMDBcW15cblxdKkxhYmVsXFteXG5cXSpcbiIJCXsgc2V0IHggMSB9Ci0JCS1yZSAiXjAwMDAwMDAwXFteXG5cXSpMXCQwMTIzNFxbXlxuXF0qXG4iCXsgc2V0IHggMCB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fZnJjaGFpbl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZyYWdidWcuczogVGVzdCBidWcgaW4gZnJhZyBjaGFpbmluZyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJmcmFnYnVnLnMiICIiICJUZXN0IGJ1ZyBpbiBmcmFnIGNoYWluaW5nIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLS1wcmVmaXgtYWRkcmVzc2VzIC1kIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXjB4MDAwMDAwMDBcW15cblxdKm5vcFxbXlxuXF0qXG4iCQl7IHNldCB4IDEgfQotCQktcmUgIl4weDAwMDAwMDA0XFteXG5cXSpub3BcW15cblxdKlxuIgkJeyBzZXQgeCAwIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19hbGlnbjNfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhbGlnbjMuczogVGVzdCBmb3IgYWxpZ25tZW50IGJ1ZyB3aGVuIHN3aXRjaGluZyBzdWJzcGFjZXMgKHBhcnQyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJhbGlnbjMucyIgIiIgIlRlc3QgZm9yIGFsaWdubWVudCBidWcgd2hlbiBzd2l0Y2hpbmcgc3Vic3BhY2VzIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLS1wcmVmaXgtYWRkcmVzc2VzIC1kIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXFteXG5cXSogPG1haW4+IG5vcFxbXlxuXF0qXG4iCQl7IHNldCB4IDEgfQotCQktcmUgIlxbXlxuXF0qIDwuKmVuZF9tYWluPiBub3BcW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KLQkJLXJlICJcW15cblxdKiA8bWFpbisuKj4gbm9wXFteXG5cXSpcbiIJCXsgc2V0IHggMCB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fYWxpZ240X3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWxpZ240LnM6IE1vcmUgc3Vic3BhY2UgYWxpZ25tZW50IHRlc3RzIChwYXJ0MikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImFsaWduNC5zIiAiIiAiTW9yZSBzdWJzcGFjZSBhbGlnbm1lbnQgdGVzdHMgKHBhcnQxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItaCIKLQotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCQktcmUgIlxbXlxuXF0qTUlMTElDT0RFXFteXG5cXSoyLi42XFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIlxbXlxuXF0qWUFCQkFcW15cblxdKjIuLjNcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9faW1wb3J0X3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiaW1wb3J0YnVnLnM6IFRlc3QgZm9yIGJ1ZyBpbiAuaW1wb3J0IGRpcmVjdGl2ZSAocGFydDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImltcG9ydGJ1Zy5zIiAiIiAiVGVzdCBmb3IgYnVnIGluIC5pbXBvcnQgZGlyZWN0aXZlIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLS1zeW1zIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXFteXG5cXSouREFUQS4uZm9vXFteXG5cXSpcbiIJCXsgc2V0IHggMSB9Ci0JCS1yZSAiXFteXG5cXSouZGF0YS4qZm9vXFteXG5cXSpcbiIJCXsgc2V0IHggMSB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fY29tbW9uX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29tbW9uLnM6IFRlc3QgZm9yIGJ1ZyBpbiAuY29tbSBoYW5kbGluZyAocGFydDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImNvbW1vbi5zIiAiIiAiVGVzdCBmb3IgYnVnIGluIC5jb21tIGhhbmRsaW5nIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLS1zeW1zIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXFteXG5cXSouQ09NLipjb21tb25fc3ltYm9sXFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotaWYgW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7Ci0gICAgIyBNYWtlIHN1cmUgc3Vic3BhY2UgYWxpZ25tZW50IHJlcXVlc3RzIGZyb20gdGhlIHN1YnNwYWNlIGRpcmVjdGl2ZXMKLSAgICAjIGFyZSBob25vcmVkCi0gICAgZG9fc3Vic3BhY2VfYWxpZ25fdGVzdAotCi0gICAgIyBNYWtlIHN1cmUgdGhlIGNvcnJlY3QgbGFiZWxzIGVuZCB1cCBpbiB0aGUgc3ltYm9sIHRhYmxlCi0gICAgZG9fbG9jYWxfbGFiZWxfdGVzdAotCi0gICAgIyBHQVMtMS4zNiBjaG9rZWQgb24gdGhpcyBmaWxlLgotICAgIGdhc190ZXN0ICJsYWJlbGRpZmZzLnMiICIiICIiICJEaWZmZXJlbmNlIG9mIGxhYmVscyIKLQotICAgICMgVGVzdCBhIHJlY2VudCBidWcgd2hlcmUgZnJhZyBjaGFpbmluZyB3YXNuJ3Qgd29ya2luZyBjb3JyZWN0bHkuCi0gICAgZG9fZnJjaGFpbl90ZXN0Ci0KLSAgICAjIFRlc3QgYnVnIHdoZXJlIHN3aXRjaGluZyBiZXR3ZWVuIHN1YnNwYWNlcyBjcmVhdGVzIGJvZ3VzIGFsaWdubWVudHMKLSAgICBkb19hbGlnbjNfdGVzdAotCi0gICAgIyBUZXN0IGJ1ZyB3aGVyZSBzd2l0Y2hpbmcgYmV0d2VlbiBzdWJzcGFjZXMgY3JlYXRlcyBib2d1cyBhbGlnbm1lbnRzCi0gICAgZG9fYWxpZ240X3Rlc3QKLQotICAgICMgVGVzdCBhIHByb2JsZW0gd2hlcmUgJGdsb2JhbCQgaXMgZGVmaW5lZCwgdGhlbiB1c2VkIHdpdGhpbiB0aGUKLSAgICAjIHNhbWUgc291cmNlIGZpbGUuCi0gICAgc2V0dXBfeGZhaWwgaHBwYSotKi0qCi0gICAgZ2FzX3Rlc3QgImdsb2JhbGJ1Zy5zIiAiIiAiIiAiVXNlIFwkZ2xvYmFsXCQgaW4gZmlsZSB3aGljaCBkZWZpbmVzIGl0IgotCi0gICAgIyBUZXN0IHRoYXQgaW1wb3J0aW5nIGEgZGVmaW5lZCBzeW1ib2wgZG9lc24ndCBzY3JldyB1cCB0aGUgc3ltYm9sJ3MKLSAgICAjIHNwYWNlL3N1YnNwYWNlLgotICAgIGRvX2ltcG9ydF90ZXN0Ci0KLSAgICAjIFRlc3QgZm9yIGEgYnVnbGV0IGluIHRoZSBoYW5kbGluZyBvZiBjb21tb24gc3ltYm9scwotICAgIGRvX2NvbW1vbl90ZXN0Ci0KLSAgICAjIFRlc3QgZm9yIGFuIG9mZi1ieS0yIGJ1ZyBpbiByYW5nZSBjaGVjayBmb3IgY29uZGl0aW9uYWwgYnJhbmNoZXMKLSAgICBnYXNfdGVzdF9lcnJvciAiYnJsZW5idWcucyIgIiIgIkNoZWNrIGZvciBlcnJvcihzKSBpbiBicmFuY2ggbGVuZ3RoIgotCi19Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvYW1kLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2FtZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGY2Zjc3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvYW1kLmQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jb2JqZHVtcDogLWR3Ci0jbmFtZTogaTM4NiBhbWQKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMCA8LnRleHQ+OgotICAgMDoJMGYgMGQgMDMgWyAJXSpwcmVmZXRjaCBcKCVlYnhcKQotICAgMzoJMGYgMGQgMGMgNzUgMDAgMTAgMDAgMDAgWyAJXSpwcmVmZXRjaHcgMHgxMDAwXCgsJWVzaSwyXCkKLSAgIGI6CTBmIDBlIFsgCV0qZmVtbXMgIAotICAgZDoJMGYgMGYgMDAgYmYgWyAJXSpwYXZndXNiIFwoJWVheFwpLCVtbTAKLSAgMTE6CTBmIDBmIDQ4IDAyIDFkIFsgCV0qcGYyaWQgIDB4MlwoJWVheFwpLCVtbTEKLSAgMTY6CTBmIDBmIDkwIDAwIDAxIDAwIDAwIGFlIFsgCV0qcGZhY2MgIDB4MTAwXCglZWF4XCksJW1tMgotICAxZToJMGYgMGYgMWUgOWUgWyAJXSpwZmFkZCAgXCglZXNpXCksJW1tMwotICAyMjoJMGYgMGYgNjYgMDIgYjAgWyAJXSpwZmNtcGVxIDB4MlwoJWVzaVwpLCVtbTQKLSAgMjc6CTBmIDBmIGFlIDkwIDkwIDAwIDAwIDkwIFsgCV0qcGZjbXBnZSAweDkwOTBcKCVlc2lcKSwlbW01Ci0gIDJmOgkwZiAwZiA3NCA3NSAwMCBhMCBbIAldKnBmY21wZ3QgMHgwXCglZWJwLCVlc2ksMlwpLCVtbTYKLSAgMzU6CTBmIDBmIDdjIDc1IDAyIGE0IFsgCV0qcGZtYXggIDB4MlwoJWVicCwlZXNpLDJcKSwlbW03Ci0gIDNiOgkwZiAwZiA4NCA3NSA5MCA5MCA5MCA5MCA5NCBbIAldKnBmbWluICAweDkwOTA5MDkwXCglZWJwLCVlc2ksMlwpLCVtbTAKLSAgNDQ6CTBmIDBmIDBkIDA0IDAwIDAwIDAwIGI0IFsgCV0qcGZtdWwgIDB4NCwlbW0xCi0gIDRjOgkyZSAwZiAwZiA1NCBjMyAwNyA5NiBbIAldKnBmcmNwICAlY3M6MHg3XCglZWJ4LCVlYXgsOFwpLCVtbTIKLSAgNTM6CTBmIDBmIGQ4IGE2IFsgCV0qcGZyY3BpdDEgJW1tMCwlbW0zCi0gIDU3OgkwZiAwZiBlMSBiNiBbIAldKnBmcmNwaXQyICVtbTEsJW1tNAotICA1YjoJMGYgMGYgZWEgYTcgWyAJXSpwZnJzcWl0MSAlbW0yLCVtbTUKLSAgNWY6CTBmIDBmIGYzIDk3IFsgCV0qcGZyc3FydCAlbW0zLCVtbTYKLSAgNjM6CTBmIDBmIGZjIDlhIFsgCV0qcGZzdWIgICVtbTQsJW1tNwotICA2NzoJMGYgMGYgYzUgYWEgWyAJXSpwZnN1YnIgJW1tNSwlbW0wCi0gIDZiOgkwZiAwZiBjZSAwZCBbIAldKnBpMmZkICAlbW02LCVtbTEKLSAgNmY6CTBmIDBmIGQ3IGI3IFsgCV0qcGZtdWxocncgJW1tNywlbW0yCi0gIDczOgkyZSAwZiBbIAldKlwoYmFkXCkgIAotICA3NToJMGYgNTQgYzMgWyAJXSphbmRwcyAgJXhtbTMsJXhtbTAKLSAgNzg6CTA3IFsgCV0qcG9wICAgICVlcwotICA3OToJYzMgWyAJXSpyZXQgICAgCi0gIDdhOgk5MCBbIAldKm5vcCAgICAKLSAgN2I6CTkwIFsgCV0qbm9wICAgIAotICA3YzoJOTAgWyAJXSpub3AgICAgCi0gIDdkOgk5MCBbIAldKm5vcCAgICAKLSAgN2U6CTkwIFsgCV0qbm9wICAgIAotICA3ZjoJOTAgWyAJXSpub3AgICAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2FtZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9hbWQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY0Y2Q0NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2FtZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotI0FNRCAzRE5vdyEgaW5zdHJ1Y3Rpb25zCi0KLS50ZXh0Ci0gcHJlZmV0Y2gJKCVlYngpCi0gcHJlZmV0Y2h3CTB4MTAwMCgsJWVzaSwyKQotIGZlbW1zCi0gcGF2Z3VzYgkoJWVheCksJW1tMAotIHBmMmlkCQkyKCVlYXgpLCVtbTEKLSBwZmFjYwkJMHgxMDAoJWVheCksJW1tMgotIHBmYWRkCQkoJWVzaSksJW1tMwotIHBmY21wZXEJMiglZXNpKSwlbW00Ci0gcGZjbXBnZQkweDkwOTAoJWVzaSksJW1tNQotIHBmY21wZ3QJKCVlYnAsJWVzaSwyKSwlbW02Ci0gcGZtYXgJCTIoJWVicCwlZXNpLDIpLCVtbTcKLSBwZm1pbgkJMHg5MDkwOTA5MCglZWJwLCVlc2ksMiksJW1tMAotIHBmbXVsCQk0LCVtbTEKLSBwZnJjcAkJJWNzOjcoJWVieCwlZWF4LDgpLCVtbTIKLSBwZnJjcGl0MQklbW0wLCVtbTMKLSBwZnJjcGl0MgklbW0xLCVtbTQKLSBwZnJzcWl0MQklbW0yLCVtbTUKLSBwZnJzcXJ0CSVtbTMsJW1tNgotIHBmc3ViCQklbW00LCVtbTcKLSBwZnN1YnIJCSVtbTUsJW1tMAotIHBpMmZkCQklbW02LCVtbTEKLSBwbXVsaHJ3CSVtbTcsJW1tMgotCi0jIFRoaXMgaXMgYSAzRE5vdyEgaW5zdHJ1Y3Rpb24sIHdpdGggYSBwcmVmaXgsIHRoYXQgaXNuJ3QgcXVpdGUgcmlnaHQKLSMgRXZlcnl0aGluZydzIGdvb2QgYmFyIHRoZSBvcGNvZGUgc3VmZml4Ci0uYnl0ZSAweDJlLCAweDBmLCAweDBmLCAweDU0LCAweGMzLCAweDA3LCAweGMzCi0KLSMgUGFkIG91dCB0byBhIGdvb2QgYWxpZ25tZW50Ci0gLmJ5dGUgMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZmxvYXQubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZmxvYXQubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2Y2FkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2Zsb2F0LmwKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0uKjogQXNzZW1ibGVyIG1lc3NhZ2VzOgotLio6MzogV2FybmluZzouKmZhZGRwLioKLS4qOjE0OiBXYXJuaW5nOi4qZnN1YnAuKgotLio6MjU6IFdhcm5pbmc6Lipmc3VicnAuKgotLio6MzY6IFdhcm5pbmc6LipmbXVscC4qCi0uKjo0NzogV2FybmluZzouKmZkaXZwLioKLS4qOjU4OiBXYXJuaW5nOi4qZmRpdnJwLioKLSAgIDEgWyAJXSoucHNpemUgMAotICAgMiBbIAldKi50ZXh0Ci0gICAzIDAwMDAgREVDMSBbIAldKmZhZGQKLS4qV2FybmluZzouKmZhZGRwLioKLSAgIDQgMDAwMiBEOEMzIFsgCV0qZmFkZAklc3RcKDNcKQotICAgNSAwMDA0IEQ4QzMgWyAJXSpmYWRkCSVzdFwoM1wpLCVzdAotICAgNiAwMDA2IERDQzMgWyAJXSpmYWRkCSVzdCwlc3RcKDNcKQotICAgNyAwMDA4IEQ4MDMgWyAJXSpmYWRkcwlcKCVlYnhcKQotICAgOCAwMDBhIERDMDMgWyAJXSpmYWRkbAlcKCVlYnhcKQotICAgOSAwMDBjIERFMDMgWyAJXSpmaWFkZHMJXCglZWJ4XCkKLSAgMTAgMDAwZSBEQTAzIFsgCV0qZmlhZGRsCVwoJWVieFwpCi0gIDExIDAwMTAgREVDMSBbIAldKmZhZGRwCi0gIDEyIDAwMTIgREVDMyBbIAldKmZhZGRwCSVzdFwoM1wpCi0gIDEzIDAwMTQgREVDMyBbIAldKmZhZGRwCSVzdCwlc3RcKDNcKQotICAxNCAwMDE2IERFRTEgWyAJXSpmc3ViCi0uKldhcm5pbmc6Lipmc3VicC4qCi0gIDE1IDAwMTggRDhFMyBbIAldKmZzdWIJJXN0XCgzXCkKLSAgMTYgMDAxYSBEOEUzIFsgCV0qZnN1Ygklc3RcKDNcKSwlc3QKLSAgMTcgMDAxYyBEQ0UzIFsgCV0qZnN1Ygklc3QsJXN0XCgzXCkKLSAgMTggMDAxZSBEODIzIFsgCV0qZnN1YnMJXCglZWJ4XCkKLSAgMTkgMDAyMCBEQzIzIFsgCV0qZnN1YmwJXCglZWJ4XCkKLSAgMjAgMDAyMiBERTIzIFsgCV0qZmlzdWJzCVwoJWVieFwpCi0gIDIxIDAwMjQgREEyMyBbIAldKmZpc3VibAlcKCVlYnhcKQotICAyMiAwMDI2IERFRTEgWyAJXSpmc3VicAotICAyMyAwMDI4IERFRTMgWyAJXSpmc3VicAklc3RcKDNcKQotICAyNCAwMDJhIERFRTMgWyAJXSpmc3VicAklc3QsJXN0XCgzXCkKLSAgMjUgMDAyYyBERUU5IFsgCV0qZnN1YnIKLS4qV2FybmluZzouKmZzdWJycC4qCi0gIDI2IDAwMmUgRDhFQiBbIAldKmZzdWJyCSVzdFwoM1wpCi0gIDI3IDAwMzAgRDhFQiBbIAldKmZzdWJyCSVzdFwoM1wpLCVzdAotICAyOCAwMDMyIERDRUIgWyAJXSpmc3Vicgklc3QsJXN0XCgzXCkKLSAgMjkgMDAzNCBEODJCIFsgCV0qZnN1YnJzCVwoJWVieFwpCi0gIDMwIDAwMzYgREMyQiBbIAldKmZzdWJybAlcKCVlYnhcKQotICAzMSAwMDM4IERFMkIgWyAJXSpmaXN1YnJzCVwoJWVieFwpCi0gIDMyIDAwM2EgREEyQiBbIAldKmZpc3VicmwJXCglZWJ4XCkKLSAgMzMgMDAzYyBERUU5IFsgCV0qZnN1YnJwCi0gIDM0IDAwM2UgREVFQiBbIAldKmZzdWJycAklc3RcKDNcKQotICAzNSAwMDQwIERFRUIgWyAJXSpmc3VicnAJJXN0LCVzdFwoM1wpCi0gIDM2IDAwNDIgREVDOSBbIAldKmZtdWwKLS4qV2FybmluZzouKmZtdWxwLioKLSAgMzcgMDA0NCBEOENCIFsgCV0qZm11bAklc3RcKDNcKQotICAzOCAwMDQ2IEQ4Q0IgWyAJXSpmbXVsCSVzdFwoM1wpLCVzdAotICAzOSAwMDQ4IERDQ0IgWyAJXSpmbXVsCSVzdCwlc3RcKDNcKQotICA0MCAwMDRhIEQ4MEIgWyAJXSpmbXVscwlcKCVlYnhcKQotICA0MSAwMDRjIERDMEIgWyAJXSpmbXVsbAlcKCVlYnhcKQotICA0MiAwMDRlIERFMEIgWyAJXSpmaW11bHMJXCglZWJ4XCkKLSAgNDMgMDA1MCBEQTBCIFsgCV0qZmltdWxsCVwoJWVieFwpCi0gIDQ0IDAwNTIgREVDOSBbIAldKmZtdWxwCi0gIDQ1IDAwNTQgREVDQiBbIAldKmZtdWxwCSVzdFwoM1wpCi0gIDQ2IDAwNTYgREVDQiBbIAldKmZtdWxwCSVzdCwlc3RcKDNcKQotICA0NyAwMDU4IERFRjEgWyAJXSpmZGl2Ci0uKldhcm5pbmc6LipmZGl2cC4qCi0gIDQ4IDAwNWEgRDhGMyBbIAldKmZkaXYJJXN0XCgzXCkKLSAgNDkgMDA1YyBEOEYzIFsgCV0qZmRpdgklc3RcKDNcKSwlc3QKLSAgNTAgMDA1ZSBEQ0YzIFsgCV0qZmRpdgklc3QsJXN0XCgzXCkKLSAgNTEgMDA2MCBEODMzIFsgCV0qZmRpdnMJXCglZWJ4XCkKLSAgNTIgMDA2MiBEQzMzIFsgCV0qZmRpdmwJXCglZWJ4XCkKLSAgNTMgMDA2NCBERTMzIFsgCV0qZmlkaXZzCVwoJWVieFwpCi0gIDU0IDAwNjYgREEzMyBbIAldKmZpZGl2bAlcKCVlYnhcKQotICA1NSAwMDY4IERFRjEgWyAJXSpmZGl2cAotICA1NiAwMDZhIERFRjMgWyAJXSpmZGl2cAklc3RcKDNcKQotICA1NyAwMDZjIERFRjMgWyAJXSpmZGl2cAklc3QsJXN0XCgzXCkKLSAgNTggMDA2ZSBERUY5IFsgCV0qZmRpdnIKLS4qV2FybmluZzouKmZkaXZycC4qCi0gIDU5IDAwNzAgRDhGQiBbIAldKmZkaXZyCSVzdFwoM1wpCi0gIDYwIDAwNzIgRDhGQiBbIAldKmZkaXZyCSVzdFwoM1wpLCVzdAotICA2MSAwMDc0IERDRkIgWyAJXSpmZGl2cgklc3QsJXN0XCgzXCkKLSAgNjIgMDA3NiBEODNCIFsgCV0qZmRpdnJzCVwoJWVieFwpCi0gIDYzIDAwNzggREMzQiBbIAldKmZkaXZybAlcKCVlYnhcKQotICA2NCAwMDdhIERFM0IgWyAJXSpmaWRpdnJzCVwoJWVieFwpCi0gIDY1IDAwN2MgREEzQiBbIAldKmZpZGl2cmwJXCglZWJ4XCkKLSAgNjYgMDA3ZSBERUY5IFsgCV0qZmRpdnJwCi0gIDY3IDAwODAgREVGQiBbIAldKmZkaXZycAklc3RcKDNcKQotICA2OCAwMDgyIERFRkIgWyAJXSpmZGl2cnAJJXN0LCVzdFwoM1wpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2Zsb2F0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2Zsb2F0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjA5ZjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9mbG9hdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLnBzaXplIDAKLS50ZXh0Ci0JZmFkZAotCWZhZGQJJXN0KDMpCi0JZmFkZAklc3QoMyksJXN0Ci0JZmFkZAklc3QsJXN0KDMpCi0JZmFkZHMJKCVlYngpCi0JZmFkZGwJKCVlYngpCi0JZmlhZGRzCSglZWJ4KQotCWZpYWRkbAkoJWVieCkKLQlmYWRkcAotCWZhZGRwCSVzdCgzKQotCWZhZGRwCSVzdCwlc3QoMykKLQlmc3ViCi0JZnN1Ygklc3QoMykKLQlmc3ViCSVzdCgzKSwlc3QKLQlmc3ViCSVzdCwlc3QoMykKLQlmc3VicwkoJWVieCkKLQlmc3VibAkoJWVieCkKLQlmaXN1YnMJKCVlYngpCi0JZmlzdWJsCSglZWJ4KQotCWZzdWJwCi0JZnN1YnAJJXN0KDMpCi0JZnN1YnAJJXN0LCVzdCgzKQotCWZzdWJyCi0JZnN1YnIJJXN0KDMpCi0JZnN1YnIJJXN0KDMpLCVzdAotCWZzdWJyCSVzdCwlc3QoMykKLQlmc3VicnMJKCVlYngpCi0JZnN1YnJsCSglZWJ4KQotCWZpc3VicnMJKCVlYngpCi0JZmlzdWJybAkoJWVieCkKLQlmc3VicnAKLQlmc3VicnAJJXN0KDMpCi0JZnN1YnJwCSVzdCwlc3QoMykKLQlmbXVsCi0JZm11bAklc3QoMykKLQlmbXVsCSVzdCgzKSwlc3QKLQlmbXVsCSVzdCwlc3QoMykKLQlmbXVscwkoJWVieCkKLQlmbXVsbAkoJWVieCkKLQlmaW11bHMJKCVlYngpCi0JZmltdWxsCSglZWJ4KQotCWZtdWxwCi0JZm11bHAJJXN0KDMpCi0JZm11bHAJJXN0LCVzdCgzKQotCWZkaXYKLQlmZGl2CSVzdCgzKQotCWZkaXYJJXN0KDMpLCVzdAotCWZkaXYJJXN0LCVzdCgzKQotCWZkaXZzCSglZWJ4KQotCWZkaXZsCSglZWJ4KQotCWZpZGl2cwkoJWVieCkKLQlmaWRpdmwJKCVlYngpCi0JZmRpdnAKLQlmZGl2cAklc3QoMykKLQlmZGl2cAklc3QsJXN0KDMpCi0JZmRpdnIKLQlmZGl2cgklc3QoMykKLQlmZGl2cgklc3QoMyksJXN0Ci0JZmRpdnIJJXN0LCVzdCgzKQotCWZkaXZycwkoJWVieCkKLQlmZGl2cmwJKCVlYngpCi0JZmlkaXZycwkoJWVieCkKLQlmaWRpdnJsCSglZWJ4KQotCWZkaXZycAotCWZkaXZycAklc3QoMykKLQlmZGl2cnAJJXN0LCVzdCgzKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9nZW5lcmFsLmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2dlbmVyYWwubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQwMzQ0Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2dlbmVyYWwubAorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0uKjogQXNzZW1ibGVyIG1lc3NhZ2VzOgotLio6MTA6IFdhcm5pbmc6LioKLS4qOjEyOiBXYXJuaW5nOi4qCi0uKjoxOTogV2FybmluZzouKgotLio6MjI6IFdhcm5pbmc6LioKLS4qOjgxOiBXYXJuaW5nOi4qCi0uKjo4MjogV2FybmluZzouKgotLio6ODM6IFdhcm5pbmc6LioKLS4qOjg0OiBXYXJuaW5nOi4qCi0uKjo4NTogV2FybmluZzouKgotLio6ODY6IFdhcm5pbmc6LioKLS4qOjg3OiBXYXJuaW5nOi4qCi0uKjo4ODogV2FybmluZzouKgotLio6ODk6IFdhcm5pbmc6LioKLS4qOjkwOiBXYXJuaW5nOi4qCi0uKjo5MTogV2FybmluZzouKgotLio6OTI6IFdhcm5pbmc6LioKLS4qOjkzOiBXYXJuaW5nOi4qCi0uKjo5NDogV2FybmluZzouKgotLio6OTU6IFdhcm5pbmc6LioKLS4qOjk2OiBXYXJuaW5nOi4qCi0uKjo5NzogV2FybmluZzouKgotLio6OTg6IFdhcm5pbmc6LioKLS4qOjk5OiBXYXJuaW5nOi4qCi0uKjoxMDA6IFdhcm5pbmc6LioKLS4qOjEwMTogV2FybmluZzouKgotLio6MTM1OiBXYXJuaW5nOi4qCi0gICAxICAgICAgICAgICAgICAgICAgICAgICAJLnBzaXplIDAKLSAgIDIgICAgICAgICAgICAgICAgICAgICAgIAkudGV4dAotICAgMyAgICAgICAgICAgICAgICAgICAgICAgCSMgdGVzdCB2YXJpb3VzIHNlZ21lbnQgcmVnIGluc25zCi0gICA0IDAwMDAgMUUgICAgICAgICAgICAgICAgCQlwdXNoCSVkcwotICAgNSAwMDAxIDFFICAgICAgICAgICAgICAgIAkJcHVzaGwJJWRzCi0gICA2IDAwMDIgMUYgICAgICAgICAgICAgICAgCQlwb3AJJWRzCi0gICA3IDAwMDMgMUYgICAgICAgICAgICAgICAgCQlwb3BsCSVkcwotICAgOCAwMDA0IDhDRDggICAgICAgICAgICAgIAkJbW92CSVkcywlZWF4Ci0gICA5IDAwMDYgOENEOCAgICAgICAgICAgICAgCQltb3ZsCSVkcywlZWF4Ci0gIDEwIDAwMDggOENEOCAgICAgICAgICAgICAgCQltb3ZsCSVkcywlYXgKLS4qV2FybmluZzouKgotICAxMSAwMDBhIDhFRDggICAgICAgICAgICAgIAkJbW92CSVlYXgsJWRzCi0gIDEyIDAwMGMgOEVEOCAgICAgICAgICAgICAgCQltb3ZsCSVheCwlZHMKLS4qV2FybmluZzouKgotICAxMyAwMDBlIDhFRDggICAgICAgICAgICAgIAkJbW92bAklZWF4LCVkcwotICAxNCAgICAgICAgICAgICAgICAgICAgICAgCQotICAxNSAwMDEwIDY2MUUgICAgICAgICAgICAgIAkJcHVzaHcJJWRzCi0gIDE2IDAwMTIgNjYxRiAgICAgICAgICAgICAgCQlwb3B3CSVkcwotICAxNyAwMDE0IDY2OENEOCAgICAgICAgICAgIAkJbW92CSVkcywlYXgKLSAgMTggMDAxNyA2NjhDRDggICAgICAgICAgICAJCW1vdncJJWRzLCVheAotICAxOSAwMDFhIDY2OENEOCAgICAgICAgICAgIAkJbW92dwklZHMsJWVheAotLipXYXJuaW5nOi4qCi0gIDIwIDAwMWQgOEVEOCAgICAgICAgICAgICAgCQltb3YJJWF4LCVkcwotICAyMSAwMDFmIDhFRDggICAgICAgICAgICAgIAkJbW92dwklYXgsJWRzCi0gIDIyIDAwMjEgOEVEOCAgICAgICAgICAgICAgCQltb3Z3CSVlYXgsJWRzCi0uKldhcm5pbmc6LioKLSAgMjMgICAgICAgICAgICAgICAgICAgICAgIAkKLSAgMjQgICAgICAgICAgICAgICAgICAgICAgIAkjIHRlc3QgdmFyaW91cyBwdXNoZXMKLSAgMjUgMDAyMyA2QTBBICAgICAgICAgICAgICAJCXB1c2hsCVwkMTAKLSAgMjYgMDAyNSA2NjZBMEEgICAgICAgICAgICAJCXB1c2h3CVwkMTAKLSAgMjcgMDAyOCA2QTBBICAgICAgICAgICAgICAJCXB1c2gJXCQxMAotICAyOCAwMDJhIDY4RTgwMzAwIDAwICAgICAgIAkJcHVzaGwJXCQxMDAwCi0gIDI5IDAwMmYgNjY2OEU4MDMgICAgICAgICAgCQlwdXNodwlcJDEwMDAKLSAgMzAgMDAzMyA2OEU4MDMwMCAwMCAgICAgICAJCXB1c2gJXCQxMDAwCi0gIDMxIDAwMzggRkYzNTU3MDAgMDAwMCAgICAgCQlwdXNobAkxZgotICAzMiAwMDNlIDY2RkYzNTU3IDAwMDAwMCAgIAkJcHVzaHcJMWYKLSAgMzMgMDA0NSBGRjM1NTcwMCAwMDAwICAgICAJCXB1c2gJMWYKLSAgMzQgMDA0YiBGRkIzMEMwMCAwMDAwICAgICAJCXB1c2gJXCgxZi0uXClcKCVlYnhcKQotICAzNSAwMDUxIEZGMzUwNjAwIDAwMDAgICAgIAkJcHVzaAkxZi0uCi0gIDM2ICAgICAgICAgICAgICAgICAgICAgICAJIyB0aGVzZSwgYW5kIG90aGVycyBsaWtlIHRoZW0gc2hvdWxkIGhhdmUgbm8gb3BlcmFuZCBzaXplIHByZWZpeAotICAzNyAwMDU3IDBGMDBEMSAgICAgICAgICAgIAkxOglsbGR0CSVjeAotICAzOCAwMDVhIDBGMDFGMCAgICAgICAgICAgIAkJbG1zdwklYXgKLSAgMzkgICAgICAgICAgICAgICAgICAgICAgIAkKLSAgNDAgICAgICAgICAgICAgICAgICAgICAgIAkjIEp1c3QgdG8gbWFrZSBzdXJlIHRoZXNlIGRvbid0IGJlY29tZSBpbGxlZ2FsIGR1ZSB0byBvdmVyLWVudGh1c2lhc3RpYwotICA0MSAgICAgICAgICAgICAgICAgICAgICAgCSMgcmVnaXN0ZXIgY2hlY2tpbmcKLSAgNDIgMDA1ZCA2NjBGQkVGOCAgICAgICAgICAJCW1vdnNidwklYWwsJWRpCi0gIDQzIDAwNjEgMEZCRUM4ICAgICAgICAgICAgCQltb3ZzYmwJJWFsLCVlY3gKLSAgNDQgMDA2NCAwRkJGQzggICAgICAgICAgICAJCW1vdnN3bAklYXgsJWVjeAotICA0NSAwMDY3IDY2MEZCNkY4ICAgICAgICAgIAkJbW92emJ3CSVhbCwlZGkKLSAgNDYgMDA2YiAwRkI2QzggICAgICAgICAgICAJCW1vdnpibAklYWwsJWVjeAotICA0NyAwMDZlIDBGQjdDOCAgICAgICAgICAgIAkJbW92endsCSVheCwlZWN4Ci0gIDQ4ICAgICAgICAgICAgICAgICAgICAgICAJCi0gIDQ5IDAwNzEgRUMgICAgICAgICAgICAgICAgCQlpbgklZHgsJWFsCi0gIDUwIDAwNzIgNjZFRCAgICAgICAgICAgICAgCQlpbgklZHgsJWF4Ci0gIDUxIDAwNzQgRUQgICAgICAgICAgICAgICAgCQlpbgklZHgsJWVheAotICA1MiAwMDc1IEVDICAgICAgICAgICAgICAgIAkJaW4JXCglZHhcKSwlYWwKLSAgNTMgMDA3NiA2NkVEICAgICAgICAgICAgICAJCWluCVwoJWR4XCksJWF4Ci0gIDU0IDAwNzggRUQgICAgICAgICAgICAgICAgCQlpbglcKCVkeFwpLCVlYXgKLSAgNTUgMDA3OSBFQyAgICAgICAgICAgICAgICAJCWluYgklZHgsJWFsCi0gIDU2IDAwN2EgNjZFRCAgICAgICAgICAgICAgCQlpbncJJWR4LCVheAotICA1NyAwMDdjIEVEICAgICAgICAgICAgICAgIAkJaW5sCSVkeCwlZWF4Ci0gIDU4IDAwN2QgRUMgICAgICAgICAgICAgICAgCQlpbmIJJWR4Ci0gIDU5IDAwN2UgNjZFRCAgICAgICAgICAgICAgCQlpbncJJWR4Ci0gIDYwIDAwODAgRUQgICAgICAgICAgICAgICAgCQlpbmwJJWR4Ci0gIDYxIDAwODEgRTRGRiAgICAgICAgICAgICAgCQlpbmIJXCQyNTUKLSAgNjIgMDA4MyA2NkU1MDIgICAgICAgICAgICAJCWludwlcJDIKLSAgNjMgMDA4NiBFNTA0ICAgICAgICAgICAgICAJCWlubAlcJDQKLSAgNjQgMDA4OCBFRiAgICAgICAgICAgICAgICAJCW91dGwJJWVheCwlZHgKLSAgNjUgMDA4OSBFNjJBICAgICAgICAgICAgICAJCW91dAklYWwsIFwkNDIKLSAgNjYgMDA4YiA2NkU1MEQgICAgICAgICAgICAJCWluCVwkMTMsICVheAotICA2NyAgICAgICAgICAgICAgICAgICAgICAgCSMgVGhlc2UgYXJlIHVzZWQgaW4gQUlYLgotICA2OCAwMDhlIDY2RUQgICAgICAgICAgICAgIAkJaW53CVwoJWR4XCkKLSAgNjkgMDA5MCA2NkVGICAgICAgICAgICAgICAJCW91dHcJXCglZHhcKQotICA3MCAgICAgICAgICAgICAgICAgICAgICAgCQotICA3MSAwMDkyIEE0ICAgICAgICAgICAgICAgIAkJbW92c2IKLSAgNzIgMDA5MyA2NkE3ICAgICAgICAgICAgICAJCWNtcHN3Ci0gIDczIDAwOTUgQUYgICAgICAgICAgICAgICAgCQlzY2FzbAotICA3NCAwMDk2IEQ3ICAgICAgICAgICAgICAgIAkJeGxhdGIKLSAgNzUgMDA5NyAyRUE1ICAgICAgICAgICAgICAJCW1vdnNsCSVjczpcKCVlc2lcKSwlZXM6XCglZWRpXCkKLSAgNzYgMDA5OSAwRjkzMDMgICAgICAgICAgICAJCXNldGFlCVwoJWVieFwpCi0gIDc3IDAwOWMgMEY5MzAzICAgICAgICAgICAgCQlzZXRhZWIJXCglZWJ4XCkKLSAgNzggMDA5ZiAwRjkzQzAgICAgICAgICAgICAJCXNldGFlCSVhbAotICA3OSAgICAgICAgICAgICAgICAgICAgICAgCQotICA4MCAgICAgICAgICAgICAgICAgICAgICAgCSN0aGVzZSBzaG91bGQgZ2l2ZSB3YXJuaW5ncwotICA4MSAwMGEyIDBDMDEgICAgICAgICAgICAgIAkJb3JiCVwkMSwlYXgKLS4qV2FybmluZzouKgotICA4MiAwMGE0IDBDMDEgICAgICAgICAgICAgIAkJb3JiCVwkMSwlZWF4Ci0uKldhcm5pbmc6LioKLSAgODMgMDBhNiA4MENCMDEgICAgICAgICAgICAJCW9yYglcJDEsJWJ4Ci0uKldhcm5pbmc6LioKLSAgODQgMDBhOSA4MENCMDEgICAgICAgICAgICAJCW9yYglcJDEsJWVieAotLipXYXJuaW5nOi4qCi0gIDg1IDAwYWMgRDlDMSAgICAgICAgICAgICAgCQlmbGRsCSVzdFwoMVwpCi0uKldhcm5pbmc6LioKLSAgODYgMDBhZSBEREQyICAgICAgICAgICAgICAJCWZzdGwJJXN0XCgyXCkKLS4qV2FybmluZzouKgotICA4NyAwMGIwIEREREIgICAgICAgICAgICAgIAkJZnN0cGwJJXN0XCgzXCkKLS4qV2FybmluZzouKgotICA4OCAwMGIyIEQ4RDQgICAgICAgICAgICAgIAkJZmNvbWwJJXN0XCg0XCkKLS4qV2FybmluZzouKgotICA4OSAwMGI0IEQ4REQgICAgICAgICAgICAgIAkJZmNvbXBsCSVzdFwoNVwpCi0uKldhcm5pbmc6LioKLSAgOTAgMDBiNiBERUMxICAgICAgICAgICAgICAJCWZhZGRwCSVzdFwoMVwpLCVzdAotLipXYXJuaW5nOi4qCi0gIDkxIDAwYjggREVDQSAgICAgICAgICAgICAgCQlmbXVscAklc3RcKDJcKSwlc3QKLS4qV2FybmluZzouKgotICA5MiAwMGJhIERFRTMgICAgICAgICAgICAgIAkJZnN1YnAJJXN0XCgzXCksJXN0Ci0uKldhcm5pbmc6LioKLSAgOTMgMDBiYyBERUVDICAgICAgICAgICAgICAJCWZzdWJycAklc3RcKDRcKSwlc3QKLS4qV2FybmluZzouKgotICA5NCAwMGJlIERFRjUgICAgICAgICAgICAgIAkJZmRpdnAJJXN0XCg1XCksJXN0Ci0uKldhcm5pbmc6LioKLSAgOTUgMDBjMCBERUZFICAgICAgICAgICAgICAJCWZkaXZycAklc3RcKDZcKSwlc3QKLS4qV2FybmluZzouKgotICA5NiAwMGMyIERFQzEgICAgICAgICAgICAgIAkJZmFkZAotLipXYXJuaW5nOi4qCi0gIDk3IDAwYzQgREVFMSAgICAgICAgICAgICAgCQlmc3ViCi0uKldhcm5pbmc6LioKLSAgOTggMDBjNiBERUM5ICAgICAgICAgICAgICAJCWZtdWwKLS4qV2FybmluZzouKgotICA5OSAwMGM4IERFRjEgICAgICAgICAgICAgIAkJZmRpdgotLipXYXJuaW5nOi4qCi0gMTAwIDAwY2EgREVFOSAgICAgICAgICAgICAgCQlmc3VicgotLipXYXJuaW5nOi4qCi0gMTAxIDAwY2MgREVGOSAgICAgICAgICAgICAgCQlmZGl2cgotLipXYXJuaW5nOi4qCi0gMTAyICAgICAgICAgICAgICAgICAgICAgICAJI3RoZXNlIHNob3VsZCBhbGwgYmUgbGVnYWwKLSAxMDMgMDBjZSAwRkEzMTU1NiAzNDEyMDAgICAJCWJ0bAklZWR4LCAweDEyMzQ1NgotIDEwNCAwMGQ1IDBGQTNEMCAgICAgICAgICAgIAkJYnRsCSVlZHgsICVlYXgKLSAxMDUgMDBkOCAwQzAxICAgICAgICAgICAgICAJCW9yYglcJDEsJWFsCi0gMTA2IDAwZGEgODBDQjAxICAgICAgICAgICAgCQlvcmIJXCQxLCVibAotIDEwNyAwMGRkIEExMTEwMDAwIDAwICAgICAgIAkJbW92bAkxNywlZWF4Ci0gMTA4IDAwZTIgQTExMTAwMDAgMDAgICAgICAgCQltb3YJMTcsJWVheAotIDEwOSAwMGU3IDY2RUQgICAgICAgICAgICAgIAkJaW53CSVkeCwlYXgKLSAxMTAgMDBlOSBFRCAgICAgICAgICAgICAgICAJCWlubAklZHgsJWVheAotIDExMSAwMGVhIDY2RUQgICAgICAgICAgICAgIAkJaW53CVwoJWR4XCksJWF4Ci0gMTEyIDAwZWMgRUQgICAgICAgICAgICAgICAgCQlpbmwJXCglZHhcKSwlZWF4Ci0gMTEzIDAwZWQgRUMgICAgICAgICAgICAgICAgCQlpbglcKCVkeFwpLCVhbAotIDExNCAwMGVlIDY2RUQgICAgICAgICAgICAgIAkJaW4JXCglZHhcKSwlYXgKLSAxMTUgMDBmMCBFRCAgICAgICAgICAgICAgICAJCWluCVwoJWR4XCksJWVheAotIDExNiAwMGYxIDBGQjYxNDM3ICAgICAgICAgIAkJbW92emJsCVwoJWVkaSwlZXNpXCksJWVkeAotIDExNyAwMGY1IDBGQjY0NTFDICAgICAgICAgIAkJbW92emJsCTI4XCglZWJwXCksJWVheAotIDExOCAwMGY5IDBGQjZDMCAgICAgICAgICAgIAkJbW92emJsCSVhbCwlZWF4Ci0gMTE5IDAwZmMgMEZCNkYxICAgICAgICAgICAgCQltb3Z6YmwJJWNsLCVlc2kKLSAxMjAgMDBmZiAyNkQ3ICAgICAgICAgICAgICAJCXhsYXQJJWVzOlwoJWVieFwpCi0gMTIxIDAxMDEgRDcgICAgICAgICAgICAgICAgCQl4bGF0Ci0gMTIyIDAxMDIgRDcgICAgICAgICAgICAgICAgCQl4bGF0YgotIDEyMyAwMTAzIERERDggICAgICAgICAgICAgIAkxOglmc3RwCSVzdFwoMFwpCi0gMTI0IDAxMDUgRTJGQyAgICAgICAgICAgICAgCQlsb29wCTFiCi0gMTI1IDAxMDcgRjZGMSAgICAgICAgICAgICAgCQlkaXZiICAgICVjbCAKLSAxMjYgMDEwOSA2NkY3RjEgICAgICAgICAgICAJCWRpdncgICAgJWN4IAotIDEyNyAwMTBjIEY3RjEgICAgICAgICAgICAgIAkJZGl2bCAgICAlZWN4Ci0gMTI4IDAxMGUgRjZGMSAgICAgICAgICAgICAgCQlkaXYJJWNsCi0gMTI5IDAxMTAgNjZGN0YxICAgICAgICAgICAgCQlkaXYJJWN4Ci0gMTMwIDAxMTMgRjdGMSAgICAgICAgICAgICAgCQlkaXYJJWVjeAotIDEzMSAwMTE1IEY2RjEgICAgICAgICAgICAgIAkJZGl2CSVjbCwlYWwKLSAxMzIgMDExNyA2NkY3RjEgICAgICAgICAgICAJCWRpdgklY3gsJWF4Ci0gMTMzIDAxMWEgRjdGMSAgICAgICAgICAgICAgCQlkaXYJJWVjeCwlZWF4Ci0gMTM0IDAxMWMgOEVERSAgICAgICAgICAgICAgCQltb3YJJXNpLCVkcwotIDEzNSAwMTFlIDhFREUgICAgICAgICAgICAgIAkJbW92bAklc2ksJWRzCQkjIHdhcm5pbmcgaGVyZQotLipXYXJuaW5nOi4qCi0gMTM2IDAxMjAgMUUgICAgICAgICAgICAgICAgCQlwdXNobAklZHMKLSAxMzcgMDEyMSAxRSAgICAgICAgICAgICAgICAJCXB1c2gJJWRzCi0gMTM4IDAxMjIgQTAwMDAwMDAgMDAgICAgICAgCQltb3YJMCwlYWwKLSAxMzkgMDEyNyA2NkExMDAwMCAwMTAwICAgICAJCW1vdgkweDEwMDAwLCVheAotIDE0MCAwMTJkIDg5QzMgICAgICAgICAgICAgIAkJbW92CSVlYXgsJWVieAotIDE0MSAwMTJmIDlDICAgICAgICAgICAgICAgIAkJcHVzaGYKLSAxNDIgMDEzMCA5QyAgICAgICAgICAgICAgICAJCXB1c2hmbAotIDE0MyAwMTMxIDY2OUMgICAgICAgICAgICAgIAkJcHVzaGZ3Ci0gMTQ0IDAxMzMgOUQgICAgICAgICAgICAgICAgCQlwb3BmCi0gMTQ1IDAxMzQgOUQgICAgICAgICAgICAgICAgCQlwb3BmbAotIDE0NiAwMTM1IDY2OUQgICAgICAgICAgICAgIAkJcG9wZncKLSAxNDcgMDEzNyA4OTM0MUQwMCAwMDAwMDAgICAJCW1vdgklZXNpLFwoLCVlYngsMVwpCi0gMTQ4IDAxM2UgODAyNTAwMDAgMDAwMDdGICAgCQlhbmRiCVwkfjB4ODAsZm9vCi0gMTQ5ICAgICAgICAgICAgICAgICAgICAgICAJCi0gMTUwICAgICAgICAgICAgICAgICAgICAgICAJCSMgRm9yY2UgYSBnb29kIGFsaWdubWVudC4KLSAxNTEgMDE0NSAwMDAwICAgICAgICAgICAgICAJCS53b3JkCTAKLSAxNTIgMDE0NyAwMCAgICAgICAgICAgICAgICAJCS5ieXRlCTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZ2VuZXJhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9nZW5lcmFsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3M2Y0ODkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9nZW5lcmFsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLnBzaXplIDAKLS50ZXh0Ci0jIHRlc3QgdmFyaW91cyBzZWdtZW50IHJlZyBpbnNucwotCXB1c2gJJWRzCi0JcHVzaGwJJWRzCi0JcG9wCSVkcwotCXBvcGwJJWRzCi0JbW92CSVkcywlZWF4Ci0JbW92bAklZHMsJWVheAotCW1vdmwJJWRzLCVheAotCW1vdgklZWF4LCVkcwotCW1vdmwJJWF4LCVkcwotCW1vdmwJJWVheCwlZHMKLQotCXB1c2h3CSVkcwotCXBvcHcJJWRzCi0JbW92CSVkcywlYXgKLQltb3Z3CSVkcywlYXgKLQltb3Z3CSVkcywlZWF4Ci0JbW92CSVheCwlZHMKLQltb3Z3CSVheCwlZHMKLQltb3Z3CSVlYXgsJWRzCi0KLSMgdGVzdCB2YXJpb3VzIHB1c2hlcwotCXB1c2hsCSQxMAotCXB1c2h3CSQxMAotCXB1c2gJJDEwCi0JcHVzaGwJJDEwMDAKLQlwdXNodwkkMTAwMAotCXB1c2gJJDEwMDAKLQlwdXNobAkxZgotCXB1c2h3CTFmCi0JcHVzaAkxZgotCXB1c2gJKDFmLS4pKCVlYngpCi0JcHVzaAkxZi0uCi0jIHRoZXNlLCBhbmQgb3RoZXJzIGxpa2UgdGhlbSBzaG91bGQgaGF2ZSBubyBvcGVyYW5kIHNpemUgcHJlZml4Ci0xOglsbGR0CSVjeAotCWxtc3cJJWF4Ci0KLSMgSnVzdCB0byBtYWtlIHN1cmUgdGhlc2UgZG9uJ3QgYmVjb21lIGlsbGVnYWwgZHVlIHRvIG92ZXItZW50aHVzaWFzdGljCi0jIHJlZ2lzdGVyIGNoZWNraW5nCi0JbW92c2J3CSVhbCwlZGkKLQltb3ZzYmwJJWFsLCVlY3gKLQltb3Zzd2wJJWF4LCVlY3gKLQltb3Z6YncJJWFsLCVkaQotCW1vdnpibAklYWwsJWVjeAotCW1vdnp3bAklYXgsJWVjeAotCi0JaW4JJWR4LCVhbAotCWluCSVkeCwlYXgKLQlpbgklZHgsJWVheAotCWluCSglZHgpLCVhbAotCWluCSglZHgpLCVheAotCWluCSglZHgpLCVlYXgKLQlpbmIJJWR4LCVhbAotCWludwklZHgsJWF4Ci0JaW5sCSVkeCwlZWF4Ci0JaW5iCSVkeAotCWludwklZHgKLQlpbmwJJWR4Ci0JaW5iCSQyNTUKLQlpbncJJDIKLQlpbmwJJDQKLQlvdXRsCSVlYXgsJWR4Ci0Jb3V0CSVhbCwgJDQyCi0JaW4JJDEzLCAlYXgKLSMgVGhlc2UgYXJlIHVzZWQgaW4gQUlYLgotCWludwkoJWR4KQotCW91dHcJKCVkeCkKLQotCW1vdnNiCi0JY21wc3cKLQlzY2FzbAotCXhsYXRiCi0JbW92c2wJJWNzOiglZXNpKSwlZXM6KCVlZGkpCi0Jc2V0YWUJKCVlYngpCi0Jc2V0YWViCSglZWJ4KQotCXNldGFlCSVhbAotCi0jdGhlc2Ugc2hvdWxkIGdpdmUgd2FybmluZ3MKLQlvcmIJJDEsJWF4Ci0Jb3JiCSQxLCVlYXgKLQlvcmIJJDEsJWJ4Ci0Jb3JiCSQxLCVlYngKLQlmbGRsCSVzdCgxKQotCWZzdGwJJXN0KDIpCi0JZnN0cGwJJXN0KDMpCi0JZmNvbWwJJXN0KDQpCi0JZmNvbXBsCSVzdCg1KQotCWZhZGRwCSVzdCgxKSwlc3QKLQlmbXVscAklc3QoMiksJXN0Ci0JZnN1YnAJJXN0KDMpLCVzdAotCWZzdWJycAklc3QoNCksJXN0Ci0JZmRpdnAJJXN0KDUpLCVzdAotCWZkaXZycAklc3QoNiksJXN0Ci0JZmFkZAotCWZzdWIKLQlmbXVsCi0JZmRpdgotCWZzdWJyCi0JZmRpdnIKLSN0aGVzZSBzaG91bGQgYWxsIGJlIGxlZ2FsCi0JYnRsCSVlZHgsIDB4MTIzNDU2Ci0JYnRsCSVlZHgsICVlYXgKLQlvcmIJJDEsJWFsCi0Jb3JiCSQxLCVibAotCW1vdmwJMTcsJWVheAotCW1vdgkxNywlZWF4Ci0JaW53CSVkeCwlYXgKLQlpbmwJJWR4LCVlYXgKLQlpbncJKCVkeCksJWF4Ci0JaW5sCSglZHgpLCVlYXgKLQlpbgkoJWR4KSwlYWwKLQlpbgkoJWR4KSwlYXgKLQlpbgkoJWR4KSwlZWF4Ci0JbW92emJsCSglZWRpLCVlc2kpLCVlZHgKLQltb3Z6YmwJMjgoJWVicCksJWVheAotCW1vdnpibAklYWwsJWVheAotCW1vdnpibAklY2wsJWVzaQotCXhsYXQJJWVzOiglZWJ4KQotCXhsYXQKLQl4bGF0YgotMToJZnN0cAklc3QoMCkKLQlsb29wCTFiCi0JZGl2YiAgICAlY2wgCi0JZGl2dyAgICAlY3ggCi0JZGl2bCAgICAlZWN4Ci0JZGl2CSVjbAotCWRpdgklY3gKLQlkaXYJJWVjeAotCWRpdgklY2wsJWFsCi0JZGl2CSVjeCwlYXgKLQlkaXYJJWVjeCwlZWF4Ci0JbW92CSVzaSwlZHMKLQltb3ZsCSVzaSwlZHMJCSMgd2FybmluZyBoZXJlCi0JcHVzaGwJJWRzCi0JcHVzaAklZHMKLQltb3YJMCwlYWwKLQltb3YJMHgxMDAwMCwlYXgKLQltb3YJJWVheCwlZWJ4Ci0JcHVzaGYKLQlwdXNoZmwKLQlwdXNoZncKLQlwb3BmCi0JcG9wZmwKLQlwb3BmdwotCW1vdgklZXNpLCgsJWVieCwxKQotCWFuZGIJJH4weDgwLGZvbwotCi0JIyBGb3JjZSBhIGdvb2QgYWxpZ25tZW50LgotCS53b3JkCTAKLQkuYnl0ZQkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2kzODYuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pMzg2LmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQwNDlmNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2kzODYuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIwotIyBpMzg2IHRlc3RzCi0jCi1wcm9jIHJ1bl9saXN0X3Rlc3QgeyBuYW1lIG9wdHMgfSB7Ci0gICAgZ2xvYmFsIHNyY2RpciBzdWJkaXIKLSAgICBzZXQgdGVzdG5hbWUgImkzODYgJG5hbWUiCi0gICAgc2V0IGZpbGUgJHNyY2Rpci8kc3ViZGlyLyRuYW1lCi0gICAgZ2FzX3J1biAke25hbWV9LnMgJG9wdHMgIj4mZHVtcC5vdXQiCi0gICAgaWYgeyBbcmVnZXhwX2RpZmYgImR1bXAub3V0IiAiJHtmaWxlfS5sIl0gfSB0aGVuIHsKLQlmYWlsICR0ZXN0bmFtZQotCXZlcmJvc2UgIm91dHB1dCBpcyBbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXSIgMgotCXJldHVybgotICAgIH0KLSAgICBwYXNzICR0ZXN0bmFtZQotfQotCi0KLWlmIFtpc3RhcmdldCAiaSo4Ni0qLSoiXSB0aGVuIHsKLQotICAgIHJ1bl9saXN0X3Rlc3QgImZsb2F0IiAiLWFsIgotICAgIHJ1bl9saXN0X3Rlc3QgImdlbmVyYWwiICItYWwgLS1saXN0aW5nLWxocy13aWR0aD0yIgotICAgIHJ1bl9saXN0X3Rlc3QgImludmFsIiAiLWFsIgotICAgIHJ1bl9saXN0X3Rlc3QgIm1vZHJtIiAiLWFsIC0tbGlzdGluZy1saHMtd2lkdGg9MiIKLSAgICBydW5fZHVtcF90ZXN0ICJvcGNvZGUiCi0gICAgcnVuX2R1bXBfdGVzdCAicHJlZml4IgotICAgIHJ1bl9kdW1wX3Rlc3QgImFtZCIKLSAgICBydW5fZHVtcF90ZXN0ICJrYXRtYWkiCi0KLSAgICAjIFRoZSByZWxvYyBhbmQgd2hpdGUgdGVzdHMgcmVxdWlyZSBzdXBwb3J0IGZvciA4IGFuZCAxNiBiaXQKLSAgICAjIHJlbG9jcywgc28gd2Ugb25seSBydW4gdGhlbSBmb3IgRUxGIHRhcmdldHMuCi0gICAgaWYge1tpc3RhcmdldCAiKi0qLWVsZioiXSB8fCBbaXN0YXJnZXQgIiotKi1saW51eCoiXX0gdGhlbiB7Ci0JcnVuX2R1bXBfdGVzdCAicmVsb2MiCi0JcnVuX2xpc3RfdGVzdCAid2hpdGUiICItYWwgLS1saXN0aW5nLWxocy13aWR0aD0zIgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaW52YWwubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaW52YWwubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4OTQ5OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludmFsLmwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0uKjogQXNzZW1ibGVyIG1lc3NhZ2VzOgotLio6MzogRXJyb3I6IC4qCi0uKjo0OiBFcnJvcjogLioKLS4qOjU6IEVycm9yOiAuKgotLio6NjogRXJyb3I6IC4qCi0uKjo3OiBFcnJvcjogLioKLS4qOjg6IEVycm9yOiAuKgotLio6OTogRXJyb3I6IC4qCi0uKjoxMDogRXJyb3I6IC4qCi0uKjoxMTogRXJyb3I6IC4qCi0uKjoxMjogRXJyb3I6IC4qCi0uKjoxMzogRXJyb3I6IC4qCi0uKjoxNDogRXJyb3I6IC4qCi0uKjoxNTogRXJyb3I6IC4qCi0uKjoxNjogRXJyb3I6IC4qCi0uKjoxNzogRXJyb3I6IC4qCi0uKjoxODogRXJyb3I6IC4qCi0uKjoxOTogRXJyb3I6IC4qCi0uKjoyMDogRXJyb3I6IC4qCi0uKjoyMTogRXJyb3I6IC4qCi0uKjoyMjogRXJyb3I6IC4qCi0uKjoyMzogRXJyb3I6IC4qCi0uKjoyNDogRXJyb3I6IC4qCi0uKjoyNTogRXJyb3I6IC4qCi0uKjoyNjogRXJyb3I6IC4qCi0uKjoyNzogRXJyb3I6IC4qCi0uKjoyODogRXJyb3I6IC4qCi0uKjoyOTogRXJyb3I6IC4qCi0uKjozMDogRXJyb3I6IC4qCi0uKjozMTogRXJyb3I6IC4qCi0uKjozMjogRXJyb3I6IC4qCi0uKjozMzogRXJyb3I6IC4qCi0uKjozNDogRXJyb3I6IC4qCi0uKjozNTogRXJyb3I6IC4qCi0uKjozNjogRXJyb3I6IC4qCi0uKjozNzogRXJyb3I6IC4qCi0uKjozODogRXJyb3I6IC4qCi0uKjozOTogRXJyb3I6IC4qCi0uKjo0MDogRXJyb3I6IC4qCi0uKjo0MTogRXJyb3I6IC4qCi0uKjo0MjogRXJyb3I6IC4qCi0uKjo0MzogRXJyb3I6IC4qCi0uKjo0NDogRXJyb3I6IC4qCi0uKjo0NTogRXJyb3I6IC4qCi0uKjo0NjogRXJyb3I6IC4qCi0uKjo0NzogRXJyb3I6IC4qCi0uKjo0ODogRXJyb3I6IC4qCi1HQVMgTElTVElORyAuKgotCi0KLSAgIDEgWyAJXSoJLnRleHQKLSAgIDIgWyAJXSojIEFsbCB0aGUgZm9sbG93aW5nIHNob3VsZCBiZSBpbGxlZ2FsCi0gICAzIFsgCV0qCW1vdglcKCVkeFwpLCVhbAotICAgNCBbIAldKgltb3YJXCglZWF4LCVlc3AsMlwpLCVhbAotICAgNSBbIAldKglzZXRhZQklZWF4Ci0gICA2IFsgCV0qCXB1c2hiCSVkcwotICAgNyBbIAldKglwb3BiCSVkcwotICAgOCBbIAldKglwdXNoYgklYWwKLSAgIDkgWyAJXSoJcG9wYgklYWwKLSAgMTAgWyAJXSoJcHVzaGIJJWFoCi0gIDExIFsgCV0qCXBvcGIJJWFoCi0gIDEyIFsgCV0qCXB1c2hiCSVheAotICAxMyBbIAldKglwb3BiCSVheAotICAxNCBbIAldKglwdXNoYgklZWF4Ci0gIDE1IFsgCV0qCXBvcGIJJWVheAotICAxNiBbIAldKgltb3ZiCSVkcywlYXgKLSAgMTcgWyAJXSoJbW92YgklZHMsJWVheAotICAxOCBbIAldKgltb3ZiCSVheCwlZHMKLSAgMTkgWyAJXSoJbW92YgklZWF4LCVkcwotICAyMCBbIAldKgltb3ZkYgklZWF4LCVtbTAKLSAgMjEgWyAJXSoJbW92cWIJMCwlbW0wCi0gIDIyIFsgCV0qCWxkc2IJMCwlZWF4Ci0gIDIzIFsgCV0qCXNldG5ldwkwCi0gIDI0IFsgCV0qCW1vdmR3CSVlYXgsJW1tMAotICAyNSBbIAldKgltb3ZxdwkwLCVtbTAKLSAgMjYgWyAJXSoJZGl2CSVjeCwlYWwKLSAgMjcgWyAJXSoJZGl2CSVjbCwlYXgKLSAgMjggWyAJXSoJZGl2CSVlY3gsJWFsCi0gIDI5IFsgCV0qCWltdWwJMTAsJWJ4LCVlY3gKLSAgMzAgWyAJXSoJaW11bAkxMCwlYngsJWFsCi0gIDMxIFsgCV0qCXBvcGFiCi0gIDMyIFsgCV0qCXN0aWwKLSAgMzMgWyAJXSoJYWFhYgotICAzNCBbIAldKgljd2RlbAotICAzNSBbIAldKgljd2R3Ci0gIDM2IFsgCV0qCWNhbGx3dwkwCi0gIDM3IFsgCV0qZm9vOglqYXcJZm9vCi0gIDM4IFsgCV0qCWpjeHp3CWZvbwotICAzOSBbIAldKglqZWN4emwJZm9vCi0gIDQwIFsgCV0qCWxvb3BiCWZvbwotICA0MSBbIAldKgl4bGF0dwklZXM6JWJ4Ci0gIDQyIFsgCV0qCXhsYXRsCSVlczolYngKLSAgNDMgWyAJXSoJaW50bAkyCi0gIDQ0IFsgCV0qCWludDNiCi0gIDQ1IFsgCV0qCWhsdGIKLSAgNDYgWyAJXSoJZnN0Ygklc3RcKDBcKQotICA0NyBbIAldKglmY29tcGxsCTI4XCglZWJwXCkKLSAgNDggWyAJXSoJZmxkbHcJXCglZWF4XCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaW52YWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaW52YWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3YTE4ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludmFsLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0JLnRleHQKLSMgQWxsIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIGlsbGVnYWwKLQltb3YJKCVkeCksJWFsCi0JbW92CSglZWF4LCVlc3AsMiksJWFsCi0Jc2V0YWUJJWVheAotCXB1c2hiCSVkcwotCXBvcGIJJWRzCi0JcHVzaGIJJWFsCi0JcG9wYgklYWwKLQlwdXNoYgklYWgKLQlwb3BiCSVhaAotCXB1c2hiCSVheAotCXBvcGIJJWF4Ci0JcHVzaGIJJWVheAotCXBvcGIJJWVheAotCW1vdmIJJWRzLCVheAotCW1vdmIJJWRzLCVlYXgKLQltb3ZiCSVheCwlZHMKLQltb3ZiCSVlYXgsJWRzCi0JbW92ZGIJJWVheCwlbW0wCi0JbW92cWIJMCwlbW0wCi0JbGRzYgkwLCVlYXgKLQlzZXRuZXcJMAotCW1vdmR3CSVlYXgsJW1tMAotCW1vdnF3CTAsJW1tMAotCWRpdgklY3gsJWFsCi0JZGl2CSVjbCwlYXgKLQlkaXYJJWVjeCwlYWwKLQlpbXVsCTEwLCVieCwlZWN4Ci0JaW11bAkxMCwlYngsJWFsCi0JcG9wYWIKLQlzdGlsCi0JYWFhYgotCWN3ZGVsCi0JY3dkdwotCWNhbGx3dwkwCi1mb286CWphdwlmb28KLQlqY3h6dwlmb28KLQlqZWN4emwJZm9vCi0JbG9vcGIJZm9vCi0JeGxhdHcJJWVzOiVieAotCXhsYXRsCSVlczolYngKLQlpbnRsCTIKLQlpbnQzYgotCWhsdGIKLQlmc3RiCSVzdCgwKQotCWZjb21wbGwJMjgoJWVicCkKLQlmbGRsdwkoJWVheCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYva2F0bWFpLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2thdG1haS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTMwZTBjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYva2F0bWFpLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotI29iamR1bXA6IC1kdwotI25hbWU6IGkzODYga2F0bWFpCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAgPC50ZXh0PjoKLSAgIDA6CTBmIDU4IDAxIFsgCV0qYWRkcHMgIFwoJWVjeFwpLCV4bW0wCi0gICAzOgkwZiA1OCBjYSBbIAldKmFkZHBzICAleG1tMiwleG1tMQotICAgNjoJZjMgMGYgNTggMTMgWyAJXSphZGRzcyAgXCglZWJ4XCksJXhtbTIKLSAgIGE6CWYzIDBmIDU4IGRjIFsgCV0qYWRkc3MgICV4bW00LCV4bW0zCi0gICBlOgkwZiA1NSA2NSAwMCBbIAldKmFuZG5wcyAweDBcKCVlYnBcKSwleG1tNAotICAxMjoJMGYgNTUgZWUgWyAJXSphbmRucHMgJXhtbTYsJXhtbTUKLSAgMTU6CTBmIDU0IDM3IFsgCV0qYW5kcHMgIFwoJWVkaVwpLCV4bW02Ci0gIDE4OgkwZiA1NCBmOCBbIAldKmFuZHBzICAleG1tMCwleG1tNwotICAxYjoJMGYgYzIgYzEgMDIgWyAJXSpjbXBsZXBzICV4bW0xLCV4bW0wCi0gIDFmOgkwZiBjMiAwYSAwMyBbIAldKmNtcHVub3JkcHMgXCglZWR4XCksJXhtbTEKLSAgMjM6CWYzIDBmIGMyIGQyIDA0IFsgCV0qY21wbmVxc3MgJXhtbTIsJXhtbTIKLSAgMjg6CWYzIDBmIGMyIDFjIDI0IDA1IFsgCV0qY21wbmx0c3MgXCglZXNwLDFcKSwleG1tMwotICAyZToJMGYgYzIgZTUgMDYgWyAJXSpjbXBubGVwcyAleG1tNSwleG1tNAotICAzMjoJMGYgYzIgMmUgMDcgWyAJXSpjbXBvcmRwcyBcKCVlc2lcKSwleG1tNQotICAzNjoJZjMgMGYgYzIgZjcgMDAgWyAJXSpjbXBlcXNzICV4bW03LCV4bW02Ci0gIDNiOglmMyAwZiBjMiAzOCAwMSBbIAldKmNtcGx0c3MgXCglZWF4XCksJXhtbTcKLSAgNDA6CTBmIGMyIGMxIDAwIFsgCV0qY21wZXFwcyAleG1tMSwleG1tMAotICA0NDoJMGYgYzIgMGEgMDAgWyAJXSpjbXBlcXBzIFwoJWVkeFwpLCV4bW0xCi0gIDQ4OglmMyAwZiBjMiBkMiAwMCBbIAldKmNtcGVxc3MgJXhtbTIsJXhtbTIKLSAgNGQ6CWYzIDBmIGMyIDFjIDI0IDAwIFsgCV0qY21wZXFzcyBcKCVlc3AsMVwpLCV4bW0zCi0gIDUzOgkwZiBjMiBlNSAwMSBbIAldKmNtcGx0cHMgJXhtbTUsJXhtbTQKLSAgNTc6CTBmIGMyIDJlIDAxIFsgCV0qY21wbHRwcyBcKCVlc2lcKSwleG1tNQotICA1YjoJZjMgMGYgYzIgZjcgMDEgWyAJXSpjbXBsdHNzICV4bW03LCV4bW02Ci0gIDYwOglmMyAwZiBjMiAzOCAwMSBbIAldKmNtcGx0c3MgXCglZWF4XCksJXhtbTcKLSAgNjU6CTBmIGMyIDAxIDAyIFsgCV0qY21wbGVwcyBcKCVlY3hcKSwleG1tMAotICA2OToJMGYgYzIgY2EgMDIgWyAJXSpjbXBsZXBzICV4bW0yLCV4bW0xCi0gIDZkOglmMyAwZiBjMiAxMyAwMiBbIAldKmNtcGxlc3MgXCglZWJ4XCksJXhtbTIKLSAgNzI6CWYzIDBmIGMyIGRjIDAyIFsgCV0qY21wbGVzcyAleG1tNCwleG1tMwotICA3NzoJMGYgYzIgNjUgMDAgMDMgWyAJXSpjbXB1bm9yZHBzIDB4MFwoJWVicFwpLCV4bW00Ci0gIDdjOgkwZiBjMiBlZSAwMyBbIAldKmNtcHVub3JkcHMgJXhtbTYsJXhtbTUKLSAgODA6CWYzIDBmIGMyIDM3IDAzIFsgCV0qY21wdW5vcmRzcyBcKCVlZGlcKSwleG1tNgotICA4NToJZjMgMGYgYzIgZjggMDMgWyAJXSpjbXB1bm9yZHNzICV4bW0wLCV4bW03Ci0gIDhhOgkwZiBjMiBjMSAwNCBbIAldKmNtcG5lcXBzICV4bW0xLCV4bW0wCi0gIDhlOgkwZiBjMiAwYSAwNCBbIAldKmNtcG5lcXBzIFwoJWVkeFwpLCV4bW0xCi0gIDkyOglmMyAwZiBjMiBkMiAwNCBbIAldKmNtcG5lcXNzICV4bW0yLCV4bW0yCi0gIDk3OglmMyAwZiBjMiAxYyAyNCAwNCBbIAldKmNtcG5lcXNzIFwoJWVzcCwxXCksJXhtbTMKLSAgOWQ6CTBmIGMyIGU1IDA1IFsgCV0qY21wbmx0cHMgJXhtbTUsJXhtbTQKLSAgYTE6CTBmIGMyIDJlIDA1IFsgCV0qY21wbmx0cHMgXCglZXNpXCksJXhtbTUKLSAgYTU6CWYzIDBmIGMyIGY3IDA1IFsgCV0qY21wbmx0c3MgJXhtbTcsJXhtbTYKLSAgYWE6CWYzIDBmIGMyIDM4IDA1IFsgCV0qY21wbmx0c3MgXCglZWF4XCksJXhtbTcKLSAgYWY6CTBmIGMyIDAxIDA2IFsgCV0qY21wbmxlcHMgXCglZWN4XCksJXhtbTAKLSAgYjM6CTBmIGMyIGNhIDA2IFsgCV0qY21wbmxlcHMgJXhtbTIsJXhtbTEKLSAgYjc6CWYzIDBmIGMyIDEzIDA2IFsgCV0qY21wbmxlc3MgXCglZWJ4XCksJXhtbTIKLSAgYmM6CWYzIDBmIGMyIGRjIDA2IFsgCV0qY21wbmxlc3MgJXhtbTQsJXhtbTMKLSAgYzE6CTBmIGMyIDY1IDAwIDA3IFsgCV0qY21wb3JkcHMgMHgwXCglZWJwXCksJXhtbTQKLSAgYzY6CTBmIGMyIGVlIDA3IFsgCV0qY21wb3JkcHMgJXhtbTYsJXhtbTUKLSAgY2E6CWYzIDBmIGMyIDM3IDA3IFsgCV0qY21wb3Jkc3MgXCglZWRpXCksJXhtbTYKLSAgY2Y6CWYzIDBmIGMyIGY4IDA3IFsgCV0qY21wb3Jkc3MgJXhtbTAsJXhtbTcKLSAgZDQ6CTBmIDJmIGMxIFsgCV0qY29taXNzICV4bW0xLCV4bW0wCi0gIGQ3OgkwZiAyZiAwYSBbIAldKmNvbWlzcyBcKCVlZHhcKSwleG1tMQotICBkYToJMGYgMmEgZDMgWyAJXSpjdnRwaTJwcyAlbW0zLCV4bW0yCi0gIGRkOgkwZiAyYSAxYyAyNCBbIAldKmN2dHBpMnBzIFwoJWVzcCwxXCksJXhtbTMKLSAgZTE6CWYzIDBmIDJhIGU1IFsgCV0qY3Z0c2kyc3MgJWVicCwleG1tNAotICBlNToJZjMgMGYgMmEgMmUgWyAJXSpjdnRzaTJzcyBcKCVlc2lcKSwleG1tNQotICBlOToJMGYgMmQgZjcgWyAJXSpjdnRwczJwaSAleG1tNywlbW02Ci0gIGVjOgkwZiAyZCAzOCBbIAldKmN2dHBzMnBpIFwoJWVheFwpLCVtbTcKLSAgZWY6CWYzIDBmIDJkIDAxIFsgCV0qY3Z0c3Myc2kgXCglZWN4XCksJWVheAotICBmMzoJZjMgMGYgMmQgY2EgWyAJXSpjdnRzczJzaSAleG1tMiwlZWN4Ci0gIGY3OgkwZiAyYyAxMyBbIAldKmN2dHRwczJwaSBcKCVlYnhcKSwlbW0yCi0gIGZhOgkwZiAyYyBkYyBbIAldKmN2dHRwczJwaSAleG1tNCwlbW0zCi0gIGZkOglmMyAwZiAyYyA2NSAwMCBbIAldKmN2dHRzczJzaSAweDBcKCVlYnBcKSwlZXNwCi0gMTAyOglmMyAwZiAyYyBlZSBbIAldKmN2dHRzczJzaSAleG1tNiwlZWJwCi0gMTA2OgkwZiA1ZSBjMSBbIAldKmRpdnBzICAleG1tMSwleG1tMAotIDEwOToJMGYgNWUgMGEgWyAJXSpkaXZwcyAgXCglZWR4XCksJXhtbTEKLSAxMGM6CWYzIDBmIDVlIGQzIFsgCV0qZGl2c3MgICV4bW0zLCV4bW0yCi0gMTEwOglmMyAwZiA1ZSAxYyAyNCBbIAldKmRpdnNzICBcKCVlc3AsMVwpLCV4bW0zCi0gMTE1OgkwZiBhZSA1NSAwMCBbIAldKmxkbXhjc3IgMHgwXCglZWJwXCkKLSAxMTk6CTBmIGFlIDFlIFsgCV0qc3RteGNzciBcKCVlc2lcKQotIDExYzoJMGYgYWUgZjggWyAJXSpzZmVuY2UgCi0gMTFmOgkwZiA1ZiBjMSBbIAldKm1heHBzICAleG1tMSwleG1tMAotIDEyMjoJMGYgNWYgMGEgWyAJXSptYXhwcyAgXCglZWR4XCksJXhtbTEKLSAxMjU6CWYzIDBmIDVmIGQzIFsgCV0qbWF4c3MgICV4bW0zLCV4bW0yCi0gMTI5OglmMyAwZiA1ZiAxYyAyNCBbIAldKm1heHNzICBcKCVlc3AsMVwpLCV4bW0zCi0gMTJlOgkwZiA1ZCBlNSBbIAldKm1pbnBzICAleG1tNSwleG1tNAotIDEzMToJMGYgNWQgMmUgWyAJXSptaW5wcyAgXCglZXNpXCksJXhtbTUKLSAxMzQ6CWYzIDBmIDVkIGY3IFsgCV0qbWluc3MgICV4bW03LCV4bW02Ci0gMTM4OglmMyAwZiA1ZCAzOCBbIAldKm1pbnNzICBcKCVlYXhcKSwleG1tNwotIDEzYzoJMGYgMjggYzEgWyAJXSptb3ZhcHMgJXhtbTEsJXhtbTAKLSAxM2Y6CTBmIDI5IDExIFsgCV0qbW92YXBzICV4bW0yLFwoJWVjeFwpCi0gMTQyOgkwZiAyOCAxMiBbIAldKm1vdmFwcyBcKCVlZHhcKSwleG1tMgotIDE0NToJMGYgMTYgZGMgWyAJXSptb3ZsaHBzICV4bW00LCV4bW0zCi0gMTQ4OgkwZiAxNyAyYyAyNCBbIAldKm1vdmhwcyAleG1tNSxcKCVlc3AsMVwpCi0gMTRjOgkwZiAxNiAyZSBbIAldKm1vdmhwcyBcKCVlc2lcKSwleG1tNQotIDE0ZjoJMGYgMTIgZjcgWyAJXSptb3ZobHBzICV4bW03LCV4bW02Ci0gMTUyOgkwZiAxMyAwNyBbIAldKm1vdmxwcyAleG1tMCxcKCVlZGlcKQotIDE1NToJMGYgMTIgMDAgWyAJXSptb3ZscHMgXCglZWF4XCksJXhtbTAKLSAxNTg6CTBmIDUwIGNhIFsgCV0qbW92bXNrcHMgJXhtbTIsJWVjeAotIDE1YjoJMGYgMTAgZDMgWyAJXSptb3Z1cHMgJXhtbTMsJXhtbTIKLSAxNWU6CTBmIDExIDIyIFsgCV0qbW92dXBzICV4bW00LFwoJWVkeFwpCi0gMTYxOgkwZiAxMCA2NSAwMCBbIAldKm1vdnVwcyAweDBcKCVlYnBcKSwleG1tNAotIDE2NToJZjMgMGYgMTAgZWUgWyAJXSptb3ZzcyAgJXhtbTYsJXhtbTUKLSAxNjk6CWYzIDBmIDExIDNlIFsgCV0qbW92c3MgICV4bW03LFwoJWVzaVwpCi0gMTZkOglmMyAwZiAxMCAzOCBbIAldKm1vdnNzICBcKCVlYXhcKSwleG1tNwotIDE3MToJMGYgNTkgYzEgWyAJXSptdWxwcyAgJXhtbTEsJXhtbTAKLSAxNzQ6CTBmIDU5IDBhIFsgCV0qbXVscHMgIFwoJWVkeFwpLCV4bW0xCi0gMTc3OglmMyAwZiA1OSBkMiBbIAldKm11bHNzICAleG1tMiwleG1tMgotIDE3YjoJZjMgMGYgNTkgMWMgMjQgWyAJXSptdWxzcyAgXCglZXNwLDFcKSwleG1tMwotIDE4MDoJMGYgNTYgZTUgWyAJXSpvcnBzICAgJXhtbTUsJXhtbTQKLSAxODM6CTBmIDU2IDJlIFsgCV0qb3JwcyAgIFwoJWVzaVwpLCV4bW01Ci0gMTg2OgkwZiA1MyBmNyBbIAldKnJjcHBzICAleG1tNywleG1tNgotIDE4OToJMGYgNTMgMzggWyAJXSpyY3BwcyAgXCglZWF4XCksJXhtbTcKLSAxOGM6CWYzIDBmIDUzIDAxIFsgCV0qcmNwc3MgIFwoJWVjeFwpLCV4bW0wCi0gMTkwOglmMyAwZiA1MyBjYSBbIAldKnJjcHNzICAleG1tMiwleG1tMQotIDE5NDoJMGYgNTIgMTMgWyAJXSpyc3FydHBzIFwoJWVieFwpLCV4bW0yCi0gMTk3OgkwZiA1MiBkYyBbIAldKnJzcXJ0cHMgJXhtbTQsJXhtbTMKLSAxOWE6CWYzIDBmIDUyIDY1IDAwIFsgCV0qcnNxcnRzcyAweDBcKCVlYnBcKSwleG1tNAotIDE5ZjoJZjMgMGYgNTIgZWUgWyAJXSpyc3FydHNzICV4bW02LCV4bW01Ci0gMWEzOgkwZiBjNiAzNyAwMiBbIAldKnNodWZwcyBcJDB4MixcKCVlZGlcKSwleG1tNgotIDFhNzoJMGYgYzYgZjggMDMgWyAJXSpzaHVmcHMgXCQweDMsJXhtbTAsJXhtbTcKLSAxYWI6CTBmIDUxIGMxIFsgCV0qc3FydHBzICV4bW0xLCV4bW0wCi0gMWFlOgkwZiA1MSAwYSBbIAldKnNxcnRwcyBcKCVlZHhcKSwleG1tMQotIDFiMToJZjMgMGYgNTEgZDIgWyAJXSpzcXJ0c3MgJXhtbTIsJXhtbTIKLSAxYjU6CWYzIDBmIDUxIDFjIDI0IFsgCV0qc3FydHNzIFwoJWVzcCwxXCksJXhtbTMKLSAxYmE6CTBmIDVjIGU1IFsgCV0qc3VicHMgICV4bW01LCV4bW00Ci0gMWJkOgkwZiA1YyAyZSBbIAldKnN1YnBzICBcKCVlc2lcKSwleG1tNQotIDFjMDoJZjMgMGYgNWMgZjcgWyAJXSpzdWJzcyAgJXhtbTcsJXhtbTYKLSAxYzQ6CWYzIDBmIDVjIDM4IFsgCV0qc3Vic3MgIFwoJWVheFwpLCV4bW03Ci0gMWM4OgkwZiAyZSAwMSBbIAldKnVjb21pc3MgXCglZWN4XCksJXhtbTAKLSAxY2I6CTBmIDJlIGNhIFsgCV0qdWNvbWlzcyAleG1tMiwleG1tMQotIDFjZToJMGYgMTUgMTMgWyAJXSp1bnBja2hwcyBcKCVlYnhcKSwleG1tMgotIDFkMToJMGYgMTUgZGMgWyAJXSp1bnBja2hwcyAleG1tNCwleG1tMwotIDFkNDoJMGYgMTQgNjUgMDAgWyAJXSp1bnBja2xwcyAweDBcKCVlYnBcKSwleG1tNAotIDFkODoJMGYgMTQgZWUgWyAJXSp1bnBja2xwcyAleG1tNiwleG1tNQotIDFkYjoJMGYgNTcgMzcgWyAJXSp4b3JwcyAgXCglZWRpXCksJXhtbTYKLSAxZGU6CTBmIDU3IGY4IFsgCV0qeG9ycHMgICV4bW0wLCV4bW03Ci0gMWUxOgkwZiBlMCBjMSBbIAldKnBhdmdiICAlbW0xLCVtbTAKLSAxZTQ6CTBmIGUwIDBhIFsgCV0qcGF2Z2IgIFwoJWVkeFwpLCVtbTEKLSAxZTc6CTBmIGUzIGQzIFsgCV0qcGF2Z3cgICVtbTMsJW1tMgotIDFlYToJMGYgZTMgMWMgMjQgWyAJXSpwYXZndyAgXCglZXNwLDFcKSwlbW0zCi0gMWVlOgkwZiBjNSBjOCAwMCBbIAldKnBleHRydyBcJDB4MCwlbW0xLCVlYXgKLSAxZjI6CTBmIGM0IDA5IDAxIFsgCV0qcGluc3J3IFwkMHgxLFwoJWVjeFwpLCVtbTEKLSAxZjY6CTBmIGM0IGQyIDAyIFsgCV0qcGluc3J3IFwkMHgyLCVlZHgsJW1tMgotIDFmYToJMGYgZWUgYzEgWyAJXSpwbWF4c3cgJW1tMSwlbW0wCi0gMWZkOgkwZiBlZSAwYSBbIAldKnBtYXhzdyBcKCVlZHhcKSwlbW0xCi0gMjAwOgkwZiBkZSBkMiBbIAldKnBtYXh1YiAlbW0yLCVtbTIKLSAyMDM6CTBmIGRlIDFjIDI0IFsgCV0qcG1heHViIFwoJWVzcCwxXCksJW1tMwotIDIwNzoJMGYgZWEgZTUgWyAJXSpwbWluc3cgJW1tNSwlbW00Ci0gMjBhOgkwZiBlYSAyZSBbIAldKnBtaW5zdyBcKCVlc2lcKSwlbW01Ci0gMjBkOgkwZiBkYSBmNyBbIAldKnBtaW51YiAlbW03LCVtbTYKLSAyMTA6CTBmIGRhIDM4IFsgCV0qcG1pbnViIFwoJWVheFwpLCVtbTcKLSAyMTM6CTBmIGQ3IGU4IFsgCV0qcG1vdm1za2IgJW1tNSwlZWF4Ci0gMjE2OgkwZiBlNCBlNSBbIAldKnBtdWxodXcgJW1tNSwlbW00Ci0gMjE5OgkwZiBlNCAyZSBbIAldKnBtdWxodXcgXCglZXNpXCksJW1tNQotIDIxYzoJMGYgZjYgZjcgWyAJXSpwc2FkYncgJW1tNywlbW02Ci0gMjFmOgkwZiBmNiAzOCBbIAldKnBzYWRidyBcKCVlYXhcKSwlbW03Ci0gMjIyOgkwZiA3MCBkYSAwMSBbIAldKnBzaHVmdyBcJDB4MSwlbW0yLCVtbTMKLSAyMjY6CTBmIDcwIDc1IDAwIDA0IFsgCV0qcHNodWZ3IFwkMHg0LDB4MFwoJWVicFwpLCVtbTYKLSAyMmI6CTBmIGY3IGM3IFsgCV0qbWFza21vdnEgJW1tNywlbW0wCi0gMjJlOgkwZiAyYiAzMyBbIAldKm1vdm50cHMgJXhtbTYsXCglZWJ4XCkKLSAyMzE6CTBmIGU3IDEwIFsgCV0qbW92bnRxICVtbTIsXCglZWF4XCkKLSAyMzQ6CTBmIDE4IDA2IFsgCV0qcHJlZmV0Y2hudGEgXCglZXNpXCkKLSAyMzc6CTBmIDE4IDBjIDk4IFsgCV0qcHJlZmV0Y2h0MCBcKCVlYXgsJWVieCw0XCkKLSAyM2I6CTBmIDE4IDEyIFsgCV0qcHJlZmV0Y2h0MSBcKCVlZHhcKQotIDIzZToJMGYgMTggMTkgWyAJXSpwcmVmZXRjaHQyIFwoJWVjeFwpCi0gMjQxOgkyZSAwZiBbIAldKlwoYmFkXCkgIAotIDI0MzoJYzIgMGEgMDggWyAJXSpyZXQgICAgXCQweDgwYQotIDI0NjoJOTAgWyAJXSpub3AgICAgCi0gMjQ3Ogk5MCBbIAldKm5vcCAgICAKLSAyNDg6CTY1IDBmIFsgCV0qc2ZlbmNlLipcKGJhZFwpLioKLSAyNGE6CWFlIFsgCV0qc2NhcyAgICVlczpcKCVlZGlcKSwlYWwKLSAyNGI6CWZmIDkwIDkwIDkwIDkwIDkwIFsgCV0qY2FsbCAgIFwqMHg5MDkwOTA5MFwoJWVheFwpCi0gMjUxOgk5MCBbIAldKm5vcCAgICAKLSAyNTI6CTkwIFsgCV0qbm9wICAgIAotIDI1MzoJOTAgWyAJXSpub3AgICAgCi0gMjU0Ogk5MCBbIAldKm5vcCAgICAKLSAyNTU6CTkwIFsgCV0qbm9wICAgIAotIDI1NjoJOTAgWyAJXSpub3AgICAgCi0gMjU3Ogk5MCBbIAldKm5vcCAgICAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYva2F0bWFpLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2thdG1haS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjZiMmM3Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2thdG1haS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLSNQSUlJIFNJTUQgaW5zdHJ1Y3Rpb25zCi0KLS50ZXh0Ci0gYWRkcHMJCSglZWN4KSwleG1tMAotIGFkZHBzCQkleG1tMiwleG1tMQotIGFkZHNzCQkoJWVieCksJXhtbTIKLSBhZGRzcwkJJXhtbTQsJXhtbTMKLSBhbmRucHMJCTB4MCglZWJwKSwleG1tNAotIGFuZG5wcwkJJXhtbTYsJXhtbTUKLSBhbmRwcwkJKCVlZGkpLCV4bW02Ci0gYW5kcHMJCSV4bW0wLCV4bW03Ci0gY21wcHMJCSQweDIsJXhtbTEsJXhtbTAKLSBjbXBwcwkJJDB4MywoJWVkeCksJXhtbTEKLSBjbXBzcwkJJDB4NCwleG1tMiwleG1tMgotIGNtcHNzCQkkMHg1LCglZXNwLDEpLCV4bW0zCi0gY21wcHMJCSQweDYsJXhtbTUsJXhtbTQKLSBjbXBwcwkJJDB4NywoJWVzaSksJXhtbTUKLSBjbXBzcwkJJDB4MCwleG1tNywleG1tNgotIGNtcHNzCQkkMHgxLCglZWF4KSwleG1tNwotIGNtcGVxcHMJJXhtbTEsJXhtbTAKLSBjbXBlcXBzCSglZWR4KSwleG1tMQotIGNtcGVxc3MJJXhtbTIsJXhtbTIKLSBjbXBlcXNzCSglZXNwLDEpLCV4bW0zCi0gY21wbHRwcwkleG1tNSwleG1tNAotIGNtcGx0cHMJKCVlc2kpLCV4bW01Ci0gY21wbHRzcwkleG1tNywleG1tNgotIGNtcGx0c3MJKCVlYXgpLCV4bW03Ci0gY21wbGVwcwkoJWVjeCksJXhtbTAKLSBjbXBsZXBzCSV4bW0yLCV4bW0xCi0gY21wbGVzcwkoJWVieCksJXhtbTIKLSBjbXBsZXNzCSV4bW00LCV4bW0zCi0gY21wdW5vcmRwcwkweDAoJWVicCksJXhtbTQKLSBjbXB1bm9yZHBzCSV4bW02LCV4bW01Ci0gY21wdW5vcmRzcwkoJWVkaSksJXhtbTYKLSBjbXB1bm9yZHNzCSV4bW0wLCV4bW03Ci0gY21wbmVxcHMJJXhtbTEsJXhtbTAKLSBjbXBuZXFwcwkoJWVkeCksJXhtbTEKLSBjbXBuZXFzcwkleG1tMiwleG1tMgotIGNtcG5lcXNzCSglZXNwLDEpLCV4bW0zCi0gY21wbmx0cHMJJXhtbTUsJXhtbTQKLSBjbXBubHRwcwkoJWVzaSksJXhtbTUKLSBjbXBubHRzcwkleG1tNywleG1tNgotIGNtcG5sdHNzCSglZWF4KSwleG1tNwotIGNtcG5sZXBzCSglZWN4KSwleG1tMAotIGNtcG5sZXBzCSV4bW0yLCV4bW0xCi0gY21wbmxlc3MJKCVlYngpLCV4bW0yCi0gY21wbmxlc3MJJXhtbTQsJXhtbTMKLSBjbXBvcmRwcwkweDAoJWVicCksJXhtbTQKLSBjbXBvcmRwcwkleG1tNiwleG1tNQotIGNtcG9yZHNzCSglZWRpKSwleG1tNgotIGNtcG9yZHNzCSV4bW0wLCV4bW03Ci0gY29taXNzCQkleG1tMSwleG1tMAotIGNvbWlzcwkJKCVlZHgpLCV4bW0xCi0gY3Z0cGkycHMJJW1tMywleG1tMgotIGN2dHBpMnBzCSglZXNwLDEpLCV4bW0zCi0gY3Z0c2kyc3MJJWVicCwleG1tNAotIGN2dHNpMnNzCSglZXNpKSwleG1tNQotIGN2dHBzMnBpCSV4bW03LCVtbTYKLSBjdnRwczJwaQkoJWVheCksJW1tNwotIGN2dHNzMnNpCSglZWN4KSwlZWF4Ci0gY3Z0c3Myc2kJJXhtbTIsJWVjeAotIGN2dHRwczJwaQkoJWVieCksJW1tMgotIGN2dHRwczJwaQkleG1tNCwlbW0zCi0gY3Z0dHNzMnNpCTB4MCglZWJwKSwlZXNwCi0gY3Z0dHNzMnNpCSV4bW02LCVlYnAKLSBkaXZwcwkJJXhtbTEsJXhtbTAKLSBkaXZwcwkJKCVlZHgpLCV4bW0xCi0gZGl2c3MJCSV4bW0zLCV4bW0yCi0gZGl2c3MJCSglZXNwLDEpLCV4bW0zCi0gbGRteGNzcgkweDAoJWVicCkKLSBzdG14Y3NyCSglZXNpKQotIHNmZW5jZQotIG1heHBzCQkleG1tMSwleG1tMAotIG1heHBzCQkoJWVkeCksJXhtbTEKLSBtYXhzcwkJJXhtbTMsJXhtbTIKLSBtYXhzcwkJKCVlc3AsMSksJXhtbTMKLSBtaW5wcwkJJXhtbTUsJXhtbTQKLSBtaW5wcwkJKCVlc2kpLCV4bW01Ci0gbWluc3MJCSV4bW03LCV4bW02Ci0gbWluc3MJCSglZWF4KSwleG1tNwotIG1vdmFwcwkJJXhtbTEsJXhtbTAKLSBtb3ZhcHMJCSV4bW0yLCglZWN4KQotIG1vdmFwcwkJKCVlZHgpLCV4bW0yCi0gbW92bGhwcwkleG1tNCwleG1tMwotIG1vdmhwcwkJJXhtbTUsKCVlc3AsMSkKLSBtb3ZocHMJCSglZXNpKSwleG1tNQotIG1vdmhscHMJJXhtbTcsJXhtbTYKLSBtb3ZscHMJCSV4bW0wLCglZWRpKQotIG1vdmxwcwkJKCVlYXgpLCV4bW0wCi0gbW92bXNrcHMJJXhtbTIsJWVjeAotIG1vdnVwcwkJJXhtbTMsJXhtbTIKLSBtb3Z1cHMJCSV4bW00LCglZWR4KQotIG1vdnVwcwkJMHgwKCVlYnApLCV4bW00Ci0gbW92c3MJCSV4bW02LCV4bW01Ci0gbW92c3MJCSV4bW03LCglZXNpKQotIG1vdnNzCQkoJWVheCksJXhtbTcKLSBtdWxwcwkJJXhtbTEsJXhtbTAKLSBtdWxwcwkJKCVlZHgpLCV4bW0xCi0gbXVsc3MJCSV4bW0yLCV4bW0yCi0gbXVsc3MJCSglZXNwLDEpLCV4bW0zCi0gb3JwcwkJJXhtbTUsJXhtbTQKLSBvcnBzCQkoJWVzaSksJXhtbTUKLSByY3BwcwkJJXhtbTcsJXhtbTYKLSByY3BwcwkJKCVlYXgpLCV4bW03Ci0gcmNwc3MJCSglZWN4KSwleG1tMAotIHJjcHNzCQkleG1tMiwleG1tMQotIHJzcXJ0cHMJKCVlYngpLCV4bW0yCi0gcnNxcnRwcwkleG1tNCwleG1tMwotIHJzcXJ0c3MJMHgwKCVlYnApLCV4bW00Ci0gcnNxcnRzcwkleG1tNiwleG1tNQotIHNodWZwcwkJJDB4MiwoJWVkaSksJXhtbTYKLSBzaHVmcHMJCSQweDMsJXhtbTAsJXhtbTcKLSBzcXJ0cHMJCSV4bW0xLCV4bW0wCi0gc3FydHBzCQkoJWVkeCksJXhtbTEKLSBzcXJ0c3MJCSV4bW0yLCV4bW0yCi0gc3FydHNzCQkoJWVzcCwxKSwleG1tMwotIHN1YnBzCQkleG1tNSwleG1tNAotIHN1YnBzCQkoJWVzaSksJXhtbTUKLSBzdWJzcwkJJXhtbTcsJXhtbTYKLSBzdWJzcwkJKCVlYXgpLCV4bW03Ci0gdWNvbWlzcwkoJWVjeCksJXhtbTAKLSB1Y29taXNzCSV4bW0yLCV4bW0xCi0gdW5wY2tocHMJKCVlYngpLCV4bW0yCi0gdW5wY2tocHMJJXhtbTQsJXhtbTMKLSB1bnBja2xwcwkweDAoJWVicCksJXhtbTQKLSB1bnBja2xwcwkleG1tNiwleG1tNQotIHhvcnBzCQkoJWVkaSksJXhtbTYKLSB4b3JwcwkJJXhtbTAsJXhtbTcKLSBwYXZnYgkJJW1tMSwlbW0wCi0gcGF2Z2IJCSglZWR4KSwlbW0xCi0gcGF2Z3cJCSVtbTMsJW1tMgotIHBhdmd3CQkoJWVzcCwxKSwlbW0zCi0gcGV4dHJ3CQkkMHgwLCVtbTEsJWVheAotIHBpbnNydwkJJDB4MSwoJWVjeCksJW1tMQotIHBpbnNydwkJJDB4MiwlZWR4LCVtbTIKLSBwbWF4c3cJCSVtbTEsJW1tMAotIHBtYXhzdwkJKCVlZHgpLCVtbTEKLSBwbWF4dWIJCSVtbTIsJW1tMgotIHBtYXh1YgkJKCVlc3AsMSksJW1tMwotIHBtaW5zdwkJJW1tNSwlbW00Ci0gcG1pbnN3CQkoJWVzaSksJW1tNQotIHBtaW51YgkJJW1tNywlbW02Ci0gcG1pbnViCQkoJWVheCksJW1tNwotIHBtb3Ztc2tiCSVtbTUsJWVheAotIHBtdWxodXcJJW1tNSwlbW00Ci0gcG11bGh1dwkoJWVzaSksJW1tNQotIHBzYWRidwkJJW1tNywlbW02Ci0gcHNhZGJ3CQkoJWVheCksJW1tNwotIHBzaHVmdwkJJDB4MSwlbW0yLCVtbTMKLSBwc2h1ZncJCSQweDQsMHgwKCVlYnApLCVtbTYKLSBtYXNrbW92cQklbW03LCVtbTAKLSBtb3ZudHBzCSV4bW02LCglZWJ4KQotIG1vdm50cQkJJW1tMiwoJWVheCkKLSBwcmVmZXRjaG50YQkoJWVzaSkKLSBwcmVmZXRjaHQwCSglZWF4LCVlYngsNCkKLSBwcmVmZXRjaHQxCSglZWR4KQotIHByZWZldGNodDIJKCVlY3gpCi0KLSMgQSBTSU1EIGluc3RydWN0aW9uIHdpdGggYSBiYWQgZXh0ZW5zaW9uIGJ5dGUKLS5ieXRlIDB4MkUsMHgwRiwweEMyLDB4MEEsMHgwOAotIG5vcAotIG5vcAotIyBBIGJhZCBzZmVuY2UgbW9kcm0gYnl0ZQotLmJ5dGUgMHg2NSwweDBGLDB4QUUsMHhmZgotIyBQYWQgb3V0IHRvIGdvbyBhbGlnbm1lbnQKLS5ieXRlIDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L21vZHJtLmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L21vZHJtLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMWJjNzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9tb2RybS5sCisrKyAvZGV2L251bGwKQEAgLTEsMTk4NCArMCwwIEBACi0uKjogQXNzZW1ibGVyIG1lc3NhZ2VzOgotLio6MTI4OiBXYXJuaW5nOi4qCi0uKjoxMjk6IFdhcm5pbmc6LioKLS4qOjEzMDogV2FybmluZzouKgotLio6MTMxOiBXYXJuaW5nOi4qCi0uKjoxMzI6IFdhcm5pbmc6LioKLS4qOjEzMzogV2FybmluZzouKgotLio6MTM0OiBXYXJuaW5nOi4qCi0uKjoxMzU6IFdhcm5pbmc6LioKLS4qOjE5MjogV2FybmluZzouKgotLio6MTkzOiBXYXJuaW5nOi4qCi0uKjoxOTQ6IFdhcm5pbmc6LioKLS4qOjE5NTogV2FybmluZzouKgotLio6MTk2OiBXYXJuaW5nOi4qCi0uKjoxOTc6IFdhcm5pbmc6LioKLS4qOjE5ODogV2FybmluZzouKgotLio6MTk5OiBXYXJuaW5nOi4qCi0uKjoyNTY6IFdhcm5pbmc6LioKLS4qOjI1NzogV2FybmluZzouKgotLio6MjU4OiBXYXJuaW5nOi4qCi0uKjoyNTk6IFdhcm5pbmc6LioKLS4qOjI2MDogV2FybmluZzouKgotLio6MjYxOiBXYXJuaW5nOi4qCi0uKjoyNjI6IFdhcm5pbmc6LioKLS4qOjI2MzogV2FybmluZzouKgotLio6Mzg0OiBXYXJuaW5nOi4qCi0uKjozODU6IFdhcm5pbmc6LioKLS4qOjM4NjogV2FybmluZzouKgotLio6Mzg3OiBXYXJuaW5nOi4qCi0uKjozODg6IFdhcm5pbmc6LioKLS4qOjM4OTogV2FybmluZzouKgotLio6MzkwOiBXYXJuaW5nOi4qCi0uKjozOTE6IFdhcm5pbmc6LioKLS4qOjQ0ODogV2FybmluZzouKgotLio6NDQ5OiBXYXJuaW5nOi4qCi0uKjo0NTA6IFdhcm5pbmc6LioKLS4qOjQ1MTogV2FybmluZzouKgotLio6NDUyOiBXYXJuaW5nOi4qCi0uKjo0NTM6IFdhcm5pbmc6LioKLS4qOjQ1NDogV2FybmluZzouKgotLio6NDU1OiBXYXJuaW5nOi4qCi0uKjo1MTI6IFdhcm5pbmc6LioKLS4qOjUxMzogV2FybmluZzouKgotLio6NTE0OiBXYXJuaW5nOi4qCi0uKjo1MTU6IFdhcm5pbmc6LioKLS4qOjUxNjogV2FybmluZzouKgotLio6NTE3OiBXYXJuaW5nOi4qCi0uKjo1MTg6IFdhcm5pbmc6LioKLS4qOjUxOTogV2FybmluZzouKgotLio6NjQwOiBXYXJuaW5nOi4qCi0uKjo2NDE6IFdhcm5pbmc6LioKLS4qOjY0MjogV2FybmluZzouKgotLio6NjQzOiBXYXJuaW5nOi4qCi0uKjo2NDQ6IFdhcm5pbmc6LioKLS4qOjY0NTogV2FybmluZzouKgotLio6NjQ2OiBXYXJuaW5nOi4qCi0uKjo2NDc6IFdhcm5pbmc6LioKLS4qOjcwNDogV2FybmluZzouKgotLio6NzA1OiBXYXJuaW5nOi4qCi0uKjo3MDY6IFdhcm5pbmc6LioKLS4qOjcwNzogV2FybmluZzouKgotLio6NzA4OiBXYXJuaW5nOi4qCi0uKjo3MDk6IFdhcm5pbmc6LioKLS4qOjcxMDogV2FybmluZzouKgotLio6NzExOiBXYXJuaW5nOi4qCi0uKjo3Njg6IFdhcm5pbmc6LioKLS4qOjc2OTogV2FybmluZzouKgotLio6NzcwOiBXYXJuaW5nOi4qCi0uKjo3NzE6IFdhcm5pbmc6LioKLS4qOjc3MjogV2FybmluZzouKgotLio6NzczOiBXYXJuaW5nOi4qCi0uKjo3NzQ6IFdhcm5pbmc6LioKLS4qOjc3NTogV2FybmluZzouKgotLio6ODEyOiBXYXJuaW5nOi4qCi0uKjo4MjA6IFdhcm5pbmc6LioKLS4qOjgyODogV2FybmluZzouKgotLio6ODMzOiBXYXJuaW5nOi4qCi0uKjo4MzQ6IFdhcm5pbmc6LioKLS4qOjgzNTogV2FybmluZzouKgotLio6OTYxOiBXYXJuaW5nOi4qCi0uKjo5NjI6IFdhcm5pbmc6LioKLS4qOjk2MzogV2FybmluZzouKgotLio6OTY0OiBXYXJuaW5nOi4qCi0uKjo5NjU6IFdhcm5pbmc6LioKLS4qOjk2NjogV2FybmluZzouKgotLio6OTY3OiBXYXJuaW5nOi4qCi0uKjo5Njg6IFdhcm5pbmc6LioKLS4qOjEwMjU6IFdhcm5pbmc6LioKLS4qOjEwMjY6IFdhcm5pbmc6LioKLS4qOjEwMjc6IFdhcm5pbmc6LioKLS4qOjEwMjg6IFdhcm5pbmc6LioKLS4qOjEwMjk6IFdhcm5pbmc6LioKLS4qOjEwMzA6IFdhcm5pbmc6LioKLS4qOjEwMzE6IFdhcm5pbmc6LioKLS4qOjEwMzI6IFdhcm5pbmc6LioKLS4qOjEwODk6IFdhcm5pbmc6LioKLS4qOjEwOTA6IFdhcm5pbmc6LioKLS4qOjEwOTE6IFdhcm5pbmc6LioKLS4qOjEwOTI6IFdhcm5pbmc6LioKLS4qOjEwOTM6IFdhcm5pbmc6LioKLS4qOjEwOTQ6IFdhcm5pbmc6LioKLS4qOjEwOTU6IFdhcm5pbmc6LioKLS4qOjEwOTY6IFdhcm5pbmc6LioKLS4qOjEyMTc6IFdhcm5pbmc6LioKLS4qOjEyMTg6IFdhcm5pbmc6LioKLS4qOjEyMTk6IFdhcm5pbmc6LioKLS4qOjEyMjA6IFdhcm5pbmc6LioKLS4qOjEyMjE6IFdhcm5pbmc6LioKLS4qOjEyMjI6IFdhcm5pbmc6LioKLS4qOjEyMjM6IFdhcm5pbmc6LioKLS4qOjEyMjQ6IFdhcm5pbmc6LioKLS4qOjEyODE6IFdhcm5pbmc6LioKLS4qOjEyODI6IFdhcm5pbmc6LioKLS4qOjEyODM6IFdhcm5pbmc6LioKLS4qOjEyODQ6IFdhcm5pbmc6LioKLS4qOjEyODU6IFdhcm5pbmc6LioKLS4qOjEyODY6IFdhcm5pbmc6LioKLS4qOjEyODc6IFdhcm5pbmc6LioKLS4qOjEyODg6IFdhcm5pbmc6LioKLS4qOjEzNDU6IFdhcm5pbmc6LioKLS4qOjEzNDY6IFdhcm5pbmc6LioKLS4qOjEzNDc6IFdhcm5pbmc6LioKLS4qOjEzNDg6IFdhcm5pbmc6LioKLS4qOjEzNDk6IFdhcm5pbmc6LioKLS4qOjEzNTA6IFdhcm5pbmc6LioKLS4qOjEzNTE6IFdhcm5pbmc6LioKLS4qOjEzNTI6IFdhcm5pbmc6LioKLS4qOjE0NzM6IFdhcm5pbmc6LioKLS4qOjE0NzQ6IFdhcm5pbmc6LioKLS4qOjE0NzU6IFdhcm5pbmc6LioKLS4qOjE0NzY6IFdhcm5pbmc6LioKLS4qOjE0Nzc6IFdhcm5pbmc6LioKLS4qOjE0Nzg6IFdhcm5pbmc6LioKLS4qOjE0Nzk6IFdhcm5pbmc6LioKLS4qOjE0ODA6IFdhcm5pbmc6LioKLS4qOjE1Mzc6IFdhcm5pbmc6LioKLS4qOjE1Mzg6IFdhcm5pbmc6LioKLS4qOjE1Mzk6IFdhcm5pbmc6LioKLS4qOjE1NDA6IFdhcm5pbmc6LioKLS4qOjE1NDE6IFdhcm5pbmc6LioKLS4qOjE1NDI6IFdhcm5pbmc6LioKLS4qOjE1NDM6IFdhcm5pbmc6LioKLS4qOjE1NDQ6IFdhcm5pbmc6LioKLS4qOjE2MDE6IFdhcm5pbmc6LioKLS4qOjE2MDI6IFdhcm5pbmc6LioKLS4qOjE2MDM6IFdhcm5pbmc6LioKLS4qOjE2MDQ6IFdhcm5pbmc6LioKLS4qOjE2MDU6IFdhcm5pbmc6LioKLS4qOjE2MDY6IFdhcm5pbmc6LioKLS4qOjE2MDc6IFdhcm5pbmc6LioKLS4qOjE2MDg6IFdhcm5pbmc6LioKLS4qOjE2NDU6IFdhcm5pbmc6LioKLS4qOjE2NTM6IFdhcm5pbmc6LioKLS4qOjE2NjE6IFdhcm5pbmc6LioKLS4qOjE2NjY6IFdhcm5pbmc6LioKLS4qOjE2Njc6IFdhcm5pbmc6LioKLS4qOjE2Njg6IFdhcm5pbmc6LioKLSAgIDEgICAgICAgICAgICAgICAgICAgICAgIAkucHNpemUgMAotICAgMiAgICAgICAgICAgICAgICAgICAgICAgCS50ZXh0Ci0gICAzIDAwMDAgMzY4QzE4ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXhcKQotICAgNCAwMDAzIDM2OEMxOSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4XCkKLSAgIDUgMDAwNiAzNjhDMUEgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeFwpCi0gICA2IDAwMDkgMzY4QzFCICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnhcKQotICAgNyAwMDBjIDM2OEMxRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6MAotICAgOCAwMDEzIDM2OEMxRSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpXCkKLSAgIDkgMDAxNiAzNjhDMUYgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaVwpCi0gIDEwIDAwMTkgMzY4QzU4MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4XCkKLSAgMTEgMDAxZCAzNjhDNTkxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3hcKQotICAxMiAwMDIxIDM2OEM1QTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeFwpCi0gIDEzIDAwMjUgMzY4QzVCMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4XCkKLSAgMTQgMDAyOSA4QzVEMTIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnBcKQotICAxNSAwMDJjIDM2OEM1RTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaVwpCi0gIDE2IDAwMzAgMzY4QzVGMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpXCkKLSAgMTcgMDAzNCAzNjhDOTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXhcKQotICAxOCAwMDNiIDM2OEM5OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeFwpCi0gIDE5IDAwNDIgMzY4QzlBNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4XCkKLSAgMjAgMDA0OSAzNjhDOUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnhcKQotICAyMSAwMDUwIDhDOUQ3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicFwpCi0gIDIyIDAwNTYgMzY4QzlFNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpXCkKLSAgMjMgMDA1ZCAzNjhDOUY3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGlcKQotICAyNCAwMDY0IDhDRDggICAgICAgICAgICAgIAkJbW92CSVkcywlZWF4Ci0gIDI1IDAwNjYgOENEOSAgICAgICAgICAgICAgCQltb3YJJWRzLCVlY3gKLSAgMjYgMDA2OCA4Q0RBICAgICAgICAgICAgICAJCW1vdgklZHMsJWVkeAotICAyNyAwMDZhIDhDREIgICAgICAgICAgICAgIAkJbW92CSVkcywlZWJ4Ci0gIDI4IDAwNmMgOENEQyAgICAgICAgICAgICAgCQltb3YJJWRzLCVlc3AKLSAgMjkgMDA2ZSA4Q0REICAgICAgICAgICAgICAJCW1vdgklZHMsJWVicAotICAzMCAwMDcwIDhDREUgICAgICAgICAgICAgIAkJbW92CSVkcywlZXNpCi0gIDMxIDAwNzIgOENERiAgICAgICAgICAgICAgCQltb3YJJWRzLCVlZGkKLSAgMzIgMDA3NCAzNjhDMUMwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWF4LDFcKQotICAzMyAwMDc4IDM2OEMxQzAxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYXgsMVwpCi0gIDM0IDAwN2MgMzY4QzFDMDIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVheCwxXCkKLSAgMzUgMDA4MCAzNjhDMUMwMyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWF4LDFcKQotICAzNiAwMDg0IDhDMUMwNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYXgsMVwpCi0gIDM3IDAwODcgMzY4QzFDMDUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWF4LDFcKQotICAzOCAwMDhmIDM2OEMxQzA2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYXgsMVwpCi0gIDM5IDAwOTMgMzY4QzFDMDcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVheCwxXCkKLSAgNDAgMDA5NyAzNjhDMUMwOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWN4LDFcKQotICA0MSAwMDliIDM2OEMxQzA5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlY3gsMVwpCi0gIDQyIDAwOWYgMzY4QzFDMEEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVjeCwxXCkKLSAgNDMgMDBhMyAzNjhDMUMwQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWN4LDFcKQotICA0NCAwMGE3IDhDMUMwQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlY3gsMVwpCi0gIDQ1IDAwYWEgMzY4QzFDMEQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWN4LDFcKQotICA0NiAwMGIyIDM2OEMxQzBFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlY3gsMVwpCi0gIDQ3IDAwYjYgMzY4QzFDMEYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVjeCwxXCkKLSAgNDggMDBiYSAzNjhDMUMxMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWR4LDFcKQotICA0OSAwMGJlIDM2OEMxQzExICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZHgsMVwpCi0gIDUwIDAwYzIgMzY4QzFDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkeCwxXCkKLSAgNTEgMDBjNiAzNjhDMUMxMyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWR4LDFcKQotICA1MiAwMGNhIDhDMUMxNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZHgsMVwpCi0gIDUzIDAwY2QgMzY4QzFDMTUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWR4LDFcKQotICA1NCAwMGQ1IDM2OEMxQzE2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZHgsMVwpCi0gIDU1IDAwZDkgMzY4QzFDMTcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkeCwxXCkKLSAgNTYgMDBkZCAzNjhDMUMxOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJ4LDFcKQotICA1NyAwMGUxIDM2OEMxQzE5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYngsMVwpCi0gIDU4IDAwZTUgMzY4QzFDMUEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVieCwxXCkKLSAgNTkgMDBlOSAzNjhDMUMxQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJ4LDFcKQotICA2MCAwMGVkIDhDMUMxQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYngsMVwpCi0gIDYxIDAwZjAgMzY4QzFDMUQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJ4LDFcKQotICA2MiAwMGY4IDM2OEMxQzFFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYngsMVwpCi0gIDYzIDAwZmMgMzY4QzFDMUYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVieCwxXCkKLSAgNjQgMDEwMCAzNjhDMTggICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwxXCkKLSAgNjUgMDEwMyAzNjhDMTkgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwxXCkKLSAgNjYgMDEwNiAzNjhDMUEgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwxXCkKLSAgNjcgMDEwOSAzNjhDMUIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwxXCkKLSAgNjggMDEwYyA4QzFDMjQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwxXCkKLSAgNjkgMDEwZiAzNjhDMUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJXNzOlwoLDFcKQotICA3MCAwMTE2IDM2OEMxRSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLDFcKQotICA3MSAwMTE5IDM2OEMxRiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLDFcKQotICA3MiAwMTFjIDM2OEMxQzI4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlYnAsMVwpCi0gIDczIDAxMjAgMzY4QzFDMjkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVicCwxXCkKLSAgNzQgMDEyNCAzNjhDMUMyQSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWJwLDFcKQotICA3NSAwMTI4IDM2OEMxQzJCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlYnAsMVwpCi0gIDc2IDAxMmMgOEMxQzJDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVicCwxXCkKLSAgNzcgMDEyZiAzNjhDMUMyRCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlYnAsMVwpCi0gIDc4IDAxMzcgMzY4QzFDMkUgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVicCwxXCkKLSAgNzkgMDEzYiAzNjhDMUMyRiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWJwLDFcKQotICA4MCAwMTNmIDM2OEMxQzMwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlc2ksMVwpCi0gIDgxIDAxNDMgMzY4QzFDMzEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVzaSwxXCkKLSAgODIgMDE0NyAzNjhDMUMzMiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZXNpLDFcKQotICA4MyAwMTRiIDM2OEMxQzMzICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlc2ksMVwpCi0gIDg0IDAxNGYgOEMxQzM0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVzaSwxXCkKLSAgODUgMDE1MiAzNjhDMUMzNSAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlc2ksMVwpCi0gIDg2IDAxNWEgMzY4QzFDMzYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVzaSwxXCkKLSAgODcgMDE1ZSAzNjhDMUMzNyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZXNpLDFcKQotICA4OCAwMTYyIDM2OEMxQzM4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlZGksMVwpCi0gIDg5IDAxNjYgMzY4QzFDMzkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVkaSwxXCkKLSAgOTAgMDE2YSAzNjhDMUMzQSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWRpLDFcKQotICA5MSAwMTZlIDM2OEMxQzNCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlZGksMVwpCi0gIDkyIDAxNzIgOEMxQzNDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVkaSwxXCkKLSAgOTMgMDE3NSAzNjhDMUMzRCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlZGksMVwpCi0gIDk0IDAxN2QgMzY4QzFDM0UgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVkaSwxXCkKLSAgOTUgMDE4MSAzNjhDMUMzRiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWRpLDFcKQotICA5NiAwMTg1IDM2OEMxQzQwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlYXgsMlwpCi0gIDk3IDAxODkgMzY4QzFDNDEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVheCwyXCkKLSAgOTggMDE4ZCAzNjhDMUM0MiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWF4LDJcKQotICA5OSAwMTkxIDM2OEMxQzQzICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlYXgsMlwpCi0gMTAwIDAxOTUgOEMxQzQ0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVheCwyXCkKLSAxMDEgMDE5OCAzNjhDMUM0NSAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlYXgsMlwpCi0gMTAyIDAxYTAgMzY4QzFDNDYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVheCwyXCkKLSAxMDMgMDFhNCAzNjhDMUM0NyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWF4LDJcKQotIDEwNCAwMWE4IDM2OEMxQzQ4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlY3gsMlwpCi0gMTA1IDAxYWMgMzY4QzFDNDkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVjeCwyXCkKLSAxMDYgMDFiMCAzNjhDMUM0QSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWN4LDJcKQotIDEwNyAwMWI0IDM2OEMxQzRCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlY3gsMlwpCi0gMTA4IDAxYjggOEMxQzRDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVjeCwyXCkKLSAxMDkgMDFiYiAzNjhDMUM0RCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlY3gsMlwpCi0gMTEwIDAxYzMgMzY4QzFDNEUgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVjeCwyXCkKLSAxMTEgMDFjNyAzNjhDMUM0RiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWN4LDJcKQotIDExMiAwMWNiIDM2OEMxQzUwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlZHgsMlwpCi0gMTEzIDAxY2YgMzY4QzFDNTEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVkeCwyXCkKLSAxMTQgMDFkMyAzNjhDMUM1MiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWR4LDJcKQotIDExNSAwMWQ3IDM2OEMxQzUzICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlZHgsMlwpCi0gMTE2IDAxZGIgOEMxQzU0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVkeCwyXCkKLSAxMTcgMDFkZSAzNjhDMUM1NSAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlZHgsMlwpCi0gMTE4IDAxZTYgMzY4QzFDNTYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVkeCwyXCkKLSAxMTkgMDFlYSAzNjhDMUM1NyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWR4LDJcKQotIDEyMCAwMWVlIDM2OEMxQzU4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlYngsMlwpCi0gMTIxIDAxZjIgMzY4QzFDNTkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVieCwyXCkKLSAxMjIgMDFmNiAzNjhDMUM1QSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWJ4LDJcKQotIDEyMyAwMWZhIDM2OEMxQzVCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlYngsMlwpCi0gMTI0IDAxZmUgOEMxQzVDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVieCwyXCkKLSAxMjUgMDIwMSAzNjhDMUM1RCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlYngsMlwpCi0gMTI2IDAyMDkgMzY4QzFDNUUgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVieCwyXCkKLSAxMjcgMDIwZCAzNjhDMUM1RiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWJ4LDJcKQotIDEyOCAwMjExIDM2OEMxOCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LDJcKQotLipXYXJuaW5nOi4qCi0gMTI5IDAyMTQgMzY4QzE5ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsMlwpCi0uKldhcm5pbmc6LioKLSAxMzAgMDIxNyAzNjhDMUEgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwyXCkKLS4qV2FybmluZzouKgotIDEzMSAwMjFhIDM2OEMxQiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LDJcKQotLipXYXJuaW5nOi4qCi0gMTMyIDAyMWQgOEMxQzI0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsMlwpCi0uKldhcm5pbmc6LioKLSAxMzMgMDIyMCAzNjhDMUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJXNzOlwoLDJcKQotLipXYXJuaW5nOi4qCi0gMTM0IDAyMjcgMzY4QzFFICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksMlwpCi0uKldhcm5pbmc6LioKLSAxMzUgMDIyYSAzNjhDMUYgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwyXCkKLS4qV2FybmluZzouKgotIDEzNiAwMjJkIDM2OEMxQzY4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlYnAsMlwpCi0gMTM3IDAyMzEgMzY4QzFDNjkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVicCwyXCkKLSAxMzggMDIzNSAzNjhDMUM2QSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWJwLDJcKQotIDEzOSAwMjM5IDM2OEMxQzZCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlYnAsMlwpCi0gMTQwIDAyM2QgOEMxQzZDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVicCwyXCkKLSAxNDEgMDI0MCAzNjhDMUM2RCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlYnAsMlwpCi0gMTQyIDAyNDggMzY4QzFDNkUgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVicCwyXCkKLSAxNDMgMDI0YyAzNjhDMUM2RiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWJwLDJcKQotIDE0NCAwMjUwIDM2OEMxQzcwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlc2ksMlwpCi0gMTQ1IDAyNTQgMzY4QzFDNzEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVzaSwyXCkKLSAxNDYgMDI1OCAzNjhDMUM3MiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZXNpLDJcKQotIDE0NyAwMjVjIDM2OEMxQzczICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlc2ksMlwpCi0gMTQ4IDAyNjAgOEMxQzc0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVzaSwyXCkKLSAxNDkgMDI2MyAzNjhDMUM3NSAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlc2ksMlwpCi0gMTUwIDAyNmIgMzY4QzFDNzYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVzaSwyXCkKLSAxNTEgMDI2ZiAzNjhDMUM3NyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZXNpLDJcKQotIDE1MiAwMjczIDM2OEMxQzc4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlZGksMlwpCi0gMTUzIDAyNzcgMzY4QzFDNzkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVkaSwyXCkKLSAxNTQgMDI3YiAzNjhDMUM3QSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWRpLDJcKQotIDE1NSAwMjdmIDM2OEMxQzdCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlZGksMlwpCi0gMTU2IDAyODMgOEMxQzdDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVkaSwyXCkKLSAxNTcgMDI4NiAzNjhDMUM3RCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlZGksMlwpCi0gMTU4IDAyOGUgMzY4QzFDN0UgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVkaSwyXCkKLSAxNTkgMDI5MiAzNjhDMUM3RiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWRpLDJcKQotIDE2MCAwMjk2IDM2OEMxQzgwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlYXgsNFwpCi0gMTYxIDAyOWEgMzY4QzFDODEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVheCw0XCkKLSAxNjIgMDI5ZSAzNjhDMUM4MiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWF4LDRcKQotIDE2MyAwMmEyIDM2OEMxQzgzICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlYXgsNFwpCi0gMTY0IDAyYTYgOEMxQzg0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVheCw0XCkKLSAxNjUgMDJhOSAzNjhDMUM4NSAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlYXgsNFwpCi0gMTY2IDAyYjEgMzY4QzFDODYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVheCw0XCkKLSAxNjcgMDJiNSAzNjhDMUM4NyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWF4LDRcKQotIDE2OCAwMmI5IDM2OEMxQzg4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlY3gsNFwpCi0gMTY5IDAyYmQgMzY4QzFDODkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVjeCw0XCkKLSAxNzAgMDJjMSAzNjhDMUM4QSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWN4LDRcKQotIDE3MSAwMmM1IDM2OEMxQzhCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlY3gsNFwpCi0gMTcyIDAyYzkgOEMxQzhDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVjeCw0XCkKLSAxNzMgMDJjYyAzNjhDMUM4RCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlY3gsNFwpCi0gMTc0IDAyZDQgMzY4QzFDOEUgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVjeCw0XCkKLSAxNzUgMDJkOCAzNjhDMUM4RiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWN4LDRcKQotIDE3NiAwMmRjIDM2OEMxQzkwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlZHgsNFwpCi0gMTc3IDAyZTAgMzY4QzFDOTEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVkeCw0XCkKLSAxNzggMDJlNCAzNjhDMUM5MiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWR4LDRcKQotIDE3OSAwMmU4IDM2OEMxQzkzICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlZHgsNFwpCi0gMTgwIDAyZWMgOEMxQzk0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVkeCw0XCkKLSAxODEgMDJlZiAzNjhDMUM5NSAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlZHgsNFwpCi0gMTgyIDAyZjcgMzY4QzFDOTYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVkeCw0XCkKLSAxODMgMDJmYiAzNjhDMUM5NyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWR4LDRcKQotIDE4NCAwMmZmIDM2OEMxQzk4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlYngsNFwpCi0gMTg1IDAzMDMgMzY4QzFDOTkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVieCw0XCkKLSAxODYgMDMwNyAzNjhDMUM5QSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWJ4LDRcKQotIDE4NyAwMzBiIDM2OEMxQzlCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlYngsNFwpCi0gMTg4IDAzMGYgOEMxQzlDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVieCw0XCkKLSAxODkgMDMxMiAzNjhDMUM5RCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlYngsNFwpCi0gMTkwIDAzMWEgMzY4QzFDOUUgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVieCw0XCkKLSAxOTEgMDMxZSAzNjhDMUM5RiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWJ4LDRcKQotIDE5MiAwMzIyIDM2OEMxOCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LDRcKQotLipXYXJuaW5nOi4qCi0gMTkzIDAzMjUgMzY4QzE5ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsNFwpCi0uKldhcm5pbmc6LioKLSAxOTQgMDMyOCAzNjhDMUEgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCw0XCkKLS4qV2FybmluZzouKgotIDE5NSAwMzJiIDM2OEMxQiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LDRcKQotLipXYXJuaW5nOi4qCi0gMTk2IDAzMmUgOEMxQzI0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsNFwpCi0uKldhcm5pbmc6LioKLSAxOTcgMDMzMSAzNjhDMUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJXNzOlwoLDRcKQotLipXYXJuaW5nOi4qCi0gMTk4IDAzMzggMzY4QzFFICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksNFwpCi0uKldhcm5pbmc6LioKLSAxOTkgMDMzYiAzNjhDMUYgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSw0XCkKLS4qV2FybmluZzouKgotIDIwMCAwMzNlIDM2OEMxQ0E4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlYnAsNFwpCi0gMjAxIDAzNDIgMzY4QzFDQTkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVicCw0XCkKLSAyMDIgMDM0NiAzNjhDMUNBQSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWJwLDRcKQotIDIwMyAwMzRhIDM2OEMxQ0FCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlYnAsNFwpCi0gMjA0IDAzNGUgOEMxQ0FDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVicCw0XCkKLSAyMDUgMDM1MSAzNjhDMUNBRCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlYnAsNFwpCi0gMjA2IDAzNTkgMzY4QzFDQUUgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVicCw0XCkKLSAyMDcgMDM1ZCAzNjhDMUNBRiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWJwLDRcKQotIDIwOCAwMzYxIDM2OEMxQ0IwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlc2ksNFwpCi0gMjA5IDAzNjUgMzY4QzFDQjEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVzaSw0XCkKLSAyMTAgMDM2OSAzNjhDMUNCMiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZXNpLDRcKQotIDIxMSAwMzZkIDM2OEMxQ0IzICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlc2ksNFwpCi0gMjEyIDAzNzEgOEMxQ0I0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVzaSw0XCkKLSAyMTMgMDM3NCAzNjhDMUNCNSAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlc2ksNFwpCi0gMjE0IDAzN2MgMzY4QzFDQjYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVzaSw0XCkKLSAyMTUgMDM4MCAzNjhDMUNCNyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZXNpLDRcKQotIDIxNiAwMzg0IDM2OEMxQ0I4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlZGksNFwpCi0gMjE3IDAzODggMzY4QzFDQjkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVkaSw0XCkKLSAyMTggMDM4YyAzNjhDMUNCQSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWRpLDRcKQotIDIxOSAwMzkwIDM2OEMxQ0JCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlZGksNFwpCi0gMjIwIDAzOTQgOEMxQ0JDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVkaSw0XCkKLSAyMjEgMDM5NyAzNjhDMUNCRCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlZGksNFwpCi0gMjIyIDAzOWYgMzY4QzFDQkUgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVkaSw0XCkKLSAyMjMgMDNhMyAzNjhDMUNCRiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWRpLDRcKQotIDIyNCAwM2E3IDM2OEMxQ0MwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlYXgsOFwpCi0gMjI1IDAzYWIgMzY4QzFDQzEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVheCw4XCkKLSAyMjYgMDNhZiAzNjhDMUNDMiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWF4LDhcKQotIDIyNyAwM2IzIDM2OEMxQ0MzICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlYXgsOFwpCi0gMjI4IDAzYjcgOEMxQ0M0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVheCw4XCkKLSAyMjkgMDNiYSAzNjhDMUNDNSAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlYXgsOFwpCi0gMjMwIDAzYzIgMzY4QzFDQzYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVheCw4XCkKLSAyMzEgMDNjNiAzNjhDMUNDNyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWF4LDhcKQotIDIzMiAwM2NhIDM2OEMxQ0M4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlY3gsOFwpCi0gMjMzIDAzY2UgMzY4QzFDQzkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVjeCw4XCkKLSAyMzQgMDNkMiAzNjhDMUNDQSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWN4LDhcKQotIDIzNSAwM2Q2IDM2OEMxQ0NCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlY3gsOFwpCi0gMjM2IDAzZGEgOEMxQ0NDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVjeCw4XCkKLSAyMzcgMDNkZCAzNjhDMUNDRCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlY3gsOFwpCi0gMjM4IDAzZTUgMzY4QzFDQ0UgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVjeCw4XCkKLSAyMzkgMDNlOSAzNjhDMUNDRiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWN4LDhcKQotIDI0MCAwM2VkIDM2OEMxQ0QwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlZHgsOFwpCi0gMjQxIDAzZjEgMzY4QzFDRDEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVkeCw4XCkKLSAyNDIgMDNmNSAzNjhDMUNEMiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWR4LDhcKQotIDI0MyAwM2Y5IDM2OEMxQ0QzICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlZHgsOFwpCi0gMjQ0IDAzZmQgOEMxQ0Q0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVkeCw4XCkKLSAyNDUgMDQwMCAzNjhDMUNENSAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlZHgsOFwpCi0gMjQ2IDA0MDggMzY4QzFDRDYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVkeCw4XCkKLSAyNDcgMDQwYyAzNjhDMUNENyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWR4LDhcKQotIDI0OCAwNDEwIDM2OEMxQ0Q4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlYngsOFwpCi0gMjQ5IDA0MTQgMzY4QzFDRDkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVieCw4XCkKLSAyNTAgMDQxOCAzNjhDMUNEQSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWJ4LDhcKQotIDI1MSAwNDFjIDM2OEMxQ0RCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlYngsOFwpCi0gMjUyIDA0MjAgOEMxQ0RDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVieCw4XCkKLSAyNTMgMDQyMyAzNjhDMUNERCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlYngsOFwpCi0gMjU0IDA0MmIgMzY4QzFDREUgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVieCw4XCkKLSAyNTUgMDQyZiAzNjhDMUNERiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWJ4LDhcKQotIDI1NiAwNDMzIDM2OEMxOCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LDhcKQotLipXYXJuaW5nOi4qCi0gMjU3IDA0MzYgMzY4QzE5ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsOFwpCi0uKldhcm5pbmc6LioKLSAyNTggMDQzOSAzNjhDMUEgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCw4XCkKLS4qV2FybmluZzouKgotIDI1OSAwNDNjIDM2OEMxQiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LDhcKQotLipXYXJuaW5nOi4qCi0gMjYwIDA0M2YgOEMxQzI0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsOFwpCi0uKldhcm5pbmc6LioKLSAyNjEgMDQ0MiAzNjhDMUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJXNzOlwoLDhcKQotLipXYXJuaW5nOi4qCi0gMjYyIDA0NDkgMzY4QzFFICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksOFwpCi0uKldhcm5pbmc6LioKLSAyNjMgMDQ0YyAzNjhDMUYgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSw4XCkKLS4qV2FybmluZzouKgotIDI2NCAwNDRmIDM2OEMxQ0U4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlYnAsOFwpCi0gMjY1IDA0NTMgMzY4QzFDRTkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVicCw4XCkKLSAyNjYgMDQ1NyAzNjhDMUNFQSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWJwLDhcKQotIDI2NyAwNDViIDM2OEMxQ0VCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlYnAsOFwpCi0gMjY4IDA0NWYgOEMxQ0VDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVicCw4XCkKLSAyNjkgMDQ2MiAzNjhDMUNFRCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlYnAsOFwpCi0gMjcwIDA0NmEgMzY4QzFDRUUgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVicCw4XCkKLSAyNzEgMDQ2ZSAzNjhDMUNFRiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWJwLDhcKQotIDI3MiAwNDcyIDM2OEMxQ0YwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlc2ksOFwpCi0gMjczIDA0NzYgMzY4QzFDRjEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVzaSw4XCkKLSAyNzQgMDQ3YSAzNjhDMUNGMiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZXNpLDhcKQotIDI3NSAwNDdlIDM2OEMxQ0YzICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlc2ksOFwpCi0gMjc2IDA0ODIgOEMxQ0Y0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVzaSw4XCkKLSAyNzcgMDQ4NSAzNjhDMUNGNSAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlc2ksOFwpCi0gMjc4IDA0OGQgMzY4QzFDRjYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVzaSw4XCkKLSAyNzkgMDQ5MSAzNjhDMUNGNyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZXNpLDhcKQotIDI4MCAwNDk1IDM2OEMxQ0Y4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlZGksOFwpCi0gMjgxIDA0OTkgMzY4QzFDRkEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkaSw4XCkKLSAyODIgMDQ5ZCAzNjhDMUNGOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWRpLDhcKQotIDI4MyAwNGExIDM2OEMxQ0ZCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlZGksOFwpCi0gMjg0IDA0YTUgOEMxQ0ZDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVkaSw4XCkKLSAyODUgMDRhOCAzNjhDMUNGRCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlZGksOFwpCi0gMjg2IDA0YjAgMzY4QzFDRkUgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVkaSw4XCkKLSAyODcgMDRiNCAzNjhDMUNGRiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWRpLDhcKQotIDI4OCAwNGI4IDM2OEM1QzAwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWF4LDFcKQotIDI4OSAwNGJkIDM2OEM1QzAxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWF4LDFcKQotIDI5MCAwNGMyIDM2OEM1QzAyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWF4LDFcKQotIDI5MSAwNGM3IDM2OEM1QzAzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWF4LDFcKQotIDI5MiAwNGNjIDhDNUMwNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWF4LDFcKQotIDI5MyAwNGQwIDhDNUMwNTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWF4LDFcKQotIDI5NCAwNGQ0IDM2OEM1QzA2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWF4LDFcKQotIDI5NSAwNGQ5IDM2OEM1QzA3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWF4LDFcKQotIDI5NiAwNGRlIDM2OEM1QzA4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWN4LDFcKQotIDI5NyAwNGUzIDM2OEM1QzA5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWN4LDFcKQotIDI5OCAwNGU4IDM2OEM1QzBBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWN4LDFcKQotIDI5OSAwNGVkIDM2OEM1QzBCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWN4LDFcKQotIDMwMCAwNGYyIDhDNUMwQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWN4LDFcKQotIDMwMSAwNGY2IDhDNUMwRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWN4LDFcKQotIDMwMiAwNGZhIDM2OEM1QzBFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWN4LDFcKQotIDMwMyAwNGZmIDM2OEM1QzBGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWN4LDFcKQotIDMwNCAwNTA0IDM2OEM1QzEwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWR4LDFcKQotIDMwNSAwNTA5IDM2OEM1QzExIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWR4LDFcKQotIDMwNiAwNTBlIDM2OEM1QzEyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWR4LDFcKQotIDMwNyAwNTEzIDM2OEM1QzEzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWR4LDFcKQotIDMwOCAwNTE4IDhDNUMxNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWR4LDFcKQotIDMwOSAwNTFjIDhDNUMxNTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWR4LDFcKQotIDMxMCAwNTIwIDM2OEM1QzE2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWR4LDFcKQotIDMxMSAwNTI1IDM2OEM1QzE3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWR4LDFcKQotIDMxMiAwNTJhIDM2OEM1QzE4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJ4LDFcKQotIDMxMyAwNTJmIDM2OEM1QzE5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJ4LDFcKQotIDMxNCAwNTM0IDM2OEM1QzFBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJ4LDFcKQotIDMxNSAwNTM5IDM2OEM1QzFCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJ4LDFcKQotIDMxNiAwNTNlIDhDNUMxQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJ4LDFcKQotIDMxNyAwNTQyIDhDNUMxRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJ4LDFcKQotIDMxOCAwNTQ2IDM2OEM1QzFFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJ4LDFcKQotIDMxOSAwNTRiIDM2OEM1QzFGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJ4LDFcKQotIDMyMCAwNTUwIDM2OEM1ODEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwxXCkKLSAzMjEgMDU1NCAzNjhDNTkxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsMVwpCi0gMzIyIDA1NTggMzY4QzVBMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LDFcKQotIDMyMyAwNTVjIDM2OEM1QjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwxXCkKLSAzMjQgMDU2MCA4QzVDMjQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsMVwpCi0gMzI1IDA1NjQgOEM1RDEyICAgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLDFcKQotIDMyNiAwNTY3IDM2OEM1RTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwxXCkKLSAzMjcgMDU2YiAzNjhDNUYxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksMVwpCi0gMzI4IDA1NmYgMzY4QzVDMjggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlYnAsMVwpCi0gMzI5IDA1NzQgMzY4QzVDMjkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlYnAsMVwpCi0gMzMwIDA1NzkgMzY4QzVDMkEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlYnAsMVwpCi0gMzMxIDA1N2UgMzY4QzVDMkIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlYnAsMVwpCi0gMzMyIDA1ODMgOEM1QzJDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlYnAsMVwpCi0gMzMzIDA1ODcgOEM1QzJEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlYnAsMVwpCi0gMzM0IDA1OGIgMzY4QzVDMkUgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlYnAsMVwpCi0gMzM1IDA1OTAgMzY4QzVDMkYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlYnAsMVwpCi0gMzM2IDA1OTUgMzY4QzVDMzAgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlc2ksMVwpCi0gMzM3IDA1OWEgMzY4QzVDMzEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlc2ksMVwpCi0gMzM4IDA1OWYgMzY4QzVDMzIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlc2ksMVwpCi0gMzM5IDA1YTQgMzY4QzVDMzMgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlc2ksMVwpCi0gMzQwIDA1YTkgOEM1QzM0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlc2ksMVwpCi0gMzQxIDA1YWQgOEM1QzM1MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlc2ksMVwpCi0gMzQyIDA1YjEgMzY4QzVDMzYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlc2ksMVwpCi0gMzQzIDA1YjYgMzY4QzVDMzcgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlc2ksMVwpCi0gMzQ0IDA1YmIgMzY4QzVDMzggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlZGksMVwpCi0gMzQ1IDA1YzAgMzY4QzVDMzkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlZGksMVwpCi0gMzQ2IDA1YzUgMzY4QzVDM0EgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlZGksMVwpCi0gMzQ3IDA1Y2EgMzY4QzVDM0IgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlZGksMVwpCi0gMzQ4IDA1Y2YgOEM1QzNDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlZGksMVwpCi0gMzQ5IDA1ZDMgOEM1QzNEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlZGksMVwpCi0gMzUwIDA1ZDcgMzY4QzVDM0UgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlZGksMVwpCi0gMzUxIDA1ZGMgMzY4QzVDM0YgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlZGksMVwpCi0gMzUyIDA1ZTEgMzY4QzVDNDAgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlYXgsMlwpCi0gMzUzIDA1ZTYgMzY4QzVDNDEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlYXgsMlwpCi0gMzU0IDA1ZWIgMzY4QzVDNDIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlYXgsMlwpCi0gMzU1IDA1ZjAgMzY4QzVDNDMgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlYXgsMlwpCi0gMzU2IDA1ZjUgOEM1QzQ0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlYXgsMlwpCi0gMzU3IDA1ZjkgOEM1QzQ1MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlYXgsMlwpCi0gMzU4IDA1ZmQgMzY4QzVDNDYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlYXgsMlwpCi0gMzU5IDA2MDIgMzY4QzVDNDcgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlYXgsMlwpCi0gMzYwIDA2MDcgMzY4QzVDNDggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlY3gsMlwpCi0gMzYxIDA2MGMgMzY4QzVDNDkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlY3gsMlwpCi0gMzYyIDA2MTEgMzY4QzVDNEEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlY3gsMlwpCi0gMzYzIDA2MTYgMzY4QzVDNEIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlY3gsMlwpCi0gMzY0IDA2MWIgOEM1QzRDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlY3gsMlwpCi0gMzY1IDA2MWYgOEM1QzREMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlY3gsMlwpCi0gMzY2IDA2MjMgMzY4QzVDNEUgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlY3gsMlwpCi0gMzY3IDA2MjggMzY4QzVDNEYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlY3gsMlwpCi0gMzY4IDA2MmQgMzY4QzVDNTAgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlZHgsMlwpCi0gMzY5IDA2MzIgMzY4QzVDNTEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlZHgsMlwpCi0gMzcwIDA2MzcgMzY4QzVDNTIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlZHgsMlwpCi0gMzcxIDA2M2MgMzY4QzVDNTMgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlZHgsMlwpCi0gMzcyIDA2NDEgOEM1QzU0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlZHgsMlwpCi0gMzczIDA2NDUgOEM1QzU1MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlZHgsMlwpCi0gMzc0IDA2NDkgMzY4QzVDNTYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlZHgsMlwpCi0gMzc1IDA2NGUgMzY4QzVDNTcgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlZHgsMlwpCi0gMzc2IDA2NTMgMzY4QzVDNTggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlYngsMlwpCi0gMzc3IDA2NTggMzY4QzVDNTkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlYngsMlwpCi0gMzc4IDA2NWQgMzY4QzVDNUEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlYngsMlwpCi0gMzc5IDA2NjIgMzY4QzVDNUIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlYngsMlwpCi0gMzgwIDA2NjcgOEM1QzVDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlYngsMlwpCi0gMzgxIDA2NmIgOEM1QzVEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlYngsMlwpCi0gMzgyIDA2NmYgMzY4QzVDNUUgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlYngsMlwpCi0gMzgzIDA2NzQgMzY4QzVDNUYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlYngsMlwpCi0gMzg0IDA2NzkgMzY4QzU4MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LDJcKQotLipXYXJuaW5nOi4qCi0gMzg1IDA2N2QgMzY4QzU5MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LDJcKQotLipXYXJuaW5nOi4qCi0gMzg2IDA2ODEgMzY4QzVBMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LDJcKQotLipXYXJuaW5nOi4qCi0gMzg3IDA2ODUgMzY4QzVCMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LDJcKQotLipXYXJuaW5nOi4qCi0gMzg4IDA2ODkgOEM1QzI0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLDJcKQotLipXYXJuaW5nOi4qCi0gMzg5IDA2OGQgOEM1RDEyICAgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLDJcKQotLipXYXJuaW5nOi4qCi0gMzkwIDA2OTAgMzY4QzVFMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLDJcKQotLipXYXJuaW5nOi4qCi0gMzkxIDA2OTQgMzY4QzVGMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLDJcKQotLipXYXJuaW5nOi4qCi0gMzkyIDA2OTggMzY4QzVDNjggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlYnAsMlwpCi0gMzkzIDA2OWQgMzY4QzVDNjkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlYnAsMlwpCi0gMzk0IDA2YTIgMzY4QzVDNkEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlYnAsMlwpCi0gMzk1IDA2YTcgMzY4QzVDNkIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlYnAsMlwpCi0gMzk2IDA2YWMgOEM1QzZDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlYnAsMlwpCi0gMzk3IDA2YjAgOEM1QzZEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlYnAsMlwpCi0gMzk4IDA2YjQgMzY4QzVDNkUgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlYnAsMlwpCi0gMzk5IDA2YjkgMzY4QzVDNkYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlYnAsMlwpCi0gNDAwIDA2YmUgMzY4QzVDNzAgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlc2ksMlwpCi0gNDAxIDA2YzMgMzY4QzVDNzEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlc2ksMlwpCi0gNDAyIDA2YzggMzY4QzVDNzIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlc2ksMlwpCi0gNDAzIDA2Y2QgMzY4QzVDNzMgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlc2ksMlwpCi0gNDA0IDA2ZDIgOEM1Qzc0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlc2ksMlwpCi0gNDA1IDA2ZDYgOEM1Qzc1MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlc2ksMlwpCi0gNDA2IDA2ZGEgMzY4QzVDNzYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlc2ksMlwpCi0gNDA3IDA2ZGYgMzY4QzVDNzcgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlc2ksMlwpCi0gNDA4IDA2ZTQgMzY4QzVDNzggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlZGksMlwpCi0gNDA5IDA2ZTkgMzY4QzVDNzkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlZGksMlwpCi0gNDEwIDA2ZWUgMzY4QzVDN0EgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlZGksMlwpCi0gNDExIDA2ZjMgMzY4QzVDN0IgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlZGksMlwpCi0gNDEyIDA2ZjggOEM1QzdDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlZGksMlwpCi0gNDEzIDA2ZmMgOEM1QzdEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlZGksMlwpCi0gNDE0IDA3MDAgMzY4QzVDN0UgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlZGksMlwpCi0gNDE1IDA3MDUgMzY4QzVDN0YgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlZGksMlwpCi0gNDE2IDA3MGEgMzY4QzVDODAgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlYXgsNFwpCi0gNDE3IDA3MGYgMzY4QzVDODEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlYXgsNFwpCi0gNDE4IDA3MTQgMzY4QzVDODIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlYXgsNFwpCi0gNDE5IDA3MTkgMzY4QzVDODMgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlYXgsNFwpCi0gNDIwIDA3MWUgOEM1Qzg0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlYXgsNFwpCi0gNDIxIDA3MjIgOEM1Qzg1MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlYXgsNFwpCi0gNDIyIDA3MjYgMzY4QzVDODYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlYXgsNFwpCi0gNDIzIDA3MmIgMzY4QzVDODcgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlYXgsNFwpCi0gNDI0IDA3MzAgMzY4QzVDODggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlY3gsNFwpCi0gNDI1IDA3MzUgMzY4QzVDODkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlY3gsNFwpCi0gNDI2IDA3M2EgMzY4QzVDOEEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlY3gsNFwpCi0gNDI3IDA3M2YgMzY4QzVDOEIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlY3gsNFwpCi0gNDI4IDA3NDQgOEM1QzhDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlY3gsNFwpCi0gNDI5IDA3NDggOEM1QzhEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlY3gsNFwpCi0gNDMwIDA3NGMgMzY4QzVDOEUgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlY3gsNFwpCi0gNDMxIDA3NTEgMzY4QzVDOEYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlY3gsNFwpCi0gNDMyIDA3NTYgMzY4QzVDOTAgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlZHgsNFwpCi0gNDMzIDA3NWIgMzY4QzVDOTEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlZHgsNFwpCi0gNDM0IDA3NjAgMzY4QzVDOTIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlZHgsNFwpCi0gNDM1IDA3NjUgMzY4QzVDOTMgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlZHgsNFwpCi0gNDM2IDA3NmEgOEM1Qzk0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlZHgsNFwpCi0gNDM3IDA3NmUgOEM1Qzk1MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlZHgsNFwpCi0gNDM4IDA3NzIgMzY4QzVDOTYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlZHgsNFwpCi0gNDM5IDA3NzcgMzY4QzVDOTcgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlZHgsNFwpCi0gNDQwIDA3N2MgMzY4QzVDOTggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlYngsNFwpCi0gNDQxIDA3ODEgMzY4QzVDOTkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlYngsNFwpCi0gNDQyIDA3ODYgMzY4QzVDOUEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlYngsNFwpCi0gNDQzIDA3OGIgMzY4QzVDOUIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlYngsNFwpCi0gNDQ0IDA3OTAgOEM1QzlDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlYngsNFwpCi0gNDQ1IDA3OTQgOEM1QzlEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlYngsNFwpCi0gNDQ2IDA3OTggMzY4QzVDOUUgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlYngsNFwpCi0gNDQ3IDA3OWQgMzY4QzVDOUYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlYngsNFwpCi0gNDQ4IDA3YTIgMzY4QzU4MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LDRcKQotLipXYXJuaW5nOi4qCi0gNDQ5IDA3YTYgMzY4QzU5MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LDRcKQotLipXYXJuaW5nOi4qCi0gNDUwIDA3YWEgMzY4QzVBMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LDRcKQotLipXYXJuaW5nOi4qCi0gNDUxIDA3YWUgMzY4QzVCMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LDRcKQotLipXYXJuaW5nOi4qCi0gNDUyIDA3YjIgOEM1QzI0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLDRcKQotLipXYXJuaW5nOi4qCi0gNDUzIDA3YjYgOEM1RDEyICAgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLDRcKQotLipXYXJuaW5nOi4qCi0gNDU0IDA3YjkgMzY4QzVFMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLDRcKQotLipXYXJuaW5nOi4qCi0gNDU1IDA3YmQgMzY4QzVGMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLDRcKQotLipXYXJuaW5nOi4qCi0gNDU2IDA3YzEgMzY4QzVDQTggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlYnAsNFwpCi0gNDU3IDA3YzYgMzY4QzVDQTkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlYnAsNFwpCi0gNDU4IDA3Y2IgMzY4QzVDQUEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlYnAsNFwpCi0gNDU5IDA3ZDAgMzY4QzVDQUIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlYnAsNFwpCi0gNDYwIDA3ZDUgOEM1Q0FDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlYnAsNFwpCi0gNDYxIDA3ZDkgOEM1Q0FEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlYnAsNFwpCi0gNDYyIDA3ZGQgMzY4QzVDQUUgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlYnAsNFwpCi0gNDYzIDA3ZTIgMzY4QzVDQUYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlYnAsNFwpCi0gNDY0IDA3ZTcgMzY4QzVDQjAgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlc2ksNFwpCi0gNDY1IDA3ZWMgMzY4QzVDQjEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlc2ksNFwpCi0gNDY2IDA3ZjEgMzY4QzVDQjIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlc2ksNFwpCi0gNDY3IDA3ZjYgMzY4QzVDQjMgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlc2ksNFwpCi0gNDY4IDA3ZmIgOEM1Q0I0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlc2ksNFwpCi0gNDY5IDA3ZmYgOEM1Q0I1MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlc2ksNFwpCi0gNDcwIDA4MDMgMzY4QzVDQjYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlc2ksNFwpCi0gNDcxIDA4MDggMzY4QzVDQjcgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlc2ksNFwpCi0gNDcyIDA4MGQgMzY4QzVDQjggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlZGksNFwpCi0gNDczIDA4MTIgMzY4QzVDQjkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlZGksNFwpCi0gNDc0IDA4MTcgMzY4QzVDQkEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlZGksNFwpCi0gNDc1IDA4MWMgMzY4QzVDQkIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlZGksNFwpCi0gNDc2IDA4MjEgOEM1Q0JDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlZGksNFwpCi0gNDc3IDA4MjUgOEM1Q0JEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlZGksNFwpCi0gNDc4IDA4MjkgMzY4QzVDQkUgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlZGksNFwpCi0gNDc5IDA4MmUgMzY4QzVDQkYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlZGksNFwpCi0gNDgwIDA4MzMgMzY4QzVDQzAgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlYXgsOFwpCi0gNDgxIDA4MzggMzY4QzVDQzEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlYXgsOFwpCi0gNDgyIDA4M2QgMzY4QzVDQzIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlYXgsOFwpCi0gNDgzIDA4NDIgMzY4QzVDQzMgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlYXgsOFwpCi0gNDg0IDA4NDcgOEM1Q0M0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlYXgsOFwpCi0gNDg1IDA4NGIgOEM1Q0M1MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlYXgsOFwpCi0gNDg2IDA4NGYgMzY4QzVDQzYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlYXgsOFwpCi0gNDg3IDA4NTQgMzY4QzVDQzcgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlYXgsOFwpCi0gNDg4IDA4NTkgMzY4QzVDQzggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlY3gsOFwpCi0gNDg5IDA4NWUgMzY4QzVDQzkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlY3gsOFwpCi0gNDkwIDA4NjMgMzY4QzVDQ0EgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlY3gsOFwpCi0gNDkxIDA4NjggMzY4QzVDQ0IgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlY3gsOFwpCi0gNDkyIDA4NmQgOEM1Q0NDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlY3gsOFwpCi0gNDkzIDA4NzEgOEM1Q0NEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlY3gsOFwpCi0gNDk0IDA4NzUgMzY4QzVDQ0UgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlY3gsOFwpCi0gNDk1IDA4N2EgMzY4QzVDQ0YgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlY3gsOFwpCi0gNDk2IDA4N2YgMzY4QzVDRDAgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlZHgsOFwpCi0gNDk3IDA4ODQgMzY4QzVDRDEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlZHgsOFwpCi0gNDk4IDA4ODkgMzY4QzVDRDIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlZHgsOFwpCi0gNDk5IDA4OGUgMzY4QzVDRDMgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlZHgsOFwpCi0gNTAwIDA4OTMgOEM1Q0Q0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlZHgsOFwpCi0gNTAxIDA4OTcgOEM1Q0Q1MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlZHgsOFwpCi0gNTAyIDA4OWIgMzY4QzVDRDYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlZHgsOFwpCi0gNTAzIDA4YTAgMzY4QzVDRDcgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlZHgsOFwpCi0gNTA0IDA4YTUgMzY4QzVDRDggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlYngsOFwpCi0gNTA1IDA4YWEgMzY4QzVDRDkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlYngsOFwpCi0gNTA2IDA4YWYgMzY4QzVDREEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlYngsOFwpCi0gNTA3IDA4YjQgMzY4QzVDREIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlYngsOFwpCi0gNTA4IDA4YjkgOEM1Q0RDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlYngsOFwpCi0gNTA5IDA4YmQgOEM1Q0REMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlYngsOFwpCi0gNTEwIDA4YzEgMzY4QzVDREUgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlYngsOFwpCi0gNTExIDA4YzYgMzY4QzVDREYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlYngsOFwpCi0gNTEyIDA4Y2IgMzY4QzU4MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LDhcKQotLipXYXJuaW5nOi4qCi0gNTEzIDA4Y2YgMzY4QzU5MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LDhcKQotLipXYXJuaW5nOi4qCi0gNTE0IDA4ZDMgMzY4QzVBMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LDhcKQotLipXYXJuaW5nOi4qCi0gNTE1IDA4ZDcgMzY4QzVCMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LDhcKQotLipXYXJuaW5nOi4qCi0gNTE2IDA4ZGIgOEM1QzI0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLDhcKQotLipXYXJuaW5nOi4qCi0gNTE3IDA4ZGYgOEM1RDEyICAgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLDhcKQotLipXYXJuaW5nOi4qCi0gNTE4IDA4ZTIgMzY4QzVFMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLDhcKQotLipXYXJuaW5nOi4qCi0gNTE5IDA4ZTYgMzY4QzVGMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLDhcKQotLipXYXJuaW5nOi4qCi0gNTIwIDA4ZWEgMzY4QzVDRTggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlYnAsOFwpCi0gNTIxIDA4ZWYgMzY4QzVDRTkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlYnAsOFwpCi0gNTIyIDA4ZjQgMzY4QzVDRUEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlYnAsOFwpCi0gNTIzIDA4ZjkgMzY4QzVDRUIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlYnAsOFwpCi0gNTI0IDA4ZmUgOEM1Q0VDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlYnAsOFwpCi0gNTI1IDA5MDIgOEM1Q0VEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlYnAsOFwpCi0gNTI2IDA5MDYgMzY4QzVDRUUgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlYnAsOFwpCi0gNTI3IDA5MGIgMzY4QzVDRUYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlYnAsOFwpCi0gNTI4IDA5MTAgMzY4QzVDRjAgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlc2ksOFwpCi0gNTI5IDA5MTUgMzY4QzVDRjEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlc2ksOFwpCi0gNTMwIDA5MWEgMzY4QzVDRjIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlc2ksOFwpCi0gNTMxIDA5MWYgMzY4QzVDRjMgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlc2ksOFwpCi0gNTMyIDA5MjQgOEM1Q0Y0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlc2ksOFwpCi0gNTMzIDA5MjggOEM1Q0Y1MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlc2ksOFwpCi0gNTM0IDA5MmMgMzY4QzVDRjYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlc2ksOFwpCi0gNTM1IDA5MzEgMzY4QzVDRjcgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlc2ksOFwpCi0gNTM2IDA5MzYgMzY4QzVDRjggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlZGksOFwpCi0gNTM3IDA5M2IgMzY4QzVDRkEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlZGksOFwpCi0gNTM4IDA5NDAgMzY4QzVDRjkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlZGksOFwpCi0gNTM5IDA5NDUgMzY4QzVDRkIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlZGksOFwpCi0gNTQwIDA5NGEgOEM1Q0ZDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlZGksOFwpCi0gNTQxIDA5NGUgOEM1Q0ZEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlZGksOFwpCi0gNTQyIDA5NTIgMzY4QzVDRkUgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlZGksOFwpCi0gNTQzIDA5NTcgMzY4QzVDRkYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlZGksOFwpCi0gNTQ0IDA5NWMgMzY4QzlDMDAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsMVwpCi0gNTQ1IDA5NjQgMzY4QzlDMDEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsMVwpCi0gNTQ2IDA5NmMgMzY4QzlDMDIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsMVwpCi0gNTQ3IDA5NzQgMzY4QzlDMDMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsMVwpCi0gNTQ4IDA5N2MgOEM5QzA0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsMVwpCi0gNTQ5IDA5ODMgOEM5QzA1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsMVwpCi0gNTUwIDA5OGEgMzY4QzlDMDYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsMVwpCi0gNTUxIDA5OTIgMzY4QzlDMDcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsMVwpCi0gNTUyIDA5OWEgMzY4QzlDMDggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsMVwpCi0gNTUzIDA5YTIgMzY4QzlDMDkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsMVwpCi0gNTU0IDA5YWEgMzY4QzlDMEEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsMVwpCi0gNTU1IDA5YjIgMzY4QzlDMEIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsMVwpCi0gNTU2IDA5YmEgOEM5QzBDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsMVwpCi0gNTU3IDA5YzEgOEM5QzBENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsMVwpCi0gNTU4IDA5YzggMzY4QzlDMEUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsMVwpCi0gNTU5IDA5ZDAgMzY4QzlDMEYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsMVwpCi0gNTYwIDA5ZDggMzY4QzlDMTAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsMVwpCi0gNTYxIDA5ZTAgMzY4QzlDMTEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsMVwpCi0gNTYyIDA5ZTggMzY4QzlDMTIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsMVwpCi0gNTYzIDA5ZjAgMzY4QzlDMTMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsMVwpCi0gNTY0IDA5ZjggOEM5QzE0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsMVwpCi0gNTY1IDA5ZmYgOEM5QzE1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsMVwpCi0gNTY2IDBhMDYgMzY4QzlDMTYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsMVwpCi0gNTY3IDBhMGUgMzY4QzlDMTcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsMVwpCi0gNTY4IDBhMTYgMzY4QzlDMTggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYngsMVwpCi0gNTY5IDBhMWUgMzY4QzlDMTkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYngsMVwpCi0gNTcwIDBhMjYgMzY4QzlDMUEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYngsMVwpCi0gNTcxIDBhMmUgMzY4QzlDMUIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsMVwpCi0gNTcyIDBhMzYgOEM5QzFDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYngsMVwpCi0gNTczIDBhM2QgOEM5QzFENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYngsMVwpCi0gNTc0IDBhNDQgMzY4QzlDMUUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYngsMVwpCi0gNTc1IDBhNGMgMzY4QzlDMUYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYngsMVwpCi0gNTc2IDBhNTQgMzY4Qzk4NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LDFcKQotIDU3NyAwYTViIDM2OEM5OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwxXCkKLSA1NzggMGE2MiAzNjhDOUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsMVwpCi0gNTc5IDBhNjkgMzY4QzlCNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LDFcKQotIDU4MCAwYTcwIDhDOUMyNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwxXCkKLSA1ODEgMGE3NyA4QzlENzg1NiAzNDEyICAgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsMVwpCi0gNTgyIDBhN2QgMzY4QzlFNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLDFcKQotIDU4MyAwYTg0IDM2OEM5Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwxXCkKLSA1ODQgMGE4YiAzNjhDOUMyOCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVicCwxXCkKLSA1ODUgMGE5MyAzNjhDOUMyOSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVicCwxXCkKLSA1ODYgMGE5YiAzNjhDOUMyQSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVicCwxXCkKLSA1ODcgMGFhMyAzNjhDOUMyQiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVicCwxXCkKLSA1ODggMGFhYiA4QzlDMkM3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVicCwxXCkKLSA1ODkgMGFiMiA4QzlDMkQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVicCwxXCkKLSA1OTAgMGFiOSAzNjhDOUMyRSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVicCwxXCkKLSA1OTEgMGFjMSAzNjhDOUMyRiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVicCwxXCkKLSA1OTIgMGFjOSAzNjhDOUMzMCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVzaSwxXCkKLSA1OTMgMGFkMSAzNjhDOUMzMSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVzaSwxXCkKLSA1OTQgMGFkOSAzNjhDOUMzMiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVzaSwxXCkKLSA1OTUgMGFlMSAzNjhDOUMzMyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVzaSwxXCkKLSA1OTYgMGFlOSA4QzlDMzQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVzaSwxXCkKLSA1OTcgMGFmMCA4QzlDMzU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVzaSwxXCkKLSA1OTggMGFmNyAzNjhDOUMzNiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVzaSwxXCkKLSA1OTkgMGFmZiAzNjhDOUMzNyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVzaSwxXCkKLSA2MDAgMGIwNyAzNjhDOUMzOCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVkaSwxXCkKLSA2MDEgMGIwZiAzNjhDOUMzOSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVkaSwxXCkKLSA2MDIgMGIxNyAzNjhDOUMzQSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVkaSwxXCkKLSA2MDMgMGIxZiAzNjhDOUMzQiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVkaSwxXCkKLSA2MDQgMGIyNyA4QzlDM0M3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVkaSwxXCkKLSA2MDUgMGIyZSA4QzlDM0Q3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVkaSwxXCkKLSA2MDYgMGIzNSAzNjhDOUMzRSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVkaSwxXCkKLSA2MDcgMGIzZCAzNjhDOUMzRiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVkaSwxXCkKLSA2MDggMGI0NSAzNjhDOUM0MCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVheCwyXCkKLSA2MDkgMGI0ZCAzNjhDOUM0MSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVheCwyXCkKLSA2MTAgMGI1NSAzNjhDOUM0MiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVheCwyXCkKLSA2MTEgMGI1ZCAzNjhDOUM0MyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVheCwyXCkKLSA2MTIgMGI2NSA4QzlDNDQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVheCwyXCkKLSA2MTMgMGI2YyA4QzlDNDU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVheCwyXCkKLSA2MTQgMGI3MyAzNjhDOUM0NiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVheCwyXCkKLSA2MTUgMGI3YiAzNjhDOUM0NyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVheCwyXCkKLSA2MTYgMGI4MyAzNjhDOUM0OCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVjeCwyXCkKLSA2MTcgMGI4YiAzNjhDOUM0OSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVjeCwyXCkKLSA2MTggMGI5MyAzNjhDOUM0QSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVjeCwyXCkKLSA2MTkgMGI5YiAzNjhDOUM0QiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVjeCwyXCkKLSA2MjAgMGJhMyA4QzlDNEM3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVjeCwyXCkKLSA2MjEgMGJhYSA4QzlDNEQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVjeCwyXCkKLSA2MjIgMGJiMSAzNjhDOUM0RSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVjeCwyXCkKLSA2MjMgMGJiOSAzNjhDOUM0RiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVjeCwyXCkKLSA2MjQgMGJjMSAzNjhDOUM1MCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVkeCwyXCkKLSA2MjUgMGJjOSAzNjhDOUM1MSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVkeCwyXCkKLSA2MjYgMGJkMSAzNjhDOUM1MiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVkeCwyXCkKLSA2MjcgMGJkOSAzNjhDOUM1MyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVkeCwyXCkKLSA2MjggMGJlMSA4QzlDNTQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVkeCwyXCkKLSA2MjkgMGJlOCA4QzlDNTU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVkeCwyXCkKLSA2MzAgMGJlZiAzNjhDOUM1NiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVkeCwyXCkKLSA2MzEgMGJmNyAzNjhDOUM1NyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVkeCwyXCkKLSA2MzIgMGJmZiAzNjhDOUM1OCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVieCwyXCkKLSA2MzMgMGMwNyAzNjhDOUM1OSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVieCwyXCkKLSA2MzQgMGMwZiAzNjhDOUM1QSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVieCwyXCkKLSA2MzUgMGMxNyAzNjhDOUM1QiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVieCwyXCkKLSA2MzYgMGMxZiA4QzlDNUM3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVieCwyXCkKLSA2MzcgMGMyNiA4QzlDNUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVieCwyXCkKLSA2MzggMGMyZCAzNjhDOUM1RSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVieCwyXCkKLSA2MzkgMGMzNSAzNjhDOUM1RiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVieCwyXCkKLSA2NDAgMGMzZCAzNjhDOTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsMlwpCi0uKldhcm5pbmc6LioKLSA2NDEgMGM0NCAzNjhDOTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsMlwpCi0uKldhcm5pbmc6LioKLSA2NDIgMGM0YiAzNjhDOUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsMlwpCi0uKldhcm5pbmc6LioKLSA2NDMgMGM1MiAzNjhDOUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsMlwpCi0uKldhcm5pbmc6LioKLSA2NDQgMGM1OSA4QzlDMjQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsMlwpCi0uKldhcm5pbmc6LioKLSA2NDUgMGM2MCA4QzlENzg1NiAzNDEyICAgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsMlwpCi0uKldhcm5pbmc6LioKLSA2NDYgMGM2NiAzNjhDOUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksMlwpCi0uKldhcm5pbmc6LioKLSA2NDcgMGM2ZCAzNjhDOUY3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksMlwpCi0uKldhcm5pbmc6LioKLSA2NDggMGM3NCAzNjhDOUM2OCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVicCwyXCkKLSA2NDkgMGM3YyAzNjhDOUM2OSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVicCwyXCkKLSA2NTAgMGM4NCAzNjhDOUM2QSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVicCwyXCkKLSA2NTEgMGM4YyAzNjhDOUM2QiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVicCwyXCkKLSA2NTIgMGM5NCA4QzlDNkM3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVicCwyXCkKLSA2NTMgMGM5YiA4QzlDNkQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVicCwyXCkKLSA2NTQgMGNhMiAzNjhDOUM2RSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVicCwyXCkKLSA2NTUgMGNhYSAzNjhDOUM2RiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVicCwyXCkKLSA2NTYgMGNiMiAzNjhDOUM3MCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVzaSwyXCkKLSA2NTcgMGNiYSAzNjhDOUM3MSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVzaSwyXCkKLSA2NTggMGNjMiAzNjhDOUM3MiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVzaSwyXCkKLSA2NTkgMGNjYSAzNjhDOUM3MyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVzaSwyXCkKLSA2NjAgMGNkMiA4QzlDNzQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVzaSwyXCkKLSA2NjEgMGNkOSA4QzlDNzU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVzaSwyXCkKLSA2NjIgMGNlMCAzNjhDOUM3NiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVzaSwyXCkKLSA2NjMgMGNlOCAzNjhDOUM3NyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVzaSwyXCkKLSA2NjQgMGNmMCAzNjhDOUM3OCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVkaSwyXCkKLSA2NjUgMGNmOCAzNjhDOUM3OSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVkaSwyXCkKLSA2NjYgMGQwMCAzNjhDOUM3QSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVkaSwyXCkKLSA2NjcgMGQwOCAzNjhDOUM3QiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVkaSwyXCkKLSA2NjggMGQxMCA4QzlDN0M3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVkaSwyXCkKLSA2NjkgMGQxNyA4QzlDN0Q3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVkaSwyXCkKLSA2NzAgMGQxZSAzNjhDOUM3RSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVkaSwyXCkKLSA2NzEgMGQyNiAzNjhDOUM3RiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVkaSwyXCkKLSA2NzIgMGQyZSAzNjhDOUM4MCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVheCw0XCkKLSA2NzMgMGQzNiAzNjhDOUM4MSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVheCw0XCkKLSA2NzQgMGQzZSAzNjhDOUM4MiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVheCw0XCkKLSA2NzUgMGQ0NiAzNjhDOUM4MyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVheCw0XCkKLSA2NzYgMGQ0ZSA4QzlDODQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVheCw0XCkKLSA2NzcgMGQ1NSA4QzlDODU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVheCw0XCkKLSA2NzggMGQ1YyAzNjhDOUM4NiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVheCw0XCkKLSA2NzkgMGQ2NCAzNjhDOUM4NyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVheCw0XCkKLSA2ODAgMGQ2YyAzNjhDOUM4OCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVjeCw0XCkKLSA2ODEgMGQ3NCAzNjhDOUM4OSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVjeCw0XCkKLSA2ODIgMGQ3YyAzNjhDOUM4QSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVjeCw0XCkKLSA2ODMgMGQ4NCAzNjhDOUM4QiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVjeCw0XCkKLSA2ODQgMGQ4YyA4QzlDOEM3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVjeCw0XCkKLSA2ODUgMGQ5MyA4QzlDOEQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVjeCw0XCkKLSA2ODYgMGQ5YSAzNjhDOUM4RSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVjeCw0XCkKLSA2ODcgMGRhMiAzNjhDOUM4RiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVjeCw0XCkKLSA2ODggMGRhYSAzNjhDOUM5MCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVkeCw0XCkKLSA2ODkgMGRiMiAzNjhDOUM5MSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVkeCw0XCkKLSA2OTAgMGRiYSAzNjhDOUM5MiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVkeCw0XCkKLSA2OTEgMGRjMiAzNjhDOUM5MyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVkeCw0XCkKLSA2OTIgMGRjYSA4QzlDOTQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVkeCw0XCkKLSA2OTMgMGRkMSA4QzlDOTU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVkeCw0XCkKLSA2OTQgMGRkOCAzNjhDOUM5NiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVkeCw0XCkKLSA2OTUgMGRlMCAzNjhDOUM5NyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVkeCw0XCkKLSA2OTYgMGRlOCAzNjhDOUM5OCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVieCw0XCkKLSA2OTcgMGRmMCAzNjhDOUM5OSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVieCw0XCkKLSA2OTggMGRmOCAzNjhDOUM5QSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVieCw0XCkKLSA2OTkgMGUwMCAzNjhDOUM5QiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVieCw0XCkKLSA3MDAgMGUwOCA4QzlDOUM3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVieCw0XCkKLSA3MDEgMGUwZiA4QzlDOUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVieCw0XCkKLSA3MDIgMGUxNiAzNjhDOUM5RSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVieCw0XCkKLSA3MDMgMGUxZSAzNjhDOUM5RiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVieCw0XCkKLSA3MDQgMGUyNiAzNjhDOTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsNFwpCi0uKldhcm5pbmc6LioKLSA3MDUgMGUyZCAzNjhDOTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsNFwpCi0uKldhcm5pbmc6LioKLSA3MDYgMGUzNCAzNjhDOUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsNFwpCi0uKldhcm5pbmc6LioKLSA3MDcgMGUzYiAzNjhDOUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsNFwpCi0uKldhcm5pbmc6LioKLSA3MDggMGU0MiA4QzlDMjQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsNFwpCi0uKldhcm5pbmc6LioKLSA3MDkgMGU0OSA4QzlENzg1NiAzNDEyICAgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsNFwpCi0uKldhcm5pbmc6LioKLSA3MTAgMGU0ZiAzNjhDOUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksNFwpCi0uKldhcm5pbmc6LioKLSA3MTEgMGU1NiAzNjhDOUY3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksNFwpCi0uKldhcm5pbmc6LioKLSA3MTIgMGU1ZCAzNjhDOUNBOCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVicCw0XCkKLSA3MTMgMGU2NSAzNjhDOUNBOSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVicCw0XCkKLSA3MTQgMGU2ZCAzNjhDOUNBQSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVicCw0XCkKLSA3MTUgMGU3NSAzNjhDOUNBQiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVicCw0XCkKLSA3MTYgMGU3ZCA4QzlDQUM3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVicCw0XCkKLSA3MTcgMGU4NCA4QzlDQUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVicCw0XCkKLSA3MTggMGU4YiAzNjhDOUNBRSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVicCw0XCkKLSA3MTkgMGU5MyAzNjhDOUNBRiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVicCw0XCkKLSA3MjAgMGU5YiAzNjhDOUNCMCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVzaSw0XCkKLSA3MjEgMGVhMyAzNjhDOUNCMSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVzaSw0XCkKLSA3MjIgMGVhYiAzNjhDOUNCMiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVzaSw0XCkKLSA3MjMgMGViMyAzNjhDOUNCMyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVzaSw0XCkKLSA3MjQgMGViYiA4QzlDQjQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVzaSw0XCkKLSA3MjUgMGVjMiA4QzlDQjU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVzaSw0XCkKLSA3MjYgMGVjOSAzNjhDOUNCNiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVzaSw0XCkKLSA3MjcgMGVkMSAzNjhDOUNCNyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVzaSw0XCkKLSA3MjggMGVkOSAzNjhDOUNCOCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVkaSw0XCkKLSA3MjkgMGVlMSAzNjhDOUNCOSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVkaSw0XCkKLSA3MzAgMGVlOSAzNjhDOUNCQSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVkaSw0XCkKLSA3MzEgMGVmMSAzNjhDOUNCQiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVkaSw0XCkKLSA3MzIgMGVmOSA4QzlDQkM3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVkaSw0XCkKLSA3MzMgMGYwMCA4QzlDQkQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVkaSw0XCkKLSA3MzQgMGYwNyAzNjhDOUNCRSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVkaSw0XCkKLSA3MzUgMGYwZiAzNjhDOUNCRiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVkaSw0XCkKLSA3MzYgMGYxNyAzNjhDOUNDMCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVheCw4XCkKLSA3MzcgMGYxZiAzNjhDOUNDMSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVheCw4XCkKLSA3MzggMGYyNyAzNjhDOUNDMiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVheCw4XCkKLSA3MzkgMGYyZiAzNjhDOUNDMyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVheCw4XCkKLSA3NDAgMGYzNyA4QzlDQzQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVheCw4XCkKLSA3NDEgMGYzZSA4QzlDQzU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVheCw4XCkKLSA3NDIgMGY0NSAzNjhDOUNDNiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVheCw4XCkKLSA3NDMgMGY0ZCAzNjhDOUNDNyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVheCw4XCkKLSA3NDQgMGY1NSAzNjhDOUNDOCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVjeCw4XCkKLSA3NDUgMGY1ZCAzNjhDOUNDOSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVjeCw4XCkKLSA3NDYgMGY2NSAzNjhDOUNDQSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVjeCw4XCkKLSA3NDcgMGY2ZCAzNjhDOUNDQiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVjeCw4XCkKLSA3NDggMGY3NSA4QzlDQ0M3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVjeCw4XCkKLSA3NDkgMGY3YyA4QzlDQ0Q3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVjeCw4XCkKLSA3NTAgMGY4MyAzNjhDOUNDRSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVjeCw4XCkKLSA3NTEgMGY4YiAzNjhDOUNDRiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVjeCw4XCkKLSA3NTIgMGY5MyAzNjhDOUNEMCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVkeCw4XCkKLSA3NTMgMGY5YiAzNjhDOUNEMSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVkeCw4XCkKLSA3NTQgMGZhMyAzNjhDOUNEMiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVkeCw4XCkKLSA3NTUgMGZhYiAzNjhDOUNEMyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVkeCw4XCkKLSA3NTYgMGZiMyA4QzlDRDQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVkeCw4XCkKLSA3NTcgMGZiYSA4QzlDRDU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVkeCw4XCkKLSA3NTggMGZjMSAzNjhDOUNENiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVkeCw4XCkKLSA3NTkgMGZjOSAzNjhDOUNENyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVkeCw4XCkKLSA3NjAgMGZkMSAzNjhDOUNEOCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVieCw4XCkKLSA3NjEgMGZkOSAzNjhDOUNEOSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVieCw4XCkKLSA3NjIgMGZlMSAzNjhDOUNEQSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVieCw4XCkKLSA3NjMgMGZlOSAzNjhDOUNEQiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVieCw4XCkKLSA3NjQgMGZmMSA4QzlDREM3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVieCw4XCkKLSA3NjUgMGZmOCA4QzlDREQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVieCw4XCkKLSA3NjYgMGZmZiAzNjhDOUNERSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVieCw4XCkKLSA3NjcgMTAwNyAzNjhDOUNERiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVieCw4XCkKLSA3NjggMTAwZiAzNjhDOTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsOFwpCi0uKldhcm5pbmc6LioKLSA3NjkgMTAxNiAzNjhDOTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsOFwpCi0uKldhcm5pbmc6LioKLSA3NzAgMTAxZCAzNjhDOUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsOFwpCi0uKldhcm5pbmc6LioKLSA3NzEgMTAyNCAzNjhDOUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsOFwpCi0uKldhcm5pbmc6LioKLSA3NzIgMTAyYiA4QzlDMjQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsOFwpCi0uKldhcm5pbmc6LioKLSA3NzMgMTAzMiA4QzlENzg1NiAzNDEyICAgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsOFwpCi0uKldhcm5pbmc6LioKLSA3NzQgMTAzOCAzNjhDOUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksOFwpCi0uKldhcm5pbmc6LioKLSA3NzUgMTAzZiAzNjhDOUY3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksOFwpCi0uKldhcm5pbmc6LioKLSA3NzYgMTA0NiAzNjhDOUNFOCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVicCw4XCkKLSA3NzcgMTA0ZSAzNjhDOUNFOSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVicCw4XCkKLSA3NzggMTA1NiAzNjhDOUNFQSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVicCw4XCkKLSA3NzkgMTA1ZSAzNjhDOUNFQiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVicCw4XCkKLSA3ODAgMTA2NiA4QzlDRUM3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVicCw4XCkKLSA3ODEgMTA2ZCA4QzlDRUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVicCw4XCkKLSA3ODIgMTA3NCAzNjhDOUNFRSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVicCw4XCkKLSA3ODMgMTA3YyAzNjhDOUNFRiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVicCw4XCkKLSA3ODQgMTA4NCAzNjhDOUNGMCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVzaSw4XCkKLSA3ODUgMTA4YyAzNjhDOUNGMSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVzaSw4XCkKLSA3ODYgMTA5NCAzNjhDOUNGMiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVzaSw4XCkKLSA3ODcgMTA5YyAzNjhDOUNGMyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVzaSw4XCkKLSA3ODggMTBhNCA4QzlDRjQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVzaSw4XCkKLSA3ODkgMTBhYiA4QzlDRjU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVzaSw4XCkKLSA3OTAgMTBiMiAzNjhDOUNGNiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVzaSw4XCkKLSA3OTEgMTBiYSAzNjhDOUNGNyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVzaSw4XCkKLSA3OTIgMTBjMiAzNjhDOUNGOCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVkaSw4XCkKLSA3OTMgMTBjYSAzNjhDOUNGQSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVkaSw4XCkKLSA3OTQgMTBkMiAzNjhDOUNGOSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVkaSw4XCkKLSA3OTUgMTBkYSAzNjhDOUNGQiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVkaSw4XCkKLSA3OTYgMTBlMiA4QzlDRkM3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVkaSw4XCkKLSA3OTcgMTBlOSA4QzlDRkQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVkaSw4XCkKLSA3OTggMTBmMCAzNjhDOUNGRSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVkaSw4XCkKLSA3OTkgMTBmOCAzNjhDOUNGRiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVkaSw4XCkKLSA4MDAgMTEwMCA4QzVDMDUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWF4LDFcKQotIDgwMSAxMTA0IDhDNUMwRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlY3gsMVwpCi0gODAyIDExMDggOEM1QzE1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkeCwxXCkKLSA4MDMgMTEwYyA4QzVDMUQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJ4LDFcKQotIDgwNCAxMTEwIDhDNUQwMCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLDFcKQotIDgwNSAxMTEzIDhDNUMyRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYnAsMVwpCi0gODA2IDExMTcgOEM1QzM1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVzaSwxXCkKLSA4MDcgMTExYiA4QzVDM0QwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWRpLDFcKQotIDgwOCAxMTFmIDhDNUM0NTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYXgsMlwpCi0gODA5IDExMjMgOEM1QzREMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVjeCwyXCkKLSA4MTAgMTEyNyA4QzVDNTUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWR4LDJcKQotIDgxMSAxMTJiIDhDNUM1RDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYngsMlwpCi0gODEyIDExMmYgOEM1RDAwICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsMlwpCi0uKldhcm5pbmc6LioKLSA4MTMgMTEzMiA4QzVDNkQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJwLDJcKQotIDgxNCAxMTM2IDhDNUM3NTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlc2ksMlwpCi0gODE1IDExM2EgOEM1QzdEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkaSwyXCkKLSA4MTYgMTEzZSA4QzVDODUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWF4LDRcKQotIDgxNyAxMTQyIDhDNUM4RDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlY3gsNFwpCi0gODE4IDExNDYgOEM1Qzk1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkeCw0XCkKLSA4MTkgMTE0YSA4QzVDOUQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJ4LDRcKQotIDgyMCAxMTRlIDhDNUQwMCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLDRcKQotLipXYXJuaW5nOi4qCi0gODIxIDExNTEgOEM1Q0FEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVicCw0XCkKLSA4MjIgMTE1NSA4QzVDQjUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZXNpLDRcKQotIDgyMyAxMTU5IDhDNUNCRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZGksNFwpCi0gODI0IDExNWQgOEM1Q0M1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVheCw4XCkKLSA4MjUgMTE2MSA4QzVDQ0QwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWN4LDhcKQotIDgyNiAxMTY1IDhDNUNENTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZHgsOFwpCi0gODI3IDExNjkgOEM1Q0REMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVieCw4XCkKLSA4MjggMTE2ZCA4QzVEMDAgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCw4XCkKLS4qV2FybmluZzouKgotIDgyOSAxMTcwIDhDNUNFRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYnAsOFwpCi0gODMwIDExNzQgOEM1Q0Y1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVzaSw4XCkKLSA4MzEgMTE3OCA4QzVDRkQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWRpLDhcKQotIDgzMiAxMTdjIDM2OEMxRDEyIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6MHgxMlwoLDFcKQotIDgzMyAxMTgzIDM2OEMxRDEyIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6MHgxMlwoLDJcKQotLipXYXJuaW5nOi4qCi0gODM0IDExOGEgMzY4QzFEMTIgMDAwMDAwICAgCQltb3YJJWRzLCVzczoweDEyXCgsNFwpCi0uKldhcm5pbmc6LioKLSA4MzUgMTE5MSAzNjhDMUQxMiAwMDAwMDAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCw4XCkKLS4qV2FybmluZzouKgotIDgzNiAxMTk4IDhDMTggICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4XCkKLSA4MzcgMTE5YSA4QzE5ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeFwpCi0gODM4IDExOWMgOEMxQSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHhcKQotIDgzOSAxMTllIDhDMUIgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4XCkKLSA4NDAgMTFhMCA4QzFEMDAwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOjAKLSA4NDEgMTFhNiA4QzFFICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaVwpCi0gODQyIDExYTggOEMxRiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGlcKQotIDg0MyAxMWFhIDhDNTgxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheFwpCi0gODQ0IDExYWQgOEM1OTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4XCkKLSA4NDUgMTFiMCA4QzVBMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHhcKQotIDg0NiAxMWIzIDhDNUIxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieFwpCi0gODQ3IDExYjYgM0U4QzVEMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwXCkKLSA4NDggMTFiYSA4QzVFMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2lcKQotIDg0OSAxMWJkIDhDNUYxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaVwpCi0gODUwIDExYzAgOEM5ODc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4XCkKLSA4NTEgMTFjNiA4Qzk5Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3hcKQotIDg1MiAxMWNjIDhDOUE3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeFwpCi0gODUzIDExZDIgOEM5Qjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4XCkKLSA4NTQgMTFkOCAzRThDOUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnBcKQotIDg1NSAxMWRmIDhDOUU3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaVwpCi0gODU2IDExZTUgOEM5Rjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpXCkKLSA4NTcgMTFlYiA4Q0Q4ICAgICAgICAgICAgICAJCW1vdgklZHMsJWVheAotIDg1OCAxMWVkIDhDRDkgICAgICAgICAgICAgIAkJbW92CSVkcywlZWN4Ci0gODU5IDExZWYgOENEQSAgICAgICAgICAgICAgCQltb3YJJWRzLCVlZHgKLSA4NjAgMTFmMSA4Q0RCICAgICAgICAgICAgICAJCW1vdgklZHMsJWVieAotIDg2MSAxMWYzIDhDREMgICAgICAgICAgICAgIAkJbW92CSVkcywlZXNwCi0gODYyIDExZjUgOENERCAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYnAKLSA4NjMgMTFmNyA4Q0RFICAgICAgICAgICAgICAJCW1vdgklZHMsJWVzaQotIDg2NCAxMWY5IDhDREYgICAgICAgICAgICAgIAkJbW92CSVkcywlZWRpCi0gODY1IDExZmIgOEMxQzAwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVheCwxXCkKLSA4NjYgMTFmZSA4QzFDMDEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWF4LDFcKQotIDg2NyAxMjAxIDhDMUMwMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYXgsMVwpCi0gODY4IDEyMDQgOEMxQzAzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVheCwxXCkKLSA4NjkgMTIwNyAzRThDMUMwNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWF4LDFcKQotIDg3MCAxMjBiIDhDMUMwNTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVheCwxXCkKLSA4NzEgMTIxMiA4QzFDMDYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWF4LDFcKQotIDg3MiAxMjE1IDhDMUMwNyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYXgsMVwpCi0gODczIDEyMTggOEMxQzA4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVjeCwxXCkKLSA4NzQgMTIxYiA4QzFDMDkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWN4LDFcKQotIDg3NSAxMjFlIDhDMUMwQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlY3gsMVwpCi0gODc2IDEyMjEgOEMxQzBCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVjeCwxXCkKLSA4NzcgMTIyNCAzRThDMUMwQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWN4LDFcKQotIDg3OCAxMjI4IDhDMUMwRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVjeCwxXCkKLSA4NzkgMTIyZiA4QzFDMEUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWN4LDFcKQotIDg4MCAxMjMyIDhDMUMwRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlY3gsMVwpCi0gODgxIDEyMzUgOEMxQzEwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkeCwxXCkKLSA4ODIgMTIzOCA4QzFDMTEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWR4LDFcKQotIDg4MyAxMjNiIDhDMUMxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZHgsMVwpCi0gODg0IDEyM2UgOEMxQzEzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkeCwxXCkKLSA4ODUgMTI0MSAzRThDMUMxNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWR4LDFcKQotIDg4NiAxMjQ1IDhDMUMxNTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkeCwxXCkKLSA4ODcgMTI0YyA4QzFDMTYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWR4LDFcKQotIDg4OCAxMjRmIDhDMUMxNyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZHgsMVwpCi0gODg5IDEyNTIgOEMxQzE4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVieCwxXCkKLSA4OTAgMTI1NSA4QzFDMTkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJ4LDFcKQotIDg5MSAxMjU4IDhDMUMxQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYngsMVwpCi0gODkyIDEyNWIgOEMxQzFCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVieCwxXCkKLSA4OTMgMTI1ZSAzRThDMUMxQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJ4LDFcKQotIDg5NCAxMjYyIDhDMUMxRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVieCwxXCkKLSA4OTUgMTI2OSA4QzFDMUUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJ4LDFcKQotIDg5NiAxMjZjIDhDMUMxRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYngsMVwpCi0gODk3IDEyNmYgOEMxOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsMVwpCi0gODk4IDEyNzEgOEMxOSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsMVwpCi0gODk5IDEyNzMgOEMxQSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsMVwpCi0gOTAwIDEyNzUgOEMxQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsMVwpCi0gOTAxIDEyNzcgM0U4QzFDMjQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsMVwpCi0gOTAyIDEyN2IgOEMxRDAwMDAgMDAwMCAgICAgCQltb3YJJWRzLCVkczpcKCwxXCkKLSA5MDMgMTI4MSA4QzFFICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwxXCkKLSA5MDQgMTI4MyA4QzFGICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwxXCkKLSA5MDUgMTI4NSA4QzFDMjggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWJwLDFcKQotIDkwNiAxMjg4IDhDMUMyOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYnAsMVwpCi0gOTA3IDEyOGIgOEMxQzJBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVicCwxXCkKLSA5MDggMTI4ZSA4QzFDMkIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWJwLDFcKQotIDkwOSAxMjkxIDNFOEMxQzJDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYnAsMVwpCi0gOTEwIDEyOTUgOEMxQzJEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWJwLDFcKQotIDkxMSAxMjljIDhDMUMyRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYnAsMVwpCi0gOTEyIDEyOWYgOEMxQzJGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVicCwxXCkKLSA5MTMgMTJhMiA4QzFDMzAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZXNpLDFcKQotIDkxNCAxMmE1IDhDMUMzMSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlc2ksMVwpCi0gOTE1IDEyYTggOEMxQzMyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVzaSwxXCkKLSA5MTYgMTJhYiA4QzFDMzMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZXNpLDFcKQotIDkxNyAxMmFlIDNFOEMxQzM0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlc2ksMVwpCi0gOTE4IDEyYjIgOEMxQzM1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZXNpLDFcKQotIDkxOSAxMmI5IDhDMUMzNiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlc2ksMVwpCi0gOTIwIDEyYmMgOEMxQzM3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVzaSwxXCkKLSA5MjEgMTJiZiA4QzFDMzggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWRpLDFcKQotIDkyMiAxMmMyIDhDMUMzOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlZGksMVwpCi0gOTIzIDEyYzUgOEMxQzNBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVkaSwxXCkKLSA5MjQgMTJjOCA4QzFDM0IgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWRpLDFcKQotIDkyNSAxMmNiIDNFOEMxQzNDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlZGksMVwpCi0gOTI2IDEyY2YgOEMxQzNEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWRpLDFcKQotIDkyNyAxMmQ2IDhDMUMzRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlZGksMVwpCi0gOTI4IDEyZDkgOEMxQzNGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVkaSwxXCkKLSA5MjkgMTJkYyA4QzFDNDAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWF4LDJcKQotIDkzMCAxMmRmIDhDMUM0MSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYXgsMlwpCi0gOTMxIDEyZTIgOEMxQzQyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVheCwyXCkKLSA5MzIgMTJlNSA4QzFDNDMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWF4LDJcKQotIDkzMyAxMmU4IDNFOEMxQzQ0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYXgsMlwpCi0gOTM0IDEyZWMgOEMxQzQ1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWF4LDJcKQotIDkzNSAxMmYzIDhDMUM0NiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYXgsMlwpCi0gOTM2IDEyZjYgOEMxQzQ3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVheCwyXCkKLSA5MzcgMTJmOSA4QzFDNDggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWN4LDJcKQotIDkzOCAxMmZjIDhDMUM0OSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlY3gsMlwpCi0gOTM5IDEyZmYgOEMxQzRBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVjeCwyXCkKLSA5NDAgMTMwMiA4QzFDNEIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWN4LDJcKQotIDk0MSAxMzA1IDNFOEMxQzRDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlY3gsMlwpCi0gOTQyIDEzMDkgOEMxQzREMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWN4LDJcKQotIDk0MyAxMzEwIDhDMUM0RSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlY3gsMlwpCi0gOTQ0IDEzMTMgOEMxQzRGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVjeCwyXCkKLSA5NDUgMTMxNiA4QzFDNTAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWR4LDJcKQotIDk0NiAxMzE5IDhDMUM1MSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlZHgsMlwpCi0gOTQ3IDEzMWMgOEMxQzUyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVkeCwyXCkKLSA5NDggMTMxZiA4QzFDNTMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWR4LDJcKQotIDk0OSAxMzIyIDNFOEMxQzU0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlZHgsMlwpCi0gOTUwIDEzMjYgOEMxQzU1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWR4LDJcKQotIDk1MSAxMzJkIDhDMUM1NiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlZHgsMlwpCi0gOTUyIDEzMzAgOEMxQzU3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVkeCwyXCkKLSA5NTMgMTMzMyA4QzFDNTggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWJ4LDJcKQotIDk1NCAxMzM2IDhDMUM1OSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYngsMlwpCi0gOTU1IDEzMzkgOEMxQzVBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVieCwyXCkKLSA5NTYgMTMzYyA4QzFDNUIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWJ4LDJcKQotIDk1NyAxMzNmIDNFOEMxQzVDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYngsMlwpCi0gOTU4IDEzNDMgOEMxQzVEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWJ4LDJcKQotIDk1OSAxMzRhIDhDMUM1RSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYngsMlwpCi0gOTYwIDEzNGQgOEMxQzVGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVieCwyXCkKLSA5NjEgMTM1MCA4QzE4ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwyXCkKLS4qV2FybmluZzouKgotIDk2MiAxMzUyIDhDMTkgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LDJcKQotLipXYXJuaW5nOi4qCi0gOTYzIDEzNTQgOEMxQSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsMlwpCi0uKldhcm5pbmc6LioKLSA5NjQgMTM1NiA4QzFCICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwyXCkKLS4qV2FybmluZzouKgotIDk2NSAxMzU4IDNFOEMxQzI0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLDJcKQotLipXYXJuaW5nOi4qCi0gOTY2IDEzNWMgOEMxRDAwMDAgMDAwMCAgICAgCQltb3YJJWRzLCVkczpcKCwyXCkKLS4qV2FybmluZzouKgotIDk2NyAxMzYyIDhDMUUgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLDJcKQotLipXYXJuaW5nOi4qCi0gOTY4IDEzNjQgOEMxRiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksMlwpCi0uKldhcm5pbmc6LioKLSA5NjkgMTM2NiA4QzFDNjggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWJwLDJcKQotIDk3MCAxMzY5IDhDMUM2OSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYnAsMlwpCi0gOTcxIDEzNmMgOEMxQzZBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVicCwyXCkKLSA5NzIgMTM2ZiA4QzFDNkIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWJwLDJcKQotIDk3MyAxMzcyIDNFOEMxQzZDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYnAsMlwpCi0gOTc0IDEzNzYgOEMxQzZEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWJwLDJcKQotIDk3NSAxMzdkIDhDMUM2RSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYnAsMlwpCi0gOTc2IDEzODAgOEMxQzZGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVicCwyXCkKLSA5NzcgMTM4MyA4QzFDNzAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZXNpLDJcKQotIDk3OCAxMzg2IDhDMUM3MSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlc2ksMlwpCi0gOTc5IDEzODkgOEMxQzcyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVzaSwyXCkKLSA5ODAgMTM4YyA4QzFDNzMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZXNpLDJcKQotIDk4MSAxMzhmIDNFOEMxQzc0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlc2ksMlwpCi0gOTgyIDEzOTMgOEMxQzc1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZXNpLDJcKQotIDk4MyAxMzlhIDhDMUM3NiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlc2ksMlwpCi0gOTg0IDEzOWQgOEMxQzc3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVzaSwyXCkKLSA5ODUgMTNhMCA4QzFDNzggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWRpLDJcKQotIDk4NiAxM2EzIDhDMUM3OSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlZGksMlwpCi0gOTg3IDEzYTYgOEMxQzdBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVkaSwyXCkKLSA5ODggMTNhOSA4QzFDN0IgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWRpLDJcKQotIDk4OSAxM2FjIDNFOEMxQzdDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlZGksMlwpCi0gOTkwIDEzYjAgOEMxQzdEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWRpLDJcKQotIDk5MSAxM2I3IDhDMUM3RSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlZGksMlwpCi0gOTkyIDEzYmEgOEMxQzdGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVkaSwyXCkKLSA5OTMgMTNiZCA4QzFDODAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWF4LDRcKQotIDk5NCAxM2MwIDhDMUM4MSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYXgsNFwpCi0gOTk1IDEzYzMgOEMxQzgyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVheCw0XCkKLSA5OTYgMTNjNiA4QzFDODMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWF4LDRcKQotIDk5NyAxM2M5IDNFOEMxQzg0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYXgsNFwpCi0gOTk4IDEzY2QgOEMxQzg1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWF4LDRcKQotIDk5OSAxM2Q0IDhDMUM4NiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYXgsNFwpCi0gMTAwMCAxM2Q3IDhDMUM4NyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYXgsNFwpCi0gMTAwMSAxM2RhIDhDMUM4OCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlY3gsNFwpCi0gMTAwMiAxM2RkIDhDMUM4OSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlY3gsNFwpCi0gMTAwMyAxM2UwIDhDMUM4QSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlY3gsNFwpCi0gMTAwNCAxM2UzIDhDMUM4QiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlY3gsNFwpCi0gMTAwNSAxM2U2IDNFOEMxQzhDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlY3gsNFwpCi0gMTAwNiAxM2VhIDhDMUM4RDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVjeCw0XCkKLSAxMDA3IDEzZjEgOEMxQzhFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVjeCw0XCkKLSAxMDA4IDEzZjQgOEMxQzhGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVjeCw0XCkKLSAxMDA5IDEzZjcgOEMxQzkwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkeCw0XCkKLSAxMDEwIDEzZmEgOEMxQzkxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkeCw0XCkKLSAxMDExIDEzZmQgOEMxQzkyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVkeCw0XCkKLSAxMDEyIDE0MDAgOEMxQzkzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkeCw0XCkKLSAxMDEzIDE0MDMgM0U4QzFDOTQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkeCw0XCkKLSAxMDE0IDE0MDcgOEMxQzk1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWR4LDRcKQotIDEwMTUgMTQwZSA4QzFDOTYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWR4LDRcKQotIDEwMTYgMTQxMSA4QzFDOTcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWR4LDRcKQotIDEwMTcgMTQxNCA4QzFDOTggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWJ4LDRcKQotIDEwMTggMTQxNyA4QzFDOTkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJ4LDRcKQotIDEwMTkgMTQxYSA4QzFDOUEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJ4LDRcKQotIDEwMjAgMTQxZCA4QzFDOUIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWJ4LDRcKQotIDEwMjEgMTQyMCAzRThDMUM5QyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJ4LDRcKQotIDEwMjIgMTQyNCA4QzFDOUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYngsNFwpCi0gMTAyMyAxNDJiIDhDMUM5RSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYngsNFwpCi0gMTAyNCAxNDJlIDhDMUM5RiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYngsNFwpCi0gMTAyNSAxNDMxIDhDMTggICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LDRcKQotLipXYXJuaW5nOi4qCi0gMTAyNiAxNDMzIDhDMTkgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LDRcKQotLipXYXJuaW5nOi4qCi0gMTAyNyAxNDM1IDhDMUEgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LDRcKQotLipXYXJuaW5nOi4qCi0gMTAyOCAxNDM3IDhDMUIgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LDRcKQotLipXYXJuaW5nOi4qCi0gMTAyOSAxNDM5IDNFOEMxQzI0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLDRcKQotLipXYXJuaW5nOi4qCi0gMTAzMCAxNDNkIDhDMUQwMDAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6XCgsNFwpCi0uKldhcm5pbmc6LioKLSAxMDMxIDE0NDMgOEMxRSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksNFwpCi0uKldhcm5pbmc6LioKLSAxMDMyIDE0NDUgOEMxRiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksNFwpCi0uKldhcm5pbmc6LioKLSAxMDMzIDE0NDcgOEMxQ0E4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVicCw0XCkKLSAxMDM0IDE0NGEgOEMxQ0E5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVicCw0XCkKLSAxMDM1IDE0NGQgOEMxQ0FBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVicCw0XCkKLSAxMDM2IDE0NTAgOEMxQ0FCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVicCw0XCkKLSAxMDM3IDE0NTMgM0U4QzFDQUMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVicCw0XCkKLSAxMDM4IDE0NTcgOEMxQ0FEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWJwLDRcKQotIDEwMzkgMTQ1ZSA4QzFDQUUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJwLDRcKQotIDEwNDAgMTQ2MSA4QzFDQUYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJwLDRcKQotIDEwNDEgMTQ2NCA4QzFDQjAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZXNpLDRcKQotIDEwNDIgMTQ2NyA4QzFDQjEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZXNpLDRcKQotIDEwNDMgMTQ2YSA4QzFDQjIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZXNpLDRcKQotIDEwNDQgMTQ2ZCA4QzFDQjMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZXNpLDRcKQotIDEwNDUgMTQ3MCAzRThDMUNCNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZXNpLDRcKQotIDEwNDYgMTQ3NCA4QzFDQjUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlc2ksNFwpCi0gMTA0NyAxNDdiIDhDMUNCNiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlc2ksNFwpCi0gMTA0OCAxNDdlIDhDMUNCNyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlc2ksNFwpCi0gMTA0OSAxNDgxIDhDMUNCOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZGksNFwpCi0gMTA1MCAxNDg0IDhDMUNCOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlZGksNFwpCi0gMTA1MSAxNDg3IDhDMUNCQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZGksNFwpCi0gMTA1MiAxNDhhIDhDMUNCQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZGksNFwpCi0gMTA1MyAxNDhkIDNFOEMxQ0JDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlZGksNFwpCi0gMTA1NCAxNDkxIDhDMUNCRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkaSw0XCkKLSAxMDU1IDE0OTggOEMxQ0JFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkaSw0XCkKLSAxMDU2IDE0OWIgOEMxQ0JGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVkaSw0XCkKLSAxMDU3IDE0OWUgOEMxQ0MwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVheCw4XCkKLSAxMDU4IDE0YTEgOEMxQ0MxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVheCw4XCkKLSAxMDU5IDE0YTQgOEMxQ0MyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVheCw4XCkKLSAxMDYwIDE0YTcgOEMxQ0MzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVheCw4XCkKLSAxMDYxIDE0YWEgM0U4QzFDQzQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVheCw4XCkKLSAxMDYyIDE0YWUgOEMxQ0M1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWF4LDhcKQotIDEwNjMgMTRiNSA4QzFDQzYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWF4LDhcKQotIDEwNjQgMTRiOCA4QzFDQzcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWF4LDhcKQotIDEwNjUgMTRiYiA4QzFDQzggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWN4LDhcKQotIDEwNjYgMTRiZSA4QzFDQzkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWN4LDhcKQotIDEwNjcgMTRjMSA4QzFDQ0EgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWN4LDhcKQotIDEwNjggMTRjNCA4QzFDQ0IgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWN4LDhcKQotIDEwNjkgMTRjNyAzRThDMUNDQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWN4LDhcKQotIDEwNzAgMTRjYiA4QzFDQ0QwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlY3gsOFwpCi0gMTA3MSAxNGQyIDhDMUNDRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlY3gsOFwpCi0gMTA3MiAxNGQ1IDhDMUNDRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlY3gsOFwpCi0gMTA3MyAxNGQ4IDhDMUNEMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZHgsOFwpCi0gMTA3NCAxNGRiIDhDMUNEMSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlZHgsOFwpCi0gMTA3NSAxNGRlIDhDMUNEMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZHgsOFwpCi0gMTA3NiAxNGUxIDhDMUNEMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZHgsOFwpCi0gMTA3NyAxNGU0IDNFOEMxQ0Q0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlZHgsOFwpCi0gMTA3OCAxNGU4IDhDMUNENTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkeCw4XCkKLSAxMDc5IDE0ZWYgOEMxQ0Q2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkeCw4XCkKLSAxMDgwIDE0ZjIgOEMxQ0Q3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVkeCw4XCkKLSAxMDgxIDE0ZjUgOEMxQ0Q4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVieCw4XCkKLSAxMDgyIDE0ZjggOEMxQ0Q5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVieCw4XCkKLSAxMDgzIDE0ZmIgOEMxQ0RBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVieCw4XCkKLSAxMDg0IDE0ZmUgOEMxQ0RCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVieCw4XCkKLSAxMDg1IDE1MDEgM0U4QzFDREMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVieCw4XCkKLSAxMDg2IDE1MDUgOEMxQ0REMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWJ4LDhcKQotIDEwODcgMTUwYyA4QzFDREUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJ4LDhcKQotIDEwODggMTUwZiA4QzFDREYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJ4LDhcKQotIDEwODkgMTUxMiA4QzE4ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCw4XCkKLS4qV2FybmluZzouKgotIDEwOTAgMTUxNCA4QzE5ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCw4XCkKLS4qV2FybmluZzouKgotIDEwOTEgMTUxNiA4QzFBICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCw4XCkKLS4qV2FybmluZzouKgotIDEwOTIgMTUxOCA4QzFCICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCw4XCkKLS4qV2FybmluZzouKgotIDEwOTMgMTUxYSAzRThDMUMyNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCw4XCkKLS4qV2FybmluZzouKgotIDEwOTQgMTUxZSA4QzFEMDAwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOlwoLDhcKQotLipXYXJuaW5nOi4qCi0gMTA5NSAxNTI0IDhDMUUgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLDhcKQotLipXYXJuaW5nOi4qCi0gMTA5NiAxNTI2IDhDMUYgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLDhcKQotLipXYXJuaW5nOi4qCi0gMTA5NyAxNTI4IDhDMUNFOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYnAsOFwpCi0gMTA5OCAxNTJiIDhDMUNFOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYnAsOFwpCi0gMTA5OSAxNTJlIDhDMUNFQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYnAsOFwpCi0gMTEwMCAxNTMxIDhDMUNFQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYnAsOFwpCi0gMTEwMSAxNTM0IDNFOEMxQ0VDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYnAsOFwpCi0gMTEwMiAxNTM4IDhDMUNFRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVicCw4XCkKLSAxMTAzIDE1M2YgOEMxQ0VFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVicCw4XCkKLSAxMTA0IDE1NDIgOEMxQ0VGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVicCw4XCkKLSAxMTA1IDE1NDUgOEMxQ0YwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVzaSw4XCkKLSAxMTA2IDE1NDggOEMxQ0YxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVzaSw4XCkKLSAxMTA3IDE1NGIgOEMxQ0YyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVzaSw4XCkKLSAxMTA4IDE1NGUgOEMxQ0YzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVzaSw4XCkKLSAxMTA5IDE1NTEgM0U4QzFDRjQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVzaSw4XCkKLSAxMTEwIDE1NTUgOEMxQ0Y1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZXNpLDhcKQotIDExMTEgMTU1YyA4QzFDRjYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZXNpLDhcKQotIDExMTIgMTU1ZiA4QzFDRjcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZXNpLDhcKQotIDExMTMgMTU2MiA4QzFDRjggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWRpLDhcKQotIDExMTQgMTU2NSA4QzFDRkEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWRpLDhcKQotIDExMTUgMTU2OCA4QzFDRjkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWRpLDhcKQotIDExMTYgMTU2YiA4QzFDRkIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWRpLDhcKQotIDExMTcgMTU2ZSAzRThDMUNGQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWRpLDhcKQotIDExMTggMTU3MiA4QzFDRkQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZGksOFwpCi0gMTExOSAxNTc5IDhDMUNGRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlZGksOFwpCi0gMTEyMCAxNTdjIDhDMUNGRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZGksOFwpCi0gMTEyMSAxNTdmIDhDNUMwMDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWF4LDFcKQotIDExMjIgMTU4MyA4QzVDMDExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVheCwxXCkKLSAxMTIzIDE1ODcgOEM1QzAyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYXgsMVwpCi0gMTEyNCAxNThiIDhDNUMwMzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWF4LDFcKQotIDExMjUgMTU4ZiAzRThDNUMwNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVheCwxXCkKLSAxMTI2IDE1OTQgM0U4QzVDMDUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYXgsMVwpCi0gMTEyNyAxNTk5IDhDNUMwNjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWF4LDFcKQotIDExMjggMTU5ZCA4QzVDMDcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVheCwxXCkKLSAxMTI5IDE1YTEgOEM1QzA4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlY3gsMVwpCi0gMTEzMCAxNWE1IDhDNUMwOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWN4LDFcKQotIDExMzEgMTVhOSA4QzVDMEExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVjeCwxXCkKLSAxMTMyIDE1YWQgOEM1QzBCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlY3gsMVwpCi0gMTEzMyAxNWIxIDNFOEM1QzBDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWN4LDFcKQotIDExMzQgMTViNiAzRThDNUMwRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVjeCwxXCkKLSAxMTM1IDE1YmIgOEM1QzBFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlY3gsMVwpCi0gMTEzNiAxNWJmIDhDNUMwRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWN4LDFcKQotIDExMzcgMTVjMyA4QzVDMTAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVkeCwxXCkKLSAxMTM4IDE1YzcgOEM1QzExMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZHgsMVwpCi0gMTEzOSAxNWNiIDhDNUMxMjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWR4LDFcKQotIDExNDAgMTVjZiA4QzVDMTMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVkeCwxXCkKLSAxMTQxIDE1ZDMgM0U4QzVDMTQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlZHgsMVwpCi0gMTE0MiAxNWQ4IDNFOEM1QzE1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWR4LDFcKQotIDExNDMgMTVkZCA4QzVDMTYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVkeCwxXCkKLSAxMTQ0IDE1ZTEgOEM1QzE3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlZHgsMVwpCi0gMTE0NSAxNWU1IDhDNUMxODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWJ4LDFcKQotIDExNDYgMTVlOSA4QzVDMTkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVieCwxXCkKLSAxMTQ3IDE1ZWQgOEM1QzFBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYngsMVwpCi0gMTE0OCAxNWYxIDhDNUMxQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWJ4LDFcKQotIDExNDkgMTVmNSAzRThDNUMxQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVieCwxXCkKLSAxMTUwIDE1ZmEgM0U4QzVDMUQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYngsMVwpCi0gMTE1MSAxNWZmIDhDNUMxRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWJ4LDFcKQotIDExNTIgMTYwMyA4QzVDMUYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVieCwxXCkKLSAxMTUzIDE2MDcgOEM1ODEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LDFcKQotIDExNTQgMTYwYSA4QzU5MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsMVwpCi0gMTE1NSAxNjBkIDhDNUExMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwxXCkKLSAxMTU2IDE2MTAgOEM1QjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LDFcKQotIDExNTcgMTYxMyAzRThDNUMyNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsMVwpCi0gMTE1OCAxNjE4IDNFOEM1RDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwxXCkKLSAxMTU5IDE2MWMgOEM1RTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLDFcKQotIDExNjAgMTYxZiA4QzVGMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksMVwpCi0gMTE2MSAxNjIyIDhDNUMyODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWJwLDFcKQotIDExNjIgMTYyNiA4QzVDMjkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVicCwxXCkKLSAxMTYzIDE2MmEgOEM1QzJBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYnAsMVwpCi0gMTE2NCAxNjJlIDhDNUMyQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWJwLDFcKQotIDExNjUgMTYzMiAzRThDNUMyQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVicCwxXCkKLSAxMTY2IDE2MzcgM0U4QzVDMkQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYnAsMVwpCi0gMTE2NyAxNjNjIDhDNUMyRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWJwLDFcKQotIDExNjggMTY0MCA4QzVDMkYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVicCwxXCkKLSAxMTY5IDE2NDQgOEM1QzMwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlc2ksMVwpCi0gMTE3MCAxNjQ4IDhDNUMzMTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZXNpLDFcKQotIDExNzEgMTY0YyA4QzVDMzIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVzaSwxXCkKLSAxMTcyIDE2NTAgOEM1QzMzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlc2ksMVwpCi0gMTE3MyAxNjU0IDNFOEM1QzM0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZXNpLDFcKQotIDExNzQgMTY1OSAzRThDNUMzNSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVzaSwxXCkKLSAxMTc1IDE2NWUgOEM1QzM2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlc2ksMVwpCi0gMTE3NiAxNjYyIDhDNUMzNzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZXNpLDFcKQotIDExNzcgMTY2NiA4QzVDMzgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVkaSwxXCkKLSAxMTc4IDE2NmEgOEM1QzM5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZGksMVwpCi0gMTE3OSAxNjZlIDhDNUMzQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWRpLDFcKQotIDExODAgMTY3MiA4QzVDM0IxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVkaSwxXCkKLSAxMTgxIDE2NzYgM0U4QzVDM0MgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlZGksMVwpCi0gMTE4MiAxNjdiIDNFOEM1QzNEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWRpLDFcKQotIDExODMgMTY4MCA4QzVDM0UxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVkaSwxXCkKLSAxMTg0IDE2ODQgOEM1QzNGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlZGksMVwpCi0gMTE4NSAxNjg4IDhDNUM0MDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWF4LDJcKQotIDExODYgMTY4YyA4QzVDNDExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVheCwyXCkKLSAxMTg3IDE2OTAgOEM1QzQyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYXgsMlwpCi0gMTE4OCAxNjk0IDhDNUM0MzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWF4LDJcKQotIDExODkgMTY5OCAzRThDNUM0NCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVheCwyXCkKLSAxMTkwIDE2OWQgM0U4QzVDNDUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYXgsMlwpCi0gMTE5MSAxNmEyIDhDNUM0NjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWF4LDJcKQotIDExOTIgMTZhNiA4QzVDNDcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVheCwyXCkKLSAxMTkzIDE2YWEgOEM1QzQ4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlY3gsMlwpCi0gMTE5NCAxNmFlIDhDNUM0OTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWN4LDJcKQotIDExOTUgMTZiMiA4QzVDNEExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVjeCwyXCkKLSAxMTk2IDE2YjYgOEM1QzRCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlY3gsMlwpCi0gMTE5NyAxNmJhIDNFOEM1QzRDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWN4LDJcKQotIDExOTggMTZiZiAzRThDNUM0RCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVjeCwyXCkKLSAxMTk5IDE2YzQgOEM1QzRFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlY3gsMlwpCi0gMTIwMCAxNmM4IDhDNUM0RjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWN4LDJcKQotIDEyMDEgMTZjYyA4QzVDNTAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVkeCwyXCkKLSAxMjAyIDE2ZDAgOEM1QzUxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZHgsMlwpCi0gMTIwMyAxNmQ0IDhDNUM1MjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWR4LDJcKQotIDEyMDQgMTZkOCA4QzVDNTMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVkeCwyXCkKLSAxMjA1IDE2ZGMgM0U4QzVDNTQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlZHgsMlwpCi0gMTIwNiAxNmUxIDNFOEM1QzU1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWR4LDJcKQotIDEyMDcgMTZlNiA4QzVDNTYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVkeCwyXCkKLSAxMjA4IDE2ZWEgOEM1QzU3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlZHgsMlwpCi0gMTIwOSAxNmVlIDhDNUM1ODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWJ4LDJcKQotIDEyMTAgMTZmMiA4QzVDNTkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVieCwyXCkKLSAxMjExIDE2ZjYgOEM1QzVBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYngsMlwpCi0gMTIxMiAxNmZhIDhDNUM1QjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWJ4LDJcKQotIDEyMTMgMTZmZSAzRThDNUM1QyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVieCwyXCkKLSAxMjE0IDE3MDMgM0U4QzVDNUQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYngsMlwpCi0gMTIxNSAxNzA4IDhDNUM1RTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWJ4LDJcKQotIDEyMTYgMTcwYyA4QzVDNUYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVieCwyXCkKLSAxMjE3IDE3MTAgOEM1ODEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LDJcKQotLipXYXJuaW5nOi4qCi0gMTIxOCAxNzEzIDhDNTkxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwyXCkKLS4qV2FybmluZzouKgotIDEyMTkgMTcxNiA4QzVBMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsMlwpCi0uKldhcm5pbmc6LioKLSAxMjIwIDE3MTkgOEM1QjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LDJcKQotLipXYXJuaW5nOi4qCi0gMTIyMSAxNzFjIDNFOEM1QzI0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwyXCkKLS4qV2FybmluZzouKgotIDEyMjIgMTcyMSAzRThDNUQxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsMlwpCi0uKldhcm5pbmc6LioKLSAxMjIzIDE3MjUgOEM1RTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLDJcKQotLipXYXJuaW5nOi4qCi0gMTIyNCAxNzI4IDhDNUYxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwyXCkKLS4qV2FybmluZzouKgotIDEyMjUgMTcyYiA4QzVDNjgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVicCwyXCkKLSAxMjI2IDE3MmYgOEM1QzY5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYnAsMlwpCi0gMTIyNyAxNzMzIDhDNUM2QTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJwLDJcKQotIDEyMjggMTczNyA4QzVDNkIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVicCwyXCkKLSAxMjI5IDE3M2IgM0U4QzVDNkMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYnAsMlwpCi0gMTIzMCAxNzQwIDNFOEM1QzZEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJwLDJcKQotIDEyMzEgMTc0NSA4QzVDNkUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVicCwyXCkKLSAxMjMyIDE3NDkgOEM1QzZGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYnAsMlwpCi0gMTIzMyAxNzRkIDhDNUM3MDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZXNpLDJcKQotIDEyMzQgMTc1MSA4QzVDNzExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVzaSwyXCkKLSAxMjM1IDE3NTUgOEM1QzcyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlc2ksMlwpCi0gMTIzNiAxNzU5IDhDNUM3MzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZXNpLDJcKQotIDEyMzcgMTc1ZCAzRThDNUM3NCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVzaSwyXCkKLSAxMjM4IDE3NjIgM0U4QzVDNzUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlc2ksMlwpCi0gMTIzOSAxNzY3IDhDNUM3NjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZXNpLDJcKQotIDEyNDAgMTc2YiA4QzVDNzcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVzaSwyXCkKLSAxMjQxIDE3NmYgOEM1Qzc4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZGksMlwpCi0gMTI0MiAxNzczIDhDNUM3OTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWRpLDJcKQotIDEyNDMgMTc3NyA4QzVDN0ExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkaSwyXCkKLSAxMjQ0IDE3N2IgOEM1QzdCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZGksMlwpCi0gMTI0NSAxNzdmIDNFOEM1QzdDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWRpLDJcKQotIDEyNDYgMTc4NCAzRThDNUM3RCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkaSwyXCkKLSAxMjQ3IDE3ODkgOEM1QzdFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZGksMlwpCi0gMTI0OCAxNzhkIDhDNUM3RjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWRpLDJcKQotIDEyNDkgMTc5MSA4QzVDODAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVheCw0XCkKLSAxMjUwIDE3OTUgOEM1QzgxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYXgsNFwpCi0gMTI1MSAxNzk5IDhDNUM4MjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWF4LDRcKQotIDEyNTIgMTc5ZCA4QzVDODMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVheCw0XCkKLSAxMjUzIDE3YTEgM0U4QzVDODQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYXgsNFwpCi0gMTI1NCAxN2E2IDNFOEM1Qzg1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWF4LDRcKQotIDEyNTUgMTdhYiA4QzVDODYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVheCw0XCkKLSAxMjU2IDE3YWYgOEM1Qzg3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYXgsNFwpCi0gMTI1NyAxN2IzIDhDNUM4ODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWN4LDRcKQotIDEyNTggMTdiNyA4QzVDODkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVjeCw0XCkKLSAxMjU5IDE3YmIgOEM1QzhBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlY3gsNFwpCi0gMTI2MCAxN2JmIDhDNUM4QjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWN4LDRcKQotIDEyNjEgMTdjMyAzRThDNUM4QyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVjeCw0XCkKLSAxMjYyIDE3YzggM0U4QzVDOEQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlY3gsNFwpCi0gMTI2MyAxN2NkIDhDNUM4RTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWN4LDRcKQotIDEyNjQgMTdkMSA4QzVDOEYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVjeCw0XCkKLSAxMjY1IDE3ZDUgOEM1QzkwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZHgsNFwpCi0gMTI2NiAxN2Q5IDhDNUM5MTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWR4LDRcKQotIDEyNjcgMTdkZCA4QzVDOTIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkeCw0XCkKLSAxMjY4IDE3ZTEgOEM1QzkzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZHgsNFwpCi0gMTI2OSAxN2U1IDNFOEM1Qzk0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWR4LDRcKQotIDEyNzAgMTdlYSAzRThDNUM5NSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkeCw0XCkKLSAxMjcxIDE3ZWYgOEM1Qzk2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZHgsNFwpCi0gMTI3MiAxN2YzIDhDNUM5NzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWR4LDRcKQotIDEyNzMgMTdmNyA4QzVDOTgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVieCw0XCkKLSAxMjc0IDE3ZmIgOEM1Qzk5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYngsNFwpCi0gMTI3NSAxN2ZmIDhDNUM5QTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJ4LDRcKQotIDEyNzYgMTgwMyA4QzVDOUIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVieCw0XCkKLSAxMjc3IDE4MDcgM0U4QzVDOUMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYngsNFwpCi0gMTI3OCAxODBjIDNFOEM1QzlEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJ4LDRcKQotIDEyNzkgMTgxMSA4QzVDOUUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVieCw0XCkKLSAxMjgwIDE4MTUgOEM1QzlGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYngsNFwpCi0gMTI4MSAxODE5IDhDNTgxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCw0XCkKLS4qV2FybmluZzouKgotIDEyODIgMTgxYyA4QzU5MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsNFwpCi0uKldhcm5pbmc6LioKLSAxMjgzIDE4MWYgOEM1QTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LDRcKQotLipXYXJuaW5nOi4qCi0gMTI4NCAxODIyIDhDNUIxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCw0XCkKLS4qV2FybmluZzouKgotIDEyODUgMTgyNSAzRThDNUMyNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsNFwpCi0uKldhcm5pbmc6LioKLSAxMjg2IDE4MmEgM0U4QzVEMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLDRcKQotLipXYXJuaW5nOi4qCi0gMTI4NyAxODJlIDhDNUUxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSw0XCkKLS4qV2FybmluZzouKgotIDEyODggMTgzMSA4QzVGMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksNFwpCi0uKldhcm5pbmc6LioKLSAxMjg5IDE4MzQgOEM1Q0E4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYnAsNFwpCi0gMTI5MCAxODM4IDhDNUNBOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJwLDRcKQotIDEyOTEgMTgzYyA4QzVDQUExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVicCw0XCkKLSAxMjkyIDE4NDAgOEM1Q0FCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYnAsNFwpCi0gMTI5MyAxODQ0IDNFOEM1Q0FDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJwLDRcKQotIDEyOTQgMTg0OSAzRThDNUNBRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVicCw0XCkKLSAxMjk1IDE4NGUgOEM1Q0FFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYnAsNFwpCi0gMTI5NiAxODUyIDhDNUNBRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJwLDRcKQotIDEyOTcgMTg1NiA4QzVDQjAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVzaSw0XCkKLSAxMjk4IDE4NWEgOEM1Q0IxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlc2ksNFwpCi0gMTI5OSAxODVlIDhDNUNCMjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZXNpLDRcKQotIDEzMDAgMTg2MiA4QzVDQjMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVzaSw0XCkKLSAxMzAxIDE4NjYgM0U4QzVDQjQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlc2ksNFwpCi0gMTMwMiAxODZiIDNFOEM1Q0I1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZXNpLDRcKQotIDEzMDMgMTg3MCA4QzVDQjYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVzaSw0XCkKLSAxMzA0IDE4NzQgOEM1Q0I3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlc2ksNFwpCi0gMTMwNSAxODc4IDhDNUNCODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWRpLDRcKQotIDEzMDYgMTg3YyA4QzVDQjkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkaSw0XCkKLSAxMzA3IDE4ODAgOEM1Q0JBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZGksNFwpCi0gMTMwOCAxODg0IDhDNUNCQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWRpLDRcKQotIDEzMDkgMTg4OCAzRThDNUNCQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkaSw0XCkKLSAxMzEwIDE4OGQgM0U4QzVDQkQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZGksNFwpCi0gMTMxMSAxODkyIDhDNUNCRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWRpLDRcKQotIDEzMTIgMTg5NiA4QzVDQkYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkaSw0XCkKLSAxMzEzIDE4OWEgOEM1Q0MwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYXgsOFwpCi0gMTMxNCAxODllIDhDNUNDMTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWF4LDhcKQotIDEzMTUgMThhMiA4QzVDQzIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVheCw4XCkKLSAxMzE2IDE4YTYgOEM1Q0MzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYXgsOFwpCi0gMTMxNyAxOGFhIDNFOEM1Q0M0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWF4LDhcKQotIDEzMTggMThhZiAzRThDNUNDNSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVheCw4XCkKLSAxMzE5IDE4YjQgOEM1Q0M2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYXgsOFwpCi0gMTMyMCAxOGI4IDhDNUNDNzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWF4LDhcKQotIDEzMjEgMThiYyA4QzVDQzgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVjeCw4XCkKLSAxMzIyIDE4YzAgOEM1Q0M5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlY3gsOFwpCi0gMTMyMyAxOGM0IDhDNUNDQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWN4LDhcKQotIDEzMjQgMThjOCA4QzVDQ0IxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVjeCw4XCkKLSAxMzI1IDE4Y2MgM0U4QzVDQ0MgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlY3gsOFwpCi0gMTMyNiAxOGQxIDNFOEM1Q0NEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWN4LDhcKQotIDEzMjcgMThkNiA4QzVDQ0UxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVjeCw4XCkKLSAxMzI4IDE4ZGEgOEM1Q0NGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlY3gsOFwpCi0gMTMyOSAxOGRlIDhDNUNEMDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWR4LDhcKQotIDEzMzAgMThlMiA4QzVDRDExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkeCw4XCkKLSAxMzMxIDE4ZTYgOEM1Q0QyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZHgsOFwpCi0gMTMzMiAxOGVhIDhDNUNEMzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWR4LDhcKQotIDEzMzMgMThlZSAzRThDNUNENCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkeCw4XCkKLSAxMzM0IDE4ZjMgM0U4QzVDRDUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZHgsOFwpCi0gMTMzNSAxOGY4IDhDNUNENjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWR4LDhcKQotIDEzMzYgMThmYyA4QzVDRDcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkeCw4XCkKLSAxMzM3IDE5MDAgOEM1Q0Q4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYngsOFwpCi0gMTMzOCAxOTA0IDhDNUNEOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJ4LDhcKQotIDEzMzkgMTkwOCA4QzVDREExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVieCw4XCkKLSAxMzQwIDE5MGMgOEM1Q0RCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYngsOFwpCi0gMTM0MSAxOTEwIDNFOEM1Q0RDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJ4LDhcKQotIDEzNDIgMTkxNSAzRThDNUNERCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVieCw4XCkKLSAxMzQzIDE5MWEgOEM1Q0RFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYngsOFwpCi0gMTM0NCAxOTFlIDhDNUNERjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJ4LDhcKQotIDEzNDUgMTkyMiA4QzU4MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsOFwpCi0uKldhcm5pbmc6LioKLSAxMzQ2IDE5MjUgOEM1OTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LDhcKQotLipXYXJuaW5nOi4qCi0gMTM0NyAxOTI4IDhDNUExMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCw4XCkKLS4qV2FybmluZzouKgotIDEzNDggMTkyYiA4QzVCMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsOFwpCi0uKldhcm5pbmc6LioKLSAxMzQ5IDE5MmUgM0U4QzVDMjQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLDhcKQotLipXYXJuaW5nOi4qCi0gMTM1MCAxOTMzIDNFOEM1RDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCw4XCkKLS4qV2FybmluZzouKgotIDEzNTEgMTkzNyA4QzVFMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksOFwpCi0uKldhcm5pbmc6LioKLSAxMzUyIDE5M2EgOEM1RjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLDhcKQotLipXYXJuaW5nOi4qCi0gMTM1MyAxOTNkIDhDNUNFODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWJwLDhcKQotIDEzNTQgMTk0MSA4QzVDRTkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVicCw4XCkKLSAxMzU1IDE5NDUgOEM1Q0VBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYnAsOFwpCi0gMTM1NiAxOTQ5IDhDNUNFQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWJwLDhcKQotIDEzNTcgMTk0ZCAzRThDNUNFQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVicCw4XCkKLSAxMzU4IDE5NTIgM0U4QzVDRUQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYnAsOFwpCi0gMTM1OSAxOTU3IDhDNUNFRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWJwLDhcKQotIDEzNjAgMTk1YiA4QzVDRUYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVicCw4XCkKLSAxMzYxIDE5NWYgOEM1Q0YwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlc2ksOFwpCi0gMTM2MiAxOTYzIDhDNUNGMTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZXNpLDhcKQotIDEzNjMgMTk2NyA4QzVDRjIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVzaSw4XCkKLSAxMzY0IDE5NmIgOEM1Q0YzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlc2ksOFwpCi0gMTM2NSAxOTZmIDNFOEM1Q0Y0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZXNpLDhcKQotIDEzNjYgMTk3NCAzRThDNUNGNSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVzaSw4XCkKLSAxMzY3IDE5NzkgOEM1Q0Y2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlc2ksOFwpCi0gMTM2OCAxOTdkIDhDNUNGNzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZXNpLDhcKQotIDEzNjkgMTk4MSA4QzVDRjgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVkaSw4XCkKLSAxMzcwIDE5ODUgOEM1Q0ZBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZGksOFwpCi0gMTM3MSAxOTg5IDhDNUNGOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWRpLDhcKQotIDEzNzIgMTk4ZCA4QzVDRkIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVkaSw4XCkKLSAxMzczIDE5OTEgM0U4QzVDRkMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlZGksOFwpCi0gMTM3NCAxOTk2IDNFOEM1Q0ZEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWRpLDhcKQotIDEzNzUgMTk5YiA4QzVDRkUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVkaSw4XCkKLSAxMzc2IDE5OWYgOEM1Q0ZGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlZGksOFwpCi0gMTM3NyAxOWEzIDhDOUMwMDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDFcKQotIDEzNzggMTlhYSA4QzlDMDE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVheCwxXCkKLSAxMzc5IDE5YjEgOEM5QzAyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsMVwpCi0gMTM4MCAxOWI4IDhDOUMwMzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDFcKQotIDEzODEgMTliZiAzRThDOUMwNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVheCwxXCkKLSAxMzgyIDE5YzcgM0U4QzlDMDUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsMVwpCi0gMTM4MyAxOWNmIDhDOUMwNjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDFcKQotIDEzODQgMTlkNiA4QzlDMDc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVheCwxXCkKLSAxMzg1IDE5ZGQgOEM5QzA4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsMVwpCi0gMTM4NiAxOWU0IDhDOUMwOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDFcKQotIDEzODcgMTllYiA4QzlDMEE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVjeCwxXCkKLSAxMzg4IDE5ZjIgOEM5QzBCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsMVwpCi0gMTM4OSAxOWY5IDNFOEM5QzBDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDFcKQotIDEzOTAgMWEwMSAzRThDOUMwRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVjeCwxXCkKLSAxMzkxIDFhMDkgOEM5QzBFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsMVwpCi0gMTM5MiAxYTEwIDhDOUMwRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDFcKQotIDEzOTMgMWExNyA4QzlDMTA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVkeCwxXCkKLSAxMzk0IDFhMWUgOEM5QzExNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsMVwpCi0gMTM5NSAxYTI1IDhDOUMxMjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDFcKQotIDEzOTYgMWEyYyA4QzlDMTM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVkeCwxXCkKLSAxMzk3IDFhMzMgM0U4QzlDMTQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsMVwpCi0gMTM5OCAxYTNiIDNFOEM5QzE1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDFcKQotIDEzOTkgMWE0MyA4QzlDMTY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVkeCwxXCkKLSAxNDAwIDFhNGEgOEM5QzE3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsMVwpCi0gMTQwMSAxYTUxIDhDOUMxODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDFcKQotIDE0MDIgMWE1OCA4QzlDMTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVieCwxXCkKLSAxNDAzIDFhNWYgOEM5QzFBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYngsMVwpCi0gMTQwNCAxYTY2IDhDOUMxQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDFcKQotIDE0MDUgMWE2ZCAzRThDOUMxQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVieCwxXCkKLSAxNDA2IDFhNzUgM0U4QzlDMUQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYngsMVwpCi0gMTQwNyAxYTdkIDhDOUMxRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDFcKQotIDE0MDggMWE4NCA4QzlDMUY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVieCwxXCkKLSAxNDA5IDFhOGIgOEM5ODc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LDFcKQotIDE0MTAgMWE5MSA4Qzk5Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsMVwpCi0gMTQxMSAxYTk3IDhDOUE3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwxXCkKLSAxNDEyIDFhOWQgOEM5Qjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LDFcKQotIDE0MTMgMWFhMyAzRThDOUMyNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsMVwpCi0gMTQxNCAxYWFiIDNFOEM5RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwxXCkKLSAxNDE1IDFhYjIgOEM5RTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLDFcKQotIDE0MTYgMWFiOCA4QzlGNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksMVwpCi0gMTQxNyAxYWJlIDhDOUMyODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDFcKQotIDE0MTggMWFjNSA4QzlDMjk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVicCwxXCkKLSAxNDE5IDFhY2MgOEM5QzJBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsMVwpCi0gMTQyMCAxYWQzIDhDOUMyQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDFcKQotIDE0MjEgMWFkYSAzRThDOUMyQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVicCwxXCkKLSAxNDIyIDFhZTIgM0U4QzlDMkQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsMVwpCi0gMTQyMyAxYWVhIDhDOUMyRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDFcKQotIDE0MjQgMWFmMSA4QzlDMkY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVicCwxXCkKLSAxNDI1IDFhZjggOEM5QzMwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksMVwpCi0gMTQyNiAxYWZmIDhDOUMzMTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDFcKQotIDE0MjcgMWIwNiA4QzlDMzI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVzaSwxXCkKLSAxNDI4IDFiMGQgOEM5QzMzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksMVwpCi0gMTQyOSAxYjE0IDNFOEM5QzM0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDFcKQotIDE0MzAgMWIxYyAzRThDOUMzNSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVzaSwxXCkKLSAxNDMxIDFiMjQgOEM5QzM2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksMVwpCi0gMTQzMiAxYjJiIDhDOUMzNzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDFcKQotIDE0MzMgMWIzMiA4QzlDMzg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVkaSwxXCkKLSAxNDM0IDFiMzkgOEM5QzM5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZGksMVwpCi0gMTQzNSAxYjQwIDhDOUMzQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDFcKQotIDE0MzYgMWI0NyA4QzlDM0I3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVkaSwxXCkKLSAxNDM3IDFiNGUgM0U4QzlDM0MgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlZGksMVwpCi0gMTQzOCAxYjU2IDNFOEM5QzNEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDFcKQotIDE0MzkgMWI1ZSA4QzlDM0U3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVkaSwxXCkKLSAxNDQwIDFiNjUgOEM5QzNGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlZGksMVwpCi0gMTQ0MSAxYjZjIDhDOUM0MDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDJcKQotIDE0NDIgMWI3MyA4QzlDNDE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVheCwyXCkKLSAxNDQzIDFiN2EgOEM5QzQyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsMlwpCi0gMTQ0NCAxYjgxIDhDOUM0Mzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDJcKQotIDE0NDUgMWI4OCAzRThDOUM0NCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVheCwyXCkKLSAxNDQ2IDFiOTAgM0U4QzlDNDUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsMlwpCi0gMTQ0NyAxYjk4IDhDOUM0Njc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDJcKQotIDE0NDggMWI5ZiA4QzlDNDc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVheCwyXCkKLSAxNDQ5IDFiYTYgOEM5QzQ4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsMlwpCi0gMTQ1MCAxYmFkIDhDOUM0OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDJcKQotIDE0NTEgMWJiNCA4QzlDNEE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVjeCwyXCkKLSAxNDUyIDFiYmIgOEM5QzRCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsMlwpCi0gMTQ1MyAxYmMyIDNFOEM5QzRDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDJcKQotIDE0NTQgMWJjYSAzRThDOUM0RCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVjeCwyXCkKLSAxNDU1IDFiZDIgOEM5QzRFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsMlwpCi0gMTQ1NiAxYmQ5IDhDOUM0Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDJcKQotIDE0NTcgMWJlMCA4QzlDNTA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVkeCwyXCkKLSAxNDU4IDFiZTcgOEM5QzUxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsMlwpCi0gMTQ1OSAxYmVlIDhDOUM1Mjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDJcKQotIDE0NjAgMWJmNSA4QzlDNTM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVkeCwyXCkKLSAxNDYxIDFiZmMgM0U4QzlDNTQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsMlwpCi0gMTQ2MiAxYzA0IDNFOEM5QzU1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDJcKQotIDE0NjMgMWMwYyA4QzlDNTY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVkeCwyXCkKLSAxNDY0IDFjMTMgOEM5QzU3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsMlwpCi0gMTQ2NSAxYzFhIDhDOUM1ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDJcKQotIDE0NjYgMWMyMSA4QzlDNTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVieCwyXCkKLSAxNDY3IDFjMjggOEM5QzVBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYngsMlwpCi0gMTQ2OCAxYzJmIDhDOUM1Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDJcKQotIDE0NjkgMWMzNiAzRThDOUM1QyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVieCwyXCkKLSAxNDcwIDFjM2UgM0U4QzlDNUQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYngsMlwpCi0gMTQ3MSAxYzQ2IDhDOUM1RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDJcKQotIDE0NzIgMWM0ZCA4QzlDNUY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVieCwyXCkKLSAxNDczIDFjNTQgOEM5ODc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LDJcKQotLipXYXJuaW5nOi4qCi0gMTQ3NCAxYzVhIDhDOTk3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwyXCkKLS4qV2FybmluZzouKgotIDE0NzUgMWM2MCA4QzlBNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsMlwpCi0uKldhcm5pbmc6LioKLSAxNDc2IDFjNjYgOEM5Qjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LDJcKQotLipXYXJuaW5nOi4qCi0gMTQ3NyAxYzZjIDNFOEM5QzI0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwyXCkKLS4qV2FybmluZzouKgotIDE0NzggMWM3NCAzRThDOUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsMlwpCi0uKldhcm5pbmc6LioKLSAxNDc5IDFjN2IgOEM5RTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLDJcKQotLipXYXJuaW5nOi4qCi0gMTQ4MCAxYzgxIDhDOUY3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwyXCkKLS4qV2FybmluZzouKgotIDE0ODEgMWM4NyA4QzlDNjg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVicCwyXCkKLSAxNDgyIDFjOGUgOEM5QzY5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsMlwpCi0gMTQ4MyAxYzk1IDhDOUM2QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDJcKQotIDE0ODQgMWM5YyA4QzlDNkI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVicCwyXCkKLSAxNDg1IDFjYTMgM0U4QzlDNkMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsMlwpCi0gMTQ4NiAxY2FiIDNFOEM5QzZEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDJcKQotIDE0ODcgMWNiMyA4QzlDNkU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVicCwyXCkKLSAxNDg4IDFjYmEgOEM5QzZGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsMlwpCi0gMTQ4OSAxY2MxIDhDOUM3MDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDJcKQotIDE0OTAgMWNjOCA4QzlDNzE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVzaSwyXCkKLSAxNDkxIDFjY2YgOEM5QzcyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksMlwpCi0gMTQ5MiAxY2Q2IDhDOUM3Mzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDJcKQotIDE0OTMgMWNkZCAzRThDOUM3NCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVzaSwyXCkKLSAxNDk0IDFjZTUgM0U4QzlDNzUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksMlwpCi0gMTQ5NSAxY2VkIDhDOUM3Njc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDJcKQotIDE0OTYgMWNmNCA4QzlDNzc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVzaSwyXCkKLSAxNDk3IDFjZmIgOEM5Qzc4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZGksMlwpCi0gMTQ5OCAxZDAyIDhDOUM3OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDJcKQotIDE0OTkgMWQwOSA4QzlDN0E3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkaSwyXCkKLSAxNTAwIDFkMTAgOEM5QzdCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksMlwpCi0gMTUwMSAxZDE3IDNFOEM5QzdDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDJcKQotIDE1MDIgMWQxZiAzRThDOUM3RCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkaSwyXCkKLSAxNTAzIDFkMjcgOEM5QzdFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZGksMlwpCi0gMTUwNCAxZDJlIDhDOUM3Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDJcKQotIDE1MDUgMWQzNSA4QzlDODA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVheCw0XCkKLSAxNTA2IDFkM2MgOEM5QzgxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsNFwpCi0gMTUwNyAxZDQzIDhDOUM4Mjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDRcKQotIDE1MDggMWQ0YSA4QzlDODM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVheCw0XCkKLSAxNTA5IDFkNTEgM0U4QzlDODQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsNFwpCi0gMTUxMCAxZDU5IDNFOEM5Qzg1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDRcKQotIDE1MTEgMWQ2MSA4QzlDODY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVheCw0XCkKLSAxNTEyIDFkNjggOEM5Qzg3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsNFwpCi0gMTUxMyAxZDZmIDhDOUM4ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDRcKQotIDE1MTQgMWQ3NiA4QzlDODk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVjeCw0XCkKLSAxNTE1IDFkN2QgOEM5QzhBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsNFwpCi0gMTUxNiAxZDg0IDhDOUM4Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDRcKQotIDE1MTcgMWQ4YiAzRThDOUM4QyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVjeCw0XCkKLSAxNTE4IDFkOTMgM0U4QzlDOEQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsNFwpCi0gMTUxOSAxZDliIDhDOUM4RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDRcKQotIDE1MjAgMWRhMiA4QzlDOEY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVjeCw0XCkKLSAxNTIxIDFkYTkgOEM5QzkwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsNFwpCi0gMTUyMiAxZGIwIDhDOUM5MTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDRcKQotIDE1MjMgMWRiNyA4QzlDOTI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkeCw0XCkKLSAxNTI0IDFkYmUgOEM5QzkzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsNFwpCi0gMTUyNSAxZGM1IDNFOEM5Qzk0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDRcKQotIDE1MjYgMWRjZCAzRThDOUM5NSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkeCw0XCkKLSAxNTI3IDFkZDUgOEM5Qzk2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsNFwpCi0gMTUyOCAxZGRjIDhDOUM5Nzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDRcKQotIDE1MjkgMWRlMyA4QzlDOTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVieCw0XCkKLSAxNTMwIDFkZWEgOEM5Qzk5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYngsNFwpCi0gMTUzMSAxZGYxIDhDOUM5QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDRcKQotIDE1MzIgMWRmOCA4QzlDOUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVieCw0XCkKLSAxNTMzIDFkZmYgM0U4QzlDOUMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYngsNFwpCi0gMTUzNCAxZTA3IDNFOEM5QzlEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDRcKQotIDE1MzUgMWUwZiA4QzlDOUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVieCw0XCkKLSAxNTM2IDFlMTYgOEM5QzlGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYngsNFwpCi0gMTUzNyAxZTFkIDhDOTg3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCw0XCkKLS4qV2FybmluZzouKgotIDE1MzggMWUyMyA4Qzk5Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsNFwpCi0uKldhcm5pbmc6LioKLSAxNTM5IDFlMjkgOEM5QTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LDRcKQotLipXYXJuaW5nOi4qCi0gMTU0MCAxZTJmIDhDOUI3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCw0XCkKLS4qV2FybmluZzouKgotIDE1NDEgMWUzNSAzRThDOUMyNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsNFwpCi0uKldhcm5pbmc6LioKLSAxNTQyIDFlM2QgM0U4QzlENzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLDRcKQotLipXYXJuaW5nOi4qCi0gMTU0MyAxZTQ0IDhDOUU3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSw0XCkKLS4qV2FybmluZzouKgotIDE1NDQgMWU0YSA4QzlGNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksNFwpCi0uKldhcm5pbmc6LioKLSAxNTQ1IDFlNTAgOEM5Q0E4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsNFwpCi0gMTU0NiAxZTU3IDhDOUNBOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDRcKQotIDE1NDcgMWU1ZSA4QzlDQUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVicCw0XCkKLSAxNTQ4IDFlNjUgOEM5Q0FCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsNFwpCi0gMTU0OSAxZTZjIDNFOEM5Q0FDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDRcKQotIDE1NTAgMWU3NCAzRThDOUNBRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVicCw0XCkKLSAxNTUxIDFlN2MgOEM5Q0FFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsNFwpCi0gMTU1MiAxZTgzIDhDOUNBRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDRcKQotIDE1NTMgMWU4YSA4QzlDQjA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVzaSw0XCkKLSAxNTU0IDFlOTEgOEM5Q0IxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksNFwpCi0gMTU1NSAxZTk4IDhDOUNCMjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDRcKQotIDE1NTYgMWU5ZiA4QzlDQjM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVzaSw0XCkKLSAxNTU3IDFlYTYgM0U4QzlDQjQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksNFwpCi0gMTU1OCAxZWFlIDNFOEM5Q0I1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDRcKQotIDE1NTkgMWViNiA4QzlDQjY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVzaSw0XCkKLSAxNTYwIDFlYmQgOEM5Q0I3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksNFwpCi0gMTU2MSAxZWM0IDhDOUNCODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDRcKQotIDE1NjIgMWVjYiA4QzlDQjk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkaSw0XCkKLSAxNTYzIDFlZDIgOEM5Q0JBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZGksNFwpCi0gMTU2NCAxZWQ5IDhDOUNCQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDRcKQotIDE1NjUgMWVlMCAzRThDOUNCQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkaSw0XCkKLSAxNTY2IDFlZTggM0U4QzlDQkQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZGksNFwpCi0gMTU2NyAxZWYwIDhDOUNCRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDRcKQotIDE1NjggMWVmNyA4QzlDQkY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkaSw0XCkKLSAxNTY5IDFlZmUgOEM5Q0MwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsOFwpCi0gMTU3MCAxZjA1IDhDOUNDMTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDhcKQotIDE1NzEgMWYwYyA4QzlDQzI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVheCw4XCkKLSAxNTcyIDFmMTMgOEM5Q0MzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsOFwpCi0gMTU3MyAxZjFhIDNFOEM5Q0M0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDhcKQotIDE1NzQgMWYyMiAzRThDOUNDNSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVheCw4XCkKLSAxNTc1IDFmMmEgOEM5Q0M2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsOFwpCi0gMTU3NiAxZjMxIDhDOUNDNzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDhcKQotIDE1NzcgMWYzOCA4QzlDQzg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVjeCw4XCkKLSAxNTc4IDFmM2YgOEM5Q0M5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsOFwpCi0gMTU3OSAxZjQ2IDhDOUNDQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDhcKQotIDE1ODAgMWY0ZCA4QzlDQ0I3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVjeCw4XCkKLSAxNTgxIDFmNTQgM0U4QzlDQ0MgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsOFwpCi0gMTU4MiAxZjVjIDNFOEM5Q0NEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDhcKQotIDE1ODMgMWY2NCA4QzlDQ0U3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVjeCw4XCkKLSAxNTg0IDFmNmIgOEM5Q0NGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsOFwpCi0gMTU4NSAxZjcyIDhDOUNEMDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDhcKQotIDE1ODYgMWY3OSA4QzlDRDE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkeCw4XCkKLSAxNTg3IDFmODAgOEM5Q0QyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsOFwpCi0gMTU4OCAxZjg3IDhDOUNEMzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDhcKQotIDE1ODkgMWY4ZSAzRThDOUNENCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkeCw4XCkKLSAxNTkwIDFmOTYgM0U4QzlDRDUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsOFwpCi0gMTU5MSAxZjllIDhDOUNENjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDhcKQotIDE1OTIgMWZhNSA4QzlDRDc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkeCw4XCkKLSAxNTkzIDFmYWMgOEM5Q0Q4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYngsOFwpCi0gMTU5NCAxZmIzIDhDOUNEOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDhcKQotIDE1OTUgMWZiYSA4QzlDREE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVieCw4XCkKLSAxNTk2IDFmYzEgOEM5Q0RCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsOFwpCi0gMTU5NyAxZmM4IDNFOEM5Q0RDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDhcKQotIDE1OTggMWZkMCAzRThDOUNERCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVieCw4XCkKLSAxNTk5IDFmZDggOEM5Q0RFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYngsOFwpCi0gMTYwMCAxZmRmIDhDOUNERjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDhcKQotIDE2MDEgMWZlNiA4Qzk4Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsOFwpCi0uKldhcm5pbmc6LioKLSAxNjAyIDFmZWMgOEM5OTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LDhcKQotLipXYXJuaW5nOi4qCi0gMTYwMyAxZmYyIDhDOUE3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCw4XCkKLS4qV2FybmluZzouKgotIDE2MDQgMWZmOCA4QzlCNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsOFwpCi0uKldhcm5pbmc6LioKLSAxNjA1IDFmZmUgM0U4QzlDMjQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLDhcKQotLipXYXJuaW5nOi4qCi0gMTYwNiAyMDA2IDNFOEM5RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCw4XCkKLS4qV2FybmluZzouKgotIDE2MDcgMjAwZCA4QzlFNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksOFwpCi0uKldhcm5pbmc6LioKLSAxNjA4IDIwMTMgOEM5Rjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLDhcKQotLipXYXJuaW5nOi4qCi0gMTYwOSAyMDE5IDhDOUNFODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDhcKQotIDE2MTAgMjAyMCA4QzlDRTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVicCw4XCkKLSAxNjExIDIwMjcgOEM5Q0VBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsOFwpCi0gMTYxMiAyMDJlIDhDOUNFQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDhcKQotIDE2MTMgMjAzNSAzRThDOUNFQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVicCw4XCkKLSAxNjE0IDIwM2QgM0U4QzlDRUQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsOFwpCi0gMTYxNSAyMDQ1IDhDOUNFRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDhcKQotIDE2MTYgMjA0YyA4QzlDRUY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVicCw4XCkKLSAxNjE3IDIwNTMgOEM5Q0YwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksOFwpCi0gMTYxOCAyMDVhIDhDOUNGMTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDhcKQotIDE2MTkgMjA2MSA4QzlDRjI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVzaSw4XCkKLSAxNjIwIDIwNjggOEM5Q0YzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksOFwpCi0gMTYyMSAyMDZmIDNFOEM5Q0Y0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDhcKQotIDE2MjIgMjA3NyAzRThDOUNGNSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVzaSw4XCkKLSAxNjIzIDIwN2YgOEM5Q0Y2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksOFwpCi0gMTYyNCAyMDg2IDhDOUNGNzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDhcKQotIDE2MjUgMjA4ZCA4QzlDRjg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVkaSw4XCkKLSAxNjI2IDIwOTQgOEM5Q0ZBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZGksOFwpCi0gMTYyNyAyMDliIDhDOUNGOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDhcKQotIDE2MjggMjBhMiA4QzlDRkI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVkaSw4XCkKLSAxNjI5IDIwYTkgM0U4QzlDRkMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlZGksOFwpCi0gMTYzMCAyMGIxIDNFOEM5Q0ZEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDhcKQotIDE2MzEgMjBiOSA4QzlDRkU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVkaSw4XCkKLSAxNjMyIDIwYzAgOEM5Q0ZGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlZGksOFwpCi0gMTYzMyAyMGM3IDNFOEM1QzA1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYXgsMVwpCi0gMTYzNCAyMGNjIDNFOEM1QzBEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlY3gsMVwpCi0gMTYzNSAyMGQxIDNFOEM1QzE1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZHgsMVwpCi0gMTYzNiAyMGQ2IDNFOEM1QzFEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYngsMVwpCi0gMTYzNyAyMGRiIDNFOEM1RDAwICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLDFcKQotIDE2MzggMjBkZiAzRThDNUMyRCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWJwLDFcKQotIDE2MzkgMjBlNCAzRThDNUMzNSAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZXNpLDFcKQotIDE2NDAgMjBlOSAzRThDNUMzRCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWRpLDFcKQotIDE2NDEgMjBlZSAzRThDNUM0NSAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWF4LDJcKQotIDE2NDIgMjBmMyAzRThDNUM0RCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWN4LDJcKQotIDE2NDMgMjBmOCAzRThDNUM1NSAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWR4LDJcKQotIDE2NDQgMjBmZCAzRThDNUM1RCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWJ4LDJcKQotIDE2NDUgMjEwMiAzRThDNUQwMCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwyXCkKLS4qV2FybmluZzouKgotIDE2NDYgMjEwNiAzRThDNUM2RCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWJwLDJcKQotIDE2NDcgMjEwYiAzRThDNUM3NSAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZXNpLDJcKQotIDE2NDggMjExMCAzRThDNUM3RCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWRpLDJcKQotIDE2NDkgMjExNSAzRThDNUM4NSAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWF4LDRcKQotIDE2NTAgMjExYSAzRThDNUM4RCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWN4LDRcKQotIDE2NTEgMjExZiAzRThDNUM5NSAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWR4LDRcKQotIDE2NTIgMjEyNCAzRThDNUM5RCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWJ4LDRcKQotIDE2NTMgMjEyOSAzRThDNUQwMCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCw0XCkKLS4qV2FybmluZzouKgotIDE2NTQgMjEyZCAzRThDNUNBRCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWJwLDRcKQotIDE2NTUgMjEzMiAzRThDNUNCNSAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZXNpLDRcKQotIDE2NTYgMjEzNyAzRThDNUNCRCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWRpLDRcKQotIDE2NTcgMjEzYyAzRThDNUNDNSAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWF4LDhcKQotIDE2NTggMjE0MSAzRThDNUNDRCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWN4LDhcKQotIDE2NTkgMjE0NiAzRThDNUNENSAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWR4LDhcKQotIDE2NjAgMjE0YiAzRThDNUNERCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWJ4LDhcKQotIDE2NjEgMjE1MCAzRThDNUQwMCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCw4XCkKLS4qV2FybmluZzouKgotIDE2NjIgMjE1NCAzRThDNUNFRCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWJwLDhcKQotIDE2NjMgMjE1OSAzRThDNUNGNSAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZXNpLDhcKQotIDE2NjQgMjE1ZSAzRThDNUNGRCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWRpLDhcKQotIDE2NjUgMjE2MyA4QzFEMTIwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCwxXCkKLSAxNjY2IDIxNjkgOEMxRDEyMDAgMDAwMCAgICAgCQltb3YJJWRzLCVkczoweDEyXCgsMlwpCi0uKldhcm5pbmc6LioKLSAxNjY3IDIxNmYgOEMxRDEyMDAgMDAwMCAgICAgCQltb3YJJWRzLCVkczoweDEyXCgsNFwpCi0uKldhcm5pbmc6LioKLSAxNjY4IDIxNzUgOEMxRDEyMDAgMDAwMCAgICAgCQltb3YJJWRzLCVkczoweDEyXCgsOFwpCi0uKldhcm5pbmc6LioKLSAxNjY5IFsgCV0qCi0gMTY3MCBbIAldKiAgICAgCQkjIEZvcmNlIGEgZ29vZCBhbGlnbm1lbnQuCi0gMTY3MSAyMTdiIDAwIFsgCV0qCS5ieXRlCTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvbW9kcm0ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvbW9kcm0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZmYzY4OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L21vZHJtLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcxICswLDAgQEAKLS5wc2l6ZSAwCi0udGV4dAotCW1vdgklZHMsJXNzOiglZWF4KQotCW1vdgklZHMsJXNzOiglZWN4KQotCW1vdgklZHMsJXNzOiglZWR4KQotCW1vdgklZHMsJXNzOiglZWJ4KQotCW1vdgklZHMsJXNzOjAKLQltb3YJJWRzLCVzczooJWVzaSkKLQltb3YJJWRzLCVzczooJWVkaSkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGkpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2kpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpKQotCW1vdgklZHMsJWVheAotCW1vdgklZHMsJWVjeAotCW1vdgklZHMsJWVkeAotCW1vdgklZHMsJWVieAotCW1vdgklZHMsJWVzcAotCW1vdgklZHMsJWVicAotCW1vdgklZHMsJWVzaQotCW1vdgklZHMsJWVkaQotCW1vdgklZHMsJXNzOiglZWF4LCVlYXgsMSkKLQltb3YJJWRzLCVzczooJWVjeCwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVheCwxKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYXgsMSkKLQltb3YJJWRzLCVzczooJWVzcCwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVheCwxKQotCW1vdgklZHMsJXNzOiglZWRpLCVlYXgsMSkKLQltb3YJJWRzLCVzczooJWVheCwlZWN4LDEpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZWR4LCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVieCwlZWN4LDEpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVjeCwxKQotCW1vdgklZHMsJXNzOigsJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZXNpLCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVkaSwlZWN4LDEpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVkeCwxKQotCW1vdgklZHMsJXNzOiglZWN4LCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVkeCwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlYngsJWVkeCwxKQotCW1vdgklZHMsJXNzOiglZXNwLCVlZHgsMSkKLQltb3YJJWRzLCVzczooLCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVzaSwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlZGksJWVkeCwxKQotCW1vdgklZHMsJXNzOiglZWF4LCVlYngsMSkKLQltb3YJJWRzLCVzczooJWVjeCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVieCwxKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYngsMSkKLQltb3YJJWRzLCVzczooJWVzcCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVieCwxKQotCW1vdgklZHMsJXNzOiglZWRpLCVlYngsMSkKLQltb3YJJWRzLCVzczooJWVheCwxKQotCW1vdgklZHMsJXNzOiglZWN4LDEpCi0JbW92CSVkcywlc3M6KCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVieCwxKQotCW1vdgklZHMsJXNzOiglZXNwLDEpCi0JbW92CSVkcywlc3M6KCwxKQotCW1vdgklZHMsJXNzOiglZXNpLDEpCi0JbW92CSVkcywlc3M6KCVlZGksMSkKLQltb3YJJWRzLCVzczooJWVheCwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVicCwxKQotCW1vdgklZHMsJXNzOiglZWR4LCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVieCwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVicCwxKQotCW1vdgklZHMsJXNzOigsJWVicCwxKQotCW1vdgklZHMsJXNzOiglZXNpLCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVkaSwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZWN4LCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVkeCwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCVlYngsJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZXNwLCVlc2ksMSkKLQltb3YJJWRzLCVzczooLCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVzaSwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCVlZGksJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZWF4LCVlZGksMSkKLQltb3YJJWRzLCVzczooJWVjeCwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkaSwxKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlZGksMSkKLQltb3YJJWRzLCVzczooJWVzcCwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVkaSwxKQotCW1vdgklZHMsJXNzOiglZWRpLCVlZGksMSkKLQltb3YJJWRzLCVzczooJWVheCwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVheCwyKQotCW1vdgklZHMsJXNzOiglZWR4LCVlYXgsMikKLQltb3YJJWRzLCVzczooJWVieCwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVheCwyKQotCW1vdgklZHMsJXNzOigsJWVheCwyKQotCW1vdgklZHMsJXNzOiglZXNpLCVlYXgsMikKLQltb3YJJWRzLCVzczooJWVkaSwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVjeCwyKQotCW1vdgklZHMsJXNzOiglZWN4LCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVkeCwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCVlYngsJWVjeCwyKQotCW1vdgklZHMsJXNzOiglZXNwLCVlY3gsMikKLQltb3YJJWRzLCVzczooLCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVzaSwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCVlZGksJWVjeCwyKQotCW1vdgklZHMsJXNzOiglZWF4LCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVjeCwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVzcCwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZWRpLCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVheCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVieCwyKQotCW1vdgklZHMsJXNzOiglZWR4LCVlYngsMikKLQltb3YJJWRzLCVzczooJWVieCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVieCwyKQotCW1vdgklZHMsJXNzOigsJWVieCwyKQotCW1vdgklZHMsJXNzOiglZXNpLCVlYngsMikKLQltb3YJJWRzLCVzczooJWVkaSwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlYXgsMikKLQltb3YJJWRzLCVzczooJWVjeCwyKQotCW1vdgklZHMsJXNzOiglZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlYngsMikKLQltb3YJJWRzLCVzczooJWVzcCwyKQotCW1vdgklZHMsJXNzOigsMikKLQltb3YJJWRzLCVzczooJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZWRpLDIpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVicCwyKQotCW1vdgklZHMsJXNzOiglZWN4LCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVkeCwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlYngsJWVicCwyKQotCW1vdgklZHMsJXNzOiglZXNwLCVlYnAsMikKLQltb3YJJWRzLCVzczooLCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVzaSwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlZGksJWVicCwyKQotCW1vdgklZHMsJXNzOiglZWF4LCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVjeCwlZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVzcCwlZXNpLDIpCi0JbW92CSVkcywlc3M6KCwlZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZWRpLCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVheCwlZWRpLDIpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZWR4LCVlZGksMikKLQltb3YJJWRzLCVzczooJWVieCwlZWRpLDIpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVkaSwyKQotCW1vdgklZHMsJXNzOigsJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZXNpLCVlZGksMikKLQltb3YJJWRzLCVzczooJWVkaSwlZWRpLDIpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVheCw0KQotCW1vdgklZHMsJXNzOiglZWN4LCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlYngsJWVheCw0KQotCW1vdgklZHMsJXNzOiglZXNwLCVlYXgsNCkKLQltb3YJJWRzLCVzczooLCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlZGksJWVheCw0KQotCW1vdgklZHMsJXNzOiglZWF4LCVlY3gsNCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlY3gsNCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWN4LDQpCi0JbW92CSVkcywlc3M6KCwlZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZWRpLCVlY3gsNCkKLQltb3YJJWRzLCVzczooJWVheCwlZWR4LDQpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVkeCw0KQotCW1vdgklZHMsJXNzOiglZWR4LCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVieCwlZWR4LDQpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVkeCw0KQotCW1vdgklZHMsJXNzOigsJWVkeCw0KQotCW1vdgklZHMsJXNzOiglZXNpLCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWR4LDQpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVieCw0KQotCW1vdgklZHMsJXNzOiglZWN4LCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlYngsJWVieCw0KQotCW1vdgklZHMsJXNzOiglZXNwLCVlYngsNCkKLQltb3YJJWRzLCVzczooLCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlZGksJWVieCw0KQotCW1vdgklZHMsJXNzOiglZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlY3gsNCkKLQltb3YJJWRzLCVzczooJWVkeCw0KQotCW1vdgklZHMsJXNzOiglZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlc3AsNCkKLQltb3YJJWRzLCVzczooLDQpCi0JbW92CSVkcywlc3M6KCVlc2ksNCkKLQltb3YJJWRzLCVzczooJWVkaSw0KQotCW1vdgklZHMsJXNzOiglZWF4LCVlYnAsNCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVicCw0KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYnAsNCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVicCw0KQotCW1vdgklZHMsJXNzOiglZWRpLCVlYnAsNCkKLQltb3YJJWRzLCVzczooJWVheCwlZXNpLDQpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZWR4LCVlc2ksNCkKLQltb3YJJWRzLCVzczooJWVieCwlZXNpLDQpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVzaSw0KQotCW1vdgklZHMsJXNzOigsJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZXNpLCVlc2ksNCkKLQltb3YJJWRzLCVzczooJWVkaSwlZXNpLDQpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVkaSw0KQotCW1vdgklZHMsJXNzOiglZWN4LCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlYngsJWVkaSw0KQotCW1vdgklZHMsJXNzOiglZXNwLCVlZGksNCkKLQltb3YJJWRzLCVzczooLCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlZGksJWVkaSw0KQotCW1vdgklZHMsJXNzOiglZWF4LCVlYXgsOCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVheCw4KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYXgsOCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVheCw4KQotCW1vdgklZHMsJXNzOiglZWRpLCVlYXgsOCkKLQltb3YJJWRzLCVzczooJWVheCwlZWN4LDgpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZWR4LCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVieCwlZWN4LDgpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVjeCw4KQotCW1vdgklZHMsJXNzOigsJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZXNpLCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWN4LDgpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVkeCw4KQotCW1vdgklZHMsJXNzOiglZWN4LCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlYngsJWVkeCw4KQotCW1vdgklZHMsJXNzOiglZXNwLCVlZHgsOCkKLQltb3YJJWRzLCVzczooLCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlZGksJWVkeCw4KQotCW1vdgklZHMsJXNzOiglZWF4LCVlYngsOCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVieCw4KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYngsOCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVieCw4KQotCW1vdgklZHMsJXNzOiglZWRpLCVlYngsOCkKLQltb3YJJWRzLCVzczooJWVheCw4KQotCW1vdgklZHMsJXNzOiglZWN4LDgpCi0JbW92CSVkcywlc3M6KCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVieCw4KQotCW1vdgklZHMsJXNzOiglZXNwLDgpCi0JbW92CSVkcywlc3M6KCw4KQotCW1vdgklZHMsJXNzOiglZXNpLDgpCi0JbW92CSVkcywlc3M6KCVlZGksOCkKLQltb3YJJWRzLCVzczooJWVheCwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVicCw4KQotCW1vdgklZHMsJXNzOiglZWR4LCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVieCwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVicCw4KQotCW1vdgklZHMsJXNzOigsJWVicCw4KQotCW1vdgklZHMsJXNzOiglZXNpLCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZWN4LCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVkeCwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCVlYngsJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZXNwLCVlc2ksOCkKLQltb3YJJWRzLCVzczooLCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVzaSwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCVlZGksJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZWF4LCVlZGksOCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWRpLDgpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVkaSw4KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlZGksOCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWRpLDgpCi0JbW92CSVkcywlc3M6KCwlZWRpLDgpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVkaSw4KQotCW1vdgklZHMsJXNzOiglZWRpLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkaSw4KQotCW1vdgklZHMsJXNzOiglZWJwLCVlYXgsMSkKLQltb3YJJWRzLCVzczooJWVicCwlZWN4LDEpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVkeCwxKQotCW1vdgklZHMsJXNzOiglZWJwLCVlYngsMSkKLQltb3YJJWRzLCVzczooJWVicCwxKQotCW1vdgklZHMsJXNzOiglZWJwLCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVicCwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVkaSwxKQotCW1vdgklZHMsJXNzOiglZWJwLCVlYXgsMikKLQltb3YJJWRzLCVzczooJWVicCwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZWJwLCVlYngsMikKLQltb3YJJWRzLCVzczooJWVicCwyKQotCW1vdgklZHMsJXNzOiglZWJwLCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVicCwlZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZWJwLCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVicCwlZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVkeCw0KQotCW1vdgklZHMsJXNzOiglZWJwLCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVicCw0KQotCW1vdgklZHMsJXNzOiglZWJwLCVlYnAsNCkKLQltb3YJJWRzLCVzczooJWVicCwlZXNpLDQpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVkaSw0KQotCW1vdgklZHMsJXNzOiglZWJwLCVlYXgsOCkKLQltb3YJJWRzLCVzczooJWVicCwlZWN4LDgpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVkeCw4KQotCW1vdgklZHMsJXNzOiglZWJwLCVlYngsOCkKLQltb3YJJWRzLCVzczooJWVicCw4KQotCW1vdgklZHMsJXNzOiglZWJwLCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVicCwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoLDEpCi0JbW92CSVkcywlc3M6MHgxMigsMikKLQltb3YJJWRzLCVzczoweDEyKCw0KQotCW1vdgklZHMsJXNzOjB4MTIoLDgpCi0JbW92CSVkcywlZHM6KCVlYXgpCi0JbW92CSVkcywlZHM6KCVlY3gpCi0JbW92CSVkcywlZHM6KCVlZHgpCi0JbW92CSVkcywlZHM6KCVlYngpCi0JbW92CSVkcywlZHM6MAotCW1vdgklZHMsJWRzOiglZXNpKQotCW1vdgklZHMsJWRzOiglZWRpKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnApCi0JbW92CSVkcywlZHM6MHgxMiglZXNpKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGkpCi0JbW92CSVkcywlZWF4Ci0JbW92CSVkcywlZWN4Ci0JbW92CSVkcywlZWR4Ci0JbW92CSVkcywlZWJ4Ci0JbW92CSVkcywlZXNwCi0JbW92CSVkcywlZWJwCi0JbW92CSVkcywlZXNpCi0JbW92CSVkcywlZWRpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVheCwxKQotCW1vdgklZHMsJWRzOiglZWN4LCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVkeCwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCVlYngsJWVheCwxKQotCW1vdgklZHMsJWRzOiglZXNwLCVlYXgsMSkKLQltb3YJJWRzLCVkczooLCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVzaSwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCVlZGksJWVheCwxKQotCW1vdgklZHMsJWRzOiglZWF4LCVlY3gsMSkKLQltb3YJJWRzLCVkczooJWVjeCwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlY3gsMSkKLQltb3YJJWRzLCVkczooJWVzcCwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZWRpLCVlY3gsMSkKLQltb3YJJWRzLCVkczooJWVheCwlZWR4LDEpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZWR4LCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVieCwlZWR4LDEpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVkeCwxKQotCW1vdgklZHMsJWRzOigsJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZXNpLCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVkaSwlZWR4LDEpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVieCwxKQotCW1vdgklZHMsJWRzOiglZWN4LCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVkeCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCVlYngsJWVieCwxKQotCW1vdgklZHMsJWRzOiglZXNwLCVlYngsMSkKLQltb3YJJWRzLCVkczooLCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVzaSwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCVlZGksJWVieCwxKQotCW1vdgklZHMsJWRzOiglZWF4LDEpCi0JbW92CSVkcywlZHM6KCVlY3gsMSkKLQltb3YJJWRzLCVkczooJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZWJ4LDEpCi0JbW92CSVkcywlZHM6KCVlc3AsMSkKLQltb3YJJWRzLCVkczooLDEpCi0JbW92CSVkcywlZHM6KCVlc2ksMSkKLQltb3YJJWRzLCVkczooJWVkaSwxKQotCW1vdgklZHMsJWRzOiglZWF4LCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVjeCwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVicCwxKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVzcCwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVicCwxKQotCW1vdgklZHMsJWRzOiglZWRpLCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVheCwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZWR4LCVlc2ksMSkKLQltb3YJJWRzLCVkczooJWVieCwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVzaSwxKQotCW1vdgklZHMsJWRzOigsJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZXNpLCVlc2ksMSkKLQltb3YJJWRzLCVkczooJWVkaSwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVkaSwxKQotCW1vdgklZHMsJWRzOiglZWN4LCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVkeCwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCVlYngsJWVkaSwxKQotCW1vdgklZHMsJWRzOiglZXNwLCVlZGksMSkKLQltb3YJJWRzLCVkczooLCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVzaSwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCVlZGksJWVkaSwxKQotCW1vdgklZHMsJWRzOiglZWF4LCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVjeCwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVheCwyKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVzcCwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVheCwyKQotCW1vdgklZHMsJWRzOiglZWRpLCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVheCwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZWR4LCVlY3gsMikKLQltb3YJJWRzLCVkczooJWVieCwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVjeCwyKQotCW1vdgklZHMsJWRzOigsJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZXNpLCVlY3gsMikKLQltb3YJJWRzLCVkczooJWVkaSwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZWN4LCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVkeCwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlYngsJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZXNwLCVlZHgsMikKLQltb3YJJWRzLCVkczooLCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVzaSwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlZGksJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZWF4LCVlYngsMikKLQltb3YJJWRzLCVkczooJWVjeCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVieCwyKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYngsMikKLQltb3YJJWRzLCVkczooJWVzcCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVieCwyKQotCW1vdgklZHMsJWRzOiglZWRpLCVlYngsMikKLQltb3YJJWRzLCVkczooJWVheCwyKQotCW1vdgklZHMsJWRzOiglZWN4LDIpCi0JbW92CSVkcywlZHM6KCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVieCwyKQotCW1vdgklZHMsJWRzOiglZXNwLDIpCi0JbW92CSVkcywlZHM6KCwyKQotCW1vdgklZHMsJWRzOiglZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlZGksMikKLQltb3YJJWRzLCVkczooJWVheCwlZWJwLDIpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVicCwyKQotCW1vdgklZHMsJWRzOiglZWR4LCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVieCwlZWJwLDIpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVicCwyKQotCW1vdgklZHMsJWRzOigsJWVicCwyKQotCW1vdgklZHMsJWRzOiglZXNpLCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVkaSwlZWJwLDIpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZWN4LCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVkeCwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlYngsJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZXNwLCVlc2ksMikKLQltb3YJJWRzLCVkczooLCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVzaSwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlZGksJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZWF4LCVlZGksMikKLQltb3YJJWRzLCVkczooJWVjeCwlZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlZGksMikKLQltb3YJJWRzLCVkczooJWVzcCwlZWRpLDIpCi0JbW92CSVkcywlZHM6KCwlZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZWRpLCVlZGksMikKLQltb3YJJWRzLCVkczooJWVheCwlZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVheCw0KQotCW1vdgklZHMsJWRzOiglZWR4LCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVieCwlZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVheCw0KQotCW1vdgklZHMsJWRzOigsJWVheCw0KQotCW1vdgklZHMsJWRzOiglZXNpLCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVjeCw0KQotCW1vdgklZHMsJWRzOiglZWN4LCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlYngsJWVjeCw0KQotCW1vdgklZHMsJWRzOiglZXNwLCVlY3gsNCkKLQltb3YJJWRzLCVkczooLCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlZGksJWVjeCw0KQotCW1vdgklZHMsJWRzOiglZWF4LCVlZHgsNCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWR4LDQpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlZHgsNCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWR4LDQpCi0JbW92CSVkcywlZHM6KCwlZWR4LDQpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZWRpLCVlZHgsNCkKLQltb3YJJWRzLCVkczooJWVheCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVieCw0KQotCW1vdgklZHMsJWRzOiglZWR4LCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVieCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVieCw0KQotCW1vdgklZHMsJWRzOigsJWVieCw0KQotCW1vdgklZHMsJWRzOiglZXNpLCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVjeCw0KQotCW1vdgklZHMsJWRzOiglZWR4LDQpCi0JbW92CSVkcywlZHM6KCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVzcCw0KQotCW1vdgklZHMsJWRzOigsNCkKLQltb3YJJWRzLCVkczooJWVzaSw0KQotCW1vdgklZHMsJWRzOiglZWRpLDQpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVicCw0KQotCW1vdgklZHMsJWRzOiglZWN4LCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCVlYngsJWVicCw0KQotCW1vdgklZHMsJWRzOiglZXNwLCVlYnAsNCkKLQltb3YJJWRzLCVkczooLCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCVlZGksJWVicCw0KQotCW1vdgklZHMsJWRzOiglZWF4LCVlc2ksNCkKLQltb3YJJWRzLCVkczooJWVjeCwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVzaSw0KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlc2ksNCkKLQltb3YJJWRzLCVkczooJWVzcCwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVzaSw0KQotCW1vdgklZHMsJWRzOiglZWRpLCVlc2ksNCkKLQltb3YJJWRzLCVkczooJWVheCwlZWRpLDQpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZWR4LCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVieCwlZWRpLDQpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVkaSw0KQotCW1vdgklZHMsJWRzOigsJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZXNpLCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWRpLDQpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVheCw4KQotCW1vdgklZHMsJWRzOiglZWN4LCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCVlYngsJWVheCw4KQotCW1vdgklZHMsJWRzOiglZXNwLCVlYXgsOCkKLQltb3YJJWRzLCVkczooLCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCVlZGksJWVheCw4KQotCW1vdgklZHMsJWRzOiglZWF4LCVlY3gsOCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlY3gsOCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZWRpLCVlY3gsOCkKLQltb3YJJWRzLCVkczooJWVheCwlZWR4LDgpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZWR4LCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVieCwlZWR4LDgpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVkeCw4KQotCW1vdgklZHMsJWRzOigsJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZXNpLCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWR4LDgpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVieCw4KQotCW1vdgklZHMsJWRzOiglZWN4LCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCVlYngsJWVieCw4KQotCW1vdgklZHMsJWRzOiglZXNwLCVlYngsOCkKLQltb3YJJWRzLCVkczooLCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCVlZGksJWVieCw4KQotCW1vdgklZHMsJWRzOiglZWF4LDgpCi0JbW92CSVkcywlZHM6KCVlY3gsOCkKLQltb3YJJWRzLCVkczooJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZWJ4LDgpCi0JbW92CSVkcywlZHM6KCVlc3AsOCkKLQltb3YJJWRzLCVkczooLDgpCi0JbW92CSVkcywlZHM6KCVlc2ksOCkKLQltb3YJJWRzLCVkczooJWVkaSw4KQotCW1vdgklZHMsJWRzOiglZWF4LCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVicCw4KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVicCw4KQotCW1vdgklZHMsJWRzOiglZWRpLCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVheCwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZWR4LCVlc2ksOCkKLQltb3YJJWRzLCVkczooJWVieCwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVzaSw4KQotCW1vdgklZHMsJWRzOigsJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZXNpLCVlc2ksOCkKLQltb3YJJWRzLCVkczooJWVkaSwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVkaSw4KQotCW1vdgklZHMsJWRzOiglZWR4LCVlZGksOCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWRpLDgpCi0JbW92CSVkcywlZHM6KCVlYngsJWVkaSw4KQotCW1vdgklZHMsJWRzOiglZXNwLCVlZGksOCkKLQltb3YJJWRzLCVkczooLCVlZGksOCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWRpLDgpCi0JbW92CSVkcywlZHM6KCVlZGksJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWRpLDgpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVheCwxKQotCW1vdgklZHMsJWRzOiglZWJwLCVlY3gsMSkKLQltb3YJJWRzLCVkczooJWVicCwlZWR4LDEpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVieCwxKQotCW1vdgklZHMsJWRzOiglZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVicCwxKQotCW1vdgklZHMsJWRzOiglZWJwLCVlc2ksMSkKLQltb3YJJWRzLCVkczooJWVicCwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVheCwyKQotCW1vdgklZHMsJWRzOiglZWJwLCVlY3gsMikKLQltb3YJJWRzLCVkczooJWVicCwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVieCwyKQotCW1vdgklZHMsJWRzOiglZWJwLDIpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVicCwyKQotCW1vdgklZHMsJWRzOiglZWJwLCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVicCwlZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVheCw0KQotCW1vdgklZHMsJWRzOiglZWJwLCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVicCwlZWR4LDQpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVieCw0KQotCW1vdgklZHMsJWRzOiglZWJwLDQpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVicCw0KQotCW1vdgklZHMsJWRzOiglZWJwLCVlc2ksNCkKLQltb3YJJWRzLCVkczooJWVicCwlZWRpLDQpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVheCw4KQotCW1vdgklZHMsJWRzOiglZWJwLCVlY3gsOCkKLQltb3YJJWRzLCVkczooJWVicCwlZWR4LDgpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVieCw4KQotCW1vdgklZHMsJWRzOiglZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVicCw4KQotCW1vdgklZHMsJWRzOiglZWJwLCVlc2ksOCkKLQltb3YJJWRzLCVkczooJWVicCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMigsMSkKLQltb3YJJWRzLCVkczoweDEyKCwyKQotCW1vdgklZHMsJWRzOjB4MTIoLDQpCi0JbW92CSVkcywlZHM6MHgxMigsOCkKLQotCSMgRm9yY2UgYSBnb29kIGFsaWdubWVudC4KLQkuYnl0ZQkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L29wY29kZS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9vcGNvZGUuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRmNDlkNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L29wY29kZS5kCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLSNhczogLUoKLSNvYmpkdW1wOiAtZHcKLSNuYW1lOiBpMzg2IG9wY29kZQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDxmb28+OgotICAgMDoJMDAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICAgNjoJMDEgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgIGM6CTAyIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgMTI6CTAzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIDE4OgkwNCA5MCBbIAldKmFkZCAgICBcJDB4OTAsJWFsCi0gIDFhOgkwNSA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICBcJDB4OTA5MDkwOTAsJWVheAotICAxZjoJMDYgWyAJXSpwdXNoICAgJWVzCi0gIDIwOgkwNyBbIAldKnBvcCAgICAlZXMKLSAgMjE6CTA4IDkwIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgMjc6CTA5IDkwIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDJkOgkwYSA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIDMzOgkwYiA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICAzOToJMGMgOTAgWyAJXSpvciAgICAgXCQweDkwLCVhbAotICAzYjoJMGQgOTAgOTAgOTAgOTAgWyAJXSpvciAgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAgNDA6CTBlIFsgCV0qcHVzaCAgICVjcwotICA0MToJMTAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICA0NzoJMTEgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgNGQ6CTEyIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgNTM6CTEzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIDU5OgkxNCA5MCBbIAldKmFkYyAgICBcJDB4OTAsJWFsCi0gIDViOgkxNSA5MCA5MCA5MCA5MCBbIAldKmFkYyAgICBcJDB4OTA5MDkwOTAsJWVheAotICA2MDoJMTYgWyAJXSpwdXNoICAgJXNzCi0gIDYxOgkxNyBbIAldKnBvcCAgICAlc3MKLSAgNjI6CTE4IDkwIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgNjg6CTE5IDkwIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDZlOgkxYSA5MCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIDc0OgkxYiA5MCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICA3YToJMWMgOTAgWyAJXSpzYmIgICAgXCQweDkwLCVhbAotICA3YzoJMWQgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAgODE6CTFlIFsgCV0qcHVzaCAgICVkcwotICA4MjoJMWYgWyAJXSpwb3AgICAgJWRzCi0gIDgzOgkyMCA5MCA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDg5OgkyMSA5MCA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICA4ZjoJMjIgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICA5NToJMjMgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgOWI6CTI0IDkwIFsgCV0qYW5kICAgIFwkMHg5MCwlYWwKLSAgOWQ6CTI1IDkwIDkwIDkwIDkwIFsgCV0qYW5kICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gIGEyOgkyNyBbIAldKmRhYSAgICAKLSAgYTM6CTI4IDkwIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgYTk6CTI5IDkwIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gIGFmOgkyYSA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIGI1OgkyYiA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICBiYjoJMmMgOTAgWyAJXSpzdWIgICAgXCQweDkwLCVhbAotICBiZDoJMmQgOTAgOTAgOTAgOTAgWyAJXSpzdWIgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAgYzI6CTJmIFsgCV0qZGFzICAgIAotICBjMzoJMzAgOTAgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICBjOToJMzEgOTAgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgY2Y6CTMyIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgZDU6CTMzIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIGRiOgkzNCA5MCBbIAldKnhvciAgICBcJDB4OTAsJWFsCi0gIGRkOgkzNSA5MCA5MCA5MCA5MCBbIAldKnhvciAgICBcJDB4OTA5MDkwOTAsJWVheAotICBlMjoJMzcgWyAJXSphYWEgICAgCi0gIGUzOgkzOCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gIGU5OgkzOSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICBlZjoJM2EgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICBmNToJM2IgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgZmI6CTNjIDkwIFsgCV0qY21wICAgIFwkMHg5MCwlYWwKLSAgZmQ6CTNkIDkwIDkwIDkwIDkwIFsgCV0qY21wICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gMTAyOgkzZiBbIAldKmFhcyAgICAKLSAxMDM6CTQwIFsgCV0qaW5jICAgICVlYXgKLSAxMDQ6CTQxIFsgCV0qaW5jICAgICVlY3gKLSAxMDU6CTQyIFsgCV0qaW5jICAgICVlZHgKLSAxMDY6CTQzIFsgCV0qaW5jICAgICVlYngKLSAxMDc6CTQ0IFsgCV0qaW5jICAgICVlc3AKLSAxMDg6CTQ1IFsgCV0qaW5jICAgICVlYnAKLSAxMDk6CTQ2IFsgCV0qaW5jICAgICVlc2kKLSAxMGE6CTQ3IFsgCV0qaW5jICAgICVlZGkKLSAxMGI6CTQ4IFsgCV0qZGVjICAgICVlYXgKLSAxMGM6CTQ5IFsgCV0qZGVjICAgICVlY3gKLSAxMGQ6CTRhIFsgCV0qZGVjICAgICVlZHgKLSAxMGU6CTRiIFsgCV0qZGVjICAgICVlYngKLSAxMGY6CTRjIFsgCV0qZGVjICAgICVlc3AKLSAxMTA6CTRkIFsgCV0qZGVjICAgICVlYnAKLSAxMTE6CTRlIFsgCV0qZGVjICAgICVlc2kKLSAxMTI6CTRmIFsgCV0qZGVjICAgICVlZGkKLSAxMTM6CTUwIFsgCV0qcHVzaCAgICVlYXgKLSAxMTQ6CTUxIFsgCV0qcHVzaCAgICVlY3gKLSAxMTU6CTUyIFsgCV0qcHVzaCAgICVlZHgKLSAxMTY6CTUzIFsgCV0qcHVzaCAgICVlYngKLSAxMTc6CTU0IFsgCV0qcHVzaCAgICVlc3AKLSAxMTg6CTU1IFsgCV0qcHVzaCAgICVlYnAKLSAxMTk6CTU2IFsgCV0qcHVzaCAgICVlc2kKLSAxMWE6CTU3IFsgCV0qcHVzaCAgICVlZGkKLSAxMWI6CTU4IFsgCV0qcG9wICAgICVlYXgKLSAxMWM6CTU5IFsgCV0qcG9wICAgICVlY3gKLSAxMWQ6CTVhIFsgCV0qcG9wICAgICVlZHgKLSAxMWU6CTViIFsgCV0qcG9wICAgICVlYngKLSAxMWY6CTVjIFsgCV0qcG9wICAgICVlc3AKLSAxMjA6CTVkIFsgCV0qcG9wICAgICVlYnAKLSAxMjE6CTVlIFsgCV0qcG9wICAgICVlc2kKLSAxMjI6CTVmIFsgCV0qcG9wICAgICVlZGkKLSAxMjM6CTYwIFsgCV0qcHVzaGEgIAotIDEyNDoJNjEgWyAJXSpwb3BhICAgCi0gMTI1Ogk2MiA5MCA5MCA5MCA5MCA5MCBbIAldKmJvdW5kICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDEyYjoJNjMgOTAgOTAgOTAgOTAgOTAgWyAJXSphcnBsICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDEzMToJNjggOTAgOTAgOTAgOTAgWyAJXSpwdXNoICAgXCQweDkwOTA5MDkwCi0gMTM2Ogk2OSA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmltdWwgICBcJDB4OTA5MDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAxNDA6CTZhIDkwIFsgCV0qcHVzaCAgIFwkMHhmZmZmZmY5MAotIDE0MjoJNmIgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSppbXVsICAgXCQweGZmZmZmZjkwLDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMTQ5Ogk2YyBbIAldKmluc2IgICBcKCVkeFwpLCVlczpcKCVlZGlcKQotIDE0YToJNmQgWyAJXSppbnNsICAgXCglZHhcKSwlZXM6XCglZWRpXCkKLSAxNGI6CTZlIFsgCV0qb3V0c2IgICVkczpcKCVlc2lcKSxcKCVkeFwpCi0gMTRjOgk2ZiBbIAldKm91dHNsICAlZHM6XCglZXNpXCksXCglZHhcKQotIDE0ZDoJNzAgOTAgWyAJXSpqbyAgICAgKDB4KT9kZi4qCi0gMTRmOgk3MSA5MCBbIAldKmpubyAgICAoMHgpP2UxLioKLSAxNTE6CTcyIDkwIFsgCV0qamIgICAgICgweCk/ZTMuKgotIDE1MzoJNzMgOTAgWyAJXSpqYWUgICAgKDB4KT9lNS4qCi0gMTU1Ogk3NCA5MCBbIAldKmplICAgICAoMHgpP2U3LioKLSAxNTc6CTc1IDkwIFsgCV0qam5lICAgICgweCk/ZTkuKgotIDE1OToJNzYgOTAgWyAJXSpqYmUgICAgKDB4KT9lYi4qCi0gMTViOgk3NyA5MCBbIAldKmphICAgICAoMHgpP2VkLioKLSAxNWQ6CTc4IDkwIFsgCV0qanMgICAgICgweCk/ZWYuKgotIDE1ZjoJNzkgOTAgWyAJXSpqbnMgICAgKDB4KT9mMS4qCi0gMTYxOgk3YSA5MCBbIAldKmpwICAgICAoMHgpP2YzLioKLSAxNjM6CTdiIDkwIFsgCV0qam5wICAgICgweCk/ZjUuKgotIDE2NToJN2MgOTAgWyAJXSpqbCAgICAgKDB4KT9mNy4qCi0gMTY3Ogk3ZCA5MCBbIAldKmpnZSAgICAoMHgpP2Y5LioKLSAxNjk6CTdlIDkwIFsgCV0qamxlICAgICgweCk/ZmIuKgotIDE2YjoJN2YgOTAgWyAJXSpqZyAgICAgKDB4KT9mZC4qCi0gMTZkOgk4MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkY2IgICBcJDB4OTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTc0Ogk4MSA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkY2wgICBcJDB4OTA5MDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTdlOgk4MyA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkY2wgICBcJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTg1Ogk4NCA5MCA5MCA5MCA5MCA5MCBbIAldKnRlc3QgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gMThiOgk4NSA5MCA5MCA5MCA5MCA5MCBbIAldKnRlc3QgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDE5MToJODYgOTAgOTAgOTAgOTAgOTAgWyAJXSp4Y2hnICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDE5NzoJODcgOTAgOTAgOTAgOTAgOTAgWyAJXSp4Y2hnICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAxOWQ6CTg4IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAxYTM6CTg5IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gMWE5Ogk4YSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gMWFmOgk4YiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDFiNToJOGMgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZsICAgJXNzLDB4OTA5MDkwOTBcKCVlYXhcKQotIDFiYjoJOGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZWEgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAxYzE6CThlIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92bCAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlc3MKLSAxYzc6CThmIDgwIDkwIDkwIDkwIDkwIFsgCV0qcG9wbCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDFjZDoJOTAgWyAJXSpub3AgICAgCi0gMWNlOgk5MSBbIAldKnhjaGcgICAlZWF4LCVlY3gKLSAxY2Y6CTkyIFsgCV0qeGNoZyAgICVlYXgsJWVkeAotIDFkMDoJOTMgWyAJXSp4Y2hnICAgJWVheCwlZWJ4Ci0gMWQxOgk5NCBbIAldKnhjaGcgICAlZWF4LCVlc3AKLSAxZDI6CTk1IFsgCV0qeGNoZyAgICVlYXgsJWVicAotIDFkMzoJOTYgWyAJXSp4Y2hnICAgJWVheCwlZXNpCi0gMWQ0Ogk5NyBbIAldKnhjaGcgICAlZWF4LCVlZGkKLSAxZDU6CTk4IFsgCV0qY3d0bCAgIAotIDFkNjoJOTkgWyAJXSpjbHRkICAgCi0gMWQ3Ogk5YSA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmxjYWxsICBcJDB4OTA5MCxcJDB4OTA5MDkwOTAKLSAxZGU6CTliIFsgCV0qZndhaXQKLSAxZGY6CTljIFsgCV0qcHVzaGYgIAotIDFlMDoJOWQgWyAJXSpwb3BmICAgCi0gMWUxOgk5ZSBbIAldKnNhaGYgICAKLSAxZTI6CTlmIFsgCV0qbGFoZiAgIAotIDFlMzoJYTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgMHg5MDkwOTA5MCwlYWwKLSAxZTg6CWExIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIDB4OTA5MDkwOTAsJWVheAotIDFlZDoJYTIgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWFsLDB4OTA5MDkwOTAKLSAxZjI6CWEzIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVlYXgsMHg5MDkwOTA5MAotIDFmNzoJYTQgWyAJXSptb3ZzYiAgJWRzOlwoJWVzaVwpLCVlczpcKCVlZGlcKQotIDFmODoJYTUgWyAJXSptb3ZzbCAgJWRzOlwoJWVzaVwpLCVlczpcKCVlZGlcKQotIDFmOToJYTYgWyAJXSpjbXBzYiAgJWVzOlwoJWVkaVwpLCVkczpcKCVlc2lcKQotIDFmYToJYTcgWyAJXSpjbXBzbCAgJWVzOlwoJWVkaVwpLCVkczpcKCVlc2lcKQotIDFmYjoJYTggOTAgWyAJXSp0ZXN0ICAgXCQweDkwLCVhbAotIDFmZDoJYTkgOTAgOTAgOTAgOTAgWyAJXSp0ZXN0ICAgXCQweDkwOTA5MDkwLCVlYXgKLSAyMDI6CWFhIFsgCV0qc3RvcyAgICVhbCwlZXM6XCglZWRpXCkKLSAyMDM6CWFiIFsgCV0qc3RvcyAgICVlYXgsJWVzOlwoJWVkaVwpCi0gMjA0OglhYyBbIAldKmxvZHMgICAlZHM6XCglZXNpXCksJWFsCi0gMjA1OglhZCBbIAldKmxvZHMgICAlZHM6XCglZXNpXCksJWVheAotIDIwNjoJYWUgWyAJXSpzY2FzICAgJWVzOlwoJWVkaVwpLCVhbAotIDIwNzoJYWYgWyAJXSpzY2FzICAgJWVzOlwoJWVkaVwpLCVlYXgKLSAyMDg6CWIwIDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlYWwKLSAyMGE6CWIxIDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlY2wKLSAyMGM6CWIyIDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlZGwKLSAyMGU6CWIzIDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlYmwKLSAyMTA6CWI0IDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlYWgKLSAyMTI6CWI1IDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlY2gKLSAyMTQ6CWI2IDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlZGgKLSAyMTY6CWI3IDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlYmgKLSAyMTg6CWI4IDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gMjFkOgliOSA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVjeAotIDIyMjoJYmEgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlZHgKLSAyMjc6CWJiIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZWJ4Ci0gMjJjOgliYyA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVzcAotIDIzMToJYmQgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlYnAKLSAyMzY6CWJlIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZXNpCi0gMjNiOgliZiA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVkaQotIDI0MDoJYzAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xiICAgXCQweDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDI0NzoJYzEgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xsICAgXCQweDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDI0ZToJYzIgOTAgOTAgWyAJXSpyZXQgICAgXCQweDkwOTAKLSAyNTE6CWMzIFsgCV0qcmV0ICAgIAotIDI1MjoJYzQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZXMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAyNTg6CWM1IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGRzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMjVlOgljNiA4MCA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmIgICBcJDB4OTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMjY1OgljNyA4MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmwgICBcJDB4OTA5MDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMjZmOgljOCA5MCA5MCA5MCBbIAldKmVudGVyICBcJDB4OTA5MCxcJDB4OTAKLSAyNzM6CWM5IFsgCV0qbGVhdmUgIAotIDI3NDoJY2EgOTAgOTAgWyAJXSpscmV0ICAgXCQweDkwOTAKLSAyNzc6CWNiIFsgCV0qbHJldCAgIAotIDI3ODoJY2MgWyAJXSppbnQzICAgCi0gMjc5OgljZCA5MCBbIAldKmludCAgICBcJDB4OTAKLSAyN2I6CWNlIFsgCV0qaW50byAgIAotIDI3YzoJY2YgWyAJXSppcmV0ICAgCi0gMjdkOglkMCA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbGIgICAweDkwOTA5MDkwXCglZWF4XCkKLSAyODM6CWQxIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsbCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDI4OToJZDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xiICAgJWNsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDI4ZjoJZDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xsICAgJWNsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDI5NToJZDQgOTAgWyAJXSphYW0gICAgXCQweGZmZmZmZjkwCi0gMjk3OglkNSA5MCBbIAldKmFhZCAgICBcJDB4ZmZmZmZmOTAKLSAyOTk6CWQ3IFsgCV0qeGxhdCAgICVkczpcKCVlYnhcKQotIDI5YToJZDggOTAgOTAgOTAgOTAgOTAgWyAJXSpmY29tcyAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmEwOglkOSA5MCA5MCA5MCA5MCA5MCBbIAldKmZzdHMgICAweDkwOTA5MDkwXCglZWF4XCkKLSAyYTY6CWRhIDkwIDkwIDkwIDkwIDkwIFsgCV0qZmljb21sIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJhYzoJZGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpmaXN0bCAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmIyOglkYyA5MCA5MCA5MCA5MCA5MCBbIAldKmZjb21sICAweDkwOTA5MDkwXCglZWF4XCkKLSAyYjg6CWRkIDkwIDkwIDkwIDkwIDkwIFsgCV0qZnN0bCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJiZToJZGUgOTAgOTAgOTAgOTAgOTAgWyAJXSpmaWNvbSAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmM0OglkZiA5MCA5MCA5MCA5MCA5MCBbIAldKmZpc3QgICAweDkwOTA5MDkwXCglZWF4XCkKLSAyY2E6CWUwIDkwIFsgCV0qbG9vcG5lICgweCk/MjVjLioKLSAyY2M6CWUxIDkwIFsgCV0qbG9vcGUgICgweCk/MjVlLioKLSAyY2U6CWUyIDkwIFsgCV0qbG9vcCAgICgweCk/MjYwLioKLSAyZDA6CWUzIDkwIFsgCV0qamVjeHogICgweCk/MjYyLioKLSAyZDI6CWU0IDkwIFsgCV0qaW4gICAgIFwkMHg5MCwlYWwKLSAyZDQ6CWU1IDkwIFsgCV0qaW4gICAgIFwkMHg5MCwlZWF4Ci0gMmQ2OgllNiA5MCBbIAldKm91dCAgICAlYWwsXCQweDkwCi0gMmQ4OgllNyA5MCBbIAldKm91dCAgICAlZWF4LFwkMHg5MAotIDJkYToJZTggOTAgOTAgOTAgOTAgWyAJXSpjYWxsICAgKDB4KT85MDkwOTM2Zi4qCi0gMmRmOgllOSA5MCA5MCA5MCA5MCBbIAldKmptcCAgICAoMHgpPzkwOTA5Mzc0LioKLSAyZTQ6CWVhIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGptcCAgIFwkMHg5MDkwLFwkMHg5MDkwOTA5MAotIDJlYjoJZWIgOTAgWyAJXSpqbXAgICAgKDB4KT8yN2QuKgotIDJlZDoJZWMgWyAJXSppbiAgICAgXCglZHhcKSwlYWwKLSAyZWU6CWVkIFsgCV0qaW4gICAgIFwoJWR4XCksJWVheAotIDJlZjoJZWUgWyAJXSpvdXQgICAgJWFsLFwoJWR4XCkKLSAyZjA6CWVmIFsgCV0qb3V0ICAgICVlYXgsXCglZHhcKQotIDJmMToJZjQgWyAJXSpobHQgICAgCi0gMmYyOglmNSBbIAldKmNtYyAgICAKLSAyZjM6CWY2IDkwIDkwIDkwIDkwIDkwIFsgCV0qbm90YiAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJmOToJZjcgOTAgOTAgOTAgOTAgOTAgWyAJXSpub3RsICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmZmOglmOCBbIAldKmNsYyAgICAKLSAzMDA6CWY5IFsgCV0qc3RjICAgIAotIDMwMToJZmEgWyAJXSpjbGkgICAgCi0gMzAyOglmYiBbIAldKnN0aSAgICAKLSAzMDM6CWZjIFsgCV0qY2xkICAgIAotIDMwNDoJZmQgWyAJXSpzdGQgICAgCi0gMzA1OglmZiA5MCA5MCA5MCA5MCA5MCBbIAldKmNhbGwgICBcKjB4OTA5MDkwOTBcKCVlYXhcKQotIDMwYjoJMGYgMDAgOTAgOTAgOTAgOTAgOTAgWyAJXSpsbGR0ICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMzEyOgkwZiAwMSA5MCA5MCA5MCA5MCA5MCBbIAldKmxnZHQgICAweDkwOTA5MDkwXCglZWF4XCkKLSAzMTk6CTBmIDAyIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGFyICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzIwOgkwZiAwMyA5MCA5MCA5MCA5MCA5MCBbIAldKmxzbCAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDMyNzoJMGYgMDYgWyAJXSpjbHRzICAgCi0gMzI5OgkwZiAwOCBbIAldKmludmQgICAKLSAzMmI6CTBmIDA5IFsgCV0qd2JpbnZkIAotIDMyZDoJMGYgMGIgWyAJXSp1ZDJhICAgCi0gMzJmOgkwZiAyMCBkMCBbIAldKm1vdiAgICAlY3IyLCVlYXgKLSAzMzI6CTBmIDIxIGQwIFsgCV0qbW92ICAgICVkYjIsJWVheAotIDMzNToJMGYgMjIgZDAgWyAJXSptb3YgICAgJWVheCwlY3IyCi0gMzM4OgkwZiAyMyBkMCBbIAldKm1vdiAgICAlZWF4LCVkYjIKLSAzM2I6CTBmIDI0IGQwIFsgCV0qbW92ICAgICV0cjIsJWVheAotIDMzZToJMGYgMjYgZDAgWyAJXSptb3YgICAgJWVheCwldHIyCi0gMzQxOgkwZiAzMCBbIAldKndybXNyICAKLSAzNDM6CTBmIDMxIFsgCV0qcmR0c2MgIAotIDM0NToJMGYgMzIgWyAJXSpyZG1zciAgCi0gMzQ3OgkwZiAzMyBbIAldKnJkcG1jICAKLSAzNDk6CTBmIDQwIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm8gIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzUwOgkwZiA0MSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZubyAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM1NzoJMGYgNDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YiAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzNWU6CTBmIDQzIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmFlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzY1OgkwZiA0NCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZlICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM2YzoJMGYgNDUgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bmUgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzNzM6CTBmIDQ2IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmJlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzdhOgkwZiA0NyA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZhICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM4MToJMGYgNDggOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92cyAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzODg6CTBmIDQ5IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5zIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzhmOgkwZiA0YSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZwICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM5NjoJMGYgNGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bnAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzOWQ6CTBmIDRjIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmwgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gM2E0OgkwZiA0ZCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZnZSAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDNhYjoJMGYgNGUgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bGUgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzYjI6CTBmIDRmIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmcgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gM2I5OgkwZiA2MCA5MCA5MCA5MCA5MCA5MCBbIAldKnB1bnBja2xidyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNjMDoJMGYgNjEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwdW5wY2tsd2QgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzYzc6CTBmIDYyIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHVucGNrbGRxIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2NlOgkwZiA2MyA5MCA5MCA5MCA5MCA5MCBbIAldKnBhY2tzc3diIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2Q1OgkwZiA2NCA5MCA5MCA5MCA5MCA5MCBbIAldKnBjbXBndGIgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzZGM6CTBmIDY1IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGNtcGd0dyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNlMzoJMGYgNjYgOTAgOTAgOTAgOTAgOTAgWyAJXSpwY21wZ3RkIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2VhOgkwZiA2NyA5MCA5MCA5MCA5MCA5MCBbIAldKnBhY2t1c3diIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2YxOgkwZiA2OCA5MCA5MCA5MCA5MCA5MCBbIAldKnB1bnBja2hidyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNmODoJMGYgNjkgOTAgOTAgOTAgOTAgOTAgWyAJXSpwdW5wY2tod2QgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzZmY6CTBmIDZhIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHVucGNraGRxIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNDA2OgkwZiA2YiA5MCA5MCA5MCA5MCA5MCBbIAldKnBhY2tzc2R3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNDBkOgkwZiA2ZSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmQgICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDQxNDoJMGYgNmYgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZxICAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA0MWI6CTBmIDcxIGQwIDkwIFsgCV0qcHNybHcgIFwkMHg5MCwlbW0wCi0gNDFmOgkwZiA3MiBkMCA5MCBbIAldKnBzcmxkICBcJDB4OTAsJW1tMAotIDQyMzoJMGYgNzMgZDAgOTAgWyAJXSpwc3JscSAgXCQweDkwLCVtbTAKLSA0Mjc6CTBmIDc0IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGNtcGVxYiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDQyZToJMGYgNzUgOTAgOTAgOTAgOTAgOTAgWyAJXSpwY21wZXF3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNDM1OgkwZiA3NiA5MCA5MCA5MCA5MCA5MCBbIAldKnBjbXBlcWQgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA0M2M6CTBmIDc3IFsgCV0qZW1tcyAgIAotIDQzZToJMGYgN2UgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZkICAgJW1tMiwweDkwOTA5MDkwXCglZWF4XCkKLSA0NDU6CTBmIDdmIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92cSAgICVtbTIsMHg5MDkwOTA5MFwoJWVheFwpCi0gNDRjOgkwZiA4MCA5MCA5MCA5MCA5MCBbIAldKmpvICAgICAoMHgpPzkwOTA5NGUyLioKLSA0NTI6CTBmIDgxIDkwIDkwIDkwIDkwIFsgCV0qam5vICAgICgweCk/OTA5MDk0ZTguKgotIDQ1ODoJMGYgODIgOTAgOTAgOTAgOTAgWyAJXSpqYiAgICAgKDB4KT85MDkwOTRlZS4qCi0gNDVlOgkwZiA4MyA5MCA5MCA5MCA5MCBbIAldKmphZSAgICAoMHgpPzkwOTA5NGY0LioKLSA0NjQ6CTBmIDg0IDkwIDkwIDkwIDkwIFsgCV0qamUgICAgICgweCk/OTA5MDk0ZmEuKgotIDQ2YToJMGYgODUgOTAgOTAgOTAgOTAgWyAJXSpqbmUgICAgKDB4KT85MDkwOTUwMC4qCi0gNDcwOgkwZiA4NiA5MCA5MCA5MCA5MCBbIAldKmpiZSAgICAoMHgpPzkwOTA5NTA2LioKLSA0NzY6CTBmIDg3IDkwIDkwIDkwIDkwIFsgCV0qamEgICAgICgweCk/OTA5MDk1MGMuKgotIDQ3YzoJMGYgODggOTAgOTAgOTAgOTAgWyAJXSpqcyAgICAgKDB4KT85MDkwOTUxMi4qCi0gNDgyOgkwZiA4OSA5MCA5MCA5MCA5MCBbIAldKmpucyAgICAoMHgpPzkwOTA5NTE4LioKLSA0ODg6CTBmIDhhIDkwIDkwIDkwIDkwIFsgCV0qanAgICAgICgweCk/OTA5MDk1MWUuKgotIDQ4ZToJMGYgOGIgOTAgOTAgOTAgOTAgWyAJXSpqbnAgICAgKDB4KT85MDkwOTUyNC4qCi0gNDk0OgkwZiA4YyA5MCA5MCA5MCA5MCBbIAldKmpsICAgICAoMHgpPzkwOTA5NTJhLioKLSA0OWE6CTBmIDhkIDkwIDkwIDkwIDkwIFsgCV0qamdlICAgICgweCk/OTA5MDk1MzAuKgotIDRhMDoJMGYgOGUgOTAgOTAgOTAgOTAgWyAJXSpqbGUgICAgKDB4KT85MDkwOTUzNi4qCi0gNGE2OgkwZiA4ZiA5MCA5MCA5MCA5MCBbIAldKmpnICAgICAoMHgpPzkwOTA5NTNjLioKLSA0YWM6CTBmIDkwIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0byAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRiMzoJMGYgOTEgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRubyAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGJhOgkwZiA5MiA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGIgICAweDkwOTA5MDkwXCglZWF4XCkKLSA0YzE6CTBmIDkzIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0YWUgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRjODoJMGYgOTQgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRlICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGNmOgkwZiA5NSA4MCA5MCA5MCA5MCA5MCBbIAldKnNldG5lICAweDkwOTA5MDkwXCglZWF4XCkKLSA0ZDY6CTBmIDk2IDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0YmUgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRkZDoJMGYgOTcgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRhICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGU0OgkwZiA5OCA4MCA5MCA5MCA5MCA5MCBbIAldKnNldHMgICAweDkwOTA5MDkwXCglZWF4XCkKLSA0ZWI6CTBmIDk5IDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0bnMgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRmMjoJMGYgOWEgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRwICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGY5OgkwZiA5YiA4MCA5MCA5MCA5MCA5MCBbIAldKnNldG5wICAweDkwOTA5MDkwXCglZWF4XCkKLSA1MDA6CTBmIDljIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0bCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDUwNzoJMGYgOWQgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRnZSAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNTBlOgkwZiA5ZSA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGxlICAweDkwOTA5MDkwXCglZWF4XCkKLSA1MTU6CTBmIDlmIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0ZyAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDUxYzoJMGYgYTAgWyAJXSpwdXNoICAgJWZzCi0gNTFlOgkwZiBhMSBbIAldKnBvcCAgICAlZnMKLSA1MjA6CTBmIGEyIFsgCV0qY3B1aWQgIAotIDUyMjoJMGYgYTMgOTAgOTAgOTAgOTAgOTAgWyAJXSpidCAgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1Mjk6CTBmIGE0IDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hsZCAgIFwkMHg5MCwlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDUzMToJMGYgYTUgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaGxkICAgJWNsLCVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTM4OgkwZiBhOCBbIAldKnB1c2ggICAlZ3MKLSA1M2E6CTBmIGE5IFsgCV0qcG9wICAgICVncwotIDUzYzoJMGYgYWEgWyAJXSpyc20gICAgCi0gNTNlOgkwZiBhYiA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0cyAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDU0NToJMGYgYWMgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaHJkICAgXCQweDkwLCVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTRkOgkwZiBhZCA5MCA5MCA5MCA5MCA5MCBbIAldKnNocmQgICAlY2wsJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1NTQ6CTBmIGFmIDkwIDkwIDkwIDkwIDkwIFsgCV0qaW11bCAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNTViOgkwZiBiMCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcHhjaGcgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDU2MjoJMGYgYjEgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXB4Y2hnICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTY5OgkwZiBiMiA5MCA5MCA5MCA5MCA5MCBbIAldKmxzcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDU3MDoJMGYgYjMgOTAgOTAgOTAgOTAgOTAgWyAJXSpidHIgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1Nzc6CTBmIGI0IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGZzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNTdlOgkwZiBiNSA5MCA5MCA5MCA5MCA5MCBbIAldKmxncyAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDU4NToJMGYgYjYgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3Z6YmwgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1OGM6CTBmIGI3IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92endsIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNTkzOgkwZiBiOSBbIAldKnVkMmIgICAKLSA1OTU6CTBmIGJiIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnRjICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTljOgkwZiBiYyA5MCA5MCA5MCA5MCA5MCBbIAldKmJzZiAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDVhMzoJMGYgYmQgOTAgOTAgOTAgOTAgOTAgWyAJXSpic3IgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1YWE6CTBmIGJlIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92c2JsIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNWIxOgkwZiBiZiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnN3bCAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDViODoJMGYgYzAgOTAgOTAgOTAgOTAgOTAgWyAJXSp4YWRkICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDViZjoJMGYgYzEgOTAgOTAgOTAgOTAgOTAgWyAJXSp4YWRkICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1YzY6CTBmIGM4IFsgCV0qYnN3YXAgICVlYXgKLSA1Yzg6CTBmIGM5IFsgCV0qYnN3YXAgICVlY3gKLSA1Y2E6CTBmIGNhIFsgCV0qYnN3YXAgICVlZHgKLSA1Y2M6CTBmIGNiIFsgCV0qYnN3YXAgICVlYngKLSA1Y2U6CTBmIGNjIFsgCV0qYnN3YXAgICVlc3AKLSA1ZDA6CTBmIGNkIFsgCV0qYnN3YXAgICVlYnAKLSA1ZDI6CTBmIGNlIFsgCV0qYnN3YXAgICVlc2kKLSA1ZDQ6CTBmIGNmIFsgCV0qYnN3YXAgICVlZGkKLSA1ZDY6CTBmIGQxIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNybHcgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNWRkOgkwZiBkMiA5MCA5MCA5MCA5MCA5MCBbIAldKnBzcmxkICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDVlNDoJMGYgZDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3JscSAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA1ZWI6CTBmIGQ1IDkwIDkwIDkwIDkwIDkwIFsgCV0qcG11bGx3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNWYyOgkwZiBkOCA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJ1c2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA1Zjk6CTBmIGQ5IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YnVzdyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYwMDoJMGYgZGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYW5kICAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MDc6CTBmIGRjIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZHVzYiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYwZToJMGYgZGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkdXN3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjE1OgkwZiBkZiA5MCA5MCA5MCA5MCA5MCBbIAldKnBhbmRuICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYxYzoJMGYgZTEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3JhdyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MjM6CTBmIGUyIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNyYWQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjJhOgkwZiBlNSA5MCA5MCA5MCA5MCA5MCBbIAldKnBtdWxodyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYzMToJMGYgZTggOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3Vic2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2Mzg6CTBmIGU5IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YnN3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjNmOgkwZiBlYiA5MCA5MCA5MCA5MCA5MCBbIAldKnBvciAgICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY0NjoJMGYgZWMgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkc2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2NGQ6CTBmIGVkIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZHN3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjU0OgkwZiBlZiA5MCA5MCA5MCA5MCA5MCBbIAldKnB4b3IgICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY1YjoJMGYgZjEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc2xsdyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2NjI6CTBmIGYyIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNsbGQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjY5OgkwZiBmMyA5MCA5MCA5MCA5MCA5MCBbIAldKnBzbGxxICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY3MDoJMGYgZjUgOTAgOTAgOTAgOTAgOTAgWyAJXSpwbWFkZHdkIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjc3OgkwZiBmOCA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJiICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY3ZToJMGYgZjkgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3VidyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2ODU6CTBmIGZhIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YmQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjhjOgkwZiBmYyA5MCA5MCA5MCA5MCA5MCBbIAldKnBhZGRiICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY5MzoJMGYgZmQgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkdyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2OWE6CTBmIGZlIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZGQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNmExOgk2NiAwMSA5MCA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNmE4Ogk2NiAwMyA5MCA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNmFmOgk2NiAwNSA5MCA5MCBbIAldKmFkZCAgICBcJDB4OTA5MCwlYXgKLSA2YjM6CTY2IDA2IFsgCV0qcHVzaHcgICVlcwotIDZiNToJNjYgMDcgWyAJXSpwb3B3ICAgJWVzCi0gNmI3Ogk2NiAwOSA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNmJlOgk2NiAwYiA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNmM1Ogk2NiAwZCA5MCA5MCBbIAldKm9yICAgICBcJDB4OTA5MCwlYXgKLSA2Yzk6CTY2IDBlIFsgCV0qcHVzaHcgICVjcwotIDZjYjoJNjYgMTEgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDZkMjoJNjYgMTMgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDZkOToJNjYgMTUgOTAgOTAgWyAJXSphZGMgICAgXCQweDkwOTAsJWF4Ci0gNmRkOgk2NiAxNiBbIAldKnB1c2h3ICAlc3MKLSA2ZGY6CTY2IDE3IFsgCV0qcG9wdyAgICVzcwotIDZlMToJNjYgMTkgOTAgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDZlODoJNjYgMWIgOTAgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDZlZjoJNjYgMWQgOTAgOTAgWyAJXSpzYmIgICAgXCQweDkwOTAsJWF4Ci0gNmYzOgk2NiAxZSBbIAldKnB1c2h3ICAlZHMKLSA2ZjU6CTY2IDFmIFsgCV0qcG9wdyAgICVkcwotIDZmNzoJNjYgMjEgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDZmZToJNjYgMjMgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDcwNToJNjYgMjUgOTAgOTAgWyAJXSphbmQgICAgXCQweDkwOTAsJWF4Ci0gNzA5Ogk2NiAyOSA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNzEwOgk2NiAyYiA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNzE3Ogk2NiAyZCA5MCA5MCBbIAldKnN1YiAgICBcJDB4OTA5MCwlYXgKLSA3MWI6CTY2IDMxIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA3MjI6CTY2IDMzIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA3Mjk6CTY2IDM1IDkwIDkwIFsgCV0qeG9yICAgIFwkMHg5MDkwLCVheAotIDcyZDoJNjYgMzkgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDczNDoJNjYgM2IgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDczYjoJNjYgM2QgOTAgOTAgWyAJXSpjbXAgICAgXCQweDkwOTAsJWF4Ci0gNzNmOgk2NiA0MCBbIAldKmluYyAgICAlYXgKLSA3NDE6CTY2IDQxIFsgCV0qaW5jICAgICVjeAotIDc0MzoJNjYgNDIgWyAJXSppbmMgICAgJWR4Ci0gNzQ1Ogk2NiA0MyBbIAldKmluYyAgICAlYngKLSA3NDc6CTY2IDQ0IFsgCV0qaW5jICAgICVzcAotIDc0OToJNjYgNDUgWyAJXSppbmMgICAgJWJwCi0gNzRiOgk2NiA0NiBbIAldKmluYyAgICAlc2kKLSA3NGQ6CTY2IDQ3IFsgCV0qaW5jICAgICVkaQotIDc0ZjoJNjYgNDggWyAJXSpkZWMgICAgJWF4Ci0gNzUxOgk2NiA0OSBbIAldKmRlYyAgICAlY3gKLSA3NTM6CTY2IDRhIFsgCV0qZGVjICAgICVkeAotIDc1NToJNjYgNGIgWyAJXSpkZWMgICAgJWJ4Ci0gNzU3Ogk2NiA0YyBbIAldKmRlYyAgICAlc3AKLSA3NTk6CTY2IDRkIFsgCV0qZGVjICAgICVicAotIDc1YjoJNjYgNGUgWyAJXSpkZWMgICAgJXNpCi0gNzVkOgk2NiA0ZiBbIAldKmRlYyAgICAlZGkKLSA3NWY6CTY2IDUwIFsgCV0qcHVzaCAgICVheAotIDc2MToJNjYgNTEgWyAJXSpwdXNoICAgJWN4Ci0gNzYzOgk2NiA1MiBbIAldKnB1c2ggICAlZHgKLSA3NjU6CTY2IDUzIFsgCV0qcHVzaCAgICVieAotIDc2NzoJNjYgNTQgWyAJXSpwdXNoICAgJXNwCi0gNzY5Ogk2NiA1NSBbIAldKnB1c2ggICAlYnAKLSA3NmI6CTY2IDU2IFsgCV0qcHVzaCAgICVzaQotIDc2ZDoJNjYgNTcgWyAJXSpwdXNoICAgJWRpCi0gNzZmOgk2NiA1OCBbIAldKnBvcCAgICAlYXgKLSA3NzE6CTY2IDU5IFsgCV0qcG9wICAgICVjeAotIDc3MzoJNjYgNWEgWyAJXSpwb3AgICAgJWR4Ci0gNzc1Ogk2NiA1YiBbIAldKnBvcCAgICAlYngKLSA3Nzc6CTY2IDVjIFsgCV0qcG9wICAgICVzcAotIDc3OToJNjYgNWQgWyAJXSpwb3AgICAgJWJwCi0gNzdiOgk2NiA1ZSBbIAldKnBvcCAgICAlc2kKLSA3N2Q6CTY2IDVmIFsgCV0qcG9wICAgICVkaQotIDc3ZjoJNjYgNjAgWyAJXSpwdXNoYXcgCi0gNzgxOgk2NiA2MSBbIAldKnBvcGF3ICAKLSA3ODM6CTY2IDYyIDkwIDkwIDkwIDkwIDkwIFsgCV0qYm91bmQgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA3OGE6CTY2IDY4IDkwIDkwIFsgCV0qcHVzaHcgIFwkMHg5MDkwCi0gNzhlOgk2NiA2OSA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmltdWwgICBcJDB4OTA5MCwweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNzk3Ogk2NiA2YSA5MCBbIAldKnB1c2h3ICBcJDB4ZmZmZmZmOTAKLSA3OWE6CTY2IDZiIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qaW11bCAgIFwkMHhmZmZmZmY5MCwweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gN2EyOgk2NiA2ZCBbIAldKmluc3cgICBcKCVkeFwpLCVlczpcKCVlZGlcKQotIDdhNDoJNjYgNmYgWyAJXSpvdXRzdyAgJWRzOlwoJWVzaVwpLFwoJWR4XCkKLSA3YTY6CTY2IDgxIDkwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjdyAgIFwkMHg5MDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDdhZjoJNjYgODMgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGN3ICAgXCQweGZmZmZmZjkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDdiNzoJNjYgODUgOTAgOTAgOTAgOTAgOTAgWyAJXSp0ZXN0ICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDdiZToJNjYgODcgOTAgOTAgOTAgOTAgOTAgWyAJXSp4Y2hnICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDdjNToJNjYgODkgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDdjYzoJNjYgOGIgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDdkMzoJNjYgOGMgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3Z3ICAgJXNzLDB4OTA5MDkwOTBcKCVlYXhcKQotIDdkYToJNjYgOGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZWEgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDdlMToJNjYgOGYgODAgOTAgOTAgOTAgOTAgWyAJXSpwb3B3ICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gN2U4Ogk2NiA5MSBbIAldKnhjaGcgICAlYXgsJWN4Ci0gN2VhOgk2NiA5MiBbIAldKnhjaGcgICAlYXgsJWR4Ci0gN2VjOgk2NiA5MyBbIAldKnhjaGcgICAlYXgsJWJ4Ci0gN2VlOgk2NiA5NCBbIAldKnhjaGcgICAlYXgsJXNwCi0gN2YwOgk2NiA5NSBbIAldKnhjaGcgICAlYXgsJWJwCi0gN2YyOgk2NiA5NiBbIAldKnhjaGcgICAlYXgsJXNpCi0gN2Y0Ogk2NiA5NyBbIAldKnhjaGcgICAlYXgsJWRpCi0gN2Y2Ogk2NiA5OCBbIAldKmNidHcgICAKLSA3Zjg6CTY2IDk5IFsgCV0qY3d0ZCAgIAotIDdmYToJNjYgOWEgOTAgOTAgOTAgOTAgWyAJXSpsY2FsbHcgXCQweDkwOTAsXCQweDkwOTAKLSA4MDA6CTY2IDljIFsgCV0qcHVzaGZ3IAotIDgwMjoJNjYgOWQgWyAJXSpwb3BmdyAgCi0gODA0Ogk2NiBhMSA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwLCVheAotIDgwYToJNjYgYTMgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWF4LDB4OTA5MDkwOTAKLSA4MTA6CTY2IGE1IFsgCV0qbW92c3cgICVkczpcKCVlc2lcKSwlZXM6XCglZWRpXCkKLSA4MTI6CTY2IGE3IFsgCV0qY21wc3cgICVlczpcKCVlZGlcKSwlZHM6XCglZXNpXCkKLSA4MTQ6CTY2IGE5IDkwIDkwIFsgCV0qdGVzdCAgIFwkMHg5MDkwLCVheAotIDgxODoJNjYgYWIgWyAJXSpzdG9zICAgJWF4LCVlczpcKCVlZGlcKQotIDgxYToJNjYgYWQgWyAJXSpsb2RzICAgJWRzOlwoJWVzaVwpLCVheAotIDgxYzoJNjYgYWYgWyAJXSpzY2FzICAgJWVzOlwoJWVkaVwpLCVheAotIDgxZToJNjYgYjggOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJWF4Ci0gODIyOgk2NiBiOSA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlY3gKLSA4MjY6CTY2IGJhIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVkeAotIDgyYToJNjYgYmIgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJWJ4Ci0gODJlOgk2NiBiYyA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlc3AKLSA4MzI6CTY2IGJkIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVicAotIDgzNjoJNjYgYmUgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJXNpCi0gODNhOgk2NiBiZiA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlZGkKLSA4M2U6CTY2IGMxIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsdyAgIFwkMHg5MCwweDkwOTA5MDkwXCglZWF4XCkKLSA4NDY6CTY2IGMyIDkwIDkwIFsgCV0qcmV0dyAgIFwkMHg5MDkwCi0gODRhOgk2NiBjMyBbIAldKnJldHcgICAKLSA4NGM6CTY2IGM0IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGVzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4NTM6CTY2IGM1IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGRzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4NWE6CTY2IGM3IDgwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92dyAgIFwkMHg5MDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDg2MzoJNjYgYzggOTAgOTAgOTAgWyAJXSplbnRlcncgXCQweDkwOTAsXCQweDkwCi0gODY4Ogk2NiBjOSBbIAldKmxlYXZldyAKLSA4NmE6CTY2IGNhIDkwIDkwIFsgCV0qbHJldHcgIFwkMHg5MDkwCi0gODZlOgk2NiBjYiBbIAldKmxyZXR3ICAKLSA4NzA6CTY2IGNmIFsgCV0qaXJldHcgIAotIDg3MjoJNjYgZDEgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2x3ICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gODc5Ogk2NiBkMyA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbHcgICAlY2wsMHg5MDkwOTA5MFwoJWVheFwpCi0gODgwOgk2NiBlNSA5MCBbIAldKmluICAgICBcJDB4OTAsJWF4Ci0gODgzOgk2NiBlNyA5MCBbIAldKm91dCAgICAlYXgsXCQweDkwCi0gODg2Ogk2NiBlOCA4ZiA5MCBbIAldKmNhbGx3ICAoMHgpPzk5MTkuKgotIDg4YToJNjYgZWEgOTAgOTAgOTAgOTAgWyAJXSpsam1wdyAgXCQweDkwOTAsXCQweDkwOTAKLSA4OTA6CTY2IGVkIFsgCV0qaW4gICAgIFwoJWR4XCksJWF4Ci0gODkyOgk2NiBlZiBbIAldKm91dCAgICAlYXgsXCglZHhcKQotIDg5NDoJNjYgZjcgOTAgOTAgOTAgOTAgOTAgWyAJXSpub3R3ICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gODliOgk2NiBmZiA5MCA5MCA5MCA5MCA5MCBbIAldKmNhbGx3ICBcKjB4OTA5MDkwOTBcKCVlYXhcKQotIDhhMjoJNjYgMGYgMDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpsYXIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhhYToJNjYgMGYgMDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpsc2wgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhiMjoJNjYgMGYgNDAgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92byAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhiYToJNjYgMGYgNDEgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bm8gMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhjMjoJNjYgMGYgNDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YiAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhjYToJNjYgMGYgNDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YWUgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhkMjoJNjYgMGYgNDQgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92ZSAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhkYToJNjYgMGYgNDUgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bmUgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhlMjoJNjYgMGYgNDYgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YmUgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhlYToJNjYgMGYgNDcgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YSAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhmMjoJNjYgMGYgNDggOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92cyAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhmYToJNjYgMGYgNDkgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bnMgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkwMjoJNjYgMGYgNGEgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92cCAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkwYToJNjYgMGYgNGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bnAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkxMjoJNjYgMGYgNGMgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bCAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkxYToJNjYgMGYgNGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92Z2UgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkyMjoJNjYgMGYgNGUgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bGUgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkyYToJNjYgMGYgNGYgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92ZyAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkzMjoJNjYgMGYgYTAgWyAJXSpwdXNodyAgJWZzCi0gOTM1Ogk2NiAwZiBhMSBbIAldKnBvcHcgICAlZnMKLSA5Mzg6CTY2IDBmIGEzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnQgICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5NDA6CTY2IDBmIGE0IDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hsZCAgIFwkMHg5MCwlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTQ5Ogk2NiAwZiBhNSA5MCA5MCA5MCA5MCA5MCBbIAldKnNobGQgICAlY2wsJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk1MToJNjYgMGYgYTggWyAJXSpwdXNodyAgJWdzCi0gOTU0Ogk2NiAwZiBhOSBbIAldKnBvcHcgICAlZ3MKLSA5NTc6CTY2IDBmIGFiIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnRzICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5NWY6CTY2IDBmIGFjIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hyZCAgIFwkMHg5MCwlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTY4Ogk2NiAwZiBhZCA5MCA5MCA5MCA5MCA5MCBbIAldKnNocmQgICAlY2wsJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk3MDoJNjYgMGYgYWYgOTAgOTAgOTAgOTAgOTAgWyAJXSppbXVsICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDk3ODoJNjYgMGYgYjEgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXB4Y2hnICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5ODA6CTY2IDBmIGIyIDkwIDkwIDkwIDkwIDkwIFsgCV0qbHNzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5ODg6CTY2IDBmIGIzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnRyICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5OTA6CTY2IDBmIGI0IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGZzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5OTg6CTY2IDBmIGI1IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGdzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5YTA6CTY2IDBmIGI2IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92emJ3IDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5YTg6CTY2IDBmIGJiIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnRjICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5YjA6CTY2IDBmIGJjIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnNmICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5Yjg6CTY2IDBmIGJkIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnNyICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5YzA6CTY2IDBmIGJlIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92c2J3IDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5Yzg6CTY2IDBmIGMxIDkwIDkwIDkwIDkwIDkwIFsgCV0qeGFkZCAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvb3Bjb2RlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L29wY29kZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWM1OTY3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvb3Bjb2RlLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjcgKzAsMCBAQAotLnRleHQKLWZvbzoKLSBhZGQgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBhZGQgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYWRkICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCi0gYWRkICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGFkZCAgICAkMHg5MCwlYWwKLSBhZGQgICAgJDB4OTA5MDkwOTAsJWVheAotIHB1c2ggICAlZXMKLSBwb3AgICAgJWVzCi0gb3IgICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gb3IgICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIG9yICAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIG9yICAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBvciAgICAgJDB4OTAsJWFsCi0gb3IgICAgICQweDkwOTA5MDkwLCVlYXgKLSBwdXNoICAgJWNzCi0gYWRjICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gYWRjICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGFkYyAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIGFkYyAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBhZGMgICAgJDB4OTAsJWFsCi0gYWRjICAgICQweDkwOTA5MDkwLCVlYXgKLSBwdXNoICAgJXNzCi0gcG9wICAgICVzcwotIHNiYiAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIHNiYiAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzYmIgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKLSBzYmIgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gc2JiICAgICQweDkwLCVhbAotIHNiYiAgICAkMHg5MDkwOTA5MCwlZWF4Ci0gcHVzaCAgICVkcwotIHBvcCAgICAlZHMKLSBhbmQgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBhbmQgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYW5kICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCi0gYW5kICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGFuZCAgICAkMHg5MCwlYWwKLSBhbmQgICAgJDB4OTA5MDkwOTAsJWVheAotIGRhYQotIHN1YiAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIHN1YiAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzdWIgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKLSBzdWIgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gc3ViICAgICQweDkwLCVhbAotIHN1YiAgICAkMHg5MDkwOTA5MCwlZWF4Ci0gZGFzCi0geG9yICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0geG9yICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIHhvciAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIHhvciAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSB4b3IgICAgJDB4OTAsJWFsCi0geG9yICAgICQweDkwOTA5MDkwLCVlYXgKLSBhYWEKLSBjbXAgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBjbXAgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gY21wICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCi0gY21wICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtcCAgICAkMHg5MCwlYWwKLSBjbXAgICAgJDB4OTA5MDkwOTAsJWVheAotIGFhcwotIGluYyAgICAlZWF4Ci0gaW5jICAgICVlY3gKLSBpbmMgICAgJWVkeAotIGluYyAgICAlZWJ4Ci0gaW5jICAgICVlc3AKLSBpbmMgICAgJWVicAotIGluYyAgICAlZXNpCi0gaW5jICAgICVlZGkKLSBkZWMgICAgJWVheAotIGRlYyAgICAlZWN4Ci0gZGVjICAgICVlZHgKLSBkZWMgICAgJWVieAotIGRlYyAgICAlZXNwCi0gZGVjICAgICVlYnAKLSBkZWMgICAgJWVzaQotIGRlYyAgICAlZWRpCi0gcHVzaCAgICVlYXgKLSBwdXNoICAgJWVjeAotIHB1c2ggICAlZWR4Ci0gcHVzaCAgICVlYngKLSBwdXNoICAgJWVzcAotIHB1c2ggICAlZWJwCi0gcHVzaCAgICVlc2kKLSBwdXNoICAgJWVkaQotIHBvcCAgICAlZWF4Ci0gcG9wICAgICVlY3gKLSBwb3AgICAgJWVkeAotIHBvcCAgICAlZWJ4Ci0gcG9wICAgICVlc3AKLSBwb3AgICAgJWVicAotIHBvcCAgICAlZXNpCi0gcG9wICAgICVlZGkKLSBwdXNoYQotIHBvcGEKLSBib3VuZCAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYXJwbCAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gcHVzaCAgICQweDkwOTA5MDkwCi0gaW11bCAgICQweDkwOTA5MDkwLDB4OTA5MDkwOTAoJWVheCksJWVkeAotIHB1c2ggICAkMHhmZmZmZmY5MAotIGltdWwgICAkMHhmZmZmZmY5MCwweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBpbnNiICAgKCVkeCksJWVzOiglZWRpKQotIGluc2wgICAoJWR4KSwlZXM6KCVlZGkpCi0gb3V0c2IgICVkczooJWVzaSksKCVkeCkKLSBvdXRzbCAgJWRzOiglZXNpKSwoJWR4KQotIGpvICAgICAuKzItMHg3MAotIGpubyAgICAuKzItMHg3MAotIGpiICAgICAuKzItMHg3MAotIGphZSAgICAuKzItMHg3MAotIGplICAgICAuKzItMHg3MAotIGpuZSAgICAuKzItMHg3MAotIGpiZSAgICAuKzItMHg3MAotIGphICAgICAuKzItMHg3MAotIGpzICAgICAuKzItMHg3MAotIGpucyAgICAuKzItMHg3MAotIGpwICAgICAuKzItMHg3MAotIGpucCAgICAuKzItMHg3MAotIGpsICAgICAuKzItMHg3MAotIGpnZSAgICAuKzItMHg3MAotIGpsZSAgICAuKzItMHg3MAotIGpnICAgICAuKzItMHg3MAotIGFkY2IgICAkMHg5MCwweDkwOTA5MDkwKCVlYXgpCi0gYWRjbCAgICQweDkwOTA5MDkwLDB4OTA5MDkwOTAoJWVheCkKLSBhZGNsICAgJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MCglZWF4KQotIHRlc3QgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIHRlc3QgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSB4Y2hnICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSB4Y2hnICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gbW92ICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gbW92ICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIG1vdiAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIG1vdiAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBtb3ZsICAgJXNzLDB4OTA5MDkwOTAoJWVheCkKLSBsZWEgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbW92bCAgIDB4OTA5MDkwOTAoJWVheCksJXNzCi0gcG9wbCAgIDB4OTA5MDkwOTAoJWVheCkKLSB4Y2hnICAgJWVheCwlZWF4Ci0geGNoZyAgICVlYXgsJWVjeAotIHhjaGcgICAlZWF4LCVlZHgKLSB4Y2hnICAgJWVheCwlZWJ4Ci0geGNoZyAgICVlYXgsJWVzcAotIHhjaGcgICAlZWF4LCVlYnAKLSB4Y2hnICAgJWVheCwlZXNpCi0geGNoZyAgICVlYXgsJWVkaQotIGN3dGwKLSBjbHRkCi0gbGNhbGwgICQweDkwOTAsJDB4OTA5MDkwOTAKLSBmd2FpdAotIHB1c2hmCi0gcG9wZgotIHNhaGYKLSBsYWhmCi0gbW92ICAgIDB4OTA5MDkwOTAsJWFsCi0gbW92ICAgIDB4OTA5MDkwOTAsJWVheAotIG1vdiAgICAlYWwsMHg5MDkwOTA5MAotIG1vdiAgICAlZWF4LDB4OTA5MDkwOTAKLSBtb3ZzYiAgJWRzOiglZXNpKSwlZXM6KCVlZGkpCi0gbW92c2wgICVkczooJWVzaSksJWVzOiglZWRpKQotIGNtcHNiICAlZXM6KCVlZGkpLCVkczooJWVzaSkKLSBjbXBzbCAgJWVzOiglZWRpKSwlZHM6KCVlc2kpCi0gdGVzdCAgICQweDkwLCVhbAotIHRlc3QgICAkMHg5MDkwOTA5MCwlZWF4Ci0gc3RvcyAgICVhbCwlZXM6KCVlZGkpCi0gc3RvcyAgICVlYXgsJWVzOiglZWRpKQotIGxvZHMgICAlZHM6KCVlc2kpLCVhbAotIGxvZHMgICAlZHM6KCVlc2kpLCVlYXgKLSBzY2FzICAgJWVzOiglZWRpKSwlYWwKLSBzY2FzICAgJWVzOiglZWRpKSwlZWF4Ci0gbW92ICAgICQweDkwLCVhbAotIG1vdiAgICAkMHg5MCwlY2wKLSBtb3YgICAgJDB4OTAsJWRsCi0gbW92ICAgICQweDkwLCVibAotIG1vdiAgICAkMHg5MCwlYWgKLSBtb3YgICAgJDB4OTAsJWNoCi0gbW92ICAgICQweDkwLCVkaAotIG1vdiAgICAkMHg5MCwlYmgKLSBtb3YgICAgJDB4OTA5MDkwOTAsJWVheAotIG1vdiAgICAkMHg5MDkwOTA5MCwlZWN4Ci0gbW92ICAgICQweDkwOTA5MDkwLCVlZHgKLSBtb3YgICAgJDB4OTA5MDkwOTAsJWVieAotIG1vdiAgICAkMHg5MDkwOTA5MCwlZXNwCi0gbW92ICAgICQweDkwOTA5MDkwLCVlYnAKLSBtb3YgICAgJDB4OTA5MDkwOTAsJWVzaQotIG1vdiAgICAkMHg5MDkwOTA5MCwlZWRpCi0gcmNsYiAgICQweDkwLDB4OTA5MDkwOTAoJWVheCkKLSByY2xsICAgJDB4OTAsMHg5MDkwOTA5MCglZWF4KQotIHJldCAgICAkMHg5MDkwCi0gcmV0Ci0gbGVzICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGxkcyAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBtb3ZiICAgJDB4OTAsMHg5MDkwOTA5MCglZWF4KQotIG1vdmwgICAkMHg5MDkwOTA5MCwweDkwOTA5MDkwKCVlYXgpCi0gZW50ZXIgICQweDkwOTAsJDB4OTAKLSBsZWF2ZQotIGxyZXQgICAkMHg5MDkwCi0gbHJldAotIGludDMKLSBpbnQgICAgJDB4OTAKLSBpbnRvCi0gaXJldAotIHJjbGIgICAweDkwOTA5MDkwKCVlYXgpCi0gcmNsbCAgIDB4OTA5MDkwOTAoJWVheCkKLSByY2xiICAgJWNsLDB4OTA5MDkwOTAoJWVheCkKLSByY2xsICAgJWNsLDB4OTA5MDkwOTAoJWVheCkKLSBhYW0gICAgJDB4ZmZmZmZmOTAKLSBhYWQgICAgJDB4ZmZmZmZmOTAKLSB4bGF0ICAgJWRzOiglZWJ4KQotIGZjb21zICAweDkwOTA5MDkwKCVlYXgpCi0gZnN0cyAgIDB4OTA5MDkwOTAoJWVheCkKLSBmaWNvbWwgMHg5MDkwOTA5MCglZWF4KQotIGZpc3RsICAweDkwOTA5MDkwKCVlYXgpCi0gZmNvbWwgIDB4OTA5MDkwOTAoJWVheCkKLSBmc3RsICAgMHg5MDkwOTA5MCglZWF4KQotIGZpY29tICAweDkwOTA5MDkwKCVlYXgpCi0gZmlzdCAgIDB4OTA5MDkwOTAoJWVheCkKLSBsb29wbmUgLisyLTB4NzAKLSBsb29wZSAgLisyLTB4NzAKLSBsb29wICAgLisyLTB4NzAKLSBqZWN4eiAgLisyLTB4NzAKLSBpbiAgICAgJDB4OTAsJWFsCi0gaW4gICAgICQweDkwLCVlYXgKLSBvdXQgICAgJWFsLCQweDkwCi0gb3V0ICAgICVlYXgsJDB4OTAKLSBjYWxsICAgLis1KzB4OTA5MDkwOTAKLSBqbXAgICAgLis1KzB4OTA5MDkwOTAKLSBsam1wICAgJDB4OTA5MCwkMHg5MDkwOTA5MAotIGptcCAgICAuKzItMHg3MAotIGluICAgICAoJWR4KSwlYWwKLSBpbiAgICAgKCVkeCksJWVheAotIG91dCAgICAlYWwsKCVkeCkKLSBvdXQgICAgJWVheCwoJWR4KQotIGhsdAotIGNtYwotIG5vdGIgICAweDkwOTA5MDkwKCVlYXgpCi0gbm90bCAgIDB4OTA5MDkwOTAoJWVheCkKLSBjbGMKLSBzdGMKLSBjbGkKLSBzdGkKLSBjbGQKLSBzdGQKLSBjYWxsICAgKjB4OTA5MDkwOTAoJWVheCkKLSBsbGR0ICAgMHg5MDkwOTA5MCglZWF4KQotIGxnZHQgICAweDkwOTA5MDkwKCVlYXgpCi0gbGFyICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGxzbCAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbHRzCi0gaW52ZAotIHdiaW52ZAotIHVkMmEKLSBtb3YgICAgJWNyMiwlZWF4Ci0gbW92ICAgICVkYjIsJWVheAotIG1vdiAgICAlZWF4LCVjcjIKLSBtb3YgICAgJWVheCwlZGIyCi0gbW92ICAgICV0cjIsJWVheAotIG1vdiAgICAlZWF4LCV0cjIKLSB3cm1zcgotIHJkdHNjCi0gcmRtc3IKLSByZHBtYwotIGNtb3ZvICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92bm8gMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdmIgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZhZSAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92ZSAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdm5lIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZiZSAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92YSAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdnMgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZucyAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92cCAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdm5wIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZsICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92Z2UgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdmxlIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZnICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBwdW5wY2tsYncgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHVucGNrbHdkIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHB1bnBja2xkcSAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWNrc3N3YiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwY21wZ3RiIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBjbXBndHcgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGNtcGd0ZCAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWNrdXN3YiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwdW5wY2toYncgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHVucGNraHdkIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHB1bnBja2hkcSAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWNrc3NkdyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBtb3ZkICAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gbW92cSAgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzcmx3ICAkMHg5MCwlbW0wCi0gcHNybGQgICQweDkwLCVtbTAKLSBwc3JscSAgJDB4OTAsJW1tMAotIHBjbXBlcWIgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGNtcGVxdyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwY21wZXFkIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIGVtbXMKLSBtb3ZkICAgJW1tMiwweDkwOTA5MDkwKCVlYXgpCi0gbW92cSAgICVtbTIsMHg5MDkwOTA5MCglZWF4KQotIGpvICAgICAuKzYrMHg5MDkwOTA5MAotIGpubyAgICAuKzYrMHg5MDkwOTA5MAotIGpiICAgICAuKzYrMHg5MDkwOTA5MAotIGphZSAgICAuKzYrMHg5MDkwOTA5MAotIGplICAgICAuKzYrMHg5MDkwOTA5MAotIGpuZSAgICAuKzYrMHg5MDkwOTA5MAotIGpiZSAgICAuKzYrMHg5MDkwOTA5MAotIGphICAgICAuKzYrMHg5MDkwOTA5MAotIGpzICAgICAuKzYrMHg5MDkwOTA5MAotIGpucyAgICAuKzYrMHg5MDkwOTA5MAotIGpwICAgICAuKzYrMHg5MDkwOTA5MAotIGpucCAgICAuKzYrMHg5MDkwOTA5MAotIGpsICAgICAuKzYrMHg5MDkwOTA5MAotIGpnZSAgICAuKzYrMHg5MDkwOTA5MAotIGpsZSAgICAuKzYrMHg5MDkwOTA5MAotIGpnICAgICAuKzYrMHg5MDkwOTA5MAotIHNldG8gICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0bm8gIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRiICAgMHg5MDkwOTA5MCglZWF4KQotIHNldGFlICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0ZSAgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRuZSAgMHg5MDkwOTA5MCglZWF4KQotIHNldGJlICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0YSAgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRzICAgMHg5MDkwOTA5MCglZWF4KQotIHNldG5zICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0cCAgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRucCAgMHg5MDkwOTA5MCglZWF4KQotIHNldGwgICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0Z2UgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRsZSAgMHg5MDkwOTA5MCglZWF4KQotIHNldGcgICAweDkwOTA5MDkwKCVlYXgpCi0gcHVzaCAgICVmcwotIHBvcCAgICAlZnMKLSBjcHVpZAotIGJ0ICAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzaGxkICAgJDB4OTAsJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hsZCAgICVjbCwlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBwdXNoICAgJWdzCi0gcG9wICAgICVncwotIHJzbQotIGJ0cyAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzaHJkICAgJDB4OTAsJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hyZCAgICVjbCwlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBpbXVsICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21weGNoZyAlZGwsMHg5MDkwOTA5MCglZWF4KQotIGNtcHhjaGcgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gbHNzICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGJ0ciAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBsZnMgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbGdzICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIG1vdnpibCAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBtb3Z6d2wgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gdWQyYgotIGJ0YyAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBic2YgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gYnNyICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIG1vdnNibCAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBtb3Zzd2wgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0geGFkZCAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0geGFkZCAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGJzd2FwICAlZWF4Ci0gYnN3YXAgICVlY3gKLSBic3dhcCAgJWVkeAotIGJzd2FwICAlZWJ4Ci0gYnN3YXAgICVlc3AKLSBic3dhcCAgJWVicAotIGJzd2FwICAlZXNpCi0gYnN3YXAgICVlZGkKLSBwc3JsdyAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHNybGQgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzcmxxICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwbXVsbHcgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHN1YnVzYiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3VidXN3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhbmQgICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWRkdXNiIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhZGR1c3cgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFuZG4gIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzcmF3ICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3JhZCAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcG11bGh3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzdWJzYiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3Vic3cgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcG9yICAgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhZGRzYiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWRkc3cgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHhvciAgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzbGx3ICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc2xsZCAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHNsbHEgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBtYWRkd2QgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHN1YmIgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzdWJ3ICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3ViZCAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFkZGIgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhZGR3ICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWRkZCAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gYWRkICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYWRkICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gYWRkICAgICQweDkwOTAsJWF4Ci0gcHVzaHcgICVlcwotIHBvcHcgICAlZXMKLSBvciAgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBvciAgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBvciAgICAgJDB4OTA5MCwlYXgKLSBwdXNodyAgJWNzCi0gYWRjICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYWRjICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gYWRjICAgICQweDkwOTAsJWF4Ci0gcHVzaHcgICVzcwotIHBvcHcgICAlc3MKLSBzYmIgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzYmIgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBzYmIgICAgJDB4OTA5MCwlYXgKLSBwdXNodyAgJWRzCi0gcG9wdyAgICVkcwotIGFuZCAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIGFuZCAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGFuZCAgICAkMHg5MDkwLCVheAotIHN1YiAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIHN1YiAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIHN1YiAgICAkMHg5MDkwLCVheAotIHhvciAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIHhvciAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIHhvciAgICAkMHg5MDkwLCVheAotIGNtcCAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIGNtcCAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtcCAgICAkMHg5MDkwLCVheAotIGluYyAgICAlYXgKLSBpbmMgICAgJWN4Ci0gaW5jICAgICVkeAotIGluYyAgICAlYngKLSBpbmMgICAgJXNwCi0gaW5jICAgICVicAotIGluYyAgICAlc2kKLSBpbmMgICAgJWRpCi0gZGVjICAgICVheAotIGRlYyAgICAlY3gKLSBkZWMgICAgJWR4Ci0gZGVjICAgICVieAotIGRlYyAgICAlc3AKLSBkZWMgICAgJWJwCi0gZGVjICAgICVzaQotIGRlYyAgICAlZGkKLSBwdXNoICAgJWF4Ci0gcHVzaCAgICVjeAotIHB1c2ggICAlZHgKLSBwdXNoICAgJWJ4Ci0gcHVzaCAgICVzcAotIHB1c2ggICAlYnAKLSBwdXNoICAgJXNpCi0gcHVzaCAgICVkaQotIHBvcCAgICAlYXgKLSBwb3AgICAgJWN4Ci0gcG9wICAgICVkeAotIHBvcCAgICAlYngKLSBwb3AgICAgJXNwCi0gcG9wICAgICVicAotIHBvcCAgICAlc2kKLSBwb3AgICAgJWRpCi0gcHVzaGF3Ci0gcG9wYXcKLSBib3VuZCAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBwdXNodyAgJDB4OTA5MAotIGltdWwgICAkMHg5MDkwLDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gcHVzaHcgICQweGZmZmZmZjkwCi0gaW11bCAgICQweGZmZmZmZjkwLDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gaW5zdyAgICglZHgpLCVlczooJWVkaSkKLSBvdXRzdyAgJWRzOiglZXNpKSwoJWR4KQotIGFkY3cgICAkMHg5MDkwLDB4OTA5MDkwOTAoJWVheCkKLSBhZGN3ICAgJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MCglZWF4KQotIHRlc3QgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIHhjaGcgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIG1vdiAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIG1vdiAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIG1vdncgICAlc3MsMHg5MDkwOTA5MCglZWF4KQotIGxlYSAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIHBvcHcgICAweDkwOTA5MDkwKCVlYXgpCi0geGNoZyAgICVheCwlY3gKLSB4Y2hnICAgJWF4LCVkeAotIHhjaGcgICAlYXgsJWJ4Ci0geGNoZyAgICVheCwlc3AKLSB4Y2hnICAgJWF4LCVicAotIHhjaGcgICAlYXgsJXNpCi0geGNoZyAgICVheCwlZGkKLSBjYnR3Ci0gY3d0ZAotIGxjYWxsdyAkMHg5MDkwLCQweDkwOTAKLSBwdXNoZncKLSBwb3BmdwotIG1vdiAgICAweDkwOTA5MDkwLCVheAotIG1vdiAgICAlYXgsMHg5MDkwOTA5MAotIG1vdnN3ICAlZHM6KCVlc2kpLCVlczooJWVkaSkKLSBjbXBzdyAgJWVzOiglZWRpKSwlZHM6KCVlc2kpCi0gdGVzdCAgICQweDkwOTAsJWF4Ci0gc3RvcyAgICVheCwlZXM6KCVlZGkpCi0gbG9kcyAgICVkczooJWVzaSksJWF4Ci0gc2NhcyAgICVlczooJWVkaSksJWF4Ci0gbW92ICAgICQweDkwOTAsJWF4Ci0gbW92ICAgICQweDkwOTAsJWN4Ci0gbW92ICAgICQweDkwOTAsJWR4Ci0gbW92ICAgICQweDkwOTAsJWJ4Ci0gbW92ICAgICQweDkwOTAsJXNwCi0gbW92ICAgICQweDkwOTAsJWJwCi0gbW92ICAgICQweDkwOTAsJXNpCi0gbW92ICAgICQweDkwOTAsJWRpCi0gcmNsdyAgICQweDkwLDB4OTA5MDkwOTAoJWVheCkKLSByZXR3ICAgJDB4OTA5MAotIHJldHcKLSBsZXMgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBsZHMgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBtb3Z3ICAgJDB4OTA5MCwweDkwOTA5MDkwKCVlYXgpCi0gZW50ZXJ3ICQweDkwOTAsJDB4OTAKLSBsZWF2ZXcKLSBscmV0dyAgJDB4OTA5MAotIGxyZXR3Ci0gaXJldHcKLSByY2x3ICAgMHg5MDkwOTA5MCglZWF4KQotIHJjbHcgICAlY2wsMHg5MDkwOTA5MCglZWF4KQotIGluICAgICAkMHg5MCwlYXgKLSBvdXQgICAgJWF4LCQweDkwCi0gY2FsbHcgIC4rMysweDkwOTAKLSBsam1wdyAgJDB4OTA5MCwkMHg5MDkwCi0gaW4gICAgICglZHgpLCVheAotIG91dCAgICAlYXgsKCVkeCkKLSBub3R3ICAgMHg5MDkwOTA5MCglZWF4KQotIGNhbGx3ICAqMHg5MDkwOTA5MCglZWF4KQotIGxhciAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGxzbCAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZvICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZubyAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZiICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZhZSAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZlICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZuZSAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZiZSAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZhICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZzICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZucyAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZwICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZucCAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZsICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZnZSAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZsZSAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZnICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIHB1c2h3ICAlZnMKLSBwb3B3ICAgJWZzCi0gYnQgICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hsZCAgICQweDkwLCVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hsZCAgICVjbCwlZHgsMHg5MDkwOTA5MCglZWF4KQotIHB1c2h3ICAlZ3MKLSBwb3B3ICAgJWdzCi0gYnRzICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hyZCAgICQweDkwLCVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hyZCAgICVjbCwlZHgsMHg5MDkwOTA5MCglZWF4KQotIGltdWwgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtcHhjaGcgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBsc3MgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBidHIgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBsZnMgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBsZ3MgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBtb3Z6YncgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBidGMgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBic2YgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBic3IgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBtb3ZzYncgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSB4YWRkICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcHJlZml4LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3ByZWZpeC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWViYTgxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcHJlZml4LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jb2JqZHVtcDogLWR3Ci0jbmFtZTogaTM4NiBwcmVmaXgKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMCA8Zm9vPjoKLSAgIDA6CTliIDY3IDI2IGQ5IDNjIFsgCV0qYWRkcjE2IGZzdGN3ICVlczpcKCVzaVwpCi0gICA1Ogk5YiBkZiBlMCBbIAldKmZzdHN3ICAlYXgKLSAgIDg6CTliIGRmIGUwIFsgCV0qZnN0c3cgICVheAotICAgYjoJOWIgZGYgZTAgWyAJXSpmc3RzdyAgJWF4Ci0gICBlOgk5YiA2NyBkZiBlMCBbIAldKmFkZHIxNiBmc3RzdyAlYXgKLSAgMTI6CWYzIDY3IDY2IDM2IGE3IFsgCV0qcmVweiBhZGRyMTYgY21wc3cgJWVzOlwoJWRpXCksJXNzOlwoJXNpXCkKLSAgMTc6CTkwIFsgCV0qbm9wICAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9wcmVmaXgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcHJlZml4LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OThiNDEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9wcmVmaXgucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS50ZXh0Ci1mb286Ci0gYWRkcjE2IGZzdGN3ICVlczooJXNpKQotIGZzdHN3Ci0gZnN0c3cgJWF4Ci0gZnN0c3cgJWVheAotIGFkZHIxNiBmc3RzdyAlYXgKLSBhZGRyMTYgcmVwIGNtcHN3ICVlczooJWRpKSwlc3M6KCVzaSkKLQotIyBHZXQgYSBnb29kIGFsaWdubWVudC4KLSBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcmVsb2MuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcmVsb2MuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAzNTRmZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3JlbG9jLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jb2JqZHVtcDogLWRydwotI25hbWU6IGkzODYgcmVsb2MKLQotLio6ICtmaWxlIGZvcm1hdCAuKmkzODYuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8Zm9vPjoKLSAgIDA6CWIzIDAwIFsgCV0qbW92ICAgIFwkMHgwLCVibAkxOiBSXzM4Nl84CS50ZXh0Ci0gICAyOgk2OCAwMCAwMCAwMCAwMCBbIAldKnB1c2ggICBcJDB4MAkzOiBSXzM4Nl8zMgkudGV4dAotICAgNzoJMDUgMDAgMDAgMDAgMDAgWyAJXSphZGQgICAgXCQweDAsJWVheAk4OiBSXzM4Nl8zMgkudGV4dAotICAgYzoJODEgYzMgMDAgMDAgMDAgMDAgWyAJXSphZGQgICAgXCQweDAsJWVieAllOiBSXzM4Nl8zMgkudGV4dAotICAxMjoJNjkgZDIgMDAgMDAgMDAgMDAgWyAJXSppbXVsICAgXCQweDAsJWVkeCwlZWR4CTE0OiBSXzM4Nl8zMgkudGV4dAotICAxODoJOWEgMDAgMDAgMDAgMDAgMDAgMDAgWyAJXSpsY2FsbCAgXCQweDAsXCQweDAJMTk6IFJfMzg2XzMyCS50ZXh0Ci0gIDFmOgk2NiA2OCAwMCAwMCBbIAldKnB1c2h3ICBcJDB4MAkyMTogUl8zODZfMTYJLnRleHQKLSAgMjM6CTkwIFsgCV0qbm9wICAgIAotICAyNDoJOTAgWyAJXSpub3AgICAgCi0gIDI1Ogk5MCBbIAldKm5vcCAgICAKLSAgMjY6CTkwIFsgCV0qbm9wICAgIAotICAyNzoJOTAgWyAJXSpub3AgICAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3JlbG9jLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3JlbG9jLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZjk1YjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9yZWxvYy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLnRleHQKLWZvbzoJbW92CSRmb28sICVibAotCXB1c2gJJGZvbwotCWFkZAkkZm9vLCAlZWF4Ci0JYWRkCSRmb28sICVlYngKLQlpbXVsCSRmb28sICVlZHgKLQlsY2FsbAkkMCwgJGZvbwotCXB1c2h3CSRmb28KLQotIyBQYWQgb3V0IHRvIGEgZ29vZCBhbGlnbm1lbnQKLSAuYnl0ZSAweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvd2hpdGUubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvd2hpdGUubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlNjE2MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3doaXRlLmwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1HQVMgTElTVElORyAuKgotCi0KLSAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkjIHRlc3QgaGFuZGxpbmcgb2Ygd2hpdGVzcGFjZSwgYW5kIHVwcGVyLWNhc2UKLSAgIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkuVGVYdCAKLSAgIDMgMDAwMCAzNiAgICAgICAgICAgICAgICAgICAgICAgICAJCXNzIAotICAgNCAwMDAxIDg4MDMgICAgICAgICAgICAgICAgICAgICAgIAkJbW92ICUgYWwgLCBcKCAlIGVieCBcKSAKLSAgIDUgMDAwMyBDNzA1RDcxMSAwMDAwN0IwMCAwMDAwICAgICAJICAgICAgICBtT3ZsIFwkIDEyMyAsIDQ1NjcgCi0gICA2IDAwMGQgNjc4QTc4N0IgICAgICAgICAgICAgICAgICAgCSBBRERyMTYJbW92IDEyMyBcKCAlIGJ4ICwgJSBzaSAsIDEgXCkgLCAlIGJoIAotICAgNyAwMDExIEZGRTAgICAgICAgICAgICAgICAgICAgICAgIAkJam1wIFwqICUgZWF4IAotICAgOCAwMDEzIDY2MjZGRjIzICAgICAgICAgICAgICAgICAgIAlmb286CWptcHcgJSBlcyA6IFwqIFwoICUgZWJ4IFwpCQotICAgOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAKLSAgMTAgMDAxNyBBMDUwMDAwMCAwMCAgICAgICAgICAgICAgICAJCW1vdiBcKCAweDggXCogMFhhIFwpICwgJSBhbCAKLSAgMTEgMDAxYyBCMDIwICAgICAgICAgICAgICAgICAgICAgICAJCW1vdiBcJCBcKCA4IFwqIDQgXCkgLCAlIGFsIAotICAxMiAwMDFlIEI3MTMgICAgICAgICAgICAgICAgICAgICAgIAkJbW92IFwkIGZvbyAsICUgYkggCi0gIDEzIDAwMjAgQjcxMyAgICAgICAgICAgICAgICAgICAgICAgCQltb3ZiIFwkIGZvbyAsICUgQkggCi0gIDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQotICAxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS5DT0RFMTYJCi0gIDE2IDAwMjIgNjZCODEzMDAgMDAwMCAgICAgICAgICAgICAgCQlNb3YgXCQgZm9vICwgJWVBeAkKLSAgMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkuQ29kZTMyIAotICAxOCAwMDI4IDY2QjgxMzAwICAgICAgICAgICAgICAgICAgIAkJbW92IFwkIGZvbyAsICVheAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvd2hpdGUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvd2hpdGUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JmNTA3MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3doaXRlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIHRlc3QgaGFuZGxpbmcgb2Ygd2hpdGVzcGFjZSwgYW5kIHVwcGVyLWNhc2UKLS5UZVh0IAotCXNzIAotCW1vdiAlIGFsICwgKCAlIGVieCApIAotICAgICAgICBtT3ZsICQgMTIzICwgNDU2NyAKLSBBRERyMTYJbW92IDEyMyAoICUgYnggLCAlIHNpICwgMSApICwgJSBiaCAKLQlqbXAgKiAlIGVheCAKLWZvbzoJam1wdyAlIGVzIDogKiAoICUgZWJ4ICkJCi0gCi0JbW92ICggMHg4ICogMFhhICkgLCAlIGFsIAotCW1vdiAkICggOCAqIDQgKSAsICUgYWwgCi0JbW92ICQgZm9vICwgJSBiSCAKLQltb3ZiICQgZm9vICwgJSBCSCAKLQkKLS5DT0RFMTYJCi0JTW92ICQgZm9vICwgJWVBeAkKLS5Db2RlMzIgCi0JbW92ICQgZm9vICwgJWF4CQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaWVlZS1mcC94OTMwNTA5YS5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9pZWVlLWZwL3g5MzA1MDlhLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4OGQyYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pZWVlLWZwL3g5MzA1MDlhLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMgUmVwb3J0ZWQgOTMvMDUvMDkgYnkgSmltIFdpbHNvbjogSUVFRSBzaW5nbGUtcHJlY2lzaW9uIEZMVF9NSU4gdmFsdWUgZ2V0cwotIyBhc3NlbWJsZWQgaW5jb3JyZWN0bHkuICAoT2ZmIGJ5IG9uZSB1bHAuKQotCi1wcm9jIGRvdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJJRUVFIEZMVF9NSU4sIHNpbmdsZS1wcmVjaXNpb24iCi0gICAgc2V0IHggMAotICAgIGdhc19zdGFydCAieDkzMDUwOWEucyIgIi1hbCIKLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiAwMDAwODAwMFxbIAlcXSsuc2luZ2xlIiB7IHBhc3MgJHRlc3RuYW1lOyBzZXQgeCAxIH0KLQkgICAgLXJlICIgMDA4MDAwMDBcWyAJXF0rLnNpbmdsZSIgeyBwYXNzICR0ZXN0bmFtZTsgc2V0IHggMSB9Ci0JICAgIC1yZSAiIDAwODAgMDAwMFxbIAlcXSsuc2luZ2xlIiB7IHBhc3MgJHRlc3RuYW1lOyBzZXQgeCAxIH0KLQkgICAgLXJlICIgLi4uLi4uLi4gKy5zaW5nbGUiIHsgZmFpbCAkdGVzdG5hbWU7IHNldCB4IDEgfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iIHsgfQotCSAgICB0aW1lb3V0IHsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZiB7IGJyZWFrIH0KLQl9Ci0gICAgfQotICAgIGdhc19maW5pc2gKLSAgICBpZiAhJHggdGhlbiB7IGZhaWwgIiR0ZXN0bmFtZSAobGlzdGluZyBkaWRuJ3QgbWF0Y2gpIiB9Ci19Ci0KLWlmICFbaXN0YXJnZXQgdmF4Ki0qLSpdIHRoZW4gewotICAgIGRvdGVzdAotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaWVlZS1mcC94OTMwNTA5YS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaWVlZS1mcC94OTMwNTA5YS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjFiMzM4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2llZWUtZnAveDkzMDUwOWEucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotICAgICAgICAuZ2xvYmFsIF9mbHRfbWluCi0JLmRhdGEKLSAgICAgICAgLmFsaWduIDQKLV9mbHRfbWluOgotICAgICAgICAuc2luZ2xlIDByMS4xNzU0OTQzNWUtMzgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OTY1ZTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotI2FzOgotI29iamR1bXA6IC1kcgotI25hbWU6IGFsbGluc24KLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAgPGFkZD46Ci0gICAwOgkwZCBhZCBmMCAwMCAJYWRkIGZwLGZwIFx8XHwgbm9wCi0KLTArMDAwNCA8YWRkMz46Ci0gICA0Ogk4ZCBhZCAwMCAwMCAJYWRkMyBmcCxmcCxbI10qMAotCi0wKzAwMDggPGFuZD46Ci0gICA4OgkwZCBjZCBmMCAwMCAJYW5kIGZwLGZwIFx8XHwgbm9wCi0KLTArMDAwYyA8YW5kMz46Ci0gICBjOgk4ZCBjZCAwMCAwMCAJYW5kMyBmcCxmcCxbI10qMHgwCi0KLTArMDAxMCA8b3I+OgotICAxMDoJMGQgZWQgZjAgMDAgCW9yIGZwLGZwIFx8XHwgbm9wCi0KLTArMDAxNCA8b3IzPjoKLSAgMTQ6CThkIGVkIDAwIDAwIAlvcjMgZnAsZnAsWyNdKjB4MAotCi0wKzAwMTggPHhvcj46Ci0gIDE4OgkwZCBkZCBmMCAwMCAJeG9yIGZwLGZwIFx8XHwgbm9wCi0KLTArMDAxYyA8eG9yMz46Ci0gIDFjOgk4ZCBkZCAwMCAwMCAJeG9yMyBmcCxmcCxbI10qMHgwCi0KLTArMDAyMCA8YWRkaT46Ci0gIDIwOgk0ZCAwMCBmMCAwMCAJYWRkaSBmcCxbI10qMCBcfFx8IG5vcAotCi0wKzAwMjQgPGFkZHY+OgotICAyNDoJMGQgOGQgZjAgMDAgCWFkZHYgZnAsZnAgXHxcfCBub3AKLQotMCswMDI4IDxhZGR2Mz46Ci0gIDI4Ogk4ZCA4ZCAwMCAwMCAJYWRkdjMgZnAsZnAsWyNdKjAKLQotMCswMDJjIDxhZGR4PjoKLSAgMmM6CTBkIDlkIGYwIDAwIAlhZGR4IGZwLGZwIFx8XHwgbm9wCi0KLTArMDAzMCA8YmM4PjoKLSAgMzA6CTdjIGY0IGYwIDAwIAliYyAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDAzNCA8YmM4X3M+OgotICAzNDoJN2MgZjMgZjAgMDAgCWJjIDAgPGFkZD4gXHxcfCBub3AKLQotMCswMDM4IDxiYzI0PjoKLSAgMzg6CTdjIGYyIGYwIDAwIAliYyAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDAzYyA8YmMyNF9sPjoKLSAgM2M6CWZjIGZmIGZmIGYxIAliYyAwIDxhZGQ+Ci0KLTArMDA0MCA8YmVxPjoKLSAgNDA6CWJkIDBkIGZmIGYwIAliZXEgZnAsZnAsMCA8YWRkPgotCi0wKzAwNDQgPGJlcXo+OgotICA0NDoJYjAgOGQgZmYgZWYgCWJlcXogZnAsMCA8YWRkPgotCi0wKzAwNDggPGJnZXo+OgotICA0ODoJYjAgYmQgZmYgZWUgCWJnZXogZnAsMCA8YWRkPgotCi0wKzAwNGMgPGJndHo+OgotICA0YzoJYjAgZGQgZmYgZWQgCWJndHogZnAsMCA8YWRkPgotCi0wKzAwNTAgPGJsZXo+OgotICA1MDoJYjAgY2QgZmYgZWMgCWJsZXogZnAsMCA8YWRkPgotCi0wKzAwNTQgPGJsdHo+OgotICA1NDoJYjAgYWQgZmYgZWIgCWJsdHogZnAsMCA8YWRkPgotCi0wKzAwNTggPGJuZXo+OgotICA1ODoJYjAgOWQgZmYgZWEgCWJuZXogZnAsMCA8YWRkPgotCi0wKzAwNWMgPGJsOD46Ci0gIDVjOgk3ZSBlOSBmMCAwMCAJYmwgMCA8YWRkPiBcfFx8IG5vcAotCi0wKzAwNjAgPGJsOF9zPjoKLSAgNjA6CTdlIGU4IGYwIDAwIAlibCAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDA2NCA8YmwyND46Ci0gIDY0Ogk3ZSBlNyBmMCAwMCAJYmwgMCA8YWRkPiBcfFx8IG5vcAotCi0wKzAwNjggPGJsMjRfbD46Ci0gIDY4OglmZSBmZiBmZiBlNiAJYmwgMCA8YWRkPgotCi0wKzAwNmMgPGJuYzg+OgotICA2YzoJN2QgZTUgZjAgMDAgCWJuYyAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDA3MCA8Ym5jOF9zPjoKLSAgNzA6CTdkIGU0IGYwIDAwIAlibmMgMCA8YWRkPiBcfFx8IG5vcAotCi0wKzAwNzQgPGJuYzI0PjoKLSAgNzQ6CTdkIGUzIGYwIDAwIAlibmMgMCA8YWRkPiBcfFx8IG5vcAotCi0wKzAwNzggPGJuYzI0X2w+OgotICA3ODoJZmQgZmYgZmYgZTIgCWJuYyAwIDxhZGQ+Ci0KLTArMDA3YyA8Ym5lPjoKLSAgN2M6CWJkIDFkIGZmIGUxIAlibmUgZnAsZnAsMCA8YWRkPgotCi0wKzAwODAgPGJyYTg+OgotICA4MDoJN2YgZTAgZjAgMDAgCWJyYSAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDA4NCA8YnJhOF9zPjoKLSAgODQ6CTdmIGRmIGYwIDAwIAlicmEgMCA8YWRkPiBcfFx8IG5vcAotCi0wKzAwODggPGJyYTI0PjoKLSAgODg6CTdmIGRlIGYwIDAwIAlicmEgMCA8YWRkPiBcfFx8IG5vcAotCi0wKzAwOGMgPGJyYTI0X2w+OgotICA4YzoJZmYgZmYgZmYgZGQgCWJyYSAwIDxhZGQ+Ci0KLTArMDA5MCA8Y21wPjoKLSAgOTA6CTBkIDRkIGYwIDAwIAljbXAgZnAsZnAgXHxcfCBub3AKLQotMCswMDk0IDxjbXBpPjoKLSAgOTQ6CTgwIDRkIDAwIDAwIAljbXBpIGZwLFsjXSowCi0KLTArMDA5OCA8Y21wdT46Ci0gIDk4OgkwZCA1ZCBmMCAwMCAJY21wdSBmcCxmcCBcfFx8IG5vcAotCi0wKzAwOWMgPGNtcHVpPjoKLSAgOWM6CTgwIDVkIDAwIDAwIAljbXB1aSBmcCxbI10qMAotCi0wKzAwYTAgPGRpdj46Ci0gIGEwOgk5ZCAwZCAwMCAwMCAJZGl2IGZwLGZwCi0KLTArMDBhNCA8ZGl2dT46Ci0gIGE0Ogk5ZCAxZCAwMCAwMCAJZGl2dSBmcCxmcAotCi0wKzAwYTggPHJlbT46Ci0gIGE4Ogk5ZCAyZCAwMCAwMCAJcmVtIGZwLGZwCi0KLTArMDBhYyA8cmVtdT46Ci0gIGFjOgk5ZCAzZCAwMCAwMCAJcmVtdSBmcCxmcAotCi0wKzAwYjAgPGpsPjoKLSAgYjA6CTFlIGNkIGYwIDAwIAlqbCBmcCBcfFx8IG5vcAotCi0wKzAwYjQgPGptcD46Ci0gIGI0OgkxZiBjZCBmMCAwMCAJam1wIGZwIFx8XHwgbm9wCi0KLTArMDBiOCA8bGQ+OgotICBiODoJMmQgY2QgZjAgMDAgCWxkIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAwYmMgPGxkXzI+OgotICBiYzoJMmQgY2QgZjAgMDAgCWxkIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAwYzAgPGxkX2Q+OgotICBjMDoJYWQgY2QgMDAgMDAgCWxkIGZwLEBcKDAsZnBcKQotCi0wKzAwYzQgPGxkX2QyPjoKLSAgYzQ6CWFkIGNkIDAwIDAwIAlsZCBmcCxAXCgwLGZwXCkKLQotMCswMGM4IDxsZGI+OgotICBjODoJMmQgOGQgZjAgMDAgCWxkYiBmcCxAZnAgXHxcfCBub3AKLQotMCswMGNjIDxsZGJfMj46Ci0gIGNjOgkyZCA4ZCBmMCAwMCAJbGRiIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAwZDAgPGxkYl9kPjoKLSAgZDA6CWFkIDhkIDAwIDAwIAlsZGIgZnAsQFwoMCxmcFwpCi0KLTArMDBkNCA8bGRiX2QyPjoKLSAgZDQ6CWFkIDhkIDAwIDAwIAlsZGIgZnAsQFwoMCxmcFwpCi0KLTArMDBkOCA8bGRoPjoKLSAgZDg6CTJkIGFkIGYwIDAwIAlsZGggZnAsQGZwIFx8XHwgbm9wCi0KLTArMDBkYyA8bGRoXzI+OgotICBkYzoJMmQgYWQgZjAgMDAgCWxkaCBmcCxAZnAgXHxcfCBub3AKLQotMCswMGUwIDxsZGhfZD46Ci0gIGUwOglhZCBhZCAwMCAwMCAJbGRoIGZwLEBcKDAsZnBcKQotCi0wKzAwZTQgPGxkaF9kMj46Ci0gIGU0OglhZCBhZCAwMCAwMCAJbGRoIGZwLEBcKDAsZnBcKQotCi0wKzAwZTggPGxkdWI+OgotICBlODoJMmQgOWQgZjAgMDAgCWxkdWIgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDBlYyA8bGR1Yl8yPjoKLSAgZWM6CTJkIDlkIGYwIDAwIAlsZHViIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAwZjAgPGxkdWJfZD46Ci0gIGYwOglhZCA5ZCAwMCAwMCAJbGR1YiBmcCxAXCgwLGZwXCkKLQotMCswMGY0IDxsZHViX2QyPjoKLSAgZjQ6CWFkIDlkIDAwIDAwIAlsZHViIGZwLEBcKDAsZnBcKQotCi0wKzAwZjggPGxkdWg+OgotICBmODoJMmQgYmQgZjAgMDAgCWxkdWggZnAsQGZwIFx8XHwgbm9wCi0KLTArMDBmYyA8bGR1aF8yPjoKLSAgZmM6CTJkIGJkIGYwIDAwIAlsZHVoIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAxMDAgPGxkdWhfZD46Ci0gMTAwOglhZCBiZCAwMCAwMCAJbGR1aCBmcCxAXCgwLGZwXCkKLQotMCswMTA0IDxsZHVoX2QyPjoKLSAxMDQ6CWFkIGJkIDAwIDAwIAlsZHVoIGZwLEBcKDAsZnBcKQotCi0wKzAxMDggPGxkX3BsdXM+OgotIDEwODoJMmQgZWQgZjAgMDAgCWxkIGZwLEBmcFwrIFx8XHwgbm9wCi0KLTArMDEwYyA8bGQyND46Ci0gMTBjOgllZCAwMCAwMCAwMCAJbGQyNCBmcCxbI10qMCA8YWRkPgotCQkJMTBjOiBSX00zMlJfMjQJLmRhdGEKLQotMCswMTEwIDxsZGk4PjoKLSAxMTA6CTZkIDAwIGYwIDAwIAlsZGkgZnAsWyNdKjAgXHxcfCBub3AKLQotMCswMTE0IDxsZGkxNj46Ci0gMTE0Ogk5ZCBmMCAwMSAwMCAJbGRpIGZwLFsjXSoyNTYKLQotMCswMTE4IDxsb2NrPjoKLSAxMTg6CTJkIGRkIGYwIDAwIAlsb2NrIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAxMWMgPG1hY2hpPjoKLSAxMWM6CTNkIDRkIGYwIDAwIAltYWNoaSBmcCxmcCBcfFx8IG5vcAotCi0wKzAxMjAgPG1hY2xvPjoKLSAxMjA6CTNkIDVkIGYwIDAwIAltYWNsbyBmcCxmcCBcfFx8IG5vcAotCi0wKzAxMjQgPG1hY3doaT46Ci0gMTI0OgkzZCA2ZCBmMCAwMCAJbWFjd2hpIGZwLGZwIFx8XHwgbm9wCi0KLTArMDEyOCA8bWFjd2xvPjoKLSAxMjg6CTNkIDdkIGYwIDAwIAltYWN3bG8gZnAsZnAgXHxcfCBub3AKLQotMCswMTJjIDxtdWw+OgotIDEyYzoJMWQgNmQgZjAgMDAgCW11bCBmcCxmcCBcfFx8IG5vcAotCi0wKzAxMzAgPG11bGhpPjoKLSAxMzA6CTNkIDBkIGYwIDAwIAltdWxoaSBmcCxmcCBcfFx8IG5vcAotCi0wKzAxMzQgPG11bGxvPjoKLSAxMzQ6CTNkIDFkIGYwIDAwIAltdWxsbyBmcCxmcCBcfFx8IG5vcAotCi0wKzAxMzggPG11bHdoaT46Ci0gMTM4OgkzZCAyZCBmMCAwMCAJbXVsd2hpIGZwLGZwIFx8XHwgbm9wCi0KLTArMDEzYyA8bXVsd2xvPjoKLSAxM2M6CTNkIDNkIGYwIDAwIAltdWx3bG8gZnAsZnAgXHxcfCBub3AKLQotMCswMTQwIDxtdj46Ci0gMTQwOgkxZCA4ZCBmMCAwMCAJbXYgZnAsZnAgXHxcfCBub3AKLQotMCswMTQ0IDxtdmZhY2hpPjoKLSAxNDQ6CTVkIGYwIGYwIDAwIAltdmZhY2hpIGZwIFx8XHwgbm9wCi0KLTArMDE0OCA8bXZmYWNsbz46Ci0gMTQ4Ogk1ZCBmMSBmMCAwMCAJbXZmYWNsbyBmcCBcfFx8IG5vcAotCi0wKzAxNGMgPG12ZmFjbWk+OgotIDE0YzoJNWQgZjIgZjAgMDAgCW12ZmFjbWkgZnAgXHxcfCBub3AKLQotMCswMTUwIDxtdmZjPjoKLSAxNTA6CTFkIDkwIGYwIDAwIAltdmZjIGZwLHBzdyBcfFx8IG5vcAotCi0wKzAxNTQgPG12dGFjaGk+OgotIDE1NDoJNWQgNzAgZjAgMDAgCW12dGFjaGkgZnAgXHxcfCBub3AKLQotMCswMTU4IDxtdnRhY2xvPjoKLSAxNTg6CTVkIDcxIGYwIDAwIAltdnRhY2xvIGZwIFx8XHwgbm9wCi0KLTArMDE1YyA8bXZ0Yz46Ci0gMTVjOgkxMCBhZCBmMCAwMCAJbXZ0YyBmcCxwc3cgXHxcfCBub3AKLQotMCswMTYwIDxuZWc+OgotIDE2MDoJMGQgM2QgZjAgMDAgCW5lZyBmcCxmcCBcfFx8IG5vcAotCi0wKzAxNjQgPG5vcD46Ci0gMTY0Ogk3MCAwMCBmMCAwMCAJbm9wIFx8XHwgbm9wCi0KLTArMDE2OCA8bm90PjoKLSAxNjg6CTBkIGJkIGYwIDAwIAlub3QgZnAsZnAgXHxcfCBub3AKLQotMCswMTZjIDxyYWM+OgotIDE2YzoJZGQgYzAgMDAgMDAgCXNldGggZnAsWyNdKjB4MAotCi0wKzAxNzAgPHNsbD46Ci0gMTcwOgkxZCA0ZCBmMCAwMCAJc2xsIGZwLGZwIFx8XHwgbm9wCi0KLTArMDE3NCA8c2xsMz46Ci0gMTc0Ogk5ZCBjZCAwMCAwMCAJc2xsMyBmcCxmcCxbI10qMAotCi0wKzAxNzggPHNsbGk+OgotIDE3ODoJNWQgNDAgZjAgMDAgCXNsbGkgZnAsWyNdKjB4MCBcfFx8IG5vcAotCi0wKzAxN2MgPHNyYT46Ci0gMTdjOgkxZCAyZCBmMCAwMCAJc3JhIGZwLGZwIFx8XHwgbm9wCi0KLTArMDE4MCA8c3JhMz46Ci0gMTgwOgk5ZCBhZCAwMCAwMCAJc3JhMyBmcCxmcCxbI10qMAotCi0wKzAxODQgPHNyYWk+OgotIDE4NDoJNWQgMjAgZjAgMDAgCXNyYWkgZnAsWyNdKjB4MCBcfFx8IG5vcAotCi0wKzAxODggPHNybD46Ci0gMTg4OgkxZCAwZCBmMCAwMCAJc3JsIGZwLGZwIFx8XHwgbm9wCi0KLTArMDE4YyA8c3JsMz46Ci0gMThjOgk5ZCA4ZCAwMCAwMCAJc3JsMyBmcCxmcCxbI10qMAotCi0wKzAxOTAgPHNybGk+OgotIDE5MDoJNWQgMDAgZjAgMDAgCXNybGkgZnAsWyNdKjB4MCBcfFx8IG5vcAotCi0wKzAxOTQgPHN0PjoKLSAxOTQ6CTJkIDRkIGYwIDAwIAlzdCBmcCxAZnAgXHxcfCBub3AKLQotMCswMTk4IDxzdF8yPjoKLSAxOTg6CTJkIDRkIGYwIDAwIAlzdCBmcCxAZnAgXHxcfCBub3AKLQotMCswMTljIDxzdF9kPjoKLSAxOWM6CWFkIDRkIDAwIDAwIAlzdCBmcCxAXCgwLGZwXCkKLQotMCswMWEwIDxzdF9kMj46Ci0gMWEwOglhZCA0ZCAwMCAwMCAJc3QgZnAsQFwoMCxmcFwpCi0KLTArMDFhNCA8c3RiPjoKLSAxYTQ6CTJkIDBkIGYwIDAwIAlzdGIgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDFhOCA8c3RiXzI+OgotIDFhODoJMmQgMGQgZjAgMDAgCXN0YiBmcCxAZnAgXHxcfCBub3AKLQotMCswMWFjIDxzdGJfZD46Ci0gMWFjOglhZCAwZCAwMCAwMCAJc3RiIGZwLEBcKDAsZnBcKQotCi0wKzAxYjAgPHN0Yl9kMj46Ci0gMWIwOglhZCAwZCAwMCAwMCAJc3RiIGZwLEBcKDAsZnBcKQotCi0wKzAxYjQgPHN0aD46Ci0gMWI0OgkyZCAyZCBmMCAwMCAJc3RoIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAxYjggPHN0aF8yPjoKLSAxYjg6CTJkIDJkIGYwIDAwIAlzdGggZnAsQGZwIFx8XHwgbm9wCi0KLTArMDFiYyA8c3RoX2Q+OgotIDFiYzoJYWQgMmQgMDAgMDAgCXN0aCBmcCxAXCgwLGZwXCkKLQotMCswMWMwIDxzdGhfZDI+OgotIDFjMDoJYWQgMmQgMDAgMDAgCXN0aCBmcCxAXCgwLGZwXCkKLQotMCswMWM0IDxzdF9wbHVzPjoKLSAxYzQ6CTJkIDZkIGYwIDAwIAlzdCBmcCxAXCtmcCBcfFx8IG5vcAotCi0wKzAxYzggPHN0X21pbnVzPjoKLSAxYzg6CTJkIDdkIGYwIDAwIAlzdCBmcCxALWZwIFx8XHwgbm9wCi0KLTArMDFjYyA8c3ViPjoKLSAxY2M6CTBkIDJkIGYwIDAwIAlzdWIgZnAsZnAgXHxcfCBub3AKLQotMCswMWQwIDxzdWJ2PjoKLSAxZDA6CTBkIDBkIGYwIDAwIAlzdWJ2IGZwLGZwIFx8XHwgbm9wCi0KLTArMDFkNCA8c3VieD46Ci0gMWQ0OgkwZCAxZCBmMCAwMCAJc3VieCBmcCxmcCBcfFx8IG5vcAotCi0wKzAxZDggPHRyYXA+OgotIDFkODoJMTAgZjAgZjAgMDAgCXRyYXAgWyNdKjB4MCBcfFx8IG5vcAotCi0wKzAxZGMgPHVubG9jaz46Ci0gMWRjOgkyZCA1ZCBmMCAwMCAJdW5sb2NrIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAxZTAgPHB1c2g+OgotIDFlMDoJMmQgN2YgZjAgMDAgCXB1c2ggZnAgXHxcfCBub3AKLQotMCswMWU0IDxwb3A+OgotIDFlNDoJMmQgZWYgZjAgMDAgCXBvcCBmcCBcfFx8IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZGRkMGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBNMzJSIGFzc2VtYmxlciB0ZXN0c3VpdGUuCi0KLWlmIFtpc3RhcmdldCBtMzJyKi0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJhbGxpbnNuIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiNDU2OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24ucworKysgL2Rldi9udWxsCkBAIC0xLDUwMSArMCwwIEBACi0gLmRhdGEKLWZvb2RhdGE6IC53b3JkIDQyCi0gLnRleHQKLWZvb3RleHQ6Ci0JLnRleHQKLQkuZ2xvYmFsIGFkZAotYWRkOgotCWFkZCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBhZGQzCi1hZGQzOgotCWFkZDMgZnAsZnAsIzAKLQkudGV4dAotCS5nbG9iYWwgYW5kCi1hbmQ6Ci0JYW5kIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIGFuZDMKLWFuZDM6Ci0JYW5kMyBmcCxmcCwjMAotCS50ZXh0Ci0JLmdsb2JhbCBvcgotb3I6Ci0Jb3IgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgb3IzCi1vcjM6Ci0Jb3IzIGZwLGZwLCMwCi0JLnRleHQKLQkuZ2xvYmFsIHhvcgoteG9yOgotCXhvciBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCB4b3IzCi14b3IzOgotCXhvcjMgZnAsZnAsIzAKLQkudGV4dAotCS5nbG9iYWwgYWRkaQotYWRkaToKLQlhZGRpIGZwLCMwCi0JLnRleHQKLQkuZ2xvYmFsIGFkZHYKLWFkZHY6Ci0JYWRkdiBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBhZGR2MwotYWRkdjM6Ci0JYWRkdjMgZnAsZnAsIzAKLQkudGV4dAotCS5nbG9iYWwgYWRkeAotYWRkeDoKLQlhZGR4IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIGJjOAotYmM4OgotCWJjIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmM4X3MKLWJjOF9zOgotCWJjLnMgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBiYzI0Ci1iYzI0OgotCWJjIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmMyNF9sCi1iYzI0X2w6Ci0JYmMubCBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJlcQotYmVxOgotCWJlcSBmcCxmcCxmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJlcXoKLWJlcXo6Ci0JYmVxeiBmcCxmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJnZXoKLWJnZXo6Ci0JYmdleiBmcCxmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJndHoKLWJndHo6Ci0JYmd0eiBmcCxmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJsZXoKLWJsZXo6Ci0JYmxleiBmcCxmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJsdHoKLWJsdHo6Ci0JYmx0eiBmcCxmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJuZXoKLWJuZXo6Ci0JYm5leiBmcCxmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJsOAotYmw4OgotCWJsIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmw4X3MKLWJsOF9zOgotCWJsLnMgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibDI0Ci1ibDI0OgotCWJsIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmwyNF9sCi1ibDI0X2w6Ci0JYmwubCBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJuYzgKLWJuYzg6Ci0JYm5jIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYm5jOF9zCi1ibmM4X3M6Ci0JYm5jLnMgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibmMyNAotYm5jMjQ6Ci0JYm5jIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYm5jMjRfbAotYm5jMjRfbDoKLQlibmMubCBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJuZQotYm5lOgotCWJuZSBmcCxmcCxmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJyYTgKLWJyYTg6Ci0JYnJhIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYnJhOF9zCi1icmE4X3M6Ci0JYnJhLnMgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBicmEyNAotYnJhMjQ6Ci0JYnJhIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYnJhMjRfbAotYnJhMjRfbDoKLQlicmEubCBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGNtcAotY21wOgotCWNtcCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBjbXBpCi1jbXBpOgotCWNtcGkgZnAsIzAKLQkudGV4dAotCS5nbG9iYWwgY21wdQotY21wdToKLQljbXB1IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIGNtcHVpCi1jbXB1aToKLQljbXB1aSBmcCwjMAotCS50ZXh0Ci0JLmdsb2JhbCBkaXYKLWRpdjoKLQlkaXYgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgZGl2dQotZGl2dToKLQlkaXZ1IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHJlbQotcmVtOgotCXJlbSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCByZW11Ci1yZW11OgotCXJlbXUgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgamwKLWpsOgotCWpsIGZwCi0JLnRleHQKLQkuZ2xvYmFsIGptcAotam1wOgotCWptcCBmcAotCS50ZXh0Ci0JLmdsb2JhbCBsZAotbGQ6Ci0JbGQgZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIGxkXzIKLWxkXzI6Ci0JbGQgZnAsQChmcCkKLQkudGV4dAotCS5nbG9iYWwgbGRfZAotbGRfZDoKLQlsZCBmcCxAKDAsZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkX2QyCi1sZF9kMjoKLQlsZCBmcCxAKGZwLDApCi0JLnRleHQKLQkuZ2xvYmFsIGxkYgotbGRiOgotCWxkYiBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgbGRiXzIKLWxkYl8yOgotCWxkYiBmcCxAKGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZGJfZAotbGRiX2Q6Ci0JbGRiIGZwLEAoMCxmcCkKLQkudGV4dAotCS5nbG9iYWwgbGRiX2QyCi1sZGJfZDI6Ci0JbGRiIGZwLEAoZnAsMCkKLQkudGV4dAotCS5nbG9iYWwgbGRoCi1sZGg6Ci0JbGRoIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBsZGhfMgotbGRoXzI6Ci0JbGRoIGZwLEAoZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkaF9kCi1sZGhfZDoKLQlsZGggZnAsQCgwLGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZGhfZDIKLWxkaF9kMjoKLQlsZGggZnAsQChmcCwwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZHViCi1sZHViOgotCWxkdWIgZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWJfMgotbGR1Yl8yOgotCWxkdWIgZnAsQChmcCkKLQkudGV4dAotCS5nbG9iYWwgbGR1Yl9kCi1sZHViX2Q6Ci0JbGR1YiBmcCxAKDAsZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWJfZDIKLWxkdWJfZDI6Ci0JbGR1YiBmcCxAKGZwLDApCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWgKLWxkdWg6Ci0JbGR1aCBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgbGR1aF8yCi1sZHVoXzI6Ci0JbGR1aCBmcCxAKGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZHVoX2QKLWxkdWhfZDoKLQlsZHVoIGZwLEAoMCxmcCkKLQkudGV4dAotCS5nbG9iYWwgbGR1aF9kMgotbGR1aF9kMjoKLQlsZHVoIGZwLEAoZnAsMCkKLQkudGV4dAotCS5nbG9iYWwgbGRfcGx1cwotbGRfcGx1czoKLQlsZCBmcCxAZnArCi0JLnRleHQKLQkuZ2xvYmFsIGxkMjQKLWxkMjQ6Ci0JbGQyNCBmcCxmb29kYXRhCi0JLnRleHQKLQkuZ2xvYmFsIGxkaTgKLWxkaTg6Ci0JbGRpIGZwLDAKLQkudGV4dAotCS5nbG9iYWwgbGRpMTYKLWxkaTE2OgotCWxkaSBmcCwyNTYKLQkudGV4dAotCS5nbG9iYWwgbG9jawotbG9jazoKLQlsb2NrIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBtYWNoaQotbWFjaGk6Ci0JbWFjaGkgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbWFjbG8KLW1hY2xvOgotCW1hY2xvIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG1hY3doaQotbWFjd2hpOgotCW1hY3doaSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtYWN3bG8KLW1hY3dsbzoKLQltYWN3bG8gZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbXVsCi1tdWw6Ci0JbXVsIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG11bGhpCi1tdWxoaToKLQltdWxoaSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdWxsbwotbXVsbG86Ci0JbXVsbG8gZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbXVsd2hpCi1tdWx3aGk6Ci0JbXVsd2hpIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG11bHdsbwotbXVsd2xvOgotCW11bHdsbyBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdgotbXY6Ci0JbXYgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbXZmYWNoaQotbXZmYWNoaToKLQltdmZhY2hpIGZwCi0JLnRleHQKLQkuZ2xvYmFsIG12ZmFjbG8KLW12ZmFjbG86Ci0JbXZmYWNsbyBmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdmZhY21pCi1tdmZhY21pOgotCW12ZmFjbWkgZnAKLQkudGV4dAotCS5nbG9iYWwgbXZmYwotbXZmYzoKLQltdmZjIGZwLHBzdwotCS50ZXh0Ci0JLmdsb2JhbCBtdnRhY2hpCi1tdnRhY2hpOgotCW12dGFjaGkgZnAKLQkudGV4dAotCS5nbG9iYWwgbXZ0YWNsbwotbXZ0YWNsbzoKLQltdnRhY2xvIGZwCi0JLnRleHQKLQkuZ2xvYmFsIG12dGMKLW12dGM6Ci0JbXZ0YyBmcCxwc3cKLQkudGV4dAotCS5nbG9iYWwgbmVnCi1uZWc6Ci0JbmVnIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG5vcAotbm9wOgotCW5vcAotCS50ZXh0Ci0JLmdsb2JhbCBub3QKLW5vdDoKLQlub3QgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgcmFjCi1yYWM6Ci0JLnRleHQKLQkuZ2xvYmFsIHJhY2gKLXJhY2g6Ci0JLnRleHQKLQkuZ2xvYmFsIHJ0ZQotcnRlOgotCS50ZXh0Ci0JLmdsb2JhbCBzZXRoCi1zZXRoOgotCXNldGggZnAsMAotCS50ZXh0Ci0JLmdsb2JhbCBzbGwKLXNsbDoKLQlzbGwgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgc2xsMwotc2xsMzoKLQlzbGwzIGZwLGZwLDAKLQkudGV4dAotCS5nbG9iYWwgc2xsaQotc2xsaToKLQlzbGxpIGZwLDAKLQkudGV4dAotCS5nbG9iYWwgc3JhCi1zcmE6Ci0Jc3JhIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHNyYTMKLXNyYTM6Ci0Jc3JhMyBmcCxmcCwwCi0JLnRleHQKLQkuZ2xvYmFsIHNyYWkKLXNyYWk6Ci0Jc3JhaSBmcCwwCi0JLnRleHQKLQkuZ2xvYmFsIHNybAotc3JsOgotCXNybCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBzcmwzCi1zcmwzOgotCXNybDMgZnAsZnAsMAotCS50ZXh0Ci0JLmdsb2JhbCBzcmxpCi1zcmxpOgotCXNybGkgZnAsMAotCS50ZXh0Ci0JLmdsb2JhbCBzdAotc3Q6Ci0Jc3QgZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIHN0XzIKLXN0XzI6Ci0Jc3QgZnAsQChmcCkKLQkudGV4dAotCS5nbG9iYWwgc3RfZAotc3RfZDoKLQlzdCBmcCxAKDAsZnApCi0JLnRleHQKLQkuZ2xvYmFsIHN0X2QyCi1zdF9kMjoKLQlzdCBmcCxAKGZwLDApCi0JLnRleHQKLQkuZ2xvYmFsIHN0Ygotc3RiOgotCXN0YiBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgc3RiXzIKLXN0Yl8yOgotCXN0YiBmcCxAKGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdGJfZAotc3RiX2Q6Ci0Jc3RiIGZwLEAoMCxmcCkKLQkudGV4dAotCS5nbG9iYWwgc3RiX2QyCi1zdGJfZDI6Ci0Jc3RiIGZwLEAoZnAsMCkKLQkudGV4dAotCS5nbG9iYWwgc3RoCi1zdGg6Ci0Jc3RoIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBzdGhfMgotc3RoXzI6Ci0Jc3RoIGZwLEAoZnApCi0JLnRleHQKLQkuZ2xvYmFsIHN0aF9kCi1zdGhfZDoKLQlzdGggZnAsQCgwLGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdGhfZDIKLXN0aF9kMjoKLQlzdGggZnAsQChmcCwwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdF9wbHVzCi1zdF9wbHVzOgotCXN0IGZwLEArZnAKLQkudGV4dAotCS5nbG9iYWwgc3RfbWludXMKLXN0X21pbnVzOgotCXN0IGZwLEAtZnAKLQkudGV4dAotCS5nbG9iYWwgc3ViCi1zdWI6Ci0Jc3ViIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHN1YnYKLXN1YnY6Ci0Jc3VidiBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBzdWJ4Ci1zdWJ4OgotCXN1YnggZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgdHJhcAotdHJhcDoKLQl0cmFwIDAKLQkudGV4dAotCS5nbG9iYWwgdW5sb2NrCi11bmxvY2s6Ci0JdW5sb2NrIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBwdXNoCi1wdXNoOgotCXB1c2ggZnAKLQkudGV4dAotCS5nbG9iYWwgcG9wCi1wb3A6Ci0JcG9wIGZwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5Y2YwMmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotI2FzOgotI29iamR1bXA6IC1kcgotI25hbWU6IGZzbG90Ci0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswIDxibD46Ci0gKjA6CTdlIDAwIGYwIDAwIAlibCAwIDxibD4gXHxcfCBub3AKLSAqNDoJNjAgMDggZjAgMDAgCWxkaSByMCxbI10qOCBcfFx8IG5vcAotCi0wKzggPGJsX3M+OgotICo4Ogk3ZSAwMCBmMCAwMCAJYmwgOCA8Ymxfcz4gXHxcfCBub3AKLSAqYzoJNjAgMDggZjAgMDAgCWxkaSByMCxbI10qOCBcfFx8IG5vcAotCi0wKzEwIDxicmE+OgotICoxMDoJN2YgMDAgZjAgMDAgCWJyYSAxMCA8YnJhPiBcfFx8IG5vcAotICoxNDoJNjAgMDggZjAgMDAgCWxkaSByMCxbI10qOCBcfFx8IG5vcAotCi0wKzE4IDxicmFfcz46Ci0gKjE4Ogk3ZiAwMCBmMCAwMCAJYnJhIDE4IDxicmFfcz4gXHxcfCBub3AKLSAqMWM6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKLQotMCsyMCA8amw+OgotICoyMDoJMWUgYzAgZjAgMDAgCWpsIHIwIFx8XHwgbm9wCi0gKjI0Ogk2MCAwOCBmMCAwMCAJbGRpIHIwLFsjXSo4IFx8XHwgbm9wCi0KLTArMjggPHRyYXA+OgotICoyODoJMTAgZjQgZjAgMDAgCXRyYXAgWyNdKjB4NCBcfFx8IG5vcAotICoyYzoJNjAgMDggZjAgMDAgCWxkaSByMCxbI10qOCBcfFx8IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODZiNjY0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3QucworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgVGVzdCB0aGUgRklMTC1TTE9UIGF0dHJpYnV0ZS4KLSMgVGhlIEZJTEwtU0xPVCBhdHRyaWJ1dGUgZW5zdXJlcyB0aGUgbmV4dCBpbnNuIGJlZ2lucyBvbiBhIDMyIGJ5dGUgYm91bmRhcnkuCi0jIFRoaXMgaXMgbmVlZGVkIGZvciBleGFtcGxlIHdpdGggYmwgYmVjYXVzZSB0aGUgc3Vicm91dGluZSB3aWxsIHJldHVybgotIyB0byBhIDMyIGJpdCBib3VuZGFyeS4KLQotCS50ZXh0Ci1ibDoKLQlibCBibAotCWxkaSByMCwjOAotYmxfczoKLQlibC5zIGJsX3MKLQlsZGkgcjAsIzgKLQotYnJhOgotCWJyYSBicmEKLQlsZGkgcjAsIzgKLWJyYV9zOgotCWJyYS5zIGJyYV9zCi0JbGRpIHIwLCM4Ci0KLWpsOgotCWpsIHIwCi0JbGRpIHIwLCM4Ci0KLXRyYXA6Ci0JdHJhcCAjNAotCWxkaSByMCwjOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9oaWdoLTEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvaGlnaC0xLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1Y2NiOGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9oaWdoLTEuZAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSNhczoKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBoaWdoLTEKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKiA8Zm9vPjoKLSAqMDoJZDQgYzAgMDAgMDEgCXNldGggcjQsWyNdKjB4MQotWyAJXSowOiBSX00zMlJfSEkxNl9VTE8JLnRleHQKLSAqNDoJODQgZTQgMDAgMDAgCW9yMyByNCxyNCxbI10qMHgwCi1bIAldKjQ6IFJfTTMyUl9MTzE2CS50ZXh0Ci0gKjg6CWQ0IGMwIDEyIDM0IAlzZXRoIHI0LFsjXSoweDEyMzQKLSAqYzoJODQgZTQgODcgNjUgCW9yMyByNCxyNCxbI10qMHg4NzY1Ci0gKjEwOglkNCBjMCAxMiAzNSAJc2V0aCByNCxbI10qMHgxMjM1Ci0gKjE0Ogk4NCBlNCA4NyA2NSAJb3IzIHI0LHI0LFsjXSoweDg3NjUKLSAqMTg6CWQ0IGMwIDg3IDY1IAlzZXRoIHI0LFsjXSoweDg3NjUKLSAqMWM6CTg0IGU0IDQzIDIxIAlvcjMgcjQscjQsWyNdKjB4NDMyMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9oaWdoLTEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvaGlnaC0xLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNWQxZDEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9oaWdoLTEucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTsgVGVzdCBoaWdoL3NoaWdoIGhhbmRsaW5nLgotCi1mb286Ci0Jc2V0aCByNCwjaGlnaChmb28rMHgxMDAwMCkKLQlvcjMgIHI0LHI0LCNsb3coZm9vKzB4MTAwMDApCi0KLQlzZXRoIHI0LCNoaWdoKDB4MTIzNDg3NjUpCi0Jb3IzICByNCxyNCwjbG93KDB4MTIzNDg3NjUpCi0KLQlzZXRoIHI0LCNzaGlnaCgweDEyMzQ4NzY1KQotCW9yMyAgcjQscjQsI2xvdygweDEyMzQ4NzY1KQotCi0Jc2V0aCByNCwjc2hpZ2goMHg4NzY1NDMyMSkKLQlvcjMgIHI0LHI0LCNsb3coMHg4NzY1NDMyMSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvbTMyci5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL20zMnIuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGMyMzY0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvbTMyci5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgTTMyUiB0ZXN0Y2FzZXMKLQotaWYgW2lzdGFyZ2V0IG0zMnIqLSotKl0gewotICAgIHJ1bl9kdW1wX3Rlc3QgImhpZ2gtMSIKLSAgICBydW5fZHVtcF90ZXN0ICJyZWxheC0xIgotICAgIHJ1bl9kdW1wX3Rlc3QgInVwcGVyY2FzZSIKLSAgICBydW5fZHVtcF90ZXN0ICJmc2xvdCIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvb3V0b2ZyYW5nZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9vdXRvZnJhbmdlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MGQzMTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9vdXRvZnJhbmdlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotOyBUZXN0IGVycm9yIG1lc3NhZ2VzIHdoZXJlIGJyYW5jaGVzIGFyZSBvdXQgb2YgcmFuZ2UuCi0KLTsgeyBkZy1kbyBhc3NlbWJsZSB7IHRhcmdldCBtMzJyLSotKiB9IH0KLQotCS50ZXh0Ci0JLmdsb2JhbCBmb28KLWZvbzoKLQlibC5zIGxhYmVsCi0JCTsgeyBkZy1lcnJvciAib3V0IG9mIHJhbmdlIiAib3V0IG9mIHJhbmdlIGJsLnMiIHsgdGFyZ2V0ICotKi0qIH0geyA4IH0gfQotCWJuYy5zIGxhYmVsCi0JCTsgeyBkZy1lcnJvciAib3V0IG9mIHJhbmdlIiAib3V0IG9mIHJhbmdlIGJuYy5zIiB7IHRhcmdldCAqLSotKiB9IHsgMTAgfSB9Ci0JYnJhLnMgbGFiZWwKLQkJOyB7IGRnLWVycm9yICJvdXQgb2YgcmFuZ2UiICJvdXQgb2YgcmFuZ2UgYnJhLnMiIHsgdGFyZ2V0ICotKi0qIH0geyAxMiB9IH0KLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi1sYWJlbDoKLQlqbXAgcjE0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTRmY2I4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotI2FzOgotI29iamR1bXA6IC1kcgotI25hbWU6IHJlbGF4LTEKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKiA8RG9lc05vdFdvcms+OgotICowOgk3MCAwMCA3MCAwMCAqCW5vcCAtPiBub3AKLQotMCo0IDxXb3JrPjoKLSAqNDoJNzAgMDAgNzAgMDAgKglub3AgLT4gbm9wCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC5icmFuY2g6Ci0KLTAqIDxicmFuY2g+OgotICowOglmZiAwMCAwMCAwMSAJYnJhIDQgPFdvcms+Ci1bIAldKjA6IFJfTTMyUl8yNl9QQ1JFTAkudGV4dApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0xLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlMTJjMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTEucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTsgVGVzdCByZWxheGF0aW9uIGludG8gbm9uLXplcm8gb2Zmc2V0IHRvIGRpZmZlcmVudCBzZWdtZW50LgotCi0JLnNlY3Rpb24gLmJyYW5jaCwgImF4IixAcHJvZ2JpdHMKLQkuYmFsaWduIDQKLWJyYW5jaDoKLSAgICAgICAgYnJhIFdvcmsKLQotCi0JLnNlY3Rpb24gLnRleHQKLSAgICAgICAgLmJhbGlnbiA0Ci1Eb2VzTm90V29yazoKLQlub3AKLQlub3AKLQotV29yazoKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvdXBwZXJjYXNlLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3VwcGVyY2FzZS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmIxMzQ1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvdXBwZXJjYXNlLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jYXM6Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogdXBwZXJjYXNlCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAwIDxmb28+OgotICAgMDoJMTAgODEgMTAgOTEgKgltdiByMCxyMSAtPiBtdmZjIHIwLGNicgotCi0wKzAwMDQgPGhpZ2g+OgotICAgNDoJZDAgYzAgMDAgMDAgCXNldGggcjAsIzB4MAotWyAJXSo0OiBSX00zMlJfSEkxNl9VTE8JWy5ddGV4dAotCi0wKzAwMDggPHNoaWdoPjoKLSAgIDg6CWQwIGMwIDAwIDAwIAlzZXRoIHIwLCMweDAKLVsgCV0qODogUl9NMzJSX0hJMTZfU0xPCVsuXXRleHQKLQotMCswMDBjIDxsb3c+OgotICAgYzoJODAgZTAgMDAgMGMgCW9yMyByMCxyMCwjMHhjCi1bIAldKmM6IFJfTTMyUl9MTzE2CVsuXXRleHQKLQotMCswMDEwIDxzZGE+OgotICAxMDoJODAgYTAgMDAgMDAgCWFkZDMgcjAscjAsIzAKLVsgCV0qMTA6IFJfTTMyUl9TREExNglzZGF2YXIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvdXBwZXJjYXNlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3VwcGVyY2FzZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGFlYWZkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvdXBwZXJjYXNlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0JLnRleHQKLQkuZ2xvYmFsIGZvbwotZm9vOgotCW12IFIwLFIxCi0JbXZmYyBSMCxDQlIKLQotaGlnaDoKLQlzZXRoIHIwLCNISUdIKGhpZ2gpCi1zaGlnaDoKLQlzZXRoIHIwLCNTSElHSChzaGlnaCkKLWxvdzoKLQlvcjMgcjAscjAsI0xPVyhsb3cpCi1zZGE6Ci0JYWRkMyByMCxyMCwjU0RBKHNkYXZhcikKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9nYXMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL2dhcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiN2VlZmEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL2dhcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jCi0jIFNvbWUgbTY4ay1jb2ZmIHRlc3RzCi0jCi1pZiBbaXN0YXJnZXQgbTY4Ki0qLWNvZmZdIHRoZW4gewotICAgIGdhc190ZXN0ICJwMjQzMC5zIiAiIiAkc3Rkb3B0bGlzdCAibG9jYWwgYnJhbmNoIG5vdCBpbiB0ZXh0IHNlY3Rpb24iCi0KLSAgICBnYXNfdGVzdCAicDI0MzBhLnMiICIiICRzdGRvcHRsaXN0ICJsb2NhbCBicmFuY2ggbm90IGluIHRleHQgc2VjdGlvbiIKLQotICAgIGdhc190ZXN0ICJ0MS5zIiAiIiAkc3Rkb3B0bGlzdCAibXVsdGlwbGUgLmZpbGUgZGlyZWN0aXZlcyIKLQotICAgIGdhc190ZXN0ICJwMjM4OS5zIiAiIiAkc3Rkb3B0bGlzdCAiYnNzIGZpbGwiCi0KLSAgICBzZXR1cF94ZmFpbCBtNjgqLSotY29mZgotICAgIGdhc190ZXN0X2Vycm9yICJwMjM4OWEucyIgIiIgImRldGVjdCBic3MgZmlsbCB3aXRoIG5vbi16ZXJvIGRhdGEiCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDIzODkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjM4OS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmE5M2U5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjM4OS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyAgSSByZWFjaGVkIGEgcG9pbnQgd2hlcmUgdGhlIGZpbGUgbG9va3MKLSMgY2xlYW4gYW5kIGNvbXBsaWVzIHdpdGggZ2FzIHN5bnRheCwgYnV0IGl0IGNvcmUgZHVtcHMgZ2FzLiBIZXJlJ3MgYQotIyBsaXR0bGUgZ2RiIGluZm86Ci0jCi0jIFByb2dyYW0gdGVybWluYXRlZCB3aXRoIHNpZ25hbCAxMSwgU2VnbWVudGF0aW9uIGZhdWx0LgotIyAjMCAgMHg2MzIzYyBpbiBtZW1jcHkgKCkKLSMgKGdkYikgYnQKLSMgIzAgIDB4NjMyM2MgaW4gbWVtY3B5ICgpCi0jICMxICAweGYyYjAgaW4gZmlsbF9zZWN0aW9uIChhYmZkPTB4ZWFlZTgsIGZpbGVoZHI9MHg4YTdmNCwgCi0jICAgICBmaWxlX2N1cnNvcj0weGY3ZmZmNjU0KSBhdCBvYmotZm9ybWF0LmM6NTM0Ci0jICMyICAweDExMmE4IGluIHdyaXRlX29iamVjdF9maWxlICgpIGF0IG9iai1mb3JtYXQuYzoxNzg2Ci0jICMzICAweDEzZWY4IGluIG1haW4gKGFyZ2M9NSwgYXJndj0weGY3ZmZmN2JjKSBhdCAuLi8uLi9wMy9nYXMvYXMuYzozMTAKLSMgKGdkYikgCi0jCi0jIGdhcyBkaWQgbWFuYWdlIHRvIGNyZWF0ZSB0aGUgLm8gZmlsZSBhdCB0aGlzIHBvaW50LgotCi0JLmJzcwotCi1fQVNJQ19JTlRfVEJMOiAgIC5zcGFjZSAzMiwwCXwga2VlcCBpbnRlcnJ1cHQgcm91dGluZXMgaGVyZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyMzg5YS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyMzg5YS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmIyNzY1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjM4OWEucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCS5ic3MKLQotX0FTSUNfSU5UX1RCTDogICAuc3BhY2UgMzIsMQl8IGtlZXAgaW50ZXJydXB0IHJvdXRpbmVzIGhlcmUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjQzMC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyNDMwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NzIzZDkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyNDMwLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgVGhpcyBkaWZmZXJzIGZyb20gcDI0MzBhLnMgKHRoZSBjdXN0b21lcidzIGFjdHVhbCBzb3VyY2UgZmlsZSkgb25seQotIyBpbiB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cy4gIFN0cmFuZ2VseSwgdGhpcyBmaWxlIGdhdmUgbm8gcHJvYmxlbXMuLi4KLQotCS5zZWN0IGZvbwotdGFnOgotCWJyYSB0YWcKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjQzMGEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjQzMGEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAxZmIxMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDI0MzBhLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSAgICAuc2VjdCBmb28KLQotdGFnOgotCWJyYSB0YWcKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi90MS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3QxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMDE1ZjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3QxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jIDEgImxpYmdjYzEuUyIKLSMgNDIgImxpYnh5ejEuUyIKLSMgMjU5ICJsaWJnY2MxLlMiCi0JLnRleHQKLQkucHJvYwotfCNQUk9DIyAwNAotCS5nbG9ibAkgX19tdWxzaTMgICAgICAKLSBfX211bHNpMyAgICAgIDoKLXwjUFJPTE9HVUUjIDAKLQlsaW5rCSAgJWE2ICAgICAgICwjMAotCWFkZGwJIy1MRjE0LCAgJXNwICAgICAgIAotCW1vdmVtbAkjTFMxNCwgICVzcCAgICAgICBACi18I1BST0xPR1VFIyAxCi0JbW92ZXcJICAlYTYgICAgICAgQCgweDgpLCAgICVkMCAgICAgICAJIAotCW11bHV3CSAgJWE2ICAgICAgIEAoMHhlKSwgICAlZDAgICAgICAgCSAKLQltb3ZldwkgICVhNiAgICAgICBAKDB4YSksICAgJWQxICAgICAgIAkgCi0JbXVsdXcJICAlYTYgICAgICAgQCgweGMpLCAgICVkMSAgICAgICAJIAotCWFkZHcJICAlZDEgICAgICAgLCAgICVkMCAgICAgICAKLQlsc2xsCSM4LCAgICVkMCAgICAgICAKLQlsc2xsCSM4LCAgICVkMCAgICAgICAKLQltb3ZldwkgICVhNiAgICAgICBAKDB4YSksICAgJWQxICAgICAgIAkgCi0JbXVsdXcJICAlYTYgICAgICAgQCgweGUpLCAgICVkMSAgICAgICAJIAotCWFkZGwJICAlZDEgICAgICAgLCAgICVkMCAgICAgICAKLQlqcmEJTEUxNAotTEUxNDoKLXwjUFJPTE9HVUUjIDIKLQltb3ZlbWwJICAlc3AgICAgICAgQCwgI0xTMTQKLQl1bmxrCSAgJWE2ICAgICAgIAotfCNQUk9MT0dVRSMgMwotCXJ0cwotCUxGMTQgPSA0Ci0JTFMxNCA9IDB4MDAwMgkJIAotCUxGRjE0ID0gMAotIyAzNTQgImxpYmdjYzEuUyIKLQlMU1MxNCA9IDB4MAotCUxWMTQgPSAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2FsbC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2FsbC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YWIyYTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9hbGwuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIwotIyBTb21lIGdlbmVyaWMgbTY4ayB0ZXN0cwotIwotaWYgW2lzdGFyZ2V0IG02OCotKi0qXSB0aGVuIHsKLSAgICBnYXNfdGVzdCAidDIucyIgIiIgIiIgImNyb3NzLXNlY3Rpb24gYnJhbmNoIgotICAgIGlmIFtpc3RhcmdldCBtNjgqLW1vdG9yb2xhLXN5c3ZdIHRoZW4gewotCXJ1bl9kdW1wX3Rlc3QgdDIKLSAgICB9Ci0KLSAgICBnYXNfdGVzdCAicGljMS5zIiAiIiAiIiAiUElDIGdlbmVyYXRpb24iCi0KLSAgICBnYXNfdGVzdCAiZGlzcGVyci5zIiAiLW02ODAyMCIgIiIgIkluY29ycmVjdCBEaXNwbGFjZW1lbnQgdG9vIGxvbmcgZXJyb3IiCi0KLSAgICBnYXNfdGVzdF9lcnJvciAicDI0MTAucyIgIiIgIm91dC1vZi1yYW5nZSAnYnJhcyciCi0KLSAgICBydW5fZHVtcF90ZXN0IHBjcmVsCi0gICAgcnVuX2R1bXBfdGVzdCBvcGVyYW5kcwotICAgIHJ1bl9kdW1wX3Rlc3QgY2FzCi0gICAgcnVuX2R1bXBfdGVzdCBiaXRmaWVsZAotICAgIHJ1bl9kdW1wX3Rlc3QgbGluawotICAgIHJ1bl9kdW1wX3Rlc3QgZm1vdmVtbAotCi0gICAgc2V0IHRlc3RuYW1lICI2ODAwMCBvcGVyYW5kcyIKLSAgICBnYXNfcnVuICJvcGVyYW5kcy5zIiAiLW02ODAwMCIgIjI+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+IG9yICAgICAgICAgIHIwLHIwLHIwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL2luaXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvaW5pdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTY4MWNiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvaW5pdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi07IFRlc3QgcHJvcGVyIHBhZGRpbmcgb2YgdGhlIC5pbml0IHNlY3Rpb24KLQlzZWN0aW9uCSAuaW5pdCwieCIKLQlhbGlnbgkgNAotCXN1YnUJIHIzMSxyMzEsMTYKLQlzdAkgcjEzLHIzMSwzMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9tODhrLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvbTg4ay5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MDdjMTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9tODhrLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMKLSMgVGVzdHMgZm9yIG04OGsgc3ZyMyB0YXJnZXRzCi0jCi1pZiB7IFtpc3RhcmdldCBtODgqLSotc3lzdjNdIHx8IFtpc3RhcmdldCBtODgqLSotY29mZiogXSB9IHRoZW4gewotICAgIHNldCB0ZXN0bmFtZSAiUHJvcGVyIHBhZGRpbmcgb2YgLmluaXQgc2VjdGlvbiIKLSAgICBydW5fZHVtcF90ZXN0IGluaXQKLX0KLWlmIFtpbmZvIGV4aXN0cyBlcnJvckluZm9dIHRoZW4gewotICAgIHVuc2V0IGVycm9ySW5mbwotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2Vyci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2Vyci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzk3NjMxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9lcnIucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS5tYWNybwltCi0JbQotCS5lbmRtCi0KLQltCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvaXJwLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvaXJwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MzM2MjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2lycC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI29iamR1bXA6IC1yCi0jbmFtZTogbWFjcm8gaXJwCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiAuKgotT0ZGU0VUWyAJXStUWVBFWyAJXStWQUxVRS4qCi0wKzAwWyAJXStbYS16QS1aMC05X10rWyAJXStyMQotMCswNFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rcjIKLTArMDhbIAldK1thLXpBLVowLTlfXStbIAldK3IzCi0wKzBjWyAJXStbYS16QS1aMC05X10rWyAJXStzMQotMCsxMFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rczIKLTArMTRbIAldK1thLXpBLVowLTlfXStbIAldK3MzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvaXJwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvaXJwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmOWE2MjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2lycC5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLmlycAlwYXJhbSwxLDIsMwotCS5sb25nCXJccGFyYW0KLQkuZW5kcgotCi0JLmlycGMJcGFyYW0sMTIzCi0JLmxvbmcJc1xwYXJhbQotCS5lbmRyCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9tYWNyb3MuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL21hY3Jvcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWU0ODUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL21hY3Jvcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIFJ1biBzb21lIHRlc3RzIG9mIGdhcyBtYWNyb3MuCi0KLWlmICFbaXN0YXJnZXQgaHBwYSotKi0qXSB7Ci0gICAgcnVuX2R1bXBfdGVzdCB0ZXN0MQotfQotCi1ydW5fZHVtcF90ZXN0IHRlc3QyCi0KLXJ1bl9kdW1wX3Rlc3QgdGVzdDMKLQotcnVuX2R1bXBfdGVzdCBpcnAKLQotcnVuX2R1bXBfdGVzdCByZXB0Ci0KLWdhc190ZXN0X2Vycm9yICJlcnIucyIgIiIgIm1hY3JvIGluZmluaXRlIHJlY3Vyc2lvbiIKLQotY2FzZSAkdGFyZ2V0X3RyaXBsZXQgaW4gewotICAgIHsgaHBwYSotKi0qIH0geyB9Ci0gICAgZGVmYXVsdCB7Ci0JcnVuX2R1bXBfdGVzdCBzZW1pCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3JlcHQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9yZXB0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjVkOTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3JlcHQuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI25hbWU6IG1hY3JvIHJlcHQKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIC4qCi1PRkZTRVRbIAldK1RZUEVbIAldK1ZBTFVFLioKLTArMDBbIAldK1thLXpBLVowLTlfXStbIAldK3IxCi0wKzA0WyAJXStbYS16QS1aMC05X10rWyAJXStyMQotMCswOFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rcjEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9yZXB0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvcmVwdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDNjZjY3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9yZXB0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQkucmVwdAkzCi0JLmxvbmcJcjEKLQkuZW5kcgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3NlbWkuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9zZW1pLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlODllNzMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3NlbWkuZAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI29iamR1bXA6IC1zIC1qIC50ZXh0Ci0jbmFtZTogc2VtaQotCi0uKjogLioKLQotQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDoKLSAwMDAwIDNiMjAzYjIwIDNhMjAzYTIwIDAwMDAwMDAwIDAwMDAwMDAwICA7IDsgOiA6IC4uLi4uLi4uCi0gMDAxMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3NlbWkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9zZW1pLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZTA5NjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3NlbWkucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSAgICAgICAgLm1hY3JvIHNlbWljb2xvbgotICAgICAgICAuYXNjaWkgIjsgIgotICAgICAgICAuZW5kbQotCi0gICAgICAgIC5tYWNybyBjb2xvbgotICAgICAgICAuYXNjaWkgIjogIgotICAgICAgICAuZW5kbQotCi0gICAgICAgIHNlbWljb2xvbgotICAgICAgICAuYXNjaWkgIjsgIgotICAgICAgICBjb2xvbgotICAgICAgICAuYXNjaWkgIjogIgotCi0JLnAyYWxpZ24gNSwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0MS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODRiM2ZiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0MS5kCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jbm06IC0tZXh0ZXJuLW9ubHkKLSNuYW1lOiBtYWNybyB0ZXN0IDEKLQotMCswMSBBIHMxCi0wKzAyIEEgczIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0MS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OGI3Y2QuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QxLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQkubWFjcm8JbSBhcmcxIGFyZzIKLQkuZ2xvYmwJXGFyZzEKLQlcYXJnMSA9IFxhcmcyCi0JLmVuZG0KLQotCW0gczEsMQotCW0gczIsMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxZDczNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDIuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI25hbWU6IG1hY3JvIHRlc3QgMgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgLioKLU9GRlNFVFsgCV0rVFlQRVsgCV0rVkFMVUUuKgotMCswMFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rcjEKLTArMDRbIAldK1thLXpBLVowLTlfXStbIAldK3IyCi0wKzA4WyAJXStbYS16QS1aMC05X10rWyAJXStyMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM4Y2U5NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDIucworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCS5tYWNybwltIGFyZzEgYXJnMiBhcmczCi0JLmxvbmcJXGFyZzEKLQkuaWZjCSxcYXJnMlxhcmczCi0JLkVMU0UKLQltCVxhcmcyLFxhcmczCi0JLmVuZGlmCi0JLmVuZG0KLQotCW0JcjEscjIscjMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0My5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ODBmNzYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QzLmQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI25hbWU6IG1hY3JvIHRlc3QgMwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgLioKLU9GRlNFVFsgCV0rVFlQRVsgCV0rVkFMVUUuKgotMCswMFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rcjEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0My5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NDEwYWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQkubWFjcm8JbSBhcmcxIGFyZzIKLQlcYXJnMQotCS5leGl0bQotCVxhcmcyCi0JLmVuZG0KLQotCW0JIi5sb25nIHIxIiwuZ2FyYmFnZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTRjZWRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21jb3JlL2FsbGluc24uZAorKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0jYXM6Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogYWxsaW5zbgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDxhYnM+OgotICAgMDoJMDFlMCAgICAgIAlhYnMJcjAKLQotMCswMDIgPGFkZGM+OgotICAgMjoJMDYyMSAgICAgIAlhZGRjCXIxLCByMgotCi0wKzAwNCA8YWRkaT46Ci0gICA0OgkyMDAzICAgICAgCWFkZGkJcjMsIDEKLQotMCswMDYgPGFkZHU+OgotICAgNjoJMWM1NCAgICAgIAlhZGR1CXI0LCByNQotCi0wKzAwOCA8YW5kPjoKLSAgIDg6CTE2NzYgICAgICAJYW5kCXI2LCByNwotCi0wKzAwYSA8YW5kaT46Ci0gICBhOgkyZTI4ICAgICAgCWFuZGkJcjgsIDIKLQotMCswMGMgPGFuZG4+OgotICAgYzoJMWZhOSAgICAgIAlhbmRuCXI5LCByMTAKLQotMCswMGUgPGFzcj46Ci0gICBlOgkxYWNiICAgICAgCWFzcglyMTEsIHIxMgotCi0wKzAxMCA8YXNyYz46Ci0gIDEwOgkzYTBkICAgICAgCWFzcmMJcjEzCi0KLTArMDEyIDxhc3JpPjoKLSAgMTI6CTNiZmUgICAgICAJYXNyaQlyMTQsIDMxCi0KLTArMDE0IDxiY2xyaT46Ci0gIDE0OgkzMDBmICAgICAgCWJjbHJpCXIxNSwgMAotCi0wKzAxNiA8YmY+OgotICAxNjoJZWZmNCAgICAgIAliZgkweDAKLQotMCswMTggPGJnZW5pPjoKLSAgMTg6CTMyNzAgICAgICAJYmdlbmkJcjAsIDcKLQotMCswMWEgPEJHRU5JPjoKLSAgMWE6CTMyODAgICAgICAJYmdlbmkJcjAsIDgKLQotMCswMWMgPEJHRU5pPjoKLSAgMWM6CTMzZjAgICAgICAJYmdlbmkJcjAsIDMxCi0KLTArMDFlIDxiZ2Vucj46Ci0gIDFlOgkxMzIxICAgICAgCWJnZW5yCXIxLCByMgotCi0wKzAyMCA8YmtwdD46Ci0JLi4uCi0KLTArMDIyIDxibWFza2k+OgotICAyMjoJMmM4MyAgICAgIAlibWFza2kJcjMsIDgKLQotMCswMjQgPEJNQVNLST46Ci0gIDI0OgkyZGYzICAgICAgCWJtYXNraQlyMywgMzEKLQotMCswMjYgPGJyPjoKLSAgMjY6CWY3ZmYgICAgICAJYnIJMHgyNgotCi0wKzAyOCA8YnJldj46Ci0gIDI4OgkwMGY0ICAgICAgCWJyZXYJcjQKLQotMCswMmEgPGJzZXRpPjoKLSAgMmE6CTM1ZTUgICAgICAJYnNldGkJcjUsIDMwCi0KLTArMDJjIDxic3I+OgotICAyYzoJZmZlOSAgICAgIAlic3IJMHgwCi0KLTArMDJlIDxidD46Ci0gIDJlOgllN2U4ICAgICAgCWJ0CTB4MAotCi0wKzAzMCA8YnRzdGk+OgotICAzMDoJMzdiNiAgICAgIAlidHN0aQlyNiwgMjcKLQotMCswMzIgPGNscmM+OgotICAzMjoJMGYwMCAgICAgIAljbXBuZQlyMCwgcjAKLQotMCswMzQgPGNscmY+OgotICAzNDoJMDFkNyAgICAgIAljbHJmCXI3Ci0KLTArMDM2IDxjbHJ0PjoKLSAgMzY6CTAxYzggICAgICAJY2xydAlyOAotCi0wKzAzOCA8Y21waHM+OgotICAzODoJMGNhOSAgICAgIAljbXBocwlyOSwgcjEwCi0KLTArMDNhIDxjbXBsdD46Ci0gIDNhOgkwZGNiICAgICAgCWNtcGx0CXIxMSwgcjEyCi0KLTArMDNjIDxjbXBsZWk+OgotICAzYzoJMjJlYiAgICAgIAljbXBsdGkJcjExLCAxNQotCi0wKzAzZSA8Y21wbHRpPjoKLSAgM2U6CTIzZmQgICAgICAJY21wbHRpCXIxMywgMzIKLQotMCswNDAgPGNtcG5lPjoKLSAgNDA6CTBmZmUgICAgICAJY21wbmUJcjE0LCByMTUKLQotMCswNDIgPGNtcG5laT46Ci0gIDQyOgkyYTAwICAgICAgCWNtcG5laQlyMCwgMAotCi0wKzA0NCA8ZGVjZj46Ci0gIDQ0OgkwMDkxICAgICAgCWRlY2YJcjEKLQotMCswNDYgPGRlY2d0PjoKLSAgNDY6CTAxYTIgICAgICAJZGVjZ3QJcjIKLQotMCswNDggPGRlY2x0PjoKLSAgNDg6CTAxODMgICAgICAJZGVjbHQJcjMKLQotMCswNGEgPGRlY25lPjoKLSAgNGE6CTAxYjQgICAgICAJZGVjbmUJcjQKLQotMCswNGMgPGRlY3Q+OgotICA0YzoJMDA4NSAgICAgIAlkZWN0CXI1Ci0KLTArMDRlIDxkaXZzPjoKLSAgNGU6CTMyMTYgICAgICAJZGl2cwlyNiwgcjEKLQotMCswNTAgPGRpdnU+OgotICA1MDoJMmMxOCAgICAgIAlkaXZ1CXI4LCByMQotCi0wKzA1MiA8ZG96ZT46Ci0gIDUyOgkwMDA2ICAgICAgCWRvemUKLQotMCswNTQgPGZmMT46Ci0gIDU0OgkwMGVhICAgICAgCWZmMQlyMTAKLQotMCswNTYgPGluY2Y+OgotICA1NjoJMDBiYiAgICAgIAlpbmNmCXIxMQotCi0wKzA1OCA8aW5jdD46Ci0gIDU4OgkwMGFjICAgICAgCWluY3QJcjEyCi0KLTArMDVhIDxpeGg+OgotICA1YToJMWRlZCAgICAgIAlpeGgJcjEzLCByMTQKLQotMCswNWMgPGl4dz46Ci0gIDVjOgkxNTBmICAgICAgCWl4dwlyMTUsIHIwCi0KLTArMDVlIDxqYmY+OgotICA1ZToJZWZkMCAgICAgIAliZgkweDAKLQotMCswNjAgPGpicj46Ci0gIDYwOglmMDBlICAgICAgCWJyCTB4N2UKLQotMCswNjIgPGpic3I+OgotICA2MjoJN2YwYSAgICAgIAlqc3JpCTB4LioKLQotMCswNjQgPGpidD46Ci0gIDY0OgllMDBjICAgICAgCWJ0CTB4N2UKLQotMCswNjYgPGptcD46Ci0gIDY2OgkwMGMxICAgICAgCWptcAlyMQotCi0wKzA2OCA8am1waT46Ci0gIDY4Ogk3MDA5ICAgICAgCWptcGkJMHguKgotCi0wKzA2YSA8anNyPjoKLSAgNmE6CTAwZDIgICAgICAJanNyCXIyCi0KLTArMDZjIDxqc3JpPjoKLSAgNmM6CTdmMDggICAgICAJanNyaQkweC4qCi0KLTArMDZlIDxsZC5iPjoKLSAgNmU6CWEzMDQgICAgICAJbGRiCXIzLCBcKHI0LCAwXCkKLQotMCswNzAgPGxkLmg+OgotICA3MDoJYzUxNiAgICAgIAlsZGgJcjUsIFwocjYsIDJcKQotCi0wKzA3MiA8bGQudz46Ci0gIDcyOgk4NzE4ICAgICAgCWxkCXI3LCBcKHI4LCA0XCkKLQotMCswNzQgPGxkYj46Ci0gIDc0OglhOWZhICAgICAgCWxkYglyOSwgXChyMTAsIDE1XCkKLQotMCswNzYgPGxkaD46Ci0gIDc2OgljYmZjICAgICAgCWxkaAlyMTEsIFwocjEyLCAzMFwpCi0KLTArMDc4IDxsZD46Ci0gIDc4Ogk4ZDVlICAgICAgCWxkCXIxMywgXChyMTQsIDIwXCkKLQotMCswN2EgPGxkdz46Ci0gIDdhOgk4ZGZlICAgICAgCWxkCXIxMywgXChyMTQsIDYwXCkKLQotMCswN2MgPGxkbT46Ci0gIDdjOgkwMDYyICAgICAgCWxkbQlyMi1yMTUsIFwocjBcKQotCi0wKzA3ZSA8Zm9vbG9vcD46Ci0gIDdlOgkwMDQxICAgICAgCWxkcQlyNC1yNywgXChyMVwpCi0KLTArMDgwIDxsb29wdD46Ci0gIDgwOgkwNDhlICAgICAgCWxvb3B0CXI4LCAweDY0Ci0KLTArMDgyIDxMUlc+OgotICA4MjoJNzkwMyAgICAgIAlscncJcjksIDB4LioKLQotMCswODQgPGxydz46Ci0gIDg0Ogk3OTA0ICAgICAgCWxydwlyOSwgMHg0MzIxCi0KLTArMDg2IDxmb29saXQ+OgotICA4NjoJMTIzNCAgICAgIAltb3YJcjQsIHIzCi0KLTArMDg4IDxsc2w+OgotICA4ODoJMWJiYSAgICAgIAlsc2wJcjEwLCByMTEKLQotMCswOGEgPGxzbGM+OgotICA4YToJM2MwYyAgICAgIAlsc2xjCXIxMgotCi0JLi4uCi0JCQk4YzogQUREUjMyCS50ZXh0Ci0JCQk5MDogQUREUjMyCS50ZXh0LioKLSAgOTQ6CTAwMDAgICAgICAJYmtwdAotICA5NjoJNDMyMSAgICAgIAkuc2hvcnQgMHg0MzIxCi0KLTArMDk4IDxsc2xpPjoKLSAgOTg6CTNkZmQgICAgICAJbHNsaQlyMTMsIDMxCi0KLTArMDlhIDxsc3I+OgotICA5YToJMGJmZSAgICAgIAlsc3IJcjE0LCByMTUKLQotMCswOWMgPGxzcmM+OgotICA5YzoJM2UwMCAgICAgIAlsc3JjCXIwCi0KLTArMDllIDxsc3JpPjoKLSAgOWU6CTNlMTEgICAgICAJbHNyaQlyMSwgMQotCi0wKzBhMCA8bWNscmk+OgotICBhMDoJMzA2NCAgICAgIAliY2xyaQlyNCwgNgotCi0wKzBhMiA8bWZjcj46Ci0gIGEyOgkxMDAyICAgICAgCW1mY3IJcjIsIHBzcgotCi0wKzBhNCA8bW92PjoKLSAgYTQ6CTEyNDMgICAgICAJbW92CXIzLCByNAotCi0wKzBhNiA8bW92Zj46Ci0gIGE2OgkwYTY1ICAgICAgCW1vdmYJcjUsIHI2Ci0KLTArMGE4IDxtb3ZpPjoKLSAgYTg6CTY3ZjcgICAgICAJbW92aQlyNywgMTI3Ci0KLTArMGFhIDxtb3Z0PjoKLSAgYWE6CTAyOTggICAgICAJbW92dAlyOCwgcjkKLQotMCswYWMgPG10Y3I+OgotICBhYzoJMTgwYSAgICAgIAltdGNyCXIxMCwgcHNyCi0KLTArMGFlIDxtdWx0PjoKLSAgYWU6CTAzY2IgICAgICAJbXVsdAlyMTEsIHIxMgotCi0wKzBiMCA8bXZjPjoKLSAgYjA6CTAwMmQgICAgICAJbXZjCXIxMwotCi0wKzBiMiA8bXZjdj46Ci0gIGIyOgkwMDNlICAgICAgCW12Y3YJcjE0Ci0KLTArMGI0IDxuZWc+OgotICBiNDoJMjgwMiAgICAgIAlyc3ViaQlyMiwgMAotCi0wKzBiNiA8bm90PjoKLSAgYjY6CTAxZmYgICAgICAJbm90CXIxNQotCi0wKzBiOCA8b3I+OgotICBiODoJMWUxMCAgICAgIAlvcglyMCwgcjEKLQotMCswYmEgPHJmaT46Ci0gIGJhOgkwMDAzICAgICAgCXJmaQotCi0wKzBiYyA8cm9sYz46Ci0gIGJjOgkwNjY2ICAgICAgCWFkZGMJcjYsIHI2Ci0KLTArMGJlIDxyb3JpPjoKLSAgYmU6CTM5YTkgICAgICAJcm90bGkJcjksIDI2Ci0KLTArMGMwIDxyb3RsYz46Ci0gIGMwOgkwNjY2ICAgICAgCWFkZGMJcjYsIHI2Ci0KLTArMGMyIDxyb3RsaT46Ci0gIGMyOgkzOGEyICAgICAgCXJvdGxpCXIyLCAxMAotCi0wKzBjNCA8cm90cmk+OgotICBjNDoJMzlhOSAgICAgIAlyb3RsaQlyOSwgMjYKLQotMCswYzYgPHJzdWI+OgotICBjNjoJMTQ0MyAgICAgIAlyc3ViCXIzLCByNAotCi0wKzBjOCA8cnN1Ymk+OgotICBjODoJMjgwNSAgICAgIAlyc3ViaQlyNSwgMAotCi0wKzBjYSA8cnRlPjoKLSAgY2E6CTAwMDIgICAgICAJcnRlCi0KLTArMGNjIDxydHM+OgotICBjYzoJMDBjZiAgICAgIAlqbXAJcjE1Ci0KLTArMGNlIDxzZXRjPjoKLSAgY2U6CTBjMDAgICAgICAJY21waHMJcjAsIHIwCi0KLTArMGQwIDxzZXh0Yj46Ci0gIGQwOgkwMTU2ICAgICAgCXNleHRiCXI2Ci0KLTArMGQyIDxzZXh0aD46Ci0gIGQyOgkwMTc3ICAgICAgCXNleHRoCXI3Ci0KLTArMGQ0IDxzdC5iPjoKLSAgZDQ6CWI4MDkgICAgICAJc3RiCXI4LCBcKHI5LCAwXCkKLQotMCswZDYgPHN0Lmg+OgotICBkNjoJZGExYiAgICAgIAlzdGgJcjEwLCBcKHIxMSwgMlwpCi0KLTArMGQ4IDxzdC53PjoKLSAgZDg6CTljMWQgICAgICAJc3QJcjEyLCBcKHIxMywgNFwpCi0KLTArMGRhIDxzdGI+OgotICBkYToJYmVmZiAgICAgIAlzdGIJcjE0LCBcKHIxNSwgMTVcKQotCi0wKzBkYyA8c3RoPjoKLSAgZGM6CWQwZjEgICAgICAJc3RoCXIwLCBcKHIxLCAzMFwpCi0KLTArMGRlIDxzdHc+OgotICBkZToJOTJmMyAgICAgIAlzdAlyMiwgXChyMywgNjBcKQotCi0wKzBlMCA8c3Q+OgotICBlMDoJOTQwNSAgICAgIAlzdAlyNCwgXChyNSwgMFwpCi0KLTArMGUyIDxzdG0+OgotICBlMjoJMDA3ZSAgICAgIAlzdG0JcjE0LXIxNSwgXChyMFwpCi0KLTArMGU0IDxzdG9wPjoKLSAgZTQ6CTAwMDQgICAgICAJc3RvcAotCi0wKzBlNiA8c3RxPjoKLSAgZTY6CTAwNTEgICAgICAJc3RxCXI0LXI3LCBcKHIxXCkKLQotMCswZTggPHN1YmM+OgotICBlODoJMDdkNyAgICAgIAlzdWJjCXI3LCByMTMKLQotMCswZWEgPHN1Ymk+OgotICBlYToJMjVmZSAgICAgIAlzdWJpCXIxNCwgMzIKLQotMCswZWMgPHN1YnU+OgotICBlYzoJMDUzOSAgICAgIAlzdWJ1CXI5LCByMwotCi0wKzBlZSA8c3luYz46Ci0gIGVlOgkwMDAxICAgICAgCXN5bmMKLQotMCswZjAgPHRzdGx0PjoKLSAgZjA6CTM3ZjUgICAgICAJYnRzdGkJcjUsIDMxCi0KLTArMGYyIDx0c3RuZT46Ci0gIGYyOgkyYTA3ICAgICAgCWNtcG5laQlyNywgMAotCi0wKzBmNCA8dHJhcD46Ci0gIGY0OgkwMDBhICAgICAgCXRyYXAJMgotCi0wKzBmNiA8dHN0PjoKLSAgZjY6CTBlZWUgICAgICAJdHN0CXIxNCwgcjE0Ci0KLTArMGY4IDx0c3RuYno+OgotICBmODoJMDE5MiAgICAgIAl0c3RuYnoJcjIKLQotMCswZmEgPHdhaXQ+OgotICBmYToJMDAwNSAgICAgIAl3YWl0Ci0KLTArMGZjIDx4b3I+OgotICBmYzoJMTcwZiAgICAgIAl4b3IJcjE1LCByMAotCi0wKzBmZSA8eHNyPjoKLSAgZmU6CTM4MGIgICAgICAJeHNyCXIxMQotCi0wKzAxMDAgPHh0cmIwPjoKLSAxMDA6CTAxMzEgICAgICAJeHRyYjAJcjEsIHIxCi0KLTArMDEwMiA8eHRyYjE+OgotIDEwMjoJMDEyMiAgICAgIAl4dHJiMQlyMSwgcjIKLQotMCswMTA0IDx4dHJiMj46Ci0gMTA0OgkwMTEwICAgICAgCXh0cmIyCXIxLCByMAotCi0wKzAxMDYgPHh0cmIzPjoKLSAxMDY6CTAxMGQgICAgICAJeHRyYjMJcjEsIHIxMwotCi0wKzAxMDggPHpleHRiPjoKLSAxMDg6CTAxNDggICAgICAJemV4dGIJcjgKLQotMCswMTBhIDx6ZXh0aD46Ci0gMTBhOgkwMTY0ICAgICAgCXpleHRoCXI0Ci0gMTBjOgkwZjAwICAgICAgCWNtcG5lCXIwLCByMAotIDEwZToJMGYwMCAgICAgIAljbXBuZQlyMCwgcjAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21jb3JlL2FsbGluc24uZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNTc4NjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgTSpDb3JlIGFzc2VtYmxlciB0ZXN0c3VpdGUuCi0KLWlmIFtpc3RhcmdldCBtY29yZS0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJhbGxpbnNuIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDA2ODQwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21jb3JlL2FsbGluc24ucworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0gLmRhdGEKLWZvb2RhdGE6IC53b3JkIDQyCi0JIC50ZXh0Ci1mb290ZXh0OgotCi0ubWFjcm8gdGVzdCBpbnNuIHRleHQ9IiIKLQkuZXhwb3J0IFxpbnNuCi1caW5zbjoKLQlcaW5zbiBcdGV4dAotLmVuZG0KLQotCXRlc3QgYWJzICAgcjAJCQotCXRlc3QgYWRkYyAgInIxLHIyIgkvLyBBIGRvdWJsZSBmb3J3YXJkIHNsYXNoIHN0YXJ0cyBhIGxpbmUgY29tbWVudAotCXRlc3QgYWRkaSAgInIzLCAxIgkjIFNvIGRvZXMgYSBoYXNoCi0JdGVzdCBhZGR1ICAicjQsIHI1IgkvLyBXaGl0ZSBzcGFjZSBiZXR3ZWVuIG9wZXJhbmRzIHNob3VsZCBiZSBpZ25vcmVkCi0JdGVzdCBhbmQgICAicjYscjciICAgOwl0ZXN0IGFuZGkgICJyOCwjMiIgLy8gQSBzZW1pY29sb24gc2VwZXJhdGVzIHN0YXRlbWVudHMKLQl0ZXN0IGFuZG4gICJyOSwgcjEwIgotCXRlc3QgYXNyICAgInIxMSwgUjEyIgkvLyBVcHBlcmNhc2UgUiBpcyBhbGxvd2VkIGFzIGEgcmVnaXN0ZXIgcHJlZml4Ci0JdGVzdCBhc3JjICAicjEzIgotCXRlc3QgYXNyaSAgInIxNCwjMHgxZiIKLQl0ZXN0IGJjbHJpICJyMTUsMCIKLQl0ZXN0IGJmICAgIGZvb3RleHQKLQl0ZXN0IGJnZW5pICJzcCwgNyIJLy8gcjAgY2FuIGFsc28gYmUgcmVmZXJlZCB0byBhcyAnc3AnCi0JdGVzdCBCR0VOSSAicjAsIDgiCS8vIE9mZmljaWFsbHkgdXBwZXIgY2FzZSBvciBtaXhlZCBjYXNlCi0JdGVzdCBCR0VOaSAicjAsIDMxIgkvLyBtbmVtb25pY3Mgc2hvdWxkIG5vdCBiZSBhbGxvd2VkLCBidXQgd2UgcmVsYXggdGhpcy4uLgotCXRlc3QgYmdlbnIgInIxLCByMiIKLQl0ZXN0IGJrcHQKLQl0ZXN0IGJtYXNraSAicjMsIzgiCi0JdGVzdCBCTUFTS0kgInIzLDB4MWYiCi0JdGVzdCBiciAgICAgLiAgLy8gRG90IG1lYW5zIHRoZSBjdXJyZW50IGFkZHJlc3MKLQl0ZXN0IGJyZXYgICByNAotCXRlc3QgYnNldGkgICJyNSwzMCIKLQl0ZXN0IGJzciAgICBmb290ZXh0Ci0JdGVzdCBidCAgICAgZm9vdGV4dAotCXRlc3QgYnRzdGkgICJyNiwgMjciCi0JdGVzdCBjbHJjICAgCi0JdGVzdCBjbHJmICAgcjcKLQl0ZXN0IGNscnQgICByOAotCXRlc3QgY21waHMgICJyOSxyMTAiCi0JdGVzdCBjbXBsdCAgInIxMSxyMTIiIAotCXRlc3QgY21wbGVpICJyMTEsIDE0IiAKLQl0ZXN0IGNtcGx0aSAicjEzLDMyIgotCXRlc3QgY21wbmUgICJyMTQsIHIxNSIKLQl0ZXN0IGNtcG5laSAicjAsMCIKLQl0ZXN0IGRlY2YgICByMQotCXRlc3QgZGVjZ3QgIHIyCi0JdGVzdCBkZWNsdCAgcjMKLQl0ZXN0IGRlY25lICByNAotCXRlc3QgZGVjdCAgIHI1Ci0JdGVzdCBkaXZzICAgInI2LHIxIgotCXRlc3QgZGl2dSAgICJyOCwgcjEiCi0JdGVzdCBkb3plCi0JdGVzdCBmZjEgICAgcjEwCi0JdGVzdCBpbmNmICAgcjExCi0JdGVzdCBpbmN0ICAgcjEyCi0JdGVzdCBpeGggICAgInIxMyxyMTQiCi0JdGVzdCBpeHcgICAgInIxNSxyMCIKLQl0ZXN0IGpiZiAgICBmb290ZXh0Ci0JdGVzdCBqYnIgICAgZm9vbG9vcAotCXRlc3QgamJzciAgIGZvb3RleHQKLQl0ZXN0IGpidCAgICBmb29sb29wCi0JdGVzdCBqbXAgICAgcjEKLQl0ZXN0IGptcGkgICBmb290ZXh0IAotCXRlc3QganNyICAgIHIyCi0JdGVzdCBqc3JpICAgZm9vdGV4dAotCXRlc3QgbGQuYiAgICJyMywocjQsMCkiCi0JdGVzdCBsZC5oICAgInI1ICwgKCByNiwgIzIpIgotCXRlc3QgbGQudyAgICJyNywgKHI4LCAweDQpIgotCXRlc3QgbGRiICAgICJyOSwocjEwLCMweGYpIgotCXRlc3QgbGRoICAgICJyMTEsIChyMTIsIDMwKSIKLQl0ZXN0IGxkICAgICAicjEzLCAocjE0LCAyMCkiCi0JdGVzdCBsZHcgICAgInIxMywgKHIxNCwgNjApIgotCXRlc3QgbGRtICAgICJyMi1yMTUsKHIwKSIKLQkuZXhwb3J0IGZvb2xvb3AKLWZvb2xvb3A6CQkKLQl0ZXN0IGxkcSAgICAicjQtcjcsKHIxKSIKLQl0ZXN0IGxvb3B0ICAicjgsIGZvb2xvb3AiCi0JdGVzdCBMUlcgICAgInI5LCBbZm9vbGl0XSIKLQl0ZXN0IGxydyAgICAicjksIDB4NDMyMSIgICAJLy8gUEMgcmVsIGluZGlyZWN0Ci0JLmdsb2JhbCBmb29saXQKLWZvb2xpdDoKLQkud29yZCAweDEyMzQKLQl0ZXN0IGxzbCAgICAicjEwLHIxMSIKLQl0ZXN0IGxzbGMgICByMTIKLQkubGl0ZXJhbHMJCQkvLyBEdW1wIGxpdGVyYWxzIHRhYmxlCQotCXRlc3QgbHNsaSAgICJyMTMsMzEiCi0JdGVzdCBsc3IgICAgInIxNCxyMTUiCi0JdGVzdCBsc3JjICAgcjAKLQl0ZXN0IGxzcmkgICAicjEsMSIKLQl0ZXN0IG1jbHJpICAicjQsIDY0IgotCXRlc3QgbWZjciAgICJyMiwgY3IwIgotCXRlc3QgbW92ICAgICJyMyxyNCIKLQl0ZXN0IG1vdmYgICAicjUsIHI2IgotCXRlc3QgbW92aSAgICJyNywgMTI3IgotCXRlc3QgbW92dCAgICJyOCwgcjkiCi0JdGVzdCBtdGNyICAgInIxMCwgcHNyIgotCXRlc3QgbXVsdCAgICJyMTEsIHIxMiIKLQl0ZXN0IG12YyAgICByMTMKLQl0ZXN0IG12Y3YgICByMTQKLQl0ZXN0IG5lZyAgICByMgotCXRlc3Qgbm90ICAgIHIxNQotCXRlc3Qgb3IgICAgICJyMCxyMSIKLQl0ZXN0IHJmaQotCXRlc3Qgcm9sYyAgICJyNiwgMSIKLQl0ZXN0IHJvcmkgICAicjksIDYiCi0JdGVzdCByb3RsYyAgInI2LCAxIgotCXRlc3Qgcm90bGkgICJyMiwgIzEwIgotCXRlc3Qgcm90cmkgICJyOSwgNiIKLQl0ZXN0IHJzdWIgICAicjMsIHI0IgotCXRlc3QgcnN1YmkgICJyNSwgMHgwIgotCXRlc3QgcnRlCi0JdGVzdCBydHMKLQl0ZXN0IHNldGMKLQl0ZXN0IHNleHRiICByNgotCXRlc3Qgc2V4dGggIHI3Ci0JdGVzdCBzdC5iICAgInI4LCAocjksIDApIgotCXRlc3Qgc3QuaCAgICJyMTAsIChyMTEsIDIpIgotCXRlc3Qgc3QudyAgICJyMTIsIChyMTMsIDQpIgotCXRlc3Qgc3RiICAgICJyMTQsIChyMTUsIDE1KSIJCi0JdGVzdCBzdGggICAgInIwLCAocjEsIDMwKSIKLQl0ZXN0IHN0dyAgICAicjIsIChyMywgMHgzYykiCi0JdGVzdCBzdCAgICAgInI0LCAocjUsIDApIgotCXRlc3Qgc3RtICAgICJyMTQgLSByMTUgLCAocjApIgotCXRlc3Qgc3RvcAotCXRlc3Qgc3RxICAgICJyNCAtIHI3ICwgKHIxKSIKLQl0ZXN0IHN1YmMgICAicjcsIHIxMyIKLQl0ZXN0IHN1YmkgICAicjE0LCAzMiIKLQl0ZXN0IHN1YnUgICAicjksIHIzIgotCXRlc3Qgc3luYwotCXRlc3QgdHN0bHQgIHI1Ci0JdGVzdCB0c3RuZSAgcjcKLQl0ZXN0IHRyYXAgICAyCi0JdGVzdCB0c3QgICAgInIxNCwgcjE0IgotCXRlc3QgdHN0bmJ6IHIyCi0JdGVzdCB3YWl0Ci0JdGVzdCB4b3IgICAgInIxNSxyMCIKLQl0ZXN0IHhzciAgICByMTEKLQl0ZXN0IHh0cmIwICAicjEsIHIxIgotCXRlc3QgeHRyYjEgICJyMSwgcjIiCi0JdGVzdCB4dHJiMiAgInIxLCByMCIKLQl0ZXN0IHh0cmIzICAicjEsIHIxMyIKLQl0ZXN0IHpleHRiICByOAotCXRlc3QgemV4dGggIHI0Ci0JY2xyYwkJCS8vIFRoZXNlIHR3byBpbnN0cnVjdGlvbnMgcGFkIHRoZSBvYmplY3QgZmlsZQotCWNscmMJCQkvLyBvdXQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LgotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Ficy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODZkNWMyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYWJzCi0KLSMgVGVzdCB0aGUgYWJzIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBiZ2V6CVwkYTAsMCswMDBjIDxmb29cKygweHwpYz4KLTArMDAwNCA8W14+XSo+IG5vcAotMCswMDA4IDxbXj5dKj4gbmVnCVwkYTAsXCRhMAotMCswMDBjIDxbXj5dKj4gYmdleglcJGExLDArMDAxOCA8Zm9vXCsoMHh8KTE4PgotMCswMDEwIDxbXj5dKj4gbW92ZQlcJGEwLFwkYTEKLTArMDAxNCA8W14+XSo+IG5lZwlcJGEwLFwkYTEKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Ficy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjIxNzJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBhYnMgbWFjcm8uCi1mb286Ci0JYWJzCSQ0Ci0JYWJzCSQ0LCQ1Ci0JLnNwYWNlCTgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWRkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FkZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzIxZDFkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWRkLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYWRkCi0KLSMgVGVzdCB0aGUgYWRkIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBhZGRpCVwkYTAsXCRhMCwwCi0wKzAwMDQgPFtePl0qPiBhZGRpCVwkYTAsXCRhMCwxCi0wKzAwMDggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDBjIDxbXj5dKj4gYWRkCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMTAgPFtePl0qPiBhZGRpCVwkYTAsXCRhMCwtMzI3NjgKLTArMDAxNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE4IDxbXj5dKj4gYWRkCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyMCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwMjQgPFtePl0qPiBhZGQJXCRhMCxcJGEwLFwkYXQKLTArMDAyOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzAwMmMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGU5NjRiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYWRkIG1hY3JvLgotCQotZm9vOgotCWFkZAkkNCwkNCwwCi0JYWRkCSQ0LCQ0LDEKLQlhZGQJJDQsJDQsMHg4MDAwCi0JYWRkCSQ0LCQ0LC0weDgwMDAKLQlhZGQJJDQsJDQsMHgxMDAwMAotCWFkZAkkNCwkNCwweDFhNWE1Ci0JCi0jIGFkZHUgaXMgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYWRkIGlzOyBqdXN0IGNvbmZpcm0gdGhhdCBpdCBpc24ndAotIyB0b3RhbGx5IGJyb2tlbi4KLQlhZGR1CSQ0LCQ0LDEKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYW5kLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FuZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDYxNzE0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYW5kLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYW5kCi0KLSMgVGVzdCB0aGUgYW5kIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBhbmRpCVwkYTAsXCRhMCwweDAKLTArMDAwNCA8W14+XSo+IGFuZGkJXCRhMCxcJGEwLDB4MQotMCswMDA4IDxbXj5dKj4gYW5kaQlcJGEwLFwkYTAsMHg4MDAwCi0wKzAwMGMgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMDEwIDxbXj5dKj4gYW5kCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxOCA8W14+XSo+IGFuZAlcJGEwLFwkYTAsXCRhdAotMCswMDFjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMjAgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDI0IDxbXj5dKj4gYW5kCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMjggPFtePl0qPiBvcmkJXCRhMCxcJGExLDB4MAotMCswMDJjIDxbXj5dKj4gbm9yCVwkYTAsXCRhMCxcJHplcm8KLTArMDAzMCA8W14+XSo+IG9yaQlcJGEwLFwkYTEsMHgxCi0wKzAwMzQgPFtePl0qPiBub3IJXCRhMCxcJGEwLFwkemVybwotMCswMDM4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMSwweDgwMDAKLTArMDAzYyA8W14+XSo+IG5vcglcJGEwLFwkYTAsXCR6ZXJvCi0wKzAwNDAgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMDQ0IDxbXj5dKj4gbm9yCVwkYTAsXCRhMSxcJGF0Ci0wKzAwNDggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA0YyA8W14+XSo+IG5vcglcJGEwLFwkYTEsXCRhdAotMCswMDUwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTQgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDU4IDxbXj5dKj4gbm9yCVwkYTAsXCRhMSxcJGF0Ci0wKzAwNWMgPFtePl0qPiBvcmkJXCRhMCxcJGExLDB4MAotMCswMDYwIDxbXj5dKj4geG9yaQlcJGEwLFwkYTEsMHgwCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FuZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hbmQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmYzU3ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FuZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGFuZCBtYWNyby4KLQkKLWZvbzoKLQlhbmQJJDQsJDQsMAotCWFuZAkkNCwkNCwxCi0JYW5kCSQ0LCQ0LDB4ODAwMAotCWFuZAkkNCwkNCwtMHg4MDAwCi0JYW5kCSQ0LCQ0LDB4MTAwMDAKLQlhbmQJJDQsJDQsMHgxYTVhNQotCi0jIG5vciwgb3IsIGFuZCB4b3IgYXJlIGhhbmRsZWQgYnkgdGhlIHNhbWUgY29kZS4gIFRoZXJlIGlzIGEgc3BlY2lhbAotIyBjYXNlIGZvciBub3IsIHNvIHdlIHRlc3QgYWxsIHZhcmlhbnRzLgotCQotCW5vcgkkNCwkNSwwCi0Jbm9yCSQ0LCQ1LDEKLQlub3IJJDQsJDUsMHg4MDAwCi0Jbm9yCSQ0LCQ1LC0weDgwMDAKLQlub3IJJDQsJDUsMHgxMDAwMAotCW5vcgkkNCwkNSwweDFhNWE1Ci0JCi0Jb3IJJDQsJDUsMAotCi0JeG9yCSQ0LCQ1LDAKLQotCSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZXEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzMjkzNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5kCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGJlcQotCi0jIFRlc3QgdGhlIGJlcSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gYmVxCVwkYTAsXCRhMSwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IGJlcXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMGMgPFtePl0qPiBub3AKLTArMDAxMCA8W14+XSo+IGxpCVwkYXQsMQotMCswMDE0IDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTggPFtePl0qPiBub3AKLTArMDAxYyA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMjAgPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAyNCA8W14+XSo+IG5vcAotMCswMDI4IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDAyYyA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDMwIDxbXj5dKj4gbm9wCi0wKzAwMzQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAzOCA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDNjIDxbXj5dKj4gbm9wCi0wKzAwNDAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA0NCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNDggPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA0YyA8W14+XSo+IG5vcAotMCswMDUwIDxbXj5dKj4gYm5leglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA1NCA8W14+XSo+IG5vcAotMCswMDU4IDxbXj5dKj4gYmVxemwJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNWMgPFtePl0qPiBub3AKLTArMDA2MCA8W14+XSo+IGJuZXpsCVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotCS4uLgotMCsyMDA2OCA8W14+XSo+IGoJMCswMDAwIDx0ZXh0X2xhYmVsPgotWyAJXSoyMDA2ODogKE1JUFNfSk1QfEpNUEFERFJ8Ul9NSVBTXzI2KQkudGV4dAotMCsyMDA2YyA8W14+XSo+IG5vcAotMCsyMDA3MCA8W14+XSo+IGphbAkwKzAwMDAgPHRleHRfbGFiZWw+Ci1bIAldKjIwMDcwOiAoTUlQU19KTVB8Sk1QQUREUnxSX01JUFNfMjYpCS50ZXh0Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZXEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyMmVlYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGJlcSBtYWNyby4KLQkuZ2xvYmwJdGV4dF9sYWJlbAkudGV4dAotdGV4dF9sYWJlbDoJCi0JYmVxCSQ0LCQ1LHRleHRfbGFiZWwKLQliZXEJJDQsMCx0ZXh0X2xhYmVsCi0JYmVxCSQ0LDEsdGV4dF9sYWJlbAotCWJlcQkkNCwweDgwMDAsdGV4dF9sYWJlbAotCWJlcQkkNCwtMHg4MDAwLHRleHRfbGFiZWwKLQliZXEJJDQsMHgxMDAwMCx0ZXh0X2xhYmVsCi0JYmVxCSQ0LDB4MWE1YTUsdGV4dF9sYWJlbAotCi0jIGJuZSBpcyBoYW5kbGVkIGJ5IHRoZSBzYW1lIGNvZGUgYXMgYmVxLiAgSnVzdCBzYW5pdHkgY2hlY2suCi0JYm5lCSQ0LDAsdGV4dF9sYWJlbAotCi0jIFNhbml0eSBjaGVjayBiZXFsIGFuZCBibmVsCi0JLnNldAltaXBzMgotCWJlcWwJJDQsMCx0ZXh0X2xhYmVsCi0JYm5lbAkkNCwwLHRleHRfbGFiZWwKLQotIyBUZXN0IHRoYXQgYnJhbmNoZXMgd2hpY2ggb3ZlcmZsb3cgYXJlIGNvbnZlcnRlZCB0byBqdW1wcy4KLQkuc3BhY2UJMHgyMDAwMAotCWIJdGV4dF9sYWJlbAotCWJhbAl0ZXh0X2xhYmVsCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2UuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzZTI3Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZS5kCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGJnZQotCi0jIFRlc3QgdGhlIGJnZSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGExCi0wKzAwMDQgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDA4IDxbXj5dKj4gbm9wCi0wKzAwMGMgPFtePl0qPiBiZ2V6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDEwIDxbXj5dKj4gbm9wCi0wKzAwMTQgPFtePl0qPiBibGV6CVwkYTEsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDE4IDxbXj5dKj4gbm9wCi0wKzAwMWMgPFtePl0qPiBiZ2V6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDIwIDxbXj5dKj4gbm9wCi0wKzAwMjQgPFtePl0qPiBiZ3R6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDI4IDxbXj5dKj4gbm9wCi0wKzAwMmMgPFtePl0qPiBzbHRpCVwkYXQsXCRhMCwyCi0wKzAwMzAgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDM0IDxbXj5dKj4gbm9wCi0wKzAwMzggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDNjIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNDAgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDQ0IDxbXj5dKj4gbm9wCi0wKzAwNDggPFtePl0qPiBzbHRpCVwkYXQsXCRhMCwtMzI3NjgKLTArMDA0YyA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNTAgPFtePl0qPiBub3AKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNWMgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDYwIDxbXj5dKj4gbm9wCi0wKzAwNjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA2OCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNmMgPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYXQKLTArMDA3MCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNzQgPFtePl0qPiBub3AKLTArMDA3OCA8W14+XSo+IHNsdAlcJGF0LFwkYTEsXCRhMAotMCswMDdjIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4MCA8W14+XSo+IG5vcAotMCswMDg0IDxbXj5dKj4gYmd0eglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4OCA8W14+XSo+IG5vcAotMCswMDhjIDxbXj5dKj4gYmx0eglcJGExLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA5MCA8W14+XSo+IG5vcAotMCswMDk0IDxbXj5dKj4gYmd0eglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA5OCA8W14+XSo+IG5vcAotMCswMDljIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGExCi0wKzAwYTAgPFtePl0qPiBiZXF6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDBhNCA8W14+XSo+IG5vcAotMCswMGE4IDxbXj5dKj4gc2x0CVwkYXQsXCRhMSxcJGEwCi0wKzAwYWMgPFtePl0qPiBibmV6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDVmZDgyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYmdlIG1hY3JvLgotCQotdGV4dF9sYWJlbDoJCi0JYmdlCSQ0LCQ1LHRleHRfbGFiZWwKLQliZ2UJJDQsJDAsdGV4dF9sYWJlbAotCWJnZQkkMCwkNSx0ZXh0X2xhYmVsCi0JYmdlCSQ0LDAsdGV4dF9sYWJlbAotCWJnZQkkNCwxLHRleHRfbGFiZWwKLQliZ2UJJDQsMix0ZXh0X2xhYmVsCi0JYmdlCSQ0LDB4ODAwMCx0ZXh0X2xhYmVsCi0JYmdlCSQ0LC0weDgwMDAsdGV4dF9sYWJlbAotCWJnZQkkNCwweDEwMDAwLHRleHRfbGFiZWwKLQliZ2UJJDQsMHgxYTVhNSx0ZXh0X2xhYmVsCi0KLSMgYmd0IGlzIGhhbmRsZWQgbGlrZSBiZ2UsIGV4Y2VwdCB3aGVuIGJvdGggYXJndW1lbnRzIGFyZSByZWdpc3RlcnMuCi0jIEp1c3Qgc2FuaXR5IGNoZWNrIGl0IG90aGVyd2lzZS4KLQliZ3QJJDQsJDUsdGV4dF9sYWJlbAotCWJndAkkNCwkMCx0ZXh0X2xhYmVsCi0JYmd0CSQwLCQ1LHRleHRfbGFiZWwKLQliZ3QJJDQsMCx0ZXh0X2xhYmVsCi0KLSMgU2FuaXR5IHRlc3QgYmdlbCBhbmQgYmd0bAotCS5zZXQJbWlwczIKLQliZ2VsCSQ0LCQ1LHRleHRfbGFiZWwKLQliZ3RsCSQ0LCQ1LHRleHRfbGFiZWwKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdldS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2V1LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYTYwNDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2V1LmQKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYmdldQotCi0jIFRlc3QgdGhlIGJnZXUgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYTEKLTArMDAwNCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMDggPFtePl0qPiBub3AKLTArMDAwYyA8W14+XSo+IGJlcQlcJHplcm8sXCRhMSwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTAgPFtePl0qPiBub3AKLTArMDAxNCA8W14+XSo+IGJuZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTggPFtePl0qPiBub3AKLTArMDAxYyA8W14+XSo+IHNsdGl1CVwkYXQsXCRhMCwyCi0wKzAwMjAgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDI0IDxbXj5dKj4gbm9wCi0wKzAwMjggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDJjIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhdAotMCswMDMwIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAzNCA8W14+XSo+IG5vcAotMCswMDM4IDxbXj5dKj4gc2x0aXUJXCRhdCxcJGEwLC0zMjc2OAotMCswMDNjIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA0MCA8W14+XSo+IG5vcAotMCswMDQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNDggPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNGMgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDUwIDxbXj5dKj4gbm9wCi0wKzAwNTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1OCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNWMgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNjAgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBzbHR1CVwkYXQsXCRhMSxcJGEwCi0wKzAwNmMgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDcwIDxbXj5dKj4gbm9wCi0wKzAwNzQgPFtePl0qPiBibmV6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDc4IDxbXj5dKj4gbm9wCi0wKzAwN2MgPFtePl0qPiBibmV6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDgwIDxbXj5dKj4gbm9wCi0wKzAwODQgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGExCi0wKzAwODggPFtePl0qPiBiZXF6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4YyA8W14+XSo+IG5vcAotMCswMDkwIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTEsXCRhMAotMCswMDk0IDxbXj5dKj4gYm5lemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZXUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdldS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzM3Zjk2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdldS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGJnZXUgbWFjcm8uCi0JCi10ZXh0X2xhYmVsOgkKLQliZ2V1CSQ0LCQ1LHRleHRfbGFiZWwKLQliZ2V1CSQwLCQ1LHRleHRfbGFiZWwKLQkjIEEgc2Vjb25kIGFyZ3VtZW50IG9mIDAgb3IgJDAgaXMgYWx3YXlzIHRydWUKLQliZ2V1CSQ0LDEsdGV4dF9sYWJlbAotCWJnZXUJJDQsMix0ZXh0X2xhYmVsCi0JYmdldQkkNCwweDgwMDAsdGV4dF9sYWJlbAotCWJnZXUJJDQsLTB4ODAwMCx0ZXh0X2xhYmVsCi0JYmdldQkkNCwweDEwMDAwLHRleHRfbGFiZWwKLQliZ2V1CSQ0LDB4MWE1YTUsdGV4dF9sYWJlbAotCi0jIGJndHUgaXMgaGFuZGxlZCBsaWtlIGJnZXUsIGV4Y2VwdCB3aGVuIGJvdGggYXJndW1lbnRzIGFyZSByZWdpc3RlcnMuCi0jIEp1c3Qgc2FuaXR5IGNoZWNrIGl0IG90aGVyd2lzZS4KLQliZ3R1CSQ0LCQ1LHRleHRfbGFiZWwKLQliZ3R1CSQ0LCQwLHRleHRfbGFiZWwKLQliZ3R1CSQ0LDAsdGV4dF9sYWJlbAotCi0jIFNhbml0eSB0ZXN0IGJnZXVsIGFuZCBiZ3R1bAotCS5zZXQJbWlwczIKLQliZ2V1bAkkNCwkNSx0ZXh0X2xhYmVsCi0JYmd0dWwJJDQsJDUsdGV4dF9sYWJlbAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMTBlMjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHQuZAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBibHQKLQotIyBUZXN0IHRoZSBibHQgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhMQotMCswMDA0IDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAwOCA8W14+XSo+IG5vcAotMCswMDBjIDxbXj5dKj4gYmx0eglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAxMCA8W14+XSo+IG5vcAotMCswMDE0IDxbXj5dKj4gYmd0eglcJGExLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAxOCA8W14+XSo+IG5vcAotMCswMDFjIDxbXj5dKj4gYmx0eglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAyMCA8W14+XSo+IG5vcAotMCswMDI0IDxbXj5dKj4gYmxleglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAyOCA8W14+XSo+IG5vcAotMCswMDJjIDxbXj5dKj4gc2x0aQlcJGF0LFwkYTAsMgotMCswMDMwIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAzNCA8W14+XSo+IG5vcAotMCswMDM4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAzYyA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhdAotMCswMDQwIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA0NCA8W14+XSo+IG5vcAotMCswMDQ4IDxbXj5dKj4gc2x0aQlcJGF0LFwkYTAsLTMyNzY4Ci0wKzAwNGMgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDUwIDxbXj5dKj4gbm9wCi0wKzAwNTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1OCA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhdAotMCswMDVjIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA2MCA8W14+XSo+IG5vcAotMCswMDY0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNjggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDZjIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNzAgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDc0IDxbXj5dKj4gbm9wCi0wKzAwNzggPFtePl0qPiBzbHQJXCRhdCxcJGExLFwkYTAKLTArMDA3YyA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwODAgPFtePl0qPiBub3AKLTArMDA4NCA8W14+XSo+IGJsZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwODggPFtePl0qPiBub3AKLTArMDA4YyA8W14+XSo+IGJnZXoJXCRhMSwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwOTAgPFtePl0qPiBub3AKLTArMDA5NCA8W14+XSo+IGJsZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwOTggPFtePl0qPiBub3AKLTArMDA5YyA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhMQotMCswMGEwIDxbXj5dKj4gYm5lemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwYTQgPFtePl0qPiBub3AKLTArMDBhOCA8W14+XSo+IHNsdAlcJGF0LFwkYTEsXCRhMAotMCswMGFjIDxbXj5dKj4gYmVxemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMzA1Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGJsdCBtYWNyby4KLQkKLXRleHRfbGFiZWw6CQotCWJsdAkkNCwkNSx0ZXh0X2xhYmVsCi0JYmx0CSQ0LCQwLHRleHRfbGFiZWwKLQlibHQJJDAsJDUsdGV4dF9sYWJlbAotCWJsdAkkNCwwLHRleHRfbGFiZWwKLQlibHQJJDQsMSx0ZXh0X2xhYmVsCi0JYmx0CSQ0LDIsdGV4dF9sYWJlbAotCWJsdAkkNCwweDgwMDAsdGV4dF9sYWJlbAotCWJsdAkkNCwtMHg4MDAwLHRleHRfbGFiZWwKLQlibHQJJDQsMHgxMDAwMCx0ZXh0X2xhYmVsCi0JYmx0CSQ0LDB4MWE1YTUsdGV4dF9sYWJlbAotCi0jIGJsZSBpcyBoYW5kbGVkIGxpa2UgYmx0LCBleGNlcHQgd2hlbiBib3RoIGFyZ3VtZW50cyBhcmUgcmVnaXN0ZXJzLgotIyBKdXN0IHNhbml0eSBjaGVjayBpdCBvdGhlcndpc2UuCi0JYmxlCSQ0LCQ1LHRleHRfbGFiZWwKLQlibGUJJDQsJDAsdGV4dF9sYWJlbAotCWJsZQkkMCwkNSx0ZXh0X2xhYmVsCi0JYmxlCSQ0LDAsdGV4dF9sYWJlbAotCi0jIFNhbml0eSB0ZXN0IGJsdGwgYW5kIGJsZWwKLQkuc2V0CW1pcHMyCi0JYmx0bAkkNCwkNSx0ZXh0X2xhYmVsCi0JYmxlbAkkNCwkNSx0ZXh0X2xhYmVsCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdHUuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0dS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzI2MWM2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0dS5kCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGJsdHUKLQotIyBUZXN0IHRoZSBibHR1IG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGExCi0wKzAwMDQgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDA4IDxbXj5dKj4gbm9wCi0wKzAwMGMgPFtePl0qPiBibmUJXCR6ZXJvLFwkYTEsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDEwIDxbXj5dKj4gbm9wCi0wKzAwMTQgPFtePl0qPiBiZXF6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDE4IDxbXj5dKj4gbm9wCi0wKzAwMWMgPFtePl0qPiBzbHRpdQlcJGF0LFwkYTAsMgotMCswMDIwIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAyNCA8W14+XSo+IG5vcAotMCswMDI4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAyYyA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYXQKLTArMDAzMCA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMzQgPFtePl0qPiBub3AKLTArMDAzOCA8W14+XSo+IHNsdGl1CVwkYXQsXCRhMCwtMzI3NjgKLTArMDAzYyA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNDAgPFtePl0qPiBub3AKLTArMDA0NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDQ4IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhdAotMCswMDRjIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA1MCA8W14+XSo+IG5vcAotMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDVjIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhdAotMCswMDYwIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA2NCA8W14+XSo+IG5vcAotMCswMDY4IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTEsXCRhMAotMCswMDZjIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA3MCA8W14+XSo+IG5vcAotMCswMDc0IDxbXj5dKj4gYmVxeglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA3OCA8W14+XSo+IG5vcAotMCswMDdjIDxbXj5dKj4gYmVxeglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4MCA8W14+XSo+IG5vcAotMCswMDg0IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhMQotMCswMDg4IDxbXj5dKj4gYm5lemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwOGMgPFtePl0qPiBub3AKLTArMDA5MCA8W14+XSo+IHNsdHUJXCRhdCxcJGExLFwkYTAKLTArMDA5NCA8W14+XSo+IGJlcXpsCVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHR1LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdHUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiMWFlNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdHUucworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBibHR1IG1hY3JvLgotCQotdGV4dF9sYWJlbDoJCi0JYmx0dQkkNCwkNSx0ZXh0X2xhYmVsCi0JYmx0dQkkMCwkNSx0ZXh0X2xhYmVsCi0JIyBBIHNlY29uZCBhcmd1bWVudCBvZiAwIG9yICQwIGlzIGFsd2F5cyBmYWxzZQotCWJsdHUJJDQsMSx0ZXh0X2xhYmVsCi0JYmx0dQkkNCwyLHRleHRfbGFiZWwKLQlibHR1CSQ0LDB4ODAwMCx0ZXh0X2xhYmVsCi0JYmx0dQkkNCwtMHg4MDAwLHRleHRfbGFiZWwKLQlibHR1CSQ0LDB4MTAwMDAsdGV4dF9sYWJlbAotCWJsdHUJJDQsMHgxYTVhNSx0ZXh0X2xhYmVsCi0KLSMgYmxldSBpcyBoYW5kbGVkIGxpa2UgYmx0dSwgZXhjZXB0IHdoZW4gYm90aCBhcmd1bWVudHMgYXJlIHJlZ2lzdGVycy4KLSMgSnVzdCBzYW5pdHkgY2hlY2sgaXQgb3RoZXJ3aXNlLgotCWJsZXUJJDQsJDUsdGV4dF9sYWJlbAotCWJsZXUJJDQsJDAsdGV4dF9sYWJlbAotCWJsZXUJJDQsMCx0ZXh0X2xhYmVsCi0KLSMgU2FuaXR5IHRlc3QgYmx0dWwgYW5kIGJsZXVsCi0JLnNldAltaXBzMgotCWJsdHVsCSQ0LCQ1LHRleHRfbGFiZWwKLQlibGV1bAkkNCwkNSx0ZXh0X2xhYmVsCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JyZWFrMjAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYnJlYWsyMC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDk4YTRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYnJlYWsyMC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotI2FzOiAtbWNwdT1yMzkwMAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjM5MDAKLSNuYW1lOiBNSVBTIDIwLWJpdCBicmVhawotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBicmVhawotMCswMDA0IDxbXj5dKj4gYnJlYWsKLTArMDAwOCA8W14+XSo+IGJyZWFrCTB4MTQKLTArMDAwYyA8W14+XSo+IGJyZWFrCTB4MTQsMHgyOAotMCswMDEwIDxbXj5dKj4gYnJlYWsJMHgzZmYsMHgzZmYKLTArMDAxNCA8W14+XSo+IHNkYmJwCi0wKzAwMTggPFtePl0qPiBzZGJicAotMCswMDFjIDxbXj5dKj4gc2RiYnAJMHgxNAotMCswMDIwIDxbXj5dKj4gc2RiYnAJMHgxNCwweDI4Ci0wKzAwMjQgPFtePl0qPiBzZGJicAkweDNmZiwweDNmZgotCS4uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYnJlYWsyMC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9icmVhazIwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMzViMGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9icmVhazIwLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgMjAtYml0IGJyZWFrIGluc3RydWN0aW9ucwotZm9vOgkKLQlicmVhawotCWJyZWFrCTAKLQlicmVhawkyMAotCWJyZWFrCTIwLDQwCi0JYnJlYWsJMTAyMywxMDIzCi0JCi0Jc2RiYnAKLQlzZGJicAkwCi0Jc2RiYnAJMjAKLQlzZGJicAkyMCw0MAotCXNkYmJwCTEwMjMsMTAyMwotCQotIyBmb3JjZSBzb21lIHBhZGRpbmcsIHRvIG1ha2Ugb2JqZHVtcCBjb25zaXN0ZW50bHkgcmVwb3J0IHRoYXQgdGhlcmUncyBzb21lCi0jIGhlcmUuLi4KLQkuc3BhY2UJOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2RjMGVjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGVsYXkuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBkZWxheQotI2FzOiAtbWlwczMgLW1jcHU9cjQwMDAKLQotIyAKLSMgR2FzIHNob3VsZCBwcm9kdWNlIG5vcCdzIGFmdGVyIG10YzEgYW5kIHJlbGF0ZWQgCi0jIGluc24ncyBpZiB0aGUgdGFyZ2V0IGZwciBpcyB1c2VkIGluIHRoZSAKLSMgaW1tZWRpYXRseSBmb2xsb3dpbmcgaW5zbi4gIFNlZSBhbHNvIG5vZGVsYXkuZC4KLSMKLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbXRjMQlcJHplcm8sXCRmMAotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBjdnQuZC53CVwkZjAsXCRmMAotMCswMDBjIDxbXj5dKj4gbXRjMQlcJHplcm8sXCRmMQotMCswMDEwIDxbXj5dKj4gbm9wCi0wKzAwMTQgPFtePl0qPiBjdnQuZC53CVwkZjEsXCRmMQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWUyZjAwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGVsYXkucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGFicyBtYWNyby4KLWZvbzoKLQltdGMxCSQwLCRmMAotCWN2dC5kLncJJGYwLCRmMAotICAgICAgICBtdGMxICAgICQwLCRmMQotICAgICAgICBjdnQuZC53ICRmMSwkZjEKLSAgICAgICAgLnNwYWNlCTgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYtaWxvY2tzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi1pbG9ja3MuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4NTZkMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi1pbG9ja3MuZAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgZGl2Ci0jc291cmNlOiBkaXYucwotCi0jIFRlc3QgdGhlIGRpdiBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYTEKLTArMDAwNCA8W14+XSo+IGJuZXoJXCRhMSwwKzAwMTAgPGZvb1wrMHgxMD4KLTArMDAwOCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGExCi0wKzAwMGMgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAwMTAgPFtePl0qPiBsaQlcJGF0LC0xCi0wKzAwMTQgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDAyOCA8Zm9vXCsweDI4PgotMCswMDE4IDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCi0wKzAwMWMgPFtePl0qPiBibmUJXCRhMCxcJGF0LDArMDAyOCA8Zm9vXCsweDI4PgotMCswMDIwIDxbXj5dKj4gbm9wCi0wKzAwMjQgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwMjggPFtePl0qPiBtZmxvCVwkYTAKLTArMDAyYyA8W14+XSo+IGJuZXoJXCRhMiwwKzAwMzggPGZvb1wrMHgzOD4KLTArMDAzMCA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGEyCi0wKzAwMzQgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAwMzggPFtePl0qPiBsaQlcJGF0LC0xCi0wKzAwM2MgPFtePl0qPiBibmUJXCRhMixcJGF0LDArMDA1MCA8Zm9vXCsweDUwPgotMCswMDQwIDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCi0wKzAwNDQgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDA1MCA8Zm9vXCsweDUwPgotMCswMDQ4IDxbXj5dKj4gbm9wCi0wKzAwNGMgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwNTAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA1NCA8W14+XSo+IG1vdmUJXCRhMCxcJGEwCi0wKzAwNTggPFtePl0qPiBtb3ZlCVwkYTAsXCRhMQotMCswMDVjIDxbXj5dKj4gbmVnCVwkYTAsXCRhMAotMCswMDYwIDxbXj5dKj4gbmVnCVwkYTAsXCRhMQotMCswMDY0IDxbXj5dKj4gbGkJXCRhdCwyCi0wKzAwNjggPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMDZjIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNzAgPFtePl0qPiBsaQlcJGF0LDIKLTArMDA3NCA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwNzggPFtePl0qPiBtZmxvCVwkYTAKLTArMDA3YyA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwODAgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMDg0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwODggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDhjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDA5MCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDk0IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDA5OCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwOWMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBhMCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwYTQgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMGE4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwYWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBiMCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwYjQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBiOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMGJjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDBjMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwYzggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMGNjIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDBkMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwZDggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMGRjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDBlMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGU0IDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMCxcJGExCi0wKzAwZTggPFtePl0qPiBibmV6CVwkYTEsMCswZjQgPGZvb1wrMHhmND4KLTArMDBlYyA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTAsXCRhMQotMCswMGYwIDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMGY0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZjggPFtePl0qPiBibmV6CVwkYTIsMCswMTA0IDxmb29cKzB4MTA0PgotMCswMGZjIDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMSxcJGEyCi0wKzAxMDAgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAxMDQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDEwOCA8W14+XSo+IG1vdmUJXCRhMCxcJGEwCi0wKzAxMGMgPFtePl0qPiBibmV6CVwkYTIsMCswMTE4IDxmb29cKzB4MTE4PgotMCswMTEwIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYTIKLTArMDExNCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDExOCA8W14+XSo+IGxpCVwkYXQsLTEKLTArMDExYyA8W14+XSo+IGJuZQlcJGEyLFwkYXQsMCswMTMwIDxmb29cKzB4MTMwPgotMCswMTIwIDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCi0wKzAxMjQgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDEzMCA8Zm9vXCsweDEzMD4KLTArMDEyOCA8W14+XSo+IG5vcAotMCswMTJjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMTMwIDxbXj5dKj4gbWZoaQlcJGEwCi0wKzAxMzQgPFtePl0qPiBsaQlcJGF0LDIKLTArMDEzOCA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTEsXCRhdAotMCswMTNjIDxbXj5dKj4gbWZoaQlcJGEwCi0wKzAxNDAgPFtePl0qPiBibmV6CVwkYTIsMCswMTRjIDxmb29cKzB4MTRjPgotMCswMTQ0IDxbXj5dKj4gZGRpdglcJHplcm8sXCRhMSxcJGEyCi0wKzAxNDggPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAxNGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJHplcm8sLTEKLTArMDE1MCA8W14+XSo+IGJuZQlcJGEyLFwkYXQsMCswMTY4IDxmb29cKzB4MTY4PgotMCswMTU0IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCR6ZXJvLDEKLTArMDE1OCA8W14+XSo+IGRzbGwzMglcJGF0LFwkYXQsMHgxZgotMCswMTVjIDxbXj5dKj4gYm5lCVwkYTEsXCRhdCwwKzAxNjggPGZvb1wrMHgxNjg+Ci0wKzAxNjAgPFtePl0qPiBub3AKLTArMDE2NCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDE2OCA8W14+XSo+IG1mbG8JXCRhMAotMCswMTZjIDxbXj5dKj4gbGkJXCRhdCwyCi0wKzAxNzAgPFtePl0qPiBkZGl2dQlcJHplcm8sXCRhMSxcJGF0Ci0wKzAxNzQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDE3OCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAxN2MgPFtePl0qPiBkZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDE4MCA8W14+XSo+IG1maGkJXCRhMAotMCswMTg0IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDE4OCA8W14+XSo+IGRkaXZ1CVwkemVybyxcJGExLFwkYXQKLTArMDE4YyA8W14+XSo+IG1maGkJXCRhMAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzViYjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYuZAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI2FzOiAtbWNwdT1yNDAwMAotI25hbWU6IE1JUFMgZGl2Ci0KLSMgVGVzdCB0aGUgZGl2IG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhMQotMCswMDA0IDxbXj5dKj4gYm5leglcJGExLDArMDAxMCA8Zm9vXCsweDEwPgotMCswMDA4IDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYTEKLTArMDAwYyA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDAxMCA8W14+XSo+IGxpCVwkYXQsLTEKLTArMDAxNCA8W14+XSo+IGJuZQlcJGExLFwkYXQsMCswMDI4IDxmb29cKzB4Mjg+Ci0wKzAwMTggPFtePl0qPiBsdWkJXCRhdCwweDgwMDAKLTArMDAxYyA8W14+XSo+IGJuZQlcJGEwLFwkYXQsMCswMDI4IDxmb29cKzB4Mjg+Ci0wKzAwMjAgPFtePl0qPiBub3AKLTArMDAyNCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDAyOCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDJjIDxbXj5dKj4gbm9wCi0wKzAwMzAgPFtePl0qPiBibmV6CVwkYTIsMCswMDNjIDxmb29cKzB4M2M+Ci0wKzAwMzQgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhMgotMCswMDM4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMDNjIDxbXj5dKj4gbGkJXCRhdCwtMQotMCswMDQwIDxbXj5dKj4gYm5lCVwkYTIsXCRhdCwwKzAwNTQgPGZvb1wrMHg1ND4KLTArMDA0NCA8W14+XSo+IGx1aQlcJGF0LDB4ODAwMAotMCswMDQ4IDxbXj5dKj4gYm5lCVwkYTEsXCRhdCwwKzAwNTQgPGZvb1wrMHg1ND4KLTArMDA0YyA8W14+XSo+IG5vcAotMCswMDUwIDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMDU0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNTggPFtePl0qPiBtb3ZlCVwkYTAsXCRhMAotMCswMDVjIDxbXj5dKj4gbW92ZQlcJGEwLFwkYTEKLTArMDA2MCA8W14+XSo+IG5lZwlcJGEwLFwkYTAKLTArMDA2NCA8W14+XSo+IG5lZwlcJGEwLFwkYTEKLTArMDA2OCA8W14+XSo+IGxpCVwkYXQsMgotMCswMDZjIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDA3MCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDc0IDxbXj5dKj4gbGkJXCRhdCwyCi0wKzAwNzggPFtePl0qPiBub3AKLTArMDA3YyA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwODAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA4NCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwODggPFtePl0qPiBub3AKLTArMDA4YyA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwOTAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA5NCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwOTggPFtePl0qPiBub3AKLTArMDA5YyA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwYTAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBhNCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwYTggPFtePl0qPiBub3AKLTArMDBhYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwYjAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBiNCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwYjggPFtePl0qPiBub3AKLTArMDBiYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwYzAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBjNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMGM4IDxbXj5dKj4gbm9wCi0wKzAwY2MgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMGQwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBkOCA8W14+XSo+IG5vcAotMCswMGRjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDBlMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwZTggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMGVjIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDBmMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGY0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwZjggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMGZjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDEwMCA8W14+XSo+IG1mbG8JXCRhMAotCS4uLgotMCswMTBjIDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMCxcJGExCi0wKzAxMTAgPFtePl0qPiBibmV6CVwkYTEsMCswMTFjIDxmb29cKzB4MTFjPgotMCswMTE0IDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMCxcJGExCi0wKzAxMTggPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAxMWMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDEyMCA8W14+XSo+IG5vcAotMCswMTI0IDxbXj5dKj4gYm5leglcJGEyLDArMDEzMCA8Zm9vXCsweDEzMD4KLTArMDEyOCA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTEsXCRhMgotMCswMTJjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMTMwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxMzQgPFtePl0qPiBtb3ZlCVwkYTAsXCRhMAotMCswMTM4IDxbXj5dKj4gYm5leglcJGEyLDArMDE0NCA8Zm9vXCsweDE0ND4KLTArMDEzYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGEyCi0wKzAxNDAgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAxNDQgPFtePl0qPiBsaQlcJGF0LC0xCi0wKzAxNDggPFtePl0qPiBibmUJXCRhMixcJGF0LDArMDE1YyA8Zm9vXCsweDE1Yz4KLTArMDE0YyA8W14+XSo+IGx1aQlcJGF0LDB4ODAwMAotMCswMTUwIDxbXj5dKj4gYm5lCVwkYTEsXCRhdCwwKzAxNWMgPGZvb1wrMHgxNWM+Ci0wKzAxNTQgPFtePl0qPiBub3AKLTArMDE1OCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDE1YyA8W14+XSo+IG1maGkJXCRhMAotMCswMTYwIDxbXj5dKj4gbGkJXCRhdCwyCi0wKzAxNjQgPFtePl0qPiBub3AKLTArMDE2OCA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTEsXCRhdAotMCswMTZjIDxbXj5dKj4gbWZoaQlcJGEwCi0wKzAxNzAgPFtePl0qPiBub3AKLTArMDE3NCA8W14+XSo+IGJuZXoJXCRhMiwwKzAxODAgPGZvb1wrMHgxODA+Ci0wKzAxNzggPFtePl0qPiBkZGl2CVwkemVybyxcJGExLFwkYTIKLTArMDE3YyA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDE4MCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkemVybywtMQotMCswMTg0IDxbXj5dKj4gYm5lCVwkYTIsXCRhdCwwKzAxOWMgPGZvb1wrMHgxOWM+Ci0wKzAxODggPFtePl0qPiBkYWRkaXUJXCRhdCxcJHplcm8sMQotMCswMThjIDxbXj5dKj4gZHNsbDMyCVwkYXQsXCRhdCwweDFmCi0wKzAxOTAgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDE5YyA8Zm9vXCsweDE5Yz4KLTArMDE5NCA8W14+XSo+IG5vcAotMCswMTk4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMTljIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxYTAgPFtePl0qPiBsaQlcJGF0LDIKLTArMDFhNCA8W14+XSo+IG5vcAotMCswMWE4IDxbXj5dKj4gZGRpdnUJXCR6ZXJvLFwkYTEsXCRhdAotMCswMWFjIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxYjAgPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMWI0IDxbXj5dKj4gbm9wCi0wKzAxYjggPFtePl0qPiBkZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDFiYyA8W14+XSo+IG1maGkJXCRhMAotMCswMWMwIDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDFjNCA8W14+XSo+IG5vcAotMCswMWM4IDxbXj5dKj4gZGRpdnUJXCR6ZXJvLFwkYTEsXCRhdAotMCswMWNjIDxbXj5dKj4gbWZoaQlcJGEwCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5OTkwNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi5zCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGRpdiBtYWNyby4KLWZvbzoKLQlkaXYJJDAsJDQsJDUKLQlkaXYJJDQsJDUKLQlkaXYJJDQsJDUsJDYKLQlkaXYJJDQsMQotCWRpdgkkNCwkNSwxCi0JZGl2CSQ0LC0xCi0JZGl2CSQ0LCQ1LC0xCi0JZGl2CSQ0LDIKLQlkaXYJJDQsJDUsMgotCWRpdgkkNCwweDgwMDAKLQlkaXYJJDQsJDUsMHg4MDAwCi0JZGl2CSQ0LC0weDgwMDAKLQlkaXYJJDQsJDUsLTB4ODAwMAotCWRpdgkkNCwweDEwMDAwCi0JZGl2CSQ0LCQ1LDB4MTAwMDAKLQlkaXYJJDQsMHgxYTVhNQotCWRpdgkkNCwkNSwweDFhNWE1Ci0KLSMgZGl2dSBpcyBsaWtlIGRpdiwgZXhjZXB0IHdoZW4gYm90aCBhcmd1bWVudHMgYXJlIHJlZ2lzdGVycy4KLSMgSnVzdCBzYW5pdHkgY2hlY2sgaXQgb3RoZXJ3aXNlLgotCWRpdnUJJDAsJDQsJDUKLQlkaXZ1CSQ0LCQ1Ci0JZGl2dQkkNCwkNSwkNgotCWRpdnUJJDQsMQotCi0jIHJlbSBpcyBsaWtlIGRpdiwgcmVtdSBpcyBsaWtlIGRpdnUKLQlyZW0JJDQsJDUsJDYKLQlyZW11CSQ0LCQ1LDIKLQotIyBTYW5pdHkgY2hlY2sgdGhlIDY0IGJpdCB2ZXJzaW9ucy4KLQkuc2V0CW1pcHMzCi0JZGRpdgkkNCwkNSwkNgotCWRkaXZ1CSQ0LCQ1LDIKLQlkcmVtCSQ0LCQ1LDB4ODAwMAotCWRyZW11CSQ0LCQ1LC0weDgwMDAKLQotIyBmb3JjZSBzb21lIHBhZGRpbmcsIHRvIG1ha2Ugb2JqZHVtcCBjb25zaXN0ZW50bHkgcmVwb3J0IHRoYXQgdGhlcmUncyBzb21lCi0jIGhlcmUuLi4KLQkuc3BhY2UJOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kbGkuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGxpLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYjQ0NWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kbGkuZAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgZGxpCi0jYXM6IC1taXBzMwotCi0jIFRlc3QgdGhlIGRsaSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGkJXCRhMCwwCi0wKzAwMDQgPFtePl0qPiBsaQlcJGEwLDEKLTArMDAwOCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDAwYyA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi0wKzAwMTAgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxYyA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci0wKzAwMjAgPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotMCswMDI0IDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxMAotMCswMDI4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweDEyMzQKLTArMDAyYyA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmZgotMCswMDMwIDxbXj5dKj4gZHNybDMyCVwkYTAsXCRhMCwweDAKLTArMDAzNCA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmZgotMCswMDM4IDxbXj5dKj4gZHNybDMyCVwkYTAsXCRhMCwweDAKLTArMDAzYyA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDA0MCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDA0NCA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4YwotMCswMDQ4IDxbXj5dKj4gbHVpCVwkYTAsMHg4MDAwCi0wKzAwNGMgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4MTIzNAotMCswMDUwIDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKLTArMDA1NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKLTArMDA1OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHgxMjM0Ci0wKzAwNWMgPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDEwCi0wKzAwNjAgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4NTY3OAotMCswMDY0IDxbXj5dKj4gbHVpCVwkYTAsMHg4MDAwCi0wKzAwNjggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4MTIzNAotMCswMDZjIDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxMAotMCswMDcwIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweDU2NzgKLTArMDA3NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKLTArMDA3OCA8W14+XSo+IGxpCVwkYTAsLTMwODc1Ci0wKzAwN2MgPFtePl0qPiBsdWkJXCRhMCwweGZmZmYKLTArMDA4MCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHg0MzIxCi0wKzAwODQgPFtePl0qPiBsaQlcJGEwLC0xNgotMCswMDg4IDxbXj5dKj4gbGkJXCRhMCwtMjU2Ci0wKzAwOGMgPFtePl0qPiBsaQlcJGEwLC00MDk2Ci0wKzAwOTAgPFtePl0qPiBsdWkJXCRhMCwweGZmZmYKLTArMDA5NCA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmMAotMCswMDk4IDxbXj5dKj4gbHVpCVwkYTAsMHhmZjAwCi0wKzAwOWMgPFtePl0qPiBsdWkJXCRhMCwweGYwMDAKLTArMDBhMCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDBhNCA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgwCi0wKzAwYTggPFtePl0qPiBsaQlcJGEwLC0xNgotMCswMGFjIDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDAKLTArMDBiMCA8W14+XSo+IGxpCVwkYTAsLTI1NgotMCswMGI0IDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDAKLTArMDBiOCA8W14+XSo+IGxpCVwkYTAsLTQwOTYKLTArMDBiYyA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgwCi0wKzAwYzAgPFtePl0qPiBsaQlcJGEwLDB4ZmZmZgotMCswMGM0IDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDEwCi0wKzAwYzggPFtePl0qPiBsaQlcJGEwLDB4ZmZmMAotMCswMGNjIDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDEwCi0wKzAwZDAgPFtePl0qPiBsaQlcJGEwLDB4ZmYwMAotMCswMGQ0IDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDEwCi0wKzAwZDggPFtePl0qPiBsaQlcJGEwLDB4ZjAwMAotMCswMGRjIDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDEwCi0wKzAwZTAgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAwZTQgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDQKLTArMDBlOCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDBlYyA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4OAotMCswMGYwIDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMGY0IDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHhjCi0wKzAwZjggPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAwZmMgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDEwCi0wKzAxMDAgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAxMDQgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDE0Ci0wKzAxMDggPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAxMGMgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDE4Ci0wKzAxMTAgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAxMTQgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDFjCi0wKzAxMTggPFtePl0qPiBsdWkJXCRhMCwweGZmZmYKLTArMDExYyA8W14+XSo+IGRzcmwzMglcJGEwLFwkYTAsMHgwCi0wKzAxMjAgPFtePl0qPiBsdWkJXCRhMCwweGZmZgotMCswMTI0IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGZmZmYKLTArMDEyOCA8W14+XSo+IGx1aQlcJGEwLDB4ZmYKLTArMDEyYyA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhmZmZmCi0wKzAxMzAgPFtePl0qPiBsdWkJXCRhMCwweGYKLTArMDEzNCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhmZmZmCi0wKzAxMzggPFtePl0qPiBsaQlcJGEwLDB4ZmZmZgotMCswMTNjIDxbXj5dKj4gbGkJXCRhMCw0MDk1Ci0wKzAxNDAgPFtePl0qPiBsaQlcJGEwLDI1NQotMCswMTQ0IDxbXj5dKj4gbGkJXCRhMCwxNQotMCswMTQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgzCi0wKzAxNGMgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4ZmZmYwotMCswMTUwIDxbXj5dKj4gbGkJXCRhMCwweGZmZmYKLTArMDE1NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MWUKLTArMDE1OCA8W14+XSo+IGxpCVwkYTAsMHhmZmZmCi0wKzAxNWMgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MgotMCswMTYwIDxbXj5dKj4gbGkJXCRhMCwweGZmZmYKLTArMDE2NCA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHg2Ci0wKzAxNjggPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAxNmMgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MAotMCswMTcwIDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHhhCi0wKzAxNzQgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAxNzggPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDFjCi0wKzAxN2MgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweGEKLTArMDE4MCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDE4NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTgKLTArMDE4OCA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4YQotMCswMThjIDxbXj5dKj4gbHVpCVwkYTAsMHgzZgotMCswMTkwIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGZjMDMKLTArMDE5NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKLTArMDE5OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhmZmZmCi0wKzAxOWMgPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDEwCi0wKzAxYTAgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YzAwMAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kbGkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGxpLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1Nzk1MjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kbGkucworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBkbGkgbWFjcm8uCi0JCi1mb286CQotCWRsaQkkNCwwCi0JZGxpCSQ0LDEKLQlkbGkJJDQsLTEKLQlkbGkJJDQsMHg4MDAwCi0JZGxpCSQ0LC0weDgwMDAKLQlkbGkJJDQsMHgxMDAwMAotCWRsaQkkNCwweDFhNWE1Ci0JZGxpCSQ0LDB4ODAwMDEyMzQKLQlkbGkJJDQsMHhmZmZmZmZmZgotCWRsaQkkNCwweDAwMDAwMDAwZmZmZmZmZmYKLQlkbGkJJDQsMHhmZmZmZmZmZmZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwZmZmZmZmZmZmZmZmZgotCWRsaQkkNCwweGZmZmZmZmZmODAwMDEyMzQKLQlkbGkJJDQsMHhmZmZmODAwMDEyMzQ1Njc4Ci0JZGxpCSQ0LDB4ODAwMDEyMzQ1Njc4MDAwMAotCWRsaQkkNCwweGZmZmZmZmZmZmZmZjg3NjUKLQlkbGkJJDQsMHhmZmZmZmZmZmZmZmY0MzIxCi0KLQlkbGkJJDQsMHhmZmZmZmZmZmZmZmZmZmYwCi0JZGxpCSQ0LDB4ZmZmZmZmZmZmZmZmZmYwMAotCWRsaQkkNCwweGZmZmZmZmZmZmZmZmYwMDAKLQlkbGkJJDQsMHhmZmZmZmZmZmZmZmYwMDAwCi0JZGxpCSQ0LDB4ZmZmZmZmZmZmZmYwMDAwMAotCWRsaQkkNCwweGZmZmZmZmZmZmYwMDAwMDAKLQlkbGkJJDQsMHhmZmZmZmZmZmYwMDAwMDAwCi0JZGxpCSQ0LDB4ZmZmZmZmZmYwMDAwMDAwMAotCWRsaQkkNCwweGZmZmZmZmYwMDAwMDAwMDAKLQlkbGkJJDQsMHhmZmZmZmYwMDAwMDAwMDAwCi0JZGxpCSQ0LDB4ZmZmZmYwMDAwMDAwMDAwMAotCWRsaQkkNCwweGZmZmYwMDAwMDAwMDAwMDAKLQlkbGkJJDQsMHhmZmYwMDAwMDAwMDAwMDAwCi0JZGxpCSQ0LDB4ZmYwMDAwMDAwMDAwMDAwMAotCWRsaQkkNCwweGYwMDAwMDAwMDAwMDAwMDAKLQotCWRsaQkkNCwweDBmZmZmZmZmZmZmZmZmZmYKLQlkbGkJJDQsMHgwMGZmZmZmZmZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwZmZmZmZmZmZmZmZmZgotCWRsaQkkNCwweDAwMDBmZmZmZmZmZmZmZmYKLQlkbGkJJDQsMHgwMDAwMGZmZmZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwZmZmZmZmZmZmZgotCWRsaQkkNCwweDAwMDAwMDBmZmZmZmZmZmYKLQlkbGkJJDQsMHgwMDAwMDAwMGZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwMDAwZmZmZmZmZgotCWRsaQkkNCwweDAwMDAwMDAwMDBmZmZmZmYKLQlkbGkJJDQsMHgwMDAwMDAwMDAwMGZmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwMDAwMDAwZmZmZgotCWRsaQkkNCwweDAwMDAwMDAwMDAwMDBmZmYKLQlkbGkJJDQsMHgwMDAwMDAwMDAwMDAwMGZmCi0JZGxpCSQ0LDB4MDAwMDAwMDAwMDAwMDAwZgotCi0JZGxpCSQ0LDB4MDAwMDAwMDAwMDAzZmZmYwotCWRsaQkkNCwweDAwMDAzZmZmYzAwMDAwMDAKLQlkbGkJJDQsMHgwMDAzZmZmYzAwMDAwMDAwCi0JZGxpCSQ0LDB4MDAzZmZmYzAwMDAwMDAwMAotCWRsaQkkNCwweDAwM2ZmZmZmZmZjMDAwMDAKLQlkbGkJJDQsMHgwMDNmZmZmZmZmZmMwMDAwCi0JZGxpCSQ0LDB4MDAzZmZmZmZmZmZmYzAwMAotCi0JZGxpCSQ0LDB4MDAzZmZjMDNmZmZmYzAwMAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFncy5jIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFncy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2ZiMTExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpc24ndCBkaXJlY3RseSB1c2VkIGJ5IHRoZSB0ZXN0IHN1aXRlOyBpdCB1c2VzCi0gICBlbGZfZV9mbGFncy5zLiAgSG93ZXZlciwgSSBmaWd1cmVkIGl0IHdvdWxkIGJlIG5pY2UgdG8gcHJvdmlkZSB0aGUKLSAgIHNvdXJjZSBjb2RlIGZyb20gd2hpY2ggdGhlIC5zIGZpbGUgd2FzIGdlbmVyYXRlZC4KLQotICAgSXQgd2FzIGNvbXBpbGVkIGFzIGZvbGxvd3M6Ci0KLSAgIG1pcHM2NC1lbGYtZ2NjIC1tNDY1MCAtUyAtTyBlbGZfZV9mbGFncy5jCi0KLSAgIFdlIHVzZSB0aGUgLW00NjUwIGZsYWcgdG8gZ2V0IHRoZSA0NjUwLXNwZWNpZmljICdtdWwnIGluc3RydWN0aW9uCi0gICBpbiB0aGVyZTsgdGhlIHRlc3Qgc3VpdGUgd2FudHMgdG8gYmUgc3VyZSB0aGF0IEdBUydzIC1tNDY1MCBmbGFnCi0gICB3aWxsIGluZGVlZCBjYXVzZSBpdCB0byBnZW5lcmF0ZSB0aGUgNDY1MCBtdWwgaW5zdHJ1Y3Rpb24sIGFuZCBub3QKLSAgIGV4cGFuZCBpdCBhcyBhIG1hY3JvLiAgKi8KLQotaW50Ci1mb28gKGludCBhLCBpbnQgYikKLXsKLSAgcmV0dXJuIChhICogYikgKyAxOwotfQotCi1pbnQKLW1haW4gKCkKLXsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYzMyZWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFncy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotCS5maWxlCTEgImVsZl9lX2ZsYWdzLmMiCi1nY2MyX2NvbXBpbGVkLjoKLV9fZ251X2NvbXBpbGVkX2M6Ci0JLnRleHQKLQkuYWxpZ24JMgotCS5nbG9ibAlmb28KLQkudGV4dAotCS5lbnQJZm9vCi1mb286Ci0JLmZyYW1lCSRzcCwwLCQzMQkJIyB2YXJzPSAwLCByZWdzPSAwLzAsIGFyZ3M9IDAsIGV4dHJhPSAwCi0JLm1hc2sJMHgwMDAwMDAwMCwwCi0JLmZtYXNrCTB4MDAwMDAwMDAsMAotCW11bAkkMiwkNCwkNQotCS5zZXQJbm9yZW9yZGVyCi0JLnNldAlub21hY3JvCi0JagkkMzEKLQlhZGR1CSQyLCQyLDEKLQkuc2V0CW1hY3JvCi0JLnNldAlyZW9yZGVyCi0KLQkuZW5kCWZvbwotCS5hbGlnbgkyCi0JLmdsb2JsCW1haW4KLQkudGV4dAotCS5lbnQJbWFpbgotbWFpbjoKLQkuZnJhbWUJJHNwLDQwLCQzMQkJIyB2YXJzPSAwLCByZWdzPSAxLzAsIGFyZ3M9IDMyLCBleHRyYT0gMAotCS5tYXNrCTB4ODAwMDAwMDAsLTgKLQkuZm1hc2sJMHgwMDAwMDAwMCwwCi0Jc3VidQkkc3AsJHNwLDQwCi0Jc2QJJDMxLDMyKCRzcCkKLQlqYWwJX19nY2NtYWluCi0JbW92ZQkkMiwkMAotCWxkCSQzMSwzMigkc3ApCi0JI25vcAotCS5zZXQJbm9yZW9yZGVyCi0JLnNldAlub21hY3JvCi0JagkkMzEKLQlhZGR1CSRzcCwkc3AsNDAKLQkuc2V0CW1hY3JvCi0JLnNldAlyZW9yZGVyCi0KLQkuZW5kCW1haW4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MxLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmFhN2MxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MxLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIG5hbWU6IEVMRiBlX2ZsYWdzOiBub3RoaW5nIHNwZWNpYWwKLSMgc291cmNlOiBlbGZfZV9mbGFncy5zCi0jIG9iamR1bXA6IC1mZAotCi0uKjouKmZpbGUgZm9ybWF0LiptaXBzLioKLWFyY2hpdGVjdHVyZTogbWlwczo0MDAwLCBmbGFncyAweDAwMDAwMDExOgotSEFTX1JFTE9DLCBIQVNfU1lNUwotc3RhcnQgYWRkcmVzcyAweDAwMDAwMDAwMDAwMDAwMDAKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAwMDAwMDAwMCA8Zm9vPjoKLSAgIDA6CTAwODUwMDE5IAltdWx0dQlcJGEwLFwkYTEKLSAgIDQ6CTAwMDAxMDEyIAltZmxvCVwkdjAKLSAgIDg6CTAzZTAwMDA4IAlqcglcJHJhCi0gICBjOgkyNDQyMDAwMSAJYWRkaXUJXCR2MCxcJHYwLDEKLQotMDAwMDAwMDAwMDAwMDAxMCA8bWFpbj46Ci0gIDEwOgkyN2JkZmZkOCAJYWRkaXUJXCRzcCxcJHNwLC00MAotICAxNDoJZmZiZjAwMjAgCXNkCVwkcmEsMzJcKFwkc3BcKQotICAxODoJMGMwMDAwMDAgCWphbAkwIDxmb28+Ci0gIDFjOgkwMDAwMDAwMCAJbm9wCi0gIDIwOgkwMDAwMTAyZCAJbW92ZQlcJHYwLFwkemVybwotICAyNDoJZGZiZjAwMjAgCWxkCVwkcmEsMzJcKFwkc3BcKQotICAyODoJMDNlMDAwMDggCWpyCVwkcmEKLSAgMmM6CTI3YmQwMDI4IAlhZGRpdQlcJHNwLFwkc3AsNDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDY2MWMyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MyLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIG5hbWU6IEVMRiBlX2ZsYWdzOiAtbTQ2NTAKLSMgc291cmNlOiBlbGZfZV9mbGFncy5zCi0jIGFzOiAtbTQ2NTAKLSMgb2JqZHVtcDogLWZkCi0KLS4qOi4qZmlsZSBmb3JtYXQuKm1pcHMuKgotYXJjaGl0ZWN0dXJlOiBtaXBzOjQ2NTAsIGZsYWdzIDB4MDAwMDAwMTE6Ci1IQVNfUkVMT0MsIEhBU19TWU1TCi1zdGFydCBhZGRyZXNzIDB4MDAwMDAwMDAwMDAwMDAwMAotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMDAwMDAwMDAwIDxmb28+OgotICAgMDoJNzA4NTEwMDIgCW11bAlcJHYwLFwkYTAsXCRhMQotICAgNDoJMDNlMDAwMDggCWpyCVwkcmEKLSAgIDg6CTI0NDIwMDAxIAlhZGRpdQlcJHYwLFwkdjAsMQotCi0wMDAwMDAwMDAwMDAwMDBjIDxtYWluPjoKLSAgIGM6CTI3YmRmZmQ4IAlhZGRpdQlcJHNwLFwkc3AsLTQwCi0gIDEwOglmZmJmMDAyMCAJc2QJXCRyYSwzMlwoXCRzcFwpCi0gIDE0OgkwYzAwMDAwMCAJamFsCTAgPGZvbz4KLSAgMTg6CTAwMDAwMDAwIAlub3AKLSAgMWM6CTAwMDAxMDJkIAltb3ZlCVwkdjAsXCR6ZXJvCi0gIDIwOglkZmJmMDAyMCAJbGQJXCRyYSwzMlwoXCRzcFwpCi0gIDI0OgkwM2UwMDAwOCAJanIJXCRyYQotICAyODoJMjdiZDAwMjggCWFkZGl1CVwkc3AsXCRzcCw0MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhY2M0OWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczMuZAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMgbmFtZTogRUxGIGVfZmxhZ3M6IC1tY3B1PTQ2NTAKLSMgc291cmNlOiBlbGZfZV9mbGFncy5zCi0jIGFzOiAtbWNwdT00NjUwCi0jIG9iamR1bXA6IC1mZAotCi0uKjouKmZpbGUgZm9ybWF0LiptaXBzLioKLWFyY2hpdGVjdHVyZTogbWlwczo0NjUwLCBmbGFncyAweDAwMDAwMDExOgotSEFTX1JFTE9DLCBIQVNfU1lNUwotc3RhcnQgYWRkcmVzcyAweDAwMDAwMDAwMDAwMDAwMDAKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAwMDAwMDAwMCA8Zm9vPjoKLSAgIDA6CTcwODUxMDAyIAltdWwJXCR2MCxcJGEwLFwkYTEKLSAgIDQ6CTAzZTAwMDA4IAlqcglcJHJhCi0gICA4OgkyNDQyMDAwMSAJYWRkaXUJXCR2MCxcJHYwLDEKLQotMDAwMDAwMDAwMDAwMDAwYyA8bWFpbj46Ci0gICBjOgkyN2JkZmZkOCAJYWRkaXUJXCRzcCxcJHNwLC00MAotICAxMDoJZmZiZjAwMjAgCXNkCVwkcmEsMzJcKFwkc3BcKQotICAxNDoJMGMwMDAwMDAgCWphbAkwIDxmb28+Ci0gIDE4OgkwMDAwMDAwMCAJbm9wCi0gIDFjOgkwMDAwMTAyZCAJbW92ZQlcJHYwLFwkemVybwotICAyMDoJZGZiZjAwMjAgCWxkCVwkcmEsMzJcKFwkc3BcKQotICAyNDoJMDNlMDAwMDggCWpyCVwkcmEKLSAgMjg6CTI3YmQwMDI4IAlhZGRpdQlcJHNwLFwkc3AsNDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3M0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzNC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWI3MDUwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3M0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIG5hbWU6IEVMRiBlX2ZsYWdzOiAtbTQ2NTAgLW1jcHU9NDY1MAotIyBzb3VyY2U6IGVsZl9lX2ZsYWdzLnMKLSMgYXM6IC1tNDY1MCAtbWNwdT00NjUwCi0jIG9iamR1bXA6IC1mZAotCi0uKjouKmZpbGUgZm9ybWF0LiptaXBzLioKLWFyY2hpdGVjdHVyZTogbWlwczo0NjUwLCBmbGFncyAweDAwMDAwMDExOgotSEFTX1JFTE9DLCBIQVNfU1lNUwotc3RhcnQgYWRkcmVzcyAweDAwMDAwMDAwMDAwMDAwMDAKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAwMDAwMDAwMCA8Zm9vPjoKLSAgIDA6CTcwODUxMDAyIAltdWwJXCR2MCxcJGEwLFwkYTEKLSAgIDQ6CTAzZTAwMDA4IAlqcglcJHJhCi0gICA4OgkyNDQyMDAwMSAJYWRkaXUJXCR2MCxcJHYwLDEKLQotMDAwMDAwMDAwMDAwMDAwYyA8bWFpbj46Ci0gICBjOgkyN2JkZmZkOCAJYWRkaXUJXCRzcCxcJHNwLC00MAotICAxMDoJZmZiZjAwMjAgCXNkCVwkcmEsMzJcKFwkc3BcKQotICAxNDoJMGMwMDAwMDAgCWphbAkwIDxmb28+Ci0gIDE4OgkwMDAwMDAwMCAJbm9wCi0gIDFjOgkwMDAwMTAyZCAJbW92ZQlcJHYwLFwkemVybwotICAyMDoJZGZiZjAwMjAgCWxkCVwkcmEsMzJcKFwkc3BcKQotICAyNDoJMDNlMDAwMDggCWpyCVwkcmEKLSAgMjg6CTI3YmQwMDI4IAlhZGRpdQlcJHNwLFwkc3AsNDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvaXRibCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvaXRibApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmOGE3OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2l0YmwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0KLSAgICA7IFRlc3QgY2FzZSBmb3IgYXNzZW1ibGVyIG9wdGlvbiAiaXRibCIuCi0gICAgOyBSdW4gYXMgImFzIC0taXRibCBpdGJsIGl0YmwucyIKLSAgICA7IG9yIHdpdGggc3RhbmQtYWxvbmUgdGVzdCBjYXNlICJpdGJsLXRlc3QgaXRibCBpdGJsLnMiLgotICAgIDsgSGVyZSwgdGhlIHByb2Nlc3NvcnMgcmVwcmVzZW50IG1pcHMgY29wcm9jZXNzb3JzLgotCi0gICAgcDEgZHJlZyBkMSAxICAgICAgICA7IGRhdGEgcmVnaXN0ZXIgImQxIiBmb3IgQ09QMSBoYXMgdmFsdWUgMQotICAgIHAxIGNyZWcgYzMgMyAgICAgICAgOyBjdHJsIHJlZ2lzdGVyICJjMyIgZm9yIENPUDEgaGFzIHZhbHVlIDMKLSAgICBwMyBpbnNuIGZpZSAweDFlOjI0LTIwICAgICAgOyBmdW5jdGlvbiAiZmlsbCIgZm9yIENPUDMgaGFzIHZhbHVlIDMxCi0gICAgcDMgZHJlZyBkMyAzICAgICAgICA7IGRhdGEgcmVnaXN0ZXIgImQzIiBmb3IgQ09QMyBoYXMgdmFsdWUgMwotICAgIHAzIGNyZWcgYzIgMjIgICAgICAgOyBjb250cm9sIHJlZ2lzdGVyICJjMiIgZm9yIENPUDMgaGFzIHZhbHVlIDIyCi0gICAgcDMgaW5zbiBmZWUgMHgxZToyNC0yMCxkcmVnOjE3LTEzLGNyZWc6MTItOCxpbW1lZDo3LTAKLQotICAgIHAzIGRyZWcgZDMgMyAgICAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMyIgZm9yIENPUDMgaGFzIHZhbHVlIDMKLSAgICBwMyBjcmVnIGMyIDIyICAgICAgIDsgY29udHJvbCByZWdpc3RlciAiYzIiIGZvciBDT1AzIGhhcyB2YWx1ZSAyMgotICAgIHAzIGluc24gZnVtIDB4MDFlMDAwMDEgZHJlZzoxNy0xMyBjcmVnOjEyLTgKLSAgICBwMyBpbnNuIGZvaCAweGY6MjQtMjEgZHJlZzoyMC0xNiBpbW1lZDoxNS0wCi0KLSAgICBwMyBpbnNuIHBpZyAweDE6MjQtMjEqWzB4MTAwfDB4Ml0sIGRyZWc6MjAtMTYsIGltbWVkOjE1LTAqMHgxMDAwMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9pdGJsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2l0YmwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1NTQ1Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2l0YmwucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQotICAgIDsgVGVzdCBjYXNlIGZvciBhc3NlbWJsZXIgb3B0aW9uICJpdGJsIi4KLSAgICA7IFJ1biBhcyAiYXMgLS1pdGJsIGl0YmwgaXRibC5zIgotICAgIDsgb3Igd2l0aCBzdGFuZC1hbG9uZSB0ZXN0IGNhc2UgIml0YmwtdGVzdCBpdGJsIGl0YmwucyIuCi0KLSAgICA7IENhbGwgbWlwcyBjb3Byb2Nlc3NvciAiY29mdW4icyBhcyBkZWZpbmVkIGluICJpdGJsIi4KLQotICAgIGZlZSAkZDMsJGMyLDB4MSAJOyAgMHg0ZmYwNzYwMQotICAgIGZpZSAJICAJOyAgMHg0ZmYwMDAwMAotICAgIGZvaCAkMiwweDEwMAotICAgIGZ1bSAkZDMsJGMyICAgICAJOyAgMHg0ZmYwNzYwMQotICAgIHBpZyAkMiwweDEwMAotCi0gICAgOyBDYWxsIGEgbWlwcyBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiB3aXRoIHJlZ2lzdGVyICJkMSIgCi0gICAgOyBkZWZpbmVkIGluICJpdGJsIi4KLQotICAgIExXQzEgJGQxLDB4MTAwKCQyKQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1lbXBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwtZW1waWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ2Y2NmYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1lbXBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGphbC1lbXBpYwotI2FzOiAtbWlwczEgLW1lbWJlZGRlZC1waWMKLSNzb3VyY2U6IGphbC5zCi0KLSMgVGVzdCB0aGUgamFsIG1hY3JvIHdpdGggLW1lbWJlZGRlZC1waWMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+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+IGx1aQlcJGEwLDB4MAotWyAJXSpmODogUkVMSEkJZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMGZjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDI1MgotWyAJXSpmYzogUkVMTE8JZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMTAwIDxbXj5dKj4gbGkJXCRhMCwyNDgKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtZW1waWMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtZW1waWMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkZjVlMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLWVtcGljLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGEgbWFjcm8gd2l0aCAtbWVtYmVkZGVkLXBpYwotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLXRleHRfbGFiZWw6CQotCWxhCSQ0LDAKLQlsYQkkNCwxCi0JbGEJJDQsMHg4MDAwCi0JbGEJJDQsLTB4ODAwMAotCWxhCSQ0LDB4MTAwMDAKLQlsYQkkNCwweDFhNWE1Ci0JbGEJJDQsMCgkNSkKLQlsYQkkNCwxKCQ1KQotCWxhCSQ0LDB4ODAwMCgkNSkKLQlsYQkkNCwtMHg4MDAwKCQ1KQotCWxhCSQ0LDB4MTAwMDAoJDUpCi0JbGEJJDQsMHgxYTVhNSgkNSkKLQlsYQkkNCxkYXRhX2xhYmVsCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24KLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQlsYQkkNCxkYXRhX2xhYmVsKzEKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCWxhCSQ0LGRhdGFfbGFiZWwoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKCQ1KQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbigkNSkKLQlsYQkkNCxkYXRhX2xhYmVsKzEoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMSgkNSkKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMSgkNSkKLQotc2Vjb25kX3RleHRfbGFiZWw6CQotCWxhCSQ0LGV4dGVybmFsX3RleHRfbGFiZWwgLSB0ZXh0X2xhYmVsCi0JbGEJJDQsc2Vjb25kX3RleHRfbGFiZWwgLSB0ZXh0X2xhYmVsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLXN2cjRwaWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtc3ZyNHBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZThhM2Q1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtc3ZyNHBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsNDc0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYS1zdnI0cGljCi0jYXM6IC1taXBzMSAtS1BJQyAtLWRlZnN5bSBLUElDPTEKLSNzb3VyY2U6IGxhLnMKLQotIyBUZXN0IHRoZSBsYSBtYWNybyB3aXRoIC1LUElDLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsaQlcJGEwLDAKLTArMDAwNCA8W14+XSo+IGxpCVwkYTAsMQotMCswMDA4IDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLTArMDAwYyA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci0wKzAwMTAgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLTArMDAxYyA8W14+XSo+IGxpCVwkYTAsMAotMCswMDIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDI0IDxbXj5dKj4gbGkJXCRhMCwxCi0wKzAwMjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMmMgPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDM0IDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKLTArMDAzOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAzYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDQ0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotMCswMDRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDUwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNTA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMDU0IDxbXj5dKj4gbm9wCi0wKzAwNTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSo1ODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDA1YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjVjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjYwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNjQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo2ODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNmM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwNzAgPFtePl0qPiBub3AKLTArMDA3NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjc0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwNzggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo3ODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDA3YyA8W14+XSo+IG5vcAotMCswMDgwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qODA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDA4NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjg0OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDA4OCA8W14+XSo+IG5vcAotMCswMDhjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVsgCV0qOGM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwOTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo5MDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTQgPFtePl0qPiBub3AKLTArMDA5OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzAwOWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo5YzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhMCA8W14+XSo+IG5vcAotMCswMGE0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDBhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmE4OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGFjIDxbXj5dKj4gbm9wCi0wKzAwYjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotMCswMGI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYjQ6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBiOCA8W14+XSo+IG5vcAotMCswMGJjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDBjMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmMwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMGM0IDxbXj5dKj4gbm9wCi0wKzAwYzggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWyAJXSpjODogUl9NSVBTX0xPMTYJLmJzcwotMCswMGNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qY2M6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwZDAgPFtePl0qPiBub3AKLTArMDBkNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAxCi1bIAldKmQ0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwZDggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpkODogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwZGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBlMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVsgCV0qZTA6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwZTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAwZTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSplODogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBmMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLTArMDBmNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDBmOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmY4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxMDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci0wKzAxMDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxMDggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxMDg6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDExMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLTArMDExNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDExOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjExODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTFjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxMjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci0wKzAxMjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxMjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxMjg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxMmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDEzMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVsgCV0qMTMwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxMzggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxMzg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxM2MgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDE0MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzE3NjgKLVsgCV0qMTQwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxNDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxNDggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxNDg6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMTRjIDxbXj5dKj4gbm9wCi0wKzAxNTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bIAldKjE1MDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDE1NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE1NDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNTggPFtePl0qPiBub3AKLTArMDE1YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLTArMDE2MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE2MDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2NCA8W14+XSo+IG5vcAotMCswMTY4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotMCswMTZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTZjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTcwIDxbXj5dKj4gbm9wCi0wKzAxNzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci0wKzAxNzggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxNzg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE3YyA8W14+XSo+IG5vcAotMCswMTgwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotMCswMTg0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTg0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTg4IDxbXj5dKj4gbm9wCi0wKzAxOGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bIAldKjE4YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTkwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTkwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMTk0IDxbXj5dKj4gbm9wCi0wKzAxOTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMxNzY4Ci1bIAldKjE5ODogUl9NSVBTX0xPMTYJLmJzcwotMCswMTljIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTljOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDFhMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMWE0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMWE0OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMWE4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMWFjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWFjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFiMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMWI0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLTArMDFiOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDFiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFiYzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFjMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMWM0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLTArMDFjOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDFjYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFjYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFkMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMWQ0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLTArMDFkOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDFkYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFkYzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWUwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxZTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotMCswMWU4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMWVjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWVjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMWYwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxZjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoxZjQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFmOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDFmYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFmYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDIwMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMjA0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKLVsgCV0qMjA0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyMDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyMGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyMGM6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMjEwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAyMTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bIAldKjIxNDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDIxOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDIxYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjIxYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDIyNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLTArMDIyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDIyYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjIyYzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMjM0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotMCswMjM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMjNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjNjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjQwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAyNDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi0wKzAyNDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyNGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyNGM6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI1MCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMjU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotMCswMjU4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMjVjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjVjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMjYwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAyNjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bIAldKjI2NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMjZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjZjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMjcwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAyNzQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIyMTMxCi1bIAldKjI3NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjc4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMjdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjdjOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDI4MCA8W14+XSo+IG5vcAotMCswMjg0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMjg0OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMjg4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjhjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjhjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5MCA8W14+XSo+IG5vcAotMCswMjk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjk4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjljIDxbXj5dKj4gbm9wCi0wKzAyYTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyYTQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTggPFtePl0qPiBub3AKLTArMDJhYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJiMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjJiMDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmI0IDxbXj5dKj4gbm9wCi0wKzAyYjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyYmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyYmM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyYzAgPFtePl0qPiBub3AKLTArMDJjNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjJjNDogUl9NSVBTX0xPMTYJLmJzcwotMCswMmM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMmNjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMmQwIDxbXj5dKj4gbm9wCi0wKzAyZDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSoyZDQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDJkOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJkYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjJkYzogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAyZTAgPFtePl0qPiBub3AKLTArMDJlNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bIAldKjJlNDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDJlOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJlYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjJlYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZjAgPFtePl0qPiBub3AKLTArMDJmNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzAyZjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyZmM6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMDAgPFtePl0qPiBub3AKLTArMDMwNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzAzMDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozMGM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMTAgPFtePl0qPiBub3AKLTArMDMxNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzAzMTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozMWM6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMyMCA8W14+XSo+IG5vcAotMCswMzI0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDMyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDMyYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjMyYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDMzMCA8W14+XSo+IG5vcAotMCswMzM0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVsgCV0qMzM0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAzMzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzM2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozM2M6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAzNDAgPFtePl0qPiBub3AKLTArMDM0NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAxCi1bIAldKjM0NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMzQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzRjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMzRjOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDM1MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMzU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSozNTQ6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAzNTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAzNWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozNjA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzY0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAzNjggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci0wKzAzNmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAzNzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozNzQ6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNzggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDM3YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLTArMDM4MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDM4NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjM4ODogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM4YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMzkwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotMCswMzk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMzk4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzljIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMzljOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzYTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDNhNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLTArMDNhOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDNhYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDNiMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjNiMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDNiNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswM2I4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSozYjg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDNiYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDNjMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDNjNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjNjNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDNjOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswM2NjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMTc2OAotWyAJXSozY2M6IFJfTUlQU19MTzE2CS5ic3MKLTArMDNkMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDNkNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDNkOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjNkODogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAzZGMgPFtePl0qPiBub3AKLTArMDNlMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qM2UwOiBSX01JUFNfTE8xNgkuZGF0YQotMCswM2U0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswM2U4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qM2U4OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNlYyA8W14+XSo+IG5vcAotMCswM2YwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotMCswM2Y0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswM2Y4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qM2Y4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2ZjIDxbXj5dKj4gbm9wCi0wKzA0MDAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci0wKzA0MDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0MDggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0MDg6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MGMgPFtePl0qPiBub3AKLTArMDQxMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLTArMDQxNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDQxOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjQxODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDFjIDxbXj5dKj4gbm9wCi0wKzA0MjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci0wKzA0MjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0MjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0Mjg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzA0MmMgPFtePl0qPiBub3AKLTArMDQzMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qNDMwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzA0MzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0MzggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0Mzg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzA0M2MgPFtePl0qPiBub3AKLTArMDQ0MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzE3NjgKLVsgCV0qNDQwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzA0NDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0NDggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0NDg6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswNDRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA0NTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo0NTA6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzA0NTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA0NTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0NWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0NWM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDYwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA0NjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotMCswNDY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNDZjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNDcwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNDcwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDc0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA0NzggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotMCswNDdjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNDgwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNDg0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNDg0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDg4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA0OGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotMCswNDkwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNDk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNDk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNDk4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0OWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDRhMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi0wKzA0YTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA0YTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0YWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0YWM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzA0YjAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDRiNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjRiNDogUl9NSVBTX0xPMTYJLmJzcwotMCswNGI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNGJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNGMwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNGMwOiBSX01JUFNfR09UMTYJLmJzcwotMCswNGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA0YzggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAotWyAJXSo0Yzg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDRjYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDRkMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDRkNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjRkNDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzA0ZDggPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDRkYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qNGRjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswNGUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNGU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNGU4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNGU4OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRlYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswNGYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotMCswNGY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNGY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNGZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNGZjOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNTAwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzA1MDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi0wKzA1MDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA1MGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1MTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo1MTA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1MTQgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDUxOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLTArMDUxYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDUyMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDUyNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjUyNDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTI4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzA1MmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi0wKzA1MzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA1MzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1MzggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo1Mzg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzA1M2MgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDU0MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qNTQwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzA1NDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA1NDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1NGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo1NGM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzA1NTAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDU1NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjIxMzEKLVsgCV0qNTU0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzA1NTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA1NWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEteGdvdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTVjZDI2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEteGdvdC5kCisrKyAvZGV2L251bGwKQEAgLTEsNjE4ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYS14Z290Ci0jYXM6IC1taXBzMSAtS1BJQyAteGdvdCAtLWRlZnN5bSBLUElDPTEKLSNzb3VyY2U6IGxhLnMKLQotIyBUZXN0IHRoZSBsYSBtYWNybyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsaQlcJGEwLDAKLTArMDAwNCA8W14+XSo+IGxpCVwkYTAsMQotMCswMDA4IDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLTArMDAwYyA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci0wKzAwMTAgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLTArMDAxYyA8W14+XSo+IGxpCVwkYTAsMAotMCswMDIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDI0IDxbXj5dKj4gbGkJXCRhMCwxCi0wKzAwMjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMmMgPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDM0IDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKLTArMDAzOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAzYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDQ0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotMCswMDRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDUwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNTA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMDU0IDxbXj5dKj4gbm9wCi0wKzAwNTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSo1ODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDA1YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo1YzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwNjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo2NDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNjg6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwNzAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo3MDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo3NDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA3OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDA3YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjdjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDgwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjgwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwODggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo4ODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDhjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qOGM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwOTAgPFtePl0qPiBub3AKLTArMDA5NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjk0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo5ODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDA5YyA8W14+XSo+IG5vcAotMCswMGEwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qYTA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmE0OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDBhOCA8W14+XSo+IG5vcAotMCswMGFjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVsgCV0qYWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwYjAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qYjA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMGI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qYjg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGJjIDxbXj5dKj4gbm9wCi0wKzAwYzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotMCswMGM0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmM0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMGNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qY2M6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDAgPFtePl0qPiBub3AKLTArMDBkNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzAwZDggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qZDg6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwZTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSplMDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlNCA8W14+XSo+IG5vcAotMCswMGU4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDBlYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSplYzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGYwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMGY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qZjQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmOCA8W14+XSo+IG5vcAotMCswMGZjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDEwMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjEwMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDEwNCA8W14+XSo+IG5vcAotMCswMTA4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVsgCV0qMTA4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxMGM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxMTAgPFtePl0qPiBub3AKLTArMDExNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAxCi1bIAldKjExNDogUl9NSVBTX0xPMTYJLmJzcwotMCswMTE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTE4OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDExYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMTIwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSoxMjA6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxMjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxMjggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTI4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDEzMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjEzMDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDEzOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLTArMDEzYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDE0MCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxNDA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxNDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoxNDg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDE1MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLTArMDE1NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDE1OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxNTg6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxNjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoxNjA6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDE2OCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLTArMDE2YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDE3MCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxNzA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE3NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDE3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjE3ODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTdjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxODAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci0wKzAxODQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxODggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxODg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxOGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDE5MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVsgCV0qMTkwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxOTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxOTg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxOWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDFhMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzE3NjgKLVsgCV0qMWEwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxYTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxYTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxYTg6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMWFjIDxbXj5dKj4gbm9wCi0wKzAxYjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bIAldKjFiMDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDFiNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxYjQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMWJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWJjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFjMCA8W14+XSo+IG5vcAotMCswMWM0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotMCswMWM4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFjODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFjYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDFkMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjFkMDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkNCA8W14+XSo+IG5vcAotMCswMWQ4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotMCswMWRjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFkYzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFlMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDFlNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjFlNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFlOCA8W14+XSo+IG5vcAotMCswMWVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotMCswMWYwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFmMDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMWY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWY4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZmMgPFtePl0qPiBub3AKLTArMDIwMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLTArMDIwNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjIwNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDIwOCA8W14+XSo+IG5vcAotMCswMjBjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWyAJXSoyMGM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDIxMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjIxMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDIxNCA8W14+XSo+IG5vcAotMCswMjE4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMTc2OAotWyAJXSoyMTg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDIxYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjIxYzogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAyMjAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDIyNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIyNDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDIyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDIyYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyMmM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMjM0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMjM0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMjNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLTArMDI0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDI0NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyNDQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyNGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoyNGM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDI1NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi0wKzAyNTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyNWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjVjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjYwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMjY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMjY0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjY4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAyNmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotMCswMjcwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMjc0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI3NDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjc4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMjdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMjdjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyODAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDI4NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi0wKzAyODggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyOGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyOGM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyOTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDI5NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjI5NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjk4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMjljIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjljOiBSX01JUFNfR09UMTYJLmJzcwotMCswMmEwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAyYTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAotWyAJXSoyYTQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDJhOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDJhYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjJhYzogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAyYjAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDJiNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qMmI0OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMmI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMmJjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjJiYzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyYzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyYzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoyYzQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmM4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAyY2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi0wKzAyZDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyZDQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMmQ0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMmRjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMmRjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmUwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAyZTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi0wKzAyZTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyZWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMmVjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmYwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMmY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMmY0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmY4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAyZmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi0wKzAzMDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAzMDQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMzA0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAzMGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSozMGM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMxMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMzE0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotMCswMzE4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMzFjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMzFjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMzIwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAzMjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bIAldKjMyNDogUl9NSVBTX0xPMTYJLmJzcwotMCswMzI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMzJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMzJjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMzMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAzMzQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIyMTMxCi1bIAldKjMzNDogUl9NSVBTX0xPMTYJLmJzcwotMCswMzM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMzNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMzNjOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDM0MCA8W14+XSo+IG5vcAotMCswMzQ0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMzQ0OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMzQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzRjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjM0YzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAzNTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSozNTQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzU4IDxbXj5dKj4gbm9wCi0wKzAzNWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNjAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMzYwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMzY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMzY4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzZjIDxbXj5dKj4gbm9wCi0wKzAzNzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNzQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMzc0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzc4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMzdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMzdjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzgwIDxbXj5dKj4gbm9wCi0wKzAzODQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzODggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMzg4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzOGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAzOTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSozOTA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM5NCA8W14+XSo+IG5vcAotMCswMzk4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzljIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMzljOiBSX01JUFNfR09UMTYJLmJzcwotMCswM2EwIDxbXj5dKj4gbm9wCi0wKzAzYTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSozYTQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDNhOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDNhYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjNhYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDNiMCA8W14+XSo+IG5vcAotMCswM2I0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qM2I0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAzYjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzYmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozYmM6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswM2MwIDxbXj5dKj4gbm9wCi0wKzAzYzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWyAJXSozYzQ6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAzYzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzY2MgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qM2NjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNkMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDNkNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjNkNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZDggPFtePl0qPiBub3AKLTArMDNkYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzAzZTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzZTQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qM2U0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2U4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswM2VjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qM2VjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2YwIDxbXj5dKj4gbm9wCi0wKzAzZjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotMCswM2Y4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswM2ZjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjNmYzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQwMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDQwNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjQwNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQwOCA8W14+XSo+IG5vcAotMCswNDBjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDQxMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDQxNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo0MTQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQxOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDQxYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjQxYzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDIwIDxbXj5dKj4gbm9wCi0wKzA0MjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotMCswNDI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNDJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNDJjOiBSX01JUFNfR09UMTYJLmJzcwotMCswNDMwIDxbXj5dKj4gbm9wCi0wKzA0MzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWyAJXSo0MzQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDQzOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDQzYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjQzYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDQ0MCA8W14+XSo+IG5vcAotMCswNDQ0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDEKLVsgCV0qNDQ0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzA0NDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0NGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0NGM6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswNDUwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA0NTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bIAldKjQ1NDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDQ1OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDQ1YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDQ2MCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo0NjA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNDY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNDY4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ2YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNDcwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotMCswNDc0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNDc4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNDdjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjQ3YzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ4MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDQ4NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjQ4NDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ4OCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNDhjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotMCswNDkwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNDk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNDk4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjQ5ODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ5YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDRhMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjRhMDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDRhNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNGE4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotMCswNGFjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNGIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNGI0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjRiNDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNGI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNGJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNGJjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDRjNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLTArMDRjOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDRjYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDRkMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjRkMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDRkNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNGQ4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSo0ZDg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDRkYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDRlMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDRlNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjRlNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDRlOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNGVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMTc2OAotWyAJXSo0ZWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDRmMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDRmNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDRmOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjRmODogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzA0ZmMgPFtePl0qPiBub3AKLTArMDUwMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qNTAwOiBSX01JUFNfTE8xNgkuZGF0YQotMCswNTA0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNTA4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjUwODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA1MGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA1MTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo1MTA6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNTE0IDxbXj5dKj4gbm9wCi0wKzA1MTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci0wKzA1MWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1MjAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNTIwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNTI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNTI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNTI4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNTJjIDxbXj5dKj4gbm9wCi0wKzA1MzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci0wKzA1MzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1MzggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNTM4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNTNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNTQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNTQwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNTQ0IDxbXj5dKj4gbm9wCi0wKzA1NDggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci0wKzA1NGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1NTAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNTUwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA1NTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo1NTg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU1YyA8W14+XSo+IG5vcAotMCswNTYwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotMCswNTY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNTY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNTY4OiBSX01JUFNfR09UMTYJLmJzcwotMCswNTZjIDxbXj5dKj4gbm9wCi0wKzA1NzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bIAldKjU3MDogUl9NSVBTX0xPMTYJLmJzcwotMCswNTc0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNTc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNTc4OiBSX01JUFNfR09UMTYJLmJzcwotMCswNTdjIDxbXj5dKj4gbm9wCi0wKzA1ODAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMxNzY4Ci1bIAldKjU4MDogUl9NSVBTX0xPMTYJLmJzcwotMCswNTg0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNTg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNTg4OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDU4YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTkwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qNTkwOiBSX01JUFNfTE8xNgkuZGF0YQotMCswNTk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNTk4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNTljIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjU5YzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA1YTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA1YTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo1YTQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNWE4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1YWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotMCswNWIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNWI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNWI4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjViODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDViYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDVjMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjVjMDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDVjNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNWM4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLTArMDVjYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDVkMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDVkNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo1ZDQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1ZDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA1ZGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo1ZGM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1ZTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDVlNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi0wKzA1ZTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA1ZWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1ZjAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNWYwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1ZjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA1ZjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo1Zjg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDVmYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNjAwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLTArMDYwNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDYwOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDYwYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjYwYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDYxMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNjE0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qNjE0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzA2MTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA2MWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA2MjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo2MjA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzA2MjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDYyOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxMDAwCi1bIAldKjYyODogUl9NSVBTX0xPMTYJLmJzcwotMCswNjJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNjMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNjM0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNjM0OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDYzOCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswNjNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWyAJXSo2M2M6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzA2NDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA2NDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA2NDggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNjQ4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDY0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDY1MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjY1MDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA2NTQgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDY1OCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLTArMDY1YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDY2MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDY2NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo2NjQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA2NjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA2NmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo2NmM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA2NzAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDY3NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLTArMDY3OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDY3YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDY4MCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo2ODA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA2ODQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA2ODggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo2ODg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA2OGMgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDY5MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLTArMDY5NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDY5OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDY5YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo2OWM6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDZhMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDZhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjZhNDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNmE4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzA2YWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi0wKzA2YjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA2YjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA2YjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo2Yjg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzA2YmMgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDZjMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qNmMwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzA2YzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA2YzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA2Y2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo2Y2M6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzA2ZDAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDZkNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjIxMzEKLVsgCV0qNmQ0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzA2ZDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA2ZGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZWFhMWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS5kCisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYQotI2FzOiAtbWlwczEKLQotIyBUZXN0IHRoZSBsYSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGkJXCRhMCwwCi0wKzAwMDQgPFtePl0qPiBsaQlcJGEwLDEKLTArMDAwOCA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi0wKzAwMGMgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotMCswMDEwIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci0wKzAwMWMgPFtePl0qPiBsaQlcJGEwLDAKLTArMDAyMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAyNCA8W14+XSo+IGxpCVwkYTAsMQotMCswMDI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDJjIDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLTArMDAzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAzNCA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci0wKzAwMzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwM2MgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA0NCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDQ4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLTArMDA0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA1MCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSo1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA1YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSo2MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDY4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qNjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDZjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qNmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNzAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwNzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSo3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDA3OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCi1bIAldKjc4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA3YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwODAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSo4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwODQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qODQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA4OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKwotWyAJXSo4YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qOTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDk0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDk4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKLVsgCV0qOTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwYTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSphMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBhNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCi1bIAldKmE0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBhOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBhYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBiMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGI4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGJjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGMwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qYzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGM0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGM4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwY2MgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBkMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMGQ0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwZDggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZTAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGU0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGU4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSplYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGYwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKmY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpmODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTA0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMTA0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTA4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjEwODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjEwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDExMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTE0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMTE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDExOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjExODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTIwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjEyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEzNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjEzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMzggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxM2MgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxNDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNDggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTRjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMTRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE1MCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTU4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2MCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTY4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE2YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxNzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxN2MgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxODAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTg0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMTg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE4OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMThjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMThjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE5MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE5NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxOTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjE5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTljIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWEwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qMWEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFhOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWFjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFiNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKjFiNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFiOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFiYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxYzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxYzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYzggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKwotWyAJXSoxYzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMWNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWQwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFkMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMWQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWRjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWUwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMWUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZTggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKwotWyAJXSoxZTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWYwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFmMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWZjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKLVsgCV0qMWZjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjAwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjA0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjIwNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDIwOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjIwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDIwYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIxMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCi1bIAldKjIxMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMTggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjFjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMjFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIyMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIyNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjIyNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjI4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMjI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMzAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyMzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMjM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIzYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjIzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoyNDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjQ4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjRjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMjRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjU0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjU0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjU4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMjU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjYwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI2NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjI2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNmMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI3MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjI3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNzggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyN2MgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoyN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI4NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyODQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjg4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMjg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI5MCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyOTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjk0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMjk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI5OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI5YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoyYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyYTggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMmE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmFjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmI0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjJiNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYjggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoyYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMmJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmMwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMmMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDJjNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjJjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyYzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyY2MgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJkMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjJkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmQ4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMmQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJkYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjJkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyZTQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyZTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmU4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMmU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJlYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJmMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjJmMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJmNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjJmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJmOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJmYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjJmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDMwMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjMwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDMwNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDMwOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjMwODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSozMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzEwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzE0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDMxOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjMxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMjAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozMjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMyNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjMyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzJjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMzMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjMzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMzggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzNjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMzNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM0NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjM0NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM0OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjM0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM1MCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjM1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDM1NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjM1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDM1OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM1YyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjM1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzNjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSozNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzhjODExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEucworKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGEgbWFjcm8uCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCWxhCSQ0LDAKLQlsYQkkNCwxCi0JbGEJJDQsMHg4MDAwCi0JbGEJJDQsLTB4ODAwMAotCWxhCSQ0LDB4MTAwMDAKLQlsYQkkNCwweDFhNWE1Ci0JbGEJJDQsMCgkNSkKLQlsYQkkNCwxKCQ1KQotCWxhCSQ0LDB4ODAwMCgkNSkKLQlsYQkkNCwtMHg4MDAwKCQ1KQotCWxhCSQ0LDB4MTAwMDAoJDUpCi0JbGEJJDQsMHgxYTVhNSgkNSkKLQlsYQkkNCxkYXRhX2xhYmVsCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24KLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQlsYQkkNCxkYXRhX2xhYmVsKzEKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCWxhCSQ0LGRhdGFfbGFiZWwrMHg4MDAwCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAKLQlsYQkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0JbGEJJDQsZGF0YV9sYWJlbCsweDEwMDAwCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQlsYQkkNCxkYXRhX2xhYmVsKzB4MWE1YTUKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNQotCWxhCSQ0LGRhdGFfbGFiZWwoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKCQ1KQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbigkNSkKLQlsYQkkNCxkYXRhX2xhYmVsKzEoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMSgkNSkKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMSgkNSkKLQlsYQkkNCxkYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwKCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwKCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGEJJDQsZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGEJJDQsZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0KLQkuaWZuZGVmCUtQSUMKLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0JLmVuZGlmCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLWVtcGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLWVtcGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MjRhMzIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1lbXBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYi1lbXBpYwotI2FzOiAtbWlwczEgLW1lbWJlZGRlZC1waWMKLSNzb3VyY2U6IGxiLXBpYy5zCi0KLSMgVGVzdCB0aGUgbGIgbWFjcm8gd2l0aCAtbWVtYmVkZGVkLXBpYy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGIJXCRhMCwwXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gbGIJXCRhMCwxXChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMGMgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMTAgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDAxYyA8W14+XSo+IGx1aQlcJGEwLDB4MgotMCswMDIwIDxbXj5dKj4gbGIJXCRhMCwtMjMxMzFcKFwkYTBcKQotMCswMDI0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGExXCkKLTArMDAyOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMVwpCi0wKzAwMmMgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAzNCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAzOCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDAzYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDQ0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA0OCA8W14+XSo+IGx1aQlcJGEwLDB4MgotMCswMDRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDUwIDxbXj5dKj4gbGIJXCRhMCwtMjMxMzFcKFwkYTBcKQotMCswMDU0IDxbXj5dKj4gbGIJXCRhMCwtMTYzODRcKFwkZ3BcKQotWyAJXSo1NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMDU4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKLVsgCV0qNTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA1YyA8W14+XSo+IGxiCVwkYTAsMFwoXCRncFwpCi1bIAldKjVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRncFwpCi1bIAldKjYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA2NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRncFwpCi1bIAldKjY0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDY4IDxbXj5dKj4gbGIJXCRhMCwtMTYzODRcKFwkZ3BcKQotWyAJXSo2ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwNmMgPFtePl0qPiBsYglcJGEwLC0xNTM4NFwoXCRncFwpCi1bIAldKjZjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA3MCA8W14+XSo+IGxiCVwkYTAsLTE2MzgzXChcJGdwXCkKLVsgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDA3NCA8W14+XSo+IGxiCVwkYTAsMVwoXCRncFwpCi1bIAldKjc0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzggPFtePl0qPiBsYglcJGEwLDFcKFwkZ3BcKQotWyAJXSo3ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwN2MgPFtePl0qPiBsYglcJGEwLDFcKFwkZ3BcKQotWyAJXSo3YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODAgPFtePl0qPiBsYglcJGEwLDFcKFwkZ3BcKQotWyAJXSo4MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA4NCA8W14+XSo+IGxiCVwkYTAsLTE2MzgzXChcJGdwXCkKLVsgCV0qODQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDg4IDxbXj5dKj4gbGIJXCRhMCwtMTUzODNcKFwkZ3BcKQotWyAJXSo4ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwOGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwOTAgPFtePl0qPiBsYglcJGEwLC0xNjM4NFwoXCRhMFwpCi1bIAldKjkwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwOTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwOTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSo5ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDljIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGEwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qYTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGE4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGFjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGIwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qYjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwYjggPFtePl0qPiBsYglcJGEwLC0xNjM4NFwoXCRhMFwpCi1bIAldKmI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBiYyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBjMCA8W14+XSo+IGxiCVwkYTAsLTE1Mzg0XChcJGEwXCkKLVsgCV0qYzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGM4IDxbXj5dKj4gbGIJXCRhMCwtMTYzODNcKFwkYTBcKQotWyAJXSpjODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMGNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGQwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qZDA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBkOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi1bIAldKmQ4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkYyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBlMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi1bIAldKmUwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBlOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi1bIAldKmU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGYwIDxbXj5dKj4gbGIJXCRhMCwtMTYzODNcKFwkYTBcKQotWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwZjggPFtePl0qPiBsYglcJGEwLC0xNTM4M1woXCRhMFwpCi1bIAldKmY4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBmYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1waWMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItcGljLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyY2ZkZjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1waWMucworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBsYiBtYWNybyB3aXRoIFBJQyBjb2RlLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQlsYgkkNCwwCi0JbGIJJDQsMQotCWxiCSQ0LDB4ODAwMAotCWxiCSQ0LC0weDgwMDAKLQlsYgkkNCwweDEwMDAwCi0JbGIJJDQsMHgxYTVhNQotCWxiCSQ0LDAoJDUpCi0JbGIJJDQsMSgkNSkKLQlsYgkkNCwweDgwMDAoJDUpCi0JbGIJJDQsLTB4ODAwMCgkNSkKLQlsYgkkNCwweDEwMDAwKCQ1KQotCWxiCSQ0LDB4MWE1YTUoJDUpCi0JbGIJJDQsZGF0YV9sYWJlbAotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JbGIJJDQsZGF0YV9sYWJlbCsxCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQlsYgkkNCxkYXRhX2xhYmVsKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24oJDUpCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbigkNSkKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24oJDUpCi0JbGIJJDQsZGF0YV9sYWJlbCsxKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEoJDUpCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXN2cjRwaWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItc3ZyNHBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDg4NGQ2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItc3ZyNHBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYi1zdnI0cGljCi0jYXM6IC1taXBzMSAtS1BJQwotI3NvdXJjZTogbGItcGljLnMKLQotIyBUZXN0IHRoZSBsYiBtYWNybyB3aXRoIC1LUElDLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsYglcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsYglcJGEwLDFcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAwYyA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAxMCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDFjIDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwMjAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwMjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTFcKQotMCswMDI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGExXCkKLTArMDAyYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDM0IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDM4IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNTAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwNTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo1NDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwNTggPFtePl0qPiBub3AKLTArMDA1YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjVjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMDYwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA2NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjY0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2OCA8W14+XSo+IG5vcAotMCswMDZjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA3MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjcwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDc0IDxbXj5dKj4gbm9wCi0wKzAwNzggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qN2M6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODAgPFtePl0qPiBub3AKLTArMDA4NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwODggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo4ODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDhjIDxbXj5dKj4gbm9wCi0wKzAwOTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDk0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qOTQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwOTggPFtePl0qPiBub3AKLTArMDA5YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjljOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwYTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMGE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYTQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwYTggPFtePl0qPiBub3AKLTArMDBhYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKmFjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwYjAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMGI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYjQ6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMGI4IDxbXj5dKj4gbm9wCi0wKzAwYmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpiYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDBjMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwYzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpjNDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzggPFtePl0qPiBub3AKLTArMDBjYyA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwZDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpkMDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkNCA8W14+XSo+IG5vcAotMCswMGQ4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBkYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmRjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGUwIDxbXj5dKj4gbm9wCi0wKzAwZTQgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGU4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qZTg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBlYyA8W14+XSo+IG5vcAotMCswMGYwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBmNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmY0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMGY4IDxbXj5dKj4gbm9wCi0wKzAwZmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpmYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTAwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDEwNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjEwNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDEwOCA8W14+XSo+IG5vcAotMCswMTBjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qMTBjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMTAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTE0OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDExOCA8W14+XSo+IG5vcAotMCswMTFjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMTFjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMTIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTI0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDEyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjEyODogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBub3AKLTArMDEzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDEzNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxMzggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxMzg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxM2MgPFtePl0qPiBub3AKLTArMDE0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE0NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxNDggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxNDg6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNGMgPFtePl0qPiBub3AKLTArMDE1MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE1NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxNTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxNTg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1YyA8W14+XSo+IG5vcAotMCswMTYwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTY0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE2OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE2ODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE2YyA8W14+XSo+IG5vcAotMCswMTcwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMTcwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxNzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxNzggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTdjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMTgwIDxbXj5dKj4gbm9wCi0wKzAxODQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSoxODQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE4OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE4YyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxOTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxOTA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMTk0IDxbXj5dKj4gbm9wCi0wKzAxOTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxOTg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxOWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYTAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWE0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhOCA8W14+XSo+IG5vcAotMCswMWFjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWIwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDFiNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFiNDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFiOCA8W14+XSo+IG5vcAotMCswMWJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWMwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDFjNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFjNDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFjOCA8W14+XSo+IG5vcAotMCswMWNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWQwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDFkNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFkNDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWQ4IDxbXj5dKj4gbm9wCi0wKzAxZGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZTAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWU0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMWU4IDxbXj5dKj4gbm9wCi0wKzAxZWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxZWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFmMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFmNCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxZjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxZjg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxZmMgPFtePl0qPiBub3AKLTArMDIwMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKjIwMDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjA0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjA4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDIwYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi14Z290LWlsb2Nrcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi14Z290LWlsb2Nrcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDhiZDI0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIteGdvdC1pbG9ja3MuZAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGIteGdvdC1pbG9ja3MKLSNhczogLW1pcHMxIC1LUElDIC14Z290IC1tY3B1PXIzOTAwCi0jc291cmNlOiBsYi1waWMucwotCi0jIFRlc3QgdGhlIGxiIG1hY3JvIHdpdGggLUtQSUMgLXhnb3QuCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBcLnRleHQ6Ci0wKzAwMDAgPC4qPiBsYglcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPC4qPiBsYglcJGEwLDFcKFwkemVyb1wpCi0wKzAwMDggPC4qPiBsdWkJXCRhMCwweDEKLTArMDAwYyA8Lio+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAxMCA8Lio+IGxiCVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDE0IDwuKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDFjIDwuKj4gbHVpCVwkYTAsMHgyCi0wKzAwMjAgPC4qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwMjQgPC4qPiBsYglcJGEwLDBcKFwkYTFcKQotMCswMDI4IDwuKj4gbGIJXCRhMCwxXChcJGExXCkKLTArMDAyYyA8Lio+IGx1aQlcJGEwLDB4MQotMCswMDMwIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDM0IDwuKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDM4IDwuKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDNjIDwuKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDQ4IDwuKj4gbHVpCVwkYTAsMHgyCi0wKzAwNGMgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNTAgPC4qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwNTQgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJNTQ6IFJfTUlQU19HT1QxNglcLmRhdGEKLTArMDA1OCA8Lio+IG5vcAotMCswMDVjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDAKLQkJCTVjOiBSX01JUFNfTE8xNglcLmRhdGEKLTArMDA2MCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNjQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTY0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2OCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDA2YyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQk2YzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDc0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQk3NDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3OCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDA3YyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQk3YzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA4MCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwODQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTg0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDg4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDhjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCThjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDkwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA5NCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJOTQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA5OCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDA5YyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQk5YzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGEwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBhNCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCi0JCQlhNDogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAwYTggPC4qPiBub3AKLTArMDBhYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCi0JCQlhYzogUl9NSVBTX0xPMTYJXC5ic3MKLTArMDBiMCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYjQgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJYjQ6IFJfTUlQU19HT1QxNglcLmJzcwotMCswMGI4IDwuKj4gbm9wCi0wKzAwYmMgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotCQkJYmM6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAwYzAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMGM0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCWM0OiBSX01JUFNfR09UMTYJXC5kYXRhCi0wKzAwYzggPC4qPiBub3AKLTArMDBjYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCi0JCQljYzogUl9NSVBTX0xPMTYJXC5kYXRhCi0wKzAwZDAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGQ0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQlkNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwZGMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJZGM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGUwIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBlNCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJZTQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZTggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwZWMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJZWM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGY0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQlmNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmOCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDBmYyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQlmYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEwMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMDQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTEwNDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTA4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMTBjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTEwYzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTEwIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDExNCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCi0JCQkxMTQ6IFJfTUlQU19HT1QxNglcLmJzcwotMCswMTE4IDwuKj4gbm9wCi0wKzAxMWMgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAotCQkJMTFjOiBSX01JUFNfTE8xNglcLmJzcwotMCswMTIwIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDEyNCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCi0JCQkxMjQ6IFJfTUlQU19HT1QxNglcLmJzcwotMCswMTI4IDwuKj4gbm9wCi0wKzAxMmMgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotCQkJMTJjOiBSX01JUFNfTE8xNglcLmJzcwotMCswMTMwIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDEzNCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCi0JCQkxMzQ6IFJfTUlQU19HT1QxNglcLmRhdGEKLTArMDEzOCA8Lio+IG5vcAotMCswMTNjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDAKLQkJCTEzYzogUl9NSVBTX0xPMTYJXC5kYXRhCi0wKzAxNDAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxNDQgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTQ4IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQkxNDg6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTRjIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMTUwIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTE1MDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNTQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxNTggPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTVjIDwuKj4gbHVpCVwkYTAsMHgwCi0JCQkxNWM6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxNjQgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMTY0OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTY4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTZjIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE3MCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMTcwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTc0IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMTc4IDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTE3ODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE3YyA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE4MCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxODQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTE4NDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTg4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMThjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTE4YzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTkwIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTk0IDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE5OCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCi0JCQkxOTg6IFJfTUlQU19HT1QxNglcLmJzcwotMCswMTljIDwuKj4gbm9wCi0wKzAxYTAgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAotCQkJMWEwOiBSX01JUFNfTE8xNglcLmJzcwotMCswMWE0IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWE4IDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDFhYyA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCi0JCQkxYWM6IFJfTUlQU19HT1QxNglcLmJzcwotMCswMWIwIDwuKj4gbm9wCi0wKzAxYjQgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotCQkJMWI0OiBSX01JUFNfTE8xNglcLmJzcwotMCswMWI4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWJjIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDFjMCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCi0JCQkxYzA6IFJfTUlQU19HT1QxNglcLmRhdGEKLTArMDFjNCA8Lio+IG5vcAotMCswMWM4IDwuKj4gYWRkaXUJXCRhMCxcJGEwLDAKLQkJCTFjODogUl9NSVBTX0xPMTYJXC5kYXRhCi0wKzAxY2MgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZDAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWQ0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQkxZDQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWQ4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMWRjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTFkYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZTQgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWU4IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQkxZTg6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZWMgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxZjAgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMWYwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWY0IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWY4IDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDFmYyA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMWZjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjAwIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMjA0IDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTIwNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIwOCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIwYyA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyMTAgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTIxMDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjE0IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMjE4IDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTIxODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjFjIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjIwIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDIyNCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCi0JCQkyMjQ6IFJfTUlQU19HT1QxNglcLmJzcwotMCswMjI4IDwuKj4gbm9wCi0wKzAyMmMgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAotCQkJMjJjOiBSX01JUFNfTE8xNglcLmJzcwotMCswMjMwIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjM0IDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDIzOCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCi0JCQkyMzg6IFJfTUlQU19HT1QxNglcLmJzcwotMCswMjNjIDwuKj4gbm9wCi0wKzAyNDAgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotCQkJMjQwOiBSX01JUFNfTE8xNglcLmJzcwotMCswMjQ0IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjQ4IDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDI0YyA8Lio+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi14Z290LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXhnb3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4YzY3ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXhnb3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGIteGdvdAotI2FzOiAtbWlwczEgLUtQSUMgLXhnb3QgLW1jcHU9cjMwMDAKLSNzb3VyY2U6IGxiLXBpYy5zCi0KLSMgVGVzdCB0aGUgbGIgbWFjcm8gd2l0aCAtS1BJQyAteGdvdC4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGIJXCRhMCwwXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gbGIJXCRhMCwxXChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMGMgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMTAgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDAxYyA8W14+XSo+IGx1aQlcJGEwLDB4MgotMCswMDIwIDxbXj5dKj4gbGIJXCRhMCwtMjMxMzFcKFwkYTBcKQotMCswMDI0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGExXCkKLTArMDAyOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMVwpCi0wKzAwMmMgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAzNCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAzOCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDAzYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDQ0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA0OCA8W14+XSo+IGx1aQlcJGEwLDB4MgotMCswMDRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDUwIDxbXj5dKj4gbGIJXCRhMCwtMjMxMzFcKFwkYTBcKQotMCswMDU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNTQ6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMDU4IDxbXj5dKj4gbm9wCi0wKzAwNWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSo1YzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDA2MCA8W14+XSo+IG5vcAotMCswMDY0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA2OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo2ODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwNzAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo3MDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzQgPFtePl0qPiBub3AKLTArMDA3OCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwN2MgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qN2M6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwODAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwODQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo4NDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA4OCA8W14+XSo+IG5vcAotMCswMDhjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA5MCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo5MDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA5NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDA5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjk4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDljIDxbXj5dKj4gbm9wCi0wKzAwYTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMGE0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmE0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwYWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSphYzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGIwIDxbXj5dKj4gbm9wCi0wKzAwYjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMGI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYjg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwYmMgPFtePl0qPiBub3AKLTArMDBjMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKmMwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwYzQgPFtePl0qPiBub3AKLTArMDBjOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwY2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpjYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBkMCA8W14+XSo+IG5vcAotMCswMGQ0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qZDQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBkOCA8W14+XSo+IG5vcAotMCswMGRjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBlMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmUwOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDBlNCA8W14+XSo+IG5vcAotMCswMGU4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qZTg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwZWMgPFtePl0qPiBub3AKLTArMDBmMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwZjQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qZjQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMGZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qZmM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTAwIDxbXj5dKj4gbm9wCi0wKzAxMDQgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTA4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjEwODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEwYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDExMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjExMDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDExNCA8W14+XSo+IG5vcAotMCswMTE4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDExYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxMWM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxMjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoxMjQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMjggPFtePl0qPiBub3AKLTArMDEyYyA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMzAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTMwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxMzggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoxMzg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEzYyA8W14+XSo+IG5vcAotMCswMTQwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDE0NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE0NDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE0OCA8W14+XSo+IG5vcAotMCswMTRjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMTRjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxNTAgPFtePl0qPiBub3AKLTArMDE1NCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxNTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxNTg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxNWMgPFtePl0qPiBub3AKLTArMDE2MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKjE2MDogUl9NSVBTX0xPMTYJLmJzcwotMCswMTY0IDxbXj5dKj4gbm9wCi0wKzAxNjggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTZjOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDE3MCA8W14+XSo+IG5vcAotMCswMTc0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMTc0OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMTc4IDxbXj5dKj4gbm9wCi0wKzAxN2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxODAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTg0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjE4NDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxODggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxOGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoxOGM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTkwIDxbXj5dKj4gbm9wCi0wKzAxOTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxOTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTljIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjE5YzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDFhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjFhNDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhOCA8W14+XSo+IG5vcAotMCswMWFjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWIwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDFiNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxYjQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxYmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoxYmM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzAgPFtePl0qPiBub3AKLTArMDFjNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFjOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxY2MgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWNjOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxZDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoxZDQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFkOCA8W14+XSo+IG5vcAotMCswMWRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWUwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDFlNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFlNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFlOCA8W14+XSo+IG5vcAotMCswMWVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMWVjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxZjAgPFtePl0qPiBub3AKLTArMDFmNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFmOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxZmM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyMDAgPFtePl0qPiBub3AKLTArMDIwNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKjIwNDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjA4IDxbXj5dKj4gbm9wCi0wKzAyMGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMjE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjE0OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDIxOCA8W14+XSo+IG5vcAotMCswMjFjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMjFjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMjIwIDxbXj5dKj4gbm9wCi0wKzAyMjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMjggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjJjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjIyYzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyMzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoyMzQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM4IDxbXj5dKj4gbm9wCi0wKzAyM2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNDAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjQ0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI0NDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI0OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDI0YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjI0YzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI1MCA8W14+XSo+IG5vcAotMCswMjU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjU4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDI1YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyNWM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyNjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoyNjQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNjggPFtePl0qPiBub3AKLTArMDI2YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI3MCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyNzQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjc0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoyN2M6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI4MCA8W14+XSo+IG5vcAotMCswMjg0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjg4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDI4YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjI4YzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDI5MCA8W14+XSo+IG5vcAotMCswMjk0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMjk0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyOTggPFtePl0qPiBub3AKLTArMDI5YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJhMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyYTQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyYTggPFtePl0qPiBub3AKLTArMDJhYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKjJhYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMmIwIDxbXj5dKj4gbm9wCi0wKzAyYjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyYjggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMmJjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NWM0YzQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi5kCisrKyAvZGV2L251bGwKQEAgLTEsMzk1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYgotI2FzOiAtbWlwczEKLQotIyBUZXN0IHRoZSBsYiBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGIJXCRhMCwwXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gbGIJXCRhMCwxXChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMGMgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMTAgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDAxYyA8W14+XSo+IGx1aQlcJGEwLDB4MgotMCswMDIwIDxbXj5dKj4gbGIJXCRhMCwtMjMxMzFcKFwkYTBcKQotMCswMDI0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGExXCkKLTArMDAyOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMVwpCi0wKzAwMmMgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAzNCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAzOCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDAzYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDQ0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA0OCA8W14+XSo+IGx1aQlcJGEwLDB4MgotMCswMDRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDUwIDxbXj5dKj4gbGIJXCRhMCwtMjMxMzFcKFwkYTBcKQotMCswMDU0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjU0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA1OCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDVjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSo2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKLVsgCV0qNjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA2YyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA3MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRncFwpCi1bIAldKjcwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDc0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMDc4IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSo3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDA3YyA8W14+XSo+IGxiCVwkYTAsLTE2Mzg0XChcJGdwXCkKLVsgCV0qN2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDgwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjgwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA4NCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDg4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOGMgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotWyAJXSo4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDkwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGdwXCkKLVsgCV0qOTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDk0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjk0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA5OCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi1bIAldKjk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA5YyA8W14+XSo+IGxiCVwkYTAsMVwoXCRncFwpCi1bIAldKjljOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGEwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMGE0IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSphNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBhOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRncFwpCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBhYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBiMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBiNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYjggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGJjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGMwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGM4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGNjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZDAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSpkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBkNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMGQ4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwZGMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZTAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSplMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZTQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qZTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGU4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGVjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSpmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTA0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjEwNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEwOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjEwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEwYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxMGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMTAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxMTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMTQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDExOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjExODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMWMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTIwIDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSoxMjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTI0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMjggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoxMjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjEyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoxMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTM0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEzOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjEzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxM2MgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoxNDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxNDggPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjE0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE0YyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNTAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxNTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTU0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTU0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE1OCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjE1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNWMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2MCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjE2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTY0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2OCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjE2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNmMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTcwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTcwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE3NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE3NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE3OCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjE3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE3YyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE4MCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjE4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE4NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE4NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxODggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMThjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjE4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxOTQgPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjE5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoxYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDFhOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjFhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFiNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjFiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAxYmMgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoxYmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWM4IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSoxYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxY2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAxZDAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxZDA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMWQ0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFkNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZGMgPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZTAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZTggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlYyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDFmMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi1bIAldKjFmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZjQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFmOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFmYyA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjFmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAyMDQgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotWyAJXSoyMDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjA4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjBjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjEwIDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSoyMTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAyMTggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyMTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMjFjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDIyMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIyNCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjIyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMjggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIzMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjIzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIzYyA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNDAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyNDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjQ4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0YyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjI0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI1MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI1NCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjI1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI1OCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI2MCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjI2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI2NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjI2NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNmMgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjcwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNzggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjdjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjgwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjg0IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI5MCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjI5MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjk0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI5OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI5YyA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjI5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMmEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmE4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMmE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjJhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJiNCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjJiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMmJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmMwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMmMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDJjNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjJjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyYzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyY2MgPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjJjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZDAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyZDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJkNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJkOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjJkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmRjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMmRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJlNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjJlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZTggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyZTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmYwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMmYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJmNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjJmNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJmOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJmYyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjJmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMwMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjMwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDMwNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDMwOCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMzA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzBjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzBjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDMxMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDMxNCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjMxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMTggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMzFjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzIwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMzIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMyNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjMyNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzJjIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMzJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMzAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozMzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzM4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMzM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMzYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjMzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNDQgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzQ4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzUwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMzUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzU0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzU0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzU4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzVjIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMzVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzYwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDM2NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM2OCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjM2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzNmMgPFtePl0qPiBsYnUJXCRhMCwwXChcJHplcm9cKQotMCswMzcwIDxbXj5dKj4gbGgJXCRhMCwwXChcJHplcm9cKQotMCswMzc0IDxbXj5dKj4gbGh1CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM3YyA8W14+XSo+IGx3bAlcJGEwLDBcKFwkemVyb1wpCi0wKzAzODAgPFtePl0qPiBsd3IJXCRhMCwwXChcJHplcm9cKQotMCswMzg0IDxbXj5dKj4gbHdjMAlcJDQsMFwoXCR6ZXJvXCkKLTArMDM4OCA8W14+XSo+IGx3YzEJXCRmNCwwXChcJHplcm9cKQotMCswMzhjIDxbXj5dKj4gbHdjMglcJDQsMFwoXCR6ZXJvXCkKLTArMDM5MCA8W14+XSo+IGx3YzMJXCQ0LDBcKFwkemVyb1wpCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwM2NjYWYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBsYiBtYWNyby4KLQkKLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JbGIJJDQsMAotCWxiCSQ0LDEKLQlsYgkkNCwweDgwMDAKLQlsYgkkNCwtMHg4MDAwCi0JbGIJJDQsMHgxMDAwMAotCWxiCSQ0LDB4MWE1YTUKLQlsYgkkNCwwKCQ1KQotCWxiCSQ0LDEoJDUpCi0JbGIJJDQsMHg4MDAwKCQ1KQotCWxiCSQ0LC0weDgwMDAoJDUpCi0JbGIJJDQsMHgxMDAwMCgkNSkKLQlsYgkkNCwweDFhNWE1KCQ1KQotCWxiCSQ0LGRhdGFfbGFiZWwKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbgotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCWxiCSQ0LGRhdGFfbGFiZWwrMQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JbGIJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCWxiCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKLQlsYgkkNCxkYXRhX2xhYmVsKzB4MTAwMDAKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMAotCWxiCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JbGIJJDQsZGF0YV9sYWJlbCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24oJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24oJDUpCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKCQ1KQotCWxiCSQ0LGRhdGFfbGFiZWwrMSgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisxKCQ1KQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxKCQ1KQotCWxiCSQ0LGRhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCi0JbGIJJDQsZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsYgkkNCxkYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsYgkkNCxkYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQotIyBTZXZlcmFsIG1hY3JvcyBhcmUgaGFuZGxlZCBsaWtlIGxiLiAgU2FuaXR5IGNoZWNrIHRoZW0uCi0JbGJ1CSQ0LDAKLQlsaAkkNCwwCi0JbGh1CSQ0LDAKLQlsdwkkNCwwCi0JbHdsCSQ0LDAKLQlsd3IJJDQsMAotCWx3YzAJJDQsMAotCWx3YzEJJDQsMAotCWx3YzIJJDQsMAotCWx3YzMJJDQsMAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1lbXBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1lbXBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTk2MWY2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtZW1waWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGQtZW1waWMKLSNhczogLW1pcHMxIC1tZW1iZWRkZWQtcGljIC0tZGVmc3ltIEVNUElDPTEKLSNzb3VyY2U6IGxkLXBpYy5zCi0KLSMgVGVzdCB0aGUgbGQgbWFjcm8gd2l0aCAtbWVtYmVkZGVkLXBpYy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbHcJXCRhMCwwXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gbHcJXCRhMSw0XChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJHplcm9cKQotMCswMDBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJHplcm9cKQotMCswMDEwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwMTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDAyMCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJHplcm9cKQotMCswMDI0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDAzMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMDM0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotMCswMDM4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotMCswMDNjIDxbXj5dKj4gbm9wCi0wKzAwNDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTFcKQotMCswMDQ0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGExXCkKLTArMDA0OCA8W14+XSo+IG5vcAotMCswMDRjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGExXCkKLTArMDA1MCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhMVwpCi0wKzAwNTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA1YyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDA2MCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDA2NCA8W14+XSo+IG5vcAotMCswMDY4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDZjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYTFcKQotMCswMDcwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNzggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMDdjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDA4MCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMDg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDg4IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotMCswMDhjIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotMCswMDkwIDxbXj5dKj4gbHcJXCRhMCwtMTYzODRcKFwkZ3BcKQotWyAJXSo5MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMDk0IDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkZ3BcKQotWyAJXSo5NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMDk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qOTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKjljOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSphMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTQgPFtePl0qPiBsdwlcJGExLDRcKFwkZ3BcKQotWyAJXSphNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYWMgPFtePl0qPiBsdwlcJGExLDRcKFwkZ3BcKQotWyAJXSphYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpiMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBiNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmI0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGI4IDxbXj5dKj4gbHcJXCRhMCwtMTYzODRcKFwkZ3BcKQotWyAJXSpiODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYmMgPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRncFwpCi1bIAldKmJjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBjMCA8W14+XSo+IGx3CVwkYTAsLTE1Mzg0XChcJGdwXCkKLVsgCV0qYzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGM0IDxbXj5dKj4gbHcJXCRhMSwtMTUzODBcKFwkZ3BcKQotWyAJXSpjNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYzggPFtePl0qPiBsdwlcJGEwLC0xNjM4M1woXCRncFwpCi1bIAldKmM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwY2MgPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRncFwpCi1bIAldKmNjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwZDAgPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSpkMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKmQ4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmRjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKmUwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmU0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKmU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGVjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjAgPFtePl0qPiBsdwlcJGEwLC0xNjM4M1woXCRncFwpCi1bIAldKmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBmNCA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGdwXCkKLVsgCV0qZjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGY4IDxbXj5dKj4gbHcJXCRhMCwtMTUzODNcKFwkZ3BcKQotWyAJXSpmODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZmMgPFtePl0qPiBsdwlcJGExLC0xNTM3OVwoXCRncFwpCi1bIAldKmZjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDEwMCA8W14+XSo+IG5vcAotMCswMTA0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTA4IDxbXj5dKj4gbHcJXCRhMCwtMTYzODRcKFwkYXRcKQotWyAJXSoxMDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDEwYyA8W14+XSo+IGx3CVwkYTEsLTE2MzgwXChcJGF0XCkKLVsgCV0qMTBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAxMTAgPFtePl0qPiBub3AKLTArMDExNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDExOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjExODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTFjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMTFjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMjAgPFtePl0qPiBub3AKLTArMDEyNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDEyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjEyODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxMmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gbm9wCi0wKzAxMzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxMzggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxMzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTNjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMTNjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0MCA8W14+XSo+IG5vcAotMCswMTQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTQ4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTRjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMTRjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTUwIDxbXj5dKj4gbm9wCi0wKzAxNTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxNTggPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRhdFwpCi1bIAldKjE1ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNWMgPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRhdFwpCi1bIAldKjE1YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNjAgPFtePl0qPiBub3AKLTArMDE2NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDE2OCA8W14+XSo+IGx3CVwkYTAsLTE1Mzg0XChcJGF0XCkKLVsgCV0qMTY4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDE2YyA8W14+XSo+IGx3CVwkYTEsLTE1MzgwXChcJGF0XCkKLVsgCV0qMTZjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDE3MCA8W14+XSo+IG5vcAotMCswMTc0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTc4IDxbXj5dKj4gbHcJXCRhMCwtMTYzODNcKFwkYXRcKQotWyAJXSoxNzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDE3YyA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGF0XCkKLVsgCV0qMTdjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAxODAgPFtePl0qPiBub3AKLTArMDE4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDE4OCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjE4ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMThjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMThjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOTAgPFtePl0qPiBub3AKLTArMDE5NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDE5OCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjE5ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxOWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWEwIDxbXj5dKj4gbm9wCi0wKzAxYTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxYTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWFjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMWFjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiMCA8W14+XSo+IG5vcAotMCswMWI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMWI4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMWI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWJjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMWJjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWMwIDxbXj5dKj4gbm9wCi0wKzAxYzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxYzggPFtePl0qPiBsdwlcJGEwLC0xNjM4M1woXCRhdFwpCi1bIAldKjFjODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxY2MgPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRhdFwpCi1bIAldKjFjYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZDAgPFtePl0qPiBub3AKLTArMDFkNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDFkOCA8W14+XSo+IGx3CVwkYTAsLTE1MzgzXChcJGF0XCkKLVsgCV0qMWQ4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDFkYyA8W14+XSo+IGx3CVwkYTEsLTE1Mzc5XChcJGF0XCkKLVsgCV0qMWRjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtaWxvY2tzLWFkZHIzMi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1pbG9ja3MtYWRkcjMyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDZkNjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1pbG9ja3MtYWRkcjMyLmQKKysrIC9kZXYvbnVsbApAQCAtMSw2MzIgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNhczogLW1pcHMzIC1tY3B1PXI0MDAwCi0jbmFtZTogTUlQUyBsZC1pbG9ja3MKLSNzb3VyY2U6IGxkLnMKLQotIyBUZXN0IHRoZSBsZCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDwudGV4dD4gbHcJXCRhMCwwXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gbHcJXCRhMSw0XChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJHplcm9cKQotMCswMDBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJHplcm9cKQotMCswMDEwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwMTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDAyMCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJHplcm9cKQotMCswMDI0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDAzMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMDM0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotMCswMDM4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotMCswMDNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGExXCkKLTArMDA0MCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsdwlcJGEwLDFcKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGExXCkKLTArMDA0YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDU0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDU4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDVjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDYwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYTFcKQotMCswMDY0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMDcwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDA3NCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMDc4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDdjIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotMCswMDgwIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotMCswMDg0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjg0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA4YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA5MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDk0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5OCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo5YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTAgPFtePl0qPiBsdwlcJGExLDRcKFwkZ3BcKQotWyAJXSphMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGFjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGIwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjQgPFtePl0qPiBsdwlcJGExLDRcKFwkZ3BcKQotWyAJXSpiNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDBiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKmJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGMwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYzQgPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRncFwpCi1bIAldKmM0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBjOCA8W14+XSo+IGx3CVwkYTEsLTE2MzgwXChcJGdwXCkKLVsgCV0qYzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGNjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBkMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKmQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBkNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKmQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGRjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlMCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZTQgPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSplNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZTggPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSplODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGYwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qZjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGY0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGY4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZmMgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSpmYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEwMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxMDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDQgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxMDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDggPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMGMgPFtePl0qPiBsdwlcJGEwLC0xNjM4M1woXCRncFwpCi1bIAldKjEwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMTAgPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRncFwpCi1bIAldKjExMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDExOCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDExYyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjEyODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjEyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzAgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjEzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzQgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjEzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzggPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEzYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0MCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxNDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0YyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTUwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjE1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE1NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTU4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE2MCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE2NCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE2OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTZjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTcwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTc0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE3NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTc4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE3YyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxODAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTgwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTkwIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxOTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTk0IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE5YyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWEwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWE4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxYWMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjFhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFiMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMWI0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMWI4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMWJjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxYzAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMWM0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMWM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDFjOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFjYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWQwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMWQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWUwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWU4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMWU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFlYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjggPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjAwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjA0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjIwNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjBjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDIxMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjE0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyMTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjE4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjFjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIxYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjIwIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyMjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyNCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjggPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyYyA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzMCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzNCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyMzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjM4IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjNjIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjQwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjI0MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0NCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjQ4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNGMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjUwIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyNTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTQgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjI1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1OCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjVjIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjYwIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjY0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI2NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjcwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjcwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI3OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI3YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjgwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyODggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyODg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjhjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyOTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjk0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI5YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjI5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyYTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMmI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmI4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmJjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMmMwIDxbXj5dKj4gbHcJXCRhMCwtMTYzODRcKFwkYXRcKQotWyAJXSoyYzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMmM0IDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkYXRcKQotWyAJXSoyYzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMmM4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyY2MgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZDAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMmQ0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMmQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDJkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJkYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJlMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJlMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmU0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMmU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZTggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyZWMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyZWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmYwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJmNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmZjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDMwMCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjMwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAzMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSozMDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSozMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzE4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMzE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzFjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMzFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMzI0IDxbXj5dKj4gbHcJXCRhMCwtMTYzODNcKFwkYXRcKQotWyAJXSozMjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMzI4IDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkYXRcKQotWyAJXSozMjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMzJjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjMyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzMzQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjMzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMzggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjMzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzM2MgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNDQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzQ4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzU0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzU4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzcwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzc0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozNzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNzggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM3YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzODAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzODQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDM4OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzhjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzOTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzOTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzOTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzOWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzljOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDNhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNhNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2E0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDNhOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2E4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDNhYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNiMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNiNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2I0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzYjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2JjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzYzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzYzQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzYzggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzY2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2NjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDNkMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNkNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2Q0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDNkOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2Q4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDNkYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNlOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2U4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswM2VjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNlYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDNmMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNmNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2Y0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswM2Y4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozZjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzZmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2ZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDQwMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQwNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qNDA0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQwOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qNDA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQwYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0MGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswNDEwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQxOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0MWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0MjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQyOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQyODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDJjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0MzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDM4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQzYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0M2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDQ0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ0OCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQ0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDU4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQ1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDQ2MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ2NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDQ2OCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQ2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDQ2YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0NmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNDcwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDc0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDc0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQ3OCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQ3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0N2MgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNDdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDQ4MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ4NCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNDg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQ4OCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNDg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQ4YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0OGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ5MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ5NCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNDk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0OTggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjQ5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDljIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjQ5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0YTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0YTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjRhNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0YTggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0YWMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNGFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDRiMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRiNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDRiOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNGI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDRiYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0YmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0YzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjRjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRjOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNGM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNGNjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjRjYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDRkMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRkNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNGQ4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0ZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZGMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNGRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDRlMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRlNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDRlOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNGU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDRlYyA8W14+XSo+IGx3YzEJXCRmNSwwXChcJHplcm9cKQotMCswNGYwIDxbXj5dKj4gbHdjMQlcJGY0LDRcKFwkemVyb1wpCi0wKzA0ZjQgPFtePl0qPiBsd2MxCVwkZjUsMVwoXCR6ZXJvXCkKLTArMDRmOCA8W14+XSo+IGx3YzEJXCRmNCw1XChcJHplcm9cKQotMCswNGZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1MDAgPFtePl0qPiBsd2MxCVwkZjUsLTMyNzY4XChcJGF0XCkKLTArMDUwNCA8W14+XSo+IGx3YzEJXCRmNCwtMzI3NjRcKFwkYXRcKQotMCswNTA4IDxbXj5dKj4gbHdjMQlcJGY1LC0zMjc2OFwoXCR6ZXJvXCkKLTArMDUwYyA8W14+XSo+IGx3YzEJXCRmNCwtMzI3NjRcKFwkemVyb1wpCi0wKzA1MTAgPFtePl0qPiBsd2MxCVwkZjUsMFwoXCRhMVwpCi0wKzA1MTQgPFtePl0qPiBsd2MxCVwkZjQsNFwoXCRhMVwpCi0wKzA1MTggPFtePl0qPiBsd2MxCVwkZjUsMVwoXCRhMVwpCi0wKzA1MWMgPFtePl0qPiBsd2MxCVwkZjQsNVwoXCRhMVwpCi0wKzA1MjAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDUyNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDUyOCA8W14+XSo+IGx3YzEJXCRmNSwtMzI3NjhcKFwkYXRcKQotMCswNTJjIDxbXj5dKj4gbHdjMQlcJGY0LC0zMjc2NFwoXCRhdFwpCi0wKzA1MzAgPFtePl0qPiBsd2MxCVwkZjUsLTMyNzY4XChcJGExXCkKLTArMDUzNCA8W14+XSo+IGx3YzEJXCRmNCwtMzI3NjRcKFwkYTFcKQotMCswNTM4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjUzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDUzYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDU0MCA8W14+XSo+IGx3YzEJXCRmNSwtMjMxMzFcKFwkYXRcKQotWyAJXSo1NDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NDQgPFtePl0qPiBsd2MxCVwkZjQsLTIzMTI3XChcJGF0XCkKLVsgCV0qNTQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTQ4IDxbXj5dKj4gbm9wCi0wKzA1NGMgPFtePl0qPiBzd2MxCVwkZjUsMFwoXCR6ZXJvXCkKLTArMDU1MCA8W14+XSo+IHN3YzEJXCRmNCw0XChcJHplcm9cKQotMCswNTU0IDxbXj5dKj4gc3djMQlcJGY1LDFcKFwkemVyb1wpCi0wKzA1NTggPFtePl0qPiBzd2MxCVwkZjQsNVwoXCR6ZXJvXCkKLTArMDU1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTYwIDxbXj5dKj4gc3djMQlcJGY1LC0zMjc2OFwoXCRhdFwpCi0wKzA1NjQgPFtePl0qPiBzd2MxCVwkZjQsLTMyNzY0XChcJGF0XCkKLTArMDU2OCA8W14+XSo+IHN3YzEJXCRmNSwtMzI3NjhcKFwkemVyb1wpCi0wKzA1NmMgPFtePl0qPiBzd2MxCVwkZjQsLTMyNzY0XChcJHplcm9cKQotMCswNTcwIDxbXj5dKj4gc3djMQlcJGY1LDBcKFwkYTFcKQotMCswNTc0IDxbXj5dKj4gc3djMQlcJGY0LDRcKFwkYTFcKQotMCswNTc4IDxbXj5dKj4gc3djMQlcJGY1LDFcKFwkYTFcKQotMCswNTdjIDxbXj5dKj4gc3djMQlcJGY0LDVcKFwkYTFcKQotMCswNTgwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1ODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1ODggPFtePl0qPiBzd2MxCVwkZjUsLTMyNzY4XChcJGF0XCkKLTArMDU4YyA8W14+XSo+IHN3YzEJXCRmNCwtMzI3NjRcKFwkYXRcKQotMCswNTkwIDxbXj5dKj4gc3djMQlcJGY1LC0zMjc2OFwoXCRhMVwpCi0wKzA1OTQgPFtePl0qPiBzd2MxCVwkZjQsLTMyNzY0XChcJGExXCkKLTArMDU5OCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo1OTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNTljIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNWEwIDxbXj5dKj4gc3djMQlcJGY1LC0yMzEzMVwoXCRhdFwpCi1bIAldKjVhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1YTQgPFtePl0qPiBzd2MxCVwkZjQsLTIzMTI3XChcJGF0XCkKLVsgCV0qNWE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVhOCA8W14+XSo+IHN3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDVhYyA8W14+XSo+IHN3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDViMCA8W14+XSo+IGx1aQlcJGEwLDB4MgotWyAJXSo1YjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA1YjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1YjggPFtePl0qPiBsZAlcJGEwLC0yMzEzMVwoXCRhMFwpCi1bIAldKjViODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDViYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo1YmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNWMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswNWM0IDxbXj5dKj4gc2QJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo1YzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNWM4IDxbXj5dKj4gbm9wCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtaWxvY2tzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWlsb2Nrcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWIyYmRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtaWxvY2tzLmQKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBNSVBTIGxkLWlsb2NrcwotI3NvdXJjZTogbGQucwotI2FzOgotIyBUZXN0IHRoZSBsZCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDwudGV4dD4gbHcJXCRhMCwwXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gbHcJXCRhMSw0XChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJHplcm9cKQotMCswMDBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJHplcm9cKQotMCswMDEwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwMTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDAyMCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJHplcm9cKQotMCswMDI0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDAzMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMDM0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotMCswMDM4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotMCswMDNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGExXCkKLTArMDA0MCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsdwlcJGEwLDFcKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGExXCkKLTArMDA0YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDU0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDU4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDVjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDYwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYTFcKQotMCswMDY0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMDcwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDA3NCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMDc4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDdjIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotMCswMDgwIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotMCswMDg0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjg0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA4YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA5MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDk0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5OCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo5YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTAgPFtePl0qPiBsdwlcJGExLDRcKFwkZ3BcKQotWyAJXSphMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGFjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGIwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjQgPFtePl0qPiBsdwlcJGExLDRcKFwkZ3BcKQotWyAJXSpiNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDBiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKmJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGMwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYzQgPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRncFwpCi1bIAldKmM0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBjOCA8W14+XSo+IGx3CVwkYTEsLTE2MzgwXChcJGdwXCkKLVsgCV0qYzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGNjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBkMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKmQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBkNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKmQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGRjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlMCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZTQgPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSplNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZTggPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSplODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGYwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qZjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGY0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGY4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZmMgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSpmYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEwMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxMDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDQgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxMDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDggPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMGMgPFtePl0qPiBsdwlcJGEwLC0xNjM4M1woXCRncFwpCi1bIAldKjEwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMTAgPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRncFwpCi1bIAldKjExMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDExOCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDExYyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjEyODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjEyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzAgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjEzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzQgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjEzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzggPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEzYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0MCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxNDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0YyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTUwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjE1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE1NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTU4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE2MCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE2NCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE2OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTZjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTcwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTc0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE3NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTc4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE3YyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxODAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTgwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTkwIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxOTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTk0IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE5YyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWEwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWE4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxYWMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjFhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFiMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMWI0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMWI4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMWJjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxYzAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMWM0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMWM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDFjOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFjYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWQwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMWQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWUwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWU4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMWU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFlYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjggPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjAwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjA0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjIwNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjBjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDIxMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjE0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyMTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjE4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjFjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIxYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjIwIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyMjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyNCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjggPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyYyA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzMCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzNCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyMzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjM4IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjNjIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjQwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjI0MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0NCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjQ4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNGMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjUwIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyNTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTQgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjI1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1OCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjVjIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjYwIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjY0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI2NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjcwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjcwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI3OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI3YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjgwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyODggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyODg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjhjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyOTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjk0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI5YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjI5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyYTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMmI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmI4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmJjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMmMwIDxbXj5dKj4gbHcJXCRhMCwtMTYzODRcKFwkYXRcKQotWyAJXSoyYzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMmM0IDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkYXRcKQotWyAJXSoyYzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMmM4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyY2MgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZDAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMmQ0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMmQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDJkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJkYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJlMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJlMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmU0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMmU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZTggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyZWMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyZWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmYwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJmNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmZjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDMwMCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjMwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAzMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSozMDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSozMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzE4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMzE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzFjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMzFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMzI0IDxbXj5dKj4gbHcJXCRhMCwtMTYzODNcKFwkYXRcKQotWyAJXSozMjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMzI4IDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkYXRcKQotWyAJXSozMjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMzJjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjMyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzMzQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjMzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMzggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjMzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzM2MgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNDQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzQ4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzU0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzU4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzcwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzc0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozNzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNzggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM3YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzODAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzODQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDM4OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzhjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzOTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzOTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzOTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzOWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzljOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDNhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNhNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2E0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDNhOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2E4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDNhYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNiMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNiNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2I0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzYjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2JjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzYzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzYzQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzYzggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzY2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2NjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDNkMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNkNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2Q0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDNkOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2Q4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDNkYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNlOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2U4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswM2VjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNlYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDNmMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNmNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2Y0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswM2Y4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozZjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzZmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2ZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDQwMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQwNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qNDA0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQwOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qNDA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQwYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0MGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswNDEwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQxOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0MWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0MjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQyOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQyODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDJjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0MzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDM4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQzYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0M2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDQ0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ0OCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQ0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDU4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQ1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDQ2MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ2NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDQ2OCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQ2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDQ2YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0NmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNDcwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDc0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDc0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQ3OCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQ3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0N2MgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNDdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDQ4MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ4NCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNDg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQ4OCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNDg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQ4YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0OGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ5MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ5NCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNDk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0OTggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjQ5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDljIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjQ5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0YTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0YTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjRhNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0YTggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0YWMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNGFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDRiMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRiNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDRiOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNGI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDRiYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0YmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0YzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjRjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRjOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNGM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNGNjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjRjYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDRkMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRkNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNGQ4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0ZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZGMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNGRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDRlMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRlNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDRlOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNGU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDRlYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSwwXChcJHplcm9cKQotMCswNGYwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLDRcKFwkemVyb1wpCi0wKzA0ZjQgPFtePl0qPiBsd2MxCVwkZls0NV0sMVwoXCR6ZXJvXCkKLTArMDRmOCA8W14+XSo+IGx3YzEJXCRmWzQ1XSw1XChcJHplcm9cKQotMCswNGZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1MDAgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKLTArMDUwNCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQotMCswNTA4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDUwYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkemVyb1wpCi0wKzA1MTAgPFtePl0qPiBsd2MxCVwkZls0NV0sMFwoXCRhMVwpCi0wKzA1MTQgPFtePl0qPiBsd2MxCVwkZls0NV0sNFwoXCRhMVwpCi0wKzA1MTggPFtePl0qPiBsd2MxCVwkZls0NV0sMVwoXCRhMVwpCi0wKzA1MWMgPFtePl0qPiBsd2MxCVwkZls0NV0sNVwoXCRhMVwpCi0wKzA1MjAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDUyNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDUyOCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQotMCswNTJjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCi0wKzA1MzAgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJGExXCkKLTArMDUzNCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYTFcKQotMCswNTM4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjUzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDUzYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDU0MCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMjMxMzFcKFwkYXRcKQotWyAJXSo1NDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NDQgPFtePl0qPiBsd2MxCVwkZls0NV0sLTIzMTI3XChcJGF0XCkKLVsgCV0qNTQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTQ4IDxbXj5dKj4gbm9wCi0wKzA1NGMgPFtePl0qPiBzd2MxCVwkZls0NV0sMFwoXCR6ZXJvXCkKLTArMDU1MCA8W14+XSo+IHN3YzEJXCRmWzQ1XSw0XChcJHplcm9cKQotMCswNTU0IDxbXj5dKj4gc3djMQlcJGZbNDVdLDFcKFwkemVyb1wpCi0wKzA1NTggPFtePl0qPiBzd2MxCVwkZls0NV0sNVwoXCR6ZXJvXCkKLTArMDU1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTYwIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2OFwoXCRhdFwpCi0wKzA1NjQgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY0XChcJGF0XCkKLTArMDU2OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkemVyb1wpCi0wKzA1NmMgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY0XChcJHplcm9cKQotMCswNTcwIDxbXj5dKj4gc3djMQlcJGZbNDVdLDBcKFwkYTFcKQotMCswNTc0IDxbXj5dKj4gc3djMQlcJGZbNDVdLDRcKFwkYTFcKQotMCswNTc4IDxbXj5dKj4gc3djMQlcJGZbNDVdLDFcKFwkYTFcKQotMCswNTdjIDxbXj5dKj4gc3djMQlcJGZbNDVdLDVcKFwkYTFcKQotMCswNTgwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1ODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1ODggPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKLTArMDU4YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQotMCswNTkwIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2OFwoXCRhMVwpCi0wKzA1OTQgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY0XChcJGExXCkKLTArMDU5OCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo1OTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNTljIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNWEwIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0yMzEzMVwoXCRhdFwpCi1bIAldKjVhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1YTQgPFtePl0qPiBzd2MxCVwkZls0NV0sLTIzMTI3XChcJGF0XCkKLVsgCV0qNWE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVhOCA8W14+XSo+IHN3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDVhYyA8W14+XSo+IHN3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDViMCA8W14+XSo+IGx1aQlcJGEwLDB4MgotWyAJXSo1YjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA1YjQgPFtePl0qPiAoZHwpYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNWI4IDxbXj5dKj4gbGQJXCRhMCwtMjMxMzFcKFwkYTBcKQotWyAJXSo1Yjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA1YmMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDVjMCA8W14+XSo+IChkfClhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzA1YzQgPFtePl0qPiBzZAlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjVjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1YzggPFtePl0qPiBub3AKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1waWMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtcGljLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZjUyZGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1waWMucworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBsZCBtYWNybyB3aXRoIFBJQyBjb2RlLgotCQotCS5zZXQJbWlwczEKLQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQlsZAkkNCwwCi0JbGQJJDQsMQotCWxkCSQ0LDB4ODAwMAotCWxkCSQ0LC0weDgwMDAKLQlsZAkkNCwweDEwMDAwCi0JbGQJJDQsMHgxYTVhNQotCWxkCSQ0LDAoJDUpCi0JbGQJJDQsMSgkNSkKLQlsZAkkNCwweDgwMDAoJDUpCi0JbGQJJDQsLTB4ODAwMCgkNSkKLQlsZAkkNCwweDEwMDAwKCQ1KQotCWxkCSQ0LDB4MWE1YTUoJDUpCi0JbGQJJDQsZGF0YV9sYWJlbAotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JbGQJJDQsZGF0YV9sYWJlbCsxCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQlsZAkkNCxkYXRhX2xhYmVsKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24oJDUpCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbigkNSkKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24oJDUpCi0JbGQJJDQsZGF0YV9sYWJlbCsxKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEoJDUpCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0JLmlmbmRlZglFTVBJQwotCW5vcAotCW5vcAotCS5lbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1zdnI0cGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXN2cjRwaWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA0M2Q3OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXN2cjRwaWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGQtc3ZyNHBpYwotI2FzOiAtbWlwczEgLW1jcHU9cjMwMDAgLUtQSUMKLSNzb3VyY2U6IGxkLXBpYy5zCi0KLSMgVGVzdCB0aGUgbGQgbWFjcm8gd2l0aCAtS1BJQy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbHcJXCRhMCwwXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gbHcJXCRhMSw0XChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJHplcm9cKQotMCswMDBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJHplcm9cKQotMCswMDEwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwMTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDAyMCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJHplcm9cKQotMCswMDI0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDAzMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMDM0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotMCswMDM4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotMCswMDNjIDxbXj5dKj4gbm9wCi0wKzAwNDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTFcKQotMCswMDQ0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGExXCkKLTArMDA0OCA8W14+XSo+IG5vcAotMCswMDRjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGExXCkKLTArMDA1MCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhMVwpCi0wKzAwNTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA1YyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDA2MCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDA2NCA8W14+XSo+IG5vcAotMCswMDY4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDZjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYTFcKQotMCswMDcwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNzggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMDdjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDA4MCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMDg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDg4IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotMCswMDhjIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotMCswMDkwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qOTA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMDk0IDxbXj5dKj4gbm9wCi0wKzAwOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo5ODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDA5YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjljOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMGEwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qYTA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE0IDxbXj5dKj4gbm9wCi0wKzAwYTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMGFjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDBiMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmIwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGI0IDxbXj5dKj4gbm9wCi0wKzAwYjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMGJjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDBjMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmMwOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGM0IDxbXj5dKj4gbm9wCi0wKzAwYzggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMGNjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDBkMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmQwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZDQgPFtePl0qPiBub3AKLTArMDBkOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwZGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMGUwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qZTA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwZTQgPFtePl0qPiBub3AKLTArMDBlOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKmU4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwZWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSplYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMGYwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qZjA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwZjQgPFtePl0qPiBub3AKLTArMDBmOCA8W14+XSo+IGx3CVwkYTAsMTAwMFwoXCRhdFwpCi1bIAldKmY4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwZmMgPFtePl0qPiBsdwlcJGExLDEwMDRcKFwkYXRcKQotWyAJXSpmYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTAwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTAwOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDEwNCA8W14+XSo+IG5vcAotMCswMTA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMTA4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMTBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMTBjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMTEwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTEwOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDExNCA8W14+XSo+IG5vcAotMCswMTE4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDExYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAxMjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMjA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMjQgPFtePl0qPiBub3AKLTArMDEyOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAxMmMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMTMwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTMwOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTM0IDxbXj5dKj4gbm9wCi0wKzAxMzggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMTNjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDE0MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjE0MDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTQ0IDxbXj5dKj4gbm9wCi0wKzAxNDggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMTRjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDE1MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjE1MDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE1NCA8W14+XSo+IG5vcAotMCswMTU4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMTU4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxNWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxNWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE2MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjE2MDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE2NCA8W14+XSo+IG5vcAotMCswMTY4IDxbXj5dKj4gbHcJXCRhMCwxMDAxXChcJGF0XCkKLVsgCV0qMTY4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxNmMgPFtePl0qPiBsdwlcJGExLDEwMDVcKFwkYXRcKQotWyAJXSoxNmM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE3MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjE3MDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxNzQgPFtePl0qPiBub3AKLTArMDE3OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDE3YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjE3YzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDE4MCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjE4MDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDE4NCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjE4NDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxODggPFtePl0qPiBub3AKLTArMDE4YyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDE5MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAxOTQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMTk4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTk4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTljIDxbXj5dKj4gbm9wCi0wKzAxYTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMWE4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDFhYyA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFhYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiMCA8W14+XSo+IG5vcAotMCswMWI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMWI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDFiYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAxYzAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxYzA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFjNCA8W14+XSo+IG5vcAotMCswMWM4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMWNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDFkMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAxZDQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxZDQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxZDggPFtePl0qPiBub3AKLTArMDFkYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDFlMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFlMDogUl9NSVBTX0xPMTYJLmJzcwotMCswMWU0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMWU0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxZTggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxZTg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxZWMgPFtePl0qPiBub3AKLTArMDFmMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDFmNCA8W14+XSo+IGx3CVwkYTAsMTAwMFwoXCRhdFwpCi1bIAldKjFmNDogUl9NSVBTX0xPMTYJLmJzcwotMCswMWY4IDxbXj5dKj4gbHcJXCRhMSwxMDA0XChcJGF0XCkKLVsgCV0qMWY4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxZmMgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxZmM6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMjAwIDxbXj5dKj4gbm9wCi0wKzAyMDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyMDg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAyMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyMGM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAyMTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyMTA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjE0IDxbXj5dKj4gbm9wCi0wKzAyMTggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyMWMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMjIwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDIyNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjIyNDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyOCA8W14+XSo+IG5vcAotMCswMjJjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjMwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDIzNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyMzggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyMzg6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyM2MgPFtePl0qPiBub3AKLTArMDI0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI0NCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAyNDggPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMjRjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjRjOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNTAgPFtePl0qPiBub3AKLTArMDI1NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI1OCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAyNWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMjYwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjYwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMjY0IDxbXj5dKj4gbm9wCi0wKzAyNjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNmMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyNmM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI3MCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjI3MDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjc0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjc0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMjc4IDxbXj5dKj4gbm9wCi0wKzAyN2MgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyODAgPFtePl0qPiBsdwlcJGEwLDEwMDFcKFwkYXRcKQotWyAJXSoyODA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI4NCA8W14+XSo+IGx3CVwkYTEsMTAwNVwoXCRhdFwpCi1bIAldKjI4NDogUl9NSVBTX0xPMTYJLmJzcwotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC14Z290LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXhnb3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAyNjJjZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXhnb3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGQteGdvdAotI2FzOiAtbWlwczEgLW1jcHU9cjMwMDAgLUtQSUMgLXhnb3QKLSNzb3VyY2U6IGxkLXBpYy5zCi0KLSMgVGVzdCB0aGUgbGQgbWFjcm8gd2l0aCAtS1BJQyAteGdvdC4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbHcJXCRhMCwwXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gbHcJXCRhMSw0XChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJHplcm9cKQotMCswMDBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJHplcm9cKQotMCswMDEwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwMTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDAyMCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJHplcm9cKQotMCswMDI0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDAzMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMDM0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotMCswMDM4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotMCswMDNjIDxbXj5dKj4gbm9wCi0wKzAwNDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTFcKQotMCswMDQ0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGExXCkKLTArMDA0OCA8W14+XSo+IG5vcAotMCswMDRjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGExXCkKLTArMDA1MCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhMVwpCi0wKzAwNTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA1YyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDA2MCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDA2NCA8W14+XSo+IG5vcAotMCswMDY4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDZjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYTFcKQotMCswMDcwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNzggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMDdjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDA4MCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMDg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDg4IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotMCswMDhjIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotMCswMDkwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qOTA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMDk0IDxbXj5dKj4gbm9wCi0wKzAwOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo5ODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDA5YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjljOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMGEwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmEwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDBhOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKmE4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhYyA8W14+XSo+IG5vcAotMCswMGIwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDBiNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwYjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYjg6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYmMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAwYzAgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSpjMDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjNCA8W14+XSo+IG5vcAotMCswMGM4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDBjYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwZDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZDA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAwZDggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSpkODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBkYyA8W14+XSo+IG5vcAotMCswMGUwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDBlNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwZTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZTg6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBlYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDBmMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKmYwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjQgPFtePl0qPiBub3AKLTArMDBmOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwZmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMTAwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTAwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMTA0IDxbXj5dKj4gbm9wCi0wKzAxMDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxMDg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDEwYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjEwYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTEwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTEwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMTE0IDxbXj5dKj4gbm9wCi0wKzAxMTggPFtePl0qPiBsdwlcJGEwLDEwMDBcKFwkYXRcKQotWyAJXSoxMTg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDExYyA8W14+XSo+IGx3CVwkYTEsMTAwNFwoXCRhdFwpCi1bIAldKjExYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTIwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTIwOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDEyNCA8W14+XSo+IG5vcAotMCswMTI4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMTI4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMTJjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMTJjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMTMwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjEzMDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAxMzggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoxMzg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTNjIDxbXj5dKj4gbm9wCi0wKzAxNDAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMTQ0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDE0OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNDg6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAxNTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoxNTA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNTQgPFtePl0qPiBub3AKLTArMDE1OCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAxNWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMTYwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE2MDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE2NCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDE2OCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjE2ODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE2YyA8W14+XSo+IG5vcAotMCswMTcwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDE3NCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAxNzggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTc4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxN2MgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAxODAgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoxODA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE4NCA8W14+XSo+IG5vcAotMCswMTg4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDE4YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAxOTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxOTA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxOTQgPFtePl0qPiBub3AKLTArMDE5OCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjE5ODogUl9NSVBTX0xPMTYJLmJzcwotMCswMTljIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMTljOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxYTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxYTA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxYTQgPFtePl0qPiBub3AKLTArMDFhOCA8W14+XSo+IGx3CVwkYTAsMTAwMVwoXCRhdFwpCi1bIAldKjFhODogUl9NSVBTX0xPMTYJLmJzcwotMCswMWFjIDxbXj5dKj4gbHcJXCRhMSwxMDA1XChcJGF0XCkKLVsgCV0qMWFjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxYjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxYjA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMWI0IDxbXj5dKj4gbm9wCi0wKzAxYjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxYmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxYmM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxYzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxYzA6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxYzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWM0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFjOCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDFjYyA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjFjYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDAgPFtePl0qPiBub3AKLTArMDFkNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDFkOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAxZGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMWUwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFlMDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDFlOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjFlODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlYyA8W14+XSo+IG5vcAotMCswMWYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMWY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDFmOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAxZmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWZjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjAwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMjA0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMjA0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjA4IDxbXj5dKj4gbm9wCi0wKzAyMGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyMTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMjE0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDIxOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyMTg6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIxYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDIyMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjIyMDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjI0IDxbXj5dKj4gbm9wCi0wKzAyMjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyMmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMjMwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDIzNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjIzNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDIzOCA8W14+XSo+IG5vcAotMCswMjNjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjQwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyNDQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyNDQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI0OCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjI0ODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDI0YyA8W14+XSo+IG5vcAotMCswMjUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjU0IDxbXj5dKj4gbHcJXCRhMCwxMDAwXChcJGF0XCkKLVsgCV0qMjU0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyNTggPFtePl0qPiBsdwlcJGExLDEwMDRcKFwkYXRcKQotWyAJXSoyNTg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI1YyA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjI1YzogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAyNjAgPFtePl0qPiBub3AKLTArMDI2NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI2OCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjI2ODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDI2YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjI2YzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDI3MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyNzA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjc0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMjc4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMjc4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI3YyA8W14+XSo+IG5vcAotMCswMjgwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjg0IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDI4OCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyOGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjhjOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMjk0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMjk0OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjk4IDxbXj5dKj4gbm9wCi0wKzAyOWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyYTAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMmE0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDJhOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYTg6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAyYjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoyYjA6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYjQgPFtePl0qPiBub3AKLTArMDJiOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJiYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAyYzAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMmM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJjNDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmM4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMmNjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMmNjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZDAgPFtePl0qPiBub3AKLTArMDJkNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJkOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAyZGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMmUwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMmUwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMmU0IDxbXj5dKj4gbm9wCi0wKzAyZTggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZWMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyZWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDJmMCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjJmMDogUl9NSVBTX0xPMTYJLmJzcwotMCswMmY0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMmY0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMmY4IDxbXj5dKj4gbm9wCi0wKzAyZmMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzMDAgPFtePl0qPiBsdwlcJGEwLDEwMDFcKFwkYXRcKQotWyAJXSozMDA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDMwNCA8W14+XSo+IGx3CVwkYTEsMTAwNVwoXCRhdFwpCi1bIAldKjMwNDogUl9NSVBTX0xPMTYJLmJzcwotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDg5Y2YxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQuZAorKysgL2Rldi9udWxsCkBAIC0xLDYzOSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI2FzOiAtbWNwdT1yNDAwMAotI25hbWU6IE1JUFMgbGQKLQotIyBUZXN0IHRoZSBsZCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbHcJXCRhMCwwXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gbHcJXCRhMSw0XChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJHplcm9cKQotMCswMDBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJHplcm9cKQotMCswMDEwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwMTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDAyMCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJHplcm9cKQotMCswMDI0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDAzMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMDM0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotMCswMDM4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotMCswMDNjIDxbXj5dKj4gbm9wCi0wKzAwNDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTFcKQotMCswMDQ0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGExXCkKLTArMDA0OCA8W14+XSo+IG5vcAotMCswMDRjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGExXCkKLTArMDA1MCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhMVwpCi0wKzAwNTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA1YyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDA2MCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDA2NCA8W14+XSo+IG5vcAotMCswMDY4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDZjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYTFcKQotMCswMDcwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNzggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMDdjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDA4MCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMDg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDg4IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotMCswMDhjIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotMCswMDkwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA5NCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA5OCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA5YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGEwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhNCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKmE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkZ3BcKQotWyAJXSphYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGI4IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYzAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkZ3BcKQotWyAJXSpjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBjNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDBjOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGNjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwZDAgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkZ3BcKQotWyAJXSpkMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZDQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkZ3BcKQotWyAJXSpkNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGRjIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGUwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGU0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmU0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSplODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGVjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmY0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpmODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZmMgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSpmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTA0IDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qMTA0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTA4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qMTA4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTBjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjEwYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDExMCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjExMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDExNCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjExNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDExOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRncFwpCi1bIAldKjExODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkZ3BcKQotWyAJXSoxMWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTIwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDEyNCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjEyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxMjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTJjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzAgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzNCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjEzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzYyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjEzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNDAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxNDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTQ0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTU0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTU4IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTVjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTYwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTY0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE2YyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNzAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTc0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE3NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTdjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE4MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4NCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg4IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMThjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5MCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE5MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOTQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOWMgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWEwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFhNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWI0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWI4IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWJjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYzAgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMWM0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFjOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjFjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxY2MgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMWQwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDFkNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjFkNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjFlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWU4IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjFlYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWY0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFmOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjFmODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIwMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjIwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIwNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIwNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDIwOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDIwYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjIwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDIxMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMTQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyMTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjE4IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDIxYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIxYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMjAgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyMjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjI0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIyOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjJjIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIzNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjNjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI0MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI0MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjQ4IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI1MCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI1MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI1NCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjI1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1YyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI2MCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjI2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI2NCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI2NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyNjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjZjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI3MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyNzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjc0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjc4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjI3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyODAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjgwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyODggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjI4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gbm9wCi0wKzAyOTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyOTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjljIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjljOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJhMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMmE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjJhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYjAgPFtePl0qPiBub3AKLTArMDJiNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJiOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjJiODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJiYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjJiYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJjMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyYzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyYzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyY2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyZDAgPFtePl0qPiBub3AKLTArMDJkNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJkOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjJkODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyZGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyZGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMmUwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMmVjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDJmMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyZjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJmNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJmOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjJmODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmZjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMDAgPFtePl0qPiBub3AKLTArMDMwNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDMwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjMwODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSozMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzEwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjMxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzMTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDMyMCA8W14+XSo+IG5vcAotMCswMzI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMzI4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMzI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzJjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMzJjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzMwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjMzMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDMzNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDMzOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjMzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDMzYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjMzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDM0MCA8W14+XSo+IG5vcAotMCswMzQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMzQ4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzQ4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDM0YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjM0YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzNTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMzU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzU4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDM1YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjM1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzNjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM2NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM2OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjM2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzZjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNzAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozNzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzc0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzc4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM3YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjM3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzODAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzg4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM4YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjM4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzOTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozOTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzOTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzOTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzOWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzYTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozYTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzYTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzYTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzYWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzYjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozYjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswM2I0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2I4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2I4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDNiYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjNiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzYzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2MwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDNjNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNjOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjNjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzY2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswM2QwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNkMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2Q0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2Q4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2Q4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2U0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2U4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2U4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNlYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjNlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2YwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDNmNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNmOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjNmODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDAwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjQwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQwNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQwOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjQwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQwYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQxMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo0MTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0MTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0MTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0MWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0MWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0MjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNDIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDQyNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQyOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjQyODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0MmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDMwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDQzNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQzOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjQzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0M2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0M2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDQwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ0YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ1NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ1OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0NWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDYwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ2NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ2OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0NmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDcwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDc0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDdjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDgwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDgwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNDg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDg4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDhjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDkwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDQ5NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ5OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0OWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0OWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNGEwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNGEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDRhNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRhOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjRhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0YWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0YWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNGIwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNGIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0YjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0YjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0Yjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRiYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjRiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGMwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNGMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRjNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRjOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjRjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0Y2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0Y2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGQwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNGQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDRkNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRkOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjRkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ZGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0ZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNGUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNGU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGU4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNGVjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNGYwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNGYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNGY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGY4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNGZjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNTAwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDUwNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDUwOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjUwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1MGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo1MGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNTEwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLDBcKFwkemVyb1wpCi0wKzA1MTQgPFtePl0qPiBsd2MxCVwkZls0NV0sNFwoXCR6ZXJvXCkKLTArMDUxOCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwxXChcJHplcm9cKQotMCswNTFjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLDVcKFwkemVyb1wpCi0wKzA1MjAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDUyNCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQotMCswNTI4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCi0wKzA1MmMgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJHplcm9cKQotMCswNTMwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDUzNCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwwXChcJGExXCkKLTArMDUzOCA8W14+XSo+IGx3YzEJXCRmWzQ1XSw0XChcJGExXCkKLTArMDUzYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSwxXChcJGExXCkKLTArMDU0MCA8W14+XSo+IGx3YzEJXCRmWzQ1XSw1XChcJGExXCkKLTArMDU0NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTQ4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTRjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCRhdFwpCi0wKzA1NTAgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJGF0XCkKLTArMDU1NCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYTFcKQotMCswNTU4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCRhMVwpCi0wKzA1NWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1NWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1NjQgPFtePl0qPiBsd2MxCVwkZls0NV0sWy0wLTldK1woXCRhdFwpCi1bIAldKjU2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU2OCA8W14+XSo+IGx3YzEJXCRmWzQ1XSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNTY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTZjIDxbXj5dKj4gbm9wCi0wKzA1NzAgPFtePl0qPiBzd2MxCVwkZls0NV0sMFwoXCR6ZXJvXCkKLTArMDU3NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSw0XChcJHplcm9cKQotMCswNTc4IDxbXj5dKj4gc3djMQlcJGZbNDVdLDFcKFwkemVyb1wpCi0wKzA1N2MgPFtePl0qPiBzd2MxCVwkZls0NV0sNVwoXCR6ZXJvXCkKLTArMDU4MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTg0IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2OFwoXCRhdFwpCi0wKzA1ODggPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY0XChcJGF0XCkKLTArMDU4YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkemVyb1wpCi0wKzA1OTAgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY0XChcJHplcm9cKQotMCswNTk0IDxbXj5dKj4gc3djMQlcJGZbNDVdLDBcKFwkYTFcKQotMCswNTk4IDxbXj5dKj4gc3djMQlcJGZbNDVdLDRcKFwkYTFcKQotMCswNTljIDxbXj5dKj4gc3djMQlcJGZbNDVdLDFcKFwkYTFcKQotMCswNWEwIDxbXj5dKj4gc3djMQlcJGZbNDVdLDVcKFwkYTFcKQotMCswNWE0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1YTggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1YWMgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKLTArMDViMCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQotMCswNWI0IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2OFwoXCRhMVwpCi0wKzA1YjggPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY0XChcJGExXCkKLTArMDViYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjViYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1YzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1YzQgPFtePl0qPiBzd2MxCVwkZls0NV0sWy0wLTldK1woXCRhdFwpCi1bIAldKjVjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1YzggPFtePl0qPiBzd2MxCVwkZls0NV0sWy0wLTldK1woXCRhdFwpCi1bIAldKjVjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1Y2MgPFtePl0qPiBzdwlcJGEwLDBcKFwkemVyb1wpCi0wKzA1ZDAgPFtePl0qPiBzdwlcJGExLDRcKFwkemVyb1wpCi0wKzA1ZDQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSo1ZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA1ZDggPFtePl0qPiBkYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNWRjIDxbXj5dKj4gbGQJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qNWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNWUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNWUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDVlNCA8W14+XSo+IGRhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzA1ZTggPFtePl0qPiBzZAlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo1ZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNWVjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZWUzYzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBsZCBtYWNyby4KLQkKLQkuc2V0CW1pcHMxCi0KLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JbGQJJDQsMAotCWxkCSQ0LDEKLQlsZAkkNCwweDgwMDAKLQlsZAkkNCwtMHg4MDAwCi0JbGQJJDQsMHgxMDAwMAotCWxkCSQ0LDB4MWE1YTUKLQlsZAkkNCwwKCQ1KQotCWxkCSQ0LDEoJDUpCi0JbGQJJDQsMHg4MDAwKCQ1KQotCWxkCSQ0LC0weDgwMDAoJDUpCi0JbGQJJDQsMHgxMDAwMCgkNSkKLQlsZAkkNCwweDFhNWE1KCQ1KQotCWxkCSQ0LGRhdGFfbGFiZWwKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbgotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCWxkCSQ0LGRhdGFfbGFiZWwrMQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JbGQJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCWxkCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKLQlsZAkkNCxkYXRhX2xhYmVsKzB4MTAwMDAKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMAotCWxkCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JbGQJJDQsZGF0YV9sYWJlbCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24oJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24oJDUpCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKCQ1KQotCWxkCSQ0LGRhdGFfbGFiZWwrMSgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisxKCQ1KQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxKCQ1KQotCWxkCSQ0LGRhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCi0JbGQJJDQsZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsZAkkNCxkYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsZAkkNCxkYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQotIyBsLmQgYW5kIHMuZCBhcmUgc29ydCBvZiBsaWtlIGxkLgotCWwuZAkkZjQsMAotCWwuZAkkZjQsMQotCWwuZAkkZjQsMHg4MDAwCi0JbC5kCSRmNCwtMHg4MDAwCi0JbC5kCSRmNCwwKCQ1KQotCWwuZAkkZjQsMSgkNSkKLQlsLmQJJGY0LDB4ODAwMCgkNSkKLQlsLmQJJGY0LC0weDgwMDAoJDUpCi0JbC5kCSRmNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKLQkjIExpdHRsZSBlbmRpYW4gd2lsbCBpbnNlcnQgYSBub3AgaGVyZS4KLQkjIFdlIHB1dCBpdCBpbiBleHBsaWNpdGx5IHNvIHRoYXQgYmlnIGFuZCBsaXR0bGUgZW5kaWFuIGFyZSBzaW1pbGFyLgotCW5vcAotCXMuZAkkZjQsMAotCXMuZAkkZjQsMQotCXMuZAkkZjQsMHg4MDAwCi0Jcy5kCSRmNCwtMHg4MDAwCi0Jcy5kCSRmNCwwKCQ1KQotCXMuZAkkZjQsMSgkNSkKLQlzLmQJJGY0LDB4ODAwMCgkNSkKLQlzLmQJJGY0LC0weDgwMDAoJDUpCi0Jcy5kCSRmNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0KLSMgc2QgaXMgaGFuZGxlZCBsaWtlIGxkLiAgU2FuaXR5IGNoZWNrIGl0LgotCXNkCSQ0LDAKLQotIyBTYW5pdHkgY2hlY2sgdGhlIC1taXBzMyB2ZXJzaW9ucwotCS5zZXQJbWlwczMKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0Jc2QJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZTJiMjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGxpCi0KLSMgVGVzdCB0aGUgbGkgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxpCVwkYTAsMAotMCswMDA0IDxbXj5dKj4gbGkJXCRhMCwxCi0wKzAwMDggPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotMCswMDBjIDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKLTArMDAxMCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotMCswMDFjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljM2E2MDEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxpIG1hY3JvLgotCi1mb286Ci0JbGkJJDQsMAotCWxpCSQ0LDEKLQlsaQkkNCwweDgwMDAKLQlsaQkkNCwtMHg4MDAwCi0JbGkJJDQsMHgxMDAwMAotCWxpCSQ0LDB4MWE1YTUKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLWVtcGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZi1lbXBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODBkY2EzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLWVtcGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGlmbG9hdC1lbXBpYwotI2FzOiAtbWlwczEgLW1lbWJlZGRlZC1waWMgLS1kZWZzeW0gRU1QSUM9MQotI3NvdXJjZTogbGlmbG9hdC5zCi0KLSMgVGVzdCB0aGUgbGkuZCBhbmQgbGkucyBtYWNyb3Mgd2l0aCAtbWVtYmVkZGVkLXBpYy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLC0xNjM4NAotWyAJXSowOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5yZGF0YS4qCi0wKzAwMDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMDA4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDAwYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMTYzNjhcKFwkZ3BcKQotWyAJXSpjOiBbQS1aMC05X10qTElURVJBTFtBLVowLTlfXSoJLmxpdDguKgotMCswMDEwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0xNjM2NFwoXCRncFwpCi1bIAldKjEwOiBbQS1aMC05X10qTElURVJBTFtBLVowLTlfXSoJLmxpdDguKgotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgzZjhmCi0wKzAwMTggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4Y2QzNgotMCswMDFjIDxbXj5dKj4gbHVpCVwkYXQsMHgzZjhmCi0wKzAwMjAgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4Y2QzNgotMCswMDI0IDxbXj5dKj4gbXRjMQlcJGF0LFwkZjQKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLXN2cjRwaWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLXN2cjRwaWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwOWE3Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZi1zdnI0cGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGlmbG9hdC1zdnI0cGljCi0jYXM6IC1taXBzMSAtbWNwdT1yMzAwMCAtS1BJQyAtRUIgLS1kZWZzeW0gU1ZSND0xCi0jc291cmNlOiBsaWZsb2F0LnMKLQotIyBUZXN0IHRoZSBsaS5kIGFuZCBsaS5zIG1hY3JvcyB3aXRoIC1LUElDLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSowOiBSX01JUFNfR09UMTYJLnJvZGF0YQotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo4OiBSX01JUFNfTE8xNgkucm9kYXRhCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSpjOiBSX01JUFNfTE8xNgkucm9kYXRhCi0wKzAwMTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMDogUl9NSVBTX0dPVDE2CS5yb2RhdGEKLTArMDAxNCA8W14+XSo+IG5vcAotMCswMDE4IDxbXj5dKj4gbHdjMQlcJGY1LDhcKFwkYXRcKQotWyAJXSoxODogUl9NSVBTX0xPMTYJLnJvZGF0YQotMCswMDFjIDxbXj5dKj4gbHdjMQlcJGY0LDEyXChcJGF0XCkKLVsgCV0qMWM6IFJfTUlQU19MTzE2CS5yb2RhdGEKLTArMDAyMCA8W14+XSo+IGx1aQlcJGEwLDB4M2Y4ZgotMCswMDI0IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGNkMzYKLTArMDAyOCA8W14+XSo+IGx1aQlcJGF0LDB4M2Y4ZgotMCswMDJjIDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGNkMzYKLTArMDAzMCA8W14+XSo+IG10YzEJXCRhdCxcJGY0Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZi14Z290LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZi14Z290LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiODZlMmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYteGdvdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxpZmxvYXQteGdvdAotI2FzOiAtbWlwczEgLW1jcHU9cjMwMDAgLUtQSUMgLXhnb3QgLUVCIC0tZGVmc3ltIFhHT1Q9MQotI3NvdXJjZTogbGlmbG9hdC5zCi0KLSMgVGVzdCB0aGUgbGkuZCBhbmQgbGkucyBtYWNyb3Mgd2l0aCAtS1BJQyAteGdvdC4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMDogUl9NSVBTX0dPVDE2CS5yb2RhdGEKLTArMDAwNCA8W14+XSo+IG5vcAotMCswMDA4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qODogUl9NSVBTX0xPMTYJLnJvZGF0YQotMCswMDBjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qYzogUl9NSVBTX0xPMTYJLnJvZGF0YQotMCswMDEwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTA6IFJfTUlQU19HT1QxNgkucm9kYXRhCi0wKzAwMTQgPFtePl0qPiBub3AKLTArMDAxOCA8W14+XSo+IGx3YzEJXCRmNSw4XChcJGF0XCkKLVsgCV0qMTg6IFJfTUlQU19MTzE2CS5yb2RhdGEKLTArMDAxYyA8W14+XSo+IGx3YzEJXCRmNCwxMlwoXCRhdFwpCi1bIAldKjFjOiBSX01JUFNfTE8xNgkucm9kYXRhCi0wKzAwMjAgPFtePl0qPiBsdWkJXCRhMCwweDNmOGYKLTArMDAyNCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhjZDM2Ci0wKzAwMjggPFtePl0qPiBsdWkJXCRhdCwweDNmOGYKLTArMDAyYyA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhjZDM2Ci0wKzAwMzAgPFtePl0qPiBtdGMxCVwkYXQsXCRmNAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWZsb2F0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZmxvYXQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxYjU1NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZmxvYXQuZAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsaWZsb2F0Ci0jYXM6IC1taXBzMQotCi0jIFRlc3QgdGhlIGxpLmQgYW5kIGxpLnMgbWFjcm9zLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkucm8/ZGF0YS4qCi0wKzAwMDQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ybz9kYXRhLioKLTArMDAwOCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnJvP2RhdGEuKgotMCswMDBjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLFstMC05XStcKFwkZ3BcKQotWyAJXSpjOiBbQS1aMC05X10qTElURVJBTFtBLVowLTlfXSoJLmxpdDguKgotMCswMDEwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLFstMC05XStcKFwkZ3BcKQotWyAJXSoxMDogW0EtWjAtOV9dKkxJVEVSQUxbQS1aMC05X10qCS5saXQ4LioKLTArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4M2Y4ZgotMCswMDE4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGNkMzYKLTArMDAxYyA8W14+XSo+IGx3YzEJXCRmNCxbLTAtOV0rXChcJGdwXCkKLVsgCV0qMWM6IFtBLVowLTlfXSpMSVRFUkFMW0EtWjAtOV9dKgkubGl0NC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZmxvYXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmbG9hdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTc3ZjBlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmbG9hdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxpLmQgYW5kIGxpLnMgbWFjcm9zLgotCQotZm9vOgkKLQlsaS5kCSQ0LDEuMTIzNDUKLQlsaS5kCSRmNCwxLjEyMzQ1Ci0JCi0JbGkucwkkNCwxLjEyMzQ1Ci0JbGkucwkkZjQsMS4xMjM0NQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCS5pZmRlZglTVlI0Ci0Jbm9wCi0Jbm9wCi0Jbm9wCi0JLmVuZGlmCi0JLmlmZGVmCVhHT1QKLQlub3AKLQlub3AKLQlub3AKLQkuZW5kaWYKLQkuaWZkZWYJRU1QSUMKLQlub3AKLQlub3AKLQkuZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGluZW5vLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpbmVuby5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmE0MGY3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGluZW5vLmQKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0jb2JqZHVtcDogLWQgLWwgLW1taXBzOjQwMDAKLSNuYW1lOiBhc3NlbWJseSBsaW5lIG51bWJlcnMKLSNhczogLWcgLW1jcHU9cjQwMDAKLQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC50ZXh0OgotMCswMDAwIDxtYWluLTB4MTA+OgotLipbMC05YS1mXSs6LipkZWFkYmVlZi4qCi0uKlswLTlhLWZdKzouKmRlYWRiZWVmLioKLS4qWzAtOWEtZl0rOi4qZGVhZGJlZWYuKgotLipbMC05YS1mXSs6LipkZWFkYmVlZi4qCi0KLTArMDAxMCA8bWFpbj46Ci1tYWluXChcKToKLS4qbGluZW5vLnM6MTYKLS4qMTA6LiphZGRpdS4qCi0uKmxpbmVuby5zOjE3Ci0uKjE0Oi4qc2QuKgotLipsaW5lbm8uczoxOAotLioxODouKnNkLioKLS4qbGluZW5vLnM6MTkKLS4qMWM6Liptb3ZlLioKLS4qbGluZW5vLnM6MjAKLS4qMjA6LipqYWwuKgotLioyNDouKm5vcAotLipsaW5lbm8uczoyMQotLioyODouKmxpLioKLS4qbGluZW5vLnM6MjIKLS4qMmM6Lipzdy4qCi0uKmxpbmVuby5zOjIzCi0uKjMwOi4qbHcuKgotLipsaW5lbm8uczoyNAotLiozNDouKm1vdmUuKgotLipsaW5lbm8uczoyNQotLiozODouKnNsbC4qCi0uKmxpbmVuby5zOjI2Ci0uKjNjOi4qYWRkdS4qCi0uKmxpbmVuby5zOjI3Ci0uKjQwOi4qc3cuKgotLipsaW5lbm8uczoyOAotLio0NDouKmx3LioKLS4qbGluZW5vLnM6MjkKLS4qNDg6LipqYWwuKgotLio0YzouKm5vcAotLipsaW5lbm8uczozMAotLio1MDouKmx3LioKLS4qbGluZW5vLnM6MzEKLS4qNTQ6Liptb3ZlLioKLS4qbGluZW5vLnM6MzIKLS4qNTg6LipiLioKLS4qNWM6Lipub3AKLQotMDAwMDAwMDAwMDAwMDA2MCA8XCRMMT46Ci0uKmxpbmVuby5zOjM0Ci0uKjYwOi4qbW92ZS4qCi0uKmxpbmVuby5zOjM1Ci0uKjY0Oi4qbGQuKgotLipsaW5lbm8uczozNgotLio2ODouKmxkLioKLS4qbGluZW5vLnM6MzcKLS4qNmM6LiphZGRpdS4qCi0uKmxpbmVuby5zOjM4Ci0uKjcwOi4qanIuKgotLio3NDouKm5vcAotCi0wMDAwMDAwMDAwMDAwMDc4IDxnPjoKLWdcKFwpOgotLipsaW5lbm8uczo0NwotLio3ODouKmFkZGl1LioKLS4qbGluZW5vLnM6NDgKLS4qN2M6LipzZC4qCi0uKmxpbmVuby5zOjQ5Ci0uKjgwOi4qbW92ZS4qCi0uKmxpbmVuby5zOjUwCi0uKjg0Oi4qc3cuKgotLipsaW5lbm8uczo1MQotLio4ODouKmx3LioKLS4qbGluZW5vLnM6NTIKLS4qOGM6LiphZGRpdS4qCi0uKmxpbmVuby5zOjUzCi0uKjkwOi4qbW92ZS4qCi0uKmxpbmVuby5zOjU0Ci0uKjk0Oi4qYi4qCi0uKjk4Oi4qbm9wCi0KLTAwMDAwMDAwMDAwMDAwOWMgPFwkTDI+OgotLipsaW5lbm8uczo1NgotLio5YzouKm1vdmUuKgotLipsaW5lbm8uczo1NwotLiphMDouKmxkLioKLS4qbGluZW5vLnM6NTgKLS4qYTQ6LiphZGRpdS4qCi0uKmxpbmVuby5zOjU5Ci0uKmE4Oi4qanIuKgotLiphYzouKm5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saW5lbm8ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGluZW5vLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMWYzMzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saW5lbm8ucworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLQkudGV4dAotCi0jIHNvbWUgZGF0YQotCS53b3JkCTB4ZGVhZGJlZWYKLQkud29yZAkweGRlYWRiZWVmCi0JLndvcmQJMHhkZWFkYmVlZgotCS53b3JkCTB4ZGVhZGJlZWYKLQotIyBzb21lIHJlYWwgY29kZSwgY29tcGlsZWQgZnJvbSBhIHRveSBDIHByb2dyYW0KLQkgICAgICAgIC5nbG9ibCAgbWFpbgotICAgICAgICAuZW50ICAgIG1haW4KLW1haW46Ci0gICAgICAgIC5mcmFtZSAgJGZwLDMyLCQzMSAgICAgICAgICAgICAgIyB2YXJzPSAxNiwgcmVncz0gMi8wLCBhcmdzPSAwLCBleHRyYT0gMAotICAgICAgICAubWFzayAgIDB4YzAwMDAwMDAsLTgKLSAgICAgICAgLmZtYXNrICAweDAwMDAwMDAwLDAKLSAgICAgICAgc3VidSAgICAkc3AsJHNwLDMyCi0gICAgICAgIHNkICAgICAgJDMxLDI0KCRzcCkKLSAgICAgICAgc2QgICAgICAkZnAsMTYoJHNwKQotICAgICAgICBtb3ZlICAgICRmcCwkc3AKLSAgICAgICAgamFsICAgICBfX21haW4KLSAgICAgICAgbGkgICAgICAkMiwyICAgICAgICAgICAgICAgICAgICAjIDB4MgotICAgICAgICBzdyAgICAgICQyLDAoJGZwKQotICAgICAgICBsdyAgICAgICQyLDAoJGZwKQotICAgICAgICBtb3ZlICAgICQzLCQyCi0gICAgICAgIHNsbCAgICAgJDQsJDMsMQotICAgICAgICBhZGR1ICAgICQyLCQ0LCQyCi0gICAgICAgIHN3ICAgICAgJDIsNCgkZnApCi0gICAgICAgIGx3ICAgICAgJDQsNCgkZnApCi0gICAgICAgIGphbCAgICAgZwotICAgICAgICBsdyAgICAgICQzLDAoJGZwKQotICAgICAgICBtb3ZlICAgICQyLCQzCi0gICAgICAgIGIgICAgICAgJEwxCi0kTDE6Ci0gICAgICAgIG1vdmUgICAgJHNwLCRmcAotICAgICAgICBsZCAgICAgICQzMSwyNCgkc3ApCi0gICAgICAgIGxkICAgICAgJGZwLDE2KCRzcCkKLSAgICAgICAgYWRkdSAgICAkc3AsJHNwLDMyCi0gICAgICAgIGogICAgICAgJDMxCi0gICAgICAgIC5lbmQgICAgbWFpbgotICAgICAgICAuYWxpZ24gIDIKLSAgICAgICAgLmdsb2JsICBnCi0gICAgICAgIC5lbnQgICAgZwotZzoKLSAgICAgICAgLmZyYW1lICAkZnAsMzIsJDMxICAgICAgICAgICAgICAjIHZhcnM9IDE2LCByZWdzPSAxLzAsIGFyZ3M9IDAsIGV4dHJhPSAwCi0gICAgICAgIC5tYXNrICAgMHg0MDAwMDAwMCwtMTYKLSAgICAgICAgLmZtYXNrICAweDAwMDAwMDAwLDAKLSAgICAgICAgc3VidSAgICAkc3AsJHNwLDMyCi0gICAgICAgIHNkICAgICAgJGZwLDE2KCRzcCkKLSAgICAgICAgbW92ZSAgICAkZnAsJHNwCi0gICAgICAgIHN3ICAgICAgJDQsMCgkZnApCi0gICAgICAgIGx3ICAgICAgJDIsMCgkZnApCi0gICAgICAgIGFkZHUgICAgJDMsJDIsMQotICAgICAgICBtb3ZlICAgICQyLCQzCi0gICAgICAgIGIgICAgICAgJEwyCi0kTDI6Ci0gICAgICAgIG1vdmUgICAgJHNwLCRmcAotICAgICAgICBsZCAgICAgICRmcCwxNigkc3ApCi0gICAgICAgIGFkZHUgICAgJHNwLCRzcCwzMgotICAgICAgICBqICAgICAgICQzMQotICAgICAgICAuZW5kICAgIGcKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwcy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjUyNjlkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotIwotIyBTb21lIGdlbmVyaWMgTUlQUyB0ZXN0cwotIwotaWYgW2lzdGFyZ2V0IG1pcHMqLSotKl0gdGhlbiB7Ci0gICAgc2V0IG5vX21pcHMxNiAwCi0gICAgc2V0IHN2cjRwaWMgW2V4cHIgW2lzdGFyZ2V0ICotKi1lbGYqXSB8fCBbaXN0YXJnZXQgKi0qLWlyaXg1Kl0gfHwgW2lzdGFyZ2V0ICotKi1pcml4NiogXSBdCi0gICAgc2V0IGVtcGljIFtleHByIFtpc3RhcmdldCAqLSotZWNvZmYqXSB8fCBbaXN0YXJnZXQgKi0qLXVsdHJpeCpdIHx8IFtpc3RhcmdldCAqLSotaXJpeFxbMS00XF0qXSBdCi0gICAgc2V0IGFvdXQgW2V4cHIgW2lzdGFyZ2V0ICotKi1ic2QqXSB8fCBbaXN0YXJnZXQgKi0qLW5ldGJzZCpdIHx8IFtpc3RhcmdldCAqLSotb3BlbmJzZCpdXQotICAgIHNldCBpbG9ja3MgW2lzdGFyZ2V0IG1pcHN0eDM5Ki0qLSpdCi0gICAgc2V0IGdwcl9pbG9ja3MgW2V4cHIgW2lzdGFyZ2V0IG1pcHN0eDM5Ki0qLSpdXQotICAgIHNldCBhZGRyMzIgW2V4cHIgW2lzdGFyZ2V0IG1pcHN0eDM5Ki0qLSpdXQotCi0KLQotCi0KLSAgICBydW5fZHVtcF90ZXN0ICJhYnMiCi0gICAgcnVuX2R1bXBfdGVzdCAiYWRkIgotICAgIHJ1bl9kdW1wX3Rlc3QgImFuZCIKLSAgICBydW5fZHVtcF90ZXN0ICJicmVhazIwIgotICAgIHJ1bl9kdW1wX3Rlc3QgInRyYXAyMCIKLSAgICBydW5fZHVtcF90ZXN0ICJiZXEiCi0gICAgcnVuX2R1bXBfdGVzdCAiYmdlIgotICAgIHJ1bl9kdW1wX3Rlc3QgImJnZXUiCi0gICAgcnVuX2R1bXBfdGVzdCAiYmx0IgotICAgIHJ1bl9kdW1wX3Rlc3QgImJsdHUiCi0gICAgaWYgISRpbG9ja3MgeyBydW5fZHVtcF90ZXN0ICJkaXYiIH0gZWxzZSB7IHJ1bl9kdW1wX3Rlc3QgImRpdi1pbG9ja3MiIH0KLSAgICBydW5fZHVtcF90ZXN0ICJkbGkiCi0gICAgcnVuX2R1bXBfdGVzdCAiamFsIgotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAiamFsLXN2cjRwaWMiIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImphbC14Z290IiB9Ci0gICAgaWYgJGVtcGljIHsgcnVuX2R1bXBfdGVzdCAiamFsLWVtcGljIiB9Ci0gICAgaWYgISRhb3V0IHsgcnVuX2R1bXBfdGVzdCAibGEiIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxhLXN2cjRwaWMiIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxhLXhnb3QiIH0KLSAgICBpZiAkZW1waWMgeyBydW5fZHVtcF90ZXN0ICJsYS1lbXBpYyIgfQotICAgIGlmICEkYW91dCB7IHJ1bl9kdW1wX3Rlc3QgImxiIiB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJsYi1zdnI0cGljIiB9Ci0gICAgaWYgJHN2cjRwaWMgewotCSMgQm90aCB2ZXJzaW9ucyBzcGVjaWZ5IHRoZSBjcHUsIHNvIHdlIGNhbiBydW4gYm90aCByZWdhcmRsZXNzIG9mCi0JIyB0aGUgaW50ZXJsb2NraW5nIGluIHRoZSBjb25maWd1cmVkIGRlZmF1bHQgY3B1LgotCXJ1bl9kdW1wX3Rlc3QgImxiLXhnb3QiCi0JcnVuX2R1bXBfdGVzdCAibGIteGdvdC1pbG9ja3MiCi0gICAgfQotICAgIGlmICRlbXBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxiLWVtcGljIiB9Ci0gICAgaWYgISRhb3V0IHsgCi0gICAgICAgIGlmICEkZ3ByX2lsb2NrcyB7IAotICAgICAgICAgICAgcnVuX2R1bXBfdGVzdCAibGQiIAotICAgICAgICB9IGVsc2UgeyAKLSAgICAgICAgICAgIGlmICEkYWRkcjMyIHsKLSAgICAgICAgICAgICAgICBydW5fZHVtcF90ZXN0ICJsZC1pbG9ja3MiCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJ1bl9kdW1wX3Rlc3QgImxkLWlsb2Nrcy1hZGRyMzIiCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJsZC1zdnI0cGljIiB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJsZC14Z290IiB9Ci0gICAgaWYgJGVtcGljIHsgcnVuX2R1bXBfdGVzdCAibGQtZW1waWMiIH0KLSAgICBydW5fZHVtcF90ZXN0ICJsaSIKLSAgICBpZiAhJGFvdXQgeyBydW5fZHVtcF90ZXN0ICJsaWZsb2F0IiB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJsaWYtc3ZyNHBpYyIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAibGlmLXhnb3QiIH0KLSAgICBpZiAkZW1waWMgeyBydW5fZHVtcF90ZXN0ICJsaWYtZW1waWMiIH0KLSAgICBydW5fZHVtcF90ZXN0ICJtaXBzNCIKLSAgICBpZiAhJGlsb2NrcyB7IHJ1bl9kdW1wX3Rlc3QgIm11bCIgfSBlbHNlIHsgcnVuX2R1bXBfdGVzdCAibXVsLWlsb2NrcyIgfQotICAgIHJ1bl9kdW1wX3Rlc3QgInJvbCIKLSAgICBpZiAhJGFvdXQgeyBydW5fZHVtcF90ZXN0ICJzYiIgfQotICAgIHJ1bl9kdW1wX3Rlc3QgInRydW5jIgotICAgIGlmICEkYW91dCB7IHJ1bl9kdW1wX3Rlc3QgInVsaCIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAidWxoLXN2cjRwaWMiIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgInVsaC14Z290IiB9Ci0gICAgaWYgJGVtcGljIHsgcnVuX2R1bXBfdGVzdCAidWxoLWVtcGljIiB9Ci0gICAgaWYgISRhb3V0IHsKLQlydW5fZHVtcF90ZXN0ICJ1bHciCi0JcnVuX2R1bXBfdGVzdCAidWxkIgotCXJ1bl9kdW1wX3Rlc3QgInVzaCIKLQlydW5fZHVtcF90ZXN0ICJ1c3ciCi0JcnVuX2R1bXBfdGVzdCAidXNkIgotICAgIH0KLSAgICAjIFRoZSBtaXBzMTYgdGVzdCBjYW4gb25seSBiZSBydW4gb24gRUxGLCBiZWNhdXNlIG9ubHkgRUxGCi0gICAgIyBzdXBwb3J0cyB0aGUgbmVjZXNzYXJ5IG1pcHMxNiByZWxvYy4KLSAgICBpZiB7ICRzdnI0cGljICYmICEkbm9fbWlwczE2IH0geyBydW5fZHVtcF90ZXN0ICJtaXBzMTYiIH0KLSAgICBydW5fZHVtcF90ZXN0ICJkZWxheSIKLSAgICBydW5fZHVtcF90ZXN0ICJub2RlbGF5IgotICAgIHJ1bl9kdW1wX3Rlc3QgIm1pcHM0MDEwIgotICAgIHJ1bl9kdW1wX3Rlc3QgIm1pcHM0NjUwIgotICAgIHJ1bl9kdW1wX3Rlc3QgIm1pcHM0MTAwIgotICAgIHJ1bl9kdW1wX3Rlc3QgImxpbmVubyIKLSAgICBydW5fZHVtcF90ZXN0ICJzeW5jIgotCi0gICAgIyBNYWtlIHN1cmUgdGhhdCAtbWNwdT1GT08gYW5kIC1tRk9PIGFyZSBlcXVpdmFsZW50LiAgQXNzZW1ibGUgYSBmaWxlCi0gICAgIyBjb250YWluaW5nIDQ2NTAtc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHdpdGggLW00NjUwIGFuZCAtbWNwdT00NjUwLAotICAgICMgYW5kIHZlcmlmeSB0aGF0IHRoZXkncmUgdGhlIHNhbWUuICBTcGVjaWZpY2FsbHksIHdlJ3JlIGNoZWNraW5nCi0gICAgIyB0aGF0IHRoZSBFRl9NSVBTX01BQ0ggZmllbGQgaXMgc2V0LCBhbmQgdGhhdCB0aGUgNDY1MCAnbXVsJwotICAgICMgaW5zdHJ1Y3Rpb24gZG9lcyBnZXQgdXNlZC4gIEluIHByZXZpb3VzIHZlcnNpb25zIG9mIEdBUywgCi0gICAgIyBvbmx5IC1tY3B1PTQ2NTAgd291bGQgc2V0IHRoZSBFRl9NSVBTX01BQ0ggZmllbGQ7IC1tNDY1MCB3b3VsZG4ndC4KLSAgICBydW5fZHVtcF90ZXN0ICJlbGZfZV9mbGFnczEiCi0gICAgcnVuX2R1bXBfdGVzdCAiZWxmX2VfZmxhZ3MyIgotICAgIHJ1bl9kdW1wX3Rlc3QgImVsZl9lX2ZsYWdzMyIKLSAgICBydW5fZHVtcF90ZXN0ICJlbGZfZV9mbGFnczQiCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzMTYuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjMWEwYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi5kCisrKyAvZGV2L251bGwKQEAgLTEsNjgzICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLW1taXBzOjQwMDAKLSNhczogLW1pcHMzIC1tY3B1PXI0MDAwCi0jbmFtZTogbWlwczE2Ci0KLSMgVGVzdCB0aGUgbWlwczE2IGluc3RydWN0aW9uIHNldC4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAwMCA8ZGF0YTE+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+IHN3YzIJXCQ0LDBcKFwkemVyb1wpCi0wKzAzODggPFtePl0qPiBzd2MzCVwkNCwwXChcJHplcm9cKQotMCswMzhjIDxbXj5dKj4gc3djMQlcJGY0LDBcKFwkemVyb1wpCi0wKzAzOTAgPFtePl0qPiBzd2wJXCRhMCwwXChcJHplcm9cKQotMCswMzk0IDxbXj5dKj4gc3dyCVwkYTAsMFwoXCR6ZXJvXCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc2IucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc2IucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjNzM1NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3NiLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIHNiIG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQlzYgkkNCwwCi0Jc2IJJDQsMQotCXNiCSQ0LDB4ODAwMAotCXNiCSQ0LC0weDgwMDAKLQlzYgkkNCwweDEwMDAwCi0Jc2IJJDQsMHgxYTVhNQotCXNiCSQ0LDAoJDUpCi0Jc2IJJDQsMSgkNSkKLQlzYgkkNCwweDgwMDAoJDUpCi0Jc2IJJDQsLTB4ODAwMCgkNSkKLQlzYgkkNCwweDEwMDAwKCQ1KQotCXNiCSQ0LDB4MWE1YTUoJDUpCi0Jc2IJJDQsZGF0YV9sYWJlbAotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0Jc2IJJDQsZGF0YV9sYWJlbCsxCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQlzYgkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0Jc2IJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCXNiCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0Jc2IJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQlzYgkkNCxkYXRhX2xhYmVsKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbigkNSkKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24oJDUpCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbigkNSkKLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24oJDUpCi0Jc2IJJDQsZGF0YV9sYWJlbCsxKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMSgkNSkKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMSgkNSkKLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKzEoJDUpCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEoJDUpCi0Jc2IJJDQsZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlzYgkkNCxkYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQotCXNiCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCXNiCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCQotIyBTZXZlcmFsIG1hY3JvcyBhcmUgaGFuZGxlZCBsaWtlIHNiLiAgU2FuaXR5IGNoZWNrIHRoZW0uCi0Jc2QJJDQsMAotCXNoCSQ0LDAKLQlzdwkkNCwwCi0Jc3djMAkkNCwwCi0Jc3djMQkkNCwwCi0Jc3djMgkkNCwwCi0Jc3djMwkkNCwwCi0Jcy5zCSRmNCwwCi0Jc3dsCSQ0LDAKLQlzd3IJJDQsMAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zeW5jLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3N5bmMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI1MGVhMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3N5bmMuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC0tc2hvdy1yYXctaW5zbgotI25hbWU6IHN5bmMgaW5zdHJ1Y3Rpb25zCi0jYXM6Ci0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBcLnRleHQ6Ci0wKzAwMDAgPGZvbz4gMDAwMDAwMGZbIAldKnN5bmMKLTArMDAwNCA8Zm9vXCsweDQ+IDAwMDAwNDBmWyAJXSpzeW5jLnAKLTArMDAwOCA8Zm9vXCsweDg+IDAwMDAwMDBmWyAJXSpzeW5jCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3N5bmMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc3luYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWMwZWQzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc3luYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLWZvbzoKLQlzeW5jCi0Jc3luYy5wCi0Jc3luYy5sCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RyYXAyMC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cmFwMjAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3YWRiMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RyYXAyMC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI2FzOiAtbWNwdT1yNDAwMAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIDIwLWJpdCB0cmFwCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHRlcQlcJHplcm8sXCR2MQotMCswMDA0IDxbXj5dKj4gdGVxCVwkemVybyxcJHYxLDB4MQotMCswMDA4IDxbXj5dKj4gdGdlCVwkemVybyxcJHYxCi0wKzAwMGMgPFtePl0qPiB0Z2UJXCR6ZXJvLFwkdjEsMHgzCi0wKzAwMTAgPFtePl0qPiB0Z2V1CVwkemVybyxcJHYxCi0wKzAwMTQgPFtePl0qPiB0Z2V1CVwkemVybyxcJHYxLDB4NwotMCswMDE4IDxbXj5dKj4gdGx0CVwkemVybyxcJHYxCi0wKzAwMWMgPFtePl0qPiB0bHQJXCR6ZXJvLFwkdjEsMHgxZgotMCswMDIwIDxbXj5dKj4gdGx0dQlcJHplcm8sXCR2MQotMCswMDI0IDxbXj5dKj4gdGx0dQlcJHplcm8sXCR2MSwweGZmCi0wKzAwMjggPFtePl0qPiB0bmUJXCR6ZXJvLFwkdjEKLTArMDAyYyA8W14+XSo+IHRuZQlcJHplcm8sXCR2MSwweDNmZgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cmFwMjAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJhcDIwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NmQ2NTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cmFwMjAucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSAyMC1iaXQgdHJhcCBpbnN0cnVjdGlvbnMKLWZvbzoJCi0JdGVxCSQwLCQzCi0JdGVxCSQwLCQzLDEKLQl0Z2UJJDAsJDMKLQl0Z2UJJDAsJDMsMwotCXRnZXUJJDAsJDMKLQl0Z2V1CSQwLCQzLDcKLQl0bHQJJDAsJDMKLQl0bHQJJDAsJDMsMzEKLQl0bHR1CSQwLCQzCi0JdGx0dQkkMCwkMywyNTUKLQl0bmUJJDAsJDMKLQl0bmUJJDAsJDMsMTAyMwotCQotIyBmb3JjZSBzb21lIHBhZGRpbmcsIHRvIG1ha2Ugb2JqZHVtcCBjb25zaXN0ZW50bHkgcmVwb3J0IHRoYXQgdGhlcmUncyBzb21lCi0jIGhlcmUuLi4KLQkuc3BhY2UJOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cnVuYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cnVuYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzM4YWUxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJ1bmMuZAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyB0cnVuYwotI2FzOiAtbWlwczEgLW1jcHU9cjMwMDAKLQotIyBUZXN0IHRoZSB0cnVuYyBtYWNyb3MuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGNmYzEJXCRhMCxcJDMxCi0wKzAwMDQgPFtePl0qPiBjZmMxCVwkYTAsXCQzMQotMCswMDA4IDxbXj5dKj4gbm9wCi0wKzAwMGMgPFtePl0qPiBvcmkJXCRhdCxcJGEwLDB4MwotMCswMDEwIDxbXj5dKj4geG9yaQlcJGF0LFwkYXQsMHgyCi0wKzAwMTQgPFtePl0qPiBjdGMxCVwkYXQsXCQzMQotMCswMDE4IDxbXj5dKj4gbm9wCi0wKzAwMWMgPFtePl0qPiBjdnQudy5kCVwkZjQsXCRmNgotMCswMDIwIDxbXj5dKj4gY3RjMQlcJGEwLFwkMzEKLTArMDAyNCA8W14+XSo+IG5vcAotMCswMDI4IDxbXj5dKj4gY2ZjMQlcJGEwLFwkMzEKLTArMDAyYyA8W14+XSo+IGNmYzEJXCRhMCxcJDMxCi0wKzAwMzAgPFtePl0qPiBub3AKLTArMDAzNCA8W14+XSo+IG9yaQlcJGF0LFwkYTAsMHgzCi0wKzAwMzggPFtePl0qPiB4b3JpCVwkYXQsXCRhdCwweDIKLTArMDAzYyA8W14+XSo+IGN0YzEJXCRhdCxcJDMxCi0wKzAwNDAgPFtePl0qPiBub3AKLTArMDA0NCA8W14+XSo+IGN2dC53LnMJXCRmNCxcJGY2Ci0wKzAwNDggPFtePl0qPiBjdGMxCVwkYTAsXCQzMQotMCswMDRjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RydW5jLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RydW5jLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZTkwZjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cnVuYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgdHJ1bmMgbWFjcm9zLgotCi1mb286Ci0JdHJ1bmMudy5kCSRmNCwkZjYsJDQKLQotCXRydW5jLncucwkkZjQsJGY2LCQ0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyZTI5ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsZC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyB1bGQKLSNhczogLW1pcHMzIC1tY3B1PXI0MDAwCi0KLSMgVGVzdCB0aGUgdWxkIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGxkbAlcJGEwLFsxOF1cKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsZHIJXCRhMCxbMThdXChcJHplcm9cKQotMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAxNCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBsZGwJXCRhMCwtMzI3NlsxOF1cKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBsZHIJXCRhMCwtMzI3NlsxOF1cKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAzNCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwMzggPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDAzYyA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDQwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGExXCkKLTArMDA0OCA8W14+XSo+IGxkbAlcJGEwLFsxOF1cKFwkYTFcKQotMCswMDRjIDxbXj5dKj4gbGRyCVwkYTAsWy0wLTldK1woXCRhMVwpCi0wKzAwNTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDU4IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNWMgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA2MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY0IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjggPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDA2YyA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDcwIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjcwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3NCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDc4IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDgwIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4NCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDg4IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDA5NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDk4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwOWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBhNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGE4IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBhYyA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGIwIDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGI4IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBiYyA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGMwIDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjOCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSpjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGNjIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZDAgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBkNCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpkNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDggPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBkYyA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGUwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlNCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSplNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTggPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBlYyA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGYwIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGY0IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZjggPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwMCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDQgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDEwOCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTBjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKjEwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDExNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDExYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTIwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMjQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDEyOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMzQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDEzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxM2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTQ0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTRjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE1NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTVjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE2MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTY0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxNmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTcwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNzQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE3OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxN2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE4MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTg0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxODggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE4YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTkwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxOTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE5OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWE0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWIwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYjQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWJjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFjNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFjYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZDAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFkNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFkYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxZTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFlNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWU4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFlODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFmMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWY0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWZjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMDAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDIwNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjA4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjA4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDIxNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIxYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjIwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMjQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDIyOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIzMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjM0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyM2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjQwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNDQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI0OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDI0YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI1NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI1YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjYwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNjQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI2OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjc0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI3YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjg0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyODggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI5NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjk4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI5YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmEwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDJhOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYjAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDJiNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMmI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmJjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJjMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMmM0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMmNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyZDAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDJkNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYWZmYmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGQucworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSB1bGQgbWFjcm8uCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCXVsZAkkNCwwCi0JdWxkCSQ0LDEKLQl1bGQJJDQsMHg4MDAwCi0JdWxkCSQ0LC0weDgwMDAKLQl1bGQJJDQsMHgxMDAwMAotCXVsZAkkNCwweDFhNWE1Ci0JdWxkCSQ0LDAoJDUpCi0JdWxkCSQ0LDEoJDUpCi0JdWxkCSQ0LGRhdGFfbGFiZWwKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCXVsZAkkNCxiaWdfbG9jYWxfY29tbW9uCi0JdWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCXVsZAkkNCxkYXRhX2xhYmVsKzEKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JdWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCXVsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCXVsZAkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JdWxkCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCi0JdWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdWxkCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JdWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1bGQJJDQsZGF0YV9sYWJlbCsweDEwMDAwCi0JdWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1bGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1bGQJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQl1bGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLWVtcGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1lbXBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDVmMDZiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLWVtcGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgdWxoLWVtcGljCi0jYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYwotI3NvdXJjZTogdWxoLXBpYy5zCi0KLSMgVGVzdCB0aGUgdWxoIG1hY3JvIHdpdGggLW1lbWJlZGRlZC1waWMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwtMTYzODQKLVsgCV0qMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMDA0IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDAwOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMDBjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAxMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSoxNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDE4IDxbXj5dKj4gbGJ1CVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDAyMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwMjQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDI4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qMjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDJjIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAzNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjM0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDAzOCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMDQwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDA0NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMDQ4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA0YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwNTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSo1MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA1NCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDU4IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsLTE2Mzg0Ci1bIAldKjVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA2MCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwNjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDA2OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwNmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDcwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLC0xNTM4NAotWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwNzQgPFtePl0qPiBsYnUJXCRhMCxbMDFdXChcJGF0XCkKLTArMDA3OCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMDdjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA4MCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwODQgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsLTE2MzgzCi1bIAldKjg0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwODggPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA4YyA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDkwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qOTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwOTggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMDljIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBhMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGE0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBhOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwYWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSphYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYjAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBiNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGI4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qYjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGJjIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBjMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGM0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBjOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwY2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpjYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBkMCA8W14+XSo+IGxidQlcJGEwLFswMV1cKFwkYXRcKQotMCswMGQ0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwZDggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGRjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBlMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwtMTYzODMKLVsgCV0qZTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGU0IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZTggPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBlYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwtMTUzODMKLVsgCV0qZWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGYwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBmNCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwZjggPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGZjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxMDAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTA0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLXBpYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtcGljLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzM2IyOWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtcGljLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jIFRlc3QgdW5hbGlnbmVkIGxvYWQgYW5kIHN0b3JlIG1hY3JvcyB3aXRoIFBJQyBjb2RlLiAgV2UgZG9uJ3QgYm90aGVyCi0jIHRvIHRlc3QgbW9zdCBjYXNlcy4gIFRoZSBhY3R1YWwgbG9hZHMgYW5kIHN0b3JlcyBhcmUgdGVzdGVkIGJ5IHRoZQotIyBub24tUElDIHRlc3QgY2FzZS4gIFdlIGp1c3Qgd2FudCB0byBjaGVjayB0aGF0IHRoZSBpbml0aWFsIGFkZHJlc3MKLSMgaXMgbG9hZGVkIGNvcnJlY3RseS4KLQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQl1bGgJJDQsZGF0YV9sYWJlbAotCXVsaHUJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uCi0JdWxodQkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQl1bHcJJDQsZGF0YV9sYWJlbCsxCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCXVsaHUJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQl1bHcJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JdXNoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0JLmlmbmRlZglYR09UCi0Jbm9wCi0Jbm9wCi0JLmVuZGlmCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1zdnI0cGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1zdnI0cGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTMzYmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtc3ZyNHBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyB1bGgtc3ZyNHBpYwotI2FzOiAtbWlwczEgLUtQSUMgLUVCCi0jc291cmNlOiB1bGgtcGljLnMKLQotIyBUZXN0IHRoZSB1bmFsaWduZWQgbG9hZCBhbmQgc3RvcmUgbWFjcm9zIHdpdGggLUtQSUMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMDBjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGF0XCkKLTArMDAxMCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMDE0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAxOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMWMgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwMjAgPFtePl0qPiBub3AKLTArMDAyNCA8W14+XSo+IGxidQlcJGEwLDBcKFwkYXRcKQotMCswMDI4IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDMwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAzNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjM0OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDM4IDxbXj5dKj4gbm9wCi0wKzAwM2MgPFtePl0qPiBsd2wJXCRhMCwwXChcJGF0XCkKLTArMDA0MCA8W14+XSo+IGx3cglcJGEwLDNcKFwkYXRcKQotMCswMDQ0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qNDQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNDggPFtePl0qPiBub3AKLTArMDA0YyA8W14+XSo+IHNiCVwkYTAsMVwoXCRhdFwpCi0wKzAwNTAgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMDU0IDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLTArMDA1OCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMDVjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA2MCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwNjQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSo2NDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDY4IDxbXj5dKj4gbm9wCi0wKzAwNmMgPFtePl0qPiBzd2wJXCRhMCwwXChcJGF0XCkKLTArMDA3MCA8W14+XSo+IHN3cglcJGEwLDNcKFwkYXRcKQotMCswMDc0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qNzQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwNzggPFtePl0qPiBub3AKLTArMDA3YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjdjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwODAgPFtePl0qPiBsYglcJGEwLDBcKFwkYXRcKQotMCswMDg0IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwODggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDhjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA5MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjkwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMDk0IDxbXj5dKj4gbm9wCi0wKzAwOTggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAotWyAJXSo5ODogUl9NSVBTX0xPMTYJLmJzcwotMCswMDljIDxbXj5dKj4gbGJ1CVwkYTAsMFwoXCRhdFwpCi0wKzAwYTAgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDBhNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwYTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGFjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qYWM6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMGIwIDxbXj5dKj4gbm9wCi0wKzAwYjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSpiNDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDBiOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAwYmMgPFtePl0qPiBsd2wJXCRhMCwwXChcJGF0XCkKLTArMDBjMCA8W14+XSo+IGx3cglcJGEwLDNcKFwkYXRcKQotMCswMGM0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qYzQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM4IDxbXj5dKj4gbm9wCi0wKzAwY2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMGQwIDxbXj5dKj4gc2IJXCRhMCwxXChcJGF0XCkKLTArMDBkNCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwZDggPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotMCswMGRjIDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwZTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGU0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBlOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmU4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGVjIDxbXj5dKj4gbm9wCi0wKzAwZjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMGY0IDxbXj5dKj4gc3dsCVwkYTAsMFwoXCRhdFwpCi0wKzAwZjggPFtePl0qPiBzd3IJXCRhMCwzXChcJGF0XCkKLTArMDBmYyA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmZjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTAwIDxbXj5dKj4gbm9wCi0wKzAxMDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMTA4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGF0XCkKLTArMDEwYyA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMTEwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDExNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxMTggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMTg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDExYyA8W14+XSo+IG5vcAotMCswMTIwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDEyNCA8W14+XSo+IGxidQlcJGEwLDBcKFwkYXRcKQotMCswMTI4IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAxMmMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTMwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDEzNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEzNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDEzOCA8W14+XSo+IG5vcAotMCswMTNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMTNjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxNDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMTQ0IDxbXj5dKj4gbHdsCVwkYTAsMFwoXCRhdFwpCi0wKzAxNDggPFtePl0qPiBsd3IJXCRhMCwzXChcJGF0XCkKLTArMDE0YyA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjE0YzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE1MCA8W14+XSo+IG5vcAotMCswMTU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKLVsgCV0qMTU0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxNTggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMTVjIDxbXj5dKj4gc2IJXCRhMCwxXChcJGF0XCkKLTArMDE2MCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxNjQgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotMCswMTY4IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAxNmMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTcwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLXhnb3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyZjljZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC14Z290LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIHVsaC14Z290Ci0jYXM6IC1taXBzMSAtbWNwdT1yMzAwMCAtS1BJQyAteGdvdCAtRUIgLS1kZWZzeW0gWEdPVD0xCi0jc291cmNlOiB1bGgtcGljLnMKLQotIyBUZXN0IHRoZSB1bmFsaWduZWQgbG9hZCBhbmQgc3RvcmUgbWFjcm9zIHdpdGggLUtQSUMgLXhnb3QuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMDBjIDxbXj5dKj4gbm9wCi0wKzAwMTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYXRcKQotMCswMDE0IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwMTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDFjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAyMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyMDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwMjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAwMjggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoyODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwMmMgPFtePl0qPiBub3AKLTArMDAzMCA8W14+XSo+IGxidQlcJGEwLDBcKFwkYXRcKQotMCswMDM0IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDNjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA0MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo0MDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA0NCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDA0OCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjQ4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDRjIDxbXj5dKj4gbm9wCi0wKzAwNTAgPFtePl0qPiBsd2wJXCRhMCwwXChcJGF0XCkKLTArMDA1NCA8W14+XSo+IGx3cglcJGEwLDNcKFwkYXRcKQotMCswMDU4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjU4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDVjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMDYwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qNjA6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNjQgPFtePl0qPiBub3AKLTArMDA2OCA8W14+XSo+IHNiCVwkYTAsMVwoXCRhdFwpCi0wKzAwNmMgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMDcwIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLTArMDA3NCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMDc4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA3YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwODAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qODA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDA4OCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjg4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOGMgPFtePl0qPiBub3AKLTArMDA5MCA8W14+XSo+IHN3bAlcJGEwLDBcKFwkYXRcKQotMCswMDk0IDxbXj5dKj4gc3dyCVwkYTAsM1woXCRhdFwpCi0wKzAwOTggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSo5ODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDA5YyA8W14+XSo+IG5vcAotMCswMGEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qYTA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBhNCA8W14+XSo+IG5vcAotMCswMGE4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGF0XCkKLTArMDBhYyA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMGIwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBiNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwYjggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSpiODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBiYyA8W14+XSo+IG5vcAotMCswMGMwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKLVsgCV0qYzA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBjNCA8W14+XSo+IG5vcAotMCswMGM4IDxbXj5dKj4gbGJ1CVwkYTAsMFwoXCRhdFwpCi0wKzAwY2MgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDBkMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwZDQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGQ4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qZDg6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMGRjIDxbXj5dKj4gbm9wCi0wKzAwZTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSplMDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDBlNCA8W14+XSo+IG5vcAotMCswMGU4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDBlYyA8W14+XSo+IGx3bAlcJGEwLDBcKFwkYXRcKQotMCswMGYwIDxbXj5dKj4gbHdyCVwkYTAsM1woXCRhdFwpCi0wKzAwZjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZjQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMGZjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qZmM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTAwIDxbXj5dKj4gbm9wCi0wKzAxMDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMTA4IDxbXj5dKj4gc2IJXCRhMCwxXChcJGF0XCkKLTArMDEwYyA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxMTAgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotMCswMTE0IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAxMTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTFjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDEyMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxMjA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAxMjggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoxMjg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBub3AKLTArMDEzMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAxMzQgPFtePl0qPiBzd2wJXCRhMCwwXChcJGF0XCkKLTArMDEzOCA8W14+XSo+IHN3cglcJGEwLDNcKFwkYXRcKQotMCswMTNjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjEzYzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDE0NCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjE0NDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0OCA8W14+XSo+IG5vcAotMCswMTRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDE1MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhdFwpCi0wKzAxNTQgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDE1OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxNWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTYwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE2MDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMTY4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMTY4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNmMgPFtePl0qPiBub3AKLTArMDE3MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAxNzQgPFtePl0qPiBsYnUJXCRhMCwwXChcJGF0XCkKLTArMDE3OCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMTdjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDE4MCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxODQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxODQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxODggPFtePl0qPiBub3AKLTArMDE4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjE4YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTkwIDxbXj5dKj4gbm9wCi0wKzAxOTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMTk4IDxbXj5dKj4gbHdsCVwkYTAsMFwoXCRhdFwpCi0wKzAxOWMgPFtePl0qPiBsd3IJXCRhMCwzXChcJGF0XCkKLTArMDFhMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFhMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFhNCA8W14+XSo+IG5vcAotMCswMWE4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKLVsgCV0qMWE4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxYWMgPFtePl0qPiBub3AKLTArMDFiMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAxYjQgPFtePl0qPiBzYglcJGEwLDFcKFwkYXRcKQotMCswMWI4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDFiYyA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi0wKzAxYzAgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDFjNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxYzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMWNjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGguZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ2ZDRiNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC5kCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyB1bGgKLSNhczogLW1pcHMxCi0KLSMgVGVzdCB0aGUgdWxoIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAwYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMTAgPFtePl0qPiBsYglcJGEwLFsxMl1cKFwkemVyb1wpCi0wKzAwMTQgPFtePl0qPiBsYnUJXCRhdCxbMTJdXChcJHplcm9cKQotMCswMDE4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAxYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMjAgPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDI0IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDAyOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAzMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMzQgPFtePl0qPiBsYglcJGEwLC0zMjc2Wzc4XVwoXCR6ZXJvXCkKLTArMDAzOCA8W14+XSo+IGxidQlcJGF0LC0zMjc2Wzc4XVwoXCR6ZXJvXCkKLTArMDAzYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwNDAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNDggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDRjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwNTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDU0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA1OCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDVjIDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDA2MCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwNjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDA2OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwNmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDcwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGExXCkKLTArMDA3NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYTFcKQotMCswMDc4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA3YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwODAgPFtePl0qPiBsYglcJGEwLFsxMl1cKFwkYTFcKQotMCswMDg0IDxbXj5dKj4gbGJ1CVwkYXQsWzEyXVwoXCRhMVwpCi0wKzAwODggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDhjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA5MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA5NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA5OCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwOWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBhMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwYTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSphYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGIwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBiNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGI4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBiYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwYzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSpjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzQgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGM4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwY2MgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGQwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBkNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpkNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZDggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSpkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZGMgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGUwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwZTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGU4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBlYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKmVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGYwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBmNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBmYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxMDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTBjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxMTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTE0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDExOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKjExODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMWMgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTIwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxMjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTI4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDEyYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTMwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEzNCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxMzggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDEzYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxNDAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE0NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTQ4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNGMgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTUwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxNTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTU4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDE1YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKjE1YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTY0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxNjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTZjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDE3MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTc0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTc0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE3OCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxN2MgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDE4MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxODQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTg4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qMTg4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMThjIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDE5MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTk0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDE5OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxOWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTljOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWE0IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDFhOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMWFjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDFiMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxYjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSoxYjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMWI4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDFiYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMWMwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDFjNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxYzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDFkMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxZDQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDFkOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxZGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMWUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxZWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDFmMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxZjQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFmYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMDAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjA0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyMDggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjBjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDIxMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyMTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjE4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDIxYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjIwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDIyNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMzAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjM0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyMzggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjNjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDI0MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI0MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDI0NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI0OCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyNGMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDI1MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyNTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI1YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjY0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyNjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjZjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDI3MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyNzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjc0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjc0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3OCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyN2MgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDI4MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyODQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjg4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjk0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyOTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjljIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDJhMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmE0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJhOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyYWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDJiMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyYjQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMmI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmMwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDJjNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMmM4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDJjYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyZDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmQ0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmQ4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDJkYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMmUwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDJlNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyZTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmYwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDJmNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMmY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDJmYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzMDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDMwNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjMwNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMDggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzBjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzMTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzE0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDMxOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjMxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzIwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDMyNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzI4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDMyYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzMzAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozMzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMzNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjMzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzM4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDMzYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzQwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDM0NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMzRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM1MCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzNTQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDM1OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzNWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzYwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjM2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNjggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzZjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzNzAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzc0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDM3OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM3YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjM3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM4MCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzODQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDM4OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzOGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzkwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzk0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMzk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzk4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDM5YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswM2EwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDNhNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzYTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswM2FjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qM2FjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDNiMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzYjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDNiOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzYmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswM2MwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qM2MwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDNjNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjNjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYzggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswM2NjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzZDAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswM2Q0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDNkOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjNkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2RjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qM2RjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZTAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswM2U0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzZTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswM2VjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDNmMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjNmMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2Y4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDNmYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDAwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQwNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0MDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0MDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDBjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNDBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQxMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0MTQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDQxOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0MWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNDIwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDI0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNDI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDI4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQyYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDMwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQzNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0MzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0Mzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0M2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo0M2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0NDAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDQ0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0NDggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNDRjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDQ1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0NTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo0NTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDU4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQ1YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDYwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQ2NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0NjggPFtePl0qPiBsYnUJXCRhMCxbMDFdXChcJHplcm9cKQotMCswNDZjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCR6ZXJvXCkKLTArMDQ3MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0NzQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZWNiYjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgucworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSB1bGggbWFjcm8uCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCXVsaAkkNCwwCi0JdWxoCSQ0LDEKLQl1bGgJJDQsMHg4MDAwCi0JdWxoCSQ0LC0weDgwMDAKLQl1bGgJJDQsMHgxMDAwMAotCXVsaAkkNCwweDFhNWE1Ci0JdWxoCSQ0LDAoJDUpCi0JdWxoCSQ0LDEoJDUpCi0JdWxoCSQ0LGRhdGFfbGFiZWwKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uCi0JdWxoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCXVsaAkkNCxkYXRhX2xhYmVsKzEKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JdWxoCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCXVsaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCXVsaAkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVsaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JdWxoCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdWxoCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JdWxoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1bGgJJDQsZGF0YV9sYWJlbCsweDEwMDAwCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1bGgJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1bGgJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWxoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWxoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQl1bGgJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQotIyB1bGh1IGlzIGhhbmRsZWQgbGlrZSB1bGguICBTYW5pdHkgY2hlY2sgaXQuCi0JdWxodQkkNCwwCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vsdy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bHcuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZiZGM5NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vsdy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyB1bHcKLSNhczogLW1pcHMxCi0KLSMgVGVzdCB0aGUgdWx3IG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx3bAlcJGEwLFsxNF1cKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsd3IJXCRhMCxbMTRdXChcJHplcm9cKQotMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAxNCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBsd2wJXCRhMCwtMzI3Nls1OF1cKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBsd3IJXCRhMCwtMzI3Nls1OF1cKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAzNCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwMzggPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAzYyA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDQwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGExXCkKLTArMDA0OCA8W14+XSo+IGx3bAlcJGEwLFsxNF1cKFwkYTFcKQotMCswMDRjIDxbXj5dKj4gbHdyCVwkYTAsWy0wLTldK1woXCRhMVwpCi0wKzAwNTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTggPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA1YyA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY4IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNmMgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA3MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjcwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3NCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDc4IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDgwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDg0IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwODggPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjhjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDkwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwOTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMDljIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBhNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGE4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGFjIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYjAgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBiNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpiNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYjggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYmMgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBjMCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSpjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGNjIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZDAgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBkNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKmQ0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkOCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGRjIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU4IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZWMgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBmMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGY0IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZjggPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwNCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTA4IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSoxMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTEwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDExOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjExODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTIwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMjQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEyOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEzNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNDAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE0NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE1NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTYwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNjQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE2OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE2YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE3MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTc0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTdjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE4MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTg0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxODggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE5NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTljIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFhNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWIwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYjQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFjMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWM0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYzggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWQwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZDQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxZGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxZTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFlNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWU4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFlODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMWYwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZjQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFmOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjFmODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjAwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMDQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIwOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIwODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjBjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIxNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIxYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIyNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIyYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMzAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIzNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjQwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNDQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI0OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDI0YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjU0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjY0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjZjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjc0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI3YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjgwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyODQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI4OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyOTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmEwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJhOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJiMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMmI0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyYmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYzAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJjNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMmM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDJjYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyZDAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJkNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bHcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWx3LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMzZmMWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bHcucworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSB1bHcgbWFjcm8uCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCXVsdwkkNCwwCi0JdWx3CSQ0LDEKLQl1bHcJJDQsMHg4MDAwCi0JdWx3CSQ0LC0weDgwMDAKLQl1bHcJJDQsMHgxMDAwMAotCXVsdwkkNCwweDFhNWE1Ci0JdWx3CSQ0LDAoJDUpCi0JdWx3CSQ0LDEoJDUpCi0JdWx3CSQ0LGRhdGFfbGFiZWwKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCXVsdwkkNCxiaWdfbG9jYWxfY29tbW9uCi0JdWx3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCXVsdwkkNCxkYXRhX2xhYmVsKzEKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JdWx3CSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCXVsdwkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCXVsdwkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVsdwkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVsdwkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JdWx3CSQ0LGRhdGFfbGFiZWwtMHg4MDAwCi0JdWx3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdWx3CSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JdWx3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1bHcJJDQsZGF0YV9sYWJlbCsweDEwMDAwCi0JdWx3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdWx3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVsdwkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1bHcJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1bHcJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWx3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWx3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVsdwkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQl1bHcJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2MwYjczLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNkLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIHVzZAotI2FzOiAtbWlwczMgLW1jcHU9cjQwMDAKLQotIyBUZXN0IHRoZSB1c2QgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gc2RsCVwkYTAsWzE4XVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IHNkcglcJGEwLFsxOF1cKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDE0IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwMTggPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDAxYyA8W14+XSo+IHNkbAlcJGEwLC0zMjc2WzE4XVwoXCR6ZXJvXCkKLTArMDAyMCA8W14+XSo+IHNkcglcJGEwLC0zMjc2WzE4XVwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDAzMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDM0IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDAzOCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDNjIDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNDAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGExXCkKLTArMDA0NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gc2RsCVwkYTAsWzE4XVwoXCRhMVwpCi0wKzAwNGMgPFtePl0qPiBzZHIJXCRhMCxbLTAtOV0rXChcJGExXCkKLTArMDA1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA1NCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTggPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDA1YyA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2NCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY4IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNmMgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA3MCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzQgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDA3OCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDdjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4MCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODQgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDA4OCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDhjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjhjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDkwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwOTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMDljIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGEwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBhOCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYWMgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBiMCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGI0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBiOCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYmMgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBjMCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzggPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjYyA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGQwIDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZDQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qZDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ4IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZGMgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU4IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZWMgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBmMCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmNCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGY4IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDAgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTA0IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMDggPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDEwYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSoxMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTEwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDExOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjExODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTI0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTM0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNDAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE0NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTUwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNjAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE2NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTZjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE3MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTc0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTdjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxODAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE4NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTg4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMThjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE5MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTk0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFhNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFiMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWI0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWMwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYzQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFjOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxY2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWQwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZDQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxZGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWUwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFlOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMWVjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZjAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFmNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFmYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjAwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMDQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDIwOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIwODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjBjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjEwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDIxOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjI0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjJjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMzAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDIzNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjQ0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjUwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjY0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjZjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI3NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyN2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI4NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjg4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyOTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMmE0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmIwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYjQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDJiOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYzAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDJjNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMmM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDJjYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMmQwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyZDQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDM2NzM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNkLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgdXNkIG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQl1c2QJJDQsMAotCXVzZAkkNCwxCi0JdXNkCSQ0LDB4ODAwMAotCXVzZAkkNCwtMHg4MDAwCi0JdXNkCSQ0LDB4MTAwMDAKLQl1c2QJJDQsMHgxYTVhNQotCXVzZAkkNCwwKCQ1KQotCXVzZAkkNCwxKCQ1KQotCXVzZAkkNCxkYXRhX2xhYmVsCi0JdXNkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQl1c2QJJDQsYmlnX2xvY2FsX2NvbW1vbgotCXVzZAkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQl1c2QJJDQsZGF0YV9sYWJlbCsxCi0JdXNkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdXNkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCXVzZAkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQl1c2QJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQl1c2QJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdXNkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1c2QJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1c2QJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVzZAkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVzZAkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVzZAkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0JdXNkCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1c2QJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdXNkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdXNkCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1c2QJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JdXNkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzaC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2guZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmMGExMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzaC5kCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyB1c2gKLSNhczogLW1pcHMxCi0KLSMgVGVzdCB0aGUgdXNoIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBzcmwJXCRhdCxcJGEwLDB4OAotMCswMDA4IDxbXj5dKj4gc2IJXCRhdCxbMDFdXChcJHplcm9cKQotMCswMDBjIDxbXj5dKj4gc2IJXCRhMCxbMTJdXChcJHplcm9cKQotMCswMDEwIDxbXj5dKj4gc3JsCVwkYXQsXCRhMCwweDgKLTArMDAxNCA8W14+XSo+IHNiCVwkYXQsWzEyXVwoXCR6ZXJvXCkKLTArMDAxOCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDIwIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDAyNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwMjggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwMzAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDM0IDxbXj5dKj4gc2IJXCRhMCwtMzI3Nls3OF1cKFwkemVyb1wpCi0wKzAwMzggPFtePl0qPiBzcmwJXCRhdCxcJGEwLDB4OAotMCswMDNjIDxbXj5dKj4gc2IJXCRhdCwtMzI3Nls3OF1cKFwkemVyb1wpCi0wKzAwNDAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA0NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwNDggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMDRjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDA1MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMDU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA1OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwNWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA2MCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDY4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDA2YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwNzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDA3NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwNzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDdjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGExXCkKLTArMDA4MCA8W14+XSo+IHNybAlcJGF0LFwkYTAsMHg4Ci0wKzAwODQgPFtePl0qPiBzYglcJGF0LFswMV1cKFwkYTFcKQotMCswMDg4IDxbXj5dKj4gc2IJXCRhMCxbMTJdXChcJGExXCkKLTArMDA4YyA8W14+XSo+IHNybAlcJGF0LFwkYTAsMHg4Ci0wKzAwOTAgPFtePl0qPiBzYglcJGF0LFsxMl1cKFwkYTFcKQotMCswMDk0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qOTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDk4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDljIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBhMCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwYTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGE4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwYWMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGIwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBiNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpiNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGI4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwYzAgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMGM0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBjOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGNjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBkMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwZDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSpkNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDggPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGRjIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDBlMCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwZTQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBlOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwZWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGYwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qZjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGY0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGY4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBmYyA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxMDAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTA0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxMDggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTBjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDExMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjExMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDExNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxMTggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMTFjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDEyMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTI0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDEyOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxMmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMzQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTM4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDEzYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxNDAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDE0NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxNDggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qMTRjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDE1MCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxNTQgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMTU4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDE1YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTYwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDE2NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxNjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE2YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNzAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTc0IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDE3OCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxN2MgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDE4MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxODQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTg4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMThjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMThjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOTAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTk0IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDE5OCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxOWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDFhMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxYTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMWE4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qMWE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxYjAgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMWI0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDFiOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMWJjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDFjMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxYzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFjOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxY2MgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMWQwIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDFkNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxZDggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDFkYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxZTAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMWU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qMWU0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWU4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDFlYyA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxZjAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMWY0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxZjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMWZjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDIwMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyMDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyMDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDggPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjBjIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDIxMCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyMTQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDIxOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyMWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjIwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qMjIwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDIyNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyMjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMjJjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDIzMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjM0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDIzOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyM2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjQwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI0NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyNDggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMjRjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDI1MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDI1OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyNWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI2MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjY0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDI2OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAyNmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjcwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyNzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjc4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDI3YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjg0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDI4OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAyOGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjkwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyOTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjk4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDI5YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmE0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDJhOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAyYWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMmIwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyYjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMmI4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDJiYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJjMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJjNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyYzggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMmNjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDJkMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMmQ0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDJkOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyZGMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyZTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyZTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMmU4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDJlYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyZjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDJmNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyZjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMmZjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDMwMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjMwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzA4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDMwYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzMTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDMxNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzMTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzFjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjMxYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozMjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzI0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDMyOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAzMmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzMwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzMzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzM4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDMzYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjM0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzQ0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDM0OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAzNGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzUwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzNTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzU4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDM1YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMzYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM2NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzNjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMzZjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDM3MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzc0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDM3OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzN2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM4MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjM4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzODQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzg4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDM4YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzOTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDM5NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzOTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzljIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjM5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNhMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjNhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNhNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzYTggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswM2FjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDNiMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswM2I0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDNiOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzYmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2JjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswM2MwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qM2MwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswM2M0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDNjOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAzY2MgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswM2QwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzZDQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswM2Q4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDNkYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswM2UwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qM2UwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDNlNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzZTggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswM2VjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDNmMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswM2Y0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDNmOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzZmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswNDAwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNDAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQwNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0MDggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNDBjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQxMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDE0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQxOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0MWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0MWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQyMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjQyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDI0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQyOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA0MmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDMwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0MzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNDM4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDQzYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo0NDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDQ0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQ0OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA0NGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDUwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0NTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNDU4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDQ1YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo0NjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDY0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQ2OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA0NmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDcwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0NzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNDc4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDQ3YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ4MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjQ4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ4NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0ODggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNDhjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQ5MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDk0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQ5OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0OWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0OWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0YTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo0YTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0YTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNGE4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDRhYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0YjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDRiNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0YjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNGJjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNGJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDRjMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjRjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0YzQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNGM4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDRjYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0ZDAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDRkNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0ZDggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNGRjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNGRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDRlMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjRlMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0ZTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNGU4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDRlYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0ZjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDRmNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0ZjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNGZjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNGZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA1MDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo1MDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDUwNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1MDggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNTBjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDUxMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNTE0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDUxOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA1MWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1MWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNTIwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNTIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDUyNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1MjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNTJjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDUzMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNTM0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDUzOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA1M2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1M2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNTQwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNTQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDU0NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1NDggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNTRjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDU1MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNTU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDU1OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA1NWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1NWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo1NjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNTY4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDU2YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1NzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDU3NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA1NzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNTdjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNTgwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNTgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNTg0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDU4OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA1OGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNTkwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA1OTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNTk4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDU5YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjU5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1YTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo1YTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNWE0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDVhOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA1YWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNWIwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA1YjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNWI4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDViYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNTU4MTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2gucworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSB1c2ggbWFjcm8uCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCXVzaAkkNCwwCi0JdXNoCSQ0LDEKLQl1c2gJJDQsMHg4MDAwCi0JdXNoCSQ0LC0weDgwMDAKLQl1c2gJJDQsMHgxMDAwMAotCXVzaAkkNCwweDFhNWE1Ci0JdXNoCSQ0LDAoJDUpCi0JdXNoCSQ0LDEoJDUpCi0JdXNoCSQ0LGRhdGFfbGFiZWwKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCXVzaAkkNCxiaWdfbG9jYWxfY29tbW9uCi0JdXNoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCXVzaAkkNCxkYXRhX2xhYmVsKzEKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JdXNoCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCXVzaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCXVzaAkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVzaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVzaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JdXNoCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdXNoCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JdXNoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1c2gJJDQsZGF0YV9sYWJlbCsweDEwMDAwCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVzaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1c2gJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1c2gJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JdXNoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdXNoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVzaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQl1c2gJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXN3LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vzdy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWQyOGNjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXN3LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIHVzdwotI2FzOiAtbWlwczEKLQotIyBUZXN0IHRoZSB1c3cgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gc3dsCVwkYTAsWzE0XVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IHN3cglcJGEwLFsxNF1cKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDE0IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMTggPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAxYyA8W14+XSo+IHN3bAlcJGEwLC0zMjc2WzU4XVwoXCR6ZXJvXCkKLTArMDAyMCA8W14+XSo+IHN3cglcJGEwLC0zMjc2WzU4XVwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAzMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDM0IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDAzOCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDNjIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNDAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGExXCkKLTArMDA0NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gc3dsCVwkYTAsWzE0XVwoXCRhMVwpCi0wKzAwNGMgPFtePl0qPiBzd3IJXCRhMCxbLTAtOV0rXChcJGExXCkKLTArMDA1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA1NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA1OCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDVjIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2OCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDZjIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzQgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA3OCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDdjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4NCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDg4IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSo4YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA5MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDk0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwOTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDA5YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGEwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBhOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBhYyA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGIwIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGI4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGJjIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYzAgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBjNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjYyA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGQwIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpkNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDggPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBkYyA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGUwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlOCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGVjIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmNCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGY4IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDQgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEwOCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTBjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qMTBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTE0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTI0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMzQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxM2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTQwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNDQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE0OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTUwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE2MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTY0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxNmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNzAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE3NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE3YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxODAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE4NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTg4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTkwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxOTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE5OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWEwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFhOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFiMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWI0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFjNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFjYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFkMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWQ0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWUwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFlOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMWVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFmMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWY0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWZjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIwMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjA0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIwYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjEwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIxOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjIwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMjQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIyOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjMwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMzQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIzYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjQ0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI1NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI1YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI2NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI2YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI3NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyN2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjg0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyODggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjk0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyOTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjljIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMmE0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYjAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJiNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMmI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmMwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYzQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJjOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyY2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMmQwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyZDQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXN3LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vzdy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjFjNjBjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXN3LnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgdXN3IG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQl1c3cJJDQsMAotCXVzdwkkNCwxCi0JdXN3CSQ0LDB4ODAwMAotCXVzdwkkNCwtMHg4MDAwCi0JdXN3CSQ0LDB4MTAwMDAKLQl1c3cJJDQsMHgxYTVhNQotCXVzdwkkNCwwKCQ1KQotCXVzdwkkNCwxKCQ1KQotCXVzdwkkNCxkYXRhX2xhYmVsCi0JdXN3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQl1c3cJJDQsYmlnX2xvY2FsX2NvbW1vbgotCXVzdwkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQl1c3cJJDQsZGF0YV9sYWJlbCsxCi0JdXN3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdXN3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCXVzdwkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQl1c3cJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQl1c3cJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdXN3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1c3cJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1c3cJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVzdwkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVzdwkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVzdwkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0JdXN3CSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1c3cJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdXN3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdXN3CSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1c3cJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JdXN3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2FkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9hZGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyNTFiYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2FkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCS50ZXh0Ci0JYWRkIGQxLGQyCi0JYWRkIGQyLGEzCi0JYWRkIGEyLGQxCi0JYWRkIGEzLGEyCi0JYWRkIDE2LGQxCi0JYWRkIDI1NixkMgotCWFkZCAxMzEwNzEsZDMKLQlhZGQgMTYsYTEKLQlhZGQgMjU2LGEyCi0JYWRkIDEzMTA3MSxhMwotCWFkZGMgZDEsZDIKLQlhZGRuZiAxNixhMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iYXNpYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2Jhc2ljLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc5M2ViMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2Jhc2ljLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDgzNiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBEZWphR251QGN5Z251cy5jb20KLQotIyBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1wcm9jIGRvX2FkZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhZGQuczogQWRkIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhZGQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCA5NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRjIwQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjJDOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRjI0RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRDUxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRjcxQTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEY0NjNGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRDExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjcwQTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEY0NjdGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTEgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFkIEYyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFmIEY1MEUxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYmNjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJjYy5zOiBCY2MgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiY2MucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBFODAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBFOTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBFMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBFMjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBFMzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBFMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBFNTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBFNjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBFNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBFNDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGNUZDMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE3IEY1RkQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRjVGRTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZCBGNUZGMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEVBMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JjY3gge30gewotICAgIHNldCB0ZXN0bmFtZSAiYmNjeC5zOiBCY2N4IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYmNjeC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY1RTgwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjVFOTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGNUUxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEY1RTIwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjVFMzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGNUUwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEY1RTUwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgRjVFNjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGNUU3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFiIEY1RTQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgRjVFQzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMSBGNUVEMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEY1RUUwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjcgRjVFRjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19iaXQge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0LnM6IGJpdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY1MDU0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjcwNjAwMjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEYwMjlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEYwMzlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMiArRkZGRjQwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotCi1wcm9jIGRvX2NtcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjbXAuczogY21wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY21wLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjM5NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjIyQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjJFRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjI2RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggREIxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgRjc0QTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEY0NzlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRUUwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGNDdERkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEwICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19leHQge30gewotICAgIHNldCB0ZXN0bmFtZSAiZXh0LnM6IGV4dCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImV4dC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYzQzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEIyXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgQjdcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBCQVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEJEXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19leHRlbmQge30gewotICAgIHNldCB0ZXN0bmFtZSAiZXh0ZW5kLnM6IGV4dGVuZGVkIGluc3RydWN0aW9uIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZXh0ZW5kLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjUwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjZGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjkwMjEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGQjAzMDEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRkQwMzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICtGRkZGXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIEY2MTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEY5MTYxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRkIxNzAxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEZEMTcwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTEgK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRjY0QlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRjY1RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRjY3NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbG9naWNhbCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsb2dpY2FsLnM6IGxvZ2ljYWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsb2dpY2FsLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjUwMjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGNzAzRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRjcxMEZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEYzMTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIEY1MEE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjc0M0ZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEY3MTRGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBGMzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNzRGRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRjNFN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl5cW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTExXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2xvb3Age30gewotICAgIHNldCB0ZXN0bmFtZSAibG9vcC5zOiBsb29wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9vcC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEQ4XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRDlcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBEMVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEQyXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRDNcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBEMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEQ1XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRDZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBEN1xbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEQ0XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgREFcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYiBEQlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdjEge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92MS5zOiBtb3YxIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92MS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYyMzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYyRjlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDg2XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRjI3OVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjNGM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRjNEOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGIgRjNFMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRjNDOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgMjlcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCA2OTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGN0M5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRjQ4OUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMyArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92MiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3YyLnM6IG1vdjIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3YyLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjE1NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgQzkwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGNEMxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIDc5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY3QjkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGNEY5RkZGRiBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNSBGMTE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNyBGNzMxMDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWIgRjREMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92MyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3YzLnM6IG1vdjMgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3YzLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIDQ5MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEY3ODkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGNDA5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEYxRTlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEMxODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTEgRjQ0MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiA1OTIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGN0E5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjQxOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92NCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3Y0LnM6IG1vdjQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3Y0LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjFBOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjcyMTgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEY0NTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGIgODUwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRjkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGNDcxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEREMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjQ3NUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs5ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3Z4IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdnguczogbW92eCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdngucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGNTc5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEY3NzkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGNEI5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY1NTkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgRjc2OTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIEY0MzlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNyArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3ZiIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmIuczogbW92YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdmIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGNTI5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEY3RDkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGNEE5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEYwNkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEY0QzZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNiArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgMTlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEY1MTkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTcgRjc5OTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFiIEY0MjlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTAgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEYwRTlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEM1MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjUgRjQ0NUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMyArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92YnUge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92YnUuczogbW92YnUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZidS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDM5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBGNTM5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEY3NTkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGNDk5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEYwOTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIENEMDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjRDOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT05XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdmh1IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmh1LnM6IG1vdmh1IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92aHUucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMDY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGODY2MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEZBNjYwMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGQzY2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgRjhCRDA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGQUJEMDEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRkNCRDAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICtGRkZGXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEY0QTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIDM5ODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjEgRkNBRDAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNyBGMDc2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOSBGODc2MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEZBNzYwMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBGQzc2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE1ICtGRkZGXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM2IEY4OTcyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzkgRkE5NzgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNkIEZDOTcwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTggK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDMgRjREQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDUgMDcwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBGQzg3MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzIxICtGRkZGXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTI2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdm0ge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92bS5zOiBtb3ZtIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92bS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIENFMzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIENFRjhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IENGMzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IENGRjhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbXVsZGl2IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm11bGRpdi5zOiBtdWxkaXYgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtdWxkaXYucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMzQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGMzVCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGMzZFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX290aGVyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm90aGVyLnM6IG90aGVyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAib3RoZXIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGQzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEY0RTBGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMyArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRjAwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgRkQwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGNEUxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEYwMDlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEZFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNSBFQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTExXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NoaWZ0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNoaWZ0LnM6IHNoaWZ0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic2hpZnQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGMzNGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGMzM1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGMzMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3N1YiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzdWIuczogc3ViIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic3ViLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEYyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEYyREZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEYyNUVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEY3MUVGRjdGIFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGIgRjQ2QUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGNzBFRkY3RiBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEY0NkVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOSArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTkgRjI5NiBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTExXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1pZiBbaXN0YXJnZXQgbW4xMDIwMCotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KLSAgICBkb19hZGQKLSAgICBkb19iY2MKLSAgICBkb19iY2N4Ci0gICAgZG9fYml0Ci0gICAgZG9fY21wCi0gICAgZG9fZXh0Ci0gICAgZG9fbG9naWNhbAotICAgIGRvX21vdjEKLSAgICBkb19tb3YyCi0gICAgZG9fbW92MwotICAgIGRvX21vdjQKLSAgICBkb19tb3ZiCi0gICAgZG9fbW92eAotICAgIGRvX21vdmJ1Ci0gICAgZG9fbXVsZGl2Ci0gICAgZG9fb3RoZXIKLSAgICBkb19zaGlmdAotICAgIGRvX3N1YgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iY2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYmNjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOTJkY2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iY2MucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLQkudGV4dAotZm9vOgotCWJlcSBmb28KLQlibmUgZm9vCi0JYmd0IGZvbwotCWJnZSBmb28KLQlibGUgZm9vCi0JYmx0IGZvbwotCWJoaSBmb28KLQliY2MgZm9vCi0JYmxzIGZvbwkKLQliY3MgZm9vCi0JYnZjIGZvbwotCWJ2cyBmb28KLQlibmMgZm9vCi0JYm5zIGZvbwotCWJyYSBmb28KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYmNjeC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iY2N4LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZTdlZGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iY2N4LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0JLnRleHQKLWZvbzoKLQliZXF4IGZvbwotCWJuZXggZm9vCi0JYmd0eCBmb28KLQliZ2V4IGZvbwotCWJsZXggZm9vCi0JYmx0eCBmb28KLQliaGl4IGZvbwotCWJjY3ggZm9vCi0JYmxzeCBmb28JCi0JYmNzeCBmb28KLQlidmN4IGZvbwotCWJ2c3ggZm9vCi0JYm5jeCBmb28KLQlibnN4IGZvbwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iaXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYml0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYjYwZDQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iaXQucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci0JYnRzdCA2NCxkMQotCWJ0c3QgODE5MixkMgotCWJzZXQgZDEsKGEyKQotCWJjbHIgZDEsKGEyKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9jbXAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvY21wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMzkyNWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9jbXAucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkudGV4dAotCWNtcCBkMSxkMgotCWNtcCBkMixhMwotCWNtcCBhMyxkMwotCWNtcCBhMyxhMgotCWNtcCAxNixkMwotCWNtcCAyNTYsZDIKLQljbXAgMTMxMDcxLGQxCi0JY21wIDI1NixhMgotCWNtcCAxMzEwNzEsYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvZXh0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2V4dC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmUwMWJhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvZXh0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQkudGV4dAotCWV4dCBkMQotCWV4dHggZDIKLQlleHR4dSBkMwotCWV4dHhiIGQyCi0JZXh0eGJ1IGQxCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2xvZ2ljYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbG9naWNhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODA5ZDdmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbG9naWNhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS50ZXh0Ci0JYW5kIGQxLGQyCi0JYW5kIDEyNyxkMgotCWFuZCAzMjc2NyxkMwotCWFuZCAzMjc2Nyxwc3cKLQlvciBkMSxkMgotCW9yIDEyNyxkMgotCW9yIDMyNzY3LGQzCi0Jb3IgMzI3NjcscHN3Ci0JeG9yIGQxLGQyCi0JeG9yIDMyNzY3LGQzCi0Jbm90IGQzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92MS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODI4ZTMyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92MS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCS50ZXh0Ci0JbW92IGQxLGEyCi0JbW92IGEyLGQxCi0JbW92IGQxLGQyCi0JbW92IGEyLGExCi0JbW92IHBzdyxkMwotCW1vdiBkMixwc3cKLQltb3YgbWRyLGQxCi0JbW92IGQyLG1kcgotCW1vdiAoYTIpLGQxCi0JbW92ICg4LGEyKSxkMQotCW1vdiAoMjU2LGEyKSxkMQotCW1vdiAoMTMxMDcxLGEyKSxkMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmNmUyNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjIucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkudGV4dAotCW1vdiAoZDEsYTEpLGQyCi0JbW92ICgzMjc2OCksZDEKLQltb3YgKDEzMTA3MSksZDEKLQltb3YgKDgsYTIpLGExCi0JbW92ICgyNTYsYTIpLGExCi0JbW92ICgxMzEwNzEsYTIpLGExCi0JbW92IChkMSxhMSksYTIKLSAgICAgICAgbW92ICgzMjc2OCksYTEKLSAgICAgICAgbW92ICgxMzEwNzEpLGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92My5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDc0OTBhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92My5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS50ZXh0Ci0gICAgICAgIG1vdiBkMSwoYTIpCi0gICAgICAgIG1vdiBkMSwoMzIsYTIpCi0JbW92IGQxLCgyNTYsYTIpCi0JbW92IGQxLCgxMzEwNzEsYTIpCi0JbW92IGQxLChkMixhMikKLQltb3YgZDEsKDEyOCkKLQltb3YgZDEsKDEzMTA3MSkKLQltb3YgYTEsKDMyLGEyKQotCW1vdiBhMSwoMjU2LGEyKQotCW1vdiBhMSwoMTMxMDcxLGEyKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3Y0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjExODdlMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjQucworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCS50ZXh0Ci0JbW92IGExLChkMixhMikKLQltb3YgYTEsKDEyOCkKLQltb3YgYTEsKDEzMTA3MSkKLQltb3YgOCxkMQotCW1vdiAyNTYsZDEKLQltb3YgMTMxMDcxLGQxCi0JbW92IDI1NixhMQotCW1vdiAxMzEwNzEsYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92Yi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3ZiLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTY2MTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3ZiLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0JLnRleHQKLQltb3ZiICg4LGEyKSxkMQotCW1vdmIgKDI1NixhMiksZDEKLQltb3ZiICgxMzEwNzEsYTIpLGQxCi0JbW92YiAoZDIsYTIpLGQzCi0JbW92YiAoMTMxMDcxKSxkMgotCW1vdmIgZDEsKGEyKQotCW1vdmIgZDEsKDgsYTIpCi0JbW92YiBkMSwoMjU2LGEyKQotCW1vdmIgZDEsKDEzMTA3MSxhMikKLQltb3ZiIGQxLChkMixhMikKLQltb3ZiIGQxLCgyNTYpCi0JbW92YiBkMSwoMTMxMDcxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3ZidS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3ZidS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWQ5NzNhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92YnUucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS50ZXh0Ci0JbW92YnUgKGEyKSxkMQotCW1vdmJ1ICg4LGEyKSxkMQotCW1vdmJ1ICgyNTYsYTIpLGQxCi0JbW92YnUgKDEzMTA3MSxhMiksZDEKLQltb3ZidSAoZDEsYTEpLGQyCi0JbW92YnUgKDMyNzY4KSxkMQotCW1vdmJ1ICgxMzEwNzEpLGQxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdngucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92eC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGUxZDcxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92eC5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0JLnRleHQKLQltb3Z4ICg4LGEyKSxkMQotCW1vdnggKDI1NixhMiksZDEKLQltb3Z4ICgxMzEwNzEsYTIpLGQxCi0JbW92eCBkMSwoOCxhMikKLQltb3Z4IGQxLCgyNTYsYTIpCi0JbW92eCBkMSwoMTMxMDcxLGEyKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tdWxkaXYucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbXVsZGl2LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTcwMjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tdWxkaXYucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCS50ZXh0Ci0JbXVsIGQxLGQyCi0JbXVsdSBkMixkMwotCWRpdnUgZDMsZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvb3RoZXIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvb3RoZXIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmOTRiZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL290aGVyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLnRleHQKLQlqbXAgMjU2Ci0Jam1wIDEzMTA3MQotCWptcCAoYTIpCi0JanNyIDI1NgotCWpzciAxMzEwNzEKLQlqc3IgKGEyKQotCXJ0cwotCXJ0aQotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9zaGlmdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9zaGlmdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhlNzY5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvc2hpZnQucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci0JYXNyIGQyCi0JbHNyIGQzCi0Jcm9yIGQxCi0Jcm9sIGQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL3N1Yi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9zdWIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU1MTY1NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL3N1Yi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS50ZXh0Ci0Jc3ViIGQxLGQyCi0Jc3ViIGQyLGEzCi0Jc3ViIGEzLGQzCi0Jc3ViIGEzLGEyCi0Jc3ViIDMyNzY3LGQyCi0Jc3ViIDEzMTA3MSxkMgotCXN1YiAzMjc2NyxhMgotCXN1YiAxMzEwNzEsYTIKLQlzdWJjIGQxLGQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hZGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmNTU4Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS50ZXh0Ci0JYWRkIGQxLGQyCi0JYWRkIGQyLGEzCi0JYWRkIGEzLGEyCi0JYWRkIGEyLGQxCi0JYWRkIDE2LGQxCi0JYWRkIDI1NixkMgotCWFkZCAxMzEwNzEsZDMKLQlhZGQgMTYsYTEKLQlhZGQgMjU2LGEyCi0JYWRkIDEzMTA3MSxhMwotCWFkZCAxNixzcAotCWFkZCAyNTYsc3AKLQlhZGQgMTMxMDcxLHNwCi0JYWRkYyBkMSxkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iYXNpYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2Jhc2ljLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwNTdiOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2Jhc2ljLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDk4NiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBEZWphR251QGN5Z251cy5jb20KLQotIyBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1wcm9jIGRvX2FkZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhZGQuczogQWRkIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhZGQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRjE2QlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjE3RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRjE1OVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgMjkxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRkFDMjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEZDQzNGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyAyMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNSBGQUQyMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTkgRkNEM0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZiBGOEZFMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEZBRkUwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBGQ0ZFRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE0ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEYxNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE3XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JjYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiY2MuczogQmNjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYmNjLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQzgwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgQzkwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQzEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgQzIwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggQzMwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgQzAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgQzUwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgQzYwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgQzcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgQzQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjhFODAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNyBGOEU5MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEY4RUEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWQgRjhFQjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBDQTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19iaXQge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0LnM6IGJpdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY4RUQ0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRkFFRTAwMjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEZDRUZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGQUY5MDg0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTEgRkUwMkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2ICswMTAwNDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGMDg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBGQUYxMDg0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgRkUwMEZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs5ICswMTAwNDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNSBGMDk2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNyBGQUY1MDg0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmIgRkUwMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMiArMDEwMDQwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fY21wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNtcC5zOiBjbXAgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjbXAucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBBNlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEYxQUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEYxOUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEJFXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgQUYxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRkFDQTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEZDQzlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBCRjEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGQURBMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRkNEOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19leHQge30gewotICAgIHNldCB0ZXN0bmFtZSAiZXh0LnM6IGV4dCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImV4dC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYyRDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIDEyXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgMTdcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAxQVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IDFEXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19leHRlbmQge30gewotICAgIHNldCB0ZXN0bmFtZSAiZXh0ZW5kLnM6IGV4dGVuZGVkIGluc3RydWN0aW9uIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZXh0ZW5kLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjUwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjZGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjkwMjEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGQjAzMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRkQwM0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIEY2MTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEY5MTYxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRkIxNzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEZEMTdGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRjY0QlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRjY1RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRjY3NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbG9naWNhbCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsb2dpY2FsLnM6IGxvZ2ljYWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsb2dpY2FsLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjhFMjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGQUUzRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRkNFM0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIEZBRkNGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyBGMjE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNSBGOEU2N0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEZBRTdGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGQ0U3RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEwICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEZBRkRGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBGMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBGQUVCRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRkNFQkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMiBGMjMzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbG9vcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsb29wLnM6IGxvb3AgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsb29wLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRDhcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBEOVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEQxXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRDJcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBEM1xbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEQwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRDVcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBENlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEQ3XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRDRcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBEQVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBiIERCXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92MSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3YxLnM6IG1vdjEgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3YxLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgODZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBGMUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGMUQ5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSA5OVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IDNFXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjJGNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRjJGQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGIgRjJFMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRjJGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgNzZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGODA2MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIEZBMDYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNyBGQzA2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE0ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFkIDU5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFmIEZBQjUwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMyBGMkU3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xN10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3YyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdjIuczogbW92MiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdjIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGQ0I1RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzIgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjMyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMzEwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYiBGQ0E1RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTEgRjAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRjgyNjA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGQTI2MDAwMSBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEZDMjZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCA1RDA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBGQUIxMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRkNCMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMiArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGM0E1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyZSBGQUExMDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzIgRkNBMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBGOEYxMjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTIwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdjMge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92My5zOiBtb3YzIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92My5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBGODE2MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEZBMTYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGQzE2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgNDYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRkE5NTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEZDOTVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBGMzVBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwNTgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFmIEZDODVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjUgRjAxNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjcgRjgzNjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYSBGQTM2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmUgRkMzNkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCA0NzIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xOV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3Y0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdjQuczogbW92NCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdjQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGQTk0MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRkM5NEZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEYzREFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEZBODQ4MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGQzg0RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRjhGNTIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOSA4NTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYiAyRDAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEZDQ0RGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTAgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgOTUwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgMjUwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOSBGQ0RERkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEzICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdmJ1IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmJ1LnM6IG1vdmJ1IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92YnUucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGODQ2MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEZBNDYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGQzQ2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgRjhCOTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGQUI5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRkNCOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEY0MjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIDM1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjEgRkNBOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNyBGMDU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOSBGODU2MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEZBNTYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBGQzU2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM2IEY4OTYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzkgRkE5NjAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNkIEZDOTZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTggKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDMgRjQ1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDUgMDY4MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBGQzg2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzIxICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTI2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdmh1IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmh1LnM6IG1vdmh1IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92aHUucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMDY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGODY2MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEZBNjYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGQzY2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgRjhCRDA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGQUJEMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRkNCREZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEY0QTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIDM5MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjEgRkNBREZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNyBGMDc2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOSBGODc2MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEZBNzYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBGQzc2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM2IEY4OTcyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzkgRkE5NzAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNkIEZDOTdGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTggKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDMgRjREQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDUgMDc4MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBGQzg3RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzIxICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTI2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdm0ge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92bS5zOiBtb3ZtIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92bS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIENFMzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIENFRjhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IENGMzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IENGRjhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbXVsZGl2IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm11bGRpdi5zOiBtdWxkaXYgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtdWxkaXYucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGMjVCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGMjZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGMjdFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX290aGVyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm90aGVyLnM6IG90aGVyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAib3RoZXIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIDQ0XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgNDlcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyA1M1xbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IENDMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRENGRkZGMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBDRDAwMDEzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzkgKzA5XFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIERERkZGRjAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTAgKzAwMzAyMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEYwRjJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEZBRkYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBGQ0ZGRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEzICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IERGMzAwN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjkgREUzMDA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGMEZDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyZSBGMEZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBGMEZFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMiBDQlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMzIEYwRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTIzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NoaWZ0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNoaWZ0LnM6IHNoaWZ0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic2hpZnQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMkI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGOENBMDRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEYyQUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEY4QzcwNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgRjI5RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjhDMjA0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiA1NlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEYyODVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEYyODJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTldIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc3ViIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInN1Yi5zOiBzdWIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzdWIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGMTJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGMTFGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGMTNFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGQ0M2RkZGRiBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEZDRDVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNyArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGMTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT05XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3VkZiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJ1ZGYuczogdWRmIHRlc3RzIHBhcnQgMSIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInVkZi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY2MDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY2MTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEY2MjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEY2MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEY2NDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEY2NTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY2NjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEY2NzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEY2ODFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEY2OTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEY2QTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEY2QjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEY2QzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEY2RDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEY2RTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEY2RjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEY1MDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEY1MTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEY1MjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEY1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEY1NDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJhIEY1NTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEY1NjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIEY1NzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEY1ODFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIEY1OTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEY1QTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM2IEY1QjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEY1QzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNhIEY1RDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEY1RTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNlIEY1RjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEY5MDE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDMgRjkxMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NiBGOTIxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ5IEY5MzE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgRjk0MTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0ZiBGOTUxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUyIEY5NjE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTUgRjk3MTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBGOTgxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDViIEY5OTE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWUgRjlBMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MSBGOUIxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IEY5QzE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjcgRjlEMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YSBGOUUxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZkIEY5RjE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgRkIwMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IEZCMTFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBGQjIxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgRkIzMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIEZCNDFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCBGQjUxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggRkI2MUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIEZCNzFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCBGQjgxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgRkI5MUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IEZCQTFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyBGQkIxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgRkJDMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IEZCRDFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCBGQkUxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgRkJGMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIEZEMDFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNjYgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjYgRkQxMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2NyArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyBGRDIxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzY4ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMyIEZEMzFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNjkgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggRkQ0MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3MCArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjZSBGRDUxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcxICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IEZENjFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzIgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGEgRkQ3MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3MyArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCBGRDgxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzc0ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU2IEZEOTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzUgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgRkRBMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3NiArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMiBGREIxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzc3ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IEZEQzFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzggKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmUgRkREMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3OSArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCBGREUxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzgwICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTBhIEZERjFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArODEgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgRjkwNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMyBGOTE1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE2IEY5MjU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTkgRjkzNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyBGOTQ1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFmIEY5NTU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjIgRjk2NTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNSBGOTc1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI4IEY5ODU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmIgRjk5NTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyZSBGOUE1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTMxIEY5QjU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgRjlDNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNyBGOUQ1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTNhIEY5RTU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2QgRjlGNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0MCBGQjA1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDQgRkIxNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ4IEZCMjUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0YyBGQjM1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTAgRkI0NTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU0IEZCNTUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1OCBGQjY1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNWMgRkI3NTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTYwIEZCODUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2NCBGQjk1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjggRkJBNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTZjIEZCQjUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3MCBGQkM1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzQgRkJENTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc4IEZCRTUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3YyBGQkY1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODAgRkQwNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMTQgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4NiBGRDE1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExNSArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMThjIEZEMjUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTE2ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTIgRkQzNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMTcgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5OCBGRDQ1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExOCArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTllIEZENTUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTE5ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTQgRkQ2NTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjAgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhYSBGRDc1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyMSArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWIwIEZEODUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTIyICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjYgRkQ5NTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjMgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiYyBGREE1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyNCArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWMyIEZEQjUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTI1ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzggRkRDNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjYgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjZSBGREQ1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyNyArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQ0IEZERTUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTI4ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZGEgRkRGNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjkgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLQotaWYgW2lzdGFyZ2V0IG1uMTAzMDAqLSotKl0gdGhlbiB7Ci0gICAgIyBUZXN0IHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBwYXJzZXIuCi0gICAgZG9fYWRkCi0gICAgZG9fYmNjCi0gICAgZG9fYml0Ci0gICAgZG9fY21wCi0gICAgZG9fZXh0Ci0gICAgZG9fZXh0ZW5kCi0gICAgZG9fbG9naWNhbAotICAgIGRvX2xvb3AKLSAgICBkb19tb3YxCi0gICAgZG9fbW92MgotICAgIGRvX21vdjMKLSAgICBkb19tb3Y0Ci0gICAgZG9fbW92YnUKLSAgICBkb19tb3ZodQotICAgIGRvX21vdm0KLSAgICBkb19tdWxkaXYKLSAgICBkb19vdGhlcgotICAgIGRvX3NoaWZ0Ci0gICAgZG9fc3ViCi0gICAgZG9fdWRmCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2JjYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iY2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5MmRjZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2JjYy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotCS50ZXh0Ci1mb286Ci0JYmVxIGZvbwotCWJuZSBmb28KLQliZ3QgZm9vCi0JYmdlIGZvbwotCWJsZSBmb28KLQlibHQgZm9vCi0JYmhpIGZvbwotCWJjYyBmb28KLQlibHMgZm9vCQotCWJjcyBmb28KLQlidmMgZm9vCi0JYnZzIGZvbwotCWJuYyBmb28KLQlibnMgZm9vCi0JYnJhIGZvbwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iaXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYml0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YzU1MTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iaXQucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkudGV4dAotCWJ0c3QgNjQsZDEKLQlidHN0IDgxOTIsZDIKLQlidHN0IDEzMTA3MSxkMwotCWJ0c3QgNjQsKDgsYTEpCi0JYnRzdCA2NCwoMTMxMDcxKQotCWJzZXQgZDEsKGEyKQotCWJzZXQgNjQsKDgsYTEpCi0JYnNldCA2NCwoMTMxMDcxKQotCWJjbHIgZDEsKGEyKQotCWJjbHIgNjQsKDgsYTEpCi0JYmNsciA2NCwoMTMxMDcxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9jbXAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvY21wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmOGE3MWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9jbXAucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkudGV4dAotCWNtcCBkMSxkMgotCWNtcCBkMixhMwotCWNtcCBhMyxkMwotCWNtcCBhMyxhMgotCWNtcCAxNixkMwotCWNtcCAyNTYsZDIKLQljbXAgMTMxMDcxLGQxCi0JY21wIDE2LGEzCi0JY21wIDI1NixhMgotCWNtcCAxMzEwNzEsYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvZXh0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2V4dC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGUyZTc5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvZXh0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQkudGV4dAotCWV4dCBkMQotCWV4dGIgZDIKLQlleHRidSBkMwotCWV4dGggZDIKLQlleHRodSBkMQotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9leHRlbmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvZXh0ZW5kLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDA1YjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9leHRlbmQucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQkudGV4dAotCXB1dHggZDEKLQlnZXR4IGQyCi0JbXVscSBkMSxkMgotCW11bHEgMTYsZDIKLQltdWxxIDI1NixkMwotCW11bHEgMTMxMDcxLGQzCi0JbXVscXUgZDEsZDIKLQltdWxxdSAxNixkMgotCW11bHF1IDI1NixkMwotCW11bHF1IDEzMTA3MSxkMwotCXNhdDE2IGQyLGQzCi0Jc2F0MjQgZDMsZDIKLQlic2NoIGQxLGQyCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2xvZ2ljYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbG9naWNhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDk3NmRiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbG9naWNhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS50ZXh0Ci0JYW5kIGQxLGQyCi0JYW5kIDEyNyxkMgotCWFuZCAzMjc2NyxkMwotCWFuZCAxMzEwNzEsZDMKLQlhbmQgMzI3NjcscHN3Ci0Jb3IgZDEsZDIKLQlvciAxMjcsZDIKLQlvciAzMjc2NyxkMwotCW9yIDEzMTA3MSxkMwotCW9yIDMyNzY3LHBzdwotCXhvciBkMSxkMgotCXhvciAzMjc2NyxkMwotCXhvciAxMzEwNzEsZDMKLQlub3QgZDMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbG9vcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9sb29wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MTgyMDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9sb29wLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLnRleHQKLWZvbzoKLQlsZXEKLQlsbmUKLQlsZ3QKLQlsZ2UKLQlsbGUKLQlsbHQKLQlsaGkKLQlsY2MKLQlsbHMJCi0JbGNzCi0JbHJhCi0Jc2V0bGIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3YxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ0Y2M1NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjEucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLQkudGV4dAotCW1vdiBkMSxkMgotCW1vdiBkMSxhMgotCW1vdiBhMixkMQotCW1vdiBhMixhMQotCW1vdiBzcCxhMgotCW1vdiBhMSxzcAotCW1vdiBkMixwc3cKLQltb3YgbWRyLGQxCi0JbW92IGQyLG1kcgotCW1vdiAoYTIpLGQxCi0JbW92ICg4LGEyKSxkMQotCW1vdiAoMjU2LGEyKSxkMQotCW1vdiAoMTMxMDcxLGEyKSxkMQotCW1vdiAoOCxzcCksZDEKLQltb3YgKDI1NixzcCksZDEKLQltb3YgcHN3LGQzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92Mi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGQxZWRjNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjIucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQkudGV4dAotICAgICAgICBtb3YgKDEzMTA3MSxzcCksZDEKLQltb3YgKGQxLGExKSxkMgotCW1vdiAoMzI3NjgpLGQxCi0JbW92ICgxMzEwNzEpLGQxCi0JbW92IChhMiksYTEKLQltb3YgKDgsYTIpLGExCi0JbW92ICgyNTYsYTIpLGExCi0JbW92ICgxMzEwNzEsYTIpLGExCi0JbW92ICg4LHNwKSxhMQotCW1vdiAoMjU2LHNwKSxhMQotCW1vdiAoMTMxMDcxLHNwKSxhMQotCW1vdiAoZDEsYTEpLGEyCi0gICAgICAgIG1vdiAoMzI3NjgpLGExCi0gICAgICAgIG1vdiAoMTMxMDcxKSxhMQotICAgICAgICBtb3YgKDMyLGExKSxzcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3YzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlYzBiOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjMucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQkudGV4dAotICAgICAgICBtb3YgZDEsKGEyKQotICAgICAgICBtb3YgZDEsKDMyLGEyKQotCW1vdiBkMSwoMjU2LGEyKQotCW1vdiBkMSwoMTMxMDcxLGEyKQotCW1vdiBkMSwoMzIsc3ApCi0JbW92IGQxLCgzMjc2OCxzcCkKLQltb3YgZDEsKDEzMTA3MSxzcCkKLQltb3YgZDEsKGQyLGEyKQotCW1vdiBkMSwoMTI4KQotCW1vdiBkMSwoMTMxMDcxKQotCW1vdiBhMSwoYTIpCi0JbW92IGExLCgzMixhMikKLQltb3YgYTEsKDI1NixhMikKLQltb3YgYTEsKDEzMTA3MSxhMikKLQltb3YgYTEsKDMyLHNwKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3Y0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkNjljMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjQucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQkudGV4dAotCW1vdiBhMSwoMzI3Njgsc3ApCi0JbW92IGExLCgxMzEwNzEsc3ApCi0JbW92IGExLChkMixhMikKLQltb3YgYTEsKDEyOCkKLQltb3YgYTEsKDEzMTA3MSkKLQltb3Ygc3AsKDMyLGExKQotCW1vdiA4LGQxCi0JbW92IDI1NixkMQotCW1vdiAxMzEwNzEsZDEKLQltb3YgOCxhMQotCW1vdiAyNTYsYTEKLQltb3YgMTMxMDcxLGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdmJ1LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdmJ1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZGI3YmUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZidS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotCS50ZXh0Ci0JbW92YnUgKGEyKSxkMQotCW1vdmJ1ICg4LGEyKSxkMQotCW1vdmJ1ICgyNTYsYTIpLGQxCi0JbW92YnUgKDEzMTA3MSxhMiksZDEKLQltb3ZidSAoOCxzcCksZDEKLQltb3ZidSAoMjU2LHNwKSxkMQotCW1vdmJ1ICgxMzEwNzEsc3ApLGQxCi0JbW92YnUgKGQxLGExKSxkMgotCW1vdmJ1ICgzMjc2OCksZDEKLQltb3ZidSAoMTMxMDcxKSxkMQotCW1vdmJ1IGQxLChhMikKLQltb3ZidSBkMSwoMzIsYTIpCi0JbW92YnUgZDEsKDI1NixhMikKLQltb3ZidSBkMSwoMTMxMDcxLGEyKQotCW1vdmJ1IGQxLCgzMixzcCkKLQltb3ZidSBkMSwoMzI3Njgsc3ApCi0JbW92YnUgZDEsKDEzMTA3MSxzcCkKLQltb3ZidSBkMSwoZDIsYTIpCi0JbW92YnUgZDEsKDEyOCkKLQltb3ZidSBkMSwoMTMxMDcxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZodS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZodS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjM3ZTgwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92aHUucworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLQkudGV4dAotCW1vdmh1IChhMiksZDEKLQltb3ZodSAoOCxhMiksZDEKLQltb3ZodSAoMjU2LGEyKSxkMQotCW1vdmh1ICgxMzEwNzEsYTIpLGQxCi0JbW92aHUgKDgsc3ApLGQxCi0JbW92aHUgKDI1NixzcCksZDEKLQltb3ZodSAoMTMxMDcxLHNwKSxkMQotCW1vdmh1IChkMSxhMSksZDIKLQltb3ZodSAoMzI3NjgpLGQxCi0JbW92aHUgKDEzMTA3MSksZDEKLQltb3ZodSBkMSwoYTIpCi0JbW92aHUgZDEsKDMyLGEyKQotCW1vdmh1IGQxLCgyNTYsYTIpCi0JbW92aHUgZDEsKDEzMTA3MSxhMikKLQltb3ZodSBkMSwoMzIsc3ApCi0JbW92aHUgZDEsKDMyNzY4LHNwKQotCW1vdmh1IGQxLCgxMzEwNzEsc3ApCi0JbW92aHUgZDEsKGQyLGEyKQotCW1vdmh1IGQxLCgxMjgpCi0JbW92aHUgZDEsKDEzMTA3MSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92bS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZmM2ODMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZtLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotCW1vdm0gKHNwKSxbYTIsYTNdCi0JbW92bSAoc3ApLFtkMixkMyxhMixhMyxvdGhlcl0KLQltb3ZtIFthMixhM10sKHNwKQotCW1vdm0gW2QyLGQzLGEyLGEzLG90aGVyXSwoc3ApCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL211bGRpdi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tdWxkaXYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YxMWU1ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL211bGRpdi5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLQltdWwgZDEsZDIKLQltdWx1IGQyLGQzCi0JZGl2IGQzLGQzCi0JZGl2dSBkMyxkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9vdGhlci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9vdGhlci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWFmNzRhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvb3RoZXIucworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQkudGV4dAotCWNsciBkMgotCWluYyBkMQotCWluYyBhMgotCWluYzQgYTMKLQlqbXAgKGEyKQotCWptcCAyNTYKLQlqbXAgMTMxMDcxCi0JY2FsbCAyNTYsW2EyLGEzXSw5Ci0JY2FsbCAxMzEwNzEsW2EyLGEzXSwzMgotCWNhbGxzIChhMikKLQljYWxscyAyNTYKLQljYWxscyAxMzEwNzEKLQlyZXQgW2EyLGEzXSw3Ci0JcmV0ZiBbYTIsYTNdLDUKLQlyZXRzCi0JcnRpCi0JdHJhcAotCW5vcAotCXJ0bQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9zaGlmdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9zaGlmdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzhjOWNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvc2hpZnQucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkudGV4dAotCWFzciBkMSxkMgotCWFzciA0LGQyCi0JbHNyIGQyLGQzCi0JbHNyIDQsZDMKLQlhc2wgZDMsZDIKLQlhc2wgNCxkMgotCWFzbDIgZDIKLQlyb3IgZDEKLQlyb2wgZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvc3ViLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3N1Yi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2RjNjYzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvc3ViLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkudGV4dAotCXN1YiBkMSxkMgotCXN1YiBkMixhMwotCXN1YiBhMyxkMwotCXN1YiBhMyxhMgotCXN1YiAxMzEwNzEsZDIKLQlzdWIgMTMxMDcxLGExCi0Jc3ViYyBkMSxkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC91ZGYucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvdWRmLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3Y2JkMTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC91ZGYucworKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0JLnRleHQKLQl1ZGYwMCBkMCxkMQotCXVkZjAxIGQwLGQxCi0JdWRmMDIgZDAsZDEKLQl1ZGYwMyBkMCxkMQotCXVkZjA0IGQwLGQxCi0JdWRmMDUgZDAsZDEKLQl1ZGYwNiBkMCxkMQotCXVkZjA3IGQwLGQxCi0JdWRmMDggZDAsZDEKLQl1ZGYwOSBkMCxkMQotCXVkZjEwIGQwLGQxCi0JdWRmMTEgZDAsZDEKLQl1ZGYxMiBkMCxkMQotCXVkZjEzIGQwLGQxCi0JdWRmMTQgZDAsZDEKLQl1ZGYxNSBkMCxkMQotCXVkZjIwIGQwLGQxCi0JdWRmMjEgZDAsZDEKLQl1ZGYyMiBkMCxkMQotCXVkZjIzIGQwLGQxCi0JdWRmMjQgZDAsZDEKLQl1ZGYyNSBkMCxkMQotCXVkZjI2IGQwLGQxCi0JdWRmMjcgZDAsZDEKLQl1ZGYyOCBkMCxkMQotCXVkZjI5IGQwLGQxCi0JdWRmMzAgZDAsZDEKLQl1ZGYzMSBkMCxkMQotCXVkZjMyIGQwLGQxCi0JdWRmMzMgZDAsZDEKLQl1ZGYzNCBkMCxkMQotCXVkZjM1IGQwLGQxCi0JdWRmMDAgMTI3LGQxCi0JdWRmMDEgMTI3LGQxCi0JdWRmMDIgMTI3LGQxCi0JdWRmMDMgMTI3LGQxCi0JdWRmMDQgMTI3LGQxCi0JdWRmMDUgMTI3LGQxCi0JdWRmMDYgMTI3LGQxCi0JdWRmMDcgMTI3LGQxCi0JdWRmMDggMTI3LGQxCi0JdWRmMDkgMTI3LGQxCi0JdWRmMTAgMTI3LGQxCi0JdWRmMTEgMTI3LGQxCi0JdWRmMTIgMTI3LGQxCi0JdWRmMTMgMTI3LGQxCi0JdWRmMTQgMTI3LGQxCi0JdWRmMTUgMTI3LGQxCi0JdWRmMDAgMzI3NjcsZDEKLQl1ZGYwMSAzMjc2NyxkMQotCXVkZjAyIDMyNzY3LGQxCi0JdWRmMDMgMzI3NjcsZDEKLQl1ZGYwNCAzMjc2NyxkMQotCXVkZjA1IDMyNzY3LGQxCi0JdWRmMDYgMzI3NjcsZDEKLQl1ZGYwNyAzMjc2NyxkMQotCXVkZjA4IDMyNzY3LGQxCi0JdWRmMDkgMzI3NjcsZDEKLQl1ZGYxMCAzMjc2NyxkMQotCXVkZjExIDMyNzY3LGQxCi0JdWRmMTIgMzI3NjcsZDEKLQl1ZGYxMyAzMjc2NyxkMQotCXVkZjE0IDMyNzY3LGQxCi0JdWRmMTUgMzI3NjcsZDEKLQl1ZGYwMCA2NTUzNSxkMQotCXVkZjAxIDY1NTM1LGQxCi0JdWRmMDIgNjU1MzUsZDEKLQl1ZGYwMyA2NTUzNSxkMQotCXVkZjA0IDY1NTM1LGQxCi0JdWRmMDUgNjU1MzUsZDEKLQl1ZGYwNiA2NTUzNSxkMQotCXVkZjA3IDY1NTM1LGQxCi0JdWRmMDggNjU1MzUsZDEKLQl1ZGYwOSA2NTUzNSxkMQotCXVkZjEwIDY1NTM1LGQxCi0JdWRmMTEgNjU1MzUsZDEKLQl1ZGYxMiA2NTUzNSxkMQotCXVkZjEzIDY1NTM1LGQxCi0JdWRmMTQgNjU1MzUsZDEKLQl1ZGYxNSA2NTUzNSxkMQotCXVkZnUwMCAxMjgsZDEKLQl1ZGZ1MDEgMTI4LGQxCi0JdWRmdTAyIDEyOCxkMQotCXVkZnUwMyAxMjgsZDEKLQl1ZGZ1MDQgMTI4LGQxCi0JdWRmdTA1IDEyOCxkMQotCXVkZnUwNiAxMjgsZDEKLQl1ZGZ1MDcgMTI4LGQxCi0JdWRmdTA4IDEyOCxkMQotCXVkZnUwOSAxMjgsZDEKLQl1ZGZ1MTAgMTI4LGQxCi0JdWRmdTExIDEyOCxkMQotCXVkZnUxMiAxMjgsZDEKLQl1ZGZ1MTMgMTI4LGQxCi0JdWRmdTE0IDEyOCxkMQotCXVkZnUxNSAxMjgsZDEKLQl1ZGZ1MDAgMzI3NjgsZDEKLQl1ZGZ1MDEgMzI3NjgsZDEKLQl1ZGZ1MDIgMzI3NjgsZDEKLQl1ZGZ1MDMgMzI3NjgsZDEKLQl1ZGZ1MDQgMzI3NjgsZDEKLQl1ZGZ1MDUgMzI3NjgsZDEKLQl1ZGZ1MDYgMzI3NjgsZDEKLQl1ZGZ1MDcgMzI3NjgsZDEKLQl1ZGZ1MDggMzI3NjgsZDEKLQl1ZGZ1MDkgMzI3NjgsZDEKLQl1ZGZ1MTAgMzI3NjgsZDEKLQl1ZGZ1MTEgMzI3NjgsZDEKLQl1ZGZ1MTIgMzI3NjgsZDEKLQl1ZGZ1MTMgMzI3NjgsZDEKLQl1ZGZ1MTQgMzI3NjgsZDEKLQl1ZGZ1MTUgMzI3NjgsZDEKLQl1ZGZ1MDAgNjU1MzYsZDEKLQl1ZGZ1MDEgNjU1MzYsZDEKLQl1ZGZ1MDIgNjU1MzYsZDEKLQl1ZGZ1MDMgNjU1MzYsZDEKLQl1ZGZ1MDQgNjU1MzYsZDEKLQl1ZGZ1MDUgNjU1MzYsZDEKLQl1ZGZ1MDYgNjU1MzYsZDEKLQl1ZGZ1MDcgNjU1MzYsZDEKLQl1ZGZ1MDggNjU1MzYsZDEKLQl1ZGZ1MDkgNjU1MzYsZDEKLQl1ZGZ1MTAgNjU1MzYsZDEKLQl1ZGZ1MTEgNjU1MzYsZDEKLQl1ZGZ1MTIgNjU1MzYsZDEKLQl1ZGZ1MTMgNjU1MzYsZDEKLQl1ZGZ1MTQgNjU1MzYsZDEKLQl1ZGZ1MTUgNjU1MzYsZDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jaGFyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY2hhci5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjVmNGI1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jaGFyLmQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSNvYmpjb3B5OiAtTyBzcmVjCi0jbmFtZTogTVJJIGNoYXJhY3RlciBjb25zdGFudHMKLSNhczogLU0KLQotIyBUZXN0IE1SSSBjaGFyYWN0ZXIgY29uc3RhbnRzCi0KLVMwLioKLVMxMTMuLi4uKDYxNjE2MjYzNjE2MjYzNjQ2NTAwMDAwMDYxMjc2MjAwKXwoNjE2MTYyNjM2NDYzNjI2MTAwMDAwMDY1MDA2MjI3NjEpLioKLSNwYXNzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY2hhci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NoYXIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IwYTgzYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY2hhci5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi07IFRlc3QgTVJJIHN0eWxlIGNoYXJhY3RlciBjb25zdGFudHMuCi0KLQlkYy5iCSdhJwotCWRjLmIJJ2FiYycKLQlkYy5sCSdhYmNkZScKLQlkYy5sCSdhJydiJwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1lbnQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tZW50LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNDM0ZGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1lbnQuZAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotI25tOiAtLWV4dGVybi1vbmx5Ci0jbmFtZTogTVJJIGNvbW1lbnRzCi0jYXM6IC1NCi0KLSMgVGVzdCBNUkkgY29tbWVudHMKLQotMCswMiBBIFJBTQotMCswMSBBIFJPTQotICogVSBsYWJlbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1lbnQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tZW50LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NzMxOGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1lbnQucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQl4cmVmIGxhYmVsCi0JeGRlZglST00sUkFNCi0JKiB0aGlzIGlzIGEgY29tbWVudAotCi0JZGMubAlsYWJlbAlsb29wIGlmIHdlIGhhdmVuJ3QgcmVhY2ggZW5kIHlldAotCQotUk9NCQkJCUVRVQkkMDAwMDAwMDEJKiB3b3JkIHdpZGUKLVJBTQkJCQlFUVUJJDAwMDAwMDAyCXdvcmQgd2lkZQotCWRjLmwJUkFNCi0JZGMubAkwCSxyZWFsbHksYSxjb21tZW50Ci07IGEgY29tbWVudAotIDsgYW5vdGhlciBjb21tZW50Ci0gIDsgYW5vdGhlciBjb21tZW50CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbW9uLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbW9uLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYzE1MzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1vbi5kCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jbm06IC0tZXh0ZXJuLW9ubHkKLSNuYW1lOiBNUkkgY29tbW9uIHNlY3Rpb25zCi0jYXM6IC1NCi0KLSMgVGVzdCBNUkkgY29tbW9uIHNlY3Rpb25zCi0KLTArMDggQyAwMGNvbTIKLTArMDggQyBjb20xCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbW9uLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbW9uLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MzVjNmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1vbi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotOyBUZXN0IE1SSSBjb21tb24gc2VjdGlvbnMKLQljb21tb24JY29tMQotCWRzLmwJMQotY29tMgljb21tb24gMDAKLQlkcy5sCTEKLWluY29tCWRzLmwJMQotCWNvbW1vbgljb20xCi0JZHMubAkxCi0JZGF0YQotCWRjLmwJY29tMQotCWRjLmwJaW5jb20KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb25zdGFudHMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb25zdGFudHMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxMDAyMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29uc3RhbnRzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jbm06IC0tZXh0ZXJuLW9ubHkKLSNuYW1lOiBNUkkgY29uc3RhbnRzCi0jYXM6IC1NCi0KLSMgVGVzdCBNUkkgc3R5bGUgY29uc3RhbnRzCi0KLTAqMCBUIGZvbwotMCphIEEgczAxCi0wKmEgQSBzMDIKLTAqYSBBIHMwMwotMCphIEEgczA0Ci0wKmEgQSBzMDUKLTAqYSBBIHMwNgotMCphIEEgczA3Ci0wKmEgQSBzMDgKLTAqYSBBIHMwOQotMCo2MSBBIHMxMAotMCo2MSBBIHMxMQotMCo2MTYyNjM2NCBBIHMxMgotMCo2MTI3NjIwMCBBIHMxMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbnN0YW50cy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbnN0YW50cy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM0ZTY3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb25zdGFudHMucworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLQl4ZGVmCXMwMSxzMDIsczAzLHMwNCxzMDUsczA2LHMwNyxzMDgsczA5LHMxMCxzMTEsczEyLHMxMwotczAxCWVxdQklMTAxMAotczAyCWVxdQkxMDEwYgotczAzCWVxdQlAMTIKLXMwNAllcXUJMTJvCi1zMDUJZXF1CTEycQotczA2CWVxdQkxMAotczA3CWVxdQkxMGQKLXMwOAllcXUJJGEKLXMwOQllcXUJMGFoCi1zMTAJZXF1CSdhJwotczExCWVxdQlBJ2EnCi1zMTIJZXF1CSdhYmNkJwotczEzCWVxdQknYScnYicKLQotCXhkZWYJZm9vCi1mb28KLQltb3ZlcS5sCSMlMTAxMCxkMAotCW1vdmVxLmwJIzEwMTBiLGQwCi0JbW92ZXEubAkjQDEyLGQwCi0JbW92ZXEubAkjMTJvLGQwCi0JbW92ZXEubAkjMTJxLGQwCi0JbW92ZXEubAkjMTAsZDAKLQltb3ZlcS5sCSMxMGQsZDAKLQltb3ZlcS5sCSMkYSxkMAotCW1vdmVxLmwJIzBhaCxkMAotCW1vdmVxLmwJIydhJyxkMAotCW1vdmVxLmwJI0EnYScsZDAKLQlub3AKLQotCWVuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2VtcHR5LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZW1wdHkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjMmNkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZW1wdHkucworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotU0JUCU1BQ1JPCQk7IGVtcHR5IG1hY3JvCi0JRU5ETQotCi0JU0JUCWFyZzEgCi0gICAgICAgIFNCVCAgICAgYXJnMiAtIG9uZSB0d3cKLSAgICAgICAgU0JUICAgICBhcmczIC0gb25lIHR3byB0aHJlZQotICAgICAgICBTQlQgICAgIGFyZzQgLSBvbmUgdHdvIHRocmVlIGZvdXIKLSAgICAgICAgU0JUICAgICBhcmc1IC0gb25lIHR3byB0aHJlZSBmb3VyIGZpdmUKLSAgICAgICAgU0JUICAgICBhcmc2IC0gb25lIHR3byAodGhyZWUpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXF1LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXF1LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZjlhODYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2VxdS5kCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jbm06IC0tZXh0ZXJuLW9ubHkKLSNuYW1lOiBNUkkgRVFVCi0jYXM6IC1NCi0KLSMgVGVzdCB0aGUgTVJJIEVRVSBkaXJlY3RpdmUKLQotMCo0IEEgU1lNQk9MCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXF1LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXF1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NTEyYTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2VxdS5zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIFRlc3QgdGhlIE1SSSBFUVUgZGlyZWN0aXZlCi0JWERFRglTWU1CT0wKLVNZTUJPTAlFUVUJNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2V4cHIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9leHByLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZGVlNGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2V4cHIuZAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSNubTogLS1leHRlcm4tb25seQotI25hbWU6IE1SSSBleHByZXNzaW9ucwotI2FzOiAtTQotCi0jIFRlc3QgZXhwcmVzc2lvbnMgaW4gTVJJIG1vZGUKLQotMDAqIEEgczEKLTAwKjEyIEEgczIKLTAwKjYgQSBzMwotKDAwMDAwMDAwKT9mZiogQSBzNAotMDAqIEEgczUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9leHByLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXhwci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzY3N2MxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9leHByLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTsgVGVzdCBleHByZXNzaW9ucyBpbiBNUkkgbW9kZQotCXhkZWYJczEsczIsczMsczQsczUKLXMxCWVxdQkxPjIKLXMyCWVxdQkzPDwxKjMKLXMzCWVxdQk1ISEzCi1zNAllcXUJIjAKLXM1CWVxdQkoMT49MikhKDE8PjEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZmxvYXQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mbG9hdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWE2MjdhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mbG9hdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI29iamNvcHk6IC1PIHNyZWMKLSNuYW1lOiBNUkkgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzCi0jYXM6IC1NCi0KLSMgVGVzdCBNUkkgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzCi0KLVMwLioKLVMxMTguLi4uKDEyMzQ1Njc4OUFCQ0RFRjAzRjgwMDAwMDQxMjAwMDAwNDEyMDAwMDA0Mil8KEYwREVCQzlBNzg1NjM0MTIwMDAwODAzRjAwMDAyMDQxMDAwMDIwNDEwMCkuKgotUzEwLi4uLi4oQzgwMDAwKXwoMDBDODQyKS4qCi0jcGFzcwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zsb2F0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZmxvYXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3ZjljNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZmxvYXQucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotOyBUZXN0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cyBpbiBNUkkgbW9kZS4KLQotCWRjLmQJOjEyMzRfNTY3OF85YWJjX2RlZjAKLQlkYy5zCTEuMAotCWRjLnMJMWUxCi0JZGMucwkxX2VfMQotCWRjLnMJMUUyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZm9yLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZm9yLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NWZiOTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zvci5kCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IE1SSSBzdHJ1Y3R1cmVkIGZvcgotI2FzOiAtTQotCi0jIFRlc3QgTVJJIHN0cnVjdHVyZWQgZm9yIHBzZXVkby1vcC4KLQotLio6ICAgICBmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAgPGZvbz4gY2xydyAlZDEKLTArMDAyIDxmb29cKygweHwpMj4gbW92ZXcgIzEsJWQwCi0wKzAwNiA8Zm9vXCsoMHh8KTY+IGNtcGl3ICMxMCwlZDAKLTArMDBhIDxmb29cKygweHwpYT4gYmx0cyAwKzAxNiA8Zm9vXCsoMHh8KTE2PgotMCswMGMgPGZvb1wrKDB4fCljPiBhZGR3ICVkMCwlZDEKLTArMDBlIDxmb29cKygweHwpZT4gYnZjcyAwKzAxMiA8Zm9vXCsoMHh8KTEyPgotMCswMTAgPGZvb1wrKDB4fCkxMD4gYnJhcyAwKzAxNiA8Zm9vXCsoMHh8KTE2PgotMCswMTIgPGZvb1wrKDB4fCkxMj4gYWRkcXcgIzIsJWQwCi0wKzAxNCA8Zm9vXCsoMHh8KTE0PiBicmFzIDArMDA2IDxmb29cKygweHwpNj4KLTArMDE2IDxmb29cKygweHwpMTY+IGNscncgJWQxCi0wKzAxOCA8Zm9vXCsoMHh8KTE4PiBtb3ZldyAjMTAsJWQwCi0wKzAxYyA8Zm9vXCsoMHh8KTFjPiBjbXBpdyAjMSwlZDAKLTArMDIwIDxmb29cKygweHwpMjA+IGJndHMgMCswMzAgPGZvb1wrKDB4fCkzMD4KLTArMDIyIDxmb29cKygweHwpMjI+IGNtcGl3ICMxMDAsJWQxCi0wKzAyNiA8Zm9vXCsoMHh8KTI2PiBiZ3RzIDArMDJhIDxmb29cKygweHwpMmE+Ci0wKzAyOCA8Zm9vXCsoMHh8KTI4PiBicmFzIDArMDJjIDxmb29cKygweHwpMmM+Ci0wKzAyYSA8Zm9vXCsoMHh8KTJhPiBhZGR3ICVkMCwlZDEKLTArMDJjIDxmb29cKygweHwpMmM+IHN1YnF3ICMxLCVkMAotMCswMmUgPGZvb1wrKDB4fCkyZT4gYnJhcyAwKzAxYyA8Zm9vXCsoMHh8KTFjPgotMCswMzAgPGZvb1wrKDB4fCkzMD4gbm9wCi0wKzAzMiA8Zm9vXCsoMHh8KTMyPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mb3IucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mb3IucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUyNDcyNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZm9yLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi07IFRlc3QgTVJJIHN0cnVjdHVyZWQgZm9yIHBzZXVkby1vcC4KLQotCXhkZWYJZm9vCi1mb28KLQljbHIgZDEKLQlmb3IgZDAgPSAjMSB0byAjMTAgYnkgIzIgZG8KLQkgIGFkZCBkMCxkMSBhcmJpdHJhcnkgdGV4dCAnaW4gY29tbWVudCBmaWVsZAotCSAgaWYgPHZzPiB0aGVuCi0JICAgIGJyZWFrCi0JICBlbmRpCi0JZW5kZgotCi0JY2xyIGQxCi0JZm9yIGQwID0gIzEwIGRvd250byAjMSBkbwotCSAgaWYgZDEgPGdlPiAjMTAwIHRoZW4KLQkgICAgbmV4dAotCSAgZW5kaQotCSAgYWRkIGQwLGQxCi0JZW5kZgotCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaWYuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9pZi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzI5NzJjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9pZi5kCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IE1SSSBzdHJ1Y3R1cmVkIGlmCi0jYXM6IC1NCi0KLSMgVGVzdCBNUkkgc3RydWN0dXJlZCBpZiBwc2V1ZG8tb3AuCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IGNtcHcgJWQxLCVkMAotMCswMDIgPGZvb1wrKDB4fCkyPiBibGVzIDArMDE0IDxmb29cKygweHwpMTQ+Ci0wKzAwNCA8Zm9vXCsoMHh8KTQ+IGNtcHcgJWQyLCVkMAotMCswMDYgPGZvb1wrKDB4fCk2PiBibGVzIDArMDE0IDxmb29cKygweHwpMTQ+Ci0wKzAwOCA8Zm9vXCsoMHh8KTg+IGNtcHcgJWQxLCVkMgotMCswMGEgPGZvb1wrKDB4fClhPiBibGVzIDArMDEwIDxmb29cKygweHwpMTA+Ci0wKzAwYyA8Zm9vXCsoMHh8KWM+IG1vdmV3ICVkMSwlZDMKLTArMDBlIDxmb29cKygweHwpZT4gYnJhcyAwKzAxMiA8Zm9vXCsoMHh8KTEyPgotMCswMTAgPGZvb1wrKDB4fCkxMD4gbW92ZXcgJWQyLCVkMwotMCswMTIgPGZvb1wrKDB4fCkxMj4gYnJhcyAwKzAxZSA8Zm9vXCsoMHh8KTFlPgotMCswMTQgPGZvb1wrKDB4fCkxND4gY21wdyAlZDAsJWQxCi0wKzAxNiA8Zm9vXCsoMHh8KTE2PiBiZ3RzIDArMDFjIDxmb29cKygweHwpMWM+Ci0wKzAxOCA8Zm9vXCsoMHh8KTE4PiBjbXB3ICVkMCwlZDIKLTArMDFhIDxmb29cKygweHwpMWE+IGJsZXMgMCswMWUgPGZvb1wrKDB4fCkxZT4KLTArMDFjIDxmb29cKygweHwpMWM+IG1vdmV3ICVkMCwlZDMKLTArMDFlIDxmb29cKygweHwpMWU+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2lmLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaWYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0NmJlOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaWYucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTsgVGVzdCBNUkkgc3RydWN0dXJlZCBpZiBwc2V1ZG8tb3AuCi0KLQl4ZGVmCWZvbwotZm9vCi0JaWYgZDEgPGd0PiBkMCBhbmQgZDIgPGd0PiBkMCB0aGVuCi0JICBpZiBkMSA8Z3Q+IGQyIHRoZW4KLQkgICAgbW92ZSBkMSxkMwotCSAgZWxzZQotCSAgICBtb3ZlIGQyLGQzCi0JICBlbmRpCi0JZWxzZQotCSAgaWYgZDAgPGd0PiBkMSBvciBkMCA8Z3Q+IGQyIHRoZW4KLQkgICAgbW92ZSBkMCxkMwotCSAgZW5kaQotCWVuZGkKLQotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2ltbWNvbnN0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaW1tY29uc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyZGExMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaW1tY29uc3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBNUkkgaW1tZWRpYXRlIGNvbnN0YW50cwotI2FzOiAtTQotI3NvdXJjZTogY29uc3RhbnRzLnMKLQotIyBUZXN0IE1SSSBpbW1lZGlhdGUgY29uc3RhbnRzCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IG1vdmVxICMxMCwlZDAKLTArMDAyIDxmb29cKygweHwpMj4gbW92ZXEgIzEwLCVkMAotMCswMDQgPGZvb1wrKDB4fCk0PiBtb3ZlcSAjMTAsJWQwCi0wKzAwNiA8Zm9vXCsoMHh8KTY+IG1vdmVxICMxMCwlZDAKLTArMDA4IDxmb29cKygweHwpOD4gbW92ZXEgIzEwLCVkMAotMCswMGEgPGZvb1wrKDB4fClhPiBtb3ZlcSAjMTAsJWQwCi0wKzAwYyA8Zm9vXCsoMHh8KWM+IG1vdmVxICMxMCwlZDAKLTArMDBlIDxmb29cKygweHwpZT4gbW92ZXEgIzEwLCVkMAotMCswMTAgPGZvb1wrKDB4fCkxMD4gbW92ZXEgIzEwLCVkMAotMCswMTIgPGZvb1wrKDB4fCkxMj4gbW92ZXEgIzk3LCVkMAotMCswMTQgPGZvb1wrKDB4fCkxND4gbW92ZXEgIzk3LCVkMAotMCswMTYgPGZvb1wrKDB4fCkxNj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbGFiZWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9sYWJlbC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2U1ODU4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9sYWJlbC5kCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jbm06IC0tZXh0ZXJuLW9ubHkKLSNuYW1lOiBNUkkgbGFiZWwKLSNhczogLU0KLQotIyBUZXN0IHVzaW5nIGFuIE1SSSBzdHlsZSBsYWJlbAotCi0wMDAwKiBUIExBQkVMCi1bIAldKlUgU1lNQk9MCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbGFiZWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9sYWJlbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDVlYzJhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9sYWJlbC5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi07IFRlc3QgdXNpbmcgYW4gTVJJIHN0eWxlIGxhYmVsCi0qIEFsc28gdGVzdCBNUkkgc3R5bGUgY29tbWVudHMKLSEgQW5kIGFub3RoZXIgY29tbWVudAotCVhERUYJTEFCRUwKLUxBQkVMCURDLkwJU1lNQk9MCQk7IEFuZCB5ZXQgYW5vdGhlciBjb21tZW50CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbW92ZW1sLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbW92ZW1sLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMzZmYTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL21vdmVtbC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogTVJJIG1vdmVtbAotI2FzOiAtTQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDwudGV4dD46Ci0gICAwOgk0Y2RmIDA3ZmMgICAgICAJbW92ZW1sICVzcEBcKywlZDItJWEyCi0gICA0Ogk0Y2RmIDA3ZmMgICAgICAJbW92ZW1sICVzcEBcKywlZDItJWEyCi0gICA4Ogk0OGY5IDA3ZmMgMDAwMCAJbW92ZW1sICVkMi0lYTIsMCA8LnRleHQ+Ci0gICBlOgkwMDAwIAotICAxMDoJNDhmOSAwN2ZjIDAwMDAgCW1vdmVtbCAlZDItJWEyLDAgPC50ZXh0PgotICAxNjoJMDAwMCAKLSAgMTg6CTRjZjkgMDdmYyAwMDAwIAltb3ZlbWwgMCA8LnRleHQ+LCVkMi0lYTIKLSAgMWU6CTAwMDAgCi0gIDIwOgk0Y2Y5IDA3ZmMgMDAwMCAJbW92ZW1sIDAgPC50ZXh0PiwlZDItJWEyCi0gIDI2OgkwMDAwIAotICAyODoJNGNmOSAwN2ZjIDAwMDEgCW1vdmVtbCAxNjAwMCA8ZmRzYT4sJWQyLSVhMgotICAyZToJNjAwMCAKLSAgMzA6CTRjZjkgMDdmYyAwMDAxIAltb3ZlbWwgMTYwMDAgPGZkc2E+LCVkMi0lYTIKLSAgMzY6CTYwMDAgCi0gIDM4Ogk0OGY5IDA3ZmMgMDAwMSAJbW92ZW1sICVkMi0lYTIsMTYwMDAgPGZkc2E+Ci0gIDNlOgk2MDAwIAotICA0MDoJNDhmOSAwN2ZjIDAwMDEgCW1vdmVtbCAlZDItJWEyLDE2MDAwIDxmZHNhPgotICA0NjoJNjAwMCAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tb3ZlbWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tb3ZlbWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhmYzcyOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbW92ZW1sLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1hc2RmCXJlZwlhMC1hMi9kMi1kNwotZmRzYQllcXUJJDE2MDAwCi0KLQltb3ZlbS5sCShzcCkrLGEwLWEyL2QyLWQ3Ci0JbW92ZW0ubAkoc3ApKyxhc2RmCi0JCi0JbW92ZW0ubCBhMC1hMi9kMi1kNyxzeW1ib2wKLQltb3ZlbS5sCWFzZGYsc3ltYm9sCi0KLQltb3ZlbS5sIHN5bWJvbCxhMC1hMi9kMi1kNwotCW1vdmVtLmwJc3ltYm9sLGFzZGYKLQotCW1vdmVtLmwgZmRzYSxhMC1hMi9kMi1kNwotCW1vdmVtLmwJZmRzYSxhc2RmCi0KLQltb3ZlbS5sIGEwLWEyL2QyLWQ3LGZkc2EKLQltb3ZlbS5sCWFzZGYsZmRzYQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL21yaS5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbXJpLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmY2RlZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbXJpLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMKLSMgVGVzdCB0aGUgbTY4ayBNUkkgY29tcGF0aWJpbGl0eSBtb2RlLgotIwotIyBJIG9yaWdpbmFsbHkgdGhvdWdodCB0aGF0IG1vc3Qgb2YgdGVzdHMgYXBwbGllZCB0byBhbnkgTVJJCi0jIGFzc2VtYmxlciwgYnV0IGl0IHR1cm5zIG91dCB0aGF0IGRpZmZlcmVudCBNUkkgYXNzZW1ibGVycyB1c2UKLSMgZGlmZmVyZW50IHN5bnRheGVzLgotIwotCi1pZiAhW2lzdGFyZ2V0ICJtNjgqLSotKiJdIHsKLSAgICByZXR1cm4KLX0KLQotcnVuX2R1bXBfdGVzdCBsYWJlbAotcnVuX2R1bXBfdGVzdCBlcXUKLXJ1bl9kdW1wX3Rlc3QgY29uc3RhbnRzCi1ydW5fZHVtcF90ZXN0IGltbWNvbnN0Ci1ydW5fZHVtcF90ZXN0IGZsb2F0Ci1ydW5fZHVtcF90ZXN0IGNoYXIKLXJ1bl9kdW1wX3Rlc3QgZXhwcgotcnVuX2R1bXBfdGVzdCBjb21tb24KLXJ1bl9kdW1wX3Rlc3QgY29tbWVudAotZ2FzX3Rlc3QgImVtcHR5LnMiICItTSIgIiIgIk1SSSBlbXB0eSBtYWNybyIKLXJ1bl9kdW1wX3Rlc3QgZm9yCi1ydW5fZHVtcF90ZXN0IGlmCi1ydW5fZHVtcF90ZXN0IHJlcGVhdAotcnVuX2R1bXBfdGVzdCB3aGlsZQotcnVuX2R1bXBfdGVzdCBzZW1pCi1ydW5fZHVtcF90ZXN0IG1vdmVtbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3JlcGVhdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3JlcGVhdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2M1ZjYzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9yZXBlYXQuZAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBNUkkgc3RydWN0dXJlZCByZXBlYXQKLSNhczogLU0KLQotIyBUZXN0IE1SSSBzdHJ1Y3R1cmVkIHJlcGVhdCBwc2V1ZG8tb3AuCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IGJjY3MgMCswMDAgPGZvbz4KLTArMDAyIDxmb29cKygweHwpMj4gY2xydyAlZDEKLTArMDA0IDxmb29cKygweHwpND4gYWRkcXcgIzEsJWQxCi0wKzAwNiA8Zm9vXCsoMHh8KTY+IGNtcGl3ICMxMCwlZDEKLTArMDBhIDxmb29cKygweHwpYT4gYmd0cyAwKzAwNCA8Zm9vXCsoMHh8KTQ+Ci0wKzAwYyA8Zm9vXCsoMHh8KWM+IG5vcAotMCswMGUgPGZvb1wrKDB4fCllPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9yZXBlYXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9yZXBlYXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU0ZWEyYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvcmVwZWF0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi07IFRlc3QgTVJJIHN0cnVjdHVyZWQgcmVwZWF0IHBzZXVkby1vcC4KLQotCXhkZWYJZm9vCi1mb28KLQlyZXBlYXQKLQl1bnRpbAk8Y3M+Ci0KLQljbHIgZDEKLQlyZXBlYXQKLQkgIGFkZCAjMSxkMQotCXVudGlsIGQxIDxnZT4gIzEwCi0KLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9zZW1pLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvc2VtaS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGVjY2UxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9zZW1pLmQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSNvYmpkdW1wOiAtcyAtaiAudGV4dAotI25hbWU6IE1SSSBzZW1pCi0jYXM6IC1NCi0KLS4qOiAuKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIC50ZXh0OgotIDAwMDAgM2IyMDNiMjAgM2EyMDNhMjAgMDAwMDAwMDAgMDAwMDAwMDAgIDsgOyA6IDogLi4uLi4uLi4KLSAwMDEwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvc2VtaS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3NlbWkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzMDY3Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvc2VtaS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotc2VtaWNvbG9uICBtYWNybwotCWRjLmIgICAgJzsgJwotCWVuZG0KLQotY29sb24JICAgIG1hY3JvCi0JZGMuYiAgICAnOiAnCi0JZW5kbQotCi0Jc2VtaWNvbG9uCi0JZGMuYgknOyAnCi0JY29sb24KLQlkYy5iCSc6ICcKLQotCXAyYWxpZ24JNQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3doaWxlLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvd2hpbGUuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkZDM3YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvd2hpbGUuZAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBNUkkgc3RydWN0dXJlZCB3aGlsZQotI2FzOiAtTQotCi0jIFRlc3QgTVJJIHN0cnVjdHVyZSB3aGlsZSBwc2V1ZG8tb3AuCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IGJjY3MgMCswMDQgPGZvb1wrKDB4fCk0PgotMCswMDIgPGZvb1wrKDB4fCkyPiBicmFzIDArMDAwIDxmb28+Ci0wKzAwNCA8Zm9vXCsoMHh8KTQ+IGNscncgJWQxCi0wKzAwNiA8Zm9vXCsoMHh8KTY+IGNtcGl3ICMxMCwlZDEKLTArMDBhIDxmb29cKygweHwpYT4gYmx0cyAwKzAxMCA8Zm9vXCsoMHh8KTEwPgotMCswMGMgPGZvb1wrKDB4fCljPiBhZGRxdyAjMSwlZDEKLTArMDBlIDxmb29cKygweHwpZT4gYnJhcyAwKzAwNiA8Zm9vXCsoMHh8KTY+Ci0wKzAxMCA8Zm9vXCsoMHh8KTEwPiBub3AKLTArMDEyIDxmb29cKygweHwpMTI+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3doaWxlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvd2hpbGUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjYmRiYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvd2hpbGUucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTsgVGVzdCBNUkkgc3RydWN0dXJlZCB3aGlsZSBwc2V1ZG8tb3AuCi0KLQl4ZGVmCWZvbwotZm9vCi0Jd2hpbGUgPGNzPiBkbwotCWVuZHcKLQotCWNsciBkMQotCXdoaWxlIGQxIDxsZT4gIzEwIGRvCi0JICBhZGQgIzEsZDEKLQllbmR3Ci0KLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhhYWI1NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvYXN0ZXN0LmQKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jb2JqZHVtcDogLURyCi0jbmFtZTogUG93ZXJQQyB0ZXN0IDEKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1wb3dlcnBjCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC50ZXh0OgotCi0wKzAwMDAwMDAgPGZvbz46Ci0gICAwOgk2MCAwMCAwMCAwMCAJbm9wCi0gICA0Ogk2MCAwMCAwMCAwMCAJbm9wCi0gICA4Ogk2MCAwMCAwMCAwMCAJbm9wCi0KLTArMDAwMDAwYyA8YT46Ci0gICBjOgk0OCAwMCAwMCAwNCAJYgkxMCA8YXBmb3VyPgotCi0wKzAwMDAwMTAgPGFwZm91cj46Ci0gIDEwOgk0OCAwMCAwMCAwOCAJYgkxOCA8YXBmb3VyXCsweDg+Ci0gIDE0Ogk0OCAwMCAwMCAwMCAJYgkxNCA8YXBmb3VyXCsweDQ+Ci0JCQkxNDogUl9QUENfUkVMMjQJeAotICAxODoJNDggMDAgMDAgMDQgCWIJMWMgPGFwZm91clwrMHhjPgotCQkJMTg6IFJfUFBDX1JFTDI0CVwuZGF0YVwrMHg0Ci0gIDFjOgk0OCAwMCAwMCAwMCAJYgkxYyA8YXBmb3VyXCsweGM+Ci0JCQkxYzogUl9QUENfUkVMMjQJegotICAyMDoJNDggMDAgMDAgMTQgCWIJMzQgPGFwZm91clwrMHgyND4KLQkJCTIwOiBSX1BQQ19SRUwyNAl6XCsweDE0Ci0gIDI0Ogk0OCAwMCAwMCAwNCAJYgkyOCA8YXBmb3VyXCsweDE4PgotICAyODoJNDggMDAgMDAgMDAgCWIJMjggPGFwZm91clwrMHgxOD4KLQkJCTI4OiBSX1BQQ19SRUwyNAlhCi0gIDJjOgk0YiBmZiBmZiBlNCAJYgkxMCA8YXBmb3VyPgotICAzMDoJNDggMDAgMDAgMDQgCWIJMzQgPGFwZm91clwrMHgyND4KLQkJCTMwOiBSX1BQQ19SRUwyNAlhXCsweDQKLSAgMzQ6CTRiIGZmIGZmIGUwIAliCTE0IDxhcGZvdXJcKzB4ND4KLSAgMzg6CTQ4IDAwIDAwIDAwIAliCTM4IDxhcGZvdXJcKzB4Mjg+Ci0JCQkzODogUl9QUENfTE9DQUwyNFBDCWEKLSAgM2M6CTRiIGZmIGZmIGQ0IAliCTEwIDxhcGZvdXI+Ci0KLSAgNDA6CTAwIDAwIDAwIDQwIAlcLmxvbmcgMHg0MAotCQkJNDA6IFJfUFBDX0FERFIzMglcLnRleHRcKzB4NDAKLQotICA0NDoJMDAgMDAgMDAgNGMgCVwubG9uZyAweDRjCi0JCQk0NDogUl9QUENfQUREUjMyCVwudGV4dFwrMHg0YwotICA0ODoJMDAgMDAgMDAgMDAgCVwubG9uZyAweDAKLQkJCTQ4OiBSX1BQQ19SRUwzMgl4Ci0gIDRjOgkwMCAwMCAwMCAwNCAJXC5sb25nIDB4NAotCQkJNGM6IFJfUFBDX1JFTDMyCXhcKzB4NAotCVwuXC5cLgotCQkJNTA6IFJfUFBDX1JFTDMyCXoKLQkJCTU0OiBSX1BQQ19SRUwzMgl5Ci0JCQk1ODogUl9QUENfQUREUjMyCXgKLQkJCTVjOiBSX1BQQ19BRERSMzIJeQotCQkJNjA6IFJfUFBDX0FERFIzMgl6Ci0gIDY0OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotCQkJNjQ6IFJfUFBDX0FERFIzMgl4XCsweGYrZmZmZmZmYwotICA2ODoJZmYgZmYgZmYgZmMgCWZubXN1YglmMzEsZjMxLGYzMSxmMzEKLQkJCTY4OiBSX1BQQ19BRERSMzIJeVwrMHhmK2ZmZmZmZmMKLSAgNmM6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCi0JCQk2YzogUl9QUENfQUREUjMyCXpcKzB4ZitmZmZmZmZjCi0gIDcwOglmZiBmZiBmZiA5YyAJXC5sb25nIDB4ZmZmZmZmOWMKLSAgNzQ6CWZmIGZmIGZmIDljIAlcLmxvbmcgMHhmZmZmZmY5YwotCVwuXC5cLgotCQkJNzg6IFJfUFBDX0FERFIzMglhCi0JCQk3YzogUl9QUENfQUREUjMyCWIKLQkJCTgwOiBSX1BQQ19BRERSMzIJYXBmb3VyCi0gIDg0OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotICA4ODoJMDAgMDAgMDAgMDIgCVwubG9uZyAweDIKLQkJCTg4OiBSX1BQQ19BRERSMzIJYXBmb3VyXCsweDIKLSAgOGM6CTAwIDAwIDAwIDAwIAlcLmxvbmcgMHgwCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwuZGF0YToKLQotMCswMDAwMDAwIDx4PjoKLSAgIDA6CTAwIDAwIDAwIDAwIAlcLmxvbmcgMHgwCi0KLTArMDAwMDAwNCA8eT46Ci0gICA0OgkwMCAwMCAwMCAwMCAJXC5sb25nIDB4MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWFmMjE2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QucworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLQkuc2VjdGlvbiAiLmRhdGEiCi0JLmdsb2JsIHgKLQkuZ2xvYmwgegoteDoJLmxvbmcgMAotegk9IC4gKyA0Ci1mb3VyCT0geiAtIHggLSA0Ci15OgkubG9uZyAwCi0JCi0JLnNlY3Rpb24gIi50ZXh0IgotZm9vOgkKLQlub3AgOyBub3AgOyBub3AKLQkuZ2xvYmwgYQotYToJYiAuKzQKLWI6CWIgLis4Ci0JYiB4Ci0JYiB5Ci0JYiB6Ci0JYiB6KzIwCi0JYiAuK2ZvdXIKLQliIGEKLQliIGIKLQliIGErNAotCWIgYis0Ci0JYiBhQGxvY2FsCi0JYiBiQGxvY2FsCi0JLmxvbmcgLgotCS5sb25nIC4rOAotCS5sb25nIHgtLgotCS5sb25nIHgrNC0uCi0JLmxvbmcgei0uCi0JLmxvbmcgeS0uCi0JLmxvbmcgeAotCS5sb25nIHkKLQkubG9uZyB6Ci0JLmxvbmcgeC1mb3VyCi0JLmxvbmcgeS1mb3VyCi0JLmxvbmcgei1mb3VyCi0JLmxvbmcgYS0uCi0JLmxvbmcgYi0uCi0JLmxvbmcgYQotCS5sb25nIGIKLQotYXBmb3VyCT0gYSArIGZvdXIKLQkubG9uZyBhcGZvdXIKLQkubG9uZyBhLWFwZm91cgotCS5sb25nIGFwZm91cisyCi0JLmxvbmcgYXBmb3VyLWIKLQotCS50eXBlCWZvbyxAZnVuY3Rpb24KLQkudHlwZQlhLEBmdW5jdGlvbgotCS50eXBlCWIsQGZ1bmN0aW9uCi0JLnR5cGUJYXBmb3VyLEBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdDIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MGUzYmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdDIuZAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSNvYmpkdW1wOiAtRHIKLSNuYW1lOiBQb3dlclBDIHRlc3QgMgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLXBvd2VycGMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAwMDAwIDxmb28+OgotICAgMDoJNjAgMDAgMDAgMDAgCW5vcAotICAgNDoJNjAgMDAgMDAgMDAgCW5vcAotICAgODoJNjAgMDAgMDAgMDAgCW5vcAotICAgYzoJNDggMDAgMDAgMDQgCWIJMTAgPGZvb1wrMHgxMD4KLSAgMTA6CTQ4IDAwIDAwIDA4IAliCTE4IDxmb29cKzB4MTg+Ci0gIDE0Ogk0OCAwMCAwMCAwMCAJYgkxNCA8Zm9vXCsweDE0PgotCQkJMTQ6IFJfUFBDX1JFTDI0CXgKLSAgMTg6CTQ4IDAwIDAwIDA0IAliCTFjIDxmb29cKzB4MWM+Ci0JCQkxODogUl9QUENfUkVMMjQJLmRhdGFcKzB4NAotICAxYzoJNDggMDAgMDAgMDAgCWIJMWMgPGZvb1wrMHgxYz4KLQkJCTFjOiBSX1BQQ19SRUwyNAl6Ci0gIDIwOgk0OCAwMCAwMCAxNCAJYgkzNCA8Zm9vXCsweDM0PgotCQkJMjA6IFJfUFBDX1JFTDI0CXpcKzB4MTQKLSAgMjQ6CTQ4IDAwIDAwIDA0IAliCTI4IDxmb29cKzB4Mjg+Ci0gIDI4Ogk0OCAwMCAwMCAwMCAJYgkyOCA8Zm9vXCsweDI4PgotCQkJMjg6IFJfUFBDX1JFTDI0CWEKLSAgMmM6CTQ4IDAwIDAwIDUwIAliCTdjIDxhcGZvdXI+Ci0gIDMwOgk0OCAwMCAwMCAwNCAJYgkzNCA8Zm9vXCsweDM0PgotCQkJMzA6IFJfUFBDX1JFTDI0CWFcKzB4NAotICAzNDoJNDggMDAgMDAgNGMgCWIJODAgPGFwZm91clwrMHg0PgotICAzODoJNDggMDAgMDAgMDAgCWIJMzggPGZvb1wrMHgzOD4KLQkJCTM4OiBSX1BQQ19MT0NBTDI0UEMJYQotICAzYzoJNDggMDAgMDAgNDAgCWIJN2MgPGFwZm91cj4KLQotICA0MDoJMDAgMDAgMDAgNDAgCS5sb25nIDB4NDAKLQkJCTQwOiBSX1BQQ19BRERSMzIJLnRleHRcKzB4NDAKLQotICA0NDoJMDAgMDAgMDAgNGMgCS5sb25nIDB4NGMKLQkJCTQ0OiBSX1BQQ19BRERSMzIJLnRleHRcKzB4NGMKLSAgNDg6CTAwIDAwIDAwIDAwIAkubG9uZyAweDAKLQkJCTQ4OiBSX1BQQ19SRUwzMgl4Ci0gIDRjOgkwMCAwMCAwMCAwNCAJLmxvbmcgMHg0Ci0JCQk0YzogUl9QUENfUkVMMzIJeFwrMHg0Ci0JLi4uCi0JCQk1MDogUl9QUENfUkVMMzIJegotCQkJNTQ6IFJfUFBDX1JFTDMyCXkKLQkJCTU4OiBSX1BQQ19BRERSMzIJeAotCQkJNWM6IFJfUFBDX0FERFIzMgl5Ci0JCQk2MDogUl9QUENfQUREUjMyCXoKLSAgNjQ6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCi0JCQk2NDogUl9QUENfQUREUjMyCXhcKzB4ZitmZmZmZmZjCi0gIDY4OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotCQkJNjg6IFJfUFBDX0FERFIzMgl5XCsweGYrZmZmZmZmYwotICA2YzoJZmYgZmYgZmYgZmMgCWZubXN1YglmMzEsZjMxLGYzMSxmMzEKLQkJCTZjOiBSX1BQQ19BRERSMzIJelwrMHhmK2ZmZmZmZmMKLSAgNzA6CTAwIDAwIDAwIDA4IAkubG9uZyAweDgKLSAgNzQ6CTAwIDAwIDAwIDA4IAkubG9uZyAweDgKLQotMCswMDAwMDc4IDxhPjoKLSAgNzg6CTAwIDAwIDAwIDAwIAkubG9uZyAweDAKLQkJCTc4OiBSX1BQQ19BRERSMzIJYQotCi0wKzAwMDAwN2MgPGFwZm91cj46Ci0JLi4uCi0JCQk3YzogUl9QUENfQUREUjMyCWIKLQkJCTgwOiBSX1BQQ19BRERSMzIJYXBmb3VyCi0gIDg0OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotICA4ODoJMDAgMDAgMDAgMDIgCS5sb25nIDB4MgotCQkJODg6IFJfUFBDX0FERFIzMglhcGZvdXJcKzB4MgotICA4YzoJMDAgMDAgMDAgMDAgCS5sb25nIDB4MAotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAuZGF0YToKLQotMCswMDAwMDAwIDx4PjoKLSAgIDA6CTAwIDAwIDAwIDAwIAkubG9uZyAweDAKLQotMCswMDAwMDA0IDx5PjoKLSAgIDQ6CTAwIDAwIDAwIDAwIAkubG9uZyAweDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvYXN0ZXN0Mi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWYyMjMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi1mb3VyCT0gNAotCS5zZWN0aW9uICIudGV4dCIKLWZvbzoJCi0Jbm9wIDsgbm9wIDsgbm9wCi0JLmdsb2JsIGEKLQliIC4rNAotCWIgLis4Ci0JYiB4Ci0JYiB5Ci0JYiB6Ci0JYiB6KzIwCi0JYiAuK2ZvdXIKLQliIGEKLQliIGIKLQliIGErNAotCWIgYis0Ci0JYiBhQGxvY2FsCi0JYiBiQGxvY2FsCi0JLmxvbmcgLgotCS5sb25nIC4rOAotCS5sb25nIHgtLgotCS5sb25nIHgrNC0uCi0JLmxvbmcgei0uCi0JLmxvbmcgeS0uCi0JLmxvbmcgeAotCS5sb25nIHkKLQkubG9uZyB6Ci0JLmxvbmcgeC1mb3VyCi0JLmxvbmcgeS1mb3VyCi0JLmxvbmcgei1mb3VyCi0JLmxvbmcgYS0uCi0JLmxvbmcgYi0uCi1hOgkubG9uZyBhCi1iOgkubG9uZyBiCi0KLWFwZm91cgk9IGEgKyBmb3VyCi0JLmxvbmcgYXBmb3VyCi0JLmxvbmcgYS1hcGZvdXIKLQkubG9uZyBhcGZvdXIrMgotCS5sb25nIGFwZm91ci1iCi0KLQkuc2VjdGlvbiAiLmRhdGEiCi0JLmdsb2JsIHgKLQkuZ2xvYmwgegoteDoJLmxvbmcgMAotegk9IC4gKyA0Ci15OgkubG9uZyAwCi0KLQkudHlwZQlmb28sQGZ1bmN0aW9uCi0JLnR5cGUJYSxAZnVuY3Rpb24KLQkudHlwZQliLEBmdW5jdGlvbgotCS50eXBlCWFwZm91cixAZnVuY3Rpb24KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9wcGMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3BwYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MmZiYzMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3BwYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jCi0jIFNvbWUgUG93ZXJQQyB0ZXN0cwotIwotCi0jIFRoZXNlIHRlc3RzIGFyZSBjdXJyZW50bHkgRUxGIHNwZWNpZmljLCBvbmx5IGJlY2F1c2Ugbm9ib2R5IGhhcwotIyBjb252ZXJ0ZWQgdGhlbSB0byBsb29rIGZvciBYQ09GRiByZWxvY2F0aW9ucy4KLQotaWYgeyBbaXN0YXJnZXQgcG93ZXJwYyotKi0qYnNkKl0gXAotICAgICB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1lbGYqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWVhYmkqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLXN5c3Y0Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1saW51eCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotc29sYXJpcypdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotcnRlbXMqXSB9IHRoZW4gewotICAgIHJ1bl9kdW1wX3Rlc3QgImFzdGVzdCIKLSAgICBydW5fZHVtcF90ZXN0ICJhc3Rlc3QyIgotfQotCi1pZiB7IFtpc3RhcmdldCBwb3dlcnBjKi0qLSpdIH0gdGhlbiB7Ci0gICBydW5fZHVtcF90ZXN0ICJzaW1wc2hmdCIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9zaW1wc2hmdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ODkzZDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jb2JqZHVtcDogLXMgLWogLnRleHQKLSNhczogLW1wcGM2NAotI25hbWU6IFBvd2VyUEMgdGVzdCAzLCBzaW1wbGlmaWVkIHNoaWZ0cwotCi0uKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIFwudGV4dDoKLSAwMDAwIDc4NjQwZmUwIDc4ODNmODBlIDc4YTU0NWU0IDc4NjQwMDIwICB4ZC4ueC4uLnguRS54ZC4gCi0gMDAxMCA1NDY0MGZmZSA1MDgzZjgwMCA1NGE1NDAyZSA1NDY0MDQzZSAgVGQuLlAuLi5ULkAuVGQuPgotIDAwMjAgNzg2NDAwMDQgNzg2NDA3ZTQgNzg2NGY4MDYgNzg2NGZmZTYgIHhkLi54ZC4ueGQuLnhkLi4KLSAwMDMwIDc4NjRmODQyIDc4NjRmZmUyIDc4NjQwMDBjIDc4NjQwODBjICB4ZC5CeGQuLnhkLi54ZC4uCi0gMDA0MCA3ODY0MGZhYyA3ODY0MDdlYyA3ODY0MDAwMCA3ODY0MDgwMCAgeGQuLnhkLi54ZC4ueGQuLgotIDAwNTAgNzg2NGY4MDIgNzg2NDAwMDAgNzg2NGY4MDIgNzg2NDA4MDAgIHhkLi54ZC4ueGQuLnhkLi4KLSAwMDYwIDc4NjUyMDEwIDc4NjQwN2U0IDc4NjRmODA2IDc4NjQwMDAwICB4ZSAueGQuLnhkLi54ZC4uCi0gMDA3MCA3ODY0Zjg0MiA3ODY0MGZlMCA3ODY0MDAwMCA3ODY0MDA0MCAgeGQuQnhkLi54ZC4ueGQuQAotIDAwODAgNzg2NDA3ZTAgNzg2NDA3ZTQgNzg2NDA3YTQgNzg2NDAwMDQgIHhkLi54ZC4ueGQuLnhkLi4KLSAwMDkwIDc4NjQwMDA4IDc4NjQwMDQ4IDc4NjQwN2U4IDc4NjQwZmE4ICB4ZC4ueGQuSHhkLi54ZC4uCi0gMDBhMCA3ODY0ZjgwYSA1NDY0MDAwMCA1NDY0MDAzZSA1NDY0ZjgwMCAgeGQuLlRkLi5UZC4+VGQuLgotIDAwYjAgNTQ2NGY4M2UgNTQ2NGY4N2UgNTQ2NGZmZmUgNTA2NDAwMDAgIFRkLj5UZC5+VGQuLlBkLi4KLSAwMGMwIDUwNjQwMDNlIDUwNjQwZmZlIDUwNjRmODAwIDUwNjQwMDNlICBQZC4+UGQuLlBkLi5QZC4+Ci0gMDBkMCA1MDY0MDdmZSA1NDY0MDAzZSA1NDY0MDgzZSA1NDY0ZjgzZSAgUGQuLlRkLj5UZC4+VGQuPgotIDAwZTAgNTQ2NDAwM2UgNTQ2NGY4M2UgNTQ2NDA4M2UgNWM2NTIwM2UgIFRkLj5UZC4+VGQuPlxcZSA+Ci0gMDBmMCA1NDY0MDAzZSA1NDY0MDgzYyA1NDY0ZjgwMCA1NDY0MDAzZSAgVGQuPlRkLjxUZC4uVGQuPgotIDAxMDAgNTQ2NGY4N2UgNTQ2NDBmZmUgNTQ2NDAwM2UgNTQ2NDAwN2UgIFRkLn5UZC4uVGQuPlRkLn4KLSAwMTEwIDU0NjQwN2ZlIDU0NjQwMDNlIDU0NjQwMDNjIDU0NjQwMDAwICBUZC4uVGQuPlRkLjxUZC4uCi0gMDEyMCA1NDY0MDAzZSA1NDY0MDA3ZSA1NDY0MDdmZSA1NDY0MGZiYyAgVGQuPlRkLn5UZC4uVGQuLgotIDAxMzAgNTQ2NGY4MDAgMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgIFRkLi4uLi4uICAgICAgICAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9zaW1wc2hmdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZmY5OGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotIyBUaGVzZSBhcmUgYWxsIHRoZSBleGFtcGxlcyBmcm9tIHNlY3Rpb24gRi40IG9mCi0jICJQb3dlclBDIE1pY3JvcHJvY2Vzc29yIEZhbWlseTogVGhlIFByb2dyYW1taW5nIEVudmlyb25tZW50cyIuCi0jIDY0LWJpdCBleGFtcGxlcwotCWV4dHJkaQklcjQsJXIzLDEsMAotCWluc3JkaQklcjMsJXI0LDEsMAotCXNsZGkJJXI1LCVyNSw4Ci0JY2xybGRpCSVyNCwlcjMsMzIKLSMgMzItYml0IGV4YW1wbGVzCi0JZXh0cndpCSVyNCwlcjMsMSwwCi0JaW5zcndpCSVyMywlcjQsMSwwCi0Jc2x3aQklcjUsJXI1LDgKLQljbHJsd2kJJXI0LCVyMywxNgotCi0KLSMgVGhlc2UgdGVzdCB0aGUgcmVtYWluaW5nIGNvcm5lciBjYXNlcyBmb3IgNjQtYml0IG9wZXJhdGlvbnMuCi0JZXh0bGRpCSVyNCwlcjMsMSwwCi0JZXh0bGRpCSVyNCwlcjMsNjQsMAotCWV4dGxkaQklcjQsJXIzLDEsNjMKLQlleHRsZGkJJXI0LCVyMyw2NCw2MyAgICAjIGJpdCB3ZWlyZCwgdGhhdCBvbmUuCi0JCi0JZXh0cmRpCSVyNCwlcjMsNjMsMAotCWV4dHJkaQklcjQsJXIzLDEsNjIKLQotCWluc3JkaQklcjQsJXIzLDY0LDAKLQlpbnNyZGkJJXI0LCVyMyw2MywwCi0JaW5zcmRpCSVyNCwlcjMsMSw2MgotCWluc3JkaQklcjQsJXIzLDEsNjMKLQotCXJvdGxkaQklcjQsJXIzLDAKLQlyb3RsZGkJJXI0LCVyMywxCi0Jcm90bGRpCSVyNCwlcjMsNjMKLQotCXJvdHJkaQklcjQsJXIzLDAKLQlyb3RyZGkJJXI0LCVyMywxCi0Jcm90cmRpCSVyNCwlcjMsNjMKLQotCXJvdGxkCSVyNSwlcjMsJXI0Ci0KLQlzbGRpCSVyNCwlcjMsMAotCXNsZGkJJXI0LCVyMyw2MwotCi0Jc3JkaQklcjQsJXIzLDAKLQlzcmRpCSVyNCwlcjMsMQotCXNyZGkJJXI0LCVyMyw2MwotCi0JY2xybGRpCSVyNCwlcjMsMAotCWNscmxkaQklcjQsJXIzLDEKLQljbHJsZGkJJXI0LCVyMyw2MwotCi0JY2xycmRpCSVyNCwlcjMsMAotCWNscnJkaQklcjQsJXIzLDEKLQljbHJyZGkJJXI0LCVyMyw2MwotCQotCWNscmxzbGRpCSVyNCwlcjMsMCwwCi0JY2xybHNsZGkJJXI0LCVyMywxLDAKLQljbHJsc2xkaQklcjQsJXIzLDYzLDAKLQljbHJsc2xkaQklcjQsJXIzLDYzLDEKLQljbHJsc2xkaQklcjQsJXIzLDYzLDYzCi0JCi0jIFRoZXNlIHRlc3QgdGhlIHJlbWFpbmluZyBjb3JuZXIgY2FzZXMgZm9yIDMyLWJpdCBvcGVyYXRpb25zLgotCWV4dGx3aQklcjQsJXIzLDEsMAotCWV4dGx3aQklcjQsJXIzLDMyLDAKLQlleHRsd2kJJXI0LCVyMywxLDMxCi0JZXh0bHdpCSVyNCwlcjMsMzIsMzEgICAgIyBiaXQgd2VpcmQsIHRoYXQgb25lLgotCQotCWV4dHJ3aQklcjQsJXIzLDMxLDAKLQlleHRyd2kJJXI0LCVyMywxLDMwCi0JCi0JaW5zbHdpCSVyNCwlcjMsMSwwCi0JaW5zbHdpCSVyNCwlcjMsMzIsMAotCWluc2x3aQklcjQsJXIzLDEsMzEKLQkKLQlpbnNyd2kJJXI0LCVyMywxLDAKLQlpbnNyd2kJJXI0LCVyMywzMiwwCi0JaW5zcndpCSVyNCwlcjMsMSwzMQotCQotCXJvdGx3aQklcjQsJXIzLDAKLQlyb3Rsd2kJJXI0LCVyMywxCi0Jcm90bHdpCSVyNCwlcjMsMzEKLQotCXJvdHJ3aQklcjQsJXIzLDAKLQlyb3Ryd2kJJXI0LCVyMywxCi0Jcm90cndpCSVyNCwlcjMsMzEKLQotCXJvdGx3CSVyNSwlcjMsJXI0Ci0KLQlzbHdpCSVyNCwlcjMsMAotCXNsd2kJJXI0LCVyMywxCi0Jc2x3aQklcjQsJXIzLDMxCi0KLQlzcndpCSVyNCwlcjMsMAotCXNyd2kJJXI0LCVyMywxCi0Jc3J3aQklcjQsJXIzLDMxCi0KLQljbHJsd2kJJXI0LCVyMywwCi0JY2xybHdpCSVyNCwlcjMsMQotCWNscmx3aQklcjQsJXIzLDMxCi0KLQljbHJyd2kJJXI0LCVyMywwCi0JY2xycndpCSVyNCwlcjMsMQotCWNscnJ3aQklcjQsJXIzLDMxCi0JCi0JY2xybHNsd2kJJXI0LCVyMywwLDAKLQljbHJsc2x3aQklcjQsJXIzLDEsMAotCWNscmxzbHdpCSVyNCwlcjMsMzEsMAotCWNscmxzbHdpCSVyNCwlcjMsMzEsMQotCWNscmxzbHdpCSVyNCwlcjMsMzEsMzEKLQotIyBGb3JjZSBhbGlnbm1lbnQgc28gdGhhdCB3ZSBwYXNzIHRoZSB0ZXN0IG9uIEFJWAotCS5wMmFsaWduCTMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NoL2Jhc2ljLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NoL2Jhc2ljLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBkYmIwYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zaC9iYXNpYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19mcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmcC5zOiBmbG9hdGluZyBwb2ludCB0ZXN0cyAoc2gzZSkiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJmcC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYwMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYwMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYwMDlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYwMEJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEYwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEYwMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEYxMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEYwOERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEYwOURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEYxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEYxMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEYxMDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEYxMDNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEYxMEVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEYxMDRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEYxMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEYwNERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEYwNURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEYwNkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEYwMkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEYwM0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJhIEYwMERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEYwMURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIDQzNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDQzNTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIDQzNkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDQzNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM2IDAzNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDQzNTJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNhIDAzNkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDQzNjJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTMxXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi0KLWlmIFtpc3RhcmdldCBzaCotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KLSAgICBkb19mcAotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc2gvZnAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NoL2ZwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MmQ4NjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc2gvZnAucworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLQkuZmlsZQkidGVzdC5jIgotCS5kYXRhCi0KLSEgSGl0YWNoaSBTSCBjYzEgKGN5Z251cy0yLjcuMS05NTA3MjgpIGFyZ3VtZW50czogLU8gLWZwZWVwaG9sZQotISAtZmZ1bmN0aW9uLWNzZSAtZnJlZy1zdHJ1Y3QtcmV0dXJuIC1mZGVsYXllZC1icmFuY2ggLWZjb21tb24gLWZnbnUtbGlua2VyCi0KLWdjYzJfY29tcGlsZWQuOgotX19fZ251X2NvbXBpbGVkX2M6Ci0JLnRleHQKLQkuYWxpZ24gMgotCS5nbG9iYWwJX2ZvbwotX2ZvbzoKLQlmbW92LnMJQHIwLGZyMAotCWZtb3YucwlmcjAsQHIwCi0JZm1vdi5zCUByMCssZnIwCi0JZm1vdi5zCWZyMCxALXIwCi0JZm1vdi5zCUAocjAscjApLGZyMAotCWZtb3YucwlmcjAsQChyMCxyMCkKLQlmbW92CWZyMCxmcjEKLQlmbGRpMAlmcjAKLQlmbGRpMQlmcjAKLQlmYWRkCWZyMCxmcjEKLQlmc3ViCWZyMCxmcjEKLQlmbXVsCWZyMCxmcjEKLQlmZGl2CWZyMCxmcjEKLQlmbWFjCWZyMCxmcjAsZnIxCi0JZmNtcC9lcQlmcjAsZnIxCi0JZmNtcC9ndAlmcjAsZnIxCi0JZm5lZwlmcjAKLQlmYWJzCWZyMAotCWZzcXJ0CWZyMAotCWZsb2F0CWZwdWwsZnIwCi0JZnRyYwlmcjAsZnB1bAotCWZzdHMJZnB1bCxmcjAKLQlmbGRzCWZyMCxmcHVsCi0JbGRzCXIzLGZwdWwKLQlsZHMubAlAcjMrLGZwdWwKLQlsZHMJcjMsZnBzY3IKLQlsZHMubAlAcjMrLGZwc2NyCi0Jc3RzCWZwdWwscjMKLQlzdHMubAlmcHVsLEAtcjMKLQlzdHMJZnBzY3IscjMKLQlzdHMubAlmcHNjcixALXIzCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4MzhjNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2FkZGVuZC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jCi0jIFNvbGFyaXMgb24gU1BBUkMgdGVzdHMKLSMKLQotaWYgW2lzdGFyZ2V0IHNwYXJjKi0qLXNvbGFyaXMyKl0gdGhlbiB7Ci0gICAgc2V0IHgxIDAKLSAgICBzZXQgeDIgMAotICAgIHNldCB4MyAwCi0gICAgc2V0IHg0IDAKLSAgICBzZXQgeDUgMAotICAgIHNldCB4NiAwCi0gICAgc2V0IHRlc3RuYW1lICJhZGRlbmRzIChwYXJ0IDIpIgotICAgIGlmIFtnYXNfdGVzdF9vbGQgImFkZGVuZC5zIiAiIiAiYWRkZW5kcyAocGFydCAxKSJdIHRoZW4gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCXdoaWxlIDEgewotCSAgICAjIFRoZXNlIGFyZSB3aGF0IHdlIGdldCB1c2luZyB0aGUgU29sYXJpcyBhc3NlbWJsZXIuCi0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiMDggUl9TUEFSQ19XRElTUDIyICtmb28xXFsrXF0rMHgwKzA0XFteXG5cXSpcbiIJeyBpbmNyIHgxIH0KLQkJLXJlICIwYyBSX1NQQVJDX1dESVNQMjIgK2ZvbzFcWytcXSsweDArMDRcW15cblxdKlxuIgl7IGluY3IgeDIgfQotCQktcmUgIjEwIFJfU1BBUkNfV0RJU1AyMiArZm9vMVxbXlxuXF0qXG4iCQl7IGluY3IgeDMgfQotCQktcmUgIjE0IFJfU1BBUkNfV0RJU1AyMiArZm9vMVxbXlxuXF0qXG4iCQl7IGluY3IgeDQgfQotCQktcmUgIjFjIFJfU1BBUkNfMzIgK2ZvbzFcW15cblxdKlxuIgkJCXsgaW5jciB4NSB9Ci0JCS1yZSAiMjAgUl9TUEFSQ18zMiArZm9vMVxbK1xdKzB4MCswNFxbXlxuXF0qXG4iCQl7IGluY3IgeDYgfQotCQktcmUgIlxbXlxuXF0qXG4iCQkJCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0Jb2JqZHVtcF9maW5pc2gKLQlpZiBbYWxsX29uZXMgJHgxICR4MiAkeDMgJHg0ICR4NSAkeDZdIHRoZW4gewotCSAgICBwYXNzICR0ZXN0bmFtZQotCX0gZWxzZSB7Ci0JICAgIGZhaWwgJHRlc3RuYW1lCi0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2FkZGVuZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGViMTA4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0JLmdsb2JhbCBmb28KLWZvbzoKLQlub3AKLQlub3AKLQliYSBmb28xKzB4NAotCWJhIGZvbzErMHg0Ci0JYmEgZm9vMQotCWJhIGZvbzEKLQlub3AKLQkud29yZCBmb28xCi0JLndvcmQgZm9vMSs0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2dhcy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2dhcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYWY2OTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9nYXMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIwotIyBTb2xhcmlzLTIgb24gU1BBUkMgdGVzdHMKLSMKLSMgVGhlIHR3byBjb21waWxlcnMsIGNjIGFuZCBnY2MsIGdlbmVyYXRlIHF1aXRlIGRpZmZlcmVudCBkZWJ1Z2dpbmcKLSMgcmVjb3Jkcy4gIFZlcmlmeSB0aGF0IHdlIGNhbiBhY2NlcHQgYm90aC4KLSMKLWlmIFtpc3RhcmdldCBzcGFyYy0qLXNvbGFyaXMyKl0gdGhlbiB7Ci0gICAgZ2FzX3Rlc3QgInNvbC1jYy5zIiAgIiIgJHN0ZG9wdGxpc3QgIlNQQVJDIFNvbGFyaXMgY2MgLWciCi0gICAgZ2FzX3Rlc3QgInNvbC1nY2MucyIgIiIgJHN0ZG9wdGxpc3QgIlNQQVJDIFNvbGFyaXMgZ2NjIC1nIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9zb2wtY2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvc29sLWNjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMjUwZGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9zb2wtY2MucworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLQkuc2VjdGlvbiAiLnRleHQiCQkJISBbaW50ZXJuYWxdCi0JLnByb2MJNAotCS5nbG9iYWwJbWFpbgotCS5hbGlnbgk0Ci0JLmdsb2JhbAltYWluCi1tYWluOgotISNQUk9MT0dVRSMgMAotISNQUk9MT0dVRSMgMQotCXNhdmUJJXNwLC05Niwlc3AKLQlzZXRoaQklaGkoLkwxOCksJW8wCi0Jc2V0aGkJJWhpKG1zZyksJW8xCi0Jb3IJJW8xLCVsbyhtc2cpLCVvMQkhIFtpbnRlcm5hbF0KLQljYWxsCXByaW50ZiwyCi0Jb3IJJW8wLCVsbyguTDE4KSwlbzAJISBbaW50ZXJuYWxdCi0JcmV0Ci0JcmVzdG9yZQklZzAsMCwlbzAKLQkudHlwZQltYWluLCNmdW5jdGlvbgotCS5zaXplCW1haW4sKC4tbWFpbikKLQkuc2VjdGlvbiAiLmRhdGEiCQkJISBbaW50ZXJuYWxdCi0JLmFsaWduCTQKLURkYXRhLmRhdGE6Ci0JLnNlY3Rpb24gIi5ic3MiCQkJISBbaW50ZXJuYWxdCi1CYnNzLmJzczoKLQkuc2VjdGlvbiAiLnJvZGF0YSIJCSEgW2ludGVybmFsXQotRHJvZGF0YS5yb2RhdGE6Ci0JLmZpbGUJImhpLXNvbC5jIgotCS5nbG9iYWwJbXNnCi0JLmdsb2JhbAltc2cKLW1zZzoKLQkuYXNjaWkJImhlbGxvLCB3b3JsZCFcMCIKLQkudHlwZQltc2csI29iamVjdAotCS5zaXplCW1zZywxNAotCS5zZWN0aW9uICIuZGF0YTEiLCAjd3JpdGUsICNhbGxvYyAhIFtpbnRlcm5hbF0KLQkuYWxpZ24JNAotLkwxODoKLQkuYXNjaWkJIiVzXG5cMCIKLQkuaWRlbnQJImFjb21wOiAoQ0RTKSBTUEFSQ29tcGlsZXJzIDIuMC4xIDAzIFNlcCAxOTkyIgotCS5zZWN0aW9uICJ0ZXh0IgkJCSEgW2ludGVybmFsXQotCS5zdGFicwkiL2N5Z2ludC9zMS91c2Vycy9yYWVidXJuLyIsMTAwLDAsMCwwCi0JLnN0YWJzCSJoaS1zb2wuYyIsMTAwLDAsMywwCi0JLnN0YWJzCSIiLDU2LDAsMCwwCi0JLnN0YWJzCSIiLDU2LDAsMCwwCi0JLnN0YWJzCSJYdCA7IGcgOyBPIDsgVj0yLjAiLDYwLDAsMCwweDJiYjc3M2JhCi0JLnN0YWJzCSJjaGFyOnQoMCwxKT1ic2MxOzA7ODsiLDEyOCwwLDAsMAotCS5zdGFicwkic2hvcnQ6dCgwLDIpPWJzMjswOzE2OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJpbnQ6dCgwLDMpPWJzNDswOzMyOyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJsb25nOnQoMCw0KT1iczQ7MDszMjsiLDEyOCwwLDAsMAotCS5zdGFicwkibG9uZyBsb25nOnQoMCw1KT1iczg7MDs2NDsiLDEyOCwwLDAsMAotCS5zdGFicwkic2lnbmVkIGNoYXI6dCgwLDYpPWJzYzE7MDs4OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaWduZWQgc2hvcnQ6dCgwLDcpPWJzMjswOzE2OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaWduZWQgaW50OnQoMCw4KT1iczQ7MDszMjsiLDEyOCwwLDAsMAotCS5zdGFicwkic2lnbmVkIGxvbmc6dCgwLDkpPWJzNDswOzMyOyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaWduZWQgbG9uZyBsb25nOnQoMCwxMCk9YnM4OzA7NjQ7IiwxMjgsMCwwLDAKLQkuc3RhYnMJInVuc2lnbmVkIGNoYXI6dCgwLDExKT1idWMxOzA7ODsiLDEyOCwwLDAsMAotCS5zdGFicwkidW5zaWduZWQgc2hvcnQ6dCgwLDEyKT1idTI7MDsxNjsiLDEyOCwwLDAsMAotCS5zdGFicwkidW5zaWduZWQgaW50OnQoMCwxMyk9YnU0OzA7MzI7IiwxMjgsMCwwLDAKLQkuc3RhYnMJInVuc2lnbmVkIGxvbmc6dCgwLDE0KT1idTQ7MDszMjsiLDEyOCwwLDAsMAotCS5zdGFicwkidW5zaWduZWQgbG9uZyBsb25nOnQoMCwxNSk9YnU4OzA7NjQ7IiwxMjgsMCwwLDAKLQkuc3RhYnMJImZsb2F0OnQoMCwxNik9UjE7NDsiLDEyOCwwLDAsMAotCS5zdGFicwkiZG91YmxlOnQoMCwxNyk9UjI7ODsiLDEyOCwwLDAsMAotCS5zdGFicwkibG9uZyBkb3VibGU6dCgwLDE4KT1SNjsxNjsiLDEyOCwwLDAsMAotCS5zdGFicwkidm9pZDp0KDAsMTkpPWJzMDswOzAiLDEyOCwwLDAsMAotCS5zdGFicwkibXNnOkcoMCwyMCk9YXIoMCwzKTswOzEzOygwLDEpIiwzMiwwLDE0LDAKLQkuc3RhYnMJIm1haW46RigwLDMpOygwLDMpOygwLDIxKT0qKDAsMjIpPSooMCwxKSIsMzYsMCwwLG1haW4KLQkuc3RhYnMJIm1haW4iLDQyLDAsMCwwCi0JLnN0YWJuCTE5MiwwLDEsMAotCS5zdGFibgk2OCwwLDQsMAotCS5zdGFicwkiYXJnYzpwKDAsMykiLDE2MCwwLDQsNjgKLQkuc3RhYnMJImFyZ3Y6cCgwLDIxKSIsMTYwLDAsNCw3MgotCS5zdGFicwkicHJpbnRmOlAoMCwzKSIsMzYsMCwwLDAKLQkuc3RhYm4JMjI0LDAsMSwwCi0JLnN0YWJzCSIiLDk4LDAsMCwwCi0JLnNlY3Rpb24gInRleHQiCQkJISBbaW50ZXJuYWxdCi0JLnhzdGFicwkiLnN0YWIuaW5kZXgiLCIvY3lnaW50L3MxL3VzZXJzL3JhZWJ1cm4vIiwxMDAsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsImhpLXNvbC5jIiwxMDAsMCwzLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIiIsNTYsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIiIsNTYsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIlh0IDsgZyA7IE8gOyBWPTIuMCIsNjAsMCwwLDB4MmJiNzczYmEKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIm1zZyIsMzIsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIm1haW4iLDQyLDAsMCwwCi0JLnhzdGFicwkiLnN0YWIuaW5kZXgiLCJtYWluIiwzNiwwLDAsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9zb2wtZ2NjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL3NvbC1nY2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk1ZmRjZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL3NvbC1nY2MucworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLQkuZmlsZQkiaGktc29sLmMiCi0uc3RhYnMgIi8xaC9kZXZvL3NyYy9nYXMvdGVzdHN1aXRlL2dhcy8iLDEwMCwwLDAsLkxMdGV4dDAKLS5zdGFicyAiaGktc29sLmMiLDEwMCwwLDAsLkxMdGV4dDAKLS5zZWN0aW9uCSIudGV4dCIKLS5MTHRleHQwOgotCS5zdGFicwkiZ2NjMl9jb21waWxlZC4iLCAweDNjLCAwLCAwLCAwCi0uc3RhYnMgImludDp0MT1yMTstMjE0NzQ4MzY0ODsyMTQ3NDgzNjQ3OyIsMTI4LDAsMCwwCi0uc3RhYnMgImNoYXI6dDI9cjI7MDsxMjc7IiwxMjgsMCwwLDAKLS5zdGFicyAibG9uZyBpbnQ6dDM9cjE7LTIxNDc0ODM2NDg7MjE0NzQ4MzY0NzsiLDEyOCwwLDAsMAotLnN0YWJzICJ1bnNpZ25lZCBpbnQ6dDQ9cjE7MDstMTsiLDEyOCwwLDAsMAotLnN0YWJzICJsb25nIHVuc2lnbmVkIGludDp0NT1yMTswOy0xOyIsMTI4LDAsMCwwCi0uc3RhYnMgInNob3J0IGludDp0Nj1yMTstMzI3Njg7MzI3Njc7IiwxMjgsMCwwLDAKLS5zdGFicyAibG9uZyBsb25nIGludDp0Nz1yMTswOy0xOyIsMTI4LDAsMCwwCi0uc3RhYnMgInNob3J0IHVuc2lnbmVkIGludDp0OD1yMTswOzY1NTM1OyIsMTI4LDAsMCwwCi0uc3RhYnMgImxvbmcgbG9uZyB1bnNpZ25lZCBpbnQ6dDk9cjE7MDstMTsiLDEyOCwwLDAsMAotLnN0YWJzICJzaWduZWQgY2hhcjp0MTA9cjE7LTEyODsxMjc7IiwxMjgsMCwwLDAKLS5zdGFicyAidW5zaWduZWQgY2hhcjp0MTE9cjE7MDsyNTU7IiwxMjgsMCwwLDAKLS5zdGFicyAiZmxvYXQ6dDEyPXIxOzQ7MDsiLDEyOCwwLDAsMAotLnN0YWJzICJkb3VibGU6dDEzPXIxOzg7MDsiLDEyOCwwLDAsMAotLnN0YWJzICJsb25nIGRvdWJsZTp0MTQ9cjE7ODswOyIsMTI4LDAsMCwwCi0uc3RhYnMgInZvaWQ6dDE1PTE1IiwxMjgsMCwwLDAKLS5zdGFicyAibXNnOkcxNj1hcjE7MDsxMzsyIiwzMiwwLDAsMAotCS5nbG9iYWwgbXNnCi0uc2VjdGlvbgkiLnJvZGF0YSIKLQkuYWxpZ24gOAotCS50eXBlCSBtc2csI29iamVjdAotCS5zaXplCSBtc2csMTQKLW1zZzoKLQkuYXNjaXoJImhlbGxvLCB3b3JsZCEiCi0JLmFsaWduIDgKLS5MTEMwOgotCS5hc2NpegkiJXNcbiIKLS5zZWN0aW9uCSIudGV4dCIKLQkuYWxpZ24gNAotLnN0YWJzICJtYWluOkYxIiwzNiwwLDAsbWFpbgotLnN0YWJzICJhcmdjOlAxIiw2NCwwLDAsMjQKLS5zdGFicyAiYXJndjpQMTc9KjE4PSoyIiw2NCwwLDAsMjUKLQkuZ2xvYmFsIG1haW4KLQkudHlwZQkgbWFpbiwjZnVuY3Rpb24KLQkucHJvYwkwNAotbWFpbjoKLS5zdGFibiA2OCwwLDQsLkxNMS1tYWluCi0uTE0xOgotCSEjUFJPTE9HVUUjIDAKLQlzYXZlICVzcCwtMTEyLCVzcAotCSEjUFJPTE9HVUUjIDEKLS5zdGFibiA2OCwwLDUsLkxNMi1tYWluCi0uTE0yOgotLkxMQkIyOgotCXNldGhpICVoaSguTExDMCksJW8wCi0Jb3IgJW8wLCVsbyguTExDMCksJW8wCi0Jc2V0aGkgJWhpKG1zZyksJW8xCi0JY2FsbCBwcmludGYsMAotCW9yICVvMSwlbG8obXNnKSwlbzEKLS5zdGFibiA2OCwwLDYsLkxNMy1tYWluCi0uTE0zOgotLnN0YWJuIDY4LDAsNywuTE00LW1haW4KLS5MTTQ6Ci0uTExCRTI6Ci0JcmV0Ci0JcmVzdG9yZSAlZzAsMCwlbzAKLS5MTGZlMToKLQkuc2l6ZQkgbWFpbiwuTExmZTEtbWFpbgotLnN0YWJuIDE5MiwwLDAsLkxMQkIyLW1haW4KLS5zdGFibiAyMjQsMCwwLC5MTEJFMi1tYWluCi0JLmlkZW50CSJHQ0M6IChHTlUpIGN5Z251cy0yLjMuMyIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvYXNpLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNWVhMWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvYXNpLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jYXM6IC1BdjkKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBzcGFyYzY0IGFzaQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8LnRleHQ+OgotICAgMDoJYzQgODAgNDAgMDAgCWxkYSAgXFsgJWcxIFxdIFwoMFwpLCAlZzIKLSAgIDQ6CWM0IDgwIDVmIGUwIAlsZGEgIFxbICVnMSBcXSBcKDI1NVwpLCAlZzIKLSAgIDg6CWM0IDgwIDQyIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX0FJVVAsICVnMgotICAgYzoJYzQgODAgNDIgMjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVUywgJWcyCi0gIDEwOgljNCA4MCA0MyAwMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVQX0wsICVnMgotICAxNDoJYzQgODAgNDMgMjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVU19MLCAlZzIKLSAgMTg6CWM0IDgwIDUwIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1AsICVnMgotICAxYzoJYzQgODAgNTAgMjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUywgJWcyCi0gIDIwOgljNCA4MCA1MCA0MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9QTkYsICVnMgotICAyNDoJYzQgODAgNTAgNjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfU05GLCAlZzIKLSAgMjg6CWM0IDgwIDUxIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1BfTCwgJWcyCi0gIDJjOgljNCA4MCA1MSAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TX0wsICVnMgotICAzMDoJYzQgODAgNTEgNDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUE5GX0wsICVnMgotICAzNDoJYzQgODAgNTEgNjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfU05GX0wsICVnMgotICAzODoJYzQgODAgNDIgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVUCwgJWcyCi0gIDNjOgljNCA4MCA0MiAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVTLCAlZzIKLSAgNDA6CWM0IDgwIDQzIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX0FJVVBfTCwgJWcyCi0gIDQ0OgljNCA4MCA0MyAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVTX0wsICVnMgotICA0ODoJYzQgODAgNTAgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUCwgJWcyCi0gIDRjOgljNCA4MCA1MCAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TLCAlZzIKLSAgNTA6CWM0IDgwIDUwIDQwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1BORiwgJWcyCi0gIDU0OgljNCA4MCA1MCA2MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TTkYsICVnMgotICA1ODoJYzQgODAgNTEgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUF9MLCAlZzIKLSAgNWM6CWM0IDgwIDUxIDIwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1NfTCwgJWcyCi0gIDYwOgljNCA4MCA1MSA0MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9QTkZfTCwgJWcyCi0gIDY0OgljNCA4MCA1MSA2MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TTkZfTCwgJWcyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9hc2kucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTZmZTljLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyBUZXN0IGFzaSdzLgotCS50ZXh0Ci0JbGR1d2EgWyVnMV0wLCVnMgotCWxkdXdhIFslZzFdMjU1LCVnMgotCWxkdXdhIFslZzFdI0FTSV9BSVVQLCVnMgotCWxkdXdhIFslZzFdI0FTSV9BSVVTLCVnMgotCWxkdXdhIFslZzFdI0FTSV9BSVVQX0wsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FJVVNfTCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUywlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUE5GLCVnMgotCWxkdXdhIFslZzFdI0FTSV9TTkYsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX1BfTCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU19MLCVnMgotCWxkdXdhIFslZzFdI0FTSV9QTkZfTCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU05GX0wsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FTX0lGX1VTRVJfUFJJTUFSWSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfQVNfSUZfVVNFUl9TRUNPTkRBUlksJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FTX0lGX1VTRVJfUFJJTUFSWV9MSVRUTEUsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FTX0lGX1VTRVJfU0VDT05EQVJZX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUFJJTUFSWSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU0VDT05EQVJZLCVnMgotCWxkdXdhIFslZzFdI0FTSV9QUklNQVJZX05PRkFVTFQsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX1NFQ09OREFSWV9OT0ZBVUxULCVnMgotCWxkdXdhIFslZzFdI0FTSV9QUklNQVJZX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU0VDT05EQVJZX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUFJJTUFSWV9OT0ZBVUxUX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU0VDT05EQVJZX05PRkFVTFRfTElUVExFLCVnMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWVtYmFyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9tZW1iYXIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFiNmIyZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9tZW1iYXIuZAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSNhczogLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgbWVtYmFyCi0KLS4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDwudGV4dD46Ci0gICAwOgk4MSA0MyBlMCAwMCAJbWVtYmFyICAwCi0gICA0Ogk4MSA0MyBlMCA3ZiAJbWVtYmFyICAjU3luY3wjTWVtSXNzdWV8I0xvb2thc2lkZXwjU3RvcmVTdG9yZXwjTG9hZFN0b3JlfCNTdG9yZUxvYWR8I0xvYWRMb2FkCi0gICA4Ogk4MSA0MyBlMCA3ZiAJbWVtYmFyICAjU3luY3wjTWVtSXNzdWV8I0xvb2thc2lkZXwjU3RvcmVTdG9yZXwjTG9hZFN0b3JlfCNTdG9yZUxvYWR8I0xvYWRMb2FkCi0gICBjOgk4MSA0MyBlMCA0MCAJbWVtYmFyICAjU3luYwotICAxMDoJODEgNDMgZTAgMjAgCW1lbWJhciAgI01lbUlzc3VlCi0gIDE0Ogk4MSA0MyBlMCAxMCAJbWVtYmFyICAjTG9va2FzaWRlCi0gIDE4Ogk4MSA0MyBlMCAwOCAJbWVtYmFyICAjU3RvcmVTdG9yZQotICAxYzoJODEgNDMgZTAgMDQgCW1lbWJhciAgI0xvYWRTdG9yZQotICAyMDoJODEgNDMgZTAgMDIgCW1lbWJhciAgI1N0b3JlTG9hZAotICAyNDoJODEgNDMgZTAgMDEgCW1lbWJhciAgI0xvYWRMb2FkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9tZW1iYXIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21lbWJhci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODA1ZTA3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21lbWJhci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBUZXN0IG1lbWJhciBhcmdzCi0JLnRleHQKLQltZW1iYXIgMAotCW1lbWJhciAxMjcKLQltZW1iYXIgI1N5bmN8I01lbUlzc3VlfCNMb29rYXNpZGV8I1N0b3JlU3RvcmV8I0xvYWRTdG9yZXwjU3RvcmVMb2FkfCNMb2FkTG9hZAotCW1lbWJhciAjU3luYwotCW1lbWJhciAjTWVtSXNzdWUKLQltZW1iYXIgI0xvb2thc2lkZQotCW1lbWJhciAjU3RvcmVTdG9yZQotCW1lbWJhciAjTG9hZFN0b3JlCi0JbWVtYmFyICNTdG9yZUxvYWQKLQltZW1iYXIgI0xvYWRMb2FkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9taXNtLTEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc20tMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWM1ZTQ4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc20tMS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotISBUZXN0IGFyY2hpdGVjdHVyZSBtaXNtYXRjaCB3YXJuaW5ncy4KLSEgV2UgZG9uJ3QgdGVzdCBldmVyeSBwb3NzaWJsZSBtaXNtYXRjaCwgd2UganVzdCB3YW50IHRvIGJlIHJlYXNvbmFibGUgc3VyZQotISB0aGUgbWlzbWF0Y2ggY2hlY2tpbmcgY29kZSB3b3Jrcy4KLSEKLSEgeyBkZy1kbyBhc3NlbWJsZSB7IHRhcmdldCBzcGFyYyotKi0qIH0gfQotISB7IGRnLW9wdGlvbnMgLUF2NiB9Ci0KLSEgc3BhcmNsaXRlCi0KLQlkaXZzY2MgJWcxLCVnMiwlZzMJISB7IGRnLWVycm9yICJtaXNtYXRjaHxzcGFyY2xpdGUiICJzcGFyY2xpdGUgZGl2c2NjIG1pc21hdGNoIiB9Ci0KLQlzY2FuICVnMSwlZzIsJWczCSEgeyBkZy1lcnJvciAibWlzbWF0Y2h8c3BhcmNsaXRlIiAic3BhcmNsaXRlIHNjYW4gbWlzbWF0Y2giIH0KLQotISB2OQotCi0JbW92cnogJWcxLCVnMiwlZzMJISB7IGRnLWVycm9yICJtaXNtYXRjaHx2OSIgInY5IGZwIHJlZyBtaXNtYXRjaCIgfQotCi0hIHY5YQotCi0Jc2h1dGRvd24JCSEgeyBkZy1lcnJvciAibWlzbWF0Y2h8djlhIiAidjlhIHNodXRkb3duIG1pc21hdGNoIiB9Ci0KLWZvbzoKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc21hdGNoLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc21hdGNoLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4OWRlMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9taXNtYXRjaC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIFRlc3QgYXJjaGl0ZWN0dXJlIG1pc21hdGNoIGVycm9ycy4KLSMKLSMgR0FTIGlzc3VlcyB0d28gbGluZXMgb2YgZXJyb3IgdGV4dCBmb3IgZWFjaCBtaXNtYXRjaDoKLSMKLSMgbW0tbGl0ZS5zOjc6IEVycm9yOiBBcmNoaXRlY3R1cmUgbWlzbWF0Y2ggb24gImRpdnNjYyIuCi0jIG1tLWxpdGUuczo3OiAgKFJlcXVpcmVzIHNwYXJjbGl0ZTsgcmVxdWVzdGVkIGFyY2hpdGVjdHVyZSBpcyB2OC4pCi0jCi0jIFRoZSBzdWdnZXN0ZWQgcmVnZXhwIGFyZ3VtZW50IHRvIGRnLWVycm9yIGlzICJtaXNtYXRjaHw8YXJjaD4iLgotCi1pZiBbaXN0YXJnZXQgc3BhcmMqLSotKl0gewotCi0gICAgbG9hZF9saWIgZ2FzLWRnLmV4cAotCi0gICAgZGctaW5pdAotCi0gICAgZGctcnVudGVzdCBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3ViZGlyL21pc20tKi5zXV0gIiIgIiIKLQotICAgIGRnLWZpbmlzaAotCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcHJlZmV0Y2guZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE4MDNlZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI2FzOiAtQXY5Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmM2NCBwcmVmZXRjaAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8LnRleHQ+OgotICAgMDoJYzEgNjggNDAgMDAgCXByZWZldGNoICBcWyAlZzEgXF0sICNuX3JlYWRzCi0gICA0OglmZiA2OCA0MCAwMCAJcHJlZmV0Y2ggIFxbICVnMSBcXSwgMzEKLSAgIDg6CWMxIDY4IDQwIDAwIAlwcmVmZXRjaCAgXFsgJWcxIFxdLCAjbl9yZWFkcwotICAgYzoJYzMgNjggNDAgMDAgCXByZWZldGNoICBcWyAlZzEgXF0sICNvbmVfcmVhZAotICAxMDoJYzUgNjggNDAgMDAgCXByZWZldGNoICBcWyAlZzEgXF0sICNuX3dyaXRlcwotICAxNDoJYzcgNjggNDAgMDAgCXByZWZldGNoICBcWyAlZzEgXF0sICNvbmVfd3JpdGUKLSAgMTg6CWMxIGU4IDQyIDAwIAlwcmVmZXRjaGEgIFxbICVnMSBcXSAjQVNJX0FJVVAsICNuX3JlYWRzCi0gIDFjOglmZiBlOCA2MCAwMCAJcHJlZmV0Y2hhICBcWyAlZzEgXF0gJWFzaSwgMzEKLSAgMjA6CWMxIGU4IDQyIDIwIAlwcmVmZXRjaGEgIFxbICVnMSBcXSAjQVNJX0FJVVMsICNuX3JlYWRzCi0gIDI0OgljMyBlOCA2MCAwMCAJcHJlZmV0Y2hhICBcWyAlZzEgXF0gJWFzaSwgI29uZV9yZWFkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcHJlZmV0Y2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThjNjhiYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS50ZXh0Ci0JcHJlZmV0Y2ggWyVnMV0sMAotCXByZWZldGNoIFslZzFdLDMxCi0JcHJlZmV0Y2ggWyVnMV0sI25fcmVhZHMKLQlwcmVmZXRjaCBbJWcxXSwjb25lX3JlYWQKLQlwcmVmZXRjaCBbJWcxXSwjbl93cml0ZXMKLQlwcmVmZXRjaCBbJWcxXSwjb25lX3dyaXRlCi0JcHJlZmV0Y2hhIFslZzFdI0FTSV9BSVVQLDAKLQlwcmVmZXRjaGEgWyVnMV0lYXNpLDMxCi0JcHJlZmV0Y2hhIFslZzFdI0FTSV9BSVVTLCNuX3JlYWRzCi0JcHJlZmV0Y2hhIFslZzFdJWFzaSwjb25lX3JlYWQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JkcHIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JkcHIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBhN2I2MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jYXM6IC1BdjkKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBzcGFyYzY0IHJkcHIKLQotLio6ICtmaWxlIGZvcm1hdCAuKnNwYXJjLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCsgPC50ZXh0PjoKLSAgIDA6CTgzIDUwIDAwIDAwIAlyZHByICAldHBjLCAlZzEKLSAgIDQ6CTg1IDUwIDQwIDAwIAlyZHByICAldG5wYywgJWcyCi0gICA4Ogk4NyA1MCA4MCAwMCAJcmRwciAgJXRzdGF0ZSwgJWczCi0gICBjOgk4OSA1MCBjMCAwMCAJcmRwciAgJXR0LCAlZzQKLSAgMTA6CThiIDUxIDAwIDAwIAlyZHByICAldGljaywgJWc1Ci0gIDE0Ogk4ZCA1MSA0MCAwMCAJcmRwciAgJXRiYSwgJWc2Ci0gIDE4Ogk4ZiA1MSA4MCAwMCAJcmRwciAgJXBzdGF0ZSwgJWc3Ci0gIDFjOgk5MSA1MSBjMCAwMCAJcmRwciAgJXRsLCAlbzAKLSAgMjA6CTkzIDUyIDAwIDAwIAlyZHByICAlcGlsLCAlbzEKLSAgMjQ6CTk1IDUyIDQwIDAwIAlyZHByICAlY3dwLCAlbzIKLSAgMjg6CTk3IDUyIDgwIDAwIAlyZHByICAlY2Fuc2F2ZSwgJW8zCi0gIDJjOgk5OSA1MiBjMCAwMCAJcmRwciAgJWNhbnJlc3RvcmUsICVvNAotICAzMDoJOWIgNTMgMDAgMDAgCXJkcHIgICVjbGVhbndpbiwgJW81Ci0gIDM0Ogk5ZCA1MyA0MCAwMCAJcmRwciAgJW90aGVyd2luLCAlc3AKLSAgMzg6CTlmIDUzIDgwIDAwIAlyZHByICAld3N0YXRlLCAlbzcKLSAgM2M6CWExIDUzIGMwIDAwIAlyZHByICAlZnEsICVsMAotICA0MDoJYTMgNTcgYzAgMDAgCXJkcHIgICV2ZXIsICVsMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmRwci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmRwci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDQ2MTljLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JkcHIucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgVGVzdCByZHByCi0JLnRleHQKLQlyZHByICV0cGMsJWcxCi0JcmRwciAldG5wYywlZzIKLQlyZHByICV0c3RhdGUsJWczCi0JcmRwciAldHQsJWc0Ci0JcmRwciAldGljaywlZzUKLQlyZHByICV0YmEsJWc2Ci0JcmRwciAlcHN0YXRlLCVnNwotCXJkcHIgJXRsLCVvMAotCXJkcHIgJXBpbCwlbzEKLQlyZHByICVjd3AsJW8yCi0JcmRwciAlY2Fuc2F2ZSwlbzMKLQlyZHByICVjYW5yZXN0b3JlLCVvNAotCXJkcHIgJWNsZWFud2luLCVvNQotCXJkcHIgJW90aGVyd2luLCVvNgotCXJkcHIgJXdzdGF0ZSwlbzcKLQlyZHByICVmcSwlbDAKLQlyZHByICV2ZXIsJWwxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZWxvYzY0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZWxvYzY0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YjgyNWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmVsb2M2NC5kCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotI2FzOiAtQXY5Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmM2NCByZWxvYzY0Ci0KLS4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDxmb28+OgotICAgMDoJMDMgMDQgOGQgMTUgCXNldGhpICAlaGlcKDB4MTIzNDU0MDBcKSwgJWcxCi0gICA0Ogk4MiAxMCA2MiA3OCAJb3IgICVnMSwgMHgyNzgsICVnMS4qCi0gICA4OgkwMSAwMCAwMCAwMCAJbm9wIAotICAgYzoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKDB4MFwpLCAlZzEKLQkJCWM6IFJfU1BBUkNfSEgyMgkudGV4dAotICAxMDoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEJISAwIDxmb28+Ci0JCQkxMDogUl9TUEFSQ19ITTEwCS50ZXh0Ci0gIDE0OgkwMSAwMCAwMCAwMCAJbm9wIAotICAxODoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKDB4MFwpLCAlZzEKLQkJCTE4OiBSX1NQQVJDX0hIMjIJLnRleHRcKzB4MTIzNDU2NzgwMDAwMDAwMAotICAxYzoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEJISAwIDxmb28+Ci0JCQkxYzogUl9TUEFSQ19ITTEwCS50ZXh0XCsweDEyMzQ1Njc4MDAwMDAwMDAKLSAgMjA6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDI0OgkwMyAzZiBiNyAyZSAJc2V0aGkgICVoaVwoMHhmZWRjYjgwMFwpLCAlZzEKLSAgMjg6CTgyIDEwIDYyIDk4IAlvciAgJWcxLCAweDI5OCwgJWcxLioKLSAgMmM6CTA1IDFkIDk1IDBjIAlzZXRoaSAgJWhpXCgweDc2NTQzMDAwXCksICVnMgotICAzMDoJODQgMTAgNjIgMTAgCW9yICAlZzEsIDB4MjEwLCAlZzIKLSAgMzQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDM4OgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoMHgwXCksICVnMQotCQkJMzg6IFJfU1BBUkNfSEgyMgkudGV4dAotICAzYzoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEJISAwIDxmb28+Ci0JCQkzYzogUl9TUEFSQ19ITTEwCS50ZXh0Ci0gIDQwOgkwNSAwMCAwMCAwMCAJc2V0aGkgICVoaVwoMHgwXCksICVnMgotCQkJNDA6IFJfU1BBUkNfTE0yMgkudGV4dAotICA0NDoJODQgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzIKLQkJCTQ0OiBSX1NQQVJDX0xPMTAJLnRleHQKLSAgNDg6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDRjOgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoMHgwXCksICVnMQotCQkJNGM6IFJfU1BBUkNfSEgyMgkudGV4dFwrMHhmZWRjYmE5ODc2NTQzMjEwCi0gIDUwOgk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQkhIDAgPGZvbz4KLQkJCTUwOiBSX1NQQVJDX0hNMTAJLnRleHRcKzB4ZmVkY2JhOTg3NjU0MzIxMAotICA1NDoJMDUgMDAgMDAgMDAgCXNldGhpICAlaGlcKDB4MFwpLCAlZzIKLQkJCTU0OiBSX1NQQVJDX0xNMjIJLnRleHRcKzB4ZmVkY2JhOTg3NjU0MzIxMAotICA1ODoJODQgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzIKLQkJCTU4OiBSX1NQQVJDX0xPMTAJLnRleHRcKzB4ZmVkY2JhOTg3NjU0MzIxMAotICA1YzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgNjA6CTAzIDJhIDYxIGQ5IAlzZXRoaSAgJWhpXCgweGE5ODc2NDAwXCksICVnMQotICA2NDoJODIgMTAgNjEgNDMgCW9yICAlZzEsIDB4MTQzLCAlZzEuKgotICA2ODoJODIgMTAgNjIgMTAgCW9yICAlZzEsIDB4MjEwLCAlZzEKLSAgNmM6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDcwOgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoMHgwXCksICVnMQotCQkJNzA6IFJfU1BBUkNfSDQ0CS50ZXh0Ci0gIDc0Ogk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQkhIDAgPGZvbz4KLQkJCTc0OiBSX1NQQVJDX000NAkudGV4dAotICA3ODoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEKLQkJCTc4OiBSX1NQQVJDX0w0NAkudGV4dAotICA3YzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgODA6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgweDBcKSwgJWcxCi0JCQk4MDogUl9TUEFSQ19INDQJLnRleHRcKzB4YTk4NzY1NDMyMTAKLSAgODQ6CTgyIDEwIDYwIDAwIAltb3YgICVnMSwgJWcxCSEgMCA8Zm9vPgotCQkJODQ6IFJfU1BBUkNfTTQ0CS50ZXh0XCsweGE5ODc2NTQzMjEwCi0gIDg4Ogk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQotCQkJODg6IFJfU1BBUkNfTDQ0CS50ZXh0XCsweGE5ODc2NTQzMjEwCi0gIDhjOgkwMSAwMCAwMCAwMCAJbm9wIAotICA5MDoJMDMgMjIgNmEgZjMgCXNldGhpICAlaGlcKDB4ODlhYmNjMDBcKSwgJWcxCi0gIDk0Ogk4MiAxOCA3ZSAxMCAJeG9yICAlZzEsIC00OTYsICVnMQotICA5ODoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgOWM6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgweDBcKSwgJWcxCi0JCQk5YzogUl9TUEFSQ19ISVgyMgkudGV4dAotICBhMDoJODIgMTggNjAgMDAgCXhvciAgJWcxLCAwLCAlZzEKLQkJCWEwOiBSX1NQQVJDX0xPWDEwCS50ZXh0Ci0gIGE0OgkwMSAwMCAwMCAwMCAJbm9wIAotICBhODoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKDB4MFwpLCAlZzEKLQkJCWE4OiBSX1NQQVJDX0hJWDIyCS50ZXh0XCsweGZmZmZmZmZmNzY1NDMyMTAKLSAgYWM6CTgyIDE4IDYwIDAwIAl4b3IgICVnMSwgMCwgJWcxCi0JCQlhYzogUl9TUEFSQ19MT1gxMAkudGV4dFwrMHhmZmZmZmZmZjc2NTQzMjEwCi0gIGIwOgkwMSAwMCAwMCAwMCAJbm9wIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmVsb2M2NC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmVsb2M2NC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFkNmFmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JlbG9jNjQucworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMgc3BhcmM2NCBzcGVjaWFsIHJlbG9jcwotCi1mb286Ci0Jc2V0aGkgJXVoaSgweDEyMzQ1Njc4MDAwMDAwMDApLCVnMQotCW9yICVnMSwldWxvKDB4MTIzNDU2NzgwMDAwMDAwMCksJWcxCi0Jbm9wCi0Jc2V0aGkgJXVoaShmb28pLCVnMQotCW9yICVnMSwldWxvKGZvbyksJWcxCi0Jbm9wCi0Jc2V0aGkgJXVoaShmb28rMHgxMjM0NTY3ODAwMDAwMDAwKSwlZzEKLQlvciAlZzEsJXVsbyhmb28rMHgxMjM0NTY3ODAwMDAwMDAwKSwlZzEKLQlub3AKLQlzZXRoaSAlaGgoMHhmZWRjYmE5ODc2NTQzMjEwKSwlZzEKLQlvciAlZzEsJWhtKDB4ZmVkY2JhOTg3NjU0MzIxMCksJWcxCi0Jc2V0aGkgJWxtKDB4ZmVkY2JhOTg3NjU0MzIxMCksJWcyCi0Jb3IgJWcxLCVsbygweGZlZGNiYTk4NzY1NDMyMTApLCVnMgotCW5vcAotCXNldGhpICVoaChmb28pLCVnMQotCW9yICVnMSwlaG0oZm9vKSwlZzEKLQlzZXRoaSAlbG0oZm9vKSwlZzIKLQlvciAlZzEsJWxvKGZvbyksJWcyCi0Jbm9wCi0Jc2V0aGkgJWhoKGZvbysweGZlZGNiYTk4NzY1NDMyMTApLCVnMQotCW9yICVnMSwlaG0oZm9vKzB4ZmVkY2JhOTg3NjU0MzIxMCksJWcxCi0Jc2V0aGkgJWxtKGZvbysweGZlZGNiYTk4NzY1NDMyMTApLCVnMgotCW9yICVnMSwlbG8oZm9vKzB4ZmVkY2JhOTg3NjU0MzIxMCksJWcyCi0Jbm9wCi0Jc2V0aGkgJWg0NCgweGE5ODc2NTQzMjEwKSwlZzEKLQlvciAlZzEsJW00NCgweGE5ODc2NTQzMjEwKSwlZzEKLQlvciAlZzEsJWw0NCgweGE5ODc2NTQzMjEwKSwlZzEKLQlub3AKLQlzZXRoaSAlaDQ0KGZvbyksJWcxCi0Jb3IgJWcxLCVtNDQoZm9vKSwlZzEKLQlvciAlZzEsJWw0NChmb28pLCVnMQotCW5vcAotCXNldGhpICVoNDQoZm9vKzB4YTk4NzY1NDMyMTApLCVnMQotCW9yICVnMSwlbTQ0KGZvbysweGE5ODc2NTQzMjEwKSwlZzEKLQlvciAlZzEsJWw0NChmb28rMHhhOTg3NjU0MzIxMCksJWcxCi0Jbm9wCi0Jc2V0aGkgJWhpeCgweGZmZmZmZmZmNzY1NDMyMTApLCVnMQotCXhvciAlZzEsJWxveCgweGZmZmZmZmZmNzY1NDMyMTApLCVnMQotCW5vcAotCXNldGhpICVoaXgoZm9vKSwlZzEKLQl4b3IgJWcxLCVsb3goZm9vKSwlZzEKLQlub3AKLQlzZXRoaSAlaGl4KGZvbysweGZmZmZmZmZmNzY1NDMyMTApLCVnMQotCXhvciAlZzEsJWxveChmb28rMHhmZmZmZmZmZjc2NTQzMjEwKSwlZzEKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NldDY0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zZXQ2NC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjFiZWNhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NldDY0LmQKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0jYXM6IC1BdjkKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBzcGFyYzY0IHNldDY0Ci0KLS4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDxmb28+OgotICAgMDoJMDUgMDAgMDAgMDAgCXNldGhpICAlaGlcKDB4MFwpLCAlZzIKLQkJCTA6IFJfU1BBUkNfSEkyMgkudGV4dAotICAgNDoJODQgMTAgYTAgMDAgCW1vdiAgJWcyLCAlZzIJISAwIDxmb28+Ci0JCQk0OiBSX1NQQVJDX0xPMTAJLnRleHQKLSAgIDg6CTA3IDFkIDk1IDBjIAlzZXRoaSAgJWhpXCgweDc2NTQzMDAwXCksICVnMwotICAgYzoJODYgMTAgZTIgMTAgCW9yICAlZzMsIDB4MjEwLCAlZzMJISA3NjU0MzIxMCA8XCpBQlNcKlwrKDB4fCkweDc2NTQzMjEwPgotICAxMDoJODggMTAgMjAgMDAgCWNsciAgJWc0Ci0gIDE0OgkwYiAwMCAwMCAzZiAJc2V0aGkgICVoaVwoMHhmYzAwXCksICVnNQotICAxODoJOGEgMTEgNjMgZmYgCW9yICAlZzUsIDB4M2ZmLCAlZzUJISBmZmZmIDxcKkFCU1wqXCsoMHh8KWZmZmY+Ci0gIDFjOgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoMHgwXCksICVnMQotCQkJMWM6IFJfU1BBUkNfSEgyMgkudGV4dAotICAyMDoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEJISAwIDxmb28+Ci0JCQkyMDogUl9TUEFSQ19ITTEwCS50ZXh0Ci0gIDI0OgkwNSAwMCAwMCAwMCAJc2V0aGkgICVoaVwoMHgwXCksICVnMgotCQkJMjQ6IFJfU1BBUkNfSEkyMgkudGV4dAotICAyODoJODQgMTAgYTAgMDAgCW1vdiAgJWcyLCAlZzIJISAwIDxmb28+Ci0JCQkyODogUl9TUEFSQ19MTzEwCS50ZXh0Ci0gIDJjOgk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKLSAgMzA6CTg0IDEwIDgwIDAxIAlvciAgJWcyLCAlZzEsICVnMgotICAzNDoJODYgMTAgM2YgZmYgCW1vdiAgLTEsICVnMwotICAzODoJODYgMTAgMjAgMDAgCWNsciAgJWczCi0gIDNjOgk4NiAxMCAyMCAwMSAJbW92ICAxLCAlZzMKLSAgNDA6CTg2IDEwIDJmIGZmIAltb3YgIDB4ZmZmLCAlZzMKLSAgNDQ6CTA3IDAwIDAwIDA0IAlzZXRoaSAgJWhpXCgweDEwMDBcKSwgJWczCi0gIDQ4Ogk4NiAxMCAzMCAwMCAJbW92ICAtNDA5NiwgJWczCi0gIDRjOgkwNyAzZiBmZiBmYiAJc2V0aGkgICVoaVwoMHhmZmZmZWMwMFwpLCAlZzMKLSAgNTA6CTg2IDEwIGUzIGZmIAlvciAgJWczLCAweDNmZiwgJWczCSEgZmZmZmVmZmYgPFwqQUJTXCpcKygweHwpZmZmZmVmZmY+Ci0gIDU0Ogk4NyAzOCBlMCAwMCAJc3JhICAlZzMsIDAsICVnMwotICA1ODoJMDcgMDAgMDAgM2YgCXNldGhpICAlaGlcKDB4ZmMwMFwpLCAlZzMKLSAgNWM6CTg2IDEwIGUzIGZmIAlvciAgJWczLCAweDNmZiwgJWczCSEgZmZmZiA8XCpBQlNcKlwrKDB4fClmZmZmPgotICA2MDoJMDcgM2YgZmYgYzAgCXNldGhpICAlaGlcKDB4ZmZmZjAwMDBcKSwgJWczCi0gIDY0Ogk4NyAzOCBlMCAwMCAJc3JhICAlZzMsIDAsICVnMwotICA2ODoJMDkgMWYgZmYgZmYgCXNldGhpICAlaGlcKDB4N2ZmZmZjMDBcKSwgJWc0Ci0gIDZjOgk4OCAxMSAyMyBmZiAJb3IgICVnNCwgMHgzZmYsICVnNAkhIDdmZmZmZmZmIDxcKkFCU1wqXCsoMHh8KTdmZmZmZmZmPgotICA3MDoJMDkgMjAgMDAgMDAgCXNldGhpICAlaGlcKDB4ODAwMDAwMDBcKSwgJWc0Ci0gIDc0OgkwOSAyMCAwMCAwMCAJc2V0aGkgICVoaVwoMHg4MDAwMDAwMFwpLCAlZzQKLSAgNzg6CTg5IDM5IDIwIDAwIAlzcmEgICVnNCwgMCwgJWc0Ci0gIDdjOgk4MiAxMCAzZiBmZiAJbW92ICAtMSwgJWcxCi0gIDgwOgkwOSAxZiBmZiBmZiAJc2V0aGkgICVoaVwoMHg3ZmZmZmMwMFwpLCAlZzQKLSAgODQ6CTg4IDExIDIzIGZmIAlvciAgJWc0LCAweDNmZiwgJWc0CSEgN2ZmZmZmZmYgPFwqQUJTXCpcKygweHwpN2ZmZmZmZmY+Ci0gIDg4Ogk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKLSAgOGM6CTg4IDExIDAwIDAxIAlvciAgJWc0LCAlZzEsICVnNAotICA5MDoJMDkgM2YgZmYgZmYgCXNldGhpICAlaGlcKDB4ZmZmZmZjMDBcKSwgJWc0Ci0gIDk0Ogk4OCAxMSAyMyBmZiAJb3IgICVnNCwgMHgzZmYsICVnNAkhIGZmZmZmZmZmIDxcKkFCU1wqXCsoMHh8KWZmZmZmZmZmPgotICA5ODoJODggMTAgMjAgMDEgCW1vdiAgMSwgJWc0Ci0gIDljOgk4OSAyOSAzMCAyMCAJc2xseCAgJWc0LCAweDIwLCAlZzQKLSAgYTA6CTAzIDFmIGZmIGZmIAlzZXRoaSAgJWhpXCgweDdmZmZmYzAwXCksICVnMQotICBhNDoJODIgMTAgNjMgZmYgCW9yICAlZzEsIDB4M2ZmLCAlZzEJISA3ZmZmZmZmZiA8XCpBQlNcKlwrKDB4fCk3ZmZmZmZmZj4KLSAgYTg6CTBiIDNmIGZmIGZmIAlzZXRoaSAgJWhpXCgweGZmZmZmYzAwXCksICVnNQotICBhYzoJOGEgMTEgNjMgZmYgCW9yICAlZzUsIDB4M2ZmLCAlZzUJISBmZmZmZmZmZiA8XCpBQlNcKlwrKDB4fClmZmZmZmZmZj4KLSAgYjA6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQotICBiNDoJOGEgMTEgNDAgMDEgCW9yICAlZzUsICVnMSwgJWc1Ci0gIGI4OgkwYiAyMCAwMCAwMCAJc2V0aGkgICVoaVwoMHg4MDAwMDAwMFwpLCAlZzUKLSAgYmM6CThiIDI5IDcwIDIwIAlzbGx4ICAlZzUsIDB4MjAsICVnNQotICBjMDoJOGEgMTAgM2YgZmYgCW1vdiAgLTEsICVnNQotICBjNDoJOGIgMjkgNzAgMjAgCXNsbHggICVnNSwgMHgyMCwgJWc1Ci0gIGM4OgkwYiAyMCAwMCAwMCAJc2V0aGkgICVoaVwoMHg4MDAwMDAwMFwpLCAlZzUKLSAgY2M6CThiIDM5IDYwIDAwIAlzcmEgICVnNSwgMCwgJWc1Ci0gIGQwOgkwMyAzZiBmZiBjMCAJc2V0aGkgICVoaVwoMHhmZmZmMDAwMFwpLCAlZzEKLSAgZDQ6CTBiIDNmIGZmIGMwIAlzZXRoaSAgJWhpXCgweGZmZmYwMDAwXCksICVnNQotICBkODoJODMgMjggNzAgMjAgCXNsbHggICVnMSwgMHgyMCwgJWcxCi0gIGRjOgk4YSAxMSA0MCAwMSAJb3IgICVnNSwgJWcxLCAlZzUKLSAgZTA6CTAzIDNmIGZmIGMwIAlzZXRoaSAgJWhpXCgweGZmZmYwMDAwXCksICVnMQotICBlNDoJOGEgMTAgMjAgMDEgCW1vdiAgMSwgJWc1Ci0gIGU4Ogk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKLSAgZWM6CThhIDExIDQwIDAxIAlvciAgJWc1LCAlZzEsICVnNQotICBmMDoJODIgMTAgMjAgMDEgCW1vdiAgMSwgJWcxCi0gIGY0OgkwYiAzZiBmZiBjMCAJc2V0aGkgICVoaVwoMHhmZmZmMDAwMFwpLCAlZzUKLSAgZjg6CThhIDExIDYwIDAxIAlvciAgJWc1LCAxLCAlZzUJISBmZmZmMDAwMSA8XCpBQlNcKlwrKDB4fClmZmZmMDAwMT4KLSAgZmM6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQotIDEwMDoJOGEgMTEgNDAgMDEgCW9yICAlZzUsICVnMSwgJWc1Ci0gMTA0Ogk4MiAxMCAyMCAwMSAJbW92ICAxLCAlZzEKLSAxMDg6CTBiIDNmIGZmIGMwIAlzZXRoaSAgJWhpXCgweGZmZmYwMDAwXCksICVnNQotIDEwYzoJODMgMjggNzAgMjAgCXNsbHggICVnMSwgMHgyMCwgJWcxCi0gMTEwOgk4YSAxMSA0MCAwMSAJb3IgICVnNSwgJWcxLCAlZzUKLSAxMTQ6CTgyIDEwIDIwIDAxIAltb3YgIDEsICVnMQotIDExODoJOGEgMTAgMjAgMDEgCW1vdiAgMSwgJWc1Ci0gMTFjOgk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKLSAxMjA6CThhIDExIDQwIDAxIAlvciAgJWc1LCAlZzEsICVnNQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc2V0NjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NldDY0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZGM5MzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc2V0NjQucworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMgc3BhcmM2NCBzZXQgaW5zbiBoYW5kbGluZyAoaW5jbHVkZXMgc2V0LCBzZXR1dywgc2V0c3csIHNldHgpCi0jIEZJWE1FOiBzZXR1dyxzZXRzdyBub3QgdGVzdGVkIGZvciB5ZXQuCi0KLWZvbzoKLQlzZXQgZm9vLCVnMgotCXNldCAweDc2NTQzMjEwLCVnMwotCXNldCAwLCVnNAotCXNldCA2NTUzNSwlZzUKLQotCXNldHggZm9vLCVnMSwlZzIKLQotCXNldHggLTEsJWcxLCVnMwotCXNldHggMCwlZzEsJWczCi0Jc2V0eCAxLCVnMSwlZzMKLQlzZXR4IDQwOTUsJWcxLCVnMwotCXNldHggNDA5NiwlZzEsJWczCi0Jc2V0eCAtNDA5NiwlZzEsJWczCi0Jc2V0eCAtNDA5NywlZzEsJWczCi0Jc2V0eCA2NTUzNSwlZzEsJWczCi0Jc2V0eCAtNjU1MzYsJWcxLCVnMwotCi0Jc2V0eCAyMTQ3NDgzNjQ3LCVnMSwlZzQKLQlzZXR4IDIxNDc0ODM2NDgsJWcxLCVnNAotCXNldHggLTIxNDc0ODM2NDgsJWcxLCVnNAotCXNldHggLTIxNDc0ODM2NDksJWcxLCVnNAotCXNldHggNDI5NDk2NzI5NSwlZzEsJWc0Ci0Jc2V0eCA0Mjk0OTY3Mjk2LCVnMSwlZzQKLQotISBHQVMgZG9lc24ndCBoYW5kbGUgbGFyZ2UgYmFzZTEwIG51bWJlcnMgeWV0LgotIQlzZXR4IDkyMjMzNzIwMzY4NTQ3NzU4MDcsJWcxLCVnNQotIQlzZXR4IDkyMjMzNzIwMzY4NTQ3NzU4MDgsJWcxLCVnNQotIQlzZXR4IC05MjIzMzcyMDM2ODU0Nzc1ODA4LCVnMSwlZzUKLSEJc2V0eCAtOTIyMzM3MjAzNjg1NDc3NTgwOSwlZzEsJWc1Ci0KLQlzZXR4IDB4N2ZmZmZmZmZmZmZmZmZmZiwlZzEsJWc1Ci0Jc2V0eCAweDgwMDAwMDAwMDAwMDAwMDAsJWcxLCVnNQkJISB0ZXN0IG9ubHkgaGgyMiBuZWVkZWQKLQlzZXR4IDB4ZmZmZmZmZmYwMDAwMDAwMCwlZzEsJWc1CQkhIHRlc3Qgb25seSBobTEwIG5lZWRlZAotCXNldHggMHhmZmZmZmZmZjgwMDAwMDAwLCVnMSwlZzUJCSEgdGVzdCBzaWduLWV4dCBvZiBsb3dlciAzMgotCXNldHggMHhmZmZmMDAwMGZmZmYwMDAwLCVnMSwlZzUJCSEgdGVzdCBoaDIyLGhpMjIKLQlzZXR4IDB4ZmZmZjAwMDAwMDAwMDAwMSwlZzEsJWc1CQkhIHRlc3QgaGgyMixsbzEwCi0Jc2V0eCAweDAwMDAwMDAxZmZmZjAwMDEsJWcxLCVnNQkJISB0ZXN0IGhtMTAsaGkyMixsbzEwCi0Jc2V0eCAweDAwMDAwMDAxZmZmZjAwMDAsJWcxLCVnNQkJISB0ZXN0IGhtMTAsaGkyMgotCXNldHggMHgwMDAwMDAwMTAwMDAwMDAxLCVnMSwlZzUJCSEgdGVzdCBobTEwLGxvMTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwYXJjLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwYXJjLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE3OTM1OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGFyYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIFNvbWUgZ2VuZXJpYyBTUEFSQyBhbmQgU1BBUkM2NCB0ZXN0cwotCi0jIEZJWE1FOiBUaGUgdGVzdHMgaGVyZSBhcmVuJ3QgcmVhbGx5IGJ1bGxldCBwcm9vZi4gIEEgbWlzdGFrZSBpbiB0aGUgb3Bjb2RlCi0jIHRhYmxlIGNhbiBzbGlwIHRocm91Z2ggc2luY2Ugd2UgdXNlIHRoZSBzYW1lIHRhYmxlIGZvciBhc3NlbWJseSBhbmQKLSMgZGlzYXNzZW1ibHkuICBUaGUgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIGluY2x1ZGUgYSBoZXggZHVtcCBvZiB0aGUgaW5zbnMKLSMgYW5kIHRlc3QgdGhhdCBhcyB3ZWxsLiAgTGF0ZXIuCi0KLWlmIFtpc3RhcmdldCBzcGFyYyotKi0qXSB7Ci0gICAgcnVuX2R1bXBfdGVzdCAic3ludGgiCi19Ci0KLQotaWYgW2lzdGFyZ2V0IHNwYXJjNjQqLSotKl0gewotICAgIHJ1bl9kdW1wX3Rlc3QgImFzaSIKLSAgICBydW5fZHVtcF90ZXN0ICJtZW1iYXIiCi0gICAgcnVuX2R1bXBfdGVzdCAicHJlZmV0Y2giCi0gICAgcnVuX2R1bXBfdGVzdCAic2V0NjQiCi0gICAgcnVuX2R1bXBfdGVzdCAic3ludGg2NCIKLSAgICBydW5fZHVtcF90ZXN0ICJyZHByIgotICAgIHJ1bl9kdW1wX3Rlc3QgIndycHIiCi0gICAgcnVuX2R1bXBfdGVzdCAicmVsb2M2NCIKLX0KLQotaWYgW2lzdGFyZ2V0IHNwYXJjbGV0Ki0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJzcGxldCIKLSAgICBydW5fZHVtcF90ZXN0ICJzcGxldC0yIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQtMi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQtMi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDU1NTM4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LTIuZAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNhczogLUFzcGFyY2xldAotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjbGV0IGNvcHJvY2Vzc29yIHJlZ2lzdGVycwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDxzdGFydD46Ci0gICAwOgk4MSBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY3NyCi0gICA0Ogk4MyBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY2ZyCi0gICA4Ogk4NSBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY2NyY3IKLSAgIGM6CTg3IGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjcHIKLSAgMTA6CTg5IGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjc3IyCi0gIDE0Ogk4YiBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY2NycgotICAxODoJOGQgYjAgNDAgYzAgCWN3cmN4dCAgJWcxLCAlY2Nyc3RyCi0gIDFjOgk4MyBiMCAwMSAwMCAJY3JkY3h0ICAlY2NzciwgJWcxCi0gIDIwOgk4MyBiMCA0MSAwMCAJY3JkY3h0ICAlY2NmciwgJWcxCi0gIDI0Ogk4MyBiMCA4MSAwMCAJY3JkY3h0ICAlY2NjcmNyLCAlZzEKLSAgMjg6CTgzIGIwIGMxIDAwIAljcmRjeHQgICVjY3ByLCAlZzEKLSAgMmM6CTgzIGIxIDAxIDAwIAljcmRjeHQgICVjY3NyMiwgJWcxCi0gIDMwOgk4MyBiMSA0MSAwMCAJY3JkY3h0ICAlY2NjcnIsICVnMQotICAzNDoJODMgYjEgODEgMDAgCWNyZGN4dCAgJWNjcnN0ciwgJWcxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC0yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC0yLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzQ0OTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQtMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotISBUZXN0IHNwYXJjbGV0IGNvcHJvY2Vzc29yIHJlZ2lzdGVycy4KLQotCS50ZXh0Ci0JLmdsb2JhbCBzdGFydAotc3RhcnQ6Ci0KLQljd3JjeHQgICAgJWcxLCVjY3NyCi0JY3dyY3h0ICAgICVnMSwlY2NmcgotCWN3cmN4dCAgICAlZzEsJWNjY3JjcgotCWN3cmN4dCAgICAlZzEsJWNjcHIKLQljd3JjeHQgICAgJWcxLCVjY3NyMgotCWN3cmN4dCAgICAlZzEsJWNjY3JyCi0JY3dyY3h0ICAgICVnMSwlY2Nyc3RyCi0KLQljcmRjeHQgICAgJWNjc3IsJWcxCi0JY3JkY3h0ICAgICVjY2ZyLCVnMQotCWNyZGN4dCAgICAlY2NjcmNyLCVnMQotCWNyZGN4dCAgICAlY2NwciwlZzEKLQljcmRjeHQgICAgJWNjc3IyLCVnMQotCWNyZGN4dCAgICAlY2NjcnIsJWcxCi0JY3JkY3h0ICAgICVjY3JzdHIsJWcxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFjMGEyMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLSNhczogLUFzcGFyY2xldAotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjbGV0IGV4dGVuc2lvbnMKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8c3RhcnQ+OgotICAgMDoJYTEgNDAgMDAgMDAgCXJkICAleSwgJWwwCi0gICA0OglhMSA0MCA0MCAwMCAJcmQgICVhc3IxLCAlbDAKLSAgIDg6CWExIDQzIGMwIDAwIAlyZCAgJWFzcjE1LCAlbDAKLSAgIGM6CWExIDQ0IDQwIDAwIAlyZCAgJWFzcjE3LCAlbDAKLSAgMTA6CWExIDQ0IDgwIDAwIAlyZCAgJWFzcjE4LCAlbDAKLSAgMTQ6CWExIDQ0IGMwIDAwIAlyZCAgJWFzcjE5LCAlbDAKLSAgMTg6CWExIDQ1IDAwIDAwIAlyZCAgJWFzcjIwLCAlbDAKLSAgMWM6CWExIDQ1IDQwIDAwIAlyZCAgJWFzcjIxLCAlbDAKLSAgMjA6CWExIDQ1IDgwIDAwIAlyZCAgJWFzcjIyLCAlbDAKLSAgMjQ6CTgxIDg0IDIwIDAwIAltb3YgICVsMCwgJXkKLSAgMjg6CTgzIDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjEKLSAgMmM6CTlmIDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjE1Ci0gIDMwOglhMyA4NCAyMCAwMCAJbW92ICAlbDAsICVhc3IxNwotICAzNDoJYTUgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMTgKLSAgMzg6CWE3IDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjE5Ci0gIDNjOglhOSA4NCAyMCAwMCAJbW92ICAlbDAsICVhc3IyMAotICA0MDoJYWIgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMjEKLSAgNDQ6CWFkIDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjIyCi0KLTArNDggPHRlc3RfdW11bD46Ci0gIDQ4Ogk4NiA1MCA0MCAwMiAJdW11bCAgJWcxLCAlZzIsICVnMwotICA0YzoJODYgNTAgNDAgMDIgCXVtdWwgICVnMSwgJWcyLCAlZzMKLQotMCs1MCA8dGVzdF9zbXVsPjoKLSAgNTA6CTg2IDU4IDQwIDAyIAlzbXVsICAlZzEsICVnMiwgJWczCi0gIDU0Ogk4NiA1OCA0MCAwMiAJc211bCAgJWcxLCAlZzIsICVnMwotCi0wKzU4IDx0ZXN0X3N0YmFyPjoKLSAgNTg6CTgxIDQzIGMwIDAwIAlzdGJhciAKLSAgNWM6CTgxIDQzIGMwIDAwIAlzdGJhciAKLSAgNjA6CTAwIDAwIDAwIDAxIAl1bmltcCAgMHgxCi0gIDY0Ogk4MSBkYyA0MCAwMCAJZmx1c2ggICVsMQotCi0wKzY4IDx0ZXN0X3NjYW4+OgotICA2ODoJYTcgNjQgN2YgZmYgCXNjYW4gICVsMSwgLTEsICVsMwotICA2YzoJYTcgNjQgNjAgMDAgCXNjYW4gICVsMSwgMCwgJWwzCi0gIDcwOglhNyA2NCA0MCAxMSAJc2NhbiAgJWwxLCAlbDEsICVsMwotCi0wKzc0IDx0ZXN0X3NodWZmbGU+OgotICA3NDoJYTMgNmMgMjAgMDEgCXNodWZmbGUgICVsMCwgMSwgJWwxCi0gIDc4OglhMyA2YyAyMCAwMiAJc2h1ZmZsZSAgJWwwLCAyLCAlbDEKLSAgN2M6CWEzIDZjIDIwIDA0IAlzaHVmZmxlICAlbDAsIDQsICVsMQotICA4MDoJYTMgNmMgMjAgMDggCXNodWZmbGUgICVsMCwgOCwgJWwxCi0gIDg0OglhMyA2YyAyMCAxMCAJc2h1ZmZsZSAgJWwwLCAweDEwLCAlbDEKLSAgODg6CWEzIDZjIDIwIDE4IAlzaHVmZmxlICAlbDAsIDB4MTgsICVsMQotCi0wKzhjIDx0ZXN0X3VtYWM+OgotICA4YzoJYTEgZjQgNDAgMTIgCXVtYWMgICVsMSwgJWwyLCAlbDAKLSAgOTA6CWExIGY0IDYwIDAyIAl1bWFjICAlbDEsIDIsICVsMAotICA5NDoJYTEgZjQgNjAgMDIgCXVtYWMgICVsMSwgMiwgJWwwCi0KLTArOTggPHRlc3RfdW1hY2Q+OgotICA5ODoJYTEgNzQgODAgMTQgCXVtYWNkICAlbDIsICVsNCwgJWwwCi0gIDljOglhMSA3NCBhMCAwMyAJdW1hY2QgICVsMiwgMywgJWwwCi0gIGEwOglhMSA3NCBhMCAwMyAJdW1hY2QgICVsMiwgMywgJWwwCi0KLTArYTQgPHRlc3Rfc21hYz46Ci0gIGE0OglhMSBmYyA0MCAxMiAJc21hYyAgJWwxLCAlbDIsICVsMAotICBhODoJYTEgZmMgN2YgZDYgCXNtYWMgICVsMSwgLTQyLCAlbDAKLSAgYWM6CWExIGZjIDdmIGQ2IAlzbWFjICAlbDEsIC00MiwgJWwwCi0KLTArYjAgPHRlc3Rfc21hY2Q+OgotICBiMDoJYTEgN2MgODAgMTQgCXNtYWNkICAlbDIsICVsNCwgJWwwCi0gIGI0OglhMSA3YyBhMCA3YiAJc21hY2QgICVsMiwgMHg3YiwgJWwwCi0gIGI4OglhMSA3YyBhMCA3YiAJc21hY2QgICVsMiwgMHg3YiwgJWwwCi0KLTArYmMgPHRlc3RfdW11bGQ+OgotICBiYzoJOTAgNGEgODAgMGMgCXVtdWxkICAlbzIsICVvNCwgJW8wCi0gIGMwOgk5MCA0YSBhMiAzNCAJdW11bGQgICVvMiwgMHgyMzQsICVvMAotICBjNDoJOTAgNGEgYTUgNjcgCXVtdWxkICAlbzIsIDB4NTY3LCAlbzAKLQotMCtjOCA8dGVzdF9zbXVsZD46Ci0gIGM4OgliMCA2ZSA4MCAxYyAJc211bGQgICVpMiwgJWk0LCAlaTAKLSAgY2M6CWIwIDZlIGIwIDAwIAlzbXVsZCAgJWkyLCAtNDA5NiwgJWkwCi0gIGQwOgliMCA2ZiAyZiBmZiAJc211bGQgICVpNCwgMHhmZmYsICVpMAotCi0wK2Q0IDx0ZXN0X2NvcHJvY2Vzc29yPjoKLSAgZDQ6CTgxIGI0IDAwIDExIAljcHVzaCAgJWwwLCAlbDEKLSAgZDg6CTgxIGI0IDIwIDAxIAljcHVzaCAgJWwwLCAxCi0gIGRjOgk4MSBiNCAwMCA1MSAJY3B1c2hhICAlbDAsICVsMQotICBlMDoJODEgYjQgMjAgNDEgCWNwdXNoYSAgJWwwLCAxCi0gIGU0OglhMSBiMCAwMCA4MCAJY3B1bGwgICVsMAotICBlODoJYTEgYjAgMDEgMDAgCWNyZGN4dCAgJWNjc3IsICVsMAotICBlYzoJYTEgYjAgNDEgMDAgCWNyZGN4dCAgJWNjZnIsICVsMAotICBmMDoJYTEgYjAgYzEgMDAgCWNyZGN4dCAgJWNjcHIsICVsMAotICBmNDoJYTEgYjAgODEgMDAgCWNyZGN4dCAgJWNjY3JjciwgJWwwCi0gIGY4Ogk4MSBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY3NyCi0gIGZjOgk4MyBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY2ZyCi0gMTAwOgk4NyBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY3ByCi0gMTA0Ogk4NSBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY2NyY3IKLSAxMDg6CTAxIGMwIDAwIDAxIAljYm4gIDEwYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkzOD4KLQkJCTEwODogV0RJU1AyMglzdG9wXCsweGZmZmZmZWY4Ci0gMTBjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDExMDoJMjEgYzAgMDAgMDEgCWNibixhICAgMTE0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTQwPgotCQkJMTEwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlZjAKLSAxMTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTE4OgkwMyBjMCAwMCAwMSAJY2JlICAxMWMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNDg+Ci0JCQkxMTg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVlOAotIDExYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxMjA6CTIzIGMwIDAwIDAxIAljYmUsYSAgIDEyNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk1MD4KLQkJCTEyMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZWUwCi0gMTI0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDEyODoJMDUgYzAgMDAgMDEgCWNiZiAgMTJjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTU4PgotCQkJMTI4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlZDgKLSAxMmM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTMwOgkyNSBjMCAwMCAwMSAJY2JmLGEgICAxMzQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNjA+Ci0JCQkxMzA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVkMAotIDEzNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxMzg6CTA3IGMwIDAwIDAxIAljYmVmICAxM2MgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNjg+Ci0JCQkxMzg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVjOAotIDEzYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNDA6CTI3IGMwIDAwIDAxIAljYmVmLGEgICAxNDQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNzA+Ci0JCQkxNDA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVjMAotIDE0NDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNDg6CTA5IGMwIDAwIDAxIAljYnIgIDE0YyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk3OD4KLQkJCTE0ODogV0RJU1AyMglzdG9wXCsweGZmZmZmZWI4Ci0gMTRjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDE1MDoJMjkgYzAgMDAgMDEgCWNicixhICAgMTU0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTgwPgotCQkJMTUwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlYjAKLSAxNTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTU4OgkwYiBjMCAwMCAwMSAJY2JlciAgMTVjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTg4PgotCQkJMTU4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlYTgKLSAxNWM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTYwOgkyYiBjMCAwMCAwMSAJY2JlcixhICAgMTY0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTkwPgotCQkJMTYwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlYTAKLSAxNjQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTY4OgkwZCBjMCAwMCAwMSAJY2JmciAgMTZjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTk4PgotCQkJMTY4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlOTgKLSAxNmM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTcwOgkyZCBjMCAwMCAwMSAJY2JmcixhICAgMTc0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWEwPgotCQkJMTcwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlOTAKLSAxNzQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTc4OgkwZiBjMCAwMCAwMSAJY2JlZnIgIDE3YyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fClhOD4KLQkJCTE3ODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTg4Ci0gMTdjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDE4MDoJMmYgYzAgMDAgMDEgCWNiZWZyLGEgICAxODQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpYjA+Ci0JCQkxODA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU4MAotIDE4NDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxODg6CTExIGMwIDAwIDAxIAljYmEgIDE4YyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCliOD4KLQkJCTE4ODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTc4Ci0gMThjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDE5MDoJMzEgYzAgMDAgMDEgCWNiYSxhICAgMTk0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWMwPgotCQkJMTkwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNzAKLSAxOTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTk4OgkxMyBjMCAwMCAwMSAJY2JuZSAgMTljIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWM4PgotCQkJMTk4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNjgKLSAxOWM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWEwOgkzMyBjMCAwMCAwMSAJY2JuZSxhICAgMWE0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWQwPgotCQkJMWEwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNjAKLSAxYTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWE4OgkxNSBjMCAwMCAwMSAJY2JuZiAgMWFjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWQ4PgotCQkJMWE4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNTgKLSAxYWM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWIwOgkzNSBjMCAwMCAwMSAJY2JuZixhICAgMWI0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWUwPgotCQkJMWIwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNTAKLSAxYjQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWI4OgkxNyBjMCAwMCAwMSAJY2JuZWYgIDFiYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCllOD4KLQkJCTFiODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTQ4Ci0gMWJjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDFjMDoJMzcgYzAgMDAgMDEgCWNibmVmLGEgICAxYzQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpZjA+Ci0JCQkxYzA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU0MAotIDFjNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxYzg6CTE5IGMwIDAwIDAxIAljYm5yICAxY2MgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpZjg+Ci0JCQkxYzg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUzOAotIDFjYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxZDA6CTM5IGMwIDAwIDAxIAljYm5yLGEgICAxZDQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpMTAwPgotCQkJMWQwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlMzAKLSAxZDQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWQ4OgkxYiBjMCAwMCAwMSAJY2JuZXIgIDFkYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMDg+Ci0JCQkxZDg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUyOAotIDFkYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxZTA6CTNiIGMwIDAwIDAxIAljYm5lcixhICAgMWU0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTExMD4KLQkJCTFlMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZTIwCi0gMWU0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDFlODoJMWQgYzAgMDAgMDEgCWNibmZyICAxZWMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpMTE4PgotCQkJMWU4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlMTgKLSAxZWM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWYwOgkzZCBjMCAwMCAwMSAJY2JuZnIsYSAgIDFmNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMjA+Ci0JCQkxZjA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUxMAotIDFmNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxZjg6CTFmIGMwIDAwIDAxIAljYm5lZnIgIDFmYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMjg+Ci0JCQkxZjg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUwOAotIDFmYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAyMDA6CTNmIGMwIDAwIDAxIAljYm5lZnIsYSAgIDIwNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMzA+Ci0JCQkyMDA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUwMAotIDIwNDoJMDEgMDAgMDAgMDAgCW5vcCAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZkNTA3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotCS50ZXh0Ci0JLmdsb2JhbCBzdGFydAotCi0hCVN0YXJ0aW5nIHBvaW50Ci1zdGFydDoKLQotIQl0ZXN0IGFsbCBBU1JzCi0KLQlyZAklYXNyMCwgJWwwCi0JcmQJJWFzcjEsICVsMAotCXJkCSVhc3IxNSwgJWwwCi0JcmQJJWFzcjE3LCAlbDAKLQlyZAklYXNyMTgsICVsMAotCXJkCSVhc3IxOSwgJWwwCSEgc2hvdWxkIHN0b3AgdGhlIHByb2Nlc3NvcgotCXJkCSVhc3IyMCwgJWwwCi0JcmQJJWFzcjIxLCAlbDAKLQlyZAklYXNyMjIsICVsMAotCi0Jd3IJJWwwLCAwLCAlYXNyMAotCXdyCSVsMCwgMCwgJWFzcjEKLQl3cgklbDAsIDAsICVhc3IxNQotCXdyCSVsMCwgMCwgJWFzcjE3Ci0Jd3IJJWwwLCAwLCAlYXNyMTgKLQl3cgklbDAsIDAsICVhc3IxOQotCXdyCSVsMCwgMCwgJWFzcjIwCi0Jd3IJJWwwLCAwLCAlYXNyMjEKLQl3cgklbDAsIDAsICVhc3IyMgotCi0hCXRlc3QgVU1VTCB3aXRoIG5vIG92ZXJmbG93IGluc2lkZSBZCi10ZXN0X3VtdWw6Ci0JdW11bAklZzEsICVnMiwgJWczCi0KLSEJdGVzdCBVTVVMIHdpdGggYW4gb3ZlcmZsb3cgaW5zaWRlIFkKLQotCXVtdWwJJWcxLCAlZzIsICVnMwkhICVnMyBtdXN0IGJlIGVxdWFsIHRvIDAKLQotIQl0ZXN0IFNNVUwgd2l0aCBuZWdhdGl2ZSByZXN1bHQKLXRlc3Rfc211bDoKLQlzbXVsCSVnMSwgJWcyLCAlZzMKLQotIQl0ZXN0IFNNVUwgd2l0aCBwb3NpdGl2ZSByZXN1bHQKLQotCXNtdWwJJWcxLCAlZzIsICVnMwotCi0hCXRlc3QgU1RCQVI6IHRoZXJlIGFyZSB0d28gcG9zc2libGUgc3ludGF4ZXMKLXRlc3Rfc3RiYXI6Ci0Jc3RiYXIJCQkhIGlzIGEgdmFsaWQgVjggc3ludGF4LCBhdCBsZWFzdCBhIHN5bnRoZXRpYwotCQkJCSEgaW5zdHJ1Y3Rpb24KLQlyZAklYXNyMTUsICVnMAkhIG90aGVyIHNvbHV0aW9uCi0KLSEJdGVzdCBVTklNUAotCXVuaW1wCTEKLQotIQl0ZXN0IEZMVVNICi0JZmx1c2gJJWwxCQkhIGlzIHRoZSBvZmZpY2lhbCBWOCBzeW50YXgKLQotIQl0ZXN0IFNDQU46IGZpbmQgZmlyc3QgMAotdGVzdF9zY2FuOgotCXNjYW4JJWwxLCAweGZmZmZmZmZmLCAlbDMKLQotIQl0ZXN0IHNjYW46IGZpbmQgZmlyc3QgMQotCi0Jc2NhbgklbDEsIDAsICVsMwotCi0hCXRlc3Qgc2NhbjogZmluZCBmaXJzdCBiaXQgIT0gYml0LTAKLQotCXNjYW4JJWwxLCAlbDEsICVsMwotCi0hCXRlc3QgU0hVRkZMRQotdGVzdF9zaHVmZmxlOgotCXNodWZmbGUJJWwwLCAweDEsICVsMQotCXNodWZmbGUJJWwwLCAweDIsICVsMQotCXNodWZmbGUJJWwwLCAweDQsICVsMQotCXNodWZmbGUJJWwwLCAweDgsICVsMQotCXNodWZmbGUJJWwwLCAweDEwLCAlbDEKLQlzaHVmZmxlCSVsMCwgMHgxOCwgJWwxCi0KLSEJdGVzdCBVTUFDCi10ZXN0X3VtYWM6Ci0JdW1hYwklbDEsICVsMiwgJWwwCi0JdW1hYwklbDEsIDIsICVsMAotCXVtYWMJMiwgJWwxLCAlbDAKLQotIQl0ZXN0IFVNQUNECi10ZXN0X3VtYWNkOgotCXVtYWNkCSVsMiwgJWw0LCAlbDAKLQl1bWFjZAklbDIsIDMsICVsMAotCXVtYWNkCTMsICVsMiwgJWwwCi0KLSEJdGVzdCBTTUFDCi10ZXN0X3NtYWM6Ci0Jc21hYwklbDEsICVsMiwgJWwwCi0Jc21hYwklbDEsIC00MiwgJWwwCi0Jc21hYwktNDIsICVsMSwgJWwwCi0KLSEJdGVzdCBTTUFDRAotdGVzdF9zbWFjZDoKLQlzbWFjZAklbDIsICVsNCwgJWwwCi0Jc21hY2QJJWwyLCAxMjMsICVsMAotCXNtYWNkCTEyMywgJWwyLCAlbDAKLQotIQl0ZXN0IFVNVUxECi10ZXN0X3VtdWxkOgotCXVtdWxkCSVvMiwgJW80LCAlbzAKLQl1bXVsZAklbzIsIDB4MjM0LCAlbzAKLQl1bXVsZAkweDU2NywgJW8yLCAlbzAKLQotIQl0ZXN0IFNNVUxECi10ZXN0X3NtdWxkOgotCXNtdWxkCSVpMiwgJWk0LCAlaTAKLQlzbXVsZAklaTIsIC00MDk2LCAlaTAKLQlzbXVsZAk0MDk1LCAlaTQsICVpMAotCi0hCUNvcHJvY2Vzc29yIGluc3RydWN0aW9ucwotdGVzdF9jb3Byb2Nlc3NvcjoKLSEJJWNjc3IJaXMgcmVnaXN0ZXIgIyAwCi0hCSVjY2ZyCWlzIHJlZ2lzdGVyICMgMQotIQklY2NwcglpcyByZWdpc3RlciAjIDMKLSEJJWNjY3JjciBpcyByZWdpc3RlciAjIDIKLQotIQl0ZXN0IENQVVNIOiBqdXN0IHN5bnRheAotCi0JY3B1c2gJJWwwLCAlbDEKLQljcHVzaAklbDAsIDEKLQljcHVzaGEJJWwwLCAlbDEKLQljcHVzaGEJJWwwLCAxCi0KLSEJdGVzdCBDUFVMTDoganVzdCBzeW50YXgKLQotCWNwdWxsCSVsMAotCi0hCXRlc3QgQ1BSRENYVDoganVzdCBzeW50YXgKLQotCWNyZGN4dAklY2NzciwgJWwwCi0JY3JkY3h0CSVjY2ZyLCAlbDAKLQljcmRjeHQJJWNjcHIsICVsMAotCWNyZGN4dAklY2NjcmNyLCAlbDAKLQotIQl0ZXN0IENQV1JDWFQ6IGp1c3Qgc3ludGF4Ci0KLQljd3JjeHQJJWwwLCAlY2NzcgotCWN3cmN4dAklbDAsICVjY2ZyCi0JY3dyY3h0CSVsMCwgJWNjcHIKLQljd3JjeHQJJWwwLCAlY2NjcmNyCi0KLSEJdGVzdCBDQmNjYzoganVzdCBzeW50YXgKLQotCWNibglzdG9wCi0Jbm9wCi0JY2JuLGEJc3RvcAotCW5vcAotCWNiZQlzdG9wCi0Jbm9wCi0JY2JlLGEJc3RvcAotCW5vcAotCWNiZglzdG9wCi0Jbm9wCi0JY2JmLGEJc3RvcAotCW5vcAotCWNiZWYJc3RvcAotCW5vcAotCWNiZWYsYQlzdG9wCi0Jbm9wCi0JY2JyCXN0b3AKLQlub3AKLQljYnIsYQlzdG9wCi0Jbm9wCi0JY2JlcglzdG9wCi0Jbm9wCi0JY2JlcixhCXN0b3AKLQlub3AKLQljYmZyCXN0b3AKLQlub3AKLQljYmZyLGEJc3RvcAotCW5vcAotCWNiZWZyCXN0b3AKLQlub3AKLQljYmVmcixhCXN0b3AKLQlub3AKLQljYmEJc3RvcAotCW5vcAotCWNiYSxhCXN0b3AKLQlub3AKLQljYm5lCXN0b3AKLQlub3AKLQljYm5lLGEJc3RvcAotCW5vcAotCWNibmYJc3RvcAotCW5vcAotCWNibmYsYQlzdG9wCi0Jbm9wCi0JY2JuZWYJc3RvcAotCW5vcAotCWNibmVmLGEJc3RvcAotCW5vcAotCWNibnIJc3RvcAotCW5vcAotCWNibnIsYQlzdG9wCi0Jbm9wCi0JY2JuZXIJc3RvcAotCW5vcAotCWNibmVyLGEJc3RvcAotCW5vcAotCWNibmZyCXN0b3AKLQlub3AKLQljYm5mcixhCXN0b3AKLQlub3AKLQljYm5lZnIJc3RvcAotCW5vcAotCWNibmVmcixhCXN0b3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDIyMmM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jYXM6IC1BdjcKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogc3BhcmMgc3ludGgKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxmb28+IHhub3IgICVnMSwgJWcwLCAlZzIKLTArMDAwNCA8Zm9vXCsoMHh8KTQ+IHhub3IgICVnMSwgJWcwLCAlZzEKLTArMDAwOCA8Zm9vXCsoMHh8KTg+IG5lZyAgJWcxLCAlZzIKLTArMDAwYyA8Zm9vXCsoMHh8KWM+IG5lZyAgJWcxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwNjYyOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aC5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIGNvbW1vbiAodjggb3IgdjkpIHN5bnRoZXRpYyBpbnNucwotCS50ZXh0Ci1mb286Ci0Jbm90ICVnMSwlZzIKLQlub3QgJWcxCi0JbmVnICVnMSwlZzIKLQluZWcgJWcxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aDY0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aDY0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOWRhYjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGg2NC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI2FzOiAtQXY5Ci0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IHNwYXJjNjQgc3ludGg2NAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxmb28tKDB4fCk0PiBpcHJlZmV0Y2ggIDArMDAwNCA8Zm9vPgotMCswMDA0IDxmb28+IHNpZ254ICAlZzEsICVnMgotMCswMDA4IDxmb29cKygweHwpND4gY2xydXcgICVnMSwgJWcyCi0wKzAwMGMgPGZvb1wrKDB4fCk4PiBjYXMgIFxbICVnMSBcXSwgJWcyLCAlZzMKLTArMDAxMCA8Zm9vXCsoMHh8KWM+IGNhc2wgIFxbICVnMSBcXSwgJWcyLCAlZzMKLTArMDAxNCA8Zm9vXCsoMHh8KTEwPiBjYXN4ICBcWyAlZzEgXF0sICVnMiwgJWczCi0wKzAwMTggPGZvb1wrKDB4fCkxND4gY2FzeGwgIFxbICVnMSBcXSwgJWcyLCAlZzMKLTArMDAxYyA8Zm9vXCsoMHh8KTE4PiBjbHJ4ICBcWyAlZzEgXCsgJWcyIFxdCi0wKzAwMjAgPGZvb1wrKDB4fCkxYz4gY2xyeCAgXFsgJWcxIFxdCi0wKzAwMjQgPGZvb1wrKDB4fCkyMD4gY2xyeCAgXFsgJWcxIFwrIDEgXF0KLTArMDAyOCA8Zm9vXCsoMHh8KTI0PiBjbHJ4ICBcWyAlZzEgXCsgMHgyYSBcXQotMCswMDJjIDxmb29cKygweHwpMjg+IGNscnggIFxbIDB4NDIgXF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoNjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoNjQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5ZjNjMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aDY0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIHNwYXJjNjQgc3ludGhldGljIGluc25zCi0JLnRleHQKLQlpcHJlZmV0Y2ggZm9vCi1mb286Ci0Jc2lnbnggJWcxLCVnMgotCWNscnV3ICVnMSwlZzIKLQljYXMgWyVnMV0sJWcyLCVnMwotCWNhc2wgWyVnMV0sJWcyLCVnMwotCWNhc3ggWyVnMV0sJWcyLCVnMwotCWNhc3hsIFslZzFdLCVnMiwlZzMKLQotCWNscnggWyVnMSslZzJdCi0JY2xyeCBbJWcxXQotCWNscnggWyVnMSsxXQotCWNscnggWzQyKyVnMV0KLQljbHJ4IFsweDQyXQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvd3Jwci5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvd3Jwci5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVkY2I4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3dycHIuZAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSNhczogLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgd3JwcgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8LnRleHQ+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/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1pZiBbaXN0YXJnZXQgdjg1MCotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KLSAgICBkb19hcml0aAotICAgIGRvX2JpdAotICAgIGRvX2JyYW5jaAotICAgIGRvX2NvbXBhcmUKLSAgICBkb19qdW1wcwotICAgIGRvX2xvZ2ljYWwKLSAgICBkb19tZW0KLSAgICBkb19taXNjCi0gICAgZG9fbW92ZQotCi0gICAgIyBNYWtlIHN1cmUgd2UgaGFuZGxlIGxvKCkgaGkoKSBhbmQgaGkwKCkgY29ycmVjdGx5LgotICAgIGRvX2hpbG8KLQotICAgICMgQ2hlY2sgZm9yIHByb3BlciByZWxvY3Mgb24gbG8sIGhpLCBoaTAsIHpkYW9mZiwgdGRhb2ZmIGFuZCBzZGFvZmYKLSAgICAjIGV4cHJlc3Npb25zCi0gICAgZG9fc2ltcGxlX3JlbG9jX3Rlc3RzCi0KLSAgICBnYXNfdGVzdCAiaGlsbzIucyIgIiIgIiIgImhpL2xvIHJlZ3Jlc3Npb24gdGVzdCIKLSAgICBnYXNfdGVzdCAiZmVwc3cucyIgIiIgIiIgImVxc3cgcmVncmVzc2lvbiB0ZXN0IgotCi0gICAgZ2FzX3Rlc3RfZXJyb3IgInJhbmdlLnMiICItbXdhcm4tc2lnbmVkLW92ZXJmbG93IiAiQ2hlY2sgZm9yIHJhbmdlIGVycm9yIG9uIGJ5dGUgbG9hZC9zdG9yZSIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYml0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JpdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTFhYzA1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYml0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQotCS50ZXh0Ci0JLmdsb2JhbCBiaXQKLWJpdDoKLQljbHIxIDUsMTZbcjZdCi0Jbm90MSA1LDE2W3I2XQotCXNldDEgNSwxNltyNl0KLQl0c3QxIDUsMTZbcjZdCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JyYW5jaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9icmFuY2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFjMWI0Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JyYW5jaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIGJjYwotYmNjOgotCWJndCBiY2MKLQliZ2UgYmNjCi0JYmx0IGJjYwotCWJsZSBiY2MKLQliaCBiY2MKLQlibmwgYmNjCi0JYmwgYmNjCi0JYm5oIGJjYwotCWJlIGJjYwotCWJuZSBiY2MKLQlidiBiY2MKLQlibnYgYmNjCi0JYm4gYmNjCi0JYnAgYmNjCi0JYmMgYmNjCi0JYm5jIGJjYwotCWJ6IGJjYwotCWJueiBiY2MKLQliciBiY2MKLQlic2EgYmNjCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2NvbXBhcmUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvY29tcGFyZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDFjOGE4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvY29tcGFyZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIGNvbXBhcmUKLWNvbXBhcmU6Ci0JY21wIHI1LHI2Ci0JY21wIDUscjYKLQlzZXRmIHYscjUKLQlzZXRmIG52LHI1Ci0Jc2V0ZiBjLHI1Ci0Jc2V0ZiBsLHI1Ci0Jc2V0ZiBuYyxyNQotCXNldGYgbmwscjUKLQlzZXRmIHoscjUKLQlzZXRmIG56LHI1Ci0Jc2V0ZiBuaCxyNQotCXNldGYgaCxyNQotCXNldGYgcyxyNQotCXNldGYgbixyNQotCXNldGYgbnMscjUKLQlzZXRmIHAscjUKLQlzZXRmIHQscjUKLQlzZXRmIHNhLHI1Ci0Jc2V0ZiBsdCxyNQotCXNldGYgZ2UscjUKLQlzZXRmIGxlLHI1Ci0Jc2V0ZiBndCxyNQotCXRzdCByNSxyNgotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9mZXBzdy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9mZXBzdy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjAzMzNjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvZmVwc3cucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCS50ZXh0Ci0JbGRzciByMTcsZmVwc3cKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvaGlsby5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjdlNTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQotCS50ZXh0Ci0JbW92ZWEgbG8oMHhkZWFkYmVlZikscjAscjEKLQltb3ZoaSBoaSgweGRlYWRiZWVmKSxyMSxyMQotCW1vdmhpIGhpMCgweGRlYWRiZWVmKSxyMSxyMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjFkNTkzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvaGlsbzIucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCS50ZXh0Ci0JLm9yZyAweDEwMDAwCi0JbW92ZWEgaGkoYmxhaCkscjAscjEKLWJsYWg6CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2p1bXBzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2p1bXBzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MzE2NGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9qdW1wcy5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwganVtcHMKLWp1bXBzOgotCWphcmwganVtcHMscjUKLQlqbXAgW3I1XQotCWpyIGp1bXBzCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2xvZ2ljYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbG9naWNhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjAwYjNiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbG9naWNhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIGxvZ2ljYWxzCi1sb2dpY2FsczoKLQlhbmQgcjUscjYKLQlhbmRpIDcscjUscjYKLQlub3QgcjUscjYKLQlvciByNSxyNgotCW9yaSA3LHI1LHI2Ci0JeG9yIHI1LHI2Ci0JeG9yaSA3LHI1LHI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21lbS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9tZW0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2OWNlYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21lbS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIG1lbW9yeQotbWVtb3J5OgotCWxkLmIgNVtyNV0scjYKLQlsZC5oIDRbcjVdLHI2Ci0JbGQudyA0W3I1XSxyNgotCXNsZC5iIDY0W2VwXSxyNgotCXNsZC5oIDEyOFtlcF0scjYKLQlzbGQudyAxMjhbZXBdLHI2Ci0Jc3QuYiByNSw1W3I2XQotCXN0LmggcjUsNFtyNl0KLQlzdC53IHI1LDRbcjZdCi0Jc3N0LmIgcjYsNjRbZXBdCi0Jc3N0LmggcjYsMTI4W2VwXQotCXNzdC53IHI2LDEyOFtlcF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbWlzYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9taXNjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYzRlNGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9taXNjLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwgbWlzYwotbWlzYzoKLQlkaQotCWVpCi0JaGFsdAotCW5vcAotCXJldGkKLQl0cmFwIDAKLQl0cmFwIDMxCi0JbGRzciByNyxwc3cKLQlzdHNyIHBzdyxyNwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9tb3ZlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21vdmUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhNmZhZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21vdmUucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIG1vdmUKLW1vdmU6Ci0JbW92IHI1LHI2Ci0JbW92IDUscjYKLQltb3ZlYSA3LHI1LHI2Ci0JbW92aGkgNyxyNSxyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9yYW5nZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9yYW5nZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmFjY2Y0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvcmFuZ2UucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCS50ZXh0Ci0JbGQuYiAweGZmNjJbcjBdLHIwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL3JlbG9jLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL3JlbG9jLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MzhkMjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9yZWxvYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0JLnRleHQKLQltb3ZlYSBsbyhmb28pLHIwLHIxCi0JbW92aGkgaGkoZm9vKSxyMSxyMQotCW1vdmhpIGhpMChmb28pLHIxLHIxCi0JbW92ZWEgemRhb2ZmKF9mb28pLHIwLHIxCi0JbW92aGkgdGRhb2ZmKF9mb28pLGVwLHIxCi0JbW92aGkgc2Rhb2ZmKF9mb28pLGdwLHIxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92YXgvcXVhZC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy92YXgvcXVhZC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NzcwYzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdmF4L3F1YWQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcHJvYyBkb19xdWFkIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInF1YWQuczogcXVhZHdvcmQgaW1tZWRpYXRlIHZhbHVlcyIKLSAgICBzZXQgeDEgMAotICAgIHNldCB4MiAwCi0gICAgc2V0IHgzIDAKLSAgICBnYXNfc3RhcnQgInF1YWQucyIgIi1hbCIKLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gKzJcWyBcdFxdKzAwMDArIDdEOEY3ODU2XFsgXHRcXSttb3ZxXFteXG5cXSpcbiIgeyBzZXQgeDEgMSB9Ci0JICAgIC1yZSAiXiArMlxbIFx0XF0rMzQxMkREQ0NcW15cblxdKlxuIgkJICAgeyBzZXQgeDIgMSB9Ci0JICAgIC1yZSAiXiArMlxbIFx0XF0rQkJBQTUwMDFcWyBcdFxdKlxyXG4iCQkgICB7IHNldCB4MyAxIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0gICAgZ2FzX2ZpbmlzaAotICAgIGlmIFthbGxfb25lcyAkeDEgJHgyICR4M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotaWYgW2lzdGFyZ2V0IHZheC0qLSpdIHRoZW4gewotICAgIGRvX3F1YWQKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3ZheC9xdWFkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92YXgvcXVhZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGFkNGFkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3ZheC9xdWFkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQkudGV4dAotCW1vdnEgJDB4YWFiYmNjZGQxMjM0NTY3OCxyMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBiYjk5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTAuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI25hbWU6IHZ0YWJsZSBlbnRyeTAKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLnRleHRcXToKLU9GRlNFVCArVFlQRSArVkFMVUUgCi0wKzAwMDAwMTAgUl8uKl9HTlVfVlRFTlRSWSAgdnRibF9hCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmY4OWUzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTAucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotLnRleHQKLS52dGFibGVfZW50cnkgdnRibF9hLCAxNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmE2ZTRiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTEuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI25hbWU6IHZ0YWJsZSBlbnRyeTEKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLnRleHRcXToKLU9GRlNFVCArVFlQRSArVkFMVUUgCi0wKzAwMDAwMDAgUl8uKl9HTlVfVlRFTlRSWSAgdnRibF9hLioKLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Zjg5ZTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MS5zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0udGV4dAotLnZ0YWJsZV9lbnRyeSB2dGJsX2EsIDE2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjc5NWIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI29iamR1bXA6IC1yCi0jbmFtZTogdnRhYmxlIGluaGVyaXQwCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBcWy5kYXRhXF06Ci1PRkZTRVQgK1RZUEUgK1ZBTFVFIAotMCswMDAwMDAwIFJfLipfR05VX1ZUSU5IRVJJVCAgXCpBQlNcKgotMCswMDAwMDEwIFJfLipfR05VX1ZUSU5IRVJJVCAgdnRibF9hCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MzhkZjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQwLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0uZGF0YQotCi0udHlwZSB2dGJsX2Esb2JqZWN0Ci12dGJsX2E6Ci0JLnNwYWNlIDE2Ci0uc2l6ZSB2dGJsX2EsMTYKLS52dGFibGVfaW5oZXJpdCB2dGJsX2EsIDAKLQotLnR5cGUgdnRibF9iLG9iamVjdAotdnRibF9iOgotCS5zcGFjZSAxNgotLnNpemUgdnRibF9iLDE2Ci0udnRhYmxlX2luaGVyaXQgdnRibF9iLCB2dGJsX2EKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MS5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQxLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZDYzNTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQxLmwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjoxOiBFcnJvcjogZXhwZWN0ZWQgYHZ0YmxfYScgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IGZvciAudnRhYmxlX2luaGVyaXQKLS4qR0FTLioKLQotCi0gKzEuKnZ0YWJsZV9pbmhlcml0IHZ0YmxfYSwgMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkMWQyOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDEucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS52dGFibGVfaW5oZXJpdCB2dGJsX2EsIDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS92dGFibGUuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL3Z0YWJsZS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMTQ0NTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL3Z0YWJsZS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jCi0jIHZ0YWJsZSB0ZXN0cwotIwotcHJvYyBydW5fbGlzdF90ZXN0IHsgbmFtZSBvcHRzIH0gewotICAgIGdsb2JhbCBzcmNkaXIgc3ViZGlyCi0gICAgc2V0IHRlc3RuYW1lICJ2dGFibGUgJG5hbWUiCi0gICAgc2V0IGZpbGUgJHNyY2Rpci8kc3ViZGlyLyRuYW1lCi0gICAgZ2FzX3J1biAke25hbWV9LnMgJG9wdHMgIj4mZHVtcC5vdXQiCi0gICAgaWYgeyBbcmVnZXhwX2RpZmYgImR1bXAub3V0IiAiJHtmaWxlfS5sIl0gfSB0aGVuIHsKLQlmYWlsICR0ZXN0bmFtZQotCXZlcmJvc2UgIm91dHB1dCBpcyBbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXSIgMgotCXJldHVybgotICAgIH0KLSAgICBwYXNzICR0ZXN0bmFtZQotfQotCi0jIFZ0YWJsZSBiaXRzIGFyZSBvbmx5IHN1cHBvcnRlZCBieSBFTEYgdGFyZ2V0cy4KLWlmIHtbaXN0YXJnZXQgIiotKi1lbGYqIl0gfHwgW2lzdGFyZ2V0ICIqLSotbGludXgqIl19IHRoZW4gewotCi0KLSAgICAjIG5vdCBzdXBwb3J0ZWQgYnkgRDMwVgotICAgIGlmIHtbaXN0YXJnZXQgImQzMHYtKi0qIl19IHsKLSAgICAgIHJldHVybgotICAgIH0KLQotICAgIHJ1bl9kdW1wX3Rlc3QgImluaGVyaXQwIiAKLSAgICBydW5fbGlzdF90ZXN0ICJpbmhlcml0MSIgIi1hbCIKLQotICAgICMgVGhlIHZ0YWJsZSBlbnRyeSByZXN1bHRzIGFyZSBkaWZmZXJlbnQgb24gUmVsIGFuZCBSZWxhIHRhcmdldHMuCi0gICAgaWYge1tpc3RhcmdldCAiaSo4Ni0qLSoiXSB8fCBbaXN0YXJnZXQgIm1pcHMqLSotKiJdfSB0aGVuIHsKLQotCXJ1bl9kdW1wX3Rlc3QgImVudHJ5MCIKLQotICAgIH0gZWxzZSB7Ci0KLQlydW5fZHVtcF90ZXN0ICJlbnRyeTEiCi0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvSU5DMS5IIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzEuSApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzNzMyMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvSU5DMS5ICisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1GSUxFIDEgRklSU1QgTElORQotCS5JTkNMVURFCSJJTkMyLkgiCi1GSUxFIDEgTEFTVCBMSU5FCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvSU5DMi5IIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzIuSApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzYzNkYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvSU5DMi5ICisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0JRklMRSAyIEZJUlNUIExJTkUKLQlGSUxFIDIgTEFTVCBMSU5FCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjY2NzE4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCi1mb286CS5BU1NJR05DCSJoZWxsbyIKLUJBUjoJLkFTU0lHTkEJMTIrMzQKLQotCVwmZm9vJ2ZvbwotCVwmZm9vXCZmb29cJmZvbyAKLQlcJmZvbyBcJmZvbyBcJmZvbyAKLQlcJkJBUlwmYmFyXCZCQVIKLQotCi0KLQkKLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24uZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTM3MzNmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24uZXJyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYXNzaWduLmFzbTo4IENhbid0IGZpbmQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlIGJhci4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24ub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NTA5YWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0hCi0KLSFmb286CS5BU1NJR05DCSJoZWxsbyIKLSFCQVI6CS5BU1NJR05BCTEyKzM0Ci0hCi0KLSEJXCZmb28nZm9vCi0JaGVsbG9mb28KLSEJXCZmb29cJmZvb1wmZm9vIAotCWhlbGxvaGVsbG9oZWxsbyAKLSEJXCZmb28gXCZmb28gXCZmb28gCi0JaGVsbG8gaGVsbG8gaGVsbG8gCi0hCVwmQkFSXCZiYXJcJkJBUgotCTQ2NDYKLSEKLQotIQotCi0hCi0KLSEJCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkOWYwNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotCS5BSUYJMSBFUSAxCi0JT0sKLQkuQUVMU0UKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgRVEgMgotCUJBRAotCS5BRUxTRQotCU9LCi0JLkFFTkRJCi0JLkFJRgkxIEVRIDIKLQlCQUQKLQkuQUVMU0UKLQlPSwotCS5BSUYJMSBFUSAyCi0JQkFECi0JLkFFTFNFCi0JT0sKLQkuQUVOREkKLQkuQUVOREkKLQkuQUlGCTEgTFQgIDIKLQlPSwotCS5BRU5ESQotCS5BSUYJMSBFUSAgMgotCUJBRAotCS5BRU5ESQotCS5BSUYJMSBORSAgMgotCU9LCi0JLkFFTkRJCi0JLkFJRgkxIExFICAyCi0JT0sKLQkuQUVOREkKLQkuQUlGCTEgR1QgIDIKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTMgR0UgIDIKLQlPSwotCS5BRU5ESQotCS5BSUYJMyBMVCAgMgotCUJBRAotCS5BRU5ESQotCS5BSUYJMyBFUSAgMgotCUJBRCAKLQkuQUVOREkKLQkuQUlGCTMgTkUgIDIKLQlPSwotCS5BRU5ESQotCS5BSUYJMyBMRSAgMgotCUJBRAotCS5BRU5ESQotCS5BSUYJMyBHVCAgMgotCU9LCi0JLkFFTkRJCi0JLkFJRgkzIEdFICAyCi0JT0sKLQkuQUVOREkKLQkuQUlGCSJGT08iIEVRICJCQVIiCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkiRk9PIiBFUSAiRk9PIgotCU9LCi0JLkFFTkRJCi0JLkFJRgkiRk9PIiBORSAiQkFSIgotCU9LCi0JLkFFTkRJCi0JLkFJRgkiRk9PIiBFUSAiRk9PIgotCU9LCi0JLkFFTkRJCi0JLkFJRgkxIEVRIDEKLQkuQUlGCTEgRVEgMQotCU9LCi0JLkFFTFNFCQotCUJBRAotCS5BRU5ESQotCS5BSUYJMSBFUSAwCi0JQkFECi0JLkFFTFNFCQotCU9LCi0JLkFFTkRJCi0JT0sKLQkuQUVMU0UJCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkxIEVRIDAKLQlCQUQKLQkuQUVMU0UJCi0JT0sKLQkuQUVOREkKLQkuQUlGCTEgRVEgMQotCU9LCi0JLkFFTFNFCQotCUJBRAotCS5BRU5ESQotCS5BSUYJMSBFUSAwCi0JQkFECi0JLkFFTFNFCQotCS5BSUYJMSBFUSAxCi0JT0sKLQkuQUVMU0UJCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkxIEVRIDAKLQlCQUQKLQkuQUVMU0UJCi0JT0sKLQkuQUVOREkKLQlPSwotCS5BRU5ESQotCS5BSUYJMSBFUSAxCi0JT0sKLQkuQUlGCTEgRVEgMQotCU9LCi0JLkFFTFNFCQotCUJBRAotCS5BRU5ESQotCS5BSUYJMSBFUSAwCi0JQkFECi0JLkFFTFNFCQotCU9LCi0JLkFFTkRJCi0JLkFFTFNFCQotCUJBRAotCS5BRU5ESQotCS5BSUYJMSBFUSAwCi0JQkFECi0JLkFFTFNFCQotCU9LCi0JLkFFTkRJCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3MuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3MuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNWNlZjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3Mub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLSEJLkFJRgkxIEVRIDEKLSEJT0sKLQlPSwotIQkuQUVMU0UKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMgotIQlCQUQKLSEJLkFFTFNFCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMSBFUSAyCi0hCUJBRAotIQkuQUVMU0UKLSEJT0sKLQlPSwotIQkuQUlGCTEgRVEgMgotIQlCQUQKLSEJLkFFTFNFCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BRU5ESQotIQkuQUlGCTEgTFQgIDIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkxIEVRICAyCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIE5FICAyCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMSBMRSAgMgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTEgR1QgIDIKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTMgR0UgIDIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkzIExUICAyCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkzIEVRICAyCi0hCUJBRCAKLSEJLkFFTkRJCi0hCS5BSUYJMyBORSAgMgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTMgTEUgIDIKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTMgR1QgIDIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkzIEdFICAyCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJIkZPTyIgRVEgIkJBUiIKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCSJGT08iIEVRICJGT08iCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJIkZPTyIgTkUgIkJBUiIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkiRk9PIiBFUSAiRk9PIgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMQotIQkuQUlGCTEgRVEgMQotIQlPSwotCU9LCi0hCS5BRUxTRQkKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMAotIQlCQUQKLSEJLkFFTFNFCQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQlPSwotCU9LCi0hCS5BRUxTRQkKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMAotIQlCQUQKLSEJLkFFTFNFCQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMQotIQlPSwotCU9LCi0hCS5BRUxTRQkKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMAotIQlCQUQKLSEJLkFFTFNFCQotIQkuQUlGCTEgRVEgMQotIQlPSwotCU9LCi0hCS5BRUxTRQkKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMAotIQlCQUQKLSEJLkFFTFNFCQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMQotIQlPSwotCU9LCi0hCS5BSUYJMSBFUSAxCi0hCU9LCi0JT0sKLSEJLkFFTFNFCQotIQlCQUQKLSEJLkFFTkRJCi0hCS5BSUYJMSBFUSAwCi0hCUJBRAotIQkuQUVMU0UJCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BRUxTRQkKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMAotIQlCQUQKLSEJLkFFTFNFCQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2guYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcxMGNjNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2guYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotCi0JU3R1ZmYgdG8gdHJ5IGFuZCBjcmFzaCBpdAotCi1mb286CS5NQUNSTwkKLQlISQotYmFyOgkuTUFDUk8JCi0JVEhFUkUKLQliYXIKLQkuRU5ETQkKLQotCi0JLkVORE0KLQlmb28KLQlmb28KLQlmb28KLQlmb28KLQlmb28KLQliYXIKLQotCi0KLQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2guZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDA4ODAyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5lcnIKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1jcmFzaC5hc206MTggVW5yZWFzb25hYmxlIGV4cGFuc2lvbiAoLXUgdHVybnMgb2ZmIGNoZWNrKS4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yjk0OGEzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMDU5ICswLDAgQEAKLSEKLQotIQlTdHVmZiB0byB0cnkgYW5kIGNyYXNoIGl0Ci0JU3R1ZmYgdG8gdHJ5IGFuZCBjcmFzaCBpdAotIQotCi0hZm9vOgkuTUFDUk8JCi0hCUhJCi0hYmFyOgkuTUFDUk8JCi0hCVRIRVJFCi0hCWJhcgotIQkuRU5ETQkKLSEKLSEKLSEJLkVORE0KLSEJZm9vCi0hCUhJCi0JSEkKLSFiYXI6CS5NQUNSTwkKLSEJVEhFUkUKLSEJYmFyCi0hCS5FTkRNCQotIQotCi0hCi0KLSEJZm9vCi0hCUhJCi0JSEkKLSFiYXI6CS5NQUNSTwkKLSEJVEhFUkUKLSEJYmFyCi0hCS5FTkRNCQotIQotCi0hCi0KLSEJZm9vCi0hCUhJCi0JSEkKLSFiYXI6CS5NQUNSTwkKLSEJVEhFUkUKLSEJYmFyCi0hCS5FTkRNCQotIQotCi0hCi0KLSEJZm9vCi0hCUhJCi0JSEkKLSFiYXI6CS5NQUNSTwkKLSEJVEhFUkUKLSEJYmFyCi0hCS5FTkRNCQotIQotCi0hCi0KLSEJZm9vCi0hCUhJCi0JSEkKLSFiYXI6CS5NQUNSTwkKLSEJVEhFUkUKLSEJYmFyCi0hCS5FTkRNCQotIQotCi0hCi0KLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCi0hCVRIRVJFCi0JVEhFUkUKLSEJYmFyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmI2YjMwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCi0KLQkuTUFDUk8gCWZvbyBhIGIgYz1hCi0JXGEgXGIgXGMgXGQKLQkuRU5ETQotCi0JZm9vIDEgMgotCWZvbyAxIDIgMyA0Ci0JZm9vIDEKLQlmb28gCi0KLQotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1ZDA3OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSEKLQotIQotCi0hCS5NQUNSTyAJZm9vIGEgYiBjPWEKLSEJXGEgXGIgXGMgXGQKLSEJLkVORE0KLSEKLQotIQlmb28gMSAyCi0hCTEgMiBhIFxkCi0JMSAyIGEgXGQKLSEJZm9vIDEgMiAzIDQKLSEJZm9vIDEKLSEJMSAgYSBcZAotCTEgIGEgXGQKLSEJZm9vIAotIQkgIGEgXGQKLQlhIFxkCi0hCi0KLSEKLQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODhhMDAzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotCi1mb286CS5BU1NJR05BCTEKLQlcJmZvbysxCQotCVwmZm9vKzEKLWZvbzoJLkFTU0lHTkMJImZvbyIKLQlcJmZvbysxCi0JXCZmb28rMQotCi1mb286CS5BU1NJR05BCTEKLQlcJmZvbysxCQotCVwmZm9vKzEKLWZvbzoJLkFTU0lHTkMJImZvbyIKLQlcJmZvbysxCi0JXCZmb28rMQotCi1mb286CS5BU1NJR05BCTEKLQlcJmZvbysxCQotCVwmZm9vKzEKLWZvbzoJLkFTU0lHTkMJImZvbyIKLQlcJmZvbysxCi0JXCZmb28rMQotCi1mb286CS5BU1NJR05BCTEKLQlcJmZvbysxCQotCVwmZm9vKzEKLWZvbzoJLkFTU0lHTkMJImZvbyIKLQlcJmZvbysxCi0JXCZmb28rMQotCi1mb286CS5BU1NJR05BCTEKLQlcJmZvbysxCQotCVwmZm9vKzEKLWZvbzoJLkFTU0lHTkMJImZvbyIKLQlcJmZvbysxCi0JXCZmb28rMQotCWZvbwotCWZvbwlmb28KLQlmb28JZm9vCi0JZm9vCi0JLkVORAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMWEyZjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0hCi0KLSFmb286CS5BU1NJR05BCTEKLSEJXCZmb28rMQkKLQkxKzEJCi0hCVwmZm9vKzEKLQkxKzEKLSFmb286CS5BU1NJR05DCSJmb28iCi0hCVwmZm9vKzEKLQlmb28rMQotIQlcJmZvbysxCi0JZm9vKzEKLSEKLQotIWZvbzoJLkFTU0lHTkEJMQotIQlcJmZvbysxCQotCTErMQkKLSEJXCZmb28rMQotCTErMQotIWZvbzoJLkFTU0lHTkMJImZvbyIKLSEJXCZmb28rMQotCWZvbysxCi0hCVwmZm9vKzEKLQlmb28rMQotIQotCi0hZm9vOgkuQVNTSUdOQQkxCi0hCVwmZm9vKzEJCi0JMSsxCQotIQlcJmZvbysxCi0JMSsxCi0hZm9vOgkuQVNTSUdOQwkiZm9vIgotIQlcJmZvbysxCi0JZm9vKzEKLSEJXCZmb28rMQotCWZvbysxCi0hCi0KLSFmb286CS5BU1NJR05BCTEKLSEJXCZmb28rMQkKLQkxKzEJCi0hCVwmZm9vKzEKLQkxKzEKLSFmb286CS5BU1NJR05DCSJmb28iCi0hCVwmZm9vKzEKLQlmb28rMQotIQlcJmZvbysxCi0JZm9vKzEKLSEKLQotIWZvbzoJLkFTU0lHTkEJMQotIQlcJmZvbysxCQotCTErMQkKLSEJXCZmb28rMQotCTErMQotIWZvbzoJLkFTU0lHTkMJImZvbyIKLSEJXCZmb28rMQotCWZvbysxCi0hCVwmZm9vKzEKLQlmb28rMQotIQlmb28KLQlmb28KLSEJZm9vCWZvbwotCWZvbwlmb28KLSEJZm9vCWZvbwotCWZvbwlmb28KLSEJZm9vCi0JZm9vCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9kYXRhLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9kYXRhLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE2YjBhMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0KLWZvbwkuREFUQQkxLDIsMwotYmFyCS5EQVRBCTEsMiwzLDQsNSAsNgotCS5EQVRBLkIJMTIzNDUsMTIsMgotCS5EQVRBLlcgOSwyLDEyLDMsMTMrNDEsZm9vKzkKLQkuREFUQS5MIDJ+OTkKLQotCi0KLQkuREFUQUIJMSwyLDMKLQkuREFUQUIJMSwyLDMKLQotCi0KLQotCS5EQVRBQgkxLDkrMzIKLQotCS5EQVRBQi5MCTEsSCcxMTExMTExMQotCS5EQVRBQi5XCTIsSCcyMjIyCi0JLkRBVEFCLkIJMyxIJzMzMwotCi0KLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9kYXRhLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9kYXRhLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2ZTFlNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0hCi0KLSFmb28JLkRBVEEJMSwyLDMKLWZvbzoJLmxvbmcJMSwyLDMKLSFiYXIJLkRBVEEJMSwyLDMsNCw1ICw2Ci1iYXI6CS5sb25nCTEsMiwzLDQsNSw2Ci0hCS5EQVRBLkIJMTIzNDUsMTIsMgotCS5ieXRlCTEyMzQ1LDEyLDIKLSEJLkRBVEEuVyA5LDIsMTIsMywxMys0MSxmb28rOQotCS5zaG9ydAk5LDIsMTIsMyw1NCxmb28rOQotIQkuREFUQS5MIDJ+OTkKLQkubG9uZwk5NwotIQotCi0hCi0KLSEKLQotIQkuREFUQUIJMSwyLDMKLQkuZmlsbAkxLDQsMgotIQkuREFUQUIJMSwyLDMKLQkuZmlsbAkxLDQsMgotIQotCi0hCi0KLSEKLQotIQotCi0hCS5EQVRBQgkxLDkrMzIKLQkuZmlsbAkxLDQsNDEKLSEKLQotIQkuREFUQUIuTAkxLEgnMTExMTExMTEKLQkuZmlsbAkxLDQsMjg2MzMxMTUzCi0hCS5EQVRBQi5XCTIsSCcyMjIyCi0JLmZpbGwJMiwyLDg3MzgKLSEJLkRBVEFCLkIJMyxIJzMzMwotCS5maWxsCTMsMSw4MTkKLSEKLQotIQotCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9leHAuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2V4cC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MTYwOGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2V4cC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0KLTsgdGVzdCBhbGwgb3BzCi0KLWExCS5FUVUJNCsxMAotYTIJLkVRVQk0LTEwCi1hMwkuRVFVCTQmMTAKLWE0CS5FUVUJNHwyCi1hNQkuRVFVCTR+MgotYTYJLkVRVQk0KjEwCi1hNwkuRVFVCTQwLzEwCi1hOAkuRVFVCSs3Ci1hOQkuRVFVCS03Ci1hMTAJLkVRVQl+NwotCi0KLQlhMSBhMiBhMyBhNCBhNSBhNiBhNyBhOCBhOSBhMTAKLQotOyB0ZXN0IHRoZSBwcmlvcml0aWVzCi0KLWIxCS5FUVUJMXwyfjMmNCs1LTgqNy8yCi1iMgkuRVFVCSgxfDJ+KDMmKDQrNS0oOCooNy8yKSkpKSkKLWIzCS5FUVUJMTAqMi8zKjQKLWI0CS5FUVUJKCgoMTAqMikvMykqNCkKLWI1CS5FUVUJMTArMi0zKzQKLWI2CS5FUVUJKCgoMTArMiktMykrNCkKLQotCWIxIGIyIGIzIGI0Ci0KLTsgdGVzdCBhc3NvY2lhdGlvbgotCi1jMQkuRVFVCS1+MwotYzIJLkVRVQl+LTMKLWMzCS5FUVUJLSh+MykKLWM0CS5FUVUJfigtMykKLQotCWMxIGMyIGMzIGM0Ci0KLTsgdGVzdCBydWxlcyBmb3Igc3ltYm9scwotCi1vazEJLkVRVQlGT08KLW9rMgkuRVFVCUZPTysxMAotb2szCS5FUVUJMTArRk9PCi1vazQJLkVRVQlGT08tMTAKLQotCW9rMQotCW9rMiAKLQlvazMgCi0Jb2s0Ci0KLW9rNQkuRVFVCUZPTyszKzQrNSs2Ci1vazYJLkVRVQlGT08tQkFSCi0KLQlvazUKLQlvazYKLQotYmFkMQkuRVFVCUZPTytGT08KLWJhZDIJLkVRVQlGT08qMgotYmFkMwkuRVFVCUZPTy8yCi1iYWQ0CS5FUVUJRk9PfDIKLWJhZDUJLkVRVQlGT08mMgotYmFkNgkuRVFVCUZPT34yCi1iYWQ3CS5FUVUJRk9PKjIKLQotOyB0ZXN0IHNwYWNpbmcKLQotc3BhY2UxCS5FUVUJMSArCTIJKzMrRk9PICsgMwotc3BhY2UyCi0KLTsgZnJvbSB0aGUgU0ggbWFudWFsCi0KLQkuREFUQS5MCTErKDItKDMrKDQtNSkpKSwxCi0KLQkuREFUQS5MCS1IJ2ZmZmZmZmYxK0gnMDAwMDAwZjAqSCcwMDAwMDAxMHxIJzAwMDAwMGYwJkgnMDAwMGZmZmYsSCcwMDAwMGZmZgotCi0JLkRBVEEuTAktfi1+SCcwMDAwMDAwZixIJzAwCi0KLQotCQotCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2V4cC5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvZXhwLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQxZmQ1Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvZXhwLmVycgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotZXhwLmFzbTo1NiBjYW4ndCBhZGQgdHdvIHJlbG9jYXRhYmxlIGV4cHJlc3Npb25zCi1leHAuYXNtOjU3IHRoZSAqIG9wZXJhdG9yIGNhbm5vdCB0YWtlIG5vbi1hYnNvbHV0ZSBhcmd1bWVudHMuCi1leHAuYXNtOjU4IHRoZSAvIG9wZXJhdG9yIGNhbm5vdCB0YWtlIG5vbi1hYnNvbHV0ZSBhcmd1bWVudHMuCi1leHAuYXNtOjU5IHRoZSB8IG9wZXJhdG9yIGNhbm5vdCB0YWtlIG5vbi1hYnNvbHV0ZSBhcmd1bWVudHMuCi1leHAuYXNtOjYwIHRoZSAmIG9wZXJhdG9yIGNhbm5vdCB0YWtlIG5vbi1hYnNvbHV0ZSBhcmd1bWVudHMuCi1leHAuYXNtOjYxIHRoZSB+IG9wZXJhdG9yIGNhbm5vdCB0YWtlIG5vbi1hYnNvbHV0ZSBhcmd1bWVudHMuCi1leHAuYXNtOjYyIHRoZSAqIG9wZXJhdG9yIGNhbm5vdCB0YWtlIG5vbi1hYnNvbHV0ZSBhcmd1bWVudHMuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvZXhwLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9leHAub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWNiOWE4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9leHAub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLSEKLQotITsgdGVzdCBhbGwgb3BzCi0JOyB0ZXN0IGFsbCBvcHMKLSEKLQotIWExCS5FUVUJNCsxMAotIWEyCS5FUVUJNC0xMAotIWEzCS5FUVUJNCYxMAotIWE0CS5FUVUJNHwyCi0hYTUJLkVRVQk0fjIKLSFhNgkuRVFVCTQqMTAKLSFhNwkuRVFVCTQwLzEwCi0hYTgJLkVRVQkrNwotIWE5CS5FUVUJLTcKLSFhMTAJLkVRVQl+NwotIQotCi0hCi0KLSEJYTEgYTIgYTMgYTQgYTUgYTYgYTcgYTggYTkgYTEwCi0JMTQgLTYgMCA2IDYgNDAgNCA3IC03IC04Ci0hCi0KLSE7IHRlc3QgdGhlIHByaW9yaXRpZXMKLQk7IHRlc3QgdGhlIHByaW9yaXRpZXMKLSEKLQotIWIxCS5FUVUJMXwyfjMmNCs1LTgqNy8yCi0hYjIJLkVRVQkoMXwyfigzJig0KzUtKDgqKDcvMikpKSkpCi0hYjMJLkVRVQkxMCoyLzMqNAotIWI0CS5FUVUJKCgoMTAqMikvMykqNCkKLSFiNQkuRVFVCTEwKzItMys0Ci0hYjYJLkVRVQkoKCgxMCsyKS0zKSs0KQotIQotCi0hCWIxIGIyIGIzIGI0Ci0JMiAyIDI0IDI0Ci0hCi0KLSE7IHRlc3QgYXNzb2NpYXRpb24KLQk7IHRlc3QgYXNzb2NpYXRpb24KLSEKLQotIWMxCS5FUVUJLX4zCi0hYzIJLkVRVQl+LTMKLSFjMwkuRVFVCS0ofjMpCi0hYzQJLkVRVQl+KC0zKQotIQotCi0hCWMxIGMyIGMzIGM0Ci0JNCAyIDQgMgotIQotCi0hOyB0ZXN0IHJ1bGVzIGZvciBzeW1ib2xzCi0JOyB0ZXN0IHJ1bGVzIGZvciBzeW1ib2xzCi0hCi0KLSFvazEJLkVRVQlGT08KLSFvazIJLkVRVQlGT08rMTAKLSFvazMJLkVRVQkxMCtGT08KLSFvazQJLkVRVQlGT08tMTAKLSEKLQotIQlvazEKLQlGT08KLSEJb2syIAotCUZPTysxMCAKLSEJb2szIAotCUZPTysxMCAKLSEJb2s0Ci0JRk9PKy0xMAotIQotCi0hb2s1CS5FUVUJRk9PKzMrNCs1KzYKLSFvazYJLkVRVQlGT08tQkFSCi0hCi0KLSEJb2s1Ci0JRk9PKzE4Ci0hCW9rNgotCUZPTy1GT08KLSEKLQotIWJhZDEJLkVRVQlGT08rRk9PCi0hYmFkMgkuRVFVCUZPTyoyCi0hYmFkMwkuRVFVCUZPTy8yCi0hYmFkNAkuRVFVCUZPT3wyCi0hYmFkNQkuRVFVCUZPTyYyCi0hYmFkNgkuRVFVCUZPT34yCi0hYmFkNwkuRVFVCUZPTyoyCi0hCi0KLSE7IHRlc3Qgc3BhY2luZwotCTsgdGVzdCBzcGFjaW5nCi0hCi0KLSFzcGFjZTEJLkVRVQkxICsJMgkrMytGT08gKyAzCi0hc3BhY2UyCi1zcGFjZTI6Ci0hCi0KLSE7IGZyb20gdGhlIFNIIG1hbnVhbAotCTsgZnJvbSB0aGUgU0ggbWFudWFsCi0hCi0KLSEJLkRBVEEuTAkxKygyLSgzKyg0LTUpKSksMQotCS5sb25nCTEsMQotIQotCi0hCS5EQVRBLkwJLUgnZmZmZmZmZjErSCcwMDAwMDBmMCpIJzAwMDAwMDEwfEgnMDAwMDAwZjAmSCcwMDAwZmZmZixIJzAwMDAwZmZmCi0JLmxvbmcJNDA5NSw0MDk1Ci0hCi0KLSEJLkRBVEEuTAktfi1+SCcwMDAwMDAwZixIJzAwCi0JLmxvbmcJMTcsMAotIQotCi0hCi0KLSEJCi0hCi0KLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2dhc3AuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2dhc3AuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTcyYTZkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9nYXNwLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMgVGVzdCBnYXNwLgotCi1wcm9jIGdhc3BfdGVzdCB7IGZpbGVuYW1lIHRlc3RuYW1lIG9wdCB9ICB7Ci0gICAgZ2xvYmFsIEdBU1AKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgc2VuZF9sb2cgIiRzcmNkaXIvbGliL3J1biAkR0FTUCAtSSRzcmNkaXIvZ2FzcCAtcyAkb3B0ICRmaWxlbmFtZS5hc20gLW8gZ2FzcC5vdXRcbiIKLSAgICBjYXRjaCAiZXhlYyAkc3JjZGlyL2xpYi9ydW4gJEdBU1AgLUkkc3JjZGlyL2dhc3AgLXMgJG9wdCAkZmlsZW5hbWUuYXNtIC1vIGdhc3Aub3V0IiBlcnJzCi0gICAgY2F0Y2ggImV4ZWMgZGlmZiBnYXNwLm91dCAkZmlsZW5hbWUub3V0IiBkaWZmcwotICAgIHNldCBkaWZmcyBbcHJ1bmVfd2FybmluZ3MgJGRpZmZzXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRkaWZmc10gewotCXNlbmRfbG9nICIkZGlmZnNcbiIKLQl2ZXJib3NlICRkaWZmcwotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuIDAKLSAgICB9IGVsc2UgewotCXBhc3MgJHRlc3RuYW1lCi0gICAgfQotCi19Ci0KLWZvcmVhY2ggc3JjIFsgbHNvcnQgWyBnbG9iICRzcmNkaXIvZ2FzcC8qLmFzbSBdIF0gewotICAgIHJlZ3N1YiAtYWxsICIuYXNtIiAkc3JjICIiIHQKLSAgICByZWdzdWIgIl4uKi8oXFteL1xdKikkIiAkdCAiZ2FzcCBcXDEiIHRlc3RuYW1lCi0gICAgZ2FzcF90ZXN0ICR0ICR0ZXN0bmFtZSAiIgotfQotCi1mb3JlYWNoIHNyYyBbIGxzb3J0IFsgZ2xvYiAkc3JjZGlyL2dhc3AvbXJpLyouYXNtIF0gXSB7Ci0gICAgcmVnc3ViIC1hbGwgIi5hc20iICRzcmMgIiIgdAotICAgIHJlZ3N1YiAiXi4qLyhcW14vXF0qKSQiICR0ICJnYXNwIE1SSSBcXDEiIHRlc3RuYW1lCi0gICAgZ2FzcF90ZXN0ICR0ICR0ZXN0bmFtZSAiLU0iCi19Ci0KLSMgRklYTUU6IHRoaXMgaXMgaGVyZSBjYXVzZSBvZiBhIGJ1ZyBpbiBEZWphR251IDEuMS4xLiBXaGVuIGl0IGlzIG5vIGxvbmdlcgotIyAgICAgICAgaW4gdXNlLCB0aGVuIHRoaXMgY2FuIGJlIHJlbW92ZWQuCi1pZiBbaW5mbyBleGlzdHMgZXJyb3JJbmZvXSB0aGVuIHsKLSAgICB1bnNldCBlcnJvckluZm8KLX0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2luY2x1ZGUuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2luY2x1ZGUuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWVkMWRkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9pbmNsdWRlLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCUhJCi0JLklOQ0xVREUJIklOQzEuSCIKLQlUSEVSRQotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9pbmNsdWRlLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9pbmNsdWRlLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvaW5jbHVkZS5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2luY2x1ZGUub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2luY2x1ZGUub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzdhMGRmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9pbmNsdWRlLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSEJSEkKLQlISQotIQkuSU5DTFVERQkiSU5DMS5IIgotIUZJTEUgMSBGSVJTVCBMSU5FCi1GSUxFOgkxIEZJUlNUIExJTkUKLSEJLklOQ0xVREUJIklOQzIuSCIKLSEJRklMRSAyIEZJUlNUIExJTkUKLQlGSUxFIDIgRklSU1QgTElORQotIQlGSUxFIDIgTEFTVCBMSU5FCi0JRklMRSAyIExBU1QgTElORQotIUZJTEUgMSBMQVNUIExJTkUKLUZJTEU6CTEgTEFTVCBMSU5FCi0hCVRIRVJFCi0JVEhFUkUKLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2xpc3RpbmcuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2xpc3RpbmcuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjE0Y2ZjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9saXN0aW5nLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQotCi0JLkhFQURJTkcJIiAiIlFVT1RFIiIgIgotCS5QQUdFCi0JLlBSSU5UIExJU1QKLQlmb28JCQotCS5QUklOVCBOT0xJU1QKLQlmb28KLQotCi0JLkZPUk0JTElOPTEyCi0JLkZPUk0JQ09MPTkwCi0JLkZPUk0JTElOPTEyMyBDT0w9MjMKLQkKLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbGlzdGluZy5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbGlzdGluZy5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2xpc3RpbmcuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9saXN0aW5nLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9saXN0aW5nLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1YmRhMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbGlzdGluZy5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0hCi0KLSEKLQotIQkuSEVBRElORwkiICIiUVVPVEUiIiAiCi0JLnRpdGxlCSIgIlFVT1RFIiAiCi0hCS5QQUdFCi0JLmVqZWN0Ci0hCS5QUklOVCBMSVNUCi0JLmxpc3QKLSEJZm9vCQkKLQlmb28JCQotIQkuUFJJTlQgTk9MSVNUCi0JLm5vbGlzdAotIQlmb28KLQlmb28KLSEKLQotIQotCi0hCS5GT1JNCUxJTj0xMgotCS5wc2l6ZSAxMiwxMzIKLSEJLkZPUk0JQ09MPTkwCi0JLnBzaXplIDYwLDkwCi0hCS5GT1JNCUxJTj0xMjMgQ09MPTIzCi0JLnBzaXplIDEyMywyMwotIQkKLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21hY3JvLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYjE2YmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21hY3JvLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0JLk1BQ1JPCVNVTSBGUk9NPTAsIFRPPTkKLQk7IFxGUk9NIFxUTwotCU1PVglSXEZST00sUjEwCi1DT1VOVAkuQVNTSUdOQQlcRlJPTSsxCi0JLkFXSElMRQlcJkNPVU5UIExFIFxUTwotCU1PVglSXCZDT1VOVCxSMTAKLUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotCS5BRU5EVwotCS5FTkRNCi0KLQlTVU0gMCw1Ci0JU1VNIAlUTz01Ci0JU1VNIAlGUk9NPTIsIFRPPTUKLQotCi07IGhpIHRoaXMgaXMgYSBjb21tZW50Ci0JLk1BQ1JPCUJBQ0tfU0xBU0hfU0VUCi0JXChNT1YJIyJcIixSMCkgCi0JLkVORE0KLQlCQUNLX1NMQVNIX1NFVAotCS5NQUNSTwlDT01NCi0JYmFyCTsgdGhpcyBjb21tZW50IHdpbGwgZ2V0IGNvcGllZCBvdXQKLQlmb28JXDsgdGhpcyBvbmUgd2lsbCBnZXQgZHJvcHBlZAotCS5FTkRNCi0JQ09NTQotCUJBQ0tfU0xBU0hfU0VUCi0JLk1BQ1JPCVBMVVMyCi0JQURECSMxLFJcJlYxCi0JLlNEQVRBCSJcJlYnMSIKLQkuRU5ETQotVgkuQVNTSUdOQwkiUiIKLVYxCS5BU1NJR05BCTEKLQlQTFVTMgotCS5NQUNSTwlQTFVTMQlQLFAxCi0JQURECSMxLFxQMQotCS5TREFUQQkiXFAnMSIKLQkuRU5ETQotCVBMVVMxCVIsUjEKLQotCS5NQUNSTwlTVU0gUDEKLQlNT1YJUjAsUjEwCi0JQURECVIxLFIxMAotCUFERAlSMixSMTAKLQlcUDEJCi0JQURECVIzLFIxMAotCS5FTkRNCi0KLQlTVU0JLkVYSVRNCi0KLQkuTUFDUk8gZm9vIGJhcj1hIGRlZmF1bHQ9YgotCVxiYXIKLQlcZGVmYXVsdAotCWJhcgotCWRlZmF1bHQKLQkuRU5ETQotCWZvbyBkZWZhdWx0PWRvZyBiYXI9Y2F0Ci0JZm9vIFggWQotCWZvbwotCWZvbyBiYXI9Y2F0IGRlZmF1bHQ9ZG9nCi0KLQotCS5NQUNSTwlmb28gYmFyCi0JSEkKLQlISSBcYmFyCi0JSEkKLQkuRU5ETQotCi0JZm9vIDEKLQlmb28gMTIzCi0JZm9vIDEgMiAzIDQKLQlmb28KLQotCQotCS5NQUNSTwlQVVNIIFJuCi0JTU9WLkwJXFJuLEAtcjE1Ci0JLkVORE0KLQlQVVNICVIwCi0JUFVTSAlSMQotCi0KLQkuTUFDUk8JUkVTX1NUUiBTVFIsIFJuCi0JTU9WLkwJI3N0clxALFxSbgotCUJSQQllbmRfc3RyXEAKLQlOT1AKLXN0clxACS5TREFUQSAiXFNUUiIKLQkuQUxJR04JMgotZW5kX3N0clxACi0JLkVORE0KLQkKLQlSRVNfU1RSCSJPTkUiLFIwCQotCVJFU19TVFIJIlRXTyIsUjEKLQlSRVNfU1RSCSJUSFJFRSIsUjIKLQotCi0KLQlSRVNfU1RSIFNUUj1kb25rZXkgUm49UjEKLQlSRVNfU1RSIGRvbmtleSxSMQotIAlSRVNfU1RSIGRvbmtleSBSbj1SMQotCS5FTkQKLQotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbWFjcm8uZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21hY3JvLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDA3MzIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21hY3JvLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi0hCS5NQUNSTwlTVU0gRlJPTT0wLCBUTz05Ci0hCTsgXEZST00gXFRPCi0hCU1PVglSXEZST00sUjEwCi0hQ09VTlQJLkFTU0lHTkEJXEZST00rMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgXFRPCi0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCS5FTkRNCi0hCi0KLSEJU1VNIDAsNQotIQk7IDAgNQotCTsgMCA1Ci0hCU1PVglSMCxSMTAKLQlNT1YJUjAsUjEwCi0hQ09VTlQJLkFTU0lHTkEJMCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCU1PVglSXCZDT1VOVCxSMTAKLQlNT1YJUjEsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCU1PVglSXCZDT1VOVCxSMTAKLQlNT1YJUjIsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCU1PVglSXCZDT1VOVCxSMTAKLQlNT1YJUjMsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCU1PVglSXCZDT1VOVCxSMTAKLQlNT1YJUjQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCU1PVglSXCZDT1VOVCxSMTAKLQlNT1YJUjUsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCVNVTSAJVE89NQotIQk7IDAgNQotCTsgMCA1Ci0hCU1PVglSMCxSMTAKLQlNT1YJUjAsUjEwCi0hQ09VTlQJLkFTU0lHTkEJMCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCU1PVglSXCZDT1VOVCxSMTAKLQlNT1YJUjEsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCU1PVglSXCZDT1VOVCxSMTAKLQlNT1YJUjIsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCU1PVglSXCZDT1VOVCxSMTAKLQlNT1YJUjMsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCU1PVglSXCZDT1VOVCxSMTAKLQlNT1YJUjQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCU1PVglSXCZDT1VOVCxSMTAKLQlNT1YJUjUsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCVNVTSAJRlJPTT0yLCBUTz01Ci0hCTsgMiA1Ci0JOyAyIDUKLSEJTU9WCVIyLFIxMAotCU1PVglSMixSMTAKLSFDT1VOVAkuQVNTSUdOQQkyKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIDUKLSEJTU9WCVJcJkNPVU5ULFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQUVORFcKLSEJTU9WCVJcJkNPVU5ULFIxMAotCU1PVglSMyxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIDUKLSEJTU9WCVJcJkNPVU5ULFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQUVORFcKLSEJTU9WCVJcJkNPVU5ULFIxMAotCU1PVglSNCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIDUKLSEJTU9WCVJcJkNPVU5ULFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQUVORFcKLSEJTU9WCVJcJkNPVU5ULFIxMAotCU1PVglSNSxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIDUKLSEJTU9WCVJcJkNPVU5ULFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQUVORFcKLSEKLQotIQotCi0hOyBoaSB0aGlzIGlzIGEgY29tbWVudAotCTsgaGkgdGhpcyBpcyBhIGNvbW1lbnQKLSEJLk1BQ1JPCUJBQ0tfU0xBU0hfU0VUCi0hCVwoTU9WCSMiXCIsUjApIAotIQkuRU5ETQotIQlCQUNLX1NMQVNIX1NFVAotIQlNT1YJIyJcIixSMCAKLQlNT1YJIyJcIixSMCAKLSEJLk1BQ1JPCUNPTU0KLSEJYmFyCTsgdGhpcyBjb21tZW50IHdpbGwgZ2V0IGNvcGllZCBvdXQKLSEJZm9vCVw7IHRoaXMgb25lIHdpbGwgZ2V0IGRyb3BwZWQKLSEJLkVORE0KLSEJQ09NTQotIQliYXIJOyB0aGlzIGNvbW1lbnQgd2lsbCBnZXQgY29waWVkIG91dAotCWJhcgk7IHRoaXMgY29tbWVudCB3aWxsIGdldCBjb3BpZWQgb3V0Ci0hCWZvbwlcOyB0aGlzIG9uZSB3aWxsIGdldCBkcm9wcGVkCi0JZm9vCVw7IHRoaXMgb25lIHdpbGwgZ2V0IGRyb3BwZWQKLSEJQkFDS19TTEFTSF9TRVQKLSEJTU9WCSMiXCIsUjAgCi0JTU9WCSMiXCIsUjAgCi0hCS5NQUNSTwlQTFVTMgotIQlBREQJIzEsUlwmVjEKLSEJLlNEQVRBCSJcJlYnMSIKLSEJLkVORE0KLSFWCS5BU1NJR05DCSJSIgotIVYxCS5BU1NJR05BCTEKLSEJUExVUzIKLSEJQURECSMxLFJcJlYxCi0JQURECSMxLFIxCi0hCS5TREFUQQkiXCZWJzEiCi0JLmJ5dGUJODIsNDkKLSEJLk1BQ1JPCVBMVVMxCVAsUDEKLSEJQURECSMxLFxQMQotIQkuU0RBVEEJIlxQJzEiCi0hCS5FTkRNCi0hCVBMVVMxCVIsUjEKLSEJQURECSMxLFIxCi0JQURECSMxLFIxCi0hCS5TREFUQQkiUjEiCi0JLmJ5dGUJODIsNDkKLSEKLQotIQkuTUFDUk8JU1VNIFAxCi0hCU1PVglSMCxSMTAKLSEJQURECVIxLFIxMAotIQlBREQJUjIsUjEwCi0hCVxQMQkKLSEJQURECVIzLFIxMAotIQkuRU5ETQotIQotCi0hCVNVTQkuRVhJVE0KLSEJTU9WCVIwLFIxMAotCU1PVglSMCxSMTAKLSEJQURECVIxLFIxMAotCUFERAlSMSxSMTAKLSEJQURECVIyLFIxMAotCUFERAlSMixSMTAKLSEJLkVYSVRNCQotIQotCi0hCS5NQUNSTyBmb28gYmFyPWEgZGVmYXVsdD1iCi0hCVxiYXIKLSEJXGRlZmF1bHQKLSEJYmFyCi0hCWRlZmF1bHQKLSEJLkVORE0KLSEJZm9vIGRlZmF1bHQ9ZG9nIGJhcj1jYXQKLSEJY2F0Ci0JY2F0Ci0hCWRvZwotCWRvZwotIQliYXIKLQliYXIKLSEJZGVmYXVsdAotCWRlZmF1bHQKLSEJZm9vIFggWQotIQlYCi0JWAotIQlZCi0JWQotIQliYXIKLQliYXIKLSEJZGVmYXVsdAotCWRlZmF1bHQKLSEJZm9vCi0hCWEKLQlhCi0hCWIKLQliCi0hCWJhcgotCWJhcgotIQlkZWZhdWx0Ci0JZGVmYXVsdAotIQlmb28gYmFyPWNhdCBkZWZhdWx0PWRvZwotIQljYXQKLQljYXQKLSEJZG9nCi0JZG9nCi0hCWJhcgotCWJhcgotIQlkZWZhdWx0Ci0JZGVmYXVsdAotIQotCi0hCi0KLSEJLk1BQ1JPCWZvbyBiYXIKLSEJSEkKLSEJSEkgXGJhcgotIQlISQotIQkuRU5ETQotIQotCi0hCWZvbyAxCi0hCUhJCi0JSEkKLSEJSEkgMQotCUhJIDEKLSEJSEkKLQlISQotIQlmb28gMTIzCi0hCUhJCi0JSEkKLSEJSEkgMTIzCi0JSEkgMTIzCi0hCUhJCi0JSEkKLSEJZm9vIDEgMiAzIDQKLSEJZm9vCi0hCUhJCi0JSEkKLSEJSEkgCi0JSEkgCi0hCUhJCi0JSEkKLSEKLQotIQkKLSEJLk1BQ1JPCVBVU0ggUm4KLSEJTU9WLkwJXFJuLEAtcjE1Ci0hCS5FTkRNCi0hCVBVU0gJUjAKLSEJTU9WLkwJUjAsQC1yMTUKLQlNT1YuTAlSMCxALXIxNQotIQlQVVNICVIxCi0hCU1PVi5MCVIxLEAtcjE1Ci0JTU9WLkwJUjEsQC1yMTUKLSEKLQotIQotCi0hCS5NQUNSTwlSRVNfU1RSIFNUUiwgUm4KLSEJTU9WLkwJI3N0clxALFxSbgotIQlCUkEJZW5kX3N0clxACi0hCU5PUAotIXN0clxACS5TREFUQSAiXFNUUiIKLSEJLkFMSUdOCTIKLSFlbmRfc3RyXEAKLSEJLkVORE0KLSEJCi0hCVJFU19TVFIJIk9ORSIsUjAJCi0hCU1PVi5MCSNzdHIwMDAxOCxSMAotCU1PVi5MCSNzdHIwMDAxOCxSMAotIQlCUkEJZW5kX3N0cjAwMDE4Ci0JQlJBCWVuZF9zdHIwMDAxOAotIQlOT1AKLQlOT1AKLSFzdHIwMDAxOAkuU0RBVEEgIk9ORSIKLXN0cjAwMDE4OgkuYnl0ZQk3OSw3OCw2OQotIQkuQUxJR04JMgotCS5hbGlnbgkyCi0hZW5kX3N0cjAwMDE4Ci1lbmRfc3RyMDAwMTg6Ci0hCVJFU19TVFIJIlRXTyIsUjEKLSEJTU9WLkwJI3N0cjAwMDE5LFIxCi0JTU9WLkwJI3N0cjAwMDE5LFIxCi0hCUJSQQllbmRfc3RyMDAwMTkKLQlCUkEJZW5kX3N0cjAwMDE5Ci0hCU5PUAotCU5PUAotIXN0cjAwMDE5CS5TREFUQSAiVFdPIgotc3RyMDAwMTk6CS5ieXRlCTg0LDg3LDc5Ci0hCS5BTElHTgkyCi0JLmFsaWduCTIKLSFlbmRfc3RyMDAwMTkKLWVuZF9zdHIwMDAxOToKLSEJUkVTX1NUUgkiVEhSRUUiLFIyCi0hCU1PVi5MCSNzdHIwMDAyMCxSMgotCU1PVi5MCSNzdHIwMDAyMCxSMgotIQlCUkEJZW5kX3N0cjAwMDIwCi0JQlJBCWVuZF9zdHIwMDAyMAotIQlOT1AKLQlOT1AKLSFzdHIwMDAyMAkuU0RBVEEgIlRIUkVFIgotc3RyMDAwMjA6CS5ieXRlCTg0LDcyLDgyLDY5LDY5Ci0hCS5BTElHTgkyCi0JLmFsaWduCTIKLSFlbmRfc3RyMDAwMjAKLWVuZF9zdHIwMDAyMDoKLSEKLQotIQotCi0hCi0KLSEJUkVTX1NUUiBTVFI9ZG9ua2V5IFJuPVIxCi0hCU1PVi5MCSNzdHIwMDAyMSxSMQotCU1PVi5MCSNzdHIwMDAyMSxSMQotIQlCUkEJZW5kX3N0cjAwMDIxCi0JQlJBCWVuZF9zdHIwMDAyMQotIQlOT1AKLQlOT1AKLSFzdHIwMDAyMQkuU0RBVEEgImRvbmtleSIKLXN0cjAwMDIxOgkuYnl0ZQkxMDAsMTExLDExMCwxMDcsMTAxLDEyMQotIQkuQUxJR04JMgotCS5hbGlnbgkyCi0hZW5kX3N0cjAwMDIxCi1lbmRfc3RyMDAwMjE6Ci0hCVJFU19TVFIgZG9ua2V5LFIxCi0hCU1PVi5MCSNzdHIwMDAyMixSMQotCU1PVi5MCSNzdHIwMDAyMixSMQotIQlCUkEJZW5kX3N0cjAwMDIyCi0JQlJBCWVuZF9zdHIwMDAyMgotIQlOT1AKLQlOT1AKLSFzdHIwMDAyMgkuU0RBVEEgImRvbmtleSIKLXN0cjAwMDIyOgkuYnl0ZQkxMDAsMTExLDExMCwxMDcsMTAxLDEyMQotIQkuQUxJR04JMgotCS5hbGlnbgkyCi0hZW5kX3N0cjAwMDIyCi1lbmRfc3RyMDAwMjI6Ci0hIAlSRVNfU1RSIGRvbmtleSBSbj1SMQotIQlNT1YuTAkjc3RyMDAwMjMsUjEKLQlNT1YuTAkjc3RyMDAwMjMsUjEKLSEJQlJBCWVuZF9zdHIwMDAyMwotCUJSQQllbmRfc3RyMDAwMjMKLSEJTk9QCi0JTk9QCi0hc3RyMDAwMjMJLlNEQVRBICJkb25rZXkiCi1zdHIwMDAyMzoJLmJ5dGUJMTAwLDExMSwxMTAsMTA3LDEwMSwxMjEKLSEJLkFMSUdOCTIKLQkuYWxpZ24JMgotIWVuZF9zdHIwMDAyMwotZW5kX3N0cjAwMDIzOgotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbWRvdWJsZS5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvbWRvdWJsZS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYjc3YjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21kb3VibGUuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotCi0JLk1BQ1JPCUhJCi0JQQotCVwhIHRoaXMgaXMgaGlkZGVuCi0JQgotCSEgdGhpcyBpcyBub3QKLQlDCi0JLkVORE0KLQlIZWxsbyAKLQlISQotCUVtaWx5Ci0JCi0KLQlIJzBmCi0JMjAwK0gnMEYKLQotWFgJLkFTU0lHTkEJUScxMDAKLSEgRGVmaW5pdGlvbjoKLQkuTUFDUk8JR0VUIFg9MTAwLFksWgotCU1PVgkjXFgrSCcwRixAQgotCVxZCi1cWglKTVAJQE1BSU4KLUxcQAlBREQgCSMxLEBITAotCU1PVgkjMCxAQwlcISBDbGVhciBDCi0JQURECSMyLEBDCi0JQURECSNcJlhYLCBAQwotCS5FTkRNCi0KLQlOT1AKLQotIUNhbGw6CQotCUdFVAkyMDAsIkFERCAjMSxAQiIsIEVOVFJZCi0JLkVORAotCi0JOyBEZWZpbml0aW9uOgotCi0KLQlOT1AKLQotCTtDYWxsOgkKLQlNT1YJIzIwMCswRixAQgotCUFERCAjMSxAQgotRU5UUlk6CUpNUAlATUFJTgotTDAwMDAwOglBREQgCSMxLEBITAotCU1PVgkjMCxAQwkKLQlBREQJIzIsQEMKLQlBREQJIzAsIEBDCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbWRvdWJsZS5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbWRvdWJsZS5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21kb3VibGUuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tZG91YmxlLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tZG91YmxlLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ5YWQ2Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbWRvdWJsZS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0hCi0KLSEJLk1BQ1JPCUhJCi0hCUEKLSEJXCEgdGhpcyBpcyBoaWRkZW4KLSEJQgotIQkhIHRoaXMgaXMgbm90Ci0hCUMKLSEJLkVORE0KLSEJSGVsbG8gCi0JSGVsbG8gCi0hCUhJCi0hCUEKLQlBCi0hCQotIQlCCi0JQgotIQkhIHRoaXMgaXMgbm90Ci0JISB0aGlzIGlzIG5vdAotIQlDCi0JQwotIQlFbWlseQotCUVtaWx5Ci0hCQotIQotCi0hCUgnMGYKLQkxNQotIQkyMDArSCcwRgotCTIwMCsxNQotIQotCi0hWFgJLkFTU0lHTkEJUScxMDAKLSEhIERlZmluaXRpb246Ci0JISBEZWZpbml0aW9uOgotIQkuTUFDUk8JR0VUIFg9MTAwLFksWgotIQlNT1YJI1xYK0gnMEYsQEIKLSEJXFkKLSFcWglKTVAJQE1BSU4KLSFMXEAJQUREIAkjMSxASEwKLSEJTU9WCSMwLEBDCVwhIENsZWFyIEMKLSEJQURECSMyLEBDCi0hCUFERAkjXCZYWCwgQEMKLSEJLkVORE0KLSEKLQotIQlOT1AKLQlOT1AKLSEKLQotISFDYWxsOgkKLQkhQ2FsbDoJCi0hCUdFVAkyMDAsIkFERCAjMSxAQiIsIEVOVFJZCi0hCU1PVgkjMjAwK0gnMEYsQEIKLQlNT1YJIzIwMCsxNSxAQgotIQlBREQgIzEsQEIKLQlBREQgIzEsQEIKLSFFTlRSWQlKTVAJQE1BSU4KLUVOVFJZOglKTVAJQE1BSU4KLSFMMDAwMDEJQUREIAkjMSxASEwKLUwwMDAwMToJQUREIAkjMSxASEwKLSEJTU9WCSMwLEBDCQotCU1PVgkjMCxAQwkKLSEJQURECSMyLEBDCi0JQURECSMyLEBDCi0hCUFERAkjXCZYWCwgQEMKLQlBREQJIzY0LCBAQwotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2VtYmVkLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZW1iZWQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWI4Zjc4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZW1iZWQuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1lbWJlZAltYWNybwlsYWJlbAotYWRkciYmbGFiZWwJZGMubAlsYWJlbAotCWVuZG0KLQotCWVtYmVkCWZvbwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9lbWJlZC5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2VtYmVkLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkOTI1Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2VtYmVkLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotO2VtYmVkCW1hY3JvCWxhYmVsCi07YWRkciYmbGFiZWwJZGMubAlsYWJlbAotOwllbmRtCi07Ci0KLTsJZW1iZWQJZm9vCi07YWRkcmZvbwlkYy5sCWZvbwotYWRkcmZvbzoJZGMubAlmb28KLTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2V4aXN0cy5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2V4aXN0cy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MjIwYzYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9leGlzdHMuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotZXhpc3RzCW1hY3JvCWFyZzEsYXJnMgotCWlmbmUJPT1hcmcyCi0JbW92ZQlhcmcxLGFyZzIKLQllbHNlYwotCXB1c2gJYXJnMQotCWVuZGMKLQllbmRtCi0KLQlleGlzdHMJZm9vLGJhcgotCWV4aXN0cwlmb28KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZXhpc3RzLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZXhpc3RzLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1MzM3ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2V4aXN0cy5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi07ZXhpc3RzCW1hY3JvCWFyZzEsYXJnMgotOwlpZm5lCT09YXJnMgotOwltb3ZlCWFyZzEsYXJnMgotOwllbHNlYwotOwlwdXNoCWFyZzEKLTsJZW5kYwotOwllbmRtCi07Ci0KLTsJZXhpc3RzCWZvbyxiYXIKLTsJaWZuZQktMQotOwltb3ZlCWZvbyxiYXIKLQltb3ZlCWZvbyxiYXIKLTsJZWxzZWMKLTsJcHVzaAlmb28KLTsJZW5kYwotOwlleGlzdHMJZm9vCi07CWlmbmUJMAotOwltb3ZlCWZvbywKLTsJZWxzZWMKLTsJcHVzaAlmb28KLQlwdXNoCWZvbwotOwllbmRjCi07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnAuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnAuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGEyMWQ5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCWlycAlwYXJhbSxhcmcxLGFyZzIsYXJnMwotCWRjLmwJcGFyYW0KLQllbmRyCi0JZW5kCXF1aXQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwNTYyMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycC5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTsJaXJwCXBhcmFtLGFyZzEsYXJnMixhcmczCi07CWRjLmwJcGFyYW0KLTsJZW5kcgotCWRjLmwJYXJnMQotCWRjLmwJYXJnMgotCWRjLmwJYXJnMwotOwllbmQJcXVpdAotCWVuZAlxdWl0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycGMuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnBjLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxZDY4Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycGMuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0JaXJwYwlkdW1teSwxMjM0Ci0JZGMubAlkdW1teQotCWVuZHIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwYy5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycGMub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWY4ODI0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwYy5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTsJaXJwYwlkdW1teSwxMjM0Ci07CWRjLmwJZHVtbXkKLTsJZW5kcgotCWRjLmwJMQotCWRjLmwJMgotCWRjLmwJMwotCWRjLmwJNAotOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbWFjcm8uYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9tYWNyby5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MTFiZDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9tYWNyby5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWdldAltYWNybwlhcmcxLGFyZzIsYXJnMwotCWRjLmwJYXJnMQotCWFyZzIKLWFyZzMJZGMubAlcNAotCW1vdmUuXDAJZDAsZDEKLQllbmRtCi0KLQlnZXQuYgkxLDxkYy5sIDI+LGxhYmVsLGZvdXIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbWFjcm8ub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9tYWNyby5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZWViOTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9tYWNyby5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi07Z2V0CW1hY3JvCWFyZzEsYXJnMixhcmczCi07CWRjLmwJYXJnMQotOwlhcmcyCi07YXJnMwlkYy5sCVw0Ci07CW1vdmUuXDAJZDAsZDEKLTsJZW5kbQotOwotCi07CWdldC5iCTEsPGRjLmwgMj4sbGFiZWwsZm91cgotOwlkYy5sCTEKLQlkYy5sCTEKLTsJZGMubCAyCi0JZGMubCAyCi07bGFiZWwJZGMubAlmb3VyCi1sYWJlbDoJZGMubAlmb3VyCi07CW1vdmUuYglkMCxkMQotCW1vdmUuYglkMCxkMQotOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbmFyZy5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL25hcmcuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTRjOTQwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbmFyZy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWxvb3AJbWFjcm8JYXJnMSxhcmcyLGFyZzMKLQlkYy5sCU5BUkcKLQlpZm5lCU5BUkcKLQlkYy5sCWFyZzEKLQlsb29wCWFyZzIsYXJnMwotCWVuZGMKLQllbmRtCi0KLQlsb29wCTEsMiwzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL25hcmcub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9uYXJnLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzZWJjMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL25hcmcub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotO2xvb3AJbWFjcm8JYXJnMSxhcmcyLGFyZzMKLTsJZGMubAlOQVJHCi07CWlmbmUJTkFSRwotOwlkYy5sCWFyZzEKLTsJbG9vcAlhcmcyLGFyZzMKLTsJZW5kYwotOwllbmRtCi07Ci0KLTsJbG9vcAkxLDIsMwotOwlkYy5sCTMKLQlkYy5sCTMKLTsJaWZuZQkzCi07CWRjLmwJMQotCWRjLmwJMQotOwlsb29wCTIsMwotOwlkYy5sCTIKLQlkYy5sCTIKLTsJaWZuZQkyCi07CWRjLmwJMgotCWRjLmwJMgotOwlsb29wCTMsCi07CWRjLmwJMQotCWRjLmwJMQotOwlpZm5lCTEKLTsJZGMubAkzCi0JZGMubAkzCi07CWxvb3AJLAotOwlkYy5sCTAKLQlkYy5sCTAKLTsJaWZuZQkwCi07CWRjLmwJCi07CWxvb3AJLAotOwllbmRjCi07CWVuZGMKLTsJZW5kYwotOwllbmRjCi07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9yZXB0LmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvcmVwdC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NjNiYjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9yZXB0LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCXJlcHQJMwotCWRjLmwJMQotCWVuZHIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvcmVwdC5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL3JlcHQub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTRlZDZiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvcmVwdC5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi07CXJlcHQJMwotOwlkYy5sCTEKLTsJZW5kcgotOwlkYy5sCTEKLQlkYy5sCTEKLTsJUkVQVAkyCi07CWRjLmwJMQotOwlFTkRSCi07CWRjLmwJMQotCWRjLmwJMQotOwlSRVBUCTEKLTsJZGMubAkxCi07CUVORFIKLTsJZGMubAkxCi0JZGMubAkxCi07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMS5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGwxLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM4YmZkZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwxLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQkKLQkuQUxURVJOQVRFCi0KLWFsbG9jIAlNQUNSTyB2YWwxLHZhbDIKLQlEQgl2YWwxCi0JREIgCXZhbDIKLQlFTkRNCi0KLQlhbGxvYwkidGhhdCdzIiAnc2hvdyBiaXonCi0JYWxsb2MJMCwxCi0JYWxsb2MJMCAxCi0JYWxsb2MJMAkxCi0JYWxsb2MJLDEKLQotCi0JCi0KLQotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMS5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZTMzMTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMS5lcnIKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FTkQgbWlzc2luZyBmcm9tIGVuZCBvZiBmaWxlLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGwxLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4MGYxMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwxLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSEJCi0hCS5BTFRFUk5BVEUKLSEKLQotIWFsbG9jIAlNQUNSTyB2YWwxLHZhbDIKLSEJREIJdmFsMQotIQlEQiAJdmFsMgotIQlFTkRNCi0hCi0KLSEJYWxsb2MJInRoYXQncyIgJ3Nob3cgYml6JwotIQlEQgkidGhhdCdzIgotCS5ieXRlCTExNiwxMDQsOTcsMTE2LDM5LDExNQotIQlEQiAJInNob3cgYml6IgotCS5ieXRlCTExNSwxMDQsMTExLDExOSwzMiw5OCwxMDUsMTIyCi0hCWFsbG9jCTAsMQotIQlEQgkwCi0JLmJ5dGUJMAotIQlEQiAJMQotCS5ieXRlCTEKLSEJYWxsb2MJMCAxCi0hCURCCTAKLQkuYnl0ZQkwCi0hCURCIAkxCi0JLmJ5dGUJMQotIQlhbGxvYwkwCTEKLSEJREIJMAotCS5ieXRlCTAKLSEJREIgCTEKLQkuYnl0ZQkxCi0hCWFsbG9jCSwxCi0hCURCCQotCS5ieXRlCQotIQlEQiAJMQotCS5ieXRlCTEKLSEKLQotIQotCi0hCQotIQotCi0hCi0KLSEKLQotIQotCi0hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMi5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGwyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk3MTEzNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLQotCi0JLkFMVEVSTkFURQotCi0JISBvawotCSEhIGFsc28gb2sKLQotZm9vCU1BQ1JPCQotCSEgeW91IGNhbiBzZWUgbWUKLQkhISBidXQgbm90IG1lCi0JISB5b3UgY2FuIHNlZSBtZQotCSEhIGJ1dCBub3QgbWUKLQlidXQgdGhpcyAiU0hPVUxEICEhQkUgT0siCi0JRU5ETQotCi0JZm9vCi0KLQotZGVmaW5lIAlNQUNSTwl2YWwxLHZhbDIKLQlEQiAJdmFsMQkhIHRoaXMgY29tbWVudCB3aWxsIHNob3cgdXAgCi0JREIJdmFsMgkhISB0aGlzIG9uIHdvbid0Ci0JRU5ETQotCi0JZGVmaW5lCTAsMQotCi0KLQlFTkQKLQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMi5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMi5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMi5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGwyLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhNmZhMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwyLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSEKLQotIQotCi0hCS5BTFRFUk5BVEUKLSEKLQotIQkhIG9rCi0JISBvawotIQkhISBhbHNvIG9rCi0JISEgYWxzbyBvawotIQotCi0hZm9vCU1BQ1JPCQotIQkhIHlvdSBjYW4gc2VlIG1lCi0hCSEhIGJ1dCBub3QgbWUKLSEJISB5b3UgY2FuIHNlZSBtZQotIQkhISBidXQgbm90IG1lCi0hCWJ1dCB0aGlzICJTSE9VTEQgISFCRSBPSyIKLSEJRU5ETQotIQotCi0hCWZvbwotIQkhIHlvdSBjYW4gc2VlIG1lCi0JISB5b3UgY2FuIHNlZSBtZQotIQkKLSEJISB5b3UgY2FuIHNlZSBtZQotCSEgeW91IGNhbiBzZWUgbWUKLSEJCi0hCWJ1dCB0aGlzICJTSE9VTEQgISFCRSBPSyIKLQlidXQgdGhpcyAiU0hPVUxEICEhQkUgT0siCi0hCi0KLSEKLQotIWRlZmluZSAJTUFDUk8JdmFsMSx2YWwyCi0hCURCIAl2YWwxCSEgdGhpcyBjb21tZW50IHdpbGwgc2hvdyB1cCAKLSEJREIJdmFsMgkhISB0aGlzIG9uIHdvbid0Ci0hCUVORE0KLSEKLQotIQlkZWZpbmUJMCwxCi0hCURCIAkwCSEgdGhpcyBjb21tZW50IHdpbGwgc2hvdyB1cCAKLQkuYnl0ZQkwISB0aGlzIGNvbW1lbnQgd2lsbCBzaG93IHVwIAotIQlEQgkxCQotCS5ieXRlCTEKLSEKLQotIQotCi0hCUVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGwzLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzMWRjYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwzLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLQkuQUxURVJOQVRFCi0KLWZvbwlNQUNSTwlzdHJpbmcKLQlMT0NBTAlsYWIxLCBsYWIyCi1sYWIxOglEQVRBLkwJbGFiMgotbGFiMjoJU0RBVEEJc3RyaW5nCi0JRU5ETQotCi0JZm9vCSJBbiBleGFtcGxlIgotCWZvbwkidXNpbmcgTE9DQUwiCi0KLSEgdGVzdCBvZiBMT0NBTCBkaXJlY3RpdmUKLQotY2hrX2VycglNQUNSTwlsaW1pdAotCUxPQ0FMCQlza2lwICEhIGZyb2IKLQlMT0NBTAkJemFwLGRvZyxiYXJmCi1iYXJmOgljbXAJCWF4LGxpbWl0CSEhIGNoZWNrIHZhbHVlIGFnYWluc3QKLQkJCQkJISEgbGltaXQKLQlqbGUJCXNraXAJCSEhIHNraXAgY2FsbCBpZiBPSwotc2tpcDoJY2FsbAkgCWVycm9yCi0JZm9vCQlkb2cKLQl6YXAJCWRvZwkKLQlub3AKLQlFTkRNCi0KLQljaGtfZXJyIDUKLQljaGtfZXJyIDEwCi0KLQotCUVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGwzLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwzLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwzLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDMub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjYxOTRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDMub3V0CisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotIQkuQUxURVJOQVRFCi0hCi0KLSFmb28JTUFDUk8Jc3RyaW5nCi0hCUxPQ0FMCWxhYjEsIGxhYjIKLSFsYWIxOglEQVRBLkwJbGFiMgotIWxhYjI6CVNEQVRBCXN0cmluZwotIQlFTkRNCi0hCi0KLSEJZm9vCSJBbiBleGFtcGxlIgotIQkKLSFMTDAwMDE6CURBVEEuTAlMTDAwMDIKLUxMMDAwMToJLmxvbmcJTEwwMDAyCi0hTEwwMDAyOglTREFUQQkiQW4gZXhhbXBsZSIKLUxMMDAwMjoJLmJ5dGUJNjUsMTEwLDMyLDEwMSwxMjAsOTcsMTA5LDExMiwxMDgsMTAxCi0hCWZvbwkidXNpbmcgTE9DQUwiCi0hCQotIUxMMDAwMzoJREFUQS5MCUxMMDAwNAotTEwwMDAzOgkubG9uZwlMTDAwMDQKLSFMTDAwMDQ6CVNEQVRBCSJ1c2luZyBMT0NBTCIKLUxMMDAwNDoJLmJ5dGUJMTE3LDExNSwxMDUsMTEwLDEwMywzMiw3Niw3OSw2Nyw2NSw3NgotIQotCi0hISB0ZXN0IG9mIExPQ0FMIGRpcmVjdGl2ZQotCSEgdGVzdCBvZiBMT0NBTCBkaXJlY3RpdmUKLSEKLQotIWNoa19lcnIJTUFDUk8JbGltaXQKLSEJTE9DQUwJCXNraXAgISEgZnJvYgotIQlMT0NBTAkJemFwLGRvZyxiYXJmCi0hYmFyZjoJY21wCQlheCxsaW1pdAkhISBjaGVjayB2YWx1ZSBhZ2FpbnN0Ci0hCQkJCQkhISBsaW1pdAotIQlqbGUJCXNraXAJCSEhIHNraXAgY2FsbCBpZiBPSwotIXNraXA6CWNhbGwJIAllcnJvcgotIQlmb28JCWRvZwotIQl6YXAJCWRvZwkKLSEJbm9wCi0hCUVORE0KLSEKLQotIQljaGtfZXJyIDUKLSEJCi0hCQotIUxMMDAwODoJY21wCQlheCw1CQotTEwwMDA4OgljbXAJCWF4LDUJCi0hCQkJCQkKLSEJamxlCQlMTDAwMDUJCQotCWpsZQkJTEwwMDA1CQkKLSFMTDAwMDU6CWNhbGwJIAllcnJvcgotTEwwMDA1OgljYWxsCSAJZXJyb3IKLSEJZm9vCQlMTDAwMDcKLSEJCi0hTEwwMDA5OglEQVRBLkwJTEwwMDBhCi1MTDAwMDk6CS5sb25nCUxMMDAwYQotIUxMMDAwYToJU0RBVEEJTEwwMDA3Ci1MTDAwMGE6CS5ieXRlCTc2LDc2LDQ4LDQ4LDQ4LDU1Ci0hCUxMMDAwNgkJTEwwMDA3CQotCUxMMDAwNgkJTEwwMDA3CQotIQlub3AKLQlub3AKLSEJY2hrX2VyciAxMAotIQkKLSEJCi0hTEwwMDBlOgljbXAJCWF4LDEwCQotTEwwMDBlOgljbXAJCWF4LDEwCQotIQkJCQkJCi0hCWpsZQkJTEwwMDBiCQkKLQlqbGUJCUxMMDAwYgkJCi0hTEwwMDBiOgljYWxsCSAJZXJyb3IKLUxMMDAwYjoJY2FsbAkgCWVycm9yCi0hCWZvbwkJTEwwMDBkCi0hCQotIUxMMDAwZjoJREFUQS5MCUxMMDAxMAotTEwwMDBmOgkubG9uZwlMTDAwMTAKLSFMTDAwMTA6CVNEQVRBCUxMMDAwZAotTEwwMDEwOgkuYnl0ZQk3Niw3Niw0OCw0OCw0OCwxMDAKLSEJTEwwMDBjCQlMTDAwMGQJCi0JTEwwMDBjCQlMTDAwMGQJCi0hCW5vcAotCW5vcAotIQotCi0hCi0KLSEJRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw0LmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWRkM2U4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDQuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS5BTFRFUk5BVEUKLSEgdGVzdCBvZiBtYWNybyBzdWJzdGl0dXRpb24gYXJvdW5kICZzCi0KLQotZm9vCU1BQ1JPCWEsYgotCXgmYSZiCi0JRU5ETQotCi0JZm9vIDMgMiAKLQlFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDQuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNC5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNC5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNC5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw0Lm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVkMTM5MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw0Lm91dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSEJLkFMVEVSTkFURQotISEgdGVzdCBvZiBtYWNybyBzdWJzdGl0dXRpb24gYXJvdW5kICZzCi0JISB0ZXN0IG9mIG1hY3JvIHN1YnN0aXR1dGlvbiBhcm91bmQgJnMKLSEKLQotIQotCi0hZm9vCU1BQ1JPCWEsYgotIQl4JmEmYgotIQlFTkRNCi0hCi0KLSEJZm9vIDMgMiAKLSEJeDMyCi0JeDMyCi0hCUVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNS5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw1LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiOTk5Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw1LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSEgdGVzdCBvZiBsaXRlcmFsIHRleHQgb3BlcmF0b3IKLQkuQUxURVJOQVRFCi1mb29wCU1BQ1JPCXN0cjEsc3RyMgotCVNEQVRBCSJzdHIxIgotCVNEQVRBCXN0cjIKLQlFTkRNCi0KLQotCQotCWZvb3AJdGhpczwgaXMgYSA8c3RyaW5nPiB3aXRoIGFuZ2xlIGJyYWNrZXRzPgotCWZvb3AgCXRoaXM8IGlzIGEgc3RyaW5nIHdpdGggc3BhY2VzPgotCWZvb3AJdGhpcyA8IGlzIGEgc3RyaW5nIHdpdGggYSAhPj4KLQotCi0JRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw1LmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDUuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDUuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDUub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYTQ4OGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0hISB0ZXN0IG9mIGxpdGVyYWwgdGV4dCBvcGVyYXRvcgotCSEgdGVzdCBvZiBsaXRlcmFsIHRleHQgb3BlcmF0b3IKLSEJLkFMVEVSTkFURQotIWZvb3AJTUFDUk8Jc3RyMSxzdHIyCi0hCVNEQVRBCSJzdHIxIgotIQlTREFUQQlzdHIyCi0hCUVORE0KLSEKLQotIQotCi0hCQotIQlmb29wCXRoaXM8IGlzIGEgPHN0cmluZz4gd2l0aCBhbmdsZSBicmFja2V0cz4KLSEJU0RBVEEJInRoaXMiCi0JLmJ5dGUJMTE2LDEwNCwxMDUsMTE1Ci0hCVNEQVRBCSIgaXMgYSA8c3RyaW5nPiB3aXRoIGFuZ2xlIGJyYWNrZXRzIgotCS5ieXRlCTMyLDEwNSwxMTUsMzIsOTcsMzIsNjAsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsNjIsMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDk3LDExMCwxMDMsMTA4LDEwMSwzMiw5OCwxMTQsOTcsOTksMTA3LDEwMSwxMTYsMTE1Ci0hCWZvb3AgCXRoaXM8IGlzIGEgc3RyaW5nIHdpdGggc3BhY2VzPgotIQlTREFUQQkidGhpcyIKLQkuYnl0ZQkxMTYsMTA0LDEwNSwxMTUKLSEJU0RBVEEJIiBpcyBhIHN0cmluZyB3aXRoIHNwYWNlcyIKLQkuYnl0ZQkzMiwxMDUsMTE1LDMyLDk3LDMyLDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDMyLDExOSwxMDUsMTE2LDEwNCwzMiwxMTUsMTEyLDk3LDk5LDEwMSwxMTUKLSEJZm9vcAl0aGlzIDwgaXMgYSBzdHJpbmcgd2l0aCBhICE+PgotIQlTREFUQQkidGhpcyIKLQkuYnl0ZQkxMTYsMTA0LDEwNSwxMTUKLSEJU0RBVEEJIiBpcyBhIHN0cmluZyB3aXRoIGEgPiIKLQkuYnl0ZQkzMiwxMDUsMTE1LDMyLDk3LDMyLDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDMyLDExOSwxMDUsMTE2LDEwNCwzMiw5NywzMiw2MgotIQotCi0hCi0KLSEJRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw2LmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDYuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjJkNjE3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDYuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotCS5BTFRFUk5BVEUKLSEgdGVzdCBvZiBleHByZXNzaW9uIG9wZXJhdG9yCi1kZWZpbmUgCU1BQ1JPIAl2YWwsIHN0cmluZwotCVNEQVRBIAl2YWwKLQlTREFUQQlzdHJpbmcKLQlFTkRNCi0JZGVmaW5lICIxIiwiOTklb2YxMDAiCSEgbm90aWNlICUgd2l0aGluIHN0cmluZwotCWRlZmluZSAJJTEgKyAyLCAiPTMiCi0KLQotCWRlZmluZSAJJSAxICsgMiAlMys0Ci0KLQlkZWZpbmUJJTMqNC0yICA8PTEwPgotCi0JZGVmaW5lCSUzKjQtMiAgNQotCi0JZGVmaW5lCSUxICsgMiw8aXMgZXF1YWwgdG8gJTEgKyAyLCByaWdodD8+Ci0KLQkhIGhhcyBubyBlZmZlY3QKLQotCWVuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw2LmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw2LmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw2Lm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDYub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2QxNmNmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDYub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotIQkuQUxURVJOQVRFCi0hISB0ZXN0IG9mIGV4cHJlc3Npb24gb3BlcmF0b3IKLQkhIHRlc3Qgb2YgZXhwcmVzc2lvbiBvcGVyYXRvcgotIWRlZmluZSAJTUFDUk8gCXZhbCwgc3RyaW5nCi0hCVNEQVRBIAl2YWwKLSEJU0RBVEEJc3RyaW5nCi0hCUVORE0KLSEJZGVmaW5lICIxIiwiOTklb2YxMDAiCSEgbm90aWNlICUgd2l0aGluIHN0cmluZwotIQlTREFUQSAJIjEiCi0JLmJ5dGUJNDkKLSEJU0RBVEEJIjk5JW9mMTAwIgotCS5ieXRlCTU3LDU3LDM3LDExMSwxMDIsNDksNDgsNDgKLSEJZGVmaW5lIAklMSArIDIsICI9MyIKLSEJU0RBVEEgCTMKLQkuYnl0ZQk1MQotIQlTREFUQQkiPTMiCi0JLmJ5dGUJNjEsNTEKLSEKLQotIQotCi0hCWRlZmluZSAJJSAxICsgMiAlMys0Ci0hCVNEQVRBIAkzCi0JLmJ5dGUJNTEKLSEJU0RBVEEJNwotCS5ieXRlCTU1Ci0hCi0KLSEJZGVmaW5lCSUzKjQtMiAgPD0xMD4KLSEJU0RBVEEgCTEwCi0JLmJ5dGUJNDksNDgKLSEJU0RBVEEJIj0xMCIKLQkuYnl0ZQk2MSw0OSw0OAotIQotCi0hCWRlZmluZQklMyo0LTIgIDUKLSEJU0RBVEEgCTEwCi0JLmJ5dGUJNDksNDgKLSEJU0RBVEEJNQotCS5ieXRlCTUzCi0hCi0KLSEJZGVmaW5lCSUxICsgMiw8aXMgZXF1YWwgdG8gJTEgKyAyLCByaWdodD8+Ci0hCVNEQVRBIAkzCi0JLmJ5dGUJNTEKLSEJU0RBVEEJImlzIGVxdWFsIHRvICUxICsgMiwgcmlnaHQ/IgotCS5ieXRlCTEwNSwxMTUsMzIsMTAxLDExMywxMTcsOTcsMTA4LDMyLDExNiwxMTEsMzIsMzcsNDksMzIsNDMsMzIsNTAsNDQsMzIsMTE0LDEwNSwxMDMsMTA0LDExNiw2MwotIQotCi0hCSEgaGFzIG5vIGVmZmVjdAotCSEgaGFzIG5vIGVmZmVjdAotIQotCi0hCWVuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNy5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw3LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThhNDBhZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw3LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkuQUxURVJOQVRFCi0hIHRlc3Qgb2Ygc3RyaW5nIG9wZXJhdG9ycwotZGVmaW5lCU1BQ1JPCXN0cjEsc3RyMgotCVNEQVRBCXN0cjEKLQlTREFUQQkic3RyMiIKLUVORE0KLQlkZWZpbmUJb25lIiB3YXkgdG8gZ2V0ICJzcGFjZXMsMAotCWRlZmluZQkibG90J3MhIG9mIDxzcGVjaWFsPixjaGFycyUiLCAwCi0KLQotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNy5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZTMzMTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNy5lcnIKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FTkQgbWlzc2luZyBmcm9tIGVuZCBvZiBmaWxlLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNy5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw3Lm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxOWIzNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw3Lm91dAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSEJLkFMVEVSTkFURQotISEgdGVzdCBvZiBzdHJpbmcgb3BlcmF0b3JzCi0JISB0ZXN0IG9mIHN0cmluZyBvcGVyYXRvcnMKLSFkZWZpbmUJTUFDUk8Jc3RyMSxzdHIyCi0hCVNEQVRBCXN0cjEKLSEJU0RBVEEJInN0cjIiCi0hRU5ETQotIQlkZWZpbmUJb25lIiB3YXkgdG8gZ2V0ICJzcGFjZXMsMAotIQlTREFUQQlvbmUiIHdheSB0byBnZXQgInNwYWNlcwotCS5ieXRlCTExMSwxMTAsMTAxLDM0LDMyLDExOSw5NywxMjEsMzIsMTE2LDExMSwzMiwxMDMsMTAxLDExNiwzMiwzNCwxMTUsMTEyLDk3LDk5LDEwMSwxMTUKLSEJU0RBVEEJIjAiCi0JLmJ5dGUJNDgKLSEJZGVmaW5lCSJsb3QncyEgb2YgPHNwZWNpYWw+LGNoYXJzJSIsIDAKLSEJU0RBVEEJImxvdCdzIG9mIDxzcGVjaWFsPixjaGFycyUiCi0JLmJ5dGUJMTA4LDExMSwxMTYsMzksMTE1LDMyLDExMSwxMDIsMzIsNjAsMTE1LDExMiwxMDEsOTksMTA1LDk3LDEwOCw2Miw0NCw5OSwxMDQsOTcsMTE0LDExNSwzNwotIQlTREFUQQkiMCIKLQkuYnl0ZQk0OAotIQotCi0hCi0KLSEKLQotIQotCi0hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsOC5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw4LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1YjE3Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw4LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQotCS5BTFRFUk5BVEUKLQlTREFUQQklMSsyKzMgCi0JU0RBVEEJIjUiCi0KLQotCi0JTUFDUk8JZm9vCi0JU0RBVEEJIkhJIgkhISB0aGlzIHdpbGwgZ28KLQlTREFUQQkiVEhFUkUJISB0aGlzIHdpbGwgc3RheQotCUVORE0KLQotCWZvbwotCi0KLQlTREFUQQk8ITx0aGlzIGlzIDxhIHdhY2t5PiBleGFtcGxlIT4hIT4KLQlTREFUQQkiPHRoaXMgaXMgPGEgd2Fja3k+IGV4YW1wbGU+ISIKLQlFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDguZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsOC5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsOC5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsOC5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw4Lm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxMDQxMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw4Lm91dAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSEKLQotIQkuQUxURVJOQVRFCi0hCVNEQVRBCSUxKzIrMyAKLQkuYnl0ZQkzNyw0OSw0Myw1MCw0Myw1MSwzMgotIQlTREFUQQkiNSIKLQkuYnl0ZQk1MwotIQotCi0hCi0KLSEKLQotIQlNQUNSTwlmb28KLSEJU0RBVEEJIkhJIgkhISB0aGlzIHdpbGwgZ28KLSEJU0RBVEEJIlRIRVJFCSEgdGhpcyB3aWxsIHN0YXkKLSEJRU5ETQotIQotCi0hCWZvbwotIQlTREFUQQkiSEkiCQotCS5ieXRlCTcyLDczCi0hCVNEQVRBCSJUSEVSRQkhIHRoaXMgd2lsbCBzdGF5Ci0JLmJ5dGUJODQsNzIsNjksODIsNjksOSwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTE5LDEwNSwxMDgsMTA4LDMyLDExNSwxMTYsOTcsMTIxCi0hCi0KLSEKLQotIQlTREFUQQk8ITx0aGlzIGlzIDxhIHdhY2t5PiBleGFtcGxlIT4hIT4KLQkuYnl0ZQk2MCwxMTYsMTA0LDEwNSwxMTUsMzIsMTA1LDExNSwzMiw2MCw5NywzMiwxMTksOTcsOTksMTA3LDEyMSw2MiwzMiwxMDEsMTIwLDk3LDEwOSwxMTIsMTA4LDEwMSw2MiwzMwotIQlTREFUQQkiPHRoaXMgaXMgPGEgd2Fja3k+IGV4YW1wbGU+ISIKLQkuYnl0ZQk2MCwxMTYsMTA0LDEwNSwxMTUsMzIsMTA1LDExNSwzMiw2MCw5NywzMiwxMTksOTcsOTksMTA3LDEyMSw2MiwzMiwxMDEsMTIwLDk3LDEwOSwxMTIsMTA4LDEwMSw2MiwzNAotIQlFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3ByNzU4My5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5N2NhZjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3ByNzU4My5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotICAgICAuc2RhdGEgInYxLjAwMDAiCi0gICAgIC5lbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3ByNzU4My5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3ByNzU4My5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3ByNzU4My5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcHI3NTgzLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkZjFkNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcHI3NTgzLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIQotCi0hICAgICAuc2RhdGEgInYxLjAwMDAiCi0JLmJ5dGUJMTE4LDQ5LDQ2LDQ4LDQ4LDQ4LDQ4Ci0hICAgICAuZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVnLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZWcuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjQ2M2VkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZWcuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0KLQotZm9vCS5SRUcJKHIxKQotCWFkZAlmb28sZm9vCi0KLWJhcgkucmVnCShyMikKLQlhZGQJYmFyLGZvbwotCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVnLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVnLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVnLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZWcub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTI2OGEzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZWcub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIQotCi0hCi0KLSFmb28JLlJFRwkocjEpCi0hCWFkZAlmb28sZm9vCi0JYWRkCXIxLHIxCi0hCi0KLSFiYXIJLnJlZwkocjIpCi0hCWFkZAliYXIsZm9vCi0JYWRkCXIyLHIxCi0hCi0KLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcC5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI3YWM0Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQkuQVJFUEVBVAk1Ci0JRklWRQotCS5BUkVQRUFUCTIKLQlUV08KLQkuQUVORFIKLQkuQVJFUEVBVAkzCi0JVEhSRUUKLQkuQVJFUEVBVAkyCi0JVFdPCQotCS5BRU5EUgotCS5BRU5EUgotCS5BRU5EUgotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcC5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcC5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcC5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwZDBlMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDM5MSArMCwwIEBACi0hCS5BUkVQRUFUCTUKLSEJRklWRQotIQkuQVJFUEVBVAkyCi0hCVRXTwotIQkuQUVORFIKLSEJLkFSRVBFQVQJMwotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJRklWRQotCUZJVkUKLSEJLkFSRVBFQVQJMgotIQlUV08KLSEJLkFFTkRSCi0hCVRXTwotCVRXTwotIQkuQVJFUEVBVAkxCi0hCVRXTwotIQkuQUVORFIKLSEJVFdPCi0JVFdPCi0hCS5BUkVQRUFUCTMKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMgotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTQKLSEJRklWRQotIQkuQVJFUEVBVAkyCi0hCVRXTwotIQkuQUVORFIKLSEJLkFSRVBFQVQJMwotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJRklWRQotCUZJVkUKLSEJLkFSRVBFQVQJMgotIQlUV08KLSEJLkFFTkRSCi0hCVRXTwotCVRXTwotIQkuQVJFUEVBVAkxCi0hCVRXTwotIQkuQUVORFIKLSEJVFdPCi0JVFdPCi0hCS5BUkVQRUFUCTMKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMgotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTMKLSEJRklWRQotIQkuQVJFUEVBVAkyCi0hCVRXTwotIQkuQUVORFIKLSEJLkFSRVBFQVQJMwotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJRklWRQotCUZJVkUKLSEJLkFSRVBFQVQJMgotIQlUV08KLSEJLkFFTkRSCi0hCVRXTwotCVRXTwotIQkuQVJFUEVBVAkxCi0hCVRXTwotIQkuQUVORFIKLSEJVFdPCi0JVFdPCi0hCS5BUkVQRUFUCTMKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMgotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTIKLSEJRklWRQotIQkuQVJFUEVBVAkyCi0hCVRXTwotIQkuQUVORFIKLSEJLkFSRVBFQVQJMwotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJRklWRQotCUZJVkUKLSEJLkFSRVBFQVQJMgotIQlUV08KLSEJLkFFTkRSCi0hCVRXTwotCVRXTwotIQkuQVJFUEVBVAkxCi0hCVRXTwotIQkuQUVORFIKLSEJVFdPCi0JVFdPCi0hCS5BUkVQRUFUCTMKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMgotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJRklWRQotIQkuQVJFUEVBVAkyCi0hCVRXTwotIQkuQUVORFIKLSEJLkFSRVBFQVQJMwotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJRklWRQotCUZJVkUKLSEJLkFSRVBFQVQJMgotIQlUV08KLSEJLkFFTkRSCi0hCVRXTwotCVRXTwotIQkuQVJFUEVBVAkxCi0hCVRXTwotIQkuQUVORFIKLSEJVFdPCi0JVFdPCi0hCS5BUkVQRUFUCTMKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMgotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlYXQuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVhdC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhODVkYTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVhdC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0KLQkuQVJFUEVBVAkxMAotCVRFTgotCS5BUkVQRUFUCTIJCi0JVFdFTlRZCi0JLkFFTkRSCi0JLkFFTkRSCi0KLQkuQVJFUEVBVAkzCi0JUk9UQ0wJUjIKLQlESVYxCVIwLFIxCi0JLkFFTkRSCi0KLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0LmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlYXQuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlYXQuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlYXQub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVhdC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNWQ4ZDguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVhdC5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotIQotCi0hCS5BUkVQRUFUCTEwCi0hCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlURU4KLQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJMQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAk5Ci0hCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlURU4KLQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJMQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAk4Ci0hCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlURU4KLQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJMQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAk3Ci0hCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlURU4KLQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJMQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAk2Ci0hCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlURU4KLQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJMQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAk1Ci0hCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlURU4KLQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJMQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAk0Ci0hCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlURU4KLQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJMQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAkzCi0hCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlURU4KLQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJMQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAkyCi0hCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlURU4KLQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJMQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQkuQVJFUEVBVAkxCi0hCVRFTgotIQkuQVJFUEVBVAkyCQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlURU4KLQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJMQotIQlUV0VOVFkKLSEJLkFFTkRSCi0hCVRXRU5UWQotCVRXRU5UWQotIQotCi0hCS5BUkVQRUFUCTMKLSEJUk9UQ0wJUjIKLSEJRElWMQlSMCxSMQotIQkuQUVORFIKLSEJUk9UQ0wJUjIKLQlST1RDTAlSMgotIQlESVYxCVIwLFIxCi0JRElWMQlSMCxSMQotIQkuQVJFUEVBVAkyCi0hCVJPVENMCVIyCi0hCURJVjEJUjAsUjEKLSEJLkFFTkRSCi0hCVJPVENMCVIyCi0JUk9UQ0wJUjIKLSEJRElWMQlSMCxSMQotCURJVjEJUjAsUjEKLSEJLkFSRVBFQVQJMQotIQlST1RDTAlSMgotIQlESVYxCVIwLFIxCi0hCS5BRU5EUgotIQlST1RDTAlSMgotCVJPVENMCVIyCi0hCURJVjEJUjAsUjEKLQlESVYxCVIwLFIxCi0hCi0KLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4ODJiMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCi0JLlJFUEVBVAkxMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlMzMxOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyLmVycgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUVORCBtaXNzaW5nIGZyb20gZW5kIG9mIGZpbGUuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzlmOGM2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0hCi0KLSEJLlJFUEVBVAkxMAotCS5SRVBFQVQJMTAKLSEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMS5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkOTg3ZTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjEuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLQkuQVJFUEVBVAkxMAotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIxLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIxLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM2NTQ1Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMS5lcnIKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FbmQgb2YgZmlsZSB3aGlsc3QgaW5zaWRlIEFSRVBFQVQsIHN0YXJ0ZWQgb24gbGluZSAzLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjEub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjEub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDgyODgwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIxLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIQotCi0hCS5BUkVQRUFUCTEwCi0hCS5FTkQKLSEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMi5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMDZhNzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0KLQkuQVJFUEVBVAk1Ci0JLkFFTkRSCQkKLQkuQUVORFIKLQkuRU5ECi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIyLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIyLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQwY2NjNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMi5lcnIKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1yZXBlcnIyLmFzbTo0IEFFTkRSIHdpdGhvdXQgYSBBUkVQRUFULgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjIub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjIub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjdhODRkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIyLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSEKLQotIQkuQVJFUEVBVAk1Ci0hCS5BRU5EUgkJCi0hCS5BUkVQRUFUCTQKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTMKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTIKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTEKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMy5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NGJjNzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotCS5BUkVQRUFUCTQKLQkuQVJFUEVBVAk0Ci0JLkFSRVBFQVQJNAotCS5BUkVQRUFUCTQKLQlzdHVmZgotCS5BRU5EUgkJCi0Jd2hpY2gKLQkuQUVORFIJCi0Jd2lsbAotCS5BRU5EUgkKLQlnZXQKLQkuQUVORFIJCi0JcmVwZXRhZWQKLQkuQUVORFIJCi0KLQkuQUVORFIJCi0JLkFFTkRSCQotCS5BRU5EUgkKLQkuQUVORFIJCi0JLkFFTkRSCQotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIzLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIzLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlMGRjZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMy5lcnIKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXJlcGVycjMuYXNtOjE0IEFFTkRSIHdpdGhvdXQgYSBBUkVQRUFULgotcmVwZXJyMy5hc206MTYgQUVORFIgd2l0aG91dCBhIEFSRVBFQVQuCi1yZXBlcnIzLmFzbToxNyBBRU5EUiB3aXRob3V0IGEgQVJFUEVBVC4KLXJlcGVycjMuYXNtOjE4IEFFTkRSIHdpdGhvdXQgYSBBUkVQRUFULgotcmVwZXJyMy5hc206MTkgQUVORFIgd2l0aG91dCBhIEFSRVBFQVQuCi1yZXBlcnIzLmFzbToyMCBBRU5EUiB3aXRob3V0IGEgQVJFUEVBVC4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIzLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIzLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEzNTEzYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMy5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDM1ICswLDAgQEAKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCQotIQlnZXQKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQlnZXQKLQlnZXQKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCQotIQlnZXQKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCWdldAotCWdldAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIJCi0hCWdldAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJZ2V0Ci0JZ2V0Ci0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgkKLSEJZ2V0Ci0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQlnZXQKLQlnZXQKLSEJcmVwZXRhZWQKLQlyZXBldGFlZAotIQkuQUVORFIJCi0hCi0KLSEJLkFFTkRSCQotIQkuQUVORFIJCi0hCS5BRU5EUgkKLSEJLkFFTkRSCQotIQkuQUVORFIJCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZGF0YS5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmJkMjNjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZGF0YS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0KLQotCS5TREFUQQkiSEkiLCJTVEVWRSIKLQkuU0RBVEEJIkhJIiAsICJTVEVWRSIgLCA8NzI+LDw3Mz4sPDgzPjw2OT48ODY+PDY5PgotCi0JLlNEQVRBCSJIIiJJIiAsICJTVEVWRSIgLCA8NzI+LDw3Mz4sPDgzPjw2OT48ODY+PDY5PgotCi0KLQotCS5TREFUQQkiU0hPVUxEIE5PVCBGQUlMIiAiSEVSRSIgCi0JLlNEQVRBCSJTSE9VTEQgRkFJTCIgIGZvbyAiSEVSRSIgCi0KLQkuU0RBVEFCCTgsIkJPSU5LIgotCi0JOyBleGFtcGxlcyBmcm9tIGJvb2sKLQotCS5TREFUQUIJMiwiQUFBQUEiCi0JLlNEQVRBQgkyLCIiIkJCQiIiIgotCS5TREFUQUIJMiwiQUFCQiI8SCcwNz4KLQotCi1hMToJLlNEQVRBWgkiSEkiCi1hMjoJLlNEQVRBQyAiSEkiCi1hMzoJLlNEQVRBCSJISSIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZGF0YS5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTQ0Y2NjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZGF0YS5lcnIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXNkYXRhLmFzbToxOSBDaGFyYWN0ZXIgY29kZSBpbiBzdHJpbmcgbXVzdCBiZSBhYnNvbHV0ZSBleHByZXNzaW9uLgotc2RhdGEuYXNtOjE5IE1pc3NpbmcgPiBmb3IgY2hhcmFjdGVyIGNvZGUuCi1FTkQgbWlzc2luZyBmcm9tIGVuZCBvZiBmaWxlLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NkYXRhLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZGF0YS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ODlkMzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NkYXRhLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSEKLQotIQotCi0hCS5TREFUQQkiSEkiLCJTVEVWRSIKLQkuYnl0ZQk3Miw3Myw4Myw4NCw2OSw4Niw2OQotIQkuU0RBVEEJIkhJIiAsICJTVEVWRSIgLCA8NzI+LDw3Mz4sPDgzPjw2OT48ODY+PDY5PgotCS5ieXRlCTcyLDczLDgzLDg0LDY5LDg2LDY5LDcyLDczLDgzLDY5LDg2LDY5Ci0hCi0KLSEJLlNEQVRBCSJIIiJJIiAsICJTVEVWRSIgLCA8NzI+LDw3Mz4sPDgzPjw2OT48ODY+PDY5PgotCS5ieXRlCTcyLDM0LDczLDgzLDg0LDY5LDg2LDY5LDcyLDczLDgzLDY5LDg2LDY5Ci0hCi0KLSEKLQotIQotCi0hCS5TREFUQQkiU0hPVUxEIE5PVCBGQUlMIiAiSEVSRSIgCi0JLmJ5dGUJODMsNzIsNzksODUsNzYsNjgsMzIsNzgsNzksODQsMzIsNzAsNjUsNzMsNzYsNzIsNjksODIsNjkKLSEJLlNEQVRBCSJTSE9VTEQgRkFJTCIgIGZvbyAiSEVSRSIgCi0JLmJ5dGUJODMsNzIsNzksODUsNzYsNjgsMzIsNzAsNjUsNzMsNzYsMTAyLDExMSwxMTEsMzIsMzQsNzIsNjksODIsNjksMzQsMzIKLSEKLQotIQkuU0RBVEFCCTgsIkJPSU5LIgotCS5ieXRlCTY2LDc5LDczLDc4LDc1Ci0JLmJ5dGUJNjYsNzksNzMsNzgsNzUKLQkuYnl0ZQk2Niw3OSw3Myw3OCw3NQotCS5ieXRlCTY2LDc5LDczLDc4LDc1Ci0JLmJ5dGUJNjYsNzksNzMsNzgsNzUKLQkuYnl0ZQk2Niw3OSw3Myw3OCw3NQotCS5ieXRlCTY2LDc5LDczLDc4LDc1Ci0JLmJ5dGUJNjYsNzksNzMsNzgsNzUKLSEKLQotIQk7IGV4YW1wbGVzIGZyb20gYm9vawotCTsgZXhhbXBsZXMgZnJvbSBib29rCi0hCi0KLSEJLlNEQVRBQgkyLCJBQUFBQSIKLQkuYnl0ZQk2NSw2NSw2NSw2NSw2NQotCS5ieXRlCTY1LDY1LDY1LDY1LDY1Ci0hCS5TREFUQUIJMiwiIiJCQkIiIiIKLQkuYnl0ZQkzNCw2Niw2Niw2NiwzNAotCS5ieXRlCTM0LDY2LDY2LDY2LDM0Ci0hCS5TREFUQUIJMiwiQUFCQiI8SCcwNz4KLQkuYnl0ZQk2NSw2NSw2Niw2NiwwCi0JLmJ5dGUJNjUsNjUsNjYsNjYsMAotIQotCi0hCi0KLSFhMToJLlNEQVRBWgkiSEkiCi1hMToJLmJ5dGUJNzIsNzMsMAotIWEyOgkuU0RBVEFDICJISSIKLWEyOgkuYnl0ZQkyLDcyLDczCi0hYTM6CS5TREFUQQkiSEkiCi1hMzoJLmJ5dGUJNzIsNzMKLSEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2Z1bmMuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU5OTQ5YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2Z1bmMuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotCi0JLk1BQ1JPCVJFU0VSVkVfU1RSIFAxPTAgUDIKLQkuU0RBVEEJLlNVQlNUUigiQUJDREVGRyIsXFAxLFxQMikKLQkuRU5ETQotCi0JUkVTRVJWRV9TVFIJMiwyCi0JUkVTRVJWRV9TVFIJLDMKLQotCi0JLk1BQ1JPIEZJTkRfU1RSIFAxCi0JLkRBVEEuVwkuSU5TVFIoIkFCQ0RFRkciLCJcUDEiLCAwKQotCS5FTkRNCi0KLQlGSU5EX1NUUglDREUKLQlGSU5EX1NUUglICi0KLQkuTUFDUk8JUkVTRVJWRV9MRU5HVEggUDEKLQkuQUxJR04JNAotCS5TUkVTCS5MRU4oIlxQMSIpCi0JLkVORE0KLQotCVJFU0VSVkVfTEVOR1RICUFCQ0RFRgotCVJFU0VSVkVfTEVOR1RICUFCQwotCi0JLkVORAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2Z1bmMuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2Z1bmMuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZnVuYy5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3Avc2Z1bmMub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGY2OTRmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZnVuYy5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0hCi0KLSEJLk1BQ1JPCVJFU0VSVkVfU1RSIFAxPTAgUDIKLSEJLlNEQVRBCS5TVUJTVFIoIkFCQ0RFRkciLFxQMSxcUDIpCi0hCS5FTkRNCi0hCi0KLSEJUkVTRVJWRV9TVFIJMiwyCi0hCS5TREFUQQkuU1VCU1RSKCJBQkNERUZHIiwyLDIpCi0JLmJ5dGUJNjcsNjgKLSEJUkVTRVJWRV9TVFIJLDMKLSEJLlNEQVRBCS5TVUJTVFIoIkFCQ0RFRkciLDAsMykKLQkuYnl0ZQk2NSw2Niw2NwotIQotCi0hCi0KLSEJLk1BQ1JPIEZJTkRfU1RSIFAxCi0hCS5EQVRBLlcJLklOU1RSKCJBQkNERUZHIiwiXFAxIiwgMCkKLSEJLkVORE0KLSEKLQotIQlGSU5EX1NUUglDREUKLSEJLkRBVEEuVwkuSU5TVFIoIkFCQ0RFRkciLCJDREUiLCAwKQotCS5zaG9ydAkyCi0hCUZJTkRfU1RSCUgKLSEJLkRBVEEuVwkuSU5TVFIoIkFCQ0RFRkciLCJIIiwgMCkKLQkuc2hvcnQJLTEKLSEKLQotIQkuTUFDUk8JUkVTRVJWRV9MRU5HVEggUDEKLSEJLkFMSUdOCTQKLSEJLlNSRVMJLkxFTigiXFAxIikKLSEJLkVORE0KLSEKLQotIQlSRVNFUlZFX0xFTkdUSAlBQkNERUYKLSEJLkFMSUdOCTQKLQkuYWxpZ24JNAotIQkuU1JFUwkuTEVOKCJBQkNERUYiKQotCS5zcGFjZQkyNAotIQlSRVNFUlZFX0xFTkdUSAlBQkMKLSEJLkFMSUdOCTQKLQkuYWxpZ24JNAotIQkuU1JFUwkuTEVOKCJBQkMiKQotCS5zcGFjZQkxMgotIQotCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90MS5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDEuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjU0YzZjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90MS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotCXRlc3QgZm9yIGVvZiBpbiBtaWRkbGUgb2YgbGluZQotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90MS5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDEuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90MS5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QxLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC90MS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MjMwZTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QxLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIQotCi0hCXRlc3QgZm9yIGVvZiBpbiBtaWRkbGUgb2YgbGluZQotCXRlc3QgZm9yIGVvZiBpbiBtaWRkbGUgb2YgbGluZQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDIuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhMzUxYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0KLQotCXRlc3QKLSsgY29udGludWVkCi0rIGxpbmVzCi0KLQotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90Mi5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDIuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90Mi5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QyLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC90Mi5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNDRlOGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QyLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSEKLQotIQotCi0hCXRlc3QKLSErY29udGludWVkCi0hK2xpbmVzCi0JdGVzdGNvbnRpbnVlZGxpbmVzCi0hCi0KLSEKLQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDMuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QzLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3MDJkYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDMuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCi0JdGVzdCBiYXNlIGNvbnZlcnRpb25zCi0KLQlCJzEwMDEwMDAKLQlRJzIxMAotCUQnMTM2Ci0JSCc4OAotCi0JRk9PQicxMDAxMDAwQkFSCi0JRk9PUScyMTBCQVIKLQlGT09EJzEzNkJBUgotCUZPT0gnODhCQVIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90My5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDMuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWUzMzE4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90My5lcnIKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FTkQgbWlzc2luZyBmcm9tIGVuZCBvZiBmaWxlLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QzLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC90My5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZDE1MGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QzLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSEKLQotIQl0ZXN0IGJhc2UgY29udmVydGlvbnMKLQl0ZXN0IGJhc2UgY29udmVydGlvbnMKLSEKLQotIQlCJzEwMDEwMDAKLQk3MgotIQlRJzIxMAotCTEzNgotIQlEJzEzNgotCTEzNgotIQlIJzg4Ci0JMTM2Ci0hCi0KLSEJRk9PQicxMDAxMDAwQkFSCi0JRk9PQicxMDAxMDAwQkFSCi0hCUZPT1EnMjEwQkFSCi0JRk9PUScyMTBCQVIKLSEJRk9PRCcxMzZCQVIKLQlGT09EJzEzNkJBUgotIQlGT09IJzg4QkFSCi0JRk9PSCc4OEJBUgotIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC93aGlsZS5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3Avd2hpbGUuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTE0M2NjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC93aGlsZS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JZG9ua2V5Ci1iYXIJLkFTU0lHTkEJMAotCS5BV0hJTEUJXCZiYXIgTFQgNQkKLQlISSBCQVIgSVMgXCZiYXIKLWZvbwkuQVNTSUdOQQkwCi0JLkFXSElMRQlcJmZvbyBMVCAyCi0JSEkgQkVGT1JFCi0JLkFSRVBFQVQJMgotCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCS5BRU5EUgotCUhJIEFGVEVSCi1mb28JLkFTU0lHTkEJXCZmb28gKyAxCQotCS5BRU5EVwotYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKLQlBTkQgSVRTIE5PVyBcJmJhcgotCS5BRU5EVwotCS5FTkQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3doaWxlLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC93aGlsZS5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3doaWxlLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3Avd2hpbGUub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3doaWxlLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4YWViMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3Avd2hpbGUub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLSEJZG9ua2V5Ci0JZG9ua2V5Ci0hYmFyCS5BU1NJR05BCTAKLSEJLkFXSElMRQlcJmJhciBMVCA1CQotIQlISSBCQVIgSVMgXCZiYXIKLSFmb28JLkFTU0lHTkEJMAotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCi0hCUFORCBJVFMgTk9XIFwmYmFyCi0hCS5BRU5EVwotIQlISSBCQVIgSVMgXCZiYXIKLQlISSBCQVIgSVMgMAotIWZvbwkuQVNTSUdOQQkwCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hCUhJIEJFRk9SRQotCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTAgMAotIQkuQVJFUEVBVAkxCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTAgMAotIQlISSBBRlRFUgotCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSEJSEkgQkVGT1JFCi0JSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMSAwCi0hCS5BUkVQRUFUCTEKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMSAwCi0hCUhJIEFGVEVSCi0JSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCi0hCUFORCBJVFMgTk9XIFwmYmFyCi0JQU5EIElUUyBOT1cgMQotIQkuQVdISUxFCVwmYmFyIExUIDUJCi0hCUhJIEJBUiBJUyBcJmJhcgotIWZvbwkuQVNTSUdOQQkwCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKLSEJQU5EIElUUyBOT1cgXCZiYXIKLSEJLkFFTkRXCi0hCUhJIEJBUiBJUyBcJmJhcgotCUhJIEJBUiBJUyAxCi0hZm9vCS5BU1NJR05BCTAKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSEJSEkgQkVGT1JFCi0JSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMCAxCi0hCS5BUkVQRUFUCTEKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMCAxCi0hCUhJIEFGVEVSCi0JSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIQlISSBCRUZPUkUKLQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkxIDEKLSEJLkFSRVBFQVQJMQotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkxIDEKLSEJSEkgQUZURVIKLQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKLSEJQU5EIElUUyBOT1cgXCZiYXIKLQlBTkQgSVRTIE5PVyAyCi0hCS5BV0hJTEUJXCZiYXIgTFQgNQkKLSEJSEkgQkFSIElTIFwmYmFyCi0hZm9vCS5BU1NJR05BCTAKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQotIQlBTkQgSVRTIE5PVyBcJmJhcgotIQkuQUVORFcKLSEJSEkgQkFSIElTIFwmYmFyCi0JSEkgQkFSIElTIDIKLSFmb28JLkFTU0lHTkEJMAotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIQlISSBCRUZPUkUKLQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkwIDIKLSEJLkFSRVBFQVQJMQotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkwIDIKLSEJSEkgQUZURVIKLQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hCUhJIEJFRk9SRQotCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTEgMgotIQkuQVJFUEVBVAkxCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTEgMgotIQlISSBBRlRFUgotCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQotIQlBTkQgSVRTIE5PVyBcJmJhcgotCUFORCBJVFMgTk9XIDMKLSEJLkFXSElMRQlcJmJhciBMVCA1CQotIQlISSBCQVIgSVMgXCZiYXIKLSFmb28JLkFTU0lHTkEJMAotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCi0hCUFORCBJVFMgTk9XIFwmYmFyCi0hCS5BRU5EVwotIQlISSBCQVIgSVMgXCZiYXIKLQlISSBCQVIgSVMgMwotIWZvbwkuQVNTSUdOQQkwCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hCUhJIEJFRk9SRQotCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTAgMwotIQkuQVJFUEVBVAkxCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTAgMwotIQlISSBBRlRFUgotCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSEJSEkgQkVGT1JFCi0JSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMSAzCi0hCS5BUkVQRUFUCTEKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMSAzCi0hCUhJIEFGVEVSCi0JSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCi0hCUFORCBJVFMgTk9XIFwmYmFyCi0JQU5EIElUUyBOT1cgNAotIQkuQVdISUxFCVwmYmFyIExUIDUJCi0hCUhJIEJBUiBJUyBcJmJhcgotIWZvbwkuQVNTSUdOQQkwCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKLSEJQU5EIElUUyBOT1cgXCZiYXIKLSEJLkFFTkRXCi0hCUhJIEJBUiBJUyBcJmJhcgotCUhJIEJBUiBJUyA0Ci0hZm9vCS5BU1NJR05BCTAKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSEJSEkgQkVGT1JFCi0JSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMCA0Ci0hCS5BUkVQRUFUCTEKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMCA0Ci0hCUhJIEFGVEVSCi0JSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIQlISSBCRUZPUkUKLQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkxIDQKLSEJLkFSRVBFQVQJMQotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkxIDQKLSEJSEkgQUZURVIKLQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKLSEJQU5EIElUUyBOT1cgXCZiYXIKLQlBTkQgSVRTIE5PVyA1Ci0hCS5BV0hJTEUJXCZiYXIgTFQgNQkKLSEJSEkgQkFSIElTIFwmYmFyCi0hZm9vCS5BU1NJR05BCTAKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQotIQlBTkQgSVRTIE5PVyBcJmJhcgotIQkuQUVORFcKLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG9ib3RoIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZG9ib3RoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiY2I4MzdjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL2RvYm90aAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMhL2Jpbi9zaAotCi14PSQxIDsgc2hpZnQKLXk9JDEgOyBzaGlmdAotCi1ybSB0bXAuMCA+IC9kZXYvbnVsbCAyPiYxCi1sbiAtcyAkeCB0bXAuMAotJCogdG1wLjAgPiB0bXAuMQotCi1ybSB0bXAuMAotbG4gLXMgJHkgdG1wLjAKLSQqIHRtcC4wID4gdG1wLjIKLQotcm0gdG1wLjAKLQotZGlmZiAtYyB0bXAuMSB0bXAuMgotZXhpdAotCi0jZW9mCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9kb29iamNtcCBiL2dhcy90ZXN0c3VpdGUvbGliL2Rvb2JqY21wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNWMzMmRhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL2Rvb2JqY21wCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIyEvYmluL3NoCi0jIGNvbXBhcmUgdHdvIG9iamVjdCBmaWxlcywgaW4gZGVwdGguCi0KLXg9JDEKLXk9JDIKLUJPVEg9IiQxICQyIgotCi0KLSMgaWYgdGhleSBjbXAsIHdlJ3JlIGZpbmUuCi1pZiAoY21wICRCT1RIID4gL2Rldi9udWxsKQotdGhlbgotCWV4aXQgMAotZmkKLQotIyBvdGhlcndpc2UsIHdlIG11c3QgbG9vayBjbG9zZXIuCi1pZiAoZG9ib3RoICRCT1RIIHNpemUpCi10aGVuCi0JZWNobyBTaXplcyBvay4KLWVsc2UKLQllY2hvIFNpemVzIGRpZmZlcjoKLQlzaXplICRCT1RICi0jCWV4aXQgMQotZmkKLQotaWYgKGRvYm90aCAkQk9USCBvYmpkdW1wICtoZWFkZXIpCi10aGVuCi0JZWNobyBIZWFkZXJzIG9rLgotZWxzZQotCWVjaG8gSGVhZGVyIGRpZmZlcmVuY2VzLgotIwlleGl0IDEKLWZpCi0KLWlmIChkb2JvdGggJEJPVEggb2JqZHVtcCArdGV4dCA+IC9kZXYvbnVsbCkKLXRoZW4KLQllY2hvIFRleHQgb2suCi1lbHNlCi0JZWNobyBUZXh0IGRpZmZlcmVuY2VzLgotIwlkb2JvdGggJEJPVEggb2JqZHVtcCArdGV4dAotIwlleGl0IDEKLWZpCi0KLWlmIChkb2JvdGggJEJPVEggb2JqZHVtcCArZGF0YSA+IC9kZXYvbnVsbCkKLXRoZW4KLQllY2hvIERhdGEgb2suCi1lbHNlCi0JZWNobyBEYXRhIGRpZmZlcmVuY2VzLgotIwlkb2JvdGggJEJPVEggb2JqZHVtcCArZGF0YQotIwlleGl0IDEKLWZpCi0KLWlmIChkb2JvdGggJEJPVEggb2JqZHVtcCArc3ltYm9scyA+IC9kZXYvbnVsbCkKLXRoZW4KLQllY2hvIFN5bWJvbHMgb2suCi1lbHNlCi0JZWNobyAtbiBTeW1ib2wgZGlmZmVyZW5jZXMuLi4KLQotCWlmIChkb2JvdGggJEJPVEggZG91bnNvcnRzeW1ib2xzKQotCXRoZW4KLQkJZWNobyBidXQgc3ltYm9scyBhcmUgc2ltcGx5IG9yZGVyZWQgZGlmZmVyZW50bHkuCi0jCQllY2hvIE5vdyB3aGF0IHRvIGRvIGFib3V0IHJlbG9jcyc/JwotIwkJZXhpdCAxCi0JZWxzZQotCQllY2hvIGFuZCBzeW1ib2xzIGRpZmZlciBpbiBjb250ZW50LgotCQlleGl0IDEKLQlmaQotZmkKLQotIyBvZiBjb3Vyc2UsIGlmIHRoZXJlIHdlcmUgc3ltYm9sIGRpZmZzLCB0aGVuIHRoZSByZWxvYyBzeW1ib2wgaW5kZXhlcwotIyB3aWxsIGJlIG9mZi4KLQotaWYgKGRvYm90aCAkQk9USCBvYmpkdW1wIC1yID4gL2Rldi9udWxsKQotdGhlbgotCWVjaG8gUmVsb2Mgb2suCi1lbHNlCi0JZWNobyAtbiBSZWxvYyBkaWZmZXJlbmNlcy4uLgotCi0JaWYgKGRvYm90aCAkQk9USCBkb3Vuc29ydHJlbG9jKQotCXRoZW4KLQkJZWNobyBidXQgcmVsb2NzIGFyZSBzaW1wbHkgb3JkZXJlZCBkaWZmZXJlbnRseS4KLQllbHNlCi0JCWVjaG8gYW5kIHJlbG9jcyBkaWZmZXIgaW4gY29udGVudC4KLQkJZXhpdCAxCi0JZmkKLWZpCi0KLWV4aXQKLQotIyBlb2YKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2Rvc3RyaXB0ZXN0IGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZG9zdHJpcHRlc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhNTE3MDEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG9zdHJpcHRlc3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIS9iaW4vc2gKLQoteD1zdHJpcHRlc3QueHguJCQKLXk9c3RyaXB0ZXN0Lnl5LiQkCi0KLWNwICQxICR4Ci1zdHJpcCAkeAotY3AgJDIgJHkKLXN0cmlwICR5Ci0KLWRvb2JqY21wICR4ICR5Ci1leGl0Ci0KLSNlb2YKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2RvdGVzdCBiL2dhcy90ZXN0c3VpdGUvbGliL2RvdGVzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTc2OGEyMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2xpYi9kb3Rlc3QKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIS9iaW4vc2gKLSMgYWQgaG9jIGRlYnVnIHRvb2wKLQoteD0kMQoteT0kMgotCi14b3V0PWBiYXNlbmFtZSAkeGAueHh4LiQkCi15b3V0PWBiYXNlbmFtZSAkeGAueXl5LiQkCi0KLW1rZGlyICR4b3V0Ci1ta2RpciAkeW91dAotCi1mb3IgaSBpbiAqLnMKLWRvCi0JZWNobyBUZXN0aW5nICRpLi4uCi0Jb2JqZWN0PWBiYXNlbmFtZSAkaSAuc2AubwotCSR4ICRpIC1vICR4b3V0LyRvYmplY3QKLQkkeSAkaSAtbyAkeW91dC8kb2JqZWN0Ci0KLSMgaWYgdGhleSBjbXAsIHdlJ3JlIG9rLiAgT3RoZXJ3aXNlIHdlIGhhdmUgdG8gbG9vayBjbG9zZXIuCi0KLQlpZiAoY21wICR4b3V0LyRvYmplY3QgJHlvdXQvJG9iamVjdCkKLQl0aGVuCi0JCWVjaG8gJGkgaXMgb2suCi0JZWxzZQotCQlpZiAoZG9vYmpjbXAgJHhvdXQvJG9iamVjdCAkeW91dC8kb2JqZWN0KQotCQl0aGVuCi0JCQllY2hvIE5vdCB0aGUgc2FtZSBidXQgb2JqY21wIG9rLgotCQllbHNlCi0JCQlleGl0IDEKLQkJZmkKLQlmaQotCi0JZWNobwotZG9uZQotCi1ybSAtcmYgJHhvdXQgJHlvdXQKLQotZXhpdCAwCi0KLSMgRU9GCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG91bnNyZWxvYyBiL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zcmVsb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkNjk1MzMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG91bnNyZWxvYworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyEvYmluL3NoCi0jIG9iamR1bXAgdGhlIHJlbG9jIHRhYmxlLCBidXQgc3RyaXAgb2ZmIHRoZSBoZWFkaW5ncyBhbmQgcmVsb2MKLSMgbnVtYmVycyBhbmQgc29ydCB0aGUgcmVzdWx0LiAgSW50ZW5kZWQgZm9yIHVzZSBpbiBjb21wYXJpbmcgcmVsb2MKLSMgdGFibGVzIHRoYXQgbWF5IG5vdCBiZSBpbiB0aGUgc2FtZSBvcmRlci4KLQotb2JqZHVtcCArcmVsb2MgK29taXQtcmVsb2NhdGlvbi1udW1iZXJzICtvbWl0LXN5bWJvbC1udW1iZXJzICQxIFwKLQl8IHNvcnQKLSNlb2YKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zc3ltIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZG91bnNzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0NGRhNjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG91bnNzeW0KKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMhL2Jpbi9zaAotIyBvYmpkdW1wIHRoZSBzeW1ib2wgdGFibGUsIGJ1dCBzdHJpcCBvZmYgdGhlIGhlYWRpbmdzIGFuZCBzeW1ib2wKLSMgbnVtYmVycyBhbmQgc29ydCB0aGUgcmVzdWx0LiAgSW50ZW5kZWQgZm9yIHVzZSBpbiBjb21wYXJpbmcgc3ltYm9sCi0jIHRhYmxlcyB0aGF0IG1heSBub3QgYmUgaW4gdGhlIHNhbWUgb3JkZXIuCi0KLW9iamR1bXAgK3N5bWJvbHMgK29taXQtc3ltYm9sLW51bWJlcnMgJDEgXAotCXwgc29ydAotI2VvZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZ2FzLWRlZnMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZ2FzLWRlZnMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTc3MThmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL2dhcy1kZWZzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEtlbiBSYWVidXJuIChyYWVidXJuQGN5Z251cy5jb20pLgotCi1wcm9jIGdhc192ZXJzaW9uIHt9IHsKLSAgICBnbG9iYWwgQVMKLSAgICBjYXRjaCAiZXhlYyAkQVMgLXZlcnNpb24gPCAvZGV2L251bGwiIHRtcAotICAgICMgU2hvdWxkIGZpbmQgYSB3YXkgdG8gZGlzY2FyZCBjb25zdGFudCBwYXJ0cywga2VlcCB3aGF0ZXZlcidzCi0gICAgIyBsZWZ0LCBzbyB0aGUgdmVyc2lvbiBzdHJpbmcgY291bGQgYmUgYWxtb3N0IGFueXRoaW5nIGF0IGFsbC4uLgotICAgIHJlZ2V4cCAiXFteXG5cXSogKGN5Z251cy18KShcWy0wLTkuYS16QS1aLVxdKylcW1xyXG5cXS4qIiAkdG1wIHZlcnNpb24gY3lnIG51bWJlcgotICAgIGlmICFbaW5mbyBleGlzdHMgbnVtYmVyXSB0aGVuIHsKLSAgICAgICAgcmV0dXJuICJbd2hpY2ggJEFTXSAobm8gdmVyc2lvbiBudW1iZXIpXG4iCi0gICAgfQotICAgIGNsb25lX291dHB1dCAiW3doaWNoICRBU10gJG51bWJlclxuIgotICAgIHVuc2V0IHZlcnNpb24KLX0KLQotcHJvYyBnYXNfcnVuIHsgcHJvZyBhc19vcHRzIHJlZGlyIH0gewotICAgIGdsb2JhbCBBUwotICAgIGdsb2JhbCBBU0ZMQUdTCi0gICAgZ2xvYmFsIGNvbXBfb3V0cHV0Ci0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0KLSAgICB2ZXJib3NlICJFeGVjdXRpbmcgJHNyY2Rpci9saWIvcnVuICRBUyAkQVNGTEFHUyAkYXNfb3B0cyAkc3JjZGlyLyRzdWJkaXIvJHByb2cgJHJlZGlyIgotICAgIGNhdGNoICJleGVjICRzcmNkaXIvbGliL3J1biAkQVMgJEFTRkxBR1MgJGFzX29wdHMgJHNyY2Rpci8kc3ViZGlyLyRwcm9nICRyZWRpciIgY29tcF9vdXRwdXQKLSAgICBzZXQgY29tcF9vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRjb21wX291dHB1dF0KLSAgICB2ZXJib3NlICJvdXRwdXQgd2FzICRjb21wX291dHB1dCIKLSAgICByZXR1cm4gW2xpc3QgJGNvbXBfb3V0cHV0ICIiXTsKLX0KLQotcHJvYyBhbGxfb25lcyB7IGFyZ3MgfSB7Ci0gICAgZm9yZWFjaCB4ICRhcmdzIHsgaWYgW2V4cHIgJHghPTFdIHsgcmV0dXJuIDAgfSB9Ci0gICAgcmV0dXJuIDEKLX0KLQotcHJvYyBnYXNfc3RhcnQgeyBwcm9nIGFzX29wdHMgfSB7Ci0gICAgZ2xvYmFsIEFTCi0gICAgZ2xvYmFsIEFTRkxBR1MKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBzcGF3bl9pZAotCi0gICAgdmVyYm9zZSAiU3RhcnRpbmcgJEFTICRBU0ZMQUdTICRhc19vcHRzICRwcm9nIiAyCi0gICAgY2F0Y2ggewotCXNwYXduIC1ub2VjaG8gLW5vdHR5Y29weSAkc3JjZGlyL2xpYi9ydW4gJEFTICRBU0ZMQUdTICRhc19vcHRzICRzcmNkaXIvJHN1YmRpci8kcHJvZwotICAgIH0gZm9vCi0gICAgaWYgIVtyZWdleHAge15bMC05XSt9ICRmb29dIHRoZW4gewotCXBlcnJvciAiQ2FuJ3QgcnVuICRzdWJkaXIvJHByb2c6ICRmb28iCi0gICAgfQotfQotCi1wcm9jIGdhc19maW5pc2ggeyB9IHsKLSAgICBnbG9iYWwgc3Bhd25faWQKLQotICAgIGNhdGNoICJjbG9zZSIKLSAgICBjYXRjaCAid2FpdCIKLX0KLQotcHJvYyB3YW50X25vX291dHB1dCB7IHRlc3RuYW1lIH0gewotICAgIGdsb2JhbCBjb21wX291dHB1dAotCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQlzZW5kX2xvZyAiJGNvbXBfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGNvbXBfb3V0cHV0IiAzCi0gICAgfQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQlwYXNzICIkdGVzdG5hbWUiCi0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCWZhaWwgIiR0ZXN0bmFtZSIKLQlyZXR1cm4gMAotICAgIH0KLX0KLQotcHJvYyBnYXNfdGVzdF9vbGQgeyBmaWxlIGFzX29wdHMgdGVzdG5hbWUgfSB7Ci0gICAgZ2FzX3J1biAkZmlsZSAkYXNfb3B0cyAiIgotICAgIHJldHVybiBbd2FudF9ub19vdXRwdXQgJHRlc3RuYW1lXQotfQotCi1wcm9jIGdhc190ZXN0IHsgZmlsZSBhc19vcHRzIHZhcl9vcHRzIHRlc3RuYW1lIH0gewotICAgIGdsb2JhbCBjb21wX291dHB1dAotCi0gICAgc2V0IGkgMAotICAgIGZvcmVhY2ggd29yZCAkdmFyX29wdHMgewotCXNldCBpZ25vcmVfc3Rkb3V0KCRpKSBbc3RyaW5nIG1hdGNoICIqPiIgJHdvcmRdCi0Jc2V0IG9wdCgkaSkgW3N0cmluZyB0cmltICR3b3JkIHs+fV0KLQlpbmNyIGkKLSAgICB9Ci0gICAgc2V0IG1heCBbZXhwciAxPDwkaV0KLSAgICBmb3Ige3NldCBpIDB9IHtbZXhwciAkaTwkbWF4XX0ge2luY3IgaX0gewotCXNldCBtYXliZV9pZ25vcmVfc3Rkb3V0ICIiCi0Jc2V0IGV4dHJhX29wdHMgIiIKLQlmb3Ige3NldCBiaXQgMH0geygxPDwkYml0KTwkbWF4fSB7aW5jciBiaXR9IHsKLQkgICAgc2V0IG51bSBbZXhwciAxPDwkYml0XQotCSAgICBpZiBbZXhwciAkaSYkbnVtXSB0aGVuIHsKLQkJc2V0IGV4dHJhX29wdHMgIiRleHRyYV9vcHRzICRvcHQoJGJpdCkiCi0JCWlmICRpZ25vcmVfc3Rkb3V0KCRiaXQpIHRoZW4gewotCQkgICAgc2V0IG1heWJlX2lnbm9yZV9zdGRvdXQgIj4vZGV2L251bGwiCi0JCX0KLQkgICAgfQotCX0KLQlzZXQgZXh0cmFfb3B0cyBbc3RyaW5nIHRyaW0gJGV4dHJhX29wdHNdCi0JZ2FzX3J1biAkZmlsZSAiJGFzX29wdHMgJGV4dHJhX29wdHMiICRtYXliZV9pZ25vcmVfc3Rkb3V0Ci0KLQkjIFNob3VsZCBJIGJlIGFibGUgdG8gdXNlIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBoZXJlPwotCWlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4dHJhX29wdHNdIHRoZW4gewotCSAgICB3YW50X25vX291dHB1dCAkdGVzdG5hbWUKLQl9IGVsc2UgewotCSAgICB3YW50X25vX291dHB1dCAiJHRlc3RuYW1lICgkZXh0cmFfb3B0cykiCi0JfQotICAgIH0KLSAgICBpZiBbaW5mbyBleGlzdHMgZXJyb3JJbmZvXSB0aGVuIHsKLSAgICAgICAgdW5zZXQgZXJyb3JJbmZvCi0gICAgfQotfQotCi1wcm9jIGdhc190ZXN0X2lnbm9yZV9zdGRvdXQgeyBmaWxlIGFzX29wdHMgdGVzdG5hbWUgfSB7Ci0gICAgZ2xvYmFsIGNvbXBfb3V0cHV0Ci0KLSAgICBnYXNfcnVuICRmaWxlICRhc19vcHRzICI+L2Rldi9udWxsIgotICAgIHdhbnRfbm9fb3V0cHV0ICR0ZXN0bmFtZQotfQotCi1wcm9jIGdhc190ZXN0X2Vycm9yIHsgZmlsZSBhc19vcHRzIHRlc3RuYW1lIH0gewotICAgIGdsb2JhbCBjb21wX291dHB1dAotCi0gICAgZ2FzX3J1biAkZmlsZSAkYXNfb3B0cyAiPi9kZXYvbnVsbCIKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHRoZW4gewotCXNlbmRfbG9nICIkY29tcF9vdXRwdXRcbiIKLQl2ZXJib3NlICIkY29tcF9vdXRwdXQiIDMKLSAgICB9Ci0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHRoZW4gewotCWZhaWwgIiR0ZXN0bmFtZSIKLSAgICB9IGVsc2UgewotCXBhc3MgIiR0ZXN0bmFtZSIKLSAgICB9Ci19Ci0KLXByb2MgZ2FzX2V4aXQge30ge30KLQotcHJvYyBnYXNfaW5pdCB7IGFyZ3MgfSB7Ci0gICAgZ2xvYmFsIHRhcmdldF9jcHUKLSAgICBnbG9iYWwgdGFyZ2V0X2NwdV9mYW1pbHkKLSAgICBnbG9iYWwgdGFyZ2V0X2ZhbWlseQotICAgIGdsb2JhbCB0YXJnZXRfdmVuZG9yCi0gICAgZ2xvYmFsIHRhcmdldF9vcwotICAgIGdsb2JhbCBzdGRvcHRsaXN0Ci0KLSAgICBjYXNlICIkdGFyZ2V0X2NwdSIgaW4gewotCSJtNjg/Pz8iCQl7IHNldCB0YXJnZXRfY3B1X2ZhbWlseSBtNjhrIH0KLQkiaVszNF04NiIJCXsgc2V0IHRhcmdldF9jcHVfZmFtaWx5IGkzODYgfQotCWRlZmF1bHQJCQl7IHNldCB0YXJnZXRfY3B1X2ZhbWlseSAkdGFyZ2V0X2NwdSB9Ci0gICAgfQotCi0gICAgc2V0IHRhcmdldF9mYW1pbHkgIiR0YXJnZXRfY3B1X2ZhbWlseS0kdGFyZ2V0X3ZlbmRvci0kdGFyZ2V0X29zIgotICAgIHNldCBzdGRvcHRsaXN0ICItYT4iCi0KLSAgICBpZiAhW2lzdGFyZ2V0ICIqLSotKiJdIHsKLQlwZXJyb3IgIlRhcmdldCBuYW1lIFtpc3RhcmdldF0gaXMgbm90IGEgdHJpcGxlLiIKLSAgICB9Ci0gICAgIyBOZWVkIHRvIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCi0gICAgcmV0dXJuCi19Ci0KLQotIyBydW5fZHVtcF90ZXN0IEZJTEUgCi0jCi0jIEFzc2VtYmxlIGEgLnMgZmlsZSwgdGhlbiBydW4gc29tZSB1dGlsaXR5IG9uIGl0IGFuZCBjaGVjayB0aGUgb3V0cHV0LgotIyAKLSMgVGhlcmUgc2hvdWxkIGJlIGFuIGFzc2VtYmx5IGxhbmd1YWdlIGZpbGUgbmFtZWQgRklMRS5zIGluIHRoZSB0ZXN0Ci0jIHN1aXRlIGRpcmVjdG9yeSwgYW5kIGEgcGF0dGVybiBmaWxlIGNhbGxlZCBGSUxFLmQuICBgcnVuX2R1bXBfdGVzdCcKLSMgd2lsbCBhc3NlbWJsZSBGSUxFLnMsIHJ1biBzb21lIHRvb2wgbGlrZSBgb2JqZHVtcCcsIGBvYmpjb3B5Jywgb3IKLSMgYG5tJyBvbiB0aGUgLm8gZmlsZSB0byBwcm9kdWNlIHRleHR1YWwgb3V0cHV0LCBhbmQgdGhlbiBhbmFseXplIHRoYXQKLSMgd2l0aCByZWdleHBzLiAgVGhlIEZJTEUuZCBmaWxlIHNwZWNpZmllcyB3aGF0IHByb2dyYW0gdG8gcnVuLCBhbmQKLSMgd2hhdCB0byBleHBlY3QgaW4gaXRzIG91dHB1dC4KLSMKLSMgVGhlIEZJTEUuZCBmaWxlIGJlZ2lucyB3aXRoIHplcm8gb3IgbW9yZSBvcHRpb24gbGluZXMsIHdoaWNoIHNwZWNpZnkKLSMgZmxhZ3MgdG8gcGFzcyB0byB0aGUgYXNzZW1ibGVyLCB0aGUgcHJvZ3JhbSB0byBydW4gdG8gZHVtcCB0aGUKLSMgYXNzZW1ibGVyJ3Mgb3V0cHV0LCBhbmQgdGhlIG9wdGlvbnMgaXQgd2FudHMuICBUaGUgb3B0aW9uIGxpbmVzIGhhdmUKLSMgdGhlIHN5bnRheDoKLSMgCi0jICAgICAgICAgIyBPUFRJT046IFZBTFVFCi0jIAotIyBPUFRJT04gaXMgdGhlIG5hbWUgb2Ygc29tZSBvcHRpb24sIGxpa2UgIm5hbWUiIG9yICJvYmpkdW1wIiwgYW5kCi0jIFZBTFVFIGlzIE9QVElPTidzIHZhbHVlLiAgVGhlIHZhbGlkIG9wdGlvbnMgYXJlIGRlc2NyaWJlZCBiZWxvdy4KLSMgV2hpdGVzcGFjZSBpcyBpZ25vcmVkIGV2ZXJ5d2hlcmUsIGV4Y2VwdCB3aXRoaW4gVkFMVUUuICBUaGUgb3B0aW9uCi0jIGxpc3QgZW5kcyB3aXRoIHRoZSBmaXJzdCBsaW5lIHRoYXQgZG9lc24ndCBtYXRjaCB0aGUgYWJvdmUgc3ludGF4Ci0jIChobW0sIG5vdCBncmVhdCBmb3IgZXJyb3IgZGV0ZWN0aW9uKS4KLSMKLSMgVGhlIGludGVyZXN0aW5nIG9wdGlvbnMgYXJlOgotIyAKLSMgICBuYW1lOiBURVNULU5BTUUKLSMJVGhlIG5hbWUgb2YgdGhpcyB0ZXN0LCBwYXNzZWQgdG8gRGVqYUdOVSdzIGBwYXNzJyBhbmQgYGZhaWwnCi0jICAgICAgIGNvbW1hbmRzLiAgSWYgb21pdHRlZCwgdGhpcyBkZWZhdWx0cyB0byBGSUxFLCB0aGUgcm9vdCBvZiB0aGUKLSMgICAgICAgLnMgYW5kIC5kIGZpbGVzJyBuYW1lcy4KLSMgCi0jICAgYXM6IEZMQUdTCi0jCVdoZW4gYXNzZW1ibGluZyBGSUxFLnMsIHBhc3MgRkxBR1MgdG8gdGhlIGFzc2VtYmxlci4KLSMgCi0jICAgUFJPRzogUFJPR1JBTS1OQU1FCi0jICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHJ1biB0byBhbmFseXplIHRoZSAubyBmaWxlIHByb2R1Y2VkCi0jICAgICAgIGJ5IHRoZSBhc3NlbWJsZXIuICBUaGlzIGNhbiBiZSBvbWl0dGVkOyBydW5fZHVtcF90ZXN0IHdpbGwgZ3Vlc3MKLSMgICAgICAgd2hpY2ggcHJvZ3JhbSB0byBydW4gYnkgc2VlaW5nIHdoaWNoIG9mIHRoZSBmbGFncyBvcHRpb25zIGJlbG93Ci0jCWlzIHByZXNlbnQuCi0jIAotIyAgIG9iamR1bXA6IEZMQUdTCi0jICAgbm06IEZMQUdTCi0jICAgb2JqY29weTogRkxBR1MKLSMJVXNlIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSB0byBhbmFseXplIHRoZSAubyBmaWxlLCBhbmQgcGFzcyBpdAotIwlGTEFHUywgaW4gYWRkaXRpb24gdG8gdGhlIC5vIGZpbGUgbmFtZS4KLSMKLSMgICBzb3VyY2U6IFNPVVJDRQotIwlBc3NlbWJsZSB0aGUgZmlsZSBTT1VSQ0Uucy4gIElmIG9taXR0ZWQsIHRoaXMgZGVmYXVsdHMgdG8gRklMRS5zLgotIyAgICAgICBUaGlzIGlzIHVzZWZ1bCBpZiBzZXZlcmFsIC5kIGZpbGVzIHdhbnQgdG8gc2hhcmUgYSAucyBmaWxlLgotIwotIyBFYWNoIG9wdGlvbiBtYXkgb2NjdXIgYXQgbW9zdCBvbmNlLgotIwotIyBBZnRlciB0aGUgb3B0aW9uIGxpbmVzIGNvbWUgcmVnZXhwIGxpbmVzLiAgYHJ1bl9kdW1wX3Rlc3QnIGNhbGxzCi0jIGByZWdleHBfZGlmZicgdG8gY29tcGFyZSB0aGUgb3V0cHV0IG9mIHRoZSBkdW1waW5nIHRvb2wgYWdhaW5zdCB0aGUKLSMgcmVnZXhwcyBpbiBGSUxFLmQuICBgcmVnZXhwX2RpZmYnIGlzIGRlZmluZWQgbGF0ZXIgaW4gdGhpcyBmaWxlOyBzZWUKLSMgZnVydGhlciBjb21tZW50cyB0aGVyZS4KLQotcHJvYyBydW5fZHVtcF90ZXN0IHsgbmFtZSB9IHsKLSAgICBnbG9iYWwgc3ViZGlyIHNyY2RpcgotICAgIGdsb2JhbCBPQkpEVU1QIE5NIEFTIE9CSkNPUFkKLSAgICBnbG9iYWwgT0JKRFVNUEZMQUdTIE5NRkxBR1MgQVNGTEFHUyBPQkpDT1BZRkxBR1MKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIqLyoiICRuYW1lXSB7Ci0Jc2V0IGZpbGUgJG5hbWUKLQlzZXQgbmFtZSBbZmlsZSB0YWlsICRuYW1lXQotICAgIH0gZWxzZSB7Ci0Jc2V0IGZpbGUgIiRzcmNkaXIvJHN1YmRpci8kbmFtZSIKLSAgICB9Ci0gICAgc2V0IG9wdF9hcnJheSBbc2x1cnBfb3B0aW9ucyAiJHtmaWxlfS5kIl0KLSAgICBpZiB7ICRvcHRfYXJyYXkgPT0gLTEgfSB7Ci0JdW5yZXNvbHZlZCAkc3ViZGlyLyRuYW1lCi0JcmV0dXJuCi0gICAgfQotICAgIHNldCBvcHRzKGFzKSB7fQotICAgIHNldCBvcHRzKG9iamR1bXApIHt9Ci0gICAgc2V0IG9wdHMobm0pIHt9Ci0gICAgc2V0IG9wdHMob2JqY29weSkge30KLSAgICBzZXQgb3B0cyhuYW1lKSB7fQotICAgIHNldCBvcHRzKFBST0cpIHt9Ci0gICAgc2V0IG9wdHMoc291cmNlKSB7fQotCi0gICAgZm9yZWFjaCBpICRvcHRfYXJyYXkgewotCXNldCBvcHRfbmFtZSBbbGluZGV4ICRpIDBdCi0Jc2V0IG9wdF92YWwgW2xpbmRleCAkaSAxXQotCWlmICFbaW5mbyBleGlzdHMgb3B0cygkb3B0X25hbWUpXSB7Ci0JICAgIHBlcnJvciAidW5rbm93biBvcHRpb24gJG9wdF9uYW1lIGluIGZpbGUgJGZpbGUuZCIKLQkgICAgdW5yZXNvbHZlZCAkc3ViZGlyLyRuYW1lCi0JICAgIHJldHVybgotCX0KLQlpZiBbc3RyaW5nIGxlbmd0aCAkb3B0cygkb3B0X25hbWUpXSB7Ci0JICAgIHBlcnJvciAib3B0aW9uICRvcHRfbmFtZSBtdWx0aXBseSBzZXQgaW4gJGZpbGUuZCIKLQkgICAgdW5yZXNvbHZlZCAkc3ViZGlyLyRuYW1lCi0JICAgIHJldHVybgotCX0KLQlzZXQgb3B0cygkb3B0X25hbWUpICRvcHRfdmFsCi0gICAgfQotCi0gICAgaWYgeyRvcHRzKFBST0cpICE9ICIifSB7Ci0Jc3dpdGNoIC0tICRvcHRzKFBST0cpIHsKLQkgICAgb2JqZHVtcAotCQl7IHNldCBwcm9ncmFtIG9iamR1bXAgfQotCSAgICBubQotCQl7IHNldCBwcm9ncmFtIG5tIH0KLQkgICAgb2JqY29weQotCQl7IHNldCBwcm9ncmFtIG9iamNvcHkgfQotCSAgICBkZWZhdWx0Ci0JCXsgcGVycm9yICJ1bnJlY29nbml6ZWQgcHJvZ3JhbSBvcHRpb24gJG9wdHMoUFJPRykgaW4gJGZpbGUuZCIKLQkJICB1bnJlc29sdmVkICRzdWJkaXIvJG5hbWUKLQkJICByZXR1cm4gfQotCX0KLSAgICB9IGVsc2UgewotCSMgR3Vlc3Mgd2hpY2ggcHJvZ3JhbSB0byBydW4sIGJ5IHNlZWluZyB3aGljaCBvcHRpb24gd2FzIHNwZWNpZmllZC4KLQlzZXQgcHJvZ3JhbSAiIgotCWZvcmVhY2ggcCB7b2JqZHVtcCBvYmpjb3B5IG5tfSB7Ci0JICAgIGlmIHskb3B0cygkcCkgIT0gIiJ9IHsKLQkJaWYgeyRwcm9ncmFtICE9ICIifSB7Ci0JCSAgICBwZXJyb3IgImFtYmlndW91cyBkdW1wIHByb2dyYW0gaW4gJGZpbGUuZCIKLQkJICAgIHVucmVzb2x2ZWQgJHN1YmRpci8kbmFtZQotCQkgICAgcmV0dXJuCi0JCX0gZWxzZSB7Ci0JCSAgICBzZXQgcHJvZ3JhbSAkcAotCQl9Ci0JICAgIH0KLQl9Ci0JaWYgeyRwcm9ncmFtID09ICIifSB7Ci0JICAgIHBlcnJvciAiZHVtcCBwcm9ncmFtIHVuc3BlY2lmaWVkIGluICRmaWxlLmQiCi0JICAgIHVucmVzb2x2ZWQgJHN1YmRpci8kbmFtZQotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotCi0gICAgc2V0IHByb2dvcHRzMSAkb3B0cygkcHJvZ3JhbSkKLSAgICBldmFsIHNldCBwcm9nb3B0cyBcJFtzdHJpbmcgdG91cHBlciAkcHJvZ3JhbV1GTEFHUwotICAgIGV2YWwgc2V0IGJpbmFyeSBcJFtzdHJpbmcgdG91cHBlciAkcHJvZ3JhbV0KLSAgICBpZiB7ICRvcHRzKG5hbWUpID09ICIiIH0gewotCXNldCB0ZXN0bmFtZSAiJHN1YmRpci8kbmFtZSIKLSAgICB9IGVsc2UgewotCXNldCB0ZXN0bmFtZSAkb3B0cyhuYW1lKQotICAgIH0KLQotICAgIGlmIHsgJG9wdHMoc291cmNlKSA9PSAiIiB9IHsKLQlzZXQgc291cmNlZmlsZSAke2ZpbGV9LnMKLSAgICB9IGVsc2UgewotCXNldCBzb3VyY2VmaWxlICRzcmNkaXIvJHN1YmRpci8kb3B0cyhzb3VyY2UpCi0gICAgfQotCi0gICAgc2VuZF9sb2cgIiRBUyAkQVNGTEFHUyAkb3B0cyhhcykgLW8gZHVtcC5vICRzb3VyY2VmaWxlXG4iCi0gICAgY2F0Y2ggImV4ZWMgJHNyY2Rpci9saWIvcnVuICRBUyAkQVNGTEFHUyAkb3B0cyhhcykgLW8gZHVtcC5vICRzb3VyY2VmaWxlIiBjb21wX291dHB1dAotICAgIHNldCBjb21wX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGNvbXBfb3V0cHV0XQotCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQlzZW5kX2xvZyAiJGNvbXBfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGNvbXBfb3V0cHV0IiAzCi0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiB7IFt3aGljaCAkYmluYXJ5XSA9PSAwIH0gewotCXVudGVzdGVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIGlmIHsgJHByb2dvcHRzMSA9PSAiIiB9IHsgc2V0ICRwcm9nb3B0czEgIi1yIiB9Ci0gICAgdmVyYm9zZSAicnVubmluZyAkYmluYXJ5ICRwcm9nb3B0cyAkcHJvZ29wdHMxIiAzCi0KLSAgICAjIE9iamNvcHksIHVubGlrZSB0aGUgb3RoZXIgdHdvLCB3b24ndCBzZW5kIGl0cyBvdXRwdXQgdG8gc3Rkb3V0LAotICAgICMgc28gd2UgaGF2ZSB0byBydW4gaXQgc3BlY2lhbGx5LgotICAgIGlmIHsgJHByb2dyYW0gPT0gIm9iamNvcHkiIH0gewotCXNlbmRfbG9nICIkYmluYXJ5ICRwcm9nb3B0cyAkcHJvZ29wdHMxIGR1bXAubyBkdW1wLm91dFxuIgotCWNhdGNoICJleGVjICRiaW5hcnkgJHByb2dvcHRzICRwcm9nb3B0czEgZHVtcC5vIGR1bXAub3V0IiBjb21wX291dHB1dAotCXNldCBjb21wX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGNvbXBfb3V0cHV0XQotCWlmICFbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0gdGhlbiB7Ci0JICAgIHNlbmRfbG9nICIkY29tcF9vdXRwdXRcbiIKLQkgICAgZmFpbCAkdGVzdG5hbWUKLQkgICAgcmV0dXJuCi0JfQotICAgIH0gZWxzZSB7Ci0Jc2VuZF9sb2cgIiRiaW5hcnkgJHByb2dvcHRzICRwcm9nb3B0czEgZHVtcC5vID4gZHVtcC5vdXRcbiIKLQljYXRjaCAiZXhlYyAkYmluYXJ5ICRwcm9nb3B0cyAkcHJvZ29wdHMxIGR1bXAubyA+IGR1bXAub3V0IiBjb21wX291dHB1dAotCXNldCBjb21wX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGNvbXBfb3V0cHV0XQotCWlmICFbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0gdGhlbiB7Ci0JICAgIHNlbmRfbG9nICIkY29tcF9vdXRwdXRcbiIKLQkgICAgZmFpbCAkdGVzdG5hbWUKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLQotICAgIHZlcmJvc2VfZXZhbCB7W2ZpbGVfY29udGVudHMgImR1bXAub3V0Il19IDMKLSAgICBpZiB7IFtyZWdleHBfZGlmZiAiZHVtcC5vdXQiICIke2ZpbGV9LmQiXSB9IHRoZW4gewotCWZhaWwgJHRlc3RuYW1lCi0JdmVyYm9zZSAib3V0cHV0IGlzIFtmaWxlX2NvbnRlbnRzICJkdW1wLm91dCJdIiAyCi0JcmV0dXJuCi0gICAgfQotCi0gICAgcGFzcyAkdGVzdG5hbWUKLX0KLQotcHJvYyBzbHVycF9vcHRpb25zIHsgZmlsZSB9IHsKLSAgICBpZiBbY2F0Y2ggeyBzZXQgZiBbb3BlbiAkZmlsZSByXSB9IHhdIHsKLQkjcGVycm9yICJjb3VsZG4ndCBvcGVuIGAkZmlsZSc6ICR4IgotCXBlcnJvciAiJHgiCi0JcmV0dXJuIC0xCi0gICAgfQotICAgIHNldCBvcHRfYXJyYXkge30KLSAgICAjIHdoaXRlc3BhY2UgZXhwcmVzc2lvbgotICAgIHNldCB3cyAge1sgCV0qfQotICAgIHNldCBud3Mge1teIAldKn0KLSAgICAjIHdoaXRlc3BhY2UgaXMgaWdub3JlZCBhbnl3aGVyZSBleGNlcHQgd2l0aGluIHRoZSBvcHRpb25zIGxpc3Q7Ci0gICAgIyBvcHRpb24gbmFtZXMgYXJlIGFscGhhYmV0aWMgb25seQotICAgIHNldCBwYXQgIl4jJHt3c30oXFthLXpBLVpcXSopJHdzOiR7d3N9KC4qKSR3c1wkIgotICAgIHdoaWxlIHsgW2dldHMgJGYgbGluZV0gIT0gLTEgfSB7Ci0Jc2V0IGxpbmUgW3N0cmluZyB0cmltICRsaW5lXQotCSMgV2hpdGVzcGFjZSBoZXJlIGlzIHNwYWNlLXRhYi4KLQlpZiBbcmVnZXhwICRwYXQgJGxpbmUgeHh4IG9wdF9uYW1lIG9wdF92YWxdIHsKLQkgICAgIyBtYXRjaCEKLQkgICAgbGFwcGVuZCBvcHRfYXJyYXkgW2xpc3QgJG9wdF9uYW1lICRvcHRfdmFsXQotCX0gZWxzZSB7Ci0JICAgIGJyZWFrCi0JfQotICAgIH0KLSAgICBjbG9zZSAkZgotICAgIHJldHVybiAkb3B0X2FycmF5Ci19Ci0KLXByb2Mgb2JqZHVtcCB7IG9wdHMgfSB7Ci0gICAgZ2xvYmFsIE9CSkRVTVAKLSAgICBnbG9iYWwgY29tcF9vdXRwdXQKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0KLSAgICBjYXRjaCAiZXhlYyAkT0JKRFVNUCAkb3B0cyIgY29tcF9vdXRwdXQKLSAgICBzZXQgY29tcF9vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRjb21wX291dHB1dF0KLSAgICB2ZXJib3NlICJvYmpkdW1wIG91dHB1dD0kY29tcF9vdXRwdXRcbiIgMwotfQotCi1wcm9jIG9iamR1bXBfc3RhcnRfbm9fc3ViZGlyIHsgcHJvZyBvcHRzIH0gewotICAgIGdsb2JhbCBPQkpEVU1QCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzcGF3bl9pZAotCi0gICAgdmVyYm9zZSAiU3RhcnRpbmcgJE9CSkRVTVAgJG9wdHMgJHByb2ciIDIKLSAgICBjYXRjaCB7Ci0Jc3Bhd24gLW5vZWNobyAtbm90dHlpbml0ICRzcmNkaXIvbGliL3J1biAkT0JKRFVNUCAkb3B0cyAkcHJvZwotICAgIH0gZm9vCi0gICAgaWYgIVtyZWdleHAge15bMC05XSt9ICRmb29dIHRoZW4gewotCXBlcnJvciAiQ2FuJ3QgcnVuICRwcm9nOiAkZm9vIgotICAgIH0KLX0KLQotcHJvYyBvYmpkdW1wX2ZpbmlzaCB7IH0gewotICAgIGdsb2JhbCBzcGF3bl9pZAotCi0gICAgY2F0Y2ggImNsb3NlIgotICAgIGNhdGNoICJ3YWl0IgotfQotCi0jIERlZmF1bHQgdGltZW91dCBpcyAxMCBzZWNvbmRzLCBsb3NlcyBvbiBhIHNsb3cgbWFjaGluZS4gIEJ1dCBzb21lCi0jIGNvbmZpZ3VyYXRpb25zIG9mIGRlamFnbnUgbWF5IG92ZXJyaWRlIGl0LgotaWYgeyR0aW1lb3V0PDEyMH0gdGhlbiB7IHNldCB0aW1lb3V0IDEyMCB9Ci0KLWV4cGVjdF9hZnRlciAtaSB7Ci0gICAgdGltZW91dAkJCXsgcGVycm9yICJ0aW1lb3V0IiB9Ci0gICAgInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIJeyBwZXJyb3IgInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIgfQotICAgIGJ1ZmZlcl9mdWxsCQkJeyBwZXJyb3IgImJ1ZmZlciBmdWxsIiB9Ci0gICAgZW9mCQkJCXsgcGVycm9yICJlb2YiIH0KLX0KLQotIyByZWdleHBfZGlmZiwgYmFzZWQgb24gc2ltcGxlX2RpZmYgdGFrZW4gZnJvbSBsZCB0ZXN0IHN1aXRlCi0jCWNvbXBhcmVzIHR3byBmaWxlcyBsaW5lLWJ5LWxpbmUKLSMJZmlsZTEgY29udGFpbnMgc3RyaW5ncywgZmlsZTIgY29udGFpbnMgcmVnZXhwcyBhbmQgIy1jb21tZW50cwotIwlibGFuayBsaW5lcyBhcmUgaWdub3JlZCBpbiBlaXRoZXIgZmlsZQotIwlyZXR1cm5zIG5vbi16ZXJvIGlmIGRpZmZlcmVuY2VzIGV4aXN0Ci0jCi1wcm9jIHJlZ2V4cF9kaWZmIHsgZmlsZV8xIGZpbGVfMiB9IHsKLQotICAgIHNldCBlb2YgLTEKLSAgICBzZXQgZW5kXzEgMAotICAgIHNldCBlbmRfMiAwCi0gICAgc2V0IGRpZmZlcmVuY2VzIDAKLSAgICBzZXQgZGlmZl9wYXNzIDAKLQotICAgIGlmIFtmaWxlIGV4aXN0cyAkZmlsZV8xXSB0aGVuIHsKLQlzZXQgZmlsZV9hIFtvcGVuICRmaWxlXzEgcl0KLSAgICB9IGVsc2UgewotCXdhcm5pbmcgIiRmaWxlXzEgZG9lc24ndCBleGlzdCIKLQlyZXR1cm4gMQotICAgIH0KLQotICAgIGlmIFtmaWxlIGV4aXN0cyAkZmlsZV8yXSB0aGVuIHsKLQlzZXQgZmlsZV9iIFtvcGVuICRmaWxlXzIgcl0KLSAgICB9IGVsc2UgewotCWZhaWwgIiRmaWxlXzIgZG9lc24ndCBleGlzdCIKLQljbG9zZSAkZmlsZV9hCi0JcmV0dXJuIDEKLSAgICB9Ci0KLSAgICB2ZXJib3NlICIgUmVnZXhwLWRpZmYnaW5nOiAkZmlsZV8xICRmaWxlXzIiIDIKLQotICAgIHdoaWxlIHsgMSB9IHsKLQlzZXQgbGluZV9hICIiCi0Jc2V0IGxpbmVfYiAiIgotCXdoaWxlIHsgW3N0cmluZyBsZW5ndGggJGxpbmVfYV0gPT0gMCB9IHsKLQkgICAgaWYgeyBbZ2V0cyAkZmlsZV9hIGxpbmVfYV0gPT0gJGVvZiB9IHsKLQkJc2V0IGVuZF8xIDEKLQkJYnJlYWsKLQkgICAgfQotCX0KLQl3aGlsZSB7IFtzdHJpbmcgbGVuZ3RoICRsaW5lX2JdID09IDAgfHwgW3N0cmluZyBtYXRjaCAiIyoiICRsaW5lX2JdIH0gewotCSAgICBpZiBbIHN0cmluZyBtYXRjaCAiI3Bhc3MiICRsaW5lX2IgXSB7Ci0JCXNldCBlbmRfMiAxCi0JCXNldCBkaWZmX3Bhc3MgMQotCQlicmVhawotCSAgICB9Ci0JICAgIGlmIHsgW2dldHMgJGZpbGVfYiBsaW5lX2JdID09ICRlb2YgfSB7Ci0JCXNldCBlbmRfMiAxCi0JCWJyZWFrCi0JICAgIH0KLQl9Ci0KLSAgICAgICAgaWYgeyAkZGlmZl9wYXNzIH0geyAKLSAgICAgICAgICAgIGJyZWFrIAotICAgICAgICB9IGVsc2VpZiB7ICRlbmRfMSAmJiAkZW5kXzIgfSB7IAotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgfSBlbHNlaWYgeyAkZW5kXzEgfSB7Ci0gICAgICAgICAgICBzZW5kX2xvZyAiZXh0cmEgcmVnZXhwcyBpbiAkZmlsZV8yIHN0YXJ0aW5nIHdpdGggXCJeJGxpbmVfYiRcIlxuRU9GIGZyb20gJGZpbGVfMVxuIgotICAgICAgICAgICAgdmVyYm9zZSAiZXh0cmEgcmVnZXhwcyBpbiAkZmlsZV8yIHN0YXJ0aW5nIHdpdGggXCJeJGxpbmVfYiRcIlxuRU9GIGZyb20gJGZpbGVfMSIgMwotICAgICAgICAgICAgc2V0IGRpZmZlcmVuY2VzIDEKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIH0gZWxzZWlmIHsgJGVuZF8yIH0gewotICAgICAgICAgICAgc2VuZF9sb2cgImV4dHJhIGxpbmVzIGluICRmaWxlXzEgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9hJFwiXG5FT0YgZnJvbSAkZmlsZV8yXG4iCi0gICAgICAgICAgICB2ZXJib3NlICJleHRyYSBsaW5lcyBpbiAkZmlsZV8xIHN0YXJ0aW5nIHdpdGggXCJeJGxpbmVfYSRcIlxuRU9GIGZyb20gJGZpbGVfMlxuIiAzCi0gICAgICAgICAgICBzZXQgZGlmZmVyZW5jZXMgMQotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZlcmJvc2UgInJlZ2V4cCBcIl4kbGluZV9iJFwiXG5saW5lICAgXCIkbGluZV9hXCIiIDMKLSAgICAgICAgICAgIGlmICFbcmVnZXhwICJeJGxpbmVfYiQiICIkbGluZV9hIl0gewotCQlzZW5kX2xvZyAicmVnZXhwX2RpZmYgbWF0Y2ggZmFpbHVyZVxuIgotCQlzZW5kX2xvZyAicmVnZXhwIFwiXiRsaW5lX2IkXCJcbmxpbmUgICBcIiRsaW5lX2FcIlxuIgotCQlzZXQgZGlmZmVyZW5jZXMgMQotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiB7ICRkaWZmZXJlbmNlcyA9PSAwICYmICEkZGlmZl9wYXNzICYmIFtlb2YgJGZpbGVfYV0gIT0gW2VvZiAkZmlsZV9iXSB9IHsKLQlzZW5kX2xvZyAiJGZpbGVfMSBhbmQgJGZpbGVfMiBhcmUgZGlmZmVyZW50IGxlbmd0aHNcbiIKLQl2ZXJib3NlICIkZmlsZV8xIGFuZCAkZmlsZV8yIGFyZSBkaWZmZXJlbnQgbGVuZ3RocyIgMwotCXNldCBkaWZmZXJlbmNlcyAxCi0gICAgfQotCi0gICAgY2xvc2UgJGZpbGVfYQotICAgIGNsb3NlICRmaWxlX2IKLQotICAgIHJldHVybiAkZGlmZmVyZW5jZXMKLX0KLQotcHJvYyBmaWxlX2NvbnRlbnRzIHsgZmlsZW5hbWUgfSB7Ci0gICAgc2V0IGZpbGUgW29wZW4gJGZpbGVuYW1lIHJdCi0gICAgc2V0IGNvbnRlbnRzIFtyZWFkICRmaWxlXQotICAgIGNsb3NlICRmaWxlCi0gICAgcmV0dXJuICRjb250ZW50cwotfQotCi1wcm9jIHZlcmJvc2VfZXZhbCB7IGV4cHIgeyBsZXZlbCAxIH0gfSB7Ci0gICAgZ2xvYmFsIHZlcmJvc2UKLSAgICBpZiAkdmVyYm9zZT4kbGV2ZWwgdGhlbiB7IGV2YWwgdmVyYm9zZSAiJGV4cHIiICRsZXZlbCB9Ci19Ci0KLSMgVGhpcyBkZWZpbml0aW9uIGlzIHRha2VuIGZyb20gYW4gdW5yZWxlYXNlZCB2ZXJzaW9uIG9mIERlamFHbnUuICBPbmNlCi0jIHRoYXQgdmVyc2lvbiBnZXRzIHJlbGVhc2VkLCBhbmQgaGFzIGJlZW4gb3V0IGluIHRoZSB3b3JsZCBmb3IgYSBmZXcKLSMgbW9udGhzIGF0IGxlYXN0LCBpdCBtYXkgYmUgc2FmZSB0byBkZWxldGUgdGhpcyBjb3B5LgotaWYgIVtzdHJpbmcgbGVuZ3RoIFtpbmZvIHByb2MgcHJ1bmVfd2FybmluZ3NdXSB7Ci0gICAgIwotICAgICMgcHJ1bmVfd2FybmluZ3MgLS0gZGVsZXRlIHZhcmlvdXMgc3lzdGVtIHZlcmJvc2l0aWVzIGZyb20gVEVYVC4KLSAgICAjCi0gICAgIyBBbiBleGFtcGxlIGlzOgotICAgICMgbGQuc286IHdhcm5pbmc6IC91c3IvbGliL2xpYmMuc28uMS44LjEgaGFzIG9sZGVyIHJldmlzaW9uIHRoYW4gZXhwZWN0ZWQgOQotICAgICMKLSAgICAjIFNpdGVzIHdpdGggcGFydGljdWxhciB2ZXJib3NlIG9zJ3MgbWF5IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcyBpbiBzaXRlLmV4cC4KLSAgICAjCi0gICAgcHJvYyBwcnVuZV93YXJuaW5ncyB7IHRleHQgfSB7Ci0JIyBUaGlzIGlzIGZyb20gc3VuNCdzLiAgRG8gaXQgZm9yIGFsbCBtYWNoaW5lcyBmb3Igbm93LgotCSMgVGhlICJcXDEiIGlzIHRvIHRyeSB0byBwcmVzZXJ2ZSBhICJcbiIgYnV0IG9ubHkgaWYgbmVjZXNzYXJ5LgotCXJlZ3N1YiAtYWxsICIoXnxcbikobGQuc286IHdhcm5pbmc6XFteXG5cXSpcbj8pKyIgJHRleHQgIlxcMSIgdGV4dAotCi0JIyBJdCBtaWdodCBiZSB0ZW1wdGluZyB0byBnZXQgY2FycmllZCBhd2F5IGFuZCBkZWxldGUgYmxhbmsgbGluZXMsIGV0Yy4KLQkjIEp1c3QgZGVsZXRlICpleGFjdGx5KiB3aGF0IHdlJ3JlIGFzayB0bywgYW5kIHRoYXQncyBpdC4KLQlyZXR1cm4gJHRleHQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9nYXMtZGcuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZ2FzLWRnLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmN2YzMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2xpYi9nYXMtZGcuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIyBEZWZpbmUgZ2FzIGNhbGxiYWNrcyBmb3IgZGcuZXhwLgotCi1sb2FkX2xpYiBkZy5leHAKLQotIyBUaGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgc3RpbGwgaW4gYSBiaXQgb2YgZmx1eC4KLSMgSXQgc2hvdWxkIGJlIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgdG8gYXNzZW1ibGUsIGxpbmssIGFuZCBydW4gYSBmaWxlCi0jIGJ1dCB3ZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCB0aGF0LiAgQXNzZW1ibGVyIHRlc3RjYXNlcyBhcmVuJ3QgdXN1YWxseQotIyB0aGF0IGVsYWJvcmF0ZSBhbnl3YXkuICA6LSkKLQotcHJvYyBnYXMtZGctdGVzdCB7IHByb2cgZG9fd2hhdCB0b29sX2ZsYWdzIH0gewotICAgICMgRklYTUU6IHRoZSBnYXMgdGVzdHN1aXRlIGRvZXNuJ3QgZGVmaW5lIHRtcGRpci4gIFVzZSBvdXRkaXI/Ci0gICAgc2V0IG91dHB1dF9maWxlICIuL2Eub3V0IgotCi0gICAgc3dpdGNoICRkb193aGF0IHsKLQkicHJlcHJvY2VzcyIgewotCX0KLQkiYXNzZW1ibGUiIHsKLQl9Ci0JImxpbmsiIHsKLQl9Ci0JInJ1biIgewotCSAgICAjIFRoaXMgaXMgdGhlIG9ubHkgcGxhY2Ugd2hlcmUgd2UgY2FyZSBpZiBhbiBleGVjdXRhYmxlIHdhcwotCSAgICAjIGNyZWF0ZWQgb3Igbm90LiAgSWYgaXQgd2FzLCBkZy5leHAgd2lsbCB0cnkgdG8gcnVuIGl0LgotCSAgICBjYXRjaCAiZXhlYyBybSAtZiAkb3V0cHV0X2ZpbGUiCi0JfQotCWRlZmF1bHQgewotCSAgICBwZXJyb3IgIiRkb193aGF0OiBub3QgYSB2YWxpZCBkZy1kbyBrZXl3b3JkIgotCSAgICByZXR1cm4gIiIKLQl9Ci0gICAgfQotCi0gICAgIyBnYXNfc3RhcnQgcHJlcGVuZHMgJHNyY2Rpci8kc3ViZGlyIHNvIHdlIG11c3QgcmVtb3ZlIGl0IGZyb20gUFJPRwotICAgICMgaWYgcHJlc2VudC4gIEZpcnN0IHJlbW92ZSBleHRyYW5lb3VzIC8vJ3MuCi0gICAgZ2xvYmFsIHNyY2RpciBzdWJkaXIKLSAgICBzZXQgZGlyICIkc3JjZGlyLyRzdWJkaXIiCi0gICAgcmVnc3ViIC1hbGwgIi8vIiAkZGlyICIvIiBkaXIKLSAgICByZWdzdWIgLWFsbCAiLy8iICRwcm9nICIvIiBwcm9nCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiJGRpci8qIiAkcHJvZ10gewotCXJlZ3N1YiAiJGRpciIgJHByb2cgIiIgcHJvZwotICAgIH0KLQotICAgICMgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGdhc19zdGFydCBidXQgaXQgZG9lc24ndCBzZXQgY29tcF9vdXRwdXQuCi0gICAgcmV0dXJuIFtnYXNfcnVuICRwcm9nICR0b29sX2ZsYWdzICIiXQotfQotCi1wcm9jIGdhcy1kZy1wcnVuZSB7IHN5c3RlbSB0ZXh0IH0gewotICAgICNzZW5kX3VzZXIgIkJlZm9yZTokdGV4dFxuIgotICAgIHJlZ3N1YiAtYWxsICIoXnxcbilcW15cblxdKjogQXNzZW1ibGVyIG1lc3NhZ2VzOlxbXlxuXF0qIiAkdGV4dCAiIiB0ZXh0Ci0gICAgcmVnc3ViIC1hbGwgIihefFxuKVxbXlxuXF0qOiBFbmQgb2YgZmlsZSBub3QgYXQgZW5kXFteXG5cXSpOZXdsaW5lIGluc2VydGVkLiIgJHRleHQgIiIgdGV4dAotICAgICNzZW5kX3VzZXIgIkFmdGVyOiR0ZXh0XG4iCi0KLSAgICByZXR1cm4gJHRleHQKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL3J1biBiL2dhcy90ZXN0c3VpdGUvbGliL3J1bgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDQxNTBmOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2xpYi9ydW4KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMhL2Jpbi9zaAotZXZhbCBleGVjICRACmRpZmYgLS1naXQgYS9nYXMvdm1zY29uZi5zaCBiL2dhcy92bXNjb25mLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTQ1MzhhLi4wMDAwMDAwCi0tLSBhL2dhcy92bXNjb25mLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSMhL2Jpbi9zaAotCi1jYXQgPDwgJ0VPRicKLSQhbWFrZS1nYXMuY29tCi0kISBTZXQgdGhlIGRlZiBkaXIgdG8gcHJvcGVyIHBsYWNlIGZvciB1c2UgaW4gYmF0Y2guIFdvcmtzIGZvciBpbnRlcmFjdGl2ZSB0by4KLSRmbG5tID0gZiRlbnZpcm9tZW50KCJQUk9DRURVUkUiKSAgICAgISBnZXQgY3VycmVudCBwcm9jZWR1cmUgbmFtZQotJHNldCBkZWZhdWx0ICdmJHBhcnNlKGZsbm0sLCwiREVWSUNFIiknJ2YkcGFyc2UoZmxubSwsLCJESVJFQ1RPUlkiKScKLSR2ID0gJ2YkdmVyaWZ5KDApJwotJCEKLSQhCUNvbW1hbmQgZmlsZSB0byBidWlsZCBhIEdOVSBhc3NlbWJsZXIgb24gVk1TCi0kIQotJCEJSWYgeW91IGFyZSB1c2luZyBhIHZlcnNpb24gb2YgR0NDIHRoYXQgc3VwcG9ydHMgZ2xvYmFsIGNvbnN0YW50cwotJCEJeW91IHNob3VsZCByZW1vdmUgdGhlIGRlZmluZT0iY29uc3Q9IiBmcm9tIHRoZSBnY2MgbGluZXMuCi0kIQotJCEJQ2F1dGlvbjogIFZlcnNpb25zIDEuMzguMSBhbmQgZWFybGllciBoYWQgYSBidWcgaW4gdGhlIGhhbmRsaW5nIG9mCi0kIQlzb21lIHN0YXRpYyBjb25zdGFudHMuIElmIHlvdSBhcmUgdXNpbmcgc3VjaCBhIHZlcnNpb24gb2YgdGhlCi0kIQlhc3NlbWJsZXIsIGFuZCB5b3Ugd2lzaCB0byBjb21waWxlIHdpdGhvdXQgdGhlICJjb25zdD0iIGhhY2ssCi0kIQl5b3Ugc2hvdWxkIGZpcnN0IGJ1aWxkIHRoaXMgdmVyc2lvbiAqd2l0aCogdGhlICJjb25zdD0iCi0kIQlkZWZpbml0aW9uLCBhbmQgdGhlbiB1c2UgdGhhdCBhc3NlbWJsZXIgdG8gcmVidWlsZCBpdCB3aXRob3V0IHRoZQotJCEJImNvbnN0PSIgZGVmaW5pdGlvbi4gIEZhaWx1cmUgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBhc3NlbWJsZXIKLSQhCXRoYXQgd2lsbCBtdW5nIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLSQhCi0kIQlOb3RlOiBUaGUgdmVyc2lvbiBvZiBnYXMgc2hpcHBlZCBvbiB0aGUgR0NDIFZNUyB0YXBlcyBoYXMgYmVlbiBwYXRjaGVkCi0kIQl0byBmaXggdGhlIGFib3ZlIG1lbnRpb25lZCBidWcuCi0kIQotJAkhVGhlIGdjYy12bXMgZHJpdmVyIHdhcyBtb2RpZmllZCB0byB1c2UgYC0xJyBxdWl0ZSBzb21lIHRpbWUgYWdvLAotJAkhc28gZG9uJ3QgZWNobyB0aGlzIHRleHQgYW55IG1vcmUuLi4KLSQgIXdyaXRlIHN5cyRvdXRwdXQgIklmIHRoaXMgYXNzZW1ibGVyIGlzIGdvaW5nIHRvIGJlIHVzZWQgd2l0aCBHQ0MgMS5uLCB5b3UiCi0kICF3cml0ZSBzeXMkb3V0cHV0ICJuZWVkIHRvIG1vZGlmeSB0aGUgZHJpdmVyIHRvIHN1cHBseSB0aGUgLTEgc3dpdGNoIHRvIGdhcy4iCi0kICF3cml0ZSBzeXMkb3V0cHV0ICJUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2Ugb2YgYSBzbWFsbCBjaGFuZ2UgaW4gaG93IGdsb2JhbCIKLSQgIXdyaXRlIHN5cyRvdXRwdXQgImNvbnN0YW50IHZhcmlhYmxlcyBhcmUgaGFuZGxlZC4gIEZhaWx1cmUgdG8gaW5jbHVkZSB0aGlzIgotJCAhd3JpdGUgc3lzJG91dHB1dCAid2lsbCByZXN1bHQgaW4gbGlua2VyIHdhcm5pbmcgbWVzc2FnZXMgYWJvdXQgbWlzbWF0Y2hlZAotJCAhd3JpdGUgc3lzJG91dHB1dCAicHNlY3QgYXR0cmlidXRlcy4iCi0kIQotJCBnYXNfaG9zdD0idm1zIgotJCBhcmNoX2luZHggPSAxICsgKChmJGdldHN5aSgiQ1BVIikuZ2UuMTI4KS5hbmQuMSkJISB2YXg9PTEsIGFscGhhPT0yCi0kIGFyY2ggPSBmJGVsZW1lbnQoYXJjaF9pbmR4LCJ8IiwifFZBWHxBbHBoYXwiKQotJCBpZiBhcmNoLmVxcy4iVkFYIgotJCB0aGVuCi0kICBjcHVfdHlwZT0idmF4IgotJCAgb2JqX2Zvcm1hdD0idm1zIgotJCAgYXRvZj0idmF4IgotJCBlbHNlCi0kICBjcHVfdHlwZT0iYWxwaGEiCi0kICBvYmpfZm9ybWF0PSJldmF4IgotJCAgYXRvZj0iaWVlZSIKLSQgZW5kaWYKLSQgZW11bGF0aW9uPSJnZW5lcmljIgotJCEKLSQJQ09QWQk9ICJjb3B5L25vTG9nIgotJCEKLSQgQ19ERUZTIDo9IiIiVk1TIiIiCi0kISBDX0RFRlMgOj0iIiJWTVMiIiIsIiIiY29uc3Q9IiIiCi0kIENfSU5DTFVERVMJPSAiL0luY2x1ZGU9KFtdLFsuY29uZmlnXSxbLS5pbmNsdWRlXSxbLS5pbmNsdWRlLmFvdXRdKSIKLSQgQ19GTEFHUwk9ICIvbm9WZXJib3NlL0RlYnVnIiArIGNfaW5jbHVkZXMKLSQhCi0kIQotJCBvbiBlcnJvciB0aGVuICBnb3RvIGJhaWwKLSQgaWYgZiRzZWFyY2goIlstLmxpYmliZXJ0eV1saWJlcnR5Lm9sYiIpLmVxcy4iIgotJCB0aGVuCUBbLS5saWJpYmVydHlddm1zYnVpbGQuY29tCi0kCXdyaXRlIHN5cyRvdXRwdXQgIk5vdyBidWlsZGluZyBnYXMuIgotJCBlbmRpZgotJCBpZiAiJydwMSciIC5lcXMuICJMSU5LIiB0aGVuIGdvdG8gTGluawotJCEKLSQhICBUaGlzIGhlbHBzIGdjYyAxLm5uIGZpbmQgdGhlIGFvdXQvKiBmaWxlcy4KLSQhCi0kIGFvdXRfZGV2ID0gZiRwYXJzZShmbG5tLCwsIkRFVklDRSIpCi0kIHRtcCA9IGFvdXRfZGV2IC0gIjoiCi0kaWYgZiR0cm5sbm0odG1wKS5uZXMuIiIgdGhlbiBhb3V0X2RldiA9IGYkdHJubG5tKHRtcCkKLSQgYW91dF9kaXIgPSBhb3V0X2RlditmJHBhcnNlKGZsbm0sLCwiRElSRUNUT1JZIiknIC0KLQktICJHQVNdIiArICJJTkNMVURFLkFPVVQuXSIgLSAiXVsiCi0kYXNzaWduICdhb3V0X2RpcicgYW91dC90cmFuPWNvbmMKLSQgb3Bjb2RlX2RpciA9IGFvdXRfZGV2K2YkcGFyc2UoZmxubSwsLCJESVJFQ1RPUlkiKScgLQotCS0gIkdBU10iICsgIklOQ0xVREUuT1BDT0RFLl0iIC0gIl1bIgotJGFzc2lnbiAnb3Bjb2RlX2Rpcicgb3Bjb2RlL3RyYW49Y29uYwotJCEKLSQgc2V0IHZlcmlmeQotJCEKLSQgZ2NjICdjX2ZsYWdzJy9EZWZpbmU9KCdDX0RFRlMnKS9PYmplY3Q9W110Yy0nY3B1X3R5cGUnLm9iaiBbLmNvbmZpZ110Yy0nY3B1X3R5cGUnLmMKLSQgZ2NjICdjX2ZsYWdzJy9EZWZpbmU9KCdDX0RFRlMnKS9PYmplY3Q9W11vYmotJ29ial9mb3JtYXQnLm9iaiBbLmNvbmZpZ11vYmotJ29ial9mb3JtYXQnLmMKLSQgZ2NjICdjX2ZsYWdzJy9EZWZpbmU9KCdDX0RFRlMnKS9PYmplY3Q9W11hdG9mLSdhdG9mJy5vYmogWy5jb25maWddYXRvZi0nYXRvZicuYwotRU9GCi0KLWNmaWxlcz0iYGVjaG8gJCogfCBzZWQgLWUgJ3MvXC5vLy5jL2cnIC1lICdzIS4uL1woW14gL10qXCkvXChbXiAvXSpcLmNcKSFbLS5cMV1cMiFnJ2AiCi0KLWZvciBjZmlsZSBpbiAkY2ZpbGVzIDsgZG8KLSAgY2FzZSAkY2ZpbGUgaW4KLSAgICAiWy0uIiopCi0JYmFzZT1gZWNobyAkY2ZpbGUgfCBzZWQgLWUgJ3MvXFsuKlxdLy8nIC1lICdzL1wuYyQvLydgCi0JZWNobyAiXCQgZ2NjICdjX2ZsYWdzJy9EZWZpbmU9KCdDX0RFRlMnKS9PYmplY3Q9W10kYmFzZS5vYmogJGNmaWxlIgotCTs7Ci0gICAgKikKLQllY2hvICJcJCBnY2MgJ2NfZmxhZ3MnL0RlZmluZT0oJ0NfREVGUycpICRjZmlsZSIKLQk7OwotICBlc2FjCi1kb25lCi0KLWNhdCA8PCAnRU9GJwotJGxpbms6Ci0kISdmJHZlcmlmeSgwKScKLSQgaWYgZiR0cm5sbm0oIklGSUxFJCIpLm5lcy4iIiB0aGVuICBjbG9zZS9ub0xvZyBpZmlsZSQKLSQgY3JlYXRlIGdjYy1hcy5vcHQKLSEKLSEJTGlua2VyIG9wdGlvbnMgZmlsZSBmb3IgR05VIGFzc2VtYmxlcgotIQotJCBvcGVuL0FwcGVuZCBpZmlsZSQgZ2NjLWFzLm9wdAotJCB3cml0ZSBpZmlsZSQgInRjLScnY3B1X3R5cGUnLm9iaiIKLSQgd3JpdGUgaWZpbGUkICJvYmotJydvYmpfZm9ybWF0Jy5vYmoiCi0kIHdyaXRlIGlmaWxlJCAiYXRvZi0nJ2F0b2YnLm9iaiIKLSQgQ09QWSBzeXMkaW5wdXQ6IGlmaWxlJDoKLUVPRgotCi1mb3Igb2JqIGluICQqIDsgZG8KLSAgIyBDaGFuZ2UgImZvby5vIiBpbnRvICJmb28ub2JqIi4KLSAgZWNobyAke29ian1iaiwtIHwgc2VkICdzIS4qLyEhZycKLWRvbmUKLQotY2F0IDw8ICdFT0YnCi1bLS5saWJpYmVydHldbGliZXJ0eS5vbGIvTGliCi1nbnVfY2M6WzAwMDAwMF1nY2NsaWIub2xiL0xpYixzeXMkbGlicmFyeTp2YXhjcnRsLm9sYi9MaWIKLSEgVGVsbCBsaW5rZXIgZXhhY3RseSB3aGF0IHBzZWN0IGF0dHJpYnV0ZXMgd2Ugd2FudCAtLSBtYXRjaCBWQVhDUlRMLgotcHNlY3RfYXR0cj1FTlZJUk9OLGxvbmcscGljLG92cixyZWwsZ2JsLG5vc2hyLG5vZXhlLHJkLHdydAotJCBjbG9zZSBpZmlsZSQKLSQgc2V0IHZlcmlmeT0oUHJvYyxub0ltYWcpCi0kIGxpbmsvbm9NYXAvRXhlYz1nY2MtYXMuZXhlIGdjYy1hcy5vcHQvT3B0LHZlcnNpb24ub3B0L09wdAotJCEKLSRiYWlsOiBleGl0ICRzdGF0dXMgKyAwKmYkdmVyaWZ5KHYpCSEnZiR2ZXJpZnkoMCknCi1FT0YKZGlmZiAtLWdpdCBhL2dhcy93cml0ZS5jIGIvZ2FzL3dyaXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZjc4YjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3dyaXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODg1ICswLDAgQEAKLS8qIHdyaXRlLmMgLSBlbWl0IC5vIGZpbGUKLSAgIENvcHlyaWdodCAoQykgMTk4NiwgODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgdGhpbmcgc2hvdWxkIGJlIHNldCB1cCB0byBkbyBieXRlb3JkZXJpbmcgY29ycmVjdGx5LiAgQnV0Li4uICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAib3V0cHV0LWZpbGUuaCIKLQotLyogVGhpcyBsb29rcyBsaWtlIGEgZ29vZCBpZGVhLiAgTGV0J3MgdHJ5IHR1cm5pbmcgaXQgb24gYWx3YXlzLCBmb3Igbm93LiAgKi8KLSN1bmRlZiAgQkZEX0ZBU1RfU0VDVElPTl9GSUxMCi0jZGVmaW5lIEJGRF9GQVNUX1NFQ1RJT05fRklMTAotCi0vKiBUaGUgTk9QX09QQ09ERSBpcyBmb3IgdGhlIGFsaWdubWVudCBmaWxsIHZhbHVlLiAgRmlsbCBpdCB3aXRoIGEgbm9wCi0gICBpbnN0cnVjdGlvbiBzbyB0aGF0IHRoZSBkaXNhc3NlbWJsZXIgZG9lcyBub3QgY2hva2Ugb24gaXQuICAqLwotI2lmbmRlZiBOT1BfT1BDT0RFCi0jZGVmaW5lIE5PUF9PUENPREUgMHgwMAotI2VuZGlmCi0KLSNpZm5kZWYgVENfQURKVVNUX1JFTE9DX0NPVU5UCi0jZGVmaW5lIFRDX0FESlVTVF9SRUxPQ19DT1VOVChGSVhQLENPVU5UKQotI2VuZGlmCi0KLSNpZm5kZWYgVENfRk9SQ0VfUkVMT0NBVElPTgotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKEZJWFApIDAKLSNlbmRpZgotCi0jaWZuZGVmIFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTgotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04oRklYUCxTRUcpIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkKLSNlbmRpZgotCi0jaWZuZGVmCU1EX1BDUkVMX0ZST01fU0VDVElPTgotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tKEZJWFApCi0jZW5kaWYKLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi1leHRlcm4gQ09OU1QgaW50IG1kX3Nob3J0X2p1bXBfc2l6ZTsKLWV4dGVybiBDT05TVCBpbnQgbWRfbG9uZ19qdW1wX3NpemU7Ci0jZW5kaWYKLQotaW50IHN5bWJvbF90YWJsZV9mcm96ZW47Ci12b2lkIHByaW50X2ZpeHVwIFBBUkFNUyAoKGZpeFMgKikpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RhdGljIHZvaWQgcmVudW1iZXJfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi0vKiBXZSBnZW5lcmFsbHkgYXR0YWNoIHJlbG9jcyB0byBmcmFnIGNoYWlucy4gIEhvd2V2ZXIsIGFmdGVyIHdlIGhhdmUKLSAgIGNoYWluZWQgdGhlc2UgYWxsIHRvZ2V0aGVyIGludG8gYSBzZWdtZW50LCBhbnkgcmVsb2NzIHdlIGFkZCBhZnRlcgotICAgdGhhdCBtdXN0IGJlIGF0dGFjaGVkIHRvIGEgc2VnbWVudC4gIFRoaXMgd2lsbCBpbmNsdWRlIHJlbG9jcyBhZGRlZAotICAgaW4gbWRfZXN0aW1hdGVfc2l6ZV9mb3JfcmVsYXgsIGZvciBleGFtcGxlLiAgKi8KLXN0YXRpYyBpbnQgZnJhZ3NfY2hhaW5lZCA9IDA7Ci0jZW5kaWYKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNpZm5kZWYgTUFOWV9TRUdNRU5UUwotc3RydWN0IGZyYWcgKnRleHRfZnJhZ19yb290Owotc3RydWN0IGZyYWcgKmRhdGFfZnJhZ19yb290Owotc3RydWN0IGZyYWcgKmJzc19mcmFnX3Jvb3Q7Ci0KLXN0cnVjdCBmcmFnICp0ZXh0X2xhc3RfZnJhZzsJLyogTGFzdCBmcmFnIGluIHNlZ21lbnQuICovCi1zdHJ1Y3QgZnJhZyAqZGF0YV9sYXN0X2ZyYWc7CS8qIExhc3QgZnJhZyBpbiBzZWdtZW50LiAqLwotc3RhdGljIHN0cnVjdCBmcmFnICpic3NfbGFzdF9mcmFnOwkvKiBMYXN0IGZyYWcgaW4gc2VnbWVudC4gKi8KLSNlbmRpZgotCi0jaWZuZGVmIEJGRAotc3RhdGljIG9iamVjdF9oZWFkZXJzIGhlYWRlcnM7Ci0jZW5kaWYKLQotbG9uZyBzdHJpbmdfYnl0ZV9jb3VudDsKLWNoYXIgKm5leHRfb2JqZWN0X2ZpbGVfY2hhclA7CS8qIFRyYWNrcyBvYmplY3QgZmlsZSBieXRlcy4gKi8KLQotI2lmbmRlZiBPQkpfVk1TCi1pbnQgbWFnaWNfbnVtYmVyX2Zvcl9vYmplY3RfZmlsZSA9IERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRTsKLSNlbmRpZgotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi1zdGF0aWMgaW50IG5fZml4dXBzOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RhdGljIGZpeFMgKmZpeF9uZXdfaW50ZXJuYWwgUEFSQU1TICgoZnJhZ1MgKiwgaW50IHdoZXJlLCBpbnQgc2l6ZSwKLQkJCQkgICAgICAgc3ltYm9sUyAqYWRkLCBzeW1ib2xTICpzdWIsCi0JCQkJICAgICAgIG9mZnNldFQgb2Zmc2V0LCBpbnQgcGNyZWwsCi0JCQkJICAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGUpKTsKLSNlbHNlCi1zdGF0aWMgZml4UyAqZml4X25ld19pbnRlcm5hbCBQQVJBTVMgKChmcmFnUyAqLCBpbnQgd2hlcmUsIGludCBzaXplLAotCQkJCSAgICAgICBzeW1ib2xTICphZGQsIHN5bWJvbFMgKnN1YiwKLQkJCQkgICAgICAgb2Zmc2V0VCBvZmZzZXQsIGludCBwY3JlbCwKLQkJCQkgICAgICAgaW50IHJfdHlwZSkpOwotI2VuZGlmCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgKCFkZWZpbmVkIChCRkQpICYmICFkZWZpbmVkIChPQkpfVk1TKSkKLXN0YXRpYyBsb25nIGZpeHVwX3NlZ21lbnQgUEFSQU1TICgoZml4UyAqIGZpeFAsIHNlZ1QgdGhpc19zZWdtZW50X3R5cGUpKTsKLSNlbmRpZgotc3RhdGljIHJlbGF4X2FkZHJlc3NUIHJlbGF4X2FsaWduIFBBUkFNUyAoKHJlbGF4X2FkZHJlc3NUIGFkZHIsIGludCBhbGlnbikpOwotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICEgZGVmaW5lZCAoQkZEKQotc3RhdGljIGZyYWdTICpjaGFpbl9mcmNoYWluc190b2dldGhlcl8xIFBBUkFNUyAoKHNlZ1QsIHN0cnVjdCBmcmNoYWluICopKTsKLSNlbmRpZgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0YXRpYyB2b2lkIGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyIFBBUkFNUyAoKGJmZCAqLCBzZWdULCBQVFIpKTsKLXN0YXRpYyB2b2lkIGN2dF9mcmFnX3RvX2ZpbGwgUEFSQU1TICgoc2VnVCwgZnJhZ1MgKikpOwotc3RhdGljIHZvaWQgcmVsYXhfYW5kX3NpemVfc2VnIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGFkanVzdF9yZWxvY19zeW1zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9jb250ZW50cyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBzZXRfc3ltdGFiIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICghIGRlZmluZWQgKEJGRCkgJiYgISBkZWZpbmVkIChPQkpfQU9VVCkpCi1zdGF0aWMgdm9pZCBtZXJnZV9kYXRhX2ludG9fdGV4dCBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLSNpZiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICYmICEgZGVmaW5lZCAoQkZEKQotc3RhdGljIHZvaWQgY3Z0X2ZyYWdfdG9fZmlsbCBQQVJBTVMgKChvYmplY3RfaGVhZGVycyAqLCBzZWdULCBmcmFnUyAqKSk7Ci1zdGF0aWMgdm9pZCByZW1vdmVfc3Vic2VncyBQQVJBTVMgKChmcmNoYWluUyAqLCBpbnQsIGZyYWdTICoqLCBmcmFnUyAqKikpOwotc3RhdGljIHZvaWQgcmVsYXhfYW5kX3NpemVfYWxsX3NlZ21lbnRzIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi0vKgotICoJCQlmaXhfbmV3KCkKLSAqCi0gKiBDcmVhdGUgYSBmaXhTIGluIG9ic3RhY2sgJ25vdGVzJy4KLSAqLwotc3RhdGljIGZpeFMgKgotZml4X25ld19pbnRlcm5hbCAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsIHN1Yl9zeW1ib2wsIG9mZnNldCwgcGNyZWwsCi0JCSAgcl90eXBlKQotICAgICBmcmFnUyAqZnJhZzsJCS8qIFdoaWNoIGZyYWc/ICovCi0gICAgIGludCB3aGVyZTsJCQkvKiBXaGVyZSBpbiB0aGF0IGZyYWc/ICovCi0gICAgIGludCBzaXplOwkJCS8qIDEsIDIsIG9yIDQgdXN1YWxseS4gKi8KLSAgICAgc3ltYm9sUyAqYWRkX3N5bWJvbDsJLyogWF9hZGRfc3ltYm9sLiAqLwotICAgICBzeW1ib2xTICpzdWJfc3ltYm9sOwkvKiBYX29wX3N5bWJvbC4gKi8KLSAgICAgb2Zmc2V0VCBvZmZzZXQ7CQkvKiBYX2FkZF9udW1iZXIuICovCi0gICAgIGludCBwY3JlbDsJCQkvKiBUUlVFIGlmIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlOyAvKiBSZWxvY2F0aW9uIHR5cGUgKi8KLSNlbHNlCi0gICAgIGludCByX3R5cGU7CQkvKiBSZWxvY2F0aW9uIHR5cGUgKi8KLSNlbmRpZgotewotICBmaXhTICpmaXhQOwotCi0gIG5fZml4dXBzKys7Ci0KLSAgZml4UCA9IChmaXhTICopIG9ic3RhY2tfYWxsb2MgKCZub3Rlcywgc2l6ZW9mIChmaXhTKSk7Ci0KLSAgZml4UC0+ZnhfZnJhZyA9IGZyYWc7Ci0gIGZpeFAtPmZ4X3doZXJlID0gd2hlcmU7Ci0gIGZpeFAtPmZ4X3NpemUgPSBzaXplOwotICAvKiBXZSd2ZSBtYWRlIGZ4X3NpemUgYSBuYXJyb3cgZmllbGQ7IGNoZWNrIHRoYXQgaXQncyB3aWRlIGVub3VnaC4gICovCi0gIGlmIChmaXhQLT5meF9zaXplICE9IHNpemUpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJmaWVsZCBmeF9zaXplIHRvbyBzbWFsbCB0byBob2xkICVkIiksIHNpemUpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBmaXhQLT5meF9hZGRzeSA9IGFkZF9zeW1ib2w7Ci0gIGZpeFAtPmZ4X3N1YnN5ID0gc3ViX3N5bWJvbDsKLSAgZml4UC0+Znhfb2Zmc2V0ID0gb2Zmc2V0OwotICBmaXhQLT5meF9wY3JlbCA9IHBjcmVsOwotICBmaXhQLT5meF9wbHQgPSAwOwotI2lmIGRlZmluZWQoTkVFRF9GWF9SX1RZUEUpIHx8IGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gIGZpeFAtPmZ4X3JfdHlwZSA9IHJfdHlwZTsKLSNlbmRpZgotICBmaXhQLT5meF9pbV9kaXNwID0gMDsKLSAgZml4UC0+ZnhfcGNyZWxfYWRqdXN0ID0gMDsKLSAgZml4UC0+ZnhfYml0X2ZpeFAgPSAwOwotICBmaXhQLT5meF9hZGRudW1iZXIgPSAwOwotICBmaXhQLT5meF90Y2JpdCA9IDA7Ci0gIGZpeFAtPmZ4X2RvbmUgPSAwOwotICBmaXhQLT5meF9ub19vdmVyZmxvdyA9IDA7Ci0gIGZpeFAtPmZ4X3NpZ25lZCA9IDA7Ci0KLSNpZmRlZiBVU0lOR19DR0VOCi0gIGZpeFAtPmZ4X2NnZW4uaW5zbiA9IE5VTEw7Ci0gIGZpeFAtPmZ4X2NnZW4ub3BpbmZvID0gMDsKLSNlbmRpZgotCi0jaWZkZWYgVENfRklYX1RZUEUKLSAgVENfSU5JVF9GSVhfREFUQShmaXhQKTsKLSNlbmRpZgotCi0gIGFzX3doZXJlICgmZml4UC0+ZnhfZmlsZSwgJmZpeFAtPmZ4X2xpbmUpOwotCi0gIC8qIFVzdWFsbHksIHdlIHdhbnQgcmVsb2NzIHNvcnRlZCBudW1lcmljYWxseSwgYnV0IHdoaWxlCi0gICAgIGNvbXBhcmluZyB0byBvbGRlciB2ZXJzaW9ucyBvZiBnYXMgdGhhdCBoYXZlIHJlbG9jcwotICAgICByZXZlcnNlIHNvcnRlZCwgaXQgaXMgY29udmVuaWVudCB0byBoYXZlIHRoaXMgY29tcGlsZQotICAgICB0aW1lIG9wdGlvbi4gIHhveG9yaWNoLiAqLwotCi0gIHsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICBmaXhTICoqc2VnX2ZpeF9yb290UCA9IChmcmFnc19jaGFpbmVkCi0JCQkgICAgPyAmc2VnX2luZm8gKG5vd19zZWcpLT5maXhfcm9vdAotCQkJICAgIDogJmZyY2hhaW5fbm93LT5maXhfcm9vdCk7Ci0gICAgZml4UyAqKnNlZ19maXhfdGFpbFAgPSAoZnJhZ3NfY2hhaW5lZAotCQkJICAgID8gJnNlZ19pbmZvIChub3dfc2VnKS0+Zml4X3RhaWwKLQkJCSAgICA6ICZmcmNoYWluX25vdy0+Zml4X3RhaWwpOwotI2VuZGlmCi0KLSNpZmRlZiBSRVZFUlNFX1NPUlRfUkVMT0NTCi0KLSAgICBmaXhQLT5meF9uZXh0ID0gKnNlZ19maXhfcm9vdFA7Ci0gICAgKnNlZ19maXhfcm9vdFAgPSBmaXhQOwotCi0jZWxzZSAvKiBSRVZFUlNFX1NPUlRfUkVMT0NTICovCi0KLSAgICBmaXhQLT5meF9uZXh0ID0gTlVMTDsKLQotICAgIGlmICgqc2VnX2ZpeF90YWlsUCkKLSAgICAgICgqc2VnX2ZpeF90YWlsUCktPmZ4X25leHQgPSBmaXhQOwotICAgIGVsc2UKLSAgICAgICpzZWdfZml4X3Jvb3RQID0gZml4UDsKLSAgICAqc2VnX2ZpeF90YWlsUCA9IGZpeFA7Ci0KLSNlbmRpZiAvKiBSRVZFUlNFX1NPUlRfUkVMT0NTICovCi0KLSAgfQotCi0gIHJldHVybiBmaXhQOwotfQotCi0vKiBDcmVhdGUgYSBmaXh1cCByZWxhdGl2ZSB0byBhIHN5bWJvbCAocGx1cyBhIGNvbnN0YW50KS4gICovCi0KLWZpeFMgKgotZml4X25ldyAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsIG9mZnNldCwgcGNyZWwsIHJfdHlwZSkKLSAgICAgZnJhZ1MgKmZyYWc7CQkvKiBXaGljaCBmcmFnPyAqLwotICAgICBpbnQgd2hlcmU7CQkJLyogV2hlcmUgaW4gdGhhdCBmcmFnPyAqLwotICAgICBpbnQgc2l6ZTsJCQkvKiAxLCAyLCBvciA0IHVzdWFsbHkuICovCi0gICAgIHN5bWJvbFMgKmFkZF9zeW1ib2w7CS8qIFhfYWRkX3N5bWJvbC4gKi8KLSAgICAgb2Zmc2V0VCBvZmZzZXQ7CQkvKiBYX2FkZF9udW1iZXIuICovCi0gICAgIGludCBwY3JlbDsJCQkvKiBUUlVFIGlmIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlOyAvKiBSZWxvY2F0aW9uIHR5cGUgKi8KLSNlbHNlCi0gICAgIGludCByX3R5cGU7CQkvKiBSZWxvY2F0aW9uIHR5cGUgKi8KLSNlbmRpZgotewotICByZXR1cm4gZml4X25ld19pbnRlcm5hbCAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsCi0JCQkgICAoc3ltYm9sUyAqKSBOVUxMLCBvZmZzZXQsIHBjcmVsLCByX3R5cGUpOwotfQotCi0vKiBDcmVhdGUgYSBmaXh1cCBmb3IgYW4gZXhwcmVzc2lvbi4gIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgZml4dXBzCi0gICBmb3IgZGlmZmVyZW5jZSBleHByZXNzaW9ucy4gIFRoYXQgaXMgaXRzZWxmIG1vcmUgdGhhbiBtb3N0IG9iamVjdAotICAgZmlsZSBmb3JtYXRzIHN1cHBvcnQgYW55aG93LiAgKi8KLQotZml4UyAqCi1maXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNyZWwsIHJfdHlwZSkKLSAgICAgZnJhZ1MgKmZyYWc7CQkvKiBXaGljaCBmcmFnPyAqLwotICAgICBpbnQgd2hlcmU7CQkJLyogV2hlcmUgaW4gdGhhdCBmcmFnPyAqLwotICAgICBpbnQgc2l6ZTsJCQkvKiAxLCAyLCBvciA0IHVzdWFsbHkuICovCi0gICAgIGV4cHJlc3Npb25TICpleHA7CQkvKiBFeHByZXNzaW9uLiAgKi8KLSAgICAgaW50IHBjcmVsOwkJCS8qIFRSVUUgaWYgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGU7IC8qIFJlbG9jYXRpb24gdHlwZSAqLwotI2Vsc2UKLSAgICAgaW50IHJfdHlwZTsJCS8qIFJlbG9jYXRpb24gdHlwZSAqLwotI2VuZGlmCi17Ci0gIHN5bWJvbFMgKmFkZCA9IE5VTEw7Ci0gIHN5bWJvbFMgKnN1YiA9IE5VTEw7Ci0gIG9mZnNldFQgb2ZmID0gMDsKLQotICBzd2l0Y2ggKGV4cC0+WF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2Fic2VudDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX2FkZDoKLSAgICAgIC8qIFRoaXMgY29tZXMgdXAgd2hlbiBfR0xPQkFMX09GRlNFVF9UQUJMRV8rKC4tTDApIGlzIHJlYWQsIGlmCi0JIHRoZSBkaWZmZXJlbmNlIGV4cHJlc3Npb24gY2Fubm90IGltbWVkaWF0ZWx5IGJlIHJlZHVjZWQuICAqLwotICAgICAgewotCXN5bWJvbFMgKnN0bXAgPSBtYWtlX2V4cHJfc3ltYm9sIChleHApOwotCWV4cC0+WF9vcCA9IE9fc3ltYm9sOwotCWV4cC0+WF9vcF9zeW1ib2wgPSAwOwotCWV4cC0+WF9hZGRfc3ltYm9sID0gc3RtcDsKLQlleHAtPlhfYWRkX251bWJlciA9IDA7Ci0JcmV0dXJuIGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCBwY3JlbCwgcl90eXBlKTsKLSAgICAgIH0KLQotICAgIGNhc2UgT19zeW1ib2xfcnZhOgotICAgICAgYWRkID0gZXhwLT5YX2FkZF9zeW1ib2w7Ci0gICAgICBvZmYgPSBleHAtPlhfYWRkX251bWJlcjsKLQotI2lmIGRlZmluZWQoQkZEX0FTU0VNQkxFUikKLSAgICAgIHJfdHlwZSA9IEJGRF9SRUxPQ19SVkE7Ci0jZWxzZQotI2lmIGRlZmluZWQoVENfUlZBX1JFTE9DKQotICAgICAgcl90eXBlID0gVENfUlZBX1JFTE9DOwotI2Vsc2UKLSAgICAgIGFzX2ZhdGFsKF8oInJ2YSBub3Qgc3VwcG9ydGVkIikpOwotI2VuZGlmCi0jZW5kaWYKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX3VtaW51czoKLSAgICAgIHN1YiA9IGV4cC0+WF9hZGRfc3ltYm9sOwotICAgICAgb2ZmID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19zdWJ0cmFjdDoKLSAgICAgIHN1YiA9IGV4cC0+WF9vcF9zeW1ib2w7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICBhZGQgPSBleHAtPlhfYWRkX3N5bWJvbDsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICAqLwotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICAgIG9mZiA9IGV4cC0+WF9hZGRfbnVtYmVyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWRkID0gbWFrZV9leHByX3N5bWJvbCAoZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gZml4X25ld19pbnRlcm5hbCAoZnJhZywgd2hlcmUsIHNpemUsIGFkZCwgc3ViLCBvZmYsCi0JCQkgICBwY3JlbCwgcl90eXBlKTsKLX0KLQotLyogQXBwZW5kIGEgc3RyaW5nIG9udG8gYW5vdGhlciBzdHJpbmcsIGJ1bXBpbmcgdGhlIHBvaW50ZXIgYWxvbmcuICAqLwotdm9pZAotYXBwZW5kIChjaGFyUFAsIGZyb21QLCBsZW5ndGgpCi0gICAgIGNoYXIgKipjaGFyUFA7Ci0gICAgIGNoYXIgKmZyb21QOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLXsKLSAgLyogRG9uJ3QgdHJ1c3QgbWVtY3B5KCkgb2YgMCBjaGFycy4gKi8KLSAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHJldHVybjsKLQotICBtZW1jcHkgKCpjaGFyUFAsIGZyb21QLCBsZW5ndGgpOwotICAqY2hhclBQICs9IGxlbmd0aDsKLX0KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi1pbnQgc2VjdGlvbl9hbGlnbm1lbnRbU0VHX01BWElNVU1fT1JESU5BTF07Ci0jZW5kaWYKLQotLyoKLSAqIFRoaXMgcm91dGluZSByZWNvcmRzIHRoZSBsYXJnZXN0IGFsaWdubWVudCBzZWVuIGZvciBlYWNoIHNlZ21lbnQuCi0gKiBJZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWdtZW50IGlzIGFsaWduZWQgb24gdGhlIHdvcnN0LWNhc2UKLSAqIGJvdW5kYXJ5LCBhbGwgb2YgdGhlIG90aGVyIGFsaWdubWVudHMgd2l0aGluIGl0IHdpbGwgd29yay4gIEF0Ci0gKiBsZWFzdCBvbmUgb2JqZWN0IGZvcm1hdCByZWFsbHkgdXNlcyB0aGlzIGluZm8uCi0gKi8KLXZvaWQKLXJlY29yZF9hbGlnbm1lbnQgKHNlZywgYWxpZ24pCi0gICAgIC8qIFNlZ21lbnQgdG8gd2hpY2ggYWxpZ25tZW50IHBlcnRhaW5zICovCi0gICAgIHNlZ1Qgc2VnOwotICAgICAvKiBBbGlnbm1lbnQsIGFzIGEgcG93ZXIgb2YgMiAoZS5nLiwgMSA9PiAyLWJ5dGUgYm91bmRhcnksIDIgPT4gNC1ieXRlCi0JYm91bmRhcnksIGV0Yy4pICAqLwotICAgICBpbnQgYWxpZ247Ci17Ci0gIGlmIChzZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICByZXR1cm47Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoKHVuc2lnbmVkIGludCkgYWxpZ24gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZykpCi0gICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcsIGFsaWduKTsKLSNlbHNlCi0gIGlmIChhbGlnbiA+IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pCi0gICAgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSA9IGFsaWduOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLS8qIFJlc2V0IHRoZSBzZWN0aW9uIGluZGljZXMgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdhcyBjcmVhdGVkIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLXJlbnVtYmVyX3NlY3Rpb25zIChhYmZkLCBzZWMsIGNvdW50cGFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgY291bnRwYXJnOwotewotICBpbnQgKmNvdW50cCA9IChpbnQgKikgY291bnRwYXJnOwotCi0gIHNlYy0+aW5kZXggPSAqY291bnRwOwotICArKypjb3VudHA7Ci19Ci0KLSNlbmRpZiAvKiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAqLwotCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgISBkZWZpbmVkIChCRkQpCi0KLXN0YXRpYyBmcmFnUyAqCi1jaGFpbl9mcmNoYWluc190b2dldGhlcl8xIChzZWN0aW9uLCBmcmNocCkKLSAgICAgc2VnVCBzZWN0aW9uOwotICAgICBzdHJ1Y3QgZnJjaGFpbiAqZnJjaHA7Ci17Ci0gIGZyYWdTIGR1bW15LCAqcHJldl9mcmFnID0gJmR1bW15OwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZml4UyBmaXhfZHVtbXksICpwcmV2X2ZpeCA9ICZmaXhfZHVtbXk7Ci0jZW5kaWYKLQotICBmb3IgKDsgZnJjaHAgJiYgZnJjaHAtPmZyY2hfc2VnID09IHNlY3Rpb247IGZyY2hwID0gZnJjaHAtPmZyY2hfbmV4dCkKLSAgICB7Ci0gICAgICBwcmV2X2ZyYWctPmZyX25leHQgPSBmcmNocC0+ZnJjaF9yb290OwotICAgICAgcHJldl9mcmFnID0gZnJjaHAtPmZyY2hfbGFzdDsKLSAgICAgIGFzc2VydCAocHJldl9mcmFnLT5mcl90eXBlICE9IDApOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGlmIChmcmNocC0+Zml4X3Jvb3QgIT0gKGZpeFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoc2VnX2luZm8gKHNlY3Rpb24pLT5maXhfcm9vdCA9PSAoZml4UyAqKSBOVUxMKQotCSAgICBzZWdfaW5mbyAoc2VjdGlvbiktPmZpeF9yb290ID0gZnJjaHAtPmZpeF9yb290OwotCSAgcHJldl9maXgtPmZ4X25leHQgPSBmcmNocC0+Zml4X3Jvb3Q7Ci0JICBzZWdfaW5mbyAoc2VjdGlvbiktPmZpeF90YWlsID0gZnJjaHAtPmZpeF90YWlsOwotCSAgcHJldl9maXggPSBmcmNocC0+Zml4X3RhaWw7Ci0JfQotI2VuZGlmCi0gICAgfQotICBhc3NlcnQgKHByZXZfZnJhZy0+ZnJfdHlwZSAhPSAwKTsKLSAgcHJldl9mcmFnLT5mcl9uZXh0ID0gMDsKLSAgcmV0dXJuIHByZXZfZnJhZzsKLX0KLQotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLXN0YXRpYyB2b2lkCi1jaGFpbl9mcmNoYWluc190b2dldGhlciAoYWJmZCwgc2VjdGlvbiwgeHh4KQotICAgICBiZmQgKmFiZmQ7CQkJLyogdW51c2VkICovCi0gICAgIHNlZ1Qgc2VjdGlvbjsKLSAgICAgUFRSIHh4eDsJCQkvKiB1bnVzZWQgKi8KLXsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKmluZm87Ci0KLSAgLyogQkZEIG1heSBoYXZlIGludHJvZHVjZWQgaXRzIG93biBzZWN0aW9ucyB3aXRob3V0IHVzaW5nCi0gICAgIHN1YnNlZ19uZXcsIHNvIGl0IGlzIHBvc3NpYmxlIHRoYXQgc2VnX2luZm8gaXMgTlVMTC4gICovCi0gIGluZm8gPSBzZWdfaW5mbyAoc2VjdGlvbik7Ci0gIGlmIChpbmZvICE9IChzZWdtZW50X2luZm9fdHlwZSAqKSBOVUxMKQotICAgaW5mby0+ZnJjaGFpblAtPmZyY2hfbGFzdAotICAgICA9IGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEgKHNlY3Rpb24sIGluZm8tPmZyY2hhaW5QKTsKLQotICAvKiBOb3cgdGhhdCB3ZSd2ZSBjaGFpbmVkIHRoZSBmcmFncyB0b2dldGhlciwgd2UgbXVzdCBhZGQgbmV3IGZpeHVwcwotICAgICB0byB0aGUgc2VnbWVudCwgbm90IHRvIHRoZSBmcmFnIGNoYWluLiAgKi8KLSAgZnJhZ3NfY2hhaW5lZCA9IDE7Ci19Ci0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKEJGRCkgJiYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0KLXN0YXRpYyB2b2lkCi1yZW1vdmVfc3Vic2VncyAoaGVhZCwgc2VnLCByb290LCBsYXN0KQotICAgICBmcmNoYWluUyAqaGVhZDsKLSAgICAgaW50IHNlZzsKLSAgICAgZnJhZ1MgKipyb290OwotICAgICBmcmFnUyAqKmxhc3Q7Ci17Ci0gICpyb290ID0gaGVhZC0+ZnJjaF9yb290OwotICAqbGFzdCA9IGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEgKHNlZywgaGVhZCk7Ci19Ci0KLSNlbmRpZiAvKiBCRkQgKi8KLQotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICFkZWZpbmVkIChCRkQpCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdGF0aWMgdm9pZAotY3Z0X2ZyYWdfdG9fZmlsbCAoc2VjLCBmcmFnUCkKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGZyYWdTICpmcmFnUDsKLSNlbHNlCi1zdGF0aWMgdm9pZAotY3Z0X2ZyYWdfdG9fZmlsbCAoaGVhZGVyc1AsIHNlYywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzUDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGZyYWdTICpmcmFnUDsKLSNlbmRpZgotewotICBzd2l0Y2ggKGZyYWdQLT5mcl90eXBlKQotICAgIHsKLSAgICBjYXNlIHJzX2FsaWduOgotICAgIGNhc2UgcnNfYWxpZ25fY29kZToKLSAgICBjYXNlIHJzX29yZzoKLSAgICBjYXNlIHJzX3NwYWNlOgotI2lmZGVmIEhBTkRMRV9BTElHTgotICAgICAgSEFORExFX0FMSUdOIChmcmFnUCk7Ci0jZW5kaWYKLSAgICAgIGtub3cgKGZyYWdQLT5mcl9uZXh0ICE9IE5VTEwpOwotICAgICAgZnJhZ1AtPmZyX29mZnNldCA9IChmcmFnUC0+ZnJfbmV4dC0+ZnJfYWRkcmVzcwotCQkJICAtIGZyYWdQLT5mcl9hZGRyZXNzCi0JCQkgIC0gZnJhZ1AtPmZyX2ZpeCkgLyBmcmFnUC0+ZnJfdmFyOwotICAgICAgaWYgKGZyYWdQLT5mcl9vZmZzZXQgPCAwKQotCXsKLQkgIGFzX2JhZCAoXygiYXR0ZW1wdCB0byAub3JnLy5zcGFjZSBiYWNrd2FyZHM/ICglbGQpIiksCi0JCSAgKGxvbmcpIGZyYWdQLT5mcl9vZmZzZXQpOwotCX0KLSAgICAgIGZyYWdQLT5mcl90eXBlID0gcnNfZmlsbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSByc19maWxsOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHJzX2xlYjEyODoKLSAgICAgIHsKLQl2YWx1ZVQgdmFsdWUgPSBTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCk7Ci0JaW50IHNpemU7Ci0KLQlzaXplID0gb3V0cHV0X2xlYjEyOCAoZnJhZ1AtPmZyX2xpdGVyYWwgKyBmcmFnUC0+ZnJfZml4LCB2YWx1ZSwKLQkJCSAgICAgIGZyYWdQLT5mcl9zdWJ0eXBlKTsKLQotCWZyYWdQLT5mcl9maXggKz0gc2l6ZTsKLQlmcmFnUC0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0JZnJhZ1AtPmZyX3ZhciA9IDA7Ci0JZnJhZ1AtPmZyX29mZnNldCA9IDA7Ci0JZnJhZ1AtPmZyX3N5bWJvbCA9IE5VTEw7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcnNfY2ZhOgotICAgICAgZWhfZnJhbWVfY29udmVydF9mcmFnIChmcmFnUCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgbWRfY29udmVydF9mcmFnIChzdGRvdXRwdXQsIHNlYywgZnJhZ1ApOwotI2Vsc2UKLSAgICAgIG1kX2NvbnZlcnRfZnJhZyAoaGVhZGVyc1AsIHNlYywgZnJhZ1ApOwotI2VuZGlmCi0KLSAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX25leHQgPT0gTlVMTAotCSAgICAgIHx8ICgob2Zmc2V0VCkgKGZyYWdQLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZ1AtPmZyX2FkZHJlc3MpCi0JCSAgPT0gZnJhZ1AtPmZyX2ZpeCkpOwotCi0gICAgICAvKgotICAgICAgICogQWZ0ZXIgbWRfY29udmVydF9mcmFnLCB3ZSBtYWtlIHRoZSBmcmFnIGludG8gYSAiLnNwYWNlIDAiLgotICAgICAgICogTWRfY29udmVydF9mcmFnKCkgc2hvdWxkIHNldCB1cCBhbnkgZml4U3MgYW5kIGNvbnN0YW50cwotICAgICAgICogcmVxdWlyZWQuCi0gICAgICAgKi8KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ1ApOwotICAgICAgYnJlYWs7Ci0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotICAgIGNhc2UgcnNfYnJva2VuX3dvcmQ6Ci0gICAgICB7Ci0Jc3RydWN0IGJyb2tlbl93b3JkICpsaWU7Ci0KLQlpZiAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gbWRfc2hvcnRfanVtcF9zaXplOwotCSAgICBmb3IgKGxpZSA9IChzdHJ1Y3QgYnJva2VuX3dvcmQgKikgKGZyYWdQLT5mcl9zeW1ib2wpOwotCQkgbGllICYmIGxpZS0+ZGlzcGZyYWcgPT0gZnJhZ1A7Ci0JCSBsaWUgPSBsaWUtPm5leHRfYnJva2VuX3dvcmQpCi0JICAgICAgaWYgKGxpZS0+YWRkZWQgPT0gMSkKLQkJZnJhZ1AtPmZyX2ZpeCArPSBtZF9sb25nX2p1bXBfc2l6ZTsKLQkgIH0KLQlmcmFnX3dhbmUgKGZyYWdQKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgQkFEX0NBU0UgKGZyYWdQLT5mcl90eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2VuZGlmIC8qIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICFkZWZpbmVkIChCRkQpICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdGF0aWMgdm9pZAotcmVsYXhfYW5kX3NpemVfc2VnIChhYmZkLCBzZWMsIHh4eCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgeHh4OwotewotICBmbGFnd29yZCBmbGFnczsKLSAgZnJhZ1MgKmZyYWdwOwotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbzsKLSAgaW50IHg7Ci0gIHZhbHVlVCBzaXplLCBuZXdzaXplOwotCi0gIHN1YnNlZ19jaGFuZ2UgKHNlYywgMCk7Ci0KLSAgZmxhZ3MgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYyk7Ci0KLSAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBpZiAoc2VnaW5mbyAmJiBzZWdpbmZvLT5mcmNoYWluUCkKLSAgICB7Ci0gICAgICByZWxheF9zZWdtZW50IChzZWdpbmZvLT5mcmNoYWluUC0+ZnJjaF9yb290LCBzZWMpOwotICAgICAgZm9yIChmcmFncCA9IHNlZ2luZm8tPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7IGZyYWdwOyBmcmFncCA9IGZyYWdwLT5mcl9uZXh0KQotCWN2dF9mcmFnX3RvX2ZpbGwgKHNlYywgZnJhZ3ApOwotICAgICAgZm9yIChmcmFncCA9IHNlZ2luZm8tPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0JICAgZnJhZ3AtPmZyX25leHQ7Ci0JICAgZnJhZ3AgPSBmcmFncC0+ZnJfbmV4dCkKLQkvKiB3YWxrIHRvIGxhc3QgZWx0ICovOwotICAgICAgc2l6ZSA9IGZyYWdwLT5mcl9hZGRyZXNzICsgZnJhZ3AtPmZyX2ZpeDsKLSAgICB9Ci0gIGVsc2UKLSAgICBzaXplID0gMDsKLQotICBpZiAoc2l6ZSA+IDAgJiYgISBzZWdpbmZvLT5ic3MpCi0gICAgZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQotICAvKiBAQCBUaGlzIGlzIGp1c3QgYW4gYXBwcm94aW1hdGlvbi4gICovCi0gIGlmIChzZWdpbmZvICYmIHNlZ2luZm8tPmZpeF9yb290KQotICAgIGZsYWdzIHw9IFNFQ19SRUxPQzsKLSAgZWxzZQotICAgIGZsYWdzICY9IH5TRUNfUkVMT0M7Ci0gIHggPSBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywgZmxhZ3MpOwotICBhc3NlcnQgKHggPT0gdHJ1ZSk7Ci0KLSAgbmV3c2l6ZSA9IG1kX3NlY3Rpb25fYWxpZ24gKHNlYywgc2l6ZSk7Ci0gIHggPSBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjLCBuZXdzaXplKTsKLSAgYXNzZXJ0ICh4ID09IHRydWUpOwotCi0gIC8qIElmIHRoZSBzaXplIGhhZCB0byBiZSByb3VuZGVkIHVwLCBhZGQgc29tZSBwYWRkaW5nIGluIHRoZSBsYXN0Ci0gICAgIG5vbi1lbXB0eSBmcmFnLiAgKi8KLSAgYXNzZXJ0IChuZXdzaXplID49IHNpemUpOwotICBpZiAoc2l6ZSAhPSBuZXdzaXplKQotICAgIHsKLSAgICAgIGZyYWdTICpsYXN0ID0gc2VnaW5mby0+ZnJjaGFpblAtPmZyY2hfbGFzdDsKLSAgICAgIGZyYWdwID0gc2VnaW5mby0+ZnJjaGFpblAtPmZyY2hfcm9vdDsKLSAgICAgIHdoaWxlIChmcmFncC0+ZnJfbmV4dCAhPSBsYXN0KQotCWZyYWdwID0gZnJhZ3AtPmZyX25leHQ7Ci0gICAgICBsYXN0LT5mcl9hZGRyZXNzID0gc2l6ZTsKLSAgICAgIGZyYWdwLT5mcl9vZmZzZXQgKz0gbmV3c2l6ZSAtIHNpemU7Ci0gICAgfQotCi0jaWZkZWYgdGNfZnJvYl9zZWN0aW9uCi0gIHRjX2Zyb2Jfc2VjdGlvbiAoc2VjKTsKLSNlbmRpZgotI2lmZGVmIG9ial9mcm9iX3NlY3Rpb24KLSAgb2JqX2Zyb2Jfc2VjdGlvbiAoc2VjKTsKLSNlbmRpZgotfQotCi0jaWZkZWYgREVCVUcyCi1zdGF0aWMgdm9pZAotZHVtcF9zZWN0aW9uX3JlbG9jcyAoYWJmZCwgc2VjLCBzdHJlYW1fKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNoYXIgKnN0cmVhbV87Ci17Ci0gIEZJTEUgKnN0cmVhbSA9IChGSUxFICopIHN0cmVhbV87Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGZpeFMgKmZpeHAgPSBzZWdpbmZvLT5maXhfcm9vdDsKLQotICBpZiAoIWZpeHApCi0gICAgcmV0dXJuOwotCi0gIGZwcmludGYgKHN0cmVhbSwgInNlYyAlcyByZWxvY3M6XG4iLCBzZWMtPm5hbWUpOwotICB3aGlsZSAoZml4cCkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzID0gZml4cC0+ZnhfYWRkc3k7Ci0gICAgICBpZiAocykKLQl7Ci0JICBmcHJpbnRmIChzdHJlYW0sICIgICUwOHg6ICVzKCVzIiwgZml4cCwgU19HRVRfTkFNRSAocyksCi0JCSAgIHMtPmJzeW0tPnNlY3Rpb24tPm5hbWUpOwotCSAgaWYgKHMtPmJzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RyZWFtLCAiIHNlY3Rpb24gc3ltIik7Ci0JICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzKSkKLQkJZnByaW50ZiAoc3RyZWFtLCAiKyV4IiwgU19HRVRfVkFMVUUgKHMpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBmcHJpbnRmIChzdHJlYW0sICIrJXgiLCBTX0dFVF9WQUxVRSAocykpOwotCSAgZnByaW50ZiAoc3RyZWFtLCAiKSsleFxuIiwgZml4cC0+Znhfb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoc3RyZWFtLCAiICAlMDh4OiB0eXBlICVkIG5vIHN5bVxuIiwgZml4cCwgZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIGZpeHAgPSBmaXhwLT5meF9uZXh0OwotICAgIH0KLX0KLSNlbHNlCi0jZGVmaW5lIGR1bXBfc2VjdGlvbl9yZWxvY3MoQUJGRCxTRUMsU1RSRUFNKQkoKHZvaWQpIDApCi0jZW5kaWYKLQotI2lmbmRlZiBFTUlUX1NFQ1RJT05fU1lNQk9MUwotI2RlZmluZSBFTUlUX1NFQ1RJT05fU1lNQk9MUyAxCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLWFkanVzdF9yZWxvY19zeW1zIChhYmZkLCBzZWMsIHh4eCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgeHh4OwotewotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBmaXhTICpmaXhwOwotCi0gIGlmIChzZWdpbmZvID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGR1bXBfc2VjdGlvbl9yZWxvY3MgKGFiZmQsIHNlYywgc3RkZXJyKTsKLQotICBmb3IgKGZpeHAgPSBzZWdpbmZvLT5maXhfcm9vdDsgZml4cDsgZml4cCA9IGZpeHAtPmZ4X25leHQpCi0gICAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0gICAgICAvKiBpZ25vcmUgaXQgKi87Ci0gICAgZWxzZSBpZiAoZml4cC0+ZnhfYWRkc3kpCi0gICAgICB7Ci0Jc3ltYm9sUyAqc3ltOwotCWFzZWN0aW9uICpzeW1zZWM7Ci0KLSNpZmRlZiBERUJVRzUKLQlmcHJpbnRmIChzdGRlcnIsICJcblxuYWRqdXN0aW5nIGZpeHVwOlxuIik7Ci0JcHJpbnRfZml4dXAgKGZpeHApOwotI2VuZGlmCi0KLQlzeW0gPSBmaXhwLT5meF9hZGRzeTsKLQotCS8qIEFsbCBzeW1ib2xzIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZXNvbHZlZCBhdCB0aGlzCi0JICAgcG9pbnQuICBJdCBpcyBwb3NzaWJsZSB0byBzZWUgdW5yZXNvbHZlZCBleHByZXNzaW9uCi0JICAgc3ltYm9scywgdGhvdWdoLCBzaW5jZSB0aGV5IGFyZSBub3QgaW4gdGhlIHJlZ3VsYXIgc3ltYm9sCi0JICAgdGFibGUuICAqLwotCWlmIChzeW0gIT0gTlVMTCAmJiAhIHN5bS0+c3lfcmVzb2x2ZWQpCi0JICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltLCAxKTsKLQkKLQlpZiAoZml4cC0+Znhfc3Vic3kgIT0gTlVMTCAmJiAhIGZpeHAtPmZ4X3N1YnN5LT5zeV9yZXNvbHZlZCkKLQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChmaXhwLT5meF9zdWJzeSwgMSk7Ci0KLQkvKiBJZiB0aGlzIHN5bWJvbCBpcyBlcXVhdGVkIHRvIGFuIHVuZGVmaW5lZCBzeW1ib2wsIGNvbnZlcnQKLSAgICAgICAgICAgdGhlIGZpeHVwIHRvIGJlaW5nIGFnYWluc3QgdGhhdCBzeW1ib2wuICAqLwotCWlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wKLQkgICAgJiYgKCEgU19JU19ERUZJTkVEIChzeW0pIHx8IFNfSVNfQ09NTU9OIChzeW0pKSkKLQkgIHsKLQkgICAgZml4cC0+Znhfb2Zmc2V0ICs9IHN5bS0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyOwotCSAgICBzeW0gPSBzeW0tPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbDsKLQkgICAgZml4cC0+ZnhfYWRkc3kgPSBzeW07Ci0JICB9Ci0KLQlpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5zeV9tcmlfY29tbW9uKQotCSAgewotCSAgICAvKiBUaGVzZSBzeW1ib2xzIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBpbiBmaXh1cF9zZWdtZW50LiAgKi8KLQkgICAgZ290byBkb25lOwotCSAgfQotCi0Jc3ltc2VjID0gU19HRVRfU0VHTUVOVCAoc3ltKTsKLQotCWlmIChzeW1zZWMgPT0gTlVMTCkKLQkgIGFib3J0ICgpOwotCQotCWlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bXNlYykpCi0JICB7Ci0JICAgIC8qIFRoZSBmaXh1cF9zZWdtZW50IHJvdXRpbmUgd2lsbCBub3QgdXNlIHRoaXMgc3ltYm9sIGluIGEKLSAgICAgICAgICAgICAgIHJlbG9jYXRpb24gdW5sZXNzIFRDX0ZPUkNFX1JFTE9DQVRJT04gcmV0dXJucyAxLiAgKi8KLQkgICAgaWYgKFRDX0ZPUkNFX1JFTE9DQVRJT04gKGZpeHApKQotCSAgICAgIHsKLQkJZml4cC0+ZnhfYWRkc3ktPnN5X3VzZWRfaW5fcmVsb2MgPSAxOwotI2lmZGVmIFVOREVGSU5FRF9ESUZGRVJFTkNFX09LCi0JCWlmIChmaXhwLT5meF9zdWJzeSAhPSBOVUxMKQotCQkgIGZpeHAtPmZ4X3N1YnN5LT5zeV91c2VkX2luX3JlbG9jID0gMTsKLSNlbmRpZgotCSAgICAgIH0KLQkgICAgZ290byBkb25lOwotCSAgfQotCi0JLyogSWYgaXQncyBvbmUgb2YgdGhlc2Ugc2VjdGlvbnMsIGFzc3VtZSB0aGUgc3ltYm9sIGlzCi0JICAgZGVmaW5pdGVseSBnb2luZyB0byBiZSBvdXRwdXQuICBUaGUgY29kZSBpbgotCSAgIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IGluIHRjLW1pcHMuYyB1c2VzIHRoaXMgdGVzdAotCSAgIGFzIHdlbGwsIHNvIGlmIHlvdSBjaGFuZ2UgdGhpcyBjb2RlIHlvdSBzaG91bGQgbG9vayBhdCB0aGF0Ci0JICAgY29kZS4gICovCi0JaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltc2VjKQotCSAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bXNlYykpCi0JICB7Ci0JICAgIGZpeHAtPmZ4X2FkZHN5LT5zeV91c2VkX2luX3JlbG9jID0gMTsKLSNpZmRlZiBVTkRFRklORURfRElGRkVSRU5DRV9PSwotCSAgICAvKiBXZSBoYXZlIHRoZSBkaWZmZXJlbmNlIG9mIGFuIHVuZGVmaW5lZCBzeW1ib2wgYW5kIHNvbWUKLQkgICAgICAgb3RoZXIgc3ltYm9sLiAgTWFrZSBzdXJlIHRvIG1hcmsgdGhlIG90aGVyIHN5bWJvbCBhcyB1c2VkCi0JICAgICAgIGluIGEgcmVsb2NhdGlvbiBzbyB0aGF0IGl0IHdpbGwgYWx3YXlzIGJlIG91dHB1dC4gICovCi0JICAgIGlmIChmaXhwLT5meF9zdWJzeSkKLQkgICAgICBmaXhwLT5meF9zdWJzeS0+c3lfdXNlZF9pbl9yZWxvYyA9IDE7Ci0jZW5kaWYKLQkgICAgZ290byBkb25lOwotCSAgfQotCi0JLyogRG9uJ3QgdHJ5IHRvIHJlZHVjZSByZWxvY3Mgd2hpY2ggcmVmZXIgdG8gLmxpbmtvbmNlCi0gICAgICAgICAgIHNlY3Rpb25zLiAgSXQgY2FuIGxlYWQgdG8gY29uZnVzaW9uIHdoZW4gYSBkZWJ1Z2dpbmcKLSAgICAgICAgICAgc2VjdGlvbiByZWZlcnMgdG8gYSAubGlua29uY2Ugc2VjdGlvbi4gIEkgaG9wZSB0aGlzIHdpbGwKLSAgICAgICAgICAgYWx3YXlzIGJlIGNvcnJlY3QuICAqLwotCWlmIChzeW1zZWMgIT0gc2VjKQotCSAgewotCSAgICBib29sZWFuIGxpbmtvbmNlOwotCi0JICAgIGxpbmtvbmNlID0gZmFsc2U7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzeW1zZWMpICYgU0VDX0xJTktfT05DRSkKLQkJIT0gMCkKLQkgICAgICBsaW5rb25jZSA9IHRydWU7Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0JICAgIC8qIFRoZSBHTlUgdG9vbGNoYWluIHVzZXMgYW4gZXh0ZW5zaW9uIGZvciBFTEY6IGEgc2VjdGlvbgotICAgICAgICAgICAgICAgYmVnaW5uaW5nIHdpdGggdGhlIG1hZ2ljIHN0cmluZyAuZ251LmxpbmtvbmNlIGlzIGEKLSAgICAgICAgICAgICAgIGxpbmtvbmNlIHNlY3Rpb24uICAqLwotCSAgICBpZiAoc3RybmNtcCAoc2VnbWVudF9uYW1lIChzeW1zZWMpLCAiLmdudS5saW5rb25jZSIsCi0JCQkgc2l6ZW9mICIuZ251LmxpbmtvbmNlIiAtIDEpID09IDApCi0JICAgICAgbGlua29uY2UgPSB0cnVlOwotI2VuZGlmCi0KLQkgICAgaWYgKGxpbmtvbmNlKQotCSAgICAgIHsKLQkJZml4cC0+ZnhfYWRkc3ktPnN5X3VzZWRfaW5fcmVsb2MgPSAxOwotI2lmZGVmIFVOREVGSU5FRF9ESUZGRVJFTkNFX09LCi0JCWlmIChmaXhwLT5meF9zdWJzeSAhPSBOVUxMKQotCQkgIGZpeHAtPmZ4X3N1YnN5LT5zeV91c2VkX2luX3JlbG9jID0gMTsKLSNlbmRpZgotCQlnb3RvIGRvbmU7Ci0JICAgICAgfQotCSAgfQotCi0JLyogU2luY2Ugd2UncmUgcmVkdWNpbmcgdG8gc2VjdGlvbiBzeW1ib2xzLCBkb24ndCBhdHRlbXB0IHRvIHJlZHVjZQotCSAgIGFueXRoaW5nIHRoYXQncyBhbHJlYWR5IHVzaW5nIG9uZS4gICovCi0JaWYgKHN5bS0+YnN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0JICB7Ci0JICAgIGZpeHAtPmZ4X2FkZHN5LT5zeV91c2VkX2luX3JlbG9jID0gMTsKLQkgICAgZ290byBkb25lOwotCSAgfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCS8qIFdlIGNhbiBuZXZlciBhZGp1c3QgYSByZWxvYyBhZ2FpbnN0IGEgd2VhayBzeW1ib2wuICBJZiB3ZQotICAgICAgICAgICBkaWQsIGFuZCB0aGUgd2VhayBzeW1ib2wgd2FzIG92ZXJyaWRkZW4gYnkgYSByZWFsIHN5bWJvbAotICAgICAgICAgICBzb21ld2hlcmUgZWxzZSwgdGhlbiBvdXIgcmVsb2NhdGlvbiB3b3VsZCBiZSBwb2ludGluZyBhdAotICAgICAgICAgICB0aGUgd3JvbmcgYXJlYSBvZiBtZW1vcnkuICAqLwotCWlmIChTX0lTX1dFQUsgKHN5bSkpCi0JICB7Ci0JICAgIGZpeHAtPmZ4X2FkZHN5LT5zeV91c2VkX2luX3JlbG9jID0gMTsKLQkgICAgZ290byBkb25lOwotCSAgfQotI2VuZGlmCi0KLQkvKiBJcyB0aGVyZSBzb21lIG90aGVyIHJlYXNvbiB3ZSBjYW4ndCBhZGp1c3QgdGhpcyBvbmU/ICAoRS5nLiwKLQkgICBjYWxsL2JhbCBsaW5rcyBpbiBpOTYwLWJvdXQgc3ltYm9scy4pICAqLwotI2lmZGVmIG9ial9maXhfYWRqdXN0YWJsZQotCWlmICghIG9ial9maXhfYWRqdXN0YWJsZSAoZml4cCkpCi0JICB7Ci0JICAgIGZpeHAtPmZ4X2FkZHN5LT5zeV91c2VkX2luX3JlbG9jID0gMTsKLQkgICAgZ290byBkb25lOwotCSAgfQotI2VuZGlmCi0KLQkvKiBJcyB0aGVyZSBzb21lIG90aGVyICh0YXJnZXQgY3B1IGRlcGVuZGVudCkgcmVhc29uIHdlIGNhbid0IGFkanVzdAotCSAgIHRoaXMgb25lPyAgKEUuZy4gcmVsb2NhdGlvbnMgaW52b2x2aW5nIGZ1bmN0aW9uIGFkZHJlc3NlcyBvbgotCSAgIHRoZSBQQS4gICovCi0jaWZkZWYgdGNfZml4X2FkanVzdGFibGUKLQlpZiAoISB0Y19maXhfYWRqdXN0YWJsZSAoZml4cCkpCi0JICB7Ci0JICAgIGZpeHAtPmZ4X2FkZHN5LT5zeV91c2VkX2luX3JlbG9jID0gMTsKLQkgICAgZ290byBkb25lOwotCSAgfQotI2VuZGlmCi0KLQkvKiBJZiB0aGUgc2VjdGlvbiBzeW1ib2wgaXNuJ3QgZ29pbmcgdG8gYmUgb3V0cHV0LCB0aGUgcmVsb2NzCi0JICAgYXQgbGVhc3Qgc2hvdWxkIHN0aWxsIHdvcmsuICBJZiBub3QsIGZpZ3VyZSBvdXQgd2hhdCB0byBkbwotCSAgIHdoZW4gd2UgcnVuIGludG8gdGhhdCBjYXNlLgotCi0JICAgV2UgcmVmZXRjaCB0aGUgc2VnbWVudCB3aGVuIGNhbGxpbmcgc2VjdGlvbl9zeW1ib2wsIHJhdGhlcgotCSAgIHRoYW4gdXNpbmcgc3ltc2VjLCBiZWNhdXNlIFNfR0VUX1ZBTFVFIG1heSB3aW5kIHVwIGNoYW5naW5nCi0JICAgdGhlIHNlY3Rpb24gd2hlbiBpdCBjYWxscyByZXNvbHZlX3N5bWJvbF92YWx1ZS4gKi8KLQlmaXhwLT5meF9vZmZzZXQgKz0gU19HRVRfVkFMVUUgKHN5bSk7Ci0JZml4cC0+ZnhfYWRkc3kgPSBzZWN0aW9uX3N5bWJvbCAoU19HRVRfU0VHTUVOVCAoc3ltKSk7Ci0JZml4cC0+ZnhfYWRkc3ktPnN5X3VzZWRfaW5fcmVsb2MgPSAxOwotCi0gICAgICBkb25lOgotCTsKLSAgICAgIH0KLSNpZiAxLypkZWYgUkVMT0NfUkVRVUlSRVNfU1lNQk9MKi8KLSAgICBlbHNlCi0gICAgICB7Ci0JLyogVGhlcmUgd2FzIG5vIHN5bWJvbCByZXF1aXJlZCBieSB0aGlzIHJlbG9jYXRpb24uICBIb3dldmVyLAotCSAgIEJGRCBkb2Vzbid0IHJlYWxseSBoYW5kbGUgcmVsb2NhdGlvbnMgd2l0aG91dCBzeW1ib2xzIHdlbGwuCi0JICAgKEF0IGxlYXN0LCB0aGUgQ09GRiBzdXBwb3J0IGRvZXNuJ3QuKSAgU28gZm9yIG5vdyB3ZSBmYWtlIHVwCi0JICAgYSBsb2NhbCBzeW1ib2wgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24uICAqLwotCi0JZml4cC0+ZnhfYWRkc3kgPSBzZWN0aW9uX3N5bWJvbCAoYWJzb2x1dGVfc2VjdGlvbik7Ci0vKglmaXhwLT5meF9hZGRzeS0+c3lfdXNlZF9pbl9yZWxvYyA9IDE7ICovCi0gICAgICB9Ci0jZW5kaWYKLQotICBkdW1wX3NlY3Rpb25fcmVsb2NzIChhYmZkLCBzZWMsIHN0ZGVycik7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9yZWxvY3MgKGFiZmQsIHNlYywgeHh4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiB4eHg7Ci17Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGludCBpOwotICB1bnNpZ25lZCBpbnQgbjsKLSAgYXJlbGVudCAqKnJlbG9jczsKLSAgZml4UyAqZml4cDsKLSAgY2hhciAqZXJyOwotCi0gIC8qIElmIHNlZ2luZm8gaXMgTlVMTCwgd2UgZGlkIG5vdCBjcmVhdGUgdGhpcyBzZWN0aW9uOyBkb24ndCBkbwotICAgICBhbnl0aGluZyB3aXRoIGl0LiAgKi8KLSAgaWYgKHNlZ2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZml4dXBfc2VnbWVudCAoc2VnaW5mby0+Zml4X3Jvb3QsIHNlYyk7Ci0KLSAgbiA9IDA7Ci0gIGZvciAoZml4cCA9IHNlZ2luZm8tPmZpeF9yb290OyBmaXhwOyBmaXhwID0gZml4cC0+ZnhfbmV4dCkKLSAgICBuKys7Ci0KLSNpZm5kZWYgUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFCi0gIC8qIFNldCB1cCByZWxvYyBpbmZvcm1hdGlvbiBhcyB3ZWxsLiAgKi8KLSAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKG4gKiBzaXplb2YgKGFyZWxlbnQgKikpOwotICBtZW1zZXQgKChjaGFyKilyZWxvY3MsIDAsIG4gKiBzaXplb2YgKGFyZWxlbnQqKSk7Ci0KLSAgaSA9IDA7Ci0gIGZvciAoZml4cCA9IHNlZ2luZm8tPmZpeF9yb290OyBmaXhwICE9IChmaXhTICopIE5VTEw7IGZpeHAgPSBmaXhwLT5meF9uZXh0KQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHM7Ci0gICAgICBzeW1ib2xTICpzeW07Ci0KLSAgICAgIGlmIChmaXhwLT5meF9kb25lKQotCXsKLQkgIG4tLTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sIHdoaWNoIHdhcyBlcXVhdGVkIHRvIGFub3RoZXIKLSAgICAgICAgIHN5bWJvbCwgdGhlbiB1c2UgZ2VuZXJhdGUgdGhlIHJlbG9jIGFnYWluc3QgdGhlIGxhdHRlciBzeW1ib2wKLSAgICAgICAgIHJhdGhlciB0aGFuIHRoZSBmb3JtZXIuICAqLwotICAgICAgc3ltID0gZml4cC0+ZnhfYWRkc3k7Ci0gICAgICB3aGlsZSAoc3ltLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JICAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpKQotCXsKLQkgIHN5bWJvbFMgKm47Ci0KLQkgIC8qIFdlIG11c3QgYXZvaWQgbG9vcGluZywgYXMgdGhhdCBjYW4gb2NjdXIgd2l0aCBhIGJhZGx5Ci0JICAgICB3cml0dGVuIHByb2dyYW0uICAqLwotCSAgbiA9IHN5bS0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sOwotCSAgaWYgKG4gPT0gc3ltKQotCSAgICBicmVhazsKLQkgIGZpeHAtPmZ4X29mZnNldCArPSBzeW0tPnN5X3ZhbHVlLlhfYWRkX251bWJlcjsKLQkgIHN5bSA9IG47Ci0JfQotICAgICAgZml4cC0+ZnhfYWRkc3kgPSBzeW07Ci0KLSAgICAgIHJlbG9jID0gdGNfZ2VuX3JlbG9jIChzZWMsIGZpeHApOwotICAgICAgaWYgKCFyZWxvYykKLQl7Ci0JICBuLS07Ci0JICBjb250aW51ZTsKLQl9Ci0KLSNpZiAwCi0gICAgICAvKiBUaGlzIHRlc3QgaXMgdHJpZ2dlcmVkIGluYXBwcm9wcmlhdGVseSBmb3IgdGhlIFNILiAgKi8KLSAgICAgIGlmIChmaXhwLT5meF93aGVyZSArIGZpeHAtPmZ4X3NpemUKLQkgID4gZml4cC0+ZnhfZnJhZy0+ZnJfZml4ICsgZml4cC0+ZnhfZnJhZy0+ZnJfb2Zmc2V0KQotCWFib3J0ICgpOwotI2VuZGlmCi0KLSAgICAgIHMgPSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIChzdGRvdXRwdXQsIHJlbG9jLAotCQkJCSAgZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJCQkgIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MsCi0JCQkJICBzZWMsICZlcnIpOwotICAgICAgc3dpdGNoIChzKQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLCBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwgXygicmVsb2NhdGlvbiBvdXQgb2YgcmFuZ2UiKSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYXNfZmF0YWwgKF8oIiVzOiV1OiBiYWQgcmV0dXJuIGZyb20gYmZkX2luc3RhbGxfcmVsb2NhdGlvbjogJXgiKSwKLQkJICAgIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsIHMpOwotCX0KLSAgICAgIHJlbG9jc1tpKytdID0gcmVsb2M7Ci0gICAgfQotI2Vsc2UKLSAgbiA9IG4gKiBNQVhfUkVMT0NfRVhQQU5TSU9OOwotICAvKiBTZXQgdXAgcmVsb2MgaW5mb3JtYXRpb24gYXMgd2VsbC4gICovCi0gIHJlbG9jcyA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChuICogc2l6ZW9mIChhcmVsZW50ICopKTsKLQotICBpID0gMDsKLSAgZm9yIChmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGZpeHAgIT0gKGZpeFMgKikgTlVMTDsgZml4cCA9IGZpeHAtPmZ4X25leHQpCi0gICAgewotICAgICAgYXJlbGVudCAqKnJlbG9jOwotICAgICAgY2hhciAqZGF0YTsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzOwotICAgICAgc3ltYm9sUyAqc3ltOwotICAgICAgaW50IGo7Ci0KLSAgICAgIGlmIChmaXhwLT5meF9kb25lKQotCXsKLQkgIG4tLTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sIHdoaWNoIHdhcyBlcXVhdGVkIHRvIGFub3RoZXIKLSAgICAgICAgIHN5bWJvbCwgdGhlbiB1c2UgZ2VuZXJhdGUgdGhlIHJlbG9jIGFnYWluc3QgdGhlIGxhdHRlciBzeW1ib2wKLSAgICAgICAgIHJhdGhlciB0aGFuIHRoZSBmb3JtZXIuICAqLwotICAgICAgc3ltID0gZml4cC0+ZnhfYWRkc3k7Ci0gICAgICB3aGlsZSAoc3ltLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JICAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpKQotCXN5bSA9IHN5bS0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sOwotICAgICAgZml4cC0+ZnhfYWRkc3kgPSBzeW07Ci0KLSAgICAgIHJlbG9jID0gdGNfZ2VuX3JlbG9jIChzZWMsIGZpeHApOwotCi0gICAgICBmb3IgKGogPSAwOyByZWxvY1tqXTsgaisrKQotCXsKLSAgICAgICAgICByZWxvY3NbaSsrXSA9IHJlbG9jW2pdOwotICAgICAgICAgIGFzc2VydChpIDw9IG4pOwotCX0KLSAgICAgIGRhdGEgPSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmU7Ci0gICAgICBpZiAoZml4cC0+Znhfd2hlcmUgKyBmaXhwLT5meF9zaXplCi0JICA+IGZpeHAtPmZ4X2ZyYWctPmZyX2ZpeCArIGZpeHAtPmZ4X2ZyYWctPmZyX29mZnNldCkKLQlhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oImludGVybmFsIGVycm9yOiBmaXh1cCBub3QgY29udGFpbmVkIHdpdGhpbiBmcmFnIikpOwotICAgICAgZm9yIChqID0gMDsgcmVsb2Nbal07IGorKykKLSAgICAgICAgewotCSAgcyA9IGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gKHN0ZG91dHB1dCwgcmVsb2Nbal0sCi0JCQkJICAgICAgZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJCQkgICAgICBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzLAotCQkJCSAgICAgIHNlYywgJmVycik7Ci0gICAgICAgICAgc3dpdGNoIChzKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX29rOgotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19mYXRhbCAoXygiJXM6JXU6IGJhZCByZXR1cm4gZnJvbSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIiksCi0JCQlmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKLQkgICAgfQotICAgICAgICB9Ci0gICAgfQotICBuID0gaTsKLSNlbmRpZgotCi0jaWZkZWYgREVCVUc0Ci0gIHsKLSAgICBpbnQgaSwgaiwgbnN5bXM7Ci0gICAgYXN5bWJvbCAqKnN5bXBwOwotICAgIHN5bXBwID0gYmZkX2dldF9vdXRzeW1ib2xzIChzdGRvdXRwdXQpOwotICAgIG5zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoc3Rkb3V0cHV0KTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotICAgICAgaWYgKCgoKnJlbG9jc1tpXS0+c3ltX3B0cl9wdHIpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLQl7Ci0JICBmb3IgKGogPSAwOyBqIDwgbnN5bXM7IGorKykKLQkgICAgaWYgKHN5bXBwW2pdID09ICpyZWxvY3NbaV0tPnN5bV9wdHJfcHRyKQotCSAgICAgIGJyZWFrOwotCSAgaWYgKGogPT0gbnN5bXMpCi0JICAgIGFib3J0ICgpOwotCX0KLSAgfQotI2VuZGlmCi0KLSAgaWYgKG4pCi0gICAgYmZkX3NldF9yZWxvYyAoc3Rkb3V0cHV0LCBzZWMsIHJlbG9jcywgbik7Ci0gIGVsc2UKLSAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywKLQkJCSAgIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykKLQkJCSAgICAmIChmbGFnd29yZCkgflNFQ19SRUxPQykpOwotCi0jaWZkZWYgREVCVUczCi0gIHsKLSAgICBpbnQgaTsKLSAgICBhcmVsZW50ICpyOwotICAgIGFzeW1ib2wgKnM7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAicmVsb2NzIGZvciBzZWMgJXNcbiIsIHNlYy0+bmFtZSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKLSAgICAgIHsKLQlyID0gcmVsb2NzW2ldOwotCXMgPSAqci0+c3ltX3B0cl9wdHI7Ci0JZnByaW50ZiAoc3RkZXJyLCAiICByZWxvYyAlMmQgQCUwOHggb2ZmICU0eCA6IHN5bSAlLTEwcyBhZGRlbmQgJXhcbiIsCi0JCSBpLCByLCByLT5hZGRyZXNzLCBzLT5uYW1lLCByLT5hZGRlbmQpOwotICAgICAgfQotICB9Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLXdyaXRlX2NvbnRlbnRzIChhYmZkLCBzZWMsIHh4eCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgeHh4OwotewotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICB1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7Ci0gIGZyYWdTICpmOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZnJhZ3MuICAqLwotICBpZiAoc2VnaW5mbyA9PSBOVUxMCi0gICAgICB8fCAhIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfSEFTX0NPTlRFTlRTKSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChmID0gc2VnaW5mby0+ZnJjaGFpblAtPmZyY2hfcm9vdDsKLSAgICAgICBmOwotICAgICAgIGYgPSBmLT5mcl9uZXh0KQotICAgIHsKLSAgICAgIGludCB4OwotICAgICAgdW5zaWduZWQgbG9uZyBmaWxsX3NpemU7Ci0gICAgICBjaGFyICpmaWxsX2xpdGVyYWw7Ci0gICAgICBsb25nIGNvdW50OwotCi0gICAgICBhc3NlcnQgKGYtPmZyX3R5cGUgPT0gcnNfZmlsbCk7Ci0gICAgICBpZiAoZi0+ZnJfZml4KQotCXsKLQkgIHggPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKHN0ZG91dHB1dCwgc2VjLAotCQkJCQlmLT5mcl9saXRlcmFsLCAoZmlsZV9wdHIpIG9mZnNldCwKLQkJCQkJKGJmZF9zaXplX3R5cGUpIGYtPmZyX2ZpeCk7Ci0JICBpZiAoeCA9PSBmYWxzZSkKLQkgICAgewotCSAgICAgIGJmZF9wZXJyb3IgKHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotCSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IHdyaXRlICVzIiksIHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotCSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0JICAgIH0KLQkgIG9mZnNldCArPSBmLT5mcl9maXg7Ci0JfQotICAgICAgZmlsbF9saXRlcmFsID0gZi0+ZnJfbGl0ZXJhbCArIGYtPmZyX2ZpeDsKLSAgICAgIGZpbGxfc2l6ZSA9IGYtPmZyX3ZhcjsKLSAgICAgIGNvdW50ID0gZi0+ZnJfb2Zmc2V0OwotICAgICAgYXNzZXJ0IChjb3VudCA+PSAwKTsKLSAgICAgIGlmIChmaWxsX3NpemUgJiYgY291bnQpCi0JewotCSAgY2hhciBidWZbMjU2XTsKLQkgIGlmIChmaWxsX3NpemUgPiBzaXplb2YoYnVmKSkKLQkgICAgewotCSAgICAgIC8qIERvIGl0IHRoZSBvbGQgd2F5LiBDYW4gdGhpcyBldmVyIGhhcHBlbj8gKi8KLQkgICAgICB3aGlsZSAoY291bnQtLSkKLQkJewotCQkgIHggPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKHN0ZG91dHB1dCwgc2VjLAotCQkJCQkJZmlsbF9saXRlcmFsLAotCQkJCQkJKGZpbGVfcHRyKSBvZmZzZXQsCi0JCQkJCQkoYmZkX3NpemVfdHlwZSkgZmlsbF9zaXplKTsKLQkJICBpZiAoeCA9PSBmYWxzZSkKLQkJICAgIHsKLQkJICAgICAgYmZkX3BlcnJvciAoc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0JCSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IHdyaXRlICVzIiksIHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotCQkgICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotCQkgICAgfQotCQkgIG9mZnNldCArPSBmaWxsX3NpemU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogQnVpbGQgYSBidWZmZXIgZnVsbCBvZiBmaWxsIG9iamVjdHMgYW5kIG91dHB1dCBpdCBhcwotCQkgb2Z0ZW4gYXMgbmVjZXNzYXJ5LiBUaGlzIHNhdmVzIG9uIHRoZSBvdmVyaGVhZCBvZgotCQkgcG90ZW50aWFsbHkgbG90cyBvZiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgY2FsbHMuICAqLwotCSAgICAgIGludCBuX3Blcl9idWYsIGk7Ci0JICAgICAgaWYgKGZpbGxfc2l6ZSA9PSAxKQotCQl7Ci0JCSAgbl9wZXJfYnVmID0gc2l6ZW9mIChidWYpOwotCQkgIG1lbXNldCAoYnVmLCAqZmlsbF9saXRlcmFsLCBuX3Blcl9idWYpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY2hhciAqYnVmcDsKLQkJICBuX3Blcl9idWYgPSBzaXplb2YoYnVmKS9maWxsX3NpemU7Ci0JCSAgZm9yIChpID0gbl9wZXJfYnVmLCBidWZwID0gYnVmOyBpOyBpLS0sIGJ1ZnAgKz0gZmlsbF9zaXplKQotCQkgICAgbWVtY3B5KGJ1ZnAsIGZpbGxfbGl0ZXJhbCwgZmlsbF9zaXplKTsKLQkJfQotCSAgICAgIGZvciAoOyBjb3VudCA+IDA7IGNvdW50IC09IG5fcGVyX2J1ZikKLQkJewotCQkgIG5fcGVyX2J1ZiA9IG5fcGVyX2J1ZiA+IGNvdW50ID8gY291bnQgOiBuX3Blcl9idWY7Ci0JCSAgeCA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoc3Rkb3V0cHV0LCBzZWMsCi0JCQkJCQlidWYsIChmaWxlX3B0cikgb2Zmc2V0LAotCQkJCQkJKGJmZF9zaXplX3R5cGUpIG5fcGVyX2J1ZiAqIGZpbGxfc2l6ZSk7Ci0JCSAgaWYgKHggIT0gdHJ1ZSkKLQkJICAgIGFzX2ZhdGFsIChfKCJDYW5ub3Qgd3JpdGUgdG8gb3V0cHV0IGZpbGUuIikpOwotCQkgIG9mZnNldCArPSBuX3Blcl9idWYgKiBmaWxsX3NpemU7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQkZEX0FTU0VNQkxFUikgfHwgKCFkZWZpbmVkIChCRkQpICYmICFkZWZpbmVkKE9CSl9BT1VUKSkKLXN0YXRpYyB2b2lkCi1tZXJnZV9kYXRhX2ludG9fdGV4dCAoKQotewotI2lmIGRlZmluZWQoQkZEX0FTU0VNQkxFUikgfHwgZGVmaW5lZChNQU5ZX1NFR01FTlRTKQotICBzZWdfaW5mbyAodGV4dF9zZWN0aW9uKS0+ZnJjaGFpblAtPmZyY2hfbGFzdC0+ZnJfbmV4dCA9Ci0gICAgc2VnX2luZm8gKGRhdGFfc2VjdGlvbiktPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0gIHNlZ19pbmZvICh0ZXh0X3NlY3Rpb24pLT5mcmNoYWluUC0+ZnJjaF9sYXN0ID0KLSAgICBzZWdfaW5mbyAoZGF0YV9zZWN0aW9uKS0+ZnJjaGFpblAtPmZyY2hfbGFzdDsKLSAgc2VnX2luZm8gKGRhdGFfc2VjdGlvbiktPmZyY2hhaW5QID0gMDsKLSNlbHNlCi0gIGZpeFMgKnRtcDsKLQotICB0ZXh0X2xhc3RfZnJhZy0+ZnJfbmV4dCA9IGRhdGFfZnJhZ19yb290OwotICB0ZXh0X2xhc3RfZnJhZyA9IGRhdGFfbGFzdF9mcmFnOwotICBkYXRhX2xhc3RfZnJhZyA9IE5VTEw7Ci0gIGRhdGFfZnJhZ19yb290ID0gTlVMTDsKLSAgaWYgKHRleHRfZml4X3Jvb3QpCi0gICAgewotICAgICAgZm9yICh0bXAgPSB0ZXh0X2ZpeF9yb290OyB0bXAtPmZ4X25leHQ7IHRtcCA9IHRtcC0+ZnhfbmV4dCk7OwotICAgICAgdG1wLT5meF9uZXh0ID0gZGF0YV9maXhfcm9vdDsKLSAgICAgIHRleHRfZml4X3RhaWwgPSBkYXRhX2ZpeF90YWlsOwotICAgIH0KLSAgZWxzZQotICAgIHRleHRfZml4X3Jvb3QgPSBkYXRhX2ZpeF9yb290OwotICBkYXRhX2ZpeF9yb290ID0gTlVMTDsKLSNlbmRpZgotfQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgfHwgKCEgQkZEICYmICEgT0JKX0FPVVQpICovCi0KLSNpZiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgIWRlZmluZWQgKEJGRCkKLXN0YXRpYyB2b2lkCi1yZWxheF9hbmRfc2l6ZV9hbGxfc2VnbWVudHMgKCkKLXsKLSAgZnJhZ1MgKmZyYWdQOwotCi0gIHJlbGF4X3NlZ21lbnQgKHRleHRfZnJhZ19yb290LCBTRUdfVEVYVCk7Ci0gIHJlbGF4X3NlZ21lbnQgKGRhdGFfZnJhZ19yb290LCBTRUdfREFUQSk7Ci0gIHJlbGF4X3NlZ21lbnQgKGJzc19mcmFnX3Jvb3QsIFNFR19CU1MpOwotICAvKgotICAgKiBOb3cgdGhlIGFkZHJlc3NlcyBvZiBmcmFncyBhcmUgY29ycmVjdCB3aXRoaW4gdGhlIHNlZ21lbnQuCi0gICAqLwotCi0gIGtub3cgKHRleHRfbGFzdF9mcmFnLT5mcl90eXBlID09IHJzX2ZpbGwgJiYgdGV4dF9sYXN0X2ZyYWctPmZyX29mZnNldCA9PSAwKTsKLSAgSF9TRVRfVEVYVF9TSVpFICgmaGVhZGVycywgdGV4dF9sYXN0X2ZyYWctPmZyX2FkZHJlc3MpOwotICB0ZXh0X2xhc3RfZnJhZy0+ZnJfYWRkcmVzcyA9IEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpOwotCi0gIC8qCi0gICAqIEpvaW4gdGhlIDIgc2VnbWVudHMgaW50byAxIGh1Z2Ugc2VnbWVudC4KLSAgICogVG8gZG8gdGhpcywgcmUtY29tcHV0ZSBldmVyeSBybl9hZGRyZXNzIGluIHRoZSBTRUdfREFUQSBmcmFncy4KLSAgICogVGhlbiBqb2luIHRoZSBkYXRhIGZyYWdzIGFmdGVyIHRoZSB0ZXh0IGZyYWdzLgotICAgKgotICAgKiBEZXRlcm1pbmUgYV9kYXRhIFtsZW5ndGggb2YgZGF0YSBzZWdtZW50XS4KLSAgICovCi0gIGlmIChkYXRhX2ZyYWdfcm9vdCkKLSAgICB7Ci0gICAgICByZWdpc3RlciByZWxheF9hZGRyZXNzVCBzbGlkZTsKLQotICAgICAga25vdyAoKHRleHRfbGFzdF9mcmFnLT5mcl90eXBlID09IHJzX2ZpbGwpICYmICh0ZXh0X2xhc3RfZnJhZy0+ZnJfb2Zmc2V0ID09IDApKTsKLQotICAgICAgSF9TRVRfREFUQV9TSVpFICgmaGVhZGVycywgZGF0YV9sYXN0X2ZyYWctPmZyX2FkZHJlc3MpOwotICAgICAgZGF0YV9sYXN0X2ZyYWctPmZyX2FkZHJlc3MgPSBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKTsKLSAgICAgIHNsaWRlID0gSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycyk7CS8qICYgaW4gZmlsZSBvZiB0aGUgZGF0YSBzZWdtZW50LiAqLwotI2lmZGVmIE9CSl9CT1VUCi0jZGVmaW5lIFJvdW5kVXAoTixTKSAoKChOKSsoUyktMSkmLShTKSkKLSAgICAgIC8qIEZvciBiLm91dDogSWYgdGhlIGRhdGEgc2VjdGlvbiBoYXMgYSBzdHJpY3QgYWxpZ25tZW50Ci0JIHJlcXVpcmVtZW50LCBpdHMgbG9hZCBhZGRyZXNzIGluIHRoZSAubyBmaWxlIHdpbGwgYmUKLQkgcm91bmRlZCB1cCBmcm9tIHRoZSBzaXplIG9mIHRoZSB0ZXh0IHNlY3Rpb24uICBUaGVzZQotCSB0d28gdmFsdWVzIGFyZSAqbm90KiB0aGUgc2FtZSEgIFNpbWlsYXJseSBmb3IgdGhlIGJzcwotCSBzZWN0aW9uLi4uLiAgKi8KLSAgICAgIHNsaWRlID0gUm91bmRVcCAoc2xpZGUsIDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbU0VHX0RBVEFdKTsKLSNlbmRpZgotCi0gICAgICBmb3IgKGZyYWdQID0gZGF0YV9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQotCXsKLQkgIGZyYWdQLT5mcl9hZGRyZXNzICs9IHNsaWRlOwotCX0JCQkvKiBmb3IgZWFjaCBkYXRhIGZyYWcgKi8KLQotICAgICAga25vdyAodGV4dF9sYXN0X2ZyYWcgIT0gMCk7Ci0gICAgICB0ZXh0X2xhc3RfZnJhZy0+ZnJfbmV4dCA9IGRhdGFfZnJhZ19yb290OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEhfU0VUX0RBVEFfU0laRSAoJmhlYWRlcnMsIDApOwotICAgIH0KLQotI2lmZGVmIE9CSl9CT1VUCi0gIC8qIFNlZSBhYm92ZSBjb21tZW50cyBvbiBiLm91dCBkYXRhIHNlY3Rpb24gYWRkcmVzcy4gICovCi0gIHsKLSAgICBsb25nIGJzc192bWE7Ci0gICAgaWYgKGRhdGFfbGFzdF9mcmFnID09IDApCi0gICAgICBic3Nfdm1hID0gSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycyk7Ci0gICAgZWxzZQotICAgICAgYnNzX3ZtYSA9IGRhdGFfbGFzdF9mcmFnLT5mcl9hZGRyZXNzOwotICAgIGJzc192bWEgPSBSb3VuZFVwIChic3Nfdm1hLCAxIDw8IHNlY3Rpb25fYWxpZ25tZW50W1NFR19CU1NdKTsKLSAgICBic3NfYWRkcmVzc19mcmFnLmZyX2FkZHJlc3MgPSBic3Nfdm1hOwotICB9Ci0jZWxzZSAvKiAhIE9CSl9CT1VUICovCi0gIGJzc19hZGRyZXNzX2ZyYWcuZnJfYWRkcmVzcyA9IChIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKSArCi0JCQkJIEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpKTsKLQotI2VuZGlmIC8qICEgT0JKX0JPVVQgKi8KLQotICAvKiBTbGlkZSBhbGwgdGhlIGZyYWdzICovCi0gIGlmIChic3NfZnJhZ19yb290KQotICAgIHsKLSAgICAgIHJlbGF4X2FkZHJlc3NUIHNsaWRlID0gYnNzX2FkZHJlc3NfZnJhZy5mcl9hZGRyZXNzOwotCi0gICAgICBmb3IgKGZyYWdQID0gYnNzX2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCi0JewotCSAgZnJhZ1AtPmZyX2FkZHJlc3MgKz0gc2xpZGU7Ci0JfQkJCS8qIGZvciBlYWNoIGJzcyBmcmFnICovCi0gICAgfQotCi0gIGlmIChic3NfbGFzdF9mcmFnKQotICAgIEhfU0VUX0JTU19TSVpFICgmaGVhZGVycywKLQkJICAgIGJzc19sYXN0X2ZyYWctPmZyX2FkZHJlc3MgLSBic3NfZnJhZ19yb290LT5mcl9hZGRyZXNzKTsKLSAgZWxzZQotICAgIEhfU0VUX0JTU19TSVpFICgmaGVhZGVycywgMCk7Ci19Ci0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICYmICEgQkZEICovCi0KLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAhZGVmaW5lZCAoQkZEKQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RhdGljIHZvaWQKLXNldF9zeW10YWIgKCkKLXsKLSAgaW50IG5zeW1zOwotICBhc3ltYm9sICoqYXN5bXBwOwotICBzeW1ib2xTICpzeW1wOwotICBib29sZWFuIHJlc3VsdDsKLSAgZXh0ZXJuIFBUUiBiZmRfYWxsb2MgUEFSQU1TICgoYmZkICosIHNpemVfdCkpOwotCi0gIC8qIENvdW50IHN5bWJvbHMuICBXZSBjYW4ndCByZWx5IG9uIGEgY291bnQgbWFkZSBieSB0aGUgbG9vcCBpbgotICAgICB3cml0ZV9vYmplY3RfZmlsZSwgYmVjYXVzZSAqX2Zyb2JfZmlsZSBtYXkgYWRkIGEgbmV3IHN5bWJvbCBvcgotICAgICB0d28uICAqLwotICBuc3ltcyA9IDA7Ci0gIGZvciAoc3ltcCA9IHN5bWJvbF9yb290UDsgc3ltcDsgc3ltcCA9IHN5bWJvbF9uZXh0IChzeW1wKSkKLSAgICBuc3ltcysrOwotCi0gIGlmIChuc3ltcykKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgYXN5bXBwID0gKGFzeW1ib2wgKiopIGJmZF9hbGxvYyAoc3Rkb3V0cHV0LAotCQkJCSAgICAgICBuc3ltcyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICBzeW1wID0gc3ltYm9sX3Jvb3RQOwotICAgICAgZm9yIChpID0gMDsgaSA8IG5zeW1zOyBpKyssIHN5bXAgPSBzeW1ib2xfbmV4dCAoc3ltcCkpCi0JewotCSAgYXN5bXBwW2ldID0gc3ltcC0+YnN5bTsKLQkgIHN5bXAtPndyaXR0ZW4gPSAxOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBhc3ltcHAgPSAwOwotICByZXN1bHQgPSBiZmRfc2V0X3N5bXRhYiAoc3Rkb3V0cHV0LCBhc3ltcHAsIG5zeW1zKTsKLSAgYXNzZXJ0IChyZXN1bHQgPT0gdHJ1ZSk7Ci0gIHN5bWJvbF90YWJsZV9mcm96ZW4gPSAxOwotfQotI2VuZGlmCi0KLS8qIEZpbmlzaCB0aGUgc3Vic2VnbWVudHMuICBBZnRlciBldmVyeSBzdWItc2VnbWVudCwgd2UgZmFrZSBhbgotICAgIi5hbGlnbiAuLi4iLiAgVGhpcyBjb25mb3JtcyB0byBCU0Q0LjIgYnJhbmUtZGFtYWdlLiAgV2UgdGhlbiBmYWtlCi0gICAiLmZpbGwgMCIgYmVjYXVzZSB0aGF0IGlzIHRoZSBraW5kIG9mIGZyYWcgdGhhdCByZXF1aXJlcyBsZWFzdAotICAgdGhvdWdodC4gICIuYWxpZ24iIGZyYWdzIGxpa2UgdG8gaGF2ZSBhIGZvbGxvd2luZyBmcmFnIHNpbmNlIHRoYXQKLSAgIG1ha2VzIGNhbGN1bGF0aW5nIHRoZWlyIGludGVuZGVkIGxlbmd0aCB0cml2aWFsLiAgKi8KLQotI2lmbmRlZiBTVUJfU0VHTUVOVF9BTElHTgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKSAoMCkKLSNlbHNlCi0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykgKDIpCi0jZW5kaWYKLSNlbmRpZgotCi12b2lkCi1zdWJzZWdzX2ZpbmlzaCAoKQotewotICBzdHJ1Y3QgZnJjaGFpbiAqZnJjaGFpblA7Ci0KLSAgZm9yIChmcmNoYWluUCA9IGZyY2hhaW5fcm9vdDsgZnJjaGFpblA7IGZyY2hhaW5QID0gZnJjaGFpblAtPmZyY2hfbmV4dCkKLSAgICB7Ci0gICAgICBzdWJzZWdfc2V0IChmcmNoYWluUC0+ZnJjaF9zZWcsIGZyY2hhaW5QLT5mcmNoX3N1YnNlZyk7Ci0KLSAgICAgIC8qIFRoaXMgbm93IGdldHMgY2FsbGVkIGV2ZW4gaWYgd2UgaGFkIGVycm9ycy4gIEluIHRoYXQgY2FzZSwKLSAgICAgICAgIGFueSBhbGlnbm1lbnQgaXMgbWVhbmluZ2xlc3MsIGFuZCwgbW9yZW92ZXIsIHdpbGwgbG9vayB3ZWlyZAotICAgICAgICAgaWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBsaXN0aW5nLiAgKi8KLSAgICAgIGZyYWdfYWxpZ24gKGhhZF9lcnJvcnMgKCkgPyAwIDogU1VCX1NFR01FTlRfQUxJR04gKG5vd19zZWcpLAotCQkgIE5PUF9PUENPREUsIDApOwotCi0gICAgICAvKiBmcmFnX2FsaWduIHdpbGwgaGF2ZSBsZWZ0IGEgbmV3IGZyYWcuCi0JIFVzZSB0aGlzIGxhc3QgZnJhZyBmb3IgYW4gZW1wdHkgIi5maWxsIi4KLQotCSBGb3IgdGhpcyBzZWdtZW50IC4uLgotCSBDcmVhdGUgYSBsYXN0IGZyYWcuIERvIG5vdCBsZWF2ZSBhICJiZWluZyBmaWxsZWQgaW4gZnJhZyIuICAqLwotCi0gICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLSAgICAgIGZyYWdfbm93LT5mcl9maXggPSAwOwotICAgICAga25vdyAoZnJhZ19ub3ctPmZyX25leHQgPT0gTlVMTCk7Ci0gICAgfQotfQotCi0vKiBXcml0ZSB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi12b2lkCi13cml0ZV9vYmplY3RfZmlsZSAoKQotewotI2lmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgISBkZWZpbmVkIChXT1JLSU5HX0RPVF9XT1JEKQotICBmcmFnUyAqZnJhZ1A7CQkJLyogVHJhY2sgYWxvbmcgYWxsIGZyYWdzLiAqLwotI2VuZGlmCi0KLSAgLyogRG8gd2UgcmVhbGx5IHdhbnQgdG8gd3JpdGUgaXQ/ICAqLwotICB7Ci0gICAgaW50IG5fd2FybnMsIG5fZXJyczsKLSAgICBuX3dhcm5zID0gaGFkX3dhcm5pbmdzICgpOwotICAgIG5fZXJycyA9IGhhZF9lcnJvcnMgKCk7Ci0gICAgLyogVGhlIC1aIGZsYWcgaW5kaWNhdGVzIHRoYXQgYW4gb2JqZWN0IGZpbGUgc2hvdWxkIGJlIGdlbmVyYXRlZCwKLSAgICAgICByZWdhcmRsZXNzIG9mIHdhcm5pbmdzIGFuZCBlcnJvcnMuICAqLwotICAgIGlmIChmbGFnX2Fsd2F5c19nZW5lcmF0ZV9vdXRwdXQpCi0gICAgICB7Ci0JaWYgKG5fd2FybnMgfHwgbl9lcnJzKQotCSAgYXNfd2FybiAoXygiJWQgZXJyb3IlcywgJWQgd2FybmluZyVzLCBnZW5lcmF0aW5nIGJhZCBvYmplY3QgZmlsZS5cbiIpLAotCQkgICBuX2VycnMsIG5fZXJycyA9PSAxID8gIiIgOiAicyIsCi0JCSAgIG5fd2FybnMsIG5fd2FybnMgPT0gMSA/ICIiIDogInMiKTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JaWYgKG5fZXJycykKLQkgIGFzX2ZhdGFsIChfKCIlZCBlcnJvciVzLCAlZCB3YXJuaW5nJXMsIG5vIG9iamVjdCBmaWxlIGdlbmVyYXRlZC5cbiIpLAotCQkgICAgbl9lcnJzLCBuX2VycnMgPT0gMSA/ICIiIDogInMiLAotCQkgICAgbl93YXJucywgbl93YXJucyA9PSAxID8gIiIgOiAicyIpOwotICAgICAgfQotICB9Ci0KLSNpZmRlZglPQkpfVk1TCi0gIC8qIFVuZGVyIFZNUyB3ZSB0cnkgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFZBWC0xMSAiQyIuICBUaHVzLCB3ZSBjYWxsCi0gICAgIGEgcm91dGluZSB0byBjaGVjayBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlIHByb2NlZHVyZSAiX21haW4iLAotICAgICBhbmQgaWYgc28gLS0gZml4IGl0IHVwIHNvIHRoYXQgaXQgY2FuIGJlIHByb2dyYW0gZW50cnkgcG9pbnQuICovCi0gIHZtc19jaGVja19mb3JfbWFpbiAoKTsKLSNlbmRpZiAvKiBPQkpfVk1TICovCi0KLSAgLyogRnJvbSBub3cgb24sIHdlIGRvbid0IGNhcmUgYWJvdXQgc3ViLXNlZ21lbnRzLiAgQnVpbGQgb25lIGZyYWcgY2hhaW4KLSAgICAgZm9yIGVhY2ggc2VnbWVudC4gTGlua2VkIHRocnUgZnJfbmV4dC4gICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIC8qIFJlbW92ZSB0aGUgc2VjdGlvbnMgY3JlYXRlZCBieSBnYXMgZm9yIGl0cyBvd24gcHVycG9zZXMuICAqLwotICB7Ci0gICAgYXNlY3Rpb24gKipzZWNsaXN0LCAqc2VjOwotICAgIGludCBpOwotCi0gICAgc2VjbGlzdCA9ICZzdGRvdXRwdXQtPnNlY3Rpb25zOwotICAgIHdoaWxlIChzZWNsaXN0ICYmICpzZWNsaXN0KQotICAgICAgewotCXNlYyA9ICpzZWNsaXN0OwotCXdoaWxlIChzZWMgPT0gcmVnX3NlY3Rpb24gfHwgc2VjID09IGV4cHJfc2VjdGlvbikKLQkgIHsKLQkgICAgc2VjID0gc2VjLT5uZXh0OwotCSAgICAqc2VjbGlzdCA9IHNlYzsKLQkgICAgc3Rkb3V0cHV0LT5zZWN0aW9uX2NvdW50LS07Ci0JICAgIGlmICghc2VjKQotCSAgICAgIGJyZWFrOwotCSAgfQotCWlmICgqc2VjbGlzdCkKLQkgIHNlY2xpc3QgPSAmKCpzZWNsaXN0KS0+bmV4dDsKLSAgICAgIH0KLSAgICBpID0gMDsKLSAgICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgcmVudW1iZXJfc2VjdGlvbnMsICZpKTsKLSAgfQotCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCBjaGFpbl9mcmNoYWluc190b2dldGhlciwgKGNoYXIgKikgMCk7Ci0jZWxzZQotICByZW1vdmVfc3Vic2VncyAoZnJjaGFpbl9yb290LCBTRUdfVEVYVCwgJnRleHRfZnJhZ19yb290LCAmdGV4dF9sYXN0X2ZyYWcpOwotICByZW1vdmVfc3Vic2VncyAoZGF0YTBfZnJjaGFpblAsIFNFR19EQVRBLCAmZGF0YV9mcmFnX3Jvb3QsICZkYXRhX2xhc3RfZnJhZyk7Ci0gIHJlbW92ZV9zdWJzZWdzIChic3MwX2ZyY2hhaW5QLCBTRUdfQlNTLCAmYnNzX2ZyYWdfcm9vdCwgJmJzc19sYXN0X2ZyYWcpOwotI2VuZGlmCi0KLSAgLyogV2UgaGF2ZSB0d28gc2VnbWVudHMuIElmIHVzZXIgZ2F2ZSAtUiBmbGFnLCB0aGVuIHdlIG11c3QgcHV0IHRoZQotICAgICBkYXRhIGZyYWdzIGludG8gdGhlIHRleHQgc2VnbWVudC4gRG8gdGhpcyBiZWZvcmUgcmVsYXhpbmcgc28KLSAgICAgd2Uga25vdyB0byB0YWtlIGFkdmFudGFnZSBvZiAtUiBhbmQgbWFrZSBzaG9ydGVyIGFkZHJlc3Nlcy4gICovCi0jaWYgIWRlZmluZWQgKE9CSl9BT1VUKSB8fCBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpCi0gICAgewotICAgICAgbWVyZ2VfZGF0YV9pbnRvX3RleHQgKCk7Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCByZWxheF9hbmRfc2l6ZV9zZWcsIChjaGFyICopIDApOwotI2Vsc2UKLSAgcmVsYXhfYW5kX3NpemVfYWxsX3NlZ21lbnRzICgpOwotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gIC8qCi0gICAqCi0gICAqIENyYXdsIHRoZSBzeW1ib2wgY2hhaW4uCi0gICAqCi0gICAqIEZvciBlYWNoIHN5bWJvbCB3aG9zZSB2YWx1ZSBkZXBlbmRzIG9uIGEgZnJhZywgdGFrZSB0aGUgYWRkcmVzcyBvZgotICAgKiB0aGF0IGZyYWcgYW5kIHN1YnN1bWUgaXQgaW50byB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4KLSAgICogQWZ0ZXIgdGhpcywgdGhlcmUgaXMganVzdCBvbmUgd2F5IHRvIGxvb2t1cCBhIHN5bWJvbCB2YWx1ZS4KLSAgICogVmFsdWVzIGFyZSBsZWZ0IGluIHRoZWlyIGZpbmFsIHN0YXRlIGZvciBvYmplY3QgZmlsZSBlbWlzc2lvbi4KLSAgICogV2UgYWRqdXN0IHRoZSB2YWx1ZXMgb2YgJ0wnIGxvY2FsIHN5bWJvbHMsIGV2ZW4gaWYgd2UgZG8KLSAgICogbm90IGludGVuZCB0byBlbWl0IHRoZW0gdG8gdGhlIG9iamVjdCBmaWxlLCBiZWNhdXNlIHRoZWlyIHZhbHVlcwotICAgKiBhcmUgbmVlZGVkIGZvciBmaXgtdXBzLgotICAgKgotICAgKiBVbmxlc3Mgd2Ugc2F3IGEgLUwgZmxhZywgcmVtb3ZlIGFsbCBzeW1ib2xzIHRoYXQgYmVnaW4gd2l0aCAnTCcKLSAgICogZnJvbSB0aGUgc3ltYm9sIGNoYWluLiAgKFRoZXkgYXJlIHN0aWxsIHBvaW50ZWQgdG8gYnkgdGhlIGZpeGVzLikKLSAgICoKLSAgICogQ291bnQgdGhlIHJlbWFpbmluZyBzeW1ib2xzLgotICAgKiBBc3NpZ24gYSBzeW1ib2wgbnVtYmVyIHRvIGVhY2ggc3ltYm9sLgotICAgKiBDb3VudCB0aGUgbnVtYmVyIG9mIHN0cmluZy10YWJsZSBjaGFycyB3ZSB3aWxsIGVtaXQuCi0gICAqIFB1dCB0aGlzIGluZm8gaW50byB0aGUgaGVhZGVycyBhcyBhcHByb3ByaWF0ZS4KLSAgICoKLSAgICovCi0gIGtub3cgKHplcm9fYWRkcmVzc19mcmFnLmZyX2FkZHJlc3MgPT0gMCk7Ci0gIHN0cmluZ19ieXRlX2NvdW50ID0gc2l6ZW9mIChzdHJpbmdfYnl0ZV9jb3VudCk7Ci0KLSAgb2JqX2NyYXdsX3N5bWJvbF9jaGFpbiAoJmhlYWRlcnMpOwotCi0gIGlmIChzdHJpbmdfYnl0ZV9jb3VudCA9PSBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KSkKLSAgICBzdHJpbmdfYnl0ZV9jb3VudCA9IDA7Ci0KLSAgSF9TRVRfU1RSSU5HX1NJWkUgKCZoZWFkZXJzLCBzdHJpbmdfYnl0ZV9jb3VudCk7Ci0KLSAgLyoKLSAgICogQWRkcmVzc2VzIG9mIGZyYWdzIG5vdyByZWZsZWN0IGFkZHJlc3NlcyB3ZSB1c2UgaW4gdGhlIG9iamVjdCBmaWxlLgotICAgKiBTeW1ib2wgdmFsdWVzIGFyZSBjb3JyZWN0LgotICAgKiBTY2FuIHRoZSBmcmFncywgY29udmVydGluZyBhbnkgIi5vcmcicyBhbmQgIi5hbGlnbiJzIHRvICIuZmlsbCJzLgotICAgKiBBbHNvIGNvbnZlcnRpbmcgYW55IG1hY2hpbmUtZGVwZW5kZW50IGZyYWdzIHVzaW5nIG1kX2NvbnZlcnRfZnJhZygpOwotICAgKi8KLSAgc3Vic2VnX2NoYW5nZSAoU0VHX1RFWFQsIDApOwotCi0gIGZvciAoZnJhZ1AgPSB0ZXh0X2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCi0gICAgewotICAgICAgLyogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGxpbmtlZCBhbGwgdGhlIGZyYWdzIGludG8gYSBzaW5nbGUKLSAgICAgICAgIGNoYWluLiAgSG93ZXZlciwgY3Z0X2ZyYWdfdG9fZmlsbCBtYXkgY2FsbCBtZF9jb252ZXJ0X2ZyYWcKLSAgICAgICAgIHdoaWNoIG1heSBjYWxsIGZpeF9uZXcuICBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IGZpeF9uZXcgYWRkcwotICAgICAgICAgdGhlIGZpeHVwIHRvIHRoZSByaWdodCBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChmcmFnUCA9PSBkYXRhX2ZyYWdfcm9vdCkKLQlzdWJzZWdfY2hhbmdlIChTRUdfREFUQSwgMCk7Ci0KLSAgICAgIGN2dF9mcmFnX3RvX2ZpbGwgKCZoZWFkZXJzLCBTRUdfVEVYVCwgZnJhZ1ApOwotCi0gICAgICAvKiBTb21lIGFzc2VydCBtYWNyb3MgZG9uJ3Qgd29yayB3aXRoICMgZGlyZWN0aXZlcyBtaXhlZCBpbi4gICovCi0jaWZuZGVmIE5ERUJVRwotICAgICAgaWYgKCEoZnJhZ1AtPmZyX25leHQgPT0gTlVMTAotI2lmZGVmIE9CSl9CT1VUCi0JICAgIHx8IGZyYWdQLT5mcl9uZXh0ID09IGRhdGFfZnJhZ19yb290Ci0jZW5kaWYKLQkgICAgfHwgKChmcmFnUC0+ZnJfbmV4dC0+ZnJfYWRkcmVzcyAtIGZyYWdQLT5mcl9hZGRyZXNzKQotCQk9PSAoZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9vZmZzZXQgKiBmcmFnUC0+ZnJfdmFyKSkpKQotCWFib3J0ICgpOwotI2VuZGlmCi0gICAgfQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLSAgewotICAgIHN0cnVjdCBicm9rZW5fd29yZCAqbGllOwotICAgIHN0cnVjdCBicm9rZW5fd29yZCAqKnByZXZQOwotCi0gICAgcHJldlAgPSAmYnJva2VuX3dvcmRzOwotICAgIGZvciAobGllID0gYnJva2VuX3dvcmRzOyBsaWU7IGxpZSA9IGxpZS0+bmV4dF9icm9rZW5fd29yZCkKLSAgICAgIGlmICghbGllLT5hZGRlZCkKLQl7Ci0JICBleHByZXNzaW9uUyBleHA7Ci0KLQkgIHN1YnNlZ19jaGFuZ2UgKGxpZS0+c2VnLCBsaWUtPnN1YnNlZyk7Ci0JICBleHAuWF9vcCA9IE9fc3VidHJhY3Q7Ci0JICBleHAuWF9hZGRfc3ltYm9sID0gbGllLT5hZGQ7Ci0JICBleHAuWF9vcF9zeW1ib2wgPSBsaWUtPnN1YjsKLQkgIGV4cC5YX2FkZF9udW1iZXIgPSBsaWUtPmFkZG51bTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jaWZkZWYgVENfQ09OU19GSVhfTkVXCi0JICBUQ19DT05TX0ZJWF9ORVcgKGxpZS0+ZnJhZywKLQkJICAgICAgIGxpZS0+d29yZF9nb2VzX2hlcmUgLSBsaWUtPmZyYWctPmZyX2xpdGVyYWwsCi0JCSAgICAgICAyLCAmZXhwKTsKLSNlbHNlCi0JICBmaXhfbmV3X2V4cCAobGllLT5mcmFnLAotCQkgICAgICAgbGllLT53b3JkX2dvZXNfaGVyZSAtIGxpZS0+ZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgIDIsICZleHAsIDAsIEJGRF9SRUxPQ18xNik7Ci0jZW5kaWYKLSNlbHNlCi0jaWYgZGVmaW5lZChUQ19TUEFSQykgfHwgZGVmaW5lZChUQ19BMjlLKSB8fCBkZWZpbmVkKE5FRURfRlhfUl9UWVBFKQotCSAgZml4X25ld19leHAgKGxpZS0+ZnJhZywKLQkJICAgICAgIGxpZS0+d29yZF9nb2VzX2hlcmUgLSBsaWUtPmZyYWctPmZyX2xpdGVyYWwsCi0JCSAgICAgICAyLCAmZXhwLCAwLCBOT19SRUxPQyk7Ci0jZWxzZQotI2lmZGVmIFRDX05TMzJLCi0JICBmaXhfbmV3X25zMzJrX2V4cCAobGllLT5mcmFnLAotCQkJICAgICBsaWUtPndvcmRfZ29lc19oZXJlIC0gbGllLT5mcmFnLT5mcl9saXRlcmFsLAotCQkJICAgICAyLCAmZXhwLCAwLCAwLCAyLCAwLCAwKTsKLSNlbHNlCi0JICBmaXhfbmV3X2V4cCAobGllLT5mcmFnLAotCQkgICAgICAgbGllLT53b3JkX2dvZXNfaGVyZSAtIGxpZS0+ZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgIDIsICZleHAsIDAsIDApOwotI2VuZGlmIC8qIFRDX05TMzJLICovCi0jZW5kaWYgLyogVENfU1BBUkN8VENfQTI5S3xORUVEX0ZYX1JfVFlQRSAqLwotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQkgICpwcmV2UCA9IGxpZS0+bmV4dF9icm9rZW5fd29yZDsKLQl9Ci0gICAgICBlbHNlCi0JcHJldlAgPSAmKGxpZS0+bmV4dF9icm9rZW5fd29yZCk7Ci0KLSAgICBmb3IgKGxpZSA9IGJyb2tlbl93b3JkczsgbGllOykKLSAgICAgIHsKLQlzdHJ1Y3QgYnJva2VuX3dvcmQgKnVudHJ1dGg7Ci0JY2hhciAqdGFibGVfcHRyOwotCWFkZHJlc3NUIHRhYmxlX2FkZHI7Ci0JYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotCWludCBuLCBtOwotCi0Jc3Vic2VnX2NoYW5nZSAobGllLT5zZWcsIGxpZS0+c3Vic2VnKTsKLQlmcmFnUCA9IGxpZS0+ZGlzcGZyYWc7Ci0KLQkvKiBGaW5kIG91dCBob3cgbWFueSBicm9rZW5fd29yZHMgZ28gaGVyZS4gICovCi0JbiA9IDA7Ci0JZm9yICh1bnRydXRoID0gbGllOyB1bnRydXRoICYmIHVudHJ1dGgtPmRpc3BmcmFnID09IGZyYWdQOyB1bnRydXRoID0gdW50cnV0aC0+bmV4dF9icm9rZW5fd29yZCkKLQkgIGlmICh1bnRydXRoLT5hZGRlZCA9PSAxKQotCSAgICBuKys7Ci0KLQl0YWJsZV9wdHIgPSBsaWUtPmRpc3BmcmFnLT5mcl9vcGNvZGU7Ci0JdGFibGVfYWRkciA9IGxpZS0+ZGlzcGZyYWctPmZyX2FkZHJlc3MgKyAodGFibGVfcHRyIC0gbGllLT5kaXNwZnJhZy0+ZnJfbGl0ZXJhbCk7Ci0JLyogQ3JlYXRlIHRoZSBqdW1wIGFyb3VuZCB0aGUgbG9uZyBqdW1wcy4gIFRoaXMgaXMgYSBzaG9ydAotCSAgIGp1bXAgZnJvbSB0YWJsZV9wdHIrMCB0byB0YWJsZV9wdHIrbipsb25nX2p1bXBfc2l6ZS4gICovCi0JZnJvbV9hZGRyID0gdGFibGVfYWRkcjsKLQl0b19hZGRyID0gdGFibGVfYWRkciArIG1kX3Nob3J0X2p1bXBfc2l6ZSArIG4gKiBtZF9sb25nX2p1bXBfc2l6ZTsKLQltZF9jcmVhdGVfc2hvcnRfanVtcCAodGFibGVfcHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGxpZS0+ZGlzcGZyYWcsIGxpZS0+YWRkKTsKLQl0YWJsZV9wdHIgKz0gbWRfc2hvcnRfanVtcF9zaXplOwotCXRhYmxlX2FkZHIgKz0gbWRfc2hvcnRfanVtcF9zaXplOwotCi0JZm9yIChtID0gMDsgbGllICYmIGxpZS0+ZGlzcGZyYWcgPT0gZnJhZ1A7IG0rKywgbGllID0gbGllLT5uZXh0X2Jyb2tlbl93b3JkKQotCSAgewotCSAgICBpZiAobGllLT5hZGRlZCA9PSAyKQotCSAgICAgIGNvbnRpbnVlOwotCSAgICAvKiBQYXRjaCB0aGUganVtcCB0YWJsZSAqLwotCSAgICAvKiBUaGlzIGlzIHRoZSBvZmZzZXQgZnJvbSA/Pz8gdG8gdGFibGVfcHRyKzAgKi8KLQkgICAgdG9fYWRkciA9IHRhYmxlX2FkZHIgLSBTX0dFVF9WQUxVRSAobGllLT5zdWIpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgICAgdG9fYWRkciAtPSBsaWUtPnN1Yi0+c3lfZnJhZy0+ZnJfYWRkcmVzczsKLSNlbmRpZgotCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpZS0+d29yZF9nb2VzX2hlcmUsIHRvX2FkZHIsIDIpOwotCSAgICBmb3IgKHVudHJ1dGggPSBsaWUtPm5leHRfYnJva2VuX3dvcmQ7IHVudHJ1dGggJiYgdW50cnV0aC0+ZGlzcGZyYWcgPT0gZnJhZ1A7IHVudHJ1dGggPSB1bnRydXRoLT5uZXh0X2Jyb2tlbl93b3JkKQotCSAgICAgIHsKLQkJaWYgKHVudHJ1dGgtPnVzZV9qdW1wID09IGxpZSkKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHVudHJ1dGgtPndvcmRfZ29lc19oZXJlLCB0b19hZGRyLCAyKTsKLQkgICAgICB9Ci0KLQkgICAgLyogSW5zdGFsbCB0aGUgbG9uZyBqdW1wICovCi0JICAgIC8qIHRoaXMgaXMgYSBsb25nIGp1bXAgZnJvbSB0YWJsZV9wdHIrMCB0byB0aGUgZmluYWwgdGFyZ2V0ICovCi0JICAgIGZyb21fYWRkciA9IHRhYmxlX2FkZHI7Ci0JICAgIHRvX2FkZHIgPSBTX0dFVF9WQUxVRSAobGllLT5hZGQpICsgbGllLT5hZGRudW07Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgICB0b19hZGRyICs9IGxpZS0+YWRkLT5zeV9mcmFnLT5mcl9hZGRyZXNzOwotI2VuZGlmCi0JICAgIG1kX2NyZWF0ZV9sb25nX2p1bXAgKHRhYmxlX3B0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBsaWUtPmRpc3BmcmFnLCBsaWUtPmFkZCk7Ci0JICAgIHRhYmxlX3B0ciArPSBtZF9sb25nX2p1bXBfc2l6ZTsKLQkgICAgdGFibGVfYWRkciArPSBtZF9sb25nX2p1bXBfc2l6ZTsKLQkgIH0KLSAgICAgIH0KLSAgfQotI2VuZGlmIC8qIG5vdCBXT1JLSU5HX0RPVF9XT1JEICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI2lmbmRlZglPQkpfVk1TCi0gIHsJCQkJLyogbm90IHZtcyAqLwotICAgIGNoYXIgKnRoZV9vYmplY3RfZmlsZTsKLSAgICBsb25nIG9iamVjdF9maWxlX3NpemU7Ci0gICAgLyoKLSAgICAgKiBTY2FuIGV2ZXJ5IEZpeFMgcGVyZm9ybWluZyBmaXh1cHMuIFdlIGhhZCB0byB3YWl0IHVudGlsIG5vdyB0byBkbwotICAgICAqIHRoaXMgYmVjYXVzZSBtZF9jb252ZXJ0X2ZyYWcoKSBtYXkgaGF2ZSBtYWRlIHNvbWUgZml4U3MuCi0gICAgICovCi0gICAgaW50IHRyc2l6ZSwgZHJzaXplOwotCi0gICAgc3Vic2VnX2NoYW5nZSAoU0VHX1RFWFQsIDApOwotICAgIHRyc2l6ZSA9IG1kX3JlbG9jX3NpemUgKiBmaXh1cF9zZWdtZW50ICh0ZXh0X2ZpeF9yb290LCBTRUdfVEVYVCk7Ci0gICAgc3Vic2VnX2NoYW5nZSAoU0VHX0RBVEEsIDApOwotICAgIGRyc2l6ZSA9IG1kX3JlbG9jX3NpemUgKiBmaXh1cF9zZWdtZW50IChkYXRhX2ZpeF9yb290LCBTRUdfREFUQSk7Ci0gICAgSF9TRVRfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycywgdHJzaXplLCBkcnNpemUpOwotCi0gICAgLyogRklYTUUgbW92ZSB0aGlzIHN0dWZmIGludG8gdGhlIHByZS13cml0ZS1ob29rICovCi0gICAgSF9TRVRfTUFHSUNfTlVNQkVSICgmaGVhZGVycywgbWFnaWNfbnVtYmVyX2Zvcl9vYmplY3RfZmlsZSk7Ci0gICAgSF9TRVRfRU5UUllfUE9JTlQgKCZoZWFkZXJzLCAwKTsKLQotICAgIG9ial9wcmVfd3JpdGVfaG9vayAoJmhlYWRlcnMpOwkvKiBleHRyYSBjb2ZmIHN0dWZmICovCi0KLSAgICBvYmplY3RfZmlsZV9zaXplID0gSF9HRVRfRklMRV9TSVpFICgmaGVhZGVycyk7Ci0gICAgbmV4dF9vYmplY3RfZmlsZV9jaGFyUCA9IHRoZV9vYmplY3RfZmlsZSA9IHhtYWxsb2MgKG9iamVjdF9maWxlX3NpemUpOwotCi0gICAgb3V0cHV0X2ZpbGVfY3JlYXRlIChvdXRfZmlsZV9uYW1lKTsKLQotICAgIG9ial9oZWFkZXJfYXBwZW5kICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgJmhlYWRlcnMpOwotCi0gICAga25vdyAoKG5leHRfb2JqZWN0X2ZpbGVfY2hhclAgLSB0aGVfb2JqZWN0X2ZpbGUpID09IEhfR0VUX0hFQURFUl9TSVpFICgmaGVhZGVycykpOwotCi0gICAgLyoKLSAgICAgKiBFbWl0IGNvZGUuCi0gICAgICovCi0gICAgZm9yIChmcmFnUCA9IHRleHRfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKLSAgICAgIHsKLQlyZWdpc3RlciBsb25nIGNvdW50OwotCXJlZ2lzdGVyIGNoYXIgKmZpbGxfbGl0ZXJhbDsKLQlyZWdpc3RlciBsb25nIGZpbGxfc2l6ZTsKLQotCVBST0dSRVNTICgxKTsKLQlrbm93IChmcmFnUC0+ZnJfdHlwZSA9PSByc19maWxsKTsKLQlhcHBlbmQgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCBmcmFnUC0+ZnJfbGl0ZXJhbCwgKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9maXgpOwotCWZpbGxfbGl0ZXJhbCA9IGZyYWdQLT5mcl9saXRlcmFsICsgZnJhZ1AtPmZyX2ZpeDsKLQlmaWxsX3NpemUgPSBmcmFnUC0+ZnJfdmFyOwotCWtub3cgKGZyYWdQLT5mcl9vZmZzZXQgPj0gMCk7Ci0KLQlmb3IgKGNvdW50ID0gZnJhZ1AtPmZyX29mZnNldDsgY291bnQ7IGNvdW50LS0pCi0JICB7Ci0JICAgIGFwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIGZpbGxfbGl0ZXJhbCwgKHVuc2lnbmVkIGxvbmcpIGZpbGxfc2l6ZSk7Ci0JICB9CQkJLyogZm9yIGVhY2ggICovCi0KLSAgICAgIH0JCQkJLyogZm9yIGVhY2ggY29kZSBmcmFnLiAqLwotCi0gICAga25vdyAoKG5leHRfb2JqZWN0X2ZpbGVfY2hhclAgLSB0aGVfb2JqZWN0X2ZpbGUpID09IChIX0dFVF9IRUFERVJfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKSkpOwotCi0gICAgLyoKLSAgICAgKiBFbWl0IHJlbG9jYXRpb25zLgotICAgICAqLwotICAgIG9ial9lbWl0X3JlbG9jYXRpb25zICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgdGV4dF9maXhfcm9vdCwgKHJlbGF4X2FkZHJlc3NUKSAwKTsKLSAgICBrbm93ICgobmV4dF9vYmplY3RfZmlsZV9jaGFyUCAtIHRoZV9vYmplY3RfZmlsZSkgPT0gKEhfR0VUX0hFQURFUl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUgKCZoZWFkZXJzKSkpOwotI2lmZGVmIFRDX0k5NjAKLSAgICAvKiBNYWtlIGFkZHJlc3NlcyBpbiBkYXRhIHJlbG9jYXRpb24gZGlyZWN0aXZlcyByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YKLSAgICAgKiBmaXJzdCBkYXRhIGZyYWdtZW50LCBub3QgZW5kIG9mIGxhc3QgdGV4dCBmcmFnbWVudDogIGFsaWdubWVudCBvZiB0aGUKLSAgICAgKiBzdGFydCBvZiB0aGUgZGF0YSBzZWdtZW50IG1heSBwbGFjZSBhIGdhcCBiZXR3ZWVuIHRoZSBzZWdtZW50cy4KLSAgICAgKi8KLSAgICBvYmpfZW1pdF9yZWxvY2F0aW9ucyAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIGRhdGFfZml4X3Jvb3QsIGRhdGEwX2ZyY2hhaW5QLT5mcmNoX3Jvb3QtPmZyX2FkZHJlc3MpOwotI2Vsc2UgLyogVENfSTk2MCAqLwotICAgIG9ial9lbWl0X3JlbG9jYXRpb25zICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgZGF0YV9maXhfcm9vdCwgdGV4dF9sYXN0X2ZyYWctPmZyX2FkZHJlc3MpOwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQotICAgIGtub3cgKChuZXh0X29iamVjdF9maWxlX2NoYXJQIC0gdGhlX29iamVjdF9maWxlKSA9PSAoSF9HRVRfSEVBREVSX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUgKCZoZWFkZXJzKSkpOwotCi0gICAgLyoKLSAgICAgKiBFbWl0IGxpbmUgbnVtYmVyIGVudHJpZXMuCi0gICAgICovCi0gICAgT0JKX0VNSVRfTElORU5PICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgbGluZW5vX3Jvb3RQLCB0aGVfb2JqZWN0X2ZpbGUpOwotICAgIGtub3cgKChuZXh0X29iamVjdF9maWxlX2NoYXJQIC0gdGhlX29iamVjdF9maWxlKSA9PSAoSF9HRVRfSEVBREVSX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0xJTkVOT19TSVpFICgmaGVhZGVycykpKTsKLQotICAgIC8qCi0gICAgICogRW1pdCBzeW1ib2xzLgotICAgICAqLwotICAgIG9ial9lbWl0X3N5bWJvbHMgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCBzeW1ib2xfcm9vdFApOwotICAgIGtub3cgKChuZXh0X29iamVjdF9maWxlX2NoYXJQIC0gdGhlX29iamVjdF9maWxlKSA9PSAoSF9HRVRfSEVBREVSX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0xJTkVOT19TSVpFICgmaGVhZGVycykgKyBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRSAoJmhlYWRlcnMpKSk7Ci0KLSAgICAvKgotICAgICAqIEVtaXQgc3RyaW5ncy4KLSAgICAgKi8KLQotICAgIGlmIChzdHJpbmdfYnl0ZV9jb3VudCA+IDApCi0gICAgICB7Ci0Jb2JqX2VtaXRfc3RyaW5ncyAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclApOwotICAgICAgfQkJCQkvKiBvbmx5IGlmIHdlIGhhdmUgYSBzdHJpbmcgdGFibGUgKi8KLQotI2lmZGVmIEJGRF9IRUFERVJTCi0gICAgYmZkX3NlZWsgKHN0ZG91dHB1dCwgMCwgMCk7Ci0gICAgYmZkX3dyaXRlICh0aGVfb2JqZWN0X2ZpbGUsIDEsIG9iamVjdF9maWxlX3NpemUsIHN0ZG91dHB1dCk7Ci0jZWxzZQotCi0gICAgLyogV3JpdGUgdGhlIGRhdGEgdG8gdGhlIGZpbGUgKi8KLSAgICBvdXRwdXRfZmlsZV9hcHBlbmQgKHRoZV9vYmplY3RfZmlsZSwgb2JqZWN0X2ZpbGVfc2l6ZSwgb3V0X2ZpbGVfbmFtZSk7Ci0gICAgZnJlZSAodGhlX29iamVjdF9maWxlKTsKLSNlbmRpZgotICB9CQkJCS8qIG5vbiB2bXMgb3V0cHV0ICovCi0jZWxzZSAvKiBPQkpfVk1TICovCi0gIC8qCi0gICAqCU5vdyBkbyB0aGUgVk1TLWRlcGVuZGVudCBwYXJ0IG9mIHdyaXRpbmcgdGhlIG9iamVjdCBmaWxlCi0gICAqLwotICB2bXNfd3JpdGVfb2JqZWN0X2ZpbGUgKEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpLAotCQkJIEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpLAotCQkJIEhfR0VUX0JTU19TSVpFICgmaGVhZGVycyksCi0JCQkgdGV4dF9mcmFnX3Jvb3QsIGRhdGFfZnJhZ19yb290KTsKLSNlbmRpZiAvKiBPQkpfVk1TICovCi0jZWxzZSAvKiBCRkRfQVNTRU1CTEVSICovCi0KLSAgLyogUmVzb2x2ZSBzeW1ib2wgdmFsdWVzLiAgVGhpcyBuZWVkcyB0byBiZSBkb25lIGJlZm9yZSBwcm9jZXNzaW5nCi0gICAgIHRoZSByZWxvY2F0aW9ucy4gICovCi0gIGlmIChzeW1ib2xfcm9vdFApCi0gICAgewotICAgICAgc3ltYm9sUyAqc3ltcDsKLQotICAgICAgZm9yIChzeW1wID0gc3ltYm9sX3Jvb3RQOyBzeW1wOyBzeW1wID0gc3ltYm9sX25leHQgKHN5bXApKQotCWlmICghc3ltcC0+c3lfcmVzb2x2ZWQpCi0JICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltcCwgMSk7Ci0gICAgfQotCi0gIFBST0dSRVNTICgxKTsKLQotI2lmZGVmIHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0Ci0gIHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0ICgpOwotI2VuZGlmCi0jaWZkZWYgb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0Ci0gIG9ial9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCAoKTsKLSNlbmRpZgotCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCBhZGp1c3RfcmVsb2Nfc3ltcywgKGNoYXIgKikwKTsKLQotICAvKiBTZXQgdXAgc3ltYm9sIHRhYmxlLCBhbmQgd3JpdGUgaXQgb3V0LiAgKi8KLSAgaWYgKHN5bWJvbF9yb290UCkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeW1wOwotCi0gICAgICBmb3IgKHN5bXAgPSBzeW1ib2xfcm9vdFA7IHN5bXA7IHN5bXAgPSBzeW1ib2xfbmV4dCAoc3ltcCkpCi0JewotCSAgaW50IHB1bnQgPSAwOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgaWYgKHN5bXAtPnN5X21yaV9jb21tb24pCi0JICAgIHsKLQkgICAgICBpZiAoU19JU19FWFRFUk5BTCAoc3ltcCkpCi0JCWFzX2JhZCAoXygiJXM6IGdsb2JhbCBzeW1ib2xzIG5vdCBzdXBwb3J0ZWQgaW4gY29tbW9uIHNlY3Rpb25zIiksCi0JCQlTX0dFVF9OQU1FIChzeW1wKSk7Ci0JICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltcCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgbmFtZSA9IFNfR0VUX05BTUUgKHN5bXApOwotCSAgaWYgKG5hbWUpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lMiA9IGRlY29kZV9sb2NhbF9sYWJlbF9uYW1lICgoY2hhciAqKVNfR0VUX05BTUUgKHN5bXApKTsKLQkgICAgICAvKiBUaGV5IG9ubHkgZGlmZmVyIGlmIGBuYW1lJyBpcyBhIGZiIG9yIGRvbGxhciBsb2NhbAotCQkgbGFiZWwgbmFtZS4gICovCi0JICAgICAgaWYgKG5hbWUyICE9IG5hbWUgJiYgISBTX0lTX0RFRklORUQgKHN5bXApKQotCQlhc19iYWQgKF8oImxvY2FsIGxhYmVsICVzIGlzIG5vdCBkZWZpbmVkIiksIG5hbWUyKTsKLQkgICAgfQotCi0JICAvKiBEbyBpdCBhZ2FpbiwgYmVjYXVzZSBhZGp1c3RfcmVsb2Nfc3ltcyBtaWdodCBpbnRyb2R1Y2UKLQkgICAgIG1vcmUgc3ltYm9scy4gIFRoZXknbGwgcHJvYmFibHkgb25seSBiZSBzZWN0aW9uIHN5bWJvbHMsCi0JICAgICBidXQgdGhleSdsbCBzdGlsbCBuZWVkIHRvIGhhdmUgdGhlIHZhbHVlcyBjb21wdXRlZC4gICovCi0JICBpZiAoISBzeW1wLT5zeV9yZXNvbHZlZCkKLQkgICAgewotCSAgICAgIGlmIChzeW1wLT5zeV92YWx1ZS5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICAvKiBUaGlzIGlzIHRoZSBub3JtYWwgY2FzZTsgc2tpcCB0aGUgY2FsbC4gICovCi0JCSAgU19TRVRfVkFMVUUgKHN5bXAsCi0JCQkgICAgICAgKFNfR0VUX1ZBTFVFIChzeW1wKQotCQkJCSsgc3ltcC0+c3lfZnJhZy0+ZnJfYWRkcmVzcykpOwotCQkgIHN5bXAtPnN5X3Jlc29sdmVkID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bXAsIDEpOwotCSAgICB9Ci0KLQkgIC8qIFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gdW5kZWZpbmVkIG9yIGNvbW1vbgotICAgICAgICAgICAgIHN5bWJvbHMuICAqLwotCSAgaWYgKHN5bXAtPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wKLQkgICAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bXApIHx8IFNfSVNfQ09NTU9OIChzeW1wKSkpCi0JICAgIHsKLQkgICAgICBzeW1ib2xfcmVtb3ZlIChzeW1wLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBTbyBmYXIsIGNvbW1vbiBzeW1ib2xzIGhhdmUgYmVlbiB0cmVhdGVkIGxpa2UgdW5kZWZpbmVkIHN5bWJvbHMuCi0JICAgICBQdXQgdGhlbSBpbiB0aGUgY29tbW9uIHNlY3Rpb24gbm93LiAgKi8KLQkgIGlmIChTX0lTX0RFRklORUQgKHN5bXApID09IDAKLQkgICAgICAmJiBTX0dFVF9WQUxVRSAoc3ltcCkgIT0gMCkKLQkgICAgU19TRVRfU0VHTUVOVCAoc3ltcCwgYmZkX2NvbV9zZWN0aW9uX3B0cik7Ci0jaWYgMAotCSAgcHJpbnRmICgic3ltYm9sIGAlcydcblx0QCV4OiB2YWx1ZT0lZCBmbGFncz0leCBzZWc9JXNcbiIsCi0JCSAgU19HRVRfTkFNRSAoc3ltcCksIHN5bXAsCi0JCSAgU19HRVRfVkFMVUUgKHN5bXApLAotCQkgIHN5bXAtPmJzeW0tPmZsYWdzLAotCQkgIHNlZ21lbnRfbmFtZSAoc3ltcC0+YnN5bS0+c2VjdGlvbikpOwotI2VuZGlmCi0KLSNpZmRlZiBvYmpfZnJvYl9zeW1ib2wKLQkgIG9ial9mcm9iX3N5bWJvbCAoc3ltcCwgcHVudCk7Ci0jZW5kaWYKLSNpZmRlZiB0Y19mcm9iX3N5bWJvbAotCSAgaWYgKCEgcHVudCB8fCBzeW1wLT5zeV91c2VkX2luX3JlbG9jKQotCSAgICB0Y19mcm9iX3N5bWJvbCAoc3ltcCwgcHVudCk7Ci0jZW5kaWYKLQotCSAgLyogSWYgd2UgZG9uJ3Qgd2FudCB0byBrZWVwIHRoaXMgc3ltYm9sLCBzcGxpY2UgaXQgb3V0IG9mCi0JICAgICB0aGUgY2hhaW4gbm93LiAgSWYgRU1JVF9TRUNUSU9OX1NZTUJPTFMgaXMgMCwgd2UgbmV2ZXIKLQkgICAgIHdhbnQgc2VjdGlvbiBzeW1ib2xzLiAgT3RoZXJ3aXNlLCB3ZSBza2lwIGxvY2FsIHN5bWJvbHMKLQkgICAgIGFuZCBzeW1ib2xzIHRoYXQgdGhlIGZyb2Jfc3ltYm9sIG1hY3JvcyB0b2xkIHVzIHRvIHB1bnQsCi0JICAgICBidXQgd2Uga2VlcCBzdWNoIHN5bWJvbHMgaWYgdGhleSBhcmUgdXNlZCBpbiByZWxvY3MuICAqLwotCSAgaWYgKCghIEVNSVRfU0VDVElPTl9TWU1CT0xTCi0JICAgICAgICYmIChzeW1wLT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLQkgICAgICAvKiBOb3RlIHRoYXQgU19JU19FWFRFUk4gYW5kIFNfSVNfTE9DQUwgYXJlIG5vdCBhbHdheXMKLQkJIG9wcG9zaXRlcy4gIFNvbWV0aW1lcyB0aGUgZm9ybWVyIGNoZWNrcyBmbGFncyBhbmQgdGhlCi0JCSBsYXR0ZXIgZXhhbWluZXMgdGhlIG5hbWUuLi4gICovCi0JICAgICAgfHwgKCFTX0lTX0VYVEVSTiAoc3ltcCkKLQkJICAmJiAoU19JU19MT0NBTCAoc3ltcCkgfHwgcHVudCkKLQkJICAmJiAhIHN5bXAtPnN5X3VzZWRfaW5fcmVsb2MpKQotCSAgICB7Ci0JICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltcCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICAgICAgLyogQWZ0ZXIgc3ltYm9sX3JlbW92ZSwgc3ltYm9sX25leHQoc3ltcCkgc3RpbGwgcmV0dXJucwotCQkgdGhlIG9uZSB0aGF0IGNhbWUgYWZ0ZXIgaXQgaW4gdGhlIGNoYWluLiAgU28gd2UgZG9uJ3QKLQkJIG5lZWQgdG8gZG8gYW55IGV4dHJhIGNsZWFudXAgd29yayBoZXJlLiAgKi8KLQotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIE1ha2Ugc3VyZSB3ZSByZWFsbHkgZ290IGEgdmFsdWUgZm9yIHRoZSBzeW1ib2wuICAqLwotCSAgaWYgKCEgc3ltcC0+c3lfcmVzb2x2ZWQpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImNhbid0IHJlc29sdmUgdmFsdWUgZm9yIHN5bWJvbCBcIiVzXCIiKSwKLQkJICAgICAgU19HRVRfTkFNRSAoc3ltcCkpOwotCSAgICAgIHN5bXAtPnN5X3Jlc29sdmVkID0gMTsKLQkgICAgfQotCi0JICAvKiBTZXQgdGhlIHZhbHVlIGludG8gdGhlIEJGRCBzeW1ib2wuICBVcCB0aWwgbm93IHRoZSB2YWx1ZQotCSAgICAgaGFzIG9ubHkgYmVlbiBrZXB0IGluIHRoZSBnYXMgc3ltYm9sUyBzdHJ1Y3QuICAqLwotCSAgc3ltcC0+YnN5bS0+dmFsdWUgPSBTX0dFVF9WQUxVRSAoc3ltcCk7Ci0JfQotICAgIH0KLQotICBQUk9HUkVTUyAoMSk7Ci0KLSAgLyogTm93IGRvIGFueSBmb3JtYXQtc3BlY2lmaWMgYWRqdXN0bWVudHMgdG8gdGhlIHN5bWJvbCB0YWJsZSwgc3VjaAotICAgICBhcyBhZGRpbmcgZmlsZSBzeW1ib2xzLiAgKi8KLSNpZmRlZiB0Y19hZGp1c3Rfc3ltdGFiCi0gIHRjX2FkanVzdF9zeW10YWIgKCk7Ci0jZW5kaWYKLSNpZmRlZiBvYmpfYWRqdXN0X3N5bXRhYgotICBvYmpfYWRqdXN0X3N5bXRhYiAoKTsKLSNlbmRpZgotCi0gIC8qIE5vdyB0aGF0IGFsbCB0aGUgc2l6ZXMgYXJlIGtub3duLCBhbmQgY29udGVudHMgY29ycmVjdCwgd2UgY2FuCi0gICAgIHN0YXJ0IHdyaXRpbmcgdG8gdGhlIGZpbGUuICAqLwotICBzZXRfc3ltdGFiICgpOwotCi0gIC8qIElmICpfZnJvYl9maWxlIGNoYW5nZXMgdGhlIHN5bWJvbCB2YWx1ZSBhdCB0aGlzIHBvaW50LCBpdCBpcwotICAgICByZXNwb25zaWJsZSBmb3IgbW92aW5nIHRoZSBjaGFuZ2VkIHZhbHVlIGludG8gc3ltcC0+YnN5bS0+dmFsdWUKLSAgICAgYXMgd2VsbC4gIEhvcGVmdWxseSBhbGwgc3ltYm9sIHZhbHVlIGNoYW5naW5nIGNhbiBiZSBkb25lIGluCi0gICAgICpfZnJvYl9zeW1ib2wuICAqLwotI2lmZGVmIHRjX2Zyb2JfZmlsZQotICB0Y19mcm9iX2ZpbGUgKCk7Ci0jZW5kaWYKLSNpZmRlZiBvYmpfZnJvYl9maWxlCi0gIG9ial9mcm9iX2ZpbGUgKCk7Ci0jZW5kaWYKLQotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgd3JpdGVfcmVsb2NzLCAoY2hhciAqKSAwKTsKLQotI2lmZGVmIHRjX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKLSAgdGNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAoKTsKLSNlbmRpZgotI2lmZGVmIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzCi0gIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzICgpOwotI2VuZGlmCi0KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIHdyaXRlX2NvbnRlbnRzLCAoY2hhciAqKSAwKTsKLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi19Ci0jZW5kaWYgLyogISBCRkQgKi8KLQotLyoKLSAqCQkJcmVsYXhfc2VnbWVudCgpCi0gKgotICogTm93IHdlIGhhdmUgYSBzZWdtZW50LCBub3QgYSBjcm93ZCBvZiBzdWItc2VnbWVudHMsIHdlIGNhbiBtYWtlIGZyX2FkZHJlc3MKLSAqIHZhbHVlcy4KLSAqCi0gKiBSZWxheCB0aGUgZnJhZ3MuCi0gKgotICogQWZ0ZXIgdGhpcywgYWxsIGZyYWdzIGluIHRoaXMgc2VnbWVudCBoYXZlIGFkZHJlc3NlcyB0aGF0IGFyZSBjb3JyZWN0Ci0gKiB3aXRoaW4gdGhlIHNlZ21lbnQuIFNpbmNlIHNlZ21lbnRzIGxpdmUgaW4gZGlmZmVyZW50IGZpbGUgYWRkcmVzc2VzLAotICogdGhlc2UgZnJhZyBhZGRyZXNzZXMgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyBmaW5hbCBvYmplY3QtZmlsZSBhZGRyZXNzZXMuCi0gKi8KLQotI2lmZGVmIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUKLQotc3RhdGljIGludCBpc19kbnJhbmdlIFBBUkFNUyAoKGZyYWdTICosIGZyYWdTICopKTsKLQotLyogU3Vicm91dGluZXMgb2YgcmVsYXhfc2VnbWVudC4gICovCi1zdGF0aWMgaW50Ci1pc19kbnJhbmdlIChmMSwgZjIpCi0gICAgIGZyYWdTICpmMTsKLSAgICAgZnJhZ1MgKmYyOwotewotICBmb3IgKDsgZjE7IGYxID0gZjEtPmZyX25leHQpCi0gICAgaWYgKGYxLT5mcl9uZXh0ID09IGYyKQotICAgICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBSZWxheCBhIGZyYWdtZW50IGJ5IHNjYW5uaW5nIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUuICAqLwotCi1sb25nCi1yZWxheF9mcmFnIChmcmFnUCwgc3RyZXRjaCkKLSAgICAgZnJhZ1MgKmZyYWdQOwotICAgICBsb25nIHN0cmV0Y2g7Ci17Ci0gIGNvbnN0IHJlbGF4X3R5cGVTICp0aGlzX3R5cGU7Ci0gIGNvbnN0IHJlbGF4X3R5cGVTICpzdGFydF90eXBlOwotICByZWxheF9zdWJzdGF0ZVQgbmV4dF9zdGF0ZTsKLSAgcmVsYXhfc3Vic3RhdGVUIHRoaXNfc3RhdGU7Ci0gIGxvbmcgYWltLCB0YXJnZXQsIGdyb3d0aDsKLSAgc3ltYm9sUyAqc3ltYm9sUCA9IGZyYWdQLT5mcl9zeW1ib2w7Ci0gIGxvbmcgb2Zmc2V0ID0gZnJhZ1AtPmZyX29mZnNldDsKLSAgLyogUmVjb21wdXRlIHdhc19hZGRyZXNzIGJ5IHVuZG9pbmcgIis9IHN0cmV0Y2giIGRvbmUgYnkgcmVsYXhfc2VnbWVudC4gICovCi0gIHVuc2lnbmVkIGxvbmcgd2FzX2FkZHJlc3MgPSBmcmFnUC0+ZnJfYWRkcmVzcyAtIHN0cmV0Y2g7Ci0gIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzOwotICBjb25zdCByZWxheF90eXBlUyAqdGFibGUgPSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFOwotCi0gIHRoaXNfc3RhdGUgPSBmcmFnUC0+ZnJfc3VidHlwZTsKLSAgc3RhcnRfdHlwZSA9IHRoaXNfdHlwZSA9IHRhYmxlICsgdGhpc19zdGF0ZTsKLSAgdGFyZ2V0ID0gb2Zmc2V0OwotCi0gIGlmIChzeW1ib2xQKQotICAgIHsKLSNpZm5kZWYgRElGRl9FWFBSX09LCi0jaWYgIWRlZmluZWQgKE1BTllfU0VHTUVOVFMpICYmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICAgICAga25vdyAoKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19BQlNPTFVURSkKLQkgICAgfHwgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19EQVRBKQotCSAgICB8fCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0JTUykKLQkgICAgfHwgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19URVhUKSk7Ci0jZW5kaWYKLSAgICAgIGtub3cgKHN5bWJvbFAtPnN5X2ZyYWcpOwotI2VuZGlmCi0gICAgICBrbm93ICghKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHx8IHN5bWJvbFAtPnN5X2ZyYWcgPT0gJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICAgIHRhcmdldCArPQotCVNfR0VUX1ZBTFVFIChzeW1ib2xQKQotCSAgKyBzeW1ib2xQLT5zeV9mcmFnLT5mcl9hZGRyZXNzOwotCi0gICAgICAvKiBJZiBmcmFnIGhhcyB5ZXQgdG8gYmUgcmVhY2hlZCBvbiB0aGlzIHBhc3MsCi0JIGFzc3VtZSBpdCB3aWxsIG1vdmUgYnkgU1RSRVRDSCBqdXN0IGFzIHdlIGRpZC4KLQkgSWYgdGhpcyBpcyBub3Qgc28sIGl0IHdpbGwgYmUgYmVjYXVzZSBzb21lIGZyYWcKLQkgYmV0d2VlbiBncm93cywgYW5kIHRoYXQgd2lsbCBmb3JjZSBhbm90aGVyIHBhc3MuCi0KLQkgQmV3YXJlIHplcm8tbGVuZ3RoIGZyYWdzLgotCi0JIFRoZXJlIHNob3VsZCBiZSBhIGZhc3RlciB3YXkgdG8gZG8gdGhpcy4gICovCi0KLSAgICAgIGlmIChzeW1ib2xQLT5zeV9mcmFnLT5mcl9hZGRyZXNzID49IHdhc19hZGRyZXNzCi0JICAmJiBpc19kbnJhbmdlIChmcmFnUCwgc3ltYm9sUC0+c3lfZnJhZykpCi0JewotCSAgdGFyZ2V0ICs9IHN0cmV0Y2g7Ci0JfQotICAgIH0KLQotICBhaW0gPSB0YXJnZXQgLSBhZGRyZXNzIC0gZnJhZ1AtPmZyX2ZpeDsKLSNpZmRlZiBUQ19QQ1JFTF9BREpVU1QKLSAgLyogQ3VycmVudGx5IG9ubHkgdGhlIG5zMzJrIGZhbWlseSBuZWVkcyB0aGlzICovCi0gIGFpbSArPSBUQ19QQ1JFTF9BREpVU1QoZnJhZ1ApOwotLyojZWxzZSovCi0gIC8qIFRoaXMgbWFjaGluZSBkb2Vzbid0IHdhbnQgdG8gdXNlIHBjcmVsX2FkanVzdC4KLSAgICAgSW4gdGhhdCBjYXNlLCBwY3JlbF9hZGp1c3Qgc2hvdWxkIGJlIHplcm8uICAqLwotLyogIGFzc2VydCAoZnJhZ1AtPmZyX3RhcmcubnMzMmsucGNyZWxfYWRqdXN0ID09IDApOyovCi0jZW5kaWYKLSNpZmRlZiBtZF9wcmVwYXJlX3JlbGF4X3NjYW4gLyogZm9ybWVybHkgY2FsbGVkIE02OEtfQUlNX0tMVURHRSAqLwotICBtZF9wcmVwYXJlX3JlbGF4X3NjYW4gKGZyYWdQLCBhZGRyZXNzLCBhaW0sIHRoaXNfc3RhdGUsIHRoaXNfdHlwZSk7Ci0jZW5kaWYKLQotICBpZiAoYWltIDwgMCkKLSAgICB7Ci0gICAgICAvKiBMb29rIGJhY2t3YXJkcy4gKi8KLSAgICAgIGZvciAobmV4dF9zdGF0ZSA9IHRoaXNfdHlwZS0+cmx4X21vcmU7IG5leHRfc3RhdGU7KQotCWlmIChhaW0gPj0gdGhpc190eXBlLT5ybHhfYmFja3dhcmQpCi0JICBuZXh0X3N0YXRlID0gMDsKLQllbHNlCi0JICB7Ci0JICAgIC8qIEdyb3cgdG8gbmV4dCBzdGF0ZS4gKi8KLQkgICAgdGhpc19zdGF0ZSA9IG5leHRfc3RhdGU7Ci0JICAgIHRoaXNfdHlwZSA9IHRhYmxlICsgdGhpc19zdGF0ZTsKLQkgICAgbmV4dF9zdGF0ZSA9IHRoaXNfdHlwZS0+cmx4X21vcmU7Ci0JICB9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTG9vayBmb3J3YXJkcy4gKi8KLSAgICAgIGZvciAobmV4dF9zdGF0ZSA9IHRoaXNfdHlwZS0+cmx4X21vcmU7IG5leHRfc3RhdGU7KQotCWlmIChhaW0gPD0gdGhpc190eXBlLT5ybHhfZm9yd2FyZCkKLQkgIG5leHRfc3RhdGUgPSAwOwotCWVsc2UKLQkgIHsKLQkgICAgLyogR3JvdyB0byBuZXh0IHN0YXRlLiAqLwotCSAgICB0aGlzX3N0YXRlID0gbmV4dF9zdGF0ZTsKLQkgICAgdGhpc190eXBlID0gdGFibGUgKyB0aGlzX3N0YXRlOwotCSAgICBuZXh0X3N0YXRlID0gdGhpc190eXBlLT5ybHhfbW9yZTsKLQkgIH0KLSAgICB9Ci0KLSAgZ3Jvd3RoID0gdGhpc190eXBlLT5ybHhfbGVuZ3RoIC0gc3RhcnRfdHlwZS0+cmx4X2xlbmd0aDsKLSAgaWYgKGdyb3d0aCAhPSAwKQotICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gdGhpc19zdGF0ZTsKLSAgcmV0dXJuIGdyb3d0aDsKLX0KLQotI2VuZGlmIC8qIGRlZmluZWQgKFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUpICovCi0KLS8qIFJlbGF4X2FsaWduLiBBZHZhbmNlIGxvY2F0aW9uIGNvdW50ZXIgdG8gbmV4dCBhZGRyZXNzIHRoYXQgaGFzICdhbGlnbm1lbnQnCi0gICBsb3dlc3Qgb3JkZXIgYml0cyBhbGwgMHMsIHJldHVybiBzaXplIG9mIGFkanVzdG1lbnQgbWFkZS4gICovCi1zdGF0aWMgcmVsYXhfYWRkcmVzc1QKLXJlbGF4X2FsaWduIChhZGRyZXNzLCBhbGlnbm1lbnQpCi0gICAgIHJlZ2lzdGVyIHJlbGF4X2FkZHJlc3NUIGFkZHJlc3M7CS8qIEFkZHJlc3Mgbm93LiAqLwotICAgICByZWdpc3RlciBpbnQgYWxpZ25tZW50OwkvKiBBbGlnbm1lbnQgKGJpbmFyeSkuICovCi17Ci0gIHJlbGF4X2FkZHJlc3NUIG1hc2s7Ci0gIHJlbGF4X2FkZHJlc3NUIG5ld19hZGRyZXNzOwotCi0gIG1hc2sgPSB+KCh+MCkgPDwgYWxpZ25tZW50KTsKLSAgbmV3X2FkZHJlc3MgPSAoYWRkcmVzcyArIG1hc2spICYgKH5tYXNrKTsKLSNpZmRlZiBMSU5LRVJfUkVMQVhJTkdfU0hSSU5LU19PTkxZCi0gIGlmIChsaW5rcmVsYXgpCi0gICAgLyogV2UgbXVzdCBwcm92aWRlIGxvdHMgb2YgcGFkZGluZywgc28gdGhlIGxpbmtlciBjYW4gZGlzY2FyZCBpdAotICAgICAgIHdoZW4gbmVlZGVkLiAgVGhlIGxpbmtlciB3aWxsIG5vdCBhZGQgZXh0cmEgc3BhY2UsIGV2ZXIuICAqLwotICAgIG5ld19hZGRyZXNzICs9ICgxIDw8IGFsaWdubWVudCk7Ci0jZW5kaWYKLSAgcmV0dXJuIChuZXdfYWRkcmVzcyAtIGFkZHJlc3MpOwotfQotCi12b2lkCi1yZWxheF9zZWdtZW50IChzZWdtZW50X2ZyYWdfcm9vdCwgc2VnbWVudCkKLSAgICAgc3RydWN0IGZyYWcgKnNlZ21lbnRfZnJhZ19yb290OwotICAgICBzZWdUIHNlZ21lbnQ7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBmcmFnICpmcmFnUDsKLSAgcmVnaXN0ZXIgcmVsYXhfYWRkcmVzc1QgYWRkcmVzczsKLSNpZiAhZGVmaW5lZCAoTUFOWV9TRUdNRU5UUykgJiYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gIGtub3cgKHNlZ21lbnQgPT0gU0VHX0RBVEEgfHwgc2VnbWVudCA9PSBTRUdfVEVYVCB8fCBzZWdtZW50ID09IFNFR19CU1MpOwotI2VuZGlmCi0gIC8qIEluIGNhc2UgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKSB3YW50cyB0byBtYWtlIGZpeFNzLiAqLwotICBzdWJzZWdfY2hhbmdlIChzZWdtZW50LCAwKTsKLQotICAvKiBGb3IgZWFjaCBmcmFnIGluIHNlZ21lbnQ6IGNvdW50IGFuZCBzdG9yZSAgKGEgMXN0IGd1ZXNzIG9mKQotICAgICBmcl9hZGRyZXNzLiAgKi8KLSAgYWRkcmVzcyA9IDA7Ci0gIGZvciAoZnJhZ1AgPSBzZWdtZW50X2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCi0gICAgewotICAgICAgZnJhZ1AtPmZyX2FkZHJlc3MgPSBhZGRyZXNzOwotICAgICAgYWRkcmVzcyArPSBmcmFnUC0+ZnJfZml4OwotCi0gICAgICBzd2l0Y2ggKGZyYWdQLT5mcl90eXBlKQotCXsKLQljYXNlIHJzX2ZpbGw6Ci0JICBhZGRyZXNzICs9IGZyYWdQLT5mcl9vZmZzZXQgKiBmcmFnUC0+ZnJfdmFyOwotCSAgYnJlYWs7Ci0KLQljYXNlIHJzX2FsaWduOgotCWNhc2UgcnNfYWxpZ25fY29kZToKLQkgIHsKLQkgICAgYWRkcmVzc1Qgb2Zmc2V0ID0gcmVsYXhfYWxpZ24gKGFkZHJlc3MsIChpbnQpIGZyYWdQLT5mcl9vZmZzZXQpOwotCi0JICAgIGlmIChmcmFnUC0+ZnJfc3VidHlwZSAhPSAwICYmIG9mZnNldCA+IGZyYWdQLT5mcl9zdWJ0eXBlKQotCSAgICAgIG9mZnNldCA9IDA7Ci0KLQkgICAgaWYgKG9mZnNldCAlIGZyYWdQLT5mcl92YXIgIT0gMCkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygiYWxpZ25tZW50IHBhZGRpbmcgKCVsdSBieXRlcykgbm90IGEgbXVsdGlwbGUgb2YgJWxkIiksCi0JCQkodW5zaWduZWQgbG9uZykgb2Zmc2V0LCAobG9uZykgZnJhZ1AtPmZyX3Zhcik7Ci0JCW9mZnNldCAtPSAob2Zmc2V0ICUgZnJhZ1AtPmZyX3Zhcik7Ci0JICAgICAgfQotCi0JICAgIGFkZHJlc3MgKz0gb2Zmc2V0OwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIHJzX29yZzoKLQljYXNlIHJzX3NwYWNlOgotCSAgLyogQXNzdW1lIC5vcmcgaXMgbnVnYXRvcnkuIEl0IHdpbGwgZ3JvdyB3aXRoIDFzdCByZWxheC4gICovCi0JICBicmVhazsKLQotCWNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0JICBhZGRyZXNzICs9IG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCk7Ci0JICBicmVhazsKLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi0JICAvKiBCcm9rZW4gd29yZHMgZG9uJ3QgY29uY2VybiB1cyB5ZXQgKi8KLQljYXNlIHJzX2Jyb2tlbl93b3JkOgotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWNhc2UgcnNfbGViMTI4OgotCSAgLyogSW5pdGlhbCBndWVzcyBpcyBhbHdheXMgMTsgZG9pbmcgb3RoZXJ3aXNlIGNhbiByZXN1bHQgaW4gCi0JICAgICBzdGFibGUgc29sdXRpb25zIHRoYXQgYXJlIGxhcmdlciB0aGFuIHRoZSBtaW5pbXVtLiAgKi8KLQkgIGFkZHJlc3MgKz0gZnJhZ1AtPmZyX29mZnNldCA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgcnNfY2ZhOgotCSAgYWRkcmVzcyArPSBlaF9mcmFtZV9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1ApOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgQkFEX0NBU0UgKGZyYWdQLT5mcl90eXBlKTsKLQkgIGJyZWFrOwotCX0JCQkvKiBzd2l0Y2goZnJfdHlwZSkgKi8KLSAgICB9CQkJCS8qIGZvciBlYWNoIGZyYWcgaW4gdGhlIHNlZ21lbnQgKi8KLQotICAvKiBEbyByZWxheCgpLiAgKi8KLSAgewotICAgIGxvbmcgc3RyZXRjaDsJLyogTWF5IGJlIGFueSBzaXplLCAwIG9yIG5lZ2F0aXZlLiAqLwotICAgIC8qIEN1bXVsYXRpdmUgbnVtYmVyIG9mIGFkZHJlc3NlcyB3ZSBoYXZlICovCi0gICAgLyogcmVsYXhlZCB0aGlzIHBhc3MuICovCi0gICAgLyogV2UgbWF5IGhhdmUgcmVsYXhlZCBtb3JlIHRoYW4gb25lIGFkZHJlc3MuICovCi0gICAgbG9uZyBzdHJldGNoZWQ7CS8qIEhhdmUgd2Ugc3RyZXRjaGVkIG9uIHRoaXMgcGFzcz8gKi8KLSAgICAvKiBUaGlzIGlzICdjdXogc3RyZXRjaCBtYXkgYmUgemVybywgd2hlbiwgaW4gZmFjdCBzb21lIHBpZWNlIG9mIGNvZGUKLSAgICAgICBncmV3LCBhbmQgYW5vdGhlciBzaHJhbmsuICBJZiBhIGJyYW5jaCBpbnN0cnVjdGlvbiBkb2Vzbid0IGZpdCBhbnltb3JlLAotICAgICAgIHdlIGNvdWxkIGJlIHNjcm9kLiAgKi8KLQotICAgIGRvCi0gICAgICB7Ci0Jc3RyZXRjaCA9IHN0cmV0Y2hlZCA9IDA7Ci0JZm9yIChmcmFnUCA9IHNlZ21lbnRfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKLQkgIHsKLQkgICAgbG9uZyBncm93dGggPSAwOwotCSAgICBhZGRyZXNzVCB3YXNfYWRkcmVzczsKLQkgICAgb2Zmc2V0VCBvZmZzZXQ7Ci0JICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLQkgICAgd2FzX2FkZHJlc3MgPSBmcmFnUC0+ZnJfYWRkcmVzczsKLQkgICAgYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICs9IHN0cmV0Y2g7Ci0JICAgIHN5bWJvbFAgPSBmcmFnUC0+ZnJfc3ltYm9sOwotCSAgICBvZmZzZXQgPSBmcmFnUC0+ZnJfb2Zmc2V0OwotCi0JICAgIHN3aXRjaCAoZnJhZ1AtPmZyX3R5cGUpCi0JICAgICAgewotCSAgICAgIGNhc2UgcnNfZmlsbDoJLyogLmZpbGwgbmV2ZXIgcmVsYXhlcy4gKi8KLQkJZ3Jvd3RoID0gMDsKLQkJYnJlYWs7Ci0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotCQkvKiBKRjogIFRoaXMgaXMgUk1TJ3MgaWRlYS4gIEkgZG8gKk5PVCogd2FudCB0byBiZSBibGFtZWQKLQkJICAgZm9yIGl0IEkgZG8gbm90IHdhbnQgdG8gd3JpdGUgaXQuICBJIGRvIG5vdCB3YW50IHRvIGhhdmUKLQkJICAgYW55dGhpbmcgdG8gZG8gd2l0aCBpdC4gIFRoaXMgaXMgbm90IHRoZSBwcm9wZXIgd2F5IHRvCi0JCSAgIGltcGxlbWVudCB0aGlzIG1pc2ZlYXR1cmUuICAqLwotCSAgICAgIGNhc2UgcnNfYnJva2VuX3dvcmQ6Ci0JCXsKLQkJICBzdHJ1Y3QgYnJva2VuX3dvcmQgKmxpZTsKLQkJICBzdHJ1Y3QgYnJva2VuX3dvcmQgKnVudHJ1dGg7Ci0KLQkJICAvKiBZZXMgdGhpcyBpcyB1Z2x5IChzdG9yaW5nIHRoZSBicm9rZW5fd29yZCBwb2ludGVyCi0JCSAgICAgaW4gdGhlIHN5bWJvbCBzbG90KS4gIFN0aWxsLCB0aGlzIHdob2xlIGNodW5rIG9mCi0JCSAgICAgY29kZSBpcyB1Z2x5LCBhbmQgSSBkb24ndCBmZWVsIGxpa2UgZG9pbmcgYW55dGhpbmcKLQkJICAgICBhYm91dCBpdC4gIFRoaW5rIG9mIGl0IGFzIHN0dWJib3JubmVzcyBpbiBhY3Rpb24uICAqLwotCQkgIGdyb3d0aCA9IDA7Ci0JCSAgZm9yIChsaWUgPSAoc3RydWN0IGJyb2tlbl93b3JkICopIChmcmFnUC0+ZnJfc3ltYm9sKTsKLQkJICAgICAgIGxpZSAmJiBsaWUtPmRpc3BmcmFnID09IGZyYWdQOwotCQkgICAgICAgbGllID0gbGllLT5uZXh0X2Jyb2tlbl93b3JkKQotCQkgICAgewotCi0JCSAgICAgIGlmIChsaWUtPmFkZGVkKQotCQkJY29udGludWU7Ci0KLQkJICAgICAgb2Zmc2V0ID0gKGxpZS0+YWRkLT5zeV9mcmFnLT5mcl9hZGRyZXNzCi0JCQkJKyBTX0dFVF9WQUxVRSAobGllLT5hZGQpCi0JCQkJKyBsaWUtPmFkZG51bQotCQkJCS0gKGxpZS0+c3ViLT5zeV9mcmFnLT5mcl9hZGRyZXNzCi0JCQkJICAgKyBTX0dFVF9WQUxVRSAobGllLT5zdWIpKSk7Ci0JCSAgICAgIGlmIChvZmZzZXQgPD0gLTMyNzY4IHx8IG9mZnNldCA+PSAzMjc2NykKLQkJCXsKLQkJCSAgaWYgKGZsYWdfd2Fybl9kaXNwbGFjZW1lbnQpCi0JCQkgICAgewotCQkJICAgICAgY2hhciBidWZbNTBdOwotCQkJICAgICAgc3ByaW50X3ZhbHVlIChidWYsIChhZGRyZXNzVCkgbGllLT5hZGRudW0pOwotCQkJICAgICAgYXNfd2FybiAoXygiLndvcmQgJXMtJXMrJXMgZGlkbid0IGZpdCIpLAotCQkJCSAgICAgICBTX0dFVF9OQU1FIChsaWUtPmFkZCksCi0JCQkJICAgICAgIFNfR0VUX05BTUUgKGxpZS0+c3ViKSwKLQkJCQkgICAgICAgYnVmKTsKLQkJCSAgICB9Ci0JCQkgIGxpZS0+YWRkZWQgPSAxOwotCQkJICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBmcmFnUC0+ZnJfc3VidHlwZSsrOwotCQkJICAgICAgZ3Jvd3RoICs9IG1kX3Nob3J0X2p1bXBfc2l6ZTsKLQkJCSAgICB9Ci0JCQkgIGZvciAodW50cnV0aCA9IGxpZS0+bmV4dF9icm9rZW5fd29yZDsKLQkJCSAgICAgICB1bnRydXRoICYmIHVudHJ1dGgtPmRpc3BmcmFnID09IGxpZS0+ZGlzcGZyYWc7Ci0JCQkgICAgICAgdW50cnV0aCA9IHVudHJ1dGgtPm5leHRfYnJva2VuX3dvcmQpCi0JCQkgICAgaWYgKCh1bnRydXRoLT5hZGQtPnN5X2ZyYWcgPT0gbGllLT5hZGQtPnN5X2ZyYWcpCi0JCQkJJiYgU19HRVRfVkFMVUUgKHVudHJ1dGgtPmFkZCkgPT0gU19HRVRfVkFMVUUgKGxpZS0+YWRkKSkKLQkJCSAgICAgIHsKLQkJCQl1bnRydXRoLT5hZGRlZCA9IDI7Ci0JCQkJdW50cnV0aC0+dXNlX2p1bXAgPSBsaWU7Ci0JCQkgICAgICB9Ci0JCQkgIGdyb3d0aCArPSBtZF9sb25nX2p1bXBfc2l6ZTsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGJyZWFrOwotCQl9CQkvKiBjYXNlIHJzX2Jyb2tlbl93b3JkICovCi0jZW5kaWYKLQkgICAgICBjYXNlIHJzX2FsaWduOgotCSAgICAgIGNhc2UgcnNfYWxpZ25fY29kZToKLQkJewotCQkgIGFkZHJlc3NUIG9sZG9mZiwgbmV3b2ZmOwotCi0JCSAgb2xkb2ZmID0gcmVsYXhfYWxpZ24gKHdhc19hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCwKLQkJCQkJKGludCkgb2Zmc2V0KTsKLQkJICBuZXdvZmYgPSByZWxheF9hbGlnbiAoYWRkcmVzcyArIGZyYWdQLT5mcl9maXgsCi0JCQkJCShpbnQpIG9mZnNldCk7Ci0KLQkJICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgaWYgKG9sZG9mZiA+IGZyYWdQLT5mcl9zdWJ0eXBlKQotCQkJb2xkb2ZmID0gMDsKLQkJICAgICAgaWYgKG5ld29mZiA+IGZyYWdQLT5mcl9zdWJ0eXBlKQotCQkJbmV3b2ZmID0gMDsKLQkJICAgIH0KLQotCQkgIGdyb3d0aCA9IG5ld29mZiAtIG9sZG9mZjsKLQkJfQotCQlicmVhazsKLQotCSAgICAgIGNhc2UgcnNfb3JnOgotCQl7Ci0JCSAgbG9uZyB0YXJnZXQgPSBvZmZzZXQ7Ci0JCSAgbG9uZyBhZnRlcjsKLQotCQkgIGlmIChzeW1ib2xQKQotCQkgICAgewotI2lmICFkZWZpbmVkIChNQU5ZX1NFR01FTlRTKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLQkJICAgICAga25vdyAoKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19BQlNPTFVURSkKLQkJCSAgICB8fCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0RBVEEpCi0JCQkgICAgfHwgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19URVhUKQotCQkJICAgIHx8IFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19CU1MpOwotCQkgICAgICBrbm93IChzeW1ib2xQLT5zeV9mcmFnKTsKLQkJICAgICAga25vdyAoIShTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfQUJTT0xVVEUpCi0JCQkgICAgfHwgKHN5bWJvbFAtPnN5X2ZyYWcgPT0gJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0jZW5kaWYKLQkJICAgICAgdGFyZ2V0ICs9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKQotCQkJKyBzeW1ib2xQLT5zeV9mcmFnLT5mcl9hZGRyZXNzOwotCQkgICAgfQkJLyogaWYgd2UgaGF2ZSBhIHN5bWJvbCAqLwotCi0JCSAga25vdyAoZnJhZ1AtPmZyX25leHQpOwotCQkgIGFmdGVyID0gZnJhZ1AtPmZyX25leHQtPmZyX2FkZHJlc3M7Ci0JCSAgZ3Jvd3RoID0gdGFyZ2V0IC0gYWZ0ZXI7Ci0JCSAgaWYgKGdyb3d0aCA8IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIEdyb3d0aCBtYXkgYmUgbmVnYXRpdmUsIGJ1dCB2YXJpYWJsZSBwYXJ0IG9mIGZyYWcKLQkJCSBjYW5ub3QgaGF2ZSBmZXdlciB0aGFuIDAgY2hhcnMuICBUaGF0IGlzLCB3ZSBjYW4ndAotCQkJIC5vcmcgYmFja3dhcmRzLiAqLwotCQkgICAgICBhc19iYWQgKF8oImF0dGVtcHQgdG8gLm9yZyBiYWNrd2FyZHMgaWdub3JlZCIpKTsKLQkJICAgICAgZ3Jvd3RoID0gMDsKLQkJICAgIH0KLQotCQkgIGdyb3d0aCAtPSBzdHJldGNoOwkvKiBUaGlzIGlzIGFuIGFic29sdXRlIGdyb3d0aCBmYWN0b3IgKi8KLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgY2FzZSByc19zcGFjZToKLQkJaWYgKHN5bWJvbFApCi0JCSAgewotCQkgICAgZ3Jvd3RoID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCQkgICAgaWYgKHN5bWJvbFAtPnN5X2ZyYWcgIT0gJnplcm9fYWRkcmVzc19mcmFnCi0JCQl8fCBTX0lTX0NPTU1PTiAoc3ltYm9sUCkKLQkJCXx8ICEgU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQkJICAgICAgYXNfYmFkX3doZXJlIChmcmFnUC0+ZnJfZmlsZSwgZnJhZ1AtPmZyX2xpbmUsCi0JCQkJICAgIF8oIi5zcGFjZSBzcGVjaWZpZXMgbm9uLWFic29sdXRlIHZhbHVlIikpOwotCQkgICAgZnJhZ1AtPmZyX3N5bWJvbCA9IDA7Ci0JCSAgICBpZiAoZ3Jvd3RoIDwgMCkKLQkJICAgICAgewotCQkJYXNfd2FybiAoXygiLnNwYWNlIG9yIC5maWxsIHdpdGggbmVnYXRpdmUgdmFsdWUsIGlnbm9yZWQiKSk7Ci0JCQlncm93dGggPSAwOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgZ3Jvd3RoID0gMDsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50OgotI2lmZGVmIG1kX3JlbGF4X2ZyYWcKLQkJZ3Jvd3RoID0gbWRfcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpOwotI2Vsc2UKLSNpZmRlZiBUQ19HRU5FUklDX1JFTEFYX1RBQkxFCi0JCS8qIFRoZSBkZWZhdWx0IHdheSB0byByZWxheCBhIGZyYWcgaXMgdG8gbG9vayB0aHJvdWdoCi0JCSAgIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUuICAqLwotCQlncm93dGggPSByZWxheF9mcmFnIChmcmFnUCwgc3RyZXRjaCk7Ci0jZW5kaWYgLyogVENfR0VORVJJQ19SRUxBWF9UQUJMRSAqLwotI2VuZGlmCi0JCWJyZWFrOwotCi0JICAgICAgY2FzZSByc19sZWIxMjg6Ci0JCXsKLQkJICB2YWx1ZVQgdmFsdWU7Ci0JCSAgaW50IHNpemU7Ci0KLQkJICB2YWx1ZSA9IHJlc29sdmVfc3ltYm9sX3ZhbHVlIChmcmFnUC0+ZnJfc3ltYm9sLCAwKTsKLQkJICBzaXplID0gc2l6ZW9mX2xlYjEyOCAodmFsdWUsIGZyYWdQLT5mcl9zdWJ0eXBlKTsKLQkJICBncm93dGggPSBzaXplIC0gZnJhZ1AtPmZyX29mZnNldDsKLQkJICBmcmFnUC0+ZnJfb2Zmc2V0ID0gc2l6ZTsKLQkJfQotCQlicmVhazsKLQotCSAgICAgIGNhc2UgcnNfY2ZhOgotCQlncm93dGggPSBlaF9mcmFtZV9yZWxheF9mcmFnIChmcmFnUCk7Ci0JCWJyZWFrOwotCi0JICAgICAgZGVmYXVsdDoKLQkJQkFEX0NBU0UgKGZyYWdQLT5mcl90eXBlKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBpZiAoZ3Jvd3RoKQotCSAgICAgIHsKLQkJc3RyZXRjaCArPSBncm93dGg7Ci0JCXN0cmV0Y2hlZCsrOwotCSAgICAgIH0KLQkgIH0JCQkvKiBGb3IgZWFjaCBmcmFnIGluIHRoZSBzZWdtZW50LiAqLwotICAgICAgfQotICAgIHdoaWxlIChzdHJldGNoZWQpOwkJLyogVW50aWwgbm90aGluZyBmdXJ0aGVyIHRvIHJlbGF4LiAqLwotICB9CQkJCS8qIGRvX3JlbGF4ICovCi0KLSAgLyoKLSAgICogV2Ugbm93IGhhdmUgdmFsaWQgZnJfYWRkcmVzcydlcyBmb3IgZWFjaCBmcmFnLgotICAgKi8KLQotICAvKgotICAgKiBBbGwgZnJfYWRkcmVzcydzIGFyZSBjb3JyZWN0LCByZWxhdGl2ZSB0byB0aGVpciBvd24gc2VnbWVudC4KLSAgICogV2UgaGF2ZSBtYWRlIGFsbCB0aGUgZml4UyB3ZSB3aWxsIGV2ZXIgbWFrZS4KLSAgICovCi19CQkJCS8qIHJlbGF4X3NlZ21lbnQoKSAqLwotCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgKCFkZWZpbmVkIChCRkQpICYmICFkZWZpbmVkIChPQkpfVk1TKSkKLQotI2lmbmRlZiBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAKLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKFgpICgxKQotI2VuZGlmCi0KLS8qIGZpeHVwX3NlZ21lbnQoKQotCi0gICBHbyB0aHJvdWdoIGFsbCB0aGUgZml4UydzIGluIGEgc2VnbWVudCBhbmQgc2VlIHdoaWNoIG9uZXMgY2FuIGJlCi0gICBoYW5kbGVkIG5vdy4gIChUaGVzZSBjb25zaXN0IG9mIGZpeFMgd2hlcmUgd2UgaGF2ZSBzaW5jZSBkaXNjb3ZlcmVkCi0gICB0aGUgdmFsdWUgb2YgYSBzeW1ib2wsIG9yIHRoZSBhZGRyZXNzIG9mIHRoZSBmcmFnIGludm9sdmVkLikKLSAgIEZvciBlYWNoIG9uZSwgY2FsbCBtZF9hcHBseV9maXggdG8gcHV0IHRoZSBmaXggaW50byB0aGUgZnJhZyBkYXRhLgotCi0gICBSZXN1bHQgaXMgYSBjb3VudCBvZiBob3cgbWFueSByZWxvY2F0aW9uIHN0cnVjdHMgd2lsbCBiZSBuZWVkZWQgdG8KLSAgIGhhbmRsZSB0aGUgcmVtYWluaW5nIGZpeFMncyB0aGF0IHdlIGNvdWxkbid0IGNvbXBsZXRlbHkgaGFuZGxlIGhlcmUuCi0gICBUaGVzZSB3aWxsIGJlIG91dHB1dCBsYXRlciBieSBlbWl0X3JlbG9jYXRpb25zKCkuICAqLwotCi1zdGF0aWMgbG9uZwotZml4dXBfc2VnbWVudCAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZpeFMgKmZpeFA7Ci0gICAgIHNlZ1QgdGhpc19zZWdtZW50X3R5cGU7CS8qIE5fVFlQRSBiaXRzIGZvciBzZWdtZW50LiAqLwotewotICBsb25nIHNlZ19yZWxvY19jb3VudCA9IDA7Ci0gIHN5bWJvbFMgKmFkZF9zeW1ib2xQOwotICBzeW1ib2xTICpzdWJfc3ltYm9sUDsKLSAgdmFsdWVUIGFkZF9udW1iZXI7Ci0gIGludCBzaXplOwotICBjaGFyICpwbGFjZTsKLSAgbG9uZyB3aGVyZTsKLSAgaW50IHBjcmVsLCBwbHQ7Ci0gIGZyYWdTICpmcmFnUDsKLSAgc2VnVCBhZGRfc3ltYm9sX3NlZ21lbnQgPSBhYnNvbHV0ZV9zZWN0aW9uOwotCi0gIC8qIElmIHRoZSBsaW5rZXIgaXMgZG9pbmcgdGhlIHJlbGF4aW5nLCB3ZSBtdXN0IG5vdCBkbyBhbnkgZml4dXBzLgotCi0gICAgIFdlbGwsIHN0cmljdGx5IHNwZWFraW5nIHRoYXQncyBub3QgdHJ1ZSAtLSB3ZSBjb3VsZCBkbyBhbnkgdGhhdCBhcmUKLSAgICAgUEMtcmVsYXRpdmUgYW5kIGRvbid0IGNyb3NzIHJlZ2lvbnMgdGhhdCBjb3VsZCBjaGFuZ2Ugc2l6ZS4gIEFuZCBmb3IgdGhlCi0gICAgIGk5NjAgKHRoZSBvbmx5IG1hY2hpbmUgZm9yIHdoaWNoIHdlJ3ZlIGdvdCBhIHJlbGF4aW5nIGxpbmtlciByaWdodCBub3cpLAotICAgICB3ZSBtaWdodCBiZSBhYmxlIHRvIHR1cm4gY2FsbHgvY2FsbGogaW50byBiYWwgYW55d2F5cyBpbiBjYXNlcyB3aGVyZSB3ZQotICAgICBrbm93IHRoZSBtYXhpbXVtIGRpc3BsYWNlbWVudC4gICovCi0gIGlmIChsaW5rcmVsYXgpCi0gICAgewotICAgICAgZm9yICg7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotCXNlZ19yZWxvY19jb3VudCsrOwotICAgICAgVENfQURKVVNUX1JFTE9DX0NPVU5UIChmaXhQLCBzZWdfcmVsb2NfY291bnQpOwotICAgICAgcmV0dXJuIHNlZ19yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgZm9yICg7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotICAgIHsKLQotI2lmZGVmIERFQlVHNQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG5wcm9jZXNzaW5nIGZpeHVwOlxuIik7Ci0gICAgICBwcmludF9maXh1cCAoZml4UCk7Ci0jZW5kaWYKLQotCi0gICAgICBmcmFnUCA9IGZpeFAtPmZ4X2ZyYWc7Ci0gICAgICBrbm93IChmcmFnUCk7Ci0gICAgICB3aGVyZSA9IGZpeFAtPmZ4X3doZXJlOwotICAgICAgcGxhY2UgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIHdoZXJlOwotICAgICAgc2l6ZSA9IGZpeFAtPmZ4X3NpemU7Ci0gICAgICBhZGRfc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5OwotI2lmZGVmIFRDX1ZBTElEQVRFX0ZJWAotICAgICAgVENfVkFMSURBVEVfRklYIChmaXhQLCB0aGlzX3NlZ21lbnRfdHlwZSwgc2tpcCk7Ci0jZW5kaWYKLSAgICAgIHN1Yl9zeW1ib2xQID0gZml4UC0+Znhfc3Vic3k7Ci0gICAgICBhZGRfbnVtYmVyID0gZml4UC0+Znhfb2Zmc2V0OwotICAgICAgcGNyZWwgPSBmaXhQLT5meF9wY3JlbDsKLSAgICAgIHBsdCA9IGZpeFAtPmZ4X3BsdDsKLQotICAgICAgaWYgKGFkZF9zeW1ib2xQICE9IE5VTEwKLQkgICYmIGFkZF9zeW1ib2xQLT5zeV9tcmlfY29tbW9uKQotCXsKLQkgIGtub3cgKGFkZF9zeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sKTsKLQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQkgIGZpeFAtPmZ4X29mZnNldCA9IGFkZF9udW1iZXI7Ci0JICBhZGRfc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5ID0gYWRkX3N5bWJvbFAtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbDsKLQl9Ci0KLSAgICAgIGlmIChhZGRfc3ltYm9sUCkKLQlhZGRfc3ltYm9sX3NlZ21lbnQgPSBTX0dFVF9TRUdNRU5UIChhZGRfc3ltYm9sUCk7Ci0KLSAgICAgIGlmIChzdWJfc3ltYm9sUCkKLQl7Ci0JICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ViX3N5bWJvbFAsIDEpOwotCSAgaWYgKGFkZF9zeW1ib2xQID09IE5VTEwgfHwgYWRkX3N5bWJvbF9zZWdtZW50ID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBpZiAoYWRkX3N5bWJvbFAgIT0gTlVMTCkKLQkJewotCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQkJICBhZGRfc3ltYm9sUCA9IE5VTEw7Ci0JCSAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQl9Ci0KLQkgICAgICAvKiBJdCdzIGp1c3QgLXN5bSAqLwotCSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkJewotCQkgIGFkZF9udW1iZXIgLT0gU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKTsKLQkJICBmaXhQLT5meF9zdWJzeSA9IE5VTEw7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChwY3JlbAotCQkgICAgICAgJiYgU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IHRoaXNfc2VnbWVudF90eXBlKQotCQl7Ci0JCSAgLyogU2hvdWxkIHRyeSBjb252ZXJ0aW5nIHRvIGEgY29uc3RhbnQuICAqLwotCQkgIGdvdG8gYmFkX3N1Yl9yZWxvYzsKLQkJfQotCSAgICAgIGVsc2UKLQkgICAgICBiYWRfc3ViX3JlbG9jOgotCQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICAgICBfKCJOZWdhdGl2ZSBvZiBub24tYWJzb2x1dGUgc3ltYm9sICVzIiksCi0JCQkgICAgICBTX0dFVF9OQU1FIChzdWJfc3ltYm9sUCkpOwotCSAgICB9Ci0JICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWRkX3N5bWJvbF9zZWdtZW50Ci0JCSAgICYmIFNFR19OT1JNQUwgKGFkZF9zeW1ib2xfc2VnbWVudCkpCi0JICAgIHsKLQkgICAgICAvKiBEaWZmZXJlbmNlIG9mIDIgc3ltYm9scyBmcm9tIHNhbWUgc2VnbWVudC4KLQkJIENhbid0IG1ha2UgZGlmZmVyZW5jZSBvZiAyIHVuZGVmaW5lZHM6ICd2YWx1ZScgbWVhbnMKLQkJIHNvbWV0aGluZyBkaWZmZXJlbnQgZm9yIE5fVU5ERi4gKi8KLSNpZmRlZiBUQ19JOTYwCi0JICAgICAgLyogTWFrZXMgbm8gc2Vuc2UgdG8gdXNlIHRoZSBkaWZmZXJlbmNlIG9mIDIgYXJiaXRyYXJ5IHN5bWJvbHMKLQkJIGFzIHRoZSB0YXJnZXQgb2YgYSBjYWxsIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpZiAoZml4UC0+ZnhfdGNiaXQpCi0JCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgICAgIF8oImNhbGxqIHRvIGRpZmZlcmVuY2Ugb2YgMiBzeW1ib2xzIikpOwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQkgICAgICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCkgLQotCQlTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApOwotCi0JICAgICAgYWRkX3N5bWJvbFAgPSBOVUxMOwotCSAgICAgIHBjcmVsID0gMDsJLyogTm8gZnVydGhlciBwY3JlbCBwcm9jZXNzaW5nLiAqLwotCi0JICAgICAgLyogTGV0IHRoZSB0YXJnZXQgbWFjaGluZSBtYWtlIHRoZSBmaW5hbCBkZXRlcm1pbmF0aW9uCi0JCSBhcyB0byB3aGV0aGVyIG9yIG5vdCBhIHJlbG9jYXRpb24gd2lsbCBiZSBuZWVkZWQgdG8KLQkJIGhhbmRsZSB0aGlzIGZpeHVwLiAgKi8KLQkgICAgICBpZiAoIVRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTiAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUpKQotCQl7Ci0JCSAgZml4UC0+ZnhfcGNyZWwgPSAwOwotCQkgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJICBmaXhQLT5meF9zdWJzeSA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRGlmZmVyZW50IHNlZ21lbnRzIGluIHN1YnRyYWN0aW9uLiAqLwotCSAgICAgIGtub3cgKCEoU19JU19FWFRFUk5BTCAoc3ViX3N5bWJvbFApCi0JCSAgICAgICYmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWJzb2x1dGVfc2VjdGlvbikpKTsKLQotCSAgICAgIGlmICgoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFic29sdXRlX3NlY3Rpb24pKQotCQlhZGRfbnVtYmVyIC09IFNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCk7Ci0KLSNpZmRlZiBESUZGX0VYUFJfT0sKLQkgICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gdGhpc19zZWdtZW50X3R5cGUKLSNpZiAwIC8qIERvIHRoaXMgZXZlbiBpZiBpdCdzIGFscmVhZHkgZGVzY3JpYmVkIGFzIHBjLXJlbGF0aXZlLiAgRm9yIGV4YW1wbGUsCi0JIG9uIHRoZSBtNjhrLCBhbiBvcGVyYW5kIG9mICJwY0AoZm9vLS4tMikiIHNob3VsZCBhZGRyZXNzICJmb28iIGluIGEKLQkgcGMtcmVsYXRpdmUgbW9kZS4gICovCi0JCSAgICAgICAmJiBwY3JlbAotI2VuZGlmCi0JCSAgICAgICApCi0JCXsKLQkJICAvKiBNYWtlIGl0IHBjLXJlbGF0aXZlLiAgKi8KLQkJICBhZGRfbnVtYmVyICs9IChNRF9QQ1JFTF9GUk9NX1NFQ1RJT04gKGZpeFAsIHRoaXNfc2VnbWVudF90eXBlKQotCQkJCSAtIFNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCkpOwotCQkgIHBjcmVsID0gMTsKLQkJICBmaXhQLT5meF9wY3JlbCA9IDE7Ci0JCSAgc3ViX3N5bWJvbFAgPSAwOwotCQkgIGZpeFAtPmZ4X3N1YnN5ID0gMDsKLQkJfQotI2VuZGlmCi0jaWZkZWYgVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0sKLQkgICAgICAvKiBUaGUgUEEgbmVlZHMgdGhpcyBmb3IgUElDIGNvZGUgZ2VuZXJhdGlvbi4gIFdlIGJhc2ljYWxseQotCQkgZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZyBpZiB3ZSBoYXZlIHRoZSBkaWZmZXJlbmNlIG9mIHR3bwotCQkgc3ltYm9scyBhdCB0aGlzIHBvaW50LiAgKi8KLQkgICAgICBlbHNlIGlmICgxKQotCQl7Ci0JCSAgLyogTGVhdmUgaXQgYWxvbmUuICAqLwotCQl9Ci0jZW5kaWYKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICAgICAgZWxzZSBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19HUFJFTDMyCi0JCSAgICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0dQUkVMMTYpCi0JCXsKLQkJICAvKiBMZWF2ZSBpdCBhbG9uZS4gICovCi0JCX0KLSNlbmRpZgotCSAgICAgIGVsc2UKLQkJewotCQkgIGNoYXIgYnVmWzUwXTsKLQkJICBzcHJpbnRfdmFsdWUgKGJ1ZiwgZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZSk7Ci0JCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJCV8oIlN1YnRyYWN0aW9uIG9mIHR3byBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWN0aW9ucyBcIiVzXCIgeyVzIHNlY3Rpb259IC0gXCIlc1wiIHslcyBzZWN0aW9ufSBhdCBmaWxlIGFkZHJlc3MgJXMuIiksCi0JCQkJU19HRVRfTkFNRSAoYWRkX3N5bWJvbFApLAotCQkJCXNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoYWRkX3N5bWJvbFApKSwKLQkJCQlTX0dFVF9OQU1FIChzdWJfc3ltYm9sUCksCi0JCQkJc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkpLAotCQkJCWJ1Zik7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKGFkZF9zeW1ib2xQKQotCXsKLQkgIGlmIChhZGRfc3ltYm9sX3NlZ21lbnQgPT0gdGhpc19zZWdtZW50X3R5cGUgJiYgcGNyZWwgJiYgIXBsdAotCSAgICAgICYmIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCAoZml4UCkpCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIFRoaXMgZml4dXAgd2FzIG1hZGUgd2hlbiB0aGUgc3ltYm9sJ3Mgc2VnbWVudCB3YXMKLQkgICAgICAgKiBTRUdfVU5LTk9XTiwgYnV0IGl0IGlzIG5vdyBpbiB0aGUgbG9jYWwgc2VnbWVudC4KLQkgICAgICAgKiBTbyB3ZSBrbm93IGhvdyB0byBkbyB0aGUgYWRkcmVzcyB3aXRob3V0IHJlbG9jYXRpb24uCi0JICAgICAgICovCi0jaWZkZWYgVENfSTk2MAotCSAgICAgIC8qIHJlbG9jX2NhbGxqKCkgbWF5IHJlcGxhY2UgYSAnY2FsbCcgd2l0aCBhICdjYWxscycgb3IgYQotCQkgJ2JhbCcsIGluIHdoaWNoIGNhc2VzIGl0IG1vZGlmaWVzICpmaXhQIGFzIGFwcHJvcHJpYXRlLgotCQkgSW4gdGhlIGNhc2Ugb2YgYSAnY2FsbHMnLCBubyBmdXJ0aGVyIHdvcmsgaXMgcmVxdWlyZWQsCi0JCSBhbmQgKmZpeFAgaGFzIGJlZW4gc2V0IHVwIHRvIG1ha2UgdGhlIHJlc3Qgb2YgdGhlIGNvZGUKLQkJIGJlbG93IGEgbm8tb3AuICovCi0JICAgICAgcmVsb2NfY2FsbGogKGZpeFApOwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQotCSAgICAgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQkgICAgICBhZGRfbnVtYmVyIC09IE1EX1BDUkVMX0ZST01fU0VDVElPTiAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUpOwotCSAgICAgIHBjcmVsID0gMDsJLyogTGllLiBEb24ndCB3YW50IGZ1cnRoZXIgcGNyZWwgcHJvY2Vzc2luZy4gKi8KLQotCSAgICAgIC8qIExldCB0aGUgdGFyZ2V0IG1hY2hpbmUgbWFrZSB0aGUgZmluYWwgZGV0ZXJtaW5hdGlvbgotCQkgYXMgdG8gd2hldGhlciBvciBub3QgYSByZWxvY2F0aW9uIHdpbGwgYmUgbmVlZGVkIHRvCi0JCSBoYW5kbGUgdGhpcyBmaXh1cC4gICovCi0JICAgICAgaWYgKCFUQ19GT1JDRV9SRUxPQ0FUSU9OIChmaXhQKSkKLQkJewotCQkgIGZpeFAtPmZ4X3BjcmVsID0gMDsKLQkJICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGFkZF9zeW1ib2xfc2VnbWVudCA9PSBhYnNvbHV0ZV9zZWN0aW9uCi0JCSAgJiYgISBwY3JlbCkKLQkJewotI2lmZGVmIFRDX0k5NjAKLQkJICAvKiBTZWUgY29tbWVudCBhYm91dCByZWxvY19jYWxsaigpIGFib3ZlLiAgKi8KLQkJICByZWxvY19jYWxsaiAoZml4UCk7Ci0jZW5kaWYgLyogVENfSTk2MCAqLwotCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQotCQkgIC8qIExldCB0aGUgdGFyZ2V0IG1hY2hpbmUgbWFrZSB0aGUgZmluYWwgZGV0ZXJtaW5hdGlvbgotCQkgICAgIGFzIHRvIHdoZXRoZXIgb3Igbm90IGEgcmVsb2NhdGlvbiB3aWxsIGJlIG5lZWRlZCB0bwotCQkgICAgIGhhbmRsZSB0aGlzIGZpeHVwLiAgKi8KLQotCQkgIGlmICghVENfRk9SQ0VfUkVMT0NBVElPTiAoZml4UCkpCi0JCSAgICB7Ci0JCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJICAgICAgYWRkX3N5bWJvbFAgPSBOVUxMOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoYWRkX3N5bWJvbF9zZWdtZW50ID09IHVuZGVmaW5lZF9zZWN0aW9uCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCQkgICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChhZGRfc3ltYm9sX3NlZ21lbnQpCi0jZW5kaWYKLQkJICAgICAgICkKLQkJewotI2lmZGVmIFRDX0k5NjAKLQkJICBpZiAoKGludCkgZml4UC0+ZnhfYml0X2ZpeFAgPT0gMTMpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgaXMgYSBDT0JSIGluc3RydWN0aW9uLiAgVGhleSBoYXZlIG9ubHkgYQotCQkgICAgICAgKiAxMy1iaXQgZGlzcGxhY2VtZW50IGFuZCBhcmUgb25seSB0byBiZSB1c2VkCi0JCSAgICAgICAqIGZvciBsb2NhbCBicmFuY2hlczogZmxhZyBhcyBlcnJvciwgZG9uJ3QgZ2VuZXJhdGUKLQkJICAgICAgICogcmVsb2NhdGlvbi4KLQkJICAgICAgICovCi0JCSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCQkgICAgXygiY2FuJ3QgdXNlIENPQlIgZm9ybWF0IHdpdGggZXh0ZXJuYWwgbGFiZWwiKSk7Ci0JCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJICAgICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQkJLyogQ09CUiAqLwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQotI2lmZGVmIE9CSl9DT0ZGCi0jaWZkZWYgVEVfSTM4NkFJWAotCQkgIGlmIChTX0lTX0NPTU1PTiAoYWRkX3N5bWJvbFApKQotCQkgICAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotI2VuZGlmIC8qIFRFX0kzODZBSVggKi8KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCQkgICsrc2VnX3JlbG9jX2NvdW50OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc2VnX3JlbG9jX2NvdW50Kys7Ci0jaWYgIShkZWZpbmVkIChUQ19WODUwKSAmJiBkZWZpbmVkIChPQkpfRUxGKSkKLSNpZiAhKGRlZmluZWQgKFRDX002OEspICYmIGRlZmluZWQgKE9CSl9FTEYpKQotI2lmICEoZGVmaW5lZCAoVENfQVJNKSAgJiYgZGVmaW5lZCAoT0JKX0VMRikpCi0jaWYgIWRlZmluZWQgKFRDX0kzODYpIHx8ICEoZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX0NPRkYpKSB8fCBkZWZpbmVkIChURV9QRSkKLQkJICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocGNyZWwpCi0JewotCSAgYWRkX251bWJlciAtPSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04gKGZpeFAsIHRoaXNfc2VnbWVudF90eXBlKTsKLQkgIGlmIChhZGRfc3ltYm9sUCA9PSAwKQotCSAgICB7Ci0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQkgICAgICBmaXhQLT5meF9hZGRzeSA9ICZhYnNfc3ltYm9sOwotI2Vsc2UKLQkgICAgICBmaXhQLT5meF9hZGRzeSA9IHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKTsKLSNlbmRpZgotCSAgICAgIGZpeFAtPmZ4X2FkZHN5LT5zeV91c2VkX2luX3JlbG9jID0gMTsKLQkgICAgICArK3NlZ19yZWxvY19jb3VudDsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCFmaXhQLT5meF9kb25lKQotCXsKLSNpZmRlZiBNRF9BUFBMWV9GSVgzCi0JICBtZF9hcHBseV9maXgzIChmaXhQLCAmYWRkX251bWJlciwgdGhpc19zZWdtZW50X3R5cGUpOwotI2Vsc2UKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICBtZF9hcHBseV9maXggKGZpeFAsICZhZGRfbnVtYmVyKTsKLSNlbHNlCi0JICBtZF9hcHBseV9maXggKGZpeFAsIGFkZF9udW1iZXIpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBUQ19IQU5ETEVTX0ZYX0RPTkUKLQkgIC8qIElmIHRoZSB0Yy0qIGZpbGVzIGhhdmVuJ3QgYmVlbiBjb252ZXJ0ZWQsIGFzc3VtZSBpdCdzIGhhbmRsaW5nCi0JICAgICBpdCB0aGUgb2xkIHdheSwgd2hlcmUgYSBudWxsIGZ4X2FkZHN5IG1lYW5zIHRoYXQgdGhlIGZpeCBoYXMKLQkgICAgIGJlZW4gYXBwbGllZCBjb21wbGV0ZWx5LCBhbmQgbm8gZnVydGhlciB3b3JrIGlzIG5lZWRlZC4gICovCi0JICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gMCAmJiBmaXhQLT5meF9wY3JlbCA9PSAwKQotCSAgICBmaXhQLT5meF9kb25lID0gMTsKLSNlbmRpZgotCX0KLQotICAgICAgaWYgKCFmaXhQLT5meF9iaXRfZml4UCAmJiAhZml4UC0+Znhfbm9fb3ZlcmZsb3cgJiYgc2l6ZSA+IDApCi0JewotCSAgaWYgKChzaXplX3QpIHNpemUgPCBzaXplb2YgKHZhbHVlVCkpCi0JICAgIHsKLQkgICAgICB2YWx1ZVQgbWFzaywgaGliaXQ7Ci0KLQkgICAgICAvKiBzZXQgYWxsIGJpdHMgdG8gb25lICovCi0JICAgICAgbWFzayA9IDA7Ci0JICAgICAgbWFzay0tOwotCSAgICAgIC8qIFRlY2huaWNhbGx5LCBjb21iaW5pbmcgdGhlc2UgcHJvZHVjZXMgYW4gdW5kZWZpbmVkIHJlc3VsdAotCQkgaWYgc2l6ZSBpcyBzaXplb2YgKHZhbHVlVCksIHRob3VnaCBJIHRoaW5rIHRoZXNlIHR3bwotCQkgaGFsZi13YXkgb3BlcmF0aW9ucyBzaG91bGQgYm90aCBiZSBkZWZpbmVkLiAgQW5kIHRoZQotCQkgY29tcGlsZXIgc2hvdWxkIGJlIGFibGUgdG8gY29tYmluZSB0aGVtIGlmIGl0J3MgdmFsaWQgb24KLQkJIHRoZSBob3N0IGFyY2hpdGVjdHVyZS4gICovCi0JICAgICAgbWFzayA8PD0gc2l6ZSAqIDQ7Ci0JICAgICAgbWFzayA8PD0gc2l6ZSAqIDQ7Ci0JICAgICAgaGliaXQgPSAodmFsdWVUKSAxIDw8IChzaXplICogOCAtIDEpOwotCSAgICAgIGlmICgoKGFkZF9udW1iZXIgJiBtYXNrKSAhPSAwCi0JCSAgIHx8IChmaXhQLT5meF9zaWduZWQKLQkJICAgICAgICYmIChhZGRfbnVtYmVyICYgaGliaXQpICE9IDApKQotCQkgICYmICgoYWRkX251bWJlciAmIG1hc2spICE9IG1hc2sKLQkJICAgICAgfHwgKGFkZF9udW1iZXIgJiBoaWJpdCkgPT0gMCkpCi0JCXsKLQkJICBjaGFyIGJ1Zls1MF0sIGJ1ZjJbNTBdOwotCQkgIHNwcmludF92YWx1ZSAoYnVmLCBmcmFnUC0+ZnJfYWRkcmVzcyArIHdoZXJlKTsKLQkJICBpZiAoYWRkX251bWJlciA+IDEwMDApCi0JCSAgICBzcHJpbnRfdmFsdWUgKGJ1ZjIsIGFkZF9udW1iZXIpOwotCQkgIGVsc2UKLQkJICAgIHNwcmludGYgKGJ1ZjIsICIlbGQiLCAobG9uZykgYWRkX251bWJlcik7Ci0JCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJCV8oIlZhbHVlIG9mICVzIHRvbyBsYXJnZSBmb3IgZmllbGQgb2YgJWQgYnl0ZXMgYXQgJXMiKSwKLQkJCQlidWYyLCBzaXplLCBidWYpOwotCQl9IC8qIGdlbmVyaWMgZXJyb3IgY2hlY2tpbmcgKi8KLQkgICAgfQotI2lmZGVmIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQKLQkgIC8qIFdhcm4gaWYgYSAud29yZCB2YWx1ZSBpcyB0b28gbGFyZ2Ugd2hlbiB0cmVhdGVkIGFzIGEgc2lnbmVkCi0JICAgICBudW1iZXIuICBXZSBhbHJlYWR5IGtub3cgaXQgaXMgbm90IHRvbyBuZWdhdGl2ZS4gIFRoaXMgaXMgdG8KLQkgICAgIGNhdGNoIG92ZXItbGFyZ2Ugc3dpdGNoZXMgZ2VuZXJhdGVkIGJ5IGdjYyBvbiB0aGUgNjhrLiAgKi8KLQkgIGlmICghZmxhZ19zaWduZWRfb3ZlcmZsb3dfb2sKLQkgICAgICAmJiBzaXplID09IDIKLQkgICAgICAmJiBhZGRfbnVtYmVyID4gMHg3ZmZmKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oIlNpZ25lZCAud29yZCBvdmVyZmxvdzsgc3dpdGNoIG1heSBiZSB0b28gbGFyZ2U7ICVsZCBhdCAweCVseCIpLAotCQkJICAobG9uZykgYWRkX251bWJlciwKLQkJCSAgKHVuc2lnbmVkIGxvbmcpIChmcmFnUC0+ZnJfYWRkcmVzcyArIHdoZXJlKSk7Ci0jZW5kaWYKLQl9CQkJLyogbm90IGEgYml0IGZpeCAqLwotCi0jaWZkZWYgVENfVkFMSURBVEVfRklYCi0gICAgc2tpcDogOwotI2VuZGlmCi0jaWZkZWYgREVCVUc1Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJyZXN1bHQ6XG4iKTsKLSAgICAgIHByaW50X2ZpeHVwIChmaXhQKTsKLSNlbmRpZgotICAgIH0JCQkJLyogRm9yIGVhY2ggZml4UyBpbiB0aGlzIHNlZ21lbnQuICovCi0KLSAgVENfQURKVVNUX1JFTE9DX0NPVU5UIChmaXhQLCBzZWdfcmVsb2NfY291bnQpOwotICByZXR1cm4gc2VnX3JlbG9jX2NvdW50OwotfQotCi0jZW5kaWYgLyogZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgKCFkZWZpbmVkIChCRkQpICYmICFkZWZpbmVkIChPQkpfVk1TKSkgKi8KLQotdm9pZAotbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIGlmICgoc2l6ZV90KSBuID4gc2l6ZW9mICh2YWwpIHx8IG4gPD0gMCkKLSAgICBhYm9ydCAoKTsKLSAgd2hpbGUgKG4tLSkKLSAgICB7Ci0gICAgICBidWZbbl0gPSB2YWwgJiAweGZmOwotICAgICAgdmFsID4+PSA4OwotICAgIH0KLX0KLQotdm9pZAotbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIGlmICgoc2l6ZV90KSBuID4gc2l6ZW9mICh2YWwpIHx8IG4gPD0gMCkKLSAgICBhYm9ydCAoKTsKLSAgd2hpbGUgKG4tLSkKLSAgICB7Ci0gICAgICAqYnVmKysgPSB2YWwgJiAweGZmOwotICAgICAgdmFsID4+PSA4OwotICAgIH0KLX0KLQotdm9pZAotd3JpdGVfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSkKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgZnByaW50ZiAoZmlsZSwgImZpeHVwczogJWRcbiIsIG5fZml4dXBzKTsKLX0KLQotLyogZm9yIGRlYnVnZ2luZyAqLwotZXh0ZXJuIGludCBpbmRlbnRfbGV2ZWw7Ci0KLXZvaWQKLXByaW50X2ZpeHVwIChmaXhwKQotICAgICBmaXhTICpmaXhwOwotewotICBpbmRlbnRfbGV2ZWwgPSAxOwotICBmcHJpbnRmIChzdGRlcnIsICJmaXggJWx4ICVzOiVkIiwgKGxvbmcpIGZpeHAsIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIHBjcmVsIik7Ci0gIGlmIChmaXhwLT5meF9wY3JlbF9hZGp1c3QpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIHBjcmVsX2FkanVzdD0lZCIsIGZpeHAtPmZ4X3BjcmVsX2FkanVzdCk7Ci0gIGlmIChmaXhwLT5meF9pbV9kaXNwKQotICAgIHsKLSNpZmRlZiBUQ19OUzMySwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIGltX2Rpc3A9JWQiLCBmaXhwLT5meF9pbV9kaXNwKTsKLSNlbHNlCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgaW1fZGlzcCIpOwotI2VuZGlmCi0gICAgfQotICBpZiAoZml4cC0+ZnhfdGNiaXQpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIHRjYml0Iik7Ci0gIGlmIChmaXhwLT5meF9kb25lKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiBkb25lIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlxuICAgIHNpemU9JWQgZnJhZz0lbHggd2hlcmU9JWxkIG9mZnNldD0lbHggYWRkbnVtYmVyPSVseCIsCi0JICAgZml4cC0+Znhfc2l6ZSwgKGxvbmcpIGZpeHAtPmZ4X2ZyYWcsIChsb25nKSBmaXhwLT5meF93aGVyZSwKLQkgICAobG9uZykgZml4cC0+Znhfb2Zmc2V0LCAobG9uZykgZml4cC0+ZnhfYWRkbnVtYmVyKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuICAgICVzICglZCkiLCBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4cC0+Znhfcl90eXBlKSwKLQkgICBmaXhwLT5meF9yX3R5cGUpOwotI2Vsc2UKLSNpZmRlZiBORUVEX0ZYX1JfVFlQRQotICBmcHJpbnRmIChzdGRlcnIsICIgcl90eXBlPSVkIiwgZml4cC0+Znhfcl90eXBlKTsKLSNlbmRpZgotI2VuZGlmCi0gIGlmIChmaXhwLT5meF9hZGRzeSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiAgICs8Iik7Ci0gICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoc3RkZXJyLCBmaXhwLT5meF9hZGRzeSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICI+Iik7Ci0gICAgfQotICBpZiAoZml4cC0+Znhfc3Vic3kpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4gICAtPCIpOwotICAgICAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKHN0ZGVyciwgZml4cC0+Znhfc3Vic3kpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiPiIpOwotICAgIH0KLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSNpZmRlZiBUQ19GSVhfREFUQV9QUklOVAotICBUQ19GSVhfREFUQV9QUklOVCAoc3RkZXJyLCBmaXhwKTsKLSNlbmRpZgotfQotCi0vKiBlbmQgb2Ygd3JpdGUuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3dyaXRlLmggYi9nYXMvd3JpdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg2ZDJhZC4uMDAwMDAwMAotLS0gYS9nYXMvd3JpdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKiB3cml0ZS5oCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfX3dyaXRlX2hfXwotI2RlZmluZSBfX3dyaXRlX2hfXwotCi0jaWZuZGVmIFRDX0k5NjAKLSNpZmRlZiBocHV4Ci0jZGVmaW5lIEVYRUNfTUFDSElORV9UWVBFIEhQOTAwMFMyMDBfSUQKLSNlbmRpZgotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNpZm5kZWYgTE9DQUxfTEFCRUwKLSNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgKG5hbWUgWzBdID09ICdMJyApCi0jZW5kaWYKLQotI2RlZmluZSBTX0xPQ0FMX05BTUUocykgKExPQ0FMX0xBQkVMIChTX0dFVF9OQU1FIChzKSkpCi0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotLyogVGhpcyBpcyB0aGUgbmFtZSBvZiBhIGZha2Ugc3ltYm9sIHdoaWNoIHdpbGwgbmV2ZXIgYXBwZWFyIGluIHRoZQotICAgYXNzZW1ibGVyIG91dHB1dC4gIFNfSVNfTE9DQUwgZGV0ZWN0cyBpdCBiZWNhdXNlIG9mIHRoZSBcMDAxLiAgKi8KLSNkZWZpbmUgRkFLRV9MQUJFTF9OQU1FICJMMFwwMDEiCi0KLSNpbmNsdWRlICJiaXRfZml4LmgiCi0KLS8qCi0gKiBGaXhTcyBtYXkgYmUgYnVpbHQgdXAgaW4gYW55IG9yZGVyLgotICovCi0KLXN0cnVjdCBmaXgKLXsKLSAgLyogVGhlc2Ugc21hbGwgZmllbGRzIGFyZSBncm91cGVkIHRvZ2V0aGVyIGZvciBjb21wYWN0bmVzcyBvZgotICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIGVmZmljaWVuY3kgb2YgYWNjZXNzIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcy4gICovCi0KLSAgLyogcGMtcmVsYXRpdmUgb2Zmc2V0IGFkanVzdCAob25seSB1c2VkIGJ5IG02OGspICovCi0gIGNoYXIgZnhfcGNyZWxfYWRqdXN0OwotCi0gIC8qIEhvdyBtYW55IGJ5dGVzIGFyZSBpbnZvbHZlZD8gKi8KLSAgdW5zaWduZWQgY2hhciBmeF9zaXplOwotCi0gIC8qIElzIHRoaXMgYSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uPyAgKi8KLSAgdW5zaWduZWQgZnhfcGNyZWwgOiAxOwotCi0gIC8qIElzIHRoaXMgYSByZWxvY2F0aW9uIHRvIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnk/ICBJZiBzbywKLSAgICAgc29tZSBvZiB0aGUgcmVkdWN0aW9ucyB3ZSB0cnkgdG8gYXBwbHkgYXJlIGludmFsaWQuICBBIGJldHRlciB3YXkKLSAgICAgbWlnaHQgYmUgdG8gcmVwcmVzZW50IFBMVCBlbnRyaWVzIHdpdGggZGlmZmVyZW50IGtpbmRzIG9mCi0gICAgIHN5bWJvbHMsIGFuZCB1c2Ugbm9ybWFsIHJlbG9jYXRpb25zICh3aXRoIHVuZGVmaW5lZCBzeW1ib2xzKTsKLSAgICAgbG9vayBpbnRvIGl0IGZvciB2ZXJzaW9uIDIuNi4gICovCi0gIHVuc2lnbmVkIGZ4X3BsdCA6IDE7Ci0KLSAgLyogSXMgdGhpcyB2YWx1ZSBhbiBpbW1lZGlhdGUgZGlzcGxhY2VtZW50PyAgKi8KLSAgLyogT25seSB1c2VkIG9uIGk5NjAgYW5kIG5zMzJrOyBtZXJnZSBpdCBpbnRvIFRDX0ZJWF9UWVBFIHNvbWV0aW1lLiAgKi8KLSAgdW5zaWduZWQgZnhfaW1fZGlzcCA6IDI7Ci0KLSAgLyogQSBiaXQgZm9yIHRoZSBDUFUgc3BlY2lmaWMgY29kZS4KLSAgICAgVGhpcyBwcm9iYWJseSBjYW4gYmUgZm9sZGVkIGludG8gdGNfZml4X2RhdGEsIGJlbG93LiAgKi8KLSAgdW5zaWduZWQgZnhfdGNiaXQgOiAxOwotCi0gIC8qIEhhcyB0aGlzIHJlbG9jYXRpb24gYWxyZWFkeSBiZWVuIGFwcGxpZWQ/ICAqLwotICB1bnNpZ25lZCBmeF9kb25lIDogMTsKLQotICAvKiBTdXBwcmVzcyBvdmVyZmxvdyBjb21wbGFpbnRzIG9uIGxhcmdlIGFkZGVuZHMuICBUaGlzIGlzIHVzZWQKLSAgICAgaW4gdGhlIFBvd2VyUEMgRUxGIGNvbmZpZyB0byBhbGxvdyBsYXJnZSBhZGRlbmRzIG9uIHRoZQotICAgICBCRkRfUkVMT0Nfe0xPMTYsSEkxNixISTE2X1N9IHJlbG9jYXRpb25zLgotCi0gICAgIEBAIENhbiB0aGlzIGJlIGRldGVybWluZWQgZnJvbSBCRkQ/ICAqLwotICB1bnNpZ25lZCBmeF9ub19vdmVyZmxvdyA6IDE7Ci0KLSAgLyogVGhlIHZhbHVlIGlzIHNpZ25lZCB3aGVuIGNoZWNraW5nIGZvciBvdmVyZmxvdy4gICovCi0gIHVuc2lnbmVkIGZ4X3NpZ25lZCA6IDE7Ci0KLSAgLyogV2hpY2ggZnJhZyBkb2VzIHRoaXMgZml4IGFwcGx5IHRvPyAgKi8KLSAgZnJhZ1MgKmZ4X2ZyYWc7Ci0KLSAgLyogV2hlcmUgaXMgdGhlIGZpcnN0IGJ5dGUgdG8gZml4IHVwPyAgKi8KLSAgbG9uZyBmeF93aGVyZTsKLQotICAvKiBOVUxMIG9yIFN5bWJvbCB3aG9zZSB2YWx1ZSB3ZSBhZGQgaW4uICovCi0gIHN5bWJvbFMgKmZ4X2FkZHN5OwotCi0gIC8qIE5VTEwgb3IgU3ltYm9sIHdob3NlIHZhbHVlIHdlIHN1YnRyYWN0LiAqLwotICBzeW1ib2xTICpmeF9zdWJzeTsKLQotICAvKiBBYnNvbHV0ZSBudW1iZXIgd2UgYWRkIGluLiAqLwotICB2YWx1ZVQgZnhfb2Zmc2V0OwotCi0gIC8qIE5leHQgZml4UyBpbiBsaW5rZWQgbGlzdCwgb3IgTlVMTC4gICovCi0gIHN0cnVjdCBmaXggKmZ4X25leHQ7Ci0KLSAgLyogSWYgTlVMTCwgbm8gYml0Zml4J3MgdG8gZG8uICAqLwotICAvKiBPbmx5IGk5NjAtY29mZiBhbmQgbnMzMmsgdXNlIHRoaXMsIGFuZCBpOTYwLWNvZmYgc3RvcmVzIGFuCi0gICAgIGludGVnZXIuICBUaGlzIGNhbiBwcm9iYWJseSBiZSBmb2xkZWQgaW50byB0Y19maXhfZGF0YSwgYmVsb3cuCi0gICAgIEBAIEFscGhhIGFsc28gdXNlcyBpdCwgYnV0IG9ubHkgdG8gZGlzYWJsZSBjZXJ0YWluIHJlbG9jYXRpb24KLSAgICAgcHJvY2Vzc2luZy4gICovCi0gIGJpdF9maXhTICpmeF9iaXRfZml4UDsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGZ4X3JfdHlwZTsKLSNlbHNlCi0jaWZkZWYgTkVFRF9GWF9SX1RZUEUKLSAgLyogSGFjayBmb3IgbWFjaGluZXMgd2hlcmUgdGhlIHR5cGUgb2YgcmVsb2MgY2FuJ3QgYmUKLSAgICAgd29ya2VkIG91dCBieSBsb29raW5nIGF0IGhvdyBiaWcgaXQgaXMuICAqLwotICBpbnQgZnhfcl90eXBlOwotI2VuZGlmCi0jZW5kaWYKLQotICAvKiBUaGlzIGZpZWxkIGlzIHNvcnQgb2YgbWlzbmFtZWQuICBJdCBhcHBlYXJzIHRvIGJlIGEgc29ydCBvZiByYW5kb20KLSAgICAgc2NyYXRjaCBmaWVsZCwgZm9yIHVzZSBieSB0aGUgYmFjayBlbmRzLiAgVGhlIG1haW4gZ2FzIGNvZGUgZG9lc24ndAotICAgICBkbyBhbnl0aGluZyBidXQgaW5pdGlhbGl6ZSBpdCB0byB6ZXJvLiAgVGhlIHVzZSBvZiBpdCBkb2VzIG5lZWQgdG8KLSAgICAgYmUgY29vcmRpbmF0ZWQgYmV0d2VlbiB0aGUgY3B1IGFuZCBmb3JtYXQgZmlsZXMsIHRob3VnaC4gIEUuZy4sIHNvbWUKLSAgICAgY29mZiB0YXJnZXRzIHBhc3MgdGhlIGBhZGRlbmQnIGZpZWxkIGZyb20gdGhlIGNwdSBmaWxlIHZpYSB0aGlzCi0gICAgIGZpZWxkLiAgSSBkb24ndCBrbm93IHdoeSB0aGUgYGZ4X29mZnNldCcgZmllbGQgYWJvdmUgY2FuJ3QgYmUgdXNlZAotICAgICBmb3IgdGhhdDsgaW52ZXN0aWdhdGUgbGF0ZXIgYW5kIGRvY3VtZW50LiBLUiAgKi8KLSAgdmFsdWVUIGZ4X2FkZG51bWJlcjsKLQotICAvKiBUaGUgbG9jYXRpb24gb2YgdGhlIGluc3RydWN0aW9uIHdoaWNoIGNyZWF0ZWQgdGhlIHJlbG9jLCB1c2VkCi0gICAgIGluIGVycm9yIG1lc3NhZ2VzLiAgKi8KLSAgY2hhciAqZnhfZmlsZTsKLSAgdW5zaWduZWQgZnhfbGluZTsKLQotI2lmZGVmIFVTSU5HX0NHRU4KLSAgc3RydWN0IHsKLSAgICAvKiBDR0VOX0lOU04gZW50cnkgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uICAqLwotICAgIGNvbnN0IHN0cnVjdCBjZ2VuX2luc24gKmluc247Ci0gICAgLyogVGFyZ2V0IHNwZWNpZmljIGRhdGEsIHVzdWFsbHkgcmVsb2MgbnVtYmVyLiAgKi8KLSAgICBpbnQgb3BpbmZvOwotICB9IGZ4X2NnZW47Ci0jZW5kaWYKLQotI2lmZGVmIFRDX0ZJWF9UWVBFCi0gIC8qIExvY2F0aW9uIHdoZXJlIGEgYmFja2VuZCBjYW4gYXR0YWNoIGFkZGl0aW9uYWwgZGF0YQotICAgICBuZWVkZWQgdG8gcGVyZm9ybSBmaXh1cHMuICAqLwotICBUQ19GSVhfVFlQRSB0Y19maXhfZGF0YTsKLSNlbmRpZgotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgZml4IGZpeFM7Ci0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotZXh0ZXJuIGNoYXIgKm5leHRfb2JqZWN0X2ZpbGVfY2hhclA7Ci0KLSNpZm5kZWYgTUFOWV9TRUdNRU5UUwotQ09NTU9OIGZpeFMgKnRleHRfZml4X3Jvb3QsICp0ZXh0X2ZpeF90YWlsOwkvKiBDaGFpbnMgZml4U3MuICovCi1DT01NT04gZml4UyAqZGF0YV9maXhfcm9vdCwgKmRhdGFfZml4X3RhaWw7CS8qIENoYWlucyBmaXhTcy4gKi8KLUNPTU1PTiBmaXhTICpic3NfZml4X3Jvb3QsICpic3NfZml4X3RhaWw7CS8qIENoYWlucyBmaXhTcy4gKi8KLWV4dGVybiBzdHJ1Y3QgZnJhZyAqdGV4dF9sYXN0X2ZyYWc7CQkvKiBMYXN0IGZyYWcgaW4gc2VnbWVudC4gKi8KLWV4dGVybiBzdHJ1Y3QgZnJhZyAqZGF0YV9sYXN0X2ZyYWc7CQkvKiBMYXN0IGZyYWcgaW4gc2VnbWVudC4gKi8KLSNlbmRpZgotQ09NTU9OIGZpeFMgKipzZWdfZml4X3Jvb3RQLCAqKnNlZ19maXhfdGFpbFA7CS8qIC0+IG9uZSBvZiBhYm92ZS4gKi8KLSNlbmRpZgotCi1leHRlcm4gbG9uZyBzdHJpbmdfYnl0ZV9jb3VudDsKLWV4dGVybiBpbnQgc2VjdGlvbl9hbGlnbm1lbnRbXTsKLQotZXh0ZXJuIGJpdF9maXhTICpiaXRfZml4X25ldwotICBQQVJBTVMgKChpbnQgc2l6ZSwgaW50IG9mZnNldCwgbG9uZyBiYXNlX3R5cGUsIGxvbmcgYmFzZV9hZGosIGxvbmcgbWluLAotCSAgIGxvbmcgbWF4LCBsb25nIGFkZCkpOwotZXh0ZXJuIHZvaWQgYXBwZW5kIFBBUkFNUyAoKGNoYXIgKipjaGFyUFAsIGNoYXIgKmZyb21QLCB1bnNpZ25lZCBsb25nIGxlbmd0aCkpOwotZXh0ZXJuIHZvaWQgcmVjb3JkX2FsaWdubWVudCBQQVJBTVMgKChzZWdUIHNlZywgaW50IGFsaWduKSk7Ci1leHRlcm4gdm9pZCBzdWJzZWdzX2ZpbmlzaCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCB3cml0ZV9vYmplY3RfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gbG9uZyByZWxheF9mcmFnIFBBUkFNUyAoKGZyYWdTICosIGxvbmcpKTsKLWV4dGVybiB2b2lkIHJlbGF4X3NlZ21lbnQKLSAgUEFSQU1TICgoc3RydWN0IGZyYWcgKiBzZWdfZnJhZ19yb290LCBzZWdUIHNlZ190eXBlKSk7Ci0KLWV4dGVybiB2b2lkIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gUEFSQU1TICgoY2hhciAqLCB2YWx1ZVQsIGludCkpOwotZXh0ZXJuIHZvaWQgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAgICBQQVJBTVMgKChjaGFyICosIHZhbHVlVCwgaW50KSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1leHRlcm4gZml4UyAqZml4X25ldwotICBQQVJBTVMgKChmcmFnUyAqIGZyYWcsIGludCB3aGVyZSwgaW50IHNpemUsIHN5bWJvbFMgKiBhZGRfc3ltYm9sLAotCSAgIG9mZnNldFQgb2Zmc2V0LCBpbnQgcGNyZWwsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGUpKTsKLWV4dGVybiBmaXhTICpmaXhfbmV3X2V4cAotICBQQVJBTVMgKChmcmFnUyAqIGZyYWcsIGludCB3aGVyZSwgaW50IHNpemUsIGV4cHJlc3Npb25TICpleHAsIGludCBwY3JlbCwKLQkgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlKSk7Ci0jZWxzZQotZXh0ZXJuIGZpeFMgKmZpeF9uZXcKLSAgUEFSQU1TICgoZnJhZ1MgKiBmcmFnLCBpbnQgd2hlcmUsIGludCBzaXplLCBzeW1ib2xTICogYWRkX3N5bWJvbCwKLQkgICBvZmZzZXRUIG9mZnNldCwgaW50IHBjcmVsLCBpbnQgcl90eXBlKSk7Ci1leHRlcm4gZml4UyAqZml4X25ld19leHAKLSAgUEFSQU1TICgoZnJhZ1MgKiBmcmFnLCBpbnQgd2hlcmUsIGludCBzaXplLCBleHByZXNzaW9uUyAqZXhwLCBpbnQgcGNyZWwsCi0JICAgaW50IHJfdHlwZSkpOwotI2VuZGlmCi0KLWV4dGVybiB2b2lkIHdyaXRlX3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoRklMRSAqKSk7Ci0KLSNlbmRpZiAvKiBfX3dyaXRlX2hfXyAqLwotLyogZW5kIG9mIHdyaXRlLmggKi8KZGlmZiAtLWdpdCBhL2dkYi9jLWV4cC50YWIuYyBiL2dkYi9jLWV4cC50YWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkzOTVmYS4uMDAwMDAwMAotLS0gYS9nZGIvYy1leHAudGFiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzk2ICswLDAgQEAKLQotLyogIEEgQmlzb24gcGFyc2VyLCBtYWRlIGZyb20gYy1leHAueQotIGJ5ICBHTlUgQmlzb24gdmVyc2lvbiAxLjI1Ci0gICovCi0KLSNkZWZpbmUgWVlCSVNPTiAxICAvKiBJZGVudGlmeSBCaXNvbiBvdXRwdXQuICAqLwotCi0jZGVmaW5lCUlOVAkyNTgKLSNkZWZpbmUJRkxPQVQJMjU5Ci0jZGVmaW5lCVNUUklORwkyNjAKLSNkZWZpbmUJTkFNRQkyNjEKLSNkZWZpbmUJVFlQRU5BTUUJMjYyCi0jZGVmaW5lCU5BTUVfT1JfSU5UCTI2MwotI2RlZmluZQlTVFJVQ1QJMjY0Ci0jZGVmaW5lCUNMQVNTCTI2NQotI2RlZmluZQlVTklPTgkyNjYKLSNkZWZpbmUJRU5VTQkyNjcKLSNkZWZpbmUJU0laRU9GCTI2OAotI2RlZmluZQlVTlNJR05FRAkyNjkKLSNkZWZpbmUJQ09MT05DT0xPTgkyNzAKLSNkZWZpbmUJVEVNUExBVEUJMjcxCi0jZGVmaW5lCUVSUk9SCTI3MgotI2RlZmluZQlTSUdORURfS0VZV09SRAkyNzMKLSNkZWZpbmUJTE9ORwkyNzQKLSNkZWZpbmUJU0hPUlQJMjc1Ci0jZGVmaW5lCUlOVF9LRVlXT1JECTI3NgotI2RlZmluZQlDT05TVF9LRVlXT1JECTI3NwotI2RlZmluZQlWT0xBVElMRV9LRVlXT1JECTI3OAotI2RlZmluZQlET1VCTEVfS0VZV09SRAkyNzkKLSNkZWZpbmUJVkFSSUFCTEUJMjgwCi0jZGVmaW5lCUFTU0lHTl9NT0RJRlkJMjgxCi0jZGVmaW5lCVRISVMJMjgyCi0jZGVmaW5lCVRSVUVLRVlXT1JECTI4MwotI2RlZmluZQlGQUxTRUtFWVdPUkQJMjg0Ci0jZGVmaW5lCUFCT1ZFX0NPTU1BCTI4NQotI2RlZmluZQlPUk9SCTI4NgotI2RlZmluZQlBTkRBTkQJMjg3Ci0jZGVmaW5lCUVRVUFMCTI4OAotI2RlZmluZQlOT1RFUVVBTAkyODkKLSNkZWZpbmUJTEVRCTI5MAotI2RlZmluZQlHRVEJMjkxCi0jZGVmaW5lCUxTSAkyOTIKLSNkZWZpbmUJUlNICTI5MwotI2RlZmluZQlVTkFSWQkyOTQKLSNkZWZpbmUJSU5DUkVNRU5UCTI5NQotI2RlZmluZQlERUNSRU1FTlQJMjk2Ci0jZGVmaW5lCUFSUk9XCTI5NwotI2RlZmluZQlCTE9DS05BTUUJMjk4Ci0jZGVmaW5lCUZJTEVOQU1FCTI5OQotCi0jbGluZSAzOCAiYy1leHAueSIKLQotCi0jaW5jbHVkZSAiZGVmcy5oIgotI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKLSNpbmNsdWRlICJ2YWx1ZS5oIgotI2luY2x1ZGUgInBhcnNlci1kZWZzLmgiCi0jaW5jbHVkZSAibGFuZ3VhZ2UuaCIKLSNpbmNsdWRlICJjLWxhbmcuaCIKLSNpbmNsdWRlICJiZmQuaCIgLyogUmVxdWlyZWQgYnkgb2JqZmlsZXMuaC4gICovCi0jaW5jbHVkZSAic3ltZmlsZS5oIiAvKiBSZXF1aXJlZCBieSBvYmpmaWxlcy5oLiAgKi8KLSNpbmNsdWRlICJvYmpmaWxlcy5oIiAvKiBGb3IgaGF2ZV9mdWxsX3N5bWJvbHMgYW5kIGhhdmVfcGFydGlhbF9zeW1ib2xzICovCi0KLS8qIEZsYWcgaW5kaWNhdGluZyB3ZSdyZSBkZWFsaW5nIHdpdGggSFAtY29tcGlsZWQgb2JqZWN0cyAqLyAKLWV4dGVybiBpbnQgaHBfc29tX3NvbV9vYmplY3RfcHJlc2VudDsKLQotLyogUmVtYXAgbm9ybWFsIHlhY2MgcGFyc2VyIGludGVyZmFjZSBuYW1lcyAoeXlwYXJzZSwgeXlsZXgsIHl5ZXJyb3IsIGV0YyksCi0gICBhcyB3ZWxsIGFzIGdyYXR1aXRpb3VzbHkgZ2xvYmFsIHN5bWJvbCBuYW1lcywgc28gd2UgY2FuIGhhdmUgbXVsdGlwbGUKLSAgIHlhY2MgZ2VuZXJhdGVkIHBhcnNlcnMgaW4gZ2RiLiAgTm90ZSB0aGF0IHRoZXNlIGFyZSBvbmx5IHRoZSB2YXJpYWJsZXMKLSAgIHByb2R1Y2VkIGJ5IHlhY2MuICBJZiBvdGhlciBwYXJzZXIgZ2VuZXJhdG9ycyAoYmlzb24sIGJ5YWNjLCBldGMpIHByb2R1Y2UKLSAgIGFkZGl0aW9uYWwgZ2xvYmFsIG5hbWVzIHRoYXQgY29uZmxpY3QgYXQgbGluayB0aW1lLCB0aGVuIHRob3NlIHBhcnNlcgotICAgZ2VuZXJhdG9ycyBuZWVkIHRvIGJlIGZpeGVkIGluc3RlYWQgb2YgYWRkaW5nIHRob3NlIG5hbWVzIHRvIHRoaXMgbGlzdC4gKi8KLQotI2RlZmluZQl5eW1heGRlcHRoIGNfbWF4ZGVwdGgKLSNkZWZpbmUJeXlwYXJzZQljX3BhcnNlCi0jZGVmaW5lCXl5bGV4CWNfbGV4Ci0jZGVmaW5lCXl5ZXJyb3IJY19lcnJvcgotI2RlZmluZQl5eWx2YWwJY19sdmFsCi0jZGVmaW5lCXl5Y2hhcgljX2NoYXIKLSNkZWZpbmUJeXlkZWJ1ZwljX2RlYnVnCi0jZGVmaW5lCXl5cGFjdAljX3BhY3QJCi0jZGVmaW5lCXl5cjEJY19yMQkJCQotI2RlZmluZQl5eXIyCWNfcjIJCQkKLSNkZWZpbmUJeXlkZWYJY19kZWYJCQotI2RlZmluZQl5eWNoawljX2NoawkJCi0jZGVmaW5lCXl5cGdvCWNfcGdvCQkKLSNkZWZpbmUJeXlhY3QJY19hY3QJCQotI2RlZmluZQl5eWV4Y2EJY19leGNhCi0jZGVmaW5lIHl5ZXJyZmxhZyBjX2VycmZsYWcKLSNkZWZpbmUgeXluZXJycwljX25lcnJzCi0jZGVmaW5lCXl5cHMJY19wcwotI2RlZmluZQl5eXB2CWNfcHYKLSNkZWZpbmUJeXlzCWNfcwotI2RlZmluZQl5eV95eXMJY195eXMKLSNkZWZpbmUJeXlzdGF0ZQljX3N0YXRlCi0jZGVmaW5lCXl5dG1wCWNfdG1wCi0jZGVmaW5lCXl5dgljX3YKLSNkZWZpbmUJeXlfeXl2CWNfeXl2Ci0jZGVmaW5lCXl5dmFsCWNfdmFsCi0jZGVmaW5lCXl5bGxvYwljX2xsb2MKLSNkZWZpbmUgeXlyZWRzCWNfcmVkcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KLSNkZWZpbmUgeXl0b2tzCWNfdG9rcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KLSNkZWZpbmUgeXlsaHMJY195eWxocwotI2RlZmluZSB5eWxlbgljX3l5bGVuCi0jZGVmaW5lIHl5ZGVmcmVkIGNfeXlkZWZyZWQKLSNkZWZpbmUgeXlkZ290bwljX3l5ZGdvdG8KLSNkZWZpbmUgeXlzaW5kZXggY195eXNpbmRleAotI2RlZmluZSB5eXJpbmRleCBjX3l5cmluZGV4Ci0jZGVmaW5lIHl5Z2luZGV4IGNfeXlnaW5kZXgKLSNkZWZpbmUgeXl0YWJsZQkgY195eXRhYmxlCi0jZGVmaW5lIHl5Y2hlY2sJIGNfeXljaGVjawotCi0jaWZuZGVmIFlZREVCVUcKLSNkZWZpbmUJWVlERUJVRwkwCQkvKiBEZWZhdWx0IHRvIG5vIHl5ZGVidWcgc3VwcG9ydCAqLwotI2VuZGlmCi0KLWludAoteXlwYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBpbnQKLXl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZAoteXllcnJvciBQQVJBTVMgKChjaGFyICopKTsKLQotCi0jbGluZSAxMjAgImMtZXhwLnkiCi10eXBlZGVmIHVuaW9uCi0gIHsKLSAgICBMT05HRVNUIGx2YWw7Ci0gICAgc3RydWN0IHsKLSAgICAgIExPTkdFU1QgdmFsOwotICAgICAgc3RydWN0IHR5cGUgKnR5cGU7Ci0gICAgfSB0eXBlZF92YWxfaW50OwotICAgIHN0cnVjdCB7Ci0gICAgICBET1VCTEVTVCBkdmFsOwotICAgICAgc3RydWN0IHR5cGUgKnR5cGU7Ci0gICAgfSB0eXBlZF92YWxfZmxvYXQ7Ci0gICAgc3RydWN0IHN5bWJvbCAqc3ltOwotICAgIHN0cnVjdCB0eXBlICp0dmFsOwotICAgIHN0cnVjdCBzdG9rZW4gc3ZhbDsKLSAgICBzdHJ1Y3QgdHR5cGUgdHN5bTsKLSAgICBzdHJ1Y3Qgc3ltdG9rZW4gc3N5bTsKLSAgICBpbnQgdm9pZHZhbDsKLSAgICBzdHJ1Y3QgYmxvY2sgKmJ2YWw7Ci0gICAgZW51bSBleHBfb3Bjb2RlIG9wY29kZTsKLSAgICBzdHJ1Y3QgaW50ZXJuYWx2YXIgKml2YXI7Ci0KLSAgICBzdHJ1Y3QgdHlwZSAqKnR2ZWM7Ci0gICAgaW50ICppdmVjOwotICB9IFlZU1RZUEU7Ci0jbGluZSAxNDUgImMtZXhwLnkiCi0KLS8qIFlZU1RZUEUgZ2V0cyBkZWZpbmVkIGJ5ICV1bmlvbiAqLwotc3RhdGljIGludAotcGFyc2VfbnVtYmVyIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBpbnQsIFlZU1RZUEUgKikpOwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZm5kZWYgX19jcGx1c3BsdXMKLSNpZm5kZWYgX19TVERDX18KLSNkZWZpbmUgY29uc3QKLSNlbmRpZgotI2VuZGlmCi0KLQotCi0jZGVmaW5lCVlZRklOQUwJCTIxNAotI2RlZmluZQlZWUZMQUcJCS0zMjc2OAotI2RlZmluZQlZWU5UQkFTRQk2OQotCi0jZGVmaW5lIFlZVFJBTlNMQVRFKHgpICgodW5zaWduZWQpKHgpIDw9IDI5OSA/IHl5dHJhbnNsYXRlW3hdIDogOTEpCi0KLXN0YXRpYyBjb25zdCBjaGFyIHl5dHJhbnNsYXRlW10gPSB7ICAgICAwLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgNjIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDUyLCAgICAzOCwgICAgIDIsICAgIDU5LAotICAgIDY1LCAgICA1MCwgICAgNDgsICAgIDMwLCAgICA0OSwgICAgNTcsICAgIDUxLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICA2OCwgICAgIDIsICAgIDQxLAotICAgIDMyLCAgICA0MiwgICAgMzMsICAgIDQ3LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgIDU4LCAgICAgMiwgICAgNjQsICAgIDM3LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgNjYsICAgIDM2LCAgICA2NywgICAgNjMsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsICAgICA1LAotICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LAotICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LAotICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMSwgICAgMzQsICAgIDM1LCAgICAzOSwgICAgNDAsICAgIDQzLAotICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIDU2LCAgICA2MCwgICAgNjEKLX07Ci0KLSNpZiBZWURFQlVHICE9IDAKLXN0YXRpYyBjb25zdCBzaG9ydCB5eXByaHNbXSA9IHsgICAgIDAsCi0gICAgIDAsICAgICAyLCAgICAgNCwgICAgIDYsICAgICA4LCAgICAxMiwgICAgMTUsICAgIDE4LCAgICAyMSwgICAgMjQsCi0gICAgMjcsICAgIDMwLCAgICAzMywgICAgMzYsICAgIDM5LCAgICA0MiwgICAgNDYsICAgIDUwLCAgICA1NSwgICAgNTksCi0gICAgNjMsICAgIDY4LCAgICA3MywgICAgNzQsICAgIDgwLCAgICA4MiwgICAgODMsICAgIDg1LCAgICA4OSwgICAgOTEsCi0gICAgOTUsICAgMTAwLCAgIDEwNSwgICAxMDksICAgMTEzLCAgIDExNywgICAxMjEsICAgMTI1LCAgIDEyOSwgICAxMzMsCi0gICAxMzcsICAgMTQxLCAgIDE0NSwgICAxNDksICAgMTUzLCAgIDE1NywgICAxNjEsICAgMTY1LCAgIDE2OSwgICAxNzMsCi0gICAxNzcsICAgMTgxLCAgIDE4NSwgICAxOTEsICAgMTk1LCAgIDE5OSwgICAyMDEsICAgMjAzLCAgIDIwNSwgICAyMDcsCi0gICAyMDksICAgMjE0LCAgIDIxNiwgICAyMTgsICAgMjIwLCAgIDIyMiwgICAyMjQsICAgMjI2LCAgIDIzMCwgICAyMzQsCi0gICAyMzgsICAgMjQzLCAgIDI0NSwgICAyNDgsICAgMjUwLCAgIDI1MiwgICAyNTUsICAgMjU4LCAgIDI2MSwgICAyNjUsCi0gICAyNjksICAgMjcxLCAgIDI3NCwgICAyNzYsICAgMjc5LCAgIDI4MSwgICAyODUsICAgMjg4LCAgIDI5MCwgICAyOTMsCi0gICAyOTUsICAgMjk4LCAgIDMwMiwgICAzMDUsICAgMzA5LCAgIDMxMSwgICAzMTUsICAgMzE3LCAgIDMxOSwgICAzMjEsCi0gICAzMjMsICAgMzI2LCAgIDMzMCwgICAzMzMsICAgMzM3LCAgIDM0MSwgICAzNDYsICAgMzQ5LCAgIDM1MywgICAzNTUsCi0gICAzNTgsICAgMzYxLCAgIDM2NCwgICAzNjcsICAgMzcwLCAgIDM3MywgICAzNzUsICAgMzc4LCAgIDM4MCwgICAzODYsCi0gICAzODksICAgMzkyLCAgIDM5NCwgICAzOTYsICAgMzk4LCAgIDQwMCwgICA0MDIsICAgNDA2LCAgIDQwOCwgICA0MTAsCi0gICA0MTIsICAgNDE0LCAgIDQxNgotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cmhzW10gPSB7ICAgIDcxLAotICAgICAwLCAgICA3MCwgICAgIDAsICAgIDg1LCAgICAgMCwgICAgNzIsICAgICAwLCAgICA3MSwgICAgMzAsICAgIDcyLAotICAgICAwLCAgICA1MCwgICAgNzIsICAgICAwLCAgICAzOCwgICAgNzIsICAgICAwLCAgICA0OSwgICAgNzIsICAgICAwLAotICAgIDYyLCAgICA3MiwgICAgIDAsICAgIDYzLCAgICA3MiwgICAgIDAsICAgIDU0LCAgICA3MiwgICAgIDAsICAgIDU1LAotICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDU0LCAgICAgMCwgICAgNzIsICAgIDU1LCAgICAgMCwgICAgMTMsICAgIDcyLAotICAgICAwLCAgICA3MiwgICAgNTYsICAgIDg5LCAgICAgMCwgICAgNzIsICAgIDU2LCAgICA3OSwgICAgIDAsICAgIDcyLAotICAgIDU2LCAgICA1MCwgICAgNzIsICAgICAwLCAgICA3MiwgICAgNTcsICAgIDg5LCAgICAgMCwgICAgNzIsICAgIDU3LAotICAgIDc5LCAgICAgMCwgICAgNzIsICAgIDU3LCAgICA1MCwgICAgNzIsICAgICAwLCAgICA3MiwgICAgNTgsICAgIDcxLAotICAgIDY0LCAgICAgMCwgICAgIDAsICAgIDcyLCAgICA1OSwgICAgNzMsICAgIDc1LCAgICA2NSwgICAgIDAsICAgIDY2LAotICAgICAwLCAgICAgMCwgICAgNzIsICAgICAwLCAgICA3NSwgICAgMzAsICAgIDcyLCAgICAgMCwgICAgNjcsICAgICAwLAotICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLCAgICA3NCwgICAgODUsICAgIDc2LCAgICA3MiwgICAgIDAsICAgIDU5LAotICAgIDg1LCAgICA2NSwgICAgNzIsICAgICAwLCAgICA1OSwgICAgNzEsICAgIDY1LCAgICAgMCwgICAgNzIsICAgIDQ3LAotICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDUwLCAgICA3MiwgICAgIDAsICAgIDcyLCAgICA1MSwgICAgNzIsICAgICAwLAotICAgIDcyLCAgICA1MiwgICAgNzIsICAgICAwLCAgICA3MiwgICAgNDgsICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDQ5LAotICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDQ1LCAgICA3MiwgICAgIDAsICAgIDcyLCAgICA0NiwgICAgNzIsICAgICAwLAotICAgIDcyLCAgICAzOSwgICAgNzIsICAgICAwLCAgICA3MiwgICAgNDAsICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDQzLAotICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDQ0LCAgICA3MiwgICAgIDAsICAgIDcyLCAgICA0MSwgICAgNzIsICAgICAwLAotICAgIDcyLCAgICA0MiwgICAgNzIsICAgICAwLCAgICA3MiwgICAgMzgsICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDM3LAotICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDM2LCAgICA3MiwgICAgIDAsICAgIDcyLCAgICAzNSwgICAgNzIsICAgICAwLAotICAgIDcyLCAgICAzNCwgICAgNzIsICAgICAwLCAgICA3MiwgICAgMzMsICAgIDcyLCAgICA2OCwgICAgNzIsICAgICAwLAotICAgIDcyLCAgICAzMiwgICAgNzIsICAgICAwLCAgICA3MiwgICAgMjYsICAgIDcyLCAgICAgMCwgICAgIDMsICAgICAwLAotICAgICA4LCAgICAgMCwgICAgIDQsICAgICAwLCAgICA3OCwgICAgIDAsICAgIDI1LCAgICAgMCwgICAgMTMsICAgIDU5LAotICAgIDg1LCAgICA2NSwgICAgIDAsICAgICA1LCAgICAgMCwgICAgMjcsICAgICAwLCAgICAyOCwgICAgIDAsICAgIDI5LAotICAgICAwLCAgICA2MCwgICAgIDAsICAgIDYxLCAgICAgMCwgICAgNzcsICAgIDE1LCAgICA4OSwgICAgIDAsICAgIDc3LAotICAgIDE1LCAgICA4OSwgICAgIDAsICAgIDg2LCAgICAxNSwgICAgODksICAgICAwLCAgICA4NiwgICAgMTUsICAgIDYzLAotICAgIDg5LCAgICAgMCwgICAgNzksICAgICAwLCAgICAxNSwgICAgODksICAgICAwLCAgICA5MCwgICAgIDAsICAgIDg2LAotICAgICAwLCAgICA4NiwgICAgMjIsICAgICAwLCAgICA4NiwgICAgMjMsICAgICAwLCAgICA4NiwgICAgODEsICAgICAwLAotICAgIDg2LCAgICAyMiwgICAgODEsICAgICAwLCAgICA4NiwgICAgMjMsICAgIDgxLCAgICAgMCwgICAgNTAsICAgICAwLAotICAgIDUwLCAgICA4MSwgICAgIDAsICAgIDM4LCAgICAgMCwgICAgMzgsICAgIDgxLCAgICAgMCwgICAgODIsICAgICAwLAotICAgIDU5LCAgICA4MSwgICAgNjUsICAgICAwLCAgICA4MiwgICAgODMsICAgICAwLCAgICA4MywgICAgIDAsICAgIDgyLAotICAgIDg0LCAgICAgMCwgICAgODQsICAgICAwLCAgICA1OCwgICAgNjQsICAgICAwLCAgICA1OCwgICAgIDMsICAgIDY0LAotICAgICAwLCAgICA1OSwgICAgNjUsICAgICAwLCAgICA1OSwgICAgODgsICAgIDY1LCAgICAgMCwgICAgODAsICAgICAwLAotICAgIDg2LCAgICAxNSwgICAgNTAsICAgICAwLCAgICAgNywgICAgIDAsICAgIDIxLCAgICAgMCwgICAgMTksICAgICAwLAotICAgIDIwLCAgICAgMCwgICAgMTksICAgIDIxLCAgICAgMCwgICAgMTQsICAgIDE5LCAgICAyMSwgICAgIDAsICAgIDE5LAotICAgIDE5LCAgICAgMCwgICAgMTksICAgIDE5LCAgICAyMSwgICAgIDAsICAgIDE0LCAgICAxOSwgICAgMTksICAgICAwLAotICAgIDE0LCAgICAxOSwgICAgMTksICAgIDIxLCAgICAgMCwgICAgMjAsICAgIDIxLCAgICAgMCwgICAgMTQsICAgIDIwLAotICAgIDIxLCAgICAgMCwgICAgMjQsICAgICAwLCAgICAxOSwgICAgMjQsICAgICAwLCAgICAgOSwgICAgODksICAgICAwLAotICAgIDEwLCAgICA4OSwgICAgIDAsICAgIDExLCAgICA4OSwgICAgIDAsICAgIDEyLCAgICA4OSwgICAgIDAsICAgIDE0LAotICAgIDg3LCAgICAgMCwgICAgMTQsICAgICAwLCAgICAxOCwgICAgODcsICAgICAwLCAgICAxOCwgICAgIDAsICAgIDE2LAotICAgIDg5LCAgICA0MSwgICAgODUsICAgIDQyLCAgICAgMCwgICAgMjIsICAgIDg2LCAgICAgMCwgICAgMjMsICAgIDg2LAotICAgICAwLCAgICAgNywgICAgIDAsICAgIDIxLCAgICAgMCwgICAgMTksICAgICAwLCAgICAyMCwgICAgIDAsICAgIDg1LAotICAgICAwLCAgICA4OCwgICAgMzAsICAgIDg1LCAgICAgMCwgICAgIDYsICAgICAwLCAgICA2MCwgICAgIDAsICAgICA3LAotICAgICAwLCAgICAgOCwgICAgIDAsICAgICA2LCAgICAgMCwgICAgNjAsICAgICAwCi19OwotCi0jZW5kaWYKLQotI2lmIFlZREVCVUcgIT0gMAotc3RhdGljIGNvbnN0IHNob3J0IHl5cmxpbmVbXSA9IHsgMCwKLSAgIDIzMCwgICAyMzEsICAgMjM0LCAgIDI0MSwgICAyNDIsICAgMjQ3LCAgIDI1MCwgICAyNTMsICAgMjU3LCAgIDI2MSwKLSAgIDI2NSwgICAyNjksICAgMjczLCAgIDI3NywgICAyODEsICAgMjg1LCAgIDI5MSwgICAyOTksICAgMzAzLCAgIDMwOSwKLSAgIDMxNywgICAzMjEsICAgMzI1LCAgIDMyOSwgICAzMzUsICAgMzM5LCAgIDM0MiwgICAzNDYsICAgMzUwLCAgIDM1MywKLSAgIDM2MCwgICAzNjYsICAgMzcyLCAgIDM3OCwgICAzODIsICAgMzg2LCAgIDM5MCwgICAzOTQsICAgMzk4LCAgIDQwMiwKLSAgIDQwNiwgICA0MTAsICAgNDE0LCAgIDQxOCwgICA0MjIsICAgNDI2LCAgIDQzMCwgICA0MzQsICAgNDM4LCAgIDQ0MiwKLSAgIDQ0NiwgICA0NTAsICAgNDU0LCAgIDQ1OCwgICA0NjIsICAgNDY4LCAgIDQ3NSwgICA0ODYsICAgNDkzLCAgIDQ5NiwKLSAgIDUwMCwgICA1MDgsICAgNTMzLCAgIDUzOCwgICA1NDUsICAgNTU0LCAgIDU2MiwgICA1NjgsICAgNTc5LCAgIDU5NSwKLSAgIDYwOCwgICA2MzIsICAgNjMzLCAgIDY2NywgICA3MjUsICAgNzMxLCAgIDczMiwgICA3MzMsICAgNzM1LCAgIDczNywKLSAgIDc0MSwgICA3NDMsICAgNzQ1LCAgIDc0NywgICA3NDksICAgNzUyLCAgIDc1NCwgICA3NTksICAgNzY2LCAgIDc2OCwKLSAgIDc3MiwgICA3NzQsICAgNzc4LCAgIDc4MCwgICA3OTIsICAgNzkzLCAgIDc5OCwgICA4MDAsICAgODAyLCAgIDgwNCwKLSAgIDgwNiwgICA4MDgsICAgODEwLCAgIDgxMiwgICA4MTQsICAgODE2LCAgIDgxOCwgICA4MjAsICAgODIyLCAgIDgyNCwKLSAgIDgyNiwgICA4MjksICAgODMyLCAgIDgzNSwgICA4MzgsICAgODQwLCAgIDg0MiwgICA4NDQsICAgODQ5LCAgIDg1NiwKLSAgIDg1NywgICA4NjAsICAgODYxLCAgIDg2NywgICA4NzMsICAgODgyLCAgIDg4NywgICA4OTQsICAgODk1LCAgIDg5NiwKLSAgIDg5NywgICA5MDAsICAgOTAxCi19OwotI2VuZGlmCi0KLQotI2lmIFlZREVCVUcgIT0gMCB8fCBkZWZpbmVkIChZWUVSUk9SX1ZFUkJPU0UpCi0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgeXl0bmFtZVtdID0geyAgICIkIiwiZXJyb3IiLCIkdW5kZWZpbmVkLiIsIklOVCIsIkZMT0FUIiwKLSJTVFJJTkciLCJOQU1FIiwiVFlQRU5BTUUiLCJOQU1FX09SX0lOVCIsIlNUUlVDVCIsIkNMQVNTIiwiVU5JT04iLCJFTlVNIiwiU0laRU9GIiwKLSJVTlNJR05FRCIsIkNPTE9OQ09MT04iLCJURU1QTEFURSIsIkVSUk9SIiwiU0lHTkVEX0tFWVdPUkQiLCJMT05HIiwiU0hPUlQiLCJJTlRfS0VZV09SRCIsCi0iQ09OU1RfS0VZV09SRCIsIlZPTEFUSUxFX0tFWVdPUkQiLCJET1VCTEVfS0VZV09SRCIsIlZBUklBQkxFIiwiQVNTSUdOX01PRElGWSIsCi0iVEhJUyIsIlRSVUVLRVlXT1JEIiwiRkFMU0VLRVlXT1JEIiwiJywnIiwiQUJPVkVfQ09NTUEiLCInPSciLCInPyciLCJPUk9SIiwiQU5EQU5EIiwKLSInfCciLCInXiciLCInJiciLCJFUVVBTCIsIk5PVEVRVUFMIiwiJzwnIiwiJz4nIiwiTEVRIiwiR0VRIiwiTFNIIiwiUlNIIiwiJ0AnIiwKLSInKyciLCInLSciLCInKiciLCInLyciLCInJSciLCJVTkFSWSIsIklOQ1JFTUVOVCIsIkRFQ1JFTUVOVCIsIkFSUk9XIiwiJy4nIiwKLSInWyciLCInKCciLCJCTE9DS05BTUUiLCJGSUxFTkFNRSIsIichJyIsIid+JyIsIiddJyIsIicpJyIsIid7JyIsIid9JyIsIic6JyIsCi0ic3RhcnQiLCJ0eXBlX2V4cCIsImV4cDEiLCJleHAiLCJAMSIsImxjdXJseSIsImFyZ2xpc3QiLCJyY3VybHkiLCJibG9jayIsInZhcmlhYmxlIiwKLSJxdWFsaWZpZWRfbmFtZSIsInB0eXBlIiwiYWJzX2RlY2wiLCJkaXJlY3RfYWJzX2RlY2wiLCJhcnJheV9tb2QiLCJmdW5jX21vZCIsCi0idHlwZSIsInR5cGViYXNlIiwidHlwZW5hbWUiLCJub25lbXB0eV90eXBlbGlzdCIsIm5hbWUiLCJuYW1lX25vdF90eXBlbmFtZSIsIE5VTEwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cjFbXSA9IHsgICAgIDAsCi0gICAgNjksICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcxLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsCi0gICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsCi0gICAgNzIsICAgIDcyLCAgICA3MywgICAgNzIsICAgIDc0LCAgICA3NSwgICAgNzUsICAgIDc1LCAgICA3NiwgICAgNzIsCi0gICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsCi0gICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsCi0gICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsCi0gICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3NywgICAgNzcsICAgIDc3LCAgICA3OCwgICAgNzksCi0gICAgNzksICAgIDc4LCAgICA3OCwgICAgNzgsICAgIDgwLCAgICA4MCwgICAgODAsICAgIDgwLCAgICA4MCwgICAgODAsCi0gICAgODEsICAgIDgxLCAgICA4MSwgICAgODEsICAgIDgxLCAgICA4MiwgICAgODIsICAgIDgyLCAgICA4MiwgICAgODIsCi0gICAgODMsICAgIDgzLCAgICA4NCwgICAgODQsICAgIDg1LCAgICA4NSwgICAgODYsICAgIDg2LCAgICA4NiwgICAgODYsCi0gICAgODYsICAgIDg2LCAgICA4NiwgICAgODYsICAgIDg2LCAgICA4NiwgICAgODYsICAgIDg2LCAgICA4NiwgICAgODYsCi0gICAgODYsICAgIDg2LCAgICA4NiwgICAgODYsICAgIDg2LCAgICA4NiwgICAgODYsICAgIDg2LCAgICA4NiwgICAgODYsCi0gICAgODYsICAgIDg3LCAgICA4NywgICAgODcsICAgIDg3LCAgICA4OCwgICAgODgsICAgIDg5LCAgICA4OSwgICAgODksCi0gICAgODksICAgIDkwLCAgICA5MAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cjJbXSA9IHsgICAgIDAsCi0gICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMywgICAgIDMsICAgICA0LCAgICAgMywgICAgIDMsCi0gICAgIDQsICAgICA0LCAgICAgMCwgICAgIDUsICAgICAxLCAgICAgMCwgICAgIDEsICAgICAzLCAgICAgMSwgICAgIDMsCi0gICAgIDQsICAgICA0LCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsCi0gICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsCi0gICAgIDMsICAgICAzLCAgICAgNSwgICAgIDMsICAgICAzLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCi0gICAgIDQsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAzLCAgICAgMywgICAgIDMsCi0gICAgIDQsICAgICAxLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMywgICAgIDMsCi0gICAgIDEsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAxLCAgICAgMywgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDEsCi0gICAgIDIsICAgICAzLCAgICAgMiwgICAgIDMsICAgICAxLCAgICAgMywgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCi0gICAgIDIsICAgICAzLCAgICAgMiwgICAgIDMsICAgICAzLCAgICAgNCwgICAgIDIsICAgICAzLCAgICAgMSwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAxLCAgICAgNSwgICAgIDIsCi0gICAgIDIsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgMSwgICAgIDEsCi0gICAgIDEsICAgICAxLCAgICAgMQotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5ZGVmYWN0W10gPSB7ICAgICAwLAotICAgIDU2LCAgICA1OCwgICAgNjIsICAgMTMyLCAgICA5NywgICAgNTcsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgIDExNiwgICAgIDAsICAgICAwLCAgIDExOCwgICAgOTksICAgMTAwLCAgICA5OCwgICAgIDAsICAgICAwLAotICAgMTA5LCAgICA2MCwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgIDEzMywgICAgNjcsICAgICAwLCAgICAgMCwgICAgMjUsICAgICAyLCAgICAgMSwgICAgIDQsICAgIDI2LAotICAgICAwLCAgICA1OSwgICAgNzIsICAgIDk1LCAgICAgMywgICAgNzUsICAgIDc0LCAgIDEyOCwgICAxMzAsICAgMTMxLAotICAgMTI5LCAgIDExMSwgICAxMTIsICAgMTEzLCAgIDExNCwgICAgIDAsICAgIDE1LCAgICAgMCwgICAxMjIsICAgMTI0LAotICAgMTI1LCAgIDEyMywgICAxMTUsICAgIDczLCAgICAgMCwgICAxMjQsICAgMTI1LCAgIDExNywgICAxMDMsICAgMTAxLAotICAgMTEwLCAgIDEwNywgICAxMjAsICAgMTIxLCAgICAgNywgICAgIDgsICAgICA2LCAgICAxMSwgICAgMTIsICAgICAwLAotICAgICAwLCAgICAgOSwgICAgMTAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDEzLCAgICAxNCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAyMywgICAgMjcsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA3NiwgICAgNzcsICAgIDgzLAotICAgIDgxLCAgICAgMCwgICAgIDAsICAgIDc4LCAgICA4NSwgICAgODgsICAgIDkwLCAgICAgMCwgICAgIDAsICAgMTA1LAotICAgMTAyLCAgIDEwOCwgICAgIDAsICAgMTA0LCAgICAzMywgICAgIDAsICAgICA1LCAgICA1NSwgICAgNTQsICAgICAwLAotICAgIDUyLCAgICA1MSwgICAgNTAsICAgIDQ5LCAgICA0OCwgICAgNDIsICAgIDQzLCAgICA0NiwgICAgNDcsICAgIDQ0LAotICAgIDQ1LCAgICA0MCwgICAgNDEsICAgIDM0LCAgICAzOCwgICAgMzksICAgIDM1LCAgICAzNiwgICAgMzcsICAgMTMwLAotICAgICAwLCAgICAxNywgICAgMTYsICAgICAwLCAgICAyMCwgICAgMTksICAgICAwLCAgICAyNiwgICAgIDAsICAgIDI5LAotICAgIDMwLCAgICAgMCwgICAgNjksICAgIDk2LCAgICAgMCwgICAgNzAsICAgIDc5LCAgICA4MCwgICAgODQsICAgIDgyLAotICAgICAwLCAgICA5MSwgICAgOTMsICAgICAwLCAgIDEyNiwgICAgNzUsICAgICAwLCAgICAgMCwgICAgODcsICAgIDg5LAotICAgIDYxLCAgIDEwNiwgICAgIDAsICAgIDMyLCAgICAgMCwgICAgMTgsICAgIDIxLCAgICAyMiwgICAgIDAsICAgIDI4LAotICAgIDMxLCAgICA3MSwgICAgOTIsICAgIDg2LCAgICAgMCwgICAgIDAsICAgIDk0LCAgIDExOSwgICAgNTMsICAgIDI0LAotICAgMTI3LCAgICAgMCwgICAgIDAsICAgICAwCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlkZWZnb3RvW10gPSB7ICAgMjEyLAotICAgIDM3LCAgICA4MCwgICAgMzksICAgMTY4LCAgICA0MCwgICAxMTQsICAgMTcxLCAgICA0MSwgICAgNDIsICAgIDQzLAotICAgIDQ0LCAgIDEyNCwgICAxMjUsICAgMTI2LCAgIDEyNywgICAxODUsICAgIDU4LCAgICA2MywgICAxODcsICAgMTc2LAotICAgIDQ3Ci19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlwYWN0W10gPSB7ICAgMjA1LAotLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgIDQ2LCAgICA0NiwgICAgNDYsICAgIDQ2LAotICAgMjY5LCAgICA1NywgICAgNDYsICAgIDQ2LCAgIDEwMCwgICAxMzQsICAgLTE0LC0zMjc2OCwgICAyMjgsICAgMjI4LAotLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAyMDUsICAgMjA1LCAgIDIwNSwgICAyMDUsICAgMjA1LAotICAgMjA1LCAgICAyMSwtMzI3NjgsICAgMjA1LCAgIDIwNSwtMzI3NjgsLTMyNzY4LCAgIC0xNiwgICA1MDQsICAgMjA1LAotICAgIDIyLC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAxMDcsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LAotLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAyMDUsICAgIDE0LCAgICAyMywtMzI3NjgsICAgICA3LAotICAgIDI0LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICAxMCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAgMzQsLTMyNzY4LAotLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICAxNCwgICAgMTQsICAgIDE0LCAgICAxNCwgICAgMTQsICAgLTI2LAotICAgLTIxLCAgICAxNCwgICAgMTQsICAgMjA1LCAgIDIwNSwgICAyMDUsICAgMjA1LCAgIDIwNSwgICAyMDUsICAgMjA1LAotICAgMjA1LCAgIDIwNSwgICAyMDUsICAgMjA1LCAgIDIwNSwgICAyMDUsICAgMjA1LCAgIDIwNSwgICAyMDUsICAgMjA1LAotICAgMjA1LCAgIDIwNSwgICAyMDUsICAgMjA1LCAgIDIwNSwgICAyMDUsLTMyNzY4LC0zMjc2OCwgICA0MTksICAgNDM4LAotICAgMjA1LC0zMjc2OCwgICA1MDQsICAgLTI1LCAgICAtMiwgICAgNDYsICAgIDUzLCAgICAgOCwgICAgIDgsICAgICA4LAotICAgICA4LCAgICAtMSwgICAzNTksLTMyNzY4LCAgIC00MSwtMzI3NjgsLTMyNzY4LCAgICAgOSwgICAgNDIsICAgIDU0LAotLTMyNzY4LC0zMjc2OCwgICAyMjgsLTMyNzY4LC0zMjc2OCwgICAyMDUsICAgNTA0LCAgIDUwNCwgICA1MDQsICAgNDY3LAotICAgNTU2LCAgIDU4MCwgICA2MDMsICAgNjI1LCAgIDY0NiwgICA2NjUsICAgNjY1LCAgIDI1NCwgICAyNTQsICAgMjU0LAotICAgMjU0LCAgIDEyNCwgICAxMjQsICAgMzU2LCAgIDQxNiwgICA0MTYsICAgIDE0LCAgICAxNCwgICAgMTQsICAgIDg5LAotICAgMjA1LC0zMjc2OCwtMzI3NjgsICAgMjA1LC0zMjc2OCwtMzI3NjgsICAgLTE3LCAgIDIwNSwgICAyMDUsLTMyNzY4LAotLTMyNzY4LCAgIDIwNSwgICAgOTMsLTMyNzY4LCAgICA0NiwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LAotICAgIDQ1LC0zMjc2OCwtMzI3NjgsICAgIDUwLC0zMjc2OCwgICAxNDYsICAgLTIyLCAgIDEyOCwtMzI3NjgsLTMyNzY4LAotICAgMzMzLC0zMjc2OCwgICAgNjgsICAgIDE0LCAgIDIwNSwgICAgMTQsICAgIDE0LC0zMjc2OCwgICAgLTMsICAgNTA0LAotICAgIDE0LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICA2NywgICAyMjgsLTMyNzY4LC0zMjc2OCwgICA1MzEsLTMyNzY4LAotLTMyNzY4LCAgIDEyNSwgICAxMjYsLTMyNzY4Ci19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlwZ290b1tdID0gey0zMjc2OCwKLS0zMjc2OCwgICAgIDMsICAgIC01LC0zMjc2OCwtMzI3NjgsICAgLTQ0LCAgICAxMiwtMzI3NjgsLTMyNzY4LCAgIC03NiwKLS0zMjc2OCwgICAgNzksLTMyNzY4LCAgICAxMSwgICAgMTYsICAgICAxLCAgICAgMCwgICAxMTMsLTMyNzY4LCAgICAgMiwKLS0zMjc2OAotfTsKLQotCi0jZGVmaW5lCVlZTEFTVAkJNzI0Ci0KLQotc3RhdGljIGNvbnN0IHNob3J0IHl5dGFibGVbXSA9IHsgICAgNDYsCi0gICAgNDUsICAgMTgxLCAgICAzOCwgICAgODQsICAgMTY5LCAgICA1NywgICAgNzIsICAgMjA2LCAgICA1MiwgICAgNTMsCi0gICAgNTQsICAgIDU1LCAgICA4NCwgICAgODQsICAgIDY0LCAgICA2NSwgICAxMjIsICAgMTg4LCAgICA3MywgICAgNzQsCi0gICAgNzUsICAgIDc2LCAgICA3NywgICAgNzgsICAgIDc5LCAgIDEzMCwgICAxNjksICAgMTMxLCAgICA4MiwgICAgODMsCi0gICAgNDYsICAgIDgxLCAgIDE2MiwgICAxNjUsICAgMTEzLCAgIC02NiwgICAxMTYsICAgMTI5LCAgIDEzNSwgICAgNDYsCi0gICAxMTUsICAgMTcwLCAgIDIwNywgICAxMzYsICAgMTMyLCAgIDEyMCwgICAxOTgsICAgIDQ4LCAgICA0OSwgICAgNTAsCi0gICAxMzMsICAgIDQ4LCAgICA0OSwgICAgNTAsICAgMTM0LCAgICA0NiwgICAxMjgsICAgMTIxLCAgICA0OCwgICAgNDksCi0gICAgNTAsICAgMjEwLCAgIDE4MiwgICAgNTksICAgMTcwLCAgIDEyMiwgICAxMjMsICAgMTA3LCAgIDEwOCwgICAxMDksCi0gICAxMTAsICAgMTExLCAgIDExMiwgICAxOTEsICAgMTkyLCAgICA2MCwgICAgNjEsICAgIDYyLCAgIDEzNywgICAxMzgsCi0gICAxMzksICAgMTQwLCAgIDE0MSwgICAxNDIsICAgMTQzLCAgIDE0NCwgICAxNDUsICAgMTQ2LCAgIDE0NywgICAxNDgsCi0gICAxNDksICAgMTUwLCAgIDE1MSwgICAxNTIsICAgMTUzLCAgIDE1NCwgICAxNTUsICAgMTU2LCAgIDE1NywgICAxNTgsCi0gICAxNTksICAgIDUxLCAgIDE3NCwgICAtOTcsICAgMTc1LCAgICA1MSwgICAgNTksICAgLTY4LCAgIDIwMywgICAyMDgsCi0gICAxNjMsICAgMTY2LCAgICA1MSwgICAxNjcsICAgMjA0LCAgIDE3NSwgICAxNzQsICAgMTczLCAgICA2NiwgICAgNjcsCi0gICAgNjIsICAgMTE3LCAgIDE4NiwgICAxOTksICAgMjEzLCAgIDIxNCwgICAxNzIsICAgIDY4LCAgIDExOCwgICAxMTksCi0gICAxOTQsICAgICAwLCAgIDE4NiwgICAxOTMsICAgICA1LCAgIDE4OSwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsCi0gICAxOTAsICAgIDEyLCAgICAgMCwgICAgMTQsICAgMTIwLCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksCi0gICAgMjAsICAgIDIxLCAgICA2OSwgICAgIDAsICAgIDcwLCAgIDE5NiwgICAxMjEsICAgIDcxLCAgIDE5NywgICAgIDAsCi0gICAyMDUsICAgICAwLCAgIDExMywgICAyMDAsICAgMTIyLCAgIDEyMywgICAyMDEsICAgMTE4LCAgIDExOSwgICAgIDAsCi0gICAxMDEsICAgMTAyLCAgIDEwMywgICAxMDQsICAgMTA1LCAgIDEwNiwgICAyMDIsICAgMTA3LCAgIDEwOCwgICAxMDksCi0gICAxMTAsICAgMTExLCAgIDExMiwgICAxMjAsICAgICAwLCAgIDE5NCwgICAgIDAsICAgMTg2LCAgICAgMCwgICAyMDksCi0gICAgIDAsICAgICAwLCAgIDE4MywgICAgIDAsICAgICAwLCAgIDEyMSwgICAxNzcsICAgMTc4LCAgIDE3OSwgICAxODAsCi0gICAgIDAsICAgMTg0LCAgICAgMCwgICAxMjIsICAgMTIzLCAgIDE4NiwgICAyMTEsICAgICAxLCAgICAgMiwgICAgIDMsCi0gICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsCi0gICAgMTQsICAgICAwLCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsCi0gICAgIDAsICAgIDIzLCAgICAyNCwgICAgMjUsICAgICA1LCAgICAgMCwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsCi0gICAgIDAsICAgIDEyLCAgICAyNiwgICAgMTQsICAgICAwLCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksCi0gICAgMjAsICAgIDIxLCAgICAgMCwgICAgMjcsICAgIDI4LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAyOSwgICAgMzAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgMzEsICAgIDMyLCAgICAzMywgICAgMzQsICAgIDM1LCAgICAgMCwgICAgIDAsCi0gICAgMzYsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksCi0gICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAgMCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsCi0gICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgICAwLCAgICAyMywgICAgMjQsICAgIDI1LCAgICA5OSwgICAxMDAsCi0gICAxMDEsICAgMTAyLCAgIDEwMywgICAxMDQsICAgMTA1LCAgIDEwNiwgICAgMjYsICAgMTA3LCAgIDEwOCwgICAxMDksCi0gICAxMTAsICAgMTExLCAgIDExMiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDI3LCAgICAyOCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAyOSwgICAgMzAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDU2LCAgICAzMiwgICAgMzMsCi0gICAgMzQsICAgIDM1LCAgICAgMCwgICAgIDAsICAgIDM2LCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDUsCi0gICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgIDAsCi0gICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAgMCwgICAgMjMsCi0gICAgMjQsICAgIDI1LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgNSwgICAgIDAsICAgICA3LCAgICAgOCwgICAgIDksCi0gICAgMTAsICAgICAwLCAgICAxMiwgICAgIDAsICAgIDE0LCAgICAgMCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsCi0gICAgMTksICAgIDIwLCAgICAyMSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMjksICAgIDMwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgIDMxLCAgICAzMiwgICAgMzMsICAgIDM0LCAgICAzNSwgICAxMjAsICAgICAwLCAgICAzNiwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAxMDIsICAgMTAzLCAgIDEwNCwgICAxMDUsICAgMTA2LCAgIDEyMSwgICAxMDcsCi0gICAxMDgsICAgMTA5LCAgIDExMCwgICAxMTEsICAgMTEyLCAgICAgMCwgICAxMjIsICAgMTIzLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAxODMsICAgIDQ4LCAgIDE2MCwgICAgNTAsICAgICA3LCAgICAgOCwgICAgIDksCi0gICAgMTAsICAgICAwLCAgICAxMiwgICAgIDAsICAgIDE0LCAgICAgMCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsCi0gICAgMTksICAgIDIwLCAgICAyMSwgICAgNDgsICAgMTYwLCAgICA1MCwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsCi0gICAgIDAsICAgIDEyLCAgICAgMCwgICAgMTQsICAgICAwLCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksCi0gICAgMjAsICAgIDIxLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDEwNCwgICAxMDUsICAgMTA2LCAgIDE2MSwgICAxMDcsCi0gICAxMDgsICAgMTA5LCAgIDExMCwgICAxMTEsICAgMTEyLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA1MSwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTY0LCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICA4NSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDUxLCAgICA4NiwgICAgODcsCi0gICAgODgsICAgIDg5LCAgICA5MCwgICAgOTEsICAgIDkyLCAgICA5MywgICAgOTQsICAgIDk1LCAgICA5NiwgICAgOTcsCi0gICAgOTgsICAgIDk5LCAgIDEwMCwgICAxMDEsICAgMTAyLCAgIDEwMywgICAxMDQsICAgMTA1LCAgIDEwNiwgICAgIDAsCi0gICAxMDcsICAgMTA4LCAgIDEwOSwgICAxMTAsICAgMTExLCAgIDExMiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgODUsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTk1LCAgICA4NiwgICAgODcsICAgIDg4LCAgICA4OSwgICAgOTAsCi0gICAgOTEsICAgIDkyLCAgICA5MywgICAgOTQsICAgIDk1LCAgICA5NiwgICAgOTcsICAgIDk4LCAgICA5OSwgICAxMDAsCi0gICAxMDEsICAgMTAyLCAgIDEwMywgICAxMDQsICAgMTA1LCAgIDEwNiwgICAgIDAsICAgMTA3LCAgIDEwOCwgICAxMDksCi0gICAxMTAsICAgMTExLCAgIDExMiwgICAgODcsICAgIDg4LCAgICA4OSwgICAgOTAsICAgIDkxLCAgICA5MiwgICAgOTMsCi0gICAgOTQsICAgIDk1LCAgICA5NiwgICAgOTcsICAgIDk4LCAgICA5OSwgICAxMDAsICAgMTAxLCAgIDEwMiwgICAxMDMsCi0gICAxMDQsICAgMTA1LCAgIDEwNiwgICAgIDAsICAgMTA3LCAgIDEwOCwgICAxMDksICAgMTEwLCAgIDExMSwgICAxMTIsCi0gICAgODksICAgIDkwLCAgICA5MSwgICAgOTIsICAgIDkzLCAgICA5NCwgICAgOTUsICAgIDk2LCAgICA5NywgICAgOTgsCi0gICAgOTksICAgMTAwLCAgIDEwMSwgICAxMDIsICAgMTAzLCAgIDEwNCwgICAxMDUsICAgMTA2LCAgICAgMCwgICAxMDcsCi0gICAxMDgsICAgMTA5LCAgIDExMCwgICAxMTEsICAgMTEyLCAgICA5MCwgICAgOTEsICAgIDkyLCAgICA5MywgICAgOTQsCi0gICAgOTUsICAgIDk2LCAgICA5NywgICAgOTgsICAgIDk5LCAgIDEwMCwgICAxMDEsICAgMTAyLCAgIDEwMywgICAxMDQsCi0gICAxMDUsICAgMTA2LCAgICAgMCwgICAxMDcsICAgMTA4LCAgIDEwOSwgICAxMTAsICAgMTExLCAgIDExMiwgICAgOTEsCi0gICAgOTIsICAgIDkzLCAgICA5NCwgICAgOTUsICAgIDk2LCAgICA5NywgICAgOTgsICAgIDk5LCAgIDEwMCwgICAxMDEsCi0gICAxMDIsICAgMTAzLCAgIDEwNCwgICAxMDUsICAgMTA2LCAgICAgMCwgICAxMDcsICAgMTA4LCAgIDEwOSwgICAxMTAsCi0gICAxMTEsICAgMTEyLCAgICA5MiwgICAgOTMsICAgIDk0LCAgICA5NSwgICAgOTYsICAgIDk3LCAgICA5OCwgICAgOTksCi0gICAxMDAsICAgMTAxLCAgIDEwMiwgICAxMDMsICAgMTA0LCAgIDEwNSwgICAxMDYsICAgICAwLCAgIDEwNywgICAxMDgsCi0gICAxMDksICAgMTEwLCAgIDExMSwgICAxMTIsICAgIDkzLCAgICA5NCwgICAgOTUsICAgIDk2LCAgICA5NywgICAgOTgsCi0gICAgOTksICAgMTAwLCAgIDEwMSwgICAxMDIsICAgMTAzLCAgIDEwNCwgICAxMDUsICAgMTA2LCAgICAgMCwgICAxMDcsCi0gICAxMDgsICAgMTA5LCAgIDExMCwgICAxMTEsICAgMTEyLCAgICA5NSwgICAgOTYsICAgIDk3LCAgICA5OCwgICAgOTksCi0gICAxMDAsICAgMTAxLCAgIDEwMiwgICAxMDMsICAgMTA0LCAgIDEwNSwgICAxMDYsICAgICAwLCAgIDEwNywgICAxMDgsCi0gICAxMDksICAgMTEwLCAgIDExMSwgICAxMTIKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eWNoZWNrW10gPSB7ICAgICAwLAotICAgICAwLCAgICAgMywgICAgIDAsICAgIDMwLCAgICAzMCwgICAgMTEsICAgIDIxLCAgICAzMCwgICAgIDcsICAgICA4LAotICAgICA5LCAgICAxMCwgICAgMzAsICAgIDMwLCAgICAxMywgICAgMTQsICAgIDU4LCAgICA1OSwgICAgMTksICAgIDIwLAotICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMTksICAgIDMwLCAgICAyMSwgICAgMzQsICAgIDM1LAotICAgIDMxLCAgICAzMSwgICAxMDksICAgMTEwLCAgICA0MCwgICAgMTUsICAgIDE1LCAgICAxNSwgICAgNjUsICAgIDQwLAotICAgIDQwLCAgICA2NywgICAgNjUsICAgIDY1LCAgICAyMSwgICAgMzgsICAgIDY0LCAgICAgNiwgICAgIDcsICAgICA4LAotICAgIDQxLCAgICAgNiwgICAgIDcsICAgICA4LCAgICAyMSwgICAgNTYsICAgIDU2LCAgICA1MCwgICAgIDYsICAgICA3LAotICAgICA4LCAgICA2NSwgICAgNjQsICAgICA3LCAgICA2NywgICAgNTgsICAgIDU5LCAgICA1NCwgICAgNTUsICAgIDU2LAotICAgIDU3LCAgICA1OCwgICAgNTksICAgIDY1LCAgICAyMSwgICAgMTksICAgIDIwLCAgICAyMSwgICAgODQsICAgIDg1LAotICAgIDg2LCAgICA4NywgICAgODgsICAgIDg5LCAgICA5MCwgICAgOTEsICAgIDkyLCAgICA5MywgICAgOTQsICAgIDk1LAotICAgIDk2LCAgICA5NywgICAgOTgsICAgIDk5LCAgIDEwMCwgICAxMDEsICAgMTAyLCAgIDEwMywgICAxMDQsICAgMTA1LAotICAgMTA2LCAgICA2MCwgICAgNTAsICAgIDE1LCAgICA2MywgICAgNjAsICAgICA3LCAgICAxNSwgICAgNjQsICAgIDQyLAotICAgMTA5LCAgIDExMCwgICAgNjAsICAgMTExLCAgICA2NSwgICAgNjMsICAgIDUwLCAgIDExNiwgICAgMTksICAgIDIwLAotICAgIDIxLCAgICAxNSwgICAxMjMsICAgMTY4LCAgICAgMCwgICAgIDAsICAgMTE1LCAgICAxNSwgICAgMjIsICAgIDIzLAotICAgMTM2LCAgICAtMSwgICAxMzMsICAgMTMzLCAgICAgNywgICAxMjUsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLAotICAgMTI1LCAgICAxNCwgICAgLTEsICAgIDE2LCAgICAzOCwgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLAotICAgIDIzLCAgICAyNCwgICAgMTksICAgIC0xLCAgICAyMSwgICAxNjEsICAgIDUwLCAgICAyNCwgICAxNjQsICAgIC0xLAotICAgIDE1LCAgICAtMSwgICAxNjgsICAgMTY5LCAgICA1OCwgICAgNTksICAgMTcyLCAgICAyMiwgICAgMjMsICAgIC0xLAotICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgMTc1LCAgICA1NCwgICAgNTUsICAgIDU2LAotICAgIDU3LCAgICA1OCwgICAgNTksICAgIDM4LCAgICAtMSwgICAxOTEsICAgIC0xLCAgIDE4OCwgICAgLTEsICAgMTk1LAotICAgIC0xLCAgICAtMSwgICAgNjUsICAgIC0xLCAgICAtMSwgICAgNTAsICAgMTE4LCAgIDExOSwgICAxMjAsICAgMTIxLAotICAgIC0xLCAgIDEyMywgICAgLTEsICAgIDU4LCAgICA1OSwgICAyMDYsICAgMjA2LCAgICAgMywgICAgIDQsICAgICA1LAotICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LAotICAgIDE2LCAgICAtMSwgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LAotICAgIC0xLCAgICAyNywgICAgMjgsICAgIDI5LCAgICAgNywgICAgLTEsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLAotICAgIC0xLCAgICAxNCwgICAgMzgsICAgIDE2LCAgICAtMSwgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLAotICAgIDIzLCAgICAyNCwgICAgLTEsICAgIDQ5LCAgICA1MCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNTQsICAgIDU1LAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYyLCAgICA2MywgICAgLTEsICAgIC0xLAotICAgIDY2LCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLAotICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgLTEsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLAotICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAtMSwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgNDUsICAgIDQ2LAotICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDM4LCAgICA1NCwgICAgNTUsICAgIDU2LAotICAgIDU3LCAgICA1OCwgICAgNTksICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA0OSwgICAgNTAsICAgIC0xLAotICAgIC0xLCAgICAtMSwgICAgNTQsICAgIDU1LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA1OSwgICAgNjAsICAgIDYxLAotICAgIDYyLCAgICA2MywgICAgLTEsICAgIC0xLCAgICA2NiwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LAotICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIC0xLAotICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgLTEsICAgIDI3LAotICAgIDI4LCAgICAyOSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgIDcsICAgIC0xLCAgICAgOSwgICAgMTAsICAgIDExLAotICAgIDEyLCAgICAtMSwgICAgMTQsICAgIC0xLCAgICAxNiwgICAgLTEsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLAotICAgIDIyLCAgICAyMywgICAgMjQsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDU0LCAgICA1NSwgICAgLTEsICAgIC0xLAotICAgIC0xLCAgICA1OSwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDM4LCAgICAtMSwgICAgNjYsICAgIC0xLAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQ4LCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTAsICAgIDU0LAotICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgLTEsICAgIDU4LCAgICA1OSwgICAgLTEsICAgIC0xLAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDY1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLAotICAgIDEyLCAgICAtMSwgICAgMTQsICAgIC0xLCAgICAxNiwgICAgLTEsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLAotICAgIDIyLCAgICAyMywgICAgMjQsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLAotICAgIC0xLCAgICAxNCwgICAgLTEsICAgIDE2LCAgICAtMSwgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLAotICAgIDIzLCAgICAyNCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTAsICAgIDU0LAotICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjAsICAgIC0xLAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA1MCwgICAgLTEsICAgIC0xLAotICAgIC0xLCAgICAtMSwgICAgMjYsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2MCwgICAgMzIsICAgIDMzLAotICAgIDM0LCAgICAzNSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLAotICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIC0xLAotICAgIDU0LCAgICA1NSwgICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTksICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDI2LAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2OCwgICAgMzIsICAgIDMzLCAgICAzNCwgICAgMzUsICAgIDM2LAotICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LAotICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIC0xLCAgICA1NCwgICAgNTUsICAgIDU2LAotICAgIDU3LCAgICA1OCwgICAgNTksICAgIDMzLCAgICAzNCwgICAgMzUsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LAotICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LAotICAgIDUwLCAgICA1MSwgICAgNTIsICAgIC0xLCAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LAotICAgIDM1LCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LAotICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgLTEsICAgIDU0LAotICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLAotICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDUwLAotICAgIDUxLCAgICA1MiwgICAgLTEsICAgIDU0LCAgICA1NSwgICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDM3LAotICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LAotICAgIDQ4LCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgLTEsICAgIDU0LCAgICA1NSwgICAgNTYsICAgIDU3LAotICAgIDU4LCAgICA1OSwgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LAotICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICAtMSwgICAgNTQsICAgIDU1LAotICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LAotICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgLTEsICAgIDU0LAotICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LAotICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICAtMSwgICAgNTQsICAgIDU1LAotICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5Ci19OwotLyogLSotQy0qLSAgTm90ZSBzb21lIGNvbXBpbGVycyBjaG9rZSBvbiBjb21tZW50cyBvbiBgI2xpbmUnIGxpbmVzLiAgKi8KLSNsaW5lIDMgIi9zdG9uZS9qaW1iL21haW4tOThyMi9zaGFyZS9iaXNvbi5zaW1wbGUiCi0KLS8qIFNrZWxldG9uIG91dHB1dCBwYXJzZXIgZm9yIGJpc29uLAotICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KLQotLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hlbiB0aGlzIGZpbGUgaXMgY29waWVkIGJ5IEJpc29uIGludG8gYQotICAgQmlzb24gb3V0cHV0IGZpbGUsIHlvdSBtYXkgdXNlIHRoYXQgb3V0cHV0IGZpbGUgd2l0aG91dCByZXN0cmljdGlvbi4KLSAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gd2FzIGFkZGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgIGluIHZlcnNpb24gMS4yNCBvZiBCaXNvbi4gICovCi0KLSNpZm5kZWYgYWxsb2NhCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlIC8qIG5vdCBHTlUgQy4gICovCi0jaWYgKCFkZWZpbmVkIChfX1NURENfXykgJiYgZGVmaW5lZCAoc3BhcmMpKSB8fCBkZWZpbmVkIChfX3NwYXJjX18pIHx8IGRlZmluZWQgKF9fc3BhcmMpIHx8IGRlZmluZWQgKF9fc2dpKQotI2luY2x1ZGUgPGFsbG9jYS5oPgotI2Vsc2UgLyogbm90IHNwYXJjICovCi0jaWYgZGVmaW5lZCAoTVNET1MpICYmICFkZWZpbmVkIChfX1RVUkJPQ19fKQotI2Vsc2UgLyogbm90IE1TRE9TLCBvciBfX1RVUkJPQ19fICovCi0jaWYgZGVmaW5lZChfQUlYKQotICNwcmFnbWEgYWxsb2NhCi0jZWxzZSAvKiBub3QgTVNET1MsIF9fVFVSQk9DX18sIG9yIF9BSVggKi8KLSNpZmRlZiBfX2hwdXgKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci12b2lkICphbGxvY2EgKHVuc2lnbmVkIGludCk7Ci19OwotI2Vsc2UgLyogbm90IF9fY3BsdXNwbHVzICovCi12b2lkICphbGxvY2EgKCk7Ci0jZW5kaWYgLyogbm90IF9fY3BsdXNwbHVzICovCi0jZW5kaWYgLyogX19ocHV4ICovCi0jZW5kaWYgLyogbm90IF9BSVggKi8KLSNlbmRpZiAvKiBub3QgTVNET1MsIG9yIF9fVFVSQk9DX18gKi8KLSNlbmRpZiAvKiBub3Qgc3BhcmMuICAqLwotI2VuZGlmIC8qIG5vdCBHTlUgQy4gICovCi0jZW5kaWYgLyogYWxsb2NhIG5vdCBkZWZpbmVkLiAgKi8KLQotLyogVGhpcyBpcyB0aGUgcGFyc2VyIGNvZGUgdGhhdCBpcyB3cml0dGVuIGludG8gZWFjaCBiaXNvbiBwYXJzZXIKLSAgd2hlbiB0aGUgJXNlbWFudGljX3BhcnNlciBkZWNsYXJhdGlvbiBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBncmFtbWFyLgotICBJdCB3YXMgd3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuIGJ5IHNpbXBsaWZ5aW5nIHRoZSBoYWlyeSBwYXJzZXIKLSAgdXNlZCB3aGVuICVzZW1hbnRpY19wYXJzZXIgaXMgc3BlY2lmaWVkLiAgKi8KLQotLyogTm90ZTogdGhlcmUgbXVzdCBiZSBvbmx5IG9uZSBkb2xsYXIgc2lnbiBpbiB0aGlzIGZpbGUuCi0gICBJdCBpcyByZXBsYWNlZCBieSB0aGUgbGlzdCBvZiBhY3Rpb25zLCBlYWNoIGFjdGlvbgotICAgYXMgb25lIGNhc2Ugb2YgdGhlIHN3aXRjaC4gICovCi0KLSNkZWZpbmUgeXllcnJvawkJKHl5ZXJyc3RhdHVzID0gMCkKLSNkZWZpbmUgeXljbGVhcmluCSh5eWNoYXIgPSBZWUVNUFRZKQotI2RlZmluZSBZWUVNUFRZCQktMgotI2RlZmluZSBZWUVPRgkJMAotI2RlZmluZSBZWUFDQ0VQVAlyZXR1cm4oMCkKLSNkZWZpbmUgWVlBQk9SVCAJcmV0dXJuKDEpCi0jZGVmaW5lIFlZRVJST1IJCWdvdG8geXllcnJsYWIxCi0vKiBMaWtlIFlZRVJST1IgZXhjZXB0IGRvIGNhbGwgeXllcnJvci4KLSAgIFRoaXMgcmVtYWlucyBoZXJlIHRlbXBvcmFyaWx5IHRvIGVhc2UgdGhlCi0gICB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbWVhbmluZyBvZiBZWUVSUk9SLCBmb3IgR0NDLgotICAgT25jZSBHQ0MgdmVyc2lvbiAyIGhhcyBzdXBwbGFudGVkIHZlcnNpb24gMSwgdGhpcyBjYW4gZ28uICAqLwotI2RlZmluZSBZWUZBSUwJCWdvdG8geXllcnJsYWIKLSNkZWZpbmUgWVlSRUNPVkVSSU5HKCkgICghIXl5ZXJyc3RhdHVzKQotI2RlZmluZSBZWUJBQ0tVUCh0b2tlbiwgdmFsdWUpIFwKLWRvCQkJCQkJCQlcCi0gIGlmICh5eWNoYXIgPT0gWVlFTVBUWSAmJiB5eWxlbiA9PSAxKQkJCQlcCi0gICAgeyB5eWNoYXIgPSAodG9rZW4pLCB5eWx2YWwgPSAodmFsdWUpOwkJCVwKLSAgICAgIHl5Y2hhcjEgPSBZWVRSQU5TTEFURSAoeXljaGFyKTsJCQkJXAotICAgICAgWVlQT1BTVEFDSzsJCQkJCQlcCi0gICAgICBnb3RvIHl5YmFja3VwOwkJCQkJCVwKLSAgICB9CQkJCQkJCQlcCi0gIGVsc2UJCQkJCQkJCVwKLSAgICB7IHl5ZXJyb3IgKCJzeW50YXggZXJyb3I6IGNhbm5vdCBiYWNrIHVwIik7IFlZRVJST1I7IH0JXAotd2hpbGUgKDApCi0KLSNkZWZpbmUgWVlURVJST1IJMQotI2RlZmluZSBZWUVSUkNPREUJMjU2Ci0KLSNpZm5kZWYgWVlQVVJFCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgpCi0jZW5kaWYKLQotI2lmZGVmIFlZUFVSRQotI2lmZGVmIFlZTFNQX05FRURFRAotI2lmZGVmIFlZTEVYX1BBUkFNCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsLCAmeXlsbG9jLCBZWUxFWF9QQVJBTSkKLSNlbHNlCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsLCAmeXlsbG9jKQotI2VuZGlmCi0jZWxzZSAvKiBub3QgWVlMU1BfTkVFREVEICovCi0jaWZkZWYgWVlMRVhfUEFSQU0KLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwsIFlZTEVYX1BBUkFNKQotI2Vsc2UKLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwpCi0jZW5kaWYKLSNlbmRpZiAvKiBub3QgWVlMU1BfTkVFREVEICovCi0jZW5kaWYKLQotLyogSWYgbm9ucmVlbnRyYW50LCBnZW5lcmF0ZSB0aGUgdmFyaWFibGVzIGhlcmUgKi8KLQotI2lmbmRlZiBZWVBVUkUKLQotaW50CXl5Y2hhcjsJCQkvKiAgdGhlIGxvb2thaGVhZCBzeW1ib2wJCSovCi1ZWVNUWVBFCXl5bHZhbDsJCQkvKiAgdGhlIHNlbWFudGljIHZhbHVlIG9mIHRoZQkJKi8KLQkJCQkvKiAgbG9va2FoZWFkIHN5bWJvbAkJCSovCi0KLSNpZmRlZiBZWUxTUF9ORUVERUQKLVlZTFRZUEUgeXlsbG9jOwkJCS8qICBsb2NhdGlvbiBkYXRhIGZvciB0aGUgbG9va2FoZWFkCSovCi0JCQkJLyogIHN5bWJvbAkJCQkqLwotI2VuZGlmCi0KLWludCB5eW5lcnJzOwkJCS8qICBudW1iZXIgb2YgcGFyc2UgZXJyb3JzIHNvIGZhciAgICAgICAqLwotI2VuZGlmICAvKiBub3QgWVlQVVJFICovCi0KLSNpZiBZWURFQlVHICE9IDAKLWludCB5eWRlYnVnOwkJCS8qICBub256ZXJvIG1lYW5zIHByaW50IHBhcnNlIHRyYWNlCSovCi0vKiBTaW5jZSB0aGlzIGlzIHVuaW5pdGlhbGl6ZWQsIGl0IGRvZXMgbm90IHN0b3AgbXVsdGlwbGUgcGFyc2VycwotICAgZnJvbSBjb2V4aXN0aW5nLiAgKi8KLSNlbmRpZgotCi0vKiAgWVlJTklUREVQVEggaW5kaWNhdGVzIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHBhcnNlcidzIHN0YWNrcwkqLwotCi0jaWZuZGVmCVlZSU5JVERFUFRICi0jZGVmaW5lIFlZSU5JVERFUFRIIDIwMAotI2VuZGlmCi0KLS8qICBZWU1BWERFUFRIIGlzIHRoZSBtYXhpbXVtIHNpemUgdGhlIHN0YWNrcyBjYW4gZ3JvdyB0bwotICAgIChlZmZlY3RpdmUgb25seSBpZiB0aGUgYnVpbHQtaW4gc3RhY2sgZXh0ZW5zaW9uIG1ldGhvZCBpcyB1c2VkKS4gICovCi0KLSNpZiBZWU1BWERFUFRIID09IDAKLSN1bmRlZiBZWU1BWERFUFRICi0jZW5kaWYKLQotI2lmbmRlZiBZWU1BWERFUFRICi0jZGVmaW5lIFlZTUFYREVQVEggMTAwMDAKLSNlbmRpZgotCi0vKiBQcmV2ZW50IHdhcm5pbmcgaWYgLVdzdHJpY3QtcHJvdG90eXBlcy4gICovCi0jaWZkZWYgX19HTlVDX18KLWludCB5eXBhcnNlICh2b2lkKTsKLSNlbmRpZgotDAotI2lmIF9fR05VQ19fID4gMQkJLyogR05VIEMgYW5kIEdOVSBDKysgZGVmaW5lIHRoaXMuICAqLwotI2RlZmluZSBfX3l5X21lbWNweShUTyxGUk9NLENPVU5UKQlfX2J1aWx0aW5fbWVtY3B5KFRPLEZST00sQ09VTlQpCi0jZWxzZQkJCQkvKiBub3QgR05VIEMgb3IgQysrICovCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi0KLS8qIFRoaXMgaXMgdGhlIG1vc3QgcmVsaWFibGUgd2F5IHRvIGF2b2lkIGluY29tcGF0aWJpbGl0aWVzCi0gICBpbiBhdmFpbGFibGUgYnVpbHQtaW4gZnVuY3Rpb25zIG9uIHZhcmlvdXMgc3lzdGVtcy4gICovCi1zdGF0aWMgdm9pZAotX195eV9tZW1jcHkgKHRvLCBmcm9tLCBjb3VudCkKLSAgICAgY2hhciAqdG87Ci0gICAgIGNoYXIgKmZyb207Ci0gICAgIGludCBjb3VudDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqZiA9IGZyb207Ci0gIHJlZ2lzdGVyIGNoYXIgKnQgPSB0bzsKLSAgcmVnaXN0ZXIgaW50IGkgPSBjb3VudDsKLQotICB3aGlsZSAoaS0tID4gMCkKLSAgICAqdCsrID0gKmYrKzsKLX0KLQotI2Vsc2UgLyogX19jcGx1c3BsdXMgKi8KLQotLyogVGhpcyBpcyB0aGUgbW9zdCByZWxpYWJsZSB3YXkgdG8gYXZvaWQgaW5jb21wYXRpYmlsaXRpZXMKLSAgIGluIGF2YWlsYWJsZSBidWlsdC1pbiBmdW5jdGlvbnMgb24gdmFyaW91cyBzeXN0ZW1zLiAgKi8KLXN0YXRpYyB2b2lkCi1fX3l5X21lbWNweSAoY2hhciAqdG8sIGNoYXIgKmZyb20sIGludCBjb3VudCkKLXsKLSAgcmVnaXN0ZXIgY2hhciAqZiA9IGZyb207Ci0gIHJlZ2lzdGVyIGNoYXIgKnQgPSB0bzsKLSAgcmVnaXN0ZXIgaW50IGkgPSBjb3VudDsKLQotICB3aGlsZSAoaS0tID4gMCkKLSAgICAqdCsrID0gKmYrKzsKLX0KLQotI2VuZGlmCi0jZW5kaWYKLQwKLSNsaW5lIDE5NiAiL3N0b25lL2ppbWIvbWFpbi05OHIyL3NoYXJlL2Jpc29uLnNpbXBsZSIKLQotLyogVGhlIHVzZXIgY2FuIGRlZmluZSBZWVBBUlNFX1BBUkFNIGFzIHRoZSBuYW1lIG9mIGFuIGFyZ3VtZW50IHRvIGJlIHBhc3NlZAotICAgaW50byB5eXBhcnNlLiAgVGhlIGFyZ3VtZW50IHNob3VsZCBoYXZlIHR5cGUgdm9pZCAqLgotICAgSXQgc2hvdWxkIGFjdHVhbGx5IHBvaW50IHRvIGFuIG9iamVjdC4KLSAgIEdyYW1tYXIgYWN0aW9ucyBjYW4gYWNjZXNzIHRoZSB2YXJpYWJsZSBieSBjYXN0aW5nIGl0Ci0gICB0byB0aGUgcHJvcGVyIHBvaW50ZXIgdHlwZS4gICovCi0KLSNpZmRlZiBZWVBBUlNFX1BBUkFNCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcgdm9pZCAqWVlQQVJTRV9QQVJBTQotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wKLSNlbHNlIC8qIG5vdCBfX2NwbHVzcGx1cyAqLwotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0FSRyBZWVBBUlNFX1BBUkFNCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTCB2b2lkICpZWVBBUlNFX1BBUkFNOwotI2VuZGlmIC8qIG5vdCBfX2NwbHVzcGx1cyAqLwotI2Vsc2UgLyogbm90IFlZUEFSU0VfUEFSQU0gKi8KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcKLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCi0jZW5kaWYgLyogbm90IFlZUEFSU0VfUEFSQU0gKi8KLQotaW50Ci15eXBhcnNlKFlZUEFSU0VfUEFSQU1fQVJHKQotICAgICBZWVBBUlNFX1BBUkFNX0RFQ0wKLXsKLSAgcmVnaXN0ZXIgaW50IHl5c3RhdGU7Ci0gIHJlZ2lzdGVyIGludCB5eW47Ci0gIHJlZ2lzdGVyIHNob3J0ICp5eXNzcDsKLSAgcmVnaXN0ZXIgWVlTVFlQRSAqeXl2c3A7Ci0gIGludCB5eWVycnN0YXR1czsJLyogIG51bWJlciBvZiB0b2tlbnMgdG8gc2hpZnQgYmVmb3JlIGVycm9yIG1lc3NhZ2VzIGVuYWJsZWQgKi8KLSAgaW50IHl5Y2hhcjEgPSAwOwkJLyogIGxvb2thaGVhZCB0b2tlbiBhcyBhbiBpbnRlcm5hbCAodHJhbnNsYXRlZCkgdG9rZW4gbnVtYmVyICovCi0KLSAgc2hvcnQJeXlzc2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIHN0YXRlIHN0YWNrCQkJKi8KLSAgWVlTVFlQRSB5eXZzYVtZWUlOSVRERVBUSF07CS8qICB0aGUgc2VtYW50aWMgdmFsdWUgc3RhY2sJCSovCi0KLSAgc2hvcnQgKnl5c3MgPSB5eXNzYTsJCS8qICByZWZlciB0byB0aGUgc3RhY2tzIHRocnUgc2VwYXJhdGUgcG9pbnRlcnMgKi8KLSAgWVlTVFlQRSAqeXl2cyA9IHl5dnNhOwkvKiAgdG8gYWxsb3cgeXlvdmVyZmxvdyB0byB4cmVhbGxvY2F0ZSB0aGVtIGVsc2V3aGVyZSAqLwotCi0jaWZkZWYgWVlMU1BfTkVFREVECi0gIFlZTFRZUEUgeXlsc2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIGxvY2F0aW9uIHN0YWNrCQkJKi8KLSAgWVlMVFlQRSAqeXlscyA9IHl5bHNhOwotICBZWUxUWVBFICp5eWxzcDsKLQotI2RlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0sIHl5bHNwLS0pCi0jZWxzZQotI2RlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0pCi0jZW5kaWYKLQotICBpbnQgeXlzdGFja3NpemUgPSBZWUlOSVRERVBUSDsKLQotI2lmZGVmIFlZUFVSRQotICBpbnQgeXljaGFyOwotICBZWVNUWVBFIHl5bHZhbDsKLSAgaW50IHl5bmVycnM7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gIFlZTFRZUEUgeXlsbG9jOwotI2VuZGlmCi0jZW5kaWYKLQotICBZWVNUWVBFIHl5dmFsOwkJLyogIHRoZSB2YXJpYWJsZSB1c2VkIHRvIHJldHVybgkJKi8KLQkJCQkvKiAgc2VtYW50aWMgdmFsdWVzIGZyb20gdGhlIGFjdGlvbgkqLwotCQkJCS8qICByb3V0aW5lcwkJCQkqLwotCi0gIGludCB5eWxlbjsKLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlN0YXJ0aW5nIHBhcnNlXG4iKTsKLSNlbmRpZgotCi0gIHl5c3RhdGUgPSAwOwotICB5eWVycnN0YXR1cyA9IDA7Ci0gIHl5bmVycnMgPSAwOwotICB5eWNoYXIgPSBZWUVNUFRZOwkJLyogQ2F1c2UgYSB0b2tlbiB0byBiZSByZWFkLiAgKi8KLQotICAvKiBJbml0aWFsaXplIHN0YWNrIHBvaW50ZXJzLgotICAgICBXYXN0ZSBvbmUgZWxlbWVudCBvZiB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2sKLSAgICAgc28gdGhhdCB0aGV5IHN0YXkgb24gdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIHN0YXRlIHN0YWNrLgotICAgICBUaGUgd2FzdGVkIGVsZW1lbnRzIGFyZSBuZXZlciBpbml0aWFsaXplZC4gICovCi0KLSAgeXlzc3AgPSB5eXNzIC0gMTsKLSAgeXl2c3AgPSB5eXZzOwotI2lmZGVmIFlZTFNQX05FRURFRAotICB5eWxzcCA9IHl5bHM7Ci0jZW5kaWYKLQotLyogUHVzaCBhIG5ldyBzdGF0ZSwgd2hpY2ggaXMgZm91bmQgaW4gIHl5c3RhdGUgIC4gICovCi0vKiBJbiBhbGwgY2FzZXMsIHdoZW4geW91IGdldCBoZXJlLCB0aGUgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrcwotICAgaGF2ZSBqdXN0IGJlZW4gcHVzaGVkLiBzbyBwdXNoaW5nIGEgc3RhdGUgaGVyZSBldmVucyB0aGUgc3RhY2tzLiAgKi8KLXl5bmV3c3RhdGU6Ci0KLSAgKisreXlzc3AgPSB5eXN0YXRlOwotCi0gIGlmICh5eXNzcCA+PSB5eXNzICsgeXlzdGFja3NpemUgLSAxKQotICAgIHsKLSAgICAgIC8qIEdpdmUgdXNlciBhIGNoYW5jZSB0byB4cmVhbGxvY2F0ZSB0aGUgc3RhY2sgKi8KLSAgICAgIC8qIFVzZSBjb3BpZXMgb2YgdGhlc2Ugc28gdGhhdCB0aGUgJidzIGRvbid0IGZvcmNlIHRoZSByZWFsIG9uZXMgaW50byBtZW1vcnkuICovCi0gICAgICBZWVNUWVBFICp5eXZzMSA9IHl5dnM7Ci0gICAgICBzaG9ydCAqeXlzczEgPSB5eXNzOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgWVlMVFlQRSAqeXlsczEgPSB5eWxzOwotI2VuZGlmCi0KLSAgICAgIC8qIEdldCB0aGUgY3VycmVudCB1c2VkIHNpemUgb2YgdGhlIHRocmVlIHN0YWNrcywgaW4gZWxlbWVudHMuICAqLwotICAgICAgaW50IHNpemUgPSB5eXNzcCAtIHl5c3MgKyAxOwotCi0jaWZkZWYgeXlvdmVyZmxvdwotICAgICAgLyogRWFjaCBzdGFjayBwb2ludGVyIGFkZHJlc3MgaXMgZm9sbG93ZWQgYnkgdGhlIHNpemUgb2YKLQkgdGhlIGRhdGEgaW4gdXNlIGluIHRoYXQgc3RhY2ssIGluIGJ5dGVzLiAgKi8KLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIC8qIFRoaXMgdXNlZCB0byBiZSBhIGNvbmRpdGlvbmFsIGFyb3VuZCBqdXN0IHRoZSB0d28gZXh0cmEgYXJncywKLQkgYnV0IHRoYXQgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHl5b3ZlcmZsb3cgaXMgYSBtYWNyby4gICovCi0gICAgICB5eW92ZXJmbG93KCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciLAotCQkgJnl5c3MxLCBzaXplICogc2l6ZW9mICgqeXlzc3ApLAotCQkgJnl5dnMxLCBzaXplICogc2l6ZW9mICgqeXl2c3ApLAotCQkgJnl5bHMxLCBzaXplICogc2l6ZW9mICgqeXlsc3ApLAotCQkgJnl5c3RhY2tzaXplKTsKLSNlbHNlCi0gICAgICB5eW92ZXJmbG93KCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciLAotCQkgJnl5c3MxLCBzaXplICogc2l6ZW9mICgqeXlzc3ApLAotCQkgJnl5dnMxLCBzaXplICogc2l6ZW9mICgqeXl2c3ApLAotCQkgJnl5c3RhY2tzaXplKTsKLSNlbmRpZgotCi0gICAgICB5eXNzID0geXlzczE7IHl5dnMgPSB5eXZzMTsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIHl5bHMgPSB5eWxzMTsKLSNlbmRpZgotI2Vsc2UgLyogbm8geXlvdmVyZmxvdyAqLwotICAgICAgLyogRXh0ZW5kIHRoZSBzdGFjayBvdXIgb3duIHdheS4gICovCi0gICAgICBpZiAoeXlzdGFja3NpemUgPj0gWVlNQVhERVBUSCkKLQl7Ci0JICB5eWVycm9yKCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciKTsKLQkgIHJldHVybiAyOwotCX0KLSAgICAgIHl5c3RhY2tzaXplICo9IDI7Ci0gICAgICBpZiAoeXlzdGFja3NpemUgPiBZWU1BWERFUFRIKQotCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKLSAgICAgIHl5c3MgPSAoc2hvcnQgKikgYWxsb2NhICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSk7Ci0gICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eXNzLCAoY2hhciAqKXl5c3MxLCBzaXplICogc2l6ZW9mICgqeXlzc3ApKTsKLSAgICAgIHl5dnMgPSAoWVlTVFlQRSAqKSBhbGxvY2EgKHl5c3RhY2tzaXplICogc2l6ZW9mICgqeXl2c3ApKTsKLSAgICAgIF9feXlfbWVtY3B5ICgoY2hhciAqKXl5dnMsIChjaGFyICopeXl2czEsIHNpemUgKiBzaXplb2YgKCp5eXZzcCkpOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgeXlscyA9IChZWUxUWVBFICopIGFsbG9jYSAoeXlzdGFja3NpemUgKiBzaXplb2YgKCp5eWxzcCkpOwotICAgICAgX195eV9tZW1jcHkgKChjaGFyICopeXlscywgKGNoYXIgKil5eWxzMSwgc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSk7Ci0jZW5kaWYKLSNlbmRpZiAvKiBubyB5eW92ZXJmbG93ICovCi0KLSAgICAgIHl5c3NwID0geXlzcyArIHNpemUgLSAxOwotICAgICAgeXl2c3AgPSB5eXZzICsgc2l6ZSAtIDE7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICB5eWxzcCA9IHl5bHMgKyBzaXplIC0gMTsKLSNlbmRpZgotCi0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQlmcHJpbnRmKHN0ZGVyciwgIlN0YWNrIHNpemUgaW5jcmVhc2VkIHRvICVkXG4iLCB5eXN0YWNrc2l6ZSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKHl5c3NwID49IHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEpCi0JWVlBQk9SVDsKLSAgICB9Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgZnByaW50ZihzdGRlcnIsICJFbnRlcmluZyBzdGF0ZSAlZFxuIiwgeXlzdGF0ZSk7Ci0jZW5kaWYKLQotICBnb3RvIHl5YmFja3VwOwotIHl5YmFja3VwOgotCi0vKiBEbyBhcHByb3ByaWF0ZSBwcm9jZXNzaW5nIGdpdmVuIHRoZSBjdXJyZW50IHN0YXRlLiAgKi8KLS8qIFJlYWQgYSBsb29rYWhlYWQgdG9rZW4gaWYgd2UgbmVlZCBvbmUgYW5kIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLwotLyogeXlyZXN1bWU6ICovCi0KLSAgLyogRmlyc3QgdHJ5IHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGhvdXQgcmVmZXJlbmNlIHRvIGxvb2thaGVhZCB0b2tlbi4gICovCi0KLSAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotICBpZiAoeXluID09IFlZRkxBRykKLSAgICBnb3RvIHl5ZGVmYXVsdDsKLQotICAvKiBOb3Qga25vd24gPT4gZ2V0IGEgbG9va2FoZWFkIHRva2VuIGlmIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLwotCi0gIC8qIHl5Y2hhciBpcyBlaXRoZXIgWVlFTVBUWSBvciBZWUVPRgotICAgICBvciBhIHZhbGlkIHRva2VuIGluIGV4dGVybmFsIGZvcm0uICAqLwotCi0gIGlmICh5eWNoYXIgPT0gWVlFTVBUWSkKLSAgICB7Ci0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQlmcHJpbnRmKHN0ZGVyciwgIlJlYWRpbmcgYSB0b2tlbjogIik7Ci0jZW5kaWYKLSAgICAgIHl5Y2hhciA9IFlZTEVYOwotICAgIH0KLQotICAvKiBDb252ZXJ0IHRva2VuIHRvIGludGVybmFsIGZvcm0gKGluIHl5Y2hhcjEpIGZvciBpbmRleGluZyB0YWJsZXMgd2l0aCAqLwotCi0gIGlmICh5eWNoYXIgPD0gMCkJCS8qIFRoaXMgbWVhbnMgZW5kIG9mIGlucHV0LiAqLwotICAgIHsKLSAgICAgIHl5Y2hhcjEgPSAwOwotICAgICAgeXljaGFyID0gWVlFT0Y7CQkvKiBEb24ndCBjYWxsIFlZTEVYIGFueSBtb3JlICovCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCWZwcmludGYoc3RkZXJyLCAiTm93IGF0IGVuZCBvZiBpbnB1dC5cbiIpOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgeXljaGFyMSA9IFlZVFJBTlNMQVRFKHl5Y2hhcik7Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIk5leHQgdG9rZW4gaXMgJWQgKCVzIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKLQkgIC8qIEdpdmUgdGhlIGluZGl2aWR1YWwgcGFyc2VyIGEgd2F5IHRvIHByaW50IHRoZSBwcmVjaXNlIG1lYW5pbmcKLQkgICAgIG9mIGEgdG9rZW4sIGZvciBmdXJ0aGVyIGRlYnVnZ2luZyBpbmZvLiAgKi8KLSNpZmRlZiBZWVBSSU5UCi0JICBZWVBSSU5UIChzdGRlcnIsIHl5Y2hhciwgeXlsdmFsKTsKLSNlbmRpZgotCSAgZnByaW50ZiAoc3RkZXJyLCAiKVxuIik7Ci0JfQotI2VuZGlmCi0gICAgfQotCi0gIHl5biArPSB5eWNoYXIxOwotICBpZiAoeXluIDwgMCB8fCB5eW4gPiBZWUxBU1QgfHwgeXljaGVja1t5eW5dICE9IHl5Y2hhcjEpCi0gICAgZ290byB5eWRlZmF1bHQ7Ci0KLSAgeXluID0geXl0YWJsZVt5eW5dOwotCi0gIC8qIHl5biBpcyB3aGF0IHRvIGRvIGZvciB0aGlzIHRva2VuIHR5cGUgaW4gdGhpcyBzdGF0ZS4KLSAgICAgTmVnYXRpdmUgPT4gcmVkdWNlLCAteXluIGlzIHJ1bGUgbnVtYmVyLgotICAgICBQb3NpdGl2ZSA9PiBzaGlmdCwgeXluIGlzIG5ldyBzdGF0ZS4KLSAgICAgICBOZXcgc3RhdGUgaXMgZmluYWwgc3RhdGUgPT4gZG9uJ3QgYm90aGVyIHRvIHNoaWZ0LAotICAgICAgIGp1c3QgcmV0dXJuIHN1Y2Nlc3MuCi0gICAgIDAsIG9yIG1vc3QgbmVnYXRpdmUgbnVtYmVyID0+IGVycm9yLiAgKi8KLQotICBpZiAoeXluIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoeXluID09IFlZRkxBRykKLQlnb3RvIHl5ZXJybGFiOwotICAgICAgeXluID0gLXl5bjsKLSAgICAgIGdvdG8geXlyZWR1Y2U7Ci0gICAgfQotICBlbHNlIGlmICh5eW4gPT0gMCkKLSAgICBnb3RvIHl5ZXJybGFiOwotCi0gIGlmICh5eW4gPT0gWVlGSU5BTCkKLSAgICBZWUFDQ0VQVDsKLQotICAvKiBTaGlmdCB0aGUgbG9va2FoZWFkIHRva2VuLiAgKi8KLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlNoaWZ0aW5nIHRva2VuICVkICglcyksICIsIHl5Y2hhciwgeXl0bmFtZVt5eWNoYXIxXSk7Ci0jZW5kaWYKLQotICAvKiBEaXNjYXJkIHRoZSB0b2tlbiBiZWluZyBzaGlmdGVkIHVubGVzcyBpdCBpcyBlb2YuICAqLwotICBpZiAoeXljaGFyICE9IFlZRU9GKQotICAgIHl5Y2hhciA9IFlZRU1QVFk7Ci0KLSAgKisreXl2c3AgPSB5eWx2YWw7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICorK3l5bHNwID0geXlsbG9jOwotI2VuZGlmCi0KLSAgLyogY291bnQgdG9rZW5zIHNoaWZ0ZWQgc2luY2UgZXJyb3I7IGFmdGVyIHRocmVlLCB0dXJuIG9mZiBlcnJvciBzdGF0dXMuICAqLwotICBpZiAoeXllcnJzdGF0dXMpIHl5ZXJyc3RhdHVzLS07Ci0KLSAgeXlzdGF0ZSA9IHl5bjsKLSAgZ290byB5eW5ld3N0YXRlOwotCi0vKiBEbyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlLiAgKi8KLXl5ZGVmYXVsdDoKLQotICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsKLSAgaWYgKHl5biA9PSAwKQotICAgIGdvdG8geXllcnJsYWI7Ci0KLS8qIERvIGEgcmVkdWN0aW9uLiAgeXluIGlzIHRoZSBudW1iZXIgb2YgYSBydWxlIHRvIHJlZHVjZSB3aXRoLiAgKi8KLXl5cmVkdWNlOgotICB5eWxlbiA9IHl5cjJbeXluXTsKLSAgaWYgKHl5bGVuID4gMCkKLSAgICB5eXZhbCA9IHl5dnNwWzEteXlsZW5dOyAvKiBpbXBsZW1lbnQgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYWN0aW9uICovCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlJlZHVjaW5nIHZpYSBydWxlICVkIChsaW5lICVkKSwgIiwKLQkgICAgICAgeXluLCB5eXJsaW5lW3l5bl0pOwotCi0gICAgICAvKiBQcmludCB0aGUgc3ltYm9scyBiZWluZyByZWR1Y2VkLCBhbmQgdGhlaXIgcmVzdWx0LiAgKi8KLSAgICAgIGZvciAoaSA9IHl5cHJoc1t5eW5dOyB5eXJoc1tpXSA+IDA7IGkrKykKLQlmcHJpbnRmIChzdGRlcnIsICIlcyAiLCB5eXRuYW1lW3l5cmhzW2ldXSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJXNcbiIsIHl5dG5hbWVbeXlyMVt5eW5dXSk7Ci0gICAgfQotI2VuZGlmCi0KLQotICBzd2l0Y2ggKHl5bikgewotCi1jYXNlIDM6Ci0jbGluZSAyMzUgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUoeXl2c3BbMF0udHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpOzsKLSAgICBicmVhazt9Ci1jYXNlIDU6Ci0jbGluZSAyNDMgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9DT01NQSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY6Ci0jbGluZSAyNDggImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0lORCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDc6Ci0jbGluZSAyNTEgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0FERFIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4OgotI2xpbmUgMjU0ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9ORUcpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA5OgotI2xpbmUgMjU4ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9MT0dJQ0FMX05PVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwOgotI2xpbmUgMjYyICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DT01QTEVNRU5UKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTE6Ci0jbGluZSAyNjYgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX1BSRUlOQ1JFTUVOVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEyOgotI2xpbmUgMjcwICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9QUkVERUNSRU1FTlQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMzoKLSNsaW5lIDI3NCAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfUE9TVElOQ1JFTUVOVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE0OgotI2xpbmUgMjc4ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9QT1NUREVDUkVNRU5UKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTU6Ci0jbGluZSAyODIgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX1NJWkVPRik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE2OgotI2xpbmUgMjg2ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfUFRSKTsKLQkJCSAgd3JpdGVfZXhwX3N0cmluZyAoeXl2c3BbMF0uc3ZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9QVFIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxNzoKLSNsaW5lIDI5MiAiYy1leHAueSIKLXsgLyogZXhwLT50eXBlOjpuYW1lIGJlY29tZXMgZXhwLT4qKCZ0eXBlOjpuYW1lKSAqLwotCQkJICAvKiBOb3RlOiB0aGlzIGRvZXNuJ3Qgd29yayBpZiBuYW1lIGlzIGEKLQkJCSAgICAgc3RhdGljIG1lbWJlciEgIEZJWE1FICovCi0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0FERFIpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfTVBUUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE4OgotI2xpbmUgMzAwICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfTVBUUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE5OgotI2xpbmUgMzA0ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfU1RSVUNUKTsKLQkJCSAgd3JpdGVfZXhwX3N0cmluZyAoeXl2c3BbMF0uc3ZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9TVFJVQ1QpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyMDoKLSNsaW5lIDMxMCAiYy1leHAueSIKLXsgLyogZXhwLnR5cGU6Om5hbWUgYmVjb21lcyBleHAuKigmdHlwZTo6bmFtZSkgKi8KLQkJCSAgLyogTm90ZTogdGhpcyBkb2Vzbid0IHdvcmsgaWYgbmFtZSBpcyBhCi0JCQkgICAgIHN0YXRpYyBtZW1iZXIhICBGSVhNRSAqLwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9BRERSKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX01FTUJFUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDIxOgotI2xpbmUgMzE4ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfTUVNQkVSKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjI6Ci0jbGluZSAzMjIgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9TVUJTQ1JJUFQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyMzoKLSNsaW5lIDMyOCAiYy1leHAueSIKLXsgc3RhcnRfYXJnbGlzdCAoKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjQ6Ci0jbGluZSAzMzAgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9GVU5DQUxMKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgZW5kX2FyZ2xpc3QgKCkpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRlVOQ0FMTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDI1OgotI2xpbmUgMzM2ICJjLWV4cC55IgoteyBzdGFydF9hcmdsaXN0ICgpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyNzoKLSNsaW5lIDM0MyAiYy1leHAueSIKLXsgYXJnbGlzdF9sZW4gPSAxOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyODoKLSNsaW5lIDM0NyAiYy1leHAueSIKLXsgYXJnbGlzdF9sZW4rKzsgOwotICAgIGJyZWFrO30KLWNhc2UgMjk6Ci0jbGluZSAzNTEgImMtZXhwLnkiCi17IHl5dmFsLmx2YWwgPSBlbmRfYXJnbGlzdCAoKSAtIDE7IDsKLSAgICBicmVhazt9Ci1jYXNlIDMwOgotI2xpbmUgMzU0ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQVJSQVkpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSAwKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgeXl2c3BbMF0ubHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9BUlJBWSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDMxOgotI2xpbmUgMzYxICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9NRU1WQUwpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHl5dnNwWy0yXS50dmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTUVNVkFMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzI6Ci0jbGluZSAzNjcgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHl5dnNwWy0yXS50dmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDMzOgotI2xpbmUgMzczICJjLWV4cC55IgoteyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzNDoKLSNsaW5lIDM3OSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1JFUEVBVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDM1OgotI2xpbmUgMzgzICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTVVMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzY6Ci0jbGluZSAzODcgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9ESVYpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzNzoKLSNsaW5lIDM5MSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1JFTSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDM4OgotI2xpbmUgMzk1ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQUREKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzk6Ci0jbGluZSAzOTkgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9TVUIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0MDoKLSNsaW5lIDQwMyAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xTSCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQxOgotI2xpbmUgNDA3ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfUlNIKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDI6Ci0jbGluZSA0MTEgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9FUVVBTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQzOgotI2xpbmUgNDE1ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTk9URVFVQUwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0NDoKLSNsaW5lIDQxOSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xFUSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ1OgotI2xpbmUgNDIzICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfR0VRKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDY6Ci0jbGluZSA0MjcgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MRVNTKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDc6Ci0jbGluZSA0MzEgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9HVFIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0ODoKLSNsaW5lIDQzNSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0JJVFdJU0VfQU5EKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDk6Ci0jbGluZSA0MzkgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9CSVRXSVNFX1hPUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDUwOgotI2xpbmUgNDQzICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQklUV0lTRV9JT1IpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1MToKLSNsaW5lIDQ0NyAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xPR0lDQUxfQU5EKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTI6Ci0jbGluZSA0NTEgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MT0dJQ0FMX09SKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTM6Ci0jbGluZSA0NTUgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChURVJOT1BfQ09ORCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU0OgotI2xpbmUgNDU5ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQVNTSUdOKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTU6Ci0jbGluZSA0NjMgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BU1NJR05fTU9ESUZZKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKHl5dnNwWy0xXS5vcGNvZGUpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQVNTSUdOX01PRElGWSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU2OgotI2xpbmUgNDY5ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoeXl2c3BbMF0udHlwZWRfdmFsX2ludC50eXBlKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkoeXl2c3BbMF0udHlwZWRfdmFsX2ludC52YWwpKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1NzoKLSNsaW5lIDQ3NiAiYy1leHAueSIKLXsgWVlTVFlQRSB2YWw7Ci0JCQkgIHBhcnNlX251bWJlciAoeXl2c3BbMF0uc3N5bS5zdG9rZW4ucHRyLCB5eXZzcFswXS5zc3ltLnN0b2tlbi5sZW5ndGgsIDAsICZ2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAodmFsLnR5cGVkX3ZhbF9pbnQudHlwZSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpdmFsLnR5cGVkX3ZhbF9pbnQudmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkJOwotICAgIGJyZWFrO30KLWNhc2UgNTg6Ci0jbGluZSA0ODcgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9ET1VCTEUpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHl5dnNwWzBdLnR5cGVkX3ZhbF9mbG9hdC50eXBlKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9kYmxjc3QgKHl5dnNwWzBdLnR5cGVkX3ZhbF9mbG9hdC5kdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0RPVUJMRSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDYxOgotI2xpbmUgNTAxICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX2ludCk7Ci0JCQkgIENIRUNLX1RZUEVERUYgKHl5dnNwWy0xXS50dmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgVFlQRV9MRU5HVEggKHl5dnNwWy0xXS50dmFsKSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjI6Ci0jbGluZSA1MDkgImMtZXhwLnkiCi17IC8qIEMgc3RyaW5ncyBhcmUgY29udmVydGVkIGludG8gYXJyYXkgY29uc3RhbnRzIHdpdGgKLQkJCSAgICAgYW4gZXhwbGljaXQgbnVsbCBieXRlIGFkZGVkIGF0IHRoZSBlbmQuICBUaHVzCi0JCQkgICAgIHRoZSBhcnJheSB1cHBlciBib3VuZCBpcyB0aGUgc3RyaW5nIGxlbmd0aC4KLQkJCSAgICAgVGhlcmUgaXMgbm8gc3VjaCB0aGluZyBpbiBDIGFzIGEgY29tcGxldGVseSBlbXB0eQotCQkJICAgICBzdHJpbmcuICovCi0JCQkgIGNoYXIgKnNwID0geXl2c3BbMF0uc3ZhbC5wdHI7IGludCBjb3VudCA9IHl5dnNwWzBdLnN2YWwubGVuZ3RoOwotCQkJICB3aGlsZSAoY291bnQtLSA+IDApCi0JCQkgICAgewotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF90eXBlIChidWlsdGluX3R5cGVfY2hhcik7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSgqc3ArKykpOwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkJICAgIH0KLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9jaGFyKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCknXDAnKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQVJSQVkpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSAwKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgKHl5dnNwWzBdLnN2YWwubGVuZ3RoKSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9BUlJBWSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDYzOgotI2xpbmUgNTM0ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVEhJUyk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9USElTKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjQ6Ci0jbGluZSA1MzkgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZXhwX2VsdF90eXBlIChidWlsdGluX3R5cGVfYm9vbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY1OgotI2xpbmUgNTQ2ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX2Jvb2wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2NjoKLSNsaW5lIDU1NSAiYy1leHAueSIKLXsKLQkJCSAgaWYgKHl5dnNwWzBdLnNzeW0uc3ltKQotCQkJICAgIHl5dmFsLmJ2YWwgPSBTWU1CT0xfQkxPQ0tfVkFMVUUgKHl5dnNwWzBdLnNzeW0uc3ltKTsKLQkJCSAgZWxzZQotCQkJICAgIGVycm9yICgiTm8gZmlsZSBvciBmdW5jdGlvbiBcIiVzXCIuIiwKLQkJCQkgICBjb3B5X25hbWUgKHl5dnNwWzBdLnNzeW0uc3Rva2VuKSk7Ci0JCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA2NzoKLSNsaW5lIDU2MyAiYy1leHAueSIKLXsKLQkJCSAgeXl2YWwuYnZhbCA9IHl5dnNwWzBdLmJ2YWw7Ci0JCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA2ODoKLSNsaW5lIDU2OSAiYy1leHAueSIKLXsgc3RydWN0IHN5bWJvbCAqdGVtCi0JCQkgICAgPSBsb29rdXBfc3ltYm9sIChjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpLCB5eXZzcFstMl0uYnZhbCwKLQkJCQkJICAgICBWQVJfTkFNRVNQQUNFLCAoaW50ICopIE5VTEwsCi0JCQkJCSAgICAgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpOwotCQkJICBpZiAoIXRlbSB8fCBTWU1CT0xfQ0xBU1MgKHRlbSkgIT0gTE9DX0JMT0NLKQotCQkJICAgIGVycm9yICgiTm8gZnVuY3Rpb24gXCIlc1wiIGluIHNwZWNpZmllZCBjb250ZXh0LiIsCi0JCQkJICAgY29weV9uYW1lICh5eXZzcFswXS5zdmFsKSk7Ci0JCQkgIHl5dmFsLmJ2YWwgPSBTWU1CT0xfQkxPQ0tfVkFMVUUgKHRlbSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY5OgotI2xpbmUgNTgwICJjLWV4cC55IgoteyBzdHJ1Y3Qgc3ltYm9sICpzeW07Ci0JCQkgIHN5bSA9IGxvb2t1cF9zeW1ib2wgKGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCksIHl5dnNwWy0yXS5idmFsLAotCQkJCQkgICAgICAgVkFSX05BTUVTUEFDRSwgKGludCAqKSBOVUxMLAotCQkJCQkgICAgICAgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpOwotCQkJICBpZiAoc3ltID09IDApCi0JCQkgICAgZXJyb3IgKCJObyBzeW1ib2wgXCIlc1wiIGluIHNwZWNpZmllZCBjb250ZXh0LiIsCi0JCQkJICAgY29weV9uYW1lICh5eXZzcFswXS5zdmFsKSk7Ci0KLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7Ci0JCQkgIC8qIGJsb2NrX2ZvdW5kIGlzIHNldCBieSBsb29rdXBfc3ltYm9sLiAgKi8KLQkJCSAgd3JpdGVfZXhwX2VsdF9ibG9jayAoYmxvY2tfZm91bmQpOwotCQkJICB3cml0ZV9leHBfZWx0X3N5bSAoc3ltKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDcwOgotI2xpbmUgNTk2ICJjLWV4cC55IgotewotCQkJICBzdHJ1Y3QgdHlwZSAqdHlwZSA9IHl5dnNwWy0yXS50dmFsOwotCQkJICBpZiAoVFlQRV9DT0RFICh0eXBlKSAhPSBUWVBFX0NPREVfU1RSVUNUCi0JCQkgICAgICAmJiBUWVBFX0NPREUgKHR5cGUpICE9IFRZUEVfQ09ERV9VTklPTikKLQkJCSAgICBlcnJvciAoImAlcycgaXMgbm90IGRlZmluZWQgYXMgYW4gYWdncmVnYXRlIHR5cGUuIiwKLQkJCQkgICBUWVBFX05BTUUgKHR5cGUpKTsKLQotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfU0NPUEUpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHR5cGUpOwotCQkJICB3cml0ZV9leHBfc3RyaW5nICh5eXZzcFswXS5zdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1NDT1BFKTsKLQkJCTsKLSAgICBicmVhazt9Ci1jYXNlIDcxOgotI2xpbmUgNjA5ICJjLWV4cC55IgotewotCQkJICBzdHJ1Y3QgdHlwZSAqdHlwZSA9IHl5dnNwWy0zXS50dmFsOwotCQkJICBzdHJ1Y3Qgc3Rva2VuIHRtcF90b2tlbjsKLQkJCSAgaWYgKFRZUEVfQ09ERSAodHlwZSkgIT0gVFlQRV9DT0RFX1NUUlVDVAotCQkJICAgICAgJiYgVFlQRV9DT0RFICh0eXBlKSAhPSBUWVBFX0NPREVfVU5JT04pCi0JCQkgICAgZXJyb3IgKCJgJXMnIGlzIG5vdCBkZWZpbmVkIGFzIGFuIGFnZ3JlZ2F0ZSB0eXBlLiIsCi0JCQkJICAgVFlQRV9OQU1FICh0eXBlKSk7Ci0KLQkJCSAgdG1wX3Rva2VuLnB0ciA9IChjaGFyKikgYWxsb2NhICh5eXZzcFswXS5zdmFsLmxlbmd0aCArIDIpOwotCQkJICB0bXBfdG9rZW4ubGVuZ3RoID0geXl2c3BbMF0uc3ZhbC5sZW5ndGggKyAxOwotCQkJICB0bXBfdG9rZW4ucHRyWzBdID0gJ34nOwotCQkJICBtZW1jcHkgKHRtcF90b2tlbi5wdHIrMSwgeXl2c3BbMF0uc3ZhbC5wdHIsIHl5dnNwWzBdLnN2YWwubGVuZ3RoKTsKLQkJCSAgdG1wX3Rva2VuLnB0clt0bXBfdG9rZW4ubGVuZ3RoXSA9IDA7Ci0KLQkJCSAgLyogQ2hlY2sgZm9yIHZhbGlkIGRlc3RydWN0b3IgbmFtZS4gICovCi0JCQkgIGRlc3RydWN0b3JfbmFtZV9wICh0bXBfdG9rZW4ucHRyLCB0eXBlKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1NDT1BFKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh0eXBlKTsKLQkJCSAgd3JpdGVfZXhwX3N0cmluZyAodG1wX3Rva2VuKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1NDT1BFKTsKLQkJCTsKLSAgICBicmVhazt9Ci1jYXNlIDczOgotI2xpbmUgNjM0ICJjLWV4cC55IgotewotCQkJICBjaGFyICpuYW1lID0gY29weV9uYW1lICh5eXZzcFswXS5zdmFsKTsKLQkJCSAgc3RydWN0IHN5bWJvbCAqc3ltOwotCQkJICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7Ci0KLQkJCSAgc3ltID0KLQkJCSAgICBsb29rdXBfc3ltYm9sIChuYW1lLCAoY29uc3Qgc3RydWN0IGJsb2NrICopIE5VTEwsCi0JCQkJCSAgIFZBUl9OQU1FU1BBQ0UsIChpbnQgKikgTlVMTCwKLQkJCQkJICAgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpOwotCQkJICBpZiAoc3ltKQotCQkJICAgIHsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9ibG9jayAoTlVMTCk7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X3N5bSAoc3ltKTsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCi0JCQkgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKG5hbWUsIE5VTEwsIE5VTEwpOwotCQkJICBpZiAobXN5bWJvbCAhPSBOVUxMKQotCQkJICAgIHsKLQkJCSAgICAgIHdyaXRlX2V4cF9tc3ltYm9sIChtc3ltYm9sLAotCQkJCQkJIGxvb2t1cF9mdW5jdGlvbl90eXBlIChidWlsdGluX3R5cGVfaW50KSwKLQkJCQkJCSBidWlsdGluX3R5cGVfaW50KTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICBpZiAoIWhhdmVfZnVsbF9zeW1ib2xzICgpICYmICFoYXZlX3BhcnRpYWxfc3ltYm9scyAoKSkKLQkJCSAgICAgIGVycm9yICgiTm8gc3ltYm9sIHRhYmxlIGlzIGxvYWRlZC4gIFVzZSB0aGUgXCJmaWxlXCIgY29tbWFuZC4iKTsKLQkJCSAgICBlbHNlCi0JCQkgICAgICBlcnJvciAoIk5vIHN5bWJvbCBcIiVzXCIgaW4gY3VycmVudCBjb250ZXh0LiIsIG5hbWUpOwotCQkJOwotICAgIGJyZWFrO30KLWNhc2UgNzQ6Ci0jbGluZSA2NjggImMtZXhwLnkiCi17IHN0cnVjdCBzeW1ib2wgKnN5bSA9IHl5dnNwWzBdLnNzeW0uc3ltOwotCi0JCQkgIGlmIChzeW0pCi0JCQkgICAgewotCQkJICAgICAgaWYgKHN5bWJvbF9yZWFkX25lZWRzX2ZyYW1lIChzeW0pKQotCQkJCXsKLQkJCQkgIGlmIChpbm5lcm1vc3RfYmxvY2sgPT0gMCB8fAotCQkJCSAgICAgIGNvbnRhaW5lZF9pbiAoYmxvY2tfZm91bmQsIAotCQkJCQkJICAgIGlubmVybW9zdF9ibG9jaykpCi0JCQkJICAgIGlubmVybW9zdF9ibG9jayA9IGJsb2NrX2ZvdW5kOwotCQkJCX0KLQotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7Ci0JCQkgICAgICAvKiBXZSB3YW50IHRvIHVzZSB0aGUgc2VsZWN0ZWQgZnJhbWUsIG5vdAotCQkJCSBhbm90aGVyIG1vcmUgaW5uZXIgZnJhbWUgd2hpY2ggaGFwcGVucyB0bwotCQkJCSBiZSBpbiB0aGUgc2FtZSBibG9jay4gICovCi0JCQkgICAgICB3cml0ZV9leHBfZWx0X2Jsb2NrIChOVUxMKTsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfc3ltIChzeW0pOwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7Ci0JCQkgICAgfQotCQkJICBlbHNlIGlmICh5eXZzcFswXS5zc3ltLmlzX2FfZmllbGRfb2ZfdGhpcykKLQkJCSAgICB7Ci0JCQkgICAgICAvKiBDKys6IGl0IGhhbmdzIG9mZiBvZiBgdGhpcycuICBNdXN0Ci0JCQkgICAgICAgICBub3QgaW5hZHZlcnRlbnRseSBjb252ZXJ0IGZyb20gYSBtZXRob2QgY2FsbAotCQkJCSB0byBkYXRhIHJlZi4gICovCi0JCQkgICAgICBpZiAoaW5uZXJtb3N0X2Jsb2NrID09IDAgfHwgCi0JCQkJICBjb250YWluZWRfaW4gKGJsb2NrX2ZvdW5kLCBpbm5lcm1vc3RfYmxvY2spKQotCQkJCWlubmVybW9zdF9ibG9jayA9IGJsb2NrX2ZvdW5kOwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1RISVMpOwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1RISVMpOwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX1BUUik7Ci0JCQkgICAgICB3cml0ZV9leHBfc3RyaW5nICh5eXZzcFswXS5zc3ltLnN0b2tlbik7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfUFRSKTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7Ci0JCQkgICAgICByZWdpc3RlciBjaGFyICphcmcgPSBjb3B5X25hbWUgKHl5dnNwWzBdLnNzeW0uc3Rva2VuKTsKLQotCQkJICAgICAgbXN5bWJvbCA9Ci0JCQkJbG9va3VwX21pbmltYWxfc3ltYm9sIChhcmcsIE5VTEwsIE5VTEwpOwotCQkJICAgICAgaWYgKG1zeW1ib2wgIT0gTlVMTCkKLQkJCQl7Ci0JCQkJICB3cml0ZV9leHBfbXN5bWJvbCAobXN5bWJvbCwKLQkJCQkJCSAgICAgbG9va3VwX2Z1bmN0aW9uX3R5cGUgKGJ1aWx0aW5fdHlwZV9pbnQpLAotCQkJCQkJICAgICBidWlsdGluX3R5cGVfaW50KTsKLQkJCQl9Ci0JCQkgICAgICBlbHNlIGlmICghaGF2ZV9mdWxsX3N5bWJvbHMgKCkgJiYgIWhhdmVfcGFydGlhbF9zeW1ib2xzICgpKQotCQkJCWVycm9yICgiTm8gc3ltYm9sIHRhYmxlIGlzIGxvYWRlZC4gIFVzZSB0aGUgXCJmaWxlXCIgY29tbWFuZC4iKTsKLQkJCSAgICAgIGVsc2UKLQkJCQllcnJvciAoIk5vIHN5bWJvbCBcIiVzXCIgaW4gY3VycmVudCBjb250ZXh0LiIsCi0JCQkJICAgICAgIGNvcHlfbmFtZSAoeXl2c3BbMF0uc3N5bS5zdG9rZW4pKTsKLQkJCSAgICB9Ci0JCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA3ODoKLSNsaW5lIDczNCAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGZvbGxvd190eXBlcyAoeXl2c3BbLTFdLnR2YWwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA3OToKLSNsaW5lIDczNiAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGZvbGxvd190eXBlcyAoeXl2c3BbLTJdLnR2YWwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4MDoKLSNsaW5lIDczOCAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGZvbGxvd190eXBlcyAoeXl2c3BbLTJdLnR2YWwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4MToKLSNsaW5lIDc0MiAiYy1leHAueSIKLXsgcHVzaF90eXBlICh0cF9wb2ludGVyKTsgeXl2YWwudm9pZHZhbCA9IDA7IDsKLSAgICBicmVhazt9Ci1jYXNlIDgyOgotI2xpbmUgNzQ0ICJjLWV4cC55IgoteyBwdXNoX3R5cGUgKHRwX3BvaW50ZXIpOyB5eXZhbC52b2lkdmFsID0geXl2c3BbMF0udm9pZHZhbDsgOwotICAgIGJyZWFrO30KLWNhc2UgODM6Ci0jbGluZSA3NDYgImMtZXhwLnkiCi17IHB1c2hfdHlwZSAodHBfcmVmZXJlbmNlKTsgeXl2YWwudm9pZHZhbCA9IDA7IDsKLSAgICBicmVhazt9Ci1jYXNlIDg0OgotI2xpbmUgNzQ4ICJjLWV4cC55IgoteyBwdXNoX3R5cGUgKHRwX3JlZmVyZW5jZSk7IHl5dmFsLnZvaWR2YWwgPSB5eXZzcFswXS52b2lkdmFsOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4NjoKLSNsaW5lIDc1MyAiYy1leHAueSIKLXsgeXl2YWwudm9pZHZhbCA9IHl5dnNwWy0xXS52b2lkdmFsOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4NzoKLSNsaW5lIDc1NSAiYy1leHAueSIKLXsKLQkJCSAgcHVzaF90eXBlX2ludCAoeXl2c3BbMF0ubHZhbCk7Ci0JCQkgIHB1c2hfdHlwZSAodHBfYXJyYXkpOwotCQkJOwotICAgIGJyZWFrO30KLWNhc2UgODg6Ci0jbGluZSA3NjAgImMtZXhwLnkiCi17Ci0JCQkgIHB1c2hfdHlwZV9pbnQgKHl5dnNwWzBdLmx2YWwpOwotCQkJICBwdXNoX3R5cGUgKHRwX2FycmF5KTsKLQkJCSAgeXl2YWwudm9pZHZhbCA9IDA7Ci0JCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA4OToKLSNsaW5lIDc2NyAiYy1leHAueSIKLXsgcHVzaF90eXBlICh0cF9mdW5jdGlvbik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDkwOgotI2xpbmUgNzY5ICJjLWV4cC55IgoteyBwdXNoX3R5cGUgKHRwX2Z1bmN0aW9uKTsgOwotICAgIGJyZWFrO30KLWNhc2UgOTE6Ci0jbGluZSA3NzMgImMtZXhwLnkiCi17IHl5dmFsLmx2YWwgPSAtMTsgOwotICAgIGJyZWFrO30KLWNhc2UgOTI6Ci0jbGluZSA3NzUgImMtZXhwLnkiCi17IHl5dmFsLmx2YWwgPSB5eXZzcFstMV0udHlwZWRfdmFsX2ludC52YWw7IDsKLSAgICBicmVhazt9Ci1jYXNlIDkzOgotI2xpbmUgNzc5ICJjLWV4cC55IgoteyB5eXZhbC52b2lkdmFsID0gMDsgOwotICAgIGJyZWFrO30KLWNhc2UgOTQ6Ci0jbGluZSA3ODEgImMtZXhwLnkiCi17IGZyZWUgKChQVFIpeXl2c3BbLTFdLnR2ZWMpOyB5eXZhbC52b2lkdmFsID0gMDsgOwotICAgIGJyZWFrO30KLWNhc2UgOTY6Ci0jbGluZSA3OTQgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBsb29rdXBfbWVtYmVyX3R5cGUgKGJ1aWx0aW5fdHlwZV9pbnQsIHl5dnNwWy0yXS50dmFsKTsgOwotICAgIGJyZWFrO30KLWNhc2UgOTc6Ci0jbGluZSA3OTkgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSB5eXZzcFswXS50c3ltLnR5cGU7IDsKLSAgICBicmVhazt9Ci1jYXNlIDk4OgotI2xpbmUgODAxICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2ludDsgOwotICAgIGJyZWFrO30KLWNhc2UgOTk6Ci0jbGluZSA4MDMgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfbG9uZzsgOwotICAgIGJyZWFrO30KLWNhc2UgMTAwOgotI2xpbmUgODA1ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX3Nob3J0OyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDE6Ci0jbGluZSA4MDcgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfbG9uZzsgOwotICAgIGJyZWFrO30KLWNhc2UgMTAyOgotI2xpbmUgODA5ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmc7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwMzoKLSNsaW5lIDgxMSAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9sb25nX2xvbmc7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwNDoKLSNsaW5lIDgxMyAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9sb25nX2xvbmc7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwNToKLSNsaW5lIDgxNSAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9sb25nX2xvbmc7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwNjoKLSNsaW5lIDgxNyAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9sb25nX2xvbmc7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwNzoKLSNsaW5lIDgxOSAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9zaG9ydDsgOwotICAgIGJyZWFrO30KLWNhc2UgMTA4OgotI2xpbmUgODIxICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX3Nob3J0OyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDk6Ci0jbGluZSA4MjMgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfZG91YmxlOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMTA6Ci0jbGluZSA4MjUgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfbG9uZ19kb3VibGU7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExMToKLSNsaW5lIDgyNyAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGxvb2t1cF9zdHJ1Y3QgKGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCksCi0JCQkJCSAgICAgIGV4cHJlc3Npb25fY29udGV4dF9ibG9jayk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExMjoKLSNsaW5lIDgzMCAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGxvb2t1cF9zdHJ1Y3QgKGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCksCi0JCQkJCSAgICAgIGV4cHJlc3Npb25fY29udGV4dF9ibG9jayk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExMzoKLSNsaW5lIDgzMyAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGxvb2t1cF91bmlvbiAoY29weV9uYW1lICh5eXZzcFswXS5zdmFsKSwKLQkJCQkJICAgICBleHByZXNzaW9uX2NvbnRleHRfYmxvY2spOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMTQ6Ci0jbGluZSA4MzYgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBsb29rdXBfZW51bSAoY29weV9uYW1lICh5eXZzcFswXS5zdmFsKSwKLQkJCQkJICAgIGV4cHJlc3Npb25fY29udGV4dF9ibG9jayk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExNToKLSNsaW5lIDgzOSAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGxvb2t1cF91bnNpZ25lZF90eXBlbmFtZSAoVFlQRV9OQU1FKHl5dnNwWzBdLnRzeW0udHlwZSkpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMTY6Ci0jbGluZSA4NDEgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfdW5zaWduZWRfaW50OyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMTc6Ci0jbGluZSA4NDMgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBsb29rdXBfc2lnbmVkX3R5cGVuYW1lIChUWVBFX05BTUUoeXl2c3BbMF0udHN5bS50eXBlKSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExODoKLSNsaW5lIDg0NSAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9pbnQ7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExOToKLSNsaW5lIDg1MCAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGxvb2t1cF90ZW1wbGF0ZV90eXBlKGNvcHlfbmFtZSh5eXZzcFstM10uc3ZhbCksIHl5dnNwWy0xXS50dmFsLAotCQkJCQkJICAgIGV4cHJlc3Npb25fY29udGV4dF9ibG9jayk7Ci0JCQk7Ci0gICAgYnJlYWs7fQotY2FzZSAxMjA6Ci0jbGluZSA4NTYgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSB5eXZzcFswXS50dmFsOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMjE6Ci0jbGluZSA4NTcgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSB5eXZzcFswXS50dmFsOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMjM6Ci0jbGluZSA4NjIgImMtZXhwLnkiCi17Ci0JCSAgeXl2YWwudHN5bS5zdG9rZW4ucHRyID0gImludCI7Ci0JCSAgeXl2YWwudHN5bS5zdG9rZW4ubGVuZ3RoID0gMzsKLQkJICB5eXZhbC50c3ltLnR5cGUgPSBidWlsdGluX3R5cGVfaW50OwotCQk7Ci0gICAgYnJlYWs7fQotY2FzZSAxMjQ6Ci0jbGluZSA4NjggImMtZXhwLnkiCi17Ci0JCSAgeXl2YWwudHN5bS5zdG9rZW4ucHRyID0gImxvbmciOwotCQkgIHl5dmFsLnRzeW0uc3Rva2VuLmxlbmd0aCA9IDQ7Ci0JCSAgeXl2YWwudHN5bS50eXBlID0gYnVpbHRpbl90eXBlX2xvbmc7Ci0JCTsKLSAgICBicmVhazt9Ci1jYXNlIDEyNToKLSNsaW5lIDg3NCAiYy1leHAueSIKLXsKLQkJICB5eXZhbC50c3ltLnN0b2tlbi5wdHIgPSAic2hvcnQiOwotCQkgIHl5dmFsLnRzeW0uc3Rva2VuLmxlbmd0aCA9IDU7Ci0JCSAgeXl2YWwudHN5bS50eXBlID0gYnVpbHRpbl90eXBlX3Nob3J0OwotCQk7Ci0gICAgYnJlYWs7fQotY2FzZSAxMjY6Ci0jbGluZSA4ODMgImMtZXhwLnkiCi17IHl5dmFsLnR2ZWMgPSAoc3RydWN0IHR5cGUgKiopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHR5cGUgKikgKiAyKTsKLQkJICB5eXZhbC5pdmVjWzBdID0gMTsJLyogTnVtYmVyIG9mIHR5cGVzIGluIHZlY3RvciAqLwotCQkgIHl5dmFsLnR2ZWNbMV0gPSB5eXZzcFswXS50dmFsOwotCQk7Ci0gICAgYnJlYWs7fQotY2FzZSAxMjc6Ci0jbGluZSA4ODggImMtZXhwLnkiCi17IGludCBsZW4gPSBzaXplb2YgKHN0cnVjdCB0eXBlICopICogKCsrKHl5dnNwWy0yXS5pdmVjWzBdKSArIDEpOwotCQkgIHl5dmFsLnR2ZWMgPSAoc3RydWN0IHR5cGUgKiopIHhyZWFsbG9jICgoY2hhciAqKSB5eXZzcFstMl0udHZlYywgbGVuKTsKLQkJICB5eXZhbC50dmVjW3l5dmFsLml2ZWNbMF1dID0geXl2c3BbMF0udHZhbDsKLQkJOwotICAgIGJyZWFrO30KLWNhc2UgMTI4OgotI2xpbmUgODk0ICJjLWV4cC55IgoteyB5eXZhbC5zdmFsID0geXl2c3BbMF0uc3N5bS5zdG9rZW47IDsKLSAgICBicmVhazt9Ci1jYXNlIDEyOToKLSNsaW5lIDg5NSAiYy1leHAueSIKLXsgeXl2YWwuc3ZhbCA9IHl5dnNwWzBdLnNzeW0uc3Rva2VuOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMzA6Ci0jbGluZSA4OTYgImMtZXhwLnkiCi17IHl5dmFsLnN2YWwgPSB5eXZzcFswXS50c3ltLnN0b2tlbjsgOwotICAgIGJyZWFrO30KLWNhc2UgMTMxOgotI2xpbmUgODk3ICJjLWV4cC55IgoteyB5eXZhbC5zdmFsID0geXl2c3BbMF0uc3N5bS5zdG9rZW47IDsKLSAgICBicmVhazt9Ci19Ci0gICAvKiB0aGUgYWN0aW9uIGZpbGUgZ2V0cyBjb3BpZWQgaW4gaW4gcGxhY2Ugb2YgdGhpcyBkb2xsYXJzaWduICovCi0jbGluZSA0OTggIi9zdG9uZS9qaW1iL21haW4tOThyMi9zaGFyZS9iaXNvbi5zaW1wbGUiCi0MCi0gIHl5dnNwIC09IHl5bGVuOwotICB5eXNzcCAtPSB5eWxlbjsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgeXlsc3AgLT0geXlsZW47Ci0jZW5kaWYKLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICB7Ci0gICAgICBzaG9ydCAqc3NwMSA9IHl5c3MgLSAxOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAic3RhdGUgc3RhY2sgbm93Iik7Ci0gICAgICB3aGlsZSAoc3NwMSAhPSB5eXNzcCkKLQlmcHJpbnRmIChzdGRlcnIsICIgJWQiLCAqKytzc3AxKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotI2VuZGlmCi0KLSAgKisreXl2c3AgPSB5eXZhbDsKLQotI2lmZGVmIFlZTFNQX05FRURFRAotICB5eWxzcCsrOwotICBpZiAoeXlsZW4gPT0gMCkKLSAgICB7Ci0gICAgICB5eWxzcC0+Zmlyc3RfbGluZSA9IHl5bGxvYy5maXJzdF9saW5lOwotICAgICAgeXlsc3AtPmZpcnN0X2NvbHVtbiA9IHl5bGxvYy5maXJzdF9jb2x1bW47Ci0gICAgICB5eWxzcC0+bGFzdF9saW5lID0gKHl5bHNwLTEpLT5sYXN0X2xpbmU7Ci0gICAgICB5eWxzcC0+bGFzdF9jb2x1bW4gPSAoeXlsc3AtMSktPmxhc3RfY29sdW1uOwotICAgICAgeXlsc3AtPnRleHQgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHl5bHNwLT5sYXN0X2xpbmUgPSAoeXlsc3AreXlsZW4tMSktPmxhc3RfbGluZTsKLSAgICAgIHl5bHNwLT5sYXN0X2NvbHVtbiA9ICh5eWxzcCt5eWxlbi0xKS0+bGFzdF9jb2x1bW47Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogTm93ICJzaGlmdCIgdGhlIHJlc3VsdCBvZiB0aGUgcmVkdWN0aW9uLgotICAgICBEZXRlcm1pbmUgd2hhdCBzdGF0ZSB0aGF0IGdvZXMgdG8sCi0gICAgIGJhc2VkIG9uIHRoZSBzdGF0ZSB3ZSBwb3BwZWQgYmFjayB0bwotICAgICBhbmQgdGhlIHJ1bGUgbnVtYmVyIHJlZHVjZWQgYnkuICAqLwotCi0gIHl5biA9IHl5cjFbeXluXTsKLQotICB5eXN0YXRlID0geXlwZ290b1t5eW4gLSBZWU5UQkFTRV0gKyAqeXlzc3A7Ci0gIGlmICh5eXN0YXRlID49IDAgJiYgeXlzdGF0ZSA8PSBZWUxBU1QgJiYgeXljaGVja1t5eXN0YXRlXSA9PSAqeXlzc3ApCi0gICAgeXlzdGF0ZSA9IHl5dGFibGVbeXlzdGF0ZV07Ci0gIGVsc2UKLSAgICB5eXN0YXRlID0geXlkZWZnb3RvW3l5biAtIFlZTlRCQVNFXTsKLQotICBnb3RvIHl5bmV3c3RhdGU7Ci0KLXl5ZXJybGFiOiAgIC8qIGhlcmUgb24gZGV0ZWN0aW5nIGVycm9yICovCi0KLSAgaWYgKCEgeXllcnJzdGF0dXMpCi0gICAgLyogSWYgbm90IGFscmVhZHkgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZXBvcnQgdGhpcyBlcnJvci4gICovCi0gICAgewotICAgICAgKyt5eW5lcnJzOwotCi0jaWZkZWYgWVlFUlJPUl9WRVJCT1NFCi0gICAgICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0KLSAgICAgIGlmICh5eW4gPiBZWUZMQUcgJiYgeXluIDwgWVlMQVNUKQotCXsKLQkgIGludCBzaXplID0gMDsKLQkgIGNoYXIgKm1zZzsKLQkgIGludCB4LCBjb3VudDsKLQotCSAgY291bnQgPSAwOwotCSAgLyogU3RhcnQgWCBhdCAteXluIGlmIG5lYyB0byBhdm9pZCBuZWdhdGl2ZSBpbmRleGVzIGluIHl5Y2hlY2suICAqLwotCSAgZm9yICh4ID0gKHl5biA8IDAgPyAteXluIDogMCk7Ci0JICAgICAgIHggPCAoc2l6ZW9mKHl5dG5hbWUpIC8gc2l6ZW9mKGNoYXIgKikpOyB4KyspCi0JICAgIGlmICh5eWNoZWNrW3ggKyB5eW5dID09IHgpCi0JICAgICAgc2l6ZSArPSBzdHJsZW4oeXl0bmFtZVt4XSkgKyAxNSwgY291bnQrKzsKLQkgIG1zZyA9IChjaGFyICopIHhtYWxsb2Moc2l6ZSArIDE1KTsKLQkgIGlmIChtc2cgIT0gMCkKLQkgICAgewotCSAgICAgIHN0cmNweShtc2csICJwYXJzZSBlcnJvciIpOwotCi0JICAgICAgaWYgKGNvdW50IDwgNSkKLQkJewotCQkgIGNvdW50ID0gMDsKLQkJICBmb3IgKHggPSAoeXluIDwgMCA/IC15eW4gOiAwKTsKLQkJICAgICAgIHggPCAoc2l6ZW9mKHl5dG5hbWUpIC8gc2l6ZW9mKGNoYXIgKikpOyB4KyspCi0JCSAgICBpZiAoeXljaGVja1t4ICsgeXluXSA9PSB4KQotCQkgICAgICB7Ci0JCQlzdHJjYXQobXNnLCBjb3VudCA9PSAwID8gIiwgZXhwZWN0aW5nIGAiIDogIiBvciBgIik7Ci0JCQlzdHJjYXQobXNnLCB5eXRuYW1lW3hdKTsKLQkJCXN0cmNhdChtc2csICInIik7Ci0JCQljb3VudCsrOwotCQkgICAgICB9Ci0JCX0KLQkgICAgICB5eWVycm9yKG1zZyk7Ci0JICAgICAgZnJlZShtc2cpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHl5ZXJyb3IgKCJwYXJzZSBlcnJvcjsgYWxzbyB2aXJ0dWFsIG1lbW9yeSBleGNlZWRlZCIpOwotCX0KLSAgICAgIGVsc2UKLSNlbmRpZiAvKiBZWUVSUk9SX1ZFUkJPU0UgKi8KLQl5eWVycm9yKCJwYXJzZSBlcnJvciIpOwotICAgIH0KLQotICBnb3RvIHl5ZXJybGFiMTsKLXl5ZXJybGFiMTogICAvKiBoZXJlIG9uIGVycm9yIHJhaXNlZCBleHBsaWNpdGx5IGJ5IGFuIGFjdGlvbiAqLwotCi0gIGlmICh5eWVycnN0YXR1cyA9PSAzKQotICAgIHsKLSAgICAgIC8qIGlmIGp1c3QgdHJpZWQgYW5kIGZhaWxlZCB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgYW4gZXJyb3IsIGRpc2NhcmQgaXQuICAqLwotCi0gICAgICAvKiByZXR1cm4gZmFpbHVyZSBpZiBhdCBlbmQgb2YgaW5wdXQgKi8KLSAgICAgIGlmICh5eWNoYXIgPT0gWVlFT0YpCi0JWVlBQk9SVDsKLQotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JZnByaW50ZihzdGRlcnIsICJEaXNjYXJkaW5nIHRva2VuICVkICglcykuXG4iLCB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOwotI2VuZGlmCi0KLSAgICAgIHl5Y2hhciA9IFlZRU1QVFk7Ci0gICAgfQotCi0gIC8qIEVsc2Ugd2lsbCB0cnkgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuCi0gICAgIGFmdGVyIHNoaWZ0aW5nIHRoZSBlcnJvciB0b2tlbi4gICovCi0KLSAgeXllcnJzdGF0dXMgPSAzOwkJLyogRWFjaCByZWFsIHRva2VuIHNoaWZ0ZWQgZGVjcmVtZW50cyB0aGlzICovCi0KLSAgZ290byB5eWVycmhhbmRsZTsKLQoteXllcnJkZWZhdWx0OiAgLyogY3VycmVudCBzdGF0ZSBkb2VzIG5vdCBkbyBhbnl0aGluZyBzcGVjaWFsIGZvciB0aGUgZXJyb3IgdG9rZW4uICovCi0KLSNpZiAwCi0gIC8qIFRoaXMgaXMgd3Jvbmc7IG9ubHkgc3RhdGVzIHRoYXQgZXhwbGljaXRseSB3YW50IGVycm9yIHRva2VucwotICAgICBzaG91bGQgc2hpZnQgdGhlbS4gICovCi0gIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOyAgLyogSWYgaXRzIGRlZmF1bHQgaXMgdG8gYWNjZXB0IGFueSB0b2tlbiwgb2suICBPdGhlcndpc2UgcG9wIGl0LiovCi0gIGlmICh5eW4pIGdvdG8geXlkZWZhdWx0OwotI2VuZGlmCi0KLXl5ZXJycG9wOiAgIC8qIHBvcCB0aGUgY3VycmVudCBzdGF0ZSBiZWNhdXNlIGl0IGNhbm5vdCBoYW5kbGUgdGhlIGVycm9yIHRva2VuICovCi0KLSAgaWYgKHl5c3NwID09IHl5c3MpIFlZQUJPUlQ7Ci0gIHl5dnNwLS07Ci0gIHl5c3RhdGUgPSAqLS15eXNzcDsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgeXlsc3AtLTsKLSNlbmRpZgotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIHsKLSAgICAgIHNob3J0ICpzc3AxID0geXlzcyAtIDE7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogc3RhdGUgc3RhY2sgbm93Iik7Ci0gICAgICB3aGlsZSAoc3NwMSAhPSB5eXNzcCkKLQlmcHJpbnRmIChzdGRlcnIsICIgJWQiLCAqKytzc3AxKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotI2VuZGlmCi0KLXl5ZXJyaGFuZGxlOgotCi0gIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLSAgaWYgKHl5biA9PSBZWUZMQUcpCi0gICAgZ290byB5eWVycmRlZmF1bHQ7Ci0KLSAgeXluICs9IFlZVEVSUk9SOwotICBpZiAoeXluIDwgMCB8fCB5eW4gPiBZWUxBU1QgfHwgeXljaGVja1t5eW5dICE9IFlZVEVSUk9SKQotICAgIGdvdG8geXllcnJkZWZhdWx0OwotCi0gIHl5biA9IHl5dGFibGVbeXluXTsKLSAgaWYgKHl5biA8IDApCi0gICAgewotICAgICAgaWYgKHl5biA9PSBZWUZMQUcpCi0JZ290byB5eWVycnBvcDsKLSAgICAgIHl5biA9IC15eW47Ci0gICAgICBnb3RvIHl5cmVkdWNlOwotICAgIH0KLSAgZWxzZSBpZiAoeXluID09IDApCi0gICAgZ290byB5eWVycnBvcDsKLQotICBpZiAoeXluID09IFlZRklOQUwpCi0gICAgWVlBQ0NFUFQ7Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgZnByaW50ZihzdGRlcnIsICJTaGlmdGluZyBlcnJvciB0b2tlbiwgIik7Ci0jZW5kaWYKLQotICAqKyt5eXZzcCA9IHl5bHZhbDsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgKisreXlsc3AgPSB5eWxsb2M7Ci0jZW5kaWYKLQotICB5eXN0YXRlID0geXluOwotICBnb3RvIHl5bmV3c3RhdGU7Ci19Ci0jbGluZSA5MTEgImMtZXhwLnkiCi0KLQotLyogVGFrZSBjYXJlIG9mIHBhcnNpbmcgYSBudW1iZXIgKGFueXRoaW5nIHRoYXQgc3RhcnRzIHdpdGggYSBkaWdpdCkuCi0gICBTZXQgeXlsdmFsIGFuZCByZXR1cm4gdGhlIHRva2VuIHR5cGU7IHVwZGF0ZSBsZXhwdHIuCi0gICBMRU4gaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGl0LiAgKi8KLQotLyoqKiBOZWVkcyBzb21lIGVycm9yIGNoZWNraW5nIGZvciB0aGUgZmxvYXQgY2FzZSAqKiovCi0KLXN0YXRpYyBpbnQKLXBhcnNlX251bWJlciAocCwgbGVuLCBwYXJzZWRfZmxvYXQsIHB1dGl0aGVyZSkKLSAgICAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgICAgcmVnaXN0ZXIgaW50IGxlbjsKLSAgICAgaW50IHBhcnNlZF9mbG9hdDsKLSAgICAgWVlTVFlQRSAqcHV0aXRoZXJlOwotewotICAvKiBGSVhNRTogU2hvdWxkbid0IHRoZXNlIGJlIHVuc2lnbmVkPyAgV2UgZG9uJ3QgZGVhbCB3aXRoIG5lZ2F0aXZlIHZhbHVlcwotICAgICBoZXJlLCBhbmQgd2UgZG8ga2luZCBvZiBzaWxseSB0aGluZ3MgbGlrZSBjYXN0IHRvIHVuc2lnbmVkLiAgKi8KLSAgcmVnaXN0ZXIgTE9OR0VTVCBuID0gMDsKLSAgcmVnaXN0ZXIgTE9OR0VTVCBwcmV2biA9IDA7Ci0gIFVMT05HRVNUIHVuOwotCi0gIHJlZ2lzdGVyIGludCBpID0gMDsKLSAgcmVnaXN0ZXIgaW50IGM7Ci0gIHJlZ2lzdGVyIGludCBiYXNlID0gaW5wdXRfcmFkaXg7Ci0gIGludCB1bnNpZ25lZF9wID0gMDsKLQotICAvKiBOdW1iZXIgb2YgIkwiIHN1ZmZpeGVzIGVuY291bnRlcmVkLiAgKi8KLSAgaW50IGxvbmdfcCA9IDA7Ci0KLSAgLyogV2UgaGF2ZSBmb3VuZCBhICJMIiBvciAiVSIgc3VmZml4LiAgKi8KLSAgaW50IGZvdW5kX3N1ZmZpeCA9IDA7Ci0KLSAgVUxPTkdFU1QgaGlnaF9iaXQ7Ci0gIHN0cnVjdCB0eXBlICpzaWduZWRfdHlwZTsKLSAgc3RydWN0IHR5cGUgKnVuc2lnbmVkX3R5cGU7Ci0KLSAgaWYgKHBhcnNlZF9mbG9hdCkKLSAgICB7Ci0gICAgICAvKiBJdCdzIGEgZmxvYXQgc2luY2UgaXQgY29udGFpbnMgYSBwb2ludCBvciBhbiBleHBvbmVudC4gICovCi0gICAgICBjaGFyIGM7Ci0gICAgICBpbnQgbnVtID0gMDsJLyogbnVtYmVyIG9mIHRva2VucyBzY2FubmVkIGJ5IHNjYW5mICovCi0gICAgICBjaGFyIHNhdmVkX2NoYXIgPSBwW2xlbl07Ci0KLSAgICAgIHBbbGVuXSA9IDA7CS8qIG51bGwtdGVybWluYXRlIHRoZSB0b2tlbiAqLwotICAgICAgaWYgKHNpemVvZiAocHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQuZHZhbCkgPD0gc2l6ZW9mIChmbG9hdCkpCi0JbnVtID0gc3NjYW5mIChwLCAiJWclYyIsIChmbG9hdCAqKSAmcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQuZHZhbCwmYyk7Ci0gICAgICBlbHNlIGlmIChzaXplb2YgKHB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LmR2YWwpIDw9IHNpemVvZiAoZG91YmxlKSkKLQludW0gPSBzc2NhbmYgKHAsICIlbGclYyIsIChkb3VibGUgKikgJnB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LmR2YWwsJmMpOwotICAgICAgZWxzZQotCXsKLSNpZmRlZiBTQ0FORl9IQVNfTE9OR19ET1VCTEUKLQkgIG51bSA9IHNzY2FuZiAocCwgIiVMZyVjIiwgJnB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LmR2YWwsJmMpOwotI2Vsc2UKLQkgIC8qIFNjYW4gaXQgaW50byBhIGRvdWJsZSwgdGhlbiBhc3NpZ24gaXQgdG8gdGhlIGxvbmcgZG91YmxlLgotCSAgICAgVGhpcyBhdCBsZWFzdCB3aW5zIHdpdGggdmFsdWVzIHJlcHJlc2VudGFibGUgaW4gdGhlIHJhbmdlCi0JICAgICBvZiBkb3VibGVzLiAqLwotCSAgZG91YmxlIHRlbXA7Ci0JICBudW0gPSBzc2NhbmYgKHAsICIlbGclYyIsICZ0ZW1wLCZjKTsKLQkgIHB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LmR2YWwgPSB0ZW1wOwotI2VuZGlmCi0JfQotICAgICAgcFtsZW5dID0gc2F2ZWRfY2hhcjsJLyogcmVzdG9yZSB0aGUgaW5wdXQgc3RyZWFtICovCi0gICAgICBpZiAobnVtICE9IDEpIAkJLyogY2hlY2sgc2NhbmYgZm91bmQgT05MWSBhIGZsb2F0IC4uLiAqLwotCXJldHVybiBFUlJPUjsKLSAgICAgIC8qIFNlZSBpZiBpdCBoYXMgYGYnIG9yIGBsJyBzdWZmaXggKGZsb2F0IG9yIGxvbmcgZG91YmxlKS4gICovCi0KLSAgICAgIGMgPSB0b2xvd2VyIChwW2xlbiAtIDFdKTsKLQotICAgICAgaWYgKGMgPT0gJ2YnKQotCXB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LnR5cGUgPSBidWlsdGluX3R5cGVfZmxvYXQ7Ci0gICAgICBlbHNlIGlmIChjID09ICdsJykKLQlwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC50eXBlID0gYnVpbHRpbl90eXBlX2xvbmdfZG91YmxlOwotICAgICAgZWxzZSBpZiAoaXNkaWdpdCAoYykgfHwgYyA9PSAnLicpCi0JcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQudHlwZSA9IGJ1aWx0aW5fdHlwZV9kb3VibGU7Ci0gICAgICBlbHNlCi0JcmV0dXJuIEVSUk9SOwotCi0gICAgICByZXR1cm4gRkxPQVQ7Ci0gICAgfQotCi0gIC8qIEhhbmRsZSBiYXNlLXN3aXRjaGluZyBwcmVmaXhlcyAweCwgMHQsIDBkLCAwICovCi0gIGlmIChwWzBdID09ICcwJykKLSAgICBzd2l0Y2ggKHBbMV0pCi0gICAgICB7Ci0gICAgICBjYXNlICd4JzoKLSAgICAgIGNhc2UgJ1gnOgotCWlmIChsZW4gPj0gMykKLQkgIHsKLQkgICAgcCArPSAyOwotCSAgICBiYXNlID0gMTY7Ci0JICAgIGxlbiAtPSAyOwotCSAgfQotCWJyZWFrOwotCi0gICAgICBjYXNlICd0JzoKLSAgICAgIGNhc2UgJ1QnOgotICAgICAgY2FzZSAnZCc6Ci0gICAgICBjYXNlICdEJzoKLQlpZiAobGVuID49IDMpCi0JICB7Ci0JICAgIHAgKz0gMjsKLQkgICAgYmFzZSA9IDEwOwotCSAgICBsZW4gLT0gMjsKLQkgIH0KLQlicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQliYXNlID0gODsKLQlicmVhazsKLSAgICAgIH0KLQotICB3aGlsZSAobGVuLS0gPiAwKQotICAgIHsKLSAgICAgIGMgPSAqcCsrOwotICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQotCWMgKz0gJ2EnIC0gJ0EnOwotICAgICAgaWYgKGMgIT0gJ2wnICYmIGMgIT0gJ3UnKQotCW4gKj0gYmFzZTsKLSAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKLQl7Ci0JICBpZiAoZm91bmRfc3VmZml4KQotCSAgICByZXR1cm4gRVJST1I7Ci0JICBuICs9IGkgPSBjIC0gJzAnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoYmFzZSA+IDEwICYmIGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQotCSAgICB7Ci0JICAgICAgaWYgKGZvdW5kX3N1ZmZpeCkKLQkJcmV0dXJuIEVSUk9SOwotCSAgICAgIG4gKz0gaSA9IGMgLSAnYScgKyAxMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoYyA9PSAnbCcpCi0JICAgIHsKLQkgICAgICArK2xvbmdfcDsKLQkgICAgICBmb3VuZF9zdWZmaXggPSAxOwotCSAgICB9Ci0JICBlbHNlIGlmIChjID09ICd1JykKLQkgICAgewotCSAgICAgIHVuc2lnbmVkX3AgPSAxOwotCSAgICAgIGZvdW5kX3N1ZmZpeCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgcmV0dXJuIEVSUk9SOwkvKiBDaGFyIG5vdCBhIGRpZ2l0ICovCi0JfQotICAgICAgaWYgKGkgPj0gYmFzZSkKLQlyZXR1cm4gRVJST1I7CQkvKiBJbnZhbGlkIGRpZ2l0IGluIHRoaXMgYmFzZSAqLwotCi0gICAgICAvKiBQb3J0YWJseSB0ZXN0IGZvciBvdmVyZmxvdyAob25seSB3b3JrcyBmb3Igbm9uemVybyB2YWx1ZXMsIHNvIG1ha2UKLQkgYSBzZWNvbmQgY2hlY2sgZm9yIHplcm8pLiAgRklYTUU6IENhbid0IHdlIGp1c3QgbWFrZSBuIGFuZCBwcmV2bgotCSB1bnNpZ25lZCBhbmQgYXZvaWQgdGhpcz8gICovCi0gICAgICBpZiAoYyAhPSAnbCcgJiYgYyAhPSAndScgJiYgKHByZXZuID49IG4pICYmIG4gIT0gMCkKLQl1bnNpZ25lZF9wID0gMTsJCS8qIFRyeSBzb21ldGhpbmcgdW5zaWduZWQgKi8KLQotICAgICAgLyogUG9ydGFibHkgdGVzdCBmb3IgdW5zaWduZWQgb3ZlcmZsb3cuCi0JIEZJWE1FOiBUaGlzIGNoZWNrIGlzIHdyb25nOyBmb3IgZXhhbXBsZSBpdCBkb2Vzbid0IGZpbmQgb3ZlcmZsb3cKLQkgb24gMHgxMjM0NTY3ODkgd2hlbiBMT05HRVNUIGlzIDMyIGJpdHMuICAqLwotICAgICAgaWYgKGMgIT0gJ2wnICYmIGMgIT0gJ3UnICYmIG4gIT0gMCkKLQl7CQotCSAgaWYgKCh1bnNpZ25lZF9wICYmIChVTE9OR0VTVCkgcHJldm4gPj0gKFVMT05HRVNUKSBuKSkKLQkgICAgZXJyb3IgKCJOdW1lcmljIGNvbnN0YW50IHRvbyBsYXJnZS4iKTsKLQl9Ci0gICAgICBwcmV2biA9IG47Ci0gICAgfQotCi0gIC8qIEFuIGludGVnZXIgY29uc3RhbnQgaXMgYW4gaW50LCBhIGxvbmcsIG9yIGEgbG9uZyBsb25nLiAgQW4gTAotICAgICBzdWZmaXggZm9yY2VzIGl0IHRvIGJlIGxvbmc7IGFuIExMIHN1ZmZpeCBmb3JjZXMgaXQgdG8gYmUgbG9uZwotICAgICBsb25nLiAgSWYgbm90IGZvcmNlZCB0byBhIGxhcmdlciBzaXplLCBpdCBnZXRzIHRoZSBmaXJzdCB0eXBlIG9mCi0gICAgIHRoZSBhYm92ZSB0aGF0IGl0IGZpdHMgaW4uICBUbyBmaWd1cmUgb3V0IHdoZXRoZXIgaXQgZml0cywgd2UKLSAgICAgc2hpZnQgaXQgcmlnaHQgYW5kIHNlZSB3aGV0aGVyIGFueXRoaW5nIHJlbWFpbnMuICBOb3RlIHRoYXQgd2UKLSAgICAgY2FuJ3Qgc2hpZnQgc2l6ZW9mIChMT05HRVNUKSAqIEhPU1RfQ0hBUl9CSVQgYml0cyBvciBtb3JlIGluIG9uZQotICAgICBvcGVyYXRpb24sIGJlY2F1c2UgbWFueSBjb21waWxlcnMgd2lsbCB3YXJuIGFib3V0IHN1Y2ggYSBzaGlmdAotICAgICAod2hpY2ggYWx3YXlzIHByb2R1Y2VzIGEgemVybyByZXN1bHQpLiAgU29tZXRpbWVzIFRBUkdFVF9JTlRfQklUCi0gICAgIG9yIFRBUkdFVF9MT05HX0JJVCB3aWxsIGJlIHRoYXQgYmlnLCBzb21ldGltZXMgbm90LiAgVG8gZGVhbCB3aXRoCi0gICAgIHRoZSBjYXNlIHdoZXJlIGl0IGlzIHdlIGp1c3QgYWx3YXlzIHNoaWZ0IHRoZSB2YWx1ZSBtb3JlIHRoYW4KLSAgICAgb25jZSwgd2l0aCBmZXdlciBiaXRzIGVhY2ggdGltZS4gICovCi0KLSAgdW4gPSAoVUxPTkdFU1QpbiA+PiAyOwotICBpZiAobG9uZ19wID09IDAKLSAgICAgICYmICh1biA+PiAoVEFSR0VUX0lOVF9CSVQgLSAyKSkgPT0gMCkKLSAgICB7Ci0gICAgICBoaWdoX2JpdCA9ICgoVUxPTkdFU1QpMSkgPDwgKFRBUkdFVF9JTlRfQklULTEpOwotCi0gICAgICAvKiBBIGxhcmdlIGRlY2ltYWwgKG5vdCBoZXggb3Igb2N0YWwpIGNvbnN0YW50IChiZXR3ZWVuIElOVF9NQVgKLQkgYW5kIFVJTlRfTUFYKSBpcyBhIGxvbmcgb3IgdW5zaWduZWQgbG9uZywgYWNjb3JkaW5nIHRvIEFOU0ksCi0JIG5ldmVyIGFuIHVuc2lnbmVkIGludCwgYnV0IHRoaXMgY29kZSB0cmVhdHMgaXQgYXMgdW5zaWduZWQKLQkgaW50LiAgVGhpcyBwcm9iYWJseSBzaG91bGQgYmUgZml4ZWQuICBHQ0MgZ2l2ZXMgYSB3YXJuaW5nIG9uCi0JIHN1Y2ggY29uc3RhbnRzLiAgKi8KLQotICAgICAgdW5zaWduZWRfdHlwZSA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9pbnQ7Ci0gICAgICBzaWduZWRfdHlwZSA9IGJ1aWx0aW5fdHlwZV9pbnQ7Ci0gICAgfQotICBlbHNlIGlmIChsb25nX3AgPD0gMQotCSAgICYmICh1biA+PiAoVEFSR0VUX0xPTkdfQklUIC0gMikpID09IDApCi0gICAgewotICAgICAgaGlnaF9iaXQgPSAoKFVMT05HRVNUKTEpIDw8IChUQVJHRVRfTE9OR19CSVQtMSk7Ci0gICAgICB1bnNpZ25lZF90eXBlID0gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmc7Ci0gICAgICBzaWduZWRfdHlwZSA9IGJ1aWx0aW5fdHlwZV9sb25nOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBzaGlmdDsKLSAgICAgIGlmIChzaXplb2YgKFVMT05HRVNUKSAqIEhPU1RfQ0hBUl9CSVQgPCBUQVJHRVRfTE9OR19MT05HX0JJVCkKLQkvKiBBIGxvbmcgbG9uZyBkb2VzIG5vdCBmaXQgaW4gYSBMT05HRVNULiAgKi8KLQlzaGlmdCA9IChzaXplb2YgKFVMT05HRVNUKSAqIEhPU1RfQ0hBUl9CSVQgLSAxKTsKLSAgICAgIGVsc2UKLQlzaGlmdCA9IChUQVJHRVRfTE9OR19MT05HX0JJVCAtIDEpOwotICAgICAgaGlnaF9iaXQgPSAoVUxPTkdFU1QpIDEgPDwgc2hpZnQ7Ci0gICAgICB1bnNpZ25lZF90eXBlID0gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZzsKLSAgICAgIHNpZ25lZF90eXBlID0gYnVpbHRpbl90eXBlX2xvbmdfbG9uZzsKLSAgICB9Ci0KLSAgIHB1dGl0aGVyZS0+dHlwZWRfdmFsX2ludC52YWwgPSBuOwotCi0gICAvKiBJZiB0aGUgaGlnaCBiaXQgb2YgdGhlIHdvcmtlZCBvdXQgdHlwZSBpcyBzZXQgdGhlbiB0aGlzIG51bWJlcgotICAgICAgaGFzIHRvIGJlIHVuc2lnbmVkLiAqLwotCi0gICBpZiAodW5zaWduZWRfcCB8fCAobiAmIGhpZ2hfYml0KSkgCi0gICAgIHsKLSAgICAgICBwdXRpdGhlcmUtPnR5cGVkX3ZhbF9pbnQudHlwZSA9IHVuc2lnbmVkX3R5cGU7Ci0gICAgIH0KLSAgIGVsc2UgCi0gICAgIHsKLSAgICAgICBwdXRpdGhlcmUtPnR5cGVkX3ZhbF9pbnQudHlwZSA9IHNpZ25lZF90eXBlOwotICAgICB9Ci0KLSAgIHJldHVybiBJTlQ7Ci19Ci0KLXN0cnVjdCB0b2tlbgotewotICBjaGFyICpvcGVyYXRvcjsKLSAgaW50IHRva2VuOwotICBlbnVtIGV4cF9vcGNvZGUgb3Bjb2RlOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2tlbiB0b2tlbnRhYjNbXSA9Ci0gIHsKLSAgICB7Ij4+PSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX1JTSH0sCi0gICAgeyI8PD0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9MU0h9Ci0gIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rZW4gdG9rZW50YWIyW10gPQotICB7Ci0gICAgeyIrPSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX0FERH0sCi0gICAgeyItPSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX1NVQn0sCi0gICAgeyIqPSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX01VTH0sCi0gICAgeyIvPSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX0RJVn0sCi0gICAgeyIlPSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX1JFTX0sCi0gICAgeyJ8PSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX0JJVFdJU0VfSU9SfSwKLSAgICB7IiY9IiwgQVNTSUdOX01PRElGWSwgQklOT1BfQklUV0lTRV9BTkR9LAotICAgIHsiXj0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9CSVRXSVNFX1hPUn0sCi0gICAgeyIrKyIsIElOQ1JFTUVOVCwgQklOT1BfRU5EfSwKLSAgICB7Ii0tIiwgREVDUkVNRU5ULCBCSU5PUF9FTkR9LAotICAgIHsiLT4iLCBBUlJPVywgQklOT1BfRU5EfSwKLSAgICB7IiYmIiwgQU5EQU5ELCBCSU5PUF9FTkR9LAotICAgIHsifHwiLCBPUk9SLCBCSU5PUF9FTkR9LAotICAgIHsiOjoiLCBDT0xPTkNPTE9OLCBCSU5PUF9FTkR9LAotICAgIHsiPDwiLCBMU0gsIEJJTk9QX0VORH0sCi0gICAgeyI+PiIsIFJTSCwgQklOT1BfRU5EfSwKLSAgICB7Ij09IiwgRVFVQUwsIEJJTk9QX0VORH0sCi0gICAgeyIhPSIsIE5PVEVRVUFMLCBCSU5PUF9FTkR9LAotICAgIHsiPD0iLCBMRVEsIEJJTk9QX0VORH0sCi0gICAgeyI+PSIsIEdFUSwgQklOT1BfRU5EfQotICB9OwotCi0vKiBSZWFkIG9uZSB0b2tlbiwgZ2V0dGluZyBjaGFyYWN0ZXJzIHRocm91Z2ggbGV4cHRyLiAgKi8KLQotc3RhdGljIGludAoteXlsZXggKCkKLXsKLSAgaW50IGM7Ci0gIGludCBuYW1lbGVuOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgY2hhciAqdG9rc3RhcnQ7Ci0gIGNoYXIgKnRva3B0cjsKLSAgaW50IHRlbXBidWZpbmRleDsKLSAgc3RhdGljIGNoYXIgKnRlbXBidWY7Ci0gIHN0YXRpYyBpbnQgdGVtcGJ1ZnNpemU7Ci0gIHN0cnVjdCBzeW1ib2wgKiBzeW1fY2xhc3MgPSBOVUxMOwotICBjaGFyICogdG9rZW5fc3RyaW5nID0gTlVMTDsKLSAgaW50IGNsYXNzX3ByZWZpeCA9IDA7Ci0gIGludCB1bnF1b3RlZF9leHByOwotICAgCi0gcmV0cnk6Ci0KLSAgdW5xdW90ZWRfZXhwciA9IDE7Ci0KLSAgdG9rc3RhcnQgPSBsZXhwdHI7Ci0gIC8qIFNlZSBpZiBpdCBpcyBhIHNwZWNpYWwgdG9rZW4gb2YgbGVuZ3RoIDMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIHRva2VudGFiMyAvIHNpemVvZiB0b2tlbnRhYjNbMF07IGkrKykKLSAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgdG9rZW50YWIzW2ldLm9wZXJhdG9yLCAzKSkKLSAgICAgIHsKLQlsZXhwdHIgKz0gMzsKLQl5eWx2YWwub3Bjb2RlID0gdG9rZW50YWIzW2ldLm9wY29kZTsKLQlyZXR1cm4gdG9rZW50YWIzW2ldLnRva2VuOwotICAgICAgfQotCi0gIC8qIFNlZSBpZiBpdCBpcyBhIHNwZWNpYWwgdG9rZW4gb2YgbGVuZ3RoIDIuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIHRva2VudGFiMiAvIHNpemVvZiB0b2tlbnRhYjJbMF07IGkrKykKLSAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgdG9rZW50YWIyW2ldLm9wZXJhdG9yLCAyKSkKLSAgICAgIHsKLQlsZXhwdHIgKz0gMjsKLQl5eWx2YWwub3Bjb2RlID0gdG9rZW50YWIyW2ldLm9wY29kZTsKLQlyZXR1cm4gdG9rZW50YWIyW2ldLnRva2VuOwotICAgICAgfQotCi0gIHN3aXRjaCAoYyA9ICp0b2tzdGFydCkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlICcgJzoKLSAgICBjYXNlICdcdCc6Ci0gICAgY2FzZSAnXG4nOgotICAgICAgbGV4cHRyKys7Ci0gICAgICBnb3RvIHJldHJ5OwotCi0gICAgY2FzZSAnXCcnOgotICAgICAgLyogV2UgZWl0aGVyIGhhdmUgYSBjaGFyYWN0ZXIgY29uc3RhbnQgKCcwJyBvciAnXDE3NycgZm9yIGV4YW1wbGUpCi0JIG9yIHdlIGhhdmUgYSBxdW90ZWQgc3ltYm9sIHJlZmVyZW5jZSAoJ2ZvbyhpbnQsaW50KScgaW4gQysrCi0JIGZvciBleGFtcGxlKS4gKi8KLSAgICAgIGxleHB0cisrOwotICAgICAgYyA9ICpsZXhwdHIrKzsKLSAgICAgIGlmIChjID09ICdcXCcpCi0JYyA9IHBhcnNlX2VzY2FwZSAoJmxleHB0cik7Ci0gICAgICBlbHNlIGlmIChjID09ICdcJycpCi0JZXJyb3IgKCJFbXB0eSBjaGFyYWN0ZXIgY29uc3RhbnQuIik7Ci0KLSAgICAgIHl5bHZhbC50eXBlZF92YWxfaW50LnZhbCA9IGM7Ci0gICAgICB5eWx2YWwudHlwZWRfdmFsX2ludC50eXBlID0gYnVpbHRpbl90eXBlX2NoYXI7Ci0KLSAgICAgIGMgPSAqbGV4cHRyKys7Ci0gICAgICBpZiAoYyAhPSAnXCcnKQotCXsKLQkgIG5hbWVsZW4gPSBza2lwX3F1b3RlZCAodG9rc3RhcnQpIC0gdG9rc3RhcnQ7Ci0JICBpZiAobmFtZWxlbiA+IDIpCi0JICAgIHsKLQkgICAgICBsZXhwdHIgPSB0b2tzdGFydCArIG5hbWVsZW47Ci0gICAgICAgICAgICAgIHVucXVvdGVkX2V4cHIgPSAwOwotCSAgICAgIGlmIChsZXhwdHJbLTFdICE9ICdcJycpCi0JCWVycm9yICgiVW5tYXRjaGVkIHNpbmdsZSBxdW90ZS4iKTsKLQkgICAgICBuYW1lbGVuIC09IDI7Ci0JICAgICAgdG9rc3RhcnQrKzsKLQkgICAgICBnb3RvIHRyeW5hbWU7Ci0JICAgIH0KLQkgIGVycm9yICgiSW52YWxpZCBjaGFyYWN0ZXIgY29uc3RhbnQuIik7Ci0JfQotICAgICAgcmV0dXJuIElOVDsKLQotICAgIGNhc2UgJygnOgotICAgICAgcGFyZW5fZGVwdGgrKzsKLSAgICAgIGxleHB0cisrOwotICAgICAgcmV0dXJuIGM7Ci0KLSAgICBjYXNlICcpJzoKLSAgICAgIGlmIChwYXJlbl9kZXB0aCA9PSAwKQotCXJldHVybiAwOwotICAgICAgcGFyZW5fZGVwdGgtLTsKLSAgICAgIGxleHB0cisrOwotICAgICAgcmV0dXJuIGM7Ci0KLSAgICBjYXNlICcsJzoKLSAgICAgIGlmIChjb21tYV90ZXJtaW5hdGVzICYmIHBhcmVuX2RlcHRoID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIHJldHVybiBjOwotCi0gICAgY2FzZSAnLic6Ci0gICAgICAvKiBNaWdodCBiZSBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4gICovCi0gICAgICBpZiAobGV4cHRyWzFdIDwgJzAnIHx8IGxleHB0clsxXSA+ICc5JykKLQlnb3RvIHN5bWJvbDsJCS8qIE5vcGUsIG11c3QgYmUgYSBzeW1ib2wuICovCi0gICAgICAvKiBGQUxMIFRIUlUgaW50byBudW1iZXIgY2FzZS4gICovCi0KLSAgICBjYXNlICcwJzoKLSAgICBjYXNlICcxJzoKLSAgICBjYXNlICcyJzoKLSAgICBjYXNlICczJzoKLSAgICBjYXNlICc0JzoKLSAgICBjYXNlICc1JzoKLSAgICBjYXNlICc2JzoKLSAgICBjYXNlICc3JzoKLSAgICBjYXNlICc4JzoKLSAgICBjYXNlICc5JzoKLSAgICAgIHsKLQkvKiBJdCdzIGEgbnVtYmVyLiAgKi8KLQlpbnQgZ290X2RvdCA9IDAsIGdvdF9lID0gMCwgdG9rdHlwZTsKLQlyZWdpc3RlciBjaGFyICpwID0gdG9rc3RhcnQ7Ci0JaW50IGhleCA9IGlucHV0X3JhZGl4ID4gMTA7Ci0KLQlpZiAoYyA9PSAnMCcgJiYgKHBbMV0gPT0gJ3gnIHx8IHBbMV0gPT0gJ1gnKSkKLQkgIHsKLQkgICAgcCArPSAyOwotCSAgICBoZXggPSAxOwotCSAgfQotCWVsc2UgaWYgKGMgPT0gJzAnICYmIChwWzFdPT0ndCcgfHwgcFsxXT09J1QnIHx8IHBbMV09PSdkJyB8fCBwWzFdPT0nRCcpKQotCSAgewotCSAgICBwICs9IDI7Ci0JICAgIGhleCA9IDA7Ci0JICB9Ci0KLQlmb3IgKDs7ICsrcCkKLQkgIHsKLQkgICAgLyogVGhpcyB0ZXN0IGluY2x1ZGVzICFoZXggYmVjYXVzZSAnZScgaXMgYSB2YWxpZCBoZXggZGlnaXQKLQkgICAgICAgYW5kIHRodXMgZG9lcyBub3QgaW5kaWNhdGUgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgd2hlbgotCSAgICAgICB0aGUgcmFkaXggaXMgaGV4LiAgKi8KLQkgICAgaWYgKCFoZXggJiYgIWdvdF9lICYmICgqcCA9PSAnZScgfHwgKnAgPT0gJ0UnKSkKLQkgICAgICBnb3RfZG90ID0gZ290X2UgPSAxOwotCSAgICAvKiBUaGlzIHRlc3QgZG9lcyBub3QgaW5jbHVkZSAhaGV4LCBiZWNhdXNlIGEgJy4nIGFsd2F5cyBpbmRpY2F0ZXMKLQkgICAgICAgYSBkZWNpbWFsIGZsb2F0aW5nIHBvaW50IG51bWJlciByZWdhcmRsZXNzIG9mIHRoZSByYWRpeC4gICovCi0JICAgIGVsc2UgaWYgKCFnb3RfZG90ICYmICpwID09ICcuJykKLQkgICAgICBnb3RfZG90ID0gMTsKLQkgICAgZWxzZSBpZiAoZ290X2UgJiYgKHBbLTFdID09ICdlJyB8fCBwWy0xXSA9PSAnRScpCi0JCSAgICAgJiYgKCpwID09ICctJyB8fCAqcCA9PSAnKycpKQotCSAgICAgIC8qIFRoaXMgaXMgdGhlIHNpZ24gb2YgdGhlIGV4cG9uZW50LCBub3QgdGhlIGVuZCBvZiB0aGUKLQkJIG51bWJlci4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIC8qIFdlIHdpbGwgdGFrZSBhbnkgbGV0dGVycyBvciBkaWdpdHMuICBwYXJzZV9udW1iZXIgd2lsbAotCSAgICAgICBjb21wbGFpbiBpZiBwYXN0IHRoZSByYWRpeCwgb3IgaWYgTCBvciBVIGFyZSBub3QgZmluYWwuICAqLwotCSAgICBlbHNlIGlmICgoKnAgPCAnMCcgfHwgKnAgPiAnOScpCi0JCSAgICAgJiYgKCgqcCA8ICdhJyB8fCAqcCA+ICd6JykKLQkJCQkgICYmICgqcCA8ICdBJyB8fCAqcCA+ICdaJykpKQotCSAgICAgIGJyZWFrOwotCSAgfQotCXRva3R5cGUgPSBwYXJzZV9udW1iZXIgKHRva3N0YXJ0LCBwIC0gdG9rc3RhcnQsIGdvdF9kb3R8Z290X2UsICZ5eWx2YWwpOwotICAgICAgICBpZiAodG9rdHlwZSA9PSBFUlJPUikKLQkgIHsKLQkgICAgY2hhciAqZXJyX2NvcHkgPSAoY2hhciAqKSBhbGxvY2EgKHAgLSB0b2tzdGFydCArIDEpOwotCi0JICAgIG1lbWNweSAoZXJyX2NvcHksIHRva3N0YXJ0LCBwIC0gdG9rc3RhcnQpOwotCSAgICBlcnJfY29weVtwIC0gdG9rc3RhcnRdID0gMDsKLQkgICAgZXJyb3IgKCJJbnZhbGlkIG51bWJlciBcIiVzXCIuIiwgZXJyX2NvcHkpOwotCSAgfQotCWxleHB0ciA9IHA7Ci0JcmV0dXJuIHRva3R5cGU7Ci0gICAgICB9Ci0KLSAgICBjYXNlICcrJzoKLSAgICBjYXNlICctJzoKLSAgICBjYXNlICcqJzoKLSAgICBjYXNlICcvJzoKLSAgICBjYXNlICclJzoKLSAgICBjYXNlICd8JzoKLSAgICBjYXNlICcmJzoKLSAgICBjYXNlICdeJzoKLSAgICBjYXNlICd+JzoKLSAgICBjYXNlICchJzoKLSAgICBjYXNlICdAJzoKLSAgICBjYXNlICc8JzoKLSAgICBjYXNlICc+JzoKLSAgICBjYXNlICdbJzoKLSAgICBjYXNlICddJzoKLSAgICBjYXNlICc/JzoKLSAgICBjYXNlICc6JzoKLSAgICBjYXNlICc9JzoKLSAgICBjYXNlICd7JzoKLSAgICBjYXNlICd9JzoKLSAgICBzeW1ib2w6Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIHJldHVybiBjOwotCi0gICAgY2FzZSAnIic6Ci0KLSAgICAgIC8qIEJ1aWxkIHRoZSBnZGIgaW50ZXJuYWwgZm9ybSBvZiB0aGUgaW5wdXQgc3RyaW5nIGluIHRlbXBidWYsCi0JIHRyYW5zbGF0aW5nIGFueSBzdGFuZGFyZCBDIGVzY2FwZSBmb3JtcyBzZWVuLiAgTm90ZSB0aGF0IHRoZQotCSBidWZmZXIgaXMgbnVsbCBieXRlIHRlcm1pbmF0ZWQgKm9ubHkqIGZvciB0aGUgY29udmVuaWVuY2Ugb2YKLQkgZGVidWdnaW5nIGdkYiBpdHNlbGYgYW5kIHByaW50aW5nIHRoZSBidWZmZXIgY29udGVudHMgd2hlbgotCSB0aGUgYnVmZmVyIGNvbnRhaW5zIG5vIGVtYmVkZGVkIG51bGxzLiAgR2RiIGRvZXMgbm90IGRlcGVuZAotCSB1cG9uIHRoZSBidWZmZXIgYmVpbmcgbnVsbCBieXRlIHRlcm1pbmF0ZWQsIGl0IHVzZXMgdGhlIGxlbmd0aAotCSBzdHJpbmcgaW5zdGVhZC4gIFRoaXMgYWxsb3dzIGdkYiB0byBoYW5kbGUgQyBzdHJpbmdzIChhcyB3ZWxsCi0JIGFzIHN0cmluZ3MgaW4gb3RoZXIgbGFuZ3VhZ2VzKSB3aXRoIGVtYmVkZGVkIG51bGwgYnl0ZXMgKi8KLQotICAgICAgdG9rcHRyID0gKyt0b2tzdGFydDsKLSAgICAgIHRlbXBidWZpbmRleCA9IDA7Ci0KLSAgICAgIGRvIHsKLQkvKiBHcm93IHRoZSBzdGF0aWMgdGVtcCBidWZmZXIgaWYgbmVjZXNzYXJ5LCBpbmNsdWRpbmcgYWxsb2NhdGluZwotCSAgIHRoZSBmaXJzdCBvbmUgb24gZGVtYW5kLiAqLwotCWlmICh0ZW1wYnVmaW5kZXggKyAxID49IHRlbXBidWZzaXplKQotCSAgewotCSAgICB0ZW1wYnVmID0gKGNoYXIgKikgeHJlYWxsb2MgKHRlbXBidWYsIHRlbXBidWZzaXplICs9IDY0KTsKLQkgIH0KLQlzd2l0Y2ggKCp0b2twdHIpCi0JICB7Ci0JICBjYXNlICdcMCc6Ci0JICBjYXNlICciJzoKLQkgICAgLyogRG8gbm90aGluZywgbG9vcCB3aWxsIHRlcm1pbmF0ZS4gKi8KLQkgICAgYnJlYWs7Ci0JICBjYXNlICdcXCc6Ci0JICAgIHRva3B0cisrOwotCSAgICBjID0gcGFyc2VfZXNjYXBlICgmdG9rcHRyKTsKLQkgICAgaWYgKGMgPT0gLTEpCi0JICAgICAgewotCQljb250aW51ZTsKLQkgICAgICB9Ci0JICAgIHRlbXBidWZbdGVtcGJ1ZmluZGV4KytdID0gYzsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICB0ZW1wYnVmW3RlbXBidWZpbmRleCsrXSA9ICp0b2twdHIrKzsKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgICB9IHdoaWxlICgoKnRva3B0ciAhPSAnIicpICYmICgqdG9rcHRyICE9ICdcMCcpKTsKLSAgICAgIGlmICgqdG9rcHRyKysgIT0gJyInKQotCXsKLQkgIGVycm9yICgiVW50ZXJtaW5hdGVkIHN0cmluZyBpbiBleHByZXNzaW9uLiIpOwotCX0KLSAgICAgIHRlbXBidWZbdGVtcGJ1ZmluZGV4XSA9ICdcMCc7CS8qIFNlZSBub3RlIGFib3ZlICovCi0gICAgICB5eWx2YWwuc3ZhbC5wdHIgPSB0ZW1wYnVmOwotICAgICAgeXlsdmFsLnN2YWwubGVuZ3RoID0gdGVtcGJ1ZmluZGV4OwotICAgICAgbGV4cHRyID0gdG9rcHRyOwotICAgICAgcmV0dXJuIChTVFJJTkcpOwotICAgIH0KLQotICBpZiAoIShjID09ICdfJyB8fCBjID09ICckJwotCXx8IChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSkpCi0gICAgLyogV2UgbXVzdCBoYXZlIGNvbWUgYWNyb3NzIGEgYmFkIGNoYXJhY3RlciAoZS5nLiAnOycpLiAgKi8KLSAgICBlcnJvciAoIkludmFsaWQgY2hhcmFjdGVyICclYycgaW4gZXhwcmVzc2lvbi4iLCBjKTsKLQotICAvKiBJdCdzIGEgbmFtZS4gIFNlZSBob3cgbG9uZyBpdCBpcy4gICovCi0gIG5hbWVsZW4gPSAwOwotICBmb3IgKGMgPSB0b2tzdGFydFtuYW1lbGVuXTsKLSAgICAgICAoYyA9PSAnXycgfHwgYyA9PSAnJCcgfHwgKGMgPj0gJzAnICYmIGMgPD0gJzknKQotCXx8IChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB8fCBjID09ICc8Jyk7KQotICAgIHsKLSAgICAgIC8qIFRlbXBsYXRlIHBhcmFtZXRlciBsaXN0cyBhcmUgcGFydCBvZiB0aGUgbmFtZS4KLQkgRklYTUU6IFRoaXMgbWlzaGFuZGxlcyBgcHJpbnQgJGE8NCYmJGE+MycuICAqLwotCi0gICAgICBpZiAoYyA9PSAnPCcpCi0JeyAKLSAgICAgICAgICAgaWYgKGhwX3NvbV9zb21fb2JqZWN0X3ByZXNlbnQpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLyogU2NhbiBhaGVhZCB0byBnZXQgcmVzdCBvZiB0aGUgdGVtcGxhdGUgc3BlY2lmaWNhdGlvbi4gIE5vdGUKLSAgICAgICAgICAgICAgICAgIHRoYXQgd2UgbG9vayBhaGVhZCBvbmx5IHdoZW4gdGhlICc8JyBhZGpvaW5zIG5vbi13aGl0ZXNwYWNlCi0gICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzOyBmb3IgY29tcGFyaXNvbiBleHByZXNzaW9ucywgZS5nLiAiYSA8IGIgPiBjIiwKLSAgICAgICAgICAgICAgICAgIHRoZXJlIG11c3QgYmUgc3BhY2VzIGJlZm9yZSB0aGUgJzwnLCBldGMuICovCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIGNoYXIgKiBwID0gZmluZF90ZW1wbGF0ZV9uYW1lX2VuZCAodG9rc3RhcnQgKyBuYW1lbGVuKTsKLSAgICAgICAgICAgICAgIGlmIChwKQotICAgICAgICAgICAgICAgICBuYW1lbGVuID0gcCAtIHRva3N0YXJ0OwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgeyAKLQkgICAgICAgaW50IGkgPSBuYW1lbGVuOwotCSAgICAgICBpbnQgbmVzdGluZ19sZXZlbCA9IDE7Ci0JICAgICAgIHdoaWxlICh0b2tzdGFydFsrK2ldKQotCQkgewotCQkgICBpZiAodG9rc3RhcnRbaV0gPT0gJzwnKQotCQkgICAgIG5lc3RpbmdfbGV2ZWwrKzsKLQkJICAgZWxzZSBpZiAodG9rc3RhcnRbaV0gPT0gJz4nKQotCQkgICAgIHsKLQkJICAgICAgIGlmICgtLW5lc3RpbmdfbGV2ZWwgPT0gMCkKLQkJCSBicmVhazsKLQkJICAgICB9Ci0JCSB9Ci0JICAgICAgIGlmICh0b2tzdGFydFtpXSA9PSAnPicpCi0JCSBuYW1lbGVuID0gaTsKLQkgICAgICAgZWxzZQotCQkgYnJlYWs7Ci0JICAgICB9Ci0JfQotICAgICAgYyA9IHRva3N0YXJ0WysrbmFtZWxlbl07Ci0gICAgfQotCi0gIC8qIFRoZSB0b2tlbiAiaWYiIHRlcm1pbmF0ZXMgdGhlIGV4cHJlc3Npb24gYW5kIGlzIE5PVCAKLSAgICAgcmVtb3ZlZCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uICAqLwotICBpZiAobmFtZWxlbiA9PSAyICYmIHRva3N0YXJ0WzBdID09ICdpJyAmJiB0b2tzdGFydFsxXSA9PSAnZicpCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGxleHB0ciArPSBuYW1lbGVuOwotCi0gIHRyeW5hbWU6Ci0KLSAgLyogQ2F0Y2ggc3BlY2lmaWMga2V5d29yZHMuICBTaG91bGQgYmUgZG9uZSB3aXRoIGEgZGF0YSBzdHJ1Y3R1cmUuICAqLwotICBzd2l0Y2ggKG5hbWVsZW4pCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAidW5zaWduZWQiLCA4KSkKLQlyZXR1cm4gVU5TSUdORUQ7Ci0gICAgICBpZiAoY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfY3BsdXMKLQkgICYmIFNUUkVRTiAodG9rc3RhcnQsICJ0ZW1wbGF0ZSIsIDgpKQotCXJldHVybiBURU1QTEFURTsKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAidm9sYXRpbGUiLCA4KSkKLQlyZXR1cm4gVk9MQVRJTEVfS0VZV09SRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAic3RydWN0IiwgNikpCi0JcmV0dXJuIFNUUlVDVDsKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAic2lnbmVkIiwgNikpCi0JcmV0dXJuIFNJR05FRF9LRVlXT1JEOwotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJzaXplb2YiLCA2KSkgICAgICAKLQlyZXR1cm4gU0laRU9GOwotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJkb3VibGUiLCA2KSkgICAgICAKLQlyZXR1cm4gRE9VQkxFX0tFWVdPUkQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDU6Ci0gICAgICBpZiAoY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfY3BsdXMpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImZhbHNlIiwgNSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0VLRVlXT1JEOwotICAgICAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiY2xhc3MiLCA1KSkKLSAgICAgICAgICAgIHJldHVybiBDTEFTUzsKLSAgICAgICAgfQotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJ1bmlvbiIsIDUpKQotCXJldHVybiBVTklPTjsKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAic2hvcnQiLCA1KSkKLQlyZXR1cm4gU0hPUlQ7Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImNvbnN0IiwgNSkpCi0JcmV0dXJuIENPTlNUX0tFWVdPUkQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImVudW0iLCA0KSkKLQlyZXR1cm4gRU5VTTsKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAibG9uZyIsIDQpKQotCXJldHVybiBMT05HOwotICAgICAgaWYgKGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2xhbmd1YWdlID09IGxhbmd1YWdlX2NwbHVzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAidHJ1ZSIsIDQpKQotICAgICAgICAgICAgICByZXR1cm4gVFJVRUtFWVdPUkQ7Ci0KLSAgICAgICAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAidGhpcyIsIDQpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdGhpc19uYW1lW10gPQotICAgICAgICAgICAgICAgIHsgQ1BMVVNfTUFSS0VSLCAndCcsICdoJywgJ2knLCAncycsICdcMCcgfTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobG9va3VwX3N5bWJvbCAodGhpc19uYW1lLCBleHByZXNzaW9uX2NvbnRleHRfYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9OQU1FU1BBQ0UsIChpbnQgKikgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpKQotICAgICAgICAgICAgICAgICAgcmV0dXJuIFRISVM7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImludCIsIDMpKQotCXJldHVybiBJTlRfS0VZV09SRDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgeXlsdmFsLnN2YWwucHRyID0gdG9rc3RhcnQ7Ci0gIHl5bHZhbC5zdmFsLmxlbmd0aCA9IG5hbWVsZW47Ci0KLSAgaWYgKCp0b2tzdGFydCA9PSAnJCcpCi0gICAgewotICAgICAgd3JpdGVfZG9sbGFyX3ZhcmlhYmxlICh5eWx2YWwuc3ZhbCk7Ci0gICAgICByZXR1cm4gVkFSSUFCTEU7Ci0gICAgfQotICAKLSAgLyogTG9vayBhaGVhZCBhbmQgc2VlIGlmIHdlIGNhbiBjb25zdW1lIG1vcmUgb2YgdGhlIGlucHV0Ci0gICAgIHN0cmluZyB0byBnZXQgYSByZWFzb25hYmxlIGNsYXNzL25hbWVzcGFjZSBzcGVjIG9yIGEKLSAgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUuICBUaGlzIGlzIGEga2x1ZGdlIHRvIGdldCBhcm91bmQgdGhlCi0gICAgIEhQIGFDQyBjb21waWxlcidzIGdlbmVyYXRpb24gb2Ygc3ltYm9sIG5hbWVzIHdpdGggZW1iZWRkZWQKLSAgICAgY29sb25zIGZvciBuYW1lc3BhY2UgYW5kIG5lc3RlZCBjbGFzc2VzLiAqLyAKLSAgaWYgKHVucXVvdGVkX2V4cHIpCi0gICAgewotICAgICAgLyogT25seSBkbyBpdCBpZiBub3QgaW5zaWRlIHNpbmdsZSBxdW90ZXMgKi8gCi0gICAgICBzeW1fY2xhc3MgPSBwYXJzZV9uZXN0ZWRfY2xhc3Nlc19mb3JfaHBhY2MgKHl5bHZhbC5zdmFsLnB0ciwgeXlsdmFsLnN2YWwubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9rZW5fc3RyaW5nLCAmY2xhc3NfcHJlZml4LCAmbGV4cHRyKTsKLSAgICAgIGlmIChzeW1fY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBSZXBsYWNlIHRoZSBjdXJyZW50IHRva2VuIHdpdGggdGhlIGJpZ2dlciBvbmUgd2UgZm91bmQgKi8gCi0gICAgICAgICAgeXlsdmFsLnN2YWwucHRyID0gdG9rZW5fc3RyaW5nOwotICAgICAgICAgIHl5bHZhbC5zdmFsLmxlbmd0aCA9IHN0cmxlbiAodG9rZW5fc3RyaW5nKTsKLSAgICAgICAgfQotICAgIH0KLSAgCi0gIC8qIFVzZSB0b2tlbi10eXBlIEJMT0NLTkFNRSBmb3Igc3ltYm9scyB0aGF0IGhhcHBlbiB0byBiZSBkZWZpbmVkIGFzCi0gICAgIGZ1bmN0aW9ucyBvciBzeW10YWJzLiAgSWYgdGhpcyBpcyBub3Qgc28sIHRoZW4gLi4uCi0gICAgIFVzZSB0b2tlbi10eXBlIFRZUEVOQU1FIGZvciBzeW1ib2xzIHRoYXQgaGFwcGVuIHRvIGJlIGRlZmluZWQKLSAgICAgY3VycmVudGx5IGFzIG5hbWVzIG9mIHR5cGVzOyBOQU1FIGZvciBvdGhlciBzeW1ib2xzLgotICAgICBUaGUgY2FsbGVyIGlzIG5vdCBjb25zdHJhaW5lZCB0byBjYXJlIGFib3V0IHRoZSBkaXN0aW5jdGlvbi4gICovCi0gIHsKLSAgICBjaGFyICp0bXAgPSBjb3B5X25hbWUgKHl5bHZhbC5zdmFsKTsKLSAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07Ci0gICAgaW50IGlzX2FfZmllbGRfb2ZfdGhpcyA9IDA7Ci0gICAgaW50IGhleHR5cGU7Ci0KLSAgICBzeW0gPSBsb29rdXBfc3ltYm9sICh0bXAsIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywKLQkJCSBWQVJfTkFNRVNQQUNFLAotCQkJIGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2xhbmd1YWdlID09IGxhbmd1YWdlX2NwbHVzCi0JCQkgPyAmaXNfYV9maWVsZF9vZl90aGlzIDogKGludCAqKSBOVUxMLAotCQkJIChzdHJ1Y3Qgc3ltdGFiICoqKSBOVUxMKTsKLSAgICAvKiBDYWxsIGxvb2t1cF9zeW10YWIsIG5vdCBsb29rdXBfcGFydGlhbF9zeW10YWIsIGluIGNhc2UgdGhlcmUgYXJlCi0gICAgICAgbm8gcHN5bXRhYnMgKGNvZmYsIHhjb2ZmLCBvciBzb21lIGZ1dHVyZSBjaGFuZ2UgdG8gYmxvdyBhd2F5IHRoZQotICAgICAgIHBzeW10YWJzIG9uY2Ugb25jZSBzeW1ib2xzIGFyZSByZWFkKS4gICovCi0gICAgaWYgKHN5bSAmJiBTWU1CT0xfQ0xBU1MgKHN5bSkgPT0gTE9DX0JMT0NLKQotICAgICAgewotCXl5bHZhbC5zc3ltLnN5bSA9IHN5bTsKLQl5eWx2YWwuc3N5bS5pc19hX2ZpZWxkX29mX3RoaXMgPSBpc19hX2ZpZWxkX29mX3RoaXM7Ci0JcmV0dXJuIEJMT0NLTkFNRTsKLSAgICAgIH0KLSAgICBlbHNlIGlmICghc3ltKQotICAgICAgewkJCQkvKiBTZWUgaWYgaXQncyBhIGZpbGUgbmFtZS4gKi8KLQlzdHJ1Y3Qgc3ltdGFiICpzeW10YWI7Ci0KLQlzeW10YWIgPSBsb29rdXBfc3ltdGFiICh0bXApOwotCi0JaWYgKHN5bXRhYikKLQkgIHsKLQkgICAgeXlsdmFsLmJ2YWwgPSBCTE9DS1ZFQ1RPUl9CTE9DSyAoQkxPQ0tWRUNUT1IgKHN5bXRhYiksIFNUQVRJQ19CTE9DSyk7Ci0JICAgIHJldHVybiBGSUxFTkFNRTsKLQkgIH0KLSAgICAgIH0KLQotICAgIGlmIChzeW0gJiYgU1lNQk9MX0NMQVNTIChzeW0pID09IExPQ19UWVBFREVGKQotICAgICAgICB7Ci0jaWYgMQotCSAgLyogRGVzcGl0ZSB0aGUgZm9sbG93aW5nIGZsYXcsIHdlIG5lZWQgdG8ga2VlcCB0aGlzIGNvZGUgZW5hYmxlZC4KLQkgICAgIEJlY2F1c2Ugd2UgY2FuIGdldCBjYWxsZWQgZnJvbSBjaGVja19zdHViX21ldGhvZCwgaWYgd2UgZG9uJ3QKLQkgICAgIGhhbmRsZSBuZXN0ZWQgdHlwZXMgdGhlbiBpdCBzY3Jld3MgbWFueSBvcGVyYXRpb25zIGluIGFueQotCSAgICAgcHJvZ3JhbSB3aGljaCB1c2VzIG5lc3RlZCB0eXBlcy4gICovCi0JICAvKiBJbiAiQTo6eCIsIGlmIHggaXMgYSBtZW1iZXIgZnVuY3Rpb24gb2YgQSBhbmQgdGhlcmUgaGFwcGVucwotCSAgICAgdG8gYmUgYSB0eXBlIChuZXN0ZWQgb3Igbm90LCBzaW5jZSB0aGUgc3RhYnMgZG9uJ3QgbWFrZSB0aGF0Ci0JICAgICBkaXN0aW5jdGlvbikgbmFtZWQgeCwgdGhlbiB0aGlzIGNvZGUgaW5jb3JyZWN0bHkgdGhpbmtzIHdlCi0JICAgICBhcmUgZGVhbGluZyB3aXRoIG5lc3RlZCB0eXBlcyByYXRoZXIgdGhhbiBhIG1lbWJlciBmdW5jdGlvbi4gICovCi0KLQkgIGNoYXIgKnA7Ci0JICBjaGFyICpuYW1lc3RhcnQ7Ci0JICBzdHJ1Y3Qgc3ltYm9sICpiZXN0X3N5bTsKLQotCSAgLyogTG9vayBhaGVhZCB0byBkZXRlY3QgbmVzdGVkIHR5cGVzLiAgVGhpcyBwcm9iYWJseSBzaG91bGQgYmUKLQkgICAgIGRvbmUgaW4gdGhlIGdyYW1tYXIsIGJ1dCB0cnlpbmcgc2VlbWVkIHRvIGludHJvZHVjZSBhIGxvdAotCSAgICAgb2Ygc2hpZnQvcmVkdWNlIGFuZCByZWR1Y2UvcmVkdWNlIGNvbmZsaWN0cy4gIEl0J3MgcG9zc2libGUKLQkgICAgIHRoYXQgaXQgY291bGQgYmUgZG9uZSwgdGhvdWdoLiAgT3IgcGVyaGFwcyBhIG5vbi1ncmFtbWFyLCBidXQKLQkgICAgIGxlc3MgYWQgaG9jLCBhcHByb2FjaCB3b3VsZCB3b3JrIHdlbGwuICAqLwotCi0JICAvKiBTaW5jZSB3ZSBkbyBub3QgY3VycmVudGx5IGhhdmUgYW55IHdheSBvZiBkaXN0aW5ndWlzaGluZwotCSAgICAgYSBuZXN0ZWQgdHlwZSBmcm9tIGEgbm9uLW5lc3RlZCBvbmUgKHRoZSBzdGFicyBkb24ndCB0ZWxsCi0JICAgICB1cyB3aGV0aGVyIGEgdHlwZSBpcyBuZXN0ZWQpLCB3ZSBqdXN0IGlnbm9yZSB0aGUKLQkgICAgIGNvbnRhaW5pbmcgdHlwZS4gICovCi0KLQkgIHAgPSBsZXhwdHI7Ci0JICBiZXN0X3N5bSA9IHN5bTsKLQkgIHdoaWxlICgxKQotCSAgICB7Ci0JICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLQkgICAgICB3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJ1xuJykKLQkJKytwOwotCSAgICAgIGlmICgqcCA9PSAnOicgJiYgcFsxXSA9PSAnOicpCi0JCXsKLQkJICAvKiBTa2lwIHRoZSBgOjonLiAgKi8KLQkJICBwICs9IDI7Ci0JCSAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLQkJICB3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJ1xuJykKLQkJICAgICsrcDsKLQkJICBuYW1lc3RhcnQgPSBwOwotCQkgIHdoaWxlICgqcCA9PSAnXycgfHwgKnAgPT0gJyQnIHx8ICgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKQotCQkJIHx8ICgqcCA+PSAnYScgJiYgKnAgPD0gJ3onKQotCQkJIHx8ICgqcCA+PSAnQScgJiYgKnAgPD0gJ1onKSkKLQkJICAgICsrcDsKLQkJICBpZiAocCAhPSBuYW1lc3RhcnQpCi0JCSAgICB7Ci0JCSAgICAgIHN0cnVjdCBzeW1ib2wgKmN1cl9zeW07Ci0JCSAgICAgIC8qIEFzIGJpZyBhcyB0aGUgd2hvbGUgcmVzdCBvZiB0aGUgZXhwcmVzc2lvbiwgd2hpY2ggaXMKLQkJCSBhdCBsZWFzdCBiaWcgZW5vdWdoLiAgKi8KLQkJICAgICAgY2hhciAqbmNvcHkgPSBhbGxvY2EgKHN0cmxlbiAodG1wKStzdHJsZW4gKG5hbWVzdGFydCkrMyk7Ci0JCSAgICAgIGNoYXIgKnRtcDE7Ci0KLQkJICAgICAgdG1wMSA9IG5jb3B5OwotCQkgICAgICBtZW1jcHkgKHRtcDEsIHRtcCwgc3RybGVuICh0bXApKTsKLQkJICAgICAgdG1wMSArPSBzdHJsZW4gKHRtcCk7Ci0JCSAgICAgIG1lbWNweSAodG1wMSwgIjo6IiwgMik7Ci0JCSAgICAgIHRtcDEgKz0gMjsKLQkJICAgICAgbWVtY3B5ICh0bXAxLCBuYW1lc3RhcnQsIHAgLSBuYW1lc3RhcnQpOwotCQkgICAgICB0bXAxW3AgLSBuYW1lc3RhcnRdID0gJ1wwJzsKLQkJICAgICAgY3VyX3N5bSA9IGxvb2t1cF9zeW1ib2wgKG5jb3B5LCBleHByZXNzaW9uX2NvbnRleHRfYmxvY2ssCi0JCQkJCSAgICAgICBWQVJfTkFNRVNQQUNFLCAoaW50ICopIE5VTEwsCi0JCQkJCSAgICAgICAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCk7Ci0JCSAgICAgIGlmIChjdXJfc3ltKQotCQkJewotCQkJICBpZiAoU1lNQk9MX0NMQVNTIChjdXJfc3ltKSA9PSBMT0NfVFlQRURFRikKLQkJCSAgICB7Ci0JCQkgICAgICBiZXN0X3N5bSA9IGN1cl9zeW07Ci0JCQkgICAgICBsZXhwdHIgPSBwOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIGJyZWFrOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQlicmVhazsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBicmVhazsKLQkJfQotCSAgICAgIGVsc2UKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgeXlsdmFsLnRzeW0udHlwZSA9IFNZTUJPTF9UWVBFIChiZXN0X3N5bSk7Ci0jZWxzZSAvKiBub3QgMCAqLwotCSAgeXlsdmFsLnRzeW0udHlwZSA9IFNZTUJPTF9UWVBFIChzeW0pOwotI2VuZGlmIC8qIG5vdCAwICovCi0JICByZXR1cm4gVFlQRU5BTUU7Ci0gICAgICAgIH0KLSAgICBpZiAoKHl5bHZhbC50c3ltLnR5cGUgPSBsb29rdXBfcHJpbWl0aXZlX3R5cGVuYW1lICh0bXApKSAhPSAwKQotCXJldHVybiBUWVBFTkFNRTsKLQotICAgIC8qIElucHV0IG5hbWVzIHRoYXQgYXJlbid0IHN5bWJvbHMgYnV0IEFSRSB2YWxpZCBoZXggbnVtYmVycywKLSAgICAgICB3aGVuIHRoZSBpbnB1dCByYWRpeCBwZXJtaXRzIHRoZW0sIGNhbiBiZSBuYW1lcyBvciBudW1iZXJzCi0gICAgICAgZGVwZW5kaW5nIG9uIHRoZSBwYXJzZS4gIE5vdGUgd2Ugc3VwcG9ydCByYWRpeGVzID4gMTYgaGVyZS4gICovCi0gICAgaWYgKCFzeW0gJiYgCi0gICAgICAgICgodG9rc3RhcnRbMF0gPj0gJ2EnICYmIHRva3N0YXJ0WzBdIDwgJ2EnICsgaW5wdXRfcmFkaXggLSAxMCkgfHwKLSAgICAgICAgICh0b2tzdGFydFswXSA+PSAnQScgJiYgdG9rc3RhcnRbMF0gPCAnQScgKyBpbnB1dF9yYWRpeCAtIDEwKSkpCi0gICAgICB7Ci0gCVlZU1RZUEUgbmV3bHZhbDsJLyogSXRzIHZhbHVlIGlzIGlnbm9yZWQuICAqLwotCWhleHR5cGUgPSBwYXJzZV9udW1iZXIgKHRva3N0YXJ0LCBuYW1lbGVuLCAwLCAmbmV3bHZhbCk7Ci0JaWYgKGhleHR5cGUgPT0gSU5UKQotCSAgewotCSAgICB5eWx2YWwuc3N5bS5zeW0gPSBzeW07Ci0JICAgIHl5bHZhbC5zc3ltLmlzX2FfZmllbGRfb2ZfdGhpcyA9IGlzX2FfZmllbGRfb2ZfdGhpczsKLQkgICAgcmV0dXJuIE5BTUVfT1JfSU5UOwotCSAgfQotICAgICAgfQotCi0gICAgLyogQW55IG90aGVyIGtpbmQgb2Ygc3ltYm9sICovCi0gICAgeXlsdmFsLnNzeW0uc3ltID0gc3ltOwotICAgIHl5bHZhbC5zc3ltLmlzX2FfZmllbGRfb2ZfdGhpcyA9IGlzX2FfZmllbGRfb2ZfdGhpczsKLSAgICByZXR1cm4gTkFNRTsKLSAgfQotfQotCi12b2lkCi15eWVycm9yIChtc2cpCi0gICAgIGNoYXIgKm1zZzsKLXsKLSAgZXJyb3IgKCJBICVzIGluIGV4cHJlc3Npb24sIG5lYXIgYCVzJy4iLCAobXNnID8gbXNnIDogImVycm9yIiksIGxleHB0cik7Ci19CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvd2luZG93cy5taCBiL2dkYi9jb25maWcvaTM4Ni93aW5kb3dzLm1oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTMzYTZlLi4wMDAwMDAwCi0tLSBhL2dkYi9jb25maWcvaTM4Ni93aW5kb3dzLm1oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBnZGJ3aW4ubyBhbmQgc2VyLXdpbjMycy5jIGhhdmUgdG8gYmUgbmFtZWQgYmVjYXVzZSB0aGV5IGhhdmUKLSMgICBfaW5pdGlhbGl6ZSBmdW5jdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGZvdW5kIGJ5IGluaXQuYwotIyBndWkub3JlcyBoYXMgdG8gYmUgbmFtZWQsIG9yIGVsc2UgbXN2YyB3b24ndCBsaW5rIGl0IGluLgotWERFUEZJTEVTID0gXAotCW1zd2luL2dkYndpbi5vIFwKLQltc3dpbi9zZXItd2luMzJzLm8gXAotCW1zd2luL2d1aS5vcmVzIFwKLQltc3dpbi9saWJ3aW5nZGIuYQotCi0kKFhERVBGSUxFUyk6Ci0Jcm9vdG1lPWBwd2RgIDsgZXhwb3J0IHJvb3RtZSA7IFwKLQkoIGNkIG1zd2luIDsgXAotCSAgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGFsbCApCi0KLVhNX0ZJTEU9eG0td2luZG93cy5oCi1NTUFMTE9DPQotU0VSX0hBUkRXSVJFID0KZGlmZiAtLWdpdCBhL2dkYi9kb2MvR0RCdm4udGV4aSBiL2dkYi9kb2MvR0RCdm4udGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ3MjJiZC4uMDAwMDAwMAotLS0gYS9nZGIvZG9jL0dEQnZuLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1Ac2V0IEdEQlZOIDQuMTgKZGlmZiAtLWdpdCBhL2dkYi9mLWV4cC50YWIuYyBiL2dkYi9mLWV4cC50YWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3ZDI1ZS4uMDAwMDAwMAotLS0gYS9nZGIvZi1leHAudGFiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDg2ICswLDAgQEAKLQotLyogIEEgQmlzb24gcGFyc2VyLCBtYWRlIGZyb20gZi1leHAueQotIGJ5ICBHTlUgQmlzb24gdmVyc2lvbiAxLjI1Ci0gICovCi0KLSNkZWZpbmUgWVlCSVNPTiAxICAvKiBJZGVudGlmeSBCaXNvbiBvdXRwdXQuICAqLwotCi0jZGVmaW5lCUlOVAkyNTgKLSNkZWZpbmUJRkxPQVQJMjU5Ci0jZGVmaW5lCVNUUklOR19MSVRFUkFMCTI2MAotI2RlZmluZQlCT09MRUFOX0xJVEVSQUwJMjYxCi0jZGVmaW5lCU5BTUUJMjYyCi0jZGVmaW5lCVRZUEVOQU1FCTI2MwotI2RlZmluZQlOQU1FX09SX0lOVAkyNjQKLSNkZWZpbmUJU0laRU9GCTI2NQotI2RlZmluZQlFUlJPUgkyNjYKLSNkZWZpbmUJSU5UX0tFWVdPUkQJMjY3Ci0jZGVmaW5lCUlOVF9TMl9LRVlXT1JECTI2OAotI2RlZmluZQlMT0dJQ0FMX1MxX0tFWVdPUkQJMjY5Ci0jZGVmaW5lCUxPR0lDQUxfUzJfS0VZV09SRAkyNzAKLSNkZWZpbmUJTE9HSUNBTF9LRVlXT1JECTI3MQotI2RlZmluZQlSRUFMX0tFWVdPUkQJMjcyCi0jZGVmaW5lCVJFQUxfUzhfS0VZV09SRAkyNzMKLSNkZWZpbmUJUkVBTF9TMTZfS0VZV09SRAkyNzQKLSNkZWZpbmUJQ09NUExFWF9TOF9LRVlXT1JECTI3NQotI2RlZmluZQlDT01QTEVYX1MxNl9LRVlXT1JECTI3NgotI2RlZmluZQlDT01QTEVYX1MzMl9LRVlXT1JECTI3NwotI2RlZmluZQlCT09MX0FORAkyNzgKLSNkZWZpbmUJQk9PTF9PUgkyNzkKLSNkZWZpbmUJQk9PTF9OT1QJMjgwCi0jZGVmaW5lCUNIQVJBQ1RFUgkyODEKLSNkZWZpbmUJVkFSSUFCTEUJMjgyCi0jZGVmaW5lCUFTU0lHTl9NT0RJRlkJMjgzCi0jZGVmaW5lCUFCT1ZFX0NPTU1BCTI4NAotI2RlZmluZQlFUVVBTAkyODUKLSNkZWZpbmUJTk9URVFVQUwJMjg2Ci0jZGVmaW5lCUxFU1NUSEFOCTI4NwotI2RlZmluZQlHUkVBVEVSVEhBTgkyODgKLSNkZWZpbmUJTEVRCTI4OQotI2RlZmluZQlHRVEJMjkwCi0jZGVmaW5lCUxTSAkyOTEKLSNkZWZpbmUJUlNICTI5MgotI2RlZmluZQlVTkFSWQkyOTMKLQotI2xpbmUgNDMgImYtZXhwLnkiCi0KLQotI2luY2x1ZGUgImRlZnMuaCIKLSNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCi0jaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgotI2luY2x1ZGUgInZhbHVlLmgiCi0jaW5jbHVkZSAicGFyc2VyLWRlZnMuaCIKLSNpbmNsdWRlICJsYW5ndWFnZS5oIgotI2luY2x1ZGUgImYtbGFuZy5oIgotI2luY2x1ZGUgImJmZC5oIiAvKiBSZXF1aXJlZCBieSBvYmpmaWxlcy5oLiAgKi8KLSNpbmNsdWRlICJzeW1maWxlLmgiIC8qIFJlcXVpcmVkIGJ5IG9iamZpbGVzLmguICAqLwotI2luY2x1ZGUgIm9iamZpbGVzLmgiIC8qIEZvciBoYXZlX2Z1bGxfc3ltYm9scyBhbmQgaGF2ZV9wYXJ0aWFsX3N5bWJvbHMgKi8KLQotLyogUmVtYXAgbm9ybWFsIHlhY2MgcGFyc2VyIGludGVyZmFjZSBuYW1lcyAoeXlwYXJzZSwgeXlsZXgsIHl5ZXJyb3IsIGV0YyksCi0gICBhcyB3ZWxsIGFzIGdyYXR1aXRpb3VzbHkgZ2xvYmFsIHN5bWJvbCBuYW1lcywgc28gd2UgY2FuIGhhdmUgbXVsdGlwbGUKLSAgIHlhY2MgZ2VuZXJhdGVkIHBhcnNlcnMgaW4gZ2RiLiAgTm90ZSB0aGF0IHRoZXNlIGFyZSBvbmx5IHRoZSB2YXJpYWJsZXMKLSAgIHByb2R1Y2VkIGJ5IHlhY2MuICBJZiBvdGhlciBwYXJzZXIgZ2VuZXJhdG9ycyAoYmlzb24sIGJ5YWNjLCBldGMpIHByb2R1Y2UKLSAgIGFkZGl0aW9uYWwgZ2xvYmFsIG5hbWVzIHRoYXQgY29uZmxpY3QgYXQgbGluayB0aW1lLCB0aGVuIHRob3NlIHBhcnNlcgotICAgZ2VuZXJhdG9ycyBuZWVkIHRvIGJlIGZpeGVkIGluc3RlYWQgb2YgYWRkaW5nIHRob3NlIG5hbWVzIHRvIHRoaXMgbGlzdC4gKi8KLQotI2RlZmluZQl5eW1heGRlcHRoIGZfbWF4ZGVwdGgKLSNkZWZpbmUJeXlwYXJzZQlmX3BhcnNlCi0jZGVmaW5lCXl5bGV4CWZfbGV4Ci0jZGVmaW5lCXl5ZXJyb3IJZl9lcnJvcgotI2RlZmluZQl5eWx2YWwJZl9sdmFsCi0jZGVmaW5lCXl5Y2hhcglmX2NoYXIKLSNkZWZpbmUJeXlkZWJ1ZwlmX2RlYnVnCi0jZGVmaW5lCXl5cGFjdAlmX3BhY3QJCi0jZGVmaW5lCXl5cjEJZl9yMQkJCQotI2RlZmluZQl5eXIyCWZfcjIJCQkKLSNkZWZpbmUJeXlkZWYJZl9kZWYJCQotI2RlZmluZQl5eWNoawlmX2NoawkJCi0jZGVmaW5lCXl5cGdvCWZfcGdvCQkKLSNkZWZpbmUJeXlhY3QJZl9hY3QJCQotI2RlZmluZQl5eWV4Y2EJZl9leGNhCi0jZGVmaW5lIHl5ZXJyZmxhZyBmX2VycmZsYWcKLSNkZWZpbmUgeXluZXJycwlmX25lcnJzCi0jZGVmaW5lCXl5cHMJZl9wcwotI2RlZmluZQl5eXB2CWZfcHYKLSNkZWZpbmUJeXlzCWZfcwotI2RlZmluZQl5eV95eXMJZl95eXMKLSNkZWZpbmUJeXlzdGF0ZQlmX3N0YXRlCi0jZGVmaW5lCXl5dG1wCWZfdG1wCi0jZGVmaW5lCXl5dglmX3YKLSNkZWZpbmUJeXlfeXl2CWZfeXl2Ci0jZGVmaW5lCXl5dmFsCWZfdmFsCi0jZGVmaW5lCXl5bGxvYwlmX2xsb2MKLSNkZWZpbmUgeXlyZWRzCWZfcmVkcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KLSNkZWZpbmUgeXl0b2tzCWZfdG9rcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KLSNkZWZpbmUgeXlsaHMJZl95eWxocwotI2RlZmluZSB5eWxlbglmX3l5bGVuCi0jZGVmaW5lIHl5ZGVmcmVkIGZfeXlkZWZyZWQKLSNkZWZpbmUgeXlkZ290bwlmX3l5ZGdvdG8KLSNkZWZpbmUgeXlzaW5kZXggZl95eXNpbmRleAotI2RlZmluZSB5eXJpbmRleCBmX3l5cmluZGV4Ci0jZGVmaW5lIHl5Z2luZGV4IGZfeXlnaW5kZXgKLSNkZWZpbmUgeXl0YWJsZQkgZl95eXRhYmxlCi0jZGVmaW5lIHl5Y2hlY2sJIGZfeXljaGVjawotCi0jaWZuZGVmIFlZREVCVUcKLSNkZWZpbmUJWVlERUJVRwkxCQkvKiBEZWZhdWx0IHRvIG5vIHl5ZGVidWcgc3VwcG9ydCAqLwotI2VuZGlmCi0KLWludCB5eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGludCB5eWxleCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQgeXllcnJvciBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIHZvaWQgZ3Jvd2J1Zl9ieV9zaXplIFBBUkFNUyAoKGludCkpOwotCi1zdGF0aWMgaW50IG1hdGNoX3N0cmluZ19saXRlcmFsIFBBUkFNUyAoKHZvaWQpKTsKLQotCi0jbGluZSAxMjIgImYtZXhwLnkiCi10eXBlZGVmIHVuaW9uCi0gIHsKLSAgICBMT05HRVNUIGx2YWw7Ci0gICAgc3RydWN0IHsKLSAgICAgIExPTkdFU1QgdmFsOwotICAgICAgc3RydWN0IHR5cGUgKnR5cGU7Ci0gICAgfSB0eXBlZF92YWw7Ci0gICAgRE9VQkxFU1QgZHZhbDsKLSAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07Ci0gICAgc3RydWN0IHR5cGUgKnR2YWw7Ci0gICAgc3RydWN0IHN0b2tlbiBzdmFsOwotICAgIHN0cnVjdCB0dHlwZSB0c3ltOwotICAgIHN0cnVjdCBzeW10b2tlbiBzc3ltOwotICAgIGludCB2b2lkdmFsOwotICAgIHN0cnVjdCBibG9jayAqYnZhbDsKLSAgICBlbnVtIGV4cF9vcGNvZGUgb3Bjb2RlOwotICAgIHN0cnVjdCBpbnRlcm5hbHZhciAqaXZhcjsKLQotICAgIHN0cnVjdCB0eXBlICoqdHZlYzsKLSAgICBpbnQgKml2ZWM7Ci0gIH0gWVlTVFlQRTsKLSNsaW5lIDE0NCAiZi1leHAueSIKLQotLyogWVlTVFlQRSBnZXRzIGRlZmluZWQgYnkgJXVuaW9uICovCi1zdGF0aWMgaW50IHBhcnNlX251bWJlciBQQVJBTVMgKChjaGFyICosIGludCwgaW50LCBZWVNUWVBFICopKTsKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi0jaWZuZGVmIF9fU1REQ19fCi0jZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLSNlbmRpZgotCi0KLQotI2RlZmluZQlZWUZJTkFMCQkxMjUKLSNkZWZpbmUJWVlGTEFHCQktMzI3NjgKLSNkZWZpbmUJWVlOVEJBU0UJNTUKLQotI2RlZmluZSBZWVRSQU5TTEFURSh4KSAoKHVuc2lnbmVkKSh4KSA8PSAyOTMgPyB5eXRyYW5zbGF0ZVt4XSA6IDcxKQotCi1zdGF0aWMgY29uc3QgY2hhciB5eXRyYW5zbGF0ZVtdID0geyAgICAgMCwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICA0OSwgICAgMzUsICAgICAyLCAgICA1MSwKLSAgICA1MiwgICAgNDcsICAgIDQ1LCAgICAyOSwgICAgNDYsICAgICAyLCAgICA0OCwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgNTQsICAgICAyLCAgICAgMiwKLSAgICAzMSwgICAgIDIsICAgIDMyLCAgICA0NCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAzNCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAzMywgICAgIDIsICAgIDUzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNSwKLSAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwKLSAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwKLSAgICAyNiwgICAgMjcsICAgIDI4LCAgICAzMCwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwKLSAgICA0MiwgICAgNDMsICAgIDUwCi19OwotCi0jaWYgWVlERUJVRyAhPSAwCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlwcmhzW10gPSB7ICAgICAwLAotICAgICAwLCAgICAgMiwgICAgIDQsICAgICA2LCAgICAxMCwgICAgMTMsICAgIDE2LCAgICAxOSwgICAgMjIsICAgIDI1LAotICAgIDI4LCAgICAyOSwgICAgMzUsICAgIDM2LCAgICAzOCwgICAgNDAsICAgIDQ0LCAgICA0OCwgICAgNTIsICAgIDU2LAotICAgIDYxLCAgICA2NSwgICAgNjksICAgIDczLCAgICA3NywgICAgODEsICAgIDg1LCAgICA4OSwgICAgOTMsICAgIDk3LAotICAgMTAxLCAgIDEwNSwgICAxMDksICAgMTEzLCAgIDExNywgICAxMjEsICAgMTI1LCAgIDEyOSwgICAxMzMsICAgMTM3LAotICAgMTQxLCAgIDE0NSwgICAxNDcsICAgMTQ5LCAgIDE1MSwgICAxNTMsICAgMTU1LCAgIDE2MCwgICAxNjIsICAgMTY0LAotICAgMTY2LCAgIDE2OCwgICAxNzAsICAgMTczLCAgIDE3NSwgICAxNzgsICAgMTgwLCAgIDE4MywgICAxODUsICAgMTg5LAotICAgMTkyLCAgIDE5NCwgICAxOTcsICAgMjAxLCAgIDIwMywgICAyMDUsICAgMjA3LCAgIDIwOSwgICAyMTEsICAgMjEzLAotICAgMjE1LCAgIDIxNywgICAyMTksICAgMjIxLCAgIDIyMywgICAyMjUsICAgMjI3LCAgIDIyOSwgICAyMzEsICAgMjM1LAotICAgMjM3LCAgIDIzOSwgICAyNDEKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXJoc1tdID0geyAgICA1NywKLSAgICAgMCwgICAgNTYsICAgICAwLCAgICA2MywgICAgIDAsICAgIDUxLCAgICA1NywgICAgNTIsICAgICAwLCAgICA0NywKLSAgICA1NywgICAgIDAsICAgIDM1LCAgICA1NywgICAgIDAsICAgIDQ2LCAgICA1NywgICAgIDAsICAgIDI1LCAgICA1NywKLSAgICAgMCwgICAgNTMsICAgIDU3LCAgICAgMCwgICAgMTAsICAgIDU3LCAgICAgMCwgICAgIDAsICAgIDU3LCAgICA1MSwKLSAgICA1OCwgICAgNTksICAgIDUyLCAgICAgMCwgICAgIDAsICAgIDU3LCAgICAgMCwgICAgNjAsICAgICAwLCAgICA1OSwKLSAgICAyOSwgICAgNTcsICAgICAwLCAgICA1NywgICAgNTQsICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDI5LCAgICA1NywKLSAgICAgMCwgICAgNTEsICAgIDYxLCAgICA1MiwgICAgIDAsICAgIDUxLCAgICA2MywgICAgNTIsICAgIDU3LCAgICAgMCwKLSAgICA1NywgICAgNDQsICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDQ3LCAgICA1NywgICAgIDAsICAgIDU3LCAgICA0OCwKLSAgICA1NywgICAgIDAsICAgIDU3LCAgICA0OSwgICAgNTcsICAgICAwLCAgICA1NywgICAgNDUsICAgIDU3LCAgICAgMCwKLSAgICA1NywgICAgNDYsICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDQyLCAgICA1NywgICAgIDAsICAgIDU3LCAgICA0MywKLSAgICA1NywgICAgIDAsICAgIDU3LCAgICAzNiwgICAgNTcsICAgICAwLCAgICA1NywgICAgMzcsICAgIDU3LCAgICAgMCwKLSAgICA1NywgICAgNDAsICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDQxLCAgICA1NywgICAgIDAsICAgIDU3LCAgICAzOCwKLSAgICA1NywgICAgIDAsICAgIDU3LCAgICAzOSwgICAgNTcsICAgICAwLCAgICA1NywgICAgMzUsICAgIDU3LCAgICAgMCwKLSAgICA1NywgICAgMzQsICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDMzLCAgICA1NywgICAgIDAsICAgIDU3LCAgICAyMywKLSAgICA1NywgICAgIDAsICAgIDU3LCAgICAyNCwgICAgNTcsICAgICAwLCAgICA1NywgICAgMzEsICAgIDU3LCAgICAgMCwKLSAgICA1NywgICAgMjgsICAgIDU3LCAgICAgMCwgICAgIDMsICAgICAwLCAgICAgOSwgICAgIDAsICAgICA0LCAgICAgMCwKLSAgICA2MiwgICAgIDAsICAgIDI3LCAgICAgMCwgICAgMTAsICAgIDUxLCAgICA2MywgICAgNTIsICAgICAwLCAgICAgNiwKLSAgICAgMCwgICAgIDUsICAgICAwLCAgICA3MCwgICAgIDAsICAgIDY0LCAgICAgMCwgICAgNjgsICAgICAwLCAgICA2OCwKLSAgICA2NSwgICAgIDAsICAgIDQ3LCAgICAgMCwgICAgNDcsICAgIDY1LCAgICAgMCwgICAgMzUsICAgICAwLCAgICAzNSwKLSAgICA2NSwgICAgIDAsICAgIDY2LCAgICAgMCwgICAgNTEsICAgIDY1LCAgICA1MiwgICAgIDAsICAgIDY2LCAgICA2NywKLSAgICAgMCwgICAgNjcsICAgICAwLCAgICA1MSwgICAgNTIsICAgICAwLCAgICA1MSwgICAgNjksICAgIDUyLCAgICAgMCwKLSAgICAgOCwgICAgIDAsICAgIDEyLCAgICAgMCwgICAgMTMsICAgICAwLCAgICAyNiwgICAgIDAsICAgIDE2LCAgICAgMCwKLSAgICAxNSwgICAgIDAsICAgIDE0LCAgICAgMCwgICAgMTcsICAgICAwLCAgICAxOCwgICAgIDAsICAgIDE5LCAgICAgMCwKLSAgICAyMCwgICAgIDAsICAgIDIxLCAgICAgMCwgICAgMjIsICAgICAwLCAgICAgOCwgICAgIDAsICAgIDYzLCAgICAgMCwKLSAgICA2OSwgICAgMjksICAgIDYzLCAgICAgMCwgICAgIDcsICAgICAwLCAgICAgOCwgICAgIDAsICAgICA5LCAgICAgMCwKLSAgICAgNywgICAgIDAKLX07Ci0KLSNlbmRpZgotCi0jaWYgWVlERUJVRyAhPSAwCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlybGluZVtdID0geyAwLAotICAgMjIxLCAgIDIyMiwgICAyMjUsICAgMjMxLCAgIDIzNiwgICAyMzksICAgMjQyLCAgIDI0NiwgICAyNTAsICAgMjU0LAotICAgMjYzLCAgIDI2NSwgICAyNzEsICAgMjc0LCAgIDI3OCwgICAyODEsICAgMjg1LCAgIDI5MCwgICAyOTQsICAgMjk4LAotICAgMzA2LCAgIDMxMCwgICAzMTQsICAgMzE4LCAgIDMyMiwgICAzMjYsICAgMzMwLCAgIDMzNCwgICAzMzgsICAgMzQyLAotICAgMzQ2LCAgIDM1MCwgICAzNTQsICAgMzU4LCAgIDM2MiwgICAzNjYsICAgMzcwLCAgIDM3NCwgICAzNzksICAgMzgzLAotICAgMzg3LCAgIDM5MywgICA0MDAsICAgNDA5LCAgIDQxNiwgICA0MTksICAgNDIyLCAgIDQzMCwgICA0MzcsICAgNDQ1LAotICAgNDg5LCAgIDQ5MiwgICA0OTMsICAgNTM2LCAgIDUzOCwgICA1NDAsICAgNTQyLCAgIDU0NCwgICA1NDcsICAgNTQ5LAotICAgNTUxLCAgIDU1NSwgICA1NTcsICAgNTYyLCAgIDU2NCwgICA1NjYsICAgNTY4LCAgIDU3MCwgICA1NzIsICAgNTc0LAotICAgNTc2LCAgIDU3OCwgICA1ODAsICAgNTgyLCAgIDU4NCwgICA1ODYsICAgNTkwLCAgIDU5NCwgICA1OTksICAgNjA2LAotICAgNjA4LCAgIDYxMCwgICA2MTQKLX07Ci0jZW5kaWYKLQotCi0jaWYgWVlERUJVRyAhPSAwIHx8IGRlZmluZWQgKFlZRVJST1JfVkVSQk9TRSkKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB5eXRuYW1lW10gPSB7ICAgIiQiLCJlcnJvciIsIiR1bmRlZmluZWQuIiwiSU5UIiwiRkxPQVQiLAotIlNUUklOR19MSVRFUkFMIiwiQk9PTEVBTl9MSVRFUkFMIiwiTkFNRSIsIlRZUEVOQU1FIiwiTkFNRV9PUl9JTlQiLCJTSVpFT0YiLAotIkVSUk9SIiwiSU5UX0tFWVdPUkQiLCJJTlRfUzJfS0VZV09SRCIsIkxPR0lDQUxfUzFfS0VZV09SRCIsIkxPR0lDQUxfUzJfS0VZV09SRCIsCi0iTE9HSUNBTF9LRVlXT1JEIiwiUkVBTF9LRVlXT1JEIiwiUkVBTF9TOF9LRVlXT1JEIiwiUkVBTF9TMTZfS0VZV09SRCIsIkNPTVBMRVhfUzhfS0VZV09SRCIsCi0iQ09NUExFWF9TMTZfS0VZV09SRCIsIkNPTVBMRVhfUzMyX0tFWVdPUkQiLCJCT09MX0FORCIsIkJPT0xfT1IiLCJCT09MX05PVCIsCi0iQ0hBUkFDVEVSIiwiVkFSSUFCTEUiLCJBU1NJR05fTU9ESUZZIiwiJywnIiwiQUJPVkVfQ09NTUEiLCInPSciLCInPyciLCInfCciLAotIideJyIsIicmJyIsIkVRVUFMIiwiTk9URVFVQUwiLCJMRVNTVEhBTiIsIkdSRUFURVJUSEFOIiwiTEVRIiwiR0VRIiwiTFNIIiwiUlNIIiwKLSInQCciLCInKyciLCInLSciLCInKiciLCInLyciLCInJSciLCJVTkFSWSIsIicoJyIsIicpJyIsIid+JyIsIic6JyIsInN0YXJ0IiwKLSJ0eXBlX2V4cCIsImV4cCIsIkAxIiwiYXJnbGlzdCIsInN1YnN0cmluZyIsImNvbXBsZXhudW0iLCJ2YXJpYWJsZSIsInR5cGUiLCJwdHlwZSIsCi0iYWJzX2RlY2wiLCJkaXJlY3RfYWJzX2RlY2wiLCJmdW5jX21vZCIsInR5cGViYXNlIiwibm9uZW1wdHlfdHlwZWxpc3QiLCJuYW1lX25vdF90eXBlbmFtZSIsIE5VTEwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cjFbXSA9IHsgICAgIDAsCi0gICAgNTUsICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsCi0gICAgNTgsICAgIDU3LCAgICA1OSwgICAgNTksICAgIDU5LCAgICA1OSwgICAgNjAsICAgIDYxLCAgICA1NywgICAgNTcsCi0gICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsCi0gICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsCi0gICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNjIsCi0gICAgNjMsICAgIDY0LCAgICA2NCwgICAgNjUsICAgIDY1LCAgICA2NSwgICAgNjUsICAgIDY1LCAgICA2NiwgICAgNjYsCi0gICAgNjYsICAgIDY3LCAgICA2NywgICAgNjgsICAgIDY4LCAgICA2OCwgICAgNjgsICAgIDY4LCAgICA2OCwgICAgNjgsCi0gICAgNjgsICAgIDY4LCAgICA2OCwgICAgNjgsICAgIDY4LCAgICA2OCwgICAgLTEsICAgIDY5LCAgICA2OSwgICAgLTEsCi0gICAgLTEsICAgIC0xLCAgICA3MAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cjJbXSA9IHsgICAgIDAsCi0gICAgIDEsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDAsICAgICA1LCAgICAgMCwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDQsCi0gICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsCi0gICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsCi0gICAgIDMsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDQsICAgICAxLCAgICAgMSwgICAgIDEsCi0gICAgIDEsICAgICAxLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAxLCAgICAgMywgICAgIDIsCi0gICAgIDEsICAgICAyLCAgICAgMywgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCi0gICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDEsCi0gICAgIDEsICAgICAxLCAgICAgMQotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5ZGVmYWN0W10gPSB7ICAgICAwLAotICAgIDQyLCAgICA0NCwgICAgNDksICAgIDQ4LCAgICA4MywgICAgNjQsICAgIDQzLCAgICAgMCwgICAgNjUsICAgIDY2LAotICAgIDcwLCAgICA2OSwgICAgNjgsICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLAotICAgIDY3LCAgICA0NiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMiwgICAgIDEsICAgIDQ1LAotICAgICAzLCAgICA1MSwgICAgNTIsICAgIDUwLCAgICAgMCwgICAgMTAsICAgICA4LCAgICAgNiwgICAgIDcsICAgICA1LAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICA5LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTEsICAgIDU2LCAgICA1NCwgICAgIDAsICAgIDUzLAotICAgIDU4LCAgICA2MSwgICAgIDAsICAgICAwLCAgICAgNCwgICAgMTksICAgICAwLCAgICAzOCwgICAgMzksICAgIDQxLAotICAgIDQwLCAgICAzNywgICAgMzYsICAgIDM1LCAgICAyOSwgICAgMzAsICAgIDMzLCAgICAzNCwgICAgMzEsICAgIDMyLAotICAgIDI3LCAgICAyOCwgICAgMjEsICAgIDI1LCAgICAyNiwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMTMsICAgIDU3LAotICAgIDU1LCAgICA2MiwgICAgNzgsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDYwLCAgICA0NywgICAgMTgsICAgIDIwLAotICAgIDE0LCAgICAgMCwgICAgMTUsICAgIDU5LCAgICAgMCwgICAgNjMsICAgICAwLCAgICAgMCwgICAgMTIsICAgIDc5LAotICAgIDE3LCAgICAxNiwgICAgIDAsICAgICAwLCAgICAgMAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5ZGVmZ290b1tdID0geyAgIDEyMywKLSAgICAyOCwgICAgNDEsICAgIDk5LCAgIDExMiwgICAxMTMsICAgIDQyLCAgICAzMCwgICAxMDMsICAgIDMyLCAgICA3MCwKLSAgICA3MSwgICAgNzIsICAgIDMzLCAgIDEwNSwgICAgMzQKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXBhY3RbXSA9IHsgICAgNzUsCi0tMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgMTI2LC0zMjc2OCwtMzI3NjgsCi0tMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAxMzUsCi0tMzI3NjgsLTMyNzY4LCAgIDEzNSwgICAxMzUsICAgMTM1LCAgICA3NSwgICAxMzUsLTMyNzY4LCAgIDMwOSwtMzI3NjgsCi0tMzI3NjgsLTMyNzY4LCAgIC0zNCwtMzI3NjgsICAgIDc1LCAgIC00OSwgICAtNDksICAgLTQ5LCAgIC00OSwgICAtNDksCi0gICAyNzksICAgLTQ2LCAgIC00NSwgICAtNDksICAgMTM1LCAgIDEzNSwgICAxMzUsICAgMTM1LCAgIDEzNSwgICAxMzUsCi0gICAxMzUsICAgMTM1LCAgIDEzNSwgICAxMzUsICAgMTM1LCAgIDEzNSwgICAxMzUsICAgMTM1LCAgIDEzNSwgICAxMzUsCi0gICAxMzUsICAgMTM1LCAgIDEzNSwgICAxMzUsICAgMTM1LC0zMjc2OCwgICAtMzQsICAgLTM0LCAgIDIwNiwtMzI3NjgsCi0gICAtNDIsLTMyNzY4LCAgIC0zNiwgICAxMzUsLTMyNzY4LC0zMjc2OCwgICAxMzUsICAgMzU1LCAgIDMzNiwgICAzMDksCi0gICAzMDksICAgMzkwLCAgIDQwNywgICAxNjEsICAgMjIxLCAgIDIyMSwgICAtMTEsICAgLTExLCAgIC0xMSwgICAtMTEsCi0gICAgMjIsICAgIDIyLCAgICA1OCwgICAtMzcsICAgLTM3LCAgIC00OSwgICAtNDksICAgLTQ5LCAgIDEzNSwtMzI3NjgsCi0tMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAtMzMsICAgLTI2LCAgIDIzMCwtMzI3NjgsICAgMTg2LCAgIDMwOSwgICAtNDksCi0gICAyNTAsICAgLTI0LC0zMjc2OCwtMzI3NjgsICAgMzk3LC0zMjc2OCwgICAxMzUsICAgMTM1LC0zMjc2OCwtMzI3NjgsCi0gICAzMDksICAgMzA5LCAgICAxNSwgICAgMTgsLTMyNzY4Ci19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlwZ290b1tdID0gey0zMjc2OCwKLS0zMjc2OCwgICAgIDAsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAgIDQsLTMyNzY4LCAgIC0yNSwKLS0zMjc2OCwgICAtNTAsLTMyNzY4LC0zMjc2OCwtMzI3NjgKLX07Ci0KLQotI2RlZmluZQlZWUxBU1QJCTQ1OAotCi0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXRhYmxlW10gPSB7ICAgIDI5LAotICAgIDY3LCAgICA2NiwgICAxMTUsICAgIDMxLCAgIDExOCwgICAgNzYsICAgIDc3LCAgICAzNiwgICAxMDYsICAgIDYzLAotICAgIDY0LCAgICA2NSwgICAgNjgsICAgIDY2LCAgIDEyNCwgICAxMDgsICAgIDY5LCAgIDEyNSwgICAxMTQsICAgIDM3LAotICAgMTA3LCAgICAgMCwgICAgMzgsICAgIDM5LCAgICA0MCwgICAxMTYsICAgIDQ0LCAgIDExOSwgICAgIDAsICAgIDQzLAotICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgNzMsICAgIDY2LAotICAgICAwLCAgIDEwMCwgICAxMDEsICAgMTA0LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLAotICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgICA4OCwgICAgODksICAgIDkwLCAgICA5MSwgICAgOTIsICAgIDkzLAotICAgIDk0LCAgICA5NSwgICAgOTYsICAgIDk3LCAgICA5OCwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LAotICAgIDY1LCAgICAgMCwgICAgNjYsICAgMTA5LCAgICAgMCwgICAgIDAsICAgMTEwLCAgICAgMSwgICAgIDIsICAgICAzLAotICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDAsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLAotICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAgMCwgICAxMTEsICAgIDIwLAotICAgIDIxLCAgICAyMiwgICAgNjEsICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY1LCAgIDExMCwgICAgNjYsICAgIDIzLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTIxLCAgIDEyMiwgICAxMjAsICAgICAwLAotICAgIDI0LCAgICAyNSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMjYsICAgICAwLCAgICAyNywgICAgIDEsICAgICAyLAotICAgICAzLCAgICAgNCwgICAgIDUsICAgICAwLCAgICAgNywgICAgIDgsICAgICAwLCAgICAgMSwgICAgIDIsICAgICAzLAotICAgICA0LCAgICAgNSwgICAgIDAsICAgICA3LCAgICAgOCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgIDIwLCAgICAgMCwgICAgMjIsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDIwLAotICAgIDIzLCAgICAyMiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDIzLAotICAgICAwLCAgICAyNCwgICAgMjUsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDM1LCAgICAgMCwgICAgMjcsICAgICAwLAotICAgIDI0LCAgICAyNSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMjYsICAgICAwLCAgICAyNywgICAgIDEsICAgICAyLAotICAgICAzLCAgICAgNCwgICAgIDUsICAgICAwLCAgICAgNywgICAgIDgsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LAotICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY1LAotICAgIDIwLCAgICA2NiwgICAgMjIsICAgICA2LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgOSwgICAgMTAsICAgIDExLAotICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAyMSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDI2LCAgICAgNiwgICAgMjcsICAgICAwLAotICAgIDY3LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LAotICAgIDE4LCAgICAxOSwgICAgNjgsICAgICAwLCAgICAgMCwgICAgMjEsICAgIDY5LCAgIDEwMiwgICAgNTQsICAgIDU1LAotICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY1LAotICAgICAwLCAgICA2NiwgICAgNDUsICAgIDQ2LCAgICAgMCwgICAgIDAsICAgICAwLCAgICA0NywgICAgIDAsICAgICAwLAotICAgIDQ4LCAgIDEwMiwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIDU2LAotICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjUsICAgICAwLAotICAgIDY2LCAgICA0NSwgICAgNDYsICAgMTE3LCAgICAgMCwgICAgIDAsICAgIDQ3LCAgICA3NCwgICAgIDAsICAgIDQ4LAotICAgICAwLCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgNTYsICAgIDU3LAotICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgIDAsICAgIDY2LAotICAgIDc1LCAgICA0NSwgICAgNDYsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDQ3LCAgICAgMCwgICAgIDAsICAgIDQ4LAotICAgICAwLCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgNTYsICAgIDU3LAotICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgNDUsICAgIDY2LAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNDksICAgIDUwLAotICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLAotICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgIDAsICAgIDY2LCAgICA0OSwgICAgNTAsICAgIDUxLAotICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDYxLAotICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY1LCAgICAgNiwgICAgNjYsICAgICAwLCAgICAgMCwgICAgIDksICAgIDEwLAotICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgICAwLAotICAgICAwLCAgICAgMCwgICAgMjEsICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIDU2LAotICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjUsICAgICAwLAotICAgIDY2LCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LAotICAgIDYwLCAgICA2MSwgICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjUsICAgICAwLCAgICA2NgotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5Y2hlY2tbXSA9IHsgICAgIDAsCi0gICAgMzUsICAgIDUxLCAgICAyOSwgICAgIDAsICAgIDI5LCAgICA1MiwgICAgNTIsICAgICA4LCAgICA1MSwgICAgNDcsCi0gICAgNDgsICAgIDQ5LCAgICA0NywgICAgNTEsICAgICAwLCAgICA1MiwgICAgNTEsICAgICAwLCAgICA1MiwgICAgMjAsCi0gICAgNzEsICAgIC0xLCAgICAyMywgICAgMjQsICAgIDI1LCAgICA1MiwgICAgMjcsICAgIDUyLCAgICAtMSwgICAgMjYsCi0gICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICAzNSwgICAgNTEsCi0gICAgLTEsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNTAsCi0gICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsCi0gICAgNjEsICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY1LCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsCi0gICAgNDksICAgIC0xLCAgICA1MSwgICAgNzQsICAgIC0xLCAgICAtMSwgICAgNzcsICAgICAzLCAgICAgNCwgICAgIDUsCi0gICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAtMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsCi0gICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIC0xLCAgICA5OSwgICAgMjUsCi0gICAgMjYsICAgIDI3LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgMTA4LCAgICA1MSwgICAgMzUsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAxMTcsICAgMTE4LCAgIDExNSwgICAgLTEsCi0gICAgNDYsICAgIDQ3LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA1MSwgICAgLTEsICAgIDUzLCAgICAgMywgICAgIDQsCi0gICAgIDUsICAgICA2LCAgICAgNywgICAgLTEsICAgICA5LCAgICAxMCwgICAgLTEsICAgICAzLCAgICAgNCwgICAgIDUsCi0gICAgIDYsICAgICA3LCAgICAtMSwgICAgIDksICAgIDEwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCi0gICAgMjUsICAgIC0xLCAgICAyNywgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMjUsCi0gICAgMzUsICAgIDI3LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMzUsCi0gICAgLTEsICAgIDQ2LCAgICA0NywgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNTEsICAgIC0xLCAgICA1MywgICAgLTEsCi0gICAgNDYsICAgIDQ3LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA1MSwgICAgLTEsICAgIDUzLCAgICAgMywgICAgIDQsCi0gICAgIDUsICAgICA2LCAgICAgNywgICAgLTEsICAgICA5LCAgICAxMCwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksCi0gICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksCi0gICAgMjUsICAgIDUxLCAgICAyNywgICAgIDgsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDEyLCAgICAxMywgICAgMTQsCi0gICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAtMSwgICAgLTEsCi0gICAgLTEsICAgIDI2LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNTEsICAgICA4LCAgICA1MywgICAgLTEsCi0gICAgMzUsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsCi0gICAgMjEsICAgIDIyLCAgICA0NywgICAgLTEsICAgIC0xLCAgICAyNiwgICAgNTEsICAgIDUyLCAgICAzOCwgICAgMzksCi0gICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksCi0gICAgLTEsICAgIDUxLCAgICAyMywgICAgMjQsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDI4LCAgICAtMSwgICAgLTEsCi0gICAgMzEsICAgIDUyLCAgICAzMywgICAgMzQsICAgIDM1LCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsCi0gICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgLTEsCi0gICAgNTEsICAgIDIzLCAgICAyNCwgICAgNTQsICAgIC0xLCAgICAtMSwgICAgMjgsICAgIDI5LCAgICAtMSwgICAgMzEsCi0gICAgLTEsICAgIDMzLCAgICAzNCwgICAgMzUsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsCi0gICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICAtMSwgICAgNTEsCi0gICAgNTIsICAgIDIzLCAgICAyNCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMjgsICAgIC0xLCAgICAtMSwgICAgMzEsCi0gICAgLTEsICAgIDMzLCAgICAzNCwgICAgMzUsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsCi0gICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICAyMywgICAgNTEsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAzMywgICAgMzQsCi0gICAgMzUsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsCi0gICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICAtMSwgICAgNTEsICAgIDMzLCAgICAzNCwgICAgMzUsCi0gICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsCi0gICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgICA4LCAgICA1MSwgICAgLTEsICAgIC0xLCAgICAxMiwgICAgMTMsCi0gICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgLTEsCi0gICAgLTEsICAgIC0xLCAgICAyNiwgICAgMzQsICAgIDM1LCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsCi0gICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgLTEsCi0gICAgNTEsICAgIDM1LCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsCi0gICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgLTEsICAgIDUxCi19OwotLyogLSotQy0qLSAgTm90ZSBzb21lIGNvbXBpbGVycyBjaG9rZSBvbiBjb21tZW50cyBvbiBgI2xpbmUnIGxpbmVzLiAgKi8KLSNsaW5lIDMgIi9zdG9uZS9qaW1iL21haW4tOThyMi9zaGFyZS9iaXNvbi5zaW1wbGUiCi0KLS8qIFNrZWxldG9uIG91dHB1dCBwYXJzZXIgZm9yIGJpc29uLAotICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KLQotLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hlbiB0aGlzIGZpbGUgaXMgY29waWVkIGJ5IEJpc29uIGludG8gYQotICAgQmlzb24gb3V0cHV0IGZpbGUsIHlvdSBtYXkgdXNlIHRoYXQgb3V0cHV0IGZpbGUgd2l0aG91dCByZXN0cmljdGlvbi4KLSAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gd2FzIGFkZGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAgIGluIHZlcnNpb24gMS4yNCBvZiBCaXNvbi4gICovCi0KLSNpZm5kZWYgYWxsb2NhCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlIC8qIG5vdCBHTlUgQy4gICovCi0jaWYgKCFkZWZpbmVkIChfX1NURENfXykgJiYgZGVmaW5lZCAoc3BhcmMpKSB8fCBkZWZpbmVkIChfX3NwYXJjX18pIHx8IGRlZmluZWQgKF9fc3BhcmMpIHx8IGRlZmluZWQgKF9fc2dpKQotI2luY2x1ZGUgPGFsbG9jYS5oPgotI2Vsc2UgLyogbm90IHNwYXJjICovCi0jaWYgZGVmaW5lZCAoTVNET1MpICYmICFkZWZpbmVkIChfX1RVUkJPQ19fKQotI2Vsc2UgLyogbm90IE1TRE9TLCBvciBfX1RVUkJPQ19fICovCi0jaWYgZGVmaW5lZChfQUlYKQotICNwcmFnbWEgYWxsb2NhCi0jZWxzZSAvKiBub3QgTVNET1MsIF9fVFVSQk9DX18sIG9yIF9BSVggKi8KLSNpZmRlZiBfX2hwdXgKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci12b2lkICphbGxvY2EgKHVuc2lnbmVkIGludCk7Ci19OwotI2Vsc2UgLyogbm90IF9fY3BsdXNwbHVzICovCi12b2lkICphbGxvY2EgKCk7Ci0jZW5kaWYgLyogbm90IF9fY3BsdXNwbHVzICovCi0jZW5kaWYgLyogX19ocHV4ICovCi0jZW5kaWYgLyogbm90IF9BSVggKi8KLSNlbmRpZiAvKiBub3QgTVNET1MsIG9yIF9fVFVSQk9DX18gKi8KLSNlbmRpZiAvKiBub3Qgc3BhcmMuICAqLwotI2VuZGlmIC8qIG5vdCBHTlUgQy4gICovCi0jZW5kaWYgLyogYWxsb2NhIG5vdCBkZWZpbmVkLiAgKi8KLQotLyogVGhpcyBpcyB0aGUgcGFyc2VyIGNvZGUgdGhhdCBpcyB3cml0dGVuIGludG8gZWFjaCBiaXNvbiBwYXJzZXIKLSAgd2hlbiB0aGUgJXNlbWFudGljX3BhcnNlciBkZWNsYXJhdGlvbiBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBncmFtbWFyLgotICBJdCB3YXMgd3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuIGJ5IHNpbXBsaWZ5aW5nIHRoZSBoYWlyeSBwYXJzZXIKLSAgdXNlZCB3aGVuICVzZW1hbnRpY19wYXJzZXIgaXMgc3BlY2lmaWVkLiAgKi8KLQotLyogTm90ZTogdGhlcmUgbXVzdCBiZSBvbmx5IG9uZSBkb2xsYXIgc2lnbiBpbiB0aGlzIGZpbGUuCi0gICBJdCBpcyByZXBsYWNlZCBieSB0aGUgbGlzdCBvZiBhY3Rpb25zLCBlYWNoIGFjdGlvbgotICAgYXMgb25lIGNhc2Ugb2YgdGhlIHN3aXRjaC4gICovCi0KLSNkZWZpbmUgeXllcnJvawkJKHl5ZXJyc3RhdHVzID0gMCkKLSNkZWZpbmUgeXljbGVhcmluCSh5eWNoYXIgPSBZWUVNUFRZKQotI2RlZmluZSBZWUVNUFRZCQktMgotI2RlZmluZSBZWUVPRgkJMAotI2RlZmluZSBZWUFDQ0VQVAlyZXR1cm4oMCkKLSNkZWZpbmUgWVlBQk9SVCAJcmV0dXJuKDEpCi0jZGVmaW5lIFlZRVJST1IJCWdvdG8geXllcnJsYWIxCi0vKiBMaWtlIFlZRVJST1IgZXhjZXB0IGRvIGNhbGwgeXllcnJvci4KLSAgIFRoaXMgcmVtYWlucyBoZXJlIHRlbXBvcmFyaWx5IHRvIGVhc2UgdGhlCi0gICB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbWVhbmluZyBvZiBZWUVSUk9SLCBmb3IgR0NDLgotICAgT25jZSBHQ0MgdmVyc2lvbiAyIGhhcyBzdXBwbGFudGVkIHZlcnNpb24gMSwgdGhpcyBjYW4gZ28uICAqLwotI2RlZmluZSBZWUZBSUwJCWdvdG8geXllcnJsYWIKLSNkZWZpbmUgWVlSRUNPVkVSSU5HKCkgICghIXl5ZXJyc3RhdHVzKQotI2RlZmluZSBZWUJBQ0tVUCh0b2tlbiwgdmFsdWUpIFwKLWRvCQkJCQkJCQlcCi0gIGlmICh5eWNoYXIgPT0gWVlFTVBUWSAmJiB5eWxlbiA9PSAxKQkJCQlcCi0gICAgeyB5eWNoYXIgPSAodG9rZW4pLCB5eWx2YWwgPSAodmFsdWUpOwkJCVwKLSAgICAgIHl5Y2hhcjEgPSBZWVRSQU5TTEFURSAoeXljaGFyKTsJCQkJXAotICAgICAgWVlQT1BTVEFDSzsJCQkJCQlcCi0gICAgICBnb3RvIHl5YmFja3VwOwkJCQkJCVwKLSAgICB9CQkJCQkJCQlcCi0gIGVsc2UJCQkJCQkJCVwKLSAgICB7IHl5ZXJyb3IgKCJzeW50YXggZXJyb3I6IGNhbm5vdCBiYWNrIHVwIik7IFlZRVJST1I7IH0JXAotd2hpbGUgKDApCi0KLSNkZWZpbmUgWVlURVJST1IJMQotI2RlZmluZSBZWUVSUkNPREUJMjU2Ci0KLSNpZm5kZWYgWVlQVVJFCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgpCi0jZW5kaWYKLQotI2lmZGVmIFlZUFVSRQotI2lmZGVmIFlZTFNQX05FRURFRAotI2lmZGVmIFlZTEVYX1BBUkFNCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsLCAmeXlsbG9jLCBZWUxFWF9QQVJBTSkKLSNlbHNlCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsLCAmeXlsbG9jKQotI2VuZGlmCi0jZWxzZSAvKiBub3QgWVlMU1BfTkVFREVEICovCi0jaWZkZWYgWVlMRVhfUEFSQU0KLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwsIFlZTEVYX1BBUkFNKQotI2Vsc2UKLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwpCi0jZW5kaWYKLSNlbmRpZiAvKiBub3QgWVlMU1BfTkVFREVEICovCi0jZW5kaWYKLQotLyogSWYgbm9ucmVlbnRyYW50LCBnZW5lcmF0ZSB0aGUgdmFyaWFibGVzIGhlcmUgKi8KLQotI2lmbmRlZiBZWVBVUkUKLQotaW50CXl5Y2hhcjsJCQkvKiAgdGhlIGxvb2thaGVhZCBzeW1ib2wJCSovCi1ZWVNUWVBFCXl5bHZhbDsJCQkvKiAgdGhlIHNlbWFudGljIHZhbHVlIG9mIHRoZQkJKi8KLQkJCQkvKiAgbG9va2FoZWFkIHN5bWJvbAkJCSovCi0KLSNpZmRlZiBZWUxTUF9ORUVERUQKLVlZTFRZUEUgeXlsbG9jOwkJCS8qICBsb2NhdGlvbiBkYXRhIGZvciB0aGUgbG9va2FoZWFkCSovCi0JCQkJLyogIHN5bWJvbAkJCQkqLwotI2VuZGlmCi0KLWludCB5eW5lcnJzOwkJCS8qICBudW1iZXIgb2YgcGFyc2UgZXJyb3JzIHNvIGZhciAgICAgICAqLwotI2VuZGlmICAvKiBub3QgWVlQVVJFICovCi0KLSNpZiBZWURFQlVHICE9IDAKLWludCB5eWRlYnVnOwkJCS8qICBub256ZXJvIG1lYW5zIHByaW50IHBhcnNlIHRyYWNlCSovCi0vKiBTaW5jZSB0aGlzIGlzIHVuaW5pdGlhbGl6ZWQsIGl0IGRvZXMgbm90IHN0b3AgbXVsdGlwbGUgcGFyc2VycwotICAgZnJvbSBjb2V4aXN0aW5nLiAgKi8KLSNlbmRpZgotCi0vKiAgWVlJTklUREVQVEggaW5kaWNhdGVzIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHBhcnNlcidzIHN0YWNrcwkqLwotCi0jaWZuZGVmCVlZSU5JVERFUFRICi0jZGVmaW5lIFlZSU5JVERFUFRIIDIwMAotI2VuZGlmCi0KLS8qICBZWU1BWERFUFRIIGlzIHRoZSBtYXhpbXVtIHNpemUgdGhlIHN0YWNrcyBjYW4gZ3JvdyB0bwotICAgIChlZmZlY3RpdmUgb25seSBpZiB0aGUgYnVpbHQtaW4gc3RhY2sgZXh0ZW5zaW9uIG1ldGhvZCBpcyB1c2VkKS4gICovCi0KLSNpZiBZWU1BWERFUFRIID09IDAKLSN1bmRlZiBZWU1BWERFUFRICi0jZW5kaWYKLQotI2lmbmRlZiBZWU1BWERFUFRICi0jZGVmaW5lIFlZTUFYREVQVEggMTAwMDAKLSNlbmRpZgotCi0vKiBQcmV2ZW50IHdhcm5pbmcgaWYgLVdzdHJpY3QtcHJvdG90eXBlcy4gICovCi0jaWZkZWYgX19HTlVDX18KLWludCB5eXBhcnNlICh2b2lkKTsKLSNlbmRpZgotDAotI2lmIF9fR05VQ19fID4gMQkJLyogR05VIEMgYW5kIEdOVSBDKysgZGVmaW5lIHRoaXMuICAqLwotI2RlZmluZSBfX3l5X21lbWNweShUTyxGUk9NLENPVU5UKQlfX2J1aWx0aW5fbWVtY3B5KFRPLEZST00sQ09VTlQpCi0jZWxzZQkJCQkvKiBub3QgR05VIEMgb3IgQysrICovCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi0KLS8qIFRoaXMgaXMgdGhlIG1vc3QgcmVsaWFibGUgd2F5IHRvIGF2b2lkIGluY29tcGF0aWJpbGl0aWVzCi0gICBpbiBhdmFpbGFibGUgYnVpbHQtaW4gZnVuY3Rpb25zIG9uIHZhcmlvdXMgc3lzdGVtcy4gICovCi1zdGF0aWMgdm9pZAotX195eV9tZW1jcHkgKHRvLCBmcm9tLCBjb3VudCkKLSAgICAgY2hhciAqdG87Ci0gICAgIGNoYXIgKmZyb207Ci0gICAgIGludCBjb3VudDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqZiA9IGZyb207Ci0gIHJlZ2lzdGVyIGNoYXIgKnQgPSB0bzsKLSAgcmVnaXN0ZXIgaW50IGkgPSBjb3VudDsKLQotICB3aGlsZSAoaS0tID4gMCkKLSAgICAqdCsrID0gKmYrKzsKLX0KLQotI2Vsc2UgLyogX19jcGx1c3BsdXMgKi8KLQotLyogVGhpcyBpcyB0aGUgbW9zdCByZWxpYWJsZSB3YXkgdG8gYXZvaWQgaW5jb21wYXRpYmlsaXRpZXMKLSAgIGluIGF2YWlsYWJsZSBidWlsdC1pbiBmdW5jdGlvbnMgb24gdmFyaW91cyBzeXN0ZW1zLiAgKi8KLXN0YXRpYyB2b2lkCi1fX3l5X21lbWNweSAoY2hhciAqdG8sIGNoYXIgKmZyb20sIGludCBjb3VudCkKLXsKLSAgcmVnaXN0ZXIgY2hhciAqZiA9IGZyb207Ci0gIHJlZ2lzdGVyIGNoYXIgKnQgPSB0bzsKLSAgcmVnaXN0ZXIgaW50IGkgPSBjb3VudDsKLQotICB3aGlsZSAoaS0tID4gMCkKLSAgICAqdCsrID0gKmYrKzsKLX0KLQotI2VuZGlmCi0jZW5kaWYKLQwKLSNsaW5lIDE5NiAiL3N0b25lL2ppbWIvbWFpbi05OHIyL3NoYXJlL2Jpc29uLnNpbXBsZSIKLQotLyogVGhlIHVzZXIgY2FuIGRlZmluZSBZWVBBUlNFX1BBUkFNIGFzIHRoZSBuYW1lIG9mIGFuIGFyZ3VtZW50IHRvIGJlIHBhc3NlZAotICAgaW50byB5eXBhcnNlLiAgVGhlIGFyZ3VtZW50IHNob3VsZCBoYXZlIHR5cGUgdm9pZCAqLgotICAgSXQgc2hvdWxkIGFjdHVhbGx5IHBvaW50IHRvIGFuIG9iamVjdC4KLSAgIEdyYW1tYXIgYWN0aW9ucyBjYW4gYWNjZXNzIHRoZSB2YXJpYWJsZSBieSBjYXN0aW5nIGl0Ci0gICB0byB0aGUgcHJvcGVyIHBvaW50ZXIgdHlwZS4gICovCi0KLSNpZmRlZiBZWVBBUlNFX1BBUkFNCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcgdm9pZCAqWVlQQVJTRV9QQVJBTQotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wKLSNlbHNlIC8qIG5vdCBfX2NwbHVzcGx1cyAqLwotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0FSRyBZWVBBUlNFX1BBUkFNCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTCB2b2lkICpZWVBBUlNFX1BBUkFNOwotI2VuZGlmIC8qIG5vdCBfX2NwbHVzcGx1cyAqLwotI2Vsc2UgLyogbm90IFlZUEFSU0VfUEFSQU0gKi8KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcKLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCi0jZW5kaWYgLyogbm90IFlZUEFSU0VfUEFSQU0gKi8KLQotaW50Ci15eXBhcnNlKFlZUEFSU0VfUEFSQU1fQVJHKQotICAgICBZWVBBUlNFX1BBUkFNX0RFQ0wKLXsKLSAgcmVnaXN0ZXIgaW50IHl5c3RhdGU7Ci0gIHJlZ2lzdGVyIGludCB5eW47Ci0gIHJlZ2lzdGVyIHNob3J0ICp5eXNzcDsKLSAgcmVnaXN0ZXIgWVlTVFlQRSAqeXl2c3A7Ci0gIGludCB5eWVycnN0YXR1czsJLyogIG51bWJlciBvZiB0b2tlbnMgdG8gc2hpZnQgYmVmb3JlIGVycm9yIG1lc3NhZ2VzIGVuYWJsZWQgKi8KLSAgaW50IHl5Y2hhcjEgPSAwOwkJLyogIGxvb2thaGVhZCB0b2tlbiBhcyBhbiBpbnRlcm5hbCAodHJhbnNsYXRlZCkgdG9rZW4gbnVtYmVyICovCi0KLSAgc2hvcnQJeXlzc2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIHN0YXRlIHN0YWNrCQkJKi8KLSAgWVlTVFlQRSB5eXZzYVtZWUlOSVRERVBUSF07CS8qICB0aGUgc2VtYW50aWMgdmFsdWUgc3RhY2sJCSovCi0KLSAgc2hvcnQgKnl5c3MgPSB5eXNzYTsJCS8qICByZWZlciB0byB0aGUgc3RhY2tzIHRocnUgc2VwYXJhdGUgcG9pbnRlcnMgKi8KLSAgWVlTVFlQRSAqeXl2cyA9IHl5dnNhOwkvKiAgdG8gYWxsb3cgeXlvdmVyZmxvdyB0byB4cmVhbGxvY2F0ZSB0aGVtIGVsc2V3aGVyZSAqLwotCi0jaWZkZWYgWVlMU1BfTkVFREVECi0gIFlZTFRZUEUgeXlsc2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIGxvY2F0aW9uIHN0YWNrCQkJKi8KLSAgWVlMVFlQRSAqeXlscyA9IHl5bHNhOwotICBZWUxUWVBFICp5eWxzcDsKLQotI2RlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0sIHl5bHNwLS0pCi0jZWxzZQotI2RlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0pCi0jZW5kaWYKLQotICBpbnQgeXlzdGFja3NpemUgPSBZWUlOSVRERVBUSDsKLQotI2lmZGVmIFlZUFVSRQotICBpbnQgeXljaGFyOwotICBZWVNUWVBFIHl5bHZhbDsKLSAgaW50IHl5bmVycnM7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gIFlZTFRZUEUgeXlsbG9jOwotI2VuZGlmCi0jZW5kaWYKLQotICBZWVNUWVBFIHl5dmFsOwkJLyogIHRoZSB2YXJpYWJsZSB1c2VkIHRvIHJldHVybgkJKi8KLQkJCQkvKiAgc2VtYW50aWMgdmFsdWVzIGZyb20gdGhlIGFjdGlvbgkqLwotCQkJCS8qICByb3V0aW5lcwkJCQkqLwotCi0gIGludCB5eWxlbjsKLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlN0YXJ0aW5nIHBhcnNlXG4iKTsKLSNlbmRpZgotCi0gIHl5c3RhdGUgPSAwOwotICB5eWVycnN0YXR1cyA9IDA7Ci0gIHl5bmVycnMgPSAwOwotICB5eWNoYXIgPSBZWUVNUFRZOwkJLyogQ2F1c2UgYSB0b2tlbiB0byBiZSByZWFkLiAgKi8KLQotICAvKiBJbml0aWFsaXplIHN0YWNrIHBvaW50ZXJzLgotICAgICBXYXN0ZSBvbmUgZWxlbWVudCBvZiB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2sKLSAgICAgc28gdGhhdCB0aGV5IHN0YXkgb24gdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIHN0YXRlIHN0YWNrLgotICAgICBUaGUgd2FzdGVkIGVsZW1lbnRzIGFyZSBuZXZlciBpbml0aWFsaXplZC4gICovCi0KLSAgeXlzc3AgPSB5eXNzIC0gMTsKLSAgeXl2c3AgPSB5eXZzOwotI2lmZGVmIFlZTFNQX05FRURFRAotICB5eWxzcCA9IHl5bHM7Ci0jZW5kaWYKLQotLyogUHVzaCBhIG5ldyBzdGF0ZSwgd2hpY2ggaXMgZm91bmQgaW4gIHl5c3RhdGUgIC4gICovCi0vKiBJbiBhbGwgY2FzZXMsIHdoZW4geW91IGdldCBoZXJlLCB0aGUgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrcwotICAgaGF2ZSBqdXN0IGJlZW4gcHVzaGVkLiBzbyBwdXNoaW5nIGEgc3RhdGUgaGVyZSBldmVucyB0aGUgc3RhY2tzLiAgKi8KLXl5bmV3c3RhdGU6Ci0KLSAgKisreXlzc3AgPSB5eXN0YXRlOwotCi0gIGlmICh5eXNzcCA+PSB5eXNzICsgeXlzdGFja3NpemUgLSAxKQotICAgIHsKLSAgICAgIC8qIEdpdmUgdXNlciBhIGNoYW5jZSB0byB4cmVhbGxvY2F0ZSB0aGUgc3RhY2sgKi8KLSAgICAgIC8qIFVzZSBjb3BpZXMgb2YgdGhlc2Ugc28gdGhhdCB0aGUgJidzIGRvbid0IGZvcmNlIHRoZSByZWFsIG9uZXMgaW50byBtZW1vcnkuICovCi0gICAgICBZWVNUWVBFICp5eXZzMSA9IHl5dnM7Ci0gICAgICBzaG9ydCAqeXlzczEgPSB5eXNzOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgWVlMVFlQRSAqeXlsczEgPSB5eWxzOwotI2VuZGlmCi0KLSAgICAgIC8qIEdldCB0aGUgY3VycmVudCB1c2VkIHNpemUgb2YgdGhlIHRocmVlIHN0YWNrcywgaW4gZWxlbWVudHMuICAqLwotICAgICAgaW50IHNpemUgPSB5eXNzcCAtIHl5c3MgKyAxOwotCi0jaWZkZWYgeXlvdmVyZmxvdwotICAgICAgLyogRWFjaCBzdGFjayBwb2ludGVyIGFkZHJlc3MgaXMgZm9sbG93ZWQgYnkgdGhlIHNpemUgb2YKLQkgdGhlIGRhdGEgaW4gdXNlIGluIHRoYXQgc3RhY2ssIGluIGJ5dGVzLiAgKi8KLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIC8qIFRoaXMgdXNlZCB0byBiZSBhIGNvbmRpdGlvbmFsIGFyb3VuZCBqdXN0IHRoZSB0d28gZXh0cmEgYXJncywKLQkgYnV0IHRoYXQgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHl5b3ZlcmZsb3cgaXMgYSBtYWNyby4gICovCi0gICAgICB5eW92ZXJmbG93KCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciLAotCQkgJnl5c3MxLCBzaXplICogc2l6ZW9mICgqeXlzc3ApLAotCQkgJnl5dnMxLCBzaXplICogc2l6ZW9mICgqeXl2c3ApLAotCQkgJnl5bHMxLCBzaXplICogc2l6ZW9mICgqeXlsc3ApLAotCQkgJnl5c3RhY2tzaXplKTsKLSNlbHNlCi0gICAgICB5eW92ZXJmbG93KCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciLAotCQkgJnl5c3MxLCBzaXplICogc2l6ZW9mICgqeXlzc3ApLAotCQkgJnl5dnMxLCBzaXplICogc2l6ZW9mICgqeXl2c3ApLAotCQkgJnl5c3RhY2tzaXplKTsKLSNlbmRpZgotCi0gICAgICB5eXNzID0geXlzczE7IHl5dnMgPSB5eXZzMTsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIHl5bHMgPSB5eWxzMTsKLSNlbmRpZgotI2Vsc2UgLyogbm8geXlvdmVyZmxvdyAqLwotICAgICAgLyogRXh0ZW5kIHRoZSBzdGFjayBvdXIgb3duIHdheS4gICovCi0gICAgICBpZiAoeXlzdGFja3NpemUgPj0gWVlNQVhERVBUSCkKLQl7Ci0JICB5eWVycm9yKCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciKTsKLQkgIHJldHVybiAyOwotCX0KLSAgICAgIHl5c3RhY2tzaXplICo9IDI7Ci0gICAgICBpZiAoeXlzdGFja3NpemUgPiBZWU1BWERFUFRIKQotCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKLSAgICAgIHl5c3MgPSAoc2hvcnQgKikgYWxsb2NhICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSk7Ci0gICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eXNzLCAoY2hhciAqKXl5c3MxLCBzaXplICogc2l6ZW9mICgqeXlzc3ApKTsKLSAgICAgIHl5dnMgPSAoWVlTVFlQRSAqKSBhbGxvY2EgKHl5c3RhY2tzaXplICogc2l6ZW9mICgqeXl2c3ApKTsKLSAgICAgIF9feXlfbWVtY3B5ICgoY2hhciAqKXl5dnMsIChjaGFyICopeXl2czEsIHNpemUgKiBzaXplb2YgKCp5eXZzcCkpOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgeXlscyA9IChZWUxUWVBFICopIGFsbG9jYSAoeXlzdGFja3NpemUgKiBzaXplb2YgKCp5eWxzcCkpOwotICAgICAgX195eV9tZW1jcHkgKChjaGFyICopeXlscywgKGNoYXIgKil5eWxzMSwgc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSk7Ci0jZW5kaWYKLSNlbmRpZiAvKiBubyB5eW92ZXJmbG93ICovCi0KLSAgICAgIHl5c3NwID0geXlzcyArIHNpemUgLSAxOwotICAgICAgeXl2c3AgPSB5eXZzICsgc2l6ZSAtIDE7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICB5eWxzcCA9IHl5bHMgKyBzaXplIC0gMTsKLSNlbmRpZgotCi0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQlmcHJpbnRmKHN0ZGVyciwgIlN0YWNrIHNpemUgaW5jcmVhc2VkIHRvICVkXG4iLCB5eXN0YWNrc2l6ZSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKHl5c3NwID49IHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEpCi0JWVlBQk9SVDsKLSAgICB9Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgZnByaW50ZihzdGRlcnIsICJFbnRlcmluZyBzdGF0ZSAlZFxuIiwgeXlzdGF0ZSk7Ci0jZW5kaWYKLQotICBnb3RvIHl5YmFja3VwOwotIHl5YmFja3VwOgotCi0vKiBEbyBhcHByb3ByaWF0ZSBwcm9jZXNzaW5nIGdpdmVuIHRoZSBjdXJyZW50IHN0YXRlLiAgKi8KLS8qIFJlYWQgYSBsb29rYWhlYWQgdG9rZW4gaWYgd2UgbmVlZCBvbmUgYW5kIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLwotLyogeXlyZXN1bWU6ICovCi0KLSAgLyogRmlyc3QgdHJ5IHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGhvdXQgcmVmZXJlbmNlIHRvIGxvb2thaGVhZCB0b2tlbi4gICovCi0KLSAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotICBpZiAoeXluID09IFlZRkxBRykKLSAgICBnb3RvIHl5ZGVmYXVsdDsKLQotICAvKiBOb3Qga25vd24gPT4gZ2V0IGEgbG9va2FoZWFkIHRva2VuIGlmIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLwotCi0gIC8qIHl5Y2hhciBpcyBlaXRoZXIgWVlFTVBUWSBvciBZWUVPRgotICAgICBvciBhIHZhbGlkIHRva2VuIGluIGV4dGVybmFsIGZvcm0uICAqLwotCi0gIGlmICh5eWNoYXIgPT0gWVlFTVBUWSkKLSAgICB7Ci0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQlmcHJpbnRmKHN0ZGVyciwgIlJlYWRpbmcgYSB0b2tlbjogIik7Ci0jZW5kaWYKLSAgICAgIHl5Y2hhciA9IFlZTEVYOwotICAgIH0KLQotICAvKiBDb252ZXJ0IHRva2VuIHRvIGludGVybmFsIGZvcm0gKGluIHl5Y2hhcjEpIGZvciBpbmRleGluZyB0YWJsZXMgd2l0aCAqLwotCi0gIGlmICh5eWNoYXIgPD0gMCkJCS8qIFRoaXMgbWVhbnMgZW5kIG9mIGlucHV0LiAqLwotICAgIHsKLSAgICAgIHl5Y2hhcjEgPSAwOwotICAgICAgeXljaGFyID0gWVlFT0Y7CQkvKiBEb24ndCBjYWxsIFlZTEVYIGFueSBtb3JlICovCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCWZwcmludGYoc3RkZXJyLCAiTm93IGF0IGVuZCBvZiBpbnB1dC5cbiIpOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgeXljaGFyMSA9IFlZVFJBTlNMQVRFKHl5Y2hhcik7Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIk5leHQgdG9rZW4gaXMgJWQgKCVzIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKLQkgIC8qIEdpdmUgdGhlIGluZGl2aWR1YWwgcGFyc2VyIGEgd2F5IHRvIHByaW50IHRoZSBwcmVjaXNlIG1lYW5pbmcKLQkgICAgIG9mIGEgdG9rZW4sIGZvciBmdXJ0aGVyIGRlYnVnZ2luZyBpbmZvLiAgKi8KLSNpZmRlZiBZWVBSSU5UCi0JICBZWVBSSU5UIChzdGRlcnIsIHl5Y2hhciwgeXlsdmFsKTsKLSNlbmRpZgotCSAgZnByaW50ZiAoc3RkZXJyLCAiKVxuIik7Ci0JfQotI2VuZGlmCi0gICAgfQotCi0gIHl5biArPSB5eWNoYXIxOwotICBpZiAoeXluIDwgMCB8fCB5eW4gPiBZWUxBU1QgfHwgeXljaGVja1t5eW5dICE9IHl5Y2hhcjEpCi0gICAgZ290byB5eWRlZmF1bHQ7Ci0KLSAgeXluID0geXl0YWJsZVt5eW5dOwotCi0gIC8qIHl5biBpcyB3aGF0IHRvIGRvIGZvciB0aGlzIHRva2VuIHR5cGUgaW4gdGhpcyBzdGF0ZS4KLSAgICAgTmVnYXRpdmUgPT4gcmVkdWNlLCAteXluIGlzIHJ1bGUgbnVtYmVyLgotICAgICBQb3NpdGl2ZSA9PiBzaGlmdCwgeXluIGlzIG5ldyBzdGF0ZS4KLSAgICAgICBOZXcgc3RhdGUgaXMgZmluYWwgc3RhdGUgPT4gZG9uJ3QgYm90aGVyIHRvIHNoaWZ0LAotICAgICAgIGp1c3QgcmV0dXJuIHN1Y2Nlc3MuCi0gICAgIDAsIG9yIG1vc3QgbmVnYXRpdmUgbnVtYmVyID0+IGVycm9yLiAgKi8KLQotICBpZiAoeXluIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoeXluID09IFlZRkxBRykKLQlnb3RvIHl5ZXJybGFiOwotICAgICAgeXluID0gLXl5bjsKLSAgICAgIGdvdG8geXlyZWR1Y2U7Ci0gICAgfQotICBlbHNlIGlmICh5eW4gPT0gMCkKLSAgICBnb3RvIHl5ZXJybGFiOwotCi0gIGlmICh5eW4gPT0gWVlGSU5BTCkKLSAgICBZWUFDQ0VQVDsKLQotICAvKiBTaGlmdCB0aGUgbG9va2FoZWFkIHRva2VuLiAgKi8KLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlNoaWZ0aW5nIHRva2VuICVkICglcyksICIsIHl5Y2hhciwgeXl0bmFtZVt5eWNoYXIxXSk7Ci0jZW5kaWYKLQotICAvKiBEaXNjYXJkIHRoZSB0b2tlbiBiZWluZyBzaGlmdGVkIHVubGVzcyBpdCBpcyBlb2YuICAqLwotICBpZiAoeXljaGFyICE9IFlZRU9GKQotICAgIHl5Y2hhciA9IFlZRU1QVFk7Ci0KLSAgKisreXl2c3AgPSB5eWx2YWw7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICorK3l5bHNwID0geXlsbG9jOwotI2VuZGlmCi0KLSAgLyogY291bnQgdG9rZW5zIHNoaWZ0ZWQgc2luY2UgZXJyb3I7IGFmdGVyIHRocmVlLCB0dXJuIG9mZiBlcnJvciBzdGF0dXMuICAqLwotICBpZiAoeXllcnJzdGF0dXMpIHl5ZXJyc3RhdHVzLS07Ci0KLSAgeXlzdGF0ZSA9IHl5bjsKLSAgZ290byB5eW5ld3N0YXRlOwotCi0vKiBEbyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlLiAgKi8KLXl5ZGVmYXVsdDoKLQotICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsKLSAgaWYgKHl5biA9PSAwKQotICAgIGdvdG8geXllcnJsYWI7Ci0KLS8qIERvIGEgcmVkdWN0aW9uLiAgeXluIGlzIHRoZSBudW1iZXIgb2YgYSBydWxlIHRvIHJlZHVjZSB3aXRoLiAgKi8KLXl5cmVkdWNlOgotICB5eWxlbiA9IHl5cjJbeXluXTsKLSAgaWYgKHl5bGVuID4gMCkKLSAgICB5eXZhbCA9IHl5dnNwWzEteXlsZW5dOyAvKiBpbXBsZW1lbnQgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYWN0aW9uICovCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlJlZHVjaW5nIHZpYSBydWxlICVkIChsaW5lICVkKSwgIiwKLQkgICAgICAgeXluLCB5eXJsaW5lW3l5bl0pOwotCi0gICAgICAvKiBQcmludCB0aGUgc3ltYm9scyBiZWluZyByZWR1Y2VkLCBhbmQgdGhlaXIgcmVzdWx0LiAgKi8KLSAgICAgIGZvciAoaSA9IHl5cHJoc1t5eW5dOyB5eXJoc1tpXSA+IDA7IGkrKykKLQlmcHJpbnRmIChzdGRlcnIsICIlcyAiLCB5eXRuYW1lW3l5cmhzW2ldXSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJXNcbiIsIHl5dG5hbWVbeXlyMVt5eW5dXSk7Ci0gICAgfQotI2VuZGlmCi0KLQotICBzd2l0Y2ggKHl5bikgewotCi1jYXNlIDM6Ci0jbGluZSAyMjYgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUoeXl2c3BbMF0udHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0OgotI2xpbmUgMjMyICJmLWV4cC55IgoteyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1OgotI2xpbmUgMjM3ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9JTkQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2OgotI2xpbmUgMjQwICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9BRERSKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNzoKLSNsaW5lIDI0MyAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTkVHKTsgOwotICAgIGJyZWFrO30KLWNhc2UgODoKLSNsaW5lIDI0NyAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTE9HSUNBTF9OT1QpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA5OgotI2xpbmUgMjUxICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DT01QTEVNRU5UKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTA6Ci0jbGluZSAyNTUgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX1NJWkVPRik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExOgotI2xpbmUgMjY0ICJmLWV4cC55IgoteyBzdGFydF9hcmdsaXN0ICgpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMjoKLSNsaW5lIDI2NiAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0Y3N19VTkRFVEVSTUlORURfQVJHTElTVCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIGVuZF9hcmdsaXN0ICgpKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0Y3N19VTkRFVEVSTUlORURfQVJHTElTVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE0OgotI2xpbmUgMjc1ICJmLWV4cC55IgoteyBhcmdsaXN0X2xlbiA9IDE7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE1OgotI2xpbmUgMjc5ICJmLWV4cC55IgoteyBhcmdsaXN0X2xlbiA9IDI7OwotICAgIGJyZWFrO30KLWNhc2UgMTY6Ci0jbGluZSAyODIgImYtZXhwLnkiCi17IGFyZ2xpc3RfbGVuKys7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE3OgotI2xpbmUgMjg2ICJmLWV4cC55IgoteyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxODoKLSNsaW5lIDI5MSAiZi1leHAueSIKLXsgOwotICAgIGJyZWFrO30KLWNhc2UgMTk6Ci0jbGluZSAyOTUgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX0NPTVBMRVgpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyMDoKLSNsaW5lIDI5OSAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoeXl2c3BbLTJdLnR2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjE6Ci0jbGluZSAzMDcgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9SRVBFQVQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyMjoKLSNsaW5lIDMxMSAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX01VTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDIzOgotI2xpbmUgMzE1ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfRElWKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjQ6Ci0jbGluZSAzMTkgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9SRU0pOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyNToKLSNsaW5lIDMyMyAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FERCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDI2OgotI2xpbmUgMzI3ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfU1VCKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjc6Ci0jbGluZSAzMzEgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MU0gpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyODoKLSNsaW5lIDMzNSAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1JTSCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDI5OgotI2xpbmUgMzM5ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfRVFVQUwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzMDoKLSNsaW5lIDM0MyAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX05PVEVRVUFMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzE6Ci0jbGluZSAzNDcgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MRVEpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzMjoKLSNsaW5lIDM1MSAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0dFUSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDMzOgotI2xpbmUgMzU1ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTEVTUyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDM0OgotI2xpbmUgMzU5ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfR1RSKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzU6Ci0jbGluZSAzNjMgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9CSVRXSVNFX0FORCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDM2OgotI2xpbmUgMzY3ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQklUV0lTRV9YT1IpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzNzoKLSNsaW5lIDM3MSAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0JJVFdJU0VfSU9SKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzg6Ci0jbGluZSAzNzUgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MT0dJQ0FMX0FORCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDM5OgotI2xpbmUgMzgwICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTE9HSUNBTF9PUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQwOgotI2xpbmUgMzg0ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQVNTSUdOKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDE6Ci0jbGluZSAzODggImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BU1NJR05fTU9ESUZZKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKHl5dnNwWy0xXS5vcGNvZGUpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQVNTSUdOX01PRElGWSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQyOgotI2xpbmUgMzk0ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoeXl2c3BbMF0udHlwZWRfdmFsLnR5cGUpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSh5eXZzcFswXS50eXBlZF92YWwudmFsKSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDM6Ci0jbGluZSA0MDEgImYtZXhwLnkiCi17IFlZU1RZUEUgdmFsOwotCQkJICBwYXJzZV9udW1iZXIgKHl5dnNwWzBdLnNzeW0uc3Rva2VuLnB0ciwgeXl2c3BbMF0uc3N5bS5zdG9rZW4ubGVuZ3RoLCAwLCAmdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHZhbC50eXBlZF92YWwudHlwZSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpdmFsLnR5cGVkX3ZhbC52YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ0OgotI2xpbmUgNDEwICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRE9VQkxFKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlIChidWlsdGluX3R5cGVfZl9yZWFsX3M4KTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9kYmxjc3QgKHl5dnNwWzBdLmR2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRE9VQkxFKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDc6Ci0jbGluZSA0MjMgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlIChidWlsdGluX3R5cGVfZl9pbnRlZ2VyKTsKLQkJCSAgQ0hFQ0tfVFlQRURFRiAoeXl2c3BbLTFdLnR2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSBUWVBFX0xFTkdUSCAoeXl2c3BbLTFdLnR2YWwpKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0ODoKLSNsaW5lIDQzMSAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0JPT0wpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSB5eXZzcFswXS5sdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0JPT0wpOwotCQkJOwotICAgIGJyZWFrO30KLWNhc2UgNDk6Ci0jbGluZSA0MzggImYtZXhwLnkiCi17Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9TVFJJTkcpOwotCQkJICB3cml0ZV9leHBfc3RyaW5nICh5eXZzcFswXS5zdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1NUUklORyk7Ci0JCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA1MDoKLSNsaW5lIDQ0NiAiZi1leHAueSIKLXsgc3RydWN0IHN5bWJvbCAqc3ltID0geXl2c3BbMF0uc3N5bS5zeW07Ci0KLQkJCSAgaWYgKHN5bSkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoc3ltYm9sX3JlYWRfbmVlZHNfZnJhbWUgKHN5bSkpCi0JCQkJewotCQkJCSAgaWYgKGlubmVybW9zdF9ibG9jayA9PSAwIHx8Ci0JCQkJICAgICAgY29udGFpbmVkX2luIChibG9ja19mb3VuZCwgCi0JCQkJCQkgICAgaW5uZXJtb3N0X2Jsb2NrKSkKLQkJCQkgICAgaW5uZXJtb3N0X2Jsb2NrID0gYmxvY2tfZm91bmQ7Ci0JCQkJfQotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7Ci0JCQkgICAgICAvKiBXZSB3YW50IHRvIHVzZSB0aGUgc2VsZWN0ZWQgZnJhbWUsIG5vdAotCQkJCSBhbm90aGVyIG1vcmUgaW5uZXIgZnJhbWUgd2hpY2ggaGFwcGVucyB0bwotCQkJCSBiZSBpbiB0aGUgc2FtZSBibG9jay4gICovCi0JCQkgICAgICB3cml0ZV9leHBfZWx0X2Jsb2NrIChOVUxMKTsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfc3ltIChzeW0pOwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7Ci0JCQkgICAgICByZWdpc3RlciBjaGFyICphcmcgPSBjb3B5X25hbWUgKHl5dnNwWzBdLnNzeW0uc3Rva2VuKTsKLQotCQkJICAgICAgbXN5bWJvbCA9Ci0JCQkJbG9va3VwX21pbmltYWxfc3ltYm9sIChhcmcsIE5VTEwsIE5VTEwpOwotCQkJICAgICAgaWYgKG1zeW1ib2wgIT0gTlVMTCkKLQkJCQl7Ci0JCQkJICB3cml0ZV9leHBfbXN5bWJvbCAobXN5bWJvbCwKLQkJCQkJCSAgICAgbG9va3VwX2Z1bmN0aW9uX3R5cGUgKGJ1aWx0aW5fdHlwZV9pbnQpLAotCQkJCQkJICAgICBidWlsdGluX3R5cGVfaW50KTsKLQkJCQl9Ci0JCQkgICAgICBlbHNlIGlmICghaGF2ZV9mdWxsX3N5bWJvbHMgKCkgJiYgIWhhdmVfcGFydGlhbF9zeW1ib2xzICgpKQotCQkJCWVycm9yICgiTm8gc3ltYm9sIHRhYmxlIGlzIGxvYWRlZC4gIFVzZSB0aGUgXCJmaWxlXCIgY29tbWFuZC4iKTsKLQkJCSAgICAgIGVsc2UKLQkJCQllcnJvciAoIk5vIHN5bWJvbCBcIiVzXCIgaW4gY3VycmVudCBjb250ZXh0LiIsCi0JCQkJICAgICAgIGNvcHlfbmFtZSAoeXl2c3BbMF0uc3N5bS5zdG9rZW4pKTsKLQkJCSAgICB9Ci0JCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA1MzoKLSNsaW5lIDQ5NCAiZi1leHAueSIKLXsKLQkJICAvKiBUaGlzIGlzIHdoZXJlIHRoZSBpbnRlcmVzdGluZyBzdHVmZiBoYXBwZW5zLiAgKi8KLQkJICBpbnQgZG9uZSA9IDA7Ci0JCSAgaW50IGFycmF5X3NpemU7Ci0JCSAgc3RydWN0IHR5cGUgKmZvbGxvd190eXBlID0geXl2c3BbLTFdLnR2YWw7Ci0JCSAgc3RydWN0IHR5cGUgKnJhbmdlX3R5cGU7Ci0JCSAgCi0JCSAgd2hpbGUgKCFkb25lKQotCQkgICAgc3dpdGNoIChwb3BfdHlwZSAoKSkKLQkJICAgICAgewotCQkgICAgICBjYXNlIHRwX2VuZDoKLQkJCWRvbmUgPSAxOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgdHBfcG9pbnRlcjoKLQkJCWZvbGxvd190eXBlID0gbG9va3VwX3BvaW50ZXJfdHlwZSAoZm9sbG93X3R5cGUpOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgdHBfcmVmZXJlbmNlOgotCQkJZm9sbG93X3R5cGUgPSBsb29rdXBfcmVmZXJlbmNlX3R5cGUgKGZvbGxvd190eXBlKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIHRwX2FycmF5OgotCQkJYXJyYXlfc2l6ZSA9IHBvcF90eXBlX2ludCAoKTsKLQkJCWlmIChhcnJheV9zaXplICE9IC0xKQotCQkJICB7Ci0JCQkgICAgcmFuZ2VfdHlwZSA9Ci0JCQkgICAgICBjcmVhdGVfcmFuZ2VfdHlwZSAoKHN0cnVjdCB0eXBlICopIE5VTEwsCi0JCQkJCQkgYnVpbHRpbl90eXBlX2ZfaW50ZWdlciwgMCwKLQkJCQkJCSBhcnJheV9zaXplIC0gMSk7Ci0JCQkgICAgZm9sbG93X3R5cGUgPQotCQkJICAgICAgY3JlYXRlX2FycmF5X3R5cGUgKChzdHJ1Y3QgdHlwZSAqKSBOVUxMLAotCQkJCQkJIGZvbGxvd190eXBlLCByYW5nZV90eXBlKTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICBmb2xsb3dfdHlwZSA9IGxvb2t1cF9wb2ludGVyX3R5cGUgKGZvbGxvd190eXBlKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIHRwX2Z1bmN0aW9uOgotCQkJZm9sbG93X3R5cGUgPSBsb29rdXBfZnVuY3Rpb25fdHlwZSAoZm9sbG93X3R5cGUpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICB5eXZhbC50dmFsID0gZm9sbG93X3R5cGU7Ci0JCTsKLSAgICBicmVhazt9Ci1jYXNlIDU0OgotI2xpbmUgNTM3ICJmLWV4cC55IgoteyBwdXNoX3R5cGUgKHRwX3BvaW50ZXIpOyB5eXZhbC52b2lkdmFsID0gMDsgOwotICAgIGJyZWFrO30KLWNhc2UgNTU6Ci0jbGluZSA1MzkgImYtZXhwLnkiCi17IHB1c2hfdHlwZSAodHBfcG9pbnRlcik7IHl5dmFsLnZvaWR2YWwgPSB5eXZzcFswXS52b2lkdmFsOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1NjoKLSNsaW5lIDU0MSAiZi1leHAueSIKLXsgcHVzaF90eXBlICh0cF9yZWZlcmVuY2UpOyB5eXZhbC52b2lkdmFsID0gMDsgOwotICAgIGJyZWFrO30KLWNhc2UgNTc6Ci0jbGluZSA1NDMgImYtZXhwLnkiCi17IHB1c2hfdHlwZSAodHBfcmVmZXJlbmNlKTsgeXl2YWwudm9pZHZhbCA9IHl5dnNwWzBdLnZvaWR2YWw7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU5OgotI2xpbmUgNTQ4ICJmLWV4cC55IgoteyB5eXZhbC52b2lkdmFsID0geXl2c3BbLTFdLnZvaWR2YWw7IDsKLSAgICBicmVhazt9Ci1jYXNlIDYwOgotI2xpbmUgNTUwICJmLWV4cC55IgoteyBwdXNoX3R5cGUgKHRwX2Z1bmN0aW9uKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjE6Ci0jbGluZSA1NTIgImYtZXhwLnkiCi17IHB1c2hfdHlwZSAodHBfZnVuY3Rpb24pOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2MjoKLSNsaW5lIDU1NiAiZi1leHAueSIKLXsgeXl2YWwudm9pZHZhbCA9IDA7IDsKLSAgICBicmVhazt9Ci1jYXNlIDYzOgotI2xpbmUgNTU4ICJmLWV4cC55IgoteyBmcmVlICgoUFRSKXl5dnNwWy0xXS50dmVjKTsgeXl2YWwudm9pZHZhbCA9IDA7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY0OgotI2xpbmUgNTYzICJmLWV4cC55IgoteyB5eXZhbC50dmFsID0geXl2c3BbMF0udHN5bS50eXBlOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2NToKLSNsaW5lIDU2NSAiZi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9mX2ludGVnZXI7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY2OgotI2xpbmUgNTY3ICJmLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2ZfaW50ZWdlcl9zMjsgOwotICAgIGJyZWFrO30KLWNhc2UgNjc6Ci0jbGluZSA1NjkgImYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfZl9jaGFyYWN0ZXI7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY4OgotI2xpbmUgNTcxICJmLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2ZfbG9naWNhbDs7Ci0gICAgYnJlYWs7fQotY2FzZSA2OToKLSNsaW5lIDU3MyAiZi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9mX2xvZ2ljYWxfczI7OwotICAgIGJyZWFrO30KLWNhc2UgNzA6Ci0jbGluZSA1NzUgImYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfZl9sb2dpY2FsX3MxOzsKLSAgICBicmVhazt9Ci1jYXNlIDcxOgotI2xpbmUgNTc3ICJmLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2ZfcmVhbDs7Ci0gICAgYnJlYWs7fQotY2FzZSA3MjoKLSNsaW5lIDU3OSAiZi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9mX3JlYWxfczg7OwotICAgIGJyZWFrO30KLWNhc2UgNzM6Ci0jbGluZSA1ODEgImYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfZl9yZWFsX3MxNjs7Ci0gICAgYnJlYWs7fQotY2FzZSA3NDoKLSNsaW5lIDU4MyAiZi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9mX2NvbXBsZXhfczg7OwotICAgIGJyZWFrO30KLWNhc2UgNzU6Ci0jbGluZSA1ODUgImYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfZl9jb21wbGV4X3MxNjs7Ci0gICAgYnJlYWs7fQotY2FzZSA3NjoKLSNsaW5lIDU4NyAiZi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9mX2NvbXBsZXhfczMyOzsKLSAgICBicmVhazt9Ci1jYXNlIDc4OgotI2xpbmUgNTk1ICJmLWV4cC55IgoteyB5eXZhbC50dmVjID0gKHN0cnVjdCB0eXBlICoqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCB0eXBlICopICogMik7Ci0JCSAgeXl2YWwuaXZlY1swXSA9IDE7CS8qIE51bWJlciBvZiB0eXBlcyBpbiB2ZWN0b3IgKi8KLQkJICB5eXZhbC50dmVjWzFdID0geXl2c3BbMF0udHZhbDsKLQkJOwotICAgIGJyZWFrO30KLWNhc2UgNzk6Ci0jbGluZSA2MDAgImYtZXhwLnkiCi17IGludCBsZW4gPSBzaXplb2YgKHN0cnVjdCB0eXBlICopICogKCsrKHl5dnNwWy0yXS5pdmVjWzBdKSArIDEpOwotCQkgIHl5dmFsLnR2ZWMgPSAoc3RydWN0IHR5cGUgKiopIHhyZWFsbG9jICgoY2hhciAqKSB5eXZzcFstMl0udHZlYywgbGVuKTsKLQkJICB5eXZhbC50dmVjW3l5dmFsLml2ZWNbMF1dID0geXl2c3BbMF0udHZhbDsKLQkJOwotICAgIGJyZWFrO30KLWNhc2UgODA6Ci0jbGluZSA2MDcgImYtZXhwLnkiCi17IHl5dmFsLnN2YWwgPSB5eXZzcFswXS5zc3ltLnN0b2tlbjsgOwotICAgIGJyZWFrO30KLWNhc2UgODE6Ci0jbGluZSA2MDkgImYtZXhwLnkiCi17IHl5dmFsLnN2YWwgPSB5eXZzcFswXS50c3ltLnN0b2tlbjsgOwotICAgIGJyZWFrO30KLWNhc2UgODI6Ci0jbGluZSA2MTEgImYtZXhwLnkiCi17IHl5dmFsLnN2YWwgPSB5eXZzcFswXS5zc3ltLnN0b2tlbjsgOwotICAgIGJyZWFrO30KLX0KLSAgIC8qIHRoZSBhY3Rpb24gZmlsZSBnZXRzIGNvcGllZCBpbiBpbiBwbGFjZSBvZiB0aGlzIGRvbGxhcnNpZ24gKi8KLSNsaW5lIDQ5OCAiL3N0b25lL2ppbWIvbWFpbi05OHIyL3NoYXJlL2Jpc29uLnNpbXBsZSIKLQwKLSAgeXl2c3AgLT0geXlsZW47Ci0gIHl5c3NwIC09IHl5bGVuOwotI2lmZGVmIFlZTFNQX05FRURFRAotICB5eWxzcCAtPSB5eWxlbjsKLSNlbmRpZgotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIHsKLSAgICAgIHNob3J0ICpzc3AxID0geXlzcyAtIDE7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJzdGF0ZSBzdGFjayBub3ciKTsKLSAgICAgIHdoaWxlIChzc3AxICE9IHl5c3NwKQotCWZwcmludGYgKHN0ZGVyciwgIiAlZCIsICorK3NzcDEpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICB9Ci0jZW5kaWYKLQotICAqKyt5eXZzcCA9IHl5dmFsOwotCi0jaWZkZWYgWVlMU1BfTkVFREVECi0gIHl5bHNwKys7Ci0gIGlmICh5eWxlbiA9PSAwKQotICAgIHsKLSAgICAgIHl5bHNwLT5maXJzdF9saW5lID0geXlsbG9jLmZpcnN0X2xpbmU7Ci0gICAgICB5eWxzcC0+Zmlyc3RfY29sdW1uID0geXlsbG9jLmZpcnN0X2NvbHVtbjsKLSAgICAgIHl5bHNwLT5sYXN0X2xpbmUgPSAoeXlsc3AtMSktPmxhc3RfbGluZTsKLSAgICAgIHl5bHNwLT5sYXN0X2NvbHVtbiA9ICh5eWxzcC0xKS0+bGFzdF9jb2x1bW47Ci0gICAgICB5eWxzcC0+dGV4dCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgeXlsc3AtPmxhc3RfbGluZSA9ICh5eWxzcCt5eWxlbi0xKS0+bGFzdF9saW5lOwotICAgICAgeXlsc3AtPmxhc3RfY29sdW1uID0gKHl5bHNwK3l5bGVuLTEpLT5sYXN0X2NvbHVtbjsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBOb3cgInNoaWZ0IiB0aGUgcmVzdWx0IG9mIHRoZSByZWR1Y3Rpb24uCi0gICAgIERldGVybWluZSB3aGF0IHN0YXRlIHRoYXQgZ29lcyB0bywKLSAgICAgYmFzZWQgb24gdGhlIHN0YXRlIHdlIHBvcHBlZCBiYWNrIHRvCi0gICAgIGFuZCB0aGUgcnVsZSBudW1iZXIgcmVkdWNlZCBieS4gICovCi0KLSAgeXluID0geXlyMVt5eW5dOwotCi0gIHl5c3RhdGUgPSB5eXBnb3RvW3l5biAtIFlZTlRCQVNFXSArICp5eXNzcDsKLSAgaWYgKHl5c3RhdGUgPj0gMCAmJiB5eXN0YXRlIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5c3RhdGVdID09ICp5eXNzcCkKLSAgICB5eXN0YXRlID0geXl0YWJsZVt5eXN0YXRlXTsKLSAgZWxzZQotICAgIHl5c3RhdGUgPSB5eWRlZmdvdG9beXluIC0gWVlOVEJBU0VdOwotCi0gIGdvdG8geXluZXdzdGF0ZTsKLQoteXllcnJsYWI6ICAgLyogaGVyZSBvbiBkZXRlY3RpbmcgZXJyb3IgKi8KLQotICBpZiAoISB5eWVycnN0YXR1cykKLSAgICAvKiBJZiBub3QgYWxyZWFkeSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlcG9ydCB0aGlzIGVycm9yLiAgKi8KLSAgICB7Ci0gICAgICArK3l5bmVycnM7Ci0KLSNpZmRlZiBZWUVSUk9SX1ZFUkJPU0UKLSAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLQotICAgICAgaWYgKHl5biA+IFlZRkxBRyAmJiB5eW4gPCBZWUxBU1QpCi0JewotCSAgaW50IHNpemUgPSAwOwotCSAgY2hhciAqbXNnOwotCSAgaW50IHgsIGNvdW50OwotCi0JICBjb3VudCA9IDA7Ci0JICAvKiBTdGFydCBYIGF0IC15eW4gaWYgbmVjIHRvIGF2b2lkIG5lZ2F0aXZlIGluZGV4ZXMgaW4geXljaGVjay4gICovCi0JICBmb3IgKHggPSAoeXluIDwgMCA/IC15eW4gOiAwKTsKLQkgICAgICAgeCA8IChzaXplb2YoeXl0bmFtZSkgLyBzaXplb2YoY2hhciAqKSk7IHgrKykKLQkgICAgaWYgKHl5Y2hlY2tbeCArIHl5bl0gPT0geCkKLQkgICAgICBzaXplICs9IHN0cmxlbih5eXRuYW1lW3hdKSArIDE1LCBjb3VudCsrOwotCSAgbXNnID0gKGNoYXIgKikgeG1hbGxvYyhzaXplICsgMTUpOwotCSAgaWYgKG1zZyAhPSAwKQotCSAgICB7Ci0JICAgICAgc3RyY3B5KG1zZywgInBhcnNlIGVycm9yIik7Ci0KLQkgICAgICBpZiAoY291bnQgPCA1KQotCQl7Ci0JCSAgY291bnQgPSAwOwotCQkgIGZvciAoeCA9ICh5eW4gPCAwID8gLXl5biA6IDApOwotCQkgICAgICAgeCA8IChzaXplb2YoeXl0bmFtZSkgLyBzaXplb2YoY2hhciAqKSk7IHgrKykKLQkJICAgIGlmICh5eWNoZWNrW3ggKyB5eW5dID09IHgpCi0JCSAgICAgIHsKLQkJCXN0cmNhdChtc2csIGNvdW50ID09IDAgPyAiLCBleHBlY3RpbmcgYCIgOiAiIG9yIGAiKTsKLQkJCXN0cmNhdChtc2csIHl5dG5hbWVbeF0pOwotCQkJc3RyY2F0KG1zZywgIiciKTsKLQkJCWNvdW50Kys7Ci0JCSAgICAgIH0KLQkJfQotCSAgICAgIHl5ZXJyb3IobXNnKTsKLQkgICAgICBmcmVlKG1zZyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgeXllcnJvciAoInBhcnNlIGVycm9yOyBhbHNvIHZpcnR1YWwgbWVtb3J5IGV4Y2VlZGVkIik7Ci0JfQotICAgICAgZWxzZQotI2VuZGlmIC8qIFlZRVJST1JfVkVSQk9TRSAqLwotCXl5ZXJyb3IoInBhcnNlIGVycm9yIik7Ci0gICAgfQotCi0gIGdvdG8geXllcnJsYWIxOwoteXllcnJsYWIxOiAgIC8qIGhlcmUgb24gZXJyb3IgcmFpc2VkIGV4cGxpY2l0bHkgYnkgYW4gYWN0aW9uICovCi0KLSAgaWYgKHl5ZXJyc3RhdHVzID09IDMpCi0gICAgewotICAgICAgLyogaWYganVzdCB0cmllZCBhbmQgZmFpbGVkIHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbiBhZnRlciBhbiBlcnJvciwgZGlzY2FyZCBpdC4gICovCi0KLSAgICAgIC8qIHJldHVybiBmYWlsdXJlIGlmIGF0IGVuZCBvZiBpbnB1dCAqLwotICAgICAgaWYgKHl5Y2hhciA9PSBZWUVPRikKLQlZWUFCT1JUOwotCi0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQlmcHJpbnRmKHN0ZGVyciwgIkRpc2NhcmRpbmcgdG9rZW4gJWQgKCVzKS5cbiIsIHl5Y2hhciwgeXl0bmFtZVt5eWNoYXIxXSk7Ci0jZW5kaWYKLQotICAgICAgeXljaGFyID0gWVlFTVBUWTsKLSAgICB9Ci0KLSAgLyogRWxzZSB3aWxsIHRyeSB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4KLSAgICAgYWZ0ZXIgc2hpZnRpbmcgdGhlIGVycm9yIHRva2VuLiAgKi8KLQotICB5eWVycnN0YXR1cyA9IDM7CQkvKiBFYWNoIHJlYWwgdG9rZW4gc2hpZnRlZCBkZWNyZW1lbnRzIHRoaXMgKi8KLQotICBnb3RvIHl5ZXJyaGFuZGxlOwotCi15eWVycmRlZmF1bHQ6ICAvKiBjdXJyZW50IHN0YXRlIGRvZXMgbm90IGRvIGFueXRoaW5nIHNwZWNpYWwgZm9yIHRoZSBlcnJvciB0b2tlbi4gKi8KLQotI2lmIDAKLSAgLyogVGhpcyBpcyB3cm9uZzsgb25seSBzdGF0ZXMgdGhhdCBleHBsaWNpdGx5IHdhbnQgZXJyb3IgdG9rZW5zCi0gICAgIHNob3VsZCBzaGlmdCB0aGVtLiAgKi8KLSAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07ICAvKiBJZiBpdHMgZGVmYXVsdCBpcyB0byBhY2NlcHQgYW55IHRva2VuLCBvay4gIE90aGVyd2lzZSBwb3AgaXQuKi8KLSAgaWYgKHl5bikgZ290byB5eWRlZmF1bHQ7Ci0jZW5kaWYKLQoteXllcnJwb3A6ICAgLyogcG9wIHRoZSBjdXJyZW50IHN0YXRlIGJlY2F1c2UgaXQgY2Fubm90IGhhbmRsZSB0aGUgZXJyb3IgdG9rZW4gKi8KLQotICBpZiAoeXlzc3AgPT0geXlzcykgWVlBQk9SVDsKLSAgeXl2c3AtLTsKLSAgeXlzdGF0ZSA9ICotLXl5c3NwOwotI2lmZGVmIFlZTFNQX05FRURFRAotICB5eWxzcC0tOwotI2VuZGlmCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgewotICAgICAgc2hvcnQgKnNzcDEgPSB5eXNzIC0gMTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiBzdGF0ZSBzdGFjayBub3ciKTsKLSAgICAgIHdoaWxlIChzc3AxICE9IHl5c3NwKQotCWZwcmludGYgKHN0ZGVyciwgIiAlZCIsICorK3NzcDEpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICB9Ci0jZW5kaWYKLQoteXllcnJoYW5kbGU6Ci0KLSAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotICBpZiAoeXluID09IFlZRkxBRykKLSAgICBnb3RvIHl5ZXJyZGVmYXVsdDsKLQotICB5eW4gKz0gWVlURVJST1I7Ci0gIGlmICh5eW4gPCAwIHx8IHl5biA+IFlZTEFTVCB8fCB5eWNoZWNrW3l5bl0gIT0gWVlURVJST1IpCi0gICAgZ290byB5eWVycmRlZmF1bHQ7Ci0KLSAgeXluID0geXl0YWJsZVt5eW5dOwotICBpZiAoeXluIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoeXluID09IFlZRkxBRykKLQlnb3RvIHl5ZXJycG9wOwotICAgICAgeXluID0gLXl5bjsKLSAgICAgIGdvdG8geXlyZWR1Y2U7Ci0gICAgfQotICBlbHNlIGlmICh5eW4gPT0gMCkKLSAgICBnb3RvIHl5ZXJycG9wOwotCi0gIGlmICh5eW4gPT0gWVlGSU5BTCkKLSAgICBZWUFDQ0VQVDsKLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlNoaWZ0aW5nIGVycm9yIHRva2VuLCAiKTsKLSNlbmRpZgotCi0gICorK3l5dnNwID0geXlsdmFsOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAqKyt5eWxzcCA9IHl5bGxvYzsKLSNlbmRpZgotCi0gIHl5c3RhdGUgPSB5eW47Ci0gIGdvdG8geXluZXdzdGF0ZTsKLX0KLSNsaW5lIDYyNCAiZi1leHAueSIKLQotCi0vKiBUYWtlIGNhcmUgb2YgcGFyc2luZyBhIG51bWJlciAoYW55dGhpbmcgdGhhdCBzdGFydHMgd2l0aCBhIGRpZ2l0KS4KLSAgIFNldCB5eWx2YWwgYW5kIHJldHVybiB0aGUgdG9rZW4gdHlwZTsgdXBkYXRlIGxleHB0ci4KLSAgIExFTiBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gaXQuICAqLwotCi0vKioqIE5lZWRzIHNvbWUgZXJyb3IgY2hlY2tpbmcgZm9yIHRoZSBmbG9hdCBjYXNlICoqKi8KLQotc3RhdGljIGludAotcGFyc2VfbnVtYmVyIChwLCBsZW4sIHBhcnNlZF9mbG9hdCwgcHV0aXRoZXJlKQotICAgICByZWdpc3RlciBjaGFyICpwOwotICAgICByZWdpc3RlciBpbnQgbGVuOwotICAgICBpbnQgcGFyc2VkX2Zsb2F0OwotICAgICBZWVNUWVBFICpwdXRpdGhlcmU7Ci17Ci0gIHJlZ2lzdGVyIExPTkdFU1QgbiA9IDA7Ci0gIHJlZ2lzdGVyIExPTkdFU1QgcHJldm4gPSAwOwotICByZWdpc3RlciBpbnQgaTsKLSAgcmVnaXN0ZXIgaW50IGM7Ci0gIHJlZ2lzdGVyIGludCBiYXNlID0gaW5wdXRfcmFkaXg7Ci0gIGludCB1bnNpZ25lZF9wID0gMDsKLSAgaW50IGxvbmdfcCA9IDA7Ci0gIFVMT05HRVNUIGhpZ2hfYml0OwotICBzdHJ1Y3QgdHlwZSAqc2lnbmVkX3R5cGU7Ci0gIHN0cnVjdCB0eXBlICp1bnNpZ25lZF90eXBlOwotCi0gIGlmIChwYXJzZWRfZmxvYXQpCi0gICAgewotICAgICAgLyogSXQncyBhIGZsb2F0IHNpbmNlIGl0IGNvbnRhaW5zIGEgcG9pbnQgb3IgYW4gZXhwb25lbnQuICAqLwotICAgICAgLyogW2REXSBpcyBub3QgdW5kZXJzdG9vZCBhcyBhbiBleHBvbmVudCBieSBhdG9mLCBjaGFuZ2UgaXQgdG8gJ2UnLiAgKi8KLSAgICAgIGNoYXIgKnRtcCwgKnRtcDI7Ci0KLSAgICAgIHRtcCA9IHN0cnNhdmUgKHApOwotICAgICAgZm9yICh0bXAyID0gdG1wOyAqdG1wMjsgKyt0bXAyKQotCWlmICgqdG1wMiA9PSAnZCcgfHwgKnRtcDIgPT0gJ0QnKQotCSAgKnRtcDIgPSAnZSc7Ci0gICAgICBwdXRpdGhlcmUtPmR2YWwgPSBhdG9mICh0bXApOwotICAgICAgZnJlZSAodG1wKTsKLSAgICAgIHJldHVybiBGTE9BVDsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIGJhc2Utc3dpdGNoaW5nIHByZWZpeGVzIDB4LCAwdCwgMGQsIDAgKi8KLSAgaWYgKHBbMF0gPT0gJzAnKQotICAgIHN3aXRjaCAocFsxXSkKLSAgICAgIHsKLSAgICAgIGNhc2UgJ3gnOgotICAgICAgY2FzZSAnWCc6Ci0JaWYgKGxlbiA+PSAzKQotCSAgewotCSAgICBwICs9IDI7Ci0JICAgIGJhc2UgPSAxNjsKLQkgICAgbGVuIC09IDI7Ci0JICB9Ci0JYnJlYWs7Ci0JCi0gICAgICBjYXNlICd0JzoKLSAgICAgIGNhc2UgJ1QnOgotICAgICAgY2FzZSAnZCc6Ci0gICAgICBjYXNlICdEJzoKLQlpZiAobGVuID49IDMpCi0JICB7Ci0JICAgIHAgKz0gMjsKLQkgICAgYmFzZSA9IDEwOwotCSAgICBsZW4gLT0gMjsKLQkgIH0KLQlicmVhazsKLQkKLSAgICAgIGRlZmF1bHQ6Ci0JYmFzZSA9IDg7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIAotICB3aGlsZSAobGVuLS0gPiAwKQotICAgIHsKLSAgICAgIGMgPSAqcCsrOwotICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQotCWMgKz0gJ2EnIC0gJ0EnOwotICAgICAgaWYgKGMgIT0gJ2wnICYmIGMgIT0gJ3UnKQotCW4gKj0gYmFzZTsKLSAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKLQluICs9IGkgPSBjIC0gJzAnOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChiYXNlID4gMTAgJiYgYyA+PSAnYScgJiYgYyA8PSAnZicpCi0JICAgIG4gKz0gaSA9IGMgLSAnYScgKyAxMDsKLQkgIGVsc2UgaWYgKGxlbiA9PSAwICYmIGMgPT0gJ2wnKSAKLSAgICAgICAgICAgIGxvbmdfcCA9IDE7Ci0JICBlbHNlIGlmIChsZW4gPT0gMCAmJiBjID09ICd1JykKLQkgICAgdW5zaWduZWRfcCA9IDE7Ci0JICBlbHNlCi0JICAgIHJldHVybiBFUlJPUjsJLyogQ2hhciBub3QgYSBkaWdpdCAqLwotCX0KLSAgICAgIGlmIChpID49IGJhc2UpCi0JcmV0dXJuIEVSUk9SOwkJLyogSW52YWxpZCBkaWdpdCBpbiB0aGlzIGJhc2UgKi8KLSAgICAgIAotICAgICAgLyogUG9ydGFibHkgdGVzdCBmb3Igb3ZlcmZsb3cgKG9ubHkgd29ya3MgZm9yIG5vbnplcm8gdmFsdWVzLCBzbyBtYWtlCi0JIGEgc2Vjb25kIGNoZWNrIGZvciB6ZXJvKS4gICovCi0gICAgICBpZiAoKHByZXZuID49IG4pICYmIG4gIT0gMCkKLQl1bnNpZ25lZF9wPTE7CQkvKiBUcnkgc29tZXRoaW5nIHVuc2lnbmVkICovCi0gICAgICAvKiBJZiByYW5nZSBjaGVja2luZyBlbmFibGVkLCBwb3J0YWJseSB0ZXN0IGZvciB1bnNpZ25lZCBvdmVyZmxvdy4gICovCi0gICAgICBpZiAoUkFOR0VfQ0hFQ0sgJiYgbiAhPSAwKQotCXsKLQkgIGlmICgodW5zaWduZWRfcCAmJiAodW5zaWduZWQpcHJldm4gPj0gKHVuc2lnbmVkKW4pKQotCSAgICByYW5nZV9lcnJvcigiT3ZlcmZsb3cgb24gbnVtZXJpYyBjb25zdGFudC4iKTsJIAotCX0KLSAgICAgIHByZXZuID0gbjsKLSAgICB9Ci0gIAotICAvKiBJZiB0aGUgbnVtYmVyIGlzIHRvbyBiaWcgdG8gYmUgYW4gaW50LCBvciBpdCdzIGdvdCBhbiBsIHN1ZmZpeAotICAgICB0aGVuIGl0J3MgYSBsb25nLiAgV29yayBvdXQgaWYgdGhpcyBoYXMgdG8gYmUgYSBsb25nIGJ5Ci0gICAgIHNoaWZ0aW5nIHJpZ2h0IGFuZCBhbmQgc2VlaW5nIGlmIGFueXRoaW5nIHJlbWFpbnMsIGFuZCB0aGUKLSAgICAgdGFyZ2V0IGludCBzaXplIGlzIGRpZmZlcmVudCB0byB0aGUgdGFyZ2V0IGxvbmcgc2l6ZS4KLSAgICAgCi0gICAgIEluIHRoZSBleHByZXNzaW9uIGJlbG93LCB3ZSBjb3VsZCBoYXZlIHRlc3RlZAotICAgICAobiA+PiBUQVJHRVRfSU5UX0JJVCkKLSAgICAgdG8gc2VlIGlmIGl0IHdhcyB6ZXJvLAotICAgICBidXQgdG9vIG1hbnkgY29tcGlsZXJzIHdhcm4gYWJvdXQgdGhhdCwgd2hlbiBpbnRzIGFuZCBsb25ncwotICAgICBhcmUgdGhlIHNhbWUgc2l6ZS4gIFNvIHdlIHNoaWZ0IGl0IHR3aWNlLCB3aXRoIGZld2VyIGJpdHMKLSAgICAgZWFjaCB0aW1lLCBmb3IgdGhlIHNhbWUgcmVzdWx0LiAgKi8KLSAgCi0gIGlmICgoVEFSR0VUX0lOVF9CSVQgIT0gVEFSR0VUX0xPTkdfQklUIAotICAgICAgICYmICgobiA+PiAyKSA+PiAoVEFSR0VUX0lOVF9CSVQtMikpKSAgIC8qIEF2b2lkIHNoaWZ0IHdhcm5pbmcgKi8KLSAgICAgIHx8IGxvbmdfcCkKLSAgICB7Ci0gICAgICBoaWdoX2JpdCA9ICgoVUxPTkdFU1QpMSkgPDwgKFRBUkdFVF9MT05HX0JJVC0xKTsKLSAgICAgIHVuc2lnbmVkX3R5cGUgPSBidWlsdGluX3R5cGVfdW5zaWduZWRfbG9uZzsKLSAgICAgIHNpZ25lZF90eXBlID0gYnVpbHRpbl90eXBlX2xvbmc7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIGhpZ2hfYml0ID0gKChVTE9OR0VTVCkxKSA8PCAoVEFSR0VUX0lOVF9CSVQtMSk7Ci0gICAgICB1bnNpZ25lZF90eXBlID0gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2ludDsKLSAgICAgIHNpZ25lZF90eXBlID0gYnVpbHRpbl90eXBlX2ludDsKLSAgICB9ICAgIAotICAKLSAgcHV0aXRoZXJlLT50eXBlZF92YWwudmFsID0gbjsKLSAgCi0gIC8qIElmIHRoZSBoaWdoIGJpdCBvZiB0aGUgd29ya2VkIG91dCB0eXBlIGlzIHNldCB0aGVuIHRoaXMgbnVtYmVyCi0gICAgIGhhcyB0byBiZSB1bnNpZ25lZC4gKi8KLSAgCi0gIGlmICh1bnNpZ25lZF9wIHx8IChuICYgaGlnaF9iaXQpKSAKLSAgICBwdXRpdGhlcmUtPnR5cGVkX3ZhbC50eXBlID0gdW5zaWduZWRfdHlwZTsKLSAgZWxzZSAKLSAgICBwdXRpdGhlcmUtPnR5cGVkX3ZhbC50eXBlID0gc2lnbmVkX3R5cGU7Ci0gIAotICByZXR1cm4gSU5UOwotfQotCi1zdHJ1Y3QgdG9rZW4KLXsKLSAgY2hhciAqb3BlcmF0b3I7Ci0gIGludCB0b2tlbjsKLSAgZW51bSBleHBfb3Bjb2RlIG9wY29kZTsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rZW4gZG90X29wc1tdID0KLXsKLSAgeyAiLmFuZC4iLCBCT09MX0FORCwgQklOT1BfRU5EIH0sCi0gIHsgIi5BTkQuIiwgQk9PTF9BTkQsIEJJTk9QX0VORCB9LAotICB7ICIub3IuIiwgQk9PTF9PUiwgQklOT1BfRU5EIH0sCi0gIHsgIi5PUi4iLCBCT09MX09SLCBCSU5PUF9FTkQgfSwKLSAgeyAiLm5vdC4iLCBCT09MX05PVCwgQklOT1BfRU5EIH0sCi0gIHsgIi5OT1QuIiwgQk9PTF9OT1QsIEJJTk9QX0VORCB9LAotICB7ICIuZXEuIiwgRVFVQUwsIEJJTk9QX0VORCB9LAotICB7ICIuRVEuIiwgRVFVQUwsIEJJTk9QX0VORCB9LAotICB7ICIuZXF2LiIsIEVRVUFMLCBCSU5PUF9FTkQgfSwKLSAgeyAiLk5FUVYuIiwgTk9URVFVQUwsIEJJTk9QX0VORCB9LAotICB7ICIubmVxdi4iLCBOT1RFUVVBTCwgQklOT1BfRU5EIH0sCi0gIHsgIi5FUVYuIiwgRVFVQUwsIEJJTk9QX0VORCB9LAotICB7ICIubmUuIiwgTk9URVFVQUwsIEJJTk9QX0VORCB9LAotICB7ICIuTkUuIiwgTk9URVFVQUwsIEJJTk9QX0VORCB9LAotICB7ICIubGUuIiwgTEVRLCBCSU5PUF9FTkQgfSwKLSAgeyAiLkxFLiIsIExFUSwgQklOT1BfRU5EIH0sCi0gIHsgIi5nZS4iLCBHRVEsIEJJTk9QX0VORCB9LAotICB7ICIuR0UuIiwgR0VRLCBCSU5PUF9FTkQgfSwKLSAgeyAiLmd0LiIsIEdSRUFURVJUSEFOLCBCSU5PUF9FTkQgfSwKLSAgeyAiLkdULiIsIEdSRUFURVJUSEFOLCBCSU5PUF9FTkQgfSwKLSAgeyAiLmx0LiIsIExFU1NUSEFOLCBCSU5PUF9FTkQgfSwKLSAgeyAiLkxULiIsIExFU1NUSEFOLCBCSU5PUF9FTkQgfSwKLSAgeyBOVUxMLCAwLCAwIH0KLX07Ci0KLXN0cnVjdCBmNzdfYm9vbGVhbl92YWwgCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCB2YWx1ZTsKLX07IAotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGY3N19ib29sZWFuX3ZhbCBib29sZWFuX3ZhbHVlc1tdICA9IAotewotICB7ICIudHJ1ZS4iLCAxIH0sCi0gIHsgIi5UUlVFLiIsIDEgfSwKLSAgeyAiLmZhbHNlLiIsIDAgfSwKLSAgeyAiLkZBTFNFLiIsIDAgfSwKLSAgeyBOVUxMLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rZW4gZjc3X2tleXdvcmRzW10gPSAKLXsKLSAgeyAiY29tcGxleF8xNiIsIENPTVBMRVhfUzE2X0tFWVdPUkQsIEJJTk9QX0VORCB9LAotICB7ICJjb21wbGV4XzMyIiwgQ09NUExFWF9TMzJfS0VZV09SRCwgQklOT1BfRU5EIH0sCi0gIHsgImNoYXJhY3RlciIsIENIQVJBQ1RFUiwgQklOT1BfRU5EIH0sCi0gIHsgImludGVnZXJfMiIsIElOVF9TMl9LRVlXT1JELCBCSU5PUF9FTkQgfSwKLSAgeyAibG9naWNhbF8xIiwgTE9HSUNBTF9TMV9LRVlXT1JELCBCSU5PUF9FTkQgfSwKLSAgeyAibG9naWNhbF8yIiwgTE9HSUNBTF9TMl9LRVlXT1JELCBCSU5PUF9FTkQgfSwKLSAgeyAiY29tcGxleF84IiwgQ09NUExFWF9TOF9LRVlXT1JELCBCSU5PUF9FTkQgfSwKLSAgeyAiaW50ZWdlciIsIElOVF9LRVlXT1JELCBCSU5PUF9FTkQgfSwKLSAgeyAibG9naWNhbCIsIExPR0lDQUxfS0VZV09SRCwgQklOT1BfRU5EIH0sCi0gIHsgInJlYWxfMTYiLCBSRUFMX1MxNl9LRVlXT1JELCBCSU5PUF9FTkQgfSwKLSAgeyAiY29tcGxleCIsIENPTVBMRVhfUzhfS0VZV09SRCwgQklOT1BfRU5EIH0sCi0gIHsgInNpemVvZiIsIFNJWkVPRiwgQklOT1BfRU5EIH0sCi0gIHsgInJlYWxfOCIsIFJFQUxfUzhfS0VZV09SRCwgQklOT1BfRU5EIH0sCi0gIHsgInJlYWwiLCBSRUFMX0tFWVdPUkQsIEJJTk9QX0VORCB9LAotICB7IE5VTEwsIDAsIDAgfQotfTsgCi0KLS8qIEltcGxlbWVudGF0aW9uIG9mIGEgZHluYW1pY2FsbHkgZXhwYW5kYWJsZSBidWZmZXIgZm9yIHByb2Nlc3NpbmcgaW5wdXQKLSAgIGNoYXJhY3RlcnMgYWNxdWlyZWQgdGhyb3VnaCBsZXhwdHIgYW5kIGJ1aWxkaW5nIGEgdmFsdWUgdG8gcmV0dXJuIGluCi0gICB5eWx2YWwuIFJpcHBlZCBvZmYgZnJvbSBjaC1leHAueSAqLyAKLQotc3RhdGljIGNoYXIgKnRlbXBidWY7CQkvKiBDdXJyZW50IGJ1ZmZlciBjb250ZW50cyAqLwotc3RhdGljIGludCB0ZW1wYnVmc2l6ZTsJCS8qIFNpemUgb2YgYWxsb2NhdGVkIGJ1ZmZlciAqLwotc3RhdGljIGludCB0ZW1wYnVmaW5kZXg7CS8qIEN1cnJlbnQgaW5kZXggaW50byBidWZmZXIgKi8KLQotI2RlZmluZSBHUk9XQllfTUlOX1NJWkUgNjQJLyogTWluaW11bSBhbW91bnQgdG8gZ3JvdyBidWZmZXIgYnkgKi8KLQotI2RlZmluZSBDSEVDS0JVRihzaXplKSBcCi0gIGRvIHsgXAotICAgIGlmICh0ZW1wYnVmaW5kZXggKyAoc2l6ZSkgPj0gdGVtcGJ1ZnNpemUpIFwKLSAgICAgIHsgXAotCWdyb3didWZfYnlfc2l6ZSAoc2l6ZSk7IFwKLSAgICAgIH0gXAotICB9IHdoaWxlICgwKTsKLQotCi0vKiBHcm93IHRoZSBzdGF0aWMgdGVtcCBidWZmZXIgaWYgbmVjZXNzYXJ5LCBpbmNsdWRpbmcgYWxsb2NhdGluZyB0aGUgZmlyc3Qgb25lCi0gICBvbiBkZW1hbmQuICovCi0KLXN0YXRpYyB2b2lkCi1ncm93YnVmX2J5X3NpemUgKGNvdW50KQotICAgICBpbnQgY291bnQ7Ci17Ci0gIGludCBncm93Ynk7Ci0KLSAgZ3Jvd2J5ID0gbWF4IChjb3VudCwgR1JPV0JZX01JTl9TSVpFKTsKLSAgdGVtcGJ1ZnNpemUgKz0gZ3Jvd2J5OwotICBpZiAodGVtcGJ1ZiA9PSBOVUxMKQotICAgIHRlbXBidWYgPSAoY2hhciAqKSB4bWFsbG9jICh0ZW1wYnVmc2l6ZSk7Ci0gIGVsc2UKLSAgICB0ZW1wYnVmID0gKGNoYXIgKikgeHJlYWxsb2MgKHRlbXBidWYsIHRlbXBidWZzaXplKTsKLX0KLQotLyogQmxhdGFudGx5IHJpcHBlZCBvZmYgZnJvbSBjaC1leHAueS4gVGhpcyByb3V0aW5lIHJlY29nbml6ZXMgRjc3IAotICAgc3RyaW5nLWxpdGVyYWxzLiAKLSAgIAotICAgUmVjb2duaXplIGEgc3RyaW5nIGxpdGVyYWwuICBBIHN0cmluZyBsaXRlcmFsIGlzIGEgbm9uemVybyBzZXF1ZW5jZQotICAgb2YgY2hhcmFjdGVycyBlbmNsb3NlZCBpbiBtYXRjaGluZyBzaW5nbGUgcXVvdGVzLCBleGNlcHQgdGhhdAotICAgYSBzaW5nbGUgY2hhcmFjdGVyIGluc2lkZSBzaW5nbGUgcXVvdGVzIGlzIGEgY2hhcmFjdGVyIGxpdGVyYWwsIHdoaWNoCi0gICB3ZSByZWplY3QgYXMgYSBzdHJpbmcgbGl0ZXJhbC4gIFRvIGVtYmVkIHRoZSB0ZXJtaW5hdG9yIGNoYXJhY3RlciBpbnNpZGUKLSAgIGEgc3RyaW5nLCBpdCBpcyBzaW1wbHkgZG91YmxlZCAoSS5FLiAndGhpcycnaXMnJ29uZScnc3RyaW5nJykgKi8KLQotc3RhdGljIGludAotbWF0Y2hfc3RyaW5nX2xpdGVyYWwgKCkKLXsKLSAgY2hhciAqdG9rcHRyID0gbGV4cHRyOwotCi0gIGZvciAodGVtcGJ1ZmluZGV4ID0gMCwgdG9rcHRyKys7ICp0b2twdHIgIT0gJ1wwJzsgdG9rcHRyKyspCi0gICAgewotICAgICAgQ0hFQ0tCVUYgKDEpOwotICAgICAgaWYgKCp0b2twdHIgPT0gKmxleHB0cikKLQl7Ci0JICBpZiAoKih0b2twdHIgKyAxKSA9PSAqbGV4cHRyKQotCSAgICB0b2twdHIrKzsKLQkgIGVsc2UKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgdGVtcGJ1Zlt0ZW1wYnVmaW5kZXgrK10gPSAqdG9rcHRyOwotICAgIH0KLSAgaWYgKCp0b2twdHIgPT0gJ1wwJwkJCQkJLyogbm8gdGVybWluYXRvciAqLwotICAgICAgfHwgdGVtcGJ1ZmluZGV4ID09IDApCQkJCS8qIG5vIHN0cmluZyAqLwotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgewotICAgICAgdGVtcGJ1Zlt0ZW1wYnVmaW5kZXhdID0gJ1wwJzsKLSAgICAgIHl5bHZhbC5zdmFsLnB0ciA9IHRlbXBidWY7Ci0gICAgICB5eWx2YWwuc3ZhbC5sZW5ndGggPSB0ZW1wYnVmaW5kZXg7Ci0gICAgICBsZXhwdHIgPSArK3Rva3B0cjsKLSAgICAgIHJldHVybiBTVFJJTkdfTElURVJBTDsKLSAgICB9Ci19Ci0KLS8qIFJlYWQgb25lIHRva2VuLCBnZXR0aW5nIGNoYXJhY3RlcnMgdGhyb3VnaCBsZXhwdHIuICAqLwotCi1zdGF0aWMgaW50Ci15eWxleCAoKQotewotICBpbnQgYzsKLSAgaW50IG5hbWVsZW47Ci0gIHVuc2lnbmVkIGludCBpLHRva2VuOwotICBjaGFyICp0b2tzdGFydDsKLSAgCi0gcmV0cnk6Ci0gIAotICB0b2tzdGFydCA9IGxleHB0cjsKLSAgCi0gIC8qIEZpcnN0IG9mIGFsbCwgbGV0IHVzIG1ha2Ugc3VyZSB3ZSBhcmUgbm90IGRlYWxpbmcgd2l0aCB0aGUgCi0gICAgIHNwZWNpYWwgdG9rZW5zIC50cnVlLiBhbmQgLmZhbHNlLiB3aGljaCBldmFsdWF0ZSB0byAxIGFuZCAwLiAgKi8KLSAgCi0gIGlmICgqbGV4cHRyID09ICcuJykKLSAgICB7IAotICAgICAgZm9yIChpID0gMDsgYm9vbGVhbl92YWx1ZXNbaV0ubmFtZSAhPSBOVUxMOyBpKyspCi0JewotCSAgaWYgU1RSRVFOICh0b2tzdGFydCwgYm9vbGVhbl92YWx1ZXNbaV0ubmFtZSwKLQkJICAgIHN0cmxlbiAoYm9vbGVhbl92YWx1ZXNbaV0ubmFtZSkpCi0JICAgIHsKLQkgICAgICBsZXhwdHIgKz0gc3RybGVuIChib29sZWFuX3ZhbHVlc1tpXS5uYW1lKTsgCi0JICAgICAgeXlsdmFsLmx2YWwgPSBib29sZWFuX3ZhbHVlc1tpXS52YWx1ZTsgCi0JICAgICAgcmV0dXJuIEJPT0xFQU5fTElURVJBTDsKLQkgICAgfQotCX0KLSAgICB9Ci0gIAotICAvKiBTZWUgaWYgaXQgaXMgYSBzcGVjaWFsIC5mb28uIG9wZXJhdG9yICovCi0gIAotICBmb3IgKGkgPSAwOyBkb3Rfb3BzW2ldLm9wZXJhdG9yICE9IE5VTEw7IGkrKykKLSAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgZG90X29wc1tpXS5vcGVyYXRvciwgc3RybGVuIChkb3Rfb3BzW2ldLm9wZXJhdG9yKSkpCi0gICAgICB7Ci0JbGV4cHRyICs9IHN0cmxlbiAoZG90X29wc1tpXS5vcGVyYXRvcik7Ci0JeXlsdmFsLm9wY29kZSA9IGRvdF9vcHNbaV0ub3Bjb2RlOwotCXJldHVybiBkb3Rfb3BzW2ldLnRva2VuOwotICAgICAgfQotICAKLSAgc3dpdGNoIChjID0gKnRva3N0YXJ0KQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICByZXR1cm4gMDsKLSAgICAgIAotICAgIGNhc2UgJyAnOgotICAgIGNhc2UgJ1x0JzoKLSAgICBjYXNlICdcbic6Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIGdvdG8gcmV0cnk7Ci0gICAgICAKLSAgICBjYXNlICdcJyc6Ci0gICAgICB0b2tlbiA9IG1hdGNoX3N0cmluZ19saXRlcmFsICgpOwotICAgICAgaWYgKHRva2VuICE9IDApCi0JcmV0dXJuICh0b2tlbik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgJygnOgotICAgICAgcGFyZW5fZGVwdGgrKzsKLSAgICAgIGxleHB0cisrOwotICAgICAgcmV0dXJuIGM7Ci0gICAgICAKLSAgICBjYXNlICcpJzoKLSAgICAgIGlmIChwYXJlbl9kZXB0aCA9PSAwKQotCXJldHVybiAwOwotICAgICAgcGFyZW5fZGVwdGgtLTsKLSAgICAgIGxleHB0cisrOwotICAgICAgcmV0dXJuIGM7Ci0gICAgICAKLSAgICBjYXNlICcsJzoKLSAgICAgIGlmIChjb21tYV90ZXJtaW5hdGVzICYmIHBhcmVuX2RlcHRoID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIHJldHVybiBjOwotICAgICAgCi0gICAgY2FzZSAnLic6Ci0gICAgICAvKiBNaWdodCBiZSBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4gICovCi0gICAgICBpZiAobGV4cHRyWzFdIDwgJzAnIHx8IGxleHB0clsxXSA+ICc5JykKLQlnb3RvIHN5bWJvbDsJCS8qIE5vcGUsIG11c3QgYmUgYSBzeW1ib2wuICovCi0gICAgICAvKiBGQUxMIFRIUlUgaW50byBudW1iZXIgY2FzZS4gICovCi0gICAgICAKLSAgICBjYXNlICcwJzoKLSAgICBjYXNlICcxJzoKLSAgICBjYXNlICcyJzoKLSAgICBjYXNlICczJzoKLSAgICBjYXNlICc0JzoKLSAgICBjYXNlICc1JzoKLSAgICBjYXNlICc2JzoKLSAgICBjYXNlICc3JzoKLSAgICBjYXNlICc4JzoKLSAgICBjYXNlICc5JzoKLSAgICAgIHsKLSAgICAgICAgLyogSXQncyBhIG51bWJlci4gICovCi0JaW50IGdvdF9kb3QgPSAwLCBnb3RfZSA9IDAsIGdvdF9kID0gMCwgdG9rdHlwZTsKLQlyZWdpc3RlciBjaGFyICpwID0gdG9rc3RhcnQ7Ci0JaW50IGhleCA9IGlucHV0X3JhZGl4ID4gMTA7Ci0JCi0JaWYgKGMgPT0gJzAnICYmIChwWzFdID09ICd4JyB8fCBwWzFdID09ICdYJykpCi0JICB7Ci0JICAgIHAgKz0gMjsKLQkgICAgaGV4ID0gMTsKLQkgIH0KLQllbHNlIGlmIChjID09ICcwJyAmJiAocFsxXT09J3QnIHx8IHBbMV09PSdUJyB8fCBwWzFdPT0nZCcgfHwgcFsxXT09J0QnKSkKLQkgIHsKLQkgICAgcCArPSAyOwotCSAgICBoZXggPSAwOwotCSAgfQotCQotCWZvciAoOzsgKytwKQotCSAgewotCSAgICBpZiAoIWhleCAmJiAhZ290X2UgJiYgKCpwID09ICdlJyB8fCAqcCA9PSAnRScpKQotCSAgICAgIGdvdF9kb3QgPSBnb3RfZSA9IDE7Ci0JICAgIGVsc2UgaWYgKCFoZXggJiYgIWdvdF9kICYmICgqcCA9PSAnZCcgfHwgKnAgPT0gJ0QnKSkKLQkgICAgICBnb3RfZG90ID0gZ290X2QgPSAxOwotCSAgICBlbHNlIGlmICghaGV4ICYmICFnb3RfZG90ICYmICpwID09ICcuJykKLQkgICAgICBnb3RfZG90ID0gMTsKLQkgICAgZWxzZSBpZiAoKChnb3RfZSAmJiAocFstMV0gPT0gJ2UnIHx8IHBbLTFdID09ICdFJykpCi0JCSAgICAgfHwgKGdvdF9kICYmIChwWy0xXSA9PSAnZCcgfHwgcFstMV0gPT0gJ0QnKSkpCi0JCSAgICAgJiYgKCpwID09ICctJyB8fCAqcCA9PSAnKycpKQotCSAgICAgIC8qIFRoaXMgaXMgdGhlIHNpZ24gb2YgdGhlIGV4cG9uZW50LCBub3QgdGhlIGVuZCBvZiB0aGUKLQkJIG51bWJlci4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIC8qIFdlIHdpbGwgdGFrZSBhbnkgbGV0dGVycyBvciBkaWdpdHMuICBwYXJzZV9udW1iZXIgd2lsbAotCSAgICAgICBjb21wbGFpbiBpZiBwYXN0IHRoZSByYWRpeCwgb3IgaWYgTCBvciBVIGFyZSBub3QgZmluYWwuICAqLwotCSAgICBlbHNlIGlmICgoKnAgPCAnMCcgfHwgKnAgPiAnOScpCi0JCSAgICAgJiYgKCgqcCA8ICdhJyB8fCAqcCA+ICd6JykKLQkJCSAmJiAoKnAgPCAnQScgfHwgKnAgPiAnWicpKSkKLQkgICAgICBicmVhazsKLQkgIH0KLQl0b2t0eXBlID0gcGFyc2VfbnVtYmVyICh0b2tzdGFydCwgcCAtIHRva3N0YXJ0LCBnb3RfZG90fGdvdF9lfGdvdF9kLAotCQkJCSZ5eWx2YWwpOwotICAgICAgICBpZiAodG9rdHlwZSA9PSBFUlJPUikKLSAgICAgICAgICB7Ci0JICAgIGNoYXIgKmVycl9jb3B5ID0gKGNoYXIgKikgYWxsb2NhIChwIC0gdG9rc3RhcnQgKyAxKTsKLQkgICAgCi0JICAgIG1lbWNweSAoZXJyX2NvcHksIHRva3N0YXJ0LCBwIC0gdG9rc3RhcnQpOwotCSAgICBlcnJfY29weVtwIC0gdG9rc3RhcnRdID0gMDsKLQkgICAgZXJyb3IgKCJJbnZhbGlkIG51bWJlciBcIiVzXCIuIiwgZXJyX2NvcHkpOwotCSAgfQotCWxleHB0ciA9IHA7Ci0JcmV0dXJuIHRva3R5cGU7Ci0gICAgICB9Ci0gICAgICAKLSAgICBjYXNlICcrJzoKLSAgICBjYXNlICctJzoKLSAgICBjYXNlICcqJzoKLSAgICBjYXNlICcvJzoKLSAgICBjYXNlICclJzoKLSAgICBjYXNlICd8JzoKLSAgICBjYXNlICcmJzoKLSAgICBjYXNlICdeJzoKLSAgICBjYXNlICd+JzoKLSAgICBjYXNlICchJzoKLSAgICBjYXNlICdAJzoKLSAgICBjYXNlICc8JzoKLSAgICBjYXNlICc+JzoKLSAgICBjYXNlICdbJzoKLSAgICBjYXNlICddJzoKLSAgICBjYXNlICc/JzoKLSAgICBjYXNlICc6JzoKLSAgICBjYXNlICc9JzoKLSAgICBjYXNlICd7JzoKLSAgICBjYXNlICd9JzoKLSAgICBzeW1ib2w6Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIHJldHVybiBjOwotICAgIH0KLSAgCi0gIGlmICghKGMgPT0gJ18nIHx8IGMgPT0gJyQnCi0JfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpKSkKLSAgICAvKiBXZSBtdXN0IGhhdmUgY29tZSBhY3Jvc3MgYSBiYWQgY2hhcmFjdGVyIChlLmcuICc7JykuICAqLwotICAgIGVycm9yICgiSW52YWxpZCBjaGFyYWN0ZXIgJyVjJyBpbiBleHByZXNzaW9uLiIsIGMpOwotICAKLSAgbmFtZWxlbiA9IDA7Ci0gIGZvciAoYyA9IHRva3N0YXJ0W25hbWVsZW5dOwotICAgICAgIChjID09ICdfJyB8fCBjID09ICckJyB8fCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIAotCXx8IChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSk7IAotICAgICAgIGMgPSB0b2tzdGFydFsrK25hbWVsZW5dKTsKLSAgCi0gIC8qIFRoZSB0b2tlbiAiaWYiIHRlcm1pbmF0ZXMgdGhlIGV4cHJlc3Npb24gYW5kIGlzIE5PVCAKLSAgICAgcmVtb3ZlZCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uICAqLwotICAKLSAgaWYgKG5hbWVsZW4gPT0gMiAmJiB0b2tzdGFydFswXSA9PSAnaScgJiYgdG9rc3RhcnRbMV0gPT0gJ2YnKQotICAgIHJldHVybiAwOwotICAKLSAgbGV4cHRyICs9IG5hbWVsZW47Ci0gIAotICAvKiBDYXRjaCBzcGVjaWZpYyBrZXl3b3Jkcy4gICovCi0gIAotICBmb3IgKGkgPSAwOyBmNzdfa2V5d29yZHNbaV0ub3BlcmF0b3IgIT0gTlVMTDsgaSsrKQotICAgIGlmIChTVFJFUU4odG9rc3RhcnQsIGY3N19rZXl3b3Jkc1tpXS5vcGVyYXRvciwKLSAgICAgICAgICAgICAgIHN0cmxlbihmNzdfa2V5d29yZHNbaV0ub3BlcmF0b3IpKSkKLSAgICAgIHsKLQkvKiAJbGV4cHRyICs9IHN0cmxlbihmNzdfa2V5d29yZHNbaV0ub3BlcmF0b3IpOyAqLyAKLQl5eWx2YWwub3Bjb2RlID0gZjc3X2tleXdvcmRzW2ldLm9wY29kZTsKLQlyZXR1cm4gZjc3X2tleXdvcmRzW2ldLnRva2VuOwotICAgICAgfQotICAKLSAgeXlsdmFsLnN2YWwucHRyID0gdG9rc3RhcnQ7Ci0gIHl5bHZhbC5zdmFsLmxlbmd0aCA9IG5hbWVsZW47Ci0gIAotICBpZiAoKnRva3N0YXJ0ID09ICckJykKLSAgICB7Ci0gICAgICB3cml0ZV9kb2xsYXJfdmFyaWFibGUgKHl5bHZhbC5zdmFsKTsKLSAgICAgIHJldHVybiBWQVJJQUJMRTsKLSAgICB9Ci0gIAotICAvKiBVc2UgdG9rZW4tdHlwZSBUWVBFTkFNRSBmb3Igc3ltYm9scyB0aGF0IGhhcHBlbiB0byBiZSBkZWZpbmVkCi0gICAgIGN1cnJlbnRseSBhcyBuYW1lcyBvZiB0eXBlczsgTkFNRSBmb3Igb3RoZXIgc3ltYm9scy4KLSAgICAgVGhlIGNhbGxlciBpcyBub3QgY29uc3RyYWluZWQgdG8gY2FyZSBhYm91dCB0aGUgZGlzdGluY3Rpb24uICAqLwotICB7Ci0gICAgY2hhciAqdG1wID0gY29weV9uYW1lICh5eWx2YWwuc3ZhbCk7Ci0gICAgc3RydWN0IHN5bWJvbCAqc3ltOwotICAgIGludCBpc19hX2ZpZWxkX29mX3RoaXMgPSAwOwotICAgIGludCBoZXh0eXBlOwotICAgIAotICAgIHN5bSA9IGxvb2t1cF9zeW1ib2wgKHRtcCwgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrLAotCQkJIFZBUl9OQU1FU1BBQ0UsCi0JCQkgY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfY3BsdXMKLQkJCSA/ICZpc19hX2ZpZWxkX29mX3RoaXMgOiBOVUxMLAotCQkJIE5VTEwpOwotICAgIGlmIChzeW0gJiYgU1lNQk9MX0NMQVNTIChzeW0pID09IExPQ19UWVBFREVGKQotICAgICAgewotCXl5bHZhbC50c3ltLnR5cGUgPSBTWU1CT0xfVFlQRSAoc3ltKTsKLQlyZXR1cm4gVFlQRU5BTUU7Ci0gICAgICB9Ci0gICAgaWYgKCh5eWx2YWwudHN5bS50eXBlID0gbG9va3VwX3ByaW1pdGl2ZV90eXBlbmFtZSAodG1wKSkgIT0gMCkKLSAgICAgIHJldHVybiBUWVBFTkFNRTsKLSAgICAKLSAgICAvKiBJbnB1dCBuYW1lcyB0aGF0IGFyZW4ndCBzeW1ib2xzIGJ1dCBBUkUgdmFsaWQgaGV4IG51bWJlcnMsCi0gICAgICAgd2hlbiB0aGUgaW5wdXQgcmFkaXggcGVybWl0cyB0aGVtLCBjYW4gYmUgbmFtZXMgb3IgbnVtYmVycwotICAgICAgIGRlcGVuZGluZyBvbiB0aGUgcGFyc2UuICBOb3RlIHdlIHN1cHBvcnQgcmFkaXhlcyA+IDE2IGhlcmUuICAqLwotICAgIGlmICghc3ltCi0JJiYgKCh0b2tzdGFydFswXSA+PSAnYScgJiYgdG9rc3RhcnRbMF0gPCAnYScgKyBpbnB1dF9yYWRpeCAtIDEwKQotCSAgICB8fCAodG9rc3RhcnRbMF0gPj0gJ0EnICYmIHRva3N0YXJ0WzBdIDwgJ0EnICsgaW5wdXRfcmFkaXggLSAxMCkpKQotICAgICAgewotIAlZWVNUWVBFIG5ld2x2YWw7CS8qIEl0cyB2YWx1ZSBpcyBpZ25vcmVkLiAgKi8KLQloZXh0eXBlID0gcGFyc2VfbnVtYmVyICh0b2tzdGFydCwgbmFtZWxlbiwgMCwgJm5ld2x2YWwpOwotCWlmIChoZXh0eXBlID09IElOVCkKLQkgIHsKLQkgICAgeXlsdmFsLnNzeW0uc3ltID0gc3ltOwotCSAgICB5eWx2YWwuc3N5bS5pc19hX2ZpZWxkX29mX3RoaXMgPSBpc19hX2ZpZWxkX29mX3RoaXM7Ci0JICAgIHJldHVybiBOQU1FX09SX0lOVDsKLQkgIH0KLSAgICAgIH0KLSAgICAKLSAgICAvKiBBbnkgb3RoZXIga2luZCBvZiBzeW1ib2wgKi8KLSAgICB5eWx2YWwuc3N5bS5zeW0gPSBzeW07Ci0gICAgeXlsdmFsLnNzeW0uaXNfYV9maWVsZF9vZl90aGlzID0gaXNfYV9maWVsZF9vZl90aGlzOwotICAgIHJldHVybiBOQU1FOwotICB9Ci19Ci0KLXZvaWQKLXl5ZXJyb3IgKG1zZykKLSAgICAgY2hhciAqbXNnOwotewotICBlcnJvciAoIkEgJXMgaW4gZXhwcmVzc2lvbiwgbmVhciBgJXMnLiIsIChtc2cgPyBtc2cgOiAiZXJyb3IiKSwgbGV4cHRyKTsKLX0KZGlmZiAtLWdpdCBhL2dkYi9qdi1leHAudGFiLmMgYi9nZGIvanYtZXhwLnRhYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTkyMGNhLi4wMDAwMDAwCi0tLSBhL2dkYi9qdi1leHAudGFiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUxICswLDAgQEAKLQotLyogIEEgQmlzb24gcGFyc2VyLCBtYWRlIGZyb20ganYtZXhwLnkKLSBieSAgR05VIEJpc29uIHZlcnNpb24gMS4yNQotICAqLwotCi0jZGVmaW5lIFlZQklTT04gMSAgLyogSWRlbnRpZnkgQmlzb24gb3V0cHV0LiAgKi8KLQotI2RlZmluZQlJTlRFR0VSX0xJVEVSQUwJMjU4Ci0jZGVmaW5lCUZMT0FUSU5HX1BPSU5UX0xJVEVSQUwJMjU5Ci0jZGVmaW5lCUlERU5USUZJRVIJMjYwCi0jZGVmaW5lCVNUUklOR19MSVRFUkFMCTI2MQotI2RlZmluZQlCT09MRUFOX0xJVEVSQUwJMjYyCi0jZGVmaW5lCVRZUEVOQU1FCTI2MwotI2RlZmluZQlOQU1FX09SX0lOVAkyNjQKLSNkZWZpbmUJRVJST1IJMjY1Ci0jZGVmaW5lCUxPTkcJMjY2Ci0jZGVmaW5lCVNIT1JUCTI2NwotI2RlZmluZQlCWVRFCTI2OAotI2RlZmluZQlJTlQJMjY5Ci0jZGVmaW5lCUNIQVIJMjcwCi0jZGVmaW5lCUJPT0xFQU4JMjcxCi0jZGVmaW5lCURPVUJMRQkyNzIKLSNkZWZpbmUJRkxPQVQJMjczCi0jZGVmaW5lCVZBUklBQkxFCTI3NAotI2RlZmluZQlBU1NJR05fTU9ESUZZCTI3NQotI2RlZmluZQlUSElTCTI3NgotI2RlZmluZQlTVVBFUgkyNzcKLSNkZWZpbmUJTkVXCTI3OAotI2RlZmluZQlPUk9SCTI3OQotI2RlZmluZQlBTkRBTkQJMjgwCi0jZGVmaW5lCUVRVUFMCTI4MQotI2RlZmluZQlOT1RFUVVBTAkyODIKLSNkZWZpbmUJTEVRCTI4MwotI2RlZmluZQlHRVEJMjg0Ci0jZGVmaW5lCUxTSAkyODUKLSNkZWZpbmUJUlNICTI4NgotI2RlZmluZQlJTkNSRU1FTlQJMjg3Ci0jZGVmaW5lCURFQ1JFTUVOVAkyODgKLQotI2xpbmUgMzggImp2LWV4cC55IgotCi0KLSNpbmNsdWRlICJkZWZzLmgiCi0jaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgotI2luY2x1ZGUgInZhbHVlLmgiCi0jaW5jbHVkZSAicGFyc2VyLWRlZnMuaCIKLSNpbmNsdWRlICJsYW5ndWFnZS5oIgotI2luY2x1ZGUgImp2LWxhbmcuaCIKLSNpbmNsdWRlICJiZmQuaCIgLyogUmVxdWlyZWQgYnkgb2JqZmlsZXMuaC4gICovCi0jaW5jbHVkZSAic3ltZmlsZS5oIiAvKiBSZXF1aXJlZCBieSBvYmpmaWxlcy5oLiAgKi8KLSNpbmNsdWRlICJvYmpmaWxlcy5oIiAvKiBGb3IgaGF2ZV9mdWxsX3N5bWJvbHMgYW5kIGhhdmVfcGFydGlhbF9zeW1ib2xzICovCi0KLS8qIFJlbWFwIG5vcm1hbCB5YWNjIHBhcnNlciBpbnRlcmZhY2UgbmFtZXMgKHl5cGFyc2UsIHl5bGV4LCB5eWVycm9yLCBldGMpLAotICAgYXMgd2VsbCBhcyBncmF0dWl0aW91c2x5IGdsb2JhbCBzeW1ib2wgbmFtZXMsIHNvIHdlIGNhbiBoYXZlIG11bHRpcGxlCi0gICB5YWNjIGdlbmVyYXRlZCBwYXJzZXJzIGluIGdkYi4gIE5vdGUgdGhhdCB0aGVzZSBhcmUgb25seSB0aGUgdmFyaWFibGVzCi0gICBwcm9kdWNlZCBieSB5YWNjLiAgSWYgb3RoZXIgcGFyc2VyIGdlbmVyYXRvcnMgKGJpc29uLCBieWFjYywgZXRjKSBwcm9kdWNlCi0gICBhZGRpdGlvbmFsIGdsb2JhbCBuYW1lcyB0aGF0IGNvbmZsaWN0IGF0IGxpbmsgdGltZSwgdGhlbiB0aG9zZSBwYXJzZXIKLSAgIGdlbmVyYXRvcnMgbmVlZCB0byBiZSBmaXhlZCBpbnN0ZWFkIG9mIGFkZGluZyB0aG9zZSBuYW1lcyB0byB0aGlzIGxpc3QuICovCi0KLSNkZWZpbmUJeXltYXhkZXB0aCBqYXZhX21heGRlcHRoCi0jZGVmaW5lCXl5cGFyc2UJamF2YV9wYXJzZQotI2RlZmluZQl5eWxleAlqYXZhX2xleAotI2RlZmluZQl5eWVycm9yCWphdmFfZXJyb3IKLSNkZWZpbmUJeXlsdmFsCWphdmFfbHZhbAotI2RlZmluZQl5eWNoYXIJamF2YV9jaGFyCi0jZGVmaW5lCXl5ZGVidWcJamF2YV9kZWJ1ZwotI2RlZmluZQl5eXBhY3QJamF2YV9wYWN0CQotI2RlZmluZQl5eXIxCWphdmFfcjEJCQkKLSNkZWZpbmUJeXlyMglqYXZhX3IyCQkJCi0jZGVmaW5lCXl5ZGVmCWphdmFfZGVmCQkKLSNkZWZpbmUJeXljaGsJamF2YV9jaGsJCQotI2RlZmluZQl5eXBnbwlqYXZhX3BnbwkJCi0jZGVmaW5lCXl5YWN0CWphdmFfYWN0CQkKLSNkZWZpbmUJeXlleGNhCWphdmFfZXhjYQotI2RlZmluZSB5eWVycmZsYWcgamF2YV9lcnJmbGFnCi0jZGVmaW5lIHl5bmVycnMJamF2YV9uZXJycwotI2RlZmluZQl5eXBzCWphdmFfcHMKLSNkZWZpbmUJeXlwdglqYXZhX3B2Ci0jZGVmaW5lCXl5cwlqYXZhX3MKLSNkZWZpbmUJeXlfeXlzCWphdmFfeXlzCi0jZGVmaW5lCXl5c3RhdGUJamF2YV9zdGF0ZQotI2RlZmluZQl5eXRtcAlqYXZhX3RtcAotI2RlZmluZQl5eXYJamF2YV92Ci0jZGVmaW5lCXl5X3l5dglqYXZhX3l5dgotI2RlZmluZQl5eXZhbAlqYXZhX3ZhbAotI2RlZmluZQl5eWxsb2MJamF2YV9sbG9jCi0jZGVmaW5lIHl5cmVkcwlqYXZhX3JlZHMJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5dG9rcwlqYXZhX3Rva3MJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5bGhzCWphdmFfeXlsaHMKLSNkZWZpbmUgeXlsZW4JamF2YV95eWxlbgotI2RlZmluZSB5eWRlZnJlZCBqYXZhX3l5ZGVmcmVkCi0jZGVmaW5lIHl5ZGdvdG8JamF2YV95eWRnb3RvCi0jZGVmaW5lIHl5c2luZGV4IGphdmFfeXlzaW5kZXgKLSNkZWZpbmUgeXlyaW5kZXggamF2YV95eXJpbmRleAotI2RlZmluZSB5eWdpbmRleCBqYXZhX3l5Z2luZGV4Ci0jZGVmaW5lIHl5dGFibGUJIGphdmFfeXl0YWJsZQotI2RlZmluZSB5eWNoZWNrCSBqYXZhX3l5Y2hlY2sKLQotI2lmbmRlZiBZWURFQlVHCi0jZGVmaW5lCVlZREVCVUcJMAkJLyogRGVmYXVsdCB0byBubyB5eWRlYnVnIHN1cHBvcnQgKi8KLSNlbmRpZgotCi1pbnQKLXl5cGFyc2UgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgaW50Ci15eWxleCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQKLXl5ZXJyb3IgUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgdHlwZSAqIGphdmFfdHlwZV9mcm9tX25hbWUgUEFSQU1TICgoc3RydWN0IHN0b2tlbikpOwotc3RhdGljIHZvaWQgcHVzaF9leHByZXNzaW9uX25hbWUgUEFSQU1TICgoc3RydWN0IHN0b2tlbikpOwotc3RhdGljIHZvaWQgcHVzaF9maWVsZG5hbWVzIFBBUkFNUyAoKHN0cnVjdCBzdG9rZW4pKTsKLQotc3RhdGljIHN0cnVjdCBleHByZXNzaW9uICpjb3B5X2V4cCBQQVJBTVMgKChzdHJ1Y3QgZXhwcmVzc2lvbiAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGluc2VydF9leHAgUEFSQU1TICgoaW50LCBzdHJ1Y3QgZXhwcmVzc2lvbiAqKSk7Ci0KLQotI2xpbmUgMTI0ICJqdi1leHAueSIKLXR5cGVkZWYgdW5pb24KLSAgewotICAgIExPTkdFU1QgbHZhbDsKLSAgICBzdHJ1Y3QgewotICAgICAgTE9OR0VTVCB2YWw7Ci0gICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKLSAgICB9IHR5cGVkX3ZhbF9pbnQ7Ci0gICAgc3RydWN0IHsKLSAgICAgIERPVUJMRVNUIGR2YWw7Ci0gICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKLSAgICB9IHR5cGVkX3ZhbF9mbG9hdDsKLSAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07Ci0gICAgc3RydWN0IHR5cGUgKnR2YWw7Ci0gICAgc3RydWN0IHN0b2tlbiBzdmFsOwotICAgIHN0cnVjdCB0dHlwZSB0c3ltOwotICAgIHN0cnVjdCBzeW10b2tlbiBzc3ltOwotICAgIHN0cnVjdCBibG9jayAqYnZhbDsKLSAgICBlbnVtIGV4cF9vcGNvZGUgb3Bjb2RlOwotICAgIHN0cnVjdCBpbnRlcm5hbHZhciAqaXZhcjsKLSAgICBpbnQgKml2ZWM7Ci0gIH0gWVlTVFlQRTsKLSNsaW5lIDE0NiAianYtZXhwLnkiCi0KLS8qIFlZU1RZUEUgZ2V0cyBkZWZpbmVkIGJ5ICV1bmlvbiAqLwotc3RhdGljIGludAotcGFyc2VfbnVtYmVyIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBpbnQsIFlZU1RZUEUgKikpOwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZm5kZWYgX19jcGx1c3BsdXMKLSNpZm5kZWYgX19TVERDX18KLSNkZWZpbmUgY29uc3QKLSNlbmRpZgotI2VuZGlmCi0KLQotCi0jZGVmaW5lCVlZRklOQUwJCTIwOAotI2RlZmluZQlZWUZMQUcJCS0zMjc2OAotI2RlZmluZQlZWU5UQkFTRQk1NwotCi0jZGVmaW5lIFlZVFJBTlNMQVRFKHgpICgodW5zaWduZWQpKHgpIDw9IDI4OCA/IHl5dHJhbnNsYXRlW3hdIDogMTEyKQotCi1zdGF0aWMgY29uc3QgY2hhciB5eXRyYW5zbGF0ZVtdID0geyAgICAgMCwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgIDU1LCAgICAgMiwgICAgIDIsICAgICAyLCAgICA0NCwgICAgMzEsICAgICAyLCAgICA0OSwKLSAgICA1MCwgICAgNDIsICAgIDQwLCAgICAyNCwgICAgNDEsICAgIDQ3LCAgICA0MywgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgNTYsICAgICAyLCAgICAzNCwKLSAgICAyNSwgICAgMzUsICAgIDI2LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICA0OCwgICAgIDIsICAgIDUzLCAgICAzMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgIDUxLCAgICAyOSwgICAgNTIsICAgIDU0LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNSwKLSAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwKLSAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI3LCAgICAyOCwKLSAgICAzMiwgICAgMzMsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0NSwgICAgNDYKLX07Ci0KLSNpZiBZWURFQlVHICE9IDAKLXN0YXRpYyBjb25zdCBzaG9ydCB5eXByaHNbXSA9IHsgICAgIDAsCi0gICAgIDAsICAgICAyLCAgICAgNCwgICAgIDYsICAgICA4LCAgICAxMCwgICAgMTIsICAgIDE0LCAgICAxNiwgICAgMTgsCi0gICAgMjAsICAgIDIyLCAgICAyNCwgICAgMjYsICAgIDI4LCAgICAzMCwgICAgMzIsICAgIDM0LCAgICAzNiwgICAgMzgsCi0gICAgNDAsICAgIDQyLCAgICA0NCwgICAgNDYsICAgIDQ4LCAgICA1MSwgICAgNTQsICAgIDU2LCAgICA1OCwgICAgNjAsCi0gICAgNjIsICAgIDY0LCAgICA2NiwgICAgNzAsICAgIDcyLCAgICA3NiwgICAgNzgsICAgIDgwLCAgICA4MiwgICAgODQsCi0gICAgODgsICAgIDkwLCAgICA5MiwgICAgOTQsICAgIDk2LCAgIDEwMCwgICAxMDIsICAgMTA0LCAgIDExMCwgICAxMTIsCi0gICAxMTYsICAgMTE3LCAgIDExOSwgICAxMjQsICAgMTI5LCAgIDEzMSwgICAxMzQsICAgMTM4LCAgIDE0MSwgICAxNDUsCi0gICAxNDcsICAgMTQ4LCAgIDE1MiwgICAxNTYsICAgMTYxLCAgIDE2OCwgICAxNzUsICAgMTgwLCAgIDE4NSwgICAxOTAsCi0gICAxOTIsICAgMTk0LCAgIDE5NiwgICAxOTgsICAgMjAwLCAgIDIwMywgICAyMDYsICAgMjA4LCAgIDIxMCwgICAyMTMsCi0gICAyMTYsICAgMjE5LCAgIDIyMSwgICAyMjQsICAgMjI3LCAgIDIyOSwgICAyMzIsICAgMjM1LCAgIDIzNywgICAyNDMsCi0gICAyNDgsICAgMjU0LCAgIDI1NiwgICAyNjAsICAgMjY0LCAgIDI2OCwgICAyNzAsICAgMjc0LCAgIDI3OCwgICAyODAsCi0gICAyODQsICAgMjg4LCAgIDI5MCwgICAyOTQsICAgMjk4LCAgIDMwMiwgICAzMDYsICAgMzA4LCAgIDMxMiwgICAzMTYsCi0gICAzMTgsICAgMzIyLCAgIDMyNCwgICAzMjgsICAgMzMwLCAgIDMzNCwgICAzMzYsICAgMzQwLCAgIDM0MiwgICAzNDYsCi0gICAzNDgsICAgMzU0LCAgIDM1NiwgICAzNTgsICAgMzYyLCAgIDM2NiwgICAzNjgsICAgMzcwLCAgIDM3MiwgICAzNzQKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXJoc1tdID0geyAgICA3MywKLSAgICAgMCwgICAgNTgsICAgICAwLCAgICA1OSwgICAgIDAsICAgIDYyLCAgICAgMCwgICAgNjgsICAgICAwLCAgICAgNiwKLSAgICAgMCwgICAgIDMsICAgICAwLCAgICAgOSwgICAgIDAsICAgICA0LCAgICAgMCwgICAgIDcsICAgICAwLCAgICA2MCwKLSAgICAgMCwgICAgNjMsICAgICAwLCAgICAxNiwgICAgIDAsICAgIDY0LCAgICAgMCwgICAgNjUsICAgICAwLCAgICAxMywKLSAgICAgMCwgICAgMTIsICAgICAwLCAgICAxNCwgICAgIDAsICAgIDExLCAgICAgMCwgICAgMTUsICAgICAwLCAgICAxOCwKLSAgICAgMCwgICAgMTcsICAgICAwLCAgICA2OSwgICAgIDAsICAgIDY2LCAgICAgMCwgICAgNjIsICAgIDg0LCAgICAgMCwKLSAgICA2OSwgICAgODQsICAgICAwLCAgICAgNSwgICAgIDAsICAgIDcyLCAgICAgMCwgICAgNzEsICAgICAwLCAgICA3MiwKLSAgICAgMCwgICAgIDUsICAgICAwLCAgICAgOSwgICAgIDAsICAgIDY5LCAgICA0NywgICAgNzEsICAgICAwLCAgIDExMSwKLSAgICAgMCwgICAgNzMsICAgIDI0LCAgIDExMSwgICAgIDAsICAgIDc1LCAgICAgMCwgICAgODEsICAgICAwLCAgICA2MSwKLSAgICAgMCwgICAgMjEsICAgICAwLCAgICA0OSwgICAxMTEsICAgIDUwLCAgICAgMCwgICAgNzgsICAgICAwLCAgICA4NiwKLSAgICAgMCwgICAgODcsICAgICAwLCAgICA4OCwgICAgIDAsICAgIDc2LCAgICA3OSwgICAgNzcsICAgICAwLCAgICA1MSwKLSAgICAgMCwgICAgNTIsICAgICAwLCAgICAyMywgICAgNjcsICAgIDQ5LCAgICA4MCwgICAgNTAsICAgICAwLCAgIDExMSwKLSAgICAgMCwgICAgNzksICAgIDI0LCAgIDExMSwgICAgIDAsICAgICAwLCAgICA3OSwgICAgIDAsICAgIDIzLCAgICA2MiwKLSAgICA4MiwgICAgODUsICAgICAwLCAgICAyMywgICAgNjYsICAgIDgyLCAgICA4NSwgICAgIDAsICAgIDgzLCAgICAgMCwKLSAgICA4MiwgICAgODMsICAgICAwLCAgICA0OCwgICAxMTEsICAgIDUzLCAgICAgMCwgICAgNDgsICAgIDUzLCAgICAgMCwKLSAgICA4NCwgICAgNDgsICAgIDUzLCAgICAgMCwgICAgODQsICAgICAwLCAgICAgMCwgICAgNzQsICAgIDQ3LCAgICA3MSwKLSAgICAgMCwgICAgMTksICAgIDQ3LCAgICA3MSwgICAgIDAsICAgIDY5LCAgICA0OSwgICAgODAsICAgIDUwLCAgICAgMCwKLSAgICA3NCwgICAgNDcsICAgIDcxLCAgICA0OSwgICAgODAsICAgIDUwLCAgICAgMCwgICAgMjIsICAgIDQ3LCAgICA3MSwKLSAgICA0OSwgICAgODAsICAgIDUwLCAgICAgMCwgICAgNjksICAgIDQ4LCAgIDExMSwgICAgNTMsICAgICAwLCAgICAxOSwKLSAgICA0OCwgICAxMTEsICAgIDUzLCAgICAgMCwgICAgNzUsICAgIDQ4LCAgIDExMSwgICAgNTMsICAgICAwLCAgICA3NCwKLSAgICAgMCwgICAgNjksICAgICAwLCAgICAxOSwgICAgIDAsICAgIDkwLCAgICAgMCwgICAgOTEsICAgICAwLCAgICA4OSwKLSAgICA0NSwgICAgIDAsICAgIDg5LCAgICA0NiwgICAgIDAsICAgIDkzLCAgICAgMCwgICAgOTQsICAgICAwLCAgICA0MCwKLSAgICA5MiwgICAgIDAsICAgIDQxLCAgICA5MiwgICAgIDAsICAgIDQyLCAgICA5MiwgICAgIDAsICAgIDk1LCAgICAgMCwKLSAgICA0NSwgICAgOTIsICAgICAwLCAgICA0NiwgICAgOTIsICAgICAwLCAgICA4OSwgICAgIDAsICAgIDU0LCAgICA5MiwKLSAgICAgMCwgICAgNTUsICAgIDkyLCAgICAgMCwgICAgOTYsICAgICAwLCAgICA0OSwgICAgNjIsICAgIDg1LCAgICA1MCwKLSAgICA5MiwgICAgIDAsICAgIDQ5LCAgIDExMSwgICAgNTAsICAgIDk1LCAgICAgMCwgICAgNDksICAgIDY5LCAgICA4NCwKLSAgICA1MCwgICAgOTUsICAgICAwLCAgICA5MiwgICAgIDAsICAgIDk3LCAgICA0MiwgICAgOTIsICAgICAwLCAgICA5NywKLSAgICA0MywgICAgOTIsICAgICAwLCAgICA5NywgICAgNDQsICAgIDkyLCAgICAgMCwgICAgOTcsICAgICAwLCAgICA5OCwKLSAgICA0MCwgICAgOTcsICAgICAwLCAgICA5OCwgICAgNDEsICAgIDk3LCAgICAgMCwgICAgOTgsICAgICAwLCAgICA5OSwKLSAgICAzOCwgICAgOTgsICAgICAwLCAgICA5OSwgICAgMzksICAgIDk4LCAgICAgMCwgICAgOTksICAgICAwLCAgIDEwMCwKLSAgICAzNCwgICAgOTksICAgICAwLCAgIDEwMCwgICAgMzUsICAgIDk5LCAgICAgMCwgICAxMDAsICAgIDM2LCAgICA5OSwKLSAgICAgMCwgICAxMDAsICAgIDM3LCAgICA5OSwgICAgIDAsICAgMTAwLCAgICAgMCwgICAxMDEsICAgIDMyLCAgIDEwMCwKLSAgICAgMCwgICAxMDEsICAgIDMzLCAgIDEwMCwgICAgIDAsICAgMTAxLCAgICAgMCwgICAxMDIsICAgIDMxLCAgIDEwMSwKLSAgICAgMCwgICAxMDIsICAgICAwLCAgIDEwMywgICAgMzAsICAgMTAyLCAgICAgMCwgICAxMDMsICAgICAwLCAgIDEwNCwKLSAgICAyOSwgICAxMDMsICAgICAwLCAgIDEwNCwgICAgIDAsICAgMTA1LCAgICAyOCwgICAxMDQsICAgICAwLCAgIDEwNSwKLSAgICAgMCwgICAxMDYsICAgIDI3LCAgIDEwNSwgICAgIDAsICAgMTA2LCAgICAgMCwgICAxMDYsICAgIDI2LCAgIDExMSwKLSAgICA1NiwgICAxMDcsICAgICAwLCAgIDEwNywgICAgIDAsICAgMTA5LCAgICAgMCwgICAxMTAsICAgIDI1LCAgIDEwNywKLSAgICAgMCwgICAxMTAsICAgIDIwLCAgIDEwNywgICAgIDAsICAgIDcwLCAgICAgMCwgICAgMTksICAgICAwLCAgICA4NiwKLSAgICAgMCwgICAgODgsICAgICAwLCAgIDEwOCwgICAgIDAKLX07Ci0KLSNlbmRpZgotCi0jaWYgWVlERUJVRyAhPSAwCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlybGluZVtdID0geyAwLAotICAgMjAzLCAgIDIwNCwgICAyMDcsICAgMjE1LCAgIDIxNywgICAyMjAsICAgMjI5LCAgIDIzNSwgICAyNDMsICAgMjQ4LAotICAgMjUzLCAgIDI2MywgICAyNjUsICAgMjY5LCAgIDI3MSwgICAyNzQsICAgMjc3LCAgIDI3OSwgICAyODEsICAgMjgzLAotICAgMjg3LCAgIDI5MCwgICAzMDEsICAgMzA2LCAgIDMxMCwgICAzMTMsICAgMzE3LCAgIDMxOSwgICAzMjIsICAgMzI0LAotICAgMzI3LCAgIDMyOSwgICAzMzIsICAgMzU2LCAgIDM1NywgICAzNjEsICAgMzYzLCAgIDM2NiwgICAzNjgsICAgMzcxLAotICAgMzcyLCAgIDM3MywgICAzNzQsICAgMzc1LCAgIDM3NiwgICAzODMsICAgMzg4LCAgIDM5MywgICAzOTgsICAgNDAxLAotICAgNDA1LCAgIDQwOCwgICA0MTEsICAgNDE0LCAgIDQxOCwgICA0MjAsICAgNDIzLCAgIDQyNywgICA0MzAsICAgNDM0LAotICAgNDM2LCAgIDQ0MCwgICA0NDMsICAgNDQ4LCAgIDQ1MSwgICA0NTMsICAgNDU3LCAgIDQ3NSwgICA0NzcsICAgNDgxLAotICAgNDgzLCAgIDQ4NSwgICA0ODcsICAgNDg4LCAgIDQ5MSwgICA0OTYsICAgNTAxLCAgIDUwMywgICA1MDQsICAgNTA1LAotICAgNTA3LCAgIDUwOSwgICA1MTIsICAgNTE3LCAgIDUyMiwgICA1MjQsICAgNTI2LCAgIDUyOCwgICA1MzEsICAgNTM2LAotICAgNTU3LCAgIDU2NCwgICA1NjYsICAgNTY4LCAgIDU3MCwgICA1NzQsICAgNTc2LCAgIDU3OCwgICA1ODIsICAgNTg0LAotICAgNTg2LCAgIDU5MSwgICA1OTMsICAgNTk1LCAgIDU5NywgICA1OTksICAgNjA0LCAgIDYwNiwgICA2MDgsICAgNjEyLAotICAgNjE0LCAgIDYxOCwgICA2MjAsICAgNjIzLCAgIDYyNSwgICA2MjksICAgNjMxLCAgIDYzNSwgICA2MzcsICAgNjQxLAotICAgNjQzLCAgIDY0NywgICA2NDksICAgNjUyLCAgIDY1NSwgICA2NjEsICAgNjY0LCAgIDY2NiwgICA2NjcsICAgNjcxCi19OwotI2VuZGlmCi0KLQotI2lmIFlZREVCVUcgIT0gMCB8fCBkZWZpbmVkIChZWUVSUk9SX1ZFUkJPU0UpCi0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgeXl0bmFtZVtdID0geyAgICIkIiwiZXJyb3IiLCIkdW5kZWZpbmVkLiIsIklOVEVHRVJfTElURVJBTCIsCi0iRkxPQVRJTkdfUE9JTlRfTElURVJBTCIsIklERU5USUZJRVIiLCJTVFJJTkdfTElURVJBTCIsIkJPT0xFQU5fTElURVJBTCIsIlRZUEVOQU1FIiwKLSJOQU1FX09SX0lOVCIsIkVSUk9SIiwiTE9ORyIsIlNIT1JUIiwiQllURSIsIklOVCIsIkNIQVIiLCJCT09MRUFOIiwiRE9VQkxFIiwKLSJGTE9BVCIsIlZBUklBQkxFIiwiQVNTSUdOX01PRElGWSIsIlRISVMiLCJTVVBFUiIsIk5FVyIsIicsJyIsIic9JyIsIic/JyIsIk9ST1IiLAotIkFOREFORCIsIid8JyIsIideJyIsIicmJyIsIkVRVUFMIiwiTk9URVFVQUwiLCInPCciLCInPiciLCJMRVEiLCJHRVEiLCJMU0giLAotIlJTSCIsIicrJyIsIictJyIsIicqJyIsIicvJyIsIiclJyIsIklOQ1JFTUVOVCIsIkRFQ1JFTUVOVCIsIicuJyIsIidbJyIsIicoJyIsCi0iJyknIiwiJ3snIiwiJ30nIiwiJ10nIiwiJ34nIiwiJyEnIiwiJzonIiwic3RhcnQiLCJ0eXBlX2V4cCIsIlByaW1pdGl2ZU9yQXJyYXlUeXBlIiwKLSJTdHJpbmdMaXRlcmFsIiwiTGl0ZXJhbCIsIlByaW1pdGl2ZVR5cGUiLCJOdW1lcmljVHlwZSIsIkludGVncmFsVHlwZSIsIkZsb2F0aW5nUG9pbnRUeXBlIiwKLSJDbGFzc09ySW50ZXJmYWNlVHlwZSIsIkNsYXNzVHlwZSIsIkFycmF5VHlwZSIsIk5hbWUiLCJGb3JjZWROYW1lIiwiU2ltcGxlTmFtZSIsCi0iUXVhbGlmaWVkTmFtZSIsImV4cDEiLCJQcmltYXJ5IiwiUHJpbWFyeU5vTmV3QXJyYXkiLCJsY3VybHkiLCJyY3VybHkiLCJDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIiwKLSJBcmd1bWVudExpc3QiLCJBcmd1bWVudExpc3Rfb3B0IiwiQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24iLCJEaW1FeHBycyIsIkRpbUV4cHIiLAotIkRpbXMiLCJEaW1zX29wdCIsIkZpZWxkQWNjZXNzIiwiTWV0aG9kSW52b2NhdGlvbiIsIkFycmF5QWNjZXNzIiwiUG9zdGZpeEV4cHJlc3Npb24iLAotIlBvc3RJbmNyZW1lbnRFeHByZXNzaW9uIiwiUG9zdERlY3JlbWVudEV4cHJlc3Npb24iLCJVbmFyeUV4cHJlc3Npb24iLCJQcmVJbmNyZW1lbnRFeHByZXNzaW9uIiwKLSJQcmVEZWNyZW1lbnRFeHByZXNzaW9uIiwiVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzIiwiQ2FzdEV4cHJlc3Npb24iLCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLAotIkFkZGl0aXZlRXhwcmVzc2lvbiIsIlNoaWZ0RXhwcmVzc2lvbiIsIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiRXF1YWxpdHlFeHByZXNzaW9uIiwKLSJBbmRFeHByZXNzaW9uIiwiRXhjbHVzaXZlT3JFeHByZXNzaW9uIiwiSW5jbHVzaXZlT3JFeHByZXNzaW9uIiwiQ29uZGl0aW9uYWxBbmRFeHByZXNzaW9uIiwKLSJDb25kaXRpb25hbE9yRXhwcmVzc2lvbiIsIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiIsIkFzc2lnbm1lbnRFeHByZXNzaW9uIiwiQXNzaWdubWVudCIsCi0iTGVmdEhhbmRTaWRlIiwiRXhwcmVzc2lvbiIsIE5VTEwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cjFbXSA9IHsgICAgIDAsCi0gICAgNTcsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYxLCAgICA2MSwgICAgNjEsCi0gICAgNjEsICAgIDYyLCAgICA2MiwgICAgNjMsICAgIDYzLCAgICA2NCwgICAgNjQsICAgIDY0LCAgICA2NCwgICAgNjQsCi0gICAgNjUsICAgIDY1LCAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OCwgICAgNjksICAgIDY5LCAgICA3MCwgICAgNzAsCi0gICAgNzEsICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDczLCAgICA3NCwgICAgNzQsICAgIDc1LCAgICA3NSwgICAgNzUsCi0gICAgNzUsICAgIDc1LCAgICA3NSwgICAgNzUsICAgIDc1LCAgICA3NiwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgNzksCi0gICAgODAsICAgIDgwLCAgICA4MSwgICAgODEsICAgIDgyLCAgICA4MiwgICAgODMsICAgIDg0LCAgICA4NCwgICAgODUsCi0gICAgODUsICAgIDg2LCAgICA4NiwgICAgODcsICAgIDg3LCAgICA4NywgICAgODgsICAgIDg4LCAgICA4OCwgICAgODksCi0gICAgODksICAgIDg5LCAgICA4OSwgICAgODksICAgIDkwLCAgICA5MSwgICAgOTIsICAgIDkyLCAgICA5MiwgICAgOTIsCi0gICAgOTIsICAgIDkyLCAgICA5MywgICAgOTQsICAgIDk1LCAgICA5NSwgICAgOTUsICAgIDk1LCAgICA5NiwgICAgOTYsCi0gICAgOTYsICAgIDk3LCAgICA5NywgICAgOTcsICAgIDk3LCAgICA5OCwgICAgOTgsICAgIDk4LCAgICA5OSwgICAgOTksCi0gICAgOTksICAgMTAwLCAgIDEwMCwgICAxMDAsICAgMTAwLCAgIDEwMCwgICAxMDEsICAgMTAxLCAgIDEwMSwgICAxMDIsCi0gICAxMDIsICAgMTAzLCAgIDEwMywgICAxMDQsICAgMTA0LCAgIDEwNSwgICAxMDUsICAgMTA2LCAgIDEwNiwgICAxMDcsCi0gICAxMDcsICAgMTA4LCAgIDEwOCwgICAxMDksICAgMTA5LCAgIDExMCwgICAxMTAsICAgMTEwLCAgIDExMCwgICAxMTEKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXIyW10gPSB7ICAgICAwLAotICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAotICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAotICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAotICAgICAxLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgMywgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAzLAotICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDEsICAgICAxLCAgICAgNSwgICAgIDEsICAgICAzLAotICAgICAwLCAgICAgMSwgICAgIDQsICAgICA0LCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgMiwgICAgIDMsICAgICAxLAotICAgICAwLCAgICAgMywgICAgIDMsICAgICA0LCAgICAgNiwgICAgIDYsICAgICA0LCAgICAgNCwgICAgIDQsICAgICAxLAotICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMSwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDUsICAgICA0LAotICAgICA1LCAgICAgMSwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDEsICAgICAzLCAgICAgMywgICAgIDEsICAgICAzLAotICAgICAzLCAgICAgMSwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAxLCAgICAgMywgICAgIDMsICAgICAxLAotICAgICAzLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgMywgICAgIDEsICAgICAzLCAgICAgMSwgICAgIDMsICAgICAxLAotICAgICA1LCAgICAgMSwgICAgIDEsICAgICAzLCAgICAgMywgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlkZWZhY3RbXSA9IHsgICAgIDAsCi0gICAgIDcsICAgICA5LCAgICAyNywgICAgIDYsICAgIDEwLCAgICAgOCwgICAgMTksICAgIDE3LCAgICAxNiwgICAgMTgsCi0gICAgMjAsICAgIDEzLCAgICAyMiwgICAgMjEsICAgIDcyLCAgICAzOSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDQ2LCAgICAgMCwgICAgIDAsICAgICAyLCAgICAgMywgICAgMTEsCi0gICAgMzgsICAgICA0LCAgICAxMiwgICAgMTQsICAgIDE1LCAgICAgNSwgICAgNzEsICAgMTI2LCAgICAyOSwgICAgMjgsCi0gICAgIDEsICAgIDcwLCAgICAzNiwgICAgIDAsICAgIDQxLCAgICAzNywgICAgNDIsICAgIDQzLCAgICA0NCwgICAgODUsCi0gICAgNzMsICAgIDc0LCAgICA5MiwgICAgNzcsICAgIDc4LCAgICA4MiwgICAgODgsICAgIDk2LCAgICA5OSwgICAxMDIsCi0gICAxMDcsICAgMTEwLCAgIDExMiwgICAxMTQsICAgMTE2LCAgIDExOCwgICAxMjAsICAgMTIyLCAgIDEzMCwgICAxMjMsCi0gICAgIDAsICAgIDM0LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAyNywgICAgIDAsICAgIDI0LCAgICAgMCwgICAgMjMsCi0gICAgMjgsICAgICA4LCAgICA3MiwgICAgNzEsICAgIDQyLCAgICA0NCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODMsCi0gICAgODQsICAgIDYxLCAgICA3MSwgICAgIDAsICAgIDg2LCAgICA4NywgICAgIDAsICAgIDI1LCAgICAgMCwgICAgIDAsCi0gICAgNTEsICAgIDI2LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNDksICAgIDc1LCAgICA3NiwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgMzEsICAgIDMyLCAgICA2MywgICAgIDAsICAgICAwLCAgICAgMCwgICAgNjEsICAgIDU1LCAgICA2MSwgICAgNTEsCi0gICAgIDAsICAgIDYwLCAgICAgMCwgICAgIDAsICAgIDQwLCAgICA1OCwgICAgIDAsICAgIDMzLCAgICAgMCwgICAgNTIsCi0gICAgIDAsICAgIDM1LCAgICA2MiwgICAgIDAsICAgICAwLCAgICA0NywgICAgNDUsICAgIDkzLCAgICA5NCwgICAgOTUsCi0gICAgOTcsICAgIDk4LCAgIDEwMCwgICAxMDEsICAgMTAzLCAgIDEwNCwgICAxMDUsICAgMTA2LCAgIDEwOCwgICAxMDksCi0gICAxMTEsICAgMTEzLCAgIDExNSwgICAxMTcsICAgICAwLCAgIDExOSwgICAxMjUsICAgMTI0LCAgICA2OCwgICAgNTEsCi0gICAgIDAsICAgICAwLCAgICA1NiwgICAgNTMsICAgIDU0LCAgICAgMCwgICAgIDAsICAgICAwLCAgICA5MCwgICAgNTksCi0gICAgNjcsICAgIDY0LCAgICA1MSwgICAgNjksICAgIDUwLCAgICAgMCwgICAgIDAsICAgIDU3LCAgICA0OCwgICAgODksCi0gICAgOTEsICAgICAwLCAgIDEyMSwgICAgNjYsICAgIDY1LCAgICAgMCwgICAgIDAsICAgICAwCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlkZWZnb3RvW10gPSB7ICAgMjA2LAotICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzMsICAgIDM0LCAgICAzNSwgICAgNzgsICAgIDc5LAotICAgIDM2LCAgICA4NCwgICAgMzgsICAgIDM5LCAgICA4MSwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgMTU3LAotICAgIDQ1LCAgIDE1MCwgICAxNTEsICAgIDQ2LCAgIDEzNywgICAxMzgsICAgMTQyLCAgIDE0MywgICAgODUsICAgIDQ4LAotICAgIDg2LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDU4LAotICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY1LCAgICA2NiwgICAgNjcsICAgIDY4LAotICAgIDY5LCAgICA3MCwgICAgNzEsICAgMTA3Ci19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlwYWN0W10gPSB7ICAgMjA2LAotLTMyNzY4LC0zMjc2OCwgICAgLTUsLTMyNzY4LC0zMjc2OCwgICAgLTMsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LAotLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICAgMSwtMzI3NjgsICAgLTM0LCAgIDIyNSwgICAzMTIsICAgMzEyLAotICAgMzEyLCAgIDMxMiwgICAzMTIsICAgMjA2LC0zMjc2OCwgICAzMTIsICAgMzEyLC0zMjc2OCwtMzI3NjgsLTMyNzY4LAotLTMyNzY4LCAgIC0yMywtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgIDM0LC0zMjc2OCwtMzI3NjgsICAgICA3LAotICAgICA0LCAgIC0yOCwgICAtMTcsICAgMzY1LC0zMjc2OCwtMzI3NjgsICAgIDE1LC0zMjc2OCwgICAgMjEsICAgIDc0LAotLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICA0NSwgICAgNDQsICAgIDg2LAotICAgIDM1LCAgICA5NiwgICAgIDMsICAgIDIzLCAgICAgOCwgICAgNTEsICAgMTA0LC0zMjc2OCwtMzI3NjgsLTMyNzY4LAotICAgIDMyLC0zMjc2OCwgICAgNDYsICAgMzY1LCAgICA0NiwtMzI3NjgsICAgIDI1LCAgICAyNSwgICAgMTQsICAgIDU1LAotLTMyNzY4LC0zMjc2OCwgICAgODcsICAgIDQ3LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LAotLTMyNzY4LCAgIC0yMywgICAgMzQsICAgIDQwLC0zMjc2OCwtMzI3NjgsICAgIDU3LCAgICA1MCwgICAgNDYsICAgMjU5LAotICAgMzY1LCAgICA1MCwgICAzNjUsICAgIDQ2LCAgIDM2NSwgICAtMTMsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgMzEyLAotICAgMzEyLCAgIDMxMiwgICAzMTIsICAgMzEyLCAgIDMxMiwgICAzMTIsICAgMzEyLCAgIDMxMiwgICAzMTIsICAgMzEyLAotICAgMzEyLCAgIDMxMiwgICAzMTIsICAgMzEyLCAgIDMxMiwgICAzMTIsICAgMzY1LCAgIDMxMiwgICAzMTIsICAgMzEyLAotLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgIDYxLCAgICA1OSwgICAzNjUsICAgIDU2LC0zMjc2OCwgICAgNTYsICAgMzY1LAotICAgMzY1LCAgICA1MCwgICAgNjYsICAgIDQzLCAgIDM3MiwtMzI3NjgsICAgIDY5LC0zMjc2OCwgICAgNzMsICAgMTA4LAotICAgMTA2LC0zMjc2OCwgICAxMTEsICAgMTA5LCAgIDM2NSwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LAotICAgIDQ1LCAgICA0NSwgICAgNDQsICAgIDQ0LCAgICA4NiwgICAgODYsICAgIDg2LCAgICA4NiwgICAgMzUsICAgIDM1LAotICAgIDk2LCAgICAgMywgICAgMjMsICAgICA4LCAgIDEwNywgICAgNTEsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgMzY1LAotICAgMTEyLCAgIDI1OSwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAxMTQsICAgMzEyLCAgIDM3MiwtMzI3NjgsLTMyNzY4LAotLTMyNzY4LC0zMjc2OCwgICAzNjUsLTMyNzY4LC0zMjc2OCwgICAzMTIsICAgMTE2LC0zMjc2OCwtMzI3NjgsLTMyNzY4LAotLTMyNzY4LCAgIDExOCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAxNjksICAgMTcwLC0zMjc2OAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cGdvdG9bXSA9IHstMzI3NjgsCi0tMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgIC04LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsCi0tMzI3NjgsICAgICA1LC0zMjc2OCwgICAtNjYsICAgICAwLC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsCi0tMzI3NjgsICAgMTI3LCAgLTEyNiwtMzI3NjgsICAgIDk0LCAgIC05NCwgICAtMjksICAgLTQwLCAgICAgNiwtMzI3NjgsCi0gICAgMTIsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgIDM5LC0zMjc2OCwtMzI3NjgsICAtMTQxLC0zMjc2OCwgICAgMjQsCi0gICAgMjgsICAgLTQyLCAgICAzNiwgICAgNTIsICAgIDUzLCAgICA0OSwgICAgNTgsICAgIDQ4LC0zMjc2OCwgIC0xMjgsCi0tMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAgMTgKLX07Ci0KLQotI2RlZmluZQlZWUxBU1QJCTQyNwotCi0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXRhYmxlW10gPSB7ICAgIDQwLAotICAgMTc3LCAgIDE3OCwgICAgOTgsICAgMTg5LCAgICAzNywgICAgNDcsICAgMTMzLCAgIDEwMiwgICAxMzUsICAgIDc3LAotICAgMTU1LCAgICA0OSwgICAgNzUsICAgMTg2LCAgIC0zMSwgICAgOTIsICAgLTMyLCAgICA3MiwgICAxMDQsICAgLTMxLAotICAtMTI3LCAgIC0zMiwgICAgODAsICAgIDQwLCAgICA5NywgIC0xMjcsICAgLTMwLCAgIDEwMywgICAgOTMsICAgIDQ3LAotICAgMTA1LCAgIC0zMCwgICAxNDgsICAgMTIzLCAgLTEyOCwgICAgNDksICAgMTI1LCAgIDE1MywgICAxNTYsICAtMTI4LAotICAtMTI5LCAgICA5NCwgICAxODMsICAgIDQwLCAgIDE4MywgIC0xMjksICAgMjAxLCAgICA3MywgICAgNzQsICAgIDQ3LAotICAgMTMxLCAgIDEyOSwgICAxMjQsICAgMTk3LCAgIDEzMiwgICAgNDksICAgMTMwLCAgICA4NywgICAgODgsICAgIDg5LAotICAgIDkwLCAgICA5MSwgICAxNDAsICAgMTQ0LCAgICA5NSwgICAgOTYsICAgMjAyLCAgIDIwMywgICAxMTcsICAgMTE4LAotICAgMTE5LCAgIDEyMCwgICAxMzYsICAgIDQwLCAgIDE2NSwgICAxNjYsICAgMTY3LCAgIDE2OCwgICAxMjYsICAgIDQ3LAotICAgIDk5LCAgIDEwMCwgICAxMDEsICAgMTEzLCAgIDExNCwgICAgNDksICAgMTEwLCAgIDExMSwgICAxMTIsICAgMTQ1LAotICAgMTQ3LCAgIDEzNCwgICAxODgsICAgIDk5LCAgIDE0MSwgICAxMDEsICAgMTg0LCAgIDE0NywgICAxODUsICAgIDQwLAotICAgIDQwLCAgICA5OSwgICAgNDAsICAgMTgyLCAgICA0MCwgICAgNDcsICAgIDQ3LCAgIDE4MCwgICAgNDcsICAgMTQ2LAotICAgIDQ3LCAgICA0OSwgICAgNDksICAgMTc5LCAgICA0OSwgICAxODcsICAgIDQ5LCAgIDE0OSwgICAxMDgsICAgMTA5LAotICAgMTUyLCAgIDE5MCwgICAxNTQsICAgMTE1LCAgIDExNiwgICAxOTEsICAgIDQwLCAgIDEyMSwgICAxMjIsICAgMTI3LAotICAgMTI4LCAgIDE1NSwgICAgNDcsICAgIDczLCAgICA3NCwgICAgNDAsICAgMTYxLCAgIDE2MiwgICAgNDksICAgIDQwLAotICAgIDQwLCAgICA0NywgICAxNjMsICAgMTY0LCAgIDE3NSwgICAgNDcsICAgIDQ3LCAgICA0OSwgICAxNTgsICAgMTU5LAotICAgMTYwLCAgICA0OSwgICAgNDksICAgMTgxLCAgICA0MCwgICAxOTIsICAgMTY5LCAgIDE3MCwgICAxNDksICAgMTkzLAotICAgIDQ3LCAgIDE5NCwgICAxOTYsICAgMTk5LCAgIDE5OCwgICAyMDQsICAgIDQ5LCAgIDIwNSwgICAyMDcsICAgMjA4LAotICAgMTA2LCAgIDEzOSwgICAxOTUsICAgMTczLCAgIDE3MSwgICAxNzYsICAgMTcyLCAgICAgMCwgICAgIDAsICAgIDQwLAotICAgICAwLCAgICA0MCwgICAgIDAsICAgMTc0LCAgICAgMCwgICAgNDcsICAgICAwLCAgICA0NywgICAgIDAsICAgICAwLAotICAgICAwLCAgICA0OSwgICAgNDAsICAgIDQ5LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNDcsICAgMTgxLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA0OSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDEsICAgICAyLAotICAgICAzLCAgICAgNCwgICAgIDUsICAgICAwLCAgICAgNiwgICAgIDAsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLAotICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAyMDAsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDc2LAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLAotICAgIDEyLCAgICAxMywgICAgMTQsICAgICAwLCAgICAgMCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgIDAsICAgICAwLAotICAgIDIyLCAgICAyMywgICAgIDAsICAgICAwLCAgICAyNCwgICAgIDAsICAgIDI1LCAgICAgMCwgICAgIDAsICAgIDI2LAotICAgIDI3LCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDUsICAgICAwLCAgICAgNiwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAxNSwgICAgIDAsICAgIDE2LAotICAgIDE3LCAgICAxOCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTksICAgIDIwLAotICAgIDIxLCAgICAgMCwgICAgIDAsICAgIDIyLCAgICAyMywgICAgIDAsICAgICAwLCAgICAyNCwgICAgIDAsICAgIDI1LAotICAgICAwLCAgIDE0NiwgICAgMjYsICAgIDI3LCAgICAgMSwgICAgIDIsICAgIDc2LCAgICAgNCwgICAgIDUsICAgICAwLAotICAgIDgyLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgIDgzLCAgICAgMCwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAgMCwgICAgIDAsICAgIDIyLCAgICAyMywgICAgIDAsICAgICAwLAotICAgIDI0LCAgICAgMCwgICAgMjUsICAgICAwLCAgICAgMCwgICAgMjYsICAgIDI3LCAgICAgMSwgICAgIDIsICAgICAzLAotICAgICA0LCAgICAgNSwgICAgIDAsICAgICA2LCAgICAgMSwgICAgIDIsICAgIDc2LCAgICAgNCwgICAgIDUsICAgICAwLAotICAgIDgyLCAgICAgMCwgICAgIDAsICAgIDE1LCAgICAgMCwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgIDAsICAgICAwLAotICAgIDgzLCAgICAgMCwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAgMCwgICAgIDAsICAgIDIyLAotICAgIDIzLCAgICAgMCwgICAgIDAsICAgIDI0LCAgICAgMCwgICAgMjUsICAgICAwLCAgICAgMCwgICAgMjYsICAgIDI3LAotICAgIDI0LCAgICAgMCwgICAgMjUsICAgICAwLCAgICAgMCwgICAgMjYsICAgIDI3Ci19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXljaGVja1tdID0geyAgICAgMCwKLSAgIDEyOSwgICAxMzAsICAgIDMyLCAgIDE0NSwgICAgIDAsICAgICAwLCAgICA3MywgICAgMzcsICAgIDc1LCAgICAxOCwKLSAgICAyNCwgICAgIDAsICAgIDQ3LCAgIDE0MCwgICAgMjAsICAgIDI0LCAgICAyMCwgICAgIDAsICAgIDQ3LCAgICAyNSwKLSAgICAyMCwgICAgMjUsICAgIDE4LCAgICAyNCwgICAgNDgsICAgIDI1LCAgICAyMCwgICAgMjQsICAgIDI0LCAgICAyNCwKLSAgICA0OCwgICAgMjUsICAgIDk5LCAgICAzMSwgICAgMjAsICAgIDI0LCAgICAyOSwgICAxMDQsICAgIDUyLCAgICAyNSwKLSAgICAyMCwgICAgMjQsICAgMTM3LCAgICA0NCwgICAxMzksICAgIDI1LCAgIDE4OCwgICAgNDcsICAgIDQ4LCAgICA0NCwKLSAgICAgNSwgICAgMjAsICAgIDMwLCAgIDE4MCwgICAgIDksICAgIDQ0LCAgICAyNSwgICAgMTksICAgIDIwLCAgICAyMSwKLSAgICAyMiwgICAgMjMsICAgIDQ5LCAgICA5MywgICAgMjYsICAgIDI3LCAgIDE5MywgICAxOTYsICAgIDM0LCAgICAzNSwKLSAgICAzNiwgICAgMzcsICAgIDQ4LCAgICA3NCwgICAxMTcsICAgMTE4LCAgIDExOSwgICAxMjAsICAgIDI4LCAgICA3NCwKLSAgICA0NywgICAgNDgsICAgIDQ5LCAgICA0MCwgICAgNDEsICAgIDc0LCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA1MCwKLSAgICA0OCwgICAgNzQsICAgIDUwLCAgICA0NywgICAgNDgsICAgIDQ5LCAgIDEzNywgICAgNDgsICAgMTM5LCAgIDEwMCwKLSAgIDEwMSwgICAgNDcsICAgMTAzLCAgICA0OCwgICAxMDUsICAgMTAwLCAgIDEwMSwgICAgNDksICAgMTAzLCAgICA1MywKLSAgIDEwNSwgICAxMDAsICAgMTAxLCAgICA1MywgICAxMDMsICAgIDUwLCAgIDEwNSwgICAxMDAsICAgIDQ1LCAgICA0NiwKLSAgIDEwMywgICAgNTMsICAgMTA1LCAgICAzOCwgICAgMzksICAgIDUzLCAgIDEyNywgICAgMzIsICAgIDMzLCAgICAyNiwKLSAgICAyNywgICAgMjQsICAgMTI3LCAgICA0NywgICAgNDgsICAgMTM2LCAgIDExMywgICAxMTQsICAgMTI3LCAgIDE0MCwKLSAgIDE0MSwgICAxMzYsICAgMTE1LCAgIDExNiwgICAxMjcsICAgMTQwLCAgIDE0MSwgICAxMzYsICAgMTEwLCAgIDExMSwKLSAgIDExMiwgICAxNDAsICAgMTQxLCAgIDEzNiwgICAxNTUsICAgIDUwLCAgIDEyMSwgICAxMjIsICAgMTQxLCAgICA0OSwKLSAgIDE1NSwgICAgNTMsICAgIDU2LCAgICA1MCwgICAgNTMsICAgIDUwLCAgIDE1NSwgICAgNTAsICAgICAwLCAgICAgMCwKLSAgICA0NCwgICAgNzgsICAgMTU1LCAgIDEyNSwgICAxMjMsICAgMTI4LCAgIDEyNCwgICAgLTEsICAgIC0xLCAgIDE4MCwKLSAgICAtMSwgICAxODIsICAgIC0xLCAgIDEyNiwgICAgLTEsICAgMTgwLCAgICAtMSwgICAxODIsICAgIC0xLCAgICAtMSwKLSAgICAtMSwgICAxODAsICAgMTkzLCAgIDE4MiwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgMTkzLCAgIDE4MiwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAxOTMsICAgIC0xLCAgICAtMSwgICAgLTEsICAgICAzLCAgICAgNCwKLSAgICAgNSwgICAgIDYsICAgICA3LCAgICAtMSwgICAgIDksICAgIC0xLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwKLSAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgMTg3LCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAgNSwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwKLSAgICAxNiwgICAgMTcsICAgIDE4LCAgICAtMSwgICAgLTEsICAgIDQwLCAgICA0MSwgICAgNDIsICAgIC0xLCAgICAtMSwKLSAgICA0NSwgICAgNDYsICAgIC0xLCAgICAtMSwgICAgNDksICAgIC0xLCAgICA1MSwgICAgLTEsICAgIC0xLCAgICA1NCwKLSAgICA1NSwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAtMSwgICAgIDksICAgIC0xLCAgICAtMSwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMTksICAgIC0xLCAgICAyMSwKLSAgICAyMiwgICAgMjMsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQwLCAgICA0MSwKLSAgICA0MiwgICAgLTEsICAgIC0xLCAgICA0NSwgICAgNDYsICAgIC0xLCAgICAtMSwgICAgNDksICAgIC0xLCAgICA1MSwKLSAgICAtMSwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAtMSwKLSAgICAgOSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwKLSAgICAxOSwgICAgLTEsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwKLSAgICAtMSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgLTEsICAgIC0xLCAgICA0NSwgICAgNDYsICAgIC0xLCAgICAtMSwKLSAgICA0OSwgICAgLTEsICAgIDUxLCAgICAtMSwgICAgLTEsICAgIDU0LCAgICA1NSwgICAgIDMsICAgICA0LCAgICAgNSwKLSAgICAgNiwgICAgIDcsICAgIC0xLCAgICAgOSwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAtMSwKLSAgICAgOSwgICAgLTEsICAgIC0xLCAgICAxOSwgICAgLTEsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIC0xLCAgICAtMSwKLSAgICAxOSwgICAgLTEsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgLTEsICAgIC0xLCAgICA0NSwKLSAgICA0NiwgICAgLTEsICAgIC0xLCAgICA0OSwgICAgLTEsICAgIDUxLCAgICAtMSwgICAgLTEsICAgIDU0LCAgICA1NSwKLSAgICA0OSwgICAgLTEsICAgIDUxLCAgICAtMSwgICAgLTEsICAgIDU0LCAgICA1NQotfTsKLS8qIC0qLUMtKi0gIE5vdGUgc29tZSBjb21waWxlcnMgY2hva2Ugb24gY29tbWVudHMgb24gYCNsaW5lJyBsaW5lcy4gICovCi0jbGluZSAzICIvc3RvbmUvamltYi9tYWluLTk4cjIvc2hhcmUvYmlzb24uc2ltcGxlIgotCi0vKiBTa2VsZXRvbiBvdXRwdXQgcGFyc2VyIGZvciBiaXNvbiwKLSAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCi0KLS8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHdoZW4gdGhpcyBmaWxlIGlzIGNvcGllZCBieSBCaXNvbiBpbnRvIGEKLSAgIEJpc29uIG91dHB1dCBmaWxlLCB5b3UgbWF5IHVzZSB0aGF0IG91dHB1dCBmaWxlIHdpdGhvdXQgcmVzdHJpY3Rpb24uCi0gICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gICBpbiB2ZXJzaW9uIDEuMjQgb2YgQmlzb24uICAqLwotCi0jaWZuZGVmIGFsbG9jYQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZSAvKiBub3QgR05VIEMuICAqLwotI2lmICghZGVmaW5lZCAoX19TVERDX18pICYmIGRlZmluZWQgKHNwYXJjKSkgfHwgZGVmaW5lZCAoX19zcGFyY19fKSB8fCBkZWZpbmVkIChfX3NwYXJjKSB8fCBkZWZpbmVkIChfX3NnaSkKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLSNlbHNlIC8qIG5vdCBzcGFyYyAqLwotI2lmIGRlZmluZWQgKE1TRE9TKSAmJiAhZGVmaW5lZCAoX19UVVJCT0NfXykKLSNlbHNlIC8qIG5vdCBNU0RPUywgb3IgX19UVVJCT0NfXyAqLwotI2lmIGRlZmluZWQoX0FJWCkKLSAjcHJhZ21hIGFsbG9jYQotI2Vsc2UgLyogbm90IE1TRE9TLCBfX1RVUkJPQ19fLCBvciBfQUlYICovCi0jaWZkZWYgX19ocHV4Ci0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotdm9pZCAqYWxsb2NhICh1bnNpZ25lZCBpbnQpOwotfTsKLSNlbHNlIC8qIG5vdCBfX2NwbHVzcGx1cyAqLwotdm9pZCAqYWxsb2NhICgpOwotI2VuZGlmIC8qIG5vdCBfX2NwbHVzcGx1cyAqLwotI2VuZGlmIC8qIF9faHB1eCAqLwotI2VuZGlmIC8qIG5vdCBfQUlYICovCi0jZW5kaWYgLyogbm90IE1TRE9TLCBvciBfX1RVUkJPQ19fICovCi0jZW5kaWYgLyogbm90IHNwYXJjLiAgKi8KLSNlbmRpZiAvKiBub3QgR05VIEMuICAqLwotI2VuZGlmIC8qIGFsbG9jYSBub3QgZGVmaW5lZC4gICovCi0KLS8qIFRoaXMgaXMgdGhlIHBhcnNlciBjb2RlIHRoYXQgaXMgd3JpdHRlbiBpbnRvIGVhY2ggYmlzb24gcGFyc2VyCi0gIHdoZW4gdGhlICVzZW1hbnRpY19wYXJzZXIgZGVjbGFyYXRpb24gaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgZ3JhbW1hci4KLSAgSXQgd2FzIHdyaXR0ZW4gYnkgUmljaGFyZCBTdGFsbG1hbiBieSBzaW1wbGlmeWluZyB0aGUgaGFpcnkgcGFyc2VyCi0gIHVzZWQgd2hlbiAlc2VtYW50aWNfcGFyc2VyIGlzIHNwZWNpZmllZC4gICovCi0KLS8qIE5vdGU6IHRoZXJlIG11c3QgYmUgb25seSBvbmUgZG9sbGFyIHNpZ24gaW4gdGhpcyBmaWxlLgotICAgSXQgaXMgcmVwbGFjZWQgYnkgdGhlIGxpc3Qgb2YgYWN0aW9ucywgZWFjaCBhY3Rpb24KLSAgIGFzIG9uZSBjYXNlIG9mIHRoZSBzd2l0Y2guICAqLwotCi0jZGVmaW5lIHl5ZXJyb2sJCSh5eWVycnN0YXR1cyA9IDApCi0jZGVmaW5lIHl5Y2xlYXJpbgkoeXljaGFyID0gWVlFTVBUWSkKLSNkZWZpbmUgWVlFTVBUWQkJLTIKLSNkZWZpbmUgWVlFT0YJCTAKLSNkZWZpbmUgWVlBQ0NFUFQJcmV0dXJuKDApCi0jZGVmaW5lIFlZQUJPUlQgCXJldHVybigxKQotI2RlZmluZSBZWUVSUk9SCQlnb3RvIHl5ZXJybGFiMQotLyogTGlrZSBZWUVSUk9SIGV4Y2VwdCBkbyBjYWxsIHl5ZXJyb3IuCi0gICBUaGlzIHJlbWFpbnMgaGVyZSB0ZW1wb3JhcmlseSB0byBlYXNlIHRoZQotICAgdHJhbnNpdGlvbiB0byB0aGUgbmV3IG1lYW5pbmcgb2YgWVlFUlJPUiwgZm9yIEdDQy4KLSAgIE9uY2UgR0NDIHZlcnNpb24gMiBoYXMgc3VwcGxhbnRlZCB2ZXJzaW9uIDEsIHRoaXMgY2FuIGdvLiAgKi8KLSNkZWZpbmUgWVlGQUlMCQlnb3RvIHl5ZXJybGFiCi0jZGVmaW5lIFlZUkVDT1ZFUklORygpICAoISF5eWVycnN0YXR1cykKLSNkZWZpbmUgWVlCQUNLVVAodG9rZW4sIHZhbHVlKSBcCi1kbwkJCQkJCQkJXAotICBpZiAoeXljaGFyID09IFlZRU1QVFkgJiYgeXlsZW4gPT0gMSkJCQkJXAotICAgIHsgeXljaGFyID0gKHRva2VuKSwgeXlsdmFsID0gKHZhbHVlKTsJCQlcCi0gICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CQkJCVwKLSAgICAgIFlZUE9QU1RBQ0s7CQkJCQkJXAotICAgICAgZ290byB5eWJhY2t1cDsJCQkJCQlcCi0gICAgfQkJCQkJCQkJXAotICBlbHNlCQkJCQkJCQlcCi0gICAgeyB5eWVycm9yICgic3ludGF4IGVycm9yOiBjYW5ub3QgYmFjayB1cCIpOyBZWUVSUk9SOyB9CVwKLXdoaWxlICgwKQotCi0jZGVmaW5lIFlZVEVSUk9SCTEKLSNkZWZpbmUgWVlFUlJDT0RFCTI1NgotCi0jaWZuZGVmIFlZUFVSRQotI2RlZmluZSBZWUxFWAkJeXlsZXgoKQotI2VuZGlmCi0KLSNpZmRlZiBZWVBVUkUKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSNpZmRlZiBZWUxFWF9QQVJBTQotI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCwgJnl5bGxvYywgWVlMRVhfUEFSQU0pCi0jZWxzZQotI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCwgJnl5bGxvYykKLSNlbmRpZgotI2Vsc2UgLyogbm90IFlZTFNQX05FRURFRCAqLwotI2lmZGVmIFlZTEVYX1BBUkFNCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsLCBZWUxFWF9QQVJBTSkKLSNlbHNlCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsKQotI2VuZGlmCi0jZW5kaWYgLyogbm90IFlZTFNQX05FRURFRCAqLwotI2VuZGlmCi0KLS8qIElmIG5vbnJlZW50cmFudCwgZ2VuZXJhdGUgdGhlIHZhcmlhYmxlcyBoZXJlICovCi0KLSNpZm5kZWYgWVlQVVJFCi0KLWludAl5eWNoYXI7CQkJLyogIHRoZSBsb29rYWhlYWQgc3ltYm9sCQkqLwotWVlTVFlQRQl5eWx2YWw7CQkJLyogIHRoZSBzZW1hbnRpYyB2YWx1ZSBvZiB0aGUJCSovCi0JCQkJLyogIGxvb2thaGVhZCBzeW1ib2wJCQkqLwotCi0jaWZkZWYgWVlMU1BfTkVFREVECi1ZWUxUWVBFIHl5bGxvYzsJCQkvKiAgbG9jYXRpb24gZGF0YSBmb3IgdGhlIGxvb2thaGVhZAkqLwotCQkJCS8qICBzeW1ib2wJCQkJKi8KLSNlbmRpZgotCi1pbnQgeXluZXJyczsJCQkvKiAgbnVtYmVyIG9mIHBhcnNlIGVycm9ycyBzbyBmYXIgICAgICAgKi8KLSNlbmRpZiAgLyogbm90IFlZUFVSRSAqLwotCi0jaWYgWVlERUJVRyAhPSAwCi1pbnQgeXlkZWJ1ZzsJCQkvKiAgbm9uemVybyBtZWFucyBwcmludCBwYXJzZSB0cmFjZQkqLwotLyogU2luY2UgdGhpcyBpcyB1bmluaXRpYWxpemVkLCBpdCBkb2VzIG5vdCBzdG9wIG11bHRpcGxlIHBhcnNlcnMKLSAgIGZyb20gY29leGlzdGluZy4gICovCi0jZW5kaWYKLQotLyogIFlZSU5JVERFUFRIIGluZGljYXRlcyB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBwYXJzZXIncyBzdGFja3MJKi8KLQotI2lmbmRlZglZWUlOSVRERVBUSAotI2RlZmluZSBZWUlOSVRERVBUSCAyMDAKLSNlbmRpZgotCi0vKiAgWVlNQVhERVBUSCBpcyB0aGUgbWF4aW11bSBzaXplIHRoZSBzdGFja3MgY2FuIGdyb3cgdG8KLSAgICAoZWZmZWN0aXZlIG9ubHkgaWYgdGhlIGJ1aWx0LWluIHN0YWNrIGV4dGVuc2lvbiBtZXRob2QgaXMgdXNlZCkuICAqLwotCi0jaWYgWVlNQVhERVBUSCA9PSAwCi0jdW5kZWYgWVlNQVhERVBUSAotI2VuZGlmCi0KLSNpZm5kZWYgWVlNQVhERVBUSAotI2RlZmluZSBZWU1BWERFUFRIIDEwMDAwCi0jZW5kaWYKLQotLyogUHJldmVudCB3YXJuaW5nIGlmIC1Xc3RyaWN0LXByb3RvdHlwZXMuICAqLwotI2lmZGVmIF9fR05VQ19fCi1pbnQgeXlwYXJzZSAodm9pZCk7Ci0jZW5kaWYKLQwKLSNpZiBfX0dOVUNfXyA+IDEJCS8qIEdOVSBDIGFuZCBHTlUgQysrIGRlZmluZSB0aGlzLiAgKi8KLSNkZWZpbmUgX195eV9tZW1jcHkoVE8sRlJPTSxDT1VOVCkJX19idWlsdGluX21lbWNweShUTyxGUk9NLENPVU5UKQotI2Vsc2UJCQkJLyogbm90IEdOVSBDIG9yIEMrKyAqLwotI2lmbmRlZiBfX2NwbHVzcGx1cwotCi0vKiBUaGlzIGlzIHRoZSBtb3N0IHJlbGlhYmxlIHdheSB0byBhdm9pZCBpbmNvbXBhdGliaWxpdGllcwotICAgaW4gYXZhaWxhYmxlIGJ1aWx0LWluIGZ1bmN0aW9ucyBvbiB2YXJpb3VzIHN5c3RlbXMuICAqLwotc3RhdGljIHZvaWQKLV9feXlfbWVtY3B5ICh0bywgZnJvbSwgY291bnQpCi0gICAgIGNoYXIgKnRvOwotICAgICBjaGFyICpmcm9tOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKmYgPSBmcm9tOwotICByZWdpc3RlciBjaGFyICp0ID0gdG87Ci0gIHJlZ2lzdGVyIGludCBpID0gY291bnQ7Ci0KLSAgd2hpbGUgKGktLSA+IDApCi0gICAgKnQrKyA9ICpmKys7Ci19Ci0KLSNlbHNlIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qIFRoaXMgaXMgdGhlIG1vc3QgcmVsaWFibGUgd2F5IHRvIGF2b2lkIGluY29tcGF0aWJpbGl0aWVzCi0gICBpbiBhdmFpbGFibGUgYnVpbHQtaW4gZnVuY3Rpb25zIG9uIHZhcmlvdXMgc3lzdGVtcy4gICovCi1zdGF0aWMgdm9pZAotX195eV9tZW1jcHkgKGNoYXIgKnRvLCBjaGFyICpmcm9tLCBpbnQgY291bnQpCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKmYgPSBmcm9tOwotICByZWdpc3RlciBjaGFyICp0ID0gdG87Ci0gIHJlZ2lzdGVyIGludCBpID0gY291bnQ7Ci0KLSAgd2hpbGUgKGktLSA+IDApCi0gICAgKnQrKyA9ICpmKys7Ci19Ci0KLSNlbmRpZgotI2VuZGlmCi0MCi0jbGluZSAxOTYgIi9zdG9uZS9qaW1iL21haW4tOThyMi9zaGFyZS9iaXNvbi5zaW1wbGUiCi0KLS8qIFRoZSB1c2VyIGNhbiBkZWZpbmUgWVlQQVJTRV9QQVJBTSBhcyB0aGUgbmFtZSBvZiBhbiBhcmd1bWVudCB0byBiZSBwYXNzZWQKLSAgIGludG8geXlwYXJzZS4gIFRoZSBhcmd1bWVudCBzaG91bGQgaGF2ZSB0eXBlIHZvaWQgKi4KLSAgIEl0IHNob3VsZCBhY3R1YWxseSBwb2ludCB0byBhbiBvYmplY3QuCi0gICBHcmFtbWFyIGFjdGlvbnMgY2FuIGFjY2VzcyB0aGUgdmFyaWFibGUgYnkgY2FzdGluZyBpdAotICAgdG8gdGhlIHByb3BlciBwb2ludGVyIHR5cGUuICAqLwotCi0jaWZkZWYgWVlQQVJTRV9QQVJBTQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHIHZvaWQgKllZUEFSU0VfUEFSQU0KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCi0jZWxzZSAvKiBub3QgX19jcGx1c3BsdXMgKi8KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcgWVlQQVJTRV9QQVJBTQotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wgdm9pZCAqWVlQQVJTRV9QQVJBTTsKLSNlbmRpZiAvKiBub3QgX19jcGx1c3BsdXMgKi8KLSNlbHNlIC8qIG5vdCBZWVBBUlNFX1BBUkFNICovCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTAotI2VuZGlmIC8qIG5vdCBZWVBBUlNFX1BBUkFNICovCi0KLWludAoteXlwYXJzZShZWVBBUlNFX1BBUkFNX0FSRykKLSAgICAgWVlQQVJTRV9QQVJBTV9ERUNMCi17Ci0gIHJlZ2lzdGVyIGludCB5eXN0YXRlOwotICByZWdpc3RlciBpbnQgeXluOwotICByZWdpc3RlciBzaG9ydCAqeXlzc3A7Ci0gIHJlZ2lzdGVyIFlZU1RZUEUgKnl5dnNwOwotICBpbnQgeXllcnJzdGF0dXM7CS8qICBudW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkICovCi0gIGludCB5eWNoYXIxID0gMDsJCS8qICBsb29rYWhlYWQgdG9rZW4gYXMgYW4gaW50ZXJuYWwgKHRyYW5zbGF0ZWQpIHRva2VuIG51bWJlciAqLwotCi0gIHNob3J0CXl5c3NhW1lZSU5JVERFUFRIXTsJLyogIHRoZSBzdGF0ZSBzdGFjawkJCSovCi0gIFlZU1RZUEUgeXl2c2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIHNlbWFudGljIHZhbHVlIHN0YWNrCQkqLwotCi0gIHNob3J0ICp5eXNzID0geXlzc2E7CQkvKiAgcmVmZXIgdG8gdGhlIHN0YWNrcyB0aHJ1IHNlcGFyYXRlIHBvaW50ZXJzICovCi0gIFlZU1RZUEUgKnl5dnMgPSB5eXZzYTsJLyogIHRvIGFsbG93IHl5b3ZlcmZsb3cgdG8geHJlYWxsb2NhdGUgdGhlbSBlbHNld2hlcmUgKi8KLQotI2lmZGVmIFlZTFNQX05FRURFRAotICBZWUxUWVBFIHl5bHNhW1lZSU5JVERFUFRIXTsJLyogIHRoZSBsb2NhdGlvbiBzdGFjawkJCSovCi0gIFlZTFRZUEUgKnl5bHMgPSB5eWxzYTsKLSAgWVlMVFlQRSAqeXlsc3A7Ci0KLSNkZWZpbmUgWVlQT1BTVEFDSyAgICh5eXZzcC0tLCB5eXNzcC0tLCB5eWxzcC0tKQotI2Vsc2UKLSNkZWZpbmUgWVlQT1BTVEFDSyAgICh5eXZzcC0tLCB5eXNzcC0tKQotI2VuZGlmCi0KLSAgaW50IHl5c3RhY2tzaXplID0gWVlJTklUREVQVEg7Ci0KLSNpZmRlZiBZWVBVUkUKLSAgaW50IHl5Y2hhcjsKLSAgWVlTVFlQRSB5eWx2YWw7Ci0gIGludCB5eW5lcnJzOwotI2lmZGVmIFlZTFNQX05FRURFRAotICBZWUxUWVBFIHl5bGxvYzsKLSNlbmRpZgotI2VuZGlmCi0KLSAgWVlTVFlQRSB5eXZhbDsJCS8qICB0aGUgdmFyaWFibGUgdXNlZCB0byByZXR1cm4JCSovCi0JCQkJLyogIHNlbWFudGljIHZhbHVlcyBmcm9tIHRoZSBhY3Rpb24JKi8KLQkJCQkvKiAgcm91dGluZXMJCQkJKi8KLQotICBpbnQgeXlsZW47Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgZnByaW50ZihzdGRlcnIsICJTdGFydGluZyBwYXJzZVxuIik7Ci0jZW5kaWYKLQotICB5eXN0YXRlID0gMDsKLSAgeXllcnJzdGF0dXMgPSAwOwotICB5eW5lcnJzID0gMDsKLSAgeXljaGFyID0gWVlFTVBUWTsJCS8qIENhdXNlIGEgdG9rZW4gdG8gYmUgcmVhZC4gICovCi0KLSAgLyogSW5pdGlhbGl6ZSBzdGFjayBwb2ludGVycy4KLSAgICAgV2FzdGUgb25lIGVsZW1lbnQgb2YgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrCi0gICAgIHNvIHRoYXQgdGhleSBzdGF5IG9uIHRoZSBzYW1lIGxldmVsIGFzIHRoZSBzdGF0ZSBzdGFjay4KLSAgICAgVGhlIHdhc3RlZCBlbGVtZW50cyBhcmUgbmV2ZXIgaW5pdGlhbGl6ZWQuICAqLwotCi0gIHl5c3NwID0geXlzcyAtIDE7Ci0gIHl5dnNwID0geXl2czsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgeXlsc3AgPSB5eWxzOwotI2VuZGlmCi0KLS8qIFB1c2ggYSBuZXcgc3RhdGUsIHdoaWNoIGlzIGZvdW5kIGluICB5eXN0YXRlICAuICAqLwotLyogSW4gYWxsIGNhc2VzLCB3aGVuIHlvdSBnZXQgaGVyZSwgdGhlIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFja3MKLSAgIGhhdmUganVzdCBiZWVuIHB1c2hlZC4gc28gcHVzaGluZyBhIHN0YXRlIGhlcmUgZXZlbnMgdGhlIHN0YWNrcy4gICovCi15eW5ld3N0YXRlOgotCi0gICorK3l5c3NwID0geXlzdGF0ZTsKLQotICBpZiAoeXlzc3AgPj0geXlzcyArIHl5c3RhY2tzaXplIC0gMSkKLSAgICB7Ci0gICAgICAvKiBHaXZlIHVzZXIgYSBjaGFuY2UgdG8geHJlYWxsb2NhdGUgdGhlIHN0YWNrICovCi0gICAgICAvKiBVc2UgY29waWVzIG9mIHRoZXNlIHNvIHRoYXQgdGhlICYncyBkb24ndCBmb3JjZSB0aGUgcmVhbCBvbmVzIGludG8gbWVtb3J5LiAqLwotICAgICAgWVlTVFlQRSAqeXl2czEgPSB5eXZzOwotICAgICAgc2hvcnQgKnl5c3MxID0geXlzczsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIFlZTFRZUEUgKnl5bHMxID0geXlsczsKLSNlbmRpZgotCi0gICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgdXNlZCBzaXplIG9mIHRoZSB0aHJlZSBzdGFja3MsIGluIGVsZW1lbnRzLiAgKi8KLSAgICAgIGludCBzaXplID0geXlzc3AgLSB5eXNzICsgMTsKLQotI2lmZGVmIHl5b3ZlcmZsb3cKLSAgICAgIC8qIEVhY2ggc3RhY2sgcG9pbnRlciBhZGRyZXNzIGlzIGZvbGxvd2VkIGJ5IHRoZSBzaXplIG9mCi0JIHRoZSBkYXRhIGluIHVzZSBpbiB0aGF0IHN0YWNrLCBpbiBieXRlcy4gICovCi0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICAvKiBUaGlzIHVzZWQgdG8gYmUgYSBjb25kaXRpb25hbCBhcm91bmQganVzdCB0aGUgdHdvIGV4dHJhIGFyZ3MsCi0JIGJ1dCB0aGF0IG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB5eW92ZXJmbG93IGlzIGEgbWFjcm8uICAqLwotICAgICAgeXlvdmVyZmxvdygicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKLQkJICZ5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKLQkJICZ5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKLQkJICZ5eWxzMSwgc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSwKLQkJICZ5eXN0YWNrc2l6ZSk7Ci0jZWxzZQotICAgICAgeXlvdmVyZmxvdygicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKLQkJICZ5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKLQkJICZ5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKLQkJICZ5eXN0YWNrc2l6ZSk7Ci0jZW5kaWYKLQotICAgICAgeXlzcyA9IHl5c3MxOyB5eXZzID0geXl2czE7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICB5eWxzID0geXlsczE7Ci0jZW5kaWYKLSNlbHNlIC8qIG5vIHl5b3ZlcmZsb3cgKi8KLSAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgb3VyIG93biB3YXkuICAqLwotICAgICAgaWYgKHl5c3RhY2tzaXplID49IFlZTUFYREVQVEgpCi0JewotCSAgeXllcnJvcigicGFyc2VyIHN0YWNrIG92ZXJmbG93Iik7Ci0JICByZXR1cm4gMjsKLQl9Ci0gICAgICB5eXN0YWNrc2l6ZSAqPSAyOwotICAgICAgaWYgKHl5c3RhY2tzaXplID4gWVlNQVhERVBUSCkKLQl5eXN0YWNrc2l6ZSA9IFlZTUFYREVQVEg7Ci0gICAgICB5eXNzID0gKHNob3J0ICopIGFsbG9jYSAoeXlzdGFja3NpemUgKiBzaXplb2YgKCp5eXNzcCkpOwotICAgICAgX195eV9tZW1jcHkgKChjaGFyICopeXlzcywgKGNoYXIgKil5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSk7Ci0gICAgICB5eXZzID0gKFlZU1RZUEUgKikgYWxsb2NhICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSk7Ci0gICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eXZzLCAoY2hhciAqKXl5dnMxLCBzaXplICogc2l6ZW9mICgqeXl2c3ApKTsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIHl5bHMgPSAoWVlMVFlQRSAqKSBhbGxvY2EgKHl5c3RhY2tzaXplICogc2l6ZW9mICgqeXlsc3ApKTsKLSAgICAgIF9feXlfbWVtY3B5ICgoY2hhciAqKXl5bHMsIChjaGFyICopeXlsczEsIHNpemUgKiBzaXplb2YgKCp5eWxzcCkpOwotI2VuZGlmCi0jZW5kaWYgLyogbm8geXlvdmVyZmxvdyAqLwotCi0gICAgICB5eXNzcCA9IHl5c3MgKyBzaXplIC0gMTsKLSAgICAgIHl5dnNwID0geXl2cyArIHNpemUgLSAxOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgeXlsc3AgPSB5eWxzICsgc2l6ZSAtIDE7Ci0jZW5kaWYKLQotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JZnByaW50ZihzdGRlcnIsICJTdGFjayBzaXplIGluY3JlYXNlZCB0byAlZFxuIiwgeXlzdGFja3NpemUpOwotI2VuZGlmCi0KLSAgICAgIGlmICh5eXNzcCA+PSB5eXNzICsgeXlzdGFja3NpemUgLSAxKQotCVlZQUJPUlQ7Ci0gICAgfQotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIGZwcmludGYoc3RkZXJyLCAiRW50ZXJpbmcgc3RhdGUgJWRcbiIsIHl5c3RhdGUpOwotI2VuZGlmCi0KLSAgZ290byB5eWJhY2t1cDsKLSB5eWJhY2t1cDoKLQotLyogRG8gYXBwcm9wcmlhdGUgcHJvY2Vzc2luZyBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZS4gICovCi0vKiBSZWFkIGEgbG9va2FoZWFkIHRva2VuIGlmIHdlIG5lZWQgb25lIGFuZCBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KLS8qIHl5cmVzdW1lOiAqLwotCi0gIC8qIEZpcnN0IHRyeSB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRob3V0IHJlZmVyZW5jZSB0byBsb29rYWhlYWQgdG9rZW4uICAqLwotCi0gIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLSAgaWYgKHl5biA9PSBZWUZMQUcpCi0gICAgZ290byB5eWRlZmF1bHQ7Ci0KLSAgLyogTm90IGtub3duID0+IGdldCBhIGxvb2thaGVhZCB0b2tlbiBpZiBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KLQotICAvKiB5eWNoYXIgaXMgZWl0aGVyIFlZRU1QVFkgb3IgWVlFT0YKLSAgICAgb3IgYSB2YWxpZCB0b2tlbiBpbiBleHRlcm5hbCBmb3JtLiAgKi8KLQotICBpZiAoeXljaGFyID09IFlZRU1QVFkpCi0gICAgewotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JZnByaW50ZihzdGRlcnIsICJSZWFkaW5nIGEgdG9rZW46ICIpOwotI2VuZGlmCi0gICAgICB5eWNoYXIgPSBZWUxFWDsKLSAgICB9Ci0KLSAgLyogQ29udmVydCB0b2tlbiB0byBpbnRlcm5hbCBmb3JtIChpbiB5eWNoYXIxKSBmb3IgaW5kZXhpbmcgdGFibGVzIHdpdGggKi8KLQotICBpZiAoeXljaGFyIDw9IDApCQkvKiBUaGlzIG1lYW5zIGVuZCBvZiBpbnB1dC4gKi8KLSAgICB7Ci0gICAgICB5eWNoYXIxID0gMDsKLSAgICAgIHl5Y2hhciA9IFlZRU9GOwkJLyogRG9uJ3QgY2FsbCBZWUxFWCBhbnkgbW9yZSAqLwotCi0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQlmcHJpbnRmKHN0ZGVyciwgIk5vdyBhdCBlbmQgb2YgaW5wdXQuXG4iKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHl5Y2hhcjEgPSBZWVRSQU5TTEFURSh5eWNoYXIpOwotCi0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICJOZXh0IHRva2VuIGlzICVkICglcyIsIHl5Y2hhciwgeXl0bmFtZVt5eWNoYXIxXSk7Ci0JICAvKiBHaXZlIHRoZSBpbmRpdmlkdWFsIHBhcnNlciBhIHdheSB0byBwcmludCB0aGUgcHJlY2lzZSBtZWFuaW5nCi0JICAgICBvZiBhIHRva2VuLCBmb3IgZnVydGhlciBkZWJ1Z2dpbmcgaW5mby4gICovCi0jaWZkZWYgWVlQUklOVAotCSAgWVlQUklOVCAoc3RkZXJyLCB5eWNoYXIsIHl5bHZhbCk7Ci0jZW5kaWYKLQkgIGZwcmludGYgKHN0ZGVyciwgIilcbiIpOwotCX0KLSNlbmRpZgotICAgIH0KLQotICB5eW4gKz0geXljaGFyMTsKLSAgaWYgKHl5biA8IDAgfHwgeXluID4gWVlMQVNUIHx8IHl5Y2hlY2tbeXluXSAhPSB5eWNoYXIxKQotICAgIGdvdG8geXlkZWZhdWx0OwotCi0gIHl5biA9IHl5dGFibGVbeXluXTsKLQotICAvKiB5eW4gaXMgd2hhdCB0byBkbyBmb3IgdGhpcyB0b2tlbiB0eXBlIGluIHRoaXMgc3RhdGUuCi0gICAgIE5lZ2F0aXZlID0+IHJlZHVjZSwgLXl5biBpcyBydWxlIG51bWJlci4KLSAgICAgUG9zaXRpdmUgPT4gc2hpZnQsIHl5biBpcyBuZXcgc3RhdGUuCi0gICAgICAgTmV3IHN0YXRlIGlzIGZpbmFsIHN0YXRlID0+IGRvbid0IGJvdGhlciB0byBzaGlmdCwKLSAgICAgICBqdXN0IHJldHVybiBzdWNjZXNzLgotICAgICAwLCBvciBtb3N0IG5lZ2F0aXZlIG51bWJlciA9PiBlcnJvci4gICovCi0KLSAgaWYgKHl5biA8IDApCi0gICAgewotICAgICAgaWYgKHl5biA9PSBZWUZMQUcpCi0JZ290byB5eWVycmxhYjsKLSAgICAgIHl5biA9IC15eW47Ci0gICAgICBnb3RvIHl5cmVkdWNlOwotICAgIH0KLSAgZWxzZSBpZiAoeXluID09IDApCi0gICAgZ290byB5eWVycmxhYjsKLQotICBpZiAoeXluID09IFlZRklOQUwpCi0gICAgWVlBQ0NFUFQ7Ci0KLSAgLyogU2hpZnQgdGhlIGxvb2thaGVhZCB0b2tlbi4gICovCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgZnByaW50ZihzdGRlcnIsICJTaGlmdGluZyB0b2tlbiAlZCAoJXMpLCAiLCB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOwotI2VuZGlmCi0KLSAgLyogRGlzY2FyZCB0aGUgdG9rZW4gYmVpbmcgc2hpZnRlZCB1bmxlc3MgaXQgaXMgZW9mLiAgKi8KLSAgaWYgKHl5Y2hhciAhPSBZWUVPRikKLSAgICB5eWNoYXIgPSBZWUVNUFRZOwotCi0gICorK3l5dnNwID0geXlsdmFsOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAqKyt5eWxzcCA9IHl5bGxvYzsKLSNlbmRpZgotCi0gIC8qIGNvdW50IHRva2VucyBzaGlmdGVkIHNpbmNlIGVycm9yOyBhZnRlciB0aHJlZSwgdHVybiBvZmYgZXJyb3Igc3RhdHVzLiAgKi8KLSAgaWYgKHl5ZXJyc3RhdHVzKSB5eWVycnN0YXR1cy0tOwotCi0gIHl5c3RhdGUgPSB5eW47Ci0gIGdvdG8geXluZXdzdGF0ZTsKLQotLyogRG8gdGhlIGRlZmF1bHQgYWN0aW9uIGZvciB0aGUgY3VycmVudCBzdGF0ZS4gICovCi15eWRlZmF1bHQ6Ci0KLSAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07Ci0gIGlmICh5eW4gPT0gMCkKLSAgICBnb3RvIHl5ZXJybGFiOwotCi0vKiBEbyBhIHJlZHVjdGlvbi4gIHl5biBpcyB0aGUgbnVtYmVyIG9mIGEgcnVsZSB0byByZWR1Y2Ugd2l0aC4gICovCi15eXJlZHVjZToKLSAgeXlsZW4gPSB5eXIyW3l5bl07Ci0gIGlmICh5eWxlbiA+IDApCi0gICAgeXl2YWwgPSB5eXZzcFsxLXl5bGVuXTsgLyogaW1wbGVtZW50IGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFjdGlvbiAqLwotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJSZWR1Y2luZyB2aWEgcnVsZSAlZCAobGluZSAlZCksICIsCi0JICAgICAgIHl5biwgeXlybGluZVt5eW5dKTsKLQotICAgICAgLyogUHJpbnQgdGhlIHN5bWJvbHMgYmVpbmcgcmVkdWNlZCwgYW5kIHRoZWlyIHJlc3VsdC4gICovCi0gICAgICBmb3IgKGkgPSB5eXByaHNbeXluXTsgeXlyaHNbaV0gPiAwOyBpKyspCi0JZnByaW50ZiAoc3RkZXJyLCAiJXMgIiwgeXl0bmFtZVt5eXJoc1tpXV0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIC0+ICVzXG4iLCB5eXRuYW1lW3l5cjFbeXluXV0pOwotICAgIH0KLSNlbmRpZgotCi0KLSAgc3dpdGNoICh5eW4pIHsKLQotY2FzZSAzOgotI2xpbmUgMjA4ICJqdi1leHAueSIKLXsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZShPUF9UWVBFKTsKLQkJICB3cml0ZV9leHBfZWx0X3R5cGUoeXl2c3BbMF0udHZhbCk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7Ci0JCTsKLSAgICBicmVhazt9Ci1jYXNlIDY6Ci0jbGluZSAyMjIgImp2LWV4cC55IgotewotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9TVFJJTkcpOwotCQkgIHdyaXRlX2V4cF9zdHJpbmcgKHl5dnNwWzBdLnN2YWwpOwotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9TVFJJTkcpOwotCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA3OgotI2xpbmUgMjMxICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoeXl2c3BbMF0udHlwZWRfdmFsX2ludC50eXBlKTsKLQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSh5eXZzcFswXS50eXBlZF92YWxfaW50LnZhbCkpOwotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsgOwotICAgIGJyZWFrO30KLWNhc2UgODoKLSNsaW5lIDIzNiAianYtZXhwLnkiCi17IFlZU1RZUEUgdmFsOwotCQkgIHBhcnNlX251bWJlciAoeXl2c3BbMF0uc3ZhbC5wdHIsIHl5dnNwWzBdLnN2YWwubGVuZ3RoLCAwLCAmdmFsKTsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCSAgd3JpdGVfZXhwX2VsdF90eXBlICh2YWwudHlwZWRfdmFsX2ludC50eXBlKTsKLQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKXZhbC50eXBlZF92YWxfaW50LnZhbCk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA5OgotI2xpbmUgMjQ0ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0RPVUJMRSk7Ci0JCSAgd3JpdGVfZXhwX2VsdF90eXBlICh5eXZzcFswXS50eXBlZF92YWxfZmxvYXQudHlwZSk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9kYmxjc3QgKHl5dnNwWzBdLnR5cGVkX3ZhbF9mbG9hdC5kdmFsKTsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRE9VQkxFKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTA6Ci0jbGluZSAyNDkgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCSAgd3JpdGVfZXhwX2VsdF90eXBlIChqYXZhX2Jvb2xlYW5fdHlwZSk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCl5eXZzcFswXS5sdmFsKTsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEzOgotI2xpbmUgMjY2ICJqdi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGphdmFfYm9vbGVhbl90eXBlOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxNjoKLSNsaW5lIDI3NiAianYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBqYXZhX2J5dGVfdHlwZTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTc6Ci0jbGluZSAyNzggImp2LWV4cC55IgoteyB5eXZhbC50dmFsID0gamF2YV9zaG9ydF90eXBlOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxODoKLSNsaW5lIDI4MCAianYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBqYXZhX2ludF90eXBlOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxOToKLSNsaW5lIDI4MiAianYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBqYXZhX2xvbmdfdHlwZTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjA6Ci0jbGluZSAyODQgImp2LWV4cC55IgoteyB5eXZhbC50dmFsID0gamF2YV9jaGFyX3R5cGU7IDsKLSAgICBicmVhazt9Ci1jYXNlIDIxOgotI2xpbmUgMjg5ICJqdi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGphdmFfZmxvYXRfdHlwZTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjI6Ci0jbGluZSAyOTEgImp2LWV4cC55IgoteyB5eXZhbC50dmFsID0gamF2YV9kb3VibGVfdHlwZTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjM6Ci0jbGluZSAzMDMgImp2LWV4cC55IgoteyB5eXZhbC50dmFsID0gamF2YV90eXBlX2Zyb21fbmFtZSAoeXl2c3BbMF0uc3ZhbCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDI1OgotI2xpbmUgMzEyICJqdi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGphdmFfYXJyYXlfdHlwZSAoeXl2c3BbLTFdLnR2YWwsIHl5dnNwWzBdLmx2YWwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyNjoKLSNsaW5lIDMxNCAianYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBqYXZhX2FycmF5X3R5cGUgKGphdmFfdHlwZV9mcm9tX25hbWUgKHl5dnNwWy0xXS5zdmFsKSwgeXl2c3BbMF0ubHZhbCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDMzOgotI2xpbmUgMzM0ICJqdi1leHAueSIKLXsgeXl2YWwuc3ZhbC5sZW5ndGggPSB5eXZzcFstMl0uc3ZhbC5sZW5ndGggKyB5eXZzcFswXS5zdmFsLmxlbmd0aCArIDE7Ci0JCSAgaWYgKHl5dnNwWy0yXS5zdmFsLnB0ciArIHl5dnNwWy0yXS5zdmFsLmxlbmd0aCArIDEgPT0geXl2c3BbMF0uc3ZhbC5wdHIKLQkJICAgICAgJiYgeXl2c3BbLTJdLnN2YWwucHRyW3l5dnNwWy0yXS5zdmFsLmxlbmd0aF0gPT0gJy4nKQotCQkgICAgeXl2YWwuc3ZhbC5wdHIgPSB5eXZzcFstMl0uc3ZhbC5wdHI7ICAvKiBPcHRpbWl6YXRpb24uICovCi0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICB5eXZhbC5zdmFsLnB0ciA9IChjaGFyICopIHhtYWxsb2MgKHl5dmFsLnN2YWwubGVuZ3RoICsgMSk7Ci0JCSAgICAgIG1ha2VfY2xlYW51cCAoZnJlZSwgeXl2YWwuc3ZhbC5wdHIpOwotCQkgICAgICBzcHJpbnRmICh5eXZhbC5zdmFsLnB0ciwgIiUuKnMuJS4qcyIsCi0JCQkgICAgICAgeXl2c3BbLTJdLnN2YWwubGVuZ3RoLCB5eXZzcFstMl0uc3ZhbC5wdHIsIHl5dnNwWzBdLnN2YWwubGVuZ3RoLCB5eXZzcFswXS5zdmFsLnB0cik7Ci0JCX0gOwotICAgIGJyZWFrO30KLWNhc2UgMzU6Ci0jbGluZSAzNTggImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQ09NTUEpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzOToKLSNsaW5lIDM2OSAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9USElTKTsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVEhJUyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ1OgotI2xpbmUgMzc3ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0FSUkFZKTsKLQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSAwKTsKLQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSB5eXZzcFswXS5sdmFsKTsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQVJSQVkpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0NjoKLSNsaW5lIDM4NSAianYtZXhwLnkiCi17IHN0YXJ0X2FyZ2xpc3QgKCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ3OgotI2xpbmUgMzkwICJqdi1leHAueSIKLXsgeXl2YWwubHZhbCA9IGVuZF9hcmdsaXN0ICgpIC0gMTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDg6Ci0jbGluZSAzOTUgImp2LWV4cC55IgoteyBlcnJvciAoIkZJWE1FIC0gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0OToKLSNsaW5lIDQwMCAianYtZXhwLnkiCi17IGFyZ2xpc3RfbGVuID0gMTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTA6Ci0jbGluZSA0MDIgImp2LWV4cC55IgoteyBhcmdsaXN0X2xlbisrOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1MToKLSNsaW5lIDQwNyAianYtZXhwLnkiCi17IGFyZ2xpc3RfbGVuID0gMDsgOwotICAgIGJyZWFrO30KLWNhc2UgNTM6Ci0jbGluZSA0MTMgImp2LWV4cC55IgoteyBlcnJvciAoIkZJWE1FIC0gQXJyYXlDcmVhdGlpb25FeHByZXNzaW9uIik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU0OgotI2xpbmUgNDE1ICJqdi1leHAueSIKLXsgZXJyb3IgKCJGSVhNRSAtIEFycmF5Q3JlYXRpaW9uRXhwcmVzc2lvbiIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1ODoKLSNsaW5lIDQyOSAianYtZXhwLnkiCi17IHl5dmFsLmx2YWwgPSAxOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1OToKLSNsaW5lIDQzMSAianYtZXhwLnkiCi17IHl5dmFsLmx2YWwgPSB5eXZzcFstMl0ubHZhbCArIDE7IDsKLSAgICBicmVhazt9Ci1jYXNlIDYxOgotI2xpbmUgNDM3ICJqdi1leHAueSIKLXsgeXl2YWwubHZhbCA9IDA7IDsKLSAgICBicmVhazt9Ci1jYXNlIDYyOgotI2xpbmUgNDQyICJqdi1leHAueSIKLXsgcHVzaF9maWVsZG5hbWVzICh5eXZzcFswXS5zdmFsKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjM6Ci0jbGluZSA0NDQgImp2LWV4cC55IgoteyBwdXNoX2ZpZWxkbmFtZXMgKHl5dnNwWzBdLnN2YWwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2NDoKLSNsaW5lIDQ1MCAianYtZXhwLnkiCi17IGVycm9yICgibWV0aG9kIGludm9jYXRpb24gbm90IGltcGxlbWVudGVkIik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY1OgotI2xpbmUgNDUyICJqdi1leHAueSIKLXsgZXJyb3IgKCJtZXRob2QgaW52b2NhdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjY6Ci0jbGluZSA0NTQgImp2LWV4cC55IgoteyBlcnJvciAoIm1ldGhvZCBpbnZvY2F0aW9uIG5vdCBpbXBsZW1lbnRlZCIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2NzoKLSNsaW5lIDQ1OSAianYtZXhwLnkiCi17Ci0gICAgICAgICAgICAgICAgICAvKiBFbWl0IGNvZGUgZm9yIHRoZSBOYW1lIG5vdywgdGhlbiBleGNoYW5nZSBpdCBpbiB0aGUKLQkJICAgICBleHBvdXQgYXJyYXkgd2l0aCB0aGUgRXhwcmVzc2lvbidzIGNvZGUuICBXZSBjb3VsZAotCQkgICAgIGludHJvZHVjZSBhIE9QX1NXQVAgY29kZSBvciBhIHJldmVyc2VkIHZlcnNpb24gb2YKLQkJICAgICBCSU5PUF9TVUJTQ1JJUFQsIGJ1dCB0aGF0IG1ha2VzIHRoZSByZXN0IG9mIEdEQiBwYXkKLQkJICAgICBmb3Igb3VyIHBhcnNpbmcga2x1ZGdlcy4gICovCi0JCSAgc3RydWN0IGV4cHJlc3Npb24gKm5hbWVfZXhwcjsKLQotCQkgIHB1c2hfZXhwcmVzc2lvbl9uYW1lICh5eXZzcFstM10uc3ZhbCk7Ci0JCSAgbmFtZV9leHByID0gY29weV9leHAgKGV4cG91dCwgZXhwb3V0X3B0cik7Ci0JCSAgZXhwb3V0X3B0ciAtPSBuYW1lX2V4cHItPm5lbHRzOwotCQkgIGluc2VydF9leHAgKGV4cG91dF9wdHItbGVuZ3RoX29mX3N1YmV4cCAoZXhwb3V0LCBleHBvdXRfcHRyKSwKLQkJCSAgICAgIG5hbWVfZXhwcik7Ci0JCSAgZnJlZSAobmFtZV9leHByKTsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfU1VCU0NSSVBUKTsKLQkJOwotICAgIGJyZWFrO30KLWNhc2UgNjg6Ci0jbGluZSA0NzYgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfU1VCU0NSSVBUKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjk6Ci0jbGluZSA0NzggImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfU1VCU0NSSVBUKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNzE6Ci0jbGluZSA0ODQgImp2LWV4cC55IgoteyBwdXNoX2V4cHJlc3Npb25fbmFtZSAoeXl2c3BbMF0uc3ZhbCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDc1OgotI2xpbmUgNDkzICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfUE9TVElOQ1JFTUVOVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDc2OgotI2xpbmUgNDk4ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfUE9TVERFQ1JFTUVOVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDgwOgotI2xpbmUgNTA2ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTkVHKTsgOwotICAgIGJyZWFrO30KLWNhc2UgODE6Ci0jbGluZSA1MDggImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9JTkQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4MzoKLSNsaW5lIDUxNCAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX1BSRUlOQ1JFTUVOVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDg0OgotI2xpbmUgNTE5ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfUFJFREVDUkVNRU5UKTsgOwotICAgIGJyZWFrO30KLWNhc2UgODY6Ci0jbGluZSA1MjUgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DT01QTEVNRU5UKTsgOwotICAgIGJyZWFrO30KLWNhc2UgODc6Ci0jbGluZSA1MjcgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9MT0dJQ0FMX05PVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDg5OgotI2xpbmUgNTMzICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7Ci0JCSAgd3JpdGVfZXhwX2VsdF90eXBlIChqYXZhX2FycmF5X3R5cGUgKHl5dnNwWy0zXS50dmFsLCB5eXZzcFstMl0ubHZhbCkpOwotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA5MDoKLSNsaW5lIDUzNyAianYtZXhwLnkiCi17Ci0JCSAgaW50IGV4cF9zaXplID0gZXhwb3V0X3B0cjsKLQkJICBpbnQgbGFzdF9leHBfc2l6ZSA9IGxlbmd0aF9vZl9zdWJleHAoZXhwb3V0LCBleHBvdXRfcHRyKTsKLQkJICBzdHJ1Y3QgdHlwZSAqdHlwZTsKLQkJICBpbnQgaTsKLQkJICBpbnQgYmFzZSA9IGV4cG91dF9wdHIgLSBsYXN0X2V4cF9zaXplIC0gMzsKLQkJICBpZiAoYmFzZSA8IDAgfHwgZXhwb3V0LT5lbHRzW2Jhc2UrMl0ub3Bjb2RlICE9IE9QX1RZUEUpCi0JCSAgICBlcnJvciAoImludmFsaWQgY2FzdCBleHByZXNzaW9uIik7Ci0JCSAgdHlwZSA9IGV4cG91dC0+ZWx0c1tiYXNlKzFdLnR5cGU7Ci0JCSAgLyogUmVtb3ZlIHRoZSAnRXhwcmVzc2lvbicgYW5kIHNsaWRlIHRoZQotCQkgICAgIFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyBkb3duIHRvIHJlcGxhY2UgaXQuICovCi0JCSAgZm9yIChpID0gMDsgIGkgPCBsYXN0X2V4cF9zaXplOyAgaSsrKQotCQkgICAgZXhwb3V0LT5lbHRzW2Jhc2UgKyBpXSA9IGV4cG91dC0+ZWx0c1tiYXNlICsgaSArIDNdOwotCQkgIGV4cG91dF9wdHIgLT0gMzsKLQkJICBpZiAoVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfU1RSVUNUKQotCQkgICAgdHlwZSA9IGxvb2t1cF9wb2ludGVyX3R5cGUgKHR5cGUpOwotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOwotCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAodHlwZSk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7Ci0JCTsKLSAgICBicmVhazt9Ci1jYXNlIDkxOgotI2xpbmUgNTU4ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7Ci0JCSAgd3JpdGVfZXhwX2VsdF90eXBlIChqYXZhX2FycmF5X3R5cGUgKGphdmFfdHlwZV9mcm9tX25hbWUgKHl5dnNwWy0zXS5zdmFsKSwgeXl2c3BbLTJdLmx2YWwpKTsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsgOwotICAgIGJyZWFrO30KLWNhc2UgOTM6Ci0jbGluZSA1NjcgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTVVMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgOTQ6Ci0jbGluZSA1NjkgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfRElWKTsgOwotICAgIGJyZWFrO30KLWNhc2UgOTU6Ci0jbGluZSA1NzEgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfUkVNKTsgOwotICAgIGJyZWFrO30KLWNhc2UgOTc6Ci0jbGluZSA1NzcgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQUREKTsgOwotICAgIGJyZWFrO30KLWNhc2UgOTg6Ci0jbGluZSA1NzkgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfU1VCKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTAwOgotI2xpbmUgNTg1ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xTSCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwMToKLSNsaW5lIDU4NyAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9SU0gpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDM6Ci0jbGluZSA1OTQgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTEVTUyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwNDoKLSNsaW5lIDU5NiAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9HVFIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDU6Ci0jbGluZSA1OTggImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTEVRKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTA2OgotI2xpbmUgNjAwICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0dFUSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwODoKLSNsaW5lIDYwNyAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9FUVVBTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwOToKLSNsaW5lIDYwOSAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9OT1RFUVVBTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExMToKLSNsaW5lIDYxNSAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9CSVRXSVNFX0FORCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExMzoKLSNsaW5lIDYyMSAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9CSVRXSVNFX1hPUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExNToKLSNsaW5lIDYyNiAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9CSVRXSVNFX0lPUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExNzoKLSNsaW5lIDYzMiAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MT0dJQ0FMX0FORCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExOToKLSNsaW5lIDYzOCAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MT0dJQ0FMX09SKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTIxOgotI2xpbmUgNjQ0ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFRFUk5PUF9DT05EKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTI0OgotI2xpbmUgNjU0ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FTU0lHTik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEyNToKLSNsaW5lIDY1NiAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BU1NJR05fTU9ESUZZKTsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoeXl2c3BbLTFdLm9wY29kZSk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FTU0lHTl9NT0RJRlkpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMjY6Ci0jbGluZSA2NjMgImp2LWV4cC55IgoteyBwdXNoX2V4cHJlc3Npb25fbmFtZSAoeXl2c3BbMF0uc3ZhbCk7IDsKLSAgICBicmVhazt9Ci19Ci0gICAvKiB0aGUgYWN0aW9uIGZpbGUgZ2V0cyBjb3BpZWQgaW4gaW4gcGxhY2Ugb2YgdGhpcyBkb2xsYXJzaWduICovCi0jbGluZSA0OTggIi9zdG9uZS9qaW1iL21haW4tOThyMi9zaGFyZS9iaXNvbi5zaW1wbGUiCi0MCi0gIHl5dnNwIC09IHl5bGVuOwotICB5eXNzcCAtPSB5eWxlbjsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgeXlsc3AgLT0geXlsZW47Ci0jZW5kaWYKLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICB7Ci0gICAgICBzaG9ydCAqc3NwMSA9IHl5c3MgLSAxOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAic3RhdGUgc3RhY2sgbm93Iik7Ci0gICAgICB3aGlsZSAoc3NwMSAhPSB5eXNzcCkKLQlmcHJpbnRmIChzdGRlcnIsICIgJWQiLCAqKytzc3AxKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotI2VuZGlmCi0KLSAgKisreXl2c3AgPSB5eXZhbDsKLQotI2lmZGVmIFlZTFNQX05FRURFRAotICB5eWxzcCsrOwotICBpZiAoeXlsZW4gPT0gMCkKLSAgICB7Ci0gICAgICB5eWxzcC0+Zmlyc3RfbGluZSA9IHl5bGxvYy5maXJzdF9saW5lOwotICAgICAgeXlsc3AtPmZpcnN0X2NvbHVtbiA9IHl5bGxvYy5maXJzdF9jb2x1bW47Ci0gICAgICB5eWxzcC0+bGFzdF9saW5lID0gKHl5bHNwLTEpLT5sYXN0X2xpbmU7Ci0gICAgICB5eWxzcC0+bGFzdF9jb2x1bW4gPSAoeXlsc3AtMSktPmxhc3RfY29sdW1uOwotICAgICAgeXlsc3AtPnRleHQgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHl5bHNwLT5sYXN0X2xpbmUgPSAoeXlsc3AreXlsZW4tMSktPmxhc3RfbGluZTsKLSAgICAgIHl5bHNwLT5sYXN0X2NvbHVtbiA9ICh5eWxzcCt5eWxlbi0xKS0+bGFzdF9jb2x1bW47Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogTm93ICJzaGlmdCIgdGhlIHJlc3VsdCBvZiB0aGUgcmVkdWN0aW9uLgotICAgICBEZXRlcm1pbmUgd2hhdCBzdGF0ZSB0aGF0IGdvZXMgdG8sCi0gICAgIGJhc2VkIG9uIHRoZSBzdGF0ZSB3ZSBwb3BwZWQgYmFjayB0bwotICAgICBhbmQgdGhlIHJ1bGUgbnVtYmVyIHJlZHVjZWQgYnkuICAqLwotCi0gIHl5biA9IHl5cjFbeXluXTsKLQotICB5eXN0YXRlID0geXlwZ290b1t5eW4gLSBZWU5UQkFTRV0gKyAqeXlzc3A7Ci0gIGlmICh5eXN0YXRlID49IDAgJiYgeXlzdGF0ZSA8PSBZWUxBU1QgJiYgeXljaGVja1t5eXN0YXRlXSA9PSAqeXlzc3ApCi0gICAgeXlzdGF0ZSA9IHl5dGFibGVbeXlzdGF0ZV07Ci0gIGVsc2UKLSAgICB5eXN0YXRlID0geXlkZWZnb3RvW3l5biAtIFlZTlRCQVNFXTsKLQotICBnb3RvIHl5bmV3c3RhdGU7Ci0KLXl5ZXJybGFiOiAgIC8qIGhlcmUgb24gZGV0ZWN0aW5nIGVycm9yICovCi0KLSAgaWYgKCEgeXllcnJzdGF0dXMpCi0gICAgLyogSWYgbm90IGFscmVhZHkgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZXBvcnQgdGhpcyBlcnJvci4gICovCi0gICAgewotICAgICAgKyt5eW5lcnJzOwotCi0jaWZkZWYgWVlFUlJPUl9WRVJCT1NFCi0gICAgICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0KLSAgICAgIGlmICh5eW4gPiBZWUZMQUcgJiYgeXluIDwgWVlMQVNUKQotCXsKLQkgIGludCBzaXplID0gMDsKLQkgIGNoYXIgKm1zZzsKLQkgIGludCB4LCBjb3VudDsKLQotCSAgY291bnQgPSAwOwotCSAgLyogU3RhcnQgWCBhdCAteXluIGlmIG5lYyB0byBhdm9pZCBuZWdhdGl2ZSBpbmRleGVzIGluIHl5Y2hlY2suICAqLwotCSAgZm9yICh4ID0gKHl5biA8IDAgPyAteXluIDogMCk7Ci0JICAgICAgIHggPCAoc2l6ZW9mKHl5dG5hbWUpIC8gc2l6ZW9mKGNoYXIgKikpOyB4KyspCi0JICAgIGlmICh5eWNoZWNrW3ggKyB5eW5dID09IHgpCi0JICAgICAgc2l6ZSArPSBzdHJsZW4oeXl0bmFtZVt4XSkgKyAxNSwgY291bnQrKzsKLQkgIG1zZyA9IChjaGFyICopIHhtYWxsb2Moc2l6ZSArIDE1KTsKLQkgIGlmIChtc2cgIT0gMCkKLQkgICAgewotCSAgICAgIHN0cmNweShtc2csICJwYXJzZSBlcnJvciIpOwotCi0JICAgICAgaWYgKGNvdW50IDwgNSkKLQkJewotCQkgIGNvdW50ID0gMDsKLQkJICBmb3IgKHggPSAoeXluIDwgMCA/IC15eW4gOiAwKTsKLQkJICAgICAgIHggPCAoc2l6ZW9mKHl5dG5hbWUpIC8gc2l6ZW9mKGNoYXIgKikpOyB4KyspCi0JCSAgICBpZiAoeXljaGVja1t4ICsgeXluXSA9PSB4KQotCQkgICAgICB7Ci0JCQlzdHJjYXQobXNnLCBjb3VudCA9PSAwID8gIiwgZXhwZWN0aW5nIGAiIDogIiBvciBgIik7Ci0JCQlzdHJjYXQobXNnLCB5eXRuYW1lW3hdKTsKLQkJCXN0cmNhdChtc2csICInIik7Ci0JCQljb3VudCsrOwotCQkgICAgICB9Ci0JCX0KLQkgICAgICB5eWVycm9yKG1zZyk7Ci0JICAgICAgZnJlZShtc2cpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHl5ZXJyb3IgKCJwYXJzZSBlcnJvcjsgYWxzbyB2aXJ0dWFsIG1lbW9yeSBleGNlZWRlZCIpOwotCX0KLSAgICAgIGVsc2UKLSNlbmRpZiAvKiBZWUVSUk9SX1ZFUkJPU0UgKi8KLQl5eWVycm9yKCJwYXJzZSBlcnJvciIpOwotICAgIH0KLQotICBnb3RvIHl5ZXJybGFiMTsKLXl5ZXJybGFiMTogICAvKiBoZXJlIG9uIGVycm9yIHJhaXNlZCBleHBsaWNpdGx5IGJ5IGFuIGFjdGlvbiAqLwotCi0gIGlmICh5eWVycnN0YXR1cyA9PSAzKQotICAgIHsKLSAgICAgIC8qIGlmIGp1c3QgdHJpZWQgYW5kIGZhaWxlZCB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgYW4gZXJyb3IsIGRpc2NhcmQgaXQuICAqLwotCi0gICAgICAvKiByZXR1cm4gZmFpbHVyZSBpZiBhdCBlbmQgb2YgaW5wdXQgKi8KLSAgICAgIGlmICh5eWNoYXIgPT0gWVlFT0YpCi0JWVlBQk9SVDsKLQotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JZnByaW50ZihzdGRlcnIsICJEaXNjYXJkaW5nIHRva2VuICVkICglcykuXG4iLCB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOwotI2VuZGlmCi0KLSAgICAgIHl5Y2hhciA9IFlZRU1QVFk7Ci0gICAgfQotCi0gIC8qIEVsc2Ugd2lsbCB0cnkgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuCi0gICAgIGFmdGVyIHNoaWZ0aW5nIHRoZSBlcnJvciB0b2tlbi4gICovCi0KLSAgeXllcnJzdGF0dXMgPSAzOwkJLyogRWFjaCByZWFsIHRva2VuIHNoaWZ0ZWQgZGVjcmVtZW50cyB0aGlzICovCi0KLSAgZ290byB5eWVycmhhbmRsZTsKLQoteXllcnJkZWZhdWx0OiAgLyogY3VycmVudCBzdGF0ZSBkb2VzIG5vdCBkbyBhbnl0aGluZyBzcGVjaWFsIGZvciB0aGUgZXJyb3IgdG9rZW4uICovCi0KLSNpZiAwCi0gIC8qIFRoaXMgaXMgd3Jvbmc7IG9ubHkgc3RhdGVzIHRoYXQgZXhwbGljaXRseSB3YW50IGVycm9yIHRva2VucwotICAgICBzaG91bGQgc2hpZnQgdGhlbS4gICovCi0gIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOyAgLyogSWYgaXRzIGRlZmF1bHQgaXMgdG8gYWNjZXB0IGFueSB0b2tlbiwgb2suICBPdGhlcndpc2UgcG9wIGl0LiovCi0gIGlmICh5eW4pIGdvdG8geXlkZWZhdWx0OwotI2VuZGlmCi0KLXl5ZXJycG9wOiAgIC8qIHBvcCB0aGUgY3VycmVudCBzdGF0ZSBiZWNhdXNlIGl0IGNhbm5vdCBoYW5kbGUgdGhlIGVycm9yIHRva2VuICovCi0KLSAgaWYgKHl5c3NwID09IHl5c3MpIFlZQUJPUlQ7Ci0gIHl5dnNwLS07Ci0gIHl5c3RhdGUgPSAqLS15eXNzcDsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgeXlsc3AtLTsKLSNlbmRpZgotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIHsKLSAgICAgIHNob3J0ICpzc3AxID0geXlzcyAtIDE7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogc3RhdGUgc3RhY2sgbm93Iik7Ci0gICAgICB3aGlsZSAoc3NwMSAhPSB5eXNzcCkKLQlmcHJpbnRmIChzdGRlcnIsICIgJWQiLCAqKytzc3AxKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotI2VuZGlmCi0KLXl5ZXJyaGFuZGxlOgotCi0gIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLSAgaWYgKHl5biA9PSBZWUZMQUcpCi0gICAgZ290byB5eWVycmRlZmF1bHQ7Ci0KLSAgeXluICs9IFlZVEVSUk9SOwotICBpZiAoeXluIDwgMCB8fCB5eW4gPiBZWUxBU1QgfHwgeXljaGVja1t5eW5dICE9IFlZVEVSUk9SKQotICAgIGdvdG8geXllcnJkZWZhdWx0OwotCi0gIHl5biA9IHl5dGFibGVbeXluXTsKLSAgaWYgKHl5biA8IDApCi0gICAgewotICAgICAgaWYgKHl5biA9PSBZWUZMQUcpCi0JZ290byB5eWVycnBvcDsKLSAgICAgIHl5biA9IC15eW47Ci0gICAgICBnb3RvIHl5cmVkdWNlOwotICAgIH0KLSAgZWxzZSBpZiAoeXluID09IDApCi0gICAgZ290byB5eWVycnBvcDsKLQotICBpZiAoeXluID09IFlZRklOQUwpCi0gICAgWVlBQ0NFUFQ7Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgZnByaW50ZihzdGRlcnIsICJTaGlmdGluZyBlcnJvciB0b2tlbiwgIik7Ci0jZW5kaWYKLQotICAqKyt5eXZzcCA9IHl5bHZhbDsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgKisreXlsc3AgPSB5eWxsb2M7Ci0jZW5kaWYKLQotICB5eXN0YXRlID0geXluOwotICBnb3RvIHl5bmV3c3RhdGU7Ci19Ci0jbGluZSA2NzUgImp2LWV4cC55IgotCi0vKiBUYWtlIGNhcmUgb2YgcGFyc2luZyBhIG51bWJlciAoYW55dGhpbmcgdGhhdCBzdGFydHMgd2l0aCBhIGRpZ2l0KS4KLSAgIFNldCB5eWx2YWwgYW5kIHJldHVybiB0aGUgdG9rZW4gdHlwZTsgdXBkYXRlIGxleHB0ci4KLSAgIExFTiBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gaXQuICAqLwotCi0vKioqIE5lZWRzIHNvbWUgZXJyb3IgY2hlY2tpbmcgZm9yIHRoZSBmbG9hdCBjYXNlICoqKi8KLQotc3RhdGljIGludAotcGFyc2VfbnVtYmVyIChwLCBsZW4sIHBhcnNlZF9mbG9hdCwgcHV0aXRoZXJlKQotICAgICByZWdpc3RlciBjaGFyICpwOwotICAgICByZWdpc3RlciBpbnQgbGVuOwotICAgICBpbnQgcGFyc2VkX2Zsb2F0OwotICAgICBZWVNUWVBFICpwdXRpdGhlcmU7Ci17Ci0gIHJlZ2lzdGVyIFVMT05HRVNUIG4gPSAwOwotICBVTE9OR0VTVCBsaW1pdCwgbGltaXRfZGl2X2Jhc2U7Ci0KLSAgcmVnaXN0ZXIgaW50IGM7Ci0gIHJlZ2lzdGVyIGludCBiYXNlID0gaW5wdXRfcmFkaXg7Ci0KLSAgc3RydWN0IHR5cGUgKnR5cGU7Ci0KLSAgaWYgKHBhcnNlZF9mbG9hdCkKLSAgICB7Ci0gICAgICAvKiBJdCdzIGEgZmxvYXQgc2luY2UgaXQgY29udGFpbnMgYSBwb2ludCBvciBhbiBleHBvbmVudC4gICovCi0gICAgICBjaGFyIGM7Ci0gICAgICBpbnQgbnVtID0gMDsJLyogbnVtYmVyIG9mIHRva2VucyBzY2FubmVkIGJ5IHNjYW5mICovCi0gICAgICBjaGFyIHNhdmVkX2NoYXIgPSBwW2xlbl07Ci0KLSAgICAgIHBbbGVuXSA9IDA7CS8qIG51bGwtdGVybWluYXRlIHRoZSB0b2tlbiAqLwotICAgICAgaWYgKHNpemVvZiAocHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQuZHZhbCkgPD0gc2l6ZW9mIChmbG9hdCkpCi0JbnVtID0gc3NjYW5mIChwLCAiJWclYyIsIChmbG9hdCAqKSAmcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQuZHZhbCwgJmMpOwotICAgICAgZWxzZSBpZiAoc2l6ZW9mIChwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC5kdmFsKSA8PSBzaXplb2YgKGRvdWJsZSkpCi0JbnVtID0gc3NjYW5mIChwLCAiJWxnJWMiLCAoZG91YmxlICopICZwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC5kdmFsLCAmYyk7Ci0gICAgICBlbHNlCi0JewotI2lmZGVmIFNDQU5GX0hBU19MT05HX0RPVUJMRQotCSAgbnVtID0gc3NjYW5mIChwLCAiJUxnJWMiLCAmcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQuZHZhbCwgJmMpOwotI2Vsc2UKLQkgIC8qIFNjYW4gaXQgaW50byBhIGRvdWJsZSwgdGhlbiBhc3NpZ24gaXQgdG8gdGhlIGxvbmcgZG91YmxlLgotCSAgICAgVGhpcyBhdCBsZWFzdCB3aW5zIHdpdGggdmFsdWVzIHJlcHJlc2VudGFibGUgaW4gdGhlIHJhbmdlCi0JICAgICBvZiBkb3VibGVzLiAqLwotCSAgZG91YmxlIHRlbXA7Ci0JICBudW0gPSBzc2NhbmYgKHAsICIlbGclYyIsICZ0ZW1wLCAmYyk7Ci0JICBwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC5kdmFsID0gdGVtcDsKLSNlbmRpZgotCX0KLSAgICAgIHBbbGVuXSA9IHNhdmVkX2NoYXI7CS8qIHJlc3RvcmUgdGhlIGlucHV0IHN0cmVhbSAqLwotICAgICAgaWYgKG51bSAhPSAxKSAJCS8qIGNoZWNrIHNjYW5mIGZvdW5kIE9OTFkgYSBmbG9hdCAuLi4gKi8KLQlyZXR1cm4gRVJST1I7Ci0gICAgICAvKiBTZWUgaWYgaXQgaGFzIGBmJyBvciBgZCcgc3VmZml4IChmbG9hdCBvciBkb3VibGUpLiAgKi8KLQotICAgICAgYyA9IHRvbG93ZXIgKHBbbGVuIC0gMV0pOwotCi0gICAgICBpZiAoYyA9PSAnZicgfHwgYyA9PSAnRicpCi0JcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQudHlwZSA9IGJ1aWx0aW5fdHlwZV9mbG9hdDsKLSAgICAgIGVsc2UgaWYgKGlzZGlnaXQgKGMpIHx8IGMgPT0gJy4nIHx8IGMgPT0gJ2QnIHx8IGMgPT0gJ0QnKQotCXB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LnR5cGUgPSBidWlsdGluX3R5cGVfZG91YmxlOwotICAgICAgZWxzZQotCXJldHVybiBFUlJPUjsKLQotICAgICAgcmV0dXJuIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw7Ci0gICAgfQotCi0gIC8qIEhhbmRsZSBiYXNlLXN3aXRjaGluZyBwcmVmaXhlcyAweCwgMHQsIDBkLCAwICovCi0gIGlmIChwWzBdID09ICcwJykKLSAgICBzd2l0Y2ggKHBbMV0pCi0gICAgICB7Ci0gICAgICBjYXNlICd4JzoKLSAgICAgIGNhc2UgJ1gnOgotCWlmIChsZW4gPj0gMykKLQkgIHsKLQkgICAgcCArPSAyOwotCSAgICBiYXNlID0gMTY7Ci0JICAgIGxlbiAtPSAyOwotCSAgfQotCWJyZWFrOwotCi0gICAgICBjYXNlICd0JzoKLSAgICAgIGNhc2UgJ1QnOgotICAgICAgY2FzZSAnZCc6Ci0gICAgICBjYXNlICdEJzoKLQlpZiAobGVuID49IDMpCi0JICB7Ci0JICAgIHAgKz0gMjsKLQkgICAgYmFzZSA9IDEwOwotCSAgICBsZW4gLT0gMjsKLQkgIH0KLQlicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQliYXNlID0gODsKLQlicmVhazsKLSAgICAgIH0KLQotICBjID0gcFtsZW4tMV07Ci0gIGxpbWl0ID0gKFVMT05HRVNUKTB4ZmZmZmZmZmY7Ci0gIGlmIChjID09ICdsJyB8fCBjID09ICdMJykKLSAgICB7Ci0gICAgICB0eXBlID0gamF2YV9sb25nX3R5cGU7Ci0gICAgICBsZW4tLTsKLSAgICAgIC8qIEEgcGFyYW5vaWQgY2FsY3VsYXRpb24gb2YgKDE8PDY0KS0xLiAqLwotICAgICAgbGltaXQgPSAoKGxpbWl0IDw8IDE2KSA8PCAxNikgfCBsaW1pdDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0eXBlID0gamF2YV9pbnRfdHlwZTsKLSAgICB9Ci0gIGxpbWl0X2Rpdl9iYXNlID0gbGltaXQgLyAoVUxPTkdFU1QpIGJhc2U7Ci0KLSAgd2hpbGUgKC0tbGVuID49IDApCi0gICAgewotICAgICAgYyA9ICpwKys7Ci0gICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0JYyAtPSAnMCc7Ci0gICAgICBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykKLQljIC09ICdBJyAtIDEwOwotICAgICAgZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpCi0JYyAtPSAnYScgLSAxMDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gRVJST1I7CS8qIENoYXIgbm90IGEgZGlnaXQgKi8KLSAgICAgIGlmIChjID49IGJhc2UpCi0JcmV0dXJuIEVSUk9SOwotICAgICAgaWYgKG4gPiBsaW1pdF9kaXZfYmFzZQotCSAgfHwgKG4gKj0gYmFzZSkgPiBsaW1pdCAtIGMpCi0JZXJyb3IgKCJOdW1lcmljIGNvbnN0YW50IHRvbyBsYXJnZS4iKTsKLSAgICAgIG4gKz0gYzsKLQl9Ci0KLSAgIHB1dGl0aGVyZS0+dHlwZWRfdmFsX2ludC52YWwgPSBuOwotICAgcHV0aXRoZXJlLT50eXBlZF92YWxfaW50LnR5cGUgPSB0eXBlOwotICAgcmV0dXJuIElOVEVHRVJfTElURVJBTDsKLX0KLQotc3RydWN0IHRva2VuCi17Ci0gIGNoYXIgKm9wZXJhdG9yOwotICBpbnQgdG9rZW47Ci0gIGVudW0gZXhwX29wY29kZSBvcGNvZGU7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRva2VuIHRva2VudGFiM1tdID0KLSAgewotICAgIHsiPj49IiwgQVNTSUdOX01PRElGWSwgQklOT1BfUlNIfSwKLSAgICB7Ijw8PSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX0xTSH0KLSAgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2tlbiB0b2tlbnRhYjJbXSA9Ci0gIHsKLSAgICB7Iis9IiwgQVNTSUdOX01PRElGWSwgQklOT1BfQUREfSwKLSAgICB7Ii09IiwgQVNTSUdOX01PRElGWSwgQklOT1BfU1VCfSwKLSAgICB7Iio9IiwgQVNTSUdOX01PRElGWSwgQklOT1BfTVVMfSwKLSAgICB7Ii89IiwgQVNTSUdOX01PRElGWSwgQklOT1BfRElWfSwKLSAgICB7IiU9IiwgQVNTSUdOX01PRElGWSwgQklOT1BfUkVNfSwKLSAgICB7Inw9IiwgQVNTSUdOX01PRElGWSwgQklOT1BfQklUV0lTRV9JT1J9LAotICAgIHsiJj0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9CSVRXSVNFX0FORH0sCi0gICAgeyJePSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX0JJVFdJU0VfWE9SfSwKLSAgICB7IisrIiwgSU5DUkVNRU5ULCBCSU5PUF9FTkR9LAotICAgIHsiLS0iLCBERUNSRU1FTlQsIEJJTk9QX0VORH0sCi0gICAgeyImJiIsIEFOREFORCwgQklOT1BfRU5EfSwKLSAgICB7Inx8IiwgT1JPUiwgQklOT1BfRU5EfSwKLSAgICB7Ijw8IiwgTFNILCBCSU5PUF9FTkR9LAotICAgIHsiPj4iLCBSU0gsIEJJTk9QX0VORH0sCi0gICAgeyI9PSIsIEVRVUFMLCBCSU5PUF9FTkR9LAotICAgIHsiIT0iLCBOT1RFUVVBTCwgQklOT1BfRU5EfSwKLSAgICB7Ijw9IiwgTEVRLCBCSU5PUF9FTkR9LAotICAgIHsiPj0iLCBHRVEsIEJJTk9QX0VORH0KLSAgfTsKLQotLyogUmVhZCBvbmUgdG9rZW4sIGdldHRpbmcgY2hhcmFjdGVycyB0aHJvdWdoIGxleHB0ci4gICovCi0KLXN0YXRpYyBpbnQKLXl5bGV4ICgpCi17Ci0gIGludCBjOwotICBpbnQgbmFtZWxlbjsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGNoYXIgKnRva3N0YXJ0OwotICBjaGFyICp0b2twdHI7Ci0gIGludCB0ZW1wYnVmaW5kZXg7Ci0gIHN0YXRpYyBjaGFyICp0ZW1wYnVmOwotICBzdGF0aWMgaW50IHRlbXBidWZzaXplOwotICAKLSByZXRyeToKLQotICB0b2tzdGFydCA9IGxleHB0cjsKLSAgLyogU2VlIGlmIGl0IGlzIGEgc3BlY2lhbCB0b2tlbiBvZiBsZW5ndGggMy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgdG9rZW50YWIzIC8gc2l6ZW9mIHRva2VudGFiM1swXTsgaSsrKQotICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCB0b2tlbnRhYjNbaV0ub3BlcmF0b3IsIDMpKQotICAgICAgewotCWxleHB0ciArPSAzOwotCXl5bHZhbC5vcGNvZGUgPSB0b2tlbnRhYjNbaV0ub3Bjb2RlOwotCXJldHVybiB0b2tlbnRhYjNbaV0udG9rZW47Ci0gICAgICB9Ci0KLSAgLyogU2VlIGlmIGl0IGlzIGEgc3BlY2lhbCB0b2tlbiBvZiBsZW5ndGggMi4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgdG9rZW50YWIyIC8gc2l6ZW9mIHRva2VudGFiMlswXTsgaSsrKQotICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCB0b2tlbnRhYjJbaV0ub3BlcmF0b3IsIDIpKQotICAgICAgewotCWxleHB0ciArPSAyOwotCXl5bHZhbC5vcGNvZGUgPSB0b2tlbnRhYjJbaV0ub3Bjb2RlOwotCXJldHVybiB0b2tlbnRhYjJbaV0udG9rZW47Ci0gICAgICB9Ci0KLSAgc3dpdGNoIChjID0gKnRva3N0YXJ0KQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgJyAnOgotICAgIGNhc2UgJ1x0JzoKLSAgICBjYXNlICdcbic6Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIGdvdG8gcmV0cnk7Ci0KLSAgICBjYXNlICdcJyc6Ci0gICAgICAvKiBXZSBlaXRoZXIgaGF2ZSBhIGNoYXJhY3RlciBjb25zdGFudCAoJzAnIG9yICdcMTc3JyBmb3IgZXhhbXBsZSkKLQkgb3Igd2UgaGF2ZSBhIHF1b3RlZCBzeW1ib2wgcmVmZXJlbmNlICgnZm9vKGludCxpbnQpJyBpbiBDKysKLQkgZm9yIGV4YW1wbGUpLiAqLwotICAgICAgbGV4cHRyKys7Ci0gICAgICBjID0gKmxleHB0cisrOwotICAgICAgaWYgKGMgPT0gJ1xcJykKLQljID0gcGFyc2VfZXNjYXBlICgmbGV4cHRyKTsKLSAgICAgIGVsc2UgaWYgKGMgPT0gJ1wnJykKLQllcnJvciAoIkVtcHR5IGNoYXJhY3RlciBjb25zdGFudC4iKTsKLQotICAgICAgeXlsdmFsLnR5cGVkX3ZhbF9pbnQudmFsID0gYzsKLSAgICAgIHl5bHZhbC50eXBlZF92YWxfaW50LnR5cGUgPSBidWlsdGluX3R5cGVfY2hhcjsKLQotICAgICAgYyA9ICpsZXhwdHIrKzsKLSAgICAgIGlmIChjICE9ICdcJycpCi0JewotCSAgbmFtZWxlbiA9IHNraXBfcXVvdGVkICh0b2tzdGFydCkgLSB0b2tzdGFydDsKLQkgIGlmIChuYW1lbGVuID4gMikKLQkgICAgewotCSAgICAgIGxleHB0ciA9IHRva3N0YXJ0ICsgbmFtZWxlbjsKLQkgICAgICBpZiAobGV4cHRyWy0xXSAhPSAnXCcnKQotCQllcnJvciAoIlVubWF0Y2hlZCBzaW5nbGUgcXVvdGUuIik7Ci0JICAgICAgbmFtZWxlbiAtPSAyOwotCSAgICAgIHRva3N0YXJ0Kys7Ci0JICAgICAgZ290byB0cnluYW1lOwotCSAgICB9Ci0JICBlcnJvciAoIkludmFsaWQgY2hhcmFjdGVyIGNvbnN0YW50LiIpOwotCX0KLSAgICAgIHJldHVybiBJTlRFR0VSX0xJVEVSQUw7Ci0KLSAgICBjYXNlICcoJzoKLSAgICAgIHBhcmVuX2RlcHRoKys7Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIHJldHVybiBjOwotCi0gICAgY2FzZSAnKSc6Ci0gICAgICBpZiAocGFyZW5fZGVwdGggPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIHBhcmVuX2RlcHRoLS07Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIHJldHVybiBjOwotCi0gICAgY2FzZSAnLCc6Ci0gICAgICBpZiAoY29tbWFfdGVybWluYXRlcyAmJiBwYXJlbl9kZXB0aCA9PSAwKQotCXJldHVybiAwOwotICAgICAgbGV4cHRyKys7Ci0gICAgICByZXR1cm4gYzsKLQotICAgIGNhc2UgJy4nOgotICAgICAgLyogTWlnaHQgYmUgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuICAqLwotICAgICAgaWYgKGxleHB0clsxXSA8ICcwJyB8fCBsZXhwdHJbMV0gPiAnOScpCi0JZ290byBzeW1ib2w7CQkvKiBOb3BlLCBtdXN0IGJlIGEgc3ltYm9sLiAqLwotICAgICAgLyogRkFMTCBUSFJVIGludG8gbnVtYmVyIGNhc2UuICAqLwotCi0gICAgY2FzZSAnMCc6Ci0gICAgY2FzZSAnMSc6Ci0gICAgY2FzZSAnMic6Ci0gICAgY2FzZSAnMyc6Ci0gICAgY2FzZSAnNCc6Ci0gICAgY2FzZSAnNSc6Ci0gICAgY2FzZSAnNic6Ci0gICAgY2FzZSAnNyc6Ci0gICAgY2FzZSAnOCc6Ci0gICAgY2FzZSAnOSc6Ci0gICAgICB7Ci0JLyogSXQncyBhIG51bWJlci4gICovCi0JaW50IGdvdF9kb3QgPSAwLCBnb3RfZSA9IDAsIHRva3R5cGU7Ci0JcmVnaXN0ZXIgY2hhciAqcCA9IHRva3N0YXJ0OwotCWludCBoZXggPSBpbnB1dF9yYWRpeCA+IDEwOwotCi0JaWYgKGMgPT0gJzAnICYmIChwWzFdID09ICd4JyB8fCBwWzFdID09ICdYJykpCi0JICB7Ci0JICAgIHAgKz0gMjsKLQkgICAgaGV4ID0gMTsKLQkgIH0KLQllbHNlIGlmIChjID09ICcwJyAmJiAocFsxXT09J3QnIHx8IHBbMV09PSdUJyB8fCBwWzFdPT0nZCcgfHwgcFsxXT09J0QnKSkKLQkgIHsKLQkgICAgcCArPSAyOwotCSAgICBoZXggPSAwOwotCSAgfQotCi0JZm9yICg7OyArK3ApCi0JICB7Ci0JICAgIC8qIFRoaXMgdGVzdCBpbmNsdWRlcyAhaGV4IGJlY2F1c2UgJ2UnIGlzIGEgdmFsaWQgaGV4IGRpZ2l0Ci0JICAgICAgIGFuZCB0aHVzIGRvZXMgbm90IGluZGljYXRlIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHdoZW4KLQkgICAgICAgdGhlIHJhZGl4IGlzIGhleC4gICovCi0JICAgIGlmICghaGV4ICYmICFnb3RfZSAmJiAoKnAgPT0gJ2UnIHx8ICpwID09ICdFJykpCi0JICAgICAgZ290X2RvdCA9IGdvdF9lID0gMTsKLQkgICAgLyogVGhpcyB0ZXN0IGRvZXMgbm90IGluY2x1ZGUgIWhleCwgYmVjYXVzZSBhICcuJyBhbHdheXMgaW5kaWNhdGVzCi0JICAgICAgIGEgZGVjaW1hbCBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVnYXJkbGVzcyBvZiB0aGUgcmFkaXguICAqLwotCSAgICBlbHNlIGlmICghZ290X2RvdCAmJiAqcCA9PSAnLicpCi0JICAgICAgZ290X2RvdCA9IDE7Ci0JICAgIGVsc2UgaWYgKGdvdF9lICYmIChwWy0xXSA9PSAnZScgfHwgcFstMV0gPT0gJ0UnKQotCQkgICAgICYmICgqcCA9PSAnLScgfHwgKnAgPT0gJysnKSkKLQkgICAgICAvKiBUaGlzIGlzIHRoZSBzaWduIG9mIHRoZSBleHBvbmVudCwgbm90IHRoZSBlbmQgb2YgdGhlCi0JCSBudW1iZXIuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICAvKiBXZSB3aWxsIHRha2UgYW55IGxldHRlcnMgb3IgZGlnaXRzLiAgcGFyc2VfbnVtYmVyIHdpbGwKLQkgICAgICAgY29tcGxhaW4gaWYgcGFzdCB0aGUgcmFkaXgsIG9yIGlmIEwgb3IgVSBhcmUgbm90IGZpbmFsLiAgKi8KLQkgICAgZWxzZSBpZiAoKCpwIDwgJzAnIHx8ICpwID4gJzknKQotCQkgICAgICYmICgoKnAgPCAnYScgfHwgKnAgPiAneicpCi0JCQkJICAmJiAoKnAgPCAnQScgfHwgKnAgPiAnWicpKSkKLQkgICAgICBicmVhazsKLQkgIH0KLQl0b2t0eXBlID0gcGFyc2VfbnVtYmVyICh0b2tzdGFydCwgcCAtIHRva3N0YXJ0LCBnb3RfZG90fGdvdF9lLCAmeXlsdmFsKTsKLSAgICAgICAgaWYgKHRva3R5cGUgPT0gRVJST1IpCi0JICB7Ci0JICAgIGNoYXIgKmVycl9jb3B5ID0gKGNoYXIgKikgYWxsb2NhIChwIC0gdG9rc3RhcnQgKyAxKTsKLQotCSAgICBtZW1jcHkgKGVycl9jb3B5LCB0b2tzdGFydCwgcCAtIHRva3N0YXJ0KTsKLQkgICAgZXJyX2NvcHlbcCAtIHRva3N0YXJ0XSA9IDA7Ci0JICAgIGVycm9yICgiSW52YWxpZCBudW1iZXIgXCIlc1wiLiIsIGVycl9jb3B5KTsKLQkgIH0KLQlsZXhwdHIgPSBwOwotCXJldHVybiB0b2t0eXBlOwotICAgICAgfQotCi0gICAgY2FzZSAnKyc6Ci0gICAgY2FzZSAnLSc6Ci0gICAgY2FzZSAnKic6Ci0gICAgY2FzZSAnLyc6Ci0gICAgY2FzZSAnJSc6Ci0gICAgY2FzZSAnfCc6Ci0gICAgY2FzZSAnJic6Ci0gICAgY2FzZSAnXic6Ci0gICAgY2FzZSAnfic6Ci0gICAgY2FzZSAnISc6Ci0gICAgY2FzZSAnPCc6Ci0gICAgY2FzZSAnPic6Ci0gICAgY2FzZSAnWyc6Ci0gICAgY2FzZSAnXSc6Ci0gICAgY2FzZSAnPyc6Ci0gICAgY2FzZSAnOic6Ci0gICAgY2FzZSAnPSc6Ci0gICAgY2FzZSAneyc6Ci0gICAgY2FzZSAnfSc6Ci0gICAgc3ltYm9sOgotICAgICAgbGV4cHRyKys7Ci0gICAgICByZXR1cm4gYzsKLQotICAgIGNhc2UgJyInOgotCi0gICAgICAvKiBCdWlsZCB0aGUgZ2RiIGludGVybmFsIGZvcm0gb2YgdGhlIGlucHV0IHN0cmluZyBpbiB0ZW1wYnVmLAotCSB0cmFuc2xhdGluZyBhbnkgc3RhbmRhcmQgQyBlc2NhcGUgZm9ybXMgc2Vlbi4gIE5vdGUgdGhhdCB0aGUKLQkgYnVmZmVyIGlzIG51bGwgYnl0ZSB0ZXJtaW5hdGVkICpvbmx5KiBmb3IgdGhlIGNvbnZlbmllbmNlIG9mCi0JIGRlYnVnZ2luZyBnZGIgaXRzZWxmIGFuZCBwcmludGluZyB0aGUgYnVmZmVyIGNvbnRlbnRzIHdoZW4KLQkgdGhlIGJ1ZmZlciBjb250YWlucyBubyBlbWJlZGRlZCBudWxscy4gIEdkYiBkb2VzIG5vdCBkZXBlbmQKLQkgdXBvbiB0aGUgYnVmZmVyIGJlaW5nIG51bGwgYnl0ZSB0ZXJtaW5hdGVkLCBpdCB1c2VzIHRoZSBsZW5ndGgKLQkgc3RyaW5nIGluc3RlYWQuICBUaGlzIGFsbG93cyBnZGIgdG8gaGFuZGxlIEMgc3RyaW5ncyAoYXMgd2VsbAotCSBhcyBzdHJpbmdzIGluIG90aGVyIGxhbmd1YWdlcykgd2l0aCBlbWJlZGRlZCBudWxsIGJ5dGVzICovCi0KLSAgICAgIHRva3B0ciA9ICsrdG9rc3RhcnQ7Ci0gICAgICB0ZW1wYnVmaW5kZXggPSAwOwotCi0gICAgICBkbyB7Ci0JLyogR3JvdyB0aGUgc3RhdGljIHRlbXAgYnVmZmVyIGlmIG5lY2Vzc2FyeSwgaW5jbHVkaW5nIGFsbG9jYXRpbmcKLQkgICB0aGUgZmlyc3Qgb25lIG9uIGRlbWFuZC4gKi8KLQlpZiAodGVtcGJ1ZmluZGV4ICsgMSA+PSB0ZW1wYnVmc2l6ZSkKLQkgIHsKLQkgICAgdGVtcGJ1ZiA9IChjaGFyICopIHhyZWFsbG9jICh0ZW1wYnVmLCB0ZW1wYnVmc2l6ZSArPSA2NCk7Ci0JICB9Ci0Jc3dpdGNoICgqdG9rcHRyKQotCSAgewotCSAgY2FzZSAnXDAnOgotCSAgY2FzZSAnIic6Ci0JICAgIC8qIERvIG5vdGhpbmcsIGxvb3Agd2lsbCB0ZXJtaW5hdGUuICovCi0JICAgIGJyZWFrOwotCSAgY2FzZSAnXFwnOgotCSAgICB0b2twdHIrKzsKLQkgICAgYyA9IHBhcnNlX2VzY2FwZSAoJnRva3B0cik7Ci0JICAgIGlmIChjID09IC0xKQotCSAgICAgIHsKLQkJY29udGludWU7Ci0JICAgICAgfQotCSAgICB0ZW1wYnVmW3RlbXBidWZpbmRleCsrXSA9IGM7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgdGVtcGJ1Zlt0ZW1wYnVmaW5kZXgrK10gPSAqdG9rcHRyKys7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgICAgfSB3aGlsZSAoKCp0b2twdHIgIT0gJyInKSAmJiAoKnRva3B0ciAhPSAnXDAnKSk7Ci0gICAgICBpZiAoKnRva3B0cisrICE9ICciJykKLQl7Ci0JICBlcnJvciAoIlVudGVybWluYXRlZCBzdHJpbmcgaW4gZXhwcmVzc2lvbi4iKTsKLQl9Ci0gICAgICB0ZW1wYnVmW3RlbXBidWZpbmRleF0gPSAnXDAnOwkvKiBTZWUgbm90ZSBhYm92ZSAqLwotICAgICAgeXlsdmFsLnN2YWwucHRyID0gdGVtcGJ1ZjsKLSAgICAgIHl5bHZhbC5zdmFsLmxlbmd0aCA9IHRlbXBidWZpbmRleDsKLSAgICAgIGxleHB0ciA9IHRva3B0cjsKLSAgICAgIHJldHVybiAoU1RSSU5HX0xJVEVSQUwpOwotICAgIH0KLQotICBpZiAoIShjID09ICdfJyB8fCBjID09ICckJwotCXx8IChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSkpCi0gICAgLyogV2UgbXVzdCBoYXZlIGNvbWUgYWNyb3NzIGEgYmFkIGNoYXJhY3RlciAoZS5nLiAnOycpLiAgKi8KLSAgICBlcnJvciAoIkludmFsaWQgY2hhcmFjdGVyICclYycgaW4gZXhwcmVzc2lvbi4iLCBjKTsKLQotICAvKiBJdCdzIGEgbmFtZS4gIFNlZSBob3cgbG9uZyBpdCBpcy4gICovCi0gIG5hbWVsZW4gPSAwOwotICBmb3IgKGMgPSB0b2tzdGFydFtuYW1lbGVuXTsKLSAgICAgICAoYyA9PSAnXycKLQl8fCBjID09ICckJwotCXx8IChjID49ICcwJyAmJiBjIDw9ICc5JykKLQl8fCAoYyA+PSAnYScgJiYgYyA8PSAneicpCi0JfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQotCXx8IGMgPT0gJzwnKTsKLSAgICAgICApCi0gICAgewotICAgICAgaWYgKGMgPT0gJzwnKQotCXsKLQkgIGludCBpID0gbmFtZWxlbjsKLQkgIHdoaWxlICh0b2tzdGFydFsrK2ldICYmIHRva3N0YXJ0W2ldICE9ICc+Jyk7Ci0JICBpZiAodG9rc3RhcnRbaV0gPT0gJz4nKQotCSAgICBuYW1lbGVuID0gaTsKLQl9Ci0gICAgICAgYyA9IHRva3N0YXJ0WysrbmFtZWxlbl07Ci0gICAgIH0KLQotICAvKiBUaGUgdG9rZW4gImlmIiB0ZXJtaW5hdGVzIHRoZSBleHByZXNzaW9uIGFuZCBpcyBOT1QgCi0gICAgIHJlbW92ZWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAgKi8KLSAgaWYgKG5hbWVsZW4gPT0gMiAmJiB0b2tzdGFydFswXSA9PSAnaScgJiYgdG9rc3RhcnRbMV0gPT0gJ2YnKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBsZXhwdHIgKz0gbmFtZWxlbjsKLQotICB0cnluYW1lOgotCi0gIC8qIENhdGNoIHNwZWNpZmljIGtleXdvcmRzLiAgU2hvdWxkIGJlIGRvbmUgd2l0aCBhIGRhdGEgc3RydWN0dXJlLiAgKi8KLSAgc3dpdGNoIChuYW1lbGVuKQotICAgIHsKLSAgICBjYXNlIDc6Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImJvb2xlYW4iLCA3KSkKLQlyZXR1cm4gQk9PTEVBTjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiZG91YmxlIiwgNikpICAgICAgCi0JcmV0dXJuIERPVUJMRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNToKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAic2hvcnQiLCA1KSkKLQlyZXR1cm4gU0hPUlQ7Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImZhbHNlIiwgNSkpCi0JewotCSAgeXlsdmFsLmx2YWwgPSAwOwotCSAgcmV0dXJuIEJPT0xFQU5fTElURVJBTDsKLQl9Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgInN1cGVyIiwgNSkpCi0JcmV0dXJuIFNVUEVSOwotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJmbG9hdCIsIDUpKQotCXJldHVybiBGTE9BVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAibG9uZyIsIDQpKQotCXJldHVybiBMT05HOwotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJieXRlIiwgNCkpCi0JcmV0dXJuIEJZVEU7Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImNoYXIiLCA0KSkKLQlyZXR1cm4gQ0hBUjsKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAidHJ1ZSIsIDQpKQotCXsKLQkgIHl5bHZhbC5sdmFsID0gMTsKLQkgIHJldHVybiBCT09MRUFOX0xJVEVSQUw7Ci0JfQotICAgICAgaWYgKGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2xhbmd1YWdlID09IGxhbmd1YWdlX2NwbHVzCi0JICAmJiBTVFJFUU4gKHRva3N0YXJ0LCAidGhpcyIsIDQpKQotCXsKLQkgIHN0YXRpYyBjb25zdCBjaGFyIHRoaXNfbmFtZVtdID0KLQkJCQkgeyBDUExVU19NQVJLRVIsICd0JywgJ2gnLCAnaScsICdzJywgJ1wwJyB9OwotCi0JICBpZiAobG9va3VwX3N5bWJvbCAodGhpc19uYW1lLCBleHByZXNzaW9uX2NvbnRleHRfYmxvY2ssCi0JCQkgICAgIFZBUl9OQU1FU1BBQ0UsIChpbnQgKikgTlVMTCwKLQkJCSAgICAgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpKQotCSAgICByZXR1cm4gVEhJUzsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImludCIsIDMpKQotCXJldHVybiBJTlQ7Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgIm5ldyIsIDMpKQotCXJldHVybiBORVc7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHl5bHZhbC5zdmFsLnB0ciA9IHRva3N0YXJ0OwotICB5eWx2YWwuc3ZhbC5sZW5ndGggPSBuYW1lbGVuOwotCi0gIGlmICgqdG9rc3RhcnQgPT0gJyQnKQotICAgIHsKLSAgICAgIHdyaXRlX2RvbGxhcl92YXJpYWJsZSAoeXlsdmFsLnN2YWwpOwotICAgICAgcmV0dXJuIFZBUklBQkxFOwotICAgIH0KLQotICAvKiBJbnB1dCBuYW1lcyB0aGF0IGFyZW4ndCBzeW1ib2xzIGJ1dCBBUkUgdmFsaWQgaGV4IG51bWJlcnMsCi0gICAgIHdoZW4gdGhlIGlucHV0IHJhZGl4IHBlcm1pdHMgdGhlbSwgY2FuIGJlIG5hbWVzIG9yIG51bWJlcnMKLSAgICAgZGVwZW5kaW5nIG9uIHRoZSBwYXJzZS4gIE5vdGUgd2Ugc3VwcG9ydCByYWRpeGVzID4gMTYgaGVyZS4gICovCi0gIGlmICgoKHRva3N0YXJ0WzBdID49ICdhJyAmJiB0b2tzdGFydFswXSA8ICdhJyArIGlucHV0X3JhZGl4IC0gMTApIHx8Ci0gICAgICAgKHRva3N0YXJ0WzBdID49ICdBJyAmJiB0b2tzdGFydFswXSA8ICdBJyArIGlucHV0X3JhZGl4IC0gMTApKSkKLSAgICB7Ci0gICAgICBZWVNUWVBFIG5ld2x2YWw7CS8qIEl0cyB2YWx1ZSBpcyBpZ25vcmVkLiAgKi8KLSAgICAgIGludCBoZXh0eXBlID0gcGFyc2VfbnVtYmVyICh0b2tzdGFydCwgbmFtZWxlbiwgMCwgJm5ld2x2YWwpOwotICAgICAgaWYgKGhleHR5cGUgPT0gSU5URUdFUl9MSVRFUkFMKQotCXJldHVybiBOQU1FX09SX0lOVDsKLSAgICB9Ci0gIHJldHVybiBJREVOVElGSUVSOwotfQotCi12b2lkCi15eWVycm9yIChtc2cpCi0gICAgIGNoYXIgKm1zZzsKLXsKLSAgZXJyb3IgKCJBICVzIGluIGV4cHJlc3Npb24sIG5lYXIgYCVzJy4iLCAobXNnID8gbXNnIDogImVycm9yIiksIGxleHB0cik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdHlwZSAqCi1qYXZhX3R5cGVfZnJvbV9uYW1lIChuYW1lKQotICAgICBzdHJ1Y3Qgc3Rva2VuIG5hbWU7Ci0gCi17Ci0gIGNoYXIgKnRtcCA9IGNvcHlfbmFtZSAobmFtZSk7Ci0gIHN0cnVjdCB0eXBlICp0eXAgPSBqYXZhX2xvb2t1cF9jbGFzcyAodG1wKTsKLSAgaWYgKHR5cCA9PSBOVUxMIHx8IFRZUEVfQ09ERSAodHlwKSAhPSBUWVBFX0NPREVfU1RSVUNUKQotICAgIGVycm9yICgiTm8gY2xhc3MgbmFtZWQgJXMuIiwgdG1wKTsKLSAgcmV0dXJuIHR5cDsKLX0KLQotLyogSWYgTkFNRSBpcyBhIHZhbGlkIHZhcmlhYmxlIG5hbWUgaW4gdGhpcyBzY29wZSwgcHVzaCBpdCBhbmQgcmV0dXJuIDEuCi0gICBPdGhlcndpc2UsIHJldHVybiAwLiAqLwotCi1zdGF0aWMgaW50Ci1wdXNoX3ZhcmlhYmxlIChuYW1lKQotICAgICBzdHJ1Y3Qgc3Rva2VuIG5hbWU7Ci0gCi17Ci0gIGNoYXIgKnRtcCA9IGNvcHlfbmFtZSAobmFtZSk7Ci0gIGludCBpc19hX2ZpZWxkX29mX3RoaXMgPSAwOwotICBzdHJ1Y3Qgc3ltYm9sICpzeW07Ci0gIHN5bSA9IGxvb2t1cF9zeW1ib2wgKHRtcCwgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrLCBWQVJfTkFNRVNQQUNFLAotCQkgICAgICAgJmlzX2FfZmllbGRfb2ZfdGhpcywgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpOwotICBpZiAoc3ltICYmIFNZTUJPTF9DTEFTUyAoc3ltKSAhPSBMT0NfVFlQRURFRikKLSAgICB7Ci0gICAgICBpZiAoc3ltYm9sX3JlYWRfbmVlZHNfZnJhbWUgKHN5bSkpCi0JewotCSAgaWYgKGlubmVybW9zdF9ibG9jayA9PSAwIHx8Ci0JICAgICAgY29udGFpbmVkX2luIChibG9ja19mb3VuZCwgaW5uZXJtb3N0X2Jsb2NrKSkKLQkgICAgaW5uZXJtb3N0X2Jsb2NrID0gYmxvY2tfZm91bmQ7Ci0JfQotCi0gICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsKLSAgICAgIC8qIFdlIHdhbnQgdG8gdXNlIHRoZSBzZWxlY3RlZCBmcmFtZSwgbm90IGFub3RoZXIgbW9yZSBpbm5lciBmcmFtZQotCSB3aGljaCBoYXBwZW5zIHRvIGJlIGluIHRoZSBzYW1lIGJsb2NrLiAgKi8KLSAgICAgIHdyaXRlX2V4cF9lbHRfYmxvY2sgKE5VTEwpOwotICAgICAgd3JpdGVfZXhwX2VsdF9zeW0gKHN5bSk7Ci0gICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKGlzX2FfZmllbGRfb2ZfdGhpcykKLSAgICB7Ci0gICAgICAvKiBpdCBoYW5ncyBvZmYgb2YgYHRoaXMnLiAgTXVzdCBub3QgaW5hZHZlcnRlbnRseSBjb252ZXJ0IGZyb20gYQotCSBtZXRob2QgY2FsbCB0byBkYXRhIHJlZi4gICovCi0gICAgICBpZiAoaW5uZXJtb3N0X2Jsb2NrID09IDAgfHwgCi0JICBjb250YWluZWRfaW4gKGJsb2NrX2ZvdW5kLCBpbm5lcm1vc3RfYmxvY2spKQotCWlubmVybW9zdF9ibG9jayA9IGJsb2NrX2ZvdW5kOwotICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1RISVMpOwotICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1RISVMpOwotICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX1BUUik7Ci0gICAgICB3cml0ZV9leHBfc3RyaW5nIChuYW1lKTsKLSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9QVFIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogQXNzdW1pbmcgYSByZWZlcmVuY2UgZXhwcmVzc2lvbiBoYXMgYmVlbiBwdXNoZWQsIGVtaXQgdGhlCi0gICBTVFJVQ1RPUF9TVFJVQ1Qgb3BzIHRvIGFjY2VzcyB0aGUgZmllbGQgbmFtZWQgTkFNRS4gIElmIE5BTUUgaXMgYQotICAgcXVhbGlmaWVkIG5hbWUgKGhhcyAnLicpLCBnZW5lcmF0ZSBhIGZpZWxkIGFjY2VzcyBmb3IgZWFjaCBwYXJ0LiAqLwotCi1zdGF0aWMgdm9pZAotcHVzaF9maWVsZG5hbWVzIChuYW1lKQotICAgICBzdHJ1Y3Qgc3Rva2VuIG5hbWU7Ci17Ci0gIGludCBpOwotICBzdHJ1Y3Qgc3Rva2VuIHRva2VuOwotICB0b2tlbi5wdHIgPSBuYW1lLnB0cjsKLSAgZm9yIChpID0gMDsgIDsgIGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSA9PSBuYW1lLmxlbmd0aCB8fCBuYW1lLnB0cltpXSA9PSAnLicpCi0JewotCSAgLyogdG9rZW4ucHRyIGlzIHN0YXJ0IG9mIGN1cnJlbnQgZmllbGQgbmFtZS4gKi8KLQkgIHRva2VuLmxlbmd0aCA9ICZuYW1lLnB0cltpXSAtIHRva2VuLnB0cjsKLQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9TVFJVQ1QpOwotCSAgd3JpdGVfZXhwX3N0cmluZyAodG9rZW4pOwotCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX1NUUlVDVCk7Ci0JICB0b2tlbi5wdHIgKz0gdG9rZW4ubGVuZ3RoICsgMTsKLQl9Ci0gICAgICBpZiAoaSA+PSBuYW1lLmxlbmd0aCkKLQlicmVhazsKLSAgICB9Ci19Ci0KLS8qIEhlbHBlciByb3V0aW5lIGZvciBwdXNoX2V4cHJlc3Npb25fbmFtZS4KLSAgIEhhbmRsZSBhIHF1YWxpZmllZCBuYW1lLCB3aGVyZSBET1RfSU5ERVggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCAnLicgKi8KLQotc3RhdGljIHZvaWQKLXB1c2hfcXVhbGlmaWVkX2V4cHJlc3Npb25fbmFtZSAobmFtZSwgZG90X2luZGV4KQotICAgICBzdHJ1Y3Qgc3Rva2VuIG5hbWU7Ci0gICAgIGludCBkb3RfaW5kZXg7Ci17Ci0gIHN0cnVjdCBzdG9rZW4gdG9rZW47Ci0gIGNoYXIgKnRtcDsKLSAgc3RydWN0IHR5cGUgKnR5cDsKLQotICB0b2tlbi5wdHIgPSBuYW1lLnB0cjsKLSAgdG9rZW4ubGVuZ3RoID0gZG90X2luZGV4OwotCi0gIGlmIChwdXNoX3ZhcmlhYmxlICh0b2tlbikpCi0gICAgewotICAgICAgdG9rZW4ucHRyID0gbmFtZS5wdHIgKyBkb3RfaW5kZXggKyAxOwotICAgICAgdG9rZW4ubGVuZ3RoID0gbmFtZS5sZW5ndGggLSBkb3RfaW5kZXggLSAxOwotICAgICAgcHVzaF9maWVsZG5hbWVzICh0b2tlbik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHRva2VuLnB0ciA9IG5hbWUucHRyOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHRva2VuLmxlbmd0aCA9IGRvdF9pbmRleDsKLSAgICAgIHRtcCA9IGNvcHlfbmFtZSAodG9rZW4pOwotICAgICAgdHlwID0gamF2YV9sb29rdXBfY2xhc3MgKHRtcCk7Ci0gICAgICBpZiAodHlwICE9IE5VTEwpCi0JewotCSAgaWYgKGRvdF9pbmRleCA9PSBuYW1lLmxlbmd0aCkKLQkgICAgewotCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpOwotCSAgICAgIHdyaXRlX2V4cF9lbHRfdHlwZSh0eXApOwotCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgZG90X2luZGV4Kys7ICAvKiBTa2lwICcuJyAqLwotCSAgbmFtZS5wdHIgKz0gZG90X2luZGV4OwotCSAgbmFtZS5sZW5ndGggLT0gZG90X2luZGV4OwotCSAgZG90X2luZGV4ID0gMDsKLQkgIHdoaWxlIChkb3RfaW5kZXggPCBuYW1lLmxlbmd0aCAmJiBuYW1lLnB0cltkb3RfaW5kZXhdICE9ICcuJykgCi0JICAgIGRvdF9pbmRleCsrOwotCSAgdG9rZW4ucHRyID0gbmFtZS5wdHI7Ci0JICB0b2tlbi5sZW5ndGggPSBkb3RfaW5kZXg7Ci0JICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfU0NPUEUpOwotCSAgd3JpdGVfZXhwX2VsdF90eXBlICh0eXApOwotCSAgd3JpdGVfZXhwX3N0cmluZyAodG9rZW4pOwotCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1NDT1BFKTsgCi0JICBpZiAoZG90X2luZGV4IDwgbmFtZS5sZW5ndGgpCi0JICAgIHsKLQkgICAgICBkb3RfaW5kZXgrKzsKLQkgICAgICBuYW1lLnB0ciArPSBkb3RfaW5kZXg7Ci0JICAgICAgbmFtZS5sZW5ndGggLT0gZG90X2luZGV4OwotCSAgICAgIHB1c2hfZmllbGRuYW1lcyAobmFtZSk7Ci0JICAgIH0KLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmIChkb3RfaW5kZXggPj0gbmFtZS5sZW5ndGgpCi0JYnJlYWs7Ci0gICAgICBkb3RfaW5kZXgrKzsgIC8qIFNraXAgJy4nICovCi0gICAgICB3aGlsZSAoZG90X2luZGV4IDwgbmFtZS5sZW5ndGggJiYgbmFtZS5wdHJbZG90X2luZGV4XSAhPSAnLicpCi0JZG90X2luZGV4Kys7Ci0gICAgfQotICBlcnJvciAoInVua25vd24gdHlwZSBgJS4qcyciLCBuYW1lLmxlbmd0aCwgbmFtZS5wdHIpOwotfQotCi0vKiBIYW5kbGUgTmFtZSBpbiBhbiBleHByZXNzaW9uIChvciBMSFMpLgotICAgSGFuZGxlIFZBUiwgVFlQRSwgVFlQRS5GSUVMRDEuLi4uRklFTEROIGFuZCBWQVIuRklFTEQxLi4uLkZJRUxETi4gKi8KLQotc3RhdGljIHZvaWQKLXB1c2hfZXhwcmVzc2lvbl9uYW1lIChuYW1lKQotICAgICBzdHJ1Y3Qgc3Rva2VuIG5hbWU7Ci17Ci0gIGNoYXIgKnRtcDsKLSAgc3RydWN0IHR5cGUgKnR5cDsKLSAgY2hhciAqcHRyOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyAgaSA8IG5hbWUubGVuZ3RoOyAgaSsrKQotICAgIHsKLSAgICAgIGlmIChuYW1lLnB0cltpXSA9PSAnLicpCi0JewotCSAgLyogSXQncyBhIFF1YWxpZmllZCBFeHByZXNzaW9uIE5hbWUuICovCi0JICBwdXNoX3F1YWxpZmllZF9leHByZXNzaW9uX25hbWUgKG5hbWUsIGkpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogSXQncyBhIFNpbXBsZSBFeHByZXNzaW9uIE5hbWUuICovCi0gIAotICBpZiAocHVzaF92YXJpYWJsZSAobmFtZSkpCi0gICAgcmV0dXJuOwotICB0bXAgPSBjb3B5X25hbWUgKG5hbWUpOwotICB0eXAgPSBqYXZhX2xvb2t1cF9jbGFzcyAodG1wKTsKLSAgaWYgKHR5cCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpOwotICAgICAgd3JpdGVfZXhwX2VsdF90eXBlKHR5cCk7Ci0gICAgICB3cml0ZV9leHBfZWx0X29wY29kZShPUF9UWVBFKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7Ci0KLSAgICAgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKHRtcCwgTlVMTCwgTlVMTCk7Ci0gICAgICBpZiAobXN5bWJvbCAhPSBOVUxMKQotCXsKLQkgIHdyaXRlX2V4cF9tc3ltYm9sIChtc3ltYm9sLAotCQkJICAgICBsb29rdXBfZnVuY3Rpb25fdHlwZSAoYnVpbHRpbl90eXBlX2ludCksCi0JCQkgICAgIGJ1aWx0aW5fdHlwZV9pbnQpOwotCX0KLSAgICAgIGVsc2UgaWYgKCFoYXZlX2Z1bGxfc3ltYm9scyAoKSAmJiAhaGF2ZV9wYXJ0aWFsX3N5bWJvbHMgKCkpCi0JZXJyb3IgKCJObyBzeW1ib2wgdGFibGUgaXMgbG9hZGVkLiAgVXNlIHRoZSBcImZpbGVcIiBjb21tYW5kLiIpOwotICAgICAgZWxzZQotCWVycm9yICgiTm8gc3ltYm9sIFwiJXNcIiBpbiBjdXJyZW50IGNvbnRleHQuIiwgdG1wKTsKLSAgICB9Ci0KLX0KLQotCi0vKiBUaGUgZm9sbG93aW5nIHR3byByb3V0aW5lcywgY29weV9leHAgYW5kIGluc2VydF9leHAsIGFyZW4ndCBzcGVjaWZpYyB0bwotICAgSmF2YSwgc28gdGhleSBjb3VsZCBnbyBpbiBwYXJzZS5jLCBidXQgdGhlaXIgb25seSBwdXJwb3NlIGlzIHRvIHN1cHBvcnQKLSAgIHRoZSBwYXJzaW5nIGtsdWRnZXMgd2UgdXNlIGluIHRoaXMgZmlsZSwgc28gbWF5YmUgaXQncyBiZXN0IHRvIGlzb2xhdGUKLSAgIHRoZW0gaGVyZS4gICovCi0KLS8qIENvcHkgdGhlIGV4cHJlc3Npb24gd2hvc2UgbGFzdCBlbGVtZW50IGlzIGF0IGluZGV4IEVORFBPUyAtIDEgaW4gRVhQUgotICAgaW50byBhIGZyZXNobHkgeG1hbGxvYydlZCBzdHJ1Y3QgZXhwcmVzc2lvbi4gIEl0cyBsYW5ndWFnZV9kZWZuIGlzIHNldAotICAgdG8gbnVsbC4gICovCi1zdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gKgotY29weV9leHAgKGV4cHIsIGVuZHBvcykKLSAgICAgc3RydWN0IGV4cHJlc3Npb24gKmV4cHI7Ci0gICAgIGludCBlbmRwb3M7Ci17Ci0gIGludCBsZW4gPSBsZW5ndGhfb2Zfc3ViZXhwIChleHByLCBlbmRwb3MpOwotICBzdHJ1Y3QgZXhwcmVzc2lvbiAqbmV3Ci0gICAgPSAoc3RydWN0IGV4cHJlc3Npb24gKikgeG1hbGxvYyAoc2l6ZW9mICgqbmV3KSArIEVYUF9FTEVNX1RPX0JZVEVTIChsZW4pKTsKLSAgbmV3LT5uZWx0cyA9IGxlbjsKLSAgbWVtY3B5IChuZXctPmVsdHMsIGV4cHItPmVsdHMgKyBlbmRwb3MgLSBsZW4sIEVYUF9FTEVNX1RPX0JZVEVTIChsZW4pKTsKLSAgbmV3LT5sYW5ndWFnZV9kZWZuID0gMDsKLQotICByZXR1cm4gbmV3OwotfQotCi0vKiBJbnNlcnQgdGhlIGV4cHJlc3Npb24gTkVXIGludG8gdGhlIGN1cnJlbnQgZXhwcmVzc2lvbiAoZXhwb3V0KSBhdCBQT1MuICAqLwotc3RhdGljIHZvaWQKLWluc2VydF9leHAgKHBvcywgbmV3KQotICAgICBpbnQgcG9zOwotICAgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqbmV3OwotewotICBpbnQgbmV3bGVuID0gbmV3LT5uZWx0czsKLQotICAvKiBHcm93IGV4cG91dCBpZiBuZWNlc3NhcnkuICBJbiB0aGlzIGZ1bmN0aW9uJ3Mgb25seSB1c2UgYXQgcHJlc2VudCwKLSAgICAgdGhpcyBzaG91bGQgbmV2ZXIgYmUgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKGV4cG91dF9wdHIgKyBuZXdsZW4gPiBleHBvdXRfc2l6ZSkKLSAgICB7Ci0gICAgICBleHBvdXRfc2l6ZSA9IG1heCAoZXhwb3V0X3NpemUgKiAyLCBleHBvdXRfcHRyICsgbmV3bGVuICsgMTApOwotICAgICAgZXhwb3V0ID0gKHN0cnVjdCBleHByZXNzaW9uICopCi0JeHJlYWxsb2MgKChjaGFyICopIGV4cG91dCwgKHNpemVvZiAoc3RydWN0IGV4cHJlc3Npb24pCi0JCQkJICAgICsgRVhQX0VMRU1fVE9fQllURVMgKGV4cG91dF9zaXplKSkpOwotICAgIH0KLQotICB7Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSBleHBvdXRfcHRyIC0gMTsgaSA+PSBwb3M7IGktLSkKLSAgICAgIGV4cG91dC0+ZWx0c1tpICsgbmV3bGVuXSA9IGV4cG91dC0+ZWx0c1tpXTsKLSAgfQotICAKLSAgbWVtY3B5IChleHBvdXQtPmVsdHMgKyBwb3MsIG5ldy0+ZWx0cywgRVhQX0VMRU1fVE9fQllURVMgKG5ld2xlbikpOwotICBleHBvdXRfcHRyICs9IG5ld2xlbjsKLX0KZGlmZiAtLWdpdCBhL2dkYi9tMi1leHAudGFiLmMgYi9nZGIvbTItZXhwLnRhYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmZjNjgxLi4wMDAwMDAwCi0tLSBhL2dkYi9tMi1leHAudGFiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDg5ICswLDAgQEAKLQotLyogIEEgQmlzb24gcGFyc2VyLCBtYWRlIGZyb20gbTItZXhwLnkKLSBieSAgR05VIEJpc29uIHZlcnNpb24gMS4yNQotICAqLwotCi0jZGVmaW5lIFlZQklTT04gMSAgLyogSWRlbnRpZnkgQmlzb24gb3V0cHV0LiAgKi8KLQotI2RlZmluZQlJTlQJMjU4Ci0jZGVmaW5lCUhFWAkyNTkKLSNkZWZpbmUJRVJST1IJMjYwCi0jZGVmaW5lCVVJTlQJMjYxCi0jZGVmaW5lCU0yX1RSVUUJMjYyCi0jZGVmaW5lCU0yX0ZBTFNFCTI2MwotI2RlZmluZQlDSEFSCTI2NAotI2RlZmluZQlGTE9BVAkyNjUKLSNkZWZpbmUJU1RSSU5HCTI2NgotI2RlZmluZQlOQU1FCTI2NwotI2RlZmluZQlCTE9DS05BTUUJMjY4Ci0jZGVmaW5lCUlERU5UCTI2OQotI2RlZmluZQlWQVJOQU1FCTI3MAotI2RlZmluZQlUWVBFTkFNRQkyNzEKLSNkZWZpbmUJU0laRQkyNzIKLSNkZWZpbmUJQ0FQCTI3MwotI2RlZmluZQlPUkQJMjc0Ci0jZGVmaW5lCUhJR0gJMjc1Ci0jZGVmaW5lCUFCUwkyNzYKLSNkZWZpbmUJTUlOX0ZVTkMJMjc3Ci0jZGVmaW5lCU1BWF9GVU5DCTI3OAotI2RlZmluZQlGTE9BVF9GVU5DCTI3OQotI2RlZmluZQlWQUwJMjgwCi0jZGVmaW5lCUNIUgkyODEKLSNkZWZpbmUJT0RECTI4MgotI2RlZmluZQlUUlVOQwkyODMKLSNkZWZpbmUJSU5DCTI4NAotI2RlZmluZQlERUMJMjg1Ci0jZGVmaW5lCUlOQ0wJMjg2Ci0jZGVmaW5lCUVYQ0wJMjg3Ci0jZGVmaW5lCUNPTE9OQ09MT04JMjg4Ci0jZGVmaW5lCUlOVEVSTkFMX1ZBUgkyODkKLSNkZWZpbmUJQUJPVkVfQ09NTUEJMjkwCi0jZGVmaW5lCUFTU0lHTgkyOTEKLSNkZWZpbmUJTEVRCTI5MgotI2RlZmluZQlHRVEJMjkzCi0jZGVmaW5lCU5PVEVRVUFMCTI5NAotI2RlZmluZQlJTgkyOTUKLSNkZWZpbmUJT1JPUgkyOTYKLSNkZWZpbmUJTE9HSUNBTF9BTkQJMjk3Ci0jZGVmaW5lCURJVgkyOTgKLSNkZWZpbmUJTU9ECTI5OQotI2RlZmluZQlVTkFSWQkzMDAKLSNkZWZpbmUJRE9UCTMwMQotI2RlZmluZQlOT1QJMzAyCi0jZGVmaW5lCVFJRAkzMDMKLQotI2xpbmUgNDAgIm0yLWV4cC55IgotCi0KLSNpbmNsdWRlICJkZWZzLmgiCi0jaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgotI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKLSNpbmNsdWRlICJsYW5ndWFnZS5oIgotI2luY2x1ZGUgInZhbHVlLmgiCi0jaW5jbHVkZSAicGFyc2VyLWRlZnMuaCIKLSNpbmNsdWRlICJtMi1sYW5nLmgiCi0jaW5jbHVkZSAiYmZkLmgiIC8qIFJlcXVpcmVkIGJ5IG9iamZpbGVzLmguICAqLwotI2luY2x1ZGUgInN5bWZpbGUuaCIgLyogUmVxdWlyZWQgYnkgb2JqZmlsZXMuaC4gICovCi0jaW5jbHVkZSAib2JqZmlsZXMuaCIgLyogRm9yIGhhdmVfZnVsbF9zeW1ib2xzIGFuZCBoYXZlX3BhcnRpYWxfc3ltYm9scyAqLwotCi0vKiBSZW1hcCBub3JtYWwgeWFjYyBwYXJzZXIgaW50ZXJmYWNlIG5hbWVzICh5eXBhcnNlLCB5eWxleCwgeXllcnJvciwgZXRjKSwKLSAgIGFzIHdlbGwgYXMgZ3JhdHVpdGlvdXNseSBnbG9iYWwgc3ltYm9sIG5hbWVzLCBzbyB3ZSBjYW4gaGF2ZSBtdWx0aXBsZQotICAgeWFjYyBnZW5lcmF0ZWQgcGFyc2VycyBpbiBnZGIuICBOb3RlIHRoYXQgdGhlc2UgYXJlIG9ubHkgdGhlIHZhcmlhYmxlcwotICAgcHJvZHVjZWQgYnkgeWFjYy4gIElmIG90aGVyIHBhcnNlciBnZW5lcmF0b3JzIChiaXNvbiwgYnlhY2MsIGV0YykgcHJvZHVjZQotICAgYWRkaXRpb25hbCBnbG9iYWwgbmFtZXMgdGhhdCBjb25mbGljdCBhdCBsaW5rIHRpbWUsIHRoZW4gdGhvc2UgcGFyc2VyCi0gICBnZW5lcmF0b3JzIG5lZWQgdG8gYmUgZml4ZWQgaW5zdGVhZCBvZiBhZGRpbmcgdGhvc2UgbmFtZXMgdG8gdGhpcyBsaXN0LiAqLwotCi0jZGVmaW5lCXl5bWF4ZGVwdGggbTJfbWF4ZGVwdGgKLSNkZWZpbmUJeXlwYXJzZQltMl9wYXJzZQotI2RlZmluZQl5eWxleAltMl9sZXgKLSNkZWZpbmUJeXllcnJvcgltMl9lcnJvcgotI2RlZmluZQl5eWx2YWwJbTJfbHZhbAotI2RlZmluZQl5eWNoYXIJbTJfY2hhcgotI2RlZmluZQl5eWRlYnVnCW0yX2RlYnVnCi0jZGVmaW5lCXl5cGFjdAltMl9wYWN0Ci0jZGVmaW5lCXl5cjEJbTJfcjEKLSNkZWZpbmUJeXlyMgltMl9yMgotI2RlZmluZQl5eWRlZgltMl9kZWYKLSNkZWZpbmUJeXljaGsJbTJfY2hrCi0jZGVmaW5lCXl5cGdvCW0yX3BnbwotI2RlZmluZQl5eWFjdAltMl9hY3QKLSNkZWZpbmUJeXlleGNhCW0yX2V4Y2EKLSNkZWZpbmUJeXllcnJmbGFnIG0yX2VycmZsYWcKLSNkZWZpbmUJeXluZXJycwltMl9uZXJycwotI2RlZmluZQl5eXBzCW0yX3BzCi0jZGVmaW5lCXl5cHYJbTJfcHYKLSNkZWZpbmUJeXlzCW0yX3MKLSNkZWZpbmUJeXlfeXlzCW0yX3l5cwotI2RlZmluZQl5eXN0YXRlCW0yX3N0YXRlCi0jZGVmaW5lCXl5dG1wCW0yX3RtcAotI2RlZmluZQl5eXYJbTJfdgotI2RlZmluZQl5eV95eXYJbTJfeXl2Ci0jZGVmaW5lCXl5dmFsCW0yX3ZhbAotI2RlZmluZQl5eWxsb2MJbTJfbGxvYwotI2RlZmluZQl5eXJlZHMJbTJfcmVkcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KLSNkZWZpbmUJeXl0b2tzCW0yX3Rva3MJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5bGhzCW0yX3l5bGhzCi0jZGVmaW5lIHl5bGVuCW0yX3l5bGVuCi0jZGVmaW5lIHl5ZGVmcmVkIG0yX3l5ZGVmcmVkCi0jZGVmaW5lIHl5ZGdvdG8JbTJfeXlkZ290bwotI2RlZmluZSB5eXNpbmRleCBtMl95eXNpbmRleAotI2RlZmluZSB5eXJpbmRleCBtMl95eXJpbmRleAotI2RlZmluZSB5eWdpbmRleCBtMl95eWdpbmRleAotI2RlZmluZSB5eXRhYmxlCSBtMl95eXRhYmxlCi0jZGVmaW5lIHl5Y2hlY2sJIG0yX3l5Y2hlY2sKLQotI2lmbmRlZiBZWURFQlVHCi0jZGVmaW5lCVlZREVCVUcJMAkJLyogRGVmYXVsdCB0byBubyB5eWRlYnVnIHN1cHBvcnQgKi8KLSNlbmRpZgotCi1pbnQKLXl5cGFyc2UgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgaW50Ci15eWxleCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQKLXl5ZXJyb3IgUEFSQU1TICgoY2hhciAqKSk7Ci0KLSNpZiAwCi1zdGF0aWMgY2hhciAqCi1tYWtlX3F1YWxuYW1lIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKSk7Ci0jZW5kaWYKLQotc3RhdGljIGludAotcGFyc2VfbnVtYmVyIFBBUkFNUyAoKGludCkpOwotCi0vKiBUaGUgc2lnbiBvZiB0aGUgbnVtYmVyIGJlaW5nIHBhcnNlZC4gKi8KLXN0YXRpYyBpbnQgbnVtYmVyX3NpZ24gPSAxOwotCi0vKiBUaGUgYmxvY2sgdGhhdCB0aGUgbW9kdWxlIHNwZWNpZmllZCBieSB0aGUgcXVhbGlmZXIgb24gYW4gaWRlbnRpZmVyIGlzCi0gICBjb250YWluZWQgaW4sICovCi0jaWYgMAotc3RhdGljIHN0cnVjdCBibG9jayAqbW9kYmxvY2s9MDsKLSNlbmRpZgotCi0KLSNsaW5lIDEzNSAibTItZXhwLnkiCi10eXBlZGVmIHVuaW9uCi0gIHsKLSAgICBMT05HRVNUIGx2YWw7Ci0gICAgVUxPTkdFU1QgdWx2YWw7Ci0gICAgRE9VQkxFU1QgZHZhbDsKLSAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07Ci0gICAgc3RydWN0IHR5cGUgKnR2YWw7Ci0gICAgc3RydWN0IHN0b2tlbiBzdmFsOwotICAgIGludCB2b2lkdmFsOwotICAgIHN0cnVjdCBibG9jayAqYnZhbDsKLSAgICBlbnVtIGV4cF9vcGNvZGUgb3Bjb2RlOwotICAgIHN0cnVjdCBpbnRlcm5hbHZhciAqaXZhcjsKLQotICAgIHN0cnVjdCB0eXBlICoqdHZlYzsKLSAgICBpbnQgKml2ZWM7Ci0gIH0gWVlTVFlQRTsKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi0jaWZuZGVmIF9fU1REQ19fCi0jZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLSNlbmRpZgotCi0KLQotI2RlZmluZQlZWUZJTkFMCQkxODEKLSNkZWZpbmUJWVlGTEFHCQktMzI3NjgKLSNkZWZpbmUJWVlOVEJBU0UJNjgKLQotI2RlZmluZSBZWVRSQU5TTEFURSh4KSAoKHVuc2lnbmVkKSh4KSA8PSAzMDMgPyB5eXRyYW5zbGF0ZVt4XSA6IDgyKQotCi1zdGF0aWMgY29uc3QgY2hhciB5eXRyYW5zbGF0ZVtdID0geyAgICAgMCwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgNDQsICAgICAyLCAgICAgMiwgICAgNDgsICAgICAyLCAgICA2MCwKLSAgICA2NCwgICAgNTIsICAgIDUwLCAgICAzNSwgICAgNTEsICAgICAyLCAgICA1MywgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAzOCwKLSAgICA0MiwgICAgMzksICAgICAyLCAgICA0OSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICA1OSwgICAgIDIsICAgIDY3LCAgICA1NywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgIDY1LCAgICAgMiwgICAgNjYsICAgIDYyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNSwKLSAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwKLSAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwKLSAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzMsICAgIDM0LCAgICAzNiwKLSAgICAzNywgICAgNDAsICAgIDQxLCAgICA0MywgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNTQsICAgIDU1LCAgICA1NiwKLSAgICA1OCwgICAgNjEsICAgIDYzCi19OwotCi0jaWYgWVlERUJVRyAhPSAwCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlwcmhzW10gPSB7ICAgICAwLAotICAgICAwLCAgICAgMiwgICAgIDQsICAgICA2LCAgICAgOSwgICAgMTAsICAgIDE0LCAgICAxNywgICAgMjAsICAgIDIyLAotICAgIDI0LCAgICAyOSwgICAgMzQsICAgIDM5LCAgICA0NCwgICAgNDksICAgIDU0LCAgICA1OSwgICAgNjYsICAgIDcxLAotICAgIDc2LCAgICA4MSwgICAgODQsICAgIDg5LCAgICA5NiwgICAxMDEsICAgMTA4LCAgIDExMiwgICAxMTQsICAgMTE4LAotICAgMTI1LCAgIDEzMiwgICAxMzYsICAgMTQxLCAgIDE0MiwgICAxNDgsICAgMTQ5LCAgIDE1NSwgICAxNTYsICAgMTU4LAotICAgMTYyLCAgIDE2NCwgICAxNjgsICAgMTczLCAgIDE3OCwgICAxODIsICAgMTg2LCAgIDE5MCwgICAxOTQsICAgMTk4LAotICAgMjAyLCAgIDIwNiwgICAyMTAsICAgMjE0LCAgIDIxOCwgICAyMjIsICAgMjI2LCAgIDIzMCwgICAyMzQsICAgMjM4LAotICAgMjQyLCAgIDI0NiwgICAyNTAsICAgMjUyLCAgIDI1NCwgICAyNTYsICAgMjU4LCAgIDI2MCwgICAyNjIsICAgMjY0LAotICAgMjY5LCAgIDI3MSwgICAyNzMsICAgMjc1LCAgIDI3OSwgICAyODEsICAgMjgzLCAgIDI4NywgICAyODkKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXJoc1tdID0geyAgICA3MCwKLSAgICAgMCwgICAgNjksICAgICAwLCAgICA4MSwgICAgIDAsICAgIDcwLCAgICA1NywgICAgIDAsICAgICAwLCAgICA1MSwKLSAgICA3MSwgICAgNzAsICAgICAwLCAgICA1MCwgICAgNzAsICAgICAwLCAgICA3MiwgICAgNzAsICAgICAwLCAgICA2MSwKLSAgICAgMCwgICAgNjIsICAgICAwLCAgICAxOCwgICAgNjAsICAgIDcwLCAgICA2NCwgICAgIDAsICAgIDE5LCAgICA2MCwKLSAgICA3MCwgICAgNjQsICAgICAwLCAgICAyMSwgICAgNjAsICAgIDcwLCAgICA2NCwgICAgIDAsICAgIDIwLCAgICA2MCwKLSAgICA3MCwgICAgNjQsICAgICAwLCAgICAyMiwgICAgNjAsICAgIDgxLCAgICA2NCwgICAgIDAsICAgIDIzLCAgICA2MCwKLSAgICA4MSwgICAgNjQsICAgICAwLCAgICAyNCwgICAgNjAsICAgIDcwLCAgICA2NCwgICAgIDAsICAgIDI1LCAgICA2MCwKLSAgICA4MSwgICAgMzUsICAgIDcwLCAgICA2NCwgICAgIDAsICAgIDI2LCAgICA2MCwgICAgNzAsICAgIDY0LCAgICAgMCwKLSAgICAyNywgICAgNjAsICAgIDcwLCAgICA2NCwgICAgIDAsICAgIDI4LCAgICA2MCwgICAgNzAsICAgIDY0LCAgICAgMCwKLSAgICAxNywgICAgNzAsICAgICAwLCAgICAyOSwgICAgNjAsICAgIDcwLCAgICA2NCwgICAgIDAsICAgIDI5LCAgICA2MCwKLSAgICA3MCwgICAgMzUsICAgIDcwLCAgICA2NCwgICAgIDAsICAgIDMwLCAgICA2MCwgICAgNzAsICAgIDY0LCAgICAgMCwKLSAgICAzMCwgICAgNjAsICAgIDcwLCAgICAzNSwgICAgNzAsICAgIDY0LCAgICAgMCwgICAgNzAsICAgIDU4LCAgICAxMiwKLSAgICAgMCwgICAgNzMsICAgICAwLCAgICA3MCwgICAgNDUsICAgIDczLCAgICAgMCwgICAgMzEsICAgIDYwLCAgICA3MCwKLSAgICAzNSwgICAgNzAsICAgIDY0LCAgICAgMCwgICAgMzIsICAgIDYwLCAgICA3MCwgICAgMzUsICAgIDcwLCAgICA2NCwKLSAgICAgMCwgICAgNjUsICAgIDc2LCAgICA2NiwgICAgIDAsICAgIDgxLCAgICA2NSwgICAgNzYsICAgIDY2LCAgICAgMCwKLSAgICAgMCwgICAgNzAsICAgIDU5LCAgICA3NCwgICAgNzcsICAgIDY3LCAgICAgMCwgICAgIDAsICAgIDcwLCAgICA2MCwKLSAgICA3NSwgICAgNzYsICAgIDY0LCAgICAgMCwgICAgIDAsICAgIDcwLCAgICAgMCwgICAgNzYsICAgIDM1LCAgICA3MCwKLSAgICAgMCwgICAgNzAsICAgICAwLCAgICA3NywgICAgMzUsICAgIDcwLCAgICAgMCwgICAgNjUsICAgIDgxLCAgICA2NiwKLSAgICA3MCwgICAgIDAsICAgIDgxLCAgICA2MCwgICAgNzAsICAgIDY0LCAgICAgMCwgICAgNjAsICAgIDcwLCAgICA2NCwKLSAgICAgMCwgICAgNzAsICAgIDQ5LCAgICA3MCwgICAgIDAsICAgIDcwLCAgICA1MiwgICAgNzAsICAgICAwLCAgICA3MCwKLSAgICA1MywgICAgNzAsICAgICAwLCAgICA3MCwgICAgNTQsICAgIDcwLCAgICAgMCwgICAgNzAsICAgIDU1LCAgICA3MCwKLSAgICAgMCwgICAgNzAsICAgIDUwLCAgICA3MCwgICAgIDAsICAgIDcwLCAgICA1MSwgICAgNzAsICAgICAwLCAgICA3MCwKLSAgICA0MiwgICAgNzAsICAgICAwLCAgICA3MCwgICAgNDMsICAgIDcwLCAgICAgMCwgICAgNzAsICAgIDQ0LCAgICA3MCwKLSAgICAgMCwgICAgNzAsICAgIDQwLCAgICA3MCwgICAgIDAsICAgIDcwLCAgICA0MSwgICAgNzAsICAgICAwLCAgICA3MCwKLSAgICAzOCwgICAgNzAsICAgICAwLCAgICA3MCwgICAgMzksICAgIDcwLCAgICAgMCwgICAgNzAsICAgIDQ3LCAgICA3MCwKLSAgICAgMCwgICAgNzAsICAgIDQ2LCAgICA3MCwgICAgIDAsICAgIDcwLCAgICAzNywgICAgNzAsICAgICAwLCAgICAgNywKLSAgICAgMCwgICAgIDgsICAgICAwLCAgICAgMywgICAgIDAsICAgICA2LCAgICAgMCwgICAgIDksICAgICAwLCAgICAxMCwKLSAgICAgMCwgICAgODAsICAgICAwLCAgICAxNywgICAgNjAsICAgIDgxLCAgICA2NCwgICAgIDAsICAgIDExLCAgICAgMCwKLSAgICA3OSwgICAgIDAsICAgIDEzLCAgICAgMCwgICAgNzgsICAgIDMzLCAgICAxMywgICAgIDAsICAgIDc5LCAgICAgMCwKLSAgICAzNCwgICAgIDAsICAgIDc4LCAgICAzMywgICAgMTIsICAgICAwLCAgICAxMiwgICAgIDAsICAgIDE2LCAgICAgMAotfTsKLQotI2VuZGlmCi0KLSNpZiBZWURFQlVHICE9IDAKLXN0YXRpYyBjb25zdCBzaG9ydCB5eXJsaW5lW10gPSB7IDAsCi0gICAyMDQsICAgMjA1LCAgIDIwOCwgICAyMTcsICAgMjIwLCAgIDIyMiwgICAyMjcsICAgMjMxLCAgIDIzNSwgICAyMzYsCi0gICAyMzksICAgMjQzLCAgIDI0NywgICAyNTEsICAgMjU1LCAgIDI2MSwgICAyNjcsICAgMjcxLCAgIDI3NywgICAyODEsCi0gICAyODUsICAgMjg5LCAgIDI5NCwgICAyOTgsICAgMzA0LCAgIDMwOCwgICAzMTQsICAgMzIwLCAgIDMyMywgICAzMjcsCi0gICAzMzEsICAgMzM0LCAgIDMzNiwgICAzNDIsICAgMzQ3LCAgIDM1MywgICAzNTcsICAgMzYzLCAgIDM2NiwgICAzNzAsCi0gICAzNzUsICAgMzgwLCAgIDM4NSwgICAzOTEsICAgMzk3LCAgIDQwNSwgICA0MDksICAgNDEzLCAgIDQxNywgICA0MjEsCi0gICA0MjUsICAgNDI5LCAgIDQzMywgICA0MzcsICAgNDM5LCAgIDQ0MywgICA0NDcsICAgNDUxLCAgIDQ1NSwgICA0NTksCi0gICA0NjMsICAgNDY3LCAgIDQ3NCwgICA0ODAsICAgNDg2LCAgIDQ5MywgICA1MDIsICAgNTEwLCAgIDUxNywgICA1MjAsCi0gICA1MjcsICAgNTM0LCAgIDUzOCwgICA1NDcsICAgNTU5LCAgIDU2NywgICA1NzEsICAgNTg3LCAgIDYzOAotfTsKLSNlbmRpZgotCi0KLSNpZiBZWURFQlVHICE9IDAgfHwgZGVmaW5lZCAoWVlFUlJPUl9WRVJCT1NFKQotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHl5dG5hbWVbXSA9IHsgICAiJCIsImVycm9yIiwiJHVuZGVmaW5lZC4iLCJJTlQiLCJIRVgiLAotIkVSUk9SIiwiVUlOVCIsIk0yX1RSVUUiLCJNMl9GQUxTRSIsIkNIQVIiLCJGTE9BVCIsIlNUUklORyIsIk5BTUUiLCJCTE9DS05BTUUiLAotIklERU5UIiwiVkFSTkFNRSIsIlRZUEVOQU1FIiwiU0laRSIsIkNBUCIsIk9SRCIsIkhJR0giLCJBQlMiLCJNSU5fRlVOQyIsIk1BWF9GVU5DIiwKLSJGTE9BVF9GVU5DIiwiVkFMIiwiQ0hSIiwiT0REIiwiVFJVTkMiLCJJTkMiLCJERUMiLCJJTkNMIiwiRVhDTCIsIkNPTE9OQ09MT04iLAotIklOVEVSTkFMX1ZBUiIsIicsJyIsIkFCT1ZFX0NPTU1BIiwiQVNTSUdOIiwiJzwnIiwiJz4nIiwiTEVRIiwiR0VRIiwiJz0nIiwiTk9URVFVQUwiLAotIicjJyIsIklOIiwiT1JPUiIsIkxPR0lDQUxfQU5EIiwiJyYnIiwiJ0AnIiwiJysnIiwiJy0nIiwiJyonIiwiJy8nIiwiRElWIiwiTU9EIiwKLSJVTkFSWSIsIideJyIsIkRPVCIsIidbJyIsIicoJyIsIk5PVCIsIid+JyIsIlFJRCIsIicpJyIsIid7JyIsIid9JyIsIiddJyIsInN0YXJ0IiwKLSJ0eXBlX2V4cCIsImV4cCIsIkAxIiwibm90X2V4cCIsInNldCIsIkAyIiwiQDMiLCJhcmdsaXN0Iiwibm9uX2VtcHR5X2FyZ2xpc3QiLAotImJsb2NrIiwiZmJsb2NrIiwidmFyaWFibGUiLCJ0eXBlIiwgTlVMTAotfTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlyMVtdID0geyAgICAgMCwKLSAgICA2OCwgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcyLCAgICA3MiwKLSAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwKLSAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwKLSAgICA3MCwgICAgNzMsICAgIDczLCAgICA3NCwgICAgNzAsICAgIDc1LCAgICA3MCwgICAgNzYsICAgIDc2LCAgICA3NiwKLSAgICA3NywgICAgNzcsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwKLSAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwKLSAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwKLSAgICA3MCwgICAgNzgsICAgIDc5LCAgICA3OSwgICAgODAsICAgIDgwLCAgICA4MCwgICAgODAsICAgIDgxCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlyMltdID0geyAgICAgMCwKLSAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDAsICAgICAzLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMSwKLSAgICAgNCwgICAgIDQsICAgICA0LCAgICAgNCwgICAgIDQsICAgICA0LCAgICAgNCwgICAgIDYsICAgICA0LCAgICAgNCwKLSAgICAgNCwgICAgIDIsICAgICA0LCAgICAgNiwgICAgIDQsICAgICA2LCAgICAgMywgICAgIDEsICAgICAzLCAgICAgNiwKLSAgICAgNiwgICAgIDMsICAgICA0LCAgICAgMCwgICAgIDUsICAgICAwLCAgICAgNSwgICAgIDAsICAgICAxLCAgICAgMywKLSAgICAgMSwgICAgIDMsICAgICA0LCAgICAgNCwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywKLSAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywKLSAgICAgMywgICAgIDMsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgNCwKLSAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDEsICAgICAxLCAgICAgMywgICAgIDEsICAgICAxCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlkZWZhY3RbXSA9IHsgICAgIDAsCi0gICAgNjUsICAgIDY2LCAgICA2MywgICAgNjQsICAgIDY3LCAgICA2OCwgICAgNzEsICAgIDc4LCAgICA3MywgICAgNzksCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNzYsICAgICAwLCAgICAgNSwgICAgIDAsCi0gICAgIDksICAgIDEwLCAgICAzOCwgICAgIDIsICAgICAxLCAgICAgMCwgICAgMjgsICAgICAwLCAgICA3NSwgICAgNjksCi0gICAgIDMsICAgICAwLCAgICAyMiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDcsCi0gICAgIDAsICAgICAwLCAgICAzOSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDQsICAgICAwLCAgICAzNCwgICAgMzYsICAgICA4LCAgICAgMCwgICAgIDAsCi0gICAgMzgsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICA2LCAgICA0NSwgICAgIDAsCi0gICAgMzIsICAgICAwLCAgICA2MiwgICAgNTgsICAgIDU5LCAgICA1NiwgICAgNTcsICAgIDUzLCAgICA1NCwgICAgNTUsCi0gICAgMzgsICAgIDI5LCAgICAgMCwgICAgNjEsICAgIDYwLCAgICA0NiwgICAgNTEsICAgIDUyLCAgICA0NywgICAgNDgsCi0gICAgNDksICAgIDUwLCAgICAyNywgICAgIDAsICAgIDM4LCAgICA3NywgICAgNzQsICAgICAwLCAgICAgMCwgICAgNzAsCi0gICAgMTEsICAgIDEyLCAgICAxNCwgICAgMTMsICAgIDE1LCAgICAxNiwgICAgMTcsICAgICAwLCAgICAxOSwgICAgMjAsCi0gICAgMjEsICAgICAwLCAgICAyMywgICAgIDAsICAgIDI1LCAgICAgMCwgICAgIDAsICAgIDQwLCAgICA0MywgICAgNDEsCi0gICAgIDAsICAgICAwLCAgICA0NCwgICAgMzMsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgMzUsICAgIDM3LCAgICAxOCwgICAgMjQsICAgIDI2LCAgICAzMCwgICAgMzEsICAgIDQyLCAgICAgMCwgICAgIDAsCi0gICAgIDAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eWRlZmdvdG9bXSA9IHsgICAxNzksCi0gICAgMzQsICAgIDYzLCAgICA2MSwgICAgMzYsICAgIDM3LCAgIDEzNCwgICAxMzUsICAgIDY0LCAgIDE2MSwgICAgMzgsCi0gICAgMzksICAgIDQwLCAgICA0NAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cGFjdFtdID0geyAgIDE1NSwKLS0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKLSAgIDIxNSwgICAtMjcsICAgLTIyLCAgIC0yMCwgICAtMTksICAgIDE0LCAgICAyNCwgICAgMjYsICAgIDI3LCAgICAyOCwKLSAgICAyOSwgICAgMzEsICAgIDMyLCAgICAzMywgICAgMzUsICAgIDM2LC0zMjc2OCwgICAxNTUsLTMyNzY4LCAgIDE1NSwKLS0zMjc2OCwtMzI3NjgsICAgMTU1LC0zMjc2OCwgICA3NDIsICAgMTU1LC0zMjc2OCwgICAgLTYsICAgIC00LC0zMjc2OCwKLSAgIC0zNCwgICAxNTUsICAgICA1LCAgIC0zNCwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgIDQ0LCAgICA0NCwKLSAgIDE1NSwgICAgNDQsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgICAgNSwKLSAgIDE1NSwgICAyNzIsICAgNzQyLCAgIC0zMSwgICAtNDEsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwKLSAgIDE1NSwgICAxNTUsICAgMTU1LCAgIC0xNSwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwKLSAgIDE1NSwgICAxNTUsICAgMTU1LC0zMjc2OCwgICAgODUsLTMyNzY4LC0zMjc2OCwgICAgIDUsICAgIC01LCAgIDE1NSwKLSAgIDE1NSwgICAtMjEsICAgMzAwLCAgIDMyOCwgICAzNTYsICAgMzg0LCAgICAzNCwgICAgMzksICAgNDEyLCAgICA2NCwKLSAgIDQ0MCwgICA0NjgsICAgNDk2LCAgICA3OCwgICAyNDQsICAgNjkyLCAgIDcxOCwgICAgIDUsLTMyNzY4LCAgIDE1NSwKLS0zMjc2OCwgICAxNTUsICAgNzY2LCAgIC0zNywgICAtMzcsICAgLTM3LCAgIC0zNywgICAtMzcsICAgLTM3LCAgIC0zNywKLSAgIDE1NSwtMzI3NjgsICAgIDQwLCAgIDE0MSwgICAyMDEsICAgNzc3LCAgIDc4NiwgICA3ODYsICAgICA1LCAgICAgNSwKLSAgICAgNSwgICAgIDUsLTMyNzY4LCAgIDE1NSwgICAxNTUsLTMyNzY4LC0zMjc2OCwgICA1MjQsICAgLTI5LC0zMjc2OCwKLS0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAxNTUsLTMyNzY4LC0zMjc2OCwKLS0zMjc2OCwgICAxNTUsLTMyNzY4LCAgIDE1NSwtMzI3NjgsICAgMTU1LCAgIDE1NSwgICA3NDIsICAgICA1LCAgIDc0MiwKLSAgIC0zMywgICAtMzIsLTMyNzY4LC0zMjc2OCwgICA1NTIsICAgNTgwLCAgIDYwOCwgICA2MzYsICAgNjY0LCAgIDE1NSwKLS0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICA3NDIsICAgMTAwLCAgIDEwNiwKLS0zMjc2OAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cGdvdG9bXSA9IHstMzI3NjgsCi0tMzI3NjgsICAgICAwLC0zMjc2OCwtMzI3NjgsICAgIDM3LC0zMjc2OCwtMzI3NjgsICAgLTg2LC0zMjc2OCwtMzI3NjgsCi0tMzI3NjgsLTMyNzY4LCAgICA1MgotfTsKLQotCi0jZGVmaW5lCVlZTEFTVAkJODQ2Ci0KLQotc3RhdGljIGNvbnN0IHNob3J0IHl5dGFibGVbXSA9IHsgICAgMzUsCi0gICAgMTAsICAgMTcwLCAgIDExMCwgICAxMTAsICAgMTM5LCAgIDExMCwgICAxMzYsICAgMTM3LCAgICA3NSwgICAgNzYsCi0gICAgNDMsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLCAgICA5MCwgICAgODQsCi0gICAgODUsICAgIDg2LCAgICA4NywgICAgOTEsICAgMTEyLCAgICA5MCwgICAgODksICAgIDYwLCAgIC03MiwgICAgNjIsCi0gICAgOTEsICAgMTcyLCAgICA0NSwgICAxNzEsICAgMTExLCAgICA4OCwgICAxNjQsICAgIDQ2LCAgICA5MCwgICAgNDcsCi0gICAgNDgsICAgIDYyLCAgIDE0MCwgICAgOTEsICAgIDkzLCAgICA5NCwgICAgOTUsICAgIDk2LCAgIDE2MiwgICAxMjEsCi0gICAgOTksICAgIDQxLCAgIDEwMSwgICAxMDIsICAgMTAzLCAgIDEwNCwgICAxMDUsICAgMTA2LCAgIDEwNywgICAgMTAsCi0gICAxMDgsICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgIDExMywgICAxMTQsICAgMTE1LCAgIDExNiwgICAxMTcsCi0gICAxMTgsICAgMTE5LCAgIDEyMCwgICAgNDksICAgMTI0LCAgIDEyNSwgICAxMjYsICAgMTI3LCAgIDEyOCwgICAxMjksCi0gICAxMzAsICAgMTMxLCAgIDEzMiwgICAgNTAsICAgIDY1LCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAxMzgsCi0gICAgNTUsICAgIDU2LCAgICA1NywgICAgOTIsICAgIDU4LCAgICA1OSwgICAxMzMsICAgMTQ1LCAgIDE0OCwgICAxODAsCi0gICAgOTcsICAgIDk4LCAgIDE0NiwgICAxMDAsICAgIDkxLCAgIDE4MSwgICAgIDAsICAgICAwLCAgICAgMCwgICAxNTgsCi0gICAxMjIsICAgMTU5LCAgIDE1MiwgICAgIDAsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsCi0gICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LCAgIDEyMywgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsCi0gICAgODEsICAgIDgyLCAgICA4MywgICAxNjAsICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgMTUzLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTY1LCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgMTY2LCAgICAgMCwgICAxNjcsICAgICAwLCAgIDE2OCwgICAxNjksICAgICAxLCAgICAgMCwgICAgIDAsCi0gICAgIDIsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAgMCwgICAxNzgsCi0gICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksCi0gICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDc2LCAgICAyNywgICAgNzcsCi0gICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwgICAgODYsCi0gICAgODcsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDI4LCAgICAyOSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDMwLCAgICAzMSwgICAgMzIsICAgICAxLCAgICAgMCwgICAgMzMsCi0gICAgIDIsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAgMCwgICAgIDAsCi0gICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksCi0gICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgICAwLCAgICAyNywgICAgNzcsCi0gICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwgICAgODYsCi0gICAgODcsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDI4LCAgICAyOSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDQyLCAgICAzMSwgICAgMzIsICAgICAwLCAgIDE1NCwgICAgMzMsCi0gICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsCi0gICAgNzYsICAgICAwLCAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsCi0gICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTU1LCAgICA2NiwgICAgNjcsCi0gICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsCi0gICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLCAgICA4NCwgICAgODUsCi0gICAgODYsICAgIDg3LCAgICAgMCwgICAgIDAsICAgICAwLCAgIDEwOSwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksCi0gICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLCAgICA3NywgICAgNzgsCi0gICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAxNDEsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsCi0gICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsCi0gICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgMTQyLCAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsCi0gICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsCi0gICAgODMsICAgICAwLCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgIDAsICAgICAwLCAgICAgMCwgICAxNDMsCi0gICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsCi0gICAgNzYsICAgICAwLCAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsCi0gICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTQ0LCAgICA2NiwgICAgNjcsCi0gICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsCi0gICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLCAgICA4NCwgICAgODUsCi0gICAgODYsICAgIDg3LCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE0NywgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksCi0gICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLCAgICA3NywgICAgNzgsCi0gICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAxNDksICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsCi0gICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsCi0gICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgMTUwLCAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsCi0gICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsCi0gICAgODMsICAgICAwLCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgIDAsICAgICAwLCAgICAgMCwgICAxNTEsCi0gICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsCi0gICAgNzYsICAgICAwLCAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsCi0gICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTYzLCAgICA2NiwgICAgNjcsCi0gICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsCi0gICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLCAgICA4NCwgICAgODUsCi0gICAgODYsICAgIDg3LCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE3MywgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksCi0gICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLCAgICA3NywgICAgNzgsCi0gICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsCi0gICAgIDAsICAgICAwLCAgICAgMCwgICAxNzQsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsCi0gICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsCi0gICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgICAgMCwgICAgIDAsCi0gICAgIDAsICAgMTc1LCAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsCi0gICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsCi0gICAgODMsICAgICAwLCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgIDAsICAgICAwLCAgICAgMCwgICAxNzYsCi0gICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsCi0gICAgNzYsICAgICAwLCAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsCi0gICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgICAwLCAgICAgMCwgICAxNTYsICAgMTc3LCAgICA2NiwgICAgNjcsCi0gICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsCi0gICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLCAgICA4NCwgICAgODUsCi0gICAgODYsICAgIDg3LCAgIDE1NywgICAgIDAsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsCi0gICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsCi0gICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgICA2NiwgICAgNjcsCi0gICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsCi0gICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLCAgICA4NCwgICAgODUsCi0gICAgODYsICAgIDg3LC0zMjc2OCwgICAgNjcsICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsCi0gICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsCi0gICAgODMsICAgICAwLCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsCi0gICAgODIsICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgIDgwLCAgICA4MSwgICAgODIsCi0gICAgODMsICAgICAwLCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NwotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5Y2hlY2tbXSA9IHsgICAgIDAsCi0gICAgMTYsICAgIDM1LCAgICAzNSwgICAgMzUsICAgIDkxLCAgICAzNSwgICAgMTIsICAgIDEzLCAgICA0NiwgICAgNDcsCi0gICAgMTEsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICA2MCwgICAgNTcsCi0gICAgNTgsICAgIDU5LCAgICA2MCwgICAgNjUsICAgIDY2LCAgICA2MCwgICAgMzMsICAgIDI4LCAgICAzMywgICAgMzAsCi0gICAgNjUsICAgIDY0LCAgICA2MCwgICAgNjcsICAgIDY2LCAgICAzNiwgICAgNjYsICAgIDYwLCAgICA2MCwgICAgNjAsCi0gICAgNjAsICAgIDQyLCAgICA2NCwgICAgNjUsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgIDEzNSwgICAgNjUsCi0gICAgNTEsICAgICAwLCAgICA1MywgICAgNTQsICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgMTYsCi0gICAgNjEsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OSwgICAgNzAsCi0gICAgNzEsICAgIDcyLCAgICA3MywgICAgNjAsICAgIDc1LCAgICA3NiwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsCi0gICAgODEsICAgIDgyLCAgICA4MywgICAgNjAsICAgIDMzLCAgICA2MCwgICAgNjAsICAgIDYwLCAgICA2MCwgICAgOTAsCi0gICAgNjAsICAgIDYwLCAgICA2MCwgICAgNDIsICAgIDYwLCAgICA2MCwgICAgMTIsICAgIDY0LCAgICAzNSwgICAgIDAsCi0gICAgNDksICAgIDUwLCAgICA2NCwgICAgNTIsICAgIDY1LCAgICAgMCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAxMTAsCi0gICAgNzQsICAgMTEyLCAgICAzNSwgICAgLTEsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsCi0gICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA3NCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsCi0gICAgNTMsICAgIDU0LCAgICA1NSwgICAxMzQsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICAtMSwgICAgLTEsCi0gICAgLTEsICAgIDY0LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgMTQ4LCAgICAtMSwgICAgLTEsCi0gICAgLTEsICAgMTUyLCAgICAtMSwgICAxNTQsICAgIC0xLCAgIDE1NiwgICAxNTcsICAgICAzLCAgICAtMSwgICAgLTEsCi0gICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAtMSwgICAxNzAsCi0gICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsCi0gICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsICAgIDQ3LCAgICAzNCwgICAgNDksCi0gICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwgICAgNTksCi0gICAgNjAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDUwLCAgICA1MSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDYwLCAgICA2MSwgICAgNjIsICAgICAzLCAgICAtMSwgICAgNjUsCi0gICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAtMSwgICAgLTEsCi0gICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsCi0gICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsICAgIC0xLCAgICAzNCwgICAgNDksCi0gICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwgICAgNTksCi0gICAgNjAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDUwLCAgICA1MSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDYwLCAgICA2MSwgICAgNjIsICAgIC0xLCAgICAzNSwgICAgNjUsCi0gICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsCi0gICAgNDcsICAgIC0xLCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsCi0gICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDY0LCAgICAzNywgICAgMzgsCi0gICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgLTEsCi0gICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsCi0gICAgNTksICAgIDYwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2NCwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsCi0gICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIC0xLCAgICA0OSwgICAgNTAsCi0gICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjQsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsCi0gICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICAtMSwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsCi0gICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICAtMSwgICAgLTEsCi0gICAgLTEsICAgIDY0LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsCi0gICAgNDUsICAgIDQ2LCAgICA0NywgICAgLTEsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsCi0gICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjQsCi0gICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsCi0gICAgNDcsICAgIC0xLCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsCi0gICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDY0LCAgICAzNywgICAgMzgsCi0gICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgLTEsCi0gICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsCi0gICAgNTksICAgIDYwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2NCwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsCi0gICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIC0xLCAgICA0OSwgICAgNTAsCi0gICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjQsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsCi0gICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICAtMSwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsCi0gICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICAtMSwgICAgLTEsCi0gICAgLTEsICAgIDY0LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsCi0gICAgNDUsICAgIDQ2LCAgICA0NywgICAgLTEsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsCi0gICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjQsCi0gICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsCi0gICAgNDcsICAgIC0xLCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsCi0gICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDY0LCAgICAzNywgICAgMzgsCi0gICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgLTEsCi0gICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsCi0gICAgNTksICAgIDYwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2NCwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsCi0gICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIC0xLCAgICA0OSwgICAgNTAsCi0gICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjQsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsCi0gICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICAtMSwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsCi0gICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICAtMSwgICAgLTEsCi0gICAgLTEsICAgIDY0LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsCi0gICAgNDUsICAgIDQ2LCAgICA0NywgICAgLTEsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsCi0gICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjQsCi0gICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsCi0gICAgNDcsICAgIC0xLCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsCi0gICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIC0xLCAgICAtMSwgICAgMzUsICAgIDY0LCAgICAzNywgICAgMzgsCi0gICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgLTEsCi0gICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsCi0gICAgNTksICAgIDYwLCAgICAzNSwgICAgLTEsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsCi0gICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICAtMSwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsCi0gICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICAzNywgICAgMzgsCi0gICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgLTEsCi0gICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsCi0gICAgNTksICAgIDYwLCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsCi0gICAgNDUsICAgIDQ2LCAgICA0NywgICAgLTEsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsCi0gICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsCi0gICAgNTQsICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDUyLCAgICA1MywgICAgNTQsCi0gICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MAotfTsKLS8qIC0qLUMtKi0gIE5vdGUgc29tZSBjb21waWxlcnMgY2hva2Ugb24gY29tbWVudHMgb24gYCNsaW5lJyBsaW5lcy4gICovCi0jbGluZSAzICIvc3RvbmUvamltYi9tYWluLTk4cjIvc2hhcmUvYmlzb24uc2ltcGxlIgotCi0vKiBTa2VsZXRvbiBvdXRwdXQgcGFyc2VyIGZvciBiaXNvbiwKLSAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCi0KLS8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHdoZW4gdGhpcyBmaWxlIGlzIGNvcGllZCBieSBCaXNvbiBpbnRvIGEKLSAgIEJpc29uIG91dHB1dCBmaWxlLCB5b3UgbWF5IHVzZSB0aGF0IG91dHB1dCBmaWxlIHdpdGhvdXQgcmVzdHJpY3Rpb24uCi0gICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gICBpbiB2ZXJzaW9uIDEuMjQgb2YgQmlzb24uICAqLwotCi0jaWZuZGVmIGFsbG9jYQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZSAvKiBub3QgR05VIEMuICAqLwotI2lmICghZGVmaW5lZCAoX19TVERDX18pICYmIGRlZmluZWQgKHNwYXJjKSkgfHwgZGVmaW5lZCAoX19zcGFyY19fKSB8fCBkZWZpbmVkIChfX3NwYXJjKSB8fCBkZWZpbmVkIChfX3NnaSkKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLSNlbHNlIC8qIG5vdCBzcGFyYyAqLwotI2lmIGRlZmluZWQgKE1TRE9TKSAmJiAhZGVmaW5lZCAoX19UVVJCT0NfXykKLSNlbHNlIC8qIG5vdCBNU0RPUywgb3IgX19UVVJCT0NfXyAqLwotI2lmIGRlZmluZWQoX0FJWCkKLSAjcHJhZ21hIGFsbG9jYQotI2Vsc2UgLyogbm90IE1TRE9TLCBfX1RVUkJPQ19fLCBvciBfQUlYICovCi0jaWZkZWYgX19ocHV4Ci0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotdm9pZCAqYWxsb2NhICh1bnNpZ25lZCBpbnQpOwotfTsKLSNlbHNlIC8qIG5vdCBfX2NwbHVzcGx1cyAqLwotdm9pZCAqYWxsb2NhICgpOwotI2VuZGlmIC8qIG5vdCBfX2NwbHVzcGx1cyAqLwotI2VuZGlmIC8qIF9faHB1eCAqLwotI2VuZGlmIC8qIG5vdCBfQUlYICovCi0jZW5kaWYgLyogbm90IE1TRE9TLCBvciBfX1RVUkJPQ19fICovCi0jZW5kaWYgLyogbm90IHNwYXJjLiAgKi8KLSNlbmRpZiAvKiBub3QgR05VIEMuICAqLwotI2VuZGlmIC8qIGFsbG9jYSBub3QgZGVmaW5lZC4gICovCi0KLS8qIFRoaXMgaXMgdGhlIHBhcnNlciBjb2RlIHRoYXQgaXMgd3JpdHRlbiBpbnRvIGVhY2ggYmlzb24gcGFyc2VyCi0gIHdoZW4gdGhlICVzZW1hbnRpY19wYXJzZXIgZGVjbGFyYXRpb24gaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgZ3JhbW1hci4KLSAgSXQgd2FzIHdyaXR0ZW4gYnkgUmljaGFyZCBTdGFsbG1hbiBieSBzaW1wbGlmeWluZyB0aGUgaGFpcnkgcGFyc2VyCi0gIHVzZWQgd2hlbiAlc2VtYW50aWNfcGFyc2VyIGlzIHNwZWNpZmllZC4gICovCi0KLS8qIE5vdGU6IHRoZXJlIG11c3QgYmUgb25seSBvbmUgZG9sbGFyIHNpZ24gaW4gdGhpcyBmaWxlLgotICAgSXQgaXMgcmVwbGFjZWQgYnkgdGhlIGxpc3Qgb2YgYWN0aW9ucywgZWFjaCBhY3Rpb24KLSAgIGFzIG9uZSBjYXNlIG9mIHRoZSBzd2l0Y2guICAqLwotCi0jZGVmaW5lIHl5ZXJyb2sJCSh5eWVycnN0YXR1cyA9IDApCi0jZGVmaW5lIHl5Y2xlYXJpbgkoeXljaGFyID0gWVlFTVBUWSkKLSNkZWZpbmUgWVlFTVBUWQkJLTIKLSNkZWZpbmUgWVlFT0YJCTAKLSNkZWZpbmUgWVlBQ0NFUFQJcmV0dXJuKDApCi0jZGVmaW5lIFlZQUJPUlQgCXJldHVybigxKQotI2RlZmluZSBZWUVSUk9SCQlnb3RvIHl5ZXJybGFiMQotLyogTGlrZSBZWUVSUk9SIGV4Y2VwdCBkbyBjYWxsIHl5ZXJyb3IuCi0gICBUaGlzIHJlbWFpbnMgaGVyZSB0ZW1wb3JhcmlseSB0byBlYXNlIHRoZQotICAgdHJhbnNpdGlvbiB0byB0aGUgbmV3IG1lYW5pbmcgb2YgWVlFUlJPUiwgZm9yIEdDQy4KLSAgIE9uY2UgR0NDIHZlcnNpb24gMiBoYXMgc3VwcGxhbnRlZCB2ZXJzaW9uIDEsIHRoaXMgY2FuIGdvLiAgKi8KLSNkZWZpbmUgWVlGQUlMCQlnb3RvIHl5ZXJybGFiCi0jZGVmaW5lIFlZUkVDT1ZFUklORygpICAoISF5eWVycnN0YXR1cykKLSNkZWZpbmUgWVlCQUNLVVAodG9rZW4sIHZhbHVlKSBcCi1kbwkJCQkJCQkJXAotICBpZiAoeXljaGFyID09IFlZRU1QVFkgJiYgeXlsZW4gPT0gMSkJCQkJXAotICAgIHsgeXljaGFyID0gKHRva2VuKSwgeXlsdmFsID0gKHZhbHVlKTsJCQlcCi0gICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CQkJCVwKLSAgICAgIFlZUE9QU1RBQ0s7CQkJCQkJXAotICAgICAgZ290byB5eWJhY2t1cDsJCQkJCQlcCi0gICAgfQkJCQkJCQkJXAotICBlbHNlCQkJCQkJCQlcCi0gICAgeyB5eWVycm9yICgic3ludGF4IGVycm9yOiBjYW5ub3QgYmFjayB1cCIpOyBZWUVSUk9SOyB9CVwKLXdoaWxlICgwKQotCi0jZGVmaW5lIFlZVEVSUk9SCTEKLSNkZWZpbmUgWVlFUlJDT0RFCTI1NgotCi0jaWZuZGVmIFlZUFVSRQotI2RlZmluZSBZWUxFWAkJeXlsZXgoKQotI2VuZGlmCi0KLSNpZmRlZiBZWVBVUkUKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSNpZmRlZiBZWUxFWF9QQVJBTQotI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCwgJnl5bGxvYywgWVlMRVhfUEFSQU0pCi0jZWxzZQotI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCwgJnl5bGxvYykKLSNlbmRpZgotI2Vsc2UgLyogbm90IFlZTFNQX05FRURFRCAqLwotI2lmZGVmIFlZTEVYX1BBUkFNCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsLCBZWUxFWF9QQVJBTSkKLSNlbHNlCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsKQotI2VuZGlmCi0jZW5kaWYgLyogbm90IFlZTFNQX05FRURFRCAqLwotI2VuZGlmCi0KLS8qIElmIG5vbnJlZW50cmFudCwgZ2VuZXJhdGUgdGhlIHZhcmlhYmxlcyBoZXJlICovCi0KLSNpZm5kZWYgWVlQVVJFCi0KLWludAl5eWNoYXI7CQkJLyogIHRoZSBsb29rYWhlYWQgc3ltYm9sCQkqLwotWVlTVFlQRQl5eWx2YWw7CQkJLyogIHRoZSBzZW1hbnRpYyB2YWx1ZSBvZiB0aGUJCSovCi0JCQkJLyogIGxvb2thaGVhZCBzeW1ib2wJCQkqLwotCi0jaWZkZWYgWVlMU1BfTkVFREVECi1ZWUxUWVBFIHl5bGxvYzsJCQkvKiAgbG9jYXRpb24gZGF0YSBmb3IgdGhlIGxvb2thaGVhZAkqLwotCQkJCS8qICBzeW1ib2wJCQkJKi8KLSNlbmRpZgotCi1pbnQgeXluZXJyczsJCQkvKiAgbnVtYmVyIG9mIHBhcnNlIGVycm9ycyBzbyBmYXIgICAgICAgKi8KLSNlbmRpZiAgLyogbm90IFlZUFVSRSAqLwotCi0jaWYgWVlERUJVRyAhPSAwCi1pbnQgeXlkZWJ1ZzsJCQkvKiAgbm9uemVybyBtZWFucyBwcmludCBwYXJzZSB0cmFjZQkqLwotLyogU2luY2UgdGhpcyBpcyB1bmluaXRpYWxpemVkLCBpdCBkb2VzIG5vdCBzdG9wIG11bHRpcGxlIHBhcnNlcnMKLSAgIGZyb20gY29leGlzdGluZy4gICovCi0jZW5kaWYKLQotLyogIFlZSU5JVERFUFRIIGluZGljYXRlcyB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBwYXJzZXIncyBzdGFja3MJKi8KLQotI2lmbmRlZglZWUlOSVRERVBUSAotI2RlZmluZSBZWUlOSVRERVBUSCAyMDAKLSNlbmRpZgotCi0vKiAgWVlNQVhERVBUSCBpcyB0aGUgbWF4aW11bSBzaXplIHRoZSBzdGFja3MgY2FuIGdyb3cgdG8KLSAgICAoZWZmZWN0aXZlIG9ubHkgaWYgdGhlIGJ1aWx0LWluIHN0YWNrIGV4dGVuc2lvbiBtZXRob2QgaXMgdXNlZCkuICAqLwotCi0jaWYgWVlNQVhERVBUSCA9PSAwCi0jdW5kZWYgWVlNQVhERVBUSAotI2VuZGlmCi0KLSNpZm5kZWYgWVlNQVhERVBUSAotI2RlZmluZSBZWU1BWERFUFRIIDEwMDAwCi0jZW5kaWYKLQotLyogUHJldmVudCB3YXJuaW5nIGlmIC1Xc3RyaWN0LXByb3RvdHlwZXMuICAqLwotI2lmZGVmIF9fR05VQ19fCi1pbnQgeXlwYXJzZSAodm9pZCk7Ci0jZW5kaWYKLQwKLSNpZiBfX0dOVUNfXyA+IDEJCS8qIEdOVSBDIGFuZCBHTlUgQysrIGRlZmluZSB0aGlzLiAgKi8KLSNkZWZpbmUgX195eV9tZW1jcHkoVE8sRlJPTSxDT1VOVCkJX19idWlsdGluX21lbWNweShUTyxGUk9NLENPVU5UKQotI2Vsc2UJCQkJLyogbm90IEdOVSBDIG9yIEMrKyAqLwotI2lmbmRlZiBfX2NwbHVzcGx1cwotCi0vKiBUaGlzIGlzIHRoZSBtb3N0IHJlbGlhYmxlIHdheSB0byBhdm9pZCBpbmNvbXBhdGliaWxpdGllcwotICAgaW4gYXZhaWxhYmxlIGJ1aWx0LWluIGZ1bmN0aW9ucyBvbiB2YXJpb3VzIHN5c3RlbXMuICAqLwotc3RhdGljIHZvaWQKLV9feXlfbWVtY3B5ICh0bywgZnJvbSwgY291bnQpCi0gICAgIGNoYXIgKnRvOwotICAgICBjaGFyICpmcm9tOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKmYgPSBmcm9tOwotICByZWdpc3RlciBjaGFyICp0ID0gdG87Ci0gIHJlZ2lzdGVyIGludCBpID0gY291bnQ7Ci0KLSAgd2hpbGUgKGktLSA+IDApCi0gICAgKnQrKyA9ICpmKys7Ci19Ci0KLSNlbHNlIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qIFRoaXMgaXMgdGhlIG1vc3QgcmVsaWFibGUgd2F5IHRvIGF2b2lkIGluY29tcGF0aWJpbGl0aWVzCi0gICBpbiBhdmFpbGFibGUgYnVpbHQtaW4gZnVuY3Rpb25zIG9uIHZhcmlvdXMgc3lzdGVtcy4gICovCi1zdGF0aWMgdm9pZAotX195eV9tZW1jcHkgKGNoYXIgKnRvLCBjaGFyICpmcm9tLCBpbnQgY291bnQpCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKmYgPSBmcm9tOwotICByZWdpc3RlciBjaGFyICp0ID0gdG87Ci0gIHJlZ2lzdGVyIGludCBpID0gY291bnQ7Ci0KLSAgd2hpbGUgKGktLSA+IDApCi0gICAgKnQrKyA9ICpmKys7Ci19Ci0KLSNlbmRpZgotI2VuZGlmCi0MCi0jbGluZSAxOTYgIi9zdG9uZS9qaW1iL21haW4tOThyMi9zaGFyZS9iaXNvbi5zaW1wbGUiCi0KLS8qIFRoZSB1c2VyIGNhbiBkZWZpbmUgWVlQQVJTRV9QQVJBTSBhcyB0aGUgbmFtZSBvZiBhbiBhcmd1bWVudCB0byBiZSBwYXNzZWQKLSAgIGludG8geXlwYXJzZS4gIFRoZSBhcmd1bWVudCBzaG91bGQgaGF2ZSB0eXBlIHZvaWQgKi4KLSAgIEl0IHNob3VsZCBhY3R1YWxseSBwb2ludCB0byBhbiBvYmplY3QuCi0gICBHcmFtbWFyIGFjdGlvbnMgY2FuIGFjY2VzcyB0aGUgdmFyaWFibGUgYnkgY2FzdGluZyBpdAotICAgdG8gdGhlIHByb3BlciBwb2ludGVyIHR5cGUuICAqLwotCi0jaWZkZWYgWVlQQVJTRV9QQVJBTQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHIHZvaWQgKllZUEFSU0VfUEFSQU0KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCi0jZWxzZSAvKiBub3QgX19jcGx1c3BsdXMgKi8KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcgWVlQQVJTRV9QQVJBTQotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wgdm9pZCAqWVlQQVJTRV9QQVJBTTsKLSNlbmRpZiAvKiBub3QgX19jcGx1c3BsdXMgKi8KLSNlbHNlIC8qIG5vdCBZWVBBUlNFX1BBUkFNICovCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTAotI2VuZGlmIC8qIG5vdCBZWVBBUlNFX1BBUkFNICovCi0KLWludAoteXlwYXJzZShZWVBBUlNFX1BBUkFNX0FSRykKLSAgICAgWVlQQVJTRV9QQVJBTV9ERUNMCi17Ci0gIHJlZ2lzdGVyIGludCB5eXN0YXRlOwotICByZWdpc3RlciBpbnQgeXluOwotICByZWdpc3RlciBzaG9ydCAqeXlzc3A7Ci0gIHJlZ2lzdGVyIFlZU1RZUEUgKnl5dnNwOwotICBpbnQgeXllcnJzdGF0dXM7CS8qICBudW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkICovCi0gIGludCB5eWNoYXIxID0gMDsJCS8qICBsb29rYWhlYWQgdG9rZW4gYXMgYW4gaW50ZXJuYWwgKHRyYW5zbGF0ZWQpIHRva2VuIG51bWJlciAqLwotCi0gIHNob3J0CXl5c3NhW1lZSU5JVERFUFRIXTsJLyogIHRoZSBzdGF0ZSBzdGFjawkJCSovCi0gIFlZU1RZUEUgeXl2c2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIHNlbWFudGljIHZhbHVlIHN0YWNrCQkqLwotCi0gIHNob3J0ICp5eXNzID0geXlzc2E7CQkvKiAgcmVmZXIgdG8gdGhlIHN0YWNrcyB0aHJ1IHNlcGFyYXRlIHBvaW50ZXJzICovCi0gIFlZU1RZUEUgKnl5dnMgPSB5eXZzYTsJLyogIHRvIGFsbG93IHl5b3ZlcmZsb3cgdG8geHJlYWxsb2NhdGUgdGhlbSBlbHNld2hlcmUgKi8KLQotI2lmZGVmIFlZTFNQX05FRURFRAotICBZWUxUWVBFIHl5bHNhW1lZSU5JVERFUFRIXTsJLyogIHRoZSBsb2NhdGlvbiBzdGFjawkJCSovCi0gIFlZTFRZUEUgKnl5bHMgPSB5eWxzYTsKLSAgWVlMVFlQRSAqeXlsc3A7Ci0KLSNkZWZpbmUgWVlQT1BTVEFDSyAgICh5eXZzcC0tLCB5eXNzcC0tLCB5eWxzcC0tKQotI2Vsc2UKLSNkZWZpbmUgWVlQT1BTVEFDSyAgICh5eXZzcC0tLCB5eXNzcC0tKQotI2VuZGlmCi0KLSAgaW50IHl5c3RhY2tzaXplID0gWVlJTklUREVQVEg7Ci0KLSNpZmRlZiBZWVBVUkUKLSAgaW50IHl5Y2hhcjsKLSAgWVlTVFlQRSB5eWx2YWw7Ci0gIGludCB5eW5lcnJzOwotI2lmZGVmIFlZTFNQX05FRURFRAotICBZWUxUWVBFIHl5bGxvYzsKLSNlbmRpZgotI2VuZGlmCi0KLSAgWVlTVFlQRSB5eXZhbDsJCS8qICB0aGUgdmFyaWFibGUgdXNlZCB0byByZXR1cm4JCSovCi0JCQkJLyogIHNlbWFudGljIHZhbHVlcyBmcm9tIHRoZSBhY3Rpb24JKi8KLQkJCQkvKiAgcm91dGluZXMJCQkJKi8KLQotICBpbnQgeXlsZW47Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgZnByaW50ZihzdGRlcnIsICJTdGFydGluZyBwYXJzZVxuIik7Ci0jZW5kaWYKLQotICB5eXN0YXRlID0gMDsKLSAgeXllcnJzdGF0dXMgPSAwOwotICB5eW5lcnJzID0gMDsKLSAgeXljaGFyID0gWVlFTVBUWTsJCS8qIENhdXNlIGEgdG9rZW4gdG8gYmUgcmVhZC4gICovCi0KLSAgLyogSW5pdGlhbGl6ZSBzdGFjayBwb2ludGVycy4KLSAgICAgV2FzdGUgb25lIGVsZW1lbnQgb2YgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrCi0gICAgIHNvIHRoYXQgdGhleSBzdGF5IG9uIHRoZSBzYW1lIGxldmVsIGFzIHRoZSBzdGF0ZSBzdGFjay4KLSAgICAgVGhlIHdhc3RlZCBlbGVtZW50cyBhcmUgbmV2ZXIgaW5pdGlhbGl6ZWQuICAqLwotCi0gIHl5c3NwID0geXlzcyAtIDE7Ci0gIHl5dnNwID0geXl2czsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgeXlsc3AgPSB5eWxzOwotI2VuZGlmCi0KLS8qIFB1c2ggYSBuZXcgc3RhdGUsIHdoaWNoIGlzIGZvdW5kIGluICB5eXN0YXRlICAuICAqLwotLyogSW4gYWxsIGNhc2VzLCB3aGVuIHlvdSBnZXQgaGVyZSwgdGhlIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFja3MKLSAgIGhhdmUganVzdCBiZWVuIHB1c2hlZC4gc28gcHVzaGluZyBhIHN0YXRlIGhlcmUgZXZlbnMgdGhlIHN0YWNrcy4gICovCi15eW5ld3N0YXRlOgotCi0gICorK3l5c3NwID0geXlzdGF0ZTsKLQotICBpZiAoeXlzc3AgPj0geXlzcyArIHl5c3RhY2tzaXplIC0gMSkKLSAgICB7Ci0gICAgICAvKiBHaXZlIHVzZXIgYSBjaGFuY2UgdG8geHJlYWxsb2NhdGUgdGhlIHN0YWNrICovCi0gICAgICAvKiBVc2UgY29waWVzIG9mIHRoZXNlIHNvIHRoYXQgdGhlICYncyBkb24ndCBmb3JjZSB0aGUgcmVhbCBvbmVzIGludG8gbWVtb3J5LiAqLwotICAgICAgWVlTVFlQRSAqeXl2czEgPSB5eXZzOwotICAgICAgc2hvcnQgKnl5c3MxID0geXlzczsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIFlZTFRZUEUgKnl5bHMxID0geXlsczsKLSNlbmRpZgotCi0gICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgdXNlZCBzaXplIG9mIHRoZSB0aHJlZSBzdGFja3MsIGluIGVsZW1lbnRzLiAgKi8KLSAgICAgIGludCBzaXplID0geXlzc3AgLSB5eXNzICsgMTsKLQotI2lmZGVmIHl5b3ZlcmZsb3cKLSAgICAgIC8qIEVhY2ggc3RhY2sgcG9pbnRlciBhZGRyZXNzIGlzIGZvbGxvd2VkIGJ5IHRoZSBzaXplIG9mCi0JIHRoZSBkYXRhIGluIHVzZSBpbiB0aGF0IHN0YWNrLCBpbiBieXRlcy4gICovCi0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICAvKiBUaGlzIHVzZWQgdG8gYmUgYSBjb25kaXRpb25hbCBhcm91bmQganVzdCB0aGUgdHdvIGV4dHJhIGFyZ3MsCi0JIGJ1dCB0aGF0IG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB5eW92ZXJmbG93IGlzIGEgbWFjcm8uICAqLwotICAgICAgeXlvdmVyZmxvdygicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKLQkJICZ5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKLQkJICZ5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKLQkJICZ5eWxzMSwgc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSwKLQkJICZ5eXN0YWNrc2l6ZSk7Ci0jZWxzZQotICAgICAgeXlvdmVyZmxvdygicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKLQkJICZ5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKLQkJICZ5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKLQkJICZ5eXN0YWNrc2l6ZSk7Ci0jZW5kaWYKLQotICAgICAgeXlzcyA9IHl5c3MxOyB5eXZzID0geXl2czE7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICB5eWxzID0geXlsczE7Ci0jZW5kaWYKLSNlbHNlIC8qIG5vIHl5b3ZlcmZsb3cgKi8KLSAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgb3VyIG93biB3YXkuICAqLwotICAgICAgaWYgKHl5c3RhY2tzaXplID49IFlZTUFYREVQVEgpCi0JewotCSAgeXllcnJvcigicGFyc2VyIHN0YWNrIG92ZXJmbG93Iik7Ci0JICByZXR1cm4gMjsKLQl9Ci0gICAgICB5eXN0YWNrc2l6ZSAqPSAyOwotICAgICAgaWYgKHl5c3RhY2tzaXplID4gWVlNQVhERVBUSCkKLQl5eXN0YWNrc2l6ZSA9IFlZTUFYREVQVEg7Ci0gICAgICB5eXNzID0gKHNob3J0ICopIGFsbG9jYSAoeXlzdGFja3NpemUgKiBzaXplb2YgKCp5eXNzcCkpOwotICAgICAgX195eV9tZW1jcHkgKChjaGFyICopeXlzcywgKGNoYXIgKil5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSk7Ci0gICAgICB5eXZzID0gKFlZU1RZUEUgKikgYWxsb2NhICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSk7Ci0gICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eXZzLCAoY2hhciAqKXl5dnMxLCBzaXplICogc2l6ZW9mICgqeXl2c3ApKTsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIHl5bHMgPSAoWVlMVFlQRSAqKSBhbGxvY2EgKHl5c3RhY2tzaXplICogc2l6ZW9mICgqeXlsc3ApKTsKLSAgICAgIF9feXlfbWVtY3B5ICgoY2hhciAqKXl5bHMsIChjaGFyICopeXlsczEsIHNpemUgKiBzaXplb2YgKCp5eWxzcCkpOwotI2VuZGlmCi0jZW5kaWYgLyogbm8geXlvdmVyZmxvdyAqLwotCi0gICAgICB5eXNzcCA9IHl5c3MgKyBzaXplIC0gMTsKLSAgICAgIHl5dnNwID0geXl2cyArIHNpemUgLSAxOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgeXlsc3AgPSB5eWxzICsgc2l6ZSAtIDE7Ci0jZW5kaWYKLQotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JZnByaW50ZihzdGRlcnIsICJTdGFjayBzaXplIGluY3JlYXNlZCB0byAlZFxuIiwgeXlzdGFja3NpemUpOwotI2VuZGlmCi0KLSAgICAgIGlmICh5eXNzcCA+PSB5eXNzICsgeXlzdGFja3NpemUgLSAxKQotCVlZQUJPUlQ7Ci0gICAgfQotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIGZwcmludGYoc3RkZXJyLCAiRW50ZXJpbmcgc3RhdGUgJWRcbiIsIHl5c3RhdGUpOwotI2VuZGlmCi0KLSAgZ290byB5eWJhY2t1cDsKLSB5eWJhY2t1cDoKLQotLyogRG8gYXBwcm9wcmlhdGUgcHJvY2Vzc2luZyBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZS4gICovCi0vKiBSZWFkIGEgbG9va2FoZWFkIHRva2VuIGlmIHdlIG5lZWQgb25lIGFuZCBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KLS8qIHl5cmVzdW1lOiAqLwotCi0gIC8qIEZpcnN0IHRyeSB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRob3V0IHJlZmVyZW5jZSB0byBsb29rYWhlYWQgdG9rZW4uICAqLwotCi0gIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLSAgaWYgKHl5biA9PSBZWUZMQUcpCi0gICAgZ290byB5eWRlZmF1bHQ7Ci0KLSAgLyogTm90IGtub3duID0+IGdldCBhIGxvb2thaGVhZCB0b2tlbiBpZiBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KLQotICAvKiB5eWNoYXIgaXMgZWl0aGVyIFlZRU1QVFkgb3IgWVlFT0YKLSAgICAgb3IgYSB2YWxpZCB0b2tlbiBpbiBleHRlcm5hbCBmb3JtLiAgKi8KLQotICBpZiAoeXljaGFyID09IFlZRU1QVFkpCi0gICAgewotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JZnByaW50ZihzdGRlcnIsICJSZWFkaW5nIGEgdG9rZW46ICIpOwotI2VuZGlmCi0gICAgICB5eWNoYXIgPSBZWUxFWDsKLSAgICB9Ci0KLSAgLyogQ29udmVydCB0b2tlbiB0byBpbnRlcm5hbCBmb3JtIChpbiB5eWNoYXIxKSBmb3IgaW5kZXhpbmcgdGFibGVzIHdpdGggKi8KLQotICBpZiAoeXljaGFyIDw9IDApCQkvKiBUaGlzIG1lYW5zIGVuZCBvZiBpbnB1dC4gKi8KLSAgICB7Ci0gICAgICB5eWNoYXIxID0gMDsKLSAgICAgIHl5Y2hhciA9IFlZRU9GOwkJLyogRG9uJ3QgY2FsbCBZWUxFWCBhbnkgbW9yZSAqLwotCi0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQlmcHJpbnRmKHN0ZGVyciwgIk5vdyBhdCBlbmQgb2YgaW5wdXQuXG4iKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHl5Y2hhcjEgPSBZWVRSQU5TTEFURSh5eWNoYXIpOwotCi0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICJOZXh0IHRva2VuIGlzICVkICglcyIsIHl5Y2hhciwgeXl0bmFtZVt5eWNoYXIxXSk7Ci0JICAvKiBHaXZlIHRoZSBpbmRpdmlkdWFsIHBhcnNlciBhIHdheSB0byBwcmludCB0aGUgcHJlY2lzZSBtZWFuaW5nCi0JICAgICBvZiBhIHRva2VuLCBmb3IgZnVydGhlciBkZWJ1Z2dpbmcgaW5mby4gICovCi0jaWZkZWYgWVlQUklOVAotCSAgWVlQUklOVCAoc3RkZXJyLCB5eWNoYXIsIHl5bHZhbCk7Ci0jZW5kaWYKLQkgIGZwcmludGYgKHN0ZGVyciwgIilcbiIpOwotCX0KLSNlbmRpZgotICAgIH0KLQotICB5eW4gKz0geXljaGFyMTsKLSAgaWYgKHl5biA8IDAgfHwgeXluID4gWVlMQVNUIHx8IHl5Y2hlY2tbeXluXSAhPSB5eWNoYXIxKQotICAgIGdvdG8geXlkZWZhdWx0OwotCi0gIHl5biA9IHl5dGFibGVbeXluXTsKLQotICAvKiB5eW4gaXMgd2hhdCB0byBkbyBmb3IgdGhpcyB0b2tlbiB0eXBlIGluIHRoaXMgc3RhdGUuCi0gICAgIE5lZ2F0aXZlID0+IHJlZHVjZSwgLXl5biBpcyBydWxlIG51bWJlci4KLSAgICAgUG9zaXRpdmUgPT4gc2hpZnQsIHl5biBpcyBuZXcgc3RhdGUuCi0gICAgICAgTmV3IHN0YXRlIGlzIGZpbmFsIHN0YXRlID0+IGRvbid0IGJvdGhlciB0byBzaGlmdCwKLSAgICAgICBqdXN0IHJldHVybiBzdWNjZXNzLgotICAgICAwLCBvciBtb3N0IG5lZ2F0aXZlIG51bWJlciA9PiBlcnJvci4gICovCi0KLSAgaWYgKHl5biA8IDApCi0gICAgewotICAgICAgaWYgKHl5biA9PSBZWUZMQUcpCi0JZ290byB5eWVycmxhYjsKLSAgICAgIHl5biA9IC15eW47Ci0gICAgICBnb3RvIHl5cmVkdWNlOwotICAgIH0KLSAgZWxzZSBpZiAoeXluID09IDApCi0gICAgZ290byB5eWVycmxhYjsKLQotICBpZiAoeXluID09IFlZRklOQUwpCi0gICAgWVlBQ0NFUFQ7Ci0KLSAgLyogU2hpZnQgdGhlIGxvb2thaGVhZCB0b2tlbi4gICovCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgZnByaW50ZihzdGRlcnIsICJTaGlmdGluZyB0b2tlbiAlZCAoJXMpLCAiLCB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOwotI2VuZGlmCi0KLSAgLyogRGlzY2FyZCB0aGUgdG9rZW4gYmVpbmcgc2hpZnRlZCB1bmxlc3MgaXQgaXMgZW9mLiAgKi8KLSAgaWYgKHl5Y2hhciAhPSBZWUVPRikKLSAgICB5eWNoYXIgPSBZWUVNUFRZOwotCi0gICorK3l5dnNwID0geXlsdmFsOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAqKyt5eWxzcCA9IHl5bGxvYzsKLSNlbmRpZgotCi0gIC8qIGNvdW50IHRva2VucyBzaGlmdGVkIHNpbmNlIGVycm9yOyBhZnRlciB0aHJlZSwgdHVybiBvZmYgZXJyb3Igc3RhdHVzLiAgKi8KLSAgaWYgKHl5ZXJyc3RhdHVzKSB5eWVycnN0YXR1cy0tOwotCi0gIHl5c3RhdGUgPSB5eW47Ci0gIGdvdG8geXluZXdzdGF0ZTsKLQotLyogRG8gdGhlIGRlZmF1bHQgYWN0aW9uIGZvciB0aGUgY3VycmVudCBzdGF0ZS4gICovCi15eWRlZmF1bHQ6Ci0KLSAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07Ci0gIGlmICh5eW4gPT0gMCkKLSAgICBnb3RvIHl5ZXJybGFiOwotCi0vKiBEbyBhIHJlZHVjdGlvbi4gIHl5biBpcyB0aGUgbnVtYmVyIG9mIGEgcnVsZSB0byByZWR1Y2Ugd2l0aC4gICovCi15eXJlZHVjZToKLSAgeXlsZW4gPSB5eXIyW3l5bl07Ci0gIGlmICh5eWxlbiA+IDApCi0gICAgeXl2YWwgPSB5eXZzcFsxLXl5bGVuXTsgLyogaW1wbGVtZW50IGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFjdGlvbiAqLwotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJSZWR1Y2luZyB2aWEgcnVsZSAlZCAobGluZSAlZCksICIsCi0JICAgICAgIHl5biwgeXlybGluZVt5eW5dKTsKLQotICAgICAgLyogUHJpbnQgdGhlIHN5bWJvbHMgYmVpbmcgcmVkdWNlZCwgYW5kIHRoZWlyIHJlc3VsdC4gICovCi0gICAgICBmb3IgKGkgPSB5eXByaHNbeXluXTsgeXlyaHNbaV0gPiAwOyBpKyspCi0JZnByaW50ZiAoc3RkZXJyLCAiJXMgIiwgeXl0bmFtZVt5eXJoc1tpXV0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIC0+ICVzXG4iLCB5eXRuYW1lW3l5cjFbeXluXV0pOwotICAgIH0KLSNlbmRpZgotCi0KLSAgc3dpdGNoICh5eW4pIHsKLQotY2FzZSAzOgotI2xpbmUgMjA5ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7Ci0JCSAgd3JpdGVfZXhwX2VsdF90eXBlKHl5dnNwWzBdLnR2YWwpOwotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpOwotCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA0OgotI2xpbmUgMjE4ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfSU5EKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNToKLSNsaW5lIDIyMSAibTItZXhwLnkiCi17IG51bWJlcl9zaWduID0gLTE7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY6Ci0jbGluZSAyMjMgIm0yLWV4cC55IgoteyBudW1iZXJfc2lnbiA9IDE7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX05FRyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDc6Ci0jbGluZSAyMjggIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZShVTk9QX1BMVVMpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4OgotI2xpbmUgMjMyICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTE9HSUNBTF9OT1QpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMToKLSNsaW5lIDI0MCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBUCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEyOgotI2xpbmUgMjQ0ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfT1JEKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTM6Ci0jbGluZSAyNDggIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9BQlMpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxNDoKLSNsaW5lIDI1MiAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0hJR0gpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxNToKLSNsaW5lIDI1NiAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX01JTik7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoeXl2c3BbLTFdLnR2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9NSU4pOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxNjoKLSNsaW5lIDI2MiAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX01BWCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoeXl2c3BbLTFdLnR2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9NSU4pOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxNzoKLSNsaW5lIDI2OCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0ZMT0FUKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTg6Ci0jbGluZSAyNzIgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfVkFMKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh5eXZzcFstM10udHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9WQUwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxOToKLSNsaW5lIDI3OCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NIUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDIwOgotI2xpbmUgMjgyICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfT0REKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjE6Ci0jbGluZSAyODYgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9UUlVOQyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDIyOgotI2xpbmUgMjkwICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfU0laRU9GKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjM6Ci0jbGluZSAyOTUgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZShVTk9QX1BSRUlOQ1JFTUVOVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDI0OgotI2xpbmUgMjk5ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUoQklOT1BfQVNTSUdOX01PRElGWSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlKEJJTk9QX0FERCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlKEJJTk9QX0FTU0lHTl9NT0RJRlkpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyNToKLSNsaW5lIDMwNSAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlKFVOT1BfUFJFREVDUkVNRU5UKTs7Ci0gICAgYnJlYWs7fQotY2FzZSAyNjoKLSNsaW5lIDMwOSAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlKEJJTk9QX0FTU0lHTl9NT0RJRlkpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZShCSU5PUF9TVUIpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZShCSU5PUF9BU1NJR05fTU9ESUZZKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjc6Ci0jbGluZSAzMTUgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfU1RSVUNUKTsKLQkJCSAgd3JpdGVfZXhwX3N0cmluZyAoeXl2c3BbMF0uc3ZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9TVFJVQ1QpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyOToKLSNsaW5lIDMyNCAibTItZXhwLnkiCi17IGVycm9yKCJTZXRzIGFyZSBub3QgaW1wbGVtZW50ZWQuIik7OwotICAgIGJyZWFrO30KLWNhc2UgMzA6Ci0jbGluZSAzMjggIm0yLWV4cC55IgoteyBlcnJvcigiU2V0cyBhcmUgbm90IGltcGxlbWVudGVkLiIpOzsKLSAgICBicmVhazt9Ci1jYXNlIDMxOgotI2xpbmUgMzMyICJtMi1leHAueSIKLXsgZXJyb3IoIlNldHMgYXJlIG5vdCBpbXBsZW1lbnRlZC4iKTs7Ci0gICAgYnJlYWs7fQotY2FzZSAzMjoKLSNsaW5lIDMzNSAibTItZXhwLnkiCi17IGVycm9yKCJTZXRzIGFyZSBub3QgaW1wbGVtZW50ZWQuIik7OwotICAgIGJyZWFrO30KLWNhc2UgMzM6Ci0jbGluZSAzMzcgIm0yLWV4cC55IgoteyBlcnJvcigiU2V0cyBhcmUgbm90IGltcGxlbWVudGVkLiIpOzsKLSAgICBicmVhazt9Ci1jYXNlIDM0OgotI2xpbmUgMzQ2ICJtMi1leHAueSIKLXsgc3RhcnRfYXJnbGlzdCgpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzNToKLSNsaW5lIDM0OCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChNVUxUSV9TVUJTQ1JJUFQpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSBlbmRfYXJnbGlzdCgpKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE1VTFRJX1NVQlNDUklQVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDM2OgotI2xpbmUgMzU2ICJtMi1leHAueSIKLXsgc3RhcnRfYXJnbGlzdCAoKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzc6Ci0jbGluZSAzNTggIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRlVOQ0FMTCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIGVuZF9hcmdsaXN0ICgpKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0ZVTkNBTEwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzOToKLSNsaW5lIDM2NyAibTItZXhwLnkiCi17IGFyZ2xpc3RfbGVuID0gMTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDA6Ci0jbGluZSAzNzEgIm0yLWV4cC55IgoteyBhcmdsaXN0X2xlbisrOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0MToKLSNsaW5lIDM3NiAibTItZXhwLnkiCi17IGFyZ2xpc3RfbGVuID0gMTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDI6Ci0jbGluZSAzODEgIm0yLWV4cC55IgoteyBhcmdsaXN0X2xlbisrOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0MzoKLSNsaW5lIDM4NiAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX01FTVZBTCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoeXl2c3BbLTJdLnR2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9NRU1WQUwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0NDoKLSNsaW5lIDM5MiAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHl5dnNwWy0zXS50dmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ1OgotI2xpbmUgMzk4ICJtMi1leHAueSIKLXsgOwotICAgIGJyZWFrO30KLWNhc2UgNDY6Ci0jbGluZSA0MDYgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfUkVQRUFUKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDc6Ci0jbGluZSA0MTAgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTVVMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDg6Ci0jbGluZSA0MTQgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfRElWKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDk6Ci0jbGluZSA0MTggIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfSU5URElWKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTA6Ci0jbGluZSA0MjIgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfUkVNKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTE6Ci0jbGluZSA0MjYgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQUREKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTI6Ci0jbGluZSA0MzAgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfU1VCKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTM6Ci0jbGluZSA0MzQgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfRVFVQUwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1NDoKLSNsaW5lIDQzOCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9OT1RFUVVBTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU1OgotI2xpbmUgNDQwICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX05PVEVRVUFMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTY6Ci0jbGluZSA0NDQgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTEVRKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTc6Ci0jbGluZSA0NDggIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfR0VRKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTg6Ci0jbGluZSA0NTIgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTEVTUyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU5OgotI2xpbmUgNDU2ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0dUUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDYwOgotI2xpbmUgNDYwICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xPR0lDQUxfQU5EKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjE6Ci0jbGluZSA0NjQgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTE9HSUNBTF9PUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDYyOgotI2xpbmUgNDY4ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FTU0lHTik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDYzOgotI2xpbmUgNDc1ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0JPT0wpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSB5eXZzcFswXS51bHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9CT09MKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjQ6Ci0jbGluZSA0ODEgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQk9PTCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIHl5dnNwWzBdLnVsdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0JPT0wpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2NToKLSNsaW5lIDQ4NyAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlIChidWlsdGluX3R5cGVfbTJfaW50KTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgeXl2c3BbMF0ubHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjY6Ci0jbGluZSA0OTQgIm0yLWV4cC55IgotewotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX20yX2NhcmQpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSB5eXZzcFswXS51bHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJCTsKLSAgICBicmVhazt9Ci1jYXNlIDY3OgotI2xpbmUgNTAzICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9tMl9jaGFyKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgeXl2c3BbMF0udWx2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY4OgotI2xpbmUgNTExICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0RPVUJMRSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX20yX3JlYWwpOwotCQkJICB3cml0ZV9leHBfZWx0X2RibGNzdCAoeXl2c3BbMF0uZHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9ET1VCTEUpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA3MDoKLSNsaW5lIDUyMSAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlIChidWlsdGluX3R5cGVfaW50KTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgVFlQRV9MRU5HVEggKHl5dnNwWy0xXS50dmFsKSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNzE6Ci0jbGluZSA1MjggIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTTJfU1RSSU5HKTsKLQkJCSAgd3JpdGVfZXhwX3N0cmluZyAoeXl2c3BbMF0uc3ZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9NMl9TVFJJTkcpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA3MjoKLSNsaW5lIDUzNSAibTItZXhwLnkiCi17IHl5dmFsLmJ2YWwgPSBTWU1CT0xfQkxPQ0tfVkFMVUUoeXl2c3BbMF0uc3ltKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNzM6Ci0jbGluZSA1MzkgIm0yLWV4cC55IgoteyBzdHJ1Y3Qgc3ltYm9sICpzeW0KLQkJCSAgICA9IGxvb2t1cF9zeW1ib2wgKGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCksIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywKLQkJCQkJICAgICBWQVJfTkFNRVNQQUNFLCAwLCBOVUxMKTsKLQkJCSAgeXl2YWwuc3ltID0gc3ltOzsKLSAgICBicmVhazt9Ci1jYXNlIDc0OgotI2xpbmUgNTQ4ICJtMi1leHAueSIKLXsgc3RydWN0IHN5bWJvbCAqdGVtCi0JCQkgICAgPSBsb29rdXBfc3ltYm9sIChjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpLCB5eXZzcFstMl0uYnZhbCwKLQkJCQkJICAgICBWQVJfTkFNRVNQQUNFLCAwLCBOVUxMKTsKLQkJCSAgaWYgKCF0ZW0gfHwgU1lNQk9MX0NMQVNTICh0ZW0pICE9IExPQ19CTE9DSykKLQkJCSAgICBlcnJvciAoIk5vIGZ1bmN0aW9uIFwiJXNcIiBpbiBzcGVjaWZpZWQgY29udGV4dC4iLAotCQkJCSAgIGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCkpOwotCQkJICB5eXZhbC5zeW0gPSB0ZW07Ci0JCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA3NToKLSNsaW5lIDU2MCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1ZBUl9WQUxVRSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfYmxvY2sgKE5VTEwpOwotCQkJICB3cml0ZV9leHBfZWx0X3N5bSAoeXl2c3BbMF0uc3ltKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDc3OgotI2xpbmUgNTcyICJtMi1leHAueSIKLXsgc3RydWN0IHN5bWJvbCAqc3ltOwotCQkJICBzeW0gPSBsb29rdXBfc3ltYm9sIChjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpLCB5eXZzcFstMl0uYnZhbCwKLQkJCQkJICAgICAgIFZBUl9OQU1FU1BBQ0UsIDAsIE5VTEwpOwotCQkJICBpZiAoc3ltID09IDApCi0JCQkgICAgZXJyb3IgKCJObyBzeW1ib2wgXCIlc1wiIGluIHNwZWNpZmllZCBjb250ZXh0LiIsCi0JCQkJICAgY29weV9uYW1lICh5eXZzcFswXS5zdmFsKSk7Ci0KLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7Ci0JCQkgIC8qIGJsb2NrX2ZvdW5kIGlzIHNldCBieSBsb29rdXBfc3ltYm9sLiAgKi8KLQkJCSAgd3JpdGVfZXhwX2VsdF9ibG9jayAoYmxvY2tfZm91bmQpOwotCQkJICB3cml0ZV9leHBfZWx0X3N5bSAoc3ltKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDc4OgotI2xpbmUgNTg4ICJtMi1leHAueSIKLXsgc3RydWN0IHN5bWJvbCAqc3ltOwotCQkJICBpbnQgaXNfYV9maWVsZF9vZl90aGlzOwotCi0gCQkJICBzeW0gPSBsb29rdXBfc3ltYm9sIChjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpLAotCQkJCQkgICAgICAgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrLAotCQkJCQkgICAgICAgVkFSX05BTUVTUEFDRSwKLQkJCQkJICAgICAgICZpc19hX2ZpZWxkX29mX3RoaXMsCi0JCQkJCSAgICAgICBOVUxMKTsKLQkJCSAgaWYgKHN5bSkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoc3ltYm9sX3JlYWRfbmVlZHNfZnJhbWUgKHN5bSkpCi0JCQkJewotCQkJCSAgaWYgKGlubmVybW9zdF9ibG9jayA9PSAwIHx8Ci0JCQkJICAgICAgY29udGFpbmVkX2luIChibG9ja19mb3VuZCwgCi0JCQkJCQkgICAgaW5uZXJtb3N0X2Jsb2NrKSkKLQkJCQkgICAgaW5uZXJtb3N0X2Jsb2NrID0gYmxvY2tfZm91bmQ7Ci0JCQkJfQotCi0JCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsKLQkJCSAgICAgIC8qIFdlIHdhbnQgdG8gdXNlIHRoZSBzZWxlY3RlZCBmcmFtZSwgbm90Ci0JCQkJIGFub3RoZXIgbW9yZSBpbm5lciBmcmFtZSB3aGljaCBoYXBwZW5zIHRvCi0JCQkJIGJlIGluIHRoZSBzYW1lIGJsb2NrLiAgKi8KLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfYmxvY2sgKE5VTEwpOwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9zeW0gKHN5bSk7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7Ci0JCQkgICAgICByZWdpc3RlciBjaGFyICphcmcgPSBjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpOwotCi0JCQkgICAgICBtc3ltYm9sID0KLQkJCQlsb29rdXBfbWluaW1hbF9zeW1ib2wgKGFyZywgTlVMTCwgTlVMTCk7Ci0JCQkgICAgICBpZiAobXN5bWJvbCAhPSBOVUxMKQotCQkJCXsKLQkJCQkgIHdyaXRlX2V4cF9tc3ltYm9sCi0JCQkJICAgIChtc3ltYm9sLAotCQkJCSAgICAgbG9va3VwX2Z1bmN0aW9uX3R5cGUgKGJ1aWx0aW5fdHlwZV9pbnQpLAotCQkJCSAgICAgYnVpbHRpbl90eXBlX2ludCk7Ci0JCQkJfQotCQkJICAgICAgZWxzZSBpZiAoIWhhdmVfZnVsbF9zeW1ib2xzICgpICYmICFoYXZlX3BhcnRpYWxfc3ltYm9scyAoKSkKLQkJCQllcnJvciAoIk5vIHN5bWJvbCB0YWJsZSBpcyBsb2FkZWQuICBVc2UgdGhlIFwic3ltYm9sLWZpbGVcIiBjb21tYW5kLiIpOwotCQkJICAgICAgZWxzZQotCQkJCWVycm9yICgiTm8gc3ltYm9sIFwiJXNcIiBpbiBjdXJyZW50IGNvbnRleHQuIiwKLQkJCQkgICAgICAgY29weV9uYW1lICh5eXZzcFswXS5zdmFsKSk7Ci0JCQkgICAgfQotCQkJOwotICAgIGJyZWFrO30KLWNhc2UgNzk6Ci0jbGluZSA2MzkgIm0yLWV4cC55IgoteyB5eXZhbC50dmFsID0gbG9va3VwX3R5cGVuYW1lIChjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpLAotCQkJCQkJZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrLCAwKTsgOwotICAgIGJyZWFrO30KLX0KLSAgIC8qIHRoZSBhY3Rpb24gZmlsZSBnZXRzIGNvcGllZCBpbiBpbiBwbGFjZSBvZiB0aGlzIGRvbGxhcnNpZ24gKi8KLSNsaW5lIDQ5OCAiL3N0b25lL2ppbWIvbWFpbi05OHIyL3NoYXJlL2Jpc29uLnNpbXBsZSIKLQwKLSAgeXl2c3AgLT0geXlsZW47Ci0gIHl5c3NwIC09IHl5bGVuOwotI2lmZGVmIFlZTFNQX05FRURFRAotICB5eWxzcCAtPSB5eWxlbjsKLSNlbmRpZgotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIHsKLSAgICAgIHNob3J0ICpzc3AxID0geXlzcyAtIDE7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJzdGF0ZSBzdGFjayBub3ciKTsKLSAgICAgIHdoaWxlIChzc3AxICE9IHl5c3NwKQotCWZwcmludGYgKHN0ZGVyciwgIiAlZCIsICorK3NzcDEpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICB9Ci0jZW5kaWYKLQotICAqKyt5eXZzcCA9IHl5dmFsOwotCi0jaWZkZWYgWVlMU1BfTkVFREVECi0gIHl5bHNwKys7Ci0gIGlmICh5eWxlbiA9PSAwKQotICAgIHsKLSAgICAgIHl5bHNwLT5maXJzdF9saW5lID0geXlsbG9jLmZpcnN0X2xpbmU7Ci0gICAgICB5eWxzcC0+Zmlyc3RfY29sdW1uID0geXlsbG9jLmZpcnN0X2NvbHVtbjsKLSAgICAgIHl5bHNwLT5sYXN0X2xpbmUgPSAoeXlsc3AtMSktPmxhc3RfbGluZTsKLSAgICAgIHl5bHNwLT5sYXN0X2NvbHVtbiA9ICh5eWxzcC0xKS0+bGFzdF9jb2x1bW47Ci0gICAgICB5eWxzcC0+dGV4dCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgeXlsc3AtPmxhc3RfbGluZSA9ICh5eWxzcCt5eWxlbi0xKS0+bGFzdF9saW5lOwotICAgICAgeXlsc3AtPmxhc3RfY29sdW1uID0gKHl5bHNwK3l5bGVuLTEpLT5sYXN0X2NvbHVtbjsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBOb3cgInNoaWZ0IiB0aGUgcmVzdWx0IG9mIHRoZSByZWR1Y3Rpb24uCi0gICAgIERldGVybWluZSB3aGF0IHN0YXRlIHRoYXQgZ29lcyB0bywKLSAgICAgYmFzZWQgb24gdGhlIHN0YXRlIHdlIHBvcHBlZCBiYWNrIHRvCi0gICAgIGFuZCB0aGUgcnVsZSBudW1iZXIgcmVkdWNlZCBieS4gICovCi0KLSAgeXluID0geXlyMVt5eW5dOwotCi0gIHl5c3RhdGUgPSB5eXBnb3RvW3l5biAtIFlZTlRCQVNFXSArICp5eXNzcDsKLSAgaWYgKHl5c3RhdGUgPj0gMCAmJiB5eXN0YXRlIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5c3RhdGVdID09ICp5eXNzcCkKLSAgICB5eXN0YXRlID0geXl0YWJsZVt5eXN0YXRlXTsKLSAgZWxzZQotICAgIHl5c3RhdGUgPSB5eWRlZmdvdG9beXluIC0gWVlOVEJBU0VdOwotCi0gIGdvdG8geXluZXdzdGF0ZTsKLQoteXllcnJsYWI6ICAgLyogaGVyZSBvbiBkZXRlY3RpbmcgZXJyb3IgKi8KLQotICBpZiAoISB5eWVycnN0YXR1cykKLSAgICAvKiBJZiBub3QgYWxyZWFkeSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlcG9ydCB0aGlzIGVycm9yLiAgKi8KLSAgICB7Ci0gICAgICArK3l5bmVycnM7Ci0KLSNpZmRlZiBZWUVSUk9SX1ZFUkJPU0UKLSAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLQotICAgICAgaWYgKHl5biA+IFlZRkxBRyAmJiB5eW4gPCBZWUxBU1QpCi0JewotCSAgaW50IHNpemUgPSAwOwotCSAgY2hhciAqbXNnOwotCSAgaW50IHgsIGNvdW50OwotCi0JICBjb3VudCA9IDA7Ci0JICAvKiBTdGFydCBYIGF0IC15eW4gaWYgbmVjIHRvIGF2b2lkIG5lZ2F0aXZlIGluZGV4ZXMgaW4geXljaGVjay4gICovCi0JICBmb3IgKHggPSAoeXluIDwgMCA/IC15eW4gOiAwKTsKLQkgICAgICAgeCA8IChzaXplb2YoeXl0bmFtZSkgLyBzaXplb2YoY2hhciAqKSk7IHgrKykKLQkgICAgaWYgKHl5Y2hlY2tbeCArIHl5bl0gPT0geCkKLQkgICAgICBzaXplICs9IHN0cmxlbih5eXRuYW1lW3hdKSArIDE1LCBjb3VudCsrOwotCSAgbXNnID0gKGNoYXIgKikgeG1hbGxvYyhzaXplICsgMTUpOwotCSAgaWYgKG1zZyAhPSAwKQotCSAgICB7Ci0JICAgICAgc3RyY3B5KG1zZywgInBhcnNlIGVycm9yIik7Ci0KLQkgICAgICBpZiAoY291bnQgPCA1KQotCQl7Ci0JCSAgY291bnQgPSAwOwotCQkgIGZvciAoeCA9ICh5eW4gPCAwID8gLXl5biA6IDApOwotCQkgICAgICAgeCA8IChzaXplb2YoeXl0bmFtZSkgLyBzaXplb2YoY2hhciAqKSk7IHgrKykKLQkJICAgIGlmICh5eWNoZWNrW3ggKyB5eW5dID09IHgpCi0JCSAgICAgIHsKLQkJCXN0cmNhdChtc2csIGNvdW50ID09IDAgPyAiLCBleHBlY3RpbmcgYCIgOiAiIG9yIGAiKTsKLQkJCXN0cmNhdChtc2csIHl5dG5hbWVbeF0pOwotCQkJc3RyY2F0KG1zZywgIiciKTsKLQkJCWNvdW50Kys7Ci0JCSAgICAgIH0KLQkJfQotCSAgICAgIHl5ZXJyb3IobXNnKTsKLQkgICAgICBmcmVlKG1zZyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgeXllcnJvciAoInBhcnNlIGVycm9yOyBhbHNvIHZpcnR1YWwgbWVtb3J5IGV4Y2VlZGVkIik7Ci0JfQotICAgICAgZWxzZQotI2VuZGlmIC8qIFlZRVJST1JfVkVSQk9TRSAqLwotCXl5ZXJyb3IoInBhcnNlIGVycm9yIik7Ci0gICAgfQotCi0gIGdvdG8geXllcnJsYWIxOwoteXllcnJsYWIxOiAgIC8qIGhlcmUgb24gZXJyb3IgcmFpc2VkIGV4cGxpY2l0bHkgYnkgYW4gYWN0aW9uICovCi0KLSAgaWYgKHl5ZXJyc3RhdHVzID09IDMpCi0gICAgewotICAgICAgLyogaWYganVzdCB0cmllZCBhbmQgZmFpbGVkIHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbiBhZnRlciBhbiBlcnJvciwgZGlzY2FyZCBpdC4gICovCi0KLSAgICAgIC8qIHJldHVybiBmYWlsdXJlIGlmIGF0IGVuZCBvZiBpbnB1dCAqLwotICAgICAgaWYgKHl5Y2hhciA9PSBZWUVPRikKLQlZWUFCT1JUOwotCi0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQlmcHJpbnRmKHN0ZGVyciwgIkRpc2NhcmRpbmcgdG9rZW4gJWQgKCVzKS5cbiIsIHl5Y2hhciwgeXl0bmFtZVt5eWNoYXIxXSk7Ci0jZW5kaWYKLQotICAgICAgeXljaGFyID0gWVlFTVBUWTsKLSAgICB9Ci0KLSAgLyogRWxzZSB3aWxsIHRyeSB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4KLSAgICAgYWZ0ZXIgc2hpZnRpbmcgdGhlIGVycm9yIHRva2VuLiAgKi8KLQotICB5eWVycnN0YXR1cyA9IDM7CQkvKiBFYWNoIHJlYWwgdG9rZW4gc2hpZnRlZCBkZWNyZW1lbnRzIHRoaXMgKi8KLQotICBnb3RvIHl5ZXJyaGFuZGxlOwotCi15eWVycmRlZmF1bHQ6ICAvKiBjdXJyZW50IHN0YXRlIGRvZXMgbm90IGRvIGFueXRoaW5nIHNwZWNpYWwgZm9yIHRoZSBlcnJvciB0b2tlbi4gKi8KLQotI2lmIDAKLSAgLyogVGhpcyBpcyB3cm9uZzsgb25seSBzdGF0ZXMgdGhhdCBleHBsaWNpdGx5IHdhbnQgZXJyb3IgdG9rZW5zCi0gICAgIHNob3VsZCBzaGlmdCB0aGVtLiAgKi8KLSAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07ICAvKiBJZiBpdHMgZGVmYXVsdCBpcyB0byBhY2NlcHQgYW55IHRva2VuLCBvay4gIE90aGVyd2lzZSBwb3AgaXQuKi8KLSAgaWYgKHl5bikgZ290byB5eWRlZmF1bHQ7Ci0jZW5kaWYKLQoteXllcnJwb3A6ICAgLyogcG9wIHRoZSBjdXJyZW50IHN0YXRlIGJlY2F1c2UgaXQgY2Fubm90IGhhbmRsZSB0aGUgZXJyb3IgdG9rZW4gKi8KLQotICBpZiAoeXlzc3AgPT0geXlzcykgWVlBQk9SVDsKLSAgeXl2c3AtLTsKLSAgeXlzdGF0ZSA9ICotLXl5c3NwOwotI2lmZGVmIFlZTFNQX05FRURFRAotICB5eWxzcC0tOwotI2VuZGlmCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgewotICAgICAgc2hvcnQgKnNzcDEgPSB5eXNzIC0gMTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiBzdGF0ZSBzdGFjayBub3ciKTsKLSAgICAgIHdoaWxlIChzc3AxICE9IHl5c3NwKQotCWZwcmludGYgKHN0ZGVyciwgIiAlZCIsICorK3NzcDEpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICB9Ci0jZW5kaWYKLQoteXllcnJoYW5kbGU6Ci0KLSAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotICBpZiAoeXluID09IFlZRkxBRykKLSAgICBnb3RvIHl5ZXJyZGVmYXVsdDsKLQotICB5eW4gKz0gWVlURVJST1I7Ci0gIGlmICh5eW4gPCAwIHx8IHl5biA+IFlZTEFTVCB8fCB5eWNoZWNrW3l5bl0gIT0gWVlURVJST1IpCi0gICAgZ290byB5eWVycmRlZmF1bHQ7Ci0KLSAgeXluID0geXl0YWJsZVt5eW5dOwotICBpZiAoeXluIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoeXluID09IFlZRkxBRykKLQlnb3RvIHl5ZXJycG9wOwotICAgICAgeXluID0gLXl5bjsKLSAgICAgIGdvdG8geXlyZWR1Y2U7Ci0gICAgfQotICBlbHNlIGlmICh5eW4gPT0gMCkKLSAgICBnb3RvIHl5ZXJycG9wOwotCi0gIGlmICh5eW4gPT0gWVlGSU5BTCkKLSAgICBZWUFDQ0VQVDsKLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlNoaWZ0aW5nIGVycm9yIHRva2VuLCAiKTsKLSNlbmRpZgotCi0gICorK3l5dnNwID0geXlsdmFsOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAqKyt5eWxzcCA9IHl5bGxvYzsKLSNlbmRpZgotCi0gIHl5c3RhdGUgPSB5eW47Ci0gIGdvdG8geXluZXdzdGF0ZTsKLX0KLSNsaW5lIDY0NCAibTItZXhwLnkiCi0KLQotI2lmIDAgIC8qIEZJWE1FISAqLwotaW50Ci1vdmVyZmxvdyhhLGIpCi0gICBsb25nIGEsYjsKLXsKLSAgIHJldHVybiAoTUFYX09GX1RZUEUoYnVpbHRpbl90eXBlX20yX2ludCkgLSBiKSA8IGE7Ci19Ci0KLWludAotdW92ZXJmbG93KGEsYikKLSAgIHVuc2lnbmVkIGxvbmcgYSxiOwotewotICAgcmV0dXJuIChNQVhfT0ZfVFlQRShidWlsdGluX3R5cGVfbTJfY2FyZCkgLSBiKSA8IGE7Ci19Ci0jZW5kaWYgLyogRklYTUUgKi8KLQotLyogVGFrZSBjYXJlIG9mIHBhcnNpbmcgYSBudW1iZXIgKGFueXRoaW5nIHRoYXQgc3RhcnRzIHdpdGggYSBkaWdpdCkuCi0gICBTZXQgeXlsdmFsIGFuZCByZXR1cm4gdGhlIHRva2VuIHR5cGU7IHVwZGF0ZSBsZXhwdHIuCi0gICBMRU4gaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGl0LiAgKi8KLQotLyoqKiBOZWVkcyBzb21lIGVycm9yIGNoZWNraW5nIGZvciB0aGUgZmxvYXQgY2FzZSAqKiovCi0KLXN0YXRpYyBpbnQKLXBhcnNlX251bWJlciAob2xlbikKLSAgICAgaW50IG9sZW47Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnAgPSBsZXhwdHI7Ci0gIHJlZ2lzdGVyIExPTkdFU1QgbiA9IDA7Ci0gIHJlZ2lzdGVyIExPTkdFU1QgcHJldm4gPSAwOwotICByZWdpc3RlciBpbnQgYyxpLGlzY2hhcj0wOwotICByZWdpc3RlciBpbnQgYmFzZSA9IGlucHV0X3JhZGl4OwotICByZWdpc3RlciBpbnQgbGVuID0gb2xlbjsKLSAgaW50IHVuc2lnbmVkX3AgPSBudW1iZXJfc2lnbiA9PSAxID8gMSA6IDA7Ci0KLSAgaWYocFtsZW4tMV0gPT0gJ0gnKQotICB7Ci0gICAgIGJhc2UgPSAxNjsKLSAgICAgbGVuLS07Ci0gIH0KLSAgZWxzZSBpZihwW2xlbi0xXSA9PSAnQycgfHwgcFtsZW4tMV0gPT0gJ0InKQotICB7Ci0gICAgIGJhc2UgPSA4OwotICAgICBpc2NoYXIgPSBwW2xlbi0xXSA9PSAnQyc7Ci0gICAgIGxlbi0tOwotICB9Ci0KLSAgLyogU2NhbiB0aGUgbnVtYmVyICovCi0gIGZvciAoYyA9IDA7IGMgPCBsZW47IGMrKykKLSAgewotICAgIGlmIChwW2NdID09ICcuJyAmJiBiYXNlID09IDEwKQotICAgICAgewotCS8qIEl0J3MgYSBmbG9hdCBzaW5jZSBpdCBjb250YWlucyBhIHBvaW50LiAgKi8KLQl5eWx2YWwuZHZhbCA9IGF0b2YgKHApOwotCWxleHB0ciArPSBsZW47Ci0JcmV0dXJuIEZMT0FUOwotICAgICAgfQotICAgIGlmIChwW2NdID09ICcuJyAmJiBiYXNlICE9IDEwKQotICAgICAgIGVycm9yKCJGbG9hdGluZyBwb2ludCBudW1iZXJzIG11c3QgYmUgYmFzZSAxMC4iKTsKLSAgICBpZiAoYmFzZSA9PSAxMCAmJiAocFtjXSA8ICcwJyB8fCBwW2NdID4gJzknKSkKLSAgICAgICBlcnJvcigiSW52YWxpZCBkaWdpdCBcJyVjXCcgaW4gbnVtYmVyLiIscFtjXSk7Ci0gfQotCi0gIHdoaWxlIChsZW4tLSA+IDApCi0gICAgewotICAgICAgYyA9ICpwKys7Ci0gICAgICBuICo9IGJhc2U7Ci0gICAgICBpZiggYmFzZSA9PSA4ICYmIChjID09ICc4JyB8fCBjID09ICc5JykpCi0JIGVycm9yKCJJbnZhbGlkIGRpZ2l0IFwnJWNcJyBpbiBvY3RhbCBudW1iZXIuIixjKTsKLSAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKLQlpID0gYyAtICcwJzsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoYmFzZSA9PSAxNiAmJiBjID49ICdBJyAmJiBjIDw9ICdGJykKLQkgICAgaSA9IGMgLSAnQScgKyAxMDsKLQkgIGVsc2UKLQkgICAgIHJldHVybiBFUlJPUjsKLQl9Ci0gICAgICBuKz1pOwotICAgICAgaWYoaSA+PSBiYXNlKQotCSByZXR1cm4gRVJST1I7Ci0gICAgICBpZighdW5zaWduZWRfcCAmJiBudW1iZXJfc2lnbiA9PSAxICYmIChwcmV2biA+PSBuKSkKLQkgdW5zaWduZWRfcD0xOwkJLyogVHJ5IHNvbWV0aGluZyB1bnNpZ25lZCAqLwotICAgICAgLyogRG9uJ3QgZG8gdGhlIHJhbmdlIGNoZWNrIGlmIG49PWkgYW5kIGk9PTAsIHNpbmNlIHRoYXQgc3BlY2lhbAotCSBjYXNlIHdpbGwgZ2l2ZSBhbiBvdmVyZmxvdyBlcnJvci4gKi8KLSAgICAgIGlmKFJBTkdFX0NIRUNLICYmIG4hPWkgJiYgaSkKLSAgICAgIHsKLQkgaWYoKHVuc2lnbmVkX3AgJiYgKHVuc2lnbmVkKXByZXZuID49ICh1bnNpZ25lZCluKSB8fAotCSAgICAoKCF1bnNpZ25lZF9wICYmIG51bWJlcl9zaWduPT0tMSkgJiYgLXByZXZuIDw9IC1uKSkKLQkgICAgcmFuZ2VfZXJyb3IoIk92ZXJmbG93IG9uIG51bWVyaWMgY29uc3RhbnQuIik7Ci0gICAgICB9Ci0JIHByZXZuPW47Ci0gICAgfQotCi0gIGxleHB0ciA9IHA7Ci0gIGlmKCpwID09ICdCJyB8fCAqcCA9PSAnQycgfHwgKnAgPT0gJ0gnKQotICAgICBsZXhwdHIrKzsJCQkvKiBBZHZhbmNlIHBhc3QgQixDIG9yIEggKi8KLQotICBpZiAoaXNjaGFyKQotICB7Ci0gICAgIHl5bHZhbC51bHZhbCA9IG47Ci0gICAgIHJldHVybiBDSEFSOwotICB9Ci0gIGVsc2UgaWYgKCB1bnNpZ25lZF9wICYmIG51bWJlcl9zaWduID09IDEpCi0gIHsKLSAgICAgeXlsdmFsLnVsdmFsID0gbjsKLSAgICAgcmV0dXJuIFVJTlQ7Ci0gIH0KLSAgZWxzZSBpZigodW5zaWduZWRfcCAmJiAobjwwKSkpIHsKLSAgICAgcmFuZ2VfZXJyb3IoIk92ZXJmbG93IG9uIG51bWVyaWMgY29uc3RhbnQgLS0gbnVtYmVyIHRvbyBsYXJnZS4iKTsKLSAgICAgLyogQnV0LCB0aGlzIGNhbiByZXR1cm4gaWYgcmFuZ2VfY2hlY2sgPT0gcmFuZ2Vfd2Fybi4gICovCi0gIH0KLSAgeXlsdmFsLmx2YWwgPSBuOwotICByZXR1cm4gSU5UOwotfQotCi0KLS8qIFNvbWUgdG9rZW5zICovCi0KLXN0YXRpYyBzdHJ1Y3QKLXsKLSAgIGNoYXIgbmFtZVsyXTsKLSAgIGludCB0b2tlbjsKLX0gdG9rZW50YWIyW10gPQotewotICAgIHsgeyc8JywgJz4nfSwgICAgTk9URVFVQUwgCX0sCi0gICAgeyB7JzonLCAnPSd9LCAgICBBU1NJR04JfSwKLSAgICB7IHsnPCcsICc9J30sICAgIExFUQl9LAotICAgIHsgeyc+JywgJz0nfSwgICAgR0VRCX0sCi0gICAgeyB7JzonLCAnOid9LCAgICBDT0xPTkNPTE9OIH0sCi0KLX07Ci0KLS8qIFNvbWUgc3BlY2lmaWMga2V5d29yZHMgKi8KLQotc3RydWN0IGtleXdvcmQgewotICAgY2hhciBrZXl3WzEwXTsKLSAgIGludCB0b2tlbjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qga2V5d29yZCBrZXl0YWJbXSA9Ci17Ci0gICAgeyJPUiIgLCAgIE9ST1IJIH0sCi0gICAgeyJJTiIsICAgIElOICAgICAgICAgfSwvKiBOb3RlIHNwYWNlIGFmdGVyIElOICovCi0gICAgeyJBTkQiLCAgIExPR0lDQUxfQU5EfSwKLSAgICB7IkFCUyIsICAgQUJTCSB9LAotICAgIHsiQ0hSIiwgICBDSFIJIH0sCi0gICAgeyJERUMiLCAgIERFQwkgfSwKLSAgICB7Ik5PVCIsICAgTk9UCSB9LAotICAgIHsiRElWIiwgICBESVYgICAgCSB9LAotICAgIHsiSU5DIiwgICBJTkMJIH0sCi0gICAgeyJNQVgiLCAgIE1BWF9GVU5DCSB9LAotICAgIHsiTUlOIiwgICBNSU5fRlVOQwkgfSwKLSAgICB7Ik1PRCIsICAgTU9ECSB9LAotICAgIHsiT0REIiwgICBPREQJIH0sCi0gICAgeyJDQVAiLCAgIENBUAkgfSwKLSAgICB7Ik9SRCIsICAgT1JECSB9LAotICAgIHsiVkFMIiwgICBWQUwJIH0sCi0gICAgeyJFWENMIiwgIEVYQ0wJIH0sCi0gICAgeyJISUdIIiwgIEhJR0ggICAgICAgfSwKLSAgICB7IklOQ0wiLCAgSU5DTAkgfSwKLSAgICB7IlNJWkUiLCAgU0laRSAgICAgICB9LAotICAgIHsiRkxPQVQiLCBGTE9BVF9GVU5DIH0sCi0gICAgeyJUUlVOQyIsIFRSVU5DCSB9LAotfTsKLQotCi0vKiBSZWFkIG9uZSB0b2tlbiwgZ2V0dGluZyBjaGFyYWN0ZXJzIHRocm91Z2ggbGV4cHRyLiAgKi8KLQotLyogVGhpcyBpcyB3aGVyZSB3ZSB3aWxsIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBsYW5ndWFnZSBhbmQgdGhlIG9wZXJhdG9ycyB1c2VkIGFyZQotICAgY29tcGF0aWJsZSAgKi8KLQotc3RhdGljIGludAoteXlsZXggKCkKLXsKLSAgcmVnaXN0ZXIgaW50IGM7Ci0gIHJlZ2lzdGVyIGludCBuYW1lbGVuOwotICByZWdpc3RlciBpbnQgaTsKLSAgcmVnaXN0ZXIgY2hhciAqdG9rc3RhcnQ7Ci0gIHJlZ2lzdGVyIGNoYXIgcXVvdGU7Ci0KLSByZXRyeToKLQotICB0b2tzdGFydCA9IGxleHB0cjsKLQotCi0gIC8qIFNlZSBpZiBpdCBpcyBhIHNwZWNpYWwgdG9rZW4gb2YgbGVuZ3RoIDIgKi8KLSAgZm9yKCBpID0gMCA7IGkgPCAoaW50KSAoc2l6ZW9mIHRva2VudGFiMiAvIHNpemVvZiB0b2tlbnRhYjJbMF0pIDsgaSsrKQotICAgICBpZihTVFJFUU4odG9rZW50YWIyW2ldLm5hbWUsIHRva3N0YXJ0LCAyKSkKLSAgICAgewotCWxleHB0ciArPSAyOwotCXJldHVybiB0b2tlbnRhYjJbaV0udG9rZW47Ci0gICAgIH0KLQotICBzd2l0Y2ggKGMgPSAqdG9rc3RhcnQpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSAnICc6Ci0gICAgY2FzZSAnXHQnOgotICAgIGNhc2UgJ1xuJzoKLSAgICAgIGxleHB0cisrOwotICAgICAgZ290byByZXRyeTsKLQotICAgIGNhc2UgJygnOgotICAgICAgcGFyZW5fZGVwdGgrKzsKLSAgICAgIGxleHB0cisrOwotICAgICAgcmV0dXJuIGM7Ci0KLSAgICBjYXNlICcpJzoKLSAgICAgIGlmIChwYXJlbl9kZXB0aCA9PSAwKQotCXJldHVybiAwOwotICAgICAgcGFyZW5fZGVwdGgtLTsKLSAgICAgIGxleHB0cisrOwotICAgICAgcmV0dXJuIGM7Ci0KLSAgICBjYXNlICcsJzoKLSAgICAgIGlmIChjb21tYV90ZXJtaW5hdGVzICYmIHBhcmVuX2RlcHRoID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIHJldHVybiBjOwotCi0gICAgY2FzZSAnLic6Ci0gICAgICAvKiBNaWdodCBiZSBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4gICovCi0gICAgICBpZiAobGV4cHRyWzFdID49ICcwJyAmJiBsZXhwdHJbMV0gPD0gJzknKQotCWJyZWFrOwkJCS8qIEZhbGxzIGludG8gbnVtYmVyIGNvZGUuICAqLwotICAgICAgZWxzZQotICAgICAgewotCSBsZXhwdHIrKzsKLQkgcmV0dXJuIERPVDsKLSAgICAgIH0KLQotLyogVGhlc2UgYXJlIGNoYXJhY3RlciB0b2tlbnMgdGhhdCBhcHBlYXIgYXMtaXMgaW4gdGhlIFlBQ0MgZ3JhbW1hciAqLwotICAgIGNhc2UgJysnOgotICAgIGNhc2UgJy0nOgotICAgIGNhc2UgJyonOgotICAgIGNhc2UgJy8nOgotICAgIGNhc2UgJ14nOgotICAgIGNhc2UgJzwnOgotICAgIGNhc2UgJz4nOgotICAgIGNhc2UgJ1snOgotICAgIGNhc2UgJ10nOgotICAgIGNhc2UgJz0nOgotICAgIGNhc2UgJ3snOgotICAgIGNhc2UgJ30nOgotICAgIGNhc2UgJyMnOgotICAgIGNhc2UgJ0AnOgotICAgIGNhc2UgJ34nOgotICAgIGNhc2UgJyYnOgotICAgICAgbGV4cHRyKys7Ci0gICAgICByZXR1cm4gYzsKLQotICAgIGNhc2UgJ1wnJyA6Ci0gICAgY2FzZSAnIic6Ci0gICAgICBxdW90ZSA9IGM7Ci0gICAgICBmb3IgKG5hbWVsZW4gPSAxOyAoYyA9IHRva3N0YXJ0W25hbWVsZW5dKSAhPSBxdW90ZSAmJiBjICE9ICdcMCc7IG5hbWVsZW4rKykKLQlpZiAoYyA9PSAnXFwnKQotCSAgewotCSAgICBjID0gdG9rc3RhcnRbKytuYW1lbGVuXTsKLQkgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQotCSAgICAgIHsKLQkJYyA9IHRva3N0YXJ0WysrbmFtZWxlbl07Ci0JCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKLQkJICBjID0gdG9rc3RhcnRbKytuYW1lbGVuXTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICBpZihjICE9IHF1b3RlKQotCSBlcnJvcigiVW50ZXJtaW5hdGVkIHN0cmluZyBvciBjaGFyYWN0ZXIgY29uc3RhbnQuIik7Ci0gICAgICB5eWx2YWwuc3ZhbC5wdHIgPSB0b2tzdGFydCArIDE7Ci0gICAgICB5eWx2YWwuc3ZhbC5sZW5ndGggPSBuYW1lbGVuIC0gMTsKLSAgICAgIGxleHB0ciArPSBuYW1lbGVuICsgMTsKLQotICAgICAgaWYobmFtZWxlbiA9PSAyKSAgCS8qIFNpbmdsZSBjaGFyYWN0ZXIgKi8KLSAgICAgIHsKLQkgICB5eWx2YWwudWx2YWwgPSB0b2tzdGFydFsxXTsKLQkgICByZXR1cm4gQ0hBUjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLQkgcmV0dXJuIFNUUklORzsKLSAgICB9Ci0KLSAgLyogSXMgaXQgYSBudW1iZXI/ICAqLwotICAvKiBOb3RlOiAgV2UgaGF2ZSBhbHJlYWR5IGRlYWx0IHdpdGggdGhlIGNhc2Ugb2YgdGhlIHRva2VuICcuJy4KLSAgICAgU2VlIGNhc2UgJy4nIGFib3ZlLiAgKi8KLSAgaWYgKChjID49ICcwJyAmJiBjIDw9ICc5JykpCi0gICAgewotICAgICAgLyogSXQncyBhIG51bWJlci4gICovCi0gICAgICBpbnQgZ290X2RvdCA9IDAsIGdvdF9lID0gMDsKLSAgICAgIHJlZ2lzdGVyIGNoYXIgKnAgPSB0b2tzdGFydDsKLSAgICAgIGludCB0b2t0eXBlOwotCi0gICAgICBmb3IgKCsrcCA7OyArK3ApCi0JewotCSAgaWYgKCFnb3RfZSAmJiAoKnAgPT0gJ2UnIHx8ICpwID09ICdFJykpCi0JICAgIGdvdF9kb3QgPSBnb3RfZSA9IDE7Ci0JICBlbHNlIGlmICghZ290X2RvdCAmJiAqcCA9PSAnLicpCi0JICAgIGdvdF9kb3QgPSAxOwotCSAgZWxzZSBpZiAoZ290X2UgJiYgKHBbLTFdID09ICdlJyB8fCBwWy0xXSA9PSAnRScpCi0JCSAgICYmICgqcCA9PSAnLScgfHwgKnAgPT0gJysnKSkKLQkgICAgLyogVGhpcyBpcyB0aGUgc2lnbiBvZiB0aGUgZXhwb25lbnQsIG5vdCB0aGUgZW5kIG9mIHRoZQotCSAgICAgICBudW1iZXIuICAqLwotCSAgICBjb250aW51ZTsKLQkgIGVsc2UgaWYgKCgqcCA8ICcwJyB8fCAqcCA+ICc5JykgJiYKLQkJICAgKCpwIDwgJ0EnIHx8ICpwID4gJ0YnKSAmJgotCQkgICAoKnAgIT0gJ0gnKSkgIC8qIE1vZHVsYS0yIGhleGFkZWNpbWFsIG51bWJlciAqLwotCSAgICBicmVhazsKLQl9Ci0JdG9rdHlwZSA9IHBhcnNlX251bWJlciAocCAtIHRva3N0YXJ0KTsKLSAgICAgICAgaWYgKHRva3R5cGUgPT0gRVJST1IpCi0JICB7Ci0JICAgIGNoYXIgKmVycl9jb3B5ID0gKGNoYXIgKikgYWxsb2NhIChwIC0gdG9rc3RhcnQgKyAxKTsKLQotCSAgICBtZW1jcHkgKGVycl9jb3B5LCB0b2tzdGFydCwgcCAtIHRva3N0YXJ0KTsKLQkgICAgZXJyX2NvcHlbcCAtIHRva3N0YXJ0XSA9IDA7Ci0JICAgIGVycm9yICgiSW52YWxpZCBudW1iZXIgXCIlc1wiLiIsIGVycl9jb3B5KTsKLQkgIH0KLQlsZXhwdHIgPSBwOwotCXJldHVybiB0b2t0eXBlOwotICAgIH0KLQotICBpZiAoIShjID09ICdfJyB8fCBjID09ICckJwotCXx8IChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSkpCi0gICAgLyogV2UgbXVzdCBoYXZlIGNvbWUgYWNyb3NzIGEgYmFkIGNoYXJhY3RlciAoZS5nLiAnOycpLiAgKi8KLSAgICBlcnJvciAoIkludmFsaWQgY2hhcmFjdGVyICclYycgaW4gZXhwcmVzc2lvbi4iLCBjKTsKLQotICAvKiBJdCdzIGEgbmFtZS4gIFNlZSBob3cgbG9uZyBpdCBpcy4gICovCi0gIG5hbWVsZW4gPSAwOwotICBmb3IgKGMgPSB0b2tzdGFydFtuYW1lbGVuXTsKLSAgICAgICAoYyA9PSAnXycgfHwgYyA9PSAnJCcgfHwgKGMgPj0gJzAnICYmIGMgPD0gJzknKQotCXx8IChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSk7Ci0gICAgICAgYyA9IHRva3N0YXJ0WysrbmFtZWxlbl0pCi0gICAgOwotCi0gIC8qIFRoZSB0b2tlbiAiaWYiIHRlcm1pbmF0ZXMgdGhlIGV4cHJlc3Npb24gYW5kIGlzIE5PVAotICAgICByZW1vdmVkIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gICovCi0gIGlmIChuYW1lbGVuID09IDIgJiYgdG9rc3RhcnRbMF0gPT0gJ2knICYmIHRva3N0YXJ0WzFdID09ICdmJykKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgbGV4cHRyICs9IG5hbWVsZW47Ci0KLSAgLyogIExvb2t1cCBzcGVjaWFsIGtleXdvcmRzICovCi0gIGZvcihpID0gMCA7IGkgPCAoaW50KSAoc2l6ZW9mKGtleXRhYikgLyBzaXplb2Yoa2V5dGFiWzBdKSkgOyBpKyspCi0gICAgIGlmKG5hbWVsZW4gPT0gc3RybGVuKGtleXRhYltpXS5rZXl3KSAmJiBTVFJFUU4odG9rc3RhcnQsa2V5dGFiW2ldLmtleXcsbmFtZWxlbikpCi0JICAgcmV0dXJuIGtleXRhYltpXS50b2tlbjsKLQotICB5eWx2YWwuc3ZhbC5wdHIgPSB0b2tzdGFydDsKLSAgeXlsdmFsLnN2YWwubGVuZ3RoID0gbmFtZWxlbjsKLQotICBpZiAoKnRva3N0YXJ0ID09ICckJykKLSAgICB7Ci0gICAgICB3cml0ZV9kb2xsYXJfdmFyaWFibGUgKHl5bHZhbC5zdmFsKTsKLSAgICAgIHJldHVybiBJTlRFUk5BTF9WQVI7Ci0gICAgfQotCi0gIC8qIFVzZSB0b2tlbi10eXBlIEJMT0NLTkFNRSBmb3Igc3ltYm9scyB0aGF0IGhhcHBlbiB0byBiZSBkZWZpbmVkIGFzCi0gICAgIGZ1bmN0aW9ucy4gIElmIHRoaXMgaXMgbm90IHNvLCB0aGVuIC4uLgotICAgICBVc2UgdG9rZW4tdHlwZSBUWVBFTkFNRSBmb3Igc3ltYm9scyB0aGF0IGhhcHBlbiB0byBiZSBkZWZpbmVkCi0gICAgIGN1cnJlbnRseSBhcyBuYW1lcyBvZiB0eXBlczsgTkFNRSBmb3Igb3RoZXIgc3ltYm9scy4KLSAgICAgVGhlIGNhbGxlciBpcyBub3QgY29uc3RyYWluZWQgdG8gY2FyZSBhYm91dCB0aGUgZGlzdGluY3Rpb24uICAqLwotIHsKLQotCi0gICAgY2hhciAqdG1wID0gY29weV9uYW1lICh5eWx2YWwuc3ZhbCk7Ci0gICAgc3RydWN0IHN5bWJvbCAqc3ltOwotCi0gICAgaWYgKGxvb2t1cF9wYXJ0aWFsX3N5bXRhYiAodG1wKSkKLSAgICAgIHJldHVybiBCTE9DS05BTUU7Ci0gICAgc3ltID0gbG9va3VwX3N5bWJvbCAodG1wLCBleHByZXNzaW9uX2NvbnRleHRfYmxvY2ssCi0JCQkgVkFSX05BTUVTUEFDRSwgMCwgTlVMTCk7Ci0gICAgaWYgKHN5bSAmJiBTWU1CT0xfQ0xBU1MgKHN5bSkgPT0gTE9DX0JMT0NLKQotICAgICAgcmV0dXJuIEJMT0NLTkFNRTsKLSAgICBpZiAobG9va3VwX3R5cGVuYW1lIChjb3B5X25hbWUgKHl5bHZhbC5zdmFsKSwgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrLCAxKSkKLSAgICAgIHJldHVybiBUWVBFTkFNRTsKLQotICAgIGlmKHN5bSkKLSAgICB7Ci0gICAgICAgc3dpdGNoKHN5bS0+YWNsYXNzKQotICAgICAgIHsKLSAgICAgICBjYXNlIExPQ19TVEFUSUM6Ci0gICAgICAgY2FzZSBMT0NfUkVHSVNURVI6Ci0gICAgICAgY2FzZSBMT0NfQVJHOgotICAgICAgIGNhc2UgTE9DX1JFRl9BUkc6Ci0gICAgICAgY2FzZSBMT0NfUkVHUEFSTToKLSAgICAgICBjYXNlIExPQ19SRUdQQVJNX0FERFI6Ci0gICAgICAgY2FzZSBMT0NfTE9DQUw6Ci0gICAgICAgY2FzZSBMT0NfTE9DQUxfQVJHOgotICAgICAgIGNhc2UgTE9DX0JBU0VSRUc6Ci0gICAgICAgY2FzZSBMT0NfQkFTRVJFR19BUkc6Ci0gICAgICAgY2FzZSBMT0NfQ09OU1Q6Ci0gICAgICAgY2FzZSBMT0NfQ09OU1RfQllURVM6Ci0gICAgICAgY2FzZSBMT0NfT1BUSU1JWkVEX09VVDoKLQkgIHJldHVybiBOQU1FOwotCi0gICAgICAgY2FzZSBMT0NfVFlQRURFRjoKLQkgIHJldHVybiBUWVBFTkFNRTsKLQotICAgICAgIGNhc2UgTE9DX0JMT0NLOgotCSAgcmV0dXJuIEJMT0NLTkFNRTsKLQotICAgICAgIGNhc2UgTE9DX1VOREVGOgotCSAgZXJyb3IoImludGVybmFsOiAgVW5kZWZpbmVkIGNsYXNzIGluIG0ybGV4KCkiKTsKLQotICAgICAgIGNhc2UgTE9DX0xBQkVMOgotICAgICAgIGNhc2UgTE9DX1VOUkVTT0xWRUQ6Ci0JICBlcnJvcigiaW50ZXJuYWw6ICBVbmZvcnNlZW4gY2FzZSBpbiBtMmxleCgpIik7Ci0gICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgIC8qIEJ1aWx0LWluIEJPT0xFQU4gdHlwZS4gIFRoaXMgaXMgc29ydCBvZiBhIGhhY2suICovCi0gICAgICAgaWYoU1RSRVFOKHRva3N0YXJ0LCJUUlVFIiw0KSkKLSAgICAgICB7Ci0JICB5eWx2YWwudWx2YWwgPSAxOwotCSAgcmV0dXJuIE0yX1RSVUU7Ci0gICAgICAgfQotICAgICAgIGVsc2UgaWYoU1RSRVFOKHRva3N0YXJ0LCJGQUxTRSIsNSkpCi0gICAgICAgewotCSAgeXlsdmFsLnVsdmFsID0gMDsKLQkgIHJldHVybiBNMl9GQUxTRTsKLSAgICAgICB9Ci0gICAgfQotCi0gICAgLyogTXVzdCBiZSBhbm90aGVyIHR5cGUgb2YgbmFtZS4uLiAqLwotICAgIHJldHVybiBOQU1FOwotIH0KLX0KLQotI2lmIDAJCS8qIFVudXNlZCAqLwotc3RhdGljIGNoYXIgKgotbWFrZV9xdWFsbmFtZShtb2QsaWRlbnQpCi0gICBjaGFyICptb2QsICppZGVudDsKLXsKLSAgIGNoYXIgKm5ldyA9IHhtYWxsb2Moc3RybGVuKG1vZCkrc3RybGVuKGlkZW50KSsyKTsKLQotICAgc3RyY3B5KG5ldyxtb2QpOwotICAgc3RyY2F0KG5ldywiLiIpOwotICAgc3RyY2F0KG5ldyxpZGVudCk7Ci0gICByZXR1cm4gbmV3OwotfQotI2VuZGlmICAvKiAwICovCi0KLXZvaWQKLXl5ZXJyb3IgKG1zZykKLSAgICAgY2hhciAqbXNnOwotewotICBlcnJvciAoIkEgJXMgaW4gZXhwcmVzc2lvbiwgbmVhciBgJXMnLiIsIChtc2cgPyBtc2cgOiAiZXJyb3IiKSwgbGV4cHRyKTsKLX0KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvUkVBRE1FIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NmZjNzUuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1JbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaW91cyBleGVjdXRhYmxlcyBmb3VuZCBpbiB0aGlzIHRlc3Q6Ci0KLSAgICAgICAgICAgICBCRkQgICAgICAgICAgICAgIENQVSAgICAgT2JqZmlsZQotRXhlY3V0YWJsZSAgIFRhcmdldCAgICAgICAgICAgVHlwZSAgICBUeXBlICAgICBJbmZvIGFib3V0IGNvbXBpbGF0aW9uIG1hY2hpbmUKLS0tLS0tLS0tLS0gICAtLS0tLS0gICAgICAgICAgIC0tLS0gICAgLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaTQ4Ni1lbGYgICAgIGVsZi1saXR0bGUgICAgICAgaTQ4NiAgICBFTEYgICAgICBOQ1IgMzAwMCwgL3Vzci9jY3MvQVRUL2NjCi1pODYwLWVsZiAgICAgZWxmLWJpZyAgICAgICAgICBpODYwICAgIEVMRiAgICAgIFN0cmF0dXMKLW02OGstZWxmICAgICBlbGYtYmlnICAgICAgICAgIG02OGsgICAgRUxGICAgICAgQW1pZ2EgMzAwMCBVWCwgL3Vzci9jY3MvYmluL2NjCi1tNjhrLWFvdXQgICAgYS5vdXQtbmV3c29zMyAgICBtNjhrICAgIGEub3V0ICAgIFNvbnkgTkVXUwotbTY4ay1hb3V0MiAgIGEub3V0LXN1bm9zLWJpZyAgbTY4ayAgICBhLm91dCAgICBTdW5PUyA0LjEsIGdjYyBjeWdudXMtMi4wLjEKLXNwYXJjLWFvdXQgICBhLm91dC1zdW5vcy1iaWcgIHNwYXJjICAgYS5vdXQgICAgU3VuIDQsIFN1bk9TIDQuMS4xLCBnY2MgMi4xCi1zcGFyYy1lbGYgICAgZWxmLWJpZyAgICAgICAgICBzcGFyYyAgIEVMRiAgICAgIFN1biA0LCBTb2xhcmlzIDEuMCwgZ2NjIDIuMC4yCi1taXBzLWVjb2ZmICAgZWNvZmYtYmlnbWlwcyAgICBtaXBzICAgIGVjb2ZmICAgIElSSVggNC4wLjEKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY3Jvc3Nsb2FkLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY3Jvc3Nsb2FkLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiYjdhMS4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Nyb3NzbG9hZC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1Ci0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEZyZWQgRmlzaC4gKGZuZkBjeWdudXMuY29tKQotIyBSb2IgU2F2b3llIGNoYW5nZWQgaXQgdG8gdXNlIGdkYl90ZXN0IChyb2JAY3lnbnVzLmNvbSkKLQotaWYgJHRyYWNlbGV2ZWwgdGhlbiB7Ci0Jc3RyYWNlICR0cmFjZWxldmVsCi19Ci0KLXNldCBwcm1zX2lkIDAKLXNldCBidWdfaWQgMAotCi0jIEZJWE1FOiBUaGUgY29uZmlndXJlLmluIGZvciB0aGlzIHRlc3Qgc2hvdWxkIGxvb2sgZm9yIC0td2l0aC10YXJnZXRzCi0jIGFuZCBkZWFsIGFjY29yZGluZ2x5LiAgVW50aWwgdGhhdCBoYXMgYmVlbiBkb25lLCBza2lwIHRoZSB3aG9sZSB0aGluZy4KLSMgV2l0aCBhIG1pbmltYWwgYmZkICh0aGUgZGVmYXVsdCksIGZldyBpZiBhbnkgb2YgdGhlc2UgdGVzdHMgd29yay4KLQotdmVyYm9zZSAiRklYTUU6IGFsbCB0aGUgY3Jvc3Nsb2FkIHRlc3RzIGlnbm9yZWQiCi1yZXR1cm4KLQotZm9yZWFjaCBpICJtNjhrLWVsZiBtNjhrLWFvdXQgbTY4ay1hb3V0MiBtaXBzLWVjb2ZmIGk0ODYtZWxmIHNwYXJjLWFvdXQgaTg2MC1lbGYgc3BhcmMtZWxmIiB7Ci0gICAgcmVtb3RlX2V4ZWMgYnVpbGQgImNkICR7b2JqZGlyfS8ke3N1YmRpcn0gOyB1dWRlY29kZSAke3NyY2Rpcn0vJHtzdWJkaXJ9LyRpLnUgIgotfQotCi0jIEZJWE1FOiBUaGVzZSB0ZXN0cyBkb24ndCB3b3JrIGZvciB0aGUgaTk2MCwgYmVjYXVzZQotIyBiZmQvY29uZmlnL2k5NjAtYm91dC5tdCBzZXRzIFNFTEVDVF9WRUNTLiAgSSBjb3VsZCB1c2Ugc2V0dXBfeGZhaWwKLSMgZm9yIGVhY2ggdGVzdCwgYnV0IHJlYm9vdGluZyB0aGUgYm9hcmQgYmV0d2VlbiBlYWNoIG9uZSB0YWtlcyBhIGxvbmcKLSMgdGltZSBzbyBJJ20ganVzdCBwdW50aW5nIHRoZSB3aG9sZSBmaWxlLgotaWYgW2lzdGFyZ2V0ICJpOTYwLSotKiJdIHRoZW4gewotICAgIGlmICR2ZXJib3NlPjEgdGhlbiB7Ci0Jd2FybmluZyAiRklYTUU6IGNyb3NzbG9hZCB0ZXN0IGNhc2UgZG9lc24ndCBydW4gb24gdGhlIGk5NjAuIgotICAgIH0KLSAgICBjb250aW51ZQotfQotCi0jIEZJWE1FOiBUaGVzZSB0ZXN0cyBkb24ndCB3b3JrIGZvciB0aGUgYTI5aywgYmVjYXVzZSBTRUxFQ1RfVkVDUyBpcwotIyB1c2VkIHdoZW4gY29tcGlsaW5nIGJmZC4gIEl0IHdvdWxkIGJlIG5pY2UgaWYgdGhlcmUgd2VyZSBzb21lIGJldHRlcgotIyB3YXkgb2YgZGV0ZWN0aW5nIHRoaXMgY2FzZS4KLWlmIFtpc3RhcmdldCAiYTI5ay0qLSoiXSB0aGVuIHsKLSAgICBpZiAkdmVyYm9zZT4xIHRoZW4gewotCXdhcm5pbmcgIkZJWE1FOiBjcm9zc2xvYWQgdGVzdCBjYXNlIGRvZXNuJ3QgcnVuIG9uIHRoZSBhMjlrLiIKLSAgICB9Ci0gICAgY29udGludWUKLX0KLQotIyBUZXN0IGlmIGdkYiBjYW4gYXV0b21hdGljYWxseSBkZXRlcm1pbmUgdGhlIGJmZCBmb3JtYXQgb2YgYW4KLSMgZXhlY3V0YWJsZSBhbmQgcmVhZCBpdCdzIHN5bWJvbHMuCi0KLXByb2MgYmZkZGVmYXVsdCB7fSB7Ci0gICAgZ2xvYmFsIEdEQgotICAgIGdsb2JhbCBHREJGTEFHUwotICAgIGdsb2JhbCBnZGJfcHJvbXB0Ci0gICAgZ2xvYmFsIG9iamRpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgYmluZmlsZQotICAgIGdsb2JhbCBiZmRmb3JtYXQKLSAgICBnbG9iYWwgZmlsZV9sb2FkZWQKLQotICAgIGdkYl91bmxvYWQKLSAgICBzZXQgZmlsZV9sb2FkZWQgMAotICAgIHNlbmRfZ2RiICJmaWxlICRvYmpkaXIvJHN1YmRpci8kYmluZmlsZVxuIgotICAgIGdkYl9leHBlY3QgewotCS1yZSAiQSBwcm9ncmFtIGlzIGJlaW5nIGRlYnVnZ2VkIGFscmVhZHkuICBLaWxsIGl0Lip5IG9yIG4uIiB7Ci0JICAgIHNlbmRfZ2RiICJ5XG4iCi0JICAgIGV4cF9jb250aW51ZQotCX0KLQktcmUgIlJlYWRpbmcgc3ltYm9scyBmcm9tICRvYmpkaXIvJHN1YmRpci8kYmluZmlsZVxbLlxdK2RvbmVcLi4qJGdkYl9wcm9tcHQgJCIgewotCSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgYXV0byBmb3JtYXQiCi0JfQotCS1yZSAiUmVhZGluZyBzeW1ib2xzIGZyb20gJG9iamRpci8kc3ViZGlyLyRiaW5maWxlXFsuXF0rLm5vIGRlYnVnZ2luZyBzeW1ib2xzIGZvdW5kLlxbLlxdK2RvbmVcLi4qJGdkYl9wcm9tcHQgJCIgewotCSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgYXV0byBmb3JtYXQgKGJ1dCBubyBzeW1ib2xzIGZvdW5kKSIKLQl9Ci0JLXJlICJGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZC4qJGdkYl9wcm9tcHQgJCIgewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgYXV0byBmb3JtYXQgKGZvcm1hdCBub3QgcmVjb2duaXplZCkiCi0JICAgIHJldHVybgotCX0KLQktcmUgIkZpbGUgZm9ybWF0IGlzIGFtYmlndW91cy4qJGdkYl9wcm9tcHQgJCIgewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgYXV0byBmb3JtYXQgKGZvcm1hdCBpcyBhbWJpZ3VvdXMpIgotCSAgICByZXR1cm4KLQl9Ci0JLXJlICIkZ2RiX3Byb21wdCAkIiB7Ci0JICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBhdXRvIGZvcm1hdCIKLQkgICAgcmV0dXJuCi0JfQotCXRpbWVvdXQgewotCSAgICBmYWlsICIodGltZW91dCkgJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGF1dG8gZm9ybWF0IgotCSAgICByZXR1cm4KLQl9CQotICAgIH0KLQotICAgIGlmIFtnZGJfdGVzdCAiaW5mbyB0YXJnZXQiICIuKmZpbGUgdHlwZSAkYmZkZm9ybWF0IiAiIl09PTAgdGhlbiB7Ci0Jc2V0IGZpbGVfbG9hZGVkIDEKLSAgICB9IGVsc2UgewotCWZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSB3cm9uZyBmb3JtYXQgZm91bmQiCi0gICAgfQotfQotCi0jIFRlc3QgaWYgZ2RiIGNhbiByZWFkIHN5bWJvbHMgZnJvbSBhbiBleGVjdXRhYmxlIHdoZW4gdGhlIGJmZCBmb3JtYXQKLSMgaXMgZXhwbGljaXRseSBzZXQgdmlhIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBHTlVUQVJHRVQuCi0KLXByb2MgYmZkZXhwbGljaXQge30gewotICAgIGdsb2JhbCBHREIKLSAgICBnbG9iYWwgR0RCRkxBR1MKLSAgICBnbG9iYWwgZ2RiX3Byb21wdAotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgb2JqZGlyCi0gICAgZ2xvYmFsIGRldF9maWxlCi0gICAgZ2xvYmFsIGJpbmZpbGUKLSAgICBnbG9iYWwgYmZkZm9ybWF0Ci0gICAgZ2xvYmFsIGZpbGVfbG9hZGVkCi0KLSAgICBnZGJfdW5sb2FkCi0gICAgc2V0IGZpbGVfbG9hZGVkIDAKLQotICAgICMgT25jZSBHREIgNC4xMCAodGhlIGxhc3QgdG8gbGFjayBgc2V0IGdudXRhcmdldCcpIGlzIGZvcmdvdHRlbiwKLSAgICAjIGNoYW5nZSB0aGlzIHRvIHVzZSBzZXQgZ251dGFyZ2V0LgotICAgaWYgW2dkYl90ZXN0ICJzZXQgZW52IEdOVVRBUkdFVD0kYmZkZm9ybWF0IiAiIiAiIl0hPTAgdGhlbiB7Ci0gICAgICAgZmFpbCAic2V0dGluZyBHTlVUQVJHRVQ9JGJmZGZvcm1hdCBpbiBlbnZpcm9ubWVudCIKLSAgICAgICByZXR1cm4KLSAgICB9Ci0KLSAgICBzZW5kX2dkYiAiZmlsZSAkb2JqZGlyLyRzdWJkaXIvJGJpbmZpbGVcbiIKLSAgICBnZGJfZXhwZWN0IHsKLQktcmUgIkEgcHJvZ3JhbSBpcyBiZWluZyBkZWJ1Z2dlZCBhbHJlYWR5LiAgS2lsbCBpdC4qeSBvciBuLiIgewotCSAgICBzZW5kX2dkYiAieVxuIgotCSAgICBleHBfY29udGludWUKLQl9Ci0JLXJlICJSZWFkaW5nIHN5bWJvbHMgZnJvbSAkb2JqZGlyLyRzdWJkaXIvJGJpbmZpbGVcWy5cXStkb25lXC4uKiRnZGJfcHJvbXB0ICQiIHsKLQkgICAgcGFzcyAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGV4cGxpY2l0IGZvcm1hdCIKLQl9Ci0JLXJlICJJbnZhbGlkIHRhcmdldC4qJGdkYl9wcm9tcHQgJCIgewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgZXhwbGljaXQgZm9ybWF0IChpbnZhbGlkIHRhcmdldCkiCi0JICAgIHJldHVybgotCX0KLQktcmUgIiRnZGJfcHJvbXB0ICQiIHsKLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGV4cGxpY2l0IGZvcm1hdCIKLQkgICAgcmV0dXJuCi0JfQotCXRpbWVvdXQgewotCSAgICBmYWlsICIodGltZW91dCkgJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGV4cGxpY2l0IGZvcm1hdCIKLQkgICAgcmV0dXJuCi0JfQkKLSAgICB9Ci0KLSAgICBzZXQgZmlsZV9sb2FkZWQgMQotfQotCi1wcm9jIHRlc3RfcHR5cGVfZnVuY3Rpb25zIHt9IHsKLSAgICBnbG9iYWwgZ2RiX3Byb21wdAotICAgIGdsb2JhbCBiaW5maWxlCi0gICAgZ2xvYmFsIGJmZGZvcm1hdAotICAgIGdsb2JhbCBkZXRfZmlsZQotICAgIHNlbmRfZ2RiICJwdHlwZSBtYWluXG4iCi0gICAgZ2RiX2V4cGVjdCB7Ci0JLXJlICJ0eXBlID0gaW50IFxbKShcXStcclxuJGdkYl9wcm9tcHQgJCIge30KLQl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpICRiaW5maWxlICgkYmZkZm9ybWF0KSBmdW5jdGlvbiBtYWluIiA7IHJldHVybiB9Ci0gICAgfQotCi0gICAgIyBzZXQgdXAgYSBsaXN0IG9mIGxpc3RzIG9mIGNvbW1hbmQgYW5kIHBhdHRlcm5zCi0gICAgc2V0IGNvbW1hbmQgW2xpc3QgeyAicHR5cGUgdl9jaGFyX2Z1bmMiICJ0eXBlID0oXCB1bnNpZ25lZFwgfFwgc2lnbmVkXCB8XCApY2hhciBcWykoXF0rIiB9XAotCSAgICAgICAgeyAicHR5cGUgdl9zaG9ydF9mdW5jIiAidHlwZSA9IChzaG9ydHxzaG9ydCBpbnQpIFxbKShcXSsiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfaW50X2Z1bmMiICJ0eXBlID0gaW50IFxbKShcXSsiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfbG9uZ19mdW5jIiAidHlwZSA9IChsb25nfGxvbmcgaW50fGludCkgXFspKFxdKyIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9mbG9hdF9mdW5jIiAidHlwZSA9IGZsb2F0IFxbKShcXSsiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfZG91YmxlX2Z1bmMiICJ0eXBlID0gZG91YmxlIFxbKShcXSsiIH0gXQotCi0gICAgZm9yZWFjaCBpICRjb21tYW5kIHsKLQlpZiBbZ2RiX3Rlc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDFdICIiXSB0aGVuIHsKLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIFwiW2xpbmRleCAkaSAwXVwiIGZ1bmN0aW9uIHR5cGVzIgotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotICAgIHBhc3MgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBwdHlwZSBmdW5jdGlvbiB0eXBlcyIKLX0KLQotIyBOb3RlIHRoYXQgcGxhaW4gY2hhcnMgY2FuIGJlIGVpdGhlciBzaWduZWQgb3IgdW5zaWduZWQuCi0KLXByb2MgdGVzdF9wdHlwZV9wbGFpbl90eXBlcyB7fSB7Ci0gICAgZ2xvYmFsIGdkYl9wcm9tcHQKLSAgICBnbG9iYWwgYmluZmlsZQotICAgIGdsb2JhbCBiZmRmb3JtYXQKLQotICAgICMgc2V0IHVwIGEgbGlzdCBvZiBsaXN0cyBvZiBjb21tYW5kIGFuZCBwYXR0ZXJucwotICAgIHNldCBjb21tYW5kIFtsaXN0IHsgInB0eXBlIHZfY2hhciIgInR5cGUgPShcIHVuc2lnbmVkXCB8XCBzaWduZWRcIHxcICljaGFyIiB9XAotCSAgICAgICAgeyAicHR5cGUgdl9zaG9ydCIgInR5cGUgPSBzaG9ydCIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9pbnQiICJ0eXBlID0gaW50IiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2xvbmciICJ0eXBlID0gbG9uZyIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9mbG9hdCIgInR5cGUgPSBmbG9hdCIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9kb3VibGUiICJ0eXBlID0gZG91YmxlIiB9IF0KLQotICAgIGZvcmVhY2ggaSAkY29tbWFuZCB7Ci0JaWYgW2dkYl90ZXN0IFtsaW5kZXggJGkgMF0gW2xpbmRleCAkaSAxXSAiIl0gdGhlbiB7Ci0JICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBcIltsaW5kZXggJGkgMF1cIiBwbGFpbiBDIHR5cGVzIgotCSAgICByZXR1cm4KLSAgICB9Ci0gICAgfQotICAgIHBhc3MgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBwdHlwZSBwbGFpbiBDIHR5cGVzIgotfQotCi0jIE5vdGUgdGhhdCBpZiBjb21waWxlZCB3aXRoIHByZS1BTlNJIGNvbXBpbGVycywgdGhlICJzaWduZWQiIGtleXdvcmRzIGFyZQotIyBkZWZpbmVkIGF3YXkgYW5kIHRoZSB2YXJpYWJsZXMgZGVmYXVsdCB0byBwbGFpbiB0eXBlcy4gIFNvIGFjY2VwdCBlaXRoZXIuCi0KLXByb2MgdGVzdF9wdHlwZV9zaWduZWRfdHlwZXMge30gewotICAgIGdsb2JhbCBnZGJfcHJvbXB0Ci0gICAgZ2xvYmFsIGJpbmZpbGUKLSAgICBnbG9iYWwgYmZkZm9ybWF0Ci0gICAgZ2xvYmFsIGRldF9maWxlCi0KLSAgICAjIHNldCB1cCBhIGxpc3Qgb2YgbGlzdHMgb2YgY29tbWFuZCBhbmQgcGF0dGVybnMKLSAgICBzZXQgY29tbWFuZCBbbGlzdCB7ICJwdHlwZSB2X3NpZ25lZF9jaGFyIiAidHlwZSA9KFwgc2lnbmVkXCB8XCApY2hhciIgfVwKLQkgICAgICAgIHsgInB0eXBlIHZfc2lnbmVkX3Nob3J0IiAgInR5cGUgPShcIHNpZ25lZFwgfFwgKXNob3J0IiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X3NpZ25lZF9pbnQiICJ0eXBlID0oXCBzaWduZWRcIHxcIClpbnQiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfc2lnbmVkX2xvbmciICJ0eXBlID0oXCBzaWduZWRcIHxcIClsb25nIiB9IF0KLQotICAgIGZvcmVhY2ggaSAkY29tbWFuZCB7Ci0JaWYgW2dkYl90ZXN0IFtsaW5kZXggJGkgMF0gW2xpbmRleCAkaSAxXSAiIl0gdGhlbiB7Ci0JICAgIGlmIFtleHByIFtzdHJpbmcgbWF0Y2ggImVjb2ZmLWJpZ21pcHMiICRiZmRmb3JtYXRdK1tzdHJpbmcgbWF0Y2ggInB0eXBlIHZfc2lnbmVkX2NoYXIiIFtsaW5kZXggJGkgMF1dXT09MiB0aGVuIHsKLQkJc2V0dXBfeGZhaWwgIiotKi0qIgotCSAgICB9Ci0JICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBcIltsaW5kZXggJGkgMF1cIiBzaWduZWQgQyB0eXBlcyIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgcHR5cGUgc2lnbmVkIEMgdHlwZXMiCi19Ci0KLXByb2MgdGVzdF9wdHlwZV91bnNpZ25lZF90eXBlcyB7fSB7Ci0gICAgZ2xvYmFsIGdkYl9wcm9tcHQKLSAgICBnbG9iYWwgYmluZmlsZQotICAgIGdsb2JhbCBiZmRmb3JtYXQKLSAgICBnbG9iYWwgZGV0X2ZpbGUKLQotICAgICMgc2V0IHVwIGEgbGlzdCBvZiBsaXN0cyBvZiBjb21tYW5kIGFuZCBwYXR0ZXJucwotICAgIHNldCBjb21tYW5kIFtsaXN0IHsgInB0eXBlIHZfdW5zaWduZWRfY2hhciIgInR5cGUgPSB1bnNpZ25lZCBjaGFyIiB9XAotCSAgICAgICAgeyAicHR5cGUgdl91bnNpZ25lZF9zaG9ydCIgXAotCQkgICJ0eXBlID0gKHVuc2lnbmVkIHNob3J0fHNob3J0IHVuc2lnbmVkIGludCkiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfdW5zaWduZWRfaW50IiAidHlwZSA9IHVuc2lnbmVkIGludCIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl91bnNpZ25lZF9sb25nIiBcCi0JCSAgInR5cGUgPSAodW5zaWduZWQgbG9uZ3xsb25nIHVuc2lnbmVkIGludCkiIH0gXQotCi0gICAgZm9yZWFjaCBpICRjb21tYW5kIHsKLQlpZiBbZ2RiX3Rlc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDFdICIiXSB0aGVuIHsKLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIFwiW2xpbmRleCAkaSAwXVwiIHVuc2lnbmVkIEMgdHlwZXMiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0gICAgcGFzcyAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIHB0eXBlIHVuc2lnbmVkIEMgdHlwZXMiCi19Ci0KLSMgTm90ZSB0aGF0IHBsYWluIGNoYXJzIGNhbiBiZSBlaXRoZXIgc2lnbmVkIG9yIHVuc2lnbmVkLgotCi1wcm9jIHRlc3RfcHR5cGVfYXJyYXlfdHlwZXMge30gewotICAgIGdsb2JhbCBnZGJfcHJvbXB0Ci0gICAgZ2xvYmFsIGJpbmZpbGUKLSAgICBnbG9iYWwgYmZkZm9ybWF0Ci0gICAgZ2xvYmFsIGRldF9maWxlCi0KLSAgICAjIHNldCB1cCBhIGxpc3Qgb2YgbGlzdHMgb2YgY29tbWFuZCBhbmQgcGF0dGVybnMKLSAgICBzZXQgY29tbWFuZCBbbGlzdCB7ICJwdHlwZSB2X2NoYXJfYXJyYXkiICJ0eXBlID0oXCB1bnNpZ25lZFwgfFwgc2lnbmVkXCB8XCApY2hhciBcXFxbMlxcXF0iIH1cCi0JICAgICAgICB7ICJwdHlwZSB2X3Nob3J0X2FycmF5IiAgXAotCQkgICJ0eXBlID0gKHNob3J0fHNob3J0IGludCkgXFxcWzJcXFxdIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2ludF9hcnJheSIgInR5cGUgPSBpbnQgXFxcWzJcXFxdIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2xvbmdfYXJyYXkiICJ0eXBlID0gKGxvbmd8bG9uZyBpbnQpIFxcXFsyXFxcXSIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9mbG9hdF9hcnJheSIgInR5cGUgPSBmbG9hdCBcXFxbMlxcXF0iIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfZG91YmxlX2FycmF5IiAidHlwZSA9IGRvdWJsZSBcXFxbMlxcXF0iIH0gXQotCi0gICAgZm9yZWFjaCBpICRjb21tYW5kIHsKLQlpZiBbZ2RiX3Rlc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDFdICIiXSB0aGVuIHsKLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIFwiW2xpbmRleCAkaSAwXVwiIEMgYXJyYXkgdHlwZXMiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0gICAgcGFzcyAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIHB0eXBlIEMgYXJyYXkgdHlwZXMiCi19Ci0KLXByb2MgdGVzdF9wdHlwZV9wb2ludGVyX3R5cGVzIHt9IHsKLSAgICBnbG9iYWwgZ2RiX3Byb21wdAotICAgIGdsb2JhbCBiaW5maWxlCi0gICAgZ2xvYmFsIGJmZGZvcm1hdAotICAgIGdsb2JhbCBkZXRfZmlsZQotCi0gICAgIyBzZXQgdXAgYSBsaXN0IG9mIGxpc3RzIG9mIGNvbW1hbmQgYW5kIHBhdHRlcm5zCi0gICAgc2V0IGNvbW1hbmQgW2xpc3QgeyAicHR5cGUgdl9jaGFyX3BvaW50ZXIiICJ0eXBlID0oXCB1bnNpZ25lZFwgfFwgc2lnbmVkXCB8XCApY2hhciBcKiIgfVwKLQkgICAgICAgIHsgInB0eXBlIHZfc2hvcnRfcG9pbnRlciIgICJ0eXBlID0gKHNob3J0fHNob3J0IGludCkgXCoiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfaW50X3BvaW50ZXIiICJ0eXBlID0gaW50IFwqIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2xvbmdfcG9pbnRlciIgInR5cGUgPSAobG9uZ3xsb25nIGludCkgXCoiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfZmxvYXRfcG9pbnRlciIgInR5cGUgPSBmbG9hdCBcKiIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9kb3VibGVfcG9pbnRlciIgInR5cGUgPSBkb3VibGUgXCoiIH0gXQotCi0gICAgZm9yZWFjaCBpICRjb21tYW5kIHsKLQlpZiBbZ2RiX3Rlc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDFdICIiXSB0aGVuIHsKLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIFwiW2xpbmRleCAkaSAwXVwiIEMgcG9pbnRlciB0eXBlcyIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgcHR5cGUgQyBwb2ludGVyIHR5cGVzIgotfQotCi1wcm9jIGxvYWRhbmR0ZXN0IHsgYXJncyB9IHsKLSAgICBnbG9iYWwgdmVyYm9zZQotICAgIGdsb2JhbCBHREIKLSAgICBnbG9iYWwgR0RCRkxBR1MKLSAgICBnbG9iYWwgZ2RiX3Byb21wdAotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgb2JqZGlyCi0gICAgZ2xvYmFsIGJpbmZpbGUKLSAgICBnbG9iYWwgYmZkZm9ybWF0Ci0gICAgZ2xvYmFsIGZpbGVfbG9hZGVkCi0KLSAgICBzZXQgYmluZmlsZSBbIGxpbmRleCAkYXJncyAwIF0KLSAgICBzZXQgYmZkZm9ybWF0IFsgbGluZGV4ICRhcmdzIDEgXQotICAgIHNldCBmaXhtZSBbIGxpbmRleCAkYXJncyAyIF0KLQotICAgIGlmICFbZmlsZSBleGlzdHMgJG9iamRpci8kc3ViZGlyLyRiaW5maWxlXSB0aGVuIHsKLSAgICAgICAgcGVycm9yICIkb2JqZGlyLyRzdWJkaXIvJGJpbmZpbGUgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuIDAKLSAgICB9Ci0gICAgZ2RiX2V4aXQKLSAgICBnZGJfc3RhcnQKLSAgICBpZiAkZml4bWUgdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQotICAgIGJmZGRlZmF1bHQKLSAgICBpZiAkZml4bWUgdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggJGJmZGZvcm1hdCAiZWxmLWJpZyJdIHRoZW4gewotCWlmIFtzdHJpbmcgbWF0Y2ggJGJpbmZpbGUgImk4NjAtZWxmIl0gdGhlbiB7Ci0JICAgIHNldHVwX3hmYWlsICIqLSotKiIKLQl9Ci0gICAgfQotICAgIGJmZGV4cGxpY2l0Ci0gICAgaWYgJGZpbGVfbG9hZGVkPT0xIHRoZW4gewotCXRlc3RfcHR5cGVfZnVuY3Rpb25zCi0gICAgICAgIGlmICRmaXhtZSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9Ci0JdGVzdF9wdHlwZV9wbGFpbl90eXBlcwotICAgICAgICBpZiAkZml4bWUgdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQotCXRlc3RfcHR5cGVfc2lnbmVkX3R5cGVzCi0gICAgICAgIGlmICRmaXhtZSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9Ci0JdGVzdF9wdHlwZV91bnNpZ25lZF90eXBlcwotICAgICAgICBpZiAkZml4bWUgdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQotCXRlc3RfcHR5cGVfYXJyYXlfdHlwZXMKLSAgICAgICAgaWYgJGZpeG1lIHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KLQl0ZXN0X3B0eXBlX3BvaW50ZXJfdHlwZXMKLSAgICB9Ci19Ci0KLSMgUnVuIHRlc3RzIGZvciBlYWNoIG9mIHRoZSB0ZXN0IGV4ZWN1dGFibGVzLgotIyBJZiB0aGUgdGhpcmQgYXJndW1lbnQgaXMgMSwgdGhlIHRlc3RzIHdpbGwgYmUgZXhwZWN0ZWQgdG8gZmFpbC4KLSMgV2Ugc2hvdWxkIGV4dHJhY3QgdGhlIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSB0ZXN0cyBhbmQgYmZkIGZvcm1hdHMKLSMgZnJvbSB0aGUgbWFrZWZpbGUgb3Igc29tZSBvdGhlciBjb250cm9sIGZpbGUgKEZJWE1FKS4KLQotbG9hZGFuZHRlc3QgbTY4ay1lbGYJImVsZjMyLW02OGsiCQkwCi0KLSMgSSdtIGdldHRpbmcgYW4gWFBBU1MgZm9yIGV4cGxpY2l0IGZvcm1hdCBvbiB0aGlzIG9uZQotbG9hZGFuZHRlc3QgbTY4ay1hb3V0CSJhLm91dC1uZXdzb3MzIgkJMQotCi1sb2FkYW5kdGVzdCBtNjhrLWFvdXQyCSJhLm91dC1zdW5vcy1iaWciCTAKLWxvYWRhbmR0ZXN0IG1pcHMtZWNvZmYJImVjb2ZmLWJpZ21pcHMiCQkwCi1sb2FkYW5kdGVzdCBpNDg2LWVsZgkiZWxmMzItaTM4NiIJCTAKLWxvYWRhbmR0ZXN0IHNwYXJjLWFvdXQJImEub3V0LXN1bm9zLWJpZyIJMAotbG9hZGFuZHRlc3Qgc3BhcmMtZWxmCSJlbGYzMi1zcGFyYyIJCTAKLQotI0ZJWE1FOiAgaTg2MCBzdXBwb3J0IGlzIHVubGlrZWx5IHRvIGJlIHdvcmtpbmcgaW4gdGhlIG5lYXIgZnV0dXJlCi0jIHNvIHN1cHByZXNzIHRoaXMgdGVzdCB1bnRpbCBpdCBpcyB3b3JraW5nLiAgLWZuZgotI2xvYWRhbmR0ZXN0IGk4NjAtZWxmCSJlbGYzMi1pODYwIgkJMAotCi1nZGJfdGVzdCAic2V0IGdudXRhcmdldCBhdXRvIiAiIgpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9pNDg2LWVsZi51IGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9pNDg2LWVsZi51CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODIzMzhiLi4wMDAwMDAwCi0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvaTQ4Ni1lbGYudQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi1iZWdpbiA3NzcgaTQ4Ni1lbGYKLU0/VDUsMUAkISAwICAgICAgICAgICAgKCAgUCAhICAgIFcoKCQiIzAgICAhXCtAICAgICAgICMwICggICUKLU0gIkAgJTAgMSAgOCAgICBUICAgIC0oICQiICAgICAiQCAgICBIICAgICA0ICAgICAgICAgIFAgICAtMCAKLU0gICAgICAgICAgICAgISwgICAgICAgICAhICAgICAgICAgICEgICAgLSAgICAjMiAhIEAgICAgICogOCAKLU0gIkAmICAgJSAgICAgISAgICAkICAgITwhQCAgNyk4JCIgICAgICI0ICAgIDIgKCAgIDwgICAgICQgICAKLU0gQCAgICggJiAgIiBFQDAoICAgICAnICAgICAgICAgICFQICAgICAgICAgTz03LVIrVlFJOEJdTDo2KUMKLU0rRy1PK0MkICAgLCAgICAsICAgICFAICAgIEwgICAgKiAgICAgICAgICAgICAgICEgICAgICAgICAgKCAKLU0gICAkICAgICAgICAgIDQgICAgIyAgICAiICAgICBEICAgICcgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICQgICAiPEBAMCgnICAgICEoICAgICogICAgSSlAJCIgICAgICAxIC8nXyNQICAgJiI2ISBAJCAgICAKLU0kMCArICFAICAgITxBQDAoICAgICAhJCBcP1w/ICAgIEsoKCQiJCAgICAgMiAgICApQCAgIC8iNiEgQCAKLU0gICAgJDAjUV9SVCAgICMsQEAwKCAgICAgISggICAgUiAgICAvKDgkIiAwICAgIDEgIEggL1AgICArUiIKLU0hIEAgICAgICRAICAgJEQgICAhREVAMCggICAgICEkIFw/XT8gICAgQCk4JCIgICAgICAxIC8nXyAlXUMKLU07JjVBO0c1UCAlXUU7RjAgN1Y1Tj1GRVI7VlggN1Y1VDk3QVQgJiVUOTdBST0gIT85NjFBPSYkIDk3QUkKLU09ICE/OyZFQjdXOUU8Ry1JO1ZYIDdVXUY8Jy1UODcpVCAlXSczJF0iMDRRPzNUOSY0VDU0N1UxITBEUSUKLU03UCE/MSVFLjA0VSkwUCBPPTctUitWUUk4Ql1MOjYpQytHLU8rQyQgICciNiEgQCcgMCAgPSk4JCIgPCUKLU0gICFYRUAwKCFQRCAgJ1I2ISBAJyFQICBQUCAgIC9cVTopOCQiL1xFOyk4JCIgICAgICNfKTciNiEgQUgKLU0gICAgIC5HQF9fX19fUjVURUAwKDogQCAgICNJVC9fX19fXEU+KTgkIiZAMCAgICBaPCNfX19fXyk3UjYKLU0hIEFIJiAgICAuRlBfX19fOkAhSiAoT0w0S0I8QEAwKEE8IVQjNkI8QEAwKForO19fX14jUSAyWEApOCQKLU0iKDcgPSA3SEk/X19fVkBYQUAwKFopT19fX14rMTBCLTUoNDBCMTVARUAwKDRIVTUjJSkwWiVfX19fX0gKLU1DT19fX15AISAwICBAXDAsNC5CMF9fX186QCJYIDAgICApSCAgICAgIVAjVFBeTCYsXCNLICxHIzU4T0wKLU1aXzYwRCkjSyFDLyBaUCMpUFU2K1suT1VEKSIwWlA4U1AuTCBSPC01Ql5TS105IjBELkwmLFwjSyAsRyMKLU01OE9MWl82MEQpI0shQy8gWlAjKVBVNitbLk9VRCkiMFpQOFNQLkwgUjwtNUJeU0tdOSIwRC5MJixcI0sKLU0gLEcjNThPTFpfNjBEKSNLIUMvIFpQIylQVTYrWy5PVUQpIjBaUDhTUC5MIFI8LTVCXlNLXTkiMEQuTCYKLU0sXCNLICxHIzU4T0xaXzYwRCkjSyFDLyBaUCMpUFU2K1suT1VEKSIwWlA4U1AuTCBSPC01Ql5TS105IjAKLU1ELkwqVzA1IEFAMChaUCMpUFU2K1suT1FEKSIwWlBLPSE0QiYhIENLICxHIzU4T0xaXyYwRCkjSVxQJCAKLU0gKSMmIT9CNyEgQCBRQDVURVAwKCA8OCUuSTwkIiApRlFQNUxFUDAoIFAhRlFQNTxFUDAoISAhRlFQNCQKLU1FUDAoITAjJyExIjchIEAmICAgIFFQN1BFQDAoIVAgICAsPCVdKTgkIiBAICAgIychNkI3ISBAKSAgICAKLU1RUDdcRUAwKCJAICAgLDwlPik8JCIgTCAgICJBNCg4JCIqLFxFUDAoSDVCJiEgQkMjKTwkIiolNEFAMCgKLU1IUEI3ISBCQF4pPCQiKis0RVAwKEgnMjchIEJCLik8JCIqIFpFUDAoSE9CNiEgQUZINlI3ISBBRkhXUjcKLU0hIEFGSDVSNyEgQUZIVEI3ISBBRkgwMjchIEFGSFgiNyEgQkEkKTwkIiosPEVQMChIPyI2ISBCQ0MpPCQKLU0iKidURUAwKEhVIjchIEJBOik8JCIqL1BFUDAoSD9SNiEgQkMwKTwkIiolWEVQMChIViI3ISBCQS8pPCQKLU0iKi9ARVAwKEgwUjchIEJDKyk8JCIqJChFUDAoSFJCNyEgQychODI3ISBDWEVQMChRUDdMRVAwKD0pPCQKLU0iLDwlQik8JCIjSjchIEMnIT5CNyEgQUxFUDAoUVA2PEVQMCg3KTwkIiw8JSApPCQiIDI3ISBDJyE0UjcKLU0hIEAwRVAwKFFQNjRFUDAoXCk4JCIsPCU2KTwkIi8yNiEgQychNyI3ISBBSEVQMChRUDc8RVAwKF8pOCQKLU0iLDwlJik8JCInQjchIEMnIT1CNyEgQFxFUDAoUVA2QEVQMCgiKTwkIiw8JSkpPCQiICggICAjJyExMjcKLU0hIEAiICAgIFFQNjBGIDAoIDAgICAsPCVfKTwkIiAkICAgIkFGKTwkIiosIEYgMCg5SiY8RiAwKDlKLjQKLU1GIDAoUjwtNUJeU0khT1tfX1kgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsQSIKLU0gICAgICAgIDo0ICAgICAgICAgICAoIjYhIEAgICAgICAgICAgKioiISBCUkBAMChQSCgkIi0qIiEgQCEKLU0gICAgOiAgICAgUCAgICIoQEAwKCMwICAgI0ImISBAJCAgICBaKCAkIiA0ICAgI0xAMDAoIUAgICAiUiEKLU0hIEAqICAgID5QICAgIEwgICAgMCAgICAlMCAgICAgICAgICMgICAgOSk4JCIgKCAgICBAICAgICUgICAKLU0gISQgICAgNyAgICA6KCgkIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQgICAgICAgICAKLU0gICAgICAwIFw/XCAgICAgVSggJCIgICAgICAjICAkICAgICAgLkIgISBAICAgICAgUCAiICAgICAgIEwKLU1AMDAoICAgICAgLCAgUCAgICAgIFsoJCQiICAgICAgIyAgMCAgICAgICZCIiEgQCAgICAgIFAgJSAgICAKLU0gICIoQEAwKCAgICAgICwgIUAgICAgICBDKCgkIiAgICAgICMgIDwgICAgICAtUiIhIEAgICAgICBQICgKLU0gICAgICAgWEFAMCggICAgICAsICIwICAgICAgLyg4JCIgICAgICAjICBIICAgICAgJVI2ISBAICAgICAKLU0gUCArICAgICAgIURFQDAoICAgICAgLCAjICAgICAgIEApOCQiICAgICAgIyAgVCAgICAgIC8iNiEgQCAKLU0gICAgIFAgLiAgICAgICAgICAgICAgICAgICwgI1AgICAgICAgICAgICAgICAgICMgISAgICAgICAgICAKLU0gICAgICAgICBQIDEgICAgICAgICAgICAgICAgICAsICRAICAgICAgICAgICAgICAgICAjICEsICAgICAKLU0gICAgICAgICAgICAgUCA0ICBIICAgICAgICAgICAgICAgMCBcP1wxICAgICAgICAgICAgICAgJCAvJ18KLU0mICAgICAgICAgICAgICAgISAjUV9SMCAgICAgICAgICAgICAgIDAgXD9cTCAgICAgICAgICAgICAgICQKLU0gLydfLUAgICAgICAgICAgICAgICEgI1FfU1QgICAhLEBQMCgjMCAgICEoICIgISkgICAgXCk4JCIgMCAKLU0gICAxICBYIDVAICAgLzI2ISBAJCAgICAkMCAuICY0ICAgIFhBQDAoICAgICAhKCAiMCFLICAgIF4pOCQKLU0iICggICAgMSAgWCBAMCAgICMyJCEgQCEgQCAgJEAgKCAoOCAgICNcRUAwKCEgICAgISQgI0AiNCAgICAKLU0gKTwkIiAwICAgIDEgIFggSzAgICApUiIhIEA8ICAgICRAICAgKzggICAiREYgMCggICAgICEkIFw/XlsKLU0gICAgISk8JCIgKCAgICAxICBYIFMgICAgKVIjISBALSAgICAkQCAoIC4oICAgIChFUDAoIiAgICAhJCAKLU0jQCNLICAgICQpPCQiIDAgICAgMSAgWCBcMCAgIC1SIiEgQCAgICAgJEAgKCAvQCAgICA0RVAwKCEgICAKLU0gISQgI0AgIyAwICA4KTgkIiAwICAgIDEgIEwgIyAkICAhQjchIEAkICAgICQwIC4gIjAhICAgPEVQMCgKLU0iICAgICEkICNAIFAgMCAgKSk8JCIgMCAgICAxICBYIC4gJCAgJVIjISBALSAgICAkQCAoICRMISAgIEgKLU1FUDAoJCAgICAhJCAjQCE6IDAgIDcoOCQiICAgICAgMSAvJ184MCQgICNCNyEgQCIgICAgJDAgLiAnNCEKLU0gICBaRVAwKCAwICAgISQgI0AiJSAwICAvKTwkIiAwICAgIDEgIFggQzAkICAkIjchIEAoICAgICQwIC4KLU0gKiQhICAiTEBAMCgwICAgICEoICAgIkggMCAgOCk4JCIgMCAgICBBICBMIEwgJCAgLVIjISBALSAgICAKLU0kQCAoICtQISAgI1xAUDAoIzAgICAhKCAiICMxIDAgIDIpPCQiIDAgICAgMSAgWCBZQCQgICRSNyEgQCQKLU0gICAgJDAgLiAvMCEgICNQRUAwKCAgICAgISQgXD9fWyAwICA/KCwkIiBUICAgIDIgIEAgIiAoICAlIjcKLU0hIEAoICAgICQwIC4gIVQiICAhOEVQMCghICAgICEkICNAIFQgQCAgSygsJCIgVCAgICAyICBAIC9QKCAKLU0gJVI3ISBAIiAgICAkMCAuICRYIiAgICxBIDAoJDAgICAhKCAiICE7IEAgIFMoKCQiICAgICAgMiAgICAKLU04ICggICYiNyEgQCggICAgJDAgLiAnOCIgICFIRVAwKCEgICAgISQgI0AhXSBAICA7KTwkIiAoICAgIDEKLU0gIFggQTAoICAnIjchIEAkICAgICQwIC4gKTAiICAhVEVQMCggMCAgICEkICNAIkIgQCAgPik8JCIgMCAKLU0gICAxICBYIExAKCAgJ1I3ISBAJCAgICAkMCAuICwgIiAgIiBFUDAoISAgICAhJCAjQCM3IEAgIC8oOCQKLU0iIDAgICAgMSAgSCBZICggICROIyEgQCAgICAgJEAgKCAuUCIgICIkRVAwKCEgICAgISQgI0AjWyBAICAKLU1CKTwkIiAwICAgIDEgIFggJFAsICAoUjchIEAoICAgICQwIC4gIjgjICAiXEBAMCggICAgICEoICAgIFAKLU0gUCAgRSk8JCIgMCAgICAxICBYIDEwLCAgKUI3ISBAJCAgICAkMCAuICRQIyAgIURFQDAoICAgICAhJCAKLU1cP11CIFAgIEcpPCQiIDAgICAgMSAgWCA+MCwgICoiNyEgQCQgICAgJDAgLiAoSCMgICE8RUAwKCEgICAKLU0gISQgIlAiPCBQICBJKTwkIiFAICAgIDEgIFggSUAsICArUjchIEA4ICAgICQwIC4gKyAjICAjNEVQMCgKLU0gQCAgICEkICNAIl0gUCAgVik8JCIgMCAgICAxICBYIFMwLCAgLVI3ISBAJCAgICAkMCAuIC4sIyAgIEAKLU1BIDAoJDAgICAhKCAiICNRIFAgIE8oLCQiIFQgICAgMiAgQCAgUDAgICgiNiEgQCAgICAgJDAjUV9QUCQKLU0gICNARVAwKCIgICAgISQgI0AgOiEgICBaKTwkIiAwICAgIDEgIFggKkAwICAuUiMhIEAtICAgICRAICgKLU0gI1QkICAjTEVQMCghICAgICEkICNAITMhICAgXCk8JCIgQCAgICAxICBYIDggMCAgKEIiISBAICAgICAKLU0kQCAmICY4JCAgI1hFUDAoIDAgICAhJCAjQCFNISAgIF8pPCQiIDAgICAgMSAgWCA9MDAgICZSIyEgQC0KLU0gICAgJEAgKCAoSCQgICAgRiAwKEQgICAgISQgI0AiMSEgICBDKCwkIiBUICAgIDIgIEAgSTAwICApIjgKLU0hIEAkICAgICQwIC4gKlwkICAiNEYgMCgiICAgICEkICNAIlghICAgUygsJCIgVCAgICAyICBAIFMgMCAKLU0gKVI4ISBAKCAgICAkMCAuICAhSS0jQFYrRjVMOUAhQzxHMFErRywgOFcpVDoyWVMgJzlBOyc1RTxSVTgKLU09IllDICY9RDhGVUUrRiwgPFZBPzkmJVQ4MllDICYtUj0mWE48UCFWN1YtSDg3KT85RzVOOFAhVjdXLUkKLU05VllFOSVdSTtHMCA9RV1VO0ctSTlWWUU5JV1JO0cwIDdWOUk7RkQgPUVdVTtHLUk5VllFOSVdQzomJVIKLU03ViVSPEYlWSAmVUE6NlggPUVdUzo2PU45NjE/OyZdTjlQIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdXIU8KLU06NllUOTcoIDdWLUw5NiVOPTcgIDdWNU45ICFWN1c1TjxWRUc7RjVEN1ctSDtXKVQgJzk/PTZZUzo2PU4KLU05NjE/PFZBTzxHMT85RzVOOFAhVjdWMU89NilMOTAhVjdWRU49ICE/PFcxQTxHMCA7Rl1OPCcpSTs2JVIKLU0+MCE/OTZZVjo3KU87QCFWN1c1TjxWRUc7RjVEN1ZRTztGPT88Jl1JO0cxRTxAIVY3VkVOPSVdQTxHKUEKLU0+MCFQPEZFTTg3KVkgJzk/PFZFRztGNUQ3Vi1IODcpPzlHNU44UCFWN1YxTz02KUw5NV1BPEcpQT4wIT8KLU05NzFFPicwID1FXVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4wIVY3VzVOPFZFRztGNUQ3Vi1IODcoID1FXUYKLU07Jl1BPSAhVjdXLUk5VllFOSVdTDtWWUc3ViVSPEYlWSAmJVQ5N0FJPSAhRTtHOUk8Rl1OICc5PzsmXU4KLU05VV1GPTZZQyAnOT89NllTOjY9Tjk2MT87Jl1OOVVdRj02WUMgJzk/PFZFRztGNUQ3Vy1IO1cpVDdWJVIKLU08RiVZICc5Pzo2WVQ3VyFPOjZZVDk3KCA3VjVEODcxQSAnOT88VkFPPEcxPzlHNU44UCFWN1c1TjxWRUcKLU07RjVEN1ZFTj0lXUE8RylBPjAhVjdXNU48VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIgJzk/OjZZVDdWOVUKLU07RiwgPUVdUzo2PU45NjE/PFZBTzxHMCA9RV1GOyZdQT0lXUY9NllDICY1WDo3MCA9RV1VO0ctSTlWWUUKLU05JV1MO1ZZRzdWJVI8RiVZICc5PzsmXU45UCFWN1ctSDtXKVQgJzk/OyZdTjlVXVA7VkVOPSY1UiAnOT8KLU08VkVHO0Y1RDdWLUg4NyggPUVdVTtHLUk5VllFOSVdTDtWWUcgJzk/PFZBTzxHMT84NylSODdEID1FXVUKLU07Ry1JOVZZRTklXVM6Jl1SPSVdQTxHKUE+MCE/OyZFQjdXOUU8Ry1JO1ZYIDdWVUM7VzVOPSAhVjdWLUgKLU04Nyk/PCZdSTtHMUU8QCFWN1c1TjxWRUc7RjVEN1YtSDg3KT88Jl1JO0cxRTxAIVY3Vy1JOVZZRTklXUkKLU07RzE/ODcpUjg3RCA3VV1GPCctVDg3KVQgJzk/PFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICctPzsmRU4KLU06UCE/MVRRLzBEJSw3VF0mMUUtJTUlXTQwNCksMTVcID1FXVM6Nj1OOTYxPzxWQU88RzE/PCZdSTtHMUUKLU08QCFWN1YxTz02KUw5NV1QO1ZFTj0mNVIgJV0/OyZdTjlWMU89NilMOTVdVTxWNUQgJzk/PFcxUj02LVQKLU0sMCFWN1ctVDxHNUM9IyggPUVdQzomJVI3ViVSPEYlWSAnOT85RlFPODcxPzwmXUk7RzFFPEAhVjdXLUkKLU05VllFOSVdTDtWWUc3VyFPOjZZVDk3KCA9RV1EO1c1QjsmNT85RzVOOFAhVjdXLUk5VllFOSVdSTtHMT8KLU05RzVOOFAhPzElRS4wNFUpMFAhVjdWOUw7ViVUN1YlUjxGJVkgJzk/PFZBTzxHMT88Jl1JO0cxRTxAIVYKLU03Vy1JOVZZRTklXUw7VllHN1Y5VTtGLCA9RV1TOjY9Tjk2MT84VkFBPEVdUDtWRU49JjVSICc5PzsmXU4KLU05VV1BPEcpQT4wIT86NllJPSAhVjdWLUg4NyggOFZRVTtGTUU8QCFWN1c1TjxWRUc7RjVEN1YtSDg3KT8KLU05RzVOOFAhVTdWUUk7RkwgPUVdUzo2PU45NjE/PFZBTzxHMT85RzVOOFAhUzwmXVI9Jy1DODcoID1FXVUKLU07RkVPO0MoID1FXVU7Ry1JOVZZRTklXUk7RzE/OUc1TjhQIVY3VzVOOjZdTiAgIE46NllUOTcpUCAiWUgKLU04Ny1IICJZRD42WVM+NlQgK0YxWTtHLVQ8QCBOPEY1TCtHIUw9ICBOOjZZST0gIE48JlFUICJZVDk3QVQKLU0gIllGOjZZSSAiWVI7VjFBPSYkICtGMUE9JiQgK0Y9Tz0gIE45J0VOODZVSThQIE44Ry1TICJZUz42VVQKLU04NiggK0ctVDxHMUE4QCBOPFZBUz0nKVQ4NiggK0YtTzs2VUU7RzAgK0YxRThHNUcgIllMOjZZRSAkIEgKLU0oUkVMOjYpQys2RFMuIzhaOyZFQjhSVUksU0BWK1YtUz0yXUM8RzBRK0csKSwyWFEuICFBPFNIQColLSMKLU0xJDRJKCM0TiwiIEAsIzBPLDNETy4zICAwIkBDKjZRSThGLE06MyxYLUNJQzxXNE84VylUOjJZUyIzJE4KLU0sQCFBPFNIQColLSMxJDRJKCM0TiwiIEAsIzBPLDNETy4zICAwIkBDKjZRSThGLE08Jl1SPSNJRzk2WE8KLU09RiVMPTY1Uys1QVQrRiwpLDJYUyAkIEgoUkVMOjYpQy5GRU44Ul1TPjZZTztHRU08UllIIjMkTixTLCAKLU0wIkBDKjZBRTg2MFo7NiVUOiJZSCIzKE4sMyROLDJYUi1QIUE4Vl1NPCNIQColLSMxJDRJKCM0TiwiIEAKLU0sIzBPLDNETy4zICA7VyFUOjZUWigiQTMwVDElKjIgVStDIEAoIyBUK1MkWStTRFAgJiVTLkIgSDRULSQKLU0xMkRALTJYUCgiIFAtIlxRLjJcWSwgIUE4Vl1NPCNIQColLSMxJDRJKCM0TiwiIEAsIzBPLDNETy4zICAKLU04NyxaKCJBMzBUMSUqMiBVK0MgQCgjIFQrUyRZK1NEUCAkIEgoUkVMOjYpQys2RFMuIzhaOVY1TitXLUgKLU03VjFBPSYkTjhQRFErQywgODYtTzs3IFooIkEzMFQxJSoyIFUrQyBAKCMgVCtTJFkrU0RQICZdUD0mRU0KLU0uQiBINFQtJDEyREAtMlhQKCIgUC0iXFEuMlxZLCAhQTxTSEAqJS0jMSQ0SSgjNE4sIiBALCMwTywzRE8KLU0uMyAgMCJAQyo2UUk4RixNOjMsWC1DSUw6NilDKzZEUy4jOE84Vy1VK1YtUj0mWE48UERRK0M0IDg3LFoKLU0oIkEzMFQxJSoyIFUrQyBAKCMgVCtTJFkrU0RQICIhTDkiIFooIkEzMFQxJSoyIFUrQyBAKCMgVCtTJFkKLU0rU0RQICAgICtAICAgISQgJEAhUCVAICAuICFHOSYpTTkyWUMgIzghIDAgICAhJCEzKCwkIiIkIS04OCQKLU0iIDghICAgICAhVCAgICAzICEoIDNAJCAgI0AgPSVdUz0nKVU4VzAgTUAgOCAgICAqQCAgICBUICRAIVUKLU0gICAgLiAhVjdWLUg4Nyk/OzY1TThGNVIgJTQgIDAgQyAgOCAhICAgICAgJypQICAgIFQgJEAiQCAgICAKLU0uICFWN1ctSDtXKVQ3VlVFOzYpRTxAITUgIDAgKFAgJiAgMCIgICAgIVJEICAgIC0gISggUjAgICAjQCAKLU09RV1JO0cxPzs2NU04RjVSICU0ICFQIEMgIDggISAwICAgICcqQCAgICBUICRAI1MgICAgLiAhVjdWUU8KLU07Rj0/OzY1TThGNVIgJTQgIkAgQyAgOCAhIEAgICAgJypQICAgIFQgJEAgPiAwICAuICFWN1Y5TDtWJVQKLU03VlVFOzYpRTxAITUgIFggKFAgJiAgMCwgICAgIVJQICAgIC0gISggMkAkICAjQCA9RV1EO1c1QjsmNT8KLU07NjVNOEY1UiAlNCAjUCBDICA4ICEhICAgICAnISAgICAhTCAgICAzICEoIDsgKCAgI0AgK0MhRjg2TUUKLU0gKzggJiAgICAiSCAgICAtICEoIERQJCAgI0AgPUVdQzomJVI3VlVFOzYpRTxAITUgICQgKFAgJiAgMCAKLU0gICAgIVJMICAgIC0gISggT0AkICAjQCA9RV1TOiZdUj0lXU05NlVCOTcoIDUwICQgIiwgIUAgJCBAICAKLU0gIDxJICAgICMwIDIgLjwhICAgWCAnOT86NllUN1ZVRTs2KUU8QCE1ICA8IChQICYgIDAkICAgICFSSCAKLU0gICAtICEoICQwKCAgI0AgPUVdTDtWWUc3VlVFOzYpRTxAITUgIEggKFAgJiAgMCggICAgIVJMICAgIC0KLU0gISggLyAoICAjQCA9RV1GOyZdQT0lXU05NlVCOTcoIDUwIC4gIiwgIUAgJCMgICAgIDxMICAgICMwIDIKLU0gJkAiICAgWCAnOT85Jl1VOEZRRTdWVUU7NilFPEAhNSAgXCAoUCAmICAwMCAgICAhUDAgICAgPCAgICAKLU0lUCAyIChMIyAgIFggJzE/PTZZSTtWWCBNQCAoICAgICpAICAgIFQgJEAiUiBAICAuICFWN1YtSDg3KT8KLU07NjVNOEY1UiAlNCAgMCBDICA4ICEgICAgICAnKlAgICAgVCAkQCM9IEAgIC4gIVY3Vy1IO1cpVDdWVUUKLU07NilFPEAhNSAgMCAoUCAmICAwICAgICAhUkQgICAgLSAhKCAhQCwgICNAID1FXUk7RzE/OzY1TThGNVIKLU0gJTQgIVAgQyAgOCAhICAgICAgJypAICAgIFQgJEAgUCBQICAuICFWN1ZRTztGPT87NjVNOEY1UiAlNCAKLU0iQCBDICA4ICEgICAgICAnKlAgICAgVCAkQCE7IFAgIC4gIVY3VjlMO1YlVDdWVUU7NilFPEAhNSAgWCAKLU0oUCAmICAwICAgICAhUlAgICAgLSAhKCBBUCwgICNAID1FXUQ7VzVCOyY1Pzs2NU04RjVSICU0ICNQIEMKLU0gIDggISAgICAgICchICAgICFMICAgIDcgISggSjAwICAjQCArQyVGODZNRSArOCAiICAgICJIICAgIC0KLU0gISggVCAsICAjQCA9RV1DOiYlUjdWVUU7NilFPEAhNSAgJCAoUCAmICAwICAgICAhUkwgICAgLSAhKCAKLU1eUCwgICNAID1FXVM6Jl1SPSVdTTk2VUI5NyggNTAgJCAiLCAhQCAkICAgICAgPEkgICAgIzAgMiAiMCQKLU0gICBYICc5Pzo2WVQ3VlVFOzYpRTxAITUgIDwgKFAgJiAgMCAgICAgIVJIICAgIC0gISggM0AwICAjQCAKLU09RV1MO1ZZRzdWVUU7NilFPEAhNSAgSCAoUCAmICAwICAgICAhUkwgICAgLSAhKCA+MDAgICNAID1FXUYKLU07Jl1BPSVdTTk2VUI5NyggNTAgLiAiLCAhQCAkICAgICAgPEwgICAgIzAgMiAqNCQgICBYICc5PzkmXVUKLU04RlFFN1ZVRTs2KUU8QCE1ICBcIChQICYgIDAgICAgICFQMCAgICBKICAgICFAIDIgLTwkICAgWCAnOT8KLU04VkFBPEVdRj02WUMgJTQgIDAgMSA0UiMhIEBBIDVGIyEgQCQgICAgLDAgICAgOCAkQCAsITAgIC4gIVYKLU03Vy1JOVZZRTklXUM6JiVSN1Y5VTtGLCA1MCAiICEkITcoLCQiIiQhOjgsJCIgMCAgICBTICAgICFAIDIKLU0gJCwlICAgWCAnOT89NllTOjY9Tjk2MT84VkFBPEVdRj02WUMgJTQgIFAgMSA2UiMhIEBBIDdGIyEgQCQKLU0gICAgKlAgICAgOCAkQCFSITAgIC4gIVY3Vy1IO1cpVDdWOVU7RiwgNTAgJCAhJCE/KCwkIiIkIUI4LCQKLU0iIDAgICAgUiAgICAhQCAyICpAJSAgIFggJzk/PFZFRztGNUQ3Vy1IO1cpVDdWOVU7RiwgNTAgJSAhJCEKLU1DKCwkIiIkIUY4LCQiIDAgICAgVCAgICAhQCAyIC4gJSAgIFggJzk/PTZZUzo2PU45NjE/PFZBTzxHMT8KLU05RzVOOFAhNSAgOCAkMCY8QFAwKCgwJklAUDAoISAgICAiRCAgICAmICEoICMwOCAgI0AgPUVdSTtHMT8KLU05RzVOOFAhNSAgPCAkMCZMQFAwKCgwJllAUDAoISAgICAjICAgICAmICEoIDAwOCAgI0AgPUVdUzo2PU4KLU05NjE/OjZZVDdWOVU7RiwgNTAgKCAhJCFPKCwkIiIkIVI4LCQiIDAgICAgUiAgICAhQCAyICc8JiAgIFgKLU0gJzk/PTZZUzo2PU45NjE/OjZZVDdWOVU7RiwgNTAgKSAhJCFTKCwkIiIkIVY4LCQiIDAgICAgSiAgICAKLU0hQCAyICo0JiAgIFggJzk/OyZdTjlVXUY9NllDICU0ICJAIDEgPVIjISBAQSA+RiMhIEAkICAgICwwICAKLU0gIDggJEAjOiFAICAuICFWN1ctSTlWWUU5JV1MO1ZZRzdWOVU7RiwgNTAgKyAhJCFbKCwkIiIkIV44LCQKLU0iIDAgICAgUyAgICAhQCAyICEkJyAgIFggJzk/PTZZUzo2PU45NjE/OyZdTjlVXUY9NllDICU0ICMgIDEKLU0gP1IjISBAQSAwRiQhIEAkICAgICpQICAgIDggJEAhICFQICAuICFWN1Y5TDtWJVQ3VjlVO0YsIDUwIC4KLU0gISQhIygwJCIiJCEnODAkIiAwICAgIEwgICAgIUAgMiAnICcgICBYICc5PzkmXVU4RlFFN1Y5VTtGLCAKLU01MCAvICEkISgoMCQiIiQhLDgwJCIgMCAgICA1ICAgICUwIDIgKlgnICAiIyAgNCAgPkgnICAgNSAgICAKLU0hMCAyIClIJyAgIiMgIDQgID5IJyAgIDAgICAgITAgMiAqSCcgICE1ICA8ICEgICAgI1AgICAgISAhKCAKLU1aQDwgICk0ICAgIkMgIkAgICBAICAgICAgICAgICAgICIgICAgICAgIDAgICAgICggICAgICAgIiAgICAKLU0iJyggK0AgICAhRCAgICAzICEoID5QQCAgI0AgOyZFTjpQIlYgKUAgICAgRiAgICAjMCAyICJEKCAgIFgKLU0gJllFPicwIEBQICUgICdKIVAgIChQICYgIDAgICAgICFSSCAgICAtICEoIDRQQCAgI0AgOyZFTjpWOVUKLU07RiwgQFAgJSAgJVAhUCAgKFAgJiAgMCQgICAgIVIwICAgIC0gISggPVBAICAjQCA8VzFVOUY4IDxAIk4KLU0hUCAgKFAgJiAgMCggICAgIVAwICAgIDUgICAgJTAgMiArRCggICIjICA0ICA+SCcgICA1ICAgICEwIDIKLU0gKjQoICAiIyAgNCAgPkgnICAgMCAgICAhMCAyICs0KCAgITUgIDwgISAgICAjUCAgICAhICEoIF0wQCAKLU0gKTQgICAiQyAiQCAgIEAgICAgICAgICAgICAgIiAgICAgICAgMCAgICAgKCAgICAgICAiICAgICInKCAKLU0rQCAgICFQICAgIDcgISggQjBEICAjQCA9JzU/OyZFTjpQIlYgKSAgICAgRiAgICAjMCAyICM8KSAgIFgKLU0gJllFPicwIEBQICUgICdKIVAgIChQICYgIDAgICAgICFSSCAgICAtICEoIDgwRCAgI0AgOyZFTjpWOVUKLU07RiwgQFAgJSAgJVsiICAgKFAgJiAgMCAgICAgIVIwICAgIC0gISggQTBEICAjQCA8VzFVOUY4IDxAIlkKLU0iICAgKFAgJiAgMCAgICAgIVAwICAgIFogICAgISAgMiAsPCkgICBYICJYUjlGJUs5MCJWICAwICAgI1MKLU0gIUwgIEAgICAmKUw9NjQgIDAgICAmPVI5NjVOICAgICAgIVI5NjAgISAgICAjWCAgICAkICEoICIwSCAKLU0gI0AgOFZdTDtXKVMgKzggISAgICAvLCAnUCAiICAgIDwmRU46UCAhICAgIDwnNVI8JlFFICAgICAgIVkKLU05NlFMO1c8ICEgICAgIyggICAgJCAhKCAvUEggICNAICtDLUY4Nk1FICs4ICEgICAgLywgJFAgISAgICAKLU05Rl1SOSAgICAgICA4VkFFPUdEICEgICAgIyQgICAgJCAhKCA9IEggICNAIDhWJVI8UCJWICAwICAgI1MKLU0gITAgIDAgICAnIU88Ry1DOiY0ICAgICAgJilNPVAgJCAgICAsQCAgICAwICRAIkoiQCAgLiAgTi0mOUEKLU06VjQgTUAgJCAgICBcUCAzICAkICAgITQ0RTUlICAgICAgISYwNFEzMTAgJCAgICAnICAgICE4ICRAIyYKLU0iQCAgLiAhQjtWXUw5NiVOICcoID0gSCAgIyQgICAgJCAhKCBeUEggICNAIDhHOUE7JywgTUAgJCAgICAKLU1cUCAzICAkICAgIVQ8RzVFICAgICAgIUY4NlFTOTAgJCAgICAnMCAgICE4ICRAIDgiUCAgLiAhQjtWXUwKLU05NiVOLEAhUiAsOCogICEmICAgICEgIDIgJigrICAgWCAmVUk8Vl1SOSY1Ujk2MCBNQCAkICAgIFxQIEMKLU0gICwgICAhVDonKUU5MCAgICAgID5GNVI7UCAhICAgIDtWWUUgICggICAhVD1WXCAhICAgICIsICAgICYKLU0gISggQjBMICAjQCA7NiVJO0AhNSAgPCAkMCRUQSAwKCgwJFVBQDAoISAgICAiPCAgICAnICEoIEwgTCAKLU0gI0AgPFchTzxHMVM4ViVSICcoIC9QSCAgIiwgITAgI0QpQCQiIjQgICAgJyAhKCBVMEwgICNAIDhWUVUKLU07Rk1FPEAhUiAgRCogICBDICA0ICBfUjchIEBIICAgICFQIDIgL1QrICAgWCAmWU87RyFSOjZVQTxHRCAKLU08QCMnIjAgIChQICUgICw0RVAwKCkwICAgIDwgJEAgQiMgICAuICFQPEZFTTg3KVkgJyggQjBEICAiLCAKLU0hMCAjKSk8JCIiMCAgICAnICEoIDFAUCAgI0AgPTVdTDo2WUsgJyggXTBAICAiLCAhMCAjIClAJCIiPCAKLU0gICAnICEoIDswUCAgI0AgPFVdTDo2WUsgKCwgITAgIVpAPCAgIiwgITAgI0YpPCQiIjggICAgJyAhKCAKLU1EUFAgICNAID1FXVU7RkVPO0MoIDxAIisgUCAgKFAgJSAgLjRGIDAoKTAgICAgPCAkQCJYIyAgIC4gIVYKLU03VzVOOjZdTiAnKCA7ICggICIsICEwICNHKUAkIiI8ICAgICcgISggV1BQICAjQCA9RV1TPScpVThXMFIKLU0gJyggM0AkICAiLCAhMCAjTyk8JCIiPCAgICAnICEoICFAVCAgI0AgPUVdUz0nKVU4VzBRICcoICtAICAKLU0gIiwgITAgI0kpPCQiIlwgICAgJyAhKCAtMFQgICNAID1FXUQ7VzVCOyY1PzwmXUk7RzFFPEAhQyAgLCAKLU0gMFwgKFAgJSAgLkBFUDAoK0AgICAgPCAkQCFDIzAgIC4gIVY3VjlMO1YlVDdXIU86NllUOTcoIDhQICMKLU0gICQuICIsICEwICNWKTwkIiM4ICAgICcgISggRjBUICAjQCA9RV1VO0ctSTlWWUU5JV1MO1ZZRzdXIU8KLU06NllUOTcoIDhQICMgICQsICIsICEwICMmKTwkIiMwICAgICcgISggUzBUICAjQCA9RV1TOjY9Tjk2MT8KLU07Jl1OOVVdUDtWRU49JjVSICYsICBQICEiUCBDICA0ICBdUjchIEBNICAgICFQIDIgL0gtICAgWCAnOT8KLU07Jl1OOVVdUDtWRU49JjVSICYsICBQICEiQCBDICA0ICBXIjchIEBVICAgICFQIDIgIlwuICAgWCAnOT8KLU09NllTOjY9Tjk2MT86NllUN1chTzo2WVQ5NyggOFAgIyAgJCkgIiwgITAgIzYpPCQiIywgICAgJyAhKCAKLU04QFggICNAID1FXVM6Nj1OOTYxPzo2WVQ3VyFPOjZZVDk3KCA4UCAjICAkKCAiLCAhMCAjRSk8JCIiUCAKLU0gICAnICEoIENAWCAgI0AgPUVdSTtHMT88Jl1JO0cxRTxAIUMgICwgIDA8IChQICUgIC0sRVAwKC1QICAKLU0gIDwgJEAjJSNAICAuICFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVDk3KCA4UCAjICAkJiAiLCAKLU0hMCAjICk8JCIjNCAgICAnICEoIF5AWCAgI0AgPUVdUzo2PU45NjE/PFZBTzxHMT88Jl1JO0cxRTxAIUMKLU0gICwgIDA0IChQICUgIC48RVAwKCtAICAgIDwgJEAgSCNQICAuICFWN1ctSDtXKVQ3VyFPOjZZVDk3KCAKLU04UCAjICAkJCAiLCAhMCAjWik8JCIjOCAgICAnICEoIDdAXCAgI0AgPUVdVTtHLUk5VllFOSVdQzomJVIKLU03VyFPOjZZVDk3KCA4UCAjICAkIyAiLCAhMCAjQik8JCIjMCAgICAnICEoIERAXCAgI0AgPUVdUzo2PU4KLU05NjE/OFZBQTxFXVA7VkVOPSY1UiAmLCAgUCAhIEAgQyAgNCAgXlI3ISBATSAgICAhUCAyICtcLyAgIFgKLU0gJzk/OFZBQTxFXVA7VkVOPSY1UiAmLCAgUCAhIDAgQyAgNCAgWDI3ISBARCAgICAgMCAyIC4sLyAgIjUKLU0gICAgSFAgMCAgICggICAgICAgISAgICAiJTQgI1AgTCAgICAhUCAyICBcMCAgIFggJzk/OSZdVThGUUUKLU03ViVSPEYlWSAnKCBPUFwgICIsICEwICMqKTwkIiIwICAgICEgISggLFEgICApNCAgICJDICEgICAgQCAKLU0gICAgICAkICAgICg1MCAuICJMICAgICcgISggN0EgICAjQCA9RV1GOyZdQT0lXUE8RylBPjAhUiAgXDAKLU0gICBDICA0ICBeIjchIEBEICAgICAwIDIgKCgwICAiNSAgICBIUCAwICAgKCAgICAgICAhICAgICIlNCAKLU0jICBTICAgICFQIDIgKzQwICAgWCAnOT89NllTOjY9Tjk2MT87Jl1OOVVdQTxHKUE+MCFSICVYMCAgIEMKLU0gIDQgIFYiNyEgQEQgICAgIDAgMiAtRDAgICI1ICAgIEhQIDAgICAoICAgICAgICEgICAgIiU0ICJQIFEKLU0gICAgIVAgMiAgSDEgICBYICc5PzxWRUc7RjVEN1ZRTztGPT84NylSODdEIDxAIlUkICAgKFAgJSAgLSAKLU1FUDAoKSAgICAgJCAkQCBOJDAgIEUwICAgKiwgJCAgICIgICAgICAgIDAgICAgQTUgIEggKkAgICAgPCAKLU0kQCE4JDAgIC4gIVY3VlFPO0Y9Pzg3KVI4N0QgPEAgKiQwICAoUCAlICAvUEVQMCgpICAgICAkICRAIVwKLU0kMCAgRTAgICAqLCAkICAgIiAgICAgICAgMCAgICBBNSAgRCAsQCAgICA8ICRAIk4kMCAgLiAhVjdXNU4KLU08VkVHO0Y1RDdWRU49JV1BPEcpQT4wIVIgJUAxICAgQyAgNCAgVSI3ISBARCAgICAgMCAyIC0oMSAgIjUKLU0gICAgSFAgMCAgICggICAgICAgISAgICAiJTQgIiAgUCAgICAhUCAyICAoMiAgIFggJzk/PFZFRztGNUQKLU03VkVOPSVdQTxHKUE+MCFSICpYMSAgIEMgIDQgIFhSNyEgQEQgICAgIDAgMiAiODIgICI1ICAgIEhQIDAKLU0gICAoICAgICAgICEgICAgIiU0ICFQIEkgICAgIVAgMiAkXDIgICBYICc5Pzo2WVQ3ViVSPEYlWSAnKCAKLU0gQSggICIsICEwICMnKTwkIiIwICAgICEgISggPFEoICApNCAgICJDICEgICAgQCAgICAgICAkICAgICgKLU01MCAmICMwICAgICcgISggSVEoICAjQCA9RV1VO0ctSTlWWUU5JV1TOiZdUj0lXUE8RylBPjAhUiAkXDIKLU0gICBDICA0ICBYIjchIEBEICAgICAwIDIgLEwyICAiNSAgICBIUCAwICAgKCAgICAgICAhICAgICIlNCAKLU0hMCBSICAgICFQIDIgL1QyICAgWCAnOT88VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkgJyggSVEoICAiLCAKLU0hMCAjMik8JCIiMCAgICAhICEoICgxLCAgKTQgICAiQyAhICAgIEAgICAgICAgJCAgICAoNTAgJCAiTCAKLU0gICAnICEoIDMhLCAgI0AgPUVdUzomXVI9JV1BPEcpQT4wIVIgL1QyICAgQyAgNCAgV1I3ISBARCAgICAKLU0gMCAyICcgMyAgIjUgICAgSFAgMCAgICggICAgICAgISAgICAiJTQgIFAgUyAgICAhUCAyICosMyAgIFgKLU0gJzk/PTZZUzo2PU45NjE/OFZBQTxFXUE8RylBPjAhUiAkUDMgICBDICA0ICBfQjYhIEBEICAgICAwIDIKLU0gLDwzICAiNSAgICBIUCAwICAgKCAgICAgICAhICAgICIlNCAgQCBRICAgICFQIDIgL0AzICAgWCAnOT8KLU08VkVHO0Y1RDdWLUg4Nyk/ODcpUjg3RCA8QCJDJFAgIChQICUgICxYRVAwKCkgICAgICQgJEAgPCUgICAKLU1FMCAgICosICQgICAiICAgICAgICAwICAgIEE1ICAkICpAICAgIDwgJEAhJiUgICAuICFWN1YtSDg3KT8KLU04NylSODdEIDxAI1gkUCAgKFAgJSAgLzRFUDAoKSAgICAgPCAkQCFKJSAgIC4gIVY3VjFPPTYpTDkwITUKLU0gIFwgKFAgJSAgLChFUDAoKFAgICAgPCAkQCItJSAgIC4gIVY3VjlMO1YlVCAlNCAjQCBDICA0ICBTUjcKLU0hIEBLICAgICFQIDIgK0A0ICAgWCAnOT89NllTOjY9Tjk2MT87Jl1OOVAhNSAgUCAoUCAlICAtWEVQMCgKLU0qMCAgICA8ICRAI0ElICAgLiAhVjdXLUk5VllFOSVdTDtWWUcgJTQgIlAgQyAgNCAgX1I2ISBAQiAgICAKLU0hUCAyICAsNSAgIFggJzk/OyZdTjlQITUgIEggKFAgJSAgLUhFUDAoKkAgICAgPCAkQCBNJTAgIC4gIVYKLU03VzVOPFZFRztGNUQ3VkVOPSAhNSAgRCAoUCAlICAvVEVAMCgqICAgICA8ICRAITUlMCAgLiAhVjdXLUkKLU05VllFOSVdSTtHMCA1MCAoICIsICEwICNcKTgkIiIkICAgICcgISggPUE0ICAjQCA9RV1JO0cwIDUwICcKLU0gIiwgITAgIyQpPCQiIlAgICAgJyAhKCBIQTQgICNAID1FXVU7Ry1JOVZZRTklXVM6Jl1SPSAhNSAgOCAKLU0oUCAlICAsJEVQMCgqQCAgICA8ICRAIywlMCAgLiAhVjdXLUk5VllFOSVdUzomXVI9ICE1ICA0IChQICUKLU0gIC08RVAwKChQICAgIDwgJEAjTyUwICAuICFWN1ctSDtXKVQgJTQgISAgQyAgNCAgVlI3ISBASyAgICAKLU0hUCAyICFINiAgIFggJzk/PTZZUzo2PU45NjE/OFZBQTxAITUgICwgKFAgJSAgLFpFUDAoKjAgICAgPCAKLU0kQCEjJUAgIC4gIVY3Vy1JOVZZRTklXUM6JiVSICU0ICBAIEMgIDQgIFcyNyEgQEIgICAgIVAgMiAmNDYKLU0gICBYICc5PzhWQUE8QCE1ICAkIChQICUgIC9YRVAwKCEgICAgIDwgICAgICAgIjIgQCAgMygsJCInRCAKLU0gICNfX1AgICAgIVogICAgX19cMCAgICA+UCAgIC9fXyggICAgJ1QgICAjX19TICAgICFeICAgIF9fXSAKLU0gICAgP1AgICAvX180ICAgICgkICAgI19fViAgICAiIiAgICBfX11QICAgIEBQICAgL19fQCAgICAoNCAKLU0gICNfX1kgICAgIiYgICAgX19eQCAgICBBUCAgIC9fX0wgICAgKEQgICAjX19cICAgICIqICAgIF9fXzQKLU0gICAgTEAgICAvX19aICAgICs0ICAgI19fXlggICAiViAgICBfX19VICAgIE1QICAgL19fXyAgICArRCAKLU0gICNfX1AsISAgIlogICAgX19cLCAwICBOUCAgIC9fXyUwJCAgK1QgICAjX19RWCEgICJeICAgIF9fXEgKLU0gMCAgT1AgICAvX18sQCQgICwkICAgI19fU1AhICAjIiAgICBfX10mIDAgIFBQICAgL19fNCAkICAsNCAKLU0gICNfX1VIISAgIyYgICAgX19dRCAwICBSMCAgIC9fXz4gJCAgLEggICAjX19YKCEgICMrICAgIF9fXiwKLU0gMCAgUzAgICAvX19FQCQgICxYICAgI19fWighICAjLyAgICBfX15OIDAgIFQwICAgL19fTkAkICAtKCAKLU0gICNfX1wwISAgIzMgICAgX19fLiAwICBVMCAgIC9fX1YgJCAgLTggICAjX19eKCEgICM3ICAgIF9fX0wKLU0gMCAgVjAgICAvX19dQCQgIC1IICAgI19fUCAiICAjPCAgICBfX1w0IEAgIFcwICAgL19fJ0AoICAtWCAKLU0gICNfX1JAIiAgI0AgICAgX19cUiBAICBYMCAgIC9fXy8gKCAgLiggICAjX19UOCIgICNEICAgIF9fXTAKLU0gQCAgWTAgICAvX182QCggIC44ICAgI19fVjAiICAjSCAgICBfX11OIEAgIFowICAgL19fPiAoICAuSCAKLU0gICNfX1goIiAgI0wgICAgX19eLCBAICBbMCAgIC9fX0VAKCAgLlwgICAjX19aICIgICNQICAgIF9fXkoKLU0gQCAgXDAgICAvX19NICggIC8oICAgI19fW1giICAjVCAgICBfX18oIEAgIF1AICAgL19fVEAoICAvPCAKLU0gICNfX11YIiAgICAgICAgX19fSSBAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAwICAgICQgICAgIiAgICBVKCAkIi0wICAgIDMgICAgICAgICAgICAKLU0gICAhICAgICAgICAgIEQgICAgJSAgICAgQCAgIC5CICEgQ0ggICAgMSAgICAgLCAgICAgICAgICEgICAKLU0gIDAgICAgLyAgICAiUCAgICAoICAgIExAMDAoKyAkICAsICAgICAkICAgICAwICAgIDAgICAgMCAgICAKLU0lUCAgICAsICAgICIgICAgWygkJCIuUCEgICFbICAgICAgICAgICAgICAgISAgICAgICAgICFcICAgICkKLU0gICAgIEAgICAmQiIhIEFIIEAgICggICAgICwgICAgJyAgICAhICAgICBAICAgIEggICAgIDAgICAgOCAKLU0gICIoQEAwKEIgKCAgICQgICAgICAgICAgICAgICAwICAgICAgICAgK0AgICAgJCAgICAmICAgIEMoKCQKLU0iKFAiICAhMCAgICAgICAgICAgICAgICQgICAgISAgICAjLCAgICAhICAgICFAICAgLVIiISBDPCBAICAKLU02MCwgICAgICAgICAgICAgISAgICAgICAgICBZICAgICAwICAgIDggICAgWEFAMCguIDggICAkICAgICAKLU0gICAgICAgICAgMCAgICAgICAgIC9QICAgICQgICAgIiAgICAvKDgkIiNQJiAgIEAgICAgICAgICAgICAKLU0gICAkICAgICAgICAgJDwgICAgISAgICAgUCAgICVSNiEgQTwhQCAgIiAgICAgICAgICAgICAgICEgICAKLU0gICAgICAhLSAgICAgMCAgICAsICAgIURFQDAoOSA4ICAhUCAgICAgICAgICAgICAgIDAgICAgJCAgICAKLU00QCAgICA4ICAgICMgICAgQCk4JCIoICYgICFQICAgICEgICAgICAgICAgJCAgICAiICAgICVMICAgICgKLU0gICAgIFAgICAvIjYhIENQIUAgIE0gJCAgICAgICAgICAgICAhICAgICAgICAgIUAgICAgIEAgICAgICAKLU0gICAgICAgIFwgOCAgICAnICAgMCAgICAnICAgICAwICAgIDAgICAgOiAgICAgLCAgICAgICAgICAgICAKLU0gLyAtICAjNCEgICAgICAgICAgICAgICEgICAgICAgICAnICAgICAjICAgICAgICAgICAgICAjJCRAICAKLU1EICAgICAgICAgICAgICAgIDAgICAgICAgICFaICAgICAwICAgICAgICAgICAgICA1ISwgICIoIiAgICAKLU0gICAgICAgICAgJCAgICAgICAgIEBQICAgICQgICAgICAgICAgICAgICdANSAgIVAlQCAgICAgICAgICAKLU0gICAkICAgICAgICAgKEggICAgISAgICAgICAgICAgICAgI0gqUCAgREAoICAgICAgICAgICAgICAwICAKLSUgICAgICAgIAotIAotZW5kCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2k4NjAtZWxmLnUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2k4NjAtZWxmLnUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNmU4M2IuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9pODYwLWVsZi51CisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLWJlZ2luIDc3NSBpODYwLWVsZgotTT9UNSwxQCQiIDAgICAgICAgICAgICAgIiAgPCAgICAhICAgMzIgICAgIzAgICMtNCAgICAgICBUICIgIAotTSEwIEggITQgJDAgICAgOCAgICBUICAgMC0gICAgICAgICAiQCAgICBIICAgICA0ICAgICAgICAgIFAgIAotTSAtMCAgICAgICAgICAgICAgISwgICAgICAgICAhICAgICAgICAgICEgICAgLSAgICQjMCAgICAgICAgKAotTVwgICAiLyAgICAgJSAgIDAgICAgICAkICAgREQgICBJKSAgICAgICAgICI4ICAgIjcgICAgIDggICEgIAotTSAgICAgQCAgIjRQICAiRSwgICAgICAgICAnICAgICAgICAgICFQICAgICBPPTctUitWUUk4Ql1MOjYpQwotTStHLU8rQyQgICAgICAgLCAgICAsICAgICFQICAgIFAgICAgKyAgICAgICAgICAgICAgICAgICAgIEAgIAotTSAgICAgICAjICAgICEwICAgICAgICAgJiAgICAhICAgICBEICAgICogICAgIiAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICEgICAgIDAgICRNICAgICEsJEAgICAgICAgIEggICJOIAotTSAgICAgISQgX18kICAgIC8gICBJKiAgICAgMDEgICArICAgICYgICAmMjAgICAgICQwI19cMCAgICFcIAotTSAhK0wgICAgRiEoICAgICAgICBGICAgSU8gICAgICAxIC9fUSAgICArMCAgJFIwICAgICAkQCAgICAgIAotTSAjKCAgIUQwICAgICEhJCAgIEggICAgXyAgIDMiICAgICAgMiAgICAgICAgMjAgICozICAgICAgJDAjXwotTVwwICAgJVwgICJFLCAgICAgISQgX18kIDdWLUw5NiVOPTcgIDdWNU45ICE/OTZZVjo3KU87QCE/OTcxRQotTT4nMCA4NzFFPiZFVCAlXUU5JiVUODAhRT4mRVQgJV1MOjYpPz1GNVI8VkVPO0AhPzdWOVA8VzFBPEcwIAotTTdUPSwzVCkhMyVdLzFEOTMxNTE/NSQlIjMkNT8gJV0kNjRZITM0RSMgIl1VPFcoTzsmRUIrVlFJOEYsTgotTTxWXE4sMCAgICAgSS8gICAgQDAgICAgICAgIEkwICAgIUAwICAgICAgICBJMSAgICJAMCAgICAgICAgSQotTTIgICAiIDAgICAgICAgICAgKiAgICAhICAgQCBIICAgICogICAgIDdfUkRZWyFcICAhPz4qMzUgIC9AIAotTSVfXEkvPlA/ICAjRCcwICAwICNYICZPX19fO09PMCAgWyFcICAuUD4gICEgIC9AICVfXEkwPl5dICAjRAotTScwICxbIVggICZPX19eXDdfUkUlWyFcICAuMD0gIUEgIC9AIDpfX19aLl5dICAjTCdQICBbIVggICQgIAotTV4gIDdfUkUpW1tUICAuMD0gIjNMJ0AgIDpfX19YOiAgICAjKCAgIDQnJCAgIDgxIl9fIkAwUCAgJyQgIAotTSE+UDAgICM0MEAgLzZAICAgTjgwJE0iQCAgICA7X19fWC4/Pyo0U0wnQCAgO19fX1ZVT0AgICtMJCAgIAotTUgpICAgLjgwJjAhT19fXzhIICAgICZfX19cPkAgICAgO19fX1ZaODIgICg0PCAgMUFFKCAmKCkyJiAgPwotTVk5JElbIVwgICZQICApSiQ8MCA0O19fX1VaICAgICJAJCAgIEggICAgJD9AXiAiJCdQICFIXCQgICogXwotTSAgIkAgICAgMCAjWCAqICAgICJAICAgIEggICAgLEAgICBQPDAhQCFBJCtfXCogMCAgIiQwUCAgJSYsIAotTSA4MV8gISJHWEAgIDAgICggKiAgICAjKCAgICwnJCA4IDgxIl9fIkAkICAgQSQsICAhMUMgICYkP1AgMAotTUleKCAgJCAgIiAiQCAgICBSICAgIyFRICYgJiQwT19QSCEgICAoMSMgICA0OFAgIUEnXCAkKj9CICAhIAotTSAgQCBIICAgICxAICAgUDwwIUAhQSQrX1wqIDAgICIkMFAgICUmLCAgODFfICEiR1hAICAwICAoICogIAotTSAgIyggICAsJyQgOCA4MSJfXyJAJCAgIEEkLCAgITFDICAmJD9QIDBJXiggICQgICIgIkAgICAgUiAgIAotTSMhUSAmICYkME9fUEghICAgKDEjICAgNDhQICFBJ1wgJCo/QiAgISAgIEAgSCAgICAsQCAgIFA8MCFAIQotTUEkK19cKiAwICAiJDBQICAlJiwgIDgxXyAhIkdYQCAgMCAgKCAqICAgICMoICAgLCckIDggODEiX18iQAotTSQgICBBJCwgICExQyAgJiQ/UCAwSV4oICAkICAiICJAICAgIFIgICAjIVEgJiAmJDBPX1BIISAgICgxIwotTSAgIDQ4UCAhQSdcICQqP0IgICEgICBAIEggICAgLEAgICBQPDAhQCFBJCtfXCogMCAgIiQwUCAgJSYsIAotTSA4MV8gISJHWEAgIDAgICggKiAgICAjKCAgICwnJCA4IDgxIl9fIkAkICAgQSQsICAhMUMgICYkP1AgMAotTUleKCAgJCAgIiAiQCAgICBSICAgIyFRICYgJiQwT19QSCEgICAoMSMgICA0OFAgIUEnXCAkKj9CICAhIAotTSAgQCBIICAgICxAICAgUDwwIUAhQSQrX1wkQCggPEYkMFAgICUmLCAgODFfICEiR1hAICAwICAoICogIAotTSAgIyggICAsJyQgOCA4MSJfXyEoIiAnKUEkLCAgITFDICAmJD9QIDBJXiggICQgICIgIkAgICAgUiAgIAotTSMhUSAmICYkME9fUFshXCAgKDEjICAiNCcgICEjXjQiUyBfRVhEM0wnUCAgWyFcICApMDwgICo0JyAgIwotTSNeN0IiQV9FWENTTCdQICBbIVwgICkwPCAgMjQnICAlJ143QishX0VYPTNMJ1AgIFshXCAgKTA8ICA6NAotTScgICcnXjdBWDFfRVg8N0wnUCAgWyFcICApMDwgIEI0JyAgKSdeN0FQMV9FWENHTCdQICBbIVwgICkwPAotTSAgSjQnICArJ143QVMxX0VYREdMJ1AgIClfIDkoTlA/ICAgT1wiSC5bIVwgICI/UCYxQ0wnUCAgK18gSQotTVYuUD8gICAnXyJLLFshXCAgIF9FWEpDTCdQICAhX1BKMS5QPyAgIC9ZPigoWyFcICAgP1wqQEtMJ1AgIAotTSNeN0FSLlA/ICAgN18iSFxbIVwgICFfRVhEU0wnUCAgJV9QSisuUD8gICA/WT4oOFshXCAgIT9cKj0zTAotTSdQICAnXjdCNC5QPyAgIDdfIkdBWyFcICAhX0VYPldMJ1AgICVfUElRPlA/ICAgP1k+KT1bIVwgICE/XAotTSo8J0wnUCAgJ143Qig+UD8gICA3XyJIWVshXCAgIV9FWEw3TCdQICAlX1BJUz5QPyAgID9ZPigxWyFcIAotTSAhP1wqREdMJ1AgICdeN0IsPlA/ICAgR1wiSC5bIVwgICJfUCpLO0wnUCAgKV8gSVYuUD8gICBPXCJHWAotTVshXCAgLj9cKkxTTCdQICAnXjdCNT5QPyAgI0dfIkkkWyFcICAhX0VYTCdMJ1AgIFlfUEoiTlA/ICAgPwotTVk+KTlbIVwgIC4/XCpDU0wnUCAgJ143Qk8+UD8gICNHXyJITFshXCAgIV9FWEZXTCdQICBZX1BJVS5QPwotTSAgID9ZPicxWyFcICAuP1wqPiNMJ1AgICdeN0InPlA/ICAjR18iRyRbIVwgICFfRVhGN0wnUCAgWV9QSQotTVAuUD8gICA/WT4oSVshXCAgLj9cKkNDTCdQICAnXjdCMD5QPyAgI0dfIkcsWyFcICAhX0VYSydMJ1AgIAotTVlfUEoyLlA/ICAgP1k+J0lbIVwgIC4/XCpAU0wnUCAgJ143Qks+UD8gICNHXyJHOFshXCAgIV9FWEcnTAotTSdQICBbIVwgICkwPCAgKjQnICAiJ143QV0xX0VYPjdMJ1AgIFshXCAgKTA8ICAmNCcgICEnXjdDOjFfRQotTVhNJ0wnUCAgJV9QSjo+UD8gICA/WT4rOVshXCAgIT9cKldDTCdQICAnXjdDPC5QPyAgIDQ4UCAhQSdcIAotTSQqP0IgICEgICBAIEggICAgJCAgIiAiQCAgICBIICAgICAgICAgICAgICAgMCZEICAgICAgICEiUiAgIAotTSAgICAgICAgICAgICAgICAgICBJMyAgICAgICAgICAgICAgMlcgICAkT0AgICEsNCAgIDMsICAgICAkIAotTSAgIUggICAgIyAgICRLICAgICAtICAgOSAgICAgIDAgICEjSCAgICAhMCAgJEAgICAgICYgICAxLCAgIAotTSAgSCAgICFbICAgICJQICAgISAgICAgNSAgICAgICAgICAsICAiRFAgICAgIEAgICAjICAgICA0ICAgIAotTSFQICAgITwgICEpXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQgICAgIAotTSAgICAgIDAgX18kICAgICAgICAwVSAgICAgICMgICAhICAgICAgICAkLkAgICAgICBQICAgQCAgICAgIAotTSAhJFAgICAgICAsICAgLCAgICAgICAgMiAgICAgICAjICAgJCAgICAgICAgJEdQICAgICAgUCAgITAgIAotTSAgICAgISpQICAgICAgLCAgIDggICAgICAgIDJQICAgICAgIyAgICcgICAgICAgICRUICAgICAgIFAgIAotTSIgICAgICAgICFEICAgICAgICwgICBEICAgICAgICA5JCAgICAgICMgICAqICAgICAgICAqMjAgICAgIAotTSBQICAiUCAgICAgICAiRFAgICAgICAsICAgUCAgICAgICAgSTMgICAgICAjICAgLSAgICAgICAgKjwgIAotTSAgICAgUCAgI0AgICAgICAgICAgICAgICAgLCAgIFwgICAgICAgICAgICAgICAgIyAgIDAgICAgICAgIAotTSAgICAgICAgIFAgICQwICAgICAgICAgICAgICAgICwgICEoICAgICAgICAgICAgICAgICMgICAzICAgIAotTSAgICAgICAgICAgICBQICAlICAgICA8ICAgICAgICAgICAwIF9fJCAgICAuICAgICAgICAgICAkIC9fUQotTSAgICAlMCAgICAgICAgICAhICNfXDAgICAiJCAgICAgICAgICAgMCBfXyQgICAgSSAgICAgICAgICAgJAotTSAvX1EgICAgLFAgICAgICAgICAgISAjX1wwICAgI0ggICJHICAgICAhISQgICBYICAgISkgICBJUSAgIAotTSAgMDEgICAuICAgIDVAICAkX0AgICAgQCRAICAiICAgICYoICAhRCAgICAgICEoICAgRCAgICFIICAgSQotTVIgICAgICgxICAgLiAgICA/QCAgJUJAICAgKzgkQCAgIiAgICAoLCAgIkcsICAgICEhJCAgIFggICAiMQotTSAgIElUICAgICAwMSAgIC4gICAgSkAgICRYICAgICEsJEAgICAgICAgKywgICJOICAgICAgISQgX18kIAotTSAgIlggICBJVSAgICAgKDEgICAuICAgIFIwICAlLCAgICAgQCRAICAiICAgIC1cICAiRzggICAgIiEkIAotTSAgWCAgICNIICAgSVggICAgIDAxICAgLiAgICBbQCAgJFRAICAgICAkQCAgIiAgICAvNCAgIkdEICAgIAotTSEhJCAgIFggICAkICAgIEkqICAgICAwMSAgICsgICAhIjAgICo+QCAgICAkJDAgICNAICAgMiQgICJHTAotTSAgICAiISQgICBYICAgJE0gICBJXSAgICAgMDEgICAuICAgIS0wICAlIiAgICAgQCRAICAiICAgIDRAIAotTSAiR1ggICAgJCEkICAgWCAgICU3ICAgOSkgICAgICAxIC9fUSAgICE3QCAgKkBAICAgICIkMCAgI0AgIAotTSA3KCAgIkgqICAgICAxJCAgIFggICAmIiAgIEojICAgICAwMSAgIC4gICAhQkAgICpBICAgICAoJDAgIAotTSNAICAgOVggICEzMCAgICBGISggICAgICAgJkUgICBJKiAgICAgMEEgICArICAgIUswICAlNiAgICAgQAotTSRAICAiICAgIDtEICAiSDggICAgISEkICAgWCAgICcuICAgNUwgICAgIiAyICAgKCAgICFYUCAgKkFQIAotTSAgICQkMCAgI0AgICA/JCAgIkZcICAgICAhJCBfXyQgICAnWCAgIDQ8ICAgICIgMiAgICggICAiITAgIAotTSpCICAgICAoJDAgICNAICAgQUggICJISCAgICAhISQgICBYICAgKFEgICA0WiAgICAiIDIgICAoICAgIgotTS8gICAqQlAgICAgIiQwICAjQCAgIERMICAhNzggICAgKCEoICAgQCAgICk4ICAgNzwgICAgICAyICAgIAotTSAgICI3MCAgKkMgICAgICgkMCAgI0AgICBHLCAgIkhYICAgICEhJCAgIFggICApWiAgIEovICAgICAoMQotTSAgIC4gICAiQEAgICpEICAgICAkJDAgICNAICAgSSQgICJJJCAgICAgMSQgICBYICAgKj8gICBKMiAgIAotTSAgMDEgICAuICAgIktQICAqRFAgICAgJCQwICAjQCAgIEtUICAiSTAgICAgISEkICAgWCAgICs0ICAgOQotTSQgICAgIDAxICAgKiAgICJYMCAgJF1AICAgICAkQCAgIiAgICBORCAgIkk0ICAgICEhJCAgIFggICArWAotTSAgIEo2ICAgICAwMSAgIC4gICAjJCAgICpFUCAgICAoJDAgICNAICAgUiwgICE4QCAgICAgISggICAgIAotTSAgLE0gICBKOSAgICAgMDEgICAuICAgIzBAICAqRkAgICAgJCQwICAjQCAgIFREICAiRFAgICAgICEkIAotTV9fJCAgIC0/ICAgSjsgICAgIDAxICAgLiAgICM9QCAgKkcgICAgICQkMCAgI0AgICBYPCAgIkREICAgIAotTSEhJCAgIEwgICAuOSAgIEo+ICAgICFAMSAgIC4gICAjSFAgICpJICAgICA4JDAgICNAICAgWlQgICJKSAotTSAgICAgQSQgICBYICAgLlogICBKSyAgICAgMDEgICAuICAgI1JAICAqSyAgICAgJCQwICAjQCAgIF4gIAotTSAhOCAgICAgKCEoICAgQCAgIC9OICAgNSQgICAgIiAyICAgKCAgICQgICAgKjRQICAgICAkMCNfXDAgIAotTSEgRCAgIkpUICAgICIhJCAgIFggICAwNyAgIEpPICAgICAwMSAgIC4gICAkKVAgICU4QCAgICBAJEAgIAotTSIgICAhI0ggICJLICAgICAhISQgICBYICAgMTAgICBKUSAgICAgQDEgICAuICAgJDcwICAkSyAgICAgIAotTSRAICAhQCAgISYsICAiSywgICAgIDEkICAgWCAgIDFKICAgSlQgICAgIDAxICAgLiAgICQ8QCAgJSRAIAotTSAgIEAkQCAgIiAgICEoPCAgIks4ICAgIEQhJCAgIFggICAyLiAgIEs6ICAgICAwMSAgIC4gICAkRiAgIAotTSUpQCAgICBAJEAgICIgICAhKlAgICJNUCAgICAiISQgICBYICAgMlUgICBLPiAgICAgQDEgICAuICAgJAotTU8wICAlM0AgICAgQCRAICAiICFHOSYpTTkwIUM8RzBRK0csIDhXKVQ6MllTICc5QTsnNUU8UlU4PSJZQwotTSAmPUQ4RlVFK0YsIDxWQT85JiVUODJZQyAmLVI9JlhOPFAhVjdXNU48VkVHO0Y1RDdWRU49ICFWN1ctSQotTTlWWUU5JV1JO0cwID1FXUM6JiVSN1Y5VTtGLCA3VjlJO0ZEID1FXVU7Ry1JOVZZRTklXUM6JiVSN1YlUgotTTxGJVkgJlVBOjZYID1FXVM6Nj1OOTYxPzsmXU45UCFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVAotTTk3KCA3Vi1MOTYlTj03ICA3VjVOOSAhVjdXNU48VkVHO0Y1RDdXLUg7VylUICc5Pz02WVM6Nj1OOTYxPwotTTxWQU88RzE/OUc1TjhQIVY3VjFPPTYpTDkwIVY3VkVOPSAhPzxXMUE8RzAgO0ZdTjwnKUk7NiVSPjAhPwotTTk2WVY6NylPO0AhVjdXNU48VkVHO0Y1RDdWUU87Rj0/PCZdSTtHMUU8QCFWN1ZFTj0lXUE8RylBPjAhUAotTTxGRU04NylZICc5PzxWRUc7RjVEN1YtSDg3KT85RzVOOFAhVjdWMU89NilMOTVdQTxHKUE+MCE/OTcxRQotTT4nMCA9RV1TOjY9Tjk2MT84VkFBPEVdQTxHKUE+MCFWN1c1TjxWRUc7RjVEN1YtSDg3KCA9RV1GOyZdQQotTT0gIVY3Vy1JOVZZRTklXUw7VllHN1YlUjxGJVkgJiVUOTdBST0gIUU7RzlJPEZdTiAnOT87Jl1OOVVdRgotTT02WUMgJzk/PFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1GPTZZQwotTSAnOT86NllUN1chTzo2WVQ5NyggN1Y1RDg3MUEgJzk/PFZBTzxHMT85RzVOOFAhVjdXNU48VkVHO0Y1RAotTTdWRU49JV1BPEcpQT4wIVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICc5Pzo2WVQ3VjlVO0YsIAotTT1FXVM6Nj1OOTYxPzxWQU88RzAgPUVdRjsmXUE9JV1GPTZZQyAmNVg6NzAgPUVdVTtHLUk5VllFOSVdTAotTTtWWUc3ViVSPEYlWSAnOT87Jl1OOVAhVjdXLUg7VylUICc5PzsmXU45VV1QO1ZFTj0mNVIgJzk/PFZFRwotTTtGNUQ3Vi1IODcoID1FXVU7Ry1JOVZZRTklXUw7VllHICc5PzxWQU88RzE/ODcpUjg3RCA9RV1VO0ctSQotTTlWWUU5JV1TOiZdUj0lXUE8RylBPjAhPzsmRUI3VzlFPEctSTtWWCA3VlVDO1c1Tj0gIVY3Vi1IODcpPwotTTwmXUk7RzFFPEAhVjdXNU48VkVHO0Y1RDdWLUg4Nyk/PCZdSTtHMUU8QCFWN1ctSTlWWUU5JV1JO0cxPwotTTg3KVI4N0QgN1VdRjwnLVQ4NylUICc5PzxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAnLT87JkVOOlAhPwotTTFUUS8wRCUsN1RdJjFFLSU1JV00MDQpLDE1XCA9RV1TOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPEAhVgotTTdWMU89NilMOTVdUDtWRU49JjVSICVdPzsmXU45VjFPPTYpTDk1XVU8VjVEICc5PzxXMVI9Ni1ULDAhVgotTTdXLVQ8RzVDPSMoID1FXUM6JiVSN1YlUjxGJVkgJzk/OUZRTzg3MT88Jl1JO0cxRTxAIVY3Vy1JOVZZRQotTTklXUw7VllHN1chTzo2WVQ5NyggPUVdRDtXNUI7JjU/OUc1TjhQIVY3Vy1JOVZZRTklXUk7RzE/OUc1TgotTThQIT8xJUUuMDRVKTBQIVY3VjlMO1YlVDdWJVI8RiVZICc5PzxWQU88RzE/PCZdSTtHMUU8QCFWN1ctSQotTTlWWUU5JV1MO1ZZRzdWOVU7RiwgPUVdUzo2PU45NjE/OFZBQTxFXVA7VkVOPSY1UiAnOT87Jl1OOVVdQQotTTxHKUE+MCE/OjZZST0gIVY3Vi1IODcoIDhWUVU7Rk1FPEAhVjdXNU48VkVHO0Y1RDdWLUg4Nyk/OUc1TgotTThQIVU3VlFJO0ZMIDxXIU88RzFTOFYlUiAnOT88VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCA9RV1VO0ZFTwotTTtDKCA9RV1VO0ZFTztAIVY3VzVOPFZFRztGNUQ3VkVOPSVdRj02WUMgICBOOjZZVDk3KVAgIllIODctSAotTSAiWUQ+NllTPjZUICtGMVk7Ry1UPEAgTjxGNUw4MllQOycwICtGRU46NzAgK0chTD0gIE49JjVYPSAgTgotTTlGRU46MCBOPEZdRDg3MUEgIllEODcxQSAiWUc7VzAgK0YxWTtGJU06NiwgK0YpUzxQIE48V0VNPSYlQgotTSAiWVM9JylUODYoICtHLUg8VzFSPSYlQiAiWUM7VlVNOTZZVCAiWUQ5NilVOVAgTjsmRU45MCBEMiY1QQotTTkmNVIuQiBPPCJdMjBVLE89NzFJOyMoTSxCWFErVzVTPEJdUzxGLE87JkVCK1ZRSThGLE86M0BWLCJdQwotTTxXNE84VylULDJZUysnOEAsQlhRKCNEUitTIFUrUyRUKCMgVy5DJFYuQyhQKCYxQT1GRUQ7VjlGKCQ1WAotTTwiIEQgJCBIKFJFJjUlQEAsQlhRK0MgTiwyIVM4VjFFLkJdVTxXKE84Vi1TK1ZRSThCXUM8RzBRK0ZcIAotTSkkQUU4NjFFPENIQCtXIE80RC0zK1c1VDo2UFIrMyhOLDJdVTxXKE88VylDK1ZRSThCXUw6NilDK1ZEWAotTS1DIE84Vy1VK1YtUj0mRE48UlFWKCMoTiwyIFksQlxQLTJcUS0iIFAtU0hRLUNIUiwyIUQ4NzlJOSZdRgotTTlCISU+JyBAKSAhICoiLEkxRTE4KCMoTiwyWFArQyRAPFYtRDkzSE89Ny1SK1YtQzxSXUw6NihPOFcpVAotTToyWU8gIjEoOTYlRDk3KFooIl1QK1UpIzRSXVU9JkVMLEJUUitDJE89Ny1SK1ctUjhSXUw6NihPOyZFQgotTThSXVA7VylUK1Y9RTtCXVY4NlFVOTcsTTYnME44UlFWKCMoTiwyIFksQlxQLTJcUS0iIFAtU0hSLVNIUAotTSxCIUQ4NzlJOSZdRjlCISU+JyBAKSAgRDImNUE5JjVSLkIgTzwiXTIwVSxPPTcxSTsjKE0sQlhRK1c1UwotTTxCXVM8RixPOyZFQitWUUk4RixPOjZZQytXLVk7Rl1OPjZVUytGQEw9QiBSK0MkQC4zKE8sIzRPLDMwQAotTSwjPFosQyhaLDNEQDkmJVY6NjFPOUY4QDE3QVAoIjAgKSRBRTg2MUU8Q0hAK1cgTzRELTMrVzVUOjZQUgotTSszKE4sMl1VPFcoTzxXKUMrVkFFODYwTzs2JVQ6IllIKyc4QCxCWFEoI0RSK1MgVStTJFQoIyBXLkMkUgotTS5DNFcoJjFBPUZFRDtWOUYoJDVYPCIgRCAmJUM7VlVQLkIgSDRULSQxMkRALTJYUCgjJFIrUyBYK1NAWQotTSAmJVMuQiBINFQtJDEyREAtMlhQKCMkUitTIFgrU0BZICQgSChSRSY1JUBALEJYUStDIE4sMiFTOFYxRQotTS5CXVU8VyhPOFYtUytWUUk4Ql1WODZRVTk3LE02JzBOO1AhQThWXU08I0hAKiUtIzEkNEkoIzROLCIgUQotTSxCXFAuIlxYLjAhQTxTSEAqJS0jMSQ0SSgjNE4sIiBRLEJcUC4iXFguMCBEMiY1QTkmNVIuQiBPPCJdMgotTTBVLE89NzFJOyMoTSxCWFErVzVTPEJdUzxGLE87JkVCK1ZRSThGLE86M0BWLCJdRzk2WE88VkE/OSYlVAotTTgyWUMrJzhALEJYUSgjRFIrUyBVK1MkVCgjIFcuQyRXLkM0VCgmMUE9RkVEO1Y5RigkNVg8IiBEICYlQwotTTtWVVAuQiBINFQtJDEyREAtMlhQKCMkUitTIFgrU0BZICYlUy5CIEg0VC0kMTJEQC0yWFAoIyRSK1MgWAotTStTQFkgJCBIKFJFJjUlQEAsQlhRK0MgTiwyIVM4VjFFLkJdVTxXKE84Vi1TK1ZRSThCXUw6NilDK0ctTwotTSAiMSg5NiVEOTcoWigiXVArVSkjNFJdVT0mRUwsQlRSK0MkTz03LVIrVy1SOFJdTDo2KE87JkVCOFJdSQotTS4jOFArVi1TPTJdQzxHMU4rRyxMPUIgUitDJEAuMyhPLCM0TywzMEAsIzxaLDM4WixDKEA5JiVWOjYxTwotTTlGOEAxN0FQKCIwIDAiQEMqNDk0NiIgUitDJE4sIlhRKCctQzkmNForVzVTPEJdQzhXLE87JkVCK1YtUgotTT0mWE47UCBAOyYwQC5CIEg0VC0kMTJEQC0yWFAoIyRSK1MgWCtTQFkgICAgICJYICQwIDIgICA2PCAgWAotTTlWMUI7NjROOFAgIS1AICAgICQhJDAgICRfICEoMCAgJjAgISFAICAgICAgICAgPSAhLCAkQCAgIDRYIAotTS4nMT88VzFSPTYtVCAgIlYgICAgJiAgICAiSCAjMCAyICAgID0wIFg9RV1DOiYlUjdWVUU7NilFPEAgIAotTTUwICEgIiwgIUAwICAgICAhUCAgICJMICMwIDIgICAgSCAgWD1FXVM6Jl1SPSVdTTk2VUI5NyggICU0IAotTSEgIEMgIDgkICAgICBAPCAgICBJICBUICRAICAgLEQgLic5Pzo2WVQ3VlVFOzYpRTxAICA1MCAnICIsIAotTSFAMCAgICAkIVAgICAiSCAjMCAyICAgIFxQIFg9RV1MO1ZZRzdWVUU7NilFPEAgIDUwICogIiwgIUAwIAotTSAgICghUCAgICJMICMwIDIgICAhJ0AgWD1FXUY7Jl1BPSVdTTk2VUI5NyggICU0ICNAIEMgIDgkICAgIAotTSMgPCAgICBMICBUICRAICAgNEggLic5PzkmXVU4RlFFN1ZVRTs2KUU8QCAgNTAgLyAiLCAhQDAgICAgMAotTSFQICAgIDAgICAgOyAhLCAkQCAgIEZQIC4iWFA5RiVLOTAgIE1AICAgIUAgICAgSiAgVCAkQCAgIDksIAotTS4nOT84VkFBPEVdTTk2VUI5NyggICU0ICAwIEMgIDgkICAgICAgPCAgICBLICBUICRAICAgO1ggLic5PwotTTxWQU88RzE/OzY1TThGNVIgICE1ICAwIChQICYhICAgICAoJyAgICAqMCAtICEoICAgJ0cgI0FWN1ZFTgotTT0lXU05NlVCOTcoICAlNCAhUCBDICA4JCAgICAhIDwgICAgSiAgVCAkQCAgIEEkIC4nOT87Jl1OOVVdTQotTTk2VUI5NyggICU0ICJAIEMgIDgkICAgICIgPCAgICBLICBUICRAICAgQ1AgLic5PzlGUU84NzE/OzY1TQotTThGNVIgICE1ICBYIChQICYhICAgICBQJyAgICArICAtICEoICAgKUggI0FWN1YxTz02KUw5NV1NOTZVQgotTTk3KCAgJTQgI1AgQyAgOCQgICAgJCA8ICAgICQgICAgJyAgNyAhKCAgIC4rICNBVDdXNU46Nl1OICAiVgotTSAgICAiICAgICJIICMwIDIgICAiTEAgWD1FXUM6JiVSN1ZVRTs2KUU8QCAgNTAgISAiLCAhQDAgICAgIAotTSFQICAgIkwgIzAgMiAgICJXMCBYPUVdUzomXVI9JV1NOTZVQjk3KCAgJTQgISAgQyAgOCQgICAgICA8IAotTSAgIEkgIFQgJEAgICBQOCAuJzk/OjZZVDdWVUU7NilFPEAgIDUwICcgIiwgIUAwICAgICAhUCAgICJIIAotTSMwIDIgICAjLCAgWD1FXUw7VllHN1ZVRTs2KUU8QCAgNTAgKiAiLCAhQDAgICAgICFQICAgIkwgIzAgMgotTSAgICM2UCBYPUVdRjsmXUE9JV1NOTZVQjk3KCAgJTQgI0AgQyAgOCQgICAgICA8ICAgIEwgIFQgJEAgIAotTSBYPCAuJzk/OSZdVThGUUU3VlVFOzYpRTxAICA1MCAvICIsICFAMCAgICAgIVAgICAgMCAgICA7ICE8IAotTSRAICAhKkQgLiJYUTlGJUs5MCAgTUAgICAgQCAgICBKICBUICRAICAgXSAgLic5PzhWQUE8RV1NOTZVQgotTTk3KCAgJTQgIDAgQyAgOCQgICAgICA8ICAgIEsgIFQgJEAgICBfTCAuJzk/PFZBTzxHMT87NjVNOEY1UgotTSAgITUgIDAgKFAgJiEgICAgICAnICAgICowIC0gISggICAwRCAjQVY3VkVOPSVdTTk2VUI5NyggICU0IAotTSFQIEMgIDgkICAgICAgPCAgICBKICBUICRAICAhJFggLic5PzsmXU45VV1NOTZVQjk3KCAgJTQgIkAgQwotTSAgOCQgICAgICA8ICAgIEsgIFQgJEAgICEnRCAuJzk/OUZRTzg3MT87NjVNOEY1UiAgITUgIFggKFAgJgotTSEgICAgICAnICAgICsgIC0gISggICAyRSAjQVY3VjFPPTYpTDk1XU05NlVCOTcoICAlNCAjUCBDICA4JAotTSAgICAgIDwgICAgJCAgICAqQCAmICEoICAgMzcgI0FWN1YtSDg3KT85RzVOOFAgIDUwICEgMSQgICEvWAotTSAyJCAgITA4ICAgICEgICAgIyQgIUAgMiAgICUjICBYPUVdUzo2PU45NjE/OFZBQTxFXUY9NllDICAhNQotTSAgKCEkMCAgJSIgISgwICAlJCAgICAgJCAgICAsUCAmICEoICAgNSMgI0FWN1c1TjxWRUc7RjVEN1YtSAotTTg3KT85RzVOOFAgIDUwICMgMSQgICExKCAyJCAgITFIICAgICEgICAgIkwgIUAgMiAgICU8QCBYPUVdUwotTTomXVI9JV1GPTZZQyAgITUgIDAhJDAgICUnICEoMCAgJSkgICAgICQgICAgLEAgJiAhKCAgIDZIICNBVgotTTdXLUk5VllFOSVdUzomXVI9JV1GPTZZQyAgITUgIDQhJDAgICUpQCEoMCAgJStAICAgICQgICAgLSAgJgotTSAhKCAgIDdAICNBVjdXNU48VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCAgJTQgIUAkMSAgIDRQICRBICAgNAotTVggICAgIDAgICAgSSAgOCAkQCAgIUBUIC4nOT86NllUN1Y5VTtGLCAgJTQgIVAkMSAgIDRaICRBICAgNQotTSIgICAgIDAgICAgUCAgOCAkQCAgIUQkIC4nOT88VkVHO0Y1RDdWRU49JV1GPTZZQyAgITUgIEAhJDAgIAotTSUxICEoMCAgJTMgICAgICQgICAgLEAgJiAhKCAgIDlXICNBVjdXNU48VkVHO0Y1RDdWRU49JV1GPTZZQwotTSAgITUgIEQhJDAgICUzQCEoMCAgJTVAICAgICQgICAgKkAgJiAhKCAgIDpFICNBVjdWUU87Rj0/OUc1TgotTThQICA1MCAqIDEkICAhNUAgMiQgICE2ICAgICAhICAgICMkICFAIDIgICAmVkAgWD1FXVM6Nj1OOTYxPwotTTsmXU45VV1GPTZZQyAgITUgIEwhJDAgICU4QCEoMCAgJTpAICAgICQgICAgLFAgJiAhKCAgIDwxICNBVgotTTdXNU48VkVHO0Y1RDdWUU87Rj0/OUc1TjhQICA1MCAsIDEkICAhNlAgMiQgICE3MCAgICAhICAgICJMIAotTSFAIDIgICAnMCAgWD1FXUY7Jl1BPSVdRj02WUMgICE1ICBYISQwICAlPUAhKDAgICU/QCAgICAkICAgIAotTSsgICYgISggICA9UCAjQVY3VjFPPTYpTDk1XUY9NllDICAhNSAgXCEkMCAgJUAgISgwICAlQiAgICAgJAotTSAgICAlMCA1ICEoICAgPk4gKCwgITAkICAgP0ogICAgJTAgJSAhKCAgID46ICgsICEwJCAgID9KICAgIAotTSQgICUgISggICA+SiAlNCAhUCAgICAwICAgIFwgICQgJEAgICFeSCBFMCAgICosICogICAiICAgICAgIAotTSAgICAgICAoICAgICAgICAgICQgICBAICAgICAgICAgIEBAIDxAICAgIlggICAgOSAhLCAkQCAgIidMIAotTS4mUUk7RkwgICs4ICAgIjggICAgKUAgLSAhKCAgIEBJICNBTjk3QVQgICIjICA0ISAgICdaQCBDICA4JAotTSAgICAgIDwgICAgSiAgVCAkQCAgIiUsIC4mUUk7Rk1GPTZZQyAgIiMgIDQhICAgJzwgIEMgIDgkICAgIAotTSEgPCAgICBEICBUICRAICAiJzwgLictVD02OUYgICFSICAgJ0tAIEMgIDgkICAgICIgPCAgICAkICAgIAotTSUwIDUgISggICBCWSAoLCAhMCQgICA/SiAgICAlMCAlICEoICAgQkUgKCwgITAkICAgP0ogICAgJCAgJQotTSAhKCAgIEJVICU0ICFQICAgIDAgICAgXCAgJCAkQCAgIi80IEUwICAgKiwgKiAgICIgICAgICAgICAgIAotTSAgICggICAgICAgICAgJCAgIEAgICAgICAgICAgQEAgPEAgICAiWCAgICA8ICE8ICRAICAiOEQgLicxVQotTTdWUUk7RkwgICs4ICAgIjAgICAgKUAgLSAhKCAgIERXICNBTjk3QVQgICIjICA0ISAgICdaQCBDICA4JAotTSAgICAgIDwgICAgSiAgVCAkQCAgIjYkIC4mUUk7Rk1GPTZZQyAgIiMgIDQhICAgKD5QIEMgIDgkICAgIAotTSAgPCAgICBEICBUICRAICAiODQgLictVD02OUYgICFSICAgKE4wIEMgIDgkICAgICAgPCAgICAkICAgIAotTS5AICQgISggICBHJyAjQE4sRjlBOlY0ICArOCAgICAkIC8sICZQICAgIClCOyc1RSAgICAgICVHPEY1RQotTTtAICAgICAgPEY1RCAgICAgIDAgICAgXiAgMCAkQCAgIkBEIC4mLU87Jl1SPFAgIE1AICAgIDAgXFAgPwotTSAgICAgRyFJO0ZMICAgICAgNyFVPEchTDkwICAgICAgPjY1TDsmXVcgICAgICAwICAgIFIgIDAgJEAgIAotTSJDXCAuIlhTOUYlSzkwICBNQCAgICAwIFxQIDMgICAgIDY5TzxGMCAgICAgICYtSDk3OVkgICAgICAwIAotTSAgIFEgIDAgJEAgICJHMCAuJi1BPEcsICArOCAgICAkIC8sICUgICAgICVQO1cpUzhWQUUgICAgICAhQgotTTs3PCAgICAgISAgICAjKCAhICAyICAgKkpAIFgrQzFGODZNRSAgIlYgICAgISAjUyAhLCAgICAhNSUpNQotTTEwICAgICAgMUQlLDRUNCAgICAgISAgICAhUCAlQCAyICAgKlFAIFg4Rl1POyY1QTtAICA8QCAgIkcwIAotTSAgIFEgIDAgJEAgICJPTCAuJilWODZRUyAgIlYgICAgISAjUyAhLCAgICAhPScpVTkwICAgICAgOUYlTAotTTxWNCAgICAgISAgICAhVCAlQCAyICAgKyYgIFg4Rl1POyY1QTtDKCAgJyggICBLJiAgICAxQCAkICEoIAotTSAgTUIgI0FNOjctTzxGMUU8RjVEICAiViAgICAhICNTICIsICAgICM9JkFSOTY0ICAgICAgJ0lFPEZcIAotTSAgICAgNl1OOTAgICAgICI9Jz1PICAgICAgMCAgICBDICA4ICRAICAiWEQgLiZVQTo2WCAgJTQgIVAkMQotTSAgIDYqICRBICAgOSAgICAgIDAgICAgRyAgPCAkQCAgIlsgIC4nLVA7VylUPFYtQTxAICA8QCAgIkNcIAotTShQICUgUCAgKlZAICAgIEUgIDwgJEAgICJdNCAuJi1MPTZZSzk3KCAgJyggICBIKSAiLCAhMCwgICJLMAotTSAgICAqICAnICEoICAgT10gI0FOO1ZZUDxGRU04NylZICAhUiAgIClRUCBDICA0IyAgIElZICAgICI0IAotTSFQIDIgICAsKEAgWDwnKUk7NiVSPjAgIDxAICAiOEQgKFAgJSBQICAqPzAgICAgRCAgPCAkQCAgIyQ4IAotTS4nNT87JkVOOlAgIDxAICAiLzQgKFAgJSBQICAqTUAgICAgRyAgPCAkQCAgIyZUIC4nLT87JkVOOlAgIAotTUBQICUgMCAgIV5IIChQICUgUCAgKkZAICAgIEYgIDwgJEAgICMpLCAuJzk/PTZZSTtWWFIgICFSICAgIwotTUJQIEMgIDQjICAgSzwgICAgIjQgIVAgMiAgICxOICBYPUVdVTtGRU87QCAgPEAgICBGUCAoUCAlIFAgIAotTSpXQCAgICBHICA8ICRAICAjLVwgLic5PzxXMVI9Ni1ULEAgIDxAICAgNFggKFAgJSBQICAqSSAgICAgRwotTSAgPCAkQCAgIzA4IC4nOT88VzFSPTYtVCwwICA8QCAgICJYIChQICUgUCAgKkdAICAgIE8gIDwgJEAgIAotTSMzNCAuJzk/OSZdVThGUUU3VyFPOjZZVDk3KCAgJiwgIFAkICNQIEMgIDQjICAgSjwgICAgIlggIVAgMgotTSAgIC04UCBYPUVdRjsmXUE9JV1QO1ZFTj0mNVIgICFDICAsISAgWCAoUCAlIFAgICpKUCAgICBWICA8IAotTSRAICAjOUQgLic5Pz02WVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIgICFDICAsISAgUCAoUCAlIFAgIAotTSo+QCAgICBUICA8ICRAICAjPFQgLic5PzxWRUc7RjVEN1ZRTztGPT88Jl1JO0cxRTxAICA4UCAjIDAgKwotTSAiLCAhMCwgICJKUCAgICArMCAnICEoICAgV1ogI0FWN1ZRTztGPT88Jl1JO0cxRTxAICA4UCAjIDAgKgotTSAiLCAhMCwgICJJICAgICAtMCAnICEoICAgWE8gI0FWN1c1TjxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UgotTSAgIUMgICwhICBEIChQICUgUCAgKkJAICAgIFMgIDwgJEAgICNGKCAuJzk/PFZFRztGNUQ3VkVOPSVdUAotTTtWRU49JjVSICAhQyAgLCEgIEAgKFAgJSBQICAqRjAgICAgTCAgPCAkQCAgI0hYIC4nOT86NllUN1chTwotTTo2WVQ5NyggICYsICBQJCAhUCBDICA0IyAgIEonICAgICM8ICFQIDIgICAuUTAgWD1FXVU7Ry1JOVZZRQotTTklXVM6Jl1SPSVdUDtWRU49JjVSICAhQyAgLCEgIDggKFAgJSBQICAqPSAgICAgVSAgPCAkQCAgI09IIAotTS4nOT88VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQ5NyggICYsICBQJCAhMCBDICA0IyAgIEo7ICAgICJYIAotTSFQIDIgICAvKiAgWD1FXVM6Jl1SPSVdUDtWRU49JjVSICAhQyAgLCEgIDAgKFAgJSBQICAqS1AgICAgVgotTSAgPCAkQCAgI1VYIC4nOT89NllTOjY9Tjk2MT84VkFBPEVdUDtWRU49JjVSICAhQyAgLCEgICwgKFAgJQotTSBQICAqRUAgICAgVCAgPCAkQCAgI1koIC4nOT88VkVHO0Y1RDdWLUg4Nyk/PCZdSTtHMUU8QCAgOFAgIwotTSAwICIgIiwgITAsICAiSyAgICAgKzAgJyAhKCAgIF5fICNBVjdWLUg4Nyk/PCZdSTtHMUU8QCAgOFAgIwotTSAwICEgIiwgITAsICAiSTQgICAgKSAgISAhKCAgIF9DICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIAotTTUwIC8gICAgKyAgJyAhKCAgISAvICNBVjdWMU89NilMOTVdQTxHKUE+MCAgPEAgICNbXCAoUCAlIFAgIAotTSo/QCAgICBEICAkICRAICAkIywgRTAgICAqLCAkICAgIiAgICAgICAgICAhIiAhNSAgWCAgICBLICA8IAotTSRAICAkJVggLic5PzlGUU84NzE/ODcpUjg3RCAgJyggICEgLyAiLCAhMCwgICJKVCAgICApICAhICEoIAotTSAhIiIgKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgLCAgICAsUCAnICEoICAhIlUgI0FWN1c1TgotTTxWRUc7RjVEN1ZRTztGPT84NylSODdEICAnKCAgISE+ICIsICEwLCAgIkhQICAgICkgICEgISggICEjOQotTSApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCArICAgICwwICcgISggICEkKiAjQVY3Vy1JOVZZRQotTTklXUw7VllHN1YlUjxGJVkgICFSICAgME0wIEMgIDQjICAgSiQgICAgIjAgIDAgMiAgIDErQCI1ICAgIAotTUhQIDAgICAoICAgICAgICAgICQoICU0ICJAICAgIkggIVAgMiAgIDE2ICBYPUVdTDtWWUc3ViVSPEYlWQotTSAgIVIgICAxIkAgQyAgNCMgICBKUSAgICAiMCAgMCAyICAgMT8gIjUgICAgSFAgMCAgICggICAgICAgIAotTSAgJCggJTQgIjAgICAjKCAhUCAyICAgMUtAIFg9RV1VO0ctSTlWWUU5JV1JO0cxPzg3KVI4N0QgICcoIAotTSAhJTggIiwgITAsICAiSEAgICAgKSAgISAhKCAgIScyICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIAotTTUwICggICAgLCAgJyAhKCAgISgiICNBVjdXLUk5VllFOSVdSTtHMT84NylSODdEICAnKCAgISZOICIsIAotTSEwLCAgIkk8ICAgICkgICEgISggICEoRiApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCAnICAgIAotTSowICcgISggICEpLyAjQVY3VkVOPSVdQTxHKUE+MCAgPEAgICRAKCAoUCAlIFAgICo+UCAgICBEICAkIAotTSRAICAkRywgRTAgICAqLCAkICAgIiAgICAgICAgICAhIiAhNSAgOCAgICBUICA8ICRAICAkSjwgLic5PwotTT02WVM6Nj1OOTYxPzxWQU88RzE/ODcpUjg3RCAgJyggICEpLyAiLCAhMCwgICJJMCAgICApICAhICEoIAotTSAhKysgKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgJSAgICAsQCAnICEoICAhK10gI0FWN1ctSQotTTlWWUU5JV1TOiZdUj0lXUE8RylBPjAgIDxAICAkSjwgKFAgJSBQICAqQUAgICAgRCAgJCAkQCAgJFIkIAotTUUwICAgKiwgJCAgICIgICAgICAgICAgISIgITUgIDAgICAgSyAgPCAkQCAgJFRQIC4nOT88VkFPPEcxPwotTTg3KVI4N0QgICcoICAhK10gIiwgITAsICAiSSwgICAgKSAgISAhKCAgIS1QICk0ICAgIkMgISAgICBAIAotTSAgICAgICAgIDBAIDUwICMgICAgLFAgJyAhKCAgIS5DICNBVjdXNU48VkVHO0Y1RDdWLUg4Nyk/ODcpUgotTTg3RCAgJyggICEtLCAiLCAhMCwgICJHKCAgICApICAhICEoICAhLycgKTQgICAiQyAhICAgIEAgICAgIAotTSAgICAgMEAgNTAgIiAgICAsMCAnICEoICAhL1ggI0FWN1ctSTlWWUU5JV1DOiYlUjdWJVI8RiVZICAhUgotTSAgIDNIUCBDICA0IyAgIEoiICAgICIwICAwIDIgICA0JyAiNSAgICBIUCAwICAgKCAgICAgICAgICAkKAotTSAlNCAgMCAgICJIICFQIDIgICA0MUAgWD1FXUM6JiVSN1YlUjxGJVkgICFSICAgM14gIEMgIDQjICAgSgotTUogICAgIjAgIVAgMiAgIDQ6QCBYPUVdRDtXNUI7JjQgICU0ICNQIEMgIDQjICAgSVYgICAgIiwgIVAgMgotTSAgIDRDMCBYPUVdRjsmXUE9ICAgNTAgLiAiLCAhMCwgICJILCAgICAqUCAnICEoICAhMlggI0FWN1c1TgotTTxWRUc7RjVEN1ZRTztGPCAgJTQgIyAgQyAgNCMgICBKMiAgICAiRCAhUCAyICAgNFgwIFg9RV1TOjY9TgotTTk2MT87Jl1OOVAgIDUwICsgIiwgITAsICAiRywgICAgKEAgJyAhKCAgITQjICNBVjdWUU87RjwgICU0IAotTSJAIEMgIDQjICAgSi4gICAgIkggIVAgMiAgIDUrMCBYPUVdVTtHLUk5VllFOSVdSTtHMCAgJTQgIjAgQwotTSAgNCMgICBJUCAgICAiQCAhUCAyICAgNTUwIFg9RV1TOjY9Tjk2MT86NllUICAhNSAgQCAoUCAlIFAgIAotTSo8MCAgICBBICA8ICRAICAlNzggLic5Pzo2WVQgICE1ICA8IChQICUgUCAgKj4gICAgIEwgIDwgJEAgIAotTSU6KCAuJzk/PTZZUzo2PU45NjE/PFZBTzxHMCAgJTQgIUAgQyAgNCMgICBJVSAgICAiSCAhUCAyICAgNQotTVMgIFg9RV1TOjY9Tjk2MT88VkFPPEcwICAlNCAhMCBDICA0IyAgIEorICAgICIsICFQIDIgICA1W1AgWAotTT1FXVM6Jl1SPSAgIDUwICQgIiwgITAsICAiSFwgICAgKlAgJyAhKCAgITg6ICNBVjdXNU48VkVHO0Y1RAotTTdWLUg4NyggICU0ICBQIEMgIDQjICAgSiJAICAgIkQgIVAgMiAgIDYwUCBYPUVdUzo2PU45NjE/OFZBQQotTTxAICA1MCAiICIsICEwLCAgIkkkICAgIChAICcgISggICE5RSAjQVY3Vi1IODcoICAlNCAgMCBDICA0IwotTSAgIEpTICAgICAwICAgICcgICAgICAgIkRAICAkXyAgICAhWV9fXCAgICAoICAgID5PX18gICAgLCAgIAotTSAnT19fUCAgICVAICAgIV1fX1wgICAiICAgICA/T19fICAgIEogICAgJ19fX1AgICAtICAgICIhX19cIAotTSAgI1ggICAgQE9fXyAgICEoICAgICgvX19QICAgNEAgICAiJV9fXCAgICVQICAgIEFPX18gICAhRiAgIAotTSAoP19fUCAgIDwgICAgIilfX1wgICAnSCAgICBCT19fICAgIiQgICAgKytfX1AgICBDQCAgICJVX19cIAotTSAgKSQgICAgTU9fXyAgICIzICAgICs/X19QICAgRUAgICAiWV9fXCAgIClEICAgIE5PX18gICAiPCAgIAotTSArT19fUCAgIEdQICAgIl1fX1wgICAqKCAgICBPT19fICAgIkUgICAgK19fX1AgICBKICAgICMhX19cIAotTSAgKkwgICAgUE9fXyAgICJOICAgICwvX19QICAgTDAgICAjJV9fXCAgICswICAgIFFPX18gICAiWCAgIAotTSAsR19fUCAgIE8gICAgIypfX1wgICAsICAgICBSX19fICAgIyQgICAgLFdfX1AgICBSICAgICMuX19cIAotTSAgLFAgICAgU19fXyAgICMwICAgIC0nX19QICAgVSAgICAjMl9fXCAgIC1AICAgIFRfX18gICAjPCAgIAotTSAtN19fUCAgIFggICAgIzZfX1wgICAuMCAgICBVX19fICAgI0ggICAgLUdfX1AgICBbICAgICM6X19cIAotTSAgLyAgICAgVy9fXyAgICNUICAgIC1XX19QICAgXiAgICAjPl9fXCAgIC9QICAgIFgvX18gICAkICAgIAotTSAuJ19fUCAgISEgICAgI0JfX1wgICAwQCAgICBZL19fICAgJCwgICAgLjdfX1AgICEkICAgICNGX19cIAotTSAgMTAgICAgWi9fXyAgICQ4ICAgIC5HX19QICAhJyAgICAjSl9fXCAgIDIgICAgIFsvX18gICAkRCAgIAotTSAuV19fUCAgISogICAgI09fX1wgICAyUCAgICBcL19fICAgJE8gICAgLydfX1AgICEsQCAgICNSX19cIAotTSAgMzQgICAgXS9fXyAgICRYICAgIC87X19QICAhLyAgICAjV19fXCAgIDNQICAgICAvX18gICAlJCAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkIAotTSAgICEgICAgIEAgICQtMCAgICM0ICAgICRQICAgICAgICAgICAgICAgMCAgICAgICAgICkgICAgITAgIAotTSAgKCAgISNIICAgIFogICAgJEAgICAgIyAgICAgICAgICAwICAgICQgICAgI1AgICAgTCAgICAiICAgMQotTSwgICAgMyAgICAjMCAgICAhICAgICAoICAgICQgICAgJCAgICAhPCAgICAjICAgICBAICAkQCAgICAoIAotTSAgICA+UCAgICAgICAgICAgICAgIDAgICAgICAgICA/ICAgICEgICAgICggICEpXCAgICI/ICAgICMgIAotTSAgICMgICAgIVAgICAgMCAgICAsICAgICowICAgIFAgICAgJiAgIDJMICAgIEsgICAgIDAgICAgICAgIAotTSAgICAgICAwICAgICIgICAgIlwgICAgLCAgICAhQCAgJEwgICAgKyAgICAgQCAgICAgICAgICAgICAgIAotTSQgICAgIEAgICAgVCAgICAjICAgICA4ICAhLSAgICAjMCAgICE8ICAgICAgICAgICAgICAgISAgICAgKAotTSAgICAuQCAgICBQICAgICYgICA5ICAgICIwICAgICAwICAgICAgICAgICAgICAgMCAgICAiICAgICQgIAotTSAgICEgICAgIEAgICYxICAgIEQwICAgICUgICAgICAgICAgICAgICAiICAgICAgICAgISggICAgIDAgIAotTSAgLCAgIkREICAgKSkgICAgIEAgICAgICAgICAgICAgICAwICAgICAgICAgM0AgICAgJCAgICAjICAgSQotTSwgICAiMyAgICAgPCAgICAgICAgICAgICAgIDAgICAgISAgICAlLCAgICAmICAgICBQICAqNFAgICBFLAotTSAgICA8ICAgICAwICAgICAgICAgISAgICAgQCAgICE8ICAgICIgICAgICwgICJHICAgIClQICAgIDwgIAotTSAgICAgICAgICAgICAgQCAgICAgICAgIDgwICAgICggICAgICAgICAgICAgIjwgICAgPCAgICAgJCAgIAotTSAhUCAgICAkICAgICQgICAgJkQgICAgIyAgICAgICAgICAgICAhIyAgICAkVDAgICAgICAgICAgICAgIAotTSAwICAgICAgICAhUSAgICAgUCAgICAgICAgICAgICA1RDAgICApJCAgICAgICAgICAgICAgICQgICAgIAotTSAgICA+UCAgICAkICAgICAgICAgICAgICVCKCAgIDBOICAgICAgICAgICAgICAgISAgICAgICAgICgwIAotTSAgICEgICAgICAgICAgICAgIUkwICAgNjwgICAgICAgICAgICAgICAhICAgICAgICAgIisgICAgIDAgIAotPiAgICAgICAgICAgUFAgICAgSSggICAgICAgICAgICAgICAkICAgICAKLSAKLWVuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWFvdXQudSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTY4ay1hb3V0LnUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOTVmYzAuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWFvdXQudQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi1iZWdpbiA3NzcgbTY4ay1hb3V0Ci1NICAgISJQICAkICAgICEgICAgICAgICAgIyRAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICRZNl9fIShVU0IgMl5YICEkR00gIDBGMyRKPDlPUllUVjQiNjhQQ1MgICAkIDBPLjAgICQgME8iUlw1Ci1NOD9cICAgJSJXT1AgIyJcIDg/XCAgIC0uNihdLFtDQiBfXyEuN0RZVTNFOCAgJFk+M0c0ICAkQC4gICAgCi1NICRDNyAgIVAgJiAgICApLjdEWVUyIFggICAgIDItPCAgJyAgOCAgICBEWT4zRzUoI0AgICAgIShVUCAgCi1NPCAhQCAgICIzRVkuPTRALiAgICAgJEM3ICAhUCAmICAgICkuN0RZVTIgWCAgICAgMi08ICAnICA4ICAgCi1NIERZPjNHNSgjQCAgICAhKFVQICA8ICFAICAgIjNFWS49NEAuICAgICAkQzcgICEiQCYgICAgKS43RFlVCi1NMiBYICAgICAyLTwgICQqIDggICAgRFk+M0c1KCNAICAgICEoVVAgIDBIIUAgICAiM0VZLj00QC4gICAgCi1NICRDNyAgISJAJiAgICApLjdEWVUyIFggICAgIDItPCAgJCogOCAgICBEWT4zRzUoI0AgICAgIShVUCAgCi1NMEghQCAgICIzRVkuPTRALiAgICAgJEM3ICAjUiAlUC84ICAgIERZPjNHNSgjQCAgICAhKFVQICBcQCE8Ci1NI1YgICAgKS43RFlVMiBYICAgICAyLTwgICQoWSAgIDAtIS9cICAkICAhIFYkX1AgIEAgICQjQFNfICAjCi1NICAgMC5DL1wgIDAgICEgXCxfUCAhMCAgJCNZUCFCLyAgICAwMCcgJyhcICAgISEkPCBAQ1AgICAkJEFQCi1NIjIvICAgIDAzJyAqKFwgICAhITA8IExDUCAgICQlMENfJCsoICAgICAhITgoX1EgOjAgICAgIDA3Ii9cCi1NICAgICAgICAkJiAzXjAgICQjMCAgISFEJF9EICAhIFYgICAwOUEvWSAgIDAuICAgJCZAU14wICAkI0ggCi1NICEhTCxfRCAgISBcICAgMDwjL1kgICAwL0AgICQnMENeMCAgJCQgICAhIVwoX0QgICEhJCAgIDBBIi9ZCi1NICAgMDIgICAkKFBDXjAgICQkUCAgISI0KF9EICAhITAgICAwRyIvWSAgIDA1ICAgJCowQ14wICAkJUAgCi1NICEiTChfRCAgISE8ICAgME0iL1kgICAwOCAgICQrQENfICAgJCMwICAhIyQoX1AgICEgViAgIDBSIi9cCi1NICAgMC4gICAkLFBDXyAgICQjSCAgISMwKF9QICAhIFwgICAwVSIvXCAgIDAvQCAgJC1AQ18gICAkJCAgCi1NICEjPChfUCAgISEkICAgMFgiL1wgICAwMiAgICQuMENfICAgJCRQICAhI0goX1AgICEhMCAgIDBbIi9cCi1NICAgMDUgICAkLyBDXyAgICQlQCAgISNUKF9QICAhITwgICAwXicgIihcICAgISc0PCAoQ1AgICAkPUFQCi1NIDIvICAgIDFYJyAhKFwgICAhJzwoX0QgICEkXCAgIDExIy9ZICAgMSsgICAkMzEuN0RZVTAiQEMqNjFCCi1NPidBWCtHLCktMlhSKCJBIjk3KUs5NlFFPjJEQC1SXFEsQlxYLTAgIDInRCAgISdIKCdEICAhJ0QzSSE4Ci1NQ1RZUiJIUS41QCAgOD9cICAgIDYrUlggIiYnXyAgICAlJUIvM0VZLj0wICAzRTggICRZPjNHNS41QCAgCi1NPCAlLjAiLyAgICAzWScjXzNFWS49MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAhICwgICAgICRZVSAgISAqIixJOFcpVCwiWUMiMzBOLUIgSDBGNVI6VjVMOTdESSgjLE8sUyBPCi1NLiMsICAgICAgICAhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAhIDAgICYwICAgICAgICAgIlAwICApKCAgICE0ICAgICRWMCAgICAgICAhNCAgICAmWCAgCi1NICAgICAgICAgICAgLzggICAgICAgICAgICAgIDNYICAgICAgICAgICAgICA8SCAgICAgICAgICAgICAgCi1NQyggICAgICAgICAgICAgIElYICAgICAgICAgICAgICBROCAgICAgICAgICAgICAgV1ggICAgICAgICAgCi1NICAgIF4oICAgICAgICAgICAgICEiOCAgICAgICAgICAgICAhJyggICAgICAgICAgICAgISooICAgICAgCi1NICAgICAgICEsQiAgICAkICAgICAgICAhLyIgICAgJCAgICAgICAgITMyICAgICQgICAgICAgICE4IiAgCi1NICAoICAgICAgICAhOlIgICAgKCAgICAgICAgIT8yICAgICggICAgICAgICFEMiAgICAwICAgICAgICAhCi1NRkIgICAgMCAgICAgICAgIUpCICAgIDAgICAgICAgICFPIiAgICAwICAgICAgICAhUUIgICAgMCAgICAgCi1NICAgIVVSICAgIDAgICAgICAgICFaQiAgICAwICAgICAgICAhXTIgICAgQCAgICAgICAgIiBCICAgICQgCi1NICAgICAgICInMiAgICAkICAgICAgICAiLTIgICAgJCAgICAgICAgIjYyICAgICggICAgICAgICI9MiAgCi1NICAoICAgICAgICAiQ0IgICAgKCAgICAgICAgIkxSICAgIDAgICAgICAgICJTMiAgICAwICAgICAgICAiCi1NWSIgICAgMCAgICAgICAgIyFSICAgIDAgICAgICAgICMmIiAgICAwICAgICAgICAjLCIgICAgMCAgICAgCi1NICAgIzJCICAgIDAgICAgICAgICM5QiAgICBAICAgICAgICAjQSIgICAgJCAgICAgICAgI0ZCICAgICQgCi1NICAgICAgICNNIiAgICAkICAgICAgICAjVFIgICAgKCAgICAgICAgI1pCICAgICggICAgICAgICQhMiAgCi1NICAoICAgICAgICAkKTIgICAgMCAgICAgICAgJC5CICAgIDAgICAgICAgICQ0UiAgICAwICAgICAgICAkCi1NPDIgICAgMCAgICAgICAgJEEiICAgIDAgICAgICAgICRHQiAgICAwICAgICAgICAkTkIgICAgMCAgICAgCi1NICAgJFQyICAgIEAgICAgICAgICRaSCAgICFDX19fTCUgICAlQFIgICAhQCAgICAgICAgJUQyICAgIUAgCi1NICAgICAgICYqWCAgICBDX19fTCUgICAmTyIgICAgQCAgICAgICAgJlIiICAgIEAgICAgICAgICc2QjAgCi1NICAkICAgITQgICAgICQwICAnRCAgICE+ICAgJzoyMCAgICQgICAhSCAgICAgJDAgICdIICAgIVIgICAnCi1NP1IwICAgJCAgICFcICAgICAkMCAgJ0wgICAiJiAgICdFUjAgICAoICAgIjAgICAgICQwICAnVCAgICI6Ci1NICAgJ0lSMCAgICggICAiRCAgICAgJDAgICdYICAgIk4gICAnT0IwICAgKCAgICJYICAgICAkMCAgJ1wgCi1NICAjIiAgICdVUjAgICAwICAgIywgICAgICQwICAoJCAgICM2ICAgJ1kyMCAgIDAgICAjQCAgICAgJDAgCi1NICgoICAgI0ogICAnXkIwICAgMCAgICNUICAgICAkMCAgKCwgICAjXiAgICgkMjAgICAwICAgJCggICAgCi1NICQwICAoNCAgICQyICAgKCgiMCAgIDAgICAkPCAgICAgJDAgICg4ICAgJEYgICAoLUIwICAgMCAgICRQCi1NICAgICAkMCAgKDwgICAkWiAgICgzQjAgICAwICAgJSQgICAgICQwICAoRCAgICUuICAgKDdCMCAgIEAgCi1NICAlOiAgICAgJDAgIChIICAgJUQgICAoPCggICApQ19fX0wlICAgKFciICAgKUAgICAgICAgIChZWCAgCi1NICkjX19fTCUgICApKVIgICApICAgICAgICAgKSxCICAgIDAgICAgICAgICk1SCAgICAzX19fTCUgICApCi1NPzIgICAgMCAgICAgICAgKUMiICAgIDAgICAgICAgIClKSCAgICAzX19fTCUgICApUUIgICAgMCAgICAgCi1NICAgKVUoICAgIDNfX19MJSAgIClcSCAgICAzX19fTCUgICAqI0ggICAgM19fX0wlICAgKiZYICAgIDNfCi1NX19MJSAgICoyIjAgICAwICAgJVAgICAgICQwICArKCAgICVaICAgICAkMCAgKywgICAlWiAgICAgJDAgCi1NICswICAgJVogICAgICQwICArNCAgICVaICAgICAkMCAgKzggICAmICAgICAgJDAgICs8ICAgJiggICAgCi1NICQwICArQCAgICYwICAgICAkMCAgK0QgICAmMCAgICAgJDAgICtIICAgJjggICAgICQwICArTCAgICZACi1NICAgICAkMCAgK1AgICAmSCAgICAgJDAgICtUICAgJkggICAgICQwICArWCAgICZQICAgICAkMCAgK1wgCi1NICAmWCAgICAgJDAgICwgICAgJyAgICAgICQwICAsJCAgICcgICAgICAkMCAgLCggICAnKCAgICAgJDAgCi1NICwsICAgJzAgICAgICQwICAsMCAgICc4ICAgICAkMCAgLDQgICAnOCAgICAgJDAgICw4ICAgJ0IgICAgCi1NICQwICAsPCAgICdWICAgICAkMCAgLEAgICAnViAgICAgJDAgICxEICAgJ1YgICAgICQwICAsSCAgICggCi1NICAgICAkMCAgLEwgICAoKiAgICAgJDAgICxQICAgKDQgICAgICQwICAsVCAgICg0ICAgICAkMCAgLFggCi1NICAoPiAgICAgJDAgICxcICAgKEggICAgICQwICAtICAgIChSICAgICAkMCAgLSQgICAoUiAgICAgJDAgCi1NIC0oICAgKFwgICAgICQwICAtLCAgICkmICAgICAkMCAgLTAgICApMCAgICAgJDAgIC00ICAgKTAgICAgCi1NICQwICAtOCAgICk6ICAgICAkMCAgLTwgICApRCAgICAgJDAgIC1AICAgKU4gICAgICQwICAtRCAgIClOCi1NICAgICAkMCAgLUggICApWCAgICAgJDAgIC1MICAgKiwgICAgICQwICAtUCAgICosICAgICAkMCAgLVQgCi1NICAqNiAgICAgJDAgIC1YICAgKkAgICAgICQwICAtXCAgICpKICAgICAkMCAgLiAgICAqSiAgICAgJDAgCi1NIC4kICAgKlQgICAgICQwICAuKCAgICpeICAgICAkMCAgLiwgICArKCAgICAgJDAgIC4wICAgKyggICAgCi1NICQwICAuNCAgICsyICAgICAkMCAgLjggICArPCAgICAgJDAgIC48ICAgK0YgICAgICQwICAuQCAgICtGCi1NICAgICAkMCAgLkQgICArUCAgICAgJDAgIC5IICAgK1ogICAgICQwICAuTCAgICwkICAgICAkMCAgLlAgCi1NICAsJCAgICAgJDAgIC5UICAgLC4gICAgICQwICAuWCAgICw4ICAgICAkMCAgLlwgICAsOCAgICAgJDAgCi1NIC8gICAgLEAgICAgICQwICAvJCAgICxIICAgICAkMCAgLyggICAsUCAgICAgJDAgIC8sICAgLFggICAgCi1NICQwICAvMCAgICxYICAgICAkMCAgLzQgICAtIiAgICAgJDAgIC84ICAgLSIgICAgICQwICAvPCAgIC0sCi1NICAgKjQgMCAgLzwgICAtMCAgICo1IDAgICAgICAgLTAgICAqNyAwICAgICAgIC4oICAgKjhQMCAhTiggCi1NICAuRCAgICo6UDAgIFk4ICAgLkwgICAqPFAwICFOKCAgIC5UICAgKj8gPCAhNyggICEgJCAgICpBMDQgCi1NITBYICAgICAgICAqQlA0ICBXWCAgICVQICAgKkQwNCAgWiAgICAuKCAgICpFUDQgIUJYICAgISogICAqCi1NSFA8ICApKCAgISAoICAgKkpARCAhVDggICEgVCAgICpMQEQgIV5YICAhIFYgICAqUDBEICEmOCAgISBYCi1NICAgKlRARCAhWUggICEgWiAgICpWUEQgICRQICAhIFwgICAqWlBEICA9SCAgISBeICAgKl8wRCAhXyAgCi1NICEhICAgICshIEQgIiQwICAhISQgICArJEBEICFIICAgISEoICAgKyhARCAhW0QgICEhLCAgICsqQEQgCi1NIiYkICAhITAgICArLjBEICEtRCAgISE0ICAgKzJARCAhTEAgICEhOCAgICs0UEQgITZMICAhITwgICArCi1NNzBEICFXLCAgISFEICAgKzpQRCAhRVQgICEhRiAgICtAIEQgISZEICAhIUggICArRVBEICBJRCAgISFMCi1NICAgK0lARCAgJlQgICEhUCAgICtPIEQgITIsICAhIVQgICArVSBEICFNVCAgISFcICAgK1gwRCAgQCwgCi1NICEiJCAgICtdMEQgIDBEICAhIiwgICAsIlBEICA7TCAgISI0ICAgLCYwRCAgKjQgICEiPCAgICwrQEQgCi1NIVRcICAhIkQgICAsMTBEICA8VCAgISJMICAgLDUgRCAgK0QgICEiVCAgICw5IEQgIiUoICAhIyQgICAsCi1NPSBEICBfSCAgISMoICAgLEJQRCAhLEAgICEjLCAgICxJIEQgIUI4ICAhIzAgICAsTTBEICFBMCAgISM0Ci1NICAgLFMwRCAhWlAgICEjOCAgICxZUEQgIT9IICAhIzwgICAsXUBEICBcWCAgISNAICAgLSMgRCAiKDAgCi1NICEjRCAgIC0pIEQgIEpYICAhI0ggICAtLSBEICFPMCAgISNMICAgLTJQRCAhXCggICEjUCAgIC05IEQgCi1NIE84ICAhI1QgICAtPTBEICFUMCAgISNYICAgLUFQRCAhUkwgICEjXCAgIC1EQEQgIVJQICAhJDQgICAtCi1NRzBEICFcOCAgISRMICAgLUlARCAhUiAgICEkVCAgIC1MIDQgIFpMICAgITQgICAtTzA0ICFWXCAgICFICi1NICAgLVQwNCAhRzQgICAhXCAgIC1ZUDQgIThUICAgIjAgICAtXTA0ICEnPCAgICJEICAgLiJANCAgSCwgCi1NICAiWCAgIC4oMDQgIVpcICAgIywgICAuKzA0ICAvLCAgICNAICAgLjAgNCAhLDQgICAjVCAgIC41MDQgCi1NICxcICAgJCggICAuOEA0ICEpLCAgICQ8ICAgLj1ANCAgWUQgICAkUCAgIC5DIDQgITI8ICAgJSQgICAuCi1NRkA0ICEpVCAgICU6ICAgLkowRCAhVDQgICEkXCAgIC5MMEQgIVg0ICAhJSQgICAuTjBEICFcXCAgISc0Ci1NICAgLlBARCAgRzwgICEnOCAgIC5TQEQgISlYICAhJzwgICAuVVBEICBPQCAgISdAICAgLlhARCAgMjwgCi1NICEnRCAgIC5aUDQgIDpEICAgLVQgICAuXSA0ICA7MCAgIC4kICAgLl8wPCAhLDggICEgUCAgIC8hUDQgCi1NIFk4ICAgLkQgICAvJDA0ICFOKCAgIC5MICAgLyYgNCAiIVAgICAuVCAgIC8nUEQgIVk8ICAhL0QgICAvCi1NKUYtUj0jIE47UCFHOSYpTTkyWU8gJj1EOEZVRStGLCA6NllULkcwUS83KFEuUlRSLDMwVy0jQFMtQzBYCi1NLlMoUS0jPFQuIyxWLSM8WyAmLUg4NyhaPSMoXTxDKFssI0xRLEM8WyAmUU87RjxaPSMsXTxDJFsrMyhRCi1NLSM8VC4jLFYtI0BbLEMkVC1TMFgsUzhULVNMIDxWQU88RzBaPSMwXTxDJFsrMyxSLVM4WC5TLFItUzhXCi1NLlAhVTtHLUk5VllFOSIhQzomJVIuRzBVLzcoUS5TIFssQzRVLlAhVTtHLUk5VllFOSIhUzomXVI9I0lUCi1NLUNVUiwzTFAuUzhVLTMsVS5QIVU7Ry1JOVZZRTkiIUw7VllHLkcwVy83KFEuUyBbKzMkWyAnNU48VkVHCi1NO0Y1RCgmRU49I0lULiNVUiwzTFAuUlRRLlAhRjsmXUE9I0lULjNVUiwzTFQuUyBbICYxTz02KUw5M0lUCi1NLDMgXTxDJFsuI0xQLlAhVjtWRUQuRzBRLDNUUSwwIF8vU1xaPSMkUi8zJCA9RV1DOiYlUi5EPFIgJzk/Ci1NPFZFRztGNUQ3Vi1IODcoWjFTKCA9RV1VO0ctSTlWWUU5JV1DOiYlUi5EPFUgJzk/PFZBTzxHMFoxUzAgCi1NPUVdUzo2PU45NjE/PFZBTzxHMFoxUzAgPUVdVTtHLUk5VllFOSVdUzomXVI9I0knLUAhVjdWRU49I0knCi1NLDAhVjdXLUk5VllFOSVdSTtHMFoxUyQgPUVdVTtHLUk5VllFOSVdSTtHMFoxU0AgPUVdTDtWWUcuRDxRCi1NICc5PzxWRUc7RjVEN1ZRTztGPFoxUyQgPUVdVTtHLUk5VllFOSVdTDtWWUcuRDxYICc5PzlGUU84NzBaCi1NMVNEID1FXUQ7VzVCOyY0WjFTJFAgJzk/OFZBQTxFXUE8RylBPjNJJywzLF04NyhRLlMgWywzTFIgJzk/Ci1NPFZFRztGNUQ3Vi1IODcpPzg3KVI4N0RaMVMkUyAnOT89NllTOjY9Tjk2MT84VkFBPEVdQTxHKUE+M0knCi1NLDMwXTg3KFEuUyBbLDNMVSAnOT88VkFPPEcxPzg3KVI4N0RaMVMkVS82JVIsM0xQLlMkWy0gIVY3Vy1JCi1NOVZZRTklXVM6Jl1SPSVdQTxHKUE+M0knLDM0ID1FXVU7Ry1JOVZZRTklXVM6Jl1SPSVdQTxHKUE+M0knCi1NLDM4XTg3KFEuUyBbLDNMViAnOT86NllUN1YlUjxGJVkuRDxRLVNVQTxDJFssI0xRLlMkID1FXVM6Nj1OCi1NOTYxPzo2WVQ3ViVSPEYlWS5EPFEtUCFWN1c1TjxWRUc7RjVEN1ZFTj0lXUE8RylBPjNJJywzQF04NyhRCi1NLlMgWywzTFggJzk/OyZdTjlVXUE8RylBPjNJJywzPCA9RV1TOjY9Tjk2MT87Jl1OOVVdQTxHKUE+M0knCi1NLDM8ID1FXVU7Ry1JOVZZRTklXUw7VllHN1YlUjxGJVkuRDxRLiAhVjdWOUw7ViVUN1YlUjxGJVkuRDxRCi1NLjNVQTxDJFssI0xRLlNEID1FXUQ7VzVCOyY1Pzg3KVI4N0RaMVMoUC82JVIsM0xQLlMkWywzICA9RV1DCi1NOiYlUjdXIU86NllUOTcoWjFTKFEvMkhSICc5PzxWRUc7RjVEN1YtSDg3KT88Jl1JO0cxRTxDSScsQyQgCi1NPUVdVTtHLUk5VllFOSVdQzomJVI3VyFPOjZZVDk3KFoxUyhSLzJIVSAnOT88VkFPPEcxPzwmXUk7RzFFCi1NPENJJyxDLF0qQzAgPUVdUzo2PU45NjE/PFZBTzxHMT88Jl1JO0cxRTxDSScsQywgPUVdVTtHLUk5VllFCi1NOSVdUzomXVI9JV1QO1ZFTj0mNVIuRDxSLSNUSi1AIVY3VkVOPSVdUDtWRU49JjVSLkQ8Ui0zVEosMCFWCi1NN1ctSTlWWUU5JV1JO0cxPzwmXUk7RzFFPENJJyxDNCA9RV1VO0ctSTlWWUU5JV1JO0cxPzwmXUk7RzFFCi1NPENJJyxDOF0qQ0AgPUVdTDtWWUc3VyFPOjZZVDk3KFoxUyhVICc5PzxWRUc7RjVEN1ZRTztGPT88Jl1JCi1NO0cxRTxDSScsQzQgPUVdVTtHLUk5VllFOSVdTDtWWUc3VyFPOjZZVDk3KFoxUyhWICc5PzlGUU84NzE/Ci1NPCZdSTtHMUU8Q0knLEM8XSpDRCA9RV1EO1c1QjsmNT88Jl1JO0cxRTxDSScsQ0BdKkMkUCAnMT88VzFSCi1NPTYtVC5FMFIuM1VTLEMxVjdWLUg4Nyk/OzY1TThGNVIuQyhMLCJQWC5XOT88VkFPPEcxPzs2NU04RjVSCi1NLkMwTCwzOEwsMzhbPUVdSTtHMT87NjVNOEY1Ui5DJEwsUyhMLFMoWz1FXUw7VllHN1ZVRTs2KUU8Q0hRCi1NKyM4VCsjLFIuVzk/OUZRTzg3MT87NjVNOEY1Ui5DREwuMzhMLFMoWz1FXUQ7VzVCOyY1Pzs2NU04RjVSCi1NLkMkUCsjJFIuIlBWLSNMWyAnOT88VzFSPTYtVCwzSScsQ0QgPUVdUz0nKVU4VzBSLkQ8UywjVVMsQzFWCi1NN1YtSDg3KT87NjVNOEY1Ui5DKEwsIlBYLlc5PzxWQU88RzE/OzY1TThGNVIuQzBMLDM4TCwzOFs9RV1JCi1NO0cxPzs2NU04RjVSLkMkTCxTKEwsUyhbPUVdTDtWWUc3VlVFOzYpRTxDSFErIzhUKyMsUi5XOT85RlFPCi1NODcxPzs2NU04RjVSLkNETC4zOEwsUyhbPUVdRDtXNUI7JjU/OzY1TThGNVIuQyRQKyMkUi4iUFYtI0xbCi1NICcxPz02WUk7VlhaNSMsUS83NFg9RV1DOiYlUjdWVUU7NilFPENIUisjIEwuI01WN1ctSDtXKVQ3VlVFCi1NOzYpRTxDSFQrIyBMLDM4Wz1FXUk7RzE/OzY1TThGNVIuQyRMLCJQUyxDTVY3VlFPO0Y9Pzs2NU04RjVSCi1NLkMkTCwiUFMsQ01WN1Y5TDtWJVQ3VlVFOzYpRTxDSFkrIyBMLFMoWz1FXUQ7VzVCOyY1Pzs2NU04RjVSCi1NLkMkUCsjIEwtQzBbLlAhVjdXNU46Nl1OLkQ8UywwIVY3VzVOOjZdTixDSScsUyhdPTNBVjdWLUg4Nyk/Ci1NOzY1TThGNVIuQyhMLCJQWC5XOT88VkFPPEcxPzs2NU04RjVSLkMwTCwiUFEtQ01WN1ZFTj0lXU05NlVCCi1NOTcoWiwyUFArIyxSLlc5PzsmXU45VV1NOTZVQjk3KFosMlBQKyMsUi5XOT85RlFPODcxPzs2NU04RjVSCi1NLkNETCwiUFMsQ01WN1YxTz02KUw5NV1NOTZVQjk3KFosMyBMLCJQVi0jTFsgJzk/OFZBQTxFXUY9NllDCi1NLkQ4UiAnOT88VkVHO0Y1RDdWLUg4Nyk/OUc1TjhTSSYsQCFWN1c1TjxWRUc7RjVEN1YtSDg3KT85RzVOCi1NOFNJJi0wIVY3Vy1IO1cpVDdWOVU7RixaMUMwID1FXVM6Nj1OOTYxPzxWQU88RzE/OUc1TjhTSSYtICFWCi1NN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsWjFDOCA9RV1JO0cxPzlHNU44U0kmLDAhVjdXLUk5VllFCi1NOSVdSTtHMT85RzVOOFNJJiwwIVY3VzVOPFZFRztGNUQ3VkVOPSVdRj02WUMuRDhYICc5PzsmXU45VV1GCi1NPTZZQy5EOFEgJzk/PFZFRztGNUQ3VlFPO0Y9PzlHNU44U0kmLDAhVjdXNU48VkVHO0Y1RDdWUU87Rj0/Ci1NOUc1TjhTSSYuICFWN1Y5TDtWJVQ3VjlVO0YsWjFDRCA9RV1EO1c1QjsmNT85RzVOOFNJJiwzICA7JkVOCi1NOlNJNCxTLF08UyRVLEZZRT4nMFosUzBdKkMsUysjIEwsUyhbOyZFTjpWOVU7RixaLFM0XSpDLFYvNjhTCi1NLSJQUyxCUFMsQ01TPSc1RjlDSFMtU1VBPEMkWywjTFAuUyxYLzYlUiwzTFAuUyRbLFNEXTg3KFEuUyBbCi1NLENMUi4yUFYtIlBRLDM0Ui5TTCA8VV1MOjZZSy5EPFMtICFUPTVdTDo2WUsuRTBULCNVVSwzMFQ7RjVYCi1NPSNIUy0iUFArIyxSLlZRSTtGTUY9NllDLkMsVSsjIEwsUyhbPFcxVTlGOFosUzxMLCJQUSwzNFIuU0wgCi1NPTVdTDo2WUsuRDxULCAhUDxGRU04NylZLkQ8VCwzVUU8RjVELkMgTDlXKUU5NlhaLDJRQjsnNUUuQyhMCi1NLlAhQztWUU88RyxaNSMwUi82NVk5NlFMO1c8WiwiUVA9NylQOyY0WiwyUVA6NllLLkMoTC5QIU47VllQCi1NPEZFTTg3KVkuRDxULEAhQzsnNU46VjVSLkQ8VCxTVUU4VkFFPUdEWiwiUUY7VylELkMkTC5QIUM4NylTCi1NLkUwVC0jVUU4RlVXLkMgTDwmXVI8Vi1IOTNIUSsjTCA8VyFPPEcxUzhWJVIuRDxULSAhQjtWXUw5NiVOCi1NLkcwVC0zVUUxRCUsNFQ0WiwiUTQ0RTUlLkMkTC5QIUI9RiVMPFNJNC0jOF05NjlBOyctRS5DIEw9JylVCi1NOTNIUSsjTCA4Rl1POyY1QTtDKFo9IzBWICZVSTxWXVI5JjVSOTYwWjUjMFcvNjVUPVZcWixCUU87RjRaCi1NLDJRWjk3KU8uQyBMPSZBUjk2NFosUlBbICZVQTo2WFoxQyQgKzZRRyAlXVM4Vi1TOjYwIDk3QUk9IllPCi1NICY5QTpWLVUrRlwgN1Y1WDo3ME47UCFDOTcpUjtXKE47UCE/OTZZVjo3KU87QCFTPSYlUj0gIT87NiVJCi1NO0AhPzk3QUk9ICE/OzZdTjhWXU49JylPOyAhTThWXVU7RzAgN1c5PzhWQUE8QCE/PUVdUzo2PU45NjE/Ci1NOFZBQTxAIT89RV1VO0ctSTlWWUU5JV1DOiYlUiAlXVY3Vy1IO1cpVCAlXVY3Vy1JOVZZRTklXVM6Jl1SCi1NPSAhPz1FXVU7Ry1JOVZZRTklXVM6Jl1SPSAhPz1FXUk7RzAgN1c5PzxWRUc7RjVEN1ZFTj0gIT89RV1VCi1NO0ctSTlWWUU5JV1JO0cwIDdXOT87Jl1OOVAhPz1FXVM6Nj1OOTYxPzsmXU45UCE/PUVdVTtHLUk5VllFCi1NOSVdTDtWWUcgJV1WN1Y5TDtWJVQgJV1WN1YxTz02KUw5MCE/PUVdQzomJVI3ViVSPEYlWSAlXVY3Vy1JCi1NOVZZRTklXUM6JiVSN1YlUjxGJVkgJV1WN1c1TjxWRUc7RjVEN1YtSDg3KT84NylSODdEIDdXOT88VkFPCi1NPEcxPzg3KVI4N0QgN1c5PzxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWSAlXVY3VzVOPFZFRztGNUQ3Vy1ICi1NO1cpVDdWJVI8RiVZICVdVjdWRU49JV1BPEcpQT4wIT89RV1TOjY9Tjk2MT86NllUN1YlUjxGJVkgJV1WCi1NN1c1TjxWRUc7RjVEN1ZFTj0lXUE8RylBPjAhPz1FXUw7VllHN1YlUjxGJVkgJV1WN1ctSTlWWUU5JV1MCi1NO1ZZRzdWJVI8RiVZICVdVjdXNU48VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA3Vzk/OUZRTzg3MT84NylSCi1NODdEIDdXOT85Jl1VOEZRRTdWJVI8RiVZICVdVjdWLUg4Nyk/PCZdSTtHMUU8QCE/PUVdUzo2PU45NjE/Ci1NOFZBQTxFXVA7VkVOPSY1UiAlXVY3VzVOPFZFRztGNUQ3Vi1IODcpPzwmXUk7RzFFPEAhPz1FXVM6Jl1SCi1NPSVdUDtWRU49JjVSICVdVjdXLUk5VllFOSVdUzomXVI9JV1QO1ZFTj0mNVIgJV1WN1c1TjxWRUc7RjVECi1NN1ctSDtXKVQ3VyFPOjZZVDk3KCA3Vzk/OjZZVDdXIU86NllUOTcoIDdXOT88VkVHO0Y1RDdWRU49JV1QCi1NO1ZFTj0mNVIgJV1WN1c1TjxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAlXVY3VlFPO0Y9PzwmXUk7RzFFCi1NPEAhPz1FXVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT88Jl1JCi1NO0cxRTxAIT89RV1GOyZdQT0lXVA7VkVOPSY1UiAlXVY3VjFPPTYpTDk1XVA7VkVOPSY1UiAlXVY3Vy1UCi1NPEc1Qz0jJCA3Vzk/PFcxUj02LVQsQCE/PUVdVTtGRU87QCE/PUVdVTtGRU87QyggN1c5PzhWQUE8RV1GCi1NPTZZQyAlXVY3Vy1JOVZZRTklXUM6JiVSN1Y5VTtGLCA3Vzk/PTZZUzo2PU45NjE/OFZBQTxFXUY9NllDCi1NICVdVjdXLUg7VylUN1Y5VTtGLCA3Vzk/PFZFRztGNUQ3Vy1IO1cpVDdWOVU7RiwgN1c5Pz02WVM6Nj1OCi1NOTYxPzxWQU88RzE/OUc1TjhQIT89RV1JO0cxPzlHNU44UCE/PUVdUzo2PU45NjE/OjZZVDdWOVU7RiwgCi1NN1c5Pz02WVM6Nj1OOTYxPzo2WVQ3VjlVO0YsIDdXOT87Jl1OOVVdRj02WUMgJV1WN1ctSTlWWUU5JV1MCi1NO1ZZRzdWOVU7RiwgN1c5Pz02WVM6Nj1OOTYxPzsmXU45VV1GPTZZQyAlXVY3VjlMO1YlVDdWOVU7RiwgCi1NN1c5PzkmXVU4RlFFN1Y5VTtGLCA3Vy0/OyZFTjpQIT89NV1MOjZZSyAlXVA8RkVNODcpWSAlXU47VllQCi1NPEZFTTg3KVkgJV1DOyc1TjpWNVIgJV1TPCZdUj0nLUM4NyggN1VdRDhGJVI5VywgN1VdRDhHLVU4RiwgCi1NN1VdRDhHLVU4RlggN1VdTDlVXUY7JiVHICVdPzhWUUU4NllVPCAhPzdWNVg6NzAgOFY1UjxGXVIgJV1FCi1NPEcpTjtQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0lICAgICAgICAKLSAKLWVuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWFvdXQyLnUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstYW91dDIudQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkyMDk2MS4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstYW91dDIudQorKysgL2Rldi9udWxsCkBAIC0xLDIyMDggKzAsMCBAQAotYmVnaW4gNzc3IG02OGstYW91dDIKLU0gMCghIlAgIEAgICAgLCAgICAgICAgICAnQjAgICIgQCAgICAgICAgICAhLV4gICApIT0nW1AgJChAK0UKLU1ANEdTJiAwQ1MgICIgICEqTjAgIChAOUcgICAmODAgICpEQTQyJSxPIERaWSAgIEJGJFpZICAgQzlNW1wKLU0gIFBPICRaWSAgIEYwJUIvK1AhLk4wICApTUEuNU9fKDIuPFAgJEFaIDpRKD4gICAyJ0ghQkRaWiAzOz8KLU1fICAgICBATTAvX1AyJ0AgKCRBTl9cQE8gJFpaIDNTP18gICAgISAsQCAgICAiIUciJCdaIDc5QCAgJFQKLU0jJlghIl9fKjlPIEQvICAgJ19fNEtPXywgSCtfX0AgICFIKCAgQCAgKCArMEtPXzBUKltfVSRBWiA2KSgKLU0+ICAgK1JbX1wiXFogOUBPLkAmQCtQISg+ICAgM0tIIFMtX1wgICAgJiJVIF9eQE8rT18sK1JbX1wiXFoKLU0gN0BPLkAlWCtSW19UIiAiVCpbX1oiXCAzS0ggSE1fXCAgICAmIjggRSpbX1MiXCIoIltfWi0iTl9cUE8KLU0gJFpaICkjP18gICAgIFEoPkAkQjInQCAgJEFaICxFLk5AIUY0KFxNMC9fTDJKW19VJjgkNihdQChEQVgKLU0gICBPICJcWiAxQE8uQCQ4K1JbX1UtOk5fXSBPIFRaWiAkMz9fICAgICFRIV5PWygrNENfXyJVWSAgKCAKLU0gL19YKzdIIDsvX1QyJltfWiRBWCAgJEA7T19IVD5bX1ckWjA0KF0sV1AgLDNFWS49MiFPICBRKD4gICUKLU04IVBAO1AgPDInQCAxViAyKCZcICMkQVggJEVAIiIhTyAhISg+ICAjM0QhRSBEWVUrUUEoNCRBWCAgKSgKLU0+ICAgMidAICEkWSArV1AgICAhXyAgMSg+ICAhM0QgICAgICArVzVTPEJdTDo2KE87JjBOPFZcICtWMUUKLU09Ql1aOTcpTyAgICAgICA4OFcpVCwjSEA7RlxAK1c1UzxCXUw6NihPOyYwTjxWXCogICAgKTYtUj0jIFoKLU0oIl1VPFcoTzsmRUIrVlFEK0ctTygmVUE8JyFJO0Y8QDlGJUk7JzVSOTBIICAgICAkVi1SPSMgWigmWU8KLU0oIl1EOTc4Tz5GNVI7UEggQCAgICBIICAgISggICAgJyAgICAhMCAgICAgICAkW1kgICBFUiAgIDNFOCAKLU0gJCogOCAgICBEWT4zRzUuNUAgIDBIIUAgICAiM0VZLj00WTYgICEiQCYgICAgKS43RFlVM0U4ICAkKiAKLU04ICAgIERZPjNHNS41QCAgMEghQCAgICIzRVkuPTRZNiAgISJAJiAgICApLjdEWVUzRTggICQqIDggICAKLU0gRFk+M0c1LjVAICAwSCFAICAgIjNFWS49NFk2ICAhIkAmICAgICkuN0RZVTNFOCAgJCogOCAgICBEWT4KLU0zRzUuNUAgIDBIIUAgICAiM0VZLj00WTYgICEiQCYgICAgKS43RFlVM0U4ICAnICA4ICAgIERZPjNHNS4KLU01QCAgPCAhUiAmICAgICkuN0RZVTNFOCAgJidfICAgIjBEKFkgICpQNCEvXCAgJCAgSyEyJF9QICBAICIKLU1MJTBTXyAgIyAgKlA1Qy9cICAwICBLITgsX1AgITAgIkwlSVAhQi8gICAqUDcnICcoXCAgIEshQDwgQEMKLU1QICAiTCYxUCIyLyAgICpQOicgKihcICAgSyFMPCBMQ1AgICJMJyBDXyQrKCAgICAgSyFUKF9RIDowICAKLU0gICpQPiQqWSAgKlA/IS9ZICAqUDQgICJMKCAzXjAgIkwlKCAgSyIiJF9EICBLITQgICpQQSMvWSAgKlAKLU01QCAiTChAU14wICJMJUAgIEsiLCxfRCAgSyE6ICAqUEQiL1kgICpQNyAgIkwpQENeMCAiTCYgICBLIkAKLU0oX0QgIEshRCAgKlBKIi9ZICAqUDogICJMKyBDXjAgIkwmUCAgSyJYKF9EICBLIVAgICpQUCIvWSAgKlAKLU09ICAiTCxAQ14wICJMJ0AgIEsjMChfRCAgSyFcICAqUFUiL1wgICpQNCAgIkwuIENfICAiTCUoICBLI0QKLU0oX1AgIEshNCAgKlBaIi9cICAqUDVAICJMLlBDXyAgIkwlQCAgSyNQKF9QICBLITogICpQXSIvXCAgKlAKLU03ICAiTC9AQ18gICJMJiAgIEsjXChfUCAgSyFEICAqUSAiL1wgICpQOiAgIkwwMENfICAiTCZQICBLJCgKLU0oX1AgIEshUCAgKlEjIi9cICAqUD0gICJMMSBDXyAgIkwnQCAgSyQ0PCAoQ1AgICJMMUBDUCAgIkwxUVAKLU0gMi8gICAqUSgiLyAgICpRKSIvWSAgKlEqICAiTDMgU14wICJMPCAgIEsnKDNFWS49MCAgM0U4ICAiXCsKLU0rUEkiQCQnWSAgKlIjJEowOVBBODIlKiAySSFGXiRKIDtRMSdeMCAiTEBBJVxQUCAoJSkuRCVFKk1cSU0KLU1dQjFOX19ARjtPX1wzRVkuPTRZNiAgIE8iRDdZICAqUiUkSjI5UEBANkRaMDJJKUZeJCpHMidEICAiNSAKLU04P1wgICAjRikmW19fJFk+M0c1LjVAICAyS0QgIEAgXDlASVAgMi8gICAoIC8mJlwzRVkuPTRDR0AsIS4KLU1OMCAgKlxBKjAmPCwzS0QgICJNSDMtXCMgNFlVMidAIC80QVogITkoPiAgIjNLRCAgIjsuMidAIDhUWlkKLU0gICBGViRVIy1DQFguIyRAOUZRTzg3MUk7RjxAPCZdSTtHMEA7Rl1UKCYlVjg2RUw4NilMOTIgTSsyIVAKLU08Rl1HPEYlTSgnKUU8NzVJPEY1UygmRVQiQCAgICAgICAkWTZfX0EoVVIiICtCWCAiJiA0KF5UICIgICIKLU1MQUBPKzAgJCtQPEA1NFowNCRcSj4wICJMQUEqQzY7QjNLRCAgIjtQK1A9Lk4wICApTUE4M1RTTigoI18KLU1eJFk+M0c0ICAkWTZfX1BOQzRBWCAgUS5OMCAgK1BBODNSSSAySFVGIScjXzghSEpLQCAoKlZYICMgICQKLU0qV0QgIEsoOCAgQENTMCAiTEFBUCAiSU5fX1EuN0RZVSAgIS5eMCAgKU4hKD4gICQzRCFFXERZVTInQCAKLU0gNFkgICAgQ1AgICIgJDFQX1RZVSAgICAgICAgM0U4ICAkQVkgICBHIURaWSAgIFcoJUEvM0VZLj00WTYKLU1fX0EoVVIiICpGWCAiJ1tfMkhVRzwjIE0gISAiQCAgICAwLUcuQyBNICEgKCAgICY5QyBQKzAgMCIgICAKLU0gRjwkP0AhQCMkQTUzS0QgICI+NDYkXE4gISBNICEpKVAiXCAzS0QgICNBVjYkXSpAJlAiP09cUCswIDAKLU0iICAgIFY8MCtSVCAiJFpZICAgUCdFQS8wSlQgIiQpTSAhISJFMk1NICBAICEkKk0gIFBAIVRTTigoI18KLU1eJFk+M0c1LjVPX1wrSFRKO0AgKCwiVCAkIEAgICAlRilGIFwsIlQgJCBAICAgJUcpJEpNICBBRydCIE0KLU0gIDJQSzAgKDhRMSg1NFpZICAgSThFQS8sIlQgJCBAICAgKUdUQyBNICEgKCAgICU5UDFQX1YgIjwgIEoKLU07T19cM0VZLj00WTZfXlEoVVIjICpGWCAjIVBOICBMUCswIDAgSCAgICAiMiMoICAgICIiOUNQQCswICgKLU1UKlQgIysiTSAgMUMgICJcKCZUICElKSgqVEAgISElJl9fXCwhQCAqOUAgISdEQTUzS0QgICJFQjYkXV4KLU1fWyInOUAgISMmICAgMDBQKzAgMD9BOyBBV1gmTCg9RiwhVSZfX10iRTRBWCAgJSg7T19fJCJUICRERyAKLU0rUCEuTjAgIClMWV4gOyInOVAgIFVAIU0gIiAgJCcjXzggICBTQyBNICEhXiRMIic/QCpQQVY4QDJKVCAKLU0iJjw6KCJUICErIk0gIEFGKSRKNTlCIFArMCAwIEggICAgIiQ5QTEoNTRaWSAgIElZRUEvMkghRyFHI18KLU04ICAgQyMgTSAhICJAICAgICgxRiAvXEYyJTUuTjAgICo2KTgzVS41OzEgQDswICQ0REBLMiAgJCQ0O18KLU1fViEsLCJUICQgQCAgID1HLEIgNTEoIlBLMCAsOyJAQDswICQkKDgsIUAgKjlRIEA7MCAkNERASzIgICQKLU0kIkNfX1YgPDIlNEA7MCAkPCAgMCQmICYyJTVQICEgJitQIS5OMCAgKV8hMDNTIE0gISAoICAgJTlQMVAKLU1fViAkPCAgMCFEU04oLCNfWyRZPjNHNS41T19QMi08UFAiSU4gIEBIOzAgKCsiVCAhKVIsKlRQICEjIE0KLU0gISAiQCAgICAoMUchJ1ggOCAwTiswICwqSD0qRTZQJD9AIUAgQlg1KCJUICItIk0gIFIwSzAgJEwoPUwKLU0iREE1M0tEICAiTSA2JF0qQUZcQCtQOSg1ISBNICEpKVAiXCAzS0QgICI7Lk8oIUciQCFNICIgICQnI18KLU04IClQICRTTiwsI19cJFk+M0c1LjVPX1gyLTxAQCJJTiAgQFArMCAwP0ErIEFXWCJMKD1HJ0MgTSAhICIKLU1AICAgIDApRiEnI184JkFQW1whTSAhIVIgSCEhLlQgICQjIE0gISAoICAgJjlEWSpLMCAoOUBJKDU0WlkKLU0gICBKQEVBLygiVCAhKyJNICBBRi0jIE0gISAiQCAgICAoMUYqIkpNICBRKkU2UCQ/QCFAIEJYNSgiVCAKLU0iLSJNICBSMEswICRMKD1MIkRBNTNLRCAgIk0gNiRdUCAkU04oKCNfXiRZPjNHNS41T15UMi08QFAiSU4KLU0gIEAwKzAgMjI8IEwgIyBNICEgKCAgICI5UThAPjAgIiBJMSFcJlggKlRAICInWCgqVDwgIyYhWitQOS4KLU1OMCAgLTchODNUSiA5UFggOzAiICAhIE4vICAgICghQCdEQU5fXDBPIURaWSAgIFhBRSEvMkghTSFCWE4KLU1fXyFOIUJYXCAgICQgIiAnNCggTyAkWlkgICBPIiVBLypUICAiJjwsICZUICIgIDAqVDwgIyYgQCgnRCAKLU0gQCo0MD8hTiAiTSggIEFeIiJNJyAgUCI7P11fICEgIDswICQgISBLOzAgKCAgMSxbQiMgX1sxLjdEWVUKLU0zRTtfXSIpTiAgQEA6MCAoVD5EICMiIChEKkQgISZIJihUQCAhJiAmTCklTCBCKiAzRVkuPTRDR1AsIEAKLU0uMCAiICRQLDAgICQ5QDhQLyAgMjgiMCwwICAjOUA4UC8gIC44IUAsMCAgIjlAOFAvICAqOCBQLDAgICEKLU05QDhQLyAgJjNHJSFeMCAiSlpRQCFCLVEgICAgIEIpOExfUCAgICAgOU8hLjBEUz8gUC0uPTAgICAgICAKLU0gJFtZICAgS1ogICAzRTggICcoIShcJCAgSyg8KCZYICQlUkggIFEuN0RZVTNFO19ZIlonMktEICBAITgKLU05UUgsTjAgICAgKCAgQCE4OUAgIFEnWCMoXDwgIEAhLDggICBOIlVcICAgS1QvX1QwSltfXiQqTl9fUSgKLU07T19IMiZbX10kQVggID0uTjAgIC1aIS9bUCAsMEtEICBLKDwzS0QgICNIODImW19dJEFOX15BKD4gICcKLU0zS0QgICM+QDNeXCAjJEpZICAqUicmPCQ/QCVAIEdYIihcPCAgQCE4IytEICAgICIgICggNiY5Lj9ALEMKLU1RUCAiICRRLk4wICAuQyEqQCY4VjInRCAgIlNAMidEICBAKyQzS0QgICNFUDQkXSg+MCAgKzIhKD4wICIKLU0gTDEuTjAgIC43ITAzVEFZICAoIlEkWlkgICBHRSVBLzNLRCAgI0g4IytEICAgICIgICggNiY4JDwgJUAKLU0gRyAgK0JbX1kkWT4zRzQqKCUhTDk2JVM5MiFOO1cxRS5CIS0wUzhYLiNAUSgnNVA5VylBOSY0QD0mXEAKLU0wM0RTM0IhTTg3LUsoJlVBPjIhQjkyIUE5JzlJPFYlQjsmNE4oIEggNFY1RSgkOUw7ViVUOjZZRys1IU8KLU06NllUKCUhUjtWPVI4NlVNOTcoRzxSISc9NkVEOTJYKiAkWTZfXlEoVVMjQConUCAgQCJQKkUwSitAICwKLU0rIlggIiYgME8qVCAiJjAkKiRVQCEkR00gIDBKNSRKLTlAMV4gJiAkK0JUICMrWiU5LiEuTjAgIC0oME4KLU0gJj0kKig8QDFUKjAwSkAgISIlJiAgQEExMCAsKCQ4QEEyQSc2KD0qQzY8Pk8qVCAiJiwsKihVKVswICQKLU0qRlQgISYgKCgkPEBDMlgtKkU1KkM2O0JGXFRAMVIiLSooVSxbQyNAX15RLjdEWVUzRTtfWiRDNywvIEoKLU07QCAoKiU0TCUmOCQ+ICFAIUIhJioiQCAjIlhMICAxRiEnSCA4IDhAMVJISCAgUlxBVj1UTig1RS4kSiYKLU05VkEqQSY4OigkOEAqICAoNiggTyAkQVkgICggXCRaWSAgIFU3JSEvOCRYSkFFQiYqRDhMJTY4JD4gIUAKLU0vIiEmKiJAICMmIFQySD1HLCRKJTlBSEAxUiBIICBBOEAiXCAyJ0QgIEAkJDNLRCAgIzU8NCRdQCVCSicKLU0qRDxOJTY4JD5AIUAhQiEnKkJAICMrUic5SFEiRTRBNDNLRCAgIzUiNiRdLFtDI1BfXkEuN0RZVTNFO18KLU1ZJEM3LCggSjtAICgoJTUqQiY4JDwgIUAhIiBIICBQSDQiKUggIDEqQyY4JD9AIUApQlhMICBRQCgrWiEKLU05MThKQyRPTCAgMEg1NEosOUAxXiAmIDgrQlAgIyYgMipIREoyMik1MkhFRiEnKCA4IDBCKjAgLE9IIUIKLU1UKyogOExQSkIiIiwoNEQgISRTTiwoI19ZJFk+M0c1LjVPX0QyLTxQXiJATiAgQThBJ1goTig9RCEnQCgKLU04IDk2QS4yLFk4USpOMCAiICshRiEnSCA4IEhAPjAgIiArIEoqICAsTkgxRCUiXCQzS0QgICMvKDYkXSoKLU1AJjgmPCAhQCAgIyIqJ1AgIEAiUCpFMUAoK1omOEBSXkEmMDQyPlQgISJJIzghIlxBJjQoMj5UICEiSSMKLU04IDBIMzJJJSpBNEYrMCAkMkg1RiEnWCA4IDhAMTJYSCAgUSpAVjgkPyAhQCFCISMrIkAgIytaJDkrSlwKLU1BJjJWKCJUICMpIiQ/QEJQQVYoMCpCVCAiJEE0M0tEICAiVzo2JF1AK0JITSAgQE4hPVokKCQ0RiQpOiQKLU0qVCwgIyIhJygoLTJOMCAiICcwSzFQICgyJTEuTjAgICtJMTgzUiElKCgwQDEyIDBUO0QgIEAiRDRLRCAKLU0gQCJITitEICBAIjg5IDkyTjAgIiAnQThBMiAlMy5YUF4vX0QzRVkuPTRZNl9eIShVUyNcKSJYICIhICIKLU0/QC8gQVY8NitQKSg+MCAiIDFBLk4wICAtNVEwM1cgIDggICBcKzJZICAoIE0mNChNK0QgIEAiWDhQWV4KLU0lQi8nICAoIDEnICA4ICAgVEJQIjY4OEAxQkAwRjtEICBAIkQ0W0QgIEAiSConUCAgQCJQKkUxKkM2PCAKLU0gKihOKzAgKClCVCAjK1InOSNASiFNSiROSD1GJS1CIzRbRCAgQCFUMiUxLk4wICArPUk4M1YhUE5IPUMKLU0lIlwnK1A5KD4wICIgNT0uTjAgIC01UVAgJiFOKiRVQDUrUic4U1BKIV1KI05IOUYlQlAnVigtM04wICIKLU0gJzEoNSRaWSAgIE1WRUEvOCMqWkFGLDQrUCkoPjAgIiA3OS5OMCAgLTVRMDNXICA4IyEpWzAgJDghME8KLU0gREFZICAoIUYkWlkgICBVNyUhLzwgIUAlQkk0MkhVRiAvXUIrUDBPIURaWSAgIE0yJSEvPCAlLFtDI1wKLU1fXiEuN0RZVTNFO19cJEM3LCwgSDtAICgrIlggJCJYTiAgUj5BRygoT0glRSgkT1Q6ICBKQVJCJjRLRCAKLU0gQCFUNEtEICBAIkgyJlQgISRaWSAgIFAnRUEvNiRQQCMkU04sLCNfXCRZPjNHNS41T19AMi08WF4iSU4KLU0gIEBAIzdYI1AoPUYkK09ZICAoIE0mNChOX0QgIEAiWDhROSg1NEFZICAoIU5EWlkgICBVNyUhLzwgIUAKLU0gICNUMV5XX18iQDMwPy0oICJQKDInQCAgMlwkMiUtLk4wICAsTCEvW1AgLD9PXlBBVjgmPCAhQCAgIyoKLU0rQlggIyVCJz5AQl5BNjAkPUBBQCIlOidZKF9FQ1I4J04oLUUkIlwjK1AxKDRUWlkgICBRMCYgICApWlwKLU1OMCAiICtBRDhCQVwgICggTCJJNCgkOEokJiAqMj5UICEmICIqJFRKNSRKLTlAMV4gJiAkK0JUICMrWiUKLU05M0hOKzAgKE8oPUVZK1InOE1ITiEtWiVPSC1FKURBNDNLRCAgIlc6NiRdM04wICIgJzM7TjAgIiAqMEYKLU1BUlwjK1A9KDRUWlkgICBRMCYgUitSWCAjJFpZICAgTyIlQS8qRCEqQzY8PjYkTTlBIlwkMiU1KDRUWlkKLU0gICBdIiRfTyAgUSg0VFpZICAgUCdFQS8oIFUsW0NDWF9eIS43RFlVM0U7X1kkQzcvLiBKK0AgLCsiWCAKLU0iIjEmVTw0Rj8gICIgKyFAIiI5LTggMSdbMCAkKkUtKkM2OCQ/QCFAISJYTSAgUl5BNjQgICw4SDswICgKLU1PKFFGJyRBMzNLRCAgIlc6NiRfO04wICIgKjEyTjAgIiAqQVAgNiAgICoyXEMmNlwrQFM+RStSJzkrQlUKLU1RViw6MkpYICQmPDArUDkoPjAgIiBEPS5OMCAgLTVRMDNXI184J0JVUVY4TjIlLS5OMCAgKz1JODNVKlkKLU0gICggPS1OWSAgKCBJJTJZICAoIEopTjQyJlAgISRaWSAgIFAnRUEvPCAlQDFEQTMzS0QgICJXOjYkXTQKLU1OMCAiICcwQCUtJlkgICggSSU6WSAgKCBKIiAnRCg6MUUpWiopKD0oOyAgJDNLRCAgIyA+NiRdKDpAICQKLU0zS0QgICMgPjYkXVAgNiAiPCAhLFtDU0BfXjEuN0RZVTNFO19dJEM3KCwhKk4wICIgJlFGKERaWSAgIFgKLU1JQi8gICAoIDskWlkgICBUQSJJIDJIVUcuREE1M0tEICAjNSI2JFxOLjAgIiAmUTNBXVpOICBBLD43ICcKLU0gICggOyRQWTwgPCAgQCFMKyA8TyFEWlkgICBYWCVBLypEIVJfW08hOUAxUCAmISwyS0QgIEAiVDlAOEMKLU1TMCAiICsxIV02QCAoXEAgIEAiWCpIPEAuMCAiICtCME4wICIgKzBDUCAgIiAnIz9OMCAiICoxMk4wICIKLU0gJzEyTjAgIiAqQSg7MCAkM0tEICAjID42JF1QIDRTTigsI19dJFk+M0c1LjVPX1gyLTxAQCRKWSAgKCAKLU1RJjw2KkdEICBAIyQoJ0QgIEAjJChdICAgQCMkOCAgIENESlkgICggUCZZUCtDUCAgIiAkK1A9Lk4wICAKLU0uLiE4M1JJIDxPXlBANjgyMidEICBAKVkzS0QgICM1PDYkXVAgJiE8MktEICBAIlQ5QDhDUzAgIiArMEoKLU1BVCdNICAwQ1IgICIgK1BDXyAgICBAICAgQCMgMD81WCAiLyggICggTiIgWSAgKCBOKSJZICAoIE0iLyAKLU0gICggPC1eWSAgKCBLJS5ZICAoIFAiSVkgICggTydYMFdbRCAgQCJcKCBVLFtCIiBfX0EuN0RZVTNFOCAKLU0gIiFOICBAQE4wICIgLDBDW0AgKCAgKCBRJFk+M0c1LjVAICA8QThDUDAgIiAkMS43RFlVICAgICAkWTYKLU1fXkBOQVJYWSAgKCAxJEFOX15RKD40IDI1ICRPK0AgKDNLRCAgI0JWMkghTCJCLycgICggMScgIDggKVAKLU0gMlhOX15BLjdEWVUzRTtfXyJaLTJLRCAgSlpMOUNASj8gICIgSVBQKzAgMCBIICAgICQjOUAwQCM2IUgKLU0yXlQgJStPXCAgKCUnJjdEM0tEICAjOFwySCFGIycoLChcJCAgQCEkPCAhQDFCSVkgICpOSyRKNTlSMEAKLU01MyBIICEgIkAgICAgMC1HJUVBLU5fRCAgSlpQOT4xUiYiLyEgICggMScgIDghQSpFNjgyMidAICUkQVgKLU0gICUuTjAgIC85ITAzUkogKCE0SjtPX1wzRVkuPTRZNl9fQShVUiIgM0tEICAjQjYrQCEoPiAgJCtQPS4KLU1OMCAgLzkhMDNSLyAgICpOSyRKWSAgKk5LJjgkPCAhQDciICdZWCBPICRaWSAgIE8iJUEvKFwgICBAKjQKLU05QUBPLjAgIktKUS5OMCAgLCFZODNUKlkgICpOSycgIDgiWEA+MCAiS0pRIVwnUCAoXEAgIEpaUCtDUCAKLU0gQCo8KkdEICBKWkw4IDhKUVcoNFdIJCxBUCAiITFRRVxHICEzLlhAQC9fWDNFWS49NFk2X19QTkM0SlkKLU0gICpOSyY4KjNLRCAgIzhcMkghRytCSVkgICpOSytPWSAgKk5MJjBAMkk1RiREQVggITEoPiAgITNLRCAKLU0gI1YwNCRcSkAlQS1OX0QgIEpaUDk+IEo7T19cM0VZLj00WTZfX1BOQzRKTiAgQUc5REpZICAqTksmOEoKLU0qR1AgIEAqPCwiVCAkICogICAgISBWPCoyJTRAO0AgKDNJITgzVE9NICEyW18gICIhMVFELUYjPCpHRCAKLU0gSlpMTl9EICBKWlA5IjkqRTY8OCglNFAqICAwIEggICAgJCM5UEhPJTIhTiAgQS5EJUEvNiRWW14wICIKLU1LSyFFVkJJTl9fUS43RFlVICAgICAgICAzRTtfViRDNy8uIE4rQCAoO1A5XCgrWiY7MDleJUYgICAqOEQKLU07QCAwKyJYICMiICc0WCFSID4mQStQJS5OMCAgLiw5ODNSSCAyX0QgIEsoQDJfNVwgIjk1MiUoTyFCXCcKLU0zS0QgICNFRjNeXCAjJEogOlU5KkFGPFYwPltfXSIpJigtREBWMiM5Mj5bX10iUDQ5UFlSIDtSITlQQEoKLU1BQkJcICAgWSYkKkcyJTBPIVRaWSAgIFk5RF9PICBRKkAmTDwySElHIkBSMiAgIFkmJjgiKShMTyE0WlkKLU0gICBYVUVBLzwgIUAmQlhZICAoIDEiXCUzS0QgICNDNjYkXEpCUi8nICAoIDEnI18zLlhcWC9fODNFWS4KLU09NFtZICAgRlgkQVggIDkuMCY3UjNHNS5eMCAgKU4hKD4gIF4zRCFFXERZVTNPRCAgIjtAMidAIDY0WSAKLU05PykuPTRbWSAgIEZYJEFYICQhLjAmN1IzRzUuXjAgIClOISg+ICBWM0QhRVxEWVUzT0QgICI7QDInQCAKLU07NFkgOT8pLj00W1kgICBGWCRBWCAmWS4wJjdSM0c0QCtQICQ1SCFSXywiIVQrRCAgQDQ8K1QgICEkQVgKLU0gISUuMCY0MCgjRCAgQDQ8KF5cICEgICIhMVEuPTRbWSAgIEZYICAgICAgICAkQ0dQLCEuTjAgIC5HIEAKLU0rUCQwWThAQD8gICJMQiBAPCBAICtSXCEnIlxPIDFQTytQJDwrUlwhJyRaMFdfUCAgICAwM0tEICAjSlgKLU0zLVwjIF1fXCAgICAiJEFYIChNLjAkW1kgICBGWCRBWCAmUS4wJjdSM0c1LjVPT1gyLTxAQCJJTiAgQSEKLU1bQCAwK0BAUCswIDAiICAgIDY4NiwiVCAkIEAgICBBRyIgIU0gICggJCYgJDwvXUA6QyBNICEgKCAgICIKLU05VFgiOz9fWyAhISFbT1AgKlRAICIkJ05fICBLMiAgJCpXUCAgIDAgICBRKDUyXCcrUlggIyRaWSAgIF0KLU1YJF9PICBQTiAkQTUzS0QgICI+NDYkXCA7MCAkICEhIkswICgwSlQgIyQqNTghISg1MlwnK1JYICMkWlkKLU0gICBdWCJYICggPSxbQiIgXl9BLjdEWVUgICNSLklQICAgMS49MCAgICAgICAgICAgICAgICAgICAgI1IKLU0uRTA0ICJDUiAmMCAjKCBFQCAgIDlBO1IuRTAgICFbUiAmMCAjKCAgQCAgIDlAMVAgNiAiMEghLj0zX1AKLU0gICAgICAgIS4gX19fX1ggICAgICAgICBHX1AgICAjXCtSXCBfJCdPICAwQCogJDAoLCAsMCAgKDlSUEAKLU0uMCAiICRQQFAgUSAgIDFGIiRaWSAgIFtZRiA2IyQgICBWOCgzS0QgICNLWjggQCwwICAiOUApQTZEWVUKLU0wPlwgISIgOCMkICAiJjxKKCFALDAgICQ5QEEuTjAgIC8mIUAmQFEgICAtRiIkWlkgICBbIUYgLCMkICAKLU0gRjgmM0tEICAjTVYrVTwhIC1fXCAgICEgJFlVXEEjUFAvKEhPICAgJiRZVVxBQzBQLygwRyAhLj0yKVkKLU0gICglVSMgSV9fWCggICAuOVBAUT8hIUMgIiFAKERJSV9fWUpaJEFIICIgTy8kICIgICBPLjAgIkxKIS4KLU1OMCAgLis7P18gICAgIFBTPyEhQ19fUFM/ISEgX19QQEQyJTEgIDBBNDAgKCg1JCAjIiUxICEgQTQwIDQKLU0oNSQgJiIlMSAhUS49MilZICAoJVUjIElfX1goICAgLjlQKUAoRElJX19ZSltEQUggIjBPLyQgIiAgIE8KLU0uMCAiTEohLk4wICAuKzs/XyAgICAgUFM/ISFDX19QUz8hISFfX1BCRCIqSCAgMEJKICAoKEpAICMiKkgKLU0gISBCSiAgNChKQCAmIipIICFQUCo/X14iICAgI0Y/VixWQCAoL19cM0c3UiQvIyBUP1AgICAgOFxBQlwKLU0gIilcWCAgLyUiIzkoLURAVjIjOSgtREBWMiM5KC1EQFYyIzkoLURDXyAgICAgI0AgIF4kKEdTQCAgWCAKLU0oLURAVjIjOSgtREBWMiM5KC1EQFYyKVxYICAgICItXCAgICAgIFw8KFdQICAgICAjUTBDPyAgICAgKCgKLU1ULyhcQiAgICAgICBcQ1IwICAgICAgIS49Mi9cICAgICAuICAjWDNSJi0jIFxBQjwgLSdcICAgICsiKVwKLU1YICAsICIrOChNQEJWIis4KE1AQlYiKzgoTUIxXyAgICAkUEI/LiAgI1EwQlYiKzgoTUBCPy4gICAgIEAKLU0qICA4IEggICAgIC8oVCAoVCItSCAhUCk2Ii1cICAgICAgRyQoISEhWiAgKDNLRCAgI1M+KCJDX18kJ0gKLU0gIEEuTjAgIC8tWS49NEEgIiAgICNWODogRCA/XyIuMCAgISgwIEAgICBdRiJAKSAnX1BDSiAgJCAgIS4KLU09MCAgICAgICAiIU8gIDBCO1AgKCgiXCAjJl0sKEBGMkImUCAgIDEkQDsqIDswICAwIygoIiAkICAmPCQKLU0kTUEzQCIoKSIgJCAgJjg+KEAjREImICIoTUExUi9fXDBEITNAJjNUKCAkIkAgICAgIC1AIEErODQ8Q18KLU1fJCkgNFghRF0kWVVMXEFOJCYgIiRNQTFSL19cMEQhM0AmM1QzRzcxUC0vIDggKDMoJScoX19RIjAlLiAKLU05LzEuPTAgICAgIS41T19YMi08IFAiUE4gIEEsK0YgJiAgUE8hRFpZICAgTyIlQS8rQCFGIScgIDggWE8KLU0hQlwnM0tEICAkX1g0JFxAIVRTTiAsI19eJFk+M0c1LjVAICArUlggIiRaWSAgIFAnRUEvM0VZLj00WTYKLU1dSCEoVVNTXDNLRCAgJVhWKCQgQDQhVTBfX10iS09fWD9AJE0xX19UMEpbX1wiVU4gIFNfWSJVTl9eM18KLU1aIlVOX15DX1siVU5fXlNfWCJJTiAgQDwnNj0mKUZYICQjIEsgISFeJEwiJz9AKlBBVjhAMkpMICImPDoKLU0oIkwgISsiSyAgQUYqREozOUI4UCpQIDAgSCAgICAiJDlBSSg0VFpZICAgSVlFQS8ySCFHIycjXzggIC4KLU0+JyAgOCAgLjxHMCApJkwgISJYMzA+W1ZRIlUoXUshIVtPOyQrNENWTSQnTl1MME0yLzs0IyA4ICk2PCAKLU0gQkEzQVZITCwiTCAkICogICAgIEEmPCooID0kQCsiSyAgUU0lQj0qICAxKDRUWlkgICBJOEVBLykmTCAKLU0hIlgzNFg8NFFFKiI4ICAtTkIhTl9eQEg0JUJOX15BKkMmOCYqJ0QgIEA0RCchUUcgIFZANFg9SisjIEsKLU0gISAiQCAgICAoMUciQiAnMSgiUEpQICw7MThHMkAgJDIlLS5OMCAgKjYpODNSMUsgIDBOJFUuJyUsOTIKLU1ARiMkKCZbX1oiIDAnICE4S09fSDRYPUorIyBLICEgIkAgICAgKDFHIkIgJzEoIlBKUCAsOzE4RzJAICQKLU0yJS0uTjAgICo2KTgzUjFLICAwTiRVLiclLDkyQEYgICMyOEA7T19IKyEhOEtPX0gySDlKMSUuJzpCUFAKLU0qUCAwIEggICAgIiQ5UEhAIVQyIEwqTCAjJlQ2KVRIICEkQTMzS0QgICJFQjYkXEQ6UCAkK0EtM0FRM1wKLU0gIlUyQEQyJjggSEA7T19IKyEhOEtPX0gqJ0QgIEA0SDI+W1tXUkhZICAoJSoiICYzJ1AgIDAgICAgSEAKLU0xMURQJiAhLD8mICYgICAgIkY7RjggICBCIkhZICAoJSsiIU5fXkBMJCVCTl9eQSlbT08/Mkg5RyAgIlgKLU0ySDlHOicgL1AoOEAxMURQIiAjSENGO1I4JUBKLjAgIiEyQEA7T19IKyEhOEtPX0gyPltbV1RKJjlQICAKLU1CREomOVNJUCNcIiYoJDQ5LCBAIFooWUZcRiBKKkNEICBANEgoJltfWiJQMDYqW19aJEdOXl1dKkFGPTwKLU0ySDlHI0cgJ1AoOEAxMURQIiAjRkNGO1IwPltbV1I4KE48LUQgIFA0JyFRM0FWSEwsIkwgJCAqICAgICAKLU1BJjwqKCA9JEArIksgIFFNJUI9KiAgMSg0VFpZICAgSThFQS8pJkwgISJYMzRYPDRRRSoiTjwtRVFGICAKLU0iXTlcLCYgIF9HMTUzNiEuKCRVMjMxIDAyPCFcPisiJjhOWSFeQCBQPEBWUCYlMylfX1FGWCMgWyRAOS4KLU1eUCAiX0grXzdPWypfUCteL09aIl9dU15AT188X1VbXywvV05fTEtfLCdBVTxXIU87JkVIOSYtODU0XSQKLU0wQltbVFQoTl5dKSIrT08xMEJbW1QkKE5eXF0iK09PLjgiOD0/ICAhXl0pQCdBVVwgICdbVDYgNic3UCAKLU0gP08wOCBYPT8gICFeXF1AIUFVXCAgJ1tTRSktJCE1KVAnUEBMKDlHV0dQQ0woOUdYJ1BLTCg5R1BHUE0KLU1MKDlHUSdQUEwoOUdVRiE8MkpbX10mPDoyJltbICJcTl9eME8rQCAoM0tEICAkU0ozXlwgIyQqTl9fMCwKLU1LQCAgICMrX1wmWDQoIltfXCQvViMyI1pfIlUpXUpITTQ/X0g4IVBNO09PJF9eQE8rT19QMiZbX1oiXE4KLU0gIEEuTjAgIDNHWS9bUCAsNERULCUwIEo5QCAgSEUpLTImW1tSJEE1M0tEICAkXj40JFxKICY9VDJKW18KLU1dJjw6MiZbWyAiXE5fXjBPK0AgKDNLRCAgJFNKM15cICMkKk5fXzAsS0AgICAjK1tSJlg0KCJbW1IkL1YKLU0jMiNaXyJVKV1KSE00P19AOCFQTTtPTyRfXiBPK09PKDImW19YIlxOICBBLk4wICAzR1kvW1AgLCgmW18KLU1YIlAwNipbX1gkSiY6QEEkQUFVXCAgJ1tUMkklOCRAQDtPX0grISE4S09fSDJIOUouRDImJzdQICA/TzEKLU04IyFcICQqTl9fIUAlQSA9MjwhWiwpIiVXKDhCIU42IVcoJzxAIlUmX18gMCU0QiAwP0QgIEA3PSIjICAKLU0gQCAgOU1ALCUwIE45QCAgTyUpLSMhNCAqRjggIChJMjM0QU5eT1EoNTRaWSAgIS9HRSEvKiAhRzokSk4KLU1fXzFHJkRBTl5QIE8rT19EK1JYICIkWlkgICEsWkRfTyAgUSJLT19UIypYICAgIFJeT1FOJSIgTl5PUSMKLU1dQFRAXk9QTTI/OkorNSdfWyYgPCs2W1tRL19MK1JbWl8kQU5fXlBPK0AgKDNLRCAgJFleM15cICMiIU4KLU1fXlBKJCVCTl9eUEoxJiBWKCZbX1oiSDA2KltfWiYgSj5AIDAlNEIgMD9EICBANz0iIyAgIEAgIDlRODAKLU0nNEcgPiMiMEEtSiUoQDdFQD1KIVZIIUBWR0tfIyE0ICkmPCBfQCkiS09LWCs3UCAgQDUkXk8xIktPS1AKLU0rN1AgIEA1JF5OUUAgIDlIJzdQICA/TzM4ICAmN0FVXCAgS1paViAuJzdQICIvS0s4IDg9PyAgMF5OTSoKLU1BNlAiPkAkQDtPX0gqISE4S09fSCMiWCA5L0tKOVEgLCtAISReTklHIiBQTiAmR1paRjhOMkgxTCMiVVwKLU0gICglMT9LVDEoMUAnREhOXl0pRyJCVVwgICglMV9LVDggWSorT08wOVBATT8gICIhNEdaXSRITl5cWUcKLU0lQlxOXk8xLk4wICA0KSE4M1JBJkY8IllRNlwiKkBQLCtAITheTklGIiI4WSAgKCUrJiAmKUNEICBANEgKLU0yPltbV1EgTl5OTSlQJygoTCglRyInKDBMKCVHJUYhIDJIMUcwJyAnUCgwQDBRRFAiICNGQyY7UjgjISoKLU1BJjxMPCBfIEEiISMmMyAoIC5CLDlPKUAnIiAkMydQICAwICAgIEhAMFFEUCYgISw/JCAkICAgICJESiQKLU05TjEhW09PPylAQEAjKSIjVCg0TTAvS1gyQltbU1Y8ICE7OllQVjhSOCAgJUtAUk4gICAgID9LWDsgICUKLU1IR0ghKzQ3Wl4mICAhOUBNPyAgIiE0T1pdJiAgIThQTT8gICIhNFtaXSYgICE4IDArT0tKMjwhWjYrIiUKLU05XkFaO1siJTlcIVo+KyIlOV0hQCAgNUQySDVMIEdIJjJCW1tUVjhYKCZbX1oiVTBeTiBNOiAgJF5OMTAKLU1LT19IMiZbVlYkQU5eTUEoO09LPCggNTJAIlwgK1JbWlkiXE5eTiEuTjAgIDg/QS9bUCA4OCM4SDtPOzQKLU09QSM2QyIhTl9eQEhUJUJOX15CWVBWN1IyJltWViRBTl5NQSg7T0s8KCA1MkAiXCAyJltWUSRaWSAgIigKLU08JF9PICEwSDAkSk5eTUFHIkJVXCAgKCU0P0tUOCFZKitPTzI5UEhNPyAgIiE1L1pdJiAuMkJbW1QmPCgKLU0rN1AgIEA1NV5PMCwrQCBZXU1BTyVER05dTUEhWyAgISlAQEAwVEgwOVAgIFNFKiM4LzEhW09PNClAQSoKLU0lJjwkJiFRQCBHQFAoJCwwQSUqIzJINUYhREhOXlxdRyIiISMkKltfX1UqIys0N1pcJiAuMkExRyQlLk4KLU1eTyBAMFEiPDRILSpLT0tQO05RKVtPTzQjIlggLC87ODlROEorT0s8NFg1SiQkMiU4IFEhW087ICpAQVgKLU0hJiBYPkAhKDtPOl48ICBQITJcIDNLRCAgJ0IwNCRdIitPOyI+JjJaQSZXOCMoNCAgIC9IOyBJIVtPOl8KLU0qQEFYITYgKDA+W1ZPQkgoPiA4TTEvOlg0WDRIITRKTl5NUU4iIFBOICMjVlYmOCQ+Qk1AIEdITSgkMDAKLU1BNS4kKzQzWlsiISQkKltaWkRITl5dJUYhJ0ghOCApWiAhIE5eXFkpUCwiJTlQICNPIlxOXk8xLk4wICAKLU00KSE4M1QnTl5dMEIgWSooVCgnMEtPS1BUKltWTiIoJkRIIE0wP0tYOCAgI0RESiU7IClaIURITl5dLUYKLU0tIiFOX15ATTQvS0ArNkAgIS9LRDQqW19aJEFOXU1BKDtPSzgyJltaVyJcJStSW1pZIlxOXk4hLk4wICAKLU04TFkvW1AgODgjKEg7TzpUPUEjNkMiIU5fXkBIVCVCTl9eQllQVjdSMiZbVlYkQU5eTUEoO09LPCtQNSgKLU07TzskM0tEICAoRSYzXlwgJSJBIDJKW1pWJjwqKzdQICBANTdeTzFAJ0RITl5dKUciQlVcICAoJTY/S1QKLU04IFkqK09PMDlQQE0/ICAiITVPWl0gUE4gI0dWViZcNjI+W1ZWJCdMICAkRiIiISMyQSFHICArNjRILUAKLU1dJCdOXl0wRiIiQE5eTVFOIkIhIyQrUCAsJSojOCE5KiUmOCgoJCwwTyAgUDggMEAwUSI8NEgtM0EmO0oKLU0yQltbU1Y4JDJINU8iIiEjJCpbX19VKiMqIDRAITkiJSs0I1pcJiA8NEpbWlckSk5eTVFPISRINDlAQEAKLU0wUSJcICMhQCEiISMkKVEyQFUuJDpOISorT08xOUA4WD8gICE4ICo5UyEgTl5cWSlQIigsUCglRyhCXE4KLU1eTzEuTjAgIDQpITgzVCdOXl0wQiBZKihUKCcwS09LUChAOjJAIlUhXk9BKVtPTzQ4ICAiKSRKJTsgMVoKLU0hRiAmMkg1RiBHSCEyQltbVFY4VCgmW19aIlUwXk4gTTogICReTjEwS09fSDImW1ZWISBOXlxdKVAiXCAKLU0rUDRPK09LRCtSW1pYJFpZICAhRUtEX08gITFALEJBTl1LIVYkLTosKCZbX1oiQzA2KltfWitHIzk/KSgKLU07Tzs4JCJbW1NURyArUCBPITRBTl1MMS5OMCAgQkNRL1tQIDAyPltWViBQTiAiV1ZWJjgsKzdQICBANT0KLU1eTzEyMyYgPjJCW1tURjwqKzdQICBANT9eTzFAI0RITl5dIUciIlVcICAoJTg/S1QkIltaWkRCIDA/RCAKLU0gQDc9IiMgICAgICA5UkhGIyYgKigkLCwkICFFOVBBMkBSISMyQSFGXCIhIyMhICA5NjgkJCtQIDEyISMKLU0yQSFHJCUqIzgvOEYjJiAiNEgsQDBUSDA5T0EiS09LUDJCW1tUNjgkPkAlQCBHSCAkIltbU0RHIFAoNUcKLU0gICQuK1JbWl0kWlkgICEwRCVBLyhALjJDLSIhKEA6MkAiVSFeT0FAICAjUCgmW19aIiAwJzQjW1UlQk4KLU1fXkEpW09PNDA+UCAgMjgoOCAgIFUiIU5fXkBINCVCTl9eQSpBNkgmKkNRX19fX18ySFFGIUJBWSAgKCUKLU0pJ0AgOCA6WEE2UCg0SDA9Ny86TzlPMSorT08xOUAxWiA2ICI+QCAwK09PLjI8IyBBNjwoKCA6MEEiVSAKLU1eT0EzMyI4LEY8MUA/R0ghKzQ3X14mIVYyPltaWkQnTCAgJEYiJiFKKCRVMjMxVTBeTkgwK09LSjI8IVgKLU0+KyIkOE4hIV5AIF48QTJQJiUzKV9fUUZUQyBbJEA5Ll5QICIgRyNZPk9LPl9BW1k8L0YiXjdLWUJPXTIKLU1eN0taV09SUF9BW19VT0VaX107X1BPRiJfVltZPk9GKj4nNVM7VllMOjZBRzlGNUQ4VUE1M1RRJzE0MCAKLU0gJEpOXk8hTCEnSCA4IDBKK09LUDJKW1peJlAkPiAhQCEiQE5eT0BPK09LVDNLRCAgJSIwNiRcTTAvOkoKLU0rUltaWyRaWSAgITBEJUEvRyg2PEAiICNEKFI8QClSJEcqW1ZKREhOXl0lRj5GIFY0WD1KKyMgSyAhICIKLU1AICAgICgxRyJCICcxKCJQSlAgLDsxOEcyQCAkMiUtLk4wICAqNik4M1IxSyAgME4kVS4nJS9QICglKiIKLU00WDlKUUYgXDRYPUorIyBLICEgIkAgICAgKDFHIkIgJzEoIlBKUCAsOzE4RzJAICQyJS0uTjAgICo2KTgKLU0zUjFLICAwTiRVLicoJltaXSEzMDRIKTJLT0tUKCZbWl0kSDA5S1FALUUuJzpCUFAqUCAwIEggICAgIiQKLU05UEhAIVQyIEwqTCAjJlQ2KVRIICEkQTMzS0QgICJFQjYkXEQ6UCAkK0EtM0FRM1wgIyEyQEUuTl5PQUoKLU1RK0cjOSchM0FWSEwsIkwgJCAqICAgICBBJjwqKCA9JEArIksgIFFNJUI9KiAgMSg0VFpZICAgSThFQS8KLU0pJkwgISJYMzRYPDRXJSoiTjwtRVImIFY0WD1KKyMgSyAhICJAICAgICgxRyJCICcxKCJQSlAgLDsxOEcKLU0yQCAkMiUtLk4wICAqNik4M1IxSyAgME4kVS4nJS9QICwlKiI0WltaXCZLJDgjUTNBVkhMLCJMICQgKiAKLU0gICAgQSY8KiggPSRAKyJLICBRTSVCPSogIDEoNFRaWSAgIEk4RUEvKSZMICEiWDM0WDxAO09LTCUtITIKLU1ARSpOXk5QQDtPS0wyQSFGTyRITl5dJUcvJiBWNFg9SisjIEsgISAiQCAgICAoMUciQiAnMSgiUEpQICwKLU07MThHMkAgJDIlLS5OMCAgKjYpODNSMUsgIDBOJFUuJyUvUCAoJSoiNFg5SlFAUk4gICAgID9fWDlBIEAKLU07T19IKCUhOEtPX0goKCkiS09fWCchVUYgLygkKVRIICEiOicsIkwgJCAqICAgICBBJjxQLCJMICQgQCAKLU0gIClGJyk3SyAgQE8iREFYICBITypQICgzS0QgICUqKDNeXCAjJEogOVBJKDRUWlkgICBJOEVBLywiTCAKLU0kIEAgICA1RyEnI184IChAIERTTi8vU1ZAJFk+M0c1LjVPXDwyLTxcWCRBWCAsQSJJVEFOX1NBLk4wICAKLU00I0EvW1AgLD5PXVwgIkFOICBBKD4gIEUyJTEuTjAgIDgwQTAzUlggOVAgIF9FKicqJDxPLjAgIiEzISgKLU01JFpZICAhQTYlIS8rQCAsLSAgRD4gIUYkREE0M0tEICAlIlA2JF0zQCJQIDRIPzlRV1ggKCA7RUAkP1YKLU0iMiNfLiJcWSAgKCUtJEE0M0tEICAmJTg0JF85UCIxLDREUDAkREcgPEcuUEA2KUAwP0ggOkcoKkwhQTQKLU1SP19cOUUoUC5RKCYzT0wgIE9dWiAhUCApQCBGICI4IClAIEYgITggLiAgUiAiUCAhUCAhOCpYICFQICIKLU0uR1AgIDYgXC5HUCAhJiBWLkdQICBWIFAuR1AgIUYgSiIgPCAgJjwmLkdQICFWID4uR1AgIiYgOCIgPCAKLU0gJj8wLkdQICBGICw8VyFOOyY9Rjk0PSUqQjQgMkg5TSNHKFJPKCVMIiI6LU5IOUwgQkgmNEg5ODJQQCcKLU0gICVHIC9bXCJIPCAgICAiOCAjXzBHWCAySDVNNCRPTl9TQEwrQCAwKEQ4QktAICwySTVGJEcoISpIJUAKLU0jJSJOICBRQColQk4gIFFAKEIgNTRYIVIhWyIhOEFAUC5QSCYzT0wgIE9fSF9eQ19aL19CX14rX1ovX0gKLU1fXkEyQVVCJjYkVl5BNl5YMy5YXFgvXDwzRVkuPTRZNl9dUShVU1NYKSZYICInSFIrIDRKO0AgLClCWCAKLU0kJiAsTkgtRyAgI1I2KTUyQTUqJiokSVggJiAiNEg6WkBWPCAgLUEoPiAgRTIlMS5OMCAgODBBMDNSWCAKLU05UCAgUSUqJyokPE8uMCAiITNBKDUkWlkgICFBNiUhLytAICwtICBEPiAhRiQkQTQzS0QgICUiUDYkXEwKLU0gJSonVjw+WkFGOlI+ICVeICJcWSAgKCUvJEE0M0tEICAmJTg0JF85UCI5LDREUDAkVEcgPEcuUEA2KSIKLU0wP0ggMicoKkwhQTRSP19cOUMwUC5RKCYzT0wgIE9dViAhUCApICBEICIwICkgIEQgITggKyAgQCAiICAKLU0hUCAhOCpYICFQICI2KTVAJyBAJyAgITBFNiA0IiA8ICAlQjU4IFFTPCZZTDlWOUUxVDRKKTAhMkE1KiYKLU0iIDwgIDY8IF9TICpBUCAgICApQCAvXVYySDFHIC9cLDJIMUYgL1wyMy5YXF4vXzwzRVkuPTRZNl9fMSgKLU1VUCMgP0AhXCAiKU4gIEFAJSUqJldIPEIhXjYhV0gkMiY0RyFXSCVSLClaISQhJShAJCdZICAoJVcwQFAKLU0gICggICY7OjJIOUckQFAxICIxRiMiIU4gIFBAQVUpKSggRUAgRyAgMy5YIFAvX1QzRVkuPTIpTyAgMEAKLU0rUCAoO1MpIkAwQE8gICAgIVY8JCRMJTNAIiEgWShBQCBCKyE0PENfXyQpIDRYIURdIiAoIiAgICA2PCIKLU0sTCQoICAgIDlQKDJQNFlVICAgQitQICg5UFgwID4mKSRAI0FCMSggWDhEMiAiKU8gIDBAK1AgLDtTICgKLU0rUCAgICA9RyEhKyE0WCBAMC4yKDggKEJQNScoX19RIjAlLiA5LzBAIiBAICAgJUcgQyshIiAgICAmPCIKLU0kTCRAK1AgJDNHNCAgICAgKCZcICEiKSg8T10qJjU/KV9fUUYgL19YNFhGM1IiICkzRzQgICAgICAgIS4KLU01T19QMi08IFAiKU4gIEFSICEgMTI8IE4gJCdZICAoJVcwQFAgIClYICY5JDA/RCAgQDc9IiMgICBXQCAKLU05UTkyMjEgMTI8IE4gJiNIPEAlMjIxIDEyPCBOICYgLiggPVwqWyImOV5ZXCs7IiY5XjkhXjAgIiE9VCgKLU0sICAiPiAhRiEnICA4IylcLClSJzggWzxBQiAmWTgjPEAnIFBEKD88QCUpKSQhJSlQIlggMD9EICBANz0KLU0iIyAgIEdAIDlNUSpANjgiMSg4QCFEU04gLCNfXCRZPjNHNCAgICAgICAhLjVPX1wwP0QgIEA3PVQ+WCAKLU0iISAwPEAvIEA0WT4zRzUuNU9fXDA/RCAgQDc9VD5YICIhIDA8QCcgQDRZPjNHNS41T19cMD9EICBANz0KLU1UPlggIiEgMDxAKyBANFk+M0c1LjVPX1wwP0QgIEA3PVQ+WCAiISAwPEAzIEA0WT4zRzUuNU9fXDA/RCAKLU0gQDc9VD5YICIhIDA8RCMgQDRZPjNHNS41T19cMD9EICBANz1UPlggIiEgMDxAQyBANFk+M0c1LjVPX1wKLU0wP0QgIEA3PVQ+WCAiISAwPEEjIEA0WT4zRzUuNU9fXDA/RCAgQDc9VD5YICIhIDA8QD8gQDRZPjNHNS4KLU01T19cMD9EICBANz1UPlggIiEgMCBIICAgICI3M0VZLj00WTZfX1EhXjAgIiE9VzFbQCAoJCEhUiVcIiEKLU0zRVkuPTRZNl9fUSFeMCAiIT1XMVtAICgkISFSKCwiITNFWS49NFk2X19RUCAgUk4gICAgP1AgKDRcISQKLU0gJFk+M0c1LjVPX1woIlggIicpX1AoJS43RFlVM0U7X1wkQzcgLCBAO0AgKCRCWCAjUlhOICEhM0FWTCwKLU0nIUJcIDY7VjRUQEAiJiAiPCAhLFtAIyBfXyEuN0RZVTNFO11PJEM3IC8hKi4wICJMTSFGIURaWSAgIUAKLU1EQkBOICBASitAICw5QCAkIERKJDlAICBFR0AgP0AgTC8gICJMTSBKLyAgIkxNXE8hMlwmM0tEICAmJEgKLU00JF0qQCY4MjRIPVIjXUohVyglUiFLWiE7PikqQSY9ODInRCAgSyswMidEICBKWyQzS0QgIChPWDQkXV4KLU0jUDonICAqUlQiUFwgICpTLjRBWSAgKCg1JEFZICAqTlEkWlkgICIrVCUhLytQPSg+MCAiS0wxLk4wICAKLU1CXSEwM1dIL1dINl5BRjc0KCNQICBKWyQ4ICAjR0IgXCAgKlJUJiAgIFkwQCEiKCBaOCUkQC0iISFIICAKLU0gSyshOCAgI0AkQVggIlxPITRaWSAgIUEiJSEvMkghRyAgJFYrUDUuTjAgIDQpITgzV1lYTCg9TiAgLDgKLU0rUDUoPjAgIktMMS5OMCAgQl9BMDNSWFwgICpOUSdQIDInRCAgQEE2K1A9Lk4wICA4OSEwM1JYIDlAICAKLU1NRyAgOCAgIylCXCcyJ0AgIDRaWSAgITJOJSEvMkghRiAgIlo8ICFAICAsLCtQPSg+ICAiM0tEICAlKlgKLU00JF0qQCY4ICAqIVAgJiAgIE8oTyFUQVggIC0uTjAgIDRLQTAzVEogOUAgIEFHICA4ICAiViJcJzInQCAKLU0hJFpZICAhMk4lIS8ySCFGOycgIDggICJQIlwnMidAICE0WlkgICEyTiUhLzJIIUY1JyAgOCAgIkoiXCcKLU0yJ0AgIURaWSAgITJOJSEvMkghRi8nICA4ICAiRCJcJzInQCAhVFpZICAhMk4lIS8ySCFGKScgIDggICIKLU0+IiAmPEA6UEA2KDYsI0wqIURbWyAgK18wT108X1c7X0QvXkhfXCNfVidYIDRIOVIhW1IhOzAjXyNEQVkKLU0gICgoNiQqRzNLRCAgJiYwNCRdKkAmOCAgLikoPjAgIkxNISg7T1dcK1A1Lk4wICA1USEvW1AgLC9AIU0KLU0gICc6MkQ9RywkQVggMCUoO09XXDInRCAgQDc8M0tEICAoTSAzXlwgIyRBWCAwJSg7T1tdMidEICBAPCAKLU0zS0QgIChNIDNeXCAjJEokOUAgIVVEQVkgICpSV1RBTl88UE8hNFpZICAhNzxEX08gIFBOICY9UCgkPSoKLU0kJj0kMktEICBAQSg5UFhPLjAgIiIkQS5OMCAgLCFZODNSLycgICgoMiRBWCAjISFbT1csM15fX1QiKS8KLU0sI1AgIlIrODQ8Q19fIlxZICAoKDEkWlkgICIrMCRfTyAjQSpBJjggIDZRKD4wICJMTlhPITRBWCAgLSgKLU0+MCAiIiVJLk4wICA2WTkvW1AgMC9AIUwhRyAgOCAgITRESSc5UFEoUVJcJzNLRCAgI0FWNiRdKkEmOCAKLU0gMyEoPjAgIkxPVSg7T1csK1A1Lk4wICA2JjEvW1AgLCtAIUcgICM+KCQ9KiQmPFQyS0QgIEBBLDlQWE8KLU0uMCAiIiRRLk4wICAsIVk4M1IvJyAgKCgzJEFYICMhKDtPVywrU0QgIEBBJDNLRCAgKE0gM15cICMkSiQKLU05QCAgVSRBWSAgKlMjIlwlMidAICE0QVkgICgoOERaWSAgITtFRF9PICEgXiAmUCwwR0QgIEBAMjwgIUAKLU0gICJUMkQ9RyREKVkgICgoJERDJytQPS5OMCAgLic5ODNUSiQ5QCAgQyRBWSAgKlMmUlwlMidAICFEQVkKLU0gICgoOlRaWSAgITtFRF9PICEgXiAmVFQyRD1HIyRDJytQPS5OMCAgLic5ODNUSiQ5RTkoPjAgIkxSSE8KLU0hNEFYICA9KD4wICIiJzkuTjAgIDZZOS9bUCAwL0AhTCEnICA4I1kqMVY8TjIsPE8hVFpZICAgWD1FQS8KLU04IiBAISdYJ0woPUImIyBbIkA5Ll5QICJfKVtdWU9YXF9KO15YT1xeX1g7X05EKkcrUDEuTjAgIDRLQTAKLU0zVFNOIC8jXU8kWT4zRzUuNU9fXCtIPE8rQCAwK1JYICIkQVggICUoPjAgIiIoKS5OMCAgNlk5L1tQIDAKLU0rQCFPLERBWCBAKE8rQCAsK1A9Lk4wICBCSTkvW1AgLCMoICAgICgiOVBQTyFUWlkgICBYPUVBLz9PXE8KLU0hVFpZICAgWD1FQS8oIDxOK09fXDNFWS49NFk2X1sxKFVSI0ArUlggJCJcTiAgQSg+ICAiMidEICBAQisKLU0zS0QgICVONjNeXCAkIkggOzAgIE9ESiU5QEhALyAgIiIpOUAgICJSMiZbX1EiXCUzS0QgICNCJjQkXSoKLU1AJjggIClQQCtPXzQ1KCBPICRaWSAgIE8iJUEvK0AhRyAgIiYrUltfVSJcJytQNS5OMCAgQkk5L1tQICwKLU1MKltfVSY5QipGWCAjIlAnVypbX1UiISYkK1AgIkUqJigkOSIkJEE1K1A9Lk4wICA2QykwM1JQIDlTKSgKLU07MCAkK1A5Lk4wICA2QykwM1JQIDlSISg7MCAoK1A5Lk4wICA2RkEwM1RKIDlQWE8hNFpZICAgWD1FQS8KLU0oID1AJUJcJTNLRCAgI0FWNiRcTyFUWlkgICBQJ0VBLzwgISxbQiNAX1sxLjdEWVUzRTtfTSRDNyguIE8KLU0rQCAwK1JYICIkQVggIDEoPjAgIiIpPS5OMCAgNlk5L1tQIDArICFNICAmOjJIOUYiQiBcICAoKEhWICAKLU0gOFkoO09fJCtQOS5OMCAgLig5MDNUSiA5QCAhPiIgTl9dMTRAIlwgM0tEICAiXCg2JFxKICY8ICA2KE8KLU0rT180K1A0TyFEWlkgICIqRURfTyAgUlBLT180OUAgIS9CSU4gIFBOIT1aTl9dMEAxUSJcICBJMkFSIScKLU0wQSEoOzAgLCtQNS5OMCAgNkMpMDNSWCA5UCAhIkRBTSAhIE8hVFpZICAhOixFIS8rQCFHICAjVjImVCAKLU0lIlwnM0tEICAlSFI0JFxOICY8ICAuKSg7MCA4K1A9Lk4wICA2QykwM1JYIDlQICBTREFNICFQTyFUWlkKLU0gICE6OiUhLytAIUcgICJaMiZUICgiXCczS0QgICVIUjQkXE4gJjwgICo5KDswIEQrUD0uTjAgIDZDKTAKLU0zUlggOVAgIEREQU0gIkRPIVRaWSAgITpOJSEvK0AhRz9EQU0gIkhPIVRaWSAgITsnJSEvK0AhRzskQU0KLU0gIkxPIVRaWSAgITsnJSEvK0AhRzZEQU0gIlBPIVRaWSAgITsnJSEvK0AhRzIkQU0gIlRPIVRaWSAgITsKLU0nJSEvK0AhRy1EQU0gIlhPIVRaWSAgITpOJSEvK0AhRykkQU0gIlxPIVRaWSAgITpOJSEvMkghRyRCXCYKLU0zS0QgICNBVjYkXEAvICAiTE9VQCVCXCYzS0QgICNBVjYkXE8hNFpZICAgUCdFQS88ICEsW0IjQF9bMS4KLU03RFlVM0U7X18iWicrQlggIiIhTiAgUEBBVEFYICBITyFUWlkgICFBIiUhLytAIUYhJyAgOCBAQDFUKDAKLU00SDxAIVJYTl9fUS43RFlVM0U7X14iWicoRlggIiRIMTlQUEA7QCAsKChFQChESic5QDFQICYgSjxDIl4KLU1ANlQuPENGXkA2WCg8QyI+QDEqJzggMDJPICFfNEREMCQ0RyArQCFSIktaITlNKSImMiApK0JbX14kWT4KLU0zRzUuNU9fVDItPCBQIilOICBBKiQ2PEAjISQgIkY4KigmWCAjISJcICddQC1HUCA4IiFSLCtaITswOVIKLU0uO1ohO1AxUCAmIEZXKDhCIU42IVcoJzxBV1hQRyg9MjIxIDEyPCBOICcoKk9IJUZVIiFOICBQMEFEKDkKLU0oIEUsW0AjIF9fMS43RFlVM0U7X10iWi0qRlggIiRINTlVUEA7QCAsIyE0ICJGODAkK1AgP1YhMCQrUCAKLU0gNiEgMEEhQC8iKS00RFQwJDRHIDxEOlBANj9OPERaUEA2P0g8RTJQQDY/PDxFRlBANj82PEY6UEA2PzYKLU08RlpQQDY/MDxHMlBANj8kPEdGUEA2Pl48ICFAI0BQNSAgSUchJyAgOCAxIicyIC0qRltfXSRZPjNHNS4KLU01T088Mi08QFAiSU4gIEBOK0AgMCgkPSokJjlKMiU1Lk4wICBDJyE4M1JYIDlQOEAxVEgwOUU5KD4wICIKLU0iKjEuTjAgIEMnITgzUlggOVA4QDFUSDA5Q1kqLjAgIktLMUYsJEFZICAoKEo0WlkgICIsPCVBLytAIUcKLU0hQiEnMkEhRiIkQVkgICgoTSYgIitQPSg+MCAiS0sxLk4wICBCX0EwM1JYXCAgKk5NIiBOICBQQiAuRiEKLU0xKCMwQDA6ICAgKlJQMlwgK1A9Lk4wICA4MkEwM1RKIDlBME8hUlxOICExLk4wICBCX0EwM1cgIDggICEKLU1SIlwnM0tEICAlIjA2JF1cI0siJjtQOVBfViAgIDspKD4wICIiKzkoO09QIDNLRCAgKE9YNCRdKDU0QU4KLU1fICEuTjAgIEJdITAzVEFZICAoKFBUQU5fICEuTjAgIEJdITAzUlwnMiZbXCAkWlkgICIrVCUhLzBKPSgKLU07T1AgM0tEICAoTFY0JFxMICZRPCMrRCAgICAiICAoIDEmOTAyJ0QgIEBDJTImW1wgJFpZICAiK14lIS8KLU0yJTUoO09QIDNLRCAgKE8wNCRdKD4wICIiLVEoO09QIDNLRCAgKE8wNCRcTyFUQU5fICEuTjAgIEJdITAKLU0zVCpHMiZbXCAkWlkgICIrLUUhLysgISpBRlQuK1A8TytAIDQzS0QgIChPWDQkXCxLQCAgICAkICMmOCAKLU0gLjEoPjAgIiItWSg7T1AgM0tEICAoTzA0JF0iSVRBTl8gIS5OMCAgQlM5MDNSWCA8T15eQDY4KjNLRCAKLU0gJiEuOCAgIExEQVggIUEoO09PSCtQPS5OMCAgQkk5L1tQICw8QUJQQDY8NjNLRCAgJiEuK1A9Lk4wICAKLU0uJzk4M1cjXzggICBBJEFOXl5BKD4wICIhTjEuTjAgIEJfQTAzUi9OXl9AICBAO1QyS0QgIEA7WDlQWE8KLU0uMCAiIU9BLk4wICAsIVk4M1RKTl5fUU81QlxOXl9RLk4wICArUEE4M1JJICtSW1tfJEE1K1A9Lk4wICAKLU1CSTkvW1AgLEwqW1tfJjw0K1A9Lk4wICAuJzk4M1RaWSAgIUAzRyNfOCEoQ1MwICIhT0BPIVRaWSAgIFgKLU09RUEvKCA5LFtCIyBeXVEuN0RZVTBLRCAgQDtYK1A9Lk4wICAuJzk4M1RaWSAgIUAzRyNfOC1RLjVPX1wKLU0oI0QgIEBBJDNFWS49NFk2X18hKFVSIyArI1AgIEBDQitDUCAgQEVIKkdQICBARl0yS0QgIEBAIjlAICEKLU1WJEFYICshLk4wICArUEE4M1IvICAgKCggREpZICAoKCBGPVorUDkuTjAgIDQpITgzVSogK1AhLk4wICAKLU0rUEE4M1IvICAgKCghRj08K1A4Ty4wICIiIDkuTjAgIEJfQTAzUlwnM0tEICAlIjA2JF0yQCJcIDNLRCAKLU0gIlwoNiRcQ1AgICIiIElHK0JcJytTRCAgQEAqM0tEICAoT1g0JF0oNTRaWSAgITBEJUEvNEggTyAkWlkKLU0gICBPIiVBLyhcICAgQEAuOUA5UCAmICAgNDEoNTJcWSAgKCgjRFpZICAiK14lIS8rI0QgIEBAJj9AIEAKLU0+MCAiIiApKDwnMCArUDkuTjAgIDZDKTAzUlAgNEQ8LDFQICw7PileICIhWSAgKCggREFQPSMgTyFEWlkKLU0gICE6LEUhLysgITIxUFEnICBRTVhCUFkgICgoIkdYICgnRCAgQEAiMichVDgiXCYzS0QgICVIUjQkXEwKLU0gJSknIyQ8ICFWV0I/QCBAPjAgIiIgKSg8JzFcK1A5Lk4wICA2QykwM1JQIDREPCwxUCAnOz4oTC4wICIKLU0iIFhALjAgIiIgKCZAICAgIClATyAiXCYzS0QgICVIUjQkXEwgIiBZICAoKCBAOiAgICAgRyJcICtQOS4KLU1OMCAgNkMpMDNSUCAoI0QgIEBAIiFIICAgICJAK1AgTyFEWlkgICE6LEUhLysgIEAuMCAiIiAoJkAgICAKLU0gKjBPICJcJjNLRCAgJUhSNCRcTCAiIFkgICgoIEA6ICAgICBKIlwgK1A5Lk4wICA2QykwM1JQICgjRCAKLU0gQEAiIUggICAgIkwrUCBPIURaWSAgITosRSEvKCNEICBAQCIzLlhAUC9fUDNFWS49NFk2ICAhKD4wICIKLU1LSzEoPjAgIiFOMS5OMCAgQl9BMDNUKlkgICgmXSRKWSAgKCZeJjwuK1NEICBAO1gzS0QgICMgPjYkXSIKLU1OMCAiIU9BIk4wICIhT1EuN0RZVTNFO19fIlonP0AhKD4wICIiPzhQIVRDIChAI0lANDIgVCgkJkAgICIKLU1MTSBPICRaWSAgIiteJSEvNEQ8LDFQICc7PTkoPjAgIiI/QSg+MCAiIU4xLk4wICBCX0EwM1RBWSAgKCoKLU0gJEFZICAqUlAkWlkgICIrXiUhLyhfUCAgQEgiICAqUkwiL1wgICgqIUAgIkxLME4rT19cM0VZLj00WTYKLU1fXzBAO0AgKCRCWCAjWygwOUAwQCImICYyQUFGXScgIDNFWS49MCAgM0U7X10iWicoJlggIyIpTiAgQD4KLU0mK1gxOUBBKiY2O1Y8ICFAIkEgMTI8IDIoJEchRCgkTitPX1QzRVkuPTAgIDNFO19dIlotKEZYICIiIU4KLU0gIFFAJUJJKDggQDAlOyAxOVA5MjM0SDU5TzEqJTY8JjRERSokNjtGRF5YICIiICkqRltfXSRZPjNHNS4KLU01T19YMi08QEAiWE4gIEFGIUJYWSAgKk8xJEonOVE4TytAICwrUD0uTjAgIDg1QTAzXSInKkQhKiU2OCQKLU08ICFAKiJcTiAgUSg1NFpZICAiLSIlIS8rQCFGIiQqWSAgKk8xJiAsKCQ9IiQlKicoXDwgIEpdJCggVSwKLU1bQiIgX19BLjdEWVUgICAgICRZNl88QShVUyNAKyJYICQiVVkgICpTLy9fVD9AJE0xX19YKzQ7X18kQU4KLU1fPVEoO09XQDImW19dJEFOICBBLk4wICA8RThAO0AgOCgqW11ZIklOICEwSitAIDwoIltdWCdYJUwoPUIKLU0/IyBbIkA5Ll5QICIgIlggIyAgLCAkOCA2ICE4KCJbXVotIiYqSCEqQUZdNjJeW11bIkElMD85SSgvV0wKLU0rQEA4VztPJzk/SUAwJ1ghKkg9KkFGXFgqRDRIMU1HJSZPUCAsK08sOT9BQCokKjUrQ0QgIEBIQDxAQlwKLU1ANlQsPyBBQCJEKjUrQ0QgIEBIPD8gLEoxUkElV0g4OFc7Tyc5P0hAMTQoUDogIEAhNFNOLC4jXVIkWT4KLU0zRzUuNU9XKDItPEBcIkhOICEgTT4wICJMU1NfXSQqTl9fQE0xP19cMiZbXVckQU5fPiEoO09fVDImWCAKLU0iJFpZICAhUjVCIU4gIUBAS09XRCoiWCAnIlhOICEwQCtPV0A/IDZQQUYoICArKFAuUEgmM09MICBAISQKLU0gIFAgIyAhUiAoOCBBREolOzBQQDFSIE5fXyIwQTIiIDggOEAxUiJOX18hXiAkT05fPlBMISYgKCgkODAKLU1HNSonNEg6XktPX1A7PyhAMS0nTl9fISIkJiFEKCQ9IkQiISQkK1AgLCNJXCAgJlpDNlw2P0AnPkEtSiQKLU0rIDRAMVEiXCAjITIzNSonT0g5RVxEKFUyICFALUIhJzBJIEwuMCAiIkIhXiIrSic7MFlaIiYgLCgkPSIKLU1EIlBZICAoKicnSCMrQDhKMS1SJSgkPDpUJSonT0g5RV1CISQwQyE4ICIgJDMuWEBcL1coM0VZLj00WTYKLU1fXiEoVVNTQComWCAjIlhOICExLk4wICA3QzhAMCIhMCchIEoxVEpMICAxRyAgJiAoJDwwTyAgTTRIPEoKLU0xViAgIDcoOl8gIFAySDVHICAmLiZMOjlTJS0qK0BKWVFWUCAgOCA6XyAgUDREUUBcR1goTTw9TCIiQVkKLU0gICgqLiYgLionRCAgQEhUOCA4SD4wICIiQ1EqJSY8ICA1ODpXJiNWMkpQICImWC4oIEk2QCQyIEwqUCAKLU0iJlwgIClIOlsgICwmTDhWPyAgIT9AJUAhQUsyNERNMkFUN1Q+IFEqJEY7UjJINUYjIFBFICMhR15LUDUKLU05UCkyMzFLXCAmNEg7ICAoVjxNMzMkSiw6UDg6XyAgSzggSDpfICBNKCBRJEAiQSAyJltfXycgICwgUE8KLU0gJFpZICAhWEQlIS8/QCEpW09fXDggMTJBVSksIyEwICwmP1Y/ICpeQUZcJD9AKUAiJ1AjT0g5TiAgIlwKLU0yPzlYXyQnTl9fUTYyIlgoJk1SWVFWL1o4ICAgSUcgIUQoSlBLICAoO0M5XiAiOSc4IEA6XStALDRIPTIKLU0yUiAqVCpQICIrWiA7Plg6UUI5JzJDMlgjJj0gT0hJTC8iWCspREg6XSdALDRIPl5CVldWOCJQOl8gIFAKLU0mTDleICYgJiZPUCAsJSonKCJQICItIioxKCJeQCZXTj9AIUAhIUszNEg9J10nQCwyQS1GXSRKJTlDMCwKLU0pMCBQOV9KXCU2PEo0RFVAKUIxTiAgQEorQCAwKCExXiE7Iic4QCNeUUMgWyJAOS5eUCAiX0c7Xk8vWlwKLU1fSTteSy9aTDBBNSxbQ1NAX14hLjdEWVUzRTtdVyJVWSAgKlMvL19UPEAkTTA/X1grNlggJC9fXDImW10KLU1XJEFOXz4hKDtPX1QyJlggIiRaWSAgIVI1RF9PICEgTytAIDgrUlggJSRBTl8+IE8rQCAwM0tEICAmLzgKLU0oIlggJiRZPjNHNS41T19cK1JYICUkKkcrUlggJCJcTiAgUE8rQCAoM0tEICAmNk4zRVkuPTAgIDNFO18KLU1cJEM3KCwgSjtAICwrIlggJiFYTiAhPCwhUCBQOUA5KkFGPCAgLFhCO0AgMDxAJiNEMiFOICBAQCQnKCMKLU1MKCVCN0MgWyJAOS5eUCAiICBAIEwgITAgJEAsIVAgVTswICBIQFAnICM1TjAkSiY5Q1EqSzAoMDtQICAKLU1EJCdNICBQQCswKDAkIyAoX1RHID9DIjBBVyghMkghTCIkMiBQKCUkQCYgIlAoJSpAJiAsMkpUICEmOUIKLU04IDkqSzAgJDlVSE4rMCgwNFg8TCFWICwySD1NJEEqXCAjITNBVS4mMF81SCMgUDEgI0VHWkRKJzswOTIKLU0tN0AsOCQoOz8gIFEgIFBAO0AgKCMqQCAgICAhICAxRiFFKk0gIEFAKiRKTSBBIU8iQiBNIEEgO08gIFAKLU0iIFEySzAoMDghKSpLMCgwO0BQOz8gIFAgIFFeIDJNJyBBIEArMCgwMEM0KCMkU04oLCNfXCRZPjNHNS4KLU01T0xMMi08WFAjVVwgMCNdXiNVXCAwI1tcJEFOXl5RKDtPV1grUlggIiRaWSAgIV5CRF9PICBRKktPT0wKLU06QiEoO09PSigiW1tbJDIgIEggICAvX18rUCEoO09XWDNLRCAgJ1JWM15cICMkQU5eXyEoO09XWDNLRCAKLU0gJ18qNCRdKktPT0w7QEkhW09PUCs0Q1tZJiFUMiZbW1kiXE4gIFBPK09PTDInQCAgREFOXl8hLk4wICAKLU1AMykvW1AgNCgiW1tZJjxIP0AmUEFWOSorUltbWyRBWSAgKCo3JEFOXlkxLk4wICBCTyEvW1AgLDImW1sKLU1FJEFYICIpQCgiXE5eXlEoPjAgIiJHJSg7T00kM0tEICAoS1AzXlwgIyRBTl5UMSg+ICAsM0tEICAoI04KLU00JF0oO09NICgmW1tZJyAgLCJAICBEJ1AiQDlQICMgSF9fWE8gJFpZICAhWEQlIS8/QCErW09NIDggMTIKLU1BVSktIyE0ICwmP1YpRlggJClPLT8gLl5BRlg+MD85WSgvTSArQEBIMlQnTl5UITYyIlAoKCQ8OFQlKicKLU00RFZeQUYvVCgmW1tZJyAgLCJAICBFNiArQCFNKU4uJzA/LzggIlAoK1A4QDtPT0Q8ICBQLCdAJitQIS4KLU1OMCAgPikhMDNVQS02KDk1QVZLQjBDLzggIiFOICFAQEMyIU5eXjBQKiAgJDIsIEA7QCA0KCghIVtPT1AKLU0oIltbWSsiKDlQSE8gJFpZICAiIFRFQS8zLlhYUC9MTDNFWS49NFk2XlIxKFVSI1wqRlggJSJITiAhIEwKLU0rQCAsK0JYICIiIU4gIUEiRCIhJzJKQCAhJjhUP0AgSCM2ICooJDAwTyAgUDRIPTJBK1olOF8pIV03QCAKLU0qQEFAIkIhJSQrUCAsJSonNEg2XkFGL1IoJlggJyIiJzggICI9Q1VcIDAjXV4jVVwgMCNbXCRBTl5eUSgKLU07T1dYK1A9Lk4wICA/SEkvW1AgLC82W1tbT1dcPSEmNEtPT0w8QCBSK09XWlo4RjRANFBcKCAoICAkVDEKLU08QSNCSk0yJk0oNUQgQjAlK0A2XEFWLCIrQDksLydAJyAgLTI6QDonICA6RFUnKDBYSj0yQVQyJzImW1sKLU1aIlwnK1ApKD4gICoyJltdXiRaWSAgIiEsRF9PICEwQCtPT0g5UjleIDsiJzlEOE8gREFZICAoKkFEQU4KLU1eWUEuTjAgIEJPIS9bUCAsMiZbW0YkQVggIilAJ0JcIjInRCAgQEo8MiZbWzIkWlkgICIqXCRfTyAgUSgKLU07T00oMidAICMkWlkgICIgW0UhLygmW1taIFFIX18gICEmWVYsIkAgISRDIDEoIUohJ1gvVCg/SEAiQCAKLU0/QCFcICYgLigmW1taJElQOiA5RiIlKic1KDpeQSZXTk9IMUwiQiFOXl5AIDwgICEyQDhOISJQJFhYOEoKLU0hLi4lKCA6MEEySCA4ISBAO09PSCw7IUghRUAmNEg9NEE1MiYoJltbWicgICwiQCAgS1ogOT4qOTogICIKLU0oJltbWi5GJFY2QCAhIiFOXl5BKjogICQ7IyEoO09NJiwiQCAhJEMgMSggIkAgICBfX1xPICJcKDNLRCAKLU0gJ1JWM15cICMkSU5eVDlHIkIhTl5eQCA6ICAhICA5KDtPT1ArUltbWiRaWSAgIV9SRSEvP0AgXitPT1IKLU00WDxMIV4uJjA/OUkoL09WKyBBQCElLic1ODhAMURJMDlfOSg7T00gPCAgUC1HTEBeXzhPICRaWSAgIVgKLU1EJSEvPkAhIVtPTSArIEFAISUqJTRIOEAxQFAwICMhR10nUCA+IC5aQSZYQjA/OTkoL00gKkBASCM0J04KLU1eVCE2MiI4KCgkMEIxMSIxNEg1MkFFKiROSC1DXCUuJzpTK0NBVCdWPjIjW11CWCgwPzVIICJIKDA+W1sKLU1dQkAoK1A0QDFXICAsISBPICRaWSAgIVhEJSEvNig5OEE1NidPSDFEWSQoVTogIEA7QCA8KCg4QDtAIDgKLU1FKDhAQEQnTl8/QEArT09ITChBRyJCXCAzS0QgICgjMjYkXSxbQiNcXlIxLjdEWVUzRTtKMCRDNy4vUEYKLU07QCAwK0JYICInOFAwSltfXyIhJylVICAhIjpIICAwLEogICAgICggISY8LCMqQCAgICAhICAxRiAgOT4KLU0qJlggIyBSTCAgICIgICAoOyEwLEsgICAgICQgISY4NiMqUCAgICAhICBBTCMiIU4gITFeIiheMDggICYKLU0sJCdOX11QQjFTIFwgIDxAVjUnKF9fUSFbT188MF5bX08jIFwgIDxCViUnKF9fUCxLT19fX19fX1kmWCgKLU0wSltfWCYgICAyUCxLQCAgIClfX1kmVCgwSltfUCYgICAtWEArT19EPEFdKkAmUCgxKCMgQDQyIDggKyAKLU1AN1g/TCg9RjEiIE5fXjEyQCZIIlQoP0pAIlAgP0AhK1tPXyg4IDEiRzUqJ09IOUVeJ1AlT0g5TCAgIjIKLU1ZOD0hXUdDSCtAQSFbT19IMD5AICUiUCgoJD0iRCVCJ09IOUVdRiFSKCJbX1klKiA6QDFeJ10iJ1pIIEwKLU0gJ1ggMl5bX1ImICQwSVUyQVtaJjk/QEArT19EPEFdKkAmUCgxKCMgQDQyIDggKyBANyg/REghUCA+LkAKLU00WCBOIU42J1A7OVhSJDogUDs5WFolKiYrQDlcITtaJjshU0VBVCdWPi5ATiIkJ05fXkEhWiAgNCsgQEAKLU0xVCowNig+XkFGN1YyJltfTyRaWSAgIVM6JUEvMkpbX1gmPFYjKlAgICAgISAgMUYiIlhMICBBMkFWICYKLU0rQ1AgICEtJDImW0w8JEFOWycxKDtOUVgrUD0oO09fPDNLRCAgJjxQM15cICUmICgwSltMPCQqTlsnMEQKLU0rTlFQVSpbTD0nQCAySlAgISY4JjJKUCAiJlA0IypQICAgICEgIDFGOkIgTCAgQTJAKyIiO1YgLEsgICAKLU0gICQgISY4OitCUCAiJTInR0goLEFQICAgQCFDIUJYXCAgICIgJ1AhOCE5XiAiUEwgIEE0QUBSJiAgICIKLU0gJiwmKyNQICAgKCAyJltKOiRBTlpGUSg7TklQK1A4TyFUQU5fW1EuTjAgIDouKS9bUCA4KiJbSjstQk4KLU1aRkAsSyAgICAgJCAhJjggIEAgSitOUVBOSlAgIiZcJCpCUCAiJ1ggMkg1TyckT0sgIFEhW05RWCsgQSEKLU1bTlFYVkhAQDFBSzA0SD0yQUtSJTk/MEo7TlFQVl5bTD0rT0wgIEFPISJJTCAgQl5DNlA4MD5MICMiUCcKLU1XKEM7UiIhJiQrUCAsJSonNEg6XEM2N1JPSlAgIiY4ICAqMEcxUCgwKCAqMEFSPSAgIEJeQEZRLE9KW0wKLU08JjAqJUM5WSguUVg0SD1AIEc4UDA/OVkoLlFYKyBBQCJLWk5bJyFEIyUqJzRIOEAxQFAwICMhR1tLWk4KLU1bJyFEIUdYISs0P19fJEpOX1whRyAgJE4/QCRNMV9fXDggICEpJEpOX1whRyAgJDwySltKOyZcJj1DIVwKLU0gJiAmJUJbSjwnUCErQDkhXUZEQFpHIEwiJiAoT0gxTCMlKic0SDhAMUBQMCAjIUdcK1okOyAgIFonWCEKLU0rND9fXyYgICAtWEorICAoRkg9KkFWOD4/ICErW05JUDggMTJBRSktIyE0ICwmP1ZWSDs6S05JTFcqW0oKLU07JiAiPyAiWkEmXCIqQDBAITQyIClUICAiK0pOWkZRTyFCQE5aRlFAIEJAJU8oMUwkRE9LICBTO1FRS1wKLU0gIyEyQVUqJk8oMU1dK1IlOyFJK1pQICxWXDxAIUkiTlpGUDpdQERAWkchMkFVKiZPKDVNWylSTlpGUlwKLU1LTklIOyNJKkFGUCQ9QyFAIUE4VjoyI0o8JSomOkApXCAkT1Y6MiNKPCYgKk8qW0o6JlAqNEg5MjMwUDUKLU0gIyFHXCtSTlpGQUwoR1AhKzQ7X18mIDowPkwgIyJQKFcoPUAiQiEmJCtQICwlKic0SDpeSyAgKDs/IEcKLU0xUCgwK1JbX18kRyMrUCxPK0AgNDIlLSg1JFpZICAhRigmICAgQzkqSyAgKDswICEnQiAiVCpQICIgUiAKLU0gICAiICZQIF5eMV4gJE9LICBRIVtOUVgrIEFAIiIhJiZNITJBVSomT0pbTDwmN1JPSClMJkRPSyAgUSEKLU1dN0AgKyBDO1BCISYkK1AgLCUqJzRIOlxDNjdSKkAyWEsgICg7UDBKKyAgKE5KW0o7JlwmKiJbSjsmICIKLU0qIDVcICRKJDtRKStaUCAsVlw8Ol8gIFA0SD0yQUtSJDs/MlxBNlA6Ml5MICMtTycoIDowS05JTCZPOCkKLU0oLklQNEg9MkFLUiU7PlErWlAgLFZcPUAiIUtcICMhMkFVKiZPKlAgIiZXUilUPCIkKTInKVQoICIpUk4KLU1aRlBOIUtaTlpGQUwvJEonOyAxViwmICYlQzlZKC5JUDRIPUogR1ggMD85WSguSVArIEFAIktaTlpGQUwKLU0jJSonNEg4QDFAUDAgIyFHW0taTlpGQUwhR1ghKzQ/X18iXE5fX1EpUFJcIytSWCAlJEEzMiUxLk4wICAKLU05QiFAICAkMisiUCAiJDImIygoICAgKCA7ICNaUiBSJiAgICIgJlAgXktaVEFGWFpNKDlGIiE4TlsnQV4KLU0gNiAkPUMhXiAkT1Y+MiNMPiYgKk9KW0w8JjAqNEg9MjMwUDUgIyFHXCtaTlsnIUQhR1ghKzQ/X18kKksKLU0gQSFAO0dYIDA+TCAjIkAmMl5bTD4iSCg4IEBAMTEiPTRIPTJBMiBOWyciMEErWiA5PlleICRPSyAgUjQKLU1BQkgiOCA4Ol8gIFA0SD5eQTZXVilUPCIkK1pOWychRCshOFY+MiNMPiUqJzJfOVkoLlFYOCBKXktOUVAKLU05IEkyQVUpLSMhNCAsJj9QT0pbTDwmMCY/QCRNMV9fXDJKW19QJjwmP0AkTTFfX1wrUltfXyRHIytQLE8KLU0rQCA0MiUtKDUkWlkgICFGKCJYSyBBISlaUCAsVjw9QCFBQ1wgIyEyQVIgSyBBIzBBS1ogOz8hIkpQICgKLU0pVDwiJCQoUz4gUSxbQ0NcWkQhLjdEWVUzRTtfVSJaLSpGWCAkIiFOICExIkQiIU4gIEBNNC9fWCs2QCAKLU0hL19cWj5YICA/X1gqVCAgISJcTiAgQS5OMCAgPSwhODNSSiAoITVSITsiIThBMFAuUEgmM09MICBAIFAKLU0gIFAgIyAgUCAjICAsJEFOX19BKDtPXzgzS0QgICc1WDQkXE8rQCA0MiU0TytAICwyJltfViRaWSAgIUsKLU1OQklOX10xLjdEWVUzRTtfTyRDNy4sIEg7QCAoKCZYICUkKjA/QCErW09fUDA+W19cJCdIICEgTCIiS1QKLU0+ICE4QVtPJjk/OUAlIyBbIkA5Ll5QICIgJSAgK0AgTiAlICA0ICEwKUZYICQuR04gICdfXCI9ICAgMSgKLU01JFpZICAhVkhFQS8pSCBAJFdYJUwoPUNSREE0MiZbX1QkWlkgICFXMSUhLytSWCAlJEEzK1JYICMkQU4KLU1fXSEuTjAgIDpbSSxbQ0MgX1tRLjdEWVUgICAgICRZNl9dQShVUCNYKCZYICIgUkggICAgIEAgJDlAICEKLU0oR1ggOCBALDFQICU5IFEyMVcgICwgPSpMIFAsOV5YLDFQICU5MEEiSiAgJDggICBfREknOVVJIktPX1wKLU0+QCBaIVdAJUYoNjNSNiAuVyg0QUwmUCxGIFEyS09fXDYkREwrT19cTygxRVpAUk4gICAgIT9fXDshU0UKLU1BQlUmX18wQCtPX1QwSyAoIyVCTl9fMCxLQCAgICEzX10mV0o8ICBQIV5OKEQ6QCAiJiAiNEQ9UCAjICcKLU08QDIyQCIpITJLIjwjJj9OMEZbX15CWEggIFAsQVAgIF9fXUIiJyAwWDpcXTAvX1ojKDwgX19fXzhAO0EKLU1DVSFOX19ILEFQX19fX11CIU5GLzYmW19eQFInL19fX19WKCZZOF00O09fWiMoPV9fX19fOEAxMjtPX1oKLU08ICBQK09fWkQ6QCAiIFFOICAnX15GNE4/ICEqQjZUSDwgIFArT19aPUIiNkAiWClZOD0jXCdALCpBJFIKLU0rT19aWFpUSCQ+OkxDKDRCQUJQJDY4PUpZRFNOIC9DX1YkWT4zRzUuNUAgIDwgJFIrQCAqWFoiIU4wICIKLU1MVDEuN0RZVTNFO19dIiFOICBATTQvX1grNkAgIS9fXCwiW19eICkgP18hRiZCIE5fX0AiQCAgL19fXUYKLU0iREpOX19RRiEnICA4JDFQIDYhICwiW19eICkgP18gLDAnX1A5QyBAK09fWCBIICAjX19fOUBJKktPX1wKLU05QDFQIFYgPCgiW19eICogICBfX19QUiAgIDAgICY0JDwgMUAhRyAlOCApUCBEWT4zRzUuNU9fRDItPCAKLU1cJ1AgKEJYICMiIE4gIEFeIy0iJz4iIjhAMyFcICEjMVAiWDBYWlxKJC5CTUMoPEBBQlAlNjRCUVAmM0wKLU0zLlggXC9fRDNFWS49NFk2X18hKFVSIiAqRlggIiIhTiAgUE00L19YKzZAICEvX1xaPlggID9fWCpIIEsKLU07T19cICEhXiIkKlU+IFE4QVcoNE9IJU1dIyBOX19AIjAnX1A5VlBQK09fWCBEIV9cIFEgP18hRyAgIjIKLU1aPlggMl9fWCEoICAgIC9fKlQgICInWCIqVDwgISIgTl9fQCJAICAvX19cIEAgIDAgICBLMCAgLDInQCAKLU0iVEE1M0tEICAnNFo0JF1AJiRKTl9fUUY3J1gjKlQ8ICEmICoySltfXyY4OjBKVCAhJFNOKCgjX1wkWT4KLU0zRzRAK09fWCBIICAjX19fOV4hXiBCTScgIDBLPy9fX18gVCAiIiBOX19AIkAgIC9fX1xLMCAgLDIlNS4KLU1OMCAgPFZBODNWIyIoIltfXiAqICAgX19fVj4+KCJbX14gKiAgIF9fX1BAICAhLUciJ1gkKlQ8ICEmIDIKLU0/QDBLMVAgJDInQCAhJFpZICAhVEpFQS8oIltfXiAqICAgX19fUCIgICBAICAmICBfVFkuNU9fQDItPCAKLU1QIilOICBBXCAkJ05fXyBOIiQnTl9fISFaICAwKEBAQDFSIlE6ICE4QUVCJ09IJUVcQyBOX18gIjAnX18KLU05VEhQK09fUCBEIV9fUFEgP19dRzFHICI4IllQISYgSjJKW19dJjheMkpbX14mOFgySltfXyY4UjwgLUAKLU0lJEpOX18xRidESk5fX0FGJiRKTl9fUUYkRyAgMy5YIFAvX0AzRVkuPTRJTl9fKUdXJyAhOC5RKjtPX1IKLU05W1FQICMgTl9fKCxAICAgQCAhREpHICU4LTEuNU9fPDItPFBYIkFOICBRXCAkJ05fXyBOIiQnTl9fISEKLU1aICAwKkBAQDFSIlQ6ICE4QUVCJ09INUVcQklOICBDSVtAICFfXyBKQCJNTl9fMCAkIk1OX19AICUiTU4KLU1fX1AgJidYMDBLNVgjJUInPyEyXkFGV1QsIltfXCApID9fXUc4IyBOX18gIjAnX18jJCFfX1Y8ICAoSVAKLU0gIyBOX18gIjAnX18hKCAgICNfXypUICAiJ1giKlQ8ICEnICAsIltfXEAiICAgJCAgIk0gICBRKD4gIC8KLU0yJTUuTjAgID0zSTAzViAsP0AsSzFQICQ4IDEiSzAgJDMuWFBYL188M0VZLj03ICAsIltfXEgiTl9fMiAKLU1LT19YQCpbX18mPz4/QChLMVAgJCpXU19fXCAxICBBUCAjIE5fXyhLMCAgLDIlNS5OMCAgPFZBODNWIl4KLU08ICBQK09fUkAqW19dKCJOX19CIEtPX1w5WVgoK0AgJ19fKUciJ1gkKlQ8ICEmIDI/QDBLMVAgJDInQCAKLU0hJFpZICAhVEpFQS88ICBQK09fUiAkIiAgIk0gICBRKD4gIDA4ICNfNyAgICAgICAgJFk2X18xKFVQIyAKLU0/ICxAO0AgLC9CWCAiRyAgLCA8TiAkUVwgICQgICAgKjwjIzJAISYhOCAhLD8nICcgICAgIkUnLl9eISwKLU1bQCMgX18xLjdEWVUzRTtfVyRDNy4vUVwgJ0AgPkAgSDtAIDA9QCBWK0AgKikgLTNAQklOICBRQCwiXCYKLU0oICowQVMgVCJAICJAICAgX19cTyAnICAsITRPICRaWSAgIVleJF9PICBQTiArWiY5ICkyMSJQJzRINTQKLU0zMlglT0gtRVJCOU4gITBQLy9fX1AkOFZAJygwWEpYVzFAICItVDAgISRTTi4vU19XJFk+M0c1LjVPXzwKLU0yLTxYXydYID4gIVwgIkFOICEhViAjOE4gIEhEIFUuIipGWCAjJiBYK1A8QCBJIiUsIzAqICAqICAgI18KLU1fUlwgPCAgUCUyXCAzS0QgICdHWDNeXCAjIlggIyg+UlQlWCA5MEEyMSAyJ0xNIT4gJSomNSRUSiFLSiMKLU05PChGO0AgNCggPSw/ICAhICAgRyQjOiEzJ1FQIVAgIClRIEAhVFFcICAkICAiPDAtVCQgIERRXDwgPCAKLU0gIjwwPCAgUCEkMiBZOEBCIC0qIVQoJzBBUz0gICAxLFtDQ1xfXVEuN0RZVSAgICAgJFk2X19QUCtAICoKLU1QLlggI00iTiAhIS43RFlVM0U7X14kQzcgKDFeICNYTiAgSz5LQCAsKCA9LD8gICAgICBHJCcoMFhaQSwKLU0/JyAiICAgRyQoIiIzLlggQS9fWDNFWS49NFk2X19ATkFSWE4gIEFHJiIhTiAgUVAgIyAwV0ggUC8vX18KLU1QJDxQUCcoMFhKXUZbIlhOX19BLjdEWVUzRTtfXiRDNygoIE4rQCAoOVIwSjtAICwrUD1QICMgNStQIS4KLU1OMCAgPkBRMDNSWCAsI1NfX1whJy5MIVIkLipPOU4hLFtCIiBfX0EuN0RZVTNFO19eJEM3ICgwUCtAICoKLU1QLlggI00iTiAhIE4gJFFcICAgICAiPDA8QSNDSiRRXDwgKCAgIjwwQCgpLFtAIiRfX0EuN0RZVTNFO18KLU1fIyBOICBLIFtAIC4zRVkuPTRZNl9fQShVUCIkLCJYICJMI04gIFhOICRRXCAgICAgIjwwPEEjQ0okUVwKLU08ICggICI8MEAoKSxbQCIkX19BLjdEWVUzRTtfXiRDNyAoMF4rQCAuPCAgUCtAICpbWkMwS0AgMCtAISwKLU0/ICAgICAgRyQnKDBYWkEsPycgIiAgIEckKCIiMy5YIEEvX1gzRVkuPTRZNl9fUFArQCAqUC9QRyQtIk4KLU0gIFEuN0RZVTNFO19eJEM3ICgxXiAjWE4gIElSJC4uT1dKWCAjIiAnMydQICAgICApUSFSJC4uSDMnUVAKLU0gQCAgKVEiIEBEU04gKDNfXiRZPjNHNS41T19YMi08IEEiWE4gIEBAIVRRXCAgICAgIjwwPEEjQ0okUVwKLU08ICggICI8MEAoKSxbQCIkX19BLjdEWVUzRTtfWSRDNywvIEg7QCAoLiJQICBHWCA/ICErWyAgJj5AIFoKLU0rQCAuPCAgUCEiQCA4IjBPIVJcJTwgIFAlMlwgM0tEICAnTEAzXlwgIyJYICwjU19fXCEnLkwhUiQuKkcKLU00SDpcQSY3ODJIPUcpRE9MICA4SiFOLiVWXDRPIVRaWSAgIVtJRUEvK0AgUC8vX19QJDxaUCUqJjxBI0IKLU1JVjtELjQ4ICBEU04sLyNfWSRZPjNHNS41T19EMi08IF4iIU4gIEBeKiAgIj5AIVwgIzhOICBZI1ogICYKLU0+ICBYIVYgOD9AIF4kPj5PV0g0UC8vX19QJDxSUCcoMFhKXEohVSomTygxRVkkSiU5UFBQLy9fX1AkNFEKLU1AJkgmNEg4UTFAICIzLlggXi9fRDNFWS49NFk2X15BKFVQI1QoRlggIidQID5AIFoqMCAiNFg1Sy4lUSkKLU0rQEVQICMgTiAgWVgkKUIgWFg3OkFSKSUqQD1eICNYMVo6XVQkLjZOV0g4QCFXKDBYSkBSQCAqJyAgI18KLU1fUlAnNTRGU1E2Mz4oJlggJCMiJjMuWCBdL19IM0VZLj00WTZfXkEoVVMjQD9AIVwgIkFOICBBK1sgICYKLU0+QCBaK0AgLjgiME8hUlwlPCAgUCUyXCAzS0QgICdKSDNeXCAjIlggLCNTX19cIScuTCFSJC4qRzRIOVAKLU0gIyBMICAqXEAmNzIySD1HKURPTCAgOEohTi4lVlw0TyFUWlkgICFbSUVBLytAIFAvL19fUCQ8WlAlKiYKLU08QSNCSVY7RC40OCAgRFNOLC4jX1okWT4zRzUuNU9fRDItPFBeIkFOICBAXisgICI/ICBKK0AgMDJeUCAKLU0hR0AgLiJYICNHOCAtQD1AKSJcJStQMVAgIyA1K1AhLk4wICA+P0EvW1AgLCpAIFAvL19fUCQ0WlAnKDAKLU1YSlUyQUtSIzk9QSpBNjwsLCNTX19cISUuOCFKIUUqJi40OCAgRFNOLC9DX1kkWT4zRzUuNU9fRDItPFAKLU1cIkFOICBAWCsgICI/QCFcICRPTCAgOVogI0hOICBZUCAjICQqICFAKSJcJytQNVAgIyA1K1AhLk4wICAKLU0+UiEvW1AgLCtAIFAvL19fUCQ8WlAnKDBYSl0yQUtSJDk9QSpBVjxGMl5QICFCSCZYWDc7UTJcJzNLRCAKLU0gJ05GNiRcTiAjIFxfX18gMVNLIDRIOVIkLipPOU4wWTFAICIzLlhQXC9fRDNFWS49NFk2X11BKFVTQyAKLU0/QCxCO0AgKDJeRCAjJ1AsKzQ7X18tTyY4IDEzQVVFLTJJNUdeIjlOICBRKkFWVSAwPkQgIyQqTl9fMEAKLU0hXi4gRCpbX10iVSBfX0BKMiJQJ1k4OzxCIiBOX19BKVxQSCYoITQiQCAgIF9fXFhAIiA9PEEjQkojRSAKLU0gICk1S09fWE5cOUNXLi4nNSg8VzFQICIyRkwgIUY4SC4nUCAgM0lcICApQCNEJ0sgIDhRTF1AJlYvWTIKLU0zJTEtKCBRUiAjKEsgICpQQDY3RjRWTCAgQiBJICBBMkAnKCAsQkwgIE5GKUQoJEA7QCAwKCghIjpQICQKLU0zLlhYUC9fODNFWS49NFk2X15RKFVTI0A/ICBIO0AgKCtCWCAjJE9MICA5QCgiXCc8ICBQJTJcIDNLRCAKLU0gJ01ONCRcTiAjIFxfX18gMVNLIDxBI0JLVSomPCAgUCsgICJPKCFFVURKJzlSOStbICAmKkA7Q0E9TyUKLU0rUD0uTjAgID5aOTgzUlggLCNTX19cIScuTCEyQUcoMFhKXUZZI0UmICApLFtDI0BfXlEuN0RZVTNFO18KLU1cJEM3LCwgSDtAICgqRlggIyQnTCAgOEwiJyAgLCJQICBCISYsIyAqX0AqICAgI19fWCNcKVEhKDAjTSAKLU0gIDlQICMgTCAgKFIrMCAmTEcgKl9GOCguV1AgIDAgIjgiIFs/ICAiICApUCAjIEwgIChAMUMgUCJPWCIKLU1AICAgX19eIF8iPDAuVCAgIidYIC9CUCAgRTYnOlFTQ0FdWiYoJD1QICMgMCtQISg1NFpZICAhXzQlIS8KLU01OD5eQUYzSD9AIUAkJCpHMiU1Lk4wICA/VSEwM1dQMFdIOFArICAkMiwhXCQpIiZPSCFPWEMgTCAgMSgKLU1QKyInO1FIUCsgICQyLCIwQVAqICAgI19fUlwgMiU1Lk4wICA+XTEwM1QpTSAgMSxbQyMgX18hLjdEWVUKLU0gICEuNU9fUCwiWCAkRyggMkQhRyQiIU4gIFBCO0AgKCxNQTIwOykgOT9BLjdEWVUzRTtfXyJaLSpGWCAKLU0iJEE1M0tEICAjID42JFxKO09fXDNFWS49NFk2X1YgQ1tAICggICggMSJcTiAgUSg+ICBPMidEICBASz4KLU0yJ0QgIEBKVDImW184JFpZICAiKlwkX08gITEoO09dQDNLRCAgKFNANiRdLk4wICBDISEuN0RZVTNFO18KLU06JEM3Ly9QSjtAICgqIlggJSQpTl9fWE0zP19YMkgxTSJHW18rND9fXSYgICAvMSRBJCpOX18xQCAgI0oKLU0vN1AgIk9fUi83RCAgRzkuX15QXT4wICJCTSNfW0NVWSAgKFBTT19QKzdQICBHOTBfXiBNPyAgIkJNK18KLU1ZIlVcICAoUFQvX0gwSltfVSQqTl9dQSJLT188KzdQICBHOVZfXEBNPyAgIkg9O19TIlVcICApViIvXzAKLU0oIDEyQCZIIjVII0RAJTIgLzQjX1FGICAgKSBdPyAgIl9fKF0+MCAiPUJTX1sjVVkgIClWRk9fTi83RCAKLU0gQE00X18gTT8gICI9QltfWCJVXCAgKVZHL19EKzdQICBATTZfXkBNPyAgIj1DQ19SIlVcICAqKThPXywKLU0rN1AgIEMiMF9dIE0/ICAiPUQzX1UiVVwgICoqJk9fOCs3UCAgQyJQX11QQCElKiA6QDFeI10iJ1ooITQKLU1AI1UgX1w5QCUiIE4gIFFeIEsiJzlQI18jR1gqTCg9RyAvXVQrIlggJCQnTl9eUE4iJCdOX1tASiIkJ04KLU1fXlE8MiJAKCgkPVAgIyAwKEA5LDAhICAoJDRQQCIhJzwgIFAkJFEgOCA5NEE1MidPSDFFV0dYIis0P18KLU1NJ0AkMD85KE4iQCg4IFBAMSRJMDlAUTNLT15UNTgxKktPXlQ7LlkqQUZcUitQOVAgIyBOX1tQTyAnICAKLU0sIltfTkJcIDwgIFArT15YK1AhKD4wICIiTjEuTjAgIEJKIEA7QCA4P0AkQEFWICAhNzhcKzAgIjA+W18KLU1OIlgoMD5bX1IiSCgwPltfTiVRKCogQEAxVyAgLCEgQDEyITAwPyAqICIpJzwgIFAkMiklKEUlI1wwSCAKLU0sIkQgIEkhMFckITRBVUIlT0gxRVUrUU5fXDlEISNVJl9cOlw1NigoKCZYICYiIi04JyFYICNAJiEoMCAKLU0gICQgWFhQJkEgICAgQDhPISRaWSAgIE8iJUEvKiAhRiJCIU4gIUEiRCYgICEvKEA7QCA4KCgxUCAjIE0KLU0gIChPICRBTSAgOEA7QCA4KCEhPEAiXCAzS0QgICgiUDNeXCAjIiFOICFAQDQjJU0gICggIEIhTiAhQEAKLU00IyVNICAwICEiIU4gIUBKNCNKJjBKW19QJEpOX1sxSyAgMSY8ICBQK09fUis0I19EJyAgLCJbX1FCVSAKLU1fWiEhW09fQCs0Q19GJD9OX1tBJVtPXygwPltfVSJVKF9ZMSo0VjwgIF9BUCAjIDMoJShQLCBIIiBIICAKLU0gL19fPEAgUiRSITIsQyA6ICAqISAgI19fWSIhKzQjX0wnICAsIlQgIEJVIF9aUSpLT19UOyJRQC5DIE0KLU0gIDEoUCQyIDpAMV4jXSInWiggTTAvX1Q4IjBQKzAgJDIsISRAJkgiNUgjREAiVSBfXzFAJCIgTl9ZIV4KLU0gSyInOVxRXiJLIic5XVAsO0AgIl9fKUYqRyAgLCEsQDtPXjQoJSEhXCBIICwhIzE7T19ePCAgUCRSIU4KLU1fWTBANCQnUCJAIFAkLkUoVDZUICEgUk4gICAgID9eUDlVUCxLQCAgICAnX0smPUYoIltfRCdYIkwoPUcKLU0gICMwP0BKUEFWPCAgLFlAICAjMDwgIFAkUlwgMiU1Lk4wICA/QDEwM1YgICBRMSJJVyAgLCEsQDtPXjgKLU0oJSEhXCBIIDwgIFAkIlwgMiU1Lk4wICA/OUEvW1AgLDggICJbQiBOX1khXiBLIic5XSFeIksiJzlbOUAKLU0gICs6LyJUICFCXE5fWyFQICMgMyglKFAsIEggIEggICAvX18oJltfRiIhMDInICogJEFNICA5Lk4wICAKLU1AKyEvW1AgLC5WW19MQCAiKCJbX0QnWCJMKD1HJydYKkwoPUYgICoyPCAgUCFCXCAyJTUuTjAgID8xOTAKLU0zViAgIEdZIklXICAsIDhPICRBNTNLRCAgJ1Y4M15cICMmICAgRjkiO09eSjggOF0/IjwwX1pIQCtPXkwKLU1MKltfTCY0JCgiW19MJTogRDZbX0pCQE5fWlM4S09eUDA/NSohRClIX19YTCElNiY6UCAhTScgICwiW18KLU1fQihOX18yMkAiVSFfWVBWISIwTl9aUTNAQkAmWFgwTiFJWk5fWyEyQVJIIjwgIFAkUiEyLCMgKiAgKiAKLU0gICNfX1JBTl9ZQEg1JEdUIkAiXEBGUCIqQDkqQVZQICAtKV4gJiAgICxRKDtPXkQoIDowQTRBVCJAISgKLU09N0gmRkg9MkEwKiUgICNfX1JcJTNLRCAgJ0MuM15cICQkSU5fWkFHJiQnVTIgOSg6ICAkPCAgUCtPXkgKLU0rUCEuTjAgID5EITAzVElOX1o5RyAgIjIwPzUoIURBSCAgKVAgIyBOX1o4TyAkWlkgICFaMCUhLzgnOSgKLU07T15EKCA6MEE0QVQiQCEoPTdIJkZIPTJBMColICAjX19SXCUzS0QgICdFKDNeXCAkJElOX1pBRyYkJ1UKLU0yIDkoOiAgJDwgIFArT15IK1AhLk4wICA+RlEwM1RJTl9aOUcrJCdVMiA5KDogICI8ICBQK09eRitQIS4KLU1OMCAgPkZRMDNWIDIoIltfRCcoIkwoJUcgL1xMPEBKUEA2PioyPzUoIUNCTl9aMF4gVyAgLCAtIV0wSCYKLU0yRkNfX0Y4JC9ALTMxW1lOX1w5QyMnICAsID4wS09eQC5AIUAgR0ggKCJbX1ArIk5fWzFGMCJYJjUoPVAKLU0gIyAlT0ghQi0jIEwgICpQO09eSjhCSVAgIyBMICApUiAjKDRAKCVHJyNIJzJKW19dJlQmT0pbX0cmWC4KLU08ICBQITAhVSAgJCohQ1AlOCBRM0FFNiQySDlKIC9ZTD8gIEArT15MVCpbX0wjTSAgIClQICMgTSAgKSEKLU1dMEgmMkZDX19GOCg0VlQgIEYgIjREOVAgIyAmMD80KiFCWCgyRSFHXCRJJjlUKVggI0AmPCAgUCswICIKLU1EKDBPICJcJzImVCAhRFpZICAiIEwkX08gIFI9OzAgIigiW19EJ1giTCg9RyInWCpMKD1HIiYgLiggM0kKLU1CJiAkKCAzRUItJU0gIDEyS09fIDUkTThLT140NiRJOEtPXjgoIltfUCsiTl9bMU8gL09KKCJbX14rIi0KLU05VShAMCMgTSAgKlA0JikoKCZbX14jJU0gICggIEIhTl9fQFE7MCAkICAxUCAjIE0gIChPICRBTSAgOEAKLU0rT19YNyggTyAkWlkgICIgTCRfTyAgUEA7QCA4K1EhLk4wICBALSk4M1IhTiAhQEBLT19YMy5YXF8vXUgKLU0zRVkuPTAgIDNFO11SJEM3LC4gTCtAICwrN0QgIEssXF9fMV4gMlUnX19ATTFPX1wyJltdVyRBTl8+ISgKLU07T19UK1JYICIkWlkgICFSVSIhTiAhMEBLT1dEKkZYICQiSE4gIUBAK09XQD9ANlBBVilcLCNMKiFEW1sKLU0gICggK0AgLCAgUCAxQCE4ICVAQCtPV0hUKDhKQCRKJjtVOStbT1dMKiQ1IV1GREBfPlBOIiFDPU5cPUUKLU1eRiEgP0AkSkFUSiY7U0BKMTJBJlY8NDpfICBQTlxRRV4mIEgwSTROLjAgIiJSQVIiK1IhOzBRXCImICoKLU0wSTROLjAgIiJSMVwgUkknKiQ3PkFBQz1OXD1FXkIhJTBDIUggIiAlMy5YUFgvVygzRVkuPTRZNl88USgKLU1VUiNAKyJYICMiVVkgICpTLy9fVDBKW19eIlUmX19RKDtPVzwyJltdWCRBTl9fME8rQCAoM0tEICAnKzQKLU0oJlggJSIiTl8+MEorQCA4K0JYICQiIE5fPiFSITsiIThAICBHQyBbIkA5Ll5QICIgJDAgIyAgLCAnICAKLU1CQCIqMkg5TSMiIScoIltfXCkiJigoIUAhQiEnKCpbX1wnWCAyXltdWyJQJTggQEAxQSI9NEg9MkFLWk4KLU1fXyFNXEIhJVQ+W19cJCgwOCUgQDFUKjAoJDQwTyAgUC5HUCAgO1ItO1ExXiA9WiVXKDRAMVEiXCAjITIKLU0zNSonT0g5RVxEKFU2ICFAKSIhJzBJIV4iK1InOyBASi8gICIiU0VAJEJIXCAgKCsvNiAqKCQ9IkQiSFwKLU0gICgrMUIgJTMuWEBYL1csM0VZLj00WTZfPVBNPjAgIkxTU19dJyghKzQnX14iVU4gIFNfXyRBTl89USgKLU07T1dAMiZbX10iXE4gIEEuTjAgIDxNMS9bUCAwK1JYICUiXE4gISEoO09XQCtSWCAjJFpZICAhQ1YiIE4KLU0gITEuN0RZVSAgICAgJFtZICAgRlgkQVggIC0uMCY3UjNHNS41T19cK0g9IVtAICwrQEBQLjAgIiBMICgKLU0gICAhOUFIUC4wICIgTCAoICAgKDlQSCA+MCAiICAoIlAmICQ8L11AJERBWSAgKCJMIlwnK1JYICIkWlkKLU0gICBdWCJYTl9fUS43RFlVICAgICAkWTZfXkBNPydfX19fX19bIlVOICBDX1wiVU5fXyNfXSNVXCAkK18KLU1fJEFOX15RKDtAIDArUlggIyRaWSAgIF1YIiFOX18hIiQiIE4gIEEuN0RZVSAgIS5eMCAgKU4hKD4gICUKLU0zRCFFXERZVShGXCAhIiFPICBAQCtQICw7VFBCIjkqKDsgICAhJDIhTEghTSAgISQsQEAoIDAgIDlQMDIKLU1WJS4gKEBEKCAwICA5QVhCIC4yKDggKEJWJScoX19RIjAlLiA5LzBAIDAqICAgICAgViAiJE1BMVIvX1wKLU0wRCEzQCYzVCgiXCAhJFlVTFxBTiUmICIkTUExUi9fXDBEITNAJjNUKCJcICEkWVVUPCMzUCYgIiRSITEKLU1SL19cMEQhM0AmM1QoIlwgISRZVSgmXCAhIilPICBAQCInK18yQUE3Uj9fXDlAI19eJS4oPE9cMFY1PykKLU1fX1FGIC9fWDNHNCAgIiFPICAwQjtQICgoIEFSX1EjOTVcR19fJjggX19BLj00WTZfX1BOQVQqRzInQCAKLU0hRFpZICAiLTQlIS8rQCFHJCJcJzInQCAhRFpZICAiLTQlIS84IUEyTjAgIiJUUCxOMCAgICAkICBATSwKLU05QDkuTjAgIClPISg+ICAmM0tEICAoVSYrUCEuTjAgIEM+WTAzUlhOX19RLjdEWVUgICAgICRZNl9fMSgKLU1VUyIgKkdEICBAICAySFVHJyJBTiAgQSpFNjw0K1FVKDUkWlkgICIsSkUhLytAIUdbIiAnOCApUCAkU04KLU0sKCNfXSRZPjNHNS41T19UKCZYICMiKU4gIEAyJisoMTlASCwmMCBdOU8wQCImIDIyQSVGIyBQSCAjV18KLU1fVjgkKCBBQCBHICAzRVkuPTAgICAgIS41QCAgMidEICBAKyQzS0QgICI+NDYkXE8rQCAoM0tEICAoV1gKLU02JF0uN0RZVSAgICAgICAgM0U7X1wiWi0oJlggIyIpTiAgQEoyJiAoJCE2UCQ2PCY0RFUqJTY7VDJBNUcKLU0hIiApOCA5KiY2O0Q8ICBKO09fUDNFWS49MCAgICAhLl4wICApTiEoPiAgNDNEIUVcRFlVM0U7X1ckQzcKLU0sKCBOK0AgKCs2WCAjL19UKCA/RUAiSSAhSCAgIEpdLCokIE01L19YVl9QICBKXywrNTdfXyRBTl9eQSgKLU07T19UK1A9Lk4wICAtWiEvW1AgLDJIIUswIiBOX19CUEtPX0w5QEhAK09fXEwqW19cJjxQKzZbX1svX1gKLU0qKltfXiIgTl9fIVJeXCIhKzQjX18iSk5fX1EiSVRBTl9fME8hVFpZICAgV0gkSiA7IDFQX1YgJCgiW18KLU1aJFNOLCgjX1ckWT4zRzUuXjAgIClOISg+ICBFM0QhRVxEWVUzRTtfViRDNywgIEg7QCAoMl5bX1gkSiwKLU05UjEqJSY8QCpIUSg1JFpZICAhMEQlQS8qVCAgISUhLSpLUCAgSilMPEAoSzAwICQ0JFRALjAgIiAkMlAKLU1OMCAiSF8hRCRCIFkgICggMSQnWSAgKkJBIkFQIyAhQCFCQVwgICpCO1JKLCtRNS5OMCAgNCkhODNSTSAKLU0gIDEwMzJKXCAgKkI/NyghKlQkICEkJ05fXiBAIzkiKFlIITJAIlwgMiZbX1gkQVggICkuTjAgIENKOSwKLU1bQyAgX11BLjdEWVUgICAgICAgIDNPRCAgIjtAMidAID40WSA5PykuPTAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAkIEgoUkUtOFcpVCwyWVMoIyROLUIgWC4iXFAsQlxQLiIhIztXIVkKLU08QiBRLjNAVSglLVU7QiEtOjYtUjtQICAgICAiICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhRCAgICAhICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhSTtHLUU8RzBaKCYpQTkiIUIKLU07Jl1DOlIhUzo3SUUoIkBFOSJEQDg3MEApMi1YIkAhQjsmXUM6Vy1JPkY0XSwiIUE9IiBFKFdAKiAmKUwKLU07Vi1LPFZFWjkzVFAoJiVUKCI0Qz4gSCA5RylFOTNIQDo2UUw5Nj1BOyIhQTkmMVI5Ny1TKCJARShXQEkKLU0iQCFGPEY1RS5CIUI4NjBAOEZRTzhWTEA8VkVaOTIgSCk2MEkoJiVUKCI0Qz4gSCA5RylFOTNIQDhGUU8KLU04Vk1TKCI0Qz4iUEApMi1YKCZdVjk3KUw4NyAqICY5Ujk2NFooJilMO1YtSygiNEM+IiFXODcsQDg2UVIKLU05NiVEPjIhRjxGNUUiQCFGPEY1RS5CIUI7Jl1DOlIgRShXQEA9ViVTKCYlTDxGNUE5J0RAOUcpRTkwSCAKLU08RjVBOyZRTzhTSEA6NlFMOTY9QTsiIUE5JjFSOTctUygiQEUoV0BJIkAhUjk2JUw7Jl1DLkIhQjg2MEAKLU04RlFPOFZMQDxWRVo5MiBIKTYwSSgmJVQoIjRDPiBIIDxGNUE7JlFPOFNIQDhGJUQoJilMO1YtSzxWRVoKLU05MkBFOSJEQDg3MEApMi1YIkAhUjk2JUw7Jl1DLkIhQjg2MEA4RlFPOFZMQDxWRVo5MiBIKTYwSSgmJVQKLU0oIjRDPiBIIDxGNUE7JlFPOFNIQDhGUU84VkxAKTItWCgnLVQ8RiVEOSZRRTxSIUY8RjVFKCYpTDtWLUsKLU0oJilPPTZZRDg3KVkiQCFHOTcxRjxGNUU6JjFSLkIhTz03MEA7VjhAOzY1TTtXKVkgICAgIEpWTCAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAiIDAgICAgICAKLU0gICAgICAgICAgICAgICAgICA4IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgIEstLCAgICAgICAiITowICBANksgICglTyAgIiE2LCAgQDVPICAoJUBAICIKLU0hOFggICAgICAiVCAqUCBAICMhWCAjITggIlQgKlAgQCAiVCAqUCBAICJUICpQIEAgIyBRLEMsVC0zOFcKLU0uI0RQICIsQCpSVE4sIyRSLFMwVS1DPFguNkEsKSAgUCwzKFMtIzRWLVNAWSwgIEMoIkxNK0MgUSxDLFQKLU0tMzhXLiNFSCkgICAgICAgKiZZVTsmUEkgIyBRLEMsVC0zOFcuI0VBOEYtRDk2OCAsIyRSLFMwVS1DPFgKLU0uNCUiMFQxJTFAICAgICAgICAgICAgICAgICAgICAgICgiIEAoIiBAKCIgQCoiQEgqIkBAKCIgQCgiIEAKLU0oIiBAKCIgQCgiIEAoIiIoJCEgMCQhIDAkISAwJCEgMCQhIDAxJDEkMSQxJDEkMSQxISAwJCEgMCQhISEKLU0wNCUhMDQkISAwJCEgMCQhIDAkISAwJCEgMCQhIDAkISAxIDAkISAwJCQpIjBEKSIwQCgiIEAoIiBAKCIKLU0gQCgiIEAoIiBAKCIgQCgiJCEgMCQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAhIEAsJCEwOCciIEQqIlBQLSNAXDAkMSgzJSE0NiVRQDkmQUw8JzFYPygiJEIoUjBFKUI8SCoySEsKLU0rIlROK1MgUSxDLFQtMzhXLiNEWi5TUF0vQ10gODYpQzkmNUY5VkFJOkZNTDs2WU88JyVSPFcxVT1HPVgKLU0+N0k7NyVVPjdWISEwRC0kMTQ5JzIkRSoyVFEtM0RdMDQ1KTM1JTU2NVVBOTZHTVw/N1lfICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgISAgKCojICAiIkBYICBASC8gICgqJCAgIiJBJCAgQEgyICAoKiRQICIiQTAgIEBINSAgKCoKLU0lR11fP1ddXz9XXV8gICgoJSAgICAgICAgICAgICAgICAiXCArUCBPICRRIzdVMSkzNDQgMyQlLjFURS4KLU0xRFwgMyQtPzBUXSwzJCU0MTAhLDBVXS0xNS0zMDQ9JTRQISwwVV0jNSVFMDEwISwwVV0uNTRVJTRERSMKLU0gICEsMFVdLTNUWSU1JCUyNjAgIDMkJS4xUCEsMFVdRDk2OUE9NlFUICQsICtWNVQ4Ul1MO1YtQTsmNE8KLU0gIlwgK1c1UzxCXVM6JiVSOTJdTDo2KE87Jl1DODZRRStQIE8gIllDOjAhKjg2WCoxRjVCIkRVQTxASSEKLU08JygqMzYlWSJESVU7QEkqPTZQKjA3NUciRS1FPCBJLzhXMCozRl1WIkQxRThQSSo4NllVODcpWSJEOUUKLU04RylVODcpWSJEVUE8Ri1IIkQlUDxGRUwiRFVBPjBJKj02WUUiRElVOydEKjA3NUc9Ny1UIkUtRTwnMUUKLU07NilFPEBJLzhXMU84RjVSIkRZTz1GNU04RjVSIkQxRThWNU04RjVSICUtVTtASS07VlgqNSc1RSJFPUUKLU05IEk0Oic0KjFHKUkiRS1BPSBJMz02WUQ4N0QqMzZdTjkmJVkiRTFVOTctRDg3RCo1VjVEO0Y1UzkmJVkKLU0iRTFIPTcpUzkmJVkiRDlSOjYxQT4wSTM4NzFVPEYxQT4wIEUyI0hFMzNIRTRQSEU7MlxFOSJcRT4wSEUKLU04MiBFOEIgRTkyIEU1IiBFNkIgRTYwSSEzMEkwMzBIRTAyUEApNChAKTY0TCgiNTkiQCEjICYxRTlGJVUKLU07JzAgMFAhWTk3LCA7RlwgICAgICtAICAgICAgICAgICAgICAgICAgICAgIiJCMCAgQEhIM0YlLiAkRU4KLU05RkVOOjcxWSAgICAgICAiIkQwICBASS0gICgqNDAgICAgISk7RjlJO0ZFVD4wISk7RjggM0YlLiAgICAKLU0gICAgICAgQDhGRU44NylZKCY1WDwmXU45NllUKCI1RCggIEA4RkVOODcpWSgmNVg8Jl1OOTZZVCgiNUQKLU0oICBAOSY1Qzo2VUE7IiFFPichTztGNU49IiBFOSIgICgmMUU4VkVNODZQQDk3QVA7VllFO0cwQCk2MEAKLU0gICAgKCZRSThGLEA4RiVTOTIhQztWWVY5NylTOjZdTigmOUk7JjRAKTcsQDsmRU45MiBFOSNIQCk3LCAKLU03VUE4K0YsICJCIT89JkVNOTctPzwmXVc5NyhAOUYlSTsmNUQoJjFVOTIhVDtSIUU+JyFPO0Y1Tj0iIEUKLU05IiBFOSIgRTkiIUw5NjlUO1c5RTxDSEApNjBAIkAgICAgICIiUlAgIEBMUDNGJS4gJEVOOUZFTjo3MVkKLU0gJEVOOUAhKTtGOUk7RkVUPjAhLjg0WCAgICAgICAgICAgICAgIDNMICAlQSAmPlAiQUsyID4nIFQgNVMKLU0uXUwyK0NeQ0dZV0I4Oys8WEJJQyErUjQpTTY7ODcgRUVMK0M9O0Q0IlJQQSdRVUo4K0AzLloqKVRHVVMKLU04Lyc3V1w7KldSTCY6ODxXKStAJls2OjM7Tkw5Mj1NT0RYViI9NVlURkM7JTtLPFEtSSEiUTxASD44WEQKLU1LQFs+QSwkO0RcLUdQNT8jUlo7V005I0BbQlBWMy1GUjdQVDBFTTE9TCs9WFQmLCY5MlBSRkkkTD47NlIKLU0yMyQgX0IkSFJRJk85JzpEWDQ4IChQRVc0UVcuICQ1V0NMKz5LPFwiKz8yJUJJQFc8WDVbPjxaNEJJUDYKLU1ZSSczTSxULVgkLC43NFBeXl9FNF5NUj0qPkw5QjJGT0c/MUg/J1dVPkReJ0QwKUVfSUs9NC48M1JPMDUKLU0nOSpLOiYqREAmQUM0JDZTMjVNUCosV1ErUVYwRFQsPjIwIkJXQjgwUEQhSiUgUDRHTyJeO1RAIVJcIiMKLU0wNVteWCZDXV8mOkIwXCJaKUomWV0+OVsrVkpdJEVUTS8/SkFOMjwsUUAjPSgwIzBfNjtBPk8mP185WlcKLU1PUFcwVDUjXy5LMDZHPS4xLiRPNkkuM1QwM19OITkoSC07XTRDU1lYJ11ZMzJMK1xRTSxJIS8hSl8yQUEKLU0tO0w2NiBcPjknOTVMVjBPTjk+MVdIXVElIjpeSSpfXSFCOTJSNzE5UyU1IykvNFM0O1xCQSYvJzkpIksKLU04TzAlIC1SKywyQl48SVEzSlM0QyBDUkpcU10nSiFIITMoRk5SPjZDR01TK1gnXjEsSlVcIT1XUUsjNjAKLU0nTiYqTV0jWTYgUywlNjtFKj4gIkczRU4wVTEtLCBVXFJAJUYoO1ksID1MOSckJDRGXCxBVCoyJTdIIFsKLU1EUStfM1dIL0E0QlYyLiIxM1NBVUxGXyY0UCVYPDlWVUsqMEAgSFU9WSYoKiNKXiooRlggOzQ7MCc2JlsKLU0wPiheRElTNUFQSDEoVTE4QjYvISpAUSpDUU08IiguQVNBODM5RV0mMjwxMEVMNC0+PlpbNDQ+S1k3IkIKLU0sWVw+WjxdIyQ4Ml1WJCwqQj4kMkVcIDZKPz9LJUE7LD4yPTdTWVtIVUgsICMpRiE8J1UsNCJUOV5AXy0KLU07UzhUWUJFPEBAPyJXSVUnMyUrOUBdJy0wXD9KIk1ZK0VBPz1EMzcxPkBPSCE7NzlLPEJJMUcvMkw0NiYKLU1ATj8mQCs6IUteT0MhRkY9N09CUlEqPjRdSlEgUCJXV0xcXDpBO0NRIFVKSksmNFEmXk1SViZcKFUkVysKLU1NPlFeXU80PjE8SiwmUkFESEcsVjQgOlNCKCEhOjMxKTA9RVUvLV0yVEdaWS9KO0xJKlUpKUEzTztOQTUKLU1KN0M9ODtVOS44UUI9LzY7MFUjOTcpUVoxTSQhQzwqODpeS0suJis6RS1YSVsoSjBGSzxfKT8vKiZaWUsKLU06LC9OSFhGV0xaSlsjWF9bUy0nSztBVCM6WjhKWSE9JzpCKj1MTixKRlhZXDQ8PyNbXz8kNVZGKT9VN1UKLU1YWiVLSVlTSyI+QFteTFxOP1U8QDlKTUkmTkgwIilIVSM1QFdFX0NEWTRIQklWW0NKJTlOPSwrKkslO0YKLU0jVlguJFM4WC4xKVM4Tzc3NSdCWlktTVMtNTQqID8hOEZFIzpdR0lSRFoxQzE5QTxaWkMuIiU+QFJeSEQKLU1OQi4yUFhDQjBDJzAwO0onJVUjTjMsRVA5L0c8Tj5dSUA9IzdWXDEtQk1aVzZESS4uRjo0JSRAVDJMPFEKLU06IlslJ0NQXjJeIVYlQ1UyWyJVJi9AU0JDR0dWLV4jSihJUEIhLjg0LjYzQE0qNk82Kz1cOjhHSkkwXl4KLU1PTV9BICA7OV5NOEpOXFdJV1FKWUJDJk5fTEssX0QyTUxKIj06JCtENjwgPlJORlUpPFpbQUo8MUEkT0YKLU1YOVEnQFknVSlDKTAnPjUqMkoyIlpXOlwuNV81J0tEX1RGX0hWPlw7I0QtQkZZMj1KIFEqKUQpUUMiPUsKLU0/LShKOzAiTilOIVVJSTNSKVNJSV1NUTxHXj5YIkk4PjlXRF1VTDQ8WFFbMVg2XD1BUUROQS00TTFBTEYKLU0pMk9cI15PRjopIygjMStCPU4kQTopVkE/LlomIypGTlk7Qk04NCYlJVRDUTsuTDdSVCJHOz84QEsvJkAKLU1fMjBLNEw5OTIyKy9XXUpEWlIiUTQ1L18uTD8oIDUrUCNHITk+Ry9OQ1c3VVw9QEFMKS4sXj8hLDFJTVMKLU0xVjs6NDdcNDwgLk5TJFwlLDFQITAhPTtVVlVCOy02OSZYXjU8RkMuIEdOJVlUSyskKjowJUFOWS5BWk4KLU0qT0tFUV5CUkQlNTYgXjtPSFlJMC5QLU1RSE4yTkk7NkpaRl1MLURfKzs/KiYtUTBUI0UnQz4yNkVHIVQKLU1UTks6SzFKViEkSz5cSk8tOENLU1tERDNNVUJNLjotKTBbRUw+NCRXPSoyTjU9IC0rOl1TV1ZOWTpGNEQKLU1bSSlUPjAgVl8gLUwhPiAgITs9Uj0pUVQwPEZGRF5BMi5eKSBOQT1eSyBFKk5XKFxQVl83UDpcMk5GIlIKLU1HUC5YQVInTClESiEkRVwvWiRaL1VMLE9EKCFEOzI/IiEhL0AjTV8jKSEyUCM5RTNOR14kXD5UWEJDVUwKLU0qNjtZIzIgK1gvRiteWE9RVSk0SCpOOD9NNSw8XC5CPFchNTNLNEtBR0cqJjdHXiNPRVApUyBGQ0UmW1wKLU07LjUoTFg4Uj48XUlcXEhAMCNfRSMxO1g6SEUsI0dHVzhIUzlUWjQrJTNZITQ+Sz9XKy8mUlA5TjEsJyEKLU00WFI9Oi1ERUsxLkc0QCYuX1stUUxIVDVZMC85PzMkPjxWJF9bWFVSOyRRJCEkPiAtQC0uOEZJTyBTTC8KLU1WSig4M1E/KUkgMFpHRTUySig9XTQkSktVLj4pQT1HOE1AIiErUDxeTT03XSpKKlhLXjwoLFAsIFtdXFUKLU03QF5GOSRSLjJFJkdCIi4+TDBQUT1DPzw3LTwvQ19WQDctVltWTl9JS14pWlYyK1gtKE8kJzIuTSFEOVIKLU04VCVPU0JdRUBGSSJeXCA/KihTLV9YTSc8MUg/WSVMKkIvVCNZTVxOPkNYUiFTRFVAJERBUk9LSz0oJSAKLU0tMyokKlAuW1U8SVgoOj8pJyxfUCVdQyFVIz9FVCc2Ui4mVUpdUEdEWyxYQi8mSV80NEVRXSJHWjpWNSoKLU0yRS0rIklPKUxDNi8xWCddV08mWzxZRVVVKSMuUF9JJS9fUFs4VTRBPVo6QkhNSUJHKTUxWS9GMF0rPDIKLU1IPjxQSSojUU1GQi1ATi40JklDTUMwVldJKTApSCUkNzEkXEdTI05GLVtJRCI+LDlYREwoRzFES0RDPFAKLU09Pjc9QEA1IE8zO1clS1EgRD42PD5VJy1fREhQUUA+VkMlJlAkXTJcVjU/KDZAJ1spTE5NNVpIIUImQVQKLU1KIyRONSNANF1cSFwjQ0ZUO19aQVYwPlZUVkkiRUw6VlktODUlRDNeVzJbME48RyMoR0slXFZMN1lHWVsKLU1bQE8/LldEJyE3PyFcSjlcVyJSMTMjXlRUPD0yXjE7KSxBSSE7XDJLLClXUDtFJUsuKykmNUs0Rjw5SFoKLU0pSD46TjlcSEVMNkAqNl8oQCI5MlhSJU9dQlM+LVA9XjNBJEUxIkRaSlgvJU1ZO0lcO1ZYQF5NLFwvLFQKLU0yLk1URlFWMSsiVTRPQkchVkhFUUpMWyBeVypMPiQkMVdQMklKRiY2XCQwKCZAXDwwJkxTOVI6QyYhRkYKLU05NEtUTFRFOlRRIVYiME8iWSE3VzYnOjpCK0EsMkMrQFJDTzQ7IjUnI18oTk4yWTtMOV1WMFlGNkddQEIKLU1aRi4jWCsnLScuK0k3TkE+NkZIXD8lWzsjKz8wTEpcVygtIDcgKjJBICs1JllbS09OPERYNDhCIjAqLVgKLU1KVCJZPTQxOVZGMChOLUMsRClTKjE1PkxEQ1A8WyBNUVg7VF1YPyAnQkc7US44MjQ0Plo8QUdYTzdGNisKLU0pWSU1KkkgXl5RPyEkIi1TNSA9MCgyWU0lSS81Ny9bVEswNTUmN0Y7KFsuW1pKVERATD0ySD8kRkE6WS0KLU01XVtcPiNUPScwI1AzMSgyNkhKJFcyJSZQKi9CISghXzBZTz5ZJlhYOkonTkY4VUdaN1pOLFZbPlVPSFAKLU1ZLlhcIzsrJjtZNCFVJz9WX0UjN0wzQEdcQFMmODorPjBXS0MxWElePCxKXkBCT1YoPjojPSJFUURbXiEKLU0kK0lZMyNNPVsnNERJN1QzUSRHTyFGIUxBVy5UTio3I1QqLVw/KThbRyg7T1UkSTw9M1E7TEBYQDMxTEQKLU0/VktMNy4/MURJKFlZVkI0XSohOUwmIEIlPEU4QU1WLlFDX0g7MjQ9JChEPFVCS102UzpNJFFLMkJdLEAKLU1CVzBKK0ZANyEvPyEmNjIwVEYpWVJDSScgWkVVR11EIFk1VSNBSSM5QidIRiQ2JEFMUSYmKSpDODYjPDcKLU05X1Q4MD9bJk8kPSBdUyQzSiw7XkslJjdBOF0zUiwsQjhDMi5XIllfIi8gJ0JaO1c8KSQ2UTxcNjZJMFcKLU1bIUspQVpFKV5MQ1xAPidVTTtCLVg6WjMlVUMyS1ggPjInPVdPJC84PUBNJVBXXDlKWVpOMSpCOlZHPDsKLU1TSlcpIDExIjxEUyNaNDYzOCM1LF4xTSBETEEhNzlHKFI5UEdEVCI4VU5WUTVZRTIqUjYrXzQnNy0kNloKLU0yXTcxRE8mPTYjQFZdREU7SDtBUVslSltOOklCKFErMClSIiErME9VUVA4W1U1PiYkXV8pI1xMMjUnPzIKLU1JLVU5NCQ3Nj8zMzBHP0A3KU4xIiAhKyZbMV1fQkpIXVk8Sj8nNz0wKjZTKE9UUT9PLlpfTTpKKD5CPEAKLU1bUjwpQTRCTFgiK0knNjo6PyNJMFUtIlVfI1kwKUBFWUhJJ0E3Ty44TlFUIENINVwlNkZcSD0gWSw3PjEKLU1VKzw1ICkjLiZIR1MsUE5CMz9HLioiKUdCUytUWzItW0YkW1oqUFA3UydGNU1SXj8gQy9VQD4kV0tDNV4KLU0tVjpMRFRIWipMRkRXQE1AW0tBMiNLOUxLXyRVVykxQFtMLCs6LSo2NUU+VlFYTUs5WjtHK1FHRUU4UjwKLU1TODApTCFGPkFPPSgpQzI4MEkiUEBVUkQrMVZCJkYxSVwsO1sxPSYlRUpBKFkjNi1bVTpcREY0ICI3LCEKLU0pIDZMRCZBJFs6WVw5VyZCOE9OLDZFJUwnVk0lLzY1JyxeQV8iMV5eUUU+T0lDUCEpJU9cWjFWXDgrUVMKLU1ZMzNTUUsiTTlbTzNZLFZGLy5cNF5dVE5USjxGUlxaR1IsXEdUX1kvL0IpIDVUN09JP0Q+LVAjS1VPNDsKLU0nLklCQVZWNE1PWldBIiZBKFc6IzI9JCFCJyogUic9XUAhMkpAU0lbMTZfPzxTICpcT1UkVkI3KD5cT1YKLU1cLCkmR0VUOSBFN1U9V0xSX0JBOT8qICw5IzRWTFIqVFcyQ0AuW1UmJjQyIFw1Oz9DWTY4TDVSNS8kOysKLU08MDgpKUkvWSpGOV03US1bVk5JRUAiLFtMUig4NyswSUw0LSk+RjhfUSZJMllcLUssRVdfKiE8RVEsXksKLU0/WjAzLlY0M1k6IS1bQCZHODJUIi1SJFtFJlIwPyBAKk5XX084ODxOSkxJTkEpV05JPTEgW1wmTkgsPV8KLU1TMVIvQChSPj8tVV5EKTkzPTU+OllSX09UJjgrUkZGUFMjWDBEMEZFLDJfPz4hNkNaKSs/T1xDNCQwXycKLU1eTztYSVdfQE5RNzlEIEwsRUkgLihIK0VWPDhQNUNAKzBfTFY+JihKIFFdUDpUVV4/ICQ/OTdIQlklQU4KLU1JKE81R1kyJFRRWiRaQEZfNDRcU1teUjcxR1Y1JUZKXDZfM05BNDlDSEUxKzwlKzUxWywwMThUQ0MzT1YKLU1CQDI6JD4rQCsyRlhfKyAvKVtWWUEwQlpdMlNHM0U/SjdSKTEwOy5bVyEyO0ZAT1NWUllIVjwmPUxFO1UKLU02SzoxWTYvW0sqPlsuIilbQSU4STgnMyVZQyc5IV8wXiM9MVA+WyssS0NFVzVVVTxOTCpcM1kyPkxaRzYKLU1JWjZYREUtRzI/SFNHIFReIDtRWTFORiI4N0k8TUlHQT4pPCU4WFArKiZTP1hIQV1USU0/OlE/IiYzJ0YKLU1GUF8zIkIqM15EUlEoRztIJFVKSyxeQyQ5VUopSzFCJClISSxFRCo7KVc2R1pTLEhfQSRNWk5MNEdcVEAKLU0/PFZeQSxDSlwlVCdfJ0RKLFM6IUhRNy1AXUhWMyZFUzVQPztbOVpUIzJaLTBHREJdIUFQSlQpVkk+TVgKLU04N1dEK048T1YjW0JdRkE5KDUuLyw/P14tMFAzIEhATF5dISNGSkYlRSIgXV1OPikjMj8qWTVMQkhPOlYKLU1LNDUyVTstKj5EKlQ9TFgoUy89OStFRE4tJ0Q0XUJUTyAkT1UxUFFKV1VIKi5fMC1IWzlDUjIuL1woJigKLU0sMjdXNi1WNSFRVktOKVBdMjMyXkk6LVI3Q0BeJE06WFVdS1EvOCI5KTInODY0QzdPIlVHSSVFMiI1P0sKLU1DMF8qOSJAKV00X15SOipDVVNYXVBOTkNGLDlZJzs0WlM6WjQ6JCwxRi1YMlQuLCJQLEpBW1JRUiNMOkkKLU0mIDVISSA/IzEyJkBHIVMpNlNfMTEkKlZUXis9TlhZLzgwIigwVEskUlA5LDNAJ01TJVxTJzpQXlRLLFYKLU09VSstMTRUUiI0KltOUD5MPihRMkdVKDNaIidIKSNaTjIpOUhDREMoODtHUCQ/JDFLQCI1WVoqTEJaXkQKLU04PzozWiM1Ll1EX0M/STBGQlAoSTogVihTWClOVDQyWSNQUVMqPkckOlEhSjAtTEleRlpcUywwJDM5VloKLU0jPUM2XUUrWDMzSzQ9WitZPC1TJk0uMjswNiFTQ0QzOkY4Uz9dTVdNVixfQDAsOTIxN0oiPy4mPE9PPVcKLU0qQ0I8WSc2VUpUQElCOTQlLVtbMT0oUjwnLSVZNiM9ODsgQEA8IjM5TzhNKCU4TURaP0ZTNyYmLC5dVCgKLU0qRjhAOSBJW0M3XjRFOTk6VEQ2SE9FVyVGSiFcTjQ1W1goM0EzNSdVLjslIkskOEIjJy85KlNIQSpFMjUKLU1fXUc1KChCU0xKWVNRW0ZRPyY/JkxcWDk1N0YzOzw2I1M2JS1ELERYJ0BTRE0lMUpeIVBTV1JDRjk2MTkKLU0iQ1MnRE8mWkgzPVZaQD41ICtQRUlfTCcyQ1JLPE0zVzghNUVNLiw8Xy88WilCVSIxNiM2WjY7ODFaQFUKLU1HUFY7JVdRUS1FSEo0MjFGTTYyQ0BILl0iSDZcOzNZRUY7PCU6PlBfJ11eL0VKSi5fXU1WXChaJS1MPF8KLU0gPVRVKlFUWUFdVVdbUkBHKE8nRDBIX0VPPD9JJlVIVlI4PEErWEhZViQjLklSSzRVRUgnR0szQShcJFgKLU1OLyM9IUhXXUozNjsnSFUmUEI6SENMNlxSU0hQJENIVDgoXV8sNU5NVyJPQy43MDVdOFA3Jkc5VkQkPDoKLU1eIkUvRkZCSz9bISVMQC0xRFJGMlBRMyJcSzolQFAwXDBdODI3Iig5JUg0XjtWJUA4LT8kWVoxJk1RXicKLU0gNT5WRypeO0tKXlReOycuXyAvMU08JFJXWT1JKl9FKVBUWCA0S1BCUCgiLFM8WCJVXlsrQzhcUztfQzMKLU1eSSAvJ0lWIl05P0hKRywtKzdOM0YuUS8mLl1CT04qSCU0Ui5CNyRcQlc0NFI8KlUkJDBMOkwmQTReWyAKLU1IQE9XJDotMkVCL1hMWVAjVT00OU5TP0oiWURTJ1E7UFVbJzssXzE5SygjIj06NUBAXk1WIkdIQyNcJkcKLU1TRTFMSDU+JzVQPDI8LjZCM0lUMSs/RDFaRTpGOVg4NjVXPlArK1BQRTUwSCJUM1YmMEEsQls/JzlWVSIKLU0tKSNLXzxJSlkqPlpaSFpKPldbMCUsVzMiOiRFOj4nPUFaLFlcITtBPFYjM0ZcKVROP15YRzc2UFxJT0IKLU0yV0dWRUdBRUJAW08vNk0gSFQuOVBDJkg2XEY6SC0tPDpINygtLV01WVpJLDlUS0MsJVIvIz1CJ1ZEOV8KLU1MUzUnO0VcQ1FdOUhdXjA0OV06WlBKJDMmWShIXVleJFJGSS9DXFhHJUZCIiQuTl5bRjIhOjU5TCI/Rj8KLU1DTCQyPT86QF1HUkIiLVE7M1Y7Wzk1XUJbVS1OJFBDMD1OL1hYLjY7ISU6XC4mWjswIEhKJU0nRiVYJlkKLU0wN1xHWF8gVyguSiQwUCIlN0owPjBAU1VGNio/LkZUXEA4Mz5YOS8jMjkuXzFLLE5ZWDglIl5CUFQ3XDwKLU0mPU5WNFksIlhBJDc2LTRbM1VSUVFYKztRQEEjLVwkO15bN0dSRy8jSjI8R1ZIVCBdMDInMEhXKDNKUyIKLU1SPCIrRDYuRSQzLFtLPjkoIk8hXys5RUcpLF1BRilDRFdQJTo7UE9WUUhbR0ZQLUNTVlQ7TVRSO0JdLkAKLU05IjcqTlYkUSA5Pzo8PlRMXiokUF4lVVFcLF1PNSAmODVYLkVUV0xFUykwPFQ1MyM4MUVTSSkoKVkoVlwKLU1FXSJNVSElUlYuTyYwU1I0ICkpTzVJPic1K0FIXzxORVVBTVI/JV8wNC9ZJCAsISY5VU0kID9UVSQmQjkKLU0xT1czPS4mIzZYSiNEIzMpO1gjUCFFUDhBXTFMPTs0NywkK1NTPl5WWFo9RUhRQVsuIDZWWEAmTFsxMkoKLU0sPU84UylOODpFRlxcLydCRy8iPTNBMUYiWkVIWlU2MzQ+K1dJTThPW1owTFFGRCpKUyskJD5KIlBfWlkKLU1BXFEhK0wuRzoyIyE6I1E8OjJCK1VNMj4jVjFcNTQjQjxEVE0yVk1HWCg0RVkuVDo+RVJJUiNRUEpBMlAKLU0sVjpaUzAtLzA8I003SVdLI1AlUE9UW0ghJyguRDVGIE0pSiNdKiUhRlYmKi1BRjZWL1ZPIF07KEg+US4KLU0uO140LltGOFFHIzssPixGK0MgJzRAIi8mSVwhXDxIQ1ZGLk81S08kLyJFVSU7XUtCMzEtIFFaPERdSV0KLU08XjJETUtaTVg+KDYvPlwvODU2KjFNPEk7OFBKTUAnSktXSlErXlJNNTMgODNeVzZWSExdJSQ8Oiw2UlcKLU1GOC5TIU9ASSZAUlI2PiswS1MrRS4xNFhdT184UV8kQSVGQFldVitfRDdaPVFeIV0vLStXWk5NJF09Ij8KLU0nX1YnK08jWC1BSipDVlAjRChXUC5dQ0ZWWiJCQC5KKCBVRkUvWTQsRSw2TlNUI0FVMSI2MVM+OidXUVkKLU1AP0EmJyY1WTc5IStJPCRWKUlWUEQvXUUgL1dZNCQ2LiE/Ti0xMyI2S1wqLVorWTVdOVdYMl4zKSJUKVIKLU1DRFtFWVBGNCJIPk4pKy9RPilHSz1dOjdBOkE4SV4yUU8zQFpKRlNPNyU3VjJRJlYtJCspRFlVIVM3UCIKLU1MXEdTLzpJNFcjLz5WQUZNREdCLVIlPDciMj5DWT5CNFUzPzYxOT5bICZbSS9BKTFQLzgqSV0rPi5ALzMKLU0vNCZaLjlAKkMvU0E1T1E3QFYlTkxIQUZYJ0ciUjRBQFUxQz5TIVFMKltbQSdFRCUvSSRHMlVLJTUrJkIKLU0tKzhTODgmTDxbXExcW0g7WVIySSpSO14lLig2V1RCWFUrJiUiS1tEWUI2I0k9OVdZTE07PEE5JycpU00KLU05IyA3P08gWVdILUVQLiVbKEg7Uj4iVFIsO1YsTkdLKiNQIldCWCQ9IFQjLDA+Uk1HL0xJUFpfPVgoPioKLU0mKlFQKyhdKS8lIFlETCI0L0heJ108KlxPLUFbIFAxIlVaSEwmKSo/Tik2M0ddRTBSK1EvSS5GNjlQKzoKLU0iUDk2W1pCIUhXQ0NVRVFWLlA0NE4pJENLWCMjT0pcLiEzRVlSV0w/VCdFICk6SCs3N1ZRTzgsJi4tMkMKLU0qQTMxOCBOLTBTL0Q5QklJOF4xUFVVLUokOExZMy85VVkmJjxaLk8gIihQXVNTVUhFW15GS1tGO0JWLkAKLU1AJjslO09CL108XV03QCUuNEpLUlhZUygsVDFMNzI6NCMlVVNcNlBCPVEyNyNRKj5PPyhSSDZCJ1QhODkKLU08RCRAMUFAS0k9MEUyQk0tUS8rNlVVV11IWDldMlpePSIlQTosRkEpS11LQ1E7VEFRUSxSVy0vLFskN1QKLU1FKzBFLzVYMitWRzs9PE8hITdOSjtJK1FOIUVaKiJeOCokLkIvTigsICdIQSAiTzAlNUQ0QSM1W10zRUAKLU01L0FSKz1bWV5GPkUmIztbUT9TWi5KWE0qLiovITQqSDAzJV48Ry5CVylXNStOLEVVTi00UjUsM1A0MjMKLU1OVChUIztKOzImXkwiMVMrSVdHXU1JNE1NWyo+P0AoOU1WOzAjVU1ZNCEsUTNPOF01KkpcVCExXEtHXVgKLU03JTozKFUgRClfXzBIRkEnO0dIT0UqSi5GIDtRSENNXVlbLjFcNUw0KlRYKUhOLFo+Ry1OUStbP101WTIKLU1XKjBJLzFCTiRdVSw4MyM3SkImQ0xAN0YxUEFIMC08MCYzSEIgUlE+LVIkRU5CNFtFMTUsQEs1JDc0VVsKLU0vNjM7PkkvMVEjUzJLPUhFOTImQkRGKTxIKilDSTAnU0VQUUVPMDIpKlM4XjxFJFNESUtMMFZXQSBdJCUKLU09QlArWjdMTkkkVEdQQj04SSk1LDJRNig1P00vNz5WQExLST0tMilDJ1VARDUhX11XNTUrXjlSKCopTyoKLU06KyQtNShKPkoxJE1HV18xOyBaKDosITVXLCUuMzNdT09XQlszWVNHQj9OLlZaPltDOCMgJVhUWUBULjYKLU0nKT84JCQgOTswJEgwVSJYOUUmIjdXLk1OIUQ6TD1cS0U9NzwgRzkvNERVU1BEMilVIypWKU5AWDo9X1YKLU1TRzk6T1MmO1ZYOE0tV0hGXkIwSCs2RSY4Wlo8PlYwRVs0KksiOyBJLVxQRlouSDY1VUEzIlBWWUkhKi8KLU1bWCwkSUZeTkdTMyNRIC8oRlRXSDggIjgqNjhFMFoxSUFIQTM0SE5JWCBHXzlOXFBOTEkrWSEsPSQrUE8KLU0qIkY5PDw+JyM0JS1JK0tNOFIpXSEpVzVLJyFcXzMwQy1PW1E+Vk5TPz41Wy9ERS9GNS9DWjgzJj1MJCMKLU1SIz4wKjMiLjNUXiZeO0M+NTdTVzhDWylRU0Q1UzI4Jz4oOklARj8yPE8jIzJIVCQ3JSkxMj9JKFtTTysKLU03JzM5QFVcX0onWlUmLFcuIzNVNEZMMlUvVV5JJjUtJSlBJDRQKC4kUS1fWTY+TyVUUSQsIVBQKU5NIFUKLU1WLUBcID4pTUo0Ty8uNSM/PU9XXkhAPF1HXTRWSTdbXV8/Oz5UOF4lSUUkSE8oJlEiMl5KXCAnIjIiTDAKLU0tKV1KIUI6UEQ9ODspPiEnMCEiWSBSWVAnVk9eUTROR1dXOC8tKTBKOS8nOkVSLFFNWl9SVDY3MyI+O1gKLU0uO0xMJFsvUCwtRkpJNU06LitBUktBKDNLJTc2Vjg0XCYmJyBJVEU4UDReRVE4UDsjVSZeTE8kMCNNQD4KLU1CLVMjIT09UjwiKClDICJKPFZCWCxUUF86MEchIyomTywrUDBUPVAnOUBLJ14mVVUjLztZSjU7PD1HMyIKLU1eRFQoMisjLSQxLFlQSideMSNLNz03WzddIVo0PEVNTyJXU0ErKj43I1szMTRQU1ZOV1w0KjdUPT4hJzMKLU0tUEddUUAnL1xIVS9IICVdSyBdJTJEQ1BOODRfLVQhQTokKCBdNihQNS5BISFVXCJBP0BRMF8gJDZMLVcKLU0iR1olUlI3KjUsIFNLKVFEVTtKWE1AQiY1SCJPMSdQLjczNE0hNTNCI0UlSCIuLyg/NCIiXFc4W0dVXi8KLU09LTggRS40NDUiLFheTFUiQFtSV0BbVkRULjw6Sk5OLjtCXl0oQj9ZNFQmLjtFIiEqXSMiXydFIU8tJ1AKLU0xRFoxLVtIPFhFICcqIUYgLj5GVTIwPlkwSVotN1NHKTE3SkFONyo0LUBIODguSEM4XlEhNTwtU0pNIiQKLU03SEYtNU01QSc5PF8iXlwrXT4qMCVeVkNBJ0hBUCwyViJSOERDIjVVVCwkIiZbUlpPUkc+JTomUFo4VUQKLU0/RE9bNz8kJCVVVDleMUMmIlA7LVE1O05GN1tDIkhRNTVSOCYwU0k4SV1YUTQnSFkhLyhKSDIhMkRWJyIKLU0mOTVWN1g/OShRTCFRKEVWQD1IKV89MkFDTEtEKiApKzQjMzs3OShdV1s7USFEWlZGSj4sWTc6TkpKWywKLU02TSgqPDBJRVcuLTM3MiteICA+LEA/X1czVyhPVE1bJjpVTTFPOEBSRSZPVCIwNFIvSD1JJFhCUVRALFYKLU1IRkQkX1dDOjcyXUpURFxBMFsiTkQwSVgkOVdRMCteV1s6X0olKzlOS11aTTVaQEk+Xj1aJkxWQicvKzcKLU1YPzAwKThPXzYrQUouKjJeTUopSCAuXVpaSVRQRDI+KSYqRjNPIT1XW1AgVDNWLEdPWD43IypHUS5PJ10KLU1YQSwvKlNZODlRQF9fXV1NVUhdJ0MlKTBJKTsuQCNERCQ9TTYhQl8nRiskSFpGUCgwWi1IWyxNUysmMjMKLU1aNS8kKVgpWSlDJiIzISchSC1XS1VDVSpCMT9ZOUEgTCgoMFY0K1gpQkggP00qMk1RIVo8P1ssUCc6XSoKLU0kS1RBRkxFK04xUC9GNzVDQTdSTkExTCtHNF0wI1FWP1JRQitUIjU0Lz04MCMhT1c9VE9EIi5PR1MyPCwKLU1PJ1JeS00xKTVIOTQ7OVQqSlYyOCgvUTwmOi1ZJEBHWUtXMkY4NylSRCpaUFAyTDFPJFRESVQoNkRdVV4KLU1GR0swPENPS1hYP0hUVDQ8PC9TSSYmKkZNTUVFJ1BbPioxLEZTRjJLPjApXykkI0o6Kzg7PzBNQV48TUwKLU08Mz5YUk8mLjMkXT9EKipVOS8uSio7WTVIMV5PSU0gVkpSODxRUjNSLUJVWl0jJz9WMklYOi9GXyk+IDoKLU0iV1NfUUxXN1BKPkEzIkBSNC01OERTIlgzM1Y+SSZOXU5aI0VXREpMKTRQRlteRloiXCc6UyolK1pPX0cKLU0wOzAqNFwsN0I0VkhBIFVPX1hcPDNIWl8pSkAtX0I+RTZcQipVMEg2KyA2RilaWz9QXkNSJylKKVcyJjAKLU1RMiIuTCRIVyQpVTYuUEshL11XSC8xIzRDP0lDTTYuLjxdIksqQTBNIDpJPF8wMS8yXFQ6MTUyOkQ+Ty0KLU00UC4lWyJGLEsiQUkmKyxBSkc9Pl9PJzMnTDoiWjNUIF1APlQuIVIxNSJOMTpbNkc4MVJdSTU0RjVUOFcKLU0sVTgxUyM/UUgzXldRUlYuQS1TLTdSRyomSUInSys1VzE8LkBTJi0gLTs7KSROW1VeKFA2SlckKllUOl8KLU0vUDowPjpILiFIKCtGQyEtRUIgOj46XiEsR0InT0EwNiAuXkpCSjBXLjtCKSlCNTdMIiMwPSk3Okk9UkgKLU1bQiNVL0oiLSA9Pjk3Rj9JRCFePUM8IjRfIT5IP0kkJD4kJj03WUk7QkkxKj02Jy1dPUxOWF4yL1BGI1wKLU1POEUrVTYxMkxVSCAtUl4+SU1HS1hUJzReJkVLVV0/PDspSzRTVygjKEJSJiwhMVlMPTNKREAmNU1HIkAKLU01Rj1NTFQvSj1MSyBAVE5MSyc9VFpGMSk1V1k0O1xaUVhLXjVdWD06TFw/QEleOkBMLz5SPj5WSEk5LT4KLU0yUTlSTkpVUjMiPTpAIyEyMFNAXUpLRVU7K1EtPEZcXSVFPT4gUS8/Qj5FIiNVI19UXyQyQTVLSS1fUjEKLU0mVDtfTENaPi1WJVYxTCRDS1I0PTUzVFEpQk4jXTg4IVQjJDxYJTBUVlZcXTIlSEkrNj4pTkRTMFdWMjMKLU1UQThUWiFfVkxTLltfXTpEPEpBJS4qQScyRidSWl9VJkEgIlgoO19QRT9WXD1QSEs9TUcoUTYlVT1eRTcKLU04TSckNTlLXyNHNyBBSilBMDI1WCApWUApIzVBRVxPRDY1Vl9HWFUqVCM6XDRNUThUOFhPKCctUDMgQCwKLU0nOjUjODAlSkhNUEFJLElLWT80MTlcXjM1LkYxVVE3WFlIKi5YWFVfRCQxJEIhIDlIJEFOKypfS11YOUYKLU1TMVAjQFxMMStfIkZYQTU1IC5fKDM2TCg1NSlVQV1FRDslQTVNRkJMJSxHXjZfISVTV1crKFA6QTBFQUEKLU0zUFRfVlVARSNWOUNfS0EqI0pfWDElRiZcUz8nSEJQJiNTWzM9MTFWWT1cLSc+SlY7OV4/IzIsU0UoQCQKLU0qREBHIjIsRDxZVzwhWj04KysqQlQmPi8nN0tCKysxVzZcW0k9OSglMUwnUzAhIzhYTyJUJ1skK1U5RSgKLU1GNTE9Ql5PVDdJLF83MlVFVUxXVDhCJClYODtQKjgoN1RLTT0+Mj9SPDpONV1OVEwqIUNDJ0gnRUJWLV8KLU1HLFItRFxdMipXPSJfUFkvTkgmXkEoP0hdXERWVVtHTVhXXylWOCE3RlRHVlFNNzhSVD5GQT4mXSczSzMKLU0hVCE9RTQ7RDpBT0EgJE9MPTxePTI/RTNBVzZeOihJUktMSUogMkcoUFhPIiYtRC9OWTVKVFMiJ1NGTy0KLU04UURHTSNPQk0vRjdRNUQqM1hMQS5PVionXE9VQSxbXCU+TFM4SVczK0ZISigxSUhTMkMlMy5cJCZGKz8KLU0qISg/JyhLN0dcTUUqREVcJDBJXUROXi4+UlMnJyMgR01NW18xMyw4T1lfTCkhJjJKSk5SWyEqPE8yJEgKLU05PCJJVyUvSDYiL1VdNVo5SCdYOEJbQDxENl0mOkFBWVgmRFZNKidAO1VaPi83OyhfOSpfV182NEwrXDEKLU1cJUlISEpOWStUNjxQWzhPK0haRjo4ISBbVV4+OVpYKTlNM0c8XStCUTJCLlUoUlpYJkIhMV1SRFM+RjEKLU0gQj5GJzsoUiIwOkg9SVNfR1JQUEs8MEYiL0g+Il5XRi9HR1smUlQuM0s7MDVcTSw1TEtDUThHWUlbWV4KLU1ZU0E6VC4vMydaLiNCJSVZWksnNDFYVzUtUVlZRShLTEtKO0gxXS02P1lLKzwoRyY6XFQpVjFZWC8oWFsKLU03V08kLz8ySFw4TTY3OlFJOEA7UllIJls2SSZBKS5LTTgxXV9eWkIuXS0rOSUrNF0pUzdUU1hKRU8zXTAKLU0rVD0tUyktW1NaN1dDQUlPTUJPJiZYKzQyJSsxRVkmPiVfSVFKVCtQJkhPJzlKQSs/LTRCSls2Oz9RLSgKLU1HIUE4VCU4Vl1BMTs8SD4kWCxVRikuWFwrKVAlLjcvNTUmNEQxJEQjVitXJD8jPVg0JCZbKDZYX0VPXksKLU1HNC5UWSw4KUcjRyszPU5JTjdFWU4wJiRUKF4yQV5PMSgsPideOFglIDxLMiYqWDhAUTBWQEtfXiRbJzUKLU0uLk4wNEFaQy8oVkVIRFdeRllZPVFbPEZGVS1PQCVVOEpTQSVGWjlESy88XjA9VjpcNCZTQCBUXyREXikKLU1QLUJeSTJYMjImS0ZMK1I6QidcXV9WXCpTXkhOM1smNj06U01PJlY3KSMuSCM7MC5JSFo3VUA0SVYnIjAKLU1KSy4rSFhaNkJeTU9IV0FWM1pXVC8rQUhAKU4rSDcpT11HWTRCQFpQVCxeVUZPQFUuVCFHTjErPVtfTTIKLU1FNzc4XDgtXykwTyksTV5VXjZDVlIxKltGMypAMDZZQ05AQTtPRz8pJyZAKyNJSyEqK0ZXTT5eK109Nk0KLU1PNzRXSiBTKzs3QCVFQi9BKUQhLjo7I11XJCJWUTZFMCMyOlI0XzJLPVAlVks+Lz1QMiA/Ty9SPy4jPlEKLU1GTkInMUolJS5YW1NSW0swTy0iMCwxTSAwKCNBPEo1KS1JTltWICBcODUjUyBWV1dCWkIvNzwuJDgiS0YKLU1fJFw/LC0nSSxHLilSNyRRX0ozNlRBWTwkRFZDXEEoSiwrUFA4IFQ6WzdNXFgyMEk8RzkqNUw+S14nSD8KLU1BTTpPXFdaVCteOlZLPFYwL1wkMCROOy9VPV8gIykuXF5AUUsrRjQvKlwwW05GRTFFQCExJV9MXCk5N1oKLU0lKzxdNC0vLUlYKSQrM0EiSkM6X1A5Wj42T0JQLkYhMFNZQkI5MCI1PytMIT1SRCVWSSNHLTZURDMnPlMKLU1QKUgrRkg9UzldSDE9QzhaXEQqRkVTRFo/Oy1bWy9AVCYxOlIlK1tTL1JdJDFRXE5SKDwuPjVdXzdQOTMKLU1ePFIzOD45QS9DWVUjIjcmTyZJICg8QV1LRFhFKEBfT0FJOTogJzdCWlspWTdANjwlVz0vIkNDXFwvMkgKLU0wL1wuODpaVSlQUiksKiQpTkQhWzIwJE9YJzBUNCNXLy4kLl06UkBIPT0zWUBMXC5FNEVUR1cpODghKD4KLU0rNEVZWCgrOD0+NyNTIixBP0ZaSiU+XlssMlRXITNGMzc0Pk4zTjdJMkFTS1YvTzw6LTMuKT0tVyhBLCwKLU0rMyRBUkFQPCFcWTcnIUUoVEBJKV8iIjkjJzwvLShRNT5QKF1AT0JLMkwiPkNZQCcnUC0pRCEoOFI1T0MKLU09NksrOFlEJkZcPkIgMS9QUEtQOU5eKDohP0ZYWEs1SDAhOz8rKlNPIVpdPUlZN01BKjYrOjNETSVVUzoKLU0vSCMiWEU+RlhHKC8jT1ZdIztePE9UWEJMKCY6L1hHQlVdXlVaQidNVkJCKlokTl07I0xTIEcjRC9EQD4KLU0iKSI9Rlg9VVtKXF43IlopRz81RCJbMS9bOz4gKFJFTFlbUixNKS8gSjwkTl42S1EpXTgqSVlNPCRWOz4KLU1UOTtfNCYuMSY0MzFLSjpTU01LSCJBIitdV0FBOltXXVtUKUhNTCc9KUJCRUM9LD0pTSRPQiksQCRAPzkKLU06QDFDX1Q/SykrJChWX1lXT0RbS0A7JkJYOlhONzUzXl81LS85LFdQTC4yRChJSVAsUzNPS1wxOVI7UEQKLU0wX0ZePk8/Ryo6Pj89KlI7J0BOME8gOEkgICAgICAgISAjOCBHUCRdIEBYIyUgMS4hO1QnN1BEViJUJC0KLU1AMF9UJElQICAgICAgITggKzAhIyAlSCA8ICInIClUIE0gIyogLiQgXVAkLiAyMCAgIDA6ICAkMVghMzIKLU0iRiwqMkBKLCAvJCJYIT9GIlY4MTEhIkcgVCg+UVFZJiQ5TCwkMjQtKT5UPFYgWVsjKVgtJiFYSSRaRCkKLU05Qi4zIylQOycyKVMhMlQzVyIyKSkuRClAUUhQKS40MEkwUTolOUBFMyErVSU6XDtcMiZaJkkgKCNAIFMKLU0iQVwxLCBNXyEkTDQ5UCo7JyM4L0FCMiMmOTgvSCBOXyBCUCVKUC4oKEZQPVVQPUwkSywtNVEmPyVeQCQKLU0jME5VICYkIURRT1wjX1Q0OCBSTiUgWEEoIUIzKEskLz8iMDYiN0wgI0I4UCIsVEJcQUZWJDBYJFNBPUQKLU0lVkgzPkBEPCMjVEVTISclJT9UMVYiLzsiXVBDWzFQISMiXEY5ITgmI00wMiIxRDUlVjhFJlAoKyUlLCgKLU06IVFaJk1cRjUxJTklUjQjJ0FRJCNbLDhIUiMuIClUKVUhP18oPDg9MSI1TylNKDQoIUpfJ1Q4IkpQI1QKLU0nVDgkSyBaTikzUCFRICYxJVZAPSZANzUgTyRGOFAxRiJRLDY6QVhdIzcsIzwwQlwhTFQwQjEyPyNFPCsKLU0/ITJOJ01IRj8hVTAoM1AvPDBHPyM9SCpGIEw/Il5APF8gWzcmRyxAIkEkIichKD9fQSc6JjJANUFSJUUKLU0lIiQ1PEFbTiBGUDQ+UTZHI1IkOFUiLVYlMEgmLVFPJyQjXCkkIiAkJjpEN0wgJEIpT0ggTlIsMChBKDIKLU0rUCdCJ1pcL1lAISwiVCxFRFFQUSZXLDZLQFM5JzdEPDJCIkEiRTBBISA6MCEmLD9YMStQKDtMI1ZROT4KLU0oVlwsJUBGJCY0QCUlUEJQJyhEJU4gTEcpSyglTSAzLiY1JENEQClXIyZYI1FCOCQjWTA+PkE0OyQ1VCgKLU1LQEpIIzokQT5QIyokVyAhJjE9XCAhJEJDUSpcIy9ARjwgJUcjW1wwSkIgQCRbIEMsQUcuKCpILydAS1MKLU0hMSwqWUE3JSgzID0gMFQhJlVAIVwwTU4iVDg2TFFRQyQ/MEMxUUFYI09QMkBQTE8jNkAxNCItTSI3XCsKLU0rUSM3IktYMiAwPSwpRlhBIlAlSyFRJColMTYgIV5AOEZBOEooXVAyPTIkRic/MCpFMCRBIzIgISRQSDkKLU0iKVQwIjBLMidQMDI4QictJC9MO1xAWTwmOyQhNSFEXyIkRCo8IUJBJ1U4PkghN0IpNiwwViBWKidVMCcKLU0/IF9GIlpQLUAxRDApRTAoP0IrQihdNDdPIiFYIFVEJDIgMjwgRlAyXlAiOCEkMD0wUSopI1MkLy8gSEcKLU0kMyQuOyEkLCJLIDBdMDtBJkQsNSpRUlMjJzg3OTIyVCJcVCNFQV4zJyJANTUwMSomUDQ/QVE3UCdCSDsKLU1RIjJUIlJcJTRCLikpPiA3IiAiRChMVCIqUCZSKC9UMzYxTCkiNCAhJzA5SSZDRDo2IjwlJlEoRj5ARksKLU0gJDwzLzEyUyQyUEMmIF5aKCs0JV1QLkwlTCA0VjFMWSQoUCtHMEM7Ij9YOj8gIloiJ1Q0PyFILyNPREUKLU1FUSQ3Jis8OFBRXD0lXUgqPkIsSylATCUoQCBSI11AMSgxXCohOTg3VDI3UiA8JDogUTs0IUpMNj5QQFwKLU0iWjQuXCBDWShGPDMuITU9IFNcKzpCL0kiKShAOjE/RyIiQCtZMUdRJFckKlQxUVIkTyA4OlA3JSFLVEYKLU1HIFUoICdMMUIyKEspLFgrPUBDVilOKC47IiJZIUIoL0pRUFQjNUwyUkE1KSIsKCAgMCdbJ1IkNF0hWjsKLU0oTFxAI0IpSiE+TEROMS0sIyBcNVUgRzgiVEQgTCAjNSJCXEZUUCU1Jkk8M1tAQj8oOCBGTUE2RSFNUCwKLU0nITtZIkxYJlZBT10gSjhAMSBIUSUoJDAlUC4vIlI0Ny4gPkMnRTgxK0FUISVZKCs1QDomJShUOjgiJ1gKLU0oTDQiVFBALSEqJDEiMDMkJik8RD9AWkEiTSgoUTI0TSg6QCIhUCUmJFI4KVNAI1AiUCQ3WSFRQyVEIDYKLU0qMSo2IDkgPl0gRiEiTSA7UlI6QSdXQDMiIFRTJixMIE8gTTQjQlAiU0BISSBDRDFDMjNfJ0Q8OjNBIiUKLU0nKzgxVkBXMylOUDxFQE1NJyc0M00gLi4hKSg6XUI0JyVNODFaUEAyKT84J1oiNV4pQ0g6TEI4XCBWWEEKLU0wUCc/I08sPikwRkMkT1g4UUFEPSFNTEE/UjZVJz5IN0wiJFQjSUw6LDI3TShBPDwlIF0wIEgsLVRCL0wKLU0hX1ApVCBeXiRIOEJGQEtOJTJURFoxJi0nTyw+QFFdICkvSCM/MEYzIjogIjRQKigkRkBFVTAwTSYyIDYKLU00IjI2Ii8sQDcyNykgXCwjJzBaTyhBSEYuUFBOJiFcOlohUkwlSlAmXlEmMykjSDVYIiZPIV0gK1EhVUUKLU0jS1A2UiIpKCgiREI8USE6KEg8JFZQWk0mPEwgKUIsPCFJREUgUElAJC0wKlEwOTEoMiw8XlElMCA6OC0KLU0sUjJDJ1A0MlghQ10kUCAgQSEqKCRZSChSMFFSJ1BMQiFROD0mXiAnRzI5QyQiPD1DQCFKIU9EOFIhRF4KLU0lUFBFNVA7LyhDPEY1UEsuIko4Qk4wMjolWUglLjBESCBPOChVQjldKUhYITAgXi0iTjwuRVAySCdSLDgKLU0uQD9QJDdYPighWV8jXTwkW0FSNiQqTCIpUEVFJzNALjIwMjckIjQiOUEtVyNCOCJWMDgxIycoI11QMU4KLU0mMlQsODI6MSRNNCAkUE4jIy8oJCxAQi8jRixFL0I7WSEvSDgjIS9YIVVYM1QxXFwkSiQ1VCEiLCFeXDsKLU1bIE8yJ0hALlxRMFInJiQ8TSI4TyZKSDdZMiIiJTBUIlRQXEcnRTgoOCA5SiU2QDBQUUI+ITI0MSEhMT4KLU0mQkAlR0AsIChCIDlBIExAKSMwJT5QMS8pNSwoWEEtXCEvODdWUTYrKEssKVJQJDMnX0wyL0AvLyAqNDoKLU1VID5VIFg4RyJQNi0gJFg5QUFYKCAqTCQ/UCAkJTAgKyggUDknMzhFOzEqPyBDMDxeIE0uKTQ4IlVAR0cKLU0mOkA5KEE6LygoWDohIV5NIFAgMScxXCwgVCBFX1FJMCQxLD4hQiUmIDRQIEsyIFEoMyggISFGQiM6NCwKLU0qIS4mIEkwJV0hSkcmJig5MlFfUidPREA6QjM/KFxEKCQxLj0jM1A6WVFFTyZBTDAtUDJYJ1Q0MChAWUwKLU0mUjAoQzAsRSEoKCBBMSEpJj5cJyRQLz4lODBBTTAkTCIwOC1PQS45JS5YNlZCJz8mOlQgLDE2MCU5QD8KLU1AIFVRJVJcNFshPSslQCA3KEIxJyI6WCYuUilbIStQRjpRK1AiQFRCRUFCTSgmUDtaIFFZJiUgKF4xQjMKLU0iIlhELkBbVSkiKC4mIjAoJihYLVlRTkklIDg+KyBMQSctWEUnIEQjIlVQIkAxN14hLzwoPTFWRCRPVEQKLU1YMU42IiBYLyNAJCMlMFwlUTBRSCVMQC0lUFsjIzo8N1EyOC8hIlAwLTBaOilARCpSMUNbIUI8N14iNUIKLU0gOixCVCEqJyAoTDNcQjM1Ji0oOVtQP0AgIiA5OVBKICAvVCwgIiNWIVEkLiUxVCUmMDwtUFBRWiMuNC0KLU01UV4zJzEoICMxQ0gjQCxGPyBSPiBZLDhSIV5CKF5AMCdQNS8jSCQ2PkFLQCJGTC9DMDoxIClMKloxRSEKLU0mK1g+TVBHPiNeTCogIS5HISkoIDMxRF8hVTQ1LFFcSiJITCErMSw+IjBQOi8iOiMgLkw4SyI5SiVUVDEKLU1AMi1bJiksQTtCMjInWExGUyFEJSZPOC5dMT5IIj4kIkxRSVIhTiQsPFIqSicnLDdQIVNcJUNUMUUwNl8KLU0pRkQ4V0EpJyRIJCxdQTpbJSZUNEdRSCMpSCghSiEkWiAiLCJBMV9fKSJcNikgRzElJyAzWFFfWSFcKEIKLU0jITk2JzokLCsgSkwiJDg8M1BbISYvPDQrMTRNKCFcL1AwW1UlQ0RFSTEsIyRJRDZYISQqKShANyMhXSUKLU0iQCAsUCFfIyVMSClZUiJXI1g8IjQxR1QlTDwmKjElLCgvKCRNMipQI0ggL18xOj4gJEg2PlEzTCA6NCYKLU0hMCosIElQNixQPTcjTyQgPkIqVyY2NEVVICxdITM8Jl4gWScmRzwrUTFWQChQTEJbUScyIzRYMlIgTjoKLU0jXzQ7WyE3WSVVTCtEMDVWIl9MKjUwRy4hIlgqWUAtMig/SC1MQDMlJyRAIkpQSlwjT1A2RUBcUSQuQEEKLU0jQTc6JkIwKkUhTSclIFw6RyBTWSVLWCc+UEBdID8wNT0xO1smW1wvOlAtKShFXD1bMClJIlZEKFFQIV0KLU0mRjhAV1A9RSIgKENSIVtbJ0o4QlkwLFsjODg/IEIqKiVCPEA4UEMiIDhMP0ZAO0InWSRASTFLPSFOXC8KLU1FQElJJCkwLVRCOjUlNVQwNjFQKyFaMEI9ISU6ISBII01BLyglKkggKzEnMyFMXD0mIF5ZKFgsRlxRO1UKLU0nSEwvOCBdRCVdRCAuQCkgKFFQIkYgXS8pKzRBTjFbPCVAJCMiQCdBIVYgJE0hL00nSzg9STIvRyk+WCoKLU1AMSYlIVBQOFFRI0sjIChASTE6VSMrWEYgUFkhIiIgKywhOEogJFRDPkFCKSBdNCtXUSZcJSFIJj1BID8KLU0jJ1wlPUExXyFPPENSUTEhIEwoKk9CI04pSkApXFBLXyI8VC0zIElNI0gkKkhAPCcgKEgjR0IuPig0VDEKLU05Qic8JiwgRipCJ00pNFAjWTE7Nic4PEUiUiJKIUgkKlMyLiUoI1QmTzI5MiAtND5TMExFITgsKFkhQ1AKLU0oKEQzOjEyRSIsTDlcUjlJIlo4RCVQLj8mPzQlTCFcTig/IDdMUVpSIiFQN1YhMUEgSDAtTzE8UyZdOD0KLU1EUStaJD9IKy9CMjImQjgkViAgUiguPDdYMTQqKFZUOVdAQTshQkAlJFBbIyNePDo/USEgJFZcI11QUjAKLU0lOjQyVUBLICc2NCIlIC9XIzZQN1ghTFQhIiQ0VkA2SSU8PCA/UVUuJj00PUEhM0EhJyAyLUA7LSI5VDMKLU1dIipQI14wPVFCOlYhVVA6XEBWWiU4IC8iMSw4IU8wRkEwNDgjMzgnVTFSMyFEWD5DQTI7KTQkJDdAW1YKLU0hViQtI0IkMiYwICBfQEhaKTs0OTJBLUAgOFQqJCFUXCkjTEAqICMnKDc4IEgxQzgmOlQ1SjA+RiJfTDQKLU1DUChPJFVYIS5QODIoSUQ8JEImTiNMOD4vIFMuIVAoPDkgSSglN1RFREIoQiNDTDhBMT1cI0FIISghIU4KLU0lSjAtRFFQJiRTIEItQUJTI1QkQ1AhXDEkMEQxO1BQNyM+KCZEUT4uIVhEPFNRQVIiJkA5SEE7NiMtXC8KLU0wQClNI1dcNUIhTFIlJCA/OTBHWyYlJDtHUVUgIStQMyhARkknKiAuQSE7ISk8QEVJUU8wIDtMPU8iJDEKLU0lXig/UFE7ISMoID4xIjBaJC08RENBKFwnKDBCKCBdTSBEQERVUTxCJkZENlJQNVopSjg7TCBGOiIkIDQKLU03UDtSJjtQRyFSO0QoW1A6MzEyMiM9QDkpMjY/IUUoNTBAXVsiLCQ5PzEvSSZIQEIvMTdfI1w4JlIgUlgKLU0oKVw0UEI7WyZOMDc/UDFCJSc8QS0xOjAmP0QzXkFLQCA8UCFWUDRRIk1EPzghRkInSjg7OkI6RSkqXC4KLU1UMjlKJCY8LyBQKVMpPUQoOTAiQCEyXEVSQiVQKSUsQyExUlUnX0w3QDFOPCdZVDY/MVZWIjc8IEFQJVQKLU0mKVgxXzA/SyhdLCUrITYnKFhMQkRCLEIoIkAxPUFcTCdUNDwsISYiJV5QISowMDkmVDBFRTAkVyhPPEIKLU1MUT06I15URTswRywkRjwxMyBULSM8TCIiUi5WJy5EPzBQLlYjLVwhSFFYJSJORDIlIDZaKSggJkdCODAKLU0gRSAvLzFXKCUrMCI3UEwuJyosLF8hU1QpJ1wjWkIxViA5ICFZMjtCIS5EIC0hTV8jKCgqMEEuLyMtTDAKLU1DMjNEJkxQNFZRVTQhKTxEIyEsUShbRCUvICRSIiUkRlEhXlAgXVw7U0E4SyZPSDhTIEZMIS80Pz0wKioKLU0jP0g+MzA9NSc4WCI3IDAsJ18kP1owO1EnOigvVVA7MSJIUD8xMCAhIDcwIzJQUj0lTUw2MiBaSCI2REAKLU1JIStGIFooL1pRXzUiQ1A5SVBTRiZUUEAzQCtVIyxMLy5RWjggPkA8QUIzTyI8UEIjQVU9KDxYOyMwV0cKLU0oOkQ3NTFeOShXJDciMT1eIl1cL1FAUFsoUSxCVSFYWyI6IDEyIVlBIFQoNkQiMzcgP0wvRSIpPyVFPEMKLU0vIFA7JzYsL1IwSzUnTkRBOEE/KiY2RDhNICpGJTJANU9CMFMlUCwqIEAhSiFaKDNGQE4zKUFEJC9AKF4KLU0pIiBBIjFaOSUhXEUwMFZSKUY0PDogLjgoOFAzSiI4Kyk3QEJVMiItKC1UPk0gWCUoN1grWCFaJSQyKCAKLU0nIDhZJDJIJTNBLVkoSjxDQiFURiBUMC1AQjBRKSJYLFNQLjAgMiglVjElLCVRXDAsQF5DJU8oQVFQIkcKLU0oKlApTFFMNCRYVDk9UEhAIEFAKkpQIyEnLjgrQDFZWiBRJC9fQSE4IStUQkUgOjYkO1Q5ITBUPSYxPCUKLU1YQT8pIStUJDsxL14jNTwkLTA+RiZBLDxfUUApJldINlFQNFohIkgnQ1ApJyAmIEIzMFAkJEwgPEFAND4KLU0mTEg3TUIvPiNUQC06ITA9IEo0PTMwL0kjRkwlVSBMICZXRC9cUTBLIlxYJ1ohPSAjWSRBPyBIQyVWJDQKLU1VMCM0JDpQKjtRNEgnKVxCQVBLIiZKSEBDUUg0JUE0RFRAMkEhVzAmQzFNRikxNDpHQD8/JCRIPTgiLikKLU0iQTQ8IzFfPyggUCVLIUswKS9MNFhSOUYkMyw2WCBQLyVZTDxEISAzIF1YIz4yIkQnTyw+JyBQQygmPEIKLU1KMS1QJUkkLl1RITwgVCxAKVBZSiM8MERLQU1PIVUwPDEhJSsgQCg4U0EuOCBAPCBFUDE/IVggO18wIikKLU0lRkBELzBHPidUIDInQVdbIydUPzJBUSQoVCwrWyAmTSQpTCI7MSkvIEQwRVFCJzQnSlA4RFIjWSRWRCkKLU05UCcsJypMOjoxRUQpT1wjKTAuMyg/QDE3MCBYKSU8Ol8gXS0oJjA3ViI4UyM+XCJNIDNLIDIwIzAwUVYKLU0pK1guRyAkMyEkTCVSQUslISNAQTtRXyshNzAzKUBMWik4VDZMQCNMKC9MNSoiIykoQlwuKCAhRiYrIC8KLU1JMCxJIjJUPDdAMEQgWVw4MSA8VSIwNDlSMCNKJlZcJCMxXiwkKzhCNFAxNyJOJDRYUi82JFAoQTdQPlsKLU0pPjRCXVBOKyFEPCEvMCdcJD9cRU5BKSAmS0AnOiAzSylGQDxZQCJQIDNULDwxNzEiUiAlRVAoQSg0KEQKLU0rIi0+JEUsMjxARTwjXyAlR0FPWSAiOCkxMEBBIDY8NiBCIzwnLDgmNDAwMilHKCFbICZKJTUgRFYhOycKLU0mKTQtP1AtXykgKCEsUF1PICEoPE1APSIhUFQhOCFeNSM+WEZQMFtfKFBYPTMwWFIoMSxATEEhUSMqSCIKLU06MCBGJVNMLSwhR04hQDwwU1FBUiFdQEMhMTdHJEpENjcxLEwkLUA1OyFCJCRUTCtGMD8lJ14gKSRQWD0KLU0lTyA4LFAwOyI0IDQiQS9aJCNUQkcwVlEoMUw0QFA0QCk9WEYyUURAIDVYO00iJFsmMVQzKCEiQCBbRDYKLU1bMSs0JVc4NEMiJSsgWEQoOiFYTyJTRDBJQjs3IjowOVJAJEshWzwuSDIxVCQ7PDA/MSJRJl5AISowXkkKLU0oNTwhUFBaXSJYMDcoQT0kI15cNUVQKk8pIkxEI0FLNCRXOD9YMDg3JVJIQkZQWkEpKCgtTVBZTiFCUDgKLU0mMCUjJTs4LkVSKigoK0Q6WiA3WCM2LEVMIU9WJzkwQj0wUC0hQDg0IVElLiZKSDxaQjErIEMoJFdCJlAKLU0iTkg4PCFXRyEjTEI+QSReITswKFlBWlUoKTQuNzBOSCRFLCFQUFdIIUJQPUdRRU0jXFQ/KSAlISQ6ICYKLU0/Qi9CIDcsPltQMzgoUTgjWTA8TCkxMDRcITUoJVhEMDNBLiMjOSg/KEBBOyFZXDxeUitOJkJEMTVAV0cKLU0iIVBCTTBDMCY+LCInUCJEJU1UMl4hW0IiJSQmTyBbKig1NCwvUFczIi9QOygxUSwkLzgvWFAtWidBJEUKLU07IVggICNUNz1SKkYnQTBDKSFIWyMySCdSIC1ZI1EwOU9BN0MhXjBFSjA7QSJVXCIwISomJC1UJ1VRO1QKLU0iTUhCTVBMTCIjQCdTQihdIyE4IicgUVspKlQ1TSBXMiRTWCw9QVRQIEYkNURCO04pRDw2JyA9QSAgJCMKLU1UIS1TIl4gQ11ALlskMjwrIDAuSiElQDVEUTQrITFINzBAPlUoVFBBKyE9KShWJDBbMSMtIEQ8MEJQVlUKLU0oVUwjRiBKJSUxWCNQMTxZIlNQNzUyI0AhNCQhIjItNyEtRC0oMjZZJUJMPCRBQiwkQ0BFWlEwWihASCsKLU1bUjMwJ14gLVUgQ00iW0AgNFEuIyQhKCggMFJXKCdYOChANVIhRUg/UCE1KiBeQDxHMC5aIyI8Q0FRQD8KLU0hRjg8KkEuJCUyWChIQjhIICgkI04hTVsjITwpXDAhJCIkRDchUTswJ1Y4ODYyJCYkTSwgKjI2WyBPMDQKLU0rQSVDJiFMIy8hTF0gN1Q1JzIlLCVJUD86ITdYKU1UL1tRXTUpSzQ1LkIyPik0VDFJUFNTKUcsK1swLkgKLU0iKywmJlIsOyQzOCxBQFk4JUIsMy9QWSYjJDxATFBcICNKPDdRMT5RJyxMKzJRNC8gNTArIDEhNSgjLCoKLU0iISJUJFpUNVJQX1cpSUQsNSFXIiBOKDFUMD1dJTYsITkiIUggQVQjSlBeSSRVJD1ZQixWJSQ4J0lCKFoKLU0oNUApVFE+OSE5OEBfUVs4JFcgNzVAPFgiIFQjNCBBMChYQEBEITooIS8wKk4gRi0hXFQiKFEyMiIhKCoKLU1YMURZJldMNF4hVyIhNlQlJiEgNyBYLDFRUFxFIyQwLylQV0wjUDArXkBDRydFLDAvUFoiJ0s8N15QKCQKLU0jXkwuWTAmOyZLND1EQC0/Ji9UKSBCN00lVDQnNlBGPCEoUD5YUiQuJig4KTVQMlUpOShBRyFPRCVGWDYKLU1fIjo/Iz0sRichSVUhTzwsSEFPOCIuVDxHUTNUKFNcMD0gL00hUiwyV0FNMCZBPCpSMiQxKE1MOiowQTsKLU0nVkQnTkIqOSJeSC8lQSogJ0JcREMhTUwnWCAjMiFRNyI2XCNHMToqKDpcQkJQOlomXyAzUTAySSVPODEKLU1AUicuJUdUQzAwL0YnWCw4PjAtICNcXCxFMUUiIi5cRVJBNjAhMFQ9KCBWIiVIPCJcUFpIJjEgPFxRRCoKLU0hSVQtN1IvVidLQDcgIiZGJDREMiRROD8lSUA5X1AqIyMmMCdCMiYzIDowOU5BTSkiXVA5OCFDKiUnKCQKLU1CUjs5IDJQIyghWCQnV1A6ODFJWiQ/QDk9QE1RJTVQL1sxOyAgOlw+OUAtKSJZQCQiIVhEKSpYRyBQQDUKLU0iJTwyMUAhUScoMC0uIik+JCBUJywxSC0mQiQ2LVAsOyROMEJGUi5KISckIiswVz8kJlQvT0BJRCVQQCcKLU1VQUcjISxAOEYwSFslK0gxSkAoRiJNQDZTIjhSISMwLSZRQyIoPVg9U0BaISczMCRZIT5GKTQwNU1AS1MKLU0oLFAvOyE3LiAmRCtUQjUzIChIJj1BWUwpRUxGNzBYQiBEODlVQDRNJ0NUIiRARlwjM0wjTUBVQCRNPD0KLU0kQjopKT8oJyEhL0siWTAyITBZJCRMPDogUVUmJCdcQjNBXzshRjAoRCA8MiJFKC4zMi4oKCVQPj0iNCoKLU0pTCA7KVFDMyhRUCE3QFY4IVwgIyAhOVMkNSwrNEIhQCBcPCcyQSVDKEJMPVJAWUQmNFAyRCFHLCBCWCkKLU00MixJIjlYNCdBMismPUApNUEhOCkzODctMFEiI1E0LUZAIDMmLDQ7PyFDQSAuLDVSQjhRJCZAIiZBSF4KLU0iTCAlLkEiLSIgIDZGMTwrJEJAKlBQTCMpMTBEWkI1QiFCVCNOQFNPI0ZMRSlBKTcpQ1gzKlBHJiY8NEAKLU1LMSRMIyYoIDcgUUEpK1wjOUIvMCZcMCA2QS9PJCswNFghLFgmWDQmQ1A3UCZYTEJPMUxdJkooKVQgKF4KLU0mIiw1XEAjQSFGUCtBUDRCKUpUJVZQSDYjTjgpTTIoIiM2REVRMFxTID00OFVSIl4lNFw1SUFJQiQxUCEKLU0jUF5OIFYsP0dRSSEgWSgpOiBBNScnLEQ+ITkzKT5UKE4wVjAjUiRGSFE8NiU1XDhSQCM+J18kRTJQOCcKLU0nKywkOUEtUiI+QDs0QTtVKFE0RFEwOCYpUEA9MiFSKyY+TCMvUUJcI0tEIUJAPTUgIjQxUDBORiUvWD4KLU1VIi09JjooKEUxQ0woM1goVFA+QCJYUEBOQDcuJjw8LyUgMD4gN1QiQzBdSig+IEI4MjtIJUVEK1UhSUkKLU0lTyAmKEBBVSIwXDksUVlMIDBENSghM1kgJCxCKyBCOiYwNDNeQElHJDUkODxAXEspOFwvWiFWRCNdTCkKLU07USIuKCJMKiAyNU4kKygwKzE4OCFVXEJWQiQkIVAgIVxBSCciSEQ3JFFBXikxWDwxUC88JSFQNVYyLSkKLU0mSiwqQCFQTCg9IDBUUEInJ1g8MyNALV8lLyA5RlAjQSZIUDs4UDQ1ITAkPEtAMEAmUFA4MUIxXCAhIDgKLU0oIUQ+JlswMCIyKDAlRUw3NzI6ViUrJDAjQFkjJFdQNk8xKCgkRzw2OUFdSikxQCU9MSJKJzBEIUFQK0IKLU0jVkQxXUEiTyc5SCIkMCc4JkFURi9RSjIjKUg8VjFXTiZJOCc/UjRVJkREPyZBPCApPDQqMyFWVyc1UEIKLU0zIUBaI1dUIDwgMlklNywqNFBGPiVUTClUUDMuJCFEL1VATVwgRDg0PiIgMiEjQEQgMDApIEVIPSQwQDEKLU0mVTgtLFAnSSBJKD0zMUA3IypIKkwyNTQhQSggXEBEMyMxRCMiUTI6IyEkOFEwIDghMyBAXjAzISJVNEYKLU1MUi4pI0w8LyAwUiwhMCw0VSFbViQ6XDAhUDhdJyM0NF4yLyQkLFRCUUBdTylNWDk/UEE0JkNcKiFBNFMKLU0iPVgzJiA9LSFPRCwrUTgsKUtYJl1RLl8iWUw4MEBHSCZTLCxdQD4yIVVQNykiLDEiN1BAPVBSOSErSCsKLU0nQSw0Jy8kNEohPCEjIVwuUCBXVidJQCYiQCpIKT0oRkswMikkKFAjPzIsVClDUC0hUClMJjs0I0syJ1YKLU0gPFgtUFFHXiE8REY9MVQvJzMwNk8wW0soVFgkPiFFJylPLDVHUi04I1dUREQwNzgiXCQ7LjBKJSVHTCkKLU0mQUo6IjMgJVogRzspPzw9KiFZOyguXCtWMCtPJ04gPFpBKFQiTEQ0WzBIWSVTJCpZITBBJEZcQlNAX04KLU0iLTRCTyImXiBATDsoIEssJCskQClAWzQoLiA5KDFWUCYkXC1FMjAmKChIQTlQIF0oXTw9JEBfTChHPEYKLU1JQSAhJ19MRkQyNUUjM1wxOjBATCIzKEZEQUBCJiU4QUJQKSckITwoRSIjJikxXEBDIi9bIUNQLFpBVCkKLU0pKzQgWVFbLCk1LCA0USorJC0kNSggW0MkTygmWyBFRiFVNC1eQUA9J0lEICNCIigiQjA3NVExICU7SCEKLU1AUTooIyk4JzUwRk0nWCA2VEFBICRKLDsrITZGJzVEREkxWkQjPEwqTlE5RSBMRCghMEk/JzMgM0IhLEcKLU0oRywwPFI7KiNbWCUvMEwzIUU4ICMiJiYlI0hAUCFBOCRBIEQvMDI6JyQgMlwwLVchIFQyXkIlXyZHMDcKLU03IVFfJzFERidCOiogTDQvRkAsPyE3QCk3MVg7J01YJE4gUiQnVjxBSSFXPSFSTEJfITg5IiJAIE8wRCwKLU0mJ1wgVkFAKSUzUCAgMCMiIko4RS9RJTkjQSwtMVIzJCRPWEFDUjtYITxYKCYwVzciMFAjMjEuOCNeRDcKLU0/QUhBI1RAPEkyLUspTThCNyFZISkuUD9UMEI/JU8gLkRSMikpTVBDWFFGKCguREI/MUhAJV0wL01CMj4KLU0kUVQ2PiAgLSVDTChOMSNOJT9YODlAJlIhLDQ9KTBFWiVASDI5QEtcISBEMSEgUDEhQywnUjFHLyRULD0KLU1UUDEqJFg0ICVQRD0lRzw8K1BHJyVEPCEpMDJKIVZMIUpRN18hI0QuNyAoTClCNDRCIVcgJzA8QllRNVUKLU0gSFA3PzI2WyNGTDlfIDtAJCxIKVcgK1YmRCxFUDBSJSkmVEZIQVg5KEhELChBIDQjMTArRFFRIiAjXC4KLU01USFGIUlMNDpSPCEmMDRCKyAsXiYsUDRaME8wJFpAPUAhV0UhTkAqRCFCXyQ/PCBcUiIsI0EoQ0giLiQKLU0kJCwmNEI1VyhVQDQhIT8kKFlUN1hBJ00gPFgiWjFRViY4IDtYUUMrIVIkI0kgMEsgMjQhTlFINyAkJC4KLU1RISNfIE5cRUBSKCclOCBCUyFZJCg1VDBGQVsxKSY0PDRAQSAjJjQwSlE9QiRMMCQqQSpYJyNcJVQgKjUKLU0pNCgwNDItUiBJICkoQTJQIVRcMF5SIyIoJ0QrMSEzWiUmMD1HQEtNKDgoPzwxOEojWERFVzBEXiBCJCMKLU05MUpIKEAoLl1AQVQkXiQpSiBJJCBeUCpDMDlGJlxEP0kxKiwgWiRCMVIwWCFBQEI1MThAKCQoRUMxNU4KLU0kQDRGQVIsTSRfQCchUSNZKDw0Ii5CO08mNjAjMCImMCBUOEMxUVpQJVEsIT8wSysnXURAU0AvQyVKRDgKLU1SQDJeJFhcNFEhTDAgOiAyVjE8WCExJD0/MDc7IFQ8J0IhO1YlRyQsUiBILCUoICVNIF0hJCwgOkhARTQKLU0nSyxEKiAyQSIoNC0oUV1SKCtQRkhQJlclPCA/MFE7PCEsVEVAQVpHJVUkQzgxNjUgXEgkSSAlVCRUICkKLU0qIjZeKF44JD9SK08lJkgkUyBHJig6JEZQQiApKEEwPVhQXy4pPUxGTCA3XygjSC9LUT0rKUNIOU0yISgKLU0kKDg+WkBCKikhLDhFUSNeIk5ILFFQV0AnNUw4M1BBPCQtSChSQD5XIEcsMTtBOFojNTQuKFEkWSg2KCoKLU1eQURTJ1ZIOzExOzcmQFhBSyE+SSJaRCIiIFwuJSZMQ1VRVzAiOlwqWUI1WihAREYyIUBcIFIwQC0gKCEKLU0gSEhBJiBQPyhIJCtYMDIqIS8sPlMhXlIlQCA8MjBdMSk9XCkqMCtUKT9QRSEwTCQmVVArSlA3SyYuLDwKLU1FQVUnJ15YJVUgNz4iI0xGPDI2Ric9SEZDUiZNJlRcKStBK14pKVAmUzI4NyNQMDI5Ijs1IFpYIzgwSz0KLU0lNDwgI1AoMCNDIDZdQCU/ICAgJTwxXTwkRSA/NEFWICVKOCwwMD07IC8kJTghJ0ojIjg/SzAsTSI2VDwKLU1TQSVLJzxcQlxBJUYiOSwiTCE7SygjKC0oMiogJDU0NUNQT1UgNlAvSyIiNSQoPEBKITk8JVo8J0hRVF4KLU0oMUApJiI2MSE3LEAkUEgiI1JEIykhOFQhQlA1XUAjXSIkMDxQMUInKEhYRSRAUCQmQ0gjNlEsWSA9OCYKLU0oIF0qIzxYNlkwISQiLTBGO0A7MSZENEVSUFFdIDckRDRRTC8mTignU1EjPyFcSDlTIV8tIjhAKSoxVDMKLU0gPCQgUkBfICA+SDRWQikgJyYkM0UiJ0AlUFA1STEsOyVdIDEnUUJTJU5YJV0hVzYjNEA4V0FBJSA6UCcKLU00IS9TJiJIKT0xNyghVURCOSI1RCdDOC8qMjVbIkQwPjQhLyInTzA1TDEwRCQgKENYQCQtJ19ULV8yIEkKLU0mJSArMlFYICM3OD9SQVYwKUcsQCMgPyIlXlgtQyIvTigsMCUpIiMjKSYkLkQhS0kpRTQxJSA+Tyg3JDcKLU1UUV5KJCAwNEgwXDUpKVxDQjI3SCcjQCdKMEgpI0YsOTEgQVkiMkQ2NUInVCUwRDtEIFErIVtIRFkxKjoKLU0lMFg5QzFIJyg0SEIxUiBVIF9YICEhVDshRTwxMkE0VyJIUC1FQCM4KEBEQ05CLyApNDwpKyAjKSUrPDcKLU0hQTZPIz5QJyRQIjQkWUg2RVBVNyJFWDEoUTxKJyREIy1AJFAlKiAzIkImSyNRXDlLMDwyJ1tEN1cwM0QKLU0oSzBEXDBVPiZcLDJEIThcI0RMKC9QJjYmUDQ5X0I6TiUjPCQ2UU5BJTRARFcgKV0iXTwyIEBCRSg4QDkKLU1UIiA9JlU8NkcyNDsgJzwxJlIoLyI7XERWMTFdJiRMOU4wNl4nS0AgJDFfJSFFPDBaUi5AJzskKlkhKjEKLU0hJUQsWiI3PyIuVEQyMjpGJlEoLiMgV0EoKDwuPUIlKCBbQDkpMDwiKSgwKTExXUopOTwyM1AtNCdBWCsKLU0jQCsoJlI0MzhBViwgVFQhMTImNiVRTD5JQCImI19QQEAgSEIjMiQtR0BBRCNSKCRDUVhJIls0MkdBXDQKLU0iWlguPkFBNiZfOChXQVM3Jl8wIFcgJy0kMjQ6OjBUXyc/NC1TMSEzJDYwJ09QIUAkT1QzOjA+QyFMKDYKLU1LIEoiID4gNUQyIVMpK1w0RFExSCU9NCE4QV9LIVhMRC1BMzomNDQsL0BDVic1NDdTIVpQJE0kRVdCOzIKLU0hTDggTVBQLihIPCU4QDpAJkVUNDExSE0hOSQ5JzBOTSYpLDFTMEYpKCtcLElBKUgpK1QrPUBETyU2QDwKLU0jUEdQJ1JcPE9BISchSlguRVBaJihCJD4xQE5JISEgPjVASyMmRlg4TlIuJyVZXDVTITVdJiokJkRCNCIKLU0gPFQvRUElKihBWCogQF1GKUEwOyZQIjYmLTw+IEBUUyEzID9QIT00Jk5QMl8gQFsjMCguPiAyVSAnLDYKLU0kIiEgIy5QIT1CLFMoQzgzTUEwQiReMDYwQUo6Jl8wRS8wUEkjTiQvSCEtRCcuLDpIIDQiKTg4RF9SOUYKLU0pTSQtW1InXyI0QDpbMTFCJydULENQVSYoNjQpT0A4UyNNUCsqQixbJVUgPkZROl0nM0w7VDAoQChUIEAKLU1TUVU2JD1MKCtAVzIhQkQ7VkE6XiFcUCVSUDpEJTk8Ii5ALDciQSgsIiEsRyRKLDxGIDgpKS5YPTxRI0sKLU0jUUBGMkFLOCg1IC9HIU81JUYwRThQLDYnMlhFUDAjOycoTChFUEQnKD1UNEQhXyIlN0Q4TEFPISBDTCsKLU06IiExJyEoRi8wXSAkXSgqTkA4JChVWCFCUFYwIy8kKFghN0AhWzA0X0EzIyczXC8rUis3ITYsMyBSOlcKLU0gKVwmW1BHJiUpWD9fMDs3IEhEMlZROCQlUig/RTFcSiNSMCNOMCE7JSkkIjJCIlEhMywsIDE1ISJGICIKLU1dIFpGJFxELTohN0EiVlQwWSBQRSFDIDBFIjlXJkgwNUohSVwgVkwrR0A1XyRaKClNMFlcIigsNlVBPjkKLU0mJixFJFElOSg4SCReUUBNKD4oICohKUAlQEhGMFAhOCM2JDc+QiU9JSE8PygyMTcmSSwqNzEyPSEsMCoKLU0pQDdHIEZENzciI1YgOlApQVIuLiRMVCIlQDI+KF4oQDpSNSomQSwkJVFKNCFJICo+QFJdJ1RAOjxBVkIKLU0iWiQxL0IzVCA7KD03UClHKFZQNC5BW0siRkgvOiEsXCdKXChLUiVcJSsoJiQiIyUkKlw8W0FDOyc9WEAKLU1TQV9AIiE0IiZRLkknOzAlRyEyOyA+KDBfUi5VJ1NcOTZAPSAjTFAzOyEwMyQwPDpFUDNCKCo0LSdQWSEKLU0mRig7QzIpNSM+SC5UMSBSICNQNztBXEsoN1wiNCEnSCQgSC0zIVchJk4kKkIwUTAoMkA4TjBPQyZTSEQKLU0kID09IyNIMl5RQEwjUlQkJSAsVigzKDkiID4hJkUkQilQJk8mMDQ8SyFPISEtODopUi4sJDcsNCIhJEcKLU0kOyA1J0AwSCguMCJcQFBfIDY8Ij5BMDonMFwnI1AxUiVTNCAtIDgyKCE4QS8wT0EjW0wwP0AxLiI7NCwKLU1OQFxAJzgoOk8gUU8jRFA3P1BBRiEpTC9dQE5eJUEgJCtBWj8pKyghSDElXCVRSCw0MV83KEMoMVVBUloKLU0iLUgqKFI3KylHRCogMFwjI0w8MTAwMSMmTFA8MVAsKChHODlRUDwkJFYwOVhAOk4kTiAmUjEtWSk/UCEKLU1dIilYJFA4MVMwVD0iRDwnOkInMyVaPDdLUDUwI1JAN1wxQSsiLEAtOFBbSylGSCIkMidWJFxcMjoyNzIKLU0mXSAlPiA1SSJdRERSIVw3IC5AO1xANCgkXDAyM0FGNik6KDNAMFJMIyg0KjshKkAnQzAzWlA2TShRMCEKLU0mMCIwJT1UL1hBOVIiKlArJUI5OiBYWC4/ITZdKDBcQDQwSlYjVkghLCFEJiEgMENcUEE8I0ZMKTlAPToKLU0gOkgrOkA+QSM2TDlMICNVJi0wNlxQRVYpPCg4TzAuVyApOCg4MVRVJVRYJUBASysgMyxEWyE6SiVGJCUKLU0uUFJaIiBcRlxBQEAhTUgyRTBTQSBcOEE3UipeICc0ODEwQ0IkLURCKFBVPCBLLDc2MSY5Ij5AK00wXEkKLU0jPyAlWUE5QCZHVENJQVk3IUNEQy4xWlghW0AuSEFaViUpRDRCMFNFKDY8KldQRTsnPVQhLlFETycwNCkKLU1CIC5PIz5cJ0FRKEkoTFxDLUFQJCFcSDgjMSBPKEM0KV1QWSApPUQ2LVFDUykoWC8pQFhQI1kgPDEwR1MKLU0pPjAjWDBDRiVKPCgtIDs0Jy1ERVExWU8nXTg4S1BCUSlIWEVWQC1UIkc0LlcgTTciJ1w1MyFSXihQJD0KLU0lMCgjKTIsKzxRT0MoVkghJSBZKSRWLCc8UD9cIEVMNCEhUCcmVzw+KCElQSlIRDRDQTs5KFUkLj4xQSoKLU0jX1AkWVA/Nyk8WC4qITBcIz0oQjBRXy4kXVxCLTFKQSMgSC5OMVEsJFEsMiJRISchSixDRlIvPiE0MCsKLU02QU0vJTA4LUEyJlQmVzBEOzBYIychMDEnUjtOJ0c4IDowTisnNygrQUBeNChbODpCMTM8Iz4sJDcxMUIKLU0mLFQ7N0BbKSkwQEY7USpbJzJARVRBTT4jXUgwI0BfRSEqODBQIEVeKDA4LCEgNVMmPChDUlFUVydYJDIKLU1EUSwqIEg8OC4gUyYkSUQlUzIqPCRPVCk2UDZIKCg8IyIiOksoJTREISBUViJNWCwsUTEqI0goM0EwOCIKLU0iQyxDUUIxPyhJRClMUSFWIl84MyQhWkYoRDA/RyBZTyc3NENCMCo7J0dYNjdQQzUkXig1N1IuIyM0WCEKLU1JQF46Jk84NDsgMyAhWlQhPVBLJSBeMDAuUDU7JF0wPV0gLkwiLzxCJyItQyhGQDhVQEpRJ18sNFghJSIKLU0mVywuK1FPOSFPVCA4IVA4IS1YIz5SKEQiMiAzMiBCRSE4OD48ME9BKCI8OUAhTkYgMkw8PzA6MyghID8KLU1IMDomJj8sPFFBMDopOVRGXSBOQSk9MCVJMEQ+JzQoJDQhRzUmR0goVUAoJSQ7KDEuUV1UIlRMNkVAV14KLU0nRzQqNkFPKCkmUDdPMDAsIC1EI1UhOVkoV0gkXlFJTiJaVDgzUEhTIi8kRyJQICAmVVwuVEBWUykrRDwKLU0gQV4hJzUkNS0xXkwgI0QyVCFCRCBRTDQtIjknIEAoQEwxRy0iJFRBKEErVyVDXDtTIEpGJjwwNTIwL1oKLU0nISxBVVFDTyUzSDU4ICFPISZUPS5QKFwiRSg8U0BZOCY7KCYwMS5OIVhcP0shXlAgLUw0JDI6OyErQDEKLU0pUC1IJFg0RU5BQCwkI0AgXVFNTiFLQC06UFk1IFdQLSAgXSIpQThFU1BQWiEkQCopQV4tJUBQRChRKlYKLU0mWjwyViAjWCZVICAjMSJPIDgkKkBATFsnUyw5WzIwQCY7LEZIISBTJTAgMVhBX0opIlQ8OEI4KyU5OCwKLU1KUDNXJihAIEFAQ1YhKSQ3T1ApVSI+VCIuUDBSI14sODJRP10jXUw+O1FBXSQxKCFeIEBaJCZQICMgJiwKLU0oJkA6UFEyUyFbUChHMT8zJzY4QUowM1snKEAwVEBQJychNDxSUTs2IVVQJDMyIEUgJEQxNiAoMyVBJDMKLU0vUi1HJjgkOFQgMk8kTzwkTyIyNSFZLDIlQiIiIS4wRCZAQ1gmKDQtTSFMWSg8XDRWQiksJyVcIjZSM1gKLU0nKCA1TlI7TiNWJDs4MCgxKDZUKlAhPUQoVSAnNCAoPSgmPDAsIEVSI0EsISMyKjopKSgpMiA9OiAuJD0KLU0mIEUtIVhMIUpAQCsjMEQ/KzFBLSg9RDVYUEBFIEhMOlEwPCYlUThCN1BcUCFXVDNUUVIjIiI8MTQxN00KLU0gOzRCTzBUTiU6ID9dIEVNI01UMktBM0snPSgjMDAsXCQtWDdNMD43JlJELSBSN1chIVw/LTIqUidLUCwKLU03UD41JUUsREJCJyYmOURBUFBINSMqRDoiMF1AJUJUIyIiLCEiQjAlPyIkICM4SEBNQUQnKTQwLiYiJkYKLU0lWDQiLzAuVSguIDtaUiZNIkgsOScyJ1MnPSgjISAhOSJOKDwgMUpHKTBYPj9QODIhOTRANUBZSCUuQDIKLU0sQio0KFM0Q1JRN1giM0xDKCFUWChYTDUtMV4vIS0sJEYyI1kpLixCQjA3ViBYLDI0QVwrKTdYIFRBXV0KLU0lLyxBTiInNCNMXDtXUTlQI1YsNDFBKzMoJiwlWlFbLiMiSDsqIEciJUdYIF0wMTAlWVwoIiBUUydTPDsKLU00MVhIIU0oMTYhWVgjJ0gpVCEjKCMgIEFVQD4pJ0AgL1whLicnJTQ6LEAhISddIDVPUFBbIzpQPzggUioKLU0oQSRGITAjViMwPD9SUEgkIjAsNCJBWCUlX1wqQEEtQyhUMC8/UiMhJjM4K1MgXCQhVjQrMjE2RSgzQCEKLU09QVgpIiEwMDlRR0glVywwMDFUIyUvOC5fMVRZJCVAL1ZRSC0iWjg5SyFcJiZOUCwkQi5XI10wI1ciLEQKLU0nNTApP0BPTiYsVC9LQS01JiFMKjYiOy0hIFgrWUIrWyNKSDAmUFFHI1YoKj5AW1cpMkQkTzAmKiBQXDMKLU1ZQV1LJFY4LC5RPiIoXFg7PVFPQyU4WDM9MTBbKDpYKlEyME4jQywrNFEvRSkhOEMjUEUmJCkwQjtAID8KLU0mTCwpRTFXNiBBIDdHMFchJERYNSlRSEEkLzgyJTA+KCIoOCNSIFQwJz44N1IhMispM0woMkIiOiQkVCIKLU1XUi8nJDs0PTExSTkiREw4T0FbQydOUCojICc+J1dcKj1RKkkhKSA1JTE2KiFHXCokUUc3IVpQQUQxNVoKLU0lWTA9KVIpTyErQDNTMTFSIEYkQyFBJyghKDQoLFAgTCBeRERMMiBeICwwJVswIVEjPjQ3IUFIPCVYMCoKLU00IFdNIEogNlJCKiwjKlQvMiEiMiA+IC85IFlUKSNIMTAgR14kTlgyVyE3PyhYVDkkUDY/JSJQNDhQT1AKLU0iQ0w1QUFVOSIyLCtCIVVTIkpAOlggQTwgOTgrViEzIiJCIDpaMSYqIktQQklQXjwjKCg5PVBGPCdPPEAKLU1BIEMiJyxURS9BVyonPUQzOTBeJCUvRC8wIEAlKEJAQU1AIVwhOTwmOlEzWCdDKCZXMEhVJy84IFgyLyYKLU0nQlggUTBJOCkzTDtFQEQuKFBQIUwwJyonTExCQCBJRiMvKD9GUUk8JUQ8NCEhVDcnVEBEJTFISCdMQCAKLU0nIic3IEBUKzZBVUEiOEg8MzFYWihNWCAhIDtQJCckIDpSKyslTDRAOFBbMCZeMEFcQTlBIVtQQEMxQycKLU0kR0QzJlFHNSFVMDtUIExJJDUkMTcxMjsnICwgLCIxSSdKMDtUUExDJyBEQjZSODApOjwpTDBIISQyWEIKLU1aQT1VI0EsRTBRK1MmLlA4WiE1RihWOChUQV49JCkoLiZBQ0MhJiBDNjAmUCg4MEY9ICZbJD84MzswLS0KLU0lVDgzUTFcLCkyQENOMiMiJyJQID9AOighKUBEQTEoTiQ/SCMrQVA3IV1AMTpROVEnNjgiQUE9TylOTEEKLU05QjhfJ0ZIISUxRyYnOyAjQTBUOCdYSCw1MFktJjQ4I0IwWSkkJFQyUSFIOylIJDEgMDFDKCY0IkcxSz8KLU0gRSghODA2NCMzTDYoUV41ISk8MERQJikmJVghUDE8SyNULCVEIFJEICxUK1NRQDsgK1A+KlIuJyE0XCcKLU04QDtfKCwoIU8gIkIiPFQuSzBUOiJMNCBZUUgoJlEkOSZCLSEgWkQkRVFaJyUhKDUpIi06KE1ERklQLlUKLU0iR0gjQzI2NiUpXCchMVFKJCwsLk0gV1cpJCg5MTBORCMqVDJcQUpfI0ZINEsxNUcoKkghIiIsNyJLKCUKLU1XUUo+IUE0KkdSMEUlJyxEQVAvVSg7PD1CQVI+IkA0NFdQVTgjUjAqTzE1KClDIC1XIERJJ1lcNU0xPUoKLU0gXkQgUjE+LCRSPDRGMSwrIzNMRj9BPSAoIlwiJSEsPCQ7UEYuUDUtIlc8PT0hUTYgMjwrUyEgUSk9VCwKLU1SISUnJjggPkQiLjQoK1w5WDBRNCUzMD9GUD0rJkFIOz5BViIgVywwTFArWyNfVCJNIVdBJDpMKiZSI1sKLU0iISQ0SjIySSYjODxDITQsJCEkLkhAQkYkMlQxLEFBIiQvSCBRUC9dKUpMNF9RPUYoVCw7TDBUKiUpOCYKLU0gMjY2IVYgJVVCNCUnVTAtO0EoJiUwOEcgIiA4JDVYLVkgVVIhNEgsQkE6XyVKQDpDQFRGIllAJk9BTUkKLU0lPzA2LTFZOSFVOD0zIUtaI1NUOSNBNUciTCAiUVAvTChAMDBcQjleKENAJCFQUS4gTjwjUVAqTCdSWDUKLU0rQT8pJ0dEI14wUVYhSjA3J1E1SyY8PD5cQEciIytYMyMwQEghNVgvTUFfNyFKJClGIU01J1NUPCYxKFYKLU0mWVA5L1BWLig9MCw/UVQrJTRUJC0gJkMiQ0wlP0FGJSlLPDc7Ijo1JFcoPV4gNDggUzgyUlFUUik3PCUKLU1EQi5FKU4sJV0xOyolREg3N0BWXiUyXDg7IDBIIk4sIjcwL10kNyAmSjErRik4WCEvUEQzKCxQLVZQIFUKLU0lWkRGPFEgTikzXD89MEJPJU88QF9CIEwkWlA/UjItUSI5IEEsQUMmJixERCNRKD8pT1gkUDE7QiFWMEMKLU1QUiw1ITMsNUVCI00nKzRDQyIqVSNNQEM+QTwyKEA8QSxRNDYiMVQpUFA1LiUxMDFRQTtOKDIwNU8iMS4KLU0pRCA6QEA8TCZCWCZDUjciICg8PF9BN1omKTw+RSFOSCMxJCBOMFlXJVwoKU9SKkwlJCAuW0FVTCg3MCoKLU0/MDk4JThMRitQJFQpKjxCJzBQJScnMDxBQCBDKTZUMy9RVEYkTlQtIFE4XSRGSEEyQEIwIFwwPzgwQUEKLU0gTVA2SCItSiBVQCoqMCkhKDRcNUVBPS8oLDwrXSEjWCBVNCxbUUwmKCsoNkdRSUMpIkgnSyBcNicpWCoKLU1QUDhIIUhMID1QJiIiQEw/XzBUSiBLVCxUMCsmKEs0N15SO0koTUg/W0IiVyVfSEY9UStWJUkkQTlRW1oKLU0nLkQtQDBRJyE+MDY+MFlOJVZENDshNUgiPSw6OlIiLyhYIDM8UVxTJUggK1dROiYlTlAnQyBVSyglKCYKLU1AUiFRKTxYNjsxMSkpJkhGVkBGISBaIC1fQiNVJSMkPTgyOiQpQFQjMiAgOicsMCovIVMtISVIPUwxTigKLU0lKkRBSiBMICk+PC4iUEAsJF1YKjwwVyohNFwnMTEhXCNHMCNAUDUoJTpcI18hOV8oMiwjWCIgWiksLCwKLU07IUdKIFVAODtBQFIjVFRENCItKyIyUENVQVsgIzJYQkMwXSQjKEhAI0BcXSEjTClCQUdCJzcoJVtQPzIKLU0lL1wkTlEnVSEgLEJUME46JSwwJ11QW1QpM0hBWCA0KiYmLEBTQVdWIERAQTpCOFYkRSQpJEBcUyU8KCkKLU1CMFhEIlssPScxVSUnNjBDWjA8UCg3KDtLUipQIUlQREtAQSgmKjgkSEBbOCQ7ICpHMFojJCVQIzQgXEUKLU0gXFRBXCAiSyNBSCclQSIiJ15AMSVAKiAhRzBDTzA+XydGIDY3IV41Jz1IMj8hJSAmJ0g0MiFFOSQjPDYKLU02MDtSIkkwOElCJ1ooTCAnOCFfSyNWWDJFISMkIV00MUFRTDwiXSxBWiEiWCdeRDxaIiZHIFUgMjNBJDIKLU0hMUwmXCFSSCYkIDZZIUREIEs8KUMgST8iMTgwLCE5TSNVIDZcMS1TJ0VANT9RUEMiLkw+OyA/VShaTCsKLU05Iig0JEkoQD0gRTsmRSwhWTFeKSdLNCRJUC81IVxYME0wRCIlODQrKzAqRCRaXDFIUUtUIiI0PFtQTiQKLU0kTEg8MlFeSyVeUC88UFZdISAsJU5RXkYkIUQuSkI0RiJYUCtUUC5QKEtEQFEgQz0oRFRCWzAnVyFDMD0KLU0nIjgjJlg0Qz9CKl8gJUgsMiE3ISE4PC9HIipCJEIgLVMwWFIkRFhDIDEzPigkLEFHIi1ZKSlAPl1RP0UKLU0nNTRCUVBSWCZWICwmUFZUIyxERVsyMj0hNVhCXCBYVygzRC9SQCAsIEEoRC4xKyEgT0QzLDFHLiZFLDUKLU1ZMTglIExcOzIgMUohIzhCNyEkWyciMEFXITFJIUNQQjghXjMlPzAjQ0FdNihDJDUpQFE7KUQ0KU8gQF0KLU0pLiBGIjBZKyJYQCNEMSMpI1BcOlpRSzMlMSBGJzIyMSQtQDUpUFctJVZIIiAwUjgjOVghNkEgViJMIDcKLU0hUFJPIi4sNCQxNFAmTDhGT0BDQScwSDlfUEM9KT9ALzJSOFkoOVAuVVE+USNeOChHIEFBJEckOjVSJTUKLU0kOUAxSCIlQyggPEEuQFFQIlBUQUBBPSspOVQsXVA2IyBRIENSIF01IiQ0QCYhXzwlJlgjXzIkNClPTCAKLU1RUT9UJDxQLS8hJT8hPVxDXFBeXCRBRDFOMjlWJlwgI1FCOFoiNig4QiIjKSM7SC42US8qICJUNTshX1kKLU0mLkA4IVBaXSdaNEBKUVE5IicwLVcgMl8kQ0wiK1AnXyVETDZGUVYgJjtUQllQQiMhJCAoXjA/USEmVCIKLU0vQisgIywkKj4wVUAiIkg/KSEmOSE0VDtRIiU/KTFQLV8gMTwlMUAgWyFVOCQoNEJVQDJOIEIgOylQOTUKLU0jLUhAVUE/VyE3QCAzQi4mITBERj4xIj4jPjQiTiAnQyUxQCk3UEovIDlEJVtAMDMoM0QnNTE+TCM5TEQKLU0gUC4yJDQgKEIxREgnLjQnWFEsOShbPDpMQE9XKCowLlsxTVshWzBAPiA3NiRKOEUwMiolJUBUKFIiLjEKLU0iMCxBRTImLCEqOD5eQiBdKEc4OlEwISUmVCA8OyIqOiEsNEYmMS88JDY0JlRASCQlK0gmKyI1QSE5RDkKLU0qIjImITIgIEhQSE8mWzBDPlEoMCggTEJVUVklIzcgOklRQEYhXlw9PyE2SyRBUDNOQTleJ08sMitQL1IKLU0pUCwjISFUJicuNEI7MEU+KCNMKU4gSEsgJzglI0AjQykqIEZXUFw8ISMsNE9RW0ckNlRAKCAkMiJVPEQKLU0tQFQ/IktILjVQRycnOjw6L0EkJShSLDMiMENdIV1EPjRRJkEkVEQvRiAzISNBWDtTQThFJTAoJFwwNUMKLU0mW1g+XTA0RyFOQCxIQihVIjFcLCowOlomTyAiLFFURSQtRENDQDE9KFlYRVBBSF8hNUQxVzBXLiMhKC0KLU1KQVo6IldcQSRCMyMmNjREKFBITCBXUCFUQShSJjlELzswJVkiQkghJyAhQyJHLERZMEIvJTkgNStQUF4KLU0mXUxBUzEsIiAxUDc4QjFBIz40JSFAOSIhJVAqKSEyISZIXEFVUDgtJyMoPzsxM1goOlAgNTIhUSddIDkKLU1fMSxRIFFQNikgJzcoSTQ9ViE0VCMwVDIsQVhAJUpELTMwWVMgLFw6STBQMSNXPDcnMDRKJyJYIU1BVyEKLU0hQEwxKVAiVyRWNDQtIitFJEkgIVdSOCUgWzg+QEE4USM/VDAwQF8xIz8wLysgMlsnPEw3VFEkWic5MD4KLU1PICNFIzdQJkNRRVQgUFhDOiEvSSNdQDRPICZIIFRcQF9QMl4kPSwiXlFPXigzSCc+ISpcIk08LyFQIEMKLU0lNVwoJTBXJSMvRDI5MiFQIlw8LiwwMCMpMCwvXDAgLykrLD0xUTJNITZEIlBRJl8kOzQgI1BDSiVcIDkKLU0uIVpDKERAKC4hO1IjRSgvIUFAQic1VEMtMDQiJSNELkRBLywiQCgkWkAkKiRCIEQ6IEJJISM4QDpQUSsKLU0lNDAoVEE/PiU+LDJdISJMKCtIJTQhWTYjT0grJDBONiA/KCclQTMsKDU8L0AhKk4lWTg0WSE0IigtPDsKLU03IF0+JU9YOTsxJVwiPTgjS0AmIydMQCEtQEIyIFE0RS0gXjomNigyMSBCMiZXNCVPUVguKF9YMz8wLEcKLU0pTjgrQlA2ICk+JERGMF8rIEsoQF4wUzgoLzQlOCEtWCEwTEI6IiYpKUQgQUVRXFEiVCxBOVI2ICg6MD8KLU1UMV49JS8wPUcxSkkgV1BDUjFSWSUqLDssQSo/JENEQU8yJF8oKVxFQlBTLChXRDBZMFBYJyQgQy1COUQKLU0mWkwoRiBVLiRXIC4vQSogJF5QJFtRW08hNUAgNFFTRSdVLCI8QDI9KDZIRiJCMyElSDhGLyFLKiZQVDkKLU1YMjhXJU5QOV5QXi8oODgpWCIuXSArSD8qICRHJCNYMCNAWychKCwnT1EgISJGPC40MS5ZKCc4KS4xOjIKLU0oUjQlTEBGJSNVSCVMUFJaKE0sNjwyLFMhI0BCM0BNMCRQVC1QQVMoJ1dMREpRLCcjNURDR0FAJSU8SCsKLU0rUCUlJDZUPjVAWEMmTEg6UDAvWSlQND0mQDlDJUZUN0dBXzkhSkQ8SjA0XyQ5UCs/IEIhKCYsLjUgXjQKLU0nI1hGIzIwXCE9MEM5ITsnIVdMMFhQU18lIjA9VEE4QyAlVCYzUU9KIDggJT5RVDogSEAhQzBUVCgjQCUKLU1UIiJbIis0Q1xQJ0EoXCRALDArISkzVD00ME8nKFZYID8xJ1soLkQ0IlIqTyJRPDArIT9QJUNAJiRQSiwKLU0lX0BFWiIgXiREOCNVMCQoKStEPDVQVzInWzApJSAkOCZWUDAjUTJSKSYsLDRQXkwoMVAqOyBOLyBBXD8KLU04MDVNI0BANl4wXiIhUzQkMFAwKCU4JEREIU40IElMOThCPCIlWFA3SlBGWSYuQDo8UiYnJCdEL0JBRikKLU0iPFBEIyI5RiJXNClGUiNLIUpIQyhRN14kTkQ0N1FDWCYsODZCQS4mKSE8ODciLSQlSFg3WEBRWCU/NCoKLU09QEMqI1JEKiFSLkQpNjQmQyBEKCE1QDstIFJCJCYsRiMhLycpJiRAOlApQyRDJDkhIDRfJ0xcQj1CICUKLU0lRyg+PyE1NyFfJCwnQT5PIi5AOVswMDsiOkgyTSBDTydQJEY1QFZLJyhUJjkxUDkmT1A1MlBSWSJXPC4KLU1GMFImKDVERkAwTUsgSUwkUEBRJiknQDcyIixDJzY8KCAxVUIoIVw2WUAzJikxQChBIFw6KDAgOiBCM0cKLU0gUyxFQzE3JikmNCciQFBbIl04Qi5QX0gjXlA9S0InOyNWJCY/IS5OICtMNVYgLSgoL1xGW1EoOykhND0KLU1LQjlYIkVUK1owWkYlRCwhXTBYNCI5QEFTQjNTI0o4KksxUFYlT0w0TkEwVyhBPClAQShaKExYPi0gRlMKLU0hJkBAWCIhNCRTQDQ7QCs8IDBAMiNBKigkP1wmWTFQUiYpVDRJITs3KSRYRjhRT1AlJVA/KlFWXyA1SEQKLU1VUjJOJktYMVwgXjMoUyg3VjFNSSIwNCZBIig8J08gMyxQIl0kJjAqKCFFPSYvVD0rQiNXID8wPCohL0IKLU0nSEQtNEAwPyMtVEAjUU04I1RAIjxQJzElUSQ5MkBIRCI+WCMiQCRMJU88IUghJUAgLSQ4JEFdXyNKTDwKLU0mITovIzssKVYiOU4nTzwhNVFUSydVQC8iID07JSM4NiwiKyMnQjwyIlE1WyZJSDoxIU8zJikoJlMiJUoKLU0lJTwmUjArVShBUCYpQDsxIS4wIDpRLyMgTzw5M1BHKyk4PDg+UUlLKTBUJyZAOjQoKkA4RyEnKSdIWCoKLU0pMDxeIVs8MENBUjIoIiA6LDIgJyRHPD4oUExHJkAwJlJQVS4mODwgKlAzOiAyQD4yMD85JSpMIy0wIDIKLU0hNDA6LCExSiA7NCxFMD5KJDsgJzBAJDwmXCgiLCBEPCA6IDlIQURDIkdMM09QNy0jO0hFRlAyXyYjVCUKLU1RMUY7JERcLE5AWkMpRUhGKEA/IiclTCAnIEZdKUhYQzcgOlgoPDQnIiEzLyc1PCJEQEhdJlVIP10yKkIKLU0hJCA1Q1AjMSFMUD48ME8mISk8NDRQXlcmOUgoV0ExLyBVSCQzUDI3KUJEIzAwTUUmVVwqNFBLLygiKC8KLU1aMUEqJVtIJE1RTEUjWyQ5WyE4NydaIEM3UEdIKF4oQkJQNTMlJjAsWlBGKCVXREVFIT5CISVMMjEgWy8KLU0gXSRGTTFTIyhNXDg8ICBeIEJcNFQxQUUlQ1A1Q1BFTiUsUEEzQUBOKS9ILydRRD4lPChBMUBQJCQ7MEEKLU05IDIpI1RQRSlQJUQhPSwnNTEwXyVbNDMnQjJdI0dMOSBSKjclXFQ5JUI3SCg/PC1JQE05IVwwLiNQLlEKLU0gR0wyNFBRTyJdIEVPQC0jJlBUK1BQXSQhXiQ0R1IgQCQgIEYiQC4lITJAKD1AM08pQlQmNUE3SiVSMDMKLU0rUVdPJT5IIiMhSCIlNCQgTFArTSQmTC9JMThDKSdEICgyIVkgMDgpLVI2Nyg1UD5VMic3Jlg8QjRBJyYKLU0jRVgtPVA2ICcpKEA3MFFfIVJMNjoxViQnJ1hBX1FfIChWJEBUUSA7JkJQOjdQNyspLkQhVjEiNChMTDgKLU1VUTZaIVs4K1pCI14oTTQgXlFHNidNVCRWUjZDIyZUQUlRMiAlITBEQUEwNiAkUDlaMV02JEdIJz9BRy8KLU0nUTA+IDFeLSElUCEjUTcnI1I4IV0gRkgmVUQ2WkFRMSFQNEYsUT8jJlFIODkhPjklRVQxXCI5MCA1SD0KLU02QiYnJC40MSEwQ18nOCQoIjFbISBNTC4sQS0nJj0wI1gwJTUjXjxDWDI6PCREWCdBICdHIiRILVdRXz0KLU0kKjQ2SyIsTyNZXDtEQE1RI040OD5CMEAjSTA+KiBNVCROWEMsMTYpIDgoNlpBSFUhKiwrXzE8WyBfJCYKLU1CMTA5IF4gKEAgI1ghPyAnOFAkXSQkTCJdMiQ2IEhQO0pSIjImNVQwVFIiMyE8VEA0QjQuJTFIPyBQIkUKLU0mXERFS0BNTyYhNDcwUjY0KF4sMSUxSlchPig5NiIgRSRQJDo3MTRLIF9QOzciLCwjKlg8WyAuRyJRSCcKLU0wIjM5IiEsOFNCMTAgPlBEPiFdRCcyIDM6QFRKJkVARDJQNFsiXFxFLCFMOiA+TD0nIiJHKSg0Ol0iLkUKLU0kKEgwRTEsNignPCgkMi9FKE9AIStRPSYnJkg3UiBEKSQ6XD4+UEFdIytMQEQhWjIiRlQhO1AwQCQqWDYKLU0nIjc7JFIkLycxXEggIkQkNVBLPSZbJDIgMicsICowPyIiLSchQSw1PFBYISJbPC8jIiNEJ0VQI1IxXlgKLU0kXlgxLUAxUCE5VCtQIEFFIEU8O0hCOkQlPExGI1E7KyhLTDNDQTciIiwsIUAhRzEhJlQ8O1IrKCJSXCsKLU1eQD8+KEJQMTswSTohVEghKCFNNiU4UC8uMDIuKUQ0QTRSIFonSTwuPCAtRiZWXCFBMVYmIVxcQDBAP14KLU0nNUQqXlIgTiEpNDQiICFaJEQsPDExX1YpLUgsSiIgPCc3SEBJQjgiKT8oQjNATlAoKDBDLDI3XiZWIEcKLU0jMTg9IV8kJEogK1kjWzQ+TDIsJCYpUCwhQSg3I1JUQj8xNEQoNTQzM1I7JSA/PDIpQCRIKDo8JyVATEgKLU0nMyw3VUIrVSA6KEUxIEZQIiUkPF1COkskM1wpPSBFJig/REEgIiMlJlwsJFkwMzwlUzw+MVE8LyFeNCUKLU1QQVcyJyg0IlNAUVEoQjQqUDBIPSZcPDoqUEkiIjE4LisiNS8pTCwoLSEjOSc1MEZUMC05ISlMJy9QKVUKLU0hUUAzRVEnVyJIXCkvITA9IjcgPUkiI14pSEBGJFAtNCFaODhdQi9bIEY0L0YgS1AgJFw6VUE6VydIVEIKLU0nMjpZJEJcLTlBOV0gXUhBSzFTTig7ND1aMi84KTogJk8wNTsiMFQ/UiBPSSZRRDIzIjglIUpYNkkxMFoKLU0jLDQgTzBATyMwPDM9MTQ0JDIkMlQwNl0iLyQvXlBKJidGWD9eIFkzJFZcOllCMFAgTFhBVjAmJCBMQCgKLU1UUD0yIl08NiMiNlwoPkxBKiEvNCk6TEUnMD1AJF1EJjxRJ1wkMTg/TCBFTiY9MEZSMUFBJT1QJDogQFcKLU0kISg7JUBYMiFRXChHUTY6IlowKjhBOCEmQSg+OCEvTSg1KCdDUVkgITkgQCchXyAkVCwlMlFaRSYhSEYKLU1CUUZYJlE8OkJRMEsnPVQ+TlEjWSA1QCQgQEhXIkQkP1UxLlomSUw8QFIsOyctSEE6MVVdIlY4MkMgLlYKLU0oLigpNTFVQiItNCBfUitOJ0U8Nz5QLFQoTzQ1QzAnSiUvVCMjMjpNJiIkLTtRKT8hTiQ0IDFVTicpXDIKLU0nMSpTJC1ELCYwUiIhREgqUyBaRiQySEAjMD4rISM0NCdQMjskPDQ0R1IlKiRGPCxcUShCJVRQOychTScKLU0mUDAzUyIyNyEoMEVZQUcwIElYIFBQMz8gNEA8JSBeQiVMSDROUCpMKFAoKlJBWlYkWFxFVVI7KydSMDgKLU1QMSIhJT8sMzkiJTUmJkA8JDEjOCYnRDZcQUMkJFlIOV8iJColTyAjIEAoSiExOC9WQiBYJDA4MishPigKLU0gV0gzIlBKMSU9ID08QC8wJTwsITogPDwjNTA3RUFCSykmLDlIMSFFJEUoRFNCODgjSTQ8ISI1NCJeKDIKLU0pUTM6JjZENCAwQksmPyBANDAwVihHTCgqUClPJkw0N1kyNSYoM0A3LDBANihMOC9WUiU7KDsgP0sxJ04KLU0hRVA4PyIzVSZfVEUkUF8hJCdQQFpAJiwiRzwnLlImVCNUJCQ0QS4iIi40OjwxJTQjOyg0OEIqOycwMDsKLU1VQSFBJjtQJVxBSCIiJzwxTTBJKCgiKCFVITBXKC1EQzAiNTwhVDwxRiIvPiIpNEFUMiUxIUBIMEoiLFYKLU0mSkAgOkEzTSghNEMgUFQsIEdYJj4iO0AkO1QkKEIpQSlBXChLQE1IIUw8Nl5AJSEhRCgqQVIoXCI0XEQKLU1DMUQwJjw4KzFBIiEjUCApSjBBPCJfOD8oQV4pKS40KDAiKzUiQjAgSlE3MyBAUEAnQT9bI1M8RilQRiYKLU0iNzgnVTE2ISRVLDI7QTJOIj48PysgLlcoUUAlP1A2QCM9OCg1QFNVJEooIEAiJCIhWUwlTSBVQCVAJCoKLU0lQCopIEA8QCNRP0klX0xGSUI7XCFKWEYqMTFJIDFQPiVQSSAoJkxCWlBYLCZAICs+ISpCICksKkxQPjQKLU0oSiwyNUI0TiBWLCtfMjJbKSgwKU5AMjEoM1AjNTFdUiAoLC5WME80JjZINTIgQzQoTFg3J1AqPiErQCQKLU1QQCNEJV1IKV1CNkomJlQlJEFMQSlGXD1ZMF4tKFQwMV0xKSMkUVhEKyFITChUJDcuISZdJSMoLywgP0oKLU0hRlxAWSEhVyJFTCU2QTpNJz8wRUoyIUQkRyQ0O1IiICAgLEBfIEBWIUJUK10wMColNUgjQ0I3VSlHUDoKLU07UCRdIlBIMy9CNkMhNzhEUiAxUyZDRCQyIjIhJkUkIikhTzQkMywpQVIpRikpNDNHMjRYKThUOCkxKDkKLU0pOEgqLjI5RCMnTCxaQjA0IUcoJDNROSUiJSwrPzE2JSU7MCcvMDM/Ilo8NCIyKiUiQ1xGPzFeVyVJKEYKLU0gUS9SJktIPy5QJE0mSjAoL0FTLSg1TC4jUUsgJUtUNFBAT10pQUQ0KVImOCdDJDcsIC48IyVAMzswXCkKLU0kWFgtS0I1LyUtVCYwMDEkIDskJikhPFolWTgtVjEzKiI2TEZIMVc5KEwwOCwiOiIhISwyUlBTTCdGLCkKLU1cMVw7JjlYIDJCLDslRUgzSEBNISRGXDNXIjBaJTckJSxAOjYpLzAxNTIjXiIhTDJOIUErKT00IjkhOVMKLU0kOEgvNlE5KSM/XDJJUTUpIUlcOSpSIjgoM1RDXjFFRyJZNDsrUEpGIUVQISogRi8hOVgnPkE0KigqSDAKLU0tIS1TKStAQFdCMTQoKig9OlI7PiUgNEJEME1bIVM8PyZAMUQgVSwrP1I6MCVBPCMnMScoJ0YkPipSJDwKLU0lLigjVDBYXChaIDxRIStDKD1UQ1EyNygnSEhBU0ItTCczSCY6QUZSJ1NYJzpCMz4gXzxAPlFPPCFOMEAKLU0iQTdWITswQjAgViEgJlxCNjFLWCg8JCRPIUhDJTw8KlkhWicgSDgrVkBRPyFANC4nQCJCJlZcLEQyJkIKLU0kQ1QhNkI4MyQiIDxcUCBVIVMwKUVBNigkMUQ1SzIvTSJaUDZKIVBeJidYRkdRJTchIyQqRDI3QCRCODsKLU1QUjBCJEw4RT9BRlEhMVhEPlIjQig0PDcnMERWISQ0RyExXSQjMlA3XiEjQSRDJDc8IThdIjlYLyQgX1kKLU0iPUg4ICIhKyMzIEZQUjFQJTxYKk0iI00iXjwhX1IxJCYmODYtQU8/JFcgJEVRIDgoXDRBMzFPViQhPEAKLU1KMDwyJD04IkZBQUEjU0AyPzBZUCk4SDRdMjlcKENcJSUxO08oNUwiSkEuIiEjWD5BMC0zJVVMKjYgUSIKLU0pUEwxW1AkJyUnMEIsMVMkI1lcIVMwSDkmXDAhLEEwQCJLNCZWQSZfKSRAJkIgQComJFQyTDA7JSBYVDcKLU1RIVBIJzwkIkgwT1QoPTQxMDBCWSgpOEU4UURcJk5EKkRAXTklIlwjUVFMVilLUDlKUUEmJiAkQ1wgL1IKLU0iKThDPVBMJSZYRDpeMiBLJjNUMzYyJykgWEQhRVI3TyIxLCo6QEBLISAkNSNQMzkmRSREKCIxMigwKEQKLU05UDZWKFtYJjFRISomOFQ+OTA2WyguMDUgICMiJj9MPF1QKCEjP0grMjFKUyRKQC9dMCg6J11MLD5CM1sKLU0iI0RBLjFTKSRLRDA+MjdWKEtMLipAO0soQSQgPSE2RCcpWC8zQUtOJ1RQMDUhT0IlJzA0TVBISiM+UEMKLU0rUTg+JEdEOy4xJi0kVCQlV0E7QSg+XCA4MF0oJDo8QCYhNVokJzg/P1A7Mig5IEVZQixZIT9MJFFRIjcKLU0gUzAwPkAyQiNALEZdMDsmITEkQDRQP0gpTCA3TVE8NCQsSCM/UFxeIkNMJ11SJU8iOVghMyFfISJIQDsKLU1dIS4xJUVYMSNCKSwiRVgqSFEsJyAvMCNdUjwjIU80MCogICEgICAgICAgISAlOCBfUCdcIFRYJF0gO04KLU0iM1QrWCBbNyRCKDVQQUZWJz9YQkZQICAgICAgISAgISAgSCA5IC9IICAgICAgICEgICggIFAgJCAgICAKLU0gICAgICAgICAgICAgISAgIDAgIiAgMCAiICAwICIgIDAgIiAgMCAiICAwICIgIDAgIiAgJi8gICAwSzAKLU0gICwgICAgICAgJCAgQCAjICAwICEwICYgIDwgIiAgKSAgSCAiUCAsICBUICNAIDAgISggICAhOiAgJEcKLU0kLiQgIT80MCAtMkUgLkFPUDg7UiAiLUMkJVhNOlw8ICE6JCBTLlQ7U00vIiQgICI4M1hFU0VYQDNeXiEKLU1BOlEhNlJVTSEuWj8kKy0rIVE1W1I5Py4gLCFBICtHVU9aTTxJLycjOFJEICcxICAgMVREJC4tX1dVKjYKLU08V09RICAxXzA7JEtFRyI1VUBZI0MwNk8qPUwwTFFKMiIgWTQsIFY1PzQ8NCZLSEEgJEQtPF0zJ0IvV18KLU06QjI0I1BRWCEhMDAgKSM5RSY1IistPUIxMCY6KEI4NzNSPCBHUVwhT1ZLTTkmWFhFXlc6SV9HVFozXS8KLU0gUCA4JVEgQTZSXVVDW0ZKSDMqPlspVTMkWEMnTThYICBeJCBdQzMvOUMnLTFPWTVaO1IpLkRLSicwXl4KLU1ELjAwICcmNUk/JVc9MkVZWiY2VEpQPUQlOzQxRjxSRyVBTy5QMj1EOFooOFJOXkQ+UjctVD5dUDpdXF4KLU0nWVdKIFVdMyQtJyxbQilBVF9IKD4+IyZWQjlHVldGSzk4WDpRUEAgQFokIC82UFAoVjomWVZXRClLOFgKLU0tPDxMOyNLLVw8Pl4rQU4uICEwMCAmLTE4KF85TiIlVCtbIC40LEReME8zTkVXOUgiPDFXWTElVCAgLi4KLU1APiQ3TENPRD4tIDonJDgoI1dHVV0qPUJZWEkxOExXNUJXPzlDUSJIK0QsKEpLKDo/KFhBU0QjU0JMWCsKLU1BLDArKVdTS0UsLk0pMSkpODAiOk0oKElUVUpFUl5UOk46XT4mKys5MVsiV0xJVUMlI14sIFVXWyBMSDAKLU0gIjgtPjJPXz8mR09YLlFIJzo3NTJOTUYySjAwIVM/VF0jQSYsQFQgXVAhTTdEJEU/TlhdK05MMlpAXEIKLU1YIy40Xzs4LlApT00+J1E5NFwgRDlLQDNIPzQgJCxMMEYkJFRCLiAqVlxAQyBMSV9fMDY5RlwpVy8uLVgKLU1TKFtZVzI9S084WUZCOzggIEIkIEJAUDdOWFpENUpeP0owOSdMQzk9MlVfQEAtUkoiTyNeVjQiSENIIzAKLU06UUlDKFEgID48RC1QLkc/KjsvJlJEVyw3RTU8WDJQXEgmJFoyPU8yPiw1LCFNOlhOVD43QVBcQC9AJE4KLU1FOUQpIF1cWF8wXDVZIlxDPS83TFRcXzwiLDAkTC1KXFM3XDlJQyxGIF5EPyBEWCckKjcmXUpNLjIxTUcKLU0rMClOLzA4MTYiR0s9QUMxXz0tQUIiKyxXNVxbRS5aLDQrUEo8QCE6WDAiJzxZI1sqMy1TOEIpLi06WCgKLU1YTCldT00uJ18wN1ldU00vSDUwXzlQPSVVXTBGJDcnIiZAIC0kICA+QTYlOztEXEo6MUFbWEFQJDQjMEsKLU0rXVRHW0YtMDw5RkZSPkQ2Q0RITiohPCg7Rlw6MjFFTiAgKE1QPz04XyxKVjkkTEg6N1I3QC0hOEwsNygKLU0rNkw3PVs8PFkwMzMzQyQwLUpeK1RXLzQ6NVNCNEAlIyQuMVtOJVcoVE45NEFTPCgmKDI+K1FJWFI1I1sKLU07LD8jRSc6ODZMUSkzQkBJVU9FRVRVUik1M1AsQFokICNOTzNLOj0hM14zV0UzWEE3MVNbVyMqXzdRWEkKLU1SXTc5S1U/MlYoMlpTK11ETCorXU1RRiVXTEhRID5AMCAtMSFGITlbNy0vJS4oIC5VUVxbM181SzdITj4KLU1GIy1SXCU8MSwkJyFTL0RQLkNXKis1RU4yXSBOPzk1OiAkSE1AP08jVC8xMihCQTBNUF9SXFU8MyUhLzwKLU0wRVVdVUNEOUY/QTkuIVAgREEzNkFLLVdON0pFX0YkMk1WJUogIE1fJCdAQTg6SVAgTCYoUCE5MCdHTSIKLU0sV0c1LCAxSygtMCkwIUFYWlo1L0tePVZMVVZfJz1eNE9cOFMwI11bTyhUICA2JCBHJywyXSVUJ1g5PVgKLU1ZWyRPU0VGWTdKSzpNIz05WyVEIlQuR0EiXD9EPzhCJCg3QE5IRkUoPzElI08oKS0/VC81JCAhOl83LD8KLU1ZJTBISD4nPDNGKi9GMD08X15GXkA6WF9aXUI7KS1WMDcpOk8gJVBXRjBEV1lKTjg1I144UERWU08iLCoKLU02M1UhXi0oQlQjL0dJXy9WRUUyJUNaRV5LWzg8RkAnICVFKFxYKlMlK09YQC9SL11ISV5ZWkA/VydCO1oKLU0tV1xDIlUlJSA5MlskKTFYIE89VFAoUDs3MCJQXCw5VUo9TlklLis5PE1dRSNUTSw9UkNAJUZXVkQ8KTEKLU0wXEcvKVk2SzU9O0JZQj48SismRiAjVEEgKlArWVE+LDxfIiBZNiJNLCU1LyYvQlcqVUMtMjhWSz1VQEsKLU1FP1VNQ0dOMU5OPT87Myk2MlFOTjZPOSQ9I0YlR0dRJzo+TCAiMSAgPEtELEwmXVNHNlg6TEQ4ID4lVUQKLU1BIC1fWFwsQTcuLkkqPUdYMSknIlgsP1IySlk0Mz5fNjdKPDVWTUg4KFdWPEo9LV5JRl5ZICAlPSA6UiEKLU0/QV5JWD4kRTkhKls/Rzo9SCQ7UU4jUiBfSj8vMy46QlQgJVNLOFNMVUNBQkI8LyRRMDddJ09CNEg2WzUKLU02RFkpLz4sWCcvPDA/NCJVME9BLlNTTEE+T0RFPDZPID4zT1Q7LilESlpeOy1cJSowOzYtVSY4ISAiQSAKLU0pVERRK1gnUC5dX15TQjEhKSFZXyhMXFEiKF9BICtGUj0zUiJCITozUzNcWjpYRlRBXVgoR0Q1JjokVkYKLU0jL1c7RFknPykuUDMsJkEkKVlGVDA+WlZAPEsjNiApMVw9RUgpOildPUcmLSA0WDAgLU1VRSE3UjheKDoKLU08JiQzIDEgSjkuLlBGX15QMkYlJEpFMCY9TFIkUSxAXCBINFpUUSZGPiUwOSdXVClbMSNDPzdMICo0UzcKLU0nSjtUIiMsICxYUyFFPFExUiNSPFtZIUgtNk4mWTo+ViUuN1JFISxbXjMzOkM5KFo4K1AiQj1XMkRGVTkKLU00XyU9MyMtRTUhMUZfLSpWLlgwKis7UDM4OkcpPCAgJyxRIiYuSk07RkNLUi9bSz0sRDs7VikhKjYuQSkKLU0xTDRIQyw4PywlTjolUEFFQCdQSUErJCZPVzYvSVhRNSVeIjRdMTtUOUg7RElbV1YwSzdGLCJQICA6JCAKLU0wNkpHKlkvJVUnQV1RTktDSzJNTCpfUiQyXyFVS0ExVTYnTFQ4SzlaVlgsMSMlNCJGMlxCXV1aUFsgIkIKLU0uXFZEXTw1L0JFTUVCW0ItXF0qIStGRDAgJTRRIjpNOFRKOCwpTE02ODguJzpBU1RQNzYnWic4TDEkPy8KLU0wOiAlR0xEKCFDWkBOTENIWVxfIDU+J1oxKytPIDdaUCkiIEU8XSVSXjgnRE4gNk4hUTcsQDsyT0MpRSIKLU0zNywmLE9PNkdPRzFQVCAuUiktLzBbQCxMODNVPT4vKTZfMiw4SS9fIUIyNyZaXTJeOE47KDhPPz4jNTQKLU1YOy1aVUVcJT45K19RSjRNIDExTyQhLEQtIitVMSIxXT9DViNJWTMvJkFaIjJUIFE2P0ssOTowXyFXRiQKLU1LO01ZTFgjSTpHJTk6ODRCUjYtOTZPVSRHRC05OiUtSVQsOC5ZOVxYWyUzNy1HMCAqRiQgT1MpUyJbQFQKLU0+I1BUODtaU1pAOSpFKTZMQz8mXzpTPCpfIiNfR1o7Uy5MWzRGXUAjUiJXTEZdTklSPVkpXiZHIlNQQFQKLU09RVNLRFA2USoqNyklUVxALEcjTyAgODAgKV9NXk1SIFM8LzsnVkBYK0o9WTYvNjooOlNGNjVAM1U6SUYKLU02NkI7LDJBOVtaRDVIJ1smQTNOPUpJJURBRFRVOjNCQzgvPkNMMCVdMC5cNkYkMFxJKj1cVj9OOyckJSoKLU0pVlg3S0U/TDhIRkpbUitbVzs6QlteMDdYO1dSLFY6KEAjPlQrI1pfTi1aMSY6UUQiLTNUOkRYVV9WSC4KLU05VTpZJSQjOy5cSVgqSU1IOlMrJVY/Nk86O1BGOSpMMEVbXU1QIzxcU0tKREwzNEFDNFReQ004Plo6SyAKLU1RLVU7I10/XCUjWT8iRCA9ND8iVj8mSipAWj0+MjJDKyc5Xi5LMDImWzhSJVw7XkBVNkM2Py5MQigmNF0KLU1MRiglVlIkIEtQSFMpWkFfMkBVQUZXKFFFXk5AO19VS0g0TCtZXSA6WCM7L0pINUY7ODBNSCxHOSQ1SlAKLU0rLVQiUSBER147Rz5BKUJELUFfRjJGJkUsU19KSlpcNSNaMCUoWSs1WiAjRCQgIVtKM1hFWitaVUE8J1wKLU1KLzE9JyA8Pi8iTkg2UEAsXjclPSggKzYgISAoRlRKVkxYO0o7K0VFLjAnITI4UVk9P0YtVykmOyg2WVEKLU1bQi4pTz01TUwrMEIhSDowKVtPTVpOLCAoR1AhRiJaJzZbWzNHVys4VjJeJyRBNTBRRk8+O0cjLzJNQC8KLU1VOTVRO0I6UjlLIk1RQzhEJzE3MzZDUSI1IFlDX1cvIFMlN08lVjdZKi8pNU8sP1dALVNNVy8xTltcWT8KLU1XJS9XICA3RyQpPys6PkBGVVcoXk0uMkpBRU4wLjIqPCxQPVUyV0tJRDJVJ143Pjo7RCNHJUBPWFEgUjIKLU1cISNSN1ZQMSk8LiswTEdZRDlVUyJXUk8hP1xNQTshIz02RE0qWDBMSUU/TyQtID9YMCIsXDBWSS9JRjsKLU1TMU5OKz9LIyE8WDhELj1CKTRbI05ZMykkW104Q08hNyAhPjc6WVRNJTcrS1BZJV0iUiZNUV4uQ1NSLkEKLU1cXkIlPzRPVicjSSAoRyFVPDlLXUkrSjo+Ric/OkFfISQgIkg5OlwxLko0ITc1MkZePUdaNFo9ITdOKzsKLU07KyBJNDQyMlNXUE5HIyolU1g+VkomRDROUCoxODlGO0FYQ0QmJS9EPC1ILkZeXighVFZeSTM8VDtOMDkKLU1ILENHRTQ5M0I4RE8zKDRHIS1DS1A6JyFaIDkpUEkyNU43SVAzWCUiPTo0WS5GLCtCUiciNU1NJj0hK10KLU1RNEcqRkQ3QjhELFk6LzE4NSYnWy9RLTpNTjZbMjM2SS5eKkFQJFBCJTFCMElUWSRWIlYmQEROPU8kSkcKLU0yPSQgTzIsMElQRiMjRFYnIVklJDMiSF0sVC4xIjdOM1lGTygrJTI6PyA8QEU/JCZCNUBSREJOSiExTyUKLU1ARiUjOkJLRShWW19ZSD8pNzlPO1JOKls1JyZHP0MtOkdUXCczLiY4SEkuQSxYJV89LigzICFSQSAtM0kKLU07JVFdO1lPRFY+P1kuVl5BPVYoVDQ8Ois2PkM+Kl1ZOFNTU182IikmPyE2SDVXNTkpTj1HNFE9V01WL0sKLU1ZQEk/WF9UWTozL0hIIzZIITtGJ11DJC8wUiQ/MF1PODZPNjZKUUw5SEZAXyAgMDAgLjhBWkNTMD4oVUMKLU1ZU0ZRW1o8Nz0yQk4xWVZLJSxNXTomXUYuOlVdJ181Nl44Szk3T1hfTDU8QCdaQFRDTDNENlQrTlMmNlgKLU02OV0iJ0NNO1BELDNdRV0uUCxVJEdbVSVeRTFDXSJFQi5SIzlLIkFLQD5LPTxTVCpfU0BDSlNALUVIL18KLU1RVSAiMVUmX0w6UjNAQDsvRFtWIj1cMC8jPy4+JldUW1U/XVQpTidKLidCM04jLiYsXCA+MD9DXTNLUEQKLU0sLkRMNDk8XDEuOEJDP11FVzhZUDE/JEtDPV4jJkQxPyQmRFdISjo6QT1DPTEhIy1AIUwiTjIwM1YzNSkKLU02U0RBLyBRUiFdST5eWVc4IEFIIFQ+QzAzIExNIV05OVw/QSwnO0NKQF1TMl0xXU1NO1o/IFRRJS9AMEwKLU1MWUUyVyBUPj5AOisqXFBePy8vNShFSCQgRiQgIE8mJDtAMEE0JjMyJVYpQic3TDI3VkMwPUk9Skw0NksKLU0qQypVQUJXQlRfWE9NPjFCLzFeMS1OVCpeVlgoLSUmXDAjVz1dWTlOTEAhMkpYI0s3WS4nWFFGRiY/KzMKLU0tOVxTRkU7MU9dKU5OPUAgVSktPiApUDAgLzM9IjUpPTE0K0FLSzBUK0ouU0hWXF9TN0lOTSJBV11UTyEKLU1SLSFHVE9DQEtKQFs5WlcpNUstTFIpVCtFOVchICVNKEJDVSpPQztUNE1HSDM3JzsoPDdZJygkKTJENzgKLU06TT5KMydQKFg6Njw9OU4oIC4wXCAhP1swM0FcNitSIzJWJVQ3WEIoKUNDSjQsIVJHJlROLl5UVTdEQi8KLU1GPDJdVVpBWUBBOiRILEpUNDtKLjI1UyYpTTMpXF9SXUxPPkZJVDNSMycyPihDIk9WTj41RENMIE1fNiEKLU1JPFJIWCtMPyZAX1VEPylcQCo1IyAgLjskKSg2LiVaTy5NPShPVVk6XFRFRjUqX1okTjk8WkdCUSElSDQKLU1AVSpVWUEuJ0UxNl1WMk1cRChYMCIgUDZRVkJKJys2QF1QI1ZPRDotPzw0O1JMUDFZTVZYQUw7MlZVITkKLU04NzkoSV5IKVpFPC9fWF0+MSlQT0NGPEEgKSwpW0JLMi44PFw6K0cxOFJZIF9SLUwiWF9IJEo7MCFcQSIKLU1QLVlcOj40UUFUSCMzW0JYTDgpLkNBVzI0JUAkKz0vVUJbOiNEIEVWWkEyNVQlUS0tXyw1Rkg9KCBVOV4KLU1BVkhDLUpRPi9bTVNTU0FHL09JMktUMDVOQSAgRSlFPyNfO0dNXS8vLENMSlBfLS4vSTI+OU9SKjUxMSgKLU1MPVteO04rXVcwTz1GJSo0RSAkIjNaN1ZZUVFSIyJIMkRPLjVNU1kxSTcuTkwzIldFSlIyMT1ASTtcTUQKLU0hJ0dSIkdaTlxINScySSY4JkA1XixOJVY8TFE+IFUiOyA1IjxLPycnVypUTC4jVS0tVy8mOV0jSjs6QCYKLU00OU9SXiwwI1g6KkA0QixaVVEhU0o0MiVWO0svJEFAIzwoPFpGVSs8NE5DRUxPTS4hUT5GK1tZLVVeJCoKLU1KXlUvQyYrTD5cWlkwIic0OUgsIEgxNVVZTFNDKj8qJCtQIiFVUSNFOUopPCckSkUvXkRcLzAxUiojWkoKLU00Oj4uKT0hMyBfLzowXjgoSThUQiVOOUAmRiI8XU9QNFQlQDRSKVQ6NV1OWkw5LERBPDpZWyFDKEMwNlkKLU0qXig5ViojP0QtQTVGQUxeSTJCO1ZCRTA6JUEtQC8xVSs5UUM8RTsjLlAgM1gwICEsJFMhKFY7UTA9I1YKLU1DXTkjU14oK0UvXjFRO19AOF9HOVJLRy1dTkY0SEBMUzoyPS05TjRTRF87RDJMSytcSkJPPVxKXEctLkcKLU0qMiM+RVFAVS0gUzEjKCAqI0lJTVdbKERUUyBfWVwrX1I0UDQyK0UhPz5UMTVTUSIoQC9aICAsMCAoNTUKLU0sU1ssJUAhVktDIlcwTU9CViBBKzszOCwtI1krVVcnQV4wTClaMVctQ01aJSk3IUsoX188NjokU08oN0EKLU08M1VWOkg4MSdcRV5eNiQ+QFU5LksiWSldLDMoMFVAUEwpMTJISFgxPytbTV0kPyYqUldIPEBaW1slVU8KLU03Wz1VUlRLIU5DQEMsMiIkLFEqPE0kQDZWQFVSUUQhIk9BXiY6JyJCM1EhI0QhRTNRJlArJyZAISpBPToKLU0jT0cvKF5BSlUvLyYmXCM7LDxRXD5cWCMvNE4oVEBPRUE8XyhOWDtFMUxKLVg4JDRDMFFbLEkoNF1FMl0KLU0yPickKV1SPFpLJTgyQSdZJFEgVlosOVoqOVtUJUNcKlxURkZTVz5FKFouRE9FTiJTKilSK1M0MDEnXl4KLU1HMS5YSiwoUjNMRSwsWlZcR09aWj1KUEEsQlksUzMoXiRZJlQ8L1s5LUtNPEVYNSIlIUtdMUxTPV4uOFgKLU1BXSlJIV0kNyZAK1FfQ1pVSlpbI04+WU8nIEAiT0okIFI2QCYgLEhJSDtGO1dFVE4mUF5WUSIlUTBVIj8KLU0wWDg2OlJHMjsqRChXVC1ARTFUQigqIFA7OzInWFwpPjlcNj5QU01dVCdAUFk3XjBOLUA7V0lXOlktP0YKLU0xJVkkWTgzPkxEVC03SVkhTUJGQj1AWCdVPUJDLyQ5UUEsK01TMVNBKEI8IDpRICBBUSVeTl4pWjo2QkgKLU1DPlJIIiI9LDg2R1M6QUhTPT0uTSFANksmTkI7ME9LPjgwWzw7RypGUk4jM1k6TlosJ0knM00+SlJOOFIKLU1QVDhWQSszJV08RiwtWkcmTi0kW09CSUNdITkjJSxUOk47NF0qUEhaMVoxWDg7O1hZLVxMJDNFOSVdQTgKLU1ZQCAwIkglXTMtI1ZEMFgzWTdQWEVYUi4zSl83SVxIOkApVkowWVJIQlQjKzoxWlcyKS5OMVYxIz5ETkMKLU1CP1g2IlknOVAxQV5JUUxPIDgiQiMlPkElUjUpXD1PJT8/PyokXDEtSD09Qj9NJzwzOU1cIUgrVT1cXTcKLU1fREc+OE1NWl8iTSk7RCI8IFdaMCAgKS8kJkk6RydZMlBDPVIzSEc/TS1XX1UiOT09JCY6USpMNVNMICEKLU0kVjxNUFdSKlYtPyhSLUIkRjdNPTpCKl4rXlcvUDdDRltULjwpPzNaJjxEQktVRjhSSUJBXilFSCdKN1wKLU05JyoxTCw+Nk07OFdFM1A5WlQwSD80VjVdMis1WUUySkZEOCJcLFlBO1AgICAgICAgMCAiICAwICFQICoKLU0gIFggJEAgNyAhUCAoQCBJICMkIC4gISAgJEQgNFAhPSAmQCA8UCFfIChMIEYgIkYgKzQgUFAjMiAuKCAKLU1cUCQkIDE4ISogJFsgNFghOEAlVyA4VCFIQCZYIDxcIVlQJ18gQUAiLDApKyBGNCJAICo8IEtEIlUwK1IKLU0gUSAjK1AtLiBWWCNDQC5PIF0gI1xAMDUhI0AkNlAxXyEqMCRSQDNQITE4JS8wNUUhOFQlTUA3QCFASCYKLU0tIDk/IUhMJk4gO0UhUSgnMCA9TyFZWCdTQD9fIiMgKDgwQjMiLDgoXkBETiI2KCAgICAgICAgICAgICAKLU0gICQgIDAgISAgJCAgQCAiICAoICBAICMgICwgIFAgIyAgMCAhICAkICAwICEwICUgIDQgITAgJiAgOCAKLU0hQCAmICA8ICFQICcgIDwgIiAgKCAgQCAiICApICBEICIwICkgIEggIkAgKiAgSCAiUCArICBMICJQICwKLU0gIFAgIyAgLCAgVCAjMCAtICBUICNAIC4gIFggI0AgLyAgXCAjUCAvICEgICQgIDAgISAgJDAgMSAhJCAKLU0kMCAyICEoICRAIDIgISwgJFAgMyAhLCAlICA0ICEwICUgIDUgITQgJTAgNSAhOCAlQCAgICQ4ICAxNkAKLU0gIDg8QCI0OCAiSCJEIVdXJEhUISYwOTAgW0wiWDFJOCFTMDgoIVROJiksRUNASDUiIkQgIDAlMCQyTDcKLU0rUSNRITkoJjYyMCwgIDwgOCBNSiRWLEE0QEsqJS4wOlJCMC0gIywlTCFKRSQtVDFfUUMhJEFII0pBSEQKLU0iUDwhNSAmQCBFOC4nUEk4IVIsNFswUSUiXzgnUDArSSIrOCtIIFJWJjlcK1JQOTwoKDwuOSA8PChUNDwKLU1IQCJDJEA8ICAxMDAjQ1wnR1FAOyI1VEJbUi9MKTwwOTIxXVUgOUxFXDE6NCAgRCs0IFVbJEIgNTEgI0sKLU0kJCQ9XEBEMCdNOC5eUV4sI1FIJlFRWD4gI1goVCBaIyk7SEBSQUdQJks8ODkwWlImL0QoXVBcQiRfJCEKLU0rMF09I0skIUZSMCAhICAkIyBGUSNdRDBAMU9IJywsOEhBTUshPjA6I0I5IiRcPDojUjs6Ikg8RiwiME0KLU0hXVAmMUE6VCYiVDpWUiMlKCUoQTBRIyMkWFwsWDBOLiNQLDJKQSlCJz8wICAyOzAiWSxDSlBeRyVHWCEKLU1CQChUJjowRj1AUyUgUSQ6V1EuMCZbSDBCUUBTI0ksIz8hOkAgIEw2MCIhPCg8ICooQEdaKE1IMyYwPzAKLU0gPUgmTFFQNicnSERGQVJYITxALFNRNEoiQDwhOiIqNyAkTCtcIVYhJS00OzkhPF0oTiwvQiBfLicgODwKLU1MUS83JD0kIDkgQEQhO1AoUiE2QiYxNEYuQFhYIyogIVwxXTAjNkwrSzBUWyk5NCNbUjcmJEZYJl1AICoKLU0lN0grSkBWRidAKCFeMScmIyFUK0FRUzQlI0Q4MTBILyMrTDlMIidVKTkwICVAXzcnR1hFXzBCTSVbWDsKLU1AMU0yJjdcKS0gJyQlWEwoMEFMSyZZNDNHMiBPKFhQNygiJ18hNFwgIEEqICc3QCxXQStLKDs4IjNCKFgKLU0oXkgpMDIpSiRULEQ4ITc7J0IwQFxQSEomRSg0RzBHRyNaWCYvQEsrKDosIVNSPCAgIFRBLCEoLSRaLCkKLU1CIVNdIk8gRCQhNDEkWyw+IlE5WiM+JDM1QEYxJkRMRlkiJlEnPFxARlFeWCJRLDkqUiY8KTgoMTtRU0cKLU0gJUwvJCFVTylCJCMkUicqKS1MOixBQCgjNDQhSzEnJyZdKDk2ICFKKEo0IiQwUlQhTSxDLCFNUydGMDsKLU0+IF4iIl88IDkwIVciLVQiNjFKQChUODhBUCxGIUFQQkQxQU4hOSg3WEFQSiZeVDwsMSI1KSdQRSJBSCsKLU0mOSAqRCI4KyA/TDdeQCIvI1pIKllCL1wpLjwnSlA/NiNWMC0sISotKT9cLDhQWCYoJ0ggQjEzMCYzNDIKLU0lMSA3ICpAPVFAX0AjPlQiRFA0IyIrTCsjMCkjIy4kJzRAJE0hS0A3J1IsJShXVD9FQS1bJUtYICBCNSAKLU0iQVBGMTIjNSRaLEY6ME1IJkM8QiUyI1UjIzA7QTFFPygjXClLQDhWJlYkJTYhPUgjUlQ3OSE+Vyg6TC8KLU0tMio4KFQ8LF0gWFkhIDgsVCIwLiAhICUkIjZfIyU4ME9RJzEoLzhFNyAzNiU8XDEwIjhCIUNYKU8gQyoKLU0iMEBBKTBDJShdXCJKMUdGJFpAQDsxJz4nXEQpJ0BZKSY6PEA+MTxXJE4gQjIiLUsgJlgyLCBMTSVYIC0KLU1TQVlRIkY0JjFBQUwlPjwtWzA1QCA/TDgrUEQ8I1hMP0wwXTghUFggUVFfNSBFSDxFQT5UJjBUMSAwJyUKLU0oSyAuV1EtJChMRDVZQEVdKCwsIlVBN1AoUyQtICBZJCUlUCkwQiEkIUNYJStASD4gWDw2QyFISyBAVCsKLU1VUjZOKDgsLkxQVk4kJEQ3TzFDXiA5PCg3ICNQJiwwKjZQWkQoM0whRSBRSyNGRDhUQSAmJElMIEwgKVUKLU0iUjREMiFWLyQ3XCszUCo2IStYOyRRPT4pPlwtSFAkUiJfNCA+IUZCKCA0JlJAR0kpN1BDUSEvPSk+XCoKLU06Ijk2JzNUOEgyMUQiL0QmLzBRIilMKCEuUStXISwkICBRI1AjLiRAQkFOOSFPPDRXMT5eI01cM00hXEQKLU0hTlxENiI5PSZPMD4lUSQ8J1UwJi8hMkwmJSwgNFAnWiBDTC04UDgtJ0VEJF9AVzQkRVQ8NDE+QyI4LEIKLU0tQipCKSg4Q0oxJ0ogITAwICApQCY1SDkoMU0yKS9EKl5RNCwoNUQ3SEInKCg4NCAnUEsxKFRIP1lBVCUKLU0nVSg7MCFSWiAyUCZZISQ0JT5YPipSMVklUiw2TyFcICEvSDZVQjk8IC9ERTlCN00pLSQ+XjAsLCAoODUKLU00IEpLIkQsNV0wLlMjXyAuREFDXCYgIEIrUS1WISQ8PkxCMlAgNyg4KVAnMiYsMCZFUVRLKFI8PSxBLTgKLU0nRFQlKkAjWSBZUEBFUDxRJFBUJyRAPEkiUEAsWUA7SCA7LDovQCBRJlFUIztBJSAkPVAjUzEvMiktPCwKLU0kMT4jIkhcM1tROk0nQUgxV1ItSyU+SEZFIDdOIDJEJSRALC4oKzA8WiEuVCMrTDQ2QjM3Jl1QOlwgTTcKLU0mMzQkPUBBKykoRDYrMiJcKSRERiUgWVMlKkw2MTE/MCVHWDswIjRcJjVUN0ZQUyUiPSglRkBSWCdPOEYKLU1RIiQuJ0FEMyhRQ1AgMyxATVEgUic/TD1aQEc1IS8sKClBLDUjVSQwMEEnMiJbSDgvQEw1JDMwIUggQSoKLU0oXSRCTkIpWiVLJCYkQTFIJTI0MlUxQUInQ0wgIFIuUCRQND4qMUcuJkg8QlhRL00kQDxFUlAyWSBKLCEKLU01UDU1I1VcJTwxPiAmXjg3NiEtXSQtICI5IUQhJlc8QVdRRiMiPFhDIyE/LCYqJENNIDxPICdELUhRMCsKLU0oUkw5MVAvWyAvUCI3MSZWJyhYL0tBUkIgIUA6XCEoUSUvTCVCUiEyJjdUPV1AQDshIUA5KDEpWSMsQEIKLU1OIFBBJzBULj5RVVMpTURANCI2SyYmJEZXMTZdKEIoKUNBX0clNDQwJCEkWiA2UCI4ID1aJlNIP0dBIiwKLU0iOVQuI0A7OiBaMDA3MVsiKSw0NDFALiggKig4PCFDKSQxUCMkQSEnJj4kLytRVE4lLSxGWTA9TyRLMDUKLU0pQVVKIUMoIk0wIyskVChDIyFaWSMzJEE+UE9FICJUQEEyJUMmWDBFXjArJyNaQEA1IjpAKDBcL1dQVzkKLU0hVDgyLFBaLSEhRDkjMVtNIVs0LVNCJVMiTDwkKUBSMCZQPEQsQCAkI0UoLFswPFwpKzglNzFLTiAwREIKLU1DQFMzIUFQRFohSl4oKVguWEA0NSkuKDlXMDJIIy1UQz4xVSggTlgmMFA5OSlFICtCMEI7JCcgNzVSIE0KLU0hTUAkXFElLSIlOCZDUjA9IEFQMTAxT1cnT0RGViFSNiZTJC5QIShUIVgoKy5BLjAiRUQxIiIzWyI9PDAKLU03IEJNIydUKjkyOUEkMUwlN1AnOCZOPDxDQjNAJUY8KSExWlgjWVQ8UlAxSyhaQDk6MVhaIiI4NCtSOycKLU0lI0hDWiBPUSU9XDw0IExCKE4wJSsgID0lWkQkRFA9KCFaID1RQF89JT9AICEgXUAiPEgiV0BPVyMjMD4KLU0hQSNDJ0xcPC8wNCIiVUAsM0BDKSg8JDlBQCsgIV04RS1AUz4nRDwjL0AjNyAvIEJYUEAnKTM0ICYgNz4KLU0gLFRCOyFfWylAPCFVIC01I00wN1YgOTckXyA4NkIgKikgSCZTQERPJkdYQSohX1khRyAkLlIsTCAhVEUKLU1YIixSKUdEJipRJlogKkwpUTAsICE5TDFNMS02JzBAJDUwNEUoSTwgSkI5SihXSD8zQDFJJUJcNi0gIFEKLU0jQDQzREBcQSUqQDQ8USlTJD4gI1VBRzwkQlA0SDAjViY9WDMxMUNQJFBIO1ZCKlwkJTA5R0AoUCNbID4KLU07UUxeJik0LEpCNTEgLCw7RCBNNyMiWDciIEpCJi9UOiBRXUYoXkgvXyBNPCVWTD9RMV9YKUs8Q1AgQT8KLU0iNiAzSUBJTiYsUC8gQiUmKFQwQkwgWlMpQUQ1XDAtJyNGUDhSISo2JkxEN1ZRRSQgXlwpTUEgXSQtJC4KLU0qQEw6KEM8KU1QUSUmJkg8P1IuRSNKVEJfQUgiIiUgJSEgP0AnJSghJTAqVCc9KCY4QUAlIV1QIkZAV1MKLU0lODw8VSBXWilMQCNJUCZOI0MkIVBAPDIjXzggJzAuNCBTXDJYQiozICpEPDpSNj8hPyQxL0EnRCFUSCYKLU0gQFM9Jk1MO1oiLispLjBFXyA7NyZaOEEgUTRcJFEgIjJBPyIjTjBBO0E/QycuNDBFUEFeKC4gIjAiL1wKLU0gXUgqSyFDNyVNWCYqMig7ICo0LTdAQ1shUDw4KDErXSEsSDlVQS9SJFkkLClQPkYnKUwkRCFEMyY0OCMKLU0sIFgpJThEMycwVFIlTzguWCAjIiY8QCBAIDhOJCkoQk1QOTMjV0g8OTEySSEmLEM/MDQ+JVwkLlRQUDMKLU0iIUhCJiI6MClJICwnMTFKJSIwICEyKEAhN1hCSSAsUyEzJERTIicgJSIoIkUhMj8pPUgwWyFXTyBdKEMKLU0pMFElICooLFZRMy4pSTwrRDBfKSMqTEchIjhVJiM8LU5QWyQiRzgqTzI2LChOXEJKMD0lKEVML1tRQTkKLU0hIDAwRiFPTic3QCYuQD4jIUowK09SLC0mP0gnQFA8Kig5JDdTQDxPITtEPk5QNyEgIjApUCAtRCI6MCgKLU0tQEo9J0k4KlVSLzUnNzhCSiIjVCU1LCJfISUvI01YPTxRU14gIjw4SCEuWiZLSCFAUjglJE08LCBQO0sKLU0pPEBDR1AiViVYJCAsMDZDKTQ8IkJQNEooUUAqMDA9IyNFNCBcICZdI080OChQWzsnTTgwQlBSJykmLEEKLU0nQElCIkhQIkFQQ1ghMig3UUIrWiAuUD5MIDklKDVIKydBL0EkRFwuQSI6XyJENDJWMjlUJipMNEkxLkIKLU0oVVwjNDFWUiQ8NENdIV5RIDlMPDpRJSwjVEgyU0EkWyVKQDgmUVI4ITFYIk4yKSUpMiA5MzBMUCNfQCMKLU07QiZZI0tAKj9BL0cgMDAnXUBdISVdXDoqIDpPKElQNEIgI18kQSRFJCEsQSkoPCJRIjAuJSNQJiQgLFAKLU0mRlQ6WlA2IyE1JCIyMEcgJVMwQ09SI1MnVDgxISIvICg3XCVDMjMiIC8kLCMwUTkjUyhBJVFOWiEjVDsKLU0kIT0lIFRcPidQKj0jV1ggQiFQLiFWQCY5UiwjJzg0RlUxU0gnVlA4NDEkSyM8NCpQIF9LITlQN1IyLjMKLU0lVVggTDEyQiVfLDYqQTtWIVs8RCRQLCUhWDg7LkE7ISAqWCAgMVMwJi8sKzdRRF0jSiw9LiA6OiAsOEIKLU1IQT9XJjY0PD4wXlghKVQrKlBQJiVNOCBEMjRKJUdUI01QIE4jIEwiIlBUPCdWMC4wQSA3ICo0Qk4gJl0KLU0jL1A3K0I6ViQsMCs2UDgyICU8MFhAN1EjKDw/XCFRJSYwLD9NMUFRJVk8Qz4wRCslTEAlSVFZVSIkVD4KLU1YUjlbJy5cQTdATF8hOiw6JiAgJiM9IDo8UU9WJyBENjogXCAkT1w8KiBWMiE7QEYlISZAJEFUMSohME4KLU0oNiQuKzAwKiA8SCwnUEZHIFdQPjtBNjwiLDREMkItSiZDNCFNIS5cIU5AMVpARUggSEw1NUA0JiFcWCcKLU0mQU9bKDgwLzRAVDonPCAxNjFXXyFZXCs4UD8tJS5UJDoyKU4jRVgzWlFOSyZSUEVdIU40JCIkPEYyOzIKLU0mVSggKlEyUCcwNCQqIikzIT9cNlMhSTElLyBENjFUUyQ6UCkjMCAoJDlAPjRCLDImICw/MyBDOiErSEYKLU0wISMzITA8OC8xJ0MkI1AhISAmXSc/OCJXMCtVKT04IllSN1ghVkwzWSIyLyc3ODhCUTsgKC5ILT8hIF8KLU0lKkggLTAwSCAuPDFEMjNBJSgwJkpCLzQiJ1QzKlErRiMyPD5HUSUiJV5AMkMwXS4jUyghJ0InMCFHLEMKLU0oQDwxJS4sP1gxIlcmXEw9TlBIOCNRKDlJMjQjJCY0RlcwUCcoO0wyPEFOTyM1PDkqUVhNIl9ARDkwICkKLU0nPFQ5UVExSiNcMD9WQTZYJkAkOjFBKlsmOjQmWFEqXCNQSCgyMEw9JDlQNT4hSyQiSEg/Q1AqLiVJVDoKLU1eQStPJlIsQkIxUy8pRlhETUEzLyE4VEIxMjMvKSNYIi9AMjcgTSBCNiA9NCk5IDohUDkpIz8gKykxI1MKLU0hXlw6KCAxRyRSUDJWUi5FJj4oOihRMFcgQjAtVjFWQCQ+PCc4IC0hJ0ksKz1CLEUgVzQwPDBALSQyMD0KLU0/MU01I0EgRT5SKF4oXyw0RSBOUyIqODNKIU5SI05YMzFBNDkoPzQkIyBPNiM6MChEUjUzKCNYIToyMTsKLU0lU0AlWEA8LyFUVCYpMUdUIyk8MkgiJDooNzwuKSFQXyMlLChfICAhJCUgREpQMSgiWzQ9SiIyWyIgND8KLU1EME03J1hYMTUxVzUhM1AyUUBJPic9XEIiQiEgISpAJ1YgXDglRjAvM1FHQSgoMDpLMVFQJTY0ICVBLCQKLU0lNTAlWzA2VCUoXC8/QStSJitcJj9QUjMkXDBFUyBDQSlHPChXMC1LIUIoMS1QLUMmRlQqKFE8QyZUKDgKLU0oIFVBKDssIT4wNzYlWzw6PUBTUSI5KDkxQSchIzhcLUYwKUMgIEBARCBbNyhRJEFBIitZJElQOz8iOjQKLU0jWCBCQUFAPSc1TEA5ISsiI1xEJEkgLFUiMUQrVCEgKSQqQD1fIFEvIUk8M1ciOkwmSzxAUEFYKikrLEEKLU0jQFxZIjxENUgwJCwlPUwpKlFbMCEwOCxOMjQ7JkU8PlVBOTYoSlA8NVFUMSg5KDoxICNfJkUsQzBBPlYKLU0hL1wlXEBYPCMrUEJDUCorJSJYMy0gXiojPCw0P0BXTiUrXEA5QCBUJ1ogNyFAOEYnQiggKlBCKCI9TEUKLU1MQDhHIyZMJjxQVk0jSzhAJlBGMyMrOCsnIig1JV5cM1pQRUgiLkwwRSI6PyVcJEVdUTczKT9IOkRAMUIKLU0nIkBEKUBSOCkiLEZUIThPKTtMLSYgL0AoXiQ+QDA3PiUwNDlOQS42IVNUI0ghMEIgODg2PiIpKyIjMCoKLU09MCUqJCUoNz1QMCgoKjwnPzBSUChIIDEzIjJZJFUoNj9BLy0gOEAoTVAlOikvIChQMENYJFlcQUZQLi4KLU0hRkRCWiBGKykjQCMgQERWIT8kM1JQSEogLTA2M1AjUCYmWEAnUSAsJDdARiRQQyYoX1gwREBUIic7VEUKLU09MT03IFRUPFVSKCskQ1g4TTBfQikuQEZeIFlFJEM8IyxRQU8oVkA0XDAqPSEjIEU0UiZSIlAkNV9SIFAKLU0jJCQuLiElKSFCMCg1MEc6IihcPD9AVkglJzwlIlBOMSJGVEIhIjdaIzA8LS8gIS0iLVRAWCFfMiUuMCkKLU0yIi5IJCJcIigwJyMiXDA2TCBWPihOUDYzMC1RJ0xAIktRVF8lWywuQiBWWiVJOC8zUideJ0NALTkxICIKLU0iR1g8WEEnViA7XDtLIVo1JEEkIFtROlMgU1gjIlItQSU6QEEzISchIl5IRDQxWz0oQSxDJFBWUSYgUCUKLU1KMDozIz1EIU0wOSQgSSQmLkImMSVITDckMF1IIUdMN0EgNEAgQyAzP0EtVSdXWDhBUVo2KDFUJkZBLCYKLU0gICQjVCA2IylLXEFDMV9WJTVYME0wJFYnLVArIlFGQSRFJC4nUSg8KS8kMyJAR0slVUwuOTFbLyIoPC0KLU1FUjtHIzw8LjAiLE0mOUgjJTBOSyRHSEZZIVk5JSwgLTZQM1EiWSw/LFEoUSBaUDQ0UU0qJD5cP11QLUIKLU0iMEgzLSBHQiJCICdWQUZcJiA4KUgwSFInPyBBXEA0LiQ9UD5YQEleICRMPUpQSV0oQ0hAPUFVPiNSOC0KLU0tQV1DKVA4JT1QNVknMVQgIjBRICdAUCMvUFleIVM8NUpQU10kJiQnVEInUiAuLCUmIFROKDhYMFwhJTwKLU0nSlA4XEIyISY7RDo+QF83JUwkIlkyJCElPTQnSjAtPiErPDJeIVNYJDUoP1YwRUElNEglTSE1KyM6RDEKLU0jMjtTKDkoJiZAMjwnR1w3OCAiLSgmTDchUSNcJC84RTohRjQkX1gzREFeJCBBTEM9QVY7IT48Kl4hRC0KLU0jVVgvUDA4UCQhKD5SUV9LI1U4PEEgJTMkXzxDJ0InPCAjXCNAIFYoIFNQL0pSMTogMkgtWEEiMiBCRCMKLU1QUFhIIDs0OzhBQzAgOEQhRUFZVyQwNDZEITpPJiFEKzYgWyMgNiRBMyE+WyJKRDMlUVZSIE04OkQxMUwKLU0jXjw0XkFMPCglODhIUS9cJzhEP0AgOyQjPkAqSEFRVig4UEYxMSE/KFkwQ1NBOlIhKkgpTiFANyhMRDwKLU09IUldKSgkOk0xJzskWCwjIFAqLiI6SDU0MTVPJyUoOEwhWzIoNTgxUFFJIiIlPDM6ITcsIDooISAgSDAKLU0mNlghMSEjLyBMWDpdUU07KF9IMk5CKSciWjggWEApRScnJCBQUVtVITs8MUNRNEApOlA7MCI1SyhQXCQKLU1GUU43JzhIKSQhSE0oT1wzWkFJWyEySDNCUS5LIjtURjNQVlohLFAnMFAyVSkyUCkkUFEhIFk8KUtRNzMKLU0pKSAqOyEiLCdYKCU9IUpCKDMkKiZRUl4oKlAjO1I6LSIuQCNYQTdAIDVYOCVAPCQhWkwzSzAnLyVTID8KLU1PMEtMIzVAOk8gVU8gRlAqTVFQUCI2VDg4QUJZIzxcK1oiN1QjUDwpRlI7OylFXDZZQCpMJFtMJjgxUSUKLU0jXygkNDBdKSddLDIlIERGJFxQQE8xOigoMzBFLCBQKiFZRCNLMDM+IVpAK1NBMjwmOTAwRiFbNSdGICQKLU1WUjQiIl88QSZARlwhR1g/VCI4SCVPOC1eIDVRJ1MsJDxAMUAjQSgvWlFSOiBUXCUrUC8jIEI4OjlBWFQKLU0nWywwUyFRSSJfREJbQVgxJiIsMj8yKyYhVyxENjAsJCMlPDJfQjFBJ1JAICAxWUAlQUglXkIgXSEtRDoKLU1cUVkpIElQQCxASjUlLDg5I0EuVyZKOC0vQSohJTA0L1EiNiwnMFAvSEE4LyFQPCFLUUZRI01YQFsxI1sKLU0nQlAoMyBeWChBOCozMVheJC0oRj0gVkMpPCgoSTFBJyhJRCg3UDNBJyAkN08yLF0kQTA0RCEvPyUiTCkKLU0iIVlHJ1RQKl1ANDQmVDAnKFI6KSElPDchMichJSwwPyxQN0klOCwrTlIvTCcuICk0UEZeJTc8Mz1RKkYKLU0jLUQ6M1ImWSYhUD5BMCArJ1AgLjAhT10oO1gwSVAvSiVLWEJHQEBOISBcQCNQSyUiKzhFUiA7NyYmVCEKLU0hQiVUKDI0QVxQW0InVUA4QEFaISMhRCwrUVszIC5IQTtCLV4gUTAtTTE3VSZVPEIsUSggIEswLyUxJkUKLU0gTlQsIyA6QSg0KDZCQjBHICU4RiEgPE8lXzQ2MzBPXyFTLDUwIUYgJSRIRjIwIDAkQEg0JyAuRyUkVDcKLU0+MC1MKCdMOiQgKlsoQjApMyBNIiI4IDoiQD1NIT8wQ1pBRVUmMVAySTBSNiIjPCAzMFlQJypEREIhTC4KLU0mOzgzRVFPWSdfTCFUMTghIE9IOUJAVDkoRkA7IlFeOSE4MCdaMi1dKFFQQ0hBOy4lNFAmVEFAPSZaVDMKLU1GQU9EKDsoOCkwPV8gXigjNTBTSCM+IDw5MDE8KFRIJUFRPlUnT1wyUFEoMyg0OC1KUUlBJlBEMUBRI1oKLU0lJihBJkBOQSdPIDItIUlRIjRMKl5RM08pN0BGSyFJIilJTEJVUVZAIEpULTBSMCkiWFghOFBGKShNMD0KLU1RUjFOJ1IwQEtBXlslNShANSBTXiAjQCFeQDBAIVNYIl1AWE4jMTA4KSFANiAqND5WUVJMJS4wREUxLl8KLU0iX0gtP0E/IClHQEVOQVo3JlwwQDsyK1sgQUQmLUEwViJcQDdRIjsqIDRMMVIhICElLzBCJFFGJiU5NDEKLU08ITpYKTQ4KjUxUT8nT1glQUFGOiVVODhEQVVYKE0oLEwyKiglLTA4PVFBIiRBTEVQQFowJDlQPD5ROzcKLU0mMihELDFbJiYsTCE5MFY6IVRQQ19APFklU0wyL1E5KCRWVEREMidbJCEsOSZQWlAoQUAmS0FNISFRSCYKLU0sMFNUJVggIkYiI1cgSEBAP0ElJyU2PC8jMjs9JVc4MiciNz0lTiQ5O0A2QCE+WEBOIDMvJUU0JE9QLjwKLU0pJDglXSE6JSNGMCFZMCw5IjMoPTIwP18gU0AnSTE4VCkrKEQiQis0Jj5IKjFBMiolK1AgWCI6USIqPDMKLU1GMCkzJExIPE0hLDcpNCg2X1FMJSk4QCAvMDUsIUE4IlVARzomR0Q7KFBSKSMwLEFMUVwwKD88L1hQLlQKLU0mMygyOlFXLydRPD5aIS9CKFM8PVlRSl0nM0grKTBaUiVPUCBLMUUvJ0UwJlEgICIgICAgICAgISAgLCAKLU0hQCAqICBcICVAID4gIjwgLDAgXCAkRCA1UCFGICc4IEFQIjogKlggUFAjOSAvICEiMCRDIDNYITZAJVcKLU0gOTghTUAnNyA/RCInICkhIEY8IkNAKlYgTVwjIkAsViBWLCNEMC8gIF8kJChQMTYhKEgkT1AzViEyWCUKLU05UDZBIT1UJiZAOTghSTwmVVA8OSFVUCdIID9FIiJMKDxQQlwiMDgpNDBGPSI+TCouQEoqIk1MKyswTiEKLU0gICAgICAgICAgIFooICE1O0ZNTjtXPU4oJjVSPEZdUiAgSCAgICAgICAgICBKL1QgICpDXyAgIkkgOCAKLU0gSjBAICAqRCwgICJJJEAgIEoxMiAgKkQ7ICAiSSdYICBKMjAgICpESCAgIkkqUCAgSjJeICAqRFQgICIKLU1JLiggIEozTiAgKkUhICAiSTEgICBKNDwgICpFK0AgIkkzVCAgSjUtICAqRTcgICJJNlQgIEo2ISAgKkUKLU1FMCAiSTswICBKNyMgICpFVEAgIkk+SCAgSjdXICAqRiMwICJJQVAgIEo4SCAgKkYuUCAiSURQICBKOUIKLU0gICpGPyAgIklJSCAgSjpZICAqRlVAICJJTjwgIEo8JiAgKkcpUCAiSVNYICBKPTggICpHPkAgIklZQCAKLU0gSj8oICAqR1dQICJJX1ggIEpALiAgKkgpMCAiSiREICBKQUogICpIQFAgIkopVCAgSkJZICAqSFQwICIKLU1KLyggIEpENCAgKkkqMCAiSjNQICBKRT4gICpJPDAgIko3WCAgSkYyICAqSUlAICJKO0QgIEpHKCAgKkkKLU1XICAiSj8oICBKSDQgICpKKiAgIkpDOCAgSkkuICAqSjowICJKR1AgIEpKLyAgKkpMUCAiSkxUICBKS0sKLU0gICpKXyAgIkpRKCAgSkxDICAqSyxAICJKVFggIEpNPSAgKks8ICAiSldQICBKTjMgICAgNlQ1UjxGXVIKLU0oIyAgM0ZdVCgmXVc7RjVSICRZTygnLVU4VkBAOUZFTDkyIU88QiFEOjcpRThXMU88R0QgM0ZcQDxXNUMKLU06IiFQPEZdQzk3LVMgJEVOPSY1UjxHNVA9JjVEKCctWTxXMUU7MiFDODZRTCAkRE8zUiFFPEcpTzxAIS4KLU07UiFTPTYtSCgmMUU9RkVDOTIhTzxCIUE5JjFSOTctUyAkJVI5UiFMOjctVCgnMU87UiFMO1ZZRyAkNVgKLU05NixAOUZdUjs2JVQoJjVSPEZdUiAkKUE5IiFGOjZRRSgmWVU7NilFPEAhLjtSIUM6JkVMOScpRTtAIS4KLU07UiFNO1cpRSgnIVI7Vi1FPFctRTxQIS47VzBAOTZZTz02PUgoJlVFOzZdUj4wITA5NylNOjctUzo2XU4KLU0oJjFFO0ZFRTkgISI4NjBAODYxRDxGNVM8UCEiOyZdQzpSIUQ5NzlJOFY0QDxGNVE9NkVSOTYwIDEmNVYKLU06Ni1FKCYpVTxXRCAxRkVMOTIhRT4mRVM9JywgMFcpTzxXLE05JjVWOjYtRSgmUUk7RkwgM0ZcQDxXNUMKLU06IiFEOTc5SThWNCAzRl1UKCYkQDkmRVI5Ni1UO1cpWSAkRVMoJiRAOSZFUjk2LVQ7VylZICRFTj1GJUwKLU06NjBAODcpRz02VUU7RzAgMUZFTDkyIVQ4NilMOTIhTz1GNVI5RlFPPVAhNDtWXEA7NiVOPjIhTzwmNU4KLU0oJjlJOyY1UyAkRU44NyFQPEZdUDxGRUE9JjRAOjZdQz0mUEA5Rl1SKCYxRT1GRUM5MCE0OTdBVCgmOUkKLU07JjRAOEc1Uz4wISY6NlFFKCcxTztSIUw4NylHOTAhLjtSIVM8JiVDOTIhTDk2OVQoJl1OKCYxRT1GRUMKLU05MCEpOyZRRTlWJUwoJy1FOTZMIDRGNUE5IlVPO0ZRWSgmOUk7JjRAPFdFUz0mNU0gJTFPO1IhTTg2WVkKLU0oJlFJO0ZNUyAkKVI7Vk1FO0IhUDo3IUUgJCVSOVc1TTk2WVQoJzFPO1IhTDg3KUc5MCEyOTctVTsnMEAKLU09Jl1PKCZRQTxGPUUgJF1QOTcpQT0mRU87QiFXO1c1TDkiIUI7Jl1DOlAhLzwmNVI4NzFJO1ZYQDtGXVcKLU0oJkVOKCchUjtWPVI5Ny1TICRdUDk3KUE9JkVPO0IhQTsnKUU4NjFZKCZFTignIVI7Vj1SOTctUyAlLU8KLU04Vk1FPSIhTzwmNVI4NzFJO1ZYQDtWWEA7Rl1OKzctTzhWTUU9ICEkOTctVDo2WUE9JkVPO0IhQTkmMVIKLU05Ny1TKCcpRTw3NUk8RjVEICRVRTxXLUE5VjRAPSZdTygmUU87RjwgNCcpTz0mXUM7VlBAPVcpTztGPEAKLU09J0VQOTIhRjtXKEA8Vl1DOlY1VCAkXVA9JkVPO0IhTjtXMEA8VzVQPCZdUj0mNUQoJilZKCchUjtXMU8KLU04Vl1MICUhUjtXMU84Vl1MKCZZTz0iIVM9NyFQO1cpVDk2MCA0Vl1DOlY1VCgnMVk8JjRAO0ZdVCgnLVUKLU08JyFPPEcxRTkgIS88JjVSODcxSTtWWEA7Rl1UKCctVTwnIU88RzFFOSIhTztCIVM7Vi1LOTcwIDQnKU8KLU09Jl1DO1ZQQDlGJU06NlFZKCZZTz0iIVM9NyFQO1cpVDk2MCAwNjFEPEY1UzxSIUY4NlVJOydEQDtGXVQKLU0oJy1VPCchTzxHMUU5IiFCPjIhUDxGXVQ7Vi1POyIhRjg2VUk7J0QgMDYxRDxGNVM8UiFBOycpRTg2MVkKLU0oJkVOKCc1UzkwISM4NlhHPSIhQTxXLUk5VlhAPEY1UT02NVM9JjVEKCYlRDknKUU8VywgM0Y1VD1WXVIKLU06UiFJPFIhRDtXPU4gJFlFPSc9TzxGTEA6NyxAPTZZUjk2JUM6JiVCOyY0IDNGNVQ9Vl1SOlIhRDxGXVAKLU08JjVEKCYtTztGWUU4VzFJO1ZYQDtWWEA8RjVTOTcwIDRWXUY9Jz1BPEY0QDhWJVU8VjVEKCYtTztGWUUKLU04VzFJO1ZYQDg2KU88RzAgMFZdTjtGNUM9JkVPO0IhUjk3LUU9IiFCPjIhUDk2NVIgJFlPKCYpVTlGOUUKLU08QiFTPCYlQzkyIUE9RiVJOyYlQjsmNCA0Vl1DOlY1VCgmRVMoJiVMPEY1QTknREA4Vl1OO0Y1Qz0mNUQKLU0gJS1POFZNRT0iIUk8UiFOO1cwQDhWXU47RjVDPSY1RCAkLUE7Qj1UKCctRTtGMEA4NjlUOTcoQDxWXUMKLU06VjVUKCctSD03MUQ7Vz1OICUxTztSIU04NllZKCcpRTlGNVI5NllDOTcsWigmLUE7Qj1UKCctUDsmRUMKLU05MCEjO1ZZTjk2LVQ6Nl1OKCcxSTs2NUQoJl1VPSAhIztWWU45Ni1UOjZdTignKUU5RzVTOTYwIDUmXU8KLU0oJlVBO0dEQDsmNVY5NlFTKCZdRignLVk7NilPOyZFQygmUUk7Rk1TICQ5STsmNEA7RiVNOTIhVDtWXEAKLU07Jl1OOVAhKDtXLVQoJkVTKCYxTz1WWCAyJl1TPSIhSTxSIVU7RylFODYtSDg2KUw5MCEkOjcpRThXMU8KLU08R0RAO0ZdVCgmNU08JzFZICUxTztSIU04NllZKCchUjtWLUU8Vy1FPFAhNDtWXEA7NiVOPjIhVTxWNVIKLU08UCEkOjctQygnJVU7VzFBKCY1WDhWNUU5JjVEICUtVDg2UUUoJFkmNFIhRjo2UUUoJkFBO0YxTDkwITQKLU07VlxAOzYlTj4yIUw5NzlFOycsQDtWOEA8RjVNO1cxRSgmRU4oJyFBPSZAIDNGXVQoJiRAPFcxUjk2JU0KLU0oJjFFPUZFQzkwITQ6NlVFPEIhRT4nIUk8RjVEICRdVT0iIU85QiFTPScpRTg2VEA8RjVTO1c1UjhWNVMKLU0gJFlPKCZVRTxXLUE5VjRAO1Y4QDkmNVM6NylFOSIhVD43IUUgJFlPPSIhQSgmMUE9JiRAOzY1UzxWJUcKLU05MCEpOSY1Tj0mRUY6NjVSKCcpRTs2XVY5NjAgMSY1QTkmUU84VkxAPFZFVD02JVQ6Nl1OKCYxRT0mNUMKLU09JjVEK1YlVjtWRUQ5NjAgM0ZcQDxGNUM7VylEKCZRTzhWTVMoJiVWODZFTDg2KUw5MCEtODYtSDo2WUUKLU0oJkVTKCZZTz0iIU87QiFUOiY0QDtGNVQ9Vl1SOlAhLzhGSUU4VzBAOjcsQDxGNU07VzFFICRRSTtGTEAKLU06JiVTKCYpRTk2WEA8VjVWOTcpRTkgISE5JzlFPEcxSTxWNEA5NylSO1coQCAlLVI7Nl1VO0cwQDk3KVIKLU07VyhAICQtTzs2VVU7RkVDODcxSTtWWEA5NylSO1coQDtWWEA8VjVOOSAhMDxGXVQ7Vi1POyIhRTxHKU8KLU08QCEtPTZRVDo2QU88IiFBPScxRTs3IVQ5NjAgMTQxLzUkMS81IiRBKDIkIDRGNU07VzFFKCYlRDknKUUKLU08VyxAOFZBQTtGPUU5ICEmPTZZQz0mRU87QiFOO1cwQDo2VVA7JjVNOTZZVDk2MCAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCEgICAgICAgKCIgICAgIDAhICAgICAgIChJQCAKLU0gICA9ISAgICAgICAoSiAgICAgRSEgICAgICAgKEogICAgIFQ5ICAgICAgIChKICAgICE3OSAgICAgICAKLU0oSiAgICAhP0AgICAgICAgICAgICAgIiFAICAgICAgICAgICAgICIzQCAgICAgICAgICAgICAiWkAgICAKLU0gICAgICAgICAgIzNAICAgICAgICAgICAgICNRQCAgICAgICAgICAgICAkL0AgICAgICAgICAgICAgJEkKLU1AICAgICAgICAgICAgICUrQCAgICAgICAgICAgICAlTkAgICAgICAgICAgICAgJitAICAgICAgICAgICAKLU0gICZHQCAgICAgICAgICAgICAmWUAgICAgICAgICAgICAgJyxAICAgICAgICAgICAgICdEQCAgICAgICAKLU0gICAgICAnUEAgICAgICAgICAgICAgKE1AICAgICAgICAgICAgICk6QCAgICAgICAgICAgICAqLkAgICAKLU0gICAgICAgICAgKyhAICAgICAgICAgICAgICtTQCAgICAgICAgICAgICAgIDEgICA+MCAgKEogICAgICAKLU0xICAgPjAgIChKMCAgICAgMSAgID4wICAoSkggICAsRCkgICAgICAgKEogICAgICAxICAgPkAgIChKWCAKLU0gICAgMSAgID5AICAoSyggICAgIDEgICA+QCAgKEtAICAgLFMpICAgICAgIChKWCAgICAgMSAgID5QICAKLU0oS1AgICAgIDEgICA+UCAgKEwgICAgICAxICAgPlAgIChMOCAgIC0qKSAgICAgICAoS1AgICAgIDEgICAKLU0/MCAgKExIICAgICAxICAgPzAgIChMWCAgICAgMSAgID8wICAoTTAgICAtQykgICAgICAgKExIICAgICAKLU0xICAgP0AgIChNQCAgICAgMSAgID9AICAoTVAgICAgIDEgICA/QCAgKE4oICAgLVMpICAgICAgIChNQCAKLU0gICAgMSAgID9QICAoTjggICAgIDEgICA/UCAgKE5IICAgICAxICAgP1AgIChPICAgIC4qKSAgICAgICAKLU0oTjggICAgIDEgICBAMCAgKE8wICAgICAxICAgQDAgIChPQCAgICAgMSAgIEAwICAoT1ggICAuQykgICAKLU0gICAgKE8wICAgICAxICAgQEAgIChQKCAgICAgMSAgIEBAICAoUDggICAgIDEgICBAQCAgKFBQICAgLlEKLU0pICAgICAgIChQKCAgICAgMSAgIEBQICAoUSAgICAgIDEgICBAUCAgKFEwICAgICAxICAgQFAgIChRSCAKLU0gIC8mKSAgICAgICAoUSAgICAgIDEgICBBMCAgKFFYICAgICAxICAgQTAgIChSKCAgICAgMSAgIEEwICAKLU0oUkAgICAvPSkgICAgICAgKFFYICAgICAxICAgQUAgIChSUCAgICAgMSAgIEFAICAoUyAgICAgIDEgICAKLU1BQCAgKFM4ICAgL0wpICAgICAgIChSUCAgICAgMSAgIEFQICAoU0ggICAgIDEgICBBUCAgKFNYICAgICAKLU0xICAgQVAgIChUMCAgIDAiKSAgICAgICAoU0ggICAgIDEgICBCMCAgKFRAICAgICAxICAgQjAgIChUUCAKLU0gICAgMSAgIEIwICAoVSggICAwOikgICAgICAgKFRAICAgICAxICAgQkAgIChVOCAgICAgMSAgIEJAICAKLU0oVUggICAgIDEgICBCQCAgKFYoICAgMEspICAgICAgIChVOCAgIDBdQCAgICAgICAgICAgICAxV0AgICAKLU0gICAgICAgICAgMktAICAgICAgICAgICAgIDM7QCAgICAgICAgICAgICAzTUAgICAgICAgICAgICAgNDQKLU1AICAgICAgICAgICAgIDRQQCAgICAgICAgICAgICA1LkAgICAgICAgICAgICAgNUpAICAgICAgICAgICAKLU0gIDVXQCAgICAgICAgICAgICAgIDEgICBMQCAgKFY4ICAgICAxICAgTTAgIChXICAgICAgMSAgIE1AICAKLU0oVzggICAgIDEgICBNUCAgKFdYICAgICAxICAgTjAgIChYOCAgICAgMSAgIE5AICAoWFggICAgIDEgICAKLU1OUCAgKFk4ICAgICAxICAgTzAgIChZWCAgICAgMSAgIE9AICAoWjggICAgIDEgICBPUCAgKFpYICAgICAKLU0xICAgUDAgIChbOCAgICAgMSAgIFBAICAoW1ggICAgIDEgICBQUCAgKFw4ICAgICAxICAgUTAgIChcWCAKLU0gICAgMSAgIFFAICAoXUAgICAgIDEgICBSMCAgKF5AICAgICAxICAgUkAgIChfKCAgICAgMSAgIFJQICAKLU0oX1AgICAgIDEgICBTMCAgKSA4ICAgICAxICAgU0AgICkhICAgICAgMSAgIFNQICApIUggICAgIDEgICAKLU1UMCAgKSIwICAgICAxICAgVEAgICkiWCAgICAgMSAgIFRQICApI0AgICAgIDEgICBVMCAgKSQoICAgICAKLU0xICAgVUAgICkkUCAgICAgMSAgIFVQICApJTggICAgIDEgICBWMCAgKSYgICAgICAxICAgVkAgICkmSCAKLU0gICAgMSAgIFcgICApJ1ggICAgIDEgICBXMCAgKShAICAgICAxICAgV0AgICkpKCAgICAgMSAgIFggICAKLU0pKVAgICAgIDEgICBYMCAgKSo4ICAgICAxICAgWEAgICkrICAgICAgMSAgIFkgICApK0ggICAgIDEgICAKLU1ZMCAgKSwwICAgICAxICAgWUAgICksWCAgICAgMSAgIFogICApLUAgICAgIDEgICBaMCAgKS4oICAgICAKLU0xICAgWkAgICkuUCAgICAgMSAgIFsgICApLzggICAgIDEgICBbMCAgKTAgICAgICAxICAgW1AgICkwSCAKLU0gICAgMSAgIFwgICApMSggICAgIDEgICBcMCAgKTFAICAgICAxICAgXEAgICkyICAgICAgMSAgIF0gICAKLU0pMjggICAgIDEgICBdQCAgKTMgICAgICAxICAgXVAgICkzSCAgICAgMSAgIF1QICApM0ggICA2RCkgICAKLU0gICAgKFY4ICAgNkwoICAgICAgICAgICAgIDZWKCAgICAgICAgICAgICA3KCggICAgICAgICAgICAgNzwKLU0oICAgICAgICAgICAgIDdHKCAgICAgICAgICAgICA3WSggICAgICAgICAgICAgOC0oICAgICAgICAgICAKLU0gIDg2KCAgICAgICAgICAgICA4RiggICAgICAgICAgICAgOFgoICAgICAgICAgICAgIDkiKCAgICAgICAKLU0gICAgICA5MyggICAgICAgICAgICAgOUYoICAgICAgICAgICAgIDlSKCAgICAgICAgICAgICA5XyggICAKLU0gICAgICAgICAgOjooICAgICAgICAgICAgIDpdKCAgICAgICAgICAgICA7QiggICAgICAgICAgICAgO14KLU0oICAgICAgICAgICAgIDw3KCAgICAgICAgICAgICA8XCggICAgICAgICAgICAgPTYoICAgICAgICAgICAKLU0gID1NKCAgICAgICAgICAgICA+MCggICAgICAgICAgICAgPksoICAgICAgICAgICAgID8jKCAgICAgICAKLU0gICAgICA/RyggICAgICAgICAgICAgQCQoICAgICAgICAgICAgIEBCKCAgICAgICAgICAgICBAWCggICAKLU0gICAgICAgICAgQTYoICAgICAgICAgICAgIEFWKCAgICAgICAgICAgICBCLSggICAgICAgICAgICAgQkgKLU0oICAgICAgICAgICAgIEMoKCAgICAgICAgICAgICBDPSggICAgICAgICAgICAgQ1YoICAgICAgICAgICAKLU0gIEQ0KCAgICAgICAgICAgICBESiggICAgICAgICAgICAgRSQoICAgICAgICAgICAgIEVDKCAgICAgICAKLU0gICAgICBFWyggICAgICAgICAgICAgRjQoICAgICAgICAgICAgIEZCKCAgICAgICAgICAgICBHQCggICAKLU0gICAgICAgICAgSC0oICAgICAgICAgICAgIEkhKCAgICAgICAgICAgICBJLSggICAgICAgICAgICAgSigKLU0oICAgICAgICAgICAgIEpTKCAgICAgICAgICAgICBLRCggICAgICAgICAgICAgS08oICAgICAgICAgICAKLU0gIEtaKCAgICAgICAgICAgICBMPiggICAgICAgICAgICAgTE0oICAgICAgICAgICAgIE0rKCAgICAgICAKLU0gICAgICBNOSEgICAgICAgKTQgICAgTUIhICAgICAgICk0ICAgIE1ROSAgICAgICApNCAgICBOOjkgICAKLU0gICAgKTQgICAgTlNAICAgICAgICAgICAgIE81QCAgICAgICAgICAgICBPR0AgICAgICAgICAgICAgUC4KLU1AICAgICAgICAgICAgIFBHQCAgICAgICAgICAgICBRJUAgICAgICAgICAgICAgUUNAICAgICAgICAgICAKLU0gIFFdQCAgICAgICAgICAgICBSP0AgICAgICAgICAgICAgUyJAICAgICAgICAgICAgIFM/QCAgICAgICAKLU0gICAgICBTW0AgICAgICAgICAgICAgVC1AICAgICAgICAgICAgIFRAQCAgICAgICAgICAgICBUWEAgICAKLU0gICAgICAgICAgVSRAICAgICAgICAgICAgIFYiQCAgICAgICAgICAgICBXJkAgICAgICAgICAgICAgWDQKLU1AICAgICAgICAgICAgIFkrQCAgICAgICAgICAgICBZOEAgICAgICAgICAgICAgWUJAICAgICAgICAgICAKLU0gIFlNQCAgICAgICAgICAgICBaNkAgICAgICAgICAgICAgWlxAICAgICAgICAgICAgIFsxKSAgICAgICAKLU0pNCAgICBbRyggICAgICAgICAgICAgW14pICAgICAgICk4ICAgIFw0IUAgICAgICIgI1AgICBcQykgICAKLU0gICAgKTpYICAgXE4hICAgICAgICk8QCAgIFxWISAgICAgICApPEAgICBdJTkgICAgICAgKTxAICAgXU4KLU05ICAgICAgICk8QCAgIF4nQCAgICAgICAgICAgICBeSUAgICAgICAgICAgICAgXltAICAgICAgICAgICAKLU0gIF9CQCAgICAgICAgICAgICBfW0AgICAgICAgICAgICAhIDlAICAgICAgICAgICAgISBXQCAgICAgICAKLU0gICAgICEhMUAgICAgICAgICAgICAhIVNAICAgICAgICAgICAgISI2QCAgICAgICAgICAgICEiU0AgICAKLU0gICAgICAgICAhIy9AICAgICAgICAgICAgISNBQCAgICAgICAgICAgICEjVEAgICAgICAgICAgICAhJCwKLU1AICAgICAgICAgICAgISQ4QCAgICAgICAgICAgICElNkAgICAgICAgICAgICAhJjpAICAgICAgICAgICAKLU0gISdIQCAgICAgICAgICAgICEoP0AgICAgICAgICAgICAhKExAICAgICAgICAgICAgIShWQCAgICAgICAKLU0gICAgICEpIUAgICAgICAgICAgICAhKUpAICAgICAgICAgICAgISowQCAgICAgICAgICAgICEqRSggICAKLU0gICAgICAgICAhKlkoICAgICAgICAgICAgISs2KCAgICAgICAgICAgICErSCEgICAgICAgKTxAICAhK0wKLU05ICAgICAgICk8QCAgICAgMSAjX19QICApPEAgICErUyEgICAgICAgKTxAICAhK10hICAgICAgIClEICAKLU0gISwkISAgICAgICApSEAgICEsLiEgICAgICAgKUxAICAhLDYhICAgICAgIClMQCAgISw6ISAgICAgICAKLU0pTUAgICEsQiEgICAgICAgKU4gICAhLEshICAgICAgIClPICAgISxTISAgICAgICApTyAgICEsXCEgICAKLU0gICAgKlZAICAhLSshICAgICAgICpcQCAgIS0zISAgICAgICAqXSAgICEtQCEgICAgICAgKl0gICAhLUoKLU0hICAgICAgICs0QCAgIS1TISAgICAgICAtNyAgICEtXCEgICAgICAgLTpAICAhLiYhICAgICAgIC1aICAKLU0gIS4sISAgICAgICAtWiAgICEuNSEgICAgICAgLicgICAhLj0hICAgICAgIC4nICAgIS5BISAgICAgICAKLU0uKCAgICEuSSEgICAgICAgLiggICAhLk0hICAgICAgIC4pICAgIS5dISAgICAgICAuKSAgICEvISEgICAKLU0gICAgLiogICAhLy8hICAgICAgIC4qICAgIS8zISAgICAgICAuKyAgICEvOyEgICAgICAgLisgICAhLz8KLU0hICAgICAgIC4sICAgIS9KISAgICAgICAuLCAgICEvTiEgICAgICAgLi0gICAhL1shICAgICAgIC4tICAKLU0gIS9fISAgICAgICAuLiAgICEwJiEgICAgICAgLjFAICAhMDEhICAgICAgIC42ICAgITA7ISAgICAgICAKLU0uNyAgICEwRSEgICAgICAgLkFAICAhMFAhICAgICAgIC5DICAgITBYISAgICAgICAuRyAgICExIiEgICAKLU0gICAgLzBAICAhMSohICAgICAgIC85ICAgITEzISAgICAgICAvPiAgICExPCEgICAgICAgM19AICAhMUkKLU0hICAgICAgIDNfQCAgITFRISAgICAgICA0I0AgICExWiEgICAgICAgNCkgICAhMiMhICAgICAgIDQrICAKLU0gITIqISAgICAgICA0NUAgICEyMyEgICAgICAgNEhAICAhMjwhICAgICAgIDRLQCAgITJIISAgICAgICAKLU04MEAgICEyUSEgICAgICAgODJAICAhMlohICAgICAgIDg1QCAgITMjISAgICAgICA4OSAgICEzLCEgICAKLU0gICAgOD9AICAhMzchICAgICAgIDhdQCAgITNCISAgICAgICA5QiAgICEzUSEgICAgICAgPFZAICAhNCAKLU0hICAgICAgID4pICAgITQqISAgICAgICA+P0AgICE0NSEgICAgICAgPkpAICAhNEQhICAgICAgIEArICAKLU0gITRTISAgICAgICBCJyAgICE0XyEgICAgICAgQkkgICAhNSYhICAgICAgIEJJICAgITUqISAgICAgICAKLU1CSiAgICE1MyEgICAgICAgQk8gICAhNT0hICAgICAgIEJTICAgITVEISAgICAgICBCUyAgICE1SCEgICAKLU0gICAgQlQgICAhNVEhICAgICAgIEJdICAgITVaISAgICAgICBCX0AgICE2IyEgICAgICAgQyEgICAhNisKLU0hICAgICAgIEMnICAgITY0ISAgICAgICBDLiAgICE2PSEgICAgICAgQzBAICAhNkchICAgICAgIEM0ICAKLU0gITZUISAgICAgICBDNCAgICE3IyEgICAgICAgQzQgICAhNywhICAgICAgIEM0ICAgITcwISAgICAgICAKLU1DNSAgICE3OSEgICAgICAgQz5AICAhN0AhICAgICAgIEM+QCAgITdEISAgICAgICBDP0AgICE3TiEgICAKLU0gICAgQ0ogICAhN1chICAgICAgIENKICAgITggISAgICAgICBDSiAgICE4JCEgICAgICAgQ0sgICAhOCgKLU05ICAgICAgIENLICAgICAgMSAjX19QICBDSyAgICE4LyEwICNIICAgKUQgICAhODUgUCAgICAgICAgICAKLU0gITg/ITAgJSNAICAoIiAgICE4RSEwICAgICAgKFY4ICAhOEshMCAjOEAgIChJQCAgIThXITAgJlhAICAKLU0pTUAgICE4XiFQICU8QCAiICAgICAhOSchMCAkMCAgICk8QCAgITkvITAgI0kgICAoSUAgICE5OyEwICAKLU0gICAgKEogICAhOUghMCAgICAgIChKWCAgITlcITAgICAgICAoS1AgICE6MiEwICAgICAgKExIICAhOkAKLU0hMCAgICAgIChNQCAgITpVITAgICAgICAoTjggICE7LCEwICAgICAgKE8wICAhOzghMCAgICAgIChQKCAKLU0gITtLITAgICAgICAoUSAgICE8ICEwICAgICAgKFFYICAhPC0hMCAgICAgIChSUCAgITxBITAgICAgICAKLU0oU0ggICE8VyEwICAgICAgKFRAICAhPSUhMCAgICAgIChVOCAgIT00ITAgICAgICApOlggICE9PCIwICAKLU0gICAiTCUgICAhPUQiMCAgICAgIkwlKCAgIT1TIjAgICAgICJMJTAgICE+JCIwICAgICAiTCU4ICAhPi0KLU0iMCAgICAgIkwlQCAgIT49IjAgICAgICJMJUggICE+TyIwICAgICAiTCVQICAhPlYiMCAgICAgIkwmICAKLU0gIT8kIjAgICAgICJMJjAgICE/NCIwICAgICAiTCZAICAhPzwiMCAgICAgIkwmUCAgIT9LIjAgICAgICIKLU1MJyAgICE/XCIwICAgICAiTCcwICAhQCUiMCAgICAgIkwnQCAgIUAvIjAgICAgICJMKCAgICFAPSIwICAKLU0gICAiTCgoICAhQFIiMCAgICAgIkwoMCAgIUEpIjAgICAgICJMKEAgICFBOCIwICAgICAiTChQICAhQU4KLU0iMCAgICAgIkwpICAgIUImIjAgICAgICJMKUAgICFCMyIwICAgICAiTCogICAhQkciMCAgICAgIkwqQCAKLU0gIUJdIjAgICAgICJMKyAgICFDKyIwICAgICAiTCtAICAhQ0AiMCAgICAgIkwsICAgIUNXIjAgICAgICIKLU1MLEAgICFEJiIwICAgICAiTC0gICAhRDYiMCAgICAgIkwuICAgIURGIjAgICAgICJMLjAgICFEXSIwICAKLU0gICAiTC5AICAhRTYiMCAgICAgIkwuUCAgIUVHIjAgICAgICJMLyAgICFFXyIwICAgICAiTC8wICAhRjkKLU0iMCAgICAgIkwvQCAgIUZIIjAgICAgICJML1AgICFGXiIwICAgICAiTDAgICAhRzYiMCAgICAgIkwwMCAKLU0gIUdGIjAgICAgICJMMEAgICFHXSIwICAgICAiTDBQICAhSDYiMCAgICAgIkwxICAgIUhHIjAgICAgICIKLU1MMTAgICFIWSIwICAgICAiTDFAICAhSSIiMCAgICAgIkwxUCAgIUkuIjAgICAgICJMMiAgICFJOSIwICAKLU0gICAiTDIwICAhSUIiMCAgICAgIkwyQCAgIUlKIjAgICAgICJMMyAgICFJUiIwICAgICAiTDwgICAhSVsKLU0iMCAgICAgIkw8QCAgIUolIjAgICAgICJMPSAgICFKMCIwICAgICAiTD8gICAhSjshMCAgICAgICk0ICAKLU0gIUpOIjAgICAgICJMQEAgICFKXSFQICAgICAiICNAICAhSy4hUCAgICAgIiAkICAgIUtAITAgICAgICAKLU0pOCAgICFLUyIwICAgICAiTEEgICAhTCIhMCAmPSAgIClIQCAgIUwrITAgICAgICApTFggICFMMiEwICYKLU1ZMCAgKTxAICAhTD4hMCAiPiAgICpcQCAgIUxEITAgJSZAICAqVkAgICFMUSEwICNFQCAgKU8gICAhTFsKLU0iMCAnQjAgIkxBQCAgIU0rITAgJkpQICArUEAgICFNMyEwICgnICAgKU4gICAhTTohUCAnRVAgIiAkMCAKLU0gIU1BITAgJFcwICAqPjggICFNSiEwICI5QCAgKV8gICAhTVMhMCAjPjAgICwhWCAgIU1ZIVAgJV5AICIKLU0gSTAgICFOISEwICYzICAgKVkwICAhTikhMCAkOSAgICpIKCAgIU4zITAgIC9AICAqNiggICFOPSEwICAKLU0gICAgLig4ICAhTkQhMCAlKVAgICpUICAgIU5OITAgICAgICAuJzggICFOVSEwICcsUCAgLTcgICAhTl0KLU0hMCAmIDAgIClQOCAgIU8lITAgJTowICAtUiAgICFPLSIwICMoICAiSlpQICAhTzMhUCAjPEAgIiAkUCAKLU0gIU8+ITAgJDUwICAqXkAgICFPSCFQICZAUCAiICVAICAhT1ohUCAlNTAgIiAmICAgIVAhIVAgJkowICIKLU0gJjAgICFQKiFQICNSUCAiICVQICAhUDshUCAjP0AgIiAlMCAgIVBMIVAgJjtQICIgJSAgICFQXyEwICcKLU1VUCAgLVogICAhUSchMCAjLiAgICpdICAgIVEzITAgJUkgICAuNyAgICFRPCEwICQqMCAgLkMgICAhUUQKLU0hMCAiTEAgIC5BQCAgIVFOIjAgI0ogICJMQVAgICFRXCFQICMrQCAiIElQICAhUiIhMCAmLVAgICw4SCAKLU0gIVIrITAgI1AwICAuLiAgICFSMSEwICAgICAgLio4ICAhUj4hMCAmXDAgIC8wQCAgIVJFIVAgI1BAICIKLU0gK0AgICFSTiFQICMzMCAiICcgICAhUlohUCAnLEAgIiArICAgIVMhIVAgIkhAICIgKzAgICFTKiEwICAKLU0gICAgLis4ICAhUzEhMCAkP0AgIC06QCAgIVM7ITAgICAgICAuKTggICFTSiEwICJIUCAgLUNQICAhU1gKLU0hMCAkNVAgIC1NKCAgIVQkITAgJTpQICAvOSAgICFULCIwICc/UCAiTEIgICAhVDYhMCAgICAgIC4tOCAKLU0gIVRCITAgJz4gICAuMUAgICFUTSEwICNIUCAgLjY4ICAhVFYhMCAgICAgIC4sOCAgIVUgIjAgICAgICIKLU1MVFAgICFVJSFQICAvMCAiITFQICAhVSwhMCAgKjAgIC5HICAgIVU0ITAgJFUwICAuS0AgICFVPyEwICIKLU0/QCAgLz4gICAhVUgiMCAjXkAgIkxKICAgIVVRIVAgKD5QICIhPTAgICFVWyEwICc+UCAgM19AICAhViIKLU0hMCAmXlAgIC88UCAgIVYpITAgIzwwICA0KyAgICFWLyEwICA1QCAgODVAICAhVjchUCAiUVAgIiE9UCAKLU0gIVZAITAgJlQgICA0SEAgICFWSCEwICcjICAgNCNAICAhVlAhMCAhJkAgIEI0OCAgIVZbITAgKEIgICAKLU04TFggICFXJSEwICAiQCAgODBAICAhVy0hMCAlNCAgIDdDOCAgIVc5ITAgI18gICAzLkggICFXRCEwICAKLU0pICAgNCkgICAhV0whMCAlUVAgID4pICAgIVdeITAgIUZAICBCQ1AgICFYKSEwICA6QCAgOTpYICAhWDMKLU0hMCAgRkAgIEInICAgIVg+ITAgKCIgICA4P0AgICFYSCEwICIlMCAgM0dYICAhWFEgUCAkNl4gICAgICAKLU0gIVhbITAgJlwgICA0PkAgICFZJCEwICYoQCAgNEMoICAhWS0hMCAlUTAgIDRGKCAgIVk2ITAgKCEwICAKLU00R0AgICFZPyIwICRTQCAiTEowICAhWUwhMCAlPiAgIDQ7QCAgIVlWITAgJk0wICA0PSAgICFZXyEwICUKLU1VMCAgNEAgICAhWighMCAnKEAgIDQ3ICAgIVoxITAgJiVAICA0REggICFaOiEwICZWQCAgNEFAICAhWkMKLU0hMCAlTVAgIDQ1QCAgIVpMITAgJVAgICA0OiAgICFaVSEwICZJQCAgNDhAICAhWl4hMCAgICAgIEJJOCAKLU0gIVskIVAgJ0JAICIiJDAgICFbKyEwICVQMCAgNVEgICAhWzwiMCAhWTAgIkxLICAgIVtHITAgIl8gICAKLU03RDAgICFbVCEwIChHICAgQl0gICAhW1wiMCAnT1AgIkxMICAgIVwmITAgJVFQICA0S0AgICFcMSEwICAKLU01MCAgODkgICAhXDkhMCAmPjAgIDgpKCAgIVxHITAgIDZQICA1VyggICFcWiEwICZZUCAgQlQgICAhXSIKLU0iMCAlXDAgIkxNICAgIV0sITAgICRAICA4MkAgICFdNCEwICAgICAgQlM4ICAhXTohMCAoMTAgIDZZOCAKLU0gIV1GITAgICgwICBCX0AgICFdTiFQICZaICAiIU4wICAhXV4hUCAjVSAgIiFQICAgIV4pITAgJjggICAKLU1DJyAgICFeMSFQICI3ICAiIiAoICAhXjohMCAgU1AgIEMwQCAgIV5DIjAgIEhAICJMU1AgICFeUSIwICcKLU09ICAiTFQgICAhXygiMCAgSDAgIkxUMCAgIV9AIjAgI0QgICJMVEAgICFfVyEwICRFQCAgPEU4ICAiICoKLU0hMCAjPUAgIDk/WCAgIiAwITAgJk4gICA4XUAgICIgNyEwIChCICAgOVMgICAiIFIhMCAlNzAgID8rOCAKLU0gIiEpITAgJ14gICA5QiAgICIhOCEwICRIICAgQDMoICAiIVAhMCAmNEAgIDouKCAgIiIsITAgI1RQICAKLU08VkAgICIiOyEwICAxQCAgQk8gICAiIkQhMCAhMyAgIEAtKCAgIiJVITAgJiAgICA/SEggICIjLSEwICcKLU0oICAgQC5YICAiI0UhMCAlUFAgID03QCAgIiNVITAgJDZQICA9LCAgICIkJCEwICVHICAgPE0wICAiJDoKLU0hMCAnTyAgIDpbSCAgIiRQITAgJkMgICA/XEggICIlLCEwICBYUCAgPVQwICAiJT8hMCAmV1AgID1KKCAKLU0gIiVRITAgJC4gICA9M0ggICImICEwICJHICAgPSpIICAiJjMhMCAnJTAgID4/QCAgIiY6ITAgIiogICAKLU0+LFggICImVSEwICBZICAgPjRAICAiJzAhMCAhQTAgID5EICAgIidGITAgITggICA+RlAgICInXCEwICAKLU0yICAgPkBQICAiKC4hMCAgNyAgID5KQCAgIig9ITAgIzAwICA/OUAgICIoUSEwICYqMCAgPyVIICAiKScKLU0hMCAoK1AgID9AMCAgIilCITAgIycgICA/MTggICIpViEwICYhICAgPl0wICAiKiwhMCAlKyAgID5VSCAKLU0gIipAITAgJUUgICA+TVggICIqTiEwICEuICAgPlo4ICAiKyEhMCAjIUAgID5WWCAgIis1ITAgJipAICAKLU0+UiAgICIrRSEwICRfICAgPk5YICAiK1MhMCAlTyAgID9VICAgIiwkITAgKCYgICBCSiAgICIsLCFQICcKLU1ZQCAiLCsgICAiLEshUCAjSiAgIkJBSCAgIi0sIVAgJzggICI9RDAgICItTCFQICg8QCAiLCkgICAiLiMKLU0hUCAlWCAgIkI2KCAgIi48IVAgKD8gICI9Q0AgICIuVCFQICFNQCAiIlU4ICAiLyUhUCAkUkAgIj1JUCAKLU0gIi84IVAgI0hAICI9QlggICIvSiFQICZTQCAiIlUwICAiL18hUCAnW0AgIj1JSCAgIjA2IVAgJS0gICIKLU09QlAgICIwTCEwICNYMCAgQCsgICAiMSQhMCAmViAgIEMhICAgIjErIVAgKEVQICI9QEAgICIxQiFQICYKLU0hMCAiSD04ICAiMVshUCAgIFAgIj1HOCAgIjIzIVAgIVZQICIsLSAgICIyRCFQICRbUCAiQk0oICAiMlcKLU0hUCAjUVAgIj1FICAgIjMpIVAgJlxQICIsLFggICIzPiFQICgkUCAiQk0gICAiM1UhUCAlNjAgIj1EWCAKLU0gIjQrITAgJ0hAICBDLiAgICI0MyEwICAgICAgQz5YICAiNDkhMCAnTiAgIEM1ICAgIjRBITAgICAgICAKLU1DNDggICI0SSEwICM7QCAgQz9AICAiNFIhUCAlUEAgIkhIMCAgIjRfITAgICAgICBDSjggICI1JyFQICIKLU1GQCAiSF8gICAiNTEhMCAgICAgIiAgICAgIjU4IVAgICAgICJKWlAgICI1PyIwICAgICAiTFRQICAiNUUKLU0rVlFJOEJdQzxHMFArRlwgK1ZRSThCXS04VylULDJZTyAmPUQ4RlVFK0ZcIDlWLUMsRV1DO1ZVUDo2UUUKLU05IlggK1YtWTlWRU49Il1QOyYlWStWOU45Ql1EOTc5TytWPUQ4RzFFPFcwTz0jJFArUCFHOSYpTTkyWUMKLU0gJkVOPSNJVCwzVVIsM0xNLEMkVC1TMFgsUzhULiNMUiwzMFctI0BTLUMwVy5QIUM6JiVSLkcwUi83KFIKLU0uUyBbLDMoVy5QIUw7VllHKCZFTj0jSVQsU1VSLDNMTSxDJFQtUzBYLFM4VC4jTFIsMzBXLSNAUy1DMFcKLU0uUCFVO0ctSTlWWUU5IiFJO0cwWj0jMF08QyRbLCNMTSwzTCA7Jl1OOVIhVTtHLUk5VllFOSIhSTtHMFoKLU09IzRdPEMkWywjTE0sM0wgPFZBTzxHMEA6NllULkcwVi83KFEuUlRTLEM8Vi4jTFMsQzxWLVNMIDsmXU4KLU05UiFMO1ZZRygmRU49I0lULVNVUiwzTFAuUlRRLlAhUzomXVI9IiFVO0ctSTlWWUU5IiFJO0cwWj0jQF0KLU08QyRbLCNMVi0zNFMtM0wgOyZdTjlSIUw7VllHKCc1TjxWRUc7RjVEKCZFTj0jSVQuM1VSLDNMUC5SVFEKLU0uUCFTOjY9Tjk2MEA4VkFBPENJVCwzIF08QyRbKzMkUi4jTFEsQzxbICc1TjxWRUc7RjVEKCYtSDg3KFoKLU09IyRRLzcoUS5TIFssQzRVLlAhRjsmXUE9I0lULDMoXTxDJFstI0xQLlAhRDtXNUI7JjRaPSMkUy83KFEKLU0uU0BbLCNMIDsmXU45UiFEO1c1QjsmNFo9IyRULzcoUS5TQFssI0wgPUZdSTkjSVQsMzRdLDM0ID0lXVMKLU09JylVOFcwWjUjJFYvNyxSLSc5PzhWQUE8RV1NOTZVQjk3KFosQlBQKyNAWz1FXVM6Jl1SPSVdTTk2VUIKLU05NyhaLUJQUS1CUFEtQ008ICc5Pzo2WVQ3VlVFOzYpRTxDSFErIyxSKyMsUi5XOT87Jl1OOVVdTTk2VUIKLU05NyhaLFJQVi0iUFMsQ008ICc5PzlGUU84NzE/OzY1TThGNVIuQyRSKyNEVisjLFIuVzk/OSZdVThGUUUKLU03VlVFOzYpRTxDSFEsUlBRLENATC1DMFsuUCFUN1c1Tjo2XU4uRTBRLVNVVS4nOT84VkFBPEVdTTk2VUIKLU05NyhaLEJQUCsjQFs9RV1TOiZdUj0lXU05NlVCOTcoWi1CUFArIyRWLlVQID1FXUk7RzE/OzY1TThGNVIKLU0uQyRMLCJQUyxDTVY3VlFPO0Y9Pzs2NU04RjVSLkMsTCwiUFMsQ008ICc5PzlGUU84NzE/OzY1TThGNVIKLU0uQyRSKyMgTCxTKFs9RV1EO1c1QjsmNT87NjVNOEY1Ui5DJFMrIyBMLUMwWy5QIVY3Vi1IODcpPzlHNU4KLU04U0kmLEAhVjdXLUk5VllFOSVdQzomJVI3VjlVO0YsWjFDJFAgJzk/PTZZUzo2PU45NjE/OFZBQTxFXUYKLU09NllDLkQ4USwwIVY3Vy1IO1cpVDdWOVU7RixaMUM4ID1FXVM6Nj1OOTYxPzxWQU88RzE/OUc1TjhTSSYKLU0tQCFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsWjFDQCA9RV1JO0cxPzlHNU44U0kmLDAhVjdXLUkKLU05VllFOSVdSTtHMT85RzVOOFNJJiwwIVY3VzVOPFZFRztGNUQ3VkVOPSVdRj02WUMuRDhUICc5PzsmXU4KLU05VV1GPTZZQy5EOFMgJzk/PFZFRztGNUQ3VlFPO0Y9PzlHNU44U0kmLFAhVjdXNU48VkVHO0Y1RDdWUU8KLU07Rj0/OUc1TjhTSSYtMCFWN1Y5TDtWJVQ3VjlVO0YsWjFDJFIgJzk/OSZdVThGUUU3VjlVO0YsWjFDJFMKLU0gJlFJO0ZMWjUjJFgvNyxRLTMpTjk3QVQuQyRZLzJIUS4iUFArIyxSLlZRSTtGTUY9NllDLkMoUC8ySFIKLU0sM1VGLDNETCxTKEwsUyhbNyAhUz0nNUY5Q0hSLENVQTxDJFssI0xQLlMoUy82JVIsM0xQLlMkWyxDMF0KLU04NyhRLlMgWyxDTFEtQlBWLSJQUSwzNFIuU0wgPSc1PzsmRU46U0k0LEM0XT0zJFQtJllFPicwWiwzREwKLU0sIlBTLENNTDo2WUs5RzVOOFNIUiwiUFArIyxSLlVQIDxXMVU5RjhaLEMoTCwiUFEsMzRSLlNMIDhWXUwKLU07VylTLkUwUi1DVUU+NjVMOyZdVy5DIEw8JzVSPCZRRS5DJEw8JkVOOlNIUisjTCA4ViVSPFNJNCxDPF0KLU05NilNPVNIUCsnIU88Ry1DOiY0WiwyUFsgJilPO1ZRRTg2WFo9IyhYLzY1JjA0UTMxM0hQKyUxMjU0NFoKLU0sMlBbICYpVjg2UVMuRTBSLjNVRTlGJUw8VjRaLCJRVDxHNUUuQyRMLlAhQjtWXUw5NiVOLENJVCxDRCAKLU07NkVTO1cpRDk3KUU5I0k0LFMgXTk3MVc7U0hSKyZdTjkzSFErJ0lFPEZcWiwiUVQ6JylFOTNIUysjTCAKLU07NiVJO0NJJiwwIVY3Vi1IODcoWjFTKCA9RV1TOjY9Tjk2MT84VkFBPENJJywzICA9RV1VO0ctSTlWWUUKLU05JV1DOiYlUi5EPFEsMCFWN1ctSDtXKVQuRDxWICc5PzxWRUc7RjVEN1ctSDtXKVQuRDxWICc5Pz02WVMKLU06Nj1OOTYxPzxWQU88RzBaMVNAID1FXUk7RzBaMVMkID1FXVM6Nj1OOTYxPzo2WVQuRDxRICc5Pz02WVMKLU06Nj1OOTYxPzo2WVQuRDxUICc5PzsmXU45U0knLFAhVjdXLUk5VllFOSVdTDtWWUcuRDxTICc5Pz02WVMKLU06Nj1OOTYxPzsmXU45U0knLTAhVjdWOUw7ViVULkQ8USxAIVY3VjFPPTYpTDkzSScsMywgPUVdQzomJVIKLU03ViVSPEYlWS5EPFMsM1VBPEMkWywjTFEuUyggPUVdUzo2PU45NjE/OFZBQTxFXUE8RylBPjNJJyxTKF0KLU04NyhRLlMgWywzTFEsICFWN1c1TjxWRUc7RjVEN1YtSDg3KT84NylSODdEWjFTLFMvNiVSLDNMUC5TJFsKLU0sMyQgPUVdUzomXVI9JV1BPEcpQT4zSScsUzBdODcoUS5TIFssM0xWICc5PzxWRUc7RjVEN1ctSDtXKVQKLU03ViVSPEYlWS5EPFMtICFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWS5EPFMtM1VBPEMkWywjTFEKLU0uU0AgPUVdSTtHMT84NylSODdEWjFTLFYvNiVSLDNMUC5TJFssMCFWN1ctSTlWWUU5JV1JO0cxPzg3KVIKLU04N0RaMVMsViAnOT89NllTOjY9Tjk2MT86NllUN1YlUjxGJVkuRDxTLVNVQTxDJFssI0xRLlMwID1FXUwKLU07VllHN1YlUjxGJVkuRDxTLiNVQTxDJFssI0xRLlMsID1FXVM6Nj1OOTYxPzsmXU45VV1BPEcpQT4zSScKLU0sU0AgPUVdVTtHLUk5VllFOSVdTDtWWUc3ViVSPEYlWS5EPFMuM1VBPEMkWywjTFEuUzQgPUVdRjsmXUEKLU09JV1BPEcpQT4zSSctIyBdODcoUS5TIFssM0xRLEAhVjdWMU89NilMOTVdQTxHKUE+M0knLSMkXTg3KFEKLU0uUyBbLDNMUSxQIVY3Vi1IODcpPzwmXUk7RzFFPENJJy0jKF0qQyggPUVdUzo2PU45NjE/OFZBQTxFXVAKLU07VkVOPSY1Ui5EPFQsU1RKLDMgID1FXVU7Ry1JOVZZRTklXUM6JiVSN1chTzo2WVQ5NyhaMVMwVC8ySFEKLU0sMCFWN1ctSDtXKVQ3VyFPOjZZVDk3KFoxUzBVLzJIViAnOT88VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQKLU05NyhaMVMwVSAnOT89NllTOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPENJJy0jOF0qQ0AgPUVdSTtHMT8KLU08Jl1JO0cxRTxDSSctIzxdKkMkID1FXVM6Nj1OOTYxPzo2WVQ3VyFPOjZZVDk3KFoxUzBXICc5Pz02WVMKLU06Nj1OOTYxPzo2WVQ3VyFPOjZZVDk3KFoxUzBYLzJIVCAnOT87Jl1OOVVdUDtWRU49JjVSLkQ8VC4zVEoKLU0sUCFWN1ctSTlWWUU5JV1MO1ZZRzdXIU86NllUOTcoWjFTMFkgJzk/PTZZUzo2PU45NjE/OyZdTjlVXVAKLU07VkVOPSY1Ui5EPFUsI1RKLTAhVjdWOUw7ViVUN1chTzo2WVQ5NyhaMVM0US8ySFEsQCFWN1YxTz02KUwKLU05NV1QO1ZFTj0mNVIuRDxVLENUSiwzLCA9RV1TPScpVThXMFEuRDxRLUAhVjdXLVQ8RzVDPSMoWjFTNFMKLU0vNyxSLSc5PzhWQUE8RV1NOTZVQjk3KFosQlBQKyNAWz1FXVM6Jl1SPSVdTTk2VUI5NyhaLUJQUS1CUFEKLU0tQ008ICc5Pzo2WVQ3VlVFOzYpRTxDSFErIyxSKyMsUi5XOT87Jl1OOVVdTTk2VUI5NyhaLFJQVi0iUFMKLU0sQ008ICc5PzlGUU84NzE/OzY1TThGNVIuQyRSKyNEVisjLFIuVzk/OSZdVThGUUU3VlVFOzYpRTxDSFEKLU0sUlBRLENATC1DMFsuUCFWN1c1Tjo2XU4uRDxRLVAhVjdXNU46Nl1OLENJJy0zMF09M0FWN1YtSDg3KT8KLU07NjVNOEY1Ui5DKEwsIlBYLlc5PzxWQU88RzE/OzY1TThGNVIuQzhMLCJQUS1DTTwgJzk/OjZZVDdWVUUKLU07NilFPENIUSsjIEwsUyhbPUVdTDtWWUc3VlVFOzYpRTxDSFMrIyBMLFMoWzcgIVY3VjlMO1YlVDdWVUUKLU07NilFPENIUSxCUFArIyxSLlc5PzkmXVU4RlFFN1ZVRTs2KUU8Q0hRLFJQUCsjOFQuU0wgPFVdTDo2WUsKLU0uRDxRLjAhVTdWUUk7RkxaMVMoVSAnIVI6NlVBPEdEWjFTNFUvNjVSOTYwWiwiUUc8RjVFO0NIUSsmKUwKLU09NjRaLEJQWyAmWU87RyFSOjZVQTxHRFoxUyhWICYtTD02WUs5NyhaMVM0Vi82NUM6JjVWPjNIUCsmOU8KLU08RjBaLDJQWyAnLVA7VylUPFYtQTxDSScsQzwgN1VdTTg2RU4rRlwgOVYtQyxFXUM7VlVQOjZRRTkiWCAKLU0rVy1FO0YxQToyXUE4RixPPEZFQzoiXUw4NzFFPFcwTztWKUo5JkVSKzctVTtDLE85Vi1DK1AgTitCXE4KLU0rQl1EOTc5TytWPUM4Ul1MOjYpRzhWLFIrRiwgOjZZVC5HMFEvNyhRLlJUUiwzMFctI0BTLUMwWC5TKFEKLU0tIzxULiMsVi0jPFsgJi1IODcoWj0jKF08QyhbLCNMUSxDPFsgJlFPO0Y8QDo2WVQuRzBTLzcoUS5SVFIKLU0sMzBXLSNAUy1DMFguUyhRLSM8VC4jLFYtIzxbICc1TjxWRUc7RjVEKCZFTj0jSVQtI1VSLDNMUC5SVFEKLU0uUCFMO1ZZRygnNU48VkVHO0Y1RCgmRU49I0lULTNVUiwzTFAuUlRRLlAhUzomXVI9IiFJO0cwWj0jOF0KLU08QyRbKzMsUi1TOFguUyxSLVM4Vy5QIUw7VllHKCZRTztGPEA6NllULkcwVy83KFEuUyBbKzMkWyAnLUgKLU07VylUKCc1TjxWRUc7RjVEKCZFTj0jSVQuI1VSLDNMUC5TOFUtMyxVLlAhTDtWWUcoJlFPO0Y8QD02WVMKLU06Nj1OOTYwQDo2WVQuRzBZLzcoUS5TIFsrMyRbICctSTlWWUU5IiFDOiYlUi5HMFEsI1VSLDNMTSwzKFgKLU0uUyRSLVNMID02WVM6Nj1OOTYwQDhWQUE8Q0lULDMkXTxDJFssI0xSLTM0WyAmOUw7ViVULkcwUSxDVVIKLU0sM0xULlMgWyAmMU89NilMOTNJVCwzLF08QyRbLiNMUC5QIUw7VllHKCYxTz02KUw5M0lULDMwXTxDJFsKLU0uI0xQLlAhVjtWRUQuRzBRLTNUUS0wIVI5Nj0/OFZRQTxXLFo1IyRWLzY1LjNVXTIxND0zLkMgTDMkXT8KLU0xRSEhN1UpJTFVLFosMlEmNCQlPzRENSc0U0hSKyQ5MDdVKSUxVSxaLFJRPCAkOTA3VF0yN1Q5MDA1XTIKLU0xND0zLkMwTDEkJTQwNV0yMTQ9My5DNEwxJCU0MDVdLzRFXSY0JCU/NEQ1JzRTSFYrJDEhNSQlPzNVKT8KLU0xRSE/NEQ1JzRTSFcrJVAgMSQlNDA1XS80RV0mNCVdLzRFXSY0JCU/NEQ1JzRTSFgrJCUkMSUpPzRENScKLU00U0hZKyQ9JTNENTIwNFE/NEQ1JzRTSFEsIlEnMTRZJTREJSw3VF0yN1Q5MDA1XTIxND0zLkMkUSslUCAKLU0xVDUuMTUpITMlXS80RV0mNCVdMjE0PTMuQyRSKyQlLDMlXTIxND0zLkMkUyskUSkzNV0yMTQ9PzBUUSEKLU00VS0lNFNIUS0iUFsgJyFUPEYxSTlGOT89I0lULDAhUzo3SUU3VzBaPSMkID1WLUg4Nyk/PSNJVC4gIUwKLU07VllHOyZdTjlTSTQsMzxdPFNBSDo2PUguQyxMLCJQUyxDTUw7VzxaLFJQUyxCUFMsQ0xbICZRTztGPT8KLU07Jl1OOVNJVCwzQF09M0FTLkMkVysjIEwtQzBbOyZQWi1SUFArIzhULlNMIDlHNU44VV1QPScoWj0jJFkKLU0vMkhSLCNVRiwzNCA3VV1EO1VdRzsmXUI4NlE/OScxTzxHLFoxQyRVICVdRT4mRVQ3VjFVOzZVWTdXKUUKLU05Q0knLEMkXSpDJCA3VV1EO1VdRzsmXUI4NlE/OFcxTzxHLFoxQyRVICVdSTtGRVQ6NiVMOjdJRTkiWFAKLU0gJV0/OzYlSTtDSSYsMzQgN1Y1WDo3ME47UCFHOFYsUjdWLU87NyFJOyY1RCtAIE88VjVOOSYlSStWJUIKLU04Ul1SOjYtSCtWUUE9JjVTPSJdTzhGSUQ6NyhNPFc1TixSXUc4VixPICJYTitSWE4rVjFFPUZcTzlWLUMKLU0rVlFJOEY9QzhTKE44UCFJO0cwWj0jJF08QyRbKzMoUS0jPFQuIyxWLSNAWyxDJFQtUzBYLFM4VC1TTCAKLU04VkFBPENJVCxDVVIsQ0xQLlMkUi1TTCA7Jl1OOVIhSTtHMFo9IyxdPEMkWyszKFEtIzxULiMsVi0jQFsKLU0sQyRULVMwWCxTOFQtU0wgPTZZUzo2PU45NjBAOjZZVC5HMFQvNyhRLlMgWyszJFsgJlFPO0Y8QD02WVMKLU06Nj1OOTYwQDo2WVQuRzBVLzcoUS5TIFsrMyRbICctSDtXKVQoJkVOPSNJVC1DVVIsM0xNLFMoVy1DQFsKLU0sUyhXLUM8WyAmUU87RjxAOyZdTjlSIUk7RzBaPSM8XTxDJFssI0xNLDNMIDxWQU88RzBAPTZZUzo2PU4KLU05NjBAOjZZVC5HMFgvNyhRLlMgWy1DNFUsUzRbICZRTztGPEA7Jl1OOVIhVTtHLUk5VllFOSIhSTtHMFoKLU09I0RdPEMkWywjTE0sM0wgPFZFRztGNUQoJi1IODcoWj0jJFAvNyhRLlJUUSxDQFssMyhXLlAhVTtHLUkKLU05VllFOSIhQzomJVIuRzBRLDNVUiwzTFAuUyhVLTNMIDlGUU84NzBaPSMkUi83KFEuUzBbLCNMIDkmXVUKLU04RlFFLkcwUSxTVVIsM0xYLlMgWyAmUU87RjxAOSZdVThGUUUuRzBRLSNVUiwzTFguUyBbICc5Tzo2MFoKLU09IyRVLzMkVSAnKUU5VV1DOyYlUzxTSTQsMzhdOTRZLzdVKSUxVSxaLCJRLDNVXSY0JCU/NEQ1JzRTSFEKLU0rJDkwMDVdMjE0PTMuQyhMMUUhPzRENSc0U0hTKyVQIDFFIT8zVSk/MUUhITdVKSUxVSxaLSJRJDA1MSEKLU03VSklMVUsWi0yUSQwNTEhN1RdMjdUOTAwNV0yMTQ9My5DOEwxJCU0MDVdLzRFXSY0JV0yMTQ9My5DPEwKLU03ICEkMDUxITdUXTI3VDkwN1RdMjdUOTAwNV0yMTQ9My5DQEwwNDEkNEVdMjE0PTMuQ0RMMVQ1LjE1KSEKLU0zJV0yMTQ9My5DJFArJD0lM0Q1MjA0UT8zVSk/MUUhITdVKSUxVSxaLDMkTDcgIScxNFklNEQlLDdUXTIKLU03VDkwN1UpJTFVLFosMyhMMDRRLDdVKSUxVSxaLDMsTDMkRS03VSklMVVdIzMkJTM0VDUzLkMkVCsjTCAKLU08JzFSOSZFRjlFXVQuRzBRICctST5GNT89I0lULDAhVzhWQUE8RV1ULkcwWCAmUU87Rj1MO1ZZRy5FMFEKLU0tU1VTLiZBSTlWQFosUlBQKyMsUi5WUU89U0hTKyMsUisjLFIuU0wgOyZdTjlVXUw7VllHLkcwUS4jVVUKLU0uJyxaLDM8TCwiUFYtI01MOyNIVysjIEwtQzBbLlAhRj02WUM3VyFUPENJVCwzRF0qQyhQLzY4US0wIT8KLU05N0FJPSVdRD02VU0+NV1EOTYtTC5EPFEgJV0/MFUxLzRFXSwyNS00N1VcWjFTKFEvNiVSLDNMUC5TJFsKLU0sM0QgN1VdJDUkXTI3VFEpNFUxPzdTSScsQyQgKzZRRyAmUUk4RjxOPFAhLTxXPUk9Ji1IK0ZcIDk3QUkKLU09IllPICZdTjdWNVg6NzBOO1AhVzxGRVQ5MllPICY1UjxAIT85N0FJPSJZTyAmLUU8RylPPEJZTyAmNVIKLU08RllPK0ZcIDlGUVM4RzVGK0ZcIDlGUU84NzE/PFc9ST0mLUgrRlwgMzZFTjo3ME47UCFGPCVdRzsmXUIKLU04NlFTK0ZcIDs2RU46NzFGPCJZTyAmVUE7JlFPOFJZTyAmRVM4NzFUPjJZTyAmOUk7RjFJO1cgTjtQIUkKLU07VihOO1AhUzo2PVY5NixOO1AhQzsmXVM5MllPICY1UjxAIUY8VzFBPSJZTyAmNVI8QCFHOTcxRD0mJUIKLU07JjVTOjdJRStGXCA5NylSICY9RT0nIUE5VjVTOjdJRStGXCA5NylSICZFTzhXMUwrRlwgOTcpUiAnLUkKLU05VilMO1YtSytGXCA5NylSICctSTlXLUU9JlVBPFZMTjtQIUU8RyggPFYpUjpSWU8gJy1JOVcxUjg2VVAKLU0rRlwgN1ctSTlXOUU4UllPICY5UDxGRU49JjhOO1AhLTkmNUY4NzVMPSJZTyAmVUEuMy1OK0ZcIDlHIT8KLU08ViVWOTJZTyAmKUM7VyFZK0ZcIDhWJUw7Jl1DK0ZcIDkmXVA8RllUK0ZcIDlHIT84Vl1NOzZdTjxSWU8KLU0gJilaOTcpTytGXCA7NjVNPFY1VCtGXCA8VzFSOyY1TitGXCA4NzFPOjJZTyAmLVQ+NyFFN1JZTyAmVUUKLU07Ni1IPEJZTyAnLUU9JlFPOFYlTDkyWU8gJy1UPEYtSDxCWU8gJy1UPEYtTTwiWU8gJy1UPEctUDtCWU8KLU0gJy1UPEcxTzpSWU8gJjVDO1ZZVjk3KVQrRlwgOVYtTztHOUU8RzBOO1AhRDtXNUI7JjU/OSY1Qzo2VE4KLU07UCE/PTZZUDg2LUs3VjFCOyY0TjtQIT84RiVTOTVdMytGXCA3VilBPFY1Pzo2UE47UCE/PFchUjo2WVQKLU05RV1TPTcgTjtQIT89JkVNOTctPzwmXVc5NyhOO1AhUTk2LU87RzlFPEcwTjtQIVI5NiVEK0ZcIDk3KVIKLU0gJyFSOjZZVDlCWU8gJy1QPEZFTj0mOE47UCFPPCY1TitGXCA5NylSICZVRTs2LVA+MllPICctVDxGLUEKLU09IllPICctVDxGLVA+MllPICYlQjtXKVQrRlwgOVY1VDk2WVYrRlwgPCY1UjxGXVIrRlwgPFcxUjwmKVIKLU06UllPICVdQjo2PT88Jl1XOTcoTjtQIT88VlVBOyZRPzwmXVc5NyhOO1AhRzk3MVA6NjBOO1AhRTxHKCAKLU08VkVHO0YlTCtGXCA6VkVMOyJZTyAmNVI8QCE/PCY1UjxGXVIrRlwgOTcpUjsnLVQrRlwgPVcpST0mNVYKLU0rRlwgOTcpUiAiVUw5UCFMOjYpRytHLCA3VjVYOjcwIDdVXSQ2NFkhMzRFIyAnLVQ4NylUICVdTTg2RU4KLU0gJy1UODcpVDdWOUw7ViVUICVdPzk3QUk9ICE/OTZZVjo3KU87QCEtPFc9ST0mLUggJjhWLiNAWCw1XVUKLU08VjVEICVdVjdWLUg4Nyk/OUc1TjhQIT89RV1TOjY9Tjk2MT84VkFBPEVdRj02WUMgJV1WN1c1TjxWRUcKLU07RjVEN1YtSDg3KT85RzVOOFAhPz1FXVM6Jl1SPSVdRj02WUMgJV1WN1ctSTlWWUU5JV1TOiZdUj0lXUYKLU09NllDICVdVjdXNU48VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCA3Vzk/OjZZVDdWOVU7RiwgN1c5PzxWRUcKLU07RjVEN1ZFTj0lXUY9NllDICVdVjdXNU48VkVHO0Y1RDdWRU49JV1GPTZZQyAlXVY3VlFPO0Y9PzlHNU4KLU04UCE/PUVdUzo2PU45NjE/OyZdTjlVXUY9NllDICVdVjdXNU48VkVHO0Y1RDdWUU87Rj0/OUc1TjhQIT8KLU09RV1GOyZdQT0lXUY9NllDICVdVjdWMU89NilMOTVdRj02WUMgJV0/N1ZVQTo2WCA3Vzk/OFZBQTxAIT8KLU09RV1TOjY9Tjk2MT84VkFBPEAhPz1FXVU7Ry1JOVZZRTklXUM6JiVSICVdVjdXLUg7VylUICVdVjdXLUkKLU05VllFOSVdUzomXVI9ICE/PUVdVTtHLUk5VllFOSVdUzomXVI9ICE/PUVdSTtHMCA3Vzk/PFZFRztGNUQKLU03VkVOPSAhPz1FXVU7Ry1JOVZZRTklXUk7RzAgN1c5PzsmXU45UCE/PUVdUzo2PU45NjE/OyZdTjlQIT8KLU09RV1VO0ctSTlWWUU5JV1MO1ZZRyAlXVY3VjlMO1YlVCAlXVY3VjFPPTYpTDkwIT89RV1DOiYlUjdWJVIKLU08RiVZICVdVjdXLUk5VllFOSVdQzomJVI3ViVSPEYlWSAlXVY3VzVOPFZFRztGNUQ3Vi1IODcpPzg3KVIKLU04N0QgN1c5PzxWQU88RzE/ODcpUjg3RCA3Vzk/PFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZICVdVjdXNU4KLU08VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkgJV1WN1ZFTj0lXUE8RylBPjAhPz1FXVM6Nj1OOTYxPzo2WVQKLU03ViVSPEYlWSAlXVY3VzVOPFZFRztGNUQ3VkVOPSVdQTxHKUE+MCE/PUVdTDtWWUc3ViVSPEYlWSAlXVYKLU03Vy1JOVZZRTklXUw7VllHN1YlUjxGJVkgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT84NylSODdEIDdXOT8KLU05RlFPODcxPzg3KVI4N0QgN1c5PzkmXVU4RlFFN1YlUjxGJVkgJV1WN1YtSDg3KT88Jl1JO0cxRTxAIT8KLU09RV1TOjY9Tjk2MT84VkFBPEVdUDtWRU49JjVSICVdVjdXNU48VkVHO0Y1RDdWLUg4Nyk/PCZdSTtHMUUKLU08QCE/PUVdUzomXVI9JV1QO1ZFTj0mNVIgJV1WN1ctSTlWWUU5JV1TOiZdUj0lXVA7VkVOPSY1UiAlXVYKLU03VzVOPFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoIDdXOT86NllUN1chTzo2WVQ5NyggN1c5PzxWRUcKLU07RjVEN1ZFTj0lXVA7VkVOPSY1UiAlXVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICVdVjdWUU8KLU07Rj0/PCZdSTtHMUU8QCE/PUVdUzo2PU45NjE/OyZdTjlVXVA7VkVOPSY1UiAlXVY3VzVOPFZFRztGNUQKLU03VlFPO0Y9PzwmXUk7RzFFPEAhPz1FXUY7Jl1BPSVdUDtWRU49JjVSICVdVjdWMU89NilMOTVdUDtWRU4KLU09JjVSICVdUDxGRU04NylZICVdTjtWWVA8RkVNODcpWSAlXVM8Jl1SPSctQzg3KCA3Vi1MPTZZSzk3KCAKLU03Vy0/OyZFTjpQIT89NV1MOjZZSyAlXVY3VzVOOjZdTiAlXVY3VzVOOjZdTixAIT89RV1TPScpVThXMFEKLU0gJV1WN1ctVDxHNUM9IyggN1VdPzkmXT85VlFPOEYlTDdWMVQ7VylTICVdPzdUMTQzVSk/MyRFMzUlXT8KLU0gJV0/OTdBST0lXUQ9NlVNPjVdUjk2OCA3VV1FPiZFVDdWMVU7NlVZN1YxRThWUCA3VV0/OSZdPzlWUU8KLU04RiVMN1YtVDtXKVMgJV0/N1QtNDNVKT8zJEUzNSVdPyAlXU87RV1FPiZFVCAlXVc8RkVUOTAhPzs3LVcKLU06NzFDOiY5UDdQIS06NllJPSAhRjsmXUE9JV1TPVZFVDhWQCA3VV1DOyY1QTtHNVAgJV0/OTdBST0lXUgKLU04NllEOyY1UjxQIT87NiVMOyZdQyAmLUU8RylPPEAhPzk3KVI7RlwgN1VdVzxHMUM6JkwgN1VdRjsnLUIKLU09NjggN1Y5Ujk2NCA3VV1TOzYpVTlAIT85RjlMPTctSCAlXT85RkVOOSYpVTlAIT83V0FGOyctQj02OCAKLU03VjlTPSYlVCAlXT84RzVGPFdFTjhQIT84VlFPPFY0IDdWRVM4NzFUPjAhPzlGLUw7Vy1FICVdPzlHPUEKLU07JkwgNUZRSTxXMCA3VjlQN1ctVzo3MUM6ICE/OzZFTjo3MUY8JVwgN1Y5UDdXLVQ4NzFFN1ZVQy1DQFgKLU0uIyQgN1Q5TTtWMUUgJV0mPFcxQT0nNVMgJV1GPCVdUz0mJVQ5NV1TPTZZRjwmJCA3VjlQN1ctVDg3MUUKLU03Vy1LPjY5RjwgIT85RyE/PFcxQT0mNT88Vl1GPSc9QTxGNCA3Vy1JOVc5RThQIT8xNFU0NFchRThWRUEKLU07ICE/OUchUjo2WVQ5QCE/OzYkWSxWWT8gJV0tOSY1Rjg3NUw9ICE/MTRVNDRWRUc7RiVMOyY1RCAlXT8KLU06Nl1CICVdUjk2JUw7Jl1DICVdUzhHKUsgJV1HOTcxUDg2PUU8VkVaOTAhPzhGLU88J0QgN1VdVThGXVUKLU07RjAgN1VdPzs2JUw7JkVOOUZcIDdVXVI7Vl1UICVdPzsmKU89NllEICVdSTtWLVQ7ICE/N1Y5STtGMUkKLU07VyAgN1Y9RT0mMVQ4NilMOTctST5GNCA3VV1GN1ZVTzxGNUY6NlFFPFAhPzlFXVA8RjVBOyZRTzhQIT8KLU04ViVMOyZdQyAlXT88VkVHOUc1TjhQIT88VkVHPFY1VDs2JVM6UCE/N1ctSTlXMVI4NlVQICVdPzxWRUcKLU09RjVDICVdUzo2PUI7Jl1DOlAhPzk2WUQgJi1VPEYpUjpQIUY8JV1TODc5RSAmOVA3VylFPFcxTzxGNCAKLU03VV1EO1chUjtHMCA3VV1TOldFPzlGMCA3VV1TOldFQjg3LUUgJV1CPkY1UjtQIT84VjlSOTY0IDdWJVQKLU07VkQgN1ctVDxHLVA7QCE/N1YtVD43IUU3UCE/OzY1TThWQVIgJV1NOTZVUzk3MCA3VyVGOFZdTj1GNVIKLU09ICE/OUYtTztHOUU8RzAgN1ctVDxGLUg8QCE/OyZdQzg2UUU4Vl1OPUAhPzdWVUs4NylHOyctVCAlXVMKLU09JylMOTZYIDdVXUY7VzVSOSZFRzo3MVM8NzVJOFZMIDdXJUc4Vl1OPUY1Uj0gIT85Vi1PO0c5RTxHMCAKLU03VyVFOFZdTj1GNVI9ICE/OTYtTztHOUU8RzAgN1VdRzk3MUE8RjwgN1VdRjwmJUI4Ny1FICVdSTxXIVUKLU07Ri1UICVdSTxWPVI4NyFIICVdSTxWJVM4VkVJICVdVDtWJVM4VkVJICVdPzs2KT84VzVSN1ZVQT4gIT8KLU06Ny1YOSZFRzo3MCA3VkVTPFchQThWNCA3VkVTODZRTj02VCA3VkVTPTchUDk3KCA3VkVTOFZZVDxGUCAKLU03VkVTPCcpSTtHMCA3VkVTODZRUDomJCA3VkVTOSZFRzo3MCA3VkVTOyZdVzk3KCA3VylFODYwIDdWUUMKLU07VllWICVdRzk3MUw7Vi1BOyY1PzhXMVk8JjQgN1VdTDg2WUc6NllGO1AhPzsmXUM4NlFEPSYtTztHOCAKLU03Vy1UPEYtQT0gIT83VlVZN1cxSTs2NCA3Vy1FPSZRTzhWJUw5MCE/PFcxUj0mXUsgJV1JO0ZFVDdXLVQKLU04NzFJOFcsIDdWPUU9JlFPOFYlTDk1XU49NlVFPEZFQyAlXU05NlVDPCdEIDdVXUw7Vi1BOyY1UyAlXVMKLU09JylDOzcgIDdWXVA5NlggN1ZdUDk2WUw7Vi1BOyY0IDdXLVQ8Ri1QPjAhPzdWLU85JjU/PFY1VDdWRU4KLU05RlwgN1VdQz0nRVA5NV1VOyAhPzlWNVQ5NllWICVdPzknMUM7VllWICVdUz0nKVA4RylLICVdRjwlXUQKLU06NylFOFcxSTtWWCA3VV1GPCVdQz03KVI5NllUN1YxSTxGNUM9JkVPO0AhPzdWOVA3Vi1VPEcpRTtHMT8KLU05N0FDOTchVDo2XU48UCE/N1Y5UDdWLVU8RylFO0cxPzwnKUU4VkVTOjZdTiAlXUQ7VzVCOyY1Pz0mXT8KLU05JjVDOjZVQTsgIT85Vi1WPSAhPzdWPUM9RzAgN1YpSTtGJVI+NV1UO1VdRDk2LUk7NiVMN1ZFTj0mNUcKLU05NyggN1VdUjo2PUg9JV1TOiZFRj0lXUI4Ny1FN1cxVztQIT85JjVDOjZVQTslXVI7VzVOOSAhPzdWKUkKLU05VV1GOyZdQT0lXVQ6NlVFPFVdUDtXPUU8QCE/OEZFTjg3KVk3VzFPN1YxRThWRU04NlE/OUcpQThXMUkKLU07VlggN1VdRjwlXU47VylNODZRST5GNCA3Vy1QPEZFTj0mOCA3VV1GPEY1RTdWKUk5VV1GOyZdQT0gIT8KLU03VzVOPCYlQzpWNUQ3VzFPN1YpSTlVXUY7Jl1BPSAhPzdWKUE8VjU/OFZdTj1GNVI8VkVPO0VdQThGXVIKLU09ICE/N1c1TjwmJUM6VV1EO1c1QjsmNCA3VV1DOyYlUzxVXUQ7VzVCOyY0IDdXJVU4NjFSPTchTDk1XVQKLU07VV1EOTYtSTs2JUwgJV0/PTZZUDg2LUs5NjE/PSZdPzkmNUM6NlVBOyAhPzdWKUk5VV1COjZZQTxHRT8KLU09Jl0/OEZFRzdWMUU4VkVNODZQIDdVXVU7RyFBOFZNPzw3NUE5JylVPCZRRSAlXT84VlFBPFctPzw3NUEKLU05JylVPCZRRSAlXT85RyE/OyY1Rj0nLUg6NjlUICVdPzlHIT88VjVUN1Y1WDhWNVA9JkVPO0AhPzdXNU0KLU04NiwgN1VdTT02UVQ6NyFMPjVdQjg3LUU3VzFXO1VdVjk2LVQ7VyggN1VdTT02UVQ6NyFMPjVdQjg3LUUKLU03VzFFO0VdVjk2LVQ7VyggN1VdQzg3KVI+NV1QPEZdUDg2PUE9JjU/PSc9TyAlXT84ViVSPEdFPzwnKU8KLU08JiVHODcxRTdXMUU7QCE/N1YtQTxHKVk3VkVON1YoUSwjIFAsICE/N1chUjtWMUM3VihRLCMgUCwgIT8KLU03VlVVOycxSTwmUVk3VilBPFY1Pz0nPU8gJV0/OyY1Rj0lXVM6JkVGPSVdQjg3LUU3VzFXO1AhPzdWVVUKLU07JzFJPCZRWTdWKUE8VjU/PSY1TjdWKVk3VzFXO1AhPzdWVVU7JzFJPCZRWTdWKUE8VjU/PSY1TiAlXT8KLU07JjVGPSVdUzomRUY9JV1CODctRTdXMUU7QCE/N1chUjtWMT8sMyBQLCMhPzhDOFUtMyxWICVdPzwnKU8KLU05JV1CLUM0VSxTOCA3VV1DODcpUj41XU89NzE/OEMkUCwjIFAgJV0/PCcpTzklXFYtMzRTLUVdQiwzIFAKLU0sIyAgN1VdTDxWQUk5RzE/OEMkUCwjIFAgJV0/PCcpTzklXUIsMyBQLCMgIDdVXU09NlE/LUM0VSxTOVMKLU06Jl1SPSAhPzwnKUk7RzFGICVdPzsmNUE5JkVOOVVdWjk3KU88VV1COjY9PzwmXVc5NylTN1cxRTtAIT8KLU03VlFFODYxSTtGPT8+RjVSO1ctPzxWVUE7JlE/PCZdVzk3KVM3VzFFO0AhPzdWUUU4NjFJO0Y9Pz5GNVIKLU07Vy0/PSZFTj41XVA7Vz1FPEctPz0mNU4gJV0/PFcxQTxHMT84RkVHN1chTz1WNVI8VV1UOTZYIDdVXVMKLU09JiVSPSVdUzs2JUw7JV1QO1c9RTxHLT89JjVOICVdPzxXMUE8RzE/PSZFTj41XVA7Vz1FPEctPz0mNU4KLU0gJV0/OEZFRzdXIU89VjVSPFVdVDk2WCA3VV1TOzYlTDslXVA7Vz1FPEctPz0mNU4gJV0/PSZFTj41XVAKLU07Vz1FPEctPz0mNU4gJV0/OzYlWDdWKUk5VV1QO1c9RTxHLT89JjVOICVdPzs2JVg3Vy1NODZRTDdXIU8KLU09VjVSPFVdVDk2WCA3VV1NODdBPz0mRU4+NV1QO1c9RTxHLT89JjVOICVdPzhWXVA+NV1COjY9PzlGUU8KLU04NzE/OSZFRzo3MVMgJV1BOEZdUj0gIT83Vy1UODcpVDdWKUk5VV1QO1c9RTxHLT89Jz1PICVdPzxXMUEKLU08RzE/PFZVQTsmUT88Jl1XOTcpUzdXMVc7UCE/N1ctVDg3KVQ3VzFJO0dFPzwmXVc5NylTN1cxVztQIT8KLU03VilJOVVdUDtXPUU8Ry0/PSc9TyAlXT88VlVBOyZRPzwmXVc5NylTN1cxVztQIT83VzFJO0dFPzwmXVcKLU05NylTN1cxVztQIT83VlVBPiVdQjo2PT88Jl1XOTcpUzdXMVc7UCE/N1ZVQT4lXVM7NiVMOyVdUDtXPUUKLU08Ry0/PSc9TyAlXT87NiVYN1cxSTtHRT88Jl1XOTcpUzdXMVc7UCE/PCY1UjxGXVIgJV1LOjZRTCAlXVMKLU06Nj1OODZQIDdWPUU9JyFJOSAhPzdXIUU8RylPPEAhPzxXRVM3VjVSPEZRSTxXMCA3Vz1SOjcxRT1AIT8KLT08V0VTN1ZZRTxHKCA3VjVUOTdBVCAlXUU5JiVUODAhPzdWNU45ICFSCi0gCi1lbmQKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTY4ay1lbGYudSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTY4ay1lbGYudQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNkMDVlNy4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstZWxmLnUKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotYmVnaW4gNzc3IG02OGstZWxmCi1NP1Q1LDFAJCIgMCAgICAgICAgICAgICAiICAwICAgICFAICAkPiAgICAjMCAgIyIwICAgICAgIFQgIiAgCi1NITAgSCAhNCAkMCAgICA4ICAgIFRAICAgLSAgICAgICAgICJAICAgIEggICAgIDQgICAgICAgICAgUCAgCi1NIC0wICAgICAgICAgICAgICAhLCAgICAgICAgICEgICAgICAgICAgISAgICAtKCAgICMwICAgICAgICApCi1NQyAgICI4UCAgICAlICAgQCAgICAgICQgICBHIEAgIElQICAgICAgICAgIjQgICAiNiAgICAgPCAgIiAgCi1NICAgICBAICAiPjIgICJHRCAgICAgICAgICcgICAgICAgICAgIVAgICAgIE89Ny1SK1ZRSThCXUw6NilDCi1NK0ctTytDJCAgICAgICYkICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICA0ICAgICAgICAgIFAgICAgICAgICAgICAgICFQICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgCi1NICAgICAgICAgICArICAgICAgICAgICAgICAgICAgICAhICAgICAgICAgICAgICAgIEAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJAICAgICAgICAgICAgICAgICAgCi1NICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NIUAgICAgICAgICAgICAgICAgICAgICAgICAgISAgICAgICAgICIwMiAgICAgICAgIkggICshQCAgICAgCi1NJDAjX1wwICAgIF4gICJHJCAgICAhISQgICBIICAgIDhAICApUCAgICAgIDEgL19RICAgICdQICAgICAgCi1NICAhOiRAICAgICAgICI6ICAiSTQgICAgICEkIF9fJCAgICBNICAgICAgICAgICAyICAgICAgICAsSCAgCi1NIS1AICAgICQkMCAgIiAgICAjXCAgICAgICAgICAhKCAgICAgICAhKUAgIElSICAgICAgMSAvX1EgICAgCi1NN1ggICo+MCAgICAgJDAjX1wwIT84VlFFODZZVTwgIT85NllEICVdRTtHOUk8Rl1OICVdRT0mNVg9ICFBCi1NPSY1WDo3MCA3VjVEODcxQSAmNVg6NzAgN1ZRSThFXVY5NylTOjZdTiAlXT85RyFTPSYlUj0gIT8xVFEvCi1NMEQlLDdUXSYxRS0lNSVdNDA0KSwxNVwgN1QxOTNEJS0yNCwgK1c1UzxCXUw6NihPOyZFQjhSWVM7UlhRCi1NICAiICAiRzQgICAlJTAgICAgIiAgIkc4ICAgISUwICAgICIgICJHPCAgICklMCAgICAiICAiR0AgICAnCi1NJTAgICAgIS49NFlRK1NMITwgICApOzkuXlAlUSAgIEVMQCAgICAhLl5QJVEgICBFSkJcXCAgICAgJiNfCi1NX19fX1ckW1sgNyQgICI2OitTUCAgICAsOC9fX19fXygzT0whPDAgICk4SE8vICAgICFBQF9fX19fWzEuCi1NXlAlUSAgIEU+QlxcICAgICkmI19fX19fSCJcXEAgIClPJFpZQCAgJColQS8oI1IgICAwXDlfXCAgICAuCi1NK1AhLk44ICAhIkE4M1lfXCAgICAjIlo2MD5YICEiXSggIDEqRiY7XChcQiAgIkckK1RAICIkWllAICAkCi1NJCRaWUAgICQ0JFpZQCAgJ0siWiAzS0YgICAxRDNHNS48MCAgICAhKCNPX19fX1EoW1AgICAgM1ItXyAgCi1NIDcgICAgICQ8ICFAX1AgICAgM1ItXSAgIDcgICAgICQzLlwgICAgJDNFWS49NEAuX19fX18kQ08gICAgCi1NIS8oV1wgICE8ICAgICAxUCAmI18gICAgIS8oV1QgICE8ICAgICAxLFtQICAgIDEuN0RZVTIgW19fX19cCi1NMi5cICAgICRcQz9QICAlUCAgICAhJyAgOC9cICAgICRcQz8wICAlUCAgICAhJFNPICAgICEkWT4zRzUoCi1NI09fX19fUShbUCAgICAzUi1fICAgNyAgICAgJDwgIUBfUCAgICAzUi1dICAgNyAgICAgJDMuXCAgICAkCi1NM0VZLj00QC5fX19fXyRDTyAgICAhLyhXXCAgITwgICAgIDFQICYjXyAgICAhLyhXVCAgITwgICAgIDEsCi1NW1AgICAgMS43RFlVMiBbX19fX1wyLlwgICAgJFxDP1AgICVQICAgICEnICA4L1wgICAgJFxDPzAgICVQCi1NICAgICEkU08gICAgISRZPjNHNSgjT19fX19RKFtQICAgIDNSLV8gICA3ICAgICAkPCAhQF9QICAgIDNSCi1NLV0gICA3ICAgICAkMy5cICAgICQzRVkuPTRALl9fX19fJENPICAgICEvKFdcICAhPCAgICAgMVAgJiNfCi1NICAgICEvKFdUICAhPCAgICAgMSxbUCAgICAxLjdEWVUyIFtfX19fXDIuXCAgICAkXEM/UCAgJVAgICAgCi1NIScgIDgvXCAgICAkXEM/MCAgJVAgICAgISRTTyAgICAhJFk+M0c1KCNPX19fX1EoW1AgICAgM1ItXyAgCi1NIDcgICAgICQ8ICFAX1AgICAgM1ItXSAgIDcgICAgICQzLlwgICAgJDNFWS49NEAuX19fX18kQ08gICAgCi1NIS8oV1wgICE8ICAgICAxUCAmI18gICAgIS8oV1QgICE8ICAgICAxLFtQICAgIDEuN0RZVTIgW19fX19cCi1NMi5cICAgICRcQz9QICAlUCAgICAhJyAgOC9cICAgICRcQz8wICAlUCAgICAhJFNPICAgICEkWT4zRzUoCi1NI09fX19fUShbUCAgICAzUi1fICAgNyAgICAgJFxDUTQgICAgICAgICAgICA4L1wgICAgJFxDPzAgICVQCi1NICAgICEkU08gICAgISRZPjNHNSgjT19fX19RKFtQICAgIDNSLV8gICA3ICAgICAkXENRNCAgICAgICAgCi1NICAgIDgvXCAgICAkXEM/MCAgJVAgICAgISRTTyAgICAhJFk+M0c1KCNPX19fX1EoW1AgICAgM1ItXyAgCi1NIDcgICAgICQwQ0YgICJNRCRfUCAgOCAgKk4gM18gICJAICBKSSMvXCAgLiAgIks4LF9QICEoICAqTEBTCi1NXyAgJUAgIEo7Ii9cICAgICFIICAqR0BDXyAgICAgPiAgIkk4KF9QICAgIChAICBKNyIvXCAgICAiOCAgCi1NKk0wQ18gICAgIEogICJJRChfUCAgICArQCAgSlkiL1wwTEAgICggICpKQENfJCFJICAiICAiSVAoX1AgCi1NICAgIEAgIEo9IS9ZQCAgSzkoICAqVCAzXjggICpOIiAgIkpAJF9GICAiSkRAICBKOCMvWUAgIEpWKCAgCi1NKk5AU144ICAqTEIgICJKVCxfRiAgIklMQCAgSlsiL1lAICBKPiggICpIMENeOCAgKkVCICAiS1goX0YgCi1NICJJPEAgIEpPIi9ZQCAgSlUoICAqVVBDXjggICpGMiAgIkpMKF9GICAiS0RAICBKUyIvWUAgIEpKKCAgCi1NKlRQQ144ICAqRyIgICJKMChfRiAgIklUQCAgSkUiL1xAICBLOSggICpPIENfKCAgKk4iICAiTTgoX1IgCi1NICJKREAgIEpdIi9cQCAgSlYoICAqVTBDXyggICpMQiAgIkwoKF9SICAiSUxAICBKOiIvXEAgIEo+KCAgCi1NKktAQ18oICAqRUIgICJMIChfUiAgIkk8QCAgSlEiL1xAICBKVSggICpNUENfKCAgKkYyICAiTSgoX1IgCi1NICJLREAgIEpAIi9cQCAgSkooICAqVDBDXyggICpHIiAgIkwsKF9QICAgICJAICBKQyIvXCAgICAgSCAgCi1NKkdQQ18gICAgICYgICJQIChfUCAgICAhQCAgSzoiL1lAICBLISggICpXIFNeOCAgKyEiICAiUChcQz8wCi1NICAlUCAgICAhJFNPICAgICEkWT4zRzUuPTRZUSAgICAgICAgICAiICAiR0QgICAgICAgICAgIiAgIDBQCi1NQCAgJDEoICAhJUIgICAxTCAgICAgMCAgICZAICAgICxAICAkJCAgICAgViAgIEZcICAgICEoICAgLkAgCi1NICAgJUAgICM5ICAgICA6ICAgKkQgICAgIkAgICAnTCAgICArICAgICQgICAgITQgICAgICAgICAgWCAgCi1NKjxAICAgICIgICAgLCAgICAhMCAgICAnICAgICVYICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAwICAgICAgICAgICEgI19cMCAgICAiICAgIzQgICAgICAsICAgJCAgICAgCi1NQCAgIFogICAgICAjICAgIiAgICAgKCAgIEowICAgICAgUCAgIFAgICAgIiAgIC1EICAgICAgLCAgIDAgCi1NICAgIEAgICNYICAgICAgIyAgICUgICAgICggICEhICAgICAgIFAgICFAICAgICIgICAwNCAgICAgICwgCi1NICA8ICAgICBAICAkPiAgICAgICMgICAoICAgICAoICAiO1AgICAgICBQICAiMCAgICAiICAiRyAgICAgCi1NICAsICAgSCAgICAgQCAgSVIgICAgICAjICAgKyAgICAgKCAgKj4wICAgICAgUCAgIyAgICAgIiAgIkk4Ci1NICAgICAgLCAgIFQgICAgICAgICAgICAgICAgIyAgIC4gICAgICAgICAgICAgICAgIFAgICNQICAgICAgCi1NICAgICAgICAgICwgICEgICAgICAgICAgICAgICAgICMgICAxICAgICAgICAgICAgICAgICBQICAkQCAgCi1NICAgICAgICAgICAgICAsICAhLCAgICAgICAgICAgICAgICAjICAgNCAgICAiQCAgICAgICAgICAhICNfCi1NXDAgICAhJCAgICAgICAgICAgMCBfXyQgICAgOCAgICAgICAgICAgJCAvX1EgICAgKSAgICAgICAgICAgCi1NISAjX1wwICAgIlAgICAgICAgICAgIDAgX18kICAgIFYgICAgICAgICAgICQgL19RICAgIC84ICAhLVAgCi1NICAgUiRAICAiICAgICRGICAiSTggICAgISEkICAgVCAgICE2QCAgSjcgICAgIDAxICAgLSAgICA5OCAgCi1NIjtQICAgICAkQCAgIjAgICAmTiAgIklAICAgICBBJCAgIFQgICAiIUAgICdLICAgIEEgMiAgICggICAgCi1NQUggICpGMCAgICAkJDAgICMwICAgKTIgICJJSCAgICAhISQgICBUICAgIk1AICAkLyAgICAiMDIgICAgCi1NICAgIE1IICArIUAgICAgICQwI19cMCAgICtOICAiSUwgICAgIEEkICAgVCAgICMsQCAgJVVAICAgIygyCi1NICAgKCAgICBYSCAgKkcgICAgICgkMCAgIzAgICAuTiAgIklYICAgICEhJCAgIFQgICAjUUAgICQ+ICAgCi1NICAgMiAgICggICAgXiggICpHUCAgICAkJDAgICMwICAgMC4gICJHJCAgICAhISQgICBIICAgJCxAICBKCi1NQCAgICAgMDEgICAtICAgISkoICAqSDAgICAgKCQwICAjMCAgIDMiICAiSiwgICAgISEkICAgVCAgICRYCi1NQCAgJSNAICAgIygyICAgKCAgICEyWCAgKkkgICAgIDAkMCAgIzAgICA1SiAgIEcgICAgICAhJCBfXyQgCi1NICAlQUAgIEpIICAgICAoMSAgIC0gICAhPTggICpKMCAgICAhJDAgICMwICAgODYgICJKSCAgICAhISQgCi1NICBUICAgJi1AICBKSyAgICAgQDEgICAtICAgIUg4ICAhIkAgICAhOiRAICAgICAgIDpCICAiRyQgICAgCi1NISIkICAgSCAgICZQQCAgJkdAICAgIygyICAgKCAgICFPKCAgIVAoICAgIFIkQCAgIiAgICA9JiAgIkpUCi1NICAgICEhJCAgIFQgICAnRkAgIEpOICAgICAwMSAgIC0gICAhXSggICpFMCAgICAgJDAjX1wwICAgP04gCi1NICA1UiAgICAsQSggICBAICAgKChAICBKTyAgICAgQDEgICAtICAgIic4ICAqTDAgICAgJCQwICAjMCAgCi1NIEMyICAgOCggICAgLEEoICAgQCAgIChfQCAgSlIgICAgICgxICAgLSAgICIzSCAgIVMwICAgIFwkQCAgCi1NIiAgICBFTiAgIDFEICAgICAhKCAgICAgICApQEAgIEpTICAgICBAMSAgIC0gICAiPUggICpNMCAgICAkCi1NJDAgICMwICAgR1YgICJLOCAgICAgQSQgICBUICAgKiVAICBKVyAgICAgMDEgICAtICAgIkUoICAqTiAgCi1NICAgISQwICAjMCAgIEoqICAiS0QgICAgISEkICAgVCAgICpSQCAgSlogICAgIDAxICAgLSAgICJQKCAgCi1NKk5QICAgICQkMCAgIzAgICBNPiAgIDM4ICAgICEhJCAgIEAgICArREAgICRVICAgICAgMiAgICggICAiCi1NWyggICpPICAgICAkJDAgICMwICAgT04gICJLVCAgICAhISQgICBUICAgLDNAICBKXiAgICAgQDEgICAtCi1NICAgIylIICAhJSAgICAgICRAICAgICAgIFMiICAiTCAgICAgISEkICAgVCAgIC0lQCAgSyEgICAgIDAxCi1NICAgLSAgICMzKCAgKjxAICAgICAkMCNfXDAgICBWKiAgIkwoICAgICEhJCAgIFQgICAtWUAgIEsjICAgCi1NICAwMSAgIC0gICAjQkggICo8ICAgICAkJDAgICJAICAgWVIgICJMMCAgICAmISQgICBUICAgLkZAICBLCi1NKiAgICAhQDEgICAtICAgI0woICAqVCAgICAgIiQwICAjMCAgIFtWICAiTSQgICAgISEkICAgVCAgIC8tCi1NQCAgSzIgICAgIDAxICAgLSAgICNYWCAgIVcgICAgIFwkQCAgIiAgICBfJiAgIDhaICAgICxBKCAgIEAgCi1NICAwI0AgIElZICAgICAgMSAvX1EgICAkIyggICpUUCAgICAoJDAgICMwICAhIUogICJNNCAgICAhISQgCi1NICBUICAgMEpAICAmVCAgICAjKDIgICAoICAgJC84ICAqVUAgICAgJCQwICAjMCAgISUuICAiTTwgICAgCi1NIiEkICAgVCAgIDFAQCAgJCQgICAgICAyICAgJiAgICQ5SCAgKlYwICAgICEkMCAgIzAgICEmViAgIk1ICi1NICAgICEhJCAgIFQgICAxVUAgICUwICAgICMoMiAgICggICAkQkggICpXICAgICIwJDAgICMwICAhKSYgCi1NICA2RCAgICAsQSggICBAICAgMkVAICBMICAgICAgMDEgICAtICAgJEtYICArIEAgICAgKCQwICAjMCAgCi1NIStCICAgOUwgICAgLEEoICAgQCAgIDMsQCAgTCQgICAgIEAxICAgLSAmVFYuJkxOOTZRRiAmLVI9IyROCi1NPFAhQzxHMUkrRywgPUYlTD02NVMrNUFUK0YsIDlWMUI7NjROOFAhUzolXUQ4NzFBK0YsIDhXKVQ7QllTCi1NICc5PzhWQUE8RV1GPTZZQyAnOT88VkVHO0Y1RDdWRU49ICFWN1c1TjxWRUc7RjVEN1ZFTj0gIT85RkVOCi1NOjAhVjdXNU48VkVHO0Y1RDdWLUg4Nyk/ODcpUjg3RCA7NiVJO0AhVjdXLUk5VllFOSVdTDtWWUcgJzk/Ci1NPTZZUzo2PU45NjE/PFZBTzxHMT88Jl1JO0cxRTxAIT84VlFFODZZVTwgIT85NllEICc5Pz02WVM6Nj1OCi1NOTYxPzxWQU88RzAgPUVdVTtHLUk5VllFOSVdUzomXVI9JV1GPTZZQyAnOT85Jl1VOEZRRSAnOT86NllUCi1NICVdUz0mJVI9ICFOO1ZZUDxGRU04NylZICVdRTtHOUk8Rl1OICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1QCi1NO1ZFTj0mNVIgJzk/OjZZVDdWJVI8RiVZICchUjo2VUE8R0QgPUVdUzo2PU45NjE/OFZBQTxFXUY9NllDCi1NICc5PzkmXVU4RlFFN1YlUjxGJVkgJV1FPSY1WD0gIVY3Vy1JOVZZRTklXUM6JiVSN1YlUjxGJVkgJzk/Ci1NPTZZUzo2PU45NjE/OFZBQTxAIVY3VjlMO1YlVCAnOT88VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA4NzFFCi1NPiZFVCAmNU49RkVSO1ZYID1FXUw7VllHN1Y5VTtGLCA9RV1VO0ctSTlWWUU5JV1MO1ZZRzdWOVU7RiwgCi1NPUVdUzo2PU45NjE/PFZBTzxHMT84NylSODdEID1FXUk7RzE/PCZdSTtHMUU8QCE/OTYxQT0mJCA9RV1TCi1NOiZdUj0lXUY9NllDICc5Pz02WVM6Nj1OOTYxPzo2WVQ3ViVSPEYlWSAnOT89NllTOjY9Tjk2MT86NllUCi1NN1chTzo2WVQ5NyggPUVdSTtHMT85RzVOOFAhVjdXLUk5VllFOSVdUzomXVI9ICFWN1Y5TDtWJVQ3VjlVCi1NO0YsIDk3QUk9ICFWN1c1TjxWRUc7RjVEN1ZRTztGPT84NylSODdEID1FXUw7VllHICc5PzxWQU88RzAgCi1NPUVdTDtWWUc3VyFPOjZZVDk3KCA9RV1TOjY9Tjk2MT84VkFBPEAhVjdXNU48VkVHO0Y1RDdWUU87RjwgCi1NPUVdUzomXVI9JV1BPEcpQT4wIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZICVdTDo2KT89RjVSCi1NPFZFTztAIT87Ni1PPTZZVCAnOT84VkFBPEVdUDtWRU49JjVSICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1QCi1NO1ZFTj0mNVIgJzk/PFZFRztGNUQ3VkVOPSVdQTxHKUE+MCE/N1Y5UDxXMUE8RzAgPUVdUzo2PU45NjE/Ci1NOjZZVDdXIU86NllUOTcoIDxVXUw6NllLICVdJzMkXSIwNFE/M1Q5JjRUNTQ3VTEhMERRJTdQIVY3Vy1JCi1NOVZZRTklXVM6Jl1SPSVdUDtWRU49JjVSICc5PzkmXVU4RlFFN1chTzo2WVQ5NyggN1VdTDtWWUc5Jl1VCi1NOEZRRTdXNVM5NjAgPUVdUz0nKVU4VzBRICc5PzxXMVI9Ni1ULEAhVjdWLUg4Nyk/ODcpUjg3RCA9RV1GCi1NOyZdQT0lXVA7VkVOPSY1UiAnOT88VkVHO0Y1RDdWUU87Rj0/PCZdSTtHMUU8QCFWN1YxTz02KUw5NV1GCi1NPTZZQyAnOT88VkVHO0Y1RDdWRU49JV1GPTZZQyAlXSQ2NFkhMzRFIyAnOT85RlFPODcxPzg3KVI4N0QgCi1NPUVdUzomXVI9JV1QO1ZFTj0mNVIgJzk/PFZFRztGNUQ3VlFPO0Y9PzlHNU44UCFWN1ctSTlWWUU5JV1DCi1NOiYlUjdXIU86NllUOTcoID1FXUw7VllHN1YlUjxGJVkgJV1JO0ZFVCAnOT84VkFBPEAhQzsnNU46VjVSCi1NICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1GPTZZQyAnNT87JkVOOlAhVjdXLUk5VllFOSVdUzomXVI9JV1GCi1NPTZZQyAnLVA7VylUPFYtQTxAIVY3VzVOOjZdTixAIVY3VzVOPFZFRztGNUQ3VkVOPSVdRj02WUMgJzk/Ci1NPTZZSTtWWCAgIllJO0cxRTxHICArRkFBPFZAICtGMVk7Ry1ZOzAgTjknRU48VzFSICJZUjk2UUErRyFMCi1NPSAgTjo2WUk9ICBOPCZRVCAiWVQ5N0FUICJZRjo2WUkgIllEODcxQSAiWUc7VzAgK0YxWTtGJU06NiwgCi1NK0YpUzxQIE48V0VNPSYlQiAiWVM9JylUODYoICtHIUU8VjVMICJZUzonLVQ8RzFBOEAgTjhWXU07NjVOCi1NPSAgTjkmNUI9NjwgK0ZRSTtGNCAwIkBDKjZRSThGLE07MyxSLkZUVCtGMUU5QERRK0MwIDAiQEMqNlFJCi1NOEYsTTszLFIuRi1TPTJdQzxHMFErRywpLDJYUS4gICAgICEgKiIsSTsmRUI4UlVNLFMoWjszME45JjVGCi1NIjMkTi0gISAqIixJOyZFQjhSVU0sUyhaOFctVStWLVI9JkROPFBEUStDLCA4NyxaKCJBIzElLEkoIzROCi1NLCIgUStTKE8uMyAgICAgIDAiQEMqNlFJOEYsTTszLFIuRlRUK0YxRTlARFErQzAgMCJAQyo2UUk4RixNCi1NOzMsUi5GLVM9Ml1DPEcxTitHLCksMlhWICIhTDkiIFooIkEjMSUsSSgjNE4sIiBRK1MoTy4zICAgICAgCi1NICJYICQwIDIgICA2PCAgWDlWMUI7NjROOFAgIS1AICAgICQhJDggICEtUCEoOCAgIjtQISFAICAgICAgCi1NICAgPSAhLCAkQCAgIDRYIC4nMT88VzFSPTYtVCAgIlYgICAgJiAgICAiSCAjMCAyICAgID0wIFg9RV1DCi1NOiYlUjdWVUU7NilFPEAgIDUwICEgIiwgIUAwICAgICAhUCAgICJMICMwIDIgICAgSCAgWD1FXVM6Jl1SCi1NPSVdTTk2VUI5NyggICU0ICEgIEMgIDgkICAgICBAPCAgICBJICBUICRAICAgLEQgLic5Pzo2WVQ3VlVFCi1NOzYpRTxAICA1MCAnICIsICFAMCAgICAkIVAgICAiSCAjMCAyICAgIFxQIFg9RV1MO1ZZRzdWVUU7NilFCi1NPEAgIDUwICogIiwgIUAwICAgICghUCAgICJMICMwIDIgICAhJ0AgWD1FXUY7Jl1BPSVdTTk2VUI5NyggCi1NICU0ICNAIEMgIDgkICAgICMgPCAgICBMICBUICRAICAgNEggLic5PzkmXVU4RlFFN1ZVRTs2KUU8QCAgCi1NNTAgLyAiLCAhQDAgICAgMCFQICAgIDAgICAgOyAhLCAkQCAgIEZQIC4nWFA5RiVLOTAgIE1AICAgIUAgCi1NICAgSiAgVCAkQCAgIDksIC4nOT84VkFBPEVdTTk2VUI5NyggICU0ICAwIEMgIDgkICAgICAgPCAgICBLCi1NICBUICRAICAgO1ggLic5PzxWQU88RzE/OzY1TThGNVIgICE1ICAwIChQICYhICAgICAoJyAgICAqMCAtCi1NICEoICAgJ0cgI0FWN1ZFTj0lXU05NlVCOTcoICAlNCAhUCBDICA4JCAgICAhIDwgICAgSiAgVCAkQCAgCi1NIEEkIC4nOT87Jl1OOVVdTTk2VUI5NyggICU0ICJAIEMgIDgkICAgICIgPCAgICBLICBUICRAICAgQ1AgCi1NLic5PzlGUU84NzE/OzY1TThGNVIgICE1ICBYIChQICYhICAgICBQJyAgICArICAtICEoICAgKUggI0FWCi1NN1YxTz02KUw5NV1NOTZVQjk3KCAgJTQgI1AgQyAgOCQgICAgJCA8ICAgICQgICAgJyAgNyAhKCAgIC4rCi1NICNBVDdXNU46Nl1OICAiViAgICAiICAgICJIICMwIDIgICAiTEAgWD1FXUM6JiVSN1ZVRTs2KUU8QCAgCi1NNTAgISAiLCAhQDAgICAgICFQICAgIkwgIzAgMiAgICJXMCBYPUVdUzomXVI9JV1NOTZVQjk3KCAgJTQgCi1NISAgQyAgOCQgICAgICA8ICAgIEkgIFQgJEAgICBQOCAuJzk/OjZZVDdWVUU7NilFPEAgIDUwICcgIiwgCi1NIUAwICAgICAhUCAgICJIICMwIDIgICAjLCAgWD1FXUw7VllHN1ZVRTs2KUU8QCAgNTAgKiAiLCAhQDAgCi1NICAgICFQICAgIkwgIzAgMiAgICM2UCBYPUVdRjsmXUE9JV1NOTZVQjk3KCAgJTQgI0AgQyAgOCQgICAgCi1NICA8ICAgIEwgIFQgJEAgICBYPCAuJzk/OSZdVThGUUU3VlVFOzYpRTxAICA1MCAvICIsICFAMCAgICAgCi1NIVAgICAgMCAgICA7ICE8ICRAICAhKkQgLidYUTlGJUs5MCAgTUAgICAgQCAgICBKICBUICRAICAgXSAgCi1NLic5PzhWQUE8RV1NOTZVQjk3KCAgJTQgIDAgQyAgOCQgICAgICA8ICAgIEsgIFQgJEAgICBfTCAuJzk/Ci1NPFZBTzxHMT87NjVNOEY1UiAgITUgIDAgKFAgJiEgICAgICAnICAgICowIC0gISggICAwRCAjQVY3VkVOCi1NPSVdTTk2VUI5NyggICU0ICFQIEMgIDgkICAgICAgPCAgICBKICBUICRAICAhJFggLic5PzsmXU45VV1NCi1NOTZVQjk3KCAgJTQgIkAgQyAgOCQgICAgICA8ICAgIEsgIFQgJEAgICEnRCAuJzk/OUZRTzg3MT87NjVNCi1NOEY1UiAgITUgIFggKFAgJiEgICAgICAnICAgICsgIC0gISggICAyRSAjQVY3VjFPPTYpTDk1XU05NlVCCi1NOTcoICAlNCAjUCBDICA4JCAgICAgIDwgICAgJCAgICAqQCAmICEoICAgMzcgI0FWN1YtSDg3KT85RzVOCi1NOFAgIDUwICEgMSYgICAzPCAyJiAgIDQuICAgICEgICAgIyQgIUAgMiAgICUjICBYPUVdUzo2PU45NjE/Ci1NOFZBQTxFXUY9NllDICAhNSAgKCEkOCAgITBYISg4ICAhNCAgICAgJCAgICAsUCAmICEoICAgNSMgI0FWCi1NN1c1TjxWRUc7RjVEN1YtSDg3KT85RzVOOFAgIDUwICMgMSYgICA1ICAyJiAgIDVSICAgICEgICAgIkwgCi1NIUAgMiAgICU8QCBYPUVdUzomXVI9JV1GPTZZQyAgITUgIDAhJDggICE3KCEoOCAgITowICAgICQgICAgCi1NLEAgJiAhKCAgIDZIICNBVjdXLUk5VllFOSVdUzomXVI9JV1GPTZZQyAgITUgIDQhJDggICE6MCEoOCAgCi1NIT04ICAgICQgICAgLSAgJiAhKCAgIDdAICNBVjdXNU48VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCAgJTQgCi1NIUAkMUAgICVVQCRBQCAgJiIgICAgIDAgICAgSSAgOCAkQCAgIUBUIC4nOT86NllUN1Y5VTtGLCAgJTQgCi1NIVAkMUAgICYiICRBQCAgJi5AICAgIDAgICAgUCAgOCAkQCAgIUQkIC4nOT88VkVHO0Y1RDdWRU49JV1GCi1NPTZZQyAgITUgIEAhJDggICFDSCEoOCAgIUZQICAgICQgICAgLEAgJiAhKCAgIDlXICNBVjdXNU48VkVHCi1NO0Y1RDdWRU49JV1GPTZZQyAgITUgIEQhJDggICFGUCEoOCAgIUlYICAgICQgICAgKkAgJiAhKCAgIDpFCi1NICNBVjdWUU87Rj0/OUc1TjhQICA1MCAqIDEmICAgOj4gMiYgICA7MCAgICAhICAgICMkICFAIDIgICAmCi1NVkAgWD1FXVM6Nj1OOTYxPzsmXU45VV1GPTZZQyAgITUgIEwhJDggICFNICEoOCAgIVAoICAgICQgICAgCi1NLFAgJiAhKCAgIDwxICNBVjdXNU48VkVHO0Y1RDdWUU87Rj0/OUc1TjhQICA1MCAsIDEmICAgPCIgMiYgCi1NICA8VCAgICAhICAgICJMICFAIDIgICAnMCAgWD1FXUY7Jl1BPSVdRj02WUMgICE1ICBYISQ4ICAhUzAhCi1NKDggICFXICAgICAkICAgICsgICYgISggICA9UCAjQVY3VjFPPTYpTDk1XUY9NllDICAhNSAgXCEkOCAgCi1NIVcgISg4ICAhWlAgICAgJCAgICAlMCA1ICEoICAgPk4gKCwgITAkICAgP0ogICAgJTAgJSAhKCAgID46Ci1NICgsICEwJCAgID9KICAgICQgICUgISggICA+SiAlNCAhUCAgICAwICAgIFwgICQgJEAgICFeSCBFMCAgCi1NICosICogICAiICAgICAgICAgICAgICAoICAgICAgICAgICQgICBAICAgICAgICAgIEBAIDxAICAgIlggCi1NICAgOSAhLCAkQCAgIidMIC4mUUk7RkwgICs4ICAgIjggICAgKUAgLSAhKCAgIEBJICNBTjk3QVQgICIjCi1NICA0ISAgICdaQCBDICA4JCAgICAgIDwgICAgSiAgVCAkQCAgIiUsIC4mUUk7Rk1GPTZZQyAgIiMgIDQhCi1NICAgJzwgIEMgIDgkICAgICEgPCAgICBEICBUICRAICAiJzwgLictVD02OUYgICFSICAgJ0tAIEMgIDgkCi1NICAgICIgPCAgICAkICAgICUwIDUgISggICBCWSAoLCAhMCQgICA/SiAgICAlMCAlICEoICAgQkUgKCwgCi1NITAkICAgP0ogICAgJCAgJSAhKCAgIEJVICU0ICFQICAgIDAgICAgXCAgJCAkQCAgIi80IEUwICAgKiwgCi1NKiAgICIgICAgICAgICAgICAgICggICAgICAgICAgJCAgIEAgICAgICAgICAgQEAgPEAgICAiWCAgICA8Ci1NICE8ICRAICAiOEQgLicxVTdWUUk7RkwgICs4ICAgIjAgICAgKUAgLSAhKCAgIERXICNBTjk3QVQgICIjCi1NICA0ISAgICdaQCBDICA4JCAgICAgIDwgICAgSiAgVCAkQCAgIjYkIC4mUUk7Rk1GPTZZQyAgIiMgIDQhCi1NICAgKD5QIEMgIDgkICAgICAgPCAgICBEICBUICRAICAiODQgLictVD02OUYgICFSICAgKE4wIEMgIDgkCi1NICAgICAgPCAgICAkICAgIC5AICQgISggICBHJyAjQV4sRjlBOlY0ICArOCAgICAkIC8sICZQICAgIClCCi1NOyc1RSAgICAgICVHPEY1RTtAICAgICAgPEY1RCAgICAgIDAgICAgXiAgMCAkQCAgIkBEIC4mLU87Jl1SCi1NPFAgIE1AICAgIDAgXFAgPyAgICAgRyFJO0ZMICAgICAgNyFVPEchTDkwICAgICAgPjY1TDsmXVcgICAgCi1NICAwICAgIFIgIDAgJEAgICJDXCAuJ1hTOUYlSzkwICBNQCAgICAwIFxQIDMgICAgIDY5TzxGMCAgICAgCi1NICYtSDk3OVkgICAgICAwICAgIFEgIDAgJEAgICJHMCAuJi1BPEcsICArOCAgICAkIC8sICUgICAgICVQCi1NO1cpUzhWQUUgICAgICAhQjs3PCAgICAgISAgICAjKCAhICAyICAgKkpAIFg/QzFGODZNRSAgIlYgICAgCi1NISAjUyAhLCAgICAhNSUpNTEwICAgICAgMUQlLDRUNCAgICAgISAgICAhUCAlQCAyICAgKlFAIFg4Rl1PCi1NOyY1QTtAICA8QCAgIkcwICAgIFEgIDAgJEAgICJPTCAuJilWODZRUyAgIlYgICAgISAjUyAhLCAgICAhCi1NPScpVTkwICAgICAgOUYlTDxWNCAgICAgISAgICAhVCAlQCAyICAgKyYgIFg4Rl1POyY1QTtDKCAgJyggCi1NICBLJiAgICAxQCAkICEoICAgTUIgI0FNOjctTzxGMUU8RjVEICAiViAgICAhICNTICIsICAgICM9JkFSCi1NOTY0ICAgICAgJ0lFPEZcICAgICAgNl1OOTAgICAgICI9Jz1PICAgICAgMCAgICBDICA4ICRAICAiWEQgCi1NLiZVQTo2WCAgJTQgIVAkMUAgICdLICRBQCAgKU8gICAgIDAgICAgRyAgPCAkQCAgIlsgIC4nLVA7VylUCi1NPFYtQTxAICA8QCAgIkNcIChQICUgWCAgKyAgICAgIEUgIDwgJEAgICJdNCAuJi1MPTZZSzk3KCAgJyggCi1NICBIKSAiLCAhMC4gICJNSCAgICAqICAnICEoICAgT10gI0FOO1ZZUDxGRU04NylZICAhUiAgIClRUCBDCi1NICA0I0AgIEo/ICAgICI0ICFQIDIgICAsKEAgWDwnKUk7NiVSPjAgIDxAICAiOEQgKFAgJSBYICAqSFAgCi1NICAgRCAgPCAkQCAgIyQ4IC4nNT87JkVOOlAgIDxAICAiLzQgKFAgJSBYICAqVyAgICAgRyAgPCAkQCAgCi1NIyZUIC4nLT87JkVOOlAgIEBQICUgMCAgIV5IIChQICUgWCAgKlAwICAgIEYgIDwgJEAgICMpLCAuJzk/Ci1NPTZZSTtWWFIgICFSICAgI0JQIEMgIDQjQCAgTCIgICAgIjQgIVAgMiAgICxOICBYPUVdVTtGRU87QCAgCi1NPEAgICBGUCAoUCAlIFggICshICAgICBHICA8ICRAICAjLVwgLic5PzxXMVI9Ni1ULEAgIDxAICAgNFggCi1NKFAgJSBYICAqUkAgICAgRyAgPCAkQCAgIzA4IC4nOT88VzFSPTYtVCwwICA8QCAgICJYIChQICUgWCAgCi1NKlEgICAgIE8gIDwgJEAgICMzNCAuJzk/OSZdVThGUUU3VyFPOjZZVDk3KCAgJiwgIFAkICNQIEMgIDQjCi1NQCAgSyMgICAgIlggIVAgMiAgIC04UCBYPUVdRjsmXUE9JV1QO1ZFTj0mNVIgICFDICAsISAgWCAoUCAlCi1NIFggICpUMCAgICBWICA8ICRAICAjOUQgLic5Pz02WVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIgICFDCi1NICAsISAgUCAoUCAlIFggICpIICAgICBUICA8ICRAICAjPFQgLic5PzxWRUc7RjVEN1ZRTztGPT88Jl1JCi1NO0cxRTxAICA4UCAjIDAgKyAiLCAhMC4gICJNKCAgICArMCAnICEoICAgV1ogI0FWN1ZRTztGPT88Jl1JCi1NO0cxRTxAICA4UCAjIDAgKiAiLCAhMC4gICJLPCAgICAtMCAnICEoICAgWE8gI0FWN1c1TjxWRUc7RjVECi1NN1ZFTj0lXVA7VkVOPSY1UiAgIUMgICwhICBEIChQICUgWCAgKkwwICAgIFMgIDwgJEAgICNGKCAuJzk/Ci1NPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICAhQyAgLCEgIEAgKFAgJSBYICAqUCAgICAgTCAgPCAkQCAgCi1NI0hYIC4nOT86NllUN1chTzo2WVQ5NyggICYsICBQJCAhUCBDICA0I0AgIEpOICAgICM8ICFQIDIgICAuCi1NUTAgWD1FXVU7Ry1JOVZZRTklXVM6Jl1SPSVdUDtWRU49JjVSICAhQyAgLCEgIDggKFAgJSBYICAqRkAgCi1NICAgVSAgPCAkQCAgI09IIC4nOT88VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQ5NyggICYsICBQJCAhMCBDCi1NICA0I0AgIEsiICAgICJYICFQIDIgICAvKiAgWD1FXVM6Jl1SPSVdUDtWRU49JjVSICAhQyAgLCEgIDAgCi1NKFAgJSBYICAqVTAgICAgViAgPCAkQCAgI1VYIC4nOT89NllTOjY9Tjk2MT84VkFBPEVdUDtWRU49JjVSCi1NICAhQyAgLCEgICwgKFAgJSBYICAqTzAgICAgVCAgPCAkQCAgI1koIC4nOT88VkVHO0Y1RDdWLUg4Nyk/Ci1NPCZdSTtHMUU8QCAgOFAgIyAwICIgIiwgITAuICAiTTggICAgKzAgJyAhKCAgIF5fICNBVjdWLUg4Nyk/Ci1NPCZdSTtHMUU8QCAgOFAgIyAwICEgIiwgITAuICAiS1AgICAgKSAgISAhKCAgIF9DICk0ICAgIkMgISAgCi1NICBAICAgICAgICAgIDBAIDUwIC8gICAgKyAgJyAhKCAgISAvICNBVjdWMU89NilMOTVdQTxHKUE+MCAgCi1NPEAgICNbXCAoUCAlIFggICpJICAgICBEICAkICRAICAkIywgRTAgICAqLCAkICAgIiAgICAgICAgICAhCi1NIiAhNSAgWCAgICBLICA8ICRAICAkJVggLic5PzlGUU84NzE/ODcpUjg3RCAgJyggICEgLyAiLCAhMC4gCi1NICJNLCAgICApICAhICEoICAhIiIgKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgLCAgICAsUCAnCi1NICEoICAhIlUgI0FWN1c1TjxWRUc7RjVEN1ZRTztGPT84NylSODdEICAnKCAgISE+ICIsICEwLiAgIkssCi1NICAgICkgICEgISggICEjOSApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCArICAgICwwICcgISggCi1NICEkKiAjQVY3Vy1JOVZZRTklXUw7VllHN1YlUjxGJVkgICFSICAgME0wIEMgIDQjQCAgSksgICAgIjAgCi1NIDAgMiAgIDErQCI1ICAgIEhQIDAgICAoICAgICAgICAgICQoICU0ICJAICAgIkggIVAgMiAgIDE2ICBYCi1NPUVdTDtWWUc3ViVSPEYlWSAgIVIgICAxIkAgQyAgNCNAICBLNyAgICAiMCAgMCAyICAgMT8gIjUgICAgCi1NSFAgMCAgICggICAgICAgICAgJCggJTQgIjAgICAjKCAhUCAyICAgMUtAIFg9RV1VO0ctSTlWWUU5JV1JCi1NO0cxPzg3KVI4N0QgICcoICAhJTggIiwgITAuICAiSlwgICAgKSAgISAhKCAgIScyICk0ICAgIkMgISAgCi1NICBAICAgICAgICAgIDBAIDUwICggICAgLCAgJyAhKCAgISgiICNBVjdXLUk5VllFOSVdSTtHMT84NylSCi1NODdEICAnKCAgISZOICIsICEwLiAgIktYICAgICkgICEgISggICEoRiApNCAgICJDICEgICAgQCAgICAgCi1NICAgICAwQCA1MCAnICAgICowICcgISggICEpLyAjQVY3VkVOPSVdQTxHKUE+MCAgPEAgICRAKCAoUCAlCi1NIFggICpIMCAgICBEICAkICRAICAkRywgRTAgICAqLCAkICAgIiAgICAgICAgICAhIiAhNSAgOCAgICBUCi1NICA8ICRAICAkSjwgLic5Pz02WVM6Nj1OOTYxPzxWQU88RzE/ODcpUjg3RCAgJyggICEpLyAiLCAhMC4gCi1NICJLTCAgICApICAhICEoICAhKysgKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgJSAgICAsQCAnCi1NICEoICAhK10gI0FWN1ctSTlWWUU5JV1TOiZdUj0lXUE8RylBPjAgIDxAICAkSjwgKFAgJSBYICAqSzAgCi1NICAgRCAgJCAkQCAgJFIkIEUwICAgKiwgJCAgICIgICAgICAgICAgISIgITUgIDAgICAgSyAgPCAkQCAgCi1NJFRQIC4nOT88VkFPPEcxPzg3KVI4N0QgICcoICAhK10gIiwgITAuICAiS0ggICAgKSAgISAhKCAgIS1QCi1NICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIDUwICMgICAgLFAgJyAhKCAgIS5DICNBVjdXNU48VkVHCi1NO0Y1RDdWLUg4Nyk/ODcpUjg3RCAgJyggICEtLCAiLCAhMC4gICJJQCAgICApICAhICEoICAhLycgKTQgCi1NICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgIiAgICAsMCAnICEoICAhL1ggI0FWN1ctSTlWWUU5JV1DCi1NOiYlUjdWJVI8RiVZICAhUiAgIDNIUCBDICA0I0AgIEpIICAgICIwICAwIDIgICA0JyAiNSAgICBIUCAwCi1NICAgKCAgICAgICAgICAkKCAlNCAgMCAgICJIICFQIDIgICA0MUAgWD1FXUM6JiVSN1YlUjxGJVkgICFSCi1NICAgM14gIEMgIDQjQCAgSzAgICAgIjAgIVAgMiAgIDQ6QCBYPUVdRDtXNUI7JjQgICU0ICNQIEMgIDQjCi1NQCAgSjwgICAgIiwgIVAgMiAgIDRDMCBYPUVdRjsmXUE9ICAgNTAgLiAiLCAhMC4gICJKSCAgICAqUCAnCi1NICEoICAhMlggI0FWN1c1TjxWRUc7RjVEN1ZRTztGPCAgJTQgIyAgQyAgNCNAICBKWSAgICAiRCAhUCAyCi1NICAgNFgwIFg9RV1TOjY9Tjk2MT87Jl1OOVAgIDUwICsgIiwgITAuICAiSUQgICAgKEAgJyAhKCAgITQjCi1NICNBVjdWUU87RjwgICU0ICJAIEMgIDQjQCAgSlUgICAgIkggIVAgMiAgIDUrMCBYPUVdVTtHLUk5VllFCi1NOSVdSTtHMCAgJTQgIjAgQyAgNCNAICBKNyAgICAiQCAhUCAyICAgNTUwIFg9RV1TOjY9Tjk2MT86NllUCi1NICAhNSAgQCAoUCAlIFggICpFQCAgICBBICA8ICRAICAlNzggLic5Pzo2WVQgICE1ICA8IChQICUgWCAgCi1NKkdAICAgIEwgIDwgJEAgICU6KCAuJzk/PTZZUzo2PU45NjE/PFZBTzxHMCAgJTQgIUAgQyAgNCNAICBKCi1NOyAgICAiSCAhUCAyICAgNVMgIFg9RV1TOjY9Tjk2MT88VkFPPEcwICAlNCAhMCBDICA0I0AgIEpSICAgCi1NICIsICFQIDIgICA1W1AgWD1FXVM6Jl1SPSAgIDUwICQgIiwgITAuICAiSzggICAgKlAgJyAhKCAgITg6Ci1NICNBVjdXNU48VkVHO0Y1RDdWLUg4NyggICU0ICBQIEMgIDQjQCAgSkkgICAgIkQgIVAgMiAgIDYwUCBYCi1NPUVdUzo2PU45NjE/OFZBQTxAICA1MCAiICIsICEwLiAgIktAICAgIChAICcgISggICE5RSAjQVY3Vi1ICi1NODcoICAlNCAgMCBDICA0I0AgIEs5ICAgICAwICAgICcgICAgICAgIkRIICAhLVAgICAhWV9fXCAgICAgCi1NICAgID5PX18gICAgLEAgICAnT19fUCAgICYwICAgIV1fX1wgICAiNiAgICA/T19fICAgIFIgICAgJ19fCi1NX1AgICAvSCAgICIhX19cICAgJEwgICAgQE9fXyAgICE3QCAgICgvX19QICAgOSAgICAiJV9fXCAgICciCi1NICAgIEFPX18gICAhXSAgICAoP19fUCAgIEI4ICAgIilfX1wgICApOCAgICBCT19fICAgIkUgICAgKytfCi1NX1AgICBNICAgICJVX19cICAgK0YgICAgTU9fXyAgICJbICAgICs/X19QICAgTzAgICAiWV9fXCAgICtcCi1NICAgIE5PX18gICAjISAgICArT19fUCAgIFBQICAgIl1fX1wgICAsNCAgICBPT19fICAgIydAICAgK19fCi1NX1AgICBSQCAgICMhX19cICAgLFIgICAgUE9fXyAgICMvICAgICwvX19QICAgVDggICAjJV9fXCAgIC0wCi1NICAgIFFPX18gICAjNkAgICAsR19fUCAgIFZYICAgIypfX1wgICAtWCAgICBSX19fICAgI0BAICAgLFdfCi1NX1AgICBYUCAgICMuX19cICAgLjYgICAgU19fXyAgICNIICAgIC0nX19QICAgWkggICAjMl9fXCAgIC5UCi1NICAgIFRfX18gICAjT0AgICAtN19fUCAgIFxAICAgIzZfX1wgICAvMiAgICBVX19fICAgI1cgICAgLUdfCi1NX1AgICBeOCAgICM6X19cICAgL1AgICAgVy9fXyAgICQhICAgIC1XX19QICAhIFggICAjPl9fXCAgIDA4Ci1NICAgIFgvX18gICAkKEAgICAuJ19fUCAgISJQICAgI0JfX1wgICAwViAgICBZL19fICAgJDAgICAgLjdfCi1NX1AgICEkSCAgICNGX19cICAgMTQgICAgWi9fXyAgICQ3QCAgIC5HX19QICAhJkAgICAjSl9fXCAgIDFSCi1NICAgIFsvX18gICAkPyAgICAuV19fUCAgISg4ICAgI09fX1wgICAyMCAgICBcL19fICAgJEZAICAgLydfCi1NX1AgICEqMCAgICNSX19cICAgMk4gICAgXS9fXyAgICROICAgIC87X19QICAhLCggICAjV19fXCAgIDMsCi1NICAgICAvX18gICAkWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAkICAgICEgICAgIEggICAtMCAgICM0ICAgICRQICAgICAgICAgICAgICAgMCAgCi1NICAgICAgICkgICAgITAgICAgKiAgICNIICAgIFogICAgO1AgICAgIyAgICAgICAgICAwICAgICQgICAgCi1NI1AgICAgTCAgICAiQCAgIkkgICAgSjAgICAjICAgICAhICAgICAkICAgICQgICAgJCAgICAhPCAgICAjCi1NICAgICBIICAgVjAgICAtRCAgICA+UCAgICAgICAgICAgICAgIDAgICAgICAgICA/ICAgICEgICAgICogCi1NICAvQCAgICNYICAgICMgICAgICMgICAgIVAgICAgMCAgICAsICAgICowICAgICQgICAgJkAgICQkICAgCi1NISEgICAgICQgICAgICAgICAgICAgICAkICAgICAgICAgIlwgICAgISAgICAhSCAgISEwICAgMDQgICAgCi1NOSAgICAgICAgICAgICAgICEgICAgITAgICAgVCAgICAgMCAgICA6ICAgMVggICAkPiAgICE0MCAgICAgCi1NICAgICAgICAgIDAgICAgICAgICAuQCAgICAkICAgICZAICApTyAgICI7UCAgICAkICAgICAgICAgICAgCi1NICAgJCAgICAgICAgICQgICAgICEgICAgIFggICo8ICAgIEcgICAgICIgICAgICAgICAgICAgICAhICAgCi1NICAgICAgISYgICAgIDAgICAgLiAgIkcoICAgKVIgICAgIVAgICAgICAgICAgICAgICAwICAgICQgICAgCi1NMlAgICAgOCAgICAjQCAgSVkgICAiPjAgICAhUCAgICAhICAgICAgICAgICQgICAgIiAgICAlMCAgICAoCi1NICAgICBYICAqRUAgICBJOCAgICFQICAgICAgICAgICAgICAgIiAgICAgICAgICE5ICAgICBAICAgICAgCi1NICAgICAgICo2ICAgIVAgICAgIC8gICAgJyAgICAgMCAgICAwICAgIDgwICAgICwgICAgICAgICAgICAgCi1NJDVAICAgMzQgICAgICAgICAgICAgICAhICAgICAgICAgJkQgICAgIyAgICAgICAgICAgICAhOEwgICAgCi1NICAgICAgICAgICAgICAgICEgICAgICAgICAhUCAgICAgUCAgICAgICAgICAgICA2KyAgICApICAgICAgCi1NICAgICAgICAgICQgICAgICAgICA+QCAgICAkICAgICAgICAgICAgICVLUCAgICMvICAgICAgICAgICAgCi1NICAgJCAgICAgICAgICgsICAgICEgICAgICAgICAgICAgIT4sICAgNjwgICAgICAgICAgICAgICAhICAgCi1KICAgICAgIiogICAgIDAgICAgICAgICAgICAgTV8gICAgSTAgICAgICAgICAgICAgICAwICAgICAKLSAKLWVuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9taXBzLWVjb2ZmLnUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL21pcHMtZWNvZmYudQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmNjU2YS4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL21pcHMtZWNvZmYudQorKysgL2Rldi9udWxsCkBAIC0xLDY3MSArMCwwIEBACi1iZWdpbiA3NzcgbWlwcy1lY29mZgotTSA2ICAiMkc8XyUwICAjICAgICAgOCAgWCAgPCEiUCgqICAgQCAgICAkICAgICk9ICAkICFQICEgICAgMAotTSAgICAkICAwIC8vX19fWCAgICAgICAgLVQgICAgICAgICAgICQgIipAIllUOTdBVCAgICAgJCAhUCAhIAotTSA8ICAgIUUwICAgIVAgICAgICAgICAgICAgICAgICAgICIgTjo2WUk9ICAgICAhICZRICAwIUwwICAgIAotTSggICAmUSAgICAgICAgICAgICAgICAiICAgICArRjFBPSYkICAgIDAgICAgJCAgICAgICAiSSAgICIgIAotTSAgICAgICAgICAgICAgICAgICAgMCJZTDo3MFggICAgJCAgKkQhICAiSSAgICAgMCAgIEpEICAgICAgIAotTSAgICAgICAgICBAICAgIE47JkVULSAgICAhICAiSiAwICBKQCAgICAkICAgKkogICAgICAgICAgICAgIAotTSAgIDAgICAgK0ctRDg3MUEgICAwICBKUCQgICpMICAgICYgICAiSlAgICAgICAgICwgICAgICAgICAgIgotTSAiWVM4Ry1TICAgICQgICskISAgIlEgICAgJSAgICAgICAgICAgICAgIyAgICAgICAgICAhICBOOEctUwotTSAgICAgISAgIyUgMCAgUTAgICI6XCAgICAgICAgICAgICAgICAgICAgICAgICAiIDxHLVI4UCAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICheRAotTSAgIFwnISAhKVo0ICEiPjxCSCBESUAgJCAgMDBAKl4lQDkwIFBDIEEpW1dfWipeJkAjIk9IICA0ICAjUAotTSgwUDAhTD5PQSgmMCMhICE5ICAgICAgLCQgJUggICBAKDheJEA5Ii9BOCY0Q1g6ICwgUDAgLkwgICAgIAotTSMhICFJICEgKCIkICAgIC0gXiAgIiAgICAgIEdPMCAoIF4gICIgIEBeIiQjWCAgKCAgICAgICAgICAgIAotTSAgICAgICAgICAvQCAgQCAgISBBIF4gICIgICAgICAjWCAgKCAgICAgIC9AICBAICAhIEEgXiAgIiAgIAotTSAgICNYICAoICAgICAgL0AgIEAgICEgQSBeICAiICAgICAgI1ggICggICAgICAvQCAgQCAgISBBIF4gIAotTSIgICAgICAjWCAgKCAgICAgIC9AICBAICAhIEEgXiAgIiAgICAgICNYICAoICAgICAgL0AgIEAgICEgQQotTSBeICAiICAgICAgI1ggICggICAgICAvQCAgQCAgISBBIF4gICIgICAgICAjWCAgKCAgICAgIC9AICBAIAotTSAhIEEgXiAgIiAgICAgICNYICAoICAgICAgL0AgIEAgICEgQSBeICAiICAgICAgI1ggICggICAgICAvQAotTSAgQCAgISBBIF4gICIgICAgICAjWCAgKCAgICAgIC9AICBAICAhIEEgXiAgIiAgICAgICNYICAoICAgIAotTSAgL0AgIEAgICEgQSBeICAiICAgICAgI1ggICggICAgICQyICAgICNYICAoICAgICAgL0AgIEAgICAgIAotTSBeICAiICAgICAhJEAgICAxKCAoICAvQCAgQCAgICAgIF4gICIgICAgICAjWCAgKCAgICAgKi4gQCkgRAotTSNAICFIWFogRDIwLyAgKkNDWCIyKSFAICBaPjhAKTBEJjAgJElZRiBFQjAoICA2R0IoIjgpIEQgIUpeKQotTUApUEQiQCAnS1hKIEgiMCsgIEJPQlgiRCkgUCAiOl4sQCpARCMwICpLWFYgSyIwLiAgTk9DSCJQUVgyIAotTSggICAgICNHQSgiVFFYPiAkLD4mQCEzR0FYIlhZWDogTykuL0ApICAgICAgSFheIFApLjhAKSQgICAgIAotTUhZQiBQSS45QCkoICAgICBIWUYgUSg+KEApMCAgICAgSVhCIFIoPilAKTggICAgIElYRiBTKT4qQClAIAotTSAgICBJWEogVCheK0ApUCAgICAgS1hOIFYoXixAKiAgICAgIEtYUiBYKF4tQCowICAgICBLWFYgWiheLgotTUAqQCAgICAgS1haIFwoXi9AKlAgICAgIEtYXiBeKF44QCsgICAgICBLWUIhICw+KEArMCAgICAgWVhCIQotTSIsPitAK0MnQkgiXC8gJDAgLjBLOF8jRCpGL1QpWUYgRCpeOUAxIEdCKCIxS1hCISUiPilAKSpPQjgkOAotTSlYSiBFKl4qQDFQR0JYIjZLWE4hKCI+LEApQk9DKCREKVhWIEcqXi1AMkBHQ0giQEtYWiErIj4vQCoyTwotTUNYJFApWUIgSipeOEAzMEdGOCJMS1lGIS4iPihAKyJPQigkXClYRiBNKl4pQDQgR0JIIlhLWEohMSIwKwotTSAgKk9CWCU8KSBQICBKXixANiBEIzAgIUtYViE6IjAuICAmT0NIJURDWF4hNiNQISQgIkwrVixQQVlCIQotTTIgICAgICJHRiglMCBeICAiICAgJCIkI1ggICggICAgICAgICAgICNYICAoICAgICAgICAgICAgICAgIAotTSlbV100ICIgJiIkRCNPX19LW1wgJyExQCAhJk9LQCBELyAwMCAgUDAgOzBEQSAoJCQkICAhMCEgJiImMAotTTNQICAgICAgICE3QCAgQCAgICAgRFlCIDAgICAgICAzICAgIyAgICAgISAgICIsICAhIEEpWC4gMSNQJQotTSQgIkNAKCEgKSo0IiQiPkQgQyAsJCAnVEtaLCJMKF5DIEsgR0kgKF4jISAhXSAhQCoiJEdJIChQIyEgIgotTSggICAqIiQkMCAgMSAkIEAoMj5FICJQRCFAKCIjISAiKipeRCAiQEQgMCgiJSQkICIoXkQgIkBcISEgIAotTSkoMCAgIj5FICJQLCQgKFApIDgiIEpeQCAiMi9JICBIIyEgIl0gICAgICIvSEAgRCAgICAgKF5fICFQRwotTU8wKlAgXiAgIiAgICAgICAgICAgKVtXX1gqXl8gIVAsJCAsLktaMCAoIFAwIFJAICAgICBDWjAgKCBQMAotTSE0UCAgICAgQ1tcICciPl0gIiAjWCAgKCAgICAgICAgICAgICAgICAgICAgICI+XV9eIi9ASCBQS1skIAotTSYqXlAgITAgQChAQUtbXCAnITEgICAsIDAoIEEkICAgJTAgICQiJi9DSCBQICAgICAoVy8gICAgICAgIAotTSQ+ICAjUCAgJCImLiEwICAgICAgICAoQCgiJCwkICc3KUEgICEhISAgICwgMCFAQSQgICAhQCFAJCImLgotTSEwICAgICAgICEyQF9fPCIoIiBBICAgMCg4Xl8gIVIvTCAgNENbJCAmIC9AICBAR08wIEBEKiggICkiIwotTSAgIERJMCAhJCQsICEiMCYgI1QwICAgLCkgOCAvMjAmICNUIDghIEElJDggIFIyJCAgJCNYICAoICogMAotTSg5IkIgICIwQFAgICkqNCAgMSEjX19AIDghIEElJiAgIiAgICQiJjBLT19fICAgICAhMy4gIDAgICEgQQotTSBeICAiICJAJCIkICAhIEEgXiAgIiAgICAgICBAISBBQCpAICAjMi0gICwxICAgRCA6MVAoSCJJICAkIAotTUtHQEAkMiAgJ1AgICAgIiBKQCAiICAgICAhJSAgIUooSyAgIEAqTCAgWUJMICAsMTggIDRKKFAgICImRAotTV9fViFaICAhKD5cICEhJCAgISxAQSAgJEA+R19fQCAgICAgMSggIC4gICAgICgnSl9fXCAgICAgJDQgIAotTSI4R0xfX1YhWlAgIEY+UCAgITVAX18mTEMgICAgXiAgIiAgICAgICNYICAoTihQICBaIiogICpAQjAgIQotTSBeICAiKiIoICAgICAgICAgICAgICIwIiBeVCAgICAsJC4gICBQICAgICAoJCA1MCAgICAgIC9AICBAIAotTSAgICApICgjWlAgICAgUDBYICAjICAgICAgQDAhNSAgICAgICBeICAiICAgICAgMFAgIDogKCBYKDEiRAotTSAhQCBBMEBKJSIgICIiQyEgISAgSUEgQCAoKCgqQSBAICAwSFAwIDAkICAgNlJDISAhIEhQMCAwJSIgIAotTSEwICAgICBQSEAgIywoLCAgUSEjICBMICAgICAkLCAgIVAgICAgICBJQUBBQCooICAiMkUgICREQSAgIQotTSUqL19fKiIiX19cI1ggICggLiAwKDEhICAhQEQgMCAhJCQkICNSMCEgICgwMDAgJyAgICAgKCJCICAgRAotTUkwICEpKDAgIDIzJl9fXDAgICAuSCgrX19YMkIgICBESTAgIikoMCAgQjMmX19YMCAgIChJKCtfX0giQgotTSAgIiRIUCAhSCgoICAiMkUgICxEQSAgIyksO19fOjIjX19YSFAwIEAlIiAgJUJDISAhIixIQCAgQyosIAotTSEoUkggIEIsSjAgLEMqSCAkKFJLICEyLEsgIDhDKlQgJypSIiAgIkxAUCAkSyhAICIqUikgIFJMQkAgMAotTUsoTCAlKlIsICFAREkwIEApKDAgKCIzJl9eIDAgL19KSyhXX18iQyEgISA0KCAgLiosJCAhKFJCICAiLAotTUhQICRDKkAgIihSSSAgUkxAQCAgSygsICEqUiggIEBESTAgMCkoMCAkIjMmX18gMCAvX1JLKEdfXyJDIQotTSAgMDQoL15VICAgICAoUkIgICBESTAgJCkoMCAhIjMmX19QMCAvX1hLKCtfXyJDISAhICBJQkBAJSIgIAotTSEwIiYoIiBQSEAgIywoLCAgUSEjICBUICAgICAkLCNfSzAgICAgIERJP19fKSgzX19QIkYmIi4gSEAgIAotTSkqN19fUjIkX19cNEhfX1xIKCggIDAvQCAgQCBYISBBJCQgICYiMCEgICwwMDAgLykgJCAgQSEhICA8IAotTSAgICBAKitfX1IyRV9fXERBL19fKSw7X19RICAgIFpAQEAgIEEqK19fQjJFX19YREEvX14pLDtfX0EgIAotTSAgQkRAQCAgQCorX19YMkNfX1ZAQE9fXykqN19fMjIkX19URFFPX11JKCwgICJDISAiIDQoICA2KiwkIAotTSQoUkJfX1IsSF9fWEMqQ19dKFJJX18iLEpPX0xDKk9fWihSTF9eMixLP19ASygrX18qUiNfX0JMQi9fVAotTUsoR19cKlIqX15STEJfX0hLKFNfWSIyRV9eIERBL19AKSw7X1ghICBfXkpMQzAgICosJCAkITBAICBYSAotTVAwICRDKitfXyhSQ19fQixKL19UQypHX1wqUiJfX1JMQF9fWEsoQ19dIjJFX18gREEvX1ApLDtfXCEgIAotTV9fKkxCMCAgKiwkICEhMEBfWywgICAgIEMqK19fIjJFX19QREEvX1wpLDtfXyEgIF9fQkxAQCAgICAgIAotTSAgICAgICAgICAgICkgKCNbQCAgICBQMFggICMgICAgICBAMCE1ICAgICAgIF4gICIgICAkIiQwQCAgLwotTSkgKCAgOF4jQCYgICAgICAqJiQgKCEgQCAgSEQgQCAhICAtUEAjUCEkICAgK0BAQSkmLCAgOlBEIEIiTwotTUBYIUAgXiAgIiAgICQiJEQgQCAhIF4gICIgICAgICIvQFghQClbV19YKl5fICFST0wwIDhLWyAgJSFBQAotTSAgXEQ4T19fLyBcMCAiN08gQiAgIEciIC8hJDAgIjhRIEIgIVNYIEFDQUAgICAgICAgICMgL0ApICAgIAotTSAiODBfX1AiJDBASyQiI19eMCAgICAiL09QIDxDWyAgJSheUSAhQCNYICAoKVtUICgoXi5AJyBHTz9fQAotTS8gXDAgKl5QICFARVtQMFUvISAwICAnLyIiTk9PUCA8JSIgICQyODAhIzBcJiEgIENRQCsgICAgICAgMwotTSAgICUgICAgICBQMCBXOCIgIiBBJCAgICBQICAgICAsJCAtJiBAIEAoOF45QCcgRiQgIDAgQUQoKlEwQAotTV9fJCAgICAgQ1tcICcoXlAgIUAjWCAgKClbVCAoIj5dX11CT0wgIDggKCIgKDpeXyAhUDYgICAjKSAvXwotTV9RICAgIjREIE9fX0RAKCAjICAgICAgUDNAIiMkPCAgJSMhOCAgQFAzUCAmKSAkICBBN0EgIDggICFAQQotTSMhICM9QCggKCIkMCAgICIgJCA4KDAgICYiJjIhICAtIyEgIl0qXkMgIjIvSFAgRCEkJCAgQCAgICAgRAotTSBfX19EQCggIyAgICAgIFA2ICAoJFAgICFAICAgICIuISAgKCMhICYmSl5DICIyL0hQIERLQCAgIihYOQotTSAgQkIgICAsS0AgICAgIUAkIiZOJjAgJENbXCAnKF5QICFAI1ggICgpW1QgKiI+XV9eIk9MICA4ICgiIAotTSgxOCAgIS5PT1AgPENYWiA8I1AvJCAgRVtQMFUvISAwICAnLyIiTDQoICAqKUEgJC0hKCAgICwgICAgIAotTSMhICM9QCggKCImL0YoIVApQSAgJCAoOCIiTDQoL19YICAgICAhICAgI0AgICEgQURALCAjICAgICAgUAotTThAICIlJCAgIyMhSCAgMi4hMCAgREAwICMyMCYgICQsJCA5UCAgNEgoWFg5ICBCTiAgICAgICAwKDEgIAotTSAiRk4mMCAkLCZAICEhNCAgIiBQOzAgQCQkICAnQyFNICIiLiBAICggICAgICEhICAhSFA7MCBAQ0BEIAotTSEgICAgICAgMjBASyQiICAlMyFNICIgLCQgMTQgQCBAKDkoIyAgUCAgICAgLCZIICEhNSAgIFhQOzAgQAotTSwmTCAgQSVAICBMUDswIEBDQCggIiAgICAgIDAwICAnLCZUICgoWCwgIDAgICAgICAkUCgqUTBAX15YIAotTSAgICAsJlQgKCEmQCAgMCAgIUBBJCAgICBCMCNfX1wgICFAQSAmIDAoOF5fICFSL0wgIDggXiAgIiI+XQotTSAiIEdPP15QS1sgICcqXl8gIlJPTFAgSCAqIiAoOl5SICIyT0wwIEBLWjAgNCkoIyAgUEQkMCEiKSEoIAotTSFCMDMgIChQO0AhMiVCWCApMyFMICE6MiNQIC0vIUQwICAgL1AoICMuLEBBQ1NEIkgoWCIgIDAgICAgIAotTSAlRCgqUSBAICRcICAgICBDWkAgNCIwISAgSkAyICAgQ0BEICEgICAgICBFKkAgIUtASCAhKS5LICUsIAotTSAgICAkNiQgISAgICAgIi9IQCEwJCAgIDgoXl8gIlAsJCAxNCBAIEAoMjAhX19cNDAwICRDWiwgNCEgIAotTSAgLEQgX19fQ1osIDQgICAgICAwICAhNCAmIDAoMyFMICE4NjMgIDQsJ0AgJEheTSAlIEdJMCEsSFpUIAotTTMpKCQgIFZOICAgICMhICY+IjAmICAkRCAwICElJCQgISAgICAgIi9IQCEwJCAgIDE4Xl8gIlIyI0AgLAotTSkgK19fUzcvICIgMCAgIF9IQFwgIyMhWCAhKDY+ICAwICAgICAoWCIgIEAgICAgICQkICAjICAgICAiLgotTSYwICQgICAgICExOSAgUCAgICAgQ0BAICAgICAgICA1ICAgKCAgICAgIyFJICQwNSggICYgICA4KDBQMAotTSEpSCIgIiBBJCAgICBAISAmIiQgICFAQSQmICAgUCAgICAgMCAgIEQpICtfX1koIyAgUCAgICAgLCZIIAotTTEhNSBfWjxQO0AhMiMhICQ1ICggKCImLiBAICAgICAgICIxIl9fXCQwMCAmS0AoICApLkQgJSwsJCAvKAotTSBAIEgoMSAgICBKMiNQICxDWkwgNChYLCAgMCAgICAgSDhMICAoWC0gIDAgICAgICk6WCAgOlguICAyMgotTSNQICwgICAgICMnWCAiIDMgICAkQ1osIDQhICAgICxEIF9fX0NaLCA0ICAgICAgIDghIEFDW1wgKyheUAotTSAhUi9MMCBAQ1soICkoXlMgIkAjWCAgKClbVCA0Ij5dX14iT09QIDQgKCBYKDhTQyAgQjBbUCAsQy5YIAotTSEgIUAqIiRRXiAhJEsuNCAhISwgICBAIVEzIENEL0QgIzNQKSQgIEUqMCpAICFFIEAgJCkoIiQwICAgKgotTUsuICAgKSNKICBUXCMhICApOFAiSCAgKjYoICE7IiBBQyhUICAgICAgICAhSFEgQ0suKCAgKFNCICAgIAotTSAgICAhJCQgISAhICYiJDAgICAiICAgOCgwISAmIiYsQ0AgIEMuXCAhICAgICAgIVNcIEMgUCwoKkEgQAotTSAgSCAgICAgS1o0ICcqXkYgIUAgWCIgQSMhICUtSl5HICIiL0kwIDxDWjggJiheRyAiICAgICAgJiwgIAotTSNQICAkIiYwWSAgLUtaPCAoIFAwIUdCT0lAIDhDWjggJiheRyAiIDBQQCAnICAgMCg5I1kgIFBEIE9fXwotTS1SQCAoISAgICAqQFogICwgICAwKDheXyAhMEdPMCBAIF4gICIgICAgICBHTz9fSEtbXCAlKSIiICBQRAotTSAwICIsJFggJEEnISAgUCAgICAgLCRcIEBBN0AgIDhEID9fTyMhICZAUjAkICBEMCAgIFIpICtfX1IwIQotTV9eXCAwPCBELVFEICBKIjkgIFIsQFAgKCAgICAgITFAICA8ICAgICAjISAkVzpeRCAhQi9JICA4ICAgIAotTSAoUiMgIEAgICAgIEMoQCAhICAgICAgNDogIEAgICAwKDkiKSAgUCAgICAgLDJIIDEhNSAgIUwgICEgQQotTUQoTCAjM1AtJCAgRUswKkAgIE1AQCAmLSoiJixLQCAgICAgICAgJyM+Ii5MQ1AgIEMoKCAgICAgICAgJAotTTAwICQgJCA4KDEgICAgKCAgIUBBICQgOCg4UlggICIsRjAgJCAgICAgICw5MCIsISBQQEokIiAgISAgIAotTSQiJCwkIDRWICAgICAgICAkIiYvT1AgNClbVCAmIC9AICBAICAgICApW1dfWCpeXyAhMCBAIkBBRCpYIAotTSMpIkMgIFRRU1AgJCQ+ICAjICFALCIkXCYxICApU0VAIiAgJlAsICMmMSBBICAtKEAjUCEkICAgKjBAQQotTUsqKCAiIjEoICBAMCAgIFRLIkAiSCJDISAgKDAoICAzICAgICAhMyAgIDggICAgIC8gLDAgIjFDJCAiTAotTUhQICgkICAgITAhQCQiJFwgUSAgKSYtICAqUkMgIEAgOCEgQUQqTCAjM1AhJCAgICJWIiAgIlAoKDIxKgotTSggIDAgICA/SyJIIkgqXkUgIiBEISIgKCMhICU1Kl5GICFSL0kwIEBDWjggJyEhICAgUkxIQCAoRCpUIAotTSMpIlkgIFYsS1AgKC8gJDAgIzZOICBAICY0IiBIKlggIyAgSCIiJEVeIiAgJCAgICMqUFggSiBcIlEgIAotTUQqUCAjMjVLOCBAICFEQyAgMkwwKDNQISQgICAjJkIgICJUKCg6UkIgIEBEMkAgKEsiSCJIKFJOICBAIAotTVAiIEFLKlggISBQMCFIQk9JMCBAQ1o0ICghISAgIEYvT1AgNEQqKCAjICAgICAgUDNQICQlPiAgISheXwotTSAhMFQ2MCEgSCtEICMoXl8gITBHTzAgQCBeICAiICAgICAiMENAIC0vICwwICAgLj4oICA7UUBBQyYsIgotTUgoUjggIDAgICAgICAnQDAoUDEhICAsICAgICAgXiAgIipSIyAgMixGMCAgICAgICAgITkiIkgwKCAgIgotTSAgICAgKlIiICAgI1ggICggICAgICAgICAgICAgICAgKSAoI1owICAgIFAjWCAgKCAgICAgI1AhJCAiTAotTShAUDggXiAgIiIwIl9fXEdPP15IS1s4ICsqXlIgIVJPT1AgVEtbPCAsKl5VICJCL0NIJVBLWzAgKSpeUwotTSAiIk9MMCA4ICgiMCg6XlAgITAxUCAgJCAgIlAoOF4lQDgwMCAgICspWTYhPCI+IkA3MEdFOCVQS1gqIQotTT8jMS8gICZPQ1glUC1LQCAgMCpALiImT0YoJVQgJCBIKDpeJ0A3Qi9BWCVYKSE/X19SMDRfX1ggWChAQQotTSAgIFAoOFhDICAgICAgICAgJiAwKDMhOSAgJDcoICA9IEIiICgwIUBAIiYuIEAgIClEMCAhUCAkKCgoUAotTTIgICElMCAgI0AgJCgoICIoI0BBS1g+IT4hMlAgICpOKEAgICBCIEgoOFhDICAgICAgICAgJiIgKDhYIgotTSAgICAgICAgLCREICAxJEBfXzggICAgICBCMDAoMCgiIiJMNCggICMgJSQoKlEgQCAmSCAgICAgICYgMAotTSgwKEBAIiQgNShARCBBJCgqUTBAX11MICAgICBDWEohPyAgICAgIDIiQCAjICAgICAhICAgIDJPQTgmJAotTSRDNCAhMjMmICAmT0E4JiQkICAgOlAgICQiJERRQCAhKywkICBBMEBfXFAgICAgIClELCAhUCAjJigqTwotTUhQIFggKiIoKDAgICgiJCwkIDpAS1g2IUEoXitAN1IvSFAgWCk2UCAhISEsICBQIDAoIEEpJjgnX1AgJgotTSxMKFAxICAjJCggICQgICYsVCBEIzAgJCA6MDgoUCFATCIkIDBYIEEkICAgIkAjNiwiJi9BOCYkQ1haIQotTT8gICAgICAhUTdAQyAgXyBAUCFYLCIsRFFAQCAgIDhSUEAgJixUICIhTEBBIFMgKCpRIEAgIDBcIDdfXwotTSQgICAwMCAgJCIkXCA3X18tIidAIDAjISIiTDQoICAtICwiOCgzUCQ/X1xUQS4gICMhICZIKl5GICRCLwotTUlAISglJTwgISNQIUAgIDAgICBTICAgMCgzUCFAICBUKDIgICAsJFAoMFAwIUogIFAiIEElJTwgITAgIAotTSAgICwkIDpMIEAgQCgxICAgIkAgICEgQUNYQiE/ICgzMiIkIS1FIEMpNE9fXypUMCAgIk4iUCAgQ1hSIQotTT8gKCAqIiRFQzAgJCRAVCAhMzpCICAmLUNAICAgICAgICM3LyAgJk1DUCAgQ0FAICAgICAgICJPRiglXAotTUNZRiE/ISAgX1c+TyhAICAgJCBYKDAjUCIiTDAoICAmLS5EICA4U0ggICAgICAgIEtYQiFAKlNDICAgVAotTVowICEkKyQgISpYSSAgIk9BWCVYJCAgICEqXiVAODAgWCJAQUtYNiFBKl4nQDdARihAICRDW1wgLSheUAotTSAhMi9MMCA4Q1soICcoXlMgIiIvTSAgRENbNCAqKF5WICJSL01QIFAgXiAgIiI+XSAlQDBAICAtICggMAotTSgyMiJfX1JPQEglWEMkWCAgIjAhX19YIVA3QERLJFwgIChROSAgIi9GKCVcICAgICAhPDkgICggICAgIAotTUtYKiFBIC9AICBAICAgICApW1dfUipeUCAhQCBAKCBBJEAgIC4qXl8gIVIuIE9fXCAgICAgIyEuICAkMQotTVAgICggJSA4KFAoICgiJCwkIDg6S1o0IC8oXkUgI1IuIE9fXCAgICAgICEwJiIsICBRQiNLWiwgKSAiQAotTSgiJCwkIDU0S1o0IC8oXkMgIjIvSTAgXCQkICAhMCEgKCIkMDQgICMgICAgICEyQCAgMERJUCAjJCAgIAotTSgwIiAkIiRESVAgIyAgPFhAQCNDIiJMMCggICIgICAgICAjQCYiJk9JICBUIEAgSCgwICMsKCAsJCAoUAotTUtaPCAoKF5EICMyL0lQIEAgJSAoKlEgQCAhICAgICAgICA9WEAgIS8mIiQgPCBASyUiICAiUCAgICAgIAotTTwsQEMgIUUgQFheOEA4ICAiJEIgICRFMCgxICAgIDJNNiAgICMhICU1ICJAKCIkIDAiIEEgKCAwKDheXwotTSAhUi9MICA4IF4gICIiPl0gI0AgICAgICAgICAgIjAiIF9MICAgICwkLiAgIFAgICAgICgkIDUwICAgIAotTSAgL0AgIEAgICAgICkgKCNbICAgICBQMFggICMgICAgICBAMCE1ICAgICAgIF4gICIgICAgICIvQEgmOAotTSBeICAiICAgICAiT0EoJjggXiAgIiAiICQiJCAgICAgICAgICAiPl1fWyJPT1AgPCMhICZAKl5EICUiLwotTUkgITBLWiggKSIwJTUgQCwkIDpcKVo4ICogMSEgIDxEIEAgIUNaMCApIFAwIUgsICAgICAkICAgIEAgIAotTSQiJEQgQCAhQ1tcICciPl0gJSAjWCAgKCAgICAgICAgICAgICAgICAgICAgICNQIyQgIiw4UEokKSAoIwotTV4wIiMoIiQgICAgLCUuICAhI1AhJCAgIDghIEEgXiAgIipQRCJIMCgkIDUwICAgICAjUCIkICIsMEBKIAotTSAgICAgICIiIiJMMCggICIgICAgICAhICgiJEQgQC9ZICAgICMhM0BfXzBcIDEgIEsiMCpBIC9AICBAIAotTSAhIEEgICAgICAgICAgIEQgQDA+ICAgICMhI0AgICwgICAgICIhICU0ICAgICAgI1ggICggICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAjWCAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAoIiBAKCIgQCgiIEAqIkBIKiJAQCgiIEAoIiBAKCIgQCgiIEAoIiBAKCIhKCQhIDAkISAwJCEgMAotTSQhIDAkISAwQSgyJEEoMiRBKDIkQSEgMCQhIDAkISIhQDgmIUA4JCEgMCQhIDAkISAwJCEgMCQhIDAkIQotTSAwJCEgMSAwJCEgMCQoKiJASCoiQEAoIiBAKCIgQCgiIEAoIiBAKCIgQCgiIEAoIiQhIDAkIiAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKCMhIDQmIVBAKQotTSJATCwjMFgvJCEkMiRRMDUlQTw4JjFIOychVD4nUiBBKEIsRCkyOEcqIkRKKlJQTStCXFAsMyhTLSM0VgotTS1TQFkuQ0xcLzNYXzAmJUI4VjFFOUY9SDo2SUs7JlVOO1chUTxHLVQ9NzlXPidFWjZVUT03RV1AMDQpIwotTTEkNSYxVEEpMkRNLDM0WS80JSUyNFUxNTVFPTg2NUlbPydVXj9QICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEjMiUpIzMkJTM0UCAgICAgTzsmRUIrVi1IPEYtTAotTTg3LVMrUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICEgIDgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgJCAgICAgICAgICAgICAgICAgICAgIiAwICAgICAgICEgIDghQDAgJiA4IUAoIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAqPSAkICJHMCAgIAotTSAgICAgICAgMCZEICAgICAgICAgICAgICAgICAgJCsoICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAwICAgJiVTOFZFSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAkICAqPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICA8IEQiIkAgICFEICAgICsgICAgUDggICAgICAgICAgICAgICAtICAgLFIgICAgJFkgICBdTCAgIAotTSAgICAgICAgICAgIiRQICAzJVAgICBBLCAgITRKICAgIUIwICAlU1QgICAgJ0AgIDhRQCAgICE8ICAhSwotTUIgICAgKDwgICZTWCwvIEBYIyAwMC0hIFQkIDAoKiIhICE5IFwjIDAkISVAUCUgQSghIDAoMDQlITA0JQotTSEwNCUhMDQlITA4JywhJDEoMSQxKDEkMSgxJDEoQSxSJEEoQiRBKEIkQShCJEEoQiUiJDEkMiQxJDIkMQotTSQyJDEkMiQxKDEkMSQyKEIkUCQhLC0iICAgQlA2KCwgIjEkMCwvIDQkQTBGNSEgQikwJiAgIFogX18qIQotTSAgXDIkUDRQWCMkNyUhJDggITwyJDFAISQxKTA4ISAwJCEgMCQhIDAkISAwJCEgMCQhIFAkISAwJCEgMAotTSQhIDAkISAwJCEgMCQhIFAkIiAwJCEgICQhJDEkMCAwJDEkMTAvIEEsQSAyJDgoICJBIDAkNyQwKCEgQAotTSQuISBcKCQgIkEoMiwhIEAkISMwPCEgQCQhIzA8ISBAXCMgMFgoKCAjISAwJCEgMCQhIDAoISAwJCEgMAotTSQpIiAgIEQwJC0hUiQhIDAkIiAwJC0hMCQhIzA8QSAwKCEgMFQoICAkLCEgVCQgMCQ3JDAkISBAJCIgMAotTVgkI1BAMCAqJEEoUCQiIDAkLSFQJCIgMCQtIVAkIiNQLCEjQEBAICwkISAwJCEgMCQhIEAkISAwJCEgMAotTUQoICAiMSAwVCcoMCQhIDAoISAwVCUgMCQtIVIkISBAJCEjMCAhIDEkMiQ2JSEoQiEiPDclIyMwLC0gUgotTVQjJiQgIEgzLDEwMyBUIzAwMTBDJFIgNSQiJDIkUSEgWCEgQFwhLCIsLSFWJFI4VCkiI1AoPyEoISFAKAotTSAhQCEiICkyJiAgSCAxKDggMygwKC4gQFwhMDIkISNQJC8hSCIgODElIyQ4IiJAJyBEIEBYMiNQJC4gSAotTSFBQCghIUAgJCEjUCQvIFQgMTAyJDEkQyhRNDgmIUAmKSApIFQjJzAyISNQLEJAKC1SIDJcISNQJDEjUAotTS4gJEAkLyA4ICEkMy4gIDElISAxICEpQTwvICU8KTFQVCMwUFgxIEBYIyAxMEEgNSYkI1AkITw2KCEgMAotTSRCQEEkUSUgXCEoMFwhJ1A8MSdQKEEgUFgiIFcoUSUjXCI4MShCLDEkNCEiUCQgMEQnKDMkQSBAWCQgQgotTSRBIEAoLiBFJiApIFQnJFMlMyQiQCAgKUAvX1dBICArJTEkNSguIEMkMjAwJUE8NCQvIFIlICAwJDEkMQotTSAhIDEkMSUiMCIkITAsITBcITBCJDIwQSgvIEAkMiNQJDIkMyQiIDAkMSQxICEgMSQxJCAgICAgICAgIAotTSBAICAgICAgICAgICAgICAgL19fX19cICAgICAgICAgICAgICAhQCAnMCAgICAgIC4gICAgJjwgICAgIAotTSAgICA6ICAgICAwICAgIDogICAgICAgICAgI19fX19fICAgICAgICAgICAgICAgICAhVCAnUCAgICgoIAotTSAgIiQgICAgJkAgICAnICAgICAmICAgICcgICAgICAgICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPQotTSAhXCAgICIvICAgIERQICAgIUwgICAhXCAgICAiICAgICFcICAgICAgICAgIC9fX19fXCAgICAgICAgIAotTSAgICAgICAgJzAgPyAgICBHQCAgICogICAgID4gICAgICAgICAiJCAgICAgICAgICAgICAgICNfX19fXwotTSAgICAgICAgICAgICAgICAgIVQgJ1AgICAnRCAgICFZICAgICAgICAgIUAgICAgRSAgICAhQCAgICAgIAotTSAgICBfX19fX1AgICAgICAgICAgICAgICAgID0gIVwgICAhWiAgICA+QCAgICAkICAgIFAgICAgKjAgIAotTSAgUCAgICAgICAgICAvX19fX1wgICAgICAgICAgICAgICAgICcwID8gICAgPlAgICAnTCAgICAiICAgIAotTTIgICAgIlQgICAgMiAgICAgICAgICAjX19fX18gICAgICAgICAgICAgICAgICFUICdQICAgJ1QgICAhXQotTSAgICAgUCAgICYgICAgIFEgICAgJiAgICAgICAgICAgX19fX19QICAgICAgICAgICAgICAgICA9ICFcIAotTSAgIV4gICAgP0AgICAgMCAgICFYICAgIC0wICAgIVggICAgICAgICAgL19fX19cICAgICAgICAgICAgIAotTSAgICAnMCA/ICAgID9QICAgJ1wgICAgJSAgICBEICAgICNEICAgIEQgICAgICAgICAgI19fX19fICAgIAotTSAgICAgICAgICAgICAhVCAnUCAgICgkICAgIiEgICAgIUAgICAqQCAgICBdICAgICpAICAgICAgICAgIAotTV9fX19fUCAgICAgICAgICAgICAgICAgPSAhXCAgICIiICAgIEBAICAgIDwgICAjICAgICAwMCAgICMgIAotTSAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAgICAgJzAgPyAgICBAUCAgICgsICAgICggICAgViAgIAotTSAkNCAgICBWICAgICAgICAgICNfX19fXyAgICAgICAgICAgICAgICAgIVQgJ1AgICAoNCAgICIlICAgIAotTSIwICAgLyAgICAhKSAgICAvICAgICAgICAgICBfX19fX1AgICAgICAgICAgICAgICAgID0gIVwgICAiJgotTSAgICBBQCAgICBIICAgJCggICAgMzAgICAkKCAgICAgICAgICAvX19fX1wgICAgICAgICAgICAgICAgIAotTScwID8gICAgQVAgICAoPCAgICArICAgISggICAgJSQgICAhKCAgICAgICAgICAjX19fX18gICAgICAgIAotTSAgICAgICAgICFUICdQICAgKEQgICAiKSAgICAjICAgIDNQICAgITUgICAgM1AgICAgICAgICAgX19fXwotTV9QICAgICAgICAgICAgICAgICA9ICFcICAgIiogICAgQkAgICAgVCAgICU8ICAgIEEwICAgJTwgICAgIAotTSAgICAgL19fX19cICAgICAgICAgICAgICAgICAnMCA/ICAgIExAICAgLzwgICAgLiAgICAgICAgICAkIAotTSAgICAgICAgICAgICAgI19fX19fICAgICAgICAgICAgICAgICAhVCAnUCAgICAoICAgICIgICAgICAgIAotTSAgICAgICAiICAgICAoICAgICNfX19VTF9fX19fUCAgICAgICAgICAgICAiTCAgPSAhXCAgICE/ICAgIAotTUBQICAgICAgICAgICAgICAgMCAgICAiICAgICBfX19fXy9fX19fXCAgICAgICAgICAgICAgIiAgJzAgPwotTSAgICAnMCAgICJYICAgICAgICAgICAgICAgJCAgICAgQCAsICAvX19fX1NfX19fXyAgICAgICAgICAgIAotTSAgIEAgIVQgJ1AgICAhWCAgICBGICAgICAgICAgKFAgICAgIyAgICAoUCAgICAgICAgICBfX19fX1AgIAotTSAgICAgICAgICAgICAgID0gIVwgICAgUyAgICAuMCAgICBEICAgICAgICAgIDAgICAgICAgICAgICAgIAotTSAvX19fX1wgICAgICAgICAgICAgICAgICcwID8gICAgOEAgICApSCAgICAgICAgICAgICAgICQgICAgIAotTSAgICAgICAgICAjX19fX18gICAgICAgICAgICAgICAgICFUICdQICAgIFggICAgMiAgICAgICAgICAgIAotTSAgICEgICAgICAgICAgICAgICAgX19fX19QICAgICAgICAgICAgICAgICA9ICFcICAgIC4gICAgJEAgIAotTSAgICAgICAgICAgICAwICAgICAgICAgICAgICAgL19fX19cICAgICAgICAgICAgICAgICAnMCA/ICAgIAotTSogICAgMlggICAgICAgICAgICAgICAkICAgICAgICAgICAgICAgI19fX19fICAgICAgICAgICAgICAgIAotTSAhVCAnUCAgICBYICAgIDMgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgIF9fX19fUCAgICAgIAotTSAgICAgICAgICAgPSAhXCAgICA3ICAgICcgICAgICAgICAhKCAgICAhMCAgICEqICBQICBfX19fXy9fXwotTV9fXCAgICAgICAgICAgICAgIiAgJzAgPyAgICAoMCAgICI0ICAgICQgICAgICAgICAgJCAgICAgQCAkIAotTSAvX19fX1NfX19fXyAgICAgICAgICAgICAgIEAgIVQgJ1AgICAiSCAgICBdICAgICAgICAgJ0AgICAgIwotTSAgICAnSCAhICAjX19fX1RfX19fX1AgICAgICAgICAgICAgICogID0gIVwgICAhLiAgICA5MCAgICBYIAotTSAgJFggICAgITAgICAkWiAgMCAgX19fX18vX19fX1wgICAgICAgICAgICAgICIgICcwID8gICAgPEAgIAotTSAoRCAgICBCICAgIkAgICAgIDwgICAiQEAgXCAgL19fX11TX19fX18gICAgICAgICAgICAgICEwICFUIAotTSdQICAgKUggICAiWiAgICAtMCAgISsgICAgICkgICAhKyggICAgI19fX19UX19fX19QICAgICAgICAgIAotTSAgICAoICA9ICFcICAgIzIgICAgV0AgICAlOCAgIDcoICAgICJQICAgNyogICAgIF9fX19fL19fX19cIAotTSAgICAgICAgICAgICAhQCAnMCA/ICAgIFpAICAgL0AgICAhSyAgICZVICAgICBUICAgJlVAICAgIC9fXwotTV9fM19fX19fICAgICAgICAgICAgICAgQCAhVCAnUCAgIDAsICAgJDsgICAgPiAgICIjQCAgICAvICAgIgotTSNAICAgICAgICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPSAhXCAgICRJICAgISwgICAgKTQgICAgIAotTSAgICAgMCAgICAgICAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAgICAgJzAgPyAgICAjQCAgICBcIAotTSAgICAgICAgICAgICAgJCAgICAgICAgICAgICAgICNfX19fXyAgICAgICAgICAgICAgICAgIVQgJ1AgIAotTSAhJCAgICA+ICAgICAgICAgICAgICAgJiAgICAgKCNfICAjX19fXzxfX19fX1AgICAgICAgICAgICAgIAotTTYgID0gIVwgICAhRCAgICBRMCAgICAgICAgLDggICAgIiAgICAsPCAgICAgICAgICAvX19fX1wgICAgIAotTSAgICAgICAgICAgICcwID8gICAgUyAgICAtTCAgICEuICAgIzYgICAgIEggICAjN0AgJCAgL19fX14zXwotTV9fX18gICAgICAgICAgICAgICBYICFUICdQICAgLjggICAkISAgICA1ICAgICAgICAgICEgICAgICAgIAotTSAgICAgICAgX19fX19QICAgICAgICAgICAgICAgICA9ICFcICAgIC4gICAgJEAgICAgICAgICAgICAgIAotTSAwICAgICAgICAgICAgICAgL19fX19cICAgICAgICAgICAgICAgICAnMCA/ICAgICNAICAgISggICAgIAotTSAgICAgICAgICAkICAgICAgICAgICAgICAgI19fX19fICAgICAgICAgICAgICAgICAhVCAnUCAgICFcIAotTSAgIEMgICAgICAgICAgUCAgICAjICAgICBQICAgICAgICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPQotTSAhXCAgICBKICAgICwgICAgICQgICAgICAgICAgMCAgICAiICAgICBfX19fUy9fX19fXCAgICAgICAgIAotTSAgICAgJSAgJzAgPyAgICAnQCAgICJAICAgICAgICAgICAgICAgJCAgICAgICAgICAgICAgICNfX19fXwotTSAgICAgICAgICAgICAgICAgIVQgJ1AgICAhPCAgICA/ICAgICAgICAgIyAgICAgJCAgICAiUCAgICAgIAotTSAgICBfX19fX1AgICAgICAgICAgICAgICAgID0gIVwgICAgRSAgICArUCAgICBAICAgICAgICAgIDAgIAotTSAgICAgICAgICAgICAvX19fX1wgICAgICAgICAgICAgICAgICcwID8gICAgI0AgICAhKCAgICAgICAgIAotTSAwICAgICBMKCAgKyAgICAjICAgICAgKEtfX18gICAgJTAhICA8IDgoICAiICAgICUwICAgJkBAKCAgIgotTSAgICAnMCEgIEJAOCggICYgICAgJzAgICAgQEAoICAkICAgICowISAgQyA4KCAgKiAgICAqMCAgICBQQAotTSggICYgICAgLDAhICBDUDgoICAuICAgICwwICAgIEBAKCAgKCAgICAgMCAgICAgQCggICAgICAgIDAgIAotTSAgIEwoICAiICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICIgICAgIDAgICAgIEAoICAgICAgIAotTSAwICAgICBMKCAgIiAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICIqICAgIDBAICAgIUFJOCAgKQotTSAgICAyUCAgICAgRTggICggICAgNjAgICAhIEU4ICAjICAgIDogICAgIiBFOCAgJCAgICA9MCAgICQgRQotTTggICUgICAgQFAgICAmIEU4ICAmICAgIERAICAgKCBFOCAgJyAgICAgICAgICAgQTggICEgICAgSEAgIAotTSAhQUk4ICAxICAgIElQICAgICBFOCAgKCAgICBNMCAgICEgRTggICMgICAgUSAgICAiIEU4ICAkICAgIAotTVQwICAgJCBFOCAgJSAgICBXUCAgICYgRTggICYgICAgW0AgICAoIEU4ICAnICAgICAgICAgICBBOCAgKQotTSAgICBfQCAgICBBTTggIDkgICAhIUAgICAgIEU4ICAoICAgISUgICAgICBFOCAgIyAgICEoUCAgICAgRQotTTggICQgICAhLCAgICAgIEU4ICAlICAgIS9AICAgICBFOCAgJiAgICEzMCAgICAgRTggICcgICAgICAgIAotTSAgIEE4ICAxICAgITcwICAgIEFNOCAgQSAgICE4QCAgICAgRTggICggICAhPCAgICAgIEU4ICAjICAgIQotTT9QICAgICBFOCAgJCAgICFDICAgICAgRTggICUgICAhRkAgICAgIEU4ICAmICAgIUowICAgICBFOCAgJwotTSAgICAgICAgICAgQTggIDkgICAhTjAhICBFIDgoICInICAgICAgICAgICA8KCAgRCAgICAgICAgICBAQAotTSggIEIgICAhTjAgICAhQEAoICBBICAgIVEwISAgRkA4KCAiKSAgICAgICAgICAgPCggIEggICAgICAgIAotTSAgQEAoICBGICAgIVEwICAgIUBAKCAgRSAgICFWICEgIEggOCggIisgICAgICAgICAgIDwoICBMICAgIAotTSAgICAgIEBAKCAgSiAgICFWICAgICFAQCggIEkgICAhWzAhICBJQDgoICItICAgICAgICAgICA8KCAgUAotTSAgICAgICAgICBAQCggIE4gICAhWzAgICAhQEAoICBNICAgIV5AISAgSyA4KCAiLyAgICAgICAgICAgPAotTSggIFQgICAgICAgICAgQEAoICBSICAgIV5AICAgIUBAKCAgUSAgICIjQCEgIExAOCggIjEgICAgICAgIAotTSAgIDwoICBYICAgICAgICAgIEBAKCAgViAgICIjQCAgICFAQCggIFUgICAiKSAhICBOIDgoICIzICAgIAotTSAgICAgICA8KCAgXCAgICAgICAgICBAQCggIFogICAiKSAgICAhQEAoICBZICAgIitQISAgT0A4KCAiNQotTSAgICAgICAgICAgPCggISAgICAgICAgICAgQEAoICBeICAgIitQICAgIUBAKCAgXSAgICIwMCEgIFEgOAotTSggIjcgICAgICAgICAgIDwoICEkICAgICAgICAgIEBAKCAhIiAgICIwMCAgICFAQCggISEgICAiNTAhIAotTSBSQDgoICI5ICAgICAgICAgICA8KCAhKCAgICAgICAgICBAQCggISYgICAiNTAgICAhQEAoICElICAgIgotTTgwISAgVCA4KCAiOyAgICAgICAgICAgPCggISwgICAgICAgICAgQEAoICEqICAgIjgwICAgIUBAKCAhKQotTSAgICI9ICEgIFVAOCggIj0gICAgICAgICAgIDwoICEwICAgICAgICAgIEBAKCAhLiAgICI9ICAgICFAQAotTSggIS0gICAiQjAhICBXIDgoICI/ICAgICAgICAgICA8KCAhNCAgICAgICAgICBQQCggITIgICAiQjAgIAotTSAhUEAoICExICAgIkVAISAgWFA4KCAiQSAgICAgICAgICAgPCggITggICAgICAgICAhIEAoICE2ICAgIgotTUVAICAgIiBAKCAhNSAgICJJICAgIClBSTggIT4gICAiSjAgICAgIEU4ICJGICAgIktAICAgIiBFOCAiSQotTSAgICJNUCAgICQgRTggIkwgICAgICAgICAgIEE4ICE5ICAgIk8wICAgKSFNOCAhQyAgICJRMCAgICAgRQotTTggIyQgICAiUkAgICAgIEU4ICMnICAgIlRQICAgICBFOCAjKiAgICAgICAgICAgQTggIT4gICAiVjAgIAotTSAgMVE4ICFIICAgIldAICAgICBFOCAjQiAgICJYQCAgICAkRTggI0MgICAiWiAgICAgKEU4ICNEICAgIAotTSAgICAgICBBOCAhQyAgICJbMCAgICAxUTggIU0gICAiXSAgICAgIEU4ICNLICAgIl5QICAgICRFOCAjTAotTSAgICMgQCAgICAoRTggI00gICAgICAgICAgIEE4ICFIICAgIyFQICAgIDFROCAhUSAgICMjICAgICAgRQotTTggI1QgICAjJEAgICAgJEU4ICNVICAgICAgICAgICBBOCAhTSAgICMlUCAgICAxUTggIVUgICAjJyAgIAotTSAgIEU4ICNcICAgIyggICAgICRFOCAjXSAgICAgICAgICAgQTggIVEgICAjKiAgICAgMVE4ICFZICAgIwotTSswICAgICBFOCAkJCAgICMsUCAgICAkRTggJCUgICAgICAgICAgIEE4ICFVICAgIy4gICAgICBJOCAkJgotTSAgICMwICAgICAxUTggIV4gICAjMUAgICAgIEU4ICQsICAgIzMgICAgICRFOCAkLSAgICAgICAgICAgQQotTTggIVogICAjNDAgICAgIEk4ICQuICAgIzZAICAgIDFROCAiJSAgICM5MCAgICAoRTggJDQgICAjOjAgIAotTSAgJEU4ICQ1ICAgIzswICAgICBFOCAkNiAgICM8QCAgICAsRTggJDcgICAgICAgICAgIEE4ICFfICAgIwotTT4gISAgWlA4KCAkOCAgICAgICAgICAgPCggIiggICAgICAgICA9IEAoICImICAgIz4gICAgPiBAKCAiJQotTSAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAkICAgICUgISAhOSA4KCAgLSAgICAlICAgICBAQAotTSggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJSAgICAiMSAgIkwgKUtfX18gICAgJSAhIAotTSE6IDgoICAtICAgICUgICAgLlBAKCAgIiAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAkICAgIAotTSNAISAhSSA4KCAgLSAgICAjQCAgICMwQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJgotTSAgICAiQCEgIU0gOCggIC0gICAgIkAgICAoUEAoICAhICAgICQwISAhVVBYKCAgLyAgICAkMCAgICcwQAotTSggICMgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgKSAgICAjQCEgIV0gOCggICIgICAgJTAhIAotTSIhQDQrX19fICAgIChAISAiJiA0K19fXyAgICAqMCEgIiZANCtfX18gICAgLCAhICImUDQrX19fICAgIAotTS1QISAiJyA0K19fXyAgICAjQCAgICpAQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJQotTSAgICAjMCEgIiggOCggICIgICAgJFAhICIpQDQrX19fICAgICMwICAgIiBAKCAgISAgICAgMCAgICAgQAotTSggICAgICAgIDAgICAgIEwoICAiICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICIgICAgIDAgIAotTSAgIEAoICAgICAgICAwICAgICBMKCAgJSAgICAjMCEgIiogOCggICIgICAgJFAhICIrQDQrX19fICAgIAotTSMwICAgIiBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICA5ICAgICMwISAiLCA4KCAgIgotTSAgICAlICEgIi8gNCtfX18gICAgJ1AhICIwUDQrX19fICAgICwwISAiMUA0K19fXyAgICAvUCEgIjJQNAotTStfX18gICAgMFAhICIzMDQrX19fICAgIDQwISAiNjA0K19fXyAgICA3ICEgIjdQNCtfX18gICAgOVAhIAotTSI5QDQrX19fICAgIDwgISAiOUA0K19fXyAgICA/ICEgIj8wNCtfX18gICAgQiAhICJDIDQrX19fICAgIAotTURQISAiRTA0K19fXyAgICBHUCEgIkcwNCtfX18gICAgTEAhICJIQDQrX19fICAgIFAgISAiSjA0K19fXwotTSAgICBTQCEgIk0wNCtfX18gICAgVjAhICJOUDQrX19fICAgIFkgISAiUEA0K19fXyAgICBbQCEgIlBANAotTStfX18gICAgXlAhICJWMDQrX19fICAgISIgISAiWiA0K19fXyAgICAjMCAgIFAwQCggICEgICAgIDAgIAotTSAgIEAoICAgICAgICAwICAgICBMKCAgJSAgICAjQCEgIl0gOCggICIgICAgJTAhICJeQDQrX19fICAgIAotTSNAICAgIiBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAoICAgICJBICAiTiApS19fXwotTSAgICAkUSAgIEIgKDNfX18gICAgJ0AhICJfIDgoICAtICAgICdAICAgJEBAKCAgIyAgICApMCEgIyNAOAotTSggIC8gICAgKTAgICAmQEAoICAlICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggIDIgICAgIkAhIAotTSMqIDgoICAtICAgICJAICAgJ0BAKCAgISAgICAkUCEgIzFAOCggIC8gICAgJFAgICAsIEAoICAjICAgIAotTSZAISAjPUA4KCAgMSAgICAmQCAgIDRAQCggICUgICAgKDAhICNSIDgoICAzICAgICgwICAgQyBAKCAgJwotTSAgICAqMCEgJDUgOCggIDUgICAgKjAgICAxQEAoICApICAgICxAISAkRkA4KCAgNyAgICAsQCAgIDBQQAotTSggICsgICAgLkAhICRXMDgoICA5ICAgIC5AICAgNjBAKCAgLSAgICAwUCEgJS1AOCggIDsgICAgMFAgIAotTSAlIEAoICAvICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICQgICAgIyAhICUzIDgoICAiICAgIAotTSMgICAgISBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAkICAgICNAISAlNCA4KCAgIgotTSAgICAjQCAgICEgQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgIiAgICAgMCAgICAgQAotTSggICAgICAgIDAgICAgIEwoICAiICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggIC0gICAgIkEgIAotTSJfIClTX19fICAgICQxICAiX0ApU19fXyAgICAmISAgIl9QKVNfX18gICAgJ1EgICMgIClTX19fICAgIAotTSlBICAjIDApU19fXyAgICArUCEgJTUgOCggIC0gICAgK1AgICBRQEAoICAmICAgIC1AISAmJkA4KCAgLwotTSAgICAtQCAgICQgQCggICggICAgLlAhICYqQDgoICAxICAgIC5QICAgMSBAKCAgKiAgICAgMCAgICAgQAotTSggICAgICAgIDAgICAgIEwoICAlICAgICNAISAmPCA4KCAgIiAgICAlMCEgJj1ANCtfX18gICAgI0AgIAotTSAiIEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICUgICAgI0AhICY+IDgoICAiICAgIAotTSUwISAmP0A0K19fXyAgICAjQCAgICIgQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJgotTSAgICAjICEgJkAgOCggIC0gICAgIyAgICAgUEAoICAhICAgICUwISAmQFA4KCAgLyAgICAlMCAgICBQQAotTSggICMgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJCAgICAiUCEgJkIgOCggIC0gICAgIlAgIAotTSAlMEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICggICAgIzAhICZIIDgoICAiICAgIAotTSMwICAgIkBAKCAgISAgICAkUCEgJkpANCtfX18gICAgJVAhICZLIDgoICAmICAgICcgISAmTFA0K19fXwotTSAgICAlUCAgICNAQCggICQgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJSAgICAjQCEgJk8gOAotTSggICIgICAgJTAhICZQQDQrX19fICAgICNAICAgIiBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgIAotTSAgIEwoICAiICAgICAwICAgICBAKCAgIF9fX19fUCAgICAgICAgICQgICAgIC9fX19fXCAgICAgICAgIAotTSFAICAgICNfX19fXyAgICAgICAgICBAICAgICBfX19fX1AgICAgICAgICAqICAgICAgICAgICAmICAgIAotTSBAICAgIDAgICAgJiAgICAiICAgICBIICAgICsgICAgIFAgICAgNCAgICAnICAgICIwICAgIUggICAgIwotTSAjICBfXyAgISAgICAgICAgICAgICAgICAwICAgIEAjICMgIF9fICAhICAgICAgICAgICAgICAgIDAgIAotTSAgQCMgIyAgX18gICEgICAgICAgICAgICAgICAgMCAgICBAJCAjICBfXyAgISAgICAgICAgICAgICAgIAotTSAwICAgISAkICMgIF9fICAhICAgICAgICAgICAgICAgIDAgICAhICUgIyAgX18gICEgICAgICAgICAgIAotTSAgICAgMCAgICEgJiAjICBfXyAgISAgICAgICAgICAgICAgICAwICAgIiAmICMgIF9fICAhICAgICAgIAotTSAgICAgICAgIDAgICAiICcgIyAgX18gICEgICAgICAgICAgICAgICAgMCAgICIgKCAjICBfXyAgISAgIAotTSAgICAgICAgICAgICAwICAgIiAoICMgIF9fICAhICAgICAgICAgICAgICAgIDAgICAiICkgIyAgX18gIAotTSEgICAgICAgICAgICAgICAgMCAgICIgKiAjICBfXyAgISAgICAgICAgICAgICAgICAwICAgIiArICMgIAotTV9fICAhICAgICAgICAgICAgICAgIDAgICAkICMgISAgIFAgMCAgLCAkICAkICEgICEgIDAgIDQgJCAgJgotTSAhICAhQCAwICA8ICQgICggISAgIiAgMCAgRCAkICAqICEgICJQIDAgIFAgICAjX19fX19fX19fX1BQIAotTSAgI19cICAhICAgICAgUCAgICNfX19fX19fX19fUFAgICAjX1wgICkgICAgICBUICAgI19fX19fX19fXwotTV9QVCAgICNfXCAgMSAgICAgIFQgICAjX19fX19fX19fX1BUICAgI19cICA5ICAgICAgICAgIjQjICAgIAotTSAgICAqMCwgICAgICAgIE0gUCAgICAgICAjJCQgICAgICAgIC0wMCAgICAgICAgWSEwICAgICAgICNUJgotTSAgICAgICAgMDA4ICAgICAgICElIVAgICAgICAgJEQoICAgICAgICAzMEAgICAgICAgITEiMCAgICAgIAotTSAlNCogICAgICAgIDYwTCAgICAsICAgIF9fX19fX19fX19cLCAhICBfXyAgNjAgICAgICwgISgwX18gIAotTTYwICAgICAsICMsUF9fICAgMCAgICAjX1wgICQgICAgICAgICAgICAgICAiICAgIFAvX1AgIDAgICAgIAotTSAgICAgICAgICAkICAgKSBfXyAgISAgICAgICAgICAgICAgICAgICAhKCAsICEgIF9fICA2MCAgICAgLQotTSAgICBfX19fX19fX19fXCwgISAgX18gIDYwICAgICAsICEoMF9fICA2MCAgICAgLCAjLFBfXyAgIDAgIAotTSAgI19cICAkICAgICAgICAgICAgICAgIiAgICBQL19QICAwICAgICAgICAgICAgICAgJCAgICkgX18gIAotTSEgICAgICAgICAgICAgICAgICAgISggLSAgICBfXyAgN0AgICAgIC4gICAgX19fX19fX19fX1wgICAgIAotTSAgICAgICAgICAgLiAgICBfXyAgOFAgICAgIC4gICAgX19fX19fX19fX1wgICAgICAgICAgICAgICAgLgotTSAgICBfXyAgOiAgICAgIC4gICAgX19fX19fX19fX1wgICAgICAgICAgIFggICAjX1wgIU0gICAgICBYIAotTSAgI19fX19fX19fX19QICAgICAgICAgICNAICAgL19QICckICAgICAjQCAgIC9fX19fX19fX19fICAgIAotTSAgICAgICAuICAgIF9fICA9MCAgICAgLiAgICBfX19fX19fX19fXCAgICAgICAgICAgWCAgICNfXCAhWgotTSAgICAgIFggICAjX19fX19fX19fX1AgICAgICAgICAgICAgICAgICAgICAgICAiKSFAICAgICAgICAgJgotTSAgICAgQCAgICAwICAgICYgICAgIiAgICAgSCAgICArICAgICBQICAgIDQgICAgJyAgICAiMCAgICFIIAotTSAgICAgICAjIUAgICAgICAgICAmICAgICBAICAgIDAgICAgJiAgICAiICAgICBIICAgICsgICAgIFAgIAotTSAgNCAgICAnICAgICIwICAgIUggICAgICAgICQhQCAgICAgICAgICYgICAgIEAgICAgMCAgICAmICAgIAotTSIgICAgIEggICAgKyAgICAgUCAgICA0ICAgICcgICAgIjAgICAhSCAgICAgICAgIyFAICAgICAgICAgJgotTSAgICAgQCAgICAwICAgICYgICAgIiAgICAgSCAgICArICAgICBQICAgIDQgICAgJyAgICAiMCAgICFIIAotTSAgICAgICAjIFAgMCAgICAgIDQjICEgIF9fX19fUCAgICAgICAgICggICAgIC9fX19fXCAgICAgICAgIAotTSEgICAgICNfX19fXyAgICAgICAgICAwICAgICBfX19fX1AgICAgICAgICA4ICAgICAvX19fX1wgICAgIAotTSAgICAhICAgICAgICAgICAhQCAgICAoICAgICQgICAgIUAgICAgQCAgICAqICAgICJQICAgICwgICAgJQotTSAgICAhUCAgICBEICAgIDogICAgICAgICEwOCAgICAgICAgJyZAICAgICAgICAgJiAgICAgQCAgICAwIAotTSAgICYgICAgIiAgICAgSCAgICArICAgICBQICAgIDQgICAgJyAgICAiMCAgICFIICAgICAgICAjJkAgIAotTSAgICAgIDQmICAgICAgICAhUDggICAgICAgICkhQCAgICAgICAgTCYgICAgICAgICMwOCAgICAgICAgLwotTSFAICAgICAgICEkJiAgICBfX19fX1AgICAgICAgICAjICAgICAvX19fX1wgICAgICAgICAgUCAgICAgIAotTSAgICAhQCAgICAoICAgICQgICAgIUAgICAgQCAgICAqICAgICJQICAgICwgICAgJSAgICAhUCAgICBEIAotTSAgIDogICAgICAgICAgOCAgICAiICAgICEgICAgIDggICAgKCAgICAiQCAgICBMICAgICMgICAgITAgIAotTSAgPCAgICApICAgICZAICAgICAgICAgJiAgICAgQCAgICAwICAgICYgICAgIiAgICAgSCAgICArICAgIAotTSBQICAgIDQgICAgJyAgICAiMCAgICFIICAgICAgICAoJkAgMCAgICAgIEg6ICAgICAgICAjIUggJCAjXwotTV9fX18gICAgICAgICAgMCAgICAgX19fX19QICAgICAgICAgJCAgICAgICAgICAgJiAgICAgQCAgICAwIAotTSAgICYgICAgIiAgICAgSCAgICArICAgICBQICAgIDQgICAgJyAgICAiMCAgICFIICAgICAgICAjIUAgIAotTSAgICAgIDQmICAgICAgICAgIDggICAgIiAgICAhICAgICA4ICAgICggICAgIkAgICAgTCAgICAjICAgIAotTSEwICAgIDwgICAgKSAgICAmQCAgICAgICAgLCYgICAgX19fX19QICAgICAgICAgIyAgICAgL19fX19cIAotTSAgICAgICAgIVAgICAgI19fX19fICAgICAgICAgIDAgICAgICAmLVI9IyVUOTdBVCtHLCA0VTEhNEUxJgotTTREVCA3VV1TPSYlUj0gIT87Nl1OOFZdTj0nKU87ICE/OzYtTz02WVQgJV1TPCcpTzhWVU87Ry1UODcpVAotTSAgIE84RiVCODJdQz43IVI5Ny1TK1c1UzxCXUk7Ri1MPTYxRStXKUU5VjFFOUJZSCAgIE84RiVCODJdQwotTT43IVI5Ny1TK1c1UzxCXUk7Ri1MPTYxRStWJVM7MllIICAhQzxHMFE9JkVOOjcwTjxQICA5VjFCOzY0TgotTThQIFwrUzEkOTYpVTlSXF4gJyFVPCZFTC5CXUM+Nj1JO0cwTzwmUUE+Ml1GO0Y4TzlWMUI7NjROOFAgVwotTSwjKFMtI0BTLUNEIC0zLFgtQCFUN1ctVDxHNUM9ICFWN1YtSDg3KT87NjVNOEY1UiAnOT88VkFPPEcxPwotTTs2NU04RjVSICc5Pzo2WVQ3VlVFOzYpRTxAIVY3VlFPO0Y9Pzs2NU04RjVSICc5PzlGUU84NzE/OzY1TQotTThGNVIgJzk/OSZdVThGUUU3VlVFOzYpRTxAIE4xQyRRICc5PzhWQUE8RV1NOTZVQjk3KCA9RV1TOiZdUgotTT0lXU05NlVCOTcoID1FXUk7RzE/OzY1TThGNVIgJzk/OyZdTjlVXU05NlVCOTcoID1FXUY7Jl1BPSVdTQotTTk2VUI5NyggPUVdRDtXNUI7JjU/OzY1TThGNVIgJzE/PTZZSTtWWCA9RV1DOiYlUjdWVUU7NilFPEAhVgotTTdXLUg7VylUN1ZVRTs2KUU8QCFWN1ZFTj0lXU05NlVCOTcoID1FXUw7VllHN1ZVRTs2KUU8QCFWN1Y5TAotTTtWJVQ3VlVFOzYpRTxAIVY3VjFPPTYpTDk1XU05NlVCOTcoICtEOFEsUCFWN1YtSDg3KT87NjVNOEY1UgotTSAnOT88VkFPPEcxPzs2NU04RjVSICc5Pzo2WVQ3VlVFOzYpRTxAIVY3VlFPO0Y9Pzs2NU04RjVSICc5PwotTTlGUU84NzE/OzY1TThGNVIgJzk/OSZdVThGUUU3VlVFOzYpRTxAIVY3Vi1IODcpPzlHNU44UCFWN1ctSQotTTlWWUU5JV1DOiYlUjdWOVU7RiwgPUVdVTtHLUk5VllFOSVdQzomJVI3VjlVO0YsID1FXVM6Jl1SPSVdRgotTT02WUMgJzk/PFZFRztGNUQ3Vy1IO1cpVDdWOVU7RiwgPUVdVTtHLUk5VllFOSVdUzomXVI9JV1GPTZZQwotTSAnOT86NllUN1Y5VTtGLCA9RV1TOjY9Tjk2MT86NllUN1Y5VTtGLCA9RV1VO0ctSTlWWUU5JV1JO0cxPwotTTlHNU44UCFWN1ZRTztGPT85RzVOOFAhVjdXLUk5VllFOSVdTDtWWUc3VjlVO0YsID1FXVU7Ry1JOVZZRQotTTklXUw7VllHN1Y5VTtGLCA9RV1GOyZdQT0lXUY9NllDICc5PzkmXVU4RlFFN1Y5VTtGLCA7JkVOOlAhTgotTTk3QVQgJlFJO0ZNRj02WUMgJy1UPTY5RiAnMVU3VlFJO0ZMIDtGNVg9ICFMOjZZSzlHNU44UCFTPSc1RgotTTlAIE4xQyhZICcpRTkgIUc8RjVFO0AhQjsnNUUgJi1POyZdUjxQIVk5NlFMO1c8IDwnNVI8JlFFICchSQotTTtGTCArRDhTLDAhQzomNVY+MCFGO1cpRCAmLUE8RywgOEZVVyAnIU88Ry1DOiY0ICtEOFMsUCEmMDRRMwotTTEwITQ0RTUlICYpTztWUUU4NlggOEc5QTsnLCA5RiVMPFY0ID0nKVU5MCFCO1ZdTDk2JU4sQCFNOjctTwotTTxGMUU8RjVEICcxVztQIU87RjQgPkY1UjtQIVQ6JylFOTAhTTg2RU4gICFHOTZYTzxXMVU4RjlQOTctVAotTTg3KVQrRiwgN1VdUjk2JUQ5NllWN1ctSTlWOVA5MCAgOFcxWTwmNE44UCFGOjcpUz0lXUM4NlFMICVdUwotTTk3MUM6JylDOyYlUzxQICA5VjVOK1YtVTk3QUk9IllDICY1WDo3MCAgJj1FPSY1Tj1CWUMgJj1FPSY1TgotTT1AIU49RlVBPSYtSCAgIUc5NlhPPFcxUjhXIVkrRywgPFcxUjhXIVkgIyRELCMgUCwjIFAsIyBQLCAgRAotTTkmXUM6IywgKSYxTzhWQFIgIjFEO1YtSCwwIEQ5Jl1DOiMgICAnLVk8Ul0/O1chRTtCWVMgJV1PPCY1TgotTSAjREQsIyBQLCMgUCwjIFAsICAgK1YpQThGJE84V0VQPEY1UzxSXVU8VyhPOjZZQzsnNUQ5Ml1TPjcsTgotTTxQICArVilBOEYkTzhXRVA8RjVTPFJdVTxXKE86NllDOyc1RDkyXVM+NyxPPFdFUzhWJUw7IllIICAhUwotTT43LE83VylFODYwTjxQIT88RjVBOSAgWSkjIFAsIyBQLCMgUCwjICAgJj1FO0JdQjhWXVA+MllTICZVRQotTTs2LVA+MCFHO1Y5TzxHPUE8RjFTICY5TzxHPUE8RjFTN1YpWT0mNUM7VyFZICNEWSkjIFAsIyBQLCMgUAotTSwjICA8RjVUICY5TzxHPUE7JkVHO0YlQjsmNCA5Rl1SPVVdQztXIVksQCFGO1cpVzdWLU88J0RTICY5TwotTTxHPUE8RjFTICY5TzxHPUE8RjFTN1MsUiAmOU88Rz1BPEYxUzdTJFYgJjlPPEc9QTxGMVM3UzAgOVZdQgotTTg2LUs9ViVSOScsIDhGJUM6Vz1BPEYxUzdWKVk9JjVDO1chWSAjRFkpIyBQLCMgUCwjIFAsIyQgOEYlQwotTTpWJUw6Nj1OODYpTDkwIUI4Ni1LN1YtTzwnRFIgJilBOFZNPzhWXVA+MywgOEYlQzpXPUE8RjFTICYpQQotTThWTVc4NylEPFVcUyxAIUI4Ni1LPVYlUjknLT8sMzggOEYlQzpXPUE8RjFTN1MwICAnLVk8Ul0/OFZRTwotTTxWNE48UCE/OFZRTzxWNCAuMjBQLCMgUCwjIFAsIyBQICAhQT0mNVg6NzBOOFAhPzdWWUU+JzFGO0AhPwotTTdWNVg6NzE/OUZZUyAmJVQ5N0FJPSAhPzdWLUE7JlE/OTdBST0mOU48UCAgOUZRUzhHNUYrRiwgN1YtTAotTTk2JU49NyAgOUYtTDtXLUUgJjlGOyc1UzogIT85RlFTOEc1RiAlXVg5RlFTOEc1RiAlXVc8RzFDOiZMIAotTTdWOUk7RjFCPTY4IDdWKVU5Ry1ZO0YsICAnLVk8Ul1FPiZFVCtHLCA3VjVYOjcwICAmLVI9Il1DOTcpUgotTTtXKE48UCE/OFY1UjxGXVIgICFEODcxQStGLCAgJlVQN1YxRTlCWUMgICFNODZRTDtWLE44UCFBOyZRTwotTThXLCA4NlFMO1YtUCAmJUw7Jl1DPSAhQTsmUU84V0AgODZRTDtWLUU7RjAgOzYlTDsmXUMgJjlSOTY0IAotTTxGNUE7JlFPOFAgIDxXRVMrVV1MPFY1RTpSWVMgJV1MPFY1RTpQIFkpIyBQLCMgUCwjIFAsIyAgICctWQotTTxSXT89VylJPSY0TjxQIT89VylJPSY0IC4yMFAsIyBQLCMgUCwjIFAgICE/O1ctRTxHKU88QllDICVdTwotTTxWNVI8Rl1SICVdUzk3MU88VjVSPEZdUiAgIT86Ny1BPScxWStGLCA3VkVTODcxVD4wICA8V0VTK1VdUwotTThHKUsrRywgN1ctQjxGTCA5NylSICVdQjxGTCAsMjBQLCMgUCwjIFAsIyBQICAhUz43LE83VkVPOFcxTAotTStHLCA3VkVPOFcxTCAjREQsIyBQLCMgUCwjIFAsICAgOFcpVDtGRU46NzBOPFAgIDdWNU49RkVSO1ZYIAotTTk2WVY6NylPO0AhPzdUJVI5ViwgN1VdITxGPVYgJjVSPEZZTyAlXT88VzFBPEcwIDdWPVAgJV0/OjctVAotTTg3KVQgJV0/PEY1QTkmNU49RV1TOjY9RjwmNCA3Vy1FPSYtSDxGLUw4Ny1TICZVQTo2WCA5N0FJPSAhPwotTTs2XU44Vl1OPScpTzsgIT87Ni1PPTZZVCAlXVM8JylPOFZVTztHLVQ4NylUICc5PzhWQUE8QCFWN1ctSQotTTlWWUU5JV1DOiYlUiAnOT89NllTOjY9Tjk2MT84VkFBPEAhVjdXLUg7VylUICc5PzxWRUc7RjVEN1ctSAotTTtXKVQgJzk/PTZZUzo2PU45NjE/PFZBTzxHMCA9RV1JO0cwID1FXVM6Nj1OOTYxPzo2WVQgJzk/PTZZUwotTTo2PU45NjE/OjZZVCAnOT87Jl1OOVAhVjdXLUk5VllFOSVdTDtWWUcgJzk/PTZZUzo2PU45NjE/OyZdTgotTTlQIVY3VjlMO1YlVCAnOT85Jl1VOEZRRSAnOT84VkFBPEVdQTxHKUE+MCFWN1ctSTlWWUU5JV1DOiYlUgotTTdWJVI8RiVZICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4wIVY3Vy1IO1cpVDdWJVI8RiVZICc5PwotTTxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWSAnOT89NllTOjY9Tjk2MT88VkFPPEcxPzg3KVI4N0QgPUVdSQotTTtHMT84NylSODdEID1FXVM6Nj1OOTYxPzo2WVQ3ViVSPEYlWSAnOT89NllTOjY9Tjk2MT86NllUN1YlUgotTTxGJVkgJzk/OyZdTjlVXUE8RylBPjAhVjdXLUk5VllFOSVdTDtWWUc3ViVSPEYlWSAnOT89NllTOjY9TgotTTk2MT87Jl1OOVVdQTxHKUE+MCFWN1Y5TDtWJVQ3ViVSPEYlWSAnOT85Jl1VOEZRRTdWJVI8RiVZICc5PwotTThWQUE8RV1QO1ZFTj0mNVIgJzk/PFZFRztGNUQ3Vi1IODcpPzwmXUk7RzFFPEAhVjdXNU48VkVHO0Y1RAotTTdWLUg4Nyk/PCZdSTtHMUU8QCFWN1ctSDtXKVQ3VyFPOjZZVDk3KCA9RV1TOjY9Tjk2MT88VkFPPEcxPwotTTwmXUk7RzFFPEAhVjdXNU48VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQ5NyggPUVdSTtHMT88Jl1JO0cxRQotTTxAIVY3Vy1JOVZZRTklXUk7RzE/PCZdSTtHMUU8QCFWN1c1TjxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UgotTSAnOT87Jl1OOVVdUDtWRU49JjVSICc5PzxWRUc7RjVEN1ZRTztGPT88Jl1JO0cxRTxAIVY3VzVOPFZFRwotTTtGNUQ3VlFPO0Y9PzwmXUk7RzFFPEAhVjdWOUw7ViVUN1chTzo2WVQ5NyggPUVdRDtXNUI7JjU/PCZdSQotTTtHMUU8QCFWN1ctVDxHNUM9IyQgPUVdUz0nKVU4VzBSICc5Pz02WUk7VlggPUVdVTtGRU87QyggPUVdQwotTTomJVI3VjlVO0YsID1FXVM6Nj1OOTYxPzhWQUE8RV1GPTZZQyAnOT89NllTOjY9Tjk2MT84VkFBPEVdRgotTT02WUMgJzk/PFZBTzxHMT85RzVOOFAhVjdXLUk5VllFOSVdUzomXVI9JV1GPTZZQyAnOT89NllTOjY9TgotTTk2MT88VkFPPEcxPzlHNU44UCFWN1ZFTj0lXUY9NllDICc5PzxWRUc7RjVEN1ZFTj0lXUY9NllDICc5PwotTT02WVM6Nj1OOTYxPzo2WVQ3VjlVO0YsID1FXUw7VllHN1Y5VTtGLCA9RV1TOjY9Tjk2MT87Jl1OOVVdRgotTT02WUMgJzk/PTZZUzo2PU45NjE/OyZdTjlVXUY9NllDICc5PzlGUU84NzE/OUc1TjhQIVY3VjFPPTYpTAotTTk1XUY9NllDICctPzsmRU46UCFVN1ZRSTtGTCA8JylJOzYlUj4wIU47VllQPEZFTTg3KVkgJi1MPTZZSwotTTk3KCA8VyFPPEcxUzhWJVIgJV1DPSdFUDkwIUc5NzFFO0c4IDxXMVI4VyFZICVdTzwmNU4gJV1SOTYlRAotTSAmVUU7Ni1QPjAhPzhWUU88VjQgN1VdVDxGJVA3VjlQOTVdTz1GNVI8RkVEOTAhPzdWLUE7JlE/OTdBSQotTT0mOU48UCE/OFZRRTg2WVU8ICE/OTdBST0gIT84VjVSPEZdUiAmJVQ5N0FJPSAhPzhHNUY5NllEPSYlQgotTSAlXUk7ViggN1ctUDxGXUM5NjAgN1ZRQTxXMUI9NjggN1ctSThHNUYgJV1TO1YpVTlAIT88VlVCPTY4IAotTTlGOUw9Ny1IICY5QzsmXVM5MCFGPEY1RSAlXUw8VjVFOlAhPz4mOUw8VilVOUAhPzlGUVM4RzVGICVdVwotTTxGRVQ5MCE/PVcpVDhWQUsgJV1CPTY5Uz42WUMgJV1TOTcxTzxWNVI8Rl1SICVdRjo2WUQ4RzVGICZVQQotTTsmUU84UCE/OjctQT0nMVkgJV1MO1YtSyAlXVU7Jl1DOlAhPztGUU84VkwgN1ZFTDtWLUsgJV1GOyZdQwotTTpQIT89VlFPOFZMIDdWLUw7Vi1LICVdVDsmXUM6UCE/OFcxTDtWLUsgJV1EOyZdQzpQIT84ViVTICVdVQotTTxVXVI8VzFIPEY1QTklXVM9JjFJO1AhPzxWKVI6UCE/OEcpSyAnKUU4NlFMO1YsIDdWXVM5NylSO1coIAotTTdWRU84VzFMICY1TjkgIT87NkVOOEcpSyAlXUM9NylCPEZMIDdWNU45ICAgICQgIVAgICAgICQgICAgIAotTSAgICAwICAgICAgICAgICsgICAgICAgICAiJCAgICAgICAgICAgICAgIDAgICAgICAgICAkICAgICAgIAotTSAgICUmOCAgICAgICAgICAgICA/ICQgIVAgICAgICQgICAhICAgICApICAgICBMICAgICIgICAgICAgIAotTSAgICAgICAgICAgICAgICQgICAgICAgMCAgICAgICAgICA0ICAgICUnOCAgICAgICAgICAgICAgICQgIQotTVAgICAgICQgICAhRCAgICAoMCAgICBUICAgICIgICAgICAgICAgICAgICAgICAgICAgICQgICAgICAgMAotTSAgICAgICAgICBIICAgICUnOCAgICAgICAgICAgICAgICQgIVAgICAgICQgICAiJSAgICAjMCAgICBcIAotTSAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcICAgICEnOCAgICAgIAotTSAgICAgICAgICQgIjQgICAgICQgICAiMiAgICM/MCAgICEkICAgIiogICAgKDAgICAsXCAgICAgICAgIAotTSAgICQgIFwgICAgMCAgICEmQCAgICEgICAgICEgMCAgICAgICAhXCAgICBfICQgJUQgICAgICQgICAwLwotTSAgICApMCAgIClMICAgICQgICAgXCAgICAgKCAgICAgICAgICAgIDMgICQgICAkSiAgICAjUCAgICEkIAotTSAgICEgOCAgICAgICAlWCAgICAhICQgJUggICAgICQgICAwVCAgICAoMCAgIClcICAgICUgICAgXEAgIAotTSAjTCAgICAgICAgICAgIDQgICQgICAkWSAgICAjUCAgICEoICAgICEgOCAgICAgICAlXCAgICA3ICQgJgotTUQgICAgICQgICAxNSAgICAkUCAgICowICAgICQgICAhKzAgICAgVCAgICAgICAgICAgIDUgICQgICAlKAotTSAgICAjUCAgICEsICAgICEgOCAgICAgICAnOCAgICAsICQgJlQgICAgICQgICAxSCAgICAmMCAgICpAIAotTSAgICYgICAhLkAgICAkICAgICAgICAgICAgIDYgICggICAlNyAgICAkMCAgICEwICAgICEgOCAgICAgIAotTSAoKCAgICAwICQgJ1QgICAgICQgICAyISAgICAvQCAgICpYICAgICkgICAhPkAgICAiSCAgICAgICAgIAotTSAgIDggICQgICAlSCAgICAhICAgICE0ICAgICUmOCAgICAgICApKCAgICBKICQgKEAgICAgICQgICAyXwotTSAgICAoICAgICs8ICAgICUgICAhSSAgICAgQCAgICAgICAgICAgIDkgICQgICAlTCAgICAhICAgICFIIAotTSAgICUmOCAgICAgICArUCAgICAlICQgKEAgICAgICQgICAzPyAgICAoMCAgICtQICAgICIgICAgICAgIAotTSAgICAgICAgICAgICAgICEgICAgICAgJCAgICAgICAgICFcICAgICUnOCAgICAgICAgICAgICAgICQgKAotTUAgICAgICQgICA0ICAgICAqMCAgICtYICAgICIgICAgICAgICAgICAgICAgICAgICAgICEgICAgICAgJAotTSAgICAgICAgICIwICAgICUnOCAgICAgICAgICAgICAgICQgKEggICAgICQgICA0SSAgICAoICAgICwgIAotTSAgICUgICAhSyAgICAgQCAgICAgICAgICAgIDogICQgICAlUCAgICAhICAgICJEICAgICUmOCAgICAgIAotTSAsJCAgICAlICQgKFAgICAgICQgICA1KSAgICElICAgICw0ICAgIDkgICAhTSAgICAsOCAgICAgICAgIAotTSAgIDsgICQgICAlVCAgICAhICAgICJYICAgICUmOCAgICAgICAsOCAgICJUICQgK1QgICAgICQgICA5PQotTSAgICAoQCAgIC1YICAgICUgICAiPkAgICAgQCAgICAgICAgICAgIDwgICQgICAlWCAgICAhICAgICMsIAotTSAgICUmOCAgICAgICA3SCAgICAlICQgK1wgICAgICQgICA5XyAgICAtICAgIC4sICAgICggICAiQEAgIAotTSAiUCAgICAgICAgICAgID0gICggICAlXCAgICAkMCAgICNAICAgICEgOCAgICAgICA3XCAgICAoICQgLAotTUggICAgICQgICA6UyAgICAzICAgIC5MICAgIDIgICAiS0AgICBCKCAgICAgICAgICAgID8gIEAgICAmLQotTSAgICAnMCAgICNEICAgICEgOCAgICAgICA4PCAgICI7ICQgNSwgICAgICQgICA7XyAgICAkQCAgIC9UIAotTSAgICQgICAkVCAgICAgMCAgICAgICAgICAgIEcgICQgICAmSiAgICAhICAgICNIICAgICUmOCAgICAgIAotTSBCKCAgICAiICQgNTAgICAgICQgICA8MSAgICAlQCAgIDAkICAgICQgICAkVSAgICAgMCAgICAgICAgIAotTSAgIEggICQgICAmTiAgICAhICAgICNcICAgICMmOCAgICAgICBCMCAgICAjICQgNTQgICAgICQgICA8RwotTSAgICAiICAgIDA0ICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUiAgICAjMCAgICQoIAotTSAgICEgOCAgICAgICAgICAgICAgICQgNTQgICAgICQgICA8TyAgICAiQCAgIDA8ICAgICIgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAmXyAgICAjMCAgICQsICAgICEgOCAgICAgICAgICAgICAgICQgNQotTTQgICAgICQgICA8WSAgICAwUCAgIDBEICAgIC0gICAkViAgICAxTCAgICAgICAgICAgIEkgICwgICAnLAotTSAgICAkUCAgICQwICAgICEgOCAgICAgICBCPCAgICFOICQgOVAgICAgICQgICA9XCAgICAoQCAgIDE4IAotTSAgICUgICAlXFAgICAgQCAgICAgICAgICAgIEwgICQgICAnPyAgICAhICAgICQ0ICAgICUmOCAgICAgIAotTSBJNCAgICAlICQgOVggICAgICQgICA+PiAgICAoQCAgIDFMICAgICUgICAlXlAgICAgQCAgICAgICAgIAotTSAgIE0gICQgICAnQyAgICAhICAgICRIICAgICUmOCAgICAgICBJSCAgICAlICQgOiAgICAgICQgICA/IAotTSAgICAoMCAgIDIgICAgICYgICAmIFAgICAgOCAgICAgICAgICAgIE4gICggICAnRyAgICAkMCAgICRcIAotTSAgICEgOCAgICAgICBJXCAgICAjICQgOiggICAgICQgICA/QSAgICAkUCAgIDI4ICAgICQgICAmIjAgIAotTSAhNCAgICAgICAgICAgIFAgICQgICAnWCAgICAjUCAgICUgICAgICEgOCAgICAgICBKKCAgICApICQgOgotTUAgICAgICQgICA/VCAgICAqMCAgIDJIICAgICggICAmJ0AgICAhSCAgICAgICAgICAgIFEgICggICAoJwotTSAgICAiICAgICUkICAgICUmOCAgICAgICBKTCAgICAwICQgOlwgICAgICQgICBAPSAgICAoQCAgIDMoIAotTSAgICUgICAmLiAgICAgQCAgICAgICAgICAgIFMgICQgICAoLyAgICAhICAgICU4ICAgICUmOCAgICAgIAotTSBLTCAgICAlJCQgOyQgICAgICQgICBAXyAgICAjICAgIDM8ICAgICIgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICVMICAgICEnOCAgICAgICAgICAgICAgICAgICAgICAgICQgICAgIQotTSAgICAgQCAgICAoICAgICAgICAgIDAgICAgJCAgICAiICAgICBAICAgICAgICAgISAgICAgMCAgICAoIAotTSAgICIgICAgIFAgICAgMCAgICAlICAgICFAICAgIDwgICAgKCAgICAiMCAgICAoICAgICIgICAgIDAgIAotTSAgJCAgICAqICAgICAwICAgICggICAgKyAgICAjICAgICBIICAgICEgICAgIEAgICAgTCAgICAsICAgIAotTSJAICAgICQgICAgIiAgICAiUCAgICBQICAgIC0gICAgIDAgICAgKCAgICArICAgICMgICAgIFggICAgIgotTSAgICAgQCAgICAkICAgICEgICAgI1AgICAgJCAgICAiICAgICJQICAgIFAgICAgMCAgICAkMCAgICEoIAotTSAgICEgICAgIEAgICAgTCAgICAsICAgICRQICAgICQgICAgIiAgICAlICAgICE0ICAgIDYgICAgJVAgIAotTSAgJCAgICAiICAgICJQICAgIFAgICAgOCAgICAgMCAgICAoICAgICsgICAgIyAgICAhRCAgICA6ICAgIAotTSZQICAgICQgICAgIiAgICAiUCAgICBQICAgIDwgICAgIDAgICAgKCAgICArICAgICMgICAgIVQgICAgIAotTSAgICAgISAgIksgJUtfX18gICAgICAgICAgRDAgIEpQITpfX19QICAgICAgICAgMSQgICwkIDcvX19cIAotTSAgICAgICAgJiEgICMhMCVTX19fICAgICAgICAgIVwwICBQOCE8X19fUCAgICAgICAgIEUgJCAhUCFAQAotTSAgKCAgICAgICAgICsxICBCSCA0S19fXyAgICAgUCAgICMkIDAhTDwlTF9fX1AgICAgNCAgICBaICQgJQotTUQhQEAgICQgICAgJiAgICAyUCEgITogOCggICIgICAgISAgICAlQCAwIC5MJiIgIEEwICAgIDwgICAhPQotTSAkICZEIUBAICAkICAgICAgICAgOEAhICBCQDgoICAkICAgICAgICAgJlggMCAoUCYiICAhQCAgICAgIAotTSAgIVYgJCAiLyFAQCAgQCAgICAkICAgIEExICAiUSAlUCAgKCAgICAhICAgIChQMCAgTDEhPCAgIiAgIAotTSAgMCAgICI6JCAgKyRANyAgIEAgICAgJCAgICBKQSAgIlEwJVAgICMgICAgISAgICArKDAgIEw2ITwgIAotTSBQICAgIDAgICAjISQgICsmIDcgICBEICAgICQgICAgVEEgICJRUCVQICAkICAgICEgICAgLUAwICBMQAotTSE8ICAhICAgICAwICAgI0UkICArKSA3ICAgSCAgICAkICAgIF0hICAiUkAlUCAgJSAgICAhICAgIC9MMAotTSAgTEwhPCAgITAgICAgMCAgICQpJCAgKywgNyAgIEwgICAgJCAgICEmMSAgIlMwJVAgICYgICAgISAgIAotTSAyJDAgIExYITwgICFQICAgIDAgICAkSiQgICswIDcgICBUICAgICQgICAhLVEgICJUKCVQICAzICAgIAotTSEgICAgNEwwICBNJCE8ICAmMCAgICAwICAgJUEkICArMiA3ICAhXCAgICAkICAgITtRICAiVFAlUCAgRQotTSAgICAhICAgIDgwMCAgTTAhPCAgKlAgICAgMCAgICY7JCAgKzYgNyAgIyQgICAgJCAgICFJUSAgIlYgJQotTVAgIFcgICAgISAgICA7SDAgIE1IITwgIC8wICAgIDAgICAnLyQgICs8IDcgICQsICAgICQgICAhVyEgIAotTSJXQCVQICEpICAgICEgICAgPyAwICBOICE8ICAzUCAgICAwICAgKCYkICArQiA3ICAlNCAgICAkICAgIgotTSUhICA4XyAkOCAhOyAgICAhICAgIEIsMCAgTjAhPCAgODAgICAgMCAgIChSJCAgK0UgNyAgJiggICAgJAotTSAgICIyISAgIllAJVAgIUMgICAgISAgICBGIDAgIE48ITwgIDkgICAgIDAgICApUCQgICtIIDcgICY0IAotTSAgICQgICAiQVEgICJaMCVQICFGICAgICEgICAgSiAwICBOSCE8ICA5UCAgICAwICAgKk4kICArSyA3IAotTSAmQCAgICAkICAgIlBRICAiWyAlUCAhSSAgICAhICAgIE1IMCAgTlQhPCAgOkAgICAgMCAgICtJJCAgKwotTU4gNyAgJkwgICAgJCAgICJfUSAgIltQJVAgIUwgICAgISAgICBRPDAgIE8gITwgIDswICAgIDAgICAsRwotTSQgICtRIDcgICZYICAgICQgICAjLiEgIDhcICQ4ICFSICAgICEgICAgVCgwICYvOCEmICA+ICAgICAwIAotTSAgLSwkICArUiA3ICAnWCAgICAkICAgIzUhICAiXSAlUCAiJCAgICAhICAgIFVUIDAgKTAmIiAgKDAgIAotTSAgMCAgIC1JICQgIjohQEAgIjQgICAgJCAgICM/ICEgIEggOCggIEkgICAgISAgICBZJCAwICo4JiIgIAotTSswICAgIDAgICAuPiAkICJMIUBAICMkICAgICQgICAjTEAhICBMQDgoICBVICAgICEgICAgXEAgMCArQAotTSYiICAuMCAgICAwICAgLzMgJCAiXiFAQCAjVCAgICAkICAgI1kwISAgUSA4KCAhISAgICAhICAgIF9EIAotTTAgLEgmIiAgMTAgICAgMCAgIDAlICQgIzAhQEAgJEQgICAgJCAgICQmICEgIFVAOCggIS0gICAgISAgIAotTSEiVCAwIC1QJiIgIDQwICAgIDAgICAwWiAkICNDIUBAICU0ICAgICQgICAkMiEgICJdQCVQICJeICAgIAotTSEgICAhJFwwICYsUCEmICBXICAgICAwICAgMTYkICArVyA3ICAuNCAgICAkICAgJDdBICAiXiAlUCAjTgotTSAgICAhICAgISZEMCAgT0QhPCAgXUAgICAgMCAgIDFRJCAgK1ogNyAgL1ggICAgJiAgICQ+USAgICAgJAotTTNfX18gICAgIiAgICEoKCAwIDswJiIgICAwICAgIEQgICAyKSAkICdUIUBAICAkICAgICogICAkRCAhIAotTSIoIDgoICAhICAgICMwICAhKTggMCBCQCYiICAgMCAgICBYICAgMjwgJCAoUCFAQCAgJCAgICAvICAgJAotTUhQISAiXSA4KCAgISAgICAhUCAgISpIMCAgSzAhOl9fX1AgICAhICAgIDJeICQgLC4hQEAgIDQgICAgMQotTSAgICRTMCEgIyogOCggICEgICAgJEAgICEtOCAwITRQJiIgICAwICAgISwgICAzPCAkIDUwIUBAICAkIAotTSAgIDAgICAkWSAhICJfIDgoICAjICAgICUgICAhLkwwICAqQCEkX19fUCAgICEwICAgM1YkICAkLSAxLwotTV9fXCAgICA1ICAgJF5RICAiUCAlS19fXyAgICAlICAgITAwMCAgS1AhOl9fX1AgICAhMCAgIDQtJCAgMAotTSAgMU9fX1wgICAgNCAgICUlISAgMCAgJDtfX18gICAgJSAgICExTDAgJiAoISZfX19QICAgISQgICA0QgotTSAkIC1WIUBAICA0ICAgIDEgICAlKjAhICMxQDgoICAjICAgICVAICAhMyAgMCFBSCYiICAiICAgICE8IAotTSAgNFUgJCA5UCFAQCAgJCAgICAxICAgJS8gISAkNSA4KCAgKSAgICAkMCAgITQ0IDAgXEAmIiAgIVAgIAotTSAhQCAgIDUtICQgOVghQEAgICQgICAgMSAgICU1ICEgJEZAOCggICsgICAgJDAgICE1UCAwITM4JiIgIAotTSNQICAgIUQgICA1RSAkIDojIUBAICAsICAgIDEgICAlPDAhICRXMDgoICAtICAgICVAICAhN0ggMCE1MAotTSYiICAhQCAgICFIICAgNiEgJCA6KCFAQCAgJCAgICA1ICAgJUIxICAjIVAlU19fXyAgICAlMCAgIThcMAotTSAgUEAhPF9fX1AgICAhNCAgIDY2JCAgLCkgNy9fX1wgICAgNSAgICVHMSAgIyJAJVNfX18gICAgJTAgIAotTSE6MDAgIFBMITxfX19QICAgITQgICA2SyQgICwsIDcvX19cICAgIDUgICAlTEEgICMjMCVTX19fICAgIAotTSUwICAhO0QwICBQWCE8X19fUCAgICE0ICAgNyAkICAsLyA3L19fXCAgICA1ICAgJVIhICAjJCAlU19fXwotTSAgICAlMCAgITxcMCAgUSQhPF9fX1AgICAhNCAgIDc0JCAgKyEgNk9fX1wgICAgOyAgICVZUCEgJkggOAotTSggICEgICAgJlAgICE+VCAwIUpQJiIgICEgICAgITggICA3UiAkIDhKIUBAICBIICAgIDkgICAlXkAhIAotTSZAIDgoICAhICAgICcgICAhQCwgMCFLUCYiICAgMCAgICFMICAgOCokICJHMCExT19fXCAgICA7ICAgJgotSSNBICAiSCAkM19fXyAgICAmUCAgIUE4MCAgSiQhJF9fX1AgIF9fXCAgIDg+JCAiRzAhMU9fX1w7Ci0gCi1lbmQKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3BhcmMtYW91dC51IGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zcGFyYy1hb3V0LnUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNGVlZjkuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zcGFyYy1hb3V0LnUKKysrIC9kZXYvbnVsbApAQCAtMSw3MzIgKzAsMCBAQAotYmVnaW4gNzc3IHNwYXJjLWFvdXQKLU1AMCwhIlAgICggICAgIiAgICAgICAgICAjWVAgICIgQCAgICAgICAgICAiXCQiICBUIC5AMCkoI0gkMjUKLU0qQiAiRSAqQCEpMCIwIEg3ICAgMFUiK0BIICwgICBDIiAmKChAKSAgIDAqICAgMCEgICAgMCAgICJAJCAKLU0gICEgICBAJCAwICAgJCAgIC02PChaIEAwICAoIFAkICAgISAgIEAkIDAgICApV0NPVkBPICAgKEtBN0IKLU0qISQgICBCMCRCKCwwICAgMlkoMCggIkwkICAoREAuQDckICAgJE40JCIgQEAqKEAoISogICRcISAgICAKLU1QQS5AN0giQDgwTDJAICErIDAgICAuQCNIJiMiIFohRFhALkA6KjAlICAmMiEoIDErUCAgIipYNVhEQjAKLU0kIiAgRSEgQCExPEAgICI2JE4gIkYhICAlRCAgICMyOiQiICBJQSAgIikgIiAhMzIgWiFERSEgQCFRPEAKLU0gICI2JE4gMkYhICAlRCAgICJOOiQgIDQrUCAgIipYNVhHMDEgICAoRCEoQiZUICAgIi4yJCIgIEpBICAKLU0iLCgjSCZCIEQgICEgSCAgIlJcICAgQk4lPikoRCAzICRJKDAgISY0JCIgJyVSICAgKTgyWCEqOCQgIDUKLU0wICAgJVlIMCggIyIgWiFQSCAzICA+OENIJ1NKKFoiIFsiLkBBICwgICBDIiAmKChQQi5AQiAsICAhIyIKLU0gJiJAUEIuQEMgLCAgIEIiJCYhRFBCLkBEKSAwKCAmP1EgICBEQSBAPygnJ1ggQiFaICAgJCggICFIKDAKLU0oIDQwQCAgJEBBIEAxUSIgICAqIiQiICNEPSBAICBKICAgMCEgICAgQDwvQCIgJCAgICIwJCIgIkRAN0AKLU0hLTAlUCAiIiQiICREPSBAICkgMCgnXiIkIiAhRD0gQCAgICAwICBPPTctUitWUUk4Ql1MOSJZUztQIE8KLU05JjVWK1dJRTxGXCAgICAgICAgICY2LVI9IyBaKCZZTygiXVU8VyhPOyZFQitWUUQrRy1PIkAgICAgICAKLU0gICBGOFcpVCwjSEArVzVTPEJdTDo2KE87JjBOPFZcQDs2JVA8JkVOOVIhRjg2RUw9NylFIkAgICAgICAKLU0gITFDPEcwUC5CIU47UiBPOSY1VitXSUU8RlwqICAgICAgIj1YW14wTCEgQCAjIiAgICYhUV4gKEA+QCAKLU0gKVdDT1kiUCQiICAsKCAgIDgnJ1ggQiFaICAgRz4uX0QrIDAoICBQQCAgIUA8P0AiKCdIICAiPVhbXjAKLU1MISBAICMiICAgJiFRXiAoQD5AICApV0NPWSJQJCIgICwoICAgOCcnWCBCIVogICBHPi5fRCsgMCggIFAKLU1AICAhQDw/QCIoJ0ggICI9WFteMEwhIEAgIyIgICAmIVFeIChAPkAgIClXQ09ZIlAkIiAgLCggICA4JycKLU1YIEIhWiAgIEc+Ll9EKyAwKCAgUEAgICFAPD9AIignSCAgIj1YW14wTCEgQCAjIiAgICYhUV4gKEA+QCAKLU0gKVdDT1kiUCQiICAsKCAgIDgnJ1ggQiFaICAgRz4uX0QrIDAoICBQQCAgIUA8P0AiKCdIICAgICAgICAKLU1HPi5fRCEkICAgQyEgQi4gLCggICA4JydYIEIhWiAgIEc+Ll9EISQgICEjISZCIkgsKCAgIDgnJ1ggQiEKLU1aICAgMExAICApV0NPV0EgICAjRCAwICAgISQgICEjICpCLDAkMCAgJCkoMCggJzIqQik4JDAgICQpKDAKLU0oICsyKkIlWCQwICAkKSgwKCAvMixCJFAkMCAgJCkoMCggMzIsQiQoJDAgICQpKDAoIDcyLEInQCQwICAKLU0kKSgwKCA7MihCJygkMCAgJCkoMCggPzIoQiZAJDAgICQpKDAoIEMyKEIkICQwICAkKSgwKCBHMihCLCgKLU0kMCAgJCkoMCggSzIoQikoJDAgICQpKDAoIE8yKEIlQCQwICAkISwgICBDNCBGLlRVIihBKiEkICAhIDMKLU0gICAwVSFJQEwtMFooOEAxICAgMCRQICAkLTAqOFEjNCpCJlAkMCAgJCEsICAhIzQiRik4VSJIQUYhJCAKLU0gISAzICAgMFUgSUE+LTBKKC5AMSAgIDAkUCAgJC0wMjgzIzQsQilIJDAgICQhLCAgISM0JEYkKFUjKEIKLU0sISQgICEgMyAgIDBVISlBWC0wUig1QDEgICAwJFAgICQtMCI4PEM0KEIlICQwICAkISwgICEjNCBGJkAKLU1VIihBLiEkICAhIDMgICAwVSApQSAtMEIoQkAxICAgMCRQICAkLTAiOFBDNChCJkgkMCAgJCEsICAhIzQKLU0gRikoVSIoQUQhJCAgISAzICAgMFUgKUE4LTBCKC4gMSAgIDAkUCAgJC0wIjgyQzQoQilAJDAgICQhLCAKLU0gISM0JkYmKFUjSEEkISQgICEgNSAgIDBEQSpDJC0oQigvQDEgICAwJTAgICQpKDJIRUMyKEIjOCQwICAKLU0kITQgICEiMiRKJVhUQihBUCEkICAhIDUgICAwREEqQSwtKEIoNyAxICAgMCUwICAkKSgySDBDMihCJTAKLU0kMCAgJCE0ICAhIjIkSidAVEIoQyAhJCAgISA1ICAgMERBKkFSLShCKEUgMSAgIDAlMCAgJCkoMkg6IzIKLU0oQihAJDAgICQhNCAgISIyJEokIFRCKEEyISQgICEgNSAgIDBEQSpDIi0oQigvIDEgICAwJTAgICQpKDIKLU1IREMyKEIjMCQwICAkITQgICEiMiRKJUBUQihBTiEkICAhIDUgICAwREEqQSotKEIoNkAxICAgMCUwICAKLU0kKSgySDhDMihCJzgkMCAgJCkoMCggKzIoQiMoJDAgICQpKDAoICsyKEIoWCQwICAkKSgwKCAnMihCJzAKLU0kMCAgJCkoMCggJzIoQidIJDAgICQhLCAgISM0IEYpIFUiKEI8ISQgICEgMyAgIDBVISlBKC0wUig4IiEKLU1RXiAoQD5AICApV0NPWSAxICAgMFUgKEMoKCJCT19cMkAgIC1EQShDKC0gIjggMiBIQiAgIEggICI5MDAKLU0oICI2IEYgJERBIEAgKSgiOCAzMCBEICtAKihAICEqX19fVjQgSiAhREkqICAgMiAgIEgxICAgMEhBKEMKLU0oKiRKOCArMCEgIDFHXCggICogJC9fUiBJIiAgLStfX189ICQgISYhUV4gKEA+QCAgKVdDT1kgMSAgIDAKLU1UQChDJygiQjggICJAICApSCEoQyctICQgICI/UEAgIEggMEAhLSAkICAiIEhCICAkS19fXlAkICAgIDEKLU0gICApRCEoQkIkICAhRTYyJCIgIEA8P0AiKCdIICAiPVhbXjAkUCAgJC0gIjgrUiBIQiAgJEggICEpIDAKLU0oICVfX19fR1QiKUBPKCcnWCBCIVogICAgICAgICAgIDAmUCAgIDI2X19fX1EgICAwJ0AgICBGNl9fX18KLU1NICAgMCgwICAgNjZfX19fSyAgIDApICAgJFY2X19fXzMgICAgIDQgICAgNiAgICAyQCAgICAgICAgICAKLU0gICAgJiAgICAgSCAgICA3ICAgICEgICAgIUQgICAgKSAgICA1MCAgICBUICAgIEEgICAgKEAgICAiVCAKLU0gICBHICAgIDFfX19fX1wgICAgICAgICAtQCAgICAjX19fX18gICAgICAgICAkJCAgICAgICAgICFAICAKLU0gI1ggICAgIiAgICAlMCAgICBQICAgIFIgICAgKkAgICAgICAgICBLICAgICxQICAgIjAgICAgVSAgICAKLU0hUCAgICIwICAgICEgICAgKCAgICAgLCAgICA6ICAgICIgICAgI0AgICAgKyAgICAsICAgICBYICAgIDwKLU0gICAgI1AgICAhTCAgICAwICAgICkwICAgISQgICAgPSAgICAkQCAgICFYICAgIDMgICAgJ1AgICAhMCAKLU0gICBZICAgICUwICAgIiggICAgNiAgICAqUCAgICE8ICAgISYgICAgJiAgICAiLCAgICA5ICAgICwwICAKLU0gIUggICAgRyAgICAmUCAgICI4ICAgIDwgICAgKiAgICAhVCAgICBKICAgICdAICAgIkQgICAgPyAgICAKLU0vUCAgICIgICAgISEgICAgKDAgICAiUCAgICBDICAgICtQICAgIjQgICAgTiAgICApQCAgICAgICAgIEgKLU0gICAgICAgICAiRCAgICBbICAgICsgICAgIzggICAgTSAgICAtUCAgICJYICAgIFQgICAgK1AgICAjVCAKLU0gICBQICAgIC5AICAgIyQgICAhLyAgICAsQCAgICAgICAgIFMgICAgMEAgICAjMCAgICAgICAgIC0wICAKLU0gJDQgICAgVyAgICAvICAgICNAICAgISAgICAgLjAgICAgICAgICBaICAgICAgICAgI0wgICAhNCAgICAKLU0vICAgICUoICAgIF0gICAgMFAgICAjWCAgICEkICAgIC9QICAgJEQgICAhICAgICAyICAgICQoICAgICAKLU0gICAgMFAgICAgICAgICEkICAgIDMwICAgJDQgICAhKiAgICAxQCAgICRQICAgIScgICAgMlAgICAkQCAKLU0gICEwICAgIDIwICAgJFggICAhKyAgICA0MCAgICRQICAgITMgICAgMzAgICAgICAgICEuICAgICAgICAKLU0gJFwgICAgICAgICA0ICAgICAgICAgITEgICAgICAgICAlKCAgICAgICAgIDRQICAgICAgICAgICEwICcKLU1DICAgLFtAICAgICchUCAmWDAgIDAsQCAgICAuIjAgJVMgICAwUkAgICAgMyEwICUjQCAgKCIgICAgIDkKLU0gMCAjOEAgICAgICAgICBFIDAgJlhAICAgICAgICAgTCEwICM/QCAgKFtAICAgIFIhUCAlPEAgIDAqICAKLU0gICBbIVAgJy4wICAwICAgICAhJSAwICNIICAgICAgICAgISshMCAgXFAgIChRUCAgICE+ITAgJ0tQICAKLU0oUEAgICAhSiIwICdTUCAgMCxAICAgIVMhMCAiQFAgIChPMCAgICIqIjAgJl0gICAwLSAgICAiQSIwICMKLU1eQCAgMC1AICAgIlgiMCAnM1AgIDAuICAgICMvIjAgJDowICAwLkAgICAjRiIwICJLQCAgMC8gICAgI1YKLU0iMCAoNEAgIDAvQCAgICQmIjAgJkAgICAwMCAgICAkNiIwICAzICAgMDBAICAgJEYiMCAgTjAgIDAxICAKLU0gICRWIjAgJ1FAICAwMiAgICAkXyIwICZSICAgMDJAICAgJSgiMCAnRkAgIDAzICAgICUxITAgJERQICAKLU0oVUAgICAlRSEwICc7UCAgKEowICAgJVkiMCAiIFAgIDAzQCAgICYtITAgIFNQICAoVDAgICAmOiEwICMKLU1KUCAgKEkgICAgJkciMCAmVzAgIDA0ICAgICZUITAgJElAICApVFAgICAmXCIwIChBICAgMDRAICAgJzQKLU0iMCAmJSAgIDA1ICAgICdMIjAgJShQICAwNUAgICAoJCIwICRWMCAgMDYgICAgKDUiMCAiXUAgIDA2QCAKLU0gIChGIjAgJilAICAwNyAgICAoVyIwICQ5QCAgMDdAICAgKSgiMCAnKCAgIDA4ICAgICkyIjAgJTpQICAKLU0wOEAgICApPCEwICRRMCAgKFMgICAgKVEhMCAkPVAgIChOICAgIComIjAgIEkwICAwOSAgICAqOyIwICYKLU03MCAgMDlAICAgKlAhMCAlKVAgIChYMCAgICpeITAgJUMwICAoTFAgICArLCIwICgxICAgMDogICAgKzoKLU0iMCAhTlAgIDA6QCAgICtIIjAgJzxQICAwOyAgICArViIwICdQQCAgMDtAICAgLC8iMCAkUiAgIDA8ICAKLU0gICxIIjAgJ1wgICAwPEAgICAsTyIwICJeICAgMD0gICAgLFoiMCAnMSAgIDA9QCAgIC0sIjAgIVZAICAKLU0wPiAgICAtPiIwICRHQCAgMD5AICAgLUciMCAnKlAgIDA/ICAgIC1SIjAgJysgICAwQEAgICAtXSEwICMKLU1GMCAgKFZQICAgLjMhMCAmPTAgIChLQCAgIC5JIjAgI1NAICAwQiAgICAuXyIwICEiMCAgMEJAICAgLzUKLU0iMCAgOzAgIDBDICAgIC9LIjAgIj1QICAwQ0AgICAvVyIwICcxMCAgMEQgICAgL18hMCAkRzAgIChZUCAKLU0gIDAuIjAgKDgwICAwREAgICAwPSIwICVeQCAgMEUgICAgMEwiMCAnW0AgIDBFQCAgIDBbIjAgIVMwICAKLU0wRiAgICAxKiIwICJGMCAgMEZAICAgMTkiMCAnQTAgIDBHICAgIDFBIjAgJ0sgICAwUCAgICAxWyIwICcKLU1OMCAgMFBAICAgMiMiMCAnMUAgIDBRICAgIDIrIDAgJj0gICAgICAgICAyNCFQICJGICAgMCwgICAgMkYKLU0iMCAnPDAgIDBRQCAgIDJVIjAgIlRQICAwUiAgICAzJCEwICY+MCAgKVAgICAgMzchMCAmQjAgIClIQCAKLU0gIDNKIVAgJUggICAwK0E/OTcxRT4nMCA3VjVEODcxQSAlXUU7RjAgPFcxQTxHMCA8VzFBPEcxPzlGUU8KLU04NzAgN1VdRT4mRVQgJV1NODZFTiAlXUU7RzlJPEZdTiAlXT8xJUUuMDRVKTBQIT85N0FJPSAhPz1FXVMKLU06Nj1OOTYxPzo2WVQ3VjlVO0YsIDdXOT86NllUN1Y5VTtGLCA3VyFSOjZVQTxHRCA3Vzk/PTZZUzo2PU4KLU05NjE/PFZBTzxHMT85RzVOOFAhPz1FXVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIgJV1WN1ctSTlWWUUKLU05JV1DOiYlUjdXIU86NllUOTcoIDdXOT89NllTOjY9Tjk2MT87Jl1OOVVdQTxHKUE+MCE/PUVdVTtHLUkKLU05VllFOSVdQzomJVI3ViVSPEYlWSAlXVY3VlFPO0Y9PzwmXUk7RzFFPEAhPz1FXUM6JiVSN1chTzo2WVQKLU05NyggN1c5Pz02WVM6Nj1OOTYxPzo2WVQgJV1WN1ctSTlWWUU5JV1TOiZdUj0gIT89RV1EO1c1QjsmNT8KLU04NylSODdEIDdXOT89NllJO1ZYIDdXOT85RlFPODcwIDdXOT88VkFPPEcwIDdXOT88VkVHO0Y1RDdWUU8KLU07Rj0/OUc1TjhQIT89RV1TOjY9Tjk2MT84VkFBPEVdRj02WUMgJV1WN1ctSTlWWUU5JV1JO0cxPzg3KVIKLU04N0QgN1c5PzsmXU45VV1GPTZZQyAlXVY3Vi1IODcpPzlHNU44UCE/PUVdSTtHMT84NylSODdEIDdVXT8KLU07NiVJO0AhPz1FXVU7Ry1JOVZZRTklXUk7RzE/PCZdSTtHMUU8QCE/PUVdUzo2PU45NjE/PFZBTzxHMT8KLU08Jl1JO0cxRTxAIT89RV1VO0ctSTlWWUU5JV1TOiZdUj0lXUE8RylBPjAhPz1FXVU7Ry1JOVZZRTklXUwKLU07VllHICVdVjdWOUw7ViVUN1chTzo2WVQ5NyggN1c5PzxWQU88RzE/PCZdSTtHMUU8QCE/PUVdVTtHLUkKLU05VllFOSVdQzomJVIgJV1WN1c1Tjo2XU4sQCE/PUVdRDtXNUI7JjQgN1c5Pz02WVM6Nj1OOTYxPzo2WVQKLU03VjlVO0YsIDdXOT88VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCA3Vzk/PFZFRztGNUQ3VlFPO0Y9Pzg3KVIKLU04N0QgN1c5PzxWRUc7RjVEN1YtSDg3KT84NylSODdEIDdXOT85RlFPODcxPzlHNU44UCE/PUVdUzomXVIKLU09JV1GPTZZQyAlXVY3Vy1JOVZZRTklXUk7RzAgN1c5PzsmXU45VV1BPEcpQT4wIT89RV1DOiYlUjdWJVIKLU08RiVZICVdVjdXNU48VkVHO0Y1RDdWUU87Rj0/PCZdSTtHMUU8QCE/PUVdVTtHLUk5VllFOSVdQzomJVIKLU03VyFPOjZZVDk3KCA3Vzk/OjZZVCAlXVM8Jl1SPSctQzg3KCA3Vzk/OSZdVThGUUU3VyFPOjZZVDk3KCAKLU03Vzk/PTZZUzo2PU45NjE/PFZBTzxHMCA3Vi1MPTZZSzk3KCA3Vzk/PFcxUj02LVQsMCE/PUVdUz0nKVUKLU04VzBSICVdVjdXNU48VkVHO0Y1RDdWUU87Rj0/OUc1TjhQIT89RV1VO0ctSTlWWUU5JV1DOiYlUjdWOVUKLU07RiwgN1c5PzxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAlXVY3VzVOPFZFRztGNUQ3VkVOPSVdQTxHKUEKLU0+MCE/PUVdUzo2PU45NjE/PFZBTzxHMT84NylSODdEIDdWWU87RyFSOjZVQTxHRCA3Vy0/OyZFTjpQIT8KLU09RV1EO1c1QjsmNT85RzVOOFAhPz1FXVM6Nj1OOTYxPzsmXU45UCE/PUVdSTtHMT88Jl1JO0cxRTxAIT8KLU09RV1TOjY9Tjk2MT84VkFBPEAhPz1FXUY7Jl1BPSVdQTxHKUE+MCE/PUVdUzomXVI9JV1BPEcpQT4wIT8KLU09NV1MOjZZSyAlXVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoIDdXOT87Jl1OOVAhPz1FXUMKLU06JiVSICVdTztFXUU+JkVUICVdPzk3QUk9JV1EPTZVTT41XUQ5Ni1MICVdPzdULTQzVSk/MyRFMzUlXT8KLU0gJV0/N1QxNDNVKT8zJEUzNSVdPyAlXT83VjFPN1Y9TDtWKUE7JV1DPSZdUjxQIT83VV1EO1VdRzsmXUIKLU04NlE/OScxTzxHLCA3VV1FPiZFVDdWMVU7NlVZN1cpRTlAICAgICAgICJdVTxXKE87Jl1DODZQTzsmRUIKLU0rVj1DOFJVTDo2KE88VzVOLSJcUitDJE8uQl1VPFcoTzsmXUM4NlBPOyZFQitQICAgICAgICAgICAgIDMKLU1EKCAgICAgICAwICYgICAgICYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgIyAgISAjICAgMCIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKLU1AICAgJFRAICAkITwgICEgOCAgICFXQCAgID5IICAgKjYgICAgICAgICAgNSAgIC4yICAgITAgICAiICAKLU0gICAgLyAgIDAgICMgICAgQDwhQCAgJCAgICI9WFteQD9fX19fICQgICAiPVhbXkA/X19fXjAkICAgJj0KLU1YW15AP19fX11AJCAgICo9WFteQD9fX19cUCQgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAkIUkKLU0gICAgICAgICAgISBQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgMCYgICAgICAhICAgICAgIFgkICAgICAgIEAoICAgICE0JCAgICAgICBCRCAgICAhVCQKLU0gICAgICAgQkQgICAgIlFEICAgICAgIEJEICAgICU1RCAgICAgICBCRCAgICAlViAgICAgICAgICAgICAKLU0gJ14gICAgICAgICAgICAgICkmICAgICAgICAgICAgICArQiAgICAgICAgICAgICAgLSYgICAgICAgICAKLU0gICAgIC5eICAgICAgICAgICAgICAwViAgICAgICAgICAgICAgMj4gICAgICAgICAgICAgIDRGICAgICAKLU0gICAgICAgICA2UiAgICAgICAgICAgICAgOEYgICAgICAgICAgICAgIDo2ICAgICAgICAgICAgICA7PiAKLU0gICAgICAgICAgICAgPEogICAgICAgICAgICAgID4qICAgICAgICAgICAgICA+WiAgICAgICAgICAgICAKLU0gSEIgICAgICAgICAgICAgICAhJCAgIVkgICBCRCAgICAgISQgICFZICAgQkUgICAgICEkICAhWSAgIEIKLU1HICAgIFFIRCAgICAgICBCRCAgICAgISQgICFaICAgQkkgICAgICEkICAhWiAgIEJKICAgICAhJCAgIVoKLU0gICBCTCAgICBSREQgICAgICAgQkkgICAgICEkICAhWyAgIEJOICAgICAhJCAgIVsgICBCTyAgICAgISQKLU0gICFbICAgQlEgICAgVCBEICAgICAgIEJOICAgICAhJCAgIV0gICBCUyAgICAgISQgICFdICAgQlQgICAKLU0gICEkICAhXSAgIEJWICAgIFVERCAgICAgICBCUyAgICAgISQgICFeICAgQlggICAgICEkICAhXiAgIEIKLU1ZICAgICAhJCAgIV4gICBCWyAgICBWREQgICAgICAgQlggICAgICEkICAhXyAgIEJdICAgICAhJCAgIV8KLU0gICBCXiAgICAgISQgICFfICAgQyAgICAgWCBEICAgICAgIEJdICAgICAhJCAgIiEgICBDIiAgICAgISQKLU0gICIhICAgQyMgICAgICEkICAiISAgIEMlICAgIFlERCAgICAgICBDIiAgICAgISQgICIiICAgQycgICAKLU0gICEkICAiIiAgIEMoICAgICAhJCAgIiIgICBDKiAgICBaPEQgICAgICAgQycgICAgICEkICAiIyAgIEMKLU0sICAgICAhJCAgIiMgICBDLSAgICAgISQgICIjICAgQy8gICAgW1BEICAgICAgIEMsICAgICAhJCAgIiUKLU0gICBDMSAgICAgISQgICIlICAgQzIgICAgICEkICAiJSAgIEM0ICAgIF0sRCAgICAgICBDMSAgICAgISQKLU0gICImICAgQzYgICAgICEkICAiJiAgIEM3ICAgICAhJCAgIiYgICBDOSAgICBeKEQgICAgICAgQzYgICAKLU0gICEkICAiJyAgIEM7ICAgICAhJCAgIicgICBDPCAgICAgISQgICInICAgQz4gICAgX0BEICAgICAgIEMKLU07ICAgICAhJCAgIikgICBDQSAgICAgISQgICIpICAgQ0IgICAgICEkICAiKSAgIENFICAgISEgRCAgICAKLU0gICBDQSAgICAgISQgICIqICAgQ0cgICAgICEkICAiKiAgIENIICAgICAhJCAgIiogICBDSyAgICEiJEQKLU0gICAgICAgQ0cgICAhIy4gICAgICAgICAgICAgISleICAgICAgICAgICAgICEtXiAgICAgICAgICAgICAKLU0hMDogICAgICAgICAgICAgITIqICAgICAgICAgICAgICE0IiAgICAgICAgICAgICAhNVIgICAgICAgICAKLU0gICAgITZGICAgICAgICAgICAgICAgISQgICJSICAgQ04gICAgICEkICAiVSAgIENRICAgICAhJCAgIlYKLU0gICBDUyAgICAgISQgICJXICAgQ1YgICAgICEkICAiWSAgIENZICAgICAhJCAgIlogICBDXCAgICAgISQKLU0gICJbICAgQ18gICAgICEkICAiXSAgIEQiICAgICAhJCAgIl4gICBEJSAgICAgISQgICJfICAgRCggICAKLU0gICEkICAjISAgIEQrICAgICAhJCAgIyIgICBELiAgICAgISQgICMjICAgRDEgICAgICEkICAjJSAgIEQKLU00ICAgICAhJCAgIyYgICBEOCAgICAgISQgICMpICAgRDwgICAgICEkICAjKiAgIERAICAgICAhJCAgIysKLU0gICBERCAgICAgISQgICMtICAgREggICAgICEkICAjLiAgIERMICAgICAhJCAgIy8gICBEUCAgICAgISQKLU0gICMxICAgRFQgICAgICEkICAjMiAgIERYICAgICAhJCAgIzMgICBEXCAgICAgISQgICM1ICAgRSAgICAKLU0gICEkICAjNiAgIEUkICAgICAhJCAgIzcgICBFKCAgICAgISQgICM5ICAgRSwgICAgICEkICAjOiAgIEUKLU0wICAgICAhJCAgIzwgICBFNCAgICAgISQgICM9ICAgRTggICAgICEkICAjPiAgIEU8ICAgICAhJCAgI0AKLU0gICBFQCAgICAgISQgICNBICAgRUQgICAgICEkICAjQiAgIEVIICAgICAhJCAgI0QgICBFTCAgICAgISQKLU0gICNFICAgRVAgICAgICEkICAjRiAgIEVUICAgICAhJCAgI0ggICBFWCAgICAgISQgICNJICAgRVwgICAKLU0gICEkICAjSiAgIEYgICAgICAhJCAgI0wgICBGJCAgICAgISQgICNNICAgRiggICAgICEkICAjTyAgIEYKLU0sICAgICAhJCAgI1AgICBGLyAgICAgISQgICNRICAgRjIgICAgICEkICAjUiAgIEY1ICAgICAhJCAgI1QKLU0gICBGOCAgICAgISQgICNWICAgRjwgICAgICEkICAjVyAgIEZAICAgICAhJCAgI1cgICBGQCAgICE5OEQKLU0gICAgICAgQ04gICAhOVhAICAgICAgICAgICAgITpAQCAgICAgICAgICAgICE7SEAgICAgICAgICAgICAKLU0hPFhAICAgICAgICAgICAgIT1EQCAgICAgICAgICAgICE+TEAgICAgICAgICAgICAhP1xAICAgICAgICAKLU0gICAgIUBAQCAgICAgICAgICAgICFBQEAgICAgICAgICAgICAhQkhAICAgICAgICAgICAgIUMwQCAgICAKLU0gICAgICAgICFENEAgICAgICAgICAgICAhRUBAICAgICAgICAgICAgIUYwQCAgICAgICAgICAgICFHJEAKLU0gICAgICAgICAgICAhSFBAICAgICAgICAgICAgIUpcQCAgICAgICAgICAgICFNMEAgICAgICAgICAgICAKLU0hTyBAICAgICAgICAgICAgIVBEQCAgICAgICAgICAgICFSWEAgICAgICAgICAgICAhVEBAICAgICAgICAKLU0gICAgIVVcQCAgICAgICAgICAgICFYKEAgICAgICAgICAgICAhWVRAICAgICAgICAgICAgIVs0QCAgICAKLU0gICAgICAgICFdREAgICAgICAgICAgICAhXzhAICAgICAgICAgICAgIiEwQCAgICAgICAgICAgICIiSEAKLU0gICAgICAgICAgICAiJEBAICAgICAgICAgICAgIiZAQCAgICAgICAgICAgICInXEAgICAgICAgICAgICAKLU0iKUhAICAgICAgICAgICAgIitIQCAgICAgICAgICAgICIsXEAgICAgICAgICAgICAiLkBAICAgICAgICAKLU0gICAgIjA4QCAgICAgICAgICAgICIxUEAgICAgICAgICAgICAiMzhAICAgICAgICAgICAgIjU0QCAgICAKLU0gICAgICAgICI2VEAgICAgICAgICAgICAiODhAICAgICAgICAgICAgIjkwQCAgICAgICAgICAgICJCXEAKLU0gICAgICAgICAgICAiQ0xAICAgICAgICAgICAgIkxYQCAgICAgICAgICAgICJNREAgICAgICAgICAgICAKLU0iTjBAICAgICAgICAgICAgIlBAQCAgICAgICAgICAgICJRPEAgICAgICAgICAgICAiUzRAICAgICAgICAKLU0gICAgIlQsJCAgICAgICBGQiAgICJUUCQgICAgICAgRkIgICAiVUwmICAgICAgISBPICAgIlZJRCAgICAKLU0gICBGQiAgICJXVUQgICAgICAgRkIgICAiWEYgICAgICAgICAgICAgIlpOICAgICAgICAgICAgICJbViAKLU0gICAgICAgICAgICAiXjIgICAgICAgICAgICAgIl9WICAgICAgICAgICAgICMhTiAgICAgICAgICAgICAKLU0jI0YgICAgICAgICAgICAgIyUuICAgICAgICAgICAgICMnNiAgICAgICAgICAgICAjKUIgICAgICAgICAKLU0gICAgIys2ICAgICAgICAgICAgICMtJiAgICAgICAgICAgICAjLi4gICAgICAgICAgICAgIy86ICAgICAKLU0gICAgICAgICMwWiAgICAgICAgICAgICAjMUogICAgICAgICAgICAgIzZOICAgICAgICAgICAgICM3QiAKLU0gICAgICAgICAgICAjOCogICAgICAgICAgICAgIzhWICAgICAgICAgICAgICM7OiAgICAgICAgICAgICAKLU0jPVIgICAgICAgICAgICAgIz8kRCAgICAgICBGQiAgICNAPEAgICAgICAgICAgICAjQVhEICAgICAgIEcKLU0gICAgI0MwRCAgICAgICBHMyAgICNDXCQgICAgICAgRz4gICAjRDwkICAgICAgIEc+ICAgI0U5RCAgICAKLU0gICBHPiAgICNGRUQgICAgICAgRz4gICAjRzYgICAgICAgICAgICAgI0k+ICAgICAgICAgICAgICNKRiAKLU0gICAgICAgICAgICAjTSIgICAgICAgICAgICAgI05GICAgICAgICAgICAgICNQPiAgICAgICAgICAgICAKLU0jUjYgICAgICAgICAgICAgI1NeICAgICAgICAgICAgICNWJiAgICAgICAgICAgICAjWDIgICAgICAgICAKLU0gICAgI1omICAgICAgICAgICAgICNbViAgICAgICAgICAgICAjXF4gICAgICAgICAgICAgI14qICAgICAKLU0gICAgICAgICNfSiAgICAgICAgICAgICAkIDogICAgICAgICAgICAgJCU+ICAgICAgICAgICAgICQmMiAKLU0gICAgICAgICAgICAkJlogICAgICAgICAgICAgJCdGICAgICAgICAgICAgICQqKiAgICAgICAgICAgICAKLU0kLEIgICAgICAgICAgICAgJC1UQCAgICAgICAgICAgICQvJEAgICAgICAgICAgICAkMFhAICAgICAgICAKLU0gICAgJDIgJCAgICAgICBHPiAgICQyMUQgICAgICAgRz4gICAgICEkIC9fXyAgIEc+ICAgJDJMJSAgPiwKLU0gICBTTiAgICQzKCcgIDtBICAhIFIgICAkM0QpICA3LCAgISMqICAgJDNYJSAgNC4gICBAKCAgICQ0MCUKLU0gIC1eICAgQ04gICAkNEgnICA1UiAgISBIICAgJDUsJSAgI1MgICBDJyAgICQ2OCUgID5PICAgQyIgICAKLU0kNygpICA/LyAgISBSICAgJDdMJSAgKiMgICBCXSAgICQ5KCkgIDtUICAhIFQgICAkOkQpICAvWiAgISAKLU1WICAgJDwgKSAgPS8gICEgWCAgICQ9PCkgIDFJICAhIFogICAkPlgpICAqTiAgISBcICAgJD9YKSAgQTIKLU0gICEgXiAgICRAWCkgIDogICAhISAgICAkQVgpICAhLCAgISEiICAgJEJYKSAgIlkgICEhJCAgICRDWCkKLU0gID8mICAhISggICAkRDwpICA7KCAgISEqICAgJEUgKSAgPjogICEhLCAgICRFRCUgIDIzICAgQzYgICAKLU0kRlQlICA9TyAgIEJJICAgJEgkKSAgKCMgICEhLiAgICRJNCUgICMvICAgQzEgICAkSiglICAuSyAgIEIKLU1EICAgJEpcKSAgOz0gICEhMCAgICRLUCUgIDJGICAgRzMgICAkTDApICBCJCAgISEyICAgJE1QKSAgODQKLU0gICEhNCAgICRPMCkgIDRDICAhITYgICAkUFApICAzOSAgISE4ICAgJFFUKSAgK1YgICEhOiAgICRSWCkKLU0gIDhGICAhITwgICAkU1wpICAxRiAgISE+ICAgJFUgKSAgPEAgICEhQCAgICRVSCkgIDVLICAhIUIgICAKLU0kVjAlICAzJSAgIEMsICAgJFdEJSAgMVcgICBCWCAgICRYWCkgICJFICAhIUQgICAkWiwpICA5PSAgISEKLU1GICAgJFtAJSAgNEcgICBDQSAgICRcOCUgIDYtICAgQlMgICAkXTApICBBJCAgISFIICAgJF4oKSAgJlsKLU0gICEhSiAgICRfICkgID1TICAhIUwgICAkX1gpICA/IiAgISFOICAgJSE8KSAgMyggICEhUCAgICUjICkKLU0gID9QICAhIVIgICAlIzwpICArWCAgISFUICAgJSQoKSAgPSQgICEhViAgICUlMCkgICc6ICAhIVggICAKLU0lJjgpICAyPiAgISFaICAgJSZcKSAgPEsgICEhXCAgICUnSCkgIDxMICAhIiIgICAlKDQlICAuOSAgIEMKLU07ICAgJSlMJSAgOVUgICBCTiAgICUrJCkgIC8uICAhIiggICAlLDwpICAkKSAgISIqICAgJS1UKSAgIU0KLU0gICEiLCAgICUvLCkgIClXICAhIi4gICAlL1wpICA9JSAgISIwICAgJTA8JSAgMj0gICBDRyAgICUxOCkKLU0gIEFBICAhIjIgICAlMjQpICA3WiAgISI0ICAgJTMwKSAgP04gICEiNiAgICU0LCkgICctICAhIjggICAKLU0lNSgpICAqOSAgISI6ICAgJTYkKSAgPiUgICEiPCAgICU2RCkgID5MICAhIyAgICAlOCwpICA+WSAgISMKLU0iICAgJThMKSAgPSYgICEjJCAgICU5LCcgICo4ICAhIFAgICAlOjQpICA9USAgISMmICAgJTswKSAgKzMKLU0gICEjKCAgICU8LCUgIDlZICAgRyAgICAlPTglICA6KSAgIEZCICAgJT5EJyAgNkAgICEgTiAgICU/ST8KLU03VDE5M0QlLTI0LCA4VylULCJZTyAmPUQ4RlVFK0ZcIDlWLUMsRV1DO1ZVUDo2UUU5IlggK1ZBTzs2NE8KLU05VllVK1Y9RDhCXVc7VylLK1ZZRT1SXUQ5NzlPK1Y9RDhHMUU8VzBPPSMkUCtQIUc5JilNOTJZQyAmRU4KLU09I0lULDNVUiwzTE0sQyRULVMwWCxTOFQuI0xSLDMwVy0jQFMtQzBXLlAhQzomJVIuRzBSLzcoUi5TIFsKLU0sMyhXLlAhTDtWWUcoJkVOPSNJVCxTVVIsM0xNLEMkVC1TMFgsUzhULiNMUiwzMFctI0BTLUMwVy5QIVUKLU07Ry1JOVZZRTkiIUk7RzBaPSMwXTxDJFssI0xNLDNMIDsmXU45UiFVO0ctSTlWWUU5IiFJO0cwWj0jNF0KLU08QyRbLCNMTSwzTCA8VkFPPEcwQDo2WVQuRzBWLzcoUS5SVFMsQzxWLiNMUyxDPFYtU0wgOyZdTjlSIUwKLU07VllHKCZFTj0jSVQtU1VSLDNMUC5SVFEuUCFTOiZdUj0iIVU7Ry1JOVZZRTkiIUk7RzBaPSNAXTxDJFsKLU0sI0xWLTM0Uy0zTCA7Jl1OOVIhTDtWWUcoJzVOPFZFRztGNUQoJkVOPSNJVC4zVVIsM0xQLlJUUS5QIVMKLU06Nj1OOTYwQDhWQUE8Q0lULDMgXTxDJFsrMyRSLiNMUSxDPFsgJzVOPFZFRztGNUQoJi1IODcoWj0jJFEKLU0vNyhRLlMgWyxDNFUuUCFGOyZdQT0jSVQsMyhdPEMkWy0jTFAuUCFEO1c1QjsmNFo9IyRTLzcoUS5TQFsKLU0sI0wgOyZdTjlSIUQ7VzVCOyY0Wj0jJFQvNyhRLlNAWywjTCA9Rl1JOSNJVCwzNF0sMzQgPSVdUz0nKVUKLU04VzBaNSMkVi83LFItJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVI9JV1NOTZVQjk3KFoKLU0tQlBRLUJQUS1DTVY3VkVOPSVdTTk2VUI5NyhaLDJQUyxCUFMsQ01WN1ZRTztGPT87NjVNOEY1Ui5DLEwKLU0tQzBMLFMoWz1FXUY7Jl1BPSVdTTk2VUI5NyhaLDMoTC4zOEwsUyhbPUVdRDtXNUI7JjU/OzY1TThGNVIKLU0uQyRTKyMkUi4iUFYtI0xbICcxPz02WUk7VlhaNSMkVy83NFg9RV1DOiYlUjdWVUU7NilFPENIUisjIEwKLU0uI01WN1ctSDtXKVQ3VlVFOzYpRTxDSFYrIyBMLDM4Wz1FXUk7RzE/OzY1TThGNVIuQyRMLCJQUyxDTVYKLU03VlFPO0Y9Pzs2NU04RjVSLkMsTCwiUFMsQ01WN1Y5TDtWJVQ3VlVFOzYpRTxDSFEsQlBQKyMsUi5XOT8KLU05Jl1VOEZRRTdWVUU7NilFPENIUSxSUFArIzhULlNMID1FXUM6JiVSN1Y5VTtGLFoxQyggPUVdUzo2PU4KLU05NjE/OFZBQTxFXUY9NllDLkQ4USwgIVY3VzVOPFZFRztGNUQ3Vi1IODcpPzlHNU44U0kmLDMkID1FXVMKLU06Jl1SPSVdRj02WUMuRDhWICc5PzxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsWjFDOCA9RV1VO0ctSTlWWUUKLU05JV1TOiZdUj0lXUY9NllDLkQ4WCAnOT86NllUN1Y5VTtGLFoxQyQgPUVdUzo2PU45NjE/OjZZVDdWOVUKLU07RixaMUMkID1FXVU7Ry1JOVZZRTklXUk7RzE/OUc1TjhTSSYtICFWN1ZRTztGPT85RzVOOFNJJixQIVYKLU03Vy1JOVZZRTklXUw7VllHN1Y5VTtGLFoxQywgPUVdVTtHLUk5VllFOSVdTDtWWUc3VjlVO0YsWjFDNCAKLU09RV1GOyZdQT0lXUY9NllDLkQ4USxAIVY3VjFPPTYpTDk1XUY9NllDLkQ4USxQIUw6NllLLkUwUS4jVVMKLU0sMzRSO0Y1WD0jSFEuM1RKLDNATCwiUFMsQ01MOjZZSzlHNU44U0hSLCNUSixDJF05QyRZKyMsUisjLFIKLU0uVy1UPTY5Ri5DKFIvNiVSLDNMUC5TIFssQyxdODcoUS5TIFssM0xSLSNVQTxDJFssI0xSLlMkVisjOFQKLU0rIyRRLTMoWy5QIVQ9NV1MOjZZSy5FMFItM1VVLDMwVDtGNVg9I0hRLjJQUCsjLFIuVlFJO0ZNRj02WUMKLU0uQyhQKyMgTCxTKFs8VzFVOUY4WixDKEwsIlBRLDM0Ui5TTCA4Vl1MO1cpUy5FMFItQ1VFPjY1TDsmXVcKLU0uQyBMPCc1UjwmUUUuQyRMPCZFTjpTSFIrI0wgOFYlUjxTSTQsQzxdOTYpTT1TSFArJyFPPEctQzomNFoKLU0sMlBbICYpTztWUUU4NlhaPSMoWC82NSYwNFEzMTNIUCslMTI1NDRaLDJQWyAmKVY4NlFTLkUwUi4zVUUKLU05RiVMPFY0WiwiUVQ8RzVFLkMkTC5QIUI7Vl1MOTYlTixDSVQsQ0QgOzZFUztXKUQ5NylFOSNJNCxTIF0KLU05NzFXO1NIUismXU45M0hRKydJRTxGXFosIlFUOicpRTkzSFMrI0wgOzYlSTtDSSYsMCFWN1YtSDg3KFoKLU0xUyggPUVdUzo2PU45NjE/OFZBQTxDSScsMyAgPUVdVTtHLUk5VllFOSVdQzomJVIuRDxRLDAhVjdXLUgKLU07VylULkQ8ViAnOT88VkVHO0Y1RDdXLUg7VylULkQ8ViAnOT89NllTOjY9Tjk2MT88VkFPPEcwWjFTQCAKLU09RV1JO0cwWjFTJCA9RV1TOjY9Tjk2MT86NllULkQ8USAnOT89NllTOjY9Tjk2MT86NllULkQ8VCAnOT8KLU07Jl1OOVNJJyxQIVY3Vy1JOVZZRTklXUw7VllHLkQ8UyAnOT89NllTOjY9Tjk2MT87Jl1OOVNJJy0wIVYKLU03VjlMO1YlVC5EPFEsQCFWN1YxTz02KUw5M0knLDMsID1FXUM6JiVSN1YlUjxGJVkuRDxTLDNVQTxDJFsKLU0sI0xRLlMoID1FXVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4zSScsUyhdODcoUS5TIFssM0xRLCAhVjdXNU4KLU08VkVHO0Y1RDdWLUg4Nyk/ODcpUjg3RFoxUyxTLzYlUiwzTFAuUyRbLDMkID1FXVM6Jl1SPSVdQTxHKUEKLU0+M0knLFMwXTg3KFEuUyBbLDNMViAnOT88VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkuRDxTLSAhVjdXNU4KLU08VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkuRDxTLTNVQTxDJFssI0xRLlNAID1FXUk7RzE/ODcpUjg3RFoKLU0xUyxWLzYlUiwzTFAuUyRbLDAhVjdXLUk5VllFOSVdSTtHMT84NylSODdEWjFTLFYgJzk/PTZZUzo2PU4KLU05NjE/OjZZVDdWJVI8RiVZLkQ8Uy1TVUE8QyRbLCNMUS5TMCA9RV1MO1ZZRzdWJVI8RiVZLkQ8Uy4jVUEKLU08QyRbLCNMUS5TLCA9RV1TOjY9Tjk2MT87Jl1OOVVdQTxHKUE+M0knLFNAID1FXVU7Ry1JOVZZRTklXUwKLU07VllHN1YlUjxGJVkuRDxTLjNVQTxDJFssI0xRLlM0ID1FXUY7Jl1BPSVdQTxHKUE+M0knLSMgXTg3KFEKLU0uUyBbLDNMUSxAIVY3VjFPPTYpTDk1XUE8RylBPjNJJy0jJF04NyhRLlMgWywzTFEsUCFWN1YtSDg3KT8KLU08Jl1JO0cxRTxDSSctIyhdKkMoID1FXVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIuRDxULFNUSiwzICAKLU09RV1VO0ctSTlWWUU5JV1DOiYlUjdXIU86NllUOTcoWjFTMFQvMkhRLDAhVjdXLUg7VylUN1chTzo2WVQKLU05NyhaMVMwVS8ySFYgJzk/PFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoWjFTMFUgJzk/PTZZUzo2PU4KLU05NjE/PFZBTzxHMT88Jl1JO0cxRTxDSSctIzhdKkNAID1FXUk7RzE/PCZdSTtHMUU8Q0knLSM8XSpDJCAKLU09RV1TOjY9Tjk2MT86NllUN1chTzo2WVQ5NyhaMVMwVyAnOT89NllTOjY9Tjk2MT86NllUN1chTzo2WVQKLU05NyhaMVMwWC8ySFQgJzk/OyZdTjlVXVA7VkVOPSY1Ui5EPFQuM1RKLFAhVjdXLUk5VllFOSVdTDtWWUcKLU03VyFPOjZZVDk3KFoxUzBZICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIuRDxVLCNUSi0wIVYKLU03VjlMO1YlVDdXIU86NllUOTcoWjFTNFEvMkhRLEAhVjdWMU89NilMOTVdUDtWRU49JjVSLkQ8VSxDVEoKLU0sMywgPUVdUz0nKVU4VzBRLkQ8US1AIVY3Vy1UPEc1Qz0jKFoxUzRTLzcsUi0nOT84VkFBPEVdTTk2VUIKLU05NyhaLEJQUCsjQFs9RV1TOiZdUj0lXU05NlVCOTcoWi1CUFEtQlBRLUNNVjdWRU49JV1NOTZVQjk3KFoKLU0sMlBTLEJQUyxDTVY3VlFPO0Y9Pzs2NU04RjVSLkMsTC1DMEwsUyhbPUVdRjsmXUE9JV1NOTZVQjk3KFoKLU0sMyhMLjM4TCxTKFs9RV1EO1c1QjsmNT87NjVNOEY1Ui5DJFMrIyRSLiJQVi0jTFsgJzk/PTZZSTtWWFoKLU0xUyRXICc5Pz02WUk7VlhSLkQ8VS0jVVUuJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVIKLU09JV1NOTZVQjk3KFotQlBQKyMkVi5XOT86NllUN1ZVRTs2KUU8Q0hRKyMgTCxTKFs9RV1MO1ZZRzdWVUUKLU07NilFPENIUysjIEwsUyhbPUVdRjsmXUE9JV1NOTZVQjk3KFosMyhMLCJQUyxDTVY3VjFPPTYpTDk1XU0KLU05NlVCOTcoWiwzLEwsIlBWLSNMWyAnLT87JkVOOlNJJywzRCA9NV1MOjZZSy5EPFItMCFQPEZFTTg3KVkKLU0uRDxVLTNVRTxGNUQuQyBMOVcpRTk2WFosMlFCOyc1RS5DKEwuUCFOO1ZZUDxGRU04NylZLkQ8Ui1AIUMKLU07JzVOOlY1Ui5EPFUtQ1VFOFZBRT1HRFosIlFGO1cpRC5DJEwuUCFTPCZdUj0nLUM4NyhaMVMoVyAlXT8KLU07NiVJO0JZTyAmPUM4Uyk/OFZdTTwmRUw5NjBOICVdSTtGRVQ6NiVMOjdJRTkiWFAgIl1HO0c0TzlWLUMKLU0rVj1DOFMoTzxXKUMrUCBOK1ZRSThGPUM4UyhOOFAhSTtHMFo9IyRdPEMkWyszKFEtIzxULiMsVi0jQFsKLU0sQyRULVMwWCxTOFQtU0wgOFZBQTxDSVQsQ1VSLENMUC5TJFItU0wgOyZdTjlSIUk7RzBaPSMsXTxDJFsKLU0rMyhRLSM8VC4jLFYtI0BbLEMkVC1TMFgsUzhULVNMID02WVM6Nj1OOTYwQDo2WVQuRzBULzcoUS5TIFsKLU0rMyRbICZRTztGPEA9NllTOjY9Tjk2MEA6NllULkcwVS83KFEuUyBbKzMkWyAnLUg7VylUKCZFTj0jSVQKLU0tQ1VSLDNMTSxTKFctQ0BbLFMoVy1DPFsgJlFPO0Y8QDsmXU45UiFJO0cwWj0jPF08QyRbLCNMTSwzTCAKLU08VkFPPEcwQD02WVM6Nj1OOTYwQDo2WVQuRzBYLzcoUS5TIFstQzRVLFM0WyAmUU87RjxAOyZdTjlSIVUKLU07Ry1JOVZZRTkiIUk7RzBaPSNEXTxDJFssI0xNLDNMIDxWRUc7RjVEKCYtSDg3KFo9IyRQLzcoUS5SVFEKLU0sQ0BbLDMoVy5QIVU7Ry1JOVZZRTkiIUM6JiVSLkcwUSwzVVIsM0xQLlMoVS0zTCA5RlFPODcwWj0jJFIKLU0vNyhRLlMwWywjTCA5Jl1VOEZRRS5HMFEsU1VSLDNMWC5TIFsgJlFPO0Y8QDkmXVU4RlFFLkcwUS0jVVIKLU0sM0xYLlMgWyAnOU86NjBaPSMkVS8zJFUgJylFOVVdQzsmJVM8U0k0LDM4XTk0WS83VSklMVUsWiwiUScKLU0xNFklNEQlLDdVKSUxVSxaLDJRJjQlXTIxND0zLkMoTDA0USw3VSklMVUsWixSUSwyNFU/NEQ1JzdULSwKLU0wNS0zMTUsWi0iUFsgJyFUPEYxSTlGOT89I0lULDAhUzo3SUU3VzBaPSMkID1WLUg4Nyk/PSNJVC4gIUwKLU07VllHOyZdTjlTSTQsMzxdPFNBSDo2PUguQyxMLCJQUyxDTUw7VzxaLFJQUyxCUFMsQ0xbICZRTztGPT8KLU07Jl1OOVNJVCwzQF09M0FTLkMkVysjIEwtQzBbOyZQWi1SUFArIzhULlNMIDlHNU44VV1QPScoWj0jJFkKLU0vMkhSLCNVRiwzNCA3VV1EO1VdRzsmXUI4NlE/OScxTzxHLFoxQyRVICVdRT4mRVQ3VjFVOzZVWTdXKUUKLU05Q0knLEMkXSpDJCA3VV1EO1VdRzsmXUI4NlE/OFcxTzxHLFoxQyRVICVdPzs2JUk7Q0kmLDM0IDdWNVgKLU06NzBOO1AhRzhWLFI3Vi1POzchSTsmNUQrQCBPOVZZVStWPUM4Ul1HOFYsUitXLVI4UlwgK0JdTDo2KUcKLU04VixSK0YsIDo2WVQuRzBRLzcoUS5SVFIsMzBXLSNAUy1DMFguUyhRLSM8VC4jLFYtIzxbICYtSDg3KFoKLU09IyhdPEMoWywjTFEsQzxbICZRTztGPEA6NllULkcwUy83KFEuUlRSLDMwVy0jQFMtQzBYLlMoUS0jPFQKLU0uIyxWLSM8WyAnNU48VkVHO0Y1RCgmRU49I0lULSNVUiwzTFAuUlRRLlAhTDtWWUcoJzVOPFZFRztGNUQKLU0oJkVOPSNJVC0zVVIsM0xQLlJUUS5QIVM6Jl1SPSIhSTtHMFo9IzhdPEMkWyszLFItUzhYLlMsUi1TOFcKLU0uUCFMO1ZZRygmUU87RjxAOjZZVC5HMFcvNyhRLlMgWyszJFsgJy1IO1cpVCgnNU48VkVHO0Y1RCgmRU4KLU09I0lULiNVUiwzTFAuUzhVLTMsVS5QIUw7VllHKCZRTztGPEA9NllTOjY9Tjk2MEA6NllULkcwWS83KFEKLU0uUyBbKzMkWyAnLUk5VllFOSIhQzomJVIuRzBRLCNVUiwzTE0sMyhYLlMkUi1TTCA9NllTOjY9Tjk2MEAKLU04VkFBPENJVCwzJF08QyRbLCNMUi0zNFsgJjlMO1YlVC5HMFEsQ1VSLDNMVC5TIFsgJjFPPTYpTDkzSVQKLU0sMyxdPEMkWy4jTFAuUCFMO1ZZRygmMU89NilMOTNJVCwzMF08QyRbLiNMUC5QIVY7VkVELkcwUS0zVFEKLU0tMCFSOTY9PzhWUUE8VyxaNSMkVi82NS4zVV0yMTQ9My5DIEwxVDUuMTUpITMlXTIxND0zLkMkTDFFIT8KLU00RDUnNFNIUiskJSwzJV0yMTQ9My5DLEwzJEUtN1UpJTFVXSMzJCUzNFQ1My5DMEwuUCFQPScpRDo2OUYKLU03VzBaPSMkIDxWRVo5NV1ULkcwUSAnPUM6JiVSN1cwWj0jQCA7Jl1OOVZRTztGPFo1IyRXLzcsWDomRUcKLU06I0hTKyMgTCxTKFs7Jl1XLkMsTCxTKEwsUyhbLlAhTDtWWUc3VlFPO0Y8Wj0jJFgvNzRYPFNIUS1SUFAKLU0rIzhULlZRTC5DPEwsIlBWLSNMWyAmOVU7Ri0/PCcxUi5HMFEuM1RKLEMgXTlDJFUgJV1FPiZFVDdWMVUKLU07NlVZN1YxRThWUFoxUyQgN1VdIzUkXTI3VFEpNFUxPzdTSScsQyRdODcoUS5TIFssM0xRLjAhPzdUMTQKLU0zVSk/MyRFMzUlXT8uRDxSLDAgTTsmPCA7JkVCOVJZUyAlXUU9JjVYPSAhPzk2MUE9JiQgN1Y1TjkgIVMKLU09JiVSPSAhPzs2JUk7QCE/OTZZVjo3KU87QCE/PUVdUzo2PU45NjE/OjZZVDdWOVU7RiwgN1c5Pzo2WVQKLU03VjlVO0YsIDdXIVI6NlVBPEdEIDdXOT89NllTOjY9Tjk2MT88VkFPPEcxPzlHNU44UCE/PUVdUzo2PU4KLU05NjE/OyZdTjlVXVA7VkVOPSY1UiAlXVY3Vy1JOVZZRTklXUM6JiVSN1chTzo2WVQ5NyggN1c5Pz02WVMKLU06Nj1OOTYxPzsmXU45VV1BPEcpQT4wIT89RV1VO0ctSTlWWUU5JV1DOiYlUjdWJVI8RiVZICVdVjdWUU8KLU07Rj0/PCZdSTtHMUU8QCE/PUVdQzomJVI3VyFPOjZZVDk3KCA3Vzk/PTZZUzo2PU45NjE/OjZZVCAlXVYKLU03Vy1JOVZZRTklXVM6Jl1SPSAhPz1FXUQ7VzVCOyY1Pzg3KVI4N0QgN1c5Pz02WUk7VlggN1c5PzlGUU8KLU04NzAgN1c5PzxWQU88RzAgN1c5PzxWRUc7RjVEN1ZRTztGPT85RzVOOFAhPz1FXVM6Nj1OOTYxPzhWQUEKLU08RV1GPTZZQyAlXVY3Vy1JOVZZRTklXUk7RzE/ODcpUjg3RCA3Vzk/OyZdTjlVXUY9NllDICVdVjdWLUgKLU04Nyk/OUc1TjhQIT89RV1JO0cxPzg3KVI4N0QgN1VdPzs2JUk7QCE/PUVdVTtHLUk5VllFOSVdSTtHMT8KLU08Jl1JO0cxRTxAIT89RV1TOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPEAhPz1FXVU7Ry1JOVZZRTklXVMKLU06Jl1SPSVdQTxHKUE+MCE/PUVdVTtHLUk5VllFOSVdTDtWWUcgJV1WN1Y5TDtWJVQ3VyFPOjZZVDk3KCAKLU03Vzk/PFZBTzxHMT88Jl1JO0cxRTxAIT89RV1VO0ctSTlWWUU5JV1DOiYlUiAlXVY3VzVOOjZdTixAIT8KLU09RV1EO1c1QjsmNCA3Vzk/PTZZUzo2PU45NjE/OjZZVDdWOVU7RiwgN1c5PzxWRUc7RjVEN1ctSDtXKVQKLU03VjlVO0YsIDdXOT88VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA3Vzk/PFZFRztGNUQ3Vi1IODcpPzg3KVIKLU04N0QgN1c5PzlGUU84NzE/OUc1TjhQIT89RV1TOiZdUj0lXUY9NllDICVdVjdXLUk5VllFOSVdSTtHMCAKLU03Vzk/OyZdTjlVXUE8RylBPjAhPz1FXUM6JiVSN1YlUjxGJVkgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT8KLU08Jl1JO0cxRTxAIT89RV1VO0ctSTlWWUU5JV1DOiYlUjdXIU86NllUOTcoIDdXOT86NllUICVdUzwmXVIKLU09Jy1DODcoIDdXOT85Jl1VOEZRRTdXIU86NllUOTcoIDdXOT89NllTOjY9Tjk2MT88VkFPPEcwIDdWLUwKLU09NllLOTcoIDdXOT88VzFSPTYtVCwwIT89RV1TPScpVThXMFIgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT8KLU05RzVOOFAhPz1FXVU7Ry1JOVZZRTklXUM6JiVSN1Y5VTtGLCA3Vzk/PFZFRztGNUQ3VkVOPSVdUDtWRU4KLU09JjVSICVdVjdXNU48VkVHO0Y1RDdWRU49JV1BPEcpQT4wIT89RV1TOjY9Tjk2MT88VkFPPEcxPzg3KVIKLU04N0QgN1ZZTztHIVI6NlVBPEdEIDdXLT87JkVOOlAhPz1FXUQ7VzVCOyY1PzlHNU44UCE/PUVdUzo2PU4KLU05NjE/OyZdTjlQIT89RV1JO0cxPzwmXUk7RzFFPEAhPz1FXVM6Nj1OOTYxPzhWQUE8QCE/PUVdRjsmXUEKLU09JV1BPEcpQT4wIT89RV1TOiZdUj0lXUE8RylBPjAhPz01XUw6NllLICVdVjdXNU48VkVHO0Y1RDdXLUgKLU07VylUN1chTzo2WVQ5NyggN1c5PzsmXU45UCE/PUVdQzomJVIgJV0/OTdBST0lXUQ9NlVNPjVdRDk2LUwKLU0gJV0/N1QtNDNVKT8zJEUzNSVdPyAlXT83VDE0M1UpPzMkRTM1JV0/ICVdPzdWMU83Vj1MO1YpQTslXUMKLU09Jl1SPFAhPzdVXUQ7VV1HOyZdQjg2UT85JzFPPEcsIDdVXUU+JkVUN1YxVTs2VVk3VylFOUAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSggICAgICAgICAgICAKLSAKLWVuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zcGFyYy1lbGYudSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3BhcmMtZWxmLnUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjBjMGYuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zcGFyYy1lbGYudQorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi1iZWdpbiA3Nzcgc3BhcmMtZWxmCi1NP1Q1LDFAJCIgMCAgICAgICAgICAgICAiICAoICAgICEgICQvJSAgICAjMCAgIzswICAgICAgIFQgIiAgCi1NITAgSCAhPCAkUCAgICA4ICAgIFQgICQgLSAgICAgICAgICJAICAgIEggICAgIDQgICAgICAgICAgUCAgCi1NIC0wICAgICAgICAgICAgICAhJCAgICAgICAgICEgICAgICAgICAgISAgICAtICAhICMwICAgICAgICAzCi1NPSAgICRXMCAgICAlICAkICAgICAgICQgICEuSCAgKDNKICAgICAgICAgI0wgICAiTSAgICAgPCAgMCAgCi1NICAgICBAICAlIFAgIEEwLCAgICAgICAgIChAICAgICAgICAgIVAgICAgIE89Ny1SK1ZRSThCXUw5IllTCi1NO1JYUSAgICAgICAgICUsICAgIUggICAgMlAgICAgICAgICAgICAgIC5AICAgJiggICAgVyAgICA1ICAgCi1NICAgICAgICAgICAgNFAgICAlXCAgICFEICAgIDQgICAgJCAgICAhKiAgICA1UCAgICM4ICAgICAgICAgCi1NMjAgICAjLCAgICBNICAgIC9QICAgJVggICAgICAgICAgICAgICI0ICAgIDwgICAgMFAgICAgICAgICExCi1NICAgICogICAgICAgICAhIiAgICAgICAgICIwICAgITsgICAgLCAgICAjJCAgICBSICAgIDFQICAgJDQgCi1NICAhLiAgICA4ICAgICAgICAgIEMgICAgK0AgICAlQCAgICAgICAgIC8wICAgICAgICAgICAgICAoICAgCi1NICQwICAgITwgICAgMiAgICAgICAgICAgICAgICsgICAgICAgICAhLyAgICAgICAgICAgICAgITYgICAgCi1NICAgICAmPCAgICE6ICAgIDYwICAgJjggICAgICAgICAuUCAgICAgICAgICAgICAgICAgICAlVCAgICAgCi1NICAgICtQICAgICAgICAhRSAgICAgICAgICAgICAgIUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkAgICAiRCAgICAgICAgICAgICAgICAgCi1NICAgOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQICAgICAgICAgICAgICAgICAgCi1NICI4ICAgIDsgICAgICAgICAhVCAgICAgICAgICAgICAgIUggICAgXiAgICAwMCAgICJMICAgIFUgICAgCi1NICAgICAgICAgICA3ICAgICAgICAgICAgICAgICAgICAgICAgICIoICAgICAgICAgICAgICAkUCAgICAgCi1NICAgICAgICAgJDggICAgWCAgICA0QCAgICMwICAgIS0gICAgICAgICAjUCAgICAgICAgICAgICAgICAgCi1NICAgRyAgICAgICAgICU0ICAgICAgICAgICAgICAhQCAgICA+ICAgICAgICAgICAgICAgWSAgICA4UCAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAkIFUgICAgICAjICAgISAgICAgICAhIC5AICAgICAgUCAgCi1NIEAgICAgICAgMC88ICAgICAgLCAgICwgICAgICAgJCo3ICAgICAgIyAgICQgICAgICAgISNNQCAgICAgCi1NIFAgICEwICAgICAgIDBbRCAgICAgICwgICA4ICAgICAgICQvIiAgICAgICMgICAnICAgICAgICEjUTAgCi1NICAgICBQICAiICAgICAgICAxLVAgICAgICAsICAgRCAgICAgICAkM0AgICAgICAjICAgKiAgICAgICAiCi1NJFpAICAgICAgUCAgIlAgICAgICAgQTAgICAgICAgLCAgIFAgICAgICAgKDQjICAgICAgIyAgIC0gICAgCi1NICAgIiUpQCAgICAgIFAgICNAICAgICAgICAgICAgICAgICwgICBcICAgICAgICAgICAgICAgICMgICAwCi1NICAgICAgICAgICAgICAgICBQICAkMCAgICAgICAgICAgICAgICAsICAhKCAgICAgICAgICAgICAgICAjCi1NICAgMyAgICAgICAgICAgICAgICAgUCAgJSAgICAgICAgICAgICAgICAgLCAgITQgICAgICAgICAgICAgCi1NICAgIyAgIDYgICAgIDAgIiUpQCAgICAoJDAgICNAICAgIEQgIDEtUCAgICAgISggICBEICAgIC8gICg0Ci1NSCAgICAgMDEgICAuICAgICVAICIlKkAgICAiMCQwICAjQCAgICFUICBBNFggICAgISEkICAgWCAgICBUCi1NICAoNS8gICAgIDAxICAgLiAgICAuQCAiJTQgICAgICEkMCAgI0AgICAkQCAgQTUkICAgICEhJCAgIFggCi1NICAhNiAgKDUyICAgICBAMSAgIC4gICAgN1AgIiU1ICAgICAoJDAgICNAICAgJzQgIEE1OCAgICAiISQgCi1NICBYICAgIiogICg1OCAgICAgMDEgICAuICAgIEdQICIlNjAgICAgJCQwICAjQCAgICo8ICBBNUggICAgCi1NISEkICAgWCAgICJUICAkMDkgICAgITAyICAgKCAgICBSMCAhI1hAICAgIDQkQCAgIiAgICAtNCAgQTVQCi1NICAgICIhJCAgIFggICAjPiAgKDU+ICAgICAwMSAgIC4gICAgWiAgIiU3UCAgICAiJDAgICNAICAgL1ggCi1NIEE1XiAgICAgQSQgICBYICAgJC8gICg1QCAgICAgQDEgICAuICAgIShQICEjUEAgICAgICRAICAhUCAgCi1NIDJEICBBNiggICAgIEEkICAgWCAgICRYICAkL1EgICAgITAyICAgKCAgICExMCAiJThQICAgICQkMCAgCi1NI0AgICA0VCAgQTYwICAgICBBJCAgIFggICAlOiAgKDVGICAgICFAMSAgIC4gICAhOSAgIiU7ICAgICA4Ci1NJDAgICNAICAgNlggIEE3KCAgICAhISQgICBYICAgJVUgICg1UyAgICAgMDEgICAuICAgIUEgICIlPSAgCi1NICAgJCQwICAjQCAgIDlQICAxITAgICAgJSEoICAgQCAgICZPICAoNVUgICAgIDAxICAgLiAgICFRQCAiCi1NJT1AICAgICIkMCAgI0AgICA8WCAgMF9MICAgICUhKCAgIEAgICAnRCAgKDQjICAgICAgMSAvX1EgICAhCi1NWzAgISQqQCAgICsoJEAgICIgICAgPyggIDEuICAgICAhISQgICBIICAgJ18gICQwRCAgICAhQDIgICAoCi1NICAgIiMwICIlPUggICAgIiQwICAjQCAgIEIkICAxIDQgICAgJSEoICAgQCAgIChTICAoNVcgICAgIDAxCi1NICAgLiAgICIwUCAiJT4gICAgICQkMCAgI0AgICBFKCAgQTdIICAgICQhJCAgIFggICApQSAgJC8lICAgCi1NICcwMiAgICggICAiOiAgIiUpMCAgICAgJDAjX1wwICAgRlwgIDEgSCAgICAlISggICBAICAgKiMgICg1Ci1NXiAgICAgQDEgICAuICAgIkNQICIlQCAgICAgJCQwICAjQCAgIEk8ICAxIVggICAgJiEoICAgQCAgICpECi1NICAkMC8gICAgITAyICAgKCAgICJMICAiJUAwICAgICgkMCAgI0AgICBMLCAgQTkwICAgICEiJCAgIFggCi1NICArKyAgKDYjICAgICAwMSAgIC4gICAiVyAgIiVBICAgICAkJDAgICNAICAgTyggIDBfOCAgICAlISggCi1NICBAICAgLCYgICg2JSAgICAgMDEgICAuICAgIyUwICIlQUAgICAgJCQwICAjQCAgIFJUICAwXlAgICAgCi1NJSEoICAgQCAgIC0iICAoNjcgICAgICAxIC9fUSAgICMxUCAiJUFQICAgICQkMCAgI0AgICBVWCAgQThACi1NICAgICEhJCAgIFggICAtTCAgKDYpICAgICAkMSAgIC4gICAjPyAgIiVCQCAgICAkJDAgICNAICAgWFAgCi1NIEE4TCAgICAhISQgICBYICAgLjwgICQzSiAgICAgIDEgL19RICAgI0hQICIlQyAgICAgKCQwICAjQCAgCi1NIFskICBBOFggICAgISEkICAgWCAgIC8mICAoNCAgICAgICAxIC9fUSAgICNXICAhJCAgICAgIDQkQCAgCi1NIiAgICBePCAgMF48ICAgICUhKCAgIEAgICAvWiAgKDYvICAgICAwMSAgIC4gICAkIiAgIiVEICAgICAhCi1NJDAgICNAICAhIFwgIEE5JCAgICAhISQgICBYICAgMDogICg2MiAgICAgQDEgICAuICAgJClQICIkXjAgCi1NICAgMCRAICAgICAgISJQICBBLzggICAgNiEoICAgICAgIDBTICAoM1wgICAgIEAyICAgICAgICQuMCAiCi1NJUUgICAgICQkMCAgI0AgICEkKCAgQTk0ICAgICEhJCAgIFggICAxOyAgKDY2ICAgICAwMSAgIC4gJzk/Ci1NPTZZSTtWWCA3VjlJO0ZEIDxVXUw6NllLICc1PzsmRU46UCFWN1ctSTlWWUU5JV1TOiZdUj0lXVA7VkVOCi1NPSY1UiAnOT86NllUICc5PzxWRUc7RjVEN1YtSDg3KCA9RV1JO0cxPzwmXUk7RzFFPEAhVjdWMU89NilMCi1NOTAhVjdXNU48VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA9RV1VO0ctSTlWWUU5JV1JO0cxPzg3KVI4N0QgCi1NPUVdUzo2PU45NjE/OjZZVDdXIU86NllUOTcoIDhWUVU7Rk1FPEAhVjdXLUk5VllFOSVdSTtHMCA9RV1VCi1NO0ctSTlWWUU5JV1MO1ZZRzdWOVU7RiwgPUVdQzomJVI3VjlVO0YsID1FXVU7RkVPO0MoIDxXIU88RzFTCi1NOFYlUiAnOT89NllTOjY9Tjk2MT84VkFBPEVdQTxHKUE+MCFWN1c1TjxWRUc7RjVEN1ctSDtXKVQgJzk/Ci1NPFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgN1ZFTjo3MCA9RV1TOjY9Tjk2MT88VkFPPEcwID1FXVM6Jl1SCi1NPSVdRj02WUMgJzk/OUZRTzg3MCA9RV1DOiYlUjdWJVI8RiVZICc5PzxXMVI9Ni1ULDAhVjdXLVQ8RzVDCi1NPSMoID1FXUw7VllHICc5PzsmXU45VV1QO1ZFTj0mNVIgJzk/PTZZUzo2PU45NjE/OyZdTjlVXVA7VkVOCi1NPSY1UiAnOT88VkVHO0Y1RDdWUU87Rj0/OUc1TjhQIVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSCi1NICc5PzxWQU88RzAgPUVdVTtHLUk5VllFOSVdUzomXVI9JV1GPTZZQyAlXSQ2NFkhMzRFIyAmVUE6NlggCi1NN1ZRSThFXVY5NylTOjZdTiAnOT85Jl1VOEZRRTdWOVU7RiwgPUVdUzo2PU45NjE/OFZBQTxFXUE8RylBCi1NPjAhVjdXLUk5VllFOSVdSTtHMT85RzVOOFAhVjdXNU48VkVHO0Y1RDdWUU87RjwgPUVdVTtHLUk5VllFCi1NOSVdSTtHMCA9RV1EO1c1QjsmNT84NylSODdEIDdXLVQ4NylUICVdRTkmJVQ4MCFWN1c1TjxWRUc7RjVECi1NN1ZFTj0lXUY9NllDICc5Pzo2WVQ3ViVSPEYlWSAnIVI6NlVBPEdEID1FXUY7Jl1BPSVdRj02WUMgJzk/Ci1NOyZdTjlVXUY9NllDICc5PzxWRUc7RjVEN1ZFTj0lXUE8RylBPjAhRTtHOUk8Rl1OICc5PzkmXVU4RlFFCi1NN1chTzo2WVQ5NyggPUVdUzo2PU45NjE/OFZBQTxFXVA7VkVOPSY1UiAnOT88VkVHO0Y1RDdXLUg7VylUCi1NN1Y5VTtGLCA9RV1DOiYlUjdXIU86NllUOTcoID1FXVU7Ry1JOVZZRTklXUM6JiVSN1chTzo2WVQ5NyggCi1NPUVdVTtHLUk5VllFOSVdQzomJVI3VjlVO0YsIDdWNU45ICFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3ViVSCi1NPEYlWSAnOT88VkVHO0Y1RDdWUU87RjwgPUVdVTtHLUk5VllFOSVdQzomJVIgJzk/PFZBTzxHMT88Jl1JCi1NO0cxRTxAIVY3VjlMO1YlVDdXIU86NllUOTcoIDdWNVQ5N0FUICc5PzlGUU84NzE/ODcpUjg3RCA9RV1TCi1NOjY9Tjk2MT88VkFPPEcxPzg3KVI4N0QgN1Q9LDNUKSEzJV0vMUQ5MzE1MT81JCUiMyQ1PyAnOT86NllUCi1NN1Y5VTtGLCA9RV1TOjY9Tjk2MT84VkFBPEVdRj02WUMgJzk/PFZBTzxHMT84NylSODdEID1FXUM6JiVSCi1NICZZTztHIVI6NlVBPEdEID1FXUw7VllHN1YlUjxGJVkgJjVYOjcwIDg3MUU+JkVUICVdRT4mRVQgJV1FCi1NO0c5STxGXU4gJzk/PTZZUzo2PU45NjE/PFZBTzxHMT88Jl1JO0cxRTxAIVY3Vy1JOVZZRTklXUw7VllHCi1NN1chTzo2WVQ5NyggOyZFQjhSWVM7UlhRICAgICBBOTAgICFFJFAgICAgICAgQS84ICAhQyUwICAgICAgCi1NIEEvRCAgIUIlMCAgICAgICBBL1AgICFEJTAgICAgIj1YW15AQDw/QCIoJ0ggICJcJCIgIFggLkAwKigjCi1NSCQyPChaIEBAKSAgIDAqICAgMjAkICAhMCAhISpAJCAgICAxICAhJEQhKEM8JCAgMDI4ISAgICA/X19fCi1NXCAkICAgIjAkICAwREEgICQ5NEwoICo0IEogJEUgMSAiQTwgICg2NiROKTBVIisgICQgICAkWCEgICAgCi1NMCAhISZQJCAgICEgICQkPCAwICAgKVdDT1kiUCQiICAsKCAgIDgnJ1ggQiFaICAgRz4uX0QrIDAoICBQCi1NQCAgIUA8P0AiKCdIICAiPVhbXjBMISBAICMiICAgJiFRXiAoQD5AICApV0NPWSJQJCIgICwoICAgOCcnCi1NWCBCIVogICBHPi5fRCsgMCggIFBAICAhQDw/QCIoJ0ggICI9WFteMEwhIEAgIyIgICAmIVFeIChAPkAgCi1NIClXQ09ZIlAkIiAgLCggICA4JydYIEIhWiAgIEc+Ll9EKyAwKCAgUEAgICFAPD9AIignSCAgIj1YW14wCi1NTCEgQCAjIiAgICYhUV4gKEA+QCAgKVdDT1kiUCQiICAsKCAgIDgnJ1ggQiFaICAgRz4uX0QrIDAoICBQCi1NQCAgIUA8P0AiKCdIICAiPVhbXjBMISBAICMiICAgJiFRXiAoQD5AICApV0NPWSAxICAhJFAwKENCIyIgCi1NICAmIVFeIChAPkAgIClXQ09ZIDEgICEkUDFIQ0QjIiAgICYhUV4gKEA+QCAgKVdDT1kgMSAgIiVQIkhCCi1NMCEkICAoNjIkIiAhVEJIQTAhJCAgKDYyJCIgIlRCSEIpISQgICg2MiQiICNUQyhBViEkICAoNjIkIiAkCi1NVEMoQUIhJCAgKDYyJCIgJVRDKEE/QSQgICg2MiQiICZUQihBLyEkICAoNjIkIiAnVEIoQTohJCAgKDYyCi1NJCIgKFRCKEFYISQgICg2MiQiIClUQihBUiEkICAoNjIkIiAqVEIoQighJCAgKDYyJCIgK1RCKEFXISQgCi1NICg0MyAgISRVIClDRi0wQig4UDEgICIlJFAgIDEtMDo4WiM0LkIlKCQwICBBMSwgICg3NCJGKSBVIkhBCi1NRCEkICAoNDMgICIlVSBJQTAtMEooPUgxICAiJSRQICBBPTAqOEIzNCpCJVwkMCAgQTEsICAoNzQkRic4Ci1NVSMoQi8hJCAgKDQzICAiJVUhKUFCLTBSKENAMSAgIiUkUCAgQT0wMjg3WzQsQig8JDAgIEExLCAgKDc0Ci1NIEYkXFUiKEFeISQgICg0MyAgIiVVIClBOi0wQihAMDEgICIlJFAgIEE9MCI4PiM0KEIlOCQwICBBMSwgCi1NICg3NCBGJyhVIihCMiEkICAoNDMgICIlVSApQigtMEIoOCAxICAiJSRQICBBPTAiOD1TNChCJTAkMCAgCi1NQTEsICAoNzQgRiYsVSIoQiwhJCAgKDQzICAiJVUhSUEyLTBaKD5AMSAgIiUlMCAgQTkoMkhEIzIoQig0Ci1NJDAgIEExNCAgKDYyJEolIFRCKEIkISQgICg0NSAgIiVEQSpCKS0oQihBQDEgICIlJTAgIEE5KDJIPUMyCi1NKEIoSCQwICBBMTQgICg2MiRKJihUQihBLiEkICAoNDUgICIlREEqQT9NKEIoRTAxICAiJSUwICBBOSgyCi1NSDNTMihCJSQkMCAgQTE0ICAoNjIkSiVIVEIoQTghJCAgKDQ1ICAiJURBKkFYLShCKD0wMSAgIiUlMCAgCi1NQTkoMkg8QzIoQicsJDAgIEExNCAgKDYyJEooQFRCKEI2ISQgICg0NSAgIiVEQSpBVy0oQig9IDEgICIlCi1NJTAgIEE5KDJIOFMyKEIoTCQwICBBMTQgICg2MiRKJShUQihCIyEkICAoNjIkIiAiVEIoQiAhJCAgKDYyCi1NJCIgIlRCKEIxISQgICg2MiQiICFUQihBPiEkICAoNjIkIiAhVEIoQTkhJCAgKDQzICAiJVUgKUBILTBCCi1NKCpAMSAgIiUkUCAgQT0wMjgpQzQsQiVQQDw/QCIoJ0ggICI9WFteQEA8P0AiKCdIICAgICAgICAgICAgCi1NIDAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMQCAgICAgICAhIDowICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgIyBQCi1NT19fUyAwICAgICwgICNQUE9fX1AgMCAgICAsICAkQFBPX19NIDAgICAgJCAgICAgIEEwLCAgICAgICAgCi1NICAgICAgICEgICAkPDAgICAgUCAgMFwoICAgICMwICEkVyAgICAgJCAgJCBaICAgICA0ICAwSTwgICAgCi1NIUAgISBdUCAgICAqICAgJD5QICAgIEwgICAgMCAgICAlMCAgICAgICAgICMgICgzSiAgICAgKCAgICBECi1NICAgICUgICAgIDwgICAgNyAgJC5ZICAgICA8ICAwWzggICAgIiAgICAjICAgICApICAgICMgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhICAgICAgICAgICAkIC9fUSAgICAgICAhCi1NIC0wICAgICAgUCAgIDAgICAgICAgMCNIICAgICAgLCAgICggICAgICAgJCNXICAgICAgIyAgICMgICAgCi1NICAgISJFUCAgICAgIFAgICEgICAgICAgIDBbOCAgICAgICwgICA0ICAgICAgICQuWSAgICAgICMgICAmCi1NICAgICAgICEjUEAgICAgICBQICAhUCAgICAgICAwXDQgICAgICAsICAgQCAgICAgICAkMzwgICAgICAjCi1NICAgKSAgICAgICAhJFggICAgICAgUCAgIkAgICAgICAgQS5IICAgICAgLCAgIEwgICAgICAgKDQgICAgCi1NICAgIyAgICwgICAgICAgIiUgUCAgICAgIFAgICMwICAgICAgIEEyOCAgICAgICwgICBYICAgICAgICAgCi1NICAgICAgICMgICAvICAgICAgICAgICAgICAgICBQICAkICAgICAgICAgICAgICAgICAsICAhJCAgICAgCi1NICAgICAgICAgICAjICAgMiAgICAgICAgICAgICAgICAgUCAgJFAgICAgICAgICAgICAgICAgLCAgITAgCi1NICAgICAgICAgICAgICAgIyAgIDUgICAgICAgICAgICAgICAgIFAgICVAICAgIDwgICAgICAgICAgIDAgCi1NX18kICAgIC4gICAgICAgICAgICQgL19RICAgICZAICAgICAgICAgICEgI19cMCAgICIoICAgICAgICAgCi1NICAwIF9fJCAgICBJICAoNEYgICAgIEAxICAgLiAgICAsMCAhJFcgICAgICAkQCAgIjAgICAjPCAgQTJACi1NICAgICEhJCAgIFggICAgXiAgKDRKICAgICkgMSAgIC4gICAgMTAgIiUzQCAgICAkJDAgICNAICAgJVAgCi1NIEE0XCAgICAhISQgICBYICAgIUIgICg1MCAgICAgJDEgICAuICAgIDwgICIlNDAgICAgJCQwICAjQCAgCi1NICdYICBBNSggICAgIiEkICAgWCAgICInICAoNTQgICAgIEAxICAgLiAgICBHMCAiJTVAICAgICgkMCAgCi1NI0AgICArKCAgQTVAICAgICEhJCAgIFggICAjJyAgKDU5ICAgICAwMSAgIC4gICAgU1AgIiU2QCAgICAkCi1NJDAgICNAICAgLVAgIDEhRCAgICAlISggICBAICAgI1EgICQvQiAgICAhMDIgICAoICAgIF8wICIlNyAgCi1NICAgKCQwICAjQCAgIDA4ICBBNVggICAgISEkICAgWCAgICQwICAoNT8gICAgICgxICAgLiAgICEpQCAiCi1NJTdYICAgICIkMCAgI0AgICAzPCAgQTYgICAgICIhJCAgIFggICAlKyAgJC8iICAgICAgMiAgICcgICAhCi1NNDAgIiU4QCAgICAiJDAgICNAICAgNiAgIDBfJCAgICAlISggICBAICAgJU0gICg1QyAgICAgMDEgICAuCi1NICAgIT0wICIlOSAgICAgIiQwICAjQCAgIDgoICBBNjggICAgJiEkICAgWCAgICYsICAoNUwgICAgIUAxCi1NICAgLiAgICFFQCAiJTxAICAgICQkMCAgI0AgICA5VCAgQTcsICAgICEhJCAgIFggICAmTCAgKDVUICAgCi1NICAwMSAgIC4gICAhUSAgISQlICAgICA0JEAgICIgICAgPTwgIEE3NCAgICAhISQgICBYICAgJ04gICg1Ci1NViAgICAgKDEgICAuICAgIV1AICEjXlAgICAgNCRAICAiICAgIEBQICBBMCwgICAgICEkIF9fJCAgICg1Ci1NICAkMEogICAgTEAyICAgKCAgICImQCAhJFggICAgICQkMCAgIkAgICBCPCAgMSIwICAgICYhKCAgIEAgCi1NICAoVSAgKDVWQCAgICAoMSAgIC4gICAiMjAgISQhMCAgICA0JEAgICIgICAgRUwgIEE3PCAgICAhISQgCi1NICBYICAgKUsgICg1WCAgICAgMDEgICAuICAgIj5AICIlPkAgICAgMCQwICAjQCAgIEhEICAwXDQgICAgCi1NPSEoICAgQCAgICowICAoNEUgICAgICAxIC9fUSAgICJFUCAhJCJAICAgIDQkQCAgIiAgICBKTCAgQTdYCi1NICAgICIhJCAgIFggICAqVyAgKDYgICAgICAwMSAgIC4gICAiT1AgISQnQCAgICA4JEAgICIgICAgTFAgCi1NIDEgXCAgICAlISggICBAICAgKzggICg2ISAgICAgQDEgICAuICAgIlpQICIlRSAgICAgJCgwICAjQCAgCi1NIE8sICBBOCwgICAgISEkICAgWCAgICwkICAoNiQgICAgIDAxICAgLiAgICMmQCAhI11AICAgIDQkQCAgCi1NIiAgICBSWCAgQTg0ICAgICEhJCAgIFggICAsXSAgKDYmICAgICAwMSAgIC4gICAjNTAgISNbICAgICA0Ci1NJEAgICIgICAgVkggIEE5PCAgICAgISQgX18kICAgLU8gICg2JyAgICAgMDEgICAuICAgI0FAICIlQiAgCi1NICAgJCQwICAjQCAgIFkwICBBOEQgICAgIDEkICAgWCAgIC5EICAoNiogICAgIDAxICAgLiAgICNNICAiCi1NJUJQICAgICQkMCAgI0AgICBcMCAgMS5IICAgICAhJCBfXyQgICAvKyAgKDYsICAgICBAMSAgIC4gICAjCi1NVjAgIiVDQCAgICAkJDAgICNAICAgXlggIEEwICAgICAgISQgX18kICAgMCQgICQwICAgICAhMDIgICAoCi1NICAgJCNQICEjWVAgICAgNCRAICAiICAgISIoICBBOFwgICAgISEkICAgWCAgIDBQICAoNjAgICAgICQxCi1NICAgLiAgICQtUCAiJUQwICAgICQkMCAgI0AgICEkKCAgQTkoICAgICIhJCAgIFggICAxLyAgKDNZICAgCi1NICEgMiAgICAgICAkNSAgIiRdQCAgICE4JEAgICAgICAhJUwgIEEvUCAgICAiISggICAgICAgMUEgICg2Ci1NNCAgICAgMDEgICAuICAgJDpAICIlRTAgICAgJCQwICAjQCAgISgsICBBOTggICAgISEkICAgWCA5VjFCCi1NOzY0IDhXKVQ6MllTICc5QTsnNUU8UlU4ODJZQyAmPUQ4RlVFK0YsIDhXKVQ7QllTICc5Pz02WUk7VlggCi1NN1Y5STtGRCA8VV1MOjZZSyAnNT87JkVOOlAhVjdXLUk5VllFOSVdUzomXVI9JV1QO1ZFTj0mNVIgJzk/Ci1NOjZZVCAnOT88VkVHO0Y1RDdWLUg4NyggPUVdSTtHMT88Jl1JO0cxRTxAIVY3VjFPPTYpTDkwIVY3VzVOCi1NPFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgPUVdVTtHLUk5VllFOSVdSTtHMT84NylSODdEID1FXVM6Nj1OCi1NOTYxPzo2WVQ3VyFPOjZZVDk3KCA4VlFVO0ZNRTxAIVY3Vy1JOVZZRTklXUk7RzAgPUVdVTtHLUk5VllFCi1NOSVdTDtWWUc3VjlVO0YsID1FXUM6JiVSN1Y5VTtGLCA9RV1VO0ZFTztDKCA8VyFPPEcxUzhWJVIgJzk/Ci1NPTZZUzo2PU45NjE/OFZBQTxFXUE8RylBPjAhVjdXNU48VkVHO0Y1RDdXLUg7VylUICc5PzxWRUc7RjVECi1NN1ZRTztGPT84NylSODdEIDdWRU46NzAgPUVdUzo2PU45NjE/PFZBTzxHMCA9RV1TOiZdUj0lXUY9NllDCi1NICc5PzlGUU84NzAgPUVdQzomJVI3ViVSPEYlWSAnOT88VzFSPTYtVCwwIVY3Vy1UPEc1Qz0jKCA9RV1MCi1NO1ZZRyAnOT87Jl1OOVVdUDtWRU49JjVSICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIgJzk/Ci1NPFZFRztGNUQ3VlFPO0Y9PzlHNU44UCFWN1c1TjxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAnOT88VkFPCi1NPEcwID1FXVU7Ry1JOVZZRTklXVM6Jl1SPSVdRj02WUMgJV0kNjRZITM0RSMgJlVBOjZYIDdWUUk4RV1WCi1NOTcpUzo2XU4gJzk/OSZdVThGUUU3VjlVO0YsID1FXVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4wIVY3Vy1JCi1NOVZZRTklXUk7RzE/OUc1TjhQIVY3VzVOPFZFRztGNUQ3VlFPO0Y8ID1FXVU7Ry1JOVZZRTklXUk7RzAgCi1NPUVdRDtXNUI7JjU/ODcpUjg3RCA3Vy1UODcpVCAlXUU5JiVUODAhVjdXNU48VkVHO0Y1RDdWRU49JV1GCi1NPTZZQyAnOT86NllUN1YlUjxGJVkgJyFSOjZVQTxHRCA9RV1GOyZdQT0lXUY9NllDICc5PzsmXU45VV1GCi1NPTZZQyAnOT88VkVHO0Y1RDdWRU49JV1BPEcpQT4wIUU7RzlJPEZdTiAnOT85Jl1VOEZRRTdXIU86NllUCi1NOTcoID1FXVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIgJzk/PFZFRztGNUQ3Vy1IO1cpVDdWOVU7RiwgCi1NPUVdQzomJVI3VyFPOjZZVDk3KCA9RV1VO0ctSTlWWUU5JV1DOiYlUjdXIU86NllUOTcoID1FXVU7Ry1JCi1NOVZZRTklXUM6JiVSN1Y5VTtGLCA3VjVOOSAhVjdXNU48VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkgJzk/Ci1NPFZFRztGNUQ3VlFPO0Y8ID1FXVU7Ry1JOVZZRTklXUM6JiVSICc5PzxWQU88RzE/PCZdSTtHMUU8QCFWCi1NN1Y5TDtWJVQ3VyFPOjZZVDk3KCA3VjVUOTdBVCAnOT85RlFPODcxPzg3KVI4N0QgPUVdUzo2PU45NjE/Ci1NPFZBTzxHMT84NylSODdEIDdUPSwzVCkhMyVdLzFEOTMxNTE/NSQlIjMkNT8gJzk/OjZZVDdWOVU7RiwgCi1NPUVdUzo2PU45NjE/OFZBQTxFXUY9NllDICc5PzxWQU88RzE/ODcpUjg3RCA9RV1DOiYlUiAmWU87RyFSCi1NOjZVQTxHRCA9RV1MO1ZZRzdWJVI8RiVZICY1WDo3MCA4NzFFPiZFVCAlXUU+JkVUICVdRTtHOUk8Rl1OCi1NICc5Pz02WVM6Nj1OOTYxPzxWQU88RzE/PCZdSTtHMUU8QCFWN1ctSTlWWUU5JV1MO1ZZRzdXIU86NllUCi1NOTcoICAnOUE7JzVFPFJVODgyWUMgIl1EOjc5RStXKUU7JjVBPFY0TzhCVVM+Ny1JOUZFWCtXNVM8Ql1TCi1NPEYsTzsmRUIrVlFJOEYsTyAnIU88RzBPOVY1TitXOUE7JzVFPFJVODgyWUMgICAgNicwQC5SITYvMyhOCi1NLCAhTTg2RU4gJV1MOjYpPz1GNVI8VkVPO0AgTz0mVVAgIl1VPFcoTzhWLVMrVlFJOEJdVjg2UVU5NyxNCi1NNiYkTjtQICA5VjFCOzY0TjhQIE89JlVQK1AhRzkmKU05MllDICY9QzhTKT84Vl1NPCZFTDk2ME4gJkVOCi1NPSNJVCwzVVIsM0xNLEMkVC1TMFgsUzhULiNMUiwzMFctI0BTLUMwVy5QIUM6JiVSLkcwUi83KFIuUyBbCi1NLDMoVy5QIUw7VllHKCZFTj0jSVQsU1VSLDNMTSxDJFQtUzBYLFM4VC4jTFIsMzBXLSNAUy1DMFcuUCFVCi1NO0ctSTlWWUU5IiFJO0cwWj0jMF08QyRbLCNMTSwzTCA7Jl1OOVIhVTtHLUk5VllFOSIhSTtHMFo9IzRdCi1NPEMkWywjTE0sM0wgPFZBTzxHMEA6NllULkcwVi83KFEuUlRTLEM8Vi4jTFMsQzxWLVNMIDsmXU45UiFMCi1NO1ZZRygmRU49I0lULVNVUiwzTFAuUlRRLlAhUzomXVI9IiFVO0ctSTlWWUU5IiFJO0cwWj0jQF08QyRbCi1NLCNMVi0zNFMtM0wgOyZdTjlSIUw7VllHKCc1TjxWRUc7RjVEKCZFTj0jSVQuM1VSLDNMUC5SVFEuUCFTCi1NOjY9Tjk2MEA4VkFBPENJVCwzIF08QyRbKzMkUi4jTFEsQzxbICc1TjxWRUc7RjVEKCYtSDg3KFo9IyRRCi1NLzcoUS5TIFssQzRVLlAhRjsmXUE9I0lULDMoXTxDJFstI0xQLlAhRDtXNUI7JjRaPSMkUy83KFEuU0BbCi1NLCNMIDsmXU45UiFEO1c1QjsmNFo9IyRULzcoUS5TQFssI0wgPUZdSTkjSVQsMzRdLDM0ID0lXVM9JylVCi1NOFcwWjUjJFYvNyxSLSc5PzhWQUE8RV1NOTZVQjk3KFosQlBQKyNAWz1FXVM6Jl1SPSVdTTk2VUI5NyhaCi1NLUJQUS1CUFEtQ01WN1ZFTj0lXU05NlVCOTcoWiwyUFMsQlBTLENNVjdWUU87Rj0/OzY1TThGNVIuQyxMCi1NLUMwTCxTKFs9RV1GOyZdQT0lXU05NlVCOTcoWiwzKEwuMzhMLFMoWz1FXUQ7VzVCOyY1Pzs2NU04RjVSCi1NLkMkUysjJFIuIlBWLSNMWyAnMT89NllJO1ZYWjUjJFcvNzRYPUVdQzomJVI3VlVFOzYpRTxDSFIrIyBMCi1NLiNNVjdXLUg7VylUN1ZVRTs2KUU8Q0hWKyMgTCwzOFs9RV1JO0cxPzs2NU04RjVSLkMkTCwiUFMsQ01WCi1NN1ZRTztGPT87NjVNOEY1Ui5DLEwsIlBTLENNVjdWOUw7ViVUN1ZVRTs2KUU8Q0hRLEJQUCsjLFIuVzk/Ci1NOSZdVThGUUU3VlVFOzYpRTxDSFEsUlBQKyM4VC5TTCA9RV1DOiYlUjdWOVU7RixaMUMoID1FXVM6Nj1OCi1NOTYxPzhWQUE8RV1GPTZZQy5EOFEsICFWN1c1TjxWRUc7RjVEN1YtSDg3KT85RzVOOFNJJiwzJCA9RV1TCi1NOiZdUj0lXUY9NllDLkQ4ViAnOT88VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLFoxQzggPUVdVTtHLUk5VllFCi1NOSVdUzomXVI9JV1GPTZZQy5EOFggJzk/OjZZVDdWOVU7RixaMUMkID1FXVM6Nj1OOTYxPzo2WVQ3VjlVCi1NO0YsWjFDJCA9RV1VO0ctSTlWWUU5JV1JO0cxPzlHNU44U0kmLSAhVjdWUU87Rj0/OUc1TjhTSSYsUCFWCi1NN1ctSTlWWUU5JV1MO1ZZRzdWOVU7RixaMUMsID1FXVU7Ry1JOVZZRTklXUw7VllHN1Y5VTtGLFoxQzQgCi1NPUVdRjsmXUE9JV1GPTZZQy5EOFEsQCFWN1YxTz02KUw5NV1GPTZZQy5EOFEsUCFMOjZZSy5FMFEuI1VTCi1NLDM0UjtGNVg9I0hRLjNUSiwzQEwsIlBTLENNTDo2WUs5RzVOOFNIUiwjVEosQyRdOUMkWSsjLFIrIyxSCi1NLlctVD02OUYuQyhSLzYlUiwzTFAuUyBbLEMsXTg3KFEuUyBbLDNMUi0jVUE8QyRbLCNMUi5TJFYrIzhUCi1NKyMkUS0zKFsuUCFUPTVdTDo2WUsuRTBSLTNVVSwzMFQ7RjVYPSNIUS4yUFArIyxSLlZRSTtGTUY9NllDCi1NLkMoUCsjIEwsUyhbPFcxVTlGOFosQyhMLCJQUSwzNFIuU0wgOFZdTDtXKVMuRTBSLUNVRT42NUw7Jl1XCi1NLkMgTDwnNVI8JlFFLkMkTDwmRU46U0hSKyNMIDhWJVI8U0k0LEM8XTk2KU09U0hQKychTzxHLUM6JjRaCi1NLDJQWyAmKU87VlFFODZYWj0jKFgvNjUmMDRRMzEzSFArJTEyNTQ0WiwyUFsgJilWODZRUy5FMFIuM1VFCi1NOUYlTDxWNFosIlFUPEc1RS5DJEwuUCFCO1ZdTDk2JU4sQ0lULENEIDs2RVM7VylEOTcpRTkjSTQsUyBdCi1NOTcxVztTSFIrJl1OOTNIUSsnSUU8RlxaLCJRVDonKUU5M0hTKyNMIDs2JUk7Q0kmLDAhVjdWLUg4NyhaCi1NMVMoID1FXVM6Nj1OOTYxPzhWQUE8Q0knLDMgID1FXVU7Ry1JOVZZRTklXUM6JiVSLkQ8USwwIVY3Vy1ICi1NO1cpVC5EPFYgJzk/PFZFRztGNUQ3Vy1IO1cpVC5EPFYgJzk/PTZZUzo2PU45NjE/PFZBTzxHMFoxU0AgCi1NPUVdSTtHMFoxUyQgPUVdUzo2PU45NjE/OjZZVC5EPFEgJzk/PTZZUzo2PU45NjE/OjZZVC5EPFQgJzk/Ci1NOyZdTjlTSScsUCFWN1ctSTlWWUU5JV1MO1ZZRy5EPFMgJzk/PTZZUzo2PU45NjE/OyZdTjlTSSctMCFWCi1NN1Y5TDtWJVQuRDxRLEAhVjdWMU89NilMOTNJJywzLCA9RV1DOiYlUjdWJVI8RiVZLkQ8UywzVUE8QyRbCi1NLCNMUS5TKCA9RV1TOjY9Tjk2MT84VkFBPEVdQTxHKUE+M0knLFMoXTg3KFEuUyBbLDNMUSwgIVY3VzVOCi1NPFZFRztGNUQ3Vi1IODcpPzg3KVI4N0RaMVMsUy82JVIsM0xQLlMkWywzJCA9RV1TOiZdUj0lXUE8RylBCi1NPjNJJyxTMF04NyhRLlMgWywzTFYgJzk/PFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZLkQ8Uy0gIVY3VzVOCi1NPFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZLkQ8Uy0zVUE8QyRbLCNMUS5TQCA9RV1JO0cxPzg3KVI4N0RaCi1NMVMsVi82JVIsM0xQLlMkWywwIVY3Vy1JOVZZRTklXUk7RzE/ODcpUjg3RFoxUyxWICc5Pz02WVM6Nj1OCi1NOTYxPzo2WVQ3ViVSPEYlWS5EPFMtU1VBPEMkWywjTFEuUzAgPUVdTDtWWUc3ViVSPEYlWS5EPFMuI1VBCi1NPEMkWywjTFEuUywgPUVdUzo2PU45NjE/OyZdTjlVXUE8RylBPjNJJyxTQCA9RV1VO0ctSTlWWUU5JV1MCi1NO1ZZRzdWJVI8RiVZLkQ8Uy4zVUE8QyRbLCNMUS5TNCA9RV1GOyZdQT0lXUE8RylBPjNJJy0jIF04NyhRCi1NLlMgWywzTFEsQCFWN1YxTz02KUw5NV1BPEcpQT4zSSctIyRdODcoUS5TIFssM0xRLFAhVjdWLUg4Nyk/Ci1NPCZdSTtHMUU8Q0knLSMoXSpDKCA9RV1TOjY9Tjk2MT84VkFBPEVdUDtWRU49JjVSLkQ8VCxTVEosMyAgCi1NPUVdVTtHLUk5VllFOSVdQzomJVI3VyFPOjZZVDk3KFoxUzBULzJIUSwwIVY3Vy1IO1cpVDdXIU86NllUCi1NOTcoWjFTMFUvMkhWICc5PzxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVDk3KFoxUzBVICc5Pz02WVM6Nj1OCi1NOTYxPzxWQU88RzE/PCZdSTtHMUU8Q0knLSM4XSpDQCA9RV1JO0cxPzwmXUk7RzFFPENJJy0jPF0qQyQgCi1NPUVdUzo2PU45NjE/OjZZVDdXIU86NllUOTcoWjFTMFcgJzk/PTZZUzo2PU45NjE/OjZZVDdXIU86NllUCi1NOTcoWjFTMFgvMkhUICc5PzsmXU45VV1QO1ZFTj0mNVIuRDxULjNUSixQIVY3Vy1JOVZZRTklXUw7VllHCi1NN1chTzo2WVQ5NyhaMVMwWSAnOT89NllTOjY9Tjk2MT87Jl1OOVVdUDtWRU49JjVSLkQ8VSwjVEotMCFWCi1NN1Y5TDtWJVQ3VyFPOjZZVDk3KFoxUzRRLzJIUSxAIVY3VjFPPTYpTDk1XVA7VkVOPSY1Ui5EPFUsQ1RKCi1NLDMsID1FXVM9JylVOFcwUS5EPFEtQCFWN1ctVDxHNUM9IyhaMVM0Uy83LFItJzk/OFZBQTxFXU05NlVCCi1NOTcoWixCUFArI0BbPUVdUzomXVI9JV1NOTZVQjk3KFotQlBRLUJQUS1DTVY3VkVOPSVdTTk2VUI5NyhaCi1NLDJQUyxCUFMsQ01WN1ZRTztGPT87NjVNOEY1Ui5DLEwtQzBMLFMoWz1FXUY7Jl1BPSVdTTk2VUI5NyhaCi1NLDMoTC4zOEwsUyhbPUVdRDtXNUI7JjU/OzY1TThGNVIuQyRTKyMkUi4iUFYtI0xbICc5Pz02WUk7VlhaCi1NMVMkVyAnOT89NllJO1ZYUi5EPFUtI1VVLic5PzhWQUE8RV1NOTZVQjk3KFosQlBQKyNAWz1FXVM6Jl1SCi1NPSVdTTk2VUI5NyhaLUJQUCsjJFYuVzk/OjZZVDdWVUU7NilFPENIUSsjIEwsUyhbPUVdTDtWWUc3VlVFCi1NOzYpRTxDSFMrIyBMLFMoWz1FXUY7Jl1BPSVdTTk2VUI5NyhaLDMoTCwiUFMsQ01WN1YxTz02KUw5NV1NCi1NOTZVQjk3KFosMyxMLCJQVi0jTFsgJy0/OyZFTjpTSScsM0QgPTVdTDo2WUsuRDxSLTAhUDxGRU04NylZCi1NLkQ8VS0zVUU8RjVELkMgTDlXKUU5NlhaLDJRQjsnNUUuQyhMLlAhTjtWWVA8RkVNODcpWS5EPFItQCFDCi1NOyc1TjpWNVIuRDxVLUNVRThWQUU9R0RaLCJRRjtXKUQuQyRMLlAhUzwmXVI9Jy1DODcoWjFTKFcgICBOCi1NOjZZVDk3KVAgIllIODctSCAiWUQ+NllTPjZUICtGMVk7Ry1UPEAgTjxGNUw4MllCPFcsICtHKUU7JiROCi1NPCZRVCAiWUk7RkVUICJZVDk3QVQgIllGOjZZSSAiWVI7VjFBPSYkICtHIUw9ICBOOVZdVCAiWUQ+NllBCi1NOzZFQyAiWUI8VywgK0ctWTs3MUE4QCBOPFcxUj0mJUIgIllTPSYlQitGRU45JjVYPFcxUiAiWVM9JiVCCi1NPFcxUiAiWVM6Jy1UPEcxQThAIE44Vl1NOzY1Tj0gIE48VzFBOEJZSTtGMUU+ICBOPFcxQThAICA4NyxaCi1NKCQsQDEmNVY5NlFPPCZVRTtHMEA0VjVUKCIgSDBUMTMqMiEzNCQlMjBWXU08JkVMOTcpUygjKE4sIiBRCi1NLiIhLTg3REAsM0RZLEBIICAmJVMuQiEjKCQxRT1GNUw7VyFNOTZZVCglLUU9IiBAKiQtJDRSREA0VSEhCi1NNEQtTzs3IUk7JjVSPFIgUitDIEAsM0BAMzYlWSgjJFkuMygqICAhICoiLEk0VzVOM1UsQC0yWFAoJjlDCi1NPFJYQCgkSVU7RjRALDNEWSxAICA4NyxaKCQsQDEmNVY5NlFPPCZVRTtHMEA0VjVUKCIgSDBUMTMqMiEzCi1NNCQlMjBWXU08JkVMOTcpUygjKE4sIiBRLiIhLTg3REAsM0RZLEBIIDFULSMuQiBIMVRZNSoyIUM+Nj1OCi1NPTcsTSxCWFArQyggICYlUy5CISMoJDFFPUY1TDtXIU05NllUKCUtRT0iIEAqJC0kNFJEQDRVISE0RC1PCi1NOzchSTsmNVI8UiBSK0MgQCwzQEAzNiVZKCMkWS4zKCogJlFELkIgSDRUPTUqMiEzPTZZLzRSXTM1RShUCi1NKCJBLDJSVFErQyBJICAgICAgICAgICQgICAgJyAgICBCMCAgICBVRCAgICAgICAgICAgICAjPUQgICAjCi1NICAgICAgICAgJkxYICAgICAgICAgICAgICcgWCAgICAgICAgICAgICAkWFwgICAgKkE9NiFAICAgJURKCi1NICAgICAgICAgICAgICVYQCAgICAgICAgICAgICAgJCAgICJcICAgKyMgICAgIEVEICAgICAgJC9CICAgCi1NICBdRCAgICAgICQvQiAgICAhPFwgICAgICAgICAgICAgIjogICAgICAgICAgICAgICRCICAgICAgICAgCi1NICAgICAlSiAgICAgICAgICAgICAgKCYgICAgICAgICAgICAgIClKICAgICAgICAgICAgICArQiAgICAgCi1NICAgICAgICAgLTogICAgICAgICAgICAgIC8iICAgICAgICAgICAgICAxKiAgICAgICAgICAgICAgMzYgCi1NICAgICAgICAgICAgIDUqICAgICAgICAgICAgICA2WiAgICAgICAgICAgICAgOCIgICAgICAgICAgICAgCi1NIDkuICAgICAgICAgICAgICA6TiAgICAgICAgICAgICAgOz4gICAgICAgICAgICAgIEUmICAgICAgICAgCi1NICAgICBOLEQgICAgICAkL0IgICAgICEkICAhWSAgICAgICAgICAhJCAgIVkgICAgISAgICAgISQgICFZCi1NICAgICMgICAgTyhEICAgICAgJC9HICAgICAhJCAgIVogICAgICAgICAgISQgICFaICAgICEgICAgICEkCi1NICAhWiAgICAjICAgIFBERCAgICAgICQvTCAgICAgISQgICFbICAgICAgICAgICEkICAhWyAgICAhICAgCi1NICAhJCAgIVsgICAgIyAgICBSKEQgICAgICAkL1EgICAgICEkICAhXSAgICAgICAgICAhJCAgIV0gICAgCi1NISAgICAgISQgICFdICAgICMgICAgUyhEICAgICAgJC9WICAgICAhJCAgIV4gICAgICAgICAgISQgICFeCi1NICAgICEgICAgICEkICAhXiAgICAjICAgIFRERCAgICAgICQvWyAgICAgISQgICFfICAgICAgICAgICEkCi1NICAhXyAgICAhICAgICAhJCAgIV8gICAgIyAgICBWKEQgICAgICAkMCAgICAgICEkICAiISAgICAgICAgCi1NICAhJCAgIiEgICAgISAgICAgISQgICIhICAgICMgICAgVyBEICAgICAgJDAlICAgICAhJCAgIiIgICAgCi1NICAgICAgISQgICIiICAgICEgICAgICEkICAiIiAgICAjICAgIFg0RCAgICAgICQwKiAgICAgISQgICIjCi1NICAgICAgICAgICEkICAiIyAgICAhICAgICAhJCAgIiMgICAgIyAgICBZUEQgICAgICAkMC8gICAgICEkCi1NICAiJSAgICAgICAgICAhJCAgIiUgICAgISAgICAgISQgICIlICAgICMgICAgWkxEICAgICAgJDA0ICAgCi1NICAhJCAgIiYgICAgICAgICAgISQgICImICAgICEgICAgICEkICAiJiAgICAjICAgIFwkRCAgICAgICQwCi1NOSAgICAgISQgICInICAgICAgICAgICEkICAiJyAgICAhICAgICAhJCAgIicgICAgIyAgICBdREQgICAgCi1NICAkMD4gICAgICEkICAiKSAgICAgICAgICAhJCAgIikgICAgISAgICAgISQgICIpICAgICQgICAgXkhECi1NICAgICAgJDBEICAgICAhJCAgIiogICAgICAgICAgISQgICIqICAgICEgICAgICEkICAiKiAgICAkICAgCi1NIF9SICAgICAgICAgICAgICEmQiAgICAgICAgICAgICAhKkIgICAgICAgICAgICAgISxeICAgICAgICAgCi1NICAgICEuTiAgICAgICAgICAgICAhMEYgICAgICAgICAgICAgITI2ICAgICAgICAgICAgICEzKiAgICAgCi1NICAgICAgICAhNVxEICAgICAgJDBKICAgICAhJCAgIlIgICAgICAgICAgISQgICJVICAgICEgICAgICEkCi1NICAiViAgICAjICAgICAhJCAgIlcgICAgJiAgICAgISQgICJZICAgICkgICAgICEkICAiWiAgICAsICAgCi1NICAhJCAgIlsgICAgLyAgICAgISQgICJdICAgIDIgICAgICEkICAiXiAgICA1ICAgICAhJCAgIl8gICAgCi1NOCAgICAgISQgICMhICAgIDsgICAgICEkICAjIiAgICA+ICAgICAhJCAgIyMgICAgQSAgICAgISQgICMlCi1NICAgIEQgICAgICEkICAjJiAgICBIICAgICAhJCAgIykgICAgTCAgICAgISQgICMqICAgIFAgICAgICEkCi1NICAjKyAgICBUICAgICAhJCAgIy0gICAgWCAgICAgISQgICMuICAgIFwgICAgICEkICAjLyAgICEgICAgCi1NICAhJCAgIzEgICAhJCAgICAgISQgICMyICAgISggICAgICEkICAjMyAgICEsICAgICAhJCAgIzUgICAhCi1NMCAgICAgISQgICM2ICAgITQgICAgICEkICAjNyAgICE4ICAgICAhJCAgIzkgICAhPCAgICAgISQgICM6Ci1NICAgIUAgICAgICEkICAjPCAgICFEICAgICAhJCAgIz0gICAhSCAgICAgISQgICM+ICAgIUwgICAgICEkCi1NICAjQCAgICFQICAgICAhJCAgI0EgICAhVCAgICAgISQgICNCICAgIVggICAgICEkICAjRCAgICFcICAgCi1NICAhJCAgI0UgICAiICAgICAgISQgICNGICAgIiQgICAgICEkICAjSCAgICIoICAgICAhJCAgI0kgICAiCi1NLCAgICAgISQgICNKICAgIjAgICAgICEkICAjTCAgICI0ICAgICAhJCAgI00gICAiOCAgICAgISQgICNPCi1NICAgIjwgICAgICEkICAjUCAgICI/ICAgICAhJCAgI1EgICAiQiAgICAgISQgICNSICAgIkUgICAgICEkCi1NICAjVCAgICJIICAgICAhJCAgI1YgICAiTCAgICAgISQgICNXICAgIlAgICAgICEkICAjVyAgICJQICAgCi1NITY8QCAgICAgICAgICAgICE3JEAgICAgICAgICAgICAhOCxAICAgICAgICAgICAgITk8QCAgICAgICAgCi1NICAgICE6KEAgICAgICAgICAgICAhOzBAICAgICAgICAgICAgITxAQCAgICAgICAgICAgICE9JEAgICAgCi1NICAgICAgICAhPiRAICAgICAgICAgICAgIT8sQCAgICAgICAgICAgICE/VEAgICAgICAgICAgICAhQFhACi1NICAgICAgICAgICAgIUIkQCAgICAgICAgICAgICFCVEAgICAgICAgICAgICAhQ0hAICAgICAgICAgICAgCi1NIUU0QCAgICAgICAgICAgICFHQEAgICAgICAgICAgICAhSVRAICAgICAgICAgICAgIUtEQCAgICAgICAgCi1NICAgICFNKEAgICAgICAgICAgICAhTzxAICAgICAgICAgICAgIVEkQCAgICAgICAgICAgICFSQEAgICAgCi1NICAgICAgICAhVExAICAgICAgICAgICAgIVY4QCAgICAgICAgICAgICFXWEAgICAgICAgICAgICAhWihACi1NICAgICAgICAgICAgIVtcQCAgICAgICAgICAgICFdVEAgICAgICAgICAgICAhXyxAICAgICAgICAgICAgCi1NIiEkQCAgICAgICAgICAgICIjJEAgICAgICAgICAgICAiJEBAICAgICAgICAgICAgIiYsQCAgICAgICAgCi1NICAgICIoLEAgICAgICAgICAgICAiKUBAICAgICAgICAgICAgIiskQCAgICAgICAgICAgICIsXEAgICAgCi1NICAgICAgICAiLjRAICAgICAgICAgICAgIi9cQCAgICAgICAgICAgICIxWEAgICAgICAgICAgICAiMzhACi1NICAgICAgICAgICAgIjRcQCAgICAgICAgICAgICI1VEAgICAgICAgICAgICAiP0BAICAgICAgICAgICAgCi1NIkAwQCAgICAgICAgICAgICJJPEAgICAgICAgICAgICAiSihAICAgICAgICAgICAgIkpUQCAgICAgICAgCi1NICAgICJNJEAgICAgICAgICAgICAiTiBAICAgICAgICAgICAgIk9YQCAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhICAgICAwICAgICggCi1NIDAjNCAgICBVICAgICEkICAgICAgICAgICAgICAgJCAgICAgICAgICIwICAgIDQgICAgIiAgJCBaICAgCi1NIC5AICAgK1QgICAgIFAgICAgICAgICAkICAgICEgICAgIFwgICAgKyAgICAgQCAhIF1QICAgLzwgICAmCi1NQCAgICAgMCAgICA3ICAgICEgICAgISAgICAgNyAgICAgUCAgICAoICAwSTwgICAqNyAgICEnTCAgICAgCi1NICAgICAgICAgICQgICAgICAgICAnUCAgICAwICAgICIgICQuViAgICNNQCAgICAsICAgICBQICAgIFggCi1NICAgJCAgICAjICAgICJEICAgICQgICAgIEAgISNOMCAgIFtEICAgICkgICAgICwgICAgKyAgICAhICAgCi1NICBQICAgIFMgICAgIDAgICAgOCAgMFwoICAgLyIgICAgIFAgICAgICAgICAgICAgICAwICAgICAgICAgCi1NLjAgICAgJCAgICAmICAkLyUgICAjUTAgICAxPCAgICAgICAgICAgICAgICQgICAgICAgICAjXCAgICAhCi1NICAgICFAICEkVyAgICEtUCAgICAjICAgICAgICAgICAgICAgISAgICAgICAgICElICAgICAwICAgICggCi1NIDEuICAgIDNAICAgICJAICAgICAgICAgICAgICAgQCAgICAgICAgIDMwICAgICQgICAgJyAgKDNKICAgCi1NJFpAICAgITggICAgICAgICAgICAgICAkICAgICEgICAgJSggICAgISAgICAgUCAiJSAgICAhMCAgICAgCi1NIyAgICAgICAgICAgICAgICEgICAgIDAgICAhNyAgICAhQCAgICAsICBBMCwgICA0IyAgICAoQCAgICAkCi1NICAgICAgICAgIDAgICAgKCAgICA4ICAgICBAICAgICMgICg0RiAgICUpQCAgICckICAgICAgICAgICAgCi1NICAgKCAgICAgICAgICY0ICAgICIgICAgICAgICAgICAgITI4ICAgJlQgICAgISAgICAgPCAgICAhICAgCi1NICEgICAgIU0gICAgIFAgICAgICAgICAgICAgOzogICAhKUQgICAgICAgICAgICAgICAkICAgICAgICAgCi1NPTAgICAgLCAgICAgICAgICAgICAoICQgICAiKSAgICAgICAgICAgICAgICEgICAgICAgICAoMCAgICAjCi1NICAgICAgICAgICAgICIiKiAgICsjICAgICAgICAgICAgICAgIDAgICAgICAgICItICAgICBQICAgICAgCi1NICAgICAgIEtFQCAgICsoICAgICAgICAgICAgICAgJCAgICAgICAgIEVQICAgICQgICAgICAgICAgICAgCi1NKyRAICAgJSkgICAgICAgICAgICAgICAhICAgICAgICAgKiAgICAgISAgICAgICAgICAgICAiVjQgICAgCi1NOCAgICAgICAgICAgICAgICEgICAgIFAgICAiTCAgICAgMCAgICAgICAgICAgICBNXSAgICItUCAgICAgCi0sICAgICAgICAgIDAgICAgLAotIAotZW5kCmRpZmYgLS1naXQgYS9nZGIvdHVpL01ha2VmaWxlIGIvZ2RiL3R1aS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4OWM2ZS4uMDAwMDAwMAotLS0gYS9nZGIvdHVpL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBNYWtlZmlsZS5pbiBieSBjb25maWd1cmUuCi0jIENvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLWFsbDogbGlidHVpLmEKLQotc3JjZGlyPS4KLQotU0hFTEwgPSAvYmluL3NoCi0KLUNDPWdjYwotQ0ZMQUdTPS1nIC1PMgotQVI9YXIKLVJBTkxJQj1yYW5saWIKLQotIyBIb3N0IGFuZCB0YXJnZXQtZGVwZW5kZW50IG1ha2VmaWxlIGZyYWdtZW50cyBjb21lIGluIGhlcmUuCi0KLSMgSG9zdDogU3VuIDQgb3IgU3BhcmNzdGF0aW9uLCBydW5uaW5nIFN1bk9TIDQKLVhERVBGSUxFUz0gc2VyLXRjcC5vCi1YTV9GSUxFPSB4bS1zdW40b3M0LmgKLU5BVF9GSUxFPSBubS1zdW40b3M0LmgKLU5BVERFUEZJTEVTPSBmb3JrLWNoaWxkLm8gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGNvcmVsb3cubyBzcGFyYy1uYXQubwotSE9TVF9JUEM9LURCU0RfSVBDCi1HREJTRVJWRVJfREVQRklMRVM9IGxvdy1zcGFyYy5vCi0jIFNldHRpbmcgWE1fQ0xJQlM9LWxyZXNvbHYgd291bGQgbGV0IHVzIHVzZSB0aGUgRE5TLCBidXQgdGhhdCB3b3VsZCBzY3JldwotIyBhbnlvbmUgd2hvIHdhbnRzIHRvIHVzZSBOSVMsIHdoaWNoIGluY2x1ZGVzIGF0IGxlYXN0IG9uZSBDeWdudXMgY3VzdG9tZXIKLSMgKFBSIDM1OTMpLiAgU28gbGVhdmUgaXQgdGhpcyB3YXkgdW50aWwvdW5sZXNzIHdlIGZpbmQgYSByZXNvbHZlciB3aGljaCBjYW4KLSMgZ2V0IG5hbWVzIGZyb20gZWl0aGVyIEROUyBvciBOSVMgZnJvbSB0aGUgc2FtZSBHREIgYmluYXJ5LgotCi0jIFRhcmdldDogU3VuIDQgb3IgU3BhcmNzdGF0aW9uLCBydW5uaW5nIFN1bk9TIDQKLVRERVBGSUxFUz0gc3BhcmMtdGRlcC5vIHNvbGliLm8KLVRNX0ZJTEU9IHRtLXN1bjRvczQuaAotIyBFbmQgb2YgaG9zdCBhbmQgdGFyZ2V0LWRlcGVuZGVudCBtYWtlZmlsZSBmcmFnbWVudHMKLQotIyBXaGVyZSBpcyBvdXIgImluY2x1ZGUiIGRpcmVjdG9yeT8gIFR5cGljYWxseSAkKHNyY2RpcikvLi4vaW5jbHVkZS4KLSMgVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgaGVhZGVyIGZpbGUgZGlyZWN0b3J5IGZvciB0aGUgbGlicmFyeQotIyByb3V0aW5lcyBpbiBsaWJpYmVydHkuCi1JTkNMVURFX0RJUiA9ICAkKHNyY2RpcikvLi4vLi4vaW5jbHVkZQotSU5DTFVERV9DRkxBR1MgPSAtSSQoSU5DTFVERV9ESVIpCi0KLSMgQ29uZmlndXJlZCBieSB0aGUgLS13aXRoLW1tYWxsb2Mgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KLU1NQUxMT0MgPSAKLU1NQUxMT0NfQ0ZMQUdTID0gCi0KLSMgV2hlcmUgaXMgdGhlIEJGRCBsaWJyYXJ5PyAgVHlwaWNhbGx5IGluIC4uL2JmZC4KLUJGRF9ESVIgPSAuLi8uLi9iZmQKLUJGRF9TUkMgPSAkKHNyY2RpcikvJChCRkRfRElSKQotQkZEX0NGTEFHUyA9IC1JJChCRkRfRElSKSAtSSQoQkZEX1NSQykKLQotIyBXaGVyZSBpcyB0aGUgUkVBRExJTkUgbGlicmFyeT8gIFR5cGljYWxseSBpbiAuLi9yZWFkbGluZS4KLVJFQURMSU5FX0RJUiA9IC4uLy4uL3JlYWRsaW5lCi1SRUFETElORV9TUkMgPSAkKHNyY2RpcikvJChSRUFETElORV9ESVIpCi1SRUFETElORV9DRkxBR1MgPSAtSSQoUkVBRExJTkVfU1JDKQotCi0jIFdoZXJlIGlzIHRoZSBJTlRMIGxpYnJhcnk/ICBUeXBpY2FsbHkgaW4gLi4vaW50bC4KLUlOVExfRElSID0gLi4vLi4vaW50bAotSU5UTF9TUkMgPSAkKHNyY2RpcikvJChJTlRMX0RJUikKLUlOVExfQ0ZMQUdTID0gLUkkKElOVExfRElSKSAtSSQoSU5UTF9TUkMpCi0KLSMgV2hlcmUgaXMgdGhlIFRDTCBsaWJyYXJ5PyAgVHlwaWNhbGx5IGluIC4uL3RjbC4KLVRDTF9DRkxBR1MgPSBAVENMSERJUkAKLQotIyBXaGVyZSBpcyB0aGUgVEsgbGlicmFyeT8gIFR5cGljYWxseSBpbiAuLi90ay4KLVRLX0NGTEFHUyA9IEBUS0hESVJAIEBUS19CVUlMRF9JTkNMVURFU0AKLQotIyBXaGVyZSBpcyBJdGNsPyAgVHlwaWNhbGx5IGluIC4uL2l0Y2wuCi1JVENMX0NGTEFHUyA9IEBJVENMSERJUkAKLQotIyBXaGVyZSBpcyBUaXg/ICBUeXBpY2FsbHkgaW4gLi4vdGl4LgotVElYX0NGTEFHUyA9IEBUSVhIRElSQAotCi1YMTFfQ0ZMQUdTID0gQFRLX1hJTkNMVURFU0AKLQotRU5BQkxFX0lERT0gQEVOQUJMRV9JREVACi0KLUdVSV9DRkxBR1NfWCA9IC1JJChzcmNkaXIpLy4uLy4uL2xpYmd1aS9zcmMKLQotSURFX0NGTEFHU19YID0gLUkkKHNyY2RpcikvLi4vLi4vbGliaWRldGNsL3NyYyAtSSQoc3JjZGlyKS8uLi8uLi9saWJpZGUvc3JjIFwKLSAgYGlmIFsgeCIkKEVOQUJMRV9JREUpIiAhPSB4IF0gOyB0aGVuIFwKLSAgICBlY2hvIC1ESURFIC1JJChzcmNkaXIpLy4uLy4uL2lsdS9ydW50aW1lL21haW5sb29wO1wKLSAgZmlgCi0KLUlERV9DRkxBR1M9JChHVUlfQ0ZMQUdTX1gpICQoSURFX0NGTEFHU19YKQotCi1FTkFCTEVfQ0ZMQUdTPSAKLQotIyAtSS4gZm9yIGNvbmZpZyBmaWxlcy4KLSMgLUkkKHNyY2RpcikgZm9yIGdkYiBpbnRlcm5hbCBoZWFkZXJzIGFuZCBwb3NzaWJseSBmb3IgZ251LXJlZ2V4LmggYWxzby4KLSMgLUkkKHNyY2RpcikvY29uZmlnIGZvciBtb3JlIGdlbmVyaWMgY29uZmlnIGZpbGVzLgotCi0jIEl0IGlzIGFsc28gcG9zc2libGUgdGhhdCB5b3Ugd2lsbCBuZWVkIHRvIGFkZCAtSS91c3IvaW5jbHVkZS9zeXMgaWYKLSMgeW91ciBzeXN0ZW0gZG9lc24ndCBoYXZlIGZjbnRsLmggaW4gL3Vzci9pbmNsdWRlICh3aGljaCBpcyB3aGVyZSBpdAotIyBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIFBvc2l4KS4KLURFRlMgPSAtREhBVkVfQ09ORklHX0gKLUdEQl9DRkxBR1MgPSAtSS4gLUkuLiAtSSQoc3JjZGlyKSAtSSQoc3JjZGlyKS8uLiAtSSQoc3JjZGlyKS8uLi9jb25maWcgJChERUZTKQotCi0jIE17SCxUfV9DRkxBR1MsIGlmIGRlZmluZWQsIGhhdmUgaG9zdC0gYW5kIHRhcmdldC1kZXBlbmRlbnQgQ0ZMQUdTCi0jIGZyb20gdGhlIGNvbmZpZyBkaXJlY3RvcnkuCi1HTE9CQUxfQ0ZMQUdTID0gJChNVF9DRkxBR1MpICQoTUhfQ0ZMQUdTKQotI1BST0ZJTEVfQ0ZMQUdTID0gLXBnCi0KLSMgSU5URVJOQUxfQ0ZMQUdTIGlzIHRoZSBhZ2dyZWdhdGUgb2YgYWxsIG90aGVyICpDRkxBR1MgbWFjcm9zLgotSU5URVJOQUxfQ0ZMQUdTID0gJChDRkxBR1MpICQoR0xPQkFMX0NGTEFHUykgJChQUk9GSUxFX0NGTEFHUykgXAotCSQoR0RCX0NGTEFHUykgJChSRUFETElORV9DRkxBR1MpICQoQkZEX0NGTEFHUykgXAotCSQoTU1BTExPQ19DRkxBR1MpICQoSU5DTFVERV9DRkxBR1MpICQoSU5UTF9DRkxBR1MpIFwKLQkkKEVOQUJMRV9DRkxBR1MpCi0KLUhFQURFUlMgPSB0dWlJTy5oIHR1aURhdGEuaCB0dWlHZW5lcmFsV2luLmggdHVpTGF5b3V0LmggdHVpU3RhY2suaCBcCi0JICB0dWlTb3VyY2UuaCB0dWlDb21tYW5kLmggdHVpV2luLmggdHVpRGlzYXNzZW0uaCBcCi0JICB0dWlTb3VyY2VXaW4uaCB0dWlSZWdzLmggdHVpRGF0YVdpbi5oCi0KLVNPVVJDRVMgPSB0dWkuYyB0dWlEYXRhLmMgdHVpU291cmNlLmMgdHVpU3RhY2suYyB0dWlJTy5jIFwKLQkgIHR1aUdlbmVyYWxXaW4uYyB0dWlMYXlvdXQuYyB0dWlXaW4uYyB0dWlDb21tYW5kLmMgXAotCSAgdHVpRGlzYXNzZW0uYyB0dWlTb3VyY2VXaW4uYyB0dWlSZWdzLmMgdHVpRGF0YVdpbi5jCi0KLU9CSkVDVFMgPSB0dWkubyB0dWlEYXRhLm8gdHVpU291cmNlLm8gdHVpU3RhY2subyB0dWlJTy5vIFwKLQkgIHR1aUdlbmVyYWxXaW4ubyB0dWlMYXlvdXQubyB0dWlXaW4ubyB0dWlDb21tYW5kLm8gXAotCSAgdHVpRGlzYXNzZW0ubyB0dWlTb3VyY2VXaW4ubyB0dWlSZWdzLm8gdHVpRGF0YVdpbi5vIFwKLQkgIHR1aUluaXQubwotCi0KLSMgUHJldmVudCBTdW4gbWFrZSBmcm9tIHB1dHRpbmcgaW4gdGhlIG1hY2hpbmUgdHlwZS4gIFNldHRpbmcKLSMgVEFSR0VUX0FSQ0ggdG8gbm90aGluZyB3b3JrcyBmb3IgU3VuT1MgMywgNC4wLCBidXQgbm90IGZvciA0LjEuCi0uYy5vOgotCSQoQ0MpIC1jICQoSU5URVJOQUxfQ0ZMQUdTKSAkPAotLlNVRkZJWEVTOiAuY3BwCi0uYy5jcHA6Ci0JJChDQykgLUUgJChJTlRFUk5BTF9DRkxBR1MpICQ8ID4gJEAKLQotbGlidHVpLmE6ICQoT0JKRUNUUykKLQlybSAtZiBsaWJ0dWkuYQotCSQoQVIpIHJjIGxpYnR1aS5hICQoT0JKRUNUUykKLQkkKFJBTkxJQikgbGlidHVpLmEKLQotdHVpLm86IHR1aS5jIHR1aS5oIHR1aURhdGEuaCB0dWlMYXlvdXQuaCB0dWlJTy5oIHR1aVJlZ3MuaCB0dWlXaW4uaAotdHVpQ29tbWFuZC5vOiB0dWkuaCB0dWlEYXRhLmggdHVpV2luLmggdHVpSU8uaAotdHVpRGF0YS5vOiB0dWkuaCB0dWlEYXRhLmgKLXR1aURhdGFXaW4ubzogdHVpLmggdHVpRGF0YS5oIHR1aVJlZ3MuaAotdHVpRGlzYXNzZW0ubzogdHVpLmggdHVpRGF0YS5oIHR1aUxheW91dC5oIHR1aVNvdXJjZVdpbi5oIHR1aVN0YWNrLmgKLXR1aUdlbmVyYWxXaW4ubzogdHVpLmggdHVpRGF0YS5oIHR1aUdlbmVyYWxXaW4uaAotdHVpSU8ubzogdHVpLmggdHVpRGF0YS5oIHR1aUlPLmggdHVpQ29tbWFuZC5oIHR1aVdpbi5oCi10dWlMYXlvdXQubzogdHVpLmggdHVpRGF0YS5oIHR1aUdlbmVyYWxXaW4uaCB0dWlTdGFjay5oIHR1aVJlZ3MuaCBcCi0JdHVpRGlzYXNzZW0uaAotdHVpUmVncy5vOiB0dWkuaCB0dWlEYXRhLmggdHVpTGF5b3V0LmggdHVpV2luLmgKLXR1aVNvdXJjZS5vOiB0dWkuaCB0dWlEYXRhLmggdHVpU3RhY2suaCB0dWlTb3VyY2VXaW4uaCB0dWlTb3VyY2UuaAotdHVpU291cmNlV2luLm86IHR1aS5oIHR1aURhdGEuaCB0dWlTdGFjay5oIHR1aVNvdXJjZVdpbi5oIHR1aVNvdXJjZS5oIFwKLQl0dWlEaXNhc3NlbS5oCi10dWlTdGFjay5vOiB0dWkuaCB0dWlEYXRhLmggdHVpU3RhY2suaCB0dWlTb3VyY2VXaW4uaAotdHVpV2luLm86IHR1aS5oIHR1aURhdGEuaCB0dWlHZW5lcmFsV2luLmggdHVpU3RhY2suaCB0dWlTb3VyY2VXaW4uaCBcCi0JdHVpRGF0YVdpbi5oCi0KLXR1aUluaXQubzogdHVpSW5pdC5jCi10dWlJbml0LmM6ICQoU09VUkNFUykKLQlAZWNobyBNYWtpbmcgdHVpSW5pdC5jCi0JQHJtIC1mIGluaXQuYy10bXAKLQlAZWNobyAnLyogRG8gbm90IG1vZGlmeSB0aGlzIGZpbGUuICAqLycgPmluaXQuYy10bXAKLQlAZWNobyAnLyogSXQgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBNYWtlZmlsZS4JKi8nPj5pbml0LmMtdG1wCi0JQGVjaG8gJyNpbmNsdWRlICJhbnNpZGVjbC5oIicgPj5pbml0LmMtdG1wCi0JQGVjaG8gJ2V4dGVybiB2b2lkIGluaXRpYWxpemVfdHVpX2ZpbGVzIFBBUkFNUyAoKHZvaWQpKTsnID4+aW5pdC5jLXRtcAotCUBlY2hvICd2b2lkIGluaXRpYWxpemVfdHVpX2ZpbGVzIFBBUkFNUyAoKHZvaWQpKSB7JyA+PmluaXQuYy10bXAKLQlALSggY2QgJChzcmNkaXIpIDsgZ3JlcCAnXl9pbml0aWFsaXplX1thLXpfMC05QS1aXSogKignICQoU09VUkNFUykgKSAyPi9kZXYvbnVsbCBcCi0JfCBzZWQgLWUgJ3MvXi4qOi8vJyAtZSAncy9eXChbYS16XzAtOUEtWl0qXCkuKi8gIHtleHRlcm4gdm9pZCBcMSBQQVJBTVMgKCh2b2lkKSk7IFwxICgpO30vJyA+PmluaXQuYy10bXAKLQlAZWNobyAnfScgPj5pbml0LmMtdG1wCi0JQG12IGluaXQuYy10bXAgdHVpSW5pdC5jCi0KLWNsZWFuOgotCXJtIC1mICoubyAqLmEKZGlmZiAtLWdpdCBhL2dkYi93aW5kb3dzLW5hdC5jIGIvZ2RiL3dpbmRvd3MtbmF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMTk3OTcuLjAwMDAwMDAKLS0tIGEvZ2RiL3dpbmRvd3MtbmF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUwICswLDAgQEAKLS8qIFRhcmdldC12ZWN0b3Igb3BlcmF0aW9ucyBmb3IgY29udHJvbGxpbmcgd2luMzIgY2hpbGQgcHJvY2Vzc2VzLCBmb3IgR0RCLgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmUgbnRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0qLwotCi0vKiBieSBTdGV2ZSBDaGFtYmVybGFpbiwgc2FjQGN5Z251cy5jb20gKi8KLQotLyogV2UgYXNzdW1lIHdlJ3JlIGJlaW5nIGJ1aWx0IHdpdGggYW5kIHdpbGwgYmUgdXNlZCBmb3IgY3lnd2luLiAgKi8KLQotI2luY2x1ZGUgImRlZnMuaCIKLSNpbmNsdWRlICJmcmFtZS5oIgkJLyogcmVxdWlyZWQgYnkgaW5mZXJpb3IuaCAqLwotI2luY2x1ZGUgImluZmVyaW9yLmgiCi0jaW5jbHVkZSAidGFyZ2V0LmgiCi0jaW5jbHVkZSAid2FpdC5oIgotI2luY2x1ZGUgImdkYmNvcmUuaCIKLSNpbmNsdWRlICJjb21tYW5kLmgiCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2lmZGVmIF9NU0NfVkVSCi0jaW5jbHVkZSAid2luZGVmcy5oIgotI2Vsc2UgLyogb3RoZXIgV0lOMzIgY29tcGlsZXIgKi8KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImJ1aWxkc3ltLmgiCi0jaW5jbHVkZSAic3ltZmlsZS5oIgotI2luY2x1ZGUgIm9iamZpbGVzLmgiCi0jaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgotI2luY2x1ZGUgImdkYnRocmVhZC5oIgotI2luY2x1ZGUgImdkYmNtZC5oIgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0vKiBUaGUgdWkncyBldmVudCBsb29wLiAqLwotZXh0ZXJuIGludCAoKnVpX2xvb3BfaG9vaykgUEFSQU1TICgoaW50IHNpZ25vKSk7Ci0KLS8qIElmIHdlJ3JlIG5vdCB1c2luZyB0aGUgb2xkIEN5Z3dpbiBoZWFkZXIgZmlsZSBzZXQsIGRlZmluZSB0aGUKLSAgIGZvbGxvd2luZyB3aGljaCBuZXZlciBzaG91bGQgaGF2ZSBiZWVuIGluIHRoZSBnZW5lcmljIFdpbjMyIEFQSQotICAgaGVhZGVycyBpbiB0aGUgZmlyc3QgcGxhY2Ugc2luY2UgdGhleSB3ZXJlIG91ciBvd24gaW52ZW50aW9uLi4uICovCi0jaWZuZGVmIF9HTlVfSF9XSU5ET1dTX0gKLSNkZWZpbmUgRkxBR19UUkFDRV9CSVQgMHgxMDAKLSNkZWZpbmUgQ09OVEVYVF9ERUJVR0dFUiAoQ09OVEVYVF9GVUxMIHwgQ09OVEVYVF9GTE9BVElOR19QT0lOVCkKLSNlbmRpZgotCi0vKiBUaGUgc3RyaW5nIHNlbnQgYnkgY3lnd2luIHdoZW4gaXQgcHJvY2Vzc2VzIGEgc2lnbmFsLgotICAgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGluIGEgY3lnd2luIGluY2x1ZGUgZmlsZS4gKi8KLSNkZWZpbmUgQ1lHV0lOX1NJR05BTF9TVFJJTkcgImN5Z3dpbjogc2lnbmFsIgotCi0jZGVmaW5lIENIRUNLKHgpIAljaGVjayAoeCwgX19GSUxFX18sX19MSU5FX18pCi0jZGVmaW5lIERFQlVHX0VYRUMoeCkJaWYgKGRlYnVnX2V4ZWMpCQlwcmludGYgeAotI2RlZmluZSBERUJVR19FVkVOVFMoeCkJaWYgKGRlYnVnX2V2ZW50cykJcHJpbnRmIHgKLSNkZWZpbmUgREVCVUdfTUVNKHgpCWlmIChkZWJ1Z19tZW1vcnkpCXByaW50ZiB4Ci0jZGVmaW5lIERFQlVHX0VYQ0VQVCh4KQlpZiAoZGVidWdfZXhjZXB0aW9ucykJcHJpbnRmIHgKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotZXh0ZXJuIHN0cnVjdCB0YXJnZXRfb3BzIGNoaWxkX29wczsKLQotc3RhdGljIHZvaWQgY2hpbGRfc3RvcCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHdpbjMyX2NoaWxkX3RocmVhZF9hbGl2ZSBQQVJBTVMgKChpbnQpKTsKLXZvaWQgY2hpbGRfa2lsbF9pbmZlcmlvciBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBpbnQgbGFzdF9zaWcgPSAwOwkvKiBTZXQgaWYgYSBzaWduYWwgd2FzIHJlY2VpdmVkIGZyb20gdGhlCi0JCQkJICAgZGVidWdnZWQgcHJvY2VzcyAqLwotCi0vKiBUaHJlYWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIHVzZWQgdG8gdHJhY2sgaW5mb3JtYXRpb24gdGhhdCBpcwotICAgbm90IGF2YWlsYWJsZSBpbiBnZGIncyB0aHJlYWQgc3RydWN0dXJlLiAqLwotdHlwZWRlZiBzdHJ1Y3QgdGhyZWFkX2luZm9fc3RydWN0Ci17Ci0gIHN0cnVjdCB0aHJlYWRfaW5mb19zdHJ1Y3QgKm5leHQ7Ci0gIERXT1JEIGlkOwotICBIQU5ETEUgaDsKLSAgY2hhciAqbmFtZTsKLSAgaW50IHN1c3BlbmRfY291bnQ7Ci0gIENPTlRFWFQgY29udGV4dDsKLX0gdGhyZWFkX2luZm87Ci0KLXN0YXRpYyB0aHJlYWRfaW5mbyB0aHJlYWRfaGVhZCA9IHtOVUxMfTsKLQotLyogVGhlIHByb2Nlc3MgYW5kIHRocmVhZCBoYW5kbGVzIGZvciB0aGUgYWJvdmUgY29udGV4dC4gKi8KLQotc3RhdGljIERFQlVHX0VWRU5UIGN1cnJlbnRfZXZlbnQ7CS8qIFRoZSBjdXJyZW50IGRlYnVnIGV2ZW50IGZyb20KLQkJCQkJICAgV2FpdEZvckRlYnVnRXZlbnQgKi8KLXN0YXRpYyBIQU5ETEUgY3VycmVudF9wcm9jZXNzX2hhbmRsZTsJLyogQ3VycmVudGx5IGV4ZWN1dGluZyBwcm9jZXNzICovCi1zdGF0aWMgdGhyZWFkX2luZm8gKmN1cnJlbnRfdGhyZWFkOwkvKiBJbmZvIG9uIGN1cnJlbnRseSBzZWxlY3RlZCB0aHJlYWQgKi8KLXN0YXRpYyBEV09SRCBtYWluX3RocmVhZF9pZDsJCS8qIFRocmVhZCBJRCBvZiB0aGUgbWFpbiB0aHJlYWQgKi8KLQotLyogQ291bnRzIG9mIHRoaW5ncy4gKi8KLXN0YXRpYyBpbnQgZXhjZXB0aW9uX2NvdW50ID0gMDsKLXN0YXRpYyBpbnQgZXZlbnRfY291bnQgPSAwOwotCi0vKiBVc2VyIG9wdGlvbnMuICovCi1zdGF0aWMgaW50IG5ld19jb25zb2xlID0gMDsKLXN0YXRpYyBpbnQgbmV3X2dyb3VwID0gMDsKLXN0YXRpYyBpbnQgZGVidWdfZXhlYyA9IDA7CQkvKiBzaG93IGV4ZWN1dGlvbiAqLwotc3RhdGljIGludCBkZWJ1Z19ldmVudHMgPSAwOwkJLyogc2hvdyBldmVudHMgZnJvbSBrZXJuZWwgKi8KLXN0YXRpYyBpbnQgZGVidWdfbWVtb3J5ID0gMDsJCS8qIHNob3cgdGFyZ2V0IG1lbW9yeSBhY2Nlc3NlcyAqLwotc3RhdGljIGludCBkZWJ1Z19leGNlcHRpb25zID0gMDsJLyogc2hvdyB0YXJnZXQgZXhjZXB0aW9ucyAqLwotCi0vKiBUaGlzIHZlY3RvciBtYXBzIEdEQidzIGlkZWEgb2YgYSByZWdpc3RlcidzIG51bWJlciBpbnRvIGFuIGFkZHJlc3MKLSAgIGluIHRoZSB3aW4zMiBleGNlcHRpb24gY29udGV4dCB2ZWN0b3IuCi0KLSAgIEl0IGFsc28gY29udGFpbnMgdGhlIGJpdCBtYXNrIG5lZWRlZCB0byBsb2FkIHRoZSByZWdpc3RlciBpbiBxdWVzdGlvbi4KLQotICAgT25lIGRheSB3ZSBjb3VsZCByZWFkIGEgcmVnLCB3ZSBjb3VsZCBpbnNwZWN0IHRoZSBjb250ZXh0IHdlCi0gICBhbHJlYWR5IGhhdmUgbG9hZGVkLCBpZiBpdCBkb2Vzbid0IGhhdmUgdGhlIGJpdCBzZXQgdGhhdCB3ZSBuZWVkLAotICAgd2UgcmVhZCB0aGF0IHNldCBvZiByZWdpc3RlcnMgaW4gdXNpbmcgR2V0VGhyZWFkQ29udGV4dC4gIElmIHRoZQotICAgY29udGV4dCBhbHJlYWR5IGNvbnRhaW5zIHdoYXQgd2UgbmVlZCwgd2UganVzdCB1bnBhY2sgaXQuIFRoZW4gdG8KLSAgIHdyaXRlIGEgcmVnaXN0ZXIsIGZpcnN0IHdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbnRleHQgY29udGFpbnMKLSAgIHRoZSBvdGhlciByZWdzIG9mIHRoZSBncm91cCwgYW5kIHRoZW4gd2UgY29weSB0aGUgaW5mbyBpbiBhbmQgc2V0Ci0gICBvdXQgYml0LiAqLwotCi0jZGVmaW5lIGNvbnRleHRfb2Zmc2V0KHgpICgoaW50KSYoKChDT05URVhUICopTlVMTCktPngpKQotc3RhdGljIGNvbnN0IGludCBtYXBwaW5nc1tdID0KLXsKLSAgY29udGV4dF9vZmZzZXQoRWF4KSwKLSAgY29udGV4dF9vZmZzZXQoRWN4KSwKLSAgY29udGV4dF9vZmZzZXQoRWR4KSwKLSAgY29udGV4dF9vZmZzZXQoRWJ4KSwKLSAgY29udGV4dF9vZmZzZXQoRXNwKSwKLSAgY29udGV4dF9vZmZzZXQoRWJwKSwKLSAgY29udGV4dF9vZmZzZXQoRXNpKSwKLSAgY29udGV4dF9vZmZzZXQoRWRpKSwKLSAgY29udGV4dF9vZmZzZXQoRWlwKSwKLSAgY29udGV4dF9vZmZzZXQoRUZsYWdzKSwKLSAgY29udGV4dF9vZmZzZXQoU2VnQ3MpLAotICBjb250ZXh0X29mZnNldChTZWdTcyksCi0gIGNvbnRleHRfb2Zmc2V0KFNlZ0RzKSwKLSAgY29udGV4dF9vZmZzZXQoU2VnRXMpLAotICBjb250ZXh0X29mZnNldChTZWdGcyksCi0gIGNvbnRleHRfb2Zmc2V0KFNlZ0dzKSwKLSAgY29udGV4dF9vZmZzZXQoRmxvYXRTYXZlLlJlZ2lzdGVyQXJlYVswICogMTBdKSwKLSAgY29udGV4dF9vZmZzZXQoRmxvYXRTYXZlLlJlZ2lzdGVyQXJlYVsxICogMTBdKSwKLSAgY29udGV4dF9vZmZzZXQoRmxvYXRTYXZlLlJlZ2lzdGVyQXJlYVsyICogMTBdKSwKLSAgY29udGV4dF9vZmZzZXQoRmxvYXRTYXZlLlJlZ2lzdGVyQXJlYVszICogMTBdKSwKLSAgY29udGV4dF9vZmZzZXQoRmxvYXRTYXZlLlJlZ2lzdGVyQXJlYVs0ICogMTBdKSwKLSAgY29udGV4dF9vZmZzZXQoRmxvYXRTYXZlLlJlZ2lzdGVyQXJlYVs1ICogMTBdKSwKLSAgY29udGV4dF9vZmZzZXQoRmxvYXRTYXZlLlJlZ2lzdGVyQXJlYVs2ICogMTBdKSwKLSAgY29udGV4dF9vZmZzZXQoRmxvYXRTYXZlLlJlZ2lzdGVyQXJlYVs3ICogMTBdKSwKLX07Ci0KLS8qIFRoaXMgdmVjdG9yIG1hcHMgdGhlIHRhcmdldCdzIGlkZWEgb2YgYW4gZXhjZXB0aW9uIChleHRyYWN0ZWQKLSAgIGZyb20gdGhlIERFQlVHX0VWRU5UIHN0cnVjdHVyZSkgdG8gR0RCJ3MgaWRlYS4gKi8KLQotc3RydWN0IHhsYXRlX2V4Y2VwdGlvbgotICB7Ci0gICAgaW50IHRoZW07Ci0gICAgZW51bSB0YXJnZXRfc2lnbmFsIHVzOwotICB9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHhsYXRlX2V4Y2VwdGlvbgotICB4bGF0ZVtdID0KLXsKLSAge0VYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OLCBUQVJHRVRfU0lHTkFMX1NFR1Z9LAotICB7U1RBVFVTX1NUQUNLX09WRVJGTE9XLCBUQVJHRVRfU0lHTkFMX1NFR1Z9LAotICB7RVhDRVBUSU9OX0JSRUFLUE9JTlQsIFRBUkdFVF9TSUdOQUxfVFJBUH0sCi0gIHtEQkdfQ09OVFJPTF9DLCBUQVJHRVRfU0lHTkFMX0lOVH0sCi0gIHtFWENFUFRJT05fU0lOR0xFX1NURVAsIFRBUkdFVF9TSUdOQUxfVFJBUH0sCi0gIHstMSwgLTF9fTsKLQotLyogRmluZCBhIHRocmVhZCByZWNvcmQgZ2l2ZW4gYSB0aHJlYWQgaWQuCi0gICBJZiBnZXRfY29udGV4dCB0aGVuIGFsc28gcmV0cmlldmUgdGhlIGNvbnRleHQgZm9yIHRoaXMKLSAgIHRocmVhZC4gKi8KLXN0YXRpYyB0aHJlYWRfaW5mbyAqCi10aHJlYWRfcmVjIChEV09SRCBpZCwgaW50IGdldF9jb250ZXh0KQotewotICB0aHJlYWRfaW5mbyAqdGg7Ci0KLSAgZm9yICh0aCA9ICZ0aHJlYWRfaGVhZDsgKHRoID0gdGgtPm5leHQpICE9IE5VTEw7ICkKLSAgICBpZiAodGgtPmlkID09IGlkKQotICAgICAgewotCWlmICghdGgtPnN1c3BlbmRfY291bnQgJiYgZ2V0X2NvbnRleHQpCi0JICB7Ci0JICAgIGlmIChnZXRfY29udGV4dCA+IDApCi0JICAgICAgdGgtPnN1c3BlbmRfY291bnQgPSBTdXNwZW5kVGhyZWFkICh0aC0+aCkgKyAxOwotCSAgICBlbHNlIGlmIChnZXRfY29udGV4dCA8IDApCi0JICAgICAgdGgtPnN1c3BlbmRfY291bnQgPSAtMTsKLQotCSAgICB0aC0+Y29udGV4dC5Db250ZXh0RmxhZ3MgPSBDT05URVhUX0RFQlVHR0VSOwotCSAgICBHZXRUaHJlYWRDb250ZXh0ICh0aC0+aCwgJnRoLT5jb250ZXh0KTsKLQkgIH0KLQlyZXR1cm4gdGg7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEFkZCBhIHRocmVhZCB0byB0aGUgdGhyZWFkIGxpc3QgKi8KLXN0YXRpYyB0aHJlYWRfaW5mbyAqCi1jaGlsZF9hZGRfdGhyZWFkKERXT1JEIGlkLCBIQU5ETEUgaCkKLXsKLSAgdGhyZWFkX2luZm8gKnRoOwotCi0gIGlmICgodGggPSB0aHJlYWRfcmVjIChpZCwgRkFMU0UpKSkKLSAgICByZXR1cm4gdGg7Ci0KLSAgdGggPSAodGhyZWFkX2luZm8gKikgeG1hbGxvYyAoc2l6ZW9mICgqdGgpKTsKLSAgbWVtc2V0KHRoLCAwLCBzaXplb2YgKCp0aCkpOwotICB0aC0+aWQgPSBpZDsKLSAgdGgtPmggPSBoOwotICB0aC0+bmV4dCA9IHRocmVhZF9oZWFkLm5leHQ7Ci0gIHRocmVhZF9oZWFkLm5leHQgPSB0aDsKLSAgYWRkX3RocmVhZCAoaWQpOwotICByZXR1cm4gdGg7Ci19Ci0KLS8qIENsZWFyIG91dCBhbnkgb2xkIHRocmVhZCBsaXN0IGFuZCByZWludGlhbGl6ZSBpdCB0byBhCi0gICBwcmlzdGluZSBzdGF0ZS4gKi8KLXN0YXRpYyB2b2lkCi1jaGlsZF9pbml0X3RocmVhZF9saXN0ICgpCi17Ci0gIHRocmVhZF9pbmZvICp0aCA9ICZ0aHJlYWRfaGVhZDsKLQotICBERUJVR19FVkVOVFMgKCgiZ2RiOiBjaGlsZF9pbml0X3RocmVhZF9saXN0XG4iKSk7Ci0gIGluaXRfdGhyZWFkX2xpc3QgKCk7Ci0gIHdoaWxlICh0aC0+bmV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHRocmVhZF9pbmZvICpoZXJlID0gdGgtPm5leHQ7Ci0gICAgICB0aC0+bmV4dCA9IGhlcmUtPm5leHQ7Ci0gICAgICAodm9pZCkgQ2xvc2VIYW5kbGUgKGhlcmUtPmgpOwotICAgICAgZnJlZSAoaGVyZSk7Ci0gICAgfQotfQotCi0vKiBEZWxldGUgYSB0aHJlYWQgZnJvbSB0aGUgbGlzdCBvZiB0aHJlYWRzICovCi1zdGF0aWMgdm9pZAotY2hpbGRfZGVsZXRlX3RocmVhZCAoRFdPUkQgaWQpCi17Ci0gIHRocmVhZF9pbmZvICp0aDsKLQotICBpZiAoaW5mb192ZXJib3NlKQotICAgIHByaW50Zl91bmZpbHRlcmVkICgiW0RlbGV0aW5nICVzXVxuIiwgdGFyZ2V0X3BpZF90b19zdHIgKGlkKSk7Ci0gIGRlbGV0ZV90aHJlYWQgKGlkKTsKLQotICBmb3IgKHRoID0gJnRocmVhZF9oZWFkOwotICAgICAgIHRoLT5uZXh0ICE9IE5VTEwgJiYgdGgtPm5leHQtPmlkICE9IGlkOwotICAgICAgIHRoID0gdGgtPm5leHQpCi0gICAgY29udGludWU7Ci0KLSAgaWYgKHRoLT5uZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgdGhyZWFkX2luZm8gKmhlcmUgPSB0aC0+bmV4dDsKLSAgICAgIHRoLT5uZXh0ID0gaGVyZS0+bmV4dDsKLSAgICAgIENsb3NlSGFuZGxlIChoZXJlLT5oKTsKLSAgICAgIGZyZWUgKGhlcmUpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWNoZWNrIChCT09MIG9rLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgaWYgKCFvaykKLSAgICBwcmludGZfZmlsdGVyZWQgKCJlcnJvciByZXR1cm4gJXM6JWQgd2FzICVkXG4iLCBmaWxlLCBsaW5lLCBHZXRMYXN0RXJyb3IgKCkpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fY2hpbGRfZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChpbnQgcikKLXsKLSAgaWYgKHIgPj0gMCkKLSAgICBzdXBwbHlfcmVnaXN0ZXIgKHIsICgoY2hhciAqKSAmY3VycmVudF90aHJlYWQtPmNvbnRleHQpICsgbWFwcGluZ3Nbcl0pOwotICBlbHNlCi0gICAgewotICAgICAgZm9yIChyID0gMDsgciA8IE5VTV9SRUdTOyByKyspCi0JZG9fY2hpbGRfZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChyKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGlsZF9mZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKGludCByKQotewotICBjdXJyZW50X3RocmVhZCA9IHRocmVhZF9yZWMgKGluZmVyaW9yX3BpZCwgVFJVRSk7Ci0gIGRvX2NoaWxkX2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAocik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19jaGlsZF9zdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKGludCByKQotewotICBpZiAociA+PSAwKQotICAgIHJlYWRfcmVnaXN0ZXJfZ2VuIChyLCAoKGNoYXIgKikgJmN1cnJlbnRfdGhyZWFkLT5jb250ZXh0KSArIG1hcHBpbmdzW3JdKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAociA9IDA7IHIgPCBOVU1fUkVHUzsgcisrKQotCWRvX2NoaWxkX3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAocik7Ci0gICAgfQotfQotCi0vKiBTdG9yZSBhIG5ldyByZWdpc3RlciB2YWx1ZSBpbnRvIHRoZSBjdXJyZW50IHRocmVhZCBjb250ZXh0ICovCi1zdGF0aWMgdm9pZAotY2hpbGRfc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChpbnQgcikKLXsKLSAgY3VycmVudF90aHJlYWQgPSB0aHJlYWRfcmVjIChpbmZlcmlvcl9waWQsIFRSVUUpOwotICBkb19jaGlsZF9zdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKHIpOwotfQotCi0vKiBXYWl0IGZvciBjaGlsZCB0byBkbyBzb21ldGhpbmcuICBSZXR1cm4gcGlkIG9mIGNoaWxkLCBvciAtMSBpbiBjYXNlCi0gICBvZiBlcnJvcjsgc3RvcmUgc3RhdHVzIHRocm91Z2ggYXJndW1lbnQgcG9pbnRlciBPVVJTVEFUVVMuICAqLwotCi1zdGF0aWMgaW50Ci1oYW5kbGVfbG9hZF9kbGwgKFBUUiBkdW1teSkKLXsKLSAgTE9BRF9ETExfREVCVUdfSU5GTyAqIGV2ZW50ID0gJmN1cnJlbnRfZXZlbnQudS5Mb2FkRGxsOwotICBEV09SRCBkbGxfbmFtZV9wdHI7Ci0gIERXT1JEIGRvbmU7Ci0gIGNoYXIgZGxsX2J1ZltNQVhfUEFUSCArIDFdOwotICBjaGFyICpwLCAqZGxsX25hbWUgPSBOVUxMLCAqZGxsX2Jhc2VuYW1lOwotICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKLSAgTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIG1pbmZvOwotCi0gIGRsbF9idWZbMF0gPSBkbGxfYnVmW3NpemVvZihkbGxfYnVmKSAtIDFdID0gJ1wwJzsKLQotICAvKiBUaGUgZm9sbG93aW5nIGNvZGUgYXR0ZW1wdHMgdG8gZmluZCB0aGUgbmFtZSBvZiB0aGUgZGxsIGJ5IHJlYWRpbmcgdGhlCi0gICAgIG5hbWUgZnJvbSB0aGUgcHJvY2Vzc2VzIG1lbW9yeS4gIFVuZm9ydHVuYXRlbHkgaXQgZG9lc24ndCB3b3JrIHJpZ2h0LgotICAgICBEb2luZyB0aGlzIHRoZSAicmlnaHQgd2F5IiBmb3IgV2luZG93cyBpcyB2ZXJ5IGRpZmZpY3VsdC4gIEZJWE1FICovCi0jaWZkZWYgRE9FU05UX1dPUksKLSAgbWVtc2V0ICgmbWluZm8sIDAsIHNpemVvZiBtaW5mbyk7Ci0gIGlmIChWaXJ0dWFsUXVlcnlFeCAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwgKExQQ1ZPSUQpIGV2ZW50LT5scEJhc2VPZkRsbCwKLQkJICAgICAgJm1pbmZvLCBzaXplb2YobWluZm8pKSAmJiBtaW5mby5CYXNlQWRkcmVzcykgewotICAgICAgRFdPUkQgbGVuOwotICAgICAgSU1BR0VfRE9TX0hFQURFUiAqaG1tMCA9IChJTUFHRV9ET1NfSEVBREVSICopIG1pbmZvLkJhc2VBZGRyZXNzOwotICAgICAgSE1PRFVMRSBobW0gPSAoSE1PRFVMRSkgKCgoRFdPUkQpIGhtbTApICsgaG1tMC0+ZV9sZmFuZXcpOwotCi0gICAgICBpZiAoKGxlbiA9IEdldE1vZHVsZUZpbGVOYW1lIChobW0sIGRsbF9idWYsIE1BWF9QQVRIKSkpCi0JewotCSAgZGxsX25hbWUgPSBkbGxfYnVmOwotCSAgZGxsX25hbWVbbGVuXSA9ICdcMCc7Ci0JfQotICB9Ci0jZW5kaWYKLQotICAvKiBBdHRlbXB0IHRvIHJlYWQgdGhlIG5hbWUgb2YgdGhlIGRsbCB0aGF0IHdhcyBkZXRlY3RlZC4KLSAgICAgVGhpcyBpcyBkb2N1bWVudGVkIHRvIHdvcmsgb25seSB3aGVuIGFjdGl2ZWx5IGRlYnVnZ2luZwotICAgICBhIHByb2dyYW0uICBJdCB3aWxsIG5vdCB3b3JrIGZvciBhdHRhY2hlZCBwcm9jZXNzZXMuICovCi0gIGlmIChkbGxfbmFtZSA9PSBOVUxMIHx8ICpkbGxfbmFtZSA9PSAnXDAnKQotICAgIHsKLSAgICAgIGludCBzaXplID0gZXZlbnQtPmZVbmljb2RlID8gc2l6ZW9mIChXQ0hBUikgOiBzaXplb2YgKGNoYXIpOwotICAgICAgaW50IGxlbiA9IDA7Ci0gICAgICBjaGFyIGJbMl07Ci0KLSAgICAgIFJlYWRQcm9jZXNzTWVtb3J5IChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLAotCQkJIChMUENWT0lEKSBldmVudC0+bHBJbWFnZU5hbWUsCi0JCQkgKGNoYXIgKikgJmRsbF9uYW1lX3B0ciwKLQkJCSBzaXplb2YgKGRsbF9uYW1lX3B0ciksICZkb25lKTsKLQotICAgICAgLyogU2VlIGlmIHdlIGNvdWxkIHJlYWQgdGhlIGFkZHJlc3Mgb2YgYSBzdHJpbmcsIGFuZCB0aGF0IHRoZQotCSBhZGRyZXNzIGlzbid0IG51bGwuICovCi0KLSAgICAgIGlmIChkb25lICE9IHNpemVvZiAoZGxsX25hbWVfcHRyKSB8fCAhZGxsX25hbWVfcHRyKQotCXJldHVybiAxOwotCi0gICAgICBkbwotCXsKLQkgIFJlYWRQcm9jZXNzTWVtb3J5IChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLAotCQkJICAgICAoTFBDVk9JRCkgKGRsbF9uYW1lX3B0ciArIGxlbiAqIHNpemUpLAotCQkJICAgICAmYiwKLQkJCSAgICAgc2l6ZSwKLQkJCSAgICAgJmRvbmUpOwotCSAgbGVuKys7Ci0JfQotICAgICAgd2hpbGUgKChiWzBdICE9IDAgfHwgYltzaXplIC0gMV0gIT0gMCkgJiYgZG9uZSA9PSBzaXplKTsKLQotICAgICAgZGxsX25hbWUgPSBhbGxvY2EgKGxlbik7Ci0KLSAgICAgIGlmIChldmVudC0+ZlVuaWNvZGUpCi0JewotCSAgV0NIQVIgKnVuaWNvZGVfZGxsX25hbWUgPSAoV0NIQVIgKikgYWxsb2NhIChsZW4gKiBzaXplb2YgKFdDSEFSKSk7Ci0JICBSZWFkUHJvY2Vzc01lbW9yeSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwKLQkJCSAgICAgKExQQ1ZPSUQpIGRsbF9uYW1lX3B0ciwKLQkJCSAgICAgdW5pY29kZV9kbGxfbmFtZSwKLQkJCSAgICAgbGVuICogc2l6ZW9mIChXQ0hBUiksCi0JCQkgICAgICZkb25lKTsKLQotCSAgV2lkZUNoYXJUb011bHRpQnl0ZSAoQ1BfQUNQLCAwLAotCQkJICAgICAgIHVuaWNvZGVfZGxsX25hbWUsIGxlbiwKLQkJCSAgICAgICBkbGxfbmFtZSwgbGVuLCAwLCAwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgUmVhZFByb2Nlc3NNZW1vcnkgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsCi0JCQkgICAgIChMUENWT0lEKSBkbGxfbmFtZV9wdHIsCi0JCQkgICAgIGRsbF9uYW1lLAotCQkJICAgICBsZW4sCi0JCQkgICAgICZkb25lKTsKLQl9Ci0gICAgfQotCi0gIGlmICghZGxsX25hbWUpCi0gICAgcmV0dXJuIDE7Ci0KLSAgd2hpbGUgKChwID0gc3RyY2hyIChkbGxfbmFtZSwgJ1xcJykpKQotICAgICpwID0gJy8nOwotCi0gIC8qIEZJWE1FISEgSXQgd291bGQgYmUgbmljZSB0byBkZWZpbmUgb25lIHN5bWJvbCB3aGljaCBwb2ludGVkIHRvIHRoZQotICAgICBmcm9udCBvZiB0aGUgZGxsIGlmIHdlIGNhbid0IGZpbmQgYW55IHN5bWJvbHMuICovCi0KLSAgaWYgKCEoZGxsX2Jhc2VuYW1lID0gc3RycmNocihkbGxfbmFtZSwgJy8nKSkpCi0gICAgZGxsX2Jhc2VuYW1lID0gZGxsX25hbWU7Ci0gIGVsc2UKLSAgICBkbGxfYmFzZW5hbWUrKzsKLQotICBBTExfT0JKRklMRVMob2JqZmlsZSkKLSAgICB7Ci0gICAgICBjaGFyICpvYmpmaWxlX2Jhc2VuYW1lOwotICAgICAgb2JqZmlsZV9iYXNlbmFtZSA9IHN0cnJjaHIob2JqZmlsZS0+bmFtZSwgJy8nKTsKLQotICAgICAgaWYgKG9iamZpbGVfYmFzZW5hbWUgJiYKLQkgIHN0cmNtcChkbGxfYmFzZW5hbWUsIG9iamZpbGVfYmFzZW5hbWUgKyAxKSA9PSAwKQotCXsKLQkgIHByaW50Zl91bmZpbHRlcmVkICgiJXg6JXMgKHN5bWJvbHMgcHJldmlvdXNseSBsb2FkZWQpXG4iLAotCQkJICAgICBldmVudC0+bHBCYXNlT2ZEbGwsIGRsbF9uYW1lKTsKLQkgIGdvdG8gb3V0OwotCX0KLSAgfQotCi0gIC8qIFRoZSBzeW1ib2xzIGluIGEgZGxsIGFyZSBvZmZzZXQgYnkgMHgxMDAwLCB3aGljaCBpcyB0aGUKLSAgICAgdGhlIG9mZnNldCBmcm9tIDAgb2YgdGhlIGZpcnN0IGJ5dGUgaW4gYW4gaW1hZ2UgLSBiZWNhdXNlCi0gICAgIG9mIHRoZSBmaWxlIGhlYWRlciBhbmQgdGhlIHNlY3Rpb24gYWxpZ25tZW50LgotCi0gICAgIEZJWE1FOiBJcyB0aGlzIHRoZSByZWFsIHJlYXNvbiB0aGF0IHdlIG5lZWQgdGhlIDB4MTAwMCA/ICovCi0KLSAgcHJpbnRmX3VuZmlsdGVyZWQgKCIleDolcyIsIGV2ZW50LT5scEJhc2VPZkRsbCwgZGxsX25hbWUpOwotICBzeW1ib2xfZmlsZV9hZGQgKGRsbF9uYW1lLCAwLCAoaW50KSBldmVudC0+bHBCYXNlT2ZEbGwgKyAweDEwMDAsIDAsIDAsIDAsIDAsIDEpOwotICBwcmludGZfdW5maWx0ZXJlZCAoIlxuIik7Ci0KLW91dDoKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIEhhbmRsZSBERUJVR19TVFJJTkcgb3V0cHV0IGZyb20gY2hpbGQgcHJvY2Vzcy4KLSAgIEN5Z3dpbiBwcmVwZW5kcyBpdHMgbWVzc2FnZXMgd2l0aCBhICJjeWd3aW46Ii4gIEludGVycHJldCB0aGlzIGFzCi0gICBhIEN5Z3dpbiBzaWduYWwuICBPdGhlcndpc2UganVzdCBwcmludCB0aGUgc3RyaW5nIGFzIGEgd2FybmluZy4gKi8KLXN0YXRpYyBpbnQKLWhhbmRsZV9vdXRwdXRfZGVidWdfc3RyaW5nIChzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKm91cnN0YXR1cykKLXsKLSAgY2hhciAqczsKLSAgaW50IGdvdGFzaWcgPSBGQUxTRTsKLQotICBpZiAoIXRhcmdldF9yZWFkX3N0cmluZwotICAgICAgKChDT1JFX0FERFIpIGN1cnJlbnRfZXZlbnQudS5EZWJ1Z1N0cmluZy5scERlYnVnU3RyaW5nRGF0YSwgJnMsIDEwMjQsIDApCi0gICAgICB8fCAhcyB8fCAhKnMpCi0gICAgcmV0dXJuIGdvdGFzaWc7Ci0KLSAgaWYgKHN0cm5jbXAocywgQ1lHV0lOX1NJR05BTF9TVFJJTkcsIHNpemVvZihDWUdXSU5fU0lHTkFMX1NUUklORykgLSAxKSkKLSAgICB7Ci0gICAgICB3YXJuaW5nIChzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpwOwotICAgICAgLypsYXN0X3NpZyA9ICovc3RydG9sKHMgKyBzaXplb2YoQ1lHV0lOX1NJR05BTF9TVFJJTkcpIC0gMSwgJnAsIDApOwotICAgICAgZ290YXNpZyA9IHRhcmdldF9zaWduYWxfZnJvbV9ob3N0IChsYXN0X3NpZyk7Ci0gICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IGdvdGFzaWc7Ci0gICAgICBpZiAoZ290YXNpZykKLQlvdXJzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKLSAgICB9Ci0KLSAgZnJlZSAocyk7Ci0gIHJldHVybiBnb3Rhc2lnOwotfQotCi1zdGF0aWMgaW50Ci1oYW5kbGVfZXhjZXB0aW9uIChzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKm91cnN0YXR1cykKLXsKLSAgaW50IGk7Ci0gIGludCBkb25lID0gMDsKLSAgdGhyZWFkX2luZm8gKnRoOwotCi0gIG91cnN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOwotCi0gIC8qIFJlY29yZCB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudCB0aHJlYWQgKi8KLSAgdGggPSB0aHJlYWRfcmVjIChjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsIC0xKTsKLQotICBzd2l0Y2ggKGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkNvZGUpCi0gICAgewotICAgIGNhc2UgRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT046Ci0gICAgICBERUJVR19FWENFUFQgKCgiZ2RiOiBUYXJnZXQgZXhjZXB0aW9uIEFDQ0VTU19WSU9MQVRJT04gYXQgMHglMDh4XG4iLAotCQkgICAgIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKLSAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9TRUdWOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVEFUVVNfU1RBQ0tfT1ZFUkZMT1c6Ci0gICAgICBERUJVR19FWENFUFQgKCgiZ2RiOiBUYXJnZXQgZXhjZXB0aW9uIFNUQUNLX09WRVJGTE9XIGF0IDB4JTA4eFxuIiwKLQkJICAgICBjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25BZGRyZXNzKSk7Ci0gICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfU0VHVjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRVhDRVBUSU9OX0JSRUFLUE9JTlQ6Ci0gICAgICBERUJVR19FWENFUFQgKCgiZ2RiOiBUYXJnZXQgZXhjZXB0aW9uIEJSRUFLUE9JTlQgYXQgMHglMDh4XG4iLAotCQkgICAgIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKLSAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEQkdfQ09OVFJPTF9DOgotICAgICAgREVCVUdfRVhDRVBUICgoImdkYjogVGFyZ2V0IGV4Y2VwdGlvbiBDT05UUk9MX0MgYXQgMHglMDh4XG4iLAotCQkgICAgIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKLSAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9JTlQ7Ci0gICAgICAvKiBVc2VyIHR5cGVkIENUUkwtQy4gIENvbnRpbnVlIHdpdGggdGhpcyBzdGF0dXMgKi8KLSAgICAgIGxhc3Rfc2lnID0gU0lHSU5UOwkvKiBGSVhNRSAtIHNob3VsZCBjaGVjayBwYXNzIHN0YXRlICovCi0gICAgICBicmVhazsKLSAgICBjYXNlIEVYQ0VQVElPTl9TSU5HTEVfU1RFUDoKLSAgICAgIERFQlVHX0VYQ0VQVCAoKCJnZGI6IFRhcmdldCBleGNlcHRpb24gU0lOR0xFX1NURVAgYXQgMHglMDh4XG4iLAotCQkgICAgIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKLSAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFRoaXMgbWF5IGJlIGEgc3RydWN0dXJlZCBleGNlcHRpb24gaGFuZGxpbmcgZXhjZXB0aW9uLiAgSW4KLQkgdGhhdCBjYXNlLCB3ZSB3YW50IHRvIGxldCB0aGUgcHJvZ3JhbSB0cnkgdG8gaGFuZGxlIGl0LCBhbmQKLQkgb25seSBicmVhayBpZiB3ZSBzZWUgdGhlIGV4Y2VwdGlvbiBhIHNlY29uZCB0aW1lLiAgKi8KLSAgICAgIGlmIChjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLmR3Rmlyc3RDaGFuY2UpCi0JcmV0dXJuIDA7Ci0KLSAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiZ2RiOiB1bmtub3duIHRhcmdldCBleGNlcHRpb24gMHglMDh4IGF0IDB4JTA4eFxuIiwKLQkJCSBjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25Db2RlLAotCQkJIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpOwotICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1VOS05PV047Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGV4Y2VwdGlvbl9jb3VudCsrOwotICByZXR1cm4gMTsKLX0KLQotLyogUmVzdW1lIGFsbCBhcnRpZmljaWFsbHkgc3VzcGVuZGVkIHRocmVhZHMgaWYgd2UgYXJlIGNvbnRpbnVpbmcKLSAgIGV4ZWN1dGlvbiAqLwotc3RhdGljIEJPT0wKLWNoaWxkX2NvbnRpbnVlIChEV09SRCBjb250aW51ZV9zdGF0dXMsIGludCBpZCkKLXsKLSAgaW50IGk7Ci0gIHRocmVhZF9pbmZvICp0aDsKLSAgQk9PTCByZXM7Ci0KLSAgREVCVUdfRVZFTlRTICgoIkNvbnRpbnVlRGVidWdFdmVudCAoY3BpZD0lZCwgY3RpZD0lZCwgREJHX0NPTlRJTlVFKTtcbiIsCi0JCSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLCBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQpKTsKLSAgcmVzID0gQ29udGludWVEZWJ1Z0V2ZW50IChjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLAotCQkJICAgIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJCSAgICBjb250aW51ZV9zdGF0dXMpOwotICBpZiAocmVzKQotICAgIGZvciAodGggPSAmdGhyZWFkX2hlYWQ7ICh0aCA9IHRoLT5uZXh0KSAhPSBOVUxMOyApCi0gICAgICBpZiAoKChpZCA9PSAtMSkgfHwgKGlkID09IHRoLT5pZCkpICYmIHRoLT5zdXNwZW5kX2NvdW50KQotCXsKLQkgIGZvciAoaSA9IDA7IGkgPCB0aC0+c3VzcGVuZF9jb3VudDsgaSsrKQotCSAgICAodm9pZCkgUmVzdW1lVGhyZWFkICh0aC0+aCk7Ci0JICB0aC0+c3VzcGVuZF9jb3VudCA9IDA7Ci0JfQotCi0gIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoaWxkX3dhaXQgKGludCBwaWQsIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqb3Vyc3RhdHVzKQotewotICAvKiBXZSBsb29wIHdoZW4gd2UgZ2V0IGEgbm9uLXN0YW5kYXJkIGV4Y2VwdGlvbiByYXRoZXIgdGhhbiByZXR1cm4KLSAgICAgd2l0aCBhIFNQVVJJT1VTIGJlY2F1c2UgcmVzdW1lIGNhbiB0cnkgYW5kIHN0ZXAgb3IgbW9kaWZ5IHRoaW5ncywKLSAgICAgd2hpY2ggbmVlZHMgYSBjdXJyZW50X3RocmVhZC0+aC4gIEJ1dCBzb21lIG9mIHRoZXNlIGV4Y2VwdGlvbnMgbWFyawotICAgICB0aGUgYmlydGggb3IgZGVhdGggb2YgdGhyZWFkcywgd2hpY2ggbWVhbiB0aGF0IHRoZSBjdXJyZW50IHRocmVhZAotICAgICBpc24ndCBuZWNlc3NhcmlseSB3aGF0IHlvdSB0aGluayBpdCBpcy4gKi8KLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBEV09SRCBjb250aW51ZV9zdGF0dXM7Ci0gICAgICBCT09MIGRlYnVnX2V2ZW50ID0gV2FpdEZvckRlYnVnRXZlbnQgKCZjdXJyZW50X2V2ZW50LCAyMCk7Ci0gICAgICBjaGFyICpwOwotICAgICAgdGhyZWFkX2luZm8gKnRoOwotICAgICAgaW50IHNpZzsKLQotICAgICAgaWYgKGRlYnVnX2V2ZW50KQotCXsKLQkgIGV2ZW50X2NvdW50Kys7Ci0KLQkgIGNvbnRpbnVlX3N0YXR1cyA9IERCR19DT05USU5VRTsKLQotCSAgc3dpdGNoIChjdXJyZW50X2V2ZW50LmR3RGVidWdFdmVudENvZGUpCi0JICAgIHsKLQkgICAgY2FzZSBDUkVBVEVfVEhSRUFEX0RFQlVHX0VWRU5UOgotCSAgICAgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0leCBjb2RlPSVzKVxuIiwKLQkJCSAgICAgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAotCQkJICAgICAiQ1JFQVRFX1RIUkVBRF9ERUJVR19FVkVOVCIpKTsKLQkgICAgICAvKiBSZWNvcmQgdGhlIGV4aXN0ZW5jZSBvZiB0aGlzIHRocmVhZCAqLwotCSAgICAgIGNoaWxkX2FkZF90aHJlYWQgKGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJCQljdXJyZW50X2V2ZW50LnUuQ3JlYXRlVGhyZWFkLmhUaHJlYWQpOwotCSAgICAgIGlmIChpbmZvX3ZlcmJvc2UpCi0JCXByaW50Zl91bmZpbHRlcmVkICgiW05ldyAlc11cbiIsCi0JCQkJICAgdGFyZ2V0X3BpZF90b19zdHIgKGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCkpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRVhJVF9USFJFQURfREVCVUdfRVZFTlQ6Ci0JICAgICAgREVCVUdfRVZFTlRTICgoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSVkIGNvZGU9JXMpXG4iLAotCQkJICAgICBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLCBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsCi0JCQkgICAgICJFWElUX1RIUkVBRF9ERUJVR19FVkVOVCIpKTsKLQkgICAgICBjaGlsZF9kZWxldGVfdGhyZWFkIChjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ1JFQVRFX1BST0NFU1NfREVCVUdfRVZFTlQ6Ci0JICAgICAgREVCVUdfRVZFTlRTICgoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSVkIGNvZGU9JXMpXG4iLAotCQkJICAgICBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLCBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsCi0JCQkgICAgICJDUkVBVEVfUFJPQ0VTU19ERUJVR19FVkVOVCIpKTsKLQkgICAgICBjdXJyZW50X3Byb2Nlc3NfaGFuZGxlID0gY3VycmVudF9ldmVudC51LkNyZWF0ZVByb2Nlc3NJbmZvLmhQcm9jZXNzOwotCi0JICAgICAgbWFpbl90aHJlYWRfaWQgPSBpbmZlcmlvcl9waWQgPSBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQ7Ci0JICAgICAgLyogQWRkIHRoZSBtYWluIHRocmVhZCAqLwotCSAgICAgIGN1cnJlbnRfdGhyZWFkID0gY2hpbGRfYWRkX3RocmVhZCAoaW5mZXJpb3JfcGlkLAotCQkJCQkJIGN1cnJlbnRfZXZlbnQudS5DcmVhdGVQcm9jZXNzSW5mby5oVGhyZWFkKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEVYSVRfUFJPQ0VTU19ERUJVR19FVkVOVDoKLQkgICAgICBERUJVR19FVkVOVFMgKCgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWQgY29kZT0lcylcbiIsCi0JCQkgICAgIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJCSAgICAgIkVYSVRfUFJPQ0VTU19ERUJVR19FVkVOVCIpKTsKLQkgICAgICBvdXJzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVEOwotCSAgICAgIG91cnN0YXR1cy0+dmFsdWUuaW50ZWdlciA9IGN1cnJlbnRfZXZlbnQudS5FeGl0UHJvY2Vzcy5kd0V4aXRDb2RlOwotCSAgICAgIENsb3NlSGFuZGxlIChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlKTsKLQkgICAgICByZXR1cm4gY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIExPQURfRExMX0RFQlVHX0VWRU5UOgotCSAgICAgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKLQkJCSAgICAgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAotCQkJICAgICAiTE9BRF9ETExfREVCVUdfRVZFTlQiKSk7Ci0JICAgICAgY2F0Y2hfZXJyb3JzIChoYW5kbGVfbG9hZF9kbGwsIE5VTEwsICIiLCBSRVRVUk5fTUFTS19BTEwpOwotCSAgICAgIHJlZ2lzdGVyc19jaGFuZ2VkKCk7ICAgICAgICAgIC8qIG1hcmsgYWxsIHJlZ3MgaW52YWxpZCAqLwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgVU5MT0FEX0RMTF9ERUJVR19FVkVOVDoKLQkgICAgICBERUJVR19FVkVOVFMgKCgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWQgY29kZT0lcylcbiIsCi0JCQkgICAgIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJCSAgICAgIlVOTE9BRF9ETExfREVCVUdfRVZFTlQiKSk7Ci0JICAgICAgYnJlYWs7CS8qIEZJWE1FOiBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZSAqLwotCi0JICAgIGNhc2UgRVhDRVBUSU9OX0RFQlVHX0VWRU5UOgotCSAgICAgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKLQkJCSAgICAgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAotCQkJICAgICAiRVhDRVBUSU9OX0RFQlVHX0VWRU5UIikpOwotCSAgICAgIGlmIChoYW5kbGVfZXhjZXB0aW9uIChvdXJzdGF0dXMpKQotCQlyZXR1cm4gY3VycmVudF9ldmVudC5kd1RocmVhZElkOwotCSAgICAgIGNvbnRpbnVlX3N0YXR1cyA9IERCR19FWENFUFRJT05fTk9UX0hBTkRMRUQ7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBPVVRQVVRfREVCVUdfU1RSSU5HX0VWRU5UOiAvKiBtZXNzYWdlIGZyb20gdGhlIGtlcm5lbCAqLwotCSAgICAgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKLQkJCSAgICAgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAotCQkJICAgICAiT1VUUFVUX0RFQlVHX1NUUklOR19FVkVOVCIpKTsKLQkgICAgICBpZiAoaGFuZGxlX291dHB1dF9kZWJ1Z19zdHJpbmcgKG91cnN0YXR1cykpCi0JCXJldHVybiBtYWluX3RocmVhZF9pZDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBwcmludGZfdW5maWx0ZXJlZCAoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSVkXG4iLAotCQkJCSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLAotCQkJCSBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQpOwotCSAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiICAgICAgICAgICAgICAgICB1bmtub3duIGV2ZW50IGNvZGUgJWRcbiIsCi0JCQkJIGN1cnJlbnRfZXZlbnQuZHdEZWJ1Z0V2ZW50Q29kZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgQ0hFQ0sgKGNoaWxkX2NvbnRpbnVlIChjb250aW51ZV9zdGF0dXMsIC0xKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludCBkZXRhY2ggPSAwOwotCi0JICBpZiAodWlfbG9vcF9ob29rICE9IE5VTEwpCi0JICAgIGRldGFjaCA9IHVpX2xvb3BfaG9vayAoMCk7Ci0KLQkgIGlmIChkZXRhY2gpCi0JICAgIGNoaWxkX2tpbGxfaW5mZXJpb3IgKCk7Ci0JfQotICAgIH0KLX0KLQotLyogQXR0YWNoIHRvIHByb2Nlc3MgUElELCB0aGVuIGluaXRpYWxpemUgZm9yIGRlYnVnZ2luZyBpdC4gICovCi0KLXN0YXRpYyB2b2lkCi1jaGlsZF9hdHRhY2ggKGFyZ3MsIGZyb21fdHR5KQotICAgICBjaGFyICphcmdzOwotICAgICBpbnQgZnJvbV90dHk7Ci17Ci0gIEJPT0wgb2s7Ci0KLSAgaWYgKCFhcmdzKQotICAgIGVycm9yX25vX2FyZyAoInByb2Nlc3MtaWQgdG8gYXR0YWNoIik7Ci0KLSAgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCA9IHN0cnRvdWwgKGFyZ3MsIDAsIDApOwotCi0gIG9rID0gRGVidWdBY3RpdmVQcm9jZXNzIChjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkKTsKLQotICBpZiAoIW9rKQotICAgIGVycm9yICgiQ2FuJ3QgYXR0YWNoIHRvIHByb2Nlc3MuIik7Ci0KLSAgZXhjZXB0aW9uX2NvdW50ID0gMDsKLSAgZXZlbnRfY291bnQgPSAwOwotCi0gIGlmIChmcm9tX3R0eSkKLSAgICB7Ci0gICAgICBjaGFyICpleGVjX2ZpbGUgPSAoY2hhciAqKSBnZXRfZXhlY19maWxlICgwKTsKLQotICAgICAgaWYgKGV4ZWNfZmlsZSkKLQlwcmludGZfdW5maWx0ZXJlZCAoIkF0dGFjaGluZyB0byBwcm9ncmFtIGAlcycsICVzXG4iLCBleGVjX2ZpbGUsCi0JCQkgICB0YXJnZXRfcGlkX3RvX3N0ciAoY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCkpOwotICAgICAgZWxzZQotCXByaW50Zl91bmZpbHRlcmVkICgiQXR0YWNoaW5nIHRvICVzXG4iLAotCQkJICAgdGFyZ2V0X3BpZF90b19zdHIgKGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQpKTsKLQotICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKLSAgICB9Ci0KLSAgcHVzaF90YXJnZXQgKCZjaGlsZF9vcHMpOwotfQotCi1zdGF0aWMgdm9pZAotY2hpbGRfZGV0YWNoIChhcmdzLCBmcm9tX3R0eSkKLSAgICAgY2hhciAqYXJnczsKLSAgICAgaW50IGZyb21fdHR5OwotewotICBpZiAoZnJvbV90dHkpCi0gICAgewotICAgICAgY2hhciAqZXhlY19maWxlID0gZ2V0X2V4ZWNfZmlsZSAoMCk7Ci0gICAgICBpZiAoZXhlY19maWxlID09IDApCi0JZXhlY19maWxlID0gIiI7Ci0gICAgICBwcmludGZfdW5maWx0ZXJlZCAoIkRldGFjaGluZyBmcm9tIHByb2dyYW06ICVzICVzXG4iLCBleGVjX2ZpbGUsCi0JCQkgdGFyZ2V0X3BpZF90b19zdHIgKGluZmVyaW9yX3BpZCkpOwotICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKLSAgICB9Ci0gIGluZmVyaW9yX3BpZCA9IDA7Ci0gIHVucHVzaF90YXJnZXQgKCZjaGlsZF9vcHMpOwotfQotCi0vKiBQcmludCBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCB3ZSdyZSBhY2Nlc3NpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotY2hpbGRfZmlsZXNfaW5mbyAoaWdub3JlKQotICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqaWdub3JlOwotewotICBwcmludGZfdW5maWx0ZXJlZCAoIlx0VXNpbmcgdGhlIHJ1bm5pbmcgaW1hZ2Ugb2YgJXMgJXMuXG4iLAotICAgICAgYXR0YWNoX2ZsYWcgPyAiYXR0YWNoZWQiIDogImNoaWxkIiwgdGFyZ2V0X3BpZF90b19zdHIgKGluZmVyaW9yX3BpZCkpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLWNoaWxkX29wZW4gKGFyZywgZnJvbV90dHkpCi0gICAgIGNoYXIgKmFyZzsKLSAgICAgaW50IGZyb21fdHR5OwotewotICBlcnJvciAoIlVzZSB0aGUgXCJydW5cIiBjb21tYW5kIHRvIHN0YXJ0IGEgVW5peCBjaGlsZCBwcm9jZXNzLiIpOwotfQotCi0vKiBTdGFydCBhbiBpbmZlcmlvciB3aW4zMiBjaGlsZCBwcm9jZXNzIGFuZCBzZXRzIGluZmVyaW9yX3BpZCB0byBpdHMgcGlkLgotICAgRVhFQ19GSUxFIGlzIHRoZSBmaWxlIHRvIHJ1bi4KLSAgIEFMTEFSR1MgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgYXJndW1lbnRzIHRvIHRoZSBwcm9ncmFtLgotICAgRU5WIGlzIHRoZSBlbnZpcm9ubWVudCB2ZWN0b3IgdG8gcGFzcy4gIEVycm9ycyByZXBvcnRlZCB3aXRoIGVycm9yKCkuICAqLwotCi1zdGF0aWMgdm9pZAotY2hpbGRfY3JlYXRlX2luZmVyaW9yIChleGVjX2ZpbGUsIGFsbGFyZ3MsIGVudikKLSAgICAgY2hhciAqZXhlY19maWxlOwotICAgICBjaGFyICphbGxhcmdzOwotICAgICBjaGFyICoqZW52OwotewotICBjaGFyIHJlYWxfcGF0aFtNQVhQQVRITEVOXTsKLSAgY2hhciAqd2luZW52OwotICBjaGFyICp0ZW1wOwotICBpbnQgIGVudmxlbjsKLSAgaW50IGk7Ci0KLSAgU1RBUlRVUElORk8gc2k7Ci0gIFBST0NFU1NfSU5GT1JNQVRJT04gcGk7Ci0gIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyBkdW1teTsKLSAgQk9PTCByZXQ7Ci0gIERXT1JEIGZsYWdzOwotICBjaGFyICphcmdzOwotCi0gIGlmICghZXhlY19maWxlKQotICAgIHsKLSAgICAgIGVycm9yICgiTm8gZXhlY3V0YWJsZSBzcGVjaWZpZWQsIHVzZSBgdGFyZ2V0IGV4ZWMnLlxuIik7Ci0gICAgfQotCi0gIG1lbXNldCAoJnNpLCAwLCBzaXplb2YgKHNpKSk7Ci0gIHNpLmNiID0gc2l6ZW9mIChzaSk7Ci0KLSAgY3lnd2luMzJfY29udl90b193aW4zMl9wYXRoIChleGVjX2ZpbGUsIHJlYWxfcGF0aCk7Ci0KLSAgZmxhZ3MgPSBERUJVR19PTkxZX1RISVNfUFJPQ0VTUzsKLQotICBpZiAobmV3X2dyb3VwKQotICAgIGZsYWdzIHw9IENSRUFURV9ORVdfUFJPQ0VTU19HUk9VUDsKLQotICBpZiAobmV3X2NvbnNvbGUpCi0gICAgZmxhZ3MgfD0gQ1JFQVRFX05FV19DT05TT0xFOwotCi0gIGFyZ3MgPSBhbGxvY2EgKHN0cmxlbiAocmVhbF9wYXRoKSArIHN0cmxlbiAoYWxsYXJncykgKyAyKTsKLQotICBzdHJjcHkgKGFyZ3MsIHJlYWxfcGF0aCk7Ci0KLSAgc3RyY2F0IChhcmdzLCAiICIpOwotICBzdHJjYXQgKGFyZ3MsIGFsbGFyZ3MpOwotCi0gIC8qIFByZXBhcmUgdGhlIGVudmlyb25tZW50IHZhcnMgZm9yIENyZWF0ZVByb2Nlc3MuICAqLwotICB7Ci0gICAgLyogVGhpcyBjb2RlIHVzZSB0byBhc3N1bWUgYWxsIGVudiB2YXJzIHdlcmUgZmlsZSBuYW1lcyBhbmQgd291bGQKLSAgICAgICB0cmFuc2xhdGUgdGhlbSBhbGwgdG8gd2luMzIgc3R5bGUuICBUaGF0IG9idmlvdXNseSBkb2Vzbid0IHdvcmsgaW4gdGhlCi0gICAgICAgZ2VuZXJhbCBjYXNlLiAgVGhlIGN1cnJlbnQgcnVsZSBpcyB0aGF0IHdlIG9ubHkgdHJhbnNsYXRlIFBBVEguCi0gICAgICAgV2UgbmVlZCB0byBoYW5kbGUgUEFUSCBiZWNhdXNlIHdlJ3JlIGFib3V0IHRvIGNhbGwgQ3JlYXRlUHJvY2VzcyBhbmQKLSAgICAgICBpdCB1c2VzIFBBVEggdG8gZmluZCBETEwncy4gIEZvcnR1bmF0ZWx5IFBBVEggaGFzIGEgd2VsbC1kZWZpbmVkIHZhbHVlCi0gICAgICAgaW4gYm90aCBwb3NpeCBhbmQgd2luMzIgZW52aXJvbm1lbnRzLiAgY3lnd2luLmRsbCB3aWxsIGNoYW5nZSBpdCBiYWNrCi0gICAgICAgdG8gcG9zaXggc3R5bGUgaWYgbmVjZXNzYXJ5LiAgKi8KLQotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb252X3BhdGhfbmFtZXNbXSA9Ci0gICAgICB7Ci0JIlBBVEg9IiwKLQkwCi0gICAgICB9OwotCi0gICAgLyogQ3JlYXRlUHJvY2VzcyB0YWtlcyB0aGUgZW52aXJvbm1lbnQgbGlzdCBhcyBhIG51bGwgdGVybWluYXRlZCBzZXQgb2YKLSAgICAgICBzdHJpbmdzIChpLmUuIHR3byBudWxscyB0ZXJtaW5hdGUgdGhlIGxpc3QpLiAgKi8KLQotICAgIC8qIEdldCB0b3RhbCBzaXplIGZvciBlbnYgc3RyaW5ncy4gICovCi0gICAgZm9yIChlbnZsZW4gPSAwLCBpID0gMDsgZW52W2ldICYmICplbnZbaV07IGkrKykKLSAgICAgIHsKLQlpbnQgaiwgbGVuOwotCi0JZm9yIChqID0gMDsgY29udl9wYXRoX25hbWVzW2pdOyBqKyspCi0JICB7Ci0JICAgIGxlbiA9IHN0cmxlbiAoY29udl9wYXRoX25hbWVzW2pdKTsKLQkgICAgaWYgKHN0cm5jbXAgKGNvbnZfcGF0aF9uYW1lc1tqXSwgZW52W2ldLCBsZW4pID09IDApCi0JICAgICAgewotCQlpZiAoY3lnd2luMzJfcG9zaXhfcGF0aF9saXN0X3AgKGVudltpXSArIGxlbikpCi0JCSAgZW52bGVuICs9IGxlbgotCQkgICAgKyBjeWd3aW4zMl9wb3NpeF90b193aW4zMl9wYXRoX2xpc3RfYnVmX3NpemUgKGVudltpXSArIGxlbik7Ci0JCWVsc2UKLQkJICBlbnZsZW4gKz0gc3RybGVuIChlbnZbaV0pICsgMTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCWlmIChjb252X3BhdGhfbmFtZXNbal0gPT0gTlVMTCkKLQkgIGVudmxlbiArPSBzdHJsZW4gKGVudltpXSkgKyAxOwotICAgICAgfQotCi0gICAgd2luZW52ID0gYWxsb2NhIChlbnZsZW4gKyAxKTsKLQotICAgIC8qIENvcHkgZW52IHN0cmluZ3MgaW50byBuZXcgYnVmZmVyLiAgKi8KLSAgICBmb3IgKHRlbXAgPSB3aW5lbnYsIGkgPSAwOyBlbnZbaV0gJiYgKmVudltpXTsgaSsrKQotICAgICAgewotCWludCBqLCBsZW47Ci0KLQlmb3IgKGogPSAwOyBjb252X3BhdGhfbmFtZXNbal07IGorKykKLQkgIHsKLQkgICAgbGVuID0gc3RybGVuIChjb252X3BhdGhfbmFtZXNbal0pOwotCSAgICBpZiAoc3RybmNtcCAoY29udl9wYXRoX25hbWVzW2pdLCBlbnZbaV0sIGxlbikgPT0gMCkKLQkgICAgICB7Ci0JCWlmIChjeWd3aW4zMl9wb3NpeF9wYXRoX2xpc3RfcCAoZW52W2ldICsgbGVuKSkKLQkJICB7Ci0JCSAgICBtZW1jcHkgKHRlbXAsIGVudltpXSwgbGVuKTsKLQkJICAgIGN5Z3dpbjMyX3Bvc2l4X3RvX3dpbjMyX3BhdGhfbGlzdCAoZW52W2ldICsgbGVuLCB0ZW1wICsgbGVuKTsKLQkJICB9Ci0JCWVsc2UKLQkJICBzdHJjcHkgKHRlbXAsIGVudltpXSk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIH0KLQlpZiAoY29udl9wYXRoX25hbWVzW2pdID09IE5VTEwpCi0JICBzdHJjcHkgKHRlbXAsIGVudltpXSk7Ci0KLQl0ZW1wICs9IHN0cmxlbiAodGVtcCkgKyAxOwotICAgICAgfQotCi0gICAgLyogRmluYWwgbmlsIHN0cmluZyB0byB0ZXJtaW5hdGUgbmV3IGVudi4gICovCi0gICAgKnRlbXAgPSAwOwotICB9Ci0KLSAgcmV0ID0gQ3JlYXRlUHJvY2VzcyAoMCwKLQkJICAgICAgIGFyZ3MsIAkvKiBjb21tYW5kIGxpbmUgKi8KLQkJICAgICAgIE5VTEwsCS8qIFNlY3VyaXR5ICovCi0JCSAgICAgICBOVUxMLAkvKiB0aHJlYWQgKi8KLQkJICAgICAgIFRSVUUsCS8qIGluaGVyaXQgaGFuZGxlcyAqLwotCQkgICAgICAgZmxhZ3MsCS8qIHN0YXJ0IGZsYWdzICovCi0JCSAgICAgICB3aW5lbnYsCi0JCSAgICAgICBOVUxMLAkvKiBjdXJyZW50IGRpcmVjdG9yeSAqLwotCQkgICAgICAgJnNpLAotCQkgICAgICAgJnBpKTsKLSAgaWYgKCFyZXQpCi0gICAgZXJyb3IgKCJFcnJvciBjcmVhdGluZyBwcm9jZXNzICVzLCAoZXJyb3IgJWQpXG4iLCBleGVjX2ZpbGUsIEdldExhc3RFcnJvcigpKTsKLQotICBleGNlcHRpb25fY291bnQgPSAwOwotICBldmVudF9jb3VudCA9IDA7Ci0KLSAgY3VycmVudF9wcm9jZXNzX2hhbmRsZSA9IHBpLmhQcm9jZXNzOwotICBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkID0gcGkuZHdQcm9jZXNzSWQ7Ci0gIG1lbXNldCAoJmN1cnJlbnRfZXZlbnQsIDAsIHNpemVvZiAoY3VycmVudF9ldmVudCkpOwotICBpbmZlcmlvcl9waWQgPSBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQgPSBwaS5kd1RocmVhZElkOwotICBwdXNoX3RhcmdldCAoJmNoaWxkX29wcyk7Ci0gIGNoaWxkX2luaXRfdGhyZWFkX2xpc3QgKCk7Ci0gIGluaXRfd2FpdF9mb3JfaW5mZXJpb3IgKCk7Ci0gIGNsZWFyX3Byb2NlZWRfc3RhdHVzICgpOwotICB0YXJnZXRfdGVybWluYWxfaW5pdCAoKTsKLSAgdGFyZ2V0X3Rlcm1pbmFsX2luZmVyaW9yICgpOwotCi0gIC8qIElnbm9yZSB0aGUgZmlyc3QgdHJhcCAqLwotICBjaGlsZF93YWl0IChpbmZlcmlvcl9waWQsICZkdW1teSk7Ci0KLSAgcHJvY2VlZCAoKENPUkVfQUREUikgLSAxLCBUQVJHRVRfU0lHTkFMXzAsIDApOwotfQotCi1zdGF0aWMgdm9pZAotY2hpbGRfbW91cm5faW5mZXJpb3IgKCkKLXsKLSAgKHZvaWQpIGNoaWxkX2NvbnRpbnVlIChEQkdfQ09OVElOVUUsIC0xKTsKLSAgdW5wdXNoX3RhcmdldCAoJmNoaWxkX29wcyk7Ci0gIGdlbmVyaWNfbW91cm5faW5mZXJpb3IgKCk7Ci19Ci0KLS8qIFNlbmQgYSBTSUdJTlQgdG8gdGhlIHByb2Nlc3MgZ3JvdXAuICBUaGlzIGFjdHMganVzdCBsaWtlIHRoZSB1c2VyIHR5cGVkIGEKLSAgIF5DIG9uIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbC4gKi8KLQotc3RhdGljIHZvaWQKLWNoaWxkX3N0b3AgKCkKLXsKLSAgREVCVUdfRVZFTlRTICgoImdkYjogR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50IChDVFJMQ19FVkVOVCwgMClcbiIpKTsKLSAgQ0hFQ0sgKEdlbmVyYXRlQ29uc29sZUN0cmxFdmVudCAoQ1RSTF9DX0VWRU5ULCAwKSk7Ci0gIHJlZ2lzdGVyc19jaGFuZ2VkKCk7CQkvKiByZWZyZXNoIHJlZ2lzdGVyIHN0YXRlICovCi19Ci0KLWludAotY2hpbGRfeGZlcl9tZW1vcnkgKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpvdXIsIGludCBsZW4sCi0JCSAgIGludCB3cml0ZSwgc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldCkKLXsKLSAgRFdPUkQgZG9uZTsKLSAgaWYgKHdyaXRlKQotICAgIHsKLSAgICAgIERFQlVHX01FTSAoKCJnZGI6IHdyaXRlIHRhcmdldCBtZW1vcnksICVkIGJ5dGVzIGF0IDB4JTA4eFxuIiwKLQkJICBsZW4sIG1lbWFkZHIpKTsKLSAgICAgIFdyaXRlUHJvY2Vzc01lbW9yeSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwgKExQVk9JRCkgbWVtYWRkciwgb3VyLAotCQkJICBsZW4sICZkb25lKTsKLSAgICAgIEZsdXNoSW5zdHJ1Y3Rpb25DYWNoZSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwgKExQQ1ZPSUQpIG1lbWFkZHIsIGxlbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgREVCVUdfTUVNICgoImdkYjogcmVhZCB0YXJnZXQgbWVtb3J5LCAlZCBieXRlcyBhdCAweCUwOHhcbiIsCi0JCSAgbGVuLCBtZW1hZGRyKSk7Ci0gICAgICBSZWFkUHJvY2Vzc01lbW9yeSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwgKExQQ1ZPSUQpIG1lbWFkZHIsIG91ciwgbGVuLAotCQkJICZkb25lKTsKLSAgICB9Ci0gIHJldHVybiBkb25lOwotfQotCi12b2lkCi1jaGlsZF9raWxsX2luZmVyaW9yICh2b2lkKQotewotICBDSEVDSyAoVGVybWluYXRlUHJvY2VzcyAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwgMCkpOwotCi0gIGZvciAoOzspCi0gICAgewotICAgICAgaWYgKCFjaGlsZF9jb250aW51ZSAoREJHX0NPTlRJTlVFLCAtMSkpCi0JYnJlYWs7Ci0gICAgICBpZiAoIVdhaXRGb3JEZWJ1Z0V2ZW50ICgmY3VycmVudF9ldmVudCwgSU5GSU5JVEUpKQotCWJyZWFrOwotICAgICAgaWYgKGN1cnJlbnRfZXZlbnQuZHdEZWJ1Z0V2ZW50Q29kZSA9PSBFWElUX1BST0NFU1NfREVCVUdfRVZFTlQpCi0JYnJlYWs7Ci0gICAgfQotCi0gIENIRUNLIChDbG9zZUhhbmRsZSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSkpOwotCi0gIC8qIHRoaXMgbWF5IGZhaWwgaW4gYW4gYXR0YWNoZWQgcHJvY2VzcyBzbyBkb24ndCBjaGVjay4gKi8KLSAgKHZvaWQpIENsb3NlSGFuZGxlIChjdXJyZW50X3RocmVhZC0+aCk7Ci0gIHRhcmdldF9tb3Vybl9pbmZlcmlvcigpOwkvKiBvciBqdXN0IGNoaWxkX21vdXJuX2luZmVyaW9yPyAqLwotfQotCi12b2lkCi1jaGlsZF9yZXN1bWUgKGludCBwaWQsIGludCBzdGVwLCBlbnVtIHRhcmdldF9zaWduYWwgc2lnKQotewotICBpbnQgaTsKLSAgdGhyZWFkX2luZm8gKnRoOwotICBEV09SRCBjb250aW51ZV9zdGF0dXMgPSBsYXN0X3NpZyA+IDAgJiYgbGFzdF9zaWcgPCBOU0lHID8KLQkJCSAgREJHX0VYQ0VQVElPTl9OT1RfSEFORExFRCA6IERCR19DT05USU5VRTsKLQotICBERUJVR19FWEVDICgoImdkYjogY2hpbGRfcmVzdW1lIChwaWQ9JWQsIHN0ZXA9JWQsIHNpZz0lZCk7XG4iLAotCSAgICAgICBwaWQsIHN0ZXAsIHNpZykpOwotCi0gIC8qIEdldCBjb250ZXh0IGZvciBjdXJyZW50bHkgc2VsZWN0ZWQgdGhyZWFkICovCi0gIHRoID0gdGhyZWFkX3JlYyAoY3VycmVudF9ldmVudC5kd1RocmVhZElkLCBGQUxTRSk7Ci0gIGlmIChzdGVwKQotICAgIHsKLSNpZmRlZiBpMzg2Ci0gICAgICAvKiBTaW5nbGUgc3RlcCBieSBzZXR0aW5nIHQgYml0ICovCi0gICAgICBjaGlsZF9mZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKFBTX1JFR05VTSk7Ci0gICAgICB0aC0+Y29udGV4dC5FRmxhZ3MgfD0gRkxBR19UUkFDRV9CSVQ7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKHRoLT5jb250ZXh0LkNvbnRleHRGbGFncykKLSAgICB7Ci0gICAgICBDSEVDSyAoU2V0VGhyZWFkQ29udGV4dCAodGgtPmgsICZ0aC0+Y29udGV4dCkpOwotICAgICAgdGgtPmNvbnRleHQuQ29udGV4dEZsYWdzID0gMDsKLSAgICB9Ci0KLSAgLyogQWxsb3cgY29udGludWluZyB3aXRoIHRoZSBzYW1lIHNpZ25hbCB0aGF0IGludGVycnVwdGVkIHVzLgotICAgICBPdGhlcndpc2UgY29tcGxhaW4uICovCi0gIGlmIChzaWcgJiYgc2lnICE9IGxhc3Rfc2lnKQotICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIkNhbid0IHNlbmQgc2lnbmFscyB0byB0aGUgY2hpbGQuICBzaWduYWwgJWRcbiIsIHNpZyk7Ci0KLSAgbGFzdF9zaWcgPSAwOwotICBjaGlsZF9jb250aW51ZSAoY29udGludWVfc3RhdHVzLCBwaWQpOwotfQotCi1zdGF0aWMgdm9pZAotY2hpbGRfcHJlcGFyZV90b19zdG9yZSAoKQotewotICAvKiBEbyBub3RoaW5nLCBzaW5jZSB3ZSBjYW4gc3RvcmUgaW5kaXZpZHVhbCByZWdzICovCi19Ci0KLXN0YXRpYyBpbnQKLWNoaWxkX2Nhbl9ydW4gKCkKLXsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGlsZF9jbG9zZSAoKQotewotICBERUJVR19FVkVOVFMgKCgiZ2RiOiBjaGlsZF9jbG9zZSwgaW5mZXJpb3JfcGlkPSVkXG4iLCBpbmZlcmlvcl9waWQpKTsKLX0KLQotc3RydWN0IHRhcmdldF9vcHMgY2hpbGRfb3BzIDsKLQotc3RhdGljIHZvaWQgCi1pbml0X2NoaWxkX29wcyh2b2lkKQotewotICBjaGlsZF9vcHMudG9fc2hvcnRuYW1lID0gICAiY2hpbGQiOwotICBjaGlsZF9vcHMudG9fbG9uZ25hbWUgPSAgICJXaW4zMiBjaGlsZCBwcm9jZXNzIjsKLSAgY2hpbGRfb3BzLnRvX2RvYyA9ICAgIldpbjMyIGNoaWxkIHByb2Nlc3MgKHN0YXJ0ZWQgYnkgdGhlIFwicnVuXCIgY29tbWFuZCkuIjsKLSAgY2hpbGRfb3BzLnRvX29wZW4gPSAgIGNoaWxkX29wZW47Ci0gIGNoaWxkX29wcy50b19jbG9zZSA9ICAgY2hpbGRfY2xvc2U7Ci0gIGNoaWxkX29wcy50b19hdHRhY2ggPSAgIGNoaWxkX2F0dGFjaDsKLSAgY2hpbGRfb3BzLnRvX2RldGFjaCA9ICAgY2hpbGRfZGV0YWNoOwotICBjaGlsZF9vcHMudG9fcmVzdW1lID0gICBjaGlsZF9yZXN1bWU7Ci0gIGNoaWxkX29wcy50b193YWl0ICA9ICAgY2hpbGRfd2FpdDsKLSAgY2hpbGRfb3BzLnRvX2ZldGNoX3JlZ2lzdGVycyAgPSAgIGNoaWxkX2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVyczsKLSAgY2hpbGRfb3BzLnRvX3N0b3JlX3JlZ2lzdGVycyAgPSAgIGNoaWxkX3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVyczsKLSAgY2hpbGRfb3BzLnRvX3ByZXBhcmVfdG9fc3RvcmUgPSAgIGNoaWxkX3ByZXBhcmVfdG9fc3RvcmU7Ci0gIGNoaWxkX29wcy50b194ZmVyX21lbW9yeSAgPSAgIGNoaWxkX3hmZXJfbWVtb3J5OwotICBjaGlsZF9vcHMudG9fZmlsZXNfaW5mbyAgPSAgIGNoaWxkX2ZpbGVzX2luZm87Ci0gIGNoaWxkX29wcy50b19pbnNlcnRfYnJlYWtwb2ludCA9ICAgbWVtb3J5X2luc2VydF9icmVha3BvaW50OwotICBjaGlsZF9vcHMudG9fcmVtb3ZlX2JyZWFrcG9pbnQgPSAgIG1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludDsKLSAgY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX2luaXQgID0gICB0ZXJtaW5hbF9pbml0X2luZmVyaW9yOwotICBjaGlsZF9vcHMudG9fdGVybWluYWxfaW5mZXJpb3IgPSAgIHRlcm1pbmFsX2luZmVyaW9yOwotICBjaGlsZF9vcHMudG9fdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ID0gICB0ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQ7Ci0gIGNoaWxkX29wcy50b190ZXJtaW5hbF9vdXJzICA9ICAgdGVybWluYWxfb3VyczsKLSAgY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX2luZm8gID0gICBjaGlsZF90ZXJtaW5hbF9pbmZvOwotICBjaGlsZF9vcHMudG9fa2lsbCAgPSAgIGNoaWxkX2tpbGxfaW5mZXJpb3I7Ci0gIGNoaWxkX29wcy50b19sb2FkICA9ICAgMDsKLSAgY2hpbGRfb3BzLnRvX2xvb2t1cF9zeW1ib2wgPSAgIDA7Ci0gIGNoaWxkX29wcy50b19jcmVhdGVfaW5mZXJpb3IgPSAgIGNoaWxkX2NyZWF0ZV9pbmZlcmlvcjsKLSAgY2hpbGRfb3BzLnRvX21vdXJuX2luZmVyaW9yID0gICBjaGlsZF9tb3Vybl9pbmZlcmlvcjsKLSAgY2hpbGRfb3BzLnRvX2Nhbl9ydW4gID0gICBjaGlsZF9jYW5fcnVuOwotICBjaGlsZF9vcHMudG9fbm90aWNlX3NpZ25hbHMgPSAgIDA7Ci0gIGNoaWxkX29wcy50b190aHJlYWRfYWxpdmUgID0gICB3aW4zMl9jaGlsZF90aHJlYWRfYWxpdmU7Ci0gIGNoaWxkX29wcy50b19zdG9wICA9ICAgY2hpbGRfc3RvcDsKLSAgY2hpbGRfb3BzLnRvX3N0cmF0dW0gPSAgIHByb2Nlc3Nfc3RyYXR1bTsKLSAgY2hpbGRfb3BzLkRPTlRfVVNFID0gICAwOwotICBjaGlsZF9vcHMudG9faGFzX2FsbF9tZW1vcnkgPSAgIDE7Ci0gIGNoaWxkX29wcy50b19oYXNfbWVtb3J5ID0gICAxOwotICBjaGlsZF9vcHMudG9faGFzX3N0YWNrID0gICAxOwotICBjaGlsZF9vcHMudG9faGFzX3JlZ2lzdGVycyA9ICAgMTsKLSAgY2hpbGRfb3BzLnRvX2hhc19leGVjdXRpb24gPSAgIDE7Ci0gIGNoaWxkX29wcy50b19zZWN0aW9ucyA9ICAgMDsKLSAgY2hpbGRfb3BzLnRvX3NlY3Rpb25zX2VuZCA9ICAgMDsKLSAgY2hpbGRfb3BzLnRvX21hZ2ljID0gICBPUFNfTUFHSUM7Ci19Ci0KLXZvaWQKLV9pbml0aWFsaXplX2luZnRhcmcgKCkKLXsKLSAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7Ci0gIGluaXRfY2hpbGRfb3BzKCkgOwotCi0gIGFkZF9zaG93X2Zyb21fc2V0Ci0gICAgKGFkZF9zZXRfY21kICgibmV3LWNvbnNvbGUiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKLQkJICAoY2hhciAqKSAmbmV3X2NvbnNvbGUsCi0JCSAgIlNldCBjcmVhdGlvbiBvZiBuZXcgY29uc29sZSB3aGVuIGNyZWF0aW5nIGNoaWxkIHByb2Nlc3MuIiwKLQkJICAmc2V0bGlzdCksCi0gICAgICZzaG93bGlzdCk7Ci0KLSAgYWRkX3Nob3dfZnJvbV9zZXQKLSAgICAoYWRkX3NldF9jbWQgKCJuZXctZ3JvdXAiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKLQkJICAoY2hhciAqKSAmbmV3X2dyb3VwLAotCQkgICJTZXQgY3JlYXRpb24gb2YgbmV3IGdyb3VwIHdoZW4gY3JlYXRpbmcgY2hpbGQgcHJvY2Vzcy4iLAotCQkgICZzZXRsaXN0KSwKLSAgICAgJnNob3dsaXN0KTsKLQotICBhZGRfc2hvd19mcm9tX3NldAotICAgIChhZGRfc2V0X2NtZCAoImRlYnVnZXhlYyIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLAotCQkgIChjaGFyICopICZkZWJ1Z19leGVjLAotCQkgICJTZXQgd2hldGhlciB0byBkaXNwbGF5IGV4ZWN1dGlvbiBpbiBjaGlsZCBwcm9jZXNzLiIsCi0JCSAgJnNldGxpc3QpLAotICAgICAmc2hvd2xpc3QpOwotCi0gIGFkZF9zaG93X2Zyb21fc2V0Ci0gICAgKGFkZF9zZXRfY21kICgiZGVidWdldmVudHMiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKLQkJICAoY2hhciAqKSAmZGVidWdfZXZlbnRzLAotCQkgICJTZXQgd2hldGhlciB0byBkaXNwbGF5IGtlcm5lbCBldmVudHMgaW4gY2hpbGQgcHJvY2Vzcy4iLAotCQkgICZzZXRsaXN0KSwKLSAgICAgJnNob3dsaXN0KTsKLQotICBhZGRfc2hvd19mcm9tX3NldAotICAgIChhZGRfc2V0X2NtZCAoImRlYnVnbWVtb3J5IiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCi0JCSAgKGNoYXIgKikgJmRlYnVnX21lbW9yeSwKLQkJICAiU2V0IHdoZXRoZXIgdG8gZGlzcGxheSBtZW1vcnkgYWNjZXNzZXMgaW4gY2hpbGQgcHJvY2Vzcy4iLAotCQkgICZzZXRsaXN0KSwKLSAgICAgJnNob3dsaXN0KTsKLQotICBhZGRfc2hvd19mcm9tX3NldAotICAgIChhZGRfc2V0X2NtZCAoImRlYnVnZXhjZXB0aW9ucyIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLAotCQkgIChjaGFyICopICZkZWJ1Z19leGNlcHRpb25zLAotCQkgICJTZXQgd2hldGhlciB0byBkaXNwbGF5IGtlcm5lbCBleGNlcHRpb25zIGluIGNoaWxkIHByb2Nlc3MuIiwKLQkJICAmc2V0bGlzdCksCi0gICAgICZzaG93bGlzdCk7Ci0KLSAgYWRkX3RhcmdldCAoJmNoaWxkX29wcyk7Ci19Ci0KLS8qIERldGVybWluZSBpZiB0aGUgdGhyZWFkIHJlZmVyZW5jZWQgYnkgInBpZCIgaXMgYWxpdmUKLSAgIGJ5ICJwb2xsaW5nIiBpdC4gIElmIFdhaXRGb3JTaW5nbGVPYmplY3QgcmV0dXJucyBXQUlUX09CSkVDVF8wCi0gICBpdCBtZWFucyB0aGF0IHRoZSBwaWQgaGFzIGRpZWQuICBPdGhlcndpc2UgaXQgaXMgYXNzdW1lZCB0byBiZSBhbGl2ZS4gKi8KLXN0YXRpYyBpbnQKLXdpbjMyX2NoaWxkX3RocmVhZF9hbGl2ZSAoaW50IHBpZCkKLXsKLSAgcmV0dXJuIFdhaXRGb3JTaW5nbGVPYmplY3QodGhyZWFkX3JlYyAocGlkLCBGQUxTRSktPmgsIDApID09IFdBSVRfT0JKRUNUXzAgPwotCSBGQUxTRSA6IFRSVUU7Ci19Ci0KLS8qIENvbnZlcnQgcGlkIHRvIHByaW50YWJsZSBmb3JtYXQuICovCi1jaGFyICoKLWN5Z3dpbl9waWRfdG9fc3RyIChpbnQgcGlkKQotewotICBzdGF0aWMgY2hhciBidWZbODBdOwotICBpZiAocGlkID09IGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQpCi0gICAgc3ByaW50ZiAoYnVmLCAicHJvY2VzcyAlZCIsIHBpZCk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChidWYsICJ0aHJlYWQgJWQuMHgleCIsIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIHBpZCk7Ci0gIHJldHVybiBidWY7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi8uZ2RiaW5pdCBiL2dwcm9mLy5nZGJpbml0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTE5NDcyLi4wMDAwMDAwCi0tLSBhL2dwcm9mLy5nZGJpbml0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZGlyIC4uCmRpZmYgLS1naXQgYS9ncHJvZi9DaGFuZ2VMb2cgYi9ncHJvZi9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NjI2YzIuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTMxOSArMCwwIEBACi0xOTk5LTA0LTI2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+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+Z3Byb2YuCi0KLVRodSBNYXIgMjUgMTk6MDA6MzcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBncHJvZi50ZXhpOiBhZGQgSU5GTy1ESVItRU5UUlkKLQotVHVlIE1hciAyMyAwMDowMzoxMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgaW5zdGFsbGNoZWNrIHRhcmdldAotCi1TYXQgRmViIDI3IDE4OjE3OjEwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuYyAoZnVuY3N5bWJvbCk6ICBJbnZlcnQgdGVzdCBmb3IgYWZsYWcuCi0KLVRodSBGZWIgMjUgMTY6MDE6NTAgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBwcmludGdwcm9mICh4bWFsbG9jLCB4cmVhbGxvYyk6ICBDYXN0IHJlc3VsdHMgb2YgbWFsbG9jCi0JYW5kIHJlYWxsb2MgdG8gUFRSLgotCi1XZWQgRmViICAzIDEzOjU1OjMzIDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjcmVhdGVkIGluZm8sIGluc3RhbGwtaW5mbywgZHZpCi0KLVdlZCBKYW4gIDYgMDA6NTg6MDkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZml4IGluc3RhbGwgcnVsZSBmb3IgJChQUk9HKQotCi1GcmkgT2N0ICA5IDExOjI1OjQxIDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIGdwcm9mLjE6IHVwZGF0ZWQgU1lOT1BTSVMgdG8gbWF0Y2ggYWN0dWFsIGJlaGF2aW9yLgotCi1Nb24gT2N0ICA1IDE3OjUwOjE2IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBnZW4tYy1wcm9nLmF3azogIE5ldyBhd2sgc2NyaXB0LCBsaWdodGx5IGNoYW5nZWQgZnJvbQotCXByZXZpb3VzbHkgZGVsZXRlZCBtYWtlLWMtcHJvZy5hd2suICBDb252ZXJ0cyBhIHRleHQgZmlsZQotCXRvIGEgYyBmdW5jdGlvbiB0aGF0IHByaW50cyB0aGF0IHRleHQuCi0JKiBmbGF0X2JsLm0sIGZzZl9jYWxsZ19ibC5tLCBic2RfY2FsbGdfYmwubTogIE5ldyBmaWxlcy4KLQlJbnB1dHMgdG8gZ2VuLWMtcHJvZy5hd2ssIGNvbnRhaW5pbmcgdGV4dCBkZXNjcmliaW5nCi0JZ3Byb2Ygb3V0cHV0LgotCSogYmx1cmJzLmM6ICBSZW1vdmVkLiAgVXNlICpfYmwuYyBpbnN0ZWFkLgotCSogTWFrZWZpbGUuaW46IFVzZSBnZW4tY3Byb2cuYXdrIHRvIGdlbmVyYXRlICpfYmwuYyBmaWxlcwotCWZyb20gKl9ibC5tIGZpbGVzLiAgQWxzbywgaW1wcm92ZSAqY2xlYW4gcnVsZXMuCi0JKiBwcmludGdwcm9mLmMgKHByaW50Z3Byb2YpOiAgVXN3IG5ldyBmdW5jdGlvbiBuYW1lcyBmcm9tICpfYmwuYy4KLQkKLQotU3VuIEF1ZyAzMCAxOTo1NDo1MyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGdwcm9mLmgsIGdwcm9mLmMsIHByaW50Zmdwcm9mLmM6ICBBZGQgc3VwcG9ydCBmb3IgdHdvCi0Jb3V0cHV0IHN0eWxlczogIFRoZSBkZWZhdWx0IGlzIHNpbWlsYXIgdG8gdGhlIG9sZCBGU0YgZ3Byb2YsCi0Jd2hpbGUgLVQgc2V0cyB0aGUgdmFyaWFibGUgYnNkX3N0eWxlX291dHB1dCwgd2hpY2ggY2F1c2VzCi0Jb3V0cHV0IG1hdGNoaW5nIEJlcmtlbGV5J3MgZ3Byb2YuICBUaGUgYmlnZ2VzdCBkaWZmZXJlbmNlcwotCWFyZSB0aGF0IHdpdGggdGhlIEZTRiBzdHlsZSBvdXRwdXQsIHRoZSBmbGF0IHByb2ZpbGUgY29tZXMKLQliZWZvcmUgdGhlIGNhbGwgZ3JhcGg7IG51bWJlcnMgY29tZSBiZWZvcmUgZXhwbGFuYXRpb25zOwotCWFuZCB0aGVyZSBpcyBsZXNzIGdyYXR1aXRvdXMgd2hpdGUgc3BhY2UuCi0JKiBncHJvZi5oLCBncHJvZi5jLCBwcmludGZncHJvZi5jOiAgTmV3IGRpc2NhcmRfdW5kZXJzY29yZXMKLQl2YXJpYWJsZSBjYXVzZXMgZGlzY2FyZGluZyBvZiBpbml0aWFsIHVuZGVyc2NvcmVzIHdoZW4KLQlwcmludGluZyBzeW1ib2wgbmFtZXMuICBJdCBpcyBzZXQgdW5sZXNzIHRoZXJlIGlzIGEgIm1haW4iCi0Jc3ltYm9sICh3aXRob3V0IGFuIHVuZGVyc2NvcmUpLgotCSogcHJpbnRmZ3Byb2YuYzogIE5ldyBmdW5jdGlvbiBwcmludG5hbWVvbmx5KCksIGNhbGxlZAotCWJ5IHByaW50bmFtZSgpLiAgSXQgaGFuZGxlcyBzdHJpcHBpbmcgb2YgaW5pdGlhbCAnXycsCi0JYXMgd2VsbCBhcyBDKysgbmFtZS1kZW1hbmdsaW5nLgotCSogZ3Byb2YuY2FsbGcsIGdwcm9mLmZsYXQsIG1ha2UtYy1wcm9nLmF3azogIFJlbW92ZWQuCi0JSXQgaXMganVzdCBhcyBjb252ZW5pZW50IHRvIGVkaXQgYmx1cmJzLmMgZGlyZWN0bHkuCi0JKiBNYWtlZmlsZS5pbjogIFJlbW92ZWQgcnVsZSBmb3IgbWFraW5nIGJsdXJicy5jLgotCSogYmx1cmJzLmM6ICBUaGlzIGlzIG5vdyBhIHRydWUgc291cmNlIGZpbGUgKGFzIG9wcG9zZWQKLQl0byBiZWluZyBnZW5lcmF0ZWQgZnJvbSBncHJvZi5jYWxsZyBhbmQgZ3Byb2YuZmxhdCkuCi0JQ2hhbmdlIHN0eWxlIHRvIHVzZSBvbmUgbG9uZyBzdHJpbmcgbGl0ZXJhbCwgaW5zdGVhZCBvZgotCW9uZSBsaXRlcmFsIHBlciBvdXRwdXQgbGluZS4gIEFkZCBGU0Ytc3R5bGUgYmx1cmIgZm9yIGNhbGwgZ3JhcGguCi0KLVdlZCBBdWcgMTkgMTQ6MzY6MzkgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCi0KLVdlZCBBdWcgMTIgMTU6MTQ6MTQgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNoYW5nZSAke01BQ0hJTkV9IHRvICQoTUFDSElORSkuCi0KLVN1biBKdWwgMTkgMTc6MzQ6MDEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIHJlbW92ZWQgaW5zdGFsbGF0aW9uIG9mIHRoZSBub3cgdXNlbGVzcwotCWNhbGwue2ZsYWcsY2FsbGd9IGZpbGVzLiAgCi0KLQkqIGdwcm9mLjE6IG5vdyB1c2VzIHRoZSBzdGFuZGFyZCBtYW4gbWFjcm9zIGluc3RlYWQgb2YgdGhlIG5ldyBCU0QKLQltYW5kb2MgbWFjcm9zLiAKLQotU3VuIEp1bCAxMiAxOTowNjowMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVtb3ZlIGhvc3Qgc2VjdGlvbiwgZXhwYW5kIHRhcmdldCBzZWN0aW9uLgotCSogY29uZmlnL210LXt0YWhvZSx2YXh9OiAgQWRkLCB0byBtYXRjaCBleGlzdGluZyBzdXBwb3J0IGZpbGVzLgotCSogY29uZmlnL3RtYWtlLSo6ICBSZW1vdmUgbGVmdG92ZXIgY3J1ZC4KLQotCSogYmx1cmJzLmM6ICBOZXcgZmlsZSwgY3JlYXRlZCBmcm9tIGdwcm9mLmZsYXQgYW5kIGdwcm9mLmNhbGxnIGJ5Ci0JKiBtYWtlLWMtcHJvZy5hd2s6ICB3aGljaCBwcm9jZXNzZXMgdGV4dCBmaWxlcyBpbnRvIEMgcHJvZ3JhbXMuCi0JKiBwcmludGdwcm9mLmMgKGZsYXRwcm9maGVhZGVyLCBncHJvZmhlYWRlcik6ICBDYWxsIG5ldyBmdW5jdGlvbnMKLQl0byBwcmludCBibHVyYnMuCi0JKHByaW50Ymx1cmIpOiAgUmVtb3ZlLgotCSogTWFrZWZpbGUuaW46ICBJbmZyYXN0cnVjdHVyZSB0byBidWlsZCBibHVyYnMuCi0JKiBwYXRobmFtZXMuaDogIGhhcyBiZWVuIHJlbW92ZWQuICBHcHJvZiBub3cgaGFzIG5vIGZpbGVuYW1lCi0JZGVwZW5kZW5jaWVzIGluIGl0LgotCSogZ3Byb2YuYzogIExpbnQuCi0KLVNhdCBKdWwgMTEgMTg6MDc6MjEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZGVmaW5lIG1hbjFkaXIgYW5kIGluc3RhbGwgdGhlIG1hbiBwYWdlCi0KLUZyaSBKdWwgMTAgMjE6MTQ6MDggMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGR1bW15IGluZm8gYW5kIGluc3RhbGwtaW5mbyB0YXJnZXRzCi0KLVRodSBKdW4gIDQgMTE6MzQ6MDIgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbG9va3VwLmM6IGZpeGVkIGZlbmNlcG9zdCBpbiBubGxvb2t1cCBhbmQgYWRkZWQgZGJnX25sbG9va3VwIGZvcgotCWhlbHAgaW4gZGVidWdnaW5nIHRoZSBwcm9ibGVtICh3aXRoIC1EREVCVUcpCi0JKiBncHJvZi5jOiBzeW1ib2wgdmFsdWVzIGFyZSBub3cgcmVhbCB2YWx1ZXMsIGRvbid0IGFkZCB0aGUgdm1hCi0JYW55bW9yZS4gKGRvbmUgZm9yIHNvbGFyaXM7IHNob3VsZCB2ZXJpZnkgdGhpcyBvbiBvdGhlciBwbGF0Zm9ybXMpCi0JKiBDaGFuZ2VMb2c6IGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9ncHJvZi9NYWtlZmlsZS5hbSBiL2dwcm9mL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWUxNDkyLi4wMDAwMDAwCi0tLSBhL2dwcm9mL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLVNVRkZJWEVTID0gLm0KLQotU1VCRElSUyA9IHBvCi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtRERFQlVHIC1JLi4vYmZkIC1JJChzcmNkaXIpLy4uL2luY2x1ZGUgLUkkKHNyY2RpcikvLi4vYmZkIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotYmluX1BST0dSQU1TID0gZ3Byb2YKLQotIyMgQ29udmVuaWVuY2UgdmFyIGxpc3RpbmcgcHVyZSBzb3VyY2VzLgotc291cmNlcyA9IGJhc2ljX2Jsb2Nrcy5jIGNhbGxfZ3JhcGguYyBjZ19hcmNzLmMgY2dfZGZuLmMgXAotCWNnX3ByaW50LmMgY29yZWZpbGUuYyBnbW9uX2lvLmMgZ3Byb2YuYyBoZXJ0ei5jIGhpc3QuYyBzb3VyY2UuYyBcCi0Jc2VhcmNoX2xpc3QuYyBzeW10YWIuYyBzeW1faWRzLmMgdXRpbHMuYyBcCi0JaTM4Ni5jIGFscGhhLmMgdmF4LmMgdGFob2UuYyBzcGFyYy5jCi1ncHJvZl9TT1VSQ0VTID0gJChzb3VyY2VzKSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMKLWdwcm9mX0RFUEVOREVOQ0lFUyA9IC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTERFUFMpCi1ncHJvZl9MREFERCA9IC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTExJQlMpCi0KLW5vaW5zdF9IRUFERVJTID0gXAotCWJhc2ljX2Jsb2Nrcy5oIGNhbGxfZ3JhcGguaCBjZ19hcmNzLmggY2dfZGZuLmggY2dfcHJpbnQuaCBcCi0JY29yZWZpbGUuaCBnbW9uLmggZ21vbl9pby5oIGdtb25fb3V0LmggZ3Byb2YuaCBoZXJ0ei5oIGhpc3QuaCBcCi0Jc2VhcmNoX2xpc3QuaCBzb3VyY2UuaCBzeW1faWRzLmggc3ltdGFiLmggdXRpbHMuaAotCi1FWFRSQV9ESVNUID0gZmxhdF9ibC5jIGJzZF9jYWxsZ19ibC5jIGZzZl9jYWxsZ19ibC5jIGJiY29udi5wbAotCi1CVUlMVF9TT1VSQ0VTID0gZmxhdF9ibC5jIGJzZF9jYWxsZ19ibC5jIGZzZl9jYWxsZ19ibC5jCi0KLWRpc3RzdHVmZjogJChCVUlMVF9TT1VSQ0VTKSBpbmZvCi0KLS5tLmM6Ci0JYXdrIC1mICQoc3JjZGlyKS9nZW4tYy1wcm9nLmF3ayA+IC4vJCouYyBcCi0JICAgIEZVTkNUSU9OPWAoZWNobyAkKnxzZWQgLWUgJ3MsLiovLCxnJyAtZSAncy9fYmwvLycpYF9ibHVyYiBcCi0JICAgIEZJTEU9JCoubSAkKHNyY2RpcikvJCoubQotCi1QT1RGSUxFUyA9ICQoc291cmNlcykgJChub2luc3RfSEVBREVSUykKLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLWluZm9fVEVYSU5GT1MgPSBncHJvZi50ZXhpCi1tYW5fTUFOUyA9IGdwcm9mLjEKLQotIyBEZXBlbmRlbmNpZXMuCi0kKE9CSkVDVFMpOiAuLi9iZmQvYmZkLmggY2FsbF9ncmFwaC5oIGNnX2FyY3MuaCBjZ19wcmludC5oIFwKLQljb3JlZmlsZS5oIGdtb25faW8uaCBnbW9uX291dC5oIGdwcm9mLmggaGVydHouaCBoaXN0LmggXAotCXNlYXJjaF9saXN0Lmggc291cmNlLmggc3ltX2lkcy5oIHN5bXRhYi5oIHV0aWxzLmggXAotCSQoc3JjZGlyKS8uLi9pbmNsdWRlL2xpYmliZXJ0eS5oICQoc3JjZGlyKS8uLi9iZmQvc3lzZGVwLmggXAotCWdjb25maWcuaCAuLi9iZmQvY29uZmlnLmgKLWJhc2ljX2Jsb2Nrcy5vOiBiYXNpY19ibG9ja3MuYwotYnNkX2NhbGxfYmwubzogYnNkX2NhbGxfYmwuYwotY2FsbF9ncmFwaC5vOiBjYWxsX2dyYXBoLmMKLWNnX2FyY3MubzogY2dfYXJjcy5jCi1jZ19kZm4ubzogY2dfZGZuLmMKLWNnX3ByaW50Lm86IGNnX3ByaW50LmMKLWNvcmVmaWxlLm86IGNvcmVmaWxlLmMKLWZsYXRfYmwubzogZmxhdF9ibC5jCi1mc2ZfY2FsbGdfYmwubzogZnNmX2NhbGxnX2JsLmMKLWdtb25faW8ubzogZ21vbl9pby5jCi1ncHJvZi5vOiBncHJvZi5jCi1oZXJ0ei5vOiBoZXJ0ei5jCi1oaXN0Lm86IGhpc3QuYwotc2VhcmNoX2xpc3Qubzogc2VhcmNoX2xpc3QuYwotc291cmNlLm86IHNvdXJjZS5jCi1zeW10YWIubzogc3ltdGFiLmMKLXN5bV9pZHMubzogc3ltX2lkcy5jCi11dGlscy5vOiB1dGlscy5jCi1pMzg2Lm86IGkzODYuYwotYWxwaGEubzogYWxwaGEuYwotdmF4Lm86IHZheC5jCi10YWhvZS5vOiB0YWhvZS5jCi1zcGFyYy5vOiBzcGFyYy5jCmRpZmYgLS1naXQgYS9ncHJvZi9NYWtlZmlsZS5pbiBiL2dwcm9mL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWFkZDg4Li4wMDAwMDAwCi0tLSBhL2dwcm9mL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNzI2ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1ERVNURElSID0KLQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLQotdG9wX2J1aWxkZGlyID0gLgotCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfdHJpcGxldCA9IEBob3N0QAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKLUFTID0gQEFTQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1EQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVYRUVYVCA9IEBFWEVFWFRACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLUdNU0dGTVQgPSBAR01TR0ZNVEAKLUdUX05PID0gQEdUX05PQAotR1RfWUVTID0gQEdUX1lFU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTExJQlMgPSBASU5UTExJQlNACi1JTlRMT0JKUyA9IEBJTlRMT0JKU0AKLUxEID0gQExEQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTUFJTlQgPSBATUFJTlRACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLU1TR0ZNVCA9IEBNU0dGTVRACi1OTSA9IEBOTUAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBPRklMRVMgPSBAUE9GSUxFU0AKLVBPU1VCID0gQFBPU1VCQAotUkFOTElCID0gQFJBTkxJQkAKLVVTRV9JTkNMVURFRF9MSUJJTlRMID0gQFVTRV9JTkNMVURFRF9MSUJJTlRMQAotVVNFX05MUyA9IEBVU0VfTkxTQAotVVNFX1NZTUJPTF9VTkRFUlNDT1JFID0gQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLWwgPSBAbEAKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1TVUZGSVhFUyA9IC5tCi0KLVNVQkRJUlMgPSBwbwotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLURERUJVRyAtSS4uL2JmZCAtSSQoc3JjZGlyKS8uLi9pbmNsdWRlIC1JJChzcmNkaXIpLy4uL2JmZCAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLWJpbl9QUk9HUkFNUyA9IGdwcm9mCi0KLXNvdXJjZXMgPSBiYXNpY19ibG9ja3MuYyBjYWxsX2dyYXBoLmMgY2dfYXJjcy5jIGNnX2Rmbi5jIFwKLQljZ19wcmludC5jIGNvcmVmaWxlLmMgZ21vbl9pby5jIGdwcm9mLmMgaGVydHouYyBoaXN0LmMgc291cmNlLmMgXAotCXNlYXJjaF9saXN0LmMgc3ltdGFiLmMgc3ltX2lkcy5jIHV0aWxzLmMgXAotCWkzODYuYyBhbHBoYS5jIHZheC5jIHRhaG9lLmMgc3BhcmMuYwotCi1ncHJvZl9TT1VSQ0VTID0gJChzb3VyY2VzKSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMKLWdwcm9mX0RFUEVOREVOQ0lFUyA9IC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTERFUFMpCi1ncHJvZl9MREFERCA9IC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTExJQlMpCi0KLW5vaW5zdF9IRUFERVJTID0gXAotCWJhc2ljX2Jsb2Nrcy5oIGNhbGxfZ3JhcGguaCBjZ19hcmNzLmggY2dfZGZuLmggY2dfcHJpbnQuaCBcCi0JY29yZWZpbGUuaCBnbW9uLmggZ21vbl9pby5oIGdtb25fb3V0LmggZ3Byb2YuaCBoZXJ0ei5oIGhpc3QuaCBcCi0Jc2VhcmNoX2xpc3QuaCBzb3VyY2UuaCBzeW1faWRzLmggc3ltdGFiLmggdXRpbHMuaAotCi0KLUVYVFJBX0RJU1QgPSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMgYmJjb252LnBsCi0KLUJVSUxUX1NPVVJDRVMgPSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMKLQotUE9URklMRVMgPSAkKHNvdXJjZXMpICQobm9pbnN0X0hFQURFUlMpCi0KLWluZm9fVEVYSU5GT1MgPSBncHJvZi50ZXhpCi1tYW5fTUFOUyA9IGdwcm9mLjEKLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBnY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9IAotYmluX1BST0dSQU1TID0gIGdwcm9mJChFWEVFWFQpCi1QUk9HUkFNUyA9ICAkKGJpbl9QUk9HUkFNUykKLQotCi1ERUZTID0gQERFRlNAIC1JLiAtSSQoc3JjZGlyKSAtSS4KLUNQUEZMQUdTID0gQENQUEZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCUyA9IEBMSUJTQAotZ3Byb2ZfT0JKRUNUUyA9ICBiYXNpY19ibG9ja3MubyBjYWxsX2dyYXBoLm8gY2dfYXJjcy5vIGNnX2Rmbi5vIFwKLWNnX3ByaW50Lm8gY29yZWZpbGUubyBnbW9uX2lvLm8gZ3Byb2YubyBoZXJ0ei5vIGhpc3QubyBzb3VyY2UubyBcCi1zZWFyY2hfbGlzdC5vIHN5bXRhYi5vIHN5bV9pZHMubyB1dGlscy5vIGkzODYubyBhbHBoYS5vIHZheC5vIHRhaG9lLm8gXAotc3BhcmMubyBmbGF0X2JsLm8gYnNkX2NhbGxnX2JsLm8gZnNmX2NhbGxnX2JsLm8KLWdwcm9mX0xERkxBR1MgPSAKLUNGTEFHUyA9IEBDRkxBR1NACi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQAotVEVYSTJEVkkgPSBgaWYgdGVzdCAtZiAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgdGhlbiBlY2hvICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyBlbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAotVEVYSU5GT19URVggPSAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXgKLUlORk9fREVQUyA9IGdwcm9mLmluZm8KLURWSVMgPSBncHJvZi5kdmkKLVRFWElORk9TID0gZ3Byb2YudGV4aQotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1NQU5TID0gJChtYW5fTUFOUykKLQotTlJPRkYgPSBucm9mZgotSEVBREVSUyA9ICAkKG5vaW5zdF9IRUFERVJTKQotCi1ESVNUX0NPTU1PTiA9ICAuL3N0YW1wLWguaW4gQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluIFRPRE8gXAotYWNsb2NhbC5tNCBjb25maWd1cmUgY29uZmlndXJlLmluIGdjb25maWcuaW4KLQotCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotCi1UQVIgPSB0YXIKLUdaSVBfRU5WID0gLS1iZXN0Ci1TT1VSQ0VTID0gJChncHJvZl9TT1VSQ0VTKQotT0JKRUNUUyA9ICQoZ3Byb2ZfT0JKRUNUUykKLQotYWxsOiBhbGwtcmVkaXJlY3QKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLlMgLmMgLmR2aSAuaW5mbyAubG8gLm0gLm8gLnBzIC5zIC50ZXhpIC50ZXhpbmZvIC50eGkKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBjb25maWd1cmUuaW4gCi0JY2QgJChzcmNkaXIpICYmICQoQUNMT0NBTCkKLQotY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLSQoc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKQotCWNkICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQotCi1nY29uZmlnLmg6IHN0YW1wLWgKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgc3RhbXAtaDsgXAotCQkkKE1BS0UpIHN0YW1wLWg7IFwKLQllbHNlIDo7IGZpCi1zdGFtcC1oOiAkKHNyY2RpcikvZ2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWdjb25maWcuaDpnY29uZmlnLmluIFwKLQkgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCUBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWggMj4gL2Rldi9udWxsCi0kKHNyY2RpcikvZ2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQllbHNlIDo7IGZpCi0kKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKLQotbW9zdGx5Y2xlYW4taGRyOgotCi1jbGVhbi1oZHI6Ci0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGdjb25maWcuaAotCi1tYWludGFpbmVyLWNsZWFuLWhkcjoKLQotbW9zdGx5Y2xlYW4tYmluUFJPR1JBTVM6Ci0KLWNsZWFuLWJpblBST0dSQU1TOgotCS10ZXN0IC16ICIkKGJpbl9QUk9HUkFNUykiIHx8IHJtIC1mICQoYmluX1BST0dSQU1TKQotCi1kaXN0Y2xlYW4tYmluUFJPR1JBTVM6Ci0KLW1haW50YWluZXItY2xlYW4tYmluUFJPR1JBTVM6Ci0KLWluc3RhbGwtYmluUFJPR1JBTVM6ICQoYmluX1BST0dSQU1TKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoYmluZGlyKQotCUBsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgZWNobyAiICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChERVNURElSKSQoYmluZGlyKS9gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoREVTVERJUikkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQotdW5pbnN0YWxsLWJpblBST0dSQU1TOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBybSAtZiAkKERFU1RESVIpJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgJ3MvJChFWEVFWFQpJCQvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQlkb25lCi0KLS5jLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0ucy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLlMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoubyBjb3JlICouY29yZQotCi1jbGVhbi1jb21waWxlOgotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGU6Ci0KLS5jLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0ucy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLlMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbi1saWJ0b29sOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYnRvb2w6Ci0KLWdwcm9mJChFWEVFWFQpOiAkKGdwcm9mX09CSkVDVFMpICQoZ3Byb2ZfREVQRU5ERU5DSUVTKQotCUBybSAtZiBncHJvZiQoRVhFRVhUKQotCSQoTElOSykgJChncHJvZl9MREZMQUdTKSAkKGdwcm9mX09CSkVDVFMpICQoZ3Byb2ZfTERBREQpICQoTElCUykKLQotZ3Byb2YuaW5mbzogZ3Byb2YudGV4aQotZ3Byb2YuZHZpOiBncHJvZi50ZXhpCi0KLQotRFZJUFMgPSBkdmlwcwotCi0udGV4aS5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50ZXhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnR4aS5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50eGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnR4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotLmR2aS5wczoKLQkkKERWSVBTKSAkPCAtbyAkQAotCi1pbnN0YWxsLWluZm8tYW06ICQoSU5GT19ERVBTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoaW5mb2RpcikKLQlAbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGlmaWxlIGluIGBjZCAkJGQgJiYgZWNobyAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldYDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICQkZC8kJGlmaWxlOyB0aGVuIFwKLQkgICAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGUiOyBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGU7IFwKLQkgICAgZWxzZSA6IDsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JQCQoUE9TVF9JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQkgIGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgICBlY2hvICIgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIjtcCi0JICAgIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSB8fCA6O1wKLQkgIGRvbmU7IFwKLQllbHNlIDogOyBmaQotCi11bmluc3RhbGwtaW5mbzoKLQkkKFBSRV9VTklOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgaWk9eWVzOyBcCi0JZWxzZSBpaT07IGZpOyBcCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAteiAiJGlpIiBcCi0JICAgIHx8IGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpIC0tcmVtb3ZlICQkZmlsZTsgXAotCWRvbmUKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIChjZCAkKERFU1RESVIpJChpbmZvZGlyKSAmJiBybSAtZiAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldKTsgXAotCWRvbmUKLQotZGlzdC1pbmZvOiAkKElORk9fREVQUykKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGJhc2UgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkYmFzZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgZmlsZSBpbiBgY2QgJCRkICYmIGV2YWwgZWNobyAkJGJhc2UqYDsgZG8gXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCi1tb3N0bHljbGVhbi1hbWluZm86Ci0JLXJtIC1mIGdwcm9mLmF1eCBncHJvZi5jcCBncHJvZi5jcHMgZ3Byb2YuZHZpIGdwcm9mLmZuIGdwcm9mLmZucyBcCi0JICBncHJvZi5reSBncHJvZi5reXMgZ3Byb2YucHMgZ3Byb2YubG9nIGdwcm9mLnBnIGdwcm9mLnRvYyBcCi0JICBncHJvZi50cCBncHJvZi50cHMgZ3Byb2YudnIgZ3Byb2YudnJzIGdwcm9mLm9wIGdwcm9mLnRyIFwKLQkgIGdwcm9mLmN2IGdwcm9mLmNuCi0KLWNsZWFuLWFtaW5mbzoKLQotZGlzdGNsZWFuLWFtaW5mbzoKLQotbWFpbnRhaW5lci1jbGVhbi1hbWluZm86Ci0JZm9yIGkgaW4gJChJTkZPX0RFUFMpOyBkbyBcCi0JICBybSAtZiAkJGk7IFwKLQkgIGlmIHRlc3QgImBlY2hvICQkaS1bMC05XSpgIiAhPSAiJCRpLVswLTldKiI7IHRoZW4gXAotCSAgICBybSAtZiAkJGktWzAtOV0qOyBcCi0JICBmaTsgXAotCWRvbmUKLWNsZWFuLWluZm86IG1vc3RseWNsZWFuLWFtaW5mbwotCi1pbnN0YWxsLW1hbjE6Ci0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChtYW4xZGlyKQotCUBsaXN0PSckKG1hbjFfTUFOUyknOyBcCi0JbDI9JyQobWFuX01BTlMpJzsgZm9yIGkgaW4gJCRsMjsgZG8gXAotCSAgY2FzZSAiJCRpIiBpbiBcCi0JICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQoc3JjZGlyKS8kJGk7IHRoZW4gZmlsZT0kKHNyY2RpcikvJCRpOyBcCi0JICBlbHNlIGZpbGU9JCRpOyBmaTsgXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQkZmlsZSAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3Q7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1tYW4xOgotCUBsaXN0PSckKG1hbjFfTUFOUyknOyBcCi0JbDI9JyQobWFuX01BTlMpJzsgZm9yIGkgaW4gJCRsMjsgZG8gXAotCSAgY2FzZSAiJCRpIiBpbiBcCi0JICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCi0JICBlY2hvICIgcm0gLWYgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAotCSAgcm0gLWYgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotaW5zdGFsbC1tYW46ICQoTUFOUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLW1hbjEKLXVuaW5zdGFsbC1tYW46Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwtbWFuMQotCi0jIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAotIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCi0jIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCi0jICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKLSMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7Ci0jICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgotCi1AU0VUX01BS0VACi0KLWFsbC1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLWluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAotY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgZG90X3NlZW49eWVzOyBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKLQlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXJldj0nJzsgbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gIi4iICYmIGRvdF9zZWVuPXllczsgXAotCWRvbmU7IFwKLQl0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyIgJiYgcmV2PSIuICQkcmV2IjsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKLXRhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi0KLXRhZ3M6IFRBR1MKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCWhlcmU9YHB3ZGAgJiYgY2QgJChzcmNkaXIpIFwKLQkgICYmIG1raWQgLWYkJGhlcmUvSUQgJCR1bmlxdWUgJChMSVNQKQotCi1UQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgZ2NvbmZpZy5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0gICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1mICQkc3ViZGlyL1RBR1MgJiYgdGFncz0iJCR0YWdzIC1pICQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotICAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCXRlc3QgLXogIiQoRVRBR1NfQVJHUylnY29uZmlnLmluJCR1bmlxdWUkKExJU1ApJCR0YWdzIiBcCi0JICB8fCAoY2QgJChzcmNkaXIpICYmIGV0YWdzICQoRVRBR1NfQVJHUykgJCR0YWdzIGdjb25maWcuaW4gJCR1bmlxdWUgJChMSVNQKSAtbyAkJGhlcmUvVEFHUykKLQotbW9zdGx5Y2xlYW4tdGFnczoKLQotY2xlYW4tdGFnczoKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQKLQotbWFpbnRhaW5lci1jbGVhbi10YWdzOgotCi1kaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCi10b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKLQotIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgotIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgotIyB0YXJmaWxlLgotZGlzdGNoZWNrOiBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgenhmICQoZGlzdGRpcikudGFyLmd6Ci0JbWtkaXIgJChkaXN0ZGlyKS89YnVpbGQKLQlta2RpciAkKGRpc3RkaXIpLz1pbnN0Ci0JZGNfaW5zdGFsbF9iYXNlPWBjZCAkKGRpc3RkaXIpLz1pbnN0ICYmIHB3ZGA7IFwKLQljZCAkKGRpc3RkaXIpLz1idWlsZCBcCi0JICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9JCRkY19pbnN0YWxsX2Jhc2UgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlAYmFubmVyPSIkKGRpc3RkaXIpLnRhci5neiBpcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uIjsgXAotCWRhc2hlcz1gZWNobyAiJCRiYW5uZXIiIHwgc2VkIHMvLi89L2dgOyBcCi0JZWNobyAiJCRkYXNoZXMiOyBcCi0JZWNobyAiJCRiYW5uZXIiOyBcCi0JZWNobyAiJCRkYXNoZXMiCi1kaXN0OiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdC1hbGw6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQktcm0gLXJmICQoZGlzdGRpcikKLQlta2RpciAkKGRpc3RkaXIpCi0JLWNobW9kIDc3NyAkKGRpc3RkaXIpCi0JQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgY3AgLXByICQkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAotCSAgZmk7IFwKLQlkb25lCi0JZm9yIHN1YmRpciBpbiAkKFNVQkRJUlMpOyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1kICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBta2RpciAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICAgIGNobW9kIDc3NyAkKGRpc3RkaXIpLyQkc3ViZGlyOyBcCi0JICAgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0uLi8kKGRpc3RkaXIpIGRpc3RkaXI9Li4vJChkaXN0ZGlyKS8kJHN1YmRpciBkaXN0ZGlyKSBcCi0JICAgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0iJCh0b3BfZGlzdGRpcikiIGRpc3RkaXI9IiQoZGlzdGRpcikiIGRpc3QtaW5mbwotaW5mby1hbTogJChJTkZPX0RFUFMpCi1pbmZvOiBpbmZvLXJlY3Vyc2l2ZQotZHZpLWFtOiAkKERWSVMpCi1kdmk6IGR2aS1yZWN1cnNpdmUKLWNoZWNrLWFtOgotY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbGNoZWNrLWFtOgotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsLWluZm8tYW06IAotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCi1hbGwtcmVjdXJzaXZlLWFtOiBnY29uZmlnLmgKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCi0KLWluc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1iaW5QUk9HUkFNUwotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCi0KLWluc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1tYW4KLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWJpblBST0dSQU1TIHVuaW5zdGFsbC1tYW4KLXVuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQotYWxsLWFtOiBNYWtlZmlsZSAkKFBST0dSQU1TKSAkKE1BTlMpICQoSEVBREVSUykgZ2NvbmZpZy5oCi1hbGwtcmVkaXJlY3Q6IGFsbC1yZWN1cnNpdmUtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKLWluc3RhbGxkaXJzLWFtOgotCSQobWtpbnN0YWxsZGlycykgICQoREVTVERJUikkKGJpbmRpcikgJChERVNURElSKSQobWFuZGlyKS9tYW4xCi0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKEJVSUxUX1NPVVJDRVMpIiB8fCBybSAtZiAkKEJVSUxUX1NPVVJDRVMpCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1iaW5QUk9HUkFNUyBcCi0JCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCi0JCW1vc3RseWNsZWFuLWFtaW5mbyBtb3N0bHljbGVhbi10YWdzIG1vc3RseWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQotCi1jbGVhbi1hbTogIGNsZWFuLWhkciBjbGVhbi1iaW5QUk9HUkFNUyBjbGVhbi1jb21waWxlIGNsZWFuLWxpYnRvb2wgXAotCQljbGVhbi1hbWluZm8gY2xlYW4tdGFncyBjbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWFtCi0KLWNsZWFuOiBjbGVhbi1yZWN1cnNpdmUKLQotZGlzdGNsZWFuLWFtOiAgZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tYmluUFJPR1JBTVMgZGlzdGNsZWFuLWNvbXBpbGUgXAotCQlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tYW1pbmZvIGRpc3RjbGVhbi10YWdzIFwKLQkJZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tYW0KLQktcm0gLWYgbGlidG9vbAotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi1tYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1oZHIgbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUyBcCi0JCW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgXAotCQltYWludGFpbmVyLWNsZWFuLWFtaW5mbyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgXAotCQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotLlBIT05ZOiBtb3N0bHljbGVhbi1oZHIgZGlzdGNsZWFuLWhkciBjbGVhbi1oZHIgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotbW9zdGx5Y2xlYW4tYmluUFJPR1JBTVMgZGlzdGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLWJpblBST0dSQU1TIFwKLW1haW50YWluZXItY2xlYW4tYmluUFJPR1JBTVMgdW5pbnN0YWxsLWJpblBST0dSQU1TIGluc3RhbGwtYmluUFJPR1JBTVMgXAotbW9zdGx5Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tY29tcGlsZSBjbGVhbi1jb21waWxlIFwKLW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJ0b29sIFwKLWNsZWFuLWxpYnRvb2wgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIGluc3RhbGwtaW5mby1hbSB1bmluc3RhbGwtaW5mbyBcCi1tb3N0bHljbGVhbi1hbWluZm8gZGlzdGNsZWFuLWFtaW5mbyBjbGVhbi1hbWluZm8gXAotbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gaW5zdGFsbC1tYW4xIHVuaW5zdGFsbC1tYW4xIGluc3RhbGwtbWFuIFwKLXVuaW5zdGFsbC1tYW4gaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAotaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZXhlYy1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIFwKLWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUgdGFncyB0YWdzLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbi10YWdzIFwKLWRpc3RjbGVhbi10YWdzIGNsZWFuLXRhZ3MgbWFpbnRhaW5lci1jbGVhbi10YWdzIGRpc3RkaXIgaW5mby1hbSBpbmZvIFwKLWR2aS1hbSBkdmkgY2hlY2sgY2hlY2stYW0gaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxjaGVjayBpbnN0YWxsLWluZm8tYW0gXAotaW5zdGFsbC1pbmZvIGFsbC1yZWN1cnNpdmUtYW0gaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBcCi1pbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsIFwKLWFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIGluc3RhbGxkaXJzLWFtIGluc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gXAotbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotCi1kaXN0c3R1ZmY6ICQoQlVJTFRfU09VUkNFUykgaW5mbwotCi0ubS5jOgotCWF3ayAtZiAkKHNyY2RpcikvZ2VuLWMtcHJvZy5hd2sgPiAuLyQqLmMgXAotCSAgICBGVU5DVElPTj1gKGVjaG8gJCp8c2VkIC1lICdzLC4qLywsZycgLWUgJ3MvX2JsLy8nKWBfYmx1cmIgXAotCSAgICBGSUxFPSQqLm0gJChzcmNkaXIpLyQqLm0KLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLSMgRGVwZW5kZW5jaWVzLgotJChPQkpFQ1RTKTogLi4vYmZkL2JmZC5oIGNhbGxfZ3JhcGguaCBjZ19hcmNzLmggY2dfcHJpbnQuaCBcCi0JY29yZWZpbGUuaCBnbW9uX2lvLmggZ21vbl9vdXQuaCBncHJvZi5oIGhlcnR6LmggaGlzdC5oIFwKLQlzZWFyY2hfbGlzdC5oIHNvdXJjZS5oIHN5bV9pZHMuaCBzeW10YWIuaCB1dGlscy5oIFwKLQkkKHNyY2RpcikvLi4vaW5jbHVkZS9saWJpYmVydHkuaCAkKHNyY2RpcikvLi4vYmZkL3N5c2RlcC5oIFwKLQlnY29uZmlnLmggLi4vYmZkL2NvbmZpZy5oCi1iYXNpY19ibG9ja3MubzogYmFzaWNfYmxvY2tzLmMKLWJzZF9jYWxsX2JsLm86IGJzZF9jYWxsX2JsLmMKLWNhbGxfZ3JhcGgubzogY2FsbF9ncmFwaC5jCi1jZ19hcmNzLm86IGNnX2FyY3MuYwotY2dfZGZuLm86IGNnX2Rmbi5jCi1jZ19wcmludC5vOiBjZ19wcmludC5jCi1jb3JlZmlsZS5vOiBjb3JlZmlsZS5jCi1mbGF0X2JsLm86IGZsYXRfYmwuYwotZnNmX2NhbGxnX2JsLm86IGZzZl9jYWxsZ19ibC5jCi1nbW9uX2lvLm86IGdtb25faW8uYwotZ3Byb2YubzogZ3Byb2YuYwotaGVydHoubzogaGVydHouYwotaGlzdC5vOiBoaXN0LmMKLXNlYXJjaF9saXN0Lm86IHNlYXJjaF9saXN0LmMKLXNvdXJjZS5vOiBzb3VyY2UuYwotc3ltdGFiLm86IHN5bXRhYi5jCi1zeW1faWRzLm86IHN5bV9pZHMuYwotdXRpbHMubzogdXRpbHMuYwotaTM4Ni5vOiBpMzg2LmMKLWFscGhhLm86IGFscGhhLmMKLXZheC5vOiB2YXguYwotdGFob2UubzogdGFob2UuYwotc3BhcmMubzogc3BhcmMuYwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9ncHJvZi9OT1RFUyBiL2dwcm9mL05PVEVTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTFhZjMwLi4wMDAwMDAwCi0tLSBhL2dwcm9mL05PVEVTCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLVN1biBGZWIgIDUgMTY6MDk6MTYgMTk5NQotCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBjaGFuZ2VzIGFuZCBuZXcgZmVhdHVyZXMgYXZhaWxhYmxlIHdpdGggdGhpcwotdmVyc2lvbiBvZiBHTlUgZ3Byb2YuCi0KLSogTmV3IEZlYXR1cmVzCi0KLSBvIExvbmcgb3B0aW9ucwotCi0gbyBTdXBwb3J0cyBnZW5lcmFsaXplZCBmaWxlIGZvcm1hdCwgd2l0aG91dCBicmVha2luZyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgotICAgbmV3IGZpbGUgZm9ybWF0IHN1cHBvcnRzIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMgYW5kIG5vbi1yZWFsdGltZQotICAgaGlzdG9ncmFtcyAoc2VlIGJlbG93KQotCi0gbyBTdXBwb3J0cyBwcm9maWxpbmcgYXQgdGhlIGxpbmUgbGV2ZWw6IGZsYXQgcHJvZmlsZXMsIGNhbGwtZ3JhcGggcHJvZmlsZXMsCi0gICBhbmQgZXhlY3V0aW9uLWNvdW50cyBjYW4gYWxsIGJlIGRpc3BsYXllZCBhdCBhIGxldmVsIHRoYXQgaWRlbnRpZmllcwotICAgaW5kaXZpZHVhbCBsaW5lcyByYXRoZXIgdGhhbiBqdXN0IGZ1bmN0aW9ucwotCi0gbyBUZXN0LWNvdmVyYWdlIHN1cHBvcnQgKHNpbWlsYXIgdG8gU3VuIHRjb3YgcHJvZ3JhbSk6IHNvdXJjZSBmaWxlcwotICAgY2FuIGJlIGFubm90YXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgdGltZXMgYSBmdW5jdGlvbiB3YXMgaW52b2tlZAotICAgb3Igd2l0aCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggYmFzaWMtYmxvY2sgaW4gYSBmdW5jdGlvbiB3YXMKLSAgIGV4ZWN1dGVkCi0KLSBvIEdlbmVyYWxpemVkIGhpc3RvZ3JhbXM6IG5vdCBqdXN0IGV4ZWN1dGlvbi10aW1lLCBidXQgYXJiaXRyYXJ5Ci0gICBoaXN0b2dyYW1zIGFyZSBzdXBwb3J0IChmb3IgZXhhbXBsZSwgcGVyZm9ybWFuY2UgY291bnRlciBiYXNlZAotICAgcHJvZmlsZXMpCi0KLSBvIFBvd2VyZnVsIG1lY2hhbmlzbSB0byBzZWxlY3QgZGF0YSB0byBiZSBpbmNsdWRlZC9leGNsdWRlZCBmcm9tCi0gICBhbmFseXNpcyBhbmQvb3Igb3V0cHV0Ci0KLSBvIFN1cHBvcnQgZm9yIERFQyBPU0YvMSB2My4wCi0KLSBvIEZ1bGwgY3Jvc3MtcGxhdGZvcm0gcHJvZmlsaW5nIHN1cHBvcnQ6IGdwcm9mIHVzZXMgQkZEIHRvIHN1cHBvcnQKLSAgIGFyYml0cmFyeSwgbm9uLW5hdGl2ZSBvYmplY3QgZmlsZSBmb3JtYXRzIGFuZCBub24tbmF0aXZlIGJ5dGUtb3JkZXJzCi0gICAodGhpcyBmZWF0dXJlIGhhcyBub3QgYmVlbiB0ZXN0ZWQgeWV0KQotCi0gbyBJbiB0aGUgY2FsbC1ncmFwaCBmdW5jdGlvbiBpbmRleCwgc3RhdGljIGZ1bmN0aW9uIG5hbWVzIGFyZSBub3cKLSAgIHByaW50ZWQgdG9nZXRoZXIgd2l0aCB0aGUgZmlsZW5hbWUgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIHdhcyBkZWZpbmVkCi0gICAocmVxdWlyZWQgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkgc3VwcG9ydCBhbmQgc3ltYm9saWMgZGVidWdnaW5nCi0gICAgaW5mb3JtYXRpb24gdG8gYmUgcHJlc2VudCBpbiB0aGUgZXhlY3V0YWJsZSBmaWxlKQotCi0gbyBNYWpvciBvdmVyaGF1bCBvZiBzb3VyY2UgY29kZSAoY29tcGlsZXMgY2xlYW5seSB3aXRoIC1XYWxsLCBldGMuKQotCi0qIFN1cHBvcnRlZCBQbGF0Zm9ybXMKLQotVGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBrbm93biB0byB3b3JrIG9uOgotCi0gbyBERUMgT1NGLzEgdjMuMAotCUFsbCBmZWF0dXJlcyBzdXBwb3J0ZWQuCi0KLSBvIFN1bk9TIDQuMS54Ci0JQWxsIGZlYXR1cmVzIHN1cHBvcnRlZC4KLQotIG8gU29sYXJpcyAyLjMKLQlMaW5lLWxldmVsIHByb2ZpbGluZyB1bnN1cHBvcnRlZCBiZWNhdXNlIGJmZF9maW5kX25lYXJlc3RfbGluZSgpCi0JaXMgbm90IGZ1bGx5IGltcGxlbWVudGVkIGZvciBFbGYgYmluYXJpZXMuCi0KLSBvIEhQLVVYIDkuMDEKLQlMaW5lLWxldmVsIHByb2ZpbGluZyB1bnN1cHBvcnRlZCBiZWNhdXNlIGJmZF9maW5kX25lYXJlc3RfbGluZSgpCi0JaXMgbm90IGZ1bGx5IGltcGxlbWVudGVkIGZvciBTT00gYmluYXJpZXMuCi0KLSogRGV0YWlsZWQgRGVzY3JpcHRpb24KLQotKiogVXNlciBJbnRlcmZhY2UgQ2hhbmdlcwotCi1UaGUgY29tbWFuZC1saW5lIGludGVyZmFjZSBpcyBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIGVhcmxpZXIKLXZlcnNpb25zIG9mIEdOVSBncHJvZiBhbmQgQmVya2VsZXkgZ3Byb2YuICBUaGUgb25seSBleGNlcHRpb24gaXMKLXRoZSBvcHRpb24gdG8gZGVsZXRlIGFyY3MgZnJvbSB0aGUgY2FsbCBncmFwaC4gIFRoZSBvbGQgc3ludGF4Ci13YXM6Ci0KLQktayBmcm9tbmFtZSB0b25hbWUKLQotd2hpbGUgdGhlIG5ldyBzeW50YXggaXM6Ci0KLQktayBmcm9tbmFtZS90b25hbWUKLQotVGhpcyBjaGFuZ2Ugd2FzIG5lY2Vzc2FyeSB0byBiZSBjb21wYXRpYmxlIHdpdGggbG9uZy1vcHRpb24gcGFyc2luZy4KLUFsc28sICJmcm9tbmFtZSIgYW5kICJ0b25hbWUiIGNhbiBub3cgYmUgYXJiaXRyYXJ5IHN5bXNwZWNzIHJhdGhlcgotdGhhbiBqdXN0IGZ1bmN0aW9uIG5hbWVzIChzZWUgYmVsb3cgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHN5bXNwZWNzKS4KLUZvciBleGFtcGxlLCBvcHRpb24gIi1rIGdwcm9mLmMvIiBzdXBwcmVzc2VzIGFsbCBhcmNzIGR1ZSB0byBjYWxscyBvdXQKLW9mIGZpbGUgImdwcm9mLmMiLgotCi0qKiogU3ltIFNwZWNzCi0KLUl0IGlzIG9mdGVuIG5lY2Vzc2FyeSB0byBhcHBseSBncHJvZiBvbmx5IHRvIHNwZWNpZmljIHBhcnRzIG9mIGEKLXByb2dyYW0uICBHTlUgZ3Byb2YgaGFzIGEgc2ltcGxlIGJ1dCBwb3dlcmZ1bCBtZWNoYW5pc20gdG8gYWNoaWV2ZQotdGhpcy4gIFNvIGNhbGxlZCB7XGVtIHN5bXNwZWNzXC99IHByb3ZpZGUgdGhlIGZvdW5kYXRpb24gZm9yIHRoaXMKLW1lY2hhbmlzbS4gIEEgc3ltc3BlYyBzZWxlY3RzIHRoZSBwYXJ0cyBvZiBhIHByb2ZpbGVkIHByb2dyYW0gdG8gd2hpY2gKLWFuIG9wZXJhdGlvbiBzaG91bGQgYmUgYXBwbGllZCB0by4gIFRoZSBzeW50YXggb2YgYSBzeW1zcGVjIGlzCi1zaW1wbGU6Ci0KLQkgIGZpbGVuYW1lX2NvbnRhaW5pbmdfYV9kb3QKLQl8IGZ1bmNuYW1lX25vdF9jb250YWluaW5nX2FfZG90Ci0JfCBsaW5lbnVtYmVyCi0JfCAoIFsgYW55X2ZpbGVuYW1lIF0gYDonICggYW55X2Z1bmNuYW1lIHwgbGluZW51bWJlciApICkKLQotSGVyZSBhcmUgc29tZSBleGFtcGxlczoKLQotCW1haW4uYwkJCVNlbGVjdHMgZXZlcnl0aGluZyBpbiBmaWxlICJtYWluLmMiLS0tdGhlCi0JCQkJZG90IGluIHRoZSBzdHJpbmcgdGVsbHMgZ3Byb2YgdG8gaW50ZXJwcmV0Ci0JCQkJdGhlIHN0cmluZyBhcyBhIGZpbGVuYW1lLCByYXRoZXIgdGhhbiBhcwotCQkJCWEgZnVuY3Rpb24gbmFtZS4gIFRvIHNlbGVjdCBhIGZpbGUgd2hvc2UKLQkJCQluYW1lIGRvZXMgY29udGFpbiBhIGRvdCwgYSB0cmFpbGluZyBjb2xvbgotCQkJCXNob3VsZCBiZSBzcGVjaWZpZWQuICBGb3IgZXhhbXBsZSwgIm9kZDoiIGlzCi0JCQkJaW50ZXJwcmV0ZWQgYXMgdGhlIGZpbGUgbmFtZWQgIm9kZCIuCi0KLQltYWluCQkJU2VsZWN0cyBhbGwgZnVuY3Rpb25zIG5hbWVkICJtYWluIi4gIE5vdGljZQotCQkJCXRoYXQgdGhlcmUgbWF5IGJlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUKLQkJCQlzYW1lIGZ1bmN0aW9uIG5hbWUgYmVjYXVzZSBzb21lIG9mIHRoZQotCQkJCWRlZmluaXRpb25zIG1heSBiZSBsb2NhbCAoaS5lLiwgc3RhdGljKS4KLQkJCQlVbmxlc3MgYSBmdW5jdGlvbiBuYW1lIGlzIHVuaXF1ZSBpbiBhIHByb2dyYW0sCi0JCQkJeW91IG11c3QgdXNlIHRoZSBjb2xvbiBub3RhdGlvbiBleHBsYWluZWQKLQkJCQliZWxvdyB0byBzcGVjaWZ5IGEgZnVuY3Rpb24gZnJvbSBhIHNwZWNpZmljCi0JCQkJc291cmNlIGZpbGUuICBTb21ldGltZXMsIGZ1bmN0aW9ubmFtZXMgY29udGFpbgotCQkJCWRvdHMuICBJbiBzdWNoIGNhc2VzLCBpdCBpcyBuZWNlc3NhciB0bwotCQkJCWFkZCBhIGxlYWRpbmcgY29sb24gdG8gdGhlIG5hbWUuICBGb3IgZXhhbXBsZSwKLQkJCQkiOi5tdWwiIHNlbGVjdHMgZnVuY3Rpb24gIi5tdWwiLgotCQkJCQotCW1haW4uYzptYWluCQlTZWxlY3RzIGZ1bmN0aW9uICJtYWluIiBpbiBmaWxlICJtYWluLmMiLgotCi0JbWFpbi5jOjEzNAkJU2VsZWN0cyBsaW5lIDEzNCBpbiBmaWxlICJtYWluLmMiLgotCi1JTVBMRU1FTlRBVElPTiBOT1RFOiBUaGUgc291cmNlIGNvZGUgdXNlcyB0aGUgdHlwZSBzeW1faWQgZm9yIHN5bXNwZWNzLgotQXQgc29tZSBwb2ludCwgdGhpcyBwcm9iYWJseSBvdWdodCB0byBiZSBjaGFuZ2VkIHRvICJzeW1fc3BlYyIgdG8gbWFrZQotcmVhZGluZyB0aGUgY29kZSBlYXNpZXIuCi0KLSoqKiBMb25nIG9wdGlvbnMKLQotR05VIGdwcm9mIG5vdyBzdXBwb3J0cyBsb25nIG9wdGlvbnMuICBUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiBhbGwKLXN1cHBvcnRlZCBvcHRpb25zLiAgT3B0aW9ucyB0aGF0IGFyZSBsaXN0ZWQgd2l0aG91dCBkZXNjcmlwdGlvbgotb3BlcmF0ZSBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgdGhlIGNvcnJlc3BvbmRpbmcgb3B0aW9uIGluIG9sZGVyCi12ZXJzaW9ucyBvZiBncHJvZi4KLQotU2hvcnQgRm9ybToJTG9uZyBGb3JtOgotLS0tLS0tLS0tLS0JLS0tLS0tLS0tLQotLWwJCS0tbGluZQotCQkJUmVxdWVzdCBwcm9maWxpbmcgYXQgdGhlIGxpbmUtbGV2ZWwgcmF0aGVyCi0JCQl0aGFuIGp1c3QgYXQgdGhlIGZ1bmN0aW9uIGxldmVsLiAgU291cmNlCi0JCQlsaW5lcyBhcmUgaWRlbnRpZmllZCBieSBzeW1ib2xzIG9mIHRoZSBmb3JtOgotCi0JCQkJZnVuYyAoZmlsZTpsaW5lKQotCi0JCQl3aGVyZSAiZnVuYyIgaXMgdGhlIGZ1bmN0aW9uIG5hbWUsICJmaWxlIiBpcyB0aGUKLQkJCWZpbGUgbmFtZSBhbmQgImxpbmUiIGlzIHRoZSBsaW5lLW51bWJlciB0aGF0Ci0JCQljb3JyZXNwb25kcyB0byB0aGUgbGluZS4KLQotCQkJVG8gd29yayBwcm9wZXJseSwgdGhlIGJpbmFyeSBtdXN0IGNvbnRhaW4gc3ltYm9saWMKLQkJCWRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgc291cmNlCi0JCQloYXZlIHRvIGJlIHRyYW5zbGF0ZWQgd2l0aCBvcHRpb24gIi1nIiBzcGVjaWZpZWQuCi0JCQlGdW5jdGlvbnMgZm9yIHdoaWNoIHRoZXJlIGlzIG5vIHN5bWJvbGljIGRlYnVnZ2luZwotCQkJaW5mb3JtYXRpb24gYXZhaWxhYmxlIGFyZSB0cmVhdGVkIGFzIGlmICItLWxpbmUiCi0JCQloYWQgbm90IGJlZW4gc3BlY2lmaWVkLiAgSG93ZXZlciwgdGhlIGxpbmUgbnVtYmVyCi0JCQlwcmludGVkIHdpdGggc3VjaCBzeW1ib2xzIGlzIHVzdWFsbHkgaW5jb3JyZWN0Ci0JCQlhbmQgc2hvdWxkIGJlIGlnbm9yZWQuCi0KLS1hCQktLW5vLXN0YXRpYwotLUFbc3ltc3BlY10JLS1hbm5vdGF0ZWQtc291cmNlWz1zeW1zcGVjXQotCQkJUmVxdWVzdCBvdXRwdXQgaW4gdGhlIGZvcm0gb2YgYW5ub3RhdGVkIHNvdXJjZQotCQkJZmlsZXMuICBJZiAic3ltc3BlYyIgaXMgc3BlY2lmaWVkLCBwcmludCBvdXRwdXQgb25seQotCQkJZm9yIHN5bWJvbHMgc2VsZWN0ZWQgYnkgInN5bXNwZWMiLiAgSWYgdGhlIG9wdGlvbgotCQkJaXMgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLCBhbm5vdGF0ZWQgb3V0cHV0IGlzCi0JCQlnZW5lcmF0ZWQgZm9yIHRoZSB1bmlvbiBvZiBhbGwgc3ltc3BlY3MuCi0KLQkJCUV4YW1wbGVzOgotCi0JCQkgIC1BCQlQcmludHMgYW5ub3RhdGVkIHNvdXJjZSBmb3IgYWxsCi0JCQkJCXNvdXJjZSBmaWxlcy4KLQkJCSAgLUFncHJvZi5jCVByaW50cyBhbm5vdGF0ZWQgc291cmNlIGZvciBmaWxlCi0JCQkJCWdwcm9mLmMuCi0JCQkgIC1BZm9vYmFyCVByaW50cyBhbm5vdGF0ZWQgc291cmNlIGZvciBmaWxlcwotCQkJCQljb250YWluaW5nIGEgZnVuY3Rpb24gbmFtZWQgImZvb2JhciIuCi0JCQkJCVRoZSBlbnRpcmUgZmlsZSB3aWxsIGJlIHByaW50ZWQsIGJ1dAotCQkJCQlvbmx5IHRoZSBmdW5jdGlvbiBpdHNlbGYgd2lsbCBiZQotCQkJCQlhbm5vdGF0ZWQgd2l0aCBwcm9maWxlIGRhdGEuCi0KLS1KW3N5bXNwZWNdCS0tbm8tYW5ub3RhdGVkLXNvdXJjZVs9c3ltc3BlY10KLQkJCVN1cHByZXNzIGFubm90YXRlZCBzb3VyY2Ugb3V0cHV0LiAgSWYgc3BlY2lmaWVkCi0JCQl3aXRob3V0IGFyZ3VtZW50LCBhbm5vdGF0ZWQgb3V0cHV0IGlzIHN1cHByZXNzZWQKLQkJCWNvbXBsZXRlbHkuICBXaXRoIGFuIGFyZ3VtZW50LCBhbm5vdGF0ZWQgb3V0cHV0Ci0JCQlpcyBzdXBwcmVzc2VkIG9ubHkgZm9yIHRoZSBzeW1ib2xzIHNlbGVjdGVkIGJ5Ci0JCQkic3ltc3BlYyIuICBJZiB0aGUgb3B0aW9uIGlzIHNwZWNpZmllZCBtdWx0aXBsZQotCQkJdGltZXMsIGFubm90YXRlZCBvdXRwdXQgaXMgc3VwcHJlc3NlZCBmb3IgdGhlCi0JCQl1bmlvbiBvZiBhbGwgc3ltc3BlY3MuICBUaGlzIG9wdGlvbiBoYXMgbG93ZXIKLQkJCXByZWNlZGVuY2UgdGhhbiAtLWFubm90YXRlZC1zb3VyY2UKLQotLXBbc3ltc3BlY10JLS1mbGF0LXByb2ZpbGVbPXN5bXNwZWNdCi0JCQlSZXF1ZXN0IG91dHB1dCBpbiB0aGUgZm9ybSBvZiBhIGZsYXQgcHJvZmlsZQotCQkJKHVubGVzcyBhbnkgb3RoZXIgb3V0cHV0LXN0eWxlIG9wdGlvbiBpcyBzcGVjaWZpZWQsCi0JCQkgdGhpcyBvcHRpb24gaXMgdHVybmVkIG9uIGJ5IGRlZmF1bHQpLiAgSWYKLQkJCSJzeW1zcGVjIiBpcyBzcGVjaWZpZWQsIGluY2x1ZGUgb25seSBzeW1ib2xzCi0JCQlzZWxlY3RlZCBieSAic3ltc3BlYyIgaW4gZmxhdCBwcm9maWxlLiAgSWYgdGhlCi0JCQlvcHRpb24gaXMgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLCB0aGUgZmxhdAotCQkJcHJvZmlsZSBpbmNsdWRlcyBzeW1ib2xzIHNlbGVjdGVkIGJ5IHRoZSB1bmlvbgotCQkJb2YgYWxsIHN5bXNwZWNzLgotCQkJCi0tUFtzeW1zcGVjXQktLW5vLWZsYXQtcHJvZmlsZVs9c3ltc3BlY10KLQkJCVN1cHByZXNzIG91dHB1dCBpbiB0aGUgZmxhdCBwcm9maWxlLiAgSWYgZ2l2ZW4KLQkJCXdpdGhvdXQgYW4gYXJndW1lbnQsIHRoZSBmbGF0IHByb2ZpbGUgaXMgc3VwcHJlc3NlZAotCQkJY29tcGxldGVseS4gIElmICJzeW1zcGVjIiBpcyBzcGVjaWZpZWQsIHN1cHByZXNzCi0JCQl0aGUgc2VsZWN0ZWQgc3ltYm9scyBpbiB0aGUgZmxhdCBwcm9maWxlLiAgSWYgdGhlCi0JCQlvcHRpb24gaXMgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLCB0aGUgdW5pb24gb2YKLQkJCXRoZSBzZWxlY3RlZCBzeW1ib2xzIGlzIHN1cHByZXNzZWQuICBUaGlzIG9wdGlvbgotCQkJaGFzIGxvd2VyIHByZWNlZGVuY2UgdGhhbiAtLWZsYXQtcHJvZmlsZS4KLQotLXFbc3ltc3BlY10JLS1ncmFwaFs9c3ltc3BlY10KLQkJCVJlcXVlc3Qgb3V0cHV0IGluIHRoZSBmb3JtIG9mIGEgY2FsbC1ncmFwaAotCQkJKHVubGVzcyBhbnkgb3RoZXIgb3V0cHV0LXN0eWxlIG9wdGlvbiBpcyBzcGVjaWZpZWQsCi0JCQkgdGhpcyBvcHRpb24gaXMgdHVybmVkIG9uIGJ5IGRlZmF1bHQpLiAgSWYgInN5bXNwZWMiCi0JCQlpcyBzcGVjaWZpZWQsIGluY2x1ZGUgb25seSBzeW1ib2xzIHNlbGVjdGVkIGJ5Ci0JCQkic3ltc3BlYyIgaW4gdGhlIGNhbGwtZ3JhcGguICBJZiB0aGUgb3B0aW9uIGlzCi0JCQlzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIHRoZSBjYWxsLWdyYXBoIGluY2x1ZGVzCi0JCQlzeW1ib2xzIHNlbGVjdGVkIGJ5IHRoZSB1bmlvbiBvZiBhbGwgc3ltc3BlY3MuCi0KLS1RW3N5bXNwZWNdCS0tbm8tZ3JhcGhbPXN5bXNwZWNdCi0JCQlTdXBwcmVzcyBvdXRwdXQgaW4gdGhlIGNhbGwtZ3JhcGguICBJZiBnaXZlbiB3aXRob3V0Ci0JCQlhbiBhcmd1bWVudCwgdGhlIGNhbGwtZ3JhcGggaXMgc3VwcHJlc3NlZCBjb21wbGV0ZWx5LgotCQkJV2l0aCBhICJzeW1zcGVjIiwgc3VwcHJlc3MgdGhlIHNlbGVjdGVkIHN5bWJvbHMKLQkJCWZyb20gdGhlIGNhbGwtZ3JhcGguICBJZiB0aGUgb3B0aW9uIGlzIHNwZWNpZmllZAotCQkJbXVsdGlwbGUgdGltZXMsIHRoZSB1bmlvbiBvZiB0aGUgc2VsZWN0ZWQgc3ltYm9scwotCQkJaXMgc3VwcHJlc3NlZC4gIFRoaXMgb3B0aW9uIGhhcyBsb3dlciBwcmVjZWRlbmNlCi0JCQl0aGFuIC0tZ3JhcGguCi0KLS1DW3N5bXNwZWNdCS0tZXhlYy1jb3VudHNbPXN5bXNwZWNdCi0JCQlSZXF1ZXN0IG91dHB1dCBpbiB0aGUgZm9ybSBvZiBleGVjdXRpb24gY291bnRzLgotCQkJSWYgInN5bXNwZWMiIGlzIHByZXNlbnQsIGluY2x1ZGUgb25seSBzeW1ib2xzCi0JCQlzZWxlY3RlZCBieSAic3ltc3BlYyIgaW4gdGhlIGV4ZWN1dGlvbiBjb3VudAotCQkJbGlzdGluZy4gIElmIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkIG11bHRpcGxlCi0JCQl0aW1lcywgdGhlIGV4ZWN1dGlvbiBjb3VudCBsaXN0aW5nIGluY2x1ZGVzCi0JCQlzeW1ib2xzIHNlbGVjdGVkIGJ5IHRoZSB1bmlvbiBvZiBhbGwgc3ltc3BlY3MuCi0KLS1aW3N5bXNwZWNdCS0tbm8tZXhlYy1jb3VudHNbPXN5bXNwZWNdCi0JCQlTdXBwcmVzcyBvdXRwdXQgaW4gdGhlIGV4ZWN1dGlvbiBjb3VudCBsaXN0aW5nLgotCQkJSWYgZ2l2ZW4gd2l0aG91dCBhbiBhcmd1bWVudCwgdGhlIGxpc3RpbmcgaXMKLQkJCXN1cHByZXNzZWQgY29tcGxldGVseS4gIFdpdGggYSAic3ltc3BlYyIsIHN1cHByZXNzCi0JCQl0aGUgc2VsZWN0ZWQgc3ltYm9scyBmcm9tIHRoZSBjYWxsLWdyYXBoLiAgSWYgdGhlCi0JCQlvcHRpb24gaXMgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLCB0aGUgdW5pb24gb2YKLQkJCXRoZSBzZWxlY3RlZCBzeW1ib2xzIGlzIHN1cHByZXNzZWQuICBUaGlzIG9wdGlvbgotCQkJaGFzIGxvd2VyIHByZWNlZGVuY2UgdGhhbiAtLWV4ZWMtY291bnRzLgotCi0taQkJLS1maWxlLWluZm8KLQkJCVByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9maWxlIGZpbGVzIHRoYXQKLQkJCWFyZSByZWFkLiAgVGhlIGluZm9ybWF0aW9uIGNvbnNpc3RzIG9mIHRoZQotCQkJbnVtYmVyIGFuZCB0eXBlcyBvZiByZWNvcmRzIHByZXNlbnQgaW4gdGhlCi0JCQlwcm9maWxlIGZpbGUuICBDdXJyZW50bHksIGEgcHJvZmlsZSBmaWxlIGNhbgotCQkJY29udGFpbiBhbnkgbnVtYmVyIGFuZCBhbnkgY29tYmluYXRpb24gb2YgaGlzdG9ncmFtLAotCQkJY2FsbC1ncmFwaCwgb3IgYmFzaWMtYmxvY2sgY291bnQgcmVjb3Jkcy4KLQotLXMJCS0tc3VtCi0KLS14CQktLWFsbC1saW5lcwotCQkJVGhpcyBvcHRpb24gYWZmZWN0cyBhbm5vdGF0ZWQgc291cmNlIG91dHB1dCBvbmx5LgotCQkJQnkgZGVmYXVsdCwgb25seSB0aGUgbGluZXMgYXQgdGhlIGJlZ2lubmluZyBvZgotCQkJYSBiYXNpYy1ibG9jayBhcmUgYW5ub3RhdGVkLiAgSWYgdGhpcyBvcHRpb24gaXMKLQkJCXNwZWNpZmllZCwgZXZlcnkgbGluZSBpbiBhIGJhc2ljLWJsb2NrIGlzIGFubm90YXRlZAotCQkJYnkgcmVwZWF0aW5nIHRoZSBhbm5vdGF0aW9uIGZvciB0aGUgZmlyc3QgbGluZS4KLQkJCVRoaXMgb3B0aW9uIGlzIGlkZW50aWNhbCB0byB0Y292J3MgIi1hIi4KLQotLUkgZGlycwkJLS1kaXJlY3RvcnktcGF0aD1kaXJzCi0JCQlUaGlzIG9wdGlvbiBhZmZlY3RzIGFubm90YXRlZCBzb3VyY2Ugb3V0cHV0IG9ubHkuCi0JCQlTcGVjaWZpZXMgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gYmUgc2VhcmNoZWQKLQkJCWZvciBzb3VyY2UgZmlsZXMuICBUaGUgYXJndW1lbnQgImRpcnMiIGlzIGEgY29sb24KLQkJCXNlcGFyYXRlZCBsaXN0IG9mIGRpcmVjdG9yaWVzLiAgQnkgZGVmYXVsdCwgZ3Byb2YKLQkJCXNlYXJjaGVzIGZvciBzb3VyY2UgZmlsZXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQKLQkJCXdvcmtpbmcgZGlyZWN0b3J5IG9ubHkuCi0KLS16CQktLWRpc3BsYXktdW51c2VkLWZ1bmN0aW9ucwotCi0tbSBudW0JCS0tbWluLWNvdW50PW51bQotCQkJVGhpcyBvcHRpb24gYWZmZWN0cyBhbm5vdGF0ZWQgc291cmNlIGFuZCBleGVjdXRpb24KLQkJCWNvdW50IG91dHB1dCBvbmx5LiAgU3ltYm9scyB0aGF0IGFyZSBleGVjdXRlZAotCQkJbGVzcyB0aGFuICJudW0iIHRpbWVzIGFyZSBzdXBwcmVzc2VkLiAgRm9yIGFubm90YXRlZAotCQkJc291cmNlIG91dHB1dCwgc3VwcHJlc3NlZCBzeW1ib2xzIGFyZSBtYXJrZWQKLQkJCWJ5IGZpdmUgaGFzaC1tYXJrcyAoIyMjIyMpLiAgSW4gYW4gZXhlY3V0aW9uIGNvdW50Ci0JCQlvdXRwdXQsIHN1cHByZXNzZWQgc3ltYm9scyBkbyBub3QgYXBwZWFyIGF0IGFsbC4KLQotLUwJCS0tcHJpbnQtcGF0aAotCQkJTm9ybWFsbHksIHNvdXJjZSBmaWxlbmFtZXMgYXJlIHByaW50ZWQgd2l0aCB0aGUgcGF0aAotCQkJY29tcG9uZW50IHN1cHByZXNzZWQuICBXaXRoIHRoaXMgb3B0aW9uLCBncHJvZgotCQkJY2FuIGJlIGZvcmNlZCB0byBwcmludCB0aGUgZnVsbCBwYXRobmFtZSBvZgotCQkJc291cmNlIGZpbGVuYW1lcy4gIFRoZSBmdWxsIHBhdGhuYW1lIGlzIGRldGVybWluZWQKLQkJCWZyb20gc3ltYm9saWMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGluIHRoZSBpbWFnZSBmaWxlCi0JCQlhbmQgaXMgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29tcGlsZXIKLQkJCXdhcyBpbnZva2VkLgotCi0teQkJLS1zZXBhcmF0ZS1maWxlcwotCQkJVGhpcyBvcHRpb24gYWZmZWN0cyBhbm5vdGF0ZWQgc291cmNlIG91dHB1dCBvbmx5LgotCQkJTm9ybWFsbHksIGdwcm9mIHByaW50cyBhbm5vdGF0ZWQgc291cmNlIGZpbGVzCi0JCQl0byBzdGFuZGFyZC1vdXRwdXQuICBJZiB0aGlzIG9wdGlvbiBpcyBzcGVjaWZpZWQsCi0JCQlhbm5vdGF0ZWQgc291cmNlIGZvciBhIGZpbGUgbmFtZWQgInBhdGgvZmlsZW5hbWUiCi0JCQlpcyBnZW5lcmF0ZWQgaW4gdGhlIGZpbGUgImZpbGVuYW1lLWFubiIuICBUaGF0IGlzLAotCQkJYW5ub3RhdGVkIG91dHB1dCBpcyB7XGVtIGFsd2F5c1wvfSBnZW5lcmF0ZWQgaW4KLQkJCWdwcm9mJ3MgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gIENhcmUgaGFzIHRvCi0JCQliZSB0YWtlbiBpZiBhIHByb2dyYW0gY29uc2lzdHMgb2YgZmlsZXMgdGhhdCBoYXZlCi0JCQlpZGVudGljYWwgZmlsZW5hbWVzLCBidXQgZGlzdGluY3QgcGF0aHMuCi0KLS1jCQktLXN0YXRpYy1jYWxsLWdyYXBoCi0KLS10IG51bQkJLS10YWJsZS1sZW5ndGg9bnVtCi0JCQlUaGlzIG9wdGlvbiBhZmZlY3RzIGFubm90YXRlZCBzb3VyY2Ugb3V0cHV0IG9ubHkuCi0JCQlBZnRlciBhbm5vdGF0aW5nIGEgc291cmNlIGZpbGUsIGdwcm9mIGdlbmVyYXRlcwotCQkJYW4gZXhlY3V0aW9uIGNvdW50IHN1bW1hcnkgY29uc2lzdGluZyBvZiBhIHRhYmxlCi0JCQlvZiBsaW5lcyB3aXRoIHRoZSB0b3AgZXhlY3V0aW9uIGNvdW50cy4gIEJ5Ci0JCQlkZWZhdWx0LCB0aGlzIHRhYmxlIGlzIHRlbiBlbnRyaWVzIGxvbmcuCi0JCQlUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHRhYmxlIGxlbmd0aAotCQkJb3IsIGJ5IHNwZWNpZnlpbmcgYW4gYXJndW1lbnQgdmFsdWUgb2YgMCwgaXQgY2FuIGJlCi0JCQlzdXBwcmVzc2VkIGNvbXBsZXRlbHkuCi0KLS1uIHN5bXNwZWMJLS10aW1lPXN5bXNwZWMKLQkJCU9ubHkgc3ltYm9scyBzZWxlY3RlZCBieSAic3ltc3BlYyIgYXJlIGNvbnNpZGVyZWQKLQkJCWluIHRvdGFsIGFuZCBwZXJjZW50YWdlIHRpbWUgY29tcHV0YXRpb25zLgotCQkJSG93ZXZlciwgdGhpcyBvcHRpb24gZG9lcyBub3QgYWZmZWN0IHBlcmNlbnRhZ2UgdGltZQotCQkJY29tcHV0YXRpb24gZm9yIHRoZSBmbGF0IHByb2ZpbGUuCi0JCQlJZiB0aGUgb3B0aW9uIGlzIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgdGhlIHVuaW9uCi0JCQlvZiBhbGwgc2VsZWN0ZWQgc3ltYm9scyBpcyB1c2VkIGluIHRpbWUgY29tcHV0YXRpb25zLgotCi0tTgkJLS1uby10aW1lPXN5bXNwZWMKLQkJCUV4Y2x1ZGUgdGhlIHN5bWJvbHMgc2VsZWN0ZWQgYnkgInN5bXNwZWMiIGZyb20KLQkJCXRvdGFsIGFuZCBwZXJjZW50YWdlIHRpbWUgY29tcHV0YXRpb25zLgotCQkJSG93ZXZlciwgdGhpcyBvcHRpb24gZG9lcyBub3QgYWZmZWN0IHBlcmNlbnRhZ2UgdGltZQotCQkJY29tcHV0YXRpb24gZm9yIHRoZSBmbGF0IHByb2ZpbGUuCi0JCQlUaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGlmIGFueSAtLXRpbWUgb3B0aW9ucyBhcmUKLQkJCXNwZWNpZmllZC4KLQotLXcgbnVtCQktLXdpZHRoPW51bQotCQkJU2V0cyB0aGUgb3V0cHV0IGxpbmUgd2lkdGguICBDdXJyZW50bHksIHRoaXMgb3B0aW9uCi0JCQlhZmZlY3RzIHRoZSBwcmludGluZyBvZiB0aGUgY2FsbC1ncmFwaCBmdW5jdGlvbiBpbmRleAotCQkJb25seS4KLQotLWUJCTxubyBsb25nIGZvcm0tLS1mb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seT4KLS1FCQk8bm8gbG9uZyBmb3JtLS0tZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHk+Ci0tZgkJPG5vIGxvbmcgZm9ybS0tLWZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5PgotLUYJCTxubyBsb25nIGZvcm0tLS1mb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seT4KLS1rCQk8bm8gbG9uZyBmb3JtLS0tZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHk+Ci0tYgkJLS1icmllZgotLWRudW0JCS0tZGVidWdbPW51bV0KLQotLWgJCS0taGVscAotCQkJUHJpbnRzIGEgdXNhZ2UgbWVzc2FnZS4KLQotLU8gbmFtZQkJLS1maWxlLWZvcm1hdD1uYW1lCi0JCQlTZWxlY3RzIHRoZSBmb3JtYXQgb2YgdGhlIHByb2ZpbGUgZGF0YSBmaWxlcy4KLQkJCVJlY29nbml6ZWQgZm9ybWF0cyBhcmUgImF1dG8iLCAiYnNkIiwgIm1hZ2ljIiwKLQkJCWFuZCAicHJvZiIuICBUaGUgbGFzdCBvbmUgaXMgbm90IHlldCBzdXBwb3J0ZWQuCi0JCQlGb3JtYXQgImF1dG8iIGF0dGVtcHRzIHRvIGRldGVjdCB0aGUgZmlsZSBmb3JtYXQKLQkJCWF1dG9tYXRpY2FsbHkgKHRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IpLgotCQkJSXQgYXR0ZW1wdHMgdG8gcmVhZCB0aGUgcHJvZmlsZSBkYXRhIGZpbGVzIGFzCi0JCQkibWFnaWMiIGZpbGVzIGFuZCBpZiB0aGlzIGZhaWxzLCBmYWxscyBiYWNrIHRvCi0JCQl0aGUgImJzZCIgZm9ybWF0LiAgImJzZCIgZm9yY2VzIGdwcm9mIHRvIHJlYWQKLQkJCXRoZSBkYXRhIGZpbGVzIGluIHRoZSBCU0QgZm9ybWF0LiAgIm1hZ2ljIiBmb3JjZXMKLQkJCWdwcm9mIHRvIHJlYWQgdGhlIGRhdGEgZmlsZXMgaW4gdGhlICJtYWdpYyIgZm9ybWF0LgotCi0tVAkJLS10cmFkaXRpb25hbAotLXYJCS0tdmVyc2lvbgotCi0qKiBGaWxlIEZvcm1hdCBDaGFuZ2VzCi0KLVRoZSBvbGQgQlNELWRlcml2ZWQgZm9ybWF0IHVzZWQgZm9yIHByb2ZpbGUgZGF0YSBkb2VzIG5vdCBjb250YWluIGEKLW1hZ2ljIGNvb2tpZSB0aGF0IGFsbG93cyB0byBjaGVjayB3aGV0aGVyIGEgZGF0YSBmaWxlIHJlYWxseSBpcyBhCi1ncHJvZiBmaWxlLiAgRnVydGhlcm1vcmUsIGl0IGRvZXMgbm90IHByb3ZpZGUgYSB2ZXJzaW9uIG51bWJlciwgdGh1cwotcmVuZGVyaW5nIGNoYW5nZXMgdG8gdGhlIGZpbGUgZm9ybWF0IGFsbW9zdCBpbXBvc3NpYmxlLiAgR05VIGdwcm9mCi11c2VzIGEgbmV3IGZpbGUgZm9ybWF0IHRoYXQgcHJvdmlkZXMgdGhlc2UgZmVhdHVyZXMuICBGb3IgYmFja3dhcmQKLWNvbXBhdGliaWxpdHksIEdOVSBncHJvZiBjb250aW51ZXMgdG8gc3VwcG9ydCB0aGUgb2xkIEJTRC1kZXJpdmVkCi1mb3JtYXQsIGJ1dCBub3QgYWxsIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQgd2l0aCBpdC4gIEZvciBleGFtcGxlLAotYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cyBjYW5ub3QgYmUgYWNjb21tb2RhdGVkIGJ5IHRoZSBvbGQgZmlsZQotZm9ybWF0LgotCi1UaGUgbmV3IGZpbGUgZm9ybWF0IGlzIGRlZmluZWQgaW4gaGVhZGVyIGZpbGUgXGZpbGV7Z21vbl9vdXQuaH0uICBJdAotY29uc2lzdHMgb2YgYSBoZWFkZXIgY29udGFpbmluZyB0aGUgbWFnaWMgY29va2llIGFuZCBhIHZlcnNpb24gbnVtYmVyLAotYXMgd2VsbCBhcyBzb21lIHNwYXJlIGJ5dGVzIGF2YWlsYWJsZSBmb3IgZnV0dXJlIGV4dGVuc2lvbnMuICBBbGwgZGF0YQotaW4gYSBwcm9maWxlIGRhdGEgZmlsZSBpcyBpbiB0aGUgbmF0aXZlIGZvcm1hdCBvZiB0aGUgaG9zdCBvbiB3aGljaAotdGhlIHByb2ZpbGUgd2FzIGNvbGxlY3RlZC4gIEdOVSBncHJvZiBhZGFwdHMgYXV0b21hdGljYWxseSB0byB0aGUKLWJ5dGUtb3JkZXIgaW4gdXNlLgotCi1JbiB0aGUgbmV3IGZpbGUgZm9ybWF0LCB0aGUgaGVhZGVyIGlzIGZvbGxvd2VkIGJ5IGEgc2VxdWVuY2Ugb2YKLXJlY29yZHMuICBDdXJyZW50bHksIHRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQgcmVjb3JkIHR5cGVzOiBoaXN0b2dyYW0KLXJlY29yZHMsIGNhbGwtZ3JhcGggYXJjIHJlY29yZHMsIGFuZCBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnQKLXJlY29yZHMuICBFYWNoIGZpbGUgY2FuIGNvbnRhaW4gYW55IG51bWJlciBvZiBlYWNoIHJlY29yZCB0eXBlLiAgV2hlbgotcmVhZGluZyBhIGZpbGUsIEdOVSBncHJvZiB3aWxsIGVuc3VyZSByZWNvcmRzIG9mIHRoZSBzYW1lIHR5cGUgYXJlCi1jb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlciBhbmQgY29tcHV0ZSB0aGUgdW5pb24gb2YgYWxsIHJlY29yZHMuICBGb3IKLWV4YW1wbGUsIGZvciBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzLCB0aGUgdW5pb24gaXMgc2ltcGx5IHRoZSBzdW0KLW9mIGFsbCBleGVjdXRpb24gY291bnRzIGZvciBlYWNoIGJhc2ljLWJsb2NrLgotCi0qKiogSGlzdG9ncmFtIFJlY29yZHMKLQotSGlzdG9ncmFtIHJlY29yZHMgY29uc2lzdCBvZiBhIGhlYWRlciB0aGF0IGlzIGZvbGxvd2VkIGJ5IGFuIGFycmF5IG9mCi1iaW5zLiAgVGhlIGhlYWRlciBjb250YWlucyB0aGUgdGV4dC1zZWdtZW50IHJhbmdlIHRoYXQgdGhlIGhpc3RvZ3JhbQotc3BhbnMsIHRoZSBzaXplIG9mIHRoZSBoaXN0b2dyYW0gaW4gYnl0ZXMgKHVubGlrZSBpbiB0aGUgb2xkIEJTRAotZm9ybWF0LCB0aGlzIGRvZXMgbm90IGluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIGhlYWRlciksIHRoZSByYXRlIG9mIHRoZQotcHJvZmlsaW5nIGNsb2NrLCBhbmQgdGhlIHBoeXNpY2FsIGRpbWVuc2lvbiB0aGF0IHRoZSBiaW4gY291bnRzCi1yZXByZXNlbnQgYWZ0ZXIgYmVpbmcgc2NhbGVkIGJ5IHRoZSBwcm9maWxpbmcgY2xvY2sgcmF0ZS4gIFRoZQotcGh5c2ljYWwgZGltZW5zaW9uIGlzIHNwZWNpZmllZCBpbiB0d28gcGFydHM6IGEgbG9uZyBuYW1lIG9mIHVwIHRvIDE1Ci1jaGFyYWN0ZXJzIGFuZCBhIHNpbmdsZSBjaGFyYWN0ZXIgYWJicmV2aWF0aW9uLiAgRm9yIGV4YW1wbGUsIGEKLWhpc3RvZ3JhbSByZXByZXNlbnRpbmcgcmVhbC10aW1lIHdvdWxkIHNwZWNpZnkgdGhlIGxvbmcgbmFtZSBhcwotInNlY29uZHMiIGFuZCB0aGUgYWJicmV2aWF0aW9uIGFzICJzIi4gIFRoaXMgZmVhdHVyZSBpcyB1c2VmdWwgZm9yCi1hcmNoaXRlY3R1cmVzIHRoYXQgc3VwcG9ydCBwZXJmb3JtYW5jZSBtb25pdG9yIGhhcmR3YXJlICh3aGljaCwKLWZvcnR1bmF0ZWx5LCBpcyBiZWNvbWluZyBpbmNyZWFzaW5nbHkgY29tbW9uKS4gIEZvciBleGFtcGxlLCB1bmRlciBERUMKLU9TRi8xLCB0aGUgInVwcm9maWxlIiBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHByb2R1Y2UgYSBoaXN0b2dyYW0gb2YsCi1zYXksIGluc3RydWN0aW9uIGNhY2hlIG1pc3Nlcy4gIEluIHRoaXMgY2FzZSwgdGhlIGRpbWVuc2lvbiBpbiB0aGUKLWhpc3RvZ3JhbSBoZWFkZXIgY291bGQgYmUgc2V0IHRvICJpLWNhY2hlIG1pc3NlcyIgYW5kIHRoZSBhYmJyZXZpYXRpb24KLWNvdWxkIGJlIHNldCB0byAiMSIgKGJlY2F1c2UgaXQgaXMgc2ltcGx5IGEgY291bnQsIG5vdCBhIHBoeXNpY2FsCi1kaW1lbnNpb24pLiAgQWxzbywgdGhlIHByb2ZpbGluZyByYXRlIHdvdWxkIGhhdmUgdG8gYmUgc2V0IHRvIDEgaW4KLXRoaXMgY2FzZS4KLQotSGlzdG9ncmFtIGJpbnMgYXJlIDE2LWJpdCBudW1iZXJzIGFuZCBlYWNoIGJpbiByZXByZXNlbnQgYW4gZXF1YWwKLWFtb3VudCBvZiB0ZXh0LXNwYWNlLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSB0ZXh0LXNlZ21lbnQgaXMgb25lCi10aG91c2FuZCBieXRlcyBsb25nIGFuZCBpZiB0aGVyZSBhcmUgdGVuIGJpbnMgaW4gdGhlIGhpc3RvZ3JhbSwgZWFjaAotYmluIHJlcHJlc2VudHMgb25lIGh1bmRyZWQgYnl0ZXMuCi0KLQotKioqIENhbGwtR3JhcGggUmVjb3JkcwotCi1DYWxsLWdyYXBoIHJlY29yZHMgaGF2ZSBhIGZvcm1hdCB0aGF0IGlzIGlkZW50aWNhbCB0byB0aGUgb25lIHVzZWQgaW4KLXRoZSBCU0QtZGVyaXZlZCBmaWxlIGZvcm1hdC4gIEl0IGNvbnNpc3RzIG9mIGFuIGFyYyBpbiB0aGUgY2FsbCBncmFwaAotYW5kIGEgY291bnQgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhcmMgd2FzIHRyYXZlcnNlZAotZHVyaW5nIHByb2dyYW0gZXhlY3V0aW9uLiAgQXJjcyBhcmUgc3BlY2lmaWVkIGJ5IGEgcGFpciBvZiBhZGRyZXNzZXM6Ci10aGUgZmlyc3QgbXVzdCBiZSB3aXRoaW4gY2FsbGVyJ3MgZnVuY3Rpb24gYW5kIHRoZSBzZWNvbmQgbXVzdCBiZQotd2l0aGluIHRoZSBjYWxsZWUncyBmdW5jdGlvbi4gIFdoZW4gcGVyZm9ybWluZyBwcm9maWxpbmcgYXQgdGhlCi1mdW5jdGlvbiBsZXZlbCwgdGhlc2UgYWRkcmVzc2VzIGNhbiBwb2ludCBhbnl3aGVyZSB3aXRoaW4gdGhlCi1yZXNwZWN0aXZlIGZ1bmN0aW9uLiAgSG93ZXZlciwgd2hlbiBwcm9maWxpbmcgYXQgdGhlIGxpbmUtbGV2ZWwsIGl0IGlzCi1iZXR0ZXIgaWYgdGhlIGFkZHJlc3NlcyBhcmUgYXMgY2xvc2UgdG8gdGhlIGNhbGwtc2l0ZS9lbnRyeS1wb2ludCBhcwotcG9zc2libGUuICBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIGxpbmUtbGV2ZWwgY2FsbC1ncmFwaCBpcyBhYmxlIHRvCi1pZGVudGlmeSBleGFjdGx5IHdoaWNoIGxpbmUgb2Ygc291cmNlIGNvZGUgcGVyZm9ybWVkIGNhbGxzIHRvIGEKLWZ1bmN0aW9uLgotCi0qKiogQmFzaWMtQmxvY2sgRXhlY3V0aW9uIENvdW50IFJlY29yZHMKLQotQmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50IHJlY29yZHMgY29uc2lzdCBvZiBhIGhlYWRlciBmb2xsb3dlZCBieSBhCi1zZXF1ZW5jZSBvZiBhZGRyZXNzL2NvdW50IHBhaXJzLiAgVGhlIGhlYWRlciBzaW1wbHkgc3BlY2lmaWVzIHRoZQotbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZS4gIEluIGFuIGFkZHJlc3MvY291bnQgcGFpciwgdGhlIGFkZHJlc3MKLWlkZW50aWZpZXMgYSBiYXNpYy1ibG9jayBhbmQgdGhlIGNvdW50IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRpbWVzCi10aGF0IGJhc2ljLWJsb2NrIHdhcyBleGVjdXRlZC4gIEFueSBhZGRyZXNzIHdpdGhpbiB0aGUgYmFzaWMtYWRkcmVzcyBjYW4KLWJlIHVzZWQuCi0KLUlNUExFTUVOVEFUSU9OIE5PVEU6IGdjYyAtYSBjYW4gYmUgdXNlZCB0byBpbnN0cnVtZW50IGEgcHJvZ3JhbSB0bwotcmVjb3JkIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMuICBIb3dldmVyLCB0aGUgX19iYl9leGl0X2Z1bmMoKQotdGhhdCBpcyBjdXJyZW50bHkgcHJlc2VudCBpbiBsaWJnY2MyLmMgZG9lcyBub3QgZ2VuZXJhdGUgYSBnbW9uLm91dAotZmlsZSBpbiBhIHN1aXRlYWJsZSBmb3JtYXQuICBUaGlzIHNob3VsZCBiZSBmaXhlZCBmb3IgZnV0dXJlIHJlbGVhc2VzCi1vZiBnY2MuICBJbiB0aGUgbWVhbnRpbWUsIGNvbnRhY3QgZGF2aWRtQGNzLmFyaXpvbmEuZWR1IGZvciBhIHZlcnNpb24KLW9mIF9fYmJfZXhpdF9mdW5jKCkgdG8gaXMgYXBwcm9wcmlhdGUuCmRpZmYgLS1naXQgYS9ncHJvZi9URVNUIGIvZ3Byb2YvVEVTVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhOTAzMC4uMDAwMDAwMAotLS0gYS9ncHJvZi9URVNUCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0tIGNoZWNrIHdoZXRoZXIgb2xkIGZpbGUgZm9ybWF0IGlzIHByb3Blcmx5IHJlYWQgd2hlbiBpbnB1dCBjb21lcyBmcm9tCi0gIHN0ZGluCi0KLS0gY2hlY2sgd2hldGhlciB1bmRlcnNjb3JlcyBhcmUgcHJvcGVybHkgZGVhbHQgd2l0aCAoYm90aCwgb24gc3lzdGVtcwotICB0aGF0IHByZXBlbmQgdGhlbSB0byBlYWNoIEMgbmFtZSBhbmQgb24gc3lzdGVtcyB0aGF0IGRvbid0KQotCi0tIGVuc3VyZSBncHJvZiBmYWlscyBncmFjZWZ1bGx5IHdoZW4gbm8gZGVidWdnaW5nIGluZm8gYXZhaWxhYmxlCmRpZmYgLS1naXQgYS9ncHJvZi9UT0RPIGIvZ3Byb2YvVE9ETwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxMTFjNi4uMDAwMDAwMAotLS0gYS9ncHJvZi9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotCi0tIGdtb25faW8uYyBjYW5ub3QgZGVhbCB3aXRoIHRhcmdldCBhcmNoaXRlY3R1cmUgdGhhdCBoYXZlIGEgcG9pbnRlciBzaXplCi0gIHRoYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGhvc3QgYXJjaGl0ZWN0dXJlcyBwb2ludGVyIHNpemUtLS1maXggdGhpcwotICAoZ21vbl9vdXQuaCwgYW5kIGdtb25faW8uYykKLS0gYWRkIHN1cHBvcnQgZm9yIHByb2YgZmlsZSBmb3JtYXQgc28gdGhhdCBwcm9mIGZpbGVzIGNhbiBiZSBkaXNwbGF5ZWQKLSAgYXQgdGhlIGxpbmUtbGV2ZWwgKHRoaXMgaXMgdXNlZnVsIGZvciB0aGUgdXByb2ZpbGUgdG9vbCB1bmRlciBERUMncwotICBPU0YvMSkKLS0gdGFrZSBhIGhhcmQgbG9vayBhdCAtLWZpbGUtb3JkZXJpbmcgKGJyb2tlbikgYW5kIC0tZnVuY3Rpb24tb3JkZXJpbmcKLQotKyBkb2N1bWVudGF0aW9uCi0rIG9wdGltaXplIGJmZF9maW5kX25lYXJlc3RfbGluZV9udW0oKSAob3IgcmVwbGFjZSBieSBkaWZmZXJlbnQgaW50ZXJmYWNlKQotKyBjbGVhbnVwIF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmVfbnVtKCkgZml4ZXMgJiBkZXNjcmlwdGlvbgotKyBlbnN1cmUgImNjIC1wZyIgcHJvZHVjZXMgZ29vZCBmaWxlcyB1bmRlciBPU0YvMSB2My4wCi0rIG1ha2Ugc3VyZSBncHJvZiB3b3JrcyB0b2dldGhlciB3aXRoIE9TRi8xIHYzLjAncyBwcm9maWxpbmcgbGlicmFyaWVzCi0rIGltcGxlbWVudCBzeW10YWJfcGFyc2UoKTsgbW9kaWZ5IHN5bV9sb29rdXAoKSB0byBjb25zaWRlciBhZGRyX2hpZ2gKLSsgY2hhbmdlIGdwcm9mLmMgdG8gY29sbGVjdCBsaXN0cywgdGhlbiBpbnZva2Ugc3ltdGFiX3BhcnNlKCkgZm9yCi0gIGVhY2ggbGlzdAotKyBRdWVzdGlvbnM6Ci0JbyBpcyAtYyAoLS1zdGF0aWMtY2FsbC1ncmFwaCkgdXNlZnVsIGF0IGFsbD8gIGkgY2FuJ3Qgc2VlCi0JICBob3c7IGlmIGl0IHdlcmUgZGVsZXRlZCwgZ3Byb2Ygd291bGQgYmUgY29tcGxldGVseSBtYWNoaW5lCi0JICBpbmRlcGVuZGVudCA9PiB5dXAsIGl0IGlzCi0JbyBhcmUgKGxvbmcpIG9wdGlvbiBuYW1lcyBhcHByb3ByaWF0ZT8KLQlvIC1rICgtLWV4Y2x1ZGUtYXJjKSBjYW5ub3QgYmUgaW1wbGVtZW50ZWQgd2l0aCBnZXRvcHQoKTsKLQkgIGlzIG5ldyBzeW50YXggKC1rIGZyb20vdG8pIGFjY2VwdGFibGU/ICBJZiBub3QsIGhvdyB0bwotCSAgZml4IGl0PwotCW8gaW4gdGhlIEZTRiBvdXRwdXQsIHRoZSBjYWxsLWdyYXBoIGluZGV4IG5vdyBwcmludHMKLQkgIHRoZSBmaWxlbmFtZSBvZiBzdGF0aWMgZnVuY3Rpb25zIGluIHBhcmVudGhlc2VzOyBlLmcuLAotCSAgc3RhdGljIGZ1bmN0aW9uIGZvbygpIHRoYXQgaXMgZGVmaW5lZCBpbiBmaWxlIGJhci5jCi0JICB3b3VsZCBiZSBwcmludGVkIGFzOgotCi0JCQlbNF0gZm9vIChiYXIuYykKLQotCSAgaXMgdGhpcyBhY2NlcHRhYmxlPyAgc2hvdWxkIGl0IGJlIGRvbmUgb25seSBvcHRpb25hbGx5PwotCW8gc3ltYm9scyB3aXRoIGFkZHJlc3NlcyB0aGF0IG1hcCBiYWNrIHRvIGEgZGlmZmVyZW50Ci0JICBuYW1lIGFyZSBzdXBwcmVzc2VkIChoYXBwZW5zIHdpdGggbGFiZWxzLCBmb3IgZXhhbXBsZSk7Ci0JICBpcyB0aGlzIGFjY2VwdGFibGU/ICBzaG91bGQgaXQgYmUgZG9uZSBvbmx5IG9wdGlvbmFsbHk/Ci0rIGdlbmVyYWxpemUgdG8gYWxsb3cgYXJiaXRyYXJ5IGhpc3RvZ3JhbXMgKG5vdCBqdXN0IHRpbWUgaGlzdG9ncmFtcykKLSsgYmFzaWMtYmxvY2sgaW5mb3JtYXRpb24gY3VycmVudGx5IHJlcGxhY2VzIGFsbCBzeW1ib2xzIGNyZWF0ZWQgZnJvbQotICB0aGUgY29yZSBiZWNhdXNlIG9mIGFuIHVnbHkgb3JkZXJpbmcgY29uZmxpY3QtLS1mb3Igbm93LCB0aGUgY3VycmVudAotICBzb2x1dGlvbiB3b3JrcywgYnV0IHNvbWV0aGluZyBjbGVhbmVyIGlzIGRlc2lyYWJsZSA9PT4gY2xlYW5lZCB1cCwKLSAgYnV0IGl0J3Mgc2xvd2VyIG5vdwotKyBjb252ZXJ0IHRvIHZlcnkgbmV3IGZpbGUgZm9ybWF0IChiYWNrIHRvIHRyaXZpYWwgZm9ybWF0LCB0aGF0IGlzIDopCi0rIHJlcGxhY2UgImR1bW15LmgiIGZvciBBbHBoYSAoaWYgdGhlcmUgaXMgYW55IHVzZSB0byBpdCkKLSsgYWRkIHN1cHBvcnQgZm9yIGV4ZWN1dGlvbiB0aW1lIHByb2ZpbGluZyBhdCBhIGJhc2ljLWJsb2NrIGxldmVsCi0rIGZpeCBmaWxlbmFtZS1vZmYtYnktb25lIGJ1ZyBmb3IgQWxwaGEgKHNlZSB+L3RtcC9kLltjaF0pLS0tbm8gbG9uZ2VyCi0gIHJlbGV2YW50Ci0rICItcGcgLWEiIGRvZXNuJ3Qgd29yayBhcyBleHBlY3RlZCBiZWNhdXNlIG1jbGVhbnVwKCkgd2lsbCBvdmVyd3JpdGUKLSAgdGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IF9fYmJfZXhpdF9mdW5jKCkgKG9yIHZpY2UgdmVyc2EpCi0rIGZpcnN0IGJhc2ljLWJsb2NrIG9mIGZhYygpIHNlZW1zIHRvIGdldCBjcmVkaXRlZCB0byBsYXN0IGJhc2ljLWJsb2NrCi0gIG9mIHByZXZpb3VzIGZ1bmN0aW9uID0+IGJ1ZyBpbiBiYXNpY19ibG9ja3MuYwotKyBmbGF0IHByb2ZpbGUgc2hvdWxkIHByb3ZpZGUgYXV0b21hdGljIHNjYWxpbmcgZm9yIHBlci1jYWxsIHRpbWVzIGJlY2F1c2UKLSAgb3RoZXJ3aXNlIHRoZXknbGwgYWx3YXlzIGJlIHplcm8gb24gYSBmYXN0IG1hY2hpbmUgd2l0aCB0b25zIG9mIHNtYWxsCi0gIGZ1bmN0aW9ucwotKyBtYWtlICItYSIgaW1wbHkgdG8gcmV0YWluIGxpbmUgbnVtYmVyIGluZm8gKHdpdGhvdXQgYWN0dWFsbHkgZ2VuZXJhdGluZwotICB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uICh1bmxlc3MgLWcgaXMgc3BlY2lmaWVkKS0tLW5vLCB0aGlzIGlzIGEKLSAgYmFkIGlkZWEsIGJlY2F1c2UgaXQgaXMgbm90IGNsZWFyIHdoYXQgbGV2ZWwgb2YgZGVidWdnaW5nIGluZm8gc2hvdWxkCi0gIGJlIHJlcXVlc3RlZCAoZS5nLiwgLWcgdnMuIC1nMyk7IGxlYXZpbmcgaXQgdXAgdG8gdGhlIHVzZXIgc2VlbXMgYmVzdAotKyBhZGQgbG9uZyBvcHRpb25zIHN1cHBvcnQgKG9yIGF0IGxlYXN0IHVzZSBnZXRvcHQgaW5zdGVhZCBvZiBhZC1ob2MKLSAgaW1wbGVtZW50YXRpb24pCi0rIHNwbGl0IGludG8gZmlsZXMgYWNjb3JkaW5nIHRvIGFic3RyYWN0IG9iamVjdHMgdGhhdCBhcmUgbWFuaXB1bGF0ZWQKLSsgcmVwbGFjZSBzY2NzaWQgYnkgcmNzaWQgJiBhZGQgImVuZCBvZiAuLi4iIHRvIGV2ZXJ5IC5jIGZpbGUKLSsgdXNlIERCRygpIGV2ZXJ5d2hlcmUKLSsgZml4IHNwYWNpbmcgKCIgLCIgLT4gIiwiIGV0Yy4pCi0rIHVzZSBERUZVTnMgZXZlcnl3aGVyZQotKyBtYWtlIGNvbXBpbGUgY2xlYW5seSB3aXRoIC1XYWxsCi0rICJnY2MgLXBnIC1PMiIgZG9lc24ndCB3b3JrIG9uIHRlY2MuYyB1bmxlc3MgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgaXMKLSAgc3BlY2lmaWVkOyBmaW5kIG91dCB3aHkKLSsgbWFrZSB0aGluZ3MgcG9ydGFibGUgKHByb3RvdHlwZXMsIGNvbnN0LCBldGMuKQotKyBpZiBORVdfR01PTl9PVVQgaXMgbm90IGRlZmluZWQsIGhhdmUgYSBmbGFnIHRoYXQgd2lsbCBhbGxvdyB0bwotICByZWFkIG5ldyBnbW9uLm91dCBzdHlsZSBmaWxlcy4gIFRoZSBpZGVhIGJlaW5nIHRoYXQgZXZlcnlvbmUKLSAgd2lsbCB1c2UgdGhlIG5ldyBmb3JtYXQgZm9yIGJhc2ljLWJsb2NrIHN0eWxlIHByb2ZpbGluZyBidXQKLSAgdGhlIG9sZCBmb3JtYXQgZm9yIHJlZ3VsYXIgZ3Bwcm9maWxpbmcKZGlmZiAtLWdpdCBhL2dwcm9mL2FjbG9jYWwubTQgYi9ncHJvZi9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDIwMTIyLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTA5ICswLDAgQEAKLWRubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS40Ci0KLWRubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLWRubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi1kbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi1kbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1kbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLWRubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi1kbmwgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2ggLS0KLSMgc29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLgotIyBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KLQotIyBzZXJpYWwgMQotCi1kbmwgVXNhZ2U6Ci1kbmwgQU1fSU5JVF9BVVRPTUFLRShwYWNrYWdlLHZlcnNpb24sIFtuby1kZWZpbmVdKQotCi1BQ19ERUZVTihBTV9JTklUX0FVVE9NQUtFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pCi1QQUNLQUdFPVskMV0KLUFDX1NVQlNUKFBBQ0tBR0UpCi1WRVJTSU9OPVskMl0KLUFDX1NVQlNUKFZFUlNJT04pCi1kbmwgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCi1maQotaWZlbHNlKFskM10sLAotQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSkpCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKQotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKQotZG5sIEZJWE1FIFRoaXMgaXMgdHJ1bHkgZ3Jvc3MuCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvLCAkbWlzc2luZ19kaXIpCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSldKQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLgotIwotCi1BQ19ERUZVTihBTV9TQU5JVFlfQ0hFQ0ssCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICJbJF0qIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiWyRdKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICJbJF0qIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCi0gICBmaQotCi0gICB0ZXN0ICJbJF0yIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCi1maQotcm0gLWYgY29uZnRlc3QqCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi1kbmwgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0sIERJUkVDVE9SWSkKLWRubCBUaGUgcHJvZ3JhbSBtdXN0IHByb3Blcmx5IGltcGxlbWVudCAtLXZlcnNpb24uCi1BQ19ERUZVTihBTV9NSVNTSU5HX1BST0csCi1bQUNfTVNHX0NIRUNLSU5HKGZvciB3b3JraW5nICQyKQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKCQyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgJDE9JDIKLSAgIEFDX01TR19SRVNVTFQoZm91bmQpCi1lbHNlCi0gICAkMT0iJDMvbWlzc2luZyAkMiIKLSAgIEFDX01TR19SRVNVTFQobWlzc2luZykKLWZpCi1BQ19TVUJTVCgkMSldKQotCi0KLSMgc2VyaWFsIDM1IEFDX1BST0dfTElCVE9PTAotQUNfREVGVU4oQUNfUFJPR19MSUJUT09MLAotW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLUFDX0NBQ0hFX1NBVkUKLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCBBQ19NU0dfRVJST1IoW2xpYnRvb2wgY29uZmlndXJlIGZhaWxlZF0pCi0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLUFDX0NBQ0hFX0xPQUQKLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLUFDX1NVQlNUKExJQlRPT0wpZG5sCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLV0pCi0KLUFDX0RFRlVOKEFDX0xJQlRPT0xfU0VUVVAsCi1bQUNfUFJFUkVRKDIuMTMpZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU0hBUkVEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TVEFUSUNdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAotZG5sCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKLSAgICBbQUNfVFJZX0xJTksoW10sW10sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pXSkKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gIEFDX1NZU19MSUJUT09MX0NZR1dJTgotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi1BQ19BUkdfRU5BQkxFKGxpYnRvb2wtbG9jaywKLVsgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZ10sCi1uZWVkX2xvY2tzPSRlbmFibGV2YWwsCi1uZWVkX2xvY2tzPXllcykKLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi1dKQotCi0jIEFDX0xJQlRPT0xfRExPUEVOIC0gY2hlY2sgZm9yIGRsb3BlbiBzdXBwb3J0Ci1BQ19ERUZVTihBQ19MSUJUT09MX0RMT1BFTiwgW2x0X2Rsb3Blbj15ZXNdKQotCi0jIEFDX0VOQUJMRV9TSEFSRUQgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU0hBUkVEWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TSEFSRUQsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc2hhcmVkLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc2hhcmVkPUFDX0VOQUJMRV9TSEFSRURfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TSEFSRUQgLSBzZXQgdGhlIGRlZmF1bHQgc2hhcmVkIGZsYWcgdG8gLS1kaXNhYmxlLXNoYXJlZAotQUNfREVGVU4oQUNfRElTQUJMRV9TSEFSRUQsCi1bQUNfRU5BQkxFX1NIQVJFRChubyldKQotCi0jIEFDX0VOQUJMRV9TVEFUSUMgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU1RBVElDWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TVEFUSUMsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc3RhdGljLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc3RhdGljPUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TVEFUSUMgLSBzZXQgdGhlIGRlZmF1bHQgc3RhdGljIGZsYWcgdG8gLS1kaXNhYmxlLXN0YXRpYwotQUNfREVGVU4oQUNfRElTQUJMRV9TVEFUSUMsCi1bQUNfRU5BQkxFX1NUQVRJQyhubyldKQotCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9GQVNUX0lOU1RBTExbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCwKLVtkZWZpbmUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShmYXN0LWluc3RhbGwsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PT4+QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX2Zhc3RfaW5zdGFsbD1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBzZXQgdGhlIGRlZmF1bHQgdG8gLS1kaXNhYmxlLWZhc3QtaW5zdGFsbAotQUNfREVGVU4oQUNfRElTQUJMRV9GQVNUX0lOU1RBTEwsCi1bQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTChubyldKQotCi0KLSMgQUNfUFJPR19MRCAtIGZpbmQgdGhlIHBhdGggdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgotQUNfREVGVU4oQUNfUFJPR19MRCwKLVtBQ19BUkdfV0lUSChnbnUtbGQsCi1bICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dXSwKLXRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcywgd2l0aF9nbnVfbGQ9bm8pCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5IEdDQ10pCi0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi1jaGFuZ2VxdW90ZSgsKWRubAotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotY2hhbmdlcXVvdGUoWyxdKWRubAotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCi1lbHNlCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQotZmkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX0xELAotW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maV0pCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoJExEKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLXRlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCi1BQ19TVUJTVChMRCkKLUFDX1BST0dfTERfR05VCi1dKQotCi1BQ19ERUZVTihBQ19QUk9HX0xEX0dOVSwKLVtBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBhY19jdl9wcm9nX2dudV9sZCwKLVsjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpXSkKLV0pCi0KLSMgQUNfUFJPR19OTSAtIGZpbmQgdGhlIHBhdGggdG8gYSBCU0QtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgotQUNfREVGVU4oQUNfUFJPR19OTSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBCU0QtY29tcGF0aWJsZSBubV0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9OTSwKLVtpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpXSkKLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLUFDX01TR19SRVNVTFQoWyROTV0pCi1BQ19TVUJTVChOTSkKLV0pCi0KLSMgQUNfU1lTX05NX1BBUlNFIC0gQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkCi0jIGJ5IEMgc3ltYm9sIG5hbWUgZnJvbSBubS4KLUFDX0RFRlVOKEFDX1NZU19OTV9QQVJTRSwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1BQ19NU0dfQ0hFQ0tJTkcoW2NvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dF0pCi1BQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSwKLVsjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLWNoYW5nZXF1b3RlKCwpZG5sCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1hY19zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLWFjX3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLWFjX3N5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgYWNfc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KikKLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikKLSAgYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIDs7Ci1pcml4KikKLSAgYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBhY19zeW1jb2RlPSdbQkRUXScKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi1maQotY2hhbmdlcXVvdGUoWyxdKWRubAotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbIAldXCgkYWNfc3ltY29kZVwpWyAJXVsgCV0qXCgkYWNfc3ltcHJmeFwpJGFjX3N5bXBhdCQvJGFjX3N5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIGFjX3BpcGVfd29ya3M9bm8KLSAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotCi0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLQotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRhY19ubGlzdCIgfCB1bmlxID4gIiRhY19ubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRhY19ubGlzdCJUICIkYWNfbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRhY19ubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jJwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWNoYW5nZXF1b3RlKCwpZG5sCi1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLWNoYW5nZXF1b3RlKFssXSlkbmwKLXsKLUVPRgotCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYwotCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKLQkgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0JICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgYWNfcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0JICAgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0gICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotICAgIGZpCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi1dKQotCi1hY19yZXN1bHQ9eWVzCi1pZiB0ZXN0IC16ICIkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgIGFjX3Jlc3VsdD1ubwotZmkKLUFDX01TR19SRVNVTFQoJGFjX3Jlc3VsdCkKLV0pCi0KLSMgQUNfU1lTX0xJQlRPT0xfQ1lHV0lOIC0gZmluZCB0b29scyBuZWVkZWQgb24gY3lnd2luCi1BQ19ERUZVTihBQ19TWVNfTElCVE9PTF9DWUdXSU4sCi1bQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKLUFDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKLV0pCi0KLSMgQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFIC0gZG9lcyB0aGUgY29tcGlsZXIgcHJlZml4IGdsb2JhbCBzeW1ib2xzCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYW4gdW5kZXJzY29yZT8KLUFDX0RFRlVOKEFDX1NZU19TWU1CT0xfVU5ERVJTQ09SRSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19OTV9QQVJTRV0pZG5sCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUsCi1bYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi12b2lkIG5tX3Rlc3RfZnVuYygpe30KLWludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0gICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgotICAgIGlmIGVncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgaWYgZWdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0gIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLWZpCi1ybSAtcmYgY29uZnRlc3QqCi1dKQotQUNfTVNHX1JFU1VMVCgkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlKQotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotQUNfU1VCU1QoVVNFX1NZTUJPTF9VTkRFUlNDT1JFKWRubAotXSkKLQotIyBBQ19DSEVDS19MSUJNIC0gY2hlY2sgZm9yIG1hdGggbGlicmFyeQotQUNfREVGVU4oQUNfQ0hFQ0tfTElCTSwgWwotQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCkKLUFDX0NIRUNLX0xJQihtLCBjb3MpCi1dKQotCi0jIEFDX0xJQkxURExfQ09OVkVOSUVOQ0VbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBhZGRzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLUFDX0RFRlVOKEFDX0xJQkxURExfQ09OVkVOSUVOQ0UsIFsKLSAgY2FzZSAiJGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlIiBpbgotICBubykgQUNfTVNHX0VSUk9SKFt0aGlzIHBhY2thZ2UgbmVlZHMgYSBjb252ZW5pZW5jZSBsaWJsdGRsXSkgOzsKLSAgIiIpIGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlPXllcwotICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIiA7OwotICBlc2FjCi0gIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsYy5sYQotXSkKLQotIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgaW5zdGFsbGFibGUgbGlicmFyeSwgYW5kIGFkZHMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi0jIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KLUFDX0RFRlVOKEFDX0xJQkxURExfSU5TVEFMTEFCTEUsIFsKLSAgQUNfQ0hFQ0tfTElCKGx0ZGwsIG1haW4sIExJQkxUREw9Ii1sbHRkbCIsIFsKLSAgICBjYXNlICIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgaW4KLSAgICBubykgQUNfTVNHX1dBUk4oW2xpYmx0ZGwgbm90IGluc3RhbGxlZCwgYnV0IGluc3RhbGxhdGlvbiBkaXNhYmxlZF0pIDs7Ci0gICAgIiIpIGVuYWJsZV9sdGRsX2luc3RhbGw9eWVzCi0gICAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsIiA7OwotICAgIGVzYWMKLSAgXSkKLSAgaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiAhPSB4Im5vIjsgdGhlbgotICAgIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsLmxhCi0gIGZpCi1dKQotCi1kbmwgb2xkIG5hbWVzCi1BQ19ERUZVTihBTV9QUk9HX0xJQlRPT0wsIFtpbmRpcihbQUNfUFJPR19MSUJUT09MXSldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19FTkFCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRU5BQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19ESVNBQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NUQVRJQywgW2luZGlyKFtBQ19ESVNBQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX0xELCBbaW5kaXIoW0FDX1BST0dfTERdKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX05NLCBbaW5kaXIoW0FDX1BST0dfTk1dKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfTk1fUEFSU0UsIFtpbmRpcihbQUNfU1lTX05NX1BBUlNFXSldKWRubAotQUNfREVGVU4oQU1fU1lTX1NZTUJPTF9VTkRFUlNDT1JFLCBbaW5kaXIoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19MSUJUT09MX0NZR1dJTiwgW2luZGlyKFtBQ19TWVNfTElCVE9PTF9DWUdXSU5dKV0pZG5sCi0KLSMgTGlrZSBBQ19DT05GSUdfSEVBREVSLCBidXQgYXV0b21hdGljYWxseSBjcmVhdGUgc3RhbXAgZmlsZS4KLQotQUNfREVGVU4oQU1fQ09ORklHX0hFQURFUiwKLVtBQ19QUkVSRVEoWzIuMTJdKQotQUNfQ09ORklHX0hFQURFUihbJDFdKQotZG5sIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCi1kbmwgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCi1kbmwgdGhhdCBpcyBnZW5lcmF0ZWQuICBXZSBtdXN0IHN0cmlwIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgZmlyc3QgIjoiLAotZG5sIGFuZCBldmVyeXRoaW5nIHBhc3QgdGhlIGxhc3QgIi8iLgotQUNfT1VUUFVUX0NPTU1BTkRTKGNoYW5nZXF1b3RlKDw8LD4+KWRubAotaWZlbHNlKHBhdHN1YnN0KDw8JDE+PiwgPDxbXiBdPj4sIDw8Pj4pLCA8PD4+LAotPDx0ZXN0IC16ICI8PCQ+PkNPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHBhdHN1YnN0KDw8JDE+PiwgPDxeXChbXjpdKi9cKT8uKj4+LCA8PFwxPj4pc3RhbXAtaDw8Pj5kbmw+PiwKLTw8YW1faW5keD0xCi1mb3IgYW1fZmlsZSBpbiA8PCQxPj47IGRvCi0gIGNhc2UgIiA8PCQ+PkNPTkZJR19IRUFERVJTICIgaW4KLSAgKiIgPDwkPj5hbV9maWxlICIqPDwpPj4KLSAgICBlY2hvIHRpbWVzdGFtcCA+IGBlY2hvIDw8JD4+YW1fZmlsZSB8IHNlZCAtZSAncyU6LiolJScgLWUgJ3MlW14vXSokJSUnYHN0YW1wLWgkYW1faW5keAotICAgIDs7Ci0gIGVzYWMKLSAgYW1faW5keD1gZXhwciAiPDwkPj5hbV9pbmR4IiArIDFgCi1kb25lPDw+PmRubD4+KQotY2hhbmdlcXVvdGUoWyxdKSldKQotCi0jIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKLSMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KLQotIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMwotCi1BQ19ERUZVTihDWV9XSVRIX05MUywKLSAgW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICBkbmwgRGVmYXVsdCBpcyBlbmFibGVkIE5MUwotICAgIEFDX0FSR19FTkFCTEUobmxzLAotICAgICAgWyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydF0sCi0gICAgICBVU0VfTkxTPSRlbmFibGV2YWwsIFVTRV9OTFM9eWVzKQotICAgIEFDX01TR19SRVNVTFQoJFVTRV9OTFMpCi0gICAgQUNfU1VCU1QoVVNFX05MUykKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICBkbmwgSWYgd2UgdXNlIE5MUyBmaWd1cmUgb3V0IHdoYXQgbWV0aG9kCi0gICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIEFDX0RFRklORShFTkFCTEVfTkxTLCAxLCBbRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfQVJHX1dJVEgoaW5jbHVkZWQtZ2V0dGV4dCwKLSAgICAgICAgWyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmVdLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vKQotICAgICAgQUNfTVNHX1JFU1VMVCgkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCkKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIFVzZXIgZG9lcyBub3QgaW5zaXN0IG9uIHVzaW5nIEdOVSBOTFMgbGlicmFyeS4gIEZpZ3VyZSBvdXQgd2hhdAotICAgICAgICBkbmwgdG8gdXNlLiAgSWYgZ2V0dGV4dCBvciBjYXRnZXRzIGFyZSBhdmFpbGFibGUgKGluIHRoaXMgb3JkZXIpIHdlCi0gICAgICAgIGRubCB1c2UgdGhpcy4gIEVsc2Ugd2UgaGF2ZSB0byBmYWxsIGJhY2sgdG8gR05VIE5MUyBsaWJyYXJ5LgotCWRubCBjYXRnZXRzIGlzIG9ubHkgdXNlZCBpZiBwZXJtaXR0ZWQgYnkgb3B0aW9uIC0td2l0aC1jYXRnZXRzLgotCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlBQ19DSEVDS19IRUFERVIobGliaW50bC5oLAotCSAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJjXSwgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMsCi0JICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxpYmludGwuaD5dLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JICAgICAgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcywgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8pXSkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIEFDX0NIRUNLX0xJQihpbnRsLCBiaW5kdGV4dGRvbWFpbiwKLQkgICAgICAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsLAotCQkgW0FDX1RSWV9MSU5LKFtdLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMsCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubyldKV0pCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgQUNfREVGSU5FKEhBVkVfR0VUVEVYVCwgMSwKLQkJCVtEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC5dKQotCSAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JCVt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbm8pZG5sCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlBQ19DSEVDS19GVU5DUyhkY2dldHRleHQpCi0JCUFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotCQlBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0JCUFDX1RSWV9MSU5LKCwgW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cl0sCi0JCSAgW0NBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlXSwKLQkJICBbQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWJdKQotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JXSkKLQotCWRubCBJbiB0aGUgc3RhbmRhcmQgZ2V0dGV4dCwgd2Ugd291bGQgbm93IGNoZWNrIGZvciBjYXRnZXRzLgotICAgICAgICBkbmwgSG93ZXZlciwgd2UgbmV2ZXIgd2FudCB0byB1c2UgY2F0Z2V0cyBmb3Igb3VyIHJlbGVhc2VzLgotCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICBkbmwgTmVpdGhlciBnZXR0ZXh0IG5vciBjYXRnZXRzIGluIGluY2x1ZGVkIGluIHRoZSBDIGxpYnJhcnkuCi0JICBkbmwgRmFsbCBiYWNrIG9uIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCi0JICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIEdOVSBOTFMgbGlicmFyeS4KLSAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbXNnZm10KQotICAgICAgICBBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0gICAgICAgIEFDX1NVQlNUKE1TR0ZNVCkKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICBkbmwgVGVzdCB3aGV0aGVyIHdlIHJlYWxseSBmb3VuZCBHTlUgeGdldHRleHQuCi0gICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCWRubCBJZiBpdCBpcyBubyBHTlUgeGdldHRleHQgd2UgZGVmaW5lIGl0IGFzIDogc28gdGhhdCB0aGUKLQlkbmwgTWFrZWZpbGVzIHN0aWxsIGNhbiB3b3JrLgotCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIEFDX01TR19SRVNVTFQoCi0JICAgIFtmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXRdKQotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICBkbmwgVGhlc2UgcnVsZXMgYXJlIHNvbGVseSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBnb2FsLiAgV2hpbGUgZG9pbmcgdGhpcwotICAgIGRubCB3ZSBvbmx5IGhhdmUgdG8ga2VlcCBleGFjdGx5IG9uZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgY2F0YWxvZ3MKLSAgICBkbmwgaW4gY29uZmlndXJlLmluLgotICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgZG5sIE1ha2UgYWxsIHZhcmlhYmxlcyB3ZSB1c2Uga25vd24gdG8gYXV0b2NvbmYuCi0gICAgQUNfU1VCU1QoVVNFX0lOQ0xVREVEX0xJQklOVEwpCi0gICAgQUNfU1VCU1QoQ0FUQUxPR1MpCi0gICAgQUNfU1VCU1QoQ0FUT0JKRVhUKQotICAgIEFDX1NVQlNUKERBVEFESVJOQU1FKQotICAgIEFDX1NVQlNUKEdNT0ZJTEVTKQotICAgIEFDX1NVQlNUKElOU1RPQkpFWFQpCi0gICAgQUNfU1VCU1QoSU5UTERFUFMpCi0gICAgQUNfU1VCU1QoSU5UTExJQlMpCi0gICAgQUNfU1VCU1QoSU5UTE9CSlMpCi0gICAgQUNfU1VCU1QoUE9GSUxFUykKLSAgICBBQ19TVUJTVChQT1NVQikKLSAgXSkKLQotQUNfREVGVU4oQ1lfR05VX0dFVFRFWFQsCi0gIFtBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSVNDX1BPU0lYXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0hFQURFUl9TVERDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfQ09OU1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19JTkxJTkVdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9PRkZfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX1NJWkVfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX0FMTE9DQV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX01NQVBdKWRubAotCi0gICBBQ19DSEVDS19IRUFERVJTKFthcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaF0pCi0gICBBQ19DSEVDS19GVU5DUyhbZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dF0pCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgQUNfQ0hFQ0tfRlVOQ1Moc3RwY3B5KQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIEFDX0RFRklORShIQVZFX1NUUENQWSwgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uXSkKLSAgIGZpCi0KLSAgIEFNX0xDX01FU1NBR0VTCi0gICBDWV9XSVRIX05MUwotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkKQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgQUNfTVNHX1JFU1VMVCgkTElOR1VBUykKLSAgICAgZmkKLQotICAgICBkbmwgQ29uc3RydWN0IGxpc3Qgb2YgbmFtZXMgb2YgY2F0YWxvZyBmaWxlcyB0byBiZSBjb25zdHJ1Y3RlZC4KLSAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgZG5sIFRoZSByZWZlcmVuY2UgdG8gPGxvY2FsZS5oPiBpbiB0aGUgaW5zdGFsbGVkIDxsaWJpbnRsLmg+IGZpbGUKLSAgIGRubCBtdXN0IGJlIHJlc29sdmVkIGJlY2F1c2Ugd2UgY2Fubm90IGV4cGVjdCB0aGUgdXNlcnMgb2YgdGhpcwotICAgZG5sIHRvIGRlZmluZSBIQVZFX0xPQ0FMRV9ILgotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICBBQ19TVUJTVChJTkNMVURFX0xPQ0FMRV9IKQotCi0gICBkbmwgRGV0ZXJtaW5lIHdoaWNoIGNhdGFsb2cgZm9ybWF0IHdlIGhhdmUgKGlmIGFueSBpcyBuZWVkZWQpCi0gICBkbmwgRm9yIG5vdyB3ZSBrbm93IGFib3V0IHR3byBkaWZmZXJlbnQgZm9ybWF0czoKLSAgIGRubCAgIExpbnV4IGxpYmMtNSBhbmQgdGhlIG5vcm1hbCBYL09wZW4gZm9ybWF0Ci0gICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L3ZlcnNpb24uaCwgbXNnZm9ybWF0PWxpbnV4LCBtc2dmb3JtYXQ9eG9wZW4pCi0KLQkgZG5sIFRyYW5zZm9ybSB0aGUgU0VEIHNjcmlwdHMgd2hpbGUgY29weWluZyBiZWNhdXNlIHNvbWUgZHVtYiBTRURzCi0gICAgICAgICBkbmwgY2Fubm90IGhhbmRsZSBjb21tZW50cy4KLQkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgZG5sIHBvMnRibC5zZWQgaXMgYWx3YXlzIG5lZWRlZC4KLSAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICBkbmwgSW4gdGhlIGludGwvTWFrZWZpbGUuaW4gd2UgaGF2ZSBhIHNwZWNpYWwgZGVwZW5kZW5jeSB3aGljaCBtYWtlcwotICAgZG5sIG9ubHkgc2Vuc2UgZm9yIGdldHRleHQuICBXZSBjb21tZW50IHRoaXMgb3V0IGZvciBub24tZ2V0dGV4dAotICAgZG5sIHBhY2thZ2VzLgotICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIEFDX1NVQlNUKEdUX05PKQotICAgQUNfU1VCU1QoR1RfWUVTKQotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICBBQ19TVUJTVChNS0lOU1RBTExESVJTKQotCi0gICBkbmwgKioqIEZvciBub3cgdGhlIGxpYnRvb2wgc3VwcG9ydCBpbiBpbnRsL01ha2VmaWxlIGlzIG5vdCBmb3IgcmVhbC4KLSAgIGw9Ci0gICBBQ19TVUJTVChsKQotCi0gICBkbmwgR2VuZXJhdGUgbGlzdCBvZiBmaWxlcyB0byBiZSBwcm9jZXNzZWQgYnkgeGdldHRleHQgd2hpY2ggd2lsbAotICAgZG5sIGJlIGluY2x1ZGVkIGluIHBvL01ha2VmaWxlLiAgQnV0IG9ubHkgZG8gdGhpcyBpZiB0aGUgcG8gZGlyZWN0b3J5Ci0gICBkbmwgZXhpc3RzIGluIHNyY2Rpci4KLSAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICBdKQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1kbmwgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChWQVJJQUJMRSwgUFJPRy1UTy1DSEVDSy1GT1IsCi1kbmwgICBURVNULVBFUkZPUk1FRC1PTi1GT1VORF9QUk9HUkFNIFssIFZBTFVFLUlGLU5PVC1GT1VORCBbLCBQQVRIXV0pCi1BQ19ERUZVTihBTV9QQVRIX1BST0dfV0lUSF9URVNULAotWyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJDIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICQyOyBhY193b3JkPVskXTIKLUFDX01TR19DSEVDS0lORyhbZm9yICRhY193b3JkXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoXyQxLAotW2Nhc2UgIlskXSQxIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF8kMT0iWyRdJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluIGlmZWxzZShbJDVdLCAsICRQQVRILCBbJDVdKTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgWyQzXTsgdGhlbgotCWFjX2N2X3BhdGhfJDE9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWRubCBJZiBubyA0dGggYXJnIGlzIGdpdmVuLCBsZWF2ZSB0aGUgY2FjaGUgdmFyaWFibGUgdW5zZXQsCi1kbmwgc28gQUNfUEFUSF9QUk9HUyB3aWxsIGtlZXAgbG9va2luZy4KLWlmZWxzZShbJDRdLCAsICwgWyAgdGVzdCAteiAiWyRdYWNfY3ZfcGF0aF8kMSIgJiYgYWNfY3ZfcGF0aF8kMT0iJDQiCi1dKWRubAotICA7OwotZXNhY10pZG5sCi0kMT0iJGFjX2N2X3BhdGhfJDEiCi1pZiB0ZXN0IC1uICJbJF0kMSI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVChbJF0kMSkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi1BQ19TVUJTVCgkMSlkbmwKLV0pCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTENfTUVTU0FHRVMsCi0gIFtpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIExDX01FU1NBR0VTXSwgYW1fY3ZfdmFsX0xDX01FU1NBR0VTLAotICAgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bG9jYWxlLmg+XSwgW3JldHVybiBMQ19NRVNTQUdFU10sCi0gICAgICAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcywgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vKV0pCi0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoSEFWRV9MQ19NRVNTQUdFUywgMSwKLQkJW0RlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuXSkKLSAgICBmaQotICBmaV0pCi0KLSMgQWRkIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvcHRpb24gdG8gY29uZmlndXJlLgotIyBGcm9tIEppbSBNZXllcmluZwotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX01BSU5UQUlORVJfTU9ERSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKLSAgZG5sIG1haW50YWluZXItbW9kZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Ci0gIEFDX0FSR19FTkFCTEUobWFpbnRhaW5lci1tb2RlLAotWyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyXSwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbCwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9bm8pCi0gIEFDX01TR19SRVNVTFQoJFVTRV9NQUlOVEFJTkVSX01PREUpCi0gIEFNX0NPTkRJVElPTkFMKE1BSU5UQUlORVJfTU9ERSwgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllcykKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIEFDX1NVQlNUKE1BSU5UKWRubAotXQotKQotCi0jIERlZmluZSBhIGNvbmRpdGlvbmFsLgotCi1BQ19ERUZVTihBTV9DT05ESVRJT05BTCwKLVtBQ19TVUJTVCgkMV9UUlVFKQotQUNfU1VCU1QoJDFfRkFMU0UpCi1pZiAkMjsgdGhlbgotICAkMV9UUlVFPQotICAkMV9GQUxTRT0nIycKLWVsc2UKLSAgJDFfVFJVRT0nIycKLSAgJDFfRkFMU0U9Ci1maV0pCi0KZGlmZiAtLWdpdCBhL2dwcm9mL2FscGhhLmMgYi9ncHJvZi9hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDRmMjJlLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2FscGhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5OCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotLyoKLSAqIE9wY29kZXMgb2YgdGhlIGNhbGwgaW5zdHJ1Y3Rpb25zOgotICovCi0jZGVmaW5lIE9QX0p4eAkweDFhCi0jZGVmaW5lCU9QX0JTUgkweDM0Ci0KLSNkZWZpbmUgSnh4X0ZVTkNfSk1QCQkwCi0jZGVmaW5lIEp4eF9GVU5DX0pTUgkJMQotI2RlZmluZSBKeHhfRlVOQ19SRVQJCTIKLSNkZWZpbmUgSnh4X0ZVTkNfSlNSX0NPUk9VVElORQkzCi0KLXR5cGVkZWYgdW5pb24KLSAgewotICAgIHN0cnVjdAotICAgICAgewotCXVuc2lnbmVkIG90aGVyOjI2OwotCXVuc2lnbmVkIG9wX2NvZGU6NjsKLSAgICAgIH0KLSAgICBhOwkJCQkvKiBhbnkgZm9ybWF0ICovCi0gICAgc3RydWN0Ci0gICAgICB7Ci0JaW50IGRpc3A6MjE7Ci0JdW5zaWduZWQgcmE6NTsKLQl1bnNpZ25lZCBvcF9jb2RlOjY7Ci0gICAgICB9Ci0gICAgYjsJCQkJLyogYnJhbmNoIGZvcm1hdCAqLwotICAgIHN0cnVjdAotICAgICAgewotCWludCBoaW50OjE0OwotCXVuc2lnbmVkIGZ1bmM6MjsKLQl1bnNpZ25lZCByYjo1OwotCXVuc2lnbmVkIHJhOjU7Ci0JdW5zaWduZWQgb3BfY29kZTo2OwotICAgICAgfQotICAgIGo7CQkJCS8qIGp1bXAgZm9ybWF0ICovCi0gIH0KLWFscGhhX0luc3RydWN0aW9uOwotCi1zdGF0aWMgU3ltIGluZGlyZWN0X2NoaWxkOwotCi0KLS8qCi0gKiBPbiB0aGUgQWxwaGEgd2UgY2FuIG9ubHkgZGV0ZWN0IFBDIHJlbGF0aXZlIGNhbGxzLCB3aGljaCBhcmUKLSAqIHVzdWFsbHkgZ2VuZXJhdGVkIGZvciBjYWxscyB0byBmdW5jdGlvbnMgd2l0aGluIHRoZSBzYW1lCi0gKiBvYmplY3QgZmlsZSBvbmx5LiAgVGhpcyBpcyBzdGlsbCBiZXR0ZXIgdGhhbiBub3RoaW5nLCBob3dldmVyLgotICogKEluIHBhcnRpY3VsYXIgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGZpbmQgZnVuY3Rpb25zIHRoYXQKLSAqICBwb3RlbnRpYWxseSBjYWxsIGludGVnZXIgZGl2aXNpb24gcm91dGluZXMsIGZvciBleGFtcGxlLikKLSAqLwotdm9pZAotYWxwaGFfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKQotICAgICBTeW0gKnBhcmVudDsKLSAgICAgYmZkX3ZtYSBwX2xvd3BjOwotICAgICBiZmRfdm1hIHBfaGlnaHBjOwotewotICBzdGF0aWMgYmZkX3ZtYSBkZWx0YSA9IDA7Ci0gIGJmZF92bWEgZGVzdF9wYzsKLSAgYWxwaGFfSW5zdHJ1Y3Rpb24gKnBjOwotICBTeW0gKmNoaWxkOwotCi0gIGlmICghZGVsdGEpCi0gICAgewotICAgICAgZGVsdGEgPSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlIC0gY29yZV90ZXh0X3NlY3QtPnZtYTsKLQotICAgICAgc3ltX2luaXQgKCZpbmRpcmVjdF9jaGlsZCk7Ci0gICAgICBpbmRpcmVjdF9jaGlsZC5uYW1lID0gXygiPGluZGlyZWN0IGNoaWxkPiIpOwotICAgICAgaW5kaXJlY3RfY2hpbGQuY2cucHJvcC5mcmFjdCA9IDEuMDsKLSAgICAgIGluZGlyZWN0X2NoaWxkLmNnLmN5Yy5oZWFkID0gJmluZGlyZWN0X2NoaWxkOwotICAgIH0KLQotICBpZiAoIWNvcmVfdGV4dF9zcGFjZSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAocF9sb3dwYyA8IHNfbG93cGMpCi0gICAgewotICAgICAgcF9sb3dwYyA9IHNfbG93cGM7Ci0gICAgfQotICBpZiAocF9oaWdocGMgPiBzX2hpZ2hwYykKLSAgICB7Ci0gICAgICBwX2hpZ2hwYyA9IHNfaGlnaHBjOwotICAgIH0KLSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoXygiW2ZpbmRfY2FsbF0gJXM6IDB4JWx4IHRvIDB4JWx4XG4iKSwKLQkJCSAgcGFyZW50LT5uYW1lLCBwX2xvd3BjLCBwX2hpZ2hwYykpOwotICBmb3IgKHBjID0gKGFscGhhX0luc3RydWN0aW9uICopIChwX2xvd3BjICsgZGVsdGEpOwotICAgICAgIHBjIDwgKGFscGhhX0luc3RydWN0aW9uICopIChwX2hpZ2hwYyArIGRlbHRhKTsKLSAgICAgICArK3BjKQotICAgIHsKLSAgICAgIHN3aXRjaCAocGMtPmEub3BfY29kZSkKLQl7Ci0JY2FzZSBPUF9KeHg6Ci0JICAvKgotCSAgICogVGhlcmUgaXMgbm8gc2ltcGxlIGFuZCByZWxpYWJsZSB3YXkgdG8gZGV0ZXJtaW5lIHRoZQotCSAgICogdGFyZ2V0IG9mIGEganNyICh0aGUgaGludCBiaXRzIGhlbHAsIGJ1dCB0aGVyZSBhcmVuJ3QKLQkgICAqIGVub3VnaCBiaXRzIHRvIGdldCBhIHNhdGlzZmFjdG9yeSBoaXQgcmF0ZSkuICBJbnN0ZWFkLAotCSAgICogZm9yIGFueSBpbmRpcmVjdCBqdW1wIHdlIHNpbXBseSBhZGQgYW4gYXJjIGZyb20gUEFSRU5UCi0JICAgKiB0byBJTkRJUkVDVF9DSElMRC0tLXRoYXQgd2F5IHRoZSB1c2VyIGl0IGF0IGxlYXN0IGFibGUKLQkgICAqIHRvIHNlZSB0aGF0IHRoZXJlIGFyZSBvdGhlciBjYWxscyBhcyB3ZWxsLgotCSAgICovCi0JICBpZiAocGMtPmouZnVuYyA9PSBKeHhfRlVOQ19KU1IKLQkgICAgICB8fCBwYy0+ai5mdW5jID09IEp4eF9GVU5DX0pTUl9DT1JPVVRJTkUpCi0JICAgIHsKLQkgICAgICBEQkcgKENBTExERUJVRywKLQkJICAgcHJpbnRmIChfKCJbZmluZF9jYWxsXSAweCVseDoganNyJXMgPGluZGlyZWN0X2NoaWxkPlxuIiksCi0JCQkgICAoYmZkX3ZtYSkgcGMgLSBkZWx0YSwKLQkJCSAgIHBjLT5qLmZ1bmMgPT0gSnh4X0ZVTkNfSlNSID8gIiIgOiAiX2Nvcm91dGluZSIpKTsKLQkgICAgICBhcmNfYWRkIChwYXJlbnQsICZpbmRpcmVjdF9jaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgT1BfQlNSOgotCSAgREJHIChDQUxMREVCVUcsCi0JICAgICAgIHByaW50ZiAoXygiW2ZpbmRfY2FsbF0gMHglbHg6IGJzciIpLCAoYmZkX3ZtYSkgcGMgLSBkZWx0YSkpOwotCSAgLyoKLQkgICAqIFJlZ3VsYXIgUEMgcmVsYXRpdmUgYWRkcmVzc2luZy4gIENoZWNrIHRoYXQgdGhpcyBpcyB0aGUKLQkgICAqIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbi4gIFRoZSBsaW5rZXIgc29tZXRpbWVzIHJlZGlyZWN0cwotCSAgICogdGhlIGVudHJ5IHBvaW50IGJ5IDggYnl0ZXMgdG8gc2tpcCBsb2FkaW5nIHRoZSBnbG9iYWwKLQkgICAqIHBvaW50ZXIsIHNvIHdlIGFsbCBmb3IgZWl0aGVyIGFkZHJlc3M6Ci0JICAgKi8KLQkgIGRlc3RfcGMgPSAoKGJmZF92bWEpIChwYyArIDEgKyBwYy0+Yi5kaXNwKSkgLSBkZWx0YTsKLQkgIGlmIChkZXN0X3BjID49IHNfbG93cGMgJiYgZGVzdF9wYyA8PSBzX2hpZ2hwYykKLQkgICAgewotCSAgICAgIGNoaWxkID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgZGVzdF9wYyk7Ci0JICAgICAgREJHIChDQUxMREVCVUcsCi0JCSAgIHByaW50ZiAoIiAweCVseFx0OyBuYW1lPSVzLCBhZGRyPTB4JWx4IiwKLQkJCSAgIGRlc3RfcGMsIGNoaWxkLT5uYW1lLCBjaGlsZC0+YWRkcikpOwotCSAgICAgIGlmIChjaGlsZC0+YWRkciA9PSBkZXN0X3BjIHx8IGNoaWxkLT5hZGRyID09IGRlc3RfcGMgLSA4KQotCQl7Ci0JCSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIlxuIikpOwotCQkgIC8qIGEgaGl0OiAgKi8KLQkJICBhcmNfYWRkIChwYXJlbnQsIGNoaWxkLCAodW5zaWduZWQgbG9uZykgMCk7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCSAgLyoKLQkgICAqIFNvbWV0aGluZyBmdW5ueSBnb2luZyBvbi4KLQkgICAqLwotCSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIlx0YnV0IGl0J3MgYSBib3RjaFxuIikpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2Jhc2ljX2Jsb2Nrcy5jIGIvZ3Byb2YvYmFzaWNfYmxvY2tzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YjZmOGQuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvYmFzaWNfYmxvY2tzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzUgKzAsMCBAQAotLyoKLSAqIEJhc2ljLWJsb2NrIGxldmVsIHJlbGF0ZWQgY29kZTogcmVhZGluZy93cml0aW5nIG9mIGJhc2ljLWJsb2NrIGluZm8KLSAqIHRvL2Zyb20gZ21vbi5vdXQ7IGNvbXB1dGluZyBhbmQgZm9ybWF0dGluZyBvZiBiYXNpYy1ibG9jayByZWxhdGVkCi0gKiBzdGF0aXN0aWNzLgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlICJiYXNpY19ibG9ja3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImdtb25faW8uaCIKLSNpbmNsdWRlICJnbW9uX291dC5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAic291cmNlLmgiCi0jaW5jbHVkZSAic3ltX2lkcy5oIgotCi0KLS8qCi0gKiBEZWZhdWx0IG9wdGlvbiB2YWx1ZXM6Ci0gKi8KLWJvb2wgYmJfYW5ub3RhdGVfYWxsX2xpbmVzID0gRkFMU0U7Ci11bnNpZ25lZCBsb25nIGJiX21pbl9jYWxscyA9IDE7Ci1pbnQgYmJfdGFibGVfbGVuZ3RoID0gMTA7Ci0KLS8qCi0gKiBWYXJpYWJsZXMgdXNlZCB0byBjb21wdXRlIGFubm90YXRlZCBzb3VyY2UgbGlzdGluZyBzdGF0czoKLSAqLwotc3RhdGljIGxvbmcgbnVtX2V4ZWN1dGFibGVfbGluZXM7Ci1zdGF0aWMgbG9uZyBudW1fbGluZXNfZXhlY3V0ZWQ7Ci0KLQotLyoKLSAqIEhlbHBlciBmb3Igc29ydGluZy4gIENvbXBhcmVzIHR3byBzeW1ib2xzIGFuZCByZXR1cm5zIHJlc3VsdAotICogc3VjaCB0aGF0IHNvcnRpbmcgd2lsbCBiZSBpbmNyZWFzaW5nIGFjY29yZGluZyB0byBmaWxlbmFtZSwgbGluZQotICogbnVtYmVyLCBhbmQgYWRkcmVzcyAoaW4gdGhhdCBvcmRlcikuCi0gKi8KLQotc3RhdGljIGludAotREVGVU4gKGNtcF9iYiwgKGxwLCBycCksIGNvbnN0IHZvaWQgKmxwIEFORCBjb25zdCB2b2lkICpycCkKLXsKLSAgaW50IHI7Ci0gIGNvbnN0IFN5bSAqbGVmdCA9ICooY29uc3QgU3ltICoqKSBscDsKLSAgY29uc3QgU3ltICpyaWdodCA9ICooY29uc3QgU3ltICoqKSBycDsKLQotICBpZiAobGVmdC0+ZmlsZSAmJiByaWdodC0+ZmlsZSkKLSAgICB7Ci0gICAgICByID0gc3RyY21wIChsZWZ0LT5maWxlLT5uYW1lLCByaWdodC0+ZmlsZS0+bmFtZSk7Ci0gICAgICBpZiAocikKLQl7Ci0JICByZXR1cm4gcjsKLQl9Ci0KLSAgICAgIGlmIChsZWZ0LT5saW5lX251bSAhPSByaWdodC0+bGluZV9udW0pCi0JewotCSAgcmV0dXJuIGxlZnQtPmxpbmVfbnVtIC0gcmlnaHQtPmxpbmVfbnVtOwotCX0KLSAgICB9Ci0KLSAgaWYgKGxlZnQtPmFkZHIgPCByaWdodC0+YWRkcikKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlIGlmIChsZWZ0LT5hZGRyID4gcmlnaHQtPmFkZHIpCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBIZWxwZXIgZm9yIHNvcnRpbmcuICBPcmRlciBiYXNpYyBibG9ja3MgaW4gZGVjcmVhc2luZyBudW1iZXIgb2YKLSAqIGNhbGxzLCB0aWVzIGFyZSBicm9rZW4gaW4gaW5jcmVhc2luZyBvcmRlciBvZiBsaW5lIG51bWJlcnMuCi0gKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfbmNhbGxzLCAobHAsIHJwKSwgY29uc3Qgdm9pZCAqbHAgQU5EIGNvbnN0IHZvaWQgKnJwKQotewotICBjb25zdCBTeW0gKmxlZnQgPSAqKGNvbnN0IFN5bSAqKikgbHA7Ci0gIGNvbnN0IFN5bSAqcmlnaHQgPSAqKGNvbnN0IFN5bSAqKikgcnA7Ci0KLSAgaWYgKCFsZWZ0KQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZSBpZiAoIXJpZ2h0KQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGxlZnQtPm5jYWxscyA8IHJpZ2h0LT5uY2FsbHMpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKGxlZnQtPm5jYWxscyA+IHJpZ2h0LT5uY2FsbHMpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiBsZWZ0LT5saW5lX251bSAtIHJpZ2h0LT5saW5lX251bTsKLX0KLQotCi0vKgotICogU2tpcCBvdmVyIHZhcmlhYmxlIGxlbmd0aCBzdHJpbmcuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoZnNraXBfc3RyaW5nLCAoZnApLCBGSUxFICogZnApCi17Ci0gIGludCBjaDsKLQotICB3aGlsZSAoKGNoID0gZmdldGMgKGZwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGlmIChjaCA9PSAnXDAnKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIFJlYWQgYSBiYXNpYy1ibG9jayByZWNvcmQgZnJvbSBmaWxlIElGUC4gIEZJTEVOQU1FIGlzIHRoZSBuYW1lCi0gKiBvZiBmaWxlIElGUCBhbmQgaXMgcHJvdmlkZWQgZm9yIGZvcm1hdHRpbmcgZXJyb3ItbWVzc2FnZXMgb25seS4KLSAqLwotdm9pZAotREVGVU4gKGJiX3JlYWRfcmVjLCAoaWZwLCBmaWxlbmFtZSksIEZJTEUgKiBpZnAgQU5EIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBpbnQgbmJsb2NrcywgYjsKLSAgYmZkX3ZtYSBhZGRyOwotICB1bnNpZ25lZCBsb25nIG5jYWxsczsKLSAgU3ltICpzeW07Ci0KLSAgaWYgKGZyZWFkICgmbmJsb2Nrcywgc2l6ZW9mIChuYmxvY2tzKSwgMSwgaWZwKSAhPSAxKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlXG4iKSwgd2hvYW1pLCBmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgbmJsb2NrcyA9IGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJiBuYmxvY2tzKTsKLSAgaWYgKGdtb25fZmlsZV92ZXJzaW9uID09IDApCi0gICAgewotICAgICAgZnNraXBfc3RyaW5nIChpZnApOwotICAgIH0KLQotICBmb3IgKGIgPSAwOyBiIDwgbmJsb2NrczsgKytiKQotICAgIHsKLSAgICAgIGlmIChnbW9uX2ZpbGVfdmVyc2lvbiA9PSAwKQotCXsKLQkgIGludCBsaW5lX251bTsKLQkgIC8qCi0JICAgKiBWZXJzaW9uIDAgaGFkIGxvdHMgb2YgZXh0cmEgc3R1ZmYgdGhhdCB3ZSBkb24ndAotCSAgICogY2FyZSBhYm91dCBhbnltb3JlLgotCSAgICovCi0JICBpZiAoKGZyZWFkICgmbmNhbGxzLCBzaXplb2YgKG5jYWxscyksIDEsIGlmcCkgIT0gMSkKLQkgICAgICB8fCAoZnJlYWQgKCZhZGRyLCBzaXplb2YgKGFkZHIpLCAxLCBpZnApICE9IDEpCi0JICAgICAgfHwgKGZza2lwX3N0cmluZyAoaWZwKSwgRkFMU0UpCi0JICAgICAgfHwgKGZza2lwX3N0cmluZyAoaWZwKSwgRkFMU0UpCi0JICAgICAgfHwgKGZyZWFkICgmbGluZV9udW0sIHNpemVvZiAobGluZV9udW0pLCAxLCBpZnApICE9IDEpKQotCSAgICB7Ci0JICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGZyZWFkICgmYWRkciwgc2l6ZW9mIChhZGRyKSwgMSwgaWZwKSAhPSAxCi0JICAgICAgfHwgZnJlYWQgKCZuY2FsbHMsIHNpemVvZiAobmNhbGxzKSwgMSwgaWZwKSAhPSAxKQotCSAgICB7Ci0JICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBCYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzIGFyZSBtZWFuaW5nZnVsIG9ubHkgaWYgd2UncmUKLSAgICAgICAqIHByb2ZpbGluZyBhdCB0aGUgbGluZS1ieS1saW5lIGxldmVsOgotICAgICAgICovCi0gICAgICBpZiAobGluZV9ncmFudWxhcml0eSkKLQl7Ci0KLQkgIC8qIGNvbnZlcnQgZnJvbSB0YXJnZXQgdG8gaG9zdCBlbmRpYW5uZXNzOiAqLwotCi0JICBhZGRyID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmIGFkZHIpOwotCSAgbmNhbGxzID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmbmNhbGxzKTsKLQotCSAgc3ltID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgYWRkcik7Ci0KLQkgIGlmIChzeW0pCi0JICAgIHsKLQkgICAgICBpbnQgaTsKLQotCSAgICAgIERCRyAoQkJERUJVRywKLQkJICAgcHJpbnRmICgiW2JiX3JlYWRfcmVjXSAweCVseC0+MHglbHggKCVzOiVkKSBjbnQ9JWx1XG4iLAotCQkJICAgYWRkciwgc3ltLT5hZGRyLCBzeW0tPm5hbWUsIHN5bS0+bGluZV9udW0sIG5jYWxscykpOwotCi0JICAgICAgZm9yIChpID0gMDsgaSA8IE5CQlM7IGkrKykKLQkJewotCQkgIGlmICghIHN5bS0+YmJfYWRkcltpXSB8fCBzeW0tPmJiX2FkZHJbaV0gPT0gYWRkcikKLQkJICAgIHsKLQkJICAgICAgc3ltLT5iYl9hZGRyW2ldID0gYWRkcjsKLQkJICAgICAgc3ltLT5iYl9jYWxsc1tpXSArPSBuY2FsbHM7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RhdGljIGJvb2wgdXNlcl93YXJuZWQgPSBGQUxTRTsKLQotCSAgaWYgKCF1c2VyX3dhcm5lZCkKLQkgICAgewotCSAgICAgIHVzZXJfd2FybmVkID0gVFJVRTsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICBfKCIlczogd2FybmluZzogaWdub3JpbmcgYmFzaWMtYmxvY2sgZXhlYyBjb3VudHMgKHVzZSAtbCBvciAtLWxpbmUpXG4iKSwKLQkJICAgICAgIHdob2FtaSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm47Ci19Ci0KLQotLyoKLSAqIFdyaXRlIGFsbCBiYXNpYy1ibG9ja3Mgd2l0aCBub24temVybyBjb3VudHMgdG8gZmlsZSBPRlAuICBGSUxFTkFNRQotICogaXMgdGhlIG5hbWUgb2YgT0ZQIGFuZCBpcyBwcm92aWRlZCBmb3IgcHJvZHVjaW5nIGVycm9yLW1lc3NhZ2VzCi0gKiBvbmx5LgotICovCi12b2lkCi1ERUZVTiAoYmJfd3JpdGVfYmxvY2tzLCAob2ZwLCBmaWxlbmFtZSksIEZJTEUgKiBvZnAgQU5EIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBjb25zdCB1bnNpZ25lZCBjaGFyIHRhZyA9IEdNT05fVEFHX0JCX0NPVU5UOwotICBpbnQgbmJsb2NrcyA9IDA7Ci0gIGJmZF92bWEgYWRkcjsKLSAgdW5zaWduZWQgbG9uZyBuY2FsbHM7Ci0gIFN5bSAqc3ltOwotICBpbnQgaTsKLQotICAvKiBjb3VudCBob3cgbWFueSBub24temVybyBibG9ja3Mgd2l0aCBoYXZlOiAqLwotCi0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IE5CQlMgJiYgc3ltLT5iYl9hZGRyW2ldOyBpKyspCi0JOwotICAgICAgbmJsb2NrcyArPSBpOwotICAgIH0KLQotICAvKiB3cml0ZSBoZWFkZXI6ICovCi0gIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBuYmxvY2tzLCAoYmZkX2J5dGUgKikgJiBuYmxvY2tzKTsKLSAgaWYgKGZ3cml0ZSAoJnRhZywgc2l6ZW9mICh0YWcpLCAxLCBvZnApICE9IDEKLSAgICAgIHx8IGZ3cml0ZSAoJm5ibG9ja3MsIHNpemVvZiAobmJsb2NrcyksIDEsIG9mcCkgIT0gMSkKLSAgICB7Ci0gICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICAvKiB3cml0ZSBjb3VudHM6ICovCi0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IE5CQlMgJiYgc3ltLT5iYl9hZGRyW2ldOyBpKyspCi0JewotCSAgcHV0X3ZtYSAoY29yZV9iZmQsIHN5bS0+YmJfYWRkcltpXSwgKGJmZF9ieXRlICopICYgYWRkcik7Ci0JICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgc3ltLT5iYl9jYWxsc1tpXSwgKGJmZF9ieXRlICopICYgbmNhbGxzKTsKLQotCSAgaWYgKGZ3cml0ZSAoJmFkZHIsIHNpemVvZiAoYWRkciksIDEsIG9mcCkgIT0gMQotCSAgICAgIHx8IGZ3cml0ZSAoJm5jYWxscywgc2l6ZW9mIChuY2FsbHMpLCAxLCBvZnApICE9IDEpCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIE91dHB1dCBiYXNpYy1ibG9jayBzdGF0aXN0aWNzIGluIGEgZm9ybWF0IHRoYXQgaXMgZWFzaWx5IHBhcnNlYWJsZS4KLSAqIEN1cnJlbnQgdGhlIGZvcm1hdCBpczoKLSAqCi0gKiAgICAgIDxmaWxlbmFtZT46PGxpbmUtbnVtYmVyPjogKDxmdW5jdGlvbi1uYW1lPjo8YmItYWRkcik6IDxuY2FsbHM+Ci0gKi8KLXZvaWQKLURFRlVOX1ZPSUQgKHByaW50X2V4ZWNfY291bnRzKQotewotICBTeW0gKipzb3J0ZWRfYmJzLCAqc3ltOwotICBpbnQgaSwgaiwgbGVuOwotCi0gIGlmIChmaXJzdF9vdXRwdXQpCi0gICAgewotICAgICAgZmlyc3Rfb3V0cHV0ID0gRkFMU0U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiXGZcbiIpOwotICAgIH0KLQotICAvKiBzb3J0IGJhc2ljLWJsb2NrcyBhY2NvcmRpbmcgdG8gZnVuY3Rpb24gbmFtZSBhbmQgbGluZSBudW1iZXI6ICovCi0KLSAgc29ydGVkX2JicyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKHNvcnRlZF9iYnNbMF0pKTsKLSAgbGVuID0gMDsKLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogQWNjZXB0IHN5bWJvbCBpZiBpdCdzIGluIHRoZSBJTkNMX0VYRUMgdGFibGUKLSAgICAgICAqIG9yIHRoZXJlIGlzIG5vIElOQ0xfRVhFQyB0YWJsZQotICAgICAgICogICAgYW5kIGl0IGRvZXMgbm90IGFwcGVhciBpbiB0aGUgRVhDTF9FWEVDIHRhYmxlLgotICAgICAgICovCi0gICAgICBpZiAoc3ltX2xvb2t1cCAoJnN5bXNbSU5DTF9FWEVDXSwgc3ltLT5hZGRyKQotCSAgfHwgKHN5bXNbSU5DTF9FWEVDXS5sZW4gPT0gMAotCSAgICAgICYmICFzeW1fbG9va3VwICgmc3ltc1tFWENMX0VYRUNdLCBzeW0tPmFkZHIpKSkKLQl7Ci0JICBzb3J0ZWRfYmJzW2xlbisrXSA9IHN5bTsKLQl9Ci0gICAgfQotICBxc29ydCAoc29ydGVkX2JicywgbGVuLCBzaXplb2YgKHNvcnRlZF9iYnNbMF0pLCBjbXBfYmIpOwotCi0gIC8qIG91dHB1dCBiYXNpYy1ibG9ja3M6ICovCi0KLSAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQotICAgIHsKLSAgICAgIGlmIChzeW0tPm5jYWxscyA+IDAgfHwgISBpZ25vcmVfemVyb3MpCi0JewotCSAgcHJpbnRmIChfKCIlczolZDogKCVzOjB4JWx4KSAlbHUgZXhlY3V0aW9uc1xuIiksCi0JCSAgc3ltLT5maWxlID8gc3ltLT5maWxlLT5uYW1lIDogXygiPHVua25vd24+IiksIHN5bS0+bGluZV9udW0sCi0JCSAgc3ltLT5uYW1lLCBzeW0tPmFkZHIsIHN5bS0+bmNhbGxzKTsKLQl9Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgTkJCUyAmJiBzeW0tPmJiX2FkZHJbal07IGogKyspCi0JewotCSAgaWYgKHN5bS0+YmJfY2FsbHNbal0gPiAwIHx8ICEgaWdub3JlX3plcm9zKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCIlczolZDogKCVzOjB4JWx4KSAlbHUgZXhlY3V0aW9uc1xuIiksCi0JCSAgICAgIHN5bS0+ZmlsZSA/IHN5bS0+ZmlsZS0+bmFtZSA6IF8oIjx1bmtub3duPiIpLCBzeW0tPmxpbmVfbnVtLAotCQkgICAgICBzeW0tPm5hbWUsIHN5bS0+YmJfYWRkcltqXSwgc3ltLT5iYl9jYWxsc1tqXSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBmcmVlIChzb3J0ZWRfYmJzKTsKLX0KLQotLyoKLSAqIEhlbHBlciBmb3IgYmJfYW5ub3RhdGVkX3NvdXJjZTogZm9ybWF0IGFubm90YXRpb24gY29udGFpbmluZwotICogbnVtYmVyIG9mIGxpbmUgZXhlY3V0aW9ucy4gIERlcGVuZHMgb24gYmVpbmcgY2FsbGVkIG9uIGVhY2gKLSAqIGxpbmUgb2YgYSBmaWxlIGluIHNlcXVlbnRpYWwgb3JkZXIuCi0gKgotICogR2xvYmFsIHZhcmlhYmxlIGJiX2Fubm90YXRlX2FsbF9saW5lcyBlbmFibGVzIGV4ZWN1dGlvbiBjb3VudAotICogY29tcHJlc3Npb24gKGNvdW50cyBhcmUgc3VwcmVzc2VkIGlmIGlkZW50aWNhbCB0byB0aGUgbGFzdCBvbmUpCi0gKiBhbmQgcHJpbnRzIGNvdW50cyBvbiBhbGwgZXhlY3V0ZWQgbGluZXMuICBPdGhlcndpc2UsIHByaW50Ci0gKiBhbGwgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cyBleGFjdGx5IG9uY2Ugb24gdGhlIGxpbmUKLSAqIHRoYXQgc3RhcnRzIHRoZSBiYXNpYy1ibG9jay4KLSAqLwotCi1zdGF0aWMgdm9pZAotREVGVU4gKGFubm90YXRlX3dpdGhfY291bnQsIChidWYsIHdpZHRoLCBsaW5lX251bSwgYXJnKSwKLSAgICAgICBjaGFyICpidWYgQU5EIGludCB3aWR0aCBBTkQgaW50IGxpbmVfbnVtIEFORCB2b2lkICphcmcpCi17Ci0gIFNvdXJjZV9GaWxlICpzZiA9IGFyZzsKLSAgU3ltICpiOwotICBpbnQgaTsKLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9jb3VudDsKLSAgdW5zaWduZWQgbG9uZyBsYXN0X3ByaW50ID0gKHVuc2lnbmVkIGxvbmcpIC0xOwotCi0gIGIgPSBOVUxMOwotICBpZiAobGluZV9udW0gPD0gc2YtPm51bV9saW5lcykKLSAgICB7Ci0gICAgICBiID0gc2YtPmxpbmVbbGluZV9udW0gLSAxXTsKLSAgICB9Ci0gIGlmICghYikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKLQlidWZbaV0gPSAnICc7Ci0gICAgICBidWZbd2lkdGhdID0gJ1wwJzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIHRtcGJ1ZltOQkJTICogMzBdOwotICAgICAgY2hhciAqcDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbmNhbGxzOwotICAgICAgaW50IG5jYWxsc19zZXQ7Ci0gICAgICBpbnQgbGVuOwotCi0gICAgICArK251bV9leGVjdXRhYmxlX2xpbmVzOwotCi0gICAgICBwID0gdG1wYnVmOwotICAgICAgKnAgPSAnXDAnOwotCi0gICAgICBuY2FsbHMgPSAwOwotICAgICAgbmNhbGxzX3NldCA9IDA7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiBlbnRyeSBwb2ludCwgbGFiZWwgdGhlIGxpbmUgbm8gbWF0dGVyIHdoYXQuCi0gICAgICAgKiBPdGhlcndpc2UsIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSBmdW5jdGlvbiwgc28gY2hlY2sgdG8gc2VlCi0gICAgICAgKiBpZiB0aGUgZmlyc3QgYmFzaWMtYmxvY2sgYWRkcmVzcyBpcyBsYXJnZXIgdGhhbiB0aGUgc3RhcnRpbmcKLSAgICAgICAqIGFkZHJlc3Mgb2YgdGhlIGxpbmUuICBJZiBzbywgdGhlbiB0aGlzIGxpbmUgYmVnaW5zIHdpdGggYQotICAgICAgICogYSBwb3J0aW9uIG9mIHRoZSBwcmV2aW91cyBiYXNpYy1ibG9jaywgc28gcHJpbnQgdGhhdCBwcmlvcgotICAgICAgICogZXhlY3V0aW9uIGNvdW50IChpZiBiYl9hbm5vdGF0ZV9hbGxfbGluZXMgaXMgc2V0KS4KLSAgICAgICAqLwotCi0gICAgICBpZiAoYi0+aXNfZnVuYykKLQl7Ci0JICBzcHJpbnRmIChwLCAiJWx1IiwgYi0+bmNhbGxzKTsKLQkgIHAgKz0gc3RybGVuIChwKTsKLQkgIGxhc3RfY291bnQgPSBiLT5uY2FsbHM7Ci0JICBsYXN0X3ByaW50ID0gbGFzdF9jb3VudDsKLQkgIG5jYWxscyA9IGItPm5jYWxsczsKLQkgIG5jYWxsc19zZXQgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKGJiX2Fubm90YXRlX2FsbF9saW5lcwotCSAgICAgICAmJiBiLT5iYl9hZGRyWzBdICYmIGItPmJiX2FkZHJbMF0gPiBiLT5hZGRyKQotCXsKLQkgIHNwcmludGYgKHAsICIlbHUiLCBsYXN0X2NvdW50KTsKLQkgIHAgKz0gc3RybGVuIChwKTsKLQkgIGxhc3RfcHJpbnQgPSBsYXN0X2NvdW50OwotCSAgbmNhbGxzID0gbGFzdF9jb3VudDsKLQkgIG5jYWxsc19zZXQgPSAxOwotCX0KLQotICAgICAgLyogTG9vcCB0aHJvdWdoIGFsbCBvZiB0aGlzIGxpbmUncyBiYXNpYy1ibG9ja3MuICBGb3IgZWFjaCBvbmUsCi0gICAgICAgKiB1cGRhdGUgbGFzdF9jb3VudCwgdGhlbiBjb21wcmVzcyBzZXF1ZW50aWFsIGlkZW50aWNhbCBjb3VudHMKLSAgICAgICAqIChpZiBiYl9hbm5vdGF0ZV9hbGxfbGluZXMpIGFuZCBwcmludCB0aGUgZXhlY3V0aW9uIGNvdW50LgotICAgICAgICovCi0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOQkJTICYmIGItPmJiX2FkZHJbaV07IGkrKykKLQl7Ci0JICBsYXN0X2NvdW50ID0gYi0+YmJfY2FsbHNbaV07Ci0JICBpZiAoISBuY2FsbHNfc2V0KQotCSAgICB7Ci0JICAgICAgbmNhbGxzID0gMDsKLQkgICAgICBuY2FsbHNfc2V0ID0gMTsKLQkgICAgfQotCSAgbmNhbGxzICs9IGxhc3RfY291bnQ7Ci0KLQkgIGlmIChiYl9hbm5vdGF0ZV9hbGxfbGluZXMgJiYgbGFzdF9jb3VudCA9PSBsYXN0X3ByaW50KQotCSAgICB7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgaWYgKHAgPiB0bXBidWYpCi0JICAgICpwKysgPSAnLCc7Ci0JICBzcHJpbnRmIChwLCAiJWx1IiwgbGFzdF9jb3VudCk7Ci0JICBwICs9IHN0cmxlbiAocCk7Ci0KLQkgIGxhc3RfcHJpbnQgPSBsYXN0X2NvdW50OwotCX0KLQotICAgICAgLyogV2UncmUgZG9uZS4gIElmIG5vdGhpbmcgaGFzIGJlZW4gcHJpbnRlZCBvbiB0aGlzIGxpbmUsCi0gICAgICAgKiBwcmludCB0aGUgbGFzdCBleGVjdXRpb24gY291bnQgKGJiX2Fubm90YXRlX2FsbF9saW5lcyksCi0gICAgICAgKiB3aGljaCBjb3VsZCBiZSBmcm9tIGVpdGhlciBhIHByZXZpb3VzIGxpbmUgKGlmIHRoZXJlIHdlcmUKLSAgICAgICAqIG5vIEJCcyBvbiB0aGlzIGxpbmUpLCBvciBmcm9tIHRoaXMgbGluZSAoaWYgYWxsIG91ciBCQgotICAgICAgICogY291bnRzIHdlcmUgY29tcHJlc3NlZCBvdXQgYmVjYXVzZSB0aGV5IHdlcmUgaWRlbnRpY2FsKS4KLSAgICAgICAqLwotCi0gICAgICBpZiAoYmJfYW5ub3RhdGVfYWxsX2xpbmVzICYmIHAgPT0gdG1wYnVmKQotCXsKLQkgIHNwcmludGYgKHAsICIlbHUiLCBsYXN0X2NvdW50KTsKLQkgIHAgKz0gc3RybGVuIChwKTsKLQkgIG5jYWxscyA9IGxhc3RfY291bnQ7Ci0JICBuY2FsbHNfc2V0ID0gMTsKLQl9Ci0KLSAgICAgIGlmICghIG5jYWxsc19zZXQpCi0JewotCSAgaW50IGM7Ci0KLQkgIGZvciAoYyA9IDA7IGMgPCB3aWR0aDsgYysrKQotCSAgICBidWZbY10gPSAnICc7Ci0JICBidWZbd2lkdGhdID0gJ1wwJzsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgICsrbnVtX2xpbmVzX2V4ZWN1dGVkOwotCi0gICAgICBpZiAobmNhbGxzIDwgYmJfbWluX2NhbGxzKQotCXsKLQkgIHN0cmNweSAodG1wYnVmLCAiIyMjIyMiKTsKLQkgIHAgPSB0bXBidWYgKyA1OwotCX0KLQotICAgICAgc3RyY3B5IChwLCAiIC0+ICIpOwotICAgICAgcCArPSA0OwotCi0gICAgICBsZW4gPSBwIC0gdG1wYnVmOwotICAgICAgaWYgKGxlbiA+PSB3aWR0aCkKLQl7Ci0JICBzdHJuY3B5IChidWYsIHRtcGJ1Ziwgd2lkdGgpOwotCSAgYnVmW3dpZHRoXSA9ICdcMCc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludCBjOwotCi0JICBzdHJjcHkgKGJ1ZiArIHdpZHRoIC0gbGVuLCB0bXBidWYpOwotCSAgZm9yIChjID0gMDsgYyA8IHdpZHRoIC0gbGVuOyArK2MpCi0JICAgIGJ1ZltjXSA9ICcgJzsKLQl9Ci0gICAgfQotfQotCi0vKgotICogQW5ub3RhdGUgdGhlIGZpbGVzIG5hbWVkIGluIFNPVVJDRV9GSUxFUyB3aXRoIGJhc2ljLWJsb2NrIHN0YXRpc3RpY3MKLSAqIChleGVjdXRpb24gY291bnRzKS4gIEFmdGVyIGVhY2ggc291cmNlIGZpbGVzLCBhIGZldyBzdGF0aXN0aWNzCi0gKiByZWdhcmRpbmcgdGhhdCBzb3VyY2UgZmlsZSBhcmUgcHJpbnRlZC4KLSAqLwotdm9pZAotREVGVU5fVk9JRCAocHJpbnRfYW5ub3RhdGVkX3NvdXJjZSkKLXsKLSAgU3ltICpzeW0sICpsaW5lX3N0YXRzLCAqbmV3X2xpbmU7Ci0gIFNvdXJjZV9GaWxlICpzZjsKLSAgaW50IGksIHRhYmxlX2xlbjsKLSAgRklMRSAqb2ZwOwotCi0gIC8qCi0gICAqIEZpbmQgbWF4aW11bSBsaW5lIG51bWJlciBmb3IgZWFjaCBzb3VyY2UgZmlsZSB0aGF0IHVzZXIgaXMKLSAgICogaW50ZXJlc3RlZCBpbjoKLSAgICovCi0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIEFjY2VwdCBzeW1ib2wgaWYgaXQncyBmaWxlIGlzIGtub3duLCBpdHMgbGluZSBudW1iZXIgaXMKLSAgICAgICAqIGJpZ2dlciB0aGFuIGFueXRoaW5nIHdlIGhhdmUgc2VlbiBmb3IgdGhhdCBmaWxlIHNvIGZhciBhbmQKLSAgICAgICAqIGlmIGl0J3MgaW4gdGhlIElOQ0xfQU5OTyB0YWJsZSBvciB0aGVyZSBpcyBubyBJTkNMX0FOTk8KLSAgICAgICAqIHRhYmxlIGFuZCBpdCBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIEVYQ0xfQU5OTyB0YWJsZS4KLSAgICAgICAqLwotICAgICAgaWYgKHN5bS0+ZmlsZSAmJiBzeW0tPmxpbmVfbnVtID4gc3ltLT5maWxlLT5udW1fbGluZXMKLQkgICYmIChzeW1fbG9va3VwICgmc3ltc1tJTkNMX0FOTk9dLCBzeW0tPmFkZHIpCi0JICAgICAgfHwgKHN5bXNbSU5DTF9BTk5PXS5sZW4gPT0gMAotCQkgICYmICFzeW1fbG9va3VwICgmc3ltc1tFWENMX0FOTk9dLCBzeW0tPmFkZHIpKSkpCi0JewotCSAgc3ltLT5maWxlLT5udW1fbGluZXMgPSBzeW0tPmxpbmVfbnVtOwotCX0KLSAgICB9Ci0KLSAgLyogYWxsb2NhdGUgbGluZSBkZXNjcmlwdG9yczogKi8KLQotICBmb3IgKHNmID0gZmlyc3Rfc3JjX2ZpbGU7IHNmOyBzZiA9IHNmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzZi0+bnVtX2xpbmVzID4gMCkKLQl7Ci0JICBzZi0+bGluZSA9ICh2b2lkICopIHhtYWxsb2MgKHNmLT5udW1fbGluZXMgKiBzaXplb2YgKHNmLT5saW5lWzBdKSk7Ci0JICBtZW1zZXQgKHNmLT5saW5lLCAwLCBzZi0+bnVtX2xpbmVzICogc2l6ZW9mIChzZi0+bGluZVswXSkpOwotCX0KLSAgICB9Ci0KLSAgLyogY291bnQgZXhlY3V0aW9ucyBwZXIgbGluZTogKi8KLQotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQotICAgIHsKLSAgICAgIGlmIChzeW0tPmZpbGUgJiYgc3ltLT5maWxlLT5udW1fbGluZXMKLQkgICYmIChzeW1fbG9va3VwICgmc3ltc1tJTkNMX0FOTk9dLCBzeW0tPmFkZHIpCi0JICAgICAgfHwgKHN5bXNbSU5DTF9BTk5PXS5sZW4gPT0gMAotCQkgICYmICFzeW1fbG9va3VwICgmc3ltc1tFWENMX0FOTk9dLCBzeW0tPmFkZHIpKSkpCi0JewotCSAgc3ltLT5maWxlLT5uY2FsbHMgKz0gc3ltLT5uY2FsbHM7Ci0JICBsaW5lX3N0YXRzID0gc3ltLT5maWxlLT5saW5lW3N5bS0+bGluZV9udW0gLSAxXTsKLQkgIGlmICghbGluZV9zdGF0cykKLQkgICAgewotCSAgICAgIC8qIGNvbW1vbiBjYXNlIGhhcyBhdCBtb3N0IG9uZSBiYXNpYy1ibG9jayBwZXIgc291cmNlIGxpbmU6ICovCi0JICAgICAgc3ltLT5maWxlLT5saW5lW3N5bS0+bGluZV9udW0gLSAxXSA9IHN5bTsKLQkgICAgfQotCSAgZWxzZSBpZiAoIWxpbmVfc3RhdHMtPmFkZHIpCi0JICAgIHsKLQkgICAgICAvKiBzeW0gaXMgdGhlIDNyZCAuLiBudGggYmFzaWMgYmxvY2sgZm9yIHRoaXMgbGluZTogKi8KLQkgICAgICBsaW5lX3N0YXRzLT5uY2FsbHMgKz0gc3ltLT5uY2FsbHM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIHN5bSBpcyB0aGUgc2Vjb25kIGJhc2ljIGJsb2NrIGZvciB0aGlzIGxpbmUgKi8KLQkgICAgICBuZXdfbGluZSA9IChTeW0gKikgeG1hbGxvYyAoc2l6ZW9mICgqbmV3X2xpbmUpKTsKLQkgICAgICAqbmV3X2xpbmUgPSAqbGluZV9zdGF0czsKLQkgICAgICBuZXdfbGluZS0+YWRkciA9IDA7Ci0JICAgICAgbmV3X2xpbmUtPm5jYWxscyArPSBzeW0tPm5jYWxsczsKLQkgICAgICBzeW0tPmZpbGUtPmxpbmVbc3ltLT5saW5lX251bSAtIDFdID0gbmV3X2xpbmU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIHBsb2Qgb3ZlciBzb3VyY2UgZmlsZXMsIGFubm90YXRpbmcgdGhlbTogKi8KLQotICBmb3IgKHNmID0gZmlyc3Rfc3JjX2ZpbGU7IHNmOyBzZiA9IHNmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghc2YtPm51bV9saW5lcyB8fCAoaWdub3JlX3plcm9zICYmIHNmLT5uY2FsbHMgPT0gMCkpCi0JewotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBudW1fZXhlY3V0YWJsZV9saW5lcyA9IG51bV9saW5lc19leGVjdXRlZCA9IDA7Ci0gICAgICBvZnAgPSBhbm5vdGF0ZV9zb3VyY2UgKHNmLCAxNiwgYW5ub3RhdGVfd2l0aF9jb3VudCwgc2YpOwotICAgICAgaWYgKCFvZnApCi0JewotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoYmJfdGFibGVfbGVuZ3RoID4gMCkKLQl7Ci0JICBmcHJpbnRmIChvZnAsIF8oIlxuXG5Ub3AgJWQgTGluZXM6XG5cbiAgICAgTGluZSAgICAgIENvdW50XG5cbiIpLAotCQkgICBiYl90YWJsZV9sZW5ndGgpOwotCi0JICAvKiBhYnVzZSBsaW5lIGFycmF5cy0tLWl0J3Mgbm90IG5lZWRlZCBhbnltb3JlOiAqLwotCSAgcXNvcnQgKHNmLT5saW5lLCBzZi0+bnVtX2xpbmVzLCBzaXplb2YgKHNmLT5saW5lWzBdKSwgY21wX25jYWxscyk7Ci0JICB0YWJsZV9sZW4gPSBiYl90YWJsZV9sZW5ndGg7Ci0JICBpZiAodGFibGVfbGVuID4gc2YtPm51bV9saW5lcykKLQkgICAgewotCSAgICAgIHRhYmxlX2xlbiA9IHNmLT5udW1fbGluZXM7Ci0JICAgIH0KLQkgIGZvciAoaSA9IDA7IGkgPCB0YWJsZV9sZW47ICsraSkKLQkgICAgewotCSAgICAgIHN5bSA9IHNmLT5saW5lW2ldOwotCSAgICAgIGlmICghc3ltIHx8IHN5bS0+bmNhbGxzID09IDApCi0JCXsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGZwcmludGYgKG9mcCwgIiU5ZCAlMTBsdVxuIiwgc3ltLT5saW5lX251bSwgc3ltLT5uY2FsbHMpOwotCSAgICB9Ci0JfQotCi0gICAgICBmcmVlIChzZi0+bGluZSk7Ci0gICAgICBzZi0+bGluZSA9IDA7Ci0KLSAgICAgIGZwcmludGYgKG9mcCwgXygiXG5FeGVjdXRpb24gU3VtbWFyeTpcblxuIikpOwotICAgICAgZnByaW50ZiAob2ZwLCBfKCIlOWxkICAgRXhlY3V0YWJsZSBsaW5lcyBpbiB0aGlzIGZpbGVcbiIpLAotCSAgICAgICBudW1fZXhlY3V0YWJsZV9saW5lcyk7Ci0gICAgICBmcHJpbnRmIChvZnAsIF8oIiU5bGQgICBMaW5lcyBleGVjdXRlZFxuIiksIG51bV9saW5lc19leGVjdXRlZCk7Ci0gICAgICBmcHJpbnRmIChvZnAsIF8oIiU5LjJmICAgUGVyY2VudCBvZiB0aGUgZmlsZSBleGVjdXRlZFxuIiksCi0JICAgICAgIG51bV9leGVjdXRhYmxlX2xpbmVzCi0JICAgICAgID8gMTAwLjAgKiBudW1fbGluZXNfZXhlY3V0ZWQgLyAoZG91YmxlKSBudW1fZXhlY3V0YWJsZV9saW5lcwotCSAgICAgICA6IDEwMC4wKTsKLSAgICAgIGZwcmludGYgKG9mcCwgXygiXG4lOWx1ICAgVG90YWwgbnVtYmVyIG9mIGxpbmUgZXhlY3V0aW9uc1xuIiksCi0JICAgICAgIHNmLT5uY2FsbHMpOwotICAgICAgZnByaW50ZiAob2ZwLCBfKCIlOS4yZiAgIEF2ZXJhZ2UgZXhlY3V0aW9ucyBwZXIgbGluZVxuIiksCi0JICAgICAgIG51bV9leGVjdXRhYmxlX2xpbmVzCi0JICAgICAgID8gKGRvdWJsZSkgc2YtPm5jYWxscyAvIChkb3VibGUpIG51bV9leGVjdXRhYmxlX2xpbmVzCi0JICAgICAgIDogMC4wKTsKLSAgICAgIGlmIChvZnAgIT0gc3Rkb3V0KQotCXsKLQkgIGZjbG9zZSAob2ZwKTsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvYmFzaWNfYmxvY2tzLmggYi9ncHJvZi9iYXNpY19ibG9ja3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzZWNhMS4uMDAwMDAwMAotLS0gYS9ncHJvZi9iYXNpY19ibG9ja3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNpZm5kZWYgYmFzaWNfYmxvY2tzX2gKLSNkZWZpbmUgYmFzaWNfYmxvY2tzX2gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJzb3VyY2UuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotLyoKLSAqIE9wdGlvbnM6Ci0gKi8KLWV4dGVybiBib29sIGJiX2Fubm90YXRlX2FsbF9saW5lczsJLyogZm9yY2UgYW5ub3RhdGlvbiBvZiBhbGwgbGluZXM/ICovCi1leHRlcm4gaW50IGJiX3RhYmxlX2xlbmd0aDsJCS8qIGxlbmd0aCBvZiBtb3N0LXVzZWQgYmIgdGFibGUgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIGJiX21pbl9jYWxsczsJLyogbWluaW11bSBleGVjdXRpb24gY291bnQgKi8KLQotZXh0ZXJuIHZvaWQgYmJfcmVhZF9yZWMgUEFSQU1TICgoRklMRSAqIGlmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLWV4dGVybiB2b2lkIGJiX3dyaXRlX2Jsb2NrcyBQQVJBTVMgKChGSUxFICogb2ZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotZXh0ZXJuIHZvaWQgYmJfY3JlYXRlX3N5bXMgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gdm9pZCBwcmludF9hbm5vdGF0ZWRfc291cmNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHByaW50X2V4ZWNfY291bnRzIFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmIC8qIGJhc2ljX2Jsb2Nrc19oICovCmRpZmYgLS1naXQgYS9ncHJvZi9iYl9leGl0X2Z1bmMuYyBiL2dwcm9mL2JiX2V4aXRfZnVuYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTMzMjE1Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2JiX2V4aXRfZnVuYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NCBEYXZpZCBNb3NiZXJnZXItVGFuZy4KLSAqCi0gKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIF9fYmJfZXhpdF9mdW5jKCkgZHVtcHMgYWxsIHRoZSBiYXNpYy1ibG9jayBzdGF0aXN0aWNzIGxpbmtlZCBpbnRvCi0gKiB0aGUgYmJfaGVhZCBjaGFpbiB0byAuZCBmaWxlcy4KLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImdtb25fb3V0LmgiCi0KLS8qIHN0cnVjdHVyZSBlbWl0dGVkIGJ5IC1hICovCi1zdHJ1Y3QgYmIgewotICAgIGxvbmcJCXplcm9fd29yZDsKLSAgICBjb25zdCBjaGFyCQkqZmlsZW5hbWU7Ci0gICAgbG9uZwkJKmNvdW50czsKLSAgICBsb25nCQluY291bnRzOwotICAgIHN0cnVjdCBiYgkJKm5leHQ7Ci0gICAgY29uc3QgdW5zaWduZWQgbG9uZwkqYWRkcmVzc2VzOwotfTsKLQotc3RydWN0IGJiICpfX2JiX2hlYWQgPSAoc3RydWN0IGJiICopMDsKLQotCi12b2lkCi1fX2JiX2V4aXRfZnVuYyAodm9pZCkKLXsKLSAgICBjb25zdCBpbnQgdmVyc2lvbiA9IEdNT05fVkVSU0lPTjsKLSAgICBzdHJ1Y3QgZ21vbl9oZHIgZ2hkcjsKLSAgICBzdHJ1Y3QgYmIgKnB0cjsKLSAgICBGSUxFICpmcDsKLSAgICAvKgotICAgICAqIEdFTl9HTU9OX0NOVF9GSUxFIHNob3VsZCBiZSBkZWZpbmVkIG9uIHN5c3RlbXMgd2l0aCBtY2xlYW51cCgpCi0gICAgICogZnVuY3Rpb25zIHRoYXQgZG8gbm90IHdyaXRlIGJhc2ljLWJsb2NrIHRvIGdtb24ub3V0LiAgSW4gc3VjaAotICAgICAqIGNhc2VzIHByb2ZpbGluZyB3aXRoICItcGcgLWEiIHdvdWxkIHJlc3VsdCBpbiBhIGdtb24ub3V0IGZpbGUKLSAgICAgKiB3aXRob3V0IGJhc2ljLWJsb2NrIGluZm8gKGJlY2F1c2UgdGhlIGZpbGUgd3JpdHRlbiBoZXJlIHdvdWxkCi0gICAgICogYmUgb3ZlcndyaXR0ZW4uICBUaHVzLCBhIHNlcGFyYXRlIGZpbGUgaXMgZ2VuZXJhdGVkIGluc3RlYWQuCi0gICAgICogVGhlIHR3byBmaWxlcyBjYW4gZWFzaWx5IGJlIGNvbWJpbmVkIGJ5IHNwZWNpZnlpbmcgdGhlbQotICAgICAqIG9uIGdwcm9mJ3MgY29tbWFuZCBsaW5lIChhbmQgcG9zc2libHkgZ2VuZXJhdGluZyBhIGdtb24uc3VtCi0gICAgICogZmlsZSB3aXRoICJncHJvZiAtcyIpLgotICAgICAqLwotI2lmbmRlZiBHRU5fR01PTl9DTlRfRklMRQotIyAgIGRlZmluZSBPVVRfTkFNRQkiZ21vbi5vdXQiCi0jZWxzZQotIyAgIGRlZmluZSBPVVRfTkFNRQkiZ21vbi5jbnQiCi0jZW5kaWYKLSAgICBmcCA9IGZvcGVuKE9VVF9OQU1FLCAid2IiKTsKLSAgICBpZiAoIWZwKSB7Ci0JcGVycm9yKE9VVF9OQU1FKTsKLQlyZXR1cm47Ci0gICAgfSAvKiBpZiAqLwotICAgIG1lbWNweSgmZ2hkci5jb29raWVbMF0sIEdNT05fTUFHSUMsIDQpOwotICAgIG1lbWNweSgmZ2hkci52ZXJzaW9uLCAmdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKTsKLSAgICBmd3JpdGUoJmdoZHIsIHNpemVvZihnaGRyKSwgMSwgZnApOwotCi0gICAgZm9yIChwdHIgPSBfX2JiX2hlYWQ7IHB0ciAhPSAwOyBwdHIgPSBwdHItPm5leHQpIHsKLQl1X2ludCBuY291bnRzID0gcHRyLT5uY291bnRzOwotCXVfY2hhciB0YWc7Ci0JdV9pbnQgaTsKLQotCXRhZyA9IEdNT05fVEFHX0JCX0NPVU5UOwotCWZ3cml0ZSgmdGFnLCBzaXplb2YodGFnKSwgMSwgZnApOwotCWZ3cml0ZSgmbmNvdW50cywgc2l6ZW9mKG5jb3VudHMpLCAxLCBmcCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbmNvdW50czsgKytpKSB7Ci0JICAgIGZ3cml0ZSgmcHRyLT5hZGRyZXNzZXNbaV0sIHNpemVvZihwdHItPmFkZHJlc3Nlc1swXSksIDEsIGZwKTsKLQkgICAgZndyaXRlKCZwdHItPmNvdW50c1tpXSwgc2l6ZW9mKHB0ci0+Y291bnRzWzBdKSwgMSwgZnApOwotCX0gLyogZm9yICovCi0gICAgfSAvKiBmb3IgKi8KLSAgICBmY2xvc2UgKGZwKTsKLX0gLyogX19iYl9leGl0X2Z1bmMgKi8KLQotCQkJLyoqKiBlbmQgb2YgX19iYl9leGl0X2Z1bmMuYyAqKiovCmRpZmYgLS1naXQgYS9ncHJvZi9iYmNvbnYucGwgYi9ncHJvZi9iYmNvbnYucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczMTJmNTEuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvYmJjb252LnBsCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyEgL3Vzci9iaW4vcGVybAotCi0jIFRoaXMgc2NyaXB0IGNvbnZlcnRzIGEgImJiLm91dCIgZmlsZSBpbnRvIGEgZm9ybWF0Ci0jIHN1aXRhYmxlIGZvciBwcm9jZXNzaW5nIGJ5IGdwcm9mCi0KLSMgV3JpdGUgYSBuZXctc3R5bGUgZ21vbiBoZWFkZXIKLQotcHJpbnQgcGFjaygiQTRJeDEyIiwgImdtb24iLCAxKTsKLQotCi0jIFRoZSBpbnB1dCBmaWxlIGZvcm1hdCBjb250YWlucyBoZWFkZXIgbGluZXMgYW5kIGRhdGEgbGluZXMuCi0jIEhlYWRlciBsaW5lcyBjb250YWluIGEgY291bnQgb2YgaG93IG1hbnkgZGF0YSBsaW5lcyBmb2xsb3cgYmVmb3JlCi0jIHRoZSBuZXh0IGhlYWRlciBsaW5lLiAgJGJsb2NrY291bnQgaXMgc2V0IHRvIHRoZSBjb3VudCB0aGF0Ci0jIGFwcGVhcnMgaW4gZWFjaCBoZWFkZXIgbGluZSwgdGhlbiBkZWNyZW1lbnRlZCBhdCBlYWNoIGRhdGEgbGluZS4KLSMgJGJsb2NrY291bnQgc2hvdWxkIGFsd2F5cyBiZSB6ZXJvIGF0IHRoZSBzdGFydCBvZiBhIGhlYWRlciBsaW5lLAotIyBhbmQgc2hvdWxkIG5ldmVyIGJlIHplcm8gYXQgdGhlIHN0YXJ0IG9mIGEgZGF0YSBsaW5lLgotCi0kYmxvY2tjb3VudD0wOwotCi13aGlsZSAoPD4pIHsKLSAgICBpZiAoL15GaWxlIC4qLCAoWzAtOV0rKSBiYXNpYyBibG9ja3MvKSB7Ci0JcHJpbnQgU1RERVJSICJNaXNjb3VudDogbGluZSAkLlxuIiBpZiAoJGJsb2NrY291bnQgIT0gMCk7Ci0JJGJsb2NrY291bnQgPSAkMTsKLQotCXByaW50IHBhY2soImNJIiwgMiwgJGJsb2NrY291bnQpOwotICAgIH0KLSAgICBpZiAoL0Jsb2NrLipleGVjdXRlZChbIDAtOV0rKSB0aW1lLiogYWRkcmVzcz0gMHgoWzAtOWEtZkEtRl0qKS8pIHsKLQlwcmludCBTVERFUlIgIk1pc2NvdW50OiBsaW5lICQuXG4iIGlmICgkYmxvY2tjb3VudCA9PSAwKTsKLQkkYmxvY2tjb3VudC0tIGlmICgkYmxvY2tjb3VudCA+IDApOwotCi0JJGNvdW50ID0gJDE7Ci0JJGFkZHIgPSBoZXggJDI7Ci0KLQlwcmludCBwYWNrKCJJSSIsJGFkZHIsJGNvdW50KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9ic2RfY2FsbGdfYmwubSBiL2dwcm9mL2JzZF9jYWxsZ19ibC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzNjOTZjLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2JzZF9jYWxsZ19ibC5tCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLQotCi0KLWNhbGwgZ3JhcGggcHJvZmlsZToKLSAgICAgICAgICBUaGUgc3VtIG9mIHNlbGYgYW5kIGRlc2NlbmRlbnRzIGlzIHRoZSBtYWpvciBzb3J0Ci0gICAgICAgICAgZm9yIHRoaXMgbGlzdGluZy4KLQotICAgICAgICAgIGZ1bmN0aW9uIGVudHJpZXM6Ci0KLWluZGV4ICAgICB0aGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBjYWxsIGdyYXBoCi0gICAgICAgICAgbGlzdGluZywgYXMgYW4gYWlkIHRvIGxvY2F0aW5nIGl0IChzZWUgYmVsb3cpLgotCi0ldGltZSAgICAgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIHRpbWUgb2YgdGhlIHByb2dyYW0KLSAgICAgICAgICBhY2NvdW50ZWQgZm9yIGJ5IHRoaXMgZnVuY3Rpb24gYW5kIGl0cwotICAgICAgICAgIGRlc2NlbmRlbnRzLgotCi1zZWxmICAgICAgdGhlIG51bWJlciBvZiBzZWNvbmRzIHNwZW50IGluIHRoaXMgZnVuY3Rpb24KLSAgICAgICAgICBpdHNlbGYuCi0KLWRlc2NlbmRlbnRzCi0gICAgICAgICAgdGhlIG51bWJlciBvZiBzZWNvbmRzIHNwZW50IGluIHRoZSBkZXNjZW5kZW50cyBvZgotICAgICAgICAgIHRoaXMgZnVuY3Rpb24gb24gYmVoYWxmIG9mIHRoaXMgZnVuY3Rpb24uCi0KLWNhbGxlZCAgICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIChvdGhlcgotICAgICAgICAgIHRoYW4gcmVjdXJzaXZlIGNhbGxzKS4KLQotc2VsZiAgICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiBjYWxscyBpdHNlbGYKLSAgICAgICAgICByZWN1cnNpdmVseS4KLQotbmFtZSAgICAgIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiwgd2l0aCBhbiBpbmRpY2F0aW9uIG9mCi0gICAgICAgICAgaXRzIG1lbWJlcnNoaXAgaW4gYSBjeWNsZSwgaWYgYW55LgotCi1pbmRleCAgICAgdGhlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgY2FsbCBncmFwaAotICAgICAgICAgIGxpc3RpbmcsIGFzIGFuIGFpZCB0byBsb2NhdGluZyBpdC4KLQotCi0KLSAgICAgICAgICBwYXJlbnQgbGlzdGluZ3M6Ci0KLXNlbGYqICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgb2YgdGhpcyBmdW5jdGlvbidzIHNlbGYgdGltZQotICAgICAgICAgIHdoaWNoIGlzIGR1ZSB0byBjYWxscyBmcm9tIHRoaXMgcGFyZW50LgotCi1kZXNjZW5kZW50cyoKLSAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgb2YgdGhpcyBmdW5jdGlvbidzCi0gICAgICAgICAgZGVzY2VuZGVudCB0aW1lIHdoaWNoIGlzIGR1ZSB0byBjYWxscyBmcm9tIHRoaXMKLSAgICAgICAgICBwYXJlbnQuCi0KLWNhbGxlZCoqICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5Ci0gICAgICAgICAgdGhpcyBwYXJlbnQuICBUaGlzIGlzIHRoZSBudW1lcmF0b3Igb2YgdGhlCi0gICAgICAgICAgZnJhY3Rpb24gd2hpY2ggZGl2aWRlcyB1cCB0aGUgZnVuY3Rpb24ncyB0aW1lIHRvCi0gICAgICAgICAgaXRzIHBhcmVudHMuCi0KLXRvdGFsKiAgICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZCBieQotICAgICAgICAgIGFsbCBvZiBpdHMgcGFyZW50cy4gIFRoaXMgaXMgdGhlIGRlbm9taW5hdG9yIG9mCi0gICAgICAgICAgdGhlIHByb3BhZ2F0aW9uIGZyYWN0aW9uLgotCi1wYXJlbnRzICAgdGhlIG5hbWUgb2YgdGhpcyBwYXJlbnQsIHdpdGggYW4gaW5kaWNhdGlvbiBvZiB0aGUKLSAgICAgICAgICBwYXJlbnQncyBtZW1iZXJzaGlwIGluIGEgY3ljbGUsIGlmIGFueS4KLQotaW5kZXggICAgIHRoZSBpbmRleCBvZiB0aGlzIHBhcmVudCBpbiB0aGUgY2FsbCBncmFwaAotICAgICAgICAgIGxpc3RpbmcsIGFzIGFuIGFpZCBpbiBsb2NhdGluZyBpdC4KLQotCi0KLSAgICAgICAgICBjaGlsZHJlbiBsaXN0aW5nczoKLQotc2VsZiogICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBvZiB0aGlzIGNoaWxkJ3Mgc2VsZiB0aW1lCi0gICAgICAgICAgd2hpY2ggaXMgZHVlIHRvIGJlaW5nIGNhbGxlZCBieSB0aGlzIGZ1bmN0aW9uLgotCi1kZXNjZW5kZW50KgotICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBvZiB0aGlzIGNoaWxkJ3MgZGVzY2VuZGVudCdzCi0gICAgICAgICAgdGltZSB3aGljaCBpcyBkdWUgdG8gYmVpbmcgY2FsbGVkIGJ5IHRoaXMKLSAgICAgICAgICBmdW5jdGlvbi4KLQotY2FsbGVkKiogIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBjaGlsZCBpcyBjYWxsZWQgYnkgdGhpcwotICAgICAgICAgIGZ1bmN0aW9uLiAgVGhpcyBpcyB0aGUgbnVtZXJhdG9yIG9mIHRoZQotICAgICAgICAgIHByb3BhZ2F0aW9uIGZyYWN0aW9uIGZvciB0aGlzIGNoaWxkLgotCi10b3RhbCogICAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGNoaWxkIGlzIGNhbGxlZCBieSBhbGwKLSAgICAgICAgICBmdW5jdGlvbnMuICBUaGlzIGlzIHRoZSBkZW5vbWluYXRvciBvZiB0aGUKLSAgICAgICAgICBwcm9wYWdhdGlvbiBmcmFjdGlvbi4KLQotY2hpbGRyZW4gIHRoZSBuYW1lIG9mIHRoaXMgY2hpbGQsIGFuZCBhbiBpbmRpY2F0aW9uIG9mIGl0cwotICAgICAgICAgIG1lbWJlcnNoaXAgaW4gYSBjeWNsZSwgaWYgYW55LgotCi1pbmRleCAgICAgdGhlIGluZGV4IG9mIHRoaXMgY2hpbGQgaW4gdGhlIGNhbGwgZ3JhcGggbGlzdGluZywKLSAgICAgICAgICBhcyBhbiBhaWQgdG8gbG9jYXRpbmcgaXQuCi0KLQotCi0gICAgICAgICAgKiB0aGVzZSBmaWVsZHMgYXJlIG9taXR0ZWQgZm9yIHBhcmVudHMgKG9yCi0gICAgICAgICAgY2hpbGRyZW4pIGluIHRoZSBzYW1lIGN5Y2xlIGFzIHRoZSBmdW5jdGlvbi4gIElmCi0gICAgICAgICAgdGhlIGZ1bmN0aW9uIChvciBjaGlsZCkgaXMgYSBtZW1iZXIgb2YgYSBjeWNsZSwKLSAgICAgICAgICB0aGUgcHJvcGFnYXRlZCB0aW1lcyBhbmQgcHJvcGFnYXRpb24gZGVub21pbmF0b3IKLSAgICAgICAgICByZXByZXNlbnQgdGhlIHNlbGYgdGltZSBhbmQgZGVzY2VuZGVudCB0aW1lIG9mIHRoZQotICAgICAgICAgIGN5Y2xlIGFzIGEgd2hvbGUuCi0KLSAgICAgICAgICAqKiBzdGF0aWMtb25seSBwYXJlbnRzIGFuZCBjaGlsZHJlbiBhcmUgaW5kaWNhdGVkCi0gICAgICAgICAgYnkgYSBjYWxsIGNvdW50IG9mIDAuCi0KLQotCi0gICAgICAgICAgY3ljbGUgbGlzdGluZ3M6Ci0gICAgICAgICAgdGhlIGN5Y2xlIGFzIGEgd2hvbGUgaXMgbGlzdGVkIHdpdGggdGhlIHNhbWUKLSAgICAgICAgICBmaWVsZHMgYXMgYSBmdW5jdGlvbiBlbnRyeS4gIEJlbG93IGl0IGFyZSBsaXN0ZWQKLSAgICAgICAgICB0aGUgbWVtYmVycyBvZiB0aGUgY3ljbGUsIGFuZCB0aGVpciBjb250cmlidXRpb25zCi0gICAgICAgICAgdG8gdGhlIHRpbWUgYW5kIGNhbGwgY291bnRzIG9mIHRoZSBjeWNsZS4KLQwKZGlmZiAtLWdpdCBhL2dwcm9mL2NhbGxfZ3JhcGguYyBiL2dwcm9mL2NhbGxfZ3JhcGguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxMmNiZC4uMDAwMDAwMAotLS0gYS9ncHJvZi9jYWxsX2dyYXBoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjYWxsX2dyYXBoLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJnbW9uX2lvLmgiCi0jaW5jbHVkZSAiZ21vbl9vdXQuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLSNpbmNsdWRlICJzeW1faWRzLmgiCi0KLWV4dGVybiB2b2lkCi1ERUZVTiAoY2dfdGFsbHksIChmcm9tX3BjLCBzZWxmX3BjLCBjb3VudCksCi0gICAgICAgYmZkX3ZtYSBmcm9tX3BjIEFORCBiZmRfdm1hIHNlbGZfcGMgQU5EIHVuc2lnbmVkIGxvbmcgY291bnQpCi17Ci0gIFN5bSAqcGFyZW50OwotICBTeW0gKmNoaWxkOwotCi0gIHBhcmVudCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGZyb21fcGMpOwotICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIHNlbGZfcGMpOwotCi0gIGlmIChjaGlsZCA9PSBOVUxMIHx8IHBhcmVudCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBJZiB3ZSdyZSBkb2luZyBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLCBib3RoIHRoZSBwYXJlbnQgYW5kIHRoZQotICAgICBjaGlsZCB3aWxsIHByb2JhYmx5IHBvaW50IHRvIGxpbmUgc3ltYm9scyBpbnN0ZWFkIG9mIGZ1bmN0aW9uCi0gICAgIHN5bWJvbHMuICBGb3IgdGhlIHBhcmVudCB0aGlzIGlzIGZpbmUsIHNpbmNlIHRoaXMgaWRlbnRpZmllcyB0aGUKLSAgICAgbGluZSBudW1iZXIgaW4gdGhlIGNhbGxpbmcgcm91dGluZywgYnV0IHRoZSBjaGlsZCBzaG91bGQgYWx3YXlzCi0gICAgIHBvaW50IHRvIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQsIHNvIHdlIGJhY2sgdXAgaW4gdGhlIHN5bWJvbAotICAgICB0YWJsZSB1bnRpbCB3ZSBmaW5kIGl0LgotICAgCi0gICAgIEZvciBub3JtYWwgcHJvZmlsaW5nLCBpc19mdW5jIHdpbGwgYmUgc2V0IG9uIGFsbCBzeW1ib2xzLCBzbyB0aGlzCi0gICAgIGNvZGUgd2lsbCBkbyBub3RoaW5nLiAgKi8KLQotICB3aGlsZSAoY2hpbGQgPj0gc3ltdGFiLmJhc2UgJiYgISBjaGlsZC0+aXNfZnVuYykKLSAgICAtLWNoaWxkOwotCi0gIGlmIChjaGlsZCA8IHN5bXRhYi5iYXNlKQotICAgIHJldHVybjsKLQotICAvKgotICAgKiBLZWVwIGFyYyBpZiBpdCBpcyBvbiBJTkNMX0FSQ1MgdGFibGUgb3IgaWYgdGhlIElOQ0xfQVJDUyB0YWJsZQotICAgKiBpcyBlbXB0eSBhbmQgaXQgaXMgbm90IGluIHRoZSBFWENMX0FSQ1MgdGFibGUuCi0gICAqLwotICBpZiAoc3ltX2lkX2FyY19pc19wcmVzZW50ICgmc3ltc1tJTkNMX0FSQ1NdLCBwYXJlbnQsIGNoaWxkKQotICAgICAgfHwgKHN5bXNbSU5DTF9BUkNTXS5sZW4gPT0gMAotCSAgJiYgIXN5bV9pZF9hcmNfaXNfcHJlc2VudCAoJnN5bXNbRVhDTF9BUkNTXSwgcGFyZW50LCBjaGlsZCkpKQotICAgIHsKLSAgICAgIGNoaWxkLT5uY2FsbHMgKz0gY291bnQ7Ci0gICAgICBEQkcgKFRBTExZREVCVUcsCi0JICAgcHJpbnRmIChfKCJbY2dfdGFsbHldIGFyYyBmcm9tICVzIHRvICVzIHRyYXZlcnNlZCAlbHUgdGltZXNcbiIpLAotCQkgICBwYXJlbnQtPm5hbWUsIGNoaWxkLT5uYW1lLCBjb3VudCkpOwotICAgICAgYXJjX2FkZCAocGFyZW50LCBjaGlsZCwgY291bnQpOwotICAgIH0KLX0KLQotCi0vKgotICogUmVhZCBhIHJlY29yZCBmcm9tIGZpbGUgSUZQIGRlc2NyaWJpbmcgYW4gYXJjIGluIHRoZSBmdW5jdGlvbgotICogY2FsbC1ncmFwaCBhbmQgdGhlIGNvdW50IG9mIGhvdyBtYW55IHRpbWVzIHRoZSBhcmMgaGFzIGJlZW4KLSAqIHRyYXZlcnNlZC4gIEZJTEVOQU1FIGlzIHRoZSBuYW1lIG9mIGZpbGUgSUZQIGFuZCBpcyBwcm92aWRlZAotICogZm9yIGZvcm1hdHRpbmcgZXJyb3ItbWVzc2FnZXMgb25seS4KLSAqLwotdm9pZAotREVGVU4gKGNnX3JlYWRfcmVjLCAoaWZwLCBmaWxlbmFtZSksIEZJTEUgKiBpZnAgQU5EIENPTlNUIGNoYXIgKmZpbGVuYW1lKQotewotICBiZmRfdm1hIGZyb21fcGMsIHNlbGZfcGM7Ci0gIHN0cnVjdCBnbW9uX2NnX2FyY19yZWNvcmQgYXJjOwotICB1bnNpZ25lZCBsb25nIGNvdW50OwotCi0gIGlmIChmcmVhZCAoJmFyYywgc2l6ZW9mIChhcmMpLCAxLCBpZnApICE9IDEpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGVcbiIpLAotCSAgICAgICB3aG9hbWksIGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLSAgZnJvbV9wYyA9IGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgYXJjLmZyb21fcGMpOwotICBzZWxmX3BjID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBhcmMuc2VsZl9wYyk7Ci0gIGNvdW50ID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBhcmMuY291bnQpOwotICBEQkcgKFNBTVBMRURFQlVHLAotICAgICAgIHByaW50ZiAoIltjZ19yZWFkX3JlY10gZnJvbXBjIDB4JWx4IHNlbGZwYyAweCVseCBjb3VudCAlbHVcbiIsCi0JICAgICAgIGZyb21fcGMsIHNlbGZfcGMsIGNvdW50KSk7Ci0gIC8qIGFkZCB0aGlzIGFyYzogKi8KLSAgY2dfdGFsbHkgKGZyb21fcGMsIHNlbGZfcGMsIGNvdW50KTsKLX0KLQotCi0vKgotICogV3JpdGUgYWxsIHRoZSBhcmNzIGluIHRoZSBjYWxsLWdyYXBoIHRvIGZpbGUgT0ZQLiAgRklMRU5BTUUgaXMKLSAqIHRoZSBuYW1lIG9mIE9GUCBhbmQgaXMgcHJvdmlkZWQgZm9yIGZvcm1hdHRpbmcgZXJyb3ItbWVzc2FnZXMKLSAqIG9ubHkuCi0gKi8KLXZvaWQKLURFRlVOIChjZ193cml0ZV9hcmNzLCAob2ZwLCBmaWxlbmFtZSksIEZJTEUgKiBvZnAgQU5EIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBjb25zdCB1bnNpZ25lZCBjaGFyIHRhZyA9IEdNT05fVEFHX0NHX0FSQzsKLSAgc3RydWN0IGdtb25fY2dfYXJjX3JlY29yZCByYXdfYXJjOwotICBBcmMgKmFyYzsKLSAgU3ltICpzeW07Ci0KLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyBzeW0rKykKLSAgICB7Ci0gICAgICBmb3IgKGFyYyA9IHN5bS0+Y2cuY2hpbGRyZW47IGFyYzsgYXJjID0gYXJjLT5uZXh0X2NoaWxkKQotCXsKLQkgIHB1dF92bWEgKGNvcmVfYmZkLCBhcmMtPnBhcmVudC0+YWRkciwgKGJmZF9ieXRlICopIHJhd19hcmMuZnJvbV9wYyk7Ci0JICBwdXRfdm1hIChjb3JlX2JmZCwgYXJjLT5jaGlsZC0+YWRkciwgKGJmZF9ieXRlICopIHJhd19hcmMuc2VsZl9wYyk7Ci0JICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgYXJjLT5jb3VudCwgKGJmZF9ieXRlICopIHJhd19hcmMuY291bnQpOwotCSAgaWYgKGZ3cml0ZSAoJnRhZywgc2l6ZW9mICh0YWcpLCAxLCBvZnApICE9IDEKLQkgICAgICB8fCBmd3JpdGUgKCZyYXdfYXJjLCBzaXplb2YgKHJhd19hcmMpLCAxLCBvZnApICE9IDEpCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCSAgREJHIChTQU1QTEVERUJVRywKLQkgICAgIHByaW50ZiAoIltjZ193cml0ZV9hcmNzXSBmcm9tcGMgMHglbHggc2VsZnBjIDB4JWx4IGNvdW50ICVsdVxuIiwKLQkJICAgICBhcmMtPnBhcmVudC0+YWRkciwgYXJjLT5jaGlsZC0+YWRkciwgYXJjLT5jb3VudCkpOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9jYWxsX2dyYXBoLmggYi9ncHJvZi9jYWxsX2dyYXBoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTEzOWIuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY2FsbF9ncmFwaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2lmbmRlZiBjYWxsX2dyYXBoX2gKLSNkZWZpbmUgY2FsbF9ncmFwaF9oCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLWV4dGVybiB2b2lkIGNnX3RhbGx5IFBBUkFNUyAoKGJmZF92bWEgZnJvbV9wYywgYmZkX3ZtYSBzZWxmX3BjLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCkpOwotZXh0ZXJuIHZvaWQgY2dfcmVhZF9yZWMgUEFSQU1TICgoRklMRSAqIGlmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLWV4dGVybiB2b2lkIGNnX3dyaXRlX2FyY3MgUEFSQU1TICgoRklMRSAqIG9mcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLQotI2VuZGlmIC8qIGNhbGxfZ3JhcGhfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvY2dfYXJjcy5jIGIvZ3Byb2YvY2dfYXJjcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzAyMzE3Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2NnX2FyY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDY4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAotICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKLSAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKLSAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiY2FsbF9ncmFwaC5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjZ19kZm4uaCIKLSNpbmNsdWRlICJjZ19wcmludC5oIgotI2luY2x1ZGUgInV0aWxzLmgiCi0jaW5jbHVkZSAic3ltX2lkcy5oIgotCi1TeW0gKmN5Y2xlX2hlYWRlcjsKLXVuc2lnbmVkIGludCBudW1fY3ljbGVzOwotQXJjICoqYXJjczsKLXVuc2lnbmVkIGludCBudW1hcmNzOwotCi0vKgotICogUmV0dXJuIFRSVUUgaWZmIFBBUkVOVCBoYXMgYW4gYXJjIHRvIGNvdmVycyB0aGUgYWRkcmVzcwotICogcmFuZ2UgY292ZXJlZCBieSBDSElMRC4KLSAqLwotQXJjICoKLURFRlVOIChhcmNfbG9va3VwLCAocGFyZW50LCBjaGlsZCksIFN5bSAqIHBhcmVudCBBTkQgU3ltICogY2hpbGQpCi17Ci0gIEFyYyAqYXJjOwotCi0gIGlmICghcGFyZW50IHx8ICFjaGlsZCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJbYXJjX2xvb2t1cF0gcGFyZW50ID09IDAgfHwgY2hpbGQgPT0gMFxuIik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIERCRyAoTE9PS1VQREVCVUcsIHByaW50ZiAoIlthcmNfbG9va3VwXSBwYXJlbnQgJXMgY2hpbGQgJXNcbiIsCi0JCQkgICAgcGFyZW50LT5uYW1lLCBjaGlsZC0+bmFtZSkpOwotICBmb3IgKGFyYyA9IHBhcmVudC0+Y2cuY2hpbGRyZW47IGFyYzsgYXJjID0gYXJjLT5uZXh0X2NoaWxkKQotICAgIHsKLSAgICAgIERCRyAoTE9PS1VQREVCVUcsIHByaW50ZiAoIlthcmNfbG9va3VwXVx0IHBhcmVudCAlcyBjaGlsZCAlc1xuIiwKLQkJCQlhcmMtPnBhcmVudC0+bmFtZSwgYXJjLT5jaGlsZC0+bmFtZSkpOwotICAgICAgaWYgKGNoaWxkLT5hZGRyID49IGFyYy0+Y2hpbGQtPmFkZHIKLQkgICYmIGNoaWxkLT5lbmRfYWRkciA8PSBhcmMtPmNoaWxkLT5lbmRfYWRkcikKLQl7Ci0JICByZXR1cm4gYXJjOwotCX0KLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLS8qCi0gKiBBZGQgKG9yIGp1c3QgaW5jcmVtZW50KSBhbiBhcmM6Ci0gKi8KLXZvaWQKLURFRlVOIChhcmNfYWRkLCAocGFyZW50LCBjaGlsZCwgY291bnQpLAotICAgICAgIFN5bSAqIHBhcmVudCBBTkQgU3ltICogY2hpbGQgQU5EIHVuc2lnbmVkIGxvbmcgY291bnQpCi17Ci0gIHN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4YXJjcyA9IDA7Ci0gIEFyYyAqYXJjLCAqKm5ld2FyY3M7Ci0KLSAgREJHIChUQUxMWURFQlVHLCBwcmludGYgKCJbYXJjX2FkZF0gJWx1IGFyY3MgZnJvbSAlcyB0byAlc1xuIiwKLQkJCSAgIGNvdW50LCBwYXJlbnQtPm5hbWUsIGNoaWxkLT5uYW1lKSk7Ci0gIGFyYyA9IGFyY19sb29rdXAgKHBhcmVudCwgY2hpbGQpOwotICBpZiAoYXJjKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBBIGhpdDoganVzdCBpbmNyZW1lbnQgdGhlIGNvdW50LgotICAgICAgICovCi0gICAgICBEQkcgKFRBTExZREVCVUcsIHByaW50ZiAoIlt0YWxseV0gaGl0ICVsdSArPSAlbHVcbiIsCi0JCQkgICAgICAgYXJjLT5jb3VudCwgY291bnQpKTsKLSAgICAgIGFyYy0+Y291bnQgKz0gY291bnQ7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBhcmMgPSAoQXJjICopIHhtYWxsb2MgKHNpemVvZiAoKmFyYykpOwotICBtZW1zZXQgKGFyYywgMCwgc2l6ZW9mICgqYXJjKSk7Ci0gIGFyYy0+cGFyZW50ID0gcGFyZW50OwotICBhcmMtPmNoaWxkID0gY2hpbGQ7Ci0gIGFyYy0+Y291bnQgPSBjb3VudDsKLQotICAvKiBJZiB0aGlzIGlzbid0IGFuIGFyYyBmb3IgYSByZWN1cnNpdmUgY2FsbCB0byBwYXJlbnQsIHRoZW4gYWRkIGl0Ci0gICAgIHRvIHRoZSBhcnJheSBvZiBhcmNzLiAgKi8KLSAgaWYgKHBhcmVudCAhPSBjaGlsZCkKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSd2ZSBleGhhdXN0ZWQgc3BhY2UgaW4gb3VyIGN1cnJlbnQgYXJyYXksIGdldCBhIG5ldyBvbmUKLQkgYW5kIGNvcHkgdGhlIGNvbnRlbnRzLiAgIFdlIG1pZ2h0IHdhbnQgdG8gdGhyb3R0bGUgdGhlIGRvdWJsaW5nCi0JIGZhY3RvciBvbmUgZGF5LiAgKi8KLSAgICAgIGlmIChudW1hcmNzID09IG1heGFyY3MpCi0JewotCSAgLyogRGV0ZXJtaW5lIGhvdyBtdWNoIHNwYWNlIHdlIHdhbnQgdG8gYWxsb2NhdGUuICAqLwotCSAgaWYgKG1heGFyY3MgPT0gMCkKLQkgICAgbWF4YXJjcyA9IDE7Ci0JICBtYXhhcmNzICo9IDI7Ci0JCi0JICAvKiBBbGxvY2F0ZSB0aGUgbmV3IGFycmF5LiAgKi8KLQkgIG5ld2FyY3MgPSAoQXJjICoqKXhtYWxsb2Moc2l6ZW9mIChBcmMgKikgKiBtYXhhcmNzKTsKLQotCSAgLyogQ29weSB0aGUgb2xkIGFycmF5J3MgY29udGVudHMgaW50byB0aGUgbmV3IGFycmF5LiAgKi8KLQkgIG1lbWNweSAobmV3YXJjcywgYXJjcywgbnVtYXJjcyAqIHNpemVvZiAoQXJjICopKTsKLQotCSAgLyogRnJlZSB1cCB0aGUgb2xkIGFycmF5LiAgKi8KLQkgIGZyZWUgKGFyY3MpOwotCi0JICAvKiBBbmQgbWFrZSB0aGUgbmV3IGFycmF5IGJlIHRoZSBjdXJyZW50IGFycmF5LiAgKi8KLQkgIGFyY3MgPSBuZXdhcmNzOwotCX0KLQotICAgICAgLyogUGxhY2UgdGhpcyBhcmMgaW4gdGhlIGFyYyBhcnJheS4gICovCi0gICAgICBhcmNzW251bWFyY3MrK10gPSBhcmM7Ci0gICAgfQotCi0gIC8qIHByZXBlbmQgdGhpcyBjaGlsZCB0byB0aGUgY2hpbGRyZW4gb2YgdGhpcyBwYXJlbnQ6ICovCi0gIGFyYy0+bmV4dF9jaGlsZCA9IHBhcmVudC0+Y2cuY2hpbGRyZW47Ci0gIHBhcmVudC0+Y2cuY2hpbGRyZW4gPSBhcmM7Ci0KLSAgLyogcHJlcGVuZCB0aGlzIHBhcmVudCB0byB0aGUgcGFyZW50cyBvZiB0aGlzIGNoaWxkOiAqLwotICBhcmMtPm5leHRfcGFyZW50ID0gY2hpbGQtPmNnLnBhcmVudHM7Ci0gIGNoaWxkLT5jZy5wYXJlbnRzID0gYXJjOwotfQotCi0KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfdG9wbywgKGxwLCBycCksIGNvbnN0IFBUUiBscCBBTkQgY29uc3QgUFRSIHJwKQotewotICBjb25zdCBTeW0gKmxlZnQgPSAqKGNvbnN0IFN5bSAqKikgbHA7Ci0gIGNvbnN0IFN5bSAqcmlnaHQgPSAqKGNvbnN0IFN5bSAqKikgcnA7Ci0KLSAgcmV0dXJuIGxlZnQtPmNnLnRvcF9vcmRlciAtIHJpZ2h0LT5jZy50b3Bfb3JkZXI7Ci19Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOIChwcm9wYWdhdGVfdGltZSwgKHBhcmVudCksIFN5bSAqIHBhcmVudCkKLXsKLSAgQXJjICphcmM7Ci0gIFN5bSAqY2hpbGQ7Ci0gIGRvdWJsZSBzaGFyZSwgcHJvcF9zaGFyZTsKLQotICBpZiAocGFyZW50LT5jZy5wcm9wLmZyYWN0ID09IDAuMCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIGdhdGhlciB0aW1lIGZyb20gY2hpbGRyZW4gb2YgdGhpcyBwYXJlbnQ6ICovCi0KLSAgZm9yIChhcmMgPSBwYXJlbnQtPmNnLmNoaWxkcmVuOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9jaGlsZCkKLSAgICB7Ci0gICAgICBjaGlsZCA9IGFyYy0+Y2hpbGQ7Ci0gICAgICBpZiAoYXJjLT5jb3VudCA9PSAwIHx8IGNoaWxkID09IHBhcmVudCB8fCBjaGlsZC0+Y2cucHJvcC5mcmFjdCA9PSAwKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChjaGlsZC0+Y2cuY3ljLmhlYWQgIT0gY2hpbGQpCi0JewotCSAgaWYgKHBhcmVudC0+Y2cuY3ljLm51bSA9PSBjaGlsZC0+Y2cuY3ljLm51bSkKLQkgICAgewotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBpZiAocGFyZW50LT5jZy50b3Bfb3JkZXIgPD0gY2hpbGQtPmNnLnRvcF9vcmRlcikKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIltwcm9wYWdhdGVdIHRvcG9yZGVyIGJvdGNoZXNcbiIpOwotCSAgICB9Ci0JICBjaGlsZCA9IGNoaWxkLT5jZy5jeWMuaGVhZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHBhcmVudC0+Y2cudG9wX29yZGVyIDw9IGNoaWxkLT5jZy50b3Bfb3JkZXIpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJbcHJvcGFnYXRlXSB0b3BvcmRlciBib3RjaGVzXG4iKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChjaGlsZC0+bmNhbGxzID09IDApCi0JewotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBkaXN0cmlidXRlIHRpbWUgZm9yIHRoaXMgYXJjOiAqLwotICAgICAgYXJjLT50aW1lID0gY2hpbGQtPmhpc3QudGltZSAqICgoKGRvdWJsZSkgYXJjLT5jb3VudCkKLQkJCQkgICAgICAvICgoZG91YmxlKSBjaGlsZC0+bmNhbGxzKSk7Ci0gICAgICBhcmMtPmNoaWxkX3RpbWUgPSBjaGlsZC0+Y2cuY2hpbGRfdGltZQotCSogKCgoZG91YmxlKSBhcmMtPmNvdW50KSAvICgoZG91YmxlKSBjaGlsZC0+bmNhbGxzKSk7Ci0gICAgICBzaGFyZSA9IGFyYy0+dGltZSArIGFyYy0+Y2hpbGRfdGltZTsKLSAgICAgIHBhcmVudC0+Y2cuY2hpbGRfdGltZSArPSBzaGFyZTsKLQotICAgICAgLyogKDEgLSBjZy5wcm9wLmZyYWN0KSBnZXRzIGxvc3QgYWxvbmcgdGhlIHdheTogKi8KLSAgICAgIHByb3Bfc2hhcmUgPSBwYXJlbnQtPmNnLnByb3AuZnJhY3QgKiBzaGFyZTsKLQotICAgICAgLyogZml4IHRoaW5ncyBmb3IgcHJpbnRpbmc6ICovCi0gICAgICBwYXJlbnQtPmNnLnByb3AuY2hpbGQgKz0gcHJvcF9zaGFyZTsKLSAgICAgIGFyYy0+dGltZSAqPSBwYXJlbnQtPmNnLnByb3AuZnJhY3Q7Ci0gICAgICBhcmMtPmNoaWxkX3RpbWUgKj0gcGFyZW50LT5jZy5wcm9wLmZyYWN0OwotCi0gICAgICAvKiBhZGQgdGhpcyBzaGFyZSB0byB0aGUgcGFyZW50J3MgY3ljbGUgaGVhZGVyLCBpZiBhbnk6ICovCi0gICAgICBpZiAocGFyZW50LT5jZy5jeWMuaGVhZCAhPSBwYXJlbnQpCi0JewotCSAgcGFyZW50LT5jZy5jeWMuaGVhZC0+Y2cuY2hpbGRfdGltZSArPSBzaGFyZTsKLQkgIHBhcmVudC0+Y2cuY3ljLmhlYWQtPmNnLnByb3AuY2hpbGQgKz0gcHJvcF9zaGFyZTsKLQl9Ci0gICAgICBEQkcgKFBST1BERUJVRywKLQkgICBwcmludGYgKCJbcHJvcF90aW1lXSBjaGlsZCBcdCIpOwotCSAgIHByaW50X25hbWUgKGNoaWxkKTsKLQkgICBwcmludGYgKCIgd2l0aCAlZiAlZiAlbHUvJWx1XG4iLCBjaGlsZC0+aGlzdC50aW1lLAotCQkgICBjaGlsZC0+Y2cuY2hpbGRfdGltZSwgYXJjLT5jb3VudCwgY2hpbGQtPm5jYWxscyk7Ci0JICAgcHJpbnRmICgiW3Byb3BfdGltZV0gcGFyZW50XHQiKTsKLQkgICBwcmludF9uYW1lIChwYXJlbnQpOwotCSAgIHByaW50ZiAoIlxuW3Byb3BfdGltZV0gc2hhcmUgJWZcbiIsIHNoYXJlKSk7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBDb21wdXRlIHRoZSB0aW1lIG9mIGEgY3ljbGUgYXMgdGhlIHN1bSBvZiB0aGUgdGltZXMgb2YgYWxsCi0gKiBpdHMgbWVtYmVycy4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOX1ZPSUQgKGN5Y2xlX3RpbWUpCi17Ci0gIFN5bSAqbWVtYmVyLCAqY3ljOwotCi0gIGZvciAoY3ljID0gJmN5Y2xlX2hlYWRlclsxXTsgY3ljIDw9ICZjeWNsZV9oZWFkZXJbbnVtX2N5Y2xlc107ICsrY3ljKQotICAgIHsKLSAgICAgIGZvciAobWVtYmVyID0gY3ljLT5jZy5jeWMubmV4dDsgbWVtYmVyOyBtZW1iZXIgPSBtZW1iZXItPmNnLmN5Yy5uZXh0KQotCXsKLQkgIGlmIChtZW1iZXItPmNnLnByb3AuZnJhY3QgPT0gMC4wKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBBbGwgbWVtYmVycyBoYXZlIHRoZSBzYW1lIHByb3BmcmFjdGlvbiBleGNlcHQgdGhvc2UKLQkgICAgICAgKiB0aGF0IHdlcmUgZXhjbHVkZWQgd2l0aCAtRS4KLQkgICAgICAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgY3ljLT5oaXN0LnRpbWUgKz0gbWVtYmVyLT5oaXN0LnRpbWU7Ci0JfQotICAgICAgY3ljLT5jZy5wcm9wLnNlbGYgPSBjeWMtPmNnLnByb3AuZnJhY3QgKiBjeWMtPmhpc3QudGltZTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOX1ZPSUQgKGN5Y2xlX2xpbmspCi17Ci0gIFN5bSAqc3ltLCAqY3ljLCAqbWVtYmVyOwotICBBcmMgKmFyYzsKLSAgaW50IG51bTsKLQotICAvKiBjb3VudCB0aGUgbnVtYmVyIG9mIGN5Y2xlcywgYW5kIGluaXRpYWxpemUgdGhlIGN5Y2xlIGxpc3RzOiAqLwotCi0gIG51bV9jeWNsZXMgPSAwOwotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQotICAgIHsKLSAgICAgIC8qIHRoaXMgaXMgaG93IHlvdSBmaW5kIHVuYXR0YWNoZWQgY3ljbGVzOiAqLwotICAgICAgaWYgKHN5bS0+Y2cuY3ljLmhlYWQgPT0gc3ltICYmIHN5bS0+Y2cuY3ljLm5leHQpCi0JewotCSAgKytudW1fY3ljbGVzOwotCX0KLSAgICB9Ci0KLSAgLyoKLSAgICogY3ljbGVfaGVhZGVyIGlzIGluZGV4ZWQgYnkgY3ljbGUgbnVtYmVyOiBpLmUuIGl0IGlzIG9yaWdpbiAxLAotICAgKiBub3Qgb3JpZ2luIDAuCi0gICAqLwotICBjeWNsZV9oZWFkZXIgPSAoU3ltICopIHhtYWxsb2MgKChudW1fY3ljbGVzICsgMSkgKiBzaXplb2YgKFN5bSkpOwotCi0gIC8qCi0gICAqIE5vdyBsaW5rIGN5Y2xlcyB0byB0cnVlIGN5Y2xlLWhlYWRzLCBudW1iZXIgdGhlbSwgYWNjdW11bGF0ZQotICAgKiB0aGUgZGF0YSBmb3IgdGhlIGN5Y2xlLgotICAgKi8KLSAgbnVtID0gMDsKLSAgY3ljID0gY3ljbGVfaGVhZGVyOwotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQotICAgIHsKLSAgICAgIGlmICghKHN5bS0+Y2cuY3ljLmhlYWQgPT0gc3ltICYmIHN5bS0+Y2cuY3ljLm5leHQgIT0gMCkpCi0JewotCSAgY29udGludWU7Ci0JfQotICAgICAgKytudW07Ci0gICAgICArK2N5YzsKLSAgICAgIHN5bV9pbml0IChjeWMpOwotICAgICAgY3ljLT5jZy5wcmludF9mbGFnID0gVFJVRTsJLyogc2hvdWxkIHRoaXMgYmUgcHJpbnRlZD8gKi8KLSAgICAgIGN5Yy0+Y2cudG9wX29yZGVyID0gREZOX05BTjsJLyogZ3JhcGggY2FsbCBjaGFpbiB0b3Atc29ydCBvcmRlciAqLwotICAgICAgY3ljLT5jZy5jeWMubnVtID0gbnVtOwkvKiBpbnRlcm5hbCBudW1iZXIgb2YgY3ljbGUgb24gKi8KLSAgICAgIGN5Yy0+Y2cuY3ljLmhlYWQgPSBjeWM7CS8qIHBvaW50ZXIgdG8gaGVhZCBvZiBjeWNsZSAqLwotICAgICAgY3ljLT5jZy5jeWMubmV4dCA9IHN5bTsJLyogcG9pbnRlciB0byBuZXh0IG1lbWJlciBvZiBjeWNsZSAqLwotICAgICAgREJHIChDWUNMRURFQlVHLCBwcmludGYgKCJbY3ljbGVfbGlua10gIik7Ci0JICAgcHJpbnRfbmFtZSAoc3ltKTsKLQkgICBwcmludGYgKCIgaXMgdGhlIGhlYWQgb2YgY3ljbGUgJWRcbiIsIG51bSkpOwotCi0gICAgICAvKiBsaW5rIG1lbWJlcnMgdG8gY3ljbGUgaGVhZGVyOiAqLwotICAgICAgZm9yIChtZW1iZXIgPSBzeW07IG1lbWJlcjsgbWVtYmVyID0gbWVtYmVyLT5jZy5jeWMubmV4dCkKLQl7Ci0JICBtZW1iZXItPmNnLmN5Yy5udW0gPSBudW07Ci0JICBtZW1iZXItPmNnLmN5Yy5oZWFkID0gY3ljOwotCX0KLQotICAgICAgLyoKLSAgICAgICAqIENvdW50IGNhbGxzIGZyb20gb3V0c2lkZSB0aGUgY3ljbGUgYW5kIHRob3NlIGFtb25nIGN5Y2xlCi0gICAgICAgKiBtZW1iZXJzOgotICAgICAgICovCi0gICAgICBmb3IgKG1lbWJlciA9IHN5bTsgbWVtYmVyOyBtZW1iZXIgPSBtZW1iZXItPmNnLmN5Yy5uZXh0KQotCXsKLQkgIGZvciAoYXJjID0gbWVtYmVyLT5jZy5wYXJlbnRzOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9wYXJlbnQpCi0JICAgIHsKLQkgICAgICBpZiAoYXJjLT5wYXJlbnQgPT0gbWVtYmVyKQotCQl7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBpZiAoYXJjLT5wYXJlbnQtPmNnLmN5Yy5udW0gPT0gbnVtKQotCQl7Ci0JCSAgY3ljLT5jZy5zZWxmX2NhbGxzICs9IGFyYy0+Y291bnQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjeWMtPm5jYWxscyArPSBhcmMtPmNvdW50OwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0KLS8qCi0gKiBDaGVjayBpZiBhbnkgcGFyZW50IG9mIHRoaXMgY2hpbGQgKG9yIG91dHNpZGUgcGFyZW50cyBvZiB0aGlzCi0gKiBjeWNsZSkgaGF2ZSB0aGVpciBwcmludCBmbGFncyBvbiBhbmQgc2V0IHRoZSBwcmludCBmbGFnIG9mIHRoZQotICogY2hpbGQgKGN5Y2xlKSBhcHByb3ByaWF0ZWx5LiAgU2ltaWxhcmx5LCBkZWFsIHdpdGggcHJvcGFnYXRpb24KLSAqIGZyYWN0aW9ucyBmcm9tIHBhcmVudHMuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoaW5oZXJpdF9mbGFncywgKGNoaWxkKSwgU3ltICogY2hpbGQpCi17Ci0gIFN5bSAqaGVhZCwgKnBhcmVudCwgKm1lbWJlcjsKLSAgQXJjICphcmM7Ci0KLSAgaGVhZCA9IGNoaWxkLT5jZy5jeWMuaGVhZDsKLSAgaWYgKGNoaWxkID09IGhlYWQpCi0gICAgewotICAgICAgLyoganVzdCBhIHJlZ3VsYXIgY2hpbGQsIGNoZWNrIGl0cyBwYXJlbnRzOiAqLwotICAgICAgY2hpbGQtPmNnLnByaW50X2ZsYWcgPSBGQUxTRTsKLSAgICAgIGNoaWxkLT5jZy5wcm9wLmZyYWN0ID0gMC4wOwotICAgICAgZm9yIChhcmMgPSBjaGlsZC0+Y2cucGFyZW50czsgYXJjOyBhcmMgPSBhcmMtPm5leHRfcGFyZW50KQotCXsKLQkgIHBhcmVudCA9IGFyYy0+cGFyZW50OwotCSAgaWYgKGNoaWxkID09IHBhcmVudCkKLQkgICAgewotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBjaGlsZC0+Y2cucHJpbnRfZmxhZyB8PSBwYXJlbnQtPmNnLnByaW50X2ZsYWc7Ci0JICAvKgotCSAgICogSWYgdGhlIGNoaWxkIHdhcyBuZXZlciBhY3R1YWxseSBjYWxsZWQgKGUuZy4sIHRoaXMgYXJjCi0JICAgKiBpcyBzdGF0aWMgKGFuZCBhbGwgb3RoZXJzIGFyZSwgdG9vKSkgbm8gdGltZSBwcm9wYWdhdGVzCi0JICAgKiBhbG9uZyB0aGlzIGFyYy4KLQkgICAqLwotCSAgaWYgKGNoaWxkLT5uY2FsbHMgIT0gMCkKLQkgICAgewotCSAgICAgIGNoaWxkLT5jZy5wcm9wLmZyYWN0ICs9IHBhcmVudC0+Y2cucHJvcC5mcmFjdAotCQkqICgoKGRvdWJsZSkgYXJjLT5jb3VudCkgLyAoKGRvdWJsZSkgY2hpbGQtPm5jYWxscykpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBJdHMgYSBtZW1iZXIgb2YgYSBjeWNsZSwgbG9vayBhdCBhbGwgcGFyZW50cyBmcm9tIG91dHNpZGUKLSAgICAgICAqIHRoZSBjeWNsZS4KLSAgICAgICAqLwotICAgICAgaGVhZC0+Y2cucHJpbnRfZmxhZyA9IEZBTFNFOwotICAgICAgaGVhZC0+Y2cucHJvcC5mcmFjdCA9IDAuMDsKLSAgICAgIGZvciAobWVtYmVyID0gaGVhZC0+Y2cuY3ljLm5leHQ7IG1lbWJlcjsgbWVtYmVyID0gbWVtYmVyLT5jZy5jeWMubmV4dCkKLQl7Ci0JICBmb3IgKGFyYyA9IG1lbWJlci0+Y2cucGFyZW50czsgYXJjOyBhcmMgPSBhcmMtPm5leHRfcGFyZW50KQotCSAgICB7Ci0JICAgICAgaWYgKGFyYy0+cGFyZW50LT5jZy5jeWMuaGVhZCA9PSBoZWFkKQotCQl7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBwYXJlbnQgPSBhcmMtPnBhcmVudDsKLQkgICAgICBoZWFkLT5jZy5wcmludF9mbGFnIHw9IHBhcmVudC0+Y2cucHJpbnRfZmxhZzsKLQkgICAgICAvKgotCSAgICAgICAqIElmIHRoZSBjeWNsZSB3YXMgbmV2ZXIgYWN0dWFsbHkgY2FsbGVkIChlLmcuIHRoaXMKLQkgICAgICAgKiBhcmMgaXMgc3RhdGljIChhbmQgYWxsIG90aGVycyBhcmUsIHRvbykpIG5vIHRpbWUKLQkgICAgICAgKiBwcm9wYWdhdGVzIGFsb25nIHRoaXMgYXJjLgotCSAgICAgICAqLwotCSAgICAgIGlmIChoZWFkLT5uY2FsbHMgIT0gMCkKLQkJewotCQkgIGhlYWQtPmNnLnByb3AuZnJhY3QgKz0gcGFyZW50LT5jZy5wcm9wLmZyYWN0Ci0JCSAgICAqICgoKGRvdWJsZSkgYXJjLT5jb3VudCkgLyAoKGRvdWJsZSkgaGVhZC0+bmNhbGxzKSk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGZvciAobWVtYmVyID0gaGVhZDsgbWVtYmVyOyBtZW1iZXIgPSBtZW1iZXItPmNnLmN5Yy5uZXh0KQotCXsKLQkgIG1lbWJlci0+Y2cucHJpbnRfZmxhZyA9IGhlYWQtPmNnLnByaW50X2ZsYWc7Ci0JICBtZW1iZXItPmNnLnByb3AuZnJhY3QgPSBoZWFkLT5jZy5wcm9wLmZyYWN0OwotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIEluIG9uZSB0b3AtdG8tYm90dG9tIHBhc3Mgb3ZlciB0aGUgdG9wb2xvZ2ljYWxseSBzb3J0ZWQgc3ltYm9scwotICogcHJvcGFnYXRlOgotICogICAgICBjZy5wcmludF9mbGFnIGFzIHRoZSB1bmlvbiBvZiBwYXJlbnRzJyBwcmludF9mbGFncwotICogICAgICBwcm9wZnJhY3Rpb24gYXMgdGhlIHN1bSBvZiBmcmFjdGlvbmFsIHBhcmVudHMnIHByb3BmcmFjdGlvbnMKLSAqIGFuZCB3aGlsZSB3ZSdyZSBoZXJlLCBzdW0gdGltZSBmb3IgZnVuY3Rpb25zLgotICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHByb3BhZ2F0ZV9mbGFncywgKHN5bWJvbHMpLCBTeW0gKiogc3ltYm9scykKLXsKLSAgaW50IGluZGV4OwotICBTeW0gKm9sZF9oZWFkLCAqY2hpbGQ7Ci0KLSAgb2xkX2hlYWQgPSAwOwotICBmb3IgKGluZGV4ID0gc3ltdGFiLmxlbiAtIDE7IGluZGV4ID49IDA7IC0taW5kZXgpCi0gICAgewotICAgICAgY2hpbGQgPSBzeW1ib2xzW2luZGV4XTsKLSAgICAgIC8qCi0gICAgICAgKiBJZiB3ZSBoYXZlbid0IGRvbmUgdGhpcyBmdW5jdGlvbiBvciBjeWNsZSwgaW5oZXJpdCB0aGluZ3MKLSAgICAgICAqIGZyb20gcGFyZW50LiAgVGhpcyB3YXksIHdlIGFyZSBsaW5lYXIgaW4gdGhlIG51bWJlciBvZiBhcmNzCi0gICAgICAgKiBzaW5jZSB3ZSBkbyBhbGwgbWVtYmVycyBvZiBhIGN5Y2xlIChhbmQgdGhlIGN5Y2xlIGl0c2VsZikKLSAgICAgICAqIGFzIHdlIGhpdCB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBjeWNsZS4KLSAgICAgICAqLwotICAgICAgaWYgKGNoaWxkLT5jZy5jeWMuaGVhZCAhPSBvbGRfaGVhZCkKLQl7Ci0JICBvbGRfaGVhZCA9IGNoaWxkLT5jZy5jeWMuaGVhZDsKLQkgIGluaGVyaXRfZmxhZ3MgKGNoaWxkKTsKLQl9Ci0gICAgICBEQkcgKFBST1BERUJVRywKLQkgICBwcmludGYgKCJbcHJvcF9mbGFnc10gIik7Ci0JICAgcHJpbnRfbmFtZSAoY2hpbGQpOwotCSAgIHByaW50ZiAoImluaGVyaXRzIHByaW50LWZsYWcgJWQgYW5kIHByb3AtZnJhY3QgJWZcbiIsCi0JCSAgIGNoaWxkLT5jZy5wcmludF9mbGFnLCBjaGlsZC0+Y2cucHJvcC5mcmFjdCkpOwotICAgICAgaWYgKCFjaGlsZC0+Y2cucHJpbnRfZmxhZykKLQl7Ci0JICAvKgotCSAgICogUHJpbnRmbGFnIGlzIG9mZi4gSXQgZ2V0cyB0dXJuZWQgb24gYnkgYmVpbmcgaW4gdGhlCi0JICAgKiBJTkNMX0dSQVBIIHRhYmxlLCBvciB0aGVyZSBiZWluZyBhbiBlbXB0eSBJTkNMX0dSQVBICi0JICAgKiB0YWJsZSBhbmQgbm90IGJlaW5nIGluIHRoZSBFWENMX0dSQVBIIHRhYmxlLgotCSAgICovCi0JICBpZiAoc3ltX2xvb2t1cCAoJnN5bXNbSU5DTF9HUkFQSF0sIGNoaWxkLT5hZGRyKQotCSAgICAgIHx8IChzeW1zW0lOQ0xfR1JBUEhdLmxlbiA9PSAwCi0JCSAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfR1JBUEhdLCBjaGlsZC0+YWRkcikpKQotCSAgICB7Ci0JICAgICAgY2hpbGQtPmNnLnByaW50X2ZsYWcgPSBUUlVFOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qCi0JICAgKiBUaGlzIGZ1bmN0aW9uIGhhcyBwcmludGluZyBwYXJlbnRzOiBtYXliZSBzb21lb25lIHdhbnRzCi0JICAgKiB0byBzaHV0IGl0IHVwIGJ5IHB1dHRpbmcgaXQgaW4gdGhlIEVYQ0xfR1JBUEggdGFibGUuCi0JICAgKiAoQnV0IGZhdm9yIElOQ0xfR1JBUEggb3ZlciBFWENMX0dSQVBILikKLQkgICAqLwotCSAgaWYgKCFzeW1fbG9va3VwICgmc3ltc1tJTkNMX0dSQVBIXSwgY2hpbGQtPmFkZHIpCi0JICAgICAgJiYgc3ltX2xvb2t1cCAoJnN5bXNbRVhDTF9HUkFQSF0sIGNoaWxkLT5hZGRyKSkKLQkgICAgewotCSAgICAgIGNoaWxkLT5jZy5wcmludF9mbGFnID0gRkFMU0U7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoY2hpbGQtPmNnLnByb3AuZnJhY3QgPT0gMC4wKQotCXsKLQkgIC8qCi0JICAgKiBObyBwYXJlbnRzIHRvIHBhc3MgdGltZSB0by4gIENvbGxlY3QgdGltZSBmcm9tIGNoaWxkcmVuCi0JICAgKiBpZiBpdHMgaW4gdGhlIElOQ0xfVElNRSB0YWJsZSwgb3IgdGhlcmUgaXMgYW4gZW1wdHkKLQkgICAqIElOQ0xfVElNRSB0YWJsZSBhbmQgaXRzIG5vdCBpbiB0aGUgRVhDTF9USU1FIHRhYmxlLgotCSAgICovCi0JICBpZiAoc3ltX2xvb2t1cCAoJnN5bXNbSU5DTF9USU1FXSwgY2hpbGQtPmFkZHIpCi0JICAgICAgfHwgKHN5bXNbSU5DTF9USU1FXS5sZW4gPT0gMAotCQkgICYmICFzeW1fbG9va3VwICgmc3ltc1tFWENMX1RJTUVdLCBjaGlsZC0+YWRkcikpKQotCSAgICB7Ci0JICAgICAgY2hpbGQtPmNnLnByb3AuZnJhY3QgPSAxLjA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyoKLQkgICAqIEl0IGhhcyBwYXJlbnRzIHRvIHBhc3MgdGltZSB0bywgYnV0IG1heWJlIHNvbWVvbmUgd2FudHMKLQkgICAqIHRvIHNodXQgaXQgdXAgYnkgcHV0dHRpbmcgaXQgaW4gdGhlIEVYQ0xfVElNRSB0YWJsZS4KLQkgICAqIChCdXQgZmF2b3IgYmVpbmcgaW4gSU5DTF9USU1FIHRhYmUgb3ZlciBiZWluZyBpbgotCSAgICogRVhDTF9USU1FIHRhYmxlLikKLQkgICAqLwotCSAgaWYgKCFzeW1fbG9va3VwICgmc3ltc1tJTkNMX1RJTUVdLCBjaGlsZC0+YWRkcikKLQkgICAgICAmJiBzeW1fbG9va3VwICgmc3ltc1tFWENMX1RJTUVdLCBjaGlsZC0+YWRkcikpCi0JICAgIHsKLQkgICAgICBjaGlsZC0+Y2cucHJvcC5mcmFjdCA9IDAuMDsKLQkgICAgfQotCX0KLSAgICAgIGNoaWxkLT5jZy5wcm9wLnNlbGYgPSBjaGlsZC0+aGlzdC50aW1lICogY2hpbGQtPmNnLnByb3AuZnJhY3Q7Ci0gICAgICBwcmludF90aW1lICs9IGNoaWxkLT5jZy5wcm9wLnNlbGY7Ci0gICAgICBEQkcgKFBST1BERUJVRywKLQkgICBwcmludGYgKCJbcHJvcF9mbGFnc10gIik7Ci0JICAgcHJpbnRfbmFtZSAoY2hpbGQpOwotCSAgIHByaW50ZiAoIiBlbmRzIHVwIHdpdGggcHJpbnRmbGFnICVkIGFuZCBwcm9wLWZyYWN0ICVmXG4iLAotCQkgICBjaGlsZC0+Y2cucHJpbnRfZmxhZywgY2hpbGQtPmNnLnByb3AuZnJhY3QpOwotCSAgIHByaW50ZiAoIltwcm9wX2ZsYWdzXSB0aW1lICVmIHByb3BzZWxmICVmIHByaW50X3RpbWUgJWZcbiIsCi0JCSAgIGNoaWxkLT5oaXN0LnRpbWUsIGNoaWxkLT5jZy5wcm9wLnNlbGYsIHByaW50X3RpbWUpKTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIENvbXBhcmUgYnkgZGVjcmVhc2luZyBwcm9wYWdhdGVkIHRpbWUuICBJZiB0aW1lcyBhcmUgZXF1YWwsIGJ1dCBvbmUKLSAqIGlzIGEgY3ljbGUgaGVhZGVyLCBzYXkgdGhhdCdzIGZpcnN0IChlLmcuIGxlc3MsIGkuZS4gLTEpLiAgSWYgb25lJ3MKLSAqIG5hbWUgZG9lc24ndCBoYXZlIGFuIHVuZGVyc2NvcmUgYW5kIHRoZSBvdGhlciBkb2VzLCBzYXkgdGhhdCBvbmUgaXMKLSAqIGZpcnN0LiAgQWxsIGVsc2UgYmVpbmcgZXF1YWwsIGNvbXBhcmUgYnkgbmFtZXMuCi0gKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfdG90YWwsIChscCwgcnApLCBjb25zdCBQVFIgbHAgQU5EIGNvbnN0IFBUUiBycCkKLXsKLSAgY29uc3QgU3ltICpsZWZ0ID0gKihjb25zdCBTeW0gKiopIGxwOwotICBjb25zdCBTeW0gKnJpZ2h0ID0gKihjb25zdCBTeW0gKiopIHJwOwotICBkb3VibGUgZGlmZjsKLQotICBkaWZmID0gKGxlZnQtPmNnLnByb3Auc2VsZiArIGxlZnQtPmNnLnByb3AuY2hpbGQpCi0gICAgLSAocmlnaHQtPmNnLnByb3Auc2VsZiArIHJpZ2h0LT5jZy5wcm9wLmNoaWxkKTsKLSAgaWYgKGRpZmYgPCAwLjApCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAoZGlmZiA+IDAuMCkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpZiAoIWxlZnQtPm5hbWUgJiYgbGVmdC0+Y2cuY3ljLm51bSAhPSAwKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGlmICghcmlnaHQtPm5hbWUgJiYgcmlnaHQtPmNnLmN5Yy5udW0gIT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmICghbGVmdC0+bmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpZiAoIXJpZ2h0LT5uYW1lKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKGxlZnQtPm5hbWVbMF0gIT0gJ18nICYmIHJpZ2h0LT5uYW1lWzBdID09ICdfJykKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpZiAobGVmdC0+bmFtZVswXSA9PSAnXycgJiYgcmlnaHQtPm5hbWVbMF0gIT0gJ18nKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKGxlZnQtPm5jYWxscyA+IHJpZ2h0LT5uY2FsbHMpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaWYgKGxlZnQtPm5jYWxscyA8IHJpZ2h0LT5uY2FsbHMpCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICByZXR1cm4gc3RyY21wIChsZWZ0LT5uYW1lLCByaWdodC0+bmFtZSk7Ci19Ci0KLQotLyoKLSAqIFRvcG9sb2dpY2FsbHkgc29ydCB0aGUgZ3JhcGggKGNvbGxhcHNpbmcgY3ljbGVzKSwgYW5kIHByb3BhZ2F0ZXMKLSAqIHRpbWUgYm90dG9tIHVwIGFuZCBmbGFncyB0b3AgZG93bi4KLSAqLwotU3ltICoqCi1ERUZVTl9WT0lEIChjZ19hc3NlbWJsZSkKLXsKLSAgU3ltICpwYXJlbnQsICoqdGltZV9zb3J0ZWRfc3ltcywgKip0b3Bfc29ydGVkX3N5bXM7Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgQXJjICphcmM7Ci0KLSAgLyoKLSAgICogaW5pdGlhbGl6ZSB2YXJpb3VzIHRoaW5nczoKLSAgICogICAgICB6ZXJvIG91dCBjaGlsZCB0aW1lcy4KLSAgICogICAgICBjb3VudCBzZWxmLXJlY3Vyc2l2ZSBjYWxscy4KLSAgICogICAgICBpbmRpY2F0ZSB0aGF0IG5vdGhpbmcgaXMgb24gY3ljbGVzLgotICAgKi8KLSAgZm9yIChwYXJlbnQgPSBzeW10YWIuYmFzZTsgcGFyZW50IDwgc3ltdGFiLmxpbWl0OyBwYXJlbnQrKykKLSAgICB7Ci0gICAgICBwYXJlbnQtPmNnLmNoaWxkX3RpbWUgPSAwLjA7Ci0gICAgICBhcmMgPSBhcmNfbG9va3VwIChwYXJlbnQsIHBhcmVudCk7Ci0gICAgICBpZiAoYXJjICYmIHBhcmVudCA9PSBhcmMtPmNoaWxkKQotCXsKLQkgIHBhcmVudC0+bmNhbGxzIC09IGFyYy0+Y291bnQ7Ci0JICBwYXJlbnQtPmNnLnNlbGZfY2FsbHMgPSBhcmMtPmNvdW50OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwYXJlbnQtPmNnLnNlbGZfY2FsbHMgPSAwOwotCX0KLSAgICAgIHBhcmVudC0+Y2cucHJvcC5mcmFjdCA9IDAuMDsKLSAgICAgIHBhcmVudC0+Y2cucHJvcC5zZWxmID0gMC4wOwotICAgICAgcGFyZW50LT5jZy5wcm9wLmNoaWxkID0gMC4wOwotICAgICAgcGFyZW50LT5jZy5wcmludF9mbGFnID0gRkFMU0U7Ci0gICAgICBwYXJlbnQtPmNnLnRvcF9vcmRlciA9IERGTl9OQU47Ci0gICAgICBwYXJlbnQtPmNnLmN5Yy5udW0gPSAwOwotICAgICAgcGFyZW50LT5jZy5jeWMuaGVhZCA9IHBhcmVudDsKLSAgICAgIHBhcmVudC0+Y2cuY3ljLm5leHQgPSAwOwotICAgICAgaWYgKGlnbm9yZV9kaXJlY3RfY2FsbHMpCi0JewotCSAgZmluZF9jYWxsIChwYXJlbnQsIHBhcmVudC0+YWRkciwgKHBhcmVudCArIDEpLT5hZGRyKTsKLQl9Ci0gICAgfQotICAvKgotICAgKiBUb3BvbG9naWNhbGx5IG9yZGVyIHRoaW5ncy4gIElmIGFueSBub2RlIGlzIHVubnVtYmVyZWQsIG51bWJlcgotICAgKiBpdCBhbmQgYW55IG9mIGl0cyBkZXNjZW5kZW50cy4KLSAgICovCi0gIGZvciAocGFyZW50ID0gc3ltdGFiLmJhc2U7IHBhcmVudCA8IHN5bXRhYi5saW1pdDsgcGFyZW50KyspCi0gICAgewotICAgICAgaWYgKHBhcmVudC0+Y2cudG9wX29yZGVyID09IERGTl9OQU4pCi0JewotCSAgY2dfZGZuIChwYXJlbnQpOwotCX0KLSAgICB9Ci0KLSAgLyogbGluayB0b2dldGhlciBub2RlcyBvbiB0aGUgc2FtZSBjeWNsZTogKi8KLSAgY3ljbGVfbGluayAoKTsKLQotICAvKiBzb3J0IHRoZSBzeW1ib2wgdGFibGUgaW4gcmV2ZXJzZSB0b3BvbG9naWNhbCBvcmRlcjogKi8KLSAgdG9wX3NvcnRlZF9zeW1zID0gKFN5bSAqKikgeG1hbGxvYyAoc3ltdGFiLmxlbiAqIHNpemVvZiAoU3ltICopKTsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgKytpbmRleCkKLSAgICB7Ci0gICAgICB0b3Bfc29ydGVkX3N5bXNbaW5kZXhdID0gJnN5bXRhYi5iYXNlW2luZGV4XTsKLSAgICB9Ci0gIHFzb3J0ICh0b3Bfc29ydGVkX3N5bXMsIHN5bXRhYi5sZW4sIHNpemVvZiAoU3ltICopLCBjbXBfdG9wbyk7Ci0gIERCRyAoREZOREVCVUcsCi0gICAgICAgcHJpbnRmICgiW2NnX2Fzc2VtYmxlXSB0b3BvbG9naWNhbCBzb3J0IGxpc3RpbmdcbiIpOwotICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47ICsraW5kZXgpCi0gICAgICAgewotICAgICAgIHByaW50ZiAoIltjZ19hc3NlbWJsZV0gIik7Ci0gICAgICAgcHJpbnRmICgiJWQ6IiwgdG9wX3NvcnRlZF9zeW1zW2luZGV4XS0+Y2cudG9wX29yZGVyKTsKLSAgICAgICBwcmludF9uYW1lICh0b3Bfc29ydGVkX3N5bXNbaW5kZXhdKTsKLSAgICAgICBwcmludGYgKCJcbiIpOwotICAgICAgIH0KLSAgKTsKLSAgLyoKLSAgICogU3RhcnRpbmcgZnJvbSB0aGUgdG9wb2xvZ2ljYWwgdG9wLCBwcm9wYWdhdGUgcHJpbnQgZmxhZ3MgdG8KLSAgICogY2hpbGRyZW4uICBhbHNvLCBjYWxjdWxhdGUgcHJvcGFnYXRpb24gZnJhY3Rpb25zLiAgdGhpcyBoYXBwZW5zCi0gICAqIGJlZm9yZSB0aW1lIHByb3BhZ2F0aW9uIHNpbmNlIHRpbWUgcHJvcGFnYXRpb24gdXNlcyB0aGUKLSAgICogZnJhY3Rpb25zLgotICAgKi8KLSAgcHJvcGFnYXRlX2ZsYWdzICh0b3Bfc29ydGVkX3N5bXMpOwotCi0gIC8qCi0gICAqIFN0YXJ0aW5nIGZyb20gdGhlIHRvcG9sb2dpY2FsIGJvdHRvbSwgcHJvcG9nYXRlIGNoaWxkcmVuIHRpbWVzCi0gICAqIHVwIHRvIHBhcmVudHMuCi0gICAqLwotICBjeWNsZV90aW1lICgpOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyArK2luZGV4KQotICAgIHsKLSAgICAgIHByb3BhZ2F0ZV90aW1lICh0b3Bfc29ydGVkX3N5bXNbaW5kZXhdKTsKLSAgICB9Ci0KLSAgZnJlZSAodG9wX3NvcnRlZF9zeW1zKTsKLQotICAvKgotICAgKiBOb3csIHNvcnQgYnkgQ0cuUFJPUC5TRUxGICsgQ0cuUFJPUC5DSElMRC4gIFNvcnRpbmcgYm90aCB0aGUgcmVndWxhcgotICAgKiBmdW5jdGlvbiBuYW1lcyBhbmQgY3ljbGUgaGVhZGVycy4KLSAgICovCi0gIHRpbWVfc29ydGVkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jICgoc3ltdGFiLmxlbiArIG51bV9jeWNsZXMpICogc2l6ZW9mIChTeW0gKikpOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyBpbmRleCsrKQotICAgIHsKLSAgICAgIHRpbWVfc29ydGVkX3N5bXNbaW5kZXhdID0gJnN5bXRhYi5iYXNlW2luZGV4XTsKLSAgICB9Ci0gIGZvciAoaW5kZXggPSAxOyBpbmRleCA8PSBudW1fY3ljbGVzOyBpbmRleCsrKQotICAgIHsKLSAgICAgIHRpbWVfc29ydGVkX3N5bXNbc3ltdGFiLmxlbiArIGluZGV4IC0gMV0gPSAmY3ljbGVfaGVhZGVyW2luZGV4XTsKLSAgICB9Ci0gIHFzb3J0ICh0aW1lX3NvcnRlZF9zeW1zLCBzeW10YWIubGVuICsgbnVtX2N5Y2xlcywgc2l6ZW9mIChTeW0gKiksCi0JIGNtcF90b3RhbCk7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW4gKyBudW1fY3ljbGVzOyBpbmRleCsrKQotICAgIHsKLSAgICAgIHRpbWVfc29ydGVkX3N5bXNbaW5kZXhdLT5jZy5pbmRleCA9IGluZGV4ICsgMTsKLSAgICB9Ci0gIHJldHVybiB0aW1lX3NvcnRlZF9zeW1zOwotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY2dfYXJjcy5oIGIvZ3Byb2YvY2dfYXJjcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWEwMTk3Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2NnX2FyY3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSNpZm5kZWYgY2dfYXJjc19oCi0jZGVmaW5lIGNnX2FyY3NfaAotCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotLyoKLSAqIEFyYyBzdHJ1Y3R1cmUgZm9yIGNhbGwtZ3JhcGguCi0gKgotICogV2l0aCBwb2ludGVycyB0byB0aGUgc3ltYm9scyBvZiB0aGUgcGFyZW50IGFuZCB0aGUgY2hpbGQsIGEgY291bnQKLSAqIG9mIGhvdyBtYW55IHRpbWVzIHRoaXMgYXJjIHdhcyB0cmF2ZXJzZWQsIGFuZCBwb2ludGVycyB0byB0aGUgbmV4dAotICogcGFyZW50IG9mIHRoaXMgY2hpbGQgYW5kIHRoZSBuZXh0IGNoaWxkIG9mIHRoaXMgcGFyZW50LgotICovCi10eXBlZGVmIHN0cnVjdCBhcmMKLSAgewotICAgIFN5bSAqcGFyZW50OwkJLyogc291cmNlIHZlcnRpY2Ugb2YgYXJjICovCi0gICAgU3ltICpjaGlsZDsJCQkvKiBkZXN0IHZlcnRpY2Ugb2YgYXJjICovCi0gICAgdW5zaWduZWQgbG9uZyBjb3VudDsJLyogIyBvZiBjYWxscyBmcm9tIHBhcmVudCB0byBjaGlsZCAqLwotICAgIGRvdWJsZSB0aW1lOwkJLyogdGltZSBpbmhlcml0ZWQgYWxvbmcgYXJjICovCi0gICAgZG91YmxlIGNoaWxkX3RpbWU7CQkvKiBjaGlsZC10aW1lIGluaGVyaXRlZCBhbG9uZyBhcmMgKi8KLSAgICBzdHJ1Y3QgYXJjICpuZXh0X3BhcmVudDsJLyogbmV4dCBwYXJlbnQgb2YgQ0hJTEQgKi8KLSAgICBzdHJ1Y3QgYXJjICpuZXh0X2NoaWxkOwkvKiBuZXh0IGNoaWxkIG9mIFBBUkVOVCAqLwotICAgIGludCBoYXNfYmVlbl9wbGFjZWQ7CS8qIGhhdmUgdGhpcyBhcmMncyBmdW5jdGlvbnMgYmVlbiBwbGFjZWQ/ICovCi0gIH0KLUFyYzsKLQotZXh0ZXJuIHVuc2lnbmVkIGludCBudW1fY3ljbGVzOwkvKiBudW1iZXIgb2YgY3ljbGVzIGRpc2NvdmVyZWQgKi8KLWV4dGVybiBTeW0gKmN5Y2xlX2hlYWRlcjsJLyogY3ljbGUgaGVhZGVycyAqLwotCi1leHRlcm4gdm9pZCBhcmNfYWRkIFBBUkFNUyAoKFN5bSAqIHBhcmVudCwgU3ltICogY2hpbGQsIHVuc2lnbmVkIGxvbmcgY291bnQpKTsKLWV4dGVybiBBcmMgKmFyY19sb29rdXAgUEFSQU1TICgoU3ltICogcGFyZW50LCBTeW0gKiBjaGlsZCkpOwotZXh0ZXJuIFN5bSAqKmNnX2Fzc2VtYmxlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBBcmMgKiphcmNzOwotZXh0ZXJuIHVuc2lnbmVkIGludCBudW1hcmNzOwotCi0jZW5kaWYgLyogY2dfYXJjc19oICovCmRpZmYgLS1naXQgYS9ncHJvZi9jZ19kZm4uYyBiL2dwcm9mL2NnX2Rmbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWUzN2FiLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2NnX2Rmbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjZ19kZm4uaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLSNpbmNsdWRlICJ1dGlscy5oIgotCi0jZGVmaW5lCURGTl9ERVBUSAkxMDAKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIFN5bSAqc3ltOwotICAgIGludCBjeWNsZV90b3A7Ci0gIH0KLURGTl9TdGFjazsKLQotREZOX1N0YWNrIGRmbl9zdGFja1tERk5fREVQVEhdOwotaW50IGRmbl9kZXB0aCA9IDA7Ci1pbnQgZGZuX2NvdW50ZXIgPSBERk5fTkFOOwotCi0KLS8qCi0gKiBJcyBDSElMRCBhbHJlYWR5IG51bWJlcmVkPwotICovCi1zdGF0aWMgYm9vbAotREVGVU4gKGlzX251bWJlcmVkLCAoY2hpbGQpLCBTeW0gKiBjaGlsZCkKLXsKLSAgcmV0dXJuIGNoaWxkLT5jZy50b3Bfb3JkZXIgIT0gREZOX05BTiAmJiBjaGlsZC0+Y2cudG9wX29yZGVyICE9IERGTl9CVVNZOwotfQotCi0KLS8qCi0gKiBJcyBDSElMRCBhbHJlYWR5IGJ1c3k/Ci0gKi8KLXN0YXRpYyBib29sCi1ERUZVTiAoaXNfYnVzeSwgKGNoaWxkKSwgU3ltICogY2hpbGQpCi17Ci0gIGlmIChjaGlsZC0+Y2cudG9wX29yZGVyID09IERGTl9OQU4pCi0gICAgewotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIENISUxEIGlzIHBhcnQgb2YgYSBjeWNsZS4gIEZpbmQgdGhlIHRvcCBjYWxsZXIgaW50byB0aGlzIGN5Y2xlCi0gKiB0aGF0IGlzIG5vdCBwYXJ0IG9mIHRoZSBjeWNsZSBhbmQgbWFrZSBhbGwgZnVuY3Rpb25zIGluIGN5Y2xlCi0gKiBtZW1iZXJzIG9mIHRoYXQgY3ljbGUgKHRvcCBjYWxsZXIgPT0gY2FsbGVyIHdpdGggc21hbGxlc3QKLSAqIGRlcHRoLWZpcnN0IG51bWJlcikuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoZmluZF9jeWNsZSwgKGNoaWxkKSwgU3ltICogY2hpbGQpCi17Ci0gIFN5bSAqaGVhZCA9IDA7Ci0gIFN5bSAqdGFpbDsKLSAgaW50IGN5Y2xlX3RvcDsKLSAgaW50IGluZGV4OwotCi0gIGZvciAoY3ljbGVfdG9wID0gZGZuX2RlcHRoOyBjeWNsZV90b3AgPiAwOyAtLWN5Y2xlX3RvcCkKLSAgICB7Ci0gICAgICBoZWFkID0gZGZuX3N0YWNrW2N5Y2xlX3RvcF0uc3ltOwotICAgICAgaWYgKGNoaWxkID09IGhlYWQpCi0JewotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKGNoaWxkLT5jZy5jeWMuaGVhZCAhPSBjaGlsZCAmJiBjaGlsZC0+Y2cuY3ljLmhlYWQgPT0gaGVhZCkKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBpZiAoY3ljbGVfdG9wIDw9IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW2ZpbmRfY3ljbGVdIGNvdWxkbid0IGZpbmQgaGVhZCBvZiBjeWNsZVxuIik7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0jaWZkZWYgREVCVUcKLSAgaWYgKGRlYnVnX2xldmVsICYgREZOREVCVUcpCi0gICAgewotICAgICAgcHJpbnRmICgiW2ZpbmRfY3ljbGVdIGRmbl9kZXB0aCAlZCBjeWNsZV90b3AgJWQgIiwKLQkgICAgICBkZm5fZGVwdGgsIGN5Y2xlX3RvcCk7Ci0gICAgICBpZiAoaGVhZCkKLQl7Ci0JICBwcmludF9uYW1lIChoZWFkKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmICgiPHVua25vd24+Iik7Ci0JfQotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci0jZW5kaWYKLSAgaWYgKGN5Y2xlX3RvcCA9PSBkZm5fZGVwdGgpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIFRoaXMgaXMgcHJldmlvdXMgZnVuY3Rpb24sIGUuZy4gdGhpcyBjYWxscyBpdHNlbGYuICBTb3J0IG9mCi0gICAgICAgKiBib3JpbmcuCi0gICAgICAgKgotICAgICAgICogU2luY2Ugd2UgYXJlIHRha2luZyBvdXQgc2VsZi1jeWNsZXMgZWxzZXdoZXJlIG5vIG5lZWQgZm9yCi0gICAgICAgKiB0aGUgc3BlY2lhbCBjYXNlLCBoZXJlLgotICAgICAgICovCi0gICAgICBEQkcgKERGTkRFQlVHLAotCSAgIHByaW50ZiAoIltmaW5kX2N5Y2xlXSAiKTsKLQkgICBwcmludF9uYW1lIChjaGlsZCk7Ci0JICAgcHJpbnRmICgiXG4iKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIEdsb20gaW50ZXJ2ZW5pbmcgZnVuY3Rpb25zIHRoYXQgYXJlbid0IGFscmVhZHkgZ2xvbW1lZCBpbnRvCi0gICAgICAgKiB0aGlzIGN5Y2xlLiAgVGhpbmdzIGhhdmUgYmVlbiBnbG9tbWVkIHdoZW4gdGhlaXIgY3ljbGVoZWFkCi0gICAgICAgKiBmaWVsZCBwb2ludHMgdG8gdGhlIGhlYWQgb2YgdGhlIGN5Y2xlIHRoZXkgYXJlIGdsb21tZWQKLSAgICAgICAqIGludG8uCi0gICAgICAgKi8KLSAgICAgIGZvciAodGFpbCA9IGhlYWQ7IHRhaWwtPmNnLmN5Yy5uZXh0OyB0YWlsID0gdGFpbC0+Y2cuY3ljLm5leHQpCi0JewotCSAgLyogdm9pZDogY2hhc2UgZG93biB0byB0YWlsIG9mIHRoaW5ncyBhbHJlYWR5IGdsb21tZWQgKi8KLQkgIERCRyAoREZOREVCVUcsCi0JICAgICAgIHByaW50ZiAoIltmaW5kX2N5Y2xlXSB0YWlsICIpOwotCSAgICAgICBwcmludF9uYW1lICh0YWlsKTsKLQkgICAgICAgcHJpbnRmICgiXG4iKSk7Ci0JfQotICAgICAgLyoKLSAgICAgICAqIElmIHdoYXQgd2UgdGhpbmsgaXMgdGhlIHRvcCBvZiB0aGUgY3ljbGUgaGFzIGEgY3ljbGVoZWFkCi0gICAgICAgKiBmaWVsZCwgdGhlbiBpdCdzIG5vdCByZWFsbHkgdGhlIGhlYWQgb2YgdGhlIGN5Y2xlLCB3aGljaCBpcwotICAgICAgICogcmVhbGx5IHdoYXQgd2Ugd2FudC4KLSAgICAgICAqLwotICAgICAgaWYgKGhlYWQtPmNnLmN5Yy5oZWFkICE9IGhlYWQpCi0JewotCSAgaGVhZCA9IGhlYWQtPmNnLmN5Yy5oZWFkOwotCSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW2ZpbmRfY3ljbGVdIG5ldyBjeWNsZWhlYWQgIik7Ci0JICAgICAgIHByaW50X25hbWUgKGhlYWQpOwotCSAgICAgICBwcmludGYgKCJcbiIpKTsKLQl9Ci0gICAgICBmb3IgKGluZGV4ID0gY3ljbGVfdG9wICsgMTsgaW5kZXggPD0gZGZuX2RlcHRoOyArK2luZGV4KQotCXsKLQkgIGNoaWxkID0gZGZuX3N0YWNrW2luZGV4XS5zeW07Ci0JICBpZiAoY2hpbGQtPmNnLmN5Yy5oZWFkID09IGNoaWxkKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBOb3QgeWV0IGdsb21tZWQgYW55d2hlcmUsIGdsb20gaXQgYW5kIGZpeCBhbnkKLQkgICAgICAgKiBjaGlsZHJlbiBpdCBoYXMgZ2xvbW1lZC4KLQkgICAgICAgKi8KLQkgICAgICB0YWlsLT5jZy5jeWMubmV4dCA9IGNoaWxkOwotCSAgICAgIGNoaWxkLT5jZy5jeWMuaGVhZCA9IGhlYWQ7Ci0JICAgICAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW2ZpbmRfY3ljbGVdIGdsb21taW5nICIpOwotCQkgICBwcmludF9uYW1lIChjaGlsZCk7Ci0JCSAgIHByaW50ZiAoIiBvbnRvICIpOwotCQkgICBwcmludF9uYW1lIChoZWFkKTsKLQkJICAgcHJpbnRmICgiXG4iKSk7Ci0JICAgICAgZm9yICh0YWlsID0gY2hpbGQ7IHRhaWwtPmNnLmN5Yy5uZXh0OyB0YWlsID0gdGFpbC0+Y2cuY3ljLm5leHQpCi0JCXsKLQkJICB0YWlsLT5jZy5jeWMubmV4dC0+Y2cuY3ljLmhlYWQgPSBoZWFkOwotCQkgIERCRyAoREZOREVCVUcsIHByaW50ZiAoIltmaW5kX2N5Y2xlXSBhbmQgaXRzIHRhaWwgIik7Ci0JCSAgICAgICBwcmludF9uYW1lICh0YWlsLT5jZy5jeWMubmV4dCk7Ci0JCSAgICAgICBwcmludGYgKCIgb250byAiKTsKLQkJICAgICAgIHByaW50X25hbWUgKGhlYWQpOwotCQkgICAgICAgcHJpbnRmICgiXG4iKSk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoY2hpbGQtPmNnLmN5Yy5oZWFkICE9IGhlYWQgLyogZmlyZXdhbGwgKi8gKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW2ZpbmRfY3ljbGVdIGdsb21tZWQsIGJ1dCBub3QgdG8gaGVhZFxuIik7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0KLS8qCi0gKiBQcmVwYXJlIGZvciB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgUEFSRU5ULiAgUHVzaCBhIHBhcmVudCBvbnRvCi0gKiB0aGUgc3RhY2sgYW5kIG1hcmsgaXQgYnVzeS4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChwcmVfdmlzaXQsIChwYXJlbnQpLCBTeW0gKiBwYXJlbnQpCi17Ci0gICsrZGZuX2RlcHRoOwotICBpZiAoZGZuX2RlcHRoID49IERGTl9ERVBUSCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJbcHJlX3Zpc2l0XSBkZm5fc3RhY2sgb3ZlcmZsb3dcbiIpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotICBkZm5fc3RhY2tbZGZuX2RlcHRoXS5zeW0gPSBwYXJlbnQ7Ci0gIGRmbl9zdGFja1tkZm5fZGVwdGhdLmN5Y2xlX3RvcCA9IGRmbl9kZXB0aDsKLSAgcGFyZW50LT5jZy50b3Bfb3JkZXIgPSBERk5fQlVTWTsKLSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW3ByZV92aXNpdF1cdFx0JWQ6IiwgZGZuX2RlcHRoKTsKLSAgICAgICBwcmludF9uYW1lIChwYXJlbnQpOwotICAgICAgIHByaW50ZiAoIlxuIikpOwotfQotCi0KLS8qCi0gKiBEb25lIHdpdGggdmlzaXRpbmcgbm9kZSBQQVJFTlQuICBQb3AgUEFSRU5UIG9mZiBkZm5fc3RhY2sKLSAqIGFuZCBudW1iZXIgZnVuY3Rpb25zIGlmIFBBUkVOVCBpcyBoZWFkIG9mIGEgY3ljbGUuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocG9zdF92aXNpdCwgKHBhcmVudCksIFN5bSAqIHBhcmVudCkKLXsKLSAgU3ltICptZW1iZXI7Ci0KLSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW3Bvc3RfdmlzaXRdXHQlZDogIiwgZGZuX2RlcHRoKTsKLSAgICAgICBwcmludF9uYW1lIChwYXJlbnQpOwotICAgICAgIHByaW50ZiAoIlxuIikpOwotICAvKgotICAgKiBOdW1iZXIgZnVuY3Rpb25zIGFuZCB0aGluZ3MgaW4gdGhlaXIgY3ljbGVzIHVubGVzcyB0aGUgZnVuY3Rpb24KLSAgICogaXMgaXRzZWxmIHBhcnQgb2YgYSBjeWNsZToKLSAgICovCi0gIGlmIChwYXJlbnQtPmNnLmN5Yy5oZWFkID09IHBhcmVudCkKLSAgICB7Ci0gICAgICArK2Rmbl9jb3VudGVyOwotICAgICAgZm9yIChtZW1iZXIgPSBwYXJlbnQ7IG1lbWJlcjsgbWVtYmVyID0gbWVtYmVyLT5jZy5jeWMubmV4dCkKLQl7Ci0JICBtZW1iZXItPmNnLnRvcF9vcmRlciA9IGRmbl9jb3VudGVyOwotCSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW3Bvc3RfdmlzaXRdXHRcdG1lbWJlciAiKTsKLQkgICAgICAgcHJpbnRfbmFtZSAobWVtYmVyKTsKLQkgICAgICAgcHJpbnRmICgiLT4gY2cudG9wX29yZGVyID0gJWRcbiIsIGRmbl9jb3VudGVyKSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIERCRyAoREZOREVCVUcsIHByaW50ZiAoIltwb3N0X3Zpc2l0XVx0XHRpcyBwYXJ0IG9mIGEgY3ljbGVcbiIpKTsKLSAgICB9Ci0gIC0tZGZuX2RlcHRoOwotfQotCi0KLS8qCi0gKiBHaXZlbiB0aGlzIFBBUkVOVCwgZGVwdGggZmlyc3QgbnVtYmVyIGl0cyBjaGlsZHJlbi4KLSAqLwotdm9pZAotREVGVU4gKGNnX2RmbiwgKHBhcmVudCksIFN5bSAqIHBhcmVudCkKLXsKLSAgQXJjICphcmM7Ci0KLSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW2Rmbl0gZGZuKCAiKTsKLSAgICAgICBwcmludF9uYW1lIChwYXJlbnQpOwotICAgICAgIHByaW50ZiAoIilcbiIpKTsKLSAgLyoKLSAgICogSWYgd2UncmUgYWxyZWFkeSBudW1iZXJlZCwgbm8gbmVlZCB0byBsb29rIGFueSBmdXJ0aGVyOgotICAgKi8KLSAgaWYgKGlzX251bWJlcmVkIChwYXJlbnQpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIC8qCi0gICAqIElmIHdlJ3JlIGFscmVhZHkgYnVzeSwgbXVzdCBiZSBhIGN5Y2xlOgotICAgKi8KLSAgaWYgKGlzX2J1c3kgKHBhcmVudCkpCi0gICAgewotICAgICAgZmluZF9jeWNsZSAocGFyZW50KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHByZV92aXNpdCAocGFyZW50KTsKLSAgLyoKLSAgICogUmVjdXJzaXZlbHkgdmlzaXQgY2hpbGRyZW46Ci0gICAqLwotICBmb3IgKGFyYyA9IHBhcmVudC0+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+aGFzX2JlZW5fcGxhY2VkID0gMTsKLSAgICB9Ci0KLSAgb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgKGFyY3MsIG51bWFyY3MsIDAsCi0JCQkJICAgIHNjcmF0Y2hfYXJjcywgJnNjcmF0Y2hfYXJjX2NvdW50KTsKLQotICAvKiBPdXRwdXQgLm8ncyBub3QgaGFuZGxlZCBieSB0aGUgbWFpbiBwbGFjZW1lbnQgYWxnb3JpdGhtLiAgKi8KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBpZiAoc3ltdGFiLmJhc2VbaW5kZXhdLm1hcHBlZAotCSAgJiYgISBzeW10YWIuYmFzZVtpbmRleF0uaGFzX2JlZW5fcGxhY2VkKQotCXByaW50ZiAoIiVzXG4iLCBzeW10YWIuYmFzZVtpbmRleF0ubmFtZSk7Ci0gICAgfQotCi0gIC8qIE5vdyBvdXRwdXQgYW55IC5vJ3MgdGhhdCBkaWRuJ3QgaGF2ZSBhbnkgdGV4dCBzeW1ib2xzLiAgKi8KLSAgbGFzdCA9IE5VTEw7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bWJvbF9tYXBfY291bnQ7IGluZGV4KyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGluZGV4MjsKLQotICAgICAgLyogRG9uJ3QgYm90aGVyIHNlYXJjaGluZyBpZiB0aGlzIHN5bWJvbCBpcyB0aGUKLQkgc2FtZSBhcyB0aGUgcHJldmlvdXMgb25lLiAgKi8KLSAgICAgIGlmIChsYXN0ICYmICFzdHJjbXAgKGxhc3QsIHN5bWJvbF9tYXBbaW5kZXhdLmZpbGVfbmFtZSkpCi0JY29udGludWU7Ci0KLSAgICAgIGZvciAoaW5kZXgyID0gMDsgaW5kZXgyIDwgc3ltdGFiLmxlbjsgaW5kZXgyKyspCi0JewotCSAgaWYgKCEgc3ltdGFiLmJhc2VbaW5kZXgyXS5tYXBwZWQpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoIXN0cmNtcCAoc3ltdGFiLmJhc2VbaW5kZXgyXS5uYW1lLCBzeW1ib2xfbWFwW2luZGV4XS5maWxlX25hbWUpKQotCSAgICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGRpZG4ndCBmaW5kIGl0IGluIHRoZSBzeW1ib2wgdGFibGUsIHRoZW4gaXQgbXVzdCBiZSBhIC5vCi0JIHdpdGggbm8gdGV4dCBzeW1ib2xzLiAgT3V0cHV0IGl0IGxhc3QuICAqLwotICAgICAgaWYgKGluZGV4MiA9PSBzeW10YWIubGVuKQotCXByaW50ZiAoIiVzXG4iLCBzeW1ib2xfbWFwW2luZGV4XS5maWxlX25hbWUpOwotICAgICAgbGFzdCA9IHN5bWJvbF9tYXBbaW5kZXhdLmZpbGVfbmFtZTsKLSAgICB9IAotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY2dfcHJpbnQuaCBiL2dwcm9mL2NnX3ByaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MmM0YWEuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY2dfcHJpbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNpZm5kZWYgY2dfcHJpbnRfaAotI2RlZmluZSBjZ19wcmludF9oCi0KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi1leHRlcm4gZG91YmxlIHByaW50X3RpbWU7CS8qIHRvdGFsIG9mIHRpbWUgYmVpbmcgcHJpbnRlZCAqLwotCi1leHRlcm4gdm9pZCBjZ19wcmludCBQQVJBTVMgKChTeW0gKiogY2cpKTsKLWV4dGVybiB2b2lkIGNnX3ByaW50X2luZGV4IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGNnX3ByaW50X2ZpbGVfb3JkZXJpbmcgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgY2dfcHJpbnRfZnVuY3Rpb25fb3JkZXJpbmcgUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYgLyogY2dfcHJpbnRfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvY29uZmlndXJlIGIvZ3Byb2YvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZmY1MTM3Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MDMgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9Z3Byb2YuYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZWxzZQotICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZmkKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1OTA6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjExOiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2Mjk6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjY0OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcxNzogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NzQ6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotCi1QQUNLQUdFPWdwcm9mCi0KLVZFUlNJT049Mi45LjQKLQotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCi1FT0YKLQotCi0KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MjA6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBQ0xPQ0FMPWFjbG9jYWwKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODMzOiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPQ09ORj1hdXRvY29uZgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPQ09ORj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2NvbmYiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg0NjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9tYWtlIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT01BS0U9YXV0b21ha2UKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT01BS0U9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9tYWtlIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg1OTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NzI6IGNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChtYWtlaW5mbyAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIE1BS0VJTkZPPW1ha2VpbmZvCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIE1BS0VJTkZPPSIkbWlzc2luZ19kaXIvbWlzc2luZyBtYWtlaW5mbyIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc3RhdGljPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBvciAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZmFzdF9pbnN0YWxsIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5NTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk4ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAxODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNjk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMDE6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDExMTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTE3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNDM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTQ4OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTU3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNzY6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCi0gIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjE5OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNDM6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI0NjogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotdGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyODI6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2dudV9sZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nbnVfbGQiIDE+JjYKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyOTg6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9OTScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi0KLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLWVjaG8gIiRhY190IiIkTk0iIDE+JjYKLQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzM2OiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKiAJXCgkYWNfc3ltY29kZVwpIAkgCSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzk5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDAzOiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0NTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotCSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotCi1maQotCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotZWNobyAiJGFjX3QiIiRhY19yZXN1bHQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1MDE6IGNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUxMzogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci1maQotcm0gLXJmIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSIgMT4mNgotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTM5OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdGRhdGEKLWlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsCi10aGVuCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotICBhY19jdl9wcm9nX0xOX1M9ImxuIC1zIgotZWxzZQotICBhY19jdl9wcm9nX0xOX1M9bG4KLWZpCi1maQotTE5fUz0iJGFjX2N2X3Byb2dfTE5fUyIKLWlmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAkaG9zdCAhPSAkYnVpbGQ7IHRoZW4KLSAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KLWVsc2UKLSAgYWNfdG9vbF9wcmVmaXg9Ci1maQotCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICcjbGluZSAxNTgxICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTgyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MDM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2NjX25lZWRzX2JlbGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjA4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjE1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2NjX25lZWRzX2JlbGYiIDE+JjYKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYzODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iJHthY190b29sX3ByZWZpeH1kbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBkbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NzA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9ImRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiICYmIGFjX2N2X3Byb2dfRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBETExUT09MPSJmYWxzZSIKLWZpCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcwNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSIke2FjX3Rvb2xfcHJlZml4fWFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzM3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9ImFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyIgJiYgYWNfY3ZfcHJvZ19BUz0iZmFsc2UiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgQVM9ImZhbHNlIgotZmkKLWZpCi0KLQotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIG9yIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9saWJ0b29sX2xvY2siCi0gIG5lZWRfbG9ja3M9JGVuYWJsZXZhbAotZWxzZQotICBuZWVkX2xvY2tzPXllcwotZmkKLQotCi1pZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCi0gIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotZmkKLQotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxpYnRvb2wgY29uZmlndXJlIGZhaWxlZCIgMT4mMjsgZXhpdCAxOyB9Ci0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotCi0KLQotCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg3NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTkwNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5ODg6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDE5OTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMzA6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDM1OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDQ0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNjM6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEwNjogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE2MDogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi0KLUFMTF9MSU5HVUFTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxODM6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE5OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIwNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIyMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIzMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIzODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI2MzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI2OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI3NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjkzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMzMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzQzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNjc6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM3MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDIxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NDI6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ0OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NTY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDgyOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDg3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1MTU6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUyMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjU1MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1NTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU2MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1ODM6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU4OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjE2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY0ODogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2NTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjc4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjgzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3MDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjczMzogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3NDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc2MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzg1OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjc5MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc5NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODI0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4NTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Nzc6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4ODUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDUzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA1OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA2MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwOTM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwOTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzEyMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzE1MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzE1NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTc4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RQQ1BZIDEKLUVPRgotCi0gICBmaQotCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMTI6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIxNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiBMQ19NRVNTQUdFUwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMjQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotRU9GCi0KLSAgICBmaQotICBmaQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjQ1OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCi0gIFVTRV9OTFM9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTkxTPXllcwotZmkKLQotICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgotICAgIAotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEVOQUJMRV9OTFMgMQotRU9GCi0KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyNjU6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKLWVsc2UKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubwotZmkKLQotICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2Ci0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI4NDogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI4OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjk0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzMxMTogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzIzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzMzk6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1saW50bCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzQ3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZHRleHRkb21haW4oKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kdGV4dGRvbWFpbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzM3NDogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzc5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM4NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dFVFRFWFQgMQotRU9GCi0KLQkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NDg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0NTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQ3NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzUwMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1Mzk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzU3MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU3OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmUKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCSAgICAgICAgCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2MTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjQ1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY4MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgICAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzc3MTogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKLSAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzc5OTogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzgwNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozODA5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbXNnZm9ybWF0PWxpbnV4Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotbXNnZm9ybWF0PXhvcGVuCi1maQotCi0KLQkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIAotICAgCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIAotCi0gICAgICBsPQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4NzI6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiA+JjUKLSAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi1maQotCi0gIGVjaG8gIiRhY190IiIkVVNFX01BSU5UQUlORVJfTU9ERSIgMT4mNgotICAKLQotaWYgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllczsgdGhlbgotICBNQUlOVEFJTkVSX01PREVfVFJVRT0KLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPScjJwotZWxzZQotICBNQUlOVEFJTkVSX01PREVfVFJVRT0nIycKLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPQotZmkKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODk1OiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzOTAwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLSNpZm5kZWYgX19DWUdXSU5fXwotI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotI2VuZGlmCi1yZXR1cm4gX19DWUdXSU5fXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTExOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTI4OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5MzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTQwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKLU1JTkdXMzI9Ci10ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5NTk6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5Njk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIGdjb25maWcuaDpnY29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAUEFDS0FHRUAlJFBBQ0tBR0UlZwotcyVAVkVSU0lPTkAlJFZFUlNJT04lZwotcyVAQUNMT0NBTEAlJEFDTE9DQUwlZwotcyVAQVVUT0NPTkZAJSRBVVRPQ09ORiVnCi1zJUBBVVRPTUFLRUAlJEFVVE9NQUtFJWcKLXMlQEFVVE9IRUFERVJAJSRBVVRPSEVBREVSJWcKLXMlQE1BS0VJTkZPQCUkTUFLRUlORk8lZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAQ0NAJSRDQyVnCi1zJUBMREAlJExEJWcKLXMlQE5NQCUkTk0lZwotcyVAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQCUkVVNFX1NZTUJPTF9VTkRFUlNDT1JFJWcKLXMlQExOX1NAJSRMTl9TJWcKLXMlQERMTFRPT0xAJSRETExUT09MJWcKLXMlQEFTQCUkQVMlZwotcyVATElCVE9PTEAlJExJQlRPT0wlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZwotcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9Imdjb25maWcuaDpnY29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi1zZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGUKLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9ncHJvZi9jb25maWd1cmUuYmF0IGIvZ3Byb2YvY29uZmlndXJlLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJlZjM3ZS4uMDAwMDAwMAotLS0gYS9ncHJvZi9jb25maWd1cmUuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotQGVjaG8gb2ZmDQotZWNobyBDb25maWd1cmluZyBncHJvZiBmb3IgZ28zMg0KLXJlbSBUaGlzIGJhdGNoIGZpbGUgYXNzdW1lcyBhIHVuaXgtdHlwZSAic2VkIiBwcm9ncmFtDQotDQotZWNobyAjIE1ha2VmaWxlIGdlbmVyYXRlZCBieSAiY29uZmlndXJlLmJhdCI+IE1ha2VmaWxlDQotDQotaWYgZXhpc3QgY29uZmlnLnNlZCBkZWwgY29uZmlnLnNlZA0KLQ0KLWVjaG8gIi9eIyMjJC8gaVwJCQkJIj4+Y29uZmlnLnNlZA0KLWVjaG8gIk1ZX01BQ0hJTkU9aTM4NlwJCQkJIj4+Y29uZmlnLnNlZA0KLWVjaG8gIkNDPWdjYwkJCQkJIj4+Y29uZmlnLnNlZA0KLQ0KLWVjaG8gIyA+PiBjb25maWcuc2VkDQotDQotc2VkIC1lICJzL15cIi8vIiAtZSAicy9cIiQvLyIgLWUgInMvWyAJXSokLy8iIGNvbmZpZy5zZWQgPiBjb25maWcyLnNlZA0KLXNlZCAtZiBjb25maWcyLnNlZCBNYWtlZmlsZS5pbiA+PiBNYWtlZmlsZQ0KLWRlbCBjb25maWcuc2VkDQotZGVsIGNvbmZpZzIuc2VkDQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY29uZmlndXJlLmluIGIvZ3Byb2YvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTBiNTVkLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotQUNfUFJFUkVRKDIuMTMpCi1BQ19JTklUKGdwcm9mLmMpCi0KLUFDX0NBTk9OSUNBTF9TWVNURU0KLQotQU1fSU5JVF9BVVRPTUFLRShncHJvZiwgMi45LjQpCi0KLUFNX1BST0dfTElCVE9PTAotCi1kbmwgRm9yIHNpbXBsaWNpdHksIHdlIHVzZSB0aGUgQkZEIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgbW9zdAotZG5sIHRoaW5ncy4gIEhvd2V2ZXIsIHdlIGFsc28gbmVlZCBvdXIgb3duIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IKLWRubCB0aGUgYXV0b21ha2UgUEFDS0FHRSBhbmQgVkVSU0lPTiBtYWNyb3MuICBXZSBkb24ndCBuYW1lIGl0Ci1kbmwgY29uZmlnLmgsIHRvIGF2b2lkIGFueSBwb3NzaWJsZSBjb25mdXNpb24gd2l0aCB0aGUgYmZkIGNvbmZpZy5oLgotQU1fQ09ORklHX0hFQURFUihnY29uZmlnLmg6Z2NvbmZpZy5pbikKLQotQUNfUFJPR19DQwotQUNfUFJPR19JTlNUQUxMCi0KLUFDX0lTQ19QT1NJWAotCi1BTExfTElOR1VBUz0KLUNZX0dOVV9HRVRURVhUCi0KLUFNX01BSU5UQUlORVJfTU9ERQotQUNfRVhFRVhUCi0KLUFDX09VVFBVVChNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluLAotW3NlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZV0pCmRpZmYgLS1naXQgYS9ncHJvZi9jb3JlZmlsZS5jIGIvZ3Byb2YvY29yZWZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlNmY4My4uMDAwMDAwMAotLS0gYS9ncHJvZi9jb3JlZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYyICswLDAgQEAKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLWJmZCAqY29yZV9iZmQ7Ci1pbnQgY29yZV9udW1fc3ltczsKLWFzeW1ib2wgKipjb3JlX3N5bXM7Ci1hc2VjdGlvbiAqY29yZV90ZXh0X3NlY3Q7Ci1QVFIgY29yZV90ZXh0X3NwYWNlOwotCi1pbnQgbWluX2luc25fc2l6ZTsKLWludCBvZmZzZXRfdG9fY29kZTsKLQotLyogRm9yIG1hcHBpbmcgc3ltYm9scyB0byBzcGVjaWZpYyAubyBmaWxlcyBkdXJpbmcgZmlsZSBvcmRlcmluZy4gICovCi1zdHJ1Y3QgZnVuY3Rpb25fbWFwIHsKLSAgY2hhciAqZnVuY3Rpb25fbmFtZTsKLSAgY2hhciAqZmlsZV9uYW1lOwotfTsKLQotc3RydWN0IGZ1bmN0aW9uX21hcCAqc3ltYm9sX21hcDsKLXVuc2lnbmVkIGludCBzeW1ib2xfbWFwX2NvdW50OwotCi1leHRlcm4gdm9pZCBpMzg2X2ZpbmRfY2FsbCBQQVJBTVMgKChTeW0gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotZXh0ZXJuIHZvaWQgYWxwaGFfZmluZF9jYWxsIFBBUkFNUyAoKFN5bSAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1leHRlcm4gdm9pZCB2YXhfZmluZF9jYWxsIFBBUkFNUyAoKFN5bSAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1leHRlcm4gdm9pZCB0YWhvZV9maW5kX2NhbGwgUEFSQU1TICgoU3ltICosIGJmZF92bWEsIGJmZF92bWEpKTsKLWV4dGVybiB2b2lkIHNwYXJjX2ZpbmRfY2FsbCBQQVJBTVMgKChTeW0gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotCi1zdGF0aWMgdm9pZAotREVGVU4gKHJlYWRfZnVuY3Rpb25fbWFwcGluZ3MsIChmaWxlbmFtZSksIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBGSUxFICpmaWxlID0gZm9wZW4gKGZpbGVuYW1lLCAiciIpOwotICBjaGFyIGR1bW15WzEwMjRdOwotICBpbnQgY291bnQgPSAwOwotCi0gIGlmICghZmlsZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBjb3VsZCBub3Qgb3BlbiAlcy5cbiIpLCB3aG9hbWksIGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICAvKiBGaXJzdCBwYXJzZSB0aGUgbWFwcGluZyBmaWxlIHNvIHdlIGtub3cgaG93IGJpZyB3ZSBuZWVkIHRvCi0gICAgIG1ha2Ugb3VyIHRhYmxlcy4gIFdlIGFsc28gZG8gc29tZSBzYW5pdHkgY2hlY2tzIGF0IHRoaXMKLSAgICAgdGltZS4gICovCi0gIHdoaWxlICghZmVvZiAoZmlsZSkpCi0gICAgewotICAgICAgaW50IG1hdGNoZXM7Ci0KLSAgICAgIG1hdGNoZXMgPSBmc2NhbmYgKGZpbGUsICIlW15cbjpdIiwgZHVtbXkpOwotICAgICAgaWYgKCFtYXRjaGVzKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVuYWJsZSB0byBwYXJzZSBtYXBwaW5nIGZpbGUgJXMuXG4iKSwKLQkJICAgd2hvYW1pLCBmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0KLSAgICAgIC8qIEp1c3Qgc2tpcCBtZXNzYWdlcyBhYm91dCBmaWxlcyB3aXRoIG5vIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCFzdHJuY21wIChkdW1teSwgIk5vIHN5bWJvbHMgaW4gIiwgMTQpKQotCXsKLQkgIGZzY2FuZiAoZmlsZSwgIlxuIik7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIERvbid0IGNhcmUgd2hhdCBlbHNlIGlzIG9uIHRoaXMgbGluZSBhdCB0aGlzIHBvaW50LiAgKi8KLSAgICAgIGZzY2FuZiAoZmlsZSwgIiVbXlxuXVxuIiwgZHVtbXkpOwotICAgICAgY291bnQrKzsKLSAgICB9Ci0KLSAgLyogTm93IHdlIGtub3cgaG93IGJpZyB3ZSBuZWVkIHRvIG1ha2Ugb3VyIHRhYmxlLiAgKi8KLSAgc3ltYm9sX21hcCA9ICgoc3RydWN0IGZ1bmN0aW9uX21hcCAqKQotCQl4bWFsbG9jIChjb3VudCAqIHNpemVvZiAoc3RydWN0IGZ1bmN0aW9uX21hcCkpKTsKLQotICAvKiBSZXdpbmQgdGhlIGlucHV0IGZpbGUgc28gd2UgY2FuIHJlYWQgaXQgYWdhaW4uICAqLwotICByZXdpbmQgKGZpbGUpOwotCi0gIC8qIFJlYWQgZWFjaCBlbnRyeSBhbmQgcHV0IGl0IGludG8gdGhlIHRhYmxlLiAgKi8KLSAgY291bnQgPSAwOwotICB3aGlsZSAoIWZlb2YgKGZpbGUpKQotICAgIHsKLSAgICAgIGludCBtYXRjaGVzOwotICAgICAgY2hhciAqdG1wOwotCi0gICAgICBtYXRjaGVzID0gZnNjYW5mIChmaWxlLCAiJVteXG46XSIsIGR1bW15KTsKLSAgICAgIGlmICghbWF0Y2hlcykKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bmFibGUgdG8gcGFyc2UgbWFwcGluZyBmaWxlICVzLlxuIiksCi0JCSAgIHdob2FtaSwgZmlsZW5hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotCi0gICAgICAvKiBKdXN0IHNraXAgbWVzc2FnZXMgYWJvdXQgZmlsZXMgd2l0aCBubyBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICghc3RybmNtcCAoZHVtbXksICJObyBzeW1ib2xzIGluICIsIDE0KSkKLQl7Ci0JICBmc2NhbmYgKGZpbGUsICJcbiIpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBkdW1teSBoYXMgdGhlIGZpbGVuYW1lLCBnbyBhaGVhZCBhbmQgY29weSBpdC4gICovCi0gICAgICBzeW1ib2xfbWFwW2NvdW50XS5maWxlX25hbWUgPSB4bWFsbG9jIChzdHJsZW4gKGR1bW15KSArIDEpOwotICAgICAgc3RyY3B5IChzeW1ib2xfbWFwW2NvdW50XS5maWxlX25hbWUsIGR1bW15KTsKLQotICAgICAgLyogTm93IHdlIG5lZWQgdGhlIGZ1bmN0aW9uIG5hbWUuICAqLwotICAgICAgZnNjYW5mIChmaWxlLCAiJVteXG5dXG4iLCBkdW1teSk7Ci0gICAgICB0bXAgPSBzdHJyY2hyIChkdW1teSwgJyAnKSArIDE7Ci0gICAgICBzeW1ib2xfbWFwW2NvdW50XS5mdW5jdGlvbl9uYW1lID0geG1hbGxvYyAoc3RybGVuICh0bXApICsgMSk7Ci0gICAgICBzdHJjcHkgKHN5bWJvbF9tYXBbY291bnRdLmZ1bmN0aW9uX25hbWUsIHRtcCk7Ci0gICAgICBjb3VudCsrOwotICAgIH0KLQotICAvKiBSZWNvcmQgdGhlIHNpemUgb2YgdGhlIG1hcCB0YWJsZSBmb3IgZnV0dXJlIHJlZmVyZW5jZS4gICovCi0gIHN5bWJvbF9tYXBfY291bnQgPSBjb3VudDsKLX0KLQotdm9pZAotREVGVU4gKGNvcmVfaW5pdCwgKGFfb3V0X25hbWUpLCBjb25zdCBjaGFyICphX291dF9uYW1lKQotewotICBjb3JlX2JmZCA9IGJmZF9vcGVuciAoYV9vdXRfbmFtZSwgMCk7Ci0KLSAgaWYgKCFjb3JlX2JmZCkKLSAgICB7Ci0gICAgICBwZXJyb3IgKGFfb3V0X25hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGlmICghYmZkX2NoZWNrX2Zvcm1hdCAoY29yZV9iZmQsIGJmZF9vYmplY3QpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiBub3QgaW4gYS5vdXQgZm9ybWF0XG4iKSwgd2hvYW1pLCBhX291dF9uYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICAvKiBnZXQgY29yZSdzIHRleHQgc2VjdGlvbjogKi8KLSAgY29yZV90ZXh0X3NlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoY29yZV9iZmQsICIudGV4dCIpOwotICBpZiAoIWNvcmVfdGV4dF9zZWN0KQotICAgIHsKLSAgICAgIGNvcmVfdGV4dF9zZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGNvcmVfYmZkLCAiJENPREUkIik7Ci0gICAgICBpZiAoIWNvcmVfdGV4dF9zZWN0KQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGNhbid0IGZpbmQgLnRleHQgc2VjdGlvbiBpbiAlc1xuIiksCi0JCSAgIHdob2FtaSwgYV9vdXRfbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0gICAgfQotCi0gIC8qIHJlYWQgY29yZSdzIHN5bWJvbCB0YWJsZTogKi8KLQotICAvKiB0aGlzIHdpbGwgcHJvYmFibHkgZ2l2ZSB1cyBtb3JlIHRoYW4gd2UgbmVlZCwgYnV0IHRoYXQncyBvazogICovCi0gIGNvcmVfbnVtX3N5bXMgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoY29yZV9iZmQpOwotICBpZiAoY29yZV9udW1fc3ltcyA8IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwgd2hvYW1pLCBhX291dF9uYW1lLAotCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgY29yZV9zeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKGNvcmVfbnVtX3N5bXMpOwotICBjb3JlX251bV9zeW1zID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGNvcmVfYmZkLCBjb3JlX3N5bXMpOwotICBpZiAoY29yZV9udW1fc3ltcyA8IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwgd2hvYW1pLCBhX291dF9uYW1lLAotCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgbWluX2luc25fc2l6ZSA9IDE7Ci0gIG9mZnNldF90b19jb2RlID0gMDsKLQotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoY29yZV9iZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX3ZheDoKLSAgICBjYXNlIGJmZF9hcmNoX3RhaG9lOgotICAgICAgb2Zmc2V0X3RvX2NvZGUgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2FscGhhOgotICAgICAgbWluX2luc25fc2l6ZSA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGZ1bmN0aW9uX21hcHBpbmdfZmlsZSkKLSAgICByZWFkX2Z1bmN0aW9uX21hcHBpbmdzIChmdW5jdGlvbl9tYXBwaW5nX2ZpbGUpOwotfQotCi0KLS8qCi0gKiBSZWFkIGluIHRoZSB0ZXh0IHNwYWNlIG9mIGFuIGEub3V0IGZpbGUKLSAqLwotdm9pZAotREVGVU4gKGNvcmVfZ2V0X3RleHRfc3BhY2UsIChjb3JlX2JmZCksIGJmZCAqIGNvcmVfYmZkKQotewotICBjb3JlX3RleHRfc3BhY2UgPSAoUFRSKSBtYWxsb2MgKGNvcmVfdGV4dF9zZWN0LT5fcmF3X3NpemUpOwotCi0gIGlmICghY29yZV90ZXh0X3NwYWNlKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHJhbiBvdXQgcm9vbSBmb3IgJWxkIGJ5dGVzIG9mIHRleHQgc3BhY2VcbiIpLAotCSAgICAgICB3aG9hbWksIGNvcmVfdGV4dF9zZWN0LT5fcmF3X3NpemUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoY29yZV9iZmQsIGNvcmVfdGV4dF9zZWN0LCBjb3JlX3RleHRfc3BhY2UsCi0JCQkJIDAsIGNvcmVfdGV4dF9zZWN0LT5fcmF3X3NpemUpKQotICAgIHsKLSAgICAgIGJmZF9wZXJyb3IgKCJiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMiKTsKLSAgICAgIGZyZWUgKGNvcmVfdGV4dF9zcGFjZSk7Ci0gICAgICBjb3JlX3RleHRfc3BhY2UgPSAwOwotICAgIH0KLSAgaWYgKCFjb3JlX3RleHRfc3BhY2UpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY2FuJ3QgZG8gLWNcbiIpLCB3aG9hbWkpOwotICAgIH0KLX0KLQotCi12b2lkCi1ERUZVTiAoZmluZF9jYWxsLCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYyksCi0gICAgICAgU3ltICogcGFyZW50IEFORCBiZmRfdm1hIHBfbG93cGMgQU5EIGJmZF92bWEgcF9oaWdocGMpCi17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChjb3JlX2JmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICAgIGkzODZfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9hbHBoYToKLSAgICAgIGFscGhhX2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfdmF4OgotICAgICAgdmF4X2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICBzcGFyY19maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX3RhaG9lOgotICAgICAgdGFob2VfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IC1jIG5vdCBzdXBwb3J0ZWQgb24gYXJjaGl0ZWN0dXJlICVzXG4iKSwKLQkgICAgICAgd2hvYW1pLCBiZmRfcHJpbnRhYmxlX25hbWUoY29yZV9iZmQpKTsKLQotICAgICAgLyogRG9uJ3QgZ2l2ZSB0aGUgZXJyb3IgbW9yZSB0aGFuIG9uY2UuICAqLwotICAgICAgaWdub3JlX2RpcmVjdF9jYWxscyA9IEZBTFNFOwotICAgIH0KLX0KLQotLyoKLSAqIFJldHVybiBjbGFzcyBvZiBzeW1ib2wgU1lNLiAgVGhlIHJldHVybmVkIGNsYXNzIGNhbiBiZSBhbnkgb2Y6Ci0gKiAgICAgIDAgICAtPiBzeW1ib2wgaXMgbm90IGludGVyZXN0aW5nIHRvIHVzCi0gKiAgICAgICdUJyAtPiBzeW1ib2wgaXMgYSBnbG9iYWwgbmFtZQotICogICAgICAndCcgLT4gc3ltYm9sIGlzIGEgbG9jYWwgKHN0YXRpYykgbmFtZQotICovCi1zdGF0aWMgaW50Ci1ERUZVTiAoY29yZV9zeW1fY2xhc3MsIChzeW0pLCBhc3ltYm9sICogc3ltKQotewotICBzeW1ib2xfaW5mbyBzeW1pbmZvOwotICBjb25zdCBjaGFyICpuYW1lOwotICBjaGFyIHN5bV9wcmVmaXg7Ci0gIGludCBpOwotCi0gIGlmIChzeW0tPnNlY3Rpb24gPT0gTlVMTCB8fCAoc3ltLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDApCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qCi0gICAqIE11c3QgYmUgYSB0ZXh0IHN5bWJvbCwgYW5kIHN0YXRpYyB0ZXh0IHN5bWJvbHMgZG9uJ3QgcXVhbGlmeSBpZgotICAgKiBpZ25vcmVfc3RhdGljX2Z1bmNzIHNldC4KLSAgICovCi0gIGlmIChpZ25vcmVfc3RhdGljX2Z1bmNzICYmIChzeW0tPmZsYWdzICYgQlNGX0xPQ0FMKSkKLSAgICB7Ci0gICAgICBEQkcgKEFPVVRERUJVRywgcHJpbnRmICgiW2NvcmVfc3ltX2NsYXNzXSAlczogbm90IGEgZnVuY3Rpb25cbiIsCi0JCQkgICAgICBzeW0tPm5hbWUpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBiZmRfZ2V0X3N5bWJvbF9pbmZvIChjb3JlX2JmZCwgc3ltLCAmc3ltaW5mbyk7Ci0gIGkgPSBzeW1pbmZvLnR5cGU7Ci0KLSAgaWYgKGkgPT0gJ1QnKQotICAgIHsKLSAgICAgIHJldHVybiBpOwkJCS8qIGl0J3MgYSBnbG9iYWwgc3ltYm9sICovCi0gICAgfQotCi0gIGlmIChpID09ICdXJykKLSAgICB7Ci0gICAgICAvKiBUcmVhdCB3ZWFrIHN5bWJvbHMgYXMgdGV4dCBzeW1ib2xzLiAgRklYTUU6IGEgd2VhayBzeW1ib2wgbWF5Ci0gICAgICAgICBhbHNvIGJlIGEgZGF0YSBzeW1ib2wuICAqLwotICAgICAgcmV0dXJuICdUJzsKLSAgICB9Ci0KLSAgaWYgKGkgIT0gJ3QnKQotICAgIHsKLSAgICAgIC8qIG5vdCBhIHN0YXRpYyB0ZXh0IHN5bWJvbCAqLwotICAgICAgREJHIChBT1VUREVCVUcsIHByaW50ZiAoIltjb3JlX3N5bV9jbGFzc10gJXMgaXMgb2YgY2xhc3MgJWNcbiIsCi0JCQkgICAgICBzeW0tPm5hbWUsIGkpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBkbyBzb21lIG1vcmUgZmlsdGVyaW5nIG9uIHN0YXRpYyBmdW5jdGlvbi1uYW1lczogKi8KLQotICBpZiAoaWdub3JlX3N0YXRpY19mdW5jcykKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIC8qCi0gICAqIENhbid0IHplcm8tbGVuZ3RoIG5hbWUgb3IgZnVubnkgY2hhcmFjdGVycyBpbiBuYW1lLCB3aGVyZQotICAgKiBgZnVubnknIGluY2x1ZGVzOiBgLicgKC5vIGZpbGUgbmFtZXMpIGFuZCBgJCcgKFBhc2NhbCBsYWJlbHMpLgotICAgKi8KLSAgaWYgKCFzeW0tPm5hbWUgfHwgc3ltLT5uYW1lWzBdID09ICdcMCcpCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGZvciAobmFtZSA9IHN5bS0+bmFtZTsgKm5hbWU7ICsrbmFtZSkKLSAgICB7Ci0gICAgICBpZiAoKm5hbWUgPT0gJy4nIHx8ICpuYW1lID09ICckJykKLQl7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotICAvKgotICAgKiBPbiBzeXN0ZW1zIHdoZXJlIHRoZSBDIGNvbXBpbGVyIGFkZHMgYW4gdW5kZXJzY29yZSB0byBhbGwKLSAgICogbmFtZXMsIHN0YXRpYyBuYW1lcyB3aXRob3V0IHVuZGVyc2NvcmVzIHNlZW0gdXN1YWxseSB0byBiZQotICAgKiBsYWJlbHMgaW4gaGFuZCB3cml0dGVuIGFzc2VtYmxlciBpbiB0aGUgbGlicmFyeS4gIFdlIGRvbid0IHdhbnQKLSAgICogdGhlc2UgbmFtZXMuICBUaGlzIGlzIGNlcnRhaW5seSBuZWNlc3Nhcnkgb24gYSBTcGFyYyBydW5uaW5nCi0gICAqIFN1bk9TIDQuMSAodHJ5IHByb2ZpbGluZyBhIHByb2dyYW0gdGhhdCBkb2VzIGEgbG90IG9mCi0gICAqIGRpdmlzaW9uKS4gSSBkb24ndCBrbm93IHdoZXRoZXIgaXQgaGFzIGhhcm1mdWwgc2lkZSBlZmZlY3RzIG9uCi0gICAqIG90aGVyIHN5c3RlbXMuICBQZXJoYXBzIGl0IHNob3VsZCBiZSBtYWRlIGNvbmZpZ3VyYWJsZS4KLSAgICovCi0gIHN5bV9wcmVmaXggPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGNvcmVfYmZkKTsKLSAgaWYgKChzeW1fcHJlZml4ICYmIHN5bV9wcmVmaXggIT0gc3ltLT5uYW1lWzBdKQotICAvKgotICAgKiBHQ0MgbWF5IGFkZCBzcGVjaWFsIHN5bWJvbHMgdG8gaGVscCBnZGIgZmlndXJlIG91dCB0aGUgZmlsZQotICAgKiBsYW5ndWFnZS4gIFdlIHdhbnQgdG8gaWdub3JlIHRoZXNlLCBzaW5jZSBzb21ldGltZXMgdGhleSBtYXNrCi0gICAqIHRoZSByZWFsIGZ1bmN0aW9uLiAgKGRqQGN0cm9uKQotICAgKi8KLSAgICAgIHx8ICFzdHJuY21wIChzeW0tPm5hbWUsICJfX2dudV9jb21waWxlZCIsIDE0KQotICAgICAgfHwgIXN0cm5jbXAgKHN5bS0+bmFtZSwgIl9fX2dudV9jb21waWxlZCIsIDE1KSkKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIG9iamVjdCBmaWxlIHN1cHBvcnRzIG1hcmtpbmcgb2YgZnVuY3Rpb24gc3ltYm9scywgdGhlbiB3ZSBjYW4KLSAgICAgemFwIGFueXRoaW5nIHRoYXQgZG9lc24ndCBoYXZlIEJTRl9GVU5DVElPTiBzZXQuICAqLwotICBpZiAoaWdub3JlX25vbl9mdW5jdGlvbnMgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuICd0JzsJCQkvKiBpdCdzIGEgc3RhdGljIHRleHQgc3ltYm9sICovCi19Ci0KLQotLyoKLSAqIEdldCB3aGF0ZXZlciBzb3VyY2UgaW5mbyB3ZSBjYW4gZ2V0IHJlZ2FyZGluZyBhZGRyZXNzIEFERFI6Ci0gKi8KLXN0YXRpYyBib29sCi1ERUZVTiAoZ2V0X3NyY19pbmZvLCAoYWRkciwgZmlsZW5hbWUsIG5hbWUsIGxpbmVfbnVtKSwKLSAgICAgICBiZmRfdm1hIGFkZHIgQU5EIGNvbnN0IGNoYXIgKipmaWxlbmFtZSBBTkQgY29uc3QgY2hhciAqKm5hbWUKLSAgICAgICBBTkQgaW50ICpsaW5lX251bSkKLXsKLSAgY29uc3QgY2hhciAqZm5hbWUgPSAwLCAqZnVuY19uYW1lID0gMDsKLSAgaW50IGwgPSAwOwotCi0gIGlmIChiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGNvcmVfYmZkLCBjb3JlX3RleHRfc2VjdCwgY29yZV9zeW1zLAotCQkJICAgICBhZGRyIC0gY29yZV90ZXh0X3NlY3QtPnZtYSwKLQkJCSAgICAgJmZuYW1lLCAmZnVuY19uYW1lLCAodW5zaWduZWQgaW50ICopICZsKQotICAgICAgJiYgZm5hbWUgJiYgZnVuY19uYW1lICYmIGwpCi0gICAgewotICAgICAgREJHIChBT1VUREVCVUcsIHByaW50ZiAoIltnZXRfc3JjX2luZm9dIDB4JWx4IC0+ICVzOiVkICglcylcbiIsCi0JCQkgICAgICBhZGRyLCBmbmFtZSwgbCwgZnVuY19uYW1lKSk7Ci0gICAgICAqZmlsZW5hbWUgPSBmbmFtZTsKLSAgICAgICpuYW1lID0gZnVuY19uYW1lOwotICAgICAgKmxpbmVfbnVtID0gbDsKLSAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIERCRyAoQU9VVERFQlVHLCBwcmludGYgKCJbZ2V0X3NyY19pbmZvXSBubyBpbmZvIGZvciAweCVseCAoJXM6JWQsJXMpXG4iLAotCQkJICAgICAgKGxvbmcpIGFkZHIsIGZuYW1lID8gZm5hbWUgOiAiPHVua25vd24+IiwgbCwKLQkJCSAgICAgIGZ1bmNfbmFtZSA/IGZ1bmNfbmFtZSA6ICI8dW5rbm93bj4iKSk7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBSZWFkIGluIHN5bWJvbCB0YWJsZSBmcm9tIGNvcmUuICBPbmUgc3ltYm9sIHBlciBmdW5jdGlvbiBpcwotICogZW50ZXJlZC4KLSAqLwotdm9pZAotREVGVU4gKGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMsIChjb3JlX2JmZCksIGJmZCAqIGNvcmVfYmZkKQotewotICBiZmRfdm1hIG1pbl92bWEgPSB+MCwgbWF4X3ZtYSA9IDA7Ci0gIGludCBjbGFzczsKLSAgbG9uZyBpLCBmb3VuZCwgc2tpcDsKLSAgdW5zaWduZWQgaW50IGo7Ci0KLSAgLyogcGFzcyAxIC0gZGV0ZXJtaW5lIHVwcGVyIGJvdW5kIG9uIG51bWJlciBvZiBmdW5jdGlvbiBuYW1lczogKi8KLSAgc3ltdGFiLmxlbiA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3JlX251bV9zeW1zOyArK2kpCi0gICAgewotICAgICAgaWYgKCFjb3JlX3N5bV9jbGFzcyAoY29yZV9zeW1zW2ldKSkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggYSBiaW5hcnkgc2VhcmNoIG9yIGhhc2hlZAotCSBzZWFyY2guICBHcm9zcy4gCi0KLQkgRG9uJ3QgY3JlYXRlIGEgc3ltdGFiIGVudHJ5IGZvciBhIGZ1bmN0aW9uIHRoYXQgaGFzCi0JIGEgbWFwcGluZyB0byBhIGZpbGUsIHVubGVzcyBpdCdzIHRoZSBmaXJzdCBmdW5jdGlvbgotCSBpbiB0aGUgZmlsZS4gICovCi0gICAgICBza2lwID0gMDsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBzeW1ib2xfbWFwX2NvdW50OyBqKyspCi0JaWYgKCFzdHJjbXAgKGNvcmVfc3ltc1tpXS0+bmFtZSwgc3ltYm9sX21hcFtqXS5mdW5jdGlvbl9uYW1lKSkKLQkgIHsKLQkgICAgaWYgKGogPiAwICYmICEgc3RyY21wIChzeW1ib2xfbWFwIFtqXS5maWxlX25hbWUsCi0JCQkgCSAgIHN5bWJvbF9tYXAgW2ogLSAxXS5maWxlX25hbWUpKQotCSAgICAgIHNraXAgPSAxOwotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIGlmICghc2tpcCkKLSAgICAgICAgKytzeW10YWIubGVuOwotICAgIH0KLQotICBpZiAoc3ltdGFiLmxlbiA9PSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGZpbGUgYCVzJyBoYXMgbm8gc3ltYm9sc1xuIiksIHdob2FtaSwgYV9vdXRfbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgLyogdGhlICIrIDIiIGlzIGZvciB0aGUgc2VudGluZWxzOiAqLwotICBzeW10YWIuYmFzZSA9IChTeW0gKikgeG1hbGxvYyAoKHN5bXRhYi5sZW4gKyAyKSAqIHNpemVvZiAoU3ltKSk7Ci0KLSAgLyogcGFzcyAyIC0gY3JlYXRlIHN5bWJvbHM6ICovCi0KLSAgc3ltdGFiLmxpbWl0ID0gc3ltdGFiLmJhc2U7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3JlX251bV9zeW1zOyArK2kpCi0gICAgewotICAgICAgY2xhc3MgPSBjb3JlX3N5bV9jbGFzcyAoY29yZV9zeW1zW2ldKTsKLSAgICAgIGlmICghY2xhc3MpCi0JewotCSAgREJHIChBT1VUREVCVUcsCi0JICAgICAgIHByaW50ZiAoIltjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zXSByZWplY3Rpbmc6IDB4JWx4ICVzXG4iLAotCQkgICAgICAgY29yZV9zeW1zW2ldLT52YWx1ZSwgY29yZV9zeW1zW2ldLT5uYW1lKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICAvKiBUaGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGEgYmluYXJ5IHNlYXJjaCBvciBoYXNoZWQKLQkgc2VhcmNoLiAgR3Jvc3MuICAgKi8KLQotICAgICAgc2tpcCA9IDA7Ci0gICAgICBmb3VuZCA9IDA7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgc3ltYm9sX21hcF9jb3VudDsgaisrKQotCWlmICghc3RyY21wIChjb3JlX3N5bXNbaV0tPm5hbWUsIHN5bWJvbF9tYXBbal0uZnVuY3Rpb25fbmFtZSkpCi0JICB7Ci0JICAgIGlmIChqID4gMCAmJiAhIHN0cmNtcCAoc3ltYm9sX21hcCBbal0uZmlsZV9uYW1lLAotCQkJIAkgICBzeW1ib2xfbWFwIFtqIC0gMV0uZmlsZV9uYW1lKSkKLQkgICAgICBza2lwID0gMTsKLQkgICAgZWxzZQotCSAgICAgIGZvdW5kID0gajsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLSAgICAgIGlmIChza2lwKQotCWNvbnRpbnVlOwotCi0gICAgICBzeW1faW5pdCAoc3ltdGFiLmxpbWl0KTsKLQotICAgICAgLyogc3ltYm9sIG9mZnNldHMgYXJlIGFsd2F5cyBzZWN0aW9uLXJlbGF0aXZlOiAqLwotCi0gICAgICBzeW10YWIubGltaXQtPmFkZHIgPSBjb3JlX3N5bXNbaV0tPnZhbHVlICsgY29yZV9zeW1zW2ldLT5zZWN0aW9uLT52bWE7Ci0gICAgICBpZiAoc3ltYm9sX21hcF9jb3VudAotCSAgJiYgIXN0cmNtcCAoY29yZV9zeW1zW2ldLT5uYW1lLCBzeW1ib2xfbWFwW2ZvdW5kXS5mdW5jdGlvbl9uYW1lKSkKLQl7Ci0JICBzeW10YWIubGltaXQtPm5hbWUgPSBzeW1ib2xfbWFwW2ZvdW5kXS5maWxlX25hbWU7Ci0JICBzeW10YWIubGltaXQtPm1hcHBlZCA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bXRhYi5saW1pdC0+bmFtZSA9IGNvcmVfc3ltc1tpXS0+bmFtZTsKLQkgIHN5bXRhYi5saW1pdC0+bWFwcGVkID0gMDsKLQl9Ci0KLSAgICAgIC8qIExvb2t1cCBmaWxlbmFtZSBhbmQgbGluZSBudW1iZXIsIGlmIHdlIGNhbiAqLwotCi0gICAgICB7Ci0JY29uc3QgY2hhciAqZmlsZW5hbWUsICpmdW5jX25hbWU7Ci0JCi0JaWYgKGdldF9zcmNfaW5mbyAoc3ltdGFiLmxpbWl0LT5hZGRyLCAmZmlsZW5hbWUsICZmdW5jX25hbWUsCi0JCQkgICZzeW10YWIubGltaXQtPmxpbmVfbnVtKSkKLQkgIHsKLQkgICAgc3ltdGFiLmxpbWl0LT5maWxlID0gc291cmNlX2ZpbGVfbG9va3VwX3BhdGggKGZpbGVuYW1lKTsKLQotCSAgICAvKiBGSVhNRTogQ2hlY2tpbmcgX19vc2ZfXyBoZXJlIGRvZXMgbm90IHdvcmsgd2l0aCBhIGNyb3NzCi0gICAgICAgICAgICAgICBncHJvZi4gICovCi0jaWZkZWYgX19vc2ZfXwotCSAgICAvKgotCSAgICAgKiBTdXBwcmVzcyBzeW1ib2xzIHRoYXQgYXJlIG5vdCBmdW5jdGlvbiBuYW1lcy4gIFRoaXMgaXMKLQkgICAgICogdXNlZnVsIHRvIHN1cHByZXNzIGNvZGUtbGFiZWxzIGFuZCBhbGlhc2VzLgotCSAgICAgKgotCSAgICAgKiBUaGlzIGlzIGtub3duIHRvIGJlIHVzZWZ1bCB1bmRlciBERUMncyBPU0YvMS4gIFVuZGVyIFN1bk9TIDQueCwKLQkgICAgICogbGFiZWxzIGRvIG5vdCBhcHBlYXIgaW4gdGhlIHN5bWJvbCB0YWJsZSBpbmZvLCBzbyB0aGlzIGlzbid0Ci0JICAgICAqIG5lY2Vzc2FyeS4KLQkgICAgICovCi0KLQkgICAgaWYgKHN0cmNtcCAoc3ltdGFiLmxpbWl0LT5uYW1lLCBmdW5jX25hbWUpICE9IDApCi0JICAgICAgewotCQkvKgotCQkgKiBUaGUgc3ltYm9sJ3MgYWRkcmVzcyBtYXBzIHRvIGEgZGlmZmVyZW50IG5hbWUsIHNvCi0JCSAqIGl0IGNhbid0IGJlIGEgZnVuY3Rpb24tZW50cnkgcG9pbnQuICBUaGlzIGhhcHBlbnMKLQkJICogZm9yIGxhYmVscywgZm9yIGV4YW1wbGUuCi0JCSAqLwotCQlEQkcgKEFPVVRERUJVRywKLQkJICAgICBwcmludGYgKCJbY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltczogcmVqICVzIChtYXBzIHRvICVzKVxuIiwKLQkJCSAgICAgc3ltdGFiLmxpbWl0LT5uYW1lLCBmdW5jX25hbWUpKTsKLQkJY29udGludWU7Ci0JICAgICAgfQotI2VuZGlmCi0JICB9Ci0gICAgICB9Ci0KLSAgICAgIHN5bXRhYi5saW1pdC0+aXNfZnVuYyA9IFRSVUU7Ci0gICAgICBzeW10YWIubGltaXQtPmlzX2JiX2hlYWQgPSBUUlVFOwotICAgICAgaWYgKGNsYXNzID09ICd0JykKLQl7Ci0JICBzeW10YWIubGltaXQtPmlzX3N0YXRpYyA9IFRSVUU7Ci0JfQotCi0gICAgICBtaW5fdm1hID0gTUlOIChzeW10YWIubGltaXQtPmFkZHIsIG1pbl92bWEpOwotICAgICAgbWF4X3ZtYSA9IE1BWCAoc3ltdGFiLmxpbWl0LT5hZGRyLCBtYXhfdm1hKTsKLQotICAgICAgLyoKLSAgICAgICAqIElmIHdlIHNlZSAibWFpbiIgd2l0aG91dCBhbiBpbml0aWFsICdfJywgd2UgYXNzdW1lIG5hbWVzCi0gICAgICAgKiBhcmUgKm5vdCogcHJlZml4ZWQgYnkgJ18nLgotICAgICAgICovCi0gICAgICBpZiAoc3ltdGFiLmxpbWl0LT5uYW1lWzBdID09ICdtJyAmJiBkaXNjYXJkX3VuZGVyc2NvcmVzCi0JICAmJiBzdHJjbXAgKHN5bXRhYi5saW1pdC0+bmFtZSwgIm1haW4iKSA9PSAwKQotCXsKLQkgIGRpc2NhcmRfdW5kZXJzY29yZXMgPSAwOwotCX0KLQotICAgICAgREJHIChBT1VUREVCVUcsIHByaW50ZiAoIltjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zXSAlbGQgJXMgMHglbHhcbiIsCi0JCQkgICAgICAobG9uZykgKHN5bXRhYi5saW1pdCAtIHN5bXRhYi5iYXNlKSwKLQkJCSAgICAgIHN5bXRhYi5saW1pdC0+bmFtZSwgc3ltdGFiLmxpbWl0LT5hZGRyKSk7Ci0gICAgICArK3N5bXRhYi5saW1pdDsKLSAgICB9Ci0KLSAgLyogY3JlYXRlIHNlbnRpbmVsczogKi8KLQotICBzeW1faW5pdCAoc3ltdGFiLmxpbWl0KTsKLSAgc3ltdGFiLmxpbWl0LT5uYW1lID0gIjxsb2NvcmU+IjsKLSAgc3ltdGFiLmxpbWl0LT5hZGRyID0gMDsKLSAgc3ltdGFiLmxpbWl0LT5lbmRfYWRkciA9IG1pbl92bWEgLSAxOwotICArK3N5bXRhYi5saW1pdDsKLQotICBzeW1faW5pdCAoc3ltdGFiLmxpbWl0KTsKLSAgc3ltdGFiLmxpbWl0LT5uYW1lID0gIjxoaWNvcmU+IjsKLSAgc3ltdGFiLmxpbWl0LT5hZGRyID0gbWF4X3ZtYSArIDE7Ci0gIHN5bXRhYi5saW1pdC0+ZW5kX2FkZHIgPSB+MDsKLSAgKytzeW10YWIubGltaXQ7Ci0KLSAgc3ltdGFiLmxlbiA9IHN5bXRhYi5saW1pdCAtIHN5bXRhYi5iYXNlOwotICBzeW10YWJfZmluYWxpemUgKCZzeW10YWIpOwotfQotCi0KLS8qCi0gKiBSZWFkIGluIHN5bWJvbCB0YWJsZSBmcm9tIGNvcmUuICBPbmUgc3ltYm9sIHBlciBsaW5lIG9mIHNvdXJjZSBjb2RlCi0gKiBpcyBlbnRlcmVkLgotICovCi12b2lkCi1ERUZVTiAoY29yZV9jcmVhdGVfbGluZV9zeW1zLCAoY29yZV9iZmQpLCBiZmQgKiBjb3JlX2JmZCkKLXsKLSAgY2hhciAqcHJldl9uYW1lLCAqcHJldl9maWxlbmFtZTsKLSAgaW50IHByZXZfbmFtZV9sZW4sIHByZXZfZmlsZW5hbWVfbGVuOwotICBiZmRfdm1hIHZtYSwgbWluX3ZtYSA9IH4wLCBtYXhfdm1hID0gMDsKLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIFN5bSAqcHJldiwgZHVtbXksICpzZW50aW5lbCwgKnN5bTsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGludCBwcmV2X2xpbmVfbnVtOwotICBTeW1fVGFibGUgbHRhYjsKLSAgLyoKLSAgICogQ3JlYXRlIHN5bWJvbHMgZm9yIGZ1bmN0aW9ucyBhcyB1c3VhbC4gIFRoaXMgaXMgbmVjZXNzYXJ5IGluCi0gICAqIGNhc2VzIHdoZXJlIHBhcnRzIG9mIGEgcHJvZ3JhbSB3ZXJlIG5vdCBjb21waWxlZCB3aXRoIC1nLiAgRm9yCi0gICAqIHRob3NlIHBhcnRzIHdlIHN0aWxsIHdhbnQgdG8gZ2V0IGluZm8gYXQgdGhlIGZ1bmN0aW9uIGxldmVsOgotICAgKi8KLSAgY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcyAoY29yZV9iZmQpOwotCi0gIC8qIHBhc3MgMSAtIGNvdW50ZXIgbnVtYmVyIG9mIHN5bWJvbHM6ICovCi0KLSAgLyoKLSAgICogVG8gZmluZCBhbGwgbGluZSBpbmZvcm1hdGlvbiwgd2FsayB0aHJvdWdoIGFsbCBwb3NzaWJsZQotICAgKiB0ZXh0LXNwYWNlIGFkZHJlc3NlcyAob25lIGJ5IG9uZSEpIGFuZCBnZXQgdGhlIGRlYnVnZ2luZwotICAgKiBpbmZvIGZvciBlYWNoIGFkZHJlc3MuICBXaGVuIHRoZSBkZWJ1Z2dpbmcgaW5mbyBjaGFuZ2VzLAotICAgKiBpdCBpcyB0aW1lIHRvIGNyZWF0ZSBhIG5ldyBzeW1ib2wuCi0gICAqCi0gICAqIE9mIGNvdXJzZSwgdGhpcyBpcyByYXRoZXIgc2xvdyBhbmQgaXQgd291bGQgYmUgYmV0dGVyIGlmCi0gICAqIGJmZCB3b3VsZCBwcm92aWRlIGFuIGl0ZXJhdG9yIGZvciBlbnVtZXJhdGluZyBhbGwgbGluZSBpbmZvcwotICAgKi8KLSAgcHJldl9uYW1lX2xlbiA9IFBBVEhfTUFYOwotICBwcmV2X2ZpbGVuYW1lX2xlbiA9IFBBVEhfTUFYOwotICBwcmV2X25hbWUgPSB4bWFsbG9jIChwcmV2X25hbWVfbGVuKTsKLSAgcHJldl9maWxlbmFtZSA9IHhtYWxsb2MgKHByZXZfZmlsZW5hbWVfbGVuKTsKLSAgbHRhYi5sZW4gPSAwOwotICBwcmV2X2xpbmVfbnVtID0gMDsKLSAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBjb3JlX3RleHRfc2VjdC0+X3Jhd19zaXplOyBvZmZzZXQgKz0gbWluX2luc25fc2l6ZSkKLSAgICB7Ci0gICAgICBpbnQgbGVuOwotCi0gICAgICB2bWEgPSBjb3JlX3RleHRfc2VjdC0+dm1hICsgb2Zmc2V0OwotICAgICAgaWYgKCFnZXRfc3JjX2luZm8gKHZtYSwgJmZpbGVuYW1lLCAmZHVtbXkubmFtZSwgJmR1bW15LmxpbmVfbnVtKQotCSAgfHwgKHByZXZfbGluZV9udW0gPT0gZHVtbXkubGluZV9udW0KLQkgICAgICAmJiBwcmV2X25hbWUgIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAocHJldl9uYW1lLCBkdW1teS5uYW1lKSA9PSAwCi0JICAgICAgJiYgc3RyY21wIChwcmV2X2ZpbGVuYW1lLCBmaWxlbmFtZSkgPT0gMCkpCi0JewotCSAgY29udGludWU7Ci0JfQotCi0gICAgICArK2x0YWIubGVuOwotICAgICAgcHJldl9saW5lX251bSA9IGR1bW15LmxpbmVfbnVtOwotCi0gICAgICBsZW4gPSBzdHJsZW4gKGR1bW15Lm5hbWUpOwotICAgICAgaWYgKGxlbiA+PSBwcmV2X25hbWVfbGVuKQotCXsKLQkgIHByZXZfbmFtZV9sZW4gPSBsZW4gKyAxMDI0OwotCSAgZnJlZSAocHJldl9uYW1lKTsKLQkgIHByZXZfbmFtZSA9IHhtYWxsb2MgKHByZXZfbmFtZV9sZW4pOwotCX0KLSAgICAgIHN0cmNweSAocHJldl9uYW1lLCBkdW1teS5uYW1lKTsKLQotICAgICAgbGVuID0gc3RybGVuIChmaWxlbmFtZSk7Ci0gICAgICBpZiAobGVuID49IHByZXZfZmlsZW5hbWVfbGVuKQotCXsKLQkgIHByZXZfZmlsZW5hbWVfbGVuID0gbGVuICsgMTAyNDsKLQkgIGZyZWUgKHByZXZfZmlsZW5hbWUpOwotCSAgcHJldl9maWxlbmFtZSA9IHhtYWxsb2MgKHByZXZfZmlsZW5hbWVfbGVuKTsKLQl9Ci0gICAgICBzdHJjcHkgKHByZXZfZmlsZW5hbWUsIGZpbGVuYW1lKTsKLQotICAgICAgbWluX3ZtYSA9IE1JTiAodm1hLCBtaW5fdm1hKTsKLSAgICAgIG1heF92bWEgPSBNQVggKHZtYSwgbWF4X3ZtYSk7Ci0gICAgfQotCi0gIGZyZWUgKHByZXZfbmFtZSk7Ci0gIGZyZWUgKHByZXZfZmlsZW5hbWUpOwotCi0gIC8qIG1ha2Ugcm9vbSBmb3IgZnVuY3Rpb24gc3ltYm9scywgdG9vOiAqLwotICBsdGFiLmxlbiArPSBzeW10YWIubGVuOwotICBsdGFiLmJhc2UgPSAoU3ltICopIHhtYWxsb2MgKGx0YWIubGVuICogc2l6ZW9mIChTeW0pKTsKLSAgbHRhYi5saW1pdCA9IGx0YWIuYmFzZTsKLQotICAvKiBwYXNzIDIgLSBjcmVhdGUgc3ltYm9sczogKi8KLQotICAvKiBXZSBub3cgc2V0IGlzX3N0YXRpYyBhcyB3ZSBnbyBhbG9uZywgcmF0aGVyIHRoYW4gYnkgcnVubmluZwotICAgICB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUgYXQgdGhlIGVuZC4KLQotICAgICBUaGUgb2xkIHdheSBjYWxsZWQgc3ltdGFiX2ZpbmFsaXplIGJlZm9yZSB0aGUgaXNfc3RhdGljIHBhc3MsCi0gICAgIGNhdXNpbmcgYSBwcm9ibGVtIHNpbmNlIHN5bXRhYl9maW5hbGl6ZSB1c2VzIGlzX3N0YXRpYyBhcyBwYXJ0IG9mCi0gICAgIGl0cyBhZGRyZXNzIGNvbmZsaWN0IHJlc29sdXRpb24gYWxnb3JpdGhtLiAgU2luY2UgZ2xvYmFsIHN5bWJvbHMKLSAgICAgd2VyZSBwcmVmZXJlZCBvdmVyIHN0YXRpYyBzeW1ib2xzLCBhbmQgYWxsIGxpbmUgc3ltYm9scyB3ZXJlCi0gICAgIGdsb2JhbCBhdCB0aGF0IHBvaW50LCBzdGF0aWMgZnVuY3Rpb24gbmFtZXMgdGhhdCBjb25mbGljdGVkIHdpdGgKLSAgICAgdGhlaXIgb3duIGxpbmUgbnVtYmVycyAoc3RhdGljLCBidXQgbGFiZWxlZCBhcyBnbG9iYWwpIHdlcmUKLSAgICAgcmVqZWN0ZWQgaW4gZmF2b3Igb2YgdGhlIGxpbmUgbnVtLgotCi0gICAgIFRoaXMgd2FzIG5vdCB0aGUgZGVzaXJlZCBmdW5jdGlvbmFsaXR5LiAgV2UgYWx3YXlzIHdhbnQgdG8ga2VlcAotICAgICBvdXIgZnVuY3Rpb24gc3ltYm9scyBhbmQgZGlzY2FyZCBhbnkgY29uZmxpY3RpbmcgbGluZSBzeW1ib2xzLgotICAgICBQZXJoYXBzIHN5bXRhYl9maW5hbGl6ZSBzaG91bGQgYmUgbW9kaWZpZWQgdG8gbWFrZSB0aGlzCi0gICAgIGRpc3RpbmN0aW9uIGFzIHdlbGwsIGJ1dCB0aGUgY3VycmVudCBmaXggd29ya3MgYW5kIHRoZSBjb2RlIGlzIGEKLSAgICAgbG90IGNsZWFuZXIgbm93LiAgKi8KLQotICBwcmV2ID0gMDsKLSAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBjb3JlX3RleHRfc2VjdC0+X3Jhd19zaXplOyBvZmZzZXQgKz0gbWluX2luc25fc2l6ZSkKLSAgICB7Ci0gICAgICBzeW1faW5pdCAobHRhYi5saW1pdCk7Ci0gICAgICBpZiAoIWdldF9zcmNfaW5mbyAoY29yZV90ZXh0X3NlY3QtPnZtYSArIG9mZnNldCwgJmZpbGVuYW1lLAotCQkJICZsdGFiLmxpbWl0LT5uYW1lLCAmbHRhYi5saW1pdC0+bGluZV9udW0pCi0JICB8fCAocHJldiAmJiBwcmV2LT5saW5lX251bSA9PSBsdGFiLmxpbWl0LT5saW5lX251bQotCSAgICAgICYmIHN0cmNtcCAocHJldi0+bmFtZSwgbHRhYi5saW1pdC0+bmFtZSkgPT0gMAotCSAgICAgICYmIHN0cmNtcCAocHJldi0+ZmlsZS0+bmFtZSwgZmlsZW5hbWUpID09IDApKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogbWFrZSBuYW1lIHBvaW50ZXIgYSBtYWxsb2MnZWQgc3RyaW5nOiAqLwotICAgICAgbHRhYi5saW1pdC0+bmFtZSA9IHhzdHJkdXAgKGx0YWIubGltaXQtPm5hbWUpOwotICAgICAgbHRhYi5saW1pdC0+ZmlsZSA9IHNvdXJjZV9maWxlX2xvb2t1cF9wYXRoIChmaWxlbmFtZSk7Ci0KLSAgICAgIGx0YWIubGltaXQtPmFkZHIgPSBjb3JlX3RleHRfc2VjdC0+dm1hICsgb2Zmc2V0OwotCi0gICAgICAvKiBTZXQgaXNfc3RhdGljIGJhc2VkIG9uIHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24sIHVzaW5nIGVpdGhlcjoKLSAgICAgICAqIDEpIHRoZSBwcmV2aW91cyBzeW1ib2wsIGlmIGl0J3MgZnJvbSB0aGUgc2FtZSBmdW5jdGlvbiwgb3IKLSAgICAgICAqIDIpIGEgc3ltdGFiIGxvb2t1cAotICAgICAgICovCi0KLSAgICAgIGlmIChwcmV2ICYmIGx0YWIubGltaXQtPmZpbGUgPT0gcHJldi0+ZmlsZSAmJgotCSAgc3RyY21wIChsdGFiLmxpbWl0LT5uYW1lLCBwcmV2LT5uYW1lKSA9PSAwKQotCXsKLQkgIGx0YWIubGltaXQtPmlzX3N0YXRpYyA9IHByZXYtPmlzX3N0YXRpYzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3ltID0gc3ltX2xvb2t1cCgmc3ltdGFiLCBsdGFiLmxpbWl0LT5hZGRyKTsKLQkgIGx0YWIubGltaXQtPmlzX3N0YXRpYyA9IHN5bS0+aXNfc3RhdGljOwotCX0KLQotICAgICAgcHJldiA9IGx0YWIubGltaXQ7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBJZiB3ZSBzZWUgIm1haW4iIHdpdGhvdXQgYW4gaW5pdGlhbCAnXycsIHdlIGFzc3VtZSBuYW1lcwotICAgICAgICogYXJlICpub3QqIHByZWZpeGVkIGJ5ICdfJy4KLSAgICAgICAqLwotICAgICAgaWYgKGx0YWIubGltaXQtPm5hbWVbMF0gPT0gJ20nICYmIGRpc2NhcmRfdW5kZXJzY29yZXMKLQkgICYmIHN0cmNtcCAobHRhYi5saW1pdC0+bmFtZSwgIm1haW4iKSA9PSAwKQotCXsKLQkgIGRpc2NhcmRfdW5kZXJzY29yZXMgPSAwOwotCX0KLQotICAgICAgREJHIChBT1VUREVCVUcsIHByaW50ZiAoIltjb3JlX2NyZWF0ZV9saW5lX3N5bXNdICVkICVzIDB4JWx4XG4iLAotCQkJICAgICAgbHRhYi5saW1pdCAtIGx0YWIuYmFzZSwgbHRhYi5saW1pdC0+bmFtZSwKLQkJCSAgICAgIGx0YWIubGltaXQtPmFkZHIpKTsKLSAgICAgICsrbHRhYi5saW1pdDsKLSAgICB9Ci0KLSAgLyogdXBkYXRlIHNlbnRpbmVsczogKi8KLQotICBzZW50aW5lbCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIDApOwotICBpZiAoc3RyY21wIChzZW50aW5lbC0+bmFtZSwgIjxsb2NvcmU+IikgPT0gMAotICAgICAgJiYgbWluX3ZtYSA8PSBzZW50aW5lbC0+ZW5kX2FkZHIpCi0gICAgewotICAgICAgc2VudGluZWwtPmVuZF9hZGRyID0gbWluX3ZtYSAtIDE7Ci0gICAgfQotCi0gIHNlbnRpbmVsID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgfjApOwotICBpZiAoc3RyY21wIChzZW50aW5lbC0+bmFtZSwgIjxoaWNvcmU+IikgPT0gMCAmJiBtYXhfdm1hID49IHNlbnRpbmVsLT5hZGRyKQotICAgIHsKLSAgICAgIHNlbnRpbmVsLT5hZGRyID0gbWF4X3ZtYSArIDE7Ci0gICAgfQotCi0gIC8qIGNvcHkgaW4gZnVuY3Rpb24gc3ltYm9sczogKi8KLSAgbWVtY3B5IChsdGFiLmxpbWl0LCBzeW10YWIuYmFzZSwgc3ltdGFiLmxlbiAqIHNpemVvZiAoU3ltKSk7Ci0gIGx0YWIubGltaXQgKz0gc3ltdGFiLmxlbjsKLQotICBpZiAoKHVuc2lnbmVkIGludCkgKGx0YWIubGltaXQgLSBsdGFiLmJhc2UpICE9IGx0YWIubGVuKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkgICAgICAgXygiJXM6IHNvbWVib2R5IG1pc2NvdW50ZWQ6IGx0YWIubGVuPSVkIGluc3RlYWQgb2YgJWxkXG4iKSwKLQkgICAgICAgd2hvYW1pLCBsdGFiLmxlbiwgKGxvbmcpIChsdGFiLmxpbWl0IC0gbHRhYi5iYXNlKSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgLyogZmluYWxpemUgbHRhYiBhbmQgbWFrZSBpdCBzeW1ib2wgdGFibGU6ICovCi0KLSAgc3ltdGFiX2ZpbmFsaXplICgmbHRhYik7Ci0gIGZyZWUgKHN5bXRhYi5iYXNlKTsKLSAgc3ltdGFiID0gbHRhYjsKLQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY29yZWZpbGUuaCBiL2dwcm9mL2NvcmVmaWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOTZmODUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY29yZWZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSNpZm5kZWYgY29yZWZpbGVfaAotI2RlZmluZSBjb3JlZmlsZV9oCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotZXh0ZXJuIGJmZCAqY29yZV9iZmQ7CQkvKiBiZmQgZm9yIGNvcmUtZmlsZSAqLwotZXh0ZXJuIGludCBjb3JlX251bV9zeW1zOwkvKiAjIG9mIGVudHJpZXMgaW4gc3ltYm9sLXRhYmxlICovCi1leHRlcm4gYXN5bWJvbCAqKmNvcmVfc3ltczsJLyogc3ltYm9sIHRhYmxlIGluIGEub3V0ICovCi1leHRlcm4gYXNlY3Rpb24gKmNvcmVfdGV4dF9zZWN0OwkvKiBjb3JlIHRleHQgc2VjdGlvbiAqLwotZXh0ZXJuIFBUUiBjb3JlX3RleHRfc3BhY2U7CS8qIHRleHQgc3BhY2Ugb2YgYS5vdXQgaW4gY29yZSAqLwotCi1leHRlcm4gaW50IG1pbl9pbnNuX3NpemU7CS8qIHNpemUgb2Ygc21hbGxlc3QgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzICovCi1leHRlcm4gaW50IG9mZnNldF90b19jb2RlOwkvKiBvZmZzZXQgKGluIGJ5dGVzKSBvZiBjb2RlIGZyb20gZW50cnkKLQkJCQkgICBhZGRyZXNzIG9mIHJvdXRpbmUgKi8KLQotZXh0ZXJuIHZvaWQgY29yZV9pbml0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFfb3V0X25hbWUpKTsKLWV4dGVybiB2b2lkIGNvcmVfZ2V0X3RleHRfc3BhY2UgUEFSQU1TICgoYmZkICogY29yZV9iZmQpKTsKLWV4dGVybiB2b2lkIGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMgUEFSQU1TICgoYmZkICogY29yZV9iZmQpKTsKLWV4dGVybiB2b2lkIGNvcmVfY3JlYXRlX2xpbmVfc3ltcyBQQVJBTVMgKChiZmQgKiBjb3JlX2JmZCkpOwotCi0jZW5kaWYgLyogY29yZWZpbGVfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvZmxhdF9ibC5tIGIvZ3Byb2YvZmxhdF9ibC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjI4NzFhLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2ZsYXRfYmwubQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLQotICUgICAgICAgICB0aGUgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lIG9mIHRoZQotdGltZSAgICAgICBwcm9ncmFtIHVzZWQgYnkgdGhpcyBmdW5jdGlvbi4KLQotY3VtdWxhdGl2ZSBhIHJ1bm5pbmcgc3VtIG9mIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBhY2NvdW50ZWQKLSBzZWNvbmRzICAgZm9yIGJ5IHRoaXMgZnVuY3Rpb24gYW5kIHRob3NlIGxpc3RlZCBhYm92ZSBpdC4KLQotIHNlbGYgICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgYWNjb3VudGVkIGZvciBieSB0aGlzCi1zZWNvbmRzICAgIGZ1bmN0aW9uIGFsb25lLiAgVGhpcyBpcyB0aGUgbWFqb3Igc29ydCBmb3IgdGhpcwotICAgICAgICAgICBsaXN0aW5nLgotCi1jYWxscyAgICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiB3YXMgaW52b2tlZCwgaWYKLSAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBpcyBwcm9maWxlZCwgZWxzZSBibGFuay4KLSAKLSBzZWxmICAgICAgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzcGVudCBpbiB0aGlzCi1tcy9jYWxsICAgIGZ1bmN0aW9uIHBlciBjYWxsLCBpZiB0aGlzIGZ1bmN0aW9uIGlzIHByb2ZpbGVkLAotCSAgIGVsc2UgYmxhbmsuCi0KLSB0b3RhbCAgICAgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzcGVudCBpbiB0aGlzCi1tcy9jYWxsICAgIGZ1bmN0aW9uIGFuZCBpdHMgZGVzY2VuZGVudHMgcGVyIGNhbGwsIGlmIHRoaXMgCi0JICAgZnVuY3Rpb24gaXMgcHJvZmlsZWQsIGVsc2UgYmxhbmsuCi0KLW5hbWUgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLiAgVGhpcyBpcyB0aGUgbWlub3Igc29ydAotICAgICAgICAgICBmb3IgdGhpcyBsaXN0aW5nLiBUaGUgaW5kZXggc2hvd3MgdGhlIGxvY2F0aW9uIG9mCi0JICAgdGhlIGZ1bmN0aW9uIGluIHRoZSBncHJvZiBsaXN0aW5nLiBJZiB0aGUgaW5kZXggaXMKLQkgICBpbiBwYXJlbnRoZXNpcyBpdCBzaG93cyB3aGVyZSBpdCB3b3VsZCBhcHBlYXIgaW4KLQkgICB0aGUgZ3Byb2YgbGlzdGluZyBpZiBpdCB3ZXJlIHRvIGJlIHByaW50ZWQuCmRpZmYgLS1naXQgYS9ncHJvZi9mc2ZfY2FsbGdfYmwubSBiL2dwcm9mL2ZzZl9jYWxsZ19ibC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTE2ODIxLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2ZzZl9jYWxsZ19ibC5tCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotCi0gVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGNhbGwgdHJlZSBvZiB0aGUgcHJvZ3JhbSwgYW5kIHdhcyBzb3J0ZWQgYnkKLSB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gZWFjaCBmdW5jdGlvbiBhbmQgaXRzIGNoaWxkcmVuLgotCi0gRWFjaCBlbnRyeSBpbiB0aGlzIHRhYmxlIGNvbnNpc3RzIG9mIHNldmVyYWwgbGluZXMuICBUaGUgbGluZSB3aXRoIHRoZQotIGluZGV4IG51bWJlciBhdCB0aGUgbGVmdCBoYW5kIG1hcmdpbiBsaXN0cyB0aGUgY3VycmVudCBmdW5jdGlvbi4KLSBUaGUgbGluZXMgYWJvdmUgaXQgbGlzdCB0aGUgZnVuY3Rpb25zIHRoYXQgY2FsbGVkIHRoaXMgZnVuY3Rpb24sCi0gYW5kIHRoZSBsaW5lcyBiZWxvdyBpdCBsaXN0IHRoZSBmdW5jdGlvbnMgdGhpcyBvbmUgY2FsbGVkLgotIFRoaXMgbGluZSBsaXN0czoKLSAgICAgaW5kZXgJQSB1bmlxdWUgbnVtYmVyIGdpdmVuIHRvIGVhY2ggZWxlbWVudCBvZiB0aGUgdGFibGUuCi0JCUluZGV4IG51bWJlcnMgYXJlIHNvcnRlZCBudW1lcmljYWxseS4KLQkJVGhlIGluZGV4IG51bWJlciBpcyBwcmludGVkIG5leHQgdG8gZXZlcnkgZnVuY3Rpb24gbmFtZSBzbwotCQlpdCBpcyBlYXNpZXIgdG8gbG9vayB1cCB3aGVyZSB0aGUgZnVuY3Rpb24gaW4gdGhlIHRhYmxlLgotCi0gICAgICUgdGltZQlUaGlzIGlzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBgdG90YWwnIHRpbWUgdGhhdCB3YXMgc3BlbnQKLQkJaW4gdGhpcyBmdW5jdGlvbiBhbmQgaXRzIGNoaWxkcmVuLiAgTm90ZSB0aGF0IGR1ZSB0bwotCQlkaWZmZXJlbnQgdmlld3BvaW50cywgZnVuY3Rpb25zIGV4Y2x1ZGVkIGJ5IG9wdGlvbnMsIGV0YywKLQkJdGhlc2UgbnVtYmVycyB3aWxsIE5PVCBhZGQgdXAgdG8gMTAwJS4KLQotICAgICBzZWxmCVRoaXMgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIHRoaXMgZnVuY3Rpb24uCi0KLSAgICAgY2hpbGRyZW4JVGhpcyBpcyB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgcHJvcGFnYXRlZCBpbnRvIHRoaXMKLQkJZnVuY3Rpb24gYnkgaXRzIGNoaWxkcmVuLgotCi0gICAgIGNhbGxlZAlUaGlzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQuCi0JCUlmIHRoZSBmdW5jdGlvbiBjYWxsZWQgaXRzZWxmIHJlY3Vyc2l2ZWx5LCB0aGUgbnVtYmVyCi0JCW9ubHkgaW5jbHVkZXMgbm9uLXJlY3Vyc2l2ZSBjYWxscywgYW5kIGlzIGZvbGxvd2VkIGJ5Ci0JCWEgYCsnIGFuZCB0aGUgbnVtYmVyIG9mIHJlY3Vyc2l2ZSBjYWxscy4KLQotICAgICBuYW1lCVRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgVGhlIGluZGV4IG51bWJlciBpcwotCQlwcmludGVkIGFmdGVyIGl0LiAgSWYgdGhlIGZ1bmN0aW9uIGlzIGEgbWVtYmVyIG9mIGEKLQkJY3ljbGUsIHRoZSBjeWNsZSBudW1iZXIgaXMgcHJpbnRlZCBiZXR3ZWVuIHRoZQotCQlmdW5jdGlvbidzIG5hbWUgYW5kIHRoZSBpbmRleCBudW1iZXIuCi0KLQotIEZvciB0aGUgZnVuY3Rpb24ncyBwYXJlbnRzLCB0aGUgZmllbGRzIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKLQotICAgICBzZWxmCVRoaXMgaXMgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgd2FzIHByb3BhZ2F0ZWQgZGlyZWN0bHkKLQkJZnJvbSB0aGUgZnVuY3Rpb24gaW50byB0aGlzIHBhcmVudC4KLQotICAgICBjaGlsZHJlbglUaGlzIGlzIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHdhcyBwcm9wYWdhdGVkIGZyb20KLQkJdGhlIGZ1bmN0aW9uJ3MgY2hpbGRyZW4gaW50byB0aGlzIHBhcmVudC4KLQotICAgICBjYWxsZWQJVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgcGFyZW50IGNhbGxlZCB0aGUKLQkJZnVuY3Rpb24gYC8nIHRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgdGhlIGZ1bmN0aW9uCi0JCXdhcyBjYWxsZWQuICBSZWN1cnNpdmUgY2FsbHMgdG8gdGhlIGZ1bmN0aW9uIGFyZSBub3QKLQkJaW5jbHVkZWQgaW4gdGhlIG51bWJlciBhZnRlciB0aGUgYC8nLgotCi0gICAgIG5hbWUJVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyZW50LiAgVGhlIHBhcmVudCdzIGluZGV4Ci0JCW51bWJlciBpcyBwcmludGVkIGFmdGVyIGl0LiAgSWYgdGhlIHBhcmVudCBpcyBhCi0JCW1lbWJlciBvZiBhIGN5Y2xlLCB0aGUgY3ljbGUgbnVtYmVyIGlzIHByaW50ZWQgYmV0d2VlbgotCQl0aGUgbmFtZSBhbmQgdGhlIGluZGV4IG51bWJlci4KLQotIElmIHRoZSBwYXJlbnRzIG9mIHRoZSBmdW5jdGlvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhlIHdvcmQKLSBgPHNwb250YW5lb3VzPicgaXMgcHJpbnRlZCBpbiB0aGUgYG5hbWUnIGZpZWxkLCBhbmQgYWxsIHRoZSBvdGhlcgotIGZpZWxkcyBhcmUgYmxhbmsuCi0KLSBGb3IgdGhlIGZ1bmN0aW9uJ3MgY2hpbGRyZW4sIHRoZSBmaWVsZHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmdzOgotCi0gICAgIHNlbGYJVGhpcyBpcyB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdCB3YXMgcHJvcGFnYXRlZCBkaXJlY3RseQotCQlmcm9tIHRoZSBjaGlsZCBpbnRvIHRoZSBmdW5jdGlvbi4KLQotICAgICBjaGlsZHJlbglUaGlzIGlzIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHdhcyBwcm9wYWdhdGVkIGZyb20gdGhlCi0JCWNoaWxkJ3MgY2hpbGRyZW4gdG8gdGhlIGZ1bmN0aW9uLgotCi0gICAgIGNhbGxlZAlUaGlzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZ1bmN0aW9uIGNhbGxlZAotCQl0aGlzIGNoaWxkIGAvJyB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBjaGlsZAotCQl3YXMgY2FsbGVkLiAgUmVjdXJzaXZlIGNhbGxzIGJ5IHRoZSBjaGlsZCBhcmUgbm90Ci0JCWxpc3RlZCBpbiB0aGUgbnVtYmVyIGFmdGVyIHRoZSBgLycuCi0KLSAgICAgbmFtZQlUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjaGlsZC4gIFRoZSBjaGlsZCdzIGluZGV4Ci0JCW51bWJlciBpcyBwcmludGVkIGFmdGVyIGl0LiAgSWYgdGhlIGNoaWxkIGlzIGEKLQkJbWVtYmVyIG9mIGEgY3ljbGUsIHRoZSBjeWNsZSBudW1iZXIgaXMgcHJpbnRlZAotCQliZXR3ZWVuIHRoZSBuYW1lIGFuZCB0aGUgaW5kZXggbnVtYmVyLgotCi0gSWYgdGhlcmUgYXJlIGFueSBjeWNsZXMgKGNpcmNsZXMpIGluIHRoZSBjYWxsIGdyYXBoLCB0aGVyZSBpcyBhbgotIGVudHJ5IGZvciB0aGUgY3ljbGUtYXMtYS13aG9sZS4gIFRoaXMgZW50cnkgc2hvd3Mgd2hvIGNhbGxlZCB0aGUKLSBjeWNsZSAoYXMgcGFyZW50cykgYW5kIHRoZSBtZW1iZXJzIG9mIHRoZSBjeWNsZSAoYXMgY2hpbGRyZW4uKQotIFRoZSBgKycgcmVjdXJzaXZlIGNhbGxzIGVudHJ5IHNob3dzIHRoZSBudW1iZXIgb2YgZnVuY3Rpb24gY2FsbHMgdGhhdAotIHdlcmUgaW50ZXJuYWwgdG8gdGhlIGN5Y2xlLCBhbmQgdGhlIGNhbGxzIGVudHJ5IGZvciBlYWNoIG1lbWJlciBzaG93cywKLSBmb3IgdGhhdCBtZW1iZXIsIGhvdyBtYW55IHRpbWVzIGl0IHdhcyBjYWxsZWQgZnJvbSBvdGhlciBtZW1iZXJzIG9mCi0gdGhlIGN5Y2xlLgotCmRpZmYgLS1naXQgYS9ncHJvZi9nY29uZmlnLmluIGIvZ3Byb2YvZ2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ3ZThlMC4uMDAwMDAwMAotLS0gYS9ncHJvZi9nY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qIGdjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSN1bmRlZiBpbmxpbmUKLQotLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBvZmZfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHNpemVfdAotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NVU5NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQUxVRVNfSAotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCmRpZmYgLS1naXQgYS9ncHJvZi9nZW4tYy1wcm9nLmF3ayBiL2dwcm9mL2dlbi1jLXByb2cuYXdrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTljMWY4Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2dlbi1jLXByb2cuYXdrCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotTlIgPT0gMQl7Ci0gICAgRlM9IlwiIjsKLSAgICBwcmludCAiLyogPT0+IERvIG5vdCBtb2RpZnkgdGhpcyBmaWxlISEgIEl0IGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSIKLSAgICBwcmludGYgIiAgIGZyb20gJXMgdXNpbmcgdGhlIGdlbi1jLXByb2cuYXdrIHNjcmlwdC4gIDw9PSAqL1xuXG4iLCBGSUxFCi0gICAgcHJpbnQgIiNpbmNsdWRlIDxzdGRpby5oPiIKLX0KLQotCXsKLQkgIGlmIChjdXJmdW4gIT0gRlVOQ1RJT04pCi0JICAgIHsKLQkgICAgICBpZiAoY3VyZnVuKQotCQlwcmludCAifSIKLQkgICAgICBjdXJmdW4gPSBGVU5DVElPTgotCSAgICAgIHByaW50ICIiCi0JICAgICAgcHJpbnQgInZvaWQiOwotCSAgICAgIHByaW50ZiAiJXMgKGZpbGUpXG4iLCBGVU5DVElPTgotCSAgICAgIHByaW50ICIgICAgIEZJTEUgKmZpbGU7IjsKLQkgICAgICBwcmludCAieyI7Ci0JICAgIH0KLQkgIHByaW50ZiAiICBmcHV0cyAoXCIiOwotCSAgZm9yIChpID0gMTsgaSA8IE5GOyBpKyspCi0JICAgIHByaW50ZiAiJXNcXFwiIiwgJGk7Ci0JICBwcmludGYgIiVzXFxuXCIsIGZpbGUpO1xuIiwgJE5GOwotfQotCi1FTkQJeyBwcmludCAifSIgfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ21vbi5oIGIvZ3Byb2YvZ21vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDFmYTRkLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2dtb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKi0KLSAqIENvcHlyaWdodCAoYykgMTk5MSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgotICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqCUAoIylnbW9uLmgJNS4yIChCZXJrZWxleSkgNS82LzkxCi0gKi8KLSNpZm5kZWYgZ21vbl9oCi0jZGVmaW5lIGdtb25faAotCi1zdHJ1Y3QgcmF3X3BoZHIKLSAgewotICAgIC8qIEZJWE1FOiBDaGVja2luZyBhIGhvc3QgY29tcGlsZXIgZGVmaW5lIG1lYW5zIHRoYXQgd2UgY2FuJ3QgdXNlCi0gICAgICAgYSBjcm9zcyBncHJvZiB0byB0aGUgYWxwaGEuICAqLwotI2lmZGVmIF9fYWxwaGFfXwotICAgIGNoYXIgbG93X3BjWzhdOwkJLyogYmFzZSBwYyBhZGRyZXNzIG9mIHNhbXBsZSBidWZmZXIgKi8KLSAgICBjaGFyIGhpZ2hfcGNbOF07CQkvKiBtYXggcGMgYWRkcmVzcyBvZiBzYW1wbGVkIGJ1ZmZlciAqLwotI2Vsc2UKLSAgICBjaGFyIGxvd19wY1s0XTsJCS8qIGJhc2UgcGMgYWRkcmVzcyBvZiBzYW1wbGUgYnVmZmVyICovCi0gICAgY2hhciBoaWdoX3BjWzRdOwkJLyogbWF4IHBjIGFkZHJlc3Mgb2Ygc2FtcGxlZCBidWZmZXIgKi8KLSNlbmRpZgotICAgIGNoYXIgbmNudFs0XTsJCS8qIHNpemUgb2Ygc2FtcGxlIGJ1ZmZlciAocGx1cyB0aGlzIGhlYWRlcikgKi8KLQotICAgIGNoYXIgdmVyc2lvbls0XTsJCS8qIHZlcnNpb24gbnVtYmVyICovCi0gICAgY2hhciBwcm9mcmF0ZVs0XTsJCS8qIHByb2ZpbGluZyBjbG9jayByYXRlICovCi0gICAgY2hhciBzcGFyZVszKjRdOwkJLyogcmVzZXJ2ZWQgKi8KLSAgfTsKLQotI2RlZmluZSBHTU9OVkVSU0lPTiAgICAgMHgwMDA1MTg3OQotCi1zdHJ1Y3Qgb2xkX3Jhd19waGRyCi0gIHsKLSAgICAvKiBGSVhNRTogQ2hlY2tpbmcgYSBob3N0IGNvbXBpbGVyIGRlZmluZSBtZWFucyB0aGF0IHdlIGNhbid0IHVzZQotICAgICAgIGEgY3Jvc3MgZ3Byb2YgdG8gdGhlIGFscGhhLiAgKi8KLSNpZmRlZiBfX2FscGhhX18KLSAgICBjaGFyIGxvd19wY1s4XTsJCS8qIGJhc2UgcGMgYWRkcmVzcyBvZiBzYW1wbGUgYnVmZmVyICovCi0gICAgY2hhciBoaWdoX3BjWzhdOwkJLyogbWF4IHBjIGFkZHJlc3Mgb2Ygc2FtcGxlZCBidWZmZXIgKi8KLSNlbHNlCi0gICAgY2hhciBsb3dfcGNbNF07CQkvKiBiYXNlIHBjIGFkZHJlc3Mgb2Ygc2FtcGxlIGJ1ZmZlciAqLwotICAgIGNoYXIgaGlnaF9wY1s0XTsJCS8qIG1heCBwYyBhZGRyZXNzIG9mIHNhbXBsZWQgYnVmZmVyICovCi0jZW5kaWYKLSAgICBjaGFyIG5jbnRbNF07CQkvKiBzaXplIG9mIHNhbXBsZSBidWZmZXIgKHBsdXMgdGhpcyBoZWFkZXIpICovCi0KLSAgICAvKiBGSVhNRTogQ2hlY2tpbmcgaG9zdCBjb21waWxlciBkZWZpbmVzIGhlcmUgbWVhbnMgdGhhdCB3ZSBjYW4ndAotICAgICAgIHVzZSBhIGNyb3NzIGdwcm9mIGFscGhhIE9TRi4gICovCi0jaWYgZGVmaW5lZCAoX19hbHBoYV9fKSAmJiBkZWZpbmVkIChfX29zZl9fKQotICAgIC8qCi0gICAgICogREVDJ3MgT1NGIHYzLjAgdXNlcyA0IGJ5dGVzIG9mIHBhZGRpbmcgdG8gYnJpbmcgdGhlIGhlYWRlciB0bwotICAgICAqIGEgc2l6ZSB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgOC4KLSAgICAgKi8KLSAgICBjaGFyIHBhZFs0XTsKLSNlbmRpZgotICB9OwotCi0vKgotICogSGlzdG9ncmFtIGNvdW50ZXJzIGFyZSB1bnNpZ25lZCBzaG9ydHM6Ci0gKi8KLSNkZWZpbmUJSElTVENPVU5URVIgdW5zaWduZWQgc2hvcnQKLQotLyoKLSAqIEZyYWN0aW9uIG9mIHRleHQgc3BhY2UgdG8gYWxsb2NhdGUgZm9yIGhpc3RvZ3JhbSBjb3VudGVycyBoZXJlLCAxLzI6Ci0gKi8KLSNkZWZpbmUJSElTVEZSQUNUSU9OCTIKLQotLyoKLSAqIEZyYWN0aW9uIG9mIHRleHQgc3BhY2UgdG8gYWxsb2NhdGUgZm9yIGZyb20gaGFzaCBidWNrZXRzLiAgVGhlCi0gKiB2YWx1ZSBvZiBIQVNIRlJBQ1RJT04gaXMgYmFzZWQgb24gdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIG9mCi0gKiBzZXBhcmF0aW9uIGJldHdlZW4gdHdvIHN1YnJvdXRpbmUgY2FsbCBwb2ludHMgaW4gdGhlIG9iamVjdCBjb2RlLgotICogR2l2ZW4gTUlOX1NVQlJfU0VQQVJBVElPTiBieXRlcyBvZiBzZXBhcmF0aW9uIHRoZSB2YWx1ZSBvZgotICogSEFTSEZSQUNUSU9OIGlzIGNhbGN1bGF0ZWQgYXM6Ci0gKgotICogICAgICBIQVNIRlJBQ1RJT04gPSBNSU5fU1VCUl9TRVBBUkFUSU9OIC8gKDIgKiBzaXplb2Yoc2hvcnQpIC0gMSk7Ci0gKgotICogRm9yIHRoZSBWQVgsIHRoZSBzaG9ydGVzdCB0d28gY2FsbCBzZXF1ZW5jZSBpczoKLSAqCi0gKiAgICAgIGNhbGxzICAgJDAsKHIwKQotICogICAgICBjYWxscyAgICQwLChyMCkKLSAqCi0gKiB3aGljaCBpcyBzZXBhcmF0ZWQgYnkgb25seSB0aHJlZSBieXRlcywgdGh1cyBIQVNIRlJBQ1RJT04gaXMgCi0gKiBjYWxjdWxhdGVkIGFzOgotICoKLSAqICAgICAgSEFTSEZSQUNUSU9OID0gMyAvICgyICogMiAtIDEpID0gMQotICoKLSAqIE5vdGUgdGhhdCB0aGUgZGl2aXNpb24gYWJvdmUgcm91bmRzIGRvd24sIHRodXMgaWYgTUlOX1NVQlJfRlJBQ1RJT04KLSAqIGlzIGxlc3MgdGhhbiB0aHJlZSwgdGhpcyBhbGdvcml0aG0gd2lsbCBub3Qgd29yayEKLSAqLwotI2RlZmluZQlIQVNIRlJBQ1RJT04gMQotCi0vKgotICogUGVyY2VudCBvZiB0ZXh0IHNwYWNlIHRvIGFsbG9jYXRlIGZvciB0b3N0cnVjdHMgd2l0aCBhIG1pbmltdW06Ci0gKi8KLSNkZWZpbmUgQVJDREVOU0lUWQkyCi0jZGVmaW5lIE1JTkFSQ1MJCTUwCi0KLXN0cnVjdCB0b3N0cnVjdAotICB7Ci0gICAgY2hhciAqc2VsZnBjOwotICAgIGludCBjb3VudDsKLSAgICB1bnNpZ25lZCBzaG9ydCBsaW5rOwotICB9OwotCi0vKgotICogQSByYXcgYXJjLCB3aXRoIHBvaW50ZXJzIHRvIHRoZSBjYWxsaW5nIHNpdGUgYW5kIHRoZSBjYWxsZWQgc2l0ZQotICogYW5kIGEgY291bnQuICBFdmVyeXRoaW5nIGlzIGRlZmluZWQgaW4gdGVybXMgb2YgY2hhcmFjdGVycyBzbwotICogYXMgdG8gZ2V0IGEgcGFja2VkIHJlcHJlc2VudGF0aW9uIChvdGhlcndpc2UsIGRpZmZlcmVudCBjb21waWxlcnMKLSAqIG1pZ2h0IGludHJvZHVjZSBkaWZmZXJlbnQgcGFkZGluZyk6Ci0gKi8KLXN0cnVjdCByYXdfYXJjCi0gIHsKLSAgICAvKiBGSVhNRTogQ2hlY2tpbmcgYSBob3N0IGNvbXBpbGVyIGRlZmluZSBtZWFucyB0aGF0IHdlIGNhbid0IHVzZQotICAgICAgIGEgY3Jvc3MgZ3Byb2YgdG8gdGhlIGFscGhhLiAgKi8KLSNpZmRlZiBfX2FscGhhX18KLSAgICBjaGFyIGZyb21fcGNbOF07Ci0gICAgY2hhciBzZWxmX3BjWzhdOwotICAgIGNoYXIgY291bnRbOF07Ci0jZWxzZQotICAgIGNoYXIgZnJvbV9wY1s0XTsKLSAgICBjaGFyIHNlbGZfcGNbNF07Ci0gICAgY2hhciBjb3VudFs0XTsKLSNlbmRpZgotICB9OwotCi0vKgotICogR2VuZXJhbCByb3VuZGluZyBmdW5jdGlvbnM6Ci0gKi8KLSNkZWZpbmUgUk9VTkRET1dOKHgseSkJKCgoeCkvKHkpKSooeSkpCi0jZGVmaW5lIFJPVU5EVVAoeCx5KQkoKCgoeCkrKHkpLTEpLyh5KSkqKHkpKQotCi0jZW5kaWYgLyogZ21vbl9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9nbW9uX2lvLmMgYi9ncHJvZi9nbW9uX2lvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMjk0ZjUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ21vbl9pby5jCisrKyAvZGV2L251bGwKQEAgLTEsNDU0ICswLDAgQEAKLS8qCi0gKiBJbnB1dCBhbmQgb3V0cHV0IGZyb20vdG8gZ21vbi5vdXQgZmlsZXMuCi0gKi8KLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiYmFzaWNfYmxvY2tzLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJjYWxsX2dyYXBoLmgiCi0jaW5jbHVkZSAiZ21vbl9pby5oIgotI2luY2x1ZGUgImdtb25fb3V0LmgiCi0jaW5jbHVkZSAiZ21vbi5oIgkJLyogZmV0Y2ggaGVhZGVyIGZvciBvbGQgZm9ybWF0ICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJoZXJ0ei5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotaW50IGdtb25faW5wdXQgPSAwOwotaW50IGdtb25fZmlsZV92ZXJzaW9uID0gMDsJLyogMCA9PSBvbGQgKG5vbi12ZXJzaW9uZWQpIGZpbGUgZm9ybWF0ICovCi0KLS8qCi0gKiBUaGlzIHByb2JhYmx5IG91Z2h0IHRvIGJlIGluIGxpYmJmZC4KLSAqLwotYmZkX3ZtYQotREVGVU4gKGdldF92bWEsIChhYmZkLCBhZGRyKSwgYmZkICogYWJmZCBBTkQgYmZkX2J5dGUgKiBhZGRyKQotewotICBzd2l0Y2ggKHNpemVvZiAoY2hhciopKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gYmZkX2dldF8zMiAoYWJmZCwgYWRkcik7Ci0gICAgY2FzZSA4OgotICAgICAgcmV0dXJuIGJmZF9nZXRfNjQgKGFiZmQsIGFkZHIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfdm1hIGhhcyB1bmV4cGVjdGVkIHNpemUgb2YgJWxkIGJ5dGVzXG4iKSwKLQkgICAgICAgd2hvYW1pLCAobG9uZykgc2l6ZW9mIChjaGFyKikpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBUaGlzIHByb2JhYmx5IG91Z2h0IHRvIGJlIGluIGxpYmJmZC4KLSAqLwotdm9pZAotREVGVU4gKHB1dF92bWEsIChhYmZkLCB2YWwsIGFkZHIpLCBiZmQgKiBhYmZkIEFORCBiZmRfdm1hIHZhbCBBTkQgYmZkX2J5dGUgKiBhZGRyKQotewotICBzd2l0Y2ggKHNpemVvZiAoY2hhciopKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIGFkZHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgYmZkX3B1dF82NCAoYWJmZCwgdmFsLCBhZGRyKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfdm1hIGhhcyB1bmV4cGVjdGVkIHNpemUgb2YgJWxkIGJ5dGVzXG4iKSwKLQkgICAgICAgd2hvYW1pLCAobG9uZykgc2l6ZW9mIChjaGFyKikpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotfQotCi0KLXZvaWQKLURFRlVOIChnbW9uX291dF9yZWFkLCAoZmlsZW5hbWUpLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgRklMRSAqaWZwOwotICBzdHJ1Y3QgZ21vbl9oZHIgZ2hkcjsKLSAgdW5zaWduZWQgY2hhciB0YWc7Ci0gIGludCBuaGlzdCA9IDAsIG5hcmNzID0gMCwgbmJicyA9IDA7Ci0KLSAgLyogb3BlbiBnbW9uLm91dCBmaWxlOiAqLwotCi0gIGlmIChzdHJjbXAgKGZpbGVuYW1lLCAiLSIpID09IDApCi0gICAgewotICAgICAgaWZwID0gc3RkaW47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWZwID0gZm9wZW4gKGZpbGVuYW1lLCBGT1BFTl9SQik7Ci0gICAgICBpZiAoIWlmcCkKLQl7Ci0JICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLSAgICB9Ci0gIGlmIChmcmVhZCAoJmdoZHIsIHNpemVvZiAoc3RydWN0IGdtb25faGRyKSwgMSwgaWZwKSAhPSAxKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGZpbGUgdG9vIHNob3J0IHRvIGJlIGEgZ21vbiBmaWxlXG4iKSwKLQkgICAgICAgZmlsZW5hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGlmICgoZmlsZV9mb3JtYXQgPT0gRkZfTUFHSUMpIHx8Ci0gICAgICAoZmlsZV9mb3JtYXQgPT0gRkZfQVVUTyAmJiAhc3RybmNtcCAoJmdoZHIuY29va2llWzBdLCBHTU9OX01BR0lDLCA0KSkpCi0gICAgewotICAgICAgaWYgKGZpbGVfZm9ybWF0ID09IEZGX01BR0lDICYmIHN0cm5jbXAgKCZnaGRyLmNvb2tpZVswXSwgR01PTl9NQUdJQywgNCkpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZmlsZSBgJXMnIGhhcyBiYWQgbWFnaWMgY29va2llXG4iKSwKLQkJICAgd2hvYW1pLCBmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0KLSAgICAgIC8qIHJpZ2h0IG1hZ2ljLCBzbyBpdCdzIHByb2JhYmx5IHJlYWxseSBhIG5ldyBnbW9uLm91dCBmaWxlICovCi0KLSAgICAgIGdtb25fZmlsZV92ZXJzaW9uID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBnaGRyLnZlcnNpb24pOwotICAgICAgaWYgKGdtb25fZmlsZV92ZXJzaW9uICE9IEdNT05fVkVSU0lPTiAmJiBnbW9uX2ZpbGVfdmVyc2lvbiAhPSAwKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgXygiJXM6IGZpbGUgYCVzJyBoYXMgdW5zdXBwb3J0ZWQgdmVyc2lvbiAlZFxuIiksCi0JCSAgIHdob2FtaSwgZmlsZW5hbWUsIGdtb25fZmlsZV92ZXJzaW9uKTsKLQkgIGRvbmUgKDEpOwotCX0KLQotICAgICAgLyogcmVhZCBpbiBhbGwgdGhlIHJlY29yZHM6ICovCi0gICAgICB3aGlsZSAoZnJlYWQgKCZ0YWcsIHNpemVvZiAodGFnKSwgMSwgaWZwKSA9PSAxKQotCXsKLQkgIHN3aXRjaCAodGFnKQotCSAgICB7Ci0JICAgIGNhc2UgR01PTl9UQUdfVElNRV9ISVNUOgotCSAgICAgICsrbmhpc3Q7Ci0JICAgICAgZ21vbl9pbnB1dCB8PSBJTlBVVF9ISVNUT0dSQU07Ci0JICAgICAgaGlzdF9yZWFkX3JlYyAoaWZwLCBmaWxlbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBHTU9OX1RBR19DR19BUkM6Ci0JICAgICAgKytuYXJjczsKLQkgICAgICBnbW9uX2lucHV0IHw9IElOUFVUX0NBTExfR1JBUEg7Ci0JICAgICAgY2dfcmVhZF9yZWMgKGlmcCwgZmlsZW5hbWUpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgR01PTl9UQUdfQkJfQ09VTlQ6Ci0JICAgICAgKytuYmJzOwotCSAgICAgIGdtb25faW5wdXQgfD0gSU5QVVRfQkJfQ09VTlRTOwotCSAgICAgIGJiX3JlYWRfcmVjIChpZnAsIGZpbGVuYW1lKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgIF8oIiVzOiAlczogZm91bmQgYmFkIHRhZyAlZCAoZmlsZSBjb3JydXB0ZWQ/KVxuIiksCi0JCSAgICAgICB3aG9hbWksIGZpbGVuYW1lLCB0YWcpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfQVVUTwotCSAgIHx8IGZpbGVfZm9ybWF0ID09IEZGX0JTRAotCSAgIHx8IGZpbGVfZm9ybWF0ID09IEZGX0JTRDQ0KQotICAgIHsKLSAgICAgIHN0cnVjdCBoZHIKLSAgICAgIHsKLQliZmRfdm1hIGxvd19wYzsKLQliZmRfdm1hIGhpZ2hfcGM7Ci0JaW50IG5jbnQ7Ci0gICAgICB9OwotICAgICAgaW50IGksIHNhbXBfYnl0ZXMsIGhlYWRlcl9zaXplOwotICAgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKLSAgICAgIGJmZF92bWEgZnJvbV9wYywgc2VsZl9wYzsKLSAgICAgIHN0cnVjdCByYXdfYXJjIHJhd19hcmM7Ci0gICAgICBzdHJ1Y3QgcmF3X3BoZHIgcmF3OwotICAgICAgc3RhdGljIHN0cnVjdCBoZHIgaDsKLSAgICAgIFVOSVQgcmF3X2Jpbl9jb3VudDsKLSAgICAgIHN0cnVjdCBoZHIgdG1wOwotCi0gICAgICAvKgotICAgICAgICogSW5mb3JtYXRpb24gZnJvbSBhIGdtb24ub3V0IGZpbGUgaXMgaW4gdHdvIHBhcnRzOiBhbiBhcnJheSBvZgotICAgICAgICogc2FtcGxpbmcgaGl0cyB3aXRoaW4gcGMgcmFuZ2VzLCBhbmQgdGhlIGFyY3MuCi0gICAgICAgKi8KLSAgICAgIGdtb25faW5wdXQgPSBJTlBVVF9ISVNUT0dSQU0gfCBJTlBVVF9DQUxMX0dSQVBIOwotCi0gICAgICAvKgotICAgICAgICogVGhpcyBmc2VlaygpIG91Z2h0IHRvIHdvcmsgZXZlbiBvbiBzdGRpbiBhcyBsb25nIGFzIGl0J3MKLSAgICAgICAqIG5vdCBhbiBpbnRlcmFjdGl2ZSBkZXZpY2UgKGhlY2ssIGlzIHRoZXJlIGFueWJvZHkgd2hvIHdvdWxkCi0gICAgICAgKiB3YW50IHRvIHR5cGUgaW4gYSBnbW9uLm91dCBhdCB0aGUgdGVybWluYWw/KS4KLSAgICAgICAqLwotICAgICAgaWYgKGZzZWVrIChpZnAsIDAsIFNFRUtfU0VUKSA8IDApCi0JewotCSAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0gICAgICBpZiAoZnJlYWQgKCZyYXcsIDEsIHNpemVvZiAoc3RydWN0IHJhd19waGRyKSwgaWZwKQotCSAgIT0gc2l6ZW9mIChzdHJ1Y3QgcmF3X3BoZHIpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGZpbGUgdG9vIHNob3J0IHRvIGJlIGEgZ21vbiBmaWxlXG4iKSwKLQkJICAgZmlsZW5hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotICAgICAgdG1wLmxvd19wYyA9IGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJnJhdy5sb3dfcGNbMF0pOwotICAgICAgdG1wLmhpZ2hfcGMgPSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopICZyYXcuaGlnaF9wY1swXSk7Ci0gICAgICB0bXAubmNudCA9IGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJnJhdy5uY250WzBdKTsKLQotICAgICAgaWYgKGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJnJhdy52ZXJzaW9uWzBdKQotCSAgPT0gR01PTlZFUlNJT04pCi0JewotCSAgaW50IHByb2ZyYXRlOwotCi0JICAvKiA0LjRCU0QgZm9ybWF0IGhlYWRlci4gICovCi0KLQkgIHByb2ZyYXRlID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmcmF3LnByb2ZyYXRlWzBdKTsKLQkgIGlmICghc19oaWdocGMpCi0JICAgIGh6ID0gcHJvZnJhdGU7Ci0JICBlbHNlIGlmIChoeiAhPSBwcm9mcmF0ZSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgIF8oIiVzOiBwcm9maWxpbmcgcmF0ZSBpbmNvbXBhdGlibGUgd2l0aCBmaXJzdCBnbW9uIGZpbGVcbiIpLAotCQkgICAgICAgZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0KLQkgIGhlYWRlcl9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmF3X3BoZHIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBvbGQgc3R5bGUgQlNEIGZvcm1hdC4gICovCi0JICBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfQlNENDQpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBmaWxlIGAlcycgaGFzIGJhZCBtYWdpYyBjb29raWVcbiIpLAotCQkgICAgICAgd2hvYW1pLCBmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQotCSAgaWYgKGZzZWVrIChpZnAsIHNpemVvZiAoc3RydWN0IG9sZF9yYXdfcGhkciksIFNFRUtfU0VUKSA8IDApCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCi0JICBoZWFkZXJfc2l6ZSA9IHNpemVvZiAoc3RydWN0IG9sZF9yYXdfcGhkcik7Ci0JfQotCi0gICAgICBpZiAoc19oaWdocGMgJiYgKHRtcC5sb3dfcGMgIT0gaC5sb3dfcGMgfHwKLQkJICAgICAgIHRtcC5oaWdoX3BjICE9IGguaGlnaF9wYyB8fCB0bXAubmNudCAhPSBoLm5jbnQpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIiksCi0JCSAgIGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLSAgICAgIGggPSB0bXA7Ci0gICAgICBzX2xvd3BjID0gKGJmZF92bWEpIGgubG93X3BjOwotICAgICAgc19oaWdocGMgPSAoYmZkX3ZtYSkgaC5oaWdoX3BjOwotICAgICAgbG93cGMgPSAoYmZkX3ZtYSkgaC5sb3dfcGMgLyBzaXplb2YgKFVOSVQpOwotICAgICAgaGlnaHBjID0gKGJmZF92bWEpIGguaGlnaF9wYyAvIHNpemVvZiAoVU5JVCk7Ci0gICAgICBzYW1wX2J5dGVzID0gaC5uY250IC0gaGVhZGVyX3NpemU7Ci0gICAgICBoaXN0X251bV9iaW5zID0gc2FtcF9ieXRlcyAvIHNpemVvZiAoVU5JVCk7Ci0gICAgICBEQkcgKFNBTVBMRURFQlVHLAotCSAgIHByaW50ZiAoIltnbW9uX291dF9yZWFkXSBsb3dwYyAweCVseCBoaWdocGMgMHglbHggbmNudCAlZFxuIiwKLQkJICAgaC5sb3dfcGMsIGguaGlnaF9wYywgaC5uY250KTsKLQkgICBwcmludGYgKCJbZ21vbl9vdXRfcmVhZF0gICBzX2xvd3BjIDB4JWx4ICAgc19oaWdocGMgMHglbHhcbiIsCi0JCSAgIHNfbG93cGMsIHNfaGlnaHBjKTsKLQkgICBwcmludGYgKCJbZ21vbl9vdXRfcmVhZF0gICAgIGxvd3BjIDB4JWx4ICAgICBoaWdocGMgMHglbHhcbiIsCi0JCSAgIGxvd3BjLCBoaWdocGMpOwotCSAgIHByaW50ZiAoIltnbW9uX291dF9yZWFkXSBzYW1wX2J5dGVzICVkIGhpc3RfbnVtX2JpbnMgJWRcbiIsCi0JCSAgIHNhbXBfYnl0ZXMsIGhpc3RfbnVtX2JpbnMpKTsKLQotICAgICAgaWYgKGhpc3RfbnVtX2JpbnMpCi0JewotCSAgKytuaGlzdDsKLQl9Ci0KLSAgICAgIGlmICghaGlzdF9zYW1wbGUpCi0JewotCSAgaGlzdF9zYW1wbGUgPQotCSAgICAoaW50ICopIHhtYWxsb2MgKGhpc3RfbnVtX2JpbnMgKiBzaXplb2YgKGhpc3Rfc2FtcGxlWzBdKSk7Ci0JICBtZW1zZXQgKGhpc3Rfc2FtcGxlLCAwLCBoaXN0X251bV9iaW5zICogc2l6ZW9mIChoaXN0X3NhbXBsZVswXSkpOwotCX0KLQotICAgICAgZm9yIChpID0gMDsgaSA8IGhpc3RfbnVtX2JpbnM7ICsraSkKLQl7Ci0JICBpZiAoZnJlYWQgKHJhd19iaW5fY291bnQsIHNpemVvZiAocmF3X2Jpbl9jb3VudCksIDEsIGlmcCkgIT0gMSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgIF8oIiVzOiB1bmV4cGVjdGVkIEVPRiBhZnRlciByZWFkaW5nICVkLyVkIGJpbnNcbiIpLAotCQkgICAgICAgd2hvYW1pLCAtLWksIGhpc3RfbnVtX2JpbnMpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JICBoaXN0X3NhbXBsZVtpXSArPSBiZmRfZ2V0XzE2IChjb3JlX2JmZCwgKGJmZF9ieXRlICopIHJhd19iaW5fY291bnQpOwotCX0KLQotICAgICAgLyoKLSAgICAgICAqIFRoZSByZXN0IG9mIHRoZSBmaWxlIGNvbnNpc3RzIG9mIGEgYnVuY2ggb2YgPGZyb20sc2VsZixjb3VudD4KLSAgICAgICAqIHR1cGxlczoKLSAgICAgICAqLwotICAgICAgd2hpbGUgKGZyZWFkICgmcmF3X2FyYywgc2l6ZW9mIChyYXdfYXJjKSwgMSwgaWZwKSA9PSAxKQotCXsKLQkgICsrbmFyY3M7Ci0JICBmcm9tX3BjID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSByYXdfYXJjLmZyb21fcGMpOwotCSAgc2VsZl9wYyA9IGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgcmF3X2FyYy5zZWxmX3BjKTsKLQkgIGNvdW50ID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSByYXdfYXJjLmNvdW50KTsKLQkgIERCRyAoU0FNUExFREVCVUcsCi0JICAgICBwcmludGYgKCJbZ21vbl9vdXRfcmVhZF0gZnJvbXBjIDB4JWx4IHNlbGZwYyAweCVseCBjb3VudCAlbHVcbiIsCi0JCSAgICAgZnJvbV9wYywgc2VsZl9wYywgY291bnQpKTsKLQkgIC8qIGFkZCB0aGlzIGFyYzogKi8KLQkgIGNnX3RhbGx5IChmcm9tX3BjLCBzZWxmX3BjLCBjb3VudCk7Ci0JfQotICAgICAgZmNsb3NlIChpZnApOwotCi0gICAgICBpZiAoaHogPT0gSFpfV1JPTkcpCi0JewotCSAgLyoKLQkgICAqIEhvdyBtYW55IHRpY2tzIHBlciBzZWNvbmQ/ICBJZiB3ZSBjYW4ndCB0ZWxsLCByZXBvcnQKLQkgICAqIHRpbWUgaW4gdGlja3MuCi0JICAgKi8KLQkgIGh6ID0gaGVydHogKCk7Ci0JICBpZiAoaHogPT0gSFpfV1JPTkcpCi0JICAgIHsKLQkgICAgICBoeiA9IDE7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJ0aW1lIGlzIGluIHRpY2tzLCBub3Qgc2Vjb25kc1xuIikpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGRvbid0IGtub3cgaG93IHRvIGRlYWwgd2l0aCBmaWxlIGZvcm1hdCAlZFxuIiksCi0JICAgICAgIHdob2FtaSwgZmlsZV9mb3JtYXQpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9HTU9OX0lORk8pCi0gICAgewotICAgICAgcHJpbnRmIChfKCJGaWxlIGAlcycgKHZlcnNpb24gJWQpIGNvbnRhaW5zOlxuIiksCi0JICAgICAgZmlsZW5hbWUsIGdtb25fZmlsZV92ZXJzaW9uKTsKLSAgICAgIHByaW50ZiAoXygiXHQlZCBoaXN0b2dyYW0gcmVjb3JkJXNcbiIpLAotCSAgICAgIG5oaXN0LCBuaGlzdCA9PSAxID8gIiIgOiAicyIpOwotICAgICAgcHJpbnRmIChfKCJcdCVkIGNhbGwtZ3JhcGggcmVjb3JkJXNcbiIpLAotCSAgICAgIG5hcmNzLCBuYXJjcyA9PSAxID8gIiIgOiAicyIpOwotICAgICAgcHJpbnRmIChfKCJcdCVkIGJhc2ljLWJsb2NrIGNvdW50IHJlY29yZCVzXG4iKSwKLQkgICAgICBuYmJzLCBuYmJzID09IDEgPyAiIiA6ICJzIik7Ci0gICAgICBmaXJzdF9vdXRwdXQgPSBGQUxTRTsKLSAgICB9Ci19Ci0KLQotdm9pZAotREVGVU4gKGdtb25fb3V0X3dyaXRlLCAoZmlsZW5hbWUpLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgRklMRSAqb2ZwOwotICBzdHJ1Y3QgZ21vbl9oZHIgZ2hkcjsKLQotICBvZnAgPSBmb3BlbiAoZmlsZW5hbWUsIEZPUEVOX1dCKTsKLSAgaWYgKCFvZnApCi0gICAgewotICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgaWYgKGZpbGVfZm9ybWF0ID09IEZGX0FVVE8gfHwgZmlsZV9mb3JtYXQgPT0gRkZfTUFHSUMpCi0gICAgewotICAgICAgLyogd3JpdGUgZ21vbiBoZWFkZXI6ICovCi0KLSAgICAgIG1lbWNweSAoJmdoZHIuY29va2llWzBdLCBHTU9OX01BR0lDLCA0KTsKLSAgICAgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBHTU9OX1ZFUlNJT04sIChiZmRfYnl0ZSAqKSBnaGRyLnZlcnNpb24pOwotICAgICAgaWYgKGZ3cml0ZSAoJmdoZHIsIHNpemVvZiAoZ2hkciksIDEsIG9mcCkgIT0gMSkKLQl7Ci0JICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLQotICAgICAgLyogd3JpdGUgZXhlY3V0aW9uIHRpbWUgaGlzdG9ncmFtIGlmIHdlIGhhdmUgb25lOiAqLwotICAgICAgaWYgKGdtb25faW5wdXQgJiBJTlBVVF9ISVNUT0dSQU0pCi0JewotCSAgaGlzdF93cml0ZV9oaXN0IChvZnAsIGZpbGVuYW1lKTsKLQl9Ci0KLSAgICAgIC8qIHdyaXRlIGNhbGwgZ3JhcGggYXJjcyBpZiB3ZSBoYXZlIGFueTogKi8KLSAgICAgIGlmIChnbW9uX2lucHV0ICYgSU5QVVRfQ0FMTF9HUkFQSCkKLQl7Ci0JICBjZ193cml0ZV9hcmNzIChvZnAsIGZpbGVuYW1lKTsKLQl9Ci0KLSAgICAgIC8qIHdyaXRlIGJhc2ljLWJsb2NrIGluZm8gaWYgd2UgaGF2ZSBpdDogKi8KLSAgICAgIGlmIChnbW9uX2lucHV0ICYgSU5QVVRfQkJfQ09VTlRTKQotCXsKLQkgIGJiX3dyaXRlX2Jsb2NrcyAob2ZwLCBmaWxlbmFtZSk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfQlNEIHx8IGZpbGVfZm9ybWF0ID09IEZGX0JTRDQ0KQotICAgIHsKLSAgICAgIHN0cnVjdCByYXdfYXJjIHJhd19hcmM7Ci0gICAgICBVTklUIHJhd19iaW5fY291bnQ7Ci0gICAgICBzdHJ1Y3QgcmF3X3BoZHIgaDsKLSAgICAgIGludCBpOwotICAgICAgQXJjICphcmM7Ci0gICAgICBTeW0gKnN5bTsKLQotICAgICAgbWVtc2V0ICgmaCwgMCwgc2l6ZW9mIGgpOwotICAgICAgcHV0X3ZtYSAoY29yZV9iZmQsIHNfbG93cGMsIChiZmRfYnl0ZSAqKSAmaC5sb3dfcGMpOwotICAgICAgcHV0X3ZtYSAoY29yZV9iZmQsIHNfaGlnaHBjLCAoYmZkX2J5dGUgKikgJmguaGlnaF9wYyk7Ci0gICAgICBiZmRfcHV0XzMyIChjb3JlX2JmZCwKLQkJICBoaXN0X251bV9iaW5zICogc2l6ZW9mIChVTklUKSArIHNpemVvZiAoc3RydWN0IHJhd19waGRyKSwKLQkJICAoYmZkX2J5dGUgKikgJmgubmNudCk7Ci0KLSAgICAgIC8qIFdyaXRlIGhlYWRlci4gIFVzZSBuZXcgc3R5bGUgQlNEIGZvcm1hdCBpcyBleHBsaWNpdGx5Ci0gICAgICAgICBzcGVjaWZpZWQsIG9yIGlmIHRoZSBwcm9maWxpbmcgcmF0ZSBpcyBub24tc3RhbmRhcmQ7Ci0gICAgICAgICBvdGhlcndpc2UsIHVzZSB0aGUgb2xkIEJTRCBmb3JtYXQuICAqLwotICAgICAgaWYgKGZpbGVfZm9ybWF0ID09IEZGX0JTRDQ0Ci0JICB8fCBoeiAhPSBoZXJ0eiAoKSkKLQl7Ci0JICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgR01PTlZFUlNJT04sIChiZmRfYnl0ZSAqKSAmaC52ZXJzaW9uKTsKLQkgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBoeiwgKGJmZF9ieXRlICopICZoLnByb2ZyYXRlKTsKLQkgIGlmIChmd3JpdGUgKCZoLCBzaXplb2YgKHN0cnVjdCByYXdfcGhkciksIDEsIG9mcCkgIT0gMSkKLQkgICAgewotCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChmd3JpdGUgKCZoLCBzaXplb2YgKHN0cnVjdCBvbGRfcmF3X3BoZHIpLCAxLCBvZnApICE9IDEpCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogZHVtcCB0aGUgc2FtcGxlczogKi8KLQotICAgICAgZm9yIChpID0gMDsgaSA8IGhpc3RfbnVtX2JpbnM7ICsraSkKLQl7Ci0JICBiZmRfcHV0XzE2IChjb3JlX2JmZCwgaGlzdF9zYW1wbGVbaV0sIChiZmRfYnl0ZSAqKSAmIHJhd19iaW5fY291bnRbMF0pOwotCSAgaWYgKGZ3cml0ZSAoJnJhd19iaW5fY291bnRbMF0sIHNpemVvZiAocmF3X2Jpbl9jb3VudCksIDEsIG9mcCkgIT0gMSkKLQkgICAgewotCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBkdW1wIHRoZSBub3JtYWxpemVkIHJhdyBhcmMgaW5mb3JtYXRpb246ICovCi0KLSAgICAgIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0JewotCSAgZm9yIChhcmMgPSBzeW0tPmNnLmNoaWxkcmVuOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9jaGlsZCkKLQkgICAgewotCSAgICAgIHB1dF92bWEgKGNvcmVfYmZkLCBhcmMtPnBhcmVudC0+YWRkciwKLQkJICAgICAgIChiZmRfYnl0ZSAqKSByYXdfYXJjLmZyb21fcGMpOwotCSAgICAgIHB1dF92bWEgKGNvcmVfYmZkLCBhcmMtPmNoaWxkLT5hZGRyLAotCQkgICAgICAgKGJmZF9ieXRlICopIHJhd19hcmMuc2VsZl9wYyk7Ci0JICAgICAgYmZkX3B1dF8zMiAoY29yZV9iZmQsIGFyYy0+Y291bnQsIChiZmRfYnl0ZSAqKSByYXdfYXJjLmNvdW50KTsKLQkgICAgICBpZiAoZndyaXRlICgmcmF3X2FyYywgc2l6ZW9mIChyYXdfYXJjKSwgMSwgb2ZwKSAhPSAxKQotCQl7Ci0JCSAgcGVycm9yIChmaWxlbmFtZSk7Ci0JCSAgZG9uZSAoMSk7Ci0JCX0KLQkgICAgICBEQkcgKFNBTVBMRURFQlVHLAotCQkgICBwcmludGYgKCJbZHVtcHN1bV0gZnJvbXBjIDB4JWx4IHNlbGZwYyAweCVseCBjb3VudCAlbHVcbiIsCi0JCQkgICBhcmMtPnBhcmVudC0+YWRkciwgYXJjLT5jaGlsZC0+YWRkciwgYXJjLT5jb3VudCkpOwotCSAgICB9Ci0JfQotICAgICAgZmNsb3NlIChvZnApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGRvbid0IGtub3cgaG93IHRvIGRlYWwgd2l0aCBmaWxlIGZvcm1hdCAlZFxuIiksCi0JICAgICAgIHdob2FtaSwgZmlsZV9mb3JtYXQpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ21vbl9pby5oIGIvZ3Byb2YvZ21vbl9pby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjI1N2E0Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2dtb25faW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNpZm5kZWYgZ21vbl9pb19oCi0jZGVmaW5lIGdtb25faW9faAotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiZ21vbi5oIgotCi0jZGVmaW5lIElOUFVUX0hJU1RPR1JBTQkJKDE8PDApCi0jZGVmaW5lIElOUFVUX0NBTExfR1JBUEgJKDE8PDEpCi0jZGVmaW5lIElOUFVUX0JCX0NPVU5UUwkJKDE8PDIpCi0KLWV4dGVybiBpbnQgZ21vbl9pbnB1dDsJCS8qIHdoYXQgaW5wdXQgZGlkIHdlIHNlZT8gKi8KLWV4dGVybiBpbnQgZ21vbl9maWxlX3ZlcnNpb247CS8qIGZpbGUgdmVyc2lvbiBhcmUgd2UgZGVhbGluZyB3aXRoICovCi0KLWV4dGVybiBiZmRfdm1hIGdldF92bWEgUEFSQU1TICgoYmZkICogYWJmZCwgYmZkX2J5dGUgKiBhZGRyKSk7Ci1leHRlcm4gdm9pZCBwdXRfdm1hIFBBUkFNUyAoKGJmZCAqIGFiZmQsIGJmZF92bWEgdmFsLCBiZmRfYnl0ZSAqIGFkZHIpKTsKLQotZXh0ZXJuIHZvaWQgZ21vbl9vdXRfcmVhZCBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotZXh0ZXJuIHZvaWQgZ21vbl9vdXRfd3JpdGUgUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLQotI2VuZGlmIC8qIGdtb25faW9faCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ21vbl9vdXQuaCBiL2dwcm9mL2dtb25fb3V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDRmYjUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ21vbl9vdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgc3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgZ21vbi5vdXQgZmlsZXMuICBJdCBzaG91bGQgaGF2ZQotICogYXMgZmV3IGV4dGVybmFsIGRlcGVuZGVuY2llcyBhcyBwb3NzaWJsZSBhcyBpdCBpcyBnb2luZyB0byBiZQotICogaW5jbHVkZWQgaW4gbWFueSBkaWZmZXJlbnQgcHJvZ3JhbXMuICBUaGF0IGlzLCBtaW5pbWl6ZSB0aGUKLSAqIG51bWJlciBvZiAjaW5jbHVkZSdzLgotICoKLSAqIEEgZ21vbi5vdXQgZmlsZSBjb25zaXN0cyBvZiBhIGhlYWRlciAoZGVmaW5lZCBieSBnbW9uX2hkcikgZm9sbG93ZWQKLSAqIGJ5IGEgc2VxdWVuY2Ugb2YgcmVjb3Jkcy4gIEVhY2ggcmVjb3JkIHN0YXJ0cyB3aXRoIGEgb25lLWJ5dGUgdGFnCi0gKiBpZGVudGlmeWluZyB0aGUgdHlwZSBvZiByZWNvcmRzLCBmb2xsb3dlZCBieSByZWNvcmRzIHNwZWNpZmljIGRhdGEuCi0gKi8KLSNpZm5kZWYgZ21vbl9vdXRfaAotI2RlZmluZSBnbW9uX291dF9oCi0KLSNkZWZpbmUJR01PTl9NQUdJQwkiZ21vbiIJLyogbWFnaWMgY29va2llICovCi0jZGVmaW5lIEdNT05fVkVSU0lPTgkxCS8qIHZlcnNpb24gbnVtYmVyICovCi0KLS8qCi0gKiBSYXcgaGVhZGVyIGFzIGl0IGFwcGVhcnMgb24gZmlsZSAod2l0aG91dCBwYWRkaW5nKToKLSAqLwotc3RydWN0IGdtb25faGRyCi0gIHsKLSAgICBjaGFyIGNvb2tpZVs0XTsKLSAgICBjaGFyIHZlcnNpb25bNF07Ci0gICAgY2hhciBzcGFyZVszICogNF07Ci0gIH07Ci0KLS8qIHR5cGVzIG9mIHJlY29yZHMgaW4gdGhpcyBmaWxlOiAqLwotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBHTU9OX1RBR19USU1FX0hJU1QgPSAwLCBHTU9OX1RBR19DR19BUkMgPSAxLCBHTU9OX1RBR19CQl9DT1VOVCA9IDIKLSAgfQotR01PTl9SZWNvcmRfVGFnOwotCi1zdHJ1Y3QgZ21vbl9oaXN0X2hkcgotICB7Ci0gICAgY2hhciBsb3dfcGNbc2l6ZW9mIChjaGFyKildOwkvKiBiYXNlIHBjIGFkZHJlc3Mgb2Ygc2FtcGxlIGJ1ZmZlciAqLwotICAgIGNoYXIgaGlnaF9wY1tzaXplb2YgKGNoYXIqKV07CS8qIG1heCBwYyBhZGRyZXNzIG9mIHNhbXBsZWQgYnVmZmVyICovCi0gICAgY2hhciBoaXN0X3NpemVbNF07CQkJLyogc2l6ZSBvZiBzYW1wbGUgYnVmZmVyICovCi0gICAgY2hhciBwcm9mX3JhdGVbNF07CQkJLyogcHJvZmlsaW5nIGNsb2NrIHJhdGUgKi8KLSAgICBjaGFyIGRpbWVuWzE1XTsJCQkvKiBwaHlzLiBkaW0uLCB1c3VhbGx5ICJzZWNvbmRzIiAqLwotICAgIGNoYXIgZGltZW5fYWJicmV2OwkJCS8qIHVzdWFsbHkgJ3MnIGZvciAic2Vjb25kcyIgKi8KLSAgfTsKLQotc3RydWN0IGdtb25fY2dfYXJjX3JlY29yZAotICB7Ci0gICAgY2hhciBmcm9tX3BjW3NpemVvZiAoY2hhciopXTsJLyogYWRkcmVzcyB3aXRoaW4gY2FsbGVyJ3MgYm9keSAqLwotICAgIGNoYXIgc2VsZl9wY1tzaXplb2YgKGNoYXIqKV07CS8qIGFkZHJlc3Mgd2l0aGluIGNhbGxlZSdzIGJvZHkgKi8KLSAgICBjaGFyIGNvdW50WzRdOwkJCS8qIG51bWJlciBvZiBhcmMgdHJhdmVyc2FscyAqLwotICB9OwotCi0jZW5kaWYgLyogZ21vbl9vdXRfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ3Byb2YuMSBiL2dwcm9mL2dwcm9mLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNzM0ZGEuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ3Byb2YuMQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkwIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0uXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIgotLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotLlwiIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLS5cIiBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkgdGhlIGZvbGxvd2luZwotLlwiIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLS5cIiBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycgaW4gdGhlCi0uXCIgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uIGFuZCBpbgotLlwiIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLS5cIiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKLS5cIiBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0uXCIgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLS5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0uXCIKLS5cIiAgICAgQCgjKWdwcm9mLjEJNi42IChCZXJrZWxleSkgNy8yNC85MAotLlwiCi0uVEggR1BST0YgMSAiSmFudWFyeSAyOSwgMTk5MyIKLS5TSCBOQU1FCi1ncHJvZiBcLSBkaXNwbGF5IGNhbGwgZ3JhcGggcHJvZmlsZSBkYXRhCi0uU0ggU1lOT1BTSVMKLS5CIGdwcm9mIFsgXC1hYmNzeiBdIFsgXC1lfFwtRQotLkkgbmFtZQotLkIgXSBbIFwtZnxcLUYgCi0uSSBuYW1lCi0uQiBdIAotLkIgWyBcLWsKLS5JIGZyb21uYW1lIHRvbmFtZQotLkIgXSBbIAotLkkgb2JqZmlsZQotLkIgWyAKLS5JIGdtb24ub3V0Ci0uQiBdIAotLkIgXSAKLS5TSCBERVNDUklQVElPTgotLkIgZ3Byb2YKLXByb2R1Y2VzIGFuIGV4ZWN1dGlvbiBwcm9maWxlIG9mIEMsIFBhc2NhbCwgb3IgRm9ydHJhbjc3IHByb2dyYW1zLgotVGhlIGVmZmVjdCBvZiBjYWxsZWQgcm91dGluZXMgaXMgaW5jb3Jwb3JhdGVkIGluIHRoZSBwcm9maWxlIG9mIGVhY2ggY2FsbGVyLgotVGhlIHByb2ZpbGUgZGF0YSBpcyB0YWtlbiBmcm9tIHRoZSBjYWxsIGdyYXBoIHByb2ZpbGUgZmlsZQotXCYoYGdtb24ub3V0JyBkZWZhdWx0KSB3aGljaCBpcyBjcmVhdGVkIGJ5IHByb2dyYW1zCi10aGF0IGFyZSBjb21waWxlZCB3aXRoIHRoZQotLkIgXC1wZwotb3B0aW9uIG9mCi0uQlIgY2MgKCAxICkgLAotLkJSIHBjICggMSApICwKLWFuZAotLkJSIGY3NyAoIDEgKSAuCi1UaGUKLS5CIFwtcGcKLW9wdGlvbiBhbHNvIGxpbmtzIGluIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IHJvdXRpbmVzCi10aGF0IGFyZSBjb21waWxlZCBmb3IgcHJvZmlsaW5nLgotLkIgR3Byb2YKLXJlYWRzIHRoZSBnaXZlbiBvYmplY3QgZmlsZSAodGhlIGRlZmF1bHQgaXMgYGEub3V0JykKLWFuZCBlc3RhYmxpc2hlcyB0aGUgcmVsYXRpb24gYmV0d2VlbiBpdHMgc3ltYm9sIHRhYmxlCi1hbmQgdGhlIGNhbGwgZ3JhcGggcHJvZmlsZSBmcm9tIGBnbW9uLm91dCcuCi1JZiBtb3JlIHRoYW4gb25lIHByb2ZpbGUgZmlsZSBpcyBzcGVjaWZpZWQsCi10aGUKLS5CIGdwcm9mCi1vdXRwdXQgc2hvd3MgdGhlIHN1bSBvZiB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiBpbiB0aGUgZ2l2ZW4gcHJvZmlsZSBmaWxlcy4KLS5QUAotLkIgR3Byb2YKLWNhbGN1bGF0ZXMgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIGVhY2ggcm91dGluZS4KLU5leHQsIHRoZXNlIHRpbWVzIGFyZSBwcm9wYWdhdGVkIGFsb25nIHRoZSBlZGdlcyBvZiB0aGUgY2FsbCBncmFwaC4KLUN5Y2xlcyBhcmUgZGlzY292ZXJlZCwgYW5kIGNhbGxzIGludG8gYSBjeWNsZSBhcmUgbWFkZSB0byBzaGFyZSB0aGUgdGltZQotb2YgdGhlIGN5Y2xlLgotVGhlIGZpcnN0IGxpc3Rpbmcgc2hvd3MgdGhlIGZ1bmN0aW9ucwotc29ydGVkIGFjY29yZGluZyB0byB0aGUgdGltZSB0aGV5IHJlcHJlc2VudAotaW5jbHVkaW5nIHRoZSB0aW1lIG9mIHRoZWlyIGNhbGwgZ3JhcGggZGVzY2VuZGFudHMuCi1CZWxvdyBlYWNoIGZ1bmN0aW9uIGVudHJ5IGlzIHNob3duIGl0cyAoZGlyZWN0KSBjYWxsIGdyYXBoIGNoaWxkcmVuLAotYW5kIGhvdyB0aGVpciB0aW1lcyBhcmUgcHJvcGFnYXRlZCB0byB0aGlzIGZ1bmN0aW9uLgotQSBzaW1pbGFyIGRpc3BsYXkgYWJvdmUgdGhlIGZ1bmN0aW9uIHNob3dzIGhvdyB0aGlzIGZ1bmN0aW9uJ3MgdGltZSBhbmQgdGhlCi10aW1lIG9mIGl0cyBkZXNjZW5kYW50cyBpcyBwcm9wYWdhdGVkIHRvIGl0cyAoZGlyZWN0KSBjYWxsIGdyYXBoIHBhcmVudHMuCi0uUFAKLUN5Y2xlcyBhcmUgYWxzbyBzaG93biwgd2l0aCBhbiBlbnRyeSBmb3IgdGhlIGN5Y2xlIGFzIGEgd2hvbGUgYW5kCi1hIGxpc3Rpbmcgb2YgdGhlIG1lbWJlcnMgb2YgdGhlIGN5Y2xlIGFuZCB0aGVpciBjb250cmlidXRpb25zIHRvIHRoZQotdGltZSBhbmQgY2FsbCBjb3VudHMgb2YgdGhlIGN5Y2xlLgotLlBQCi1TZWNvbmQsIGEgZmxhdCBwcm9maWxlIGlzIGdpdmVuLAotc2ltaWxhciB0byB0aGF0IHByb3ZpZGVkIGJ5Ci0uQlIgcHJvZiAoIDEgKSAgLgotVGhpcyBsaXN0aW5nIGdpdmVzIHRoZSB0b3RhbCBleGVjdXRpb24gdGltZXMsIHRoZSBjYWxsIGNvdW50cywKLXRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0aGUgY2FsbCBzcGVudCBpbiB0aGUgcm91dGluZSBpdHNlbGYsIGFuZAotdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRoZSBjYWxsIHNwZW50IGluIHRoZSByb3V0aW5lIGl0c2VsZiBpbmNsdWRpbmcKLWl0cyBkZXNjZW5kYW50cy4KLS5QUAotRmluYWxseSwgYW4gaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIGlzIHByb3ZpZGVkLgotLlNIIE9QVElPTlMKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOgotLlRQCi0uQiBcLWEKLXN1cHByZXNzZXMgdGhlIHByaW50aW5nIG9mIHN0YXRpY2FsbHkgZGVjbGFyZWQgZnVuY3Rpb25zLgotSWYgdGhpcyBvcHRpb24gaXMgZ2l2ZW4sIGFsbCByZWxldmFudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGljIGZ1bmN0aW9uCi0oZS5nLiwgdGltZSBzYW1wbGVzLCBjYWxscyB0byBvdGhlciBmdW5jdGlvbnMsIGNhbGxzIGZyb20gb3RoZXIgZnVuY3Rpb25zKQotYmVsb25ncyB0byB0aGUgZnVuY3Rpb24gbG9hZGVkIGp1c3QgYmVmb3JlIHRoZSBzdGF0aWMgZnVuY3Rpb24gaW4gdGhlCi1cJmBvYmpmaWxlJyBmaWxlLgotLlRQCi0uQiBcLWIKLXN1cHByZXNzZXMgdGhlIHByaW50aW5nIG9mIGEgZGVzY3JpcHRpb24gb2YgZWFjaCBmaWVsZCBpbiB0aGUgcHJvZmlsZS4KLS5UUAotLkIgXC1jCi10aGUgc3RhdGljIGNhbGwgZ3JhcGggb2YgdGhlIHByb2dyYW0gaXMgZGlzY292ZXJlZCBieSBhIGhldXJpc3RpYwotdGhhdCBleGFtaW5lcyB0aGUgdGV4dCBzcGFjZSBvZiB0aGUgb2JqZWN0IGZpbGUuCi1TdGF0aWMtb25seSBwYXJlbnRzIG9yIGNoaWxkcmVuIGFyZSBzaG93bgotd2l0aCBjYWxsIGNvdW50cyBvZiAwLgotLlRQCi0uQkkgIlwtZSAiIG5hbWUKLXN1cHByZXNzZXMgdGhlIHByaW50aW5nIG9mIHRoZSBncmFwaCBwcm9maWxlIGVudHJ5IGZvciByb3V0aW5lCi0uSSBuYW1lCi1hbmQgYWxsIGl0cyBkZXNjZW5kYW50cwotKHVubGVzcyB0aGV5IGhhdmUgb3RoZXIgYW5jZXN0b3JzIHRoYXQgYXJlbid0IHN1cHByZXNzZWQpLgotTW9yZSB0aGFuIG9uZQotLkIgXC1lCi1vcHRpb24gbWF5IGJlIGdpdmVuLgotT25seSBvbmUKLS5JIG5hbWUKLW1heSBiZSBnaXZlbiB3aXRoIGVhY2gKLS5CIFwtZQotb3B0aW9uLgotLlRQCi0uQkkgIlwtRSAiIG5hbWUKLXN1cHByZXNzZXMgdGhlIHByaW50aW5nIG9mIHRoZSBncmFwaCBwcm9maWxlIGVudHJ5IGZvciByb3V0aW5lCi0uSSBuYW1lCi0oYW5kIGl0cyBkZXNjZW5kYW50cykgYXMKLS5CIFwtZSAgLAotYWJvdmUsIGFuZCBhbHNvIGV4Y2x1ZGVzIHRoZSB0aW1lIHNwZW50IGluCi0uSSBuYW1lCi0oYW5kIGl0cyBkZXNjZW5kYW50cykgZnJvbSB0aGUgdG90YWwgYW5kIHBlcmNlbnRhZ2UgdGltZSBjb21wdXRhdGlvbnMuCi0oRm9yIGV4YW1wbGUsCi0uQkkgIlwtRSAiIG1jb3VudAotLkJJICJcLUUgIiBtY2xlYW51cAotaXMgdGhlIGRlZmF1bHQuKQotLlRQCi0uQkkgIlwtZiAiIG5hbWUKLXByaW50cyB0aGUgZ3JhcGggcHJvZmlsZSBlbnRyeSBvZiBvbmx5IHRoZSBzcGVjaWZpZWQgcm91dGluZQotLkkgbmFtZQotYW5kIGl0cyBkZXNjZW5kYW50cy4KLU1vcmUgdGhhbiBvbmUKLS5CIFwtZgotb3B0aW9uIG1heSBiZSBnaXZlbi4KLU9ubHkgb25lCi0uSSBuYW1lCi1tYXkgYmUgZ2l2ZW4gd2l0aCBlYWNoCi0uQiBcLWYKLW9wdGlvbi4KLS5UUAotLkJJICJcLUYgIiBuYW1lCi1wcmludHMgdGhlIGdyYXBoIHByb2ZpbGUgZW50cnkgb2Ygb25seSB0aGUgcm91dGluZQotLkkgbmFtZQotYW5kIGl0cyBkZXNjZW5kYW50cyAoYXMKLS5CIFwtZiAsCi1hYm92ZSkgYW5kIGFsc28gdXNlcyBvbmx5IHRoZSB0aW1lcyBvZiB0aGUgcHJpbnRlZCByb3V0aW5lcwotaW4gdG90YWwgdGltZSBhbmQgcGVyY2VudGFnZSBjb21wdXRhdGlvbnMuCi1Nb3JlIHRoYW4gb25lCi0uQiBcLUYKLW9wdGlvbiBtYXkgYmUgZ2l2ZW4uCi1Pbmx5IG9uZQotLkkgbmFtZQotbWF5IGJlIGdpdmVuIHdpdGggZWFjaAotLkIgXC1GCi1vcHRpb24uCi1UaGUKLS5CIFwtRgotb3B0aW9uCi1vdmVycmlkZXMKLXRoZQotLkIgXC1FCi1vcHRpb24uCi0uVFAKLS5CSSAiXC1rICIgImZyb21uYW1lIHRvbmFtZSIKLXdpbGwgZGVsZXRlIGFueSBhcmNzIGZyb20gcm91dGluZQotLkkgZnJvbW5hbWUKLXRvIHJvdXRpbmUKLS5JUiB0b25hbWUgIC4KLVRoaXMgY2FuIGJlIHVzZWQgdG8gYnJlYWsgdW5kZXNpcmVkIGN5Y2xlcy4KLU1vcmUgdGhhbiBvbmUKLS5CIFwtawotb3B0aW9uIG1heSBiZSBnaXZlbi4KLU9ubHkgb25lIHBhaXIgb2Ygcm91dGluZSBuYW1lcyBtYXkgYmUgZ2l2ZW4gd2l0aCBlYWNoCi0uQiBcLWsKLW9wdGlvbi4KLS5UUAotLkIgXC1zCi1hIHByb2ZpbGUgZmlsZSBgZ21vbi5zdW0nIGlzIHByb2R1Y2VkIHRoYXQgcmVwcmVzZW50cwotdGhlIHN1bSBvZiB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiBpbiBhbGwgdGhlIHNwZWNpZmllZCBwcm9maWxlIGZpbGVzLgotVGhpcyBzdW1tYXJ5IHByb2ZpbGUgZmlsZSBtYXkgYmUgZ2l2ZW4gdG8gbGF0ZXIKLWV4ZWN1dGlvbnMgb2YgZ3Byb2YgKHByb2JhYmx5IGFsc28gd2l0aCBhCi0uQlIgXC1zICApCi10byBhY2N1bXVsYXRlIHByb2ZpbGUgZGF0YSBhY3Jvc3Mgc2V2ZXJhbCBydW5zIG9mIGFuIGBvYmpmaWxlJyBmaWxlLgotLlRQCi0uQiAtdgotcHJpbnRzIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgZ3Byb2YsIGFuZCB0aGVuIGV4aXRzLgotLlRQCi0uQiAtegotZGlzcGxheXMgcm91dGluZXMgdGhhdCBoYXZlIHplcm8gdXNhZ2UgKGFzIHNob3duIGJ5IGNhbGwgY291bnRzCi1hbmQgYWNjdW11bGF0ZWQgdGltZSkuCi1UaGlzIGlzIHVzZWZ1bCB3aXRoIHRoZQotLkIgXC1jCi1vcHRpb24gZm9yIGRpc2NvdmVyaW5nIHdoaWNoIHJvdXRpbmVzIHdlcmUgbmV2ZXIgY2FsbGVkLgotLlBQCi0uU0ggRklMRVMKLS50YSBcdydnbW9uLnN1bSAndQotYS5vdXQJdGhlIG5hbWVsaXN0IGFuZCB0ZXh0IHNwYWNlLgotLmJyCi1nbW9uLm91dAlkeW5hbWljIGNhbGwgZ3JhcGggYW5kIHByb2ZpbGUuCi0uYnIKLWdtb24uc3VtIHN1bW1hcml6ZWQgZHluYW1pYyBjYWxsIGdyYXBoIGFuZCBwcm9maWxlLgotLlNIIFNFRSBBTFNPCi0uQlIgbW9uaXRvciAoIDMgKSAsCi0uQlIgcHJvZmlsICggMiApICwKLS5CUiBjYyAoIDEgKSAsCi0uQlIgcHJvZiAoIDEgKQotLnNwCi1gYEFuIEV4ZWN1dGlvbiBQcm9maWxlciBmb3IgTW9kdWxhciBQcm9ncmFtcycnLAotYnkgUy4gR3JhaGFtLCBQLiBLZXNzbGVyLCBNLiBNY0t1c2ljazsKLS5JCi1Tb2Z0d2FyZSBcLSBQcmFjdGljZSBhbmQgRXhwZXJpZW5jZSwKLVZvbC4gMTMsIHBwLiA2NzEtNjg1LCAxOTgzLgotLnNwCi1gYGdwcm9mOiBBIENhbGwgR3JhcGggRXhlY3V0aW9uIFByb2ZpbGVyJycsCi1ieSBTLiBHcmFoYW0sIFAuIEtlc3NsZXIsIE0uIE1jS3VzaWNrOwotLkkKLVByb2NlZWRpbmdzIG9mIHRoZSBTSUdQTEFOICc4MiBTeW1wb3NpdW0gb24gQ29tcGlsZXIgQ29uc3RydWN0aW9uLAotU0lHUExBTiBOb3RpY2VzLCBWb2wuIDE3LCBObyAgNiwgcHAuIDEyMC0xMjYsIEp1bmUgMTk4Mi4KLS5TSCBISVNUT1JZCi0uQiBHcHJvZgotYXBwZWFyZWQgaW4gNC4yIEJTRC4KLS5TSCBCVUdTCi1UaGUgZ3JhbnVsYXJpdHkgb2YgdGhlIHNhbXBsaW5nIGlzIHNob3duLCBidXQgcmVtYWlucwotc3RhdGlzdGljYWwgYXQgYmVzdC4KLVdlIGFzc3VtZSB0aGF0IHRoZSB0aW1lIGZvciBlYWNoIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uCi1jYW4gYmUgZXhwcmVzc2VkIGJ5IHRoZSB0b3RhbCB0aW1lIGZvciB0aGUgZnVuY3Rpb24gZGl2aWRlZAotYnkgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgotVGh1cyB0aGUgdGltZSBwcm9wYWdhdGVkIGFsb25nIHRoZSBjYWxsIGdyYXBoIGFyY3MgdG8gdGhlIGZ1bmN0aW9uJ3MKLXBhcmVudHMgaXMgZGlyZWN0bHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdAotYXJjIGlzIHRyYXZlcnNlZC4KLS5QUAotUGFyZW50cyB0aGF0IGFyZSBub3QgdGhlbXNlbHZlcyBwcm9maWxlZCB3aWxsIGhhdmUgdGhlIHRpbWUgb2YKLXRoZWlyIHByb2ZpbGVkIGNoaWxkcmVuIHByb3BhZ2F0ZWQgdG8gdGhlbSwgYnV0IHRoZXkgd2lsbCBhcHBlYXIKLXRvIGJlIHNwb250YW5lb3VzbHkgaW52b2tlZCBpbiB0aGUgY2FsbCBncmFwaCBsaXN0aW5nLCBhbmQgd2lsbAotbm90IGhhdmUgdGhlaXIgdGltZSBwcm9wYWdhdGVkIGZ1cnRoZXIuCi1TaW1pbGFybHksIHNpZ25hbCBjYXRjaGVycywgZXZlbiB0aG91Z2ggcHJvZmlsZWQsIHdpbGwgYXBwZWFyCi10byBiZSBzcG9udGFuZW91cyAoYWx0aG91Z2ggZm9yIG1vcmUgb2JzY3VyZSByZWFzb25zKS4KLUFueSBwcm9maWxlZCBjaGlsZHJlbiBvZiBzaWduYWwgY2F0Y2hlcnMgc2hvdWxkIGhhdmUgdGhlaXIgdGltZXMKLXByb3BhZ2F0ZWQgcHJvcGVybHksIHVubGVzcyB0aGUgc2lnbmFsIGNhdGNoZXIgd2FzIGludm9rZWQgZHVyaW5nCi10aGUgZXhlY3V0aW9uIG9mIHRoZSBwcm9maWxpbmcgcm91dGluZSwgaW4gd2hpY2ggY2FzZSBhbGwgaXMgbG9zdC4KLS5QUAotVGhlIHByb2ZpbGVkIHByb2dyYW0gbXVzdCBjYWxsCi0uQlIgZXhpdCAoIDIgKQotb3IgcmV0dXJuIG5vcm1hbGx5IGZvciB0aGUgcHJvZmlsaW5nIGluZm9ybWF0aW9uIHRvIGJlIHNhdmVkCi1pbiB0aGUgYGdtb24ub3V0JyBmaWxlLgpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ3Byb2YuYyBiL2dwcm9mL2dwcm9mLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOTA0ODcuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ3Byb2YuYworKysgL2Rldi9udWxsCkBAIC0xLDY1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTk4IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAotICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKLSAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKLSAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiYmFzaWNfYmxvY2tzLmgiCi0jaW5jbHVkZSAiY2FsbF9ncmFwaC5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjZ19wcmludC5oIgotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0jaW5jbHVkZSAiZ21vbl9pby5oIgotI2luY2x1ZGUgImhlcnR6LmgiCi0jaW5jbHVkZSAiaGlzdC5oIgotI2luY2x1ZGUgInNvdXJjZS5oIgotI2luY2x1ZGUgInN5bV9pZHMuaCIKLQotY29uc3QgY2hhciAqd2hvYW1pOwotY29uc3QgY2hhciAqZnVuY3Rpb25fbWFwcGluZ19maWxlOwotY29uc3QgY2hhciAqYV9vdXRfbmFtZSA9IEFfT1VUTkFNRTsKLWxvbmcgaHogPSBIWl9XUk9ORzsKLQotLyoKLSAqIERlZmF1bHQgb3B0aW9ucyB2YWx1ZXM6Ci0gKi8KLWludCBkZWJ1Z19sZXZlbCA9IDA7Ci1pbnQgb3V0cHV0X3N0eWxlID0gMDsKLWludCBvdXRwdXRfd2lkdGggPSA4MDsKLWJvb2wgYnNkX3N0eWxlX291dHB1dCA9IEZBTFNFOwotYm9vbCBkZW1hbmdsZSA9IFRSVUU7Ci1ib29sIGRpc2NhcmRfdW5kZXJzY29yZXMgPSBUUlVFOwotYm9vbCBpZ25vcmVfZGlyZWN0X2NhbGxzID0gRkFMU0U7Ci1ib29sIGlnbm9yZV9zdGF0aWNfZnVuY3MgPSBGQUxTRTsKLWJvb2wgaWdub3JlX3plcm9zID0gVFJVRTsKLWJvb2wgbGluZV9ncmFudWxhcml0eSA9IEZBTFNFOwotYm9vbCBwcmludF9kZXNjcmlwdGlvbnMgPSBUUlVFOwotYm9vbCBwcmludF9wYXRoID0gRkFMU0U7Ci1ib29sIGlnbm9yZV9ub25fZnVuY3Rpb25zID0gRkFMU0U7Ci1GaWxlX0Zvcm1hdCBmaWxlX2Zvcm1hdCA9IEZGX0FVVE87Ci0KLWJvb2wgZmlyc3Rfb3V0cHV0ID0gVFJVRTsKLQotY2hhciBjb3B5cmlnaHRbXSA9Ci0gTl8oIkAoIykgQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS5cblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIik7Ci0KLXN0YXRpYyBjaGFyICpnbW9uX25hbWUgPSBHTU9OTkFNRTsJLyogcHJvZmlsZSBmaWxlbmFtZSAqLwotCi1iZmQgKmFiZmQ7Ci0KLS8qCi0gKiBGdW5jdGlvbnMgdGhhdCBnZXQgZXhjbHVkZWQgYnkgZGVmYXVsdDoKLSAqLwotc3RhdGljIGNoYXIgKmRlZmF1bHRfZXhjbHVkZWRfbGlzdFtdID0KLXsKLSAgIl9ncHJvZl9tY291bnQiLCAibWNvdW50IiwgIl9tY291bnQiLCAiX19tY291bnQiLCAiX19tY291bnRfaW50ZXJuYWwiLAotICAiX19tY2xlYW51cCIsCi0gICI8bG9jb3JlPiIsICI8aGljb3JlPiIsCi0gIDAKLX07Ci0KLS8qIENvZGVzIHVzZWQgZm9yIHRoZSBsb25nIG9wdGlvbnMgd2l0aCBubyBzaG9ydCBzeW5vbnltcy4gIDE1MCBpc24ndAotICAgc3BlY2lhbDsgaXQncyBqdXN0IGFuIGFyYml0cmFyeSBub24tQVNDSUkgY2hhciB2YWx1ZS4gICovCi0KLSNkZWZpbmUgT1BUSU9OX0RFTUFOR0xFCQkoMTUwKQotI2RlZmluZSBPUFRJT05fTk9fREVNQU5HTEUJKE9QVElPTl9ERU1BTkdMRSArIDEpCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgeyJsaW5lIiwgbm9fYXJndW1lbnQsIDAsICdsJ30sCi0gIHsibm8tc3RhdGljIiwgbm9fYXJndW1lbnQsIDAsICdhJ30sCi0gIHsiaWdub3JlLW5vbi1mdW5jdGlvbnMiLCBub19hcmd1bWVudCwgMCwgJ0QnfSwKLQotICAgIC8qIG91dHB1dCBzdHlsZXM6ICovCi0KLSAgeyJhbm5vdGF0ZWQtc291cmNlIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdBJ30sCi0gIHsibm8tYW5ub3RhdGVkLXNvdXJjZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnSid9LAotICB7ImZsYXQtcHJvZmlsZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAncCd9LAotICB7Im5vLWZsYXQtcHJvZmlsZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnUCd9LAotICB7ImdyYXBoIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdxJ30sCi0gIHsibm8tZ3JhcGgiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ1EnfSwKLSAgeyJleGVjLWNvdW50cyIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnQyd9LAotICB7Im5vLWV4ZWMtY291bnRzIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdaJ30sCi0gIHsiZnVuY3Rpb24tb3JkZXJpbmciLCBub19hcmd1bWVudCwgMCwgJ3InfSwKLSAgeyJmaWxlLW9yZGVyaW5nIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdSJ30sCi0gIHsiZmlsZS1pbmZvIiwgbm9fYXJndW1lbnQsIDAsICdpJ30sCi0gIHsic3VtIiwgbm9fYXJndW1lbnQsIDAsICdzJ30sCi0KLSAgICAvKiB2YXJpb3VzIG9wdGlvbnMgdG8gYWZmZWN0IG91dHB1dDogKi8KLQotICB7ImFsbC1saW5lcyIsIG5vX2FyZ3VtZW50LCAwLCAneCd9LAotICB7ImRlbWFuZ2xlIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9ERU1BTkdMRX0sCi0gIHsibm8tZGVtYW5nbGUiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX05PX0RFTUFOR0xFfSwKLSAgeyJkaXJlY3RvcnktcGF0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSSd9LAotICB7ImRpc3BsYXktdW51c2VkLWZ1bmN0aW9ucyIsIG5vX2FyZ3VtZW50LCAwLCAneid9LAotICB7Im1pbi1jb3VudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbSd9LAotICB7InByaW50LXBhdGgiLCBub19hcmd1bWVudCwgMCwgJ0wnfSwKLSAgeyJzZXBhcmF0ZS1maWxlcyIsIG5vX2FyZ3VtZW50LCAwLCAneSd9LAotICB7InN0YXRpYy1jYWxsLWdyYXBoIiwgbm9fYXJndW1lbnQsIDAsICdjJ30sCi0gIHsidGFibGUtbGVuZ3RoIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICd0J30sCi0gIHsidGltZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbid9LAotICB7Im5vLXRpbWUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ04nfSwKLSAgeyJ3aWR0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAndyd9LAotICAgIC8qCi0gICAgICogVGhlc2UgYXJlIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBvbmx5LiAgVGhlaXIgZnVuY3Rpb25hbGl0eQotICAgICAqIGlzIHByb3ZpZGVkIGJ5IHRoZSBvdXRwdXQgc3R5bGUgb3B0aW9ucyBhbHJlYWR5OgotICAgICAqLwotICB7IiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnZSd9LAotICB7IiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRSd9LAotICB7IiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnZid9LAotICB7IiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRid9LAotICB7IiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnayd9LAotCi0gICAgLyogbWlzY2VsbGFuZW91czogKi8KLQotICB7ImJyaWVmIiwgbm9fYXJndW1lbnQsIDAsICdiJ30sCi0gIHsiZGVidWciLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ2QnfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJ30sCi0gIHsiZmlsZS1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nfSwKLSAgeyJ0cmFkaXRpb25hbCIsIG5vX2FyZ3VtZW50LCAwLCAnVCd9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ3YnfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQotCi1zdGF0aWMgdm9pZAotREVGVU4gKHVzYWdlLCAoc3RyZWFtLCBzdGF0dXMpLCBGSUxFICogc3RyZWFtIEFORCBpbnQgc3RhdHVzKQotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLVVzYWdlOiAlcyBbLVthYmNEaGlsTHNUdnd4eXpdXSBbLVtBQ2VFZkZKbk5PcFBxUVpdW25hbWVdXSBbLUkgZGlyc11cblwKLQlbLWRbbnVtXV0gWy1rIGZyb20vdG9dIFstbSBtaW4tY291bnRdIFstdCB0YWJsZS1sZW5ndGhdXG5cCi0JWy0tW25vLV1hbm5vdGF0ZWQtc291cmNlWz1uYW1lXV0gWy0tW25vLV1leGVjLWNvdW50c1s9bmFtZV1dXG5cCi0JWy0tW25vLV1mbGF0LXByb2ZpbGVbPW5hbWVdXSBbLS1bbm8tXWdyYXBoWz1uYW1lXV1cblwKLQlbLS1bbm8tXXRpbWU9bmFtZV0gWy0tYWxsLWxpbmVzXSBbLS1icmllZl0gWy0tZGVidWdbPWxldmVsXV1cblwKLQlbLS1mdW5jdGlvbi1vcmRlcmluZ10gWy0tZmlsZS1vcmRlcmluZ11cblwKLQlbLS1kaXJlY3RvcnktcGF0aD1kaXJzXSBbLS1kaXNwbGF5LXVudXNlZC1mdW5jdGlvbnNdXG5cCi0JWy0tZmlsZS1mb3JtYXQ9bmFtZV0gWy0tZmlsZS1pbmZvXSBbLS1oZWxwXSBbLS1saW5lXSBbLS1taW4tY291bnQ9bl1cblwKLQlbLS1uby1zdGF0aWNdIFstLXByaW50LXBhdGhdIFstLXNlcGFyYXRlLWZpbGVzXVxuXAotCVstLXN0YXRpYy1jYWxsLWdyYXBoXSBbLS1zdW1dIFstLXRhYmxlLWxlbmd0aD1sZW5dIFstLXRyYWRpdGlvbmFsXVxuXAotCVstLXZlcnNpb25dIFstLXdpZHRoPW5dIFstLWlnbm9yZS1ub24tZnVuY3Rpb25zXVxuXAotCVstLWRlbWFuZ2xlXSBbLS1uby1kZW1hbmdsZV1cblwKLQlbaW1hZ2UtZmlsZV0gW3Byb2ZpbGUtZmlsZS4uLl1cbiIpLAotCSAgIHdob2FtaSk7Ci0gIGlmIChzdGF0dXMgPT0gMCkKLSAgICBmcHJpbnRmIChzdHJlYW0sIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotICBkb25lIChzdGF0dXMpOwotfQotCi0KLWludAotREVGVU4gKG1haW4sIChhcmdjLCBhcmd2KSwgaW50IGFyZ2MgQU5EIGNoYXIgKiphcmd2KQotewotICBjaGFyICoqc3AsICpzdHI7Ci0gIFN5bSAqKmNnID0gMDsKLSAgaW50IGNoLCB1c2VyX3NwZWNpZmllZCA9IDA7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICB3aG9hbWkgPSBhcmd2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHdob2FtaSk7Ci0KLSAgd2hpbGUgKChjaCA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LAotCSJhQTo6YkJjQ2REOjplOkU6ZjpGOmhpSTpKOjprOmxMbTpuOjpOOjpPOnA6OlA6OnE6OlE6OnN0OlR2dzp4eXpaOjoiLAotCQkJICAgIGxvbmdfb3B0aW9ucywgMCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGNoKQotCXsKLQljYXNlICdhJzoKLQkgIGlnbm9yZV9zdGF0aWNfZnVuY3MgPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAnQSc6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX0FOTk8pOwotCSAgICB9Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfQU5OT1RBVEVEX1NPVVJDRTsKLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0U7Ci0JICBicmVhazsKLQljYXNlICdiJzoKLQkgIHByaW50X2Rlc2NyaXB0aW9ucyA9IEZBTFNFOwotCSAgYnJlYWs7Ci0JY2FzZSAnQic6Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfQ0FMTF9HUkFQSDsKLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0NBTExfR1JBUEg7Ci0JICBicmVhazsKLQljYXNlICdjJzoKLQkgIGlnbm9yZV9kaXJlY3RfY2FsbHMgPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAnQyc6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX0VYRUMpOwotCSAgICB9Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfRVhFQ19DT1VOVFM7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9FWEVDX0NPVU5UUzsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIGRlYnVnX2xldmVsIHw9IGF0b2kgKG9wdGFyZyk7Ci0JICAgICAgZGVidWdfbGV2ZWwgfD0gQU5ZREVCVUc7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGRlYnVnX2xldmVsID0gfjA7Ci0JICAgIH0KLQkgIERCRyAoQU5ZREVCVUcsIHByaW50ZiAoIlttYWluXSBkZWJ1Zy1sZXZlbD0weCV4XG4iLCBkZWJ1Z19sZXZlbCkpOwotI2lmbmRlZiBERUJVRwotCSAgcHJpbnRmIChfKCIlczogZGVidWdnaW5nIG5vdCBzdXBwb3J0ZWQ7IC1kIGlnbm9yZWRcbiIpLCB3aG9hbWkpOwotI2VuZGlmCS8qIERFQlVHICovCi0JICBicmVhazsKLQljYXNlICdEJzoKLQkgIGlnbm9yZV9ub25fZnVuY3Rpb25zID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgJ0UnOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX1RJTUUpOwotCWNhc2UgJ2UnOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0dSQVBIKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0YnOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX1RJTUUpOwotCWNhc2UgJ2YnOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX0dSQVBIKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2cnOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0ZMQVQpOwotCSAgYnJlYWs7Ci0JY2FzZSAnRyc6Ci0JICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfRkxBVCk7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIHVzYWdlIChzdGRvdXQsIDApOwotCWNhc2UgJ2knOgotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0dNT05fSU5GTzsKLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0dNT05fSU5GTzsKLQkgIGJyZWFrOwotCWNhc2UgJ0knOgotCSAgc2VhcmNoX2xpc3RfYXBwZW5kICgmc3JjX3NlYXJjaF9saXN0LCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnSic6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0FOTk8pOwotCSAgICAgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9BTk5PVEFURURfU09VUkNFOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvdXRwdXRfc3R5bGUgJj0gflNUWUxFX0FOTk9UQVRFRF9TT1VSQ0U7Ci0JICAgIH0KLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0U7Ci0JICBicmVhazsKLQljYXNlICdrJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9BUkNTKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgbGluZV9ncmFudWxhcml0eSA9IFRSVUU7Ci0JICBicmVhazsKLQljYXNlICdMJzoKLQkgIHByaW50X3BhdGggPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAnbSc6Ci0JICBiYl9taW5fY2FsbHMgPSAodW5zaWduZWQgbG9uZykgc3RydG91bCAob3B0YXJnLCAoY2hhciAqKikgTlVMTCwgMTApOwotCSAgYnJlYWs7Ci0JY2FzZSAnbic6Ci0JICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfVElNRSk7Ci0JICBicmVhazsKLQljYXNlICdOJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9USU1FKTsKLQkgIGJyZWFrOwotCWNhc2UgJ08nOgotCSAgc3dpdGNoIChvcHRhcmdbMF0pCi0JICAgIHsKLQkgICAgY2FzZSAnYSc6Ci0JICAgICAgZmlsZV9mb3JtYXQgPSBGRl9BVVRPOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdtJzoKLQkgICAgICBmaWxlX2Zvcm1hdCA9IEZGX01BR0lDOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdiJzoKLQkgICAgICBmaWxlX2Zvcm1hdCA9IEZGX0JTRDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnNCc6Ci0JICAgICAgZmlsZV9mb3JtYXQgPSBGRl9CU0Q0NDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAncCc6Ci0JICAgICAgZmlsZV9mb3JtYXQgPSBGRl9QUk9GOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVua25vd24gZmlsZSBmb3JtYXQgJXNcbiIpLAotCQkgICAgICAgb3B0YXJnLCB3aG9hbWkpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdwJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfRkxBVCk7Ci0JICAgIH0KLQkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9GTEFUX1BST0ZJTEU7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9GTEFUX1BST0ZJTEU7Ci0JICBicmVhazsKLQljYXNlICdQJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfRkxBVCk7Ci0JICAgICAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0ZMQVRfUFJPRklMRTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3V0cHV0X3N0eWxlICY9IH5TVFlMRV9GTEFUX1BST0ZJTEU7Ci0JICAgIH0KLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0ZMQVRfUFJPRklMRTsKLQkgIGJyZWFrOwotCWNhc2UgJ3EnOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIGlmIChzdHJjaHIgKG9wdGFyZywgJy8nKSkKLQkJewotCQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9BUkNTKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9HUkFQSCk7Ci0JCX0KLQkgICAgfQotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0NBTExfR1JBUEg7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9DQUxMX0dSQVBIOwotCSAgYnJlYWs7Ci0JY2FzZSAncic6Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfRlVOQ1RJT05fT1JERVI7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9GVU5DVElPTl9PUkRFUjsKLQkgIGJyZWFrOwotCWNhc2UgJ1InOgotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0ZJTEVfT1JERVI7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9GSUxFX09SREVSOwotCSAgZnVuY3Rpb25fbWFwcGluZ19maWxlID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnUSc6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNociAob3B0YXJnLCAnLycpKQotCQl7Ci0JCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0FSQ1MpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0dSQVBIKTsKLQkJfQotCSAgICAgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9DQUxMX0dSQVBIOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvdXRwdXRfc3R5bGUgJj0gflNUWUxFX0NBTExfR1JBUEg7Ci0JICAgIH0KLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0NBTExfR1JBUEg7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9TVU1NQVJZX0ZJTEU7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9TVU1NQVJZX0ZJTEU7Ci0JICBicmVhazsKLQljYXNlICd0JzoKLQkgIGJiX3RhYmxlX2xlbmd0aCA9IGF0b2kgKG9wdGFyZyk7Ci0JICBpZiAoYmJfdGFibGVfbGVuZ3RoIDwgMCkKLQkgICAgewotCSAgICAgIGJiX3RhYmxlX2xlbmd0aCA9IDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ1QnOgotCSAgYnNkX3N0eWxlX291dHB1dCA9IFRSVUU7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0JICBwcmludGYgKF8oIkdOVSBncHJvZiAlc1xuIiksIFZFUlNJT04pOwotCSAgcHJpbnRmIChfKCJCYXNlZCBvbiBCU0QgZ3Byb2YsIGNvcHlyaWdodCAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS5cbiIpKTsKLQkgIHByaW50ZiAoXygiXAotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmUuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iKSk7Ci0JICBkb25lICgwKTsKLQljYXNlICd3JzoKLQkgIG91dHB1dF93aWR0aCA9IGF0b2kgKG9wdGFyZyk7Ci0JICBpZiAob3V0cHV0X3dpZHRoIDwgMSkKLQkgICAgewotCSAgICAgIG91dHB1dF93aWR0aCA9IDE7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgYmJfYW5ub3RhdGVfYWxsX2xpbmVzID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgJ3knOgotCSAgY3JlYXRlX2Fubm90YXRpb25fZmlsZXMgPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAneic6Ci0JICBpZ25vcmVfemVyb3MgPSBGQUxTRTsKLQkgIGJyZWFrOwotCWNhc2UgJ1onOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9FWEVDKTsKLQkgICAgICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfRVhFQ19DT1VOVFM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG91dHB1dF9zdHlsZSAmPSB+U1RZTEVfRVhFQ19DT1VOVFM7Ci0JICAgIH0KLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0U7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9ERU1BTkdMRToKLQkgIGRlbWFuZ2xlID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0RFTUFOR0xFOgotCSAgZGVtYW5nbGUgPSBGQUxTRTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICB1c2FnZSAoc3RkZXJyLCAxKTsKLQl9Ci0gICAgfQotCi0gIC8qIERvbid0IGFsbG93IGJvdGggb3JkZXJpbmcgb3B0aW9ucywgdGhleSBtb2RpZnkgdGhlIGFyYyBkYXRhIGluLXBsYWNlLiAgKi8KLSAgaWYgKCh1c2VyX3NwZWNpZmllZCAmIFNUWUxFX0ZVTkNUSU9OX09SREVSKQotICAgICAgJiYgKHVzZXJfc3BlY2lmaWVkICYgU1RZTEVfRklMRV9PUkRFUikpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLF8oIlwKLSVzOiBPbmx5IG9uZSBvZiAtLWZ1bmN0aW9uLW9yZGVyaW5nIGFuZCAtLWZpbGUtb3JkZXJpbmcgbWF5IGJlIHNwZWNpZmllZC5cbiIpLAotCSAgICAgICB3aG9hbWkpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIC8qIC0tc3VtIGltcGxpZXMgLS1saW5lLCBvdGhlcndpc2Ugd2UnZCBsb3NlIGItYiBjb3VudHMgaW4gZ21vbi5zdW0gKi8KLSAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX1NVTU1BUllfRklMRSkKLSAgICB7Ci0gICAgICBsaW5lX2dyYW51bGFyaXR5ID0gMTsKLSAgICB9Ci0KLSAgLyogYXBwZW5kIHZhbHVlIG9mIEdQUk9GX1BBVEggdG8gc291cmNlIHNlYXJjaCBsaXN0IGlmIHNldDogKi8KLSAgc3RyID0gKGNoYXIgKikgZ2V0ZW52ICgiR1BST0ZfUEFUSCIpOwotICBpZiAoc3RyKQotICAgIHsKLSAgICAgIHNlYXJjaF9saXN0X2FwcGVuZCAoJnNyY19zZWFyY2hfbGlzdCwgc3RyKTsKLSAgICB9Ci0KLSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgYV9vdXRfbmFtZSA9IGFyZ3Zbb3B0aW5kKytdOwotICAgIH0KLSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgZ21vbl9uYW1lID0gYXJndltvcHRpbmQrK107Ci0gICAgfQotCi0gIC8qCi0gICAqIFR1cm4gb2ZmIGRlZmF1bHQgZnVuY3Rpb25zOgotICAgKi8KLSAgZm9yIChzcCA9ICZkZWZhdWx0X2V4Y2x1ZGVkX2xpc3RbMF07ICpzcDsgc3ArKykKLSAgICB7Ci0gICAgICBzeW1faWRfYWRkICgqc3AsIEVYQ0xfVElNRSk7Ci0gICAgICBzeW1faWRfYWRkICgqc3AsIEVYQ0xfR1JBUEgpOwotI2lmZGVmIF9fYWxwaGFfXwotICAgICAgc3ltX2lkX2FkZCAoKnNwLCBFWENMX0ZMQVQpOwotI2VuZGlmCi0gICAgfQotCi0gIC8qCi0gICAqIEZvciBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLCBhbHNvIHdhbnQgdG8ga2VlcCB0aG9zZQotICAgKiBmdW5jdGlvbnMgb2ZmIHRoZSBmbGF0IHByb2ZpbGU6Ci0gICAqLwotICBpZiAobGluZV9ncmFudWxhcml0eSkKLSAgICB7Ci0gICAgICBmb3IgKHNwID0gJmRlZmF1bHRfZXhjbHVkZWRfbGlzdFswXTsgKnNwOyBzcCsrKQotCXsKLQkgIHN5bV9pZF9hZGQgKCpzcCwgRVhDTF9GTEFUKTsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAqIFJlYWQgc3ltYm9sIHRhYmxlIGZyb20gY29yZSBmaWxlOgotICAgKi8KLSAgY29yZV9pbml0IChhX291dF9uYW1lKTsKLQotICAvKgotICAgKiBJZiB3ZSBzaG91bGQgaWdub3JlIGRpcmVjdCBmdW5jdGlvbiBjYWxscywgd2UgbmVlZCB0byBsb2FkCi0gICAqIHRvIGNvcmUncyB0ZXh0LXNwYWNlOgotICAgKi8KLSAgaWYgKGlnbm9yZV9kaXJlY3RfY2FsbHMpCi0gICAgewotICAgICAgY29yZV9nZXRfdGV4dF9zcGFjZSAoY29yZV9iZmQpOwotICAgIH0KLQotICAvKgotICAgKiBDcmVhdGUgc3ltYm9scyBmcm9tIGNvcmUgaW1hZ2U6Ci0gICAqLwotICBpZiAobGluZV9ncmFudWxhcml0eSkKLSAgICB7Ci0gICAgICBjb3JlX2NyZWF0ZV9saW5lX3N5bXMgKGNvcmVfYmZkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zIChjb3JlX2JmZCk7Ci0gICAgfQotCi0gIC8qCi0gICAqIFRyYW5zbGF0ZSBzeW0gc3BlY3MgaW50byBzeW1zOgotICAgKi8KLSAgc3ltX2lkX3BhcnNlICgpOwotCi0gIGlmIChmaWxlX2Zvcm1hdCA9PSBGRl9QUk9GKQotICAgIHsKLSNpZmRlZiBQUk9GX1NVUFBPUlRfSU1QTEVNRU5URUQKLSAgICAgIC8qCi0gICAgICAgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgbW9uLm91dCBmaWxlKHMpOgotICAgICAgICovCi0gICAgICBkbwotCXsKLQkgIG1vbl9vdXRfcmVhZCAoZ21vbl9uYW1lKTsKLQkgIGlmIChvcHRpbmQgPCBhcmdjKQotCSAgICB7Ci0JICAgICAgZ21vbl9uYW1lID0gYXJndltvcHRpbmRdOwotCSAgICB9Ci0JfQotICAgICAgd2hpbGUgKG9wdGluZCsrIDwgYXJnYyk7Ci0jZWxzZQotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICBfKCIlczogc29ycnksIGZpbGUgZm9ybWF0IGBwcm9mJyBpcyBub3QgeWV0IHN1cHBvcnRlZFxuIiksCi0JICAgICAgIHdob2FtaSk7Ci0gICAgICBkb25lICgxKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgZ21vbi5vdXQgZmlsZShzKToKLSAgICAgICAqLwotICAgICAgZG8KLQl7Ci0JICBnbW9uX291dF9yZWFkIChnbW9uX25hbWUpOwotCSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0JICAgIHsKLQkgICAgICBnbW9uX25hbWUgPSBhcmd2W29wdGluZF07Ci0JICAgIH0KLQl9Ci0gICAgICB3aGlsZSAob3B0aW5kKysgPCBhcmdjKTsKLSAgICB9Ci0KLSAgLyoKLSAgICogSWYgdXNlciBkaWQgbm90IHNwZWNpZnkgb3V0cHV0IHN0eWxlLCB0cnkgdG8gZ3Vlc3Mgc29tZXRoaW5nCi0gICAqIHJlYXNvbmFibGU6Ci0gICAqLwotICBpZiAob3V0cHV0X3N0eWxlID09IDApCi0gICAgewotICAgICAgaWYgKGdtb25faW5wdXQgJiAoSU5QVVRfSElTVE9HUkFNIHwgSU5QVVRfQ0FMTF9HUkFQSCkpCi0JewotCSAgb3V0cHV0X3N0eWxlID0gU1RZTEVfRkxBVF9QUk9GSUxFIHwgU1RZTEVfQ0FMTF9HUkFQSDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3V0cHV0X3N0eWxlID0gU1RZTEVfRVhFQ19DT1VOVFM7Ci0JfQotICAgICAgb3V0cHV0X3N0eWxlICY9IH51c2VyX3NwZWNpZmllZDsKLSAgICB9Ci0KLSAgLyoKLSAgICogRHVtcCBhIGdtb24uc3VtIGZpbGUgaWYgcmVxdWVzdGVkIChiZWZvcmUgYW55IG90aGVyIHByb2Nlc3NpbmchKToKLSAgICovCi0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9TVU1NQVJZX0ZJTEUpCi0gICAgewotICAgICAgZ21vbl9vdXRfd3JpdGUgKEdNT05TVU0pOwotICAgIH0KLQotICBpZiAoZ21vbl9pbnB1dCAmIElOUFVUX0hJU1RPR1JBTSkKLSAgICB7Ci0gICAgICBoaXN0X2Fzc2lnbl9zYW1wbGVzICgpOwotICAgIH0KLQotICBpZiAoZ21vbl9pbnB1dCAmIElOUFVUX0NBTExfR1JBUEgpCi0gICAgewotICAgICAgY2cgPSBjZ19hc3NlbWJsZSAoKTsKLSAgICB9Ci0KLSAgLyogZG8gc29tZSBzaW1wbGUgc2FuaXR5IGNoZWNrczogKi8KLQotICBpZiAoKG91dHB1dF9zdHlsZSAmIFNUWUxFX0ZMQVRfUFJPRklMRSkKLSAgICAgICYmICEoZ21vbl9pbnB1dCAmIElOUFVUX0hJU1RPR1JBTSkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZ21vbi5vdXQgZmlsZSBpcyBtaXNzaW5nIGhpc3RvZ3JhbVxuIiksIHdob2FtaSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgaWYgKChvdXRwdXRfc3R5bGUgJiBTVFlMRV9DQUxMX0dSQVBIKSAmJiAhKGdtb25faW5wdXQgJiBJTlBVVF9DQUxMX0dSQVBIKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgIF8oIiVzOiBnbW9uLm91dCBmaWxlIGlzIG1pc3NpbmcgY2FsbC1ncmFwaCBkYXRhXG4iKSwgd2hvYW1pKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICAvKiBvdXRwdXQgd2hhdGV2ZXIgdXNlciB3aGlzaGVzIHRvIHNlZTogKi8KLQotICBpZiAoY2cgJiYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0NBTExfR1JBUEgpICYmIGJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgY2dfcHJpbnQgKGNnKTsJCS8qIHByaW50IHRoZSBkeW5hbWljIHByb2ZpbGUgKi8KLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0ZMQVRfUFJPRklMRSkKLSAgICB7Ci0gICAgICBoaXN0X3ByaW50ICgpOwkJLyogcHJpbnQgdGhlIGZsYXQgcHJvZmlsZSAqLwotICAgIH0KLQotICBpZiAoY2cgJiYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0NBTExfR1JBUEgpKQotICAgIHsKLSAgICAgIGlmICghYnNkX3N0eWxlX291dHB1dCkKLQl7Ci0JICBjZ19wcmludCAoY2cpOwkvKiBwcmludCB0aGUgZHluYW1pYyBwcm9maWxlICovCi0JfQotICAgICAgY2dfcHJpbnRfaW5kZXggKCk7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9FWEVDX0NPVU5UUykKLSAgICB7Ci0gICAgICBwcmludF9leGVjX2NvdW50cyAoKTsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0UpCi0gICAgewotICAgICAgcHJpbnRfYW5ub3RhdGVkX3NvdXJjZSAoKTsKLSAgICB9Ci0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9GVU5DVElPTl9PUkRFUikKLSAgICB7Ci0gICAgICBjZ19wcmludF9mdW5jdGlvbl9vcmRlcmluZyAoKTsKLSAgICB9Ci0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9GSUxFX09SREVSKQotICAgIHsKLSAgICAgIGNnX3ByaW50X2ZpbGVfb3JkZXJpbmcgKCk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotdm9pZAotZG9uZSAoc3RhdHVzKQotICAgICBpbnQgc3RhdHVzOwotewotICBleGl0IChzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ3Byb2YuaCBiL2dwcm9mL2dwcm9mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNjJhZWUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ3Byb2YuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAotICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKLSAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKLSAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiAgICAgIEAoIylncHJvZi5oICAgICA1LjkgKEJlcmtlbGV5KSA2LzEvOTAKLSAqLwotI2lmbmRlZiBncHJvZl9oCi0jZGVmaW5lIGdwcm9mX2gKLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLS8qIEluY2x1ZGUgdGhlIEJGRCBzeXNkZXAuaCBmaWxlLiAgKi8KLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotLyogVW5kZWZpbmUgdGhlIEJGRCBQQUNLQUdFIGFuZCBWRVJTSU9OIG1hY3JvcyBiZWZvcmUgaW5jbHVkaW5nIHRoZQotICAgZ3Byb2YgY29uZmlnLmggZmlsZS4gICovCi0jdW5kZWYgUEFDS0FHRQotI3VuZGVmIFZFUlNJT04KLS8qIEFsc28gdW5kZWZpbmUgQkZEJ3MgYF8nIG1hY3JvOyB3ZSBoYXZlIG91ciBvd24gZGVmaW5pdGlvbi4gICovCi0jdW5kZWYgXwotCi0jaW5jbHVkZSAiZ2NvbmZpZy5oIgotCi0jaWZuZGVmIE1JTgotI2RlZmluZSBNSU4oYSxiKQkoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotI2VuZGlmCi0jaWZuZGVmIE1BWAotI2RlZmluZSBNQVgoYSxiKQkoKGEpID4gKGIpID8gKGEpIDogKGIpKQotI2VuZGlmCi0KLS8qIEFJWCBkZWZpbmVzIGh6IGFzIGEgbWFjcm8uICAqLwotI3VuZGVmIGh6Ci0KLSNpZm5kZWYgUEFUSF9NQVgKLSNkZWZpbmUgUEFUSF9NQVgJMTAyNAotI2VuZGlmCi0KLSNkZWZpbmUJQV9PVVROQU1FCSJhLm91dCIJLyogZGVmYXVsdCBjb3JlIGZpbGVuYW1lICovCi0jZGVmaW5lCUdNT05OQU1FCSJnbW9uLm91dCIJLyogZGVmYXVsdCBwcm9maWxlIGZpbGVuYW1lICovCi0jZGVmaW5lCUdNT05TVU0JCSJnbW9uLnN1bSIJLyogcHJvZmlsZSBzdW1tYXJ5IGZpbGVuYW1lICovCi0KLSNpZmRlZiBIQVZFX0xPQ0FMRV9ICi0jIGluY2x1ZGUgPGxvY2FsZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBFTkFCTEVfTkxTCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSMgZGVmaW5lIF8oU3RyaW5nKSBnZXR0ZXh0IChTdHJpbmcpCi0jIGlmZGVmIGdldHRleHRfbm9vcAotIyAgZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCi0jIGVsc2UKLSMgIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jIGVuZGlmCi0jZWxzZQotLyogU3R1YnMgdGhhdCBkbyBzb21ldGhpbmcgY2xvc2UgZW5vdWdoLiAgKi8KLSMgZGVmaW5lIHRleHRkb21haW4oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZ2V0dGV4dChTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBkZ2V0dGV4dChEb21haW4sTWVzc2FnZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBkY2dldHRleHQoRG9tYWluLE1lc3NhZ2UsVHlwZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW4sRGlyZWN0b3J5KSAoRG9tYWluKQotIyBkZWZpbmUgXyhTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jZW5kaWYKLQotCi0vKgotICogVGhlc2UgbWF5IGFscmVhZHkgYmUgZGVmaW5lZCBvbiBzb21lIHN5c3RlbXMuICBXZSBjb3VsZCBwcm9iYWJseQotICoganVzdCB1c2UgdGhlIEJGRCB2ZXJzaW9ucyBvZiB0aGVzZSwgc2luY2UgQkZEIGhhcyBhbHJlYWR5IGRlYWx0Ci0gKiB3aXRoIHRoaXMgcHJvYmxlbS4KLSAqLwotI3VuZGVmIEZBTFNFCi0jZGVmaW5lCUZBTFNFCTAKLSN1bmRlZiBUUlVFCi0jZGVmaW5lCVRSVUUJMQotCi0jZGVmaW5lIFNUWUxFX0ZMQVRfUFJPRklMRQkoMTw8MCkKLSNkZWZpbmUgU1RZTEVfQ0FMTF9HUkFQSAkoMTw8MSkKLSNkZWZpbmUgU1RZTEVfU1VNTUFSWV9GSUxFCSgxPDwyKQotI2RlZmluZSBTVFlMRV9FWEVDX0NPVU5UUwkoMTw8MykKLSNkZWZpbmUgU1RZTEVfQU5OT1RBVEVEX1NPVVJDRQkoMTw8NCkKLSNkZWZpbmUgU1RZTEVfR01PTl9JTkZPCQkoMTw8NSkKLSNkZWZpbmUgU1RZTEVfRlVOQ1RJT05fT1JERVIJKDE8PDYpCi0jZGVmaW5lIFNUWUxFX0ZJTEVfT1JERVIJKDE8PDcpCi0KLSNkZWZpbmUJQU5ZREVCVUcJKDE8PDApCS8qICAgIDEgKi8KLSNkZWZpbmUJREZOREVCVUcJKDE8PDEpCS8qICAgIDIgKi8KLSNkZWZpbmUJQ1lDTEVERUJVRwkoMTw8MikJLyogICAgNCAqLwotI2RlZmluZQlBUkNERUJVRwkoMTw8MykJLyogICAgOCAqLwotI2RlZmluZQlUQUxMWURFQlVHCSgxPDw0KQkvKiAgIDE2ICovCi0jZGVmaW5lCVRJTUVERUJVRwkoMTw8NSkJLyogICAzMiAqLwotI2RlZmluZQlTQU1QTEVERUJVRwkoMTw8NikJLyogICA2NCAqLwotI2RlZmluZQlBT1VUREVCVUcJKDE8PDcpCS8qICAxMjggKi8KLSNkZWZpbmUJQ0FMTERFQlVHCSgxPDw4KQkvKiAgMjU2ICovCi0jZGVmaW5lCUxPT0tVUERFQlVHCSgxPDw5KQkvKiAgNTEyICovCi0jZGVmaW5lCVBST1BERUJVRwkoMTw8MTApCS8qIDEwMjQgKi8KLSNkZWZpbmUgQkJERUJVRwkJKDE8PDExKQkvKiAyMDQ4ICovCi0jZGVmaW5lIElEREVCVUcJCSgxPDwxMikJLyogNDA5NiAqLwotI2RlZmluZSBTUkNERUJVRwkoMTw8MTMpCS8qIDgxOTIgKi8KLQotI2lmZGVmIERFQlVHCi0jZGVmaW5lIERCRyhsLHMpCWlmIChkZWJ1Z19sZXZlbCAmIChsKSkge3M7fQotI2Vsc2UKLSNkZWZpbmUgREJHKGwscykKLSNlbmRpZgotCi10eXBlZGVmIGVudW0KLSAgewotICAgIEZGX0FVVE8gPSAwLCBGRl9NQUdJQywgRkZfQlNELCBGRl9CU0Q0NCwgRkZfUFJPRgotICB9Ci1GaWxlX0Zvcm1hdDsKLQotdHlwZWRlZiBpbnQgYm9vbDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVTklUWzJdOwkvKiB1bml0IG9mIHByb2ZpbGluZyAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqd2hvYW1pOwkvKiBjb21tYW5kLW5hbWUsIGZvciBlcnJvciBtZXNzYWdlcyAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX21hcHBpbmdfZmlsZTsgLyogZmlsZSBtYXBwaW5nIGZ1bmN0aW9ucyB0byBmaWxlcyAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFfb3V0X25hbWU7CS8qIGNvcmUgZmlsZW5hbWUgKi8KLWV4dGVybiBsb25nIGh6OwkJCS8qIHRpY2tzIHBlciBzZWNvbmQgKi8KLQotLyoKLSAqIENvbW1hbmQtbGluZSBvcHRpb25zOgotICovCi1leHRlcm4gaW50IGRlYnVnX2xldmVsOwkJLyogZGVidWcgbGV2ZWwgKi8KLWV4dGVybiBpbnQgb3V0cHV0X3N0eWxlOwotZXh0ZXJuIGludCBvdXRwdXRfd2lkdGg7CS8qIGNvbnRyb2xzIGNvbHVtbiB3aWR0aCBpbiBpbmRleCAqLwotZXh0ZXJuIGJvb2wgYnNkX3N0eWxlX291dHB1dDsJLyogYXMgb3Bwb3NlZCB0byBGU0Ygc3R5bGUgb3V0cHV0ICovCi1leHRlcm4gYm9vbCBkZW1hbmdsZTsJCS8qIGRlbWFuZ2xlIHN5bWJvbCBuYW1lcz8gKi8KLWV4dGVybiBib29sIGRpc2NhcmRfdW5kZXJzY29yZXM7CS8qIGRpc2NhcmQgbGVhZGluZyB1bmRlcnNjb3Jlcz8gKi8KLWV4dGVybiBib29sIGlnbm9yZV9kaXJlY3RfY2FsbHM7CS8qIGRvbid0IGNvdW50IGRpcmVjdCBjYWxscyAqLwotZXh0ZXJuIGJvb2wgaWdub3JlX3N0YXRpY19mdW5jczsJLyogc3VwcHJlc3Mgc3RhdGljIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIGJvb2wgaWdub3JlX3plcm9zOwkvKiBpZ25vcmUgdW51c2VkIHN5bWJvbHMvZmlsZXMgKi8KLWV4dGVybiBib29sIGxpbmVfZ3JhbnVsYXJpdHk7CS8qIGZ1bmN0aW9uIG9yIGxpbmUgZ3JhbnVsYXJpdHk/ICovCi1leHRlcm4gYm9vbCBwcmludF9kZXNjcmlwdGlvbnM7CS8qIG91dHB1dCBwcm9maWxlIGRlc2NyaXB0aW9uICovCi1leHRlcm4gYm9vbCBwcmludF9wYXRoOwkJLyogcHJpbnQgcGF0aCBvciBqdXN0IGZpbGVuYW1lPyAqLwotZXh0ZXJuIGJvb2wgaWdub3JlX25vbl9mdW5jdGlvbnM7LyogSWdub3JlIG5vbi1mdW5jdGlvbiBzeW1ib2xzLiAgKi8KLQotZXh0ZXJuIEZpbGVfRm9ybWF0IGZpbGVfZm9ybWF0OwkvKiByZXF1ZXN0ZWQgZmlsZSBmb3JtYXQgKi8KLQotZXh0ZXJuIGJvb2wgZmlyc3Rfb3V0cHV0OwkvKiBubyBvdXRwdXQgc28gZmFyPyAqLwotCi1leHRlcm4gdm9pZCBkb25lIFBBUkFNUyAoKGludCBzdGF0dXMpKTsKLQotI2VuZGlmIC8qIGdwcm9mX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2dwcm9mLnRleGkgYi9ncHJvZi9ncHJvZi50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2Q4YjlmLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2dwcm9mLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyMDI4ICswLDAgQEAKLVxpbnB1dCB0ZXhpbmZvIEBjIC0qLXRleGluZm8tKi0KLUBzZXRmaWxlbmFtZSBncHJvZi5pbmZvCi1Ac2V0dGl0bGUgR05VIGdwcm9mCi1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCi0KLUBpZmluZm8KLUBjIFRoaXMgaXMgYSBkaXIuaW5mbyBmcmFnbWVudCB0byBzdXBwb3J0IHNlbWktYXV0b21hdGVkIGFkZGl0aW9uIG9mCi1AYyBtYW51YWxzIHRvIGFuIGluZm8gdHJlZS4gIHpvb0BjeWdudXMuY29tIGlzIGRldmVsb3BpbmcgdGhpcyBmYWNpbGl0eS4KLUBmb3JtYXQKLVNUQVJULUlORk8tRElSLUVOVFJZCi0qIGdwcm9mOiAoZ3Byb2YpLiAgICAgICAgICAgICAgICBQcm9maWxpbmcgeW91ciBwcm9ncmFtJ3MgZXhlY3V0aW9uCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1AaWZpbmZvCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBncHJvZiBwcm9maWxlciBvZiB0aGUgR05VIHN5c3RlbS4KLQotQ29weXJpZ2h0IChDKSAxOTg4LCAxOTkyLCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZQotcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCBpZmluZm8KLQotQGZpbmFsb3V0Ci1Ac21hbGxib29rCi0KLUB0aXRsZXBhZ2UKLUB0aXRsZSBHTlUgZ3Byb2YKLUBzdWJ0aXRsZSBUaGUgQHNje2dudX0gUHJvZmlsZXIgCi1AYXV0aG9yIEpheSBGZW5sYXNvbiBhbmQgUmljaGFyZCBTdGFsbG1hbgotCi1AcGFnZQotCi1UaGlzIG1hbnVhbCBkZXNjcmliZXMgdGhlIEBzY3tnbnV9IHByb2ZpbGVyLCBAY29kZXtncHJvZn0sIGFuZCBob3cgeW91Ci1jYW4gdXNlIGl0IHRvIGRldGVybWluZSB3aGljaCBwYXJ0cyBvZiBhIHByb2dyYW0gYXJlIHRha2luZyBtb3N0IG9mIHRoZQotZXhlY3V0aW9uIHRpbWUuICBXZSBhc3N1bWUgdGhhdCB5b3Uga25vdyBob3cgdG8gd3JpdGUsIGNvbXBpbGUsIGFuZAotZXhlY3V0ZSBwcm9ncmFtcy4gIEBzY3tnbnV9IEBjb2Rle2dwcm9mfSB3YXMgd3JpdHRlbiBieSBKYXkgRmVubGFzb24uCi0KLVRoaXMgbWFudWFsIHdhcyBlZGl0ZWQgSmFudWFyeSAxOTkzIGJ5IEplZmZyZXkgT3NpZXIKLWFuZCB1cGRhdGVkIFNlcHRlbWJlciAxOTk3IGJ5IEJyZW50IEJhY2NhbGEuCi0KLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk4OCwgMTk5MiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgotCi1AZW5kIGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgYXMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotCi1AZW5kIHRpdGxlcGFnZQotCi1AaWZpbmZvCi1Abm9kZSBUb3AKLUB0b3AgUHJvZmlsaW5nIGEgUHJvZ3JhbTogV2hlcmUgRG9lcyBJdCBTcGVuZCBJdHMgVGltZT8KLQotVGhpcyBtYW51YWwgZGVzY3JpYmVzIHRoZSBAc2N7Z251fSBwcm9maWxlciwgQGNvZGV7Z3Byb2Z9LCBhbmQgaG93IHlvdQotY2FuIHVzZSBpdCB0byBkZXRlcm1pbmUgd2hpY2ggcGFydHMgb2YgYSBwcm9ncmFtIGFyZSB0YWtpbmcgbW9zdCBvZiB0aGUKLWV4ZWN1dGlvbiB0aW1lLiAgV2UgYXNzdW1lIHRoYXQgeW91IGtub3cgaG93IHRvIHdyaXRlLCBjb21waWxlLCBhbmQKLWV4ZWN1dGUgcHJvZ3JhbXMuICBAc2N7Z251fSBAY29kZXtncHJvZn0gd2FzIHdyaXR0ZW4gYnkgSmF5IEZlbmxhc29uLgotCi1UaGlzIG1hbnVhbCB3YXMgdXBkYXRlZCBBdWd1c3QgMTk5NyBieSBCcmVudCBCYWNjYWxhLgotCi1AbWVudQotKiBJbnRyb2R1Y3Rpb246OiAgICAgICAgV2hhdCBwcm9maWxpbmcgbWVhbnMsIGFuZCB3aHkgaXQgaXMgdXNlZnVsLgotCi0qIENvbXBpbGluZzo6ICAgICAgICAgICBIb3cgdG8gY29tcGlsZSB5b3VyIHByb2dyYW0gZm9yIHByb2ZpbGluZy4KLSogRXhlY3V0aW5nOjogICAgICAgICAgIEV4ZWN1dGluZyB5b3VyIHByb2dyYW0gdG8gZ2VuZXJhdGUgcHJvZmlsZSBkYXRhCi0qIEludm9raW5nOjogICAgICAgICAgICBIb3cgdG8gcnVuIEBjb2Rle2dwcm9mfSwgYW5kIGl0cyBvcHRpb25zCi0KLSogT3V0cHV0OjoJCUludGVycHJldGluZyBAY29kZXtncHJvZn0ncyBvdXRwdXQKLQotKiBJbmFjY3VyYWN5OjogICAgICAgICAgUG90ZW50aWFsIHByb2JsZW1zIHlvdSBzaG91bGQgYmUgYXdhcmUgb2YKLSogSG93IGRvIEk/OjogICAgICAgICAgIEFuc3dlcnMgdG8gY29tbW9uIHF1ZXN0aW9ucwotKiBJbmNvbXBhdGliaWxpdGllczo6ICAgKGJldHdlZW4gQHNje2dudX0gQGNvZGV7Z3Byb2Z9IGFuZCBVbml4IEBjb2Rle2dwcm9mfS4pCi0qIERldGFpbHM6OiAgICAgICAgICAgICBEZXRhaWxzIG9mIGhvdyBwcm9maWxpbmcgaXMgZG9uZQotQGVuZCBtZW51Ci1AZW5kIGlmaW5mbwotCi1Abm9kZSBJbnRyb2R1Y3Rpb24KLUBjaGFwdGVyIEludHJvZHVjdGlvbiB0byBQcm9maWxpbmcKLQotUHJvZmlsaW5nIGFsbG93cyB5b3UgdG8gbGVhcm4gd2hlcmUgeW91ciBwcm9ncmFtIHNwZW50IGl0cyB0aW1lIGFuZCB3aGljaAotZnVuY3Rpb25zIGNhbGxlZCB3aGljaCBvdGhlciBmdW5jdGlvbnMgd2hpbGUgaXQgd2FzIGV4ZWN1dGluZy4gIFRoaXMKLWluZm9ybWF0aW9uIGNhbiBzaG93IHlvdSB3aGljaCBwaWVjZXMgb2YgeW91ciBwcm9ncmFtIGFyZSBzbG93ZXIgdGhhbiB5b3UKLWV4cGVjdGVkLCBhbmQgbWlnaHQgYmUgY2FuZGlkYXRlcyBmb3IgcmV3cml0aW5nIHRvIG1ha2UgeW91ciBwcm9ncmFtCi1leGVjdXRlIGZhc3Rlci4gIEl0IGNhbiBhbHNvIHRlbGwgeW91IHdoaWNoIGZ1bmN0aW9ucyBhcmUgYmVpbmcgY2FsbGVkIG1vcmUKLW9yIGxlc3Mgb2Z0ZW4gdGhhbiB5b3UgZXhwZWN0ZWQuICBUaGlzIG1heSBoZWxwIHlvdSBzcG90IGJ1Z3MgdGhhdCBoYWQKLW90aGVyd2lzZSBiZWVuIHVubm90aWNlZC4KLQotU2luY2UgdGhlIHByb2ZpbGVyIHVzZXMgaW5mb3JtYXRpb24gY29sbGVjdGVkIGR1cmluZyB0aGUgYWN0dWFsIGV4ZWN1dGlvbgotb2YgeW91ciBwcm9ncmFtLCBpdCBjYW4gYmUgdXNlZCBvbiBwcm9ncmFtcyB0aGF0IGFyZSB0b28gbGFyZ2Ugb3IgdG9vCi1jb21wbGV4IHRvIGFuYWx5emUgYnkgcmVhZGluZyB0aGUgc291cmNlLiAgSG93ZXZlciwgaG93IHlvdXIgcHJvZ3JhbSBpcyBydW4KLXdpbGwgYWZmZWN0IHRoZSBpbmZvcm1hdGlvbiB0aGF0IHNob3dzIHVwIGluIHRoZSBwcm9maWxlIGRhdGEuICBJZiB5b3UKLWRvbid0IHVzZSBzb21lIGZlYXR1cmUgb2YgeW91ciBwcm9ncmFtIHdoaWxlIGl0IGlzIGJlaW5nIHByb2ZpbGVkLCBubwotcHJvZmlsZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdGhhdCBmZWF0dXJlLgotCi1Qcm9maWxpbmcgaGFzIHNldmVyYWwgc3RlcHM6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1Zb3UgbXVzdCBjb21waWxlIGFuZCBsaW5rIHlvdXIgcHJvZ3JhbSB3aXRoIHByb2ZpbGluZyBlbmFibGVkLgotQHhyZWZ7Q29tcGlsaW5nfS4KLQotQGl0ZW0KLVlvdSBtdXN0IGV4ZWN1dGUgeW91ciBwcm9ncmFtIHRvIGdlbmVyYXRlIGEgcHJvZmlsZSBkYXRhIGZpbGUuCi1AeHJlZntFeGVjdXRpbmd9LgotCi1AaXRlbQotWW91IG11c3QgcnVuIEBjb2Rle2dwcm9mfSB0byBhbmFseXplIHRoZSBwcm9maWxlIGRhdGEuCi1AeHJlZntJbnZva2luZ30uCi1AZW5kIGl0ZW1pemUKLQotVGhlIG5leHQgdGhyZWUgY2hhcHRlcnMgZXhwbGFpbiB0aGVzZSBzdGVwcyBpbiBncmVhdGVyIGRldGFpbC4KLQotU2V2ZXJhbCBmb3JtcyBvZiBvdXRwdXQgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBhbmFseXNpcy4KLQotVGhlIEBkZm57ZmxhdCBwcm9maWxlfSBzaG93cyBob3cgbXVjaCB0aW1lIHlvdXIgcHJvZ3JhbSBzcGVudCBpbiBlYWNoIGZ1bmN0aW9uLAotYW5kIGhvdyBtYW55IHRpbWVzIHRoYXQgZnVuY3Rpb24gd2FzIGNhbGxlZC4gIElmIHlvdSBzaW1wbHkgd2FudCB0byBrbm93Ci13aGljaCBmdW5jdGlvbnMgYnVybiBtb3N0IG9mIHRoZSBjeWNsZXMsIGl0IGlzIHN0YXRlZCBjb25jaXNlbHkgaGVyZS4KLUB4cmVme0ZsYXQgUHJvZmlsZX0uCi0KLVRoZSBAZGZue2NhbGwgZ3JhcGh9IHNob3dzLCBmb3IgZWFjaCBmdW5jdGlvbiwgd2hpY2ggZnVuY3Rpb25zIGNhbGxlZCBpdCwgd2hpY2gKLW90aGVyIGZ1bmN0aW9ucyBpdCBjYWxsZWQsIGFuZCBob3cgbWFueSB0aW1lcy4gIFRoZXJlIGlzIGFsc28gYW4gZXN0aW1hdGUKLW9mIGhvdyBtdWNoIHRpbWUgd2FzIHNwZW50IGluIHRoZSBzdWJyb3V0aW5lcyBvZiBlYWNoIGZ1bmN0aW9uLiAgVGhpcyBjYW4KLXN1Z2dlc3QgcGxhY2VzIHdoZXJlIHlvdSBtaWdodCB0cnkgdG8gZWxpbWluYXRlIGZ1bmN0aW9uIGNhbGxzIHRoYXQgdXNlIGEKLWxvdCBvZiB0aW1lLiAgQHhyZWZ7Q2FsbCBHcmFwaH0uCi0KLVRoZSBAZGZue2Fubm90YXRlZCBzb3VyY2V9IGxpc3RpbmcgaXMgYSBjb3B5IG9mIHRoZSBwcm9ncmFtJ3MKLXNvdXJjZSBjb2RlLCBsYWJlbGVkIHdpdGggdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIGxpbmUgb2YgdGhlCi1wcm9ncmFtIHdhcyBleGVjdXRlZC4gIEB4cmVme0Fubm90YXRlZCBTb3VyY2V9LgotCi1UbyBiZXR0ZXIgdW5kZXJzdGFuZCBob3cgcHJvZmlsaW5nIHdvcmtzLCB5b3UgbWF5IHdpc2ggdG8gcmVhZAotYSBkZXNjcmlwdGlvbiBvZiBpdHMgaW1wbGVtZW50YXRpb24uCi1AeHJlZntJbXBsZW1lbnRhdGlvbn0uCi0KLUBub2RlIENvbXBpbGluZwotQGNoYXB0ZXIgQ29tcGlsaW5nIGEgUHJvZ3JhbSBmb3IgUHJvZmlsaW5nCi0KLVRoZSBmaXJzdCBzdGVwIGluIGdlbmVyYXRpbmcgcHJvZmlsZSBpbmZvcm1hdGlvbiBmb3IgeW91ciBwcm9ncmFtIGlzCi10byBjb21waWxlIGFuZCBsaW5rIGl0IHdpdGggcHJvZmlsaW5nIGVuYWJsZWQuCi0KLVRvIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBmb3IgcHJvZmlsaW5nLCBzcGVjaWZ5IHRoZSBAc2FtcHstcGd9IG9wdGlvbiB3aGVuCi15b3UgcnVuIHRoZSBjb21waWxlci4gIChUaGlzIGlzIGluIGFkZGl0aW9uIHRvIHRoZSBvcHRpb25zIHlvdSBub3JtYWxseQotdXNlLikKLQotVG8gbGluayB0aGUgcHJvZ3JhbSBmb3IgcHJvZmlsaW5nLCBpZiB5b3UgdXNlIGEgY29tcGlsZXIgc3VjaCBhcyBAY29kZXtjY30KLXRvIGRvIHRoZSBsaW5raW5nLCBzaW1wbHkgc3BlY2lmeSBAc2FtcHstcGd9IGluIGFkZGl0aW9uIHRvIHlvdXIgdXN1YWwKLW9wdGlvbnMuICBUaGUgc2FtZSBvcHRpb24sIEBzYW1wey1wZ30sIGFsdGVycyBlaXRoZXIgY29tcGlsYXRpb24gb3IgbGlua2luZwotdG8gZG8gd2hhdCBpcyBuZWNlc3NhcnkgZm9yIHByb2ZpbGluZy4gIEhlcmUgYXJlIGV4YW1wbGVzOgotCi1AZXhhbXBsZQotY2MgLWcgLWMgbXlwcm9nLmMgdXRpbHMuYyAtcGcKLWNjIC1vIG15cHJvZyBteXByb2cubyB1dGlscy5vIC1wZwotQGVuZCBleGFtcGxlCi0KLVRoZSBAc2FtcHstcGd9IG9wdGlvbiBhbHNvIHdvcmtzIHdpdGggYSBjb21tYW5kIHRoYXQgYm90aCBjb21waWxlcyBhbmQgbGlua3M6Ci0KLUBleGFtcGxlCi1jYyAtbyBteXByb2cgbXlwcm9nLmMgdXRpbHMuYyAtZyAtcGcKLUBlbmQgZXhhbXBsZQotCi1JZiB5b3UgcnVuIHRoZSBsaW5rZXIgQGNvZGV7bGR9IGRpcmVjdGx5IGluc3RlYWQgb2YgdGhyb3VnaCBhIGNvbXBpbGVyCi1zdWNoIGFzIEBjb2Rle2NjfSwgeW91IG1heSBoYXZlIHRvIHNwZWNpZnkgYSBwcm9maWxpbmcgc3RhcnR1cCBmaWxlCi1AZmlsZXtnY3J0MC5vfSBhcyB0aGUgZmlyc3QgaW5wdXQgZmlsZSBpbnN0ZWFkIG9mIHRoZSB1c3VhbCBzdGFydHVwCi1maWxlIEBmaWxle2NydDAub30uICBJbiBhZGRpdGlvbiwgeW91IHdvdWxkIHByb2JhYmx5IHdhbnQgdG8KLXNwZWNpZnkgdGhlIHByb2ZpbGluZyBDIGxpYnJhcnksIEBmaWxle2xpYmNfcC5hfSwgYnkgd3JpdGluZwotQHNhbXB7LWxjX3B9IGluc3RlYWQgb2YgdGhlIHVzdWFsIEBzYW1wey1sY30uICBUaGlzIGlzIG5vdCBhYnNvbHV0ZWx5Ci1uZWNlc3NhcnksIGJ1dCBkb2luZyB0aGlzIGdpdmVzIHlvdSBudW1iZXItb2YtY2FsbHMgaW5mb3JtYXRpb24gZm9yCi1zdGFuZGFyZCBsaWJyYXJ5IGZ1bmN0aW9ucyBzdWNoIGFzIEBjb2Rle3JlYWR9IGFuZCBAY29kZXtvcGVufS4gIEZvcgotZXhhbXBsZToKLQotQGV4YW1wbGUKLWxkIC1vIG15cHJvZyAvbGliL2djcnQwLm8gbXlwcm9nLm8gdXRpbHMubyAtbGNfcAotQGVuZCBleGFtcGxlCi0KLUlmIHlvdSBjb21waWxlIG9ubHkgc29tZSBvZiB0aGUgbW9kdWxlcyBvZiB0aGUgcHJvZ3JhbSB3aXRoIEBzYW1wey1wZ30sIHlvdQotY2FuIHN0aWxsIHByb2ZpbGUgdGhlIHByb2dyYW0sIGJ1dCB5b3Ugd29uJ3QgZ2V0IGNvbXBsZXRlIGluZm9ybWF0aW9uIGFib3V0Ci10aGUgbW9kdWxlcyB0aGF0IHdlcmUgY29tcGlsZWQgd2l0aG91dCBAc2FtcHstcGd9LiAgVGhlIG9ubHkgaW5mb3JtYXRpb24KLXlvdSBnZXQgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhvc2UgbW9kdWxlcyBpcyB0aGUgdG90YWwgdGltZSBzcGVudCBpbiB0aGVtOwotdGhlcmUgaXMgbm8gcmVjb3JkIG9mIGhvdyBtYW55IHRpbWVzIHRoZXkgd2VyZSBjYWxsZWQsIG9yIGZyb20gd2hlcmUuICBUaGlzCi13aWxsIG5vdCBhZmZlY3QgdGhlIGZsYXQgcHJvZmlsZSAoZXhjZXB0IHRoYXQgdGhlIEBjb2Rle2NhbGxzfSBmaWVsZCBmb3IKLXRoZSBmdW5jdGlvbnMgd2lsbCBiZSBibGFuayksIGJ1dCB3aWxsIGdyZWF0bHkgcmVkdWNlIHRoZSB1c2VmdWxuZXNzIG9mIHRoZQotY2FsbCBncmFwaC4KLQotSWYgeW91IHdpc2ggdG8gcGVyZm9ybSBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLAoteW91IHdpbGwgYWxzbyBuZWVkIHRvIHNwZWNpZnkgdGhlIEBzYW1wey1nfSBvcHRpb24sCi1pbnN0cnVjdGluZyB0aGUgY29tcGlsZXIgdG8gaW5zZXJ0IGRlYnVnZ2luZyBzeW1ib2xzIGludG8gdGhlIHByb2dyYW0KLXRoYXQgbWF0Y2ggcHJvZ3JhbSBhZGRyZXNzZXMgdG8gc291cmNlIGNvZGUgbGluZXMuCi1AeHJlZntMaW5lLWJ5LWxpbmV9LgotCi1JbiBhZGRpdGlvbiB0byB0aGUgQHNhbXB7LXBnfSBhbmQgQHNhbXB7LWd9IG9wdGlvbnMsCi15b3UgbWF5IGFsc28gd2lzaCB0byBzcGVjaWZ5IHRoZSBAc2FtcHstYX0gb3B0aW9uIHdoZW4gY29tcGlsaW5nLgotVGhpcyB3aWxsIGluc3RydW1lbnQKLXRoZSBwcm9ncmFtIHRvIHBlcmZvcm0gYmFzaWMtYmxvY2sgY291bnRpbmcuICBBcyB0aGUgcHJvZ3JhbSBydW5zLAotaXQgd2lsbCBjb3VudCBob3cgbWFueSB0aW1lcyBpdCBleGVjdXRlZCBlYWNoIGJyYW5jaCBvZiBlYWNoIEBzYW1we2lmfQotc3RhdGVtZW50LCBlYWNoIGl0ZXJhdGlvbiBvZiBlYWNoIEBzYW1we2RvfSBsb29wLCBldGMuICBUaGlzIHdpbGwKLWVuYWJsZSBAY29kZXtncHJvZn0gdG8gY29uc3RydWN0IGFuIGFubm90YXRlZCBzb3VyY2UgY29kZQotbGlzdGluZyBzaG93aW5nIGhvdyBtYW55IHRpbWVzIGVhY2ggbGluZSBvZiBjb2RlIHdhcyBleGVjdXRlZC4KLQotQG5vZGUgRXhlY3V0aW5nCi1AY2hhcHRlciBFeGVjdXRpbmcgdGhlIFByb2dyYW0KLQotT25jZSB0aGUgcHJvZ3JhbSBpcyBjb21waWxlZCBmb3IgcHJvZmlsaW5nLCB5b3UgbXVzdCBydW4gaXQgaW4gb3JkZXIgdG8KLWdlbmVyYXRlIHRoZSBpbmZvcm1hdGlvbiB0aGF0IEBjb2Rle2dwcm9mfSBuZWVkcy4gIFNpbXBseSBydW4gdGhlIHByb2dyYW0KLWFzIHVzdWFsLCB1c2luZyB0aGUgbm9ybWFsIGFyZ3VtZW50cywgZmlsZSBuYW1lcywgZXRjLiAgVGhlIHByb2dyYW0gc2hvdWxkCi1ydW4gbm9ybWFsbHksIHByb2R1Y2luZyB0aGUgc2FtZSBvdXRwdXQgYXMgdXN1YWwuICBJdCB3aWxsLCBob3dldmVyLCBydW4KLXNvbWV3aGF0IHNsb3dlciB0aGFuIG5vcm1hbCBiZWNhdXNlIG9mIHRoZSB0aW1lIHNwZW50IGNvbGxlY3RpbmcgYW5kIHRoZQotd3JpdGluZyB0aGUgcHJvZmlsZSBkYXRhLgotCi1UaGUgd2F5IHlvdSBydW4gdGhlIHByb2dyYW0tLS10aGUgYXJndW1lbnRzIGFuZCBpbnB1dCB0aGF0IHlvdSBnaXZlCi1pdC0tLW1heSBoYXZlIGEgZHJhbWF0aWMgZWZmZWN0IG9uIHdoYXQgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gc2hvd3MuICBUaGUKLXByb2ZpbGUgZGF0YSB3aWxsIGRlc2NyaWJlIHRoZSBwYXJ0cyBvZiB0aGUgcHJvZ3JhbSB0aGF0IHdlcmUgYWN0aXZhdGVkIGZvcgotdGhlIHBhcnRpY3VsYXIgaW5wdXQgeW91IHVzZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgZmlyc3QgY29tbWFuZCB5b3UgZ2l2ZQotdG8geW91ciBwcm9ncmFtIGlzIHRvIHF1aXQsIHRoZSBwcm9maWxlIGRhdGEgd2lsbCBzaG93IHRoZSB0aW1lIHVzZWQgaW4KLWluaXRpYWxpemF0aW9uIGFuZCBpbiBjbGVhbnVwLCBidXQgbm90IG11Y2ggZWxzZS4KLQotWW91ciBwcm9ncmFtIHdpbGwgd3JpdGUgdGhlIHByb2ZpbGUgZGF0YSBpbnRvIGEgZmlsZSBjYWxsZWQgQGZpbGV7Z21vbi5vdXR9Ci1qdXN0IGJlZm9yZSBleGl0aW5nLiAgSWYgdGhlcmUgaXMgYWxyZWFkeSBhIGZpbGUgY2FsbGVkIEBmaWxle2dtb24ub3V0fSwKLWl0cyBjb250ZW50cyBhcmUgb3ZlcndyaXR0ZW4uICBUaGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IHRvIHRlbGwgdGhlCi1wcm9ncmFtIHRvIHdyaXRlIHRoZSBwcm9maWxlIGRhdGEgdW5kZXIgYSBkaWZmZXJlbnQgbmFtZSwgYnV0IHlvdSBjYW4gcmVuYW1lCi10aGUgZmlsZSBhZnRlcndhcmQgaWYgeW91IGFyZSBjb25jZXJuZWQgdGhhdCBpdCBtYXkgYmUgb3ZlcndyaXR0ZW4uCi0KLUluIG9yZGVyIHRvIHdyaXRlIHRoZSBAZmlsZXtnbW9uLm91dH0gZmlsZSBwcm9wZXJseSwgeW91ciBwcm9ncmFtIG11c3QgZXhpdAotbm9ybWFsbHk6IGJ5IHJldHVybmluZyBmcm9tIEBjb2Rle21haW59IG9yIGJ5IGNhbGxpbmcgQGNvZGV7ZXhpdH0uICBDYWxsaW5nCi10aGUgbG93LWxldmVsIGZ1bmN0aW9uIEBjb2Rle19leGl0fSBkb2VzIG5vdCB3cml0ZSB0aGUgcHJvZmlsZSBkYXRhLCBhbmQKLW5laXRoZXIgZG9lcyBhYm5vcm1hbCB0ZXJtaW5hdGlvbiBkdWUgdG8gYW4gdW5oYW5kbGVkIHNpZ25hbC4KLQotVGhlIEBmaWxle2dtb24ub3V0fSBmaWxlIGlzIHdyaXR0ZW4gaW4gdGhlIHByb2dyYW0ncyBAZW1waHtjdXJyZW50IHdvcmtpbmcKLWRpcmVjdG9yeX0gYXQgdGhlIHRpbWUgaXQgZXhpdHMuICBUaGlzIG1lYW5zIHRoYXQgaWYgeW91ciBwcm9ncmFtIGNhbGxzCi1AY29kZXtjaGRpcn0sIHRoZSBAZmlsZXtnbW9uLm91dH0gZmlsZSB3aWxsIGJlIGxlZnQgaW4gdGhlIGxhc3QgZGlyZWN0b3J5Ci15b3VyIHByb2dyYW0gQGNvZGV7Y2hkaXJ9J2QgdG8uICBJZiB5b3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHdyaXRlIGluCi10aGlzIGRpcmVjdG9yeSwgdGhlIGZpbGUgaXMgbm90IHdyaXR0ZW4sIGFuZCB5b3Ugd2lsbCBnZXQgYW4gZXJyb3IgbWVzc2FnZS4KLQotT2xkZXIgdmVyc2lvbnMgb2YgdGhlIEBzY3tnbnV9IHByb2ZpbGluZyBsaWJyYXJ5IG1heSBhbHNvIHdyaXRlIGEgZmlsZQotY2FsbGVkIEBmaWxle2JiLm91dH0uICBUaGlzIGZpbGUsIGlmIHByZXNlbnQsIGNvbnRhaW5zIGFuIGh1bWFuLXJlYWRhYmxlCi1saXN0aW5nIG9mIHRoZSBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzLiAgVW5mb3J0dW5hdGVseSwgdGhlCi1hcHBlYXJhbmNlIG9mIGEgaHVtYW4tcmVhZGFibGUgQGZpbGV7YmIub3V0fSBtZWFucyB0aGUgYmFzaWMtYmxvY2sKLWNvdW50cyBkaWRuJ3QgZ2V0IHdyaXR0ZW4gaW50byBAZmlsZXtnbW9uLm91dH0uCi1UaGUgUGVybCBzY3JpcHQgQGNvZGV7YmJjb252LnBsfSwgaW5jbHVkZWQgd2l0aCB0aGUgQGNvZGV7Z3Byb2Z9Ci1zb3VyY2UgZGlzdHJpYnV0aW9uLCB3aWxsIGNvbnZlcnQgYSBAZmlsZXtiYi5vdXR9IGZpbGUgaW50bwotYSBmb3JtYXQgcmVhZGFibGUgYnkgQGNvZGV7Z3Byb2Z9LgotCi1Abm9kZSBJbnZva2luZwotQGNoYXB0ZXIgQGNvZGV7Z3Byb2Z9IENvbW1hbmQgU3VtbWFyeQotCi1BZnRlciB5b3UgaGF2ZSBhIHByb2ZpbGUgZGF0YSBmaWxlIEBmaWxle2dtb24ub3V0fSwgeW91IGNhbiBydW4gQGNvZGV7Z3Byb2Z9Ci10byBpbnRlcnByZXQgdGhlIGluZm9ybWF0aW9uIGluIGl0LiAgVGhlIEBjb2Rle2dwcm9mfSBwcm9ncmFtIHByaW50cyBhCi1mbGF0IHByb2ZpbGUgYW5kIGEgY2FsbCBncmFwaCBvbiBzdGFuZGFyZCBvdXRwdXQuICBUeXBpY2FsbHkgeW91IHdvdWxkCi1yZWRpcmVjdCB0aGUgb3V0cHV0IG9mIEBjb2Rle2dwcm9mfSBpbnRvIGEgZmlsZSB3aXRoIEBzYW1wez59LgotCi1Zb3UgcnVuIEBjb2Rle2dwcm9mfSBsaWtlIHRoaXM6Ci0KLUBzbWFsbGV4YW1wbGUKLWdwcm9mIEB2YXJ7b3B0aW9uc30gW0B2YXJ7ZXhlY3V0YWJsZS1maWxlfSBbQHZhcntwcm9maWxlLWRhdGEtZmlsZXN9QGRvdHN7fV1dIFs+IEB2YXJ7b3V0ZmlsZX1dCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLUhlcmUgc3F1YXJlLWJyYWNrZXRzIGluZGljYXRlIG9wdGlvbmFsIGFyZ3VtZW50cy4KLQotSWYgeW91IG9taXQgdGhlIGV4ZWN1dGFibGUgZmlsZSBuYW1lLCB0aGUgZmlsZSBAZmlsZXthLm91dH0gaXMgdXNlZC4gIElmCi15b3UgZ2l2ZSBubyBwcm9maWxlIGRhdGEgZmlsZSBuYW1lLCB0aGUgZmlsZSBAZmlsZXtnbW9uLm91dH0gaXMgdXNlZC4gIElmCi1hbnkgZmlsZSBpcyBub3QgaW4gdGhlIHByb3BlciBmb3JtYXQsIG9yIGlmIHRoZSBwcm9maWxlIGRhdGEgZmlsZSBkb2VzIG5vdAotYXBwZWFyIHRvIGJlbG9uZyB0byB0aGUgZXhlY3V0YWJsZSBmaWxlLCBhbiBlcnJvciBtZXNzYWdlIGlzIHByaW50ZWQuCi0KLVlvdSBjYW4gZ2l2ZSBtb3JlIHRoYW4gb25lIHByb2ZpbGUgZGF0YSBmaWxlIGJ5IGVudGVyaW5nIGFsbCB0aGVpciBuYW1lcwotYWZ0ZXIgdGhlIGV4ZWN1dGFibGUgZmlsZSBuYW1lOyB0aGVuIHRoZSBzdGF0aXN0aWNzIGluIGFsbCB0aGUgZGF0YSBmaWxlcwotYXJlIHN1bW1lZCB0b2dldGhlci4KLQotVGhlIG9yZGVyIG9mIHRoZXNlIG9wdGlvbnMgZG9lcyBub3QgbWF0dGVyLgotCi1AbWVudQotKiBPdXRwdXQgT3B0aW9uczo6ICAgICAgQ29udHJvbGxpbmcgQGNvZGV7Z3Byb2Z9J3Mgb3V0cHV0IHN0eWxlCi0qIEFuYWx5c2lzIE9wdGlvbnM6OiAgICBDb250cm9sbGluZyBob3cgQGNvZGV7Z3Byb2Z9IGFuYWx5c2VzIGl0cyBkYXRhCi0qIE1pc2NlbGxhbmVvdXMgT3B0aW9uczo6Ci0qIERlcHJpY2F0ZWQgT3B0aW9uczo6ICBPcHRpb25zIHlvdSBubyBsb25nZXIgbmVlZCB0byB1c2UsIGJ1dCB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgYmVlbiByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eQotKiBTeW1zcGVjczo6ICAgICAgICAgICAgU3BlY2lmeWluZyBmdW5jdGlvbnMgdG8gaW5jbHVkZSBvciBleGNsdWRlCi1AZW5kIG1lbnUKLQotQG5vZGUgT3V0cHV0IE9wdGlvbnMsQW5hbHlzaXMgT3B0aW9ucywsSW52b2tpbmcKLUBzZWN0aW9uIE91dHB1dCBPcHRpb25zCi0KLVRoZXNlIG9wdGlvbnMgc3BlY2lmeSB3aGljaCBvZiBzZXZlcmFsIG91dHB1dCBmb3JtYXRzCi1AY29kZXtncHJvZn0gc2hvdWxkIHByb2R1Y2UuCi0KLU1hbnkgb2YgdGhlc2Ugb3B0aW9ucyB0YWtlIGFuIG9wdGlvbmFsIEBkZm57c3ltc3BlY30gdG8gc3BlY2lmeQotZnVuY3Rpb25zIHRvIGJlIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkLiAgVGhlc2Ugb3B0aW9ucyBjYW4gYmUKLXNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgd2l0aCBkaWZmZXJlbnQgc3ltc3BlY3MsIHRvIGluY2x1ZGUKLW9yIGV4Y2x1ZGUgc2V0cyBvZiBzeW1ib2xzLiAgQHhyZWZ7U3ltc3BlY3N9LgotCi1TcGVjaWZ5aW5nIGFueSBvZiB0aGVzZSBvcHRpb25zIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCAoQHNhbXB7LXAgLXF9KSwKLXdoaWNoIHByaW50cyBhIGZsYXQgcHJvZmlsZSBhbmQgY2FsbCBncmFwaCBhbmFseXNpcwotZm9yIGFsbCBmdW5jdGlvbnMuCi0KLUB0YWJsZSBAY29kZQotCi1AaXRlbSAtQVtAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tYW5ub3RhdGVkLXNvdXJjZVs9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstQX0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gcHJpbnQgYW5ub3RhdGVkIHNvdXJjZSBjb2RlLgotSWYgQHZhcntzeW1zcGVjfSBpcyBzcGVjaWZpZWQsIHByaW50IG91dHB1dCBvbmx5IGZvciBtYXRjaGluZyBzeW1ib2xzLgotQHhyZWZ7QW5ub3RhdGVkIFNvdXJjZX0uCi0KLUBpdGVtIC1iCi1AaXRlbXggLS1icmllZgotSWYgdGhlIEBzYW1wey1ifSBvcHRpb24gaXMgZ2l2ZW4sIEBjb2Rle2dwcm9mfSBkb2Vzbid0IHByaW50IHRoZQotdmVyYm9zZSBibHVyYnMgdGhhdCB0cnkgdG8gZXhwbGFpbiB0aGUgbWVhbmluZyBvZiBhbGwgb2YgdGhlIGZpZWxkcyBpbgotdGhlIHRhYmxlcy4gIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBpbnRlbmQgdG8gcHJpbnQgb3V0IHRoZSBvdXRwdXQsIG9yCi1hcmUgdGlyZWQgb2Ygc2VlaW5nIHRoZSBibHVyYnMuCi0KLUBpdGVtIC1DW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1leGVjLWNvdW50c1s9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstQ30gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8KLXByaW50IGEgdGFsbHkgb2YgZnVuY3Rpb25zIGFuZCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggd2FzIGNhbGxlZC4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCB0YWxseSBvbmx5IGZvciBtYXRjaGluZyBzeW1ib2xzLgotCi1JZiB0aGUgcHJvZmlsZSBkYXRhIGZpbGUgY29udGFpbnMgYmFzaWMtYmxvY2sgY291bnQgcmVjb3Jkcywgc3BlY2lmaW5nCi10aGUgQHNhbXB7LWx9IG9wdGlvbiwgYWxvbmcgd2l0aCBAc2FtcHstQ30sIHdpbGwgY2F1c2UgYmFzaWMtYmxvY2sKLWV4ZWN1dGlvbiBjb3VudHMgdG8gYmUgdGFsbGllZCBhbmQgZGlzcGxheWVkLgotCi1AaXRlbSAtaQotQGl0ZW14IC0tZmlsZS1pbmZvCi1UaGUgQHNhbXB7LWl9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIGRpc3BsYXkgc3VtbWFyeSBpbmZvcm1hdGlvbgotYWJvdXQgdGhlIHByb2ZpbGUgZGF0YSBmaWxlKHMpIGFuZCB0aGVuIGV4aXQuICBUaGUgbnVtYmVyIG9mIGhpc3RvZ3JhbSwKLWNhbGwgZ3JhcGgsIGFuZCBiYXNpYy1ibG9jayBjb3VudCByZWNvcmRzIGlzIGRpc3BsYXllZC4KLQotQGl0ZW0gLUkgQHZhcntkaXJzfQotQGl0ZW14IC0tZGlyZWN0b3J5LXBhdGg9QHZhcntkaXJzfQotVGhlIEBzYW1wey1JfSBvcHRpb24gc3BlY2lmaWVzIGEgbGlzdCBvZiBzZWFyY2ggZGlyZWN0b3JpZXMgaW4KLXdoaWNoIHRvIGZpbmQgc291cmNlIGZpbGVzLiAgRW52aXJvbm1lbnQgdmFyaWFibGUgQHZhcntHUFJPRl9QQVRIfQotY2FuIGFsc28gYmUgdXNlZCB0byBjb252ZXJ5IHRoaXMgaW5mb3JtYXRpb24uCi1Vc2VkIG1vc3RseSBmb3IgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQuCi0KLUBpdGVtIC1KW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1uby1hbm5vdGF0ZWQtc291cmNlWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1KfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSBub3QgdG8KLXByaW50IGFubm90YXRlZCBzb3VyY2UgY29kZS4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBAY29kZXtncHJvZn0gcHJpbnRzIGFubm90YXRlZCBzb3VyY2UsCi1idXQgZXhjbHVkZXMgbWF0Y2hpbmcgc3ltYm9scy4KLQotQGl0ZW0gLUwKLUBpdGVteCAtLXByaW50LXBhdGgKLU5vcm1hbGx5LCBzb3VyY2UgZmlsZW5hbWVzIGFyZSBwcmludGVkIHdpdGggdGhlIHBhdGgKLWNvbXBvbmVudCBzdXBwcmVzc2VkLiAgVGhlIEBzYW1wey1MfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfQotdG8gcHJpbnQgdGhlIGZ1bGwgcGF0aG5hbWUgb2YKLXNvdXJjZSBmaWxlbmFtZXMsIHdoaWNoIGlzIGRldGVybWluZWQKLWZyb20gc3ltYm9saWMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGluIHRoZSBpbWFnZSBmaWxlCi1hbmQgaXMgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29tcGlsZXIKLXdhcyBpbnZva2VkLgotCi1AaXRlbSAtcFtAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tZmxhdC1wcm9maWxlWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1wfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCBhIGZsYXQgcHJvZmlsZS4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCBmbGF0IHByb2ZpbGUgb25seSBmb3IgbWF0Y2hpbmcgc3ltYm9scy4KLUB4cmVme0ZsYXQgUHJvZmlsZX0uCi0KLUBpdGVtIC1QW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1uby1mbGF0LXByb2ZpbGVbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LVB9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHN1cHByZXNzIHByaW50aW5nIGEgZmxhdCBwcm9maWxlLgotSWYgQHZhcntzeW1zcGVjfSBpcyBzcGVjaWZpZWQsIEBjb2Rle2dwcm9mfSBwcmludHMgYSBmbGF0IHByb2ZpbGUsCi1idXQgZXhjbHVkZXMgbWF0Y2hpbmcgc3ltYm9scy4KLQotQGl0ZW0gLXFbQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLWdyYXBoWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1xfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCB0aGUgY2FsbCBncmFwaCBhbmFseXNpcy4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCBjYWxsIGdyYXBoIG9ubHkgZm9yIG1hdGNoaW5nIHN5bWJvbHMKLWFuZCB0aGVpciBjaGlsZHJlbi4KLUB4cmVme0NhbGwgR3JhcGh9LgotCi1AaXRlbSAtUVtAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tbm8tZ3JhcGhbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LVF9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHN1cHByZXNzIHByaW50aW5nIHRoZQotY2FsbCBncmFwaC4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBAY29kZXtncHJvZn0gcHJpbnRzIGEgY2FsbCBncmFwaCwKLWJ1dCBleGNsdWRlcyBtYXRjaGluZyBzeW1ib2xzLgotCi1AaXRlbSAteQotQGl0ZW14IC0tc2VwYXJhdGUtZmlsZXMKLVRoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQgb25seS4KLU5vcm1hbGx5LCBncHJvZiBwcmludHMgYW5ub3RhdGVkIHNvdXJjZSBmaWxlcwotdG8gc3RhbmRhcmQtb3V0cHV0LiAgSWYgdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkLAotYW5ub3RhdGVkIHNvdXJjZSBmb3IgYSBmaWxlIG5hbWVkIEBmaWxle3BhdGgvZmlsZW5hbWV9Ci1pcyBnZW5lcmF0ZWQgaW4gdGhlIGZpbGUgQGZpbGV7ZmlsZW5hbWUtYW5ufS4KLQotQGl0ZW0gLVpbQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLW5vLWV4ZWMtY291bnRzWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1afSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSBub3QgdG8KLXByaW50IGEgdGFsbHkgb2YgZnVuY3Rpb25zIGFuZCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggd2FzIGNhbGxlZC4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCB0YWxseSwgYnV0IGV4Y2x1ZGUgbWF0Y2hpbmcgc3ltYm9scy4KLQotQGl0ZW0gLS1mdW5jdGlvbi1vcmRlcmluZwotVGhlIEBzYW1wey0tZnVuY3Rpb24tb3JkZXJpbmd9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHByaW50IGEKLXN1Z2dlc3RlZCBmdW5jdGlvbiBvcmRlcmluZyBmb3IgdGhlIHByb2dyYW0gYmFzZWQgb24gcHJvZmlsaW5nIGRhdGEuCi1UaGlzIG9wdGlvbiBzdWdnZXN0cyBhbiBvcmRlcmluZyB3aGljaCBtYXkgaW1wcm92ZSBwYWdpbmcsIHRsYiBhbmQKLWNhY2hlIGJlaGF2aW9yIGZvciB0aGUgcHJvZ3JhbSBvbiBzeXN0ZW1zIHdoaWNoIHN1cHBvcnQgYXJiaXRyYXJ5Ci1vcmRlcmluZyBvZiBmdW5jdGlvbnMgaW4gYW4gZXhlY3V0YWJsZS4KLQotVGhlIGV4YWN0IGRldGFpbHMgb2YgaG93IHRvIGZvcmNlIHRoZSBsaW5rZXIgdG8gcGxhY2UgZnVuY3Rpb25zCi1pbiBhIHBhcnRpY3VsYXIgb3JkZXIgaXMgc3lzdGVtIGRlcGVuZGVudCBhbmQgb3V0IG9mIHRoZSBzY29wZSBvZiB0aGlzCi1tYW51YWwuCi0KLUBpdGVtIC0tZmlsZS1vcmRlcmluZyBAdmFye21hcF9maWxlfQotVGhlIEBzYW1wey0tZmlsZS1vcmRlcmluZ30gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gcHJpbnQgYQotc3VnZ2VzdGVkIC5vIGxpbmsgbGluZSBvcmRlcmluZyBmb3IgdGhlIHByb2dyYW0gYmFzZWQgb24gcHJvZmlsaW5nIGRhdGEuCi1UaGlzIG9wdGlvbiBzdWdnZXN0cyBhbiBvcmRlcmluZyB3aGljaCBtYXkgaW1wcm92ZSBwYWdpbmcsIHRsYiBhbmQKLWNhY2hlIGJlaGF2aW9yIGZvciB0aGUgcHJvZ3JhbSBvbiBzeXN0ZW1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IGFyYml0cmFyeQotb3JkZXJpbmcgb2YgZnVuY3Rpb25zIGluIGFuIGV4ZWN1dGFibGUuCi0KLVVzZSBvZiB0aGUgQHNhbXB7LWF9IGFyZ3VtZW50IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB3aXRoIHRoaXMgb3B0aW9uLgotCi1UaGUgQHZhcnttYXBfZmlsZX0gYXJndW1lbnQgaXMgYSBwYXRobmFtZSB0byBhIGZpbGUgd2hpY2ggcHJvdmlkZXMKLWZ1bmN0aW9uIG5hbWUgdG8gb2JqZWN0IGZpbGUgbWFwcGluZ3MuICBUaGUgZm9ybWF0IG9mIHRoZSBmaWxlIGlzIHNpbWlsYXIgdG8KLXRoZSBvdXRwdXQgb2YgdGhlIHByb2dyYW0gQGNvZGV7bm19LgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLWMtcGFyc2UubzowMDAwMDAwMCBUIHl5cGFyc2UKLWMtcGFyc2UubzowMDAwMDAwNCBDIHl5ZXJyZmxhZwotYy1sYW5nLm86MDAwMDAwMDAgVCBtYXliZV9vYmpjX21ldGhvZF9uYW1lCi1jLWxhbmcubzowMDAwMDAwMCBUIHByaW50X2xhbmdfc3RhdGlzdGljcwotYy1sYW5nLm86MDAwMDAwMDAgVCByZWNvZ25pemVfb2JqY19rZXl3b3JkCi1jLWRlY2wubzowMDAwMDAwMCBUIHByaW50X2xhbmdfaWRlbnRpZmllcgotYy1kZWNsLm86MDAwMDAwMDAgVCBwcmludF9sYW5nX3R5cGUKLUBkb3Rze30KLQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotR05VIEBjb2Rle25tfSBAc2FtcHstLWV4dGVybi1vbmx5fSBAc2FtcHstLWRlZmluZWQtb25seX0gQHNhbXB7LXZ9IEBzYW1wey0tcHJpbnQtZmlsZS1uYW1lfSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgQHZhcnttYXBfZmlsZX0uCi0KLUBpdGVtIC1UCi1AaXRlbXggLS10cmFkaXRpb25hbAotVGhlIEBzYW1wey1UfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCBpdHMgb3V0cHV0IGluCi1gYHRyYWRpdGlvbmFsJycgQlNEIHN0eWxlLgotCi1AaXRlbSAtdyBAdmFye3dpZHRofQotQGl0ZW14IC0td2lkdGg9QHZhcnt3aWR0aH0KLVNldHMgd2lkdGggb2Ygb3V0cHV0IGxpbmVzIHRvIEB2YXJ7d2lkdGh9LgotQ3VycmVudGx5IG9ubHkgdXNlZCB3aGVuIHByaW50aW5nIHRoZSBmdW5jdGlvbiBpbmRleCBhdCB0aGUgYm90dG9tCi1vZiB0aGUgY2FsbCBncmFwaC4KLQotQGl0ZW0gLXgKLUBpdGVteCAtLWFsbC1saW5lcwotVGhpcyBvcHRpb24gYWZmZWN0cyBhbm5vdGF0ZWQgc291cmNlIG91dHB1dCBvbmx5LgotQnkgZGVmYXVsdCwgb25seSB0aGUgbGluZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJhc2ljLWJsb2NrCi1hcmUgYW5ub3RhdGVkLiAgSWYgdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkLCBldmVyeSBsaW5lIGluCi1hIGJhc2ljLWJsb2NrIGlzIGFubm90YXRlZCBieSByZXBlYXRpbmcgdGhlIGFubm90YXRpb24gZm9yIHRoZQotZmlyc3QgbGluZS4gIFRoaXMgYmVoYXZpb3IgaXMgc2ltaWxhciB0byBAY29kZXt0Y292fSdzIEBzYW1wey1hfS4KLQotQGl0ZW0gLS1kZW1hbmdsZQotQGl0ZW14IC0tbm8tZGVtYW5nbGUKLVRoZXNlIG9wdGlvbnMgY29udHJvbCB3aGV0aGVyIEMrKyBzeW1ib2wgbmFtZXMgc2hvdWxkIGJlIGRlbWFuZ2xlZCB3aGVuCi1wcmludGluZyBvdXRwdXQuICBUaGUgZGVmYXVsdCBpcyB0byBkZW1hbmdsZSBzeW1ib2xzLiAgVGhlCi1AY29kZXstLW5vLWRlbWFuZ2xlfSBvcHRpb24gbWF5IGJlIHVzZWQgdG8gdHVybiBvZmYgZGVtYW5nbGluZy4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSBBbmFseXNpcyBPcHRpb25zLE1pc2NlbGxhbmVvdXMgT3B0aW9ucyxPdXRwdXQgT3B0aW9ucyxJbnZva2luZwotQHNlY3Rpb24gQW5hbHlzaXMgT3B0aW9ucwotCi1AdGFibGUgQGNvZGUKLQotQGl0ZW0gLWEKLUBpdGVteCAtLW5vLXN0YXRpYwotVGhlIEBzYW1wey1hfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBzdXBwcmVzcyB0aGUgcHJpbnRpbmcgb2YKLXN0YXRpY2FsbHkgZGVjbGFyZWQgKHByaXZhdGUpIGZ1bmN0aW9ucy4gIChUaGVzZSBhcmUgZnVuY3Rpb25zIHdob3NlCi1uYW1lcyBhcmUgbm90IGxpc3RlZCBhcyBnbG9iYWwsIGFuZCB3aGljaCBhcmUgbm90IHZpc2libGUgb3V0c2lkZSB0aGUKLWZpbGUvZnVuY3Rpb24vYmxvY2sgd2hlcmUgdGhleSB3ZXJlIGRlZmluZWQuKSAgVGltZSBzcGVudCBpbiB0aGVzZQotZnVuY3Rpb25zLCBjYWxscyB0by9mcm9tIHRoZW0sIGV0Yywgd2lsbCBhbGwgYmUgYXR0cmlidXRlZCB0byB0aGUKLWZ1bmN0aW9uIHRoYXQgd2FzIGxvYWRlZCBkaXJlY3RseSBiZWZvcmUgaXQgaW4gdGhlIGV4ZWN1dGFibGUgZmlsZS4KLUBjIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIFVuaXggQGNvZGV7Z3Byb2Z9LCBidXQgYSBiYWQgaWRlYS4gIAotVGhpcyBvcHRpb24gYWZmZWN0cyBib3RoIHRoZSBmbGF0IHByb2ZpbGUgYW5kIHRoZSBjYWxsIGdyYXBoLgotCi1AaXRlbSAtYwotQGl0ZW14IC0tc3RhdGljLWNhbGwtZ3JhcGgKLVRoZSBAc2FtcHstY30gb3B0aW9uIGNhdXNlcyB0aGUgY2FsbCBncmFwaCBvZiB0aGUgcHJvZ3JhbSB0byBiZQotYXVnbWVudGVkIGJ5IGEgaGV1cmlzdGljIHdoaWNoIGV4YW1pbmVzIHRoZSB0ZXh0IHNwYWNlIG9mIHRoZSBvYmplY3QKLWZpbGUgYW5kIGlkZW50aWZpZXMgZnVuY3Rpb24gY2FsbHMgaW4gdGhlIGJpbmFyeSBtYWNoaW5lIGNvZGUuCi1TaW5jZSBub3JtYWwgY2FsbCBncmFwaCByZWNvcmRzIGFyZSBvbmx5IGdlbmVyYXRlZCB3aGVuIGZ1bmN0aW9ucyBhcmUKLWVudGVyZWQsIHRoaXMgb3B0aW9uIGlkZW50aWZpZXMgY2hpbGRyZW4gdGhhdCBjb3VsZCBoYXZlIGJlZW4gY2FsbGVkLAotYnV0IG5ldmVyIHdlcmUuICBDYWxscyB0byBmdW5jdGlvbnMgdGhhdCB3ZXJlIG5vdCBjb21waWxlZCB3aXRoCi1wcm9maWxpbmcgZW5hYmxlZCBhcmUgYWxzbyBpZGVudGlmaWVkLCBidXQgb25seSBpZiBzeW1ib2wgdGFibGUKLWVudHJpZXMgYXJlIHByZXNlbnQgZm9yIHRoZW0uCi1DYWxscyB0byBkeW5hbWljIGxpYnJhcnkgcm91dGluZXMgYXJlIHR5cGljYWxseSBAZW1waHtub3R9IGZvdW5kCi1ieSB0aGlzIG9wdGlvbi4KLVBhcmVudHMgb3IgY2hpbGRyZW4gaWRlbnRpZmllZCB2aWEgdGhpcyBoZXVyaXN0aWMKLWFyZSBpbmRpY2F0ZWQgaW4gdGhlIGNhbGwgZ3JhcGggd2l0aCBjYWxsIGNvdW50cyBvZiBAc2FtcHswfS4KLQotQGl0ZW0gLUQKLUBpdGVteCAtLWlnbm9yZS1ub24tZnVuY3Rpb25zCi1UaGUgQHNhbXB7LUR9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIGlnbm9yZSBzeW1ib2xzIHdoaWNoCi1hcmUgbm90IGtub3duIHRvIGJlIGZ1bmN0aW9ucy4gIFRoaXMgb3B0aW9uIHdpbGwgZ2l2ZSBtb3JlIGFjY3VyYXRlCi1wcm9maWxlIGRhdGEgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBzdXBwb3J0ZWQgKFNvbGFyaXMgYW5kIEhQVVggZm9yCi1leGFtcGxlKS4KLQotQGl0ZW0gLWsgQHZhcntmcm9tfS9AdmFye3RvfQotVGhlIEBzYW1wey1rfSBvcHRpb24gYWxsb3dzIHlvdSB0byBkZWxldGUgZnJvbSB0aGUgY2FsbCBncmFwaCBhbnkgYXJjcyBmcm9tCi1zeW1ib2xzIG1hdGNoaW5nIHN5bXNwZWMgQHZhcntmcm9tfSB0byB0aG9zZSBtYXRjaGluZyBzeW1zcGVjIEB2YXJ7dG99LgotCi1AaXRlbSAtbAotQGl0ZW14IC0tbGluZQotVGhlIEBzYW1wey1sfSBvcHRpb24gZW5hYmxlcyBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLCB3aGljaCBjYXVzZXMKLWhpc3RvZ3JhbSBoaXRzIHRvIGJlIGNoYXJnZWQgdG8gaW5kaXZpZHVhbCBzb3VyY2UgY29kZSBsaW5lcywKLWluc3RlYWQgb2YgZnVuY3Rpb25zLgotSWYgdGhlIHByb2dyYW0gd2FzIGNvbXBpbGVkIHdpdGggYmFzaWMtYmxvY2sgY291bnRpbmcgZW5hYmxlZCwKLXRoaXMgb3B0aW9uIHdpbGwgYWxzbyBpZGVudGlmeSBob3cgbWFueSB0aW1lcyBlYWNoIGxpbmUgb2YKLWNvZGUgd2FzIGV4ZWN1dGVkLgotV2hpbGUgbGluZS1ieS1saW5lIHByb2ZpbGluZyBjYW4gaGVscCBpc29sYXRlIHdoZXJlIGluIGEgbGFyZ2UgZnVuY3Rpb24KLWEgcHJvZ3JhbSBpcyBzcGVuZGluZyBpdHMgdGltZSwgaXQgYWxzbyBzaWduaWZpY2FudGx5IGluY3JlYXNlcwotdGhlIHJ1bm5pbmcgdGltZSBvZiBAY29kZXtncHJvZn0sIGFuZCBtYWduaWZpZXMgc3RhdGlzdGljYWwKLWluYWNjdXJhY2llcy4KLUB4cmVme1NhbXBsaW5nIEVycm9yfS4KLQotQGl0ZW0gLW0gQHZhcntudW19Ci1AaXRlbXggLS1taW4tY291bnQ9QHZhcntudW19Ci1UaGlzIG9wdGlvbiBhZmZlY3RzIGV4ZWN1dGlvbiBjb3VudCBvdXRwdXQgb25seS4KLVN5bWJvbHMgdGhhdCBhcmUgZXhlY3V0ZWQgbGVzcyB0aGFuIEB2YXJ7bnVtfSB0aW1lcyBhcmUgc3VwcHJlc3NlZC4KLQotQGl0ZW0gLW5bQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLXRpbWVbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LW59IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9LCBpbiBpdHMgY2FsbCBncmFwaCBhbmFseXNpcywKLXRvIG9ubHkgcHJvcGFnYXRlIHRpbWVzIGZvciBzeW1ib2xzIG1hdGNoaW5nIEB2YXJ7c3ltc3BlY30uCi0KLUBpdGVtIC1OW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1uby10aW1lWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1ufSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSwgaW4gaXRzIGNhbGwgZ3JhcGggYW5hbHlzaXMsCi1ub3QgdG8gcHJvcGFnYXRlIHRpbWVzIGZvciBzeW1ib2xzIG1hdGNoaW5nIEB2YXJ7c3ltc3BlY30uCi0KLUBpdGVtIC16Ci1AaXRlbXggLS1kaXNwbGF5LXVudXNlZC1mdW5jdGlvbnMKLUlmIHlvdSBnaXZlIHRoZSBAc2FtcHsten0gb3B0aW9uLCBAY29kZXtncHJvZn0gd2lsbCBtZW50aW9uIGFsbAotZnVuY3Rpb25zIGluIHRoZSBmbGF0IHByb2ZpbGUsIGV2ZW4gdGhvc2UgdGhhdCB3ZXJlIG5ldmVyIGNhbGxlZCwgYW5kCi10aGF0IGhhZCBubyB0aW1lIHNwZW50IGluIHRoZW0uICBUaGlzIGlzIHVzZWZ1bCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQotQHNhbXB7LWN9IG9wdGlvbiBmb3IgZGlzY292ZXJpbmcgd2hpY2ggcm91dGluZXMgd2VyZSBuZXZlciBjYWxsZWQuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgTWlzY2VsbGFuZW91cyBPcHRpb25zLERlcHJpY2F0ZWQgT3B0aW9ucyxBbmFseXNpcyBPcHRpb25zLEludm9raW5nCi1Ac2VjdGlvbiBNaXNjZWxsYW5lb3VzIE9wdGlvbnMKLQotQHRhYmxlIEBjb2RlCi0KLUBpdGVtIC1kW0B2YXJ7bnVtfV0KLUBpdGVteCAtLWRlYnVnWz1AdmFye251bX1dCi1UaGUgQHNhbXB7LWQgQHZhcntudW19fSBvcHRpb24gc3BlY2lmaWVzIGRlYnVnZ2luZyBvcHRpb25zLgotSWYgQHZhcntudW19IGlzIG5vdCBzcGVjaWZpZWQsIGVuYWJsZSBhbGwgZGVidWdnaW5nLgotQHhyZWZ7RGVidWdnaW5nfS4KLQotQGl0ZW0gLU9AdmFye25hbWV9Ci1AaXRlbXggLS1maWxlLWZvcm1hdD1AdmFye25hbWV9Ci1TZWxlY3RzIHRoZSBmb3JtYXQgb2YgdGhlIHByb2ZpbGUgZGF0YSBmaWxlcy4gIFJlY29nbml6ZWQgZm9ybWF0cyBhcmUKLUBzYW1we2F1dG99ICh0aGUgZGVmYXVsdCksIEBzYW1we2JzZH0sIEBzYW1wezQuNGJzZH0sIEBzYW1we21hZ2ljfSwgYW5kCi1Ac2FtcHtwcm9mfSAobm90IHlldCBzdXBwb3J0ZWQpLgotCi1AaXRlbSAtcwotQGl0ZW14IC0tc3VtCi1UaGUgQHNhbXB7LXN9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHN1bW1hcml6ZSB0aGUgaW5mb3JtYXRpb24KLWluIHRoZSBwcm9maWxlIGRhdGEgZmlsZXMgaXQgcmVhZCBpbiwgYW5kIHdyaXRlIG91dCBhIHByb2ZpbGUgZGF0YQotZmlsZSBjYWxsZWQgQGZpbGV7Z21vbi5zdW19LCB3aGljaCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIGZyb20KLXRoZSBwcm9maWxlIGRhdGEgZmlsZXMgdGhhdCBAY29kZXtncHJvZn0gcmVhZCBpbi4gIFRoZSBmaWxlIEBmaWxle2dtb24uc3VtfQotbWF5IGJlIG9uZSBvZiB0aGUgc3BlY2lmaWVkIGlucHV0IGZpbGVzOyB0aGUgZWZmZWN0IG9mIHRoaXMgaXMgdG8KLW1lcmdlIHRoZSBkYXRhIGluIHRoZSBvdGhlciBpbnB1dCBmaWxlcyBpbnRvIEBmaWxle2dtb24uc3VtfS4KLQotRXZlbnR1YWxseSB5b3UgY2FuIHJ1biBAY29kZXtncHJvZn0gYWdhaW4gd2l0aG91dCBAc2FtcHstc30gdG8gYW5hbHl6ZSB0aGUKLWN1bXVsYXRpdmUgZGF0YSBpbiB0aGUgZmlsZSBAZmlsZXtnbW9uLnN1bX0uCi0KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJzaW9uCi1UaGUgQHNhbXB7LXZ9IGZsYWcgY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCB0aGUgY3VycmVudCB2ZXJzaW9uCi1udW1iZXIsIGFuZCB0aGVuIGV4aXQuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgRGVwcmljYXRlZCBPcHRpb25zLFN5bXNwZWNzLE1pc2NlbGxhbmVvdXMgT3B0aW9ucyxJbnZva2luZwotQHNlY3Rpb24gRGVwcmljYXRlZCBPcHRpb25zCi0KLUB0YWJsZSBAY29kZQotCi1UaGVzZSBvcHRpb25zIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIG5ld2VyIHZlcnNpb25zIHRoYXQgdXNlIHN5bXNwZWNzLgotCi1AaXRlbSAtZSBAdmFye2Z1bmN0aW9uX25hbWV9Ci1UaGUgQHNhbXB7LWUgQHZhcntmdW5jdGlvbn19IG9wdGlvbiB0ZWxscyBAY29kZXtncHJvZn0gdG8gbm90IHByaW50Ci1pbmZvcm1hdGlvbiBhYm91dCB0aGUgZnVuY3Rpb24gQHZhcntmdW5jdGlvbl9uYW1lfSAoYW5kIGl0cwotY2hpbGRyZW5AZG90c3t9KSBpbiB0aGUgY2FsbCBncmFwaC4gIFRoZSBmdW5jdGlvbiB3aWxsIHN0aWxsIGJlIGxpc3RlZAotYXMgYSBjaGlsZCBvZiBhbnkgZnVuY3Rpb25zIHRoYXQgY2FsbCBpdCwgYnV0IGl0cyBpbmRleCBudW1iZXIgd2lsbCBiZQotc2hvd24gYXMgQHNhbXB7W25vdCBwcmludGVkXX0uICBNb3JlIHRoYW4gb25lIEBzYW1wey1lfSBvcHRpb24gbWF5IGJlCi1naXZlbjsgb25seSBvbmUgQHZhcntmdW5jdGlvbl9uYW1lfSBtYXkgYmUgaW5kaWNhdGVkIHdpdGggZWFjaCBAc2FtcHstZX0KLW9wdGlvbi4gCi0KLUBpdGVtIC1FIEB2YXJ7ZnVuY3Rpb25fbmFtZX0KLVRoZSBAY29kZXstRSBAdmFye2Z1bmN0aW9ufX0gb3B0aW9uIHdvcmtzIGxpa2UgdGhlIEBjb2Rley1lfSBvcHRpb24sIGJ1dAotdGltZSBzcGVudCBpbiB0aGUgZnVuY3Rpb24gKGFuZCBjaGlsZHJlbiB3aG8gd2VyZSBub3QgY2FsbGVkIGZyb20KLWFueXdoZXJlIGVsc2UpLCB3aWxsIG5vdCBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIHBlcmNlbnRhZ2VzLW9mLXRpbWUgZm9yCi10aGUgY2FsbCBncmFwaC4gIE1vcmUgdGhhbiBvbmUgQHNhbXB7LUV9IG9wdGlvbiBtYXkgYmUgZ2l2ZW47IG9ubHkgb25lCi1AdmFye2Z1bmN0aW9uX25hbWV9IG1heSBiZSBpbmRpY2F0ZWQgd2l0aCBlYWNoIEBzYW1wey1FfSBvcHRpb24uCi0KLUBpdGVtIC1mIEB2YXJ7ZnVuY3Rpb25fbmFtZX0KLVRoZSBAc2FtcHstZiBAdmFye2Z1bmN0aW9ufX0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gbGltaXQgdGhlCi1jYWxsIGdyYXBoIHRvIHRoZSBmdW5jdGlvbiBAdmFye2Z1bmN0aW9uX25hbWV9IGFuZCBpdHMgY2hpbGRyZW4gKGFuZAotdGhlaXIgY2hpbGRyZW5AZG90c3t9KS4gIE1vcmUgdGhhbiBvbmUgQHNhbXB7LWZ9IG9wdGlvbiBtYXkgYmUgZ2l2ZW47Ci1vbmx5IG9uZSBAdmFye2Z1bmN0aW9uX25hbWV9IG1heSBiZSBpbmRpY2F0ZWQgd2l0aCBlYWNoIEBzYW1wey1mfQotb3B0aW9uLiAgCi0KLUBpdGVtIC1GIEB2YXJ7ZnVuY3Rpb25fbmFtZX0KLVRoZSBAc2FtcHstRiBAdmFye2Z1bmN0aW9ufX0gb3B0aW9uIHdvcmtzIGxpa2UgdGhlIEBjb2Rley1mfSBvcHRpb24sIGJ1dAotb25seSB0aW1lIHNwZW50IGluIHRoZSBmdW5jdGlvbiBhbmQgaXRzIGNoaWxkcmVuIChhbmQgdGhlaXIKLWNoaWxkcmVuQGRvdHN7fSkgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0b3RhbC10aW1lIGFuZAotcGVyY2VudGFnZXMtb2YtdGltZSBmb3IgdGhlIGNhbGwgZ3JhcGguICBNb3JlIHRoYW4gb25lIEBzYW1wey1GfSBvcHRpb24KLW1heSBiZSBnaXZlbjsgb25seSBvbmUgQHZhcntmdW5jdGlvbl9uYW1lfSBtYXkgYmUgaW5kaWNhdGVkIHdpdGggZWFjaAotQHNhbXB7LUZ9IG9wdGlvbi4gIFRoZSBAc2FtcHstRn0gb3B0aW9uIG92ZXJyaWRlcyB0aGUgQHNhbXB7LUV9IG9wdGlvbi4KLQotQGVuZCB0YWJsZQotCi1Ob3RlIHRoYXQgb25seSBvbmUgZnVuY3Rpb24gY2FuIGJlIHNwZWNpZmllZCB3aXRoIGVhY2ggQGNvZGV7LWV9LAotQGNvZGV7LUV9LCBAY29kZXstZn0gb3IgQGNvZGV7LUZ9IG9wdGlvbi4gIFRvIHNwZWNpZnkgbW9yZSB0aGFuIG9uZQotZnVuY3Rpb24sIHVzZSBtdWx0aXBsZSBvcHRpb25zLiAgRm9yIGV4YW1wbGUsIHRoaXMgY29tbWFuZDoKLQotQGV4YW1wbGUKLWdwcm9mIC1lIGJvcmluZyAtZiBmb28gLWYgYmFyIG15cHJvZ3JhbSA+IGdwcm9mLm91dHB1dAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotbGlzdHMgaW4gdGhlIGNhbGwgZ3JhcGggYWxsIGZ1bmN0aW9ucyB0aGF0IHdlcmUgcmVhY2hlZCBmcm9tIGVpdGhlcgotQGNvZGV7Zm9vfSBvciBAY29kZXtiYXJ9IGFuZCB3ZXJlIG5vdCByZWFjaGFibGUgZnJvbSBAY29kZXtib3Jpbmd9LgotCi1Abm9kZSBTeW1zcGVjcywsRGVwcmljYXRlZCBPcHRpb25zLEludm9raW5nCi1Ac2VjdGlvbiBTeW1zcGVjcwotCi1NYW55IG9mIHRoZSBvdXRwdXQgb3B0aW9ucyBhbGxvdyBmdW5jdGlvbnMgdG8gYmUgaW5jbHVkZWQgb3IgZXhjbHVkZWQKLXVzaW5nIEBkZm57c3ltc3BlY3N9IChzeW1ib2wgc3BlY2lmaWNhdGlvbnMpLCB3aGljaCBvYnNlcnZlIHRoZQotZm9sbG93aW5nIHN5bnRheDoKLQotQGV4YW1wbGUKLSAgZmlsZW5hbWVfY29udGFpbmluZ19hX2RvdAotfCBmdW5jbmFtZV9ub3RfY29udGFpbmluZ19hX2RvdAotfCBsaW5lbnVtYmVyCi18ICggWyBhbnlfZmlsZW5hbWUgXSBgOicgKCBhbnlfZnVuY25hbWUgfCBsaW5lbnVtYmVyICkgKQotQGVuZCBleGFtcGxlCi0KLUhlcmUgYXJlIHNvbWUgc2FtcGxlIHN5bXNwZWNzOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIG1haW4uYwotU2VsZWN0cyBldmVyeXRoaW5nIGluIGZpbGUgQGZpbGV7bWFpbi5jfS0tLXRoZQotZG90IGluIHRoZSBzdHJpbmcgdGVsbHMgZ3Byb2YgdG8gaW50ZXJwcmV0Ci10aGUgc3RyaW5nIGFzIGEgZmlsZW5hbWUsIHJhdGhlciB0aGFuIGFzCi1hIGZ1bmN0aW9uIG5hbWUuICBUbyBzZWxlY3QgYSBmaWxlIHdob3NlCi1uYW1lIGRvZXMgbm90IGNvbnRhaW4gYSBkb3QsIGEgdHJhaWxpbmcgY29sb24KLXNob3VsZCBiZSBzcGVjaWZpZWQuICBGb3IgZXhhbXBsZSwgQHNhbXB7b2RkOn0gaXMKLWludGVycHJldGVkIGFzIHRoZSBmaWxlIG5hbWVkIEBmaWxle29kZH0uCi0KLUBpdGVtIG1haW4KLVNlbGVjdHMgYWxsIGZ1bmN0aW9ucyBuYW1lZCBAc2FtcHttYWlufS4KLQotTm90ZSB0aGF0IHRoZXJlIG1heSBiZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgZnVuY3Rpb24gbmFtZQotYmVjYXVzZSBzb21lIG9mIHRoZSBkZWZpbml0aW9ucyBtYXkgYmUgbG9jYWwgKGkuZS4sIHN0YXRpYykuICBVbmxlc3MgYQotZnVuY3Rpb24gbmFtZSBpcyB1bmlxdWUgaW4gYSBwcm9ncmFtLCB5b3UgbXVzdCB1c2UgdGhlIGNvbG9uIG5vdGF0aW9uCi1leHBsYWluZWQgYmVsb3cgdG8gc3BlY2lmeSBhIGZ1bmN0aW9uIGZyb20gYSBzcGVjaWZpYyBzb3VyY2UgZmlsZS4KLQotU29tZXRpbWVzLCBmdW5jdGlvbiBuYW1lcyBjb250YWluIGRvdHMuICBJbiBzdWNoIGNhc2VzLCBpdCBpcyBuZWNlc3NhcgotdG8gYWRkIGEgbGVhZGluZyBjb2xvbiB0byB0aGUgbmFtZS4gIEZvciBleGFtcGxlLCBAc2FtcHs6Lm11bH0gc2VsZWN0cwotZnVuY3Rpb24gQHNhbXB7Lm11bH0uCi0KLUluIHNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cywgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLiAgZ3Byb2YKLXdpbGwgbm9ybWFsbHkgbm90IHByaW50IHRoZXNlIHVuZGVyc2NvcmVzLiAgSG93ZXZlciwgeW91IG11c3QgdXNlIHRoZQotdW5kZXJzY29yZSB3aGVuIHlvdSBuYW1lIGEgc3ltYm9sIGluIGEgc3ltc3BlYy4gIFlvdSBjYW4gdXNlIHRoZQotQGNvZGV7bm19IHByb2dyYW0gdG8gc2VlIHdoZXRoZXIgc3ltYm9scyBoYXZlIHVuZGVyc2NvcmVzIGZvciB0aGUgb2JqZWN0Ci1maWxlIGZvcm1hdCB5b3UgYXJlIHVzaW5nLgotCi1AaXRlbSBtYWluLmM6bWFpbgotU2VsZWN0cyBmdW5jdGlvbiBAc2FtcHttYWlufSBpbiBmaWxlIEBmaWxle21haW4uY30uCi0KLUBpdGVtIG1haW4uYzoxMzQKLVNlbGVjdHMgbGluZSAxMzQgaW4gZmlsZSBAZmlsZXttYWluLmN9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBPdXRwdXQKLUBjaGFwdGVyIEludGVycHJldGluZyBAY29kZXtncHJvZn0ncyBPdXRwdXQKLQotQGNvZGV7Z3Byb2Z9IGNhbiBwcm9kdWNlIHNldmVyYWwgZGlmZmVyZW50IG91dHB1dCBzdHlsZXMsIHRoZQotbW9zdCBpbXBvcnRhbnQgb2Ygd2hpY2ggYXJlIGRlc2NyaWJlZCBiZWxvdy4gIFRoZSBzaW1wbGVzdCBvdXRwdXQKLXN0eWxlcyAoZmlsZSBpbmZvcm1hdGlvbiwgZXhlY3V0aW9uIGNvdW50LCBhbmQgZnVuY3Rpb24gYW5kIGZpbGUgb3JkZXJpbmcpCi1hcmUgbm90IGRlc2NyaWJlZCBoZXJlLCBidXQgYXJlIGRvY3VtZW50ZWQgd2l0aCB0aGUgcmVzcGVjdGl2ZSBvcHRpb25zCi10aGF0IHRyaWdnZXIgdGhlbS4KLUB4cmVme091dHB1dCBPcHRpb25zfS4KLQotQG1lbnUKLSogRmxhdCBQcm9maWxlOjogICAgICAgIFRoZSBmbGF0IHByb2ZpbGUgc2hvd3MgaG93IG11Y2ggdGltZSB3YXMgc3BlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpbmcgZGlyZWN0bHkgaW4gZWFjaCBmdW5jdGlvbi4KLSogQ2FsbCBHcmFwaDo6ICAgICAgICAgIFRoZSBjYWxsIGdyYXBoIHNob3dzIHdoaWNoIGZ1bmN0aW9ucyBjYWxsZWQgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcnMsIGFuZCBob3cgbXVjaCB0aW1lIGVhY2ggZnVuY3Rpb24gdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gaXRzIHN1YnJvdXRpbmUgY2FsbHMgYXJlIGluY2x1ZGVkLgotKiBMaW5lLWJ5LWxpbmU6OiAgICAgICAgQGNvZGV7Z3Byb2Z9IGNhbiBhbmFseXplIGluZGl2aWR1YWwgc291cmNlIGNvZGUgbGluZXMKLSogQW5ub3RhdGVkIFNvdXJjZTo6ICAgIFRoZSBhbm5vdGF0ZWQgc291cmNlIGxpc3RpbmcgZGlzcGxheXMgc291cmNlIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbGVkIHdpdGggZXhlY3V0aW9uIGNvdW50cwotQGVuZCBtZW51Ci0KLQotQG5vZGUgRmxhdCBQcm9maWxlLENhbGwgR3JhcGgsLE91dHB1dAotQHNlY3Rpb24gVGhlIEZsYXQgUHJvZmlsZQotQGNpbmRleCBmbGF0IHByb2ZpbGUKLQotVGhlIEBkZm57ZmxhdCBwcm9maWxlfSBzaG93cyB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgeW91ciBwcm9ncmFtCi1zcGVudCBleGVjdXRpbmcgZWFjaCBmdW5jdGlvbi4gIFVubGVzcyB0aGUgQHNhbXB7LXp9IG9wdGlvbiBpcyBnaXZlbiwKLWZ1bmN0aW9ucyB3aXRoIG5vIGFwcGFyZW50IHRpbWUgc3BlbnQgaW4gdGhlbSwgYW5kIG5vIGFwcGFyZW50IGNhbGxzCi10byB0aGVtLCBhcmUgbm90IG1lbnRpb25lZC4gIE5vdGUgdGhhdCBpZiBhIGZ1bmN0aW9uIHdhcyBub3QgY29tcGlsZWQKLWZvciBwcm9maWxpbmcsIGFuZCBkaWRuJ3QgcnVuIGxvbmcgZW5vdWdoIHRvIHNob3cgdXAgb24gdGhlIHByb2dyYW0KLWNvdW50ZXIgaGlzdG9ncmFtLCBpdCB3aWxsIGJlIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBmdW5jdGlvbiB0aGF0Ci13YXMgbmV2ZXIgY2FsbGVkLgotCi1UaGlzIGlzIHBhcnQgb2YgYSBmbGF0IHByb2ZpbGUgZm9yIGEgc21hbGwgcHJvZ3JhbToKLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1GbGF0IHByb2ZpbGU6Ci0KLUVhY2ggc2FtcGxlIGNvdW50cyBhcyAwLjAxIHNlY29uZHMuCi0gICUgICBjdW11bGF0aXZlICAgc2VsZiAgICAgICAgICAgICAgc2VsZiAgICAgdG90YWwgICAgICAgICAgIAotIHRpbWUgICBzZWNvbmRzICAgc2Vjb25kcyAgICBjYWxscyAgbXMvY2FsbCAgbXMvY2FsbCAgbmFtZSAgICAKLSAzMy4zNCAgICAgIDAuMDIgICAgIDAuMDIgICAgIDcyMDggICAgIDAuMDAgICAgIDAuMDAgIG9wZW4KLSAxNi42NyAgICAgIDAuMDMgICAgIDAuMDEgICAgICAyNDQgICAgIDAuMDQgICAgIDAuMTIgIG9mZnRpbWUKLSAxNi42NyAgICAgIDAuMDQgICAgIDAuMDEgICAgICAgIDggICAgIDEuMjUgICAgIDEuMjUgIG1lbWNjcHkKLSAxNi42NyAgICAgIDAuMDUgICAgIDAuMDEgICAgICAgIDcgICAgIDEuNDMgICAgIDEuNDMgIHdyaXRlCi0gMTYuNjcgICAgICAwLjA2ICAgICAwLjAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtY291bnQKLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAyMzYgICAgIDAuMDAgICAgIDAuMDAgIHR6c2V0Ci0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgMTkyICAgICAwLjAwICAgICAwLjAwICB0b2xvd2VyCi0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgIDQ3ICAgICAwLjAwICAgICAwLjAwICBzdHJsZW4KLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAgNDUgICAgIDAuMDAgICAgIDAuMDAgIHN0cmNocgotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgICAgMSAgICAgMC4wMCAgICA1MC4wMCAgbWFpbgotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgICAgMSAgICAgMC4wMCAgICAgMC4wMCAgbWVtY3B5Ci0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgICAxICAgICAwLjAwICAgIDEwLjExICBwcmludAotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgICAgMSAgICAgMC4wMCAgICAgMC4wMCAgcHJvZmlsCi0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgICAxICAgICAwLjAwICAgIDUwLjAwICByZXBvcnQKLUBkb3Rze30KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotVGhlIGZ1bmN0aW9ucyBhcmUgc29ydGVkIGJ5IGZpcnN0IGJ5IGRlY3JlYXNpbmcgcnVuLXRpbWUgc3BlbnQgaW4gdGhlbSwKLXRoZW4gYnkgZGVjcmVhc2luZyBudW1iZXIgb2YgY2FsbHMsIHRoZW4gYWxwaGFiZXRpY2FsbHkgYnkgbmFtZS4gIFRoZQotZnVuY3Rpb25zIEBzYW1we21jb3VudH0gYW5kIEBzYW1we3Byb2ZpbH0gYXJlIHBhcnQgb2YgdGhlIHByb2ZpbGluZwotYXBhcmF0dXMgYW5kIGFwcGVhciBpbiBldmVyeSBmbGF0IHByb2ZpbGU7IHRoZWlyIHRpbWUgZ2l2ZXMgYSBtZWFzdXJlIG9mCi10aGUgYW1vdW50IG9mIG92ZXJoZWFkIGR1ZSB0byBwcm9maWxpbmcuCi0KLUp1c3QgYmVmb3JlIHRoZSBjb2x1bW4gaGVhZGVycywgYSBzdGF0ZW1lbnQgYXBwZWFycyBpbmRpY2F0aW5nCi1ob3cgbXVjaCB0aW1lIGVhY2ggc2FtcGxlIGNvdW50ZWQgYXMuCi1UaGlzIEBkZm57c2FtcGxpbmcgcGVyaW9kfSBlc3RpbWF0ZXMgdGhlIG1hcmdpbiBvZiBlcnJvciBpbiBlYWNoIG9mIHRoZSB0aW1lCi1maWd1cmVzLiAgQSB0aW1lIGZpZ3VyZSB0aGF0IGlzIG5vdCBtdWNoIGxhcmdlciB0aGFuIHRoaXMgaXMgbm90Ci1yZWxpYWJsZS4gIEluIHRoaXMgZXhhbXBsZSwgZWFjaCBzYW1wbGUgY291bnRlZCBhcyAwLjAxIHNlY29uZHMsCi1zdWdnZXN0aW5nIGEgMTAwIEh6IHNhbXBsaW5nIHJhdGUuCi1UaGUgcHJvZ3JhbSdzIHRvdGFsIGV4ZWN1dGlvbiB0aW1lIHdhcyAwLjA2Ci1zZWNvbmRzLCBhcyBpbmRpY2F0ZWQgYnkgdGhlIEBzYW1we2N1bXVsYXRpdmUgc2Vjb25kc30gZmllbGQuICBTaW5jZQotZWFjaCBzYW1wbGUgY291bnRlZCBmb3IgMC4wMSBzZWNvbmRzLCB0aGlzIG1lYW5zIG9ubHkgc2l4IHNhbXBsZXMKLXdlcmUgdGFrZW4gZHVyaW5nIHRoZSBydW4uICBUd28gb2YgdGhlIHNhbXBsZXMgb2NjdXJlZCB3aGlsZSB0aGUKLXByb2dyYW0gd2FzIGluIHRoZSBAc2FtcHtvcGVufSBmdW5jdGlvbiwgYXMgaW5kaWNhdGVkIGJ5IHRoZQotQHNhbXB7c2VsZiBzZWNvbmRzfSBmaWVsZC4gIEVhY2ggb2YgdGhlIG90aGVyIGZvdXIgc2FtcGxlcwotb2NjdXJlZCBvbmUgZWFjaCBpbiBAc2FtcHtvZmZ0aW1lfSwgQHNhbXB7bWVtY2NweX0sIEBzYW1we3dyaXRlfSwKLWFuZCBAc2FtcHttY291bnR9LgotU2luY2Ugb25seSBzaXggc2FtcGxlcyB3ZXJlIHRha2VuLCBub25lIG9mIHRoZXNlIHZhbHVlcyBjYW4KLWJlIHJlZ2FyZGVkIGFzIHBhcnRpY3VsYXJseSByZWxpYWJsZS4KLUluIGFub3RoZXIgcnVuLAotdGhlIEBzYW1we3NlbGYgc2Vjb25kc30gZmllbGQgZm9yCi1Ac2FtcHttY291bnR9IG1pZ2h0IHdlbGwgYmUgQHNhbXB7MC4wMH0gb3IgQHNhbXB7MC4wMn0uCi1AeHJlZntTYW1wbGluZyBFcnJvcn0sIGZvciBhIGNvbXBsZXRlIGRpc2N1c3Npb24uCi0KLVRoZSByZW1haW5pbmcgZnVuY3Rpb25zIGluIHRoZSBsaXN0aW5nICh0aG9zZSB3aG9zZQotQHNhbXB7c2VsZiBzZWNvbmRzfSBmaWVsZCBpcyBAc2FtcHswLjAwfSkgZGlkbid0IGFwcGVhcgotaW4gdGhlIGhpc3RvZ3JhbSBzYW1wbGVzIGF0IGFsbC4gIEhvd2V2ZXIsIHRoZSBjYWxsIGdyYXBoCi1pbmRpY2F0ZWQgdGhhdCB0aGV5IHdlcmUgY2FsbGVkLCBzbyB0aGVyZWZvcmUgdGhleSBhcmUgbGlzdGVkLAotc29ydGVkIGluIGRlY3JlYXNpbmcgb3JkZXIgYnkgdGhlIEBzYW1we2NhbGxzfSBmaWVsZC4KLUNsZWFybHkgc29tZSB0aW1lIHdhcyBzcGVudCBleGVjdXRpbmcgdGhlc2UgZnVuY3Rpb25zLAotYnV0IHRoZSBwYXVjaXR5IG9mIGhpc3RvZ3JhbSBzYW1wbGVzIHByZXZlbnRzIGFueQotZGV0ZXJtaW5hdGlvbiBvZiBob3cgbXVjaCB0aW1lIGVhY2ggdG9vay4KLQotSGVyZSBpcyB3aGF0IHRoZSBmaWVsZHMgaW4gZWFjaCBsaW5lIG1lYW46Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gJSB0aW1lCi1UaGlzIGlzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbCBleGVjdXRpb24gdGltZSB5b3VyIHByb2dyYW0gc3BlbnQKLWluIHRoaXMgZnVuY3Rpb24uICBUaGVzZSBzaG91bGQgYWxsIGFkZCB1cCB0byAxMDAlLgotCi1AaXRlbSBjdW11bGF0aXZlIHNlY29uZHMKLVRoaXMgaXMgdGhlIGN1bXVsYXRpdmUgdG90YWwgbnVtYmVyIG9mIHNlY29uZHMgdGhlIGNvbXB1dGVyIHNwZW50Ci1leGVjdXRpbmcgdGhpcyBmdW5jdGlvbnMsIHBsdXMgdGhlIHRpbWUgc3BlbnQgaW4gYWxsIHRoZSBmdW5jdGlvbnMKLWFib3ZlIHRoaXMgb25lIGluIHRoaXMgdGFibGUuCi0KLUBpdGVtIHNlbGYgc2Vjb25kcwotVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgYWNjb3VudGVkIGZvciBieSB0aGlzIGZ1bmN0aW9uIGFsb25lLgotVGhlIGZsYXQgcHJvZmlsZSBsaXN0aW5nIGlzIHNvcnRlZCBmaXJzdCBieSB0aGlzIG51bWJlci4KLQotQGl0ZW0gY2FsbHMKLVRoaXMgaXMgdGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZC4gIElmIHRoZQotZnVuY3Rpb24gd2FzIG5ldmVyIGNhbGxlZCwgb3IgdGhlIG51bWJlciBvZiB0aW1lcyBpdCB3YXMgY2FsbGVkIGNhbm5vdAotYmUgZGV0ZXJtaW5lZCAocHJvYmFibHkgYmVjYXVzZSB0aGUgZnVuY3Rpb24gd2FzIG5vdCBjb21waWxlZCB3aXRoCi1wcm9maWxpbmcgZW5hYmxlZCksIHRoZSBAZGZue2NhbGxzfSBmaWVsZCBpcyBibGFuay4KLQotQGl0ZW0gc2VsZiBtcy9jYWxsCi1UaGlzIHJlcHJlc2VudHMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzcGVudCBpbiB0aGlzCi1mdW5jdGlvbiBwZXIgY2FsbCwgaWYgdGhpcyBmdW5jdGlvbiBpcyBwcm9maWxlZC4gIE90aGVyd2lzZSwgdGhpcyBmaWVsZAotaXMgYmxhbmsgZm9yIHRoaXMgZnVuY3Rpb24uCi0KLUBpdGVtIHRvdGFsIG1zL2NhbGwKLVRoaXMgcmVwcmVzZW50cyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNwZW50IGluIHRoaXMKLWZ1bmN0aW9uIGFuZCBpdHMgZGVzY2VuZGFudHMgcGVyIGNhbGwsIGlmIHRoaXMgZnVuY3Rpb24gaXMgcHJvZmlsZWQuCi1PdGhlcndpc2UsIHRoaXMgZmllbGQgaXMgYmxhbmsgZm9yIHRoaXMgZnVuY3Rpb24uCi1UaGlzIGlzIHRoZSBvbmx5IGZpZWxkIGluIHRoZSBmbGF0IHByb2ZpbGUgdGhhdCB1c2VzIGNhbGwgZ3JhcGggYW5hbHlzaXMuCi0KLUBpdGVtIG5hbWUKLVRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLiAgIFRoZSBmbGF0IHByb2ZpbGUgaXMgc29ydGVkIGJ5IHRoaXMKLWZpZWxkIGFscGhhYmV0aWNhbGx5IGFmdGVyIHRoZSBAZGZue3NlbGYgc2Vjb25kc30gYW5kIEBkZm57Y2FsbHN9Ci1maWVsZHMgYXJlIHNvcnRlZC4KLUBlbmQgdGFibGUKLQotQG5vZGUgQ2FsbCBHcmFwaCxMaW5lLWJ5LWxpbmUsRmxhdCBQcm9maWxlLE91dHB1dAotQHNlY3Rpb24gVGhlIENhbGwgR3JhcGgKLUBjaW5kZXggY2FsbCBncmFwaAotCi1UaGUgQGRmbntjYWxsIGdyYXBofSBzaG93cyBob3cgbXVjaCB0aW1lIHdhcyBzcGVudCBpbiBlYWNoIGZ1bmN0aW9uCi1hbmQgaXRzIGNoaWxkcmVuLiAgRnJvbSB0aGlzIGluZm9ybWF0aW9uLCB5b3UgY2FuIGZpbmQgZnVuY3Rpb25zIHRoYXQsCi13aGlsZSB0aGV5IHRoZW1zZWx2ZXMgbWF5IG5vdCBoYXZlIHVzZWQgbXVjaCB0aW1lLCBjYWxsZWQgb3RoZXIKLWZ1bmN0aW9ucyB0aGF0IGRpZCB1c2UgdW51c3VhbCBhbW91bnRzIG9mIHRpbWUuCi0KLUhlcmUgaXMgYSBzYW1wbGUgY2FsbCBmcm9tIGEgc21hbGwgcHJvZ3JhbS4gIFRoaXMgY2FsbCBjYW1lIGZyb20gdGhlCi1zYW1lIEBjb2Rle2dwcm9mfSBydW4gYXMgdGhlIGZsYXQgcHJvZmlsZSBleGFtcGxlIGluIHRoZSBwcmV2aW91cwotY2hhcHRlci4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1ncmFudWxhcml0eTogZWFjaCBzYW1wbGUgaGl0IGNvdmVycyAyIGJ5dGUocykgZm9yIDIwLjAwJSBvZiAwLjA1IHNlY29uZHMKLQotaW5kZXggJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuICAgIGNhbGxlZCAgICAgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcG9udGFuZW91cz4KLVsxXSAgICAxMDAuMCAgICAwLjAwICAgIDAuMDUgICAgICAgICAgICAgICAgIHN0YXJ0IFsxXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wNSAgICAgICAxLzEgICAgICAgICAgIG1haW4gWzJdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDEvMiAgICAgICAgICAgb25fZXhpdCBbMjhdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDEvMSAgICAgICAgICAgZXhpdCBbNTldCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wNSAgICAgICAxLzEgICAgICAgICAgIHN0YXJ0IFsxXQotWzJdICAgIDEwMC4wICAgIDAuMDAgICAgMC4wNSAgICAgICAxICAgICAgICAgbWFpbiBbMl0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDUgICAgICAgMS8xICAgICAgICAgICByZXBvcnQgWzNdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wNSAgICAgICAxLzEgICAgICAgICAgIG1haW4gWzJdCi1bM10gICAgMTAwLjAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEgICAgICAgICByZXBvcnQgWzNdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAzICAgICAgIDgvOCAgICAgICAgICAgdGltZWxvY2FsIFs2XQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMSAgICAgICAxLzEgICAgICAgICAgIHByaW50IFs5XQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMSAgICAgICA5LzkgICAgICAgICAgIGZnZXRzIFsxMl0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAxMi8zNCAgICAgICAgICBzdHJuY21wIDxjeWNsZSAxPiBbNDBdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDgvOCAgICAgICAgICAgbG9va3VwIFsyMF0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8xICAgICAgICAgICBmb3BlbiBbMjFdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDgvOCAgICAgICAgICAgY2hld3RpbWUgWzI0XQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICA4LzE2ICAgICAgICAgIHNraXBzcGFjZSBbNDRdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWzRdICAgICA1OS44ICAgIDAuMDEgICAgICAgIDAuMDIgICAgICAgOCs0NzIgICAgIDxjeWNsZSAyIGFzIGEgd2hvbGU+CVs0XQotICAgICAgICAgICAgICAgIDAuMDEgICAgICAgIDAuMDIgICAgIDI0NCsyNjAgICAgICAgICBvZmZ0aW1lIDxjeWNsZSAyPiBbN10KLSAgICAgICAgICAgICAgICAwLjAwICAgICAgICAwLjAwICAgICAyMzYrMSAgICAgICAgICAgdHpzZXQgPGN5Y2xlIDI+IFsyNl0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgbGluZXMgZnVsbCBvZiBkYXNoZXMgZGl2aWRlIHRoaXMgdGFibGUgaW50byBAZGZue2VudHJpZXN9LCBvbmUgZm9yIGVhY2gKLWZ1bmN0aW9uLiAgRWFjaCBlbnRyeSBoYXMgb25lIG9yIG1vcmUgbGluZXMuCi0KLUluIGVhY2ggZW50cnksIHRoZSBwcmltYXJ5IGxpbmUgaXMgdGhlIG9uZSB0aGF0IHN0YXJ0cyB3aXRoIGFuIGluZGV4IG51bWJlcgotaW4gc3F1YXJlIGJyYWNrZXRzLiAgVGhlIGVuZCBvZiB0aGlzIGxpbmUgc2F5cyB3aGljaCBmdW5jdGlvbiB0aGUgZW50cnkgaXMKLWZvci4gIFRoZSBwcmVjZWRpbmcgbGluZXMgaW4gdGhlIGVudHJ5IGRlc2NyaWJlIHRoZSBjYWxsZXJzIG9mIHRoaXMKLWZ1bmN0aW9uIGFuZCB0aGUgZm9sbG93aW5nIGxpbmVzIGRlc2NyaWJlIGl0cyBzdWJyb3V0aW5lcyAoYWxzbyBjYWxsZWQKLUBkZm57Y2hpbGRyZW59IHdoZW4gd2Ugc3BlYWsgb2YgdGhlIGNhbGwgZ3JhcGgpLgotCi1UaGUgZW50cmllcyBhcmUgc29ydGVkIGJ5IHRpbWUgc3BlbnQgaW4gdGhlIGZ1bmN0aW9uIGFuZCBpdHMgc3Vicm91dGluZXMuCi0KLVRoZSBpbnRlcm5hbCBwcm9maWxpbmcgZnVuY3Rpb24gQGNvZGV7bWNvdW50fSAoQHB4cmVme0ZsYXQgUHJvZmlsZX0pCi1pcyBuZXZlciBtZW50aW9uZWQgaW4gdGhlIGNhbGwgZ3JhcGguCi0KLUBtZW51Ci0qIFByaW1hcnk6OiAgICAgICBEZXRhaWxzIG9mIHRoZSBwcmltYXJ5IGxpbmUncyBjb250ZW50cy4KLSogQ2FsbGVyczo6ICAgICAgIERldGFpbHMgb2YgY2FsbGVyLWxpbmVzJyBjb250ZW50cy4KLSogU3Vicm91dGluZXM6OiAgIERldGFpbHMgb2Ygc3Vicm91dGluZS1saW5lcycgY29udGVudHMuCi0qIEN5Y2xlczo6ICAgICAgICBXaGVuIHRoZXJlIGFyZSBjeWNsZXMgb2YgcmVjdXJzaW9uLAotICAgICAgICAgICAgICAgICAgIHN1Y2ggYXMgQGNvZGV7YX0gY2FsbHMgQGNvZGV7Yn0gY2FsbHMgQGNvZGV7YX1AZG90c3t9Ci1AZW5kIG1lbnUKLQotQG5vZGUgUHJpbWFyeQotQHN1YnNlY3Rpb24gVGhlIFByaW1hcnkgTGluZQotCi1UaGUgQGRmbntwcmltYXJ5IGxpbmV9IGluIGEgY2FsbCBncmFwaCBlbnRyeSBpcyB0aGUgbGluZSB0aGF0Ci1kZXNjcmliZXMgdGhlIGZ1bmN0aW9uIHdoaWNoIHRoZSBlbnRyeSBpcyBhYm91dCBhbmQgZ2l2ZXMgdGhlIG92ZXJhbGwKLXN0YXRpc3RpY3MgZm9yIHRoaXMgZnVuY3Rpb24uCi0KLUZvciByZWZlcmVuY2UsIHdlIHJlcGVhdCB0aGUgcHJpbWFyeSBsaW5lIGZyb20gdGhlIGVudHJ5IGZvciBmdW5jdGlvbgotQGNvZGV7cmVwb3J0fSBpbiBvdXIgbWFpbiBleGFtcGxlLCB0b2dldGhlciB3aXRoIHRoZSBoZWFkaW5nIGxpbmUgdGhhdAotc2hvd3MgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHM6Ci0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotaW5kZXggICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiBjYWxsZWQgICAgIG5hbWUKLUBkb3Rze30KLVszXSAgICAxMDAuMCAgICAwLjAwICAgIDAuMDUgICAgICAgMSAgICAgICAgIHJlcG9ydCBbM10KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUhlcmUgaXMgd2hhdCB0aGUgZmllbGRzIGluIHRoZSBwcmltYXJ5IGxpbmUgbWVhbjoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBpbmRleAotRW50cmllcyBhcmUgbnVtYmVyZWQgd2l0aCBjb25zZWN1dGl2ZSBpbnRlZ2Vycy4gIEVhY2ggZnVuY3Rpb24KLXRoZXJlZm9yZSBoYXMgYW4gaW5kZXggbnVtYmVyLCB3aGljaCBhcHBlYXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzCi1wcmltYXJ5IGxpbmUuCi0KLUVhY2ggY3Jvc3MtcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24sIGFzIGEgY2FsbGVyIG9yIHN1YnJvdXRpbmUgb2YKLWFub3RoZXIsIGdpdmVzIGl0cyBpbmRleCBudW1iZXIgYXMgd2VsbCBhcyBpdHMgbmFtZS4gIFRoZSBpbmRleCBudW1iZXIKLWd1aWRlcyB5b3UgaWYgeW91IHdpc2ggdG8gbG9vayBmb3IgdGhlIGVudHJ5IGZvciB0aGF0IGZ1bmN0aW9uLgotCi1AaXRlbSAlIHRpbWUKLVRoaXMgaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIHRpbWUgdGhhdCB3YXMgc3BlbnQgaW4gdGhpcwotZnVuY3Rpb24sIGluY2x1ZGluZyB0aW1lIHNwZW50IGluIHN1YnJvdXRpbmVzIGNhbGxlZCBmcm9tIHRoaXMKLWZ1bmN0aW9uLgotCi1UaGUgdGltZSBzcGVudCBpbiB0aGlzIGZ1bmN0aW9uIGlzIGNvdW50ZWQgYWdhaW4gZm9yIHRoZSBjYWxsZXJzIG9mCi10aGlzIGZ1bmN0aW9uLiAgVGhlcmVmb3JlLCBhZGRpbmcgdXAgdGhlc2UgcGVyY2VudGFnZXMgaXMgbWVhbmluZ2xlc3MuCi0KLUBpdGVtIHNlbGYKLVRoaXMgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIHRoaXMgZnVuY3Rpb24uICBUaGlzCi1zaG91bGQgYmUgaWRlbnRpY2FsIHRvIHRoZSBudW1iZXIgcHJpbnRlZCBpbiB0aGUgQGNvZGV7c2Vjb25kc30gZmllbGQKLWZvciB0aGlzIGZ1bmN0aW9uIGluIHRoZSBmbGF0IHByb2ZpbGUuCi0KLUBpdGVtIGNoaWxkcmVuCi1UaGlzIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBzcGVudCBpbiB0aGUgc3Vicm91dGluZSBjYWxscyBtYWRlIGJ5Ci10aGlzIGZ1bmN0aW9uLiAgVGhpcyBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIHN1bSBvZiBhbGwgdGhlIEBjb2Rle3NlbGZ9Ci1hbmQgQGNvZGV7Y2hpbGRyZW59IGVudHJpZXMgb2YgdGhlIGNoaWxkcmVuIGxpc3RlZCBkaXJlY3RseSBiZWxvdyB0aGlzCi1mdW5jdGlvbi4KLQotQGl0ZW0gY2FsbGVkCi1UaGlzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQuCi0KLUlmIHRoZSBmdW5jdGlvbiBjYWxsZWQgaXRzZWxmIHJlY3Vyc2l2ZWx5LCB0aGVyZSBhcmUgdHdvIG51bWJlcnMsCi1zZXBhcmF0ZWQgYnkgYSBAc2FtcHsrfS4gIFRoZSBmaXJzdCBudW1iZXIgY291bnRzIG5vbi1yZWN1cnNpdmUgY2FsbHMsCi1hbmQgdGhlIHNlY29uZCBjb3VudHMgcmVjdXJzaXZlIGNhbGxzLgotCi1JbiB0aGUgZXhhbXBsZSBhYm92ZSwgdGhlIGZ1bmN0aW9uIEBjb2Rle3JlcG9ydH0gd2FzIGNhbGxlZCBvbmNlIGZyb20KLUBjb2Rle21haW59LgotCi1AaXRlbSBuYW1lCi1UaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgVGhlIGluZGV4IG51bWJlciBpcwotcmVwZWF0ZWQgYWZ0ZXIgaXQuCi0KLUlmIHRoZSBmdW5jdGlvbiBpcyBwYXJ0IG9mIGEgY3ljbGUgb2YgcmVjdXJzaW9uLCB0aGUgY3ljbGUgbnVtYmVyIGlzCi1wcmludGVkIGJldHdlZW4gdGhlIGZ1bmN0aW9uJ3MgbmFtZSBhbmQgdGhlIGluZGV4IG51bWJlcgotKEBweHJlZntDeWNsZXN9KS4gIEZvciBleGFtcGxlLCBpZiBmdW5jdGlvbiBAY29kZXtnbnVycn0gaXMgcGFydCBvZgotY3ljbGUgbnVtYmVyIG9uZSwgYW5kIGhhcyBpbmRleCBudW1iZXIgdHdlbHZlLCBpdHMgcHJpbWFyeSBsaW5lIHdvdWxkCi1iZSBlbmQgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotZ251cnIgPGN5Y2xlIDE+IFsxMl0KLUBlbmQgZXhhbXBsZQotQGVuZCB0YWJsZQotCi1Abm9kZSBDYWxsZXJzLCBTdWJyb3V0aW5lcywgUHJpbWFyeSwgQ2FsbCBHcmFwaAotQHN1YnNlY3Rpb24gTGluZXMgZm9yIGEgRnVuY3Rpb24ncyBDYWxsZXJzCi0KLUEgZnVuY3Rpb24ncyBlbnRyeSBoYXMgYSBsaW5lIGZvciBlYWNoIGZ1bmN0aW9uIGl0IHdhcyBjYWxsZWQgYnkuCi1UaGVzZSBsaW5lcycgZmllbGRzIGNvcnJlc3BvbmQgdG8gdGhlIGZpZWxkcyBvZiB0aGUgcHJpbWFyeSBsaW5lLCBidXQKLXRoZWlyIG1lYW5pbmdzIGFyZSBkaWZmZXJlbnQgYmVjYXVzZSBvZiB0aGUgZGlmZmVyZW5jZSBpbiBjb250ZXh0LgotCi1Gb3IgcmVmZXJlbmNlLCB3ZSByZXBlYXQgdHdvIGxpbmVzIGZyb20gdGhlIGVudHJ5IGZvciB0aGUgZnVuY3Rpb24KLUBjb2Rle3JlcG9ydH0sIHRoZSBwcmltYXJ5IGxpbmUgYW5kIG9uZSBjYWxsZXItbGluZSBwcmVjZWRpbmcgaXQsIHRvZ2V0aGVyCi13aXRoIHRoZSBoZWFkaW5nIGxpbmUgdGhhdCBzaG93cyB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkczoKLQotQHNtYWxsZXhhbXBsZQotaW5kZXggICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiBjYWxsZWQgICAgIG5hbWUKLUBkb3Rze30KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDUgICAgICAgMS8xICAgICAgICAgICBtYWluIFsyXQotWzNdICAgIDEwMC4wICAgIDAuMDAgICAgMC4wNSAgICAgICAxICAgICAgICAgcmVwb3J0IFszXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotSGVyZSBhcmUgdGhlIG1lYW5pbmdzIG9mIHRoZSBmaWVsZHMgaW4gdGhlIGNhbGxlci1saW5lIGZvciBAY29kZXtyZXBvcnR9Ci1jYWxsZWQgZnJvbSBAY29kZXttYWlufToKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBzZWxmCi1BbiBlc3RpbWF0ZSBvZiB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gQGNvZGV7cmVwb3J0fSBpdHNlbGYgd2hlbiBpdCB3YXMKLWNhbGxlZCBmcm9tIEBjb2Rle21haW59LgotCi1AaXRlbSBjaGlsZHJlbgotQW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIHN1YnJvdXRpbmVzIG9mIEBjb2Rle3JlcG9ydH0KLXdoZW4gQGNvZGV7cmVwb3J0fSB3YXMgY2FsbGVkIGZyb20gQGNvZGV7bWFpbn0uCi0KLVRoZSBzdW0gb2YgdGhlIEBjb2Rle3NlbGZ9IGFuZCBAY29kZXtjaGlsZHJlbn0gZmllbGRzIGlzIGFuIGVzdGltYXRlCi1vZiB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgd2l0aGluIGNhbGxzIHRvIEBjb2Rle3JlcG9ydH0gZnJvbSBAY29kZXttYWlufS4KLQotQGl0ZW0gY2FsbGVkCi1Ud28gbnVtYmVyczogdGhlIG51bWJlciBvZiB0aW1lcyBAY29kZXtyZXBvcnR9IHdhcyBjYWxsZWQgZnJvbSBAY29kZXttYWlufSwKLWZvbGxvd2VkIGJ5IHRoZSB0b3RhbCBudW1iZXIgb2Ygbm9ucmVjdXJzaXZlIGNhbGxzIHRvIEBjb2Rle3JlcG9ydH0gZnJvbQotYWxsIGl0cyBjYWxsZXJzLgotCi1AaXRlbSBuYW1lIGFuZCBpbmRleCBudW1iZXIKLVRoZSBuYW1lIG9mIHRoZSBjYWxsZXIgb2YgQGNvZGV7cmVwb3J0fSB0byB3aGljaCB0aGlzIGxpbmUgYXBwbGllcywKLWZvbGxvd2VkIGJ5IHRoZSBjYWxsZXIncyBpbmRleCBudW1iZXIuCi0KLU5vdCBhbGwgZnVuY3Rpb25zIGhhdmUgZW50cmllcyBpbiB0aGUgY2FsbCBncmFwaDsgc29tZQotb3B0aW9ucyB0byBAY29kZXtncHJvZn0gcmVxdWVzdCB0aGUgb21pc3Npb24gb2YgY2VydGFpbiBmdW5jdGlvbnMuCi1XaGVuIGEgY2FsbGVyIGhhcyBubyBlbnRyeSBvZiBpdHMgb3duLCBpdCBzdGlsbCBoYXMgY2FsbGVyLWxpbmVzCi1pbiB0aGUgZW50cmllcyBvZiB0aGUgZnVuY3Rpb25zIGl0IGNhbGxzLgotCi1JZiB0aGUgY2FsbGVyIGlzIHBhcnQgb2YgYSByZWN1cnNpb24gY3ljbGUsIHRoZSBjeWNsZSBudW1iZXIgaXMKLXByaW50ZWQgYmV0d2VlbiB0aGUgbmFtZSBhbmQgdGhlIGluZGV4IG51bWJlci4KLUBlbmQgdGFibGUKLQotSWYgdGhlIGlkZW50aXR5IG9mIHRoZSBjYWxsZXJzIG9mIGEgZnVuY3Rpb24gY2Fubm90IGJlIGRldGVybWluZWQsIGEKLWR1bW15IGNhbGxlci1saW5lIGlzIHByaW50ZWQgd2hpY2ggaGFzIEBzYW1wezxzcG9udGFuZW91cz59IGFzIHRoZQotYGBjYWxsZXIncyBuYW1lJycgYW5kIGFsbCBvdGhlciBmaWVsZHMgYmxhbmsuICBUaGlzIGNhbiBoYXBwZW4gZm9yCi1zaWduYWwgaGFuZGxlcnMuCi1AYyBXaGF0IGlmIHNvbWUgY2FsbHMgaGF2ZSBkZXRlcm1pbmFibGUgY2FsbGVycycgbmFtZXMgYnV0IG5vdCBhbGw/Ci1AYyBGSVhNRSAtIHN0aWxsIHJlbGV2YW50PwotCi1Abm9kZSBTdWJyb3V0aW5lcywgQ3ljbGVzLCBDYWxsZXJzLCBDYWxsIEdyYXBoCi1Ac3Vic2VjdGlvbiBMaW5lcyBmb3IgYSBGdW5jdGlvbidzIFN1YnJvdXRpbmVzCi0KLUEgZnVuY3Rpb24ncyBlbnRyeSBoYXMgYSBsaW5lIGZvciBlYWNoIG9mIGl0cyBzdWJyb3V0aW5lcy0tLWluIG90aGVyCi13b3JkcywgYSBsaW5lIGZvciBlYWNoIG90aGVyIGZ1bmN0aW9uIHRoYXQgaXQgY2FsbGVkLiAgVGhlc2UgbGluZXMnCi1maWVsZHMgY29ycmVzcG9uZCB0byB0aGUgZmllbGRzIG9mIHRoZSBwcmltYXJ5IGxpbmUsIGJ1dCB0aGVpciBtZWFuaW5ncwotYXJlIGRpZmZlcmVudCBiZWNhdXNlIG9mIHRoZSBkaWZmZXJlbmNlIGluIGNvbnRleHQuCi0KLUZvciByZWZlcmVuY2UsIHdlIHJlcGVhdCB0d28gbGluZXMgZnJvbSB0aGUgZW50cnkgZm9yIHRoZSBmdW5jdGlvbgotQGNvZGV7bWFpbn0sIHRoZSBwcmltYXJ5IGxpbmUgYW5kIGEgbGluZSBmb3IgYSBzdWJyb3V0aW5lLCB0b2dldGhlcgotd2l0aCB0aGUgaGVhZGluZyBsaW5lIHRoYXQgc2hvd3MgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHM6Ci0KLUBzbWFsbGV4YW1wbGUKLWluZGV4ICAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gY2FsbGVkICAgICBuYW1lCi1AZG90c3t9Ci1bMl0gICAgMTAwLjAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEgICAgICAgICBtYWluIFsyXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wNSAgICAgICAxLzEgICAgICAgICAgIHJlcG9ydCBbM10KLUBlbmQgc21hbGxleGFtcGxlCi0KLUhlcmUgYXJlIHRoZSBtZWFuaW5ncyBvZiB0aGUgZmllbGRzIGluIHRoZSBzdWJyb3V0aW5lLWxpbmUgZm9yIEBjb2Rle21haW59Ci1jYWxsaW5nIEBjb2Rle3JlcG9ydH06Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gc2VsZgotQW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IGRpcmVjdGx5IHdpdGhpbiBAY29kZXtyZXBvcnR9Ci13aGVuIEBjb2Rle3JlcG9ydH0gd2FzIGNhbGxlZCBmcm9tIEBjb2Rle21haW59LgotCi1AaXRlbSBjaGlsZHJlbgotQW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIHN1YnJvdXRpbmVzIG9mIEBjb2Rle3JlcG9ydH0KLXdoZW4gQGNvZGV7cmVwb3J0fSB3YXMgY2FsbGVkIGZyb20gQGNvZGV7bWFpbn0uCi0KLVRoZSBzdW0gb2YgdGhlIEBjb2Rle3NlbGZ9IGFuZCBAY29kZXtjaGlsZHJlbn0gZmllbGRzIGlzIGFuIGVzdGltYXRlCi1vZiB0aGUgdG90YWwgdGltZSBzcGVudCBpbiBjYWxscyB0byBAY29kZXtyZXBvcnR9IGZyb20gQGNvZGV7bWFpbn0uCi0KLUBpdGVtIGNhbGxlZAotVHdvIG51bWJlcnMsIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gQGNvZGV7cmVwb3J0fSBmcm9tIEBjb2Rle21haW59Ci1mb2xsb3dlZCBieSB0aGUgdG90YWwgbnVtYmVyIG9mIG5vbnJlY3Vyc2l2ZSBjYWxscyB0byBAY29kZXtyZXBvcnR9LgotVGhpcyByYXRpbyBpcyB1c2VkIHRvIGRldGVybWluZSBob3cgbXVjaCBvZiBAY29kZXtyZXBvcnR9J3MgQGNvZGV7c2VsZn0KLWFuZCBAY29kZXtjaGlsZHJlbn0gdGltZSBnZXRzIGNyZWRpdGVkIHRvIEBjb2Rle21haW59LgotQHhyZWZ7QXNzdW1wdGlvbnN9LgotCi1AaXRlbSBuYW1lCi1UaGUgbmFtZSBvZiB0aGUgc3Vicm91dGluZSBvZiBAY29kZXttYWlufSB0byB3aGljaCB0aGlzIGxpbmUgYXBwbGllcywKLWZvbGxvd2VkIGJ5IHRoZSBzdWJyb3V0aW5lJ3MgaW5kZXggbnVtYmVyLgotCi1JZiB0aGUgY2FsbGVyIGlzIHBhcnQgb2YgYSByZWN1cnNpb24gY3ljbGUsIHRoZSBjeWNsZSBudW1iZXIgaXMKLXByaW50ZWQgYmV0d2VlbiB0aGUgbmFtZSBhbmQgdGhlIGluZGV4IG51bWJlci4KLUBlbmQgdGFibGUKLQotQG5vZGUgQ3ljbGVzLCwgU3Vicm91dGluZXMsIENhbGwgR3JhcGgKLUBzdWJzZWN0aW9uIEhvdyBNdXR1YWxseSBSZWN1cnNpdmUgRnVuY3Rpb25zIEFyZSBEZXNjcmliZWQKLUBjaW5kZXggY3ljbGUKLUBjaW5kZXggcmVjdXJzaW9uIGN5Y2xlCi0KLVRoZSBncmFwaCBtYXkgYmUgY29tcGxpY2F0ZWQgYnkgdGhlIHByZXNlbmNlIG9mIEBkZm57Y3ljbGVzIG9mCi1yZWN1cnNpb259IGluIHRoZSBjYWxsIGdyYXBoLiAgQSBjeWNsZSBleGlzdHMgaWYgYSBmdW5jdGlvbiBjYWxscwotYW5vdGhlciBmdW5jdGlvbiB0aGF0IChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSBjYWxscyAob3IgYXBwZWFycyB0bwotY2FsbCkgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6IGlmIEBjb2Rle2F9IGNhbGxzIEBjb2Rle2J9LAotYW5kIEBjb2Rle2J9IGNhbGxzIEBjb2Rle2F9LCB0aGVuIEBjb2Rle2F9IGFuZCBAY29kZXtifSBmb3JtIGEgY3ljbGUuCi0KLVdoZW5ldmVyIHRoZXJlIGFyZSBjYWxsIHBhdGhzIGJvdGggd2F5cyBiZXR3ZWVuIGEgcGFpciBvZiBmdW5jdGlvbnMsIHRoZXkKLWJlbG9uZyB0byB0aGUgc2FtZSBjeWNsZS4gIElmIEBjb2Rle2F9IGFuZCBAY29kZXtifSBjYWxsIGVhY2ggb3RoZXIgYW5kCi1AY29kZXtifSBhbmQgQGNvZGV7Y30gY2FsbCBlYWNoIG90aGVyLCBhbGwgdGhyZWUgbWFrZSBvbmUgY3ljbGUuICBOb3RlIHRoYXQKLWV2ZW4gaWYgQGNvZGV7Yn0gb25seSBjYWxscyBAY29kZXthfSBpZiBpdCB3YXMgbm90IGNhbGxlZCBmcm9tIEBjb2Rle2F9LAotQGNvZGV7Z3Byb2Z9IGNhbm5vdCBkZXRlcm1pbmUgdGhpcywgc28gQGNvZGV7YX0gYW5kIEBjb2Rle2J9IGFyZSBzdGlsbAotY29uc2lkZXJlZCBhIGN5Y2xlLgotCi1UaGUgY3ljbGVzIGFyZSBudW1iZXJlZCB3aXRoIGNvbnNlY3V0aXZlIGludGVnZXJzLiAgV2hlbiBhIGZ1bmN0aW9uCi1iZWxvbmdzIHRvIGEgY3ljbGUsIGVhY2ggdGltZSB0aGUgZnVuY3Rpb24gbmFtZSBhcHBlYXJzIGluIHRoZSBjYWxsIGdyYXBoCi1pdCBpcyBmb2xsb3dlZCBieSBAc2FtcHs8Y3ljbGUgQHZhcntudW1iZXJ9Pn0uCi0KLVRoZSByZWFzb24gY3ljbGVzIG1hdHRlciBpcyB0aGF0IHRoZXkgbWFrZSB0aGUgdGltZSB2YWx1ZXMgaW4gdGhlIGNhbGwKLWdyYXBoIHBhcmFkb3hpY2FsLiAgVGhlIGBgdGltZSBzcGVudCBpbiBjaGlsZHJlbicnIG9mIEBjb2Rle2F9IHNob3VsZAotaW5jbHVkZSB0aGUgdGltZSBzcGVudCBpbiBpdHMgc3Vicm91dGluZSBAY29kZXtifSBhbmQgaW4gQGNvZGV7Yn0ncwotc3Vicm91dGluZXMtLS1idXQgb25lIG9mIEBjb2Rle2J9J3Mgc3Vicm91dGluZXMgaXMgQGNvZGV7YX0hICBIb3cgbXVjaCBvZgotQGNvZGV7YX0ncyB0aW1lIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgY2hpbGRyZW4gb2YgQGNvZGV7YX0sIHdoZW4KLUBjb2Rle2F9IGlzIGluZGlyZWN0bHkgcmVjdXJzaXZlPwotCi1UaGUgd2F5IEBjb2Rle2dwcm9mfSByZXNvbHZlcyB0aGlzIHBhcmFkb3ggaXMgYnkgY3JlYXRpbmcgYSBzaW5nbGUgZW50cnkKLWZvciB0aGUgY3ljbGUgYXMgYSB3aG9sZS4gIFRoZSBwcmltYXJ5IGxpbmUgb2YgdGhpcyBlbnRyeSBkZXNjcmliZXMgdGhlCi10b3RhbCB0aW1lIHNwZW50IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbnMgb2YgdGhlIGN5Y2xlLiAgVGhlCi1gYHN1YnJvdXRpbmVzJycgb2YgdGhlIGN5Y2xlIGFyZSB0aGUgaW5kaXZpZHVhbCBmdW5jdGlvbnMgb2YgdGhlIGN5Y2xlLCBhbmQKLWFsbCBvdGhlciBmdW5jdGlvbnMgdGhhdCB3ZXJlIGNhbGxlZCBkaXJlY3RseSBieSB0aGVtLiAgVGhlIGBgY2FsbGVycycnIG9mCi10aGUgY3ljbGUgYXJlIHRoZSBmdW5jdGlvbnMsIG91dHNpZGUgdGhlIGN5Y2xlLCB0aGF0IGNhbGxlZCBmdW5jdGlvbnMgaW4KLXRoZSBjeWNsZS4KLQotSGVyZSBpcyBhbiBleGFtcGxlIHBvcnRpb24gb2YgYSBjYWxsIGdyYXBoIHdoaWNoIHNob3dzIGEgY3ljbGUgY29udGFpbmluZwotZnVuY3Rpb25zIEBjb2Rle2F9IGFuZCBAY29kZXtifS4gIFRoZSBjeWNsZSB3YXMgZW50ZXJlZCBieSBhIGNhbGwgdG8KLUBjb2Rle2F9IGZyb20gQGNvZGV7bWFpbn07IGJvdGggQGNvZGV7YX0gYW5kIEBjb2Rle2J9IGNhbGxlZCBAY29kZXtjfS4KLQotQHNtYWxsZXhhbXBsZQotaW5kZXggICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiBjYWxsZWQgICAgIG5hbWUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgMS43NyAgICAgICAgMCAgICAxLzEgICAgICAgIG1haW4gWzJdCi1bM10gICAgIDkxLjcxICAgIDEuNzcgICAgICAgIDAgICAgMSs1ICAgIDxjeWNsZSAxIGFzIGEgd2hvbGU+IFszXQotICAgICAgICAgICAgICAgICAxLjAyICAgICAgICAwICAgIDMgICAgICAgICAgYiA8Y3ljbGUgMT4gWzRdCi0gICAgICAgICAgICAgICAgIDAuNzUgICAgICAgIDAgICAgMiAgICAgICAgICBhIDxjeWNsZSAxPiBbNV0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQotWzRdICAgICA1Mi44NSAgICAxLjAyICAgICAgICAwICAgIDAgICAgICBiIDxjeWNsZSAxPiBbNF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQotICAgICAgICAgICAgICAgICAgICAwICAgICAgICAwICAgIDMvNiAgICAgICAgYyBbNl0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgMS43NyAgICAgICAgMCAgICAxLzEgICAgICAgIG1haW4gWzJdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICBiIDxjeWNsZSAxPiBbNF0KLVs1XSAgICAgMzguODYgICAgMC43NSAgICAgICAgMCAgICAxICAgICAgYSA8Y3ljbGUgMT4gWzVdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICBiIDxjeWNsZSAxPiBbNF0KLSAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICAzLzYgICAgICAgIGMgWzZdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLShUaGUgZW50aXJlIGNhbGwgZ3JhcGggZm9yIHRoaXMgcHJvZ3JhbSBjb250YWlucyBpbiBhZGRpdGlvbiBhbiBlbnRyeSBmb3IKLUBjb2Rle21haW59LCB3aGljaCBjYWxscyBAY29kZXthfSwgYW5kIGFuIGVudHJ5IGZvciBAY29kZXtjfSwgd2l0aCBjYWxsZXJzCi1AY29kZXthfSBhbmQgQGNvZGV7Yn0uKQotCi1Ac21hbGxleGFtcGxlCi1pbmRleCAgJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuIGNhbGxlZCAgICAgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwb250YW5lb3VzPgotWzFdICAgIDEwMC4wMCAgICAgICAwICAgICAxLjkzICAgIDAgICAgICBzdGFydCBbMV0KLSAgICAgICAgICAgICAgICAgMC4xNiAgICAgMS43NyAgICAxLzEgICAgICAgIG1haW4gWzJdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgIDAuMTYgICAgIDEuNzcgICAgMS8xICAgICAgICBzdGFydCBbMV0KLVsyXSAgICAxMDAuMDAgICAgMC4xNiAgICAgMS43NyAgICAxICAgICAgbWFpbiBbMl0KLSAgICAgICAgICAgICAgICAgMS43NyAgICAgICAgMCAgICAxLzEgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAxLjc3ICAgICAgICAwICAgIDEvMSAgICAgICAgbWFpbiBbMl0KLVszXSAgICAgOTEuNzEgICAgMS43NyAgICAgICAgMCAgICAxKzUgICAgPGN5Y2xlIDEgYXMgYSB3aG9sZT4gWzNdCi0gICAgICAgICAgICAgICAgIDEuMDIgICAgICAgIDAgICAgMyAgICAgICAgICBiIDxjeWNsZSAxPiBbNF0KLSAgICAgICAgICAgICAgICAgMC43NSAgICAgICAgMCAgICAyICAgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQotICAgICAgICAgICAgICAgICAgICAwICAgICAgICAwICAgIDYvNiAgICAgICAgYyBbNl0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQotWzRdICAgICA1Mi44NSAgICAxLjAyICAgICAgICAwICAgIDAgICAgICBiIDxjeWNsZSAxPiBbNF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQotICAgICAgICAgICAgICAgICAgICAwICAgICAgICAwICAgIDMvNiAgICAgICAgYyBbNl0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgMS43NyAgICAgICAgMCAgICAxLzEgICAgICAgIG1haW4gWzJdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICBiIDxjeWNsZSAxPiBbNF0KLVs1XSAgICAgMzguODYgICAgMC43NSAgICAgICAgMCAgICAxICAgICAgYSA8Y3ljbGUgMT4gWzVdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICBiIDxjeWNsZSAxPiBbNF0KLSAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICAzLzYgICAgICAgIGMgWzZdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgIDAgICAgICAgIDAgICAgMy82ICAgICAgICBiIDxjeWNsZSAxPiBbNF0KLSAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICAzLzYgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQotWzZdICAgICAgMC4wMCAgICAgICAwICAgICAgICAwICAgIDYgICAgICBjIFs2XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEBjb2Rle3NlbGZ9IGZpZWxkIG9mIHRoZSBjeWNsZSdzIHByaW1hcnkgbGluZSBpcyB0aGUgdG90YWwgdGltZQotc3BlbnQgaW4gYWxsIHRoZSBmdW5jdGlvbnMgb2YgdGhlIGN5Y2xlLiAgSXQgZXF1YWxzIHRoZSBzdW0gb2YgdGhlCi1AY29kZXtzZWxmfSBmaWVsZHMgZm9yIHRoZSBpbmRpdmlkdWFsIGZ1bmN0aW9ucyBpbiB0aGUgY3ljbGUsIGZvdW5kCi1pbiB0aGUgZW50cnkgaW4gdGhlIHN1YnJvdXRpbmUgbGluZXMgZm9yIHRoZXNlIGZ1bmN0aW9ucy4KLQotVGhlIEBjb2Rle2NoaWxkcmVufSBmaWVsZHMgb2YgdGhlIGN5Y2xlJ3MgcHJpbWFyeSBsaW5lIGFuZCBzdWJyb3V0aW5lIGxpbmVzCi1jb3VudCBvbmx5IHN1YnJvdXRpbmVzIG91dHNpZGUgdGhlIGN5Y2xlLiAgRXZlbiB0aG91Z2ggQGNvZGV7YX0gY2FsbHMKLUBjb2Rle2J9LCB0aGUgdGltZSBzcGVudCBpbiB0aG9zZSBjYWxscyB0byBAY29kZXtifSBpcyBub3QgY291bnRlZCBpbgotQGNvZGV7YX0ncyBAY29kZXtjaGlsZHJlbn0gdGltZS4gIFRodXMsIHdlIGRvIG5vdCBlbmNvdW50ZXIgdGhlIHByb2JsZW0gb2YKLXdoYXQgdG8gZG8gd2hlbiB0aGUgdGltZSBpbiB0aG9zZSBjYWxscyB0byBAY29kZXtifSBpbmNsdWRlcyBpbmRpcmVjdAotcmVjdXJzaXZlIGNhbGxzIGJhY2sgdG8gQGNvZGV7YX0uCi0KLVRoZSBAY29kZXtjaGlsZHJlbn0gZmllbGQgb2YgYSBjYWxsZXItbGluZSBpbiB0aGUgY3ljbGUncyBlbnRyeSBlc3RpbWF0ZXMKLXRoZSBhbW91bnQgb2YgdGltZSBzcGVudCBAZW1waHtpbiB0aGUgd2hvbGUgY3ljbGV9LCBhbmQgaXRzIG90aGVyCi1zdWJyb3V0aW5lcywgb24gdGhlIHRpbWVzIHdoZW4gdGhhdCBjYWxsZXIgY2FsbGVkIGEgZnVuY3Rpb24gaW4gdGhlIGN5Y2xlLgotCi1UaGUgQGNvZGV7Y2FsbHN9IGZpZWxkIGluIHRoZSBwcmltYXJ5IGxpbmUgZm9yIHRoZSBjeWNsZSBoYXMgdHdvIG51bWJlcnM6Ci1maXJzdCwgdGhlIG51bWJlciBvZiB0aW1lcyBmdW5jdGlvbnMgaW4gdGhlIGN5Y2xlIHdlcmUgY2FsbGVkIGJ5IGZ1bmN0aW9ucwotb3V0c2lkZSB0aGUgY3ljbGU7IHNlY29uZCwgdGhlIG51bWJlciBvZiB0aW1lcyB0aGV5IHdlcmUgY2FsbGVkIGJ5Ci1mdW5jdGlvbnMgaW4gdGhlIGN5Y2xlIChpbmNsdWRpbmcgdGltZXMgd2hlbiBhIGZ1bmN0aW9uIGluIHRoZSBjeWNsZSBjYWxscwotaXRzZWxmKS4gIFRoaXMgaXMgYSBnZW5lcmFsaXphdGlvbiBvZiB0aGUgdXN1YWwgc3BsaXQgaW50byBub25yZWN1cnNpdmUgYW5kCi1yZWN1cnNpdmUgY2FsbHMuCi0KLVRoZSBAY29kZXtjYWxsc30gZmllbGQgb2YgYSBzdWJyb3V0aW5lLWxpbmUgZm9yIGEgY3ljbGUgbWVtYmVyIGluIHRoZQotY3ljbGUncyBlbnRyeSBzYXlzIGhvdyBtYW55IHRpbWUgdGhhdCBmdW5jdGlvbiB3YXMgY2FsbGVkIGZyb20gZnVuY3Rpb25zIGluCi10aGUgY3ljbGUuICBUaGUgdG90YWwgb2YgYWxsIHRoZXNlIGlzIHRoZSBzZWNvbmQgbnVtYmVyIGluIHRoZSBwcmltYXJ5IGxpbmUncwotQGNvZGV7Y2FsbHN9IGZpZWxkLgotCi1JbiB0aGUgaW5kaXZpZHVhbCBlbnRyeSBmb3IgYSBmdW5jdGlvbiBpbiBhIGN5Y2xlLCB0aGUgb3RoZXIgZnVuY3Rpb25zIGluCi10aGUgc2FtZSBjeWNsZSBjYW4gYXBwZWFyIGFzIHN1YnJvdXRpbmVzIGFuZCBhcyBjYWxsZXJzLiAgVGhlc2UgbGluZXMgc2hvdwotaG93IG1hbnkgdGltZXMgZWFjaCBmdW5jdGlvbiBpbiB0aGUgY3ljbGUgY2FsbGVkIG9yIHdhcyBjYWxsZWQgZnJvbSBlYWNoIG90aGVyCi1mdW5jdGlvbiBpbiB0aGUgY3ljbGUuICBUaGUgQGNvZGV7c2VsZn0gYW5kIEBjb2Rle2NoaWxkcmVufSBmaWVsZHMgaW4gdGhlc2UKLWxpbmVzIGFyZSBibGFuayBiZWNhdXNlIG9mIHRoZSBkaWZmaWN1bHR5IG9mIGRlZmluaW5nIG1lYW5pbmdzIGZvciB0aGVtCi13aGVuIHJlY3Vyc2lvbiBpcyBnb2luZyBvbi4KLQotQG5vZGUgTGluZS1ieS1saW5lLEFubm90YXRlZCBTb3VyY2UsQ2FsbCBHcmFwaCxPdXRwdXQKLUBzZWN0aW9uIExpbmUtYnktbGluZSBQcm9maWxpbmcKLQotQGNvZGV7Z3Byb2Z9J3MgQHNhbXB7LWx9IG9wdGlvbiBjYXVzZXMgdGhlIHByb2dyYW0gdG8gcGVyZm9ybQotQGRmbntsaW5lLWJ5LWxpbmV9IHByb2ZpbGluZy4gIEluIHRoaXMgbW9kZSwgaGlzdG9ncmFtCi1zYW1wbGVzIGFyZSBhc3NpZ25lZCBub3QgdG8gZnVuY3Rpb25zLCBidXQgdG8gaW5kaXZpZHVhbAotbGluZXMgb2Ygc291cmNlIGNvZGUuICBUaGUgcHJvZ3JhbSB1c3VhbGx5IG11c3QgYmUgY29tcGlsZWQKLXdpdGggYSBAc2FtcHstZ30gb3B0aW9uLCBpbiBhZGRpdGlvbiB0byBAc2FtcHstcGd9LCBpbiBvcmRlcgotdG8gZ2VuZXJhdGUgZGVidWdnaW5nIHN5bWJvbHMgZm9yIHRyYWNraW5nIHNvdXJjZSBjb2RlIGxpbmVzLgotCi1UaGUgZmxhdCBwcm9maWxlIGlzIHRoZSBtb3N0IHVzZWZ1bCBvdXRwdXQgdGFibGUKLWluIGxpbmUtYnktbGluZSBtb2RlLgotVGhlIGNhbGwgZ3JhcGggaXNuJ3QgYXMgdXNlZnVsIGFzIG5vcm1hbCwgc2luY2UKLXRoZSBjdXJyZW50IHZlcnNpb24gb2YgQGNvZGV7Z3Byb2Z9IGRvZXMgbm90IHByb3BhZ2F0ZQotY2FsbCBncmFwaCBhcmNzIGZyb20gc291cmNlIGNvZGUgbGluZXMgdG8gdGhlIGVuY2xvc2luZyBmdW5jdGlvbi4KLVRoZSBjYWxsIGdyYXBoIGRvZXMsIGhvd2V2ZXIsIHNob3cgZWFjaCBsaW5lIG9mIGNvZGUKLXRoYXQgY2FsbGVkIGVhY2ggZnVuY3Rpb24sIGFsb25nIHdpdGggYSBjb3VudC4KLQotSGVyZSBpcyBhIHNlY3Rpb24gb2YgQGNvZGV7Z3Byb2Z9J3Mgb3V0cHV0LCB3aXRob3V0IGxpbmUtYnktbGluZSBwcm9maWxpbmcuCi1Ob3RlIHRoYXQgQGNvZGV7Y3RfaW5pdH0gYWNjb3VudGVkIGZvciBmb3VyIGhpc3RvZ3JhbSBoaXRzLCBhbmQKLTEzMzI3IGNhbGxzIHRvIEBjb2Rle2luaXRfYmxvY2t9LgotCi1Ac21hbGxleGFtcGxlCi1GbGF0IHByb2ZpbGU6Ci0KLUVhY2ggc2FtcGxlIGNvdW50cyBhcyAwLjAxIHNlY29uZHMuCi0gICUgICBjdW11bGF0aXZlICAgc2VsZiAgICAgICAgICAgICAgc2VsZiAgICAgdG90YWwgICAgICAgICAgIAotIHRpbWUgICBzZWNvbmRzICAgc2Vjb25kcyAgICBjYWxscyAgdXMvY2FsbCAgdXMvY2FsbCAgbmFtZSAgICAKLSAzMC43NyAgICAgIDAuMTMgICAgIDAuMDQgICAgIDYzMzUgICAgIDYuMzEgICAgIDYuMzEgIGN0X2luaXQKLQotCi0JCSAgICAgQ2FsbCBncmFwaCAoZXhwbGFuYXRpb24gZm9sbG93cykKLQotCi1ncmFudWxhcml0eTogZWFjaCBzYW1wbGUgaGl0IGNvdmVycyA0IGJ5dGUocykgZm9yIDcuNjklIG9mIDAuMTMgc2Vjb25kcwotCi1pbmRleCAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gICAgY2FsbGVkICAgICBuYW1lCi0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8xMzQ5NiAgICAgICBuYW1lX3Rvb19sb25nCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgNDAvMTM0OTYgICAgICAgZGVmbGF0ZQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgMTI4LzEzNDk2ICAgICAgIGRlZmxhdGVfZmFzdAotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgIDEzMzI3LzEzNDk2ICAgICAgIGN0X2luaXQKLVs3XSAgICAgIDAuMCAgICAwLjAwICAgIDAuMDAgICAxMzQ5NiAgICAgICAgIGluaXRfYmxvY2sKLQotQGVuZCBzbWFsbGV4YW1wbGUKLQotTm93IGxldCdzIGxvb2sgYXQgc29tZSBvZiBAY29kZXtncHJvZn0ncyBvdXRwdXQgZnJvbSB0aGUgc2FtZSBwcm9ncmFtIHJ1biwKLXRoaXMgdGltZSB3aXRoIGxpbmUtYnktbGluZSBwcm9maWxpbmcgZW5hYmxlZC4gIE5vdGUgdGhhdCBAY29kZXtjdF9pbml0fSdzCi1mb3VyIGhpc3RvZ3JhbSBoaXRzIGFyZSBicm9rZW4gZG93biBpbnRvIGZvdXIgbGluZXMgb2Ygc291cmNlIGNvZGUgLSBvbmUgaGl0Ci1vY2N1cmVkIG9uIGVhY2ggb2YgbGluZXMgMzQ5LCAzNTEsIDM4MiBhbmQgMzg1LiAgSW4gdGhlIGNhbGwgZ3JhcGgsCi1ub3RlIGhvdwotQGNvZGV7Y3RfaW5pdH0ncyAxMzMyNyBjYWxscyB0byBAY29kZXtpbml0X2Jsb2NrfSBhcmUgYnJva2VuIGRvd24KLWludG8gb25lIGNhbGwgZnJvbSBsaW5lIDM5NiwgMzA3MSBjYWxscyBmcm9tIGxpbmUgMzg0LCAzNzMwIGNhbGxzCi1mcm9tIGxpbmUgMzg1LCBhbmQgNjUyNSBjYWxscyBmcm9tIDM4Ny4KLQotQHNtYWxsZXhhbXBsZQotRmxhdCBwcm9maWxlOgotCi1FYWNoIHNhbXBsZSBjb3VudHMgYXMgMC4wMSBzZWNvbmRzLgotICAlICAgY3VtdWxhdGl2ZSAgIHNlbGYgICAgICAgICAgICAgICAgICAgIAotIHRpbWUgICBzZWNvbmRzICAgc2Vjb25kcyAgICBjYWxscyAgbmFtZSAgICAKLSAgNy42OSAgICAgIDAuMTAgICAgIDAuMDEgICAgICAgICAgIGN0X2luaXQgKHRyZWVzLmM6MzQ5KQotICA3LjY5ICAgICAgMC4xMSAgICAgMC4wMSAgICAgICAgICAgY3RfaW5pdCAodHJlZXMuYzozNTEpCi0gIDcuNjkgICAgICAwLjEyICAgICAwLjAxICAgICAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM4MikKLSAgNy42OSAgICAgIDAuMTMgICAgIDAuMDEgICAgICAgICAgIGN0X2luaXQgKHRyZWVzLmM6Mzg1KQotCi0KLQkJICAgICBDYWxsIGdyYXBoIChleHBsYW5hdGlvbiBmb2xsb3dzKQotCi0KLWdyYW51bGFyaXR5OiBlYWNoIHNhbXBsZSBoaXQgY292ZXJzIDQgYnl0ZShzKSBmb3IgNy42OSUgb2YgMC4xMyBzZWNvbmRzCi0KLSAgJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuICAgIGNhbGxlZCAgICAgbmFtZQotCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8xMzQ5NiAgICAgICBuYW1lX3Rvb19sb25nIChnemlwLmM6MTQ0MCkKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAxLzEzNDk2ICAgICAgIGRlZmxhdGUgKGRlZmxhdGUuYzo3NjMpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8xMzQ5NiAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM5NikKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAyLzEzNDk2ICAgICAgIGRlZmxhdGUgKGRlZmxhdGUuYzo3MjcpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgNC8xMzQ5NiAgICAgICBkZWZsYXRlIChkZWZsYXRlLmM6Njg2KQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDUvMTM0OTYgICAgICAgZGVmbGF0ZSAoZGVmbGF0ZS5jOjY3NSkKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgIDEyLzEzNDk2ICAgICAgIGRlZmxhdGUgKGRlZmxhdGUuYzo2NzkpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAxNi8xMzQ5NiAgICAgICBkZWZsYXRlIChkZWZsYXRlLmM6NzMwKQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAxMjgvMTM0OTYgICAgICAgZGVmbGF0ZV9mYXN0IChkZWZsYXRlLmM6NjU0KQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgIDMwNzEvMTM0OTYgICAgICAgY3RfaW5pdCAodHJlZXMuYzozODQpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgMzczMC8xMzQ5NiAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM4NSkKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICA2NTI1LzEzNDk2ICAgICAgIGN0X2luaXQgKHRyZWVzLmM6Mzg3KQotWzZdICAwLjAgICAgMC4wMCAgICAwLjAwICAgMTM0OTYgICAgICAgICBpbml0X2Jsb2NrICh0cmVlcy5jOjQwOCkKLQotQGVuZCBzbWFsbGV4YW1wbGUKLQotCi1Abm9kZSBBbm5vdGF0ZWQgU291cmNlLCxMaW5lLWJ5LWxpbmUsT3V0cHV0Ci1Ac2VjdGlvbiBUaGUgQW5ub3RhdGVkIFNvdXJjZSBMaXN0aW5nCi0KLUBjb2Rle2dwcm9mfSdzIEBzYW1wey1BfSBvcHRpb24gdHJpZ2dlcnMgYW4gYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nLAotd2hpY2ggbGlzdHMgdGhlIHByb2dyYW0ncyBzb3VyY2UgY29kZSwgZWFjaCBmdW5jdGlvbiBsYWJlbGVkIHdpdGggdGhlCi1udW1iZXIgb2YgdGltZXMgaXQgd2FzIGNhbGxlZC4gIFlvdSBtYXkgYWxzbyBuZWVkIHRvIHNwZWNpZnkgdGhlCi1Ac2FtcHstSX0gb3B0aW9uLCBpZiBAY29kZXtncHJvZn0gY2FuJ3QgZmluZCB0aGUgc291cmNlIGNvZGUgZmlsZXMuCi0KLUNvbXBpbGluZyB3aXRoIEBzYW1we2djYyBAZG90c3t9IC1nIC1wZyAtYX0gYXVnbWVudHMgeW91ciBwcm9ncmFtCi13aXRoIGJhc2ljLWJsb2NrIGNvdW50aW5nIGNvZGUsIGluIGFkZGl0aW9uIHRvIGZ1bmN0aW9uIGNvdW50aW5nIGNvZGUuCi1UaGlzIGVuYWJsZXMgQGNvZGV7Z3Byb2Z9IHRvIGRldGVybWluZSBob3cgbWFueSB0aW1lcyBlYWNoIGxpbmUKLW9mIGNvZGUgd2FzIGV4ZXVjdGVkLgotRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24sIHRha2VuIGZyb20gZ3ppcCwKLXdpdGggbGluZSBudW1iZXJzIGFkZGVkOgotCi1Ac21hbGxleGFtcGxlCi0gMSB1bGcgdXBkY3JjKHMsIG4pCi0gMiAgICAgdWNoICpzOwotIDMgICAgIHVuc2lnbmVkIG47Ci0gNCBAewotIDUgICAgIHJlZ2lzdGVyIHVsZyBjOwotIDYKLSA3ICAgICBzdGF0aWMgdWxnIGNyYyA9ICh1bGcpMHhmZmZmZmZmZkw7Ci0gOAotIDkgICAgIGlmIChzID09IE5VTEwpIEB7Ci0xMCAgICAgICAgIGMgPSAweGZmZmZmZmZmTDsKLTExICAgICBAfSBlbHNlIEB7Ci0xMiAgICAgICAgIGMgPSBjcmM7Ci0xMyAgICAgICAgIGlmIChuKSBkbyBAewotMTQgICAgICAgICAgICAgYyA9IGNyY18zMl90YWJbLi4uXTsKLTE1ICAgICAgICAgQH0gd2hpbGUgKC0tbik7Ci0xNiAgICAgQH0KLTE3ICAgICBjcmMgPSBjOwotMTggICAgIHJldHVybiBjIF4gMHhmZmZmZmZmZkw7Ci0xOSBAfQotCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXt1cGRjcmN9IGhhcyBhdCBsZWFzdCBmaXZlIGJhc2ljLWJsb2Nrcy4KLU9uZSBpcyB0aGUgZnVuY3Rpb24gaXRzZWxmLiAgVGhlCi1AY29kZXtpZn0gc3RhdGVtZW50IG9uIGxpbmUgOSBnZW5lcmF0ZXMgdHdvIG1vcmUgYmFzaWMtYmxvY2tzLCBvbmUKLWZvciBlYWNoIGJyYW5jaCBvZiB0aGUgQGNvZGV7aWZ9LiAgQSBmb3VydGggYmFzaWMtYmxvY2sgcmVzdWx0cyBmcm9tCi10aGUgQGNvZGV7aWZ9IG9uIGxpbmUgMTMsIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIEBjb2Rle2RvfSBsb29wIGZvcm0KLXRoZSBmaWZ0aCBiYXNpYy1ibG9jay4gIFRoZSBjb21waWxlciBtYXkgYWxzbyBnZW5lcmF0ZSBhZGRpdGlvbmFsCi1iYXNpYy1ibG9ja3MgdG8gaGFuZGxlIHZhcmlvdXMgc3BlY2lhbCBjYXNlcy4KLQotQSBwcm9ncmFtIGF1Z21lbnRlZCBmb3IgYmFzaWMtYmxvY2sgY291bnRpbmcgY2FuIGJlIGFuYWx5emVkIHdpdGgKLUBjb2Rle2dwcm9mIC1sIC1BfS4gIEkgYWxzbyBzdWdnZXN0IHVzZSBvZiB0aGUgQHNhbXB7LXh9IG9wdGlvbiwKLXdoaWNoIGVuc3VyZXMgdGhhdCBlYWNoIGxpbmUgb2YgY29kZSBpcyBsYWJlbGVkIGF0IGxlYXN0IG9uY2UuCi1IZXJlIGlzIEBjb2Rle3VwZGNyY30ncwotYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nIGZvciBhIHNhbXBsZSBAY29kZXtnemlwfSBydW46Ci0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgICAgICAgICB1bGcgdXBkY3JjKHMsIG4pCi0gICAgICAgICAgICAgICAgICAgIHVjaCAqczsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbjsKLSAgICAgICAgICAgIDIgLT5AewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlciB1bGcgYzsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljIHVsZyBjcmMgPSAodWxnKTB4ZmZmZmZmZmZMOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgMiAtPiAgICBpZiAocyA9PSBOVUxMKSBAewotICAgICAgICAgICAgMSAtPgljID0gMHhmZmZmZmZmZkw7Ci0gICAgICAgICAgICAxIC0+ICAgIEB9IGVsc2UgQHsKLSAgICAgICAgICAgIDEgLT4JYyA9IGNyYzsKLSAgICAgICAgICAgIDEgLT4gICAgICAgIGlmIChuKSBkbyBAewotICAgICAgICAyNjMxMiAtPiAgICAgICAgICAgIGMgPSBjcmNfMzJfdGFiWy4uLl07Ci0yNjMxMiwxLDI2MzExIC0+ICAgICAgICBAfSB3aGlsZSAoLS1uKTsKLSAgICAgICAgICAgICAgICAgICAgQH0KLSAgICAgICAgICAgIDIgLT4gICAgY3JjID0gYzsKLSAgICAgICAgICAgIDIgLT4gICAgcmV0dXJuIGMgXiAweGZmZmZmZmZmTDsKLSAgICAgICAgICAgIDIgLT5AfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotSW4gdGhpcyBleGFtcGxlLCB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZCB0d2ljZSwgcGFzc2luZyBvbmNlIHRocm91Z2gKLWVhY2ggYnJhbmNoIG9mIHRoZSBAY29kZXtpZn0gc3RhdGVtZW50LiAgVGhlIGJvZHkgb2YgdGhlIEBjb2Rle2RvfQotbG9vcCB3YXMgZXhlY3V0ZWQgYSB0b3RhbCBvZiAyNjMxMiB0aW1lcy4gIE5vdGUgaG93IHRoZSBAY29kZXt3aGlsZX0KLXN0YXRlbWVudCBpcyBhbm5vdGF0ZWQuICBJdCBiZWdhbiBleGVjdXRpb24gMjYzMTIgdGltZXMsIG9uY2UgZm9yCi1lYWNoIGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBsb29wLiAgT25lIG9mIHRob3NlIHRpbWVzICh0aGUgbGFzdCB0aW1lKQotaXQgZXhpdGVkLCB3aGlsZSBpdCBicmFuY2hlZCBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvb3AgMjYzMTEgdGltZXMuCi0KLUBub2RlIEluYWNjdXJhY3kKLUBjaGFwdGVyIEluYWNjdXJhY3kgb2YgQGNvZGV7Z3Byb2Z9IE91dHB1dAotCi1AbWVudQotKiBTYW1wbGluZyBFcnJvcjo6ICAgICAgU3RhdGlzdGljYWwgbWFyZ2lucyBvZiBlcnJvcgotKiBBc3N1bXB0aW9uczo6ICAgICAgICAgRXN0aW1hdGluZyBjaGlsZHJlbiB0aW1lcwotQGVuZCBtZW51Ci0KLUBub2RlIFNhbXBsaW5nIEVycm9yLEFzc3VtcHRpb25zLCxJbmFjY3VyYWN5Ci1Ac2VjdGlvbiBTdGF0aXN0aWNhbCBTYW1wbGluZyBFcnJvcgotCi1UaGUgcnVuLXRpbWUgZmlndXJlcyB0aGF0IEBjb2Rle2dwcm9mfSBnaXZlcyB5b3UgYXJlIGJhc2VkIG9uIGEgc2FtcGxpbmcKLXByb2Nlc3MsIHNvIHRoZXkgYXJlIHN1YmplY3QgdG8gc3RhdGlzdGljYWwgaW5hY2N1cmFjeS4gIElmIGEgZnVuY3Rpb24gcnVucwotb25seSBhIHNtYWxsIGFtb3VudCBvZiB0aW1lLCBzbyB0aGF0IG9uIHRoZSBhdmVyYWdlIHRoZSBzYW1wbGluZyBwcm9jZXNzCi1vdWdodCB0byBjYXRjaCB0aGF0IGZ1bmN0aW9uIGluIHRoZSBhY3Qgb25seSBvbmNlLCB0aGVyZSBpcyBhIHByZXR0eSBnb29kCi1jaGFuY2UgaXQgd2lsbCBhY3R1YWxseSBmaW5kIHRoYXQgZnVuY3Rpb24gemVybyB0aW1lcywgb3IgdHdpY2UuCi0KLUJ5IGNvbnRyYXN0LCB0aGUgbnVtYmVyLW9mLWNhbGxzIGFuZCBiYXNpYy1ibG9jayBmaWd1cmVzCi1hcmUgZGVyaXZlZCBieSBjb3VudGluZywgbm90Ci1zYW1wbGluZy4gIFRoZXkgYXJlIGNvbXBsZXRlbHkgYWNjdXJhdGUgYW5kIHdpbGwgbm90IHZhcnkgZnJvbSBydW4gdG8gcnVuCi1pZiB5b3VyIHByb2dyYW0gaXMgZGV0ZXJtaW5pc3RpYy4KLQotVGhlIEBkZm57c2FtcGxpbmcgcGVyaW9kfSB0aGF0IGlzIHByaW50ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmxhdAotcHJvZmlsZSBzYXlzIGhvdyBvZnRlbiBzYW1wbGVzIGFyZSB0YWtlbi4gIFRoZSBydWxlIG9mIHRodW1iIGlzIHRoYXQgYQotcnVuLXRpbWUgZmlndXJlIGlzIGFjY3VyYXRlIGlmIGl0IGlzIGNvbnNpZGVyYWJseSBiaWdnZXIgdGhhbiB0aGUgc2FtcGxpbmcKLXBlcmlvZC4KLQotVGhlIGFjdHVhbCBhbW91bnQgb2YgZXJyb3IgY2FuIGJlIHByZWRpY3RlZC4KLUZvciBAdmFye259IHNhbXBsZXMsIHRoZSBAZW1waHtleHBlY3RlZH0gZXJyb3IKLWlzIHRoZSBzcXVhcmUtcm9vdCBvZiBAdmFye259LiAgRm9yIGV4YW1wbGUsCi1pZiB0aGUgc2FtcGxpbmcgcGVyaW9kIGlzIDAuMDEgc2Vjb25kcyBhbmQgQGNvZGV7Zm9vfSdzIHJ1bi10aW1lIGlzIDEgc2Vjb25kLAotQHZhcntufSBpcyAxMDAgc2FtcGxlcyAoMSBzZWNvbmQvMC4wMSBzZWNvbmRzKSwgc3FydChAdmFye259KSBpcyAxMCBzYW1wbGVzLCBzbwotdGhlIGV4cGVjdGVkIGVycm9yIGluIEBjb2Rle2Zvb30ncyBydW4tdGltZSBpcyAwLjEgc2Vjb25kcyAoMTAqMC4wMSBzZWNvbmRzKSwKLW9yIHRlbiBwZXJjZW50IG9mIHRoZSBvYnNlcnZlZCB2YWx1ZS4KLUFnYWluLCBpZiB0aGUgc2FtcGxpbmcgcGVyaW9kIGlzIDAuMDEgc2Vjb25kcyBhbmQgQGNvZGV7YmFyfSdzIHJ1bi10aW1lIGlzCi0xMDAgc2Vjb25kcywgQHZhcntufSBpcyAxMDAwMCBzYW1wbGVzLCBzcXJ0KEB2YXJ7bn0pIGlzIDEwMCBzYW1wbGVzLCBzbwotdGhlIGV4cGVjdGVkIGVycm9yIGluIEBjb2Rle2Jhcn0ncyBydW4tdGltZSBpcyAxIHNlY29uZCwKLW9yIG9uZSBwZXJjZW50IG9mIHRoZSBvYnNlcnZlZCB2YWx1ZS4KLUl0IGlzIGxpa2VseSB0bwotdmFyeSB0aGlzIG11Y2ggQGVtcGh7b24gdGhlIGF2ZXJhZ2V9IGZyb20gb25lIHByb2ZpbGluZyBydW4gdG8gdGhlIG5leHQuCi0oQGVtcGh7U29tZXRpbWVzfSBpdCB3aWxsIHZhcnkgbW9yZS4pCi0KLVRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IGEgc21hbGwgcnVuLXRpbWUgZmlndXJlIGlzIGRldm9pZCBvZiBpbmZvcm1hdGlvbi4KLUlmIHRoZSBwcm9ncmFtJ3MgQGVtcGh7dG90YWx9IHJ1bi10aW1lIGlzIGxhcmdlLCBhIHNtYWxsIHJ1bi10aW1lIGZvciBvbmUKLWZ1bmN0aW9uIGRvZXMgdGVsbCB5b3UgdGhhdCB0aGF0IGZ1bmN0aW9uIHVzZWQgYW4gaW5zaWduaWZpY2FudCBmcmFjdGlvbiBvZgotdGhlIHdob2xlIHByb2dyYW0ncyB0aW1lLiAgVXN1YWxseSB0aGlzIG1lYW5zIGl0IGlzIG5vdCB3b3J0aCBvcHRpbWl6aW5nLgotCi1PbmUgd2F5IHRvIGdldCBtb3JlIGFjY3VyYWN5IGlzIHRvIGdpdmUgeW91ciBwcm9ncmFtIG1vcmUgKGJ1dCBzaW1pbGFyKQotaW5wdXQgZGF0YSBzbyBpdCB3aWxsIHRha2UgbG9uZ2VyLiAgQW5vdGhlciB3YXkgaXMgdG8gY29tYmluZSB0aGUgZGF0YSBmcm9tCi1zZXZlcmFsIHJ1bnMsIHVzaW5nIHRoZSBAc2FtcHstc30gb3B0aW9uIG9mIEBjb2Rle2dwcm9mfS4gIEhlcmUgaXMgaG93OgotCi1AZW51bWVyYXRlCi1AaXRlbQotUnVuIHlvdXIgcHJvZ3JhbSBvbmNlLgotCi1AaXRlbQotSXNzdWUgdGhlIGNvbW1hbmQgQHNhbXB7bXYgZ21vbi5vdXQgZ21vbi5zdW19LgotCi1AaXRlbQotUnVuIHlvdXIgcHJvZ3JhbSBhZ2FpbiwgdGhlIHNhbWUgYXMgYmVmb3JlLgotCi1AaXRlbQotTWVyZ2UgdGhlIG5ldyBkYXRhIGluIEBmaWxle2dtb24ub3V0fSBpbnRvIEBmaWxle2dtb24uc3VtfSB3aXRoIHRoaXMgY29tbWFuZDoKLQotQGV4YW1wbGUKLWdwcm9mIC1zIEB2YXJ7ZXhlY3V0YWJsZS1maWxlfSBnbW9uLm91dCBnbW9uLnN1bQotQGVuZCBleGFtcGxlCi0KLUBpdGVtCi1SZXBlYXQgdGhlIGxhc3QgdHdvIHN0ZXBzIGFzIG9mdGVuIGFzIHlvdSB3aXNoLgotCi1AaXRlbQotQW5hbHl6ZSB0aGUgY3VtdWxhdGl2ZSBkYXRhIHVzaW5nIHRoaXMgY29tbWFuZDoKLQotQGV4YW1wbGUKLWdwcm9mIEB2YXJ7ZXhlY3V0YWJsZS1maWxlfSBnbW9uLnN1bSA+IEB2YXJ7b3V0cHV0LWZpbGV9Ci1AZW5kIGV4YW1wbGUKLUBlbmQgZW51bWVyYXRlCi0KLUBub2RlIEFzc3VtcHRpb25zLCxTYW1wbGluZyBFcnJvcixJbmFjY3VyYWN5Ci1Ac2VjdGlvbiBFc3RpbWF0aW5nIEBjb2Rle2NoaWxkcmVufSBUaW1lcwotCi1Tb21lIG9mIHRoZSBmaWd1cmVzIGluIHRoZSBjYWxsIGdyYXBoIGFyZSBlc3RpbWF0ZXMtLS1mb3IgZXhhbXBsZSwgdGhlCi1AY29kZXtjaGlsZHJlbn0gdGltZSB2YWx1ZXMgYW5kIGFsbCB0aGUgdGhlIHRpbWUgZmlndXJlcyBpbiBjYWxsZXIgYW5kCi1zdWJyb3V0aW5lIGxpbmVzLgotCi1UaGVyZSBpcyBubyBkaXJlY3QgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgbWVhc3VyZW1lbnRzIGluIHRoZSBwcm9maWxlCi1kYXRhIGl0c2VsZi4gIEluc3RlYWQsIEBjb2Rle2dwcm9mfSBlc3RpbWF0ZXMgdGhlbSBieSBtYWtpbmcgYW4gYXNzdW1wdGlvbgotYWJvdXQgeW91ciBwcm9ncmFtIHRoYXQgbWlnaHQgb3IgbWlnaHQgbm90IGJlIHRydWUuCi0KLVRoZSBhc3N1bXB0aW9uIG1hZGUgaXMgdGhhdCB0aGUgYXZlcmFnZSB0aW1lIHNwZW50IGluIGVhY2ggY2FsbCB0byBhbnkKLWZ1bmN0aW9uIEBjb2Rle2Zvb30gaXMgbm90IGNvcnJlbGF0ZWQgd2l0aCB3aG8gY2FsbGVkIEBjb2Rle2Zvb30uICBJZgotQGNvZGV7Zm9vfSB1c2VkIDUgc2Vjb25kcyBpbiBhbGwsIGFuZCAyLzUgb2YgdGhlIGNhbGxzIHRvIEBjb2Rle2Zvb30gY2FtZQotZnJvbSBAY29kZXthfSwgdGhlbiBAY29kZXtmb299IGNvbnRyaWJ1dGVzIDIgc2Vjb25kcyB0byBAY29kZXthfSdzCi1AY29kZXtjaGlsZHJlbn0gdGltZSwgYnkgYXNzdW1wdGlvbi4KLQotVGhpcyBhc3N1bXB0aW9uIGlzIHVzdWFsbHkgdHJ1ZSBlbm91Z2gsIGJ1dCBmb3Igc29tZSBwcm9ncmFtcyBpdCBpcyBmYXIKLWZyb20gdHJ1ZS4gIFN1cHBvc2UgdGhhdCBAY29kZXtmb299IHJldHVybnMgdmVyeSBxdWlja2x5IHdoZW4gaXRzIGFyZ3VtZW50Ci1pcyB6ZXJvOyBzdXBwb3NlIHRoYXQgQGNvZGV7YX0gYWx3YXlzIHBhc3NlcyB6ZXJvIGFzIGFuIGFyZ3VtZW50LCB3aGlsZQotb3RoZXIgY2FsbGVycyBvZiBAY29kZXtmb299IHBhc3Mgb3RoZXIgYXJndW1lbnRzLiAgSW4gdGhpcyBwcm9ncmFtLCBhbGwgdGhlCi10aW1lIHNwZW50IGluIEBjb2Rle2Zvb30gaXMgaW4gdGhlIGNhbGxzIGZyb20gY2FsbGVycyBvdGhlciB0aGFuIEBjb2Rle2F9LgotQnV0IEBjb2Rle2dwcm9mfSBoYXMgbm8gd2F5IG9mIGtub3dpbmcgdGhpczsgaXQgd2lsbCBibGluZGx5IGFuZAotaW5jb3JyZWN0bHkgY2hhcmdlIDIgc2Vjb25kcyBvZiB0aW1lIGluIEBjb2Rle2Zvb30gdG8gdGhlIGNoaWxkcmVuIG9mCi1AY29kZXthfS4KLQotQGMgRklYTUUgLSBoYXMgdGhpcyBiZWVuIGZpeGVkPwotV2UgaG9wZSBzb21lIGRheSB0byBwdXQgbW9yZSBjb21wbGV0ZSBkYXRhIGludG8gQGZpbGV7Z21vbi5vdXR9LCBzbyB0aGF0Ci10aGlzIGFzc3VtcHRpb24gaXMgbm8gbG9uZ2VyIG5lZWRlZCwgaWYgd2UgY2FuIGZpZ3VyZSBvdXQgaG93LiAgRm9yIHRoZQotbm9uY2UsIHRoZSBlc3RpbWF0ZWQgZmlndXJlcyBhcmUgdXN1YWxseSBtb3JlIHVzZWZ1bCB0aGFuIG1pc2xlYWRpbmcuCi0KLUBub2RlIEhvdyBkbyBJPwotQGNoYXB0ZXIgQW5zd2VycyB0byBDb21tb24gUXVlc3Rpb25zCi0KLUB0YWJsZSBAYXNpcwotQGl0ZW0gSG93IGRvIEkgZmluZCB3aGljaCBsaW5lcyBpbiBteSBwcm9ncmFtIHdlcmUgZXhlY3V0ZWQgdGhlIG1vc3QgdGltZXM/Ci0KLUNvbXBpbGUgeW91ciBwcm9ncmFtIHdpdGggYmFzaWMtYmxvY2sgY291bnRpbmcgZW5hYmxlZCwgcnVuIGl0LCB0aGVuCi11c2UgdGhlIGZvbGxvd2luZyBwaXBlbGluZToKLQotQGV4YW1wbGUKLWdwcm9mIC1sIC1DIEB2YXJ7b2JqZmlsZX0gfCBzb3J0IC1rIDMgLW4gLXIKLUBlbmQgZXhhbXBsZQotCi1UaGlzIGxpc3Rpbmcgd2lsbCBzaG93IHlvdSB0aGUgbGluZXMgaW4geW91ciBjb2RlIGV4ZWN1dGVkIG1vc3Qgb2Z0ZW4sCi1idXQgbm90IG5lY2Vzc2FyaWx5IHRob3NlIHRoYXQgY29uc3VtZWQgdGhlIG1vc3QgdGltZS4KLQotQGl0ZW0gSG93IGRvIEkgZmluZCB3aGljaCBsaW5lcyBpbiBteSBwcm9ncmFtIGNhbGxlZCBhIHBhcnRpY3VsYXIgZnVuY3Rpb24/Ci0KLVVzZSBAY29kZXtncHJvZiAtbH0gYW5kIGxvb2t1cCB0aGUgZnVuY3Rpb24gaW4gdGhlIGNhbGwgZ3JhcGguCi1UaGUgY2FsbGVycyB3aWxsIGJlIGJyb2tlbiBkb3duIGJ5IGZ1bmN0aW9uIGFuZCBsaW5lIG51bWJlci4KLQotQGl0ZW0gSG93IGRvIEkgYW5hbHl6ZSBhIHByb2dyYW0gdGhhdCBydW5zIGZvciBsZXNzIHRoYW4gYSBzZWNvbmQ/Ci0KLVRyeSB1c2luZyBhIHNoZWxsIHNjcmlwdCBsaWtlIHRoaXMgb25lOgotCi1AZXhhbXBsZQotZm9yIGkgaW4gYHNlcSAxIDEwMGA7IGRvCi0gIGZhc3Rwcm9nCi0gIG12IGdtb24ub3V0IGdtb24ub3V0LiRpCi1kb25lCi0KLWdwcm9mIC1zIGZhc3Rwcm9nIGdtb24ub3V0LioKLQotZ3Byb2YgZmFzdHByb2cgZ21vbi5zdW0KLUBlbmQgZXhhbXBsZQotCi1JZiB5b3VyIHByb2dyYW0gaXMgY29tcGxldGVseSBkZXRlcm1pbmlzdGljLCBhbGwgdGhlIGNhbGwgY291bnRzCi13aWxsIGJlIHNpbXBsZSBtdWx0aXBsZXMgb2YgMTAwIChpLmUuIGEgZnVuY3Rpb24gY2FsbGVkIG9uY2UgaW4KLWVhY2ggcnVuIHdpbGwgYXBwZWFyIHdpdGggYSBjYWxsIGNvdW50IG9mIDEwMCkuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgSW5jb21wYXRpYmlsaXRpZXMKLUBjaGFwdGVyIEluY29tcGF0aWJpbGl0aWVzIHdpdGggVW5peCBAY29kZXtncHJvZn0KLQotQHNje2dudX0gQGNvZGV7Z3Byb2Z9IGFuZCBCZXJrZWxleSBVbml4IEBjb2Rle2dwcm9mfSB1c2UgdGhlIHNhbWUgZGF0YQotZmlsZSBAZmlsZXtnbW9uLm91dH0sIGFuZCBwcm92aWRlIGVzc2VudGlhbGx5IHRoZSBzYW1lIGluZm9ybWF0aW9uLiAgQnV0Ci10aGVyZSBhcmUgYSBmZXcgZGlmZmVyZW5jZXMuCi0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1Ac2N7Z251fSBAY29kZXtncHJvZn0gdXNlcyBhIG5ldywgZ2VuZXJhbGl6ZWQgZmlsZSBmb3JtYXQgd2l0aCBzdXBwb3J0Ci1mb3IgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cyBhbmQgbm9uLXJlYWx0aW1lIGhpc3RvZ3JhbXMuICBBIG1hZ2ljCi1jb29raWUgYW5kIHZlcnNpb24gbnVtYmVyIGFsbG93cyBAY29kZXtncHJvZn0gdG8gZWFzaWx5IGlkZW50aWZ5Ci1uZXcgc3R5bGUgZmlsZXMuICBPbGQgQlNELXN0eWxlIGZpbGVzIGNhbiBzdGlsbCBiZSByZWFkLgotQHhyZWZ7RmlsZSBGb3JtYXR9LgotCi1AaXRlbQotRm9yIGEgcmVjdXJzaXZlIGZ1bmN0aW9uLCBVbml4IEBjb2Rle2dwcm9mfSBsaXN0cyB0aGUgZnVuY3Rpb24gYXMgYQotcGFyZW50IGFuZCBhcyBhIGNoaWxkLCB3aXRoIGEgQGNvZGV7Y2FsbHN9IGZpZWxkIHRoYXQgbGlzdHMgdGhlIG51bWJlcgotb2YgcmVjdXJzaXZlIGNhbGxzLiAgQHNje2dudX0gQGNvZGV7Z3Byb2Z9IG9taXRzIHRoZXNlIGxpbmVzIGFuZCBwdXRzCi10aGUgbnVtYmVyIG9mIHJlY3Vyc2l2ZSBjYWxscyBpbiB0aGUgcHJpbWFyeSBsaW5lLgotCi1AaXRlbQotV2hlbiBhIGZ1bmN0aW9uIGlzIHN1cHByZXNzZWQgZnJvbSB0aGUgY2FsbCBncmFwaCB3aXRoIEBzYW1wey1lfSwgQHNje2dudX0KLUBjb2Rle2dwcm9mfSBzdGlsbCBsaXN0cyBpdCBhcyBhIHN1YnJvdXRpbmUgb2YgZnVuY3Rpb25zIHRoYXQgY2FsbCBpdC4KLQotQGl0ZW0KLUBzY3tnbnV9IEBjb2Rle2dwcm9mfSBhY2NlcHRzIHRoZSBAc2FtcHsta30gd2l0aCBpdHMgYXJndW1lbnQKLWluIHRoZSBmb3JtIEBzYW1we2Zyb20vdG99LCBpbnN0ZWFkIG9mIEBzYW1we2Zyb20gdG99LgotCi1AaXRlbQotSW4gdGhlIGFubm90YXRlZCBzb3VyY2UgbGlzdGluZywKLWlmIHRoZXJlIGFyZSBtdWx0aXBsZSBiYXNpYyBibG9ja3Mgb24gdGhlIHNhbWUgbGluZSwKLUBzY3tnbnV9IEBjb2Rle2dwcm9mfSBwcmludHMgYWxsIG9mIHRoZWlyIGNvdW50cywgc2VwZXJhdGVkIGJ5IGNvbW1hcy4KLQotQGlnbm9yZSAtIGl0IGRvZXMgdGhpcyBub3cKLUBpdGVtCi1UaGUgZnVuY3Rpb24gbmFtZXMgcHJpbnRlZCBpbiBAc2N7Z251fSBAY29kZXtncHJvZn0gb3V0cHV0IGRvIG5vdCBpbmNsdWRlCi10aGUgbGVhZGluZyB1bmRlcnNjb3JlcyB0aGF0IGFyZSBhZGRlZCBpbnRlcm5hbGx5IHRvIHRoZSBmcm9udCBvZiBhbGwKLUMgaWRlbnRpZmllcnMgb24gbWFueSBvcGVyYXRpbmcgc3lzdGVtcy4KLUBlbmQgaWdub3JlCi0KLUBpdGVtCi1UaGUgYmx1cmJzLCBmaWVsZCB3aWR0aHMsIGFuZCBvdXRwdXQgZm9ybWF0cyBhcmUgZGlmZmVyZW50LiAgQHNje2dudX0KLUBjb2Rle2dwcm9mfSBwcmludHMgYmx1cmJzIGFmdGVyIHRoZSB0YWJsZXMsIHNvIHRoYXQgeW91IGNhbiBzZWUgdGhlCi10YWJsZXMgd2l0aG91dCBza2lwcGluZyB0aGUgYmx1cmJzLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIERldGFpbHMKLUBjaGFwdGVyIERldGFpbHMgb2YgUHJvZmlsaW5nCi0KLUBtZW51Ci0qIEltcGxlbWVudGF0aW9uOjogICAgICBIb3cgYSBwcm9ncmFtIGNvbGxldHMgcHJvZmlsaW5nIGluZm9ybWF0aW9uCi0qIEZpbGUgRm9ybWF0OjogICAgICAgICBGb3JtYXQgb2YgQHNhbXB7Z21vbi5vdXR9IGZpbGVzCi0qIEludGVybmFsczo6ICAgICAgICAgICBAY29kZXtncHJvZn0ncyBpbnRlcm5hbCBvcGVyYXRpb24KLSogRGVidWdnaW5nOjogICAgICAgICAgIFVzaW5nIEBjb2Rle2dwcm9mfSdzIEBzYW1wey1kfSBvcHRpb24KLUBlbmQgbWVudQotCi1Abm9kZSBJbXBsZW1lbnRhdGlvbixGaWxlIEZvcm1hdCwsRGV0YWlscwotQHNlY3Rpb24gSW1wbGVtZW50YXRpb24gb2YgUHJvZmlsaW5nCi0KLVByb2ZpbGluZyB3b3JrcyBieSBjaGFuZ2luZyBob3cgZXZlcnkgZnVuY3Rpb24gaW4geW91ciBwcm9ncmFtIGlzIGNvbXBpbGVkCi1zbyB0aGF0IHdoZW4gaXQgaXMgY2FsbGVkLCBpdCB3aWxsIHN0YXNoIGF3YXkgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZQotaXQgd2FzIGNhbGxlZCBmcm9tLiAgRnJvbSB0aGlzLCB0aGUgcHJvZmlsZXIgY2FuIGZpZ3VyZSBvdXQgd2hhdCBmdW5jdGlvbgotY2FsbGVkIGl0LCBhbmQgY2FuIGNvdW50IGhvdyBtYW55IHRpbWVzIGl0IHdhcyBjYWxsZWQuICBUaGlzIGNoYW5nZSBpcyBtYWRlCi1ieSB0aGUgY29tcGlsZXIgd2hlbiB5b3VyIHByb2dyYW0gaXMgY29tcGlsZWQgd2l0aCB0aGUgQHNhbXB7LXBnfSBvcHRpb24sCi13aGljaCBjYXVzZXMgZXZlcnkgZnVuY3Rpb24gdG8gY2FsbCBAY29kZXttY291bnR9Ci0ob3IgQGNvZGV7X21jb3VudH0sIG9yIEBjb2Rle19fbWNvdW50fSwgZGVwZW5kaW5nIG9uIHRoZSBPUyBhbmQgY29tcGlsZXIpCi1hcyBvbmUgb2YgaXRzIGZpcnN0IG9wZXJhdGlvbnMuCi0KLVRoZSBAY29kZXttY291bnR9IHJvdXRpbmUsIGluY2x1ZGVkIGluIHRoZSBwcm9maWxpbmcgbGlicmFyeSwKLWlzIHJlc3BvbnNpYmxlIGZvciByZWNvcmRpbmcgaW4gYW4gaW4tbWVtb3J5IGNhbGwgZ3JhcGggdGFibGUKLWJvdGggaXRzIHBhcmVudCByb3V0aW5lICh0aGUgY2hpbGQpIGFuZCBpdHMgcGFyZW50J3MgcGFyZW50LiAgVGhpcyBpcwotdHlwaWNhbGx5IGRvbmUgYnkgZXhhbWluaW5nIHRoZSBzdGFjayBmcmFtZSB0byBmaW5kIGJvdGgKLXRoZSBhZGRyZXNzIG9mIHRoZSBjaGlsZCwgYW5kIHRoZSByZXR1cm4gYWRkcmVzcyBpbiB0aGUgb3JpZ2luYWwgcGFyZW50LgotU2luY2UgdGhpcyBpcyBhIHZlcnkgbWFjaGluZS1kZXBlbmRhbnQgb3BlcmF0aW9uLCBAY29kZXttY291bnR9Ci1pdHNlbGYgaXMgdHlwaWNhbGx5IGEgc2hvcnQgYXNzZW1ibHktbGFuZ3VhZ2Ugc3R1YiByb3V0aW5lCi10aGF0IGV4dHJhY3RzIHRoZSByZXF1aXJlZAotaW5mb3JtYXRpb24sIGFuZCB0aGVuIGNhbGxzIEBjb2Rle19fbWNvdW50X2ludGVybmFsfQotKGEgbm9ybWFsIEMgZnVuY3Rpb24pIHdpdGggdHdvIGFyZ3VtZW50cyAtIEBjb2Rle2Zyb21wY30gYW5kIEBjb2Rle3NlbGZwY30uCi1AY29kZXtfX21jb3VudF9pbnRlcm5hbH0gaXMgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nCi10aGUgaW4tbWVtb3J5IGNhbGwgZ3JhcGgsIHdoaWNoIHJlY29yZHMgQGNvZGV7ZnJvbXBjfSwgQGNvZGV7c2VsZnBjfSwKLWFuZCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggb2YgdGhlc2UgY2FsbCBhcmNzIHdhcyB0cmFuc3ZlcnNlZC4KLQotR0NDIFZlcnNpb24gMiBwcm92aWRlcyBhIG1hZ2ljYWwgZnVuY3Rpb24gKEBjb2Rle19fYnVpbHRpbl9yZXR1cm5fYWRkcmVzc30pLAotd2hpY2ggYWxsb3dzIGEgZ2VuZXJpYyBAY29kZXttY291bnR9IGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlCi1yZXF1aXJlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdGFjayBmcmFtZS4gIEhvd2V2ZXIsIG9uIHNvbWUKLWFyY2hpdGVjdHVyZXMsIG1vc3Qgbm90YWJseSB0aGUgU1BBUkMsIHVzaW5nIHRoaXMgYnVpbHRpbiBjYW4gYmUKLXZlcnkgY29tcHV0YXRpb25hbGx5IGV4cGVuc2l2ZSwgYW5kIGFuIGFzc2VtYmx5IGxhbmd1YWdlIHZlcnNpb24KLW9mIEBjb2Rle21jb3VudH0gaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KLQotTnVtYmVyLW9mLWNhbGxzIGluZm9ybWF0aW9uIGZvciBsaWJyYXJ5IHJvdXRpbmVzIGlzIGNvbGxlY3RlZCBieSB1c2luZyBhCi1zcGVjaWFsIHZlcnNpb24gb2YgdGhlIEMgbGlicmFyeS4gIFRoZSBwcm9ncmFtcyBpbiBpdCBhcmUgdGhlIHNhbWUgYXMgaW4KLXRoZSB1c3VhbCBDIGxpYnJhcnksIGJ1dCB0aGV5IHdlcmUgY29tcGlsZWQgd2l0aCBAc2FtcHstcGd9LiAgSWYgeW91Ci1saW5rIHlvdXIgcHJvZ3JhbSB3aXRoIEBzYW1we2djYyBAZG90c3t9IC1wZ30sIGl0IGF1dG9tYXRpY2FsbHkgdXNlcyB0aGUKLXByb2ZpbGluZyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgotCi1Qcm9maWxpbmcgYWxzbyBpbnZvbHZlcyB3YXRjaGluZyB5b3VyIHByb2dyYW0gYXMgaXQgcnVucywgYW5kIGtlZXBpbmcgYQotaGlzdG9ncmFtIG9mIHdoZXJlIHRoZSBwcm9ncmFtIGNvdW50ZXIgaGFwcGVucyB0byBiZSBldmVyeSBub3cgYW5kIHRoZW4uCi1UeXBpY2FsbHkgdGhlIHByb2dyYW0gY291bnRlciBpcyBsb29rZWQgYXQgYXJvdW5kIDEwMCB0aW1lcyBwZXIgc2Vjb25kIG9mCi1ydW4gdGltZSwgYnV0IHRoZSBleGFjdCBmcmVxdWVuY3kgbWF5IHZhcnkgZnJvbSBzeXN0ZW0gdG8gc3lzdGVtLgotCi1UaGlzIGlzIGRvbmUgaXMgb25lIG9mIHR3byB3YXlzLiAgTW9zdCBVTklYLWxpa2Ugb3BlcmF0aW5nIHN5c3RlbXMKLXByb3ZpZGUgYSBAY29kZXtwcm9maWwoKX0gc3lzdGVtIGNhbGwsIHdoaWNoIHJlZ2lzdGVycyBhIG1lbW9yeQotYXJyYXkgd2l0aCB0aGUga2VybmVsLCBhbG9uZyB3aXRoIGEgc2NhbGUKLWZhY3RvciB0aGF0IGRldGVybWluZXMgaG93IHRoZSBwcm9ncmFtJ3MgYWRkcmVzcyBzcGFjZSBtYXBzCi1pbnRvIHRoZSBhcnJheS4KLVR5cGljYWwgc2NhbGluZyB2YWx1ZXMgY2F1c2UgZXZlcnkgMiB0byA4IGJ5dGVzIG9mIGFkZHJlc3Mgc3BhY2UKLXRvIG1hcCBpbnRvIGEgc2luZ2xlIGFycmF5IHNsb3QuCi1PbiBldmVyeSB0aWNrIG9mIHRoZSBzeXN0ZW0gY2xvY2sKLShhc3N1bWluZyB0aGUgcHJvZmlsZWQgcHJvZ3JhbSBpcyBydW5uaW5nKSwgdGhlIHZhbHVlIG9mIHRoZQotcHJvZ3JhbSBjb3VudGVyIGlzIGV4YW1pbmVkIGFuZCB0aGUgY29ycmVzcG9uZGluZyBzbG90IGluCi10aGUgbWVtb3J5IGFycmF5IGlzIGluY3JlbWVudGVkLiAgU2luY2UgdGhpcyBpcyBkb25lIGluIHRoZSBrZXJuZWwsCi13aGljaCBoYWQgdG8gaW50ZXJydXB0IHRoZSBwcm9jZXNzIGFueXdheSB0byBoYW5kbGUgdGhlIGNsb2NrCi1pbnRlcnJ1cHQsIHZlcnkgbGl0dGxlIGFkZGl0aW9uYWwgc3lzdGVtIG92ZXJoZWFkIGlzIHJlcXVpcmVkLgotCi1Ib3dldmVyLCBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLCBtb3N0IG5vdGFibHkgTGludXggMi4wIChhbmQgZWFybGllciksCi1kbyBub3QgcHJvdmlkZSBhIEBjb2Rle3Byb2ZpbCgpfSBzeXN0ZW0gY2FsbC4gIE9uIHN1Y2ggYSBzeXN0ZW0sCi1hcnJhbmdlbWVudHMgYXJlIG1hZGUgZm9yIHRoZSBrZXJuZWwgdG8gcGVyaW9kaWNhbGx5IGRlbGl2ZXIKLWEgc2lnbmFsIHRvIHRoZSBwcm9jZXNzICh0eXBpY2FsbHkgdmlhIEBjb2Rle3NldGl0aW1lcigpfSksCi13aGljaCB0aGVuIHBlcmZvcm1zIHRoZSBzYW1lIG9wZXJhdGlvbiBvZiBleGFtaW5pbmcgdGhlCi1wcm9ncmFtIGNvdW50ZXIgYW5kIGluY3JlbWVudGluZyBhIHNsb3QgaW4gdGhlIG1lbW9yeSBhcnJheS4KLVNpbmNlIHRoaXMgbWV0aG9kIHJlcXVpcmVzIGEgc2lnbmFsIHRvIGJlIGRlbGl2ZXJlZCB0bwotdXNlciBzcGFjZSBldmVyeSB0aW1lIGEgc2FtcGxlIGlzIHRha2VuLCBpdCB1c2VzIGNvbnNpZGVyYWJseQotbW9yZSBvdmVyaGVhZCB0aGFuIGtlcm5lbC1iYXNlZCBwcm9maWxpbmcuICBBbHNvLCBkdWUgdG8gdGhlCi1hZGRlZCBkZWxheSByZXF1aXJlZCB0byBkZWxpdmVyIHRoZSBzaWduYWwsIHRoaXMgbWV0aG9kIGlzCi1sZXNzIGFjY3VyYXRlIGFzIHdlbGwuCi0KLUEgc3BlY2lhbCBzdGFydHVwIHJvdXRpbmUgYWxsb2NhdGVzIG1lbW9yeSBmb3IgdGhlIGhpc3RvZ3JhbSBhbmQgCi1laXRoZXIgY2FsbHMgQGNvZGV7cHJvZmlsKCl9IG9yIHNldHMgdXAKLWEgY2xvY2sgc2lnbmFsIGhhbmRsZXIuCi1UaGlzIHJvdXRpbmUgKEBjb2Rle21vbnN0YXJ0dXB9KSBjYW4gYmUgaW52b2tlZCBpbiBzZXZlcmFsIHdheXMuCi1PbiBMaW51eCBzeXN0ZW1zLCBhIHNwZWNpYWwgcHJvZmlsaW5nIHN0YXJ0dXAgZmlsZSBAY29kZXtnY3J0MC5vfSwKLXdoaWNoIGludm9rZXMgQGNvZGV7bW9uc3RhcnR1cH0gYmVmb3JlIEBjb2Rle21haW59LAotaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IEBjb2Rle2NydDAub30uCi1Vc2Ugb2YgdGhpcyBzcGVjaWFsIHN0YXJ0dXAgZmlsZSBpcyBvbmUgb2YgdGhlIGVmZmVjdHMKLW9mIHVzaW5nIEBzYW1we2djYyBAZG90c3t9IC1wZ30gdG8gbGluay4KLU9uIFNQQVJDIHN5c3RlbXMsIG5vIHNwZWNpYWwgc3RhcnR1cCBmaWxlcyBhcmUgdXNlZC4KLVJhdGhlciwgdGhlIEBjb2Rle21jb3VudH0gcm91dGluZSwgd2hlbiBpdCBpcyBpbnZva2VkIGZvcgotdGhlIGZpcnN0IHRpbWUgKHR5cGljYWxseSB3aGVuIEBjb2Rle21haW59IGlzIGNhbGxlZCksCi1jYWxscyBAY29kZXttb25zdGFydHVwfS4KLQotSWYgdGhlIGNvbXBpbGVyJ3MgQHNhbXB7LWF9IG9wdGlvbiB3YXMgdXNlZCwgYmFzaWMtYmxvY2sgY291bnRpbmcKLWlzIGFsc28gZW5hYmxlZC4gIEVhY2ggb2JqZWN0IGZpbGUgaXMgdGhlbiBjb21waWxlZCB3aXRoIGEgc3RhdGljIGFycmF5Ci1vZiBjb3VudHMsIGluaXRpYWxseSB6ZXJvLgotSW4gdGhlIGV4ZWN1dGFibGUgY29kZSwgZXZlcnkgdGltZSBhIG5ldyBiYXNpYy1ibG9jayBiZWdpbnMKLShpLmUuIHdoZW4gYW4gQGNvZGV7aWZ9IHN0YXRlbWVudCBhcHBlYXJzKSwgYW4gZXh0cmEgaW5zdHJ1Y3Rpb24KLWlzIGluc2VydGVkIHRvIGluY3JlbWVudCB0aGUgY29ycmVzcG9uZGluZyBjb3VudCBpbiB0aGUgYXJyYXkuCi1BdCBjb21waWxlIHRpbWUsIGEgcGFpcmVkIGFycmF5IHdhcyBjb25zdHJ1Y3RlZCB0aGF0IHJlY29yZGVkCi10aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiBlYWNoIGJhc2ljLWJsb2NrLiAgVGFrZW4gdG9nZXRoZXIsCi10aGUgdHdvIGFycmF5cyByZWNvcmQgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgZXZlcnkgYmFzaWMtYmxvY2ssCi1hbG9uZyB3aXRoIHRoZSBudW1iZXIgb2YgdGltZXMgaXQgd2FzIGV4ZWN1dGVkLgotCi1UaGUgcHJvZmlsaW5nIGxpYnJhcnkgYWxzbyBpbmNsdWRlcyBhIGZ1bmN0aW9uIChAY29kZXttY2xlYW51cH0pIHdoaWNoIGlzCi10eXBpY2FsbHkgcmVnaXN0ZXJlZCB1c2luZyBAY29kZXthdGV4aXQoKX0gdG8gYmUgY2FsbGVkIGFzIHRoZQotcHJvZ3JhbSBleGl0cywgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nIHRoZSBmaWxlIEBmaWxle2dtb24ub3V0fS4KLVByb2ZpbGluZyBpcyB0dXJuZWQgb2ZmLCB2YXJpb3VzIGhlYWRlcnMgYXJlIG91dHB1dCwgYW5kIHRoZSBoaXN0b2dyYW0KLWlzIHdyaXR0ZW4sIGZvbGxvd2VkIGJ5IHRoZSBjYWxsLWdyYXBoIGFyY3MgYW5kIHRoZSBiYXNpYy1ibG9jayBjb3VudHMuCi0KLVRoZSBvdXRwdXQgZnJvbSBAY29kZXtncHJvZn0gZ2l2ZXMgbm8gaW5kaWNhdGlvbiBvZiBwYXJ0cyBvZiB5b3VyIHByb2dyYW0gdGhhdAotYXJlIGxpbWl0ZWQgYnkgSS9PIG9yIHN3YXBwaW5nIGJhbmR3aWR0aC4gIFRoaXMgaXMgYmVjYXVzZSBzYW1wbGVzIG9mIHRoZQotcHJvZ3JhbSBjb3VudGVyIGFyZSB0YWtlbiBhdCBmaXhlZCBpbnRlcnZhbHMgb2YgdGhlIHByb2dyYW0ncyBydW4gdGltZS4KLVRoZXJlZm9yZSwgdGhlCi10aW1lIG1lYXN1cmVtZW50cyBpbiBAY29kZXtncHJvZn0gb3V0cHV0IHNheSBub3RoaW5nIGFib3V0IHRpbWUgdGhhdCB5b3VyCi1wcm9ncmFtIHdhcyBub3QgcnVubmluZy4gIEZvciBleGFtcGxlLCBhIHBhcnQgb2YgdGhlIHByb2dyYW0gdGhhdCBjcmVhdGVzCi1zbyBtdWNoIGRhdGEgdGhhdCBpdCBjYW5ub3QgYWxsIGZpdCBpbiBwaHlzaWNhbCBtZW1vcnkgYXQgb25jZSBtYXkgcnVuIHZlcnkKLXNsb3dseSBkdWUgdG8gdGhyYXNoaW5nLCBidXQgQGNvZGV7Z3Byb2Z9IHdpbGwgc2F5IGl0IHVzZXMgbGl0dGxlIHRpbWUuICBPbgotdGhlIG90aGVyIGhhbmQsIHNhbXBsaW5nIGJ5IHJ1biB0aW1lIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgdGhlIGFtb3VudCBvZgotbG9hZCBkdWUgdG8gb3RoZXIgdXNlcnMgd29uJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZSBvdXRwdXQgeW91IGdldC4KLQotQG5vZGUgRmlsZSBGb3JtYXQsSW50ZXJuYWxzLEltcGxlbWVudGF0aW9uLERldGFpbHMKLUBzZWN0aW9uIFByb2ZpbGluZyBEYXRhIEZpbGUgRm9ybWF0Ci0KLVRoZSBvbGQgQlNELWRlcml2ZWQgZmlsZSBmb3JtYXQgdXNlZCBmb3IgcHJvZmlsZSBkYXRhIGRvZXMgbm90IGNvbnRhaW4gYQotbWFnaWMgY29va2llIHRoYXQgYWxsb3dzIHRvIGNoZWNrIHdoZXRoZXIgYSBkYXRhIGZpbGUgcmVhbGx5IGlzIGEKLWdwcm9mIGZpbGUuICBGdXJ0aGVybW9yZSwgaXQgZG9lcyBub3QgcHJvdmlkZSBhIHZlcnNpb24gbnVtYmVyLCB0aHVzCi1yZW5kZXJpbmcgY2hhbmdlcyB0byB0aGUgZmlsZSBmb3JtYXQgYWxtb3N0IGltcG9zc2libGUuICBAc2N7Z251fSBAY29kZXtncHJvZn0KLXVzZXMgYSBuZXcgZmlsZSBmb3JtYXQgdGhhdCBwcm92aWRlcyB0aGVzZSBmZWF0dXJlcy4gIEZvciBiYWNrd2FyZAotY29tcGF0aWJpbGl0eSwgQHNje2dudX0gQGNvZGV7Z3Byb2Z9IGNvbnRpbnVlcyB0byBzdXBwb3J0IHRoZSBvbGQgQlNELWRlcml2ZWQKLWZvcm1hdCwgYnV0IG5vdCBhbGwgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZCB3aXRoIGl0LiAgRm9yIGV4YW1wbGUsCi1iYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzIGNhbm5vdCBiZSBhY2NvbW1vZGF0ZWQgYnkgdGhlIG9sZCBmaWxlCi1mb3JtYXQuCi0KLVRoZSBuZXcgZmlsZSBmb3JtYXQgaXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZSBAZmlsZXtnbW9uX291dC5ofS4gIEl0Ci1jb25zaXN0cyBvZiBhIGhlYWRlciBjb250YWluaW5nIHRoZSBtYWdpYyBjb29raWUgYW5kIGEgdmVyc2lvbiBudW1iZXIsCi1hcyB3ZWxsIGFzIHNvbWUgc3BhcmUgYnl0ZXMgYXZhaWxhYmxlIGZvciBmdXR1cmUgZXh0ZW5zaW9ucy4gIEFsbCBkYXRhCi1pbiBhIHByb2ZpbGUgZGF0YSBmaWxlIGlzIGluIHRoZSBuYXRpdmUgZm9ybWF0IG9mIHRoZSBob3N0IG9uIHdoaWNoCi10aGUgcHJvZmlsZSB3YXMgY29sbGVjdGVkLiAgQHNje2dudX0gQGNvZGV7Z3Byb2Z9IGFkYXB0cyBhdXRvbWF0aWNhbGx5IHRvIHRoZQotYnl0ZS1vcmRlciBpbiB1c2UuCi0KLUluIHRoZSBuZXcgZmlsZSBmb3JtYXQsIHRoZSBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgYSBzZXF1ZW5jZSBvZgotcmVjb3Jkcy4gIEN1cnJlbnRseSwgdGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCByZWNvcmQgdHlwZXM6IGhpc3RvZ3JhbQotcmVjb3JkcywgY2FsbC1ncmFwaCBhcmMgcmVjb3JkcywgYW5kIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudAotcmVjb3Jkcy4gIEVhY2ggZmlsZSBjYW4gY29udGFpbiBhbnkgbnVtYmVyIG9mIGVhY2ggcmVjb3JkIHR5cGUuICBXaGVuCi1yZWFkaW5nIGEgZmlsZSwgQHNje2dudX0gQGNvZGV7Z3Byb2Z9IHdpbGwgZW5zdXJlIHJlY29yZHMgb2YgdGhlIHNhbWUgdHlwZSBhcmUKLWNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyIGFuZCBjb21wdXRlIHRoZSB1bmlvbiBvZiBhbGwgcmVjb3Jkcy4gIEZvcgotZXhhbXBsZSwgZm9yIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMsIHRoZSB1bmlvbiBpcyBzaW1wbHkgdGhlIHN1bQotb2YgYWxsIGV4ZWN1dGlvbiBjb3VudHMgZm9yIGVhY2ggYmFzaWMtYmxvY2suCi0KLUBzdWJzZWN0aW9uIEhpc3RvZ3JhbSBSZWNvcmRzCi0KLUhpc3RvZ3JhbSByZWNvcmRzIGNvbnNpc3Qgb2YgYSBoZWFkZXIgdGhhdCBpcyBmb2xsb3dlZCBieSBhbiBhcnJheSBvZgotYmlucy4gIFRoZSBoZWFkZXIgY29udGFpbnMgdGhlIHRleHQtc2VnbWVudCByYW5nZSB0aGF0IHRoZSBoaXN0b2dyYW0KLXNwYW5zLCB0aGUgc2l6ZSBvZiB0aGUgaGlzdG9ncmFtIGluIGJ5dGVzICh1bmxpa2UgaW4gdGhlIG9sZCBCU0QKLWZvcm1hdCwgdGhpcyBkb2VzIG5vdCBpbmNsdWRlIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIpLCB0aGUgcmF0ZSBvZiB0aGUKLXByb2ZpbGluZyBjbG9jaywgYW5kIHRoZSBwaHlzaWNhbCBkaW1lbnNpb24gdGhhdCB0aGUgYmluIGNvdW50cwotcmVwcmVzZW50IGFmdGVyIGJlaW5nIHNjYWxlZCBieSB0aGUgcHJvZmlsaW5nIGNsb2NrIHJhdGUuICBUaGUKLXBoeXNpY2FsIGRpbWVuc2lvbiBpcyBzcGVjaWZpZWQgaW4gdHdvIHBhcnRzOiBhIGxvbmcgbmFtZSBvZiB1cCB0byAxNQotY2hhcmFjdGVycyBhbmQgYSBzaW5nbGUgY2hhcmFjdGVyIGFiYnJldmlhdGlvbi4gIEZvciBleGFtcGxlLCBhCi1oaXN0b2dyYW0gcmVwcmVzZW50aW5nIHJlYWwtdGltZSB3b3VsZCBzcGVjaWZ5IHRoZSBsb25nIG5hbWUgYXMKLSJzZWNvbmRzIiBhbmQgdGhlIGFiYnJldmlhdGlvbiBhcyAicyIuICBUaGlzIGZlYXR1cmUgaXMgdXNlZnVsIGZvcgotYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQgcGVyZm9ybWFuY2UgbW9uaXRvciBoYXJkd2FyZSAod2hpY2gsCi1mb3J0dW5hdGVseSwgaXMgYmVjb21pbmcgaW5jcmVhc2luZ2x5IGNvbW1vbikuICBGb3IgZXhhbXBsZSwgdW5kZXIgREVDCi1PU0YvMSwgdGhlICJ1cHJvZmlsZSIgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBwcm9kdWNlIGEgaGlzdG9ncmFtIG9mLAotc2F5LCBpbnN0cnVjdGlvbiBjYWNoZSBtaXNzZXMuICBJbiB0aGlzIGNhc2UsIHRoZSBkaW1lbnNpb24gaW4gdGhlCi1oaXN0b2dyYW0gaGVhZGVyIGNvdWxkIGJlIHNldCB0byAiaS1jYWNoZSBtaXNzZXMiIGFuZCB0aGUgYWJicmV2aWF0aW9uCi1jb3VsZCBiZSBzZXQgdG8gIjEiIChiZWNhdXNlIGl0IGlzIHNpbXBseSBhIGNvdW50LCBub3QgYSBwaHlzaWNhbAotZGltZW5zaW9uKS4gIEFsc28sIHRoZSBwcm9maWxpbmcgcmF0ZSB3b3VsZCBoYXZlIHRvIGJlIHNldCB0byAxIGluCi10aGlzIGNhc2UuCi0KLUhpc3RvZ3JhbSBiaW5zIGFyZSAxNi1iaXQgbnVtYmVycyBhbmQgZWFjaCBiaW4gcmVwcmVzZW50IGFuIGVxdWFsCi1hbW91bnQgb2YgdGV4dC1zcGFjZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgdGV4dC1zZWdtZW50IGlzIG9uZQotdGhvdXNhbmQgYnl0ZXMgbG9uZyBhbmQgaWYgdGhlcmUgYXJlIHRlbiBiaW5zIGluIHRoZSBoaXN0b2dyYW0sIGVhY2gKLWJpbiByZXByZXNlbnRzIG9uZSBodW5kcmVkIGJ5dGVzLgotCi0KLUBzdWJzZWN0aW9uIENhbGwtR3JhcGggUmVjb3JkcwotCi1DYWxsLWdyYXBoIHJlY29yZHMgaGF2ZSBhIGZvcm1hdCB0aGF0IGlzIGlkZW50aWNhbCB0byB0aGUgb25lIHVzZWQgaW4KLXRoZSBCU0QtZGVyaXZlZCBmaWxlIGZvcm1hdC4gIEl0IGNvbnNpc3RzIG9mIGFuIGFyYyBpbiB0aGUgY2FsbCBncmFwaAotYW5kIGEgY291bnQgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhcmMgd2FzIHRyYXZlcnNlZAotZHVyaW5nIHByb2dyYW0gZXhlY3V0aW9uLiAgQXJjcyBhcmUgc3BlY2lmaWVkIGJ5IGEgcGFpciBvZiBhZGRyZXNzZXM6Ci10aGUgZmlyc3QgbXVzdCBiZSB3aXRoaW4gY2FsbGVyJ3MgZnVuY3Rpb24gYW5kIHRoZSBzZWNvbmQgbXVzdCBiZQotd2l0aGluIHRoZSBjYWxsZWUncyBmdW5jdGlvbi4gIFdoZW4gcGVyZm9ybWluZyBwcm9maWxpbmcgYXQgdGhlCi1mdW5jdGlvbiBsZXZlbCwgdGhlc2UgYWRkcmVzc2VzIGNhbiBwb2ludCBhbnl3aGVyZSB3aXRoaW4gdGhlCi1yZXNwZWN0aXZlIGZ1bmN0aW9uLiAgSG93ZXZlciwgd2hlbiBwcm9maWxpbmcgYXQgdGhlIGxpbmUtbGV2ZWwsIGl0IGlzCi1iZXR0ZXIgaWYgdGhlIGFkZHJlc3NlcyBhcmUgYXMgY2xvc2UgdG8gdGhlIGNhbGwtc2l0ZS9lbnRyeS1wb2ludCBhcwotcG9zc2libGUuICBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIGxpbmUtbGV2ZWwgY2FsbC1ncmFwaCBpcyBhYmxlIHRvCi1pZGVudGlmeSBleGFjdGx5IHdoaWNoIGxpbmUgb2Ygc291cmNlIGNvZGUgcGVyZm9ybWVkIGNhbGxzIHRvIGEKLWZ1bmN0aW9uLgotCi1Ac3Vic2VjdGlvbiBCYXNpYy1CbG9jayBFeGVjdXRpb24gQ291bnQgUmVjb3JkcwotCi1CYXNpYy1ibG9jayBleGVjdXRpb24gY291bnQgcmVjb3JkcyBjb25zaXN0IG9mIGEgaGVhZGVyIGZvbGxvd2VkIGJ5IGEKLXNlcXVlbmNlIG9mIGFkZHJlc3MvY291bnQgcGFpcnMuICBUaGUgaGVhZGVyIHNpbXBseSBzcGVjaWZpZXMgdGhlCi1sZW5ndGggb2YgdGhlIHNlcXVlbmNlLiAgSW4gYW4gYWRkcmVzcy9jb3VudCBwYWlyLCB0aGUgYWRkcmVzcwotaWRlbnRpZmllcyBhIGJhc2ljLWJsb2NrIGFuZCB0aGUgY291bnQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGltZXMKLXRoYXQgYmFzaWMtYmxvY2sgd2FzIGV4ZWN1dGVkLiAgQW55IGFkZHJlc3Mgd2l0aGluIHRoZSBiYXNpYy1hZGRyZXNzIGNhbgotYmUgdXNlZC4KLQotQG5vZGUgSW50ZXJuYWxzLERlYnVnZ2luZyxGaWxlIEZvcm1hdCxEZXRhaWxzCi1Ac2VjdGlvbiBAY29kZXtncHJvZn0ncyBJbnRlcm5hbCBPcGVyYXRpb24KLQotTGlrZSBtb3N0IHByb2dyYW1zLCBAY29kZXtncHJvZn0gYmVnaW5zIGJ5IHByb2Nlc3NpbmcgaXRzIG9wdGlvbnMuCi1EdXJpbmcgdGhpcyBzdGFnZSwgaXQgbWF5IGJ1aWxkaW5nIGl0cyBzeW1zcGVjIGxpc3QKLShAY29kZXtzeW1faWRzLmM6c3ltX2lkX2FkZH0pLCBpZgotb3B0aW9ucyBhcmUgc3BlY2lmaWVkIHdoaWNoIHVzZSBzeW1zcGVjcy4KLUBjb2Rle2dwcm9mfSBtYWludGFpbnMgYSBzaW5nbGUgbGlua2VkIGxpc3Qgb2Ygc3ltc3BlY3MsCi13aGljaCB3aWxsIGV2ZW50dWFsbHkgZ2V0IHR1cm5lZCBpbnRvIDEyIHN5bWJvbCB0YWJsZXMsCi1vcmdhbml6ZWQgaW50byBzaXggaW5jbHVkZS9leGNsdWRlIHBhaXJzIC0gb25lCi1wYWlyIGVhY2ggZm9yIHRoZSBmbGF0IHByb2ZpbGUgKElOQ0xfRkxBVC9FWENMX0ZMQVQpLAotdGhlIGNhbGwgZ3JhcGggYXJjcyAoSU5DTF9BUkNTL0VYQ0xfQVJDUyksCi1wcmludGluZyBpbiB0aGUgY2FsbCBncmFwaCAoSU5DTF9HUkFQSC9FWENMX0dSQVBIKSwKLXRpbWluZyBwcm9wYWdhdGlvbiBpbiB0aGUgY2FsbCBncmFwaCAoSU5DTF9USU1FL0VYQ0xfVElNRSksCi10aGUgYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nIChJTkNMX0FOTk8vRVhDTF9BTk5PKSwKLWFuZCB0aGUgZXhlY3V0aW9uIGNvdW50IGxpc3RpbmcgKElOQ0xfRVhFQy9FWENMX0VYRUMpLgotCi1BZnRlciBvcHRpb24gcHJvY2Vzc2luZywgQGNvZGV7Z3Byb2Z9IGZpbmlzaGVzCi1idWlsZGluZyB0aGUgc3ltc3BlYyBsaXN0IGJ5IGFkZGluZyBhbGwgdGhlIHN5bXNwZWNzIGluCi1AY29kZXtkZWZhdWx0X2V4Y2x1ZGVkX2xpc3R9IHRvIHRoZSBleGNsdWRlIGxpc3RzCi1FWENMX1RJTUUgYW5kIEVYQ0xfR1JBUEgsIGFuZCBpZiBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nIGlzIHNwZWNpZmllZCwKLUVYQ0xfRkxBVCBhcyB3ZWxsLgotVGhlc2UgZGVmYXVsdCBleGNsdWRlcyBhcmUgbm90IGFkZGVkIHRvIEVYQ0xfQU5OTywgRVhDTF9BUkNTLCBhbmQgRVhDTF9FWEVDLgotCi1OZXh0LCB0aGUgQkZEIGxpYnJhcnkgaXMgY2FsbGVkIHRvIG9wZW4gdGhlIG9iamVjdCBmaWxlLAotdmVyaWZ5IHRoYXQgaXQgaXMgYW4gb2JqZWN0IGZpbGUsCi1hbmQgcmVhZCBpdHMgc3ltYm9sIHRhYmxlIChAY29kZXtjb3JlLmM6Y29yZV9pbml0fSksCi11c2luZyBAY29kZXtiZmRfY2Fub25pY2FsaXplX3N5bXRhYn0gYWZ0ZXIgbWFsbG9jaW5nCi1hbiBhcHByb3BpYXRlIHNpemVkIGFycmF5IG9mIGFzeW1ib2xzLiAgQXQgdGhpcyBwb2ludCwKLWZ1bmN0aW9uIG1hcHBpbmdzIGFyZSByZWFkIChpZiB0aGUgQHNhbXB7LS1maWxlLW9yZGVyaW5nfSBvcHRpb24KLWhhcyBiZWVuIHNwZWNpZmllZCksIGFuZCB0aGUgY29yZSB0ZXh0IHNwYWNlIGlzIHJlYWQgaW50bwotbWVtb3J5IChpZiB0aGUgQHNhbXB7LWN9IG9wdGlvbiB3YXMgZ2l2ZW4pLgotCi1AY29kZXtncHJvZn0ncyBvd24gc3ltYm9sIHRhYmxlLCBhbiBhcnJheSBvZiBTeW0gc3RydWN0dXJlcywKLWlzIG5vdyBidWlsdC4KLVRoaXMgaXMgZG9uZSBpbiBvbmUgb2YgdHdvIHdheXMsIGJ5IG9uZSBvZiB0d28gcm91dGluZXMsIGRlcGVuZGluZwotb24gd2hldGhlciBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nIChAc2FtcHstbH0gb3B0aW9uKSBoYXMgYmVlbgotZW5hYmxlZC4KLUZvciBub3JtYWwgcHJvZmlsaW5nLCB0aGUgQkZEIGNhbm9uaWNhbCBzeW1ib2wgdGFibGUgaXMgc2Nhbm5lZC4KLUZvciBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLCBldmVyeQotdGV4dCBzcGFjZSBhZGRyZXNzIGlzIGV4YW1pbmVkLCBhbmQgYSBuZXcgc3ltYm9sIHRhYmxlIGVudHJ5Ci1nZXRzIGNyZWF0ZWQgZXZlcnkgdGltZSB0aGUgbGluZSBudW1iZXIgY2hhbmdlcy4KLUluIGVpdGhlciBjYXNlLCB0d28gcGFzc2VzIGFyZSBtYWRlIHRocm91Z2ggdGhlIHN5bWJvbAotdGFibGUgLSBvbmUgdG8gY291bnQgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0YWJsZSByZXF1aXJlZCwKLWFuZCB0aGUgb3RoZXIgdG8gYWN0dWFsbHkgcmVhZCB0aGUgc3ltYm9scy4gIEluIGJldHdlZW4gdGhlCi10d28gcGFzc2VzLCBhIHNpbmdsZSBhcnJheSBvZiB0eXBlIEBjb2Rle1N5bX0gaXMgY3JlYXRlZCBvZgotdGhlIGFwcHJvcGlhdGUgbGVuZ3RoLgotRmluYWxseSwgQGNvZGV7c3ltdGFiLmM6c3ltdGFiX2ZpbmFsaXplfQotaXMgY2FsbGVkIHRvIHNvcnQgdGhlIHN5bWJvbCB0YWJsZSBhbmQgcmVtb3ZlIGR1cGxpY2F0ZSBlbnRyaWVzCi0oZW50cmllcyB3aXRoIHRoZSBzYW1lIG1lbW9yeSBhZGRyZXNzKS4KLQotVGhlIHN5bWJvbCB0YWJsZSBtdXN0IGJlIGEgY29udGlndW91cyBhcnJheSBmb3IgdHdvIHJlYXNvbnMuCi1GaXJzdCwgdGhlIEBjb2Rle3Fzb3J0fSBsaWJyYXJ5IGZ1bmN0aW9uICh3aGljaCBzb3J0cyBhbiBhcnJheSkKLXdpbGwgYmUgdXNlZCB0byBzb3J0IHRoZSBzeW1ib2wgdGFibGUuCi1BbHNvLCB0aGUgc3ltYm9sIGxvb2t1cCByb3V0aW5lIChAY29kZXtzeW10YWIuYzpzeW1fbG9va3VwfSksCi13aGljaCBmaW5kcyBzeW1ib2xzCi1iYXNlZCBvbiBtZW1vcnkgYWRkcmVzcywgdXNlcyBhIGJpbmFyeSBzZWFyY2ggYWxnb3JpdGhtCi13aGljaCByZXF1aXJlcyB0aGUgc3ltYm9sIHRhYmxlIHRvIGJlIGEgc29ydGVkIGFycmF5LgotRnVuY3Rpb24gc3ltYm9scyBhcmUgaW5kaWNhdGVkIHdpdGggYW4gQGNvZGV7aXNfZnVuY30gZmxhZy4KLUxpbmUgbnVtYmVyIHN5bWJvbHMgaGF2ZSBubyBzcGVjaWFsIGZsYWdzIHNldC4KLUFkZGl0aW9uYWxseSwgYSBzeW1ib2wgY2FuIGhhdmUgYW4gQGNvZGV7aXNfc3RhdGljfSBmbGFnCi10byBpbmRpY2F0ZSB0aGF0IGl0IGlzIGEgbG9jYWwgc3ltYm9sLgotCi1XaXRoIHRoZSBzeW1ib2wgdGFibGUgcmVhZCwgdGhlIHN5bXNwZWNzIGNhbiBub3cgYmUgdHJhbnNsYXRlZAotaW50byBTeW1zIChAY29kZXtzeW1faWRzLmM6c3ltX2lkX3BhcnNlfSkuICBSZW1lbWJlciB0aGF0IGEgc2luZ2xlCi1zeW1zcGVjIGNhbiBtYXRjaCBtdWx0aXBsZSBzeW1ib2xzLgotQW4gYXJyYXkgb2Ygc3ltYm9sIHRhYmxlcwotKEBjb2Rle3N5bXN9KSBpcyBjcmVhdGVkLCBlYWNoIGVudHJ5IG9mIHdoaWNoIGlzIGEgc3ltYm9sIHRhYmxlCi1vZiBTeW1zIHRvIGJlIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkIGZyb20gYSBwYXJ0aWN1bGFyIGxpc3RpbmcuCi1UaGUgbWFzdGVyIHN5bWJvbCB0YWJsZSBhbmQgdGhlIHN5bXNwZWNzIGFyZSBleGFtaW5lZCBieSBuZXN0ZWQKLWxvb3BzLCBhbmQgZXZlcnkgc3ltYm9sIHRoYXQgbWF0Y2hlcyBhIHN5bXNwZWMgaXMgaW5zZXJ0ZWQKLWludG8gdGhlIGFwcHJvcHJpYXRlIHN5bXMgdGFibGUuICBUaGlzIGlzIGRvbmUgdHdpY2UsIG9uY2UgdG8KLWNvdW50IHRoZSBzaXplIG9mIGVhY2ggcmVxdWlyZWQgc3ltYm9sIHRhYmxlLCBhbmQgYWdhaW4gdG8gYnVpbGQKLXRoZSB0YWJsZXMsIHdoaWNoIGhhdmUgYmVlbiBtYWxsb2NlZCBiZXR3ZWVuIHBhc3Nlcy4KLUZyb20gbm93IG9uLCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHN5bWJvbCBpcyBvbiBhbiBpbmNsdWRlCi1vciBleGNsdWRlIHN5bXNwZWMgbGlzdCwgQGNvZGV7Z3Byb2Z9IHNpbXBseSB1c2VzIGl0cwotc3RhbmRhcmQgc3ltYm9sIGxvb2t1cCByb3V0aW5lIG9uIHRoZSBhcHByb3ByaWF0ZSB0YWJsZQotaW4gdGhlIEBjb2Rle3N5bXN9IGFycmF5LgotCi1Ob3cgdGhlIHByb2ZpbGUgZGF0YSBmaWxlKHMpIHRoZW1zZWx2ZXMgYXJlIHJlYWQKLShAY29kZXtnbW9uX2lvLmM6Z21vbl9vdXRfcmVhZH0pLAotZmlyc3QgYnkgY2hlY2tpbmcgZm9yIGEgbmV3LXN0eWxlIEBzYW1we2dtb24ub3V0fSBoZWFkZXIsCi10aGVuIGFzc3VtaW5nIHRoaXMgaXMgYW4gb2xkLXN0eWxlIEJTRCBAc2FtcHtnbW9uLm91dH0KLWlmIHRoZSBtYWdpYyBudW1iZXIgdGVzdCBmYWlsZWQuCi0KLU5ldy1zdHlsZSBoaXN0b2dyYW0gcmVjb3JkcyBhcmUgcmVhZCBieSBAY29kZXtoaXN0LmM6aGlzdF9yZWFkX3JlY30uCi1Gb3IgdGhlIGZpcnN0IGhpc3RvZ3JhbSByZWNvcmQsIGFsbG9jYXRlIGEgbWVtb3J5IGFycmF5IHRvIGhvbGQKLWFsbCB0aGUgYmlucywgYW5kIHJlYWQgdGhlbSBpbi4KLVdoZW4gbXVsdGlwbGUgcHJvZmlsZSBkYXRhIGZpbGVzIChvciBmaWxlcyB3aXRoIG11bHRpcGxlIGhpc3RvZ3JhbQotcmVjb3JkcykgYXJlIHJlYWQsIHRoZSBzdGFydGluZyBhZGRyZXNzLCBlbmRpbmcgYWRkcmVzcywgbnVtYmVyCi1vZiBiaW5zIGFuZCBzYW1wbGluZyByYXRlIG11c3QgbWF0Y2ggYmV0d2VlbiB0aGUgdmFyaW91cyBoaXN0b2dyYW1zLAotb3IgYSBmYXRhbCBlcnJvciB3aWxsIHJlc3VsdC4KLUlmIGV2ZXJ5dGhpbmcgbWF0Y2hlcywganVzdCBzdW0gdGhlIGFkZGl0aW9uYWwgaGlzdG9ncmFtcyBpbnRvCi10aGUgZXhpc3RpbmcgaW4tbWVtb3J5IGFycmF5LgotCi1BcyBlYWNoIGNhbGwgZ3JhcGggcmVjb3JkIGlzIHJlYWQgKEBjb2Rle2NhbGxfZ3JhcGguYzpjZ19yZWFkX3JlY30pLAotdGhlIHBhcmVudCBhbmQgY2hpbGQgYWRkcmVzc2VzCi1hcmUgbWF0Y2hlZCB0byBzeW1ib2wgdGFibGUgZW50cmllcywgYW5kIGEgY2FsbCBncmFwaCBhcmMgaXMKLWNyZWF0ZWQgYnkgQGNvZGV7Y2dfYXJjcy5jOmFyY19hZGR9LCB1bmxlc3MgdGhlIGFyYyBmYWlscyBhIHN5bXNwZWMKLWNoZWNrIGFnYWluc3QgSU5DTF9BUkNTL0VYQ0xfQVJDUy4gIEFzIGVhY2ggYXJjIGlzIGFkZGVkLAotYSBsaW5rZWQgbGlzdCBpcyBtYWludGFpbmVkIG9mIHRoZSBwYXJlbnQncyBjaGlsZCBhcmNzLCBhbmQgb2YgdGhlIGNoaWxkJ3MKLXBhcmVudCBhcmNzLgotQm90aCB0aGUgY2hpbGQncyBjYWxsIGNvdW50IGFuZCB0aGUgYXJjJ3MgY2FsbCBjb3VudCBhcmUKLWluY3JlbWVudGVkIGJ5IHRoZSByZWNvcmQncyBjYWxsIGNvdW50LgotCi1CYXNpYy1ibG9jayByZWNvcmRzIGFyZSByZWFkIChAY29kZXtiYXNpY19ibG9ja3MuYzpiYl9yZWFkX3JlY30pLAotYnV0IG9ubHkgaWYgbGluZS1ieS1saW5lIHByb2ZpbGluZyBoYXMgYmVlbiBzZWxlY3RlZC4KLUVhY2ggYmFzaWMtYmxvY2sgYWRkcmVzcyBpcyBtYXRjaGVkIHRvIGEgY29ycmVzcG9uZGluZyBsaW5lCi1zeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZSwgYW5kIGFuIGVudHJ5IG1hZGUgaW4gdGhlIHN5bWJvbCdzCi1iYl9hZGRyIGFuZCBiYl9jYWxscyBhcnJheXMuICBBZ2FpbiwgaWYgbXVsdGlwbGUgYmFzaWMtYmxvY2sKLXJlY29yZHMgYXJlIHByZXNlbnQgZm9yIHRoZSBzYW1lIGFkZHJlc3MsIHRoZSBjYWxsIGNvdW50cwotYXJlIGN1bXVsYXRpdmUuCi0KLUEgZ21vbi5zdW0gZmlsZSBpcyBkdW1wZWQsIGlmIHJlcXVlc3RlZCAoQGNvZGV7Z21vbl9pby5jOmdtb25fb3V0X3dyaXRlfSkuCi0KLUlmIGhpc3RvZ3JhbXMgd2VyZSBwcmVzZW50IGluIHRoZSBkYXRhIGZpbGVzLCBhc3NpZ24gdGhlbSB0byBzeW1ib2xzCi0oQGNvZGV7aGlzdC5jOmhpc3RfYXNzaWduX3NhbXBsZXN9KSBieSBpdGVyYXRpbmcgb3ZlciBhbGwgdGhlIHNhbXBsZQotYmlucyBhbmQgYXNzaWduaW5nIHRoZW0gdG8gc3ltYm9scy4gIFNpbmNlIHRoZSBzeW1ib2wgdGFibGUKLWlzIHNvcnRlZCBpbiBvcmRlciBvZiBhc2NlbmRpbmcgbWVtb3J5IGFkZHJlc3Nlcywgd2UgY2FuCi1zaW1wbGUgZm9sbG93IGFsb25nIGluIHRoZSBzeW1ib2wgdGFibGUgYXMgd2UgbWFrZSBvdXIgcGFzcwotb3ZlciB0aGUgc2FtcGxlIGJpbnMuCi1UaGlzIHN0ZXAgaW5jbHVkZXMgYSBzeW1zcGVjIGNoZWNrIGFnYWluc3QgSU5DTF9GTEFUL0VYQ0xfRkxBVC4KLURlcGVuZGluZyBvbiB0aGUgaGlzdG9ncmFtCi1zY2FsZSBmYWN0b3IsIGEgc2FtcGxlIGJpbiBtYXkgc3BhbiBtdWx0aXBsZSBzeW1ib2xzLAotaW4gd2hpY2ggY2FzZSBhIGZyYWN0aW9uIG9mIHRoZSBzYW1wbGUgY291bnQgaXMgYWxsb2NhdGVkCi10byBlYWNoIHN5bWJvbCwgcHJvcG9ydGlvbmFsIHRvIHRoZSBkZWdyZWUgb2Ygb3ZlcmxhcC4KLVRoaXMgZWZmZWN0IGlzIHJhcmUgZm9yIG5vcm1hbCBwcm9maWxpbmcsIGJ1dCBvdmVybGFwcwotYXJlIG1vcmUgY29tbW9uIGR1cmluZyBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLCBhbmQgY2FuCi1jYXVzZSBlYWNoIG9mIHR3byBhZGphY2VudCBsaW5lcyB0byBiZSBjcmVkaXRlZCB3aXRoIGhhbGYKLWEgaGl0LCBmb3IgZXhhbXBsZS4KLQotSWYgY2FsbCBncmFwaCBkYXRhIGlzIHByZXNlbnQsIEBjb2Rle2NnX2FyY3MuYzpjZ19hc3NlbWJsZX0gaXMgY2FsbGVkLgotRmlyc3QsIGlmIEBzYW1wey1jfSB3YXMgc3BlY2lmaWVkLCBhIG1hY2hpbmUtZGVwZW5kYW50Ci1yb3V0aW5lIChAY29kZXtmaW5kX2NhbGx9KSBzY2FucyB0aHJvdWdoIGVhY2ggc3ltYm9sJ3MgbWFjaGluZSBjb2RlLAotbG9va2luZyBmb3Igc3Vicm91dGluZSBjYWxsIGluc3RydWN0aW9ucywgYW5kIGFkZGluZyB0aGVtCi10byB0aGUgY2FsbCBncmFwaCB3aXRoIGEgemVybyBjYWxsIGNvdW50LgotQSB0b3BvbG9naWNhbCBzb3J0IGlzIHBlcmZvcm1lZCBieSBkZXB0aC1maXJzdCBudW1iZXJpbmcKLWFsbCB0aGUgc3ltYm9scyAoQGNvZGV7Y2dfZGZuLmM6Y2dfZGZufSksIHNvIHRoYXQKLWNoaWxkcmVuIGFyZSBhbHdheXMgbnVtYmVyZWQgbGVzcyB0aGFuIHRoZWlyIHBhcmVudHMsCi10aGVuIG1ha2luZyBhIGFycmF5IG9mIHBvaW50ZXJzIGludG8gdGhlIHN5bWJvbCB0YWJsZSBhbmQgc29ydGluZyBpdCBpbnRvCi1udW1lcmljYWwgb3JkZXIsIHdoaWNoIGlzIHJldmVyc2UgdG9wb2xvZ2ljYWwKLW9yZGVyIChjaGlsZHJlbiBhcHBlYXIgYmVmb3JlIHBhcmVudHMpLgotQ3ljbGVzIGFyZSBhbHNvIGRldGVjdGVkIGF0IHRoaXMgcG9pbnQsIGFsbCBtZW1iZXJzCi1vZiB3aGljaCBhcmUgYXNzaWduZWQgdGhlIHNhbWUgdG9wb2xvZ2ljYWwgbnVtYmVyLgotVHdvIHBhc3NlcyBhcmUgbm93IG1hZGUgdGhyb3VnaCB0aGlzIHNvcnRlZCBhcnJheSBvZiBzeW1ib2wgcG9pbnRlcnMuCi1UaGUgZmlyc3QgcGFzcywgZnJvbSBlbmQgdG8gYmVnaW5uaW5nIChwYXJlbnRzIHRvIGNoaWxkcmVuKSwKLWNvbXB1dGVzIHRoZSBmcmFjdGlvbiBvZiBjaGlsZCB0aW1lIHRvIHByb3BvZ2F0ZSB0byBlYWNoIHBhcmVudAotYW5kIGEgcHJpbnQgZmxhZy4KLVRoZSBwcmludCBmbGFnIHJlZmxlY3RzIHN5bXNwZWMgaGFuZGxpbmcgb2YgSU5DTF9HUkFQSC9FWENMX0dSQVBILAotd2l0aCBhIHBhcmVudCdzIGluY2x1ZGUgb3IgZXhjbHVkZSAocHJpbnQgb3Igbm8gcHJpbnQpIHByb3BlcnR5Ci1iZWluZyBwcm9wYWdhdGVkIHRvIGl0cyBjaGlsZHJlbiwgdW5sZXNzIHRoZXkgdGhlbXNlbHZlcyBleHBsaWNpdGx5IGFwcGVhcgotaW4gSU5DTF9HUkFQSCBvciBFWENMX0dSQVBILgotQSBzZWNvbmQgcGFzcywgZnJvbSBiZWdpbm5pbmcgdG8gZW5kIChjaGlsZHJlbiB0byBwYXJlbnRzKSBhY3R1YWxseQotcHJvcG9nYXRlcyB0aGUgdGltaW5ncyBhbG9uZyB0aGUgY2FsbCBncmFwaCwgc3ViamVjdAotdG8gYSBjaGVjayBhZ2FpbnN0IElOQ0xfVElNRS9FWENMX1RJTUUuCi1XaXRoIHRoZSBwcmludCBmbGFnLCBmcmFjdGlvbnMsIGFuZCB0aW1pbmdzIG5vdyBzdG9yZWQgaW4gdGhlIHN5bWJvbAotc3RydWN0dXJlcywgdGhlIHRvcG9sb2dpY2FsIHNvcnQgYXJyYXkgaXMgbm93IGRpc2NhcmRlZCwgYW5kIGEKLW5ldyBhcnJheSBvZiBwb2ludGVycyBpcyBhc3NlbWJsZWQsIHRoaXMgdGltZSBzb3J0ZWQgYnkgcHJvcGFnYXRlZCB0aW1lLgotCi1GaW5hbGx5LCBwcmludCB0aGUgdmFyaW91cyBvdXRwdXRzIHRoZSB1c2VyIHJlcXVlc3RlZCwgd2hpY2ggaXMgbm93IGZhaXJseQotc3RyYWlnaHRmb3J3YXJkLiAgVGhlIGNhbGwgZ3JhcGggKEBjb2Rle2NnX3ByaW50LmM6Y2dfcHJpbnR9KSBhbmQKLWZsYXQgcHJvZmlsZSAoQGNvZGV7aGlzdC5jOmhpc3RfcHJpbnR9KSBhcmUgcmVndXJnaXRhdGlvbnMgb2YgdmFsdWVzCi1hbHJlYWR5IGNvbXB1dGVkLiAgVGhlIGFubm90YXRlZCBzb3VyY2UgbGlzdGluZwotKEBjb2Rle2Jhc2ljX2Jsb2Nrcy5jOnByaW50X2Fubm90YXRlZF9zb3VyY2V9KSB1c2VzIGJhc2ljLWJsb2NrCi1pbmZvcm1hdGlvbiwgaWYgcHJlc2VudCwgdG8gbGFiZWwgZWFjaCBsaW5lIG9mIGNvZGUgd2l0aCBjYWxsIGNvdW50cywKLW90aGVyd2lzZSBvbmx5IHRoZSBmdW5jdGlvbiBjYWxsIGNvdW50cyBhcmUgcHJlc2VudGVkLgotCi1UaGUgZnVuY3Rpb24gb3JkZXJpbmcgY29kZSBpcyBtYXJnaW5hbGx5IHdlbGwgZG9jdW1lbnRlZAotaW4gdGhlIHNvdXJjZSBjb2RlIGl0c2VsZiAoQGNvZGV7Y2dfcHJpbnQuY30pLiAgQmFzaWNhbGx5LAotdGhlIGZ1bmN0aW9ucyB3aXRoIHRoZSBtb3N0IHVzZSBhbmQgdGhlIG1vc3QgcGFyZW50cyBhcmUKLXBsYWNlZCBmaXJzdCwgZm9sbG93ZWQgYnkgb3RoZXIgZnVuY3Rpb25zIHdpdGggdGhlIG1vc3QgdXNlLAotZm9sbG93ZWQgYnkgbG93ZXIgdXNlIGZ1bmN0aW9ucywgZm9sbG93ZWQgYnkgdW51c2VkIGZ1bmN0aW9ucwotYXQgdGhlIGVuZC4KLQotQG5vZGUgRGVidWdnaW5nLCxJbnRlcm5hbHMsRGV0YWlscwotQHN1YnNlY3Rpb24gRGVidWdnaW5nIEBjb2Rle2dwcm9mfQotCi1JZiBAY29kZXtncHJvZn0gd2FzIGNvbXBpbGVkIHdpdGggZGVidWdnaW5nIGVuYWJsZWQsCi10aGUgQHNhbXB7LWR9IG9wdGlvbiB0cmlnZ2VycyBkZWJ1Z2dpbmcgb3V0cHV0Ci0odG8gc3Rkb3V0KSB3aGljaCBjYW4gYmUgaGVscGZ1bCBpbiB1bmRlcnN0YW5kaW5nIGl0cyBvcGVyYXRpb24uCi1UaGUgZGVidWdnaW5nIG51bWJlciBzcGVjaWZpZWQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBzdW0gb2YgdGhlIGZvbGxvd2luZwotb3B0aW9uczoKLQotQHRhYmxlIEBhc2lzCi1AaXRlbSAyIC0gVG9wb2xvZ2ljYWwgc29ydAotTW9uaXRvciBkZXB0aC1maXJzdCBudW1iZXJpbmcgb2Ygc3ltYm9scyBkdXJpbmcgY2FsbCBncmFwaCBhbmFseXNpcwotQGl0ZW0gNCAtIEN5Y2xlcwotU2hvd3Mgc3ltYm9scyBhcyB0aGV5IGFyZSBpZGVudGlmaWVkIGFzIGN5Y2xlIGhlYWRzCi1AaXRlbSAxNiAtIFRhbGx5aW5nCi1BcyB0aGUgY2FsbCBncmFwaCBhcmNzIGFyZSByZWFkLCBzaG93IGVhY2ggYXJjIGFuZCBob3cKLXRoZSB0b3RhbCBjYWxscyB0byBlYWNoIGZ1bmN0aW9uIGFyZSB0YWxsaWVkCi1AaXRlbSAzMiAtIENhbGwgZ3JhcGggYXJjIHNvcnRpbmcKLURldGFpbHMgc29ydGluZyBpbmRpdmlkdWFsIHBhcmVudHMvY2hpbGRyZW4gd2l0aGluIGVhY2ggY2FsbCBncmFwaCBlbnRyeQotQGl0ZW0gNjQgLSBSZWFkaW5nIGhpc3RvZ3JhbSBhbmQgY2FsbCBncmFwaCByZWNvcmRzCi1TaG93cyBhZGRyZXNzIHJhbmdlcyBvZiBoaXN0b2dyYW1zIGFzIHRoZXkgYXJlIHJlYWQsIGFuZCBlYWNoCi1jYWxsIGdyYXBoIGFyYwotQGl0ZW0gMTI4IC0gU3ltYm9sIHRhYmxlCi1SZWFkaW5nLCBjbGFzc2lmeWluZywgYW5kIHNvcnRpbmcgdGhlIHN5bWJvbCB0YWJsZSBmcm9tIHRoZSBvYmplY3QgZmlsZS4KLUZvciBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nIChAc2FtcHstbH0gb3B0aW9uKSwgYWxzbyBzaG93cyBsaW5lIG51bWJlcnMKLWJlaW5nIGFzc2lnbmVkIHRvIG1lbW9yeSBhZGRyZXNzZXMuCi1AaXRlbSAyNTYgLSBTdGF0aWMgY2FsbCBncmFwaAotVHJhY2Ugb3BlcmF0aW9uIG9mIEBzYW1wey1jfSBvcHRpb24KLUBpdGVtIDUxMiAtIFN5bWJvbCB0YWJsZSBhbmQgYXJjIHRhYmxlIGxvb2t1cHMKLURldGFpbCBvcGVyYXRpb24gb2YgbG9va3VwIHJvdXRpbmVzCi1AaXRlbSAxMDI0IC0gQ2FsbCBncmFwaCBwcm9wYWdhdGlvbgotU2hvd3MgaG93IGZ1bmN0aW9uIHRpbWVzIGFyZSBwcm9wYWdhdGVkIGFsb25nIHRoZSBjYWxsIGdyYXBoCi1AaXRlbSAyMDQ4IC0gQmFzaWMtYmxvY2tzCi1TaG93cyBiYXNpYy1ibG9jayByZWNvcmRzIGFzIHRoZXkgYXJlIHJlYWQgZnJvbSBwcm9maWxlIGRhdGEKLShvbmx5IG1lYW5pbmdmdWwgd2l0aCBAc2FtcHstbH0gb3B0aW9uKQotQGl0ZW0gNDA5NiAtIFN5bXNwZWNzCi1TaG93cyBzeW1zcGVjLXRvLXN5bWJvbCBwYXR0ZXJuIG1hdGNoaW5nIG9wZXJhdGlvbgotQGl0ZW0gODE5MiAtIEFubm90YXRlIHNvdXJjZQotVHJhY2tzIG9wZXJhdGlvbiBvZiBAc2FtcHstQX0gb3B0aW9uCi1AZW5kIHRhYmxlCi0KLUBjb250ZW50cwotQGJ5ZQotCi1ORUVEUyBBTiBJTkRFWAotCi0tVCAtICJ0cmFkaXRpb25hbCBCU0Qgc3R5bGUiOiBIb3cgaXMgaXQgZGlmZmVyZW50PyAgU2hvdWxkIHRoZQotZGlmZmVyZW5jZXMgYmUgZG9jdW1lbnRlZD8KLQotZXhhbXBsZSBmbGF0IGZpbGUgYWRkcyB1cCB0byAxMDAuMDElLi4uCi0KLW5vdGU6IHRpbWUgZXN0aW1hdGVzIG5vdyBvbmx5IGdvIG91dCB0byBvbmUgZGVjaW1hbCBwbGFjZSAoMC4wKSwgd2hlcmUKLXRoZXkgdXNlZCB0byBleHRlbmQgdHdvICg3OC42NykuCmRpZmYgLS1naXQgYS9ncHJvZi9oZXJ0ei5jIGIvZ3Byb2YvaGVydHouYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUzMTRhYy4uMDAwMDAwMAotLS0gYS9ncHJvZi9oZXJ0ei5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJoZXJ0ei5oIgotCi0KLSNpZmRlZiBfX01TRE9TX18KLSNkZWZpbmUgSEVSVFogMTgKLSNlbmRpZgotCi1pbnQKLWhlcnR6ICgpCi17Ci0jaWZkZWYgSEVSVFoKLSAgcmV0dXJuIEhFUlRaOwotI2Vsc2UgLyogISBkZWZpbmVkIChIRVJUWikgKi8KLSNpZmRlZiBIQVZFX1NFVElUSU1FUgotICBzdHJ1Y3QgaXRpbWVydmFsIHRpbTsKLQotICB0aW0uaXRfaW50ZXJ2YWwudHZfc2VjID0gMDsKLSAgdGltLml0X2ludGVydmFsLnR2X3VzZWMgPSAxOwotICB0aW0uaXRfdmFsdWUudHZfc2VjID0gMDsKLSAgdGltLml0X3ZhbHVlLnR2X3VzZWMgPSAwOwotICBzZXRpdGltZXIgKElUSU1FUl9SRUFMLCAmdGltLCAwKTsKLSAgc2V0aXRpbWVyIChJVElNRVJfUkVBTCwgMCwgJnRpbSk7Ci0gIGlmICh0aW0uaXRfaW50ZXJ2YWwudHZfdXNlYyA8IDIpCi0gICAgewotICAgICAgcmV0dXJuIEhaX1dST05HOwotICAgIH0KLSAgcmV0dXJuIDEwMDAwMDAgLyB0aW0uaXRfaW50ZXJ2YWwudHZfdXNlYzsKLSNlbHNlIC8qICEgZGVmaW5lZCAoSEFWRV9TRVRJVElNRVIpICovCi0jaWYgZGVmaW5lZCAoSEFWRV9TWVNDT05GKSAmJiBkZWZpbmVkIChfU0NfQ0xLX1RDSykKLSAgcmV0dXJuIHN5c2NvbmYgKF9TQ19DTEtfVENLKTsKLSNlbHNlIC8qICEgZGVmaW5lZCAoSEFWRV9TWVNDT05GKSB8fCAhIGRlZmluZWQgKF9TQ19DTEtfVENLKSAqLwotICByZXR1cm4gSFpfV1JPTkc7Ci0jZW5kaWYgLyogISBkZWZpbmVkIChIQVZFX1NZU0NPTkYpIHx8ICEgZGVmaW5lZCAoX1NDX0NMS19UQ0spICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChIQVZFX1NFVElUSU1FUikgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKEhFUlRaKSAqLwotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvaGVydHouaCBiL2dwcm9mL2hlcnR6LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYTAxYmEuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvaGVydHouaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSNpZm5kZWYgaGVydHpfaAotI2RlZmluZSBoZXJ0el9oCi0KLSNpbmNsdWRlICJncHJvZi5oIgotCi0jZGVmaW5lCUhaX1dST05HIDAJCS8qIGltcG9zc2libGUgY2xvY2sgZnJlcXVlbmN5ICovCi0KLS8qCi0gKiBEaXNjb3ZlciB0aGUgdGljayBmcmVxdWVuY3kgb2YgdGhlIG1hY2hpbmUgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcsCi0gKiB3ZSByZXR1cm4gSFpfV1JPTkcsIGFuIGltcG9zc2libGUgc2FtcGxpbmcgZnJlcXVlbmN5LgotICovCi0KLS8qIEZJWE1FOiBDaGVja2luZyBmb3IgTUFDSCBoZXJlIG1ha2VzIG5vIHNlbnNlIHdoZW4gZm9yIGEgY3Jvc3MKLSAgIGdwcm9mLiAgKi8KLSNpZmRlZiBNQUNICi0jaW5jbHVkZSA8bWFjaGluZS9tYWNoX3BhcmFtLmg+Ci0jZGVmaW5lIGhlcnR6KCkgKEhaKQotI2Vsc2UKLWV4dGVybiBpbnQgaGVydHogUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBoZXJ0el9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9oaXN0LmMgYi9ncHJvZi9oaXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZGJiYmIuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvaGlzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTk2ICswLDAgQEAKLS8qCi0gKiBIaXN0b2dyYW0gcmVsYXRlZCBvcGVyYXRpb25zLgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0jaW5jbHVkZSAiZ21vbl9pby5oIgotI2luY2x1ZGUgImdtb25fb3V0LmgiCi0jaW5jbHVkZSAiaGlzdC5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotI2luY2x1ZGUgInN5bV9pZHMuaCIKLSNpbmNsdWRlICJ1dGlscy5oIgotCi0jZGVmaW5lIFVOSVRTX1RPX0NPREUgKG9mZnNldF90b19jb2RlIC8gc2l6ZW9mKFVOSVQpKQotCi1zdGF0aWMgdm9pZCBzY2FsZV9hbmRfYWxpZ25fZW50cmllcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIGRlY2xhcmF0aW9ucyBvZiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmdW5jdGlvbnMgdG8gb3V0cHV0IGJsdXJiczogKi8KLWV4dGVybiB2b2lkIGZsYXRfYmx1cmIgUEFSQU1TICgoRklMRSAqIGZwKSk7Ci0KLWJmZF92bWEgc19sb3dwYzsJCS8qIGxvd2VzdCBhZGRyZXNzIGluIC50ZXh0ICovCi1iZmRfdm1hIHNfaGlnaHBjID0gMDsJCS8qIGhpZ2hlc3QgYWRkcmVzcyBpbiAudGV4dCAqLwotYmZkX3ZtYSBsb3dwYywgaGlnaHBjOwkJLyogc2FtZSwgYnV0IGV4cHJlc3NlZCBpbiBVTklUcyAqLwotaW50IGhpc3RfbnVtX2JpbnMgPSAwOwkJLyogbnVtYmVyIG9mIGhpc3RvZ3JhbSBzYW1wbGVzICovCi1pbnQgKmhpc3Rfc2FtcGxlID0gMDsJCS8qIGhpc3RvZ3JhbSBzYW1wbGVzIChzaG9ydHMgaW4gdGhlIGZpbGUhKSAqLwotZG91YmxlIGhpc3Rfc2NhbGU7Ci1jaGFyIGhpc3RfZGltZW5zaW9uW3NpemVvZiAoKChzdHJ1Y3QgZ21vbl9oaXN0X2hkciAqKSAwKS0+ZGltZW4pICsgMV0gPQotICAic2Vjb25kcyI7Ci1jaGFyIGhpc3RfZGltZW5zaW9uX2FiYnJldiA9ICdzJzsKLQotc3RhdGljIGRvdWJsZSBhY2N1bV90aW1lOwkvKiBhY2N1bXVsYXRlZCB0aW1lIHNvIGZhciBmb3IgcHJpbnRfbGluZSgpICovCi1zdGF0aWMgZG91YmxlIHRvdGFsX3RpbWU7CS8qIHRvdGFsIHRpbWUgZm9yIGFsbCByb3V0aW5lcyAqLwotLyoKLSAqIFRhYmxlIG9mIFNJIHByZWZpeGVzIGZvciBwb3dlcnMgb2YgMTAgKHVzZWQgdG8gYXV0b21hdGljYWxseQotICogc2NhbGUgc29tZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBmbGF0IHByb2ZpbGUpLgotICovCi1jb25zdCBzdHJ1Y3QKLSAgewotICAgIGNoYXIgcHJlZml4OwotICAgIGRvdWJsZSBzY2FsZTsKLSAgfQotU0l0YWJbXSA9Ci17Ci0gIHsKLSAgICAnVCcsIDFlLTEyCi0gIH0KLSAgLAkJCQkvKiB0ZXJhICovCi0gIHsKLSAgICAnRycsIDFlLTA5Ci0gIH0KLSAgLAkJCQkvKiBnaWdhICovCi0gIHsKLSAgICAnTScsIDFlLTA2Ci0gIH0KLSAgLAkJCQkvKiBtZWdhICovCi0gIHsKLSAgICAnSycsIDFlLTAzCi0gIH0KLSAgLAkJCQkvKiBraWxvICovCi0gIHsKLSAgICAnICcsIDFlLTAwCi0gIH0KLSAgLAotICB7Ci0gICAgJ20nLCAxZSswMwotICB9Ci0gICwJCQkJLyogbWlsbGkgKi8KLSAgewotICAgICd1JywgMWUrMDYKLSAgfQotICAsCQkJCS8qIG1pY3JvICovCi0gIHsKLSAgICAnbicsIDFlKzA5Ci0gIH0KLSAgLAkJCQkvKiBuYW5vICovCi0gIHsKLSAgICAncCcsIDFlKzEyCi0gIH0KLSAgLAkJCQkvKiBwaWNvICovCi0gIHsKLSAgICAnZicsIDFlKzE1Ci0gIH0KLSAgLAkJCQkvKiBmZW10byAqLwotICB7Ci0gICAgJ2EnLCAxZSsxOAotICB9Ci0gICwJCQkJLyogYXRvICovCi19OwotCi0vKgotICogUmVhZCB0aGUgaGlzdG9ncmFtIGZyb20gZmlsZSBJRlAuICBGSUxFTkFNRSBpcyB0aGUgbmFtZSBvZiBJRlAgYW5kCi0gKiBpcyBwcm92aWRlZCBmb3IgZm9ybWF0dGluZyBlcnJvciBtZXNzYWdlcyBvbmx5LgotICovCi12b2lkCi1ERUZVTiAoaGlzdF9yZWFkX3JlYywgKGlmcCwgZmlsZW5hbWUpLCBGSUxFICogaWZwIEFORCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgc3RydWN0IGdtb25faGlzdF9oZHIgaGRyOwotICBiZmRfdm1hIG5fbG93cGMsIG5faGlnaHBjOwotICBpbnQgaSwgbmNudCwgcHJvZnJhdGU7Ci0gIFVOSVQgY291bnQ7Ci0KLSAgaWYgKGZyZWFkICgmaGRyLCBzaXplb2YgKGhkciksIDEsIGlmcCkgIT0gMSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlczogdW5leHBlY3RlZCBlbmQgb2YgZmlsZVxuIiksCi0JICAgICAgIHdob2FtaSwgZmlsZW5hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIG5fbG93cGMgPSAoYmZkX3ZtYSkgZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBoZHIubG93X3BjKTsKLSAgbl9oaWdocGMgPSAoYmZkX3ZtYSkgZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBoZHIuaGlnaF9wYyk7Ci0gIG5jbnQgPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIGhkci5oaXN0X3NpemUpOwotICBwcm9mcmF0ZSA9IGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgaGRyLnByb2ZfcmF0ZSk7Ci0gIHN0cm5jcHkgKGhpc3RfZGltZW5zaW9uLCBoZHIuZGltZW4sIHNpemVvZiAoaGRyLmRpbWVuKSk7Ci0gIGhpc3RfZGltZW5zaW9uW3NpemVvZiAoaGRyLmRpbWVuKV0gPSAnXDAnOwotICBoaXN0X2RpbWVuc2lvbl9hYmJyZXYgPSBoZHIuZGltZW5fYWJicmV2OwotCi0gIGlmICghc19oaWdocGMpCi0gICAgewotCi0gICAgICAvKiB0aGlzIGlzIHRoZSBmaXJzdCBoaXN0b2dyYW0gcmVjb3JkOiAqLwotCi0gICAgICBzX2xvd3BjID0gbl9sb3dwYzsKLSAgICAgIHNfaGlnaHBjID0gbl9oaWdocGM7Ci0gICAgICBsb3dwYyA9IChiZmRfdm1hKSBuX2xvd3BjIC8gc2l6ZW9mIChVTklUKTsKLSAgICAgIGhpZ2hwYyA9IChiZmRfdm1hKSBuX2hpZ2hwYyAvIHNpemVvZiAoVU5JVCk7Ci0gICAgICBoaXN0X251bV9iaW5zID0gbmNudDsKLSAgICAgIGh6ID0gcHJvZnJhdGU7Ci0gICAgfQotCi0gIERCRyAoU0FNUExFREVCVUcsCi0gICAgICAgcHJpbnRmICgiW2hpc3RfcmVhZF9yZWNdIG5fbG93cGMgMHglbHggbl9oaWdocGMgMHglbHggbmNudCAlZFxuIiwKLQkgICAgICAgbl9sb3dwYywgbl9oaWdocGMsIG5jbnQpOwotICAgICAgIHByaW50ZiAoIltoaXN0X3JlYWRfcmVjXSBzX2xvd3BjIDB4JWx4IHNfaGlnaHBjIDB4JWx4IG5zYW1wbGVzICVkXG4iLAotCSAgICAgICBzX2xvd3BjLCBzX2hpZ2hwYywgaGlzdF9udW1fYmlucyk7Ci0gICAgICAgcHJpbnRmICgiW2hpc3RfcmVhZF9yZWNdICAgbG93cGMgMHglbHggICBoaWdocGMgMHglbHhcbiIsCi0JICAgICAgIGxvd3BjLCBoaWdocGMpKTsKLQotICBpZiAobl9sb3dwYyAhPSBzX2xvd3BjIHx8IG5faGlnaHBjICE9IHNfaGlnaHBjCi0gICAgICB8fCBuY250ICE9IGhpc3RfbnVtX2JpbnMgfHwgaHogIT0gcHJvZnJhdGUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogYCVzJyBpcyBpbmNvbXBhdGlibGUgd2l0aCBmaXJzdCBnbW9uIGZpbGVcbiIpLAotCSAgICAgICB3aG9hbWksIGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICBpZiAoIWhpc3Rfc2FtcGxlKQotICAgIHsKLSAgICAgIGhpc3Rfc2FtcGxlID0gKGludCAqKSB4bWFsbG9jIChoaXN0X251bV9iaW5zICogc2l6ZW9mIChoaXN0X3NhbXBsZVswXSkpOwotICAgICAgbWVtc2V0IChoaXN0X3NhbXBsZSwgMCwgaGlzdF9udW1fYmlucyAqIHNpemVvZiAoaGlzdF9zYW1wbGVbMF0pKTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IGhpc3RfbnVtX2JpbnM7ICsraSkKLSAgICB7Ci0gICAgICBpZiAoZnJlYWQgKCZjb3VudFswXSwgc2l6ZW9mIChjb3VudCksIDEsIGlmcCkgIT0gMSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgIF8oIiVzOiAlczogdW5leHBlY3RlZCBFT0YgYWZ0ZXIgcmVhZGluZyAlZCBvZiAlZCBzYW1wbGVzXG4iKSwKLQkJICAgd2hvYW1pLCBmaWxlbmFtZSwgaSwgaGlzdF9udW1fYmlucyk7Ci0JICBkb25lICgxKTsKLQl9Ci0gICAgICBoaXN0X3NhbXBsZVtpXSArPSBiZmRfZ2V0XzE2IChjb3JlX2JmZCwgKGJmZF9ieXRlICopICYgY291bnRbMF0pOwotICAgIH0KLX0KLQotCi0vKgotICogV3JpdGUgZXhlY3V0aW9uIGhpc3RvZ3JhbSB0byBmaWxlIE9GUC4gIEZJTEVOQU1FIGlzIHRoZSBuYW1lCi0gKiBvZiBPRlAgYW5kIGlzIHByb3ZpZGVkIGZvciBmb3JtYXR0aW5nIGVycm9yLW1lc3NhZ2VzIG9ubHkuCi0gKi8KLXZvaWQKLURFRlVOIChoaXN0X3dyaXRlX2hpc3QsIChvZnAsIGZpbGVuYW1lKSwgRklMRSAqIG9mcCBBTkQgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIHN0cnVjdCBnbW9uX2hpc3RfaGRyIGhkcjsKLSAgdW5zaWduZWQgY2hhciB0YWc7Ci0gIFVOSVQgY291bnQ7Ci0gIGludCBpOwotCi0gIC8qIHdyaXRlIGhlYWRlcjogKi8KLQotICB0YWcgPSBHTU9OX1RBR19USU1FX0hJU1Q7Ci0gIHB1dF92bWEgKGNvcmVfYmZkLCBzX2xvd3BjLCAoYmZkX2J5dGUgKikgaGRyLmxvd19wYyk7Ci0gIHB1dF92bWEgKGNvcmVfYmZkLCBzX2hpZ2hwYywgKGJmZF9ieXRlICopIGhkci5oaWdoX3BjKTsKLSAgYmZkX3B1dF8zMiAoY29yZV9iZmQsIGhpc3RfbnVtX2JpbnMsIChiZmRfYnl0ZSAqKSBoZHIuaGlzdF9zaXplKTsKLSAgYmZkX3B1dF8zMiAoY29yZV9iZmQsIGh6LCAoYmZkX2J5dGUgKikgaGRyLnByb2ZfcmF0ZSk7Ci0gIHN0cm5jcHkgKGhkci5kaW1lbiwgaGlzdF9kaW1lbnNpb24sIHNpemVvZiAoaGRyLmRpbWVuKSk7Ci0gIGhkci5kaW1lbl9hYmJyZXYgPSBoaXN0X2RpbWVuc2lvbl9hYmJyZXY7Ci0KLSAgaWYgKGZ3cml0ZSAoJnRhZywgc2l6ZW9mICh0YWcpLCAxLCBvZnApICE9IDEKLSAgICAgIHx8IGZ3cml0ZSAoJmhkciwgc2l6ZW9mIChoZHIpLCAxLCBvZnApICE9IDEpCi0gICAgewotICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IGhpc3RfbnVtX2JpbnM7ICsraSkKLSAgICB7Ci0gICAgICBiZmRfcHV0XzE2IChjb3JlX2JmZCwgaGlzdF9zYW1wbGVbaV0sIChiZmRfYnl0ZSAqKSAmIGNvdW50WzBdKTsKLSAgICAgIGlmIChmd3JpdGUgKCZjb3VudFswXSwgc2l6ZW9mIChjb3VudCksIDEsIG9mcCkgIT0gMSkKLQl7Ci0JICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIENhbGN1bGF0ZSBzY2FsZWQgZW50cnkgcG9pbnQgYWRkcmVzc2VzICh0byBzYXZlIHRpbWUgaW4KLSAqIGhpc3RfYXNzaWduX3NhbXBsZXMpLCBhbmQsIG9uIGFyY2hpdGVjdHVyZXMgdGhhdCBoYXZlIHByb2NlZHVyZQotICogZW50cnkgbWFza3MgYXQgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24sIHBvc3NpYmx5IHB1c2ggdGhlIHNjYWxlZAotICogZW50cnkgcG9pbnRzIG92ZXIgdGhlIHByb2NlZHVyZSBlbnRyeSBtYXNrLCBpZiBpdCB0dXJucyBvdXQgdGhhdAotICogdGhlIGVudHJ5IHBvaW50IGlzIGluIG9uZSBiaW4gYW5kIHRoZSBjb2RlIGZvciBhIHJvdXRpbmUgaXMgaW4gdGhlCi0gKiBuZXh0IGJpbi4KLSAqLwotc3RhdGljIHZvaWQKLXNjYWxlX2FuZF9hbGlnbl9lbnRyaWVzICgpCi17Ci0gIFN5bSAqc3ltOwotICBiZmRfdm1hIGJpbl9vZl9lbnRyeTsKLSAgYmZkX3ZtYSBiaW5fb2ZfY29kZTsKLQotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7IHN5bSsrKQotICAgIHsKLSAgICAgIHN5bS0+aGlzdC5zY2FsZWRfYWRkciA9IHN5bS0+YWRkciAvIHNpemVvZiAoVU5JVCk7Ci0gICAgICBiaW5fb2ZfZW50cnkgPSAoc3ltLT5oaXN0LnNjYWxlZF9hZGRyIC0gbG93cGMpIC8gaGlzdF9zY2FsZTsKLSAgICAgIGJpbl9vZl9jb2RlID0gKHN5bS0+aGlzdC5zY2FsZWRfYWRkciArIFVOSVRTX1RPX0NPREUgLSBsb3dwYykgLyBoaXN0X3NjYWxlOwotICAgICAgaWYgKGJpbl9vZl9lbnRyeSA8IGJpbl9vZl9jb2RlKQotCXsKLQkgIERCRyAoU0FNUExFREVCVUcsCi0JICAgICAgIHByaW50ZiAoIltzY2FsZV9hbmRfYWxpZ25fZW50cmllc10gcHVzaGluZyAweCVseCB0byAweCVseFxuIiwKLQkJICAgICAgIHN5bS0+aGlzdC5zY2FsZWRfYWRkciwKLQkJICAgICAgIHN5bS0+aGlzdC5zY2FsZWRfYWRkciArIFVOSVRTX1RPX0NPREUpKTsKLQkgIHN5bS0+aGlzdC5zY2FsZWRfYWRkciArPSBVTklUU19UT19DT0RFOwotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIEFzc2lnbiBzYW1wbGVzIHRvIHRoZSBzeW1ib2wgdG8gd2hpY2ggdGhleSBiZWxvbmcuCi0gKgotICogSGlzdG9ncmFtIGJpbiBJIGNvdmVycyBzb21lIGFkZHJlc3MgcmFuZ2UgW0JJTl9MT1dQQyxCSU5fSElHSF9QQykKLSAqIHdoaWNoIG1heSBvdmVybGFwIG9uZSBtb3JlIHN5bWJvbCBhZGRyZXNzIHJhbmdlcy4gIElmIGEgc3ltYm9sCi0gKiBvdmVybGFwcyB3aXRoIHRoZSBiaW4ncyBhZGRyZXNzIHJhbmdlIGJ5IE8gcGVyY2VudCwgdGhlbiBPIHBlcmNlbnQKLSAqIG9mIHRoZSBiaW4ncyBjb3VudCBpcyBjcmVkaXRlZCB0byB0aGF0IHN5bWJvbC4KLSAqCi0gKiBUaGVyZSBhcmUgdGhyZWUgY2FzZXMgYXMgdG8gd2hlcmUgQklOX0xPV19QQyBhbmQgQklOX0hJR0hfUEMgY2FuIGJlCi0gKiB3aXRoIHJlc3BlY3QgdG8gdGhlIHN5bWJvbCdzIGFkZHJlc3MgcmFuZ2UgW1NZTV9MT1dfUEMsCi0gKiBTWU1fSElHSF9QQykgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBkaWFncmFtLiAgT1ZFUkxBUCBjb21wdXRlcwotICogdGhlIGRpc3RhbmNlIChpbiBVTklUcykgYmV0d2VlbiB0aGUgYXJyb3dzLCB0aGUgZnJhY3Rpb24gb2YgdGhlCi0gKiBzYW1wbGUgdGhhdCBpcyB0byBiZSBjcmVkaXRlZCB0byB0aGUgc3ltYm9sIHdoaWNoIHN0YXJ0cyBhdAotICogU1lNX0xPV19QQy4KLSAqCi0gKiAgICAgICAgc3ltX2xvd19wYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltX2hpZ2hfcGMKLSAqICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICAgICAgICAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYKLSAqCi0gKiAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICAgICAgfCAgLT58ICAgIHw8LSAgICAgICAgIC0+fCAgICAgICAgIHw8LSAgICAgICAgIC0+fCAgICB8PC0gIHwKLSAqICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgfAotICogICAgICAgICstLS0tLS0tLS0rICAgICAgICAgICAgICstLS0tLS0tLS0rICAgICAgICAgICAgICstLS0tLS0tLS0rCi0gKgotICogICAgICAgIF4gICAgICAgICBeICAgICAgICAgICAgIF4gICAgICAgICBeICAgICAgICAgICAgIF4gICAgICAgICBeCi0gKiAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgIHwKLSAqICAgYmluX2xvd19wYyBiaW5faGlnaF9wYyAgYmluX2xvd19wYyBiaW5faGlnaF9wYyAgYmluX2xvd19wYyBiaW5faGlnaF9wYwotICoKLSAqIEZvciB0aGUgVkFYIHdlIGFzc2VydCB0aGF0IHNhbXBsZXMgd2lsbCBuZXZlciBmYWxsIGluIHRoZSBmaXJzdCB0d28KLSAqIGJ5dGVzIG9mIGFueSByb3V0aW5lLCBzaW5jZSB0aGF0IGlzIHRoZSBlbnRyeSBtYXNrLCB0aHVzIHdlIGNhbGwKLSAqIHNjYWxlX2FuZF9hbGlnbl9lbnRyaWVzKCkgdG8gYWRqdXN0IHRoZSBlbnRyeSBwb2ludHMgaWYgdGhlIGVudHJ5Ci0gKiBtYXNrIGZhbGxzIGluIG9uZSBiaW4gYnV0IHRoZSBjb2RlIGZvciB0aGUgcm91dGluZSBkb2Vzbid0IHN0YXJ0Ci0gKiB1bnRpbCB0aGUgbmV4dCBiaW4uICBJbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbGlnbm1lbnQgb2Ygcm91dGluZQotICogYWRkcmVzc2VzLCB0aGlzIHNob3VsZCBhbGxvdyB1cyB0byBoYXZlIG9ubHkgb25lIHNhbXBsZSBmb3IgZXZlcnkKLSAqIGZvdXIgYnl0ZXMgb2YgdGV4dCBzcGFjZSBhbmQgbmV2ZXIgaGF2ZSBhbnkgb3ZlcmxhcCAodGhlIHR3byBlbmQKLSAqIGNhc2VzLCBhYm92ZSkuCi0gKi8KLXZvaWQKLURFRlVOX1ZPSUQgKGhpc3RfYXNzaWduX3NhbXBsZXMpCi17Ci0gIGJmZF92bWEgYmluX2xvd19wYywgYmluX2hpZ2hfcGM7Ci0gIGJmZF92bWEgc3ltX2xvd19wYywgc3ltX2hpZ2hfcGM7Ci0gIGJmZF92bWEgb3ZlcmxhcCwgYWRkcjsKLSAgaW50IGJpbl9jb3VudCwgaTsKLSAgdW5zaWduZWQgaW50IGo7Ci0gIGRvdWJsZSB0aW1lLCBjcmVkaXQ7Ci0KLSAgLyogcmVhZCBzYW1wbGVzIGFuZCBhc3NpZ24gdG8gc3ltYm9sczogKi8KLSAgaGlzdF9zY2FsZSA9IGhpZ2hwYyAtIGxvd3BjOwotICBoaXN0X3NjYWxlIC89IGhpc3RfbnVtX2JpbnM7Ci0gIHNjYWxlX2FuZF9hbGlnbl9lbnRyaWVzICgpOwotCi0gIC8qIGl0ZXJhdGUgb3ZlciBhbGwgc2FtcGxlIGJpbnM6ICovCi0KLSAgZm9yIChpID0gMCwgaiA9IDE7IGkgPCBoaXN0X251bV9iaW5zOyArK2kpCi0gICAgewotICAgICAgYmluX2NvdW50ID0gaGlzdF9zYW1wbGVbaV07Ci0gICAgICBpZiAoIWJpbl9jb3VudCkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBiaW5fbG93X3BjID0gbG93cGMgKyAoYmZkX3ZtYSkgKGhpc3Rfc2NhbGUgKiBpKTsKLSAgICAgIGJpbl9oaWdoX3BjID0gbG93cGMgKyAoYmZkX3ZtYSkgKGhpc3Rfc2NhbGUgKiAoaSArIDEpKTsKLSAgICAgIHRpbWUgPSBiaW5fY291bnQ7Ci0gICAgICBEQkcgKFNBTVBMRURFQlVHLAotCSAgIHByaW50ZiAoCi0gICAgICAiW2Fzc2lnbl9zYW1wbGVzXSBiaW5fbG93X3BjPTB4JWx4LCBiaW5faGlnaF9wYz0weCVseCwgYmluX2NvdW50PSVkXG4iLAotCQkgICAgc2l6ZW9mIChVTklUKSAqIGJpbl9sb3dfcGMsIHNpemVvZiAoVU5JVCkgKiBiaW5faGlnaF9wYywKLQkJICAgIGJpbl9jb3VudCkpOwotICAgICAgdG90YWxfdGltZSArPSB0aW1lOwotCi0gICAgICAvKiBjcmVkaXQgYWxsIHN5bWJvbHMgdGhhdCBhcmUgY292ZXJlZCBieSBiaW4gSTogKi8KLQotICAgICAgZm9yIChqID0gaiAtIDE7IGogPCBzeW10YWIubGVuOyArK2opCi0JewotCSAgc3ltX2xvd19wYyA9IHN5bXRhYi5iYXNlW2pdLmhpc3Quc2NhbGVkX2FkZHI7Ci0JICBzeW1faGlnaF9wYyA9IHN5bXRhYi5iYXNlW2ogKyAxXS5oaXN0LnNjYWxlZF9hZGRyOwotCSAgLyoKLQkgICAqIElmIGhpZ2ggZW5kIG9mIGJpbiBpcyBiZWxvdyBlbnRyeSBhZGRyZXNzLCBnbyBmb3IgbmV4dAotCSAgICogYmluOgotCSAgICovCi0JICBpZiAoYmluX2hpZ2hfcGMgPCBzeW1fbG93X3BjKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC8qCi0JICAgKiBJZiBsb3cgZW5kIG9mIGJpbiBpcyBhYm92ZSBoaWdoIGVuZCBvZiBzeW1ib2wsIGdvIGZvcgotCSAgICogbmV4dCBzeW1ib2wuCi0JICAgKi8KLQkgIGlmIChiaW5fbG93X3BjID49IHN5bV9oaWdoX3BjKQotCSAgICB7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIG92ZXJsYXAgPQotCSAgICBNSU4gKGJpbl9oaWdoX3BjLCBzeW1faGlnaF9wYykgLSBNQVggKGJpbl9sb3dfcGMsIHN5bV9sb3dfcGMpOwotCSAgaWYgKG92ZXJsYXAgPiAwKQotCSAgICB7Ci0JICAgICAgREJHIChTQU1QTEVERUJVRywKLQkJICAgcHJpbnRmICgKLQkJCSAgICAiW2Fzc2lnbl9zYW1wbGVzXSBbMHglbHgsMHglbHgpICVzIGdldHMgJWYgdGlja3MgJWxkIG92ZXJsYXBcbiIsCi0JCQkgICAgc3ltdGFiLmJhc2Vbal0uYWRkciwgc2l6ZW9mIChVTklUKSAqIHN5bV9oaWdoX3BjLAotCQkJICAgIHN5bXRhYi5iYXNlW2pdLm5hbWUsIG92ZXJsYXAgKiB0aW1lIC8gaGlzdF9zY2FsZSwKLQkJCSAgICBvdmVybGFwKSk7Ci0JICAgICAgYWRkciA9IHN5bXRhYi5iYXNlW2pdLmFkZHI7Ci0JICAgICAgY3JlZGl0ID0gb3ZlcmxhcCAqIHRpbWUgLyBoaXN0X3NjYWxlOwotCSAgICAgIC8qCi0JICAgICAgICogQ3JlZGl0IHN5bWJvbCBpZiBpdCBhcHBlYXJzIGluIElOQ0xfRkxBVCBvciB0aGF0Ci0JICAgICAgICogdGFibGUgaXMgZW1wdHkgYW5kIGl0IGRvZXMgbm90IGFwcGVhciBpdCBpbgotCSAgICAgICAqIEVYQ0xfRkxBVC4KLQkgICAgICAgKi8KLQkgICAgICBpZiAoc3ltX2xvb2t1cCAoJnN5bXNbSU5DTF9GTEFUXSwgYWRkcikKLQkJICB8fCAoc3ltc1tJTkNMX0ZMQVRdLmxlbiA9PSAwCi0JCSAgICAgICYmICFzeW1fbG9va3VwICgmc3ltc1tFWENMX0ZMQVRdLCBhZGRyKSkpCi0JCXsKLQkJICBzeW10YWIuYmFzZVtqXS5oaXN0LnRpbWUgKz0gY3JlZGl0OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdG90YWxfdGltZSAtPSBjcmVkaXQ7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIERCRyAoU0FNUExFREVCVUcsIHByaW50ZiAoIlthc3NpZ25fc2FtcGxlc10gdG90YWxfdGltZSAlZlxuIiwKLQkJCSAgICB0b3RhbF90aW1lKSk7Ci19Ci0KLQotLyoKLSAqIFByaW50IGhlYWRlciBmb3IgZmxhZyBoaXN0b2dyYW0gcHJvZmlsZToKLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChwcmludF9oZWFkZXIsIChwcmVmaXgpLCBjb25zdCBjaGFyIHByZWZpeCkKLXsKLSAgY2hhciB1bml0WzY0XTsKLQotICBzcHJpbnRmICh1bml0LCBfKCIlYyVjL2NhbGwiKSwgcHJlZml4LCBoaXN0X2RpbWVuc2lvbl9hYmJyZXYpOwotCi0gIGlmIChic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiXG5ncmFudWxhcml0eTogZWFjaCBzYW1wbGUgaGl0IGNvdmVycyAlbGQgYnl0ZShzKSIpLAotCSAgICAgIChsb25nKSBoaXN0X3NjYWxlICogc2l6ZW9mIChVTklUKSk7Ci0gICAgICBpZiAodG90YWxfdGltZSA+IDAuMCkKLQl7Ci0JICBwcmludGYgKF8oIiBmb3IgJS4yZiUlIG9mICUuMmYgJXNcblxuIiksCi0JCSAgMTAwLjAgLyB0b3RhbF90aW1lLCB0b3RhbF90aW1lIC8gaHosIGhpc3RfZGltZW5zaW9uKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmIChfKCJcbkVhY2ggc2FtcGxlIGNvdW50cyBhcyAlZyAlcy5cbiIpLCAxLjAgLyBoeiwgaGlzdF9kaW1lbnNpb24pOwotICAgIH0KLQotICBpZiAodG90YWxfdGltZSA8PSAwLjApCi0gICAgewotICAgICAgcHJpbnRmIChfKCIgbm8gdGltZSBhY2N1bXVsYXRlZFxuXG4iKSk7Ci0gICAgICAvKiB0aGlzIGRvZXNuJ3QgaHVydCBzaW5jZSBhbGwgdGhlIG51bWVyYXRvcnMgd2lsbCBiZSB6ZXJvOiAqLwotICAgICAgdG90YWxfdGltZSA9IDEuMDsKLSAgICB9Ci0KLSAgcHJpbnRmICgiJTUuNXMgJTEwLjEwcyAlOC44cyAlOC44cyAlOC44cyAlOC44cyAgJS04LjhzXG4iLAotCSAgIiUgICIsIF8oImN1bXVsYXRpdmUiKSwgXygic2VsZiAgIiksICIiLCBfKCJzZWxmICAiKSwgXygidG90YWwgIiksICIiKTsKLSAgcHJpbnRmICgiJTUuNXMgJTkuOXMgICU4LjhzICU4LjhzICU4LjhzICU4LjhzICAlLTguOHNcbiIsCi0JICBfKCJ0aW1lIiksIGhpc3RfZGltZW5zaW9uLCBoaXN0X2RpbWVuc2lvbiwgXygiY2FsbHMiKSwgdW5pdCwgdW5pdCwKLQkgIF8oIm5hbWUiKSk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOIChwcmludF9saW5lLCAoc3ltLCBzY2FsZSksIFN5bSAqIHN5bSBBTkQgZG91YmxlIHNjYWxlKQotewotICBpZiAoaWdub3JlX3plcm9zICYmIHN5bS0+bmNhbGxzID09IDAgJiYgc3ltLT5oaXN0LnRpbWUgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGFjY3VtX3RpbWUgKz0gc3ltLT5oaXN0LnRpbWU7Ci0gIGlmIChic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIHByaW50ZiAoIiU1LjFmICUxMC4yZiAlOC4yZiIsCi0JICAgICAgdG90YWxfdGltZSA+IDAuMCA/IDEwMCAqIHN5bS0+aGlzdC50aW1lIC8gdG90YWxfdGltZSA6IDAuMCwKLQkgICAgICBhY2N1bV90aW1lIC8gaHosIHN5bS0+aGlzdC50aW1lIC8gaHopOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIiU2LjJmICU5LjJmICU4LjJmIiwKLQkgICAgICB0b3RhbF90aW1lID4gMC4wID8gMTAwICogc3ltLT5oaXN0LnRpbWUgLyB0b3RhbF90aW1lIDogMC4wLAotCSAgICAgIGFjY3VtX3RpbWUgLyBoeiwgc3ltLT5oaXN0LnRpbWUgLyBoeik7Ci0gICAgfQotICBpZiAoc3ltLT5uY2FsbHMgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIgJThsdSAlOC4yZiAlOC4yZiAgIiwKLQkgICAgICBzeW0tPm5jYWxscywgc2NhbGUgKiBzeW0tPmhpc3QudGltZSAvIGh6IC8gc3ltLT5uY2FsbHMsCi0JICBzY2FsZSAqIChzeW0tPmhpc3QudGltZSArIHN5bS0+Y2cuY2hpbGRfdGltZSkgLyBoeiAvIHN5bS0+bmNhbGxzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCIgJTguOHMgJTguOHMgJTguOHMgICIsICIiLCAiIiwgIiIpOwotICAgIH0KLSAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgcHJpbnRfbmFtZSAoc3ltKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludF9uYW1lX29ubHkgKHN5bSk7Ci0gICAgfQotICBwcmludGYgKCJcbiIpOwotfQotCi0KLS8qCi0gKiBDb21wYXJlIExQIGFuZCBSUC4gIFRoZSBwcmltYXJ5IGNvbXBhcmlzb24ga2V5IGlzIGV4ZWN1dGlvbiB0aW1lLAotICogdGhlIHNlY29uZGFyeSBpcyBudW1iZXIgb2YgaW52b2NhdGlvbiwgYW5kIHRoZSB0ZXJ0aWFyeSBpcyB0aGUKLSAqIGxleGljb2dyYXBoaWMgb3JkZXIgb2YgdGhlIGZ1bmN0aW9uIG5hbWVzLgotICovCi1zdGF0aWMgaW50Ci1ERUZVTiAoY21wX3RpbWUsIChscCwgcnApLCBjb25zdCBQVFIgbHAgQU5EIGNvbnN0IFBUUiBycCkKLXsKLSAgY29uc3QgU3ltICpsZWZ0ID0gKihjb25zdCBTeW0gKiopIGxwOwotICBjb25zdCBTeW0gKnJpZ2h0ID0gKihjb25zdCBTeW0gKiopIHJwOwotICBkb3VibGUgdGltZV9kaWZmOwotCi0gIHRpbWVfZGlmZiA9IHJpZ2h0LT5oaXN0LnRpbWUgLSBsZWZ0LT5oaXN0LnRpbWU7Ci0gIGlmICh0aW1lX2RpZmYgPiAwLjApCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAodGltZV9kaWZmIDwgMC4wKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKHJpZ2h0LT5uY2FsbHMgPiBsZWZ0LT5uY2FsbHMpCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAocmlnaHQtPm5jYWxscyA8IGxlZnQtPm5jYWxscykKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiBzdHJjbXAgKGxlZnQtPm5hbWUsIHJpZ2h0LT5uYW1lKTsKLX0KLQotCi0vKgotICogUHJpbnQgdGhlIGZsYXQgaGlzdG9ncmFtIHByb2ZpbGUuCi0gKi8KLXZvaWQKLURFRlVOX1ZPSUQgKGhpc3RfcHJpbnQpCi17Ci0gIFN5bSAqKnRpbWVfc29ydGVkX3N5bXMsICp0b3BfZG9nLCAqc3ltOwotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0gIGludCBsb2dfc2NhbGU7Ci0gIGRvdWJsZSB0b3BfdGltZSwgdGltZTsKLSAgYmZkX3ZtYSBhZGRyOwotCi0gIGlmIChmaXJzdF9vdXRwdXQpCi0gICAgewotICAgICAgZmlyc3Rfb3V0cHV0ID0gRkFMU0U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiXGZcbiIpOwotICAgIH0KLQotICBhY2N1bV90aW1lID0gMC4wOwotICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBpZiAocHJpbnRfZGVzY3JpcHRpb25zKQotCXsKLQkgIHByaW50ZiAoXygiXG5cblxuZmxhdCBwcm9maWxlOlxuIikpOwotCSAgZmxhdF9ibHVyYiAoc3Rkb3V0KTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmIChfKCJGbGF0IHByb2ZpbGU6XG4iKSk7Ci0gICAgfQotICAvKgotICAgKiBTb3J0IHRoZSBzeW1ib2wgdGFibGUgYnkgdGltZSAoY2FsbC1jb3VudCBhbmQgbmFtZSBhcyBzZWNvbmRhcnkKLSAgICogYW5kIHRlcnRpYXJ5IGtleXMpOgotICAgKi8KLSAgdGltZV9zb3J0ZWRfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSAqKSk7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47ICsraW5kZXgpCi0gICAgewotICAgICAgdGltZV9zb3J0ZWRfc3ltc1tpbmRleF0gPSAmc3ltdGFiLmJhc2VbaW5kZXhdOwotICAgIH0KLSAgcXNvcnQgKHRpbWVfc29ydGVkX3N5bXMsIHN5bXRhYi5sZW4sIHNpemVvZiAoU3ltICopLCBjbXBfdGltZSk7Ci0KLSAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgbG9nX3NjYWxlID0gNTsJCS8qIG1pbGxpLXNlY29uZHMgaXMgQlNELWRlZmF1bHQgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogU2VhcmNoIGZvciBzeW1ib2wgd2l0aCBoaWdoZXN0IHBlci1jYWxsIGV4ZWN1dGlvbiB0aW1lIGFuZAotICAgICAgICogc2NhbGUgYWNjb3JkaW5nbHk6Ci0gICAgICAgKi8KLSAgICAgIGxvZ19zY2FsZSA9IDA7Ci0gICAgICB0b3BfZG9nID0gMDsKLSAgICAgIHRvcF90aW1lID0gMC4wOwotICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgKytpbmRleCkKLQl7Ci0JICBzeW0gPSB0aW1lX3NvcnRlZF9zeW1zW2luZGV4XTsKLQkgIGlmIChzeW0tPm5jYWxscyAhPSAwKQotCSAgICB7Ci0JICAgICAgdGltZSA9IChzeW0tPmhpc3QudGltZSArIHN5bS0+Y2cuY2hpbGRfdGltZSkgLyBzeW0tPm5jYWxsczsKLQkgICAgICBpZiAodGltZSA+IHRvcF90aW1lKQotCQl7Ci0JCSAgdG9wX2RvZyA9IHN5bTsKLQkJICB0b3BfdGltZSA9IHRpbWU7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGlmICh0b3BfZG9nICYmIHRvcF9kb2ctPm5jYWxscyAhPSAwICYmIHRvcF90aW1lID4gMC4wKQotCXsKLQkgIHRvcF90aW1lIC89IGh6OwotCSAgd2hpbGUgKFNJdGFiW2xvZ19zY2FsZV0uc2NhbGUgKiB0b3BfdGltZSA8IDEwMDAuMAotCQkgJiYgKChzaXplX3QpIGxvZ19zY2FsZQotCQkgICAgIDwgc2l6ZW9mIChTSXRhYikgLyBzaXplb2YgKFNJdGFiWzBdKSAtIDEpKQotCSAgICB7Ci0JICAgICAgKytsb2dfc2NhbGU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qCi0gICAqIEZvciBub3csIHRoZSBkaW1lbnNpb24gaXMgYWx3YXlzIHNlY29uZHMuICBJbiB0aGUgZnV0dXJlLCB3ZQotICAgKiBtYXkgYWxzbyB3YW50IHRvIHN1cHBvcnQgb3RoZXIgKHBzZXVkby0pZGltZW5zaW9ucyAoc3VjaCBhcwotICAgKiBJLWNhY2hlIG1pc3NlcyBldGMuKS4KLSAgICovCi0gIHByaW50X2hlYWRlciAoU0l0YWJbbG9nX3NjYWxlXS5wcmVmaXgpOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyArK2luZGV4KQotICAgIHsKLSAgICAgIGFkZHIgPSB0aW1lX3NvcnRlZF9zeW1zW2luZGV4XS0+YWRkcjsKLSAgICAgIC8qCi0gICAgICAgKiBQcmludCBzeW1ib2wgaWYgaXRzIGluIElOQ0xfRkxBVCB0YWJsZSBvciB0aGF0IHRhYmxlCi0gICAgICAgKiBpcyBlbXB0eSBhbmQgdGhlIHN5bWJvbCBpcyBub3QgaW4gRVhDTF9GTEFULgotICAgICAgICovCi0gICAgICBpZiAoc3ltX2xvb2t1cCAoJnN5bXNbSU5DTF9GTEFUXSwgYWRkcikKLQkgIHx8IChzeW1zW0lOQ0xfRkxBVF0ubGVuID09IDAKLQkgICAgICAmJiAhc3ltX2xvb2t1cCAoJnN5bXNbRVhDTF9GTEFUXSwgYWRkcikpKQotCXsKLQkgIHByaW50X2xpbmUgKHRpbWVfc29ydGVkX3N5bXNbaW5kZXhdLCBTSXRhYltsb2dfc2NhbGVdLnNjYWxlKTsKLQl9Ci0gICAgfQotICBmcmVlICh0aW1lX3NvcnRlZF9zeW1zKTsKLQotICBpZiAocHJpbnRfZGVzY3JpcHRpb25zICYmICFic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIGZsYXRfYmx1cmIgKHN0ZG91dCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvaGlzdC5oIGIvZ3Byb2YvaGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjYyZWY3Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2hpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNpZm5kZWYgaGlzdF9oCi0jZGVmaW5lIGhpc3RfaAotCi0jaW5jbHVkZSAiYmZkLmgiCi0KLWV4dGVybiBiZmRfdm1hIHNfbG93cGM7CQkvKiBsb3dwYyBmcm9tIHRoZSBwcm9maWxlIGZpbGUgKi8KLWV4dGVybiBiZmRfdm1hIHNfaGlnaHBjOwkvKiBoaWdocGMgZnJvbSB0aGUgcHJvZmlsZSBmaWxlICovCi1leHRlcm4gYmZkX3ZtYSBsb3dwYywgaGlnaHBjOwkvKiByYW5nZSBwcm9maWxlZCwgaW4gVU5JVCdzICovCi1leHRlcm4gaW50IGhpc3RfbnVtX2JpbnM7CS8qIG51bWJlciBvZiBoaXN0b2dyYW0gYmlucyAqLwotZXh0ZXJuIGludCAqaGlzdF9zYW1wbGU7CS8qIGNvZGUgaGlzdG9ncmFtICovCi0vKgotICogU2NhbGUgZmFjdG9yIGNvbnZlcnRpbmcgc2FtcGxlcyB0byBwYyB2YWx1ZXM6IGVhY2ggc2FtcGxlIGNvdmVycwotICogSElTVF9TQ0FMRSBieXRlczoKLSAqLwotZXh0ZXJuIGRvdWJsZSBoaXN0X3NjYWxlOwotCi0KLWV4dGVybiB2b2lkIGhpc3RfcmVhZF9yZWMgUEFSQU1TICgoRklMRSAqIGlmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLWV4dGVybiB2b2lkIGhpc3Rfd3JpdGVfaGlzdCBQQVJBTVMgKChGSUxFICogb2ZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotZXh0ZXJuIHZvaWQgaGlzdF9hc3NpZ25fc2FtcGxlcyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBoaXN0X3ByaW50IFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmIC8qIGhpc3RfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvaTM4Ni5jIGIvZ3Byb2YvaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGFhZDFjLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2kzODYuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAotICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKLSAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKLSAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0jaW5jbHVkZSAiaGlzdC5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi0KLWludAotREVGVU4gKGkzODZfaXNjYWxsLCAoaXApLCB1bnNpZ25lZCBjaGFyICppcCkKLXsKLSAgaWYgKCppcCA9PSAweGU4KQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotCi12b2lkCi1pMzg2X2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYykKLSAgICAgU3ltICpwYXJlbnQ7Ci0gICAgIGJmZF92bWEgcF9sb3dwYzsKLSAgICAgYmZkX3ZtYSBwX2hpZ2hwYzsKLXsKLSAgdW5zaWduZWQgY2hhciAqaW5zdHJ1Y3RwOwotICBTeW0gKmNoaWxkOwotICBiZmRfdm1hIGRlc3RwYywgZGVsdGE7Ci0KLSAgaWYgKGNvcmVfdGV4dF9zcGFjZSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChwX2xvd3BjIDwgc19sb3dwYykKLSAgICB7Ci0gICAgICBwX2xvd3BjID0gc19sb3dwYzsKLSAgICB9Ci0gIGlmIChwX2hpZ2hwYyA+IHNfaGlnaHBjKQotICAgIHsKLSAgICAgIHBfaGlnaHBjID0gc19oaWdocGM7Ci0gICAgfQotICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiW2ZpbmRjYWxsXSAlczogMHglbHggdG8gMHglbHhcbiIsCi0JCQkgIHBhcmVudC0+bmFtZSwgcF9sb3dwYywgcF9oaWdocGMpKTsKLQotICBkZWx0YSA9IChiZmRfdm1hKSBjb3JlX3RleHRfc3BhY2UgLSBjb3JlX3RleHRfc2VjdC0+dm1hOwotCi0gIGZvciAoaW5zdHJ1Y3RwID0gKHVuc2lnbmVkIGNoYXIgKikgKHBfbG93cGMgKyBkZWx0YSk7Ci0gICAgICAgaW5zdHJ1Y3RwIDwgKHVuc2lnbmVkIGNoYXIgKikgKHBfaGlnaHBjICsgZGVsdGEpOwotICAgICAgIGluc3RydWN0cCArKykKLSAgICB7Ci0gICAgICBpZiAoaTM4Nl9pc2NhbGwgKGluc3RydWN0cCkpCi0JewotCSAgREJHIChDQUxMREVCVUcsCi0JICAgICAgIHByaW50ZiAoIltmaW5kY2FsbF1cdDB4JXg6Y2FsbCIsCi0JCSAgICAgICBpbnN0cnVjdHAgLSAodW5zaWduZWQgY2hhciAqKSBkZWx0YSkpOwotCSAgLyoKLQkgICAqICByZWd1bGFyIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcKLQkgICAqICAgIGNoZWNrIHRoYXQgdGhpcyBpcyB0aGUgYWRkcmVzcyBvZiAKLQkgICAqICAgIGEgZnVuY3Rpb24uCi0JICAgKi8KLQotCSAgZGVzdHBjID0gKChiZmRfdm1hKSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgaW5zdHJ1Y3RwICsgMSkKLQkJICAgICsgKGJmZF92bWEpIGluc3RydWN0cCAtIChiZmRfdm1hKSBkZWx0YSArIDUpOwotCSAgaWYgKGRlc3RwYyA+PSBzX2xvd3BjICYmIGRlc3RwYyA8PSBzX2hpZ2hwYykKLQkgICAgewotCSAgICAgIGNoaWxkID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgZGVzdHBjKTsKLQkgICAgICBpZiAoY2hpbGQgJiYgY2hpbGQtPmFkZHIgPT0gZGVzdHBjKQotCQl7Ci0JCSAgLyoKLQkJICAgKiAgICAgIGEgaGl0Ci0JCSAgICovCi0JCSAgREJHIChDQUxMREVCVUcsCi0JCSAgICAgICBwcmludGYgKCJcdGRlc3RwYyAweCVseCAoJXMpXG4iLCBkZXN0cGMsIGNoaWxkLT5uYW1lKSk7Ci0JCSAgYXJjX2FkZCAocGFyZW50LCBjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCQkgIGluc3RydWN0cCArPSA0OwkvKiBjYWxsIGlzIGEgNSBieXRlIGluc3RydWN0aW9uICovCi0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCSAgLyoKLQkgICAqICBlbHNlOgotCSAgICogICAgaXQgbG9va2VkIGxpa2UgYSBjYWxsZiwgYnV0IGl0OgotCSAgICogICAgICBhKSB3YXNuJ3QgYWN0dWFsbHkgYSBjYWxsZiwgb3IKLQkgICAqICAgICAgYikgZGlkbid0IHBvaW50IHRvIGEga25vd24gZnVuY3Rpb24gaW4gdGhlIHN5bXRhYiwgb3IKLQkgICAqICAgICAgYykgc29tZXRoaW5nIGZ1bm55IGlzIGdvaW5nIG9uLgotCSAgICovCi0JICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiXHRidXQgaXQncyBhIGJvdGNoXG4iKSk7Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL3BvL01ha2UtaW4gYi9ncHJvZi9wby9NYWtlLWluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTUyZGIxLi4wMDAwMDAwCi0tLSBhL2dwcm9mL3BvL01ha2UtaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgcHJvZ3JhbSBzb3VyY2UgZGlyZWN0b3J5IGluIEdOVSBOTFMgdXRpbGl0aWVzIHBhY2thZ2UuCi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotUEFDS0FHRSA9IEBQQUNLQUdFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotCi1TSEVMTCA9IC9iaW4vc2gKLUBTRVRfTUFLRUAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACi1sb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQotZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQotZ2V0dGV4dHNyY2RpciA9ICQocHJlZml4KS9zaGFyZS9nZXR0ZXh0L3BvCi1zdWJkaXIgPSBwbwotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotCi1DQyA9IEBDQ0AKLUdFTkNBVCA9IEBHRU5DQVRACi1HTVNHRk1UID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBHTVNHRk1UQAotTVNHRk1UID0gQE1TR0ZNVEAKLVhHRVRURVhUID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBYR0VUVEVYVEAKLU1TR01FUkdFID0gUEFUSD0uLi9zcmM6JCRQQVRIIG1zZ21lcmdlCi0KLURFRlMgPSBAREVGU0AKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLQotSU5DTFVERVMgPSAtSS4uIC1JJCh0b3Bfc3JjZGlyKS9pbnRsCi0KLUNPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCi0KLVNPVVJDRVMgPSBjYXQtaWQtdGJsLmMKLVBPRklMRVMgPSBAUE9GSUxFU0AKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotRElTVEZJTEVTID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluLmluIFBPVEZJTEVTLmluICQoUEFDS0FHRSkucG90IFwKLXN0YW1wLWNhdC1pZCAkKFBPRklMRVMpICQoR01PRklMRVMpICQoU09VUkNFUykKLQotUE9URklMRVMgPSBcCi0KLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubyAucG8gLnBveCAuZ21vIC5tbyAubXNnIC5jYXQKLQotLmMubzoKLQkkKENPTVBJTEUpICQ8Ci0KLS5wby5wb3g6Ci0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCSQoTVNHTUVSR0UpICQ8ICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCAtbyAkKi5wb3gKLQotLnBvLm1vOgotCSQoTVNHRk1UKSAtbyAkQCAkPAotCi0ucG8uZ21vOgotCWZpbGU9JChzcmNkaXIpL2BlY2hvICQqIHwgc2VkICdzLC4qLywsJ2AuZ21vIFwKLQkgICYmIHJtIC1mICQkZmlsZSAmJiAkKEdNU0dGTVQpIC1vICQkZmlsZSAkPAotCi0ucG8uY2F0OgotCXNlZCAtZiAuLi9pbnRsL3BvMm1zZy5zZWQgPCAkPCA+ICQqLm1zZyBcCi0JICAmJiBybSAtZiAkQCAmJiAkKEdFTkNBVCkgJEAgJCoubXNnCi0KLQotYWxsOiBhbGwtQFVTRV9OTFNACi0KLWFsbC15ZXM6ICQoQ0FUQUxPR1MpIEBNQUlOVEAgJChQQUNLQUdFKS5wb3QKLWFsbC1ubzoKLQotJChzcmNkaXIpLyQoUEFDS0FHRSkucG90OiAkKFBPVEZJTEVTKQotCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChQQUNLQUdFKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKLQkgIC0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyBcCi0JICAtLWZpbGVzLWZyb209JChzcmNkaXIpL1BPVEZJTEVTLmluCi0Jcm0gLWYgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0JbXYgJChQQUNLQUdFKS5wbyAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQotJChzcmNkaXIpL2NhdC1pZC10YmwuYzogc3RhbXAtY2F0LWlkOyBAOgotJChzcmNkaXIpL3N0YW1wLWNhdC1pZDogJChQQUNLQUdFKS5wb3QKLQlybSAtZiBjYXQtaWQtdGJsLnRtcAotCXNlZCAtZiAuLi9pbnRsL3BvMnRibC5zZWQgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IFwKLQkJfCBzZWQgLWUgInMvQFBBQ0tBR0UgTkFNRUAvJChQQUNLQUdFKS8iID4gY2F0LWlkLXRibC50bXAKLQlpZiBjbXAgLXMgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgdGhlbiBcCi0JICBybSBjYXQtaWQtdGJsLnRtcDsgXAotCWVsc2UgXAotCSAgZWNobyBjYXQtaWQtdGJsLmMgY2hhbmdlZDsgXAotCSAgcm0gLWYgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCSAgbXYgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCWZpCi0JY2QgJChzcmNkaXIpICYmIHJtIC1mIHN0YW1wLWNhdC1pZCAmJiBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWNhdC1pZAotCi0KLWluc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKLWluc3RhbGwtZXhlYzoKLWluc3RhbGwtaW5mbzoKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAotaW5zdGFsbC1kYXRhLW5vOiBhbGwKLWluc3RhbGwtZGF0YS15ZXM6IGFsbAotCWlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAkKE1LSU5TVEFMTERJUlMpICQoZGF0YWRpcik7IFwKLQllbHNlIFwKLQkgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGRhdGFkaXIpOyBcCi0JZmkKLQlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGNhc2UgIiQkY2F0IiBpbiBcCi0JICAgICouZ21vKSBkZXN0ZGlyPSQoZ251bG9jYWxlZGlyKTs7IFwKLQkgICAgKikgICAgIGRlc3RkaXI9JChsb2NhbGVkaXIpOzsgXAotCSAgZXNhYzsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBkaXI9JCRkZXN0ZGlyLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkJGRpcjsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkJGRpcjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQ7IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdCBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGVsc2UgXAotCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdC5tOyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0Lm0gJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0Lm0gYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgIGVsc2UgXAotCSAgICBpZiB0ZXN0IC1yICQoc3JjZGlyKS8kJGNhdC5tIDsgdGhlbiBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdC5tIFwKLQkJJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAgICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWRvbmUKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTWFrZWZpbGUuaW4uaW4gXAotCQkJICAkKGdldHRleHRzcmNkaXIpL01ha2VmaWxlLmluLmluOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0KLSMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KLWluc3RhbGxjaGVjazoKLQotdW5pbnN0YWxsOgotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JZG9uZQotCXJtIC1mICQoZ2V0dGV4dHNyY2RpcikvcG8tTWFrZWZpbGUuaW4uaW4KLQotY2hlY2s6IGFsbAotCi1jYXQtaWQtdGJsLm86IC4uL2ludGwvbGliZ2V0dGV4dC5oCi0KLWR2aSBpbmZvIHRhZ3MgVEFHUyBJRDoKLQotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgY29yZSBjb3JlLiogKi5wb3ggJChQQUNLQUdFKS5wbyAqLm9sZC5wbyBjYXQtaWQtdGJsLnRtcAotCXJtIC1mciAqLm8KLQotY2xlYW46IG1vc3RseWNsZWFuCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBNYWtlZmlsZS5pbiBQT1RGSUxFUyAqLm1vICoubXNnICouY2F0ICouY2F0Lm0KLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0Jcm0gLWYgJChHTU9GSUxFUykKLQotZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLWRpc3QgZGlzdGRpcjogdXBkYXRlLXBvICQoRElTVEZJTEVTKQotCWRpc3RzPSIkKERJU1RGSUxFUykiOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAotCWRvbmUKLQotdXBkYXRlLXBvOiBNYWtlZmlsZQotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQlQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IFwKLQljZCAkKHNyY2Rpcik7IFwKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBtdiAkJGxhbmcucG8gJCRsYW5nLm9sZC5wbzsgXAotCSAgZWNobyAiJCRsYW5nOiI7IFwKLQkgIGlmICQoTVNHTUVSR0UpICQkbGFuZy5vbGQucG8gJChQQUNLQUdFKS5wb3QgLW8gJCRsYW5nLnBvOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRsYW5nLm9sZC5wbzsgXAotCSAgZWxzZSBcCi0JICAgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGNhdCBmYWlsZWQhIjsgXAotCSAgICBybSAtZiAkJGxhbmcucG87IFwKLQkgICAgbXYgJCRsYW5nLm9sZC5wbyAkJGxhbmcucG87IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1QT1RGSUxFUzogUE9URklMRVMuaW4KLQkoIGlmIHRlc3QgJ3gkKHNyY2RpciknICE9ICd4Lic7IHRoZW4gXAotCSAgICBwb3NyY3ByZWZpeD0nJCh0b3Bfc3JjZGlyKS8nOyBcCi0JICBlbHNlIFwKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyI7IFwKLQkgIGZpOyBcCi0JICBybSAtZiAkQC10ICRAIFwKLQkgICAgJiYgKHNlZCAtZSAnL14jL2QnIC1lICcvXlsgCV0qJCQvZCcgXAotCQkgICAgLWUgInNALipACSQkcG9zcmNwcmVmaXgmIFxcXFxAIiA8ICQoc3JjZGlyKS8kQC5pbiBcCi0JCXwgc2VkIC1lICckJHMvXFwkJC8vJykgPiAkQC10IFwKLQkgICAgJiYgY2htb2QgYS13ICRALXQgXAotCSAgICAmJiBtdiAkQC10ICRAICkKLQotUE9URklMRVMuaW46IEBNQUlOVEAgLi4vTWFrZWZpbGUKLQljZCAuLiAmJiAkKE1BS0UpIHBvL1BPVEZJTEVTLmluCi0KLU1ha2VmaWxlOiBNYWtlLWluIC4uL2NvbmZpZy5zdGF0dXMgUE9URklMRVMKLQljZCAuLiBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpL01ha2VmaWxlLmluOiQoc3ViZGlyKS9NYWtlLWluIFwKLQkgICAgIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvZ3Byb2YvcG8vUE9URklMRVMuaW4gYi9ncHJvZi9wby9QT1RGSUxFUy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZkODY0MS4uMDAwMDAwMAotLS0gYS9ncHJvZi9wby9QT1RGSUxFUy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLWFscGhhLmMKLWJhc2ljX2Jsb2Nrcy5jCi1iYXNpY19ibG9ja3MuaAotYmJfZXhpdF9mdW5jLmMKLWNhbGxfZ3JhcGguYwotY2FsbF9ncmFwaC5oCi1jZ19hcmNzLmMKLWNnX2FyY3MuaAotY2dfZGZuLmMKLWNnX2Rmbi5oCi1jZ19wcmludC5jCi1jZ19wcmludC5oCi1jb3JlZmlsZS5jCi1jb3JlZmlsZS5oCi1nbW9uLmgKLWdtb25faW8uYwotZ21vbl9pby5oCi1nbW9uX291dC5oCi1ncHJvZi5jCi1ncHJvZi5oCi1oZXJ0ei5jCi1oZXJ0ei5oCi1oaXN0LmMKLWhpc3QuaAotaTM4Ni5jCi1zZWFyY2hfbGlzdC5jCi1zZWFyY2hfbGlzdC5oCi1zb3VyY2UuYwotc291cmNlLmgKLXNwYXJjLmMKLXN5bV9pZHMuYwotc3ltX2lkcy5oCi1zeW10YWIuYwotc3ltdGFiLmgKLXRhaG9lLmMKLXV0aWxzLmMKLXV0aWxzLmgKLXZheC5jCmRpZmYgLS1naXQgYS9ncHJvZi9wby9ncHJvZi5wb3QgYi9ncHJvZi9wby9ncHJvZi5wb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YmY3ODcuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvcG8vZ3Byb2YucG90CisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLSMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KLSMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgotIwotIywgZnV6enkKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAxOTk4LTA2LTEyIDE5OjMzLTA0MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKLSJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgotCi0jOiBhbHBoYS5jOjg5Ci1tc2dpZCAiPGluZGlyZWN0IGNoaWxkPiIKLW1zZ3N0ciAiIgotCi0jOiBhbHBoYS5jOjEwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJbZmluZF9jYWxsXSAlczogMHglbHggdG8gMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBhbHBoYS5jOjEyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJbZmluZF9jYWxsXSAweCVseDoganNyJXMgPGluZGlyZWN0X2NoaWxkPlxuIgotbXNnc3RyICIiCi0KLSM6IGFscGhhLmM6MTM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIltmaW5kX2NhbGxdIDB4JWx4OiBic3IiCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6MTM0IGNhbGxfZ3JhcGguYzo3MCBoaXN0LmM6MTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogdW5leHBlY3RlZCBlbmQgb2YgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjIxNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogaWdub3JpbmcgYmFzaWMtYmxvY2sgZXhlYyBjb3VudHMgKHVzZSAtbCBvciAtLWxpbmUpXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6MzIyIGJhc2ljX2Jsb2Nrcy5jOjMzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogKCVzOjB4JWx4KSAlZCBleGVjdXRpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6MzIzIGJhc2ljX2Jsb2Nrcy5jOjMzMQotbXNnaWQgIjx1bmtub3duPiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo1ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlRvcCAlZCBMaW5lczpcbiIKLSJcbiIKLSIgICAgIExpbmUgICAgICBDb3VudFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjYwOAotbXNnaWQgIiIKLSJcbiIKLSJFeGVjdXRpb24gU3VtbWFyeTpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo2MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTlsZCAgIEV4ZWN1dGFibGUgbGluZXMgaW4gdGhpcyBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6NjExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiU5bGQgICBMaW5lcyBleGVjdXRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjYxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlOS4yZiAgIFBlcmNlbnQgb2YgdGhlIGZpbGUgZXhlY3V0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo2MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiU5ZCAgIFRvdGFsIG51bWJlciBvZiBsaW5lIGV4ZWN1dGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo2MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTkuMmYgICBBdmVyYWdlIGV4ZWN1dGlvbnMgcGVyIGxpbmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjYWxsX2dyYXBoLmM6NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiW2NnX3RhbGx5XSBhcmMgZnJvbSAlcyB0byAlcyB0cmF2ZXJzZWQgJWQgdGltZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjM5Ci1tc2dpZCAiIgotIlx0XHQgICAgIENhbGwgZ3JhcGggKGV4cGxhbmF0aW9uIGZvbGxvd3MpXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo0MwotbXNnaWQgIiIKLSJcdFx0XHRDYWxsIGdyYXBoXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo0NiBoaXN0LmM6MzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJncmFudWxhcml0eTogZWFjaCBzYW1wbGUgaGl0IGNvdmVycyAlbGQgYnl0ZShzKSIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjUwCi1tc2dpZCAiIgotIiBmb3IgJS4yZiUlIG9mICUuMmYgc2Vjb25kc1xuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NTUKLW1zZ2lkICIiCi0iIG5vIHRpbWUgcHJvcGFnYXRlZFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjQgY2dfcHJpbnQuYzo2NyBjZ19wcmludC5jOjY5Ci1tc2dpZCAiY2FsbGVkIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjQgY2dfcHJpbnQuYzo2OQotbXNnaWQgInRvdGFsIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjQKLW1zZ2lkICJwYXJlbnRzIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjYgY2dfcHJpbnQuYzo2NwotbXNnaWQgImluZGV4IgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjYKLW1zZ2lkICIldGltZSIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjY2IGNnX3ByaW50LmM6NjcKLW1zZ2lkICJzZWxmIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjYKLW1zZ2lkICJkZXNjZW5kZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjY3IGhpc3QuYzo0MDUKLW1zZ2lkICJuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjkKLW1zZ2lkICJjaGlsZHJlbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjc0Ci1tc2dpZCAiaW5kZXggJSUgdGltZSAgICBzZWxmICBjaGlsZHJlbiAgICBjYWxsZWQgICAgIG5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjEwMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgPGN5Y2xlICVkIGFzIGEgd2hvbGU+IFslZF1cbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjM1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlNi42cyAlNS41cyAlNy43cyAlMTEuMTFzICU3LjdzICU3LjdzICAgICA8c3BvbnRhbmVvdXM+XG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzozNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTYuNnMgJTUuNXMgJTcuN3MgJTcuN3MgJTcuN3MgJTcuN3MgICAgIDxzcG9udGFuZW91cz5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjU4NwotbXNnaWQgIiIKLSJJbmRleCBieSBmdW5jdGlvbiBuYW1lXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NDQgY2dfcHJpbnQuYzo2NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPGN5Y2xlICVkPiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb3VsZCBub3Qgb3BlbiAlcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjUzIGNvcmVmaWxlLmM6ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuYWJsZSB0byBwYXJzZSBtYXBwaW5nIGZpbGUgJXMuXG4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzoxMjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBub3QgaW4gYS5vdXQgZm9ybWF0XG4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzoxMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbid0IGZpbmQgLnRleHQgc2VjdGlvbiBpbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvcmVmaWxlLmM6MTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiByYW4gb3V0IHJvb20gZm9yICVsZCBieXRlcyBvZiB0ZXh0IHNwYWNlXG4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzoyMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbid0IGRvIC1jXG4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzoyNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IC1jIG5vdCBzdXBwb3J0ZWQgb24gYXJjaGl0ZWN0dXJlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzo0MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgYCVzJyBoYXMgbm8gc3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvcmVmaWxlLmM6NzI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzb21lYm9keSBtaXNjb3VudGVkOiBsdGFiLmxlbj0lZCBpbnN0ZWFkIG9mICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzozMyBnbW9uX2lvLmM6NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGJmZF92bWEgaGFzIHVuZXhwZWN0ZWQgc2l6ZSBvZiAlbGQgYnl0ZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBnbW9uX2lvLmM6ODcgZ21vbl9pby5jOjE3OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZmlsZSB0b28gc2hvcnQgdG8gYmUgYSBnbW9uIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBnbW9uX2lvLmM6OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgYCVzJyBoYXMgYmFkIG1hZ2ljIGNvb2tpZVxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzoxMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgYCVzJyBoYXMgdW5zdXBwb3J0ZWQgdmVyc2lvbiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzoxMzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBmb3VuZCBiYWQgdGFnICVkIChmaWxlIGNvcnJ1cHRlZD8pXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjE5NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcHJvZmlsaW5nIHJhdGUgaW5jb21wYXRpYmxlIHdpdGggZmlyc3QgZ21vbiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjIwNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW5jb21wYXRpYmxlIHdpdGggZmlyc3QgZ21vbiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjI0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5leHBlY3RlZCBFT0YgYWZ0ZXIgcmVhZGluZyAlZC8lZCBiaW5zXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjI4MAotbXNnaWQgInRpbWUgaXMgaW4gdGlja3MsIG5vdCBzZWNvbmRzXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjI4NiBnbW9uX2lvLmM6NDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkb24ndCBrbm93IGhvdyB0byBkZWFsIHdpdGggZmlsZSBmb3JtYXQgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBnbW9uX2lvLmM6MjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkZpbGUgYCVzJyAodmVyc2lvbiAlZCkgY29udGFpbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjI5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJcdCVkIGhpc3RvZ3JhbSByZWNvcmQlc1xuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzoyOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXHQlZCBjYWxsLWdyYXBoIHJlY29yZCVzXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjI5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJcdCVkIGJhc2ljLWJsb2NrIGNvdW50IHJlY29yZCVzXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzo1OQotbXNnaWQgIiIKLSJAKCMpIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuXG4iCi0iIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzoxNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLVthYmNEaGlsTHNUdnd4eXpdXSBbLVtBQ2VFZkZKbk5PcFBxUVpdW25hbWVdXSBbLUkgZGlyc11cbiIKLSJcdFstZFtudW1dXSBbLWsgZnJvbS90b10gWy1tIG1pbi1jb3VudF0gWy10IHRhYmxlLWxlbmd0aF1cbiIKLSJcdFstLVtuby1dYW5ub3RhdGVkLXNvdXJjZVs9bmFtZV1dIFstLVtuby1dZXhlYy1jb3VudHNbPW5hbWVdXVxuIgotIlx0Wy0tW25vLV1mbGF0LXByb2ZpbGVbPW5hbWVdXSBbLS1bbm8tXWdyYXBoWz1uYW1lXV1cbiIKLSJcdFstLVtuby1ddGltZT1uYW1lXSBbLS1hbGwtbGluZXNdIFstLWJyaWVmXSBbLS1kZWJ1Z1s9bGV2ZWxdXVxuIgotIlx0Wy0tZnVuY3Rpb24tb3JkZXJpbmddIFstLWZpbGUtb3JkZXJpbmddXG4iCi0iXHRbLS1kaXJlY3RvcnktcGF0aD1kaXJzXSBbLS1kaXNwbGF5LXVudXNlZC1mdW5jdGlvbnNdXG4iCi0iXHRbLS1maWxlLWZvcm1hdD1uYW1lXSBbLS1maWxlLWluZm9dIFstLWhlbHBdIFstLWxpbmVdIFstLW1pbi1jb3VudD1uXVxuIgotIlx0Wy0tbm8tc3RhdGljXSBbLS1wcmludC1wYXRoXSBbLS1zZXBhcmF0ZS1maWxlc11cbiIKLSJcdFstLXN0YXRpYy1jYWxsLWdyYXBoXSBbLS1zdW1dIFstLXRhYmxlLWxlbmd0aD1sZW5dIFstLXRyYWRpdGlvbmFsXVxuIgotIlx0Wy0tdmVyc2lvbl0gWy0td2lkdGg9bl0gWy0taWdub3JlLW5vbi1mdW5jdGlvbnNdXG4iCi0iXHRbLS1kZW1hbmdsZV0gWy0tbm8tZGVtYW5nbGVdXG4iCi0iXHRbaW1hZ2UtZmlsZV0gW3Byb2ZpbGUtZmlsZS4uLl1cbiIKLW1zZ3N0ciAiIgotCi0jOiBncHJvZi5jOjE2MAotbXNnaWQgIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6MjI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkZWJ1Z2dpbmcgbm90IHN1cHBvcnRlZDsgLWQgaWdub3JlZFxuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6MzA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmtub3duIGZpbGUgZm9ybWF0ICVzXG4iCi1tc2dzdHIgIiIKLQotIy4gVGhpcyBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBHTlUgc3RhbmRhcmRzIGRvY3VtZW50LgotIzogZ3Byb2YuYzozOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR05VIGdwcm9mICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzozOTEKLW1zZ2lkICIiCi0iQmFzZWQgb24gQlNEIGdwcm9mLCBjb3B5cmlnaHQgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzozOTIKLW1zZ2lkICIiCi0iVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmUuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzo0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBPbmx5IG9uZSBvZiAtLWZ1bmN0aW9uLW9yZGVyaW5nIGFuZCAtLWZpbGUtb3JkZXJpbmcgbWF5IGJlIHNwZWNpZmllZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBncHJvZi5jOjUzOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc29ycnksIGZpbGUgZm9ybWF0IGBwcm9mJyBpcyBub3QgeWV0IHN1cHBvcnRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6NTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBnbW9uLm91dCBmaWxlIGlzIG1pc3NpbmcgaGlzdG9ncmFtXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzo2MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGdtb24ub3V0IGZpbGUgaXMgbWlzc2luZyBjYWxsLWdyYXBoIGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6MTQyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBgJXMnIGlzIGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzoxNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiB1bmV4cGVjdGVkIEVPRiBhZnRlciByZWFkaW5nICVkIG9mICVkIHNhbXBsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6Mzc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVjJWMvY2FsbCIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6Mzg1Ci1tc2dpZCAiIgotIiBmb3IgJS4yZiUlIG9mICUuMmYgJXNcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6MzkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJFYWNoIHNhbXBsZSBjb3VudHMgYXMgJWcgJXMuXG4iCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjM5NgotbXNnaWQgIiIKLSIgbm8gdGltZSBhY2N1bXVsYXRlZFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzo0MDIKLW1zZ2lkICJjdW11bGF0aXZlIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzo0MDIKLW1zZ2lkICJzZWxmICAiCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjQwMgotbXNnaWQgInRvdGFsICIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6NDA0Ci1tc2dpZCAidGltZSIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6NDA0Ci1tc2dpZCAiY2FsbHMiCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjUxNQotbXNnaWQgIiIKLSJcbiIKLSJcbiIKLSJcbiIKLSJmbGF0IHByb2ZpbGU6XG4iCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjUyMQotbXNnaWQgIkZsYXQgcHJvZmlsZTpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzb3VyY2UuYzoxNDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNvdWxkIG5vdCBsb2NhdGUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNvdXJjZS5jOjIwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIqKiogRmlsZSAlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiB1dGlscy5jOjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiA8Y3ljbGUgJWQ+IgotbXNnc3RyICIiCmRpZmYgLS1naXQgYS9ncHJvZi9zZWFyY2hfbGlzdC5jIGIvZ3Byb2Yvc2VhcmNoX2xpc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ3NWRiZi4uMDAwMDAwMAotLS0gYS9ncHJvZi9zZWFyY2hfbGlzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAic2VhcmNoX2xpc3QuaCIKLQotCi12b2lkCi1ERUZVTiAoc2VhcmNoX2xpc3RfYXBwZW5kLCAobGlzdCwgcGF0aHMpLAotICAgICAgIFNlYXJjaF9MaXN0ICogbGlzdCBBTkQgY29uc3QgY2hhciAqcGF0aHMpCi17Ci0gIFNlYXJjaF9MaXN0X0VsZW0gKm5ld19lbDsKLSAgY29uc3QgY2hhciAqYmVnLCAqY29sb247Ci0gIGludCBsZW47Ci0KLSAgY29sb24gPSBwYXRocyAtIDE7Ci0gIGRvCi0gICAgewotICAgICAgYmVnID0gY29sb24gKyAxOwotICAgICAgY29sb24gPSBzdHJjaHIgKGJlZywgJzonKTsKLSAgICAgIGlmIChjb2xvbikKLQl7Ci0JICBsZW4gPSBjb2xvbiAtIGJlZzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbGVuID0gc3RybGVuIChiZWcpOwotCX0KLSAgICAgIG5ld19lbCA9IChTZWFyY2hfTGlzdF9FbGVtICopIHhtYWxsb2MgKHNpemVvZiAoKm5ld19lbCkgKyBsZW4pOwotICAgICAgbWVtY3B5IChuZXdfZWwtPnBhdGgsIGJlZywgbGVuKTsKLSAgICAgIG5ld19lbC0+cGF0aFtsZW5dID0gJ1wwJzsKLQotICAgICAgLyogYXBwZW5kIG5ldyBwYXRoIGF0IGVuZCBvZiBsaXN0OiAqLwotICAgICAgbmV3X2VsLT5uZXh0ID0gMDsKLSAgICAgIGlmIChsaXN0LT50YWlsKQotCXsKLQkgIGxpc3QtPnRhaWwtPm5leHQgPSBuZXdfZWw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxpc3QtPmhlYWQgPSBuZXdfZWw7Ci0JfQotICAgICAgbGlzdC0+dGFpbCA9IG5ld19lbDsKLSAgICB9Ci0gIHdoaWxlIChjb2xvbik7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9zZWFyY2hfbGlzdC5oIGIvZ3Byb2Yvc2VhcmNoX2xpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkZmUzNS4uMDAwMDAwMAotLS0gYS9ncHJvZi9zZWFyY2hfbGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI2lmbmRlZiBzZWFyY2hfbGlzdF9oCi0jZGVmaW5lIHNlYXJjaF9saXN0X2gKLQotdHlwZWRlZiBzdHJ1Y3Qgc2VhcmNoX2xpc3RfZWxlbQotICB7Ci0gICAgc3RydWN0IHNlYXJjaF9saXN0X2VsZW0gKm5leHQ7Ci0gICAgY2hhciBwYXRoWzFdOwotICB9Ci1TZWFyY2hfTGlzdF9FbGVtOwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgc3RydWN0IHNlYXJjaF9saXN0X2VsZW0gKmhlYWQ7Ci0gICAgc3RydWN0IHNlYXJjaF9saXN0X2VsZW0gKnRhaWw7Ci0gIH0KLVNlYXJjaF9MaXN0OwotCi1leHRlcm4gdm9pZCBzZWFyY2hfbGlzdF9hcHBlbmQgUEFSQU1TICgoU2VhcmNoX0xpc3QgKiBsaXN0LCBjb25zdCBjaGFyICpwYXRocykpOwotCi0jZW5kaWYgLyogc2VhcmNoX2xpc3RfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2Yvc291cmNlLmMgYi9ncHJvZi9zb3VyY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwMWEwNC4uMDAwMDAwMAotLS0gYS9ncHJvZi9zb3VyY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotICogS2VlcHMgdHJhY2sgb2Ygc291cmNlIGZpbGVzLgotICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJzZWFyY2hfbGlzdC5oIgotI2luY2x1ZGUgInNvdXJjZS5oIgotCi0jZGVmaW5lIEVYVF9BTk5PICItYW5uIgkJLyogcG9zdGZpeCBvZiBhbm5vdGF0ZWQgZmlsZXMgKi8KLQotLyoKLSAqIERlZmF1bHQgb3B0aW9uIHZhbHVlczoKLSAqLwotYm9vbCBjcmVhdGVfYW5ub3RhdGlvbl9maWxlcyA9IEZBTFNFOwotCi1TZWFyY2hfTGlzdCBzcmNfc2VhcmNoX2xpc3QgPQotezAsIDB9OwotU291cmNlX0ZpbGUgKmZpcnN0X3NyY19maWxlID0gMDsKLQotCi1Tb3VyY2VfRmlsZSAqCi1ERUZVTiAoc291cmNlX2ZpbGVfbG9va3VwX3BhdGgsIChwYXRoKSwgY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgU291cmNlX0ZpbGUgKnNmOwotCi0gIGZvciAoc2YgPSBmaXJzdF9zcmNfZmlsZTsgc2Y7IHNmID0gc2YtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocGF0aCwgc2YtPm5hbWUpID09IDApCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgaWYgKCFzZikKLSAgICB7Ci0gICAgICAvKiBjcmVhdGUgYSBuZXcgc291cmNlIGZpbGUgZGVzY3JpcHRvcjogKi8KLQotICAgICAgc2YgPSAoU291cmNlX0ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mICgqc2YpKTsKLSAgICAgIG1lbXNldCAoc2YsIDAsIHNpemVvZiAoKnNmKSk7Ci0gICAgICBzZi0+bmFtZSA9IHhzdHJkdXAgKHBhdGgpOwotICAgICAgc2YtPm5leHQgPSBmaXJzdF9zcmNfZmlsZTsKLSAgICAgIGZpcnN0X3NyY19maWxlID0gc2Y7Ci0gICAgfQotICByZXR1cm4gc2Y7Ci19Ci0KLQotU291cmNlX0ZpbGUgKgotREVGVU4gKHNvdXJjZV9maWxlX2xvb2t1cF9uYW1lLCAoZmlsZW5hbWUpLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgY29uc3QgY2hhciAqZm5hbWU7Ci0gIFNvdXJjZV9GaWxlICpzZjsKLSAgLyoKLSAgICogVGhlIHVzZXIgY2Fubm90IGtub3cgZXhhY3RseSBob3cgYSBmaWxlbmFtZSB3aWxsIGJlIHN0b3JlZCBpbgotICAgKiB0aGUgZGVidWdnaW5nIGluZm8gKGUuZy4sIC4uL2luY2x1ZGUvZm9vLmgKLSAgICogdnMuIC91c3IvaW5jbHVkZS9mb28uaCkuICBTbyB3ZSBzaW1wbHkgY29tcGFyZSB0aGUgZmlsZW5hbWUKLSAgICogY29tcG9uZW50IG9mIGEgcGF0aCBvbmx5OgotICAgKi8KLSAgZm9yIChzZiA9IGZpcnN0X3NyY19maWxlOyBzZjsgc2YgPSBzZi0+bmV4dCkKLSAgICB7Ci0gICAgICBmbmFtZSA9IHN0cnJjaHIgKHNmLT5uYW1lLCAnLycpOwotICAgICAgaWYgKGZuYW1lKQotCXsKLQkgICsrZm5hbWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZuYW1lID0gc2YtPm5hbWU7Ci0JfQotICAgICAgaWYgKHN0cmNtcCAoZmlsZW5hbWUsIGZuYW1lKSA9PSAwKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBzZjsKLX0KLQotCi1GSUxFICoKLURFRlVOIChhbm5vdGF0ZV9zb3VyY2UsIChzZiwgbWF4X3dpZHRoLCBhbm5vdGUsIGFyZyksCi0gICAgICAgU291cmNlX0ZpbGUgKiBzZiBBTkQgaW50IG1heF93aWR0aAotICAgICAgIEFORCB2b2lkICgqYW5ub3RlKSBQQVJBTVMgKChjaGFyICpidWYsIGludCB3LCBpbnQgbCwgdm9pZCAqYXJnKSkKLSAgICAgICBBTkQgdm9pZCAqYXJnKQotewotICBzdGF0aWMgYm9vbCBmaXJzdF9maWxlID0gVFJVRTsKLSAgaW50IGksIGxpbmVfbnVtLCBucmVhZDsKLSAgYm9vbCBuZXdfbGluZTsKLSAgY2hhciBidWZbODE5Ml07Ci0gIGNoYXIgZm5hbWVbUEFUSF9NQVhdOwotICBjaGFyICphbm5vdGF0aW9uLCAqbmFtZV9vbmx5OwotICBGSUxFICppZnAsICpvZnA7Ci0gIFNlYXJjaF9MaXN0X0VsZW0gKnNsZSA9IHNyY19zZWFyY2hfbGlzdC5oZWFkOwotCi0gIC8qCi0gICAqIE9wZW4gaW5wdXQgZmlsZS4gIElmIG9wZW4gZmFpbHMsIHdhbGsgYWxvbmcgc2VhcmNoLWxpc3QgdW50aWwKLSAgICogb3BlbiBzdWNjZWVkcyBvciByZWFjaGluZyBlbmQgb2YgbGlzdDoKLSAgICovCi0gIHN0cmNweSAoZm5hbWUsIHNmLT5uYW1lKTsKLSAgaWYgKHNmLT5uYW1lWzBdID09ICcvJykKLSAgICB7Ci0gICAgICBzbGUgPSAwOwkJCS8qIGRvbid0IHVzZSBzZWFyY2ggbGlzdCBmb3IgYWJzb2x1dGUgcGF0aHMgKi8KLSAgICB9Ci0gIG5hbWVfb25seSA9IDA7Ci0gIHdoaWxlIChUUlVFKQotICAgIHsKLSAgICAgIERCRyAoU1JDREVCVUcsIHByaW50ZiAoIlthbm5vdGF0ZV9zb3VyY2VdOiBsb29raW5nIGZvciAlcywgdHJ5aW5nICVzXG4iLAotCQkJICAgICBzZi0+bmFtZSwgZm5hbWUpKTsKLSAgICAgIGlmcCA9IGZvcGVuIChmbmFtZSwgRk9QRU5fUkIpOwotICAgICAgaWYgKGlmcCkKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoIXNsZSAmJiAhbmFtZV9vbmx5KQotCXsKLQkgIG5hbWVfb25seSA9IHN0cnJjaHIgKHNmLT5uYW1lLCAnLycpOwotCSAgaWYgKG5hbWVfb25seSkKLQkgICAgewotCSAgICAgIC8qIHRyeSBzZWFyY2gtbGlzdCBhZ2FpbiwgYnV0IHRoaXMgdGltZSB3aXRoIG5hbWUgb25seTogKi8KLQkgICAgICArK25hbWVfb25seTsKLQkgICAgICBzbGUgPSBzcmNfc2VhcmNoX2xpc3QuaGVhZDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzbGUpCi0JewotCSAgc3RyY3B5IChmbmFtZSwgc2xlLT5wYXRoKTsKLQkgIHN0cmNhdCAoZm5hbWUsICIvIik7Ci0JICBpZiAobmFtZV9vbmx5KQotCSAgICB7Ci0JICAgICAgc3RyY2F0IChmbmFtZSwgbmFtZV9vbmx5KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RyY2F0IChmbmFtZSwgc2YtPm5hbWUpOwotCSAgICB9Ci0JICBzbGUgPSBzbGUtPm5leHQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChlcnJubyA9PSBFTk9FTlQpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBjb3VsZCBub3QgbG9jYXRlIGAlcydcbiIpLAotCQkgICAgICAgd2hvYW1pLCBzZi0+bmFtZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHBlcnJvciAoc2YtPm5hbWUpOwotCSAgICB9Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIG9mcCA9IHN0ZG91dDsKLSAgaWYgKGNyZWF0ZV9hbm5vdGF0aW9uX2ZpbGVzKQotICAgIHsKLSAgICAgIC8qIHRyeSB0byBjcmVhdGUgYW5ub3RhdGVkIHNvdXJjZSBmaWxlOiAqLwotICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0KLSAgICAgIC8qIGNyZWF0ZSBhbm5vdGF0aW9uIGZpbGVzIGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAqLwotICAgICAgZmlsZW5hbWUgPSBzdHJyY2hyIChzZi0+bmFtZSwgJy8nKTsKLSAgICAgIGlmIChmaWxlbmFtZSkKLQl7Ci0JICArK2ZpbGVuYW1lOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmaWxlbmFtZSA9IHNmLT5uYW1lOwotCX0KLQotICAgICAgc3RyY3B5IChmbmFtZSwgZmlsZW5hbWUpOwotICAgICAgc3RyY2F0IChmbmFtZSwgRVhUX0FOTk8pOwotICAgICAgb2ZwID0gZm9wZW4gKGZuYW1lLCAidyIpOwotICAgICAgaWYgKCFvZnApCi0JewotCSAgcGVycm9yIChmbmFtZSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAqIFByaW50IGZpbGUgbmFtZXMgaWYgb3V0cHV0IGdvZXMgdG8gc3Rkb3V0IGFuZCB0aGVyZSBhcmUKLSAgICogbW9yZSB0aGFuIG9uZSBzb3VyY2UgZmlsZToKLSAgICovCi0gIGlmIChvZnAgPT0gc3Rkb3V0KQotICAgIHsKLSAgICAgIGlmIChmaXJzdF9maWxlKQotCXsKLQkgIGZpcnN0X2ZpbGUgPSBGQUxTRTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnB1dGMgKCdcbicsIG9mcCk7Ci0JfQotICAgICAgaWYgKGZpcnN0X291dHB1dCkKLQl7Ci0JICBmaXJzdF9vdXRwdXQgPSBGQUxTRTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnByaW50ZiAob2ZwLCAiXGZcbiIpOwotCX0KLSAgICAgIGZwcmludGYgKG9mcCwgXygiKioqIEZpbGUgJXM6XG4iKSwgc2YtPm5hbWUpOwotICAgIH0KLQotICBhbm5vdGF0aW9uID0geG1hbGxvYyAobWF4X3dpZHRoICsgMSk7Ci0gIGxpbmVfbnVtID0gMTsKLSAgbmV3X2xpbmUgPSBUUlVFOwotICB3aGlsZSAoKG5yZWFkID0gZnJlYWQgKGJ1ZiwgMSwgc2l6ZW9mIChidWYpLCBpZnApKSA+IDApCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IG5yZWFkOyArK2kpCi0JewotCSAgaWYgKG5ld19saW5lKQotCSAgICB7Ci0JICAgICAgKCphbm5vdGUpIChhbm5vdGF0aW9uLCBtYXhfd2lkdGgsIGxpbmVfbnVtLCBhcmcpOwotCSAgICAgIGZwdXRzIChhbm5vdGF0aW9uLCBvZnApOwotCSAgICAgICsrbGluZV9udW07Ci0JICAgICAgbmV3X2xpbmUgPSBGQUxTRTsKLQkgICAgfQotCSAgbmV3X2xpbmUgPSAoYnVmW2ldID09ICdcbicpOwotCSAgZnB1dGMgKGJ1ZltpXSwgb2ZwKTsKLQl9Ci0gICAgfQotICBmcmVlIChhbm5vdGF0aW9uKTsKLSAgcmV0dXJuIG9mcDsKLX0KZGlmZiAtLWdpdCBhL2dwcm9mL3NvdXJjZS5oIGIvZ3Byb2Yvc291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzM2JhZDMuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jaWZuZGVmIHNvdXJjZV9oCi0jZGVmaW5lIHNvdXJjZV9oCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAic2VhcmNoX2xpc3QuaCIKLQotdHlwZWRlZiBzdHJ1Y3Qgc291cmNlX2ZpbGUKLSAgewotICAgIHN0cnVjdCBzb3VyY2VfZmlsZSAqbmV4dDsKLSAgICBjb25zdCBjaGFyICpuYW1lOwkJLyogbmFtZSBvZiBzb3VyY2UgZmlsZSAqLwotICAgIHVuc2lnbmVkIGxvbmcgbmNhbGxzOwkvKiAjIG9mICJjYWxscyIgdG8gdGhpcyBmaWxlICovCi0gICAgaW50IG51bV9saW5lczsJCS8qICMgb2YgbGluZXMgaW4gZmlsZSAqLwotICAgIGludCBuYWxsb2NlZDsJCS8qIG51bWJlciBvZiBsaW5lcyBhbGxvY2F0ZWQgKi8KLSAgICB2b2lkICoqbGluZTsJCS8qIHVzYWdlLWRlcGVuZGVudCBwZXItbGluZSBkYXRhICovCi0gIH0KLVNvdXJjZV9GaWxlOwotCi0vKgotICogT3B0aW9uczoKLSAqLwotZXh0ZXJuIGJvb2wgY3JlYXRlX2Fubm90YXRpb25fZmlsZXM7CS8qIGNyZWF0ZSBhbm5vdGF0ZWQgb3V0cHV0IGZpbGVzPyAqLwotCi0vKgotICogTGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIHNvdXJjZSBmaWxlczoKLSAqLwotZXh0ZXJuIFNlYXJjaF9MaXN0IHNyY19zZWFyY2hfbGlzdDsKLQotLyoKLSAqIENoYWluIG9mIHNvdXJjZS1maWxlIGRlc2NyaXB0b3JzOgotICovCi1leHRlcm4gU291cmNlX0ZpbGUgKmZpcnN0X3NyY19maWxlOwotCi0vKgotICogUmV0dXJucyBwb2ludGVyIHRvIHNvdXJjZSBmaWxlIGRlc2NyaXB0b3IgZm9yIFBBVEgvRklMRU5BTUUuCi0gKi8KLWV4dGVybiBTb3VyY2VfRmlsZSAqc291cmNlX2ZpbGVfbG9va3VwX3BhdGggUEFSQU1TICgoY29uc3QgY2hhciAqcGF0aCkpOwotZXh0ZXJuIFNvdXJjZV9GaWxlICpzb3VyY2VfZmlsZV9sb29rdXBfbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotCi0vKgotICogUmVhZCBzb3VyY2UgZmlsZSBTRiBvdXRwdXQgYW5ub3RhdGVkIHNvdXJjZS4gIFRoZSBhbm5vdGF0aW9uIGlzIGF0Ci0gKiBNQVhfV0lEVEggY2hhcmFjdGVycyB3aWRlIGFuZCBmb3IgZWFjaCBzb3VyY2UtbGluZSBhbiBhbm5vdGF0aW9uIGlzCi0gKiBvYnRhaW5lZCBieSBpbnZva2luZyBmdW5jdGlvbiBBTk5PVEUuICBBUkcgaXMgYW4gYXJndW1lbnQgcGFzc2VkIHRvCi0gKiBBTk5PVEUgdGhhdCBpcyBsZWZ0IHVuaW50ZXJwcmV0ZWQgYnkgYW5ub3RhdGVfc291cmNlKCkuCi0gKgotICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBmaWxlICh3aGljaCBtYXliZSBzdGRvdXQpIHN1Y2gKLSAqIHRoYXQgc3VtbWFyeSBzdGF0aXN0aWNzIGNhbiBiZSBwcmludGVkLiAgSWYgdGhlIHJldHVybmVkIGZpbGUKLSAqIGlzIG5vdCBzdGRvdXQsIGl0IHNob3VsZCBiZSBjbG9zZWQgd2hlbiBkb25lIHdpdGggaXQuCi0gKi8KLWV4dGVybiBGSUxFICphbm5vdGF0ZV9zb3VyY2UgUEFSQU1TICgoU291cmNlX0ZpbGUgKiBzZiwgaW50IG1heF93aWR0aCwKLQkJCQkgICAgICB2b2lkICgqYW5ub3RlKSAoY2hhciAqYiwgaW50IHcsIGludCBsLAotCQkJCQkJICAgICAgdm9pZCAqYXJnKSwKLQkJCQkgICAgICB2b2lkICphcmcpKTsKLQotI2VuZGlmIC8qIHNvdXJjZV9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9zcGFyYy5jIGIvZ3Byb2Yvc3BhcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ3MDJiMS4uMDAwMDAwMAotLS0gYS9ncHJvZi9zcGFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotICAgIC8qCi0gICAgICogICAgICAgIG9wY29kZSBvZiB0aGUgYGNhbGxmJyBpbnN0cnVjdGlvbgotICAgICAqLwotI2RlZmluZQlDQUxMCSgweGMwMDAwMDAwKQotCi12b2lkCi1zcGFyY19maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCi0gICAgIFN5bSAqcGFyZW50OwotICAgICBiZmRfdm1hIHBfbG93cGM7Ci0gICAgIGJmZF92bWEgcF9oaWdocGM7Ci17Ci0gIGJmZF92bWEgZGVzdF9wYywgZGVsdGE7Ci0gIHVuc2lnbmVkIGludCAqaW5zdHI7Ci0gIFN5bSAqY2hpbGQ7Ci0KLSAgZGVsdGEgPSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlIC0gY29yZV90ZXh0X3NlY3QtPnZtYTsKLQotICBpZiAoY29yZV90ZXh0X3NwYWNlID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHBfbG93cGMgPCBzX2xvd3BjKQotICAgIHsKLSAgICAgIHBfbG93cGMgPSBzX2xvd3BjOwotICAgIH0KLSAgaWYgKHBfaGlnaHBjID4gc19oaWdocGMpCi0gICAgewotICAgICAgcF9oaWdocGMgPSBzX2hpZ2hwYzsKLSAgICB9Ci0gIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZF9jYWxsXSAlczogMHglbHggdG8gMHglbHhcbiIsCi0JCQkgIHBhcmVudC0+bmFtZSwgcF9sb3dwYywgcF9oaWdocGMpKTsKLSAgZm9yIChpbnN0ciA9ICh1bnNpZ25lZCBpbnQgKikgKCgocF9sb3dwYyArIGRlbHRhKSArIDMpICZ+IDMpOwotICAgICAgIGluc3RyIDwgKHVuc2lnbmVkIGludCAqKSAocF9oaWdocGMgKyBkZWx0YSk7Ci0gICAgICAgKytpbnN0cikKLSAgICB7Ci0gICAgICBpZiAoKCppbnN0ciAmIENBTEwpKQotCXsKLQkgIERCRyAoQ0FMTERFQlVHLAotCSAgICAgICBwcmludGYgKCJbZmluZF9jYWxsXSAweCVseDogY2FsbGYiLCAoYmZkX3ZtYSkgaW5zdHIgLSBkZWx0YSkpOwotCSAgLyoKLQkgICAqIFJlZ3VsYXIgcGMgcmVsYXRpdmUgYWRkcmVzc2luZyBjaGVjayB0aGF0IHRoaXMgaXMgdGhlCi0JICAgKiBhZGRyZXNzIG9mIGEgZnVuY3Rpb24uCi0JICAgKi8KLQkgIGRlc3RfcGMgPSAoKGJmZF92bWEpIChpbnN0ciArICgqaW5zdHIgJiB+Q0FMTCkpKSAtIGRlbHRhOwotCSAgaWYgKGRlc3RfcGMgPj0gc19sb3dwYyAmJiBkZXN0X3BjIDw9IHNfaGlnaHBjKQotCSAgICB7Ci0JICAgICAgY2hpbGQgPSBzeW1fbG9va3VwICgmc3ltdGFiLCBkZXN0X3BjKTsKLQkgICAgICBEQkcgKENBTExERUJVRywKLQkJICAgcHJpbnRmICgiXHRkZXN0X3BjPTB4JWx4LCAobmFtZT0lcywgYWRkcj0weCVseClcbiIsCi0JCQkgICBkZXN0X3BjLCBjaGlsZC0+bmFtZSwgY2hpbGQtPmFkZHIpKTsKLQkgICAgICBpZiAoY2hpbGQtPmFkZHIgPT0gZGVzdF9wYykKLQkJewotCQkgIC8qIGEgaGl0OiAgKi8KLQkJICBhcmNfYWRkIChwYXJlbnQsIGNoaWxkLCAodW5zaWduZWQgbG9uZykgMCk7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCSAgLyoKLQkgICAqIFNvbWV0aGluZyBmdW5ueSBnb2luZyBvbi4KLQkgICAqLwotCSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIlx0YnV0IGl0J3MgYSBib3RjaFxuIikpOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9zdGFtcC1oLmluIGIvZ3Byb2Yvc3RhbXAtaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4OGY3MC4uMDAwMDAwMAotLS0gYS9ncHJvZi9zdGFtcC1oLmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGltZXN0YW1wCmRpZmYgLS1naXQgYS9ncHJvZi9zeW1faWRzLmMgYi9ncHJvZi9zeW1faWRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhM2NhMjguLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc3ltX2lkcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgInN5bV9pZHMuaCIKLQotc3RydWN0IHN5bV9pZAotICB7Ci0gICAgc3RydWN0IHN5bV9pZCAqbmV4dDsKLSAgICBjaGFyICpzcGVjOwkJCS8qIHBhcnNpbmcgbW9kaWZpZXMgdGhpcyAqLwotICAgIFRhYmxlX0lkIHdoaWNoX3RhYmxlOwotICAgIGJvb2wgaGFzX3JpZ2h0OwotICAgIHN0cnVjdCBtYXRjaAotICAgICAgewotCWludCBwcmV2X2luZGV4OwkJLyogaW5kZXggb2YgcHJldiBtYXRjaCAqLwotCVN5bSAqcHJldl9tYXRjaDsJLyogcHJldmlvdXMgbWF0Y2ggKi8KLQlTeW0gKmZpcnN0X21hdGNoOwkvKiBjaGFpbiBvZiBhbGwgbWF0Y2hlcyAqLwotCVN5bSBzeW07Ci0gICAgICB9Ci0gICAgbGVmdCwgcmlnaHQ7Ci0gIH0KLSAqaWRfbGlzdDsKLQotU3ltX1RhYmxlIHN5bXNbTlVNX1RBQkxFU107Ci0KLSNpZmRlZiBERUJVRwotY29uc3QgY2hhciAqdGFibGVfbmFtZVtdID0KLXsKLSAgIklOQ0xfR1JBUEgiLCAiRVhDTF9HUkFQSCIsCi0gICJJTkNMX0FSQ1MiLCAiRVhDTF9BUkNTIiwKLSAgIklOQ0xfRkxBVCIsICJFWENMX0ZMQVQiLAotICAiSU5DTF9USU1FIiwgIkVYQ0xfVElNRSIsCi0gICJJTkNMX0FOTk8iLCAiRVhDTF9BTk5PIiwKLSAgIklOQ0xfRVhFQyIsICJFWENMX0VYRUMiCi19OwotI2VuZGlmIC8qIERFQlVHICovCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSB0YWJsZSBpbiB3aGljaCB3ZSBrZWVwIGFsbCB0aGUgc3ltcyB0aGF0IG1hdGNoCi0gKiB0aGUgcmlnaHQgaGFsZiBvZiBhbiBhcmMgaWQuICBJdCBpcyBOT1Qgc29ydGVkIGFjY29yZGluZwotICogdG8gdGhlIGFkZHJlc3NlcywgYmVjYXVzZSBpdCBpcyBhY2Nlc3NlZCBvbmx5IHRocm91Z2gKLSAqIHRoZSBsZWZ0IGhhbGYncyBDSElMRFJFTiBwb2ludGVycyAoc28gaXQncyBjcnVjaWFsIG5vdAotICogdG8gcmVvcmRlciB0aGlzIHRhYmxlIG9uY2UgcG9pbnRlcnMgaW50byBpdCBleGlzdCkuCi0gKi8KLXN0YXRpYyBTeW1fVGFibGUgcmlnaHRfaWRzOwotCi1zdGF0aWMgU291cmNlX0ZpbGUgbm9uX2V4aXN0ZW50X2ZpbGUgPQotewotICAwLCAiPG5vbi1leGlzdGVudC1maWxlPiIKLX07Ci0KLQotdm9pZAotREVGVU4gKHN5bV9pZF9hZGQsIChzcGVjLCB3aGljaF90YWJsZSksCi0gICAgICAgY29uc3QgY2hhciAqc3BlYyBBTkQgVGFibGVfSWQgd2hpY2hfdGFibGUpCi17Ci0gIHN0cnVjdCBzeW1faWQgKmlkOwotICBpbnQgbGVuID0gc3RybGVuIChzcGVjKTsKLQotICBpZCA9IChzdHJ1Y3Qgc3ltX2lkICopIHhtYWxsb2MgKHNpemVvZiAoKmlkKSArIGxlbiArIDEpOwotICBtZW1zZXQgKGlkLCAwLCBzaXplb2YgKCppZCkpOwotCi0gIGlkLT5zcGVjID0gKGNoYXIgKikgaWQgKyBzaXplb2YgKCppZCk7Ci0gIHN0cmNweSAoaWQtPnNwZWMsIHNwZWMpOwotICBpZC0+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+bmFtZSA6ICIqIiwgbGVmdC0+YWRkciwKLQkJCQlsZWZ0LT5lbmRfYWRkciwKLQkJCQlyaWdodC0+ZmlsZSA/IHJpZ2h0LT5maWxlLT5uYW1lIDogIioiLAotCQkJCXJpZ2h0LT5uYW1lID8gcmlnaHQtPm5hbWUgOiAiKiIsIHJpZ2h0LT5hZGRyLAotCQkJCXJpZ2h0LT5lbmRfYWRkciwKLQkJCQl0YWJsZV9uYW1lW2lkLT53aGljaF90YWJsZV0pKTsKLQkJICBhcmNfYWRkIChsZWZ0LCByaWdodCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIGZpbmFsbHksIHdlIGNhbiBzb3J0IHRoZSB0YWJsZXMgYW5kIHdlJ3JlIGRvbmU6ICovCi0KLSAgZm9yICh0YWIgPSAmc3ltc1swXTsgdGFiIDwgJnN5bXNbTlVNX1RBQkxFU107ICsrdGFiKQotICAgIHsKLSAgICAgIERCRyAoSURERUJVRywgcHJpbnRmICgiW3N5bV9pZF9wYXJzZV0gc3ltc1slc106XG4iLAotCQkJICAgIHRhYmxlX25hbWVbdGFiIC0gJnN5bXNbMF1dKSk7Ci0gICAgICBzeW10YWJfZmluYWxpemUgKHRhYik7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBTeW1ib2wgdGFibGVzIHN0b3JpbmcgdGhlIEZST00gc3ltYm9scyBvZiBhcmNzIGRvIG5vdCBuZWNlc3NhcmlseQotICogaGF2ZSBkaXN0aW5jdCBhZGRyZXNzIHJhbmdlcy4gIEZvciBleGFtcGxlLCBzb21lYm9keSBtaWdodCByZXF1ZXN0Ci0gKiAtayAvX21jb3VudCB0byBzdXBwcmVzcyBhbnkgYXJjcyBpbnRvIF9tY291bnQsIHdoaWxlIGF0IHRoZSBzYW1lCi0gKiB0aW1lIHJlcXVlc3RpbmcgLWsgYS9iLiAgRm9ydHVuYXRlbHksIHRob3NlIHN5bWJvbCB0YWJsZXMgZG9uJ3QgZ2V0Ci0gKiB2ZXJ5IGJpZyAodGhlIHVzZXIgaGFzIHRvIHR5cGUgdGhlbSEpLCBzbyBhIGxpbmVhciBzZWFyY2ggaXMgcHJvYmFibHkKLSAqIHRvbGVyYWJsZS4KLSAqLwotYm9vbAotREVGVU4gKHN5bV9pZF9hcmNfaXNfcHJlc2VudCwgKHN5bXRhYiwgZnJvbSwgdG8pLAotICAgICAgIFN5bV9UYWJsZSAqIHN5bXRhYiBBTkQgU3ltICogZnJvbSBBTkQgU3ltICogdG8pCi17Ci0gIFN5bSAqc3ltOwotCi0gIGZvciAoc3ltID0gc3ltdGFiLT5iYXNlOyBzeW0gPCBzeW10YWItPmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICBpZiAoZnJvbS0+YWRkciA+PSBzeW0tPmFkZHIgJiYgZnJvbS0+YWRkciA8PSBzeW0tPmVuZF9hZGRyCi0JICAmJiBhcmNfbG9va3VwIChzeW0sIHRvKSkKLQl7Ci0JICByZXR1cm4gVFJVRTsKLQl9Ci0gICAgfQotICByZXR1cm4gRkFMU0U7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9zeW1faWRzLmggYi9ncHJvZi9zeW1faWRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOTYzMzguLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc3ltX2lkcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI2lmbmRlZiBzeW1faWRzX2gKLSNkZWZpbmUgc3ltX2lkc19oCi0KLSNpbmNsdWRlICJzeW10YWIuaCIKLQotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBJTkNMX0dSQVBIID0gMCwgRVhDTF9HUkFQSCwKLSAgICBJTkNMX0FSQ1MsIEVYQ0xfQVJDUywKLSAgICBJTkNMX0ZMQVQsIEVYQ0xfRkxBVCwKLSAgICBJTkNMX1RJTUUsIEVYQ0xfVElNRSwKLSAgICBJTkNMX0FOTk8sIEVYQ0xfQU5OTywKLSAgICBJTkNMX0VYRUMsIEVYQ0xfRVhFQywKLSAgICBOVU1fVEFCTEVTCi0gIH0KLVRhYmxlX0lkOwotCi1leHRlcm4gU3ltX1RhYmxlIHN5bXNbTlVNX1RBQkxFU107Ci0KLWV4dGVybiB2b2lkIHN5bV9pZF9hZGQgUEFSQU1TICgoY29uc3QgY2hhciAqc3BlYywgVGFibGVfSWQgd2hpY2hfdGFibGUpKTsKLWV4dGVybiB2b2lkIHN5bV9pZF9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gYm9vbCBzeW1faWRfYXJjX2lzX3ByZXNlbnQgUEFSQU1TICgoU3ltX1RhYmxlICogc3ltdGFiLAotCQkJCQkgICBTeW0gKiBmcm9tLCBTeW0gKiB0bykpOwotCi0jZW5kaWYgLyogc3ltX2lkc19oICovCmRpZmYgLS1naXQgYS9ncHJvZi9zeW10YWIuYyBiL2dwcm9mL3N5bXRhYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODJjNjU3Li4wMDAwMDAwCi0tLSBhL2dwcm9mL3N5bXRhYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi1TeW1fVGFibGUgc3ltdGFiOwotCi0KLS8qCi0gKiBJbml0aWFsaXplIGEgc3ltYm9sIChzbyBpdCdzIGVtcHR5KS4KLSAqLwotdm9pZAotREVGVU4gKHN5bV9pbml0LCAoc3ltKSwgU3ltICogc3ltKQotewotICBtZW1zZXQgKHN5bSwgMCwgc2l6ZW9mICgqc3ltKSk7Ci0gIC8qCi0gICAqIEl0IGlzIG5vdCBzYWZlIHRvIGFzc3VtZSB0aGF0IGEgYmluYXJ5IHplcm8gY29ycmVzcG9uZHMgdG8KLSAgICogYSBmbG9hdGluZy1wb2ludCAwLjAsIHNvIGluaXRpYWxpemUgZmxvYXRzIGV4cGxpY2l0bHk6Ci0gICAqLwotICBzeW0tPmhpc3QudGltZSA9IDAuMDsKLSAgc3ltLT5jZy5jaGlsZF90aW1lID0gMC4wOwotICBzeW0tPmNnLnByb3AuZnJhY3QgPSAwLjA7Ci0gIHN5bS0+Y2cucHJvcC5zZWxmID0gMC4wOwotICBzeW0tPmNnLnByb3AuY2hpbGQgPSAwLjA7Ci19Ci0KLQotLyoKLSAqIENvbXBhcmUgdGhlIGZ1bmN0aW9uIGVudHJ5LXBvaW50IG9mIHR3byBzeW1ib2xzIGFuZCByZXR1cm4gPDAsID0wLAotICogb3IgPjAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGxlZnQgdmFsdWUgaXMgc21hbGxlciB0aGFuLCBlcXVhbAotICogdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgcmlnaHQgdmFsdWUuICBJZiB0d28gc3ltYm9scyBhcmUgZXF1YWwKLSAqIGJ1dCBvbmUgaGFzIGlzX2Z1bmMgc2V0IGFuZCB0aGUgb3RoZXIgZG9lc24ndCwgd2UgbWFrZSB0aGUKLSAqIG5vbi1mdW5jdGlvbiBzeW1ib2wgb25lICJiaWdnZXIiIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIHN5bWJvbCB3aWxsCi0gKiBzdXJ2aXZlIGR1cGxpY2F0ZSByZW1vdmFsLiAgRmluYWxseSwgaWYgYm90aCBzeW1ib2xzIGhhdmUgdGhlCi0gKiBzYW1lIGlzX2Z1bmMgdmFsdWUsIHdlIGRpc2NyaW1pbmF0ZSBhZ2FpbnN0IGlzX3N0YXRpYyBzdWNoIHRoYXQKLSAqIHRoZSBnbG9iYWwgc3ltYm9sIHN1cnZpdmVzLgotICovCi1zdGF0aWMgaW50Ci1ERUZVTiAoY21wX2FkZHIsIChscCwgcnApLCBjb25zdCBQVFIgbHAgQU5EIGNvbnN0IFBUUiBycCkKLXsKLSAgU3ltICpsZWZ0ID0gKFN5bSAqKSBscDsKLSAgU3ltICpyaWdodCA9IChTeW0gKikgcnA7Ci0KLSAgaWYgKGxlZnQtPmFkZHIgPiByaWdodC0+YWRkcikKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlZnQtPmFkZHIgPCByaWdodC0+YWRkcikKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChsZWZ0LT5pc19mdW5jICE9IHJpZ2h0LT5pc19mdW5jKQotICAgIHsKLSAgICAgIHJldHVybiByaWdodC0+aXNfZnVuYyAtIGxlZnQtPmlzX2Z1bmM7Ci0gICAgfQotCi0gIHJldHVybiBsZWZ0LT5pc19zdGF0aWMgLSByaWdodC0+aXNfc3RhdGljOwotfQotCi0KLXZvaWQKLURFRlVOIChzeW10YWJfZmluYWxpemUsICh0YWIpLCBTeW1fVGFibGUgKiB0YWIpCi17Ci0gIFN5bSAqc3JjLCAqZHN0OwotICBiZmRfdm1hIHByZXZfYWRkcjsKLQotICBpZiAoIXRhYi0+bGVuKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyoKLSAgICogU29ydCBzeW1ib2wgdGFibGUgaW4gb3JkZXIgb2YgaW5jcmVhc2luZyBmdW5jdGlvbiBhZGRyZXNzZXM6Ci0gICAqLwotICBxc29ydCAodGFiLT5iYXNlLCB0YWItPmxlbiwgc2l6ZW9mIChTeW0pLCBjbXBfYWRkcik7Ci0KLSAgLyoKLSAgICogUmVtb3ZlIGR1cGxpY2F0ZSBlbnRyaWVzIHRvIHNwZWVkLXVwIGxhdGVyIHByb2Nlc3NpbmcgYW5kCi0gICAqIHNldCBlbmRfYWRkciBpZiBpdHMgbm90IHNldCB5ZXQ6Ci0gICAqLwotICBwcmV2X2FkZHIgPSB0YWItPmJhc2VbMF0uYWRkciArIDE7Ci0gIGZvciAoc3JjID0gZHN0ID0gdGFiLT5iYXNlOyBzcmMgPCB0YWItPmxpbWl0OyArK3NyYykKLSAgICB7Ci0gICAgICBpZiAoc3JjLT5hZGRyID09IHByZXZfYWRkcikKLQl7Ci0JICAvKgotCSAgICogSWYgc2FtZSBhZGRyZXNzLCBmYXZvciBnbG9iYWwgc3ltYm9sIG92ZXIgc3RhdGljIG9uZSwKLQkgICAqIHRoZW4gZnVuY3Rpb24gb3ZlciBsaW5lIG51bWJlci4gIElmIGJvdGggc3ltYm9scyBhcmUKLQkgICAqIGVpdGhlciBzdGF0aWMgb3IgZ2xvYmFsIGFuZCBlaXRoZXIgZnVuY3Rpb24gb3IgbGluZSwgY2hlY2sKLQkgICAqIHdoZXRoZXIgb25lIGhhcyBuYW1lIGJlZ2lubmluZyB3aXRoIHVuZGVyc2NvcmUgd2hpbGUKLQkgICAqIHRoZSBvdGhlciBkb2Vzbid0LiAgSW4gc3VjaCBjYXNlcywga2VlcCBzeW0gd2l0aG91dAotCSAgICogdW5kZXJzY29yZS4gIFRoaXMgdGFrZXMgY2FyZXMgb2YgY29tcGlsZXIgZ2VuZXJhdGVkCi0JICAgKiBzeW1ib2xzIChzdWNoIGFzIF9fZ251X2NvbXBpbGVkLCBfX2M4OV91c2VkLCBldGMuKS4KLQkgICAqLwotCSAgaWYgKCghc3JjLT5pc19zdGF0aWMgJiYgZHN0Wy0xXS5pc19zdGF0aWMpCi0JICAgICAgfHwgKChzcmMtPmlzX3N0YXRpYyA9PSBkc3RbLTFdLmlzX3N0YXRpYykKLQkJICAmJiAoKHNyYy0+aXNfZnVuYyAmJiAhZHN0Wy0xXS5pc19mdW5jKQotCQkgICAgICB8fCAoKHNyYy0+aXNfZnVuYyA9PSBkc3RbLTFdLmlzX2Z1bmMpCi0JCQkgICYmICgoc3JjLT5uYW1lWzBdICE9ICdfJyAmJiBkc3RbLTFdLm5hbWVbMF0gPT0gJ18nKQotCQkJICAgICAgfHwgKHNyYy0+bmFtZVswXQotCQkJCSAgJiYgc3JjLT5uYW1lWzFdICE9ICdfJwotCQkJCSAgJiYgZHN0Wy0xXS5uYW1lWzFdID09ICdfJykpKSkpKQotCSAgICB7Ci0JICAgICAgREJHIChBT1VUREVCVUcgfCBJRERFQlVHLAotCQkgICBwcmludGYgKCJbc3ltdGFiX2ZpbmFsaXplXSBmYXZvciAlc0AlYyVjIG92ZXIgJXNAJWMlYyIsCi0JCQkgICBzcmMtPm5hbWUsIHNyYy0+aXNfc3RhdGljID8gJ3QnIDogJ1QnLAotCQkJICAgc3JjLT5pc19mdW5jID8gJ0YnIDogJ2YnLAotCQkJICAgZHN0Wy0xXS5uYW1lLCBkc3RbLTFdLmlzX3N0YXRpYyA/ICd0JyA6ICdUJywKLQkJCSAgIGRzdFstMV0uaXNfZnVuYyA/ICdGJyA6ICdmJyk7Ci0JCSAgIHByaW50ZiAoIiAoYWRkcj0lbHgpXG4iLCBzcmMtPmFkZHIpKTsKLQkgICAgICBkc3RbLTFdID0gKnNyYzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgREJHIChBT1VUREVCVUcgfCBJRERFQlVHLAotCQkgICBwcmludGYgKCJbc3ltdGFiX2ZpbmFsaXplXSBmYXZvciAlc0AlYyVjIG92ZXIgJXNAJWMlYyIsCi0JCQkgICBkc3RbLTFdLm5hbWUsIGRzdFstMV0uaXNfc3RhdGljID8gJ3QnIDogJ1QnLAotCQkJICAgZHN0Wy0xXS5pc19mdW5jID8gJ0YnIDogJ2YnLAotCQkJICAgc3JjLT5uYW1lLCBzcmMtPmlzX3N0YXRpYyA/ICd0JyA6ICdUJywKLQkJCSAgIHNyYy0+aXNfZnVuYyA/ICdGJyA6ICdmJyk7Ci0JCSAgIHByaW50ZiAoIiAoYWRkcj0lbHgpXG4iLCBzcmMtPmFkZHIpKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZHN0ID4gdGFiLT5iYXNlICYmIGRzdFstMV0uZW5kX2FkZHIgPT0gMCkKLQkgICAgewotCSAgICAgIGRzdFstMV0uZW5kX2FkZHIgPSBzcmMtPmFkZHIgLSAxOwotCSAgICB9Ci0KLQkgIC8qIHJldGFpbiBzeW0gb25seSBpZiBpdCBoYXMgYSBub24tZW1wdHkgYWRkcmVzcyByYW5nZTogKi8KLQkgIGlmICghc3JjLT5lbmRfYWRkciB8fCBzcmMtPmFkZHIgPD0gc3JjLT5lbmRfYWRkcikKLQkgICAgewotCSAgICAgICpkc3QrKyA9ICpzcmM7Ci0JICAgICAgcHJldl9hZGRyID0gc3JjLT5hZGRyOwotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKHRhYi0+bGVuID4gMCAmJiBkc3RbLTFdLmVuZF9hZGRyID09IDApCi0gICAgewotICAgICAgZHN0Wy0xXS5lbmRfYWRkciA9IGNvcmVfdGV4dF9zZWN0LT52bWEgKyBjb3JlX3RleHRfc2VjdC0+X3Jhd19zaXplIC0gMTsKLSAgICB9Ci0KLSAgREJHIChBT1VUREVCVUcgfCBJRERFQlVHLAotICAgICAgIHByaW50ZiAoIltzeW10YWJfZmluYWxpemVdOiByZW1vdmVkICVkIGR1cGxpY2F0ZSBlbnRyaWVzXG4iLAotCSAgICAgICB0YWItPmxlbiAtIChpbnQpIChkc3QgLSB0YWItPmJhc2UpKSk7Ci0KLSAgdGFiLT5saW1pdCA9IGRzdDsKLSAgdGFiLT5sZW4gPSB0YWItPmxpbWl0IC0gdGFiLT5iYXNlOwotCi0gIERCRyAoQU9VVERFQlVHIHwgSURERUJVRywKLSAgICAgICB1bnNpZ25lZCBpbnQgajsKLQotICAgICAgIGZvciAoaiA9IDA7IGogPCB0YWItPmxlbjsgKytqKQotICAgICAgIHsKLSAgICAgICBwcmludGYgKCJbc3ltdGFiX2ZpbmFsaXplXSAweCVseC0weCVseFx0JXNcbiIsCi0JICAgICAgIChsb25nKSB0YWItPmJhc2Vbal0uYWRkciwgKGxvbmcpIHRhYi0+YmFzZVtqXS5lbmRfYWRkciwKLQkgICAgICAgdGFiLT5iYXNlW2pdLm5hbWUpOwotICAgICAgIH0KLSAgKTsKLX0KLQotCi0jaWZkZWYgREVCVUcKLQotU3ltICoKLURFRlVOIChkYmdfc3ltX2xvb2t1cCwgKHN5bXRhYiwgYWRkcmVzcyksIFN5bV9UYWJsZSAqIHN5bXRhYiBBTkQgYmZkX3ZtYSBhZGRyZXNzKQotewotICBsb25nIGxvdywgbWlkLCBoaWdoOwotICBTeW0gKnN5bTsKLQotICBmcHJpbnRmIChzdGRlcnIsICJbZGJnX3N5bV9sb29rdXBdIGFkZHJlc3MgMHglbHhcbiIsIGFkZHJlc3MpOwotCi0gIHN5bSA9IHN5bXRhYi0+YmFzZTsKLSAgZm9yIChsb3cgPSAwLCBoaWdoID0gc3ltdGFiLT5sZW4gLSAxOyBsb3cgIT0gaGlnaDspCi0gICAgewotICAgICAgbWlkID0gKGhpZ2ggKyBsb3cpID4+IDE7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJbZGJnX3N5bV9sb29rdXBdIGxvdz0weCVseCwgbWlkPTB4JWx4LCBoaWdoPTB4JWx4XG4iLAotCSAgICAgICBsb3csIG1pZCwgaGlnaCk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJbZGJnX3N5bV9sb29rdXBdIHN5bVttXT0weCVseCBzeW1bbSArIDFdPTB4JWx4XG4iLAotCSAgICAgICBzeW1bbWlkXS5hZGRyLCBzeW1bbWlkICsgMV0uYWRkcik7Ci0gICAgICBpZiAoc3ltW21pZF0uYWRkciA8PSBhZGRyZXNzICYmIHN5bVttaWQgKyAxXS5hZGRyID4gYWRkcmVzcykKLQl7Ci0JICByZXR1cm4gJnN5bVttaWRdOwotCX0KLSAgICAgIGlmIChzeW1bbWlkXS5hZGRyID4gYWRkcmVzcykKLQl7Ci0JICBoaWdoID0gbWlkOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb3cgPSBtaWQgKyAxOwotCX0KLSAgICB9Ci0gIGZwcmludGYgKHN0ZGVyciwgIltkYmdfc3ltX2xvb2t1cF0gYmluYXJ5IHNlYXJjaCBmYWlscz8/P1xuIik7Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYJLyogREVCVUcgKi8KLQotCi0vKgotICogTG9vayB1cCBhbiBhZGRyZXNzIGluIHRoZSBzeW1ib2wtdGFibGUgdGhhdCBpcyBzb3J0ZWQgYnkgYWRkcmVzcy4KLSAqIElmIGFkZHJlc3MgZG9lcyBub3QgaGl0IGFueSBzeW1ib2wsIDAgaXMgcmV0dXJuZWQuCi0gKi8KLVN5bSAqCi1ERUZVTiAoc3ltX2xvb2t1cCwgKHN5bXRhYiwgYWRkcmVzcyksIFN5bV9UYWJsZSAqIHN5bXRhYiBBTkQgYmZkX3ZtYSBhZGRyZXNzKQotewotICBsb25nIGxvdywgaGlnaDsKLSAgbG9uZyBtaWQgPSAtMTsKLSAgU3ltICpzeW07Ci0jaWZkZWYgREVCVUcKLSAgaW50IHByb2JlcyA9IDA7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotICBpZiAoIXN5bXRhYi0+bGVuKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBzeW0gPSBzeW10YWItPmJhc2U7Ci0gIGZvciAobG93ID0gMCwgaGlnaCA9IHN5bXRhYi0+bGVuIC0gMTsgbG93ICE9IGhpZ2g7KQotICAgIHsKLSAgICAgIERCRyAoTE9PS1VQREVCVUcsICsrcHJvYmVzKTsKLSAgICAgIG1pZCA9IChoaWdoICsgbG93KSAvIDI7Ci0gICAgICBpZiAoc3ltW21pZF0uYWRkciA8PSBhZGRyZXNzICYmIHN5bVttaWQgKyAxXS5hZGRyID4gYWRkcmVzcykKLQl7Ci0JICBpZiAoYWRkcmVzcyA+IHN5bVttaWRdLmVuZF9hZGRyKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBBZGRyZXNzIGZhbGxzIGludG8gZ2FwIGJldHdlZW4gc3ltW21pZF0gYW5kCi0JICAgICAgICogc3ltW21pZCArIDFdOgotCSAgICAgICAqLwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBEQkcgKExPT0tVUERFQlVHLAotCQkgICBwcmludGYgKCJbc3ltX2xvb2t1cF0gJWQgcHJvYmVzIChzeW10YWItPmxlbj0ldSlcbiIsCi0JCQkgICBwcm9iZXMsIHN5bXRhYi0+bGVuIC0gMSkpOwotCSAgICAgIHJldHVybiAmc3ltW21pZF07Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3ltW21pZF0uYWRkciA+IGFkZHJlc3MpCi0JewotCSAgaGlnaCA9IG1pZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG93ID0gbWlkICsgMTsKLQl9Ci0gICAgfQotICBpZiAoc3ltW21pZCArIDFdLmFkZHIgPD0gYWRkcmVzcykKLSAgICB7Ci0gICAgICBpZiAoYWRkcmVzcyA+IHN5bVttaWQgKyAxXS5lbmRfYWRkcikKLQl7Ci0JICAvKiBhZGRyZXNzIGlzIGJleW9uZCBlbmQgb2Ygc3ltW21pZCArIDFdOiAqLwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIERCRyAoTE9PS1VQREVCVUcsIHByaW50ZiAoIltzeW1fbG9va3VwXSAlZCAoJXUpIHByb2JlcywgZmFsbCBvZmZcbiIsCi0JCQkJICAgIHByb2Jlcywgc3ltdGFiLT5sZW4gLSAxKSk7Ci0JICByZXR1cm4gJnN5bVttaWQgKyAxXTsKLQl9Ci0gICAgfQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2dwcm9mL3N5bXRhYi5oIGIvZ3Byb2Yvc3ltdGFiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YTQ1MGUuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc3ltdGFiLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotI2lmbmRlZiBzeW10YWJfaAotI2RlZmluZSBzeW10YWJfaAotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLQotLyoKLSAqIEZvciBhIHByb2ZpbGUgdG8gYmUgaW50ZWxsaWdpYmxlIHRvIGEgaHVtYW4gdXNlciwgaXQgaXMgbmVjZXNzYXJ5Ci0gKiB0byBtYXAgY29kZS1hZGRyZXNzZXMgaW50byBzb3VyY2UtY29kZSBpbmZvcm1hdGlvbi4gIFNvdXJjZS1jb2RlCi0gKiBpbmZvcm1hdGlvbiBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mOiAoaSkgZnVuY3Rpb24tbmFtZSwgKGlpKQotICogc291cmNlIGZpbGUtbmFtZSwgYW5kIChpaWkpIHNvdXJjZSBsaW5lIG51bWJlci4KLSAqCi0gKiBUaGUgc3ltYm9sIHRhYmxlIGlzIHVzZWQgdG8gbWFwIGFkZHJlc3NlcyBpbnRvIHNvdXJjZS1jb2RlCi0gKiBpbmZvcm1hdGlvbi4KLSAqLwotCi0jaW5jbHVkZSAic291cmNlLmgiCi0KLSNkZWZpbmUgTkJCUyAxMAotCi0vKgotICogU3ltYm9sLWVudHJ5LiAgRm9yIGVhY2ggZXh0ZXJuYWwgaW4gdGhlIHNwZWNpZmllZCBmaWxlIHdlIGdhdGhlcgotICogaXRzIGFkZHJlc3MsIHRoZSBudW1iZXIgb2YgY2FsbHMgYW5kIGNvbXB1dGUgaXRzIHNoYXJlIG9mIGNwdSB0aW1lLgotICovCi10eXBlZGVmIHN0cnVjdCBzeW0KLSAgewotICAgIC8qCi0gICAgICogQ29tbW9uIGluZm9ybWF0aW9uOgotICAgICAqCi0gICAgICogSW4gdGhlIHN5bWJvbC10YWJsZSwgZmllbGRzIEFERFIgYW5kIEZVTkNfTkFNRSBhcmUgZ3VhcmFudGVlZAotICAgICAqIHRvIGNvbnRhaW4gdmFsaWQgaW5mb3JtYXRpb24uICBGSUxFIG1heSBiZSAwLCBpZiB1bmtub3duIGFuZAotICAgICAqIExJTkVfTlVNIG1heWJlIDAgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBiZmRfdm1hIGFkZHI7CQkvKiBhZGRyZXNzIG9mIGVudHJ5IHBvaW50ICovCi0gICAgYmZkX3ZtYSBlbmRfYWRkcjsJCS8qIGVuZC1hZGRyZXNzICovCi0gICAgY29uc3QgY2hhciAqbmFtZTsJCS8qIG5hbWUgb2YgZnVuY3Rpb24gdGhpcyBzeW0gaXMgZnJvbSAqLwotICAgIFNvdXJjZV9GaWxlICpmaWxlOwkJLyogc291cmNlIGZpbGUgc3ltYm9sIGNvbWVzIGZyb20gKi8KLSAgICBpbnQgbGluZV9udW07CQkvKiBzb3VyY2UgbGluZSBudW1iZXIgKi8KLSAgICB1bnNpZ25lZCBpbnQgaXNfZnVuYzoxLAkvKiBpcyB0aGlzIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQ/ICovCi0gICAgICBpc19zdGF0aWM6MSwJCS8qIGlzIHRoaXMgYSBsb2NhbCAoc3RhdGljKSBzeW1ib2w/ICovCi0gICAgICBpc19iYl9oZWFkOjEsCQkvKiBpcyB0aGlzIHRoZSBoZWFkIG9mIGEgYmFzaWMtYmxrPyAqLwotICAgICAgbWFwcGVkOjEsCQkJLyogdGhpcyBzeW1ib2wgd2FzIG1hcHBlZCB0byBhbm90aGVyIG5hbWUgKi8KLSAgICAgIGhhc19iZWVuX3BsYWNlZDoxOwkvKiBoYXZlIHdlIHBsYWNlZCB0aGlzIHN5bWJvbD8gICovCi0gICAgdW5zaWduZWQgbG9uZyBuY2FsbHM7CS8qIGhvdyBtYW55IHRpbWVzIGV4ZWN1dGVkICovCi0gICAgaW50IG51c2VzOwkJCS8qIGhvdyBtYW55IHRpbWVzIHRoaXMgc3ltYm9sIGFwcGVhcnMgaW4KLQkJCQkgICBhIHBhcnRpY3VsYXIgY29udGV4dCAqLwotICAgIGJmZF92bWEgYmJfYWRkcltOQkJTXTsJLyogYWRkcmVzcyBvZiBiYXNpYy1ibG9jayBzdGFydCAqLwotICAgIHVuc2lnbmVkIGxvbmcgYmJfY2FsbHNbTkJCU107IC8qIGhvdyBtYW55IHRpbWVzIGJhc2ljLWJsb2NrIHdhcyBjYWxsZWQgKi8KLSAgICBzdHJ1Y3Qgc3ltICpuZXh0OwkJLyogZm9yIGJ1aWxkaW5nIGNoYWlucyBvZiBzeW1zICovCi0gICAgc3RydWN0IHN5bSAqcHJldjsJCS8qIGZvciBidWlsZGluZyBjaGFpbnMgb2Ygc3ltcyAqLwotCi0gICAgLyogcHJvZmlsZS1zcGVjaWZpYyBpbmZvcm1hdGlvbjogKi8KLQotICAgIC8qIGhpc3RvZ3JhbSBzcGVjaWZpYyBpbmZvOiAqLwotICAgIHN0cnVjdAotICAgICAgewotCWRvdWJsZSB0aW1lOwkJLyogKHdlaWdodGVkKSB0aWNrcyBpbiB0aGlzIHJvdXRpbmUgKi8KLQliZmRfdm1hIHNjYWxlZF9hZGRyOwkvKiBzY2FsZWQgZW50cnkgcG9pbnQgKi8KLSAgICAgIH0KLSAgICBoaXN0OwotCi0gICAgLyogY2FsbC1ncmFwaCBzcGVjaWZpYyBpbmZvOiAqLwotICAgIHN0cnVjdAotICAgICAgewotCXVuc2lnbmVkIGxvbmcgc2VsZl9jYWxsczsgLyogaG93IG1hbnkgY2FsbHMgdG8gc2VsZiAqLwotCWRvdWJsZSBjaGlsZF90aW1lOwkvKiBjdW11bGF0aXZlIHRpY2tzIGluIGNoaWxkcmVuICovCi0JaW50IGluZGV4OwkJLyogaW5kZXggaW4gdGhlIGdyYXBoIGxpc3QgKi8KLQlpbnQgdG9wX29yZGVyOwkJLyogZ3JhcGggY2FsbCBjaGFpbiB0b3Atc29ydCBvcmRlciAqLwotCWJvb2wgcHJpbnRfZmxhZzsJLyogc2hvdWxkIHRoaXMgYmUgcHJpbnRlZD8gKi8KLQlzdHJ1Y3QKLQkgIHsKLQkgICAgZG91YmxlIGZyYWN0OwkvKiB3aGF0ICUgb2YgdGltZSBwcm9wYWdhdGVzICovCi0JICAgIGRvdWJsZSBzZWxmOwkvKiBob3cgbXVjaCBzZWxmIHRpbWUgcHJvcGFnYXRlcyAqLwotCSAgICBkb3VibGUgY2hpbGQ7CS8qIGhvdyBtdWNoIGNoaWxkIHRpbWUgcHJvcGFnYXRlcyAqLwotCSAgfQotCXByb3A7Ci0Jc3RydWN0Ci0JICB7Ci0JICAgIGludCBudW07CQkvKiBpbnRlcm5hbCBudW1iZXIgb2YgY3ljbGUgb24gKi8KLQkgICAgc3RydWN0IHN5bSAqaGVhZDsJLyogaGVhZCBvZiBjeWNsZSAqLwotCSAgICBzdHJ1Y3Qgc3ltICpuZXh0OwkvKiBuZXh0IG1lbWJlciBvZiBjeWNsZSAqLwotCSAgfQotCWN5YzsKLQlzdHJ1Y3QgYXJjICpwYXJlbnRzOwkvKiBsaXN0IG9mIGNhbGxlciBhcmNzICovCi0Jc3RydWN0IGFyYyAqY2hpbGRyZW47CS8qIGxpc3Qgb2YgY2FsbGVlIGFyY3MgKi8KLSAgICAgIH0KLSAgICBjZzsKLSAgfQotU3ltOwotCi0vKgotICogU3ltYm9sLXRhYmxlcyBhcmUgYWx3YXlzIGFzc3VtZWQgdG8gYmUgc29ydGVkIGluIGluY3JlYXNpbmcgb3JkZXIKLSAqIG9mIGFkZHJlc3NlczoKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHVuc2lnbmVkIGludCBsZW47CQkvKiAjIG9mIHN5bWJvbHMgaW4gdGhpcyB0YWJsZSAqLwotICAgIFN5bSAqYmFzZTsJCQkvKiBmaXJzdCBlbGVtZW50IGluIHN5bWJvbCB0YWJsZSAqLwotICAgIFN5bSAqbGltaXQ7CQkJLyogbGltaXQgPSBiYXNlICsgbGVuICovCi0gIH0KLVN5bV9UYWJsZTsKLQotZXh0ZXJuIFN5bV9UYWJsZSBzeW10YWI7CS8qIHRoZSBzeW1ib2wgdGFibGUgKi8KLQotZXh0ZXJuIHZvaWQgc3ltX2luaXQgUEFSQU1TICgoU3ltICogc3ltKSk7Ci1leHRlcm4gdm9pZCBzeW10YWJfZmluYWxpemUgUEFSQU1TICgoU3ltX1RhYmxlICogc3ltdGFiKSk7Ci1leHRlcm4gU3ltICpzeW1fbG9va3VwIFBBUkFNUyAoKFN5bV9UYWJsZSAqIHN5bXRhYiwgYmZkX3ZtYSBhZGRyZXNzKSk7Ci0KLWV4dGVybiB2b2lkIGZpbmRfY2FsbCBQQVJBTVMgKChTeW0gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotCi0jZW5kaWYgLyogc3ltdGFiX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL3RhaG9lLmMgYi9ncHJvZi90YWhvZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTMzYzE3Li4wMDAwMDAwCi0tLSBhL2dwcm9mL3RhaG9lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotICAgIC8qCi0gICAgICogICAgICAgIG9wY29kZSBvZiB0aGUgYGNhbGxmJyBpbnN0cnVjdGlvbgotICAgICAqLwotI2RlZmluZQlDQUxMRgkweGZlCi0KLSAgICAvKgotICAgICAqICAgICAgICByZWdpc3RlciBmb3IgcGMgcmVsYXRpdmUgYWRkcmVzc2luZwotICAgICAqLwotI2RlZmluZQlQQwkweGYKLQotZW51bSB0YWhvZV9vcGVybW9kZXMKLSAgewotICAgIGxpdGVyYWwsIGluZGV4ZWQsIHJlZywgcmVnZGVmLCBhdXRvZGVjLCBhdXRvaW5jLCBhdXRvaW5jZGVmLAotICAgIGJ5dGVkaXNwLCBieXRlZGlzcGRlZiwgd29yZGRpc3AsIHdvcmRkaXNwZGVmLCBsb25nZGlzcCwgbG9uZ2Rpc3BkZWYsCi0gICAgaW1tZWRpYXRlLCBhYnNvbHV0ZSwgYnl0ZXJlbCwgYnl0ZXJlbGRlZiwgd29yZHJlbCwgd29yZHJlbGRlZiwKLSAgICBsb25ncmVsLCBsb25ncmVsZGVmCi0gIH07Ci10eXBlZGVmIGVudW0gdGFob2Vfb3Blcm1vZGVzIHRhaG9lX29wZXJhbmRlbnVtOwotCi0vKgotICogQSBzeW1ib2wgdG8gYmUgdGhlIGNoaWxkIG9mIGluZGlyZWN0IGNhbGxmOgotICovCi1TeW0gaW5kaXJlY3RjaGlsZDsKLQotCi10YWhvZV9vcGVyYW5kZW51bQotdGFob2Vfb3BlcmFuZG1vZGUgKG1vZGVwKQotICAgICB1bnNpZ25lZCBjaGFyICptb2RlcDsKLXsKLSAgbG9uZyB1c2VzcmVnID0gKChsb25nKSAqbW9kZXApICYgMHhmOwotCi0gIHN3aXRjaCAoKChsb25nKSAqbW9kZXApID4+IDQpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAyOgotICAgIGNhc2UgMzoKLSAgICAgIHJldHVybiBsaXRlcmFsOwotICAgIGNhc2UgNDoKLSAgICAgIHJldHVybiBpbmRleGVkOwotICAgIGNhc2UgNToKLSAgICAgIHJldHVybiByZWc7Ci0gICAgY2FzZSA2OgotICAgICAgcmV0dXJuIHJlZ2RlZjsKLSAgICBjYXNlIDc6Ci0gICAgICByZXR1cm4gYXV0b2RlYzsKLSAgICBjYXNlIDg6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSAweGUgPyBhdXRvaW5jIDogaW1tZWRpYXRlOwotICAgIGNhc2UgOToKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYXV0b2luY2RlZiA6IGFic29sdXRlOwotICAgIGNhc2UgMTA6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGJ5dGVkaXNwIDogYnl0ZXJlbDsKLSAgICBjYXNlIDExOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBieXRlZGlzcGRlZiA6IGJ5dGVyZWxkZWY7Ci0gICAgY2FzZSAxMjoKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gd29yZGRpc3AgOiB3b3JkcmVsOwotICAgIGNhc2UgMTM6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IHdvcmRkaXNwZGVmIDogd29yZHJlbGRlZjsKLSAgICBjYXNlIDE0OgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBsb25nZGlzcCA6IGxvbmdyZWw7Ci0gICAgY2FzZSAxNToKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gbG9uZ2Rpc3BkZWYgOiBsb25ncmVsZGVmOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotY2hhciAqCi10YWhvZV9vcGVyYW5kbmFtZSAobW9kZSkKLSAgICAgdGFob2Vfb3BlcmFuZGVudW0gbW9kZTsKLXsKLQotICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgIGNhc2UgbGl0ZXJhbDoKLSAgICAgIHJldHVybiAibGl0ZXJhbCI7Ci0gICAgY2FzZSBpbmRleGVkOgotICAgICAgcmV0dXJuICJpbmRleGVkIjsKLSAgICBjYXNlIHJlZzoKLSAgICAgIHJldHVybiAicmVnaXN0ZXIiOwotICAgIGNhc2UgcmVnZGVmOgotICAgICAgcmV0dXJuICJyZWdpc3RlciBkZWZlcnJlZCI7Ci0gICAgY2FzZSBhdXRvZGVjOgotICAgICAgcmV0dXJuICJhdXRvZGVjcmVtZW50IjsKLSAgICBjYXNlIGF1dG9pbmM6Ci0gICAgICByZXR1cm4gImF1dG9pbmNyZW1lbnQiOwotICAgIGNhc2UgYXV0b2luY2RlZjoKLSAgICAgIHJldHVybiAiYXV0b2luY3JlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSBieXRlZGlzcDoKLSAgICAgIHJldHVybiAiYnl0ZSBkaXNwbGFjZW1lbnQiOwotICAgIGNhc2UgYnl0ZWRpc3BkZWY6Ci0gICAgICByZXR1cm4gImJ5dGUgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIGJ5dGVyZWw6Ci0gICAgICByZXR1cm4gImJ5dGUgcmVsYXRpdmUiOwotICAgIGNhc2UgYnl0ZXJlbGRlZjoKLSAgICAgIHJldHVybiAiYnl0ZSByZWxhdGl2ZSBkZWZlcnJlZCI7Ci0gICAgY2FzZSB3b3JkZGlzcDoKLSAgICAgIHJldHVybiAid29yZCBkaXNwbGFjZW1lbnQiOwotICAgIGNhc2Ugd29yZGRpc3BkZWY6Ci0gICAgICByZXR1cm4gIndvcmQgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgICByZXR1cm4gIndvcmQgcmVsYXRpdmUiOwotICAgIGNhc2Ugd29yZHJlbGRlZjoKLSAgICAgIHJldHVybiAid29yZCByZWxhdGl2ZSBkZWZlcnJlZCI7Ci0gICAgY2FzZSBpbW1lZGlhdGU6Ci0gICAgICByZXR1cm4gImltbWVkaWF0ZSI7Ci0gICAgY2FzZSBhYnNvbHV0ZToKLSAgICAgIHJldHVybiAiYWJzb2x1dGUiOwotICAgIGNhc2UgbG9uZ2Rpc3A6Ci0gICAgICByZXR1cm4gImxvbmcgZGlzcGxhY2VtZW50IjsKLSAgICBjYXNlIGxvbmdkaXNwZGVmOgotICAgICAgcmV0dXJuICJsb25nIGRpc3BsYWNlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSBsb25ncmVsOgotICAgICAgcmV0dXJuICJsb25nIHJlbGF0aXZlIjsKLSAgICBjYXNlIGxvbmdyZWxkZWY6Ci0gICAgICByZXR1cm4gImxvbmcgcmVsYXRpdmUgZGVmZXJyZWQiOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotbG9uZwotdGFob2Vfb3BlcmFuZGxlbmd0aCAobW9kZXApCi0gICAgIHVuc2lnbmVkIGNoYXIgKm1vZGVwOwotewotCi0gIHN3aXRjaCAodGFob2Vfb3BlcmFuZG1vZGUgKG1vZGVwKSkKLSAgICB7Ci0gICAgY2FzZSBsaXRlcmFsOgotICAgIGNhc2UgcmVnOgotICAgIGNhc2UgcmVnZGVmOgotICAgIGNhc2UgYXV0b2RlYzoKLSAgICBjYXNlIGF1dG9pbmM6Ci0gICAgY2FzZSBhdXRvaW5jZGVmOgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBieXRlZGlzcDoKLSAgICBjYXNlIGJ5dGVkaXNwZGVmOgotICAgIGNhc2UgYnl0ZXJlbDoKLSAgICBjYXNlIGJ5dGVyZWxkZWY6Ci0gICAgICByZXR1cm4gMjsKLSAgICBjYXNlIHdvcmRkaXNwOgotICAgIGNhc2Ugd29yZGRpc3BkZWY6Ci0gICAgY2FzZSB3b3JkcmVsOgotICAgIGNhc2Ugd29yZHJlbGRlZjoKLSAgICAgIHJldHVybiAzOwotICAgIGNhc2UgaW1tZWRpYXRlOgotICAgIGNhc2UgYWJzb2x1dGU6Ci0gICAgY2FzZSBsb25nZGlzcDoKLSAgICBjYXNlIGxvbmdkaXNwZGVmOgotICAgIGNhc2UgbG9uZ3JlbDoKLSAgICBjYXNlIGxvbmdyZWxkZWY6Ci0gICAgICByZXR1cm4gNTsKLSAgICBjYXNlIGluZGV4ZWQ6Ci0gICAgICByZXR1cm4gMSArIHRhaG9lX29wZXJhbmRsZW5ndGggKG1vZGVwICsgMSk7Ci0gICAgfQotICAvKiBOT1RSRUFDSEVEICovCi0gIGFib3J0ICgpOwotfQotCi1iZmRfdm1hCi10YWhvZV9yZWxhZGRyIChtb2RlcCkKLSAgICAgY2hhciAqbW9kZXA7Ci17Ci0gIHRhaG9lX29wZXJhbmRlbnVtIG1vZGUgPSB0YWhvZV9vcGVyYW5kbW9kZSAobW9kZXApOwotICBjaGFyICpjcDsKLSAgc2hvcnQgKnNwOwotICBsb25nICpscDsKLSAgaW50IGk7Ci0gIGxvbmcgdmFsdWUgPSAwOwotCi0gIGNwID0gbW9kZXA7Ci0gICsrY3A7CQkJCS8qIHNraXAgb3ZlciB0aGUgbW9kZSAqLwotICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJbcmVsYWRkcl0gbm90IHJlbGF0aXZlIGFkZHJlc3NcbiIpOwotICAgICAgcmV0dXJuIChiZmRfdm1hKSBtb2RlcDsKLSAgICBjYXNlIGJ5dGVyZWw6Ci0gICAgICByZXR1cm4gKGJmZF92bWEpIChjcCArIHNpemVvZiAqY3AgKyAqY3ApOwotICAgIGNhc2Ugd29yZHJlbDoKLSAgICAgIGZvciAoaSA9IDA7IChzaXplX3QpIGkgPCBzaXplb2YgKnNwOyBpKyspCi0JdmFsdWUgPSAodmFsdWUgPDwgOCkgKyAoY3BbaV0gJiAweGZmKTsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgKGNwICsgc2l6ZW9mICpzcCArIHZhbHVlKTsKLSAgICBjYXNlIGxvbmdyZWw6Ci0gICAgICBmb3IgKGkgPSAwOyAoc2l6ZV90KSBpIDwgc2l6ZW9mICpscDsgaSsrKQotCXZhbHVlID0gKHZhbHVlIDw8IDgpICsgKGNwW2ldICYgMHhmZik7Ci0gICAgICByZXR1cm4gKGJmZF92bWEpIChjcCArIHNpemVvZiAqbHAgKyB2YWx1ZSk7Ci0gICAgfQotfQotCi12b2lkCi10YWhvZV9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCi0gICAgIFN5bSAqcGFyZW50OwotICAgICBiZmRfdm1hIHBfbG93cGM7Ci0gICAgIGJmZF92bWEgcF9oaWdocGM7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmluc3RydWN0cDsKLSAgbG9uZyBsZW5ndGg7Ci0gIFN5bSAqY2hpbGQ7Ci0gIHRhaG9lX29wZXJhbmRlbnVtIG1vZGU7Ci0gIHRhaG9lX29wZXJhbmRlbnVtIGZpcnN0bW9kZTsKLSAgYmZkX3ZtYSBkZXN0cGM7Ci0gIHN0YXRpYyBib29sIGluaXRlZCA9IEZBTFNFOwotCi0gIGlmICghaW5pdGVkKQotICAgIHsKLSAgICAgIGluaXRlZCA9IFRSVUU7Ci0gICAgICBzeW1faW5pdCAoJmluZGlyZWN0Y2hpbGQpOwotICAgICAgaW5kaXJlY3RjaGlsZC5jZy5wcm9wLmZyYWN0ID0gMS4wOwotICAgICAgaW5kaXJlY3RjaGlsZC5jZy5jeWMuaGVhZCA9ICZpbmRpcmVjdGNoaWxkOwotICAgIH0KLQotICBpZiAoY29yZV90ZXh0X3NwYWNlID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHBfbG93cGMgPCBzX2xvd3BjKQotICAgIHsKLSAgICAgIHBfbG93cGMgPSBzX2xvd3BjOwotICAgIH0KLSAgaWYgKHBfaGlnaHBjID4gc19oaWdocGMpCi0gICAgewotICAgICAgcF9oaWdocGMgPSBzX2hpZ2hwYzsKLSAgICB9Ci0gIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZGNhbGxdICVzOiAweCVseCB0byAweCVseFxuIiwKLQkJCSAgcGFyZW50LT5uYW1lLCBwX2xvd3BjLCBwX2hpZ2hwYykpOwotICBmb3IgKGluc3RydWN0cCA9ICh1bnNpZ25lZCBjaGFyICopIGNvcmVfdGV4dF9zcGFjZSArIHBfbG93cGM7Ci0gICAgICAgaW5zdHJ1Y3RwIDwgKHVuc2lnbmVkIGNoYXIgKikgY29yZV90ZXh0X3NwYWNlICsgcF9oaWdocGM7Ci0gICAgICAgaW5zdHJ1Y3RwICs9IGxlbmd0aCkKLSAgICB7Ci0gICAgICBsZW5ndGggPSAxOwotICAgICAgaWYgKCppbnN0cnVjdHAgPT0gQ0FMTEYpCi0JewotCSAgLyoKLQkgICAqICAgIG1heWJlIGEgY2FsbGYsIGJldHRlciBjaGVjayBpdCBvdXQuCi0JICAgKiAgICAgIHNraXAgdGhlIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgotCSAgICovCi0JICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiW2ZpbmRjYWxsXVx0MHgleDpjYWxsZiIsCi0JCQkJICBpbnN0cnVjdHAgLSAodW5zaWduZWQgY2hhciAqKSBjb3JlX3RleHRfc3BhY2UpKTsKLQkgIGZpcnN0bW9kZSA9IHRhaG9lX29wZXJhbmRtb2RlIChpbnN0cnVjdHAgKyBsZW5ndGgpOwotCSAgc3dpdGNoIChmaXJzdG1vZGUpCi0JICAgIHsKLQkgICAgY2FzZSBsaXRlcmFsOgotCSAgICBjYXNlIGltbWVkaWF0ZToKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBnb3RvIGJvdGNoZWQ7Ci0JICAgIH0KLQkgIGxlbmd0aCArPSB0YWhvZV9vcGVyYW5kbGVuZ3RoIChpbnN0cnVjdHAgKyBsZW5ndGgpOwotCSAgbW9kZSA9IHRhaG9lX29wZXJhbmRtb2RlIChpbnN0cnVjdHAgKyBsZW5ndGgpOwotCSAgREJHIChDQUxMREVCVUcsCi0JICAgICAgIHByaW50ZiAoIlx0Zmlyc3Qgb3BlcmFuZCBpcyAlcyIsIHRhaG9lX29wZXJhbmRuYW1lIChmaXJzdG1vZGUpKTsKLQkgICAgICAgcHJpbnRmICgiXHRzZWNvbmQgb3BlcmFuZCBpcyAlc1xuIiwgdGFob2Vfb3BlcmFuZG5hbWUgKG1vZGUpKTsKLQkgICAgKTsKLQkgIHN3aXRjaCAobW9kZSkKLQkgICAgewotCSAgICBjYXNlIHJlZ2RlZjoKLQkgICAgY2FzZSBieXRlZGlzcGRlZjoKLQkgICAgY2FzZSB3b3JkZGlzcGRlZjoKLQkgICAgY2FzZSBsb25nZGlzcGRlZjoKLQkgICAgY2FzZSBieXRlcmVsZGVmOgotCSAgICBjYXNlIHdvcmRyZWxkZWY6Ci0JICAgIGNhc2UgbG9uZ3JlbGRlZjoKLQkgICAgICAvKgotCSAgICAgICAqICAgIGluZGlyZWN0IGNhbGw6IGNhbGwgdGhyb3VnaCBwb2ludGVyCi0JICAgICAgICogICAgICBlaXRoZXIgICpkKHIpICAgYXMgYSBwYXJhbWV0ZXIgb3IgbG9jYWwKLQkgICAgICAgKiAgICAgICAgICAgICAgKHIpICAgICBhcyBhIHJldHVybiB2YWx1ZQotCSAgICAgICAqICAgICAgICAgICAgICAqZiAgICAgIGFzIGEgZ2xvYmFsIHBvaW50ZXIKLQkgICAgICAgKiAgICAgIFthcmUgdGhlcmUgb3RoZXJzIHRoYXQgd2UgbWlzcz8sCi0JICAgICAgICogICAgICAgZS5nLiBhcnJheXMgb2YgcG9pbnRlcnMgdG8gZnVuY3Rpb25zPz8/XQotCSAgICAgICAqLwotCSAgICAgIGFyY19hZGQgKHBhcmVudCwgJmluZGlyZWN0Y2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKLQkgICAgICBsZW5ndGggKz0gdGFob2Vfb3BlcmFuZGxlbmd0aCAoaW5zdHJ1Y3RwICsgbGVuZ3RoKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgY2FzZSBieXRlcmVsOgotCSAgICBjYXNlIHdvcmRyZWw6Ci0JICAgIGNhc2UgbG9uZ3JlbDoKLQkgICAgICAvKgotCSAgICAgICAqICAgIHJlZ3VsYXIgcGMgcmVsYXRpdmUgYWRkcmVzc2luZwotCSAgICAgICAqICAgICAgY2hlY2sgdGhhdCB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIAotCSAgICAgICAqICAgICAgYSBmdW5jdGlvbi4KLQkgICAgICAgKi8KLQkgICAgICBkZXN0cGMgPSB0YWhvZV9yZWxhZGRyIChpbnN0cnVjdHAgKyBsZW5ndGgpCi0JCS0gKGJmZF92bWEpIGNvcmVfdGV4dF9zcGFjZTsKLQkgICAgICBpZiAoZGVzdHBjID49IHNfbG93cGMgJiYgZGVzdHBjIDw9IHNfaGlnaHBjKQotCQl7Ci0JCSAgY2hpbGQgPSBzeW1fbG9va3VwICgmc3ltdGFiLCBkZXN0cGMpOwotCQkgIERCRyAoQ0FMTERFQlVHLAotCQkgICAgICAgcHJpbnRmICgiW2ZpbmRjYWxsXVx0ZGVzdHBjIDB4JWx4IiwgZGVzdHBjKTsKLQkJICAgICAgIHByaW50ZiAoIiBjaGlsZC0+bmFtZSAlcyIsIGNoaWxkLT5uYW1lKTsKLQkJICAgICAgIHByaW50ZiAoIiBjaGlsZC0+YWRkciAweCVseFxuIiwgY2hpbGQtPmFkZHIpOwotCQkgICAgKTsKLQkJICBpZiAoY2hpbGQtPmFkZHIgPT0gZGVzdHBjKQotCQkgICAgewotCQkgICAgICAvKgotCQkgICAgICAgKiAgICBhIGhpdAotCQkgICAgICAgKi8KLQkJICAgICAgYXJjX2FkZCAocGFyZW50LCBjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCQkgICAgICBsZW5ndGggKz0gdGFob2Vfb3BlcmFuZGxlbmd0aCAoaW5zdHJ1Y3RwICsgbGVuZ3RoKTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCSAgZ290byBib3RjaGVkOwotCQl9Ci0JICAgICAgLyoKLQkgICAgICAgKiAgICBlbHNlOgotCSAgICAgICAqICAgICAgaXQgbG9va2VkIGxpa2UgYSBjYWxsZiwKLQkgICAgICAgKiAgICAgIGJ1dCBpdCB3YXNuJ3QgdG8gYW55d2hlcmUuCi0JICAgICAgICovCi0JICAgICAgZ290byBib3RjaGVkOwotCSAgICBkZWZhdWx0OgotCSAgICBib3RjaGVkOgotCSAgICAgIC8qCi0JICAgICAgICogICAgc29tZXRoaW5nIGZ1bm55IGdvaW5nIG9uLgotCSAgICAgICAqLwotCSAgICAgIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZGNhbGxdXHRidXQgaXQncyBhIGJvdGNoXG4iKSk7Ci0JICAgICAgbGVuZ3RoID0gMTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi91dGlscy5jIGIvZ3Byb2YvdXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmMDMxZC4uMDAwMDAwMAotLS0gYS9ncHJvZi91dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTggUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSA8ZGVtYW5nbGUuaD4KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotCi0vKgotICogUHJpbnQgbmFtZSBvZiBzeW1ib2wuICBSZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KLSAqLwotaW50Ci1ERUZVTiAocHJpbnRfbmFtZV9vbmx5LCAoc2VsZiksIFN5bSAqIHNlbGYpCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWUgPSBzZWxmLT5uYW1lOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgY2hhciAqZGVtYW5nbGVkID0gMDsKLSAgY2hhciBidWZbUEFUSF9NQVhdOwotICBpbnQgc2l6ZSA9IDA7Ci0KLSAgaWYgKG5hbWUpCi0gICAgewotICAgICAgaWYgKCFic2Rfc3R5bGVfb3V0cHV0KQotCXsKLQkgIGlmIChuYW1lWzBdID09ICdfJyAmJiBuYW1lWzFdICYmIGRpc2NhcmRfdW5kZXJzY29yZXMpCi0JICAgIHsKLQkgICAgICBuYW1lKys7Ci0JICAgIH0KLQkgIGlmIChkZW1hbmdsZSkKLQkgICAgewotCSAgICAgIGRlbWFuZ2xlZCA9IGNwbHVzX2RlbWFuZ2xlIChuYW1lLCBETUdMX0FOU0kgfCBETUdMX1BBUkFNUyk7Ci0JICAgICAgaWYgKGRlbWFuZ2xlZCkKLQkJewotCQkgIG5hbWUgPSBkZW1hbmdsZWQ7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIHByaW50ZiAoIiVzIiwgbmFtZSk7Ci0gICAgICBzaXplID0gc3RybGVuIChuYW1lKTsKLSAgICAgIGlmIChsaW5lX2dyYW51bGFyaXR5ICYmIHNlbGYtPmZpbGUpCi0JewotCSAgZmlsZW5hbWUgPSBzZWxmLT5maWxlLT5uYW1lOwotCSAgaWYgKCFwcmludF9wYXRoKQotCSAgICB7Ci0JICAgICAgZmlsZW5hbWUgPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLQkgICAgICBpZiAoZmlsZW5hbWUpCi0JCXsKLQkJICArK2ZpbGVuYW1lOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZmlsZW5hbWUgPSBzZWxmLT5maWxlLT5uYW1lOwotCQl9Ci0JICAgIH0KLQkgIHNwcmludGYgKGJ1ZiwgIiAoJXM6JWQpIiwgZmlsZW5hbWUsIHNlbGYtPmxpbmVfbnVtKTsKLQkgIHByaW50ZiAoYnVmKTsKLQkgIHNpemUgKz0gc3RybGVuIChidWYpOwotCX0KLSAgICAgIGlmIChkZW1hbmdsZWQpCi0JewotCSAgZnJlZSAoZGVtYW5nbGVkKTsKLQl9Ci0gICAgICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJ7JWR9ICIsIHNlbGYtPmNnLnRvcF9vcmRlcikpOwotICAgICAgREJHIChQUk9QREVCVUcsIHByaW50ZiAoIiU0LjBmJSUgIiwgMTAwLjAgKiBzZWxmLT5jZy5wcm9wLmZyYWN0KSk7Ci0gICAgfQotICByZXR1cm4gc2l6ZTsKLX0KLQotCi12b2lkCi1ERUZVTiAocHJpbnRfbmFtZSwgKHNlbGYpLCBTeW0gKiBzZWxmKQotewotICBwcmludF9uYW1lX29ubHkgKHNlbGYpOwotCi0gIGlmIChzZWxmLT5jZy5jeWMubnVtICE9IDApCi0gICAgewotICAgICAgcHJpbnRmIChfKCIgPGN5Y2xlICVkPiIpLCBzZWxmLT5jZy5jeWMubnVtKTsKLSAgICB9Ci0gIGlmIChzZWxmLT5jZy5pbmRleCAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzZWxmLT5jZy5wcmludF9mbGFnKQotCXsKLQkgIHByaW50ZiAoIiBbJWRdIiwgc2VsZi0+Y2cuaW5kZXgpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCIgKCVkKSIsIHNlbGYtPmNnLmluZGV4KTsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvdXRpbHMuaCBiL2dwcm9mL3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZmI5YzYuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2lmbmRlZiB1dGlsc19oCi0jZGVmaW5lIHV0aWxzX2gKLQotZXh0ZXJuIGludCBwcmludF9uYW1lX29ubHkgUEFSQU1TICgoU3ltICogc2VsZikpOwotZXh0ZXJuIHZvaWQgcHJpbnRfbmFtZSBQQVJBTVMgKChTeW0gKiBzZWxmKSk7Ci0KLSNlbmRpZiAvKiB1dGlsc19oICovCmRpZmYgLS1naXQgYS9ncHJvZi92YXguYyBiL2dwcm9mL3ZheC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTdiZDhkLi4wMDAwMDAwCi0tLSBhL2dwcm9mL3ZheC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJoaXN0LmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLSAgICAvKgotICAgICAqICAgICAgICBvcGNvZGUgb2YgdGhlIGBjYWxscycgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSNkZWZpbmUJQ0FMTFMJMHhmYgotCi0gICAgLyoKLSAgICAgKiAgICAgICAgcmVnaXN0ZXIgZm9yIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcKLSAgICAgKi8KLSNkZWZpbmUJUEMJMHhmCi0KLWVudW0gb3Blcm1vZGVzCi0gIHsKLSAgICBsaXRlcmFsLCBpbmRleGVkLCByZWcsIHJlZ2RlZiwgYXV0b2RlYywgYXV0b2luYywgYXV0b2luY2RlZiwKLSAgICBieXRlZGlzcCwgYnl0ZWRpc3BkZWYsIHdvcmRkaXNwLCB3b3JkZGlzcGRlZiwgbG9uZ2Rpc3AsIGxvbmdkaXNwZGVmLAotICAgIGltbWVkaWF0ZSwgYWJzb2x1dGUsIGJ5dGVyZWwsIGJ5dGVyZWxkZWYsIHdvcmRyZWwsIHdvcmRyZWxkZWYsCi0gICAgbG9uZ3JlbCwgbG9uZ3JlbGRlZgotICB9OwotdHlwZWRlZiBlbnVtIG9wZXJtb2RlcyBvcGVyYW5kZW51bTsKLQotc3RydWN0IG1vZGVieXRlCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgcmVnZmllbGQ6NDsKLSAgICB1bnNpZ25lZCBpbnQgbW9kZWZpZWxkOjQ7Ci0gIH07Ci0KLS8qCi0gKiBBIHN5bWJvbCB0byBiZSB0aGUgY2hpbGQgb2YgaW5kaXJlY3QgY2FsbHM6Ci0gKi8KLVN5bSBpbmRpcmVjdGNoaWxkOwotCi0KLXN0YXRpYyBvcGVyYW5kZW51bQotdmF4X29wZXJhbmRtb2RlIChtb2RlcCkKLSAgICAgc3RydWN0IG1vZGVieXRlICptb2RlcDsKLXsKLSAgbG9uZyB1c2VzcmVnID0gbW9kZXAtPnJlZ2ZpZWxkOwotCi0gIHN3aXRjaCAobW9kZXAtPm1vZGVmaWVsZCkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSAzOgotICAgICAgcmV0dXJuIGxpdGVyYWw7Ci0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuIGluZGV4ZWQ7Ci0gICAgY2FzZSA1OgotICAgICAgcmV0dXJuIHJlZzsKLSAgICBjYXNlIDY6Ci0gICAgICByZXR1cm4gcmVnZGVmOwotICAgIGNhc2UgNzoKLSAgICAgIHJldHVybiBhdXRvZGVjOwotICAgIGNhc2UgODoKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYXV0b2luYyA6IGltbWVkaWF0ZTsKLSAgICBjYXNlIDk6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGF1dG9pbmNkZWYgOiBhYnNvbHV0ZTsKLSAgICBjYXNlIDEwOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBieXRlZGlzcCA6IGJ5dGVyZWw7Ci0gICAgY2FzZSAxMToKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYnl0ZWRpc3BkZWYgOiBieXRlcmVsZGVmOwotICAgIGNhc2UgMTI6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IHdvcmRkaXNwIDogd29yZHJlbDsKLSAgICBjYXNlIDEzOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyB3b3JkZGlzcGRlZiA6IHdvcmRyZWxkZWY7Ci0gICAgY2FzZSAxNDoKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gbG9uZ2Rpc3AgOiBsb25ncmVsOwotICAgIGNhc2UgMTU6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGxvbmdkaXNwZGVmIDogbG9uZ3JlbGRlZjsKLSAgICB9Ci0gIC8qIE5PVFJFQUNIRUQgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXZheF9vcGVyYW5kbmFtZSAobW9kZSkKLSAgICAgb3BlcmFuZGVudW0gbW9kZTsKLXsKLQotICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgIGNhc2UgbGl0ZXJhbDoKLSAgICAgIHJldHVybiAibGl0ZXJhbCI7Ci0gICAgY2FzZSBpbmRleGVkOgotICAgICAgcmV0dXJuICJpbmRleGVkIjsKLSAgICBjYXNlIHJlZzoKLSAgICAgIHJldHVybiAicmVnaXN0ZXIiOwotICAgIGNhc2UgcmVnZGVmOgotICAgICAgcmV0dXJuICJyZWdpc3RlciBkZWZlcnJlZCI7Ci0gICAgY2FzZSBhdXRvZGVjOgotICAgICAgcmV0dXJuICJhdXRvZGVjcmVtZW50IjsKLSAgICBjYXNlIGF1dG9pbmM6Ci0gICAgICByZXR1cm4gImF1dG9pbmNyZW1lbnQiOwotICAgIGNhc2UgYXV0b2luY2RlZjoKLSAgICAgIHJldHVybiAiYXV0b2luY3JlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSBieXRlZGlzcDoKLSAgICAgIHJldHVybiAiYnl0ZSBkaXNwbGFjZW1lbnQiOwotICAgIGNhc2UgYnl0ZWRpc3BkZWY6Ci0gICAgICByZXR1cm4gImJ5dGUgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIGJ5dGVyZWw6Ci0gICAgICByZXR1cm4gImJ5dGUgcmVsYXRpdmUiOwotICAgIGNhc2UgYnl0ZXJlbGRlZjoKLSAgICAgIHJldHVybiAiYnl0ZSByZWxhdGl2ZSBkZWZlcnJlZCI7Ci0gICAgY2FzZSB3b3JkZGlzcDoKLSAgICAgIHJldHVybiAid29yZCBkaXNwbGFjZW1lbnQiOwotICAgIGNhc2Ugd29yZGRpc3BkZWY6Ci0gICAgICByZXR1cm4gIndvcmQgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgICByZXR1cm4gIndvcmQgcmVsYXRpdmUiOwotICAgIGNhc2Ugd29yZHJlbGRlZjoKLSAgICAgIHJldHVybiAid29yZCByZWxhdGl2ZSBkZWZlcnJlZCI7Ci0gICAgY2FzZSBpbW1lZGlhdGU6Ci0gICAgICByZXR1cm4gImltbWVkaWF0ZSI7Ci0gICAgY2FzZSBhYnNvbHV0ZToKLSAgICAgIHJldHVybiAiYWJzb2x1dGUiOwotICAgIGNhc2UgbG9uZ2Rpc3A6Ci0gICAgICByZXR1cm4gImxvbmcgZGlzcGxhY2VtZW50IjsKLSAgICBjYXNlIGxvbmdkaXNwZGVmOgotICAgICAgcmV0dXJuICJsb25nIGRpc3BsYWNlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSBsb25ncmVsOgotICAgICAgcmV0dXJuICJsb25nIHJlbGF0aXZlIjsKLSAgICBjYXNlIGxvbmdyZWxkZWY6Ci0gICAgICByZXR1cm4gImxvbmcgcmVsYXRpdmUgZGVmZXJyZWQiOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIGxvbmcKLXZheF9vcGVyYW5kbGVuZ3RoIChtb2RlcCkKLSAgICAgc3RydWN0IG1vZGVieXRlICptb2RlcDsKLXsKLQotICBzd2l0Y2ggKHZheF9vcGVyYW5kbW9kZSAobW9kZXApKQotICAgIHsKLSAgICBjYXNlIGxpdGVyYWw6Ci0gICAgY2FzZSByZWc6Ci0gICAgY2FzZSByZWdkZWY6Ci0gICAgY2FzZSBhdXRvZGVjOgotICAgIGNhc2UgYXV0b2luYzoKLSAgICBjYXNlIGF1dG9pbmNkZWY6Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIGJ5dGVkaXNwOgotICAgIGNhc2UgYnl0ZWRpc3BkZWY6Ci0gICAgY2FzZSBieXRlcmVsOgotICAgIGNhc2UgYnl0ZXJlbGRlZjoKLSAgICAgIHJldHVybiAyOwotICAgIGNhc2Ugd29yZGRpc3A6Ci0gICAgY2FzZSB3b3JkZGlzcGRlZjoKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgY2FzZSB3b3JkcmVsZGVmOgotICAgICAgcmV0dXJuIDM7Ci0gICAgY2FzZSBpbW1lZGlhdGU6Ci0gICAgY2FzZSBhYnNvbHV0ZToKLSAgICBjYXNlIGxvbmdkaXNwOgotICAgIGNhc2UgbG9uZ2Rpc3BkZWY6Ci0gICAgY2FzZSBsb25ncmVsOgotICAgIGNhc2UgbG9uZ3JlbGRlZjoKLSAgICAgIHJldHVybiA1OwotICAgIGNhc2UgaW5kZXhlZDoKLSAgICAgIHJldHVybiAxICsgdmF4X29wZXJhbmRsZW5ndGggKChzdHJ1Y3QgbW9kZWJ5dGUgKikgKChjaGFyICopIG1vZGVwKSArIDEpOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIGJmZF92bWEKLXZheF9yZWxhZGRyIChtb2RlcCkKLSAgICAgc3RydWN0IG1vZGVieXRlICptb2RlcDsKLXsKLSAgb3BlcmFuZGVudW0gbW9kZSA9IHZheF9vcGVyYW5kbW9kZSAobW9kZXApOwotICBjaGFyICpjcDsKLSAgc2hvcnQgKnNwOwotICBsb25nICpscDsKLQotICBjcCA9IChjaGFyICopIG1vZGVwOwotICArK2NwOwkJCQkvKiBza2lwIG92ZXIgdGhlIG1vZGUgKi8KLSAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW3JlbGFkZHJdIG5vdCByZWxhdGl2ZSBhZGRyZXNzXG4iKTsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgbW9kZXA7Ci0gICAgY2FzZSBieXRlcmVsOgotICAgICAgcmV0dXJuIChiZmRfdm1hKSAoY3AgKyBzaXplb2YgKmNwICsgKmNwKTsKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgICBzcCA9IChzaG9ydCAqKSBjcDsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgKGNwICsgc2l6ZW9mICpzcCArICpzcCk7Ci0gICAgY2FzZSBsb25ncmVsOgotICAgICAgbHAgPSAobG9uZyAqKSBjcDsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgKGNwICsgc2l6ZW9mICpscCArICpscCk7Ci0gICAgfQotfQotCi0KLXZvaWQKLXZheF9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCi0gICAgIFN5bSAqcGFyZW50OwotICAgICBiZmRfdm1hIHBfbG93cGM7Ci0gICAgIGJmZF92bWEgcF9oaWdocGM7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmluc3RydWN0cDsKLSAgbG9uZyBsZW5ndGg7Ci0gIFN5bSAqY2hpbGQ7Ci0gIG9wZXJhbmRlbnVtIG1vZGU7Ci0gIG9wZXJhbmRlbnVtIGZpcnN0bW9kZTsKLSAgYmZkX3ZtYSBkZXN0cGM7Ci0gIHN0YXRpYyBib29sIGluaXRlZCA9IEZBTFNFOwotCi0gIGlmICghaW5pdGVkKQotICAgIHsKLSAgICAgIGluaXRlZCA9IFRSVUU7Ci0gICAgICBzeW1faW5pdCAoJmluZGlyZWN0Y2hpbGQpOwotICAgICAgaW5kaXJlY3RjaGlsZC5jZy5wcm9wLmZyYWN0ID0gMS4wOwotICAgICAgaW5kaXJlY3RjaGlsZC5jZy5jeWMuaGVhZCA9ICZpbmRpcmVjdGNoaWxkOwotICAgIH0KLQotICBpZiAoY29yZV90ZXh0X3NwYWNlID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHBfbG93cGMgPCBzX2xvd3BjKQotICAgIHsKLSAgICAgIHBfbG93cGMgPSBzX2xvd3BjOwotICAgIH0KLSAgaWYgKHBfaGlnaHBjID4gc19oaWdocGMpCi0gICAgewotICAgICAgcF9oaWdocGMgPSBzX2hpZ2hwYzsKLSAgICB9Ci0gIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZGNhbGxdICVzOiAweCVseCB0byAweCVseFxuIiwKLQkJCSAgcGFyZW50LT5uYW1lLCBwX2xvd3BjLCBwX2hpZ2hwYykpOwotICBmb3IgKGluc3RydWN0cCA9ICh1bnNpZ25lZCBjaGFyICopIGNvcmVfdGV4dF9zcGFjZSArIHBfbG93cGM7Ci0gICAgICAgaW5zdHJ1Y3RwIDwgKHVuc2lnbmVkIGNoYXIgKikgY29yZV90ZXh0X3NwYWNlICsgcF9oaWdocGM7Ci0gICAgICAgaW5zdHJ1Y3RwICs9IGxlbmd0aCkKLSAgICB7Ci0gICAgICBsZW5ndGggPSAxOwotICAgICAgaWYgKCppbnN0cnVjdHAgPT0gQ0FMTFMpCi0JewotCSAgLyoKLQkgICAqICAgIG1heWJlIGEgY2FsbHMsIGJldHRlciBjaGVjayBpdCBvdXQuCi0JICAgKiAgICAgIHNraXAgdGhlIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgotCSAgICovCi0JICBEQkcgKENBTExERUJVRywKLQkgICAgICAgcHJpbnRmICgiW2ZpbmRjYWxsXVx0MHgleDpjYWxscyIsCi0JCSAgICAgICBpbnN0cnVjdHAgLSAodW5zaWduZWQgY2hhciAqKSBjb3JlX3RleHRfc3BhY2UpKTsKLQkgIGZpcnN0bW9kZSA9IHZheF9vcGVyYW5kbW9kZSAoKHN0cnVjdCBtb2RlYnl0ZSAqKSAoaW5zdHJ1Y3RwICsgbGVuZ3RoKSk7Ci0JICBzd2l0Y2ggKGZpcnN0bW9kZSkKLQkgICAgewotCSAgICBjYXNlIGxpdGVyYWw6Ci0JICAgIGNhc2UgaW1tZWRpYXRlOgotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGdvdG8gYm90Y2hlZDsKLQkgICAgfQotCSAgbGVuZ3RoICs9IHZheF9vcGVyYW5kbGVuZ3RoICgoc3RydWN0IG1vZGVieXRlICopIChpbnN0cnVjdHAgKyBsZW5ndGgpKTsKLQkgIG1vZGUgPSB2YXhfb3BlcmFuZG1vZGUgKChzdHJ1Y3QgbW9kZWJ5dGUgKikgKGluc3RydWN0cCArIGxlbmd0aCkpOwotCSAgREJHIChDQUxMREVCVUcsCi0JICAgICAgIHByaW50ZiAoIlx0Zmlyc3Qgb3BlcmFuZCBpcyAlcyIsIHZheF9vcGVyYW5kbmFtZSAoZmlyc3Rtb2RlKSk7Ci0JICAgICAgIHByaW50ZiAoIlx0c2Vjb25kIG9wZXJhbmQgaXMgJXNcbiIsIHZheF9vcGVyYW5kbmFtZSAobW9kZSkpKTsKLQkgIHN3aXRjaCAobW9kZSkKLQkgICAgewotCSAgICBjYXNlIHJlZ2RlZjoKLQkgICAgY2FzZSBieXRlZGlzcGRlZjoKLQkgICAgY2FzZSB3b3JkZGlzcGRlZjoKLQkgICAgY2FzZSBsb25nZGlzcGRlZjoKLQkgICAgY2FzZSBieXRlcmVsZGVmOgotCSAgICBjYXNlIHdvcmRyZWxkZWY6Ci0JICAgIGNhc2UgbG9uZ3JlbGRlZjoKLQkgICAgICAvKgotCSAgICAgICAqICAgIGluZGlyZWN0IGNhbGw6IGNhbGwgdGhyb3VnaCBwb2ludGVyCi0JICAgICAgICogICAgICBlaXRoZXIgICpkKHIpICAgYXMgYSBwYXJhbWV0ZXIgb3IgbG9jYWwKLQkgICAgICAgKiAgICAgICAgICAgICAgKHIpICAgICBhcyBhIHJldHVybiB2YWx1ZQotCSAgICAgICAqICAgICAgICAgICAgICAqZiAgICAgIGFzIGEgZ2xvYmFsIHBvaW50ZXIKLQkgICAgICAgKiAgICAgIFthcmUgdGhlcmUgb3RoZXJzIHRoYXQgd2UgbWlzcz8sCi0JICAgICAgICogICAgICAgZS5nLiBhcnJheXMgb2YgcG9pbnRlcnMgdG8gZnVuY3Rpb25zPz8/XQotCSAgICAgICAqLwotCSAgICAgIGFyY19hZGQgKHBhcmVudCwgJmluZGlyZWN0Y2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKLQkgICAgICBsZW5ndGggKz0gdmF4X29wZXJhbmRsZW5ndGggKAotCQkJCSAgKHN0cnVjdCBtb2RlYnl0ZSAqKSAoaW5zdHJ1Y3RwICsgbGVuZ3RoKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIGNhc2UgYnl0ZXJlbDoKLQkgICAgY2FzZSB3b3JkcmVsOgotCSAgICBjYXNlIGxvbmdyZWw6Ci0JICAgICAgLyoKLQkgICAgICAgKiAgICByZWd1bGFyIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcKLQkgICAgICAgKiAgICAgIGNoZWNrIHRoYXQgdGhpcyBpcyB0aGUgYWRkcmVzcyBvZiAKLQkgICAgICAgKiAgICAgIGEgZnVuY3Rpb24uCi0JICAgICAgICovCi0JICAgICAgZGVzdHBjID0gdmF4X3JlbGFkZHIgKChzdHJ1Y3QgbW9kZWJ5dGUgKikgKGluc3RydWN0cCArIGxlbmd0aCkpCi0JCS0gKGJmZF92bWEpIGNvcmVfdGV4dF9zcGFjZTsKLQkgICAgICBpZiAoZGVzdHBjID49IHNfbG93cGMgJiYgZGVzdHBjIDw9IHNfaGlnaHBjKQotCQl7Ci0JCSAgY2hpbGQgPSBzeW1fbG9va3VwICgmc3ltdGFiLCBkZXN0cGMpOwotCQkgIERCRyAoQ0FMTERFQlVHLAotCQkgICAgICAgcHJpbnRmICgiW2ZpbmRjYWxsXVx0ZGVzdHBjIDB4JWx4IiwgZGVzdHBjKTsKLQkJICAgICAgIHByaW50ZiAoIiBjaGlsZC0+bmFtZSAlcyIsIGNoaWxkLT5uYW1lKTsKLQkJICAgICAgIHByaW50ZiAoIiBjaGlsZC0+YWRkciAweCVseFxuIiwgY2hpbGQtPmFkZHIpOwotCQkgICAgKTsKLQkJICBpZiAoY2hpbGQtPmFkZHIgPT0gZGVzdHBjKQotCQkgICAgewotCQkgICAgICAvKgotCQkgICAgICAgKiAgICBhIGhpdAotCQkgICAgICAgKi8KLQkJICAgICAgYXJjX2FkZCAocGFyZW50LCBjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCQkgICAgICBsZW5ndGggKz0gdmF4X29wZXJhbmRsZW5ndGggKChzdHJ1Y3QgbW9kZWJ5dGUgKikKLQkJCQkJCSAgIChpbnN0cnVjdHAgKyBsZW5ndGgpKTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCSAgZ290byBib3RjaGVkOwotCQl9Ci0JICAgICAgLyoKLQkgICAgICAgKiAgICBlbHNlOgotCSAgICAgICAqICAgICAgaXQgbG9va2VkIGxpa2UgYSBjYWxscywKLQkgICAgICAgKiAgICAgIGJ1dCBpdCB3YXNuJ3QgdG8gYW55d2hlcmUuCi0JICAgICAgICovCi0JICAgICAgZ290byBib3RjaGVkOwotCSAgICBkZWZhdWx0OgotCSAgICBib3RjaGVkOgotCSAgICAgIC8qCi0JICAgICAgICogICAgc29tZXRoaW5nIGZ1bm55IGdvaW5nIG9uLgotCSAgICAgICAqLwotCSAgICAgIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZGNhbGxdXHRidXQgaXQncyBhIGJvdGNoXG4iKSk7Ci0JICAgICAgbGVuZ3RoID0gMTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9pbmNsdWRlL0NPUFlJTkcgYi9pbmNsdWRlL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTQ5YmUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9DT1BZSU5HCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0gQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgICAgICAgICAgICAgICAgICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCi1zb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcwotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KLXVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKLXRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKLWdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKLXNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKLXJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCi0oMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAotZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLXNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCi1hdXRob3JzJyByZXB1dGF0aW9ucy4KLQotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQotcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQotcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55Ci1wYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LgotDAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKLWEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCi11bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCi1yZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKLW1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Ci10aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAotZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKLWxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KLXRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQotaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCi1XaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKLXNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQotY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQotY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQotbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwotYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCi15b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KLSAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKLSAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKLSAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCi0gICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgotICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQotICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQotICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKLSAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcwotICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0Ci0gICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgotICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotDAotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQotd2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKLXVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgotU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQotICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucwotICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgotICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKLSAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KLSAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgotICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCi0gICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKLSAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCi0gICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCi1jb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQotYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCi1jb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCi1zcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKLWFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Ci1mb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKLWl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KLQotSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZwotYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAotYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCi1kaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0MCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0MCi0gIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKLW1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwotdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwotY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCi10aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucwotb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCi1iZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKLXRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uCi0KLSAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKLW1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCi1vZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCi1GT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KLU9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKLVBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECi1PUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwotVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQotUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCi1SRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCi1SRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAotSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCi1PVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECi1UTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKLVlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCi1QUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotDAotCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0Ci1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKLXRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDE5eXkgIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcwotd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKLQotICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgMTl5eSBuYW1lIG9mIGF1dGhvcgotICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KLSAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0Ci0gICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKLWJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQotbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQotICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCi1wcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQotY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCi1saWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9DaGFuZ2VMb2cgYi9pbmNsdWRlL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhZGY5Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDE1MjcgKzAsMCBAQAotMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChiZmRfZWxmX3ZlcnNpb25fZXhwcik6IFJlbmFtZSBgbWF0Y2gnIHRvIGBwYXR0ZXJuJy4KLQlBZGQgYG1hdGNoJyBjYWxsYmFjayBmdW5jdGlvbi4KLQotMTk5OS0wNC0xMCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChiZmRfbGlua19pbmZvKTogQWRkIG5vX3VuZGVmaW5lZC4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oOiBBZGQgcHJvdG90eXBlIGZvciBwcmludF9pbnNuX21jb3JlLgotCi0xOTk5LTA0LTAyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBzcGxheS10cmVlLmggKHNwbGF5X3RyZWVfY29tcGFyZV9wb2ludGVycyk6IERlY2xhcmUuCi0KLTE5OTktMDMtMzAgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuaCAoc3BsYXlfdHJlZV9jb21wYXJlX2ludHMpOiBEZWNsYXJlLgotCi1XZWQgTWFyIDI0IDEyOjQ2OjI5IDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYW15LmN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oIChiYXNlbmFtZSk6IEN5Z3dpbnssMzJ9IHNob3VsZCBoYXZlIHRoZSBwcm90b3R5cGUuCi0KLTE5OTktMDItMjIgIEppbSBMZW1rZSAgPGpsZW1rZUBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKGJmZF9saW5rX2luZm8pOiBhZGQgZmllbGQgIm1wYzg2MGMwIi4KLQotTW9uIEZlYiAgMSAyMTowNTo0NiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICogZGlzLWFzbS5oIChwcmludF9pbnNuX2kzODZfYXR0KTogIERlY2xhcmUuCi0gICAgICAgKHByaW50X2luc25faTM4Nl9pbnRlbCk6ICBEZWNsYXJlLgotCi05OTgtMTItMzAgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKElOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIKTogQ2FzdCBTVFJFQU0gYW5kCi0JRlBSSU5URl9GVU5DIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotCi1XZWQgRGVjIDMwIDE2OjA3OjE0IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IGNoYW5nZSB2b2lkICogdG8gUFRSICh0d28gcGxhY2VzKS4KLQotTW9uIERlYyAxNCAwOTo1MzozMSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGRlbWFuZ2xlLmg6IERvbid0IGNoZWNrIElOX0dDQyBhbnltb3JlLgotCSogc3BsYXktdHJlZS5oOiBMaWtld2lzZS4KLQotVHVlIERlYyAgOCAwMDozMDozMSAxOTk4ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+IAotCi0JVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBieSBFbGVuYSBaYW5ub25pCi0gCTxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4gYW5kIEVkaXRoIEVwc3RlaW4KLSAJPGVlcHN0ZWluQHNvcGhpYS5jeWdudXMuY29tPiBhcyBwYXJ0IG9mIGEgcHJvamVjdCB0byBtZXJnZSBpbgotIAljaGFuZ2VzIG1hZGUgYnkgSFA7IEhQIGRpZCBub3QgY3JlYXRlIENoYW5nZUxvZyBlbnRyaWVzLgotCi0JKiBkaXMtYXNtLmggKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvKTogY2hhbmdlIHRoZSB0eXBlIG9mIHN0cmVhbQotCWZyb20gRklMRSogdG8gdm9pZCosIGZvciB1c2Ugd2l0aCBnZGIncyBuZXcgdHlwZSBHREJfRklMRS4KLQkoZnByaW50Zl9mdHlwZSk6IGNoYW5nZSBGSUxFKiBwYXJhbWV0ZXIgdHlwZSB0byB2b2lkKi4KLQotICAgICAgICAqIGRlbWFuZ2xlLmg6IChETUdMX0VERyk6IG5ldyBtYWNybyBmb3IgS3VjayBhbmQgQXNzb2NpYXRlcwotICAgICAgICAoRE1HTF9TVFlMRV9NQVNLKTogbW9kaWZ5IHRvIGluY2x1ZGUgS3VjayBhbmQgQXNzb2Mgc3R5bGUKLSAgICAgICAgKGRlbWFuZ2xpbmdfc3R5bGVzKTogYWRkIG5ldyBlZGdfZGVtYW5nbGluZyBzdHlsZQotICAgICAgICAoRURHX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HKTogbmV3IG1hY3JvCi0gICAgICAgIChFREdfREVNQU5HTElORyk6IG5ldyBtYWNybwotCi0gICAgICAgICogZGVtYW5nbGUuaCAoRE1HTF9IUCk6IG5ldyBtYWNybywgZm9yIEhQL2FDQyBjb21waWxlci4KLSAgICAgICAgKERNR0xfU1RZTEVfTUFTSyk6IG1vZGlmeSB0byBpbmNsdWRlIG5ldyBIUCdzIHN0eWxlLgotICAgICAgICAoZGVtYW5nbGluZ19zdHlsZXMpOiBhZGQgbmV3IGhwX2RlbWFuZ2xpbmcgdmFsdWUuCi0gICAgICAgIChIUF9ERU1BTkdMSU5HX1NUWUxFX1NUUklORyk6IG5ldyBtYWNyby4KLSAgICAgICAgKEFSTV9ERU1BTkdMSU5HKTogY29lcmNlIHRvIGludC4KLSAgICAgICAgKEhQX0RFTUFOR0xJTkcpOiBuZXcgbWFjcm8uCi0KLQkqIGhwLXN5bXRhYi5oOiByZXdyaXR0ZW4sIGZyb20gSFAuCi0JKHF1aWNrX3Byb2NlZHVyZSk6IGNoYW5nZSB0eXBlIG9mIGxhbmd1YWdlIGZpZWxkIHRvIHVuc2lnbmVkIGludAotCShxdWlja19tb2R1bGUpOiBjaGFuZ2UgdHlwZSBvZiBsYW5ndWFnZSBmaWVsZCB0byB1bnNpZ25lZCBpbnQKLQkoc3RydWN0IGRudHRfdHlwZV9zdmFyKTogYWRkIGZpZWxkIHRocmVhZF9zcGVjaWZpYy4KLQkoaHBfbGFuZ3VhZ2UpOiBhZGQgbGFuZ3VhZ2VzIG1vZGNhbCBhbmQgZG1wYXNjYWwuCi0KLU1vbiBOb3YgMzAgMTU6MjU6NTggMTk5OCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBlbGYvc2guaCAoZWxmX3NoX3JlbG9jX3R5cGUpOiBBZGQgUl9TSF9GSVJTVF9JTlZBTElEX1JFTE9DLAotCVJfU0hfTEFTVF9JTlZBTElEX1JFTE9DLCBSX1NIX1NXSVRDSDggYW5kIFJfU0hfbWF4LgotCi1GcmkgTm92IDIwIDEzOjE0OjAwIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKGJhc2VuYW1lKTogQWRkIHByb3RvdHlwZSBmb3IgRnJlZUJTRC4KLQotRnJpIE5vdiAxMyAxOToxOToxMSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+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+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcyk6IEZpeCBjb21tZW50cyBmb3IKLQltdWx0aXBsZV9jb21tb24gZmllbGQuCi0KLVN1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogYW91dC9hb3V0NjQuaDogT25seSBkZWZpbmUgUU1BR0lDIGlmIGl0IGlzbid0IGFscmVhZHkgZGVmaW5lZC4KLQotCSogZGlzLWFzbS5oOiBBZGQgc3VwcG9ydCBmb3IgdGhlIEFSTS4KLQotV2VkIEF1ZyAxMCAxMjo1MTo0MSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBsaWJpYmVydHkuaCAoc3Ryc2lnbmFsKTogRG9jdW1lbnQgaXRzIGV4aXN0ZW5jZSBldmVuIGlmIHdlCi0JY2FuJ3QgZGVjbGFyZSBpdC4KLQotVHVlIEF1ZyAgMiAxNDo0MDowMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogb3M5ay5oOiBSZW1vdmUgdV9pbnQxNiwgdV9pbnQzMiwgYW5kIG93bmVyX2lkIHR5cGVkZWZzIGFuZAotCWV4cGFuZCB0aGVpciB1c2VzLiAgVGhvc2UgbmFtZXMgY29uZmxpY3Qgd2l0aCBNYWNoIGhlYWRlcnMuCi0KLUZyaSBKdWwgMjIgMTQ6MTc6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KTogQ2hhbmdlIHUuYy5zaXplIGludG8gYQotCWJpdGZpZWxkLiAgQWRkIGZpZWxkIHUuYy5hbGlnbm1lbnRfcG93ZXIuCi0KLVN1biBKdWwgMTAgMDA6MjY6MzkgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCi0KLQkqIGRpcy1hc20uaDogQWRkIHByaW50X2luc25fbnMzMmsgZGVjbGFyYXRpb24uCi0KLU1vbiBKdW4gMjAgMTc6MTM6MjkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmggKGJmZF9saW5rX2hhc2hfdGFibGUpOiBNYWtlIGNyZWF0b3IgYSBjb25zdCBwb2ludGVyLgotCi1TYXQgSnVuIDE4IDE2OjA5OjMyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogZGVtYW5nbGUuaCAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogRGVjbGFyZS4KLQotVGh1IEp1biAxNiAxNToxOTowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBBZGQgbmV3IGZpZWxkIHNoYXJlZC4KLQotTW9uIEp1biAgNiAxNDozOTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkpOiBSZW1vdmUgd3JpdHRlbiBmaWVsZDoKLQlub3QgbmVlZGVkIGZvciBhbGwgYmFja2VuZHMuCi0KLVRodSBBcHIgMjggMTk6MDY6NTAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZXIpOiBEZWNsYXJlLgotCi1GcmkgQXByICAxIDAwOjM4OjE3IDE5OTQgIEppbSBXaWxzb24gICh3aWxzb25AbW9sZS5nbnUuYWkubWl0LmVkdSkKLQotICAgICAgICAqIG9ic3RhY2suaDogRGVsZXRlIHVzZSBvZiBJTl9HQ0MgdG8gY29udHJvbCB3aGV0aGVyCi0gICAgICAgIHN0ZGRlZi5oIG9yIGdzdGRkZWYuaCBpcyBpbmNsdWRlZC4KLQotVHVlIE1hciAyMiAxMzowNjowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoZW51bSBiZmRfbGlua19vcmRlcl90eXBlKTogQWRkIGJmZF9kYXRhX2xpbmtfb3JkZXIuCi0JKHN0cnVjdCBiZmRfbGlua19vcmRlcik6IEFkZCBkYXRhIGZpZWxkIHRvIHVuaW9uLgotCi1Nb24gTWFyIDIxIDE4OjQ1OjI2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogQ2hhbmdlIGJpdHNpemUgYXJndW1lbnQKLQl0byBhZGRfdG9fc2V0IHRvIHJlbG9jLiAgUmVtb3ZlIGJpdHNpemUgYXJndW1lbnQgZnJvbSBjb25zdHJ1Y3Rvci4KLQlDb21tZW50IHRoYXQgcmVsb2Nfb3ZlcmZsb3csIHJlbG9jX2Rhbmdlcm91cyBhbmQgdW5hdHRhY2hlZF9yZWxvYwotCW11c3QgaGFuZGxlIE5VTEwgcG9pbnRlcnMgZm9yIHJlbG9jIGxvY2F0aW9uLgotCShlbnVtIGJmZF9saW5rX29yZGVyX3R5cGUpOiBBZGQgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciBhbmQKLQliZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIuCi0JKHN0cnVjdCBiZmRfbGlua19vcmRlcik6IEFkZCByZWxvYyBmaWVsZCB0byB1bmlvbi4KLQkoc3RydWN0IGJmZF9saW5rX29yZGVyX3JlbG9jKTogRGVmaW5lLgotCi1Nb24gTWFyIDE0IDEyOjI3OjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaWVlZS1mbG9hdC5oOiBSZW1vdmVkOyBubyBsb25nZXIgdXNlZC4KLQotVHVlIE1hciAgMSAxODoxMDo0OSAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBvczlrLmg6IG9zOTAwMCB0YXJnZXQgc3BlY2lmaWMgaGVhZGVyIGZpbGUsIHRoZSBoZWFkZXIgb2YgdGhlCi0Jb2JqZWN0IGZpbGUgaXMgdXNlZCBub3cuCi0KLVN1biBGZWIgMjcgMjE6NTI6MjYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGZsb2F0Zm9ybWF0Lmg6IE5ldyBmaWxlLCBpbnRlbmRlZCB0byByZXBsYWNlIGllZWUtZmxvYXQuaC4KLQotU3VuIEZlYiAyMCAxNzoxNTo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogYW5zaWRlY2wuaCAoQU5TSV9QUk9UT1RZUEVTKTogRGVmaW5lIGlmIHVzaW5nIEFOU0kgcHJvdG90eXBlcy4KLQotV2VkIEZlYiAxNiAwMTowNzoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmliZXJ0eS5oOiBEb24ndCBkZWNsYXJlIHN0cnNpZ25hbCwgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGgKLQlTb2xhcmlzIHN5c3RlbSBoZWFkZXIgZmlsZXMuCi0KLVNhdCBGZWIgMTIgMjI6MTE6MzIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGxpYmliZXJ0eS5oICh4ZXhpdCk6IFVzZSBfX3ZvbGF0aWxlX18gdG8gYXZvaWQgbG9zaW5nIGlmCi0JY29tcGlsaW5nIHdpdGggZ2NjIC10cmFkaXRpb25hbC4KLQotVGh1IEZlYiAxMCAxNDowNTo0MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxpYmliZXJ0eS5oOiBOZXcgZmlsZS4gIERlY2xhcmVzIGZ1bmN0aW9ucyBwcm92aWRlZCBieQotCWxpYmliZXJ0eS4KLQotVHVlIEZlYiAgOCAwNToxOTo1MiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQlIYW5kbGUgb2JzdGFja19jaHVua19hbGxvYyByZXR1cm5pbmcgTlVMTC4gIFRoaXMgYWxsb3dzCi0Jb2JzdGFja3MgdG8gYmUgdXNlZCBieSBsaWJyYXJpZXMsIHdpdGhvdXQgZm9yY2luZyB0aGVtCi0JdG8gY2FsbCBleGl0IG9yIGxvbmdqbXAuCi0JKiBvYnN0YWNrLmggKHN0cnVjdCBvYnN0YWNrKTogQWRkIGFsbG9jX2ZhaWxlZCBmbGFnLgotCV9vYnN0YWNrX2JlZ2luLCBfb2JzdGFja19iZWdpbl8xKTogRGVjbGFyZSB0byByZXR1cm4gaW50LCBub3Qgdm9pZC4KLQkob2JzdGFja19maW5pc2gpOiBJZiBhbGxvY19mYWlsZWQsIHJldHVybiBOVUxMLgotCShvYnN0YWNrX2Jhc2UsIG9ic3RhY2tfbmV4dF9mcmVlLCBvYmpzdGFja19vYmplY3Rfc2l6ZSk6Ci0JSWYgYWxsb2NfZmFpbGVkLCByZXR1cm4gMC4KLQkob2JzdGFja19ncm93LCBvYnN0YWNrX2dyb3cwLCBvYnN0YWNrXzFncm93LCBvYnN0YWNrX3B0cl9ncm93LAotCW9ic3RhY2tfaW50X2dyb3csIG9ic3RhY2tfYmxhbmspOiBJZiBhbGxvY19mYWlsZWQsIGRvIG5vdGhpbmcgdGhhdAotCWNvdWxkIGNvcnJ1cHQgdGhlIG9ic3RhY2suCi0KLU1vbiBKYW4gMjQgMTU6MDY6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19jYWxsYmFja3MpOiBBZGQgbmFtZSwgcmVsb2NfbmFtZSBhbmQKLQlhZGRlbmQgYXJnbWVudHMgdG8gcmVsb2Nfb3ZlcmZsb3cgY2FsbGJhY2suCi0KLUZyaSBKYW4gMjEgMTk6MTM6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fYmlnX3Bvd2VycGMsIHByaW50X2luc25fbGl0dGxlX3Bvd2VycGMsCi0JcHJpbnRfaW5zbl9yczYwMDApOiBEZWNsYXJlLgotCi1UaHUgSmFuICA2IDE0OjE1OjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogQWRkIGJpdHNpemUgYXJndW1lbnQgdG8KLQlhZGRfdG9fc2V0IGZpZWxkLiAgQWRkIG5ldyBjYWxsYmFjayBuYW1lZCBjb25zdHJ1Y3Rvci4KLQotVGh1IERlYyAzMCAxMDo0NDowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmg6IE5ldyBmaWxlIGZvciBuZXcgQkZEIGxpbmtlciBiYWNrZW5kIHJvdXRpbmVzLgotCi1Nb24gTm92IDI5IDEwOjQzOjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChlbnVtIGRpc19pbnNuX3R5dXBlKTogUmVtb3ZlIG5vbi1BTlNJIHRyYWlsaW5nIGNvbW1hLgotCi1TYXQgT2N0ICAyIDIwOjQyOjI2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6IE1vdmUgY29tbWVudCB0byByaWdodCBwbGFjZS4KLQotTW9uIEF1ZyAgOSAxOTowMzozNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suaCAob2JzdGFja19jaHVua2Z1biwgb2JzdGFja19mcmVlZnVuKTogQWRkIGRlZm5zIGZyb20KLQlwcmV2aW91cyB2ZXJzaW9uLiAgQXJlIHRoZXNlIEN5Z251cyBsb2NhbCBjaGFuZ2VzPwotCi1GcmkgQXVnICA2IDE3OjA1OjQ3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmgsIG9ic3RhY2suaDogVXBkYXRlIHRvIGxhdGVzdCBGU0YgdmVyc2lvbi4KLQotTW9uIEF1ZyAgMiAxNjozNzoxNCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmL2kzODYuaDogIEFkZCBMeW54IG1hZ2ljIG51bWJlci4KLQotTW9uIEF1ZyAgMiAxNDo0NToyOSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiAgTW92ZSBlbnVtIG91dHNpZGUgb2Ygc3RydWN0IGRlZm4gdG8gYXZvaWQgd2FybmluZ3MuCi0KLU1vbiBBdWcgIDIgMDg6NDk6MzAgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogd2FpdC5oIChXRVhJVFNUQVRVUywgV1NUT1BTSUcpOiBNYXNrIGRvd24gdG8gOCBiaXRzLiAgVGhpcyBpcwotCWZvciBzeXN0ZW1zIHRoYXQgc3RvcmUgc3R1ZmYgaW50byB0aGUgaGlnaCAxNiBiaXRzIG9mIGEgd2FpdAotCXN0YXR1cy4KLQotRnJpIEp1bCAzMCAxODozODowMiAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiAgQWRkIG5ldyBmaWVsZHMgaW5zbl9pbmZvX3ZhbGlkLCBicmFuY2hfZGVsYXlfaW5zbnMsCi0JZGF0YV9zaXplLCBpbnNuX3R5cGUsIHRhcmdldCwgdGFyZ2V0Mi4gIFRoZXNlIGFyZSB1c2VkIHRvIHJldHVybgotCWluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RydWN0aW9uIGRlY29kZXJzIGJhY2sgdG8gdGhlIGNhbGxpbmcKLQlwcm9ncmFtLiAgQWRkIGNvbW1lbnRzLCBtYWtlIG1vcmUgcmVhZGFibGUuCi0KLU1vbiBKdWwgMTkgMjI6MTQ6MTQgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG5sbTogIE5ldyBkaXJlY3RvcnkgY29udGFpbmluZyBOTE0vTmV0V2FyZSBpbmNsdWRlcy4KLQotVGh1IEp1bCAxNSAxMjoxMDowNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaCAoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8pOiBOZXcgZmllbGQgYXBwbGljYXRpb25fZGF0YS4KLQotVGh1IEp1bCAxNSAxMjo0MToxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogQWRkZWQgZGVjbGFyYXRpb24gb2YgcHJpbnRfaW5zbl9tODhrLgotCi1UaHUgSnVsICA4IDA5OjA1OjI2IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIG9wY29kZS9oODMwMC5oOiBMb3RzIG9mIGxpdHRsZSBmaXhlcyBmb3IgdGhlIGg4LzMwMGguCi0KLUZyaSBKdWwgIDIgMTA6MzE6NTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhbnNpZGVjbC5oOiBVc2UgQU5TSSBtYWNyb3MgaWYgX19taXBzIGFuZCBfU1lTVFlQRV9TVlI0IGFyZQotCWRlZmluZWQsIHNpbmNlIFJJU0MvT1MgY2MgaGFuZGxlcyBBTlNJIGRlY2xhcmF0aW9ucyBpbiBTVlI0IG1vZGUKLQlidXQgZG9lcyBub3QgZGVmaW5lIF9fU1REQ19fLgotCi1TdW4gSnVuIDIwIDE4OjI3OjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6IERvbid0IG5lZWQgdG8gaW5jbHVkZSBhbnNpZGVjbC5oIGFueSBtb3JlLgotCi1GcmkgSnVuIDE4IDAzOjIyOjEwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBvYXN5cy5oOiAgRWxpbWluYXRlICJpbnQ4X3R5cGUiLCAiaW50MTZfdHlwZSIsICJpbnQzMl90eXBlIiwgYW5kCi0JdGhlaXIgdmFyaWFudHMuICBUaGVzZSBjaGFuZ2VzIGFyZSBjb29yZGluYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcKLQljaGFuZ2VzIGluIC4uL2JmZC9vYXN5cy5jLgotCi1XZWQgSnVuIDE2IDEwOjQzOjA4IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIE5vdGUgdGhhdCBpdCBoYXMgYmVlbiByZW1vdmVkLgotCi1UdWUgSnVuICA4IDEyOjE2OjAzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkgU3VwcG9ydCBmb3IgSDgvMzAwLUgKLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9oODMwMCwgcHJpbnRfaW5zbl9oODMwMGgpOiBEZWNsYXJlIGl0LgotCSogY29mZi9oODMwMC5oOiBOZXcgbWFnaWMgbnVtYmVyLgotCSogY29mZi9pbnRlcm5hbC5oOiBOZXcgcmVsb2NhdGlvbnMuCi0JKiBvcGNvZGUvaDgzMDAuaDogTG90cyBvZiBuZXcgb3Bjb2Rlcy4KLQotVHVlIEp1biAgMSAwNzozNTowMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogYW5zaWRlY2wuaCAoY29uc3QpOiBEb24ndCBkZWZpbmUgaXQgaWYgaXQncyBhbHJlYWR5IGRlZmluZWQuCi0KLVRodSBNYXkgMjcgMTg6MTk6NTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25faHBwYSk6IERlY2xhcmUgaXQuCi0KLQkqIGJmZC5oOiBNb3ZlZCB0byBiZmQgZGlyZWN0b3J5LiAgU21hbGwgc3R1YiBoZXJlIGluY2x1ZGVzIGl0Ci0Jd2l0aG91dCByZXF1aXJpbmcgIi1JLi4vYmZkIi4KLQotVGh1IEFwciAyOSAxMjowNjoxMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZWQgd2l0aCBCU0ZfRlVOQ1RJT04uCi0KLU1vbiBBcHIgMjYgMTg6MTU6NTAgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oLCBkaXMtYXNtLmg6IFVwZGF0ZWQgd2l0aCBIaXRhY2hpIFNILgotCi1GcmkgQXByIDIzIDE4OjQxOjM4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlZCB3aXRoIGFscGhhIGNoYW5nZXMuCi0JKiBkaXMtYXNtLmg6IEFkZGVkIGFscGhhLgotCi1GcmkgQXByIDE2IDE3OjM1OjMwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlIGZvciBzaWduZWQgYmZkXypnZXRfKi4KLQotVGh1IEFwciAxNSAwOToyNDoyMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZWQgZm9yIGZpbGVfdHJ1bmNhdGVkIGVycm9yLgotCi1UaHUgQXByICA4IDEwOjUzOjQ3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYW5zaWRlY2wuaDogSWYgbm8gQU5TSSwgZGVmaW5lIGNvbnN0IHRvIGJlIGVtcHR5LgotCi1UaHUgQXByICAxIDA5OjAwOjEwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6IERlY2xhcmUgYTI5ayBhbmQgaTk2MCBwcmludF9pbnNuXyouCi0KLQkqIGRpcy1hc20uaDogQWRkIHByaW50X2FkZHJlc3NfZnVuYyBhbmQgcmVsYXRlZCBzdHVmZi4KLQotCSogZGlzLWFzbS5oIChkaXNfYXNtX3JlYWRfbWVtb3J5KTogRml4IHByb3RvdHlwZS4KLQotV2VkIE1hciAzMSAxNzo0MDoxNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiBBZGQgcHJpbnRfaW5zbl9zcGFyYy4KLQotV2VkIE1hciAzMSAxNzo1MTo0MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGVkIGZvciBCRkRfUkVMT0NfTUlQU19HUFJFTCBhbmQgYmZkX1tnc11ldF9ncF9zaXplCi0JcHJvdG90eXBlcy4KLQotV2VkIE1hciAzMSAxNjozNToxMiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6IChkaXNhc3NlbWJsZV9pbmZvKTogIEZpeCB0eXBvIGluIHByb3RvdHlwZSBvZgotCWRpc19hc21fbWVtb3J5X2Vycm9yKCkuCi0KLVR1ZSBNYXIgMzAgMTk6MDk6MjMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaCAoZGlzYXNzZW1ibGVyX2luZm8pOiBBZGQgcmVhZF9tZW1vcnlfZnVuYywKLQltZW1vcnlfZXJyb3JfZnVuYywgYnVmZmVyLCBhbmQgbGVuZ3RoLgotCSh7R0RCXyx9SU5JVF9ESVNBU1NFTUJMRV9JTkZPKTogU2V0IHRoZW0uCi0JcHJpbnRfaW5zbl8qOiBSZW1vdmUgc2Vjb25kIGFyZ3VtZW50LgotCi1UdWUgTWFyIDMwIDE0OjQ4OjU1IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlIGZvciBsbWEgZmllbGQgb2Ygc2VjdGlvbi4KLQotVHVlIE1hciAzMCAxMjoyMjo1NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogYW5zaWRlY2wuaDogVXNlIEFOU0kgdmVyc2lvbnMgb24gQUlYIHJlZ2FyZGxlc3Mgb2YgX19TVERDX18uCi0KLUZyaSBNYXIgMTkgMTQ6NDk6NDkgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogQWRkIGg4NTAwLgotCi1UaHUgTWFyIDE4IDEzOjQ5OjA5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogaWVlZS1mbG9hdC5oOiAgTW92ZWQgZnJvbSAuLi9nZGIuCi0JKiBkaXMtYXNtLmg6ICBOZXcgZmlsZS4gIEludGVyZmFjZSB0byBkaXMtYXNzZW1ibGVyLgotCi1UaHUgTWFyIDExIDEwOjUyOjU3IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBkZW1hbmdsZS5oIChETUdMX05PX09QVFMpOiAgQWRkIGRlZmluZSAoc2V0IHRvIDApIHRvIHVzZQotCWluIHBsYWNlIG9mIGJhcmUgMCwgZm9yIHJlYWRhYmlsaXR5IHJlYXNvbnMuCi0KLVR1ZSBNYXIgIDIgMTc6NTA6MTEgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGRlbWFuZ2xlLmg6ICBSZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIGNmcm9udCB3aXRoIEFSTS4KLQotVHVlIEZlYiAyMyAxMjoyMToxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGUgZm9yIG5ldyBlbGVtZW50cyBpbiBKVU1QX1RBQkxFLgotCi1UdWUgRmViIDE2IDAwOjUxOjMwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIFVwZGF0ZSBmb3IgQkZEX1ZFUlNJT04gMi4xLgotCi1UdWUgSmFuIDI2IDExOjQ5OjIwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZSBmb3IgU0VDX0lTX0NPTU1PTiBmbGFnLgotCi1UdWUgSmFuIDE5IDEyOjI1OjEyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZSBmb3IgYmZkX2FzeW1ib2xfdmFsdWUgYnVnIGZpeC4KLQotRnJpIEphbiAgOCAxNjozNzoxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGUgdG8gaW5jbHVkZSBFQ09GRiB0ZGF0YSBhbmQgdGFyZ2V0X2ZsYXZvdXIuCi0KLVN1biBEZWMgMjcgMTc6NTI6MzAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgQWRkIGRlY2xhcmF0aW9uIGZvciBiZmRfZ2V0X3NpemUoKS4KLQotVHVlIERlYyAyMiAyMjo0Mjo0NiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZGVtYW5nbGUuaDogIFByb3RlY3QgZmlsZSBmcm9tIG11bHRpcGxlIGluY2x1c2lvbnMgd2l0aAotCSNpZiAhZGVmaW5lZChERU1BTkdMRV9IKS4uLiNkZWZpbmUgREVNQU5HTEVfSC4uLiNlbmRpZi4KLQotTW9uIERlYyAyMSAyMToyNTo1MCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIFVwZGF0ZSB0byBnZXQgaHBwYV9jb3JlX3N0cnVjdCBmcm9tIGJmZC5jLgotCi1UaHUgRGVjIDE3IDAwOjQyOjM1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIFVwZGF0ZSB0byBnZXQgdGVraGV4IHRkYXRhIG5hbWUgY2hhbmdlIGZyb20gYmZkLgotCi1Nb24gTm92ICA5IDIzOjU1OjQyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhbnNpZGVjbC5oOiAgVXBkYXRlIGNvbW1lbnRzIHRvIGRpc2NvdXJhZ2UgdXNlIG9mIEVYRlVOLgotCi1UaHUgTm92ICA1IDE2OjM1OjQ0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZSB0byBicmluZyBpbiBTRUNfU0hBUkVEX0xJQlJBUlkuCi0KLVRodSBOb3YgIDUgMDM6MjE6MzIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgVXBkYXRlIHRvIG1hdGNoIEVYRlVOLCBiZmRfc2VjbGV0X3N0cnVjdCwgYW5kIFNERUYKLQljbGVhbnVwcyBpbiBiZmQuCi0KLVdlZCBOb3YgIDQgMDc6Mjg6MDUgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGJvdXQuaCAoTl9DQUxMTkFNRSwgTl9CQUxOQU1FKTogRGVmaW5lIGFzIGNoYXItdHlwZSB2YWx1ZXMsIHNvCi0Jd2lkZW5pbmcgd29ya3MgY29uc2lzdGVudGx5LgotCi1GcmkgT2N0IDE2IDAzOjE3OjA4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuaDogIFVwZGF0ZSB0byBSZXZpc2VkIFN0YW5kYXJkIEZTRiBWZXJzaW9uLgotCi1UaHUgT2N0IDE1IDIxOjQzOjIyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmggKHN0cnVjdCBvcHRpb24pOiB1c2UgdGhlIHByb3ZpZGVkIGVudW0gZm9yIGhhc19hcmcuCi0KLQkqIGRlbWFuZ2xlLmggKEFVVE9fREVNQU5HTElORywgR05VX0RFTUFOR0xJTkcsCi0JICBMVUNJRF9ERU1BTkdMSU5HKTogdWx0cml4IGNvbXBpbGVycyByZXF1aXJlIGVudW1zIHRvIGJlCi0JICBlbnVtcyBhbmQgaW50cyB0byBiZSBpbnRzIGFuZCBjYXN0cyB3aGVyZSB0aGV5IG1lZXQuICBjYXN0IHNvbWUKLQkgIGVudW1zIGludG8gaW50cy4KLQotVGh1IE9jdCAxNSAwNDozNTo1MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBVcGRhdGUgYWZ0ZXIgY29tbWVudCBjaGFuZ2VzLgotCi1UaHUgT2N0ICA4IDA5OjAzOjAyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuaCAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyKTogbmV3IG1hY3JvIGZvciBnZXR0aW5nIGluIHh2ZWMKLQotVGh1IFNlcCAgMyAwOToxMDo1MCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaCAoc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCk6ICBzaXplIG5lZWRzIHRvIGJlIHNpZ25lZCBpZgotCWl0J3MgZ29pbmcgdG8gaG9sZCBuZWdhdGl2ZSB2YWx1ZXMuCi0KLVN1biBBdWcgMzAgMTc6NTA6MjcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBkZW1hbmdsZS5oOiAgTmV3IGZpbGUsIG1vdmVkIGZyb20gLi4vZ2RiLiAgTWFkZSBpbmRlcGVuZGVudAotCW9mIGdkYi4gIEFsbG93IGRlbWFuZ2xpbmcgc3R5bGUgb3B0aW9uIHRvIGJlIHBhc3NlZCBhcyBhCi0JcGFyYW1ldGVyIHRvIGNwbHVzX2RlbWFuZ2xlKCksIGJ1dCB1c2luZyB0aGUKLQljdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgZ2xvYmFsIGFzIHRoZSBkZWZhdWx0LgotCi1TYXQgQXVnIDI5IDEwOjA3OjU1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmg6ICBNZXJnZSBjb21tZW50IGNoYW5nZSBmcm9tIGN1cnJlbnQgRlNGIHZlcnNpb24uCi0KLVRodSBBdWcgMjcgMTI6NTk6MjkgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IGFkZCB3ZTMyawotCi1UdWUgQXVnIDI1IDE1OjA3OjQ3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuaDogbmV3IGFmdGVyIFo4MDAwIHN0dWZmCi0KLU1vbiBBdWcgMTcgMDk6MDE6MjMgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBSZWdlbmVyYXRlZCBhZnRlciBwYWdlL3NlZ21lbnQgc2l6ZSBjaGFuZ2VzLgotCi1TYXQgQXVnICAxIDEzOjQ2OjMxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmg6IE1lcmdlIGNoYW5nZXMgZnJvbSBjdXJyZW50IEZTRiB2ZXJzaW9uLgotCi1Nb24gSnVsIDIwIDIxOjA2OjIzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmggKGFyZWFfaWQsIGZsYWdzKTogIFJlbW92ZSwgcmVwbGFjZSB3aXRoIGV4dHJhX2FyZywKLQl1c2VfZXh0cmFfYXJnLCBhbmQgbWF5YmVfZW1wdHlfb2JqZWN0LgotCSogb2JzdGFjay5oIChPQlNUQUNLX01BWUJFX0VNUFRZX09CSkVDVCwgT0JTVEFDS19NTUFMTE9DX0xJS0UpOgotCVJlbW92ZSwgcmVwbGFjZWQgYnkgbWF5YmVfZW1wdHlfb2JqZWN0IGFuZCB1c2VfZXh0cmFfYXJnIGJpdGZpZWxkcy4KLQkqIG9ic3RhY2suaCAob2JzdGFja19mdWxsX2JlZ2luLCBfb2JzdGFja19iZWdpbik6ICBSZW1vdmUgYXJlYV9pZAotCWFuZCBmbGFncyBhcmd1bWVudHMuCi0JKiBvYnN0YWNrLmggKG9ic3RhY2tfYWxsb2NfYXJnKTogIE5ldyBtYWNybyB0byBzZXQgZXh0cmFfYXJnLgotCi1UaHUgSnVsIDE2IDA4OjEyOjQ0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuaDogbmV3IGFmdGVyIGFkZGluZyBCRkRfSVNfUkVMQVhBQkxFCi0KLVNhdCBKdWwgIDQgMDM6MjI6MjMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgUmVnZW4gYWZ0ZXIgYWRkaW5nIEJTRl9GSUxFLgotCi1Nb24gSnVuIDI5IDE0OjE4OjM2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBzdW5maXNoKQotCi0JKiBvYnN0YWNrLmg6ICBDb252ZXJ0IGJjb3B5KCkgdXNlIHRvIG1lbWNweSgpLCB3aGljaCBpcyBtb3JlCi0JcG9ydGFibGUsIG1vcmUgc3RhbmRhcmQsIGFuZCBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YgZ2NjJ3MgYnVpbHRpbgotCWZ1bmN0aW9ucyBmb3IgaW5jcmVhc2VkIHBlcmZvcm1hbmNlLgotCi1UaHUgSnVuIDI1IDA0OjQ2OjA4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhbnNpZGVjbC5oIChQQVJBTVMpOiAgSW5jb3Jwb3JhdGUgdGhpcyBtYWNybyBmcm9tIGdkYidzIGRlZnMuaC4KLQlJdCdzIGEgY2xlYW5lciB3YXkgdG8gZm9yd2FyZC1kZWNsYXJlIGZ1bmN0aW9uIHByb3RvdHlwZXMuCi0KLUZyaSBKdW4gMTkgMTU6NDY6MzIgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBIUFBBIG1lcmdlLgotCi1UdWUgSnVuIDE2IDIxOjMwOjU2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuaDogZ3JhdHVpdG91cyB3aGl0ZSBzcGFjZSBjaGFuZ2VzIG1lcmdlZCBmcm9tIG90aGVyIHByZXAKLQkgIHJlbGVhc2VzLgotCi1UaHUgSnVuIDExIDAxOjEwOjU1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIFJlZ2VuJ2QgZnJvbSBiZmQuYyBhZnRlciByZW1vdmluZyBlbGZfY29yZV90ZGF0YV9zdHJ1Y3QuCi0KLU1vbiBNYXkgMTggMTc6Mjk6MDMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5oOiBtZXJnZWQgY2hhbmdlcyBmcm9tIG1ha2UtMy42Mi4xMS4KLQotCSogZ2V0b3B0Lmg6IG1lcmdlZCBjaGFuZ2VzIGZyb20gZ3JlcC0xLjYgKGFscGhhKS4KLQotRnJpIE1heSAgOCAxNDo1MzozMiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0Lmg6IG1lcmdlZCBjaGFuZ2VzIGZyb20gYmlzb24tMS4xOC4KLQotU2F0IE1hciAxNCAxNzoyNToyMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5oOiAgQWRkICJhcmVhX2lkIiBhbmQgImZsYWdzIiBtZW1iZXJzIHRvIG9ic3RhY2sKLQlzdHJ1Y3R1cmUuICBBZGQgb2JzdGFja19jaHVua2Z1bigpIGFuZCBvYnN0YWNrX2ZyZWVmdW4oKSB0bwotCXNldCBmdW5jdGlvbnMgZXhwbGljaXRseS4gIENvbnZlcnQgbWF5YmVfZW1wdHlfb2JqZWN0IHRvCi0JYSBiaXQgaW4gImZsYWdzIi4KLQotVGh1IEZlYiAyNyAyMjowMTowMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogd2FpdC5oIChXSUZTVE9QUEVEKTogIEFkZCBJQk0gcnM2MDAwLXNwZWNpZmljIHZlcnNpb24uCi0KLUZyaSBGZWIgMjEgMjA6NDk6MjAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suaDogIEFkZCBvYnN0YWNrX2Z1bGxfYmVnaW4uCi0JKiBiZmQuaCwgb2JzdGFjay5oOiAgUHJvdG9saW50LgotCi1UaHUgSmFuIDMwIDAxOjE4OjQyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIFJlbW92ZSBjb21tYSBmcm9tIGVudW0gZGVjbGFyYXRpb24uCi0KLU1vbiBKYW4gMjcgMjI6MDE6MTMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmggOiBuZXcgdGFyZ2V0IGVudHIsIGJmZF9yZWxheF9zZWN0aW9uCi0KLVdlZCBEZWMgMTggMTc6MTk6NDQgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmgsIGllZWUuaCwgb3Bjb2RlL202OGsuaCwgb3Bjb2RlL3NwYXJjLmg6ICBBTlNJZnkgZW51bXMuCi0KLVRodSBEZWMgMTIgMjA6NTk6NTYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGZvcGVuLXNhbWUuaCwgZm9wZW4tYmluLmg6ICBOZXcgZmlsZXMgZm9yIGNvbmZpZ3VyaW5nCi0Jd2hldGhlciBmb3BlbiBkaXN0aW5ndWlzaGVzIGJpbmFyeSBmaWxlcyBvciBub3QuICBGb3IgdXNlCi0JYnkgaG9zdC1kZXBlbmRlbnQgY29uZmlnIGZpbGVzLgotCi1TYXQgTm92IDMwIDIwOjQ2OjQzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBiZmQuaDogY2hhbmdlIHRoZSBkb2N1bWVudGF0aW9uIGZvcm1hdC4KLQotCSogY3JlYXRlZCBjb2ZmLCBlbGYgYW5kIG9wY29kZSBhbmQgYW91dCBkaXJlY3Rvcmllcy4gTW92ZWQ6Ci0KLQlhb3V0NjQuaAk9PT4gYW91dC9hb3V0NjQuaAotCWFyLmgJCT09PiBhb3V0L2FyLmgKLQlhLm91dC5lbmNhcC5oCT09PiBhb3V0L2VuY2FwLmgKLQlhLm91dC5ob3N0LmgJPT0+IGFvdXQvaG9zdC5oCi0JYS5vdXQuaHAuaAk9PT4gYW91dC9ocC5oCi0JYS5vdXQuc3VuNC5oCT09PiBhb3V0L3N1bjQuaAotCXJhbmxpYi5oCT09PiBhb3V0L3JhbmxpYi5oCi0JcmVsb2MuaAkJPT0+IGFvdXQvcmVsb2MuaAotCXN0YWIuZGVmCT09PiBhb3V0L3N0YWIuZGVmCi0Jc3RhYi5nbnUuaAk9PT4gYW91dC9zdGFiX2dudS5oCi0KLQljb2ZmLWEyOWsuaAk9PT4gY29mZi9hMjlrLmgKLQljb2ZmLWg4MzAwLmgJPT0+IGNvZmYvaDgzMDAuaAotCWNvZmYtaTM4Ni5oCT09PiBjb2ZmL2kzODYuaAotCWNvZmYtaTk2MC5oCT09PiBjb2ZmL2k5NjAuaAotCWludGVybmFsY29mZi5oCT09PiBjb2ZmL2ludGVybmFsLmgKLQljb2ZmLW02OGsuaAk9PT4gY29mZi9tNjhrLmgKLQljb2ZmLW04OGsuaAk9PT4gY29mZi9tODhrLmgKLQljb2ZmLW1pcHMuaAk9PT4gY29mZi9taXBzLmgKLQljb2ZmLXJzNjAwMC5oCT09PiBjb2ZmL3JzNjAwMC5oCi0KLQllbGYtY29tbW9uLmgJPT0+IGVsZi9jb21tb24uaAotCWR3YXJmLmgJCT09PiBlbGYvZHdhcmYuaAotCWVsZi1leHRlcm5hbC5oCT09PiBlbGYvZXh0ZXJuYWwuaAotCWVsZi1pbnRlcm5hbC5oICA9PT4gZWxmL2ludGVybmFsLmgKLQotCWEyOWstb3Bjb2RlLmgJPT0+IG9wY29kZS9hMjlrLmgKLQlhcm0tb3Bjb2RlLmgJPT0+IG9wY29kZS9hcm0uaAotCWg4MzAwLW9wY29kZS5oCT09PiBvcGNvZGUvaDgzMDAuaAotCWkzODYtb3Bjb2RlLmgJPT0+IG9wY29kZS9pMzg2LmgKLQlpODYwLW9wY29kZS5oCT09PiBvcGNvZGUvaTg2MC5oCi0JaTk2MC1vcGNvZGUuaAk9PT4gb3Bjb2RlL2k5NjAuaAotCW02OGstb3Bjb2RlLmgJPT0+IG9wY29kZS9tNjhrLmgKLQltODhrLW9wY29kZS5oCT09PiBvcGNvZGUvbTg4ay5oCi0JbWlwcy1vcGNvZGUuaAk9PT4gb3Bjb2RlL21pcHMuaAotCW5wMS1vcGNvZGUuaAk9PT4gb3Bjb2RlL25wMS5oCi0JbnMzMmstb3Bjb2RlLmgJPT0+IG9wY29kZS9uczMyay5oCi0JcG4tb3Bjb2RlLmgJPT0+IG9wY29kZS9wbi5oCi0JcHlyLW9wY29kZS5oCT09PiBvcGNvZGUvcHlyLmgKLQlzcGFyYy1vcGNvZGUuaAk9PT4gb3Bjb2RlL3NwYXJjLmgKLQl0YWhvZS1vcGNvZGUuaAk9PT4gb3Bjb2RlL3RhaG9lLmgKLQl2YXgtb3Bjb2RlLmgJPT0+IG9wY29kZS92YXguaAotCi0KLQotV2VkIE5vdiAyNyAxMDozODozMSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWxjb2ZmLmg6IChpbnRlcm5hbF9zY25oZHIpIHRvb2sgb3V0ICNkZWYgZGVwZW5kZW5jeSwgbm93Ci0Jc19ucmVsb2MgYW5kIHNfbmxubm8gYXJlIGFsd2F5cyBsb25nLiAJKGludGVybmFsX3JlbG9jKTogYWxsd2F5cwotCWhhcyBhbiBvZmZzZXQgZmllbGQgbm93LgotCi1GcmkgTm92IDIyIDA4OjEyOjU4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLXJzNjAwMC5oOiAgTGludDsgdXNlIHVuc2lnbmVkIGNoYXJzIGZvciBleHRlcm5hbCBmaWVsZHMuCi0JKiBpbnRlcm5hbGNvZmYuaDogIExpbnQ7IGNhc3Qgc3RvcmFnZSBjbGFzc2VzIHRvIHNpZ25lZCBjaGFyLgotCi1UaHUgTm92IDIxIDIxOjAxOjA1IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBzdGFiLmRlZjogUmVtb3ZlIHRoZSBHTlUgZXh0ZW5kZWQgdHlwZSBjb2RlcyAoZS5nLiBOX1NFVFQpLgotCSogYW91dDY0Lmg6ICBUaGUgaGV1cmlzdGljIGZvciBkaXN0aW5ndWlzaGluZyBiZXR3ZWVuCi0Jc3Vub3Mtc3R5bGUgYW5kIGJzZC1zdHlsZSBaTUFHSUMgZmlsZXMgKHdydC4gd2hlcmUgdGhlCi0JdGV4dCBzZWdtZW50IHN0YXJ0cykgaXMgbW92ZWQgaW50byAodGhlIGRlZmF1bHQgZGVmaW5pdGlvbiBvZikKLQl0aGUgbWFjcm8gTl9IRUFERVJfSU5fVEVYVC4gIFRoaXMgZGVmaW5pdGlvbiBpcyBvbmx5IHVzZWQKLQlpZiBubyBvdGhlciBkZWZpbml0aW9uIGlzIHVzZWQgLSBlLmcuIGJmZC9uZXdzb3MzLmMgZGVmaW5lcwotCU5fSEVBREVSX0lOX1RFWFQoeCkgdG8gYmUgYWx3YXlzIDAgKGFzIGJlZm9yZSkuCi0KLVRodSBOb3YgMjEgMTE6NTM6MDMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oIChOX1RYVEFERFIsIE5fVFhUT0ZGLCBOX1RYVFNJWkUpOiAgTmV3IGRlZmluaXRpb25zCi0JdGhhdCBzaG91bGQgaGFuZGxlIGFsbCB1c2VzLiAgTE9HSUNBTF8gdmVyc2lvbnMgZGVsZXRlZC4KLQlFbGltaW5hdGUgTl9IRUFERVJfSU5fVEVYVCwgdXNpbmcgYV9lbnRyeSB0byBkZXRlcm1pbmUgd2hpY2gKLQlraW5kIG9mIHptYWdpYyBhLm91dCBmaWxlIHdlIGFyZSBsb29raW5nIGF0LgotCSogY29mZi1yczYwMDAuaDogIFR5cG8uCi0KLVR1ZSBOb3YgMTkgMTg6NDM6MzcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkoTm90ZTogIFRoaXMgaXMgYSByZXZpc2VkIGVudHJ5LCBhcyB3YXMgYW91dDY0LmguKQotCSogYW91dDY0Lmg6ICBTb21lIGNsZWFudXBzIG9mIE5fVFhUQUREUiBhbmQgTl9UWFRPRkY6Ci0JV2lsbCBub3cgd29yayBmb3IgYm90aCBvbGQtIGFuZCBuZXctc3R5bGUgWk1BR0lDIGZpbGVzLAotCWRlcGVuZGluZyBvbiBOX0hFQURFUl9JTl9URVhUIG1hY3JvLgotCUFkZCBMT0dJQ0FMX1RYVEFERFIsIExPSUNBTF9UWFRPRkYgYW5kIExPR0lDQUxfVFhUU0laRQotCXRoYXQgZG9uJ3QgY291bnQgdGhlIGV4ZWMgaGVhZGVyIGFzIHBhcnQKLQlvZiB0aGUgdGV4dCBzZWdtZW50LCB0byBiZSBjb25zaXN0ZW50IHdpdGggYmZkLgotCSogYS5vdXQuc3VuNC5oOiAgU2ltcGxpZmllZC9maXhlZCBmb3IgcHJldmlvdXMgY2hhbmdlLgotCi1Nb24gTm92IDE4IDAwOjAyOjA2IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBkd2FyZi5oOiAgVXBkYXRlIHRvIERXQVJGIGRyYWZ0IDUgdmVyc2lvbiBmcm9tIGdjYzIuCi0KLVRodSBOb3YgMTQgMTk6NDQ6NTkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmOiAgQWRkZWQgZGVmcyBmb3IgZXh0ZW5kZWQgR05VIHN5bWJvbCB0eXBlcywKLQlzdWNoIGFzIE5fU0VUVC4gIFRoZXNlIGFyZSBub3JtYWxseSBpZmRlZidkIG91dCAoYmVjYXVzZQotCW9mIGNvbmZsaWN0cyB3aXRoIGEub3V0LmdudS5oKSwgYnV0IGFyZSB1c2VkIGJ5IGJmYl9zdGFiX25hbWUoKS4KLQotVGh1IE5vdiAxNCAxOToxNzowMyAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLWNvbW1vbi5oOiAgQWRkIGRlZmluZXMgdG8gc3VwcG9ydCBFTEYgc3ltYm9sIHRhYmxlIGNvZGUuCi0KLU1vbiBOb3YgMTEgMTk6MDE6MDYgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi1pbnRlcm5hbC5oLCBlbGYtZXh0ZXJuYWwuaCwgZWxmLWNvbW1vbi5oOiAgQWRkIHN1cHBvcnQgZm9yCi0Jbm90ZSBzZWN0aW9ucywgd2hpY2ggYXJlIHVzZWQgaW4gRUxGIGNvcmUgZmlsZXMgdG8gaG9sZCBjb3BpZXMKLQlvZiB2YXJpb3VzIC9wcm9jIHN0cnVjdHVyZXMuCi0KLVRodSBOb3YgIDcgMDg6NTg6MjYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWxjb2ZmLmg6IHRvb2sgb3V0IHRoZSBNODggZGVwZW5kZW5jeSBpbiB0aGUgbGluZW5vCi0Jc3RydWN0LgotCSogY29mZi1tODhrLmg6IGRlZmluZXMgR0VUX0xJTkVOT19MTk5PIGFuZCBQVVRfTElORU5PX0xOTk8gdG8gdXNlCi0JMzJiaXQgbGlubm8gZW50cmllcy4KLQkqIGEyOWstb3Bjb2RlLmg6IGZpeGVkIGVuY29kaW5nIG9mIG10YWNjCi0KLVN1biBOb3YgIDMgMTE6NTQ6MjIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGVkIGZyb20gLi4vYmZkL2JmZC1pbi5oIChxLnYpLgotCi1GcmkgTm92ICAxIDExOjEzOjUzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbGNvZmYuaDogIEFkZCB4X2NzZWN0IGRlZmluZXMuCi0KLUZyaSBPY3QgMjUgMDM6MTg6MjAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIFJlbmFtZSBDT0ZGLXJlbGF0ZWQgZmlsZXMgaW4gYGNvZmYtQVJDSC5oJyBmb3JtLgotCWNvZmYtYTI5ay5oLCBjb2ZmLWkzODYuaCwgY29mZi1pOTYwLmgsIGNvZmYtbTY4ay5oLCBjb2ZmLW04OGsuaCwKLQljb2ZmLW1pcHMuaCwgY29mZi1yczYwMDAuaCB0byBiZSBleGFjdC4KLQotVGh1IE9jdCAyNCAyMjoxMToxMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCVJTLzYwMDAgc3VwcG9ydCwgYnkgTWV0aW4gRy4gT3ppc2lrLCBNaW1pIFBo+/RuZy1UaOVvIFb1LCBhbmQKLQlKb2huIEdpbG1vcmUuCi0KLQkqIGEub3V0LmdudS5oOiAgVXBkYXRlIHNsaWdodGx5LgotCSogYmZkLmg6ICBBZGQgbmV3IGVycm9yIGNvZGUsIGZpeCBkb2MsIGFkZCBiZmRfYXJjaF9yczYwMDAuCi0JKiBpbnRlcm5hbGNvZmYuaDogIEFkZCBtb3JlIEZfIGNvZGVzIGZvciBmaWxlaGRyLiAgQWRkCi0JcnMvNjAwMC1kZXBlbmRlbnQgZmllbGRzIHRvIGFvdXRoZHIuICBBZGQgc3RvcmFnZSBjbGFzc2VzCi0JdG8gc3ltZW50cy4gIEFkZCA2MDAwLXNwZWNpZmljIGF1eGVudC4gIEFkZCByX3NpemUgaW4gcmVsb2MuCi0JKiByczYwMDBjb2ZmLmM6ICBOZXcgZmlsZS4KLQotVGh1IE9jdCAyNCAwNDoxMzoyMCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZHdhcmYuaDogTmV3IGZpbGUgZm9yIGR3YXJmIHN1cHBvcnQuICBDb3BpZWQgZnJvbSBnY2MyCi0JZGlzdHJpYnV0aW9uLgotCi1XZWQgT2N0IDE2IDEzOjMxOjQ1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaDogIFJlbW92ZSBQQUdFX1NJWkUgZGVmaW5lczsgdGhleSBhcmUgdGFyZ2V0LWRlcGVuZGVudC4KLQlBZGQgTl9GTl9TRVEgZm9yIE5fRk4gc3ltYm9sIHR5cGUgdXNlZCBvbiBTZXF1ZW50IG1hY2hpbmVzLgotCSogc3RhYi5kZWY6ICBJbmNsdWRlIE5fRk5fU0VRIGluIHRhYmxlLgotCSogYm91dC5oOiAgRXh0ZXJuYWwgZm9ybWF0cyBvZiBzdHJ1Y3R1cmVzIHVzZSB1bnNpZ25lZCBjaGFycy4KLQotRnJpIE9jdCAxMSAxMjo0MDo0MyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOnVwZ3JhZGUgZnJvbSBiZmQuYwotCSogaW50ZXJuYWxjb2ZmLmg6IGFkZCBuX25hbWUsIG5femVyb2VzIGFuZCBuX29mZnNldCBtYWNyb3MKLQkqIGFtZGNvZmYuaDogRGVmaW5lIE9NQUdJQyBhbmQgQU9VVEhEUlNaLgotCi1GcmkgT2N0IDExIDEwOjU4OjA2IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhLm91dC5ob3N0Lmg6IENoYW5nZSBTRUdNRU5UX1NJWkUgdG8gMHgxMDAwIGZvciBTb255LgotCSogYmZkLmggKGFsaWduX3Bvd2VyKTogQWRkIChhY3R1YWxseSBtb3ZlKSBjb21tZW50LgotCi1UdWUgT2N0ICA4IDE1OjI5OjMyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBzeXMvaC1ydGJzZC5oOiBEZWZpbmUgTUlTU0lOR19WRlBSSU5UIChmb3IgYmludXRpbHMvYnVjb21tLmMpLgotCi1TdW4gT2N0ICA2IDE5OjI0OjM5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaDogIE1vdmUgc3RydWN0IGludGVybmFsX2V4ZWMgdG8gLi4vYmZkL2xpYmFvdXQuaCBzbwotCWl0IGNhbiBiZSBzaGFyZWQgYnkgYWxsIGBhLm91dC1mYW1pbHknIGNvZGUuICBSZW5hbWUKLQlFWFRFUk5BTF9MSVNUX1NJWkUgdG8gRVhURVJOQUxfTkxJU1RfU0laRS4gIFVzZSBiYXNpYyB0eXBlcwotCWZvciBubGlzdCBtZW1iZXJzLCBhbmQgbWFrZSBzdHJ4IGludGVncmFsIHJhdGhlciB0aGFuIHBvaW50ZXIuCi0JTW9yZSBjb21tZW50YXJ5IG9uIG5fdHlwZSB2YWx1ZXMuCi0JKiBib3V0Lmg6ICBQcm92aWRlIGEgc3RydWN0IGV4dGVybmFsX2V4ZWMgcmF0aGVyIHRoYW4gYW4KLQlpbnRlcm5hbF9leGVjLgotCSogbTY4a2NvZmYuaDogIFJlbW92ZSBgdGFnZW50cmllcycgd2hpY2ggc251Y2sgaW4gZnJvbSB0aGUgaTk2MAotCUNPRkYgcG9ydC4KLQotRnJpIE9jdCAgNCAwMToyNTo1OSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaDgzMDAtb3Bjb2RlLmg6ICBSZW1vdmUgYF9lbnVtJyBmcm9tIHRoZSB0eXBlZGVmIGZvciBhbiBlbnVtLgotCSogYmZkLmg6ICBVcGRhdGUgdG8gbWF0Y2ggYmZkIGNoYW5nZXMuCi0KLQkqIHN5cy9oLWkzODZtYWNoLmgsIHN5c2RlcC5oOiAgQWRkIDM4NiBNYWNoIGhvc3Qgc3VwcG9ydC4KLQotVHVlIE9jdCAgMSAwNDo1ODo0MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmgsIGVsZi1jb21tb24uaCwgZWxmLWV4dGVybmFsLmgsIGVsZi1pbnRlcm5hbC5oOgotCUFkZCBwcmVsaW1pbmFyeSBFTEYgc3VwcG9ydCwgc3VmZmljaWVudCBmb3IgR0RCLCBmcm9tIEZyZWQgRmlzaC4KLQkqIHN5c2RlcC5oLCBzeXMvaC1hbWl4Lmg6ICBTdXBwb3J0IEFtaWdhIFNWUjQuCi0KLQkqIHN5cy9oLXZheHVsdC5oOiAgTWFrZSBpdCB3b3JrLiAgKERhdmlkIFRheWxvciA8dGF5bG9yQHRoaW5rLmNvbT4pCi0JKiBhLm91dC52YXguaDogIFJlbW92ZSB1bnVzZWQgYW5kIGNvbmZ1c2luZyBmaWxlLgotCi1Nb24gU2VwIDMwIDEyOjUyOjM1IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBzeXNkZXAuaDogRGVmaW5lIE5FV1NPUzNfU1lTLCBhbmQgdXNlIGl0LgotCi1GcmkgU2VwIDIwIDEzOjM4OjIxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhLm91dC5nbnUuaCAoTl9GTik6ICBJdHMgdmFsdWUgKnJlYWxseSBpcyogMHgxRi4KLQlGaXggaXQsIGFuZCBhZGQgY29tbWVudHMgd2FybmluZyBhYm91dCBvci1pbmcgTl9FWFQgd2l0aCBpdAotCWFuZC9vciBOX1dBUk5JTkcuCi0JKiBhb3V0NjQuaCAoTl9GTik6ICBGaXggdmFsdWUsIGFkZCBjb21tZW50cyBhYm91dCBOX0VYVC4KLQkqIHN0YWIuZGVmICh0YWJsZSBhdCBlbmQpOiAgVXBkYXRlIHRvIHNob3cgYWxsIHRoZSB0eXBlCi0JdmFsdWVzIDwweDIwLCBpbmNsdWRpbmcgbG93IG9yZGVyIGJpdHMuICBNb3ZlIE5fRk4gdG8KLQlpdHMgcmlnaHRmdWwgcGxhY2UuCi0KLVR1ZSBTZXAgMTcgMTc6NDE6MzcgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogc3lzL2gtaXJpeDMuaDogIHNnaS9pcml4IHN1cHBvcnQuCi0KLVR1ZSBTZXAgMTcgMDc6NTI6NTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBzdGFiLmRlZiAoTl9ERUZEKTogIEFkZCBHTlUgTW9kdWxhLTIgZGVidWcgc3RhYiwgZnJvbSBBbmRyZXcKLQlCZWVycy4KLQotVGh1IFNlcCAxMiAxNDoxMjo1OSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsY29mZi5oIChTWU1OTUxFTiwgRklMTk1MRU4sIERJTU5VTSk6ICBEZWZpbmUgdGhlc2UKLQlmb3IgaW50ZXJuYWxjb2ZmLCBzZXBhcmF0ZWx5IGZyb20gdGhlIHZhcmlvdXMgZXh0ZXJuYWwgY29mZidzLgotCSogYW1kY29mZi5oLCBiY3M4OGtjb2ZmLmgsIGkzODZjb2ZmLmgsIGludGVsLWNvZmYuaCwgbTY4a2NvZmYuaCwKLQltODhrLWJjcy5oOiBQcmVmaXggU1lNTk1MRU4sIEZJTE5NTEVOLCBhbmQgRElNTlVNIHdpdGggRV8ncyBmb3IKLQl0aGUgZXh0ZXJuYWwgc3RydWN0IGRlZmluaXRpb25zLgotCSogZWNvZmYuaDogUmVtb3ZlIHRoZXNlICNkZWZpbmUncywga2x1ZGdlIG5vIGxvbmdlciBuZWVkZWQuCi0KLQkqIHN5cy9oLXVsdHJhMy5oOiAgQWRkIG5ldyBVbHRyYWNvbXB1dGVyIGhvc3QuCi0JKiBzeXNkZXAuaDogIEFkZCBVTFRSQTNfU1lNMV9TWVMgYW5kIHVzZSBpdC4KLQotVHVlIFNlcCAxMCAxMDoxMTo0NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGkzODZjb2ZmLmggKExJTkVTWik6ICBBbHdheXMgNiwgbm90IGJhc2VkIG9uIHNpemVvZigpLgotCShGaXggZnJvbSBQZXRlciBTY2hhdWVyIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4uKQotCi1XZWQgU2VwICA0IDA4OjU4OjM3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYS5vdXQuZ251LmgsIGFvdXQ2NC5oOiAgQWRkIE5fV0FSTklORy4gIENoYW5nZSBOX0ZOIHRvIDB4MEUsCi0JdG8gbWF0Y2ggU3VuT1MgYW5kIEJTRC4gIEFkZCBOX0NPTU0gYXMgMHgxMiBmb3IgU3VuT1Mgc2hhcmVkIGxpYgotCXN1cHBvcnQuCi0JKiBzdGFiLmRlZjogIEFkZCBOX0NPTU0gdG8gdGFibGUsIGZpeCBvdmVybGFwIGNvbW1lbnQuCi0KLVR1ZSBTZXAgIDMgMDY6Mjk6MjAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JTWVyZ2Ugd2l0aCBsYXRlc3QgRlNGIHZlcnNpb25zIG9mIHRoZXNlIGZpbGVzLgotCi0JKiBzdGFiLmdudS5oOiAgQWRkIExBU1RfVU5VU0VEX1NUQUJfQ09ERS4KLQkqIHN0YWIuZGVmOiAgVXBkYXRlIHRvIEdQTDIuICBNb3ZlIE5fV0FSTklORyBvdXQsIHNpbmNlIG5vdCBhCi0JZGVidWcgc3ltYm9sLiAgQ2hhbmdlIGNvbW1lbnRzLCBhbmQgcmVvcmRlciB0YWJsZSB0byBudW1lcmljCi0Jb3JkZXIuICBVcGRhdGUgZmluYWwgdGFibGUgY29tbWVudC4KLQkoTl9EU0xJTkUsIE5fQlNMSU5FKTogIFJlbnVtYmVyIGZyb20gMHg2NiBhbmQgMHg2OCwgdG8gMHg0NiBhbmQgMHg0OC4KLQotCSogb2JzdGFjay5oOiAgR1BMMi4gIE1lcmdlLgotCi1GcmkgQXVnIDIzIDAxOjU0OjIzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYS5vdXQuZ251LmgsIGEub3V0LnN1bjQuaDogIE1ha2UgU0VHTUVOVF9TSVpFIGFibGUgdG8gZGVwZW5kCi0Jb24gdGhlIHBhcnRpY3VsYXIgYS5vdXQgYmVpbmcgZXhhbWluZWQuCi0JKiBhLm91dC5zdW40Lmg6ICBEZWZpbmUgc2VnbWVudCBzaXplcyBmb3IgU3VuLTMncyBhbmQgU3VuLTQncy4KLQkqIEZJWE1FOiAgYS5vdXQuZ251LmggaXMgYWxtb3N0IG9ic29sZXRlLgotCSogRklYTUU6ICBhLm91dC5zdW40Lmggc2hvdWxkIGJlIHJlbmFtZWQgYS5vdXQuc3VuLmggbm93LgotCi1XZWQgQXVnIDIxIDIwOjMyOjEzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogU3RhcnQgYSBDaGFuZ2VMb2cgZm9yIHRoZSBpbmNsdWRlcyBkaXJlY3RvcnkuCi0KLQkqIGEub3V0LmdudS5oIChOX0ZOKTogIEZpeCB2YWx1ZSAtLSB3YXMgMTUsIHNob3VsZCBiZSAweDFFLgotCSogc3RhYi5kZWY6ICBVcGRhdGUgYWxsb2NhdGlvbiB0YWJsZSBpbiBjb21tZW50cyBhdCBlbmQsCi0JdG8gcmVmbGVjdCByZWFsaXR5IGFzIEkga25vdyBpdC4KLQotDAotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogY2hhbmdlLWxvZwotbGVmdC1tYXJnaW46IDgKLWZpbGwtY29sdW1uOiA3NAotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hbnNpZGVjbC5oIGIvaW5jbHVkZS9hbnNpZGVjbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGI5ZmI3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW5zaWRlY2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKiBBTlNJIGFuZCB0cmFkaXRpb25hbCBDIGNvbXBhdGFiaWxpdHkgbWFjcm9zCi0gICBDb3B5cmlnaHQgMTk5MSwgMTk5MiwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBTlNJIGFuZCB0cmFkaXRpb25hbCBDIGNvbXBhdGliaWxpdHkgbWFjcm9zCi0KLSAgIEFOU0kgQyBpcyBhc3N1bWVkIGlmIF9fU1REQ19fIGlzICNkZWZpbmVkLgotCi0gICBNYWNybwlBTlNJIEMgZGVmaW5pdGlvbglUcmFkaXRpb25hbCBDIGRlZmluaXRpb24KLSAgIC0tLS0tCS0tLS0gLSAtLS0tLS0tLS0tCS0tLS0tLS0tLS0tIC0gLS0tLS0tLS0tLQotICAgUFRSCQlgdm9pZCAqJwkJYGNoYXIgKicKLSAgIExPTkdfRE9VQkxFCWBsb25nIGRvdWJsZScJCWBkb3VibGUnCi0gICBWT0xBVElMRQlgdm9sYXRpbGUnCQlgJwotICAgU0lHTkVECWBzaWduZWQnCQlgJwotICAgUFRSQ09OU1QJYHZvaWQgKmNvbnN0JwkJYGNoYXIgKicKLSAgIEFOU0lfUFJPVE9UWVBFUyAgMQkJCW5vdCBkZWZpbmVkCi0KLSAgIENPTlNUIGlzIGFsc28gZGVmaW5lZCwgYnV0IGlzIG9ic29sZXRlLiAgSnVzdCB1c2UgY29uc3QuCi0KLSAgIG9ic29sZXRlIC0tICAgICBERUZVTiAobmFtZSwgYXJnbGlzdCwgYXJncykKLQotCURlZmluZXMgZnVuY3Rpb24gTkFNRS4KLQotCUFSR0xJU1QgbGlzdHMgdGhlIGFyZ3VtZW50cywgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgZW5jbG9zZWQgaW4KLQlwYXJlbnRoZXNlcy4gIEFSR0xJU1QgYmVjb21lcyB0aGUgYXJndW1lbnQgbGlzdCBpbiB0cmFkaXRpb25hbCBDLgotCi0JQVJHUyBsaXN0IHRoZSBhcmd1bWVudHMgd2l0aCB0aGVpciB0eXBlcy4gIEl0IGJlY29tZXMgYSBwcm90b3R5cGUgaW4KLQlBTlNJIEMsIGFuZCB0aGUgdHlwZSBkZWNsYXJhdGlvbnMgaW4gdHJhZGl0aW9uYWwgQy4gIEFyZ3VtZW50cyBzaG91bGQKLQliZSBzZXBhcmF0ZWQgd2l0aCBgQU5EJy4gIEZvciBmdW5jdGlvbnMgd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZgotCWFyZ3VtZW50cywgdGhlIGxhc3QgdGhpbmcgbGlzdGVkIHNob3VsZCBiZSBgRE9UUycuCi0KLSAgIG9ic29sZXRlIC0tICAgICBERUZVTl9WT0lEIChuYW1lKQotCi0JRGVmaW5lcyBhIGZ1bmN0aW9uIE5BTUUsIHdoaWNoIHRha2VzIG5vIGFyZ3VtZW50cy4KLQotICAgb2Jzb2xldGUgLS0gICAgIEVYRlVOIChuYW1lLCAocHJvdG90eXBlKSkJLS0gb2Jzb2xldGUuCi0KLQlSZXBsYWNlZCBieSBQQVJBTVMuICBEbyBub3QgdXNlOyB3aWxsIGRpc2FwcGVhciBzb21lZGF5IHNvb24uCi0JV2FzIHVzZWQgaW4gZXh0ZXJuYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCUluIEFOU0kgQyBpdCBpcyBgTkFNRSBQUk9UT1RZUEUnIChzbyBQUk9UT1RZUEUgc2hvdWxkIGJlIGVuY2xvc2VkIGluCi0JcGFyZW50aGVzZXMpLiAgSW4gdHJhZGl0aW9uYWwgQyBpdCBpcyBgTkFNRSgpJy4KLQlGb3IgYSBmdW5jdGlvbiB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cywgUFJPVE9UWVBFIHNob3VsZCBiZSBgKHZvaWQpJy4KLQotICAgb2Jzb2xldGUgLS0gICAgIFBST1RPICh0eXBlLCBuYW1lLCAocHJvdG90eXBlKSAgICAtLSBvYnNvbGV0ZS4KLQotCVRoaXMgb25lIGhhcyBhbHNvIGJlZW4gcmVwbGFjZWQgYnkgUEFSQU1TLiAgRG8gbm90IHVzZS4KLQotICAgUEFSQU1TICgoYXJncykpCi0KLQlXZSBjb3VsZCB1c2UgdGhlIEVYRlVOIG1hY3JvIHRvIGhhbmRsZSBwcm90b3R5cGUgZGVjbGFyYXRpb25zLCBidXQKLQl0aGUgbmFtZSBpcyBtaXNsZWFkaW5nIGFuZCB0aGUgcmVzdWx0IGlzIHVnbHkuICBTbyB3ZSBqdXN0IGRlZmluZSBhCi0Jc2ltcGxlIG1hY3JvIHRvIGhhbmRsZSB0aGUgcGFyYW1ldGVyIGxpc3RzLCBhcyBpbjoKLQotCSAgICAgIHN0YXRpYyBpbnQgZm9vIFBBUkFNUyAoKGludCwgY2hhcikpOwotCi0JVGhpcyBwcm9kdWNlczogIGBzdGF0aWMgaW50IGZvbygpOycgb3IgYHN0YXRpYyBpbnQgZm9vIChpbnQsIGNoYXIpOycKLQotCUVYRlVOIHdvdWxkIGhhdmUgZG9uZSBpdCBsaWtlIHRoaXM6Ci0KLQkgICAgICBzdGF0aWMgaW50IEVYRlVOIChmb28sIChpbnQsIGNoYXIpKTsKLQotCWJ1dCB0aGUgZnVuY3Rpb24gaXMgbm90IGV4dGVybmFsLi4uYW5kIGl0J3MgaGFyZCB0byB2aXN1YWxseSBwYXJzZQotCXRoZSBmdW5jdGlvbiBuYW1lIG91dCBvZiB0aGUgbWVzcy4gICBFWEZVTiBzaG91bGQgYmUgY29uc2lkZXJlZAotCW9ic29sZXRlOyBuZXcgY29kZSBzaG91bGQgYmUgd3JpdHRlbiB0byB1c2UgUEFSQU1TLgotCi0gICBET1RTIGlzIGFsc28gb2Jzb2xldGUuCi0KLSAgIEV4YW1wbGVzOgotCi0JZXh0ZXJuIGludCBwcmludGYgUEFSQU1TICgoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pKTsKLSovCi0KLSNpZm5kZWYJX0FOU0lERUNMX0gKLQotI2RlZmluZQlfQU5TSURFQ0xfSAkxCi0KLQotLyogRXZlcnkgc291cmNlIGZpbGUgaW5jbHVkZXMgdGhpcyBmaWxlLAotICAgc28gdGhleSB3aWxsIGFsbCBnZXQgdGhlIHN3aXRjaCBmb3IgbGludC4gICovCi0vKiBMSU5UTElCUkFSWSAqLwotCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX0FJWCkgfHwgKGRlZmluZWQgKF9fbWlwcykgJiYgZGVmaW5lZCAoX1NZU1RZUEVfU1ZSNCkpIHx8IGRlZmluZWQoX1dJTjMyKQotLyogQWxsIGtub3duIEFJWCBjb21waWxlcnMgaW1wbGVtZW50IHRoZXNlIHRoaW5ncyAoYnV0IGRvbid0IGFsd2F5cwotICAgZGVmaW5lIF9fU1REQ19fKS4gIFRoZSBSSVNDL09TIE1JUFMgY29tcGlsZXIgZGVmaW5lcyB0aGVzZSB0aGluZ3MKLSAgIGluIFNWUjQgbW9kZSwgYnV0IGRvZXMgbm90IGRlZmluZSBfX1NURENfXy4gICovCi0KLSNkZWZpbmUJUFRSCQl2b2lkICoKLSNkZWZpbmUJUFRSQ09OU1QJdm9pZCAqQ09OU1QKLSNkZWZpbmUJTE9OR19ET1VCTEUJbG9uZyBkb3VibGUKLQotI2lmbmRlZiBJTl9HQ0MKLSNkZWZpbmUJQU5ECQksCi0jZGVmaW5lCU5PQVJHUwkJdm9pZAotI2RlZmluZQlWT0xBVElMRQl2b2xhdGlsZQotI2RlZmluZQlTSUdORUQJCXNpZ25lZAotI2VuZGlmIC8qICEgSU5fR0NDICovCi0KLSNkZWZpbmUgUEFSQU1TKHBhcmFtbGlzdCkJCXBhcmFtbGlzdAotI2RlZmluZSBBTlNJX1BST1RPVFlQRVMJCQkxCi0KLSNkZWZpbmUgVlBBUkFNUyhBUkdTKQkJCUFSR1MKLSNkZWZpbmUgVkFfU1RBUlQodmFfbGlzdCx2YXIpCQl2YV9zdGFydCh2YV9saXN0LHZhcikKLQotLyogVGhlc2UgYXJlIG9ic29sZXRlLiAgRG8gbm90IHVzZS4gICovCi0jaWZuZGVmIElOX0dDQwotI2RlZmluZSBDT05TVAkJCQljb25zdAotI2RlZmluZSBET1RTCQkJCSwgLi4uCi0jZGVmaW5lIFBST1RPKHR5cGUsIG5hbWUsIGFyZ2xpc3QpCXR5cGUgbmFtZSBhcmdsaXN0Ci0jZGVmaW5lIEVYRlVOKG5hbWUsIHByb3RvKQkJbmFtZSBwcm90bwotI2RlZmluZSBERUZVTihuYW1lLCBhcmdsaXN0LCBhcmdzKQluYW1lKGFyZ3MpCi0jZGVmaW5lIERFRlVOX1ZPSUQobmFtZSkJCW5hbWUodm9pZCkKLSNlbmRpZiAvKiAhIElOX0dDQyAqLwotCi0jZWxzZQkvKiBOb3QgQU5TSSBDLiAgKi8KLQotI2RlZmluZQlQVFIJCWNoYXIgKgotI2RlZmluZQlQVFJDT05TVAlQVFIKLSNkZWZpbmUJTE9OR19ET1VCTEUJZG91YmxlCi0KLSNpZm5kZWYgSU5fR0NDCi0jZGVmaW5lCUFORAkJOwotI2RlZmluZQlOT0FSR1MKLSNkZWZpbmUJVk9MQVRJTEUKLSNkZWZpbmUJU0lHTkVECi0jZW5kaWYgLyogIUlOX0dDQyAqLwotCi0jaWZuZGVmIGNvbnN0IC8qIHNvbWUgc3lzdGVtcyBkZWZpbmUgaXQgaW4gaGVhZGVyIGZpbGVzIGZvciBub24tYW5zaSBtb2RlICovCi0jZGVmaW5lCWNvbnN0Ci0jZW5kaWYKLQotI2RlZmluZSBQQVJBTVMocGFyYW1saXN0KQkJKCkKLQotI2RlZmluZSBWUEFSQU1TKEFSR1MpCQkJKHZhX2FsaXN0KSB2YV9kY2wKLSNkZWZpbmUgVkFfU1RBUlQodmFfbGlzdCx2YXIpCQl2YV9zdGFydCh2YV9saXN0KQotCi0vKiBUaGVzZSBhcmUgb2Jzb2xldGUuICBEbyBub3QgdXNlLiAgKi8KLSNpZm5kZWYgSU5fR0NDCi0jZGVmaW5lIENPTlNUCi0jZGVmaW5lIERPVFMKLSNkZWZpbmUgUFJPVE8odHlwZSwgbmFtZSwgYXJnbGlzdCkJdHlwZSBuYW1lICgpCi0jZGVmaW5lIEVYRlVOKG5hbWUsIHByb3RvKQkJbmFtZSgpCi0jZGVmaW5lIERFRlVOKG5hbWUsIGFyZ2xpc3QsIGFyZ3MpCW5hbWUgYXJnbGlzdCBhcmdzOwotI2RlZmluZSBERUZVTl9WT0lEKG5hbWUpCQluYW1lKCkKLSNlbmRpZiAvKiAhIElOX0dDQyAqLwotCi0jZW5kaWYJLyogQU5TSSBDLiAgKi8KLQotI2VuZGlmCS8qIGFuc2lkZWNsLmgJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9DaGFuZ2VMb2cgYi9pbmNsdWRlL2FvdXQvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTRjZmQ1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotU3VuIEp1biAyOCAxMTozMzo0OCAxOTk4ICBQZXRlciBTY2hhdWVyICA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+Ci0KLQkqIHN0YWIuZGVmOiAgQWRkIE5fQUxJQVMgZnJvbSBTdW5Qcm8gRjc3LgotCi1Nb24gTWFyIDExIDEyOjE1OjUyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYi5kZWY6IFVzZSBfX2RlZmluZV9zdGFiX2R1cGxpY2F0ZSByYXRoZXIgdGhhbiBfX2RlZmluZV9zdGFiCi0JZm9yIGR1cGxpY2F0ZSBlbnRyaWVzIE5fQlJPV1MgYW5kIE5fTU9EMi4KLQkqIHN0YWJfZ251LmggKF9fZGVmaW5lX3N0YWJfZHVwbGljYXRlKTogRGVmaW5lIGJlZm9yZSBpbmNsdWRpbmcKLQlzdGFiLmRlZi4KLQotRnJpIE9jdCAyNyAxNzo0NzoxNiAxOTk1ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQGFwcGxpLnNlPgotCi0JKiBhb3V0NjQuaCwgaG9zdC5oLCBocDMwMGhwdXguaCwgc3VuNC5oOiBDaGFuZ2VkIFBBR0VfU0laRSB0bwotCVRBUkdFVF9QQUdFX1NJWkUuCi0KLVR1ZSBTZXAgMTIgMTI6MDc6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW40LmggKHN0cnVjdCBpbnRlcm5hbF9zdW40X2R5bmFtaWNfbGluayk6IENoYW5nZSBhbGwgZmllbGRzCi0JZnJvbSBsb25nIHRvIHVuc2lnbmVkIGxvbmcuCi0KLVdlZCBKdWwgMTIgMDA6MTU6MTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLXBjLmN5Z251cy5jb20+Ci0KLQkqIHN1bjQuaCAoUEFHRV9TSVpFKTogVW5kZWZpbmUgYmVmb3JlIGRlZmluaW5nLgotCi1UaHUgSnVuIDE2IDE0OjIyOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKEJNQUdJQyk6IERlZmluZS4KLQotU2F0IEp1biAxMSAxNjoxNjowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGQgd2VhayBzeW1ib2xzIGFzIGFuIGV4dGVuc2lvbiB0byBhLm91dC4KLQkqIGFvdXQ2NC5oIChOX1dFQUtVLCBOX1dFQUtBLCBOX1dFQUtULCBOX1dFQUtELCBOX1dFQUtCKTogRGVmaW5lLgotCSogc3RhYi5kZWY6IFVwZGF0ZSBzeW1ib2wgdmFsdWUgdGFibGUuCi0KLVRodSBKdW4gIDIgMTc6MTM6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzdW40LmggKEVYVEVSTkFMX1NVTjRfRFlOQU1JQ19ERUJVR0dFUl9TSVpFKTogQ29ycmVjdCBmcm9tIDI4IHRvCi0JMjQuICBGaXggdXAgbGRfZ290IGNvbW1lbnQuCi0KLVdlZCBNYXIgMzAgMDA6MzE6NDkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBkeW5peDMuaDogIENsZWFudXAsIGFkYXB0IHRvIGN1cnJlbnQgYmZkIHZlcnNpb24uCi0KLVNhdCBGZWIgMjYgMTA6MjU6NTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaDogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gU1ZSNCBjYy4KLQotRnJpIEZlYiAxMSAxMjo1NjowNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFyLmggKEFSTUFHLCBBUk1BR0IsIEFSRk1BRyk6IENoYW5nZSAnXG4nIHRvICdcMDEyJywgZm9yIGdyZWF0ZXIKLQlwb3J0YWJpbGl0eS4KLQotRnJpIEphbiAyMSAwMDo1OTowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHN1bjQuaDogQWRkZWQgaW5mb3JtYXRpb24gYWJvdXQgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcy4KLQotRnJpIEphbiAgNyAwODoyMDoxMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKE5fVFhUQUREUik6IEFkZCBjb21tZW50IHJlZ2FyZGluZyBPTUFHSUMgYW5kIE5NQUdJQy4KLQotU2F0IERlYyAyNSAxNDo1NTo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKE5fREFUT0ZGKTogRG9uJ3QgcGFkIChyZXZlcnQgY2hhbmdlIG9mIDggSnVsIDE5OTMpLgotCi1UdWUgTm92IDE2IDE1OjQzOjQ2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaDogTmV3IG1hY3JvcyBaTUFHSUNfRElTS19CTE9DS19TSVpFIGFuZCBOX0RJU0tfQkxPQ0tfU0laRQotCWZvciBMaW51eCBaTUFHSUMuCi0JKE5fVFhUT0ZGLCBOX0RBVE9GRik6IFVzZSB0aGVtLgotCi1UaHUgTm92ICA0IDAwOjMzOjQ4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFKTogRml4ZWQgdmFsdWUgdG8gbWF0Y2gKLQlzdW4zIHN5c3RlbTsgdXNlZCB0byBvdmVybGFwIG90aGVyIGZpZWxkcy4KLQkoUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFKTogTGlrZXdpc2UuCi0KLVdlZCBOb3YgIDMgMTM6NDg6MjcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUpOiBNYWtlIGl0IDB4MTAgKEtlbidzCi0Jc3VnZ2VzdGlvbikgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFLgotCi1GcmkgT2N0IDI5IDE1OjA5OjUyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaHAzMDBocHV4LmggKE5fU0hBUkVEX0xJQik6IERlZmluZSB0byBiZSAwLgotCi1Nb24gU2VwIDEzIDIxOjAwOjU2IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhci5oIChBUk1BUF9USU1FX09GRlNFVCk6ICBBZGQgYW5kIGRlc2NyaWJlLgotCi1Nb24gQXVnIDIzICBTZWFuIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oIFtBUkNIX1NJWkUgIT0gNjRdOiBBbGxvdyBOX0JBRE1BRyB0byBiZSBvdmVycmlkZGVuLgotCi1Nb24gQXVnIDE2IDE0OjMwOjE0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzdGFiX2dudS5oOiBJbmNsdWRlIGFvdXQvc3RhYi5kZWYgbm90IGp1c3Qgc3RhYi5kZWYuCi0KLVN1biBKdWwgMTggMjE6NDE6NDcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBkeW5peDMuaDogTmV3LCBmb3Igc3ltbWV0cnkgcnVubmluZyBkeW5peC4KLQotVGh1IEp1bCAgOCAxMjo1MjoyMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKE5fQkFETUFHKTogUmVjb2duaXplIFFNQUdJQy4KLQlOX1RYVE9GRiwgTl9UWFRBRERSLCBOX1RYVFNJWkU6IFNwZWNpYWwgY29kZSBmb3IgUU1BR0lDLgotCU5fREFUT0ZGOiBQYWQgdGV4dCBzaXplIGlmIHdlIG5lZWQgdG8uCi0KLUZyaSBKdW4gMTggMTk6MTk6MzggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmIChOX0VDT01MKTogRml4IGNvbW1lbnQuCi0KLU1vbiBNYXkgMzEgMDk6MjE6MzAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmOiBSZW1vdmUgU29sYXJpcyBpbmZvcm1hdGlvbiBvbiBOX0ZVTiBzdGFic3RyaW5nIGdyYW1tYXI7Ci0JSSd2ZSB0cmFuc2ZlcnJlZCBpdCB0byBnZGIvZG9jL3N0YWJzLnRleGluZm8sIHdoZXJlIGl0IGJlbG9uZ3MuCi0KLU1vbiBNYXkgMTAgMDU6NDg6NDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGhwMzAwaHB1eC5oOiBQYXRjaCBmcm9tIEdsZW5uIEVuZ2VsIGZvciBsaW5rZXIgcHJvYmxlbSBhbmQKLQljb21wYXRpYmlsaXR5IGZpeDoKLQkoT01BR0lDLCBOTUFHSUMpOiBOZXcgZGVmaW5pdGlvbnMuCi0JKFNIQVJFTUFHSUMpOiBEZWxldGVkLgotCShIUFVYX0RPVF9PX01BR0lDKTogTmV3IG1hY3JvLgotCShfTl9CQURNQUcpOiBBZGp1c3RlZC4KLQkoTl9IRUFERVJfSU5fVEVYVCwgTl9EQVRBRERSKTogTmV3IG1hY3Jvcy4KLQotVGh1IEFwciAyOSAxMjowNzozNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogaHAzMDBocHV4Lmg6IE5ldyBmaWxlIGZyb20gR2xlbm4gRW5nZWwsIGdsZW5uZUBsc2lkLmhwLmNvbS4KLQotVHVlIEFwciAyNyAwNTo1MTowNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKHN0cnVjdCBleHRlcm5hbF9leGVjLCAqTUFHSUMsIE5fQkFETUFHKTogRG9uJ3QgZGVmaW5lCi0JaWYgYGV4dGVybmFsX2V4ZWMnIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIG1hY3JvLgotCShOX0RBVE9GRiwgTl9UUkVMT0ZGLCBOX0RSRUxPRkYsIE5fU1lNT0ZGLCBOX1NUUk9GRik6IERvbid0IGRlZmluZQotCWlmIGFscmVhZHkgZGVmaW5lZC4KLQkoc3RydWN0IGV4dGVybmFsX25saXN0LCBFWFRFUk5BTF9OTElTVF9TSVpFKTogRG9uJ3QgZGVmaW5lIGlmCi0JYGV4dGVybmFsX25saXN0JyBpcyBhbHJlYWR5IGRlZmluZWQgYXMgYSBtYWNyby4KLQotU2F0IEF1ZyAxNSAwNDoyMzowMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYWRvYmUuaDogIEFkZCBkZXNjcmlwdGlvbiBvZiBhLm91dC5hZG9iZSBmb3JtYXQuCi0KLUZyaSBKdWwgIDMgMDA6MzY6NTIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmOiAgVXBkYXRlIG1vcmUgU29sYXJpcyBkZWZpbml0aW9ucy4KLQkqIHN0YWJfZ251Lmg6ICBBZGQgTl9TTyBsYW5ndWFnZSB0eXBlcywgYW5kIFNvbGFyaXMgYmFzaWMgZmxvYXQgdHlwZXMuCi0KLVN1biBKdW4gMTQgMTA6NTM6NTMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmOiAgVXBkYXRlIGRlc2NyaXB0aW9ucyBvZiBTb2xhcmlzLTIgc3RhYnM7IGFkZCBOX1VOREYuCi0KLVRodSBKdW4gMTEgMDE6MTI6MDcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmOiAgQWRkIE5fT0JKIGFuZCBOX09QVCBmcm9tIFNvbGFyaXMtMi4KLQotVGh1IEphbiAzMCAxODoxMjo0NCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dC9hb3V0NjQuaDogTl9UWFRTSVpFIG5lZWRzIHNvbWUgbW9yZSBwYXJlbnRoZXNlcy4KLQlJIGRvbid0IHRydXN0IEMgcHJlY2VkZW5jZS4KLQotV2VkIERlYyAxOCAxNDozMjowMSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dC9hb3V0NjQuaDogIE1vdmUgY29tbW9uIHN1bm9zLXNwZWNpZmljIHRlc3QKLQl0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcyBpbnRvIG5ldyBtYWNybyBOX1NIQVJFRF9MSUIuCi0JVXNlIGl0IHRvIHNpbXBsaWZ5JnJlZm9ybWF0IE5fVFhUQUREUiwgTl9UWFRPRkYsIE5fVFhUU0laRS4KLQotU2F0IE5vdiAzMCAyMDozNDo1MiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogQ2hhbmdlTG9nLCBhb3V0NjQuaCwgYXIuaCwgZW5jYXAuaCwgaG9zdC5oLCBocC5oLCByYW5saWIuaCwKLQlyZWxvYy5oLCBzdGFiLmRlZiwgc3RhYl9nbnUuaCwgc3VuNC5oOiBBbGwgbW92ZWQgZnJvbSB0aGUKLQlkZXZvL2luY2x1ZGUgZGlyZWN0b3J5Ci0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9hZG9iZS5oIGIvaW5jbHVkZS9hb3V0L2Fkb2JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMmYxNWMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2Fkb2JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyogYGEub3V0LmFkb2JlJyBkaWZmZXJlbmNlcyBmcm9tIHN0YW5kYXJkIGEub3V0IGZpbGVzICovCi0KLSNpZm5kZWYgX19BX09VVF9BRE9CRV9IX18KLSNkZWZpbmUgX19BX09VVF9BRE9CRV9IX18KLQotI2RlZmluZQlCWVRFU19JTl9XT1JECTQKLQotLyogU3RydWN0IGV4dGVybmFsX2V4ZWMgaXMgdGhlIHNhbWUuICAqLwotCi0vKiBUaGlzIGlzIHRoZSBsYXlvdXQgb24gZGlzayBvZiB0aGUgMzItYml0IG9yIDY0LWJpdCBleGVjIGhlYWRlci4gKi8KLQotc3RydWN0IGV4dGVybmFsX2V4ZWMgCi17Ci0gIGJmZF9ieXRlIGVfaW5mb1s0XTsJCS8qIG1hZ2ljIG51bWJlciBhbmQgc3R1ZmYJCSovCi0gIGJmZF9ieXRlIGVfdGV4dFtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHRleHQgc2VjdGlvbiBpbiBieXRlcwkqLwotICBiZmRfYnl0ZSBlX2RhdGFbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBkYXRhIHNlY3Rpb24gaW4gYnl0ZXMJKi8KLSAgYmZkX2J5dGUgZV9ic3NbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBic3MgYXJlYSBpbiBieXRlcyAJCSovCi0gIGJmZF9ieXRlIGVfc3ltc1tCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBpbiBieXRlcyAJKi8KLSAgYmZkX2J5dGUgZV9lbnRyeVtCWVRFU19JTl9XT1JEXTsgLyogc3RhcnQgYWRkcmVzcyAJCQkqLwotICBiZmRfYnl0ZSBlX3Ryc2l6ZVtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHRleHQgcmVsb2NhdGlvbiBpbmZvCSovCi0gIGJmZF9ieXRlIGVfZHJzaXplW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgZGF0YSByZWxvY2F0aW9uIGluZm8gCSovCi19OwotCi0jZGVmaW5lCUVYRUNfQllURVNfU0laRQkoNCArIEJZVEVTX0lOX1dPUkQgKiA3KQotCi0vKiBNYWdpYyBudW1iZXJzIGZvciBhLm91dCBmaWxlcyAqLwotCi0jdW5kZWYJWk1BR0lDCi0jZGVmaW5lCVpNQUdJQwkweEFEMEJFCQkvKiBDdXRlLCBlaD8gICovCi0jdW5kZWYJT01BR0lDCi0jdW5kZWYJTk1BR0lDCi0KLSNkZWZpbmUgTl9CQURNQUcoeCkJICAoKHgpLmFfaW5mbyAhPSBaTUFHSUMpCi0KLS8qIEJ5IGRlZmF1bHQsIHNlZ21lbnQgc2l6ZSBpcyBjb25zdGFudC4gIEJ1dCBzb21lIG1hY2hpbmVzIG92ZXJyaWRlIHRoaXMKLSAgIHRvIGJlIGEgZnVuY3Rpb24gb2YgdGhlIGEub3V0IGhlYWRlciAoZS5nLiBtYWNoaW5lIHR5cGUpLiAgKi8KLSNpZm5kZWYJTl9TRUdTSVpFCi0jZGVmaW5lCU5fU0VHU0laRSh4KQlTRUdNRU5UX1NJWkUKLSNlbmRpZgotI3VuZGVmIE5fU0VHU0laRSAgIC8qIEZJWE1FWFhYWCAqLwotCi0vKiBTZWdtZW50IGluZm9ybWF0aW9uIGZvciB0aGUgYS5vdXQuQWRvYmUgZm9ybWF0IGlzIHNwZWNpZmllZCBhZnRlciB0aGUKLSAgIGZpbGUgaGVhZGVyLiAgSXQgY29udGFpbnMgTiBzZWdtZW50IGRlc2NyaXB0b3JzLCBmb2xsb3dlZCBieSBvbmUgd2l0aAotICAgYSB0eXBlIG9mIHplcm8uICAKLQotICAgVGhlIGFjdHVhbCB0ZXh0IG9mIHRoZSBzZWdtZW50cyBzdGFydHMgYXQgTl9UWFRPRkYgaW4gdGhlIGZpbGUsCi0gICByZWdhcmRsZXNzIG9mIGhvdyBtYW55IG9yIGhvdyBmZXcgc2VnbWVudCBoZWFkZXJzIHRoZXJlIGFyZS4gICovCi0KLXN0cnVjdCBleHRlcm5hbF9zZWdkZXNjIHsKLQl1bnNpZ25lZCBjaGFyIGVfdHlwZVsxXTsKLQl1bnNpZ25lZCBjaGFyIGVfc2l6ZVszXTsKLQl1bnNpZ25lZCBjaGFyIGVfdmlydGJhc2VbNF07Ci0JdW5zaWduZWQgY2hhciBlX2ZpbGViYXNlWzRdOwotfTsKLQotc3RydWN0IGludGVybmFsX3NlZ2Rlc2MgewotCXVuc2lnbmVkIGludAlhX3R5cGU6ODsJLyogU2VnbWVudCB0eXBlIE5fVEVYVCwgTl9EQVRBLCAwICovCi0JdW5zaWduZWQgaW50IAlhX3NpemU6MjQ7CS8qIFNlZ21lbnQgc2l6ZSAqLwotCWJmZF92bWEJCWFfdmlydGJhc2U7CS8qIFZpcnR1YWwgYWRkcmVzcyAqLwotCXVuc2lnbmVkIGludAlhX2ZpbGViYXNlOwkvKiBCYXNlIGFkZHJlc3MgaW4gb2JqZWN0IGZpbGUgKi8KLX07Ci0KLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLQotLyogVGhpcyBpcyBkb2N1bWVudGVkIHRvIGJlIGF0IDEwMjQsIGJ1dCBhcHBlYXJzIHRvIHJlYWxseSBiZSBhdCAyMDQ4LgotICAgRklYTUU/ISAgKi8KLSNkZWZpbmUgTl9UWFRPRkYoeCkJMjA0OAotCi0jZGVmaW5lCU5fVFhUU0laRSh4KSAoKHgpLmFfdGV4dCkKLQotI2RlZmluZSBOX0RBVEFERFIoeCkKLQotI2RlZmluZSBOX0JTU0FERFIoeCkKLQotLyogT2Zmc2V0cyBvZiB0aGUgdmFyaW91cyBwb3J0aW9ucyBvZiB0aGUgZmlsZSBhZnRlciB0aGUgdGV4dCBzZWdtZW50LiAgKi8KLQotI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgTl9UWFRTSVpFKHgpICkKLSNkZWZpbmUgTl9UUkVMT0ZGKHgpCSggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhICkKLSNkZWZpbmUgTl9EUkVMT0ZGKHgpCSggTl9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplICkKLSNkZWZpbmUgTl9TWU1PRkYoeCkJKCBOX0RSRUxPRkYoeCkgKyAoeCkuYV9kcnNpemUgKQotI2RlZmluZSBOX1NUUk9GRih4KQkoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCi0MCi0vKiBTeW1ib2xzICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgewotICBiZmRfYnl0ZSBlX3N0cnhbQllURVNfSU5fV09SRF07CS8qIGluZGV4IGludG8gc3RyaW5nIHRhYmxlIG9mIG5hbWUgKi8KLSAgYmZkX2J5dGUgZV90eXBlWzFdOwkJCS8qIHR5cGUgb2Ygc3ltYm9sICovCi0gIGJmZF9ieXRlIGVfb3RoZXJbMV07CQkJLyogbWlzYyBpbmZvICh1c3VhbGx5IGVtcHR5KSAqLwotICBiZmRfYnl0ZSBlX2Rlc2NbMl07CQkJLyogZGVzY3JpcHRpb24gZmllbGQgKi8KLSAgYmZkX2J5dGUgZV92YWx1ZVtCWVRFU19JTl9XT1JEXTsJLyogdmFsdWUgb2Ygc3ltYm9sICovCi19OwotCi0jZGVmaW5lIEVYVEVSTkFMX05MSVNUX1NJWkUgKEJZVEVTX0lOX1dPUkQrNCtCWVRFU19JTl9XT1JEKQotCi1zdHJ1Y3QgaW50ZXJuYWxfbmxpc3QgewotICB1bnNpZ25lZCBsb25nIG5fc3RyeDsJCQkvKiBpbmRleCBpbnRvIHN0cmluZyB0YWJsZSBvZiBuYW1lICovCi0gIHVuc2lnbmVkIGNoYXIgbl90eXBlOwkJCS8qIHR5cGUgb2Ygc3ltYm9sICovCi0gIHVuc2lnbmVkIGNoYXIgbl9vdGhlcjsJCS8qIG1pc2MgaW5mbyAodXN1YWxseSBlbXB0eSkgKi8KLSAgdW5zaWduZWQgc2hvcnQgbl9kZXNjOwkJLyogZGVzY3JpcHRpb24gZmllbGQgKi8KLSAgYmZkX3ZtYSBuX3ZhbHVlOwkJCS8qIHZhbHVlIG9mIHN5bWJvbCAqLwotfTsKLQotLyogVGhlIG5fdHlwZSBmaWVsZCBpcyB0aGUgc3ltYm9sIHR5cGUsIGNvbnRhaW5pbmc6ICAqLwotCi0jZGVmaW5lIE5fVU5ERgkwCS8qIFVuZGVmaW5lZCBzeW1ib2wgKi8KLSNkZWZpbmUgTl9BQlMgCTIJLyogQWJzb2x1dGUgc3ltYm9sIC0tIGRlZmluZWQgYXQgcGFydGljdWxhciBhZGRyICovCi0jZGVmaW5lIE5fVEVYVCAJNAkvKiBUZXh0IHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiB0ZXh0IHNlZyAqLwotI2RlZmluZSBOX0RBVEEgCTYJLyogRGF0YSBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gZGF0YSBzZWcgKi8KLSNkZWZpbmUgTl9CU1MgCTgJLyogQlNTICBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gemVybydkIHNlZyAqLwotI2RlZmluZQlOX0NPTU0JMHgxMgkvKiBDb21tb24gc3ltYm9sICh2aXNpYmxlIGFmdGVyIHNoYXJlZCBsaWIgZHlubGluaykgKi8KLSNkZWZpbmUgTl9GTgkweDFmCS8qIEZpbGUgbmFtZSBvZiAubyBmaWxlICovCi0jZGVmaW5lCU5fRk5fU0VRIDB4MEMJLyogTl9GTiBmcm9tIFNlcXVlbnQgY29tcGlsZXJzIChzaWdoKSAqLwotLyogTm90ZTogTl9FWFQgY2FuIG9ubHkgYmUgdXNlZnVsbHkgT1ItZWQgd2l0aCBOX1VOREYsIE5fQUJTLCBOX1RFWFQsCi0gICBOX0RBVEEsIG9yIE5fQlNTLiAgV2hlbiB0aGUgbG93LW9yZGVyIGJpdCBvZiBvdGhlciB0eXBlcyBpcyBzZXQsCi0gICAoZS5nLiBOX1dBUk5JTkcgdmVyc3VzIE5fRk4pLCB0aGV5IGFyZSB0d28gZGlmZmVyZW50IHR5cGVzLiAgKi8KLSNkZWZpbmUgTl9FWFQgCTEJLyogRXh0ZXJuYWwgc3ltYm9sIChhcyBvcHBvc2VkIHRvIGxvY2FsLXRvLXRoaXMtZmlsZSkgKi8KLSNkZWZpbmUgTl9UWVBFICAweDFlCi0jZGVmaW5lIE5fU1RBQiAJMHhlMAkvKiBJZiBhbnkgb2YgdGhlc2UgYml0cyBhcmUgb24sIGl0J3MgYSBkZWJ1ZyBzeW1ib2wgKi8KLQotI2RlZmluZSBOX0lORFIgMHgwYQotCi0vKiBUaGUgZm9sbG93aW5nIHN5bWJvbHMgcmVmZXIgdG8gc2V0IGVsZW1lbnRzLgotICAgQWxsIHRoZSBOX1NFVFtBVERCXSBzeW1ib2xzIHdpdGggdGhlIHNhbWUgbmFtZSBmb3JtIG9uZSBzZXQuCi0gICBTcGFjZSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBzZXQgaW4gdGhlIHRleHQgc2VjdGlvbiwgYW5kIGVhY2ggc2V0Ci0gICBlbGVtZW50cyB2YWx1ZSBpcyBzdG9yZWQgaW50byBvbmUgd29yZCBvZiB0aGUgc3BhY2UuCi0gICBUaGUgZmlyc3Qgd29yZCBvZiB0aGUgc3BhY2UgaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2V0IChudW1iZXIgb2YgZWxlbWVudHMpLgotCi0gICBUaGUgYWRkcmVzcyBvZiB0aGUgc2V0IGlzIG1hZGUgaW50byBhbiBOX1NFVFYgc3ltYm9sCi0gICB3aG9zZSBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBzZXQuCi0gICBUaGlzIHN5bWJvbCBhY3RzIGxpa2UgYSBOX0RBVEEgZ2xvYmFsIHN5bWJvbAotICAgaW4gdGhhdCBpdCBjYW4gc2F0aXNmeSB1bmRlZmluZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcy4gICovCi0KLS8qIFRoZXNlIGFwcGVhciBhcyBpbnB1dCB0byBMRCwgaW4gYSAubyBmaWxlLiAgKi8KLSNkZWZpbmUJTl9TRVRBCTB4MTQJCS8qIEFic29sdXRlIHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVFQJMHgxNgkJLyogVGV4dCBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRECTB4MTgJCS8qIERhdGEgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VUQgkweDFBCQkvKiBCc3Mgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0KLS8qIFRoaXMgaXMgb3V0cHV0IGZyb20gTEQuICAqLwotI2RlZmluZSBOX1NFVFYJMHgxQwkJLyogUG9pbnRlciB0byBzZXQgdmVjdG9yIGluIGRhdGEgYXJlYS4gICovCi0KLS8qIFdhcm5pbmcgc3ltYm9sLiBUaGUgdGV4dCBnaXZlcyBhIHdhcm5pbmcgbWVzc2FnZSwgdGhlIG5leHQgc3ltYm9sCi0gICBpbiB0aGUgdGFibGUgd2lsbCBiZSB1bmRlZmluZWQuIFdoZW4gdGhlIHN5bWJvbCBpcyByZWZlcmVuY2VkLCB0aGUKLSAgIG1lc3NhZ2UgaXMgcHJpbnRlZC4gICovCi0KLSNkZWZpbmUJTl9XQVJOSU5HIDB4MWUKLQotLyogUmVsb2NhdGlvbnMgCi0KLSAgVGhlcmUJYXJlIHR3byB0eXBlcyBvZiByZWxvY2F0aW9uIGZsYXZvdXJzIGZvciBhLm91dCBzeXN0ZW1zLAotICBzdGFuZGFyZCBhbmQgZXh0ZW5kZWQuIFRoZSBzdGFuZGFyZCBmb3JtIGlzIHVzZWQgb24gc3lzdGVtcyB3aGVyZSB0aGUKLSAgaW5zdHJ1Y3Rpb24gaGFzIHJvb20gZm9yIGFsbCB0aGUgYml0cyBvZiBhbiBvZmZzZXQgdG8gdGhlIG9wZXJhbmQsIHdoaWxzdAotICB0aGUgZXh0ZW5kZWQgZm9ybSBpcyB1c2VkIHdoZW4gYW4gYWRkcmVzcyBvcGVyYW5kIGhhcyB0byBiZSBzcGxpdCBvdmVyIG4KLSAgaW5zdHJ1Y3Rpb25zLiBFZywgb24gdGhlIDY4aywgZWFjaCBtb3ZlIGluc3RydWN0aW9uIGNhbiByZWZlcmVuY2UKLSAgdGhlIHRhcmdldCB3aXRoIGEgZGlzcGxhY2VtZW50IG9mIDE2IG9yIDMyIGJpdHMuIE9uIHRoZSBzcGFyYywgbW92ZQotICBpbnN0cnVjdGlvbnMgdXNlIGFuIG9mZnNldCBvZiAxNCBiaXRzLCBzbyB0aGUgb2Zmc2V0IGlzIHN0b3JlZCBpbgotICB0aGUgcmVsb2MgZmllbGQsIGFuZCB0aGUgZGF0YSBpbiB0aGUgc2VjdGlvbiBpcyBpZ25vcmVkLgotKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgc2luZ2xlIHJlbG9jYXRpb24gdG8gYmUgcGVyZm9ybWVkLgotICAgVGhlIHRleHQtcmVsb2NhdGlvbiBzZWN0aW9uIG9mIHRoZSBmaWxlIGlzIGEgdmVjdG9yIG9mIHRoZXNlIHN0cnVjdHVyZXMsCi0gICBhbGwgb2Ygd2hpY2ggYXBwbHkgdG8gdGhlIHRleHQgc2VjdGlvbi4KLSAgIExpa2V3aXNlLCB0aGUgZGF0YS1yZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLQotc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCB7Ci0gIGJmZF9ieXRlIHJfYWRkcmVzc1tCWVRFU19JTl9XT1JEXTsJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgKi8KLSAgYmZkX2J5dGUgcl9pbmRleFszXTsJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgYmZkX2J5dGUgcl90eXBlWzFdOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLwotfTsKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcJMHg4MAotI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUJMHgwMQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcJMHg2MAotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHCTUJLyogVG8gc2hpZnQgdG8gdW5pdHMgcGxhY2UgKi8KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRQkweDA2Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUJMQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcJMHgxMAotI2RlZmluZQlSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFCTB4MDgKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRwkweDA4Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFCTB4MDgKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcJMHgwNAotI2RlZmluZQlSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUJMHgwNAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRwkweDAyCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRQkweDAyCi0KLSNkZWZpbmUJUkVMT0NfU1REX1NJWkUJKEJZVEVTX0lOX1dPUkQgKyAzICsgMSkJCS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCi0KLXN0cnVjdCByZWxvY19zdGRfaW50ZXJuYWwKLXsKLSAgYmZkX3ZtYSByX2FkZHJlc3M7CQkvKiBBZGRyZXNzICh3aXRoaW4gc2VnbWVudCkgdG8gYmUgcmVsb2NhdGVkLiAgKi8KLSAgLyogVGhlIG1lYW5pbmcgb2Ygcl9zeW1ib2xudW0gZGVwZW5kcyBvbiByX2V4dGVybi4gICovCi0gIHVuc2lnbmVkIGludCByX3N5bWJvbG51bToyNDsKLSAgLyogTm9uemVybyBtZWFucyB2YWx1ZSBpcyBhIHBjLXJlbGF0aXZlIG9mZnNldAotICAgICBhbmQgaXQgc2hvdWxkIGJlIHJlbG9jYXRlZCBmb3IgY2hhbmdlcyBpbiBpdHMgb3duIGFkZHJlc3MKLSAgICAgYXMgd2VsbCBhcyBmb3IgY2hhbmdlcyBpbiB0aGUgc3ltYm9sIG9yIHNlY3Rpb24gc3BlY2lmaWVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfcGNyZWw6MTsKLSAgLyogTGVuZ3RoIChhcyBleHBvbmVudCBvZiAyKSBvZiB0aGUgZmllbGQgdG8gYmUgcmVsb2NhdGVkLgotICAgICBUaHVzLCBhIHZhbHVlIG9mIDIgaW5kaWNhdGVzIDE8PDIgYnl0ZXMuICAqLwotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg6MjsKLSAgLyogMSA9PiByZWxvY2F0ZSB3aXRoIHZhbHVlIG9mIHN5bWJvbC4KLSAgICAgcl9zeW1ib2xudW0gaXMgdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wKLSAgICAgaW4gZmlsZXMgdGhlIHN5bWJvbCB0YWJsZS4KLSAgICAgMCA9PiByZWxvY2F0ZSB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgc2VnbWVudC4KLSAgICAgcl9zeW1ib2xudW0gaXMgTl9URVhULCBOX0RBVEEsIE5fQlNTIG9yIE5fQUJTCi0gICAgICh0aGUgTl9FWFQgYml0IG1heSBiZSBzZXQgYWxzbywgYnV0IHNpZ25pZmllcyBub3RoaW5nKS4gICovCi0gIHVuc2lnbmVkIGludCByX2V4dGVybjoxOwotICAvKiBUaGUgbmV4dCB0aHJlZSBiaXRzIGFyZSBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcywgYW5kIHNlZW0gdG8KLSAgICAgYmUgdW5kb2N1bWVudGVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfYmFzZXJlbDoxOwkvKiBMaW5rYWdlIHRhYmxlIHJlbGF0aXZlICovCi0gIHVuc2lnbmVkIGludCByX2ptcHRhYmxlOjE7CS8qIHBjLXJlbGF0aXZlIHRvIGp1bXAgdGFibGUgKi8KLSAgdW5zaWduZWQgaW50IHJfcmVsYXRpdmU6MTsJLyogInJlbGF0aXZlIHJlbG9jYXRpb24iICovCi0gIC8qIHVudXNlZCAqLwotICB1bnNpZ25lZCBpbnQgcl9wYWQ6MTsJCS8qIFBhZGRpbmcgLS0gc2V0IHRvIHplcm8gKi8KLX07Ci0KLQotLyogRVhURU5ERUQgUkVMT0NTICAqLwotCi1zdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsIHsKLSAgYmZkX2J5dGUgcl9hZGRyZXNzW0JZVEVTX0lOX1dPUkRdOwkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KLSAgYmZkX2J5dGUgcl9pbmRleFszXTsJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgYmZkX2J5dGUgcl90eXBlWzFdOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLwotICBiZmRfYnl0ZSByX2FkZGVuZFtCWVRFU19JTl9XT1JEXTsJLyogZGF0dW0gYWRkZW5kCQkJCSovCi19OwotCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcJMHg4MAotI2RlZmluZQlSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFCTB4MDEKLQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX0JJRwkJMHgxRgotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRwkwCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFCTB4RjgKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUJMwotCi0vKiBCeXRlcyBwZXIgcmVsb2NhdGlvbiBlbnRyeSAqLwotI2RlZmluZQlSRUxPQ19FWFRfU0laRQkoQllURVNfSU5fV09SRCArIDMgKyAxICsgQllURVNfSU5fV09SRCkKLQotZW51bSByZWxvY190eXBlCi17Ci0gIC8qIHNpbXBsZSByZWxvY2F0aW9ucyAqLwotICBSRUxPQ184LAkJCS8qIGRhdGFbMDo3XSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgUkVMT0NfMTYsCQkJLyogZGF0YVswOjE1XSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgUkVMT0NfMzIsCQkJLyogZGF0YVswOjMxXSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgLyogcGMtcmVsIGRpc3BsYWNlbWVudCAqLwotICBSRUxPQ19ESVNQOCwJCQkvKiBkYXRhWzA6N10gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICBSRUxPQ19ESVNQMTYsCQkJLyogZGF0YVswOjE1XSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIFJFTE9DX0RJU1AzMiwJCQkvKiBkYXRhWzA6MzFdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgLyogU3BlY2lhbCAqLwotICBSRUxPQ19XRElTUDMwLAkJLyogZGF0YVswOjI5XSA9IChhZGRlbmQgKyBzdiAtIHBjKT4+MiAJKi8KLSAgUkVMT0NfV0RJU1AyMiwJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YgLSBwYyk+PjIgCSovCi0gIFJFTE9DX0hJMjIsCQkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdik+PjEwIAkqLwotICBSRUxPQ18yMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KSAJCSovCi0gIFJFTE9DXzEzLAkJCS8qIGRhdGFbMDoxMl0gPSAoYWRkZW5kICsgc3YpCQkqLwotICBSRUxPQ19MTzEwLAkJCS8qIGRhdGFbMDo5XSA9IChhZGRlbmQgKyBzdikJCSovCi0gIFJFTE9DX1NGQV9CQVNFLAkJCi0gIFJFTE9DX1NGQV9PRkYxMywKLSAgLyogUC5JLkMuIChiYXNlLXJlbGF0aXZlKSAqLwotICBSRUxPQ19CQVNFMTAsICAJCS8qIE5vdCBzdXJlIC0gbWF5YmUgd2UgY2FuIGRvIHRoaXMgdGhlICovCi0gIFJFTE9DX0JBU0UxMywJCQkvKiByaWdodCB3YXkgbm93ICovCi0gIFJFTE9DX0JBU0UyMiwKLSAgLyogZm9yIHNvbWUgc29ydCBvZiBwYy1yZWwgUC5JLkMuICg/KSAqLwotICBSRUxPQ19QQzEwLAotICBSRUxPQ19QQzIyLAotICAvKiBQLkkuQy4ganVtcCB0YWJsZSAqLwotICBSRUxPQ19KTVBfVEJMLAotICAvKiByZXB1dGVkbHkgZm9yIHNoYXJlZCBsaWJyYXJpZXMgc29tZWhvdyAqLwotICBSRUxPQ19TRUdPRkYxNiwKLSAgUkVMT0NfR0xPQl9EQVQsCi0gIFJFTE9DX0pNUF9TTE9ULAotICBSRUxPQ19SRUxBVElWRSwKLQotICBSRUxPQ18xMSwJCi0gIFJFTE9DX1dESVNQMl8xNCwKLSAgUkVMT0NfV0RJU1AxOSwKLSAgUkVMT0NfSEhJMjIsCQkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdikgPj4gNDIgICAgICovCi0gIFJFTE9DX0hMTzEwLAkJCS8qIGRhdGFbMDo5XSA9IChhZGRlbmQgKyBzdikgPj4gMzIgICAgICAqLwotICAKLSAgLyogMjlLIHJlbG9jYXRpb24gdHlwZXMgKi8KLSAgUkVMT0NfSlVNUFRBUkcsCi0gIFJFTE9DX0NPTlNULAotICBSRUxPQ19DT05TVEgsCi0gIAotICBOT19SRUxPQwotICB9OwotCi0KLXN0cnVjdCByZWxvY19pbnRlcm5hbCB7Ci0gIGJmZF92bWEgcl9hZGRyZXNzOwkJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgCSovCi0gIGxvbmcJcl9pbmRleDsJCS8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgCSovCi0gIGVudW0gcmVsb2NfdHlwZSByX3R5cGU7CS8qIHJlbG9jYXRpb24gdHlwZQkJCSovCi0gIGJmZF92bWEgcl9hZGRlbmQ7CQkvKiBkYXR1bSBhZGRlbmQJCQkJKi8KLX07Ci0KLSNlbmRpZgkJCQkvKiBfX0FfT1VUX0FET0JFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2FvdXQ2NC5oIGIvaW5jbHVkZS9hb3V0L2FvdXQ2NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmYxMTQwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9hb3V0NjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3NSArMCwwIEBACi0vKiBgYS5vdXQnIG9iamVjdC1maWxlIGRlZmluaXRpb25zLCBpbmNsdWRpbmcgZXh0ZW5zaW9ucyB0byA2NC1iaXQgZmllbGRzICovCi0KLSNpZm5kZWYgX19BX09VVF82NF9IX18KLSNkZWZpbmUgX19BX09VVF82NF9IX18KLQotLyogVGhpcyBpcyB0aGUgbGF5b3V0IG9uIGRpc2sgb2YgdGhlIDMyLWJpdCBvciA2NC1iaXQgZXhlYyBoZWFkZXIuICovCi0KLSNpZm5kZWYgZXh0ZXJuYWxfZXhlYwotc3RydWN0IGV4dGVybmFsX2V4ZWMgCi17Ci0gIGJmZF9ieXRlIGVfaW5mb1s0XTsJCS8qIG1hZ2ljIG51bWJlciBhbmQgc3R1ZmYJCSovCi0gIGJmZF9ieXRlIGVfdGV4dFtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHRleHQgc2VjdGlvbiBpbiBieXRlcwkqLwotICBiZmRfYnl0ZSBlX2RhdGFbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBkYXRhIHNlY3Rpb24gaW4gYnl0ZXMJKi8KLSAgYmZkX2J5dGUgZV9ic3NbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBic3MgYXJlYSBpbiBieXRlcyAJCSovCi0gIGJmZF9ieXRlIGVfc3ltc1tCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBpbiBieXRlcyAJKi8KLSAgYmZkX2J5dGUgZV9lbnRyeVtCWVRFU19JTl9XT1JEXTsgLyogc3RhcnQgYWRkcmVzcyAJCQkqLwotICBiZmRfYnl0ZSBlX3Ryc2l6ZVtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHRleHQgcmVsb2NhdGlvbiBpbmZvCSovCi0gIGJmZF9ieXRlIGVfZHJzaXplW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgZGF0YSByZWxvY2F0aW9uIGluZm8gCSovCi19OwotCi0jZGVmaW5lCUVYRUNfQllURVNfU0laRQkoNCArIEJZVEVTX0lOX1dPUkQgKiA3KQotCi0vKiBNYWdpYyBudW1iZXJzIGZvciBhLm91dCBmaWxlcyAqLwotCi0jaWYgQVJDSF9TSVpFPT02NAotI2RlZmluZSBPTUFHSUMgMHgxMDAxCQkvKiBDb2RlIGluZGljYXRpbmcgb2JqZWN0IGZpbGUgICovCi0jZGVmaW5lIFpNQUdJQyAweDEwMDIJCS8qIENvZGUgaW5kaWNhdGluZyBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIE5NQUdJQyAweDEwMDMJCS8qIENvZGUgaW5kaWNhdGluZyBwdXJlIGV4ZWN1dGFibGUuICAqLwotCi0vKiBUaGVyZSBpcyBubyA2NC1iaXQgUU1BR0lDIGFzIGZhciBhcyBJIGtub3cuICAqLwotCi0jZGVmaW5lIE5fQkFETUFHKHgpCSAgKE5fTUFHSUMoeCkgIT0gT01BR0lDCQlcCi0JCQkmJiBOX01BR0lDKHgpICE9IE5NQUdJQwkJXAotICAJCQkmJiBOX01BR0lDKHgpICE9IFpNQUdJQykKLSNlbHNlCi0jZGVmaW5lIE9NQUdJQyAwNDA3CQkvKiAuLi5vYmplY3QgZmlsZSBvciBpbXB1cmUgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIE5NQUdJQyAwNDEwCQkvKiBDb2RlIGluZGljYXRpbmcgcHVyZSBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgWk1BR0lDIDA0MTMJCS8qIENvZGUgaW5kaWNhdGluZyBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIEJNQUdJQyAwNDE1CQkvKiBVc2VkIGJ5IGEgYi5vdXQgb2JqZWN0LiAgKi8KLQotLyogVGhpcyBpbmRpY2F0ZXMgYSBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZSB3aXRoIHRoZSBoZWFkZXIgaW4gdGhlIHRleHQuCi0gICBJdCBpcyB1c2VkIGJ5IDM4NkJTRCAoYW5kIHZhcmlhbnRzKSBhbmQgTGludXgsIGF0IGxlYXN0LiAgKi8KLSNpZm5kZWYgUU1BR0lDCi0jZGVmaW5lIFFNQUdJQyAwMzE0Ci0jZW5kaWYKLSMgaWZuZGVmIE5fQkFETUFHCi0jICBkZWZpbmUgTl9CQURNQUcoeCkJICAoTl9NQUdJQyh4KSAhPSBPTUFHSUMJCVwKLQkJCSYmIE5fTUFHSUMoeCkgIT0gTk1BR0lDCQlcCi0gIAkJCSYmIE5fTUFHSUMoeCkgIT0gWk1BR0lDIFwKLQkJICAgICAgICAmJiBOX01BR0lDKHgpICE9IFFNQUdJQykKLSMgZW5kaWYgLyogTl9CQURNQUcgKi8KLSNlbmRpZgotCi0jZW5kaWYKLQotI2lmZGVmIFFNQUdJQwotI2RlZmluZSBOX0lTX1FNQUdJQyh4KSAoTl9NQUdJQyAoeCkgPT0gUU1BR0lDKQotI2Vsc2UKLSNkZWZpbmUgTl9JU19RTUFHSUMoeCkgKDApCi0jZW5kaWYKLQotLyogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBUQVJHRVRfUEFHRV9TSVpFIGFuZCBOX1NFR1NJWkUgaXMgdGhhdCBUQVJHRVRfUEFHRV9TSVpFIGlzCi0gICB0aGUgZmluZXN0IGdyYW51bGFyaXR5IGF0IHdoaWNoIHlvdSBjYW4gcGFnZSBzb21ldGhpbmcsIHRodXMgaXQKLSAgIGNvbnRyb2xzIHRoZSBwYWRkaW5nIChpZiBhbnkpIGJlZm9yZSB0aGUgdGV4dCBzZWdtZW50IG9mIGEgWk1BR0lDCi0gICBmaWxlLiAgTl9TRUdTSVpFIGlzIHRoZSByZXNvbHV0aW9uIGF0IHdoaWNoIHRoaW5ncyBjYW4gYmUgbWFya2VkIGFzCi0gICByZWFkLW9ubHkgdmVyc3VzIHJlYWQvd3JpdGUsIHNvIGl0IGNvbnRyb2xzIHRoZSBwYWRkaW5nIGJldHdlZW4gdGhlCi0gICB0ZXh0IHNlZ21lbnQgYW5kIHRoZSBkYXRhIHNlZ21lbnQgKGluIG1lbW9yeTsgb24gZGlzayB0aGUgcGFkZGluZwotICAgYmV0d2VlbiB0aGVtIGlzIFRBUkdFVF9QQUdFX1NJWkUpLiAgVEFSR0VUX1BBR0VfU0laRSBhbmQgTl9TRUdTSVpFIGFyZSB0aGUgc2FtZQotICAgZm9yIG1vc3QgbWFjaGluZXMsIGJ1dCBkaWZmZXJlbnQgZm9yIHN1bjMuICAqLwotCi0vKiBCeSBkZWZhdWx0LCBzZWdtZW50IHNpemUgaXMgY29uc3RhbnQuICBCdXQgc29tZSBtYWNoaW5lcyBvdmVycmlkZSB0aGlzCi0gICB0byBiZSBhIGZ1bmN0aW9uIG9mIHRoZSBhLm91dCBoZWFkZXIgKGUuZy4gbWFjaGluZSB0eXBlKS4gICovCi0KLSNpZm5kZWYJTl9TRUdTSVpFCi0jZGVmaW5lCU5fU0VHU0laRSh4KQlTRUdNRU5UX1NJWkUKLSNlbmRpZgotDAotLyogVmlydHVhbCBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgdGV4dCBzZWN0aW9uLgotICAgVGhpcyBpcyBnZXR0aW5nIHZlcnkgY29tcGxpY2F0ZWQuICBBIGdvb2QgcmVhc29uIHRvIGRpc2NhcmQgYS5vdXQgZm9ybWF0Ci0gICBmb3Igc29tZXRoaW5nIHRoYXQgc3BlY2lmaWVzIHRoZXNlIGZpZWxkcyBleHBsaWNpdGx5LiAgQnV0IHRpbCB0aGVuLi4uCi0KLSAgICogT01BR0lDIGFuZCBOTUFHSUMgZmlsZXM6Ci0gICAgICAgKG9iamVjdCBmaWxlczogdGV4dCBmb3IgInJlbG9jYXRhYmxlIGFkZHIgMCIgcmlnaHQgYWZ0ZXIgdGhlIGhlYWRlcikKLSAgICAgICBzdGFydCBhdCAwLCBvZmZzZXQgaXMgRVhFQ19CWVRFU19TSVpFLCBzaXplIGFzIHN0YXRlZC4KLSAgICogVGhlIHRleHQgYWRkcmVzcywgb2Zmc2V0LCBhbmQgc2l6ZSBvZiBaTUFHSUMgZmlsZXMgZGVwZW5kCi0gICAgIG9uIHRoZSBlbnRyeSBwb2ludCBvZiB0aGUgZmlsZToKLSAgICAgKiBlbnRyeSBwb2ludCBiZWxvdyBURVhUX1NUQVJUX0FERFI6Ci0gICAgICAgKGhhY2sgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMpCi0gICAgICAgc3RhcnQgYXQgMCwgb2Zmc2V0IGlzIDAsIHNpemUgYXMgc3RhdGVkLgotICAgICAqIElmIE5fSEVBREVSX0lOX1RFWFQoeCkgaXMgdHJ1ZSAod2hpY2ggZGVmYXVsdHMgdG8gYmVpbmcgdGhlCi0gICAgICAgY2FzZSB3aGVuIHRoZSBlbnRyeSBwb2ludCBpcyBFWEVDX0JZVEVTX1NJWkUgb3IgZnVydGhlciBpbnRvIGEgcGFnZSk6Ci0gICAgICAgbm8gcGFkZGluZyBpcyBuZWVkZWQ7IHRleHQgY2FuIHN0YXJ0IGFmdGVyIGV4ZWMgaGVhZGVyLiAgU3VuCi0gICAgICAgY29uc2lkZXJzIHRoZSB0ZXh0IHNlZ21lbnQgb2Ygc3VjaCBmaWxlcyB0byBpbmNsdWRlIHRoZSBleGVjIGhlYWRlcjsKLSAgICAgICBmb3IgQkZEJ3MgcHVycG9zZXMsIHdlIGRvbid0LCB3aGljaCBtYWtlcyBtb3JlIHdvcmsgZm9yIHVzLgotICAgICAgIHN0YXJ0IGF0IFRFWFRfU1RBUlRfQUREUiArIEVYRUNfQllURVNfU0laRSwgb2Zmc2V0IGlzIEVYRUNfQllURVNfU0laRSwKLSAgICAgICBzaXplIGFzIHN0YXRlZCBtaW51cyBFWEVDX0JZVEVTX1NJWkUuCi0gICAgICogSWYgTl9IRUFERVJfSU5fVEVYVCh4KSBpcyBmYWxzZSAod2hpY2ggZGVmYXVsdHMgdG8gYmVpbmcgdGhlIGNhc2Ugd2hlbgotICAgICAgIHRoZSBlbnRyeSBwb2ludCBpcyBsZXNzIHRoYW4gRVhFQ19CWVRFU19TSVpFIGludG8gYSBwYWdlIChlLmcuIHBhZ2UKLSAgICAgICBhbGlnbmVkKSk6IChwYWRkaW5nIGlzIG5lZWRlZCBzbyB0aGF0IHRleHQgY2FuIHN0YXJ0IGF0IGEgcGFnZSBib3VuZGFyeSkKLSAgICAgICBzdGFydCBhdCBURVhUX1NUQVJUX0FERFIsIG9mZnNldCBUQVJHRVRfUEFHRV9TSVpFLCBzaXplIGFzIHN0YXRlZC4KLQotICAgIFNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIG1heSB3YW50IHRvIGhhcmR3aXJlIE5fSEVBREVSX0lOX1RFWFQsCi0gICAgZm9yIGVmZmljaWVuY3kgb3IgdG8gYWxsb3cgcGVvcGxlIHRvIHBsYXkgZ2FtZXMgd2l0aCB0aGUgZW50cnkgcG9pbnQuCi0gICAgSW4gdGhhdCBjYXNlLCB5b3Ugd291bGQgI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIGFzIDEgZm9yIHN1bm9zLAotICAgIGFuZCBhcyAwIGZvciBtb3N0IG90aGVyIGhvc3RzIChTb255IE5ld3MsIFZheCBVbHRyaXgsIGV0YykuCi0gICAgKERvIHRoaXMgaW4gdGhlIGFwcHJvcHJpYXRlIGJmZCB0YXJnZXQgZmlsZS4pCi0gICAgKFRoZSBkZWZhdWx0IGlzIGEgaGV1cmlzdGljIHRoYXQgd2lsbCBicmVhayBpZiBwZW9wbGUgdHJ5IGNoYW5naW5nCi0gICAgdGhlIGVudHJ5IHBvaW50LCBwZXJoYXBzIHdpdGggdGhlIGxkIC1lIGZsYWcuKQotCi0gICAgKiBRTUFHSUMgaXMgYWx3YXlzIGxpa2UgYSBaTUFHSUMgZm9yIHdoaWNoIE5fSEVBREVSX0lOX1RFWFQgaXMgdHJ1ZSwKLSAgICBhbmQgZm9yIHdoaWNoIHRoZSBzdGFydGluZyBhZGRyZXNzIGlzIFRBUkdFVF9QQUdFX1NJWkUgKG9yIHNob3VsZCB0aGlzIGJlCi0gICAgU0VHTUVOVF9TSVpFPykgKFRFWFRfU1RBUlRfQUREUiBvbmx5IGFwcGxpZXMgdG8gWk1BR0lDLCBub3QgdG8gUU1BR0lDKS4KLSAgICAqLwotCi0vKiBUaGlzIG1hY3JvIGlzIG9ubHkgcmVsZXZhbnQgZm9yIFpNQUdJQyBmaWxlczsgUU1BR0lDIGFsd2F5cyBoYXMgdGhlIGhlYWRlcgotICAgaW4gdGhlIHRleHQuICAqLwotI2lmbmRlZiBOX0hFQURFUl9JTl9URVhUCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgKCgoeCkuYV9lbnRyeSAmIChUQVJHRVRfUEFHRV9TSVpFLTEpKSA+PSBFWEVDX0JZVEVTX1NJWkUpCi0jZW5kaWYKLQotLyogU3VuIHNoYXJlZCBsaWJyYXJpZXMsIG5vdCBsaW51eC4gIFRoaXMgbWFjcm8gaXMgb25seSByZWxldmFudCBmb3IgWk1BR0lDCi0gICBmaWxlcy4gICovCi0jaWZuZGVmIE5fU0hBUkVEX0xJQgotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgKCh4KS5hX2VudHJ5IDwgVEVYVF9TVEFSVF9BRERSKQotI2VuZGlmCi0KLS8qIFJldHVybmluZyAwIG5vdCBURVhUX1NUQVJUX0FERFIgZm9yIE9NQUdJQyBhbmQgTk1BR0lDIGlzIGJhc2VkIG9uCi0gICB0aGUgYXNzdW1wdGlvbiB0aGF0IHdlIGFyZSBkZWFsaW5nIHdpdGggYSAubyBmaWxlLCBub3QgYW4KLSAgIGV4ZWN1dGFibGUuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgT01BR0lDIChidXQgbWVhbnMgd2UgZG9uJ3Qgd29yawotICAgcmlnaHQgb24gdGhlIG91dHB1dCBmcm9tIGxkIC1OKTsgbW9yZSBxdWVzdGlvbmFibGUgZm9yIE5NQUdJQy4gICovCi0KLSNpZm5kZWYgTl9UWFRBRERSCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0gICAgKC8qIFRoZSBhZGRyZXNzIG9mIGEgUU1BR0lDIGZpbGUgaXMgYWx3YXlzIG9uZSBwYWdlIGluLCAqLyBcCi0gICAgIC8qIHdpdGggdGhlIGhlYWRlciBpbiB0aGUgdGV4dC4gICovIFwKLSAgICAgTl9JU19RTUFHSUMgKHgpID8gVEFSR0VUX1BBR0VfU0laRSArIEVYRUNfQllURVNfU0laRSA6IFwKLSAgICAgTl9NQUdJQyh4KSAhPSBaTUFHSUMgPyAwIDoJLyogb2JqZWN0IGZpbGUgb3IgTk1BR0lDICovXAotICAgICBOX1NIQVJFRF9MSUIoeCkgPyAwIDoJXAotICAgICBOX0hFQURFUl9JTl9URVhUKHgpICA/CVwKLQkgICAgVEVYVF9TVEFSVF9BRERSICsgRVhFQ19CWVRFU19TSVpFIDoJLyogbm8gcGFkZGluZyAqL1wKLQkgICAgVEVYVF9TVEFSVF9BRERSCQkJLyogYSBwYWdlIG9mIHBhZGRpbmcgKi9cCi0gICAgKQotI2VuZGlmCi0KLS8qIElmIE5fSEVBREVSX0lOX1RFWFQgaXMgbm90IHRydWUgZm9yIFpNQUdJQywgdGhlcmUgaXMgc29tZSBwYWRkaW5nCi0gICB0byBtYWtlIHRoZSB0ZXh0IHNlZ21lbnQgc3RhcnQgYXQgYSBjZXJ0YWluIGJvdW5kYXJ5LiAgRm9yIG1vc3QKLSAgIHN5c3RlbXMsIHRoaXMgYm91bmRhcnkgaXMgVEFSR0VUX1BBR0VfU0laRS4gIEJ1dCBmb3IgTGludXgsIGluIHRoZQotICAgdGltZS1ob25vcmVkIHRyYWRpdGlvbiBvZiBjcmF6eSBaTUFHSUMgaGFja3MsIGl0IGlzIDEwMjQgd2hpY2ggaXMKLSAgIG5vdCB3aGF0IFRBUkdFVF9QQUdFX1NJWkUgbmVlZHMgdG8gYmUgZm9yIFFNQUdJQy4gICovCi0KLSNpZm5kZWYgWk1BR0lDX0RJU0tfQkxPQ0tfU0laRQotI2RlZmluZSBaTUFHSUNfRElTS19CTE9DS19TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNlbmRpZgotCi0jZGVmaW5lIE5fRElTS19CTE9DS19TSVpFKHgpIFwKLSAgKE5fTUFHSUMoeCkgPT0gWk1BR0lDID8gWk1BR0lDX0RJU0tfQkxPQ0tfU0laRSA6IFRBUkdFVF9QQUdFX1NJWkUpCi0KLS8qIE9mZnNldCBpbiBhbiBhLm91dCBvZiB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc2VjdGlvbi4gKi8KLSNpZm5kZWYgTl9UWFRPRkYKLSNkZWZpbmUgTl9UWFRPRkYoeCkJXAotICAgICgvKiBGb3Ige08sTixRfU1BR0lDLCBubyBwYWRkaW5nLiAgKi8gXAotICAgICBOX01BR0lDKHgpICE9IFpNQUdJQyA/IEVYRUNfQllURVNfU0laRSA6IFwKLSAgICAgTl9TSEFSRURfTElCKHgpID8gMCA6IFwKLSAgICAgTl9IRUFERVJfSU5fVEVYVCh4KSA/CVwKLQkgICAgRVhFQ19CWVRFU19TSVpFIDoJCQkvKiBubyBwYWRkaW5nICovXAotCSAgICBaTUFHSUNfRElTS19CTE9DS19TSVpFCQkvKiBhIHBhZ2Ugb2YgcGFkZGluZyAqL1wKLSAgICApCi0jZW5kaWYKLS8qIFNpemUgb2YgdGhlIHRleHQgc2VjdGlvbi4gIEl0J3MgYWx3YXlzIGFzIHN0YXRlZCwgZXhjZXB0IHRoYXQgd2UKLSAgIG9mZnNldCBpdCB0byBgdW5kbycgdGhlIGFkanVzdG1lbnQgdG8gTl9UWFRBRERSIGFuZCBOX1RYVE9GRgotICAgZm9yIFpNQUdJQyBmaWxlcyB0aGF0IG5vbWluYWxseSBpbmNsdWRlIHRoZSBleGVjIGhlYWRlcgotICAgYXMgcGFydCBvZiB0aGUgZmlyc3QgcGFnZSBvZiB0ZXh0LiAgKEJGRCBkb2Vzbid0IGNvbnNpZGVyIHRoZQotICAgZXhlYyBoZWFkZXIgdG8gYmUgcGFydCBvZiB0aGUgdGV4dCBzZWdtZW50LikgICovCi0jaWZuZGVmIE5fVFhUU0laRQotI2RlZmluZQlOX1RYVFNJWkUoeCkgXAotICAgICgvKiBGb3IgUU1BR0lDLCB3ZSBkb24ndCBjb25zaWRlciB0aGUgaGVhZGVyIHBhcnQgb2YgdGhlIHRleHQgc2VjdGlvbi4gICovXAotICAgICBOX0lTX1FNQUdJQyAoeCkgPyAoeCkuYV90ZXh0IC0gRVhFQ19CWVRFU19TSVpFIDogXAotICAgICAoTl9NQUdJQyh4KSAhPSBaTUFHSUMgfHwgTl9TSEFSRURfTElCKHgpKSA/ICh4KS5hX3RleHQgOiBcCi0gICAgIE5fSEVBREVSX0lOX1RFWFQoeCkgID8JXAotCSAgICAoeCkuYV90ZXh0IC0gRVhFQ19CWVRFU19TSVpFOgkvKiBubyBwYWRkaW5nICovXAotCSAgICAoeCkuYV90ZXh0CQkJCS8qIGEgcGFnZSBvZiBwYWRkaW5nICovXAotICAgICkKLSNlbmRpZgotLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VnbWVudCBpbiB2aXJ0dWFsIG1lbW9yeS4KLSAgIEl0IGlzIHRoZSB0ZXh0IHNlZ21lbnQgYWRkcmVzcywgcGx1cyB0ZXh0IHNlZ21lbnQgc2l6ZSwgcm91bmRlZAotICAgdXAgdG8gYSBOX1NFR1NJWkUgYm91bmRhcnkgZm9yIHB1cmUgb3IgcGFnZWFibGUgZmlsZXMuICovCi0jaWZuZGVmIE5fREFUQUREUgotI2RlZmluZSBOX0RBVEFERFIoeCkgXAotICAgIChOX01BR0lDKHgpPT1PTUFHSUM/IChOX1RYVEFERFIoeCkrTl9UWFRTSVpFKHgpKSBcCi0gICAgIDogIChOX1NFR1NJWkUoeCkgKyAoKE5fVFhUQUREUih4KStOX1RYVFNJWkUoeCktMSkgJiB+KE5fU0VHU0laRSh4KS0xKSkpKQotI2VuZGlmCi0vKiBUaGUgYWRkcmVzcyBvZiB0aGUgQlNTIHNlZ21lbnQgLS0gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGRhdGEgc2VnbWVudC4gICovCi0KLSNkZWZpbmUgTl9CU1NBRERSKHgpCShOX0RBVEFERFIoeCkgKyAoeCkuYV9kYXRhKQotCi0vKiBPZmZzZXRzIG9mIHRoZSB2YXJpb3VzIHBvcnRpb25zIG9mIHRoZSBmaWxlIGFmdGVyIHRoZSB0ZXh0IHNlZ21lbnQuICAqLwotCi0vKiBGb3Ige1EsWn1NQUdJQywgdGhlcmUgaXMgcGFkZGluZyB0byBtYWtlIHRoZSBkYXRhIHNlZ21lbnQgc3RhcnQgb24KLSAgIGEgcGFnZSBib3VuZGFyeS4gIE1vc3Qgb2YgdGhlIHRpbWUgdGhlIGFfdGV4dCBmaWVsZCAoYW5kIHRodXMKLSAgIE5fVFhUU0laRSkgYWxyZWFkeSBjb250YWlucyB0aGlzIHBhZGRpbmcuICBJdCBpcyBwb3NzaWJsZSB0aGF0IGZvcgotICAgQlNESSBhbmQvb3IgMzg2QlNEIGl0IHNvbWV0aW1lcyBkb2Vzbid0IGNvbnRhaW4gdGhlIHBhZGRpbmcsIGFuZAotICAgcGVyaGFwcyB3ZSBzaG91bGQgYmUgYWRkaW5nIGl0IGhlcmUuICBCdXQgdGhpcyBzZWVtcyBraW5kIG9mCi0gICBxdWVzdGlvbmFibGUgYW5kIHByb2JhYmx5IHNob3VsZCBiZSBCU0RJLzM4NkJTRC1zcGVjaWZpYyBpZiB3ZSBkbwotICAgZG8gaXQuCi0KLSAgIEZvciBOTUFHSUMgKGF0IGxlYXN0IGZvciBocDMwMCBCU0QsIHByb2JhYmx5IG90aGVycyksIHRoZXJlIGlzCi0gICBwYWRkaW5nIGluIG1lbW9yeSBvbmx5LCBub3Qgb24gZGlzaywgc28gd2UgbXVzdCAqbm90KiBldmVyIHBhZCBoZXJlCi0gICBmb3IgTk1BR0lDLiAgKi8KLQotI2lmbmRlZiBOX0RBVE9GRgotI2RlZmluZSBOX0RBVE9GRih4KSBcCi0gKE5fVFhUT0ZGKHgpICsgTl9UWFRTSVpFKHgpKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9UUkVMT0ZGCi0jZGVmaW5lIE5fVFJFTE9GRih4KQkoIE5fREFUT0ZGKHgpICsgKHgpLmFfZGF0YSApCi0jZW5kaWYKLSNpZm5kZWYgTl9EUkVMT0ZGCi0jZGVmaW5lIE5fRFJFTE9GRih4KQkoIE5fVFJFTE9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZW5kaWYKLSNpZm5kZWYgTl9TWU1PRkYKLSNkZWZpbmUgTl9TWU1PRkYoeCkJKCBOX0RSRUxPRkYoeCkgKyAoeCkuYV9kcnNpemUgKQotI2VuZGlmCi0jaWZuZGVmIE5fU1RST0ZGCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKLSNlbmRpZgotDAotLyogU3ltYm9scyAqLwotI2lmbmRlZiBleHRlcm5hbF9ubGlzdAotc3RydWN0IGV4dGVybmFsX25saXN0IHsKLSAgYmZkX2J5dGUgZV9zdHJ4W0JZVEVTX0lOX1dPUkRdOwkvKiBpbmRleCBpbnRvIHN0cmluZyB0YWJsZSBvZiBuYW1lICovCi0gIGJmZF9ieXRlIGVfdHlwZVsxXTsJCQkvKiB0eXBlIG9mIHN5bWJvbCAqLwotICBiZmRfYnl0ZSBlX290aGVyWzFdOwkJCS8qIG1pc2MgaW5mbyAodXN1YWxseSBlbXB0eSkgKi8KLSAgYmZkX2J5dGUgZV9kZXNjWzJdOwkJCS8qIGRlc2NyaXB0aW9uIGZpZWxkICovCi0gIGJmZF9ieXRlIGVfdmFsdWVbQllURVNfSU5fV09SRF07CS8qIHZhbHVlIG9mIHN5bWJvbCAqLwotfTsKLSNkZWZpbmUgRVhURVJOQUxfTkxJU1RfU0laRSAoQllURVNfSU5fV09SRCs0K0JZVEVTX0lOX1dPUkQpCi0jZW5kaWYKLQotc3RydWN0IGludGVybmFsX25saXN0IHsKLSAgdW5zaWduZWQgbG9uZyBuX3N0cng7CQkJLyogaW5kZXggaW50byBzdHJpbmcgdGFibGUgb2YgbmFtZSAqLwotICB1bnNpZ25lZCBjaGFyIG5fdHlwZTsJCQkvKiB0eXBlIG9mIHN5bWJvbCAqLwotICB1bnNpZ25lZCBjaGFyIG5fb3RoZXI7CQkvKiBtaXNjIGluZm8gKHVzdWFsbHkgZW1wdHkpICovCi0gIHVuc2lnbmVkIHNob3J0IG5fZGVzYzsJCS8qIGRlc2NyaXB0aW9uIGZpZWxkICovCi0gIGJmZF92bWEgbl92YWx1ZTsJCQkvKiB2YWx1ZSBvZiBzeW1ib2wgKi8KLX07Ci0KLS8qIFRoZSBuX3R5cGUgZmllbGQgaXMgdGhlIHN5bWJvbCB0eXBlLCBjb250YWluaW5nOiAgKi8KLQotI2RlZmluZSBOX1VOREYJMAkvKiBVbmRlZmluZWQgc3ltYm9sICovCi0jZGVmaW5lIE5fQUJTIAkyCS8qIEFic29sdXRlIHN5bWJvbCAtLSBkZWZpbmVkIGF0IHBhcnRpY3VsYXIgYWRkciAqLwotI2RlZmluZSBOX1RFWFQgCTQJLyogVGV4dCBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gdGV4dCBzZWcgKi8KLSNkZWZpbmUgTl9EQVRBIAk2CS8qIERhdGEgc3ltIC0tIGRlZmluZWQgYXQgb2Zmc2V0IGluIGRhdGEgc2VnICovCi0jZGVmaW5lIE5fQlNTIAk4CS8qIEJTUyAgc3ltIC0tIGRlZmluZWQgYXQgb2Zmc2V0IGluIHplcm8nZCBzZWcgKi8KLSNkZWZpbmUJTl9DT01NCTB4MTIJLyogQ29tbW9uIHN5bWJvbCAodmlzaWJsZSBhZnRlciBzaGFyZWQgbGliIGR5bmxpbmspICovCi0jZGVmaW5lIE5fRk4JMHgxZgkvKiBGaWxlIG5hbWUgb2YgLm8gZmlsZSAqLwotI2RlZmluZQlOX0ZOX1NFUSAweDBDCS8qIE5fRk4gZnJvbSBTZXF1ZW50IGNvbXBpbGVycyAoc2lnaCkgKi8KLS8qIE5vdGU6IE5fRVhUIGNhbiBvbmx5IGJlIHVzZWZ1bGx5IE9SLWVkIHdpdGggTl9VTkRGLCBOX0FCUywgTl9URVhULAotICAgTl9EQVRBLCBvciBOX0JTUy4gIFdoZW4gdGhlIGxvdy1vcmRlciBiaXQgb2Ygb3RoZXIgdHlwZXMgaXMgc2V0LAotICAgKGUuZy4gTl9XQVJOSU5HIHZlcnN1cyBOX0ZOKSwgdGhleSBhcmUgdHdvIGRpZmZlcmVudCB0eXBlcy4gICovCi0jZGVmaW5lIE5fRVhUIAkxCS8qIEV4dGVybmFsIHN5bWJvbCAoYXMgb3Bwb3NlZCB0byBsb2NhbC10by10aGlzLWZpbGUpICovCi0jZGVmaW5lIE5fVFlQRSAgMHgxZQotI2RlZmluZSBOX1NUQUIgCTB4ZTAJLyogSWYgYW55IG9mIHRoZXNlIGJpdHMgYXJlIG9uLCBpdCdzIGEgZGVidWcgc3ltYm9sICovCi0KLSNkZWZpbmUgTl9JTkRSIDB4MGEKLQotLyogVGhlIGZvbGxvd2luZyBzeW1ib2xzIHJlZmVyIHRvIHNldCBlbGVtZW50cy4KLSAgIEFsbCB0aGUgTl9TRVRbQVREQl0gc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUgZm9ybSBvbmUgc2V0LgotICAgU3BhY2UgaXMgYWxsb2NhdGVkIGZvciB0aGUgc2V0IGluIHRoZSB0ZXh0IHNlY3Rpb24sIGFuZCBlYWNoIHNldAotICAgZWxlbWVudHMgdmFsdWUgaXMgc3RvcmVkIGludG8gb25lIHdvcmQgb2YgdGhlIHNwYWNlLgotICAgVGhlIGZpcnN0IHdvcmQgb2YgdGhlIHNwYWNlIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNldCAobnVtYmVyIG9mIGVsZW1lbnRzKS4KLQotICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHNldCBpcyBtYWRlIGludG8gYW4gTl9TRVRWIHN5bWJvbAotICAgd2hvc2UgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUgc2V0LgotICAgVGhpcyBzeW1ib2wgYWN0cyBsaWtlIGEgTl9EQVRBIGdsb2JhbCBzeW1ib2wKLSAgIGluIHRoYXQgaXQgY2FuIHNhdGlzZnkgdW5kZWZpbmVkIGV4dGVybmFsIHJlZmVyZW5jZXMuICAqLwotCi0vKiBUaGVzZSBhcHBlYXIgYXMgaW5wdXQgdG8gTEQsIGluIGEgLm8gZmlsZS4gICovCi0jZGVmaW5lCU5fU0VUQQkweDE0CQkvKiBBYnNvbHV0ZSBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRUCTB4MTYJCS8qIFRleHQgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VURAkweDE4CQkvKiBEYXRhIHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVEIJMHgxQQkJLyogQnNzIHNldCBlbGVtZW50IHN5bWJvbCAqLwotCi0vKiBUaGlzIGlzIG91dHB1dCBmcm9tIExELiAgKi8KLSNkZWZpbmUgTl9TRVRWCTB4MUMJCS8qIFBvaW50ZXIgdG8gc2V0IHZlY3RvciBpbiBkYXRhIGFyZWEuICAqLwotCi0vKiBXYXJuaW5nIHN5bWJvbC4gVGhlIHRleHQgZ2l2ZXMgYSB3YXJuaW5nIG1lc3NhZ2UsIHRoZSBuZXh0IHN5bWJvbAotICAgaW4gdGhlIHRhYmxlIHdpbGwgYmUgdW5kZWZpbmVkLiBXaGVuIHRoZSBzeW1ib2wgaXMgcmVmZXJlbmNlZCwgdGhlCi0gICBtZXNzYWdlIGlzIHByaW50ZWQuICAqLwotCi0jZGVmaW5lCU5fV0FSTklORyAweDFlCi0KLS8qIFdlYWsgc3ltYm9scy4gIFRoZXNlIGFyZSBhIEdOVSBleHRlbnNpb24gdG8gdGhlIGEub3V0IGZvcm1hdC4gIFRoZQotICAgc2VtYW50aWNzIGFyZSB0aG9zZSBvZiBFTEYgd2VhayBzeW1ib2xzLiAgV2VhayBzeW1ib2xzIGFyZSBhbHdheXMKLSAgIGV4dGVybmFsbHkgdmlzaWJsZS4gIFRoZSBOX1dFQUs/IHZhbHVlcyBhcmUgc3F1ZWV6ZWQgaW50byB0aGUKLSAgIGF2YWlsYWJsZSBzbG90cy4gIFRoZSB2YWx1ZSBvZiBhIE5fV0VBS1Ugc3ltYm9sIGlzIDAuICBUaGUgdmFsdWVzCi0gICBvZiB0aGUgb3RoZXIgdHlwZXMgYXJlIHRoZSBkZWZpbml0aW9ucy4gICovCi0jZGVmaW5lIE5fV0VBS1UJMHgwZAkJLyogV2VhayB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTl9XRUFLQSAweDBlCQkvKiBXZWFrIGFic29sdXRlIHN5bWJvbC4gICovCi0jZGVmaW5lIE5fV0VBS1QgMHgwZgkJLyogV2VhayB0ZXh0IHN5bWJvbC4gICovCi0jZGVmaW5lIE5fV0VBS0QgMHgxMAkJLyogV2VhayBkYXRhIHN5bWJvbC4gICovCi0jZGVmaW5lIE5fV0VBS0IgMHgxMQkJLyogV2VhayBic3Mgc3ltYm9sLiAgKi8KLQotLyogUmVsb2NhdGlvbnMgCi0KLSAgVGhlcmUJYXJlIHR3byB0eXBlcyBvZiByZWxvY2F0aW9uIGZsYXZvdXJzIGZvciBhLm91dCBzeXN0ZW1zLAotICBzdGFuZGFyZCBhbmQgZXh0ZW5kZWQuIFRoZSBzdGFuZGFyZCBmb3JtIGlzIHVzZWQgb24gc3lzdGVtcyB3aGVyZSB0aGUKLSAgaW5zdHJ1Y3Rpb24gaGFzIHJvb20gZm9yIGFsbCB0aGUgYml0cyBvZiBhbiBvZmZzZXQgdG8gdGhlIG9wZXJhbmQsIHdoaWxzdAotICB0aGUgZXh0ZW5kZWQgZm9ybSBpcyB1c2VkIHdoZW4gYW4gYWRkcmVzcyBvcGVyYW5kIGhhcyB0byBiZSBzcGxpdCBvdmVyIG4KLSAgaW5zdHJ1Y3Rpb25zLiBFZywgb24gdGhlIDY4aywgZWFjaCBtb3ZlIGluc3RydWN0aW9uIGNhbiByZWZlcmVuY2UKLSAgdGhlIHRhcmdldCB3aXRoIGEgZGlzcGxhY2VtZW50IG9mIDE2IG9yIDMyIGJpdHMuIE9uIHRoZSBzcGFyYywgbW92ZQotICBpbnN0cnVjdGlvbnMgdXNlIGFuIG9mZnNldCBvZiAxNCBiaXRzLCBzbyB0aGUgb2Zmc2V0IGlzIHN0b3JlZCBpbgotICB0aGUgcmVsb2MgZmllbGQsIGFuZCB0aGUgZGF0YSBpbiB0aGUgc2VjdGlvbiBpcyBpZ25vcmVkLgotKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgc2luZ2xlIHJlbG9jYXRpb24gdG8gYmUgcGVyZm9ybWVkLgotICAgVGhlIHRleHQtcmVsb2NhdGlvbiBzZWN0aW9uIG9mIHRoZSBmaWxlIGlzIGEgdmVjdG9yIG9mIHRoZXNlIHN0cnVjdHVyZXMsCi0gICBhbGwgb2Ygd2hpY2ggYXBwbHkgdG8gdGhlIHRleHQgc2VjdGlvbi4KLSAgIExpa2V3aXNlLCB0aGUgZGF0YS1yZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLQotc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCB7Ci0gIGJmZF9ieXRlCXJfYWRkcmVzc1tCWVRFU19JTl9XT1JEXTsJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgCSovCi0gIGJmZF9ieXRlIHJfaW5kZXhbM107CS8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgCSovCi0gIGJmZF9ieXRlIHJfdHlwZVsxXTsJLyogcmVsb2NhdGlvbiB0eXBlCQkJKi8KLX07Ci0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUENSRUxfQklHCSgodW5zaWduZWQgaW50KSAweDgwKQotI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDEpCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRwkoKHVuc2lnbmVkIGludCkgMHg2MCkKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRwk1Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDYpCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUJMQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcJKCh1bnNpZ25lZCBpbnQpIDB4MTApCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDgpCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcJKCh1bnNpZ25lZCBpbnQpIDB4MDgpCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFCSgodW5zaWduZWQgaW50KSAweDEwKQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRwkoKHVuc2lnbmVkIGludCkgMHgwNCkKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFCSgodW5zaWduZWQgaW50KSAweDIwKQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRwkoKHVuc2lnbmVkIGludCkgMHgwMikKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFCSgodW5zaWduZWQgaW50KSAweDQwKQotCi0jZGVmaW5lCVJFTE9DX1NURF9TSVpFCShCWVRFU19JTl9XT1JEICsgMyArIDEpCQkvKiBCeXRlcyBwZXIgcmVsb2NhdGlvbiBlbnRyeSAqLwotCi1zdHJ1Y3QgcmVsb2Nfc3RkX2ludGVybmFsCi17Ci0gIGJmZF92bWEgcl9hZGRyZXNzOwkJLyogQWRkcmVzcyAod2l0aGluIHNlZ21lbnQpIHRvIGJlIHJlbG9jYXRlZC4gICovCi0gIC8qIFRoZSBtZWFuaW5nIG9mIHJfc3ltYm9sbnVtIGRlcGVuZHMgb24gcl9leHRlcm4uICAqLwotICB1bnNpZ25lZCBpbnQgcl9zeW1ib2xudW06MjQ7Ci0gIC8qIE5vbnplcm8gbWVhbnMgdmFsdWUgaXMgYSBwYy1yZWxhdGl2ZSBvZmZzZXQKLSAgICAgYW5kIGl0IHNob3VsZCBiZSByZWxvY2F0ZWQgZm9yIGNoYW5nZXMgaW4gaXRzIG93biBhZGRyZXNzCi0gICAgIGFzIHdlbGwgYXMgZm9yIGNoYW5nZXMgaW4gdGhlIHN5bWJvbCBvciBzZWN0aW9uIHNwZWNpZmllZC4gICovCi0gIHVuc2lnbmVkIGludCByX3BjcmVsOjE7Ci0gIC8qIExlbmd0aCAoYXMgZXhwb25lbnQgb2YgMikgb2YgdGhlIGZpZWxkIHRvIGJlIHJlbG9jYXRlZC4KLSAgICAgVGh1cywgYSB2YWx1ZSBvZiAyIGluZGljYXRlcyAxPDwyIGJ5dGVzLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOjI7Ci0gIC8qIDEgPT4gcmVsb2NhdGUgd2l0aCB2YWx1ZSBvZiBzeW1ib2wuCi0gICAgIHJfc3ltYm9sbnVtIGlzIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sCi0gICAgIGluIGZpbGVzIHRoZSBzeW1ib2wgdGFibGUuCi0gICAgIDAgPT4gcmVsb2NhdGUgd2l0aCB0aGUgYWRkcmVzcyBvZiBhIHNlZ21lbnQuCi0gICAgIHJfc3ltYm9sbnVtIGlzIE5fVEVYVCwgTl9EQVRBLCBOX0JTUyBvciBOX0FCUwotICAgICAodGhlIE5fRVhUIGJpdCBtYXkgYmUgc2V0IGFsc28sIGJ1dCBzaWduaWZpZXMgbm90aGluZykuICAqLwotICB1bnNpZ25lZCBpbnQgcl9leHRlcm46MTsKLSAgLyogVGhlIG5leHQgdGhyZWUgYml0cyBhcmUgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBzZWVtIHRvCi0gICAgIGJlIHVuZG9jdW1lbnRlZC4gICovCi0gIHVuc2lnbmVkIGludCByX2Jhc2VyZWw6MTsJLyogTGlua2FnZSB0YWJsZSByZWxhdGl2ZSAqLwotICB1bnNpZ25lZCBpbnQgcl9qbXB0YWJsZToxOwkvKiBwYy1yZWxhdGl2ZSB0byBqdW1wIHRhYmxlICovCi0gIHVuc2lnbmVkIGludCByX3JlbGF0aXZlOjE7CS8qICJyZWxhdGl2ZSByZWxvY2F0aW9uIiAqLwotICAvKiB1bnVzZWQgKi8KLSAgdW5zaWduZWQgaW50IHJfcGFkOjE7CQkvKiBQYWRkaW5nIC0tIHNldCB0byB6ZXJvICovCi19OwotCi0KLS8qIEVYVEVOREVEIFJFTE9DUyAgKi8KLQotc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCB7Ci0gIGJmZF9ieXRlIHJfYWRkcmVzc1tCWVRFU19JTl9XT1JEXTsJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgCSovCi0gIGJmZF9ieXRlIHJfaW5kZXhbM107CS8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgCSovCi0gIGJmZF9ieXRlIHJfdHlwZVsxXTsJLyogcmVsb2NhdGlvbiB0eXBlCQkJKi8KLSAgYmZkX2J5dGUgcl9hZGRlbmRbQllURVNfSU5fV09SRF07CS8qIGRhdHVtIGFkZGVuZAkJCQkqLwotfTsKLQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHCSgodW5zaWduZWQgaW50KSAweDgwKQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFCSgodW5zaWduZWQgaW50KSAweDAxKQotCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfQklHCQkoKHVuc2lnbmVkIGludCkgMHgxRikKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcJMAotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHhGOCkKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUJMwotCi0vKiBCeXRlcyBwZXIgcmVsb2NhdGlvbiBlbnRyeSAqLwotI2RlZmluZQlSRUxPQ19FWFRfU0laRQkoQllURVNfSU5fV09SRCArIDMgKyAxICsgQllURVNfSU5fV09SRCkKLQotZW51bSByZWxvY190eXBlCi17Ci0gIC8qIHNpbXBsZSByZWxvY2F0aW9ucyAqLwotICBSRUxPQ184LAkJCS8qIGRhdGFbMDo3XSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgUkVMT0NfMTYsCQkJLyogZGF0YVswOjE1XSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgUkVMT0NfMzIsCQkJLyogZGF0YVswOjMxXSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgLyogcGMtcmVsIGRpc3BsYWNlbWVudCAqLwotICBSRUxPQ19ESVNQOCwJCQkvKiBkYXRhWzA6N10gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICBSRUxPQ19ESVNQMTYsCQkJLyogZGF0YVswOjE1XSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIFJFTE9DX0RJU1AzMiwJCQkvKiBkYXRhWzA6MzFdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgLyogU3BlY2lhbCAqLwotICBSRUxPQ19XRElTUDMwLAkJLyogZGF0YVswOjI5XSA9IChhZGRlbmQgKyBzdiAtIHBjKT4+MiAJKi8KLSAgUkVMT0NfV0RJU1AyMiwJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YgLSBwYyk+PjIgCSovCi0gIFJFTE9DX0hJMjIsCQkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdik+PjEwIAkqLwotICBSRUxPQ18yMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KSAJCSovCi0gIFJFTE9DXzEzLAkJCS8qIGRhdGFbMDoxMl0gPSAoYWRkZW5kICsgc3YpCQkqLwotICBSRUxPQ19MTzEwLAkJCS8qIGRhdGFbMDo5XSA9IChhZGRlbmQgKyBzdikJCSovCi0gIFJFTE9DX1NGQV9CQVNFLAkJCi0gIFJFTE9DX1NGQV9PRkYxMywKLSAgLyogUC5JLkMuIChiYXNlLXJlbGF0aXZlKSAqLwotICBSRUxPQ19CQVNFMTAsICAJCS8qIE5vdCBzdXJlIC0gbWF5YmUgd2UgY2FuIGRvIHRoaXMgdGhlICovCi0gIFJFTE9DX0JBU0UxMywJCQkvKiByaWdodCB3YXkgbm93ICovCi0gIFJFTE9DX0JBU0UyMiwKLSAgLyogZm9yIHNvbWUgc29ydCBvZiBwYy1yZWwgUC5JLkMuICg/KSAqLwotICBSRUxPQ19QQzEwLAotICBSRUxPQ19QQzIyLAotICAvKiBQLkkuQy4ganVtcCB0YWJsZSAqLwotICBSRUxPQ19KTVBfVEJMLAotICAvKiByZXB1dGVkbHkgZm9yIHNoYXJlZCBsaWJyYXJpZXMgc29tZWhvdyAqLwotICBSRUxPQ19TRUdPRkYxNiwKLSAgUkVMT0NfR0xPQl9EQVQsCi0gIFJFTE9DX0pNUF9TTE9ULAotICBSRUxPQ19SRUxBVElWRSwKLQotICBSRUxPQ18xMSwJCi0gIFJFTE9DX1dESVNQMl8xNCwKLSAgUkVMT0NfV0RJU1AxOSwKLSAgUkVMT0NfSEhJMjIsCQkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdikgPj4gNDIgICAgICovCi0gIFJFTE9DX0hMTzEwLAkJCS8qIGRhdGFbMDo5XSA9IChhZGRlbmQgKyBzdikgPj4gMzIgICAgICAqLwotICAKLSAgLyogMjlLIHJlbG9jYXRpb24gdHlwZXMgKi8KLSAgUkVMT0NfSlVNUFRBUkcsCi0gIFJFTE9DX0NPTlNULAotICBSRUxPQ19DT05TVEgsCi0gIAotICAvKiBBbGwgdGhlIG5ldyBvbmVzIEkgY2FuIHRoaW5rIG9mLCBmb3Igc3BhcmMgdjkgKi8KLQotICBSRUxPQ182NCwJCQkvKiBkYXRhWzA6NjNdID0gYWRkZW5kICsgc3YgCQkqLwotICBSRUxPQ19ESVNQNjQsCQkJLyogZGF0YVswOjYzXSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIFJFTE9DX1dESVNQMjEsCQkvKiBkYXRhWzA6MjBdID0gKGFkZGVuZCArIHN2IC0gcGMpPj4yIAkqLwotICBSRUxPQ19ESVNQMjEsCQkJLyogZGF0YVswOjIwXSA9IGFkZGVuZCAtIHBjICsgc3YgICAgICAgICovCi0gIFJFTE9DX0RJU1AxNCwJCQkvKiBkYXRhWzA6MTNdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgLyogUSAuCi0gICAgIFdoYXQgYXJlIHRoZSBvdGhlciBvbmVzLAotICAgICBTaW5jZSB0aGlzIGlzIGEgY2xlYW4gc2xhdGUsIGNhbiB3ZSB0aHJvdyBhd2F5IHRoZSBvbmVzIHdlIGRvbnQKLSAgICAgdW5kZXJzdGFuZCA/IFNob3VsZCB3ZSBzb3J0IHRoZSB2YWx1ZXMgPyBXaGF0IGFib3V0IHVzaW5nIGEKLSAgICAgbWljcm9jb2RlIGZvcm1hdCBsaWtlIHRoZSA2OGsgPwotICAgICAqLwotICBOT19SRUxPQwotICB9OwotCi0KLXN0cnVjdCByZWxvY19pbnRlcm5hbCB7Ci0gIGJmZF92bWEgcl9hZGRyZXNzOwkJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgCSovCi0gIGxvbmcJcl9pbmRleDsJCS8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgCSovCi0gIGVudW0gcmVsb2NfdHlwZSByX3R5cGU7CS8qIHJlbG9jYXRpb24gdHlwZQkJCSovCi0gIGJmZF92bWEgcl9hZGRlbmQ7CQkvKiBkYXR1bSBhZGRlbmQJCQkJKi8KLX07Ci0KLS8qIFEuCi0gICBTaG91bGQgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRhYmxlIGJlIDQgYnl0ZXMgb3IgOCBieXRlcyA/Ci0KLSAgIFEuCi0gICBXaGF0IGFib3V0IGFyY2hpdmUgaW5kZXhlcyA/Ci0KLSAqLwotCi0jZW5kaWYJCQkJLyogX19BX09VVF82NF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9hci5oIGIvaW5jbHVkZS9hb3V0L2FyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNWRjZGEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2FyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKiBhcmNoaXZlIGZpbGUgZGVmaW5pdGlvbiBmb3IgR05VIHNvZnR3YXJlICovCi0KLS8qIFNvIGZhciB0aGlzIGlzIGNvcnJlY3QgZm9yIEJTRGlzaCBhcmNoaXZlcy4gIERvbid0IGZvcmdldCB0aGF0Ci0gICBmaWxlcyBtdXN0IGJlZ2luIG9uIGFuIGV2ZW4gYnl0ZSBib3VuZGFyeS4gKi8KLQotI2lmbmRlZiBfX0dOVV9BUl9IX18KLSNkZWZpbmUgX19HTlVfQVJfSF9fCi0KLS8qIE5vdGUgdGhhdCB0aGUgdXN1YWwgJ1xuJyBpbiBtYWdpYyBzdHJpbmdzIG1heSB0cmFuc2xhdGUgdG8gZGlmZmVyZW50Ci0gICBjaGFyYWN0ZXJzLCBhcyBhbGxvd2VkIGJ5IEFOU0kuICAnXDAxMicgaGFzIGEgZml4ZWQgdmFsdWUsIGFuZCByZW1haW5zCi0gICBjb21wYXRpYmxlIHdpdGggZXhpc3RpbmcgQlNEaXNoIGFyY2hpdmVzLiAqLwotCi0jZGVmaW5lIEFSTUFHICAiITxhcmNoPlwwMTIiCS8qIEZvciBDT0ZGIGFuZCBhLm91dCBhcmNoaXZlcyAqLwotI2RlZmluZSBBUk1BR0IgIiE8Ym91dD5cMDEyIgkvKiBGb3IgYi5vdXQgYXJjaGl2ZXMgKi8KLSNkZWZpbmUgU0FSTUFHIDgKLSNkZWZpbmUgQVJGTUFHICJgXDAxMiIKLQotLyogVGhlIGFyX2RhdGUgZmllbGQgb2YgdGhlIGFybWFwIChfXy5TWU1ERUYpIG1lbWJlciBvZiBhbiBhcmNoaXZlCi0gICBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbW9kaWZpZWQgZGF0ZSBvZiB0aGUgZW50aXJlIGZpbGUsIG9yIAotICAgQlNELWRlcml2ZWQgbGlua2VycyBjb21wbGFpbi4gIFdlIG9yaWdpbmFsbHkgd3JpdGUgdGhlIGFyX2RhdGUgd2l0aAotICAgdGhpcyBvZmZzZXQgZnJvbSB0aGUgcmVhbCBmaWxlJ3MgbW9kLXRpbWUuICBBZnRlciBmaW5pc2hpbmcgdGhlCi0gICBmaWxlLCB3ZSByZXdyaXRlIGFyX2RhdGUgaWYgaXQncyBub3Qgc3RpbGwgZ3JlYXRlciB0aGFuIHRoZSBtb2QgZGF0ZS4gICovCi0KLSNkZWZpbmUgQVJNQVBfVElNRV9PRkZTRVQgICAgICAgNjAKLQotc3RydWN0IGFyX2hkciB7Ci0gIGNoYXIgYXJfbmFtZVsxNl07CQkvKiBuYW1lIG9mIHRoaXMgbWVtYmVyICovCi0gIGNoYXIgYXJfZGF0ZVsxMl07CQkvKiBmaWxlIG10aW1lICovCi0gIGNoYXIgYXJfdWlkWzZdOwkJLyogb3duZXIgdWlkOyBwcmludGVkIGFzIGRlY2ltYWwgKi8KLSAgY2hhciBhcl9naWRbNl07CQkvKiBvd25lciBnaWQ7IHByaW50ZWQgYXMgZGVjaW1hbCAqLwotICBjaGFyIGFyX21vZGVbOF07CQkvKiBmaWxlIG1vZGUsIHByaW50ZWQgYXMgb2N0YWwgICAqLwotICBjaGFyIGFyX3NpemVbMTBdOwkJLyogZmlsZSBzaXplLCBwcmludGVkIGFzIGRlY2ltYWwgKi8KLSAgY2hhciBhcl9mbWFnWzJdOwkJLyogc2hvdWxkIGNvbnRhaW4gQVJGTUFHICovCi19OwotCi0jZW5kaWYgLyogX19HTlVfQVJfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvZHluaXgzLmggYi9pbmNsdWRlL2FvdXQvZHluaXgzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZWVlYmYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2R5bml4My5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIGEub3V0IHNwZWNpZmljcyBmb3IgU2VxdWVudCBTeW1tZXRyeSBydW5uaW5nIER5bml4IDMueAotICovCi0jaWZuZGVmIEFfT1VUX0RZTklYM19ICi0jZGVmaW5lIEFfT1VUX0RZTklYM19ICi0KLSNkZWZpbmUgZXh0ZXJuYWxfZXhlYyBkeW5peF9leHRlcm5hbF9leGVjCi0KLS8qIHN0cnVjdCBleGVjIGZvciBEeW5peCAzCi0gKgotICogYV9nZHRibCBhbmQgYV9ib290c3RyYXAgYXJlIG9ubHkgZm9yIHN0YW5kYWxvbmUgYmluYXJpZXMuCi0gKiBTaGFyZWQgZGF0YSBmaWVsZHMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbCBhcyBvZiBEeW5peCAzLjEsCi0gKiBidXQgYXJlIHN1cHBvcnRlZCBieSBEeW5peCBjb21waWxlciBwcm9ncmFtcy4KLSAqLwotc3RydWN0IGR5bml4X2V4dGVybmFsX2V4ZWMgewotCXVuc2lnbmVkIGNoYXIgZV9pbmZvWzRdOwotCXVuc2lnbmVkIGNoYXIgZV90ZXh0WzRdOwotCXVuc2lnbmVkIGNoYXIgZV9kYXRhWzRdOwotCXVuc2lnbmVkIGNoYXIgZV9ic3NbNF07Ci0JdW5zaWduZWQgY2hhciBlX3N5bXNbNF07Ci0JdW5zaWduZWQgY2hhciBlX2VudHJ5WzRdOwotCXVuc2lnbmVkIGNoYXIgZV90cnNpemVbNF07Ci0JdW5zaWduZWQgY2hhciBlX2Ryc2l6ZVs0XTsKLQl1bnNpZ25lZCBjaGFyIGVfZ19jb2RlWzhdLCBlX2dfZGF0YVs4XSwgZV9nX2Rlc2NbOF07Ci0JdW5zaWduZWQgY2hhciBlX3NoZGF0YVs0XTsKLQl1bnNpZ25lZCBjaGFyIGVfc2hic3NbNF07Ci0JdW5zaWduZWQgY2hhciBlX3NoZHJzaXplWzRdOwotCXVuc2lnbmVkIGNoYXIgZV9ib290c3RyYXBbNDRdOwotCXVuc2lnbmVkIGNoYXIgZV9yZXNlcnZlZFsxMl07Ci0JdW5zaWduZWQgY2hhciBlX3ZlcnNpb25bNF07Ci19OwotCi0jZGVmaW5lCUVYRUNfQllURVNfU0laRQkoMTI4KQotCi0vKgotICogQWxsIGV4ZWN1dGFibGVzIHVuZGVyIER5bml4IGFyZSBkZW1hbmQgcGFnZWQgd2l0aCByZWFkLW9ubHkgdGV4dCwKLSAqIFRodXMgbm8gTk1BR0lDLgotICoKLSAqIFpNQUdJQyBoYXMgYSBwYWdlIG9mIDBzIGF0IHZpcnR1YWwgMCwKLSAqIFhNQUdJQyBoYXMgYW4gaW52YWxpZCBwYWdlIGF0IHZpcnR1YWwgMAotICovCi0jZGVmaW5lIE9NQUdJQwkweDEyZWIJCS8qIC5vICovCi0jZGVmaW5lIFpNQUdJQwkweDIyZWIJCS8qIHplcm8gQCAwLCBkZW1hbmQgbG9hZCAqLwotI2RlZmluZSBYTUFHSUMJMHgzMmViCQkvKiBpbnZhbGlkIEAgMCwgZGVtYW5kIGxvYWQgKi8KLSNkZWZpbmUgU01BR0lDCTB4NDJlYgkJLyogc3RhbmRhbG9uZSwgbm90IHN1cHBvcnRlZCBoZXJlICovCi0KLSNkZWZpbmUgTl9CQURNQUcoeCkgKChPTUFHSUMgIT0gTl9NQUdJQyh4KSkgJiYgXAotCQkgICAgIChaTUFHSUMgIT0gTl9NQUdJQyh4KSkgJiYgXAotCQkgICAgIChYTUFHSUMgIT0gTl9NQUdJQyh4KSkgJiYgXAotCQkgICAgIChTTUFHSUMgIT0gTl9NQUdJQyh4KSkpCi0KLSNkZWZpbmUgTl9BRERSQURKKHgpICgoWk1BR0lDID09IE5fTUFHSUMoeCkgfHwgWE1BR0lDID09IE5fTUFHSUMoeCkpID8gMHgxMDAwIDogMCkKLQotI2RlZmluZSBOX1RYVE9GRih4KSAoRVhFQ19CWVRFU19TSVpFKQotI2RlZmluZSBOX0RBVE9GRih4KSAoTl9UWFRPRkYoeCkgKyBOX1RYVFNJWkUoeCkpCi0jZGVmaW5lIE5fU0hEQVRPRkYoeCkgKE5fREFUT0ZGKHgpICsgKHgpLmFfZGF0YSkKLSNkZWZpbmUgTl9UUkVMT0ZGKHgpIChOX1NIREFUT0ZGKHgpICsgKHgpLmFfc2hkYXRhKQotI2RlZmluZSBOX0RSRUxPRkYoeCkgKE5fVFJFTE9GRih4KSArICh4KS5hX3Ryc2l6ZSkKLSNkZWZpbmUgTl9TSERSRUxPRkYoeCkgKE5fRFJFTE9GRih4KSArICh4KS5hX2Ryc2l6ZSkKLSNkZWZpbmUgTl9TWU1PRkYoeCkgKE5fU0hEUkVMT0ZGKHgpICsgKHgpLmFfc2hkcnNpemUpCi0jZGVmaW5lIE5fU1RST0ZGKHgpIChOX1NZTU9GRih4KSArICh4KS5hX3N5bXMpCi0KLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLQkoKChPTUFHSUMgPT0gTl9NQUdJQyh4KSkgfHwgKFNNQUdJQyA9PSBOX01BR0lDKHgpKSkgPyAwIFwKLQkgOiBURVhUX1NUQVJUX0FERFIgKyBFWEVDX0JZVEVTX1NJWkUpCi0KLSNkZWZpbmUgTl9UWFRTSVpFKHgpIFwKLQkoKChPTUFHSUMgPT0gTl9NQUdJQyh4KSkgfHwgKFNNQUdJQyA9PSBOX01BR0lDKHgpKSkgPyAoKHgpLmFfdGV4dCkgXAotCSA6ICgoeCkuYV90ZXh0IC0gTl9BRERSQURKKHgpIC0gRVhFQ19CWVRFU19TSVpFKSkKLQotI2VuZGlmIC8qIEFfT1VUX0RZTklYM19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvZW5jYXAuaCBiL2luY2x1ZGUvYW91dC9lbmNhcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjE1ZDQ5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9lbmNhcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qIFlldCBBbm90aGVyIFRyeSBhdCBlbmNhcHN1bGF0aW5nIGJzZCBvYmplY3QgZmlsZXMgaW4gY29mZi4KLSAgIENvcHlyaWdodCAoQykgMTk4OCwgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgUGFjZSBXaWxsaXNzb24gMTIvOS84OAotCi0gICBUaGlzIGZpbGUgaXMgb2Jzb2xldGUuICBJdCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8ganVzdCBkZWZpbmUgYSBidW5jaAotICAgb2Ygc3R1ZmYgdGhhdCBCRkQgY2FuIHVzZSB0byBkbyBjb2ZmLWVuY2Fwc3VsYXRlZCBmaWxlcy4gIC0tZ251QGN5Z251cy5jb20KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIFdlIG9ubHkgdXNlIHRoZSBjb2ZmIGhlYWRlcnMgdG8gdGVsbCB0aGUga2VybmVsCi0gKiBob3cgdG8gZXhlYyB0aGUgZmlsZS4gIFRoZXJlZm9yZSwgdGhlIG9ubHkgZmllbGRzIHRoYXQgbmVlZCB0byAKLSAqIGJlIGZpbGxlZCBpbiBhcmUgdGhlIHNjbnB0ciBhbmQgdmFkZHIgZm9yIHRoZSB0ZXh0IGFuZCBkYXRhCi0gKiBzZWN0aW9ucywgYW5kIHRoZSB2YWRkciBmb3IgdGhlIGJzcy4gIEFzIGZhciBhcyBjb2ZmIGlzIGNvbmNlcm5lZCwKLSAqIHRoZXJlIGlzIG5vIHN5bWJvbCB0YWJsZSwgcmVsb2NhdGlvbiwgb3IgbGluZSBudW1iZXJzLgotICoKLSAqIEEgbm9ybWFsIGJzZCBoZWFkZXIgKHN0cnVjdCBleGVjKSBpcyBwbGFjZWQgYWZ0ZXIgdGhlIGNvZmYgaGVhZGVycywKLSAqIGFuZCBiZWZvcmUgdGhlIHJlYWwgdGV4dC4gIEkgZGVmaW5lZCBhIHRoZSBuZXcgZmllbGRzICdhX21hY2h0eXBlJwotICogYW5kIGFfZmxhZ3MuICBJZiBhX21hY2h0eXBlIGlzIE1fMzg2LCBhbmQgYV9mbGFncyAmIEFfRU5DQVAgaXMKLSAqIHRydWUsIHRoZW4gdGhlIGJzZCBoZWFkZXIgaXMgcHJlY2VlZGVkIGJ5IGEgY29mZiBoZWFkZXIuICBNYWNyb3MKLSAqIGxpa2UgTl9UWFRPRkYgYW5kIE5fVFhUQUREUiB1c2UgdGhpcyBmaWVsZCB0byBmaW5kIHRoZSBic2QgaGVhZGVyLgotICogCi0gKiBUaGUgb25seSBwcm9ibGVtIGlzIHRvIHRyYWNrIGRvd24gdGhlIGJzZCBleGVjIGhlYWRlci4gIFRoZQotICogbWFjcm9zIEhFQURFUl9PRkZTRVQsIGV0YyBkbyB0aGlzLgotICovCi0KLSNkZWZpbmUgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFIDB4MjAgLyogY29mZiBoZWFkZXIgcHJlY2VkZXMgYnNkIGhlYWRlciAqLwotCi0vKiBEZXNjcmliZSB0aGUgQ09GRiBoZWFkZXIgdXNlZCBmb3IgZW5jYXBzdWxhdGlvbi4gICovCi0KLXN0cnVjdCBjb2ZmaGVhZGVyCi17Ci0gIC8qIGZpbGVoZHIgKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9tYWdpYzsKLSAgdW5zaWduZWQgc2hvcnQgZl9uc2NuczsKLSAgbG9uZyBmX3RpbWRhdDsKLSAgbG9uZyBmX3N5bXB0cjsKLSAgbG9uZyBmX25zeW1zOwotICB1bnNpZ25lZCBzaG9ydCBmX29wdGhkcjsKLSAgdW5zaWduZWQgc2hvcnQgZl9mbGFnczsKLSAgLyogYW91dGhkciAqLwotICBzaG9ydCBtYWdpYzsKLSAgc2hvcnQgdnN0YW1wOwotICBsb25nIHRzaXplOwotICBsb25nIGRzaXplOwotICBsb25nIGJzaXplOwotICBsb25nIGVudHJ5OwotICBsb25nIHRleHRfc3RhcnQ7Ci0gIGxvbmcgZGF0YV9zdGFydDsKLSAgc3RydWN0IGNvZmZzY24KLSAgICB7Ci0gICAgICBjaGFyIHNfbmFtZVs4XTsKLSAgICAgIGxvbmcgc19wYWRkcjsKLSAgICAgIGxvbmcgc192YWRkcjsKLSAgICAgIGxvbmcgc19zaXplOwotICAgICAgbG9uZyBzX3NjbnB0cjsKLSAgICAgIGxvbmcgc19yZWxwdHI7Ci0gICAgICBsb25nIHNfbG5ub3B0cjsKLSAgICAgIHVuc2lnbmVkIHNob3J0IHNfbnJlbG9jOwotICAgICAgdW5zaWduZWQgc2hvcnQgc19ubG5ubzsKLSAgICAgIGxvbmcgc19mbGFnczsKLSAgICB9IHNjbnNbM107Ci19OwotDAotLyogRGVzY3JpYmUgc29tZSBvZiB0aGUgcGFyYW1ldGVycyBvZiB0aGUgZW5jYXBzdWxhdGlvbiwKLSAgIGluY2x1ZGluZyBob3cgdG8gZmluZCB0aGUgZW5jYXBzdWxhdGVkIEJTRCBoZWFkZXIuICAqLwotCi0vKiBGSVhNRSwgdGhpcyBpcyBkdW1iLiAgVGhlIHNhbWUgdG9vbHMgY2FuJ3QgaGFuZGxlIGEub3V0cyBmb3IgZGlmZmVyZW50Ci0gICBhcmNoaXRlY3R1cmVzLCBqdXN0IGJlY2F1c2UgQ09GRl9NQUdJQyBpcyBkaWZmZXJlbnQ7IHNvIHlvdSBuZWVkIGEKLSAgIHNlcGFyYXRlIEdOVSBubSBmb3IgZXZlcnkgYXJjaGl0ZWN0dXJlISE/ICBVbmZvcnR1bmF0ZWx5LCBpdCBuZWVkcyB0bwotICAgYmUgdGhpcyB3YXksIHNpbmNlIHRoZSBDT0ZGX01BR0lDIHZhbHVlIGlzIGRldGVybWluZWQgYnkgdGhlIGtlcm5lbAotICAgd2UncmUgdHJ5aW5nIHRvIGZvb2wgaGVyZS4gICovCi0gICAKLSNkZWZpbmUgQ09GRl9NQUdJQ19JMzg2IDA1MTQgLyogSTM4Nk1BR0lDICovCi0jZGVmaW5lIENPRkZfTUFHSUNfTTY4SyAwNTIwIC8qIE1DNjhNQUdJQyAqLwotI2RlZmluZQlDT0ZGX01BR0lDX0EyOUsgMHgxN0EJLyogVXNlZCBieSBhc20yOWsgY3Jvc3MtdG9vbHMgKi8KLQotI2lmZGVmIENPRkZfTUFHSUMKLXNob3J0IF9faGVhZGVyX29mZnNldF90ZW1wOwotI2RlZmluZSBIRUFERVJfT0ZGU0VUKGYpIFwKLQkoX19oZWFkZXJfb2Zmc2V0X3RlbXAgPSAwLCBcCi0JIGZyZWFkICgoY2hhciAqKSZfX2hlYWRlcl9vZmZzZXRfdGVtcCwgc2l6ZW9mIChzaG9ydCksIDEsIChmKSksIFwKLQkgZnNlZWsgKChmKSwgLXNpemVvZiAoc2hvcnQpLCAxKSwgXAotCSBfX2hlYWRlcl9vZmZzZXRfdGVtcD09Q09GRl9NQUdJQyA/IHNpemVvZihzdHJ1Y3QgY29mZmhlYWRlcikgOiAwKQotI2Vsc2UKLSNkZWZpbmUgSEVBREVSX09GRlNFVChmKSAwCi0jZW5kaWYKLQotI2RlZmluZSBIRUFERVJfU0VFSyhmKSAoZnNlZWsgKChmKSwgSEVBREVSX09GRlNFVCgoZikpLCAxKSkKLQwKLS8qIERlc2NyaWJlIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIEJTRCBoZWFkZXIKLSAgIHRoYXQgYXBwZWFycyBpbnNpZGUgdGhlIGVuY2Fwc3VsYXRpb24uICAqLwotCi0vKiBFbmNhcHN1bGF0ZWQgY29mZiBmaWxlcyB0aGF0IGFyZSBsaW5rZWQgWk1BR0lDIGhhdmUgYSB0ZXh0IHNlZ21lbnQKLSAgIG9mZnNldCBqdXN0IHBhc3QgdGhlIGhlYWRlciAoYW5kIGEgbWF0Y2hpbmcgVFhUQUREUiksIGV4Y2x1ZGluZwotICAgdGhlIGhlYWRlcnMgZnJvbSB0aGUgdGV4dCBzZWdtZW50IHByb3BlciBidXQga2VlcGluZyB0aGUgcGh5c2ljYWwKLSAgIGxheW91dCBhbmQgdGhlIHZpcnR1YWwgbWVtb3J5IGxheW91dCBwYWdlLWFsaWduZWQuCi0KLSAgIE5vbi1lbmNhcHN1bGF0ZWQgYS5vdXQgZmlsZXMgdGhhdCBhcmUgbGlua2VkIFpNQUdJQyBoYXZlIGEgdGV4dAotICAgc2VnbWVudCB0aGF0IHN0YXJ0cyBhdCAwIGFuZCBhbiBOX1RYVEFEUiBzaW1pbGFybHkgb2Zmc2V0IHRvIDAuCi0gICBUaGV5IHRvbyBhcmUgcGFnZS1hbGlnbmVkIHdpdGggZWFjaCBvdGhlciwgYnV0IHRoZXkgaW5jbHVkZSB0aGUKLSAgIGEub3V0IGhlYWRlciBhcyBwYXJ0IG9mIHRoZSB0ZXh0LiAKLQotICAgVGhlIF9OX0hEUk9GRiBnZXRzIHNpemVvZiBzdHJ1Y3QgZXhlYyBhZGRlZCB0byBpdCwgc28gd2UgaGF2ZQotICAgdG8gY29tcGVuc2F0ZSBoZXJlLiAgU2VlIDxhLm91dC5nbnUuaD4uICAqLwotCi0jdW5kZWYgX05fSERST0ZGCi0jdW5kZWYgTl9UWFRBRERSCi0jdW5kZWYgTl9EQVRBRERSCi0KLSNkZWZpbmUgX05fSERST0ZGKHgpICgoTl9GTEFHUyh4KSAmIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURSkgPyBcCi0JCSAgICAgIHNpemVvZiAoc3RydWN0IGNvZmZoZWFkZXIpIDogMCkKLQotLyogQWRkcmVzcyBvZiB0ZXh0IHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4gICovCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0JKChOX0ZMQUdTKHgpICYgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFKSA/IFwKLQkgc2l6ZW9mIChzdHJ1Y3QgY29mZmhlYWRlcikgKyBzaXplb2YgKHN0cnVjdCBleGVjKSA6IDApCi0jZGVmaW5lIFNFR01FTlRfU0laRSAweDQwMDAwMAotCi0jZGVmaW5lIE5fREFUQUREUih4KSBcCi0JKChOX0ZMQUdTKHgpICYgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFKSA/IFwKLQkgKFNFR01FTlRfU0laRSArICgoTl9UWFRBRERSKHgpKyh4KS5hX3RleHQtMSkgJiB+KFNFR01FTlRfU0laRS0xKSkpIDogXAotCSAoTl9UWFRBRERSKHgpKyh4KS5hX3RleHQpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2hvc3QuaCBiL2luY2x1ZGUvYW91dC9ob3N0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMzYyMTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2hvc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qIFBhcmFtZXRlcnMgYWJvdXQgdGhlIGEub3V0IGZvcm1hdCwgYmFzZWQgb24gdGhlIGhvc3Qgc3lzdGVtIG9uIHdoaWNoCi0gICB0aGUgcHJvZ3JhbSBpcyBjb21waWxlZC4gICovCi0KLS8qIEFkZHJlc3Mgb2YgZGF0YSBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuCi0gICBJdCBpcyB1cCB0byB5b3UgdG8gZGVmaW5lIFNFR01FTlRfU0laRQotICAgb24gbWFjaGluZXMgbm90IGxpc3RlZCBoZXJlLiAgKi8KLSNpZm5kZWYgU0VHTUVOVF9TSVpFCi0jaWYgZGVmaW5lZChocDMwMCkgfHwgZGVmaW5lZChweXIpCi0jZGVmaW5lIFNFR01FTlRfU0laRSBwYWdlX3NpemUKLSNlbmRpZgotI2lmZGVmCXNvbnkKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCTB4MTAwMAotI2VuZGlmCS8qIFNvbnkuICAqLwotI2lmZGVmIGlzNjhrCi0jZGVmaW5lIFNFR01FTlRfU0laRSAweDIwMDAwCi0jZW5kaWYKLSNpZiBkZWZpbmVkKG02OGspICYmIGRlZmluZWQoUE9SVEFSKQotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDB4NDAwCi0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZW5kaWYKLSNlbmRpZiAvKiFkZWZpbmVkKFNFR01FTlRfU0laRSkqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvaHAuaCBiL2luY2x1ZGUvYW91dC9ocC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDJmNDljLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9ocC5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyogU3BlY2lhbCB2ZXJzaW9uIG9mIDxhLm91dC5oPiBmb3IgdXNlIHVuZGVyIGhwLXV4LgotICAgQ29weXJpZ2h0IDE5ODgsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRISVMgRklMRSBJUyBPQlNPTEVURS4gIEl0IG5lZWRzIHRvIGJlIHJldmlzZWQgYXMgYSB2YXJpYW50ICJleHRlcm5hbCIKLSAgIGEub3V0IGZvcm1hdCBmb3IgdXNlIHdpdGggQkZELiAgKi8KLQotLyogVGhlIGBleGVjJyBzdHJ1Y3R1cmUgYW5kIG92ZXJhbGwgbGF5b3V0IG11c3QgYmUgY2xvc2UgdG8gSFAncyB3aGVuCi0gICB3ZSBhcmUgcnVubmluZyBvbiBhbiBIUCBzeXN0ZW0sIG90aGVyd2lzZSB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvCi0gICBleGVjdXRlIHRoZSByZXN1bHRpbmcgZmlsZS4gKi8KLQotLyogQWxsb3cgdGhpcyBmaWxlIHRvIGJlIGluY2x1ZGVkIHR3aWNlLiAqLwotI2lmbmRlZiBfX0dOVV9FWEVDX01BQ1JPU19fCi0KLXN0cnVjdCBleGVjCi17Ci0gIHVuc2lnbmVkIHNob3J0IGFfbWFjaHR5cGU7CS8qIG1hY2hpbmUgdHlwZSAqLwotICB1bnNpZ25lZCBzaG9ydCBhX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMTsKLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMjsKLSAgdW5zaWduZWQgbG9uZyBhX3RleHQ7CQkvKiBsZW5ndGggb2YgdGV4dCwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX2RhdGE7CQkvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX2JzczsJCS8qIGxlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX2Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMzsJLyogSFAgPSBwYXNjYWwgaW50ZXJmYWNlIHNpemUgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNDsJLyogSFAgPSBzeW1ib2wgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU1OwkvKiBIUCA9IGRlYnVnIG5hbWUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBsb25nIGFfZW50cnk7CS8qIHN0YXJ0IGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNjsJLyogSFAgPSBzb3VyY2UgbGluZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTc7CS8qIEhQID0gdmFsdWUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBsb25nIGFfc3ltczsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU4OwotfTsKLQotLyogVGVsbCBhLm91dC5nbnUuaCBub3QgdG8gZGVmaW5lIGBzdHJ1Y3QgZXhlYycuICAqLwotI2RlZmluZSBfX1NUUlVDVF9FWEVDX09WRVJSSURFX18KLQotI2luY2x1ZGUgIi4uL2Eub3V0LmdudS5oIgotCi0jdW5kZWYgTl9NQUdJQwotI3VuZGVmIE5fTUFDSFRZUEUKLSN1bmRlZiBOX0ZMQUdTCi0jdW5kZWYgTl9TRVRfSU5GTwotI3VuZGVmIE5fU0VUX01BR0lDCi0jdW5kZWYgTl9TRVRfTUFDSFRZUEUKLSN1bmRlZiBOX1NFVF9GTEFHUwotCi0jZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKSAuIGFfbWFnaWMpCi0jZGVmaW5lIE5fTUFDSFRZUEUoZXhlYykgKChleGVjKSAuIGFfbWFjaHR5cGUpCi0jZGVmaW5lIE5fU0VUX01BR0lDKGV4ZWMsIG1hZ2ljKSAoKChleGVjKSAuIGFfbWFnaWMpID0gKG1hZ2ljKSkKLSNkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpICgoKGV4ZWMpIC4gYV9tYWNodHlwZSkgPSAobWFjaHR5cGUpKQotCi0jdW5kZWYgTl9CQURNQUcKLSNkZWZpbmUgTl9CQURNQUcoeCkgKChfTl9CQURNQUcgKHgpKSB8fCAoX05fQkFETUFDSCAoeCkpKQotCi0jZGVmaW5lIF9OX0JBRE1BQ0goeCkJCQkJCQkJXAotKCgoTl9NQUNIVFlQRSAoeCkpICE9IEhQOTAwMFMyMDBfSUQpICYmCQkJCQlcCi0gKChOX01BQ0hUWVBFICh4KSkgIT0gSFA5OHg2X0lEKSkKLQotI2RlZmluZSBIUDk4eDZfSUQgMHgyMEEKLSNkZWZpbmUgSFA5MDAwUzIwMF9JRCAweDIwQwotCi0jdW5kZWYgX05fSERST0ZGCi0jZGVmaW5lIF9OX0hEUk9GRih4KSAoU0VHTUVOVF9TSVpFIC0gKHNpemVvZiAoc3RydWN0IGV4ZWMpKSkKLQotI2RlZmluZSBTRUdNRU5UX1NJWkUgMHgxMDAwCi0KLSNlbmRpZiAvKiBfX0dOVV9FWEVDX01BQ1JPU19fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvaHAzMDBocHV4LmggYi9pbmNsdWRlL2FvdXQvaHAzMDBocHV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZDUxOTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2hwMzAwaHB1eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qIFNwZWNpYWwgdmVyc2lvbiBvZiA8YS5vdXQuaD4gZm9yIHVzZSB1bmRlciBocC11eC4KLSAgIENvcHlyaWdodCAoQykgMTk4OCwxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAqLwotCi1zdHJ1Y3QgaHAzMDBocHV4X2V4ZWNfYnl0ZXMKLXsKLSAgdW5zaWduZWQgY2hhciBlX2luZm9bNF07ICAgLyogYV9tYWNodHlwZS9hX21hZ2ljICovCi0gIHVuc2lnbmVkIGNoYXIgZV9zcGFyZTFbNF07Ci0gIHVuc2lnbmVkIGNoYXIgZV9zcGFyZTJbNF07Ci0gIHVuc2lnbmVkIGNoYXIgZV90ZXh0WzRdOyAgIC8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGVfZGF0YVs0XTsgICAvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhciBlX2Jzc1s0XTsgICAgLyogbGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhICwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhciBlX3Ryc2l6ZVs0XTsgLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMqLwotICB1bnNpZ25lZCBjaGFyIGVfZHJzaXplWzRdOyAvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcyovCi0gIHVuc2lnbmVkIGNoYXIgZV9wYXNzaXplWzRdOy8qIEhQID0gcGFzY2FsIGludGVyZmFjZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgZV9zeW1zWzRdOyAgIC8qIEhQID0gc3ltYm9sIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBlX3NwYXJlNVs0XTsgLyogSFAgPSBkZWJ1ZyBuYW1lIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBlX2VudHJ5WzRdOyAgLyogc3RhcnQgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyIGVfc3BhcmU2WzRdOyAvKiBIUCA9IHNvdXJjZSBsaW5lIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBlX3N1cHNpemVbNF07LyogSFAgPSB2YWx1ZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgZV9kcmVsb2NzWzRdOwotICB1bnNpZ25lZCBjaGFyIGVfZXh0ZW5zaW9uWzRdOyAvKiBmaWxlIG9mZnNldCBvZiBleHRlbnNpb24gKi8KLX07Ci0jZGVmaW5lCUVYRUNfQllURVNfU0laRQk2NAotCi1zdHJ1Y3QgaHAzMDBocHV4X25saXN0X2J5dGVzCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyIGVfdmFsdWVbNF07Ci0gICAgdW5zaWduZWQgY2hhciBlX3R5cGVbMV07Ci0gICAgdW5zaWduZWQgY2hhciBlX2xlbmd0aFsxXTsJLyogbGVuZ3RoIG9mIGFzY2lpIHN5bWJvbCBuYW1lICovCi0gICAgdW5zaWduZWQgY2hhciBlX2FsbW9kWzJdOwkvKiBhbGlnbm1lbnQgbW9kICovCi0gICAgdW5zaWduZWQgY2hhciBlX3NobGliWzJdOyAgIC8qIGluZm8gYWJvdXQgZHluYW1pYyBsaW5raW5nICovCi0gIH07Ci0jZGVmaW5lIEVYVEVSTkFMX05MSVNUX1NJWkUgMTAKLQotc3RydWN0IGhwMzAwaHB1eF9yZWxvYwotICB7Ci0gICAgdW5zaWduZWQgY2hhciByX2FkZHJlc3NbNF07Lyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHJfaW5kZXhbMl07ICAvKiBzeW1ib2wgdGFibGUgaW5kZXggb2Ygc3ltYm9sICAgICAgICAgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHJfdHlwZVsxXTsgICAvKiByZWxvY2F0aW9uIHR5cGUgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHJfbGVuZ3RoWzFdOyAvKiBsZW5ndGggb2YgaXRlbSB0byByZWxvYyAgICAgICAgICAgICAgKi8KLSAgfTsKLQotc3RydWN0IGhwMzAwaHB1eF9oZWFkZXJfZXh0ZW5zaW9uCi17Ci0gICAgdW5zaWduZWQgY2hhciBlX3N5bXNbNF07Ci0gICAgdW5zaWduZWQgY2hhciB1bmlxdWVfaGVhZGVyc1sxMio0XTsKLSAgICB1bnNpZ25lZCBjaGFyIGVfaGVhZGVyWzJdOyAgIC8qIHR5cGUgb2YgaGVhZGVyICovCi0gICAgdW5zaWduZWQgY2hhciBlX3ZlcnNpb25bMl07ICAvKiB2ZXJzaW9uICAgICAgICAqLwotICAgIHVuc2lnbmVkIGNoYXIgZV9zaXplWzRdOyAgICAgLyogYnl0ZXMgZm9sbG93aW5nKi8KLSAgICB1bnNpZ25lZCBjaGFyIGVfZXh0ZW5zaW9uWzRdOy8qIGZpbGUgb2Zmc2V0IG9mIG5leHQgZXh0ZW5zaW9uICovCi19OwotI2RlZmluZSBFWFRFUk5BTF9FWFRFTlNJT05fSEVBREVSX1NJWkUgKDE2KjQpCi0KLS8qIGhwdXggc2VwYXJhdGVzIG9iamVjdCBmaWxlcyAoMHgxMDYpIGFuZCBpbXB1cmUgZXhlY3V0YWJsZXMgKDB4MTA3KSAgKi8KLS8qIGJ1dCB0aGUgYmZkIGNvZGUgZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGVtLiBTaW5jZSB3ZSB3YW50IHRvKi8KLS8qIHJlYWQgaHB1eCAubyBmaWxlcywgd2UgYWRkIGFuIHNwZWNpYWwgZGVmaW5lIGFuZCB1c2UgaXQgYmVsb3cgaW4gICAgKi8KLS8qIG9mZnNldCBhbmQgYWRkcmVzcyBjYWxjdWxhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBIUFVYX0RPVF9PX01BR0lDIDB4MTA2Ci0jZGVmaW5lIE9NQUdJQyAweDEwNyAgICAgICAvKiBvYmplY3QgZmlsZSBvciBpbXB1cmUgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIE5NQUdJQyAweDEwOCAgICAgICAvKiBDb2RlIGluZGljYXRpbmcgcHVyZSBleGVjdXRhYmxlLiAgICovCi0jZGVmaW5lIFpNQUdJQyAweDEwQiAgICAgICAvKiBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZS4gICAgICAgICAgICovCi0KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAwCi0KLSNpZiAwIC8qIGxpYmFvdXQuaCBvbmx5IHVzZXMgdGhlIGxvd2VyIDggYml0cyAqLwotI2RlZmluZSBIUDk4eDZfSUQgMHgyMEEKLSNkZWZpbmUgSFA5MDAwUzIwMF9JRCAweDIwQwotI2VuZGlmCi0jZGVmaW5lIEhQOTh4Nl9JRCAweDBBCi0jZGVmaW5lIEhQOTAwMFMyMDBfSUQgMHgwQwotCi0jZGVmaW5lIE5fQkFETUFHKHgpICgoX05fQkFETUFHICh4KSkgfHwgKF9OX0JBRE1BQ0ggKHgpKSkKLQotI2RlZmluZSBOX0RBVEFERFIoeCkgXAotICAgICgoTl9NQUdJQyh4KT09T01BR0lDIHx8IE5fTUFHSUMoeCk9PUhQVVhfRE9UX09fTUFHSUMpID8gXAotICAgICAgICAoTl9UWFRBRERSKHgpK05fVFhUU0laRSh4KSkgXAotICAgICA6ICAoTl9TRUdTSVpFKHgpICsgKChOX1RYVEFERFIoeCkrTl9UWFRTSVpFKHgpLTEpICYgfihOX1NFR1NJWkUoeCktMSkpKSkKLQotI2RlZmluZSBfTl9CQURNQUNIKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotKCgoTl9NQUNIVFlQRSAoeCkpICE9IEhQOTAwMFMyMDBfSUQpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICgoTl9NQUNIVFlQRSAoeCkpICE9IEhQOTh4Nl9JRCkpCi0KLSNkZWZpbmUgX05fQkFETUFHKHgpCSAgKE5fTUFHSUMoeCkgIT0gSFBVWF9ET1RfT19NQUdJQyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBOX01BR0lDKHgpICE9IE9NQUdJQwkJXAotCQkJJiYgTl9NQUdJQyh4KSAhPSBOTUFHSUMJCVwKLSAgCQkJJiYgTl9NQUdJQyh4KSAhPSBaTUFHSUMgKQotCi0jdW5kZWYgX05fSERST0ZGCi0jZGVmaW5lIF9OX0hEUk9GRih4KSAoU0VHTUVOVF9TSVpFIC0gKHNpemVvZiAoc3RydWN0IGV4ZWMpKSkKLQotI3VuZGVmIE5fREFUT0ZGCi0jdW5kZWYgTl9QQVNPRkYKLSN1bmRlZiBOX1NZTU9GRgotI3VuZGVmIE5fU1VQT0ZGCi0jdW5kZWYgTl9UUkVMT0ZGCi0jdW5kZWYgTl9EUkVMT0ZGCi0jdW5kZWYgTl9TVFJPRkYKLQotI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgTl9UWFRTSVpFKHgpICkKLSNkZWZpbmUgTl9QQVNPRkYoeCkgICAgICggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhKQotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fUEFTT0ZGKHgpICAgLyogKyAoeCkuYV9wYXNzaXplKi8gKQotI2RlZmluZSBOX1NVUE9GRih4KSAgICAgKCBOX1NZTU9GRih4KSArICh4KS5hX3N5bXMgKQotI2RlZmluZSBOX1RSRUxPRkYoeCkJKCBOX1NVUE9GRih4KSAgICAvKiArIDAgKHgpLmFfc3Vwc2l6ZSovICkKLSNkZWZpbmUgTl9EUkVMT0ZGKHgpCSggTl9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplICkKLSNkZWZpbmUgTl9FWFRIT0ZGKHgpICAgICggTl9EUkVMT0ZGKHgpICAgLyogICsgMCAoeCkuYV9kcnNpemUgKi8pCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggMCAvKiBubyBzdHJpbmcgdGFibGUgKi8gKQotCi0vKiB1c2UgdGhlc2Ugd2hlbiB0aGUgZmlsZSBoYXMgZ251IHN5bWJvbCB0YWJsZXMgKi8KLSNkZWZpbmUgTl9HTlVfVFJFTE9GRih4KSAoTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhKQotI2RlZmluZSBOX0dOVV9EUkVMT0ZGKHgpIChOX0dOVV9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplKQotI2RlZmluZSBOX0dOVV9TWU1PRkYoeCkgIChOX0dOVV9EUkVMT0ZGKHgpICsgKHgpLmFfZHJzaXplKQotCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMHgxMDAwCi0jZGVmaW5lIFNFR01FTlRfU0laRSAweDEwMDAKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKLQotI3VuZGVmIE5fU0hBUkVEX0xJQgotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgICggMCAvKiBubyBzaGFyZWQgbGlicmFyaWVzICovICkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9ocHBhLmggYi9pbmNsdWRlL2FvdXQvaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTE4NWRlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9ocHBhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpbmNsdWRlICJmaWxlaGRyLmgiCi0jaW5jbHVkZSAiYW91dGhkci5oIgotI2luY2x1ZGUgInNjbmhkci5oIgotI2luY2x1ZGUgInNwYWNlaGRyLmgiCi0jaW5jbHVkZSAic3ltcy5oIgotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9yYW5saWIuaCBiL2luY2x1ZGUvYW91dC9yYW5saWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyNjAwNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvcmFubGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKiByYW5saWIuaCAtLSBhcmNoaXZlIGxpYnJhcnkgaW5kZXggbWVtYmVyIGRlZmluaXRpb24gZm9yIEdOVS4KLSAgIENvcHlyaWdodCAxOTkwLTE5OTEgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGUgU3ltZGVmIG1lbWJlciBvZiBhbiBhcmNoaXZlIGNvbnRhaW5zIHR3byB0aGluZ3M6Ci0gICBhIHRhYmxlIHRoYXQgbWFwcyBzeW1ib2wtc3RyaW5nIG9mZnNldHMgdG8gZmlsZSBvZmZzZXRzLAotICAgYW5kIGEgc3ltYm9sLXN0cmluZyB0YWJsZS4gIEFsbCB0aGUgc3ltYm9sIG5hbWVzIGFyZQotICAgcnVuIHRvZ2V0aGVyIChlYWNoIHdpdGggdHJhaWxpbmcgbnVsbCkgaW4gdGhlIHN5bWJvbC1zdHJpbmcKLSAgIHRhYmxlLiAgVGhlcmUgaXMgYSBzaW5nbGUgbG9uZ3dvcmQgYnl0ZWNvdW50IG9uIHRoZSBmcm9udAotICAgb2YgZWFjaCBvZiB0aGVzZSB0YWJsZXMuICBUaHVzIGlmIHdlIGhhdmUgdHdvIHN5bWJvbHMsCi0gICAiZm9vIiBhbmQgIl9iYXIiLCB0aGF0IGFyZSBpbiBhcmNoaXZlIG1lbWJlcnMgYXQgb2Zmc2V0cwotICAgMjAwIGFuZCA5MDAsIGl0IHdvdWxkIGxvb2sgbGlrZSB0aGlzOgotICAgICAgICAxNgkJOyBieXRlIGNvdW50IG9mIGluZGV4IHRhYmxlCi0gIAkwCQk7IG9mZnNldCBvZiAiZm9vIiBpbiBzdHJpbmcgdGFibGUKLSAgCTIwMAkJOyBvZmZzZXQgb2YgZm9vLW1vZHVsZSBpbiBmaWxlCi0gIAk0CQk7IG9mZnNldCBvZiAiYmFyIiBpbiBzdHJpbmcgdGFibGUKLSAgCTkwMAkJOyBvZmZzZXQgb2YgYmFyLW1vZHVsZSBpbiBmaWxlCi0gIAk5CQk7IGJ5dGUgY291bnQgb2Ygc3RyaW5nIHRhYmxlCi0gIAkiZm9vXDBfYmFyXDAiCTsgc3RyaW5nIHRhYmxlICAqLwotCi0jZGVmaW5lCVJBTkxJQk1BRwkiX18uU1lNREVGIgkvKiBBcmNoaXZlIGZpbGUgbmFtZSBjb250YWluaW5nIGluZGV4ICovCi0jZGVmaW5lCVJBTkxJQlNLRVcJMwkJLyogQ3JlYXRpb24gdGltZSBvZmZzZXQgKi8KLQotLyogRm9ybWF0IG9mIF9fLlNZTURFRjoKLSAgIEZpcnN0LCBhIGxvbmd3b3JkIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgdGhlICdzeW1kZWYnIGRhdGEgdGhhdCBmb2xsb3dzLgotICAgU2Vjb25kLCB6ZXJvIG9yIG1vcmUgJ3N5bWRlZicgc3RydWN0dXJlcy4KLSAgIFRoaXJkLCBhIGxvbmd3b3JkIGNvbnRhaW5pbmcgdGhlIGxlbmd0aCBvZiBzeW1ib2wgbmFtZSBzdHJpbmdzLgotICAgRm91cnRoLCB6ZXJvIG9yIG1vcmUgc3ltYm9sIG5hbWUgc3RyaW5ncyAoZWFjaCBmb2xsb3dlZCBieSBhIG51bGwpLiAgKi8KLQotc3RydWN0IHN5bWRlZgotICB7Ci0gICAgdW5pb24KLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nIHN0cmluZ19vZmZzZXQ7CS8qIEluIHRoZSBmaWxlICovCi0JY2hhciAqbmFtZTsJCQkvKiBJbiBtZW1vcnksIHNvbWV0aW1lcyAqLwotICAgICAgfSBzOwotICAgIC8qIHRoaXMgcG9pbnRzIHRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSBoZWFkZXIgKEFLQSBtZW1iZXIgaGVhZGVyIC0tCi0gICAgICAgYSBzdHJ1Y3QgYXJfaGRyKSwgbm90IHRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSBvciBpbnRvIHRoZSBmaWxlKS4KLSAgICAgICBpbiBvdGhlciB3b3JkcyBpdCBvbmx5IHRlbGxzIHlvdSB3aGljaCBmaWxlIHRvIHJlYWQgKi8gICAgICAgCi0gICAgdW5zaWduZWQgbG9uZyBmaWxlX29mZnNldDsKLSAgfTsKLQotLyogQ29tcGF0YWJpbGl0eSB3aXRoIEJTRCBjb2RlICovCi0KLSNkZWZpbmUJcmFubGliCXN5bWRlZgotI2RlZmluZQlyYW5fdW4JcwotI2RlZmluZQlyYW5fc3RyeCBzdHJpbmdfb2Zmc2V0Ci0jZGVmaW5lCXJhbl9uYW1lIG5hbWUKLSNkZWZpbmUJcmFuX29mZglmaWxlX29mZnNldApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L3JlbG9jLmggYi9pbmNsdWRlL2FvdXQvcmVsb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzYzU1Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvcmVsb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIHJlbG9jLmggLS0gSGVhZGVyIGZpbGUgZm9yIHJlbG9jYXRpb24gaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgMTk4OS0xOTkxICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogUmVsb2NhdGlvbiB0eXBlcyBmb3IgYS5vdXQgZmlsZXMgdXNpbmcgcmVsb2NfaW5mb19leHRlbmRlZAotICAgKFNQQVJDIGFuZCBBTUQgMjkwMDApLiAqLwotCi0jaWZuZGVmIF9SRUxPQ19IX1JFQURfCi0jZGVmaW5lIF9SRUxPQ19IX1JFQURfIDEKLQotZW51bSByZWxvY190eXBlCi0gIHsKLSAgICBSRUxPQ184LCAgICAgICAgUkVMT0NfMTYsICAgICAgICBSRUxPQ18zMiwgLyogc2ltcGxlIHJlbG9jYXRpb25zICovCi0gICAgUkVMT0NfRElTUDgsICAgIFJFTE9DX0RJU1AxNiwgICAgUkVMT0NfRElTUDMyLCAvKiBwYy1yZWwgZGlzcGxhY2VtZW50ICovCi0gICAgUkVMT0NfV0RJU1AzMCwgIFJFTE9DX1dESVNQMjIsCi0gICAgUkVMT0NfSEkyMiwgICAgIFJFTE9DXzIyLAotICAgIFJFTE9DXzEzLCAgICAgICBSRUxPQ19MTzEwLAotICAgIFJFTE9DX1NGQV9CQVNFLCBSRUxPQ19TRkFfT0ZGMTMsCi0gICAgUkVMT0NfQkFTRTEwLCAgIFJFTE9DX0JBU0UxMywgICAgUkVMT0NfQkFTRTIyLCAvKiBQLkkuQy4gKGJhc2UtcmVsYXRpdmUpICovCi0gICAgUkVMT0NfUEMxMCwgICAgIFJFTE9DX1BDMjIsCS8qIGZvciBzb21lIHNvcnQgb2YgcGMtcmVsIFAuSS5DLiAoPykgKi8KLSAgICBSRUxPQ19KTVBfVEJMLAkJLyogUC5JLkMuIGp1bXAgdGFibGUgKi8KLSAgICBSRUxPQ19TRUdPRkYxNiwJCS8qIHJlcHV0ZWRseSBmb3Igc2hhcmVkIGxpYnJhcmllcyBzb21laG93ICovCi0gICAgUkVMT0NfR0xPQl9EQVQsICBSRUxPQ19KTVBfU0xPVCwgUkVMT0NfUkVMQVRJVkUsCi0gICAgUkVMT0NfMTEsCi0gICAgUkVMT0NfV0RJU1AyXzE0LAotICAgIFJFTE9DX1dESVNQMTksCi0gICAgUkVMT0NfSEhJMjIsCi0gICAgUkVMT0NfSExPMTAsCi0gICAgCi0gICAgLyogMjlLIHJlbG9jYXRpb24gdHlwZXMgKi8KLSAgICBSRUxPQ19KVU1QVEFSRywgUkVMT0NfQ09OU1QsICAgICBSRUxPQ19DT05TVEgsCi0gICAgCi0gICAgUkVMT0NfV0RJU1AxNCwgUkVMT0NfV0RJU1AyMSwKLSAgICAKLSAgICBOT19SRUxPQwotICAgIH07Ci0KLSNkZWZpbmUJUkVMT0NfVFlQRV9OQU1FUyBcCi0iOCIsCQkiMTYiLAkJIjMyIiwJCSJESVNQOCIsCVwKLSJESVNQMTYiLAkiRElTUDMyIiwJIldESVNQMzAiLAkiV0RJU1AyMiIsCVwKLSJISTIyIiwJCSIyMiIsCQkiMTMiLAkJIkxPMTAiLAkJXAotIlNGQV9CQVNFIiwJIlNGQU9GRjEzIiwJIkJBU0UxMCIsCSJCQVNFMTMiLAlcCi0iQkFTRTIyIiwJIlBDMTAiLAkJIlBDMjIiLAkJIkpNUF9UQkwiLAlcCi0iU0VHT0ZGMTYiLAkiR0xPQl9EQVQiLAkiSk1QX1NMT1QiLAkiUkVMQVRJVkUiLAlcCi0iMTEiLAkJIldESVNQMl8xNCIsCSJXRElTUDE5IiwgCSJISEkyMiIsCVwKLSJITE8xMCIsCQkJCQkJCVwKLSJKVU1QVEFSRyIsCSJDT05TVCIsCSJDT05TVEgiLAkiV0RJU1AxNCIsCVwKLSJXRElTUDIxIiwJXAotIk5PX1JFTE9DIgotCi0jZW5kaWYgLyogX1JFTE9DX0hfUkVBRF8gKi8KLQotLyogZW5kIG9mIHJlbG9jLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9zdGFiLmRlZiBiL2luY2x1ZGUvYW91dC9zdGFiLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyZDJkZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvc3RhYi5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyogVGFibGUgb2YgREJYIHN5bWJvbCBjb2RlcyBmb3IgdGhlIEdOVSBzeXN0ZW0uCi0gICBDb3B5cmlnaHQgKEMpIDE5ODgsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotLyogTmV3IHN0YWIgZnJvbSBTb2xhcmlzIDIuICBUaGlzIHVzZXMgYW4gbl90eXBlIG9mIDAsIHdoaWNoIGluIGEub3V0IGZpbGVzCi0gICBvdmVybGFwcyB0aGUgTl9VTkRGIHVzZWQgZm9yIG9yZGluYXJ5IHN5bWJvbHMuICBJbiBFTEYgZmlsZXMsIHRoZQotICAgZGVidWcgaW5mb3JtYXRpb24gaXMgaW4gYSBkaWZmZXJlbnQgZmlsZSBzZWN0aW9uLCBzbyB0aGVyZSBpcyBubyBjb25mbGljdC4KLSAgIFRoaXMgc3ltYm9sJ3Mgbl92YWx1ZSBnaXZlcyB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nIHNlY3Rpb24gYXNzb2NpYXRlZAotICAgd2l0aCB0aGlzIGZpbGUuICBUaGUgc3ltYm9sJ3Mgbl9zdHJ4IChyZWxhdGl2ZSB0byB0aGUganVzdC11cGRhdGVkCi0gICBzdHJpbmcgc2VjdGlvbiBzdGFydCBhZGRyZXNzKSBnaXZlcyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUsCi0gICBlLmcuICJmb28uYyIsIHdpdGhvdXQgYW55IHBhdGggaW5mb3JtYXRpb24uICBUaGUgc3ltYm9sJ3Mgbl9kZXNjIGdpdmVzCi0gICB0aGUgY291bnQgb2YgdXBjb21pbmcgc3ltYm9scyBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWxlIChub3QgaW5jbHVkaW5nCi0gICB0aGlzIG9uZSkuICAqLwotLyogX19kZWZpbmVfc3RhYiAoTl9VTkRGLCAweDAwLCAiVU5ERiIpICAqLwotCi0vKiBHbG9iYWwgdmFyaWFibGUuICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LgotICAgVG8gZmluZCB0aGUgYWRkcmVzcywgbG9vayBpbiB0aGUgY29ycmVzcG9uZGluZyBleHRlcm5hbCBzeW1ib2wuICAqLwotX19kZWZpbmVfc3RhYiAoTl9HU1lNLCAweDIwLCAiR1NZTSIpCi0KLS8qIEZ1bmN0aW9uIG5hbWUgZm9yIEJTRCBGb3J0cmFuLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4KLSAgIFRvIGZpbmQgdGhlIGFkZHJlc3MsIGxvb2sgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fRk5BTUUsIDB4MjIsICJGTkFNRSIpCi0KLS8qIEZ1bmN0aW9uIG5hbWUgb3IgdGV4dC1zZWdtZW50IHZhcmlhYmxlIGZvciBDLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuCi0gICBEZXNjIGlzIHN1cHBvc2VkbHkgc3RhcnRpbmcgbGluZSBudW1iZXIsIGJ1dCBHQ0MgZG9lc24ndCBzZXQgaXQKLSAgIGFuZCBEQlggc2VlbXMgbm90IHRvIG1pc3MgaXQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9GVU4sIDB4MjQsICJGVU4iKQotCi0vKiBEYXRhLXNlZ21lbnQgdmFyaWFibGUgd2l0aCBpbnRlcm5hbCBsaW5rYWdlLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuCi0gICAiU3RhdGljIFN5bSIuICAqLwotX19kZWZpbmVfc3RhYiAoTl9TVFNZTSwgMHgyNiwgIlNUU1lNIikKLQotLyogQlNTLXNlZ21lbnQgdmFyaWFibGUgd2l0aCBpbnRlcm5hbCBsaW5rYWdlLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuICAqLwotX19kZWZpbmVfc3RhYiAoTl9MQ1NZTSwgMHgyOCwgIkxDU1lNIikKLQotLyogTmFtZSBvZiBtYWluIHJvdXRpbmUuICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fTUFJTiwgMHgyYSwgIk1BSU4iKQotCi0vKiBTb2xhcmlzMjogIFJlYWQtb25seSBkYXRhIHN5bWJvbHMuICAqLwotX19kZWZpbmVfc3RhYiAoTl9ST1NZTSwgMHgyYywgIlJPU1lNIikKLQotLyogR2xvYmFsIHN5bWJvbCBpbiBQYXNjYWwuCi0gICBTdXBwb3NlZGx5IHRoZSB2YWx1ZSBpcyBpdHMgbGluZSBudW1iZXI7IEknbSBza2VwdGljYWwuICAqLwotX19kZWZpbmVfc3RhYiAoTl9QQywgMHgzMCwgIlBDIikKLQotLyogTnVtYmVyIG9mIHN5bWJvbHM6ICAwLCBmaWxlcywsZnVuY3MsbGluZXMgYWNjb3JkaW5nIHRvIFVsdHJpeCBWNC4wLiAqLwotX19kZWZpbmVfc3RhYiAoTl9OU1lNUywgMHgzMiwgIk5TWU1TIikKLQotLyogIk5vIERTVCBtYXAgZm9yIHN5bTogbmFtZSwgLDAsdHlwZSxpZ25vcmVkIiAgYWNjb3JkaW5nIHRvIFVsdHJpeCBWNC4wLiAqLwotX19kZWZpbmVfc3RhYiAoTl9OT01BUCwgMHgzNCwgIk5PTUFQIikKLQotLyogTmV3IHN0YWIgZnJvbSBTb2xhcmlzIDIuICBMaWtlIE5fU08sIGJ1dCBmb3IgdGhlIG9iamVjdCBmaWxlLiAgVHdvIGluCi0gICBhIHJvdyBwcm92aWRlIHRoZSBidWlsZCBkaXJlY3RvcnkgYW5kIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSAubyBmcm9tIGl0LgotICAgU29sYXJpczIgdXNlcyB0aGlzIHRvIGF2b2lkIHB1dHRpbmcgdGhlIHN0YWJzIGluZm8gaW50byB0aGUgbGlua2VkCi0gICBleGVjdXRhYmxlOyB0aGlzIHN0YWIgZ29lcyBpbnRvIHRoZSAiLnN0YWIuaW5kZXgiIHNlY3Rpb24sIGFuZCB0aGUgZGVidWdnZXIKLSAgIHJlYWRzIHRoZSByZWFsIHN0YWJzIGRpcmVjdGx5IGZyb20gdGhlIC5vIGZpbGVzIGluc3RlYWQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9PQkosIDB4MzgsICJPQkoiKQotCi0vKiBOZXcgc3RhYiBmcm9tIFNvbGFyaXMgMi4gIE9wdGlvbnMgZm9yIHRoZSBkZWJ1Z2dlciwgcmVsYXRlZCB0byB0aGUKLSAgIHNvdXJjZSBsYW5ndWFnZSBmb3IgdGhpcyBtb2R1bGUuICBFLmcuIHdoZXRoZXIgdG8gdXNlIEFOU0kKLSAgIGludGVncmFsIHByb21vdGlvbnMgb3IgdHJhZGl0aW9uYWwgaW50ZWdyYWwgcHJvbW90aW9ucy4gICovCi1fX2RlZmluZV9zdGFiIChOX09QVCwgMHgzYywgIk9QVCIpCi0KLS8qIFJlZ2lzdGVyIHZhcmlhYmxlLiAgVmFsdWUgaXMgbnVtYmVyIG9mIHJlZ2lzdGVyLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fUlNZTSwgMHg0MCwgIlJTWU0iKQotCi0vKiBNb2R1bGEtMiBjb21waWxhdGlvbiB1bml0LiAgQ2FuIHNvbWVvbmUgc2F5IHdoYXQgaW5mbyBpdCBjb250YWlucz8gICovCi1fX2RlZmluZV9zdGFiIChOX00yQywgMHg0MiwgIk0yQyIpCi0KLS8qIExpbmUgbnVtYmVyIGluIHRleHQgc2VnbWVudC4gIERlc2MgaXMgdGhlIGxpbmUgbnVtYmVyOwotICAgdmFsdWUgaXMgY29ycmVzcG9uZGluZyBhZGRyZXNzLiAgT24gU29sYXJpczIsIHRoZSBsaW5lIG51bWJlciBpcwotICAgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fU0xJTkUsIDB4NDQsICJTTElORSIpCi0KLS8qIFNpbWlsYXIsIGZvciBkYXRhIHNlZ21lbnQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9EU0xJTkUsIDB4NDYsICJEU0xJTkUiKQotCi0vKiBTaW1pbGFyLCBmb3IgYnNzIHNlZ21lbnQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9CU0xJTkUsIDB4NDgsICJCU0xJTkUiKQotCi0vKiBTdW4ncyBzb3VyY2UtY29kZSBicm93c2VyIHN0YWJzLiAgPz8gRG9uJ3Qga25vdyB3aGF0IHRoZSBmaWVsZHMgYXJlLgotICAgU3VwcG9zZWRseSB0aGUgZmllbGQgaXMgInBhdGggdG8gYXNzb2NpYXRlZCAuY2IgZmlsZSIuICBUSElTIFZBTFVFCi0gICBPVkVSTEFQUyBXSVRIIE5fQlNMSU5FISAgKi8KLV9fZGVmaW5lX3N0YWJfZHVwbGljYXRlIChOX0JST1dTLCAweDQ4LCAiQlJPV1MiKQotCi0vKiBHTlUgTW9kdWxhLTIgZGVmaW5pdGlvbiBtb2R1bGUgZGVwZW5kZW5jeS4gIFZhbHVlIGlzIHRoZSBtb2RpZmljYXRpb24gdGltZQotICAgb2YgdGhlIGRlZmluaXRpb24gZmlsZS4gIE90aGVyIGlzIG5vbi16ZXJvIGlmIGl0IGlzIGltcG9ydGVkIHdpdGggdGhlCi0gICBHTlUgTTIga2V5d29yZCAlSU5JVElBTElaRS4gIFBlcmhhcHMgTl9NMkMgY2FuIGJlIHVzZWQgaWYgdGhlcmUKLSAgIGFyZSBlbm91Z2ggZW1wdHkgZmllbGRzPyAqLwotX19kZWZpbmVfc3RhYihOX0RFRkQsIDB4NGEsICJERUZEIikKLQotLyogTmV3IGluIFNvbGFyaXMyLiAgRnVuY3Rpb24gc3RhcnQvYm9keS9lbmQgbGluZSBudW1iZXJzLiAgKi8KLV9fZGVmaW5lX3N0YWIoTl9GTElORSwgMHg0QywgIkZMSU5FIikKLQotLyogVEhFIEZPTExPV0lORyBUV08gU1RBQiBWQUxVRVMgQ09ORkxJQ1QuICBIYXBwaWx5LCBvbmUgaXMgZm9yIE1vZHVsYS0yCi0gICBhbmQgb25lIGlzIGZvciBDKysuICAgU3RpbGwsLi4uICovCi0vKiBHTlUgQysrIGV4Y2VwdGlvbiB2YXJpYWJsZS4gIE5hbWUgaXMgdmFyaWFibGUgbmFtZS4gICovCi1fX2RlZmluZV9zdGFiIChOX0VIREVDTCwgMHg1MCwgIkVIREVDTCIpCi0vKiBNb2R1bGEyIGluZm8gImZvciBpbWMiOiAgbmFtZSwsMCwwLDAgIGFjY29yZGluZyB0byBVbHRyaXggVjQuMC4gICovCi1fX2RlZmluZV9zdGFiX2R1cGxpY2F0ZSAoTl9NT0QyLCAweDUwLCAiTU9EMiIpCi0KLS8qIEdOVSBDKysgYGNhdGNoJyBjbGF1c2UuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4gIERlc2MgaXMgbm9uemVybyBpZgotICAgdGhpcyBlbnRyeSBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIENBVUdIVCBzdGFiIHNheWluZyB3aGF0IGV4Y2VwdGlvbgotICAgd2FzIGNhdWdodC4gIE11bHRpcGxlIENBVUdIVCBzdGFicyBtZWFucyB0aGF0IG11bHRpcGxlIGV4Y2VwdGlvbnMKLSAgIGNhbiBiZSBjYXVnaHQgaGVyZS4gIElmIERlc2MgaXMgMCwgaXQgbWVhbnMgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodAotICAgaGVyZS4gICovCi1fX2RlZmluZV9zdGFiIChOX0NBVENILCAweDU0LCAiQ0FUQ0giKQotCi0vKiBTdHJ1Y3R1cmUgb3IgdW5pb24gZWxlbWVudC4gIFZhbHVlIGlzIG9mZnNldCBpbiB0aGUgc3RydWN0dXJlLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fU1NZTSwgMHg2MCwgIlNTWU0iKQotCi0vKiBTb2xhcmlzMjogIExhc3Qgc3RhYiBlbWl0dGVkIGZvciBtb2R1bGUuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FTkRNLCAweDYyLCAiRU5ETSIpCi0KLS8qIE5hbWUgb2YgbWFpbiBzb3VyY2UgZmlsZS4KLSAgIFZhbHVlIGlzIHN0YXJ0aW5nIHRleHQgYWRkcmVzcyBvZiB0aGUgY29tcGlsYXRpb24uCi0gICBJZiBtdWx0aXBsZSBOX1NPJ3MgYXBwZWFyLCB0aGUgZmlyc3QgdG8gY29udGFpbiBhIHRyYWlsaW5nIC8gaXMgdGhlCi0gICBjb21waWxhdGlvbiBkaXJlY3RvcnkuICBUaGUgZmlyc3QgdG8gbm90IGNvbnRhaW4gYSB0cmFpbGluZyAvIGlzIHRoZQotICAgc291cmNlIGZpbGUgbmFtZSwgcmVsYXRpdmUgdG8gdGhlIGNvbXBpbGF0aW9uIGRpcmVjdG9yeS4gIE90aGVycyAocGVyaGFwcwotICAgcmVzdWx0aW5nIGZyb20gY2Zyb250KSBhcmUgaWdub3JlZC4KLSAgIE9uIFNvbGFyaXMyLCB2YWx1ZSBpcyB1bmRlZmluZWQsIGJ1dCBkZXNjIGlzIGEgc291cmNlLWxhbmd1YWdlIGNvZGUuICAqLwotCi1fX2RlZmluZV9zdGFiIChOX1NPLCAweDY0LCAiU08iKQotCi0vKiBTdW5Qcm8gRjc3OiAgTmFtZSBvZiBhbGlhcy4gICovCi1fX2RlZmluZV9zdGFiIChOX0FMSUFTLCAweDZjLCAiQUxJQVMiKQotCi0vKiBBdXRvbWF0aWMgdmFyaWFibGUgaW4gdGhlIHN0YWNrLiAgVmFsdWUgaXMgb2Zmc2V0IGZyb20gZnJhbWUgcG9pbnRlci4KLSAgIEFsc28gdXNlZCBmb3IgdHlwZSBkZXNjcmlwdGlvbnMuICAqLwotX19kZWZpbmVfc3RhYiAoTl9MU1lNLCAweDgwLCAiTFNZTSIpCi0KLS8qIEJlZ2lubmluZyBvZiBhbiBpbmNsdWRlIGZpbGUuICBPbmx5IFN1biB1c2VzIHRoaXMuCi0gICBJbiBhbiBvYmplY3QgZmlsZSwgb25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4KLSAgIFRoZSBTdW4gbGlua2VyIHB1dHMgZGF0YSBpbnRvIHNvbWUgb2YgdGhlIG90aGVyIGZpZWxkcy4gICovCi1fX2RlZmluZV9zdGFiIChOX0JJTkNMLCAweDgyLCAiQklOQ0wiKQotCi0vKiBOYW1lIG9mIHN1Yi1zb3VyY2UgZmlsZSAoI2luY2x1ZGUgZmlsZSkuCi0gICBWYWx1ZSBpcyBzdGFydGluZyB0ZXh0IGFkZHJlc3Mgb2YgdGhlIGNvbXBpbGF0aW9uLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fU09MLCAweDg0LCAiU09MIikKLQotLyogUGFyYW1ldGVyIHZhcmlhYmxlLiAgVmFsdWUgaXMgb2Zmc2V0IGZyb20gYXJndW1lbnQgcG9pbnRlci4KLSAgIChPbiBtb3N0IG1hY2hpbmVzIHRoZSBhcmd1bWVudCBwb2ludGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBmcmFtZSBwb2ludGVyLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fUFNZTSwgMHhhMCwgIlBTWU0iKQotCi0vKiBFbmQgb2YgYW4gaW5jbHVkZSBmaWxlLiAgTm8gbmFtZS4KLSAgIFRoaXMgYW5kIE5fQklOQ0wgYWN0IGFzIGJyYWNrZXRzIGFyb3VuZCB0aGUgZmlsZSdzIG91dHB1dC4KLSAgIEluIGFuIG9iamVjdCBmaWxlLCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBkYXRhIGluIHRoaXMgZW50cnkuCi0gICBUaGUgU3VuIGxpbmtlciBwdXRzIGRhdGEgaW50byBzb21lIG9mIHRoZSBmaWVsZHMuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FSU5DTCwgMHhhMiwgIkVJTkNMIikKLQotLyogQWx0ZXJuYXRlIGVudHJ5IHBvaW50LiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FTlRSWSwgMHhhNCwgIkVOVFJZIikKLQotLyogQmVnaW5uaW5nIG9mIGxleGljYWwgYmxvY2suCi0gICBUaGUgZGVzYyBpcyB0aGUgbmVzdGluZyBsZXZlbCBpbiBsZXhpY2FsIGJsb2Nrcy4KLSAgIFRoZSB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHRleHQgZm9yIHRoZSBibG9jay4KLSAgIFRoZSB2YXJpYWJsZXMgZGVjbGFyZWQgaW5zaWRlIHRoZSBibG9jayAqcHJlY2VkZSogdGhlIE5fTEJSQUMgc3ltYm9sLgotICAgT24gU29sYXJpczIsIHRoZSB2YWx1ZSBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotX19kZWZpbmVfc3RhYiAoTl9MQlJBQywgMHhjMCwgIkxCUkFDIikKLQotLyogUGxhY2UgaG9sZGVyIGZvciBkZWxldGVkIGluY2x1ZGUgZmlsZS4gIFJlcGxhY2VzIGEgTl9CSU5DTCBhbmQgZXZlcnl0aGluZwotICAgdXAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgTl9FSU5DTC4gIFRoZSBTdW4gbGlua2VyIGdlbmVyYXRlcyB0aGVzZSB3aGVuCi0gICBpdCBmaW5kcyBtdWx0aXBsZSBpZGVudGljYWwgY29waWVzIG9mIHRoZSBzeW1ib2xzIGZyb20gYW4gaW5jbHVkZSBmaWxlLgotICAgVGhpcyBhcHBlYXJzIG9ubHkgaW4gb3V0cHV0IGZyb20gdGhlIFN1biBsaW5rZXIuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FWENMLCAweGMyLCAiRVhDTCIpCi0KLS8qIE1vZHVsYS0yIHNjb3BlIGluZm9ybWF0aW9uLiAgQ2FuIHNvbWVvbmUgc2F5IHdoYXQgaW5mbyBpdCBjb250YWlucz8gICovCi1fX2RlZmluZV9zdGFiIChOX1NDT1BFLCAweGM0LCAiU0NPUEUiKQotCi0vKiBFbmQgb2YgYSBsZXhpY2FsIGJsb2NrLiAgRGVzYyBtYXRjaGVzIHRoZSBOX0xCUkFDJ3MgZGVzYy4KLSAgIFRoZSB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSB0ZXh0IGZvciB0aGUgYmxvY2suCi0gICBPbiBTb2xhcmlzMiwgdGhlIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCi1fX2RlZmluZV9zdGFiIChOX1JCUkFDLCAweGUwLCAiUkJSQUMiKQotCi0vKiBCZWdpbiBuYW1lZCBjb21tb24gYmxvY2suICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fQkNPTU0sIDB4ZTIsICJCQ09NTSIpCi0KLS8qIEVuZCBuYW1lZCBjb21tb24gYmxvY2suICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50Ci0gICAoYW5kIGl0IHNob3VsZCBtYXRjaCB0aGUgTl9CQ09NTSkuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FQ09NTSwgMHhlNCwgIkVDT01NIikKLQotLyogTWVtYmVyIG9mIGEgY29tbW9uIGJsb2NrOyB2YWx1ZSBpcyBvZmZzZXQgd2l0aGluIHRoZSBjb21tb24gYmxvY2suCi0gICBUaGlzIHNob3VsZCBvY2N1ciB3aXRoaW4gYSBCQ09NTS9FQ09NTSBwYWlyLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fRUNPTUwsIDB4ZTgsICJFQ09NTCIpCi0KLS8qIFNvbGFyaXMyOiBQYXNjYWwgIndpdGgiIHN0YXRlbWVudDogdHlwZSwsMCwwLG9mZnNldCAqLwotX19kZWZpbmVfc3RhYiAoTl9XSVRILCAweGVhLCAiV0lUSCIpCi0KLS8qIFRoZXNlIFNUQUIncyBhcmUgdXNlZCBvbiBHb3VsZCBzeXN0ZW1zIGZvciBOb24tQmFzZSByZWdpc3RlciBzeW1ib2xzCi0gICBvciBzb21ldGhpbmcgbGlrZSB0aGF0LiAgRklYTUUuICBJIGhhdmUgYXNzaWduZWQgdGhlIHZhbHVlcyBhdCByYW5kb20KLSAgIHNpbmNlIEkgZG9uJ3QgaGF2ZSBhIEdvdWxkIGhlcmUuICBGaXh1cHMgZnJvbSBHb3VsZCBmb2xrIHdlbGNvbWUuLi4gKi8KLV9fZGVmaW5lX3N0YWIgKE5fTkJURVhULCAweEYwLCAiTkJURVhUIikKLV9fZGVmaW5lX3N0YWIgKE5fTkJEQVRBLCAweEYyLCAiTkJEQVRBIikKLV9fZGVmaW5lX3N0YWIgKE5fTkJCU1MsICAweEY0LCAiTkJCU1MiKQotX19kZWZpbmVfc3RhYiAoTl9OQlNUUywgIDB4RjYsICJOQlNUUyIpCi1fX2RlZmluZV9zdGFiIChOX05CTENTLCAgMHhGOCwgIk5CTENTIikKLQotLyogU2Vjb25kIHN5bWJvbCBlbnRyeSBjb250YWluaW5nIGEgbGVuZ3RoLXZhbHVlIGZvciB0aGUgcHJlY2VkaW5nIGVudHJ5LgotICAgVGhlIHZhbHVlIGlzIHRoZSBsZW5ndGguICAqLwotX19kZWZpbmVfc3RhYiAoTl9MRU5HLCAweGZlLCAiTEVORyIpCi0MCi0vKiBUaGUgYWJvdmUgaW5mb3JtYXRpb24sIGluIG1hdHJpeCBmb3JtYXQuCi0KLQkJCVNUQUIgTUFUUklYCi0JX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCXwgMDAgLSAxRiBhcmUgbm90IGRieCBzdGFiIHN5bWJvbHMJCXwKLQl8IEluIG1vc3QgY2FzZXMsIHRoZSBsb3cgYml0IGlzIHRoZSBFWFRlcm5hbCBiaXR8Ci0KLQl8IDAwIFVOREVGICB8IDAyIEFCUwl8IDA0IFRFWFQgICB8IDA2IERBVEEJfAotCXwgMDEgIHxFWFQgIHwgMDMgIHxFWFQJfCAwNSAgfEVYVCAgfCAwNyAgfEVYVAl8Ci0KLQl8IDA4IEJTUyAgICB8IDBBIElORFIJfCAwQyBGTl9TRVEgfCAwRSBXRUFLQQl8Ci0JfCAwOSAgfEVYVCAgfCAwQiAJfCAwRCBXRUFLVSAgfCAwRiBXRUFLVAl8Ci0KLQl8IDEwIFdFQUtEICB8IDEyIENPTU0JfCAxNCBTRVRBICAgfCAxNiBTRVRUCXwKLQl8IDExIFdFQUtCICB8IDEzCXwgMTUgCSAgICB8IDE3CXwKLQotCXwgMTggU0VURCAgIHwgMUEgU0VUQgl8IDFDIFNFVFYgICB8IDFFIFdBUk5JTkd8Ci0JfCAxOQkgICAgfCAxQgl8IDFEIAkgICAgfCAxRiBGTgl8Ci0KLQl8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0JfCBEZWJ1ZyBlbnRyaWVzIHdpdGggYml0IDAxIHNldCBhcmUgdW51c2VkLgl8Ci0JfCAyMCBHU1lNICAgfCAyMiBGTkFNRQl8IDI0IEZVTiAgICB8IDI2IFNUU1lNCXwKLQl8IDI4IExDU1lNICB8IDJBIE1BSU4JfCAyQyBST1NZTSAgfCAyRQl8Ci0JfCAzMCBQQwkgICAgfCAzMiBOU1lNUwl8IDM0IE5PTUFQICB8IDM2CXwKLQl8IDM4IE9CSiAgICB8IDNBCXwgM0MgT1BUICAgIHwgM0UJfAotCXwgNDAgUlNZTSAgIHwgNDIgTTJDCXwgNDQgU0xJTkUgIHwgNDYgRFNMSU5FIHwKLQl8IDQ4IEJTTElORSp8IDRBIERFRkQJfCA0QyBGTElORSAgfCA0RQl8Ci0JfCA1MCBFSERFQ0wqfCA1Mgl8IDU0IENBVENIICB8IDU2ICAgICAgICB8Ci0JfCA1OCAgICAgICAgfCA1QSAgICAgICAgfCA1QyAgICAgICAgfCA1RQl8Ci0JfCA2MCBTU1lNICAgfCA2MiBFTkRNCXwgNjQgU08JICAgIHwgNjYgCXwKLQl8IDY4IAkgICAgfCA2QQl8IDZDIEFMSUFTICB8IDZFCXwKLQl8IDcwCSAgICB8IDcyCXwgNzQJICAgIHwgNzYJfAotCXwgNzgJICAgIHwgN0EJfCA3QwkgICAgfCA3RQl8Ci0JfCA4MCBMU1lNICAgfCA4MiBCSU5DTAl8IDg0IFNPTCAgICB8IDg2CXwKLQl8IDg4CSAgICB8IDhBCXwgOEMJICAgIHwgOEUJfAotCXwgOTAJICAgIHwgOTIJfCA5NAkgICAgfCA5Ngl8Ci0JfCA5OAkgICAgfCA5QQl8IDlDCSAgICB8IDlFCXwKLQl8IEEwIFBTWU0gICB8IEEyIEVJTkNMCXwgQTQgRU5UUlkgIHwgQTYJfAotCXwgQTgJICAgIHwgQUEJfCBBQwkgICAgfCBBRQl8Ci0JfCBCMAkgICAgfCBCMgl8IEI0CSAgICB8IEI2CXwKLQl8IEI4CSAgICB8IEJBCXwgQkMJICAgIHwgQkUJfAotCXwgQzAgTEJSQUMgIHwgQzIgRVhDTAl8IEM0IFNDT1BFICB8IEM2CXwKLQl8IEM4CSAgICB8IENBCXwgQ0MJICAgIHwgQ0UJfAotCXwgRDAJICAgIHwgRDIJfCBENAkgICAgfCBENgl8Ci0JfCBEOAkgICAgfCBEQQl8IERDCSAgICB8IERFCXwKLQl8IEUwIFJCUkFDICB8IEUyIEJDT01NCXwgRTQgRUNPTU0gIHwgRTYJfAotCXwgRTggRUNPTUwgIHwgRUEgV0lUSAl8IEVDCSAgICB8IEVFCXwKLQl8IEYwCSAgICB8IEYyCXwgRjQJICAgIHwgRjYJfAotCXwgRjgJICAgIHwgRkEJfCBGQwkgICAgfCBGRSBMRU5HCXwKLQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiA1MCBFSERFQ0wgaXMgYWxzbyBNT0QyLgotICogNDggQlNMSU5FIGlzIGFsc28gQlJPV1MuCi0gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9zdGFiX2dudS5oIGIvaW5jbHVkZS9hb3V0L3N0YWJfZ251LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMThlMTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L3N0YWJfZ251LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jaWZuZGVmIF9fR05VX1NUQUJfXwotCi0vKiBJbmRpY2F0ZSB0aGUgR05VIHN0YWIuaCBpcyBpbiB1c2UuICAqLwotCi0jZGVmaW5lIF9fR05VX1NUQUJfXwotCi0jZGVmaW5lIF9fZGVmaW5lX3N0YWIoTkFNRSwgQ09ERSwgU1RSSU5HKSBOQU1FPUNPREUsCi0jZGVmaW5lIF9fZGVmaW5lX3N0YWJfZHVwbGljYXRlKE5BTUUsIENPREUsIFNUUklORykgTkFNRT1DT0RFLAotCi1lbnVtIF9fc3RhYl9kZWJ1Z19jb2RlCi17Ci0jaW5jbHVkZSAiYW91dC9zdGFiLmRlZiIKLUxBU1RfVU5VU0VEX1NUQUJfQ09ERQotfTsKLQotI3VuZGVmIF9fZGVmaW5lX3N0YWIKLQotLyogRGVmaW5pdGlvbnMgb2YgImRlc2MiIGZpZWxkIGZvciBOX1NPIHN0YWJzIGluIFNvbGFyaXMyLiAgKi8KLQotI2RlZmluZQlOX1NPX0FTCQkxCi0jZGVmaW5lCU5fU09fQwkJMgotI2RlZmluZQlOX1NPX0FOU0lfQwkzCi0jZGVmaW5lCU5fU09fQ0MJCTQJLyogQysrICovCi0jZGVmaW5lCU5fU09fRk9SVFJBTgk1Ci0jZGVmaW5lCU5fU09fUEFTQ0FMCTYKLQotLyogU29sYXJpczI6IEZsb2F0aW5nIHBvaW50IHR5cGUgdmFsdWVzIGluIGJhc2ljIHR5cGVzLiAgKi8KLQotI2RlZmluZQlORl9OT05FCQkwCi0jZGVmaW5lCU5GX1NJTkdMRQkxCS8qIElFRUUgMzItYml0ICovCi0jZGVmaW5lCU5GX0RPVUJMRQkyCS8qIElFRUUgNjQtYml0ICovCi0jZGVmaW5lCU5GX0NPTVBMRVgJMwkvKiBGb3J0cmFuIGNvbXBsZXggKi8KLSNkZWZpbmUJTkZfQ09NUExFWDE2CTQJLyogRm9ydHJhbiBkb3VibGUgY29tcGxleCAqLwotI2RlZmluZQlORl9DT01QTEVYMzIJNQkvKiBGb3J0cmFuIGNvbXBsZXgqMTYgKi8KLSNkZWZpbmUJTkZfTERPVUJMRQk2CS8qIExvbmcgZG91YmxlICh3aGF0ZXZlciB0aGF0IGlzKSAqLwotCi0jZW5kaWYgLyogX19HTlVfU1RBQl8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9zdW40LmggYi9pbmNsdWRlL2FvdXQvc3VuNC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDJhMGRkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9zdW40LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyogU1BBUkMtc3BlY2lmaWMgdmFsdWVzIGZvciBhLm91dCBmaWxlcyAqLwotCi0vKiBTb21lIHN5c3RlbXMsIGUuZy4sIEFJWCwgbWF5IGhhdmUgZGVmaW5lZCB0aGlzIGluIGhlYWRlciBmaWxlcyBhbHJlYWR5Ci0gICBpbmNsdWRlZC4gICovCi0jdW5kZWYgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFCTB4MjAwMAkJLyogOEsuICBha2EgTkJQRyBpbiA8c3lzL3BhcmFtLmg+ICovCi0vKiBOb3RlIHRoYXQgc29tZSBTUEFSQ3MgaGF2ZSA0SyBwYWdlcywgc29tZSA4Sywgc29tZSBvdGhlcnMuICAqLwotCi0jZGVmaW5lIFNFR19TSVpFX1NQQVJDCVRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUJU0VHX1NJWkVfU1VOMwkweDIwMDAwCQkvKiBSZXNvbHV0aW9uIG9mIHIvdyBwcm90ZWN0aW9uIGh3ICovCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCVRBUkdFVF9QQUdFX1NJWkUJLyogTG9jYXRpb24gMCBpcyBub3QgYWNjZXNzaWJsZSAqLwotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDEKLQotLyogTm9uLWRlZmF1bHQgZGVmaW5pdGlvbnMgb2YgdGhlIGFjY2Vzc29yIG1hY3Jvcy4uLiAqLwotCi0vKiBTZWdtZW50IHNpemUgdmFyaWVzIG9uIFN1bi0zIHZlcnN1cyBTdW4tNC4gICovCi0KLSNkZWZpbmUgTl9TRUdTSVpFKHgpCShOX01BQ0hUWVBFKHgpID09IE1fU1BBUkM/CVNFR19TSVpFX1NQQVJDOglcCi0JCQkgTl9NQUNIVFlQRSh4KSA9PSBNXzY4MDIwPwlTRUdfU0laRV9TVU4zOglcCi0JCQkvKiBHdWVzcz8gKi8JCQlUQVJHRVRfUEFHRV9TSVpFKQotCi0vKiBWaXJ0dWFsIEFkZHJlc3Mgb2YgdGV4dCBzZWdtZW50IGZyb20gdGhlIGEub3V0IGZpbGUuICBGb3IgT01BR0lDLAotICAgKGFsbW9zdCBhbHdheXMgInVubGlua2VkIC5vJ3MiIHRoZXNlIGRheXMpLCBzaG91bGQgYmUgemVyby4KLSAgIFN1biBhZGRlZCBhIGtsdWRnZSBzbyB0aGF0IHNoYXJlZCBsaWJyYXJpZXMgbGlua2VkIFpNQUdJQyBnZXQKLSAgIGFuIGFkZHJlc3Mgb2YgemVybyBpZiBhX2VudHJ5ICghISEpIGlzIGxvd2VyIHRoYW4gdGhlIG90aGVyd2lzZQotICAgZXhwZWN0ZWQgdGV4dCBhZGRyZXNzLiAgVGhlc2Uga2x1ZGdlcyBoYXZlIGdvdHRhIGdvIQotICAgRm9yIGxpbmtlZCBmaWxlcywgc2hvdWxkIHJlZmxlY3QgcmVhbGl0eSBpZiB3ZSBrbm93IGl0LiAgKi8KLQotLyogVGhpcyBkaWZmZXJzIGZyb20gdGhlIHZlcnNpb24gaW4gYW91dDY0LmggKHdoaWNoIHdlIG92ZXJyaWRlIGJ5IGRlZmluaW5nCi0gICBpdCBoZXJlKSBvbmx5IGZvciBOTUFHSUMgKHdlIHJldHVybiBURVhUX1NUQVJUX0FERFIrRVhFQ19CWVRFU19TSVpFOwotICAgdGhleSByZXR1cm4gMCkuICAqLwotCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0gICAgKE5fTUFHSUMoeCk9PU9NQUdJQz8gMCBcCi0gICAgIDogKE5fTUFHSUMoeCkgPT0gWk1BR0lDICYmICh4KS5hX2VudHJ5IDwgVEVYVF9TVEFSVF9BRERSKT8gMCBcCi0gICAgIDogVEVYVF9TVEFSVF9BRERSK0VYRUNfQllURVNfU0laRSkKLQotLyogV2hlbiBhIGZpbGUgaXMgbGlua2VkIGFnYWluc3QgYSBzaGFyZWQgbGlicmFyeSBvbiBTdW5PUyA0LCB0aGUKLSAgIGR5bmFtaWMgYml0IGluIHRoZSBleGVjIGhlYWRlciBpcyBzZXQsIGFuZCB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoZQotICAgc3ltYm9sIHRhYmxlIGlzIF9fRFlOQU1JQy4gIEl0cyB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljCi17Ci0gIC8qIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgc3RydWN0dXJlLiAgU3VuT1MgNC4xLnggY3JlYXRlcyBmaWxlcwotICAgICB3aXRoIHZlcnNpb24gbnVtYmVyIDMsIHdoaWNoIGlzIHdoYXQgdGhpcyBzdHJ1Y3R1cmUgaXMgYmFzZWQgb24uCi0gICAgIEFjY29yZGluZyB0byBnZGIsIHZlcnNpb24gMiBpcyBzaW1pbGFyLiAgSSBiZWxpZXZlIHRoYXQgdmVyc2lvbiAyCi0gICAgIHVzZWQgYSBkaWZmZXJlbnQgdHlwZSBvZiBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgYW5kIHRoZXJlIG1heQotICAgICBoYXZlIGJlZW4gb3RoZXIgZGlmZmVyZW5jZXMuICAqLwotICBiZmRfYnl0ZSBsZF92ZXJzaW9uWzRdOwotICAvKiBUaGUgdmlydHVhbCBhZGRyZXNzIG9mIGEgMjggYnl0ZSBzdHJ1Y3R1cmUgdXNlZCBpbiBkZWJ1Z2dpbmcuCi0gICAgIFRoZSBjb250ZW50cyBhcmUgZmlsbGVkIGluIGF0IHJ1biB0aW1lIGJ5IGxkLnNvLiAgKi8KLSAgYmZkX2J5dGUgbGRkWzRdOwotICAvKiBUaGUgdmlydHVhbCBhZGRyZXNzIG9mIGFub3RoZXIgc3RydWN0dXJlIHdpdGggaW5mb3JtYXRpb24gYWJvdXQKLSAgICAgaG93IHRvIHJlbG9jYXRlIHRoZSBleGVjdXRhYmxlIGF0IHJ1biB0aW1lLiAgKi8KLSAgYmZkX2J5dGUgbGRbNF07Ci19OwotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgZGVidWdnaW5nIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IHRoZSBkZWJ1Z2dlcgotICAgZmllbGQgb2YgX19EWU5BTUlDLiAgKi8KLSNkZWZpbmUgRVhURVJOQUxfU1VONF9EWU5BTUlDX0RFQlVHR0VSX1NJWkUgKDI0KQotCi0vKiBUaGUgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgdGhlIGxpbmtlciBmaWVsZCBvZiBfX0RZTkFNSUMuICBBcyBmYXIKLSAgIGFzIEkgY2FuIHRlbGwsIG1vc3Qgb2YgdGhlIGFkZHJlc3NlcyBpbiB0aGlzIHN0cnVjdHVyZSBhcmUgb2Zmc2V0cwotICAgd2l0aGluIHRoZSBmaWxlLCBidXQgc29tZSBhcmUgYWN0dWFsbHkgdmlydHVhbCBhZGRyZXNzZXMuICAqLwotCi1zdHJ1Y3QgaW50ZXJuYWxfc3VuNF9keW5hbWljX2xpbmsKLXsKLSAgLyogTGlua2VkIGxpc3Qgb2YgbG9hZGVkIG9iamVjdHMuICBUaGlzIGlzIGZpbGxlZCBpbiBhdCBydW50aW1lIGJ5Ci0gICAgIGxkLnNvIGFuZCBwcm9iYWJseSBieSBkbG9wZW4uICAqLwotICB1bnNpZ25lZCBsb25nIGxkX2xvYWRlZDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgbGlzdCBvZiBuYW1lcyBvZiBzaGFyZWQgb2JqZWN0cyB3aGljaCBtdXN0IGJlCi0gICAgIGluY2x1ZGVkIGF0IHJ1bnRpbWUuICBFYWNoIGVudHJ5IGluIHRoZSBsaXN0IGlzIDE2IGJ5dGVzOiB0aGUgNAotICAgICBieXRlIGFkZHJlc3Mgb2YgdGhlIHN0cmluZyBuYW1pbmcgdGhlIG9iamVjdCAoZS5nLiwgZm9yIC1sYyB0aGlzCi0gICAgIGlzICJjIik7IDQgYnl0ZXMgb2YgZmxhZ3MtLXRoZSBoaWdoIGJpdCBpcyB3aGV0aGVyIHRvIHNlYXJjaCBmb3IKLSAgICAgdGhlIG9iamVjdCB1c2luZyB0aGUgbGlicmFyeSBwYXRoOyB0aGUgMiBieXRlIG1ham9yIHZlcnNpb24KLSAgICAgbnVtYmVyOyB0aGUgMiBieXRlIG1pbm9yIHZlcnNpb24gbnVtYmVyOyB0aGUgNCBieXRlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIG5leHQgZW50cnkgaW4gdGhlIGxpc3QgKHplcm8gaWYgdGhpcyBpcyB0aGUgbGFzdCBlbnRyeSkuICBUaGUKLSAgICAgdmVyc2lvbiBudW1iZXJzIHNlZW0gdG8gb25seSBiZSBub24temVybyB3aGVuIGRvaW5nIGxpYnJhcnkKLSAgICAgc2VhcmNoaW5nLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9uZWVkOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBwYXRoIHRvIHNlYXJjaCBmb3IgdGhlIHNoYXJlZCBvYmplY3RzIHdoaWNoCi0gICAgIG11c3QgYmUgaW5jbHVkZWQuICBUaGlzIHBvaW50cyB0byBhIHN0cmluZyBpbiBQQVRIIGZvcm1hdCB3aGljaAotICAgICBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgLUwgYXJndW1lbnRzIHRvIHRoZSBsaW5rZXIuICBBY2NvcmRpbmcgdG8KLSAgICAgdGhlIG1hbiBwYWdlLCBsZC5zbyBpbXBsaWNpdGx5IGFkZHMgJHtMRF9MSUJSQVJZX1BBVEh9IHRvIHRoZQotICAgICBiZWdpbm5pbmcgb2YgdGhpcyBzdHJpbmcgYW5kIC9saWI6L3Vzci9saWI6L3Vzci9sb2NhbC9saWIgdG8gdGhlCi0gICAgIGVuZC4gIFRoZSBzdHJpbmcgaXMgdGVybWluYXRlZCBieSBhIG51bGwgYnl0ZS4gIFRoaXMgZmllbGQgaXMKLSAgICAgemVybyBpZiB0aGVyZSBpcyBubyBhZGRpdGlvbmFsIHBhdGguICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3J1bGVzOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgVGhpcyBhcHBlYXJzIHRvIGJlIGEKLSAgICAgdmlydHVhbCBhZGRyZXNzLCBub3QgYSBmaWxlIG9mZnNldC4gIFRoZSBmaXJzdCBlbnRyeSBpbiB0aGUKLSAgICAgZ2xvYmFsIG9mZnNldCB0YWJsZSBzZWVtcyB0byBiZSB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZQotICAgICBzdW40X2R5bmFtaWMgc3RydWN0dXJlICh0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgX19EWU5BTUlDIHN5bWJvbCkuCi0gICAgIFRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGlzIHVzZWQgZm9yIFBJQyBjb2RlIHRvIGhvbGQgdGhlCi0gICAgIGFkZHJlc3NlcyBvZiB2YXJpYWJsZXMuICBBIGR5bmFtaWNhbGx5IGxpbmtlZCBmaWxlIHdoaWNoIGRvZXMgbm90Ci0gICAgIGl0c2VsZiBjb250YWluIFBJQyBjb2RlIGhhcyBhIGZvdXIgYnl0ZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9nb3Q7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgVGhpcyBhcHBlYXJzIHRvIGJlIGEKLSAgICAgdmlydHVhbCBhZGRyZXNzLCBub3QgYSBmaWxlIG9mZnNldC4KLQotICAgICBPbiBhIFNQQVJDLCB0aGUgdGFibGUgaXMgY29tcG9zZWQgb2YgMTIgYnl0ZSBlbnRyaWVzLCBlYWNoIG9mCi0gICAgIHdoaWNoIGNvbnNpc3RzIG9mIHRocmVlIGluc3RydWN0aW9ucy4gIFRoZSBmaXJzdCBlbnRyeSBpcwotICAgICAgICAgc2V0aGkgJWhpKDApLCVnMQotCSBqbXAgJWcxCi0JIG5vcAotICAgICBUaGVzZSBpbnN0cnVjdGlvbnMgYXJlIGNoYW5nZWQgYnkgbGQuc28gaW50byBhIGp1bXAgZGlyZWN0bHkgaW50bwotICAgICBsZC5zbyBpdHNlbGYuICBFYWNoIHN1YnNlcXVlbnQgZW50cnkgaXMKLSAgICAgICAgIHNhdmUgJXNwLCAtOTYsICVzcAotCSBjYWxsIDxhZGRyZXNzIG9mIGZpcnN0IGVudHJ5IGluIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlPgotCSA8cmVsb2NfbnVtYmVyIHwgMHgwMTAwMDAwMD4KLSAgICAgVGhlIHJlbG9jX251bWJlciBpcyB0aGUgbnVtYmVyIG9mIHRoZSByZWxvYyB0byB1c2UgdG8gcmVzb2x2ZQotICAgICB0aGlzIGVudHJ5LiAgVGhlIHJlbG9jIHdpbGwgYmUgYSBKTVBfU0xPVCByZWxvYyBhZ2FpbnN0IHNvbWUKLSAgICAgc3ltYm9sIHRoYXQgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBvYmplY3QgZmlsZSBidXQgc2hvdWxkIGJlCi0gICAgIGRlZmluZWQgaW4gYSBzaGFyZWQgb2JqZWN0IChpZiBpdCBpcyBub3QsIGxkLnNvIHdpbGwgcmVwb3J0IGEKLSAgICAgcnVudGltZSBlcnJvciBhbmQgZXhpdCkuICBUaGUgY29uc3RhbnQgMHgwMTAwMDAwMDAgdHVybnMgdGhlCi0gICAgIHJlbG9jIG51bWJlciBpbnRvIGEgc2V0aGkgb2YgJWcwLCB3aGljaCBkb2VzIG5vdGhpbmcgc2luY2UgJWcwIGlzCi0gICAgIGhhcmR3aXJlZCB0byB6ZXJvLgotCi0gICAgIFdoZW4gb25lIG9mIHRoZXNlIGVudHJpZXMgaXMgZXhlY3V0ZWQsIGl0IHdpbmRzIHVwIGNhbGxpbmcgaW50bwotICAgICBsZC5zby4gIGxkLnNvIGxvb2tzIGF0IHRoZSByZWxvYyBudW1iZXIsIGF2YWlsYWJsZSB2aWEgdGhlIHJldHVybgotICAgICBhZGRyZXNzLCB0byBkZXRlcm1pbmUgd2hpY2ggZW50cnkgdGhpcyBpcy4gIEl0IHRoZW4gbG9va3MgYXQgdGhlCi0gICAgIHJlbG9jIGFuZCBwYXRjaGVzIHVwIHRoZSBlbnRyeSBpbiB0aGUgdGFibGUgaW50byBhIHNldGhpIGFuZCBqbXAKLSAgICAgdG8gdGhlIHJlYWwgYWRkcmVzcyBmb2xsb3dlZCBieSBhIG5vcC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgcmVsb2MKLSAgICAgbG9va3VwIG9ubHkgaGFzIHRvIGhhcHBlbiBvbmNlLCBhbmQgaXQgYWxzbyBtZWFucyB0aGF0IHRoZQotICAgICByZWxvY2F0aW9uIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBpZiB0aGUgZnVuY3Rpb24gaXMgYWN0dWFsbHkKLSAgICAgY2FsbGVkLiAgVGhlIHJlbG9jYXRpb24gaXMgZXhwZW5zaXZlIGJlY2F1c2UgbGQuc28gbXVzdCBsb29rIHVwCi0gICAgIHRoZSBzeW1ib2wgYnkgbmFtZS4KLQotICAgICBUaGUgc2l6ZSBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgaXMgZ2l2ZW4gYnkgdGhlIGxkX3BsdF9zegotICAgICBmaWVsZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfcGx0OwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY3MuICBUaGVzZSBhcmUgaW4gdGhlIHNhbWUgZm9ybWF0IGFzCi0gICAgIG9yZGluYXJ5IHJlbG9jcy4gIFN5bWJvbCBpbmRleCBudW1iZXJzIHJlZmVyIHRvIHRoZSBzeW1ib2xzCi0gICAgIHBvaW50ZWQgdG8gYnkgbGRfc3RhYi4gIEkgdGhpbmsgdGhlIG9ubHkgd2F5IHRvIGRldGVybWluZSB0aGUKLSAgICAgbnVtYmVyIG9mIHJlbG9jcyBpcyB0byBhc3N1bWUgdGhhdCBhbGwgdGhlIGJ5dGVzIGZyb20gbGRfcmVsIHRvCi0gICAgIGxkX2hhc2ggY29udGFpbiByZWxvYyBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9yZWw7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgYSBoYXNoIHRhYmxlIG9mIHN5bWJvbHMuICBUaGUgaGFzaCB0YWJsZSBoYXMKLSAgICAgcm91Z2hseSB0aGUgc2FtZSBudW1iZXIgb2YgZW50cmllcyBhcyB0aGVyZSBhcmUgZHluYW1pYyBzeW1ib2xzOwotICAgICBJIHRoaW5rIHRoZSBvbmx5IHdheSB0byBnZXQgdGhlIGV4YWN0IHNpemUgaXMgdG8gYXNzdW1lIHRoYXQKLSAgICAgZXZlcnkgYnl0ZSBmcm9tIGxkX2hhc2ggdG8gbGRfc3RhYiBpcyBkZXZvdGVkIHRvIHRoZSBoYXNoIHRhYmxlLgotCi0gICAgIEVhY2ggZW50cnkgaW4gdGhlIGhhc2ggdGFibGUgaXMgZWlnaHQgYnl0ZXMuICBUaGUgZmlyc3QgZm91cgotICAgICBieXRlcyBhcmUgYSBzeW1ib2wgaW5kZXggaW50byB0aGUgZHluYW1pYyBzeW1ib2xzLiAgVGhlIHNlY29uZAotICAgICBmb3VyIGJ5dGVzIGFyZSB0aGUgaW5kZXggb2YgdGhlIG5leHQgaGFzaCB0YWJsZSBlbnRyeSBpbiB0aGUKLSAgICAgYnVja2V0LiAgVGhlIGxkX2J1Y2tldHMgZmllbGQgZ2l2ZXMgdGhlIG51bWJlciBvZiBidWNrZXRzLCBzYXkgQi4KLSAgICAgVGhlIGZpcnN0IEIgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSBlYWNoIHN0YXJ0IGEgYnVja2V0IHdoaWNoCi0gICAgIGlzIGNoYWluZWQgdGhyb3VnaCB0aGUgc2Vjb25kIGZvdXIgYnl0ZXMgb2YgZWFjaCBlbnRyeS4gIEEgdmFsdWUKLSAgICAgb2YgemVybyBlbmRzIHRoZSBjaGFpbi4KLQotICAgICBUaGUgaGFzaCBmdW5jdGlvbiBpcyBzaW1wbHkKLSAgICAgICAgIGggPSAwOwotICAgICAgICAgd2hpbGUgKCpzdHJpbmcgIT0gJ1wwJykKLQkgICBoID0gKGggPDwgMSkgKyAqc3RyaW5nKys7Ci0JIGggJj0gMHg3ZmZmZmZmZjsKLQotICAgICBUbyBsb29rIHVwIGEgc3ltYm9sLCBjb21wdXRlIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBuYW1lLiAgVGFrZQotICAgICB0aGUgbW9kdWxvcyBvZiBoYXNoIHZhbHVlIGFuZCB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMuICBTdGFydCBhdAotICAgICB0aGF0IGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLiAgU2VlIGlmIHRoZSBzeW1ib2wgKGZyb20gdGhlIGZpcnN0Ci0gICAgIGZvdXIgYnl0ZXMgb2YgdGhlIGhhc2ggdGFibGUgZW50cnkpIGhhcyB0aGUgbmFtZSB5b3UgYXJlIGxvb2tpbmcKLSAgICAgZm9yLiAgSWYgbm90LCB1c2UgdGhlIGNoYWluIGZpZWxkICh0aGUgc2Vjb25kIGZvdXIgYnl0ZXMgb2YgdGhlCi0gICAgIGhhc2ggdGFibGUgZW50cnkpIHRvIG1vdmUgb24gdG8gdGhlIG5leHQgZW50cnkgaW4gdGhpcyBidWNrZXQuCi0gICAgIElmIHRoZSBjaGFpbiBmaWVsZCBpcyB6ZXJvIHlvdSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUKLSAgICAgYnVja2V0LCBhbmQgdGhlIHN5bWJvbCBpcyBub3QgaW4gdGhlIGhhc2ggdGFibGUuICAqLyAKLSAgdW5zaWduZWQgbG9uZyBsZF9oYXNoOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgdGFibGUuICBUaGlzIGlzIGEgbGlzdCBvZgotICAgICBleHRlcm5hbF9ubGlzdCBzdHJ1Y3R1cmVzLiAgVGhlIHN0cmluZyBpbmRpY2VzIGFyZSByZWxhdGl2ZSB0bwotICAgICB0aGUgbGRfc3ltYm9scyBmaWVsZC4gIEkgdGhpbmsgdGhlIG9ubHkgd2F5IHRvIGRldGVybWluZSB0aGUKLSAgICAgbnVtYmVyIG9mIHN5bWJvbHMgaXMgdG8gYXNzdW1lIHRoYXQgYWxsIHRoZSBieXRlcyBiZXR3ZWVuIGxkX3N0YWIKLSAgICAgYW5kIGxkX3N5bWJvbHMgYXJlIGV4dGVybmFsX25saXN0IHN0cnVjdHVyZXMuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3N0YWI7Ci0KLSAgLyogSSBkb24ndCBrbm93IHdoYXQgdGhpcyBpcyBmb3IuICBJdCBzZWVtcyB0byBhbHdheXMgYmUgemVyby4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfc3RhYl9oYXNoOwotCi0gIC8qIFRoZSBudW1iZXIgb2YgYnVja2V0cyBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfYnVja2V0czsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIHN0cmluZyB0YWJsZS4gIFRoZSBmaXJzdCBzdHJpbmcgaW4gdGhpcwotICAgICBzdHJpbmcgdGFibGUgbmVlZCBub3QgYmUgdGhlIGVtcHR5IHN0cmluZy4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfc3ltYm9sczsKLQotICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3ltYm9sIHN0cmluZyB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfc3ltYl9zaXplOwotCi0gIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSB0ZXh0IHNlZ21lbnQuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3RleHQ7Ci0KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9wbHRfc3o7Ci19OwotCi0vKiBUaGUgZXh0ZXJuYWwgZm9ybSBvZiB0aGUgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGV4dGVybmFsX3N1bjRfZHluYW1pY19saW5rCi17Ci0gIGJmZF9ieXRlIGxkX2xvYWRlZFs0XTsKLSAgYmZkX2J5dGUgbGRfbmVlZFs0XTsKLSAgYmZkX2J5dGUgbGRfcnVsZXNbNF07Ci0gIGJmZF9ieXRlIGxkX2dvdFs0XTsKLSAgYmZkX2J5dGUgbGRfcGx0WzRdOwotICBiZmRfYnl0ZSBsZF9yZWxbNF07Ci0gIGJmZF9ieXRlIGxkX2hhc2hbNF07Ci0gIGJmZF9ieXRlIGxkX3N0YWJbNF07Ci0gIGJmZF9ieXRlIGxkX3N0YWJfaGFzaFs0XTsKLSAgYmZkX2J5dGUgbGRfYnVja2V0c1s0XTsKLSAgYmZkX2J5dGUgbGRfc3ltYm9sc1s0XTsKLSAgYmZkX2J5dGUgbGRfc3ltYl9zaXplWzRdOwotICBiZmRfYnl0ZSBsZF90ZXh0WzRdOwotICBiZmRfYnl0ZSBsZF9wbHRfc3pbNF07Ci19OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iZmRsaW5rLmggYi9pbmNsdWRlL2JmZGxpbmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1NWZhMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2JmZGxpbmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyMCArMCwwIEBACi0vKiBiZmRsaW5rLmggLS0gaGVhZGVyIGZpbGUgZm9yIEJGRCBsaW5rIHJvdXRpbmVzCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIGFuZCBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEJGRExJTktfSAotI2RlZmluZSBCRkRMSU5LX0gKLQotLyogV2hpY2ggc3ltYm9scyB0byBzdHJpcCBkdXJpbmcgYSBsaW5rLiAgKi8KLWVudW0gYmZkX2xpbmtfc3RyaXAKLXsKLSAgc3RyaXBfbm9uZSwJCS8qIERvbid0IHN0cmlwIGFueSBzeW1ib2xzLiAgKi8KLSAgc3RyaXBfZGVidWdnZXIsCS8qIFN0cmlwIGRlYnVnZ2luZyBzeW1ib2xzLiAgKi8KLSAgc3RyaXBfc29tZSwJCS8qIGtlZXBfaGFzaCBpcyB0aGUgbGlzdCBvZiBzeW1ib2xzIHRvIGtlZXAuICAqLwotICBzdHJpcF9hbGwJCS8qIFN0cmlwIGFsbCBzeW1ib2xzLiAgKi8KLX07Ci0KLS8qIFdoaWNoIGxvY2FsIHN5bWJvbHMgdG8gZGlzY2FyZCBkdXJpbmcgYSBsaW5rLiAgVGhpcyBpcyBpcnJlbGV2YW50Ci0gICBpZiBzdHJpcF9hbGwgaXMgdXNlZC4gICovCi1lbnVtIGJmZF9saW5rX2Rpc2NhcmQKLXsKLSAgZGlzY2FyZF9ub25lLAkJLyogRG9uJ3QgZGlzY2FyZCBhbnkgbG9jYWxzLiAgKi8KLSAgZGlzY2FyZF9sLAkJLyogRGlzY2FyZCBsb2NhbCB0ZW1wb3Jhcnkgc3ltYm9scy4gICovCi0gIGRpc2NhcmRfYWxsCQkvKiBEaXNjYXJkIGFsbCBsb2NhbHMuICAqLwotfTsKLQwKLS8qIFRoZXNlIGFyZSB0aGUgcG9zc2libGUgdHlwZXMgb2YgYW4gZW50cnkgaW4gdGhlIEJGRCBsaW5rIGhhc2gKLSAgIHRhYmxlLiAgKi8KLQotZW51bSBiZmRfbGlua19oYXNoX3R5cGUKLXsKLSAgYmZkX2xpbmtfaGFzaF9uZXcsCQkvKiBTeW1ib2wgaXMgbmV3LiAgKi8KLSAgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQsCS8qIFN5bWJvbCBzZWVuIGJlZm9yZSwgYnV0IHVuZGVmaW5lZC4gICovCi0gIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrLAkvKiBTeW1ib2wgaXMgd2VhayBhbmQgdW5kZWZpbmVkLiAgKi8KLSAgYmZkX2xpbmtfaGFzaF9kZWZpbmVkLAkvKiBTeW1ib2wgaXMgZGVmaW5lZC4gICovCi0gIGJmZF9saW5rX2hhc2hfZGVmd2VhaywJLyogU3ltYm9sIGlzIHdlYWsgYW5kIGRlZmluZWQuICAqLwotICBiZmRfbGlua19oYXNoX2NvbW1vbiwJCS8qIFN5bWJvbCBpcyBjb21tb24uICAqLwotICBiZmRfbGlua19oYXNoX2luZGlyZWN0LAkvKiBTeW1ib2wgaXMgYW4gaW5kaXJlY3QgbGluay4gICovCi0gIGJmZF9saW5rX2hhc2hfd2FybmluZwkJLyogTGlrZSBpbmRpcmVjdCwgYnV0IHdhcm4gaWYgcmVmZXJlbmNlZC4gICovCi19OwotCi0vKiBUaGUgbGlua2luZyByb3V0aW5lcyB1c2UgYSBoYXNoIHRhYmxlIHdoaWNoIHVzZXMgdGhpcyBzdHJ1Y3R1cmUgZm9yCi0gICBpdHMgZWxlbWVudHMuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeQotewotICAvKiBCYXNlIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIFR5cGUgb2YgdGhpcyBlbnRyeS4gICovCi0gIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlIHR5cGU7Ci0KLSAgLyogVW5kZWZpbmVkIGFuZCBjb21tb24gc3ltYm9scyBhcmUga2VwdCBpbiBhIGxpbmtlZCBsaXN0IHRocm91Z2gKLSAgICAgdGhpcyBmaWVsZC4gIFRoaXMgZmllbGQgaXMgbm90IGluIHRoZSB1bmlvbiBiZWNhdXNlIHRoYXQgd291bGQKLSAgICAgZm9yY2UgdXMgdG8gcmVtb3ZlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCB3aGVuIHdlIGNoYW5nZWQgdGhlaXIKLSAgICAgdHlwZSwgd2hpY2ggd291bGQgZm9yY2UgdGhlIGxpc3QgdG8gYmUgZG91Ymx5IGxpbmtlZCwgd2hpY2ggd291bGQKLSAgICAgd2FzdGUgbW9yZSBtZW1vcnkuICBXaGVuIGFuIHVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9sIGlzCi0gICAgIGNyZWF0ZWQsIGl0IHNob3VsZCBiZSBhZGRlZCB0byB0aGlzIGxpc3QsIHRoZSBoZWFkIG9mIHdoaWNoIGlzIGluCi0gICAgIHRoZSBsaW5rIGhhc2ggdGFibGUgaXRzZWxmLiAgQXMgc3ltYm9scyBhcmUgZGVmaW5lZCwgdGhleSBuZWVkCi0gICAgIG5vdCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3Q7IGFueXRoaW5nIHdoaWNoIHJlYWRzIHRoZSBsaXN0IG11c3QKLSAgICAgZG91YmxlY2hlY2sgdGhlIHN5bWJvbCB0eXBlLgotCi0gICAgIFdlYWsgc3ltYm9scyBhcmUgbm90IGtlcHQgb24gdGhpcyBsaXN0LgotCi0gICAgIERlZmluZWQgYW5kIGRlZndlYWsgc3ltYm9scyB1c2UgdGhpcyBmaWVsZCBhcyBhIHJlZmVyZW5jZSBtYXJrZXIuCi0gICAgIElmIHRoZSBmaWVsZCBpcyBub3QgTlVMTCwgb3IgdGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIHRhaWwgb2YgdGhlCi0gICAgIHVuZGVmaW5lZCBzeW1ib2wgbGlzdCwgdGhlIHN5bWJvbCBoYXMgYmVlbiByZWZlcmVuY2VkLiAgSWYgdGhlCi0gICAgIHN5bWJvbCBpcyB1bmRlZmluZWQgYW5kIGJlY29tZXMgZGVmaW5lZCwgdGhpcyBmaWVsZCB3aWxsCi0gICAgIGF1dG9tYXRpY2FsbHkgYmUgbm9uLU5VTEwgc2luY2UgdGhlIHN5bWJvbCB3aWxsIGhhdmUgYmVlbiBvbiB0aGUKLSAgICAgdW5kZWZpbmVkIHN5bWJvbCBsaXN0LiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKm5leHQ7Ci0gIC8qIEEgdW5pb24gb2YgaW5mb3JtYXRpb24gZGVwZW5kaW5nIHVwb24gdGhlIHR5cGUuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIE5vdGhpbmcgaXMga2VwdCBmb3IgYmZkX2hhc2hfbmV3LiAgKi8KLSAgICAgIC8qIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkLCBiZmRfbGlua19oYXNoX3VuZGVmd2Vhay4gICovCi0gICAgICBzdHJ1Y3QKLQl7Ci0JICBiZmQgKmFiZmQ7CQkvKiBCRkQgc3ltYm9sIHdhcyBmb3VuZCBpbi4gICovCi0JfSB1bmRlZjsKLSAgICAgIC8qIGJmZF9saW5rX2hhc2hfZGVmaW5lZCwgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLiAgKi8KLSAgICAgIHN0cnVjdAotCXsKLQkgIGJmZF92bWEgdmFsdWU7CS8qIFN5bWJvbCB2YWx1ZS4gICovCi0JICBhc2VjdGlvbiAqc2VjdGlvbjsJLyogU3ltYm9sIHNlY3Rpb24uICAqLwotCX0gZGVmOwotICAgICAgLyogYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCwgYmZkX2xpbmtfaGFzaF93YXJuaW5nLiAgKi8KLSAgICAgIHN0cnVjdAotCXsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpsaW5rOwkvKiBSZWFsIHN5bWJvbC4gICovCi0JICBjb25zdCBjaGFyICp3YXJuaW5nOwkvKiBXYXJuaW5nIChiZmRfbGlua19oYXNoX3dhcm5pbmcgb25seSkuICAqLwotCX0gaTsKLSAgICAgIC8qIGJmZF9saW5rX2hhc2hfY29tbW9uLiAgKi8KLSAgICAgIHN0cnVjdAotCXsKLQkgIC8qIFRoZSBsaW5rZXIgbmVlZHMgdG8ga25vdyB0aHJlZSB0aGluZ3MgYWJvdXQgY29tbW9uCi0gICAgICAgICAgICAgc3ltYm9sczogdGhlIHNpemUsIHRoZSBhbGlnbm1lbnQsIGFuZCB0aGUgc2VjdGlvbiBpbgotICAgICAgICAgICAgIHdoaWNoIHRoZSBzeW1ib2wgc2hvdWxkIGJlIHBsYWNlZC4gIFdlIHN0b3JlIHRoZSBzaXplCi0gICAgICAgICAgICAgaGVyZSwgYW5kIHdlIGFsbG9jYXRlIGEgc21hbGwgc3RydWN0dXJlIHRvIGhvbGQgdGhlCi0gICAgICAgICAgICAgc2VjdGlvbiBhbmQgdGhlIGFsaWdubWVudC4gIFRoZSBhbGlnbm1lbnQgaXMgc3RvcmVkIGFzIGEKLSAgICAgICAgICAgICBwb3dlciBvZiB0d28uICBXZSBkb24ndCBzdG9yZSBhbGwgdGhlIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgZGlyZWN0bHkgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGluY3JlYXNlIHRoZSBzaXplIG9mCi0gICAgICAgICAgICAgdGhlIHVuaW9uOyB0aGlzIHN0cnVjdHVyZSBpcyBhIG1ham9yIHNwYWNlIHVzZXIgaW4gdGhlCi0gICAgICAgICAgICAgbGlua2VyLiAgKi8KLQkgIGJmZF9zaXplX3R5cGUgc2l6ZTsJLyogQ29tbW9uIHN5bWJvbCBzaXplLiAgKi8KLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsJLyogQWxpZ25tZW50LiAgKi8KLQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbjsJCS8qIFN5bWJvbCBzZWN0aW9uLiAgKi8KLQkgICAgfSAqcDsKLQl9IGM7Ci0gICAgfSB1OwotfTsKLQotLyogVGhpcyBpcyB0aGUgbGluayBoYXNoIHRhYmxlLiAgSXQgaXMgYSBkZXJpdmVkIGNsYXNzIG9mCi0gICBiZmRfaGFzaF90YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBoYXNoIHRhYmxlIGl0c2VsZi4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSB0YWJsZTsKLSAgLyogVGhlIGJhY2sgZW5kIHdoaWNoIGNyZWF0ZWQgdGhpcyBoYXNoIHRhYmxlLiAgVGhpcyBpbmRpY2F0ZXMgdGhlCi0gICAgIHR5cGUgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUsIHdoaWNoIGlzIHNvbWV0aW1lcwotICAgICBpbXBvcnRhbnQgaW5mb3JtYXRpb24gd2hlbiBsaW5raW5nIG9iamVjdCBmaWxlcyBvZiBkaWZmZXJlbnQKLSAgICAgdHlwZXMgdG9nZXRoZXIuICAqLwotICBjb25zdCBiZmRfdGFyZ2V0ICpjcmVhdG9yOwotICAvKiBBIGxpbmtlZCBsaXN0IG9mIHVuZGVmaW5lZCBhbmQgY29tbW9uIHN5bWJvbHMsIGxpbmtlZCB0aHJvdWdoIHRoZQotICAgICBuZXh0IGZpZWxkIGluIHRoZSBiZmRfbGlua19oYXNoX2VudHJ5IHN0cnVjdHVyZS4gICovCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICp1bmRlZnM7Ci0gIC8qIEVudHJpZXMgYXJlIGFkZGVkIHRvIHRoZSB0YWlsIG9mIHRoZSB1bmRlZnMgbGlzdC4gICovCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICp1bmRlZnNfdGFpbDsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBsaW5rIGhhc2ggdGFibGUuICBJZiBGT0xMT1cgaXMgdHJ1ZSwgdGhpcwotICAgZm9sbG93cyBiZmRfbGlua19oYXNoX2luZGlyZWN0IGFuZCBiZmRfbGlua19oYXNoX3dhcm5pbmcgbGlua3MgdG8KLSAgIHRoZSByZWFsIHN5bWJvbC4gICovCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmJmZF9saW5rX2hhc2hfbG9va3VwCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjcmVhdGUsCi0JICAgYm9vbGVhbiBjb3B5LCBib29sZWFuIGZvbGxvdykpOwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIHRoZSBtYWluIGxpbmtlciBoYXNoIHRhYmxlIGlmIHRoZSBzeW1ib2wgbWlnaHQKLSAgIGJlIHdyYXBwZWQuICBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHJlZmVyZW5jZXMgdG8gYW4KLSAgIHVuZGVmaW5lZCBzeW1ib2wsIG5vdCBmb3IgZGVmaW5pdGlvbnMgb2YgYSBzeW1ib2wuICAqLwotCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwKLQkgICBib29sZWFuKSk7Ci0KLS8qIFRyYXZlcnNlIGEgbGluayBoYXNoIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9saW5rX2hhc2hfdHJhdmVyc2UKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiwKLQkgICBib29sZWFuICgqKSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSwKLQkgICBQVFIpKTsKLQotLyogQWRkIGFuIGVudHJ5IHRvIHRoZSB1bmRlZnMgbGlzdC4gICovCi1leHRlcm4gdm9pZCBiZmRfbGlua19hZGRfdW5kZWYKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikpOwotDAotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gY29tbXVuaWNhdGUKLSAgIGJldHdlZW4gQkZEIGFuZCB0aGUgbGlua2VyIHdoZW4gZG9pbmcgYSBsaW5rLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2luZm8KLXsKLSAgLyogRnVuY3Rpb24gY2FsbGJhY2tzLiAgKi8KLSAgY29uc3Qgc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcyAqY2FsbGJhY2tzOwotICAvKiB0cnVlIGlmIEJGRCBzaG91bGQgZ2VuZXJhdGUgYSByZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGUuICAqLwotICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgLyogdHJ1ZSBpZiBCRkQgc2hvdWxkIGdlbmVyYXRlIGEgInRhc2sgbGlua2VkIiBvYmplY3QgZmlsZSwKLSAgICAgc2ltaWxhciB0byByZWxvY2F0YWJsZSBidXQgYWxzbyB3aXRoIGdsb2JhbHMgY29udmVydGVkIHRvIHN0YXRpY3MuICovCi0gIGJvb2xlYW4gdGFza19saW5rOwotICAvKiB0cnVlIGlmIEJGRCBzaG91bGQgZ2VuZXJhdGUgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgYm9vbGVhbiBzaGFyZWQ7Ci0gIC8qIHRydWUgaWYgQkZEIHNob3VsZCBwcmUtYmluZCBzeW1ib2xzIGluIGEgc2hhcmVkIG9iamVjdC4gICovCi0gIGJvb2xlYW4gc3ltYm9saWM7Ci0gIC8qIHRydWUgaWYgc2hhcmVkIG9iamVjdHMgc2hvdWxkIGJlIGxpbmtlZCBkaXJlY3RseSwgbm90IHNoYXJlZC4gICovCi0gIGJvb2xlYW4gc3RhdGljX2xpbms7Ci0gIC8qIHRydWUgaWYgdGhlIG91dHB1dCBmaWxlIHNob3VsZCBiZSBpbiBhIHRyYWRpdGlvbmFsIGZvcm1hdC4gIFRoaXMKLSAgICAgaXMgZXF1aXZhbGVudCB0byB0aGUgc2V0dGluZyBvZiB0aGUgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCBmbGFnCi0gICAgIG9uIHRoZSBvdXRwdXQgZmlsZSwgYnV0IG1heSBiZSBjaGVja2VkIHdoZW4gcmVhZGluZyB0aGUgaW5wdXQKLSAgICAgZmlsZXMuICAqLwotICBib29sZWFuIHRyYWRpdGlvbmFsX2Zvcm1hdDsKLSAgLyogdHJ1ZSBpZiB3ZSB3YW50IHRvIHByb2R1Y2VkIG9wdGltaXplZCBvdXRwdXQgZmlsZXMuICBUaGlzIG1pZ2h0Ci0gICAgIG5lZWQgbXVjaCBtb3JlIHRpbWUgYW5kIHRoZXJlZm9yZSBtdXN0IGJlIGV4cGxpY2l0bHkgc2VsZWN0ZWQuICAqLwotICBib29sZWFuIG9wdGltaXplOwotICAvKiB0cnVlIGlmIEJGRCBzaG91bGQgZ2VuZXJhdGUgZXJyb3JzIGZvciB1bmRlZmluZWQgc3ltYm9scwotICAgICBldmVuIGlmIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgYm9vbGVhbiBub191bmRlZmluZWQ7Ci0gIC8qIFdoaWNoIHN5bWJvbHMgdG8gc3RyaXAuICAqLwotICBlbnVtIGJmZF9saW5rX3N0cmlwIHN0cmlwOwotICAvKiBXaGljaCBsb2NhbCBzeW1ib2xzIHRvIGRpc2NhcmQuICAqLwotICBlbnVtIGJmZF9saW5rX2Rpc2NhcmQgZGlzY2FyZDsKLSAgLyogdHJ1ZSBpZiBzeW1ib2xzIHNob3VsZCBiZSByZXRhaW5lZCBpbiBtZW1vcnksIGZhbHNlIGlmIHRoZXkKLSAgICAgc2hvdWxkIGJlIGZyZWVkIGFuZCByZXJlYWQuICAqLwotICBib29sZWFuIGtlZXBfbWVtb3J5OwotICAvKiBUaGUgbGlzdCBvZiBpbnB1dCBCRkQncyBpbnZvbHZlZCBpbiB0aGUgbGluay4gIFRoZXNlIGFyZSBjaGFpbmVkCi0gICAgIHRvZ2V0aGVyIHZpYSB0aGUgbGlua19uZXh0IGZpZWxkLiAgKi8KLSAgYmZkICppbnB1dF9iZmRzOwotICAvKiBJZiBhIHN5bWJvbCBzaG91bGQgYmUgY3JlYXRlZCBmb3IgZWFjaCBpbnB1dCBCRkQsIHRoaXMgaXMgc2VjdGlvbgotICAgICB3aGVyZSB0aG9zZSBzeW1ib2xzIHNob3VsZCBiZSBwbGFjZWQuICBJdCBtdXN0IGJlIGEgc2VjdGlvbiBpbgotICAgICB0aGUgb3V0cHV0IEJGRC4gIEl0IG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIG5vIHN1Y2ggc3ltYm9scwotICAgICB3aWxsIGJlIGNyZWF0ZWQuICBUaGlzIGlzIHRvIHN1cHBvcnQgQ1JFQVRFX09CSkVDVF9TWU1CT0xTIGluIHRoZQotICAgICBsaW5rZXIgY29tbWFuZCBsYW5ndWFnZS4gICovCi0gIGFzZWN0aW9uICpjcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbjsKLSAgLyogSGFzaCB0YWJsZSBoYW5kbGVkIGJ5IEJGRC4gICovCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpoYXNoOwotICAvKiBIYXNoIHRhYmxlIG9mIHN5bWJvbHMgdG8ga2VlcC4gIFRoaXMgaXMgTlVMTCB1bmxlc3Mgc3RyaXAgaXMKLSAgICAgc3RyaXBfc29tZS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqa2VlcF9oYXNoOwotICAvKiB0cnVlIGlmIGV2ZXJ5IHN5bWJvbCBzaG91bGQgYmUgcmVwb3J0ZWQgYmFjayB2aWEgdGhlIG5vdGljZQotICAgICBjYWxsYmFjay4gICovCi0gIGJvb2xlYW4gbm90aWNlX2FsbDsKLSAgLyogSGFzaCB0YWJsZSBvZiBzeW1ib2xzIHRvIHJlcG9ydCBiYWNrIHZpYSB0aGUgbm90aWNlIGNhbGxiYWNrLiAgSWYKLSAgICAgdGhpcyBpcyBOVUxMLCBhbmQgbm90aWNlX2FsbCBpcyBmYWxzZSwgdGhlbiBubyBzeW1ib2xzIGFyZQotICAgICByZXBvcnRlZCBiYWNrLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICpub3RpY2VfaGFzaDsKLSAgLyogSGFzaCB0YWJsZSBvZiBzeW1ib2xzIHdoaWNoIGFyZSBiZWluZyB3cmFwcGVkICh0aGUgLS13cmFwIGxpbmtlcgotICAgICBvcHRpb24pLiAgSWYgdGhpcyBpcyBOVUxMLCBubyBzeW1ib2xzIGFyZSBiZWluZyB3cmFwcGVkLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp3cmFwX2hhc2g7Ci0gIC8qIElmIGEgYmFzZSBvdXRwdXQgZmlsZSBpcyB3YW50ZWQsIHRoZW4gdGhpcyBwb2ludHMgdG8gaXQgKi8KLSAgUFRSIGJhc2VfZmlsZTsKLQotICAvKiBJZiBub24temVybywgc3BlY2lmaWVzIHRoYXQgYnJhbmNoZXMgd2hpY2ggYXJlIHByb2JsZW1hdGljIGZvciB0aGUKLSAgTVBDODYwIEMwIChvciBlYXJsaWVyKSBzaG91bGQgYmUgY2hlY2tlZCBmb3IgYW5kIG1vZGlmaWVkLiAgSXQgZ2l2ZXMgdGhlCi0gIG51bWJlciBvZiBieXRlcyB0aGF0IHNob3VsZCBiZSBjaGVja2VkIGF0IHRoZSBlbmQgb2YgZWFjaCB0ZXh0IHBhZ2UuICovCi0gIGludCBtcGM4NjBjMDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlcyBob2xkcyBhIHNldCBvZiBjYWxsYmFjayBmdW5jdGlvbnMuICBUaGVzZSBhcmUKLSAgIGNhbGxlZCBieSB0aGUgQkZEIGxpbmtlciByb3V0aW5lcy4gIFRoZSBmaXJzdCBhcmd1bWVudCB0byBlYWNoCi0gICBjYWxsYmFjayBmdW5jdGlvbiBpcyB0aGUgYmZkX2xpbmtfaW5mbyBzdHJ1Y3R1cmUgYmVpbmcgdXNlZC4gIEVhY2gKLSAgIGZ1bmN0aW9uIHJldHVybnMgYSBib29sZWFuIHZhbHVlLiAgSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UsCi0gICB0aGVuIHRoZSBCRkQgZnVuY3Rpb24gd2hpY2ggY2FsbGVkIGl0IHdpbGwgcmV0dXJuIHdpdGggYSBmYWlsdXJlCi0gICBpbmRpY2F0aW9uLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcwotewotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGFuIG9iamVjdCBpcyBhZGRlZCBmcm9tIGFuCi0gICAgIGFyY2hpdmUuICBBQkZEIGlzIHRoZSBhcmNoaXZlIGVsZW1lbnQgYmVpbmcgYWRkZWQuICBOQU1FIGlzIHRoZQotICAgICBuYW1lIG9mIHRoZSBzeW1ib2wgd2hpY2ggY2F1c2VkIHRoZSBhcmNoaXZlIGVsZW1lbnQgdG8gYmUgcHVsbGVkCi0gICAgIGluLiAgKi8KLSAgYm9vbGVhbiAoKmFkZF9hcmNoaXZlX2VsZW1lbnQpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgYmZkICphYmZkLAotCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIHN5bWJvbCBpcyBmb3VuZCB3aXRoIG11bHRpcGxlCi0gICAgIGRlZmluaXRpb25zLiAgTkFNRSBpcyB0aGUgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgbXVsdGlwbGUgdGltZXMuCi0gICAgIE9CRkQgaXMgdGhlIG9sZCBCRkQsIE9TRUMgaXMgdGhlIG9sZCBzZWN0aW9uLCBPVkFMIGlzIHRoZSBvbGQKLSAgICAgdmFsdWUsIE5CRkQgaXMgdGhlIG5ldyBCRkQsIE5TRUMgaXMgdGhlIG5ldyBzZWN0aW9uLCBhbmQgTlZBTCBpcwotICAgICB0aGUgbmV3IHZhbHVlLiAgT0JGRCBtYXkgYmUgTlVMTC4gIE9TRUMgYW5kIE5TRUMgbWF5IGJlCi0gICAgIGJmZF9jb21fc2VjdGlvbiBvciBiZmRfaW5kX3NlY3Rpb24uICAqLwotICBib29sZWFuICgqbXVsdGlwbGVfZGVmaW5pdGlvbikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgIGJmZCAqb2JmZCwKLQkJCQkJICBhc2VjdGlvbiAqb3NlYywKLQkJCQkJICBiZmRfdm1hIG92YWwsCi0JCQkJCSAgYmZkICpuYmZkLAotCQkJCQkgIGFzZWN0aW9uICpuc2VjLAotCQkJCQkgIGJmZF92bWEgbnZhbCkpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgY29tbW9uIHN5bWJvbCBpcyBkZWZpbmVkCi0gICAgIG11bHRpcGxlIHRpbWVzLiAgTkFNRSBpcyB0aGUgc3ltYm9sIGFwcGVhcmluZyBtdWx0aXBsZSB0aW1lcy4KLSAgICAgT0JGRCBpcyB0aGUgQkZEIG9mIHRoZSBleGlzdGluZyBzeW1ib2w7IGl0IG1heSBiZSBOVUxMIGlmIHRoaXMgaXMKLSAgICAgbm90IGtub3duLiAgT1RZUEUgaXMgdGhlIHR5cGUgb2YgdGhlIGV4aXN0aW5nIHN5bWJvbCwgd2hpY2ggbWF5Ci0gICAgIGJlIGJmZF9saW5rX2hhc2hfZGVmaW5lZCwgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLAotICAgICBiZmRfbGlua19oYXNoX2NvbW1vbiwgb3IgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdC4gIElmIE9UWVBFIGlzCi0gICAgIGJmZF9saW5rX2hhc2hfY29tbW9uLCBPU0laRSBpcyB0aGUgc2l6ZSBvZiB0aGUgZXhpc3Rpbmcgc3ltYm9sLgotICAgICBOQkZEIGlzIHRoZSBCRkQgb2YgdGhlIG5ldyBzeW1ib2wuICBOVFlQRSBpcyB0aGUgdHlwZSBvZiB0aGUgbmV3Ci0gICAgIHN5bWJvbCwgb25lIG9mIGJmZF9saW5rX2hhc2hfZGVmaW5lZCwgYmZkX2xpbmtfaGFzaF9jb21tb24sIG9yCi0gICAgIGJmZF9saW5rX2hhc2hfaW5kaXJlY3QuICBJZiBOVFlQRSBpcyBiZmRfbGlua19oYXNoX2NvbW1vbiwgTlNJWkUKLSAgICAgaXMgdGhlIHNpemUgb2YgdGhlIG5ldyBzeW1ib2wuICAqLwotICBib29sZWFuICgqbXVsdGlwbGVfY29tbW9uKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgICAgYmZkICpvYmZkLAotCQkJCSAgICAgIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlIG90eXBlLAotCQkJCSAgICAgIGJmZF92bWEgb3NpemUsCi0JCQkJICAgICAgYmZkICpuYmZkLAotCQkJCSAgICAgIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlIG50eXBlLAotCQkJCSAgICAgIGJmZF92bWEgbnNpemUpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgdG8gYWRkIGEgc3ltYm9sIHRvIGEgc2V0LiAgRU5UUlkgaXMKLSAgICAgdGhlIGxpbmsgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIHNldCBpdHNlbGYgKGUuZy4sCi0gICAgIF9fQ1RPUl9MSVNUX18pLiAgUkVMT0MgaXMgdGhlIHJlbG9jYXRpb24gdG8gdXNlIGZvciBhbiBlbnRyeSBpbgotICAgICB0aGUgc2V0IHdoZW4gZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBmaWxlLCBhbmQgaXMgYWxzbyB1c2VkIHRvCi0gICAgIGdldCB0aGUgc2l6ZSBvZiB0aGUgZW50cnkgd2hlbiBnZW5lcmF0aW5nIGFuIGV4ZWN1dGFibGUgZmlsZS4KLSAgICAgQUJGRCwgU0VDIGFuZCBWQUxVRSBpZGVudGlmeSB0aGUgdmFsdWUgdG8gYWRkIHRvIHRoZSBzZXQuICAqLwotICBib29sZWFuICgqYWRkX3RvX3NldCkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmVudHJ5LAotCQkJCSBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2MsCi0JCQkJIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYmZkX3ZtYSB2YWx1ZSkpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHRoZSBuYW1lIG9mIGEgZysrIGNvbnN0cnVjdG9yIG9yCi0gICAgIGRlc3RydWN0b3IgaXMgZm91bmQuICBUaGlzIGlzIG9ubHkgY2FsbGVkIGJ5IHNvbWUgb2JqZWN0IGZpbGUKLSAgICAgZm9ybWF0cy4gIENPTlNUUlVDVE9SIGlzIHRydWUgZm9yIGEgY29uc3RydWN0b3IsIGZhbHNlIGZvciBhCi0gICAgIGRlc3RydWN0b3IuICBUaGlzIHdpbGwgdXNlIEJGRF9SRUxPQ19DVE9SIHdoZW4gZ2VuZXJhdGluZyBhCi0gICAgIHJlbG9jYXRlYWJsZSBmaWxlLiAgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIGZvdW5kLiAgQUJGRCwKLSAgICAgU0VDVElPTiBhbmQgVkFMVUUgYXJlIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgKi8KLSAgYm9vbGVhbiAoKmNvbnN0cnVjdG9yKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgYm9vbGVhbiBjb25zdHJ1Y3RvciwKLQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywKLQkJCQkgIGJmZF92bWEgdmFsdWUpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgdG8gaXNzdWUgYSBsaW5rZXIgd2FybmluZy4gIEZvcgotICAgICBleGFtcGxlLCB0aGlzIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgcmVmZXJlbmNlIHRvIGEgd2FybmluZwotICAgICBzeW1ib2wuICBXQVJOSU5HIGlzIHRoZSB3YXJuaW5nIHRvIGJlIGlzc3VlZC4gIFNZTUJPTCBpcyB0aGUgbmFtZQotICAgICBvZiB0aGUgc3ltYm9sIHdoaWNoIHRyaWdnZXJlZCB0aGUgd2FybmluZzsgaXQgbWF5IGJlIE5VTEwgaWYKLSAgICAgdGhlcmUgaXMgbm9uZS4gIEFCRkQsIFNFQ1RJT04gYW5kIEFERFJFU1MgaWRlbnRpZnkgdGhlIGxvY2F0aW9uCi0gICAgIHdoaWNoIHRyaWdlcnJlZCB0aGUgd2FybmluZzsgZWl0aGVyIEFCRkQgb3IgU0VDVElPTiBvciBib3RoIG1heQotICAgICBiZSBOVUxMIGlmIHRoZSBsb2NhdGlvbiBpcyBub3Qga25vd24uICAqLwotICBib29sZWFuICgqd2FybmluZykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKndhcm5pbmcsIGNvbnN0IGNoYXIgKnN5bWJvbCwKLQkJCSAgICAgIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkgICAgICBiZmRfdm1hIGFkZHJlc3MpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIHJlbG9jYXRpb24gaXMgYXR0ZW1wdGVkIGFnYWluc3QKLSAgICAgYW4gdW5kZWZpbmVkIHN5bWJvbC4gIE5BTUUgaXMgdGhlIHN5bWJvbCB3aGljaCBpcyB1bmRlZmluZWQuCi0gICAgIEFCRkQsIFNFQ1RJT04gYW5kIEFERFJFU1MgaWRlbnRpZnkgdGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggdGhlCi0gICAgIHJlZmVyZW5jZSBpcyBtYWRlLiAgSW4gc29tZSBjYXNlcyBTRUNUSU9OIG1heSBiZSBOVUxMLiAgKi8KLSAgYm9vbGVhbiAoKnVuZGVmaW5lZF9zeW1ib2wpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGJmZCAqYWJmZCwKLQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sIGJmZF92bWEgYWRkcmVzcykpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgcmVsb2Mgb3ZlcmZsb3cgb2NjdXJzLiAgTkFNRSBpcwotICAgICB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIG9yIHNlY3Rpb24gdGhlIHJlbG9jIGlzIGFnYWluc3QsCi0gICAgIFJFTE9DX05BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIHJlbG9jYXRpb24sIGFuZCBBRERFTkQgaXMgYW55Ci0gICAgIGFkZGVuZCB0aGF0IGlzIHVzZWQuICBBQkZELCBTRUNUSU9OIGFuZCBBRERSRVNTIGlkZW50aWZ5IHRoZQotICAgICBsb2NhdGlvbiBhdCB3aGljaCB0aGUgb3ZlcmZsb3cgb2NjdXJzOyBpZiB0aGlzIGlzIHRoZSByZXN1bHQgb2YgYQotICAgICBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyIG9yIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlciwgdGhlbgotICAgICBBQkZEIHdpbGwgYmUgTlVMTC4gICovCi0gIGJvb2xlYW4gKCpyZWxvY19vdmVyZmxvdykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgICBjb25zdCBjaGFyICpyZWxvY19uYW1lLCBiZmRfdm1hIGFkZGVuZCwKLQkJCQkgICAgIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJICAgICBiZmRfdm1hIGFkZHJlc3MpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIGRhbmdlcm91cyByZWxvYyBpcyBwZXJmb3JtZWQuCi0gICAgIFRoZSBjYW5vbmljYWwgZXhhbXBsZSBpcyBhbiBhMjlrIElIQ09OU1QgcmVsb2Mgd2hpY2ggZG9lcyBub3QKLSAgICAgZm9sbG93IGFuIElISUhBTEYgcmVsb2MuICBNRVNTQUdFIGlzIGFuIGFwcHJvcHJpYXRlIG1lc3NhZ2UuCi0gICAgIEFCRkQsIFNFQ1RJT04gYW5kIEFERFJFU1MgaWRlbnRpZnkgdGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRoZQotICAgICBwcm9ibGVtIG9jY3VycmVkOyBpZiB0aGlzIGlzIHRoZSByZXN1bHQgb2YgYQotICAgICBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyIG9yIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlciwgdGhlbgotICAgICBBQkZEIHdpbGwgYmUgTlVMTC4gICovCi0gIGJvb2xlYW4gKCpyZWxvY19kYW5nZXJvdXMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSwKLQkJCQkgICAgICBiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCSAgICAgIGJmZF92bWEgYWRkcmVzcykpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgcmVsb2MgaXMgZm91bmQgdG8gYmUgYXR0YWNoZWQKLSAgICAgdG8gYSBzeW1ib2wgd2hpY2ggaXMgbm90IGJlaW5nIHdyaXR0ZW4gb3V0LiAgTkFNRSBpcyB0aGUgbmFtZSBvZgotICAgICB0aGUgc3ltYm9sLiAgQUJGRCwgU0VDVElPTiBhbmQgQUREUkVTUyBpZGVudGlmeSB0aGUgbG9jYXRpb24gb2YKLSAgICAgdGhlIHJlbG9jOyBpZiB0aGlzIGlzIHRoZSByZXN1bHQgb2YgYQotICAgICBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyIG9yIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlciwgdGhlbgotICAgICBBQkZEIHdpbGwgYmUgTlVMTC4gICovCi0gIGJvb2xlYW4gKCp1bmF0dGFjaGVkX3JlbG9jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJCSAgICAgICBiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCSAgICAgICBiZmRfdm1hIGFkZHJlc3MpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIHN5bWJvbCBpbiBub3RpY2VfaGFzaCBpcwotICAgICBkZWZpbmVkIG9yIHJlZmVyZW5jZWQuICBOQU1FIGlzIHRoZSBzeW1ib2wuICBBQkZELCBTRUNUSU9OIGFuZAotICAgICBBRERSRVNTIGFyZSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIElmIFNFQ1RJT04gaXMKLSAgICAgYmZkX3VuZF9zZWN0aW9uLCB0aGlzIGlzIGEgcmVmZXJlbmNlLiAgKi8KLSAgYm9vbGVhbiAoKm5vdGljZSkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgICAgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgYmZkX3ZtYSBhZGRyZXNzKSk7Ci19OwotDAotLyogVGhlIGxpbmtlciBidWlsZHMgbGlua19vcmRlciBzdHJ1Y3R1cmVzIHdoaWNoIHRlbGwgdGhlIGNvZGUgaG93IHRvCi0gICBpbmNsdWRlIGlucHV0IGRhdGEgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotLyogVGhlc2UgYXJlIHRoZSB0eXBlcyBvZiBsaW5rX29yZGVyIHN0cnVjdHVyZXMuICAqLwotCi1lbnVtIGJmZF9saW5rX29yZGVyX3R5cGUKLXsKLSAgYmZkX3VuZGVmaW5lZF9saW5rX29yZGVyLAkvKiBVbmRlZmluZWQuICAqLwotICBiZmRfaW5kaXJlY3RfbGlua19vcmRlciwJLyogQnVpbHQgZnJvbSBhIHNlY3Rpb24uICAqLwotICBiZmRfZmlsbF9saW5rX29yZGVyLAkJLyogRmlsbCB3aXRoIGEgMTYgYml0IGNvbnN0YW50LiAgKi8KLSAgYmZkX2RhdGFfbGlua19vcmRlciwJCS8qIFNldCB0byBleHBsaWNpdCBkYXRhLiAgKi8KLSAgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciwJLyogUmVsb2NhdGUgYWdhaW5zdCBhIHNlY3Rpb24uICAqLwotICBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIJLyogUmVsb2NhdGUgYWdhaW5zdCBhIHN5bWJvbC4gICovCi19OwotCi0vKiBUaGlzIGlzIHRoZSBsaW5rX29yZGVyIHN0cnVjdHVyZSBpdHNlbGYuICBUaGVzZSBmb3JtIGEgY2hhaW4KLSAgIGF0dGFjaGVkIHRvIHRoZSBzZWN0aW9uIHdob3NlIGNvbnRlbnRzIHRoZXkgYXJlIGRlc2NyaWJpbmcuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgCi17Ci0gIC8qIE5leHQgbGlua19vcmRlciBpbiBjaGFpbi4gICovCi0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbmV4dDsKLSAgLyogVHlwZSBvZiBsaW5rX29yZGVyLiAgKi8KLSAgZW51bSBiZmRfbGlua19vcmRlcl90eXBlIHR5cGU7Ci0gIC8qIE9mZnNldCB3aXRoaW4gb3V0cHV0IHNlY3Rpb24uICAqLwotICBiZmRfdm1hIG9mZnNldDsgIAotICAvKiBTaXplIHdpdGhpbiBvdXRwdXQgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgLyogVHlwZSBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCi0gIHVuaW9uIAotICAgIHsKLSAgICAgIHN0cnVjdCAKLQl7Ci0JICAvKiBTZWN0aW9uIHRvIGluY2x1ZGUuICBJZiB0aGlzIGlzIHVzZWQsIHRoZW4KLQkgICAgIHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uIG11c3QgYmUgdGhlIHNlY3Rpb24gdGhlCi0JICAgICBsaW5rX29yZGVyIGlzIGF0dGFjaGVkIHRvLCBzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0IG11c3QKLQkgICAgIGVxdWFsIHRoZSBsaW5rX29yZGVyIG9mZnNldCBmaWVsZCwgYW5kIHNlY3Rpb24tPl9yYXdfc2l6ZQotCSAgICAgbXVzdCBlcXVhbCB0aGUgbGlua19vcmRlciBzaXplIGZpZWxkLiAgTWF5YmUgdGhlc2UKLQkgICAgIHJlc3RyaWN0aW9ucyBzaG91bGQgYmUgcmVsYXhlZCBzb21lZGF5LiAgKi8KLQkgIGFzZWN0aW9uICpzZWN0aW9uOwotCX0gaW5kaXJlY3Q7Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICAvKiBWYWx1ZSB0byBmaWxsIHdpdGguICAqLwotCSAgdW5zaWduZWQgaW50IHZhbHVlOwotCX0gZmlsbDsKLSAgICAgIHN0cnVjdAotCXsKLQkgIC8qIERhdGEgdG8gcHV0IGludG8gZmlsZS4gIFRoZSBzaXplIGZpZWxkIGdpdmVzIHRoZSBudW1iZXIKLQkgICAgIG9mIGJ5dGVzIHdoaWNoIHRoaXMgZmllbGQgcG9pbnRzIHRvLiAgKi8KLQkgIGJmZF9ieXRlICpjb250ZW50czsKLQl9IGRhdGE7Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICAvKiBEZXNjcmlwdGlvbiBvZiByZWxvYyB0byBnZW5lcmF0ZS4gIFVzZWQgZm9yCi0JICAgICBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyIGFuZAotCSAgICAgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyLiAgKi8KLQkgIHN0cnVjdCBiZmRfbGlua19vcmRlcl9yZWxvYyAqcDsKLQl9IHJlbG9jOwotICAgIH0gdTsKLX07Ci0KLS8qIEEgbGlua2VyIG9yZGVyIG9mIHR5cGUgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciBvcgotICAgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyIG1lYW5zIHRvIGNyZWF0ZSBhIHJlbG9jIGFnYWluc3QgYQotICAgc2VjdGlvbiBvciBzeW1ib2wsIHJlc3BlY3RpdmVseS4gIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgLVVyIHRvCi0gICBnZW5lcmF0ZSByZWxvY3MgZm9yIHRoZSBjb25zdHJ1Y3RvciB0YWJsZXMuICBUaGUKLSAgIGJmZF9saW5rX29yZGVyX3JlbG9jIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIHJlbG9jIHRoYXQgQkZEIHNob3VsZAotICAgY3JlYXRlLiAgSXQgaXMgc2ltaWxhciB0byBhIGFyZWxlbnQsIGJ1dCBJIGRpZG4ndCB1c2UgYXJlbGVudAotICAgYmVjYXVzZSB0aGUgbGlua2VyIGRvZXMgbm90IGtub3cgYW55dGhpbmcgYWJvdXQgbW9zdCBzeW1ib2xzLCBhbmQKLSAgIGFueSBhc3ltYm9sIHN0cnVjdHVyZSBpdCBjcmVhdGVzIHdpbGwgYmUgcGFydGlhbGx5IG1lYW5pbmdsZXNzLgotICAgVGhpcyBpbmZvcm1hdGlvbiBjb3VsZCBsb2dpY2FsbHkgYmUgaW4gdGhlIGJmZF9saW5rX29yZGVyIHN0cnVjdCwKLSAgIGJ1dCBJIGRpZG4ndCB3YW50IHRvIHdhc3RlIHRoZSBzcGFjZSBzaW5jZSB0aGVzZSB0eXBlcyBvZiByZWxvY3MKLSAgIGFyZSByZWxhdGl2ZWx5IHJhcmUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfb3JkZXJfcmVsb2MKLXsKLSAgLyogUmVsb2MgdHlwZS4gICovCi0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLQotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIEZvciB0eXBlIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIsIHRoaXMgaXMgdGhlIHNlY3Rpb24KLQkgdGhlIHJlbG9jIHNob3VsZCBiZSBhZ2FpbnN0LiAgVGhpcyBtdXN0IGJlIGEgc2VjdGlvbiBpbiB0aGUKLQkgb3V0cHV0IEJGRCwgbm90IGFueSBvZiB0aGUgaW5wdXQgQkZEcy4gICovCi0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgIC8qIEZvciB0eXBlIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlciwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUKLQkgc3ltYm9sIHRoZSByZWxvYyBzaG91bGQgYmUgYWdhaW5zdC4gICovCi0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIH0gdTsKLQotICAvKiBBZGRlbmQgdG8gdXNlLiAgVGhlIG9iamVjdCBmaWxlIHNob3VsZCBjb250YWluIHplcm8uICBUaGUgQkZECi0gICAgIGJhY2tlbmQgaXMgcmVzcG9uc2libGUgZm9yIGZpbGxpbmcgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QKLSAgICAgZmlsZSBjb3JyZWN0bHkuICBGb3Igc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIChlLmcuLCBDT0ZGKSB0aGUKLSAgICAgYWRkZW5kIG11c3QgYmUgc3RvcmVkIGludG8gaW4gdGhlIG9iamVjdCBmaWxlLCBhbmQgZm9yIHNvbWUKLSAgICAgKGUuZy4sIFNQQVJDIGEub3V0KSBpdCBpcyBrZXB0IGluIHRoZSByZWxvYy4gICovCi0gIGJmZF92bWEgYWRkZW5kOwotfTsKLQotLyogQWxsb2NhdGUgYSBuZXcgbGlua19vcmRlciBmb3IgYSBzZWN0aW9uLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmJmZF9uZXdfbGlua19vcmRlciBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotCi0vKiBUaGVzZSBzdHJ1Y3R1cmVzIGFyZSB1c2VkIHRvIGRlc2NyaWJlIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIHRoZQotICAgRUxGIGxpbmtlci4gIFRoZXNlIHN0cnVjdHVyZXMgY291bGQgYmUgbWFuaXB1bGF0ZWQgZW50aXJlbHkgaW5zaWRlCi0gICBCRkQsIGJ1dCBpdCB3b3VsZCBiZSBhIHBhaW4uICBJbnN0ZWFkLCB0aGUgcmVndWxhciBsaW5rZXIgc2V0cyB1cAotICAgdGhlc2Ugc3RydWN0dXJlcywgYW5kIHRoZW4gcGFzc2VzIHRoZW0gaW50byBCRkQuICAqLwotCi0vKiBSZWd1bGFyIGV4cHJlc3Npb25zIGZvciBhIHZlcnNpb24uICAqLwotCi1zdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIKLXsKLSAgLyogTmV4dCByZWd1bGFyIGV4cHJlc3Npb24gZm9yIHRoaXMgdmVyc2lvbi4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqbmV4dDsKLSAgLyogUmVndWxhciBleHByZXNzaW9uLiAgKi8KLSAgY29uc3QgY2hhciAqcGF0dGVybjsKLSAgLyogTWF0Y2hpbmcgZnVuY3Rpb24uICAqLwotICBpbnQgKCptYXRjaCkgUEFSQU1TKChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKiwgY29uc3QgY2hhciAqKSk7Ci19OwotCi0vKiBWZXJzaW9uIGRlcGVuZGVuY2llcy4gICovCi0KLXN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcwotewotICAvKiBOZXh0IGRlcGVuZGVuY3kgZm9yIHRoaXMgdmVyc2lvbi4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqbmV4dDsKLSAgLyogVGhlIHZlcnNpb24gd2hpY2ggdGhpcyB2ZXJzaW9uIGRlcGVuZHMgdXBvbi4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdmVyc2lvbl9uZWVkZWQ7Ci19OwotCi0vKiBBIG5vZGUgaW4gdGhlIHZlcnNpb24gdHJlZS4gICovCi0KLXN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZQotewotICAvKiBOZXh0IHZlcnNpb24uICAqLwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKm5leHQ7Ci0gIC8qIE5hbWUgb2YgdGhpcyB2ZXJzaW9uLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVmVyc2lvbiBudW1iZXIuICAqLwotICB1bnNpZ25lZCBpbnQgdmVybnVtOwotICAvKiBSZWd1bGFyIGV4cHJlc3Npb25zIGZvciBnbG9iYWwgc3ltYm9scyBpbiB0aGlzIHZlcnNpb24uICAqLwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmdsb2JhbHM7Ci0gIC8qIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGxvY2FsIHN5bWJvbHMgaW4gdGhpcyB2ZXJzaW9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpsb2NhbHM7Ci0gIC8qIExpc3Qgb2YgdmVyc2lvbnMgd2hpY2ggdGhpcyB2ZXJzaW9uIGRlcGVuZHMgdXBvbi4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqZGVwczsKLSAgLyogSW5kZXggb2YgdGhlIHZlcnNpb24gbmFtZS4gIFRoaXMgaXMgdXNlZCB3aXRoaW4gQkZELiAgKi8KLSAgdW5zaWduZWQgaW50IG5hbWVfaW5keDsKLSAgLyogV2hldGhlciB0aGlzIHZlcnNpb24gdHJlZSB3YXMgdXNlZC4gIFRoaXMgaXMgdXNlZCB3aXRoaW4gQkZELiAgKi8KLSAgaW50IHVzZWQ7Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYm91dC5oIGIvaW5jbHVkZS9ib3V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzI4Y2MuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ib3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgJ2Eub3V0LmgnLiAgSXQgaXMgdG8gYmUgdXNlZCBpbiBhbGwKLSAqIEdOVSB0b29scyBtb2RpZmllZCB0byBzdXBwb3J0IHRoZSBpODA5NjAgKG9yIHRvb2xzIHRoYXQgb3BlcmF0ZSBvbgotICogb2JqZWN0IGZpbGVzIGNyZWF0ZWQgYnkgc3VjaCB0b29scykuCi0gKgotICogQWxsIGk4MDk2MCBkZXZlbG9wbWVudCBpcyBkb25lIGluIGEgQ1JPU1MtREVWRUxPUE1FTlQgZW52aXJvbm1lbnQuICBJLmUuLAotICogb2JqZWN0IGNvZGUgaXMgZ2VuZXJhdGVkIG9uLCBhbmQgZXhlY3V0ZWQgdW5kZXIgdGhlIGRpcmVjdGlvbiBvZiBhIHN5bWJvbGljCi0gKiBkZWJ1Z2dlciBydW5uaW5nIG9uLCBhIGhvc3Qgc3lzdGVtLiAgV2UgZG8gbm90IHdhbnQgdG8gYmUgc3ViamVjdCB0byB0aGUKLSAqIHZhZ2FyaWVzIG9mIHdoaWNoIGhvc3QgaXQgaXMgb3Igd2hldGhlciBpdCBzdXBwb3J0cyBDT0ZGIG9yIGEub3V0IGZvcm1hdCwKLSAqIG9yIGFueXRoaW5nIGVsc2UuICBXZSBETyB3YW50IHRvOgotICoKLSAqCW8gYWx3YXlzIGdlbmVyYXRlIHRoZSBzYW1lIGZvcm1hdCBvYmplY3QgZmlsZXMsIHJlZ2FyZGxlc3Mgb2YgaG9zdC4KLSAqCi0gKglvIGhhdmUgYW4gJ2Eub3V0JyBoZWFkZXIgdGhhdCB3ZSBjYW4gbW9kaWZ5IGZvciBvdXIgb3duIHB1cnBvc2VzCi0gKgkgICh0aGUgODA5NjAgaXMgdHlwaWNhbGx5IGFuIGVtYmVkZGVkIHByb2Nlc3NvciBhbmQgbWF5IHJlcXVpcmUKLSAqCSAgZW5oYW5jZWQgbGlua2VyIHN1cHBvcnQgdGhhdCB0aGUgbm9ybWFsIGEub3V0LmggaGVhZGVyIGNhbid0Ci0gKgkgIGFjY29tbW9kYXRlKS4KLSAqCi0gKiBBcyBmb3IgYnl0ZS1vcmRlcmluZywgdGhlIGZvbGxvd2luZyBydWxlcyBhcHBseToKLSAqCi0gKglvIFRleHQgYW5kIGRhdGEgdGhhdCBpcyBhY3R1YWxseSBkb3dubG9hZGVkIHRvIHRoZSB0YXJnZXQgaXMgYWx3YXlzCi0gKgkgIGluIGk4MDk2MCAobGl0dGxlLWVuZGlhbikgb3JkZXIuCi0gKgotICoJbyBBbGwgb3RoZXIgbnVtYmVycyAoaW4gdGhlIGhlYWRlciwgc3ltYm9scywgcmVsb2NhdGlvbiBkaXJlY3RpdmVzKQotICoJICBhcmUgaW4gaG9zdCBieXRlLW9yZGVyOiAgb2JqZWN0IGZpbGVzIENBTk5PVCBiZSBsaWZ0ZWQgZnJvbSBhCi0gKgkgIGxpdHRsZS1lbmQgaG9zdCBhbmQgdXNlZCBvbiBhIGJpZy1lbmRpYW4gKG9yIHZpY2UgdmVyc2EpIHdpdGhvdXQKLSAqCSAgbW9kaWZpY2F0aW9uLgotICogPT0+IFRISVMgSVMgTk8gTE9OR0VSIFRSVUUgVVNJTkcgQkZELiAgV0UgQ0FOIEdFTkVSQVRFIEFOWSBCWVRFIE9SREVSCi0gKiAgICAgRk9SIFRIRSBIRUFERVIsIEFORCBSRUFEIEFOWSBCWVRFIE9SREVSLiAgUFJFRkVSRU5DRSBXT1VMRCBCRSBUTwotICogICAgIFVTRSBMSVRUTEUtRU5ESUFOIEJZVEUgT1JERVIgVEhST1VHSE9VVCwgUkVHQVJETEVTUyBPRiBIT1NULiAgPD09Ci0gKgotICoJbyBUaGUgZG93bmxvYWRlciAoJ2NvbW05NjAnKSB0YWtlcyBjYXJlIHRvIGdlbmVyYXRlIGEgcHNldWRvLWhlYWRlcgotICoJICB3aXRoIGNvcnJlY3QgKGk4MDk2MCkgYnl0ZS1vcmRlcmluZyBiZWZvcmUgc2hpcHBpbmcgdGV4dCBhbmQgZGF0YQotICoJICBvZmYgdG8gdGhlIE5JTkRZIG1vbml0b3IgaW4gdGhlIHRhcmdldCBzeXN0ZW1zLiAgU3ltYm9scyBhbmQKLSAqCSAgcmVsb2NhdGlvbiBpbmZvIGFyZSBuZXZlciBzZW50IHRvIHRoZSB0YXJnZXQuCi0gKi8KLQotCi0jZGVmaW5lIEJNQUdJQwkwNDE1Ci0vKiBXZSBkb24ndCBhY2NlcHQgdGhlIGZvbGxvd2luZyAoc2VlIE5fQkFETUFHIG1hY3JvKS4KLSAqIFRoZXkncmUganVzdCBoZXJlIHNvIEdOVSBjb2RlIHdpbGwgY29tcGlsZS4KLSAqLwotI2RlZmluZQlPTUFHSUMJMDQwNwkJLyogb2xkIGltcHVyZSBmb3JtYXQgKi8KLSNkZWZpbmUJTk1BR0lDCTA0MTAJCS8qIHJlYWQtb25seSB0ZXh0ICovCi0jZGVmaW5lCVpNQUdJQwkwNDEzCQkvKiBkZW1hbmQgbG9hZCBmb3JtYXQgKi8KLQotLyogRklMRSBIRUFERVIKLSAqCUFsbCAnbGVuZ3RocycgYXJlIGdpdmVuIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgotICoJQWxsICdhbGlnbm1lbnRzJyBhcmUgZm9yIHJlbGlua2FibGUgZmlsZXMgb25seTsgIGFuIGFsaWdubWVudCBvZgotICoJCSduJyBpbmRpY2F0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgc2VnbWVudCBtdXN0IGJlZ2luIGF0IGFuCi0gKgkJYWRkcmVzcyB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgKDIqKm4pLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfZXhlYyB7Ci0JLyogU3RhbmRhcmQgc3R1ZmYgKi8KLQl1bnNpZ25lZCBjaGFyIGVfaW5mb1s0XTsJLyogSWRlbnRpZmllcyB0aGlzIGFzIGEgYi5vdXQgZmlsZSAqLwotCXVuc2lnbmVkIGNoYXIgZV90ZXh0WzRdOwkvKiBMZW5ndGggb2YgdGV4dCAqLwotCXVuc2lnbmVkIGNoYXIgZV9kYXRhWzRdOwkvKiBMZW5ndGggb2YgZGF0YSAqLwotCXVuc2lnbmVkIGNoYXIgZV9ic3NbNF07CQkvKiBMZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgKi8KLQl1bnNpZ25lZCBjaGFyIGVfc3ltc1s0XTsJLyogTGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSAqLwotCXVuc2lnbmVkIGNoYXIgZV9lbnRyeVs0XTsJLyogUnVudGltZSBzdGFydCBhZGRyZXNzICovCi0JdW5zaWduZWQgY2hhciBlX3Ryc2l6ZVs0XTsJLyogTGVuZ3RoIG9mIHRleHQgcmVsb2NhdGlvbiBpbmZvICovCi0JdW5zaWduZWQgY2hhciBlX2Ryc2l6ZVs0XTsJLyogTGVuZ3RoIG9mIGRhdGEgcmVsb2NhdGlvbiBpbmZvICovCi0KLQkvKiBBZGRlZCBmb3IgaTk2MCAqLwotCXVuc2lnbmVkIGNoYXIgZV90bG9hZFs0XTsJLyogVGV4dCBydW50aW1lIGxvYWQgYWRkcmVzcyAqLwotCXVuc2lnbmVkIGNoYXIgZV9kbG9hZFs0XTsJLyogRGF0YSBydW50aW1lIGxvYWQgYWRkcmVzcyAqLwotCXVuc2lnbmVkIGNoYXIgZV90YWxpZ25bMV07CS8qIEFsaWdubWVudCBvZiB0ZXh0IHNlZ21lbnQgKi8KLQl1bnNpZ25lZCBjaGFyIGVfZGFsaWduWzFdOwkvKiBBbGlnbm1lbnQgb2YgZGF0YSBzZWdtZW50ICovCi0JdW5zaWduZWQgY2hhciBlX2JhbGlnblsxXTsJLyogQWxpZ25tZW50IG9mIGJzcyBzZWdtZW50ICovCi0JdW5zaWduZWQgY2hhciBlX3JlbGF4YWJsZVsxXTsJLyogQXNzZW1ibGVkIHdpdGggZW5vdWdoIGluZm8gdG8gYWxsb3cgbGlua2VyIHRvIHJlbGF4ICovCi19OwotCi0jZGVmaW5lCUVYRUNfQllURVNfU0laRQkoc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYykpCi0KLS8qIFRoZXNlIG1hY3JvcyB1c2UgdGhlIGFfeHh4IGZpZWxkIG5hbWVzLCBzaW5jZSB0aGV5IG9wZXJhdGUgb24gdGhlIGV4ZWMKLSAgIHN0cnVjdHVyZSBhZnRlciBpdCdzIGJlZW4gYnl0ZS1zd2FwcGVkIGFuZCByZWFsaWduZWQgb24gdGhlIGhvc3QgbWFjaGluZS4gKi8KLSNkZWZpbmUgTl9CQURNQUcoeCkJKCgoeCkuYV9pbmZvKSE9Qk1BR0lDKQotI2RlZmluZSBOX1RYVE9GRih4KQlFWEVDX0JZVEVTX1NJWkUKLSNkZWZpbmUgTl9EQVRPRkYoeCkJKCBOX1RYVE9GRih4KSArICh4KS5hX3RleHQgKQotI2RlZmluZSBOX1RST0ZGKHgpCSggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhICkKLSNkZWZpbmUgTl9UUkVMT0ZGCU5fVFJPRkYKLSNkZWZpbmUgTl9EUk9GRih4KQkoIE5fVFJPRkYoeCkgKyAoeCkuYV90cnNpemUgKQotI2RlZmluZSBOX0RSRUxPRkYJTl9EUk9GRgotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJPRkYoeCkgKyAoeCkuYV9kcnNpemUgKQotI2RlZmluZSBOX1NUUk9GRih4KQkoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCi0jZGVmaW5lIE5fREFUQUREUih4KQkoICh4KS5hX2Rsb2FkICkgICAgCi0KLS8qIEFkZHJlc3Mgb2YgdGV4dCBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuICAqLwotI2lmICFkZWZpbmVkIChOX1RYVEFERFIpCi0jZGVmaW5lIE5fVFhUQUREUih4KSAwCi0jZW5kaWYKLQotLyogQSBzaW5nbGUgZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZQotICovCi1zdHJ1Y3Qgbmxpc3QgewotCXVuaW9uIHsKLQkJY2hhcgkqbl9uYW1lOwotCQlzdHJ1Y3Qgbmxpc3QgKm5fbmV4dDsKLQkJbG9uZwluX3N0cng7CQkvKiBJbmRleCBpbnRvIHN0cmluZyB0YWJsZQkqLwotCX0gbl91bjsKLQl1bnNpZ25lZCBjaGFyIG5fdHlwZTsJLyogU2VlIGJlbG93CQkJCSovCi0JY2hhcgluX290aGVyOwkvKiBVc2VkIGluIGk4MDk2MCBzdXBwb3J0IC0tIHNlZSBiZWxvdwkqLwotCXNob3J0CW5fZGVzYzsKLQl1bnNpZ25lZCBsb25nIG5fdmFsdWU7Ci19OwotCi0KLS8qIExlZ2FsIHZhbHVlcyBvZiBuX3R5cGUKLSAqLwotI2RlZmluZSBOX1VOREYJMAkvKiBVbmRlZmluZWQgc3ltYm9sCSovCi0jZGVmaW5lIE5fQUJTCTIJLyogQWJzb2x1dGUgc3ltYm9sCSovCi0jZGVmaW5lIE5fVEVYVAk0CS8qIFRleHQgc3ltYm9sCQkqLwotI2RlZmluZSBOX0RBVEEJNgkvKiBEYXRhIHN5bWJvbAkJKi8KLSNkZWZpbmUgTl9CU1MJOAkvKiBCU1Mgc3ltYm9sCQkqLwotI2RlZmluZSBOX0ZOCTMxCS8qIEZpbGVuYW1lIHN5bWJvbAkqLwotCi0jZGVmaW5lIE5fRVhUCTEJLyogRXh0ZXJuYWwgc3ltYm9sIChPUidkIGluIHdpdGggb25lIG9mIGFib3ZlKQkqLwotI2RlZmluZSBOX1RZUEUJMDM2CS8qIE1hc2sgZm9yIGFsbCB0aGUgdHlwZSBiaXRzCQkJKi8KLSNkZWZpbmUgTl9TVEFCCTAzNDAJLyogTWFzayBmb3IgYWxsIGJpdHMgdXNlZCBmb3IgU0RCIGVudHJpZXMgCSovCi0KLS8qIE1FQU5JTkcgT0YgJ25fb3RoZXInCi0gKgotICogSWYgbm9uLXplcm8sIHRoZSAnbl9vdGhlcicgZmllbGRzIGluZGljYXRlcyBlaXRoZXIgYSBsZWFmIHByb2NlZHVyZSBvcgotICogYSBzeXN0ZW0gcHJvY2VkdXJlLCBhcyBmb2xsb3dzOgotICoKLSAqCTEgPD0gbl9vdGhlciA8PSAzMiA6Ci0gKgkJVGhlIHN5bWJvbCBpcyB0aGUgZW50cnkgcG9pbnQgdG8gYSBzeXN0ZW0gcHJvY2VkdXJlLgotICoJCSduX3ZhbHVlJyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZW50cnksIGFzIGZvciBhbnkgb3RoZXIKLSAqCQlwcm9jZWR1cmUuICBUaGUgc3lzdGVtIHByb2NlZHVyZSBudW1iZXIgKHdoaWNoIGNhbiBiZSB1c2VkIGluCi0gKgkJYSAnY2FsbHMnIGluc3RydWN0aW9uKSBpcyAobl9vdGhlci0xKS4gIFRoZXNlIGVudHJpZXMgY29tZSBmcm9tCi0gKgkJJy5zeXNwcm9jJyBkaXJlY3RpdmVzLgotICoKLSAqCW5fb3RoZXIgPT0gTl9DQUxMTkFNRQotICoJCXRoZSBzeW1ib2wgaXMgdGhlICdjYWxsJyBlbnRyeSBwb2ludCB0byBhIGxlYWYgcHJvY2VkdXJlLgotICoJCVRoZSAqbmV4dCogc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUgbXVzdCBiZSB0aGUgY29ycmVzcG9uZGluZwotICoJCSdiYWwnIGVudHJ5IHBvaW50IHRvIHRoZSBwcm9jZWR1cmUgKHNlZSBmb2xsb3dpbmcpLiAgVGhlc2UKLSAqCQllbnRyaWVzIGNvbWUgZnJvbSAnLmxlYWZwcm9jJyBkaXJlY3RpdmVzIGluIHdoaWNoIHR3byBkaWZmZXJlbnQKLSAqCQlzeW1ib2xzIGFyZSBzcGVjaWZpZWQgKHRoZSBmaXJzdCBvbmUgaXMgcmVwcmVzZW50ZWQgaGVyZSkuCi0gKgkKLSAqCi0gKgluX290aGVyID09IE5fQkFMTkFNRQotICoJCXRoZSBzeW1ib2wgaXMgdGhlICdiYWwnIGVudHJ5IHBvaW50IHRvIGEgbGVhZiBwcm9jZWR1cmUuCi0gKgkJVGhlc2UgZW50cmllcyByZXN1bHQgZnJvbSAnLmxlYWZwcm9jJyBkaXJlY3RpdmVzIGluIHdoaWNoIG9ubHkKLSAqCQlvbmUgc3ltYm9sIGlzIHNwZWNpZmllZCwgb3IgaW4gd2hpY2ggdGhlIHNhbWUgc3ltYm9sIGlzCi0gKgkJc3BlY2lmaWVkIHR3aWNlLgotICoKLSAqIE5vdGUgdGhhdCBhbiBOX0NBTExOQU1FIGVudHJ5ICptdXN0KiBoYXZlIGEgY29ycmVzcG9uZGluZyBOX0JBTE5BTUUgZW50cnksCi0gKiBidXQgbm90IGV2ZXJ5IE5fQkFMTkFNRSBlbnRyeSBtdXN0IGhhdmUgYW4gTl9DQUxMTkFNRSBlbnRyeS4KLSAqLwotI2RlZmluZSBOX0NBTExOQU1FCSgoY2hhciktMSkKLSNkZWZpbmUgTl9CQUxOQU1FCSgoY2hhciktMikKLSNkZWZpbmUgSVNfQ0FMTE5BTUUoeCkJKE5fQ0FMTE5BTUUgPT0gKHgpKQotI2RlZmluZSBJU19CQUxOQU1FKHgpCShOX0JBTE5BTUUgPT0gKHgpKQotI2RlZmluZSBJU19PVEhFUih4KQkoKHgpPjAgJiYgKHgpIDw9MzIpCi0KLSNkZWZpbmUgYl9vdXRfcmVsb2NhdGlvbl9pbmZvIHJlbG9jYXRpb25faW5mbwotc3RydWN0IHJlbG9jYXRpb25faW5mbyB7Ci0JaW50CSByX2FkZHJlc3M7CS8qIEZpbGUgYWRkcmVzcyBvZiBpdGVtIHRvIGJlIHJlbG9jYXRlZAkqLwotCXVuc2lnbmVkCi0jZGVmaW5lIHJfaW5kZXggcl9zeW1ib2xudW0KLQkJcl9zeW1ib2xudW06MjQsLyogSW5kZXggb2Ygc3ltYm9sIG9uIHdoaWNoIHJlbG9jYXRpb24gaXMgYmFzZWQsCi0JCQkJKglpZiByX2V4dGVybiBpcyBzZXQuICBPdGhlcndpc2Ugc2V0IHRvCi0JCQkJKgllaXRoZXIgTl9URVhULCBOX0RBVEEsIG9yIE5fQlNTIHRvCi0JCQkJKglpbmRpY2F0ZSBzZWN0aW9uIG9uIHdoaWNoIHJlbG9jYXRpb24gaXMKLQkJCQkqCWJhc2VkLgotCQkJCSovCi0JCXJfcGNyZWw6MSwJLyogMSA9PiByZWxvY2F0ZSBQQy1yZWxhdGl2ZTsgZWxzZSBhYnNvbHV0ZQotCQkJCSAqCU9uIGk5NjAsIHBjLXJlbGF0aXZlIGltcGxpZXMgMjQtYml0Ci0JCQkJICoJYWRkcmVzcywgYWJzb2x1dGUgaW1wbGllcyAzMi1iaXQuCi0JCQkJICovCi0JCXJfbGVuZ3RoOjIsCS8qIE51bWJlciBvZiBieXRlcyB0byByZWxvY2F0ZToKLQkJCQkgKgkwID0+IDEgYnl0ZQotCQkJCSAqCTEgPT4gMiBieXRlcyAtLSB1c2VkIGZvciAxMyBiaXQgcGNyZWwKLQkJCQkgKgkyID0+IDQgYnl0ZXMgCi0JCQkJICovCi0JCXJfZXh0ZXJuOjEsCi0JCXJfYnNyOjEsCS8qIFNvbWV0aGluZyBmb3IgdGhlIEdOVSBOUzMySyBhc3NlbWJsZXIgKi8KLQkJcl9kaXNwOjEsCS8qIFNvbWV0aGluZyBmb3IgdGhlIEdOVSBOUzMySyBhc3NlbWJsZXIgKi8KLQkJcl9jYWxsajoxLAkvKiAxIGlmIHJlbG9jYXRpb24gdGFyZ2V0IGlzIGFuIGk5NjAgJ2NhbGxqJyAqLwotCQlyX3JlbGF4YWJsZToxOwkvKiAxIGlmIGVub3VnaCBpbmZvIGlzIGxlZnQgdG8gcmVsYXgKLQkJCQkgICB0aGUgZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FsbGJhY2suaCBiL2luY2x1ZGUvY2FsbGJhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3NTI4NC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NhbGxiYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyogUmVtb3RlIHRhcmdldCBzeXN0ZW0gY2FsbCBjYWxsYmFjayBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaW50ZXJmYWNlIGlzbid0IGludGVuZGVkIHRvIGJlIHNwZWNpZmljIHRvIGFueSBwYXJ0aWN1bGFyIGtpbmQKLSAgIG9mIHJlbW90ZSAoaGFyZHdhcmUsIHNpbXVsYXRvciwgd2hhdGV2ZXIpLiAgQXMgc3VjaCwgc3VwcG9ydCBmb3IgaXQKLSAgIChlLmcuIHNpbS9jb21tb24vY2FsbGJhY2suYykgc2hvdWxkICpub3QqIGxpdmUgaW4gdGhlIHNpbXVsYXRvciBzb3VyY2UKLSAgIHRyZWUsIG5vciBzaG91bGQgaXQgbGl2ZSBpbiB0aGUgZ2RiIHNvdXJjZSB0cmVlLiAgKi8KLQotLyogVGhlcmUgYXJlIHZhcmlvdXMgd2F5cyB0byBoYW5kbGUgc3lzdGVtIGNhbGxzOgotCi0gICAxKSBIYXZlIGEgc2ltdWxhdG9yIGludGVyY2VwdCB0aGUgYXBwcm9wcmlhdGUgdHJhcCBpbnN0cnVjdGlvbiBhbmQKLSAgIGRpcmVjdGx5IHBlcmZvcm0gdGhlIHN5c3RlbSBjYWxsIG9uIGJlaGFsZiBvZiB0aGUgdGFyZ2V0IHByb2dyYW0uCi0gICBUaGlzIGlzIHRoZSB0eXBpY2FsIHdheSBvZiBoYW5kbGluZyBzeXN0ZW0gY2FsbHMgZm9yIGVtYmVkZGVkIHRhcmdldHMuCi0gICBbSGFuZGxpbmcgc3lzdGVtIGNhbGxzIGZvciBlbWJlZGRlZCB0YXJnZXRzIGlzbid0IHRoYXQgbXVjaCBvZiBhbgotICAgb3h5bW9yb24gYXMgcnVubmluZyBjb21waWxlciB0ZXN0c3VpdGVzIG1ha2UgdXNlIG9mIHRoZSBjYXBhYmlsaXR5Ll0KLQotICAgVGhpcyBtZXRob2Qgb2Ygc3lzdGVtIGNhbGwgaGFuZGxpbmcgaXMgZG9uZSB3aGVuIFNUQVRFX0VOVklST05NRU5UCi0gICBpcyBFTlZJUk9OTUVOVF9VU0VSLgotCi0gICAyKSBIYXZlIGEgc2ltdWxhdG9yIGVtdWxhdGUgdGhlIGhhcmR3YXJlIGFzIG11Y2ggYXMgcG9zc2libGUuCi0gICBJZiB0aGUgcHJvZ3JhbSBydW5uaW5nIG9uIHRoZSByZWFsIGhhcmR3YXJlIGNvbW11bmljYXRlcyB3aXRoIHNvbWUgc29ydAotICAgb2YgdGFyZ2V0IG1hbmFnZXIsIG9uZSB3b3VsZCB3YW50IHRvIGJlIGFibGUgdG8gcnVuIHRoaXMgcHJvZ3JhbSBvbiB0aGUKLSAgIHNpbXVsYXRvciBhcyB3ZWxsLgotCi0gICBUaGlzIG1ldGhvZCBvZiBzeXN0ZW0gY2FsbCBoYW5kbGluZyBpcyBkb25lIHdoZW4gU1RBVEVfRU5WSVJPTk1FTlQKLSAgIGlzIEVOVklST05NRU5UX09QRVJBVElORy4KLSovCi0KLSNpZm5kZWYgQ0FMTEJBQ0tfSAotI2RlZmluZSBDQUxMQkFDS19ICi0KLS8qID8/PyBUaGUgcmVhc29uIHdoeSB3ZSBjaGVjayBmb3IgdmFfc3RhcnQgaGVyZSBzaG91bGQgYmUgZG9jdW1lbnRlZC4gICovCi0KLSNpZm5kZWYgdmFfc3RhcnQKLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotDAotLyogTWFwcGluZyBvZiBob3N0L3RhcmdldCB2YWx1ZXMuICAqLwotLyogPz8/IEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIG9uZSBtaWdodCB3YW50IHRvIGFkZCBhIHN0cmluZyBvZiB0aGUKLSAgIG5hbWUgb2YgdGhlIHN5bWJvbC4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IGhvc3RfdmFsOwotICBpbnQgdGFyZ2V0X3ZhbDsKLX0gQ0JfVEFSR0VUX0RFRlNfTUFQOwotCi0jZGVmaW5lIE1BWF9DQUxMQkFDS19GRFMgMTAKLQotLyogRm9yd2FyZCBkZWNsIGZvciBzdGF0L2ZzdGF0LiAgKi8KLXN0cnVjdCBzdGF0OwotCi10eXBlZGVmIHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCBob3N0X2NhbGxiYWNrOwotCi1zdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1Y3QgCi17Ci0gIGludCAoKmNsb3NlKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosaW50KSk7Ci0gIGludCAoKmdldF9lcnJubykgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7Ci0gIGludCAoKmlzYXR0eSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKLSAgaW50ICgqbHNlZWspIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50LCBsb25nICwgaW50KSk7Ci0gIGludCAoKm9wZW4pIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciosIGludCBtb2RlKSk7Ci0gIGludCAoKnJlYWQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKixpbnQsICBjaGFyICosIGludCkpOwotICBpbnQgKCpyZWFkX3N0ZGluKSBQQVJBTVMgKCggaG9zdF9jYWxsYmFjayAqLCBjaGFyICosIGludCkpOwotICBpbnQgKCpyZW5hbWUpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLSAgaW50ICgqc3lzdGVtKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKikpOwotICBsb25nICgqdGltZSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBsb25nICopKTsKLSAgaW50ICgqdW5saW5rKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKikpOwotICBpbnQgKCp3cml0ZSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLGludCwgY29uc3QgY2hhciAqLCBpbnQpKTsKLSAgaW50ICgqd3JpdGVfc3Rkb3V0KSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0gIHZvaWQgKCpmbHVzaF9zdGRvdXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKikpOwotICBpbnQgKCp3cml0ZV9zdGRlcnIpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLSAgdm9pZCAoKmZsdXNoX3N0ZGVycikgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7Ci0gIGludCAoKnN0YXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0gIGludCAoKmZzdGF0KSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCwgc3RydWN0IHN0YXQgKikpOwotCi0gIC8qIFdoZW4gcHJlc2VudCwgY2FsbCB0byB0aGUgY2xpZW50IHRvIGdpdmUgaXQgdGhlIG9wb3J0dW5pdHkgdG8KLSAgICAgcG9sbCBhbnkgaW8gZGV2aWNlcyBmb3IgYSByZXF1ZXN0IHRvIHF1aXQgKGluZGljYXRlZCBieSBhIG5vbnplcm8KLSAgICAgcmV0dXJuIHZhbHVlKS4gKi8KLSAgaW50ICgqcG9sbF9xdWl0KSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKLQotICAvKiBVc2VkIHdoZW4gdGhlIHRhcmdldCBoYXMgZ29uZSBhd2F5LCBzbyB3ZSBjYW4gY2xvc2Ugb3BlbgotICAgICBoYW5kbGVzIGFuZCBmcmVlIG1lbW9yeSBldGMgZXRjLiAgKi8KLSAgaW50ICgqc2h1dGRvd24pIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKikpOwotICBpbnQgKCppbml0KSAgICAgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7Ci0KLSAgLyogZGVwcmVjaWF0ZWQsIHVzZSB2cHJpbnRmX2ZpbHRlcmVkIC0gVGFsayB0byB0aGUgdXNlciBvbiBhIGNvbnNvbGUuICAqLwotICB2b2lkICgqcHJpbnRmX2ZpbHRlcmVkKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0KLSAgLyogVGFsayB0byB0aGUgdXNlciBvbiBhIGNvbnNvbGUuICAqLwotICB2b2lkICgqdnByaW50Zl9maWx0ZXJlZCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKLQotICAvKiBTYW1lIGFzIHZwcmludGZfZmlsdGVyZWQgYnV0IHRvIHN0ZGVyci4gICovCi0gIHZvaWQgKCpldnByaW50Zl9maWx0ZXJlZCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKLQotICAvKiBQcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZCAiZXhpdCIuCi0gICAgIEluIHRoZSBjYXNlIG9mIGdkYiAiZXhpdGluZyIgbWVhbnMgZG9pbmcgYSBsb25nam1wIGJhY2sgdG8gdGhlIG1haW4KLSAgICAgY29tbWFuZCBsb29wLiAgKi8KLSAgdm9pZCAoKmVycm9yKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0KLSAgaW50IGxhc3RfZXJybm87CQkvKiBob3N0IGZvcm1hdCAqLwotCi0gIGludCBmZG1hcFtNQVhfQ0FMTEJBQ0tfRkRTXTsKLSAgY2hhciBmZG9wZW5bTUFYX0NBTExCQUNLX0ZEU107Ci0gIGNoYXIgYWx3YXlzb3BlbltNQVhfQ0FMTEJBQ0tfRkRTXTsKLQotICAvKiBTeXN0ZW0gY2FsbCBudW1iZXJzLiAgKi8KLSAgQ0JfVEFSR0VUX0RFRlNfTUFQICpzeXNjYWxsX21hcDsKLSAgLyogRXJybm8gdmFsdWVzLiAgKi8KLSAgQ0JfVEFSR0VUX0RFRlNfTUFQICplcnJub19tYXA7Ci0gIC8qIEZsYWdzIHRvIHRoZSBvcGVuIHN5c3RlbSBjYWxsLiAgKi8KLSAgQ0JfVEFSR0VUX0RFRlNfTUFQICpvcGVuX21hcDsKLSAgLyogU2lnbmFsIG51bWJlcnMuICAqLwotICBDQl9UQVJHRVRfREVGU19NQVAgKnNpZ25hbF9tYXA7Ci0gIC8qIExheW91dCBvZiBgc3RhdCcgc3RydWN0LgotICAgICBUaGUgZm9ybWF0IGlzIGEgc2VyaWVzIG9mICJuYW1lLGxlbmd0aCIgcGFpcnMgc2VwYXJhdGVkIGJ5IGNvbG9ucy4KLSAgICAgRW1wdHkgc3BhY2UgaXMgaW5kaWNhdGVkIHdpdGggYSBgbmFtZScgb2YgInNwYWNlIi4KLSAgICAgQWxsIHBhZGRpbmcgbXVzdCBiZSBleHBsaWNpdGx5IG1lbnRpb25lZC4KLSAgICAgTGVuZ3RocyBhcmUgaW4gYnl0ZXMuICBJZiB0aGlzIG5lZWRzIHRvIGJlIGV4dGVuZGVkIHRvIGJpdHMsCi0gICAgIHVzZSAibmFtZS5iaXRzIi4KLSAgICAgRXhhbXBsZTogInN0X2Rldiw0OnN0X2lubyw0OnN0X21vZGUsNDouLi4iICAqLwotICBjb25zdCBjaGFyICpzdGF0X21hcDsKLQotICAvKiBNYXJrZXIgZm9yIHRob3NlIHdhbnRpbmcgdG8gZG8gc2FuaXR5IGNoZWNrcy4KLSAgICAgVGhpcyBzaG91bGQgcmVtYWluIHRoZSBsYXN0IG1lbWJlciBvZiB0aGlzIHN0cnVjdCB0byBoZWxwIGNhdGNoCi0gICAgIG1pc2NvbXBpbGF0aW9uIGVycm9ycy4gKi8KLSNkZWZpbmUgSE9TVF9DQUxMQkFDS19NQUdJQyA0NzA1IC8qIHRlZHMgY29uc3RhbnQgKi8KLSAgaW50IG1hZ2ljOwotfTsKLQotZXh0ZXJuIGhvc3RfY2FsbGJhY2sgZGVmYXVsdF9jYWxsYmFjazsKLQwKLS8qIENhbm9uaWNhbCB2ZXJzaW9ucyBvZiBzeXN0ZW0gY2FsbCBudW1iZXJzLgotICAgSXQncyBub3QgaW50ZW5kZWQgdG8gd2lsbHktbmlsbHkgdGhyb3cgZXZlcnkgc3lzdGVtIGNhbGwgZXZlciBoZWFyZAotICAgb2YgaW4gaGVyZS4gIE9ubHkgaW5jbHVkZSB0aG9zZSB0aGF0IGhhdmUgYW4gaW1wb3J0YW50IHVzZS4KLSAgID8/PyBPbmUgY2FuIGNlcnRhaW5seSBzdGFydCBhIGRpc2N1c3Npb24gb3ZlciB0aGUgb25lcyB0aGF0IGFyZSBjdXJyZW50bHkKLSAgIGhlcmUsIGJ1dCB0aGF0IHdpbGwgYWx3YXlzIGJlIHRydWUuICAqLwotCi0vKiBUaGVzZSBhcmUgdXNlZCBieSB0aGUgQU5TSSBDIHN1cHBvcnQgb2YgbGliYy4gICovCi0jZGVmaW5lCUNCX1NZU19leGl0CTEKLSNkZWZpbmUJQ0JfU1lTX29wZW4JMgotI2RlZmluZQlDQl9TWVNfY2xvc2UJMwotI2RlZmluZQlDQl9TWVNfcmVhZAk0Ci0jZGVmaW5lCUNCX1NZU193cml0ZQk1Ci0jZGVmaW5lCUNCX1NZU19sc2Vlawk2Ci0jZGVmaW5lCUNCX1NZU191bmxpbmsJNwotI2RlZmluZQlDQl9TWVNfZ2V0cGlkCTgKLSNkZWZpbmUJQ0JfU1lTX2tpbGwJOQotI2RlZmluZSBDQl9TWVNfZnN0YXQgICAgMTAKLS8qI2RlZmluZSBDQl9TWVNfc2JyawkxMSAtIG5vdCBjdXJyZW50bHkgYSBzeXN0ZW0gY2FsbCwgYnV0IHJlc2VydmVkLiAgKi8KLQotLyogQVJHViBzdXBwb3J0LiAgKi8KLSNkZWZpbmUgQ0JfU1lTX2FyZ3ZsZW4JMTIKLSNkZWZpbmUgQ0JfU1lTX2FyZ3YJMTMKLQotLyogVGhlc2UgYXJlIGV4dHJhcyBhZGRlZCBmb3Igb25lIHJlYXNvbiBvciBhbm90aGVyLiAgKi8KLSNkZWZpbmUgQ0JfU1lTX2NoZGlyCTE0Ci0jZGVmaW5lIENCX1NZU19zdGF0CTE1Ci0jZGVmaW5lIENCX1NZU19jaG1vZCAJMTYKLSNkZWZpbmUgQ0JfU1lTX3V0aW1lIAkxNwotI2RlZmluZSBDQl9TWVNfdGltZSAJMTgKLQwKLS8qIFN0cnVjdCB1c2UgdG8gcGFzcyBhbmQgcmV0dXJuIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBwZXJmb3JtIGEKLSAgIHN5c3RlbSBjYWxsLiAgKi8KLS8qIEZJWE1FOiBOZWVkIHRvIGNvbnNpZGVyIHRhcmdldCB3b3JkIHNpemUuICAqLwotCi10eXBlZGVmIHN0cnVjdCBjYl9zeXNjYWxsIHsKLSAgLyogVGhlIHRhcmdldCdzIHZhbHVlIG9mIHdoYXQgc3lzdGVtIGNhbGwgdG8gcGVyZm9ybS4gICovCi0gIGludCBmdW5jOwotICAvKiBUaGUgYXJndW1lbnRzIHRvIHRoZSBzeXNjYWxsLiAgKi8KLSAgbG9uZyBhcmcxLCBhcmcyLCBhcmczLCBhcmc0OwotCi0gIC8qIFRoZSByZXN1bHQuICAqLwotICBsb25nIHJlc3VsdDsKLSAgLyogU29tZSBzeXN0ZW0gY2FsbHMgaGF2ZSB0d28gcmVzdWx0cy4gICovCi0gIGxvbmcgcmVzdWx0MjsKLSAgLyogVGhlIHRhcmdldCdzIGVycm5vIHZhbHVlLCBvciAwIGlmIHN1Y2Nlc3MuCi0gICAgIFRoaXMgaXMgY29udmVydGVkIHRvIHRoZSB0YXJnZXQncyB2YWx1ZSB3aXRoIGhvc3RfdG9fdGFyZ2V0X2Vycm5vLiAgKi8KLSAgaW50IGVycmNvZGU7Ci0KLSAgLyogV29ya2luZyBzcGFjZSB0byBiZSB1c2VkIGJ5IG1lbW9yeSByZWFkL3dyaXRlIGNhbGxiYWNrcy4gICovCi0gIFBUUiBwMTsKLSAgUFRSIHAyOwotICBsb25nIHgxLHgyOwotCi0gIC8qIENhbGxiYWNrcyBmb3IgcmVhZGluZy93cml0aW5nIG1lbW9yeSAoZS5nLiBmb3IgcmVhZC93cml0ZSBzeXNjYWxscykuCi0gICAgID8/PyBsb25nIG9yIHVuc2lnbmVkIGxvbmcgbWlnaHQgYmUgYmV0dGVyIHRvIHVzZSBmb3IgdGhlIGBjb3VudCcKLSAgICAgYXJndW1lbnQgaGVyZS4gIFdlIG1pbWljIHNpbV97cmVhZCx3cml0ZX0gZm9yIG5vdy4gIEJlIGNhcmVmdWwgdG8KLSAgICAgdGVzdCBhbnkgY2hhbmdlcyB3aXRoIC1XYWxsIC1XZXJyb3IsIG1peGVkIHNpZ25lZCBjb21wYXJpc29ucwotICAgICB3aWxsIGdldCB5b3UuICAqLwotICBpbnQgKCpyZWFkX21lbSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqIC8qY2IqLywgc3RydWN0IGNiX3N5c2NhbGwgKiAvKnNjKi8sCi0JCQkgICB1bnNpZ25lZCBsb25nIC8qdGFkZHIqLywgY2hhciAqIC8qYnVmKi8sCi0JCQkgICBpbnQgLypieXRlcyovKSk7Ci0gIGludCAoKndyaXRlX21lbSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqIC8qY2IqLywgc3RydWN0IGNiX3N5c2NhbGwgKiAvKnNjKi8sCi0JCQkgICAgdW5zaWduZWQgbG9uZyAvKnRhZGRyKi8sIGNvbnN0IGNoYXIgKiAvKmJ1ZiovLAotCQkJICAgIGludCAvKmJ5dGVzKi8pKTsKLQotICAvKiBGb3Igc2FuaXR5IGNoZWNraW5nLCBzaG91bGQgYmUgbGFzdCBlbnRyeS4gICovCi0gIGludCBtYWdpYzsKLX0gQ0JfU1lTQ0FMTDsKLQotLyogTWFnaWMgbnVtYmVyIHNhbml0eSBjaGVja2VyLiAgKi8KLSNkZWZpbmUgQ0JfU1lTQ0FMTF9NQUdJQyAweDEyMzQ0MzIxCi0KLS8qIE1hY3JvIHRvIGluaXRpYWxpemUgQ0JfU1lTQ0FMTC4gIENhbGxlZCBmaXJzdCwgYmVmb3JlIGZpbGxpbmcgaW4KLSAgIGFueSBmaWVsZHMuICAqLwotI2RlZmluZSBDQl9TWVNDQUxMX0lOSVQoc2MpIFwKLWRvIHsgXAotICBtZW1zZXQgKChzYyksIDAsIHNpemVvZiAoKihzYykpKTsgXAotICAoc2MpLT5tYWdpYyA9IENCX1NZU0NBTExfTUFHSUM7IFwKLX0gd2hpbGUgKDApCi0MCi0vKiBSZXR1cm4gY29kZXMgZm9yIHZhcmlvdXMgaW50ZXJmYWNlIHJvdXRpbmVzLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgQ0JfUkNfT0sgPSAwLAotICAvKiBnZW5lcmljIGVycm9yICovCi0gIENCX1JDX0VSUiwKLSAgLyogZWl0aGVyIGZpbGUgbm90IGZvdW5kIG9yIG5vIHJlYWQgYWNjZXNzICovCi0gIENCX1JDX0FDQ0VTUywKLSAgQ0JfUkNfTk9fTUVNCi19IENCX1JDOwotCi0vKiBSZWFkIGluIHRhcmdldCB2YWx1ZXMgZm9yIHN5c3RlbSBjYWxsIG51bWJlcnMsIGVycm5vIHZhbHVlcywgc2lnbmFscy4gICovCi1DQl9SQyBjYl9yZWFkX3RhcmdldF9zeXNjYWxsX21hcHMgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICopKTsKLQotLyogVHJhbnNsYXRlIHRhcmdldCB0byBob3N0IHN5c2NhbGwgZnVuY3Rpb24gbnVtYmVycy4gICovCi1pbnQgY2JfdGFyZ2V0X3RvX2hvc3Rfc3lzY2FsbCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOwotCi0vKiBUcmFuc2xhdGUgaG9zdCB0byB0YXJnZXQgZXJybm8gdmFsdWUuICAqLwotaW50IGNiX2hvc3RfdG9fdGFyZ2V0X2Vycm5vIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50KSk7Ci0KLS8qIFRyYW5zbGF0ZSB0YXJnZXQgdG8gaG9zdCBvcGVuIGZsYWdzLiAgKi8KLWludCBjYl90YXJnZXRfdG9faG9zdF9vcGVuIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50KSk7Ci0KLS8qIFRyYW5zbGF0ZSB0YXJnZXQgc2lnbmFsIG51bWJlciB0byBob3N0LiAgKi8KLWludCBjYl90YXJnZXRfdG9faG9zdF9zaWduYWwgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKLQotLyogVHJhbnNsYXRlIGhvc3Qgc2lnbmFsIG51bWJlciB0byB0YXJnZXQuICAqLwotaW50IGNiX2hvc3RfdG9fdGFyZ2V0X3NpZ25hbCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOwotCi0vKiBUcmFuc2xhdGUgaG9zdCBzdGF0IHN0cnVjdCB0byB0YXJnZXQuCi0gICBJZiBzdGF0IHN0cnVjdCBwdHIgaXMgTlVMTCwganVzdCBjb21wdXRlIHRhcmdldCBzdGF0IHN0cnVjdCBzaXplLgotICAgUmVzdWx0IGlzIHNpemUgb2YgdGFyZ2V0IHN0YXQgc3RydWN0IG9yIDAgaWYgZXJyb3IuICAqLwotaW50IGNiX2hvc3RfdG9fdGFyZ2V0X3N0YXQgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqLCBQVFIpKTsKLQotLyogUGVyZm9ybSBhIHN5c3RlbSBjYWxsLiAgKi8KLUNCX1JDIGNiX3N5c2NhbGwgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBDQl9TWVNDQUxMICopKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvQ2hhbmdlTG9nIGIvaW5jbHVkZS9jb2ZmL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZjMzVhYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsODAzICswLDAgQEAKLU1vbiBNYXkgMTcgMTM6MzU6MzUgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGNvZmYvYXJtLmggKEZfUElDLCBGX0FSTV8yLCBGX0FSTV8yYSwgRl9BUk1fMywgRl9BUk1fM00sCi0JRl9BUk1fNCwgRl9BUk1fNFQsIEZfQVBDUzI2KTogQ2hhbmdlZCB2YWx1ZXMgdG8gZGlzdGluZ3Vpc2gKLQlGX0FSTV8yYSwgRl9BUk1fM00sIEZfQVJNXzRULgotCi0xOTk5LTA1LTE1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtY29yZS5oIChJTUFHRV9SRUxfTUNPUkVfUlZBKTogRGVmaW5lLgotCi0xOTk5LTA0LTIxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtY29yZS5oIChHRVRfTElORU5PX0xOTk8pOiBOZXcgbWFjcm8uCi0JKFBVVF9MSU5FTk9fTE5OTyk6IE5ldyBtYWNyby4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUuaDogTmV3IGhlYWRlciBmaWxlLiAgRGVmaW5lcyBmb3IgTW90b3JvbGxhJ3MgTUNvcmUKLQlwcm9jZXNzb3IuIAotCi1TdW4gRGVjICA2IDIxOjM2OjM3IDE5OTggIE1hcmsgRWxicmVjaHQgIDxzbm93YmFsbDNAdXNhLm5ldD4KLQotCSogaW50ZXJuYWwuaCAoQ19XRUFLRVhUKTogRGVmaW5lLgotCi1XZWQgSmFuIDI3IDEzOjM1OjM1IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBjb2ZmL2FybS5oIChGX1BJQ19JTlQsIEZfQVJNXzIsIEZfQVJNXzMsIEZfQVJNXzQsIEZfQVBDUzI2KToKLQlDaGFuZ2VkIHZhbHVlcyB0byBhdm9pZCBjbGFzaGluZyB3aXRoIElNQUdFX0ZJTEVfKiBjb2ZmIGhlYWRlcgotCWZsYWcgdmFsdWVzLgotCQotV2VkIEFwciAgMSAxNjowNjoxNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oOiBEb2N1bWVudCBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCBUaHVtYiBzeW1ib2wKLQl0eXBlcy4gCi0KLUZyaSBNYXIgMjcgMTc6MTY6NTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChJU1BUUiwgSVNGQ04sIElTQVJZKTogQWRkIGNhc3RzIHRvIHVuc2lnbmVkIGxvbmcuCi0KLU1vbiBGZWIgIDIgMTc6MTA6MzggMTk5OCAgU3RldmUgSGF3b3J0aCAgPHN0ZXZlQHBtLmNzZS5ybWl0LkVEVS5BVT4KLQotCSogdGljMzAuaDogTmV3IGZpbGUuCi0KLUZyaSBEZWMgMTIgMTE6NDk6MDcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFJfTVBQQ1IxNVcpOiBOZXcgcmVsb2NhdGlvbiB0eXBlLCBmb3IgMTUgYml0IFBDIHJlbGF0aXZlCi0Jb2Zmc2V0cy4KLQotVHVlIERlYyAgMiAxMDoyMTo0MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0uaCAoQ09GRkFSTSk6IE5ldyBkZWZpbmUuCi0KLVNhdCBOb3YgMjIgMTU6MTA6MTQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoQ19USFVNQkVYVEZVTkMsIENfVEhVTUJTVEFURlVOQyk6IENvbnN0YW50cyB0bwotCWRlZmluZSBzdGF0aWMgYW5kIGV4dGVybmFsIGZ1bmN0aW9ucy4KLQotCSogYXJtLmg6IEFkZCBiaXRzIHRvIHN1cHBvcnQgUElDIGFuZCBBUENTLUZMT0FUIHR5cGUgYmluYXJpZXMsCi0Jd2hlbiBpbXBsZW1lbnRlZC4KLQotRnJpIE9jdCAgMyAxNDoyNToxNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoUl9QUEwxNkIpOiBNYWtlIGNvbnN0YW50IHVwcGVyY2FzZSBmb3IgY29uc2lzdGVuY3kuCi0KLVR1ZSBKdWwgMjIgMTg6MTg6NTggMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBnbzMyZXhlLmg6IE5ldyBmaWxlLgotCi1UdWUgSnVsICA4IDEyOjIzOjU1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4MF9UQVJHRVRfSUQpOiBBZGQgZGVmaW5lLgotCSogaW50ZXJuYWwuaCAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIpOiBBZGQgZl90YXJnZXRfaWQgZmllbGQuCi0KLVR1ZSBKdW4gIDMgMTY6NDQ6MTggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaDogQWRkIHN0b3JhZ2UgY2xhc3NlcyBmb3IgVGh1bWIgc3ltYm9scwotCi1Nb24gTWF5IDI2IDE0OjA3OjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoUl9QUEwxNkIpOiBDb3JyZWN0IHZhbHVlLgotCi1TYXQgTWF5ICAzIDA4OjI0OjU5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChDX1VFWFQsIENfU1RBVExBQiwgQ19FWFRMQUIsIENfU1lTVEVNKToKLQlOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBUSWM4MC4KLQotRnJpIEFwciAxOCAxMTo1Mjo1NSAxOTk3ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQGFwcGxpLnNlPgotCi0JKiBhbHBoYS5oIChBTFBIQV9FQ09GRl9CQURNQUcpOiBSZWNvZ25pemUgKkJTRC9hbHBoYSBtYWdpYyB0b28uCi0JKEFMUEhBX1JfTElURVJBTFNMRUFaWSk6IERlZmluZS4KLQkqIGVjb2ZmLmggKEFMUEhBX01BR0lDX0JTRCk6IERlZmluZS4KLQotV2VkIEphbiAyOSAxMTozMTo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGk5NjAuaCAoUl9JUFIxMywgUl9BTElHTik6IERlZmluZS4KLQotTW9uIEphbiAyNyAxMzozNDozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKFJfSVBSTUVELCBSX09QVENBTEwsIFJfT1BUQ0FMTFgpOiBNb3ZlIGRlZmluaXRpb25zCi0JZnJvbSBoZXJlLi4uCi0JKiBpOTYwLmggKFJfSVBSTUVELCBSX09QVENBTEwsIFJfT1BUQ0FMTFgpOiAuLi50byBoZXJlLgotCi1XZWQgSmFuIDIyIDIwOjEwOjQ3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4ME1BR0lDKTogUmVuYW1lZCB0byBUSUM4MF9BT1VUSERSX01BR0lDLgotCi1GcmkgRGVjIDI3IDIyOjA1OjQ1IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oOiBOZXcgZmlsZSBmb3IgVEljODAgc3VwcG9ydC4KLQotVGh1IERlYyAxOSAxNjoxODoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFybS5oIChfTElUKTogRGVmaW5lLgotCi1GcmkgSnVuIDI4IDEyOjU0OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGUuaCAoRklMSFNaKTogRGVmaW5lLgotCi1XZWQgSnVuIDI2IDE2OjI0OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogQWxsIGZpbGVzOiBEZWZpbmUgRklMSFNaLCBBT1VUU1osIEFPVVRIRFJTWiwgU0NOSFNaLCBTWU1FU1osCi0JQVVYRVNaLCBMSU5FU1osIFJFTFNaIGFzIG51bWVyaWMgY29uc3RhbnRzIHJhdGhlciB0aGFuIHVzZXMgb2YKLQlzaXplb2YuICBEZWZpbmUgQU9VVEhEUlNaIGluIGFsbCBmaWxlcy4KLQkqIHBlLmggKEFPVVRTWik6IERlZmluZSBieSBhZGRpbmcgdG8gQU9VVEhEUlNaLgotCi1GcmkgSnVuIDIxIDExOjE3OjQ2IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBhbHBoYS5oOiBBZGQgZGVjbGFyYXRpb25zIGZvciByZWxvY2F0aW9uIHR5cGVzIGFkZGVkIGZvciBBbHBoYQotIAlPU0YvMSAzLjAuCi0KLVR1ZSBKdW4gMTggMTY6MDQ6MjkgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGg4MzAwLmggKEg4MzAwU01BR0lDKTogRGVmaW5lLgotCShIODMwMFNCQURNQUcpOiBEZWZpbmUuCi0KLU1vbiBKdW4gMTAgMTE6NTM6MjggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChSX0JDQ19JTlYsIFJfSk1QX0RFTCk6IE5ldyByZWxvY2F0aW9ucyBmb3IKLQlyZWxheGluZyBpbiB0aGUgSDgvMzAwIHNlcmllcy4KLQotVGh1IE1heSAxNiAxNTo0OToyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNoLmggKFJfU0hfQ09ERSwgUl9TSF9EQVRBLCBSX1NIX0xBQkVMKTogRGVmaW5lLgotCi1UdWUgTWF5ICA3IDAwOjM2OjM5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoUl9KTVBMMik6IFJlbmFtZWQgZnJvbSBSX0pNUExfQjggdG8gYmUKLQljb25zaXN0ZW50IHdpdGggb3RoZXIgc2ltaWxhciByZWxvY3MuCi0KLQkqIGludGVybmFsLmggKEg4LzMwMCBzcGVjaWZpYyByZWxvY3MpOiBBZGQgY29tbWVudHMgYmV0dGVyCi0JZXhwbGFpbmluZyB3aGF0IGVhY2ggcmVsb2MgaXMgdXNlZCBmb3IuCi0JKFJfTU9WMTZCMSwgUl9NT1YxNkIyKTogUmVuYW1lZCBmcm9tIFJfTU9WQjEgYW5kIFJfTU9WQjIuCi0JKFJfTU9WMjRCMSwgUl9NT1YyNEIyKTogUmVuYW1lZCBmcm9tIFJfTU9WTEIxIGFuZCBSX01PVkxCMi4KLQkoUl9NT1ZMMSwgUl9NT1ZMMik6IE5ldyByZWxvY3MuCi0JCi1GcmkgTWF5ICAzIDEzOjAxOjEyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoUl9QQ1JXT1JEX0IpOiBEZWZpbmUgZm9yIHRoZSBoODMwMCByZWxheGluZwotCWxpbmtlci4KLQotV2VkIE1heSAgMSAxOToyMTowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKFNDTk5NTEVOKTogRGVmaW5lLgotCShzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyKTogVXNlIFNDTk5NTEVOIGZvciBzX25hbWUgZmllbGQuCi0KLUZyaSBNYXIgMjkgMTM6NDE6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZS5oOiBEZWZpbmUgSU1BR0VfQ09NREFUIGNvZGVzLgotCi1XZWQgTWFyIDI3IDE3OjI5OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJtLmggKHVuaW9uIGV4dGVybmFsX2F1eGVudCk6IEFkZCB4X2NoZWNrc3VtLCB4X2Fzc29jaWF0ZWQsIGFuZAotCXhfY29tZGF0IGZpZWxkcyB0byB4X3NjbiBzdHJ1Y3QuCi0JKiBpMzg2LmggKHVuaW9uIGV4dGVybmFsX2F1eGVudCk6IExpa2V3aXNlLgotCSogcG93ZXJwYy5oICh1bmlvbiBleHRlcm5hbF9hdXhlbnQpOiBMaWtld2lzZS4KLQkqIGludGVybmFsLmggKHVuaW9uIGludGVybmFsX2F1eGVudCk6IExpa2V3aXNlLgotCi1UaHUgTWFyIDIxIDE2OjI1OjU3IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGVjb2ZmLmggKHN0cnVjdCBlY29mZl9maW5kX2xpbmUpOiBBZGQgY2FjaGluZyBmaWVsZHMuCi0KLVRodSBNYXIgMTQgMTU6MjI6NDQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChSX01FTV9JTkRJUkVDVCk6IE5ldyByZWxvYyBmb3IgdGhlIGg4MzAwLgotIAotRnJpIEZlYiAgOSAxMDo0NDoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGF1eC1jb2ZmLmg6IFJlbmFtZSBmcm9tIGF1eC5oLCB0byBhdm9pZCBwcm9ibGVtcyBvbiBoYXBsZXNzIERPUwotCXN5c3RlbXMgd2hpY2ggdGhpbmsgdGhhdCBhdXggaXMgYSBjb20gcG9ydC4KLQotTW9uIEZlYiAgNSAxODozNTowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGk5NjAuaCAoRl9JOTYwSFgpOiBEZWZpbmUuCi0KLVdlZCBKYW4gMzEgMTM6MTE6NTQgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGF1eC5oOiBOZXcgZmlsZS4KLQkqIGludGVybmFsLmgsIG02OGsuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4KLQotV2VkIE5vdiAyMiAxMzo0ODozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmggKF9SQ09OU1QsIFNUWVBfUkNPTlNULCBSRUxPQ19TRUNUSU9OX1JDT05TVCk6IERlZmluZS4KLQkoTlVNX1JFTE9DX1NFQ1RJT05TKTogVXBkYXRlLgotCSogc3ltY29uc3QuaCAoc2NSQ29uc3QpOiBEZWZpbmUuCi0KLVR1ZSBOb3YgMTQgMTg6NTQ6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChDX05UX1dFQUspOiBEZWZpbmUuCi0KLVRodSBOb3YgIDkgMTQ6MDg6MzAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByczYwMDAuaCAoU1RZUF9PVlJGTE8pOiBEZWZpbmUuCi0KLVR1ZSBOb3YgIDcgMTQ6Mzg6NDUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYvcG93ZXJwYy5oIChJTUFHRV9OVF9PUFRJT05BTF9IRFJfTUFHSUMpOiBBZGRlZCBkZWZpbmUuCi0JKiBjb2ZmL3BlLmg6IEFkZGVkIGRlZmluZXMgZm9yIGZpbGUgbGV2ZWwgZmxhZ3MKLQotTW9uIE5vdiAgNiAxNzoyODowMSAxOTk1ICBIYXJyeSBEb2xhbiAgPGRvbGFuQHNzZC5pbnRlbC5jb20+Ci0KLQkqIGk4NjAuaDogTmV3IGZpbGUsIGJhc2VkIG9uIGkzODYuaC4KLQotV2VkIE5vdiAgMSAxNToyNToxOCAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogbTY4ay5oIChQQUdFTUFHSUNFWEVDU1dBUFBFRCk6IERlZmluZS4KLQkoUEFHRU1BR0lDUEVYRUNTV0FQUEVEKTogRGVmaW5lLgotCShQQUdFTUFHSUNQRVhFQ1RTSExJQik6IERlZmluZS4KLQkoUEFHRU1BR0lDUEVYRUNQQUdFRCk6IERlZmluZS4KLQkoX0NPTU1FTlQpOiBERUZJTkUuCi0JKiBtODhrLmggKF9DT01NRU5UKTogRGVmaW5lLgotCi1XZWQgT2N0IDE4IDE4OjM2OjE5IDE5OTUgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIHN5bS5oOiAjaWYgMCdkIG91dCBydW50aW1lX3BkciBzdHJ1Y3QgYmVjYXVzZSBpdCBjaG9rZXMgCi0JVmlzdWFsIEMrKyBhbmQgdGhlcmUgYXJlbid0IGFueSByZWZlcmVuY2VzIHRvIGl0IGVsc2V3aGVyZSBpbiBnZGIuCi0KLU1vbiBPY3QgMTYgMTE6MTI6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByczYwMDAuaCAoU01BTExfQU9VVFNaKTogRGVmaW5lLgotCi0JKiBpbnRlcm5hbC5oIChYTUNfVEQpOiBEZWZpbmUuCi0KLVR1ZSBPY3QgMTAgMTg6NDE6MDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkcik6IEFkZCBvX2NwdXR5cGUgZmllbGQuCi0JKiByczYwMDAuaCAoQU9VVEhEUik6IFJlbmFtZSBvX3Jlc3YxIHRvIG9fY3B1dHlwZS4KLQotTW9uIE9jdCAgOSAxNDo0NTo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJzNjAwMC5oIChBT1VUSERSKTogQWRkIG9fbWF4ZGF0YSBmaWVsZC4gIEFkZCBjb21tZW50cy4KLQkoX1BBRCwgX0xPQURFUik6IERlZmluZS4KLQkoU1RZUF9MT0FERVIpOiBEZWZpbmUuCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkcik6IEFkZCBvX21heGRhdGEgZmllbGQuCi0KLVRodSBPY3QgIDUgMTA6MDI6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5oOiBEZWZpbmUgc2VjdGlvbiBuYW1lIG1hY3JvcyBhbmQgU1RZUCBtYWNyb3MgZm9yIHZhcmlvdXMKLQlBbHBoYSBzZWN0aW9uczogLmdvdCwgLmhhc2gsIC5keW5zeW0sIC5keW5zdHIsIC5yZWwuZHluLCAuY29uZmxpYywKLQkuY29tbWVudCwgLmxpYmxpc3QsIC5keW5hbWljLgotCi1XZWQgT2N0ICA0IDEwOjU2OjM1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBwZS5oOiBNb3ZlZCBET1NNQUdJQyBhbmQgTlRfU0lHTkFUVVJFIGRlZmluZXMgaGVyZQotCSogcG93ZXJwYy5oOiByZW1vdmVkIERPU01BR0lDLCBOVF9TSUdOQVRVUkUsIGFuZCBERUZBVUxUXyogZGVmaW5lcwotCUFsc28gcmVtb3ZlZCBvdGhlciB1bnVzZWQgZGVmaW5lcyAodmFyaW91cyBNQUdJQyBvbmVzKQotCSogaTM4Ni5oOiByZW1vdmVkIERPU01BR0lDLCBOVF9TSUdOQVRVUkUsIGFuZCBERUZBVUxUXyogZGVmaW5lcwotCSogYXJtLmg6IHJlbW92ZWQgRE9TTUFHSUMsIE5UX1NJR05BVFVSRSwgYW5kIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBhcG9sbG8uaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIGFscGhhLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBoODUwMC5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogaDgzMDAuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIGk5NjAuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIG04OGsuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIHdlMzJrLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiByczYwMDAuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIG1pcHMuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIG02OGsuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIHo4ay5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogdzY1Lmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBzcGFyYy5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogc2guaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQotRnJpIFNlcCAyOSAwODo0MDowOCAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogcG93ZXJwYy5oOiBSZWZvcm1hdHRlZCB0byBHTlUgY29kaW5nIGNvbnZlbnRpb25zLgotCi1XZWQgU2VwIDI3IDA2OjUwOjUwIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BuZWxsaWU+Ci0KLQkqIHBlLmg6IGFkZGVkIGRlZmluZXMgZm9yIG1vcmUgc2VjdGlvbiBjaGFyYWN0ZXJpc3RpY3MKLQkqIHBvd2VycGMuaCAobmV3IGZpbGUpOiBiYXNlIGNvZmYgZGVmaW5pdGlvbnMgZm9yIHBwYyBQRQotCi1UdWUgU2VwIDEyIDEyOjA4OjIwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoc3RydWN0IGludGVybmFsX3N5bWVudCk6IENoYW5nZSBuX251bWF1eCBmaWVsZCBmcm9tCi0JY2hhciB0byB1bnNpZ25lZCBjaGFyLgotCi1GcmkgU2VwICAxIDE1OjM5OjM2IDE5OTUgIEthenVtb3RvIEtvamltYSAgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPgotCi0JKiBtaXBzLmggKHN0cnVjdCBycGRyX2V4dCk6IERlZmluZS4KLQotVGh1IEF1ZyAzMSAxNjo1MTo1MCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChpbnRlcm5hbF9hb3V0aGRyLCBpbnRlcm5hbF9maWxlaGRyKToKLQlkb24ndCBpbmRpcmVjdCB0aGUgcGUgc3R1ZmYuCi0KLVR1ZSBBdWcgMjkgMTQ6MTY6MDcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oIChOVF9ERUZfUkVTRVJWRSwgTlRfREVGX0NPTU1JVCk6IE1ha2UgdGhlIHNhbWUKLQlhcyAndGhlIG90aGVyJyBjb21waWxlci4KLQkqIGludGVybmFsLmggKE5UX0lNQUdFX0JBU0UpOiBEZWxldGVkLgotCShOVF9FWEVfSU1BR0VfQkFTRSwgTlRfRExMX0lNQUdFX0JBU0UpOiBOZXcuCi0JKFBFX0RFRl9TRUNUSU9OX0FMSUdOTUVOVCwgUEVfREVGX0ZJTEVfQUxJR05NRU5UKTogTmV3LgotCShSX0lNQUdFQkFTRSk6IE5ldy4KLQotTW9uIEF1ZyAyMSAxODoxMjoxOSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oOiAoaW50ZXJuYWxfZmlsZWhkcik6IE1vdmVkIFBFIHN0dWZmIGludG8KLQlpbnRlcm5hbF9leHRyYV9wZV9maWxlaGRyLgotCShpbnRlcm5hbF9hb3V0aGRyKTogTW92ZWQgUEUgc3R1ZmYgaW50bwotCWludGVyYW5sX2V4dHJhX3BlX2FvdXRoZHIuCi0KLU1vbiBKdWwgMjQgMTQ6MDU6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oOiBNb3ZlIFJfU0hfKiByZWxvY3MgZnJvbSBoZXJlLi4uCi0JKiBzaC5oOiAuLi50byBoZXJlLgotCShSX1NIX1NXSVRDSDE2LCBSX1NIX1NXSVRDSDMyKTogRGVmaW5lLgotCShSX1NIX1VTRVMsIFJfU0hfQ09VTlQsIFJfU0hfQUxJR04pOiBEZWZpbmUuCi0KLVRodSBKdW4gMjkgMDA6MDQ6MjUgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoTlRfREVGX1JFU0VSVkUsIE5UX0RFRl9DT01NSVQpOiBJbmNyZWFzZSBhIGxvdC4KLQotVHVlIE1heSAxNiAxNTowODoyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBEZWxldGUKLQotVHVlIE1heSAxNiAxNTowODoyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBOb3cgZXh0ZXJuLgotCi1UdWUgRmViIDE0IDE3OjU5OjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSk6IERlZmluZS4KLQkoc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSk6IERlZmluZS4KLQotU2F0IEZlYiAgNCAxNDozODowMyAxOTk1ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHU+Ci0KLQkqIHN5bS5oIChzdHJ1Y3QgcGRyKTogZmllbGQgInByb2YiIGFkZGVkLgotCi0JKiBhbHBoYS5oIChQRFJfQklUUzFfUFJPRl8qKTogYWRkZWQsIG1hY3JvcyBmb3IgUERSX0JJVFMqX1JFU0VSVkVEXyoKLQl1cGRhdGVkIGFjY29yZGluZ2x5LgotCi1TdW4gSmFuIDE1IDE4OjM4OjMzIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiB3NjUuaDogTmV3IGZpbGUuCi0KLVdlZCBOb3YgMjMgMjI6NDM6MzggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogc2guaCAoU0hfQVJDSF9NQUdJQ19CSUcsIFNIX0FSQ0hfTUFHSUNfTElUVExFKTogTmV3LgotCShTSEJBRE1BRyk6IENoYW5nZWQgdG8gc3VpdC4KLQotVHVlIEp1bCAyNiAxNzo0NjowOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpOTYwLmggKEZfSTk2MEpYKTogTmV3IG1hY3JvLgotCi1XZWQgSnVsICA2IDAwOjQ4OjU3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogYWxwaGEuaDogIEFkZCBkZWZpbml0aW9ucyBmb3IgYWxwaGEgZmlsZSBoZWFkZXIgZmxhZ3MsIGVuY29kaW5nCi0JdGhlIG9iamVjdCB0eXBlIG9mIHRoZSBmaWxlLgotCi1Nb24gSnVuIDIwIDEzOjQ3OjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoZWNvZmZfc3dhcF90aXJfaW4pOiBSZW1vdmUgZGVjbGFyYXRpb24uCi0JKGVjb2ZmX3N3YXBfdGlyX291dCk6IExpa2V3aXNlLgotCShlY29mZl9zd2FwX3JuZHhfaW4sIGVjb2ZmX3N3YXBfcm5keF9vdXQpOiBMaWtld2lzZS4KLQkoc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXApOiBBZGQgbmV3IGZpZWxkczogc3dhcF90aXJfaW4sCi0Jc3dhcF9ybmR4X2luLCBzd2FwX3Rpcl9vdXQsIHN3YXBfcm5keF9vdXQsIHJlYWRfZGVidWdfaW5mby4KLQotU3VuIEp1biAxMiAwMzo1MTo1MiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHN5bWNvbnN0Lmg6ICBQaWNrIHVwIFNHSSBkZWZpbmUgZm9yIHN0SW5kaXJlY3QuCi0KLUZyaSBBcHIgMjIgMTM6MDU6MjggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChSRUdJTkZPKTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgZWNvZmZfcmVnaW5mbyk6IERvbid0IGRlZmluZS4KLQotCSogc2guaCAoU0hfQVJDSF9NQUdJQyk6IFJlbmFtZSBmcm9tIFNITUFHSUMuICBTSE1BR0lDIGlzIHVzZWQgYnkKLQlzZXZlcmFsIHRhcmdldHMgdG8gbWVhbiBhIHNoYXJlZCBsaWJyYXJ5LgotCShTSEJBRE1BRyk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi1UaHUgQXByIDE0IDEzOjAwOjUzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChSRUxPQ19CSVRTM19UWVBFX0JJRyk6IENoYW5nZWQgZnJvbSAweDFlIHRvIDB4M2UuCi0JKFJFTE9DX0JJVFMzX1RZUEVISV9MSVRUTEUpOiBEZWZpbmUuCi0JKFJFTE9DX0JJVFMzX1RZUEVISV9TSF9MSVRUTEUpOiBEZWZpbmUuCi0JKE1JUFNfUl9QQ1JFTDE2KTogQ2hhbmdlIHZhbHVlIGZyb20gOCB0byAxMiB0byBtYXRjaCBJcml4IDQuCi0JKE1JUFNfUl9SRUxISSk6IERlZmluZS4KLQkoTUlQU19SX1JFTExPKTogRGVmaW5lLgotCShNSVBTX1JfU1dJVENIKTogQ2hhbmdlIHZhbHVlIGZyb20gOSB0byAyMi4KLQotVGh1IEFwciAgNyAxNDoxOTozNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoTUlQU19SX1NXSVRDSCk6IERlZmluZS4KLQotVGh1IE1hciAzMSAxOToyODozMyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChpbnRlcm5hbF9hb3V0aGRyKTogQWRkZWQgY29tbWVudHMgZm9yIEFwb2xsbyBmaWVsZHMuCi0KLVRodSBNYXIgMzEgMTY6Mjg6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChTVFlQX0VDT0ZGX0xJQik6IERlZmluZSBhcyB1c2VkIG9uIElyaXggNC4KLQotRnJpIE1hciAyNSAxNzoxNjo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvKTogQWRkIGFkanVzdCBmaWVsZC4KLQkoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCk6IERlZmluZS4KLQotVHVlIE1hciAyMiAxMzoyMjo0NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoTUlQU19SX1BDUkVMMTYpOiBEZWZpbmUuCi0KLVNhdCBGZWIgMjYgMTA6MjY6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi5oOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MgZnJvbSBTVlI0IGNjLgotCi1Nb24gRmViIDIxIDA5OjQ4OjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBzeW0uaCAoc3RydWN0IHJ1bnRpbWVfcGRyKTogTWFrZSBmaWVsZCBhZHIgYmZkX3ZtYSwgbm90IHVuc2lnbmVkCi0JbG9uZy4KLQkoU1lNUik6IE1ha2UgZmllbGQgdmFsdWUgYmZkX3ZtYSwgbm90IGxvbmcuCi0KLUZyaSBGZWIgIDQgMjM6MzU6NTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByczYwMDAuaCAoU1RZUF9ERUJVRyk6IERlZmluZS4KLQotV2VkIEZlYiAgMiAxNDozMTozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKHVuaW9uIGludGVybmFsX2F1eGVudCk6IENoYW5nZSB4X2NzZWN0Lnhfc2NubGVuIGludG8KLQlhIHVuaW9uIG9mIGEgbG9uZyBhbmQgYSBwb2ludGVyIHRvIGEgc3ltYm9sLiAgWENPRkYgc29tZXRpbWVzIHVzZXMKLQl0aGlzIGZpZWxkIGFzIGEgc3ltYm9sIGluZGV4LgotCi1Nb24gSmFuIDEwIDIzOjU0OjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoZWNvZmZfZGVidWdfaW5mbyk6IFJlbW92ZSBmaWVsZHMgbGluZV9lbmQsCi0JZXh0ZXJuYWxfZG5yX2VuZCwgZXh0ZXJuYWxfcGRyX2VuZCwgZXh0ZXJuYWxfc3ltX2VuZCwKLQlleHRlcm5hbF9vcHRfZW5kLCBleHRlcm5hbF9hdXhfZW5kLCBzc19lbmQsIGV4dGVybmFsX2Zkcl9lbmQuCi0JUmVwbGFjZSBpZmRiYXNlIHdpdGggaWZkbWFwLgotCi1XZWQgSmFuICA1IDE3OjA1OjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChTVFlQX0VYVEVOREVTQywgU1RZUF9DT01NRU5ULCBTVFlQX1hEQVRBLCBTVFlQX1BEQVRBKToKLQlEZWZpbmUuCi0KLVdlZCBKYW4gIDUgMTY6NTg6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChOVU1fUkVMT0NfU0VDVElPTlMpOiBEZWZpbmUuCi0KLVR1ZSBEZWMgMjEgMDk6MjQ6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oIChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MpOiBSZW5hbWUgZmllbGQgcl9hZGRlbmQgdG8KLQlyX29mZnNldC4KLQotU2F0IERlYyAxMSAxNjoxMjozMiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoUl9ESVNQNywgUl9TSF9JTU0xNik6IE5ldyByZWxvYyB0eXBlcy4KLQotVHVlIE5vdiAyMyAxNDoyMzoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwKTogQWRkZWQgKl9lbmQgZmllbGRzIGZvciBhbGwKLQl0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24gcG9pbnRlcnMuCi0KLQkqIHN5bS5oOiBOYW1lZCB0aGUgRVhUUiBzdHJ1Y3R1cmUgZWNvZmZfZXh0ci4KLQotRnJpIE5vdiAxOSAwODoyMToxOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaCAoUkVMU1opOiBVc2UgY29ycmVjdCBzaXplLgotCi1XZWQgTm92IDE3IDE3OjE4OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyk6IERlZmluZS4KLQotVHVlIE5vdiAgMiAxNzo1Njo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwKTogRGVmaW5lLgotCi1UaHUgT2N0IDI4IDE3OjA3OjUwIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oIChJMzg2TFlOWE1BR0lDKTogUmVuYW1lIHRvIExZTlhDT0ZGTUFHSUMuCi0JKiBtNjhrLmggKExZTlhDT0ZGTUFHSUMpOiBEZWZpbmUuCi0JKiBzcGFyYy5oOiBOZXcgZmlsZS4KLQotVHVlIE9jdCAxOSAxNTozNDo1MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFscGhhLmggKGV4dGVybmFsX2FvdXRoZHIpOiBTcGxpdCBmb3VyIGJ5dGUgcGFkZGluZyBmaWVsZCBpbnRvCi0JdHdvIGJ5dGUgYmxkcmV2IGZpZWxkIGFuZCB0d28gYnl0ZSBwYWRkaW5nIGZpZWxkLgotCi0JKiBlY29mZi5oIChfTElUQSwgX1BEQVRBLCBfWERBVEEsIFNUWVBfTElUQSk6IERlZmluZWQuCi0KLVdlZCBPY3QgMTMgMTU6NTI6MzQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQlTdW4gT2N0IDEwIDE3OjI3OjEwIDE5OTMgIFRyb3kgUm9sbG8gKHRyb3lAY2JtZS51bnN3LmVkdS5hdSkKLQotCSogY29mZi9pbnRlcm5hbC5oOiBBZGRlZCBvX3NyaSwgb19pbmxpYiBhbmQgb192aWQgZm9yIEFwb2xsb3MKLQkJCWFzIHdlbGwgYXMgUl9ESVIxNi4KLQotCSogY29mZi9hcG9sbG8uaDogTmV3IGZpbGUKLQotTW9uIE9jdCAxMSAxNzoxNjo0OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKFJFR0lORk8sIHN0cnVjdCBlY29mZl9yZWdpbmZvKTogRGVmaW5lLgotCi1UdWUgT2N0ICA1IDEwOjUyOjUzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiByczYwMDAuaDogQ2hhbmdlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIGNvbW1lbnQgdG8gb2N0YWwKLQllc2NhcGVzLgotCi1UdWUgU2VwIDI4IDAzOjI3OjA0IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWNvZmYuaCAoX0ZJTkksIFNUWVBfRUNPRkZfRklOSSk6ICBBZGQgdG8gc3VwcG9ydCAuZmluaSBzZWN0aW9uLgotCi1GcmkgU2VwIDI0IDExOjUzOjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChCQURNQUcpOiBSZWNvZ25pemUgTUlQU19NQUdJQ19MSVRUTEUzIGFuZCBNSVBTX01BR0lDX0JJRzMuCi0JKiBlY29mZi5oOiBEZWZpbmUgTUlQU19NQUdJQ19MSVRUTEUzIGFuZCBNSVBTX01BR0lDX0JJRzMuCi0KLVRodSBTZXAgMjMgMjE6MDc6MTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoQkFETUFHKTogUmVjb2duaXplIE1JUFNfTUFHSUNfTElUVExFMiBhbmQgTUlQU19NQUdJQ19CSUcyLgotCSogZWNvZmYuaDogRGVmaW5lIE1JUFNfTUFHSUNfTElUVExFMiBhbmQgTUlQU19NQUdJQ19CSUcyLgotCi1UaHUgU2VwIDE2IDIwOjI3OjIxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogc3ltLmgsIHN5bWNvbnN0Lmg6IEFkZCBjb21tZW50IHN0YXRpbmcgdGhlc2UgZmlsZXMgYXJlIG5vdCBwYXJ0Ci0Jb2YgR0RCLCBHQVMsIGV0Yy4gIEluIDE5OTEsIHdoZW4gd2UgYXNrZWQgcm1zIHdoZXRoZXIgd2UgY291bGQKLQlpbmNsdWRlIHRoZXNlIGZpbGVzIGluIEdEQiAoYWx0aG91Z2ggdGhleSBhcmUgY29weXJpZ2h0ZWQgYnkKLQlzb21lb25lIGJlc2lkZXMgdGhlIEZTRiksIGhlIHNhaWQgaXQgd2FzIE9LIGlmIHRoZXkgd2VyZSBub3QKLQljb25zaWRlcmVkIHBhcnQgb2YgR0RCLgotCi1GcmkgU2VwIDEwIDE3OjQwOjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoQVVYX1BVVF9BTlkpOiBDYXN0IHZhbCBhcmd1bWVudCB0byBiZmRfdm1hLgotCi0JKiBhbHBoYS5jIChleHRlcm5hbF9hb3V0aGRyKTogTmVlZCBmb3VyIGJ5dGVzIG9mIHBhZGRpbmcgYmV0d2VlbgotCXZzdGFtcCBhbmQgdHNpemUuCi0KLVR1ZSBTZXAgIDcgMTQ6MjA6NDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChBVVhfR0VUX0FOWSwgQVVYX1BVVF9BTlkpOiBDaGFuZ2VkIHRvIHJlZmxlY3QgZnVydGhlcgotCWNoYW5nZSBpbiBiZmQgc3dhcHBpbmcgcm91dGluZSBuYW1lcy4KLQotVHVlIFNlcCAgNyAxMDoxNToxNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoQVVYX0dFVF9BTlkpOiBDaGFuZ2UgbmFtZSBvZiBfZG9fZ2V0YjMyIHRvIHJlZmxlY3QgYmZkCi0JY2hhbmdlcy4KLQotRnJpIEF1ZyAxMyAxNDozMDozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKFJFTE9DX1NFQ1RJT05fTk9ORSk6IERlZmluZS4KLQotVGh1IEF1ZyAxMiAxMToyNDo0MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFscGhhLmggKHN0cnVjdCBleHRlcm5hbF9yZWxvYyk6IEFkZCByX3N5bW5keCBmaWVsZC4KLQkoUkVMU1opOiBDb3JyZWN0LgotCShSRUxPQ19CSVRTKik6IENvcnJlY3QuCi0JKEFMUEhBX1JfKik6IERlZmluZS4KLQkqIGVjb2ZmLmggKFJFTE9DX1NFQ1RJT05fe1hEQVRBLFBEQVRBLEZJTkksTElUQSxBQlN9KTogRGVmaW5lLgotCShyX2V4dGVybik6IFVuZGVmaW5lLgotCSogaW50ZXJuYWwuaCAoc3RydWN0IGludGVybmFsX3JlbG9jKTogTWFrZSByX3ZhZGRyIGJmZF92bWEgcmF0aGVyCi0JdGhhbiBsb25nLiAgQWRkIHJfZXh0ZXJuIGZpZWxkLgotCi0JKiBhbHBoYS5oIChQRFJfQklUUyopOiBEZWZpbmUuCi0JKiBzeW0uaCAoUERSKTogR2l2ZSBjb3JyZWN0IG5hbWVzIHRvIG5ldyBmaWVsZHMuCi0KLQkqIGVjb2ZmLmg6IE1vdmVkIE1JUFMgcmVsb2MgZGVmaW5pdGlvbnMgZnJvbSBoZXJlLi4uCi0JKiBtaXBzLmg6IHRvIGhlcmUuCi0KLVR1ZSBBdWcgIDMgMTE6MTc6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhbHBoYS5oOiBDb3JyZWN0ZWQgZXh0ZXJuYWwgc3ltYm9saWMgZGVidWdnaW5nIHN0cnVjdHVyZXMgdG8KLQltYXRjaCBhY3R1YWwgdXNhZ2UuCi0JKiBpbnRlcm5hbC5oIChpbnRlcm5hbF9maWxlaGRyLCBpbnRlcm5hbF9hb3V0aGRyLAotCWludGVybmFsX3Njbmhkcik6IENoYW5nZWQgdHlwZSBvZiBzb21lIGZpZWxkcyB0byBiZmRfdm1hIHNvIHRoZXkKLQljYW4gaG9sZCA2NCBiaXRzLgotCSogc3ltLmggKEhEUlIsIEZEUiwgUERSLCBFWFRSKTogTGlrZXdpc2UuCi0JKFBEUik6IEFkZGVkIG5ldyBmaWVsZHMgZm91bmQgb24gQWxwaGEuCi0JKiBzeW1jb25zdC5oIChtYWdpY1N5bTIpOiBEZWZpbmU7IG5ldyB2YWx1ZSBmb3VuZCBvbiBBbHBoYS4KLQotCSogZWNvZmYuaDogTmV3IGZpbGUuCi0JKiBhbHBoYS5oLCBtaXBzLmg6IE1vdmVkIGNvbW1vbiBpbmZvcm1hdGlvbiBpbnRvIGVjb2ZmLmguICBNb3ZlZAotCWV4dGVybmFsIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBpbiBmcm9tIGVjb2ZmLWV4dC5oLgotCSogZWNvZmYtZXh0Lmg6IFJlbW92ZWQ7IGluZm9ybWF0aW9uIG5vdyBpbiBhbHBoYS5oIGFuZCBtaXBzLmguCi0KLVN1biBKdWwgMTggMjE6NDM6NTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IFJlY29nbml6ZSBJMzg2UFRYTUFHSUMuCi0KLUZyaSBKdWwgMTYgMDk6NTQ6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmggKE1JUFNfQU9VVF97T1p9TUFHSUMpOiBSZW5hbWVkIGZyb20ge09afU1BR0lDLgotCi1UaHUgSnVsIDE1IDEyOjIzOjU1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbTg4ay5oICh1bmlvbiBleHRlcm5hbF9hdXhlbnQpOiBNb3ZlIHhfZmNuIGJhY2sgaW5zaWRlIHhfZmNuYXJ5LgotCSh7R0VULFBVVH1fRkNOX3tMTk5PUFRSLEVORE5EWH0pOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0KLVN1biBKdWwgMTEgMTg6MDA6MTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogRGVmaW5lIE1DNjhLQkNTTUFHSUMuCi0KLVRodSBKdW4gMTAgMTE6NDY6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmggKF9JTklULCBTVFlQX01JUFNfSU5JVCk6IERlZmluZSAodXNlZCBvbiBJcml4NCkuCi0JKFNUWVBfT1RIRVJfTE9BRCk6IERlZmluZSBhcyBTVFlQX01JUFNfSU5JVC4KLQotV2VkIEp1biAgOSAxNTowOTowOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoT01BR0lDKTogRGVmaW5lLgotCi1Nb24gQXByIDI2IDE4OjA0OjQ3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oLCBzaC5oOiBTdXBwb3J0IGZvciBTSC4KLQotU2F0IEFwciAyNCAyMTozNDo1OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogYTI5ay5oOiBEZWZpbmUgX0xJVC4KLQotRnJpIEFwciAyMyAxODo0MToyMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYWxwaGEuaDogTmV3IGZpbGUuCi0KLVRodSBBcHIgIDggMTI6MzY6MzQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChDX1NIQURPVywgQ19WRVJTSU9OKTogQ29waWVkIGluIGZyb20gbTg4ay5oLgotCSogbTg4ay5oLCBpMzg2LmgsIHdlMzJrLmg6IERvbid0IGRlZmluZSBhbGwgdGhlIHN0b3JhZ2UgY2xhc3NlczsKLQl0aGV5J3JlIGFscmVhZHkgaW4gaW50ZXJuYWwuaC4KLQotV2VkIEFwciAgNyAxMTo1MToyNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogQ2hhbmdlIG5fc2NsYXNzIHRvIHVuc2lnbmVkIGNoYXIuCi0JQ2hhbmdlIENfRUZDTiB0byAweGZmLCBjaGFuZ2UgUlMvNjAwMCBkYnggc3ltYm9scwotCXRvIG5vIGxvbmdlciBiZSBzaWduZWQuCi0KLUZyaSBNYXIgMTkgMTQ6NTI6NTYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IEFkZCBIOC81MDAgcmVsb2MgdHlwZXMuCi0KLVdlZCBNYXIgMTcgMDk6NDY6MDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi1leHQuaCAoQVVYX1BVVF9BTlkpOiBEb24ndCB1c2Ugdm9pZCB2YWx1ZXMgaW4gYnJhbmNoZXMgb2YKLQljb25kaXRpb25hbCBleHByZXNzaW9uLgotCi1UaHUgTWFyICA0IDE0OjEyOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0LmggKEFVWF9HRVRfKik6IFJld3JvdGUgdG8gdXNlIG5ldyBtYWNybyBBVVhfR0VUX0FOWS4KLQkoQVVYX1BVVF8qKTogTmV3IG1hY3JvcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBBVVhfR0VUIG1hY3Jvcy4KLQkoZWNvZmZfc3dhcF90aXJfb3V0KTogQWRkZWQgcHJvdG90eXBlLgotCi0JKiBtaXBzLmggKE5fQlRNQVNLLCBOX1RNQVNLLCBOX0JUU0hGVCwgTl9UU0hJRlQpOiBEZWZpbmU7IHRoZXNlCi0JYXJlIG5lZWRlZCB0byBpbnRlcnByZXQgZ2NjIGRlYnVnZ2luZyBvdXRwdXQuCi0KLVR1ZSBGZWIgIDkgMDc6NDM6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB3ZTMyay5oIChCVFlQRSwgSVNQVFIsIElTRkNOLCBJU0FSWSwgREVDUkVGKTogUmVtb3ZlZAotCW1vcmUgZGVmaW5pdGlvbnMgZHVwbGljYXRlZCBpbiBpbnRlcm5hbC5oLgotCi1XZWQgRmViICAzIDA5OjE4OjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChSRUxPQ19CSVRTM19UWVBFXyopOiBDb3JyZWN0IGZvciBiaWcgZW5kaWFuIG1hY2hpbmVzLgotCi1Nb24gSmFuIDI1IDExOjM1OjUxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoaW50ZXJuYWxfYW91dGhkcik6IEFkZGVkIGFkZGl0aW9uYWwgZmllbGRzIHVzZWQgb25seQotCWJ5IE1JUFMgRUNPRkYuCi0KLVRodSBKYW4gMjEgMTA6Mjg6MzggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmggKEFPVVRIRFIpOiBBZGRlZCBhZGRpdGlvbmFsIGZpZWxkcyB1c2VkIGJ5IEVDT0ZGLgotCi1UdWUgSmFuIDE5IDEyOjIxOjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oLCB3ZTMyay5oIChOXyosIFRfKiwgRFRfKik6IFJlbW92ZWQgc3RpbGwgbW9yZSBkZWZpbml0aW9ucwotCWR1cGxpY2F0ZWQgaW4gaW50ZXJuYWwuaC4KLQotCSogbWlwcy5oIChSRUxPQ19TRUNUSU9OXyosIEVDT0ZGX1JfKik6IERlZmluZWQgY29uc3RhbnRzIGZvciBFQ09GRgotCXJlbG9jcy4KLQotRnJpIEphbiAxNSAxODoxNzowMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLWV4dC5oOiBBZGRlZCBwcm90b3R5cGVzIGZvciBuZXcgRUNPRkYgc3dhcHBpbmcgZnVuY3Rpb25zLgotCShvcHRfZXh0KTogTmV3IHN0cnVjdHVyZS4KLQkqIG1pcHMuaCAoWk1BR0lDKTogRGVmaW5lZCB0byBiZSAwNDEzLgotCShfTElCKTogRGVmaW5lZCB0byBiZSAiLmxpYiIKLQkoZXh0ZXJuYWxfcmVsb2MpOiBNSVBTIEVDT0ZGIHJlbG9jcyBhcmUgb25seSA4IGJ5dGVzLiAgQWRkZWQKLQltYWNyb3MgdG8gYWlkIGluIHN3YXBwaW5nLgotCi1GcmkgSmFuICA4IDE2OjE5OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0Lmg6IEFkZGVkIHByb3RvdHlwZXMgZm9yIEVDT0ZGIHN3YXBwaW5nIGZ1bmN0aW9ucy4KLQkqIGludGVybmFsLmggKGludGVybmFsX3Njbmhkcik6IEFsd2F5cyBwcm92aWRlIHNfYWxpZ24gZmllbGQsIG5vdAotCWp1c3Qgb24gaTk2MC4KLQkoaW50ZXJuYWxfcmVsb2MpOiBBbHdheXMgcHJvdmlkZSByX3NpemUgZmllbGQsIG5vdCBqdXN0IG9uCi0JUlMvNjAwMC4KLQkqIG1pcHMuaCAoX1JEQVRBLCBfU0RBVEEsIF9TQlNTLCBfTElUNCwgX0xJVDgsIFNUWVBfUkRBVEEsCi0JU1RZUF9TREFUQSwgU1RZUF9TQlNTLCBTVFlQX0xJVDQsIFNUWVBfTElUOCk6IERlZmluZWQuCi0JKENPREVfTUFTSywgTUlQU19JU19TVEFCLCBNSVBTX01BUktfU1RBQiwgTUlQU19VTk1BUktfU1RBQiwKLQlTVEFCU19TWU1CT0wpOiBNb3ZlZCBpbiBmcm9tIGdkYi9taXBzcmVhZC5jLgotCi1XZWQgSmFuICA2IDE0OjAxOjQ2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oLCB3ZTMyay5oOiByZW1vdmVkIFNUWVBfKiBkZWZpbmVzLCBzaW5jZSB0aGV5IGR1cGxpY2F0ZWQKLQl0aG9zZSBpbiBpbnRlcm5hbC5oLgotCi1UdWUgRGVjIDI5IDE1OjQwOjA3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBkZWZpbmUgSTM4NkFJWE1BR0lDIGZvciBEYW5idXJ5IEFJWCBQUy8yIGNvbXBpbGVyLgotCi1TYXQgRGVjIDEyIDE2OjA3OjU3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBkb24ndCBkZWZpbmUgQlRZUEUsIElTUFRSLCBJU0ZDTiwgSVNBUlksIERFQ1JFRjogdGhleQotCWFyZSBkZWZpbmVkIGluIGludGVybmFsLmguCi0KLVRodSBOb3YgMTIgMDk6NTI6MDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IChpbnRlcm5hbF9yZWxvYyk6IHJfb2Zmc2V0IGlzIG5vdyBhIGxvbmcuCi0JKiB6OGsuaDogc2xpZ2h0IGNvbW1lbnQgZW5oYW5jZW1lbnQKLQotV2VkIFNlcCAzMCAwNzo0NjowOCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogY2hhbmdlZCB6OGsgcmVsb2MgdHlwZXMKLQotRnJpIEF1ZyAyOCAxMDoxNjozMSAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQotCi0JKiB3ZTMyay5oOiBuZXcgZmlsZQotCi1UaHUgQXVnIDI3IDEzOjAwOjAxIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGN5Z251cy5jb20pCi0KLQkqIHN5bWNvbnN0Lmg6IGNvbW1lbnQgb3V0IGNydWZ0IGF0IHRoZSBlbmQgb2YgI2VuZGlmCi0KLVR1ZSBBdWcgMjUgMTU6MDY6NDkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IGFkZGVkICNkZWZpbmUgZm9yIFNUWVBfTElULCByZW1vdmVkIGZyb20gYTI5ayBhbmQKLQloODMwMC4KLQotCSogejhrLmg6IGFkZGVkIHo4MDAwIHN1cHBvcnQKLQotVGh1IEp1bCAxNiAxNjozMjowMCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogYWRkZWQgUl9SRUxMT05HX05FRyByZWxvYyB0eXBlCi0KLUZyaSBKdW4gMTIgMjA6MTE6MDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN5bWNvbnN0Lmg6ICBGaXggdW50ZXJtaW5hdGVkIGNvbW1lbnQuCi0KLVdlZCBKdW4gMTAgMDc6NTc6NDkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogYS5vdXQgbWFnaWMgbnVtYmVycyBmcm9tCi0JbW9ocmluZ0BpbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlCi0KLU1vbiBKdW4gIDggMjA6MTM6MzMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLWV4dC5oLCBtaXBzLmg6ICBVc2UgdW5zaWduZWQgY2hhcnMgZXZlcnl3aGVyZS4KLQkoU3VnZ2VzdGVkIGJ5IEFudHRpIE1pZXR0aW5lbi4pCi0KLVR1ZSBBcHIgMTQgMTU6MTg6NDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN5bS5oOiAgQWRkIGNvbW1lbnRzLgotCSogc3ltY29uc3QuaDogIE1lcmdlIHdpdGggRnJlZCdzIGNoYW5nZXMuCi0KLVR1ZSBBcHIgMTQgMTQ6MzA6MDUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHN5bWNvbnN0Lmg6ICBQaWNrIHVwIFNHSSBkZWZpbmVzIGZvciBzdFN0cnVjdCwgc3RVbmlvbiwgc3RFbnVtLAotCWxhbmdDcGx1c3BsdXMsIGFuZCBsYW5nQ3BsdXNwbHVzVjIuCi0KLVRodSBBcHIgIDIgMTk6NDc6NDMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN5bS5oLCBzeW1jb25zdC5oOiAgTUlQUyBoYXMgcHJvdmlkZWQgcmVkaXN0cmlidXRhYmxlIHZlcnNpb25zCi0Jb2YgdGhlc2UgZmlsZXMuICBUaGFua3MhCi0JKiBlY29mZi1leHQuaDogIEFkZCB3ZWFrZXh0IGJpdCB0byBtYXRjaCBuZXcgc3ltLmguCi0KLUZyaSBNYXIgIDYgMDA6MTA6NDYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLWV4dC5oOiAgQWRkIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvcnMuCi0KLVRodSBGZWIgMjcgMTE6NTM6MDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLWV4dC5oOiAgTmV3IGZpbGUgZm9yIGV4dGVybmFsIChpbi1maWxlKSBmb3JtIG9mIGVjb2ZmCi0Jc3ltYm9sIHN0cnVjdHVyZXMuCi0KLVRodSBGZWIgIDYgMTE6MzM6MzIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6IG1hZGUgdGhlIGV4dGVybmFsX2xpbmVubyBsX2xubm8gZmllbGQgNCBieXRlcyB3aWRlLgotCWFuZGRlZCBHRVQvUFVUX0xJTkVOT19MTk5PIG1hY3JvcwotCi1TYXQgTm92IDMwIDIwOjM4OjM1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBDaGFuZ2VMb2csIGEyOWsuaCwgaDgzMDAuaCwgaTM4Ni5oLCBpOTYwLmgsIGludGVybmFsLmgsIG02OGsuaCwKLQltODhrLmgsIG1pcHMuaCwgcnM2MDAwLmg6IG1vdmUgZnJvbSBhYm92ZSBjb2ZmLTxmb28+LmgKLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2EyOWsuaCBiL2luY2x1ZGUvY29mZi9hMjlrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjM2E2NDYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2EyOWsuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKiBDT0ZGIHNwZWMgZm9yIEFNRCAyOTAqMCAKLSAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIFdvb2QgQCBOZXcgWW9yayBVbml2ZXJzaXR5LgotICovCi0gCi0jaWZuZGVmIEFNRAotIyBkZWZpbmUgQU1ECi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0qKiBGaWxlIEhlYWRlciBhbmQgcmVsYXRlZCBkZWZpbml0aW9ucwotKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLXsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJICovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJICAgKi8KLQljaGFyIGZfdGltZGF0WzRdOyAgICAgICAvKiB0aW1lICYgZGF0ZSBzdGFtcAkgICAgKi8KLQljaGFyIGZfc3ltcHRyWzRdOyAgICAgICAvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiICAgICAgICovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMgICAgICovCi0JY2hhciBmX29wdGhkclsyXTsgICAgICAgLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJICovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lIEZJTEhEUiAgc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUgRklMSFNaCTIwCi0KLS8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwotCi0vKgotKiogTWFnaWMgbnVtYmVycyBmb3IgQW0yOTAwMCAKLSoqCShBVCZUIHdpbGwgYXNzaWduIHRoZSAicmVhbCIgbWFnaWMgbnVtYmVyKSAgCi0qLwotCi0jZGVmaW5lIFNJUEZCT01BR0lDICAgICAwNTcyICAgIC8qIEFtMjkwMDAgKEJ5dGUgMCBpcyBNU0IpICovCi0jZGVmaW5lIFNJUFJCT01BR0lDICAgICAwNTczICAgIC8qIEFtMjkwMDAgKEJ5dGUgMCBpcyBMU0IpICovCi0KLQotI2RlZmluZSBBMjlLX01BR0lDX0JJRyAJCVNJUEZCT01BR0lDCQotI2RlZmluZSBBMjlLX01BR0lDX0xJVFRMRQlTSVBSQk9NQUdJQwkKLSNkZWZpbmUgQTI5S0JBRE1BRyh4KSAJKCgoeCkuZl9tYWdpYyE9QTI5S19NQUdJQ19CSUcpICYmIFwKLQkJCSAgKCh4KS5mX21hZ2ljIT1BMjlLX01BR0lDX0xJVFRMRSkpCi0KLSNkZWZpbmUgT01BR0lDIEEyOUtfTUFHSUNfQklHCi0vKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KLQotLyoKLSoqIEZpbGUgaGVhZGVyIGZsYWdzIGN1cnJlbnRseSBrbm93biB0byB1cy4KLSoqCi0qKiBBbTI5MDAwIHdpbGwgdXNlIHRoZSBGX0FSMzJXUiBhbmQgRl9BUjMyVyBmbGFncyB0byBpbmRpY2F0ZQotKiogdGhlIGJ5dGUgb3JkZXJpbmcgaW4gdGhlIGZpbGUuCi0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSoqIE9wdGlvbmFsIChhLm91dCkgaGVhZGVyIAotKi8KLQotdHlwZWRlZglzdHJ1Y3QgZXh0ZXJuYWxfYW91dGhkciAKLXsKLSAgY2hhciAgbWFnaWNbMl07CSAgICAgICAvKiB0eXBlIG9mIGZpbGUJCQkgKi8KLSAgY2hhciAgdnN0YW1wWzJdOwkgICAgICAvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhciAgdHNpemVbNF07CSAgICAgICAvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhciAgZHNpemVbNF07CSAgICAgICAvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIgIGJzaXplWzRdOwkgICAgICAgLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCSAgICAgKi8KLSAgY2hhciAgZW50cnlbNF07CSAgICAgICAvKiBlbnRyeSBwdC4JCQkgICAgKi8KLSAgY2hhciAgdGV4dF9zdGFydFs0XTsJICAvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgIGRhdGFfc3RhcnRbNF07CSAgLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfSBBT1VUSERSOwotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotLyogYW91dGhkciBtYWdpYyBudW1iZXJzICovCi0jZGVmaW5lIE5NQUdJQwkJMDQxMAkvKiBzZXBhcmF0ZSBpL2QgZXhlY3V0YWJsZSAqLwotI2RlZmluZSBTSE1BR0lDCTA0MDYJCS8qIE5ZVS9VbHRyYTMgc2hhcmVkIGRhdGEgZXhlY3V0YWJsZSAKLQkJCQkgICAod3JpdGFibGUgdGV4dCkgKi8KLQotI2RlZmluZSBfRVRFWFQgICAJIl9ldGV4dCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0qKiBTZWN0aW9uIGhlYWRlciBhbmQgcmVsYXRlZCBkZWZpbml0aW9ucwotKi8KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciAKLXsKLQljaGFyCSAgICBzX25hbWVbOF07ICAgICAgLyogc2VjdGlvbiBuYW1lCQkgKi8KLQljaGFyCSAgICBzX3BhZGRyWzRdOyAgICAgLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCSAgICBzX3ZhZGRyWzRdOyAgICAgLyogdmlydHVhbCBhZGRyZXNzCSAgICAgICovCi0JY2hhcgkgICAgc19zaXplWzRdOyAgICAgIC8qIHNlY3Rpb24gc2l6ZQkJICovCi0JY2hhcgkgICAgc19zY25wdHJbNF07ICAgIC8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkgICAgc19yZWxwdHJbNF07ICAgIC8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24gICAgICAgKi8KLQljaGFyCSAgICBzX2xubm9wdHJbNF07ICAgLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzICAgICAqLwotCWNoYXIJICAgIHNfbnJlbG9jWzJdOyAgICAvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JY2hhcgkgICAgc19ubG5ub1syXTsgICAgIC8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCSAgICBzX2ZsYWdzWzRdOyAgICAgLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0CWV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUICAgIi50ZXh0IgotI2RlZmluZSBfREFUQSAgICIuZGF0YSIKLSNkZWZpbmUgX0JTUyAgICAiLmJzcyIKLSNkZWZpbmUgX0xJVAkiLmxpdCIKLQotLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCi0KLS8qCi0qKiBTZWN0aW9uIHR5cGVzIC0gd2l0aCBhZGRpdGlvbmFsIHNlY3Rpb24gdHlwZSBmb3IgZ2xvYmFsIAotKiogcmVnaXN0ZXJzIHdoaWNoIHdpbGwgYmUgcmVsb2NhdGFibGUgZm9yIHRoZSBBbTI5MDAwLgotKioKLSoqIEluIGluc3RhbmNlcyB3aGVyZSBpdCBpcyBuZWNlc3NhcnkgZm9yIGEgbGlua2VyIHRvIHByb2R1Y2UgYW4KLSoqIG91dHB1dCBmaWxlIHdoaWNoIGNvbnRhaW5zIHRleHQgb3IgZGF0YSBub3QgYmFzZWQgYXQgdmlydHVhbAotKiogYWRkcmVzcyAwLCBlLmcuIGZvciBhIFJPTSwgdGhlbiB0aGUgbGlua2VyIHNob3VsZCBhY2NlcHQKLSoqIGFkZHJlc3MgYmFzZSBpbmZvcm1hdGlvbiBhcyBjb21tYW5kIGlucHV0IGFuZCB1c2UgUEFEIHNlY3Rpb25zCi0qKiB0byBza2lwIG92ZXIgdW51c2VkIGFkZHJlc3Nlcy4KLSovCi0KLSNkZWZpbmUJU1RZUF9CU1NSRUcJMHgxMjAwCS8qIEdsb2JhbCByZWdpc3RlciBhcmVhIChsaWtlIFNUWVBfSU5GTykgKi8KLSNkZWZpbmUgU1RZUF9FTlZJUgkweDIyMDAJLyogRW52aXJvbm1lbnQgKGxpa2UgU1RZUF9JTkZPKSAqLwotI2RlZmluZSBTVFlQX0FCUwkweDQwMDAJLyogQWJzb2x1dGUgKGFsbG9jYXRlZCwgbm90IHJlbG9jLCBsb2FkZWQpICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotKiogUmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBkZWNsYXJhdGlvbiBhbmQgcmVsYXRlZCBkZWZpbml0aW9ucwotKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwkvKiAodmlydHVhbCkgYWRkcmVzcyBvZiByZWZlcmVuY2UgKi8KLSAgY2hhciByX3N5bW5keFs0XTsJLyogaW5kZXggaW50byBzeW1ib2wgdGFibGUgKi8KLSAgY2hhciByX3R5cGVbMl07CS8qIHJlbG9jYXRpb24gdHlwZSAqLwotfTsKLQotI2RlZmluZQlSRUxPQwkJc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lCVJFTFNaCQkxMAkJLyogc2l6ZW9mIChSRUxPQykgKi8gCi0KLS8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwotCi0vKgotKiogUmVsb2NhdGlvbiB0eXBlcyBmb3IgdGhlIEFtMjkwMDAgCi0qLwotCi0jZGVmaW5lCVJfQUJTCQkwCS8qIHJlZmVyZW5jZSBpcyBhYnNvbHV0ZSAqLwotIAotI2RlZmluZQlSX0lSRUwJCTAzMAkvKiBpbnN0cnVjdGlvbiByZWxhdGl2ZSAoam1wL2NhbGwpICovCi0jZGVmaW5lCVJfSUFCUwkJMDMxCS8qIGluc3RydWN0aW9uIGFic29sdXRlIChqbXAvY2FsbCkgKi8KLSNkZWZpbmUJUl9JTE9IQUxGCTAzMgkvKiBpbnN0cnVjdGlvbiBsb3cgaGFsZiAgKGNvbnN0KSAgKi8KLSNkZWZpbmUJUl9JSElIQUxGCTAzMwkvKiBpbnN0cnVjdGlvbiBoaWdoIGhhbGYgKGNvbnN0aCkgcGFydCAxICovCi0jZGVmaW5lCVJfSUhDT05TVAkwMzQJLyogaW5zdHJ1Y3Rpb24gaGlnaCBoYWxmIChjb25zdGgpIHBhcnQgMiAqLwotCQkJCS8qIGNvbnN0YW50IG9mZnNldCBvZiBSX0lISUhBTEYgcmVsb2NhdGlvbiAqLwotI2RlZmluZQlSX0JZVEUJCTAzNQkvKiByZWxvY2F0YWJsZSBieXRlIHZhbHVlICovCi0jZGVmaW5lIFJfSFdPUkQJCTAzNgkvKiByZWxvY2F0YWJsZSBoYWxmd29yZCB2YWx1ZSAqLwotI2RlZmluZSBSX1dPUkQJCTAzNwkvKiByZWxvY2F0YWJsZSB3b3JkIHZhbHVlICovCi0KLSNkZWZpbmUJUl9JR0xCTFJDCTA0MAkvKiBpbnN0cnVjdGlvbiBnbG9iYWwgcmVnaXN0ZXIgUkMgKi8KLSNkZWZpbmUJUl9JR0xCTFJBCTA0MQkvKiBpbnN0cnVjdGlvbiBnbG9iYWwgcmVnaXN0ZXIgUkEgKi8KLSNkZWZpbmUJUl9JR0xCTFJCCTA0MgkvKiBpbnN0cnVjdGlvbiBnbG9iYWwgcmVnaXN0ZXIgUkIgKi8KLSAKLS8qCi1OT1RFOgotQWxsIHRoZSAiSSIgZm9ybXMgcmVmZXIgdG8gMjkwMDAgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4gIFRoZSBsaW5rZXIgaXMgCi1leHBlY3RlZCB0byBrbm93IGhvdyB0aGUgbnVtZXJpYyBpbmZvcm1hdGlvbiBpcyBzcGxpdCBhbmQvb3IgYWxpZ25lZAotd2l0aGluIHRoZSBpbnN0cnVjdGlvbiB3b3JkKHMpLiAgUl9CWVRFIHdvcmtzIGZvciBpbnN0cnVjdGlvbnMsIHRvby4KLQotSWYgdGhlIHBhcmFtZXRlciB0byBhIENPTlNUSCBpbnN0cnVjdGlvbiBpcyBhIHJlbG9jYXRhYmxlIHR5cGUsIHR3byAKLXJlbG9jYXRpb24gcmVjb3JkcyBhcmUgd3JpdHRlbi4gIFRoZSBmaXJzdCBoYXMgYW4gcl90eXBlIG9mIFJfSUhJSEFMRiAKLSgzMyBvY3RhbCkgYW5kIGEgbm9ybWFsIHJfdmFkZHIgYW5kIHJfc3ltbmR4LiAgVGhlIHNlY29uZCByZWxvY2F0aW9uIAotcmVjb3JkIGhhcyBhbiByX3R5cGUgb2YgUl9JSENPTlNUICgzNCBvY3RhbCksIGEgbm9ybWFsIHJfdmFkZHIgKHdoaWNoIAotaXMgcmVkdW5kYW50KSwgYW5kIGFuIHJfc3ltbmR4IGNvbnRhaW5pbmcgdGhlIDMyLWJpdCBjb25zdGFudCBvZmZzZXQgCi10byB0aGUgcmVsb2NhdGlvbiBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgc3ltYm9sIHRhYmxlIGluZGV4LiAgVGhpcyAKLXNlY29uZCByZWNvcmQgaXMgYWx3YXlzIHdyaXR0ZW4sIGV2ZW4gaWYgdGhlIGNvbnN0YW50IG9mZnNldCBpcyB6ZXJvLgotVGhlIGNvbnN0YW50IGZpZWxkcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIHNldCB0byB6ZXJvLgotKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0qKiBMaW5lIG51bWJlciBlbnRyeSBkZWNsYXJhdGlvbiBhbmQgcmVsYXRlZCBkZWZpbml0aW9ucwotKi8KLQotc3RydWN0IGV4dGVybmFsX2xpbmVubyAKLXsKLSAgIHVuaW9uIHsKLQkgY2hhciBsX3N5bW5keFs0XTsgLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JIGNoYXIgbF9wYWRkcls0XTsgIC8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlciAgICAqLwotICAgfSBsX2FkZHI7Ci0gICBjaGFyIGxfbG5ub1syXTsgCS8qIGxpbmUgbnVtYmVyCSAgKi8KLX07Ci0KLSNkZWZpbmUJTElORU5PCQlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgkJNgkJLyogc2l6ZW9mIChMSU5FTk8pICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotKiogU3ltYm9sIGVudHJ5IGRlY2xhcmF0aW9uIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCi0qLwotCi0jZGVmaW5lCUVfU1lNTk1MRU4JOAkvKiBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1ogCTE4Ci0KLS8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwotCi0vKgotKiogU3RvcmFnZSBjbGFzcyBkZWZpbml0aW9ucyAtIG5ldyBjbGFzc2VzIGZvciBnbG9iYWwgcmVnaXN0ZXJzLgotKi8KLQotI2RlZmluZSBDX0dMQkxSRUcJMTkJCS8qIGdsb2JhbCByZWdpc3RlciAqLwotI2RlZmluZSBDX0VYVFJFRwkyMAkJLyogZXh0ZXJuYWwgZ2xvYmFsIHJlZ2lzdGVyICovCi0jZGVmaW5lCUNfREVGUkVHCTIxCQkvKiBleHQuIGRlZi4gb2YgZ2xvYmFsIHJlZ2lzdGVyICovCi0KLQotLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCi0KLS8qCi0qKiBEZXJpdmVkIHN5bWJvbCBtYXNrL3NoaWZ0cy4KLSovCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX1RTSElGVAkoMikKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0qKiBBdXhpbGlhcnkgc3ltYm9sIHRhYmxlIGVudHJ5IGRlY2xhcmF0aW9uIGFuZCByZWxhdGVkIAotKiogZGVmaW5pdGlvbnMuCi0qLwotCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQgICAgICAvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJICAqLwotI2RlZmluZSBFX0RJTU5VTSAgCTQgICAgICAgLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07ICAgICAgIC8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsgIC8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsgICAvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCSAgICAgICAvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOyAgICAgICAvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOyAgICAgICAvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOyAgICAgICAvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07ICAgICAvKiB0diByYW5nZSAqLwotCX0geF90djsJIC8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLX07Ci0KLSNkZWZpbmUJQVVYRU5UCQl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCQkxOAkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9hbHBoYS5oIGIvaW5jbHVkZS9jb2ZmL2FscGhhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NmNiY2IuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2FscGhhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyogRUNPRkYgc3VwcG9ydCBvbiBBbHBoYSBtYWNoaW5lcy4KLSAgIGNvZmYvZWNvZmYuaCBtdXN0IGJlIGluY2x1ZGVkIGJlZm9yZSB0aGlzIGZpbGUuICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0gIHVuc2lnbmVkIGNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLSAgdW5zaWduZWQgY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfc3ltcHRyWzhdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qIE1hZ2ljIG51bWJlcnMgYXJlIGRlZmluZWQgaW4gY29mZi9lY29mZi5oLiAgKi8KLSNkZWZpbmUgQUxQSEFfRUNPRkZfQkFETUFHKHgpIFwKLSAgKCh4KS5mX21hZ2ljICE9IEFMUEhBX01BR0lDICYmICh4KS5mX21hZ2ljICE9IEFMUEhBX01BR0lDX0JTRCkKLQotLyogVGhlIG9iamVjdCB0eXBlIGlzIGVuY29kZWQgaW4gdGhlIGZfZmxhZ3MuICAqLwotI2RlZmluZSBGX0FMUEhBX09CSkVDVF9UWVBFX01BU0sJMHgzMDAwCi0jZGVmaW5lIEZfQUxQSEFfTk9fU0hBUkVECQkweDEwMDAKLSNkZWZpbmUgRl9BTFBIQV9TSEFSQUJMRQkJMHgyMDAwCi0jZGVmaW5lIEZfQUxQSEFfQ0FMTF9TSEFSRUQJCTB4MzAwMAotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjQKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IGV4dGVybmFsX2FvdXRoZHIKLXsKLSAgdW5zaWduZWQgY2hhciBtYWdpY1syXTsJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdnN0YW1wWzJdOwkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgdW5zaWduZWQgY2hhciBibGRyZXZbMl07CS8qID8/ICovCi0gIHVuc2lnbmVkIGNoYXIgcGFkZGluZ1syXTsJLyogcGFkIHRvIHF1YWR3b3JkIGJvdW5kYXJ5CQkqLwotICB1bnNpZ25lZCBjaGFyCXRzaXplWzhdOwkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMJCQkqLwotICB1bnNpZ25lZCBjaGFyCWRzaXplWzhdOwkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIHVuc2lnbmVkIGNoYXIJYnNpemVbOF07CS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgdW5zaWduZWQgY2hhcgllbnRyeVs4XTsJLyogZW50cnkgcHQuCQkJCSovCi0gIHVuc2lnbmVkIGNoYXIgdGV4dF9zdGFydFs4XTsJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyIGRhdGFfc3RhcnRbOF07CS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhciBic3Nfc3RhcnRbOF07CS8qIGJhc2Ugb2YgYnNzIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyIGdwcm1hc2tbNF07CS8qIGJpdG1hc2sgb2YgZ2VuZXJhbCByZWdpc3RlcnMgdXNlZCAqLwotICB1bnNpZ25lZCBjaGFyIGZwcm1hc2tbNF07CS8qIGJpdG1hc2sgb2YgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIHVzZWQgKi8KLSAgdW5zaWduZWQgY2hhciBncF92YWx1ZVs4XTsJLyogdmFsdWUgZm9yIGdwIHJlZ2lzdGVyICovCi19IEFPVVRIRFI7Ci0KLS8qIGNvbXB1dGUgc2l6ZSBvZiBhIGhlYWRlciAqLwotCi0jZGVmaW5lIEFPVVRTWiA4MAotI2RlZmluZSBBT1VUSERSU1ogODAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0gIHVuc2lnbmVkIGNoYXIJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotICB1bnNpZ25lZCBjaGFyCXNfcGFkZHJbOF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0gIHVuc2lnbmVkIGNoYXIJc192YWRkcls4XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotICB1bnNpZ25lZCBjaGFyCXNfc2l6ZVs4XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLSAgdW5zaWduZWQgY2hhcglzX3NjbnB0cls4XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzX3JlbHB0cls4XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotICB1bnNpZ25lZCBjaGFyCXNfbG5ub3B0cls4XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0gIHVuc2lnbmVkIGNoYXIJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgY2hhcglzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIHVuc2lnbmVkIGNoYXIJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNjQKLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIHVuc2lnbmVkIGNoYXIgcl92YWRkcls4XTsKLSAgdW5zaWduZWQgY2hhciByX3N5bW5keFs0XTsKLSAgdW5zaWduZWQgY2hhciByX2JpdHNbNF07Ci19OwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCi0vKiBDb25zdGFudHMgdG8gdW5wYWNrIHRoZSByX2JpdHMgZmllbGQuICBUaGUgQWxwaGEgc2VlbXMgdG8gYWx3YXlzIGJlCi0gICBsaXR0bGUgZW5kaWFuLCBzbyBJIGhhdmVuJ3QgYm90aGVyZWQgdG8gZGVmaW5lIGJpZyBlbmRpYW4gdmFyaWFudHMKLSAgIG9mIHRoZXNlLiAgKi8KLQotI2RlZmluZSBSRUxPQ19CSVRTMF9UWVBFX0xJVFRMRQkJCTB4ZmYKLSNkZWZpbmUgUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUJCTAKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9FWFRFUk5fTElUVExFCQkweDAxCi0KLSNkZWZpbmUgUkVMT0NfQklUUzFfT0ZGU0VUX0xJVFRMRQkJMHg3ZQotI2RlZmluZSBSRUxPQ19CSVRTMV9PRkZTRVRfU0hfTElUVExFCQkxCi0KLSNkZWZpbmUgUkVMT0NfQklUUzFfUkVTRVJWRURfTElUVExFCQkweDgwCi0jZGVmaW5lIFJFTE9DX0JJVFMxX1JFU0VSVkVEX1NIX0xJVFRMRQkJNwotI2RlZmluZSBSRUxPQ19CSVRTMl9SRVNFUlZFRF9MSVRUTEUJCTB4ZmYKLSNkZWZpbmUgUkVMT0NfQklUUzJfUkVTRVJWRURfU0hfTEVGVF9MSVRUTEUJMQotI2RlZmluZSBSRUxPQ19CSVRTM19SRVNFUlZFRF9MSVRUTEUJCTB4MDMKLSNkZWZpbmUgUkVMT0NfQklUUzNfUkVTRVJWRURfU0hfTEVGVF9MSVRUTEUJOQotCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1NJWkVfTElUVExFCQkJMHhmYwotI2RlZmluZSBSRUxPQ19CSVRTM19TSVpFX1NIX0xJVFRMRQkJMgotCi0vKiBUaGUgcl90eXBlIGZpZWxkIGluIGEgcmVsb2MgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9JR05PUkUJCTAKLSNkZWZpbmUgQUxQSEFfUl9SRUZMT05HCQkxCi0jZGVmaW5lIEFMUEhBX1JfUkVGUVVBRAkJMgotI2RlZmluZSBBTFBIQV9SX0dQUkVMMzIJCTMKLSNkZWZpbmUgQUxQSEFfUl9MSVRFUkFMCQk0Ci0jZGVmaW5lIEFMUEhBX1JfTElUVVNFCQk1Ci0jZGVmaW5lIEFMUEhBX1JfR1BESVNQCQk2Ci0jZGVmaW5lIEFMUEhBX1JfQlJBRERSCQk3Ci0jZGVmaW5lIEFMUEhBX1JfSElOVAkJOAotI2RlZmluZSBBTFBIQV9SX1NSRUwxNgkJOQotI2RlZmluZSBBTFBIQV9SX1NSRUwzMgkgICAgICAgMTAKLSNkZWZpbmUgQUxQSEFfUl9TUkVMNjQJICAgICAgIDExCi0jZGVmaW5lIEFMUEhBX1JfT1BfUFVTSAkgICAgICAgMTIKLSNkZWZpbmUgQUxQSEFfUl9PUF9TVE9SRSAgICAgICAxMwotI2RlZmluZSBBTFBIQV9SX09QX1BTVUIJICAgICAgIDE0Ci0jZGVmaW5lIEFMUEhBX1JfT1BfUFJTSElGVCAgICAgMTUKLSNkZWZpbmUgQUxQSEFfUl9HUFZBTFVFCSAgICAgICAxNgotI2RlZmluZSBBTFBIQV9SX0dQUkVMSElHSCAgICAgIDE3Ci0jZGVmaW5lIEFMUEhBX1JfR1BSRUxMT1cgICAgICAgMTgKLSNkZWZpbmUgQUxQSEFfUl9JTU1FRCAgICAgICAgICAxOQotCi0vKiBPdmVybG9hZGVkIHJlbG9jIHZhbHVlIHVzZWQgYnkgTmV0LSBhbmQgT3BlbkJTRC4gICovCi0jZGVmaW5lIEFMUEhBX1JfTElURVJBTFNMRUFaWSAgMTcKLQotLyogV2l0aCBBTFBIQV9SX0xJVFVTRSwgdGhlIHJfc2l6ZSBmaWVsZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICAqLwotI2RlZmluZSBBTFBIQV9SX0xVX0JBU0UgICAgICAgICAxCi0jZGVmaW5lIEFMUEhBX1JfTFVfQllUT0ZGICAgICAgIDIKLSNkZWZpbmUgQUxQSEFfUl9MVV9KU1IgICAgICAgICAgMwotCi0vKiBXaXRoIEFMUEhBX1JfSU1NRUQsIHRoZSByX3NpemUgZmllbGQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9JTU1FRF9HUF8xNiAgICAgMQotI2RlZmluZSBBTFBIQV9SX0lNTUVEX0dQX0hJMzIgICAyCi0jZGVmaW5lIEFMUEhBX1JfSU1NRURfU0NOX0hJMzIgIDMKLSNkZWZpbmUgQUxQSEFfUl9JTU1FRF9CUl9ISTMyICAgNAotI2RlZmluZSBBTFBIQV9SX0lNTUVEX0xPMzIgICAgICA1Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTElDIElORk9STUFUSU9OICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFdyaXR0ZW4gYnkgSm9obiBHaWxtb3JlLiAgKi8KLQotLyogRUNPRkYgdXNlcyBDT0ZGLWxpa2Ugc2VjdGlvbiBzdHJ1Y3R1cmVzLCBidXQgaXRzIG93biBzeW1ib2wgZm9ybWF0LgotICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHN5bWJvbCBmb3JtYXQgaW4gZmllbGRzIHdob3NlIHNpemUgYW5kIGFsaWdubWVudAotICAgd2lsbCBub3QgdmFyeSBvbiBkaWZmZXJlbnQgaG9zdCBzeXN0ZW1zLiAgKi8KLQotLyogRmlsZSBoZWFkZXIgYXMgYSBzZXQgb2YgYnl0ZXMgKi8KLQotc3RydWN0IGhkcl9leHQgewotCXVuc2lnbmVkIGNoYXIgCWhfbWFnaWNbMl07Ci0JdW5zaWduZWQgY2hhcgloX3ZzdGFtcFsyXTsKLQl1bnNpZ25lZCBjaGFyCWhfaWxpbmVNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lkbk1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaXBkTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pc3ltTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pb3B0TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pYXV4TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pc3NNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lzc0V4dE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWZkTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jcmZkWzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pZXh0TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkxpbmVbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiTGluZU9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JEbk9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JQZE9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JTeW1PZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiT3B0T2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkF1eE9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JTc09mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JTc0V4dE9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JGZE9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JSZmRPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiRXh0T2Zmc2V0WzhdOwotfTsKLQotLyogRmlsZSBkZXNjcmlwdG9yIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgZmRyX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglmX2Fkcls4XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2JMaW5lT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJZl9jYkxpbmVbOF07Ci0JdW5zaWduZWQgY2hhcglmX2NiU3NbOF07Ci0JdW5zaWduZWQgY2hhcglmX3Jzc1s0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaXNzQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaXN5bUJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NzeW1bNF07Ci0JdW5zaWduZWQgY2hhcglmX2lsaW5lQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2xpbmVbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lvcHRCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jb3B0WzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pcGRGaXJzdFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY3BkWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pYXV4QmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2F1eFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfcmZkQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY3JmZFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcglmX2JpdHMyWzNdOwotCXVuc2lnbmVkIGNoYXIJZl9wYWRkaW5nWzRdOwotfTsKLQotI2RlZmluZQlGRFJfQklUUzFfTEFOR19CSUcJCTB4RjgKLSNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfU0hfQklHCQkzCi0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX0xJVFRMRQkJMHgxRgotI2RlZmluZQlGRFJfQklUUzFfTEFOR19TSF9MSVRUTEUJMAotCi0jZGVmaW5lCUZEUl9CSVRTMV9GTUVSR0VfQklHCQkweDA0Ci0jZGVmaW5lCUZEUl9CSVRTMV9GTUVSR0VfTElUVExFCQkweDIwCi0KLSNkZWZpbmUJRkRSX0JJVFMxX0ZSRUFESU5fQklHCQkweDAyCi0jZGVmaW5lCUZEUl9CSVRTMV9GUkVBRElOX0xJVFRMRQkweDQwCi0KLSNkZWZpbmUJRkRSX0JJVFMxX0ZCSUdFTkRJQU5fQklHCTB4MDEKLSNkZWZpbmUJRkRSX0JJVFMxX0ZCSUdFTkRJQU5fTElUVExFCTB4ODAKLQotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX0JJRwkJMHhDMAotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX1NIX0JJRwkJNgotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX0xJVFRMRQkJMHgwMwotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX1NIX0xJVFRMRQkwCi0KLS8qIFdlIGlnbm9yZSB0aGUgYHJlc2VydmVkJyBmaWVsZCBpbiBiaXRzMi4gKi8KLQotLyogUHJvY2VkdXJlIGRlc2NyaXB0b3IgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBwZHJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCXBfYWRyWzhdOwotCXVuc2lnbmVkIGNoYXIJcF9jYkxpbmVPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcglwX2lzeW1bNF07Ci0JdW5zaWduZWQgY2hhcglwX2lsaW5lWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZWdtYXNrWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZWdvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2lvcHRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyZWdtYXNrWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmVnb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmFtZW9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfbG5Mb3dbNF07Ci0JdW5zaWduZWQgY2hhcglwX2xuSGlnaFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZ3BfcHJvbG9ndWVbMV07Ci0JdW5zaWduZWQgY2hhcglwX2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJcF9iaXRzMlsxXTsKLQl1bnNpZ25lZCBjaGFyCXBfbG9jYWxvZmZbMV07Ci0JdW5zaWduZWQgY2hhcglwX2ZyYW1lcmVnWzJdOwotCXVuc2lnbmVkIGNoYXIJcF9wY3JlZ1syXTsKLX07Ci0KLSNkZWZpbmUgUERSX0JJVFMxX0dQX1VTRURfQklHCQkweDgwCi0jZGVmaW5lIFBEUl9CSVRTMV9SRUdfRlJBTUVfQklHCQkweDQwCi0jZGVmaW5lIFBEUl9CSVRTMV9QUk9GX0JJRwkJMHgyMAotI2RlZmluZSBQRFJfQklUUzFfUkVTRVJWRURfQklHCQkweDFmCi0jZGVmaW5lIFBEUl9CSVRTMV9SRVNFUlZFRF9TSF9MRUZUX0JJRwk4Ci0jZGVmaW5lIFBEUl9CSVRTMl9SRVNFUlZFRF9CSUcJCTB4ZmYKLSNkZWZpbmUgUERSX0JJVFMyX1JFU0VSVkVEX1NIX0JJRwkwCi0KLSNkZWZpbmUgUERSX0JJVFMxX0dQX1VTRURfTElUVExFCTB4MDEKLSNkZWZpbmUgUERSX0JJVFMxX1JFR19GUkFNRV9MSVRUTEUJMHgwMgotI2RlZmluZSBQRFJfQklUUzFfUFJPRl9MSVRUTEUJCTB4MDQKLSNkZWZpbmUgUERSX0JJVFMxX1JFU0VSVkVEX0xJVFRMRQkweGY4Ci0jZGVmaW5lIFBEUl9CSVRTMV9SRVNFUlZFRF9TSF9MSVRUTEUJMwotI2RlZmluZSBQRFJfQklUUzJfUkVTRVJWRURfTElUVExFCTB4ZmYKLSNkZWZpbmUgUERSX0JJVFMyX1JFU0VSVkVEX1NIX0xFRlRfTElUVExFIDUKLQotLyogTGluZSBudW1iZXJzICovCi0KLXN0cnVjdCBsaW5lX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglsX2xpbmVbNF07Ci19OwotCi0vKiBTeW1ib2wgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBzeW1fZXh0IHsKLQl1bnNpZ25lZCBjaGFyCXNfdmFsdWVbOF07Ci0JdW5zaWduZWQgY2hhcglzX2lzc1s0XTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcglzX2JpdHMyWzFdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzM1sxXTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czRbMV07Ci19OwotCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9CSUcJCTB4RkMKLSNkZWZpbmUJU1lNX0JJVFMxX1NUX1NIX0JJRwkJMgotI2RlZmluZQlTWU1fQklUUzFfU1RfTElUVExFCQkweDNGCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9TSF9MSVRUTEUJCTAKLQotI2RlZmluZQlTWU1fQklUUzFfU0NfQklHCQkweDAzCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19TSF9MRUZUX0JJRwkzCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19MSVRUTEUJCTB4QzAKLSNkZWZpbmUJU1lNX0JJVFMxX1NDX1NIX0xJVFRMRQkJNgotCi0jZGVmaW5lCVNZTV9CSVRTMl9TQ19CSUcJCTB4RTAKLSNkZWZpbmUJU1lNX0JJVFMyX1NDX1NIX0JJRwkJNQotI2RlZmluZQlTWU1fQklUUzJfU0NfTElUVExFCQkweDA3Ci0jZGVmaW5lCVNZTV9CSVRTMl9TQ19TSF9MRUZUX0xJVFRMRQkyCi0KLSNkZWZpbmUJU1lNX0JJVFMyX1JFU0VSVkVEX0JJRwkJMHgxMAotI2RlZmluZQlTWU1fQklUUzJfUkVTRVJWRURfTElUVExFCTB4MDgKLQotI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfQklHCQkweDBGCi0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRwkxNgotI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfTElUVExFCQkweEYwCi0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9TSF9MSVRUTEUJNAotCi0jZGVmaW5lCVNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRwk4Ci0jZGVmaW5lCVNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRQk0Ci0KLSNkZWZpbmUJU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfQklHCTAKLSNkZWZpbmUJU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfTElUVExFCTEyCi0KLS8qIEV4dGVybmFsIHN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IGV4dF9leHQgewotCXN0cnVjdAlzeW1fZXh0IGVzX2FzeW07Ci0JdW5zaWduZWQgY2hhcgllc19iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCWVzX2JpdHMyWzNdOwotCXVuc2lnbmVkIGNoYXIJZXNfaWZkWzRdOwotfTsKLQotI2RlZmluZQlFWFRfQklUUzFfSk1QVEJMX0JJRwkJMHg4MAotI2RlZmluZQlFWFRfQklUUzFfSk1QVEJMX0xJVFRMRQkJMHgwMQotCi0jZGVmaW5lCUVYVF9CSVRTMV9DT0JPTF9NQUlOX0JJRwkweDQwCi0jZGVmaW5lCUVYVF9CSVRTMV9DT0JPTF9NQUlOX0xJVFRMRQkweDAyCi0KLSNkZWZpbmUJRVhUX0JJVFMxX1dFQUtFWFRfQklHCQkweDIwCi0jZGVmaW5lCUVYVF9CSVRTMV9XRUFLRVhUX0xJVFRMRQkweDA0Ci0KLS8qIERlbnNlIG51bWJlcnMgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBkbnJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWRfcmZkWzRdOwotCXVuc2lnbmVkIGNoYXIJZF9pbmRleFs0XTsKLX07Ci0KLS8qIFJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvciAqLwotCi1zdHJ1Y3QgcmZkX2V4dCB7Ci0gIHVuc2lnbmVkIGNoYXIJcmZkWzRdOwotfTsKLQotLyogT3B0aW1pemVyIHN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IG9wdF9leHQgewotICB1bnNpZ25lZCBjaGFyIG9fYml0czFbMV07Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzMlsxXTsKLSAgdW5zaWduZWQgY2hhciBvX2JpdHMzWzFdOwotICB1bnNpZ25lZCBjaGFyIG9fYml0czRbMV07Ci0gIHN0cnVjdCBybmR4X2V4dCBvX3JuZHg7Ci0gIHVuc2lnbmVkIGNoYXIgb19vZmZzZXRbNF07Ci19OwotCi0jZGVmaW5lIE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0JJRwkxNgotI2RlZmluZSBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEUJMAotCi0jZGVmaW5lIE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0JJRwk4Ci0jZGVmaW5lIE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0xJVFRMRQk4Ci0KLSNkZWZpbmUgT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfQklHCTAKLSNkZWZpbmUgT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfTElUVExFCTE2CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvYXBvbGxvLmggYi9pbmNsdWRlL2NvZmYvYXBvbGxvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMzQ3ZjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2Fwb2xsby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgQXBvbGxvIE02OEsgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotLyogTW90b3JvbGEgNjgwMDAvNjgwMDgvNjgwMTAvNjgwMjAgKi8KLSNkZWZpbmUJTUM2OE1BR0lDCTA1MjAKLSNkZWZpbmUgTUM2OEtXUk1BR0lDCTA1MjAJLyogd3JpdGVhYmxlIHRleHQgc2VnbWVudHMgKi8KLSNkZWZpbmUJTUM2OFRWTUFHSUMJMDUyMQotI2RlZmluZSBNQzY4S1JPTUFHSUMJMDUyMQkvKiByZWFkb25seSBzaGFyZWFibGUgdGV4dCBzZWdtZW50cyAqLwotI2RlZmluZSBNQzY4S1BHTUFHSUMJMDUyMgkvKiBkZW1hbmQgcGFnZWQgdGV4dCBzZWdtZW50cyAqLwotI2RlZmluZQlNNjhNQUdJQwkwMjEwCi0jZGVmaW5lCU02OFRWTUFHSUMJMDIxMQotCi0vKiBBcG9sbG8gNjgwMDAtYmFzZWQgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCBtYWdpYyBudW1iZXIuIFRoaXMgY29tZXMKLSAqIGZyb20gL3Vzci9pbmNsdWRlL2Fwb2xsby9maWxlaGRyLmgKLSAqLwotI2RlZmluZSBBUE9MTE9NNjhLTUFHSUMgMDYyNwotCi0jZGVmaW5lIE9NQUdJQyBNNjhNQUdJQwotI2RlZmluZSBNNjhLQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPU1DNjhNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NQzY4S1dSTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OFRWTUFHSUMpICYmIFwKLSAgKCh4KS5mX21hZ2ljIT1NQzY4S1JPTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OEtQR01BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU02OE1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU02OFRWTUFHSUMpICAmJiBcCi0gICgoeCkuZl9tYWdpYyE9QVBPTExPTTY4S01BR0lDKSApCi0KLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIJb19zcmlbNF07CQkvKiBBcG9sbG8gc3BlY2lmaWMgLSAuc3JpIGRhdGEgcG9pbnRlciAqLwotICBjaGFyICBvX2lubGliWzRdOwkJLyogQXBvbGxvIHNwZWNpZmljIC0gLmlubGliIGRhdGEgcG9pbnRlciAqLwotICBjaGFyCXZpZFs4XTsJCQkvKiBBcG9sbG8gc3BlY2lmaWMgLSA2NCBiaXQgdmVyc2lvbiBJRCAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZQlBUE9MTE9fQ09GRl9WRVJTSU9OX05VTUJFUiAxIC8qIHRoZSB2YWx1ZSBvZiB0aGUgYW91dGhkciBtYWdpYyAqLwotI2RlZmluZQlBT1VUSERSU1ogNDQKLSNkZWZpbmUgQU9VVFNaIDQ0Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQkvKiBBcG9sbG8gYWxsb3cgZm9yIGxhcmdlciBzZWN0aW9uIG5hbWVzIGJ5ICBhbGxvd2luZyBpdCB0byBiZSBpbgotCSAqIHRoZSBzdHJpbmcgdGFibGUuCi0JICovCi0JY2hhcgkJc19uYW1lWzhdOwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyogSWYgc196ZW9yZXMgaXMgYWxsIHplcm9lcywgc19vZmZzZXQgZ2l2ZXMgdGhlIHJlYWwgbG9jYXRpb24gb2YgdGhlIG5hbWUKLSAqIGluIHRoZSBzdHJpbmcgdGFibGUuCi0gKi8KLQotI2RlZmluZQlzX3plcm9lcyBzZWN0aW9uX25hbWUuc19uYW1lCi0jZGVmaW5lCXNfb2Zmc2V0IChzZWN0aW9uX25hbWUuc19uYW1lKzQpCi0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX1RWCSIudHYiCi0jZGVmaW5lIF9JTklUCSIuaW5pdCIKLSNkZWZpbmUgX0ZJTkkJIi5maW5pIgotI2RlZmluZQlfTElORVMJIi5saW5lcyIKLSNkZWZpbmUJX0JMT0NLUwkiLmJsb2NrcyIKLSNkZWZpbmUgX1NSSSAgICAiLnNyaSIgICAgICAgICAgICAgICAgICAvKiBTdGF0aWMgUmVzb3VyY2UgSW5mb3JtYXRpb24gKHN5c3R5cGUsCi0gZXQgYWwuKSAqLwotI2RlZmluZSBfTUlSICAgICIubWlyIiAgICAgICAgICAgICAgICAgIC8qIE1vZHVsZSBJbmZvcm1hdGlvbiBSZWNvcmRzICAqLwotI2RlZmluZSBfQVBUViAgICIuYXB0diIgICAgICAgICAgICAgICAgIC8qIEFwb2xsby1zdHlsZSB0cmFuc2ZlciB2ZWN0b3JzLiAqLwotI2RlZmluZSBfSU5MSUIgICIuaW5saWIiICAgICAgICAgICAgICAgIC8qIFNoYXJlZCBMaWJyYXJ5IGluZm9ybWF0aW9uICovCi0jZGVmaW5lIF9SV0RJICAgIi5yd2RpIiAgICAgICAgIC8qIFJlYWQvd3JpdGUgZGF0YSBpbml0aWFsaXphdGlvbiBkaXJlY3RpdmVzIGZvcgotIGNvbXByZXNzZWQgc2VjdGlvbnMgKi8KLSNkZWZpbmUgX1VOV0lORCAiLnVud2luZCIgICAgICAgICAgICAgICAvKiBTdGFjayB1bndpbmQgaW5mb3JtYXRpb24gKi8KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSNpZmRlZiBNNjhLX0NPRkZfT0ZGU0VUCi0gIGNoYXIgcl9vZmZzZXRbNF07Ci0jZW5kaWYKLQotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotCi0jaWZkZWYgTTY4S19DT0ZGX09GRlNFVAotI2RlZmluZSBSRUxTWiAxNAotI2Vsc2UKLSNkZWZpbmUgUkVMU1ogMTAKLSNlbmRpZgotCi0vKiBBcG9sbG8gc3BlY2lmaWMgU1RZUCBmbGFncyAqLwotCi0jZGVmaW5lIFNUWVBfUkVMT0NBVEVEX05PVF9MT0FERUQgMHgwMDAxMDAwMAkvKiBTZWN0aW9uIGlzIHJlbG9jYXRlZCBub3JtYWxseSBkdXJpbmcgbGlua2luZywgYnV0IG5lZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgIG5vdCBiZSBsb2FkZWQgZHVyaW5nIHByb2dyYW0gZXhlY3V0aW9uICovCi0jZGVmaW5lIFNUWVBfREVCVUcgICAgICAgICAgICAgIDB4MDAwMjAwMDAJLyogZGVidWcgc2VjdGlvbiAqLwotI2RlZmluZSBTVFlQX09WRVJMQVkJCTB4MDAwNDAwMDAJLyogU2VjdGlvbiBpcyBvdmVybGF5ZWQgKi8KLSNkZWZpbmUgU1RZUF9JTlNUUlVDVElPTiAgICAJMHgwMDIwMDAwMAkvKiBTZWN0aW9uIGNvbnRhaW5zIGV4ZWN1dGFibGUgY29kZSAqLwotCi0jZGVmaW5lIFNUWVBfWkVSTwkJMHgwMDgwMDAwMAkvKiBTZWN0aW9uIGlzIGluaXRpYWxpemVkIHRvIHplcm8gKi8KLSNkZWZpbmUgU1RZUF9JTlNUQUxMRUQJCTB4MDIwMDAwMDAJLyogU2VjdGlvbiBzaG91bGQgYmUgaW5zdGFsbGFibGUgaW4gS0dUICovCi0jZGVmaW5lIFNUWVBfTE9PS19JTlNUQUxMRUQJMHgwNDAwMDAwMAkvKiBMb29rIGZvciBzZWN0aW9uIGluIEtHVCAqLwotI2RlZmluZSBTVFlQX1NFQ0FMSUdOMQkJMHgwODAwMDAwMAkvKiBTcGVjaWFsbHkgYWxpZ25lZCBzZWN0aW9uICovCi0jZGVmaW5lIFNUWVBfU0VDQUxJR04yCQkweDEwMDAwMDAwCS8qICAgICAgIiAgICAgICAiICAgICAgICIgICAgKi8KLSNkZWZpbmUgU1RZUF9DT01QUkVTU0VECQkweDIwMDAwMDAwCS8qIE5vIHNlY3Rpb24gZGF0YSBwZXIgc2UgKHNfc2NucHRyID0gMCksIGJ1dCB0aGVyZSBhcmUKLQkJCQkJCSAgIGluaXRpYWxpemF0aW9uIGRpcmVjdGl2ZXMgZm9yIGl0IGluIC5yd2RpIHNlY3Rpb24KLQkJCQkJCSAgICh1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU1RZUF9CU1MpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvYXJtLmggYi9pbmNsdWRlL2NvZmYvYXJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZDc4ZDYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2FybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgdGhlIEFSTSAqLwotCi0jZGVmaW5lIENPRkZBUk0gMQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyogQml0cyBmb3IgZl9mbGFnczoKLSAqCUZfUkVMRkxHCXJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfRVhFQwkJZmlsZSBpcyBleGVjdXRhYmxlIChubyB1bnJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMpCi0gKglGX0xOTk8JCWxpbmUgbnVtYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfTFNZTVMJCWxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKiAgICAgIEZfSU5URVJXT1JLICAgICBmaWxlIHN1cHBvcnRzIHN3aXRjaGluZyBiZXR3ZWVuIEFSTSBhbmQgVGh1bWIgaW5zdHJ1Y3Rpb24gc2V0cwotICogICAgICBGX0lOVEVSV09SS19TRVQgdGhlIEZfSU5URVJXT1JLIGJpdCBpcyB2YWxpZAotICoJRl9BUENTX0ZMT0FUCWNvZGUgcGFzc2VzIGZsb2F0IGFyZ3VtZW50cyBpbiBmbG9hdCByZWdpc3RlcnMKLSAqCUZfUElDCQljb2RlIGlzIHJlZW50cmFudC9wb3NpdGlvbi1pbmRlcGVuZGVudAotICoJRl9BUjMyV1IJZmlsZSBoYXMgYnl0ZSBvcmRlcmluZyBvZiBhbiBBUjMyV1IgbWFjaGluZSAoZS5nLiB2YXgpCi0gKglGX0FQQ1NfMjYJZmlsZSB1c2VzIDI2IGJpdCBBUk0gUHJvY2VkdXJlIENhbGxpbmcgU3RhbmRhcmQKLSAqCUZfQVBDU19TRVQJdGhlIEZfQVBDU18yNiwgRl9BUENTX0ZMT0FUIGFuZCBGX1BJQyBiaXRzIGhhdmUgYmVlbiBpbml0aWFsaXNlZAotICovCi0KLSNkZWZpbmUgRl9SRUxGTEcJKDB4MDAwMSkKLSNkZWZpbmUgRl9FWEVDCQkoMHgwMDAyKQotI2RlZmluZSBGX0xOTk8JCSgweDAwMDQpCi0jZGVmaW5lIEZfTFNZTVMJCSgweDAwMDgpCi0jZGVmaW5lIEZfSU5URVJXT1JLCSgweDAwMTApCi0jZGVmaW5lIEZfSU5URVJXT1JLX1NFVAkoMHgwMDIwKQotI2RlZmluZSBGX0FQQ1NfRkxPQVQJKDB4MDA0MCkKLSN1bmRlZiAgRl9BUjE2V1IKLSNkZWZpbmUgRl9QSUMJCSgweDAwODApCi0jZGVmaW5lCUZfQVIzMldSCSgweDAxMDApCi0jZGVmaW5lIEZfQVBDU18yNgkoMHgwNDAwKQotI2RlZmluZSBGX0FQQ1NfU0VUCSgweDA4MDApCi0KLS8qIEJpdHMgc3RvcmVkIGluIGZsYWdzIGZpZWxkIG9mIHRoZSBpbnRlcm5hbF9mIHN0cnVjdHVyZSAqLwotCi0jZGVmaW5lIEZfSU5URVJXT1JLCSgweDAwMTApCi0jZGVmaW5lIEZfQVBDU19GTE9BVAkoMHgwMDQwKQotI2RlZmluZSBGX1BJQwkJKDB4MDA4MCkKLSNkZWZpbmUgRl9BUENTMjYJKDB4MTAwMCkKLSNkZWZpbmUgRl9BUk1fQVJDSElURUNUVVJFX01BU0sgKDB4NDAwMCsweDA4MDArMHgwNDAwKQotI2RlZmluZSBGX0FSTV8yCQkoMHgwNDAwKQotI2RlZmluZSBGX0FSTV8yYQkoMHgwODAwKQotI2RlZmluZSBGX0FSTV8zCQkoMHgwYzAwKQotI2RlZmluZSBGX0FSTV8zTQkoMHg0MDAwKQotI2RlZmluZSBGX0FSTV80CQkoMHg0NDAwKQotI2RlZmluZSBGX0FSTV80VAkoMHg0ODAwKQotI2RlZmluZSBGX0FSTV9zcGFyZQkoMHg0YzAwKQotCi0vKgotICogQVJNTUFHSUMgb3VnaHQgdG8gZW5jb2RlZCB0aGUgcHJvY2Vzb3IgdHlwZSwKLSAqIGJ1dCBpdCBpcyB0b28gbGF0ZSB0byBjaGFuZ2UgaXQgbm93LCBpbnN0ZWFkCi0gKiB0aGUgZmxhZ3MgZmllbGQgb2YgdGhlIGludGVybmFsX2Ygc3RydWN0dXJlCi0gKiBpcyB1c2VkIGFzIHNob3duIGFib3ZlLgotICoKLSAqIFhYWCAtIE5DIDUvNi85NwotICovCi0KLSNkZWZpbmUJQVJNTUFHSUMJMHhhMDAgIC8qIEkganVzdCBtYWRlIHRoaXMgdXAgKi8gCi0KLSNkZWZpbmUgQVJNQkFETUFHKHgpICgoKHgpLmZfbWFnaWMgIT0gQVJNTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotCi0KLX0KLUFPVVRIRFI7Ci0KLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLSNkZWZpbmUgT01BR0lDICAgICAgICAgIDA0MDQgICAgLyogb2JqZWN0IGZpbGVzLCBlZyBhcyBvdXRwdXQgKi8KLSNkZWZpbmUgWk1BR0lDICAgICAgICAgIDA0MTMgICAgLyogZGVtYW5kIGxvYWQgZm9ybWF0LCBlZyBub3JtYWwgbGQgb3V0cHV0ICovCi0jZGVmaW5lIFNUTUFHSUMJCTA0MDEJLyogdGFyZ2V0IHNobGliICovCi0jZGVmaW5lIFNITUFHSUMJCTA0NDMJLyogaG9zdCAgIHNobGliICovCi0KLQotLyogZGVmaW5lIHNvbWUgTlQgZGVmYXVsdCB2YWx1ZXMgKi8KLS8qICAjZGVmaW5lIE5UX0lNQUdFX0JBU0UgICAgICAgIDB4NDAwMDAwIG1vdmVkIHRvIGludGVybmFsLmggKi8KLSNkZWZpbmUgTlRfU0VDVElPTl9BTElHTk1FTlQgMHgxMDAwCi0jZGVmaW5lIE5UX0ZJTEVfQUxJR05NRU5UICAgIDB4MjAwICAKLSNkZWZpbmUgTlRfREVGX1JFU0VSVkUgICAgICAgMHgxMDAwMDAKLSNkZWZpbmUgTlRfREVGX0NPTU1JVCAgICAgICAgMHgxMDAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0jZGVmaW5lIF9MSUIgIi5saWIiCi0KLS8qIFdlIHVzZSB0aGUgLnJkYXRhIHNlY3Rpb24gdG8gaG9sZCByZWFkIG9ubHkgZGF0YS4gICovCi0jZGVmaW5lIF9MSVQJIi5yZGF0YSIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0jZGVmaW5lIE5fQlRNQVNLCSgweGYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCQljaGFyIHhfY2hlY2tzdW1bNF07CS8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtICovCi0JCWNoYXIgeF9hc3NvY2lhdGVkWzJdOwkvKiBDT01EQVQgYXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi0JCWNoYXIgeF9jb21kYXRbMV07CS8qIENPTURBVCBzZWxlY3Rpb24gbnVtYmVyICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLSMJZGVmaW5lIF9FVEVYVAkiZXRleHQiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2F1eC1jb2ZmLmggYi9pbmNsdWRlL2NvZmYvYXV4LWNvZmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg5YzEyNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvYXV4LWNvZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIE1vZGlmaWNhdGlvbnMgb2YgaW50ZXJuYWwuaCBhbmQgbTY4ay5oIG5lZWRlZCBieSBBL1VYCi0gICBTdWdnZXN0ZWQgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+ICovCi0KLSNpZm5kZWYgR05VX0NPRkZfQVVYX0gKLSNkZWZpbmUgR05VX0NPRkZfQVVYX0ggMQotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvbTY4ay5oIgotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIDY0LWJ5dGUgcGFkZGVkIHBhdGhuYW1lcyBvZiBzaGFyZWQgbGlicmFyaWVzICovCi0jdW5kZWYgU1RZUF9MSUIKLSNkZWZpbmUgU1RZUF9MSUIgMHgyMDAKLQotLyogU2VjdGlvbiBjb250YWlucyBzaGFyZWQgbGlicmFyeSBpbml0aWFsaXphdGlvbiBjb2RlICovCi0jdW5kZWYgU1RZUF9JTklUCi0jZGVmaW5lIFNUWVBfSU5JVCAweDQwMAotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIC5pZGVudCBpbmZvcm1hdGlvbiAqLwotI3VuZGVmIFNUWVBfSURFTlQKLSNkZWZpbmUgU1RZUF9JREVOVCAweDgwMAotCi0vKiBTZWN0aW9uIHR5cGVzIHVzZWQgYnkgYmZkIGFuZCBnYXMgbm90IGRlZmluZWQgKGRpcmVjdGx5KSBieSBBL1VYICovCi0jdW5kZWYgU1RZUF9PVkVSCi0jZGVmaW5lIFNUWVBfT1ZFUiAwCi0jdW5kZWYgU1RZUF9JTkZPCi0jZGVmaW5lIFNUWVBfSU5GTyBTVFlQX0lERU5UCi0KLS8qIFRyYWRpdGlvbmFsIG5hbWUgb2YgdGhlIHNlY3Rpb24gdGFnZ2VkIHdpdGggU1RZUF9MSUIgKi8KLSNkZWZpbmUgX0xJQiAiLmxpYiIKLQotI2VuZGlmIC8qIEdOVV9DT0ZGX0FVWF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvZWNvZmYuaCBiL2luY2x1ZGUvY29mZi9lY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTQyMDJlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9lY29mZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLSNpZm5kZWYgRUNPRkZfSAotI2RlZmluZSBFQ09GRl9ICi0KLS8qIEdlbmVyaWMgRUNPRkYgc3VwcG9ydC4KLSAgIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBzeW1ib2wgaW5mb3JtYXRpb24sIGZvdW5kIGluIHN5bS5oIGFuZAotICAgc3ltY29uc3QuaC4gICovCi0KLS8qIE1pcHMgbWFnaWMgbnVtYmVycyB1c2VkIGluIGZpbGVoZHIuICBNSVBTX01BR0lDX0xJVFRMRSBpcyB1c2VkIG9uCi0gICBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzLiAgTUlQU19NQUdJQ19CSUcgaXMgdXNlZCBvbiBiaWcgZW5kaWFuCi0gICBtYWNoaW5lcy4gIFdoZXJlIGlzIE1JUFNfTUFHSUNfMSBmcm9tPyAgKi8KLSNkZWZpbmUgTUlQU19NQUdJQ18xIDB4MDE4MAotI2RlZmluZSBNSVBTX01BR0lDX0xJVFRMRSAweDAxNjIKLSNkZWZpbmUgTUlQU19NQUdJQ19CSUcgMHgwMTYwCi0KLS8qIFRoZXNlIGFyZSB0aGUgbWFnaWMgbnVtYmVycyB1c2VkIGZvciBNSVBTIGNvZGUgY29tcGlsZWQgYXQgSVNBCi0gICBsZXZlbCAyLiAgKi8KLSNkZWZpbmUgTUlQU19NQUdJQ19MSVRUTEUyIDB4MDE2NgotI2RlZmluZSBNSVBTX01BR0lDX0JJRzIgMHgwMTYzCi0KLS8qIFRoZXNlIGFyZSB0aGUgbWFnaWMgbnVtYmVycyB1c2VkIGZvciBNSVBTIGNvZGUgY29tcGlsZWQgYXQgSVNBCi0gICBsZXZlbCAzLiAgKi8KLSNkZWZpbmUgTUlQU19NQUdJQ19MSVRUTEUzIDB4MTQyCi0jZGVmaW5lIE1JUFNfTUFHSUNfQklHMyAweDE0MAotCi0vKiBBbHBoYSBtYWdpYyBudW1iZXJzIHVzZWQgaW4gZmlsZWhkci4gICovCi0jZGVmaW5lIEFMUEhBX01BR0lDIDB4MTgzCi0jZGVmaW5lIEFMUEhBX01BR0lDX0JTRCAweDE4NQotCi0vKiBNYWdpYyBudW1iZXJzIHVzZWQgaW4gYS5vdXQgaGVhZGVyLiAgKi8KLSNkZWZpbmUgRUNPRkZfQU9VVF9PTUFHSUMgMDQwNwkvKiBub3QgZGVtYW5kIHBhZ2VkIChsZCAtTikuICAqLwotI2RlZmluZSBFQ09GRl9BT1VUX1pNQUdJQyAwNDEzCS8qIGRlbWFuZCBsb2FkIGZvcm1hdCwgZWcgbm9ybWFsIGxkIG91dHB1dCAqLwotCi0vKiBOYW1lcyBvZiBzcGVjaWFsIHNlY3Rpb25zLiAgKi8KLSNkZWZpbmUgX1RFWFQgICAiLnRleHQiCi0jZGVmaW5lIF9EQVRBICAgIi5kYXRhIgotI2RlZmluZSBfQlNTICAgICIuYnNzIgotI2RlZmluZSBfUkRBVEEJIi5yZGF0YSIKLSNkZWZpbmUgX1NEQVRBCSIuc2RhdGEiCi0jZGVmaW5lIF9TQlNTCSIuc2JzcyIKLSNkZWZpbmUgX0xJVEEJIi5saXRhIgotI2RlZmluZSBfTElUNAkiLmxpdDQiCi0jZGVmaW5lIF9MSVQ4CSIubGl0OCIKLSNkZWZpbmUgX0xJQgkiLmxpYiIKLSNkZWZpbmUgX0lOSVQJIi5pbml0IgotI2RlZmluZSBfRklOSQkiLmZpbmkiCi0jZGVmaW5lIF9QREFUQQkiLnBkYXRhIgotI2RlZmluZSBfWERBVEEJIi54ZGF0YSIKLSNkZWZpbmUgX0dPVAkiLmdvdCIKLSNkZWZpbmUgX0hBU0gJIi5oYXNoIgotI2RlZmluZSBfRFlOU1lNCSIuZHluc3ltIgotI2RlZmluZSBfRFlOU1RSCSIuZHluc3RyIgotI2RlZmluZSBfUkVMRFlOCSIucmVsLmR5biIKLSNkZWZpbmUgX0NPTkZMSUMgIi5jb25mbGljIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0jZGVmaW5lIF9MSUJMSVNUICIubGlibGlzdCIKLSNkZWZpbmUgX0RZTkFNSUMgIi5keW5hbWljIgotI2RlZmluZSBfUkNPTlNUCSIucmNvbnN0IgotCi0vKiBFQ09GRiB1c2VzIHNvbWUgYWRkaXRpb25hbCBzZWN0aW9uIGZsYWdzLiAgKi8KLSNkZWZpbmUgU1RZUF9SREFUQQkgICAgIDB4MTAwCi0jZGVmaW5lIFNUWVBfU0RBVEEJICAgICAweDIwMAotI2RlZmluZSBTVFlQX1NCU1MJICAgICAweDQwMAotI2RlZmluZSBTVFlQX0dPVAkgICAgMHgxMDAwCi0jZGVmaW5lIFNUWVBfRFlOQU1JQwkgICAgMHgyMDAwCi0jZGVmaW5lIFNUWVBfRFlOU1lNCSAgICAweDQwMDAKLSNkZWZpbmUgU1RZUF9SRUxEWU4JICAgIDB4ODAwMAotI2RlZmluZSBTVFlQX0RZTlNUUgkgICAweDEwMDAwCi0jZGVmaW5lIFNUWVBfSEFTSAkgICAweDIwMDAwCi0jZGVmaW5lIFNUWVBfTElCTElTVAkgICAweDQwMDAwCi0jZGVmaW5lIFNUWVBfQ09ORkxJQwkgIDB4MTAwMDAwCi0jZGVmaW5lIFNUWVBfRUNPRkZfRklOSQkgMHgxMDAwMDAwCi0jZGVmaW5lIFNUWVBfRVhURU5ERVNDCSAweDIwMDAwMDAgLyogMHgwMkZGRjAwMCBiaXRzID0+IHNjbiB0eXBlLCByZXN0IGNsciAqLwotI2RlZmluZSBTVFlQX0xJVEEJIDB4NDAwMDAwMAotI2RlZmluZSBTVFlQX0xJVDgJIDB4ODAwMDAwMAotI2RlZmluZSBTVFlQX0xJVDQJMHgxMDAwMDAwMAotI2RlZmluZSBTVFlQX0VDT0ZGX0xJQgkweDQwMDAwMDAwCi0jZGVmaW5lIFNUWVBfRUNPRkZfSU5JVCAweDgwMDAwMDAwCi0jZGVmaW5lIFNUWVBfT1RIRVJfTE9BRCAoU1RZUF9FQ09GRl9JTklUIHwgU1RZUF9FQ09GRl9GSU5JKQotCi0vKiBleHRlbmRlZCBzZWN0aW9uIHR5cGVzICovCi0jZGVmaW5lIFNUWVBfQ09NTUVOVAkgMHgyMTAwMDAwCi0jZGVmaW5lIFNUWVBfUkNPTlNUCSAweDIyMDAwMDAKLSNkZWZpbmUgU1RZUF9YREFUQQkgMHgyNDAwMDAwCi0jZGVmaW5lIFNUWVBfUERBVEEJIDB4MjgwMDAwMAotCi0vKiBUaGUgbGlua2VyIG5lZWRzIGEgc2VjdGlvbiB0byBob2xkIHNtYWxsIGNvbW1vbiB2YXJpYWJsZXMgd2hpbGUKLSAgIGxpbmtpbmcuICBUaGVyZSBpcyBubyBjb252ZW5pZW50IHdheSB0byBjcmVhdGUgaXQgd2hlbiB0aGUgbGlua2VyCi0gICBuZWVkcyBpdCwgc28gd2UgYWx3YXlzIGNyZWF0ZSBvbmUgZm9yIGVhY2ggQkZELiAgV2UgdGhlbiBhdm9pZAotICAgd3JpdGluZyBpdCBvdXQuICAqLwotI2RlZmluZSBTQ09NTU9OICIuc2NvbW1vbiIKLQotLyogSWYgdGhlIGV4dGVybiBiaXQgaW4gYSByZWxvYyBpcyAxLCB0aGVuIHJfc3ltbmR4IGlzIGFuIGluZGV4IGludG8KLSAgIHRoZSBleHRlcm5hbCBzeW1ib2wgdGFibGUuICBJZiB0aGUgZXh0ZXJuIGJpdCBpcyAwLCB0aGVuIHJfc3ltbmR4Ci0gICBpbmRpY2F0ZXMgYSBzZWN0aW9uLCBhbmQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9OT05FCTAKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9URVhUCTEKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9SREFUQQkyCi0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fREFUQQkzCi0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fU0RBVEEJNAotI2RlZmluZSBSRUxPQ19TRUNUSU9OX1NCU1MJNQotI2RlZmluZSBSRUxPQ19TRUNUSU9OX0JTUwk2Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fSU5JVAk3Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fTElUOAk4Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fTElUNAk5Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fWERBVEEgICAgMTAKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9QREFUQSAgICAxMQotI2RlZmluZSBSRUxPQ19TRUNUSU9OX0ZJTkkgICAgIDEyCi0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fTElUQSAgICAgMTMKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9BQlMgICAgICAxNAotI2RlZmluZSBSRUxPQ19TRUNUSU9OX1JDT05TVCAgIDE1Ci0KLSNkZWZpbmUgTlVNX1JFTE9DX1NFQ1RJT05TICAgICAxNgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTVEFCUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBnY2MgdXNlcyBtaXBzLXRmaWxlIHRvIG91dHB1dCB0eXBlIGluZm9ybWF0aW9uIGluIHNwZWNpYWwgc3RhYnMKLSAgIGVudHJpZXMuICBUaGVzZSBtdXN0IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIGRlZmluaXRpb24gaW4KLSAgIGdjYy9jb25maWcvbWlwcy5oLiAgQXQgc29tZSBwb2ludCwgdGhlc2Ugc2hvdWxkIHByb2JhYmx5IGdvIGludG8gYQotICAgc2hhcmVkIGluY2x1ZGUgZmlsZSwgYnV0IGN1cnJlbnRseSBnY2MgYW5kIGdkYiBkbyBub3Qgc2hhcmUgYW55Ci0gICBkaXJlY3Rvcmllcy4gKi8KLSNkZWZpbmUgQ09ERV9NQVNLIDB4OEYzMDAKLSNkZWZpbmUgRUNPRkZfSVNfU1RBQihzeW0pICgoKHN5bSktPmluZGV4ICYgMHhGRkYwMCkgPT0gQ09ERV9NQVNLKQotI2RlZmluZSBFQ09GRl9NQVJLX1NUQUIoY29kZSkgKChjb2RlKStDT0RFX01BU0spCi0jZGVmaW5lIEVDT0ZGX1VOTUFSS19TVEFCKGNvZGUpICgoY29kZSktQ09ERV9NQVNLKQotI2RlZmluZSBTVEFCU19TWU1CT0wgIkBzdGFicyIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQ09GRiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBnY2MgYWxzbyB1c2VzIG1pcHMtdGZpbGUgdG8gb3V0cHV0IENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotICAgVGhlc2UgYXJlIHRoZSB2YWx1ZXMgaXQgdXNlcyB3aGVuIG91dHB1dHRpbmcgdGhlIC50eXBlIGRpcmVjdGl2ZS4KLSAgIFRoZXNlIHNob3VsZCBhbHNvIGJlIGluIGEgc2hhcmVkIGluY2x1ZGUgZmlsZS4gICovCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQVVYICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBhdXhpbGlhcnkgdHlwZSBpbmZvcm1hdGlvbiBpcyB0aGUgc2FtZSBvbiBhbGwga25vd24gRUNPRkYKLSAgIHRhcmdldHMuICBJIGNhbid0IHNlZSBhbnkgcmVhc29uIHRoYXQgaXQgd291bGQgZXZlciBjaGFuZ2UsIHNvIEkgYW0KLSAgIGdvaW5nIHRvIGdhbWJsZSBhbmQgZGVmaW5lIHRoZSBleHRlcm5hbCBzdHJ1Y3R1cmVzIGhlcmUsIGluIHRoZQotICAgdGFyZ2V0IGluZGVwZW5kZW50IEVDT0ZGIGhlYWRlciBmaWxlLiAgVGhlIGludGVybmFsIGZvcm1zIGFyZQotICAgZGVmaW5lZCBpbiBjb2ZmL3N5bS5oLCB3aGljaCB3YXMgb3JpZ2luYWxseSBkb25hdGVkIGJ5IE1JUFMKLSAgIENvbXB1dGVyIFN5c3RlbXMuICAqLwotCi0vKiBUeXBlIGluZm9ybWF0aW9uIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgdGlyX2V4dCB7Ci0JdW5zaWduZWQgY2hhcgl0X2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJdF90cTQ1WzFdOwotCXVuc2lnbmVkIGNoYXIJdF90cTAxWzFdOwotCXVuc2lnbmVkIGNoYXIJdF90cTIzWzFdOwotfTsKLQotI2RlZmluZQlUSVJfQklUUzFfRkJJVEZJRUxEX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4ODApCi0jZGVmaW5lCVRJUl9CSVRTMV9GQklURklFTERfTElUVExFCSgodW5zaWduZWQgaW50KSAweDAxKQotCi0jZGVmaW5lCVRJUl9CSVRTMV9DT05USU5VRURfQklHCQkoKHVuc2lnbmVkIGludCkgMHg0MCkKLSNkZWZpbmUJVElSX0JJVFMxX0NPTlRJTlVFRF9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDIpCi0KLSNkZWZpbmUJVElSX0JJVFMxX0JUX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4M0YpCi0jZGVmaW5lCVRJUl9CSVRTMV9CVF9TSF9CSUcJCTAKLSNkZWZpbmUJVElSX0JJVFMxX0JUX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4RkMpCi0jZGVmaW5lCVRJUl9CSVRTMV9CVF9TSF9MSVRUTEUJCTIKLQotI2RlZmluZQlUSVJfQklUU19UUTRfQklHCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJVElSX0JJVFNfVFE0X1NIX0JJRwkJNAotI2RlZmluZQlUSVJfQklUU19UUTVfQklHCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJVElSX0JJVFNfVFE1X1NIX0JJRwkJMAotI2RlZmluZQlUSVJfQklUU19UUTRfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJVElSX0JJVFNfVFE0X1NIX0xJVFRMRQkJMAotI2RlZmluZQlUSVJfQklUU19UUTVfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJVElSX0JJVFNfVFE1X1NIX0xJVFRMRQkJNAotCi0jZGVmaW5lCVRJUl9CSVRTX1RRMF9CSUcJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlUSVJfQklUU19UUTBfU0hfQklHCQk0Ci0jZGVmaW5lCVRJUl9CSVRTX1RRMV9CSUcJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlUSVJfQklUU19UUTFfU0hfQklHCQkwCi0jZGVmaW5lCVRJUl9CSVRTX1RRMF9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlUSVJfQklUU19UUTBfU0hfTElUVExFCQkwCi0jZGVmaW5lCVRJUl9CSVRTX1RRMV9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlUSVJfQklUU19UUTFfU0hfTElUVExFCQk0Ci0KLSNkZWZpbmUJVElSX0JJVFNfVFEyX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVRJUl9CSVRTX1RRMl9TSF9CSUcJCTQKLSNkZWZpbmUJVElSX0JJVFNfVFEzX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCi0jZGVmaW5lCVRJUl9CSVRTX1RRM19TSF9CSUcJCTAKLSNkZWZpbmUJVElSX0JJVFNfVFEyX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCi0jZGVmaW5lCVRJUl9CSVRTX1RRMl9TSF9MSVRUTEUJCTAKLSNkZWZpbmUJVElSX0JJVFNfVFEzX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVRJUl9CSVRTX1RRM19TSF9MSVRUTEUJCTQKLQotLyogUmVsYXRpdmUgc3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3Qgcm5keF9leHQgewotCXVuc2lnbmVkIGNoYXIJcl9iaXRzWzRdOwotfTsKLQotI2RlZmluZQlSTkRYX0JJVFMwX1JGRF9TSF9MRUZUX0JJRwk0Ci0jZGVmaW5lCVJORFhfQklUUzFfUkZEX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVJORFhfQklUUzFfUkZEX1NIX0JJRwkJNAotCi0jZGVmaW5lCVJORFhfQklUUzBfUkZEX1NIX0xFRlRfTElUVExFCTAKLSNkZWZpbmUJUk5EWF9CSVRTMV9SRkRfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJUk5EWF9CSVRTMV9SRkRfU0hfTEVGVF9MSVRUTEUJOAotCi0jZGVmaW5lCVJORFhfQklUUzFfSU5ERVhfQklHCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJUk5EWF9CSVRTMV9JTkRFWF9TSF9MRUZUX0JJRwkxNgotI2RlZmluZQlSTkRYX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUJUk5EWF9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRwkwCi0KLSNkZWZpbmUJUk5EWF9CSVRTMV9JTkRFWF9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlSTkRYX0JJVFMxX0lOREVYX1NIX0xJVFRMRQk0Ci0jZGVmaW5lCVJORFhfQklUUzJfSU5ERVhfU0hfTEVGVF9MSVRUTEUJNAotI2RlZmluZQlSTkRYX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFCTEyCi0KLS8qIEF1eGlsaWFyeSBzeW1ib2wgaW5mb3JtYXRpb24gZXh0ZXJuYWwgcmVjb3JkICovCi0KLXVuaW9uIGF1eF9leHQgewotCXN0cnVjdCB0aXJfZXh0CWFfdGk7Ci0Jc3RydWN0IHJuZHhfZXh0CWFfcm5keDsKLQl1bnNpZ25lZCBjaGFyCWFfZG5Mb3dbNF07Ci0JdW5zaWduZWQgY2hhcglhX2RuSGlnaFs0XTsKLQl1bnNpZ25lZCBjaGFyCWFfaXN5bVs0XTsKLQl1bnNpZ25lZCBjaGFyCWFfaXNzWzRdOwotCXVuc2lnbmVkIGNoYXIJYV93aWR0aFs0XTsKLQl1bnNpZ25lZCBjaGFyCWFfY291bnRbNF07Ci19OwotCi0jZGVmaW5lIEFVWF9HRVRfQU5ZKGJpZ2VuZCwgYXgsIGZpZWxkKSBcCi0gICgoYmlnZW5kKSA/IGJmZF9nZXRiMzIgKChheCktPmZpZWxkKSA6IGJmZF9nZXRsMzIgKChheCktPmZpZWxkKSkKLQotI2RlZmluZQlBVVhfR0VUX0ROTE9XKGJpZ2VuZCwgYXgpCUFVWF9HRVRfQU5ZICgoYmlnZW5kKSwgKGF4KSwgYV9kbkxvdykKLSNkZWZpbmUJQVVYX0dFVF9ETkhJR0goYmlnZW5kLCBheCkJQVVYX0dFVF9BTlkgKChiaWdlbmQpLCAoYXgpLCBhX2RuSGlnaCkKLSNkZWZpbmUJQVVYX0dFVF9JU1lNKGJpZ2VuZCwgYXgpCUFVWF9HRVRfQU5ZICgoYmlnZW5kKSwgKGF4KSwgYV9pc3ltKQotI2RlZmluZSBBVVhfR0VUX0lTUyhiaWdlbmQsIGF4KQkJQVVYX0dFVF9BTlkgKChiaWdlbmQpLCAoYXgpLCBhX2lzcykKLSNkZWZpbmUgQVVYX0dFVF9XSURUSChiaWdlbmQsIGF4KQlBVVhfR0VUX0FOWSAoKGJpZ2VuZCksIChheCksIGFfd2lkdGgpCi0jZGVmaW5lIEFVWF9HRVRfQ09VTlQoYmlnZW5kLCBheCkJQVVYX0dFVF9BTlkgKChiaWdlbmQpLCAoYXgpLCBhX2NvdW50KQotCi0jZGVmaW5lIEFVWF9QVVRfQU5ZKGJpZ2VuZCwgdmFsLCBheCwgZmllbGQpIFwKLSAgKChiaWdlbmQpIFwKLSAgID8gKGJmZF9wdXRiMzIgKChiZmRfdm1hKSAodmFsKSwgKGF4KS0+ZmllbGQpLCAwKSBcCi0gICA6IChiZmRfcHV0bDMyICgoYmZkX3ZtYSkgKHZhbCksIChheCktPmZpZWxkKSwgMCkpCi0KLSNkZWZpbmUgQVVYX1BVVF9ETkxPVyhiaWdlbmQsIHZhbCwgYXgpIFwKLSAgQVVYX1BVVF9BTlkgKChiaWdlbmQpLCAodmFsKSwgKGF4KSwgYV9kbkxvdykKLSNkZWZpbmUgQVVYX1BVVF9ETkhJR0goYmlnZW5kLCB2YWwsIGF4KSBcCi0gIEFVWF9QVVRfQU5ZICgoYmlnZW5kKSwgKHZhbCksIChheCksIGFfZG5IaWdoKQotI2RlZmluZSBBVVhfUFVUX0lTWU0oYmlnZW5kLCB2YWwsIGF4KSBcCi0gIEFVWF9QVVRfQU5ZICgoYmlnZW5kKSwgKHZhbCksIChheCksIGFfaXN5bSkKLSNkZWZpbmUgQVVYX1BVVF9JU1MoYmlnZW5kLCB2YWwsIGF4KSBcCi0gIEFVWF9QVVRfQU5ZICgoYmlnZW5kKSwgKHZhbCksIChheCksIGFfaXNzKQotI2RlZmluZSBBVVhfUFVUX1dJRFRIKGJpZ2VuZCwgdmFsLCBheCkgXAotICBBVVhfUFVUX0FOWSAoKGJpZ2VuZCksICh2YWwpLCAoYXgpLCBhX3dpZHRoKQotI2RlZmluZSBBVVhfUFVUX0NPVU5UKGJpZ2VuZCwgdmFsLCBheCkgXAotICBBVVhfUFVUX0FOWSAoKGJpZ2VuZCksICh2YWwpLCAoYXgpLCBhX2NvdW50KQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEZvciBlZmZpY2llbmN5LCBnZGIgZGVhbHMgZGlyZWN0bHkgd2l0aCB0aGUgdW5zd2FwcGVkIHN5bWJvbGljCi0gICBpbmZvcm1hdGlvbiAodGhhdCB3YXkgaXQgb25seSB0YWtlcyB0aGUgdGltZSB0byBzd2FwIGluZm9ybWF0aW9uCi0gICB0aGF0IGl0IHJlYWxseSBuZWVkcyB0byByZWFkKS4gIGdkYiBvcmlnaW5hbGx5IHJldHJpZXZlZCB0aGUKLSAgIGluZm9ybWF0aW9uIGRpcmVjdGx5IGZyb20gdGhlIEJGRCBiYWNrZW5kIGluZm9ybWF0aW9uLCBidXQgdGhhdAotICAgc3RyYXRlZ3ksIGJlc2lkZXMgYmVpbmcgc29ydCBvZiB1Z2x5LCBkb2VzIG5vdCB3b3JrIGZvciBNSVBTIEVMRiwKLSAgIHdoaWNoIGFsc28gdXNlcyBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIHN0cnVjdHVyZSBob2xkcwotICAgcG9pbnRlcnMgdG8gdGhlIChtb3N0bHkpIHVuc3dhcHBlZCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvCi17Ci0gIC8qIFRoZSBzd2FwcGVkIEVDT0ZGIHN5bWJvbGljIGhlYWRlci4gICovCi0gIEhEUlIgc3ltYm9saWNfaGVhZGVyOwotCi0gIC8qIFBvaW50ZXJzIHRvIHRoZSB1bnN3YXBwZWQgc3ltYm9saWMgaW5mb3JtYXRpb24uICBOb3RlIHRoYXQgdGhlCi0gICAgIHBvaW50ZXJzIHRvIGV4dGVybmFsIHN0cnVjdHVyZXMgcG9pbnQgdG8gZGlmZmVyZW50IHNvcnRzIG9mCi0gICAgIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBFQ09GRiB0YXJnZXRzLiAgVGhlIGVjb2ZmX2RlYnVnX3N3YXAKLSAgICAgc3RydWN0dXJlIHByb3ZpZGVzIHRoZSBzaXplcyBvZiB0aGUgc3RydWN0dXJlcyBhbmQgdGhlIGZ1bmN0aW9ucwotICAgICBuZWVkZWQgdG8gc3dhcCB0aGUgaW5mb3JtYXRpb24gaW4gYW5kIG91dC4gIFRoZXNlIHBvaW50ZXJzIGFyZQotICAgICBhbGwgcG9pbnRlcnMgdG8gYXJyYXlzLCBub3Qgc2luZ2xlIHN0cnVjdHVyZXMuICBUaGV5IHdpbGwgYmUgTlVMTAotICAgICBpZiB0aGVyZSBhcmUgbm8gaW5zdGFuY2VzIG9mIHRoZSByZWxldmFudCBzdHJ1Y3R1cmUuICBUaGVzZQotICAgICBmaWVsZHMgYXJlIGFsc28gdXNlZCBieSB0aGUgYXNzZW1ibGVyIHRvIG91dHB1dCBFQ09GRiBkZWJ1Z2dpbmcKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyICpsaW5lOwotICBQVFIgZXh0ZXJuYWxfZG5yOwkvKiBzdHJ1Y3QgZG5yX2V4dCAqLwotICBQVFIgZXh0ZXJuYWxfcGRyOwkvKiBzdHJ1Y3QgcGRyX2V4dCAqLwotICBQVFIgZXh0ZXJuYWxfc3ltOwkvKiBzdHJ1Y3Qgc3ltX2V4dCAqLwotICBQVFIgZXh0ZXJuYWxfb3B0OwkvKiBzdHJ1Y3Qgb3B0X2V4dCAqLwotICB1bmlvbiBhdXhfZXh0ICpleHRlcm5hbF9hdXg7Ci0gIGNoYXIgKnNzOwotICBjaGFyICpzc2V4dDsKLSAgUFRSIGV4dGVybmFsX2ZkcjsJLyogc3RydWN0IGZkcl9leHQgKi8KLSAgUFRSIGV4dGVybmFsX3JmZDsJLyogc3RydWN0IHJmZF9leHQgKi8KLSAgUFRSIGV4dGVybmFsX2V4dDsJLyogc3RydWN0IGV4dF9leHQgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIHVzZWQgd2hlbiBsaW5raW5nLiAgVGhleSBtYXkgZGlzYXBwZWFyIGF0IHNvbWUKLSAgICAgcG9pbnQuICAqLwotICBjaGFyICpzc2V4dF9lbmQ7Ci0gIFBUUiBleHRlcm5hbF9leHRfZW5kOwotCi0gIC8qIFdoZW4gbGlua2luZywgdGhpcyBmaWVsZCBob2xkcyBhIG1hcHBpbmcgZnJvbSB0aGUgaW5wdXQgRkRSCi0gICAgIG51bWJlcnMgdG8gdGhlIG91dHB1dCBudW1iZXJzLCBhbmQgaXMgdXNlZCB3aGVuIHdyaXRpbmcgb3V0IHRoZQotICAgICBleHRlcm5hbCBzeW1ib2xzLiAgSXQgaXMgTlVMTCBpZiBubyBtYXBwaW5nIGlzIHJlcXVpcmVkLiAgKi8KLSAgUkZEVCAqaWZkbWFwOwotCi0gIC8qIFRoZSBzd2FwcGVkIEZEUiBpbmZvcm1hdGlvbi4gIEN1cnJlbnRseSB0aGlzIGlzIG5ldmVyIE5VTEwsIGJ1dAotICAgICBjb2RlIHVzaW5nIHRoaXMgc3RydWN0dXJlIHNob3VsZCBwcm9iYWJseSBkb3VibGUtY2hlY2sgaW4gY2FzZQotICAgICB0aGlzIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZS4gIFRoaXMgaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5LCBub3QgYQotICAgICBzaW5nbGUgc3RydWN0dXJlLiAgKi8KLSAgRkRSICpmZHI7Ci0KLSAgLyogV2hlbiByZWxheGluZyBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLCB3ZSBtYXkgbmVlZCB0byBhZGp1c3QKLSAgICAgc3ltYm9sIHZhbHVlcyB3aGVuIHRoZXkgYXJlIG91dHB1dC4gIFRoaXMgaXMgYSBsaW5rZWQgbGlzdCBvZgotICAgICBzdHJ1Y3R1cmVzIGluZGljYXRpbmcgaG93IHZhbHVlcyBzaG91bGQgYmUgYWRqdXN0ZWQuICBUaGVyZSBpcyBubwotICAgICByZXF1aXJlbWVudCB0aGF0IHRoZSBlbnRyaWVzIGJlIGluIGFueSBvcmRlciwgb3IgdGhhdCB0aGV5IG5vdAotICAgICBvdmVybGFwLiAgVGhpcyBmaWVsZCBpcyBub3JtYWxseSBOVUxMLCBpbiB3aGljaCBjYXNlIG5vCi0gICAgIGFkanVzdG1lbnRzIG5lZWQgdG8gYmUgbWFkZS4gICovCi0gIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKmFkanVzdDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBob3cgdG8gYWRqdXN0IHN5bWJvbCB2YWx1ZXMgd2hlbgotICAgb3V0cHV0dGluZyBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLiAgVGhlc2UgYWRqdXN0bWVudHMgb25seSBhcHBseSB0bwotICAgdGhlIGludGVybmFsIHN5bWJvbHMsIGFzIHRoZSBleHRlcm5hbCBzeW1ib2wgdmFsdWVzIHdpbGwgY29tZSBmcm9tCi0gICB0aGUgaGFzaCB0YWJsZSBhbmQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRqdXN0ZWQuICAqLwotCi1zdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0Ci17Ci0gIC8qIE5leHQgZW50cnkgb24gYWRqdXN0bWVudCBsaXN0LiAgKi8KLSAgc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqbmV4dDsKLSAgLyogU3RhcnRpbmcgVk1BIG9mIGFkanVzdG1lbnQuICBUaGlzIGlzIHRoZSBWTUEgaW4gdGhlIEVDT0ZGIGZpbGUsCi0gICAgIG5vdCB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgVGh1cyBpdCBzaG91bGQKLSAgICAgaW5kaWNhdGUgYSBwYXJ0aWN1bGFyIHNlY3Rpb24uICAqLwotICBiZmRfdm1hIHN0YXJ0OwotICAvKiBFbmRpbmcgVk1BIG9mIGFkanVzdG1lbnQuICAqLwotICBiZmRfdm1hIGVuZDsKLSAgLyogQWRqdXN0bWVudC4gIFRoaXMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLCBvcgotICAgICBGRFIuICBUaGlzIGlzIHplcm8gZm9yIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcnJheS4gICovCi0gIGxvbmcgYWRqdXN0OwotfTsKLQotLyogVGhlc2Ugc3RydWN0dXJlcyBhcmUgdXNlZCBieSB0aGUgRUNPRkYgZmluZF9uZWFyZXN0X2xpbmUgZnVuY3Rpb24uICAqLwotCi1zdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5Ci17Ci0gIC8qIEJhc2UgYWRkcmVzcyBpbiAudGV4dCBvZiB0aGlzIEZEUi4gICovCi0gIGJmZF92bWEgYmFzZV9hZGRyOwotICBGRFIgKmZkcjsKLX07Ci0KLXN0cnVjdCBlY29mZl9maW5kX2xpbmUKLXsKLSAgLyogQWxsb2NhdGVkIG1lbW9yeSB0byBob2xkIGZ1bmN0aW9uIGFuZCBmaWxlIG5hbWVzLiAgKi8KLSAgY2hhciAqZmluZF9idWZmZXI7Ci0KLSAgLyogRkRSIHRhYmxlLCBzb3J0ZWQgYnkgYWRkcmVzczogKi8KLSAgbG9uZyBmZHJ0YWJfbGVuOwotICBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICpmZHJ0YWI7Ci0KLSAgLyogQ2FjaGUgZW50cnkgZm9yIG1vc3QgcmVjZW50bHkgZm91bmQgbGluZSBpbmZvcm1hdGlvbi4gIFRoZSBzZWN0Ci0gICAgIGZpZWxkIGlzIE5VTEwgaWYgdGhpcyBjYWNoZSBkb2VzIG5vdCBjb250YWluIHZhbGlkIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0Ci0gICAgewotICAgICAgYXNlY3Rpb24gKnNlY3Q7Ci0gICAgICBiZmRfdm1hIHN0YXJ0OwotICAgICAgYmZkX3ZtYSBzdG9wOwotICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgICBjb25zdCBjaGFyICpmdW5jdGlvbm5hbWU7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGluZV9udW07Ci0gICAgfSBjYWNoZTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNXQVBQSU5HICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBnZW5lcmljIEVDT0ZGIGNvZGUgbmVlZHMgdG8gYmUgYWJsZSB0byBzd2FwIGRlYnVnZ2luZwotICAgaW5mb3JtYXRpb24gaW4gYW5kIG91dCBpbiB0aGUgc3BlY2lmaWMgZm9ybWF0IHVzZWQgYnkgYSBwYXJ0aWN1bGFyCi0gICBFQ09GRiBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgc3RydWN0dXJlIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbgotICAgbmVlZGVkIHRvIGRvIHRoaXMuICAqLwotCi1zdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcAotewotICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgaW50IHN5bV9tYWdpYzsKLSAgLyogQWxpZ25tZW50IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEUuZy4sIDQuICAqLwotICBiZmRfc2l6ZV90eXBlIGRlYnVnX2FsaWduOwotICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfaGRyX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZG5yX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcGRyX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfc3ltX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfb3B0X3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZmRyX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmZkX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIGluIGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICB2b2lkICgqc3dhcF9oZHJfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEhEUlIgKikpOwotICB2b2lkICgqc3dhcF9kbnJfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEROUiAqKSk7Ci0gIHZvaWQgKCpzd2FwX3Bkcl9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgUERSICopKTsKLSAgdm9pZCAoKnN3YXBfc3ltX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBTWU1SICopKTsKLSAgdm9pZCAoKnN3YXBfb3B0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBPUFRSICopKTsKLSAgdm9pZCAoKnN3YXBfZmRyX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBGRFIgKikpOwotICB2b2lkICgqc3dhcF9yZmRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFJGRFQgKikpOwotICB2b2lkICgqc3dhcF9leHRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEVYVFIgKikpOwotICB2b2lkICgqc3dhcF90aXJfaW4pIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHRpcl9leHQgKiwgVElSICopKTsKLSAgdm9pZCAoKnN3YXBfcm5keF9pbikgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3Qgcm5keF9leHQgKiwgUk5EWFIgKikpOwotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIHZvaWQgKCpzd2FwX2hkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBIRFJSICosIFBUUikpOwotICB2b2lkICgqc3dhcF9kbnJfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRE5SICosIFBUUikpOwotICB2b2lkICgqc3dhcF9wZHJfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgUERSICosIFBUUikpOwotICB2b2lkICgqc3dhcF9zeW1fb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgU1lNUiAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfb3B0X291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IE9QVFIgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX2Zkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBGRFIgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX3JmZF9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBSRkRUICosIFBUUikpOwotICB2b2lkICgqc3dhcF9leHRfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRVhUUiAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfdGlyX291dCkgUEFSQU1TICgoaW50LCBjb25zdCBUSVIgKiwgc3RydWN0IHRpcl9leHQgKikpOwotICB2b2lkICgqc3dhcF9ybmR4X291dCkgUEFSQU1TICgoaW50LCBjb25zdCBSTkRYUiAqLCBzdHJ1Y3Qgcm5keF9leHQgKikpOwotICAvKiBGdW5jdGlvbiB0byByZWFkIHN5bWJvbCBkYXRhIGFuZCBzZXQgdXAgcG9pbnRlcnMgaW4KLSAgICAgZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3R1cmUuICBUaGUgc2VjdGlvbiBhcmd1bWVudCBpcyB1c2VkIGZvcgotICAgICBFTEYsIG5vdCBzdHJhaWdodCBFQ09GRi4gICovCi0gIGJvb2xlYW4gKCpyZWFkX2RlYnVnX2luZm8pIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCSAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICopKTsKLX07Ci0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKEVDT0ZGX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvZ28zMmV4ZS5oIGIvaW5jbHVkZS9jb2ZmL2dvMzJleGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkMjZjMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvZ28zMmV4ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyogQ09GRiBpbmZvcm1hdGlvbiBmb3IgUEMgcnVubmluZyBnbzMyLiAgKi8KLQotI2RlZmluZSBTVFVCU0laRSAyMDQ4Ci0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyX2dvMzJfZXhlIHsKLQljaGFyIHN0dWJbU1RVQlNJWkVdOwkvKiB0aGUgc3R1YiB0byBsb2FkIHRoZSBpbWFnZQkqLwotCS8qIHRoZSBzdGFuZGFyZCBDT0ZGIGhlYWRlciAqLwotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSN1bmRlZiBGSUxIRFIKLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyX2dvMzJfZXhlCi0jdW5kZWYgRklMSFNaCi0jZGVmaW5lCUZJTEhTWglTVFVCU0laRSsyMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2g4MzAwLmggYi9pbmNsdWRlL2NvZmYvaDgzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI2MjM5NC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvaDgzMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIEhpdGFjaGkgSDgvMzAwIGFuZCBIOC8zMDAtSCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0KLSNkZWZpbmUJSDgzMDBNQUdJQwkweDgzMDAKLSNkZWZpbmUJSDgzMDBITUFHSUMJMHg4MzAxCi0jZGVmaW5lCUg4MzAwU01BR0lDCTB4ODMwMgotCi0jZGVmaW5lIEg4MzAwQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPUg4MzAwTUFHSUMpKQotI2RlZmluZSBIODMwMEhCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9SDgzMDBITUFHSUMpKQotI2RlZmluZSBIODMwMFNCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9SDgzMDBTTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCi0gICB0eXBlcyBvbiB0aGUgaDggZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQotICAgb2Zmc2V0IC0gZWcgdGhlIHN0cmFuZ2UganVtcCBhbmQgaGlnaCBwYWdlIGFkZHJlc3NpbmcgbW9kZXMgKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX3N0dWZmWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCi0KLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaDg1MDAuaCBiL2luY2x1ZGUvY29mZi9oODUwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzA1YmYyYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvaDg1MDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIEhpdGFjaGkgSDgvNTAwICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLQotI2RlZmluZQlIODUwME1BR0lDCTB4ODUwMAotCi0KLSNkZWZpbmUgSDg1MDBCQURNQUcoeCkgKCgweGZmZmYgJiYgKCh4KS5mX21hZ2ljKSE9SDg1MDBNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0jZGVmaW5lIEFPVVRTWiAyOAotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1s0XTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSBoOCBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCi0gICBvZmZzZXQgLSBlZyB0aGUgc3RyYW5nZSBqdW1wIGFuZCBoaWdoIHBhZ2UgYWRkcmVzc2luZyBtb2RlcyAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfc3R1ZmZbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9pMzg2LmggYi9pbmNsdWRlL2NvZmYvaTM4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWJmNGEyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9pMzg2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBJbnRlbCAzODYvNDg2LiAgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyogQml0cyBmb3IgZl9mbGFnczoKLSAqCUZfUkVMRkxHCXJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfRVhFQwkJZmlsZSBpcyBleGVjdXRhYmxlIChubyB1bnJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMpCi0gKglGX0xOTk8JCWxpbmUgbnVtYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfTFNZTVMJCWxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0FSMzJXUglmaWxlIGhhcyBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXUiBtYWNoaW5lIChlLmcuIHZheCkKLSAqLwotCi0jZGVmaW5lIEZfUkVMRkxHCSgweDAwMDEpCi0jZGVmaW5lIEZfRVhFQwkJKDB4MDAwMikKLSNkZWZpbmUgRl9MTk5PCQkoMHgwMDA0KQotI2RlZmluZSBGX0xTWU1TCQkoMHgwMDA4KQotCi0KLQotI2RlZmluZQlJMzg2TUFHSUMJMHgxNGMKLSNkZWZpbmUgSTM4NlBUWE1BR0lDCTB4MTU0Ci0jZGVmaW5lIEkzODZBSVhNQUdJQwkweDE3NQotCi0vKiBUaGlzIGlzIEx5bngncyBhbGwtcGxhdGZvcm0gbWFnaWMgbnVtYmVyIGZvciBleGVjdXRhYmxlcy4gKi8KLQotI2RlZmluZSBMWU5YQ09GRk1BR0lDCTA0MTUKLQotI2RlZmluZSBJMzg2QkFETUFHKHgpICgoKHgpLmZfbWFnaWMgIT0gSTM4Nk1BR0lDKSBcCi0JCSAgICAgICAmJiAoeCkuZl9tYWdpYyAhPSBJMzg2QUlYTUFHSUMgXAotCQkgICAgICAgJiYgKHgpLmZfbWFnaWMgIT0gSTM4NlBUWE1BR0lDIFwKLQkJICAgICAgICYmICh4KS5mX21hZ2ljICE9IExZTlhDT0ZGTUFHSUMpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0KLQotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotI2RlZmluZSBPTUFHSUMgICAgICAgICAgMDQwNCAgICAvKiBvYmplY3QgZmlsZXMsIGVnIGFzIG91dHB1dCAqLwotI2RlZmluZSBaTUFHSUMgICAgICAgICAgMDQxMyAgICAvKiBkZW1hbmQgbG9hZCBmb3JtYXQsIGVnIG5vcm1hbCBsZCBvdXRwdXQgKi8KLSNkZWZpbmUgU1RNQUdJQwkJMDQwMQkvKiB0YXJnZXQgc2hsaWIgKi8KLSNkZWZpbmUgU0hNQUdJQwkJMDQ0MwkvKiBob3N0ICAgc2hsaWIgKi8KLQotCi0vKiBkZWZpbmUgc29tZSBOVCBkZWZhdWx0IHZhbHVlcyAqLwotLyogICNkZWZpbmUgTlRfSU1BR0VfQkFTRSAgICAgICAgMHg0MDAwMDAgbW92ZWQgdG8gaW50ZXJuYWwuaCAqLwotI2RlZmluZSBOVF9TRUNUSU9OX0FMSUdOTUVOVCAweDEwMDAKLSNkZWZpbmUgTlRfRklMRV9BTElHTk1FTlQgICAgMHgyMDAKLSNkZWZpbmUgTlRfREVGX1JFU0VSVkUgICAgICAgMHgxMDAwMDAKLSNkZWZpbmUgTlRfREVGX0NPTU1JVCAgICAgICAgMHgxMDAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0jZGVmaW5lIF9MSUIgIi5saWIiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotI2RlZmluZSBOX0JUTUFTSwkoMHhmKQotI2RlZmluZSBOX1RNQVNLCQkoMHgzMCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCQljaGFyIHhfY2hlY2tzdW1bNF07CS8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtICovCi0JCWNoYXIgeF9hc3NvY2lhdGVkWzJdOwkvKiBDT01EQVQgYXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi0JCWNoYXIgeF9jb21kYXRbMV07CS8qIENPTURBVCBzZWxlY3Rpb24gbnVtYmVyICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLSMJZGVmaW5lIF9FVEVYVAkiZXRleHQiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxMAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaTg2MC5oIGIvaW5jbHVkZS9jb2ZmL2k4NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM2ODZlOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvaTg2MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qIFRoaXMgZmlsZSB3YXMgaGFja2VkIGZyb20gaTM4Ni5oICAgW2RvbGFuQHNzZC5pbnRlbC5jb21dICovCi0KLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgSW50ZWwgODYwLiAgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfQVIzMldSCWZpbGUgaGFzIGJ5dGUgb3JkZXJpbmcgb2YgYW4gQVIzMldSIG1hY2hpbmUgKGUuZy4gdmF4KQotICovCi0KLSNkZWZpbmUgRl9SRUxGTEcJKDB4MDAwMSkKLSNkZWZpbmUgRl9FWEVDCQkoMHgwMDAyKQotI2RlZmluZSBGX0xOTk8JCSgweDAwMDQpCi0jZGVmaW5lIEZfTFNZTVMJCSgweDAwMDgpCi0KLQotCi0jZGVmaW5lCUk4NjBNQUdJQwkweDE0ZAotCi0jZGVmaW5lIEk4NjBCQURNQUcoeCkgICAoKHgpLmZfbWFnaWMgIT0gSTg2ME1BR0lDKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotLyogRklYTUU6IFdoYXQgYXJlIHRoZSBhLm91dCBtYWdpYyBudW1iZXJzPyAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLSNkZWZpbmUgX0xJQiAiLmxpYiIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0jZGVmaW5lIE5fQlRNQVNLCSgweGYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotIwlkZWZpbmUgX0VURVhUCSJldGV4dCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaTk2MC5oIGIvaW5jbHVkZS9jb2ZmL2k5NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzNTgzNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvaTk2MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgODA5NjAuICBPcmlnaW5zOiBJbnRlbCBjb3JwLCBuYXRjaC4gKi8KLQotLyogTk9URTogVGFnZW50cmllcyAoY2YgVEFHQklUUykgYXJlIG5vIGxvbmdlciB1c2VkIGJ5IHRoZSA5NjAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUgT01BR0lDICAgICAgKDA0MDcpCS8qIG9sZCBpbXB1cmUgZm9ybWF0LiBkYXRhIGltbWVkaWF0ZWx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd3MgdGV4dC4gYm90aCBzZWN0aW9ucyBhcmUgcncuICovCi0jZGVmaW5lIE5NQUdJQyAgICAgICgwNDEwKQkvKiBzcGxpdCBpJmQsIHJlYWQtb25seSB0ZXh0ICovCi0KLS8qCi0qCUludGVsIDgwOTYwIChJOTYwKSBwcm9jZXNzb3IgZmxhZ3MuCi0qCUZfSTk2MFRZUEUgPT0gbWFzayBmb3IgcHJvY2Vzc29yIHR5cGUgZmllbGQuIAotKi8KLQotI2RlZmluZQlGX0k5NjBUWVBFCSgweGYwMDApCi0jZGVmaW5lCUZfSTk2MENPUkUJKDB4MTAwMCkKLSNkZWZpbmUJRl9JOTYwS0IJKDB4MjAwMCkKLSNkZWZpbmUJRl9JOTYwU0IJKDB4MjAwMCkKLSNkZWZpbmUJRl9JOTYwTUMJKDB4MzAwMCkKLSNkZWZpbmUJRl9JOTYwWEEJKDB4NDAwMCkKLSNkZWZpbmUJRl9JOTYwQ0EJKDB4NTAwMCkKLSNkZWZpbmUJRl9JOTYwS0EJKDB4NjAwMCkKLSNkZWZpbmUJRl9JOTYwU0EJKDB4NjAwMCkKLSNkZWZpbmUgRl9JOTYwSlgJKDB4NzAwMCkKLSNkZWZpbmUgRl9JOTYwSFgJKDB4ODAwMCkKLQotCi0vKiogaTgwOTYwIE1hZ2ljIE51bWJlcnMKLSovCi0KLSNkZWZpbmUgSTk2MFJPTUFHSUMJKDB4MTYwKQkvKiByZWFkLW9ubHkgdGV4dCBzZWdtZW50cyAqLwotI2RlZmluZSBJOTYwUldNQUdJQwkoMHgxNjEpCS8qIHJlYWQtd3JpdGUgdGV4dCBzZWdtZW50cyAqLwotCi0jZGVmaW5lIEk5NjBCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9STk2MFJPTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9STk2MFJXTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZwlwaHlzX2FkZHI7Ci0JdW5zaWduZWQgbG9uZwliaXRhcnJheTsKLX0gVEFHQklUUzsKLQotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhcgl0YWdlbnRyaWVzWzRdOwkJLyogbnVtYmVyIG9mIHRhZyBlbnRyaWVzIHRvIGZvbGxvdyAqLwotfQotQU9VVEhEUjsKLQotLyogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgdGFnIGJpdHMgYXJyYXkgKi8KLQotI2RlZmluZSBUQUdQVFIoYW91dCkgKChUQUdCSVRTICopICgmKGFvdXQudGFnZW50cmllcykrMSkpCi0KLS8qIGNvbXB1dGUgc2l6ZSBvZiBhIGhlYWRlciAqLwotCi0vKiNkZWZpbmUgQU9VVFNaKGFvdXQpIChzaXplb2YoQU9VVEhEUikrKGFvdXQudGFnZW50cmllcypzaXplb2YoVEFHQklUUykpKSovCi0jZGVmaW5lIEFPVVRTWiAzMgotI2RlZmluZSBBT1VUSERSU1ogMzIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLQljaGFyIAkJc19hbGlnbls0XTsJLyogc2VjdGlvbiBhbGlnbm1lbnQJCSovCi19OwotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQ0Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVCAgICIudGV4dCIKLSNkZWZpbmUgX0RBVEEgICAiLmRhdGEiCi0jZGVmaW5lIF9CU1MgICAgIi5ic3MiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJCS8qIGxpbmUgbnVtYmVyCQkqLwotCWNoYXIgcGFkZGluZ1syXTsJLyogZm9yY2UgYWxpZ25tZW50CSovCi19OwotCi0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV9mbGFnc1syXTsKLSAgY2hhciBlX3R5cGVbNF07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci0gIGNoYXIgcGFkMlsyXTsKLX07Ci0KLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4MWYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNSkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogIEk5NjAtc3BlY2lmaWMgKjJuZCogYXV4LiBlbnRyeSBmb3JtYXRzCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlzdHJ1Y3QgewotCSAgLyogVGhpcyBpcyBhIHZlcnkgb2xkIHR5cG8gdGhhdCBrZWVwcyBnZXR0aW5nIHByb3BhZ2F0ZWQuICovCi0jZGVmaW5lIHhfc3RkaW5keCB4X3N0aW5keAotCQljaGFyIHhfc3RpbmR4WzRdOwkvKiBzeXMuIHRhYmxlIGVudHJ5ICovCi0JfSB4X3NjOwkvKiBzeXN0ZW0gY2FsbCBlbnRyeSAqLwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X2JhbG50cnlbNF07IC8qIEJBTCBlbnRyeSBwb2ludCAqLwotCX0geF9iYWw7IC8qIEJBTC1jYWxsYWJsZSBmdW5jdGlvbiAqLwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90aW1lc3RhbXBbNF07CSAgICAgICAgLyogdGltZSBzdGFtcCAqLwotCQljaGFyIAl4X2lkc3RyaW5nWzIwXTsJICAgICAgICAvKiBwcm9kdWNlciBpZGVudGl0eSBzdHJpbmcgKi8KLQl9IHhfaWRlbnQ7CSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb2R1Y2VyIGlkZW50IGluZm8gKi8KLQotfTsKLQotCi0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTI0Ci0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTI0Ci0KLSMJZGVmaW5lIF9FVEVYVAkiX2V0ZXh0IgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciBwYWRbMl07Ci19OwotCi0vKiByX3R5cGUgdmFsdWVzIGZvciB0aGUgaTk2MC4gICovCi0KLS8qIFRoZSBpOTYwIHVzZXMgUl9SRUxMT05HLCB3aGljaCBpcyBkZWZpbmVkIGluIGludGVybmFsLmggYXMgMHgxMS4KLSAgIEl0IGlzIGFuIGFic29sdXRlIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLQotI2RlZmluZSBSX0lQUk1FRCAJKDB4MTkpCS8qIDI0LWJpdCBpcC1yZWxhdGl2ZSByZWxvY2F0aW9uICovCi0jZGVmaW5lIFJfT1BUQ0FMTAkoMHgxYikJLyogMzItYml0IG9wdGltaXphYmxlIGNhbGwgKGxlYWZwcm9jL3N5c3Byb2MpICovCi0jZGVmaW5lIFJfT1BUQ0FMTFgJKDB4MWMpCS8qIDY0LWJpdCBvcHRpbWl6YWJsZSBjYWxsIChsZWFmcHJvYy9zeXNwcm9jKSAqLwotCi0vKiBUaGUgZm9sbG93aW5nIHJlbG9jYXRpb24gdHlwZXMgYXJlIGRlZmluZWQgdXNlIGJ5IHJlbGF4aW5nIGxpbmtlcnMsCi0gICB3aGljaCBjb252ZXJ0IDMyIGJpdCBjYWxscyAod2hpY2ggcmVxdWlyZSBhIDY0IGJpdCBpbnN0cnVjdGlvbikKLSAgIGludG8gMjQgYml0IGNhbGxzICh3aGljaCByZXF1aXJlIGEgMzIgYml0IGluc3RydWN0aW9uKSB3aGVuCi0gICBwb3NzaWJsZS4gIEl0IHdpbGwgYmUgcG9zc2libGUgd2hlbmV2ZXIgdGhlIHRhcmdldCBvZiB0aGUgY2FsbCBpcwotICAgd2l0aGluIGEgMjQgYml0IHJhbmdlIG9mIHRoZSBjYWxsIGluc3RydWN0aW9uLgotCi0gICBJdCBpcyBhbHdheXMgc2FmZSB0byBpZ25vcmUgdGhlc2UgcmVsb2NhdGlvbnMuICBUaGV5IG9ubHkgc2VydmUgdG8KLSAgIG1hcmsgcG9pbnRzIHdoaWNoIHRoZSByZWxheGluZyBsaW5rZXIgd2lsbCBoYXZlIHRvIGNvbnNpZGVyLiAgVGhlCi0gICBhc3NlbWJsZXIgbXVzdCBlbnN1cmUgdGhhdCB0aGUgY29ycmVjdCBjb2RlIGlzIGdlbmVyYXRlZCBldmVuIGlmCi0gICB0aGUgcmVsb2NhdGlvbnMgYXJlIGlnbm9yZWQuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIG1lYW5zIHRoYXQgdGhlCi0gICBSX0lQUjEzIHJlbG9jYXRpb24gbWF5IG5vdCBhcHBlYXIgd2l0aCBhbiBleHRlcm5hbCBzeW1ib2wuICAqLwotCi0jZGVmaW5lIFJfSVBSMTMJCSgweDFkKQkvKiAxMyBiaXQgaXAtcmVsYXRpdmUgYnJhbmNoICovCi0jZGVmaW5lIFJfQUxJR04JCSgweDFlKSAgLyogYWxpZ25tZW50IG1hcmtlci4gIFRoaXMgaGFzIG5vCi0JCQkJICAgYXNzb2NpYXRlZCBzeW1ib2wuICBJbnN0ZWFkLCB0aGUKLQkJCQkgICByX3N5bW5keCBmaWVsZCBpbmRpY2F0ZXMgdGhlCi0JCQkJICAgcmVxdWlyZSBhbGlnbm1lbnQgYXQgdGhpcyBwb2ludCBpbgotCQkJCSAgIHRoZSBmaWxlLiAgSXQgbXVzdCBiZSBhIHBvd2VyIG9mIDIuICAqLwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxMgotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaW50ZXJuYWwuaCBiL2luY2x1ZGUvY29mZi9pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWVhOTUxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzI4ICswLDAgQEAKLS8qIEludGVybmFsIGZvcm1hdCBvZiBDT0ZGIG9iamVjdCBmaWxlIGRhdGEgc3RydWN0dXJlcywgZm9yIEdOVSBCRkQuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuICAqLwotCi0jaWZuZGVmIEdOVV9DT0ZGX0lOVEVSTkFMX0gKLSNkZWZpbmUgR05VX0NPRkZfSU5URVJOQUxfSCAxCi0KLS8qIEZpcnN0LCBtYWtlICJzaWduZWQgY2hhciIgd29yaywgZXZlbiBvbiBvbGQgY29tcGlsZXJzLiAqLwotI2lmbmRlZiBzaWduZWQKLSNpZm5kZWYgX19TVERDX18KLSNkZWZpbmUJc2lnbmVkCQkJLyoqLwotI2VuZGlmCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZXh0cmEgc3R1ZmYgaW4gYSBQRSBoZWFkZXIuICovCi0KLXN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9maWxlaGRyCi17Ci0gIC8qIERPUyBoZWFkZXIgZGF0YSBmb2xsb3dzIGZvciBQRSBzdHVmZiAqLwotICB1bnNpZ25lZCBzaG9ydCBlX21hZ2ljOwkvKiBNYWdpYyBudW1iZXIsIDB4NWE0ZCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2NibHA7CS8qIEJ5dGVzIG9uIGxhc3QgcGFnZSBvZiBmaWxlLCAweDkwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfY3A7CQkvKiBQYWdlcyBpbiBmaWxlLCAweDMgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9jcmxjOwkvKiBSZWxvY2F0aW9ucywgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfY3BhcmhkcjsJLyogU2l6ZSBvZiBoZWFkZXIgaW4gcGFyYWdyYXBocywgMHg0ICovCi0gIHVuc2lnbmVkIHNob3J0IGVfbWluYWxsb2M7CS8qIE1pbmltdW0gZXh0cmEgcGFyYWdyYXBocyBuZWVkZWQsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX21heGFsbG9jOwkvKiBNYXhpbXVtIGV4dHJhIHBhcmFncmFwaHMgbmVlZGVkLCAweEZGRkYgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9zczsJCS8qIEluaXRpYWwgKHJlbGF0aXZlKSBTUyB2YWx1ZSwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfc3A7CQkvKiBJbml0aWFsIFNQIHZhbHVlLCAweGI4ICovCi0gIHVuc2lnbmVkIHNob3J0IGVfY3N1bTsJLyogQ2hlY2tzdW0sIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2lwOwkJLyogSW5pdGlhbCBJUCB2YWx1ZSwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfY3M7CQkvKiBJbml0aWFsIChyZWxhdGl2ZSkgQ1MgdmFsdWUsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2xmYXJsYzsJLyogRmlsZSBhZGRyZXNzIG9mIHJlbG9jYXRpb24gdGFibGUsIDB4NDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9vdm5vOwkvKiBPdmVybGF5IG51bWJlciwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfcmVzWzRdOwkvKiBSZXNlcnZlZCB3b3JkcywgYWxsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX29lbWlkOwkvKiBPRU0gaWRlbnRpZmllciAoZm9yIGVfb2VtaW5mbyksIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX29lbWluZm87CS8qIE9FTSBpbmZvcm1hdGlvbjsgZV9vZW1pZCBzcGVjaWZpYywgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfcmVzMlsxMF07CS8qIFJlc2VydmVkIHdvcmRzLCBhbGwgMHgwICovCi0gIGJmZF92bWEgIGVfbGZhbmV3OwkJLyogRmlsZSBhZGRyZXNzIG9mIG5ldyBleGUgaGVhZGVyLCAweDgwICovCi0gIHVuc2lnbmVkIGxvbmcgZG9zX21lc3NhZ2VbMTZdOyAvKiB0ZXh0IHdoaWNoIGFsd2F5cyBmb2xsb3dzIGRvcyBoZWFkZXIgKi8KLSAgYmZkX3ZtYSAgbnRfc2lnbmF0dXJlOyAgIAkvKiByZXF1aXJlZCBOVCBzaWduYXR1cmUsIDB4NDU1MCAqLyAKLX07Ci0KLXN0cnVjdCBpbnRlcm5hbF9maWxlaGRyCi17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9maWxlaGRyIHBlOwotCi0gIC8qIHN0YW5kYXJkIGNvZmYgIGludGVybmFsIGluZm8gKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9tYWdpYzsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9uc2NuczsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotICBsb25nIGZfdGltZGF0OwkJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0gIGJmZF92bWEgZl9zeW1wdHI7CQkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0gIGxvbmcgZl9uc3ltczsJCQkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9vcHRoZHI7CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotICB1bnNpZ25lZCBzaG9ydCBmX2ZsYWdzOwkvKiBmbGFncwkJCSovCi0gIHVuc2lnbmVkIHNob3J0IGZfdGFyZ2V0X2lkOwkvKiAoVEljODAgc3BlY2lmaWMpCQkqLwotfTsKLQotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfQVIxNldSCWZpbGUgaXMgMTYtYml0IGxpdHRsZS1lbmRpYW4KLSAqCUZfQVIzMldSCWZpbGUgaXMgMzItYml0IGxpdHRsZS1lbmRpYW4KLSAqCUZfQVIzMlcJCWZpbGUgaXMgMzItYml0IGJpZy1lbmRpYW4KLSAqCUZfRFlOTE9BRAlycy82MDAwIGFpeDogZHluYW1pY2FsbHkgbG9hZGFibGUgdy9pbXBvcnRzICYgZXhwb3J0cwotICoJRl9TSFJPQkoJcnMvNjAwMCBhaXg6IGZpbGUgaXMgYSBzaGFyZWQgb2JqZWN0Ci0gKiAgICAgIEZfRExMICAgICAgICAgICBQRSBmb3JtYXQgRExMCi0gKi8KLQotI2RlZmluZQlGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZQlGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lCUZfTE5OTwkJKDB4MDAwNCkKLSNkZWZpbmUJRl9MU1lNUwkJKDB4MDAwOCkKLSNkZWZpbmUJRl9BUjE2V1IJKDB4MDA4MCkKLSNkZWZpbmUJRl9BUjMyV1IJKDB4MDEwMCkKLSNkZWZpbmUJRl9BUjMyVyAgICAgCSgweDAyMDApCi0jZGVmaW5lCUZfRFlOTE9BRAkoMHgxMDAwKQotI2RlZmluZQlGX1NIUk9CSgkoMHgyMDAwKQotI2RlZmluZSBGX0RMTCAgICAgICAgICAgKDB4MjAwMCkKLQotLyogZXh0cmEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgaW4gdGhlIG9wdGlvbmFsIGhlYWRlciAqLwotdHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0RBVEFfRElSRUNUT1JZIAotewotICBiZmRfdm1hIFZpcnR1YWxBZGRyZXNzOwotICBsb25nICAgIFNpemU7Ci19ICBJTUFHRV9EQVRBX0RJUkVDVE9SWTsKLSNkZWZpbmUgSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVMgIDE2Ci0KLS8qIGRlZmF1bHQgaW1hZ2UgYmFzZSBmb3IgTlQgKi8KLSNkZWZpbmUgTlRfRVhFX0lNQUdFX0JBU0UgMHg0MDAwMDAKLSNkZWZpbmUgTlRfRExMX0lNQUdFX0JBU0UgMHgxMDAwMDAwMAotCi0vKiBFeHRyYSBzdHVmZiBpbiBhIFBFIGFvdXRoZHIgKi8KLQotI2RlZmluZSBQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQgMHgxMDAwCi0jZGVmaW5lIFBFX0RFRl9GSUxFX0FMSUdOTUVOVCAweDIwMAotCi1zdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAKLXsKLSAgLyogUEUgc3R1ZmYgICovCi0gIGJmZF92bWEgSW1hZ2VCYXNlOwkJLyogYWRkcmVzcyBvZiBzcGVjaWZpYyBsb2NhdGlvbiBpbiBtZW1vcnkgdGhhdAotCQkJCSAgIGZpbGUgaXMgbG9jYXRlZCwgTlQgZGVmYXVsdCAweDEwMDAwICovCi0KLSAgYmZkX3ZtYSBTZWN0aW9uQWxpZ25tZW50OwkvKiBzZWN0aW9uIGFsaWdubWVudCBkZWZhdWx0IDB4MTAwMCAqLwotICBiZmRfdm1hIEZpbGVBbGlnbm1lbnQ7CS8qIGZpbGUgYWxpZ25tZW50IGRlZmF1bHQgMHgyMDAgKi8KLSAgc2hvcnQgICBNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb247IC8qIG1pbmltdW0gdmVyc2lvbiBvZiB0aGUgb3BlcmF0aW5nICovCi0gIHNob3J0ICAgTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOyAvKiBzeXN0ZW0gcmVxJ2QgZm9yIGV4ZSwgZGVmYXVsdCB0byAxKi8KLSAgc2hvcnQgICBNYWpvckltYWdlVmVyc2lvbjsJLyogdXNlciBkZWZpbmVhYmxlIGZpZWxkIHRvIHN0b3JlIHZlcnNpb24gb2YgKi8KLSAgc2hvcnQgICBNaW5vckltYWdlVmVyc2lvbjsJLyogZXhlIG9yIGRsbCBiZWluZyBjcmVhdGVkLCBkZWZhdWx0IHRvIDAgKi8gCi0gIHNob3J0ICAgTWFqb3JTdWJzeXN0ZW1WZXJzaW9uOyAvKiBtaW5pbXVtIHN1YnN5c3RlbSB2ZXJzaW9uIHJlcXVpcmVkIHRvICovCi0gIHNob3J0ICAgTWlub3JTdWJzeXN0ZW1WZXJzaW9uOyAvKiBydW4gZXhlOyBkZWZhdWx0IHRvIDMuMSAqLwotICBsb25nICAgIFJlc2VydmVkMTsJCS8qIHNlZW1zIHRvIGJlIDAgKi8KLSAgbG9uZyAgICBTaXplT2ZJbWFnZTsJCS8qIHNpemUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIGZvciBwcm9nICovCi0gIGxvbmcgICAgU2l6ZU9mSGVhZGVyczsJLyogc2l6ZSBvZiBQRSBoZWFkZXIgYW5kIHNlY3Rpb24gdGFibGUgKi8KLSAgbG9uZyAgICBDaGVja1N1bTsJCS8qIHNldCB0byAwICovCi0gIHNob3J0ICAgU3Vic3lzdGVtOwkKLQotICAvKiB0eXBlIG9mIHN1YnN5c3RlbSBleGUgdXNlcyBmb3IgdXNlciBpbnRlcmZhY2UsCi0gICAgIHBvc3NpYmxlIHZhbHVlczoKLSAgICAgMSAtIE5BVElWRSAgIERvZXNuJ3QgcmVxdWlyZSBhIHN1YnN5c3RlbQotICAgICAyIC0gV0lORE9XU19HVUkgcnVucyBpbiBXaW5kb3dzIEdVSSBzdWJzeXN0ZW0KLSAgICAgMyAtIFdJTkRPV1NfQ1VJIHJ1bnMgaW4gV2luZG93cyBjaGFyIHN1Yi4gKGNvbnNvbGUgYXBwKQotICAgICA1IC0gT1MyX0NVSSBydW5zIGluIE9TLzIgY2hhcmFjdGVyIHN1YnN5c3RlbQotICAgICA3IC0gUE9TSVhfQ1VJIHJ1bnMgaW4gUG9zaXggY2hhcmFjdGVyIHN1YnN5c3RlbSAqLwotICBzaG9ydCAgIERsbENoYXJhY3RlcmlzdGljczsJLyogZmxhZ3MgZm9yIERMTCBpbml0LCB1c2UgMCAqLwotICBiZmRfdm1hIFNpemVPZlN0YWNrUmVzZXJ2ZTsJLyogYW1vdW50IG9mIG1lbW9yeSB0byByZXNlcnZlICAqLwotICBiZmRfdm1hIFNpemVPZlN0YWNrQ29tbWl0OwkvKiBhbW91bnQgb2YgbWVtb3J5IGluaXRpYWxseSBjb21taXR0ZWQgZm9yIAotCQkJCSAgIGluaXRpYWwgdGhyZWFkJ3Mgc3RhY2ssIGRlZmF1bHQgaXMgMHgxMDAwICovCi0gIGJmZF92bWEgU2l6ZU9mSGVhcFJlc2VydmU7CS8qIGFtb3VudCBvZiB2aXJ0dWFsIG1lbW9yeSB0byByZXNlcnZlIGFuZCAqLwotICBiZmRfdm1hIFNpemVPZkhlYXBDb21taXQ7CS8qIGNvbW1pdCwgZG9uJ3Qga25vdyB3aGF0IHRvIGRlZmF1dCBpdCB0byAqLwotICBsb25nICAgIExvYWRlckZsYWdzOwkJLyogY2FuIHByb2JhYmx5IHNldCB0byAwICovCi0gIGxvbmcgICAgTnVtYmVyT2ZSdmFBbmRTaXplczsJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gbmV4dCBlbnRyeSwgMTYgKi8KLSAgSU1BR0VfREFUQV9ESVJFQ1RPUlkgRGF0YURpcmVjdG9yeVtJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFU107Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgaW50ZXJuYWxfYW91dGhkcgotewotICBzaG9ydCBtYWdpYzsJCQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgc2hvcnQgdnN0YW1wOwkJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBiZmRfdm1hIHRzaXplOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGJmZF92bWEgZHNpemU7CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGJmZF92bWEgYnNpemU7CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGJmZF92bWEgZW50cnk7CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgYmZkX3ZtYSB0ZXh0X3N0YXJ0OwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBiZmRfdm1hIGRhdGFfc3RhcnQ7CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0KLSAgLyogaTk2MCBzdHVmZiAqLwotICB1bnNpZ25lZCBsb25nIHRhZ2VudHJpZXM7CS8qIG51bWJlciBvZiB0YWcgZW50cmllcyB0byBmb2xsb3cgKi8KLQotICAvKiBSUy82MDAwIHN0dWZmICovCi0gIHVuc2lnbmVkIGxvbmcgb190b2M7CQkvKiBhZGRyZXNzIG9mIFRPQwkJCSovCi0gIHNob3J0IG9fc25lbnRyeTsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciBlbnRyeSBwb2ludCAqLwotICBzaG9ydCBvX3NudGV4dDsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciB0ZXh0CSovCi0gIHNob3J0IG9fc25kYXRhOwkJLyogc2VjdGlvbiBudW1iZXIgZm9yIGRhdGEJKi8KLSAgc2hvcnQgb19zbnRvYzsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciB0b2MJKi8KLSAgc2hvcnQgb19zbmxvYWRlcjsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciBsb2FkZXIgc2VjdGlvbiAqLwotICBzaG9ydCBvX3NuYnNzOwkJLyogc2VjdGlvbiBudW1iZXIgZm9yIGJzcwkqLwotICBzaG9ydCBvX2FsZ250ZXh0OwkJLyogbWF4IGFsaWdubWVudCBmb3IgdGV4dAkqLwotICBzaG9ydCBvX2FsZ25kYXRhOwkJLyogbWF4IGFsaWdubWVudCBmb3IgZGF0YQkqLwotICBzaG9ydCBvX21vZHR5cGU7CQkvKiBNb2R1bGUgdHlwZSBmaWVsZCwgMVIsUkUsUk8JKi8KLSAgc2hvcnQgb19jcHV0eXBlOwkJLyogRW5jb2RlZCBDUFUgdHlwZQkJKi8KLSAgdW5zaWduZWQgbG9uZyBvX21heHN0YWNrOwkvKiBtYXggc3RhY2sgc2l6ZSBhbGxvd2VkLgkqLwotICB1bnNpZ25lZCBsb25nIG9fbWF4ZGF0YTsJLyogbWF4IGRhdGEgc2l6ZSBhbGxvd2VkLgkqLwotCi0gIC8qIEVDT0ZGIHN0dWZmICovCi0gIGJmZF92bWEgYnNzX3N0YXJ0OwkJLyogQmFzZSBvZiBic3Mgc2VjdGlvbi4JCSovCi0gIGJmZF92bWEgZ3BfdmFsdWU7CQkvKiBHUCByZWdpc3RlciB2YWx1ZS4JCSovCi0gIHVuc2lnbmVkIGxvbmcgZ3BybWFzazsJLyogR2VuZXJhbCByZWdpc3RlcnMgdXNlZC4JKi8KLSAgdW5zaWduZWQgbG9uZyBjcHJtYXNrWzRdOwkvKiBDb3Byb2Nlc3NvciByZWdpc3RlcnMgdXNlZC4JKi8KLSAgdW5zaWduZWQgbG9uZyBmcHJtYXNrOwkvKiBGbG9hdGluZyBwb2ludGVyIHJlZ2lzdGVycyB1c2VkLiAgKi8KLQotICAvKiBBcG9sbG8gc3R1ZmYgKi8KLSAgbG9uZyBvX2lubGliOwkJCS8qIGlubGliIGRhdGEgKi8KLSAgbG9uZyBvX3NyaTsJCQkvKiBTdGF0aWMgUmVzb3VyY2UgSW5mb3JtYXRpb24gKi8KLSAgbG9uZyB2aWRbMl07CQkJLyogVmVyc2lvbiBpZCAqLwotCi0KLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgcGU7Ci0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNUT1JBR0UgQ0xBU1NFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGlzIHVzZWQgdG8gYmUgZGVmaW5lZCBhcyAtMSwgYnV0IG5vdyBuX3NjbGFzcyBpcyB1bnNpZ25lZC4gICovCi0jZGVmaW5lIENfRUZDTgkJMHhmZgkvKiBwaHlzaWNhbCBlbmQgb2YgZnVuY3Rpb24JKi8KLSNkZWZpbmUgQ19OVUxMCQkwCi0jZGVmaW5lIENfQVVUTwkJMQkvKiBhdXRvbWF0aWMgdmFyaWFibGUJCSovCi0jZGVmaW5lIENfRVhUCQkyCS8qIGV4dGVybmFsIHN5bWJvbAkJKi8KLSNkZWZpbmUgQ19TVEFUCQkzCS8qIHN0YXRpYwkJCSovCi0jZGVmaW5lIENfUkVHCQk0CS8qIHJlZ2lzdGVyIHZhcmlhYmxlCQkqLwotI2RlZmluZSBDX0VYVERFRgk1CS8qIGV4dGVybmFsIGRlZmluaXRpb24JCSovCi0jZGVmaW5lIENfTEFCRUwJCTYJLyogbGFiZWwJCQkqLwotI2RlZmluZSBDX1VMQUJFTAk3CS8qIHVuZGVmaW5lZCBsYWJlbAkJKi8KLSNkZWZpbmUgQ19NT1MJCTgJLyogbWVtYmVyIG9mIHN0cnVjdHVyZQkJKi8KLSNkZWZpbmUgQ19BUkcJCTkJLyogZnVuY3Rpb24gYXJndW1lbnQJCSovCi0jZGVmaW5lIENfU1RSVEFHCTEwCS8qIHN0cnVjdHVyZSB0YWcJCSovCi0jZGVmaW5lIENfTU9VCQkxMQkvKiBtZW1iZXIgb2YgdW5pb24JCSovCi0jZGVmaW5lIENfVU5UQUcJCTEyCS8qIHVuaW9uIHRhZwkJCSovCi0jZGVmaW5lIENfVFBERUYJCTEzCS8qIHR5cGUgZGVmaW5pdGlvbgkJKi8KLSNkZWZpbmUgQ19VU1RBVElDCTE0CS8qIHVuZGVmaW5lZCBzdGF0aWMJCSovCi0jZGVmaW5lIENfRU5UQUcJCTE1CS8qIGVudW1lcmF0aW9uIHRhZwkJKi8KLSNkZWZpbmUgQ19NT0UJCTE2CS8qIG1lbWJlciBvZiBlbnVtZXJhdGlvbgkqLwotI2RlZmluZSBDX1JFR1BBUk0JMTcJLyogcmVnaXN0ZXIgcGFyYW1ldGVyCQkqLwotI2RlZmluZSBDX0ZJRUxECQkxOAkvKiBiaXQgZmllbGQJCQkqLwotI2RlZmluZSBDX0FVVE9BUkcJMTkJLyogYXV0byBhcmd1bWVudAkJKi8KLSNkZWZpbmUgQ19MQVNURU5UCTIwCS8qIGR1bW15IGVudHJ5IChlbmQgb2YgYmxvY2spCSovCi0jZGVmaW5lIENfQkxPQ0sJCTEwMAkvKiAiLmJiIiBvciAiLmViIgkJKi8KLSNkZWZpbmUgQ19GQ04JCTEwMQkvKiAiLmJmIiBvciAiLmVmIgkJKi8KLSNkZWZpbmUgQ19FT1MJCTEwMgkvKiBlbmQgb2Ygc3RydWN0dXJlCQkqLwotI2RlZmluZSBDX0ZJTEUJCTEwMwkvKiBmaWxlIG5hbWUJCQkqLwotI2RlZmluZSBDX0xJTkUJCTEwNAkvKiBsaW5lICMgcmVmb3JtYXR0ZWQgYXMgc3ltYm9sIHRhYmxlIGVudHJ5ICovCi0jZGVmaW5lIENfQUxJQVMJIAkxMDUJLyogZHVwbGljYXRlIHRhZwkJKi8KLSNkZWZpbmUgQ19ISURERU4JMTA2CS8qIGV4dCBzeW1ib2wgaW4gZG1lcnQgcHVibGljIGxpYiAqLwotCi0jZGVmaW5lIENfV0VBS0VYVAkxMjcJLyogd2VhayBzeW1ib2wgLS0gR05VIGV4dGVuc2lvbiAqLwotCi0vKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBUSWM4MCAqLwotI2RlZmluZSBDX1VFWFQJCTE5CS8qIFRlbnRhdGl2ZSBleHRlcm5hbCBkZWZpbml0aW9uICovCi0jZGVmaW5lIENfU1RBVExBQgkyMAkvKiBTdGF0aWMgbG9hZCB0aW1lIGxhYmVsICovCi0jZGVmaW5lIENfRVhUTEFCCTIxCS8qIEV4dGVybmFsIGxvYWQgdGltZSBsYWJlbCAqLwotI2RlZmluZSBDX1NZU1RFTQkyMwkvKiBTeXN0ZW0gV2lkZSB2YXJpYWJsZSAqLwotCi0vKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBXSU5ET1dTX05UICAgKi8KLSNkZWZpbmUgQ19TRUNUSU9OICAgICAgIDEwNCAgICAgLyogc2VjdGlvbiBuYW1lICovCi0jZGVmaW5lIENfTlRfV0VBSwkxMDUJLyogd2VhayBleHRlcm5hbCAqLwotCi0gLyogTmV3IHN0b3JhZ2UgY2xhc3NlcyBmb3IgODA5NjAgKi8KLQotLyogQ19MRUFGUFJPQyBpcyBvYnNvbGV0ZS4gIFVzZSBDX0xFQUZFWFQgb3IgQ19MRUFGU1RBVCAqLwotI2RlZmluZSBDX0xFQUZQUk9DCTEwOAkvKiBMZWFmIHByb2NlZHVyZSwgImNhbGwiIHZpYSBCQUwgKi8KLQotI2RlZmluZSBDX1NDQUxMCQkxMDcJLyogUHJvY2VkdXJlIHJlYWNoYWJsZSB2aWEgc3lzdGVtIGNhbGwgKi8KLSNkZWZpbmUgQ19MRUFGRVhUICAgICAgIDEwOAkvKiBFeHRlcm5hbCBsZWFmICovCi0jZGVmaW5lIENfTEVBRlNUQVQgICAgICAxMTMJLyogU3RhdGljIGxlYWYgKi8KLSNkZWZpbmUgQ19PUFRWQVIJMTA5CS8qIE9wdGltaXplZCB2YXJpYWJsZQkJKi8KLSNkZWZpbmUgQ19ERUZJTkUJMTEwCS8qIFByZXByb2Nlc3NvciAjZGVmaW5lCQkqLwotI2RlZmluZSBDX1BSQUdNQQkxMTEJLyogQWR2aWNlIHRvIGNvbXBpbGVyIG9yIGxpbmtlcgkqLwotI2RlZmluZSBDX1NFR01FTlQJMTEyCS8qIDgwOTYwIHNlZ21lbnQgbmFtZQkJKi8KLQotICAvKiBTdG9yYWdlIGNsYXNzZXMgZm9yIG04OGsgKi8KLSNkZWZpbmUgQ19TSEFET1cgICAgICAgIDEwNyAgICAgLyogc2hhZG93IHN5bWJvbCAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDX1ZFUlNJT04gICAgICAgMTA4ICAgICAvKiBjb2ZmIHZlcnNpb24gc3ltYm9sICAgICAgICAgICovCi0KLSAvKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBSUy82MDAwICovCi0jZGVmaW5lIENfSElERVhUICAgICAgICAxMDcJLyogVW4tbmFtZWQgZXh0ZXJuYWwgc3ltYm9sICovCi0jZGVmaW5lIENfQklOQ0wgICAgICAgICAxMDgJLyogTWFya3MgYmVnaW5uaW5nIG9mIGluY2x1ZGUgZmlsZSAqLwotI2RlZmluZSBDX0VJTkNMICAgICAgICAgMTA5CS8qIE1hcmtzIGVuZGluZyBvZiBpbmNsdWRlIGZpbGUgKi8KLQotIC8qIHN0b3JhZ2UgY2xhc3NlcyBmb3Igc3RhYiBzeW1ib2xzIGZvciBSUy82MDAwICovCi0jZGVmaW5lIENfR1NZTSAgICAgICAgICAoMHg4MCkKLSNkZWZpbmUgQ19MU1lNICAgICAgICAgICgweDgxKQotI2RlZmluZSBDX1BTWU0gICAgICAgICAgKDB4ODIpCi0jZGVmaW5lIENfUlNZTSAgICAgICAgICAoMHg4MykKLSNkZWZpbmUgQ19SUFNZTSAgICAgICAgICgweDg0KQotI2RlZmluZSBDX1NUU1lNICAgICAgICAgKDB4ODUpCi0jZGVmaW5lIENfVENTWU0gICAgICAgICAoMHg4NikKLSNkZWZpbmUgQ19CQ09NTSAgICAgICAgICgweDg3KQotI2RlZmluZSBDX0VDT01MICAgICAgICAgKDB4ODgpCi0jZGVmaW5lIENfRUNPTU0gICAgICAgICAoMHg4OSkKLSNkZWZpbmUgQ19ERUNMICAgICAgICAgICgweDhjKQotI2RlZmluZSBDX0VOVFJZICAgICAgICAgKDB4OGQpCi0jZGVmaW5lIENfRlVOICAgICAgICAgICAoMHg4ZSkKLSNkZWZpbmUgQ19CU1RBVCAgICAgICAgICgweDhmKQotI2RlZmluZSBDX0VTVEFUICAgICAgICAgKDB4OTApCi0KLS8qIFN0b3JhZ2UgY2xhc3NlcyBmb3IgVGh1bWIgc3ltYm9scyAqLwotI2RlZmluZSBDX1RIVU1CRVhUICAgICAgKDEyOCArIENfRVhUKQkJLyogMTMwICovCi0jZGVmaW5lIENfVEhVTUJTVEFUICAgICAoMTI4ICsgQ19TVEFUKQkJLyogMTMxICovCi0jZGVmaW5lIENfVEhVTUJMQUJFTCAgICAoMTI4ICsgQ19MQUJFTCkJCS8qIDEzNCAqLwotI2RlZmluZSBDX1RIVU1CRVhURlVOQyAgKENfVEhVTUJFWFQgICsgMjApCS8qIDE1MCAqLwotI2RlZmluZSBDX1RIVU1CU1RBVEZVTkMgKENfVEhVTUJTVEFUICsgMjApCS8qIDE1MSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFNDTk5NTEVOICg4KQotCi1zdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyCi17Ci0gIGNoYXIgc19uYW1lW1NDTk5NTEVOXTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQotICAvKiBQaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYi4KLSAgICAgSW4gdGhlIHBlaSBmb3JtYXQsIHRoaXMgZmllbGQgaXMgdGhlIHZpcnR1YWwgc2VjdGlvbiBzaXplCi0gICAgICh0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBhZnRlciBiZWluZyBsb2FkZWQgaW50IG1lbW9yeSksCi0gICAgIE5PVCB0aGUgcGh5c2ljYWwgYWRkcmVzcy4gICovCi0gIGJmZF92bWEgc19wYWRkcjsKLQotICBiZmRfdm1hIHNfdmFkZHI7CQkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0gIGJmZF92bWEgc19zaXplOwkJLyogc2VjdGlvbiBzaXplCQkJKi8KLSAgYmZkX3ZtYSBzX3NjbnB0cjsJCS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0gIGJmZF92bWEgc19yZWxwdHI7CQkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0gIGJmZF92bWEgc19sbm5vcHRyOwkJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0gIHVuc2lnbmVkIGxvbmcgc19ucmVsb2M7CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgbG9uZyBzX25sbm5vOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIGxvbmcgc19mbGFnczsJCQkvKiBmbGFncwkJCSovCi0gIGxvbmcgc19hbGlnbjsJCQkvKiB1c2VkIG9uIEk5NjAJCQkqLwotfTsKLQotLyoKLSAqIHNfZmxhZ3MgInR5cGUiCi0gKi8KLSNkZWZpbmUgU1RZUF9SRUcJICgweDAwMDApCS8qICJyZWd1bGFyIjogYWxsb2NhdGVkLCByZWxvY2F0ZWQsIGxvYWRlZCAqLwotI2RlZmluZSBTVFlQX0RTRUNUCSAoMHgwMDAxKQkvKiAiZHVtbXkiOiAgcmVsb2NhdGVkIG9ubHkqLwotI2RlZmluZSBTVFlQX05PTE9BRAkgKDB4MDAwMikJLyogIm5vbG9hZCI6IGFsbG9jYXRlZCwgcmVsb2NhdGVkLCBub3QgbG9hZGVkICovCi0jZGVmaW5lIFNUWVBfR1JPVVAJICgweDAwMDQpCS8qICJncm91cGVkIjogZm9ybWVkIG9mIGlucHV0IHNlY3Rpb25zICovCi0jZGVmaW5lIFNUWVBfUEFECSAoMHgwMDA4KQkvKiAicGFkZGluZyI6IG5vdCBhbGxvY2F0ZWQsIG5vdCByZWxvY2F0ZWQsIGxvYWRlZCAqLwotI2RlZmluZSBTVFlQX0NPUFkJICgweDAwMTApCS8qICJjb3B5IjogZm9yIGRlY2lzaW9uIGZ1bmN0aW9uIHVzZWQgYnkgZmllbGQgdXBkYXRlOyAgbm90IGFsbG9jYXRlZCwgbm90IHJlbG9jYXRlZCwKLQkJCQkJCQkJCSAgICAgbG9hZGVkOyByZWxvYyAmIGxpbmVubyBlbnRyaWVzIHByb2Nlc3NlZCBub3JtYWxseSAqLwotI2RlZmluZSBTVFlQX1RFWFQJICgweDAwMjApCS8qIHNlY3Rpb24gY29udGFpbnMgdGV4dCBvbmx5ICovCi0jZGVmaW5lIFNfU0hSU0VHCSAoMHgwMDIwKQkvKiBJbiAzYiBVcGRhdGUgZmlsZXMgKG91dHB1dCBvZiBvZ2VuKSwgc2VjdGlvbnMgd2hpY2ggYXBwZWFyIGluIFNIQVJFRCBzZWdtZW50cyBvZiB0aGUgUGZpbGUKLQkJCQkJCQkJCSAgICAgd2lsbCBoYXZlIHRoZSBTX1NIUlNFRyBmbGFnIHNldCBieSBvZ2VuLCB0byBpbmZvcm0gZHVmciB0aGF0IHVwZGF0aW5nIDEgY29weSBvZiB0aGUgcHJvYy4gd2lsbAotCQkJCQkJCQkJICAgICB1cGRhdGUgYWxsIHByb2Nlc3MgaW52b2NhdGlvbnMuICovCi0jZGVmaW5lIFNUWVBfREFUQQkgKDB4MDA0MCkJLyogc2VjdGlvbiBjb250YWlucyBkYXRhIG9ubHkgKi8KLSNkZWZpbmUgU1RZUF9CU1MJICgweDAwODApCS8qIHNlY3Rpb24gY29udGFpbnMgYnNzIG9ubHkgKi8KLSNkZWZpbmUgU19ORVdGQ04JICgweDAxMDApCS8qIEluIGEgbWluaW1hbCBmaWxlIG9yIGFuIHVwZGF0ZSBmaWxlLCBhIG5ldyBmdW5jdGlvbiAoYXMgY29tcGFyZWQgd2l0aCBhIHJlcGxhY2VkIGZ1bmN0aW9uKSAqLwotI2RlZmluZSBTVFlQX0lORk8JICgweDAyMDApCS8qIGNvbW1lbnQ6IG5vdCBhbGxvY2F0ZWQgbm90IHJlbG9jYXRlZCwgbm90IGxvYWRlZCAqLwotI2RlZmluZSBTVFlQX09WRVIJICgweDA0MDApCS8qIG92ZXJsYXk6IHJlbG9jYXRlZCBub3QgYWxsb2NhdGVkIG9yIGxvYWRlZCAqLwotI2RlZmluZSBTVFlQX0xJQgkgKDB4MDgwMCkJLyogZm9yIC5saWI6IHNhbWUgYXMgSU5GTyAqLwotI2RlZmluZSBTVFlQX01FUkdFCSAoMHgyMDAwKQkvKiBtZXJnZSBzZWN0aW9uIC0tIGNvbWJpbmVzIHdpdGggdGV4dCwgZGF0YSBvciBic3Mgc2VjdGlvbnMgb25seSAqLwotI2RlZmluZSBTVFlQX1JFVkVSU0VfUEFEICgweDQwMDApCS8qIHNlY3Rpb24gd2lsbCBiZSBwYWRkZWQgd2l0aCBuby1vcCBpbnN0cnVjdGlvbnMgd2hlcmV2ZXIgcGFkZGluZyBpcyBuZWNlc3NhcnkgYW5kIHRoZXJlIGlzIGEKLQkJCQkJCi0JCQkJCQkJCQkgICAgIHdvcmQgb2YgY29udGlndW91cyBieXRlcwotCQkJCQkJCQkJICAgICBiZWdpbm5pbmcgb24gYSB3b3JkIGJvdW5kYXJ5LiAqLwotCi0jZGVmaW5lIFNUWVBfTElUCTB4ODAyMAkvKiBMaXRlcmFsIGRhdGEgKGxpa2UgU1RZUF9URVhUKSAqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi0KLXN0cnVjdCBpbnRlcm5hbF9saW5lbm8KLXsKLSAgdW5pb24KLSAgewotICAgIGxvbmcgbF9zeW1uZHg7CQkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLSAgICBsb25nIGxfcGFkZHI7CQkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLSAgfSAgICAgbF9hZGRyOwotICB1bnNpZ25lZCBsb25nIGxfbG5ubzsJCS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFNZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBESU1OVU0JCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgaW50ZXJuYWxfc3ltZW50Ci17Ci0gIHVuaW9uCi0gIHsKLSAgICBjaGFyIF9uX25hbWVbU1lNTk1MRU5dOwkvKiBvbGQgQ09GRiB2ZXJzaW9uCSovCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgbG9uZyBfbl96ZXJvZXM7CQkvKiBuZXcgPT0gMAkJKi8KLSAgICAgIGxvbmcgX25fb2Zmc2V0OwkJLyogb2Zmc2V0IGludG8gc3RyaW5nIHRhYmxlICovCi0gICAgfSAgICAgIF9uX247Ci0gICAgY2hhciAqX25fbnB0clsyXTsJCS8qIGFsbG93cyBmb3Igb3ZlcmxheWluZwkqLwotICB9ICAgICBfbjsKLSAgbG9uZyBuX3ZhbHVlOwkJCS8qIHZhbHVlIG9mIHN5bWJvbAkJKi8KLSAgc2hvcnQgbl9zY251bTsJCS8qIHNlY3Rpb24gbnVtYmVyCQkqLwotICB1bnNpZ25lZCBzaG9ydCBuX2ZsYWdzOwkvKiBjb3B5IG9mIGZsYWdzIGZyb20gZmlsaGRyCSovCi0gIHVuc2lnbmVkIHNob3J0IG5fdHlwZTsJLyogdHlwZSBhbmQgZGVyaXZlZCB0eXBlCSovCi0gIHVuc2lnbmVkIGNoYXIgbl9zY2xhc3M7CS8qIHN0b3JhZ2UgY2xhc3MJCSovCi0gIHVuc2lnbmVkIGNoYXIgbl9udW1hdXg7CS8qIG51bWJlciBvZiBhdXguIGVudHJpZXMJKi8KLX07Ci0KLSNkZWZpbmUgbl9uYW1lCQlfbi5fbl9uYW1lCi0jZGVmaW5lIG5femVyb2VzCV9uLl9uX24uX25femVyb2VzCi0jZGVmaW5lIG5fb2Zmc2V0CV9uLl9uX24uX25fb2Zmc2V0Ci0KLQotLyogUmVsb2NhdGFibGUgc3ltYm9scyBoYXZlIG51bWJlciBvZiB0aGUgc2VjdGlvbiBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkLAotICAgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmc6ICovCi0KLSNkZWZpbmUgTl9VTkRFRgkoKHNob3J0KTApCS8qIHVuZGVmaW5lZCBzeW1ib2wgKi8KLSNkZWZpbmUgTl9BQlMJKChzaG9ydCktMSkJLyogdmFsdWUgb2Ygc3ltYm9sIGlzIGFic29sdXRlICovCi0jZGVmaW5lIE5fREVCVUcJKChzaG9ydCktMikJLyogZGVidWdnaW5nIHN5bWJvbCAtLSB2YWx1ZSBpcyBtZWFuaW5nbGVzcyAqLwotI2RlZmluZSBOX1RWCSgoc2hvcnQpLTMpCS8qIGluZGljYXRlcyBzeW1ib2wgbmVlZHMgcHJlbG9hZCB0cmFuc2ZlciB2ZWN0b3IgKi8KLSNkZWZpbmUgUF9UVgkoKHNob3J0KS00KQkvKiBpbmRpY2F0ZXMgc3ltYm9sIG5lZWRzIHBvc3Rsb2FkIHRyYW5zZmVyIHZlY3RvciovCi0KLS8qCi0gKiBUeXBlIG9mIGEgc3ltYm9sLCBpbiBsb3cgTiBiaXRzIG9mIHRoZSB3b3JkCi0gKi8KLSNkZWZpbmUgVF9OVUxMCQkwCi0jZGVmaW5lIFRfVk9JRAkJMQkvKiBmdW5jdGlvbiBhcmd1bWVudCAob25seSB1c2VkIGJ5IGNvbXBpbGVyKSAqLwotI2RlZmluZSBUX0NIQVIJCTIJLyogY2hhcmFjdGVyCQkqLwotI2RlZmluZSBUX1NIT1JUCQkzCS8qIHNob3J0IGludGVnZXIJKi8KLSNkZWZpbmUgVF9JTlQJCTQJLyogaW50ZWdlcgkJKi8KLSNkZWZpbmUgVF9MT05HCQk1CS8qIGxvbmcgaW50ZWdlcgkJKi8KLSNkZWZpbmUgVF9GTE9BVAkJNgkvKiBmbG9hdGluZyBwb2ludAkqLwotI2RlZmluZSBUX0RPVUJMRQk3CS8qIGRvdWJsZSB3b3JkCQkqLwotI2RlZmluZSBUX1NUUlVDVAk4CS8qIHN0cnVjdHVyZSAJCSovCi0jZGVmaW5lIFRfVU5JT04JCTkJLyogdW5pb24gCQkqLwotI2RlZmluZSBUX0VOVU0JCTEwCS8qIGVudW1lcmF0aW9uIAkJKi8KLSNkZWZpbmUgVF9NT0UJCTExCS8qIG1lbWJlciBvZiBlbnVtZXJhdGlvbiovCi0jZGVmaW5lIFRfVUNIQVIJCTEyCS8qIHVuc2lnbmVkIGNoYXJhY3RlcgkqLwotI2RlZmluZSBUX1VTSE9SVAkxMwkvKiB1bnNpZ25lZCBzaG9ydAkqLwotI2RlZmluZSBUX1VJTlQJCTE0CS8qIHVuc2lnbmVkIGludGVnZXIJKi8KLSNkZWZpbmUgVF9VTE9ORwkJMTUJLyogdW5zaWduZWQgbG9uZwkqLwotI2RlZmluZSBUX0xOR0RCTAkxNgkvKiBsb25nIGRvdWJsZQkJKi8KLQotLyoKLSAqIGRlcml2ZWQgdHlwZXMsIGluIG5fdHlwZQotKi8KLSNkZWZpbmUgRFRfTk9OCQkoMCkJLyogbm8gZGVyaXZlZCB0eXBlICovCi0jZGVmaW5lIERUX1BUUgkJKDEpCS8qIHBvaW50ZXIgKi8KLSNkZWZpbmUgRFRfRkNOCQkoMikJLyogZnVuY3Rpb24gKi8KLSNkZWZpbmUgRFRfQVJZCQkoMykJLyogYXJyYXkgKi8KLQotI2RlZmluZSBCVFlQRSh4KQkoKHgpICYgTl9CVE1BU0spCi0KLSNkZWZpbmUgSVNQVFIoeCkgXAotICAoKCh1bnNpZ25lZCBsb25nKSAoeCkgJiBOX1RNQVNLKSA9PSAoKHVuc2lnbmVkIGxvbmcpIERUX1BUUiA8PCBOX0JUU0hGVCkpCi0jZGVmaW5lIElTRkNOKHgpIFwKLSAgKCgodW5zaWduZWQgbG9uZykgKHgpICYgTl9UTUFTSykgPT0gKCh1bnNpZ25lZCBsb25nKSBEVF9GQ04gPDwgTl9CVFNIRlQpKQotI2RlZmluZSBJU0FSWSh4KSBcCi0gICgoKHVuc2lnbmVkIGxvbmcpICh4KSAmIE5fVE1BU0spID09ICgodW5zaWduZWQgbG9uZykgRFRfQVJZIDw8IE5fQlRTSEZUKSkKLSNkZWZpbmUgSVNUQUcoeCkgXAotICAoKHgpID09IENfU1RSVEFHIHx8ICh4KSA9PSBDX1VOVEFHIHx8ICh4KSA9PSBDX0VOVEFHKQotI2RlZmluZSBERUNSRUYoeCkgXAotICAoKCgoeCkgPj4gTl9UU0hJRlQpICYgfiBOX0JUTUFTSykgfCAoKHgpICYgTl9CVE1BU0spKQotCi11bmlvbiBpbnRlcm5hbF9hdXhlbnQKLXsKLSAgc3RydWN0Ci0gIHsKLQotICAgIHVuaW9uCi0gICAgewotICAgICAgbG9uZyBsOwkJCS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLSAgICAgIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnA7Ci0gICAgfSAgICAgeF90YWduZHg7Ci0KLSAgICB1bmlvbgotICAgIHsKLSAgICAgIHN0cnVjdAotICAgICAgewotCXVuc2lnbmVkIHNob3J0IHhfbG5ubzsJLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQl1bnNpZ25lZCBzaG9ydCB4X3NpemU7CS8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0gICAgICB9ICAgICAgeF9sbnN6OwotICAgICAgbG9uZyB4X2ZzaXplOwkJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotICAgIH0gICAgIHhfbWlzYzsKLQotICAgIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0Ci0gICAgICB7CQkJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCWxvbmcgeF9sbm5vcHRyOwkJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQl1bmlvbgotCXsJCQkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkgIGxvbmcgbDsKLQkgIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnA7Ci0JfSAgICAgeF9lbmRuZHg7Ci0gICAgICB9ICAgICAgeF9mY247Ci0KLSAgICAgIHN0cnVjdAotICAgICAgewkJCQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQl1bnNpZ25lZCBzaG9ydCB4X2RpbWVuW0RJTU5VTV07Ci0gICAgICB9ICAgICAgeF9hcnk7Ci0gICAgfSAgICAgeF9mY25hcnk7Ci0KLSAgICB1bnNpZ25lZCBzaG9ydCB4X3R2bmR4OwkvKiB0diBpbmRleCAqLwotICB9ICAgICAgeF9zeW07Ci0KLSAgdW5pb24KLSAgewotICAgIGNoYXIgeF9mbmFtZVtGSUxOTUxFTl07Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgbG9uZyB4X3plcm9lczsKLSAgICAgIGxvbmcgeF9vZmZzZXQ7Ci0gICAgfSAgICAgIHhfbjsKLSAgfSAgICAgeF9maWxlOwotCi0gIHN0cnVjdAotICB7Ci0gICAgbG9uZyB4X3NjbmxlbjsJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0gICAgdW5zaWduZWQgc2hvcnQgeF9ucmVsb2M7CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0gICAgdW5zaWduZWQgc2hvcnQgeF9ubGlubm87CS8qICMgbGluZSBudW1iZXJzICovCi0gICAgdW5zaWduZWQgbG9uZyB4X2NoZWNrc3VtOwkvKiBzZWN0aW9uIENPTURBVCBjaGVja3N1bSBmb3IgUEUgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X2Fzc29jaWF0ZWQ7IC8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggZm9yIFBFICovCi0gICAgdW5zaWduZWQgY2hhciB4X2NvbWRhdDsJLyogQ09NREFUIHNlbGVjdGlvbiBudW1iZXIgZm9yIFBFICovCi0gIH0gICAgICB4X3NjbjsKLQotICBzdHJ1Y3QKLSAgewotICAgIGxvbmcgeF90dmZpbGw7CQkvKiB0diBmaWxsIHZhbHVlICovCi0gICAgdW5zaWduZWQgc2hvcnQgeF90dmxlbjsJLyogbGVuZ3RoIG9mIC50diAqLwotICAgIHVuc2lnbmVkIHNob3J0IHhfdHZyYW5bMl07CS8qIHR2IHJhbmdlICovCi0gIH0gICAgICB4X3R2OwkJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIFJTLzYwMDAtc3BlY2lmaWMgYXV4ZW50IC0gbGFzdCBhdXhlbnQgZm9yIGV2ZXJ5IGV4dGVybmFsIHN5bWJvbAotICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICBzdHJ1Y3QKLSAgewotICAgIHVuaW9uCi0gICAgICB7CQkJCS8qIGNzZWN0IGxlbmd0aCBvciBlbmNsb3NpbmcgY3NlY3QgKi8KLQlsb25nIGw7Ci0Jc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcDsKLSAgICAgIH0geF9zY25sZW47Ci0gICAgbG9uZyB4X3Bhcm1oYXNoOwkJLyogcGFybSB0eXBlIGhhc2ggaW5kZXggKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X3NuaGFzaDsJLyogc2VjdCBudW0gd2l0aCBwYXJtIGhhc2ggKi8KLSAgICB1bnNpZ25lZCBjaGFyIHhfc210eXA7CS8qIHN5bWJvbCBhbGlnbiBhbmQgdHlwZSAqLwotICAgIC8qIDAtNCAtIExvZyAyIG9mIGFsaWdubWVudCAqLwotICAgIC8qIDUtNyAtIHN5bWJvbCB0eXBlICovCi0gICAgdW5zaWduZWQgY2hhciB4X3NtY2xhczsJLyogc3RvcmFnZSBtYXBwaW5nIGNsYXNzICovCi0gICAgbG9uZyB4X3N0YWI7CQkvKiBkYnggc3RhYiBpbmZvIGluZGV4ICovCi0gICAgdW5zaWduZWQgc2hvcnQgeF9zbnN0YWI7CS8qIHNlY3QgbnVtIHdpdGggZGJ4IHN0YWIgKi8KLSAgfSAgICAgIHhfY3NlY3Q7CQkvKiBjc2VjdCBkZWZpbml0aW9uIGluZm9ybWF0aW9uICovCi0KLS8qIHhfc210eXAgdmFsdWVzOiAgKi8KLQotI2RlZmluZQlTTVRZUF9BTElHTih4KQkoKHgpID4+IDMpCS8qIGxvZzIgb2YgYWxpZ25tZW50ICovCi0jZGVmaW5lCVNNVFlQX1NNVFlQKHgpCSgoeCkgJiAweDcpCS8qIHN5bWJvbCB0eXBlICovCi0vKiBTeW1ib2wgdHlwZSB2YWx1ZXM6ICAqLwotI2RlZmluZQlYVFlfRVIJMAkJLyogRXh0ZXJuYWwgcmVmZXJlbmNlICovCi0jZGVmaW5lCVhUWV9TRAkxCQkvKiBDc2VjdCBkZWZpbml0aW9uICovCi0jZGVmaW5lCVhUWV9MRAkyCQkvKiBMYWJlbCBkZWZpbml0aW9uICovCi0jZGVmaW5lIFhUWV9DTQkzCQkvKiAuQlNTICovCi0jZGVmaW5lCVhUWV9FTQk0CQkvKiBFcnJvciBtZXNzYWdlICovCi0jZGVmaW5lCVhUWV9VUwk1CQkvKiAiUmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZSIgKi8KLQotLyogeF9zbWNsYXMgdmFsdWVzOiAgKi8KLQotI2RlZmluZQlYTUNfUFIJMAkJLyogUmVhZC1vbmx5IHByb2dyYW0gY29kZSAqLwotI2RlZmluZQlYTUNfUk8JMQkJLyogUmVhZC1vbmx5IGNvbnN0YW50ICovCi0jZGVmaW5lCVhNQ19EQgkyCQkvKiBSZWFkLW9ubHkgZGVidWcgZGljdGlvbmFyeSB0YWJsZSAqLwotI2RlZmluZQlYTUNfVEMJMwkJLyogUmVhZC13cml0ZSBnZW5lcmFsIFRPQyBlbnRyeSAqLwotI2RlZmluZQlYTUNfVUEJNAkJLyogUmVhZC13cml0ZSB1bmNsYXNzaWZpZWQgKi8KLSNkZWZpbmUJWE1DX1JXCTUJCS8qIFJlYWQtd3JpdGUgZGF0YSAqLwotI2RlZmluZQlYTUNfR0wJNgkJLyogUmVhZC1vbmx5IGdsb2JhbCBsaW5rYWdlICovCi0jZGVmaW5lCVhNQ19YTwk3CQkvKiBSZWFkLW9ubHkgZXh0ZW5kZWQgb3BlcmF0aW9uICovCi0jZGVmaW5lCVhNQ19TVgk4CQkvKiBSZWFkLW9ubHkgc3VwZXJ2aXNvciBjYWxsICovCi0jZGVmaW5lCVhNQ19CUwk5CQkvKiBSZWFkLXdyaXRlIEJTUyAqLwotI2RlZmluZQlYTUNfRFMJMTAJCS8qIFJlYWQtd3JpdGUgZGVzY3JpcHRvciBjc2VjdCAqLwotI2RlZmluZQlYTUNfVUMJMTEJCS8qIFJlYWQtd3JpdGUgdW5uYW1lZCBGb3J0cmFuIGNvbW1vbiAqLwotI2RlZmluZQlYTUNfVEkJMTIJCS8qIFJlYWQtb25seSB0cmFjZWJhY2sgaW5kZXggY3NlY3QgKi8KLSNkZWZpbmUJWE1DX1RCCTEzCQkvKiBSZWFkLW9ubHkgdHJhY2ViYWNrIHRhYmxlIGNzZWN0ICovCi0vKiAJCTE0CT8/PyAqLwotI2RlZmluZQlYTUNfVEMwCTE1CQkvKiBSZWFkLXdyaXRlIFRPQyBhbmNob3IgKi8KLSNkZWZpbmUgWE1DX1RECTE2CQkvKiBSZWFkLXdyaXRlIGRhdGEgaW4gVE9DICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiAgSTk2MC1zcGVjaWZpYyAqMm5kKiBhdXguIGVudHJ5IGZvcm1hdHMKLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgc3RydWN0Ci0gIHsKLSAgICAvKiBUaGlzIGlzIGEgdmVyeSBvbGQgdHlwbyB0aGF0IGtlZXBzIGdldHRpbmcgcHJvcGFnYXRlZC4gKi8KLSNkZWZpbmUgeF9zdGRpbmR4IHhfc3RpbmR4Ci0gICAgbG9uZyB4X3N0aW5keDsJCS8qIHN5cy4gdGFibGUgZW50cnkgKi8KLSAgfSAgICAgIHhfc2M7CQkJLyogc3lzdGVtIGNhbGwgZW50cnkgKi8KLQotICBzdHJ1Y3QKLSAgewotICAgIHVuc2lnbmVkIGxvbmcgeF9iYWxudHJ5OwkvKiBCQUwgZW50cnkgcG9pbnQgKi8KLSAgfSAgICAgIHhfYmFsOwkJCS8qIEJBTC1jYWxsYWJsZSBmdW5jdGlvbiAqLwotCi0gIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyB4X3RpbWVzdGFtcDsJLyogdGltZSBzdGFtcCAqLwotICAgIGNoYXIgeF9pZHN0cmluZ1syMF07CS8qIHByb2R1Y2VyIGlkZW50aXR5IHN0cmluZyAqLwotICB9ICAgICAgeF9pZGVudDsJCS8qIFByb2R1Y2VyIGlkZW50IGluZm8gKi8KLQotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBpbnRlcm5hbF9yZWxvYwotewotICBiZmRfdm1hIHJfdmFkZHI7CQkvKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgcmVmZXJlbmNlICovCi0gIGxvbmcgcl9zeW1uZHg7CQkvKiBJbmRleCBpbnRvIHN5bWJvbCB0YWJsZQkqLwotICB1bnNpZ25lZCBzaG9ydCByX3R5cGU7CS8qIFJlbG9jYXRpb24gdHlwZQkJKi8KLSAgdW5zaWduZWQgY2hhciByX3NpemU7CQkvKiBVc2VkIGJ5IFJTLzYwMDAgYW5kIEVDT0ZGCSovCi0gIHVuc2lnbmVkIGNoYXIgcl9leHRlcm47CS8qIFVzZWQgYnkgRUNPRkYJCSovCi0gIHVuc2lnbmVkIGxvbmcgcl9vZmZzZXQ7CS8qIFVzZWQgYnkgQWxwaGEgRUNPRkYsIFNQQVJDLCBvdGhlcnMgKi8KLX07Ci0KLSNkZWZpbmUgUl9SRUxCWVRFCTAxNwotI2RlZmluZSBSX1JFTFdPUkQJMDIwCi0jZGVmaW5lIFJfUENSQllURQkwMjIKLSNkZWZpbmUgUl9QQ1JXT1JECTAyMwotI2RlZmluZSBSX1BDUkxPTkcJMDI0Ci0KLSNkZWZpbmUJUl9ESVIxNgkJMDEKLSNkZWZpbmUgUl9ESVIzMgkJMDYKLSNkZWZpbmUJUl9QQ0xPTkcJMDIwCi0jZGVmaW5lIFJfUkVMQllURQkwMTcKLSNkZWZpbmUgUl9SRUxXT1JECTAyMAotI2RlZmluZSBSX0lNQUdFQkFTRSAgICAgMDcKLQotCi0jZGVmaW5lIFJfUENSMTZMIDEyOAotI2RlZmluZSBSX1BDUjI2TCAxMjkKLSNkZWZpbmUgUl9WUlQxNiAgMTMwCi0jZGVmaW5lIFJfSFZSVDE2IDEzMQotI2RlZmluZSBSX0xWUlQxNiAxMzIKLSNkZWZpbmUgUl9WUlQzMiAgMTMzCi0jZGVmaW5lIFJfUkVMTE9ORwkoMHgxMSkJLyogRGlyZWN0IDMyLWJpdCByZWxvY2F0aW9uICovCi0jZGVmaW5lIFJfSVBSU0hPUlQJKDB4MTgpCi0jZGVmaW5lIFJfSVBSTE9ORwkoMHgxYSkKLSNkZWZpbmUgUl9HRVRTRUcJKDB4MWQpCi0jZGVmaW5lIFJfR0VUUEEJCSgweDFlKQotI2RlZmluZSBSX1RBR1dPUkQJKDB4MWYpCi0jZGVmaW5lIFJfSlVNUFRBUkcJMHgyMAkvKiBzdHJhbmdlIDI5ayAwMHh4MDB4eCByZWxvYyAqLwotCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuYiBpbnN0cnVjdGlvbnMgd2l0aCBhIDE2Yml0IGFic29sdXRlCi0gICBhZGRyZXNzLiAgVGhlIGxpbmtlciB0cmllcyB0byB0dXJuIGluc25zIHdpdGggdGhpcyByZWxvYyBpbnRvCi0gICBhbiBhYnNvbHV0ZSA4LWJpdCBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9NT1YxNkIxICAgIAkweDQxCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuYiBpbnN0cnVjdGlvbnMgd2hpY2ggaGFkIGEgMTZiaXQKLSAgIGFic29sdXRlIGFkZHJlc3Mgd2hpY2ggaGF2ZSBiZWVuIHNob3J0ZW5lZCBpbnRvIGEgOC1iaXQKLSAgIGFic29sdXRlIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX01PVjE2QjIgCTB4NDIKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGptcCBpbnNucyB3aXRoIGEgMTZiaXQgdGFyZ2V0IGFkZHJlc3M7Ci0gICB0aGUgbGlua2VyIHRyaWVzIHRvIHR1cm4gdGhlc2UgaW5zbnMgaW50byBicmEgaW5zbnMgd2l0aAotICAgYW4gOGJpdCBwYy1yZWxhdGl2ZSB0YXJnZXQuICAqLwotI2RlZmluZSBSX0pNUDEgICAgIAkweDQzCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBhIGJyYSB3aXRoIGFuIDgtYml0IHBjLXJlbGF0aXZlCi0gICB0YXJnZXQgdGhhdCB3YXMgZm9ybWVybGx5IGEgam1wIGluc24gd2l0aCBhIDE2Yml0IHRhcmdldC4gICovCi0jZGVmaW5lIFJfSk1QMiAJCTB4NDQKLQotLyogPz8/ICovCi0jZGVmaW5lIFJfUkVMTE9OR19ORUcgIAkweDQ1Ci0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBqbXAgaW5zbnMgd2l0aCBhIDI0Yml0IHRhcmdldCBhZGRyZXNzOwotICAgdGhlIGxpbmtlciB0cmllcyB0byB0dXJuIHRoZXNlIGluc25zIGludG8gYnJhIGluc25zIHdpdGgKLSAgIGFuIDhiaXQgcGMtcmVsYXRpdmUgdGFyZ2V0LiAgKi8KLSNkZWZpbmUgUl9KTVBMMSAgICAgCTB4NDYKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGEgYnJhIHdpdGggYW4gOC1iaXQgcGMtcmVsYXRpdmUKLSAgIHRhcmdldCB0aGF0IHdhcyBmb3JtZXJsbHkgYSBqbXAgaW5zbiB3aXRoIGEgMjRiaXQgdGFyZ2V0LiAgKi8KLSNkZWZpbmUgUl9KTVBMMgkJMHg0NwotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgbW92LmIgaW5zdHJ1Y3Rpb25zIHdpdGggYSAyNGJpdCBhYnNvbHV0ZQotICAgYWRkcmVzcy4gIFRoZSBsaW5rZXIgdHJpZXMgdG8gdHVybiBpbnNucyB3aXRoIHRoaXMgcmVsb2MgaW50bwotICAgYW4gYWJzb2x1dGUgOC1iaXQgYWRkcmVzcy4gICovCi0KLSNkZWZpbmUgUl9NT1YyNEIxICAgIAkweDQ4Ci0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuYiBpbnN0cnVjdGlvbnMgd2hpY2ggaGFkIGEgMjRiaXQKLSAgIGFic29sdXRlIGFkZHJlc3Mgd2hpY2ggaGF2ZSBiZWVuIHNob3J0ZW5lZCBpbnRvIGEgOC1iaXQKLSAgIGFic29sdXRlIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX01PVjI0QjIgCTB4NDkKLQotLyogQW4gaDgzMDAgbWVtb3J5IGluZGlyZWN0IGp1bXAvY2FsbC4gIEZvcmNlcyB0aGUgYWRkcmVzcyBvZiB0aGUganVtcC9jYWxsCi0gICB0YXJnZXQgaW50byB0aGUgZnVuY3Rpb24gdmVjdG9yIChpbiBwYWdlIHplcm8pLCBhbmQgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gICB2ZWN0b3IgZW50cnkgdG8gYmUgcGxhY2VkIGluIHRoZSBqdW1wL2NhbGwgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSX01FTV9JTkRJUkVDVAkweDRhCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBhIDE2Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCB0YXJnZXQgd2hpY2ggd2FzCi0gICBzaG9ydGVuZWQgaW50byBhbiA4Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCB0YXJnZXQuICAqLwotI2RlZmluZSBSX1BDUldPUkRfQgkweDRiCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuW3dsXSBpbnN0cnVjdGlvbnMgd2l0aCBhIDMyLzI0IGJpdAotICAgYWJzb2x1dGUgYWRkcmVzczsgdGhlIGxpbmtlciBtYXkgdHVybiB0aGlzIGludG8gYSBtb3YuW3dsXQotICAgaW5zbiB3aXRoIGEgMTZiaXQgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfTU9WTDEgICAgCTB4NGMKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIG1vdi5bd2xdIGluc25zIHdoaWNoIGZvcm1lcmxseSBoYWQKLSAgIGEgMzIvMjRiaXQgYWJzb2x1dGUgYWRkcmVzcyBhbmQgaG93IGhhdmUgYSAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9NT1ZMMiAJMHg0ZAotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgYSBiQ0M6OCB3aGljaCB3aWxsIGhhdmUgaXQncyBjb25kaXRpb24KLSAgIGludmVydGVkIGFuZCBpdHMgdGFyZ2V0IHJlZGlyZWN0ZWQgdG8gdGhlIHRhcmdldCBvZiB0aGUgYnJhbmNoCi0gICBpbiB0aGUgZm9sbG93aW5nIGluc24uICAqLwotI2RlZmluZSBSX0JDQ19JTlYJMHg0ZQotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgYSBqbXAgaW5zdHJ1Y3Rpb24gdGhhdCBoYXMgYmVlbiBkZWxldGVkLiAgKi8KLSNkZWZpbmUgUl9KTVBfREVMCTB4NGYKLQotLyogWjhrIG1vZGVzICovCi0jZGVmaW5lIFJfSU1NMTYgICAweDAxCQkvKiAxNiBiaXQgYWJzICovCi0jZGVmaW5lIFJfSlIJICAweDAyCQkvKiBqciAgOCBiaXQgZGlzcCAqLwotI2RlZmluZSBSX0lNTTRMICAgMHgyMwkJLyogbG93IG5pYmJsZSAqLwotI2RlZmluZSBSX0lNTTggICAgMHgyMgkJLyogOCBiaXQgYWJzICovCi0jZGVmaW5lIFJfSU1NMzIgICBSX1JFTExPTkcJLyogMzIgYml0IGFicyAqLwotI2RlZmluZSBSX0NBTEwgICAgUl9EQQkJLyogQWJzb2x1dGUgYWRkcmVzcyB3aGljaCBjb3VsZCBiZSBhIGNhbGxyICovCi0jZGVmaW5lIFJfSlAJICBSX0RBCQkvKiBBYnNvbHV0ZSBhZGRyZXNzIHdoaWNoIGNvdWxkIGJlIGEganAgKi8KLSNkZWZpbmUgUl9SRUwxNiAgIDB4MDQJCS8qIDE2IGJpdCBQQyByZWwgKi8KLSNkZWZpbmUgUl9DQUxMUgkgIDB4MDUJCS8qIGNhbGxyIDEyIGJpdCBkaXNwICovCi0jZGVmaW5lIFJfU0VHICAgICAweDEwCQkvKiBzZXQgaWYgaW4gc2VnbWVudGVkIG1vZGUgKi8KLSNkZWZpbmUgUl9JTU00SCAgIDB4MjQJCS8qIGhpZ2ggbmliYmxlICovCi0jZGVmaW5lIFJfRElTUDcgICAweDI1ICAgICAgICAgIC8qIGRqbnogZGlzcGxhY2VtZW50ICovCi0KLS8qIEg4NTAwIG1vZGVzICovCi0KLSNkZWZpbmUgUl9IODUwMF9JTU04ICAJMQkJLyogIDggYml0IGltbWVkaWF0ZSAJKi8KLSNkZWZpbmUgUl9IODUwMF9JTU0xNiAJMgkJLyogMTYgYml0IGltbWVkaWF0ZQkqLwotI2RlZmluZSBSX0g4NTAwX1BDUkVMOCAJMwkJLyogIDggYml0IHBjcmVsIAkqLwotI2RlZmluZSBSX0g4NTAwX1BDUkVMMTYgNAkJLyogMTYgYml0IHBjcmVsIAkqLwotI2RlZmluZSBSX0g4NTAwX0hJR0g4ICAJNQkJLyogaGlnaCA4IGJpdHMgb2YgMjQgYml0IGFkZHJlc3MgKi8KLSNkZWZpbmUgUl9IODUwMF9MT1cxNiAJNwkJLyogbG93IDE2IGJpdHMgb2YgMjQgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX0g4NTAwX0lNTTI0CTYJCS8qIDI0IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgUl9IODUwMF9JTU0zMiAgIDggICAgICAgICAgICAgICAvKiAzMiBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfSDg1MDBfSElHSDE2ICA5CQkvKiBoaWdoIDE2IGJpdHMgb2YgMzIgYml0IGltbWVkaWF0ZSAqLwotCi0vKiBXNjUgbW9kZXMgKi8KLQotI2RlZmluZSBSX1c2NV9BQlM4CTEgIC8qIGFkZHIgJiAweGZmIAkJKi8KLSNkZWZpbmUgUl9XNjVfQUJTMTYJMiAgLyogYWRkciAmIDB4ZmZmZiAJCSovCi0jZGVmaW5lIFJfVzY1X0FCUzI0CTMgIC8qIGFkZHIgJiAweGZmZmZmZiAJCSovCi0KLSNkZWZpbmUgUl9XNjVfQUJTOFM4ICAgIDQgIC8qIChhZGRyID4+IDgpICYgMHhmZiAJKi8KLSNkZWZpbmUgUl9XNjVfQUJTOFMxNiAgIDUgIC8qIChhZGRyID4+IDE2KSAmIDB4ZmYgCSovCi0KLSNkZWZpbmUgUl9XNjVfQUJTMTZTOCAgIDYgIC8qIChhZGRyID4+IDgpICYgMGZmZmYgCSovCi0jZGVmaW5lIFJfVzY1X0FCUzE2UzE2ICA3ICAvKiAoYWRkciA+PiAxNikgJiAwZmZmZiAJKi8KLQotI2RlZmluZSBSX1c2NV9QQ1I4CTgKLSNkZWZpbmUgUl9XNjVfUENSMTYJOQotCi0jZGVmaW5lIFJfVzY1X0RQICAgICAgIDEwICAvKiBkaXJlY3QgcGFnZSA4IGJpdHMgb25seSAgICovCi0KLSNlbmRpZiAvKiBHTlVfQ09GRl9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvbTY4ay5oIGIvaW5jbHVkZS9jb2ZmL202OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxNDdlZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvbTY4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgTTY4SyAqLwotCi0jaWZuZGVmIEdOVV9DT0ZGX002OEtfSAotI2RlZmluZSBHTlVfQ09GRl9NNjhLX0ggMQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0vKiBNb3Rvcm9sYSA2ODAwMC82ODAwOC82ODAxMC82ODAyMCAqLwotI2RlZmluZQlNQzY4TUFHSUMJMDUyMAotI2RlZmluZSBNQzY4S1dSTUFHSUMJMDUyMAkvKiB3cml0ZWFibGUgdGV4dCBzZWdtZW50cyAqLwotI2RlZmluZQlNQzY4VFZNQUdJQwkwNTIxCi0jZGVmaW5lIE1DNjhLUk9NQUdJQwkwNTIxCS8qIHJlYWRvbmx5IHNoYXJlYWJsZSB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lIE1DNjhLUEdNQUdJQwkwNTIyCS8qIGRlbWFuZCBwYWdlZCB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lCU02OE1BR0lDCTAyMTAKLSNkZWZpbmUJTTY4VFZNQUdJQwkwMjExCi0KLS8qIHRoaXMgaXMgdGhlIG1hZ2ljIG9mIHRoZSBCdWxsIGRweC8yICovCi0jZGVmaW5lIE1DNjhLQkNTTUFHSUMJMDUyNgotCi0vKiBUaGlzIGlzIEx5bngncyBhbGwtcGxhdGZvcm0gbWFnaWMgbnVtYmVyIGZvciBleGVjdXRhYmxlcy4gKi8KLQotI2RlZmluZSBMWU5YQ09GRk1BR0lDCTA0MTUKLQotI2RlZmluZSBPTUFHSUMgTTY4TUFHSUMKLQotLyogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXMgbm90IGluY2x1ZGUgTUM2OEtCQ1NNQUdJQzsgaXQgb25seSBpbmNsdWRlcwotICAgbWFnaWMgbnVtYmVycyB3aGljaCBpbXBseSB0aGF0IG5hbWVzIGRvIG5vdCBoYXZlIHVuZGVyc2NvcmVzLiAgKi8KLSNkZWZpbmUgTTY4S0JBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1NQzY4TUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OEtXUk1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU1DNjhUVk1BR0lDKSAmJiBcCi0gICgoeCkuZl9tYWdpYyE9TUM2OEtST01BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU1DNjhLUEdNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NNjhNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NNjhUVk1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPUxZTlhDT0ZGTUFHSUMpICkKLQotLyogTWFnaWMgbnVtYmVycyBmb3IgdGhlIGEub3V0IGhlYWRlci4gICovCi0KLSNkZWZpbmUgUEFHRU1BR0lDRVhFQ1NXQVBQRUQgIDA0MDcgLyogZXhlY3V0YWJsZSAoc3dhcHBlZCkgKi8KLSNkZWZpbmUgUEFHRU1BR0lDUEVYRUNTV0FQUEVEIDA0MTAgLyogcHVyZSBleGVjdXRhYmxlIChzd2FwcGVkKSAqLwotI2RlZmluZSBQQUdFTUFHSUNQRVhFQ1RTSExJQiAgMDQ0MyAvKiBwdXJlIGV4ZWN1dGFibGUgKHRhcmdldCBzaGFyZWQgbGlicmFyeSkgKi8KLSNkZWZpbmUgUEFHRU1BR0lDUEVYRUNQQUdFRCAgIDA0MTMgLyogcHVyZSBleGVjdXRhYmxlIChwYWdlZCkgKi8KLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0jaWZkZWYgTTY4S19DT0ZGX09GRlNFVAotICBjaGFyIHJfb2Zmc2V0WzRdOwotI2VuZGlmCi0KLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLQotI2lmZGVmIE02OEtfQ09GRl9PRkZTRVQKLSNkZWZpbmUgUkVMU1ogMTQKLSNlbHNlCi0jZGVmaW5lIFJFTFNaIDEwCi0jZW5kaWYKLQotI2VuZGlmIC8qIEdOVV9DT0ZGX002OEtfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL204OGsuaCBiL2luY2x1ZGUvY29mZi9tODhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNmViNDEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL204OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIDg4ayBiY3MgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lIE1DODhNQUdJQyAgMDU0MCAgICAgICAgICAgLyogODhrIEJDUyBleGVjdXRhYmxlICovCi0jZGVmaW5lIE1DODhETUFHSUMgMDU0MSAgICAgICAgICAgLyogREcvVVggZXhlY3V0YWJsZSAgICovCi0jZGVmaW5lIE1DODhPTUFHSUMgMDU1NQkgICAgICAgICAgLyogT2JqZWN0IGZpbGUgICAgICAgICovCi0KLSNkZWZpbmUgTUM4OEJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1NQzg4TUFHSUMpICYmKCh4KS5mX21hZ2ljIT1NQzg4RE1BR0lDKSAmJiAoKHgpLmZfbWFnaWMgIT0gTUM4OE9NQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIFBBR0VNQUdJQzMgMDQxNCAvKiBTcGxpdCBpJmQsIHplcm8gbWFwcGVkICovCi0jZGVmaW5lIFBBR0VNQUdJQ0JDUyAwNDEzCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0vKiBjb21wdXRlIHNpemUgb2YgYSBoZWFkZXIgKi8KLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIAotewotICBjaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0gIGNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0gIGNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLSAgY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotICBjaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLSAgY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLSAgY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLSAgY2hhcgkJc19ucmVsb2NbNF07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLSAgY2hhcgkJc19ubG5ub1s0XTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotICBjaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQ0Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVCAgICIudGV4dCIKLSNkZWZpbmUgX0RBVEEgICAiLmRhdGEiCi0jZGVmaW5lIF9CU1MgICAgIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0KLQljaGFyIGxfbG5ub1s0XTsKLQotfTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci0gIGNoYXIgcGFkMlsyXTsKLX07Ci0KLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJMDE3Ci0jZGVmaW5lIE5fVE1BU0sJCTA2MAotI2RlZmluZSBOX0JUU0hGVAk0Ci0jZGVmaW5lIE5fVFNISUZUCTIKLQotCi0vKiBOb3RlIHRoYXQgdGhpcyBpc24ndCB0aGUgc2FtZSBzaGFwZSBhcyBvdGhlciBjb2ZmcyAqLwotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfdGFnbmR4WzRdOwkJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotICAgIC8qIDQgKi8KLSAgICB1bmlvbiB7Ci0gICAgICBjaGFyIHhfZnNpemVbNF07CQkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0gICAgICBzdHJ1Y3QgewotCWNoYXIgIHhfbG5ub1s0XTsJLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQljaGFyICB4X3NpemVbNF07CS8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0gICAgICB9IHhfbG5zejsKLSAgICB9IHhfbWlzYzsKLSAgICAKLSAgICAvKiAxMiAqLwotICAgIHVuaW9uIHsKLSAgICAgIHN0cnVjdCB7CQkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JY2hhciB4X2VuZG5keFs0XTsJCS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotICAgICAgfSB4X2ZjbjsKLSAgICAgIHN0cnVjdCB7CQkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLSAgICAgIH0geF9hcnk7Ci0gICAgfSB4X2ZjbmFyeTsKLSAgICAvKiAyMCAqLwotICAgIAotICB9IHhfc3ltOwotICAKLSAgdW5pb24gewotICAgIGNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciB4X3plcm9lc1s0XTsKLSAgICAgIGNoYXIgeF9vZmZzZXRbNF07Ci0gICAgfSB4X247Ci0gIH0geF9maWxlOwotICAKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfc2NubGVuWzRdOwkJLyogc2VjdGlvbiBsZW5ndGggKi8KLSAgICBjaGFyIHhfbnJlbG9jWzRdOwkJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLSAgICBjaGFyIHhfbmxpbm5vWzRdOwkJLyogIyBsaW5lIG51bWJlcnMgKi8KLSAgfSB4X3NjbjsKLSAgCi0gIHN0cnVjdCB7Ci0gICAgY2hhciB4X3R2ZmlsbFs0XTsJCS8qIHR2IGZpbGwgdmFsdWUgKi8KLSAgICBjaGFyIHhfdHZsZW5bMl07CQkvKiBsZW5ndGggb2YgLnR2ICovCi0gICAgY2hhciB4X3R2cmFuWzJdWzJdOwkJLyogdHYgcmFuZ2UgKi8KLSAgfSB4X3R2OwkJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotfTsKLQotI2RlZmluZSBHRVRfRkNOX0xOTk9QVFIoYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZGVmaW5lIEdFVF9GQ05fRU5ETkRYKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4KQotI2RlZmluZSBQVVRfRkNOX0xOTk9QVFIoYWJmZCwgaW4sIGV4dCkgIGJmZF9oX3B1dF8zMihhYmZkLCAgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNkZWZpbmUgUFVUX0ZDTl9FTkRORFgoYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgICBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4KQotI2RlZmluZSBHRVRfTE5TWl9TSVpFKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2RlZmluZSBHRVRfTE5TWl9MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQotI2RlZmluZSBQVVRfTE5TWl9MTk5PKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLCBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZGVmaW5lIFBVVF9MTlNaX1NJWkUoYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKLSNkZWZpbmUgR0VUX1NDTl9TQ05MRU4oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9zY25sZW4pCi0jZGVmaW5lIEdFVF9TQ05fTlJFTE9DKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfbnJlbG9jKQotI2RlZmluZSBHRVRfU0NOX05MSU5OTyhhYmZkLCBleHQpICBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9ubGlubm8pCi0jZGVmaW5lIFBVVF9TQ05fU0NOTEVOKGFiZmQsaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X3NjbmxlbikKLSNkZWZpbmUgUFVUX1NDTl9OUkVMT0MoYWJmZCxpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ucmVsb2MpCi0jZGVmaW5lIFBVVF9TQ05fTkxJTk5PKGFiZmQsaW4sIGV4dCkgIGJmZF9oX3B1dF8zMihhYmZkLGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X25saW5ubykKLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSkKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpICBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLQotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkyMAotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfb2Zmc2V0WzJdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogIDEyCi0KLSNkZWZpbmUgTk9fVFZORFgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9tY29yZS5oIGIvaW5jbHVkZS9jb2ZmL21jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMTg5NDcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL21jb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyogTW90b3JvbGxhIE1Db3JlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIE1Db3JlIENPRkYvUEUgQUJJLiAqLwotCi0jaWZuZGVmIF9DT0ZGX01PUkVfSAotI2RlZmluZSBfQ09GRl9NT1JFX0gKLQotCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9BQlNPTFVURSAgICAgICAgICAJMHgwMDAwCi0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9BRERSMzIgICAgICAgICAgICAJMHgwMDAxCi0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU04Qlk0CQkweDAwMDIKLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTTExQlkyCQkweDAwMDMKLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTTRCWTIJCTB4MDAwNAotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfMzIJCTB4MDAwNQotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyCTB4MDAwNgotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfUlZBCQkJMHgwMDA3Ci0KLSNkZWZpbmUgUEVNQ09SRQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWMgICAgICBbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXAgICAgIFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplICAgICAgWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemUgICAgICBbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemUgICAgICBbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnkgICAgICBbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydCBbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnQgWzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLSNkZWZpbmUgT01BR0lDICAgICAgICAgIDA0MDQgICAgLyogb2JqZWN0IGZpbGVzLCBlZyBhcyBvdXRwdXQgKi8KLSNkZWZpbmUgWk1BR0lDICAgICAgICAgIDA0MTMgICAgLyogZGVtYW5kIGxvYWQgZm9ybWF0LCBlZyBub3JtYWwgbGQgb3V0cHV0ICovCi0jZGVmaW5lIFNUTUFHSUMJCTA0MDEJLyogdGFyZ2V0IHNobGliICovCi0jZGVmaW5lIFNITUFHSUMJCTA0NDMJLyogaG9zdCAgIHNobGliICovCi0KLS8qIEZyb20gd2lubnQuaCAqLwotI2RlZmluZSBJTUFHRV9OVF9PUFRJT05BTF9IRFJfTUFHSUMgICAgICAgIDB4MTBiCi0KLQotLyogRGVmaW5lIHNvbWUgTlQgZGVmYXVsdCB2YWx1ZXMuICovCi0jZGVmaW5lIE5UX1NFQ1RJT05fQUxJR05NRU5UIDB4MTAwMAotI2RlZmluZSBOVF9GSUxFX0FMSUdOTUVOVCAgICAweDIwMCAgCi0jZGVmaW5lIE5UX0RFRl9SRVNFUlZFICAgICAgIDB4MTAwMDAwCi0jZGVmaW5lIE5UX0RFRl9DT01NSVQgICAgICAgIDB4MTAwMAotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYwotewotICBjaGFyIHJfdmFkZHIgIFs0XTsKLSAgY2hhciByX3N5bW5keCBbNF07Ci0gIGNoYXIgcl90eXBlICAgWzJdOwotICBjaGFyIHJfb2Zmc2V0IFs0XTsKLX07Ci0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE0Ci0KLSNkZWZpbmUJTUNPUkVNQUdJQwkweGIwMCAgLyogSSBqdXN0IG1hZGUgdGhpcyB1cCAqLyAKLQotI2RlZmluZSBNQ09SRUJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT0gTUNPUkVNQUdJQykpCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi17Ci0gIGNoYXIgZl9tYWdpYyAgWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotICBjaGFyIGZfbnNjbnMgIFsyXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotICBjaGFyIGZfdGltZGF0IFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0gIGNoYXIgZl9zeW1wdHIgWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0gIGNoYXIgZl9uc3ltcyAgWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLSAgY2hhciBmX29wdGhkciBbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotICBjaGFyIGZfZmxhZ3MgIFsyXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbgotICB7Ci0gICAgY2hhciBlX25hbWUgW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIGNoYXIgZV96ZXJvZXMgWzRdOwotICAgICAgY2hhciBlX29mZnNldCBbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIAotICBjaGFyIGVfdmFsdWUgIFs0XTsKLSAgY2hhciBlX3NjbnVtICBbMl07Ci0gIGNoYXIgZV90eXBlICAgWzJdOwotICBjaGFyIGVfc2NsYXNzIFsxXTsKLSAgY2hhciBlX251bWF1eCBbMV07Ci19OwotCi0jZGVmaW5lIE5fQlRNQVNLCTB4ZgotI2RlZmluZSBOX1RNQVNLCQkweDMwCi0jZGVmaW5lIE5fQlRTSEZUCTQKLSNkZWZpbmUgTl9UU0hJRlQJMgotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQKLXsKLSAgc3RydWN0Ci0gIHsKLSAgICBjaGFyIHhfdGFnbmR4IFs0XTsJCS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLSAgICAKLSAgICB1bmlvbgotICAgIHsKLSAgICAgIHN0cnVjdAotICAgICAgewotCWNoYXIgIHhfbG5ubyBbMl07IAkvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCWNoYXIgIHhfc2l6ZSBbMl07IAkvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotICAgICAgfSB4X2xuc3o7Ci0KLSAgICAgIGNoYXIgeF9mc2l6ZSBbNF07CQkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0KLSAgICB9IHhfbWlzYzsKLQotICAgIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0IAkJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotICAgICAgewotCWNoYXIgeF9sbm5vcHRyIFs0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQljaGFyIHhfZW5kbmR4ICBbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotICAgICAgfSB4X2ZjbjsKLQotICAgICAgc3RydWN0IAkJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotICAgICAgewotCWNoYXIgeF9kaW1lbiBbRV9ESU1OVU1dWzJdOwotICAgICAgfSB4X2FyeTsKLSAgICAgIAotICAgIH0geF9mY25hcnk7Ci0KLSAgICBjaGFyIHhfdHZuZHggWzJdOwkJLyogdHYgaW5kZXggKi8KLQotICB9IHhfc3ltOwotCi0gIHVuaW9uCi0gIHsKLSAgICBjaGFyIHhfZm5hbWUgW0VfRklMTk1MRU5dOwotICAgIAotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIGNoYXIgeF96ZXJvZXMgWzRdOwotICAgICAgY2hhciB4X29mZnNldCBbNF07Ci0gICAgfSB4X247Ci0gICAgCi0gIH0geF9maWxlOwotCi0gIHN0cnVjdAotICB7Ci0gICAgY2hhciB4X3NjbmxlbiAgICAgWzRdOwkvKiBzZWN0aW9uIGxlbmd0aCAqLwotICAgIGNoYXIgeF9ucmVsb2MgICAgIFsyXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLSAgICBjaGFyIHhfbmxpbm5vICAgICBbMl07CS8qICMgbGluZSBudW1iZXJzICovCi0gICAgY2hhciB4X2NoZWNrc3VtICAgWzRdOwkvKiBzZWN0aW9uIENPTURBVCBjaGVja3N1bSAqLwotICAgIGNoYXIgeF9hc3NvY2lhdGVkIFsyXTsJLyogQ09NREFUIGFzc29jaWF0ZWQgc2VjdGlvbiBpbmRleCAqLwotICAgIGNoYXIgeF9jb21kYXQgICAgIFsxXTsJLyogQ09NREFUIHNlbGVjdGlvbiBudW1iZXIgKi8KLSAgfSB4X3NjbjsKLQotICBzdHJ1Y3QKLSAgewotICAgIGNoYXIgeF90dmZpbGwgWzRdOwkJLyogdHYgZmlsbCB2YWx1ZSAqLwotICAgIGNoYXIgeF90dmxlbiAgWzJdOwkJLyogbGVuZ3RoIG9mIC50diAqLwotICAgIGNoYXIgeF90dnJhbiAgWzJdWzJdOwkvKiB0diByYW5nZSAqLwotICB9IHhfdHY7CQkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICAgTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gICBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICAgc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLiAgKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLXsKLSAgdW5pb24KLSAgewotICAgIGNoYXIgbF9zeW1uZHggWzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLSAgICBjaGFyIGxfcGFkZHIgIFs0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0gIH0gbF9hZGRyOwotCi0gIGNoYXIgbF9sbm5vIFsyXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyIChhYmZkLCB2YWwsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotc3RydWN0IGV4dGVybmFsX3NjbmhkcgotewotICBjaGFyCXNfbmFtZSAgICBbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0gIGNoYXIJc19wYWRkciAgIFs0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLSAgY2hhcglzX3ZhZGRyICAgWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0gIGNoYXIJc19zaXplICAgIFs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLSAgY2hhcglzX3NjbnB0ciAgWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICBjaGFyCXNfcmVscHRyICBbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLSAgY2hhcglzX2xubm9wdHIgWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLSAgY2hhcglzX25yZWxvYyAgWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0gIGNoYXIJc19ubG5ubyAgIFsyXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotICBjaGFyCXNfZmxhZ3MgICBbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qIE5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucy4gICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotCi0KLQotI2VuZGlmIC8qIF9fQ09GRl9NQ09SRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvbWlwcy5oIGIvaW5jbHVkZS9jb2ZmL21pcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2NjViMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvbWlwcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qIEVDT0ZGIHN1cHBvcnQgb24gTUlQUyBtYWNoaW5lcy4KLSAgIGNvZmYvZWNvZmYuaCBtdXN0IGJlIGluY2x1ZGVkIGJlZm9yZSB0aGlzIGZpbGUuICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0gIHVuc2lnbmVkIGNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLSAgdW5zaWduZWQgY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qIE1hZ2ljIG51bWJlcnMgYXJlIGRlZmluZWQgaW4gY29mZi9lY29mZi5oLiAgKi8KLSNkZWZpbmUgTUlQU19FQ09GRl9CQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ18xKSAmJiBcCi0JCQkgICAgICAoKHgpLmZfbWFnaWMhPU1JUFNfTUFHSUNfTElUVExFKSAmJlwKLQkJCSAgICAgICgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ19CSUcpICYmIFwKLQkJCSAgICAgICgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ19MSVRUTEUyKSAmJiBcCi0JCQkgICAgICAoKHgpLmZfbWFnaWMhPU1JUFNfTUFHSUNfQklHMikgJiYgXAotCQkJICAgICAgKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDX0xJVFRMRTMpICYmIFwKLQkJCSAgICAgICgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ19CSUczKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCBleHRlcm5hbF9hb3V0aGRyCi17Ci0gIHVuc2lnbmVkIGNoYXIgbWFnaWNbMl07CS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICB1bnNpZ25lZCBjaGFyCXZzdGFtcFsyXTsJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdHNpemVbNF07CS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICB1bnNpZ25lZCBjaGFyCWRzaXplWzRdOwkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIHVuc2lnbmVkIGNoYXIJYnNpemVbNF07CS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgdW5zaWduZWQgY2hhcgllbnRyeVs0XTsJLyogZW50cnkgcHQuCQkJCSovCi0gIHVuc2lnbmVkIGNoYXIgdGV4dF9zdGFydFs0XTsJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyIGRhdGFfc3RhcnRbNF07CS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhciBic3Nfc3RhcnRbNF07CS8qIGJhc2Ugb2YgYnNzIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyIGdwcm1hc2tbNF07CS8qID8/ICovCi0gIHVuc2lnbmVkIGNoYXIgY3BybWFza1s0XVs0XTsJLyogPz8gKi8KLSAgdW5zaWduZWQgY2hhciBncF92YWx1ZVs0XTsJLyogdmFsdWUgZm9yIGdwIHJlZ2lzdGVyICovCi19IEFPVVRIRFI7Ci0KLS8qIGNvbXB1dGUgc2l6ZSBvZiBhIGhlYWRlciAqLwotCi0jZGVmaW5lIEFPVVRTWiA1NgotI2RlZmluZSBBT1VUSERSU1ogNTYKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0gIHVuc2lnbmVkIGNoYXIJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotICB1bnNpZ25lZCBjaGFyCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0gIHVuc2lnbmVkIGNoYXIJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotICB1bnNpZ25lZCBjaGFyCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLSAgdW5zaWduZWQgY2hhcglzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotICB1bnNpZ25lZCBjaGFyCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0gIHVuc2lnbmVkIGNoYXIJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgY2hhcglzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIHVuc2lnbmVkIGNoYXIJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIHVuc2lnbmVkIGNoYXIgcl92YWRkcls0XTsKLSAgdW5zaWduZWQgY2hhciByX2JpdHNbNF07Ci19OwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiA4Ci0KLS8qIE1JUFMgRUNPRkYgdXNlcyBhIHBhY2tlZCA4IGJ5dGUgZm9ybWF0IGZvciByZWxvY3MuICBUaGVzZSBjb25zdGFudHMKLSAgIGFyZSB1c2VkIHRvIHVucGFjayB0aGUgcl9iaXRzIGZpZWxkLiAgKi8KLQotI2RlZmluZSBSRUxPQ19CSVRTMF9TWU1ORFhfU0hfTEVGVF9CSUcJCTE2Ci0jZGVmaW5lIFJFTE9DX0JJVFMwX1NZTU5EWF9TSF9MRUZUX0xJVFRMRQkwCi0KLSNkZWZpbmUgUkVMT0NfQklUUzFfU1lNTkRYX1NIX0xFRlRfQklHCQk4Ci0jZGVmaW5lIFJFTE9DX0JJVFMxX1NZTU5EWF9TSF9MRUZUX0xJVFRMRQk4Ci0KLSNkZWZpbmUgUkVMT0NfQklUUzJfU1lNTkRYX1NIX0xFRlRfQklHCQkwCi0jZGVmaW5lIFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0xJVFRMRQkxNgotCi0vKiBPcmlnaW5hbGx5LCBFQ09GRiB1c2VkIGZvdXIgYml0cyBmb3IgdGhlIHJlbG9jIHR5cGUgYW5kIGhhZCB0aHJlZQotICAgcmVzZXJ2ZWQgYml0cy4gIElyaXggNCBhZGRlZCBhbm90aGVyIGJpdCBmb3IgdGhlIHJlbG9jIHR5cGUsIHdoaWNoCi0gICB3YXMgZWFzeSBiZWNhdXNlIGl0IHdhcyBiaWcgZW5kaWFuIGFuZCBvbmUgb2YgdGhlIHNwYXJlIGJpdHMgYmVjYW1lCi0gICB0aGUgbmV3IG1vc3Qgc2lnbmlmaWNhbnQgYml0LiAgVG8gbWFrZSB0aGlzIGFsc28gd29yayBmb3IgbGl0dGxlCi0gICBlbmRpYW4gRUNPRkYsIHdlIG5lZWQgdG8gd3JhcCBvbmUgb2YgdGhlIHJlc2VydmVkIGJpdHMgYXJvdW5kIHRvCi0gICBiZWNvbWUgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSByZWxvYyB0eXBlLiAgKi8KLSNkZWZpbmUgUkVMT0NfQklUUzNfVFlQRV9CSUcJCQkweDNFCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1RZUEVfU0hfQklHCQkJMQotI2RlZmluZSBSRUxPQ19CSVRTM19UWVBFX0xJVFRMRQkJCTB4NzgKLSNkZWZpbmUgUkVMT0NfQklUUzNfVFlQRV9TSF9MSVRUTEUJCTMKLSNkZWZpbmUgUkVMT0NfQklUUzNfVFlQRUhJX0xJVFRMRQkJMHgwNAotI2RlZmluZSBSRUxPQ19CSVRTM19UWVBFSElfU0hfTElUVExFCQkyCi0KLSNkZWZpbmUgUkVMT0NfQklUUzNfRVhURVJOX0JJRwkJCTB4MDEKLSNkZWZpbmUgUkVMT0NfQklUUzNfRVhURVJOX0xJVFRMRQkJMHg4MAotCi0vKiBUaGUgcl90eXBlIGZpZWxkIGluIGEgcmVsb2MgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgSQotICAgZG9uJ3Qga25vdyBpZiBhbnkgb3RoZXIgdmFsdWVzIGNhbiBhcHBlYXIuICBUaGVzZSBzZWVtIHRvIGJlIGFsbAotICAgdGhhdCBvY2N1ciBpbiB0aGUgVWx0cml4IDQuMiBsaWJyYXJpZXMuICAqLwotI2RlZmluZSBNSVBTX1JfSUdOT1JFCTAKLSNkZWZpbmUgTUlQU19SX1JFRkhBTEYJMQotI2RlZmluZSBNSVBTX1JfUkVGV09SRAkyCi0jZGVmaW5lIE1JUFNfUl9KTVBBRERSCTMKLSNkZWZpbmUgTUlQU19SX1JFRkhJCTQKLSNkZWZpbmUgTUlQU19SX1JFRkxPCTUKLSNkZWZpbmUgTUlQU19SX0dQUkVMCTYKLSNkZWZpbmUgTUlQU19SX0xJVEVSQUwJNwotCi0vKiBUaGVzZSByZWxvYyB0eXBlcyBhcmUgYSBDeWdudXMgZXh0ZW5zaW9uIHVzZWQgd2hlbiBnZW5lcmF0aW5nCi0gICBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgVGhlIG51bWJlcnMgYXJlCi0gICB0YWtlbiBmcm9tIElyaXggNCwgYnV0IGF0IGxlYXN0IGZvciBpbnRlcm5hbCByZWxvY3MgSXJpeCA1IGRvZXMgbm90Ci0gICBnaXZlIHRoZW0gdGhlIHNhbWUgbWVhbmluZy4gIEZvciBhbiBpbnRlcm5hbCByZWxvYyB0aGUgc3ltYm9sIGluZGV4Ci0gICBvZiBSRUxISSBhbmQgUkVMTE8gaXMgbW9kaWZpZWQgYXMgZGVzY3JpYmVkIGJlbG93IGZvcgotICAgTUlQU19SX1NXSVRDSC4gICovCi0jZGVmaW5lIE1JUFNfUl9QQ1JFTDE2CTEyCi0jZGVmaW5lIE1JUFNfUl9SRUxISQkxMwotI2RlZmluZSBNSVBTX1JfUkVMTE8JMTQKLQotLyogVGhpcyByZWxvYyB0eXBlIGlzIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbgotICAgaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIEl0IGlzIHVzZWQgZm9yIGFuIGVudHJ5IGluCi0gICBhIHN3aXRjaCB0YWJsZSwgd2hpY2ggbG9va3MgbGlrZSB0aGlzOgotICAgICAud29yZCAkTDMtJExTMTIKLSAgIFRoZSBvYmplY3QgZmlsZSB3aWxsIGNvbnRhaW4gdGhlIGNvcnJlY3QgZGlmZmVyZW5jZSwgYW5kIGRvZXMgbm90Ci0gICByZXF1aXJlIGFkanVzdG1lbnQuICBIb3dldmVyLCB3aGVuIHRoZSBsaW5rZXIgaXMgcmVsYXhpbmcgUEMKLSAgIHJlbGF0aXZlIGNhbGxzLCBpdCBpcyBwb3NzaWJsZSBmb3IgJEwzIHRvIG1vdmUgZmFydGhlciBhd2F5LiAgVGhpcwotICAgcmVsb2MgYWx3YXlzIGFwcGVhcnMgaW4gdGhlIC50ZXh0IHNlY3Rpb24sIGFuZCBpcyBhbHdheXMgYWdhaW5zdAotICAgdGhlIC50ZXh0IHNlY3Rpb24uICBIb3dldmVyLCB0aGUgc3ltYm9sIGluZGV4IGlzIG5vdAotICAgUkVMT0NfU0VDVElPTl9URVhULiAgSXQgaXMsIGluc3RlYWQsIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMKLSAgIHN3aXRjaCB0YWJsZSBlbnRyeSBhbmQgJExTMTIuICBUaHVzLCB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgJEwxMiBpcwotICAgICB2YWRkciAtIHN5bW5keAotICAgYW5kIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiAkTDMgaXMKLSAgICAgdmFkZHIgLSBzeW1uZHggKyBhZGRlbmQKLSAgIHdoZXJlIGFkZGVuZCBpcyB0aGUgdmFsdWUgaW4gdGhlIG9iamVjdCBmaWxlLiAgS25vd2luZyB0aGlzLCB0aGUKLSAgIGxpbmtlciBjYW4ga25vdyB3aGV0aGVyIHRoZSBhZGRlbmQgaW4gdGhlIG9iamVjdCBmaWxlIG11c3QgYmUKLSAgIGFkanVzdGVkLiAgKi8KLSNkZWZpbmUgTUlQU19SX1NXSVRDSAkyMgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTVEFCUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE1JUFNfSVNfU1RBQiBFQ09GRl9JU19TVEFCCi0jZGVmaW5lIE1JUFNfTUFSS19TVEFCIEVDT0ZGX01BUktfU1RBQgotI2RlZmluZSBNSVBTX1VOTUFSS19TVEFCIEVDT0ZGX1VOTUFSS19TVEFCCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTElDIElORk9STUFUSU9OICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFdyaXR0ZW4gYnkgSm9obiBHaWxtb3JlLiAgKi8KLQotLyogRUNPRkYgdXNlcyBDT0ZGLWxpa2Ugc2VjdGlvbiBzdHJ1Y3R1cmVzLCBidXQgaXRzIG93biBzeW1ib2wgZm9ybWF0LgotICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHN5bWJvbCBmb3JtYXQgaW4gZmllbGRzIHdob3NlIHNpemUgYW5kIGFsaWdubWVudAotICAgd2lsbCBub3QgdmFyeSBvbiBkaWZmZXJlbnQgaG9zdCBzeXN0ZW1zLiAgKi8KLQotLyogRmlsZSBoZWFkZXIgYXMgYSBzZXQgb2YgYnl0ZXMgKi8KLQotc3RydWN0IGhkcl9leHQgewotCXVuc2lnbmVkIGNoYXIgCWhfbWFnaWNbMl07Ci0JdW5zaWduZWQgY2hhcgloX3ZzdGFtcFsyXTsKLQl1bnNpZ25lZCBjaGFyCWhfaWxpbmVNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiTGluZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JMaW5lT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pZG5NYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiRG5PZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lwZE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JQZE9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaXN5bU1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JTeW1PZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lvcHRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiT3B0T2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pYXV4TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkF1eE9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaXNzTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlNzT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pc3NFeHRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiU3NFeHRPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lmZE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JGZE9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY3JmZFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JSZmRPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lleHRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiRXh0T2Zmc2V0WzRdOwotfTsKLQotLyogRmlsZSBkZXNjcmlwdG9yIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgZmRyX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglmX2Fkcls0XTsKLQl1bnNpZ25lZCBjaGFyCWZfcnNzWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pc3NCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jYlNzWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pc3ltQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY3N5bVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaWxpbmVCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jbGluZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaW9wdEJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NvcHRbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lwZEZpcnN0WzJdOwotCXVuc2lnbmVkIGNoYXIJZl9jcGRbMl07Ci0JdW5zaWduZWQgY2hhcglmX2lhdXhCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jYXV4WzRdOwotCXVuc2lnbmVkIGNoYXIJZl9yZmRCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jcmZkWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCWZfYml0czJbM107Ci0JdW5zaWduZWQgY2hhcglmX2NiTGluZU9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2JMaW5lWzRdOwotfTsKLQotI2RlZmluZQlGRFJfQklUUzFfTEFOR19CSUcJCTB4RjgKLSNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfU0hfQklHCQkzCi0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX0xJVFRMRQkJMHgxRgotI2RlZmluZQlGRFJfQklUUzFfTEFOR19TSF9MSVRUTEUJMAotCi0jZGVmaW5lCUZEUl9CSVRTMV9GTUVSR0VfQklHCQkweDA0Ci0jZGVmaW5lCUZEUl9CSVRTMV9GTUVSR0VfTElUVExFCQkweDIwCi0KLSNkZWZpbmUJRkRSX0JJVFMxX0ZSRUFESU5fQklHCQkweDAyCi0jZGVmaW5lCUZEUl9CSVRTMV9GUkVBRElOX0xJVFRMRQkweDQwCi0KLSNkZWZpbmUJRkRSX0JJVFMxX0ZCSUdFTkRJQU5fQklHCTB4MDEKLSNkZWZpbmUJRkRSX0JJVFMxX0ZCSUdFTkRJQU5fTElUVExFCTB4ODAKLQotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX0JJRwkJMHhDMAotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX1NIX0JJRwkJNgotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX0xJVFRMRQkJMHgwMwotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX1NIX0xJVFRMRQkwCi0KLS8qIFdlIGlnbm9yZSB0aGUgYHJlc2VydmVkJyBmaWVsZCBpbiBiaXRzMi4gKi8KLQotLyogUHJvY2VkdXJlIGRlc2NyaXB0b3IgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBwZHJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCXBfYWRyWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9pc3ltWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9pbGluZVs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfcmVnbWFza1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfcmVnb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9pb3B0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmVnbWFza1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJlZ29mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJhbWVvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyYW1lcmVnWzJdOwotCXVuc2lnbmVkIGNoYXIJcF9wY3JlZ1syXTsKLQl1bnNpZ25lZCBjaGFyCXBfbG5Mb3dbNF07Ci0JdW5zaWduZWQgY2hhcglwX2xuSGlnaFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfY2JMaW5lT2Zmc2V0WzRdOwotfTsKLQotLyogUnVudGltZSBwcm9jZWR1cmUgdGFibGUgKi8KLQotc3RydWN0IHJwZHJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCXBfYWRyWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZWdtYXNrWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZWdvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyZWdtYXNrWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmVnb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmFtZW9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJhbWVyZWdbMl07Ci0JdW5zaWduZWQgY2hhcglwX3BjcmVnWzJdOwotCXVuc2lnbmVkIGNoYXIJcF9pcnBzc1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfcmVzZXJ2ZWRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2V4Y2VwdGlvbl9pbmZvWzRdOwotfTsKLQotLyogTGluZSBudW1iZXJzICovCi0KLXN0cnVjdCBsaW5lX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglsX2xpbmVbNF07Ci19OwotCi0vKiBTeW1ib2wgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBzeW1fZXh0IHsKLQl1bnNpZ25lZCBjaGFyCXNfaXNzWzRdOwotCXVuc2lnbmVkIGNoYXIJc192YWx1ZVs0XTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcglzX2JpdHMyWzFdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzM1sxXTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czRbMV07Ci19OwotCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9CSUcJCTB4RkMKLSNkZWZpbmUJU1lNX0JJVFMxX1NUX1NIX0JJRwkJMgotI2RlZmluZQlTWU1fQklUUzFfU1RfTElUVExFCQkweDNGCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9TSF9MSVRUTEUJCTAKLQotI2RlZmluZQlTWU1fQklUUzFfU0NfQklHCQkweDAzCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19TSF9MRUZUX0JJRwkzCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19MSVRUTEUJCTB4QzAKLSNkZWZpbmUJU1lNX0JJVFMxX1NDX1NIX0xJVFRMRQkJNgotCi0jZGVmaW5lCVNZTV9CSVRTMl9TQ19CSUcJCTB4RTAKLSNkZWZpbmUJU1lNX0JJVFMyX1NDX1NIX0JJRwkJNQotI2RlZmluZQlTWU1fQklUUzJfU0NfTElUVExFCQkweDA3Ci0jZGVmaW5lCVNZTV9CSVRTMl9TQ19TSF9MRUZUX0xJVFRMRQkyCi0KLSNkZWZpbmUJU1lNX0JJVFMyX1JFU0VSVkVEX0JJRwkJMHgxMAotI2RlZmluZQlTWU1fQklUUzJfUkVTRVJWRURfTElUVExFCTB4MDgKLQotI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfQklHCQkweDBGCi0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRwkxNgotI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfTElUVExFCQkweEYwCi0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9TSF9MSVRUTEUJNAotCi0jZGVmaW5lCVNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRwk4Ci0jZGVmaW5lCVNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRQk0Ci0KLSNkZWZpbmUJU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfQklHCTAKLSNkZWZpbmUJU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfTElUVExFCTEyCi0KLS8qIEV4dGVybmFsIHN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IGV4dF9leHQgewotCXVuc2lnbmVkIGNoYXIJZXNfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcgllc19iaXRzMlsxXTsKLQl1bnNpZ25lZCBjaGFyCWVzX2lmZFsyXTsKLQlzdHJ1Y3QJc3ltX2V4dCBlc19hc3ltOwotfTsKLQotI2RlZmluZQlFWFRfQklUUzFfSk1QVEJMX0JJRwkJMHg4MAotI2RlZmluZQlFWFRfQklUUzFfSk1QVEJMX0xJVFRMRQkJMHgwMQotCi0jZGVmaW5lCUVYVF9CSVRTMV9DT0JPTF9NQUlOX0JJRwkweDQwCi0jZGVmaW5lCUVYVF9CSVRTMV9DT0JPTF9NQUlOX0xJVFRMRQkweDAyCi0KLSNkZWZpbmUJRVhUX0JJVFMxX1dFQUtFWFRfQklHCQkweDIwCi0jZGVmaW5lCUVYVF9CSVRTMV9XRUFLRVhUX0xJVFRMRQkweDA0Ci0KLS8qIERlbnNlIG51bWJlcnMgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBkbnJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWRfcmZkWzRdOwotCXVuc2lnbmVkIGNoYXIJZF9pbmRleFs0XTsKLX07Ci0KLS8qIFJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvciAqLwotCi1zdHJ1Y3QgcmZkX2V4dCB7Ci0gIHVuc2lnbmVkIGNoYXIJcmZkWzRdOwotfTsKLQotLyogT3B0aW1pemVyIHN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IG9wdF9leHQgewotICB1bnNpZ25lZCBjaGFyIG9fYml0czFbMV07Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzMlsxXTsKLSAgdW5zaWduZWQgY2hhciBvX2JpdHMzWzFdOwotICB1bnNpZ25lZCBjaGFyIG9fYml0czRbMV07Ci0gIHN0cnVjdCBybmR4X2V4dCBvX3JuZHg7Ci0gIHVuc2lnbmVkIGNoYXIgb19vZmZzZXRbNF07Ci19OwotCi0jZGVmaW5lIE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0JJRwkxNgotI2RlZmluZSBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEUJMAotCi0jZGVmaW5lIE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0JJRwk4Ci0jZGVmaW5lIE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0xJVFRMRQk4Ci0KLSNkZWZpbmUgT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfQklHCTAKLSNkZWZpbmUgT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfTElUVExFCTE2CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvcGUuaCBiL2luY2x1ZGUvY29mZi9wZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTY3NmE1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9wZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qIFBFIENPRkYgaGVhZGVyIGluZm9ybWF0aW9uICovCi0KLSNpZm5kZWYgX1BFX0gKLSNkZWZpbmUgX1BFX0gKLQotLyogTlQgc3BlY2lmaWMgZmlsZSBhdHRyaWJ1dGVzICovCi0jZGVmaW5lIElNQUdFX0ZJTEVfUkVMT0NTX1NUUklQUEVEICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgSU1BR0VfRklMRV9FWEVDVVRBQkxFX0lNQUdFICAgICAgICAgIDB4MDAwMgotI2RlZmluZSBJTUFHRV9GSUxFX0xJTkVfTlVNU19TVFJJUFBFRCAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIElNQUdFX0ZJTEVfTE9DQUxfU1lNU19TVFJJUFBFRCAgICAgICAweDAwMDgKLSNkZWZpbmUgSU1BR0VfRklMRV9CWVRFU19SRVZFUlNFRF9MTyAgICAgICAgIDB4MDA4MAotI2RlZmluZSBJTUFHRV9GSUxFXzMyQklUX01BQ0hJTkUgICAgICAgICAgICAgMHgwMTAwCi0jZGVmaW5lIElNQUdFX0ZJTEVfREVCVUdfU1RSSVBQRUQgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUgSU1BR0VfRklMRV9TWVNURU0gICAgICAgICAgICAgICAgICAgIDB4MTAwMAotI2RlZmluZSBJTUFHRV9GSUxFX0RMTCAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCi0jZGVmaW5lIElNQUdFX0ZJTEVfQllURVNfUkVWRVJTRURfSEkgICAgICAgICAweDgwMDAKLQotLyogYWRkaXRpb25hbCBmbGFncyB0byBiZSBzZXQgZm9yIHNlY3Rpb24gaGVhZGVycyB0byBhbGxvdyB0aGUgTlQgbG9hZGVyIHRvCi0gICByZWFkIGFuZCB3cml0ZSB0byB0aGUgc2VjdGlvbiBkYXRhICh0byByZXBsYWNlIHRoZSBhZGRyZXNzZXMgb2YgZGF0YSBpbgotICAgZGxscyBmb3Igb25lIHRoaW5nKTsgYWxzbyB0byBleGVjdXRlIHRoZSBzZWN0aW9uIGluIC50ZXh0J3MgY2FzZSAqLwotI2RlZmluZSBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFIDB4MDIwMDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9FWEVDVVRFICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fUkVBRCAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fTUVNX1dSSVRFICAgICAgIDB4ODAwMDAwMDAKLQotLyoKLSAqIFNlY3Rpb24gY2hhcmFjdGVyaXN0aWNzIGFkZGVkIGZvciBwcGMtbnQKLSAqLwotCi0jZGVmaW5lIElNQUdFX1NDTl9UWVBFX05PX1BBRCAgICAgICAgICAgICAgICAweDAwMDAwMDA4ICAvKiBSZXNlcnZlZC4gKi8KLQotI2RlZmluZSBJTUFHRV9TQ05fQ05UX0NPREUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMCAgLyogU2VjdGlvbiBjb250YWlucyBjb2RlLiAqLwotI2RlZmluZSBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgICAgICAgMHgwMDAwMDA0MCAgLyogU2VjdGlvbiBjb250YWlucyBpbml0aWFsaXplZCBkYXRhLiAqLwotI2RlZmluZSBJTUFHRV9TQ05fQ05UX1VOSU5JVElBTElaRURfREFUQSAgICAgMHgwMDAwMDA4MCAgLyogU2VjdGlvbiBjb250YWlucyB1bmluaXRpYWxpemVkIGRhdGEuICovCi0KLSNkZWZpbmUgSU1BR0VfU0NOX0xOS19PVEhFUiAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgIC8qIFJlc2VydmVkLiAqLwotI2RlZmluZSBJTUFHRV9TQ05fTE5LX0lORk8gICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMCAgLyogU2VjdGlvbiBjb250YWlucyBjb21tZW50cyBvciBzb21lIG90aGVyIHR5cGUgb2YgaW5mb3JtYXRpb24uICovCi0jZGVmaW5lIElNQUdFX1NDTl9MTktfUkVNT1ZFICAgICAgICAgICAgICAgICAweDAwMDAwODAwICAvKiBTZWN0aW9uIGNvbnRlbnRzIHdpbGwgbm90IGJlY29tZSBwYXJ0IG9mIGltYWdlLiAqLwotI2RlZmluZSBJTUFHRV9TQ05fTE5LX0NPTURBVCAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMCAgLyogU2VjdGlvbiBjb250ZW50cyBjb21kYXQuICovCi0KLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9GQVJEQVRBICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLQotI2RlZmluZSBJTUFHRV9TQ05fTUVNX1BVUkdFQUJMRSAgICAgICAgICAgICAgMHgwMDAyMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fTUVNXzE2QklUICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fTUVNX0xPQ0tFRCAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAotI2RlZmluZSBJTUFHRV9TQ05fTUVNX1BSRUxPQUQgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAotCi0jZGVmaW5lIElNQUdFX1NDTl9BTElHTl8xQllURVMgICAgICAgICAgICAgICAweDAwMTAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9BTElHTl8yQllURVMgICAgICAgICAgICAgICAweDAwMjAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9BTElHTl80QllURVMgICAgICAgICAgICAgICAweDAwMzAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9BTElHTl84QllURVMgICAgICAgICAgICAgICAweDAwNDAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9BTElHTl8xNkJZVEVTICAgICAgICAgICAgICAweDAwNTAwMDAwICAvKiBEZWZhdWx0IGFsaWdubWVudCBpZiBubyBvdGhlcnMgYXJlIHNwZWNpZmllZC4gKi8KLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzMyQllURVMgICAgICAgICAgICAgIDB4MDA2MDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzY0QllURVMgICAgICAgICAgICAgIDB4MDA3MDAwMDAKLQotCi0jZGVmaW5lIElNQUdFX1NDTl9MTktfTlJFTE9DX09WRkwgICAgICAgICAgICAweDAxMDAwMDAwICAvKiBTZWN0aW9uIGNvbnRhaW5zIGV4dGVuZGVkIHJlbG9jYXRpb25zLiAqLwotI2RlZmluZSBJTUFHRV9TQ05fTUVNX05PVF9DQUNIRUQgICAgICAgICAgICAgMHgwNDAwMDAwMCAgLyogU2VjdGlvbiBpcyBub3QgY2FjaGFibGUuICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9OT1RfUEFHRUQgICAgICAgICAgICAgIDB4MDgwMDAwMDAgIC8qIFNlY3Rpb24gaXMgbm90IHBhZ2VhYmxlLiAgICAgICAgICAgICAgICovCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fU0hBUkVEICAgICAgICAgICAgICAgICAweDEwMDAwMDAwICAvKiBTZWN0aW9uIGlzIHNoYXJlYWJsZS4gICAgICAgICAgICAgICAgICAqLwotCi0vKiBDT01EQVQgc2VsZWN0aW9uIGNvZGVzLiAgKi8KLQotI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX05PRFVQTElDQVRFUyAgICAgKDEpIC8qIFdhcm4gaWYgZHVwbGljYXRlcy4gICovCi0jZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfQU5ZCQkgICAgICgyKSAvKiBObyB3YXJuaW5nLiAgKi8KLSNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9TQU1FX1NJWkUJICAgICAoMykgLyogV2FybiBpZiBkaWZmZXJlbnQgc2l6ZS4gICovCi0jZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfRVhBQ1RfTUFUQ0gJICAgICAoNCkgLyogV2FybiBpZiBkaWZmZXJlbnQuICAqLwotI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX0FTU09DSUFUSVZFCSAgICAgKDUpIC8qIEJhc2Ugb24gb3RoZXIgc2VjdGlvbi4gICovCi0KLS8qIE1hZ2ljIHZhbHVlcyB0aGF0IGFyZSB0cnVlIGZvciBhbGwgZG9zL250IGltcGxlbWVudGF0aW9ucyAqLwotI2RlZmluZSBET1NNQUdJQyAgICAgICAweDVhNGQgIAotI2RlZmluZSBOVF9TSUdOQVRVUkUgICAweDAwMDA0NTUwCi0KLSAgLyogTlQgYWxsb3dzIGxvbmcgZmlsZW5hbWVzLCB3ZSB3YW50IHRvIGFjY29tbW9kYXRlIHRoaXMuICBUaGlzIG1heSBicmVhawotICAgICBzb21lIG9mIHRoZSBiZmQgZnVuY3Rpb25zICovCi0jdW5kZWYgIEZJTE5NTEVOCi0jZGVmaW5lIEZJTE5NTEVOCTE4CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLQotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0vKiBUaGUgZmlsZWhkciBpcyBvbmx5IHdlaXJlZCBpbiBpbWFnZXMgKi8KLQotI3VuZGVmIEZJTEhEUgotc3RydWN0IGV4dGVybmFsX1BFX2ZpbGVoZHIKLXsKLSAgLyogRE9TIGhlYWRlciBmaWVsZHMgKi8KLSAgY2hhciBlX21hZ2ljWzJdOwkJLyogTWFnaWMgbnVtYmVyLCAweDVhNGQgKi8KLSAgY2hhciBlX2NibHBbMl07CQkvKiBCeXRlcyBvbiBsYXN0IHBhZ2Ugb2YgZmlsZSwgMHg5MCAqLwotICBjaGFyIGVfY3BbMl07CQkJLyogUGFnZXMgaW4gZmlsZSwgMHgzICovCi0gIGNoYXIgZV9jcmxjWzJdOwkJLyogUmVsb2NhdGlvbnMsIDB4MCAqLwotICBjaGFyIGVfY3BhcmhkclsyXTsJCS8qIFNpemUgb2YgaGVhZGVyIGluIHBhcmFncmFwaHMsIDB4NCAqLwotICBjaGFyIGVfbWluYWxsb2NbMl07CQkvKiBNaW5pbXVtIGV4dHJhIHBhcmFncmFwaHMgbmVlZGVkLCAweDAgKi8KLSAgY2hhciBlX21heGFsbG9jWzJdOwkJLyogTWF4aW11bSBleHRyYSBwYXJhZ3JhcGhzIG5lZWRlZCwgMHhGRkZGICovCi0gIGNoYXIgZV9zc1syXTsJCQkvKiBJbml0aWFsIChyZWxhdGl2ZSkgU1MgdmFsdWUsIDB4MCAqLwotICBjaGFyIGVfc3BbMl07CQkJLyogSW5pdGlhbCBTUCB2YWx1ZSwgMHhiOCAqLwotICBjaGFyIGVfY3N1bVsyXTsJCS8qIENoZWNrc3VtLCAweDAgKi8KLSAgY2hhciBlX2lwWzJdOwkJCS8qIEluaXRpYWwgSVAgdmFsdWUsIDB4MCAqLwotICBjaGFyIGVfY3NbMl07CQkJLyogSW5pdGlhbCAocmVsYXRpdmUpIENTIHZhbHVlLCAweDAgKi8KLSAgY2hhciBlX2xmYXJsY1syXTsJCS8qIEZpbGUgYWRkcmVzcyBvZiByZWxvY2F0aW9uIHRhYmxlLCAweDQwICovCi0gIGNoYXIgZV9vdm5vWzJdOwkJLyogT3ZlcmxheSBudW1iZXIsIDB4MCAqLwotICBjaGFyIGVfcmVzWzRdWzJdOwkJLyogUmVzZXJ2ZWQgd29yZHMsIGFsbCAweDAgKi8KLSAgY2hhciBlX29lbWlkWzJdOwkJLyogT0VNIGlkZW50aWZpZXIgKGZvciBlX29lbWluZm8pLCAweDAgKi8KLSAgY2hhciBlX29lbWluZm9bMl07CQkvKiBPRU0gaW5mb3JtYXRpb247IGVfb2VtaWQgc3BlY2lmaWMsIDB4MCAqLwotICBjaGFyIGVfcmVzMlsxMF1bMl07CQkvKiBSZXNlcnZlZCB3b3JkcywgYWxsIDB4MCAqLwotICBjaGFyIGVfbGZhbmV3WzRdOwkJLyogRmlsZSBhZGRyZXNzIG9mIG5ldyBleGUgaGVhZGVyLCAweDgwICovCi0gIGNoYXIgZG9zX21lc3NhZ2VbMTZdWzRdOwkvKiBvdGhlciBzdHVmZiwgYWx3YXlzIGZvbGxvdyBET1MgaGVhZGVyICovCi0gIGNoYXIgbnRfc2lnbmF0dXJlWzRdOwkJLyogcmVxdWlyZWQgTlQgc2lnbmF0dXJlLCAweDQ1NTAgKi8gCi0KLSAgLyogRnJvbSBzdGFuZGFyZCBoZWFkZXIgKi8gIAotCi0KLSAgY2hhciBmX21hZ2ljWzJdOwkJLyogbWFnaWMgbnVtYmVyCQkJKi8KLSAgY2hhciBmX25zY25zWzJdOwkJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotICBjaGFyIGZfdGltZGF0WzRdOwkJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0gIGNoYXIgZl9zeW1wdHJbNF07CQkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0gIGNoYXIgZl9uc3ltc1s0XTsJCS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotICBjaGFyIGZfb3B0aGRyWzJdOwkJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0gIGNoYXIgZl9mbGFnc1syXTsJCS8qIGZsYWdzCQkJKi8KLQotfTsKLQotCi0jZGVmaW5lIEZJTEhEUiBzdHJ1Y3QgZXh0ZXJuYWxfUEVfZmlsZWhkcgotI3VuZGVmIEZJTEhTWgotI2RlZmluZSBGSUxIU1ogMTUyCi0KLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgQU9VVEhEUiBzdGFuZGFyZDsKLQotICAvKiBOVCBleHRyYSBmaWVsZHM7IHNlZSBpbnRlcm5hbC5oIGZvciBkZXNjcmlwdGlvbnMgKi8KLSAgY2hhciAgSW1hZ2VCYXNlWzRdOwotICBjaGFyICBTZWN0aW9uQWxpZ25tZW50WzRdOwotICBjaGFyICBGaWxlQWxpZ25tZW50WzRdOwotICBjaGFyICBNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb25bMl07Ci0gIGNoYXIgIE1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvblsyXTsKLSAgY2hhciAgTWFqb3JJbWFnZVZlcnNpb25bMl07Ci0gIGNoYXIgIE1pbm9ySW1hZ2VWZXJzaW9uWzJdOwotICBjaGFyICBNYWpvclN1YnN5c3RlbVZlcnNpb25bMl07Ci0gIGNoYXIgIE1pbm9yU3Vic3lzdGVtVmVyc2lvblsyXTsKLSAgY2hhciAgUmVzZXJ2ZWQxWzRdOwotICBjaGFyICBTaXplT2ZJbWFnZVs0XTsKLSAgY2hhciAgU2l6ZU9mSGVhZGVyc1s0XTsKLSAgY2hhciAgQ2hlY2tTdW1bNF07Ci0gIGNoYXIgIFN1YnN5c3RlbVsyXTsKLSAgY2hhciAgRGxsQ2hhcmFjdGVyaXN0aWNzWzJdOwotICBjaGFyICBTaXplT2ZTdGFja1Jlc2VydmVbNF07Ci0gIGNoYXIgIFNpemVPZlN0YWNrQ29tbWl0WzRdOwotICBjaGFyICBTaXplT2ZIZWFwUmVzZXJ2ZVs0XTsKLSAgY2hhciAgU2l6ZU9mSGVhcENvbW1pdFs0XTsKLSAgY2hhciAgTG9hZGVyRmxhZ3NbNF07Ci0gIGNoYXIgIE51bWJlck9mUnZhQW5kU2l6ZXNbNF07Ci0gIC8qIElNQUdFX0RBVEFfRElSRUNUT1JZIERhdGFEaXJlY3RvcnlbSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVNdOyAqLwotICBjaGFyICBEYXRhRGlyZWN0b3J5WzE2XVsyXVs0XTsgLyogMTYgZW50cmllcywgMiBlbGVtZW50cy9lbnRyeSwgNCBjaGFycyAqLwotCi19IFBFQU9VVEhEUjsKLQotCi0jdW5kZWYgQU9VVFNaCi0jZGVmaW5lIEFPVVRTWiAoQU9VVEhEUlNaICsgMTk2KQotCi0jdW5kZWYgIEVfRklMTk1MRU4KLSNkZWZpbmUgRV9GSUxOTUxFTgkxOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZW5kaWYKLQotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9wb3dlcnBjLmggYi9pbmNsdWRlL2NvZmYvcG93ZXJwYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTUyY2Y5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9wb3dlcnBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyogQmFzaWMgY29mZiBpbmZvcm1hdGlvbiBmb3IgdGhlIFBvd2VyUEMKLSAqCi0gKiBCYXNlZCBvbiBjb2ZmL3JzNjAwMC5oLCBjb2ZmL2kzODYuaCBhbmQgb3RoZXJzLgotICoKLSAqIEluaXRpYWwgcmVsZWFzZTogS2ltIEtudXR0aWxhIChrcmtAY3lnbnVzLmNvbSkKLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0gIGNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLSAgY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIGNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotICBjaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0gIGNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIGNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotICBjaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfQVIzMldSCWZpbGUgaGFzIGJ5dGUgb3JkZXJpbmcgb2YgYW4gQVIzMldSIG1hY2hpbmUgKGUuZy4gdmF4KQotICovCi0KLSNkZWZpbmUgRl9SRUxGTEcJKDB4MDAwMSkKLSNkZWZpbmUgRl9FWEVDCQkoMHgwMDAyKQotI2RlZmluZSBGX0xOTk8JCSgweDAwMDQpCi0jZGVmaW5lIEZfTFNZTVMJCSgweDAwMDgpCi0KLS8qIGV4dHJhIE5UIGRlZmluZXMgKi8KLSNkZWZpbmUgUFBDTUFHSUMgICAgICAgMDc2MCAgICAgICAgIC8qIHBlZWtlZCBvbiBhYSBQb3dlclBDIFdpbmRvd3MgTlQgYm94ICovCi0jZGVmaW5lIERPU01BR0lDICAgICAgIDB4NWE0ZCAgICAgICAvKiBmcm9tIGFybS5oLCBpMzg2LmggKi8KLSNkZWZpbmUgTlRfU0lHTkFUVVJFICAgMHgwMDAwNDU1MCAgIC8qIGZyb20gYXJtLmgsIGkzODYuaCAqLwotCi0vKiBmcm9tIHdpbm50LmggKi8KLSNkZWZpbmUgSU1BR0VfTlRfT1BUSU9OQUxfSERSX01BR0lDICAgICAgICAweDEwYgotCi0jZGVmaW5lIFBQQ0JBRE1BRyh4KSAoKHgpLmZfbWFnaWMgIT0gUFBDTUFHSUMpIAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLSAgY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkgICAgKi8KLSAgY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLSAgY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCSAgICAgICAgICAgICovCi0gIGNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJICAgICovCi0gIGNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICBjaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkgICAgKi8KLSAgY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJICAgICovCi0gIGNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSAgICAqLwotICBjaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyAgICAqLwotICBjaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSAgICAqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0jZGVmaW5lIF9MSUIgIi5saWIiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwICovCi0gICAgY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJICAgICAgICovCi0gIH0gbF9hZGRyOwotICBjaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSAgICAgICAgICAgICAgICAgICAgICAgKi8KLX07Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOCAgICAgLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUgICAgICAgKi8KLQotLyogQWxsb3cgdGhlIGZpbGUgbmFtZSBsZW5ndGggdG8gYmUgb3ZlcnJpZGRlbiBpbiB0aGUgaW5jbHVkaW5nIGZpbGUgICAqLwotI2lmbmRlZiBFX0ZJTE5NTEVOCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQKLSNlbmRpZgotCi0jZGVmaW5lIEVfRElNTlVNCTQgICAgIC8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKLSNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotICBzdHJ1Y3QgewotICAgIGNoYXIgeF90YWduZHhbNF07CSAgICAgICAgICAgLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAgICAgICAqLwotICAgIHVuaW9uIHsKLSAgICAgIHN0cnVjdCB7Ci0JY2hhciAgeF9sbm5vWzJdOyAgICAgICAgICAgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgICAgICAgICAqLwotCWNoYXIgIHhfc2l6ZVsyXTsgICAgICAgICAgIC8qIHN0ci91bmlvbi9hcnJheSBzaXplICAgICAgICAgICAgKi8KLSAgICAgIH0geF9sbnN6OwotICAgICAgY2hhciB4X2ZzaXplWzRdOwkgICAgICAgICAgIC8qIHNpemUgb2YgZnVuY3Rpb24gICAgICAgICAgICAgICAgKi8KLSAgICB9IHhfbWlzYzsKLSAgICB1bmlvbiB7Ci0gICAgICBzdHJ1Y3QgewkJICAgICAgICAgICAvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgICAgICAgICAgICovCi0JY2hhciB4X2xubm9wdHJbNF07ICAgICAgICAgLyogcHRyIHRvIGZjbiBsaW5lICMgICAgICAgICAgICAgICAqLwotCWNoYXIgeF9lbmRuZHhbNF07CSAgIC8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAgICAgICAgKi8KLSAgICAgIH0geF9mY247Ci0gICAgICBzdHJ1Y3QgewkJICAgICAgICAgICAvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gICAgICAgICovCi0JY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLSAgICAgIH0geF9hcnk7Ci0gICAgfSB4X2ZjbmFyeTsKLSAgICBjaGFyIHhfdHZuZHhbMl07CQkgICAvKiB0diBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIH0geF9zeW07Ci0gIAotICB1bmlvbiB7Ci0gICAgY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIHhfemVyb2VzWzRdOwotICAgICAgY2hhciB4X29mZnNldFs0XTsKLSAgICB9IHhfbjsKLSAgfSB4X2ZpbGU7Ci0gIAotICBzdHJ1Y3QgewotICAgIGNoYXIgeF9zY25sZW5bNF07CSAgICAgICAgICAgLyogc2VjdGlvbiBsZW5ndGggICAgICAgICAgICAgICAgICAqLwotICAgIGNoYXIgeF9ucmVsb2NbMl07CSAgICAgICAgICAgLyogIyByZWxvY2F0aW9uIGVudHJpZXMgICAgICAgICAgICAqLwotICAgIGNoYXIgeF9ubGlubm9bMl07CSAgICAgICAgICAgLyogIyBsaW5lIG51bWJlcnMgICAgICAgICAgICAgICAgICAqLwotICAgIGNoYXIgeF9jaGVja3N1bVs0XTsJCSAgIC8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtCSAgICAgICovCi0gICAgY2hhciB4X2Fzc29jaWF0ZWRbMl07CSAgIC8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLSAgICBjaGFyIHhfY29tZGF0WzFdOwkJICAgLyogQ09NREFUIHNlbGVjdGlvbiBudW1iZXIJICAgICAgKi8KLSAgfSB4X3NjbjsKLX07Ci0KLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotI2RlZmluZSBfRVRFWFQJImV0ZXh0IgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLX07Ci0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEwCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9yczYwMDAuaCBiL2luY2x1ZGUvY29mZi9yczYwMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRlZjFkOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvcnM2MDAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyogSUJNIFJTLzYwMDAgIlhDT0ZGIiBmaWxlIGRlZmluaXRpb25zIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBGSVhNRTogQ2FuIHNvbWVvbmUgcHJvdmlkZSBhIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGlzIG5hbWUgaW50byBBU0NJST8KLSAgIFVzaW5nIHRoZSBmb2xsb3dpbmcgY2hhcnMgY2F1c2VkIGEgY29tcGlsZXIgd2FybmluZyBvbiBISVVYIChzbyBJIHJlcGxhY2VkCi0gICB0aGVtIHdpdGggb2N0YWwgZXNjYXBlcyksIGFuZCBpc24ndCB1c2VmdWwgd2l0aG91dCBhbiB1bmRlcnN0YW5kaW5nIG9mIHdoYXQKLSAgIGNoYXJhY3RlciBzZXQgaXQgaXMuCi0gICBXcml0dGVuIGJ5IE1pbWkgUGhcMzczXDM2NG5nLVRoXDM0NW8gVlwzNjUgb2YgSUJNCi0gICBhbmQgSm9obiBHaWxtb3JlIG9mIEN5Z251cyBTdXBwb3J0LiAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSAgICAgICAgLyogSUJNIFJTLzYwMDAgKi8KLSNkZWZpbmUgVTgwMldSTUFHSUMgICAgIDA3MzAgICAgLyogd3JpdGVhYmxlIHRleHQgc2VnbWVudHMgKipjaGgqKiAgICAgICovCi0jZGVmaW5lIFU4MDJST01BR0lDICAgICAwNzM1ICAgIC8qIHJlYWRvbmx5IHNoYXJhYmxlIHRleHQgc2VnbWVudHMgICAgICAqLwotI2RlZmluZSBVODAyVE9DTUFHSUMgICAgMDczNyAgICAvKiByZWFkb25seSB0ZXh0IHNlZ21lbnRzIGFuZCBUT0MgICAgICAgKi8KLQotI2RlZmluZSBCQURNQUcoeCkJXAotCSgoeCkuZl9tYWdpYyAhPSBVODAyUk9NQUdJQyAmJiAoeCkuZl9tYWdpYyAhPSBVODAyV1JNQUdJQyAmJiBcCi0JICh4KS5mX21hZ2ljICE9IFU4MDJUT0NNQUdJQykKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICB1bnNpZ25lZCBjaGFyCW1hZ2ljWzJdOwkvKiB0eXBlIG9mIGZpbGUJCQkqLwotICB1bnNpZ25lZCBjaGFyCXZzdGFtcFsyXTsJLyogdmVyc2lvbiBzdGFtcAkJKi8KLSAgdW5zaWduZWQgY2hhcgl0c2l6ZVs0XTsJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSAqLwotICB1bnNpZ25lZCBjaGFyCWRzaXplWzRdOwkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJKi8KLSAgdW5zaWduZWQgY2hhcglic2l6ZVs0XTsJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCSovCi0gIHVuc2lnbmVkIGNoYXIJZW50cnlbNF07CS8qIGVudHJ5IHB0LgkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdGV4dF9zdGFydFs0XTsJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyCWRhdGFfc3RhcnRbNF07CS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhcglvX3RvY1s0XTsJLyogYWRkcmVzcyBvZiBUT0MgKi8KLSAgdW5zaWduZWQgY2hhcglvX3NuZW50cnlbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIGVudHJ5IHBvaW50ICovCi0gIHVuc2lnbmVkIGNoYXIJb19zbnRleHRbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIC50ZXh0IHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglvX3NuZGF0YVsyXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgLmRhdGEgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCW9fc250b2NbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIFRPQyAqLwotICB1bnNpZ25lZCBjaGFyCW9fc25sb2FkZXJbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIC5sb2FkZXIgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCW9fc25ic3NbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIC5ic3Mgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCW9fYWxnbnRleHRbMl07CS8qIC50ZXh0IGFsaWdubWVudCAqLwotICB1bnNpZ25lZCBjaGFyCW9fYWxnbmRhdGFbMl07CS8qIC5kYXRhIGFsaWdubWVudCAqLwotICB1bnNpZ25lZCBjaGFyCW9fbW9kdHlwZVsyXTsJLyogbW9kdWxlIHR5cGUgKD8/KSAqLwotICB1bnNpZ25lZCBjaGFyIG9fY3B1dHlwZVsyXTsJLyogY3B1IHR5cGUgKi8KLSAgdW5zaWduZWQgY2hhcglvX21heHN0YWNrWzRdOwkvKiBtYXggc3RhY2sgc2l6ZSAoPz8pICovCi0gIHVuc2lnbmVkIGNoYXIgb19tYXhkYXRhWzRdOwkvKiBtYXggZGF0YSBzaXplICg/PykgKi8KLSAgdW5zaWduZWQgY2hhcglvX3Jlc3YyWzEyXTsJLyogcmVzZXJ2ZWQgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDcyCi0jZGVmaW5lIFNNQUxMX0FPVVRTWiAoMjgpCi0jZGVmaW5lIEFPVVRIRFJTWiA3MgotCi0jZGVmaW5lCVJTNktfQU9VVEhEUl9PTUFHSUMJMHgwMTA3CS8qIG9sZDogdGV4dCAmIGRhdGEgd3JpdGVhYmxlICovCi0jZGVmaW5lCVJTNktfQU9VVEhEUl9OTUFHSUMJMHgwMTA4CS8qIG5ldzogdGV4dCByL28sIGRhdGEgci93ICovCi0jZGVmaW5lCVJTNktfQU9VVEhEUl9aTUFHSUMJMHgwMTBCCS8qIHBhZ2VkOiB0ZXh0IHIvbywgYm90aCBwYWdlLWFsaWduZWQgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX1BBRAkiLnBhZCIKLSNkZWZpbmUgX0xPQURFUgkiLmxvYWRlciIKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyogWENPRkYgdXNlcyBhIHNwZWNpYWwgLmxvYWRlciBzZWN0aW9uIHdpdGggdHlwZSBTVFlQX0xPQURFUi4gICovCi0jZGVmaW5lIFNUWVBfTE9BREVSIDB4MTAwMAotCi0vKiBYQ09GRiB1c2VzIGEgc3BlY2lhbCAuZGVidWcgc2VjdGlvbiB3aXRoIHR5cGUgU1RZUF9ERUJVRy4gICovCi0jZGVmaW5lIFNUWVBfREVCVUcgMHgyMDAwCi0KLS8qIFhDT0ZGIGhhbmRsZXMgbGluZSBudW1iZXIgb3IgcmVsb2NhdGlvbiBvdmVyZmxvdyBieSBjcmVhdGluZwotICAgYW5vdGhlciBzZWN0aW9uIGhlYWRlciB3aXRoIFNUWVBfT1ZSRkxPIHNldC4gICovCi0jZGVmaW5lIFNUWVBfT1ZSRkxPIDB4ODAwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0Jc3RydWN0IHsKLQkJdW5zaWduZWQgY2hhciB4X3Njbmxlbls0XTsKLQkJdW5zaWduZWQgY2hhciB4X3Bhcm1oYXNoWzRdOwotCQl1bnNpZ25lZCBjaGFyIHhfc25oYXNoWzJdOwotCQl1bnNpZ25lZCBjaGFyIHhfc210eXBbMV07Ci0JCXVuc2lnbmVkIGNoYXIgeF9zbWNsYXNbMV07Ci0JCXVuc2lnbmVkIGNoYXIgeF9zdGFiWzRdOwotCQl1bnNpZ25lZCBjaGFyIHhfc25zdGFiWzJdOwotCX0geF9jc2VjdDsKLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0jZGVmaW5lIERCWE1BU0sgMHg4MAkJLyogZm9yIGRieCBzdG9yYWdlIG1hc2sgKi8KLSNkZWZpbmUgU1lNTkFNRV9JTl9ERUJVRyhzeW1wdHIpICgoc3ltcHRyKS0+bl9zY2xhc3MgJiBEQlhNQVNLKQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfc2l6ZVsxXTsKLSAgY2hhciByX3R5cGVbMV07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEwCi0KLSNkZWZpbmUgREVGQVVMVF9EQVRBX1NFQ1RJT05fQUxJR05NRU5UIDQKLSNkZWZpbmUgREVGQVVMVF9CU1NfU0VDVElPTl9BTElHTk1FTlQgNAotI2RlZmluZSBERUZBVUxUX1RFWFRfU0VDVElPTl9BTElHTk1FTlQgNAotLyogRm9yIG5ldyBzZWN0aW9ucyB3ZSBoYXZuJ3QgaGVhcmQgb2YgYmVmb3JlICovCi0jZGVmaW5lIERFRkFVTFRfU0VDVElPTl9BTElHTk1FTlQgNApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3NoLmggYi9pbmNsdWRlL2NvZmYvc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5NTdkZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIEhpdGFjaGkgU0ggKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotCi0jZGVmaW5lCVNIX0FSQ0hfTUFHSUNfQklHCTB4MDUwMAotI2RlZmluZQlTSF9BUkNIX01BR0lDX0xJVFRMRQkweDA1NTAgIC8qIExpdHRsZSBlbmRpYW4gU0ggKi8KLQotCi0jZGVmaW5lIFNIQkFETUFHKHgpIFwKLSAoKCh4KS5mX21hZ2ljIT1TSF9BUkNIX01BR0lDX0JJRykgJiYgXAotICAoKHgpLmZfbWFnaWMhPVNIX0FSQ0hfTUFHSUNfTElUVExFKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLQotI2RlZmluZSBBT1VUSERSU1ogMjgKLSNkZWZpbmUgQU9VVFNaIDI4Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzRdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgZXh0ZXJuYWwgcmVsb2MgaGFzIGFuIG9mZnNldCBmaWVsZCwgYmVjYXVzZSBzb21lIG9mIHRoZSByZWxvYwotICAgdHlwZXMgb24gdGhlIGg4IGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHRoZSBzdHJhbmdlIGp1bXAgYW5kIGhpZ2ggcGFnZSBhZGRyZXNzaW5nIG1vZGVzICovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX29mZnNldFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9zdHVmZlsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTYKLQotLyogU0ggcmVsb2NhdGlvbiB0eXBlcy4gIE5vdCBhbGwgb2YgdGhlc2UgYXJlIGFjdHVhbGx5IHVzZWQuICAqLwotCi0jZGVmaW5lIFJfU0hfVU5VU0VECTAJCS8qIG9ubHkgdXNlZCBpbnRlcm5hbGx5ICovCi0jZGVmaW5lIFJfU0hfUENSRUw4IAkzCQkvKiAgOCBiaXQgcGNyZWwgCSovCi0jZGVmaW5lIFJfU0hfUENSRUwxNiAJNAkJLyogMTYgYml0IHBjcmVsIAkqLwotI2RlZmluZSBSX1NIX0hJR0g4ICAJNQkJLyogaGlnaCA4IGJpdHMgb2YgMjQgYml0IGFkZHJlc3MgKi8KLSNkZWZpbmUgUl9TSF9MT1cxNiAJNwkJLyogbG93IDE2IGJpdHMgb2YgMjQgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX1NIX0lNTTI0CTYJCS8qIDI0IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgUl9TSF9QQ0RJU1A4Qlk0CTkgIAkJLyogUEMgcmVsIDggYml0cyAqNCArdmUgKi8KLSNkZWZpbmUgUl9TSF9QQ0RJU1A4QlkyCTEwICAJCS8qIFBDIHJlbCA4IGJpdHMgKjIgK3ZlICovCi0jZGVmaW5lIFJfU0hfUENESVNQOCAgICAxMSAgCQkvKiA4IGJpdCBicmFuY2ggKi8KLSNkZWZpbmUgUl9TSF9QQ0RJU1AgICAgIDEyICAJCS8qIDEyIGJpdCBicmFuY2ggKi8KLSNkZWZpbmUgUl9TSF9JTU0zMiAgICAgIDE0ICAgIAkJLyogMzIgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX1NIX0lNTTggICAJMTYJCS8qIDggYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX1NIX0lNTThCWTIgICAgMTcJCS8qIDggYml0IGltbWVkaWF0ZSAqMiAqLwotI2RlZmluZSBSX1NIX0lNTThCWTQgICAgMTgJCS8qIDggYml0IGltbWVkaWF0ZSAqNCAqLwotI2RlZmluZSBSX1NIX0lNTTQgICAJMTkJCS8qIDQgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX1NIX0lNTTRCWTIgICAgMjAJCS8qIDQgYml0IGltbWVkaWF0ZSAqMiAqLwotI2RlZmluZSBSX1NIX0lNTTRCWTQgICAgMjEJCS8qIDQgYml0IGltbWVkaWF0ZSAqNCAqLwotI2RlZmluZSBSX1NIX1BDUkVMSU1NOEJZMiAgIDIyCQkvKiBQQyByZWwgOCBiaXRzICoyIHVuc2lnbmVkICovCi0jZGVmaW5lIFJfU0hfUENSRUxJTU04Qlk0ICAgMjMJCS8qIFBDIHJlbCA4IGJpdHMgKjQgdW5zaWduZWQgKi8KLSNkZWZpbmUgUl9TSF9JTU0xNiAgICAgIDI0ICAgIAkJLyogMTYgYml0IGltbWVkaWF0ZSAqLwotCi0vKiBUaGUgc3dpdGNoIHRhYmxlIHJlbG9jIHR5cGVzIGFyZSB1c2VkIGZvciByZWxheGluZy4gIFRoZXkgYXJlCi0gICBnZW5lcmF0ZWQgZm9yIGV4cHJlc3Npb25zIHN1Y2ggYXMKLSAgICAgLndvcmQgTDEgLSBMMgotICAgVGhlIHJfb2Zmc2V0IGZpZWxkIGhvbGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MKLSAgIGFuZCBMMi4gICovCi0jZGVmaW5lIFJfU0hfU1dJVENIOAkzMwkJLyogOCBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5ICovCi0jZGVmaW5lIFJfU0hfU1dJVENIMTYJMjUJCS8qIDE2IGJpdCBzd2l0Y2ggdGFibGUgZW50cnkgKi8KLSNkZWZpbmUgUl9TSF9TV0lUQ0gzMgkyNgkJLyogMzIgYml0IHN3aXRjaCB0YWJsZSBlbnRyeSAqLwotCi0vKiBUaGUgVVNFUyByZWxvYyB0eXBlIGlzIHVzZWQgZm9yIHJlbGF4aW5nLiAgVGhlIGNvbXBpbGVyIHdpbGwKLSAgIGdlbmVyYXRlIC51c2VzIHBzZXVkby1vcHMgd2hlbiBpdCBmaW5kcyBhIGZ1bmN0aW9uIGNhbGwgd2hpY2ggaXQKLSAgIGNhbiByZWxheC4gIFRoZSByX29mZnNldCBmaWVsZCBvZiB0aGUgVVNFUyByZWxvYyBob2xkcyB0aGUgUEMKLSAgIHJlbGF0aXZlIG9mZnNldCB0byB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggbG9hZHMgdGhlIHJlZ2lzdGVyIHVzZWQgaW4KLSAgIHRoZSBmdW5jdGlvbiBjYWxsLiAgKi8KLSNkZWZpbmUgUl9TSF9VU0VTCTI3CQkvKiAudXNlcyBwc2V1ZG8tb3AgKi8KLQotLyogVGhlIENPVU5UIHJlbG9jIHR5cGUgaXMgdXNlZCBmb3IgcmVsYXhpbmcuICBUaGUgYXNzZW1ibGVyIHdpbGwKLSAgIGdlbmVyYXRlIENPVU5UIHJlbG9jcyBmb3IgYWRkcmVzc2VzIHJlZmVycmVkIHRvIGJ5IHRoZSByZWdpc3RlcgotICAgbG9hZHMgYXNzb2NpYXRlZCB3aXRoIFVTRVMgcmVsb2NzLiAgVGhlIHJfb2Zmc2V0IGZpZWxkIG9mIHRoZSBDT1VOVAotICAgcmVsb2MgaG9sZHMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWRkcmVzcyBpcyByZWZlcmVuY2VkIGluIHRoZQotICAgb2JqZWN0IGZpbGUuICAqLwotI2RlZmluZSBSX1NIX0NPVU5UCTI4CQkvKiBDb3VudCBvZiBjb25zdGFudCBwb29sIHVzZXMgKi8KLQotLyogVGhlIEFMSUdOIHJlbG9jIHR5cGUgaXMgdXNlZCBmb3IgcmVsYXhpbmcuICBUaGUgcl9vZmZzZXQgZmllbGQgaXMKLSAgIHRoZSBwb3dlciBvZiB0d28gdG8gd2hpY2ggc3Vic2VxdWVudCBwb3J0aW9ucyBvZiB0aGUgb2JqZWN0IGZpbGUKLSAgIG11c3QgYmUgYWxpZ25lZC4gICovCi0jZGVmaW5lIFJfU0hfQUxJR04JMjkJCS8qIC5hbGlnbiBwc2V1ZG8tb3AgKi8KLQotLyogVGhlIENPREUgYW5kIERBVEEgcmVsb2MgdHlwZXMgYXJlIHVzZWQgZm9yIGFsaWduaW5nIGxvYWQgYW5kIHN0b3JlCi0gICBpbnN0cnVjdGlvbnMuICBUaGUgYXNzZW1ibGVyIHdpbGwgZ2VuZXJhdGUgYSBDT0RFIHJlbG9jIGJlZm9yZSBhCi0gICBibG9jayBvZiBpbnN0cnVjdGlvbnMuICBJdCB3aWxsIGdlbmVyYXRlIGEgREFUQSByZWxvYyBiZWZvcmUgZGF0YS4KLSAgIEEgc2VjdGlvbiBzaG91bGQgYmUgcHJvY2Vzc2VkIGFzc3VtaW5nIGl0IGNvbnRhaW5zIGRhdGEsIHVubGVzcyBhCi0gICBDT0RFIHJlbG9jIGlzIHNlZW4uICBUaGUgb25seSByZWxldmFudCBwaWVjZXMgb2YgaW5mb3JtYXRpb24gaW4gdGhlCi0gICBDT0RFIGFuZCBEQVRBIHJlbG9jcyBhcmUgdGhlIHNlY3Rpb24gYW5kIHRoZSBhZGRyZXNzLiAgVGhlIHN5bWJvbAotICAgYW5kIG9mZnNldCBhcmUgbWVhbmluZ2xlc3MuICAqLwotI2RlZmluZSBSX1NIX0NPREUJMzAJCS8qIHN0YXJ0IG9mIGNvZGUgKi8KLSNkZWZpbmUgUl9TSF9EQVRBCTMxCQkvKiBzdGFydCBvZiBkYXRhICovCi0KLS8qIFRoZSBMQUJFTCByZWxvYyB0eXBlIGlzIHVzZWQgZm9yIGFsaWduaW5nIGxvYWQgYW5kIHN0b3JlCi0gICBpbnN0cnVjdGlvbnMuICBUaGUgYXNzZW1ibGVyIHdpbGwgZ2VuZXJhdGUgYSBMQUJFTCByZWxvYyBmb3IgZWFjaAotICAgbGFiZWwgd2l0aGluIGEgYmxvY2sgb2YgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBwZXJtaXRzIHRoZSBsaW5rZXIgdG8KLSAgIGF2b2lkIHN3YXBwaW5nIGluc3RydWN0aW9ucyB3aGljaCBhcmUgdGhlIHRhcmdldHMgb2YgYnJhbmNoZXMuICAqLwotI2RlZmluZSBSX1NIX0xBQkVMCTMyCQkvKiBsYWJlbCAqLwotCi0vKiBOQjogUl9TSF9TV0lUQ0g4IGlzIDMzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvc3BhcmMuaCBiL2luY2x1ZGUvY29mZi9zcGFyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmEyNGYwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9zcGFyYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgU3BhcmMuICAqLwotCi0vKiBUaGlzIGZpbGUgaXMgYW4gYW1hbGdhbWF0aW9uIG9mIHNldmVyYWwgc3RhbmRhcmQgaW5jbHVkZSBmaWxlcyB0aGF0Ci0gICBkZWZpbmUgY29mZiBmb3JtYXQsIHN1Y2ggYXMgZmlsZWhkci5oLCBhb3V0aGRyLmgsIGFuZCBzbyBmb3J0aC4gIEluCi0gICBhZGRpdGlvbiwgYWxsIGRhdGF0eXBlcyBoYXZlIGJlZW4gdHJhbnNsYXRlZCBpbnRvIGNoYXJhY3RlciBhcnJheXMgb2YKLSAgIChwcmVzdW1lZCkgZXF1aXZhbGVudCBzaXplLiAgVGhpcyBpcyBuZWNlc3Nhcnkgc28gdGhhdCB0aGlzIGZpbGUgY2FuCi0gICBiZSB1c2VkIHdpdGggZGlmZmVyZW50IHN5c3RlbXMgd2hpbGUgc3RpbGwgeWllbGRpbmcgdGhlIHNhbWUgcmVzdWx0cy4gICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi17Ci0gIGNoYXIgZl9tYWdpY1syXTsJCS8qIG1hZ2ljIG51bWJlcgkJCSovCi0gIGNoYXIgZl9uc2Nuc1syXTsJCS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLSAgY2hhciBmX3RpbWRhdFs0XTsJCS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotICBjaGFyIGZfc3ltcHRyWzRdOwkJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotICBjaGFyIGZfbnN5bXNbNF07CQkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLSAgY2hhciBmX29wdGhkclsyXTsJCS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotICBjaGFyIGZfZmxhZ3NbMl07CQkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lIEZfUkVMRkxHCSgweDAwMDEpCS8qIHJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCAqLwotI2RlZmluZSBGX0VYRUMJCSgweDAwMDIpCS8qIGZpbGUgaXMgZXhlY3V0YWJsZSAqLwotI2RlZmluZSBGX0xOTk8JCSgweDAwMDQpCS8qIGxpbmUgbnVtYmVycyBzdHJpcHBlZCAqLwotI2RlZmluZSBGX0xTWU1TCQkoMHgwMDA4KQkvKiBsb2NhbCBzeW1ib2xzIHN0cmlwcGVkICovCi0KLSNkZWZpbmUgU1BBUkNNQUdJQwkoMDU0MCkKLQotLyogVGhpcyBpcyBMeW54J3MgYWxsLXBsYXRmb3JtIG1hZ2ljIG51bWJlciBmb3IgZXhlY3V0YWJsZXMuICovCi0KLSNkZWZpbmUgTFlOWENPRkZNQUdJQwkoMDQxNSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhciB2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhciB0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyIGRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyIGJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyIGVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciBkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLSNkZWZpbmUgT01BR0lDICAgICAgICAgIDA0MDQgICAgLyogb2JqZWN0IGZpbGVzLCBlZyBhcyBvdXRwdXQgKi8KLSNkZWZpbmUgWk1BR0lDICAgICAgICAgIDA0MTMgICAgLyogZGVtYW5kIGxvYWQgZm9ybWF0LCBlZyBub3JtYWwgbGQgb3V0cHV0ICovCi0jZGVmaW5lIFNUTUFHSUMJCTA0MDEJLyogdGFyZ2V0IHNobGliICovCi0jZGVmaW5lIFNITUFHSUMJCTA0NDMJLyogaG9zdCAgIHNobGliICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLXsKLSAgY2hhciBzX25hbWVbOF07CQkvKiBzZWN0aW9uIG5hbWUJCQkqLwotICBjaGFyIHNfcGFkZHJbNF07CQkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotICBjaGFyIHNfdmFkZHJbNF07CQkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0gIGNoYXIgc19zaXplWzRdOwkJLyogc2VjdGlvbiBzaXplCQkJKi8KLSAgY2hhciBzX3NjbnB0cls0XTsJCS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0gIGNoYXIgc19yZWxwdHJbNF07CQkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0gIGNoYXIgc19sbm5vcHRyWzRdOwkJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0gIGNoYXIgc19ucmVsb2NbMl07CQkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0gIGNoYXIgc19ubG5ub1syXTsJCS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLSAgY2hhciBzX2ZsYWdzWzRdOwkJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyogTmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zLiAqLwotCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfVFYJIi50diIKLSNkZWZpbmUgX0lOSVQJIi5pbml0IgotI2RlZmluZSBfRklOSQkiLmZpbmkiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLSNkZWZpbmUgX0xJQiAiLmxpYiIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICAgTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gICBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICAgc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLiAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGxfc3ltbmR4WzRdOwkJLyogZm4gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCAqLwotICAgIGNoYXIgbF9wYWRkcls0XTsJCS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlciAqLwotICB9IGxfYWRkcjsKLSAgY2hhciBsX2xubm9bMl07CQkvKiBsaW5lIG51bWJlciAqLwotfTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJKDYpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCSg4KQkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCSgxNCkJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQkoNCkJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSNpZiAwIC8qIG9mIGRvdWJ0ZnVsIHZhbHVlICovCi0gICAgY2hhciBlX25wdHJbMl1bNF07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV9sZWFkaW5nX3plcm9bMV07Ci0gICAgICBjaGFyIGVfZGJ4X3R5cGVbMV07Ci0gICAgICBjaGFyIGVfZGJ4X2Rlc2NbMl07Ci0gICAgfSBlX2RieDsKLSNlbmRpZgotICB9IGU7Ci0KLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotICBjaGFyIHBhZGRpbmdbMl07Ci19OwotCi0jZGVmaW5lIE5fQlRNQVNLCSgweGYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci17Ci0gIHN0cnVjdCB7Ci0gICAgY2hhciB4X3RhZ25keFs0XTsJCS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLSAgICB1bmlvbiB7Ci0gICAgICBzdHJ1Y3QgewotCWNoYXIgIHhfbG5ub1syXTsJLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQljaGFyICB4X3NpemVbMl07CS8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0gICAgICB9IHhfbG5zejsKLSAgICAgIGNoYXIgeF9mc2l6ZVs0XTsJCS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLSAgICB9IHhfbWlzYzsKLSAgICB1bmlvbiB7Ci0gICAgICBzdHJ1Y3QgewkJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCWNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCWNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotICAgICAgfSB4X2ZjbjsKLSAgICAgIHN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQljaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotICAgICAgfSB4X2FyeTsKLSAgICB9IHhfZmNuYXJ5OwotICAgIGNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0gIH0geF9zeW07Ci0gIAotICB1bmlvbiB7Ci0gICAgY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIHhfemVyb2VzWzRdOwotICAgICAgY2hhciB4X29mZnNldFs0XTsKLSAgICB9IHhfbjsKLSAgfSB4X2ZpbGU7Ci0gIAotICBzdHJ1Y3QgewotICAgIGNoYXIgeF9zY25sZW5bNF07CQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotICAgIGNoYXIgeF9ucmVsb2NbMl07CQkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotICAgIGNoYXIgeF9ubGlubm9bMl07CQkvKiAjIGxpbmUgbnVtYmVycyAqLwotICB9IHhfc2NuOwotICAKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfdHZmaWxsWzRdOwkJLyogdHYgZmlsbCB2YWx1ZSAqLwotICAgIGNoYXIgeF90dmxlblsyXTsJCS8qIGxlbmd0aCBvZiAudHYgKi8KLSAgICBjaGFyIHhfdHZyYW5bMl1bMl07CQkvKiB0diByYW5nZSAqLwotICB9IHhfdHY7CQkJLyogLnR2IHNlY3Rpb24gaW5mbyAoaW4gYXV4ZW50IG9mIHN5bSAudHYpKSAqLwotCi0gIGNoYXIgeF9maWxsWzIwXTsJCS8qIGZvcmNlcyB0byAyMC1ieXRlIHNpemUgKi8KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTIwCQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkyMAotCi0jZGVmaW5lIF9FVEVYVAkiZXRleHQiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfc3BhcmVbMl07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci19OwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvc3ltLmggYi9pbmNsdWRlL2NvZmYvc3ltLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MjA0YWYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3N5bS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDg0ICswLDAgQEAKLS8qIERlY2xhcmF0aW9ucyBvZiBpbnRlcm5hbCBmb3JtYXQgb2YgTUlQUyBFQ09GRiBzeW1ib2xzLgotICAgT3JpZ2luYWxseSBjb250cmlidXRlZCBieSBNSVBTIENvbXB1dGVyIFN5c3RlbXMgYW5kIFRoaXJkIEV5ZSBTb2Z0d2FyZS4KLSAgIENoYW5nZXMgY29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQgYXJlIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgCi0KLSAgIFRoaXMgZmlsZSBpcyBqdXN0IGFnZ3JlZ2F0ZWQgd2l0aCB0aGUgZmlsZXMgdGhhdCBtYWtlIHVwIHRoZSBHTlUKLSAgIHJlbGVhc2U7IGl0IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgR0FTLCBHREIsIG9yIG90aGVyIEdOVQotICAgcHJvZ3JhbXMuICAqLwotCi0vKgotICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICogfCBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTEsIDE5OTAgTUlQUyBDb21wdXRlciBTeXN0ZW1zLCBJbmMufAotICogfCBNSVBTIENvbXB1dGVyIFN5c3RlbXMsIEluYy4gZ3JhbnRzIHJlcHJvZHVjdGlvbiBhbmQgdXNlICAgfAotICogfCByaWdodHMgdG8gYWxsIHBhcnRpZXMsIFBST1ZJREVEIHRoYXQgdGhpcyBjb21tZW50IGlzICAgICAgfAotICogfCBtYWludGFpbmVkIGluIHRoZSBjb3B5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICovCi0jaWZuZGVmIF9TWU1fSAotI2RlZmluZSBfU1lNX0gKLQotLyogKEMpIENvcHlyaWdodCAxOTg0IGJ5IFRoaXJkIEV5ZSBTb2Z0d2FyZSwgSW5jLgotICoKLSAqIFRoaXJkIEV5ZSBTb2Z0d2FyZSwgSW5jLiBncmFudHMgcmVwcm9kdWN0aW9uIGFuZCB1c2UgcmlnaHRzIHRvCi0gKiBhbGwgcGFydGllcywgUFJPVklERUQgdGhhdCB0aGlzIGNvbW1lbnQgaXMgbWFpbnRhaW5lZCBpbiB0aGUgY29weS4KLSAqCi0gKiBUaGlyZCBFeWUgbWFrZXMgbm8gY2xhaW1zIGFib3V0IHRoZSBhcHBsaWNhYmlsaXR5IG9mIHRoaXMKLSAqIHN5bWJvbCB0YWJsZSB0byBhIHBhcnRpY3VsYXIgdXNlLgotICovCi0KLS8qIAotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBUaGlyZCBFeWUgU3ltYm9sIFRhYmxlLgotICoKLSAqIFN5bWJvbHMgYXJlIGFzc3VtZWQgdG8gYmUgaW4gJ2VuY291bnRlciBvcmRlcicgLSBpLmUuIHRoZSBvcmRlciB0aGF0Ci0gKiB0aGUgdGhpbmdzIHRoZXkgcmVwcmVzZW50IHdlcmUgZW5jb3VudGVyZWQgYnkgdGhlIGNvbXBpbGVyL2Fzc2VtYmxlci9sb2FkZXIuCi0gKiBFWENFUFQgZm9yIGdsb2JhbHMhCVRoZXNlIGFyZSBhc3N1bWVkIHRvIGJlIGJ1bmNoZWQgdG9nZXRoZXIsCi0gKiBwcm9iYWJseSByaWdodCBhZnRlciB0aGUgbGFzdCAnbm9ybWFsJyBzeW1ib2wuICBHbG9iYWxzIEFSRSBzb3J0ZWQKLSAqIGluIGFzY2VuZGluZyBvcmRlci4KLSAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQSBicmllZiB3b3JkIGFib3V0IFRoaXJkIEV5ZSBuYW1pbmcvdXNlIGNvbnZlbnRpb25zOgotICoKLSAqIEFsbCBhcnJheXMgYW5kIGluZGV4J3MgYXJlIDAgYmFzZWQuCi0gKiBBbGwgImlmb29NYXgiIHZhbHVlcyBhcmUgdGhlIGhpZ2hlc3QgbGVnYWwgdmFsdWUgUExVUyBPTkUuIFRoaXMgbWFrZXMKLSAqIHRoZW0gZ29vZCBmb3IgYWxsb2NhdGluZyBhcnJheXMsIGV0Yy4gQWxsIGNoZWNrcyBhcmUgImlmb28gPCBpZm9vTWF4Ii4KLSAqCi0gKiAiaXN5bSIJSW5kZXggaW50byB0aGUgU1lNYm9sIHRhYmxlLgotICogImlwZCIJSW5kZXggaW50byB0aGUgUHJvY2VkdXJlIERlc2NyaXB0b3IgYXJyYXkuCi0gKiAiaWZkIglJbmRleCBpbnRvIHRoZSBGaWxlIERlc2NyaXB0b3IgYXJyYXkuCi0gKiAiaXNzIglJbmRleCBpbnRvIFN0cmluZyBTcGFjZS4KLSAqICJjYiIJCUNvdW50IG9mIEJ5dGVzLgotICogInJnUGQiCWFycmF5IHdob3NlIGRvbWFpbiBpcyAiMC4uaXBkTWF4LTEiIGFuZCBSYW5HZSBpcyBQRFIuCi0gKiAicmdGZCIJYXJyYXkgd2hvc2UgZG9tYWluIGlzICIwLi5pZmRNYXgtMSIgYW5kIFJhbkdlIGlzIEZEUi4KLSAqLwotCi0KLS8qIAotICogU3ltYm9saWMgSGVhZGVyIChIRFIpIHN0cnVjdHVyZS4KLSAqIEFzIGxvbmcgYXMgYWxsIHRoZSBwb2ludGVycyBhcmUgc2V0IGNvcnJlY3RseSwKLSAqIHdlIGRvbid0IGNhcmUgV0hBVCBvcmRlciB0aGUgdmFyaW91cyBzZWN0aW9ucyBjb21lIG91dCBpbiEKLSAqCi0gKiBBIGZpbGUgcHJvZHVjZWQgc29sZWx5IGZvciB0aGUgdXNlIG9mIENEQiB3aWxsIHByb2JhYmx5IE5PVCBoYXZlCi0gKiBhbnkgaW5zdHJ1Y3Rpb25zIG9yIGRhdGEgYXJlYXMgaW4gaXQsIGFzIHRoZXNlIGFyZSBhdmFpbGFibGUKLSAqIGluIHRoZSBvcmlnaW5hbC4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0Jc2hvcnQJbWFnaWM7CQkvKiB0byB2ZXJpZnkgdmFsaWRpdHkgb2YgdGhlIHRhYmxlICovCi0Jc2hvcnQJdnN0YW1wOwkJLyogdmVyc2lvbiBzdGFtcCAqLwotCWxvbmcJaWxpbmVNYXg7CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzICovCi0JYmZkX3ZtYQljYkxpbmU7CQkvKiBudW1iZXIgb2YgYnl0ZXMgZm9yIGxpbmUgbnVtYmVyIGVudHJpZXMgKi8KLQliZmRfdm1hCWNiTGluZU9mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWxvbmcJaWRuTWF4OwkJLyogbWF4IGluZGV4IGludG8gZGVuc2UgbnVtYmVyIHRhYmxlICovCi0JYmZkX3ZtYQljYkRuT2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgZGVuc2UgbnVtYmVyIHRhYmxlICovCi0JbG9uZwlpcGRNYXg7CQkvKiBudW1iZXIgb2YgcHJvY2VkdXJlcyAqLwotCWJmZF92bWEJY2JQZE9mZnNldDsJLyogb2Zmc2V0IHRvIHByb2NlZHVyZSBkZXNjcmlwdG9yIHRhYmxlICovCi0JbG9uZwlpc3ltTWF4OwkvKiBudW1iZXIgb2YgbG9jYWwgc3ltYm9scyAqLwotCWJmZF92bWEJY2JTeW1PZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBvZiBsb2NhbCBzeW1ib2xzKi8KLQlsb25nCWlvcHRNYXg7CS8qIG1heCBpbmRleCBpbnRvIG9wdGltaXphdGlvbiBzeW1ib2wgZW50cmllcyAqLwotCWJmZF92bWEJY2JPcHRPZmZzZXQ7CS8qIG9mZnNldCB0byBvcHRpbWl6YXRpb24gc3ltYm9sIGVudHJpZXMgKi8KLQlsb25nCWlhdXhNYXg7CS8qIG51bWJlciBvZiBhdXhpbGxhcnkgc3ltYm9sIGVudHJpZXMgKi8KLQliZmRfdm1hCWNiQXV4T2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgYXV4aWxsYXJ5IHN5bWJvbCBlbnRyaWVzKi8KLQlsb25nCWlzc01heDsJCS8qIG1heCBpbmRleCBpbnRvIGxvY2FsIHN0cmluZ3MgKi8KLQliZmRfdm1hCWNiU3NPZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBvZiBsb2NhbCBzdHJpbmdzICovCi0JbG9uZwlpc3NFeHRNYXg7CS8qIG1heCBpbmRleCBpbnRvIGV4dGVybmFsIHN0cmluZ3MgKi8KLQliZmRfdm1hCWNiU3NFeHRPZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBvZiBleHRlcm5hbCBzdHJpbmdzICovCi0JbG9uZwlpZmRNYXg7CQkvKiBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9yIGVudHJpZXMgKi8KLQliZmRfdm1hCWNiRmRPZmZzZXQ7CS8qIG9mZnNldCB0byBmaWxlIGRlc2NyaXB0b3IgdGFibGUgKi8KLQlsb25nCWNyZmQ7CQkvKiBudW1iZXIgb2YgcmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yIGVudHJpZXMgKi8KLQliZmRfdm1hCWNiUmZkT2Zmc2V0OwkvKiBvZmZzZXQgdG8gcmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlICovCi0JbG9uZwlpZXh0TWF4OwkvKiBtYXggaW5kZXggaW50byBleHRlcm5hbCBzeW1ib2xzICovCi0JYmZkX3ZtYQljYkV4dE9mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGV4dGVybmFsIHN5bWJvbCBlbnRyaWVzKi8KLQkvKiBJZiB5b3UgYWRkIG1hY2hpbmUgZGVwZW5kZW50IGZpZWxkcywgYWRkIHRoZW0gaGVyZSAqLwotCX0gSERSUiwgKnBIRFJSOyAKLSNkZWZpbmUgY2JIRFJSIHNpemVvZihIRFJSKQotI2RlZmluZSBoZHJOaWwgKChwSERSUikwKQotCi0vKgotICogVGhlIEZEUiBhbmQgUERSIHN0cnVjdHVyZXMgc3BlZWQgbWFwcGluZyBvZiBhZGRyZXNzIDwtPiBuYW1lLgotICogVGhleSBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBtZW1vcnkgb3JkZXIgYW5kIGFyZSBrZXB0IGluCi0gKiBtZW1vcnkgYnkgQ0RCIGF0IHJ1bnRpbWUuCi0gKi8KLQotLyogCi0gKiBGaWxlIERlc2NyaXB0b3IKLSAqCi0gKiBUaGVyZSBpcyBvbmUgb2YgdGhlc2UgZm9yIEVWRVJZIEZJTEUsIHdoZXRoZXIgY29tcGlsZWQgd2l0aAotICogZnVsbCBkZWJ1Z2dpbmcgc3ltYm9scyBvciBub3QuICBUaGUgbmFtZSBvZiBhIGZpbGUgc2hvdWxkIGJlCi0gKiB0aGUgcGF0aCBuYW1lIGdpdmVuIHRvIHRoZSBjb21waWxlci4JIFRoaXMgYWxsb3dzIHRoZSB1c2VyCi0gKiB0byBzaW1wbHkgc3BlY2lmeSB0aGUgbmFtZXMgb2YgdGhlIGRpcmVjdG9yaWVzIHdoZXJlIHRoZSBDT01QSUxFUwotICogd2VyZSBkb25lLCBhbmQgd2Ugd2lsbCBiZSBhYmxlIHRvIGZpbmQgdGhlaXIgZmlsZXMuCi0gKiBBIGZpZWxkIHdob3NlIGNvbW1lbnQgc3RhcnRzIHdpdGggIlIgLSAiIGluZGljYXRlcyB0aGF0IGl0IHdpbGwgYmUKLSAqIHNldHVwIGF0IHJ1bnRpbWUuCi0gKi8KLXR5cGVkZWYgc3RydWN0IGZkciB7Ci0JYmZkX3ZtYQlhZHI7CQkvKiBtZW1vcnkgYWRkcmVzcyBvZiBiZWdpbm5pbmcgb2YgZmlsZSAqLwotCWxvbmcJcnNzOwkJLyogZmlsZSBuYW1lIChvZiBzb3VyY2UsIGlmIGtub3duKSAqLwotCWxvbmcJaXNzQmFzZTsJLyogZmlsZSdzIHN0cmluZyBzcGFjZSAqLwotCWJmZF92bWEJY2JTczsJCS8qIG51bWJlciBvZiBieXRlcyBpbiB0aGUgc3MgKi8KLQlsb25nCWlzeW1CYXNlOwkvKiBiZWdpbm5pbmcgb2Ygc3ltYm9scyAqLwotCWxvbmcJY3N5bTsJCS8qIGNvdW50IGZpbGUncyBvZiBzeW1ib2xzICovCi0JbG9uZwlpbGluZUJhc2U7CS8qIGZpbGUncyBsaW5lIHN5bWJvbHMgKi8KLQlsb25nCWNsaW5lOwkJLyogY291bnQgb2YgZmlsZSdzIGxpbmUgc3ltYm9scyAqLwotCWxvbmcJaW9wdEJhc2U7CS8qIGZpbGUncyBvcHRpbWl6YXRpb24gZW50cmllcyAqLwotCWxvbmcJY29wdDsJCS8qIGNvdW50IG9mIGZpbGUncyBvcHRpbWl6YXRpb24gZW50cmllcyAqLwotCXVuc2lnbmVkIHNob3J0IGlwZEZpcnN0Oy8qIHN0YXJ0IG9mIHByb2NlZHVyZXMgZm9yIHRoaXMgZmlsZSAqLwotCXNob3J0CWNwZDsJCS8qIGNvdW50IG9mIHByb2NlZHVyZXMgZm9yIHRoaXMgZmlsZSAqLwotCWxvbmcJaWF1eEJhc2U7CS8qIGZpbGUncyBhdXhpbGlhcnkgZW50cmllcyAqLwotCWxvbmcJY2F1eDsJCS8qIGNvdW50IG9mIGZpbGUncyBhdXhpbGlhcnkgZW50cmllcyAqLwotCWxvbmcJcmZkQmFzZTsJLyogaW5kZXggaW50byB0aGUgZmlsZSBpbmRpcmVjdCB0YWJsZSAqLwotCWxvbmcJY3JmZDsJCS8qIGNvdW50IGZpbGUgaW5kaXJlY3QgZW50cmllcyAqLwotCXVuc2lnbmVkIGxhbmc6IDU7CS8qIGxhbmd1YWdlIGZvciB0aGlzIGZpbGUgKi8KLQl1bnNpZ25lZCBmTWVyZ2UgOiAxOwkvKiB3aGV0aGVyIHRoaXMgZmlsZSBjYW4gYmUgbWVyZ2VkICovCi0JdW5zaWduZWQgZlJlYWRpbiA6IDE7CS8qIHRydWUgaWYgaXQgd2FzIHJlYWQgaW4gKG5vdCBqdXN0IGNyZWF0ZWQpICovCi0JdW5zaWduZWQgZkJpZ2VuZGlhbiA6IDE7LyogaWYgc2V0LCB3YXMgY29tcGlsZWQgb24gYmlnIGVuZGlhbiBtYWNoaW5lICovCi0JCQkJLyoJYXV4J3Mgd2lsbCBiZSBpbiBjb21waWxlIGhvc3QncyBzZXggKi8KLQl1bnNpZ25lZCBnbGV2ZWwgOiAyOwkvKiBsZXZlbCB0aGlzIGZpbGUgd2FzIGNvbXBpbGVkIHdpdGggKi8KLQl1bnNpZ25lZCByZXNlcnZlZCA6IDIyOyAgLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLQliZmRfdm1hCWNiTGluZU9mZnNldDsJLyogYnl0ZSBvZmZzZXQgZnJvbSBoZWFkZXIgZm9yIHRoaXMgZmlsZSBsbidzICovCi0JYmZkX3ZtYQljYkxpbmU7CQkvKiBzaXplIG9mIGxpbmVzIGZvciB0aGlzIGZpbGUgKi8KLQl9IEZEUiwgKnBGRFI7Ci0jZGVmaW5lIGNiRkRSIHNpemVvZihGRFIpCi0jZGVmaW5lIGZkTmlsICgocEZEUikwKQotI2RlZmluZSBpZmROaWwgLTEKLSNkZWZpbmUgaWZkVGVtcCAwCi0jZGVmaW5lIGlsbk5pbCAtMQotCi0KLS8qIAotICogUHJvY2VkdXJlIERlc2NyaXB0b3IKLSAqCi0gKiBUaGVyZSBpcyBvbmUgb2YgdGhlc2UgZm9yIEVWRVJZIFRFWFQgTEFCRUwuCi0gKiBJZiBhIHByb2NlZHVyZSBpcyBpbiBhIGZpbGUgd2l0aCBmdWxsIHN5bWJvbHMsIHRoZW4gaXN5bQotICogd2lsbCBwb2ludCB0byB0aGUgUFJPQyBzeW1ib2xzLCBlbHNlIGl0IHdpbGwgcG9pbnQgdG8gdGhlCi0gKiBnbG9iYWwgc3ltYm9sIGZvciB0aGUgbGFiZWwuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgcGRyIHsKLQliZmRfdm1hCWFkcjsJCS8qIG1lbW9yeSBhZGRyZXNzIG9mIHN0YXJ0IG9mIHByb2NlZHVyZSAqLwotCWxvbmcJaXN5bTsJCS8qIHN0YXJ0IG9mIGxvY2FsIHN5bWJvbCBlbnRyaWVzICovCi0JbG9uZwlpbGluZTsJCS8qIHN0YXJ0IG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWxvbmcJcmVnbWFzazsJLyogc2F2ZSByZWdpc3RlciBtYXNrICovCi0JbG9uZwlyZWdvZmZzZXQ7CS8qIHNhdmUgcmVnaXN0ZXIgb2Zmc2V0ICovCi0JbG9uZwlpb3B0OwkJLyogc3RhcnQgb2Ygb3B0aW1pemF0aW9uIHN5bWJvbCBlbnRyaWVzKi8KLQlsb25nCWZyZWdtYXNrOwkvKiBzYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG1hc2sgKi8KLQlsb25nCWZyZWdvZmZzZXQ7CS8qIHNhdmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgb2Zmc2V0ICovCi0JbG9uZwlmcmFtZW9mZnNldDsJLyogZnJhbWUgc2l6ZSAqLwotCXNob3J0CWZyYW1lcmVnOwkvKiBmcmFtZSBwb2ludGVyIHJlZ2lzdGVyICovCi0Jc2hvcnQJcGNyZWc7CQkvKiBvZmZzZXQgb3IgcmVnIG9mIHJldHVybiBwYyAqLwotCWxvbmcJbG5Mb3c7CQkvKiBsb3dlc3QgbGluZSBpbiB0aGUgcHJvY2VkdXJlICovCi0JbG9uZwlsbkhpZ2g7CQkvKiBoaWdoZXN0IGxpbmUgaW4gdGhlIHByb2NlZHVyZSAqLwotCWJmZF92bWEJY2JMaW5lT2Zmc2V0OwkvKiBieXRlIG9mZnNldCBmb3IgdGhpcyBwcm9jZWR1cmUgZnJvbSB0aGUgZmQgYmFzZSAqLwotCS8qIFRoZXNlIGZpZWxkcyBhcmUgbmV3IGZvciA2NCBiaXQgRUNPRkYuICAqLwotCXVuc2lnbmVkIGdwX3Byb2xvZ3VlIDogODsgLyogYnl0ZSBzaXplIG9mIEdQIHByb2xvZ3VlICovCi0JdW5zaWduZWQgZ3BfdXNlZCA6IDE7CS8qIHRydWUgaWYgdGhlIHByb2NlZHVyZSB1c2VzIEdQICovCi0JdW5zaWduZWQgcmVnX2ZyYW1lIDogMTsJLyogdHJ1ZSBpZiByZWdpc3RlciBmcmFtZSBwcm9jZWR1cmUgKi8KLQl1bnNpZ25lZCBwcm9mIDogMTsJLyogdHJ1ZSBpZiBjb21waWxlZCB3aXRoIC1wZyAqLwotCXVuc2lnbmVkIHJlc2VydmVkIDogMTM7CS8qIHJlc2VydmVkOiBtdXN0IGJlIHplcm8gKi8KLQl1bnNpZ25lZCBsb2NhbG9mZiA6IDg7CS8qIG9mZnNldCBvZiBsb2NhbCB2YXJpYWJsZXMgZnJvbSB2ZnAgKi8KLQl9IFBEUiwgKnBQRFI7Ci0jZGVmaW5lIGNiUERSIHNpemVvZihQRFIpCi0jZGVmaW5lIHBkTmlsICgocFBEUikgMCkKLSNkZWZpbmUgaXBkTmlsCS0xCi0KLS8qCi0gKiBUaGUgc3RydWN0dXJlIG9mIHRoZSBydW50aW1lIHByb2NlZHVyZSBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkgdGhlIGxvYWRlcgotICogZm9yIHVzZSBieSB0aGUgc3RhdGljIGV4Y2VwdGlvbiBzeXN0ZW0uCi0gKi8KLS8qCi0gKiBJZiAwJ2Qgb3V0IGJlY2F1c2UgZXhjZXB0aW9uX2luZm8gY2hva2VzIFZpc3VhbCBDKysgYW5kIGJlY2F1c2UgdGhlcmUKLSAqIGRvbid0IHNlZW0gdG8gYmUgYW55IHJlZmVyZW5jZXMgdG8gdGhpcyBzdHJ1Y3R1cmUgZWxzZXdoZXJlIGluIGdkYi4KLSAqLwotI2lmIDAKLXR5cGVkZWYgc3RydWN0IHJ1bnRpbWVfcGRyIHsKLQliZmRfdm1hCWFkcjsJCS8qIG1lbW9yeSBhZGRyZXNzIG9mIHN0YXJ0IG9mIHByb2NlZHVyZSAqLwotCWxvbmcJcmVnbWFzazsJLyogc2F2ZSByZWdpc3RlciBtYXNrICovCi0JbG9uZwlyZWdvZmZzZXQ7CS8qIHNhdmUgcmVnaXN0ZXIgb2Zmc2V0ICovCi0JbG9uZwlmcmVnbWFzazsJLyogc2F2ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBtYXNrICovCi0JbG9uZwlmcmVnb2Zmc2V0OwkvKiBzYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG9mZnNldCAqLwotCWxvbmcJZnJhbWVvZmZzZXQ7CS8qIGZyYW1lIHNpemUgKi8KLQlzaG9ydAlmcmFtZXJlZzsJLyogZnJhbWUgcG9pbnRlciByZWdpc3RlciAqLwotCXNob3J0CXBjcmVnOwkJLyogb2Zmc2V0IG9yIHJlZyBvZiByZXR1cm4gcGMgKi8KLQlsb25nCWlycHNzOwkJLyogaW5kZXggaW50byB0aGUgcnVudGltZSBzdHJpbmcgdGFibGUgKi8KLQlsb25nCXJlc2VydmVkOwotCXN0cnVjdCBleGNlcHRpb25faW5mbyAqZXhjZXB0aW9uX2luZm87LyogcG9pbnRlciB0byBleGNlcHRpb24gYXJyYXkgKi8KLX0gUlBEUiwgKnBSUERSOwotI2RlZmluZSBjYlJQRFIgc2l6ZW9mKFJQRFIpCi0jZGVmaW5lIHJwZE5pbCAoKHBSUERSKSAwKQotI2VuZGlmCi0KLS8qCi0gKiBMaW5lIE51bWJlcnMKLSAqCi0gKiBMaW5lIE51bWJlcnMgYXJlIHNlZ3JlZ2F0ZWQgZnJvbSB0aGUgbm9ybWFsIHN5bWJvbHMgYmVjYXVzZSB0aGV5Ci0gKiBhcmUgWzFdIHNtYWxsZXIgLCBbMl0gYXJlIG9mIG5vIGludGVyZXN0IHRvIHlvdXIKLSAqIGF2ZXJhZ2UgbG9hZGVyLCBhbmQgWzNdIGFyZSBuZXZlciBuZWVkZWQgaW4gdGhlIG1pZGRsZSBvZiBub3JtYWwKLSAqIHNjYW5uaW5nIGFuZCB0aGVyZWZvcmUgc2xvdyB0aGluZ3MgZG93bi4KLSAqCi0gKiBCeSBkZWZpbml0aW9uLCB0aGUgZmlyc3QgTElORVIgZm9yIGFueSBnaXZlbiBwcm9jZWR1cmUgd2lsbCBoYXZlCi0gKiB0aGUgZmlyc3QgbGluZSBvZiBhIHByb2NlZHVyZSBhbmQgcmVwcmVzZW50IHRoZSBmaXJzdCBhZGRyZXNzLgotICovCi0KLXR5cGVkZWYJbG9uZyBMSU5FUiwgKnBMSU5FUjsKLSNkZWZpbmUgbGluZU5pbCAoKHBMSU5FUikwKQotI2RlZmluZSBjYkxJTkVSIHNpemVvZihMSU5FUikKLSNkZWZpbmUgaWxpbmVOaWwJLTEKLQotCi0KLS8qCi0gKiBUaGUgU3ltYm9sIFN0cnVjdHVyZQkJKEdGVywgdG8gdGhvc2Ugd2hvIEtub3chKQotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlsb25nCWlzczsJCS8qIGluZGV4IGludG8gU3RyaW5nIFNwYWNlIG9mIG5hbWUgKi8KLQliZmRfdm1hCXZhbHVlOwkJLyogdmFsdWUgb2Ygc3ltYm9sICovCi0JdW5zaWduZWQgc3QgOiA2OwkvKiBzeW1ib2wgdHlwZSAqLwotCXVuc2lnbmVkIHNjICA6IDU7CS8qIHN0b3JhZ2UgY2xhc3MgLSB0ZXh0LCBkYXRhLCBldGMgKi8KLQl1bnNpZ25lZCByZXNlcnZlZCA6IDE7CS8qIHJlc2VydmVkICovCi0JdW5zaWduZWQgaW5kZXggOiAyMDsJLyogaW5kZXggaW50byBzeW0vYXV4IHRhYmxlICovCi0JfSBTWU1SLCAqcFNZTVI7Ci0jZGVmaW5lIHN5bU5pbCAoKHBTWU1SKTApCi0jZGVmaW5lIGNiU1lNUiBzaXplb2YoU1lNUikKLSNkZWZpbmUgaXN5bU5pbCAtMQotI2RlZmluZSBpbmRleE5pbCAweGZmZmZmCi0jZGVmaW5lIGlzc05pbCAtMQotI2RlZmluZSBpc3NOdWxsIDAKLQotCi0vKiBUaGUgZm9sbG93aW5nIGNvbnZlcnRzIGEgbWVtb3J5IHJlc2lkZW50IHN0cmluZyB0byBhbiBpc3MuCi0gKiBUaGlzIGhhY2sgaXMgcmVjb2duaXplZCBpbiBTYkZJc3MsIGluIHN5bS5jIG9mIHRoZSBkZWJ1Z2dlci4KLSAqLwotI2RlZmluZSBJc3NGU2Ioc2IpICgweDgwMDAwMDAwIHwgKCh1bnNpZ25lZCBsb25nKShzYikpKQotCi0vKiBFIFggVCBFIFIgTiBBIEwgICBTIFkgTSBCIE8gTCAgUiBFIEMgTyBSIEQKLSAqCi0gKglTYW1lIGFzIHRoZSBTWU1SIGV4Y2VwdCBpdCBjb250YWlucyBmaWxlIGNvbnRleHQgdG8gZGV0ZXJtaW5lIHdoZXJlCi0gKgl0aGUgaW5kZXggaXMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IGVjb2ZmX2V4dHIgewotCXVuc2lnbmVkIGptcHRibDoxOwkvKiBzeW1ib2wgaXMgYSBqdW1wIHRhYmxlIGVudHJ5IGZvciBzaGxpYnMgKi8KLQl1bnNpZ25lZCBjb2JvbF9tYWluOjE7CS8qIHN5bWJvbCBpcyBhIGNvYm9sIG1haW4gcHJvY2VkdXJlICovCi0JdW5zaWduZWQgd2Vha2V4dDoxOwkvKiBzeW1ib2wgaXMgd2VhayBleHRlcm5hbCAqLwotCXVuc2lnbmVkIHJlc2VydmVkOjEzOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLwotCWludAlpZmQ7CQkvKiB3aGVyZSB0aGUgaXNzIGFuZCBpbmRleCBmaWVsZHMgcG9pbnQgaW50byAqLwotCVNZTVIJYXN5bTsJCS8qIHN5bWJvbCBmb3IgdGhlIGV4dGVybmFsICovCi0JfSBFWFRSLCAqcEVYVFI7Ci0jZGVmaW5lIGV4dE5pbCAoKHBFWFRSKTApCi0jZGVmaW5lIGNiRVhUUiBzaXplb2YoRVhUUikKLQotCi0vKiBBIFUgWCBJIEwgTCBBIFIgWSAgIFQgWSBQIEUJIEkgTiBGIE8gUiBNIEEgVCBJIE8gTiAqLwotCi0vKgotICogVHlwZSBJbmZvcm1hdGlvbiBSZWNvcmQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGZCaXRmaWVsZCA6IDE7IC8qIHNldCBpZiBiaXQgd2lkdGggaXMgc3BlY2lmaWVkICovCi0JdW5zaWduZWQgY29udGludWVkIDogMTsgLyogaW5kaWNhdGVzIGFkZGl0aW9uYWwgVFEgaW5mbyBpbiBuZXh0IEFVWCAqLwotCXVuc2lnbmVkIGJ0ICA6IDY7CS8qIGJhc2ljIHR5cGUgKi8KLQl1bnNpZ25lZCB0cTQgOiA0OwotCXVuc2lnbmVkIHRxNSA6IDQ7Ci0JLyogLS0tLSAxNiBiaXQgYm91bmRhcnkgLS0tLSAqLwotCXVuc2lnbmVkIHRxMCA6IDQ7Ci0JdW5zaWduZWQgdHExIDogNDsJLyogNiB0eXBlIHF1YWxpZmllcnMgLSB0cVB0ciwgZXRjLiAqLwotCXVuc2lnbmVkIHRxMiA6IDQ7Ci0JdW5zaWduZWQgdHEzIDogNDsKLQl9IFRJUiwgKnBUSVI7Ci0jZGVmaW5lIGNiVElSIHNpemVvZihUSVIpCi0jZGVmaW5lIHRpTmlsICgocFRJUikwKQotI2RlZmluZSBpdHFNYXggNgotCi0vKgotICogUmVsYXRpdmUgc3ltYm9sIHJlY29yZAotICoKLSAqIElmIHRoZSByZmQgZmllbGQgaXMgNDA5NSwgdGhlIGluZGV4IGZpZWxkIGluZGV4ZXMgaW50byB0aGUgZ2xvYmFsIHN5bWJvbAotICoJdGFibGUuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkCXJmZCA6IDEyOyAgICAvKiBpbmRleCBpbnRvIHRoZSBmaWxlIGluZGlyZWN0IHRhYmxlICovCi0JdW5zaWduZWQJaW5kZXggOiAyMDsgLyogaW5kZXggaW50IHN5bS9hdXgvaXNzIHRhYmxlcyAqLwotCX0gUk5EWFIsICpwUk5EWFI7Ci0jZGVmaW5lIGNiUk5EWFIgc2l6ZW9mKFJORFhSKQotI2RlZmluZSBybmR4TmlsICgocFJORFhSKTApCi0KLS8qIGRlbnNlIG51bWJlcnMgb3Igc29tZXRpbWVzIGNhbGxlZCBibG9jayBudW1iZXJzIGFyZSBzdG9yZWQgaW4gdGhpcyB0eXBlLAotICoJYSByZmQgb2YgMHhmZmZmZmZmZiBpcyBhbiBpbmRleCBpbnRvIHRoZSBnbG9iYWwgdGFibGUuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nCXJmZDsgICAgLyogaW5kZXggaW50byB0aGUgZmlsZSB0YWJsZSAqLwotCXVuc2lnbmVkIGxvbmcJaW5kZXg7IAkvKiBpbmRleCBpbnQgc3ltL2F1eC9pc3MgdGFibGVzICovCi0JfSBETlIsICpwRE5SOwotI2RlZmluZSBjYkROUiBzaXplb2YoRE5SKQotI2RlZmluZSBkbk5pbCAoKHBETlIpMCkKLQotCi0KLS8qCi0gKiBBdXhpbGxhcnkgaW5mb3JtYXRpb24gb2NjdXJzIG9ubHkgaWYgbmVlZGVkLgotICogSXQgQUxXQVlTIG9jY3VycyBpbiB0aGlzIG9yZGVyIHdoZW4gcHJlc2VudC4KLQotCSAgICBpc3ltTWFjCQl1c2VkIGJ5IHN0UHJvYyBvbmx5Ci0JICAgIFRJUgkJCXR5cGUgaW5mbwotCSAgICBUSVIJCQlhZGRpdGlvbmFsIFRRIGluZm8gKGlmIGZpcnN0IFRJUiB3YXMgbm90IGVub3VnaCkKLQkgICAgcm5keAkJaWYgKGJ0ID09IGJ0U3RydWN0LGJ0VW5pb24sYnRFbnVtLGJ0U2V0LGJ0UmFuZ2UsCi0JCQkJICAgIGJ0VHlwZWRlZik6Ci0JCQkJICAgIHJzeW0uaW5kZXggPT0gaWF1eCBmb3IgYnRTZXQgb3IgYnRSYW5nZQotCQkJCSAgICBlbHNlIHJzeW0uaW5kZXggPT0gaXN5bQotCSAgICBkaW1Mb3cJCWJ0UmFuZ2UsIGJ0U2V0Ci0JICAgIGRpbU1hYwkJYnRSYW5nZSwgYnRTZXQKLQkgICAgcm5keDAJCUFzIG1hbnkgYXMgdGhlcmUgYXJlIHRxIGFycmF5cwotCSAgICBkaW1Mb3cwCi0JICAgIGRpbUhpZ2gwCi0JICAgIC4uLgotCSAgICBybmR4TWF4LTEKLQkgICAgZGltTG93TWF4LTEKLQkgICAgZGltSGlnaE1heC0xCi0JICAgIHdpZHRoIGluIGJpdHMJaWYgKGJpdCBmaWVsZCksIHdpZHRoIGluIGJpdHMuCi0gKi8KLSNkZWZpbmUgY0F1eE1heCAoNiArIChpZGltTWF4KjMpKQotCi0vKiBhIHVuaW9uIG9mIGFsbCBwb3NzaWJsZSBpbmZvIGluIHRoZSBBVVggdW5pdmVyc2UgKi8KLXR5cGVkZWYgdW5pb24gewotCVRJUgl0aTsJCS8qIHR5cGUgaW5mb3JtYXRpb24gcmVjb3JkICovCi0JUk5EWFIJcm5keDsJCS8qIHJlbGF0aXZlIGluZGV4IGludG8gc3ltYm9sIHRhYmxlICovCi0JbG9uZwlkbkxvdzsJCS8qIGxvdyBkaW1lbnNpb24gKi8KLQlsb25nCWRuSGlnaDsJCS8qIGhpZ2ggZGltZW5zaW9uICovCi0JbG9uZwlpc3ltOwkJLyogc3ltYm9sIHRhYmxlIGluZGV4IChlbmQgb2YgcHJvYykgKi8KLQlsb25nCWlzczsJCS8qIGluZGV4IGludG8gc3RyaW5nIHNwYWNlIChub3QgdXNlZCkgKi8KLQlsb25nCXdpZHRoOwkJLyogd2lkdGggZm9yIG5vbi1kZWZhdWx0IHNpemVkIHN0cnVjIGZpZWxkcyAqLwotCWxvbmcJY291bnQ7CQkvKiBjb3VudCBvZiByYW5nZXMgZm9yIHZhcmlhbnQgYXJtICovCi0JfSBBVVhVLCAqcEFVWFU7Ci0jZGVmaW5lIGNiQVVYVSBzaXplb2YoQVVYVSkKLSNkZWZpbmUgYXV4TmlsICgocEFVWFUpMCkKLSNkZWZpbmUgaWF1eE5pbCAtMQotCi0KLS8qCi0gKiBPcHRpbWl6YXRpb24gc3ltYm9scwotICoKLSAqIE9wdGltaXphdGlvbiBzeW1ib2xzIGNvbnRhaW4gc29tZSBvdmVybGFwIGluZm9ybWF0aW9uIHdpdGggdGhlIG5vcm1hbAotICogc3ltYm9sIHRhYmxlLiBJbiBwYXJ0aWN1bGFyLCB0aGUgcHJvYyBpbmZvcm1hdGlvbgotICogaXMgc29tZXdoYXQgcmVkdW5kYW50IGJ1dCBuZWNlc3NhcnkgdG8gZWFzaWx5IGZpbmQgdGhlIG90aGVyIGluZm9ybWF0aW9uCi0gKiBwcmVzZW50LiAKLSAqCi0gKiBBbGwgb2YgdGhlIG9mZnNldHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxhc3Qgb3RQcm9jCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIG90OiA4OwkJLyogb3B0aW1pemF0aW9uIHR5cGUgKi8KLQl1bnNpZ25lZCB2YWx1ZTogMjQ7CS8qIGFkZHJlc3Mgd2hlcmUgd2UgYXJlIG1vdmluZyBpdCB0byAqLwotCVJORFhSCXJuZHg7CQkvKiBwb2ludHMgdG8gYSBzeW1ib2wgb3Igb3B0IGVudHJ5ICovCi0JdW5zaWduZWQgbG9uZwlvZmZzZXQ7CS8qIHJlbGF0aXZlIG9mZnNldCB0aGlzIG9jY3VyZWQgKi8KLQl9IE9QVFIsICpwT1BUUjsKLSNkZWZpbmUgb3B0TmlsCSgocE9QVFIpIDApCi0jZGVmaW5lIGNiT1BUUiBzaXplb2YoT1BUUikKLSNkZWZpbmUgaW9wdE5pbCAtMQotCi0vKgotICogRmlsZSBJbmRpcmVjdAotICoKLSAqIFdoZW4gYSBzeW1ib2wgaXMgcmVmZXJlbmNlZCBhY3Jvc3MgZmlsZXMgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmUgaXMgdXNlZDoKLSAqCTEpIHVzZSB0aGUgZmlsZSBpbmRleCB0byBnZXQgdGhlIEZpbGUgaW5kaXJlY3QgZW50cnkuCi0gKgkyKSB1c2UgdGhlIGZpbGUgaW5kaXJlY3QgZW50cnkgdG8gZ2V0IHRoZSBGaWxlIGRlc2NyaXB0b3IuCi0gKgkzKSBhZGQgdGhlIHN5bSBpbmRleCB0byB0aGUgYmFzZSBvZiB0aGF0IGZpbGUncyBzeW0gdGFibGUKLSAqCi0gKi8KLQotdHlwZWRlZiBsb25nIFJGRFQsICpwUkZEVDsKLSNkZWZpbmUgY2JSRkRUIHNpemVvZihSRkRUKQotI2RlZmluZSByZmROaWwJLTEKLQotLyoKLSAqIFRoZSBmaWxlIGluZGlyZWN0IHRhYmxlIGluIHRoZSBtaXBzIGxvYWRlciBpcyBrbm93biBhcyBhbiBhcnJheSBvZiBGSVRzLgotICogVGhpcyBpcyBkb25lIHRvIGtlZXAgdGhlIGNvZGUgaW4gdGhlIGxvYWRlciByZWFkYWJsZSBpbiB0aGUgYXJlYSB3aGVyZQotICogdGhlc2UgdGFibGVzIGFyZSBtZXJnZWQuICBOb3RlIHRoaXMgaXMgb25seSBhIG5hbWUgY2hhbmdlLgotICovCi10eXBlZGVmIGxvbmcgRklULCAqcEZJVDsKLSNkZWZpbmUgY2JGSVQJc2l6ZW9mKEZJVCkKLSNkZWZpbmUgaWZpTmlsCS0xCi0jZGVmaW5lIGZpTmlsCSgocEZJVCkgMCkKLQotI2lmZGVmIF9MQU5HVUFHRV9QQVNDQUwKLSNkZWZpbmUgaWZkTmlsIC0xCi0jZGVmaW5lIGlsbk5pbCAtMQotI2RlZmluZSBpcGROaWwgLTEKLSNkZWZpbmUgaWxpbmVOaWwgLTEKLSNkZWZpbmUgaXN5bU5pbCAtMQotI2RlZmluZSBpbmRleE5pbCAxNiNmZmZmZgotI2RlZmluZSBpc3NOaWwgLTEKLSNkZWZpbmUgaXNzTnVsbCAwCi0jZGVmaW5lIGl0cU1heCA2Ci0jZGVmaW5lIGlhdXhOaWwgLTEKLSNkZWZpbmUgaW9wdE5pbCAtMQotI2RlZmluZSByZmROaWwgLTEKLSNkZWZpbmUgaWZpTmlsIC0xCi0jZW5kaWYJLyogX0xBTkdVQUdFX1BBU0NBTCAqLwotCi0KLS8qIERlbnNlIG51bWJlcnMKLSAqCi0gKiBSYXRoZXIgdGhhbiB1c2UgZmlsZSBpbmRleCwgc3ltYm9sIGluZGV4IHBhaXJzIHRvIHJlcHJlc2VudCBzeW1ib2xzCi0gKglhbmQgZ2xvYmFscywgd2UgdXNlIGRlbnNlIG51bWJlciBzbyB0aGF0IHRoZXkgY2FuIGJlIGVhc2lseSBlbWJlZGVkCi0gKglpbiBpbnRlcm1lZGlhdGUgY29kZSBhbmQgdGhlIHByb2dyYW1zIHRoYXQgcHJvY2VzcyB0aGVtIGNhbgotICoJdXNlIGRpcmVjdCBhY2Nlc3MgdGFibHMgaW5zdGVhZCBvZiBoYXNoIHRhYmxlICh3aGljaCB3b3VsZCBiZQotICoJbmVjZXNhcnkgb3RoZXJ3aXNlIGJlY2F1c2Ugb2YgdGhlIHNwYXJzZSBuYW1lIHNwYWNlIGNhdXNlZCBieQotICoJZmlsZSBpbmRleCwgc3ltYm9sIGluZGV4IHBhaXJzLiBEZW5zZSBudW1iZXIgYXJlIHJlcHJlc2VudGVkCi0gKglieSBSTkRYUnMuCi0gKi8KLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgdGFibGUgZGVmaW5lcyB0aGUgbWVhbmluZyBvZiBlYWNoIFNZTSBmaWVsZCBhcwotICogYSBmdW5jdGlvbiBvZiB0aGUgInN0Ii4gKHNjRC9CID09IHNjRGF0YSBPUiBzY0JzcykKLSAqCi0gKiBOb3RlOiB0aGUgdmFsdWUgImlzeW1NYWMiIGlzIHVzZWQgYnkgc3ltYm9scyB0aGF0IGhhdmUgdGhlIGNvbmNlcHQKLSAqIG9mIGVuY2xvc2luZyBhIGJsb2NrIG9mIHJlbGF0ZWQgaW5mb3JtYXRpb24uCSBUaGlzIHZhbHVlIGlzIHRoZQotICogaXN5bSBvZiB0aGUgZmlyc3Qgc3ltYm9sIEFGVEVSIHRoZSBlbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmltYXJ5Ci0gKiBzeW1ib2wuIEZvciBleGFtcGxlIGlmIGEgcHJvY2VkdXJlIHdhcyBhdCBpc3ltPT05MCBhbmQgaGFkIGFuCi0gKiBpc3ltTWFjPT0xNTUsIHRoZSBhc3NvY2lhdGVkIGVuZCB3b3VsZCBiZSBhdCBpc3ltPT0xNTQsIGFuZCB0aGUKLSAqIHN5bWJvbCBhdCAxNTUgd291bGQgcHJvYmFibHkgKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSkgYmUgdGhlCi0gKiBzeW1ib2wgZm9yIHRoZSBuZXh0IHByb2NlZHVyZS4gIFRoaXMgYWxsb3dzIHJhcGlkIHNraXBwaW5nIG92ZXIKLSAqIGludGVybmFsIGluZm9ybWF0aW9uIG9mIHZhcmlvdXMgc29ydHMuICJzdEVuZCJzIEFMV0FZUyBoYXZlIHRoZQotICogaXN5bSBvZiB0aGUgcHJpbWFyeSBzeW1ib2wgdGhhdCBzdGFydGVkIHRoZSBibG9jay4KLSAqIAotCi1TVAkJU0MJVkFMVUUJCUlOREVYCi0tLS0tLS0tLQktLS0tLS0JLS0tLS0tLS0JLS0tLS0tCi1zdEZpbGUJCXNjVGV4dAlhZGRyZXNzCQlpc3ltTWFjCi1zdExhYmVsCQlzY1RleHQJYWRkcmVzcwkJLS0tCi1zdEdsb2JhbAlzY0QvQglhZGRyZXNzCQlpYXV4Ci1zdFN0YXRpYwlzY0QvQglhZGRyZXNzCQlpYXV4Ci1zdFBhcmFtCQlzY0FicwlvZmZzZXQJCWlhdXgKLXN0TG9jYWwJCXNjQWJzCW9mZnNldAkJaWF1eAotc3RQcm9jCQlzY1RleHQJYWRkcmVzcwkJaWF1eAkoaXN5bU1hYyBpcyBmaXJzdCBBVVgpCi1zdFN0YXRpY1Byb2MJc2NUZXh0CWFkZHJlc3MJCWlhdXgJKGlzeW1NYWMgaXMgZmlyc3QgQVVYKQotCi1zdE1lbWJlcglzY05pbAlvcmRpbmFsCQktLS0JKGlmIG1lbWJlciBvZiBlbnVtKQotCShtaXBzcmVhZCB0aGlua3MgdGhlIGNhc2UgYmVsb3cgaGFzIGEgYml0LCBub3QgYnl0ZSwgb2Zmc2V0LikKLXN0TWVtYmVyCXNjTmlsCWJ5dGUgb2Zmc2V0CWlhdXgJKGlmIG1lbWJlciBvZiBzdHJ1Y3QvdW5pb24pCi1zdE1lbWJlcglzY0JpdHMJYml0IG9mZnNldAlpYXV4CShiaXQgZmllbGQgc3BlYykKLQotc3RCbG9jawkJc2NUZXh0CWFkZHJlc3MJCWlzeW1NYWMgKHRleHQgYmxvY2spCi0JKHRoZSBjb2RlIHNlZW1zIHRvIHRoaW5rIHRoYXQgcmF0aGVyIHRoYW4gc2NOaWwsIHdlIHNlZSBzY0luZm8gZm9yCi0JIHRoZSB0d28gY2FzZXMgYmVsb3cuKQotc3RCbG9jawkJc2NOaWwJY2IJCWlzeW1NYWMgKHN0cnVjdC91bmlvbiBtZW1iZXIgZGVmaW5lKQotc3RCbG9jawkJc2NOaWwJY01lbWJlcnMJaXN5bU1hYyAoZW51bSBtZW1iZXIgZGVmaW5lKQotCi0JKE5ldyB0eXBlcyBhZGRlZCBieSBTR0kgdG8gc2ltcGxpZnkgdGhpbmdzOikKLXN0U3RydWN0CXNjSW5mbwljYgkJaXN5bU1hYyAoc3RydWN0IHR5cGUgZGVmaW5lKQotc3RVbmlvbgkJc2NJbmZvCWNiCQlpc3ltTWFjICh1bmlvbiAgdHlwZSBkZWZpbmUpCi1zdEVudW0JCXNjSW5mbwljTWVtYmVycwlpc3ltTWFjIChlbnVtICAgdHlwZSBkZWZpbmUpCi0KLXN0RW5kCQlzY1RleHQJYWRkcmVzcwkJaXN5bVN0YXJ0Ci1zdEVuZAkJc2NOaWwJLS0tLS0tLQkJaXN5bVN0YXJ0IChzdHJ1Y3QvdW5pb24vZW51bSkKLQotc3RUeXBlZGVmCXNjTmlsCS0tLS0tLS0JCWlhdXgKLXN0UmVnUmVsb2MJc2M/Pz8JdmFsdWUJCW9sZCByZWdpc3RlciBudW1iZXIKLXN0Rm9yd2FyZAlzYz8/PwluZXcgYWRkcmVzcwlpc3ltIHRvIG9yaWdpbmFsIHN5bWJvbAotCi1zdENvbnN0YW50CXNjSW5mbwl2YWx1ZQkJLS0tIChzY2FsYXIpCi1zdENvbnN0YW50CXNjSW5mbwlpc3MJCS0tLSAoY29tcGxleCwgZS5nLiBzdHJpbmcpCi0KLSAqCi0gKi8KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3N5bWNvbnN0LmggYi9pbmNsdWRlL2NvZmYvc3ltY29uc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwZWVmMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvc3ltY29uc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKiBEZWNsYXJhdGlvbnMgb2YgY29uc3RhbnRzIGZvciBpbnRlcm5hbCBmb3JtYXQgb2YgTUlQUyBFQ09GRiBzeW1ib2xzLgotICAgT3JpZ2luYWxseSBjb250cmlidXRlZCBieSBNSVBTIENvbXB1dGVyIFN5c3RlbXMgYW5kIFRoaXJkIEV5ZSBTb2Z0d2FyZS4KLSAgIENoYW5nZXMgY29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQgYXJlIGluIHRoZSBwdWJsaWMgZG9tYWluLgotCi0gICBUaGlzIGZpbGUgaXMganVzdCBhZ2dyZWdhdGVkIHdpdGggdGhlIGZpbGVzIHRoYXQgbWFrZSB1cCB0aGUgR05VCi0gICByZWxlYXNlOyBpdCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIEdBUywgR0RCLCBvciBvdGhlciBHTlUKLSAgIHByb2dyYW1zLiAgKi8KLQotLyoKLSAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAqIHwgQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkxLCAxOTkwIE1JUFMgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLnwKLSAqIHwgTUlQUyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuIGdyYW50cyByZXByb2R1Y3Rpb24gYW5kIHVzZSAgIHwKLSAqIHwgcmlnaHRzIHRvIGFsbCBwYXJ0aWVzLCBQUk9WSURFRCB0aGF0IHRoaXMgY29tbWVudCBpcyAgICAgIHwKLSAqIHwgbWFpbnRhaW5lZCBpbiB0aGUgY29weS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAqLwotCi0vKiAoQykgQ29weXJpZ2h0IDE5ODQgYnkgVGhpcmQgRXllIFNvZnR3YXJlLCBJbmMuCi0gKgotICogVGhpcmQgRXllIFNvZnR3YXJlLCBJbmMuIGdyYW50cyByZXByb2R1Y3Rpb24gYW5kIHVzZSByaWdodHMgdG8KLSAqIGFsbCBwYXJ0aWVzLCBQUk9WSURFRCB0aGF0IHRoaXMgY29tbWVudCBpcyBtYWludGFpbmVkIGluIHRoZSBjb3B5LgotICoKLSAqIFRoaXJkIEV5ZSBtYWtlcyBubyBjbGFpbXMgYWJvdXQgdGhlIGFwcGxpY2FiaWxpdHkgb2YgdGhpcwotICogc3ltYm9sIHRhYmxlIHRvIGEgcGFydGljdWxhciB1c2UuCi0gKi8KLQotLyogZ2xldmVscyBmb3IgZmllbGQgaW4gRkRSICovCi0jZGVmaW5lIEdMRVZFTF8wCTIKLSNkZWZpbmUgR0xFVkVMXzEJMQotI2RlZmluZSBHTEVWRUxfMgkwCS8qIGZvciB1cHdhcmQgY29tcGF0IHJlYXNvbnMuICovCi0jZGVmaW5lIEdMRVZFTF8zCTMKLQotLyogbWFnaWMgbnVtYmVyIGZvIHN5bWhlYWRlciAqLwotI2RlZmluZSBtYWdpY1N5bQkweDcwMDkKLS8qIFRoZSBBbHBoYSB1c2VzIHRoaXMgdmFsdWUgaW5zdGVhZCwgZm9yIHNvbWUgcmVhc29uLiAgKi8KLSNkZWZpbmUgbWFnaWNTeW0yCTB4MTk5MgotCi0vKiBMYW5ndWFnZSBjb2RlcyAqLwotI2RlZmluZSBsYW5nQwkJMAkKLSNkZWZpbmUgbGFuZ1Bhc2NhbAkxCi0jZGVmaW5lIGxhbmdGb3J0cmFuCTIKLSNkZWZpbmUJbGFuZ0Fzc2VtYmxlcgkzCS8qIG9uZSBBc3NlbWJsZXkgaW5zdCBtaWdodCBtYXAgdG8gbWFueSBtYWNoICovCi0jZGVmaW5lIGxhbmdNYWNoaW5lCTQKLSNkZWZpbmUgbGFuZ05pbAkJNQotI2RlZmluZSBsYW5nQWRhCQk2Ci0jZGVmaW5lIGxhbmdQbDEJCTcKLSNkZWZpbmUgbGFuZ0NvYm9sCTgKLSNkZWZpbmUgbGFuZ1N0ZGMJOQkvKiBGSVhNRTogQ29sbGlkZXMgd2l0aCBTR0kgbGFuZ0NwbHVzcGx1cyAqLwotI2RlZmluZSBsYW5nQ3BsdXNwbHVzCTkJLyogRklYTUU6IENvbGxpZGVzIHdpdGggbGFuZ1N0ZGMgKi8KLSNkZWZpbmUgbGFuZ0NwbHVzcGx1c1YyCTEwCS8qIFNHSSBhZGRpdGlvbiAqLwotI2RlZmluZSBsYW5nTWF4CQkxMQkvKiBtYXhpbXVuIGFsbG93ZWQgMzIgLS0gNSBiaXRzICovCi0KLS8qIFRoZSBmb2xsb3dpbmcgYXJlIHZhbHVlIGRlZmluaXRpb25zIGZvciB0aGUgZmllbGRzIGluIHRoZSBTWU1SICovCi0KLS8qCi0gKiBTdG9yYWdlIENsYXNzZXMKLSAqLwotCi0jZGVmaW5lIHNjTmlsCQkwCi0jZGVmaW5lIHNjVGV4dAkJMQkvKiB0ZXh0IHN5bWJvbCAqLwotI2RlZmluZSBzY0RhdGEJCTIJLyogaW5pdGlhbGl6ZWQgZGF0YSBzeW1ib2wgKi8KLSNkZWZpbmUgc2NCc3MJCTMJLyogdW4taW5pdGlhbGl6ZWQgZGF0YSBzeW1ib2wgKi8KLSNkZWZpbmUgc2NSZWdpc3Rlcgk0CS8qIHZhbHVlIG9mIHN5bWJvbCBpcyByZWdpc3RlciBudW1iZXIgKi8KLSNkZWZpbmUgc2NBYnMJCTUJLyogdmFsdWUgb2Ygc3ltYm9sIGlzIGFic29sdXRlICovCi0jZGVmaW5lIHNjVW5kZWZpbmVkCTYJLyogd2hvIGtub3dzPyAqLwotI2RlZmluZSBzY0NkYkxvY2FsCTcJLyogdmFyaWFibGUncyB2YWx1ZSBpcyBJTiBzZS0+dmEuPz8gKi8KLSNkZWZpbmUgc2NCaXRzCQk4CS8qIHRoaXMgaXMgYSBiaXQgZmllbGQgKi8KLSNkZWZpbmUgc2NDZGJTeXN0ZW0JOQkvKiB2YXJpYWJsZSdzIHZhbHVlIGlzIElOIENEQidzIGFkZHJlc3Mgc3BhY2UgKi8KLSNkZWZpbmUgc2NEYngJCTkJLyogb3ZlcmxhcCBkYnggaW50ZXJuYWwgdXNlICovCi0jZGVmaW5lIHNjUmVnSW1hZ2UJMTAJLyogcmVnaXN0ZXIgdmFsdWUgc2F2ZWQgb24gc3RhY2sgKi8KLSNkZWZpbmUgc2NJbmZvCQkxMQkvKiBzeW1ib2wgY29udGFpbnMgZGVidWdnZXIgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgc2NVc2VyU3RydWN0CTEyCS8qIGFkZHJlc3MgaW4gc3RydWN0IHVzZXIgZm9yIGN1cnJlbnQgcHJvY2VzcyAqLwotI2RlZmluZSBzY1NEYXRhCQkxMwkvKiBsb2FkIHRpbWUgb25seSBzbWFsbCBkYXRhICovCi0jZGVmaW5lIHNjU0JzcwkJMTQJLyogbG9hZCB0aW1lIG9ubHkgc21hbGwgY29tbW9uICovCi0jZGVmaW5lIHNjUkRhdGEJCTE1CS8qIGxvYWQgdGltZSBvbmx5IHJlYWQgb25seSBkYXRhICovCi0jZGVmaW5lIHNjVmFyCQkxNgkvKiBWYXIgcGFyYW1ldGVyIChmb3J0cmFuLHBhc2NhbCkgKi8KLSNkZWZpbmUgc2NDb21tb24JMTcJLyogY29tbW9uIHZhcmlhYmxlICovCi0jZGVmaW5lIHNjU0NvbW1vbgkxOAkvKiBzbWFsbCBjb21tb24gKi8KLSNkZWZpbmUgc2NWYXJSZWdpc3RlcgkxOQkvKiBWYXIgcGFyYW1ldGVyIGluIGEgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgc2NWYXJpYW50CTIwCS8qIFZhcmlhbnQgcmVjb3JkICovCi0jZGVmaW5lIHNjU1VuZGVmaW5lZAkyMQkvKiBzbWFsbCB1bmRlZmluZWQoZXh0ZXJuYWwpIGRhdGEgKi8KLSNkZWZpbmUgc2NJbml0CQkyMgkvKiAuaW5pdCBzZWN0aW9uIHN5bWJvbCAqLwotI2RlZmluZSBzY0Jhc2VkVmFyCTIzCS8qIEZvcnRyYW4gb3IgUEwvMSBwdHIgYmFzZWQgdmFyICovIAotI2RlZmluZSBzY1hEYXRhICAgICAgICAgMjQgICAgICAvKiBleGNlcHRpb24gaGFuZGxpbmcgZGF0YSAqLwotI2RlZmluZSBzY1BEYXRhICAgICAgICAgMjUgICAgICAvKiBQcm9jZWR1cmUgc2VjdGlvbiAqLwotI2RlZmluZSBzY0ZpbmkgICAgICAgICAgMjYgICAgICAvKiAuZmluaSBzZWN0aW9uICovCi0jZGVmaW5lIHNjUkNvbnN0CTI3CS8qIC5yY29uc3Qgc2VjdGlvbiAqLwotI2RlZmluZSBzY01heAkJMzIKLQotCi0vKgotICogICBTeW1ib2wgVHlwZXMKLSAqLwotCi0jZGVmaW5lIHN0TmlsCQkwCS8qIE51dGhpbicgc3BlY2lhbCAqLwotI2RlZmluZSBzdEdsb2JhbAkxCS8qIGV4dGVybmFsIHN5bWJvbCAqLwotI2RlZmluZSBzdFN0YXRpYwkyCS8qIHN0YXRpYyAqLwotI2RlZmluZSBzdFBhcmFtCQkzCS8qIHByb2NlZHVyZSBhcmd1bWVudCAqLwotI2RlZmluZSBzdExvY2FsCQk0CS8qIGxvY2FsIHZhcmlhYmxlICovCi0jZGVmaW5lIHN0TGFiZWwJCTUJLyogbGFiZWwgKi8KLSNkZWZpbmUgc3RQcm9jCQk2CS8qICAgICAiICAgICAgIgkgUHJvY2VkdXJlICovCi0jZGVmaW5lIHN0QmxvY2sJCTcJLyogYmVnaW5ubmluZyBvZiBibG9jayAqLwotI2RlZmluZSBzdEVuZAkJOAkvKiBlbmQgKG9mIGFueXRoaW5nKSAqLwotI2RlZmluZSBzdE1lbWJlcgk5CS8qIG1lbWJlciAob2YgYW55dGhpbmcJLSBzdHJ1Y3QvdW5pb24vZW51bSAqLwotI2RlZmluZSBzdFR5cGVkZWYJMTAJLyogdHlwZSBkZWZpbml0aW9uICovCi0jZGVmaW5lIHN0RmlsZQkJMTEJLyogZmlsZSBuYW1lICovCi0jZGVmaW5lIHN0UmVnUmVsb2MJMTIJLyogcmVnaXN0ZXIgcmVsb2NhdGlvbiAqLwotI2RlZmluZSBzdEZvcndhcmQJMTMJLyogZm9yd2FyZGluZyBhZGRyZXNzICovCi0jZGVmaW5lIHN0U3RhdGljUHJvYwkxNAkvKiBsb2FkIHRpbWUgb25seSBzdGF0aWMgcHJvY3MgKi8KLSNkZWZpbmUgc3RDb25zdGFudAkxNQkvKiBjb25zdCAqLwotI2RlZmluZSBzdFN0YVBhcmFtCTE2CS8qIEZvcnRyYW4gc3RhdGljIHBhcmFtZXRlcnMgKi8KLSAgICAvKiBUaGVzZSBuZXcgc3ltYm9sIHR5cGVzIGhhdmUgYmVlbiByZWNlbnRseSBhZGRlZCB0byBTR0kgbWFjaGluZXMuICovCi0jZGVmaW5lIHN0U3RydWN0CTI2CS8qIEJlZ2lubmluZyBvZiBibG9jayBkZWZpbmluZyBhIHN0cnVjdCB0eXBlICovCi0jZGVmaW5lIHN0VW5pb24JCTI3CS8qIEJlZ2lubmluZyBvZiBibG9jayBkZWZpbmluZyBhIHVuaW9uIHR5cGUgKi8KLSNkZWZpbmUgc3RFbnVtCQkyOAkvKiBCZWdpbm5pbmcgb2YgYmxvY2sgZGVmaW5pbmcgYW4gZW51bSB0eXBlICovCi0jZGVmaW5lIHN0SW5kaXJlY3QJMzQJLyogSW5kaXJlY3QgdHlwZSBzcGVjaWZpY2F0aW9uICovCi0gICAgLyogUHNldWRvLXN5bWJvbHMgLSBpbnRlcm5hbCB0byBkZWJ1Z2dlciAqLwotI2RlZmluZSBzdFN0cgkJNjAJLyogc3RyaW5nICovCi0jZGVmaW5lIHN0TnVtYmVyCTYxCS8qIHB1cmUgbnVtYmVyIChpZS4gNCBOT1IgMisyKSAqLwotI2RlZmluZSBzdEV4cHIJCTYyCS8qIDIrMiB2cy4gNCAqLwotI2RlZmluZSBzdFR5cGUJCTYzCS8qIHBvc3QtY29lcnNpb24gU0VSICovCi0jZGVmaW5lIHN0TWF4CQk2NAotCi0vKiBkZWZpbml0aW9ucyBmb3IgZmllbGRzIGluIFRJUiAqLwotCi0vKiB0eXBlIHF1YWxpZmllcnMgZm9yIHRpLnRxMCAtPiB0aS4oaXRxTWF4LTEpICovCi0jZGVmaW5lIHRxTmlsCTAJLyogYnQgaXMgd2hhdCB5b3Ugc2VlICovCi0jZGVmaW5lIHRxUHRyCTEJLyogcG9pbnRlciAqLwotI2RlZmluZSB0cVByb2MJMgkvKiBwcm9jZWR1cmUgKi8KLSNkZWZpbmUgdHFBcnJheSAzCS8qIGR1aCAqLwotI2RlZmluZSB0cUZhcgk0CS8qIGxvbmdlciBhZGRyZXNzaW5nIC0gODA4Ni84IGxhbmQgKi8KLSNkZWZpbmUgdHFWb2wJNQkvKiB2b2xhdGlsZSAqLwotI2RlZmluZSB0cUNvbnN0IDYJLyogY29uc3QgKi8KLSNkZWZpbmUgdHFNYXgJOAotCi0vKiBiYXNpYyB0eXBlcyBhcyBzZWVuIGluIHRpLmJ0ICovCi0jZGVmaW5lIGJ0TmlsCQkwCS8qIHVuZGVmaW5lZCAoYWxzbywgZW51bSBtZW1iZXJzKSAqLwotI2RlZmluZSBidEFkcgkJMQkvKiBhZGRyZXNzIC0gaW50ZWdlciBzYW1lIHNpemUgYXMgcG9pbnRlciAqLwotI2RlZmluZSBidENoYXIJCTIJLyogY2hhcmFjdGVyICovCi0jZGVmaW5lIGJ0VUNoYXIJCTMJLyogdW5zaWduZWQgY2hhcmFjdGVyICovCi0jZGVmaW5lIGJ0U2hvcnQJCTQJLyogc2hvcnQgKi8KLSNkZWZpbmUgYnRVU2hvcnQJNQkvKiB1bnNpZ25lZCBzaG9ydCAqLwotI2RlZmluZSBidEludAkJNgkvKiBpbnQgKi8KLSNkZWZpbmUgYnRVSW50CQk3CS8qIHVuc2lnbmVkIGludCAqLwotI2RlZmluZSBidExvbmcJCTgJLyogbG9uZyAqLwotI2RlZmluZSBidFVMb25nCQk5CS8qIHVuc2lnbmVkIGxvbmcgKi8KLSNkZWZpbmUgYnRGbG9hdAkJMTAJLyogZmxvYXQgKHJlYWwpICovCi0jZGVmaW5lIGJ0RG91YmxlCTExCS8qIERvdWJsZSAocmVhbCkgKi8KLSNkZWZpbmUgYnRTdHJ1Y3QJMTIJLyogU3RydWN0dXJlIChSZWNvcmQpICovCi0jZGVmaW5lIGJ0VW5pb24JCTEzCS8qIFVuaW9uICh2YXJpYW50KSAqLwotI2RlZmluZSBidEVudW0JCTE0CS8qIEVudW1lcmF0ZWQgKi8KLSNkZWZpbmUgYnRUeXBlZGVmCTE1CS8qIGRlZmluZWQgdmlhIGEgdHlwZWRlZiwgaXN5bVJlZiBwb2ludHMgKi8KLSNkZWZpbmUgYnRSYW5nZQkJMTYJLyogc3VicmFuZ2Ugb2YgaW50ICovCi0jZGVmaW5lIGJ0U2V0CQkxNwkvKiBwYXNjYWwgc2V0cyAqLwotI2RlZmluZSBidENvbXBsZXgJMTgJLyogZm9ydHJhbiBjb21wbGV4ICovCi0jZGVmaW5lIGJ0RENvbXBsZXgJMTkJLyogZm9ydHJhbiBkb3VibGUgY29tcGxleCAqLwotI2RlZmluZSBidEluZGlyZWN0CTIwCS8qIGZvcndhcmQgb3IgdW5uYW1lZCB0eXBlZGVmICovCi0jZGVmaW5lIGJ0Rml4ZWREZWMJMjEJLyogRml4ZWQgRGVjaW1hbCAqLwotI2RlZmluZSBidEZsb2F0RGVjCTIyCS8qIEZsb2F0IERlY2ltYWwgKi8KLSNkZWZpbmUgYnRTdHJpbmcJMjMJLyogVmFyeWluZyBMZW5ndGggQ2hhcmFjdGVyIFN0cmluZyAqLwotI2RlZmluZSBidEJpdAkJMjQJLyogQWxpZ25lZCBCaXQgU3RyaW5nICovCi0jZGVmaW5lIGJ0UGljdHVyZQkyNQkvKiBQaWN0dXJlICovCi0jZGVmaW5lIGJ0Vm9pZAkJMjYJLyogdm9pZCAqLwotI2RlZmluZSBidExvbmdMb25nCTI3CS8qIGxvbmcgbG9uZyAqLwotI2RlZmluZSBidFVMb25nTG9uZwkyOAkvKiB1bnNpZ25lZCBsb25nIGxvbmcgKi8KLSNkZWZpbmUgYnRNYXgJCTY0Ci0KLSNpZiAoX01GRyA9PSBfTUlQUykKLS8qIG9wdGltaXphdGlvbiB0eXBlIGNvZGVzICovCi0jZGVmaW5lIG90TmlsCQkwCi0jZGVmaW5lIG90UmVnCQkxCS8qIG1vdmUgdmFyIHRvIHJlZyAqLwotI2RlZmluZSBvdEJsb2NrCQkyCS8qIGJlZ2luIGJhc2ljIGJsb2NrICovCi0jZGVmaW5lCW90UHJvYwkJMwkvKiBwcm9jZWR1cmUgKi8KLSNkZWZpbmUgb3RJbmxpbmUJNAkvKiBpbmxpbmUgcHJvY2VkdXJlICovCi0jZGVmaW5lIG90RW5kCQk1CS8qIHdoYXRldmVyIHlvdSBzdGFydGVkICovCi0jZGVmaW5lIG90TWF4CQk2CS8qIEtFRVAgVVAgVE8gREFURSAqLwotI2VuZGlmIC8qIChfTUZHID09IF9NSVBTKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3RpYzMwLmggYi9pbmNsdWRlL2NvZmYvdGljMzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiMDI2Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvdGljMzAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIFRleGFzIEluc3RydW1lbnRzIFRNUzMyMEMzWCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0jZGVmaW5lCVRJQzMwTUFHSUMJMHhDMDAwCi0KLSNkZWZpbmUgVElDMzBCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9VElDMzBNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0jZGVmaW5lIEFPVVRTWiAyOAotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1s0XTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLSAgc3RydWN0IHsKLQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JdW5pb24gewotCSAgc3RydWN0IHsKLQkJY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQljaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JICB9IHhfbG5zejsKLQkgIGNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCX0geF9taXNjOwotCXVuaW9uIHsKLQkgIHN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCWNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCSAgfSB4X2ZjbjsKLQkgIHN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkgIH0geF9hcnk7Ci0JfSB4X2ZjbmFyeTsKLQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotICB9IHhfc3ltOwotICAKLSAgdW5pb24gewotCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQlzdHJ1Y3QgewotCSAgY2hhciB4X3plcm9lc1s0XTsKLQkgIGNoYXIgeF9vZmZzZXRbNF07Ci0JfSB4X247Ci0gIH0geF9maWxlOwotICAKLSAgc3RydWN0IHsKLQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotICB9IHhfc2NuOwotICAKLSAgc3RydWN0IHsKLQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotICB9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0gIAotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgZXh0ZXJuYWwgcmVsb2MgaGFzIGFuIG9mZnNldCBmaWVsZCwgYmVjYXVzZSBzb21lIG9mIHRoZSByZWxvYwotICAgdHlwZXMgb24gdGhlIHo4ayBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCi0gICBvZmZzZXQgLSBlZyB3aXRoIHNlZ21lbnRzICovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX29mZnNldFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9zdHVmZlsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTYKLQotLyogVE1TMzIwQzMwIHJlbG9jYXRpb24gdHlwZXMuICAqLwotCi0jZGVmaW5lIFJfVElDMzBfQUJTMTYgMHgxMDAgIC8qIDE2IGJpdCBhYnNvbHV0ZS4gKi8KLSNkZWZpbmUgUl9USUMzMF9BQlMyNCAweDEwMSAgLyogMjQgYml0IGFic29sdXRlLiAqLwotI2RlZmluZSBSX1RJQzMwX0FCUzMyIDB4MTAyICAvKiAzMiBiaXQgYWJzb2x1dGUuICovCi0jZGVmaW5lIFJfVElDMzBfTERQICAgMHgxMDMgIC8qIExEUCBiaXRzIDIzLTE2IHRvIDctMC4gKi8KLSNkZWZpbmUgUl9USUMzMF9QQzE2ICAweDEwNCAgLyogMTYgYml0IHBjIHJlbGF0aXZlLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3RpYzgwLmggYi9pbmNsdWRlL2NvZmYvdGljODAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5MzhmNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvdGljODAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIFRJIFRNUzMyMEM4MCAoTVZQKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotCWNoYXIgZl90YXJnZXRfaWRbMl07CS8qIHRhcmdldCBpZCAoVEljODAgc3BlY2lmaWMpCSovCi19OwotCi0jZGVmaW5lCVRJQzgwX0FSQ0hfTUFHSUMJMHgwQzEJLyogR29lcyBpbiB0aGUgZmlsZSBoZWFkZXIgbWFnaWMgbnVtYmVyIGZpZWxkICovCi0jZGVmaW5lIFRJQzgwX1RBUkdFVF9JRAkJMHg5NQkvKiBHb2VzIGluIHRoZSB0YXJnZXQgaWQgZmllbGQgKi8KLQotI2RlZmluZSBUSUM4MEJBRE1BRyh4KSAoKHgpLmZfbWFnaWMgIT0gVElDODBfQVJDSF9NQUdJQykKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIyCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgVElDODBfQU9VVEhEUl9NQUdJQwkweDEwOAkvKiBHb2VzIGluIHRoZSBvcHRpb25hbCBmaWxlIGhlYWRlciBtYWdpYyBudW1iZXIgZmllbGQgKi8KLQotI2RlZmluZSBBT1VUSERSU1ogMjgKLSNkZWZpbmUgQU9VVFNaIDI4Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotCWNoYXIJCXNfcmVzZXJ2ZWRbMV07CS8qIHJlc2VydmVkIChUSWM4MCBzcGVjaWZpYykJKi8KLQljaGFyCQlzX21lbXBhZ2VbMV07CS8qIG1lbW9yeSBwYWdlIG51bWJlciAoVEljODApCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9DSU5JVAkiLmNpbml0IgotI2RlZmluZSBfQ09OU1QJIi5jb25zdCIKLSNkZWZpbmUgX1NXSVRDSAkiLnN3aXRjaCIKLSNkZWZpbmUgX1NUQUNLCSIuc3RhY2siCi0jZGVmaW5lIF9TWVNNRU0JIi5zeXNtZW0iCi0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CQkJLyogbGluZSBudW1iZXIJKi8KLX07Ci0KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotLyogRklYTUUgLSBuZWVkIHRvIGNvcnJlbGF0ZSB3aXRoIFRJYzgwIENvZGUgR2VuZXJhdGlvbiBUb29scyBVc2VyJ3MgR3VpZGUsIENHOkEtMjUgKi8KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCi0gICB0eXBlcyBvbiB0aGUgaDggZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQotICAgb2Zmc2V0IC0gZWcgdGhlIHN0cmFuZ2UganVtcCBhbmQgaGlnaCBwYWdlIGFkZHJlc3NpbmcgbW9kZXMgKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfcmVzZXJ2ZWRbMl07Ci0gIGNoYXIgcl90eXBlWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxMgotCi0vKiBUSWM4MCByZWxvY2F0aW9uIHR5cGVzLiAqLwotCi0jZGVmaW5lIFJfQUJTCQkweDAwCQkvKiBBYnNvbHV0ZSBhZGRyZXNzIC0gbm8gcmVsb2NhdGlvbiAqLwotI2RlZmluZSBSX1JFTExPTkdYCTB4MTEJCS8qIFBQOiAzMiBiaXRzLCBkaXJlY3QgKi8KLSNkZWZpbmUgUl9QUEJBU0UJMHgzNAkJLyogUFA6IEdsb2JhbCBiYXNlIGFkZHJlc3MgdHlwZSAqLwotI2RlZmluZSBSX1BQTEJBU0UJMHgzNQkJLyogUFA6IExvY2FsIGJhc2UgYWRkcmVzcyB0eXBlICovCi0jZGVmaW5lIFJfUFAxNQkJMHgzOAkJLyogUFA6IEdsb2JhbCAxNSBiaXQgb2Zmc2V0ICovCi0jZGVmaW5lIFJfUFAxNVcJCTB4MzkJCS8qIFBQOiBHbG9iYWwgMTUgYml0IG9mZnNldCBkaXZpZGVkIGJ5IDQgKi8KLSNkZWZpbmUgUl9QUDE1SAkJMHgzQQkJLyogUFA6IEdsb2JhbCAxNSBiaXQgb2Zmc2V0IGRpdmlkZWQgYnkgMiAqLwotI2RlZmluZSBSX1BQMTZCCQkweDNCCQkvKiBQUDogR2xvYmFsIDE2IGJpdCBvZmZzZXQgZm9yIGJ5dGVzICovCi0jZGVmaW5lIFJfUFBMMTUJCTB4M0MJCS8qIFBQOiBMb2NhbCAxNSBiaXQgb2Zmc2V0ICovCi0jZGVmaW5lIFJfUFBMMTVXCTB4M0QJCS8qIFBQOiBMb2NhbCAxNSBiaXQgb2Zmc2V0IGRpdmlkZWQgYnkgNCAqLwotI2RlZmluZSBSX1BQTDE1SAkweDNFCQkvKiBQUDogTG9jYWwgMTUgYml0IG9mZnNldCBkaXZpZGVkIGJ5IDIgKi8KLSNkZWZpbmUgUl9QUEwxNkIJMHgzRgkJLyogUFA6IExvY2FsIDE2IGJpdCBvZmZzZXQgZm9yIGJ5dGVzICovCi0jZGVmaW5lIFJfUFBOMTUJCTB4NDAJCS8qIFBQOiBHbG9iYWwgMTUgYml0IG5lZ2F0aXZlIG9mZnNldCAqLwotI2RlZmluZSBSX1BQTjE1VwkweDQxCQkvKiBQUDogR2xvYmFsIDE1IGJpdCBuZWdhdGl2ZSBvZmZzZXQgZGl2aWRlZCBieSA0ICovCi0jZGVmaW5lIFJfUFBOMTVICTB4NDIJCS8qIFBQOiBHbG9iYWwgMTUgYml0IG5lZ2F0aXZlIG9mZnNldCBkaXZpZGVkIGJ5IDIgKi8KLSNkZWZpbmUgUl9QUE4xNkIJMHg0MwkJLyogUFA6IEdsb2JhbCAxNiBiaXQgbmVnYXRpdmUgYnl0ZSBvZmZzZXQgKi8KLSNkZWZpbmUgUl9QUExOMTUJMHg0NAkJLyogUFA6IExvY2FsIDE1IGJpdCBuZWdhdGl2ZSBvZmZzZXQgKi8KLSNkZWZpbmUgUl9QUExOMTVXCTB4NDUJCS8qIFBQOiBMb2NhbCAxNSBiaXQgbmVnYXRpdmUgb2Zmc2V0IGRpdmlkZWQgYnkgNCAqLwotI2RlZmluZSBSX1BQTE4xNUgJMHg0NgkJLyogUFA6IExvY2FsIDE1IGJpdCBuZWdhdGl2ZSBvZmZzZXQgZGl2aWRlZCBieSAyICovCi0jZGVmaW5lIFJfUFBMTjE2QgkweDQ3CQkvKiBQUDogTG9jYWwgMTYgYml0IG5lZ2F0aXZlIGJ5dGUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfTVBQQ1IxNVcJMHg0RQkJLyogTVA6IDE1IGJpdCBQQy1yZWxhdGl2ZSBkaXZpZGVkIGJ5IDQgKi8KLSNkZWZpbmUgUl9NUFBDUgkJMHg0RgkJLyogTVA6IDMyIGJpdCBQQy1yZWxhdGl2ZSBkaXZpZGVkIGJ5IDQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi93NjUuaCBiL2luY2x1ZGUvY29mZi93NjUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3OGMyMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvdzY1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBXREMgNjU4MTYgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotCi0jZGVmaW5lCVc2NU1BR0lDCTB4NjUwMAotCi0KLSNkZWZpbmUgVzY1QkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPVc2NU1BR0lDKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLQotI2RlZmluZSBBT1VUSERSU1ogMjgKLSNkZWZpbmUgQU9VVFNaIDI4Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzRdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgZXh0ZXJuYWwgcmVsb2MgaGFzIGFuIG9mZnNldCBmaWVsZCwgYmVjYXVzZSBzb21lIG9mIHRoZSByZWxvYwotICAgdHlwZXMgb24gdGhlIHc2NSBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCi0gICBvZmZzZXQgLSBlZyB0aGUgc3RyYW5nZSBqdW1wIGFuZCBoaWdoIHBhZ2UgYWRkcmVzc2luZyBtb2RlcyAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfc3R1ZmZbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi93ZTMyay5oIGIvaW5jbHVkZS9jb2ZmL3dlMzJrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1M2ZhMzUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3dlMzJrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciB3ZTMyayAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfQVIzMldSCWZpbGUgaGFzIGJ5dGUgb3JkZXJpbmcgb2YgYW4gQVIzMldSIG1hY2hpbmUgKGUuZy4gdmF4KQotICovCi0KLSNkZWZpbmUgRl9SRUxGTEcJKDB4MDAwMSkKLSNkZWZpbmUgRl9FWEVDCQkoMHgwMDAyKQotI2RlZmluZSBGX0xOTk8JCSgweDAwMDQpCi0jZGVmaW5lIEZfTFNZTVMJCSgweDAwMDgpCi0jZGVmaW5lCUZfQk0zMkIJCSgwMDIwMDAwKQotI2RlZmluZQlGX0JNMzJNQVUJKDAwNDAwMDApCi0KLSNkZWZpbmUJV0UzMktNQUdJQwkweDE3MAkvKiB3ZTMyayBzYW5zIHRyYW5zZmVyIHZlY3RvciAqLwotI2RlZmluZSBGQk9NQUdJQwkweDE3MAkvKiB3ZTMyayBzYW5zIHRyYW5zZmVyIHZlY3RvciAqLwotI2RlZmluZSBNVFZNQUdJQwkweDE3MQkvKiB3ZTMyayB3aXRoIHRyYW5zZmVyIHZlY3RvciAqLwotI2RlZmluZSBSQk9NQUdJQwkweDE3MgkvKiByZXNlcnZlZCAqLwotI2RlZmluZSBXRTMyS0JBRE1BRyh4KSAoKCh4KS5mX21hZ2ljICE9IFdFMzJLTUFHSUMpIFwKLQkJCSYmICgoeCkuZl9tYWdpYyAhPSBGQk9NQUdJQykgXAotCQkJJiYgKCh4KS5mX21hZ2ljICE9IFJCT01BR0lDKSBcCi0JCQkmJiAoKHgpLmZfbWFnaWMgIT0gTVRWTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfVFYJIi50diIKLSNkZWZpbmUgX0lOSVQJIi5pbml0IgotI2RlZmluZSBfRklOSQkiLmZpbmkiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotI2RlZmluZSBOX0JUTUFTSwkoMHhmKQotI2RlZmluZSBOX1RNQVNLCQkoMHgzMCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLSMJZGVmaW5lIF9FVEVYVAkiZXRleHQiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxMAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvejhrLmggYi9pbmNsdWRlL2NvZmYvejhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5Yjg0NmMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3o4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgWmlsb2cgWjgwME4gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotLyogVHlwZSBvZiBjcHUgaXMgc3RvcmVkIGluIGZsYWdzICovCi0jZGVmaW5lIEZfWjgwMDEgICAgMHgxMDAwCi0jZGVmaW5lIEZfWjgwMDIgICAgMHgyMDAwCi0jZGVmaW5lIEZfTUFDSE1BU0sgMHhmMDAwCi0KLSNkZWZpbmUJWjhLTUFHSUMJMHg4MDAwCi0KLSNkZWZpbmUgWjhLQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPVo4S01BR0lDKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLQotI2RlZmluZSBBT1VUSERSU1ogMjgKLSNkZWZpbmUgQU9VVFNaIDI4Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzRdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgZXh0ZXJuYWwgcmVsb2MgaGFzIGFuIG9mZnNldCBmaWVsZCwgYmVjYXVzZSBzb21lIG9mIHRoZSByZWxvYwotICAgdHlwZXMgb24gdGhlIHo4ayBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCi0gICBvZmZzZXQgLSBlZyB3aXRoIHNlZ21lbnRzICovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX29mZnNldFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9zdHVmZlsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTYKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZW1hbmdsZS5oIGIvaW5jbHVkZS9kZW1hbmdsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2ZlNWUyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZGVtYW5nbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qIERlZnMgZm9yIGludGVyZmFjZSB0byBkZW1hbmdsZXJzLgotICAgQ29weXJpZ2h0IDE5OTIsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpZiAhZGVmaW5lZCAoREVNQU5HTEVfSCkKLSNkZWZpbmUgREVNQU5HTEVfSAotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotLyogT3B0aW9ucyBwYXNzZWQgdG8gY3BsdXNfZGVtYW5nbGUgKGluIDJuZCBwYXJhbWV0ZXIpLiAqLwotCi0jZGVmaW5lIERNR0xfTk9fT1BUUwkwCQkvKiBGb3IgcmVhZGFiaWxpdHkuLi4gKi8KLSNkZWZpbmUgRE1HTF9QQVJBTVMJKDEgPDwgMCkJLyogSW5jbHVkZSBmdW5jdGlvbiBhcmdzICovCi0jZGVmaW5lIERNR0xfQU5TSQkoMSA8PCAxKQkvKiBJbmNsdWRlIGNvbnN0LCB2b2xhdGlsZSwgZXRjICovCi0jZGVmaW5lIERNR0xfSkFWQQkoMSA8PCAyKQkvKiBEZW1hbmdsZSBhcyBKYXZhIHJhdGhlciB0aGFuIEMrKy4gKi8KLQotI2RlZmluZSBETUdMX0FVVE8JKDEgPDwgOCkKLSNkZWZpbmUgRE1HTF9HTlUJKDEgPDwgOSkKLSNkZWZpbmUgRE1HTF9MVUNJRAkoMSA8PCAxMCkKLSNkZWZpbmUgRE1HTF9BUk0JKDEgPDwgMTEpCi0jZGVmaW5lIERNR0xfSFAgCSgxIDw8IDEyKSAgICAgICAvKiBGb3IgdGhlIEhQIGFDQyBjb21waWxlcjsgc2FtZSBhcyBBUk0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgZm9yIHRlbXBsYXRlIGFyZ3VtZW50cywgZXRjLiAqLwotI2RlZmluZSBETUdMX0VERwkoMSA8PCAxMykKLQotLyogSWYgbm9uZSBvZiB0aGVzZSBhcmUgc2V0LCB1c2UgJ2N1cnJlbnRfZGVtYW5nbGluZ19zdHlsZScgYXMgdGhlIGRlZmF1bHQuICovCi0jZGVmaW5lIERNR0xfU1RZTEVfTUFTSyAoRE1HTF9BVVRPfERNR0xfR05VfERNR0xfTFVDSUR8RE1HTF9BUk18RE1HTF9IUHxETUdMX0VERykKLQotLyogRW51bWVyYXRpb24gb2YgcG9zc2libGUgZGVtYW5nbGluZyBzdHlsZXMuCi0KLSAgIEx1Y2lkIGFuZCBBUk0gc3R5bGVzIGFyZSBzdGlsbCBrZXB0IGxvZ2ljYWxseSBkaXN0aW5jdCwgZXZlbiB0aG91Z2gKLSAgIHRoZXkgbm93IGJvdGggYmVoYXZlIGlkZW50aWNhbGx5LiAgVGhlIHJlc3VsdGluZyBzdHlsZSBpcyBhY3R1YWwgdGhlCi0gICB1bmlvbiBvZiBib3RoLiAgSS5FLiBlaXRoZXIgc3R5bGUgcmVjb2duaXplcyBib3RoICJfX3B0X18iIGFuZCAiX19yZl9fIgotICAgZm9yIG9wZXJhdG9yICItPiIsIGV2ZW4gdGhvdWdoIHRoZSBmaXJzdCBpcyBsdWNpZCBzdHlsZSBhbmQgdGhlIHNlY29uZAotICAgaXMgQVJNIHN0eWxlLiAoRklYTUU/KSAqLwotCi1leHRlcm4gZW51bSBkZW1hbmdsaW5nX3N0eWxlcwotewotICB1bmtub3duX2RlbWFuZ2xpbmcgPSAwLAotICBhdXRvX2RlbWFuZ2xpbmcgPSBETUdMX0FVVE8sCi0gIGdudV9kZW1hbmdsaW5nID0gRE1HTF9HTlUsCi0gIGx1Y2lkX2RlbWFuZ2xpbmcgPSBETUdMX0xVQ0lELAotICBhcm1fZGVtYW5nbGluZyA9IERNR0xfQVJNLAotICBocF9kZW1hbmdsaW5nID0gRE1HTF9IUCwKLSAgZWRnX2RlbWFuZ2xpbmcgPSBETUdMX0VERwotfSBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGU7Ci0KLS8qIERlZmluZSBzdHJpbmcgbmFtZXMgZm9yIHRoZSB2YXJpb3VzIGRlbWFuZ2xpbmcgc3R5bGVzLiAqLwotCi0jZGVmaW5lIEFVVE9fREVNQU5HTElOR19TVFlMRV9TVFJJTkcJImF1dG8iCi0jZGVmaW5lIEdOVV9ERU1BTkdMSU5HX1NUWUxFX1NUUklORwkiZ251IgotI2RlZmluZSBMVUNJRF9ERU1BTkdMSU5HX1NUWUxFX1NUUklORwkibHVjaWQiCi0jZGVmaW5lIEFSTV9ERU1BTkdMSU5HX1NUWUxFX1NUUklORwkiYXJtIgotI2RlZmluZSBIUF9ERU1BTkdMSU5HX1NUWUxFX1NUUklORwkiaHAiCi0jZGVmaW5lIEVER19ERU1BTkdMSU5HX1NUWUxFX1NUUklORwkiZWRnIgotCi0vKiBTb21lIG1hY3JvcyB0byB0ZXN0IHdoYXQgZGVtYW5nbGluZyBzdHlsZSBpcyBhY3RpdmUuICovCi0KLSNkZWZpbmUgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZQotI2RlZmluZSBBVVRPX0RFTUFOR0xJTkcgKCgoaW50KSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUpICYgRE1HTF9BVVRPKQotI2RlZmluZSBHTlVfREVNQU5HTElORyAoKChpbnQpIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSkgJiBETUdMX0dOVSkKLSNkZWZpbmUgTFVDSURfREVNQU5HTElORyAoKChpbnQpIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSkgJiBETUdMX0xVQ0lEKQotI2RlZmluZSBBUk1fREVNQU5HTElORyAoKChpbnQpIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSkgJiBETUdMX0FSTSkKLSNkZWZpbmUgSFBfREVNQU5HTElORyAoKChpbnQpIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSkgJiBETUdMX0hQKQotI2RlZmluZSBFREdfREVNQU5HTElORyAoKChpbnQpIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSkgJiBETUdMX0VERykKLQotZXh0ZXJuIGNoYXIgKgotY3BsdXNfZGVtYW5nbGUgUEFSQU1TICgoY29uc3QgY2hhciAqbWFuZ2xlZCwgaW50IG9wdGlvbnMpKTsKLQotZXh0ZXJuIGludAotY3BsdXNfZGVtYW5nbGVfb3BuYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm9wbmFtZSwgY2hhciAqcmVzdWx0LCBpbnQgb3B0aW9ucykpOwotCi1leHRlcm4gY29uc3QgY2hhciAqCi1jcGx1c19tYW5nbGVfb3BuYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm9wbmFtZSwgaW50IG9wdGlvbnMpKTsKLQotLyogTm90ZTogVGhpcyBzZXRzIGdsb2JhbCBzdGF0ZS4gIEZJWE1FIGlmIHlvdSBjYXJlIGFib3V0IG11bHRpLXRocmVhZGluZy4gKi8KLQotZXh0ZXJuIHZvaWQKLXNldF9jcGx1c19tYXJrZXJfZm9yX2RlbWFuZ2xpbmcgUEFSQU1TICgoaW50IGNoKSk7Ci0KLSNlbmRpZgkvKiBERU1BTkdMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Rpcy1hc20uaCBiL2luY2x1ZGUvZGlzLWFzbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjZlZDY5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZGlzLWFzbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qIEludGVyZmFjZSBiZXR3ZWVuIHRoZSBvcGNvZGUgbGlicmFyeSBhbmQgaXRzIGNhbGxlcnMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LCAxOTkzLgotCi0gICBUaGUgb3Bjb2RlIGxpYnJhcnkgKGxpYm9wY29kZXMuYSkgcHJvdmlkZXMgaW5zdHJ1Y3Rpb24gZGVjb2RlcnMgZm9yCi0gICBhIGxhcmdlIHZhcmlldHkgb2YgaW5zdHJ1Y3Rpb24gc2V0cywgY2FsbGFibGUgd2l0aCBhbiBpZGVudGljYWwKLSAgIGludGVyZmFjZSwgZm9yIG1ha2luZyBpbnN0cnVjdGlvbi1wcm9jZXNzaW5nIHByb2dyYW1zIG1vcmUgaW5kZXBlbmRlbnQKLSAgIG9mIHRoZSBpbnN0cnVjdGlvbiBzZXQgYmVpbmcgcHJvY2Vzc2VkLiAgKi8KLQotI2lmbmRlZiBESVNfQVNNX0gKLSNkZWZpbmUgRElTX0FTTV9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImJmZC5oIgotCi10eXBlZGVmIGludCAoKmZwcmludGZfZnR5cGUpIFBBUkFNUygoUFRSLCBjb25zdCBjaGFyKiwgLi4uKSk7Ci0KLWVudW0gZGlzX2luc25fdHlwZSB7Ci0gIGRpc19ub25pbnNuLAkJCS8qIE5vdCBhIHZhbGlkIGluc3RydWN0aW9uICovCi0gIGRpc19ub25icmFuY2gsCQkvKiBOb3QgYSBicmFuY2ggaW5zdHJ1Y3Rpb24gKi8KLSAgZGlzX2JyYW5jaCwJCQkvKiBVbmNvbmRpdGlvbmFsIGJyYW5jaCAqLwotICBkaXNfY29uZGJyYW5jaCwJCS8qIENvbmRpdGlvbmFsIGJyYW5jaCAqLwotICBkaXNfanNyLAkJCS8qIEp1bXAgdG8gc3Vicm91dGluZSAqLwotICBkaXNfY29uZGpzciwJCQkvKiBDb25kaXRpb25hbCBqdW1wIHRvIHN1YnJvdXRpbmUgKi8KLSAgZGlzX2RyZWYsCQkJLyogRGF0YSByZWZlcmVuY2UgaW5zdHJ1Y3Rpb24gKi8KLSAgZGlzX2RyZWYyCQkJLyogVHdvIGRhdGEgcmVmZXJlbmNlcyBpbiBpbnN0cnVjdGlvbiAqLwotfTsKLQotLyogVGhpcyBzdHJ1Y3QgaXMgcGFzc2VkIGludG8gdGhlIGluc3RydWN0aW9uIGRlY29kaW5nIHJvdXRpbmUsIAotICAgYW5kIGlzIHBhc3NlZCBiYWNrIG91dCBpbnRvIGVhY2ggY2FsbGJhY2suICBUaGUgdmFyaW91cyBmaWVsZHMgYXJlIHVzZWQKLSAgIGZvciBjb252ZXlpbmcgaW5mb3JtYXRpb24gZnJvbSB5b3VyIG1haW4gcm91dGluZSBpbnRvIHlvdXIgY2FsbGJhY2tzLAotICAgZm9yIHBhc3NpbmcgaW5mb3JtYXRpb24gaW50byB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2RlcnMgKHN1Y2ggYXMgdGhlCi0gICBhZGRyZXNzZXMgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyksIG9yIGZvciBwYXNzaW5nIGluZm9ybWF0aW9uCi0gICBiYWNrIGZyb20gdGhlIGluc3RydWN0aW9uIGRlY29kZXJzIHRvIHRoZWlyIGNhbGxlcnMuCi0KLSAgIEl0IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGl0IGlzIGZpcnN0IHBhc3NlZDsgdGhpcyBjYW4gYmUgZG9uZQotICAgYnkgaGFuZCwgb3IgdXNpbmcgb25lIG9mIHRoZSBpbml0aWFsaXphdGlvbiBtYWNyb3MgYmVsb3cuICAqLwotCi10eXBlZGVmIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvIHsKLSAgZnByaW50Zl9mdHlwZSBmcHJpbnRmX2Z1bmM7Ci0gIFBUUiBzdHJlYW07Ci0gIFBUUiBhcHBsaWNhdGlvbl9kYXRhOwotCi0gIC8qIFRhcmdldCBkZXNjcmlwdGlvbi4gIFdlIGNvdWxkIHJlcGxhY2UgdGhpcyB3aXRoIGEgcG9pbnRlciB0byB0aGUgYmZkLAotICAgICBidXQgdGhhdCB3b3VsZCByZXF1aXJlIG9uZS4gIFRoZXJlIGN1cnJlbnRseSBpc24ndCBhbnkgc3VjaCByZXF1aXJlbWVudAotICAgICBzbyB0byBhdm9pZCBpbnRyb2R1Y2luZyBvbmUgd2UgcmVjb3JkIHRoZXNlIGV4cGxpY2l0bHkuICAqLwotICAvKiBUaGUgYmZkX2ZsYXZvdXIuICBUaGlzIGNhbiBiZSBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ci4gICovCi0gIGVudW0gYmZkX2ZsYXZvdXIgZmxhdm91cjsKLSAgLyogVGhlIGJmZF9hcmNoIHZhbHVlLiAgKi8KLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIC8qIFRoZSBiZmRfbWFjaCB2YWx1ZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFjaDsKLSAgLyogRW5kaWFubmVzcyAoZm9yIGJpLWVuZGlhbiBjcHVzKS4gIE1vbm8tZW5kaWFuIGNwdXMgY2FuIGlnbm9yZSB0aGlzLiAgKi8KLSAgZW51bSBiZmRfZW5kaWFuIGVuZGlhbjsKLQotICAvKiBBbiBhcnJheSBvZiBwb2ludGVycyB0byBzeW1ib2xzIGVpdGhlciBhdCB0aGUgbG9jYXRpb24gYmVpbmcgZGlzYXNzZW1ibGVkCi0gICAgIG9yIGF0IHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgZGlzYXNzZW1ibGVkLiAgVGhlIGFycmF5IGlzIHNvcnRlZAotICAgICBzbyB0aGF0IHRoZSBmaXJzdCBzeW1ib2wgaXMgaW50ZW5kZWQgdG8gYmUgdGhlIG9uZSB1c2VkLiAgVGhlIG90aGVycyBhcmUKLSAgICAgcHJlc2VudCBmb3IgYW55IG1pc2MuIHB1cnBvc2VzLiAgVGhpcyBpcyBub3Qgc2V0IHJlbGlhYmx5LCBidXQgaWYgaXQgaXMKLSAgICAgbm90IE5VTEwsIGl0IGlzIGNvcnJlY3QuICAqLwotICBhc3ltYm9sICoqc3ltYm9sczsKLSAgLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYXJyYXkuICAqLwotICBpbnQgbnVtX3N5bWJvbHM7Ci0KLSAgLyogRm9yIHVzZSBieSB0aGUgZGlzYXNzZW1ibGVyLgotICAgICBUaGUgdG9wIDE2IGJpdHMgYXJlIHJlc2VydmVkIGZvciBwdWJsaWMgdXNlIChhbmQgYXJlIGRvY3VtZW50ZWQgaGVyZSkuCi0gICAgIFRoZSBib3R0b20gMTYgYml0cyBhcmUgZm9yIHRoZSBpbnRlcm5hbCB1c2Ugb2YgdGhlIGRpc2Fzc2VtYmxlci4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0jZGVmaW5lIElOU05fSEFTX1JFTE9DCTB4ODAwMDAwMDAKLSAgUFRSIHByaXZhdGVfZGF0YTsKLQotICAvKiBGdW5jdGlvbiB1c2VkIHRvIGdldCBieXRlcyB0byBkaXNhc3NlbWJsZS4gIE1FTUFERFIgaXMgdGhlCi0gICAgIGFkZHJlc3Mgb2YgdGhlIHN0dWZmIHRvIGJlIGRpc2Fzc2VtYmxlZCwgTVlBRERSIGlzIHRoZSBhZGRyZXNzIHRvCi0gICAgIHB1dCB0aGUgYnl0ZXMgaW4sIGFuZCBMRU5HVEggaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLgotICAgICBJTkZPIGlzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdC4KLSAgICAgUmV0dXJucyBhbiBlcnJubyB2YWx1ZSBvciAwIGZvciBzdWNjZXNzLiAgKi8KLSAgaW50ICgqcmVhZF9tZW1vcnlfZnVuYykKLSAgICBQQVJBTVMgKChiZmRfdm1hIG1lbWFkZHIsIGJmZF9ieXRlICpteWFkZHIsIGludCBsZW5ndGgsCi0JICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykpOwotCi0gIC8qIEZ1bmN0aW9uIHdoaWNoIHNob3VsZCBiZSBjYWxsZWQgaWYgd2UgZ2V0IGFuIGVycm9yIHRoYXQgd2UgY2FuJ3QKLSAgICAgcmVjb3ZlciBmcm9tLiAgU1RBVFVTIGlzIHRoZSBlcnJubyB2YWx1ZSBmcm9tIHJlYWRfbWVtb3J5X2Z1bmMgYW5kCi0gICAgIE1FTUFERFIgaXMgdGhlIGFkZHJlc3MgdGhhdCB3ZSB3ZXJlIHRyeWluZyB0byByZWFkLiAgSU5GTyBpcyBhCi0gICAgIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QuICAqLwotICB2b2lkICgqbWVtb3J5X2Vycm9yX2Z1bmMpCi0gICAgUEFSQU1TICgoaW50IHN0YXR1cywgYmZkX3ZtYSBtZW1hZGRyLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykpOwotCi0gIC8qIEZ1bmN0aW9uIGNhbGxlZCB0byBwcmludCBBRERSLiAgKi8KLSAgdm9pZCAoKnByaW50X2FkZHJlc3NfZnVuYykKLSAgICBQQVJBTVMgKChiZmRfdm1hIGFkZHIsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKSk7Ci0KLSAgLyogRnVuY3Rpb24gY2FsbGVkIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIHN5bWJvbCBhdCB0aGUgZ2l2ZW4gQUREUi4KLSAgICAgSWYgdGhlcmUgaXMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDEsIG90aGVyd2lzZSBpdCByZXR1cm5zIDAuCi0gICAgIFRoaXMgaXMgdXNlZCBieSBwb3J0cyB3aGljaCBzdXBwb3J0IGFuIG92ZXJsYXkgbWFuYWdlciB3aGVyZQotICAgICB0aGUgb3ZlcmxheSBudW1iZXIgaXMgaGVsZCBpbiB0aGUgdG9wIHBhcnQgb2YgYW4gYWRkcmVzcy4gIEluCi0gICAgIHNvbWUgY2lyY3Vtc3RhbmNlcyB3ZSB3YW50IHRvIGluY2x1ZGUgdGhlIG92ZXJsYXkgbnVtYmVyIGluIHRoZQotICAgICBhZGRyZXNzLCAobm9ybWFsbHkgYmVjYXVzZSB0aGVyZSBpcyBhIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGgKLSAgICAgdGhhdCBhZGRyZXNzKSwgYnV0IHNvbWV0aW1lcyB3ZSB3YW50IHRvIG1hc2sgb3V0IHRoZSBvdmVybGF5IGJpdHMuICAqLwotICBpbnQgKCogc3ltYm9sX2F0X2FkZHJlc3NfZnVuYykKLSAgICBQQVJBTVMgKChiZmRfdm1hIGFkZHIsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbykpOwotCi0gIC8qIFRoZXNlIGFyZSBmb3IgYnVmZmVyX3JlYWRfbWVtb3J5LiAgKi8KLSAgYmZkX2J5dGUgKmJ1ZmZlcjsKLSAgYmZkX3ZtYSBidWZmZXJfdm1hOwotICBpbnQgYnVmZmVyX2xlbmd0aDsKLQotICAvKiBUaGlzIHZhcmlhYmxlIG1heSBiZSBzZXQgYnkgdGhlIGluc3RydWN0aW9uIGRlY29kZXIuICBJdCBzdWdnZXN0cwotICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBvYmpkdW1wIHNob3VsZCBkaXNwbGF5IG9uIGEgc2luZ2xlIGxpbmUuICBJZgotICAgICAgdGhlIGluc3RydWN0aW9uIGRlY29kZXIgc2V0cyB0aGlzLCBpdCBzaG91bGQgYWx3YXlzIHNldCBpdCB0bwotICAgICAgdGhlIHNhbWUgdmFsdWUgaW4gb3JkZXIgdG8gZ2V0IHJlYXNvbmFibGUgbG9va2luZyBvdXRwdXQuICAqLwotICBpbnQgYnl0ZXNfcGVyX2xpbmU7Ci0KLSAgLyogdGhlIG5leHQgdHdvIHZhcmlhYmxlcyBjb250cm9sIHRoZSB3YXkgb2JqZHVtcCBkaXNwbGF5cyB0aGUgcmF3IGRhdGEgKi8KLSAgLyogRm9yIGV4YW1wbGUsIGlmIGJ5dGVzX3Blcl9saW5lIGlzIDggYW5kIGJ5dGVzX3Blcl9jaHVuayBpcyA0LCB0aGUgKi8KLSAgLyogb3V0cHV0IHdpbGwgbG9vayBsaWtlIHRoaXM6Ci0gICAgIDAwOiAgIDAwMDAwMDAwIDAwMDAwMDAwCi0gICAgIHdpdGggdGhlIGNodW5rcyBkaXNwbGF5ZWQgYWNjb3JkaW5nIHRvICJkaXNwbGF5X2VuZGlhbiIuICovCi0gIGludCBieXRlc19wZXJfY2h1bms7Ci0gIGVudW0gYmZkX2VuZGlhbiBkaXNwbGF5X2VuZGlhbjsKLQotICAvKiBSZXN1bHRzIGZyb20gaW5zdHJ1Y3Rpb24gZGVjb2RlcnMuICBOb3QgYWxsIGRlY29kZXJzIHlldCBzdXBwb3J0Ci0gICAgIHRoaXMgaW5mb3JtYXRpb24uICBUaGlzIGluZm8gaXMgc2V0IGVhY2ggdGltZSBhbiBpbnN0cnVjdGlvbiBpcwotICAgICBkZWNvZGVkLCBhbmQgaXMgb25seSB2YWxpZCBmb3IgdGhlIGxhc3Qgc3VjaCBpbnN0cnVjdGlvbi4KLQotICAgICBUbyBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGRlY29kZXIgc3VwcG9ydHMgdGhpcyBpbmZvcm1hdGlvbiwgc2V0Ci0gICAgIGluc25faW5mb192YWxpZCB0byAwLCBkZWNvZGUgYW4gaW5zdHJ1Y3Rpb24sIHRoZW4gY2hlY2sgaXQuICAqLwotCi0gIGNoYXIgaW5zbl9pbmZvX3ZhbGlkOwkJLyogQnJhbmNoIGluZm8gaGFzIGJlZW4gc2V0LiAqLwotICBjaGFyIGJyYW5jaF9kZWxheV9pbnNuczsJLyogSG93IG1hbnkgc2VxdWVudGlhbCBpbnNuJ3Mgd2lsbCBydW4gYmVmb3JlCi0JCQkJICAgYSBicmFuY2ggdGFrZXMgZWZmZWN0LiAgKDAgPSBub3JtYWwpICovCi0gIGNoYXIgZGF0YV9zaXplOwkJLyogU2l6ZSBvZiBkYXRhIHJlZmVyZW5jZSBpbiBpbnNuLCBpbiBieXRlcyAqLwotICBlbnVtIGRpc19pbnNuX3R5cGUgaW5zbl90eXBlOwkvKiBUeXBlIG9mIGluc3RydWN0aW9uICovCi0gIGJmZF92bWEgdGFyZ2V0OwkJLyogVGFyZ2V0IGFkZHJlc3Mgb2YgYnJhbmNoIG9yIGRyZWYsIGlmIGtub3duOwotCQkJCSAgIHplcm8gaWYgdW5rbm93bi4gICovCi0gIGJmZF92bWEgdGFyZ2V0MjsJCS8qIFNlY29uZCB0YXJnZXQgYWRkcmVzcyBmb3IgZHJlZjIgKi8KLQotfSBkaXNhc3NlbWJsZV9pbmZvOwotCi0MCi0vKiBTdGFuZGFyZCBkaXNhc3NlbWJsZXJzLiAgRGlzYXNzZW1ibGUgb25lIGluc3RydWN0aW9uIGF0IHRoZSBnaXZlbgotICAgdGFyZ2V0IGFkZHJlc3MuICBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHByb2Nlc3NlZC4gICovCi10eXBlZGVmIGludCAoKmRpc2Fzc2VtYmxlcl9mdHlwZSkKLSAgICAgUEFSQU1TKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotZXh0ZXJuIGludCBwcmludF9pbnNuX2JpZ19taXBzCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2xpdHRsZV9taXBzCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faTM4Nl9hdHQJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faTM4Nl9pbnRlbAlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX202OGsJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fejgwMDEJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fejgwMDIJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faDgzMDAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faDgzMDBoCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2g4MzAwcwkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9oODUwMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9hbHBoYQkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBkaXNhc3NlbWJsZXJfZnR5cGUgYXJjX2dldF9kaXNhc3NlbWJsZXIgUEFSQU1TICgoaW50LCBpbnQpKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9iaWdfYXJtCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2xpdHRsZV9hcm0JUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9zcGFyYwkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9iaWdfYTI5awkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9saXR0bGVfYTI5awlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2k5NjAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fc2gJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fc2hsCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2hwcGEJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fZnIzMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9tMzJyCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX204OGsJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbWNvcmUJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbW4xMDIwMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9tbjEwMzAwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX25zMzJrCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2JpZ19wb3dlcnBjCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbGl0dGxlX3Bvd2VycGMJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9yczYwMDAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fdzY1CQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2QxMHYJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fZDMwdgkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl92ODUwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3RpYzMwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3ZheAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl90aWM4MAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLQotLyogRmV0Y2ggdGhlIGRpc2Fzc2VtYmxlciBmb3IgYSBnaXZlbiBCRkQsIGlmIHRoYXQgc3VwcG9ydCBpcyBhdmFpbGFibGUuICAqLwotZXh0ZXJuIGRpc2Fzc2VtYmxlcl9mdHlwZSBkaXNhc3NlbWJsZXIJUEFSQU1TICgoYmZkICopKTsKLQotDAotLyogVGhpcyBibG9jayBvZiBkZWZpbml0aW9ucyBpcyBmb3IgcGFydGljdWxhciBjYWxsZXJzIHdobyByZWFkIGluc3RydWN0aW9ucwotICAgaW50byBhIGJ1ZmZlciBiZWZvcmUgY2FsbGluZyB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2Rlci4gICovCi0KLS8qIEhlcmUgaXMgYSBmdW5jdGlvbiB3aGljaCBjYWxsZXJzIG1heSB3aXNoIHRvIHVzZSBmb3IgcmVhZF9tZW1vcnlfZnVuYy4KLSAgIEl0IGdldHMgYnl0ZXMgZnJvbSBhIGJ1ZmZlci4gICovCi1leHRlcm4gaW50IGJ1ZmZlcl9yZWFkX21lbW9yeQotICBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqLCBpbnQsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotLyogVGhpcyBmdW5jdGlvbiBnb2VzIHdpdGggYnVmZmVyX3JlYWRfbWVtb3J5LgotICAgSXQgcHJpbnRzIGEgbWVzc2FnZSB1c2luZyBpbmZvLT5mcHJpbnRmX2Z1bmMgYW5kIGluZm8tPnN0cmVhbS4gICovCi1leHRlcm4gdm9pZCBwZXJyb3JfbWVtb3J5IFBBUkFNUyAoKGludCwgYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0KLS8qIEp1c3QgcHJpbnQgdGhlIGFkZHJlc3MgaW4gaGV4LiAgVGhpcyBpcyBpbmNsdWRlZCBmb3IgY29tcGxldGVuZXNzIGV2ZW4KLSAgIHRob3VnaCBib3RoIEdEQiBhbmQgb2JqZHVtcCBwcm92aWRlIHRoZWlyIG93biAodG8gcHJpbnQgc3ltYm9saWMKLSAgIGFkZHJlc3NlcykuICAqLwotZXh0ZXJuIHZvaWQgZ2VuZXJpY19wcmludF9hZGRyZXNzCi0gIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotLyogQWx3YXlzIHRydWUuICAqLwotZXh0ZXJuIGludCBnZW5lcmljX3N5bWJvbF9hdF9hZGRyZXNzCi0gIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotLyogTWFjcm8gdG8gaW5pdGlhbGl6ZSBhIGRpc2Fzc2VtYmxlX2luZm8gc3RydWN0LiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkCi0gICBieSBhbGwgYXBwbGljYXRpb25zIGNyZWF0aW5nIHN1Y2ggYSBzdHJ1Y3QuICAqLwotI2RlZmluZSBJTklUX0RJU0FTU0VNQkxFX0lORk8oSU5GTywgU1RSRUFNLCBGUFJJTlRGX0ZVTkMpIFwKLSAgKElORk8pLmZsYXZvdXIgPSBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwgXAotICAoSU5GTykuYXJjaCA9IGJmZF9hcmNoX3Vua25vd24sIFwKLSAgKElORk8pLm1hY2ggPSAwLCBcCi0gIChJTkZPKS5lbmRpYW4gPSBCRkRfRU5ESUFOX1VOS05PV04sIFwKLSAgSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0goSU5GTywgU1RSRUFNLCBGUFJJTlRGX0ZVTkMpCi0KLS8qIENhbGwgdGhpcyBtYWNybyB0byBpbml0aWFsaXplIG9ubHkgdGhlIGludGVybmFsIHZhcmlhYmxlcyBmb3IgdGhlCi0gICBkaXNhc3NlbWJsZXIuICBBcmNoaXRlY3R1cmUgZGVwZW5kZW50IHRoaW5ncyBzdWNoIGFzIGJ5dGUgb3JkZXIsIG9yIG1hY2hpbmUKLSAgIHZhcmlhbnQgYXJlIG5vdCB0b3VjaGVkIGJ5IHRoaXMgbWFjcm8uICBUaGlzIG1ha2VzIHRoaW5ncyBtdWNoIGVhc2llciBmb3IKLSAgIEdEQiB3aGljaCBtdXN0IGluaXRpYWxpemUgdGhlc2UgdGhpbmdzIHNlcGVyYXRseS4gICovCi0KLSNkZWZpbmUgSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0goSU5GTywgU1RSRUFNLCBGUFJJTlRGX0ZVTkMpIFwKLSAgKElORk8pLmZwcmludGZfZnVuYyA9IChmcHJpbnRmX2Z0eXBlKShGUFJJTlRGX0ZVTkMpLCBcCi0gIChJTkZPKS5zdHJlYW0gPSAoUFRSKShTVFJFQU0pLCBcCi0gIChJTkZPKS5zeW1ib2xzID0gTlVMTCwgXAotICAoSU5GTykubnVtX3N5bWJvbHMgPSAwLCBcCi0gIChJTkZPKS5idWZmZXIgPSBOVUxMLCBcCi0gIChJTkZPKS5idWZmZXJfdm1hID0gMCwgXAotICAoSU5GTykuYnVmZmVyX2xlbmd0aCA9IDAsIFwKLSAgKElORk8pLnJlYWRfbWVtb3J5X2Z1bmMgPSBidWZmZXJfcmVhZF9tZW1vcnksIFwKLSAgKElORk8pLm1lbW9yeV9lcnJvcl9mdW5jID0gcGVycm9yX21lbW9yeSwgXAotICAoSU5GTykucHJpbnRfYWRkcmVzc19mdW5jID0gZ2VuZXJpY19wcmludF9hZGRyZXNzLCBcCi0gIChJTkZPKS5zeW1ib2xfYXRfYWRkcmVzc19mdW5jID0gZ2VuZXJpY19zeW1ib2xfYXRfYWRkcmVzcywgXAotICAoSU5GTykuZmxhZ3MgPSAwLCBcCi0gIChJTkZPKS5ieXRlc19wZXJfbGluZSA9IDAsIFwKLSAgKElORk8pLmJ5dGVzX3Blcl9jaHVuayA9IDAsIFwKLSAgKElORk8pLmRpc3BsYXlfZW5kaWFuID0gQkZEX0VORElBTl9VTktOT1dOLCBcCi0gIChJTkZPKS5pbnNuX2luZm9fdmFsaWQgPSAwCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKERJU19BU01fSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL0NoYW5nZUxvZyBiL2luY2x1ZGUvZWxmL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ0MzU1Yi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw3MzMgKzAsMCBAQAotMTk5OS0wNS0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUuaCAoUl9NQ09SRV9DT1BZKTogRGVmaW5lLgotCShSX01DT1JFX0dMT0JfREFUKTogRGVmaW5lLgotCShSX01DT1JFX0pVTVBfU0xPVCk6IERlZmluZS4KLQotMTk5OS0wNS0xNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUuaCAoUl9NQ09SRV9SRUxBVElWRSk6IERlZmluZS4KLQotOTk5LTA1LTA1ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBtNjhrLmggKEVGX0NQVTMyKTogRGVmaW5lLgotIAotMTk5OS0wNC0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MtbWFjcm9zLmggKFNUQVJUX1JFTE9DX05VTUJFUlMpOiBQcmVwZW5kIGFuIHVuZGVyc2NvcmUgdG8KLQlmYWtlIHJlbG9jIGVudHJ5IG5hbWUgKGlmIHBvc3NpYmxlKSwgaW4gb3JkZXIgdG8gYXZvaWQgY29uZmxpY3RzCi0Jd2l0aCB0eXBlZGVmcyBvZiB0aGUgc2FtZSBuYW1lLgotCi0xOTk5LTA0LTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFRl9NSVBTXzMyQklUTU9ERSk6IE5ldy4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUuaDogTmV3IGhlYWRlciBmaWxlLiAgRGVmaW5lcyBmb3IgTW90b3JvbGxhJ3MgTUNvcmUKLQlwcm9jZXNzb3IuIAotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogQWRkIG5ldyBjb25zdGFudHMgZGVmaW5lZCBpbjogIlN5c3RlbSBWIEFwcGxpY2F0aW9uCi0JQmluYXJ5IEludGVyZmFjZSAtIERSQUZUIC0gQXByaWwgMjksIDE5OTgiIGZvdW5kIGF0IHRoZSB3ZWIgc2l0ZTogCi0JaHR0cDovL3d3dy5zY28uY29tL2RldmVsb3Blci9nYWJpL2NvbnRlbnRzLmh0bWwKLQotCShFTV9NTUEpOiBSZW1vdmVkLiAgUmVwbGFjZWQgd2l0aCBFTV9NQ09SRSBhcyBNb3Rvcm9sbGEgb3duIHRoaXMKLQl2YWx1ZS4gCi0KLTE5OTktMDMtMzEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLW1hY3Jvcy5oOiBGaXhlZCB0byBub3QgZ2VuZXJhdGUgYW4gZW51bSB3aXRoIGEgdHJhaWxpbmcKLQljb21tYS4gCi0KLTE5OTktMDMtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVfTUlQU19NQUNIXzUwMDApOiBOZXcuCi0KLTE5OTktMDMtMTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogQWRkIGRlZmluaXRpb25zIGZvciBhIGZldyBtb3JlIFNvbGFyaXMgRUxGIGV4dGVuc2lvbnMuCi0KLVRodSBGZWIgMTggMTg6NTg6MjYgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHRlcm5hbC5oOiBPbmx5IHVzZSBhdHRyaWJ1dGUgaWYgX19HTlVDX18gaXMgZGVmaW5lZC4KLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVBhdGNoIHN1Ym1pdHRlZCBieTogU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAY29yZWxjb21wdXRlci5jb20+Ci0KLQkqIGVsZi9leHRlcm5hbC5oOiBzdHJ1Y3QgRWxmX0V4dGVybmFsX1ZlcnN5bSBtdXN0IGJlIHBhY2tlZCBvbgotCUFSTS4gIENvZGUgdXNlcyBzaXplb2YoRWxmX0V4dGVybmFsX1ZlcnN5bSkgYW5kIGFzc3VtZXMgaXQgaXMKLQllcXVhbCB0byBzaXplb2YoY2hhclsyXSkuICBSZXBvcnRlZCBieSBKaW0gUGljayA8amltQGppbXBpY2suY29tPgotCi0xOTk5LTAyLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkd2FyZjIuaCAoRFdBUkYyX0V4dGVybmFsX0FSYW5nZSk6IE5ldyBzdHJ1Y3R1cmUuCi0JKERXQVJGMl9JbnRlcm5hbF9BUmFuZ2UpOiBOZXcgc3RydWN0dXJlLgotCi1Nb24gRmViICAxIDExOjMzOjU2IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLmg6ICBSZW51bWJlciByZWxvY3MgdG8gY29uZm9ybSB0byBzdGFuZGFyZC4KLSAgICAgICAgKEVGX05FV19BQkkpOiAgRGVmaW5lLgotICAgICAgICAoRUZfT0xEX0FCSSk6ICBEZWZpbmUuCi0gICAgICAgICogYXJtLW9hYmkuaDogIE5ldyBmaWxlLgotCi0xOTk5LTAxLTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBmcjMwLmg6IEFkZCBSX0ZSMzBfR05VX1ZUe0lOSEVSSVQsRU5UUll9IHJlbG9jcy4KLQotMTk5OS0wMS0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmg6IEFkZCB0eXBlZGVmcyBmb3Igc3RydWN0dXJlcyBmb3VuZCBpbiBkd2FyZjIgc2VjdGlvbnMuCi0KLTE5OTgtMTItMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVfTUlQU19NQUNIXzQxMTEpOiBOZXcuCi0KLTE5OTgtMTItMTUgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVGX01JUFNfQUJJLEVfTUlQU19BQklfTzMyLEVfTUlQU19BQklfTzY0LAotCUVfTUlQU19BQklfRUFCSTMyLEVfTUlQU19BQklfRUFCSTY0KToKLQotMTk5OC0xMi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZnIzMC5oOiBBZGQgUl9GUjMwXzQ4IHJlbG9jLgotCi0xOTk4LTEyLTAyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGQgZXh0ZXJuYWwgZGF0YSB0eXBlIGZvciBjb25mbGljdCBzZWN0aW9uLgotCi0JKiBtaXBzLmg6IEFkZCBtb3JlIExMXyogb3B0aW9ucyBmcm9tIElyaXggNi41LgotCi0JKiBtaXBzLmg6IEFkZCBSX01JUFNfSkFMUiBhbmQgYWRqdXN0IFJfTUlQU19tYXggYXBwcm9wcmlhdGVseS4KLQotVHVlIE5vdiAxMCAxNToxMjoyOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX0ZSMzApOiBSZWR1Y2UgdG8gYSAxNiBiaXQgdmFsdWUuCi0KLVR1ZSBOb3YgMTAgMTU6MTc6MjggMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBkMTB2Lmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KLQotV2VkIE5vdiAgNCAxNTo1Njo1MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX0ZSMzApOiBOZXcgbWFjaGluZSBudW1iZXIuCi0KLQkqIGZyMzAuaDogTmV3IGZpbGU6IERlZmluaXRpb25zIGZvciB0aGUgRlIzMC4KLQotRnJpIE9jdCAzMCAxMTo1NDoxNSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICBGcm9tIFBoaWxpcCBCbHVuZGVsbCA8cGJAbmV4dXMuY28udWs+OgotICAgICAgICAqIGFybS5oIChSX0FSTV9DT1BZLCBldCBhbC4pOiBOZXcgcmVsb2NzLCB1c2VkIGJ5IExpbnV4IGZvciBQSUMuCi0gICAgICAgIChFRl9BTElHTjgpOiBOZXcgZmxhZy4KLQotVHVlIE9jdCAyMCAxMToxOTo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChOVF9MV1BTVEFUVVMpOiBDbG9zZSBjb21tZW50IGFjY2lkZW50YWxseSBsZWZ0IG9wZW4uCi0KLU1vbiBPY3QgMTkgMjA6MjQ6MTEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzaC5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCi0KLU1vbiBPY3QgMTkgMDE6NDQ6NDIgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoTlRfUFNUQVRVUywgTlRfRlBSRUdTLCBOVF9QU0lORk8sCi0gCU5UX0xXUFNUQVRVUyxOVF9MV1BTSU5GTyk6IGFkZGVkLgotCSogaW50ZXJuYWwuaCAoRWxmX0ludGVybmFsX05vdGUpOiBuZXcgc3RydWN0dXJlIG1lbWJlcnMuCi0KLUZyaSBPY3QgMTYgMTQ6MTE6MjUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBtMzJyLmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KLQotVHVlIE9jdCAgNiAwOToyMjoyMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHNwYXJjLmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KLQotTW9uIE9jdCAgNSAwOTozOToyMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHY4NTAuaDogIEFkZCB2dGFibGUgcmVsb2NzLgotCi1TdW4gT2N0ICA0IDIxOjE3OjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oIChSXzM4Nl9tYXgpOiBDaGFuZ2UgZnJvbSAyNTIgdG8gMjQuCi0KLU1vbiBTZXAgMjEgMTI6MjQ6NDQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBpMzg2Lmg6ICBDaGFuZ2UgdnRhYmxlIHJlbG9jIG51bWJlcnMuCi0KLVN1biBTZXAgMjAgMDA6NTQ6MjIgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGsuaDogQWRkIHZ0YWJsZSByZWxvY3MgYW5kIFJfNjhLX21heC4KLQotVHVlIFNlcCAxNSAwOTo1Njo0OSBDRFQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGFybS5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCi0KLU1vbiBBdWcgMzEgMTE6MjU6MjcgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBhcm0uaDogIERlZmluZSBTVFRfQVJNX1RGVU5DLiAgUmVtb3ZlIFNUX1RIVU1CX3h4eHgKLSAgICAgICAgZGVmaW5pdGlvbnMuCi0KLVNhdCBBdWcgMjkgMjI6MjU6NTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBBZGQgdnRhYmxlIHJlbG9jcy4KLQotMTk5OC0wOC0yNSAxNjo0MiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oOiBBZGQgU1lNSU5GT18qIG1hY3JvcyB0byBhY2Nlc3MgRWxmKl9TeW1pbmZvIGluZm9ybWF0aW9uLgotCi0JKiBleHRlcm5hbC5oOiBBZGQgRWxmX0V4dGVybmFsX1N5bWluZm8gZGVmaW5pdGlvbi4KLQotCSogaW50ZXJuYWwuaDogQWRkIEVsZl9JbnRlcm5hbF9TeW1pbmZvLCBFbGYzMl9JbnRlcm5hbF9TeW1pbmZvLAotCWFuZCBFbGY2NF9TeW1pbmZvIGRlZmluaXRpb25zLgotCi1TdW4gQXVnICA5IDIwOjI2OjQ5IENEVCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICogYXJtLmg6ICBBZGQgU1RfVEhVTUIgZGVmaW5pdGlvbnMuCi0KLVdlZCBBdWcgIDUgMTU6NTI6MzUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLmg6IEFkZCBFTEYgaGVhZGVyIGZsYWdzIHRvIHNwZWNpZnkgY29tcGlsZSB0aW1lIG9wdGluczoKLQlFRl9JTlRFUldPUks6IE5ldyBmbGFnLgotCUVGX0FQQ1NfMjY6IE5ldyBmbGFnLgotCUVGX0FQQ1NfRkxPQVQ6IE5ldyBmbGFnLgotCUVGX1BJQzogTmV3IGZsYWcuCi0KLTE5OTgtMDctMzEgMjE6MjggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IEFkZCBtaXNzaW5nIFJIRl8qIGNvbnN0YW50cy4KLQotRnJpIEp1bCAzMSAxMDowMTo0MCAxOTk4IENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLmg6IEFkZCBSX0FSTV9USE1fUEM5IHJlbG9jYXRpb24uCi0KLTE5OTgtMDctMzAgMTY6MjUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogQWRkIG5ldyBEVF8qIGVudHJpZXMgYW5kIHRoZXJlIGZsYWcgbWFjcm9zIGZyb20gU29sYXJpcy4KLQotVHVlIEp1bCAyOCAxODoxNDowNyAxOTk4ICBTdGFuIENveCAgPHNjb3hAZXF1aW5veC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oOiAoUl9TUEFSQ19SRVYzMik6IEFkZGVkIGZvciBsaXR0bGUgZW5kaWFuIGRhdGEgZS5nLiBzcGFyYyA4NnguCi0KLUZyaSBKdWwgMjQgMTE6MjI6MDYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmg6IEFkZCBSX01OMTAzMDBfMjQgcmVsb2NhdGlvbi4KLQotMTk5OC0wNy0yNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQWRkIE1JUFM2NCByZWxvY2F0aW9uIG5hbWVzIGFuZCB2YWx1ZXMuCi0KLVdlZCBKdWwgMjIgMTk6Mjk6MDAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBhcm0uaDogUmVuYW1lIHJlbG9jYXRpb25zLgotCi0xOTk4LTA3LTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcHBjLmg6IERlZmluZSBlbnVtIGFzIGVsZl9wcGNfcmVsb2NfdHlwZS4KLQotV2VkIEp1bCAyMiAxNjoyMjoxMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy1tYWNyb3MuaDogTmV3IGZpbGUuICBQcm92aWRlcyByZWxvY2F0aW9uIG1hY3JvczoKLQlTVEFSVF9SRUxPQ19OVU1CRVJTLCBSRUxPQ19OVU1CRVIsIEZBS0VfUkVMT0MsIEVNUFRZX1JFTE9DIGFuZAotCUVORF9SRUxPQ19OVU1CRVJTIHVzZWQgYnkgb3RoZXIgZWxmIGhlYWRlciBmaWxlcy4KLQotCSogYWxwaGEuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogYXJjLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIGFybS5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBkMTB2Lmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIGQzMHYuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogaHBwYS5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBpMzg2Lmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIG0zMnIuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogbTY4ay5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBtaXBzLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIG1uMTAyMDAuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogbW4xMDMwMC5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBwcGMuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogc2guaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogc3BhcmMuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogdjg1MC5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0KLTE5OTgtMDctMjIgMTM6MDcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBtbjEwMzAwLmg6IFJld3JpdGUgcmVsb2NhdGlvbiBkZWZpbml0aW9uIHVzaW5nIG1hY3Jvcy4KLQkqIG1pcHMuaDogTGlrZXdpc2UuCi0JKiBwcGMuaDogTGlrZXdpc2UuCi0JKiBhbHBoYS5oOiBMaWtld2lzZS4KLQkqIGFybS5oOiBMaWtld2lzZS4KLQkqIGQxMHYuaDogTGlrZXdpc2UuCi0JKiBkMzB2Lmg6IExpa2V3aXNlLgotCSogbTMyci5oOiBMaWtld2lzZS4KLQkqIG02OGsuaDogTGlrZXdpc2UuCi0JKiBtbjEwMjAwLmg6IExpa2V3aXNlLgotCSogc2guaDogTGlrZXdpc2UuCi0JKiBzcGFyYy5oOiBMaWtld2lzZS4KLQotMTk5OC0wNy0yMSAxMzowNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGFybS5oOiBOZXcgZmlsZS4KLQkqIGQxMHYuaDogTmV3IGZpbGUuCi0JKiBkMzB2Lmg6IE5ldyBmaWxlLgotCSogaTM4Ni5oOiBOZXcgZmlsZS4KLQkqIG02OGsuaDogTmV3IGZpbGUuCi0JKiBtbjEwMjAwLmg6IE5ldyBmaWxlLgotCSogc2guaDogTmV3IGZpbGUuCi0KLQkqIG1pcHMuaDogQWRkIFJfTUlQU18qIGFuZCBTSFRfTUlQU18qIGVudHJpZXMuCi0KLQkqIG1uMTAzMDAuaDogQWRkIFJfTU4xMDMwMF8qIGVudHJpZXMuCi0KLQkqIHBwYy5oOiBBZGQgUl9QUENfKiBlbnRyaWVzLgotCi0xOTk4LTA3LTIwIDA3OjExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGQgT0RLXyosIE9FWF8qLCBPUEFEXyosIE9IV18qLCBhbmQgT0dQXyogY29uc3RhbnRzLgotCURlZmluZSBFbGYzMl9FeHRlcm5hbF9MaWIuCi0KLTE5OTgtMDctMTkgMTU6MjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKFBUX01JUFNfT1BUSU9OUyk6IE5ldyBzeW1ib2wuCi0JQWRkIGxvdHMgb2YgRFRfTUlQU18qIHN5bWJvbHMuCi0KLUZyaSBKdW4gMjYgMTA6NDY6MzUgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmg6IE5ldyBmaWxlLgotCi1UaHUgSnVuIDE4IDE5OjI3OjU2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV85NjAsIEVNX1Y4MDAsIEVNX0ZSMjAsIEVNX1JIMzIsIEVNX01NQSwKLQlFTV9PTERfQUxQSEEpOiBBZGQgdGhlc2UgY29uc3RhbnRzLgotCi1UaHUgSnVuIDExIDE3OjU5OjAxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV80ODYsIEVNX1MzNzApOiBBZGQgdGhlc2UgY29uc3RhbnRzLgotCi1UdWUgSnVuICA5IDA5OjM1OjI5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9BUk0pOiBBZGQgdGhpcyBjb25zdGFudC4KLQotV2VkIE1heSAgNiAwOTo0NTozMCAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFRl9NSVBTX01BQ0gsRV9NSVBTX01BQ0hfKik6IEFkZGVkLgotCi1TYXQgQXByIDI1IDE4OjM1OjA2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLmggKFNUT19BTFBIQV9OT1BWLCBTVE9fQUxQSEFfU1REX0dQTE9BRCk6IE5ldy4KLQotV2VkIEFwciAxNSAxNTo0Mjo0NSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fU1BBUkM2NCk6IE1vdmUgYW5kIHJlbmFtZSB0byBFTV9PTERfU1BBUkNWOS4KLQkoRU1fU1BBUkNWOSk6IE5ldy4gIFRoaXMgaXMgdGhlIG9mZmljaWFsIEFCSSBuYW1lIGFuZCBudW1iZXIuCi0KLVNhdCBGZWIgMjggMTc6MDQ6NDEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEuaCAoRUZfQUxQSEFfMzJCSVQsIEVGX0FMUEhBX0NBTlJFTEFYKTogTmV3LgotCi1Nb24gRGVjIDE1IDE1OjA3OjQ5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG0zMnIuaCAoRUZfTTMyUl9BUkNILCBFX00zMlJfQVJDSCk6IE5ldyBmbGFncyB0bwotCXNwZWNpZnkgbWFjaGluZSBhcmNoaXRlY3R1cmUuCi0KLUZyaSBEZWMgIDUgMTE6MjA6MDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oOiBOZXcgY29uc3RhbnRzOiBTSE5fVjg1MF9TQ09NTU9OLCBTSE5fVjg1MF9UQ09NTU9OLAotCVNITl9WODUwX1pDT01NT04sIFNIVF9WODUwX1NDT01NT04sIFNIVF9WODUwX1RDT01NT04sCi0JU0hUX1Y4NTBfWkNPTU1PTiB0byBoYW5kbGUgdjg1MCBjb21tb24gc2VjdGlvbnMuCi0JZW51bSByZWxvY190eXBlIHJlbmFtZWQgdG8gdjg1MF9yZWxvY190eXBlIHRvIGF2b2lkIG5hbWUKLQljb25mbGljdC4KLQotVGh1IE9jdCAyMyAxMzo1NToyNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChlbnVtIGVsZl9zcGFyY19yZWxvY190eXBlKTogQWRkIFVBNjQgJiBVQTE2LgotCi1UaHUgT2N0IDIzIDAwOjQyOjA0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGRvdC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChEVF9TUEFSQ19SRUdJU1RFUik6IE5ldyBtYWNyby4KLQkoRFRfU1BBUkNfUExURk1UKTogSW4gc3VwcG9ydCBvZiBvbGQgc3BhcmM2NC1saW51eCAucGx0czsgd2lsbAotCWdvIGF3YXkgc29vbi4KLQotVHVlIFNlcCAzMCAxMzoyNjo1OCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChFRl9TUEFSQ19IQUxfUjEsIEVGX1NQQVJDX0VYVF9NQVNLKTogTmV3IG1hY3Jvcy4KLQkoRUZfU1BBUkNWOV97TU0sVFNPLFBTTyxSTU99KTogTmV3IG1hY3Jvcy4KLQkoU0hOX0JFRk9SRSxTSE5fQUZURVIpOiBOZXcgbWFjcm9zLgotCShTSEZfRVhDTFVERSxTSEZfT1JERVJFRCk6IE5ldyBtYWNyb3MuCi0JKFNUVF9SRUdJU1RFUik6IE5ldyBtYWNyby4KLQkoUl9TUEFSQ19HTE9CX0pNUCk6IERlbGV0ZWQsIGJ1dCBzbG90IHJlc2VydmVkLgotCShSX1NQQVJDX3tESVNQNjQsUExUNjQsSElYMjIsTE9YMTB9KTogTmV3IHJlbG9jYXRpb25zLgotCShSX1NQQVJDX3tINDQsTTQ0LEw0NCxSRUdJU1RFUn0pOiBOZXcgcmVsb2NhdGlvbnMuCi0JKEVMRjY0X1JfVFlQRV97REFUQSxJRCxJTkZPfSk6IE5ldyBtYWNyb3MuCi0KLVdlZCBTZXAgMTcgMTY6NDE6NDIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oOiBBZGQgUl9WODUwX0NBTExUXzZfN19PRkZTRVQgYW5kIFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQuCi0KLVR1ZSBTZXAgMTYgMTQ6MTY6MTcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChyZWxvY190eXBlKTogQWRkIFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VULgotCi1XZWQgU2VwICAzIDE1OjExOjE0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQ29ycmVjdCB0eXBvIGluIGNvbW1lbnQuCi0KLVdlZCBTZXAgIDMgMTE6MjU6NTcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChyZWxvY190eXBlKTogUmVtb3ZlIFJfVjg1MF8xNl9QQ1JFTC4KLQotVHVlIFNlcCAgMiAxNzo0MTowNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogUmVtb3ZlIG1hZ2ljIG51bWJlciBmb3IgVjg1MEUuCi0JKiBjb21tb24uaDogUmVtb3ZlIG1hZ2ljIG51bWJlciBmb3IgVjg1MEVBLgotCSogdjg1MC5oOiBBZGQgbmV3IGZsYWdzIGZvciBlX2ZsYWdzIGZpZWxkIGluIGVsZiBoZWFkZXIuCi0KLU1vbiBBdWcgMjUgMTY6MDY6NDcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19WODUwRSk6IGJhY2tlbmQgbWFnaWMgbnVtYmVyIGZvciB2ODUwZS4KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfVjg1MEVBKTogYmFja2VuZCBtYWdpYyBudW1iZXIgZm9yIHY4NTBlYS4KLQotTW9uIEF1ZyAxOCAxMTowNToyMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLmggKHJlbG9jX3R5cGUpOiBBZGQgMTYgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uCi0KLUZyaSBBdWcgMTUgMDU6MTA6MDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYXJjLmggKGVudW0gcmVsb2MpOiBNb3ZlIGhlcmUgZnJvbSBlbGYzMi1hcmMuYy4KLQotRnJpIEF1ZyAgOCAxNzowNToyOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhcmMuaDogTmV3IGZpbGUuCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX0FSQyk6IERlZmluZS4KLQotTW9uIEp1biAxNiAxNDo0NjoxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKEVsZl9JbnRlcm5hbF9FaGRyKTogQ2hhbmdlIGVfcGhvZmYgYW5kIGVfc2hvZmYgZnJvbQotCWJmZF9zaWduZWRfdm1hIHRvIGJmZF9zaXplX3R5cGUsIGFzIHRoZXkgYXJlIG5vdCBzaWduZWQuCi0KLVdlZCBNYXIgIDUgMTU6MzU6MjYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIG0zMnIuaCAoU0hGX00zMlJfQ0FOX1JFTEFYKTogRGVmaW5lLgotCi1Nb24gRmViIDI0IDE3OjQ5OjAxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXh0ZXJuYWwuaDogRHVtcCB0aGUgMzIvNjQgYml0IHNwZWNpZmljIGZvcm1zIG9mIHRoZSB2ZXJzaW9uCi0Jc3RydWN0dXJlcywgYW5kIGp1c3QgZGVmaW5lIHRoZW0gYXMgc2l6ZSBpbmRlcGVuZGVudC4KLQotCSogY29tbW9uLmggKFZFUlNZTV9ISURERU4sIFZFUlNZTV9WRVJTSU9OKTogRGVmaW5lLgotCi1GcmkgRmViIDIxIDEzOjAwOjM0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnIuaCAoZW51bSByZWxvY190eXBlKTogQWRkIFJfTTMyUl9TREExNi4KLQkoU0hOX00zMlJfU0NPTU1PTik6IERlZmluZS4KLQotV2VkIEZlYiAxOSAxNTozNTozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBleHRlcm5hbC5oLCBpbnRlcm5hbC5oLCBjb21tb24uaDogQWRkZWQgbmV3IHN0cnVjdHVyZXMgYW5kCi0JZGVmaW5pdGlvbnMgZm9yIEVMRiB2ZXJzaW9ucy4KLQotVHVlIEZlYiAxOCAxNzo0MDozNiAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19EMzBWKTogRGVmaW5lLgotCi1Nb24gSmFuIDI3IDExOjU0OjQ0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLmggKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBSX00zMlJfSEkxNl9bU1VdTE8sUl9NMzJSX0xPMTYuCi0KLUZyaSBKYW4gIDMgMTE6MzI6NTEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB2ODUwLmggKFY4NTBfT1RIRVJfe1REQV9CWVRFLEVSUk9SfSk6IE5ldyBiaXRzIGZvciB0aGUgc3Rfb3RoZXIKLQlmaWVsZC4KLQkoU0hOX1Y4NTBfKik6IFJlbW92ZSB2ODUwIHNwZWNpZmljIHNlY3Rpb24gaW5kZXhlcywgd2hpY2ggYXJlIG5vdAotCW5lZWRlZC4KLQkoZW51bSByZWxvY190eXBlKTogTW92ZSB0aGUgdjg1MCByZWxvY2F0aW9ucyBoZXJlIGZyb20KLQllbGYzMi12ODUwLmMKLQotVGh1IEphbiAgMiAxOTozMDoyMyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaDogTmV3IGZpbGUsIHByb3ZpZGUgVjg1MCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KLQotVHVlIERlYyAzMSAxNDo0NDozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChEVF9BVVhJTElBUlkpOiBEZWZpbmUuCi0JKERUX0ZJTFRFUik6IERlZmluZS4KLQotV2VkIERlYyAgNCAwNTowMzozNyAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMi5oOiBVcGRhdGUuCi0KLVR1ZSBOb3YgMjYgMTA6NDQ6NDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKFNUT19NSVBTMTYpOiBEZWZpbmUuCi0KLVR1ZSBOb3YgMTIgMTU6NDU6NDIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYuaDogUmVtb3ZlIGVtcHR5IGZpbGUuCi0KLVR1ZSBPY3QgIDggMTE6MzE6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVGX01JUFNfQUJJMik6IERlZmluZS4KLQotVGh1IE9jdCAgMyAxMDowMTo0MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oOiBCcmVhayBtbjEweDAwIHN1cHBvcnQgaW50byBtbjEwMjAwIGFuZCBtbjEwMzAwLgotCi1XZWQgT2N0ICAyIDIxOjI2OjQzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmggKEVNX0NZR05VU19NTjEweDAwKTogRGVmaW5lLgotCi1Nb24gU2VwIDIzIDA5OjE4OjA0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLmg6IE5ldyBmaWxlLgotCi1GcmkgQXVnIDMwIDE3OjA2OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX1NIKTogRGVmaW5lLgotCi1UdWUgQXVnIDIwIDE0OjQ3OjU0IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX1Y4NTApOiBEZWZpbmUuCi0KLU1vbiBBdWcgMTkgMTA6NTk6MTAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19NMzJSKTogRGVmaW5lLgotCi1Nb24gSnVsIDIyIDE4OjU5OjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChTSFRfTUlQU19JRkFDRSwgU0hUX01JUFNfQ09OVEVOVCk6IERlZmluZS4KLQkoU0hUX01JUFNfU1lNQk9MX0xJQik6IERlZmluZS4KLQkoU0hGX01JUFNfTUVSR0UsIFNIRl9NSVBTX0FERFIzMiwgU0hGX01JUFNfQUREUjY0KTogRGVmaW5lLgotCShTSEZfTUlQU19OT1NUUklQLCBTSEZfTUlQU19MT0NBTCwgU0hGX01JUFNfTkFNRVMpOiBEZWZpbmUuCi0KLVRodSBKdWwgMTggMTk6MTI6MTUgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBkd2FyZjIuaDogTmV3IGZpbGUuCi0KLUp1bCAxOCAxMzoyMDozOSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19EMTBWKTogRGVmaW5lLgotCSogZDEwdi5oOiBOZXcgZmlsZS4KLQotRnJpIEp1biAyMSAxMjozMzoyNCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYWxwaGEuaDogTmV3IGZpbGUuCi0JKiBjb21tb24uaCAoRU1fQUxQSEEpOiBEZWZpbmUuCi0KLUZyaSBNYXkgMzEgMTc6Mjg6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVsZl9FeHRlcm5hbF9PcHRpb25zLCBFbGZfSW50ZXJuYWxfT3B0aW9ucyk6IERlZmluZS4KLQkoYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbik6IERlY2xhcmUuCi0JKGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfb3V0KTogRGVjbGFyZS4KLQkoT0RLXyopOiBEZWZpbmUuCi0JKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8sIEVsZjY0X0ludGVybmFsX1JlZ0luZm8pOiBEZWZpbmUuCi0JKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbik6IERlY2xhcmUuCi0JKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQpOiBEZWNsYXJlLgotCi1UaHUgTWF5IDMwIDEyOjM1OjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFX01JUFNfQVJDSF80KTogRGVmaW5lLgotCi1XZWQgTWF5IDI5IDE1OjM1OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCk6IERlZmluZS4KLQkoRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwpOiBEZWZpbmUuCi0JKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSwgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhKTogRGVmaW5lLgotCShSU1NfKik6IERlZmluZS4KLQotTW9uIEFwciAyMiAxODoyNjozMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChSX1NQQVJDX1s1Nl0pOiBBbHdheXMgZGVmaW5lLgotCi1Nb24gRmViIDE5IDAxOjU1OjU2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChSX1NQQVJDX3tQTFQzMixISVBMVDIyLExPUExUMTAsUENQTFQzMixQQ1BMVDIyLAotCVBDUExUMTAsNSw2fSk6IERvbid0IGRlZmluZSBpZmRlZiBTUEFSQzY0X09MRF9SRUxPQ1MuCi0KLVR1ZSBGZWIgIDYgMTE6MzM6NTggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKGVudW0gc3BhcmNfZWxmX3JlbG9jX3R5cGUpOiBEZWZpbmUuCi0KLVdlZCBKYW4gMTcgMDk6MDk6MTYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmg6IERlZmluZSBFTV9TUEFSQzMyUExVUy4KLQkqIHNwYXJjLmg6IE5ldyBmaWxlLgotCi1UaHUgSmFuIDExIDE2OjI3OjM0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLmggKFNIRl9FWENMVURFLCBTSFRfT1JERVJFRCk6IE5ldyBmaWVsZHMgZnJvbSB0aGUgYWJpLgotCi1UaHUgTm92IDMwIDE2OjQ3OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoc3RydWN0IGVsZl9zZWdtZW50X21hcCk6IEFkZCBpbmNsdWRlc19maWxlaGRyIGFuZAotCWluY2x1ZGVzX3BoZHJzIGZpZWxkcy4KLQotVHVlIE5vdiAyOCAxNjo1ODoxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApOiBEZWZpbmUuCi0KLVR1ZSBPY3QgMzEgMTU6MTk6MzYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oLCBkd2FyZi5oLCBleHRlcm5hbC5oLCBocHBhLmgsIGludGVybmFsLmgsCi0JbWlwcy5oLCBwcGMuaDogIFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgotCi1UaHUgU2VwIDIxIDEzOjUxOjU4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLmggKEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpOiBBZGQgbmV3IGZsYWcgYml0LgotCi1GcmkgU2VwICAxIDE1OjMyOjE3IDE5OTUgIEthenVtb3RvIEtvamltYSAgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPgotCi0JKiBtaXBzLmg6IEFkZCBzb21lIGRlZmluaXRpb25zIHVzZWQgb24gSXJpeCA1LgotCi1UdWUgSnVuIDIwIDEwOjE4OjI4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmggKENQVV9QQV9SSVNDMV8wKTogUHJvdGVjdCBmcm9tIHJlZGVmaW5pdGlvbnMuCi0JKENQVV9QQV9SSVNDMV8xKTogTGlrZXdpc2UuCi0KLVdlZCBNYXIgIDggMTg6MTQ6MzcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMuaDogTmV3IGZpbGUgZm9yIFBvd2VyUEMgc3VwcG9ydC4KLQotVHVlIEZlYiAxNCAxMzo1OToxMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9QUEMpOiBVc2Ugb2ZmaWNhbCB2YWx1ZSBvZiAyMCwgbm90IDE3LgotCShFTV9QUENfT0xEKTogRGVmaW5lIHRoaXMgdG8gYmUgdGhlIG9sZCB2YWx1ZSBvZiBFTV9QUEMuCi0KLVR1ZSBKYW4gMjQgMDk6NDA6NTkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fUFBDKTogTmV3IG1hY3JvLCBQb3dlclBDIG1hY2hpbmUgaWQuCi0KLVR1ZSBKYW4gMTcgMTA6NTE6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBtaXBzLmggKFNIVF9NSVBTX01TWU0sIFNIVF9NSVBTX0RXQVJGLCBTSFRfTUlQU19FVkVOVFMpOiBEZWZpbmUuCi0KLU1vbiBPY3QgMTcgMTM6NDM6NTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChFbGZfSW50ZXJuYWxfU2hkcik6IFJlbW92ZSByYXdkYXRhIGFuZCBzaXplIGZpZWxkcy4KLQlBZGQgYmZkX3NlY3Rpb24gZmllbGQuCi0KLVR1ZSBNYXkgMjQgMTY6MTE6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKEVsZjMyX0V4dGVybmFsX2dwdGFiKTogRGVmaW5lLgotCi1Nb24gTWF5IDE2IDEzOjIyOjA0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb21tb24uaCAoRU1fSFBQQSk6IERlbGV0ZS4KLQkoRU1fUEFSSVNDKTogQWRkLgotCSogaHBwYS5oOiBOZXcgZmlsZS4KLQotTW9uIE1heSAgOSAxMzoyNzowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChTSE5fTE9SRVNFUlZFKTogUmVuYW1lIGZyb20gU0hOX0xPUkVTRVJWLgotCShFTEYzMl9SX1RZUEUsIEVMRjMyX1JfSU5GTyk6IERvbid0IHJlbHkgb24gc2l6ZSBvZiB1bnNpZ25lZCBjaGFyLgotCShFTEY2NF9SX1RZUEUpOiBEb24ndCByZWx5IG9uIHNpemUgb2YgdW5zaWduZWQgbG9uZy4KLQotTW9uIEFwciAyNSAxNTo1MzowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKEVsZl9JbnRlcm5hbF9TaGRyKTogVXNlIFBUUiwgbm90IHZvaWQgKi4KLQotRnJpIE1hciAxMSAwMDozNDo1OSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIG1pcHMuaCAoU0hOX01JUFNfVEVYVCwgU0hOX01JUFNfREFUQSk6ICBEZWZpbmUuCi0KLVNhdCBNYXIgIDUgMTQ6MDg6NTQgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBpbnRlcm5hbC5oOiAgUmVtb3ZlIEVsZjMyXyosIEVsZjY0XyogdHlwZWRlZnMuICBUaGVzZSBuYW1lcwotCWNhdXNlIGNvbmZsaWN0cyB3aXRoIHN5c3RlbSBoZWFkZXJzLCBlLmcuIGxpbmsuaCBpbiBnZGIvc29saWIuYy4KLQlDb21iaW5lIDMyLSBhbmQgNjQtYml0IHZlcnNpb25zIG9mICpfSW50ZXJuYWxfRHluLgotCSogY29tbW9uLmg6ICBSZXBsYWNlIHVzZXMgb2YgRWxmNjRfV29yZCwgRWxmNjRfWHdvcmQgdHlwZWRlZnMKLQlieSB0aGVpciBleHBhbnNpb24uCi0JKiBtaXBzLmg6ICBSZXBsYWNlIHVzZXMgb2YgRWxmMzJfV29yZCwgRWxmMzJfU3dvcmQsIEVsZjMyX0FkZHIKLQl0eXBlZGVmcyBieSB0aGVpciBleHBhbnNpb24uIEFkZCBEVF9NSVBTX1JMRF9NQVAgZGVmaW5pdGlvbi4KLQotRnJpIEZlYiAxOCAxMDozOTo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfUE9XRVJQQyk6IERlZmluZS4gIFRoaXMgbWF5IGJlIHRlbXBvcmFyeSwKLQlkZXBlbmRpbmcgdXBvbiBob3cgcXVpY2tseSBJIGNhbiBmaW5kIGEgcmVhbCBQb3dlclBDIEFCSS4KLQotTW9uIEZlYiAgNyAwODoyNzoxMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogQ2hhbmdlIEhPU1RfNjRfQklUIHRvIEJGRF9IT1NUXzY0X0JJVC4KLQotV2VkIEZlYiAgMiAxNDoxMjoxOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmg6IEFkZCBjb21tZW50cyByZWdhcmRpbmcgdmFsdWUgb2YgRU1fSFBQQSBhbmQgaG93IHRvCi0JcGljayBhbiB1bm9mZmljaWFsIHZhbHVlLgotCi1XZWQgTm92IDE3IDE3OjE0OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChTSFRfTUlQU19PUFRJT05TKTogRGVmaW5lLgotCi1Nb24gTm92ICA4IDE3OjU3OjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiBBZGRlZCBzb21lIG1vcmUgTUlQUyBBQkkgbWFjcm8gZGVmaW5pdGlvbnMuCi0KLVdlZCBOb3YgIDMgMjI6MDc6MTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCAoRU1fTUlQU19SUzRfQkUpOiBOZXcgbWFjcm8uCi0KLVR1ZSBPY3QgMTIgMDc6Mjg6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmg6IE5ldyBmaWxlLiAgTUlQUyBBQkkgc3BlY2lmaWMgaW5mb3JtYXRpb24uCi0KLU1vbiBKdW4gMjEgMTM6MTM6NDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IENvbWJpbmVkIDMyLSBhbmQgNjQtYml0IHZlcnNpb25zIG9mIGFsbCBzdHJ1Y3R1cmVzCi0JZXhjZXB0ICpfSW50ZXJuYWxfRHluLiAgVGhpcyB3aWxsIHNpbXBseSB0aGUgYXNzZW1ibGVyIGludGVyZmFjZSwKLQlhbmQgc29tZSBiZmQgY29kZS4KLQotVHVlIE1heSAyNSAwMjowMDoxNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGV4dGVybmFsLmgsIGludGVybmFsLmgsIGNvbW1vbi5oOiBBZGRlZCA2NC1iaXQgdmVyc2lvbnMgb2Ygc29tZQotCXN0cnVjdHVyZXMgYW5kIG1hY3Jvcy4gIFJlbmFtZWQgb2xkIHZlcnNpb25zIHRvIHB1dCAiMzIiIGluIHRoZQotCW5hbWUuICBTb21lIGFyZSB1bmNoYW5nZWQuCi0KLVRodSBBcHIgMjkgMTI6MTI6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChFTV9IUFBBLCBOVF9WRVJTSU9OLCBTVE5fVU5ERUYsIERUXyopOiBOZXcgbWFjcm9zLgotCSogZXh0ZXJuYWwuaCAoRWxmX0V4dGVybmFsX0R5bik6IE5ldyB0eXBlLgotCi0JKiBpbnRlcm5hbC5oIChFbGZfSW50ZW5yYWxfU2hkcik6IE5ldyBmaWVsZCBgc2l6ZScuCi0JKEVsZl9JbnRlcm5hbF9EeW4pOiBOZXcgdHlwZS4KLQotVHVlIEFwciAyMCAxNjowMzo0NSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZHdhcmYuaCAoTEFOR19DSElMTCk6ICBDaGFuZ2UgdmFsdWUgdG8gb25lIHJhbmRvbWx5IHBpY2tlZCBpbgotCXRoZSB1c2VyIGRlZmluZWQgcmFuZ2UsIHRvIHJlZHVjZSBwcm9iYWJpbGl0eSBvZiBjb2xsaXNpb25zLgotCi1TdW4gTm92IDE1IDA5OjM0OjAyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBkd2FyZi5oIChBVF9zcmNfY29vcmRzKTogIFdoaXRlc3BhY2UgY2hhbmdlIG9ubHkuCi0JKiBkd2FyZi5oIChBVF9ib2R5X2JlZ2luLCBBVF9ib2R5X2VuZCwgTEFOR19NT0RVTEEyKToKLQlBZGQgZnJvbSBsYXRlc3QgZ2NjLgotCSogZHdhcmYuaCAoTEFOR19DSElMTCk6ICBBZGQgYXMgR05VIGV4dGVuc2lvbi4KLQotU2F0IEF1ZyAgMSAxMzo0Njo1MyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZHdhcmYuaDogIFJlcGxhY2Ugd2l0aCBjdXJyZW50IHZlcnNpb24gZnJvbSBnY2MgZGlzdHJpYnV0aW9uLgotCi1GcmkgSnVuIDE5IDE5OjA1OjA5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiAgQWRkIHJlYWwgc3RydWN0IHRhZ3MgdG8gYWxsIHRoZSBUeXBlX0RlZnMsIHNvIHRoZXkKLQljYW4gYmUgdXNlZCBpbiBwcm90b3R5cGVzIHdoZXJlIHRoZSBUeXBlX0RlZnMgYXJlIG5vdCBrbm93bi4KLQotRnJpIEFwciAgMyAyMDo1ODo1OCAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb21tb24uaDogYWRkZWQgRUxGX1Jfe1NZTSxUWVBFLElORk99IGZvciBoYW5kbGluZyByZWxvY2F0aW9uCi0JaW5mbwotCWFkZGVkIEVNX01JUFMsIGFuZCBjb3JyZWN0ZWQgdmFsdWUgb2YgRU1fODYwIGJhc2VkIG9uIFN5c3RlbSBWIEFCSQotCW1hbnVhbC4KLQotCSogZXh0ZXJuYWwuaDogYWRkZWQgRWxmX0V4dGVybmFsX3tSZWwsUmVsYX0uCi0KLQkqIGludGVybmFsLmg6IGFkZGVkIEVsZl9JbnRlcm5hbF97UmVsLFJlbGF9LgotCWFkZGVkIHJhd2RhdGEgdG8gRWxmX0ludGVybmFsX1NoZHIuCi0KLVNhdCBOb3YgMzAgMjA6NDM6NTkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oLCBkd2FyZi5oLCBleHRlcm5hbC5oLCBpbnRlcm5hbC5oLCBDaGFuZ2VMb2c7IG1vdmVkIGZyb20KLQkuLi9lbGYtPGZvbz4KLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvYWxwaGEuaCBiL2luY2x1ZGUvZWxmL2FscGhhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZTlkNWUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvYWxwaGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKiBBTFBIQSBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBCeSBFcmljIFlvdW5nZGFsZSwgPGVyaWNAYWliLmNvbT4uICBObyBwcm9jZXNzb3Igc3VwcGxlbWVudCBhdmFpbGFibGUKLSAgIGZvciB0aGlzIHBsYXRmb3JtLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgQUxQSEEgRUxGIEFCSS4gIE5vdGUKLSAgIHRoYXQgbW9zdCBvZiB0aGlzIGlzIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCBieSBCRkQuICAqLwotCi0jaWZuZGVmIF9FTEZfQUxQSEFfSAotI2RlZmluZSBfRUxGX0FMUEhBX0gKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLQotLyogQWxsIGFkZHJlc3NlcyBtdXN0IGJlIGJlbG93IDJHQi4gICovCi0jZGVmaW5lIEVGX0FMUEhBXzMyQklUCQkweDAwMDAwMDAxCi0KLS8qIEFsbCByZWxvY2F0aW9ucyBuZWVkZWQgZm9yIHJlbGF4YXRpb24gd2l0aCBjb2RlIG1vdmVtZW50IGFyZSBwcmVzZW50LiAgKi8KLSNkZWZpbmUgRUZfQUxQSEFfQ0FOUkVMQVgJMHgwMDAwMDAwMgotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBmbGFncy4gICovCi0KLS8qIFRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIHRoZSBnbG9iYWwgZGF0YSBhcmVhLiAgKi8KLSNkZWZpbmUgU0hGX0FMUEhBX0dQUkVMCQkweDEwMDAwMDAwCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgc29tZSBzb3J0IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoZSBleGFjdAotICAgZm9ybWF0IGlzIHVuc3BlY2lmaWVkLiAgSXQncyBwcm9iYWJseSBFQ09GRiBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgU0hUX0FMUEhBX0RFQlVHCQkweDcwMDAwMDAxCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgcmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBTSFRfQUxQSEFfUkVHSU5GTwkweDcwMDAwMDAyCi0KLS8qIEEgc2VjdGlvbiBvZiB0eXBlIFNIVF9NSVBTX1JFR0lORk8gY29udGFpbnMgdGhlIGZvbGxvd2luZwotICAgc3RydWN0dXJlLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIE1hc2sgb2YgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyB1c2VkLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByaV9ncHJtYXNrOwotICAvKiBNYXNrIG9mIGNvLXByb2Nlc3NvciByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmlfY3BybWFza1s0XTsKLSAgLyogR1AgcmVnaXN0ZXIgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICBsb25nIHJpX2dwX3ZhbHVlOwotfSBFbGY2NF9SZWdJbmZvOwotCi0vKiBTcGVjaWFsIHZhbHVlcyBmb3IgdGhlIHN0X290aGVyIGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi0jZGVmaW5lIFNUT19BTFBIQV9OT1BWCQkweDgwCi0jZGVmaW5lIFNUT19BTFBIQV9TVERfR1BMT0FECTB4ODgKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogQWxwaGEgcmVsb2NzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9hbHBoYV9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfTk9ORSwgMCkJLyogTm8gcmVsb2MgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1JFRkxPTkcsIDEpCS8qIERpcmVjdCAzMiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1JFRlFVQUQsIDIpCS8qIERpcmVjdCA2NCBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0dQUkVMMzIsIDMpCS8qIEdQIHJlbGF0aXZlIDMyIGJpdCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfTElURVJBTCwgNCkJLyogR1AgcmVsYXRpdmUgMTYgYml0IHcvb3B0aW1pemF0aW9uICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9MSVRVU0UsIDUpCS8qIE9wdGltaXphdGlvbiBoaW50IGZvciBMSVRFUkFMICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUERJU1AsIDYpCS8qIEFkZCBkaXNwbGFjZW1lbnQgdG8gR1AgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0JSQUREUiwgNykJLyogUEMrNCByZWxhdGl2ZSAyMyBiaXQgc2hpZnRlZCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfSElOVCwgOCkJLyogUEMrNCByZWxhdGl2ZSAxNiBiaXQgc2hpZnRlZCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfU1JFTDE2LCA5KQkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1NSRUwzMiwgMTApCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfU1JFTDY0LCAxMSkJLyogUEMgcmVsYXRpdmUgNjQgYml0ICovCi0KLS8qIEluaGVyaXRlZCB0aGVzZSBmcm9tIEVDT0ZGLCBidXQgdGhleSBhcmUgbm90IHBhcnRpY3VsYXJseSB1c2VmdWwKLSAgIGFuZCBhcmUgZGVwcmVjaWF0ZWQuICBBbmQgbm90IGltcGxlbWVudGVkIGluIHRoZSBCRkQsIGJ0dy4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9PUF9QVVNILCAxMikJLyogT1Agc3RhY2sgcHVzaCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfT1BfU1RPUkUsIDEzKQkvKiBPUCBzdGFjayBwb3AgYW5kIHN0b3JlICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9PUF9QU1VCLCAxNCkJLyogT1Agc3RhY2sgc3VidHJhY3QgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX09QX1BSU0hJRlQsIDE1KQkvKiBPUCBzdGFjayByaWdodCBzaGlmdCAqLwotCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUFZBTFVFLCAxNikKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0dQUkVMSElHSCwgMTcpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUFJFTExPVywgMTgpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9JTU1FRF9HUF8xNiwgMTkpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9JTU1FRF9HUF9ISTMyLCAyMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0lNTUVEX1NDTl9ISTMyLCAyMSkKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0lNTUVEX0JSX0hJMzIsIDIyKQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfSU1NRURfTE8zMiwgMjMpCi0KLS8qIFRoZXNlIHJlbG9jYXRpb25zIGFyZSBzcGVjaWZpYyB0byBzaGFyZWQgbGlicmFyaWVzLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0NPUFksIDI0KQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HTE9CX0RBVCwgMjUpCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0pNUF9TTE9ULCAyNikJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfUkVMQVRJVkUsIDI3KQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0KLSAgRU1QVFlfUkVMT0MgIChSX0FMUEhBX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZiAvKiBfRUxGX0FMUEhBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2FyYy5oIGIvaW5jbHVkZS9lbGYvYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNGI1NWYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBBUkMgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMsIChkamVAY3lnbnVzLmNvbSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIEFSQyBFTEYgQUJJLiAgKi8KLQotI2lmbmRlZiBfRUxGX0FSQ19ICi0jZGVmaW5lIF9FTEZfQVJDX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2FyY19yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfQVJDX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9BUkNfMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUkNfQjI2LCAyKQotICBSRUxPQ19OVU1CRVIgKFJfQVJDX0IyMl9QQ1JFTCwgMykKLSAgRU1QVFlfUkVMT0MgIChSX0FSQ19tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotCi0vKiBGb3VyIGJpdCBBUkMgbWFjaGluZSB0eXBlIGZpZWxkLiAgKi8KLSNkZWZpbmUgRUZfQVJDX01BQ0gJCTB4MDAwMDAwMGYKLQotLyogVmFyaW91cyBDUFUgdHlwZXMuICAqLwotI2RlZmluZSBFX0FSQ19NQUNIX0JBU0UJCTB4MDAwMDAwMDAKLSNkZWZpbmUgRV9BUkNfTUFDSF9VTlVTRUQxCTB4MDAwMDAwMDEKLSNkZWZpbmUgRV9BUkNfTUFDSF9VTlVTRUQyCTB4MDAwMDAwMDIKLSNkZWZpbmUgRV9BUkNfTUFDSF9VTlVTRUQ0CTB4MDAwMDAwMDMKLQotLyogTGVhdmUgYml0cyAweGYwIGFsb25lIGluIGNhc2Ugd2UgZXZlciBoYXZlIG1vcmUgdGhhbiAxNiBjcHUgdHlwZXMuCi0gICBIaWdobHkgdW5saWtlbHksIGJ1dCB3aGF0IHRoZSBoZWNrLiAgKi8KLQotLyogRmlsZSBjb250YWlucyBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLiAgKi8KLSNkZWZpbmUgRUZfQVJDX1BJQwkJMHgwMDAwMDEwMAotCi0jZW5kaWYgLyogX0VMRl9BUkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvYXJtLW9hYmkuaCBiL2luY2x1ZGUvZWxmL2FybS1vYWJpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMDk4NDIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvYXJtLW9hYmkuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qIEFSTSBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9BUk1fSAotI2RlZmluZSBfRUxGX0FSTV9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0jZGVmaW5lIEVGX0FSTV9SRUxFWEVDICAgICAweDAxCi0jZGVmaW5lIEVGX0FSTV9IQVNFTlRSWSAgICAweDAyCi0jZGVmaW5lIEVGX0lOVEVSV09SSyAgICAgICAweDA0Ci0jZGVmaW5lIEVGX0FQQ1NfMjYgICAgICAgICAweDA4Ci0jZGVmaW5lIEVGX0FQQ1NfRkxPQVQgICAgICAweDEwCi0jZGVmaW5lIEVGX1BJQyAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIEVGX0FMSUdOOAkgICAweDQwCQkvKiA4LWJpdCBzdHJ1Y3R1cmUgYWxpZ25tZW50IGlzIGluIHVzZSAqLwotI2RlZmluZSBFRl9ORVdfQUJJICAgICAgICAgMHg4MAotI2RlZmluZSBFRl9PTERfQUJJICAgICAgICAgMHgxMDAKLQotLyogTG9jYWwgYWxpYXNlcyBmb3Igc29tZSBmbGFncyB0byBtYXRjaCBuYW1lcyB1c2VkIGJ5IENPRkYgcG9ydC4gICovCi0jZGVmaW5lIEZfSU5URVJXT1JLCSAgIEVGX0lOVEVSV09SSwotI2RlZmluZSBGX0FQQ1MyNgkgICBFRl9BUENTXzI2Ci0jZGVmaW5lIEZfQVBDU19GTE9BVAkgICBFRl9BUENTX0ZMT0FUCi0jZGVmaW5lIEZfUElDICAgICAgICAgICAgICBFRl9QSUMKLQotLyogQWRkaXRpb25hbCBzeW1ib2wgdHlwZXMgZm9yIFRodW1iICovCi0jZGVmaW5lIFNUVF9BUk1fVEZVTkMgICAgIDB4ZAotCi0vKiBBUk0tc3BlY2lmaWMgdmFsdWVzIGZvciBzaF9mbGFncyAqLwotI2RlZmluZSBTSEZfRU5UUllTRUNUICAgICAgMHgxMDAwMDAwMCAgIC8qIFNlY3Rpb24gY29udGFpbnMgYW4gZW50cnkgcG9pbnQgKi8KLSNkZWZpbmUgU0hGX0NPTURFRiAgICAgICAgIDB4ODAwMDAwMDAgICAvKiBTZWN0aW9uIG1heSBiZSBtdWx0aXBseSBkZWZpbmVkIGluIHRoZSBpbnB1dCB0byBhIGxpbmsgc3RlcCAqLwotCi0vKiBBUk0tc3BlY2lmaWMgcHJvZ3JhbSBoZWFkZXIgZmxhZ3MgKi8KLSNkZWZpbmUgUEZfQVJNX1NCICAgICAgICAgIDB4MTAwMDAwMDAgICAvKiBTZWdtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBhZGRyZXNzZWQgYnkgdGhlIHN0YXRpYyBiYXNlICovCi0KLS8qIFJlbG9jYXRpb24gdHlwZXMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2FybV9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX05PTkUsICAgICAgICAgMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QQzI0LCAgICAgICAgIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMzIsICAgICAgICAyKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JFTDMyLCAgICAgICAgMykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlM4LCAgICAgICAgIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMTYsICAgICAgICA1KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FCUzEyLCAgICAgICAgNikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fQUJTNSwgICAgIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDMjIsICAgICA4KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1NCUkVMMzIsICAgICAgOSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BTVBfVkNBTEw5LCAgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDMTEsICAgIDExKSAgICAgICAvKiBjeWdudXMgZXh0ZW5zaW9uIHRvIGFiaTogdGh1bWIgdW5jb25kaXRpb25hbCBicmFuY2ggKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEM5LCAgICAgMTIpICAgICAgIC8qIGN5Z251cyBleHRlbnNpb24gdG8gYWJpOiB0aHVtYiBjb25kaXRpb25hbCBicmFuY2ggKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRJTkhFUklULCAxMykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRFTlRSWSwgMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQ09QWSwgICAgICAgIDIwKSAgICAgICAvKiBjb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR0xPQl9EQVQsICAgIDIxKSAgICAgICAvKiBjcmVhdGUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fSlVNUF9TTE9ULCAgIDIyKSAgICAgICAvKiBjcmVhdGUgUExUIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkVMQVRJVkUsICAgIDIzKSAgICAgICAvKiBhZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR09UT0ZGLCAgICAgIDI0KSAgICAgICAvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dPVFBDLCAgICAgICAyNSkgICAgICAgLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HT1QzMiwgICAgICAgMjYpICAgICAgIC8qIDMyIGJpdCBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QTFQzMiwgICAgICAgMjcpICAgICAgIC8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLwotICBGQUtFX1JFTE9DICAgKEZJUlNUX0lOVkFMSURfUkVMT0MsIDI4KQotICBGQUtFX1JFTE9DICAgKExBU1RfSU5WQUxJRF9SRUxPQywgIDI0OSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SU0JSRUwzMiwgICAyNTApCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1JQQzIyLCAgMjUxKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JSRUwzMiwgICAgIDI1MikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SQUJTMzIsICAgICAyNTMpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUlBDMjQsICAgICAgMjU0KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JCQVNFLCAgICAgIDI1NSkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvYXJtLmggYi9pbmNsdWRlL2VsZi9hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5NGIxMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qIEFSTSBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9BUk1fSAotI2RlZmluZSBfRUxGX0FSTV9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0jZGVmaW5lIEVGX0FSTV9SRUxFWEVDICAgICAweDAxCi0jZGVmaW5lIEVGX0FSTV9IQVNFTlRSWSAgICAweDAyCi0jZGVmaW5lIEVGX0lOVEVSV09SSyAgICAgICAweDA0Ci0jZGVmaW5lIEVGX0FQQ1NfMjYgICAgICAgICAweDA4Ci0jZGVmaW5lIEVGX0FQQ1NfRkxPQVQgICAgICAweDEwCi0jZGVmaW5lIEVGX1BJQyAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIEVGX0FMSUdOOAkgICAweDQwCQkvKiA4LWJpdCBzdHJ1Y3R1cmUgYWxpZ25tZW50IGlzIGluIHVzZSAqLwotI2RlZmluZSBFRl9ORVdfQUJJICAgICAgICAgMHg4MAotI2RlZmluZSBFRl9PTERfQUJJICAgICAgICAgMHgxMDAKLQotLyogTG9jYWwgYWxpYXNlcyBmb3Igc29tZSBmbGFncyB0byBtYXRjaCBuYW1lcyB1c2VkIGJ5IENPRkYgcG9ydC4gICovCi0jZGVmaW5lIEZfSU5URVJXT1JLCSAgIEVGX0lOVEVSV09SSwotI2RlZmluZSBGX0FQQ1MyNgkgICBFRl9BUENTXzI2Ci0jZGVmaW5lIEZfQVBDU19GTE9BVAkgICBFRl9BUENTX0ZMT0FUCi0jZGVmaW5lIEZfUElDICAgICAgICAgICAgICBFRl9QSUMKLQotLyogQWRkaXRpb25hbCBzeW1ib2wgdHlwZXMgZm9yIFRodW1iICovCi0jZGVmaW5lIFNUVF9BUk1fVEZVTkMgICAgIDB4ZAotCi0vKiBBUk0tc3BlY2lmaWMgdmFsdWVzIGZvciBzaF9mbGFncyAqLwotI2RlZmluZSBTSEZfRU5UUllTRUNUICAgICAgMHgxMDAwMDAwMCAgIC8qIFNlY3Rpb24gY29udGFpbnMgYW4gZW50cnkgcG9pbnQgKi8KLSNkZWZpbmUgU0hGX0NPTURFRiAgICAgICAgIDB4ODAwMDAwMDAgICAvKiBTZWN0aW9uIG1heSBiZSBtdWx0aXBseSBkZWZpbmVkIGluIHRoZSBpbnB1dCB0byBhIGxpbmsgc3RlcCAqLwotCi0vKiBBUk0tc3BlY2lmaWMgcHJvZ3JhbSBoZWFkZXIgZmxhZ3MgKi8KLSNkZWZpbmUgUEZfQVJNX1NCICAgICAgICAgIDB4MTAwMDAwMDAgICAvKiBTZWdtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBhZGRyZXNzZWQgYnkgdGhlIHN0YXRpYyBiYXNlICovCi0KLS8qIFJlbG9jYXRpb24gdHlwZXMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2FybV9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX05PTkUsICAgICAgICAgMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QQzI0LCAgICAgICAgIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMzIsICAgICAgICAyKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JFTDMyLCAgICAgICAgMykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QQzEzLCAgICAgICAgIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMTYsICAgICAgICA1KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FCUzEyLCAgICAgICAgNikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fQUJTNSwgICAgIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTOCwgICAgICAgICA4KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1NCUkVMMzIsICAgICAgOSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEMyMiwgICAgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDOCwgICAgIDExKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FNUF9WQ0FMTDksICAxMikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9TV0kyNCwgICAgICAgMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1NXSTgsICAgIDE0KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1hQQzI1LCAgICAgICAxNSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fWFBDMjIsICAgMTYpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQ09QWSwgICAgICAgIDIwKSAgICAgICAvKiBjb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR0xPQl9EQVQsICAgIDIxKSAgICAgICAvKiBjcmVhdGUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fSlVNUF9TTE9ULCAgIDIyKSAgICAgICAvKiBjcmVhdGUgUExUIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkVMQVRJVkUsICAgIDIzKSAgICAgICAvKiBhZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR09UT0ZGLCAgICAgIDI0KSAgICAgICAvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dPVFBDLCAgICAgICAyNSkgICAgICAgLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HT1QzMiwgICAgICAgMjYpICAgICAgIC8qIDMyIGJpdCBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QTFQzMiwgICAgICAgMjcpICAgICAgIC8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLwotICBGQUtFX1JFTE9DICAgKEZJUlNUX0lOVkFMSURfUkVMT0MxLCAyOCkKLSAgRkFLRV9SRUxPQyAgIChMQVNUX0lOVkFMSURfUkVMT0MxLCAgOTkpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR05VX1ZURU5UUlksIDEwMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRJTkhFUklULCAxMDEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDMTEsICAgIDEwMikgICAgICAgLyogY3lnbnVzIGV4dGVuc2lvbiB0byBhYmk6IHRodW1iIHVuY29uZGl0aW9uYWwgYnJhbmNoICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDOSwgICAgIDEwMykgICAgICAgLyogY3lnbnVzIGV4dGVuc2lvbiB0byBhYmk6IHRodW1iIGNvbmRpdGlvbmFsIGJyYW5jaCAqLwotICBGQUtFX1JFTE9DICAgKEZJUlNUX0lOVkFMSURfUkVMT0MyLCAxMDQpCi0gIEZBS0VfUkVMT0MgICAoTEFTVF9JTlZBTElEX1JFTE9DMiwgIDI0OCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SWFBDMjUsICAgICAyNDkpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUlNCUkVMMzIsICAgMjUwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9SUEMyMiwgIDI1MSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SUkVMMzIsICAgICAyNTIpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkFCUzMyLCAgICAgMjUzKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JQQzI0LCAgICAgIDI1NCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SQkFTRSwgICAgICAyNTUpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2NvbW1vbi5oIGIvaW5jbHVkZS9lbGYvY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYTNiYTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NTQgKzAsMCBAQAotLyogRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MSw5Miw5Myw5NCw5NSw5Niw5Nyw5OCw5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydCwgZnJvbSBpbmZvcm1hdGlvbiBwdWJsaXNoZWQKLSAgIGluICJVTklYIFN5c3RlbSBWIFJlbGVhc2UgNCwgUHJvZ3JhbW1lcnMgR3VpZGU6IEFOU0kgQyBhbmQKLSAgIFByb2dyYW1taW5nIFN1cHBvcnQgVG9vbHMiLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRUxGIHN1cHBvcnQgZm9yIEJGRCwgYW5kIGNvbnRhaW5zIHRoZSBwb3J0aW9ucwotICAgdGhhdCBhcmUgY29tbW9uIHRvIGJvdGggdGhlIGludGVybmFsIGFuZCBleHRlcm5hbCByZXByZXNlbnRhdGlvbnMuCi0gICBGb3IgZXhhbXBsZSwgRUxGTUFHMCBpcyB0aGUgYnl0ZSAweDdGIGluIGJvdGggdGhlIGludGVybmFsIChpbi1tZW1vcnkpCi0gICBhbmQgZXh0ZXJuYWwgKGluLWZpbGUpIHJlcHJlc2VudGF0aW9ucy4gKi8KLQotI2lmbmRlZiBfRUxGX0NPTU1PTl9ICi0jZGVmaW5lIF9FTEZfQ09NTU9OX0gKLQotLyogRmllbGRzIGluIGVfaWRlbnRbXSAqLwotCi0jZGVmaW5lIEVJX01BRzAJCTAJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDAgaW5kZXggKi8KLSNkZWZpbmUgRUxGTUFHMAkJMHg3RgkvKiBNYWdpYyBudW1iZXIgYnl0ZSAwICovCi0KLSNkZWZpbmUgRUlfTUFHMQkJMQkvKiBGaWxlIGlkZW50aWZpY2F0aW9uIGJ5dGUgMSBpbmRleCAqLwotI2RlZmluZSBFTEZNQUcxCQknRScJLyogTWFnaWMgbnVtYmVyIGJ5dGUgMSAqLwotCi0jZGVmaW5lIEVJX01BRzIJCTIJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDIgaW5kZXggKi8KLSNkZWZpbmUgRUxGTUFHMgkJJ0wnCS8qIE1hZ2ljIG51bWJlciBieXRlIDIgKi8KLQotI2RlZmluZSBFSV9NQUczCQkzCS8qIEZpbGUgaWRlbnRpZmljYXRpb24gYnl0ZSAzIGluZGV4ICovCi0jZGVmaW5lIEVMRk1BRzMJCSdGJwkvKiBNYWdpYyBudW1iZXIgYnl0ZSAzICovCi0KLSNkZWZpbmUgRUlfQ0xBU1MJNAkvKiBGaWxlIGNsYXNzICovCi0jZGVmaW5lIEVMRkNMQVNTTk9ORQkwCS8qIEludmFsaWQgY2xhc3MgKi8KLSNkZWZpbmUgRUxGQ0xBU1MzMgkxCS8qIDMyLWJpdCBvYmplY3RzICovCi0jZGVmaW5lIEVMRkNMQVNTNjQJMgkvKiA2NC1iaXQgb2JqZWN0cyAqLwotCi0jZGVmaW5lIEVJX0RBVEEJCTUJLyogRGF0YSBlbmNvZGluZyAqLwotI2RlZmluZSBFTEZEQVRBTk9ORQkwCS8qIEludmFsaWQgZGF0YSBlbmNvZGluZyAqLwotI2RlZmluZSBFTEZEQVRBMkxTQgkxCS8qIDIncyBjb21wbGVtZW50LCBsaXR0bGUgZW5kaWFuICovCi0jZGVmaW5lIEVMRkRBVEEyTVNCCTIJLyogMidzIGNvbXBsZW1lbnQsIGJpZyBlbmRpYW4gKi8KLQotI2RlZmluZSBFSV9WRVJTSU9OCTYJLyogRmlsZSB2ZXJzaW9uICovCi0KLSNkZWZpbmUgRUlfT1NBQkkgICAgICAgIDcgICAgICAgLyogT3BlcmF0aW5nIFN5c3RlbS9BQkkgaW5kaWNhdGlvbiAqLwotI2RlZmluZSBFTEZPU0FCSV9TWVNWICAgMCAgICAgICAvKiBVTklYIFN5c3RlbSBWIEFCSSAqLwotI2RlZmluZSBFTEZPU0FCSV9IUFVYICAgMSAgICAgICAvKiBIUC1VWCBvcGVyYXRpbmcgc3lzdGVtICovCi0jZGVmaW5lIEVMRk9TQUJJX1NUQU5EQUxPTkUgMjU1IC8qIFN0YW5kYWxvbmUgKGVtYmVkZGVkKSBhcHBsaWNhdGlvbiAqLwotCi0jZGVmaW5lIEVJX0FCSVZFUlNJT04gICA4ICAgICAgIC8qIEFCSSB2ZXJzaW9uICovCi0KLSNkZWZpbmUgRUlfUEFECQk5CS8qIFN0YXJ0IG9mIHBhZGRpbmcgYnl0ZXMgKi8KLQotCi0vKiBWYWx1ZXMgZm9yIGVfdHlwZSwgd2hpY2ggaWRlbnRpZmllcyB0aGUgb2JqZWN0IGZpbGUgdHlwZSAqLwotCi0jZGVmaW5lIEVUX05PTkUJCTAJLyogTm8gZmlsZSB0eXBlICovCi0jZGVmaW5lIEVUX1JFTAkJMQkvKiBSZWxvY2F0YWJsZSBmaWxlICovCi0jZGVmaW5lIEVUX0VYRUMJCTIJLyogRXhlY3V0YWJsZSBmaWxlICovCi0jZGVmaW5lIEVUX0RZTgkJMwkvKiBTaGFyZWQgb2JqZWN0IGZpbGUgKi8KLSNkZWZpbmUgRVRfQ09SRQkJNAkvKiBDb3JlIGZpbGUgKi8KLSNkZWZpbmUgRVRfTE9PUyAgICAgICAgIDB4RkUwMAkvKiBPcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljICovCi0jZGVmaW5lIEVUX0hJT1MgICAgICAgICAweEZFRkYgIC8qIE9wZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMgKi8KLSNkZWZpbmUgRVRfTE9QUk9DCTB4RkYwMAkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgKi8KLSNkZWZpbmUgRVRfSElQUk9DCTB4RkZGRgkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgKi8KLQotLyogVmFsdWVzIGZvciBlX21hY2hpbmUsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGFyY2hpdGVjdHVyZSAqLwotCi0jZGVmaW5lIEVNX05PTkUJCTAJLyogTm8gbWFjaGluZSAqLwotI2RlZmluZSBFTV9NMzIJCTEJLyogQVQmVCBXRSAzMjEwMCAqLwotI2RlZmluZSBFTV9TUEFSQwkyCS8qIFNVTiBTUEFSQyAqLwotI2RlZmluZSBFTV8zODYJCTMJLyogSW50ZWwgODAzODYgKi8KLSNkZWZpbmUgRU1fNjhLCQk0CS8qIE1vdG9yb2xhIG02OGsgZmFtaWx5ICovCi0jZGVmaW5lIEVNXzg4SwkJNQkvKiBNb3Rvcm9sYSBtODhrIGZhbWlseSAqLwotI2RlZmluZSBFTV80ODYJCTYJLyogSW50ZWwgODA0ODYgKi8KLSNkZWZpbmUgRU1fODYwCQk3CS8qIEludGVsIDgwODYwICovCi0jZGVmaW5lIEVNX01JUFMJCTgJLyogTUlQUyBSMzAwMCAob2ZmaWNpYWxseSwgYmlnLWVuZGlhbiBvbmx5KSAqLwotI2RlZmluZSBFTV9TMzcwCQk5CS8qIEFtZGFobCAqLwotI2RlZmluZSBFTV9NSVBTX1JTNF9CRSAxMAkvKiBNSVBTIFI0MDAwIGJpZy1lbmRpYW4gKi8KLQotI2RlZmluZSBFTV9QQVJJU0MgICAgICAxNQkvKiBIUFBBICovCi0jZGVmaW5lIEVNX1ZQUDU1MCAgICAgIDE3ICAgICAgIC8qIEZ1aml0c3UgVlBQNTAwICovCi0jZGVmaW5lIEVNX1NQQVJDMzJQTFVTIDE4CS8qIFN1bidzICJ2OHBsdXMiICovCi0jZGVmaW5lIEVNXzk2MCAgICAgICAgIDE5ICAgICAgIC8qIEludGVsIDgwOTYwICovCi0jZGVmaW5lIEVNX1BQQwkgICAgICAgMjAJLyogUG93ZXJQQyAqLwotCi0jZGVmaW5lIEVNX1Y4MDAgICAgICAgIDM2CS8qIE5FQyBWODAwIHNlcmllcyAqLwotI2RlZmluZSBFTV9GUjIwCSAgICAgICAzNwkvKiBGdWppdHN1IEZSMjAgKi8KLSNkZWZpbmUgRU1fUkgzMgkgICAgICAgMzggICAgICAgLyogVFJXIFJIMzIgKi8KLSNkZWZpbmUgRU1fTUNPUkUgICAgICAgMzkgICAgICAgLyogTW90b3JvbGxhIE1Db3JlICovIC8qIE1heSBhbHNvIGJlIHRha2VuIGJ5IEZ1aml0c3UgTU1BICovCi0jZGVmaW5lIEVNX0FSTQkgICAgICAgNDAJLyogQVJNICovCi0jZGVmaW5lIEVNX09MRF9BTFBIQSAgIDQxCS8qIERpZ2l0YWwgQWxwaGEgKi8KLSNkZWZpbmUgRU1fU0gJICAgICAgIDQyCS8qIEhpdGFjaGkgU0ggKi8KLSNkZWZpbmUgRU1fU1BBUkNWOSAgICAgNDMJLyogU1BBUkMgdjkgNjQtYml0ICovCi0jZGVmaW5lIEVNX1RSSUNPUkUgICAgIDQ0ICAgICAgIC8qIFNpZW1lbnMgVHJpY29yZSBlbWJlZGRlZCBwcm9jZXNzb3IgKi8KLSNkZWZpbmUgRU1fQVJDICAgICAgICAgNDUgICAgICAgLyogQXJnb25hdXQgUklTQyBDb3JlLCBBcmdvbmF1dCBUZWNobm9sb2dpZXMgSW5jLiAqLwotI2RlZmluZSBFTV9IOF8zMDAgICAgICA0NiAgICAgICAvKiBIaXRhY2hpIEg4LzMwMCAqLwotI2RlZmluZSBFTV9IOF8zMDBIICAgICA0NyAgICAgICAvKiBIaXRhY2hpIEg4LzMwMEggKi8KLSNkZWZpbmUgRU1fSDhTICAgICAgICAgNDggICAgICAgLyogSGl0YWNoaSBIOFMgKi8KLSNkZWZpbmUgRU1fSDhfNTAwICAgICAgNDkgICAgICAgLyogSGl0YWNoaSBIOC81MDAgKi8KLSNkZWZpbmUgRU1fSUFfNjQgICAgICAgNTAgICAgICAgLyogSW50ZWwgTWVyY2VkVE0gUHJvY2Vzc29yICovCi0jZGVmaW5lIEVNX01JUFNfWCAgICAgIDUxICAgICAgIC8qIFN0YW5mb3JkIE1JUFMtWCAqLwotI2RlZmluZSBFTV9DT0xERklSRSAgICA1MiAgICAgICAvKiBNb3Rvcm9sYSBDb2xkZmlyZSAqLwotI2RlZmluZSBFTV82OEhDMTIgICAgICA1MyAgICAgICAvKiBNb3Rvcm9sYSBNNjhIQzEyICovCi0KLS8qIElmIGl0IGlzIG5lY2Vzc2FyeSB0byBhc3NpZ24gbmV3IHVub2ZmaWNpYWwgRU1fKiB2YWx1ZXMsIHBsZWFzZSBwaWNrIGxhcmdlCi0gICByYW5kb20gbnVtYmVycyAoMHg4NTIzLCAweGE3ZjIsIGV0Yy4pIHRvIG1pbmltaXplIHRoZSBjaGFuY2VzIG9mIGNvbGxpc2lvbgotICAgd2l0aCBvZmZpY2lhbCBvciBub24tR05VIHVub2ZmaWNpYWwgdmFsdWVzLgotCi0gICBOT1RFOiBEbyBub3QganVzdCBpbmNyZW1lbnQgdGhlIG1vc3QgcmVjZW50IG51bWJlciBieSBvbmUuCi0gICBTb21lYm9keSBlbHNlIHNvbWV3aGVyZSB3aWxsIGRvIGV4YWN0bHkgdGhlIHNhbWUgdGhpbmcsIGFuZCB5b3UKLSAgIHdpbGwgaGF2ZSBhIGNvbGxpc2lvbi4gIEluc3RlYWQsIHBpY2sgYSByYW5kb20gbnVtYmVyLiAgKi8KLQotLyogQ3lnbnVzIFBvd2VyUEMgRUxGIGJhY2tlbmQuICBXcml0dGVuIGluIHRoZSBhYnNlbmNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0NZR05VU19QT1dFUlBDIDB4OTAyNQotCi0vKiBPbGQgdmVyc2lvbiBvZiBTcGFyYyB2OSwgZnJvbSBiZWZvcmUgdGhlIEFCSTsgdGhpcyBzaG91bGQgYmUKLSAgIHJlbW92ZWQgc2hvcnRseS4gICovCi0jZGVmaW5lIEVNX09MRF9TUEFSQ1Y5CTExCi0KLS8qIE9sZCB2ZXJzaW9uIG9mIFBvd2VyUEMsIHRoaXMgc2hvdWxkIGJlIHJlbW92ZWQgc2hvcnRseS4gKi8KLSNkZWZpbmUgRU1fUFBDX09MRAkxNwotCi0vKiBDeWdudXMgQVJDIEVMRiBiYWNrZW5kLiAgV3JpdHRlbiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBBQkkuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfQVJDIDB4OTA0MAotCi0vKiBDeWdudXMgTTMyUiBFTEYgYmFja2VuZC4gIFdyaXR0ZW4gaW4gdGhlIGFic2VuY2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX00zMlIgMHg5MDQxCi0KLS8qIEFscGhhIGJhY2tlbmQgbWFnaWMgbnVtYmVyLiAgV3JpdHRlbiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBBQkkuICAqLwotI2RlZmluZSBFTV9BTFBIQQkweDkwMjYKLQotLyogRDEwViBiYWNrZW5kIG1hZ2ljIG51bWJlci4gIFdyaXR0ZW4gaW4gdGhlIGFic2VuY2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX0QxMFYJMHg3NjUwCi0KLS8qIEQzMFYgYmFja2VuZCBtYWdpYyBudW1iZXIuICBXcml0dGVuIGluIHRoZSBhYnNlbmNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0NZR05VU19EMzBWCTB4NzY3NgotCi0vKiBWODUwIGJhY2tlbmQgbWFnaWMgbnVtYmVyLiAgV3JpdHRlbiBpbiB0aGUgYWJzZW5zZSBvZiBhbiBBQkkuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfVjg1MAkweDkwODAKLQotLyogbW4xMDIwMCBhbmQgbW4xMDMwMCBiYWNrZW5kIG1hZ2ljIG51bWJlcnMuCi0gICBXcml0dGVuIGluIHRoZSBhYnNlbnNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0NZR05VU19NTjEwMjAwCTB4ZGVhZAotI2RlZmluZSBFTV9DWUdOVVNfTU4xMDMwMAkweGJlZWYKLQotLyogRlIzMCBtYWdpYyBudW1iZXIgLSBubyBFQUJJIGF2YWlsYWJsZS4gICovCi0jZGVmaW5lIEVNX0NZR05VU19GUjMwCQkweDMzMzAKLQotLyogU2VlIHRoZSBhYm92ZSBjb21tZW50IGJlZm9yZSB5b3UgYWRkIGEgbmV3IEVNXyogdmFsdWUgaGVyZS4gICovCi0KLS8qIFZhbHVlcyBmb3IgZV92ZXJzaW9uICovCi0KLSNkZWZpbmUgRVZfTk9ORQkJMAkJLyogSW52YWxpZCBFTEYgdmVyc2lvbiAqLwotI2RlZmluZSBFVl9DVVJSRU5UCTEJCS8qIEN1cnJlbnQgdmVyc2lvbiAqLwotCi0vKiBWYWx1ZXMgZm9yIHByb2dyYW0gaGVhZGVyLCBwX3R5cGUgZmllbGQgKi8KLQotI2RlZmluZQlQVF9OVUxMCQkwCQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSB1bnVzZWQgKi8KLSNkZWZpbmUgUFRfTE9BRAkJMQkJLyogTG9hZGFibGUgcHJvZ3JhbSBzZWdtZW50ICovCi0jZGVmaW5lIFBUX0RZTkFNSUMJMgkJLyogRHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIFBUX0lOVEVSUAkzCQkvKiBQcm9ncmFtIGludGVycHJldGVyICovCi0jZGVmaW5lIFBUX05PVEUJCTQJCS8qIEF1eGlsaWFyeSBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBQVF9TSExJQgk1CQkvKiBSZXNlcnZlZCwgdW5zcGVjaWZpZWQgc2VtYW50aWNzICovCi0jZGVmaW5lIFBUX1BIRFIJCTYJCS8qIEVudHJ5IGZvciBoZWFkZXIgdGFibGUgaXRzZWxmICovCi0jZGVmaW5lIFBUX0xPT1MgICAgICAgICAweDYwMDAwMDAwCS8qIE9TLXNwZWNpZmljICovCi0jZGVmaW5lIFBUX0hJT1MgICAgICAgICAweDZmZmZmZmZmCS8qIE9TLXNwZWNpZmljICovCi0jZGVmaW5lIFBUX0xPUFJPQwkweDcwMDAwMDAwCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyAqLwotI2RlZmluZSBQVF9ISVBST0MJMHg3RkZGRkZGRgkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgKi8KLQotLyogUHJvZ3JhbSBzZWdtZW50IHBlcm1pc3Npb25zLCBpbiBwcm9ncmFtIGhlYWRlciBwX2ZsYWdzIGZpZWxkICovCi0KLSNkZWZpbmUgUEZfWAkJKDEgPDwgMCkJLyogU2VnbWVudCBpcyBleGVjdXRhYmxlICovCi0jZGVmaW5lIFBGX1cJCSgxIDw8IDEpCS8qIFNlZ21lbnQgaXMgd3JpdGFibGUgKi8KLSNkZWZpbmUgUEZfUgkJKDEgPDwgMikJLyogU2VnbWVudCBpcyByZWFkYWJsZSAqLwotI2RlZmluZSBQRl9NQVNLT1MJMHgwRjAwMDAwMAkvKiBPUy1zcGVjaWZpYyByZXNlcnZlZCBiaXRzICovCi0jZGVmaW5lIFBGX01BU0tQUk9DCTB4RjAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljIHJlc2VydmVkIGJpdHMgKi8KLQotLyogVmFsdWVzIGZvciBzZWN0aW9uIGhlYWRlciwgc2hfdHlwZSBmaWVsZCAqLwotCi0jZGVmaW5lIFNIVF9OVUxMCTAJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IHVudXNlZCAqLwotI2RlZmluZSBTSFRfUFJPR0JJVFMJMQkJLyogUHJvZ3JhbSBzcGVjaWZpYyAocHJpdmF0ZSkgZGF0YSAqLwotI2RlZmluZSBTSFRfU1lNVEFCCTIJCS8qIExpbmsgZWRpdGluZyBzeW1ib2wgdGFibGUgKi8KLSNkZWZpbmUgU0hUX1NUUlRBQgkzCQkvKiBBIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTSFRfUkVMQQk0CQkvKiBSZWxvY2F0aW9uIGVudHJpZXMgd2l0aCBhZGRlbmRzICovCi0jZGVmaW5lIFNIVF9IQVNICTUJCS8qIEEgc3ltYm9sIGhhc2ggdGFibGUgKi8KLSNkZWZpbmUgU0hUX0RZTkFNSUMJNgkJLyogSW5mb3JtYXRpb24gZm9yIGR5bmFtaWMgbGlua2luZyAqLwotI2RlZmluZSBTSFRfTk9URQk3CQkvKiBJbmZvcm1hdGlvbiB0aGF0IG1hcmtzIGZpbGUgKi8KLSNkZWZpbmUgU0hUX05PQklUUwk4CQkvKiBTZWN0aW9uIG9jY3VwaWVzIG5vIHNwYWNlIGluIGZpbGUgKi8KLSNkZWZpbmUgU0hUX1JFTAkJOQkJLyogUmVsb2NhdGlvbiBlbnRyaWVzLCBubyBhZGRlbmRzICovCi0jZGVmaW5lIFNIVF9TSExJQgkxMAkJLyogUmVzZXJ2ZWQsIHVuc3BlY2lmaWVkIHNlbWFudGljcyAqLwotI2RlZmluZSBTSFRfRFlOU1lNCTExCQkvKiBEeW5hbWljIGxpbmtpbmcgc3ltYm9sIHRhYmxlICovCi0KLSNkZWZpbmUgU0hUX0xPT1MgICAgICAgIDB4NjAwMDAwMDAgICAgICAvKiBPcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljIHNlbWFudGljcywgbG8gKi8KLSNkZWZpbmUgU0hUX0hJT1MgICAgICAgIDB4NmZmZmZmZmYgICAgICAvKiBPcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljIHNlbWFudGljcywgaGkgKi8KLQotLyogVGhlIG5leHQgdGhyZWUgc2VjdGlvbiB0eXBlcyBhcmUgZGVmaW5lZCBieSBTb2xhcmlzLCBhbmQgYXJlIG5hbWVkCi0gICBTSFRfU1VOVyouICBXZSB1c2UgdGhlbSBpbiBHTlUgY29kZSwgc28gd2UgYWxzbyBkZWZpbmUgU0hUX0dOVSoKLSAgIHZlcnNpb25zLiAgKi8KLSNkZWZpbmUgU0hUX1NVTldfdmVyZGVmCTB4NmZmZmZmZmQJLyogVmVyc2lvbnMgZGVmaW5lZCBieSBmaWxlICovCi0jZGVmaW5lIFNIVF9TVU5XX3Zlcm5lZWQgMHg2ZmZmZmZmZQkvKiBWZXJzaW9ucyBuZWVkZWQgYnkgZmlsZSAqLwotI2RlZmluZSBTSFRfU1VOV192ZXJzeW0JMHg2ZmZmZmZmZgkvKiBTeW1ib2wgdmVyc2lvbnMgKi8KLQotI2RlZmluZSBTSFRfR05VX3ZlcmRlZglTSFRfU1VOV192ZXJkZWYKLSNkZWZpbmUgU0hUX0dOVV92ZXJuZWVkCVNIVF9TVU5XX3Zlcm5lZWQKLSNkZWZpbmUgU0hUX0dOVV92ZXJzeW0JU0hUX1NVTldfdmVyc3ltCi0KLSNkZWZpbmUgU0hUX0xPUFJPQwkweDcwMDAwMDAwCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBzZW1hbnRpY3MsIGxvICovCi0jZGVmaW5lIFNIVF9ISVBST0MJMHg3RkZGRkZGRgkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgc2VtYW50aWNzLCBoaSAqLwotI2RlZmluZSBTSFRfTE9VU0VSCTB4ODAwMDAwMDAJLyogQXBwbGljYXRpb24tc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNIVF9ISVVTRVIJMHg4RkZGRkZGRgkvKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLQotLyogVmFsdWVzIGZvciBzZWN0aW9uIGhlYWRlciwgc2hfZmxhZ3MgZmllbGQgKi8KLQotI2RlZmluZSBTSEZfV1JJVEUJKDEgPDwgMCkJLyogV3JpdGFibGUgZGF0YSBkdXJpbmcgZXhlY3V0aW9uICovCi0jZGVmaW5lIFNIRl9BTExPQwkoMSA8PCAxKQkvKiBPY2N1cGllcyBtZW1vcnkgZHVyaW5nIGV4ZWN1dGlvbiAqLwotI2RlZmluZSBTSEZfRVhFQ0lOU1RSCSgxIDw8IDIpCS8qIEV4ZWN1dGFibGUgbWFjaGluZSBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgU0hGX01BU0tPUwkweDBGMDAwMDAwCS8qIE9TLXNwZWNpZmljIHNlbWFudGljcyAqLwotI2RlZmluZSBTSEZfTUFTS1BST0MJMHhGMDAwMDAwMAkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgc2VtYW50aWNzICovCi0KLS8qIFZhbHVlcyBvZiBub3RlIHNlZ21lbnQgZGVzY3JpcHRvciB0eXBlcyBmb3IgY29yZSBmaWxlcy4gKi8KLQotI2RlZmluZSBOVF9QUlNUQVRVUwkxCQkvKiBDb250YWlucyBjb3B5IG9mIHByc3RhdHVzIHN0cnVjdCAqLwotI2RlZmluZSBOVF9GUFJFR1NFVAkyCQkvKiBDb250YWlucyBjb3B5IG9mIGZwcmVnc2V0IHN0cnVjdCAqLwotI2RlZmluZSBOVF9QUlBTSU5GTwkzCQkvKiBDb250YWlucyBjb3B5IG9mIHBycHNpbmZvIHN0cnVjdCAqLwotCi0vKiBOb3RlIHNlZ21lbnRzIGZvciBjb3JlIGZpbGVzIG9uIGRpci1zdHlsZSBwcm9jZnMgc3lzdGVtcy4gKi8KLQotI2RlZmluZSBOVF9QU1RBVFVTCTEwCQkvKiBIYXMgYSBzdHJ1Y3QgcHN0YXR1cyAqLwotI2RlZmluZSBOVF9GUFJFR1MJMTIJCS8qIEhhcyBhIHN0cnVjdCBmcHJlZ3NldCAqLwotI2RlZmluZSBOVF9QU0lORk8JMTMJCS8qIEhhcyBhIHN0cnVjdCBwc2luZm8gKi8KLSNkZWZpbmUgTlRfTFdQU1RBVFVTCTE2CQkvKiBIYXMgYSBzdHJ1Y3QgbHdwc3RhdHVzX3QgKi8KLSNkZWZpbmUgTlRfTFdQU0lORk8JMTcJCS8qIEhhcyBhIHN0cnVjdCBsd3BzaW5mb190ICovCi0KLS8qIFZhbHVlcyBvZiBub3RlIHNlZ21lbnQgZGVzY3JpcHRvciB0eXBlcyBmb3Igb2JqZWN0IGZpbGVzLiAgKi8KLS8qIChPbmx5IGZvciBocHBhIHJpZ2h0IG5vdy4gIFNob3VsZCB0aGlzIGJlIG1vdmVkIGVsc2V3aGVyZT8pICAqLwotCi0jZGVmaW5lIE5UX1ZFUlNJT04JMQkJLyogQ29udGFpbnMgYSB2ZXJzaW9uIHN0cmluZy4gICovCi0KLS8qIFRoZXNlIHRocmVlIG1hY3JvcyBkaXNhc3NlbWJsZSBhbmQgYXNzZW1ibGUgYSBzeW1ib2wgdGFibGUgc3RfaW5mbyBmaWVsZCwKLSAgIHdoaWNoIGNvbnRhaW5zIHRoZSBzeW1ib2wgYmluZGluZyBhbmQgc3ltYm9sIHR5cGUuICBUaGUgU1RCXyBhbmQgU1RUXwotICAgZGVmaW5lcyBpZGVudGlmeSB0aGUgYmluZGluZyBhbmQgdHlwZS4gKi8KLQotI2RlZmluZSBFTEZfU1RfQklORCh2YWwpCQkoKCh1bnNpZ25lZCBpbnQpKHZhbCkpID4+IDQpCi0jZGVmaW5lIEVMRl9TVF9UWVBFKHZhbCkJCSgodmFsKSAmIDB4RikKLSNkZWZpbmUgRUxGX1NUX0lORk8oYmluZCx0eXBlKQkJKCgoYmluZCkgPDwgNCkgKyAoKHR5cGUpICYgMHhGKSkKLQotI2RlZmluZSBTVE5fVU5ERUYJMAkJLyogdW5kZWZpbmVkIHN5bWJvbCBpbmRleCAqLwotCi0jZGVmaW5lIFNUQl9MT0NBTAkwCQkvKiBTeW1ib2wgbm90IHZpc2libGUgb3V0c2lkZSBvYmogKi8KLSNkZWZpbmUgU1RCX0dMT0JBTAkxCQkvKiBTeW1ib2wgdmlzaWJsZSBvdXRzaWRlIG9iaiAqLwotI2RlZmluZSBTVEJfV0VBSwkyCQkvKiBMaWtlIGdsb2JhbHMsIGxvd2VyIHByZWNlZGVuY2UgKi8KLSNkZWZpbmUgU1RCX0xPT1MgICAgICAgIDEwCQkvKiBPUy1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU1RCX0hJT1MgICAgICAgIDEyCQkvKiBPUy1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU1RCX0xPUFJPQwkxMwkJLyogQXBwbGljYXRpb24tc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUQl9ISVBST0MJMTUJCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotCi0jZGVmaW5lIFNUVF9OT1RZUEUJMAkJLyogU3ltYm9sIHR5cGUgaXMgdW5zcGVjaWZpZWQgKi8KLSNkZWZpbmUgU1RUX09CSkVDVAkxCQkvKiBTeW1ib2wgaXMgYSBkYXRhIG9iamVjdCAqLwotI2RlZmluZSBTVFRfRlVOQwkyCQkvKiBTeW1ib2wgaXMgYSBjb2RlIG9iamVjdCAqLwotI2RlZmluZSBTVFRfU0VDVElPTgkzCQkvKiBTeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgc2VjdGlvbiAqLwotI2RlZmluZSBTVFRfRklMRQk0CQkvKiBTeW1ib2wgZ2l2ZXMgYSBmaWxlIG5hbWUgKi8KLSNkZWZpbmUgU1RUX0xPT1MgICAgICAgIDEwCQkvKiBPUy1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU1RUX0hJT1MgICAgICAgIDEyCQkvKiBPUy1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU1RUX0xPUFJPQwkxMwkJLyogQXBwbGljYXRpb24tc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUVF9ISVBST0MJMTUJCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotCi0vKiBTcGVjaWFsIHNlY3Rpb24gaW5kaWNlcywgd2hpY2ggbWF5IHNob3cgdXAgaW4gc3Rfc2huZHggZmllbGRzLCBhbW9uZwotICAgb3RoZXIgcGxhY2VzLiAqLwotCi0jZGVmaW5lIFNITl9VTkRFRgkwCQkvKiBVbmRlZmluZWQgc2VjdGlvbiByZWZlcmVuY2UgKi8KLSNkZWZpbmUgU0hOX0xPUkVTRVJWRQkweEZGMDAJCS8qIEJlZ2luIHJhbmdlIG9mIHJlc2VydmVkIGluZGljZXMgKi8KLSNkZWZpbmUgU0hOX0xPUFJPQwkweEZGMDAJCS8qIEJlZ2luIHJhbmdlIG9mIGFwcGwtc3BlY2lmaWMgKi8KLSNkZWZpbmUgU0hOX0hJUFJPQwkweEZGMUYJCS8qIEVuZCByYW5nZSBvZiBhcHBsLXNwZWNpZmljICovCi0jZGVmaW5lIFNITl9MT09TICAgICAgICAweEZGMjAJCS8qIE9TIHNwZWNpZmljIHNlbWFudGljcywgbG8gKi8KLSNkZWZpbmUgU0hOX0hJT1MgICAgICAgIDB4RkYzRgkJLyogT1Mgc3BlY2lmaWMgc2VtYW50aWNzLCBoaSAqLwotI2RlZmluZSBTSE5fQUJTCQkweEZGRjEJCS8qIEFzc29jaWF0ZWQgc3ltYm9sIGlzIGFic29sdXRlICovCi0jZGVmaW5lIFNITl9DT01NT04JMHhGRkYyCQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBpcyBpbiBjb21tb24gKi8KLSNkZWZpbmUgU0hOX0hJUkVTRVJWRQkweEZGRkYJCS8qIEVuZCByYW5nZSBvZiByZXNlcnZlZCBpbmRpY2VzICovCi0KLS8qIHJlbG9jYXRpb24gaW5mbyBoYW5kbGluZyBtYWNyb3MgKi8KLQotI2RlZmluZSBFTEYzMl9SX1NZTShpKQkJKChpKSA+PiA4KQotI2RlZmluZSBFTEYzMl9SX1RZUEUoaSkJCSgoaSkgJiAweGZmKQotI2RlZmluZSBFTEYzMl9SX0lORk8ocyx0KQkoKChzKSA8PCA4KSArICgodCkgJiAweGZmKSkKLQotI2RlZmluZSBFTEY2NF9SX1NZTShpKQkJKChpKSA+PiAzMikKLSNkZWZpbmUgRUxGNjRfUl9UWVBFKGkpCQkoKGkpICYgMHhmZmZmZmZmZikKLSNkZWZpbmUgRUxGNjRfUl9JTkZPKHMsdCkJKCgoYmZkX3ZtYSkgKHMpIDw8IDMyKSArIChiZmRfdm1hKSAodCkpCi0KLS8qIER5bmFtaWMgc2VjdGlvbiB0YWdzICovCi0KLSNkZWZpbmUgRFRfTlVMTAkJMAotI2RlZmluZSBEVF9ORUVERUQJMQotI2RlZmluZSBEVF9QTFRSRUxTWgkyCi0jZGVmaW5lIERUX1BMVEdPVAkzCi0jZGVmaW5lIERUX0hBU0gJCTQKLSNkZWZpbmUgRFRfU1RSVEFCCTUKLSNkZWZpbmUgRFRfU1lNVEFCCTYKLSNkZWZpbmUgRFRfUkVMQQkJNwotI2RlZmluZSBEVF9SRUxBU1oJOAotI2RlZmluZSBEVF9SRUxBRU5UCTkKLSNkZWZpbmUgRFRfU1RSU1oJMTAKLSNkZWZpbmUgRFRfU1lNRU5UCTExCi0jZGVmaW5lIERUX0lOSVQJCTEyCi0jZGVmaW5lIERUX0ZJTkkJCTEzCi0jZGVmaW5lIERUX1NPTkFNRQkxNAotI2RlZmluZSBEVF9SUEFUSAkxNQotI2RlZmluZSBEVF9TWU1CT0xJQwkxNgotI2RlZmluZSBEVF9SRUwJCTE3Ci0jZGVmaW5lIERUX1JFTFNaCTE4Ci0jZGVmaW5lIERUX1JFTEVOVAkxOQotI2RlZmluZSBEVF9QTFRSRUwJMjAKLSNkZWZpbmUgRFRfREVCVUcJMjEKLSNkZWZpbmUgRFRfVEVYVFJFTAkyMgotI2RlZmluZSBEVF9KTVBSRUwJMjMKLSNkZWZpbmUgRFRfQklORF9OT1cgICAgIDI0Ci0jZGVmaW5lIERUX0lOSVRfQVJSQVkgICAyNQotI2RlZmluZSBEVF9GSU5JX0FSUkFZICAgMjYKLSNkZWZpbmUgRFRfSU5JVF9BUlJBWVNaIDI3Ci0jZGVmaW5lIERUX0ZJTklfQVJSQVlTWiAyOAotCi0jZGVmaW5lIERUX0xPT1MgICAgICAgICAweDYwMDAwMDAwCi0jZGVmaW5lIERUX0hJT1MgICAgICAgICAweDZmZmZmZmZmCi0KLS8qIFRoZSBuZXh0IGZvdXIgZHluYW1pYyB0YWdzIGFyZSB1c2VkIG9uIFNvbGFyaXMuICBXZSBzdXBwb3J0IHRoZW0KLSAgIGV2ZXJ5d2hlcmUuICAqLwotI2RlZmluZSBEVF9WQUxSTkdMTwkweDZmZmZmZDAwCi0jZGVmaW5lIERUX1BMVFBBRFNaCTB4NmZmZmZkZjkKLSNkZWZpbmUgRFRfTU9WRUVOVAkweDZmZmZmZGZhCi0jZGVmaW5lIERUX01PVkVTWgkweDZmZmZmZGZiCi0jZGVmaW5lIERUX0ZFQVRVUkVfMQkweDZmZmZmZGZjCi0jZGVmaW5lIERUX1BPU0ZMQUdfMQkweDZmZmZmZGZkCi0jZGVmaW5lIERUX1NZTUlOU1oJMHg2ZmZmZmRmZQotI2RlZmluZSBEVF9TWU1JTkVOVAkweDZmZmZmZGZmCi0jZGVmaW5lIERUX1ZBTFJOR0hJCTB4NmZmZmZkZmYKLQotI2RlZmluZSBEVF9BRERSUk5HTE8JMHg2ZmZmZmUwMAotI2RlZmluZSBEVF9TWU1JTkZPCTB4NmZmZmZlZmYKLSNkZWZpbmUgRFRfQUREUlJOR0hJCTB4NmZmZmZlZmYKLQotI2RlZmluZSBEVF9SRUxBQ09VTlQJMHg2ZmZmZmZmOQotI2RlZmluZSBEVF9SRUxDT1VOVAkweDZmZmZmZmZhCi0jZGVmaW5lIERUX0ZMQUdTXzEJMHg2ZmZmZmZmYgotI2RlZmluZSBEVF9WRVJERUYJMHg2ZmZmZmZmYwotI2RlZmluZSBEVF9WRVJERUZOVU0JMHg2ZmZmZmZmZAotI2RlZmluZSBEVF9WRVJORUVECTB4NmZmZmZmZmUKLSNkZWZpbmUgRFRfVkVSTkVFRE5VTQkweDZmZmZmZmZmCi0KLS8qIFRoaXMgdGFnIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU29sYXJpcyB2ZXJzaW9uIHNjaGVtZS4gICovCi0jZGVmaW5lIERUX1ZFUlNZTQkweDZmZmZmZmYwCi0KLSNkZWZpbmUgRFRfTE9QUk9DCTB4NzAwMDAwMDAKLSNkZWZpbmUgRFRfSElQUk9DCTB4N2ZmZmZmZmYKLQotLyogVGhlc2Ugc2VjdGlvbiB0YWdzIGFyZSB1c2VkIG9uIFNvbGFyaXMuICBXZSBzdXBwb3J0IHRoZW0KLSAgIGV2ZXJ5d2hlcmUsIGFuZCBob3BlIHRoZXkgZG8gbm90IGNvbmZsaWN0LiAgKi8KLQotI2RlZmluZSBEVF9BVVhJTElBUlkJMHg3ZmZmZmZmZAotI2RlZmluZSBEVF9VU0VECQkweDdmZmZmZmZlCi0jZGVmaW5lIERUX0ZJTFRFUgkweDdmZmZmZmZmCi0KLS8qIFZhbHVlcyB1c2VkIGluIERUX0ZFQVRVUkVfMSAuZHluYW1pYyBlbnRyeS4gICovCi0jZGVmaW5lIERURl8xX1BBUklOSVQJMHgwMDAwMDAwMQotCi0vKiBGbGFnIHZhbHVlcyB1c2VkIGluIHRoZSBEVF9QT1NGTEFHXzEgLmR5bmFtaWMgZW50cnkuICAqLwotI2RlZmluZSBERl9QMV9MQVpZTE9BRAkweDAwMDAwMDAxCi0jZGVmaW5lIERGX1AxX0dST1VQUEVSTQkweDAwMDAwMDAyCi0KLS8qIEZsYWcgdmFsdWUgaW4gaW4gdGhlIERUXzFfRkxBR1MgLmR5bmFtaWMgZW50cnkuICAqLwotI2RlZmluZSBERl8xX05PVwkweDAwMDAwMDAxCi0jZGVmaW5lIERGXzFfR0xPQkFMCTB4MDAwMDAwMDIKLSNkZWZpbmUgREZfMV9HUk9VUAkweDAwMDAwMDA0Ci0jZGVmaW5lIERGXzFfTk9ERUxFVEUJMHgwMDAwMDAwOAotI2RlZmluZSBERl8xX0xPQURGTFRSCTB4MDAwMDAwMTAKLSNkZWZpbmUgREZfMV9JTklURklSU1QJMHgwMDAwMDAyMAotI2RlZmluZSBERl8xX05PT1BFTgkweDAwMDAwMDQwCi0jZGVmaW5lIERGXzFfT1JJR0lOCTB4MDAwMDAwODAKLSNkZWZpbmUgREZfMV9ESVJFQ1QJMHgwMDAwMDEwMAotI2RlZmluZSBERl8xX1RSQU5TCTB4MDAwMDAyMDAKLSNkZWZpbmUgREZfMV9JTlRFUlBPU0UJMHgwMDAwMDQwMAotCi0vKiBUaGVzZSBjb25zdGFudHMgYXJlIHVzZWQgZm9yIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBhIEVsZjMyX1ZlcmRlZgotICAgc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBWRVJfREVGX05PTkUJCTAKLSNkZWZpbmUgVkVSX0RFRl9DVVJSRU5UCQkxCi0KLS8qIFRoZXNlIGNvbnN0YW50cyBhcHBlYXIgaW4gdGhlIHZkX2ZsYWdzIGZpZWxkIG9mIGEgRWxmMzJfVmVyZGVmCi0gICBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIFZFUl9GTEdfQkFTRQkJMHgxCi0jZGVmaW5lIFZFUl9GTEdfV0VBSwkJMHgyCi0KLS8qIFRoZXNlIHNwZWNpYWwgY29uc3RhbnRzIGNhbiBiZSBmb3VuZCBpbiBhbiBFbGYzMl9WZXJzeW0gZmllbGQuICAqLwotCi0jZGVmaW5lIFZFUl9ORFhfTE9DQUwJCTAKLSNkZWZpbmUgVkVSX05EWF9HTE9CQUwJCTEKLQotLyogVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIGZvciB0aGUgdmVyc2lvbiBudW1iZXIgb2YgYSBFbGYzMl9WZXJuZWVkCi0gICBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIFZFUl9ORUVEX05PTkUJCTAKLSNkZWZpbmUgVkVSX05FRURfQ1VSUkVOVAkxCi0KLS8qIFRoaXMgZmxhZyBhcHBlYXJzIGluIGEgVmVyc3ltIHN0cnVjdHVyZS4gIEl0IG1lYW5zIHRoYXQgdGhlIHN5bWJvbAotICAgaXMgaGlkZGVuLCBhbmQgaXMgb25seSB2aXNpYmxlIHdpdGggYW4gZXhwbGljaXQgdmVyc2lvbiBudW1iZXIuCi0gICBUaGlzIGlzIGEgR05VIGV4dGVuc2lvbi4gICovCi0KLSNkZWZpbmUgVkVSU1lNX0hJRERFTgkJMHg4MDAwCi0KLS8qIFRoaXMgaXMgdGhlIG1hc2sgZm9yIHRoZSByZXN0IG9mIHRoZSBWZXJzeW0gaW5mb3JtYXRpb24uICAqLwotCi0jZGVmaW5lIFZFUlNZTV9WRVJTSU9OCQkweDdmZmYKLQotLyogVGhpcyBpcyBhIHNwZWNpYWwgdG9rZW4gd2hpY2ggYXBwZWFycyBhcyBwYXJ0IG9mIGEgc3ltYm9sIG5hbWUuICBJdAotICAgaW5kaWN0ZXMgdGhhdCB0aGUgcmVzdCBvZiB0aGUgbmFtZSBpcyBhY3R1YWxseSB0aGUgbmFtZSBvZiBhCi0gICB2ZXJzaW9uIG5vZGUsIGFuZCBpcyBub3QgcGFydCBvZiB0aGUgYWN0dWFsIG5hbWUuICBUaGlzIGlzIGEgR05VCi0gICBleHRlbnNpb24uICBGb3IgZXhhbXBsZSwgdGhlIHN5bWJvbCBuYW1lIGBzdGF0QHZlcjInIGlzIHRha2VuIHRvCi0gICBtZWFuIHRoZSBzeW1ib2wgYHN0YXQnIGluIHZlcnNpb24gYHZlcjInLiAgKi8KLQotI2RlZmluZSBFTEZfVkVSX0NIUgknQCcKLQotLyogUG9zc2libGUgdmFsdWVzIGZvciBzaV9ib3VuZHRvLiAgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9TRUxGCQkweGZmZmYJLyogU3ltYm9sIGJvdW5kIHRvIHNlbGYgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9QQVJFTlQJMHhmZmZlCS8qIFN5bWJvbCBib3VuZCB0byBwYXJlbnQgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9MT1dSRVNFUlZFCTB4ZmYwMAkvKiBCZWdpbm5pbmcgb2YgcmVzZXJ2ZWQgZW50cmllcyAqLwotCi0vKiBQb3NzaWJsZSBiaXRtYXNrcyBmb3Igc2lfZmxhZ3MuICAqLwotI2RlZmluZSBTWU1JTkZPX0ZMR19ESVJFQ1QJMHgwMDAxCS8qIERpcmVjdCBib3VuZCBzeW1ib2wgKi8KLSNkZWZpbmUgU1lNSU5GT19GTEdfUEFTU1RIUlUJMHgwMDAyCS8qIFBhc3MtdGhydSBzeW1ib2wgZm9yIHRyYW5zbGF0b3IgKi8KLSNkZWZpbmUgU1lNSU5GT19GTEdfQ09QWQkweDAwMDQJLyogU3ltYm9sIGlzIGEgY29weS1yZWxvYyAqLwotI2RlZmluZSBTWU1JTkZPX0ZMR19MQVpZTE9BRAkweDAwMDgJLyogU3ltYm9sIGJvdW5kIHRvIG9iamVjdCB0byBiZSBsYXp5Ci0JCQkJCSAgIGxvYWRlZCAqLwotLyogU3ltaW5mbyB2ZXJzaW9uIHZhbHVlcy4gICovCi0jZGVmaW5lIFNZTUlORk9fTk9ORQkJMAotI2RlZmluZSBTWU1JTkZPX0NVUlJFTlQJCTEKLSNkZWZpbmUgU1lNSU5GT19OVU0JCTIKLQotI2VuZGlmIC8qIF9FTEZfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2QxMHYuaCBiL2luY2x1ZGUvZWxmL2QxMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiNzljOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9kMTB2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBkMTB2IEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX0QxMFZfSAotI2RlZmluZSBfRUxGX0QxMFZfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9kMTB2X3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzEwX1BDUkVMX1IsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzEwX1BDUkVMX0wsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzE2LCAzKQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl8xOCwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX0QxMFZfMThfUENSRUwsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzMyLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl9HTlVfVlRJTkhFUklULCA3KQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl9HTlVfVlRFTlRSWSwgOCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvZDMwdi5oIGIvaW5jbHVkZS9lbGYvZDMwdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGJhZDE5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2QzMHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIGQzMHYgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfRDMwVl9ICi0jZGVmaW5lIF9FTEZfRDMwVl9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9kMzB2X3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzYsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzlfUENSRUwsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzlfUENSRUxfUiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMTUsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzE1X1BDUkVMLCA1KQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8xNV9QQ1JFTF9SLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8yMSwgNykKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMjFfUENSRUwsIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzIxX1BDUkVMX1IsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzMyLCAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMzJfUENSRUwsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8zMl9OT1JNQUwsIDEyKQotRU5EX1JFTE9DX05VTUJFUlMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9kd2FyZi5oIGIvaW5jbHVkZS9lbGYvZHdhcmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzM2Q1ZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9kd2FyZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qIERlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgb2YgY29kZXMgcmVsYXRpbmcgdG8gdGhlIERXQVJGIHN5bWJvbGljCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9ybWF0LgotCi0gICBXcml0dGVuIGJ5IFJvbiBHdWlsbWV0dGUgKHJmZ0BuY2QuY29tKQotCi1Db3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLQotR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBEV0FSRiBzcGVjaWZpY2F0aW9uIChhIHB1YmxpYyBkb2N1bWVudCkKLSAgIFJldmlzaW9uIDEuMC4xIChBcHJpbCA4LCAxOTkyKSBkZXZlbG9wZWQgYnkgdGhlIFVOSVggSW50ZXJuYXRpb25hbAotICAgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2VzIFNwZWNpYWwgSW50ZXJlc3QgR3JvdXAgKFVJL1BMU0lHKSBhbmQgZGlzdHJpYnV0ZWQKLSAgIGJ5IFVOSVggSW50ZXJuYXRpb25hbC4gIENvcGllcyBvZiB0aGlzIHNwZWNpZmljYXRpb24gYXJlIGF2YWlsYWJsZSBmcm9tCi0gICBVTklYIEludGVybmF0aW9uYWwsIDIwIFdhdGVydmlldyBCb3VsZXZhcmQsIFBhcnNpcHBhbnksIE5KLCAwNzA1NC4KLSovCi0KLSNpZm5kZWYgX0VMRl9EV0FSRl9ICi0jZGVmaW5lIF9FTEZfRFdBUkZfSAotCi0vKiBUYWcgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl90YWcgewotICAgIFRBR19wYWRkaW5nCQkJPSAweDAwMDAsCi0gICAgVEFHX2FycmF5X3R5cGUJCT0gMHgwMDAxLAotICAgIFRBR19jbGFzc190eXBlCQk9IDB4MDAwMiwKLSAgICBUQUdfZW50cnlfcG9pbnQJCT0gMHgwMDAzLAotICAgIFRBR19lbnVtZXJhdGlvbl90eXBlCT0gMHgwMDA0LAotICAgIFRBR19mb3JtYWxfcGFyYW1ldGVyCT0gMHgwMDA1LAotICAgIFRBR19nbG9iYWxfc3Vicm91dGluZQk9IDB4MDAwNiwKLSAgICBUQUdfZ2xvYmFsX3ZhcmlhYmxlCQk9IDB4MDAwNywKLSAgICAJCQkJLyogMHgwMDA4IC0tIHJlc2VydmVkICovCi0JCQkJLyogMHgwMDA5IC0tIHJlc2VydmVkICovCi0gICAgVEFHX2xhYmVsCQkJPSAweDAwMGEsCi0gICAgVEFHX2xleGljYWxfYmxvY2sJCT0gMHgwMDBiLAotICAgIFRBR19sb2NhbF92YXJpYWJsZQkJPSAweDAwMGMsCi0gICAgVEFHX21lbWJlcgkJCT0gMHgwMDBkLAotCQkJCS8qIDB4MDAwZSAtLSByZXNlcnZlZCAqLwotICAgIFRBR19wb2ludGVyX3R5cGUJCT0gMHgwMDBmLAotICAgIFRBR19yZWZlcmVuY2VfdHlwZQkJPSAweDAwMTAsCi0gICAgVEFHX2NvbXBpbGVfdW5pdAkJPSAweDAwMTEsCi0gICAgVEFHX3N0cmluZ190eXBlCQk9IDB4MDAxMiwKLSAgICBUQUdfc3RydWN0dXJlX3R5cGUJCT0gMHgwMDEzLAotICAgIFRBR19zdWJyb3V0aW5lCQk9IDB4MDAxNCwKLSAgICBUQUdfc3Vicm91dGluZV90eXBlCQk9IDB4MDAxNSwKLSAgICBUQUdfdHlwZWRlZgkJCT0gMHgwMDE2LAotICAgIFRBR191bmlvbl90eXBlCQk9IDB4MDAxNywKLSAgICBUQUdfdW5zcGVjaWZpZWRfcGFyYW1ldGVycwk9IDB4MDAxOCwKLSAgICBUQUdfdmFyaWFudAkJCT0gMHgwMDE5LAotICAgIFRBR19jb21tb25fYmxvY2sJCT0gMHgwMDFhLAotICAgIFRBR19jb21tb25faW5jbHVzaW9uCT0gMHgwMDFiLAotICAgIFRBR19pbmhlcml0YW5jZQkJPSAweDAwMWMsCi0gICAgVEFHX2lubGluZWRfc3Vicm91dGluZQk9IDB4MDAxZCwKLSAgICBUQUdfbW9kdWxlCQkJPSAweDAwMWUsCi0gICAgVEFHX3B0cl90b19tZW1iZXJfdHlwZQk9IDB4MDAxZiwKLSAgICBUQUdfc2V0X3R5cGUJCT0gMHgwMDIwLAotICAgIFRBR19zdWJyYW5nZV90eXBlCQk9IDB4MDAyMSwKLSAgICBUQUdfd2l0aF9zdG10CQk9IDB4MDAyMiwKLQotICAgIC8qIEdOVSBleHRlbnNpb25zICovCi0KLSAgICBUQUdfZm9ybWF0X2xhYmVsCQk9IDB4ODAwMCwgIC8qIGZvciBGT1JUUkFOIDc3IGFuZCBGb3J0cmFuIDkwICovCi0gICAgVEFHX25hbWVsaXN0CQk9IDB4ODAwMSwgIC8qIEZvciBGb3J0cmFuIDkwICovCi0gICAgVEFHX2Z1bmN0aW9uX3RlbXBsYXRlCT0gMHg4MDAyLCAgLyogZm9yIEMrKyAqLwotICAgIFRBR19jbGFzc190ZW1wbGF0ZQkJPSAweDgwMDMgICAvKiBmb3IgQysrICovCi19OwotCi0jZGVmaW5lIFRBR19sb191c2VyCTB4ODAwMCAgLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBUQUdfaGlfdXNlcgkweGZmZmYgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2UgZW5kICovCi0jZGVmaW5lIFRBR19zb3VyY2VfZmlsZSBUQUdfY29tcGlsZV91bml0ICAvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotCi0vKiBGb3JtIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfZm9ybSB7Ci0gICAgRk9STV9BRERSCT0gMHgxLAotICAgIEZPUk1fUkVGCT0gMHgyLAotICAgIEZPUk1fQkxPQ0syCT0gMHgzLAotICAgIEZPUk1fQkxPQ0s0CT0gMHg0LAotICAgIEZPUk1fREFUQTIJPSAweDUsCi0gICAgRk9STV9EQVRBNAk9IDB4NiwKLSAgICBGT1JNX0RBVEE4CT0gMHg3LAotICAgIEZPUk1fU1RSSU5HCT0gMHg4Ci19OwotCi0vKiBBdHRyaWJ1dGUgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9hdHRyaWJ1dGUgewotICAgIEFUX3NpYmxpbmcJCQk9ICgweDAwMTB8Rk9STV9SRUYpLAotICAgIEFUX2xvY2F0aW9uCQkJPSAoMHgwMDIwfEZPUk1fQkxPQ0syKSwKLSAgICBBVF9uYW1lCQkJPSAoMHgwMDMwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9mdW5kX3R5cGUJCT0gKDB4MDA1MHxGT1JNX0RBVEEyKSwKLSAgICBBVF9tb2RfZnVuZF90eXBlCQk9ICgweDAwNjB8Rk9STV9CTE9DSzIpLAotICAgIEFUX3VzZXJfZGVmX3R5cGUJCT0gKDB4MDA3MHxGT1JNX1JFRiksCi0gICAgQVRfbW9kX3VfZF90eXBlCQk9ICgweDAwODB8Rk9STV9CTE9DSzIpLAotICAgIEFUX29yZGVyaW5nCQkJPSAoMHgwMDkwfEZPUk1fREFUQTIpLAotICAgIEFUX3N1YnNjcl9kYXRhCQk9ICgweDAwYTB8Rk9STV9CTE9DSzIpLAotICAgIEFUX2J5dGVfc2l6ZQkJPSAoMHgwMGIwfEZPUk1fREFUQTQpLAotICAgIEFUX2JpdF9vZmZzZXQJCT0gKDB4MDBjMHxGT1JNX0RBVEEyKSwKLSAgICBBVF9iaXRfc2l6ZQkJCT0gKDB4MDBkMHxGT1JNX0RBVEE0KSwKLQkJCQkvKiAoMHgwMGUwfEZPUk1feHh4eCkgLS0gcmVzZXJ2ZWQgKi8KLSAgICBBVF9lbGVtZW50X2xpc3QJCT0gKDB4MDBmMHxGT1JNX0JMT0NLNCksCi0gICAgQVRfc3RtdF9saXN0CQk9ICgweDAxMDB8Rk9STV9EQVRBNCksCi0gICAgQVRfbG93X3BjCQkJPSAoMHgwMTEwfEZPUk1fQUREUiksCi0gICAgQVRfaGlnaF9wYwkJCT0gKDB4MDEyMHxGT1JNX0FERFIpLAotICAgIEFUX2xhbmd1YWdlCQkJPSAoMHgwMTMwfEZPUk1fREFUQTQpLAotICAgIEFUX21lbWJlcgkJCT0gKDB4MDE0MHxGT1JNX1JFRiksCi0gICAgQVRfZGlzY3IJCQk9ICgweDAxNTB8Rk9STV9SRUYpLAotICAgIEFUX2Rpc2NyX3ZhbHVlCQk9ICgweDAxNjB8Rk9STV9CTE9DSzIpLAotCQkJCS8qICgweDAxNzB8Rk9STV94eHh4KSAtLSByZXNlcnZlZCAqLwotCQkJCS8qICgweDAxODB8Rk9STV94eHh4KSAtLSByZXNlcnZlZCAqLwotICAgIEFUX3N0cmluZ19sZW5ndGgJCT0gKDB4MDE5MHxGT1JNX0JMT0NLMiksCi0gICAgQVRfY29tbW9uX3JlZmVyZW5jZQkJPSAoMHgwMWEwfEZPUk1fUkVGKSwKLSAgICBBVF9jb21wX2RpcgkJCT0gKDB4MDFiMHxGT1JNX1NUUklORyksCi0gICAgICAgIEFUX2NvbnN0X3ZhbHVlX3N0cmluZwk9ICgweDAxYzB8Rk9STV9TVFJJTkcpLAotICAgICAgICBBVF9jb25zdF92YWx1ZV9kYXRhMgk9ICgweDAxYzB8Rk9STV9EQVRBMiksCi0gICAgICAgIEFUX2NvbnN0X3ZhbHVlX2RhdGE0CT0gKDB4MDFjMHxGT1JNX0RBVEE0KSwKLSAgICAgICAgQVRfY29uc3RfdmFsdWVfZGF0YTgJPSAoMHgwMWMwfEZPUk1fREFUQTgpLAotICAgICAgICBBVF9jb25zdF92YWx1ZV9ibG9jazIJPSAoMHgwMWMwfEZPUk1fQkxPQ0syKSwKLSAgICAgICAgQVRfY29uc3RfdmFsdWVfYmxvY2s0CT0gKDB4MDFjMHxGT1JNX0JMT0NLNCksCi0gICAgQVRfY29udGFpbmluZ190eXBlCQk9ICgweDAxZDB8Rk9STV9SRUYpLAotICAgICAgICBBVF9kZWZhdWx0X3ZhbHVlX2FkZHIJPSAoMHgwMWUwfEZPUk1fQUREUiksCi0gICAgICAgIEFUX2RlZmF1bHRfdmFsdWVfZGF0YTIJPSAoMHgwMWUwfEZPUk1fREFUQTIpLAotICAgICAgICBBVF9kZWZhdWx0X3ZhbHVlX2RhdGE0CT0gKDB4MDFlMHxGT1JNX0RBVEE0KSwKLSAgICAgICAgQVRfZGVmYXVsdF92YWx1ZV9kYXRhOAk9ICgweDAxZTB8Rk9STV9EQVRBOCksCi0gICAgICAgIEFUX2RlZmF1bHRfdmFsdWVfc3RyaW5nCT0gKDB4MDFlMHxGT1JNX1NUUklORyksCi0gICAgQVRfZnJpZW5kcwkJCT0gKDB4MDFmMHxGT1JNX0JMT0NLMiksCi0gICAgQVRfaW5saW5lCQkJPSAoMHgwMjAwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9pc19vcHRpb25hbAkJPSAoMHgwMjEwfEZPUk1fU1RSSU5HKSwKLSAgICAgICAgQVRfbG93ZXJfYm91bmRfcmVmCT0gKDB4MDIyMHxGT1JNX1JFRiksCi0gICAgICAgIEFUX2xvd2VyX2JvdW5kX2RhdGEyCT0gKDB4MDIyMHxGT1JNX0RBVEEyKSwKLSAgICAgICAgQVRfbG93ZXJfYm91bmRfZGF0YTQJPSAoMHgwMjIwfEZPUk1fREFUQTQpLAotICAgICAgICBBVF9sb3dlcl9ib3VuZF9kYXRhOAk9ICgweDAyMjB8Rk9STV9EQVRBOCksCi0gICAgQVRfcHJpdmF0ZQkJCT0gKDB4MDI0MHxGT1JNX1NUUklORyksCi0gICAgQVRfcHJvZHVjZXIJCQk9ICgweDAyNTB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3Byb2dyYW0JCQk9ICgweDAyMzB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3Byb3RlY3RlZAkJPSAoMHgwMjYwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9wcm90b3R5cGVkCQk9ICgweDAyNzB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3B1YmxpYwkJCT0gKDB4MDI4MHxGT1JNX1NUUklORyksCi0gICAgQVRfcHVyZV92aXJ0dWFsCQk9ICgweDAyOTB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3JldHVybl9hZGRyCQk9ICgweDAyYTB8Rk9STV9CTE9DSzIpLAotICAgIEFUX2Fic3RyYWN0X29yaWdpbgkJPSAoMHgwMmIwfEZPUk1fUkVGKSwKLSAgICBBVF9zdGFydF9zY29wZQkJPSAoMHgwMmMwfEZPUk1fREFUQTQpLAotICAgIEFUX3N0cmlkZV9zaXplCQk9ICgweDAyZTB8Rk9STV9EQVRBNCksCi0gICAgICAgIEFUX3VwcGVyX2JvdW5kX3JlZgk9ICgweDAyZjB8Rk9STV9SRUYpLAotICAgICAgICBBVF91cHBlcl9ib3VuZF9kYXRhMgk9ICgweDAyZjB8Rk9STV9EQVRBMiksCi0gICAgICAgIEFUX3VwcGVyX2JvdW5kX2RhdGE0CT0gKDB4MDJmMHxGT1JNX0RBVEE0KSwKLSAgICAgICAgQVRfdXBwZXJfYm91bmRfZGF0YTgJPSAoMHgwMmYwfEZPUk1fREFUQTgpLAotICAgIEFUX3ZpcnR1YWwJCQk9ICgweDAzMDB8Rk9STV9TVFJJTkcpLAotCi0gICAgLyogR05VIGV4dGVuc2lvbnMuICAqLwotCi0gICAgQVRfc2ZfbmFtZXMJCQk9ICgweDgwMDB8Rk9STV9EQVRBNCksCi0gICAgQVRfc3JjX2luZm8JCQk9ICgweDgwMTB8Rk9STV9EQVRBNCksCi0gICAgQVRfbWFjX2luZm8JCQk9ICgweDgwMjB8Rk9STV9EQVRBNCksCi0gICAgQVRfc3JjX2Nvb3JkcwkJPSAoMHg4MDMwfEZPUk1fREFUQTQpLAotICAgIEFUX2JvZHlfYmVnaW4JCT0gKDB4ODA0MHxGT1JNX0FERFIpLAotICAgIEFUX2JvZHlfZW5kCQkJPSAoMHg4MDUwfEZPUk1fQUREUikKLX07Ci0KLSNkZWZpbmUgQVRfbG9fdXNlcgkweDgwMDAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgQVRfaGlfdXNlcgkweGZmZmYgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2UgZW5kICovCi0KLS8qIExvY2F0aW9uIGF0b20gbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9sb2NhdGlvbl9hdG9tIHsKLSAgICBPUF9SRUcJPSAweDAxLAotICAgIE9QX0JBU0VSRUcJPSAweDAyLAotICAgIE9QX0FERFIJPSAweDAzLAotICAgIE9QX0NPTlNUCT0gMHgwNCwKLSAgICBPUF9ERVJFRjIJPSAweDA1LAotICAgIE9QX0RFUkVGNAk9IDB4MDYsCi0gICAgT1BfQURECT0gMHgwNwotfTsKLQotI2RlZmluZSBPUF9MT19VU0VSCTB4ODAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgT1BfSElfVVNFUgkweGZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBGdW5kYW1lbnRhbCB0eXBlIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSB7Ci0gICAgRlRfY2hhcgkJPSAweDAwMDEsCi0gICAgRlRfc2lnbmVkX2NoYXIJPSAweDAwMDIsCi0gICAgRlRfdW5zaWduZWRfY2hhcgk9IDB4MDAwMywKLSAgICBGVF9zaG9ydAkJPSAweDAwMDQsCi0gICAgRlRfc2lnbmVkX3Nob3J0CT0gMHgwMDA1LAotICAgIEZUX3Vuc2lnbmVkX3Nob3J0CT0gMHgwMDA2LAotICAgIEZUX2ludGVnZXIJCT0gMHgwMDA3LAotICAgIEZUX3NpZ25lZF9pbnRlZ2VyCT0gMHgwMDA4LAotICAgIEZUX3Vuc2lnbmVkX2ludGVnZXIJPSAweDAwMDksCi0gICAgRlRfbG9uZwkJPSAweDAwMGEsCi0gICAgRlRfc2lnbmVkX2xvbmcJPSAweDAwMGIsCi0gICAgRlRfdW5zaWduZWRfbG9uZwk9IDB4MDAwYywKLSAgICBGVF9wb2ludGVyCQk9IDB4MDAwZCwgIC8qIGFuIGFsaWFzIGZvciAodm9pZCAqKSAqLwotICAgIEZUX2Zsb2F0CQk9IDB4MDAwZSwKLSAgICBGVF9kYmxfcHJlY19mbG9hdAk9IDB4MDAwZiwKLSAgICBGVF9leHRfcHJlY19mbG9hdAk9IDB4MDAxMCwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KLSAgICBGVF9jb21wbGV4CQk9IDB4MDAxMSwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KLSAgICBGVF9kYmxfcHJlY19jb21wbGV4CT0gMHgwMDEyLCAgLyogYnJlYWtzICJjbGFzc2ljIiBzdnI0IFNEQiAqLwotCQkJLyogMHgwMDEzIC0tIHJlc2VydmVkICovCi0gICAgRlRfdm9pZAkJPSAweDAwMTQsCi0gICAgRlRfYm9vbGVhbgkJPSAweDAwMTUsICAvKiBicmVha3MgImNsYXNzaWMiIHN2cjQgU0RCICovCi0gICAgRlRfZXh0X3ByZWNfY29tcGxleAk9IDB4MDAxNiwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KLSAgICBGVF9sYWJlbAkJPSAweDAwMTcsCi0gIAotICAgIC8qIEdOVSBleHRlbnNpb25zCi0gICAgICAgVGhlIGxvdyBvcmRlciBieXRlIG11c3QgaW5kaWNhdGUgdGhlIHNpemUgKGluIGJ5dGVzKSBmb3IgdGhlIHR5cGUuCi0gICAgICAgQWxsIG9mIHRoZXNlIHR5cGVzIHdpbGwgcHJvYmFibHkgYnJlYWsgImNsYXNzaWMiIHN2cjQgU0RCICovCi0KLSAgICBGVF9sb25nX2xvbmcJPSAweDgwMDgsCi0gICAgRlRfc2lnbmVkX2xvbmdfbG9uZwk9IDB4ODEwOCwKLSAgICBGVF91bnNpZ25lZF9sb25nX2xvbmcgPSAweDgyMDgsCi0KLSAgICBGVF9pbnQ4CQk9IDB4OTAwMSwKLSAgICBGVF9zaWduZWRfaW50OAk9IDB4OTEwMSwKLSAgICBGVF91bnNpZ25lZF9pbnQ4CT0gMHg5MjAxLAotICAgIEZUX2ludDE2CQk9IDB4OTMwMiwKLSAgICBGVF9zaWduZWRfaW50MTYJPSAweDk0MDIsCi0gICAgRlRfdW5zaWduZWRfaW50MTYJPSAweDk1MDIsCi0gICAgRlRfaW50MzIJCT0gMHg5NjA0LAotICAgIEZUX3NpZ25lZF9pbnQzMgk9IDB4OTcwNCwKLSAgICBGVF91bnNpZ25lZF9pbnQzMgk9IDB4OTgwNCwKLSAgICBGVF9pbnQ2NAkJPSAweDk5MDgsCi0gICAgRlRfc2lnbmVkX2ludDY0CT0gMHg5YTA4LAotICAgIEZUX3Vuc2lnbmVkX2ludDY0CT0gMHg5YjA4LAotCi0gICAgRlRfcmVhbDMyCQk9IDB4YTAwNCwKLSAgICBGVF9yZWFsNjQJCT0gMHhhMTA4LAotICAgIEZUX3JlYWw5NgkJPSAweGEyMGMsCi0gICAgRlRfcmVhbDEyOAkJPSAweGEzMTAKLX07Ci0KLSNkZWZpbmUgRlRfbG9fdXNlcgkweDgwMDAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgRlRfaGlfdXNlcgkweGZmZmYgIC8qIGltcGxlbWVudGF0aW9uIGRlZmluZWQgcmFuZ2UgZW5kICovCi0KLS8qIFR5cGUgbW9kaWZpZXIgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl90eXBlX21vZGlmaWVyIHsKLSAgICBNT0RfcG9pbnRlcl90bwk9IDB4MDEsCi0gICAgTU9EX3JlZmVyZW5jZV90bwk9IDB4MDIsCi0gICAgTU9EX2NvbnN0CQk9IDB4MDMsCi0gICAgTU9EX3ZvbGF0aWxlCT0gMHgwNAotfTsKLQotI2RlZmluZSBNT0RfbG9fdXNlcgkweDgwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIE1PRF9oaV91c2VyCTB4ZmYgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2UgZW5kICovCi0KLS8qIEFycmF5IG9yZGVyaW5nIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfYXJyYXlfZGltX29yZGVyaW5nIHsKLSAgICBPUkRfcm93X21ham9yCT0gMCwKLSAgICBPUkRfY29sX21ham9yCT0gMQotfTsKLQotLyogQXJyYXkgc3Vic2NyaXB0IGZvcm1hdCBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX3N1YnNjcl9kYXRhX2Zvcm1hdHMgewotICAgIEZNVF9GVF9DX0MJPSAweDAsCi0gICAgRk1UX0ZUX0NfWAk9IDB4MSwKLSAgICBGTVRfRlRfWF9DCT0gMHgyLAotICAgIEZNVF9GVF9YX1gJPSAweDMsCi0gICAgRk1UX1VUX0NfQwk9IDB4NCwKLSAgICBGTVRfVVRfQ19YCT0gMHg1LAotICAgIEZNVF9VVF9YX0MJPSAweDYsCi0gICAgRk1UX1VUX1hfWAk9IDB4NywKLSAgICBGTVRfRVQJPSAweDgKLX07Ci0KLS8qIERlcml2ZWQgZnJvbSBhYm92ZSBmb3IgZWFzZSBvZiB1c2UuICAqLwotCi0jZGVmaW5lIEZNVF9DT0RFKF9GVU5EQU1FTlRBTF9UWVBFX1AsIF9VQl9DT05TVF9QLCBfTEJfQ09OU1RfUCkgXAotICgoKF9GVU5EQU1FTlRBTF9UWVBFX1ApID8gMCA6IDQpCVwKLSAgfCAoKF9VQl9DT05TVF9QKSA/IDAgOiAyKQkJXAotICB8ICgoX0xCX0NPTlNUX1ApID8gMCA6IDEpKQotCi0vKiBTb3VyY2UgbGFuZ3VhZ2UgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9zb3VyY2VfbGFuZ3VhZ2UgewotICAgIExBTkdfQzg5CQk9IDB4MDAwMDAwMDEsCi0gICAgTEFOR19DCQk9IDB4MDAwMDAwMDIsCi0gICAgTEFOR19BREE4MwkJPSAweDAwMDAwMDAzLAotICAgIExBTkdfQ19QTFVTX1BMVVMJPSAweDAwMDAwMDA0LAotICAgIExBTkdfQ09CT0w3NAk9IDB4MDAwMDAwMDUsCi0gICAgTEFOR19DT0JPTDg1CT0gMHgwMDAwMDAwNiwKLSAgICBMQU5HX0ZPUlRSQU43Nwk9IDB4MDAwMDAwMDcsCi0gICAgTEFOR19GT1JUUkFOOTAJPSAweDAwMDAwMDA4LAotICAgIExBTkdfUEFTQ0FMODMJPSAweDAwMDAwMDA5LAotICAgIExBTkdfTU9EVUxBMgk9IDB4MDAwMDAwMGEsCi0KLSAgICAvKiBHTlUgZXh0ZW5zaW9ucyAqLwotCi0gICAgTEFOR19DSElMTAkJPSAweDAwMDA5YWYzCS8qIHJhbmRvbSB2YWx1ZSBmb3IgR05VIENoaWxsICovCi19OwotCi0jZGVmaW5lIExBTkdfbG9fdXNlcgkweDAwMDA4MDAwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIExBTkdfaGlfdXNlcgkweDAwMDBmZmZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBOYW1lcyBhbmQgY29kZXMgZm9yIEdOVSAibWFjaW5mbyIgZXh0ZW5zaW9uLiAgKi8KLQotZW51bSBkd2FyZl9tYWNpbmZvX3JlY29yZF90eXBlIHsKLSAgICBNQUNJTkZPX3N0YXJ0CT0gJ3MnLAotICAgIE1BQ0lORk9fcmVzdW1lCT0gJ3InLAotICAgIE1BQ0lORk9fZGVmaW5lCT0gJ2QnLAotICAgIE1BQ0lORk9fdW5kZWYJPSAndScKLX07Ci0KLSNlbmRpZiAvKiBfRUxGX0RXQVJGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2R3YXJmMi5oIGIvaW5jbHVkZS9lbGYvZHdhcmYyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyY2JiMjQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvZHdhcmYyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MzcgKzAsMCBAQAotLyogRGVjbGFyYXRpb25zIGFuZCBkZWZpbml0aW9ucyBvZiBjb2RlcyByZWxhdGluZyB0byB0aGUgRFdBUkYgc3ltYm9saWMKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3JtYXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTUsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgR2FyeSBGdW5jayAoZ2FyeUBpbnRyZXBpZC5jb20pIFRoZSBBZGEgSm9pbnQgUHJvZ3JhbQotICAgT2ZmaWNlIChBSlBPKSwgRmxvcmlkYSBTdGF0ZSBVbnZpdmVyc2l0eSBhbmQgU2lsaWNvbiBHcmFwaGljcyBJbmMuCi0gICBwcm92aWRlZCBzdXBwb3J0IGZvciB0aGlzIGVmZm9ydCAtLSBKdW5lIDIxLCAxOTk1LgotCi0gICBEZXJpdmVkIGZyb20gdGhlIERXQVJGIDEgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBieSBSb24gR3VpbG1ldHRlCi0gICAocmZnQG5ldGNvbS5jb20pLCBOb3ZlbWJlciAxOTkwLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0KLUdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLWxhdGVyIHZlcnNpb24uCi0KLUdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgRFdBUkYgc3BlY2lmaWNhdGlvbiAoYSBwdWJsaWMgZG9jdW1lbnQpCi0gICBSZXZpc2lvbiAyLjAuMCAoSnVseSAyNywgMTk5MykgZGV2ZWxvcGVkIGJ5IHRoZSBVTklYIEludGVybmF0aW9uYWwKLSAgIFByb2dyYW1taW5nIExhbmd1YWdlcyBTcGVjaWFsIEludGVyZXN0IEdyb3VwIChVSS9QTFNJRykgYW5kIGRpc3RyaWJ1dGVkCi0gICBieSBVTklYIEludGVybmF0aW9uYWwuICBDb3BpZXMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGFyZSBhdmFpbGFibGUgZnJvbQotICAgVU5JWCBJbnRlcm5hdGlvbmFsLCAyMCBXYXRlcnZpZXcgQm91bGV2YXJkLCBQYXJzaXBwYW55LCBOSiwgMDcwNTQuICAqLwotCi0jaWZuZGVmIF9FTEZfRFdBUkYyX0gKLSNkZWZpbmUgX0VMRl9EV0FSRjJfSAotCi0vKiBTdHJ1Y3R1cmUgZm91bmQgaW4gdGhlIC5kZWJ1Z19saW5lIHNlY3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgY2hhciBsaV9sZW5ndGggICAgICAgICAgWzRdOwotICB1bnNpZ25lZCBjaGFyIGxpX3ZlcnNpb24gICAgICAgICBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgbGlfcHJvbG9ndWVfbGVuZ3RoIFs0XTsKLSAgdW5zaWduZWQgY2hhciBsaV9taW5faW5zbl9sZW5ndGggWzFdOwotICB1bnNpZ25lZCBjaGFyIGxpX2RlZmF1bHRfaXNfc3RtdCBbMV07Ci0gIHVuc2lnbmVkIGNoYXIgbGlfbGluZV9iYXNlICAgICAgIFsxXTsKLSAgdW5zaWduZWQgY2hhciBsaV9saW5lX3JhbmdlICAgICAgWzFdOwotICB1bnNpZ25lZCBjaGFyIGxpX29wY29kZV9iYXNlICAgICBbMV07Ci19Ci1EV0FSRjJfRXh0ZXJuYWxfTGluZUluZm87Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGxvbmcgIGxpX2xlbmd0aDsKLSAgdW5zaWduZWQgc2hvcnQgbGlfdmVyc2lvbjsKLSAgdW5zaWduZWQgaW50ICAgbGlfcHJvbG9ndWVfbGVuZ3RoOwotICB1bnNpZ25lZCBjaGFyICBsaV9taW5faW5zbl9sZW5ndGg7Ci0gIHVuc2lnbmVkIGNoYXIgIGxpX2RlZmF1bHRfaXNfc3RtdDsKLSAgaW50ICAgICAgICAgICAgbGlfbGluZV9iYXNlOwotICB1bnNpZ25lZCBjaGFyICBsaV9saW5lX3JhbmdlOwotICB1bnNpZ25lZCBjaGFyICBsaV9vcGNvZGVfYmFzZTsKLX0KLURXQVJGMl9JbnRlcm5hbF9MaW5lSW5mbzsKLQotLyogU3RydWN0dXJlIGZvdW5kIGluIC5kZWJ1Z19wdWJuYW1lcyBzZWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgcG5fbGVuZ3RoICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcG5fdmVyc2lvbiBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgcG5fb2Zmc2V0ICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcG5fc2l6ZSAgICBbNF07Ci19Ci1EV0FSRjJfRXh0ZXJuYWxfUHViTmFtZXM7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGxvbmcgIHBuX2xlbmd0aDsKLSAgdW5zaWduZWQgc2hvcnQgcG5fdmVyc2lvbjsKLSAgdW5zaWduZWQgbG9uZyAgcG5fb2Zmc2V0OwotICB1bnNpZ25lZCBsb25nICBwbl9zaXplOwotfQotRFdBUkYyX0ludGVybmFsX1B1Yk5hbWVzOwotCi0vKiBTdHJjdXR1cmUgZm91bmQgaW4gLmRlYnVnX2luZm8gc2VjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyICBjdV9sZW5ndGggICAgICAgIFs0XTsKLSAgdW5zaWduZWQgY2hhciAgY3VfdmVyc2lvbiAgICAgICBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgIGN1X2FiYnJldl9vZmZzZXQgWzRdOwotICB1bnNpZ25lZCBjaGFyICBjdV9wb2ludGVyX3NpemUgIFsxXTsKLX0KLURXQVJGMl9FeHRlcm5hbF9Db21wVW5pdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgbG9uZyAgY3VfbGVuZ3RoOwotICB1bnNpZ25lZCBzaG9ydCBjdV92ZXJzaW9uOwotICB1bnNpZ25lZCBsb25nICBjdV9hYmJyZXZfb2Zmc2V0OwotICB1bnNpZ25lZCBjaGFyICBjdV9wb2ludGVyX3NpemU7Ci19Ci1EV0FSRjJfSW50ZXJuYWxfQ29tcFVuaXQ7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX2xlbmd0aCAgICAgICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3ZlcnNpb24gICAgICBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX2luZm9fb2Zmc2V0ICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3BvaW50ZXJfc2l6ZSBbMV07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3NlZ21lbnRfc2l6ZSBbMV07Ci19Ci1EV0FSRjJfRXh0ZXJuYWxfQVJhbmdlOwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBsb25nICBhcl9sZW5ndGg7Ci0gIHVuc2lnbmVkIHNob3J0IGFyX3ZlcnNpb247Ci0gIHVuc2lnbmVkIGxvbmcgIGFyX2luZm9fb2Zmc2V0OwotICB1bnNpZ25lZCBjaGFyICBhcl9wb2ludGVyX3NpemU7Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3NlZ21lbnRfc2l6ZTsKLX0KLURXQVJGMl9JbnRlcm5hbF9BUmFuZ2U7Ci0KLQotLyogVGFnIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfdGFnCi0gIHsKLSAgICBEV19UQUdfcGFkZGluZyA9IDB4MDAsCi0gICAgRFdfVEFHX2FycmF5X3R5cGUgPSAweDAxLAotICAgIERXX1RBR19jbGFzc190eXBlID0gMHgwMiwKLSAgICBEV19UQUdfZW50cnlfcG9pbnQgPSAweDAzLAotICAgIERXX1RBR19lbnVtZXJhdGlvbl90eXBlID0gMHgwNCwKLSAgICBEV19UQUdfZm9ybWFsX3BhcmFtZXRlciA9IDB4MDUsCi0gICAgRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uID0gMHgwOCwKLSAgICBEV19UQUdfbGFiZWwgPSAweDBhLAotICAgIERXX1RBR19sZXhpY2FsX2Jsb2NrID0gMHgwYiwKLSAgICBEV19UQUdfbWVtYmVyID0gMHgwZCwKLSAgICBEV19UQUdfcG9pbnRlcl90eXBlID0gMHgwZiwKLSAgICBEV19UQUdfcmVmZXJlbmNlX3R5cGUgPSAweDEwLAotICAgIERXX1RBR19jb21waWxlX3VuaXQgPSAweDExLAotICAgIERXX1RBR19zdHJpbmdfdHlwZSA9IDB4MTIsCi0gICAgRFdfVEFHX3N0cnVjdHVyZV90eXBlID0gMHgxMywKLSAgICBEV19UQUdfc3Vicm91dGluZV90eXBlID0gMHgxNSwKLSAgICBEV19UQUdfdHlwZWRlZiA9IDB4MTYsCi0gICAgRFdfVEFHX3VuaW9uX3R5cGUgPSAweDE3LAotICAgIERXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzID0gMHgxOCwKLSAgICBEV19UQUdfdmFyaWFudCA9IDB4MTksCi0gICAgRFdfVEFHX2NvbW1vbl9ibG9jayA9IDB4MWEsCi0gICAgRFdfVEFHX2NvbW1vbl9pbmNsdXNpb24gPSAweDFiLAotICAgIERXX1RBR19pbmhlcml0YW5jZSA9IDB4MWMsCi0gICAgRFdfVEFHX2lubGluZWRfc3Vicm91dGluZSA9IDB4MWQsCi0gICAgRFdfVEFHX21vZHVsZSA9IDB4MWUsCi0gICAgRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSA9IDB4MWYsCi0gICAgRFdfVEFHX3NldF90eXBlID0gMHgyMCwKLSAgICBEV19UQUdfc3VicmFuZ2VfdHlwZSA9IDB4MjEsCi0gICAgRFdfVEFHX3dpdGhfc3RtdCA9IDB4MjIsCi0gICAgRFdfVEFHX2FjY2Vzc19kZWNsYXJhdGlvbiA9IDB4MjMsCi0gICAgRFdfVEFHX2Jhc2VfdHlwZSA9IDB4MjQsCi0gICAgRFdfVEFHX2NhdGNoX2Jsb2NrID0gMHgyNSwKLSAgICBEV19UQUdfY29uc3RfdHlwZSA9IDB4MjYsCi0gICAgRFdfVEFHX2NvbnN0YW50ID0gMHgyNywKLSAgICBEV19UQUdfZW51bWVyYXRvciA9IDB4MjgsCi0gICAgRFdfVEFHX2ZpbGVfdHlwZSA9IDB4MjksCi0gICAgRFdfVEFHX2ZyaWVuZCA9IDB4MmEsCi0gICAgRFdfVEFHX25hbWVsaXN0ID0gMHgyYiwKLSAgICBEV19UQUdfbmFtZWxpc3RfaXRlbSA9IDB4MmMsCi0gICAgRFdfVEFHX3BhY2tlZF90eXBlID0gMHgyZCwKLSAgICBEV19UQUdfc3VicHJvZ3JhbSA9IDB4MmUsCi0gICAgRFdfVEFHX3RlbXBsYXRlX3R5cGVfcGFyYW0gPSAweDJmLAotICAgIERXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbSA9IDB4MzAsCi0gICAgRFdfVEFHX3Rocm93bl90eXBlID0gMHgzMSwKLSAgICBEV19UQUdfdHJ5X2Jsb2NrID0gMHgzMiwKLSAgICBEV19UQUdfdmFyaWFudF9wYXJ0ID0gMHgzMywKLSAgICBEV19UQUdfdmFyaWFibGUgPSAweDM0LAotICAgIERXX1RBR192b2xhdGlsZV90eXBlID0gMHgzNSwKLSAgICAvKiBTR0kvTUlQUyBFeHRlbnNpb25zICovCi0gICAgRFdfVEFHX01JUFNfbG9vcCA9IDB4NDA4MSwKLSAgICAvKiBHTlUgZXh0ZW5zaW9ucyAqLwotICAgIERXX1RBR19mb3JtYXRfbGFiZWwgPSAweDQxMDEsCS8qIGZvciBGT1JUUkFOIDc3IGFuZCBGb3J0cmFuIDkwICovCi0gICAgRFdfVEFHX2Z1bmN0aW9uX3RlbXBsYXRlID0gMHg0MTAyLAkvKiBmb3IgQysrICovCi0gICAgRFdfVEFHX2NsYXNzX3RlbXBsYXRlID0gMHg0MTAzCS8qIGZvciBDKysgKi8KLSAgfTsKLQotI2RlZmluZSBEV19UQUdfbG9fdXNlcgkweDQwODAKLSNkZWZpbmUgRFdfVEFHX2hpX3VzZXIJMHhmZmZmCi0KLS8qIGZsYWcgdGhhdCB0ZWxscyB3aGV0aGVyIGVudHJ5IGhhcyBhIGNoaWxkIG9yIG5vdCAqLwotI2RlZmluZSBEV19jaGlsZHJlbl9ubyAgIDAKLSNkZWZpbmUJRFdfY2hpbGRyZW5feWVzICAxCi0KLS8qIEZvcm0gbmFtZXMgYW5kIGNvZGVzLiAgKi8KLWVudW0gZHdhcmZfZm9ybQotICB7Ci0gICAgRFdfRk9STV9hZGRyID0gMHgwMSwKLSAgICBEV19GT1JNX2Jsb2NrMiA9IDB4MDMsCi0gICAgRFdfRk9STV9ibG9jazQgPSAweDA0LAotICAgIERXX0ZPUk1fZGF0YTIgPSAweDA1LAotICAgIERXX0ZPUk1fZGF0YTQgPSAweDA2LAotICAgIERXX0ZPUk1fZGF0YTggPSAweDA3LAotICAgIERXX0ZPUk1fc3RyaW5nID0gMHgwOCwKLSAgICBEV19GT1JNX2Jsb2NrID0gMHgwOSwKLSAgICBEV19GT1JNX2Jsb2NrMSA9IDB4MGEsCi0gICAgRFdfRk9STV9kYXRhMSA9IDB4MGIsCi0gICAgRFdfRk9STV9mbGFnID0gMHgwYywKLSAgICBEV19GT1JNX3NkYXRhID0gMHgwZCwKLSAgICBEV19GT1JNX3N0cnAgPSAweDBlLAotICAgIERXX0ZPUk1fdWRhdGEgPSAweDBmLAotICAgIERXX0ZPUk1fcmVmX2FkZHIgPSAweDEwLAotICAgIERXX0ZPUk1fcmVmMSA9IDB4MTEsCi0gICAgRFdfRk9STV9yZWYyID0gMHgxMiwKLSAgICBEV19GT1JNX3JlZjQgPSAweDEzLAotICAgIERXX0ZPUk1fcmVmOCA9IDB4MTQsCi0gICAgRFdfRk9STV9yZWZfdWRhdGEgPSAweDE1LAotICAgIERXX0ZPUk1faW5kaXJlY3QgPSAweDE2Ci0gIH07Ci0KLS8qIEF0dHJpYnV0ZSBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX2F0dHJpYnV0ZQotICB7Ci0gICAgRFdfQVRfc2libGluZyA9IDB4MDEsCi0gICAgRFdfQVRfbG9jYXRpb24gPSAweDAyLAotICAgIERXX0FUX25hbWUgPSAweDAzLAotICAgIERXX0FUX29yZGVyaW5nID0gMHgwOSwKLSAgICBEV19BVF9zdWJzY3JfZGF0YSA9IDB4MGEsCi0gICAgRFdfQVRfYnl0ZV9zaXplID0gMHgwYiwKLSAgICBEV19BVF9iaXRfb2Zmc2V0ID0gMHgwYywKLSAgICBEV19BVF9iaXRfc2l6ZSA9IDB4MGQsCi0gICAgRFdfQVRfZWxlbWVudF9saXN0ID0gMHgwZiwKLSAgICBEV19BVF9zdG10X2xpc3QgPSAweDEwLAotICAgIERXX0FUX2xvd19wYyA9IDB4MTEsCi0gICAgRFdfQVRfaGlnaF9wYyA9IDB4MTIsCi0gICAgRFdfQVRfbGFuZ3VhZ2UgPSAweDEzLAotICAgIERXX0FUX21lbWJlciA9IDB4MTQsCi0gICAgRFdfQVRfZGlzY3IgPSAweDE1LAotICAgIERXX0FUX2Rpc2NyX3ZhbHVlID0gMHgxNiwKLSAgICBEV19BVF92aXNpYmlsaXR5ID0gMHgxNywKLSAgICBEV19BVF9pbXBvcnQgPSAweDE4LAotICAgIERXX0FUX3N0cmluZ19sZW5ndGggPSAweDE5LAotICAgIERXX0FUX2NvbW1vbl9yZWZlcmVuY2UgPSAweDFhLAotICAgIERXX0FUX2NvbXBfZGlyID0gMHgxYiwKLSAgICBEV19BVF9jb25zdF92YWx1ZSA9IDB4MWMsCi0gICAgRFdfQVRfY29udGFpbmluZ190eXBlID0gMHgxZCwKLSAgICBEV19BVF9kZWZhdWx0X3ZhbHVlID0gMHgxZSwKLSAgICBEV19BVF9pbmxpbmUgPSAweDIwLAotICAgIERXX0FUX2lzX29wdGlvbmFsID0gMHgyMSwKLSAgICBEV19BVF9sb3dlcl9ib3VuZCA9IDB4MjIsCi0gICAgRFdfQVRfcHJvZHVjZXIgPSAweDI1LAotICAgIERXX0FUX3Byb3RvdHlwZWQgPSAweDI3LAotICAgIERXX0FUX3JldHVybl9hZGRyID0gMHgyYSwKLSAgICBEV19BVF9zdGFydF9zY29wZSA9IDB4MmMsCi0gICAgRFdfQVRfc3RyaWRlX3NpemUgPSAweDJlLAotICAgIERXX0FUX3VwcGVyX2JvdW5kID0gMHgyZiwKLSAgICBEV19BVF9hYnN0cmFjdF9vcmlnaW4gPSAweDMxLAotICAgIERXX0FUX2FjY2Vzc2liaWxpdHkgPSAweDMyLAotICAgIERXX0FUX2FkZHJlc3NfY2xhc3MgPSAweDMzLAotICAgIERXX0FUX2FydGlmaWNpYWwgPSAweDM0LAotICAgIERXX0FUX2Jhc2VfdHlwZXMgPSAweDM1LAotICAgIERXX0FUX2NhbGxpbmdfY29udmVudGlvbiA9IDB4MzYsCi0gICAgRFdfQVRfY291bnQgPSAweDM3LAotICAgIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uID0gMHgzOCwKLSAgICBEV19BVF9kZWNsX2NvbHVtbiA9IDB4MzksCi0gICAgRFdfQVRfZGVjbF9maWxlID0gMHgzYSwKLSAgICBEV19BVF9kZWNsX2xpbmUgPSAweDNiLAotICAgIERXX0FUX2RlY2xhcmF0aW9uID0gMHgzYywKLSAgICBEV19BVF9kaXNjcl9saXN0ID0gMHgzZCwKLSAgICBEV19BVF9lbmNvZGluZyA9IDB4M2UsCi0gICAgRFdfQVRfZXh0ZXJuYWwgPSAweDNmLAotICAgIERXX0FUX2ZyYW1lX2Jhc2UgPSAweDQwLAotICAgIERXX0FUX2ZyaWVuZCA9IDB4NDEsCi0gICAgRFdfQVRfaWRlbnRpZmllcl9jYXNlID0gMHg0MiwKLSAgICBEV19BVF9tYWNyb19pbmZvID0gMHg0MywKLSAgICBEV19BVF9uYW1lbGlzdF9pdGVtcyA9IDB4NDQsCi0gICAgRFdfQVRfcHJpb3JpdHkgPSAweDQ1LAotICAgIERXX0FUX3NlZ21lbnQgPSAweDQ2LAotICAgIERXX0FUX3NwZWNpZmljYXRpb24gPSAweDQ3LAotICAgIERXX0FUX3N0YXRpY19saW5rID0gMHg0OCwKLSAgICBEV19BVF90eXBlID0gMHg0OSwKLSAgICBEV19BVF91c2VfbG9jYXRpb24gPSAweDRhLAotICAgIERXX0FUX3ZhcmlhYmxlX3BhcmFtZXRlciA9IDB4NGIsCi0gICAgRFdfQVRfdmlydHVhbGl0eSA9IDB4NGMsCi0gICAgRFdfQVRfdnRhYmxlX2VsZW1fbG9jYXRpb24gPSAweDRkLAotICAgIC8qIFNHSS9NSVBTIEV4dGVuc2lvbnMgKi8KLSAgICBEV19BVF9NSVBTX2ZkZSA9IDB4MjAwMSwKLSAgICBEV19BVF9NSVBTX2xvb3BfYmVnaW4gPSAweDIwMDIsCi0gICAgRFdfQVRfTUlQU190YWlsX2xvb3BfYmVnaW4gPSAweDIwMDMsCi0gICAgRFdfQVRfTUlQU19lcGlsb2dfYmVnaW4gPSAweDIwMDQsCi0gICAgRFdfQVRfTUlQU19sb29wX3Vucm9sbF9mYWN0b3IgPSAweDIwMDUsCi0gICAgRFdfQVRfTUlQU19zb2Z0d2FyZV9waXBlbGluZV9kZXB0aCA9IDB4MjAwNiwKLSAgICBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSA9IDB4MjAwNywKLSAgICBEV19BVF9NSVBTX3N0cmlkZSA9IDB4MjAwOCwKLSAgICBEV19BVF9NSVBTX2Fic3RyYWN0X25hbWUgPSAweDIwMDksCi0gICAgRFdfQVRfTUlQU19jbG9uZV9vcmlnaW4gPSAweDIwMGEsCi0gICAgRFdfQVRfTUlQU19oYXNfaW5saW5lcyA9IDB4MjAwYiwKLSAgICAvKiBHTlUgZXh0ZW5zaW9ucy4gICovCi0gICAgRFdfQVRfc2ZfbmFtZXMgPSAweDIxMDEsCi0gICAgRFdfQVRfc3JjX2luZm8gPSAweDIxMDIsCi0gICAgRFdfQVRfbWFjX2luZm8gPSAweDIxMDMsCi0gICAgRFdfQVRfc3JjX2Nvb3JkcyA9IDB4MjEwNCwKLSAgICBEV19BVF9ib2R5X2JlZ2luID0gMHgyMTA1LAotICAgIERXX0FUX2JvZHlfZW5kID0gMHgyMTA2Ci0gIH07Ci0KLSNkZWZpbmUgRFdfQVRfbG9fdXNlcgkweDIwMDAJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBEV19BVF9oaV91c2VyCTB4M2ZmMAkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBMb2NhdGlvbiBhdG9tIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfbG9jYXRpb25fYXRvbQotICB7Ci0gICAgRFdfT1BfYWRkciA9IDB4MDMsCi0gICAgRFdfT1BfZGVyZWYgPSAweDA2LAotICAgIERXX09QX2NvbnN0MXUgPSAweDA4LAotICAgIERXX09QX2NvbnN0MXMgPSAweDA5LAotICAgIERXX09QX2NvbnN0MnUgPSAweDBhLAotICAgIERXX09QX2NvbnN0MnMgPSAweDBiLAotICAgIERXX09QX2NvbnN0NHUgPSAweDBjLAotICAgIERXX09QX2NvbnN0NHMgPSAweDBkLAotICAgIERXX09QX2NvbnN0OHUgPSAweDBlLAotICAgIERXX09QX2NvbnN0OHMgPSAweDBmLAotICAgIERXX09QX2NvbnN0dSA9IDB4MTAsCi0gICAgRFdfT1BfY29uc3RzID0gMHgxMSwKLSAgICBEV19PUF9kdXAgPSAweDEyLAotICAgIERXX09QX2Ryb3AgPSAweDEzLAotICAgIERXX09QX292ZXIgPSAweDE0LAotICAgIERXX09QX3BpY2sgPSAweDE1LAotICAgIERXX09QX3N3YXAgPSAweDE2LAotICAgIERXX09QX3JvdCA9IDB4MTcsCi0gICAgRFdfT1BfeGRlcmVmID0gMHgxOCwKLSAgICBEV19PUF9hYnMgPSAweDE5LAotICAgIERXX09QX2FuZCA9IDB4MWEsCi0gICAgRFdfT1BfZGl2ID0gMHgxYiwKLSAgICBEV19PUF9taW51cyA9IDB4MWMsCi0gICAgRFdfT1BfbW9kID0gMHgxZCwKLSAgICBEV19PUF9tdWwgPSAweDFlLAotICAgIERXX09QX25lZyA9IDB4MWYsCi0gICAgRFdfT1Bfbm90ID0gMHgyMCwKLSAgICBEV19PUF9vciA9IDB4MjEsCi0gICAgRFdfT1BfcGx1cyA9IDB4MjIsCi0gICAgRFdfT1BfcGx1c191Y29uc3QgPSAweDIzLAotICAgIERXX09QX3NobCA9IDB4MjQsCi0gICAgRFdfT1Bfc2hyID0gMHgyNSwKLSAgICBEV19PUF9zaHJhID0gMHgyNiwKLSAgICBEV19PUF94b3IgPSAweDI3LAotICAgIERXX09QX2JyYSA9IDB4MjgsCi0gICAgRFdfT1BfZXEgPSAweDI5LAotICAgIERXX09QX2dlID0gMHgyYSwKLSAgICBEV19PUF9ndCA9IDB4MmIsCi0gICAgRFdfT1BfbGUgPSAweDJjLAotICAgIERXX09QX2x0ID0gMHgyZCwKLSAgICBEV19PUF9uZSA9IDB4MmUsCi0gICAgRFdfT1Bfc2tpcCA9IDB4MmYsCi0gICAgRFdfT1BfbGl0MCA9IDB4MzAsCi0gICAgRFdfT1BfbGl0MSA9IDB4MzEsCi0gICAgRFdfT1BfbGl0MiA9IDB4MzIsCi0gICAgRFdfT1BfbGl0MyA9IDB4MzMsCi0gICAgRFdfT1BfbGl0NCA9IDB4MzQsCi0gICAgRFdfT1BfbGl0NSA9IDB4MzUsCi0gICAgRFdfT1BfbGl0NiA9IDB4MzYsCi0gICAgRFdfT1BfbGl0NyA9IDB4MzcsCi0gICAgRFdfT1BfbGl0OCA9IDB4MzgsCi0gICAgRFdfT1BfbGl0OSA9IDB4MzksCi0gICAgRFdfT1BfbGl0MTAgPSAweDNhLAotICAgIERXX09QX2xpdDExID0gMHgzYiwKLSAgICBEV19PUF9saXQxMiA9IDB4M2MsCi0gICAgRFdfT1BfbGl0MTMgPSAweDNkLAotICAgIERXX09QX2xpdDE0ID0gMHgzZSwKLSAgICBEV19PUF9saXQxNSA9IDB4M2YsCi0gICAgRFdfT1BfbGl0MTYgPSAweDQwLAotICAgIERXX09QX2xpdDE3ID0gMHg0MSwKLSAgICBEV19PUF9saXQxOCA9IDB4NDIsCi0gICAgRFdfT1BfbGl0MTkgPSAweDQzLAotICAgIERXX09QX2xpdDIwID0gMHg0NCwKLSAgICBEV19PUF9saXQyMSA9IDB4NDUsCi0gICAgRFdfT1BfbGl0MjIgPSAweDQ2LAotICAgIERXX09QX2xpdDIzID0gMHg0NywKLSAgICBEV19PUF9saXQyNCA9IDB4NDgsCi0gICAgRFdfT1BfbGl0MjUgPSAweDQ5LAotICAgIERXX09QX2xpdDI2ID0gMHg0YSwKLSAgICBEV19PUF9saXQyNyA9IDB4NGIsCi0gICAgRFdfT1BfbGl0MjggPSAweDRjLAotICAgIERXX09QX2xpdDI5ID0gMHg0ZCwKLSAgICBEV19PUF9saXQzMCA9IDB4NGUsCi0gICAgRFdfT1BfbGl0MzEgPSAweDRmLAotICAgIERXX09QX3JlZzAgPSAweDUwLAotICAgIERXX09QX3JlZzEgPSAweDUxLAotICAgIERXX09QX3JlZzIgPSAweDUyLAotICAgIERXX09QX3JlZzMgPSAweDUzLAotICAgIERXX09QX3JlZzQgPSAweDU0LAotICAgIERXX09QX3JlZzUgPSAweDU1LAotICAgIERXX09QX3JlZzYgPSAweDU2LAotICAgIERXX09QX3JlZzcgPSAweDU3LAotICAgIERXX09QX3JlZzggPSAweDU4LAotICAgIERXX09QX3JlZzkgPSAweDU5LAotICAgIERXX09QX3JlZzEwID0gMHg1YSwKLSAgICBEV19PUF9yZWcxMSA9IDB4NWIsCi0gICAgRFdfT1BfcmVnMTIgPSAweDVjLAotICAgIERXX09QX3JlZzEzID0gMHg1ZCwKLSAgICBEV19PUF9yZWcxNCA9IDB4NWUsCi0gICAgRFdfT1BfcmVnMTUgPSAweDVmLAotICAgIERXX09QX3JlZzE2ID0gMHg2MCwKLSAgICBEV19PUF9yZWcxNyA9IDB4NjEsCi0gICAgRFdfT1BfcmVnMTggPSAweDYyLAotICAgIERXX09QX3JlZzE5ID0gMHg2MywKLSAgICBEV19PUF9yZWcyMCA9IDB4NjQsCi0gICAgRFdfT1BfcmVnMjEgPSAweDY1LAotICAgIERXX09QX3JlZzIyID0gMHg2NiwKLSAgICBEV19PUF9yZWcyMyA9IDB4NjcsCi0gICAgRFdfT1BfcmVnMjQgPSAweDY4LAotICAgIERXX09QX3JlZzI1ID0gMHg2OSwKLSAgICBEV19PUF9yZWcyNiA9IDB4NmEsCi0gICAgRFdfT1BfcmVnMjcgPSAweDZiLAotICAgIERXX09QX3JlZzI4ID0gMHg2YywKLSAgICBEV19PUF9yZWcyOSA9IDB4NmQsCi0gICAgRFdfT1BfcmVnMzAgPSAweDZlLAotICAgIERXX09QX3JlZzMxID0gMHg2ZiwKLSAgICBEV19PUF9icmVnMCA9IDB4NzAsCi0gICAgRFdfT1BfYnJlZzEgPSAweDcxLAotICAgIERXX09QX2JyZWcyID0gMHg3MiwKLSAgICBEV19PUF9icmVnMyA9IDB4NzMsCi0gICAgRFdfT1BfYnJlZzQgPSAweDc0LAotICAgIERXX09QX2JyZWc1ID0gMHg3NSwKLSAgICBEV19PUF9icmVnNiA9IDB4NzYsCi0gICAgRFdfT1BfYnJlZzcgPSAweDc3LAotICAgIERXX09QX2JyZWc4ID0gMHg3OCwKLSAgICBEV19PUF9icmVnOSA9IDB4NzksCi0gICAgRFdfT1BfYnJlZzEwID0gMHg3YSwKLSAgICBEV19PUF9icmVnMTEgPSAweDdiLAotICAgIERXX09QX2JyZWcxMiA9IDB4N2MsCi0gICAgRFdfT1BfYnJlZzEzID0gMHg3ZCwKLSAgICBEV19PUF9icmVnMTQgPSAweDdlLAotICAgIERXX09QX2JyZWcxNSA9IDB4N2YsCi0gICAgRFdfT1BfYnJlZzE2ID0gMHg4MCwKLSAgICBEV19PUF9icmVnMTcgPSAweDgxLAotICAgIERXX09QX2JyZWcxOCA9IDB4ODIsCi0gICAgRFdfT1BfYnJlZzE5ID0gMHg4MywKLSAgICBEV19PUF9icmVnMjAgPSAweDg0LAotICAgIERXX09QX2JyZWcyMSA9IDB4ODUsCi0gICAgRFdfT1BfYnJlZzIyID0gMHg4NiwKLSAgICBEV19PUF9icmVnMjMgPSAweDg3LAotICAgIERXX09QX2JyZWcyNCA9IDB4ODgsCi0gICAgRFdfT1BfYnJlZzI1ID0gMHg4OSwKLSAgICBEV19PUF9icmVnMjYgPSAweDhhLAotICAgIERXX09QX2JyZWcyNyA9IDB4OGIsCi0gICAgRFdfT1BfYnJlZzI4ID0gMHg4YywKLSAgICBEV19PUF9icmVnMjkgPSAweDhkLAotICAgIERXX09QX2JyZWczMCA9IDB4OGUsCi0gICAgRFdfT1BfYnJlZzMxID0gMHg4ZiwKLSAgICBEV19PUF9yZWd4ID0gMHg5MCwKLSAgICBEV19PUF9mYnJlZyA9IDB4OTEsCi0gICAgRFdfT1BfYnJlZ3ggPSAweDkyLAotICAgIERXX09QX3BpZWNlID0gMHg5MywKLSAgICBEV19PUF9kZXJlZl9zaXplID0gMHg5NCwKLSAgICBEV19PUF94ZGVyZWZfc2l6ZSA9IDB4OTUsCi0gICAgRFdfT1Bfbm9wID0gMHg5NgotICB9OwotCi0jZGVmaW5lIERXX09QX2xvX3VzZXIJMHg4MAkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIERXX09QX2hpX3VzZXIJMHhmZgkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBUeXBlIGVuY29kaW5ncy4gICovCi0KLWVudW0gZHdhcmZfdHlwZQotICB7Ci0gICAgRFdfQVRFX3ZvaWQgPSAweDAsCi0gICAgRFdfQVRFX2FkZHJlc3MgPSAweDEsCi0gICAgRFdfQVRFX2Jvb2xlYW4gPSAweDIsCi0gICAgRFdfQVRFX2NvbXBsZXhfZmxvYXQgPSAweDMsCi0gICAgRFdfQVRFX2Zsb2F0ID0gMHg0LAotICAgIERXX0FURV9zaWduZWQgPSAweDUsCi0gICAgRFdfQVRFX3NpZ25lZF9jaGFyID0gMHg2LAotICAgIERXX0FURV91bnNpZ25lZCA9IDB4NywKLSAgICBEV19BVEVfdW5zaWduZWRfY2hhciA9IDB4OAotICB9OwotCi0jZGVmaW5lCURXX0FURV9sb191c2VyIDB4ODAKLSNkZWZpbmUJRFdfQVRFX2hpX3VzZXIgMHhmZgotCi0vKiBBcnJheSBvcmRlcmluZyBuYW1lcyBhbmQgY29kZXMuICAqLwotZW51bSBkd2FyZl9hcnJheV9kaW1fb3JkZXJpbmcKLSAgewotICAgIERXX09SRF9yb3dfbWFqb3IgPSAwLAotICAgIERXX09SRF9jb2xfbWFqb3IgPSAxCi0gIH07Ci0KLS8qIGFjY2VzcyBhdHRyaWJ1dGUgKi8KLWVudW0gZHdhcmZfYWNjZXNzX2F0dHJpYnV0ZQotICB7Ci0gICAgRFdfQUNDRVNTX3B1YmxpYyA9IDEsCi0gICAgRFdfQUNDRVNTX3Byb3RlY3RlZCA9IDIsCi0gICAgRFdfQUNDRVNTX3ByaXZhdGUgPSAzCi0gIH07Ci0KLS8qIHZpc2liaWxpdHkgKi8KLWVudW0gZHdhcmZfdmlzaWJpbGl0eV9hdHRyaWJ1dGUKLSAgewotICAgIERXX1ZJU19sb2NhbCA9IDEsCi0gICAgRFdfVklTX2V4cG9ydGVkID0gMiwKLSAgICBEV19WSVNfcXVhbGlmaWVkID0gMwotICB9OwotCi0vKiB2aXJ0dWFsaXR5ICovCi1lbnVtIGR3YXJmX3ZpcnR1YWxpdHlfYXR0cmlidXRlCi0gIHsKLSAgICBEV19WSVJUVUFMSVRZX25vbmUgPSAwLAotICAgIERXX1ZJUlRVQUxJVFlfdmlydHVhbCA9IDEsCi0gICAgRFdfVklSVFVBTElUWV9wdXJlX3ZpcnR1YWwgPSAyCi0gIH07Ci0KLS8qIGNhc2Ugc2Vuc2l0aXZpdHkgKi8KLWVudW0gZHdhcmZfaWRfY2FzZQotICB7Ci0gICAgRFdfSURfY2FzZV9zZW5zaXRpdmUgPSAwLAotICAgIERXX0lEX3VwX2Nhc2UgPSAxLAotICAgIERXX0lEX2Rvd25fY2FzZSA9IDIsCi0gICAgRFdfSURfY2FzZV9pbnNlbnNpdGl2ZSA9IDMKLSAgfTsKLQotLyogY2FsbGluZyBjb252ZW50aW9uICovCi1lbnVtIGR3YXJmX2NhbGxpbmdfY29udmVudGlvbgotICB7Ci0gICAgRFdfQ0Nfbm9ybWFsID0gMHgxLAotICAgIERXX0NDX3Byb2dyYW0gPSAweDIsCi0gICAgRFdfQ0Nfbm9jYWxsID0gMHgzCi0gIH07Ci0KLSNkZWZpbmUgRFdfQ0NfbG9fdXNlciAweDQwCi0jZGVmaW5lIERXX0NDX2hpX3VzZXIgMHhmZgotCi0vKiBpbmxpbmUgYXR0cmlidXRlICovCi1lbnVtIGR3YXJmX2lubGluZV9hdHRyaWJ1dGUKLSAgewotICAgIERXX0lOTF9ub3RfaW5saW5lZCA9IDAsCi0gICAgRFdfSU5MX2lubGluZWQgPSAxLAotICAgIERXX0lOTF9kZWNsYXJlZF9ub3RfaW5saW5lZCA9IDIsCi0gICAgRFdfSU5MX2RlY2xhcmVkX2lubGluZWQgPSAzCi0gIH07Ci0KLS8qIGRlc2NyaW1pbmFudCBsaXN0cyAqLwotZW51bSBkd2FyZl9kZXNjcmltX2xpc3QKLSAgewotICAgIERXX0RTQ19sYWJlbCA9IDAsCi0gICAgRFdfRFNDX3JhbmdlID0gMQotICB9OwotCi0vKiBsaW5lIG51bWJlciBvcGNvZGVzICovCi1lbnVtIGR3YXJmX2xpbmVfbnVtYmVyX29wcwotICB7Ci0gICAgRFdfTE5TX2V4dGVuZGVkX29wID0gMCwKLSAgICBEV19MTlNfY29weSA9IDEsCi0gICAgRFdfTE5TX2FkdmFuY2VfcGMgPSAyLAotICAgIERXX0xOU19hZHZhbmNlX2xpbmUgPSAzLAotICAgIERXX0xOU19zZXRfZmlsZSA9IDQsCi0gICAgRFdfTE5TX3NldF9jb2x1bW4gPSA1LAotICAgIERXX0xOU19uZWdhdGVfc3RtdCA9IDYsCi0gICAgRFdfTE5TX3NldF9iYXNpY19ibG9jayA9IDcsCi0gICAgRFdfTE5TX2NvbnN0X2FkZF9wYyA9IDgsCi0gICAgRFdfTE5TX2ZpeGVkX2FkdmFuY2VfcGMgPSA5Ci0gIH07Ci0KLS8qIGxpbmUgbnVtYmVyIGV4dGVuZGVkIG9wY29kZXMgKi8KLWVudW0gZHdhcmZfbGluZV9udW1iZXJfeF9vcHMKLSAgewotICAgIERXX0xORV9lbmRfc2VxdWVuY2UgPSAxLAotICAgIERXX0xORV9zZXRfYWRkcmVzcyA9IDIsCi0gICAgRFdfTE5FX2RlZmluZV9maWxlID0gMwotICB9OwotCi0vKiBjYWxsIGZyYW1lIGluZm9ybWF0aW9uICovCi1lbnVtIGR3YXJmX2NhbGxfZnJhbWVfaW5mbwotICB7Ci0gICAgRFdfQ0ZBX2FkdmFuY2VfbG9jID0gMHg0MCwKLSAgICBEV19DRkFfb2Zmc2V0ID0gMHg4MCwKLSAgICBEV19DRkFfcmVzdG9yZSA9IDB4YzAsCi0gICAgRFdfQ0ZBX25vcCA9IDB4MDAsCi0gICAgRFdfQ0ZBX3NldF9sb2MgPSAweDAxLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzEgPSAweDAyLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzIgPSAweDAzLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzQgPSAweDA0LAotICAgIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWQgPSAweDA1LAotICAgIERXX0NGQV9yZXN0b3JlX2V4dGVuZGVkID0gMHgwNiwKLSAgICBEV19DRkFfdW5kZWZpbmVkID0gMHgwNywKLSAgICBEV19DRkFfc2FtZV92YWx1ZSA9IDB4MDgsCi0gICAgRFdfQ0ZBX3JlZ2lzdGVyID0gMHgwOSwKLSAgICBEV19DRkFfcmVtZW1iZXJfc3RhdGUgPSAweDBhLAotICAgIERXX0NGQV9yZXN0b3JlX3N0YXRlID0gMHgwYiwKLSAgICBEV19DRkFfZGVmX2NmYSA9IDB4MGMsCi0gICAgRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIgPSAweDBkLAotICAgIERXX0NGQV9kZWZfY2ZhX29mZnNldCA9IDB4MGUsCi0gICAgLyogU0dJL01JUFMgc3BlY2lmaWMgKi8KLSAgICBEV19DRkFfTUlQU19hZHZhbmNlX2xvYzggPSAweDFkCi0gIH07Ci0KLSNkZWZpbmUgRFdfQ0lFX0lECSAgMHhmZmZmZmZmZgotI2RlZmluZSBEV19DSUVfVkVSU0lPTgkgIDEKLQotI2RlZmluZSBEV19DRkFfZXh0ZW5kZWQgICAwCi0jZGVmaW5lIERXX0NGQV9sb3dfdXNlciAgIDB4MWMKLSNkZWZpbmUgRFdfQ0ZBX2hpZ2hfdXNlciAgMHgzZgotCi0jZGVmaW5lIERXX0NISUxEUkVOX25vCQkgICAgIDB4MDAKLSNkZWZpbmUgRFdfQ0hJTERSRU5feWVzCQkgICAgIDB4MDEKLQotI2RlZmluZSBEV19BRERSX25vbmUJCTAKLQotLyogU291cmNlIGxhbmd1YWdlIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfc291cmNlX2xhbmd1YWdlCi0gIHsKLSAgICBEV19MQU5HX0M4OSA9IDB4MDAwMSwKLSAgICBEV19MQU5HX0MgPSAweDAwMDIsCi0gICAgRFdfTEFOR19BZGE4MyA9IDB4MDAwMywKLSAgICBEV19MQU5HX0NfcGx1c19wbHVzID0gMHgwMDA0LAotICAgIERXX0xBTkdfQ29ib2w3NCA9IDB4MDAwNSwKLSAgICBEV19MQU5HX0NvYm9sODUgPSAweDAwMDYsCi0gICAgRFdfTEFOR19Gb3J0cmFuNzcgPSAweDAwMDcsCi0gICAgRFdfTEFOR19Gb3J0cmFuOTAgPSAweDAwMDgsCi0gICAgRFdfTEFOR19QYXNjYWw4MyA9IDB4MDAwOSwKLSAgICBEV19MQU5HX01vZHVsYTIgPSAweDAwMGEsCi0gICAgRFdfTEFOR19NaXBzX0Fzc2VtYmxlciA9IDB4ODAwMQotICB9OwotCi0KLSNkZWZpbmUgRFdfTEFOR19sb191c2VyIDB4ODAwMAkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIERXX0xBTkdfaGlfdXNlciAweGZmZmYJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotCi0vKiBOYW1lcyBhbmQgY29kZXMgZm9yIG1hY3JvIGluZm9ybWF0aW9uLiAgKi8KLQotZW51bSBkd2FyZl9tYWNpbmZvX3JlY29yZF90eXBlCi0gIHsKLSAgICBEV19NQUNJTkZPX2RlZmluZSA9IDEsCi0gICAgRFdfTUFDSU5GT191bmRlZiA9IDIsCi0gICAgRFdfTUFDSU5GT19zdGFydF9maWxlID0gMywKLSAgICBEV19NQUNJTkZPX2VuZF9maWxlID0gNCwKLSAgICBEV19NQUNJTkZPX3ZlbmRvcl9leHQgPSAyNTUKLSAgfTsKLQotI2VuZGlmIC8qIF9FTEZfRFdBUkYyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2V4dGVybmFsLmggYi9pbmNsdWRlL2VsZi9leHRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2FiNzdlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2V4dGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyogRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NSwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0LCBmcm9tIGluZm9ybWF0aW9uIHB1Ymxpc2hlZAotICAgaW4gIlVOSVggU3lzdGVtIFYgUmVsZWFzZSA0LCBQcm9ncmFtbWVycyBHdWlkZTogQU5TSSBDIGFuZAotICAgUHJvZ3JhbW1pbmcgU3VwcG9ydCBUb29scyIuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBFTEYgc3VwcG9ydCBmb3IgQkZELCBhbmQgY29udGFpbnMgdGhlIHBvcnRpb25zCi0gICB0aGF0IGRlc2NyaWJlIGhvdyBFTEYgaXMgcmVwcmVzZW50ZWQgZXh0ZXJuYWxseSBieSB0aGUgQkZEIGxpYnJhcnkuCi0gICBJLkUuIGl0IGRlc2NyaWJlcyB0aGUgaW4tZmlsZSByZXByZXNlbnRhdGlvbiBvZiBFTEYuICBJdCByZXF1aXJlcwotICAgdGhlIGVsZi1jb21tb24uaCBmaWxlIHdoaWNoIGNvbnRhaW5zIHRoZSBwb3J0aW9ucyB0aGF0IGFyZSBjb21tb24gdG8KLSAgIGJvdGggdGhlIGludGVybmFsIGFuZCBleHRlcm5hbCByZXByZXNlbnRhdGlvbnMuICovCi0KLS8qIFRoZSA2NC1iaXQgc3R1ZmYgaXMga2luZCBvZiByYW5kb20uICBQZXJoYXBzIHNvbWVvbmUgd2lsbCBwdWJsaXNoIGEKLSAgIHNwZWMgc29tZWRheS4gICovCi0KLSNpZm5kZWYgX0VMRl9FWFRFUk5BTF9ICi0jZGVmaW5lIF9FTEZfRVhURVJOQUxfSAotCi0vKiBFTEYgSGVhZGVyICgzMi1iaXQgaW1wbGVtZW50YXRpb25zKSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJZV9pZGVudFsxNl07CQkvKiBFTEYgIm1hZ2ljIG51bWJlciIgKi8KLSAgdW5zaWduZWQgY2hhcgllX3R5cGVbMl07CQkvKiBJZGVudGlmaWVzIG9iamVjdCBmaWxlIHR5cGUgKi8KLSAgdW5zaWduZWQgY2hhcgllX21hY2hpbmVbMl07CQkvKiBTcGVjaWZpZXMgcmVxdWlyZWQgYXJjaGl0ZWN0dXJlICovCi0gIHVuc2lnbmVkIGNoYXIJZV92ZXJzaW9uWzRdOwkJLyogSWRlbnRpZmllcyBvYmplY3QgZmlsZSB2ZXJzaW9uICovCi0gIHVuc2lnbmVkIGNoYXIJZV9lbnRyeVs0XTsJCS8qIEVudHJ5IHBvaW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyCWVfcGhvZmZbNF07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBjaGFyCWVfc2hvZmZbNF07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBjaGFyCWVfZmxhZ3NbNF07CQkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgZmxhZ3MgKi8KLSAgdW5zaWduZWQgY2hhcgllX2Voc2l6ZVsyXTsJCS8qIEVMRiBoZWFkZXIgc2l6ZSBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCWVfcGhlbnRzaXplWzJdOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyCWVfcGhudW1bMl07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLwotICB1bnNpZ25lZCBjaGFyCWVfc2hlbnRzaXplWzJdOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyCWVfc2hudW1bMl07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLwotICB1bnNpZ25lZCBjaGFyCWVfc2hzdHJuZHhbMl07CQkvKiBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXggKi8KLX0gRWxmMzJfRXh0ZXJuYWxfRWhkcjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCWVfaWRlbnRbMTZdOwkJLyogRUxGICJtYWdpYyBudW1iZXIiICovCi0gIHVuc2lnbmVkIGNoYXIJZV90eXBlWzJdOwkJLyogSWRlbnRpZmllcyBvYmplY3QgZmlsZSB0eXBlICovCi0gIHVuc2lnbmVkIGNoYXIJZV9tYWNoaW5lWzJdOwkJLyogU3BlY2lmaWVzIHJlcXVpcmVkIGFyY2hpdGVjdHVyZSAqLwotICB1bnNpZ25lZCBjaGFyCWVfdmVyc2lvbls0XTsJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdmVyc2lvbiAqLwotICB1bnNpZ25lZCBjaGFyCWVfZW50cnlbOF07CQkvKiBFbnRyeSBwb2ludCB2aXJ0dWFsIGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhcgllX3Bob2ZmWzhdOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcgllX3Nob2ZmWzhdOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcgllX2ZsYWdzWzRdOwkJLyogUHJvY2Vzc29yLXNwZWNpZmljIGZsYWdzICovCi0gIHVuc2lnbmVkIGNoYXIJZV9laHNpemVbMl07CQkvKiBFTEYgaGVhZGVyIHNpemUgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhcgllX3BoZW50c2l6ZVsyXTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KLSAgdW5zaWduZWQgY2hhcgllX3BobnVtWzJdOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KLSAgdW5zaWduZWQgY2hhcgllX3NoZW50c2l6ZVsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KLSAgdW5zaWduZWQgY2hhcgllX3NobnVtWzJdOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KLSAgdW5zaWduZWQgY2hhcgllX3Noc3RybmR4WzJdOwkJLyogU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4ICovCi19IEVsZjY0X0V4dGVybmFsX0VoZHI7Ci0KLS8qIFByb2dyYW0gaGVhZGVyICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcglwX3R5cGVbNF07CQkvKiBJZGVudGlmaWVzIHByb2dyYW0gc2VnbWVudCB0eXBlICovCi0gIHVuc2lnbmVkIGNoYXIJcF9vZmZzZXRbNF07CQkvKiBTZWdtZW50IGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJcF92YWRkcls0XTsJCS8qIFNlZ21lbnQgdmlydHVhbCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIJcF9wYWRkcls0XTsJCS8qIFNlZ21lbnQgcGh5c2ljYWwgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyCXBfZmlsZXN6WzRdOwkJLyogU2VnbWVudCBzaXplIGluIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhcglwX21lbXN6WzRdOwkJLyogU2VnbWVudCBzaXplIGluIG1lbW9yeSAqLwotICB1bnNpZ25lZCBjaGFyCXBfZmxhZ3NbNF07CQkvKiBTZWdtZW50IGZsYWdzICovCi0gIHVuc2lnbmVkIGNoYXIJcF9hbGlnbls0XTsJCS8qIFNlZ21lbnQgYWxpZ25tZW50LCBmaWxlICYgbWVtb3J5ICovCi19IEVsZjMyX0V4dGVybmFsX1BoZHI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcglwX3R5cGVbNF07CQkvKiBJZGVudGlmaWVzIHByb2dyYW0gc2VnbWVudCB0eXBlICovCi0gIHVuc2lnbmVkIGNoYXIJcF9mbGFnc1s0XTsJCS8qIFNlZ21lbnQgZmxhZ3MgKi8KLSAgdW5zaWduZWQgY2hhcglwX29mZnNldFs4XTsJCS8qIFNlZ21lbnQgZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcglwX3ZhZGRyWzhdOwkJLyogU2VnbWVudCB2aXJ0dWFsIGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhcglwX3BhZGRyWzhdOwkJLyogU2VnbWVudCBwaHlzaWNhbCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIJcF9maWxlc3pbOF07CQkvKiBTZWdtZW50IHNpemUgaW4gZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyCXBfbWVtc3pbOF07CQkvKiBTZWdtZW50IHNpemUgaW4gbWVtb3J5ICovCi0gIHVuc2lnbmVkIGNoYXIJcF9hbGlnbls4XTsJCS8qIFNlZ21lbnQgYWxpZ25tZW50LCBmaWxlICYgbWVtb3J5ICovCi19IEVsZjY0X0V4dGVybmFsX1BoZHI7Ci0KLS8qIFNlY3Rpb24gaGVhZGVyICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcglzaF9uYW1lWzRdOwkJLyogU2VjdGlvbiBuYW1lLCBpbmRleCBpbiBzdHJpbmcgdGJsICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfdHlwZVs0XTsJCS8qIFR5cGUgb2Ygc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2ZsYWdzWzRdOwkJLyogTWlzY2VsbGFuZW91cyBzZWN0aW9uIGF0dHJpYnV0ZXMgKi8KLSAgdW5zaWduZWQgY2hhcglzaF9hZGRyWzRdOwkJLyogU2VjdGlvbiB2aXJ0dWFsIGFkZHIgYXQgZXhlY3V0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfb2Zmc2V0WzRdOwkJLyogU2VjdGlvbiBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBjaGFyCXNoX3NpemVbNF07CQkvKiBTaXplIG9mIHNlY3Rpb24gaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhcglzaF9saW5rWzRdOwkJLyogSW5kZXggb2YgYW5vdGhlciBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfaW5mb1s0XTsJCS8qIEFkZGl0aW9uYWwgc2VjdGlvbiBpbmZvcm1hdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2FkZHJhbGlnbls0XTsJLyogU2VjdGlvbiBhbGlnbm1lbnQgKi8KLSAgdW5zaWduZWQgY2hhcglzaF9lbnRzaXplWzRdOwkJLyogRW50cnkgc2l6ZSBpZiBzZWN0aW9uIGhvbGRzIHRhYmxlICovCi19IEVsZjMyX0V4dGVybmFsX1NoZHI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcglzaF9uYW1lWzRdOwkJLyogU2VjdGlvbiBuYW1lLCBpbmRleCBpbiBzdHJpbmcgdGJsICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfdHlwZVs0XTsJCS8qIFR5cGUgb2Ygc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2ZsYWdzWzhdOwkJLyogTWlzY2VsbGFuZW91cyBzZWN0aW9uIGF0dHJpYnV0ZXMgKi8KLSAgdW5zaWduZWQgY2hhcglzaF9hZGRyWzhdOwkJLyogU2VjdGlvbiB2aXJ0dWFsIGFkZHIgYXQgZXhlY3V0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfb2Zmc2V0WzhdOwkJLyogU2VjdGlvbiBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBjaGFyCXNoX3NpemVbOF07CQkvKiBTaXplIG9mIHNlY3Rpb24gaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhcglzaF9saW5rWzRdOwkJLyogSW5kZXggb2YgYW5vdGhlciBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfaW5mb1s0XTsJCS8qIEFkZGl0aW9uYWwgc2VjdGlvbiBpbmZvcm1hdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2FkZHJhbGlnbls4XTsJLyogU2VjdGlvbiBhbGlnbm1lbnQgKi8KLSAgdW5zaWduZWQgY2hhcglzaF9lbnRzaXplWzhdOwkJLyogRW50cnkgc2l6ZSBpZiBzZWN0aW9uIGhvbGRzIHRhYmxlICovCi19IEVsZjY0X0V4dGVybmFsX1NoZHI7Ci0KLS8qIFN5bWJvbCB0YWJsZSBlbnRyeSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJc3RfbmFtZVs0XTsJCS8qIFN5bWJvbCBuYW1lLCBpbmRleCBpbiBzdHJpbmcgdGJsICovCi0gIHVuc2lnbmVkIGNoYXIJc3RfdmFsdWVbNF07CQkvKiBWYWx1ZSBvZiB0aGUgc3ltYm9sICovCi0gIHVuc2lnbmVkIGNoYXIJc3Rfc2l6ZVs0XTsJCS8qIEFzc29jaWF0ZWQgc3ltYm9sIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhcglzdF9pbmZvWzFdOwkJLyogVHlwZSBhbmQgYmluZGluZyBhdHRyaWJ1dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc3Rfb3RoZXJbMV07CQkvKiBObyBkZWZpbmVkIG1lYW5pbmcsIDAgKi8KLSAgdW5zaWduZWQgY2hhcglzdF9zaG5keFsyXTsJCS8qIEFzc29jaWF0ZWQgc2VjdGlvbiBpbmRleCAqLwotfSBFbGYzMl9FeHRlcm5hbF9TeW07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcglzdF9uYW1lWzRdOwkJLyogU3ltYm9sIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KLSAgdW5zaWduZWQgY2hhcglzdF9pbmZvWzFdOwkJLyogVHlwZSBhbmQgYmluZGluZyBhdHRyaWJ1dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc3Rfb3RoZXJbMV07CQkvKiBObyBkZWZpbmVkIG1lYW5pbmcsIDAgKi8KLSAgdW5zaWduZWQgY2hhcglzdF9zaG5keFsyXTsJCS8qIEFzc29jaWF0ZWQgc2VjdGlvbiBpbmRleCAqLwotICB1bnNpZ25lZCBjaGFyCXN0X3ZhbHVlWzhdOwkJLyogVmFsdWUgb2YgdGhlIHN5bWJvbCAqLwotICB1bnNpZ25lZCBjaGFyCXN0X3NpemVbOF07CQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBzaXplICovCi19IEVsZjY0X0V4dGVybmFsX1N5bTsKLQotLyogTm90ZSBzZWdtZW50cyAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJbmFtZXN6WzRdOwkJLyogU2l6ZSBvZiBlbnRyeSdzIG93bmVyIHN0cmluZyAqLwotICB1bnNpZ25lZCBjaGFyCWRlc2Nzels0XTsJCS8qIFNpemUgb2YgdGhlIG5vdGUgZGVzY3JpcHRvciAqLwotICB1bnNpZ25lZCBjaGFyCXR5cGVbNF07CQkvKiBJbnRlcnByZXRhdGlvbiBvZiB0aGUgZGVzY3JpcHRvciAqLwotICBjaGFyCQluYW1lWzFdOwkJLyogU3RhcnQgb2YgdGhlIG5hbWUrZGVzYyBkYXRhICovCi19IEVsZl9FeHRlcm5hbF9Ob3RlOwotCi0vKiBSZWxvY2F0aW9uIEVudHJpZXMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhciByX29mZnNldFs0XTsJLyogTG9jYXRpb24gYXQgd2hpY2ggdG8gYXBwbHkgdGhlIGFjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXJfaW5mb1s0XTsJLyogaW5kZXggYW5kIHR5cGUgb2YgcmVsb2NhdGlvbiAqLwotfSBFbGYzMl9FeHRlcm5hbF9SZWw7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhciByX29mZnNldFs0XTsJLyogTG9jYXRpb24gYXQgd2hpY2ggdG8gYXBwbHkgdGhlIGFjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXJfaW5mb1s0XTsJLyogaW5kZXggYW5kIHR5cGUgb2YgcmVsb2NhdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXJfYWRkZW5kWzRdOwkvKiBDb25zdGFudCBhZGRlbmQgdXNlZCB0byBjb21wdXRlIHZhbHVlICovCi19IEVsZjMyX0V4dGVybmFsX1JlbGE7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhciByX29mZnNldFs4XTsJLyogTG9jYXRpb24gYXQgd2hpY2ggdG8gYXBwbHkgdGhlIGFjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXJfaW5mb1s4XTsJLyogaW5kZXggYW5kIHR5cGUgb2YgcmVsb2NhdGlvbiAqLwotfSBFbGY2NF9FeHRlcm5hbF9SZWw7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhciByX29mZnNldFs4XTsJLyogTG9jYXRpb24gYXQgd2hpY2ggdG8gYXBwbHkgdGhlIGFjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXJfaW5mb1s4XTsJLyogaW5kZXggYW5kIHR5cGUgb2YgcmVsb2NhdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXJfYWRkZW5kWzhdOwkvKiBDb25zdGFudCBhZGRlbmQgdXNlZCB0byBjb21wdXRlIHZhbHVlICovCi19IEVsZjY0X0V4dGVybmFsX1JlbGE7Ci0KLS8qIGR5bmFtaWMgc2VjdGlvbiBzdHJ1Y3R1cmUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCWRfdGFnWzRdOwkJLyogZW50cnkgdGFnIHZhbHVlICovCi0gIHVuaW9uIHsKLSAgICB1bnNpZ25lZCBjaGFyCWRfdmFsWzRdOwotICAgIHVuc2lnbmVkIGNoYXIJZF9wdHJbNF07Ci0gIH0gZF91bjsKLX0gRWxmMzJfRXh0ZXJuYWxfRHluOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJZF90YWdbOF07CQkvKiBlbnRyeSB0YWcgdmFsdWUgKi8KLSAgdW5pb24gewotICAgIHVuc2lnbmVkIGNoYXIJZF92YWxbOF07Ci0gICAgdW5zaWduZWQgY2hhcglkX3B0cls4XTsKLSAgfSBkX3VuOwotfSBFbGY2NF9FeHRlcm5hbF9EeW47Ci0KLS8qIFRoZSB2ZXJzaW9uIHN0cnVjdHVyZXMgYXJlIGN1cnJlbnRseSBzaXplIGluZGVwZW5kZW50LiAgVGhleSBhcmUKLSAgIG5hbWVkIHdpdGhvdXQgYSAzMiBvciA2NC4gIElmIHRoYXQgZXZlciBjaGFuZ2VzLCB0aGVzZSBzdHJ1Y3R1cmVzCi0gICB3aWxsIG5lZWQgdG8gYmUgcmVuYW1lZC4gICovCi0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3ZlcmRlZiBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCQl2ZF92ZXJzaW9uWzJdOwotICB1bnNpZ25lZCBjaGFyCQl2ZF9mbGFnc1syXTsKLSAgdW5zaWduZWQgY2hhcgkJdmRfbmR4WzJdOwotICB1bnNpZ25lZCBjaGFyCQl2ZF9jbnRbMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZkX2hhc2hbNF07Ci0gIHVuc2lnbmVkIGNoYXIJCXZkX2F1eFs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdmRfbmV4dFs0XTsKLX0gRWxmX0V4dGVybmFsX1ZlcmRlZjsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVyZGVmIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJCXZkYV9uYW1lWzRdOwotICB1bnNpZ25lZCBjaGFyCQl2ZGFfbmV4dFs0XTsKLX0gRWxmX0V4dGVybmFsX1ZlcmRhdXg7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3Zlcm5lZWQgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgkJdm5fdmVyc2lvblsyXTsKLSAgdW5zaWduZWQgY2hhcgkJdm5fY250WzJdOwotICB1bnNpZ25lZCBjaGFyCQl2bl9maWxlWzRdOwotICB1bnNpZ25lZCBjaGFyCQl2bl9hdXhbNF07Ci0gIHVuc2lnbmVkIGNoYXIJCXZuX25leHRbNF07Ci19IEVsZl9FeHRlcm5hbF9WZXJuZWVkOwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJuZWVkIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJCXZuYV9oYXNoWzRdOwotICB1bnNpZ25lZCBjaGFyCQl2bmFfZmxhZ3NbMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZuYV9vdGhlclsyXTsKLSAgdW5zaWduZWQgY2hhcgkJdm5hX25hbWVbNF07Ci0gIHVuc2lnbmVkIGNoYXIJCXZuYV9uZXh0WzRdOwotfSBFbGZfRXh0ZXJuYWxfVmVybmF1eDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVyc3ltIHNlY3Rpb24uICBUaGlzIGlzIG5vdCBhCi0gICBzdGFuZGFyZCBFTEYgc3RydWN0dXJlOyBFTEYganVzdCB1c2VzIEVsZjMyX0hhbGYuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJCXZzX3ZlcnNbMl07Ci19Ci0jaWZkZWYgX19HTlVDX18KLSAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCi0jZW5kaWYKLSAgRWxmX0V4dGVybmFsX1ZlcnN5bTsKLQotLyogU3RydWN0dXJlIGZvciBzeW1pbmZvIHNlY3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgY2hhcgkJc2lfYm91bmR0b1syXTsKLSAgdW5zaWduZWQgY2hhcgkJc2lfZmxhZ3NbMl07Ci19IEVsZl9FeHRlcm5hbF9TeW1pbmZvOwotCi0jZW5kaWYgLyogX0VMRl9FWFRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9mcjMwLmggYi9pbmNsdWRlL2VsZi9mcjMwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyM2IwNTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvZnIzMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogRlIzMCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9GUjMwX0gKLSNkZWZpbmUgX0VMRl9GUjMwX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2ZyMzBfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfOCwgMSkKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfMjAsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzMyLCAzKQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF80OCwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfNl9JTl80LCA1KQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF84X0lOXzgsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzlfSU5fOCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfMTBfSU5fOCwgOCkKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfOV9QQ1JFTCwgOSkKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfMTJfUENSRUwsIDEwKQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF9HTlVfVlRJTkhFUklULCAxMSkKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfR05VX1ZURU5UUlksIDEyKQotICBFTVBUWV9SRUxPQyAgKFJfRlIzMF9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYgLyogX0VMRl9GUjMwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2hwcGEuaCBiL2luY2x1ZGUvZWxmL2hwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk1MmUyMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9ocHBhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyogSFBQQSBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgSFBQQSBFTEYgQUJJLiAgTm90ZQotICAgdGhhdCBtb3N0IG9mIHRoaXMgaXMgbm90IGFjdHVhbGx5IGltcGxlbWVudGVkIGJ5IEJGRC4gICovCi0KLSNpZm5kZWYgX0VMRl9IUFBBX0gKLSNkZWZpbmUgX0VMRl9IUFBBX0gKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLQotLyogVGFyZ2V0IHByb2Nlc3NvciBJRHMgdG8gYmUgcGxhY2VkIGluIHRoZSBsb3cgMTYgYml0cyBvZiB0aGUgZmxhZ3MKLSAgIGZpZWxkLiAgTm90ZSB0aGVzZSBuYW1lcyBhcmUgc2hhcmVkIHdpdGggU09NLCBhbmQgdGhlcmVmb3JlIGRvIG5vdAotICAgZm9sbG93IEVMRiBuYW1pbmcgY29udmVudGlvbnMuICAqLwotCi0vKiBQQSAxLjAgYmlnIGVuZGlhbi4gICovCi0jaWZuZGVmIENQVV9QQV9SSVNDMV8wCi0jZGVmaW5lIENQVV9QQV9SSVNDMV8wCQkweDAwMDAwMjBiCi0jZW5kaWYKLQotLyogUEEgMS4xIGJpZyBlbmRpYW4uICAqLwotI2lmbmRlZiBDUFVfUEFfUklTQzFfMQotI2RlZmluZSBDUFVfUEFfUklTQzFfMQkJMHgwMDAwMDIxMAotI2VuZGlmCi0KLS8qIFBBIDEuMCBsaXR0bGUgZW5kaWFuICh1bnN1cHBvcnRlZCkgaXMgMHgwMDAwMDI4Yi4gICovCi0vKiBQQSAxLjEgbGl0dGxlIGVuZGlhbiAodW5zdXBwb3J0ZWQpIGlzIDB4MDAwMDAyOTAuICAqLwotCi0vKiBUcmFwIG51bGwgYWRkcmVzcyBkZXJlZmVyZW5jZXMuICAqLwotI2RlZmluZSBFTEZfUEFSSVNDX1RSQVBOSUwJMHgwMDAxMDAwMAotCi0vKiAuUEFSSVNDLmFyY2hleHQgc2VjdGlvbiBpcyBwcmVzZW50LiAgKi8KLSNkZWZpbmUgRUZfUEFSSVNDX0VYVAkJMHgwMDAyMDAwMAotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4gICovCi0KLS8qIEhvbGRzIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBhIHRhYmxlIG9mIHBvaW50ZXJzIHRvIGV4dGVybmFsCi0gICBkYXRhLiAgKi8KLSNkZWZpbmUgU0hUX1BBUklTQ19HT1QJCVNIVF9MT1BST0MrMAotCi0vKiBOb25sb2FkYWJsZSBzZWN0aW9uIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gaW4gYXJjaGl0ZWN0dXJlCi0gICBleHRlbnNpb25zIHVzZWQgYnkgdGhlIGNvZGUuICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX0FSQ0gJCVNIVF9MT1BST0MrMQotCi0vKiBTZWN0aW9uIGluIHdoaWNoICRnbG9iYWwkIGlzIGRlZmluZWQuICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX0dMT0JBTAlTSFRfTE9QUk9DKzIKLQotLyogU2VjdGlvbiBob2xkaW5nIG1pbGxpY29kZSByb3V0aW5lcyAobXVsLCBkaXYsIHJlbSwgZHluY2FsbCwgZXRjLiAgKi8KLSNkZWZpbmUgU0hUX1BBUklTQ19NSUxMSQlTSFRfTE9QUk9DKzMKLQotLyogU2VjdGlvbiBob2xkaW5nIHVud2luZCBpbmZvcm1hdGlvbiBmb3IgdXNlIGJ5IGRlYnVnZ2Vycy4gICovCi0jZGVmaW5lIFNIVF9QQVJJU0NfVU5XSU5ECVNIVF9MT1BST0MrNAotCi0vKiBTZWN0aW9uIGhvbGRpbmcgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSNkZWZpbmUgU0hUX1BBUklTQ19QTFQJCVNIVF9MT1BST0MrNQotCi0vKiBTaG9ydCBpbml0aWFsaXplZCBhbmQgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLSNkZWZpbmUgU0hUX1BBUklTQ19TREFUQQlTSFRfTE9QUk9DKzYKLSNkZWZpbmUgU0hUX1BBUklTQ19TQlNTCQlTSFRfTE9QUk9DKzcKLQotLyogT3B0aW9uYWwgc2VjdGlvbiBob2xkaW5nIGFyZ3VtZW50IGxvY2F0aW9uL3JlbG9jYXRpb24gaW5mby4gICovCi0jZGVmaW5lIFNIVF9QQVJJU0NfU1lNRVhUTglTSFRfTE9QUk9DKzgKLQotLyogT3B0aW9uIHNlY3Rpb24gZm9yIGxpbmtlciBzdHVicy4gICovCi0jZGVmaW5lIFNIVF9QQVJJU0NfU1RVQlMJU0hUX0xPUFJPQys5Ci0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGZsYWdzLiAgKi8KLQotLyogVGhpcyBzZWN0aW9uIGlzIG5lYXIgdGhlIGdsb2JhbCBkYXRhIHBvaW50ZXIgYW5kIHRodXMgYWxsb3dzIHNob3J0Ci0gICBhZGRyZXNzaW5nIG1vZGVzIHRvIGJlIHVzZWQuICAqLwotI2RlZmluZSBTSEZfUEFSSVNDX1NIT1JUICAgICAgICAweDIwMDAwMDAwCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzeW1ib2wgdHlwZXMuICAqLwotCi0vKiBNaWxsaWNvZGUgZnVuY3Rpb24gZW50cnkgcG9pbnQuICAqLwotI2RlZmluZSBTVFRfUEFSSVNDX01JTExJQ09ERQlTVFRfTE9QUk9DKzAKLQotCi0vKiBFTEYvSFBQQSByZWxvY2F0aW9uIHR5cGVzICovCi0KLSNpbmNsdWRlICJyZWxvYy1tYWNyb3MuaCIKLQotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmMzJfaHBwYV9yZWxvY190eXBlKQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX05PTkUsICAgICAgMCkJLyogTm8gcmVsb2MgKi8KLSAgICAgCi0gICAgIC8qIFRoZXNlIHJlbG9jYXRpb24gdHlwZXMgZG8gc2ltcGxlIGJhc2UgKyBvZmZzZXQgcmVsb2NhdGlvbnMuICAqLwotCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMzIsICAweDAxKQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjIxTCwgMHgwMikKLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxN1IsIDB4MDMpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTdGLCAweDA0KQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjE0UiwgMHgwNikKLQotICAgIC8qIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24gdHlwZXMKLSAgICAgICBUeXBpY2FsbHkgdXNlZCBmb3IgY2FsbHMuCi0gICAgICAgTm90ZSBQQ1JFTDE3QyBhbmQgUENSRUwxN0YgZGlmZmVyIG9ubHkgaW4gb3ZlcmZsb3cgaGFuZGxpbmcuCi0gICAgICAgUENSRUwxN0MgbmV2ZXIgcmVwb3J0cyBhIHJlbG9jYXRpb24gZXJyb3IuCi0KLSAgICAgICBXaGVuIHN1cHBvcnRpbmcgYXJndW1lbnQgcmVsb2NhdGlvbnMsIGZ1bmN0aW9uIGNhbGxzIG11c3QgYmUKLSAgICAgICBhY2NvbXBhbmllZCBieSBwYXJhbWV0ZXIgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4gIFRoaXMgaW5mb3JtYXRpb24gaXMgCi0gICAgICAgY2FycmllZCBpbiB0aGUgdGVuIGhpZ2gtb3JkZXIgYml0cyBvZiB0aGUgYWRkZW5kIGZpZWxkLiAgVGhlIHJlbWFpbmluZwotICAgICAgIDIyIGJpdHMgb2Ygb2YgdGhlIGFkZGVuZCBmaWVsZCBhcmUgc2lnbi1leHRlbmRlZCB0byBmb3JtIHRoZSBBZGRlbmQuCi0KLSAgICAgICBOb3RlIHRoZSBjb2RlIHRvIGJ1aWxkIGFyZ3VtZW50IHJlbG9jYXRpb25zIGRlcGVuZHMgb24gdGhlIAotICAgICAgIGFkZGVuZCBiZWluZyB6ZXJvLiAgQSBjb25zZXF1ZW5jZSBvZiB0aGlzIGxpbWl0YXRpb24gaXMgR0FTCi0gICAgICAgY2FuIG5vdCBwZXJmb3JtIHJlbG9jYXRpb24gcmVkdWN0aW9ucyBmb3IgZnVuY3Rpb24gc3ltYm9scy4gICovCi0gICAgIAotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMjFMLCAweDBhKQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTdSLCAweDBiKQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTdGLCAweDBjKQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTdDLCAweDBkKQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTRSLCAweDBlKQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTRGLCAweDBmKQotCi0gICAgLyogRFAtcmVsYXRpdmUgcmVsb2NhdGlvbiB0eXBlcy4gICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRFBSRUwyMUwsIDB4MTIpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRFBSRUwxNFIsIDB4MTYpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRFBSRUwxNEYsIDB4MTcpCi0KLSAgICAvKiBEYXRhIGxpbmthZ2UgdGFibGUgKERMVCkgcmVsb2NhdGlvbiB0eXBlcwotCi0gICAgICAgU09NIERMVF9SRUwgZml4dXAgcmVxdWVzdHMgYXJlIHVzZWQgdG8gZm9yIHN0YXRpYyBkYXRhIHJlZmVyZW5jZXMKLSAgICAgICBmcm9tIHBvc2l0aW9uLWluZGVwZW5kZW50IGNvZGUgd2l0aGluIHNoYXJlZCBsaWJyYXJpZXMuICBUaGV5IGFyZQotICAgICAgIHNpbWlsYXIgdG8gdGhlIEdPVCByZWxvY2F0aW9uIHR5cGVzIGluIHNvbWUgU1ZSNCBpbXBsZW1lbnRhdGlvbnMuICAqLwotCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUUkVMMjFMLCAweDFhKQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVFJFTDE0UiwgMHgxZSkKLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRSRUwxNEYsIDB4MWYpCi0KLSAgICAvKiBETFQgaW5kaXJlY3QgcmVsb2NhdGlvbiB0eXBlcyAgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRJTkQyMUwsIDB4MjIpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUSU5EMTRSLCAweDI2KQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVElORDE0RiwgMHgyNykKLQotICAgIC8qIEJhc2UgcmVsYXRpdmUgcmVsb2NhdGlvbiB0eXBlcy4gIFVnaC4gIFRoZXNlIGltcGx5IGxvdHMgb2Ygc3RhdGUgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19TRVRCQVNFLCAgICAweDI4KQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwzMiwgIDB4MjkpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQkFTRVJFTDIxTCwgMHgyYSkKLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMTdSLCAweDJiKQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwxN0YsIDB4MmMpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQkFTRVJFTDE0UiwgMHgyZSkKLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMTRGLCAweDJmKQotCi0gICAgLyogU2VnbWVudCByZWxhdGl2ZSByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19URVhUUkVMMzIsIDB4MzEpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfREFUQVJFTDMyLCAweDM5KQotCi0gICAgLyogUGxhYmVsIHJlbG9jYXRpb24gdHlwZXMuICAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMQUJFTDMyLCAgMHg0MSkKLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTEFCRUwyMUwsIDB4NDIpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExBQkVMMTRSLCAweDQ2KQotCi0gICAgLyogUExUIHJlbG9jYXRpb25zLiAgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRJTkQyMUwsIDB4ODIpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExUSU5EMTRSLCAweDg2KQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMVElORDE0RiwgMHg4NykKLQotICAgIC8qIE1pc2MgcmVsb2NhdGlvbiB0eXBlcy4gICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQ09QWSwgICAgIDB4ODgpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfR0xPQl9EQVQsIDB4ODkpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfSk1QX1NMT1QsIDB4OGEpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUkVMQVRJVkUsIDB4OGIpCi0gICAgIAotICAgICBFTVBUWV9SRUxPQyAoUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNpZm5kZWYgUkVMT0NfTUFDUk9TX0dFTl9GVU5DCi10eXBlZGVmIGVudW0gZWxmMzJfaHBwYV9yZWxvY190eXBlIGVsZjMyX2hwcGFfcmVsb2NfdHlwZTsKLSNlbmRpZgotCi0jZW5kaWYgLyogX0VMRl9IUFBBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2kzODYuaCBiL2luY2x1ZGUvZWxmL2kzODYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5ZjEwNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9pMzg2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBpeDg2IEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX0kzODZfSAotI2RlZmluZSBfRUxGX0kzODZfSAotCi0jaW5jbHVkZSAicmVsb2MtbWFjcm9zLmgiCi0KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9pMzg2X3JlbG9jX3R5cGUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfTk9ORSwgICAgICAwKQkvKiBObyByZWxvYyAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2XzMyLCAgICAgICAgMSkJLyogRGlyZWN0IDMyIGJpdCAgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9QQzMyLCAgICAgIDIpCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0dPVDMyLCAgICAgMykJLyogMzIgYml0IEdPVCBlbnRyeSAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X1BMVDMyLAkgICAgNCkJLyogMzIgYml0IFBMVCBhZGRyZXNzICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfQ09QWSwJICAgIDUpCS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9HTE9CX0RBVCwgIDYpCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9KVU1QX1NMT1QsIDcpCS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9SRUxBVElWRSwgIDgpCS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9HT1RPRkYsICAgIDkpCS8qIDMyIGJpdCBvZmZzZXQgdG8gR09UICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR09UUEMsICAgIDEwKQkvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIEdPVCAqLwotICAgICBGQUtFX1JFTE9DICAgKEZJUlNUX0lOVkFMSURfUkVMT0MsIDExKQotICAgICBGQUtFX1JFTE9DICAgKExBU1RfSU5WQUxJRF9SRUxPQywgIDE5KQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2XzE2LCAgICAgICAyMCkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9QQzE2LCAgICAgMjEpCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfOCwJICAgMjIpCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUEM4LCAgICAgIDIzKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X21heCwJICAgMjQpCi0gICAgIC8qIFRoZXNlIGFyZSBHTlUgZXh0ZW5zaW9ucyB0byBlbmFibGUgQysrIHZ0YWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0dOVV9WVElOSEVSSVQsIDI1MCkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9HTlVfVlRFTlRSWSwgMjUxKQotRU5EX1JFTE9DX05VTUJFUlMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9pbnRlcm5hbC5oIGIvaW5jbHVkZS9lbGYvaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliODFhMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydCwgZnJvbSBpbmZvcm1hdGlvbiBwdWJsaXNoZWQKLSAgIGluICJVTklYIFN5c3RlbSBWIFJlbGVhc2UgNCwgUHJvZ3JhbW1lcnMgR3VpZGU6IEFOU0kgQyBhbmQKLSAgIFByb2dyYW1taW5nIFN1cHBvcnQgVG9vbHMiLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRUxGIHN1cHBvcnQgZm9yIEJGRCwgYW5kIGNvbnRhaW5zIHRoZSBwb3J0aW9ucwotICAgdGhhdCBkZXNjcmliZSBob3cgRUxGIGlzIHJlcHJlc2VudGVkIGludGVybmFsbHkgaW4gdGhlIEJGRCBsaWJyYXJ5LgotICAgSS5FLiBpdCBkZXNjcmliZXMgdGhlIGluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBFTEYuICBJdCByZXF1aXJlcwotICAgdGhlIGVsZi1jb21tb24uaCBmaWxlIHdoaWNoIGNvbnRhaW5zIHRoZSBwb3J0aW9ucyB0aGF0IGFyZSBjb21tb24gdG8KLSAgIGJvdGggdGhlIGludGVybmFsIGFuZCBleHRlcm5hbCByZXByZXNlbnRhdGlvbnMuICovCi0KLQotLyogTk9URSB0aGF0IHRoZXNlIHN0cnVjdHVyZXMgYXJlIG5vdCBrZXB0IGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgYXBwZWFyCi0gICBpbiB0aGUgb2JqZWN0IGZpbGUuICBJbiBzb21lIGNhc2VzIHRoZXkndmUgYmVlbiByZW9yZGVyZWQgZm9yIG1vcmUgb3B0aW1hbAotICAgcGFja2luZyB1bmRlciB2YXJpb3VzIGNpcmN1bXN0YW5jZXMuICAqLwotCi0jaWZuZGVmIF9FTEZfSU5URVJOQUxfSAotI2RlZmluZSBfRUxGX0lOVEVSTkFMX0gKLQotLyogRUxGIEhlYWRlciAqLwotCi0jZGVmaW5lIEVJX05JREVOVAkxNgkJLyogU2l6ZSBvZiBlX2lkZW50W10gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX2VoZHIgewotICB1bnNpZ25lZCBjaGFyCQllX2lkZW50W0VJX05JREVOVF07CS8qIEVMRiAibWFnaWMgbnVtYmVyIiAqLwotICBiZmRfdm1hCQllX2VudHJ5OwkJLyogRW50cnkgcG9pbnQgdmlydHVhbCBhZGRyZXNzICovCi0gIGJmZF9zaXplX3R5cGUJCWVfcGhvZmY7CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLwotICBiZmRfc2l6ZV90eXBlCQllX3Nob2ZmOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgbG9uZwkJZV92ZXJzaW9uOwkJLyogSWRlbnRpZmllcyBvYmplY3QgZmlsZSB2ZXJzaW9uICovCi0gIHVuc2lnbmVkIGxvbmcJCWVfZmxhZ3M7CQkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgZmxhZ3MgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV90eXBlOwkJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdHlwZSAqLwotICB1bnNpZ25lZCBzaG9ydAllX21hY2hpbmU7CQkvKiBTcGVjaWZpZXMgcmVxdWlyZWQgYXJjaGl0ZWN0dXJlICovCi0gIHVuc2lnbmVkIHNob3J0CWVfZWhzaXplOwkJLyogRUxGIGhlYWRlciBzaXplIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIHNob3J0CWVfcGhlbnRzaXplOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLwotICB1bnNpZ25lZCBzaG9ydAllX3BobnVtOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV9zaGVudHNpemU7CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCi0gIHVuc2lnbmVkIHNob3J0CWVfc2hudW07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLwotICB1bnNpZ25lZCBzaG9ydAllX3Noc3RybmR4OwkJLyogU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4ICovCi19IEVsZl9JbnRlcm5hbF9FaGRyOwotCi0jZGVmaW5lIGVsZjMyX2ludGVybmFsX2VoZHIgZWxmX2ludGVybmFsX2VoZHIKLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfRWhkciBFbGZfSW50ZXJuYWxfRWhkcgotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF9laGRyIGVsZl9pbnRlcm5hbF9laGRyCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX0VoZHIgRWxmX0ludGVybmFsX0VoZHIKLQotLyogUHJvZ3JhbSBoZWFkZXIgKi8KLQotc3RydWN0IGVsZl9pbnRlcm5hbF9waGRyIHsKLSAgdW5zaWduZWQgbG9uZwlwX3R5cGU7CQkJLyogSWRlbnRpZmllcyBwcm9ncmFtIHNlZ21lbnQgdHlwZSAqLwotICB1bnNpZ25lZCBsb25nCXBfZmxhZ3M7CQkvKiBTZWdtZW50IGZsYWdzICovCi0gIGJmZF92bWEJcF9vZmZzZXQ7CQkvKiBTZWdtZW50IGZpbGUgb2Zmc2V0ICovCi0gIGJmZF92bWEJcF92YWRkcjsJCS8qIFNlZ21lbnQgdmlydHVhbCBhZGRyZXNzICovCi0gIGJmZF92bWEJcF9wYWRkcjsJCS8qIFNlZ21lbnQgcGh5c2ljYWwgYWRkcmVzcyAqLwotICBiZmRfdm1hCXBfZmlsZXN6OwkJLyogU2VnbWVudCBzaXplIGluIGZpbGUgKi8KLSAgYmZkX3ZtYQlwX21lbXN6OwkJLyogU2VnbWVudCBzaXplIGluIG1lbW9yeSAqLwotICBiZmRfdm1hCXBfYWxpZ247CQkvKiBTZWdtZW50IGFsaWdubWVudCwgZmlsZSAmIG1lbW9yeSAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3BoZHIgRWxmX0ludGVybmFsX1BoZHI7Ci0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3BoZHIgZWxmX2ludGVybmFsX3BoZHIKLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfUGhkciBFbGZfSW50ZXJuYWxfUGhkcgotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF9waGRyIGVsZl9pbnRlcm5hbF9waGRyCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1BoZHIgRWxmX0ludGVybmFsX1BoZHIKLQotLyogU2VjdGlvbiBoZWFkZXIgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3NoZHIgewotICB1bnNpZ25lZCBpbnQJc2hfbmFtZTsJCS8qIFNlY3Rpb24gbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLwotICB1bnNpZ25lZCBpbnQJc2hfdHlwZTsJCS8qIFR5cGUgb2Ygc2VjdGlvbiAqLwotICBiZmRfdm1hCXNoX2ZsYWdzOwkJLyogTWlzY2VsbGFuZW91cyBzZWN0aW9uIGF0dHJpYnV0ZXMgKi8KLSAgYmZkX3ZtYQlzaF9hZGRyOwkJLyogU2VjdGlvbiB2aXJ0dWFsIGFkZHIgYXQgZXhlY3V0aW9uICovCi0gIGJmZF9zaXplX3R5cGUJc2hfc2l6ZTsJCS8qIFNpemUgb2Ygc2VjdGlvbiBpbiBieXRlcyAqLwotICBiZmRfc2l6ZV90eXBlCXNoX2VudHNpemU7CQkvKiBFbnRyeSBzaXplIGlmIHNlY3Rpb24gaG9sZHMgdGFibGUgKi8KLSAgdW5zaWduZWQgbG9uZwlzaF9saW5rOwkJLyogSW5kZXggb2YgYW5vdGhlciBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGxvbmcJc2hfaW5mbzsJCS8qIEFkZGl0aW9uYWwgc2VjdGlvbiBpbmZvcm1hdGlvbiAqLwotICBmaWxlX3B0cglzaF9vZmZzZXQ7CQkvKiBTZWN0aW9uIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGludAlzaF9hZGRyYWxpZ247CQkvKiBTZWN0aW9uIGFsaWdubWVudCAqLwotCi0gIC8qIFRoZSBpbnRlcm5hbCByZXAgYWxzbyBoYXMgc29tZSBjYWNoZWQgaW5mbyBhc3NvY2lhdGVkIHdpdGggaXQuICovCi0gIGFzZWN0aW9uICoJYmZkX3NlY3Rpb247CQkvKiBBc3NvY2lhdGVkIEJGRCBzZWN0aW9uLiAgKi8KLSAgUFRSCQljb250ZW50czsJCS8qIFNlY3Rpb24gY29udGVudHMuICAqLwotfSBFbGZfSW50ZXJuYWxfU2hkcjsKLQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9zaGRyIGVsZl9pbnRlcm5hbF9zaGRyCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1NoZHIgRWxmX0ludGVybmFsX1NoZHIKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfc2hkciBlbGZfaW50ZXJuYWxfc2hkcgotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9TaGRyIEVsZl9JbnRlcm5hbF9TaGRyCi0KLS8qIFN5bWJvbCB0YWJsZSBlbnRyeSAqLwotCi1zdHJ1Y3QgZWxmX2ludGVybmFsX3N5bSB7Ci0gIGJmZF92bWEJc3RfdmFsdWU7CQkvKiBWYWx1ZSBvZiB0aGUgc3ltYm9sICovCi0gIGJmZF92bWEJc3Rfc2l6ZTsJCS8qIEFzc29jaWF0ZWQgc3ltYm9sIHNpemUgKi8KLSAgdW5zaWduZWQgbG9uZwlzdF9uYW1lOwkJLyogU3ltYm9sIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KLSAgdW5zaWduZWQgY2hhcglzdF9pbmZvOwkJLyogVHlwZSBhbmQgYmluZGluZyBhdHRyaWJ1dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc3Rfb3RoZXI7CQkvKiBObyBkZWZpbmVkIG1lYW5pbmcsIDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgc3Rfc2huZHg7CQkvKiBBc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9zeW0gRWxmX0ludGVybmFsX1N5bTsKLQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9zeW0gZWxmX2ludGVybmFsX3N5bQotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF9zeW0gZWxmX2ludGVybmFsX3N5bQotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9TeW0gRWxmX0ludGVybmFsX1N5bQotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9TeW0gRWxmX0ludGVybmFsX1N5bQotCi0vKiBOb3RlIHNlZ21lbnRzICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9ub3RlIHsKLSAgdW5zaWduZWQgbG9uZwluYW1lc3o7CQkJLyogU2l6ZSBvZiBlbnRyeSdzIG93bmVyIHN0cmluZyAqLwotICB1bnNpZ25lZCBsb25nCWRlc2NzejsJCQkvKiBTaXplIG9mIHRoZSBub3RlIGRlc2NyaXB0b3IgKi8KLSAgdW5zaWduZWQgbG9uZwl0eXBlOwkJCS8qIEludGVycHJldGF0aW9uIG9mIHRoZSBkZXNjcmlwdG9yICovCi0gIGNoYXIgKgluYW1lZGF0YTsJCS8qIFN0YXJ0IG9mIHRoZSBuYW1lK2Rlc2MgZGF0YSAqLwotICBjaGFyICoJZGVzY2RhdGE7CQkvKiBTdGFydCBvZiB0aGUgZGVzYyBkYXRhICovCi0gIGJmZF92bWEJZGVzY3BvczsJCS8qIEZpbGUgb2Zmc2V0IG9mIHRoZSBkZXNjZGF0YSAqLwotfSBFbGZfSW50ZXJuYWxfTm90ZTsKLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfTm90ZQlFbGZfSW50ZXJuYWxfTm90ZQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9ub3RlCWVsZl9pbnRlcm5hbF9ub3RlCi0KLS8qIFJlbG9jYXRpb24gRW50cmllcyAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfcmVsIHsKLSAgYmZkX3ZtYQlyX29mZnNldDsJLyogTG9jYXRpb24gYXQgd2hpY2ggdG8gYXBwbHkgdGhlIGFjdGlvbiAqLwotICAvKiBUaGlzIG5lZWRzIHRvIHN1cHBvcnQgNjQtYml0IHZhbHVlcyBpbiBlbGY2NC4gICovCi0gIGJmZF92bWEJcl9pbmZvOwkJLyogaW5kZXggYW5kIHR5cGUgb2YgcmVsb2NhdGlvbiAqLwotfSBFbGZfSW50ZXJuYWxfUmVsOwotCi0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3JlbCBlbGZfaW50ZXJuYWxfcmVsCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1JlbCBFbGZfSW50ZXJuYWxfUmVsCi0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3JlbCBlbGZfaW50ZXJuYWxfcmVsCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1JlbCBFbGZfSW50ZXJuYWxfUmVsCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9yZWxhIHsKLSAgYmZkX3ZtYQlyX29mZnNldDsJLyogTG9jYXRpb24gYXQgd2hpY2ggdG8gYXBwbHkgdGhlIGFjdGlvbiAqLwotICBiZmRfdm1hCXJfaW5mbzsJCS8qIEluZGV4IGFuZCBUeXBlIG9mIHJlbG9jYXRpb24gKi8KLSAgYmZkX3NpZ25lZF92bWEgcl9hZGRlbmQ7CS8qIENvbnN0YW50IGFkZGVuZCB1c2VkIHRvIGNvbXB1dGUgdmFsdWUgKi8KLX0gRWxmX0ludGVybmFsX1JlbGE7Ci0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfcmVsYSBlbGZfaW50ZXJuYWxfcmVsYQotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF9yZWxhIGVsZl9pbnRlcm5hbF9yZWxhCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1JlbGEgRWxmX0ludGVybmFsX1JlbGEKLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfUmVsYSBFbGZfSW50ZXJuYWxfUmVsYQotCi0vKiBkeW5hbWljIHNlY3Rpb24gc3RydWN0dXJlICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9keW4gewotICAvKiBUaGlzIG5lZWRzIHRvIHN1cHBvcnQgNjQtYml0IHZhbHVlcyBpbiBlbGY2NC4gICovCi0gIGJmZF92bWEgZF90YWc7CQkvKiBlbnRyeSB0YWcgdmFsdWUgKi8KLSAgdW5pb24gewotICAgIC8qIFRoaXMgbmVlZHMgdG8gc3VwcG9ydCA2NC1iaXQgdmFsdWVzIGluIGVsZjY0LiAgKi8KLSAgICBiZmRfdm1hCWRfdmFsOwotICAgIGJmZF92bWEJZF9wdHI7Ci0gIH0gZF91bjsKLX0gRWxmX0ludGVybmFsX0R5bjsKLQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9keW4gZWxmX2ludGVybmFsX2R5bgotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF9keW4gZWxmX2ludGVybmFsX2R5bgotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9EeW4gRWxmX0ludGVybmFsX0R5bgotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9EeW4gRWxmX0ludGVybmFsX0R5bgotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJkZWYgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJkZWYgewotICB1bnNpZ25lZCBzaG9ydCB2ZF92ZXJzaW9uOwkvKiBWZXJzaW9uIG51bWJlciBvZiBzdHJ1Y3R1cmUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB2ZF9mbGFnczsJLyogRmxhZ3MgKFZFUl9GTEdfKikuICAqLwotICB1bnNpZ25lZCBzaG9ydCB2ZF9uZHg7CS8qIFZlcnNpb24gaW5kZXguICAqLwotICB1bnNpZ25lZCBzaG9ydCB2ZF9jbnQ7CS8qIE51bWJlciBvZiB2ZXJkYXV4IGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBsb25nCSB2ZF9oYXNoOwkvKiBIYXNoIG9mIG5hbWUuICAqLwotICB1bnNpZ25lZCBsb25nCSB2ZF9hdXg7CS8qIE9mZnNldCB0byB2ZXJkYXV4IGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBsb25nCSB2ZF9uZXh0OwkvKiBPZmZzZXQgdG8gbmV4dCB2ZXJkZWYuICAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgc2V0IHVwIHdoZW4gQkZEIHJlYWRzIGluIHRoZSBzdHJ1Y3R1cmUuICBGSVhNRToKLSAgICAgSXQgd291bGQgYmUgY2xlYW5lciB0byBzdG9yZSB0aGVzZSBpbiBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUuICAqLwotICBiZmQJCQkgICAgICAqdmRfYmZkOwkJLyogQkZELiAgKi8KLSAgY29uc3QgY2hhcgkJICAgICAgKnZkX25vZGVuYW1lOwkvKiBWZXJzaW9uIG5hbWUuICAqLwotICBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRlZiAgKnZkX25leHRkZWY7CS8qIHZkX25leHQgYXMgcG9pbnRlci4gICovCi0gIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVyZGF1eCAqdmRfYXV4cHRyOwkvKiB2ZF9hdXggYXMgcG9pbnRlci4gICovCi0gIHVuc2lnbmVkIGludAkJICAgICAgIHZkX2V4cF9yZWZubzsJLyogVXNlZCBieSB0aGUgbGlua2VyLiAgKi8KLX0gRWxmX0ludGVybmFsX1ZlcmRlZjsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVyZGVmIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVyZGF1eCB7Ci0gIHVuc2lnbmVkIGxvbmcgdmRhX25hbWU7CS8qIFN0cmluZyB0YWJsZSBvZmZzZXQgb2YgbmFtZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgdmRhX25leHQ7CS8qIE9mZnNldCB0byBuZXh0IHZlcmRhdXguICAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgc2V0IHVwIHdoZW4gQkZEIHJlYWRzIGluIHRoZSBzdHJ1Y3R1cmUuICBGSVhNRToKLSAgICAgSXQgd291bGQgYmUgY2xlYW5lciB0byBzdG9yZSB0aGVzZSBpbiBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUuICAqLwotICBjb25zdCBjaGFyICp2ZGFfbm9kZW5hbWU7CQkJLyogdmRhX25hbWUgYXMgcG9pbnRlci4gICovCi0gIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVyZGF1eCAqdmRhX25leHRwdHI7CS8qIHZkYV9uZXh0IGFzIHBvaW50ZXIuICAqLwotfSBFbGZfSW50ZXJuYWxfVmVyZGF1eDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVybmVlZCBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3Zlcm5lZWQgewotICB1bnNpZ25lZCBzaG9ydCB2bl92ZXJzaW9uOwkvKiBWZXJzaW9uIG51bWJlciBvZiBzdHJ1Y3R1cmUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB2bl9jbnQ7CS8qIE51bWJlciBvZiB2ZXJuYXV4IGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBsb25nCSB2bl9maWxlOwkvKiBTdHJpbmcgdGFibGUgb2Zmc2V0IG9mIGxpYnJhcnkgbmFtZS4gICovCi0gIHVuc2lnbmVkIGxvbmcJIHZuX2F1eDsJLyogT2Zmc2V0IHRvIHZlcm5hdXggZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGxvbmcJIHZuX25leHQ7CS8qIE9mZnNldCB0byBuZXh0IHZlcm5lZWQuICAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgc2V0IHVwIHdoZW4gQkZEIHJlYWRzIGluIHRoZSBzdHJ1Y3R1cmUuICBGSVhNRToKLSAgICAgSXQgd291bGQgYmUgY2xlYW5lciB0byBzdG9yZSB0aGVzZSBpbiBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUuICAqLwotICBiZmQJCQkgICAgICAqdm5fYmZkOwkJLyogQkZELiAgKi8KLSAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICp2bl9maWxlbmFtZTsJLyogdm5fZmlsZSBhcyBwb2ludGVyLiAgKi8KLSAgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJuYXV4ICp2bl9hdXhwdHI7CS8qIHZuX2F1eCBhcyBwb2ludGVyLiAgKi8KLSAgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJuZWVkICp2bl9uZXh0cmVmOwkvKiB2bl9uZXh0cmVmIGFzIHBvaW50ZXIuICAqLwotfSBFbGZfSW50ZXJuYWxfVmVybmVlZDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVybmVlZCBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3Zlcm5hdXggewotICB1bnNpZ25lZCBsb25nCSB2bmFfaGFzaDsJLyogSGFzaCBvZiBkZXBlbmRlbmN5IG5hbWUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB2bmFfZmxhZ3M7CS8qIEZsYWdzIChWRVJfRkxHXyopLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdm5hX290aGVyOwkvKiBVbnVzZWQuICAqLwotICB1bnNpZ25lZCBsb25nCSB2bmFfbmFtZTsJLyogU3RyaW5nIHRhYmxlIG9mZnNldCB0byB2ZXJzaW9uIG5hbWUuICAqLwotICB1bnNpZ25lZCBsb25nCSB2bmFfbmV4dDsJLyogT2Zmc2V0IHRvIG5leHQgdmVybmF1eC4gICovCi0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBzZXQgdXAgd2hlbiBCRkQgcmVhZHMgaW4gdGhlIHN0cnVjdHVyZS4gIEZJWE1FOgotICAgICBJdCB3b3VsZCBiZSBjbGVhbmVyIHRvIHN0b3JlIHRoZXNlIGluIGEgZGlmZmVyZW50IHN0cnVjdHVyZS4gICovCi0gIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqdm5hX25vZGVuYW1lOwkvKiB2bmFfbmFtZSBhcyBwb2ludGVyLiAgKi8KLSAgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJuYXV4ICp2bmFfbmV4dHB0cjsJLyogdm5hX25leHQgYXMgcG9pbnRlci4gICovCi19IEVsZl9JbnRlcm5hbF9WZXJuYXV4OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJzeW0gc2VjdGlvbi4gIFRoaXMgaXMgbm90IGEKLSAgIHN0YW5kYXJkIEVMRiBzdHJ1Y3R1cmU7IEVMRiBqdXN0IHVzZXMgRWxmMzJfSGFsZi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJzeW0gewotICB1bnNpZ25lZCBzaG9ydCB2c192ZXJzOwotfSBFbGZfSW50ZXJuYWxfVmVyc3ltOwotCi0vKiBTdHJ1Y3R1cmUgZm9yIHN5bWluZm8gc2VjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBzaG9ydCBpbnQgCXNpX2JvdW5kdG87Ci0gIHVuc2lnbmVkIHNob3J0IGludAlzaV9mbGFnczsKLX0gRWxmX0ludGVybmFsX1N5bWluZm87Ci0KLQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF92ZXJkZWYgZWxmX2ludGVybmFsX3ZlcmRlZgotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF92ZXJkZWYgZWxmX2ludGVybmFsX3ZlcmRlZgotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF92ZXJkYXV4IGVsZl9pbnRlcm5hbF92ZXJkYXV4Ci0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3ZlcmRhdXggZWxmX2ludGVybmFsX3ZlcmRhdXgKLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVybmVlZCBlbGZfaW50ZXJuYWxfdmVybmVlZAotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF92ZXJuZWVkIGVsZl9pbnRlcm5hbF92ZXJuZWVkCi0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3Zlcm5hdXggZWxmX2ludGVybmFsX3Zlcm5hdXgKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVybmF1eCBlbGZfaW50ZXJuYWxfdmVybmF1eAotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF92ZXJzeW0gZWxmX2ludGVybmFsX3ZlcnN5bQotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF92ZXJzeW0gZWxmX2ludGVybmFsX3ZlcnN5bQotCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1ZlcmRlZiBFbGZfSW50ZXJuYWxfVmVyZGVmCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1ZlcmRlZiBFbGZfSW50ZXJuYWxfVmVyZGVmCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1ZlcmRhdXggRWxmX0ludGVybmFsX1ZlcmRhdXgKLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfVmVyZGF1eCBFbGZfSW50ZXJuYWxfVmVyZGF1eAotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJuZWVkIEVsZl9JbnRlcm5hbF9WZXJuZWVkCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1Zlcm5lZWQgRWxmX0ludGVybmFsX1Zlcm5lZWQKLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfVmVybmF1eCBFbGZfSW50ZXJuYWxfVmVybmF1eAotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJuYXV4IEVsZl9JbnRlcm5hbF9WZXJuYXV4Ci0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1ZlcnN5bSBFbGZfSW50ZXJuYWxfVmVyc3ltCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1ZlcnN5bSBFbGZfSW50ZXJuYWxfVmVyc3ltCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1N5bWluZm8gRWxmX0ludGVybmFsX1N5bWluZm8KLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfU3ltaW5mbyBFbGZfSW50ZXJuYWxfU3ltaW5mbwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlc2NyaWJlIGhvdyBzZWN0aW9ucyBzaG91bGQgYmUgYXNzaWduZWQKLSAgIHRvIHByb2dyYW0gc2VnbWVudHMuICAqLwotCi1zdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwCi17Ci0gIC8qIE5leHQgcHJvZ3JhbSBzZWdtZW50LiAgKi8KLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbmV4dDsKLSAgLyogUHJvZ3JhbSBzZWdtZW50IHR5cGUuICAqLwotICB1bnNpZ25lZCBsb25nIHBfdHlwZTsKLSAgLyogUHJvZ3JhbSBzZWdtZW50IGZsYWdzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBwX2ZsYWdzOwotICAvKiBQcm9ncmFtIHNlZ21lbnQgcGh5c2ljYWwgYWRkcmVzcy4gICovCi0gIGJmZF92bWEgcF9wYWRkcjsKLSAgLyogV2hldGhlciB0aGUgcF9mbGFncyBmaWVsZCBpcyB2YWxpZDsgaWYgbm90LCB0aGUgZmxhZ3MgYXJlIGJhc2VkCi0gICAgIG9uIHRoZSBzZWN0aW9uIGZsYWdzLiAgKi8KLSAgdW5zaWduZWQgaW50IHBfZmxhZ3NfdmFsaWQgOiAxOwotICAvKiBXaGV0aGVyIHRoZSBwX3BhZGRyIGZpZWxkIGlzIHZhbGlkOyBpZiBub3QsIHRoZSBwaHlzaWNhbCBhZGRyZXNzCi0gICAgIGlzIGJhc2VkIG9uIHRoZSBzZWN0aW9uIGxtYSB2YWx1ZXMuICAqLwotICB1bnNpZ25lZCBpbnQgcF9wYWRkcl92YWxpZCA6IDE7Ci0gIC8qIFdoZXRoZXIgdGhpcyBzZWdtZW50IGluY2x1ZGVzIHRoZSBmaWxlIGhlYWRlci4gICovCi0gIHVuc2lnbmVkIGludCBpbmNsdWRlc19maWxlaGRyIDogMTsKLSAgLyogV2hldGhlciB0aGlzIHNlZ21lbnQgaW5jbHVkZXMgdGhlIHByb2dyYW0gaGVhZGVycy4gICovCi0gIHVuc2lnbmVkIGludCBpbmNsdWRlc19waGRycyA6IDE7Ci0gIC8qIE51bWJlciBvZiBzZWN0aW9ucyAobWF5IGJlIDApLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvdW50OwotICAvKiBTZWN0aW9ucy4gIEFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgaXMgaW4gY291bnQgZmllbGQuICAqLwotICBhc2VjdGlvbiAqc2VjdGlvbnNbMV07Ci19OwotCi0jZW5kaWYgLyogX0VMRl9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9tMzJyLmggYi9pbmNsdWRlL2VsZi9tMzJyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MzdkMTMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvbTMyci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogTTMyUiBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9NMzJSX0gKLSNkZWZpbmUgX0VMRl9NMzJSX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX20zMnJfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfMTYsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSXzMyLCAyKQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl8yNCwgMykKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfMTBfUENSRUwsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSXzE4X1BDUkVMLCA1KQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl8yNl9QQ1JFTCwgNikKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfSEkxNl9VTE8sIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSX0hJMTZfU0xPLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9MTzE2LCA5KQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9TREExNiwgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSX0dOVV9WVElOSEVSSVQsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9HTlVfVlRFTlRSWSwgMTIpCi0gIEVNUFRZX1JFTE9DICAoUl9NMzJSX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGluZGljZXMuICBUaGVzZSBzZWN0aW9ucyBkbyBub3QgYWN0dWFsbHkKLSAgIGV4aXN0LiAgU3ltYm9scyB3aXRoIGEgc3Rfc2huZHggZmllbGQgY29ycmVzcG9uZGluZyB0byBvbmUgb2YgdGhlc2UKLSAgIHZhbHVlcyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nLiAgKi8KLQotLyogU21hbGwgY29tbW9uIHN5bWJvbC4gICovCi0jZGVmaW5lIFNITl9NMzJSX1NDT01NT04JMHhmZjAwCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGZsYWdzLiAgKi8KLQotLyogVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHN1ZmZpY2llbnQgcmVsb2NzIHRvIGJlIHJlbGF4ZWQuCi0gICBXaGVuIHJlbGF4aW5nLCBldmVuIHJlbG9jcyBvZiBicmFuY2ggaW5zdHJ1Y3Rpb25zIHRoZSBhc3NlbWJsZXIgY291bGQKLSAgIGNvbXBsZXRlIG11c3QgYmUgcHJlc2VudCBiZWNhdXNlIHJlbGF4aW5nIG1heSBjYXVzZSB0aGUgYnJhbmNoIHRhcmdldCB0bwotICAgbW92ZS4gICovCi0jZGVmaW5lIFNIRl9NMzJSX0NBTl9SRUxBWAkweDEwMDAwMDAwCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIFR3byBiaXQgbTMyciBhcmNoaXRlY3R1cmUgZmllbGQuICAqLwotI2RlZmluZSBFRl9NMzJSX0FSQ0gJCTB4MzAwMDAwMDAKLQotLyogbTMyciBjb2RlLiAgKi8KLSNkZWZpbmUgRV9NMzJSX0FSQ0gJCTB4MDAwMDAwMDAKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9tNjhrLmggYi9pbmNsdWRlL2VsZi9tNjhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NzJlMGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvbTY4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyogTUM2OGsgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfTTY4S19ICi0jZGVmaW5lIF9FTEZfTTY4S19ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb24gdHlwZXMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX202OGtfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSXzY4S19OT05FLCAwKQkJLyogTm8gcmVsb2MgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S18zMiwgMSkJCS8qIERpcmVjdCAzMiBiaXQgICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfMTYsIDIpCQkvKiBEaXJlY3QgMTYgYml0ICAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLXzgsIDMpCQkvKiBEaXJlY3QgOCBiaXQgICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUEMzMiwgNCkJCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BDMTYsIDUpCQkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QQzgsIDYpCQkvKiBQQyByZWxhdGl2ZSA4IGJpdCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dPVDMyLCA3KQkJLyogMzIgYml0IFBDIHJlbGF0aXZlIEdPVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dPVDE2LCA4KQkJLyogMTYgYml0IFBDIHJlbGF0aXZlIEdPVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dPVDgsIDkpCQkvKiA4IGJpdCBQQyByZWxhdGl2ZSBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1QzMk8sIDEwKQkvKiAzMiBiaXQgR09UIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dPVDE2TywgMTEpCS8qIDE2IGJpdCBHT1Qgb2Zmc2V0ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfR09UOE8sIDEyKQkvKiA4IGJpdCBHT1Qgb2Zmc2V0ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUExUMzIsIDEzKQkvKiAzMiBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QTFQxNiwgMTQpCS8qIDE2IGJpdCBQQyByZWxhdGl2ZSBQTFQgYWRkcmVzcyAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BMVDgsIDE1KQkJLyogOCBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QTFQzMk8sIDE2KQkvKiAzMiBiaXQgUExUIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BMVDE2TywgMTcpCS8qIDE2IGJpdCBQTFQgb2Zmc2V0ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUExUOE8sIDE4KQkvKiA4IGJpdCBQTFQgb2Zmc2V0ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfQ09QWSwgMTkpCQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfR0xPQl9EQVQsIDIwKQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfSk1QX1NMT1QsIDIxKQkvKiBDcmVhdGUgUExUIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUkVMQVRJVkUsIDIyKQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0gIC8qIFRoZXNlIGFyZSBHTlUgZXh0ZW5zaW9ucyB0byBlbmFibGUgQysrIHZ0YWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dOVV9WVElOSEVSSVQsIDIzKQotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dOVV9WVEVOVFJZLCAyNCkKLSAgRU1QVFlfUkVMT0MgIChSXzY4S19tYXgpICAgCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYKLQotI2RlZmluZSBFRl9DUFUzMiAgICAweDAwODEwMDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9tY29yZS5oIGIvaW5jbHVkZS9lbGYvbWNvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4YTkzYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9tY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyogTW90b3JvbGxhIE1Db3JlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIE1Db3JlIEVMRiBBQkkuICovCi0jaWZuZGVmIF9FTEZfTU9SRV9ICi0jZGVmaW5lIF9FTEZfTU9SRV9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9tY29yZV9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX0FERFIzMiwgMSkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX1BDUkVMSU1NOEJZNCwgMikKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX1BDUkVMSU1NMTFCWTIsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9QQ1JFTElNTTRCWTIsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9QQ1JFTDMyLCA1KQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTIsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9HTlVfVlRJTkhFUklULCA3KQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfR05VX1ZURU5UUlksIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9SRUxBVElWRSwgOSkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX0NPUFksIDEwKQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfR0xPQl9EQVQsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfSlVNUF9TTE9ULCAxMikKLSAgRU1QVFlfUkVMT0MgIChSX01DT1JFX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLS8qIFNlY3Rpb24gQXR0cmlidXRlcy4gICovCi0jZGVmaW5lIFNIRl9NQ09SRV9OT1JFQUQJMHg4MDAwMDAwMAotCi0jZW5kaWYgLyogX0VMRl9NQ09SRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9taXBzLmggYi9pbmNsdWRlL2VsZi9taXBzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NjcyNDguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvbWlwcy5oCisrKyAvZGV2L251bGwKQEAgLTEsODYwICswLDAgQEAKLS8qIE1JUFMgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIDxpYW5AY3lnbnVzLmNvbT4sIGZyb20KLSAgIGluZm9ybWF0aW9uIGluIHRoZSBTeXN0ZW0gViBBcHBsaWNhdGlvbiBCaW5hcnkgSW50ZXJmYWNlLCBNSVBTCi0gICBQcm9jZXNzb3IgU3VwcGxlbWVudC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIE1JUFMgRUxGIEFCSS4gIE5vdGUKLSAgIHRoYXQgbW9zdCBvZiB0aGlzIGlzIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCBieSBCRkQuICAqLwotCi0jaWZuZGVmIF9FTEZfTUlQU19ICi0jZGVmaW5lIF9FTEZfTUlQU19ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb24gdHlwZXMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX21pcHNfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfMTYsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTXzMyLCAyKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19SRUwzMiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfMjYsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0hJMTYsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0xPMTYsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dQUkVMMTYsIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0xJVEVSQUwsIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dPVDE2LCA5KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19QQzE2LCAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfQ0FMTDE2LCAxMSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR1BSRUwzMiwgMTIpCi0gIC8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBkZWZpbmVkIG9uIElyaXgsIGFsdGhvdWdoIHRoZXkgYXJlIG5vdAotICAgICBpbiB0aGUgTUlQUyBFTEYgQUJJLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfVU5VU0VEMSwgMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1VOVVNFRDIsIDE0KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19VTlVTRUQzLCAxNSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfU0hJRlQ1LCAxNikKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfU0hJRlQ2LCAxNykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfNjQsIDE4KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HT1RfRElTUCwgMTkpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dPVF9QQUdFLCAyMCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR09UX09GU1QsIDIxKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HT1RfSEkxNiwgMjIpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dPVF9MTzE2LCAyMykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfU1VCLCAyNCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfSU5TRVJUX0EsIDI1KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19JTlNFUlRfQiwgMjYpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0RFTEVURSwgMjcpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0hJR0hFUiwgMjgpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0hJR0hFU1QsIDI5KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19DQUxMX0hJMTYsIDMwKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19DQUxMX0xPMTYsIDMxKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19TQ05fRElTUCwgMzIpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1JFTDE2LCAzMykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfQUREX0lNTUVESUFURSwgMzQpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1BKVU1QLCAzNSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfUkVMR09ULCAzNikKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfSkFMUiwgMzcpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX21heCwgMzgpCi0gIC8qIFRoZXNlIHJlbG9jcyBhcmUgdXNlZCBmb3IgdGhlIG1pcHMxNi4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTMTZfMjYsIDEwMCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFMxNl9HUFJFTCwgMTAxKQotICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gZW5hYmxlIEMrKyB2dGFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR05VX1ZUSU5IRVJJVCwgMjUzKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HTlVfVlRFTlRSWSwgMjU0KQotRU5EX1JFTE9DX05VTUJFUlMKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLQotLyogQXQgbGVhc3Qgb25lIC5ub3Jlb3JkZXIgZGlyZWN0aXZlIGFwcGVhcnMgaW4gdGhlIHNvdXJjZS4gICovCi0jZGVmaW5lIEVGX01JUFNfTk9SRU9SREVSCTB4MDAwMDAwMDEKLQotLyogRmlsZSBjb250YWlucyBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19QSUMJCTB4MDAwMDAwMDIKLQotLyogQ29kZSBpbiBmaWxlIHVzZXMgdGhlIHN0YW5kYXJkIGNhbGxpbmcgc2VxdWVuY2UgZm9yIGNhbGxpbmcKLSAgIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUuICAqLwotI2RlZmluZSBFRl9NSVBTX0NQSUMJCTB4MDAwMDAwMDQKLQotLyogQ29kZSBpbiBmaWxlIHVzZXMgbmV3IEFCSSAoLW4zMiBvbiBJcml4IDYpLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19BQkkyCQkweDAwMDAwMDIwCi0KLS8qIEluZGljYXRlcyBjb2RlIGNvbXBpbGVkIGZvciBhIDY0LWJpdCBtYWNoaW5lIGluIDMyLWJpdCBtb2RlLiAKLSAgIChyZWdzIGFyZSAzMi1iaXRzIHdpZGUuKSAqLwotI2RlZmluZSBFRl9NSVBTXzMyQklUTU9ERSAgICAgICAweDAwMDAwMTAwCi0KLS8qIEZvdXIgYml0IE1JUFMgYXJjaGl0ZWN0dXJlIGZpZWxkLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19BUkNICQkweGYwMDAwMDAwCi0KLS8qIC1taXBzMSBjb2RlLiAgKi8KLSNkZWZpbmUgRV9NSVBTX0FSQ0hfMQkJMHgwMDAwMDAwMAotCi0vKiAtbWlwczIgY29kZS4gICovCi0jZGVmaW5lIEVfTUlQU19BUkNIXzIJCTB4MTAwMDAwMDAKLQotLyogLW1pcHMzIGNvZGUuICAqLwotI2RlZmluZSBFX01JUFNfQVJDSF8zCQkweDIwMDAwMDAwCi0KLS8qIC1taXBzNCBjb2RlLiAgKi8KLSNkZWZpbmUgRV9NSVBTX0FSQ0hfNAkJMHgzMDAwMDAwMAotCi0vKiBUaGUgQUJJIG9mIHRoZSBmaWxlLiAgQWxzbyBzZWUgRUZfTUlQU19BQkkyIGFib3ZlLiAqLwotI2RlZmluZSBFRl9NSVBTX0FCSQkJMHgwMDAwRjAwMAotCi0vKiBUaGUgb3JpZ2luYWwgbzMyIGFiaS4gKi8KLSNkZWZpbmUgRV9NSVBTX0FCSV9PMzIgICAgICAgICAgMHgwMDAwMTAwMAotCi0vKiBPMzIgZXh0ZW5kZWQgdG8gd29yayBvbiA2NCBiaXQgYXJjaGl0ZWN0dXJlcyAqLwotI2RlZmluZSBFX01JUFNfQUJJX082NCAgICAgICAgICAweDAwMDAyMDAwCi0KLS8qIEVBQkkgaW4gMzIgYml0IG1vZGUgKi8KLSNkZWZpbmUgRV9NSVBTX0FCSV9FQUJJMzIgICAgICAgMHgwMDAwMzAwMAotCi0vKiBFQUJJIGluIDY0IGJpdCBtb2RlICovCi0jZGVmaW5lIEVfTUlQU19BQklfRUFCSTY0ICAgICAgIDB4MDAwMDQwMDAKLQotCi0vKiBNYWNoaW5lIHZhcmlhbnQgaWYgd2Uga25vdyBpdC4gIFRoaXMgZmllbGQgd2FzIGludmVudGVkIGF0IEN5Z251cywKLSAgIGJ1dCBpdCBpcyBob3BlZCB0aGF0IG90aGVyIHZlbmRvcnMgd2lsbCBhZG9wdCBpdC4gIElmIHNvbWUgc3RhbmRhcmQKLSAgIGlzIGRldmVsb3BlZCwgdGhpcyBjb2RlIHNob3VsZCBiZSBjaGFuZ2VkIHRvIGZvbGxvdyBpdC4gKi8KLQotI2RlZmluZSBFRl9NSVBTX01BQ0gJCTB4MDBGRjAwMDAKLQotLyogQ3lnbnVzIGlzIGNob29zaW5nIHZhbHVlcyBiZXR3ZWVuIDgwIGFuZCA5RjsKLSAgIDAwIC0gN0Ygc2hvdWxkIGJlIGxlZnQgZm9yIGEgZnV0dXJlIHN0YW5kYXJkOwotICAgdGhlIHJlc3QgYXJlIG9wZW4uICovCi0KLSNkZWZpbmUgRV9NSVBTX01BQ0hfMzkwMAkweDAwODEwMDAwCi0KLSNkZWZpbmUgRV9NSVBTX01BQ0hfNDAxMAkweDAwODIwMDAwCi0jZGVmaW5lIEVfTUlQU19NQUNIXzQxMDAJMHgwMDgzMDAwMAotI2RlZmluZSBFX01JUFNfTUFDSF80NjUwCTB4MDA4NTAwMDAKLSNkZWZpbmUgRV9NSVBTX01BQ0hfNDExMQkweDAwODgwMDAwCi0KLQwKLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGluZGljZXMuICBUaGVzZSBzZWN0aW9ucyBkbyBub3QgYWN0dWFsbHkKLSAgIGV4aXN0LiAgU3ltYm9scyB3aXRoIGEgc3Rfc2huZHggZmllbGQgY29ycmVzcG9uZGluZyB0byBvbmUgb2YgdGhlc2UKLSAgIHZhbHVlcyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nLiAgKi8KLQotLyogRGVmaW5lZCBhbmQgYWxsb2NhdGVkIGNvbW1vbiBzeW1ib2wuICBWYWx1ZSBpcyB2aXJ0dWFsIGFkZHJlc3MuICBJZgotICAgcmVsb2NhdGVkLCBhbGlnbm1lbnQgbXVzdCBiZSBwcmVzZXJ2ZWQuICAqLwotI2RlZmluZSBTSE5fTUlQU19BQ09NTU9OCTB4ZmYwMAotCi0vKiBEZWZpbmVkIGFuZCBhbGxvY2F0ZWQgdGV4dCBzeW1ib2wuICBWYWx1ZSBpcyB2aXJ0dWFsIGFkZHJlc3MuCi0gICBPY2N1ciBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgb2YgQWxwaGEgT1NGLzEgYW5kIElyaXggNSBleGVjdXRhYmxlcy4gICovCi0jZGVmaW5lIFNITl9NSVBTX1RFWFQJCTB4ZmYwMQotCi0vKiBEZWZpbmVkIGFuZCBhbGxvY2F0ZWQgZGF0YSBzeW1ib2wuICBWYWx1ZSBpcyB2aXJ0dWFsIGFkZHJlc3MuCi0gICBPY2N1ciBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgb2YgQWxwaGEgT1NGLzEgYW5kIElyaXggNSBleGVjdXRhYmxlcy4gICovCi0jZGVmaW5lIFNITl9NSVBTX0RBVEEJCTB4ZmYwMgotCi0vKiBTbWFsbCBjb21tb24gc3ltYm9sLiAgKi8KLSNkZWZpbmUgU0hOX01JUFNfU0NPTU1PTgkweGZmMDMKLQotLyogU21hbGwgdW5kZWZpbmVkIHN5bWJvbC4gICovCi0jZGVmaW5lIFNITl9NSVBTX1NVTkRFRklORUQJMHhmZjA0Ci0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4gICovCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgdGhlIHNldCBvZiBkeW5hbWljIHNoYXJlZCBvYmplY3RzIHVzZWQgd2hlbgotICAgc3RhdGljYWxseSBsaW5raW5nLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfTElCTElTVAkweDcwMDAwMDAwCi0KLS8qIEknbSBub3Qgc3VyZSB3aGF0IHRoaXMgaXMsIGJ1dCBpdCdzIHVzZWQgb24gSXJpeCA1LiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfTVNZTQkJMHg3MDAwMDAwMQotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIGxpc3Qgb2Ygc3ltYm9scyB3aG9zZSBkZWZpbml0aW9ucyBjb25mbGljdCB3aXRoCi0gICBzeW1ib2xzIGRlZmluZWQgaW4gc2hhcmVkIG9iamVjdHMuICAqLwotI2RlZmluZSBTSFRfTUlQU19DT05GTElDVAkweDcwMDAwMDAyCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgdGhlIGdsb2JhbCBwb2ludGVyIHRhYmxlLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfR1BUQUIJCTB4NzAwMDAwMDMKLQotLyogU2VjdGlvbiBjb250YWlucyBtaWNyb2NvZGUgaW5mb3JtYXRpb24uICBUaGUgZXhhY3QgZm9ybWF0IGlzCi0gICB1bnNwZWNpZmllZC4gICovCi0jZGVmaW5lIFNIVF9NSVBTX1VDT0RFCQkweDcwMDAwMDA0Ci0KLS8qIFNlY3Rpb24gY29udGFpbnMgc29tZSBzb3J0IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoZSBleGFjdAotICAgZm9ybWF0IGlzIHVuc3BlY2lmaWVkLiAgSXQncyBwcm9iYWJseSBFQ09GRiBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfREVCVUcJCTB4NzAwMDAwMDUKLQotLyogU2VjdGlvbiBjb250YWlucyByZWdpc3RlciB1c2FnZSBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIFNIVF9NSVBTX1JFR0lORk8JMHg3MDAwMDAwNgotCi0vKiA/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/Pz8gKi8KLSNkZWZpbmUgRFRfTUlQU19EWU5TVFJfQUxJR04JMHg3MDAwMDAyYgotCi0vKiBTaXplIG9mIHRoZSAuaW50ZXJmYWNlIHNlY3Rpb24uICAqLwotI2RlZmluZSBEVF9NSVBTX0lOVEVSRkFDRV9TSVpFCTB4NzAwMDAwMmMKLQotLyogU2l6ZSBvZiBybGRfdGV4dF9yZXNvbHZlIGZ1bmN0aW9uIHN0b3JlZCBpbiB0aGUgR09ULiAgKi8KLSNkZWZpbmUgRFRfTUlQU19STERfVEVYVF9SRVNPTFZFX0FERFIJMHg3MDAwMDAyZAotCi0vKiBEZWZhdWx0IHN1ZmZpeCBvZiBEU08gdG8gYmUgYWRkZWQgYnkgcmxkIG9uIGRsb3BlbigpIGNhbGxzLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19QRVJGX1NVRkZJWAkweDcwMDAwMDJlCi0KLS8qIFNpemUgb2YgY29tcGFjdCByZWxvY2F0aW9uIHNlY3Rpb24gKE8zMikuICAqLwotI2RlZmluZSBEVF9NSVBTX0NPTVBBQ1RfU0laRQkweDcwMDAwMDJmCi0KLS8qIEdQIHZhbHVlIGZvciBhdXhpbGlhcnkgR09Ucy4gICovCi0jZGVmaW5lIERUX01JUFNfR1BfVkFMVUUJMHg3MDAwMDAzMAotCi0vKiBBZGRyZXNzIG9mIGF1eGlsaWFyeSAuZHluYW1pYy4gICovCi0jZGVmaW5lIERUX01JUFNfQVVYX0RZTkFNSUMJMHg3MDAwMDAzMQotDAotLyogRmxhZ3Mgd2hpY2ggbWF5IGFwcGVhciBpbiBhIERUX01JUFNfRkxBR1MgZW50cnkuICAqLwotCi0vKiBObyBmbGFncy4gICovCi0jZGVmaW5lIFJIRl9OT05FCQkweDAwMDAwMDAwCi0KLS8qIFVzZXMgc2hvcnRjdXQgcG9pbnRlcnMuICAqLwotI2RlZmluZSBSSEZfUVVJQ0tTVEFSVAkJMHgwMDAwMDAwMQotCi0vKiBIYXNoIHNpemUgaXMgbm90IGEgcG93ZXIgb2YgdHdvLiAgKi8KLSNkZWZpbmUgUkhGX05PVFBPVAkJMHgwMDAwMDAwMgotCi0vKiBJZ25vcmUgTERfTElCUkFSWV9QQVRILiAgKi8KLSNkZWZpbmUgUkhTX05PX0xJQlJBUllfUkVQTEFDRU1FTlQgXAotCQkJCTB4MDAwMDAwMDQKLQotI2RlZmluZSBSSEZfTk9fTU9WRQkJICAgMHgwMDAwMDAwOAotI2RlZmluZSBSSEZfU0dJX09OTFkJCSAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgUkhGX0dVQVJBTlRFRV9JTklUCSAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgUkhGX0RFTFRBX0NfUExVU19QTFVTCSAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgUkhGX0dVQVJBTlRFRV9TVEFSVF9JTklUICAgMHgwMDAwMDA4MAotI2RlZmluZSBSSEZfUElYSUUJCSAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgUkhGX0RFRkFVTFRfREVMQVlfTE9BRAkgICAweDAwMDAwMjAwCi0jZGVmaW5lIFJIRl9SRVFVSUNLU1RBUlQJICAgMHgwMDAwMDQwMAotI2RlZmluZSBSSEZfUkVRVUlDS1NUQVJURUQJICAgMHgwMDAwMDgwMAotI2RlZmluZSBSSEZfQ09SRAkJICAgMHgwMDAwMTAwMAotI2RlZmluZSBSSEZfTk9fVU5SRVNfVU5ERUYJICAgMHgwMDAwMjAwMAotI2RlZmluZSBSSEZfUkxEX09SREVSX1NBRkUJICAgMHgwMDAwNDAwMAotDAotLyogU3BlY2lhbCB2YWx1ZXMgZm9yIHRoZSBzdF9vdGhlciBmaWVsZCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgVGhlc2UKLSAgIGFyZSB1c2VkIGluIGFuIElyaXggNSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gICovCi0KLSNkZWZpbmUgU1RPX0RFRkFVTFQJCTB4MDAKLSNkZWZpbmUgU1RPX0lOVEVSTkFMCQkweDAxCi0jZGVmaW5lIFNUT19ISURERU4JCTB4MDIKLSNkZWZpbmUgU1RPX1BST1RFQ1RFRAkJMHgwMwotCi0vKiBUaGlzIHZhbHVlIGlzIHVzZWQgZm9yIGEgbWlwczE2IC50ZXh0IHN5bWJvbC4gICovCi0jZGVmaW5lIFNUT19NSVBTMTYJCTB4ZjAKLQwKLS8qIFRoZSA2NC1iaXQgTUlQUyBFTEYgQUJJIHVzZXMgYW4gdW51c3VhbCByZWxvYyBmb3JtYXQuICBFYWNoCi0gICByZWxvY2F0aW9uIGVudHJ5IHNwZWNpZmllcyB1cCB0byB0aHJlZSBhY3R1YWwgcmVsb2NhdGlvbnMsIGFsbCBhdAotICAgdGhlIHNhbWUgYWRkcmVzcy4gIFRoZSBmaXJzdCByZWxvY2F0aW9uIHdoaWNoIHJlcXVpcmVkIGEgc3ltYm9sCi0gICB1c2VzIHRoZSBzeW1ib2wgaW4gdGhlIHJfc3ltIGZpZWxkLiAgVGhlIHNlY29uZCByZWxvY2F0aW9uIHdoaWNoCi0gICByZXF1aXJlcyBhIHN5bWJvbCB1c2VzIHRoZSBzeW1ib2wgaW4gdGhlIHJfc3N5bSBmaWVsZC4gIElmIGFsbAotICAgdGhyZWUgcmVsb2NhdGlvbnMgcmVxdWlyZSBhIHN5bWJvbCwgdGhlIHRoaXJkIG9uZSB1c2VzIGEgemVybwotICAgdmFsdWUuICAqLwotCi0vKiBBbiBlbnRyeSBpbiBhIDY0IGJpdCBTSFRfUkVMIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBBZGRyZXNzIG9mIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfb2Zmc2V0WzhdOwotICAvKiBTeW1ib2wgaW5kZXguICAqLwotICB1bnNpZ25lZCBjaGFyIHJfc3ltWzRdOwotICAvKiBTcGVjaWFsIHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9zc3ltWzFdOwotICAvKiBUaGlyZCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGUzWzFdOwotICAvKiBTZWNvbmQgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlMlsxXTsKLSAgLyogRmlyc3QgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlWzFdOwotfSBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogQWRkcmVzcyBvZiByZWxvY2F0aW9uLiAgKi8KLSAgYmZkX3ZtYSByX29mZnNldDsKLSAgLyogU3ltYm9sIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgbG9uZyByX3N5bTsKLSAgLyogU3BlY2lhbCBzeW1ib2wuICAqLwotICB1bnNpZ25lZCBjaGFyIHJfc3N5bTsKLSAgLyogVGhpcmQgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlMzsKLSAgLyogU2Vjb25kIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTI7Ci0gIC8qIEZpcnN0IHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTsKLX0gRWxmNjRfTWlwc19JbnRlcm5hbF9SZWw7Ci0KLS8qIEFuIGVudHJ5IGluIGEgNjQgYml0IFNIVF9SRUxBIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBBZGRyZXNzIG9mIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfb2Zmc2V0WzhdOwotICAvKiBTeW1ib2wgaW5kZXguICAqLwotICB1bnNpZ25lZCBjaGFyIHJfc3ltWzRdOwotICAvKiBTcGVjaWFsIHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9zc3ltWzFdOwotICAvKiBUaGlyZCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGUzWzFdOwotICAvKiBTZWNvbmQgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlMlsxXTsKLSAgLyogRmlyc3QgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlWzFdOwotICAvKiBBZGRlbmQuICAqLwotICB1bnNpZ25lZCBjaGFyIHJfYWRkZW5kWzhdOwotfSBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGE7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEFkZHJlc3Mgb2YgcmVsb2NhdGlvbi4gICovCi0gIGJmZF92bWEgcl9vZmZzZXQ7Ci0gIC8qIFN5bWJvbCBpbmRleC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcl9zeW07Ci0gIC8qIFNwZWNpYWwgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3NzeW07Ci0gIC8qIFRoaXJkIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTM7Ci0gIC8qIFNlY29uZCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGUyOwotICAvKiBGaXJzdCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGU7Ci0gIC8qIEFkZGVuZC4gICovCi0gIGJmZF9zaWduZWRfdm1hIHJfYWRkZW5kOwotfSBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGE7Ci0KLS8qIFZhbHVlcyBmb3VuZCBpbiB0aGUgcl9zc3ltIGZpZWxkIG9mIGEgcmVsb2NhdGlvbiBlbnRyeS4gICovCi0KLS8qIE5vIHJlbG9jYXRpb24uICAqLwotI2RlZmluZSBSU1NfVU5ERUYJMAotCi0vKiBWYWx1ZSBvZiBHUC4gICovCi0jZGVmaW5lIFJTU19HUAkJMQotCi0vKiBWYWx1ZSBvZiBHUCBpbiBvYmplY3QgYmVpbmcgcmVsb2NhdGVkLiAgKi8KLSNkZWZpbmUgUlNTX0dQMAkJMgotCi0vKiBBZGRyZXNzIG9mIGxvY2F0aW9uIGJlaW5nIHJlbG9jYXRlZC4gICovCi0jZGVmaW5lIFJTU19MT0MJCTMKLQwKLS8qIEEgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uIGNvbnRhaW5zIGEgc2VyaWVzIG9mIG9wdGlvbnMsIGVhY2ggb2YKLSAgIHdoaWNoIHN0YXJ0cyB3aXRoIHRoaXMgaGVhZGVyLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogVHlwZSBvZiBvcHRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIGtpbmRbMV07Ci0gIC8qIFNpemUgb2Ygb3B0aW9uIGRlc2NyaXB0b3IsIGluY2x1ZGluZyBoZWFkZXIuICAqLwotICB1bnNpZ25lZCBjaGFyIHNpemVbMV07Ci0gIC8qIFNlY3Rpb24gaW5kZXggb2YgYWZmZWN0ZWQgc2VjdGlvbiwgb3IgMCBmb3IgZ2xvYmFsIG9wdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgc2VjdGlvblsyXTsKLSAgLyogSW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhpcyBraW5kIG9mIG9wdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgaW5mb1s0XTsKLX0gRWxmX0V4dGVybmFsX09wdGlvbnM7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFR5cGUgb2Ygb3B0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciBraW5kOwotICAvKiBTaXplIG9mIG9wdGlvbiBkZXNjcmlwdG9yLCBpbmNsdWRpbmcgaGVhZGVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzaXplOwotICAvKiBTZWN0aW9uIGluZGV4IG9mIGFmZmVjdGVkIHNlY3Rpb24sIG9yIDAgZm9yIGdsb2JhbCBvcHRpb24uICAqLwotICB1bnNpZ25lZCBzaG9ydCBzZWN0aW9uOwotICAvKiBJbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGlzIGtpbmQgb2Ygb3B0aW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBpbmZvOwotfSBFbGZfSW50ZXJuYWxfT3B0aW9uczsKLQotLyogTUlQUyBFTEYgb3B0aW9uIGhlYWRlciBzd2FwcGluZyByb3V0aW5lcy4gICovCi1leHRlcm4gdm9pZCBiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqLCBFbGZfSW50ZXJuYWxfT3B0aW9ucyAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX09wdGlvbnMgKiwgRWxmX0V4dGVybmFsX09wdGlvbnMgKikpOwotCi0vKiBWYWx1ZXMgd2hpY2ggbWF5IGFwcGVhciBpbiB0aGUga2luZCBmaWVsZCBvZiBhbiBFbGZfT3B0aW9ucwotICAgc3RydWN0dXJlLiAgKi8KLQotLyogVW5kZWZpbmVkLiAgKi8KLSNkZWZpbmUgT0RLX05VTEwJMAotCi0vKiBSZWdpc3RlciB1c2FnZSBhbmQgR1AgdmFsdWUuICAqLwotI2RlZmluZSBPREtfUkVHSU5GTwkxCi0KLS8qIEV4Y2VwdGlvbiBwcm9jZXNzaW5nIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgT0RLX0VYQ0VQVElPTlMJMgotCi0vKiBTZWN0aW9uIHBhZGRpbmcgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBPREtfUEFECQkzCi0KLS8qIEhhcmR3YXJlIHdvcmthcm91bmRzIHBlcmZvcm1lZC4gICovCi0jZGVmaW5lIE9ES19IV1BBVENICTQKLQotLyogRmlsbCB2YWx1ZSB1c2VkIGJ5IHRoZSBsaW5rZXIuICAqLwotI2RlZmluZSBPREtfRklMTAk1Ci0KLS8qIFJlc2VydmVkIHNwYWNlIGZvciBkZXNrdG9wIHRvb2xzLiAgKi8KLSNkZWZpbmUgT0RLX1RBR1MJNgotCi0vKiBIYXJkd2FyZSB3b3JrYXJvdW5kcywgQU5EIGJpdHMgd2hlbiBtZXJnaW5nLiAgKi8KLSNkZWZpbmUgT0RLX0hXQU5ECTcKLQotLyogSGFyZHdhcmUgd29ya2Fyb3VuZHMsIE9SIGJpdHMgd2hlbiBtZXJnaW5nLiAgKi8KLSNkZWZpbmUgT0RLX0hXT1IJOAotCi0vKiBHUCBncm91cCB0byB1c2UgZm9yIHRleHQvZGF0YSBzZWN0aW9ucy4gICovCi0jZGVmaW5lIE9ES19HUF9HUk9VUAk5Ci0KLS8qIElEIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgT0RLX0lERU5UCTEwCi0KLS8qIEluIHRoZSAzMiBiaXQgQUJJLCBhbiBPREtfUkVHSU5GTyBvcHRpb24gaXMganVzdCBhIEVsZjMyX1JlZ0luZm8KLSAgIHN0cnVjdHVyZS4gIEluIHRoZSA2NCBiaXQgQUJJLCBpdCBpcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZS4gIFRoZQotICAgaW5mbyBmaWVsZCBvZiB0aGUgb3B0aW9ucyBoZWFkZXIgaXMgbm90IHVzZWQuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBNYXNrIG9mIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcmlfZ3BybWFza1s0XTsKLSAgLyogUGFkZGluZy4gICovCi0gIHVuc2lnbmVkIGNoYXIgcmlfcGFkWzRdOwotICAvKiBNYXNrIG9mIGNvLXByb2Nlc3NvciByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcmlfY3BybWFza1s0XVs0XTsKLSAgLyogR1AgcmVnaXN0ZXIgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICB1bnNpZ25lZCBjaGFyIHJpX2dwX3ZhbHVlWzhdOwotfSBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvOwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBNYXNrIG9mIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmlfZ3BybWFzazsKLSAgLyogUGFkZGluZy4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmlfcGFkOwotICAvKiBNYXNrIG9mIGNvLXByb2Nlc3NvciByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmlfY3BybWFza1s0XTsKLSAgLyogR1AgcmVnaXN0ZXIgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICBiZmRfdm1hIHJpX2dwX3ZhbHVlOwotfSBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvOwotCi0vKiBNSVBTIEVMRiByZWdpbmZvIHN3YXBwaW5nIHJvdXRpbmVzLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqLCBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvICopKTsKLWV4dGVybiB2b2lkIGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X0ludGVybmFsX1JlZ0luZm8gKiwgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqKSk7Ci0KLS8qIE1hc2tzIGZvciB0aGUgaW5mbyB3b3JrIG9mIGFuIE9ES19FWENFUFRJT05TIGRlc2NyaXB0b3IuICAqLwotI2RlZmluZSBPRVhfRlBVX01JTgkweDFmCS8qIEZQRXMgd2hpY2ggbXVzdCBiZSBlbmFibGVkLiAgKi8KLSNkZWZpbmUgT0VYX0ZQVV9NQVgJMHgxZjAwCS8qIEZQRXMgd2hpY2ggbWF5IGJlIGVuYWJsZWQuICAqLwotI2RlZmluZSBPRVhfUEFHRTAJMHgxMDAwMAkvKiBQYWdlIHplcm8gbXVzdCBiZSBtYXBwZWQuICAqLwotI2RlZmluZSBPRVhfU01NCQkweDIwMDAwCS8qIEZvcmNlIHNlcXVlbnRpYWwgbWVtb3J5IG1vZGUuICAqLwotI2RlZmluZSBPRVhfRlBEQlVHCTB4NDAwMDAJLyogRm9yY2UgZmxvYXRpbmctcG9pbnQgZGVidWcgbW9kZS4gICovCi0jZGVmaW5lIE9FWF9ESVNNSVNTCTB4ODAwMDAJLyogRGlzbWlzcyBpbnZhbGlkIGFkZHJlc3MgZmF1bHRzLiAgKi8KLQotLyogTWFza3Mgb2YgdGhlIEZQIGV4Y2VwdGlvbnMgZm9yIE9FWF9GUFVfTUlOIGFuZCBPRVhfRlBVX01BWC4gICovCi0jZGVmaW5lIE9FWF9GUFVfSU5WQUwJMHgxMAkvKiBJbnZhbGlkIG9wZXJhdGlvbiBleGNlcHRpb24uICAqLwotI2RlZmluZSBPRVhfRlBVX0RJVjAJMHgwOAkvKiBEaXZpc2lvbiBieSB6ZXJvIGV4Y2VwdGlvbi4gICovCi0jZGVmaW5lIE9FWF9GUFVfT0ZMTwkweDA0CS8qIE92ZXJmbG93IGV4Y2VwdGlvbi4gICovCi0jZGVmaW5lIE9FWF9GUFVfVUZMTwkweDAyCS8qIFVuZGVyZmxvdyBleGNlcHRpb24uICAqLwotI2RlZmluZSBPRVhfRlBVX0lORVgJMHgwMQkvKiBJbmV4YWN0IGV4Y2VwdGlvbi4gICovCi0KLS8qIE1hc2tzIGZvciB0aGUgaW5mbyB3b3JkIG9mIGFuIE9ES19QQUQgZGVzY3JpcHRvci4gICovCi0jZGVmaW5lIE9QQURfUFJFRklYCTB4MDEKLSNkZWZpbmUgT1BBRF9QT1NURklYCTB4MDIKLSNkZWZpbmUgT1BBRF9TWU1CT0wJMHgwNAotCi0vKiBNYXNrcyBmb3IgdGhlIGluZm8gd29yZCBvZiBhbiBPREtfSFdQQVRDSCBkZXNjcmlwdG9yLiAgKi8KLSNkZWZpbmUgT0hXX1I0S0VPUAkweDAxCS8qIFI0MDAwIGVuZC1vZi1wYWdlIHBhdGNoLiAgKi8KLSNkZWZpbmUgT0hXX1I4S1BGRVRDSAkweDAyCS8qIE1heSBuZWVkIFI4MDAwIHByZWZldGNoIHBhdGNoLiAgKi8KLSNkZWZpbmUgT0hXX1I1S0VPUAkweDA0CS8qIFI1MDAwIGVuZC1vZi1wYWdlIHBhdGNoLiAgKi8KLSNkZWZpbmUgT0hXX1I1S0NWVEwJMHgwOAkvKiBSNTAwMCBjdnQuW2RzXS5sIGJ1ZyAoY2xlYW4gPT0gMSkuICAqLwotCi0vKiBNYXNrcyBmb3IgdGhlIGluZm8gd29yZCBvZiBhbiBPREtfSURFTlQvT0RLX0dQX0dST1VQIGRlc2NyaXB0b3IuICAqLwotI2RlZmluZSBPR1BfR1JPVVAJMHgwMDAwZmZmZgkvKiBHUCBncm91cCBudW1iZXIuICAqLwotI2RlZmluZSBPR1BfU0VMRgkweGZmZmYwMDAwCS8qIFNlbGYtY29udGFpbmVkIEdQIGdyb3Vwcy4gICovCi0KLS8qIE1hc2tzIGZvciB0aGUgaW5mbyB3b3JkIG9mIGFuIE9ES19IV0FORC9PREtfSFdPUiBkZXNjcmlwdG9yLiAgKi8KLSNkZWZpbmUgT0hXQTBfUjRLRU9QX0NIRUNLRUQJMHgwMDAwMDAwMQotI2RlZmluZSBPSFdBMF9SNEtFT1BfQ0xFQU4JMHgwMDAwMDAwMgotDAotCi0jZW5kaWYgLyogX0VMRl9NSVBTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL21uMTAyMDAuaCBiL2luY2x1ZGUvZWxmL21uMTAyMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyOWUwYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9tbjEwMjAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBNTjEwMjAwIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNTjEwMjAwIEVMRiBBQkkuICovCi0KLSNpZm5kZWYgX0VMRl9NTjEwMjAwX0gKLSNkZWZpbmUgX0VMRl9NTjEwMjAwX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX21uMTAyMDBfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwXzE2LCAyKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF84LCAzKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF8yNCwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfUENSRUw4LCA1KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF9QQ1JFTDE2LCA2KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF9QQ1JFTDI0LCA3KQotRU5EX1JFTE9DX05VTUJFUlMKLQotI2VuZGlmIC8qIF9FTEZfTU4xMDIwMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9tbjEwMzAwLmggYi9pbmNsdWRlL2VsZi9tbjEwMzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YTA3NTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvbW4xMDMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyogTU4xMDMwMCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgTU4xMDMwMCBFTEYgQUJJLiAqLwotCi0jaWZuZGVmIF9FTEZfTU4xMDMwMF9ICi0jZGVmaW5lIF9FTEZfTU4xMDMwMF9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9tbjEwMzAwX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwXzMyLCAxKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF8xNiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfOCwgMykKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfUENSRUwzMiwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfUENSRUwxNiwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfUENSRUw4LCA2KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9HTlVfVlRJTkhFUklULCA3KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9HTlVfVlRFTlRSWSwgOCkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfMjQsIDkpCi0gIEVNUFRZX1JFTE9DICAoUl9NTjEwMzAwX01BWCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLS8qIE1hY2hpbmUgdmFyaWFudCBpZiB3ZSBrbm93IGl0LiAgVGhpcyBmaWVsZCB3YXMgaW52ZW50ZWQgYXQgQ3lnbnVzLAotICAgYnV0IGl0IGlzIGhvcGVkIHRoYXQgb3RoZXIgdmVuZG9ycyB3aWxsIGFkb3B0IGl0LiAgSWYgc29tZSBzdGFuZGFyZAotICAgaXMgZGV2ZWxvcGVkLCB0aGlzIGNvZGUgc2hvdWxkIGJlIGNoYW5nZWQgdG8gZm9sbG93IGl0LiAqLwotCi0jZGVmaW5lIEVGX01OMTAzMDBfTUFDSAkJMHgwMEZGMDAwMAotCi0vKiBDeWdudXMgaXMgY2hvb3NpbmcgdmFsdWVzIGJldHdlZW4gODAgYW5kIDlGOwotICAgMDAgLSA3RiBzaG91bGQgYmUgbGVmdCBmb3IgYSBmdXR1cmUgc3RhbmRhcmQ7Ci0gICB0aGUgcmVzdCBhcmUgb3Blbi4gKi8KLQotI2RlZmluZSBFX01OMTAzMDBfTUFDSF9NTjEwMzAwCTB4MDA4MTAwMDAKLSNlbmRpZiAvKiBfRUxGX01OMTAzMDBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvcHBjLmggYi9pbmNsdWRlL2VsZi9wcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMxMTZkOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9wcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKiBQUEMgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQnkgTWljaGFlbCBNZWlzc25lciwgQ3lnbnVzIFN1cHBvcnQsIDxtZWlzc25lckBjeWdudXMuY29tPiwgZnJvbSBpbmZvcm1hdGlvbgotICAgaW4gdGhlIFN5c3RlbSBWIEFwcGxpY2F0aW9uIEJpbmFyeSBJbnRlcmZhY2UsIFBvd2VyUEMgUHJvY2Vzc29yIFN1cHBsZW1lbnQKLSAgIGFuZCB0aGUgUG93ZXJQQyBFbWJlZGRlZCBBcHBsaWNhdGlvbiBCaW5hcnkgSW50ZXJmYWNlIChlYWJpKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIFBQQyBFTEYgQUJJLiAgTm90ZQotICAgdGhhdCBtb3N0IG9mIHRoaXMgaXMgbm90IGFjdHVhbGx5IGltcGxlbWVudGVkIGJ5IEJGRC4gICovCi0KLSNpZm5kZWYgX0VMRl9QUENfSAotI2RlZmluZSBfRUxGX1BQQ19ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9wcGNfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIzMiwgMSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMjQsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE2LCAzKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNl9MTywgNCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTZfSEksIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE2X0hBLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTRfQlJUQUtFTiwgOCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTRfQlJOVEFLRU4sIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUkVMMjQsIDEwKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1JFTDE0LCAxMSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19SRUwxNF9CUlRBS0VOLCAxMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19SRUwxNF9CUk5UQUtFTiwgMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfR09UMTYsIDE0KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dPVDE2X0xPLCAxNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19HT1QxNl9ISSwgMTYpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfR09UMTZfSEEsIDE3KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1BMVFJFTDI0LCAxOCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19DT1BZLCAxOSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19HTE9CX0RBVCwgMjApCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfSk1QX1NMT1QsIDIxKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1JFTEFUSVZFLCAyMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19MT0NBTDI0UEMsIDIzKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1VBRERSMzIsIDI0KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1VBRERSMTYsIDI1KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1JFTDMyLCAyNikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19QTFQzMiwgMjcpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUExUUkVMMzIsIDI4KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1BMVDE2X0xPLCAyOSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19QTFQxNl9ISSwgMzApCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUExUMTZfSEEsIDMxKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1NEQVJFTDE2LCAzMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19TRUNUT0ZGLCAzMykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19TRUNUT0ZGX0xPLCAzNCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19TRUNUT0ZGX0hJLCAzNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19TRUNUT0ZGX0hBLCAzNikKLQotLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGZyb20gdGhlIEVtYmVkZGVkIEVMRiBBQkksIGFuZCBhcmUgbm90Ci0gICBpbiB0aGUgU1ZSNCBFTEYgQUJJLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfTkFERFIzMiwgMTAxKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9OQUREUjE2LCAxMDIpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX05BRERSMTZfTE8sIDEwMykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfTkFERFIxNl9ISSwgMTA0KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9OQUREUjE2X0hBLCAxMDUpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1NEQUkxNiwgMTA2KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9TREEySTE2LCAxMDcpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1NEQTJSRUwsIDEwOCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfU0RBMjEsIDEwOSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfTVJLUkVGLCAxMTApCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1JFTFNFQzE2LCAxMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1JFTFNUX0xPLCAxMTIpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1JFTFNUX0hJLCAxMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1JFTFNUX0hBLCAxMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX0JJVF9GTEQsIDExNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfUkVMU0RBLCAxMTYpCi0KLSAgLyogVGhlc2UgYXJlIEdOVSBleHRlbnNpb25zIHRvIGVuYWJsZSBDKysgdnRhYmxlIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfR05VX1ZUSU5IRVJJVCwgMjUzKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dOVV9WVEVOVFJZLCAyNTQpCi0KLS8qIFRoaXMgaXMgYSBwaG9ueSByZWxvYyB0byBoYW5kbGUgYW55IG9sZCBmYXNoaW9uZWQgVE9DMTYgcmVmZXJlbmNlcwotICAgdGhhdCBtYXkgc3RpbGwgYmUgaW4gb2JqZWN0IGZpbGVzLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19UT0MxNiwgMjU1KQotCi0gIEVNUFRZX1JFTE9DIChSX1BQQ19tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLSNkZWZpbmUJRUZfUFBDX0VNQgkJMHg4MDAwMDAwMAkvKiBQb3dlclBDIGVtYmVkZGVkIGZsYWcgICovCi0KLQkJCQkJCS8qIENZR05VUyBsb2NhbCBiaXRzIGJlbG93ICovCi0jZGVmaW5lCUVGX1BQQ19SRUxPQ0FUQUJMRQkweDAwMDEwMDAwCS8qIFBvd2VyUEMgLW1yZWxvY2F0YWJsZSBmbGFnICovCi0jZGVmaW5lCUVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIJMHgwMDAwODAwMAkvKiBQb3dlclBDIC1tcmVsb2NhdGFibGUtbGliIGZsYWcgKi8KLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gaGVhZGVycywgc2hfdHlwZSBmaWVsZCAqLwotCi0jZGVmaW5lIFNIVF9PUkRFUkVECQlTSFRfSElQUk9DCS8qIExpbmsgZWRpdG9yIGlzIHRvIHNvcnQgdGhlIFwKLQkJCQkJCSAgIGVudHJpZXMgaW4gdGhpcyBzZWN0aW9uIFwKLQkJCQkJCSAgIGJhc2VkIG9uIHRoZSBhZGRyZXNzIFwKLQkJCQkJCSAgIHNwZWNpZmllZCBpbiB0aGUgYXNzb2NpYXRlZCBcCi0JCQkJCQkgICBzeW1ib2wgdGFibGUgZW50cnkuICAqLwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBmbGFncywgc2hfZmxhZ3MgZmllbGQgKi8KLQotI2RlZmluZSBTSEZfRVhDTFVERQkJMHg4MDAwMDAwMAkvKiBMaW5rIGVkaXRvciBpcyB0byBleGNsdWRlIFwKLQkJCQkJCSAgIHRoaXMgc2VjdGlvbiBmcm9tIGV4ZWN1dGFibGUgXAotCQkJCQkJICAgYW5kIHNoYXJlZCBvYmplY3RzIHRoYXQgaXQgXAotCQkJCQkJICAgYnVpbGRzIHdoZW4gdGhvc2Ugb2JqZWN0cyBcCi0JCQkJCQkgICBhcmUgbm90IHRvIGJlIGZ1cmh0ZXIgXAotCQkJCQkJICAgcmVsb2NhdGVkLiAgKi8KLSNlbmRpZiAvKiBfRUxGX1BQQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9yZWxvYy1tYWNyb3MuaCBiL2luY2x1ZGUvZWxmL3JlbG9jLW1hY3Jvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzYyMjkxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL3JlbG9jLW1hY3Jvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qIEdlbmVyaWMgcmVsb2NhdGlvbiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGJ5IHRoZSB2YXJpb3VzICouaCB0YXJnZXQgc3BlY2lmaWMgaGVhZGVyCi0gICBmaWxlcyB0byBlaXRoZXIgZ2VuZXJhdGUgYW4gZW51bSBjb250YWluaW5nIGFsbCB0aGUga25vd24gcmVsb2NhdGlvbnMKLSAgIGZvciB0aGF0IHRhcmdldCwgb3IgaWYgUkVMT0NfTUFDUk9TX0dFTl9GVU5DIGlzIGRlZmluZWQsIGEgcmVjb2duaXRpb24KLSAgIGZ1bmN0aW9uIGlzIGdlbmVyYXRlZCBpbnN0ZWFkLiAgKFRoaXMgaXMgdXNlZCBieSBiaW51dGlscy9yZWFkZWxmLmMpCi0KLSAgIEdpdmVuIGEgaGVhZGVyIGZpbGUgbGlrZSB0aGlzOgotCi0gICAJU1RBUlRfUkVMT0NfTlVNQkVSUyAoZm9vKQotICAgCSAgICBSRUxPQ19OVU1CRVIgKFJfZm9vX05PTkUsICAgIDApCi0gICAJICAgIFJFTE9DX05VTUJFUiAoUl9mb29fMzIsICAgICAgMSkKLSAgIAkgICAgRkFLRV9SRUxPQyAgIChSX2Zvb19pbGxlZ2FsLCAyKQotICAgCSAgICBFTVBUWV9SRUxPQyAgKFJfZm9vX21heCkKLSAgIAlFTkRfUkVMT0NfTlVNQkVSUwotCi0gICBUaGVuIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSBwcm9kdWNlZCBieSBkZWZhdWx0IChpZSBpZgotICAgUkVMT0NfTUFDUk9TX0dFTl9GVU5DIGlzICpub3QqIGRlZmluZWQpLgotCi0gICAJZW51bSBmb28KLQl7Ci0JICBmb28gPSAtMSwKLSAgIAkgIFJfZm9vX05PTkUgPSAwLAotICAgCSAgUl9mb29fMzIgPSAxLAotICAgCSAgUl9mb29faWxsZWdhbCA9IDIsCi0gICAJICBSX2Zvb19tYXgKLSAgIAl9OwotCi0gICBJZiBSRUxPQ19NQUNST1NfR0VOX0ZVTkMgKmlzKiBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhlCi0gICBmb2xsb3dpbmcgZnVuY3Rpb24gd2lsbCBiZSBnZW5lcmF0ZWQ6Ci0KLSAgIAlzdGF0aWMgY2hhciAqIGZvbyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIHJ0eXBlKSk7Ci0gICAJc3RhdGljIGNoYXIgKgotICAgCWZvbyAocnR5cGUpCi0gICAJICAgIHVuc2lnbmVkIGxvbmcgcnR5cGU7Ci0gICAJewotICAgCSAgIHN3aXRjaCAocnR5cGUpCi0gICAJICAgewotICAgCSAgIGNhc2UgMDogcmV0dXJuICJSX2Zvb19OT05FIjsKLSAgIAkgICBjYXNlIDE6IHJldHVybiAiUl9mb29fMzIiOwotICAgCSAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOwotICAgCSAgIH0KLSAgIAl9Ci0gICAqLwotICAgCi0jaWZuZGVmIF9SRUxPQ19NQUNST1NfSAotI2RlZmluZSBfUkVMT0NfTUFDUk9TX0gKLQotI2lmZGVmIFJFTE9DX01BQ1JPU19HRU5fRlVOQwotCi0vKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSByZWxvY2F0aW9uIG51bWJlciBhbmQgcmV0dXJucyB0aGUKLSAgIHN0cmluZyB2ZXJzaW9uIG5hbWUgb2YgdGhlIG5hbWUgb2YgdGhhdCByZWxvY2F0aW9uLiAgSWYKLSAgIHRoZSByZWxvY2F0aW9uIGlzIG5vdCByZWNvZ25pc2VkLCBOVUxMIGlzIHJldHVybmVkLiAgKi8KLQotI2RlZmluZSBTVEFSVF9SRUxPQ19OVU1CRVJTKG5hbWUpICAgCQkJCVwKLXN0YXRpYyBjb25zdCBjaGFyICogbmFtZSAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIHJ0eXBlKSk7IAlcCi1zdGF0aWMgY29uc3QgY2hhciAqCQkJCQkJXAotbmFtZSAocnR5cGUpCQkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIHJ0eXBlOwkJCQkJXAotewkJCQkJCQkJXAotICBzd2l0Y2ggKHJ0eXBlKQkJCQkJCVwKLSAgewotCi0jaWZkZWYgX19TVERDX18JCQkJCSAgCi0jZGVmaW5lIFJFTE9DX05VTUJFUihuYW1lLCBudW1iZXIpICBjYXNlIG51bWJlciA6IHJldHVybiAjbmFtZSA7Ci0jZWxzZQotI2RlZmluZSBSRUxPQ19OVU1CRVIobmFtZSwgbnVtYmVyKSAgY2FzZSBudW1iZXIgOiByZXR1cm4gIm5hbWUiIDsKLSNlbmRpZgotCi0jZGVmaW5lIEZBS0VfUkVMT0MobmFtZSwgbnVtYmVyKSAgICAKLSNkZWZpbmUgRU1QVFlfUkVMT0MobmFtZSkKLQkJCQkJICAKLSNkZWZpbmUgRU5EX1JFTE9DX05VTUJFUlMJXAotICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOwlcCi0gIH0JCQkJXAotfQotCi0KLSNlbHNlIC8qIERlZmF1bHQgdG8gZ2VuZXJhdGluZyBlbnVtLiAgKi8KLQotLyogU29tZSBjb21waWxlcnMgY2Fubm90IGNvcGUgd2l0aCBhbiBlbnVtIHRoYXQgZW5kcyB3aXRoIGEgdHJhaWxpbmcKLSAgIGNvbW1hLCBzbyBTVEFSVF9SRUxPQ19OVU1CRVJTIGNyZWF0ZXMgYSBmYWtlIHJlbG9jIGVudHJ5LCAoaW5pdGlhbGlzZWQKLSAgIHRvIC0xIHNvIHRoYXQgdGhlIGZpcnN0IHJlYWwgZW50cnkgd2lsbCBzdGlsbCBkZWZhdWx0IHRvIDApLiAgRnVydGhlcgotICAgZW50cmllcyB0aGVuIHByZXBlbmQgYSBjb21tYSB0byB0aGVpciBkZWZpbml0aW9ucywgY3JlYXRpbmcgYSBsaXN0Ci0gICBvZiBlbnVtZXJhdG9yIGVudHJpZXMgdGhhdCB3aWxsIHNhdGlzZnkgdGhlc2UgY29tcGlsZXJzLiAgKi8KLSNpZmRlZiBfX1NURENfXwotI2RlZmluZSBTVEFSVF9SRUxPQ19OVU1CRVJTKG5hbWUpICAgZW51bSBuYW1lIHsgXyMjbmFtZSA9IC0xCi0jZWxzZQotI2RlZmluZSBTVEFSVF9SRUxPQ19OVU1CRVJTKG5hbWUpICAgZW51bSBuYW1lIHsgbmFtZSA9IC0xCi0jZW5kaWYKLQkJCQkJCQotI2RlZmluZSBSRUxPQ19OVU1CRVIobmFtZSwgbnVtYmVyKSAgLCBuYW1lID0gbnVtYmVyCi0jZGVmaW5lIEZBS0VfUkVMT0MobmFtZSwgbnVtYmVyKSAgICAsIG5hbWUgPSBudW1iZXIgCi0jZGVmaW5lIEVNUFRZX1JFTE9DKG5hbWUpICAgICAgICAgICAsIG5hbWUgCi0jZGVmaW5lIEVORF9SRUxPQ19OVU1CRVJTICAgICAgICAgICB9OwotCi0jZW5kaWYKLQotI2VuZGlmIC8qIFJFTE9DX01BQ1JPU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9zaC5oIGIvaW5jbHVkZS9lbGYvc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0NzY2Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9zaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogU0ggRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfU0hfSAotI2RlZmluZSBfRUxGX1NIX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotLyogUmVsb2NhdGlvbnMgMjVmZiBhcmUgR05VIGV4dGVuc2lvbnMuCi0gICAyNS4uMzMgYXJlIHVzZWQgZm9yIHJlbGF4YXRpb24gYW5kIHVzZSB0aGUgc2FtZSBjb25zdGFudHMgYXMgQ09GRiB1c2VzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9zaF9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjMyLCAxKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfUkVMMzIsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9ESVI4V1BOLCAzKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfSU5EMTJXLCA0KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSOFdQTCwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhXUFosIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9ESVI4QlAsIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9ESVI4VywgOCkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhMLCA5KQotICBGQUtFX1JFTE9DIChSX1NIX0ZJUlNUX0lOVkFMSURfUkVMT0MsIDEwKQotICBGQUtFX1JFTE9DIChSX1NIX0xBU1RfSU5WQUxJRF9SRUxPQywgMjQpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9TV0lUQ0gxNiwgMjUpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9TV0lUQ0gzMiwgMjYpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9VU0VTLCAyNykKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0NPVU5ULCAyOCkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0FMSUdOLCAyOSkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0NPREUsIDMwKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfREFUQSwgMzEpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9MQUJFTCwgMzIpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9TV0lUQ0g4LCAzMykKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0dOVV9WVElOSEVSSVQsIDM0KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfR05VX1ZURU5UUlksIDM1KQotICBFTVBUWV9SRUxPQyAoUl9TSF9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL3NwYXJjLmggYi9pbmNsdWRlL2VsZi9zcGFyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWU0Y2RkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL3NwYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyogU1BBUkMgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEJ5IERvdWcgRXZhbnMsIEN5Z251cyBTdXBwb3J0LCA8ZGplQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9TUEFSQ19ICi0jZGVmaW5lIF9FTEZfU1BBUkNfSAotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotCi0vKiBUaGVzZSBhcmUgZGVmaW5lZCBieSBTdW4uICAqLwotCi0jZGVmaW5lIEVGX1NQQVJDXzMyUExVU19NQVNLCTB4ZmZmZjAwCS8qIGJpdHMgaW5kaWNhdGluZyBWOCsgdHlwZSAqLwotI2RlZmluZSBFRl9TUEFSQ18zMlBMVVMJCTB4MDAwMTAwCS8qIGdlbmVyaWMgVjgrIGZlYXR1cmVzICovCi0jZGVmaW5lIEVGX1NQQVJDX1NVTl9VUzEJMHgwMDAyMDAJLyogU3VuIFVsdHJhU1BBUkMxIGV4dGVuc2lvbnMgKi8KLSNkZWZpbmUgRUZfU1BBUkNfSEFMX1IxCQkweDAwMDQwMAkvKiBIQUwgUjEgZXh0ZW5zaW9ucyAqLwotCi0jZGVmaW5lIEVGX1NQQVJDX0xFREFUQSAgICAgICAgIDB4ODAwMDAwCS8qIGxpdHRsZSBlbmRpYW4gZGF0YSAqLwotCi0vKiBUaGlzIG5hbWUgaXMgdXNlZCBpbiB0aGUgVjkgQUJJLiAgKi8KLSNkZWZpbmUgRUZfU1BBUkNfRVhUX01BU0sJMHhmZmZmMDAJLyogcmVzZXJ2ZWQgZm9yIHZlbmRvciBleHRlbnNpb25zICovCi0KLS8qIFY5IG1lbW9yeSBtb2RlbHMgKi8KLSNkZWZpbmUgRUZfU1BBUkNWOV9NTQkJMHgzCQkvKiBtZW1vcnkgbW9kZWwgbWFzayAqLwotI2RlZmluZSBFRl9TUEFSQ1Y5X1RTTwkJMHgwCQkvKiB0b3RhbCBzdG9yZSBvcmRlcmluZyAqLwotI2RlZmluZSBFRl9TUEFSQ1Y5X1BTTwkJMHgxCQkvKiBwYXJ0aWFsIHN0b3JlIG9yZGVyaW5nICovCi0jZGVmaW5lIEVGX1NQQVJDVjlfUk1PCQkweDIJCS8qIHJlbGF4ZWQgc3RvcmUgb3JkZXJpbmcgKi8KLQotLyogU2VjdGlvbiBpbmRpY2VzLiAgKi8KLQotI2RlZmluZSBTSE5fQkVGT1JFCQkweGZmMDAJCS8qIHVzZWQgd2l0aCBTSEZfT1JERVJFRCAqLwotI2RlZmluZSBTSE5fQUZURVIJCTB4ZmYwMQkJLyogdXNlZCB3aXRoIFNIRl9PUkRFUkVEICovCi0KLS8qIFNlY3Rpb24gZmxhZ3MuICAqLwotCi0jZGVmaW5lIFNIRl9FWENMVURFCQkweDgwMDAwMDAwCS8qIGV4Y2x1ZGUgZnJvbSBsaW5raW5nICovCi0jZGVmaW5lIFNIRl9PUkRFUkVECQkweDQwMDAwMDAwCS8qIHRyZWF0IHNoX2xpbmssc2hfaW5mbyBzcGVjaWFsbHkgKi8KLQotLyogU3ltYm9sIHR5cGVzLiAgKi8KLQotI2RlZmluZSBTVFRfUkVHSVNURVIJCTEzCQkvKiBnbG9iYWwgcmVnIHJlc2VydmVkIHRvIGFwcC4gKi8KLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbiB0eXBlcy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfc3BhcmNfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ184LCAxKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfMTYsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18zMiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0RJU1A4LCA0KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfRElTUDE2LCA1KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfRElTUDMyLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfV0RJU1AzMCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1dESVNQMjIsIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ISTIyLCA5KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfMjIsIDEwKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfMTMsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTE8xMCwgMTIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19HT1QxMCwgMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19HT1QxMywgMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19HT1QyMiwgMTUpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQzEwLCAxNikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDMjIsIDE3KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfV1BMVDMwLCAxOCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0NPUFksIDE5KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfR0xPQl9EQVQsIDIwKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSk1QX1NMT1QsIDIxKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUkVMQVRJVkUsIDIyKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfVUEzMiwgMjMpCi0KLSAgLyogPz8/IFRoZXNlIDYgcmVsb2NzIGFyZSBuZXcgYnV0IG5vdCBjdXJyZW50bHkgdXNlZC4gIEZvciBiaW5hcnkKLSAgICAgY29tcGF0aWxpdHkgaW4gdGhlIHNwYXJjNjQtZWxmIHRvb2xjaGFpbiwgd2UgbGVhdmUgdGhlbSBvdXQuCi0gICAgIEEgbm9uLWJpbmFyeSB1cHdhcmQgY29tcGF0aWJsZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgZm9yIHNwYXJjNjQtZWxmLiAgKi8KLSNpZm5kZWYgU1BBUkM2NF9PTERfUkVMT0NTCi0gIC8qID8/PyBOZXcgcmVsb2NzIG9uIHRoZSBVbHRyYVNQQVJDLiAgTm90IHN1cmUgd2hhdCB0aGV5J3JlIGZvciB5ZXQuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUExUMzIsIDI0KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSElQTFQyMiwgMjUpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19MT1BMVDEwLCAyNikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDUExUMzIsIDI3KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUENQTFQyMiwgMjgpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQ1BMVDEwLCAyOSkKLSNlbmRpZgotCi0gIC8qIHY5IHJlbG9jcyAqLwotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfMTAsIDMwKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfMTEsIDMxKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfNjQsIDMyKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfT0xPMTAsIDMzKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSEgyMiwgMzQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ITTEwLCAzNSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0xNMjIsIDM2KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUENfSEgyMiwgMzcpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQ19ITTEwLCAzOCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDX0xNMjIsIDM5KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfV0RJU1AxNiwgNDApCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19XRElTUDE5LCA0MSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1VOVVNFRF80MiwgNDIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ183LCA0MykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzUsIDQ0KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfNiwgNDUpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ESVNQNjQsIDQ2KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUExUNjQsIDQ3KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSElYMjIsIDQ4KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTE9YMTAsIDQ5KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSDQ0LCA1MCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX000NCwgNTEpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19MNDQsIDUyKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUkVHSVNURVIsIDUzKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfVUE2NCwgNTQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19VQTE2LCA1NSkKLQotICAvKiBsaXR0bGUgZW5kaWFuIGRhdGEgcmVsb2NzICovCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19SRVYzMiwgNTYpCi0KLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0dOVV9WVElOSEVSSVQsIDI1MCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0dOVV9WVEVOVFJZLCAyNTEpCi0KLSAgRU1QVFlfUkVMT0MgIChSX1NQQVJDX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLS8qIFJlbG9jYXRpb24gbWFjcm9zLiAgKi8KLQotI2RlZmluZSBFTEY2NF9SX1RZUEVfREFUQShpbmZvKQkJKCgoYmZkX3ZtYSkgKGluZm8pIDw8IDMyKSA+PiA0MCkKLSNkZWZpbmUgRUxGNjRfUl9UWVBFX0lEKGluZm8pCQkoKChiZmRfdm1hKSAoaW5mbykgPDwgNTYpID4+IDU2KQotI2RlZmluZSBFTEY2NF9SX1RZUEVfSU5GTyhkYXRhLCB0eXBlKQkoKChiZmRfdm1hKSAoZGF0YSkgPDwgOCkgXAotCQkJCQkgKyAoYmZkX3ZtYSkgKHR5cGUpKQotCi0jZGVmaW5lIERUX1NQQVJDX1JFR0lTVEVSCTB4NzAwMDAwMDEKLQotLyoKLSAqIEZJWE1FOiBOT1QgQUJJIC0tIEdFVCBSSUQgT0YgVEhJUwotICogRGVmaW5lcyB0aGUgZm9ybWF0IHVzZWQgYnkgdGhlIC5wbHQuICBDdXJyZW50bHkgZGVmaW5lZCB2YWx1ZXMgYXJlCi0gKiAgIDAgLS0gcmVzZXJ2ZWQgdG8gU0kKLSAqICAgMSAtLSBhYnNvbHV0ZSBhZGRyZXNzIGluIC5nb3QucGx0Ci0gKiAgIDIgLS0gZ290LXJlbGF0aXZlIGFkZHJlc3MgaW4gLmdvdC5wbHQKLSAqLwotCi0jZGVmaW5lIERUX1NQQVJDX1BMVEZNVAkJMHg3MDAwMDAwMQotCi0jZW5kaWYgLyogX0VMRl9TUEFSQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi92ODUwLmggYi9pbmNsdWRlL2VsZi92ODUwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NDNiN2YuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvdjg1MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qIFY4NTAgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENyZWF0ZWQgYnkgTWljaGFlbCBNZWlzc25lciwgQ3lnbnVzIFN1cHBvcnQgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNSVBTIEVMRiBBQkkuICBOb3RlCi0gICB0aGF0IG1vc3Qgb2YgdGhpcyBpcyBub3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQgYnkgQkZELiAgKi8KLQotI2lmbmRlZiBfRUxGX1Y4NTBfSAotI2RlZmluZSBfRUxGX1Y4NTBfSAotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotCi0vKiBGb3VyIGJpdCBWODUwIGFyY2hpdGVjdHVyZSBmaWVsZC4gICovCi0jZGVmaW5lIEVGX1Y4NTBfQVJDSAkJMHhmMDAwMDAwMAotCi0vKiB2ODUwIGNvZGUuICAqLwotI2RlZmluZSBFX1Y4NTBfQVJDSAkJMHgwMDAwMDAwMAotCi0vKiB2ODUwZSBjb2RlLiAgKi8KLSNkZWZpbmUgRV9WODUwRV9BUkNICQkweDEwMDAwMDAwCi0KLS8qIHY4NTBlYSBjb2RlLiAgKi8KLSNkZWZpbmUgRV9WODUwRUFfQVJDSAkJMHgyMDAwMDAwMAotCi0KLS8qIEZsYWdzIGZvciB0aGUgc3Rfb3RoZXIgZmllbGQgKi8KLSNkZWZpbmUgVjg1MF9PVEhFUl9TREEJCTB4MDEJLyogc3ltYm9sIGhhZCBTREEgcmVsb2NhdGlvbnMgKi8KLSNkZWZpbmUgVjg1MF9PVEhFUl9aREEJCTB4MDIJLyogc3ltYm9sIGhhZCBaREEgcmVsb2NhdGlvbnMgKi8KLSNkZWZpbmUgVjg1MF9PVEhFUl9UREEJCTB4MDQJLyogc3ltYm9sIGhhZCBUREEgcmVsb2NhdGlvbnMgKi8KLSNkZWZpbmUgVjg1MF9PVEhFUl9UREFfQllURQkweDA4CS8qIHN5bWJvbCBoYWQgVERBIGJ5dGUgcmVsb2NhdGlvbnMgKi8KLSNkZWZpbmUgVjg1MF9PVEhFUl9FUlJPUgkweDgwCS8qIHN5bWJvbCBoYWQgYW4gZXJyb3IgcmVwb3J0ZWQgKi8KLQotLyogVjg1MCByZWxvY2F0aW9ucyAqLwotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotU1RBUlRfUkVMT0NfTlVNQkVSUyAodjg1MF9yZWxvY190eXBlKQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF9OT05FLCAwKQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF85X1BDUkVMLCAxKQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF8yMl9QQ1JFTCwgMikKLSAgICAgUkVMT0NfTlVNQkVSIChSX1Y4NTBfSEkxNl9TLCAzKQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF9ISTE2LCA0KQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF9MTzE2LCA1KQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF8zMiwgNikKLSAgICAgUkVMT0NfTlVNQkVSIChSX1Y4NTBfMTYsIDcpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwXzgsIDgpCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQsIDkpCQkvKiBGb3IgbGQuYiwgc3QuYiwgc2V0MSwgY2xyMSwgbm90MSwgdHN0MSwgbW92ZWEsIG1vdmhpICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQsIDEwKQkJLyogRm9yIGxkLncsIGxkLmgsIGxkLmh1LCBzdC53LCBzdC5oICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQsIDExKQkJLyogRm9yIGxkLmIsIHN0LmIsIHNldDEsIGNscjEsIG5vdDEsIHRzdDEsIG1vdmVhLCBtb3ZoaSAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9aREFfMTVfMTZfT0ZGU0VULCAxMikJCS8qIEZvciBsZC53LCBsZC5oLCBsZC5odSwgc3Qudywgc3QuaCAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9UREFfNl84X09GRlNFVCwgMTMpCQkvKiBGb3Igc3N0LncsIHNsZC53ICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1REQV83XzhfT0ZGU0VULCAxNCkJCS8qIEZvciBzc3QuaCwgc2xkLmggKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfVERBXzdfN19PRkZTRVQsIDE1KQkJLyogRm9yIHNzdC5iLCBzbGQuYiAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VULCAxNikJCS8qIEZvciBzZXQxLCBjbHIxLCBub3QxLCB0c3QxLCBtb3ZlYSwgbW92aGkgKi8KLS8qIENZR05VUyBMT0NBTCB2ODUwZSAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9UREFfNF81X09GRlNFVCwgMTcpCQkvKiBGb3Igc2xkLmh1ICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1REQV80XzRfT0ZGU0VULCAxOCkJCS8qIEZvciBzbGQuYnUgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCwgMTkpCS8qIEZvciBsZC5idSAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VULCAyMCkJLyogRm9yIGxkLmJ1ICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX0NBTExUXzZfN19PRkZTRVQsIDIxKQkJLyogRm9yIGNhbGx0ICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVCwgMjIpCS8qIEZvciBjYWxsdCAqLwotLyogRU5EIENZR05VUyBMT0NBTCAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF9HTlVfVlRJTkhFUklULCAyMykKLSAgICAgUkVMT0NfTlVNQkVSIChSX1Y4NTBfR05VX1ZURU5UUlksIDI0KQotCi0gICAgIEVNUFRZX1JFTE9DIChSX1Y4NTBfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotDAotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gaW5kaWNlcy4gIFRoZXNlIHNlY3Rpb25zIGRvIG5vdCBhY3R1YWxseQotICAgZXhpc3QuICBTeW1ib2xzIHdpdGggYSBzdF9zaG5keCBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIG9uZSBvZiB0aGVzZQotICAgdmFsdWVzIGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcuICAqLwotCi0vKiBTbWFsbCBkYXRhIGFyZWEgY29tbW9uIHN5bWJvbC4gICovCi0jZGVmaW5lIFNITl9WODUwX1NDT01NT04JMHhmZjAwCi0KLS8qIFRpbnkgZGF0YSBhcmVhIGNvbW1vbiBzeW1ib2wuICAqLwotI2RlZmluZSBTSE5fVjg1MF9UQ09NTU9OCTB4ZmYwMQotCi0vKiBaZXJvIGRhdGEgYXJlYSBjb21tb24gc3ltYm9sLiAgKi8KLSNkZWZpbmUgU0hOX1Y4NTBfWkNPTU1PTgkweGZmMDIKLQotDAotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gdHlwZXMuICAqLwotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHRoZSAuc2NvbW1vbiBkYXRhLiAgKi8KLSNkZWZpbmUgU0hUX1Y4NTBfU0NPTU1PTgkweDcwMDAwMDAwCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgdGhlIC5zY29tbW9uIGRhdGEuICAqLwotI2RlZmluZSBTSFRfVjg1MF9UQ09NTU9OCTB4NzAwMDAwMDEKLQotLyogU2VjdGlvbiBjb250YWlucyB0aGUgLnNjb21tb24gZGF0YS4gICovCi0jZGVmaW5lIFNIVF9WODUwX1pDT01NT04JMHg3MDAwMDAwMgotCi0KLSNlbmRpZiAvKiBfRUxGX1Y4NTBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mbG9hdGZvcm1hdC5oIGIvaW5jbHVkZS9mbG9hdGZvcm1hdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGRhY2EyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZmxvYXRmb3JtYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKiBJRUVFIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgZGVjbGFyYXRpb25zLCBmb3IgR0RCLCB0aGUgR05VIERlYnVnZ2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZiAhZGVmaW5lZCAoRkxPQVRGT1JNQVRfSCkKLSNkZWZpbmUgRkxPQVRGT1JNQVRfSCAxCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0vKiBBIGZsb2F0Zm9ybWF0IGNvbnNpc3RzIG9mIGEgc2lnbiBiaXQsIGFuIGV4cG9uZW50IGFuZCBhIG1hbnRpc3NhLiAgT25jZSB0aGUKLSAgIGJ5dGVzIGFyZSBjb25jYXRlbmF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBieXRlb3JkZXIgZmxhZywgdGhlbiBlYWNoIG9mIHRob3NlCi0gICBmaWVsZHMgaXMgY29udGlndW91cy4gIFdlIG51bWJlciB0aGUgYml0cyB3aXRoIDAgYmVpbmcgdGhlIG1vc3Qgc2lnbmlmaWNhbnQKLSAgIChpLmUuIEJJVFNfQklHX0VORElBTiB0eXBlIG51bWJlcmluZyksIGFuZCBzcGVjaWZ5IHdoaWNoIGJpdHMgZWFjaCBmaWVsZAotICAgY29udGFpbnMgd2l0aCB0aGUgKl9zdGFydCBhbmQgKl9sZW4gZmllbGRzLiAgKi8KLQotLyogV2hhdCBpcyB0aGUgb3JkZXIgb2YgdGhlIGJ5dGVzLiAqLwotCi1lbnVtIGZsb2F0Zm9ybWF0X2J5dGVvcmRlcnMgewotCi0gIC8qIFN0YW5kYXJkIGxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlci4KLSAgICAgRVg6IDEuMjM0NTY3OGUxMCA9PiAwMCAwMCA4MCBjNSBlMCBmZSAwNiA0MiAqLwotCi0gIGZsb2F0Zm9ybWF0X2xpdHRsZSwKLQotICAvKiBTdGFuZGFyZCBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIuCi0gICAgIEVYOiAxLjIzNDU2NzhlMTAgPT4gNDIgMDYgZmUgZTAgYzUgODAgMDAgMDAgKi8KLQotICBmbG9hdGZvcm1hdF9iaWcsCi0KLSAgLyogTGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyIGJ1dCBiaWcgZW5kaWFuIHdvcmQgb3JkZXIuCi0gICAgIEVYOiAxLjIzNDU2NzhlMTAgPT4gZTAgZmUgMDYgNDIgMDAgMDAgODAgYzUgKi8KLQotICBmbG9hdGZvcm1hdF9saXR0bGVieXRlX2JpZ3dvcmQKLQotfTsKLQotZW51bSBmbG9hdGZvcm1hdF9pbnRiaXQgeyBmbG9hdGZvcm1hdF9pbnRiaXRfeWVzLCBmbG9hdGZvcm1hdF9pbnRiaXRfbm8gfTsKLQotc3RydWN0IGZsb2F0Zm9ybWF0Ci17Ci0gIGVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyBieXRlb3JkZXI7Ci0gIHVuc2lnbmVkIGludCB0b3RhbHNpemU7CS8qIFRvdGFsIHNpemUgb2YgbnVtYmVyIGluIGJpdHMgKi8KLQotICAvKiBTaWduIGJpdCBpcyBhbHdheXMgb25lIGJpdCBsb25nLiAgMSBtZWFucyBuZWdhdGl2ZSwgMCBtZWFucyBwb3NpdGl2ZS4gICovCi0gIHVuc2lnbmVkIGludCBzaWduX3N0YXJ0OwotCi0gIHVuc2lnbmVkIGludCBleHBfc3RhcnQ7Ci0gIHVuc2lnbmVkIGludCBleHBfbGVuOwotICAvKiBBbW91bnQgYWRkZWQgdG8gInRydWUiIGV4cG9uZW50LiAgMHgzZmZmIGZvciBtYW55IElFRUUgZXh0ZW5kZWRzLiAgKi8KLSAgdW5zaWduZWQgaW50IGV4cF9iaWFzOwotICAvKiBFeHBvbmVudCB2YWx1ZSB3aGljaCBpbmRpY2F0ZXMgTmFOLiAgVGhpcyBpcyB0aGUgYWN0dWFsIHZhbHVlIHN0b3JlZCBpbgotICAgICB0aGUgZmxvYXQsIG5vdCBhZGp1c3RlZCBieSB0aGUgZXhwX2JpYXMuICBUaGlzIHVzdWFsbHkgY29uc2lzdHMgb2YgYWxsCi0gICAgIG9uZSBiaXRzLiAgKi8KLSAgdW5zaWduZWQgaW50IGV4cF9uYW47Ci0KLSAgdW5zaWduZWQgaW50IG1hbl9zdGFydDsKLSAgdW5zaWduZWQgaW50IG1hbl9sZW47Ci0KLSAgLyogSXMgdGhlIGludGVnZXIgYml0IGV4cGxpY2l0IG9yIGltcGxpY2l0PyAgKi8KLSAgZW51bSBmbG9hdGZvcm1hdF9pbnRiaXQgaW50Yml0OwotfTsKLQotLyogZmxvYXRmb3JtYXRzIGZvciBJRUVFIHNpbmdsZSBhbmQgZG91YmxlLCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4uICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfc2luZ2xlX2JpZzsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfbGl0dGxlOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9iaWc7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZTsKLQotLyogZmxvYXRmb3JtYXQgZm9yIEFSTSBJRUVFIGRvdWJsZSwgbGl0dGxlIGVuZGlhbiBieXRlcyBhbmQgYmlnIGVuZGlhbiB3b3JkcyAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZWJ5dGVfYmlnd29yZDsKLQotLyogZmxvYXRmb3JtYXRzIGZvciB2YXJpb3VzIGV4dGVuZGVkcy4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaTM4N19leHQ7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X202ODg4MV9leHQ7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2k5NjBfZXh0OwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9tODgxMTBfZXh0OwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9hcm1fZXh0OwotCi0vKiBDb252ZXJ0IGZyb20gRk1UIHRvIGEgZG91YmxlLgotICAgRlJPTSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZXh0ZW5kZWQgZmxvYXQuCi0gICBTdG9yZSB0aGUgZG91YmxlIGluICpUTy4gICovCi0KLWV4dGVybiB2b2lkCi1mbG9hdGZvcm1hdF90b19kb3VibGUgUEFSQU1TICgoY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICosIGNoYXIgKiwgZG91YmxlICopKTsKLQotLyogVGhlIGNvbnZlcnNlOiBjb252ZXJ0IHRoZSBkb3VibGUgKkZST00gdG8gRk1UCi0gICBhbmQgc3RvcmUgd2hlcmUgVE8gcG9pbnRzLiAgKi8KLQotZXh0ZXJuIHZvaWQKLWZsb2F0Zm9ybWF0X2Zyb21fZG91YmxlIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCAqLAotCQkJCSBkb3VibGUgKiwgY2hhciAqKSk7Ci0KLSNlbmRpZgkvKiBkZWZpbmVkIChGTE9BVEZPUk1BVF9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mbm1hdGNoLmggYi9pbmNsdWRlL2ZubWF0Y2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlYjcwMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZubWF0Y2guaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIEMgTGlicmFyeS4KLUJ1Z3MgY2FuIGJlIHJlcG9ydGVkIHRvIGJ1Zy1nbGliY0BwcmVwLmFpLm1pdC5lZHUuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLWxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmCV9GTk1BVENIX0gKLQotI2RlZmluZQlfRk5NQVRDSF9ICTEKLQotI2lmZGVmCV9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpIHx8IChkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18pCi0jdW5kZWYJX19QCi0jZGVmaW5lCV9fUChhcmdzKQlhcmdzCi0jZWxzZSAvKiBOb3QgQysrIG9yIEFOU0kgQy4gICovCi0jdW5kZWYJX19QCi0jZGVmaW5lCV9fUChhcmdzKQkoKQotLyogV2UgY2FuIGdldCBhd2F5IHdpdGhvdXQgZGVmaW5pbmcgYGNvbnN0JyBoZXJlIG9ubHkgYmVjYXVzZSBpbiB0aGlzIGZpbGUKLSAgIGl0IGlzIHVzZWQgb25seSBpbnNpZGUgdGhlIHByb3RvdHlwZSBmb3IgYGZubWF0Y2gnLCB3aGljaCBpcyBlbGlkZWQgaW4KLSAgIG5vbi1BTlNJIEMgd2hlcmUgYGNvbnN0JyBpcyBwcm9ibGVtYXRpY2FsLiAgKi8KLSNlbmRpZiAvKiBDKysgb3IgQU5TSSBDLiAgKi8KLQotCi0vKiBXZSAjdW5kZWYgdGhlc2UgYmVmb3JlIGRlZmluaW5nIHRoZW0gYmVjYXVzZSBzb21lIGxvc2luZyBzeXN0ZW1zCi0gICAoSFAtVVggQS4wOC4wNyBmb3IgZXhhbXBsZSkgZGVmaW5lIHRoZXNlIGluIDx1bmlzdGQuaD4uICAqLwotI3VuZGVmCUZOTV9QQVRITkFNRQotI3VuZGVmCUZOTV9OT0VTQ0FQRQotI3VuZGVmCUZOTV9QRVJJT0QKLQotLyogQml0cyBzZXQgaW4gdGhlIEZMQUdTIGFyZ3VtZW50IHRvIGBmbm1hdGNoJy4gICovCi0jZGVmaW5lCUZOTV9QQVRITkFNRQkoMSA8PCAwKSAvKiBObyB3aWxkY2FyZCBjYW4gZXZlciBtYXRjaCBgLycuICAqLwotI2RlZmluZQlGTk1fTk9FU0NBUEUJKDEgPDwgMSkgLyogQmFja3NsYXNoZXMgZG9uJ3QgcXVvdGUgc3BlY2lhbCBjaGFycy4gICovCi0jZGVmaW5lCUZOTV9QRVJJT0QJKDEgPDwgMikgLyogTGVhZGluZyBgLicgaXMgbWF0Y2hlZCBvbmx5IGV4cGxpY2l0bHkuICAqLwotCi0jaWYgIWRlZmluZWQgKF9QT1NJWF9DX1NPVVJDRSkgfHwgX1BPU0lYX0NfU09VUkNFIDwgMiB8fCBkZWZpbmVkIChfR05VX1NPVVJDRSkKLSNkZWZpbmUJRk5NX0ZJTEVfTkFNRQlGTk1fUEFUSE5BTUUgLyogUHJlZmVycmVkIEdOVSBuYW1lLiAgKi8KLSNkZWZpbmUJRk5NX0xFQURJTkdfRElSCSgxIDw8IDMpIC8qIElnbm9yZSBgLy4uLicgYWZ0ZXIgYSBtYXRjaC4gICovCi0jZGVmaW5lCUZOTV9DQVNFRk9MRAkoMSA8PCA0KSAvKiBDb21wYXJlIHdpdGhvdXQgcmVnYXJkIHRvIGNhc2UuICAqLwotI2VuZGlmCi0KLS8qIFZhbHVlIHJldHVybmVkIGJ5IGBmbm1hdGNoJyBpZiBTVFJJTkcgZG9lcyBub3QgbWF0Y2ggUEFUVEVSTi4gICovCi0jZGVmaW5lCUZOTV9OT01BVENICTEKLQotLyogTWF0Y2ggU1RSSU5HIGFnYWluc3QgdGhlIGZpbGVuYW1lIHBhdHRlcm4gUEFUVEVSTiwKLSAgIHJldHVybmluZyB6ZXJvIGlmIGl0IG1hdGNoZXMsIEZOTV9OT01BVENIIGlmIG5vdC4gICovCi1leHRlcm4gaW50IGZubWF0Y2ggX19QICgoY29uc3QgY2hhciAqX19wYXR0ZXJuLCBjb25zdCBjaGFyICpfX3N0cmluZywKLQkJCSBpbnQgX19mbGFncykpOwotCi0jaWZkZWYJX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogZm5tYXRjaC5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZvcGVuLWJpbi5oIGIvaW5jbHVkZS9mb3Blbi1iaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg2OGY2My4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZvcGVuLWJpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogTWFjcm9zIGZvciB0aGUgJ3R5cGUnIHBhcnQgb2YgYW4gZm9wZW4sIGZyZW9wZW4gb3IgZmRvcGVuLiAKLQotCTxSZWFkfFdyaXRlPltVcGRhdGVdPEJpbmFyeSBmaWxlfHRleHQgZmlsZT4KLQotICAgVGhpcyB2ZXJzaW9uIGlzIGZvciAiYmluYXJ5IiBzeXN0ZW1zLCB3aGVyZSB0ZXh0IGFuZCBiaW5hcnkgZmlsZXMgYXJlCi0gICBkaWZmZXJlbnQuICBBbiBleGFtcGxlIGlzIE1lc3MtRG9zZS4gIE1hbnkgVW5peCBzeXN0ZW1zIGNvdWxkIGFsc28KLSAgIGNvcGUgd2l0aCBhICJiIiBpbiB0aGUgc3RyaW5nLCBpbmRpY2F0aW5nIGJpbmFyeSBmaWxlcywgYnV0IHNvbWUgcmVqZWN0IHRoaXMKLSAgIChhbmQgdGhlcmVieSBkb24ndCBjb25mb3JtIHRvIEFOU0kgQywgYnV0IHdoYXQgZWxzZSBpcyBuZXc/KS4KLQotICAgVGhpcyBmaWxlIGlzIGRlc2lnbmVkIGZvciBpbmNsdXNpb24gYnkgaG9zdC1kZXBlbmRlbnQgLmggZmlsZXMuICBObwotICAgdXNlciBhcHBsaWNhdGlvbiBzaG91bGQgaW5jbHVkZSBpdCBkaXJlY3RseSwgc2luY2UgdGhhdCB3b3VsZCBtYWtlCi0gICB0aGUgYXBwbGljYXRpb24gdW5hYmxlIHRvIGJlIGNvbmZpZ3VyZWQgZm9yIGJvdGggInNhbWUiIGFuZCAiYmluYXJ5IgotICAgdmFyaWFudCBzeXN0ZW1zLiAgKi8KLQotI2RlZmluZSBGT1BFTl9SQgkicmIiCi0jZGVmaW5lIEZPUEVOX1dCIAkid2IiCi0jZGVmaW5lIEZPUEVOX0FCIAkiYWIiCi0jZGVmaW5lIEZPUEVOX1JVQiAJInIrYiIKLSNkZWZpbmUgRk9QRU5fV1VCIAkidytiIgotI2RlZmluZSBGT1BFTl9BVUIgCSJhK2IiCi0KLSNkZWZpbmUgRk9QRU5fUlQJInIiCi0jZGVmaW5lIEZPUEVOX1dUIAkidyIKLSNkZWZpbmUgRk9QRU5fQVQgCSJhIgotI2RlZmluZSBGT1BFTl9SVVQgCSJyKyIKLSNkZWZpbmUgRk9QRU5fV1VUIAkidysiCi0jZGVmaW5lIEZPUEVOX0FVVCAJImErIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mb3Blbi1zYW1lLmggYi9pbmNsdWRlL2ZvcGVuLXNhbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzNzUyOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZvcGVuLXNhbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qIE1hY3JvcyBmb3IgdGhlICd0eXBlJyBwYXJ0IG9mIGFuIGZvcGVuLCBmcmVvcGVuIG9yIGZkb3Blbi4gCi0KLQk8UmVhZHxXcml0ZT5bVXBkYXRlXTxCaW5hcnkgZmlsZXx0ZXh0IGZpbGU+Ci0KLSAgIFRoaXMgdmVyc2lvbiBpcyBmb3IgInNhbWUiIHN5c3RlbXMsIHdoZXJlIHRleHQgYW5kIGJpbmFyeSBmaWxlcyBhcmUKLSAgIHRoZSBzYW1lLiAgQW4gZXhhbXBsZSBpcyBVbml4LiAgTWFueSBVbml4IHN5c3RlbXMgY291bGQgYWxzbyBhZGQgYQotICAgImIiIHRvIHRoZSBzdHJpbmcsIGluZGljYXRpbmcgYmluYXJ5IGZpbGVzLCBidXQgc29tZSByZWplY3QgdGhpcwotICAgKGFuZCB0aGVyZWJ5IGRvbid0IGNvbmZvcm0gdG8gQU5TSSBDLCBidXQgd2hhdCBlbHNlIGlzIG5ldz8pLgotCi0gICBUaGlzIGZpbGUgaXMgZGVzaWduZWQgZm9yIGluY2x1c2lvbiBieSBob3N0LWRlcGVuZGVudCAuaCBmaWxlcy4gIE5vCi0gICB1c2VyIGFwcGxpY2F0aW9uIHNob3VsZCBpbmNsdWRlIGl0IGRpcmVjdGx5LCBzaW5jZSB0aGF0IHdvdWxkIG1ha2UKLSAgIHRoZSBhcHBsaWNhdGlvbiB1bmFibGUgdG8gYmUgY29uZmlndXJlZCBmb3IgYm90aCAic2FtZSIgYW5kICJiaW5hcnkiCi0gICB2YXJpYW50IHN5c3RlbXMuICAqLwotCi0jZGVmaW5lIEZPUEVOX1JCCSJyIgotI2RlZmluZSBGT1BFTl9XQiAJInciCi0jZGVmaW5lIEZPUEVOX0FCIAkiYSIKLSNkZWZpbmUgRk9QRU5fUlVCIAkicisiCi0jZGVmaW5lIEZPUEVOX1dVQiAJIncrIgotI2RlZmluZSBGT1BFTl9BVUIgCSJhKyIKLQotI2RlZmluZSBGT1BFTl9SVAkiciIKLSNkZWZpbmUgRk9QRU5fV1QgCSJ3IgotI2RlZmluZSBGT1BFTl9BVCAJImEiCi0jZGVmaW5lIEZPUEVOX1JVVCAJInIrIgotI2RlZmluZSBGT1BFTl9XVVQgCSJ3KyIKLSNkZWZpbmUgRk9QRU5fQVVUIAkiYSsiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZvcGVuLXZtcy5oIGIvaW5jbHVkZS9mb3Blbi12bXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE3NmI3Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZvcGVuLXZtcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyogTWFjcm9zIGZvciB0aGUgJ3R5cGUnIHBhcnQgb2YgYW4gZm9wZW4sIGZyZW9wZW4gb3IgZmRvcGVuLiAKLQotCTxSZWFkfFdyaXRlPltVcGRhdGVdPEJpbmFyeSBmaWxlfHRleHQgZmlsZT4KLQotICAgVGhpcyB2ZXJzaW9uIGlzIGZvciBWTVMgc3lzdGVtcywgd2hlcmUgdGV4dCBhbmQgYmluYXJ5IGZpbGVzIGFyZQotICAgZGlmZmVyZW50LgotICAgVGhpcyBmaWxlIGlzIGRlc2lnbmVkIGZvciBpbmNsdXNpb24gYnkgaG9zdC1kZXBlbmRlbnQgLmggZmlsZXMuICBObwotICAgdXNlciBhcHBsaWNhdGlvbiBzaG91bGQgaW5jbHVkZSBpdCBkaXJlY3RseSwgc2luY2UgdGhhdCB3b3VsZCBtYWtlCi0gICB0aGUgYXBwbGljYXRpb24gdW5hYmxlIHRvIGJlIGNvbmZpZ3VyZWQgZm9yIGJvdGggInNhbWUiIGFuZCAiYmluYXJ5IgotICAgdmFyaWFudCBzeXN0ZW1zLiAgKi8KLQotI2RlZmluZSBGT1BFTl9SQgkicmIiLCJyZm09dmFyIgotI2RlZmluZSBGT1BFTl9XQiAJIndiIiwicmZtPXZhciIKLSNkZWZpbmUgRk9QRU5fQUIgCSJhYiIsInJmbT12YXIiCi0jZGVmaW5lIEZPUEVOX1JVQiAJInIrYiIsInJmbT12YXIiCi0jZGVmaW5lIEZPUEVOX1dVQiAJIncrYiIsInJmbT12YXIiCi0jZGVmaW5lIEZPUEVOX0FVQiAJImErYiIsInJmbT12YXIiCi0KLSNkZWZpbmUgRk9QRU5fUlQJInIiCi0jZGVmaW5lIEZPUEVOX1dUIAkidyIKLSNkZWZpbmUgRk9QRU5fQVQgCSJhIgotI2RlZmluZSBGT1BFTl9SVVQgCSJyKyIKLSNkZWZpbmUgRk9QRU5fV1VUIAkidysiCi0jZGVmaW5lIEZPUEVOX0FVVCAJImErIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9nZGJtLmggYi9pbmNsdWRlL2dkYm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ViYzI2ZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2dkYm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qIEdOVSBEQk0gLSBEYXRhQmFzZSBNYW5hZ2VyIGluY2x1ZGUgZmlsZQotICAgQ29weXJpZ2h0IDE5ODksIDE5OTEgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBQaGlsaXAgQS4gTmVsc29uLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBZb3UgbWF5IGNvbnRhY3QgdGhlIGF1dGhvciBieToKLSAgICAgICBlLW1haWw6ICBwaGlsQHd3dS5lZHUKLSAgICAgIHVzLW1haWw6ICBQaGlsaXAgQS4gTmVsc29uCi0gICAgICAgICAgICAgICAgQ29tcHV0ZXIgU2NpZW5jZSBEZXBhcnRtZW50Ci0gICAgICAgICAgICAgICAgV2VzdGVybiBXYXNoaW5ndG9uIFVuaXZlcnNpdHkKLSAgICAgICAgICAgICAgICBCZWxsaW5naGFtLCBXQSA5ODIyNgotICAgICAgICBwaG9uZTogICgyMDYpIDY3Ni0zMDM1Ci0gICAgICAgCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBQYXJhbWV0ZXJzIHRvIGdkYm1fb3BlbiBmb3IgUkVBREVSUywgV1JJVEVSUywgYW5kIFdSSVRFUlMgd2hvCi0gICBjYW4gY3JlYXRlIHRoZSBkYXRhYmFzZS4gKi8KLSNkZWZpbmUgIEdEQk1fUkVBREVSICAwCi0jZGVmaW5lICBHREJNX1dSSVRFUiAgMQotI2RlZmluZSAgR0RCTV9XUkNSRUFUIDIKLSNkZWZpbmUgIEdEQk1fTkVXREIgICAzCi0KLS8qIFBhcmFtZXRlcnMgdG8gZ2RibV9zdG9yZSBmb3Igc2ltcGxlIGluc2VydGlvbiBvciByZXBsYWNlbWVudC4gKi8KLSNkZWZpbmUgIEdEQk1fSU5TRVJUICAwCi0jZGVmaW5lICBHREJNX1JFUExBQ0UgMQotCi0KLS8qIFRoZSBkYXRhIGFuZCBrZXkgc3RydWN0dXJlLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBmb3IgY29tcGF0aWJpbGl0eS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQljaGFyICpkcHRyOwotCWludCAgIGRzaXplOwotICAgICAgfSBkYXR1bTsKLQotCi0vKiBUaGUgZmlsZSBpbmZvcm1hdGlvbiBoZWFkZXIuIFRoaXMgaXMgZ29vZCBlbm91Z2ggZm9yIG1vc3QgYXBwbGljYXRpb25zLiAqLwotdHlwZWRlZiBzdHJ1Y3Qge2ludCBkdW1teVsxMF07fSAqR0RCTV9GSUxFOwotCi0KLS8qIFRoZXNlIGFyZSB0aGUgcm91dGluZXMhICovCi0KLWV4dGVybiBHREJNX0ZJTEUgZ2RibV9vcGVuICgpOwotCi1leHRlcm4gdm9pZAkgZ2RibV9jbG9zZSAoKTsKLQotZXh0ZXJuIGRhdHVtCSBnZGJtX2ZldGNoICgpOwotCi1leHRlcm4gaW50CSBnZGJtX3N0b3JlICgpOwotCi1leHRlcm4gaW50CSBnZGJtX2RlbGV0ZSAoKTsKLQotZXh0ZXJuIGRhdHVtCSBnZGJtX2ZpcnN0a2V5ICgpOwotCi1leHRlcm4gZGF0dW0JIGdkYm1fbmV4dGtleSAoKTsKLQotZXh0ZXJuIGludAkgZ2RibV9yZW9yZ2FuaXplICgpOwotCi0KLS8qIGdkYm0gc2VuZHMgYmFjayB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzIGluIHRoZSB2YXJpYWJsZSBnZGJtX2Vycm5vLiAqLwotdHlwZWRlZiBlbnVtIHsJTk9fRVJST1IsCi0JCU1BTExPQ19FUlJPUiwKLQkJQkxPQ0tfU0laRV9FUlJPUiwKLQkJRklMRV9PUEVOX0VSUk9SLAotCQlGSUxFX1dSSVRFX0VSUk9SLAotCQlGSUxFX1NFRUtfRVJST1IsCi0JCUZJTEVfUkVBRF9FUlJPUiwKLQkJQkFEX01BR0lDX05VTUJFUiwKLQkJRU1QVFlfREFUQUJBU0UsCi0JCUNBTlRfQkVfUkVBREVSLAotCSAgICAgICAgQ0FOVF9CRV9XUklURVIsCi0JCVJFQURFUl9DQU5UX1JFQ09WRVIsCi0JCVJFQURFUl9DQU5UX0RFTEVURSwKLQkJUkVBREVSX0NBTlRfU1RPUkUsCi0JCVJFQURFUl9DQU5UX1JFT1JHQU5JWkUsCi0JCVVOS05PV05fVVBEQVRFLAotCQlJVEVNX05PVF9GT1VORCwKLQkJUkVPUkdBTklaRV9GQUlMRUQsCi0JCUNBTk5PVF9SRVBMQUNFfQotCWdkYm1fZXJyb3I7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2dldG9wdC5oIGIvaW5jbHVkZS9nZXRvcHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzMDcxOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2dldG9wdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qIERlY2xhcmF0aW9ucyBmb3IgZ2V0b3B0LgotICAgQ29weXJpZ2h0IChDKSAxOTg5LDkwLDkxLDkyLDkzLDk0LDk2LDk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBOT1RFOiBUaGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0aGlzIGZpbGUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5LgotICAgQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQGdudS5vcmcuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLSAgIGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0jaWZuZGVmIF9HRVRPUFRfSAotI2RlZmluZSBfR0VUT1BUX0ggMQotCi0jaWZkZWYJX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIEZvciBjb21tdW5pY2F0aW9uIGZyb20gYGdldG9wdCcgdG8gdGhlIGNhbGxlci4KLSAgIFdoZW4gYGdldG9wdCcgZmluZHMgYW4gb3B0aW9uIHRoYXQgdGFrZXMgYW4gYXJndW1lbnQsCi0gICB0aGUgYXJndW1lbnQgdmFsdWUgaXMgcmV0dXJuZWQgaGVyZS4KLSAgIEFsc28sIHdoZW4gYG9yZGVyaW5nJyBpcyBSRVRVUk5fSU5fT1JERVIsCi0gICBlYWNoIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50IGlzIHJldHVybmVkIGhlcmUuICAqLwotCi1leHRlcm4gY2hhciAqb3B0YXJnOwotCi0vKiBJbmRleCBpbiBBUkdWIG9mIHRoZSBuZXh0IGVsZW1lbnQgdG8gYmUgc2Nhbm5lZC4KLSAgIFRoaXMgaXMgdXNlZCBmb3IgY29tbXVuaWNhdGlvbiB0byBhbmQgZnJvbSB0aGUgY2FsbGVyCi0gICBhbmQgZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBzdWNjZXNzaXZlIGNhbGxzIHRvIGBnZXRvcHQnLgotCi0gICBPbiBlbnRyeSB0byBgZ2V0b3B0JywgemVybyBtZWFucyB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsOyBpbml0aWFsaXplLgotCi0gICBXaGVuIGBnZXRvcHQnIHJldHVybnMgLTEsIHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvZiB0aGUKLSAgIG5vbi1vcHRpb24gZWxlbWVudHMgdGhhdCB0aGUgY2FsbGVyIHNob3VsZCBpdHNlbGYgc2Nhbi4KLQotICAgT3RoZXJ3aXNlLCBgb3B0aW5kJyBjb21tdW5pY2F0ZXMgZnJvbSBvbmUgY2FsbCB0byB0aGUgbmV4dAotICAgaG93IG11Y2ggb2YgQVJHViBoYXMgYmVlbiBzY2FubmVkIHNvIGZhci4gICovCi0KLWV4dGVybiBpbnQgb3B0aW5kOwotCi0vKiBDYWxsZXJzIHN0b3JlIHplcm8gaGVyZSB0byBpbmhpYml0IHRoZSBlcnJvciBtZXNzYWdlIGBnZXRvcHQnIHByaW50cwotICAgZm9yIHVucmVjb2duaXplZCBvcHRpb25zLiAgKi8KLQotZXh0ZXJuIGludCBvcHRlcnI7Ci0KLS8qIFNldCB0byBhbiBvcHRpb24gY2hhcmFjdGVyIHdoaWNoIHdhcyB1bnJlY29nbml6ZWQuICAqLwotCi1leHRlcm4gaW50IG9wdG9wdDsKLQotLyogRGVzY3JpYmUgdGhlIGxvbmctbmFtZWQgb3B0aW9ucyByZXF1ZXN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgotICAgVGhlIExPTkdfT1BUSU9OUyBhcmd1bWVudCB0byBnZXRvcHRfbG9uZyBvciBnZXRvcHRfbG9uZ19vbmx5IGlzIGEgdmVjdG9yCi0gICBvZiBgc3RydWN0IG9wdGlvbicgdGVybWluYXRlZCBieSBhbiBlbGVtZW50IGNvbnRhaW5pbmcgYSBuYW1lIHdoaWNoIGlzCi0gICB6ZXJvLgotCi0gICBUaGUgZmllbGQgYGhhc19hcmcnIGlzOgotICAgbm9fYXJndW1lbnQJCShvciAwKSBpZiB0aGUgb3B0aW9uIGRvZXMgbm90IHRha2UgYW4gYXJndW1lbnQsCi0gICByZXF1aXJlZF9hcmd1bWVudAkob3IgMSkgaWYgdGhlIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCwKLSAgIG9wdGlvbmFsX2FyZ3VtZW50IAkob3IgMikgaWYgdGhlIG9wdGlvbiB0YWtlcyBhbiBvcHRpb25hbCBhcmd1bWVudC4KLQotICAgSWYgdGhlIGZpZWxkIGBmbGFnJyBpcyBub3QgTlVMTCwgaXQgcG9pbnRzIHRvIGEgdmFyaWFibGUgdGhhdCBpcyBzZXQKLSAgIHRvIHRoZSB2YWx1ZSBnaXZlbiBpbiB0aGUgZmllbGQgYHZhbCcgd2hlbiB0aGUgb3B0aW9uIGlzIGZvdW5kLCBidXQKLSAgIGxlZnQgdW5jaGFuZ2VkIGlmIHRoZSBvcHRpb24gaXMgbm90IGZvdW5kLgotCi0gICBUbyBoYXZlIGEgbG9uZy1uYW1lZCBvcHRpb24gZG8gc29tZXRoaW5nIG90aGVyIHRoYW4gc2V0IGFuIGBpbnQnIHRvCi0gICBhIGNvbXBpbGVkLWluIGNvbnN0YW50LCBzdWNoIGFzIHNldCBhIHZhbHVlIGZyb20gYG9wdGFyZycsIHNldCB0aGUKLSAgIG9wdGlvbidzIGBmbGFnJyBmaWVsZCB0byB6ZXJvIGFuZCBpdHMgYHZhbCcgZmllbGQgdG8gYSBub256ZXJvCi0gICB2YWx1ZSAodGhlIGVxdWl2YWxlbnQgc2luZ2xlLWxldHRlciBvcHRpb24gY2hhcmFjdGVyLCBpZiB0aGVyZSBpcwotICAgb25lKS4gIEZvciBsb25nIG9wdGlvbnMgdGhhdCBoYXZlIGEgemVybyBgZmxhZycgZmllbGQsIGBnZXRvcHQnCi0gICByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgYHZhbCcgZmllbGQuICAqLwotCi1zdHJ1Y3Qgb3B0aW9uCi17Ci0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0jZWxzZQotICBjaGFyICpuYW1lOwotI2VuZGlmCi0gIC8qIGhhc19hcmcgY2FuJ3QgYmUgYW4gZW51bSBiZWNhdXNlIHNvbWUgY29tcGlsZXJzIGNvbXBsYWluIGFib3V0Ci0gICAgIHR5cGUgbWlzbWF0Y2hlcyBpbiBhbGwgdGhlIGNvZGUgdGhhdCBhc3N1bWVzIGl0IGlzIGFuIGludC4gICovCi0gIGludCBoYXNfYXJnOwotICBpbnQgKmZsYWc7Ci0gIGludCB2YWw7Ci19OwotCi0vKiBOYW1lcyBmb3IgdGhlIHZhbHVlcyBvZiB0aGUgYGhhc19hcmcnIGZpZWxkIG9mIGBzdHJ1Y3Qgb3B0aW9uJy4gICovCi0KLSNkZWZpbmUJbm9fYXJndW1lbnQJCTAKLSNkZWZpbmUgcmVxdWlyZWRfYXJndW1lbnQJMQotI2RlZmluZSBvcHRpb25hbF9hcmd1bWVudAkyCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSNpZmRlZiBfX0dOVV9MSUJSQVJZX18KLS8qIE1hbnkgb3RoZXIgbGlicmFyaWVzIGhhdmUgY29uZmxpY3RpbmcgcHJvdG90eXBlcyBmb3IgZ2V0b3B0LCB3aXRoCi0gICBkaWZmZXJlbmNlcyBpbiB0aGUgY29uc3RzLCBpbiBzdGRsaWIuaC4gIFRvIGF2b2lkIGNvbXBpbGF0aW9uCi0gICBlcnJvcnMsIG9ubHkgcHJvdG90eXBlIGdldG9wdCBmb3IgdGhlIEdOVSBDIGxpYnJhcnkuICAqLwotZXh0ZXJuIGludCBnZXRvcHQgKGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndiwgY29uc3QgY2hhciAqc2hvcnRvcHRzKTsKLSNlbHNlIC8qIG5vdCBfX0dOVV9MSUJSQVJZX18gKi8KLWV4dGVybiBpbnQgZ2V0b3B0ICgpOwotI2VuZGlmIC8qIF9fR05VX0xJQlJBUllfXyAqLwotZXh0ZXJuIGludCBnZXRvcHRfbG9uZyAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LCBjb25zdCBjaGFyICpzaG9ydG9wdHMsCi0JCSAgICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHMsIGludCAqbG9uZ2luZCk7Ci1leHRlcm4gaW50IGdldG9wdF9sb25nX29ubHkgKGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndiwKLQkJCSAgICAgY29uc3QgY2hhciAqc2hvcnRvcHRzLAotCQkgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHMsIGludCAqbG9uZ2luZCk7Ci0KLS8qIEludGVybmFsIG9ubHkuICBVc2VycyBzaG91bGQgbm90IGNhbGwgdGhpcyBkaXJlY3RseS4gICovCi1leHRlcm4gaW50IF9nZXRvcHRfaW50ZXJuYWwgKGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndiwKLQkJCSAgICAgY29uc3QgY2hhciAqc2hvcnRvcHRzLAotCQkgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHMsIGludCAqbG9uZ2luZCwKLQkJCSAgICAgaW50IGxvbmdfb25seSk7Ci0jZWxzZSAvKiBub3QgX19TVERDX18gKi8KLWV4dGVybiBpbnQgZ2V0b3B0ICgpOwotZXh0ZXJuIGludCBnZXRvcHRfbG9uZyAoKTsKLWV4dGVybiBpbnQgZ2V0b3B0X2xvbmdfb25seSAoKTsKLQotZXh0ZXJuIGludCBfZ2V0b3B0X2ludGVybmFsICgpOwotI2VuZGlmIC8qIF9fU1REQ19fICovCi0KLSNpZmRlZglfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBnZXRvcHQuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ocC1zeW10YWIuaCBiL2luY2x1ZGUvaHAtc3ltdGFiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZjU2NjguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ocC1zeW10YWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NzEgKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgYW5kIHN0cnVjdHVyZXMgZm9yIHJlYWRpbmcgZGVidWcgc3ltYm9scyBmcm9tIHRoZQotICAgbmF0aXZlIEhQIEMgY29tcGlsZXIuCi0KLSAgIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoCi0gICBhbmQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIENvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEhQX1NZTVRBQl9JTkNMVURFRAotI2RlZmluZSBIUF9TWU1UQUJfSU5DTFVERUQKLQotLyogR2VuZXJhbCBpbmZvcm1hdGlvbjoKLQotICAgVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIGFuZCBkZXNjcmliZXMgb25seSB0aGUgZGF0YSBzdHJ1Y3R1cmVzCi0gICBuZWNlc3NhcnkgdG8gcmVhZCBkZWJ1ZyBzeW1ib2xzIHByb2R1Y2VkIGJ5IHRoZSBIUCBDIGNvbXBpbGVyLAotICAgSFAgQU5TSSBDKysgY29tcGlsZXIsIGFuZCBIUCBGT1JUUkFOIDkwIGNvbXBpbGVyIHVzaW5nIHRoZQotICAgU09NIG9iamVjdCBmaWxlIGZvcm1hdC4gIAotICAgKEZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlIGRlYnVnIGZvcm1hdCwgZnRwIGhwdXgtc3ltdGFiLmggZnJvbQotICAgamFndWFyLmNzLnV0YWguZWR1Oi9kaXN0KS4KLSAgIAotICAgQWRkaXRpb25hbCBub3RlcyAoUmljaCBUaXRsZSkKLSAgIFRoaXMgZmlsZSBpcyBhIHJldmVyc2UtZW5naW5lZXJlZCB2ZXJzaW9uIG9mIGEgZmlsZSBjYWxsZWQKLSAgICJzeW10YWIuaCIgd2hpY2ggZXhpc3RzIGludGVybmFsIHRvIEhQJ3MgQ29tcHV0ZXIgTGFuZ3VhZ2VzIE9yZ2FuaXphdGlvbgotICAgaW4gL0NMTy9Db21wb25lbnRzL0RERS9vYmovc29tL3N5bXRhYi5oLiBCZWNhdXNlIEhQJ3MgdmVyc2lvbiBvZgotICAgdGhlIGZpbGUgaXMgY29weXJpZ2h0ZWQgYW5kIG5vdCBkaXN0cmlidXRlZCwgaXQgaXMgbmVjZXNzYXJ5IGZvcgotICAgR0RCIHRvIHVzZSB0aGUgcmV2ZXJzZS1lbmdpbmVlcmVkIHZlcnNpb24gdGhhdCBmb2xsb3dzLgotICAgV29yayB3YXMgZG9uZSBieSBDeWdudXMgdG8gcmV2ZXJzZS1lbmdpbmVlciB0aGUgQyBzdWJzZXQgb2Ygc3ltdGFiLmguCi0gICBUaGUgV0RCIHByb2plY3QgaGFzIGV4dGVuZGVkIHRoaXMgdG8gYWxzbyBjb250YWluIHRoZSBDKysgCi0gICBzeW1ib2wgZGVmaW5pdGlvbnMsIHRoZSBGOTAgc3ltYm9sIGRlZmluaXRpb25zLCAKLSAgIGFuZCB0aGUgRE9DIChkZWJ1Z2dpbmctb3B0aW1pemVkLWNvZGUpIHN5bWJvbCBkZWZpbml0aW9ucy4KLSAgIEluIHNvbWUgY2FzZXMgKHRoZSBDKysgc3ltYm9sIGRlZmluaXRpb25zKQotICAgSSBoYXZlIGFkZGVkIGludGVybmFsIGRvY3VtZW50YXRpb24gaGVyZSB0aGF0Ci0gICBnb2VzIGJleW9uZCB3aGF0IGlzIHN1cHBsaWVkIGluIEhQJ3Mgc3ltdGFiLmguIElmIHdlIHNvbWVkYXkKLSAgIHVuaWZ5IHRoZXNlIGZpbGVzIGFnYWluLCB0aGUgZXh0cmEgY29tbWVudHMgc2hvdWxkIGJlIG1lcmdlZCBiYWNrCi0gICBpbnRvIEhQJ3Mgc3ltdGFiLmguCi0gIAotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBEZWJ1ZyBzeW1ib2xzIGFyZSBjb250YWluZWQgZW50aXJlbHkgd2l0aGluIGFuIHVubG9hZGFibGUgc3BhY2UgY2FsbGVkCi0gICAkREVCVUckLiAgJERFQlVHJCBjb250YWlucyBzZXZlcmFsIHN1YnNwYWNlcyB3aGljaCBncm91cCByZWxhdGVkCi0gICBkZWJ1ZyBzeW1ib2xzLgotCi0gICAkR05UVCQgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIGdsb2JhbCB2YXJpYWJsZXMsIHR5cGVzIGFuZCBjb250YW50cy4KLQotICAgJExOVFQkIGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBwcm9jZWR1cmVzIChpbmNsdWRpbmcgbmVzdGluZyksIHNjb3BpbmcKLSAgIGluZm9ybWF0aW9uLCBsb2NhbCB2YXJpYWJsZXMsIHR5cGVzLCBhbmQgY29uc3RhbnRzLgotCi0gICAkU0xUJCBjb250YWlucyBzb3VyY2UgbGluZSBpbmZvcm1hdGlvbiBzbyB0aGF0IGNvZGUgYWRkcmVzc2VzIG1heSBiZQotICAgbWFwcGVkIHRvIHNvdXJjZSBsaW5lcy4KLQotICAgJFZUJCBjb250YWlucyB2YXJpb3VzIHN0cmluZ3MgYW5kIGNvbnN0YW50cyBmb3IgbmFtZWQgb2JqZWN0cyAodmFyaWFibGVzLAotICAgdHlwZWRlZnMsIGZ1bmN0aW9ucywgZXRjKS4gIFN0cmluZ3MgYXJlIHN0b3JlZCBhcyBudWxsLXRlcm1pbmF0ZWQgY2hhcmFjdGVyCi0gICBsaXN0cy4gIENvbnN0YW50cyBhbHdheXMgYmVnaW4gb24gd29yZCBib3VuZGFyaWVzLiAgVGhlIGZpcnN0IGJ5dGUgb2YKLSAgIHRoZSBWVCBtdXN0IGJlIHplcm8gKGEgbnVsbCBzdHJpbmcpLgotCi0gICAkWFQkIGlzIG5vdCBjdXJyZW50bHkgdXNlZCBieSBHREIuCi0KLSAgIE1hbnkgc3RydWN0dXJlcyB3aXRoaW4gdGhlIHN1YnNwYWNlcyBwb2ludCB0byBvdGhlciBzdHJ1Y3R1cmVzIHdpdGhpbgotICAgdGhlIHNhbWUgc3Vic3BhY2UsIG9yIHRvIHN0cnVjdHVyZXMgd2l0aGluIGEgZGlmZmVyZW50IHN1YnNwYWNlLiAgVGhlc2UKLSAgIHBvaW50ZXJzIGFyZSByZXByZXNlbnRlZCBhcyBhIHN0cnVjdHVyZSBpbmRleCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YKLSAgIHRoZSBhcHByb3ByaWF0ZSBzdWJzcGFjZS4gICovCi0KLS8qIFVzZWQgdG8gZGVzY3JpYmUgd2hlcmUgYSBjb25zdGFudCBpcyBzdG9yZWQuICAqLwotZW51bSBsb2NhdGlvbl90eXBlCi17Ci0gIExPQ0FUSU9OX0lNTUVESUFURSwKLSAgTE9DQVRJT05fUFRSLAotICBMT0NBVElPTl9WVCwKLX07Ci0KLS8qIExhbmd1YWdlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkZWJ1ZyBmb3JtYXQuICBXaXRoaW4gdGhlIGRhdGEgc3RydWN0dXJlcwotICAgdGhpcyB0eXBlIGlzIGxpbWl0ZWQgdG8gNCBiaXRzIGZvciBhIG1heGltdW0gb2YgMTYgbGFuZ3VhZ2VzLiAgKi8KLWVudW0gaHBfbGFuZ3VhZ2UKLXsKLSAgSFBfTEFOR1VBR0VfVU5LTk9XTiwKLSAgSFBfTEFOR1VBR0VfQywKLSAgSFBfTEFOR1VBR0VfRjc3LAotICBIUF9MQU5HVUFHRV9QQVNDQUwsCi0gIEhQX0xBTkdVQUdFX01PRENBTCwKLSAgSFBfTEFOR1VBR0VfQ09CT0wsCi0gIEhQX0xBTkdVQUdFX0JBU0lDLAotICBIUF9MQU5HVUFHRV9BREEsCi0gIEhQX0xBTkdVQUdFX0NQTFVTUExVUywKLSAgSFBfTEFOR1VBR0VfRE1QQVNDQUwKLX07Ci0KLQotLyogQmFzaWMgZGF0YSB0eXBlcyBhdmFpbGFibGUgaW4gdGhpcyBkZWJ1ZyBmb3JtYXQuICBXaXRoaW4gdGhlIGRhdGEKLSAgIHN0cnVjdHVyZXMgdGhpcyB0eXBlIGlzIGxpbWl0ZWQgdG8gNSBiaXRzIGZvciBhIG1heGltdW0gb2YgMzIgYmFzaWMKLSAgIGRhdGEgdHlwZXMuICAqLwotZW51bSBocF90eXBlCi17Ci0gIEhQX1RZUEVfVU5ERUZJTkVELCAvKiAwICovCi0gIEhQX1RZUEVfQk9PTEVBTiwgLyogMSAqLwotICBIUF9UWVBFX0NIQVIsIC8qIDIgKi8KLSAgSFBfVFlQRV9JTlQsIC8qIDMgKi8KLSAgSFBfVFlQRV9VTlNJR05FRF9JTlQsIC8qIDQgKi8KLSAgSFBfVFlQRV9SRUFMLCAvKiA1ICovCi0gIEhQX1RZUEVfQ09NUExFWCwgLyogNiAqLwotICBIUF9UWVBFX1NUUklORzIwMCwgLyogNyAqLwotICBIUF9UWVBFX0xPTkdTVFJJTkcyMDAsIC8qIDggKi8KLSAgSFBfVFlQRV9URVhULCAvKiA5ICovCi0gIEhQX1RZUEVfRkxBQkVMLCAvKiAxMCAqLwotICBIUF9UWVBFX0ZUTl9TVFJJTkdfU1BFQywgLyogMTEgKi8KLSAgSFBfVFlQRV9NT0RfU1RSSU5HX1NQRUMsIC8qIDEyICovCi0gIEhQX1RZUEVfUEFDS0VEX0RFQ0lNQUwsIC8qIDEzICovCi0gIEhQX1RZUEVfUkVBTF8zMDAwLCAvKiAxNCAqLwotICBIUF9UWVBFX01PRF9TVFJJTkdfMzAwMCwgLyogMTUgKi8KLSAgSFBfVFlQRV9BTllQT0lOVEVSLCAvKiAxNiAqLwotICBIUF9UWVBFX0dMT0JBTF9BTllQT0lOVEVSLCAvKiAxNyAqLwotICBIUF9UWVBFX0xPQ0FMX0FOWVBPSU5URVIsIC8qIDE4ICovCi0gIEhQX1RZUEVfQ09NUExFWFMzMDAwLCAvKiAxOSAqLwotICBIUF9UWVBFX0ZUTl9TVFJJTkdfUzMwMF9DT01QQVQsIC8qIDIwICovIAotICBIUF9UWVBFX0ZUTl9TVFJJTkdfVkFYX0NPTVBBVCwgLyogMjEgKi8KLSAgSFBfVFlQRV9CT09MRUFOX1MzMDBfQ09NUEFULCAvKiAyMiAqLwotICBIUF9UWVBFX0JPT0xFQU5fVkFYX0NPTVBBVCwgLyogMjMgKi8KLSAgSFBfVFlQRV9XSURFX0NIQVIsIC8qIDI0ICovCi0gIEhQX1RZUEVfTE9ORywgLyogMjUgKi8KLSAgSFBfVFlQRV9VTlNJR05FRF9MT05HLCAvKiAyNiAqLwotICBIUF9UWVBFX0RPVUJMRSwgLyogMjcgKi8KLSAgSFBfVFlQRV9URU1QTEFURV9BUkcsIC8qIDI4ICovCi0gIEhQX1RZUEVfVk9JRCAvKiAyOSAqLwotfTsKLQotLyogQW4gaW1tZWRpYXRlIG5hbWUgYW5kIHR5cGUgdGFibGUgZW50cnkuCi0KLSAgIGV4dGVuc2lvbiBhbmQgaW1tZWRpYXRlIHdpbGwgYWx3YXlzIGJlIG9uZS4KLSAgIGdsb2JhbCB3aWxsIGFsd2F5cyBiZSB6ZXJvLgotICAgaHBfdHlwZSBpcyB0aGUgYmFzaWMgdHlwZSB0aGlzIGVudHJ5IGRlc2NyaWJlcy4KLSAgIGJpdGxlbmd0aCBpcyB0aGUgbGVuZ3RoIGluIGJpdHMgZm9yIHRoZSBiYXNpYyB0eXBlLiAgKi8KLXN0cnVjdCBkbnR0cF9pbW1lZGlhdGUKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGltbWVkaWF0ZToJMTsKLSAgdW5zaWduZWQgaW50IGdsb2JhbDoJCTE7Ci0gIHVuc2lnbmVkIGludCB0eXBlOiAJCTU7Ci0gIHVuc2lnbmVkIGludCBiaXRsZW5ndGg6CTI0OwotfTsKLQotLyogQSBub25pbW1lZGlhdGUgbmFtZSBhbmQgdHlwZSB0YWJsZSBlbnRyeS4KLQotICAgZXh0ZW5zaW9uIHdpbGwgYWx3YXlzIGJlIG9uZS4KLSAgIGltbWVkaWF0ZSB3aWxsIGFsd2F5cyBiZSB6ZXJvLgotICAgaWYgZ2xvYmFsIGlzIHplcm8sIHRoaXMgZW50cnkgcG9pbnRzIGludG8gdGhlIExOVFQKLSAgIGlmIGdsb2JhbCBpcyBvbmUsIHRoaXMgZW50cnkgcG9pbnRzIGludG8gdGhlIEdOVFQKLSAgIGluZGV4IGlzIHRoZSBpbmRleCB3aXRoaW4gdGhlIEdOVFQgb3IgTE5UVCBmb3IgdGhpcyBlbnRyeS4gICovCi1zdHJ1Y3QgZG50dHBfbm9uaW1tZWRpYXRlCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBpbW1lZGlhdGU6CTE7Ci0gIHVuc2lnbmVkIGludCBnbG9iYWw6CQkxOwotICB1bnNpZ25lZCBpbnQgaW5kZXg6CQkyOTsKLX07Ci0KLS8qIEEgcG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgR05UVCBhbmQgTE5UVCB0YWJsZXMuICBJdCBoYXMgdHdvCi0gICBmb3JtcyBkZXBlbmRpbmcgb24gdGhlIHR5cGUgYmVpbmcgZGVzY3JpYmVkLgotCi0gICBUaGUgaW1tZWRpYXRlIGZvcm0gaXMgdXNlZCBmb3Igc2ltcGxlIGVudHJpZXMgYW5kIGlzIG9uZQotICAgd29yZC4KLQotICAgVGhlIG5vbmltbWVkaWF0ZSBmb3JtIGlzIHVzZWQgZm9yIGNvbXBsZXggZW50cmllcyBhbmQgY29udGFpbnMKLSAgIGFuIGluZGV4IGludG8gdGhlIExOVFQgb3IgR05UVCB3aGljaCBkZXNjcmliZXMgdGhlIGVudGlyZSB0eXBlLgotCi0gICBJZiBhIGRudHRwb2ludGVyIGlzIC0xLCB0aGVuIGl0IGlzIGEgTklMIGVudHJ5LiAgKi8KLQotI2RlZmluZSBETlRUTklMICgtMSkKLXR5cGVkZWYgdW5pb24gZG50dHBvaW50ZXIKLXsKLSAgc3RydWN0IGRudHRwX2ltbWVkaWF0ZSAgICBkbnR0aTsKLSAgc3RydWN0IGRudHRwX25vbmltbWVkaWF0ZSBkbnR0cDsKLSAgaW50IHdvcmQ7Ci19IGRudHRwb2ludGVyOwotCi0vKiBBbiBpbmRleCBpbnRvIHRoZSBzb3VyY2UgbGluZSB0YWJsZS4gIEFzIHdpdGggZG50dHBvaW50ZXJzLCBhIHNsdHBvaW50ZXIKLSAgIG9mIC0xIGluZGljYXRlcyBhIE5JTCBlbnRyeS4gICovCi0jZGVmaW5lIFNMVE5JTCAoLTEpCi10eXBlZGVmIGludCBzbHRwb2ludGVyOwotCi0vKiBJbmRleCBpbnRvIERPQyAoPSAiRGVidWdnaW5nIE9wdGltaXplZCBDb2RlIikgbGluZSB0YWJsZSAqLwotI2RlZmluZSBMVE5JTCAoLTEpCi10eXBlZGVmIGludCBsdHBvaW50ZXI7Ci0KLS8qIEluZGV4IGludG8gY29udGV4dCB0YWJsZSAqLwotI2RlZmluZSBDVFhUTklMICgtMSkKLXR5cGVkZWYgaW50IGN0eHRwb2ludGVyOwotCi0vKiBVbnNpZ25lZCBieXRlIG9mZnNldCBpbnRvIHRoZSBWVC4gICovCi10eXBlZGVmIHVuc2lnbmVkIGludCB2dHBvaW50ZXI7Ci0KLS8qIEEgRE5UVCBlbnRyeSAodXNlZCB3aXRoaW4gdGhlIEdOVFQgYW5kIExOVFQpLgotCi0gICBETlRUIGVudHJpZXMgYXJlIHZhcmlhYmxlIHNpemVkIG9iamVjdHMsIGJ1dCBhcmUgYWx3YXlzIGEgbXVsdGlwbGUKLSAgIG9mIDMgd29yZHMgKHdlIGNhbGwgZWFjaCBncm91cCBvZiAzIHdvcmRzIGEgImJsb2NrIikuCi0KLSAgIFRoZSBmaXJzdCBiaXQgaW4gZWFjaCBibG9jayBpcyBhbiBleHRlbnNpb24gYml0LiAgVGhpcyBiaXQgaXMgemVybwotICAgZm9yIHRoZSBmaXJzdCBibG9jayBvZiBhIEROVFQgZW50cnkuICBJZiB0aGUgZW50cnkgcmVxdWlyZXMgbW9yZQotICAgdGhhbiBvbmUgYmxvY2ssIHRoZW4gdGhpcyBiaXQgaXMgc2V0IHRvIG9uZSBpbiBhbGwgYmxvY2tzIGFmdGVyCi0gICB0aGUgZmlyc3Qgb25lLiAgKi8KLQotLyogRWFjaCBETlRUIGVudHJ5IGRlc2NyaWJlcyBhIHBhcnRpY3VsYXIgZGVidWcgc3ltYm9sIChiZWdpbm5pbmcgb2YKLSAgIGEgc291cmNlIGZpbGUsIGEgZnVuY3Rpb24sIHZhcmlhYmxlcywgc3RydWN0dXJlcywgZXRjLgotCi0gICBUaGUgdHlwZSBvZiB0aGUgRE5UVCBlbnRyeSBpcyBzdG9yZWQgaW4gdGhlICJraW5kIiBmaWVsZCB3aXRoaW4gdGhlCi0gICBETlRUIGVudHJ5IGl0c2VsZi4gICovCi0KLWVudW0gZG50dF9lbnRyeV90eXBlCi17Ci0gIEROVFRfVFlQRV9OSUwgPSAtMSwKLSAgRE5UVF9UWVBFX1NSQ0ZJTEUsCi0gIEROVFRfVFlQRV9NT0RVTEUsCi0gIEROVFRfVFlQRV9GVU5DVElPTiwKLSAgRE5UVF9UWVBFX0VOVFJZLAotICBETlRUX1RZUEVfQkVHSU4sCi0gIEROVFRfVFlQRV9FTkQsCi0gIEROVFRfVFlQRV9JTVBPUlQsCi0gIEROVFRfVFlQRV9MQUJFTCwKLSAgRE5UVF9UWVBFX0ZQQVJBTSwKLSAgRE5UVF9UWVBFX1NWQVIsCi0gIEROVFRfVFlQRV9EVkFSLAotICBETlRUX1RZUEVfSE9MRTEsCi0gIEROVFRfVFlQRV9DT05TVCwKLSAgRE5UVF9UWVBFX1RZUEVERUYsCi0gIEROVFRfVFlQRV9UQUdERUYsCi0gIEROVFRfVFlQRV9QT0lOVEVSLAotICBETlRUX1RZUEVfRU5VTSwKLSAgRE5UVF9UWVBFX01FTUVOVU0sCi0gIEROVFRfVFlQRV9TRVQsCi0gIEROVFRfVFlQRV9TVUJSQU5HRSwKLSAgRE5UVF9UWVBFX0FSUkFZLAotICBETlRUX1RZUEVfU1RSVUNULAotICBETlRUX1RZUEVfVU5JT04sCi0gIEROVFRfVFlQRV9GSUVMRCwKLSAgRE5UVF9UWVBFX1ZBUklBTlQsCi0gIEROVFRfVFlQRV9GSUxFLAotICBETlRUX1RZUEVfRlVOQ1RZUEUsCi0gIEROVFRfVFlQRV9XSVRILAotICBETlRUX1RZUEVfQ09NTU9OLAotICBETlRUX1RZUEVfQ09CU1RSVUNULAotICBETlRUX1RZUEVfWFJFRiwKLSAgRE5UVF9UWVBFX1NBLAotICBETlRUX1RZUEVfTUFDUk8sCi0gIEROVFRfVFlQRV9CTE9DS0RBVEEsCi0gIEROVFRfVFlQRV9DTEFTU19TQ09QRSwKLSAgRE5UVF9UWVBFX1JFRkVSRU5DRSwKLSAgRE5UVF9UWVBFX1BUUk1FTSwKLSAgRE5UVF9UWVBFX1BUUk1FTUZVTkMsCi0gIEROVFRfVFlQRV9DTEFTUywKLSAgRE5UVF9UWVBFX0dFTkZJRUxELAotICBETlRUX1RZUEVfVkZVTkMsCi0gIEROVFRfVFlQRV9NRU1BQ0NFU1MsCi0gIEROVFRfVFlQRV9JTkhFUklUQU5DRSwKLSAgRE5UVF9UWVBFX0ZSSUVORF9DTEFTUywKLSAgRE5UVF9UWVBFX0ZSSUVORF9GVU5DLAotICBETlRUX1RZUEVfTU9ESUZJRVIsCi0gIEROVFRfVFlQRV9PQkpFQ1RfSUQsCi0gIEROVFRfVFlQRV9NRU1GVU5DLAotICBETlRUX1RZUEVfVEVNUExBVEUsCi0gIEROVFRfVFlQRV9URU1QTEFURV9BUkcsCi0gIEROVFRfVFlQRV9GVU5DX1RFTVBMQVRFLAotICBETlRUX1RZUEVfTElOSywKLSAgRE5UVF9UWVBFX0RZTl9BUlJBWV9ERVNDLAotICBETlRUX1RZUEVfREVTQ19TVUJSQU5HRSwKLSAgRE5UVF9UWVBFX0JFR0lOX0VYVCwKLSAgRE5UVF9UWVBFX0lOTE4sCi0gIEROVFRfVFlQRV9JTkxOX0xJU1QsCi0gIEROVFRfVFlQRV9BTElBUywKLSAgRE5UVF9UWVBFX0RPQ19GVU5DVElPTiwKLSAgRE5UVF9UWVBFX0RPQ19NRU1GVU5DLAotICBETlRUX1RZUEVfTUFYCi19OwotCi0vKiBETlRUX1RZUEVfU1JDRklMRToKLQotICAgT25lIEROVFRfVFlQRV9TUkNGSUxFIHN5bWJvbCBpcyBvdXRwdXQgZm9yIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZQotICAgZmlsZSBhbmQgYXQgdGhlIGJlZ2luIGFuZCBlbmQgb2YgYW4gaW5jbHVkZWQgZmlsZS4gIEEgRE5UVF9UWVBFX1NSQ0ZJTEUKLSAgIGVudHJ5IGlzIGFsc28gb3V0cHV0IGJlZm9yZSBlYWNoIEROVFRfVFlQRV9GVU5DIHN5bWJvbCBzbyB0aGF0IGRlYnVnZ2VycwotICAgY2FuIGRldGVybWluZSB3aGF0IGZpbGUgYSBmdW5jdGlvbiB3YXMgZGVmaW5lZCBpbi4KLQotICAgTEFOR1VBR0UgZGVzY3JpYmVzIHRoZSBzb3VyY2UgZmlsZSdzIGxhbmd1YWdlLgotCi0gICBOQU1FIHBvaW50cyB0byBhbiBWVCBlbnRyeSBwcm92aWRpbmcgdGhlIHNvdXJjZSBmaWxlJ3MgbmFtZS4KLQotICAgTm90ZSB0aGUgbmFtZSB1c2VkIGZvciBETlRUX1RZUEVfU1JDRklMRSBlbnRyaWVzIGFyZSBleGFjdGx5IGFzIHNlZW4KLSAgIGJ5IHRoZSBjb21waWxlciAoaWUgdGhleSBtYXkgYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUpLiAgQyBpbmNsdWRlIGZpbGVzCi0gICB2aWEgPD4gaW5jbHVzaW9uIG11c3QgdXNlIGFic29sdXRlIHBhdGhzLgotCi0gICBBRERSRVNTIHBvaW50cyB0byBhbiBTTFQgZW50cnkgZnJvbSB3aGljaCBsaW5lIG51bWJlciBhbmQgY29kZSBsb2NhdGlvbnMKLSAgIG1heSBiZSBkZXRlcm1pbmVkLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV9zcmNmaWxlCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7ICAgIC8qIEROVFRfVFlQRV9TUkNGSUxFICovCi0gIHVuc2lnbmVkIGludCBsYW5ndWFnZToJNDsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE3OwotICB2dHBvaW50ZXIgbmFtZTsKLSAgc2x0cG9pbnRlciBhZGRyZXNzOwotfTsKLQotLyogRE5UVF9UWVBFX01PRFVMRToKLQotICAgQSBETlRUX1RZUEVfTU9EVUxFIHN5bWJvbCBpcyBlbWl0dGVkIGZvciB0aGUgc3RhcnQgb2YgYSBwYXNjYWwKLSAgIG1vZHVsZSBvciBDIHNvdXJjZSBmaWxlLiBBIG1vZHVsZSBpbmRpY2F0ZXMgYSBjb21waWxhdGlvbiB1bml0Ci0gICBmb3IgbmFtZS1zY29waW5nIHB1cnBvc2VzOyBpbiB0aGF0IHJlZ2FyZCB0aGVyZSBzaG91bGQgYmUgCi0gICBhIDEtMSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIEdEQiAic3ltdGFiIidzIGFuZCBNT0RVTEUgc3ltYm9sIHJlY29yZHMuCi0KLSAgIEVhY2ggRE5UVF9UWVBFX01PRFVMRSBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBETlRUX1RZUEVfRU5EIHN5bWJvbC4KLQotICAgTkFNRSBwb2ludHMgdG8gYSBWVCBlbnRyeSBwcm92aWRpbmcgdGhlIG1vZHVsZSdzIG5hbWUuICBOb3RlIEMKLSAgIHNvdXJjZSBmaWxlcyBhcmUgY29uc2lkZXJlZCBuYW1lbGVzcyBtb2R1bGVzLgotCi0gICBBTElBUyBwb2ludCB0byBhIFZUIGVudHJ5IHByb3ZpZGluZyBhIHNlY29uZGFyeSBuYW1lLgotCi0gICBBRERSRVNTIHBvaW50cyB0byBhbiBTTFQgZW50cnkgZnJvbSB3aGljaCBsaW5lIG51bWJlciBhbmQgY29kZSBsb2NhdGlvbnMKLSAgIG1heSBiZSBkZXRlcm1pbmVkLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV9tb2R1bGUKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsgCS8qIEROVFRfVFlQRV9NT0RVTEUgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTIxOwotICB2dHBvaW50ZXIgbmFtZTsKLSAgdnRwb2ludGVyIGFsaWFzOwotICBkbnR0cG9pbnRlciB1bnVzZWQyOwotICBzbHRwb2ludGVyIGFkZHJlc3M7Ci19OwotCi0vKiBETlRUX1RZUEVfRlVOQ1RJT04sCi0gICBETlRUX1RZUEVfRU5UUlksCi0gICBETlRUX1RZUEVfQkxPQ0tEQVRBLAotICAgRE5UVF9UWVBFX01FTUZVTkM6Ci0KLSAgIEEgRE5UVF9UWVBFX0ZVTkNUSU9OIHN5bWJvbCBpcyBlbWl0dGVkIGZvciBlYWNoIGZ1bmN0aW9uIGRlZmluaXRpb247Ci0gICBhIEROVFRfVFlQRV9FTlRSWSBzeW1ib2xzIGlzIHVzZWQgZm9yIHNlY29uZGFyeSBlbnRyeSBwb2ludHMuICBCb3RoCi0gICBzeW1ib2xzIHVzZWQgdGhlIGRudHRfdHlwZV9mdW5jdGlvbiBzdHJ1Y3R1cmUuCi0gICBBIEROVFRfVFlQRV9CTE9DS0RBVEEgc3ltYm9sIGlzIGVtaXR0ZWQgLi4uPwotICAgQSBETlRUX1RZUEVfTUVNRlVOQyBzeW1ib2wgaXMgZW1pdHRlZCBmb3IgaW5saW5lZCBtZW1iZXIgZnVuY3Rpb25zIChDKyspLiAKLQotICAgRWFjaCBvZiBETlRUX1RZUEVfRlVOQ1RJT04gbXVzdCBoYXZlIGEgbWF0Y2hpbmcgRE5UVF9UWVBFX0VORC4KLQotICAgR0xPQkFMIGlzIG5vbnplcm8gaWYgdGhlIGZ1bmN0aW9uIGhhcyBnbG9iYWwgc2NvcGUuCi0KLSAgIExBTkdVQUdFIGRlc2NyaWJlcyB0aGUgZnVuY3Rpb24ncyBzb3VyY2UgbGFuZ3VhZ2UuCi0KLSAgIE9QVF9MRVZFTCBkZXNjcmliZXMgdGhlIG9wdGltaXphdGlvbiBsZXZlbCB0aGUgZnVuY3Rpb24gd2FzIGNvbXBpbGVkCi0gICB3aXRoLgotCi0gICBWQVJBUkdTIGlzIG5vbnplcm8gaWYgdGhlIGZ1bmN0aW9uIHVzZXMgdmFyYXJncy4KLQotICAgTkFNRSBwb2ludHMgdG8gYSBWVCBlbnRyeSBwcm92aWRpbmcgdGhlIGZ1bmN0aW9uJ3MgbmFtZS4KLQotICAgQUxJQVMgcG9pbnRzIHRvIGEgVlQgZW50cnkgcHJvdmlkaW5nIGEgc2Vjb25kYXJ5IG5hbWUgZm9yIHRoZSBmdW5jdGlvbi4KLQotICAgRklSU1RQQVJBTSBwb2ludHMgdG8gYSBMTlRUIGVudHJ5IHdoaWNoIGRlc2NyaWJlcyB0aGUgcGFyYW1ldGVyIGxpc3QuCi0KLSAgIEFERFJFU1MgcG9pbnRzIHRvIGFuIFNMVCBlbnRyeSBmcm9tIHdoaWNoIGxpbmUgbnVtYmVyIGFuZCBjb2RlIGxvY2F0aW9ucwotICAgbWF5IGJlIGRldGVybWluZWQuCi0KLSAgIEVOVFJZQUREUiBpcyB0aGUgbWVtb3J5IGFkZHJlc3MgY29ycmVzcG9uZGluZyB0aGUgdGhlIGZ1bmN0aW9uJ3MgZW50cnkgcG9pbnQKLQotICAgUkVUVkFMIHBvaW50cyB0byBhIExOVFQgZW50cnkgZGVzY3JpYmluZyB0aGUgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUuCi0KLSAgIExPV0FERFIgaXMgdGhlIGxvd2VzdCBtZW1vcnkgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBmdW5jdGlvbi4KLQotICAgSElBRERSIGlzIHRoZSBoaWdoZXN0IG1lbW9yeSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV9mdW5jdGlvbgotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOwkvKiBETlRUX1RZUEVfRlVOQ1RJT04sCi0JCQkJICAgICAgICAgICBETlRUX1RZUEVfRU5UUlksCi0JCQkJCSAgIEROVFRfVFlQRV9CTE9DS0RBVEEKLQkJCQkJICAgb3IgRE5UVF9UWVBFX01FTUZVTkMgKi8KLSAgdW5zaWduZWQgaW50IGdsb2JhbDoJCTE7Ci0gIHVuc2lnbmVkIGludCBsYW5ndWFnZToJNDsKLSAgdW5zaWduZWQgaW50IG5lc3RfbGV2ZWw6CTU7Ci0gIHVuc2lnbmVkIGludCBvcHRfbGV2ZWw6CTI7Ci0gIHVuc2lnbmVkIGludCB2YXJhcmdzOgkJMTsKLSAgdW5zaWduZWQgaW50IGxhbmdfaW5mbzoJNDsKLSAgdW5zaWduZWQgaW50IGlubGluZWQ6CQkxOwotICB1bnNpZ25lZCBpbnQgbG9jYWxhbGxvYzoJMTsKLSAgdW5zaWduZWQgaW50IGV4cGFuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICB2dHBvaW50ZXIgYWxpYXM7Ci0gIGRudHRwb2ludGVyIGZpcnN0cGFyYW07Ci0gIHNsdHBvaW50ZXIgYWRkcmVzczsKLSAgQ09SRV9BRERSIGVudHJ5YWRkcjsKLSAgZG50dHBvaW50ZXIgcmV0dmFsOwotICBDT1JFX0FERFIgbG93YWRkcjsKLSAgQ09SRV9BRERSIGhpYWRkcjsKLX07Ci0KLS8qIEROVFRfVFlQRV9CRUdJTjoKLQotICAgQSBETlRUX1RZUEVfQkVHSU4gc3ltYm9sIGlzIGVtaXR0ZWQgdG8gYmVnaW4gYSBuZXcgbmVzdGVkIHNjb3BlLgotICAgRXZlcnkgRE5UVF9UWVBFX0JFR0lOIHN5bWJvbCBtdXN0IGhhdmUgYSBtYXRjaGluZyBETlRUX1RZUEVfRU5EIHN5bWJvbC4KLQotICAgQ0xBU1NGTEFHIGlzIG5vbnplcm8gaWYgdGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIGEgYysrIGNsYXNzIGRlZmluaXRpb24uCi0KLSAgIEFERFJFU1MgcG9pbnRzIHRvIGFuIFNMVCBlbnRyeSBmcm9tIHdoaWNoIGxpbmUgbnVtYmVyIGFuZCBjb2RlIGxvY2F0aW9ucwotICAgbWF5IGJlIGRldGVybWluZWQuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2JlZ2luCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7Ci0gIHVuc2lnbmVkIGludCBjbGFzc2ZsYWc6CTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkyMDsKLSAgc2x0cG9pbnRlciBhZGRyZXNzOwotfTsKLQotLyogRE5UVF9UWVBFX0VORDoKLQotICAgQSBETlRUX1RZUEVfRU5EIHN5bWJvbCBpcyBlbWl0dGVkIHdoZW4gY2xvc2luZyBhIHNjb3BlIHN0YXJ0ZWQgYnkKLSAgIGEgRE5UVF9UWVBFX01PRFVMRSwgRE5UVF9UWVBFX0ZVTkNUSU9OLCBETlRUX1RZUEVfV0lUSCwKLSAgIEROVFRfVFlQRV9DT01NT04sIEROVFRfVFlQRV9CRUdJTiwgYW5kIEROVFRfVFlQRV9DTEFTU19TQ09QRSBzeW1ib2xzLgotCi0gICBFTkRLSU5EIGRlc2NyaWJlcyB3aGF0IHR5cGUgb2Ygc2NvcGUgdGhlIEROVFRfVFlQRV9FTkQgaXMgY2xvc2luZwotICAgKG9uZSBvZiB0aGUgYWJvdmUgNiBraW5kcykuCi0KLSAgIENMQVNTRkxBRyBpcyBub256ZXJvIGlmIHRoaXMgaXMgdGhlIGVuZCBvZiBhIGMrKyBjbGFzcyBkZWZpbml0aW9uLgotCi0gICBBRERSRVNTIHBvaW50cyB0byBhbiBTTFQgZW50cnkgZnJvbSB3aGljaCBsaW5lIG51bWJlciBhbmQgY29kZSBsb2NhdGlvbnMKLSAgIG1heSBiZSBkZXRlcm1pbmVkLgotCi0gICBCRUdJTlNDT1BFIHBvaW50cyB0byB0aGUgTE5UVCBlbnRyeSB3aGljaCBvcGVuZWQgdGhlIHNjb3BlLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV9lbmQKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IGVuZGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IGNsYXNzZmxhZzoJMTsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTEwOwotICBzbHRwb2ludGVyIGFkZHJlc3M7Ci0gIGRudHRwb2ludGVyIGJlZ2luc2NvcGU7Ci19OwotCi0vKiBETlRUX1RZUEVfSU1QT1JUIGlzIHVudXNlZCBieSBHREIuICAqLwotLyogRE5UVF9UWVBFX0xBQkVMIGlzIHVudXNlZCBieSBHREIuICAqLwotCi0vKiBETlRUX1RZUEVfRlBBUkFNOgotCi0gICBBIEROVFRfVFlQRV9GUEFSQU0gc3ltYm9sIGlzIGVtaXR0ZWQgZm9yIGEgZnVuY3Rpb24gYXJndW1lbnQuICBXaGVuCi0gICBjaGFpbmVkIHRvZ2V0aGVyIHRoZSBzeW1ib2xzIHJlcHJlc2VudCBhbiBhcmd1bWVudCBsaXN0IGZvciBhIGZ1bmN0aW9uLgotCi0gICBSRUdQQVJBTSBpcyBub256ZXJvIGlmIHRoaXMgcGFyYW1ldGVyIHdhcyBwYXNzZWQgaW4gYSByZWdpc3Rlci4KLQotICAgSU5ESVJFQ1QgaXMgbm9uemVybyBpZiB0aGlzIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlcgotICAgKHBhc3MgYnkgcmVmZXJlbmNlIG9yIHBhc3MgYnkgdmFsdWUgZm9yIGxhcmdlIGl0ZW1zKS4KLQotICAgTE9OR0FERFIgaXMgbm9uemVybyBpZiB0aGUgcGFyYW1ldGVyIGlzIGEgNjRiaXQgcG9pbnRlci4KLQotICAgTkFNRSBpcyBhIHBvaW50ZXIgaW50byB0aGUgVlQgZm9yIHRoZSBwYXJhbWV0ZXIncyBuYW1lLgotCi0gICBMT0NBVElPTiBkZXNjcmliZXMgd2hlcmUgdGhlIHBhcmFtZXRlciBpcyBzdG9yZWQuICBEZXBlbmRpbmcgb24gdGhlCi0gICBwYXJhbWV0ZXIgdHlwZSBMT0NBVElPTiBjb3VsZCBiZSBhIHJlZ2lzdGVyIG51bWJlciwgb3IgYW4gb2Zmc2V0Ci0gICBmcm9tIHRoZSBzdGFjayBwb2ludGVyLgotCi0gICBUWVBFIHBvaW50cyB0byBhIE5UVCBlbnRyeSBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyLgotCi0gICBORVhUUEFSQU0gcG9pbnRzIHRvIHRoZSBMTlRUIGVudHJ5IGRlc2NyaWJpbmcgdGhlIG5leHQgcGFyYW1ldGVyLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV9mcGFyYW0KLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IHJlZ3BhcmFtOgkxOwotICB1bnNpZ25lZCBpbnQgaW5kaXJlY3Q6CTE7Ci0gIHVuc2lnbmVkIGludCBsb25nYWRkcjoJMTsKLSAgdW5zaWduZWQgaW50IGNvcHlwYXJhbToJMTsKLSAgdW5zaWduZWQgaW50IGRmbHQ6CQkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTY7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICBpbnQgbG9jYXRpb247Ci0gIGRudHRwb2ludGVyIHR5cGU7Ci0gIGRudHRwb2ludGVyIG5leHRwYXJhbTsKLSAgaW50IG1pc2M7Ci19OwotCi0vKiBETlRUX1RZUEVfU1ZBUjoKLQotICAgQSBETlRUX1RZUEVfU1ZBUiBpcyBlbWl0dGVkIHRvIGRlc2NyaWJlIGEgdmFyaWFibGUgaW4gc3RhdGljIHN0b3JhZ2UuCi0KLSAgIEdMT0JBTCBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBoYXMgZ2xvYmFsIHNjb3BlLgotCi0gICBJTkRJUkVDVCBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0LgotCi0gICBMT05HQUREUiBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBpcyBpbiBsb25nIHBvaW50ZXIgc3BhY2UuCi0KLSAgIFNUQVRJQ01FTSBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBpcyBhIG1lbWJlciBvZiBhIGNsYXNzLgotCi0gICBBX1VOSU9OIGlzIG5vbnplcm8gaWYgdGhlIHZhcmlhYmxlIGlzIGFuIGFub255bW91cyB1bmlvbiBtZW1iZXIuCi0KLSAgIE5BTUUgaXMgYSBwb2ludGVyIGludG8gdGhlIFZUIGZvciB0aGUgdmFyaWFibGUncyBuYW1lLgotCi0gICBMT0NBVElPTiBwcm92aWRlcyB0aGUgbWVtb3J5IGFkZHJlc3MgZm9yIHRoZSB2YXJpYWJsZS4KLQotICAgVFlQRSBpcyBhIHBvaW50ZXIgaW50byBlaXRoZXIgdGhlIEdOVFQgb3IgTE5UVCB3aGljaCBkZXNjcmliZXMKLSAgIHRoZSB0eXBlIG9mIHRoaXMgdmFyaWFibGUuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3N2YXIKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IGdsb2JhbDoJCTE7Ci0gIHVuc2lnbmVkIGludCBpbmRpcmVjdDoJMTsKLSAgdW5zaWduZWQgaW50IGxvbmdhZGRyOgkxOwotICB1bnNpZ25lZCBpbnQgc3RhdGljbWVtOgkxOwotICB1bnNpZ25lZCBpbnQgYV91bmlvbjoJCTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQxOiAgICAgICAgIDE7Ci0gIHVuc2lnbmVkIGludCB0aHJlYWRfc3BlY2lmaWM6IDE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQyOiAgICAgICAgIDE0OwotICB2dHBvaW50ZXIgbmFtZTsKLSAgQ09SRV9BRERSIGxvY2F0aW9uOwotICBkbnR0cG9pbnRlciB0eXBlOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgZGlzcGxhY2VtZW50OwotfTsKLQotLyogRE5UVF9UWVBFX0RWQVI6Ci0KLSAgIEEgRE5UVF9UWVBFX0RWQVIgaXMgZW1pdHRlZCB0byBkZXNjcmliZSBhdXRvbWF0aWMgdmFyaWFibGVzIGFuZCB2YXJpYWJsZXMKLSAgIGhlbGQgaW4gcmVnaXN0ZXJzLgotCi0gICBHTE9CQUwgaXMgbm9uemVybyBpZiB0aGUgdmFyaWFibGUgaGFzIGdsb2JhbCBzY29wZS4KLQotICAgSU5ESVJFQ1QgaXMgbm9uemVybyBpZiB0aGUgdmFyaWFibGUgaXMgYSBwb2ludGVyIHRvIGFuIG9iamVjdC4KLQotICAgUkVHVkFSIGlzIG5vbnplcm8gaWYgdGhlIHZhcmlhYmxlIGlzIGluIGEgcmVnaXN0ZXIuCi0KLSAgIEFfVU5JT04gaXMgbm9uemVybyBpZiB0aGUgdmFyaWFibGUgaXMgYW4gYW5vbnltb3VzIHVuaW9uIG1lbWJlci4KLQotICAgTkFNRSBpcyBhIHBvaW50ZXIgaW50byB0aGUgVlQgZm9yIHRoZSB2YXJpYWJsZSdzIG5hbWUuCi0KLSAgIExPQ0FUSU9OIHByb3ZpZGVzIHRoZSBtZW1vcnkgYWRkcmVzcyBvciByZWdpc3RlciBudW1iZXIgZm9yIHRoZSB2YXJpYWJsZS4KLQotICAgVFlQRSBpcyBhIHBvaW50ZXIgaW50byBlaXRoZXIgdGhlIEdOVFQgb3IgTE5UVCB3aGljaCBkZXNjcmliZXMKLSAgIHRoZSB0eXBlIG9mIHRoaXMgdmFyaWFibGUuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2R2YXIKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IGdsb2JhbDoJCTE7Ci0gIHVuc2lnbmVkIGludCBpbmRpcmVjdDoJMTsKLSAgdW5zaWduZWQgaW50IHJlZ3ZhcjoJCTE7Ci0gIHVuc2lnbmVkIGludCBhX3VuaW9uOgkJMTsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE3OwotICB2dHBvaW50ZXIgbmFtZTsKLSAgaW50IGxvY2F0aW9uOwotICBkbnR0cG9pbnRlciB0eXBlOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotfTsKLQotLyogRE5UVF9UWVBFX0NPTlNUOgotCi0gICBBIEROVFRfVFlQRV9DT05TVCBzeW1ib2wgaXMgZW1pdHRlZCBmb3IgcHJvZ3JhbSBjb25zdGFudHMuCi0KLSAgIEdMT0JBTCBpcyBub256ZXJvIGlmIHRoZSBjb25zdGFudCBoYXMgZ2xvYmFsIHNjb3BlLgotCi0gICBJTkRJUkVDVCBpcyBub256ZXJvIGlmIHRoZSBjb25zdGFudCBpcyBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0LgotCi0gICBMT0NBVElPTl9UWVBFIGRlc2NyaWJlcyB3aGVyZSB0byBmaW5kIHRoZSBjb25zdGFudCdzIHZhbHVlCi0gICAoaW4gdGhlIFZULCBtZW1vcnksIG9yIGVtYmVkZGVkIGluIGFuIGluc3RydWN0aW9uKS4KLQotICAgQ0xBU1NNRU0gaXMgbm9uemVybyBpZiB0aGUgY29uc3RhbnQgaXMgYSBtZW1iZXIgb2YgYSBjbGFzcy4KLQotICAgTkFNRSBpcyBhIHBvaW50ZXIgaW50byB0aGUgVlQgZm9yIHRoZSBjb25zdGFudCdzIG5hbWUuCi0KLSAgIExPQ0FUSU9OIHByb3ZpZGVzIHRoZSBtZW1vcnkgYWRkcmVzcywgcmVnaXN0ZXIgbnVtYmVyIG9yIHBvaW50ZXIKLSAgIGludG8gdGhlIFZUIGZvciB0aGUgY29uc3RhbnQncyB2YWx1ZS4KLQotICAgVFlQRSBpcyBhIHBvaW50ZXIgaW50byBlaXRoZXIgdGhlIEdOVFQgb3IgTE5UVCB3aGljaCBkZXNjcmliZXMKLSAgIHRoZSB0eXBlIG9mIHRoaXMgdmFyaWFibGUuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2NvbnN0Ci17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7Ci0gIHVuc2lnbmVkIGludCBnbG9iYWw6CQkxOwotICB1bnNpZ25lZCBpbnQgaW5kaXJlY3Q6CTE7Ci0gIHVuc2lnbmVkIGludDoJCQkzOwotICB1bnNpZ25lZCBpbnQgY2xhc3NtZW06CTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxNTsKLSAgdnRwb2ludGVyIG5hbWU7Ci0gIENPUkVfQUREUiBsb2NhdGlvbjsKLSAgZG50dHBvaW50ZXIgdHlwZTsKLSAgdW5zaWduZWQgaW50IG9mZnNldDsKLSAgdW5zaWduZWQgaW50IGRpc3BsYWNlbWVudDsKLX07Ci0KLS8qIEROVFRfVFlQRV9UWVBFREVGIGFuZCBETlRUX1RZUEVfVEFHREVGOgotCi0gICBUaGUgc2FtZSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZXNjcmliZSB0eXBlZGVmcyBhbmQgdGFnZGVmcy4KLQotICAgRE5UVF9UWVBFX1RZUEVERUZTIGFyZSBhc3NvY2lhdGVkIHdpdGggQyAidHlwZWRlZnMiLgotCi0gICBETlRUX1RZUEVfVEFHREVGcyBhcmUgYXNzb2NpYXRlZCB3aXRoIEMgInN0cnVjdCIsICJ1bmlvbiIsIGFuZCAiZW51bSIKLSAgIHRhZ3MsIHdoaWNoIG1heSBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYSB0eXBlZGVmIGluIHRoZSBzYW1lIHNjb3BlLgotICAgQWxzbyB0aGV5IGFyZSBhc3NvY2lhdGVkIHdpdGggQysrICJjbGFzcyIgdGFncywgd2hpY2ggaW1wbGljaXRseSBoYXZlIAotICAgdGhlIHNhbWUgbmFtZSBhcyB0aGUgY2xhc3MgdHlwZS4KLQotICAgR0xPQkFMIGlzIG5vbnplcm8gaWYgdGhlIHR5cGVkZWYvdGFnZGVmIGhhcyBnbG9iYWwgc2NvcGUuCi0KLSAgIFRZUEVJTkZPIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGZ1bGwgdHlwZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUKLSAgIGZvciBhIHRhZy4gICh1c3VhbGx5IDEsIGJ1dCBjYW4gYmUgemVybyBmb3Igb3BhcXVlIHR5cGVzIGluIEMpLgotCi0gICBOQU1FIGlzIGEgcG9pbnRlciBpbnRvIHRoZSBWVCBmb3IgdGhlIGNvbnN0YW50J3MgbmFtZS4KLQotICAgVFlQRSBwb2ludHMgdG8gdGhlIHVuZGVybHlpbmcgdHlwZSBmb3IgdGhlIHR5cGVkZWYvdGFnZGVmIGluIHRoZQotICAgR05UVCBvciBMTlRULiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV90eXBlCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7ICAgIC8qIEROVFRfVFlQRV9UWVBFREVGIG9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE5UVF9UWVBFX1RBR0RFRiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsOgkJMTsKLSAgdW5zaWduZWQgaW50IHR5cGVpbmZvOgkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTk7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICBkbnR0cG9pbnRlciB0eXBlOyAgICAgICAgICAgICAgICAgICAgLyogVW5kZXJseWluZyB0eXBlLCB3aGljaCBmb3IgVEFHREVGJ3MgbWF5IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBETlRUX1RZUEVfU1RSVUNULCBETlRUX1RZUEVfVU5JT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBETlRUX1RZUEVfRU5VTSwgb3IgRE5UVF9UWVBFX0NMQVNTLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEZvciBUWVBFREVGJ3Mgb3RoZXIgdW5kZXJseWluZyB0eXBlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXJlIGFsc28gcG9zc2libGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX07Ci0KLS8qIEROVFRfVFlQRV9QT0lOVEVSOgotCi0gICBVc2VkIHRvIGRlc2NyaWJlIGEgcG9pbnRlciB0byBhbiB1bmRlcmx5aW5nIHR5cGUuCi0KLSAgIFBPSU5UU1RPIGlzIGEgcG9pbnRlciBpbnRvIHRoZSBHTlRUIG9yIExOVFQgZm9yIHRoZSB0eXBlIHdoaWNoIHRoaXMKLSAgIHBvaW50ZXIgcG9pbnRzIHRvLgotCi0gICBCSVRMRU5HVEggaXMgdGhlIGxlbmd0aCBvZiB0aGUgcG9pbnRlciAobm90IHRoZSB1bmRlcmx5aW5nIHR5cGUpLiAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3BvaW50ZXIKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTIxOwotICBkbnR0cG9pbnRlciBwb2ludHN0bzsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLX07Ci0KLQotLyogRE5UVF9UWVBFX0VOVU06Ci0KLSAgIFVzZWQgdG8gZGVzY3JpYmUgZW51bWVyYXRlZCB0eXBlcy4KLQotICAgRklSU1RNRU0gaXMgYSBwb2ludGVyIHRvIGEgRE5UVF9UWVBFX01FTUVOVU0gaW4gdGhlIEdOVFQvTE5UVCB3aGljaAotICAgZGVzY3JpYmVzIHRoZSBmaXJzdCBtZW1iZXIgKGFuZCBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIGNoYWluIG9mCi0gICBtZW1iZXJzKS4KLQotICAgQklUTEVOR1RIIGlzIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIHRvIGhvbGQgdGhlIHZhbHVlcyBvZiB0aGUgZW51bSdzCi0gICBtZW1iZXJzLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV9lbnVtCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkxMDsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTIxOwotICBkbnR0cG9pbnRlciBmaXJzdG1lbTsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLX07Ci0KLS8qIEROVFRfVFlQRV9NRU1FTlVNCi0KLSAgIFVzZWQgdG8gZGVzY3JpYmUgbWVtYmVycyBvZiBhbiBlbnVtZXJhdGVkIHR5cGUuCi0KLSAgIENMQVNTTUVNIGlzIG5vbnplcm8gaWYgdGhpcyBtZW1iZXIgaXMgcGFydCBvZiBhIGNsYXNzLgotCi0gICBOQU1FIHBvaW50cyBpbnRvIHRoZSBWVCBmb3IgdGhlIG5hbWUgb2YgdGhpcyBtZW1iZXIuCi0KLSAgIFZBTFVFIGlzIHRoZSB2YWx1ZSBvZiB0aGlzIGVudW1lcmF0aW9uIG1lbWJlci4KLQotICAgTkVYVE1FTSBwb2ludHMgdG8gdGhlIG5leHQgRE5UVF9UWVBFX01FTUVOVU0gaW4gdGhlIGNoYWluLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV9tZW1lbnVtCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkxMDsKLSAgdW5zaWduZWQgaW50IGNsYXNzbWVtOgkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMjA7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci0gIGRudHRwb2ludGVyIG5leHRtZW07Ci19OwotCi0vKiBETlRUX1RZUEVfU0VUCi0KLSAgIFVzZWQgdG8gZGVzY3JpYmUgUEFTQ0FMICJzZXQiIHR5cGUuCi0KLSAgIERFQ0xBUkFUSU9OIGRlc2NyaWJlcyB0aGUgYml0cGFja2luZyBvZiB0aGUgc2V0LgotCi0gICBTVUJUWVBFIHBvaW50cyB0byBhIEROVFQgZW50cnkgZGVzY3JpYmluZyB0aGUgdHlwZSBvZiB0aGUgbWVtYmVycy4KLQotICAgQklUTEVOR1RIIGlzIHRoZSBzaXplIG9mIHRoZSBzZXQuICAqLyAKLQotc3RydWN0IGRudHRfdHlwZV9zZXQKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CTEwOwotICB1bnNpZ25lZCBpbnQgZGVjbGFyYXRpb246CTI7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxOTsKLSAgZG50dHBvaW50ZXIgc3VidHlwZTsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLX07Ci0KLS8qIEROVFRfVFlQRV9TVUJSQU5HRQotCi0gICBVc2VkIHRvIGRlc2NyaWJlIHN1YnJhbmdlIHR5cGUuCi0KLSAgIERZTl9MT1cgZGVzY3JpYmVzIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgc3VicmFuZ2U6Ci0KLSAgICAgMDAgZm9yIGEgY29uc3RhbnQgbG93ZXIgYm91bmQgKGZvdW5kIGluIExPV0JPVU5EKS4KLQotICAgICAwMSBmb3IgYSBkeW5hbWljIGxvd2VyIGJvdW5kIHdpdGggdGhlIGxvd2VyIGJvdW5kIGZvdW5kIGluIHRoZSB0aGUKLSAgICAgbWVtb3J5IGFkZHJlc3MgcG9pbnRlZCB0byBieSBMT1dCT1VORC4KLQotICAgICAxMCBmb3IgYSBkeW5hbWljIGxvd2VyIGJvdW5kIGRlc2NyaWJlZCBieSBhbiB2YXJpYWJsZSBmb3VuZCBpbiB0aGUKLSAgICAgRE5UVC9MTlRUIChMT1dCT1VORCB3b3VsZCBiZSBhIHBvaW50ZXIgaW50byB0aGUgRE5UVC9MTlRUKS4KLQotICAgRFlOX0hJR0ggaXMgc2ltaWxhciB0byBEWU5fTE9XLCBleGNlcHQgaXQgZGVzY3JpYmVzIHRoZSB1cHBlciBib3VuZC4KLQotICAgU1VCVFlQRSBwb2ludHMgdG8gdGhlIHR5cGUgb2YgdGhlIHN1YnJhbmdlLgotCi0gICBCSVRMRU5HVEggaXMgdGhlIGxlbmd0aCBpbiBiaXRzIG5lZWRlZCB0byBkZXNjcmliZSB0aGUgc3VicmFuZ2UncwotICAgdmFsdWVzLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV9zdWJyYW5nZQotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJMTA7Ci0gIHVuc2lnbmVkIGludCBkeW5fbG93OgkJMjsKLSAgdW5zaWduZWQgaW50IGR5bl9oaWdoOgkyOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTc7Ci0gIGludCBsb3dib3VuZDsKLSAgaW50IGhpZ2hib3VuZDsKLSAgZG50dHBvaW50ZXIgc3VidHlwZTsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLX07Ci0KLS8qIEROVFRfVFlQRV9BUlJBWQotCi0gICBVc2VkIHRvIGRlc2NyaWJlIGFuIGFycmF5IHR5cGUuCi0KLSAgIERFQ0xBUkFUSU9OIGRlc2NyaWJlcyB0aGUgYml0IHBhY2tpbmcgdXNlZCBpbiB0aGUgYXJyYXkuCi0KLSAgIEFSUkFZSVNCWVRFUyBpcyBub256ZXJvIGlmIHRoZSBmaWVsZCBpbiBhcnJheWxlbmd0aCBkZXNjcmliZXMgdGhlCi0gICBsZW5ndGggaW4gYnl0ZXMgcmF0aGVyIHRoYW4gaW4gYml0cy4gIEEgdmFsdWUgb2YgemVybyBpcyB1c2VkIHRvCi0gICBkZXNjcmliZSBhbiBhcnJheSB3aXRoIHNpemUgMioqMzIuCi0KLSAgIEVMRU1JU0JZVEVTIGlzIG5vbnplcm8gaWYgdGhlIGxlbmd0aCBpZiBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5Ci0gICBpcyBkZXNjcmliZXMgaW4gYnl0ZXMgcmF0aGVyIHRoYW4gYml0cy4gIEEgdmFsdWUgb2YgemVybyBpcyB1c2VkCi0gICB0byBhbiBlbGVtZW50IHdpdGggc2l6ZSAyKiozMi4KLQotICAgRUxFTU9SREVSIGlzIG5vbnplcm8gaWYgdGhlIGVsZW1lbnRzIGFyZSBpbmRleGVkIGluIGluY3JlYXNpbmcgb3JkZXIuCi0KLSAgIEpVU1RJRklFRCBpZiB0aGUgZWxlbWVudHMgYXJlIGxlZnQganVzdGlmaWVkIHRvIGluZGV4IHplcm8uCi0KLSAgIEFSUkFZTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5LgotCi0gICBJTkRFWFRZUEUgaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIHR5cGUgdXNlZCB0byBpbmRleCB0aGUgYXJyYXkuCi0KLSAgIEVMRU1UWVBFIGlzIGEgRE5UVCBwb2ludGVyIHRvIHRoZSB0eXBlIGZvciB0aGUgYXJyYXkgZWxlbWVudHMuCi0KLSAgIEVMRU1MRU5HVEggaXMgdGhlIGxlbmd0aCBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5IChpbmNsdWRpbmcKLSAgIGFueSBwYWRkaW5nKS4KLQotICAgTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSByZXByZXNlbnRlZCBieSBFTEVNVFlQRSBwb2ludGluZyB0bwotICAgYW5vdGhlciBETlRUX1RZUEVfQVJSQVkuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2FycmF5Ci17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkxMDsKLSAgdW5zaWduZWQgaW50IGRlY2xhcmF0aW9uOgkyOwotICB1bnNpZ25lZCBpbnQgZHluX2xvdzoJCTI7Ci0gIHVuc2lnbmVkIGludCBkeW5faGlnaDoJMjsKLSAgdW5zaWduZWQgaW50IGFycmF5aXNieXRlczoJMTsKLSAgdW5zaWduZWQgaW50IGVsZW1pc2J5dGVzOgkxOwotICB1bnNpZ25lZCBpbnQgZWxlbW9yZGVyOgkxOwotICB1bnNpZ25lZCBpbnQganVzdGlmaWVkOgkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTE7Ci0gIHVuc2lnbmVkIGludCBhcnJheWxlbmd0aDsKLSAgZG50dHBvaW50ZXIgaW5kZXh0eXBlOwotICBkbnR0cG9pbnRlciBlbGVtdHlwZTsKLSAgdW5zaWduZWQgaW50IGVsZW1sZW5ndGg7Ci19OwotCi0vKiBETlRUX1RZUEVfU1RSVUNUCi0KLSAgIEROVFRfVFlQRV9TVFJVQ1QgaXMgdXNlZCB0byBkZXNjcmliZSBhIEMgc3RydWN0dXJlLgotCi0gICBERUNMQVJBVElPTiBkZXNjcmliZXMgdGhlIGJpdHBhY2tpbmcgdXNlZC4KLQotICAgRklSU1RGSUVMRCBpcyBhIEROVFQgcG9pbnRlciB0byB0aGUgZmlyc3QgZmllbGQgb2YgdGhlIHN0cnVjdHVyZQotICAgKGVhY2ggZmllbGQgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGZpZWxkLCB3YWxrIHRoZSBsaXN0Ci0gICB0byBhY2Nlc3MgYWxsIGZpZWxkcyBvZiB0aGUgc3RydWN0dXJlKS4KLQotICAgVkFSVEFHRklFTEQgYW5kIFZBUkxJU1QgYXJlIHVzZWQgZm9yIFBhc2NhbCB2YXJpYW50IHJlY29yZHMuCi0KLSAgIEJJVExFTkdUSCBpcyB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJpdHMuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3N0cnVjdAotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJMTA7Ci0gIHVuc2lnbmVkIGludCBkZWNsYXJhdGlvbjoJMjsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE5OwotICBkbnR0cG9pbnRlciBmaXJzdGZpZWxkOwotICBkbnR0cG9pbnRlciB2YXJ0YWdmaWVsZDsKLSAgZG50dHBvaW50ZXIgdmFybGlzdDsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLX07Ci0KLS8qIEROVFRfVFlQRV9VTklPTgotCi0gICBETlRUX1RZUEVfVU5JT04gaXMgdXNlZCB0byBkZXNjcmliZSBhIEMgdW5pb24uCi0KLSAgIEZJUlNURklFTEQgaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmllbGQgY2hhaW4uCi0KLSAgIEJJVExFTkdUSCBpcyB0aGUgc2l6ZSBvZiB0aGUgdW5pb24gaW4gYml0cy4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfdW5pb24KLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CTEwOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMjE7Ci0gIGRudHRwb2ludGVyIGZpcnN0ZmllbGQ7Ci0gIHVuc2lnbmVkIGludCBiaXRsZW5ndGg7Ci19OwotCi0vKiBETlRUX1RZUEVfRklFTEQKLQotICAgRE5UVF9UWVBFX0ZJRUxEIGRlc2NyaWJlcyBvbmUgZmllbGQgaW4gYSBzdHJ1Y3R1cmUgb3IgdW5pb24KLSAgIG9yIEMrKyBjbGFzcy4KLQotICAgVklTSUJJTElUWSBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmaWVsZAotICAgKGZvciBjKysuICBwdWJsaWMgPSAwLCBwcm90ZWN0ZWQgPSAxLCBwcml2YXRlID0gMikuCi0KLSAgIEFfVU5JT04gaXMgbm9uemVybyBpZiB0aGlzIGZpZWxkIGlzIGEgbWVtYmVyIG9mIGFuIGFub255bW91cyB1bmlvbi4KLQotICAgU1RBVElDTUVNIGlzIG5vbnplcm8gaWYgdGhpcyBmaWVsZCBpcyBhIHN0YXRpYyBtZW1iZXIgb2YgYSB0ZW1wbGF0ZS4KLQotICAgTkFNRSBpcyBhIHBvaW50ZXIgaW50byB0aGUgVlQgZm9yIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KLQotICAgQklUT0ZGU0VUIGdpdmVzIHRoZSBvZmZzZXQgb2YgdGhpcyBmaWVsZCBpbiBiaXRzIGZyb20gdGhlIGJlZ2lubmluZwotICAgb2YgdGhlIHN0cnVjdHVyZSBvciB1bmlvbiB0aGlzIGZpZWxkIGlzIGEgbWVtYmVyIG9mLgotCi0gICBUWVBFIGlzIGEgRE5UVCBwb2ludGVyIHRvIHRoZSB0eXBlIGRlc2NyaWJpbmcgdGhpcyBmaWVsZC4KLQotICAgQklUTEVOR1RIIGlzIHRoZSBzaXplIG9mIHRoZSBlbnRyeSBpbiBiaXRzLgotCi0gICBORVhURklFTEQgaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIG5leHQgZmllbGQgaW4gdGhlIGNoYWluLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV9maWVsZAotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJMTA7Ci0gIHVuc2lnbmVkIGludCB2aXNpYmlsaXR5OgkyOwotICB1bnNpZ25lZCBpbnQgYV91bmlvbjoJCTE7Ci0gIHVuc2lnbmVkIGludCBzdGF0aWNtZW06CTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxNzsKLSAgdnRwb2ludGVyIG5hbWU7Ci0gIHVuc2lnbmVkIGludCBiaXRvZmZzZXQ7Ci0gIGRudHRwb2ludGVyIHR5cGU7Ci0gIHVuc2lnbmVkIGludCBiaXRsZW5ndGg7Ci0gIGRudHRwb2ludGVyIG5leHRmaWVsZDsKLX07Ci0KLS8qIEROVFRfVFlQRV9WQVJJQU5UIGlzIHVudXNlZCBieSBHREIuICAqLwotLyogRE5UVF9UWVBFX0ZJTEUgaXMgdW51c2VkIGJ5IEdEQi4gICovCi0KLS8qIEROVFRfVFlQRV9GVU5DVFlQRQotCi0gICBJIHRoaW5rIHRoaXMgaXMgdXNlZCB0byBkZXNjcmliZSBhIGZ1bmN0aW9uIHR5cGUgKGUuZy4sIHdvdWxkCi0gICBiZSBlbWl0dGVkIGFzIHBhcnQgb2YgYSBmdW5jdGlvbi1wb2ludGVyIGRlc2NyaXB0aW9uKS4KLQotICAgVkFSQVJHUyBpcyBub256ZXJvIGlmIHRoaXMgZnVuY3Rpb24gdXNlcyB2YXJhcmdzLgotCi0gICBGSVJTVFBBUkFNIGlzIGEgRE5UVCBwb2ludGVyIHRvIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgcGFyYW1ldGVyCi0gICBjaGFpbi4KLQotICAgUkVUVkFMIGlzIGEgRE5UVCBwb2ludGVyIHRvIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4gdmFsdWUuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2Z1bmN0eXBlCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7Ci0gIHVuc2lnbmVkIGludCB2YXJhcmdzOgkJMTsKLSAgdW5zaWduZWQgaW50IGluZm86CQk0OwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTY7Ci0gIHVuc2lnbmVkIGludCBiaXRsZW5ndGg7Ci0gIGRudHRwb2ludGVyIGZpcnN0cGFyYW07Ci0gIGRudHRwb2ludGVyIHJldHZhbDsKLX07Ci0KLS8qIEROVFRfVFlQRV9XSVRIIGlzIGVtaXR0ZWQgYnkgQysrIHRvIGluZGljYXRlICJ3aXRoIiBzY29waW5nIHNlbWFudGljcy4KLSAgIChQcm9iYWJseSBhbHNvIGVtaXR0ZWQgYnkgUEFTQ0FMIHRvIHN1cHBvcnQgIndpdGgiLi4uKS4KLSAgIAotICAgQysrIGV4YW1wbGU6IFNheSAibWVtZnVuYyIgaXMgYSBtZXRob2Qgb2YgY2xhc3MgImMiLCBhbmQgc2F5Ci0gICAibSIgaXMgYSBkYXRhIG1lbWJlciBvZiBjbGFzcyAiYyIuIFRoZW4gZnJvbSB3aXRoaW4gIm1lbWZ1bmMiLAotICAgaXQgaXMgbGVnYWwgdG8gcmVmZXJlbmNlICJtIiBkaXJlY3RseSAoZS5nLiB5b3UgZG9uJ3QgaGF2ZSB0bwotICAgc2F5ICJ0aGlzLT5tIi4gVGhlIHN5bWJvbCB0YWJsZSBpbmRpY2F0ZXMKLSAgIHRoaXMgYnkgZW1pdHRpbmcgYSBETlRUX1RZUEVfV0lUSCBzeW1ib2wgd2l0aGluIHRoZSBmdW5jdGlvbiAibWVtZnVuYyIsCi0gICBwb2ludGluZyB0byB0aGUgdHlwZSBzeW1ib2wgZm9yIGNsYXNzICJjIi4KLSAKLSAgIEluIEdEQiwgdGhpcyBzeW1ib2wgcmVjb3JkIGlzIHVubmVjZXNzYXJ5LCAKLSAgIGJlY2F1c2UgR0RCJ3Mgc3ltYm9sIGxvb2t1cCBhbGdvcml0aG0KLSAgIGluZmVycyB0aGUgIndpdGgiIHNlbWFudGljcyB3aGVuIGl0IHNlZXMgYSAidGhpcyIgYXJndW1lbnQgdG8gdGhlIG1lbWJlcgotICAgZnVuY3Rpb24uIFNvIEdEQiBjYW4gc2FmZWx5IGlnbm9yZSB0aGUgRE5UVF9UWVBFX1dJVEggcmVjb3JkLgotCi0gICBBIEROVFRfVFlQRV9XSVRIIGhhcyBhIG1hdGNoaW5nIEROVFRfVFlQRV9FTkQgc3ltYm9sIAotICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfd2l0aCB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7ICAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7ICAgLyogYWx3YXlzIEROVFRfVFlQRV9XSVRIICovCi0gIHVuc2lnbmVkIGludCBhZGRydHlwZTogIAkyOyAgICAvKiAwID0+IFNUQVRUWVBFICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgPT4gRFlOVFlQRSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiA9PiBSRUdUWVBFICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgaW5kaXJlY3Q6IAkxOyAgICAvKiAxID0+IHBvaW50ZXIgdG8gb2JqZWN0ICAgICAgICovCi0gIHVuc2lnbmVkIGludCBsb25nYWRkcjogIAkxOyAgICAvKiAxID0+IGluIGxvbmcgcG9pbnRlciBzcGFjZSAgICovCi0gIHVuc2lnbmVkIGludCBuZXN0bGV2ZWw6IAk2OyAgICAvKiAjIG9mIG5lc3RpbmcgbGV2ZWxzIGJhY2sgICAgICovCi0gIHVuc2lnbmVkIGludCBkb2NfcmFuZ2VzOiAJMTsgICAgLyogMSA9PiBsb2NhdGlvbiBpcyByYW5nZSBsaXN0ICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOiAgIAkxMDsKLSAgbG9uZyBsb2NhdGlvbjsgICAgICAgCQkgICAgICAvKiB3aGVyZSBzdG9yZWQgKGFsbG9jYXRlZCkgICAgICovCi0gIHNsdHBvaW50ZXIgYWRkcmVzczsKLSAgZG50dHBvaW50ZXIgdHlwZTsgICAgICAgICAgICAgICAgICAgLyogdHlwZSBvZiB3aXRoIGV4cHJlc3Npb24gICAgICAqLwotICB2dHBvaW50ZXIgbmFtZTsgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lIG9mIHdpdGggZXhwcmVzc2lvbiAgICAgICovCi0gIHVuc2lnbmVkIGxvbmcgIG9mZnNldDsgICAgICAgICAgICAgIC8qIGJ5dGUgb2Zmc2V0IGZyb20gbG9jYXRpb24gICAgKi8KLX07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotLyogRE5UVF9UWVBFX0NPTU1PTiBpcyB1bnN1cHBvcnRlZCBieSBHREIuICAqLwotLyogQSBETlRUX1RZUEVfQ09NTU9OIHN5bWJvbCBtdXN0IGhhdmUgYSBtYXRjaGluZyBETlRUX1RZUEVfRU5EIHN5bWJvbCAqLwotCi0vKiBETlRUX1RZUEVfQ09CU1RSVUNUIGlzIHVuc3VwcG9ydGVkIGJ5IEdEQi4gICovCi0vKiBETlRUX1RZUEVfWFJFRiBpcyB1bnN1cHBvcnRlZCBieSBHREIuICAqLwotLyogRE5UVF9UWVBFX1NBIGlzIHVuc3VwcG9ydGVkIGJ5IEdEQi4gICovCi0vKiBETlRUX1RZUEVfTUFDUk8gaXMgdW5zdXBwb3J0ZWQgYnkgR0RCICovCi0KLS8qIEROVFRfVFlQRV9CTE9DS0RBVEEgaGFzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBETlRUX1RZUEVfRlVOQ1RJT04gKi8KLQotLyogVGhlIGZvbGxvd2luZyBhcmUgdGhlIEMrKyBzcGVjaWZpYyBTT00gcmVjb3JkcyAqLwotCi0vKiAgVGhlIHB1cnBvc2Ugb2YgdGhlIEROVFRfVFlQRV9DTEFTU19TQ09QRSBpcyB0byBicmFja2V0IEMrKyBtZXRob2RzCi0gICAgYW5kIGluZGljYXRlIHRoZSBtZXRob2QgbmFtZSBiZWxvbmdzIGluIHRoZSAiY2xhc3Mgc2NvcGUiIHJhdGhlcgotICAgIHRoYW4gaW4gdGhlIG1vZHVsZSB0aGV5IGFyZSBiZWluZyBkZWZpbmVkIGluLiBGb3IgZXhhbXBsZToKLQotICAgIGNsYXNzIGMgewotICAgIC4uLgotICAgIHZvaWQgbWVtZnVuYygpOyAvLyBtZW1iZXIgZnVuY3Rpb24KLSAgICB9OwotCi0gICAgdm9pZCBjOjptZW1mdW5jKCkgICAvLyBkZWZpbml0aW9uIG9mIGNsYXNzIGMncyAibWVtZnVuYyIKLSAgICB7Ci0gICAgLi4uCi0gICAgfQotCi0gICAgbWFpbigpCi0gICAgewotICAgIC4uLgotICAgIH0KLQotICAgIEluIHRoZSBhYm92ZSwgdGhlIG5hbWUgIm1lbWZ1bmMiIGlzIG5vdCBkaXJlY3RseSB2aXNpYmxlIGZyb20gIm1haW4iLgotICAgIEkuZS4sIHlvdSBoYXZlIHRvIHNheSAiYnJlYWsgYzo6bWVtZnVuYyIuCi0gICAgSWYgaXQgd2VyZSBhIG5vcm1hbCBmdW5jdGlvbiAobm90IGEgbWV0aG9kKSwgaXQgd291bGQgYmUgdmlzaWJsZQotICAgIHZpYSB0aGUgc2ltcGxlICJicmVhayBtZW1mdW5jIi4gU2luY2UgIm1lbWZ1bmMiIG90aGVyd2lzZSBsb29rcwotICAgIGxpa2UgYSBub3JtYWwgRlVOQ1RJT04gaW4gdGhlIHN5bWJvbCB0YWJsZSwgdGhlIGJyYWNrZXRpbmcKLSAgICBDTEFTU19TQ09QRSBpcyB3aGF0IGlzIHVzZWQgdG8gaW5kaWNhdGUgaXQgaXMgcmVhbGx5IGEgbWV0aG9kLgotICAgIAotCi0gICBBIEROVFRfVFlQRV9DTEFTU19TQ09QRSBzeW1ib2wgbXVzdCBoYXZlIGEgbWF0Y2hpbmcgRE5UVF9UWVBFX0VORCBzeW1ib2wgCi0qLwotCi1zdHJ1Y3QgZG50dF90eXBlX2NsYXNzX3Njb3BlIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX0NMQVNTX1NDT1BFICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6ICAgICAyMTsgCi0gIHNsdHBvaW50ZXIgYWRkcmVzcyAgICAgICAgIDsgICAgLyogcG9pbnRlciB0byBTTFQgZW50cnkgKi8KLSAgZG50dHBvaW50ZXIgdHlwZSAgICAgICAgICAgOyAgICAgLyogcG9pbnRlciB0byBjbGFzcyB0eXBlIEROVFQgKi8KLX07Ci0KLS8qIEMrKyByZWZlcmVuY2UgcGFyYW1ldGVyLgotICAgVGhlIHN0cnVjdHVyZSBvZiB0aGlzIHJlY29yZCBpcyB0aGUgc2FtZSBhcyBETlRUX1RZUEVfUE9JTlRFUiAtIAotICAgcmVmZXIgdG8gc3RydWN0IGRudHRfdHlwZV9wb2ludGVyLgotICovCi0KLS8qIFRoZSBuZXh0IHR3byBkZXNjcmliZSBDKysgcG9pbnRlci10by1kYXRhLW1lbWJlciB0eXBlLCBhbmQgCi0gICBwb2ludGVyLXRvLW1lbWJlci1mdW5jdGlvbiB0eXBlLCByZXNwZWN0aXZlbHkuCi0gICBETlRUX1RZUEVfUFRSTUVNIGFuZCBETlRUX1RZUEVfUFRSTUVNRlVOQyBoYXZlIHRoZSBzYW1lIHN0cnVjdHVyZSAKLSAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3B0cm1lbSB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9QVFJNRU0gKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjE7Ci0gIGRudHRwb2ludGVyIHBvaW50c3RvCSAgICAgOyAgICAgLyogcG9pbnRlciB0byBjbGFzcyBETlRUICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgbWVtdHlwZSAJICAgICA7ICAgICAvKiB0eXBlIG9mIG1lbWJlciAgICAgICAgICAgICAgICAqLwotfTsKLQotc3RydWN0IGRudHRfdHlwZV9wdHJtZW1mdW5jIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX1BUUk1FTUZVTkMgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjE7Ci0gIGRudHRwb2ludGVyIHBvaW50c3RvCSAgICAgOyAgICAgLyogcG9pbnRlciB0byBjbGFzcyBETlRUICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgbWVtdHlwZSAJICAgICA7ICAgICAvKiB0eXBlIG9mIG1lbWJlciAgICAgICAgICAgICAgICAqLwotfTsKLQotLyogVGhlIEROVFRfVFlQRV9DTEFTUyBzeW1ib2wgaXMgZW1pdHRlZCB0byBkZXNjcmliZSBhIGNsYXNzIHR5cGUuCi0gKiAibWVtYmVybGlzdCIgcG9pbnRzIHRvIGEgY2hhaW5lZCBsaXN0IG9mIEZJRUxEIG9yIEdFTkZJRUxEIHJlY29yZHMKLSAqIGluZGljYXRpbmcgdGhlIGNsYXNzIG1lbWJlcnMuICJwYXJlbnRsaXN0IiBwb2ludHMgdG8gYSBjaGFpbmVkIGxpc3QKLSAqIG9mIElOSEVSSVRBTkNFIHJlY29yZHMgaW5kaWNhdGluZyBjbGFzc2VzIGZyb20gd2hpY2ggd2UgaW5oZXJpdAotICogZmllbGRzLgotICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfY2xhc3MgCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsgICAgIC8qIGFsd2F5cyAwICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfQ0xBU1MgKi8KLSAgdW5zaWduZWQgaW50IGFic3RyYWN0OiAgICAxOyAgICAgLyogaXMgdGhpcyBhbiBhYnN0cmFjdCBjbGFzcz8gICAgKi8KLSAgdW5zaWduZWQgaW50IGNsYXNzX2RlY2w6ICAyOyAgICAgLyogMD1jbGFzcywxPXVuaW9uLDI9c3RydWN0ICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGV4cGFuc2lvbjogICAxOyAgICAgLyogMT10ZW1wbGF0ZSBleHBhbnNpb24gICAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDogICAgIDE3OyAgICAgCi0gIGRudHRwb2ludGVyIG1lbWJlcmxpc3QgICAgIDsgICAgIC8qIHB0ciB0byBjaGFpbiBvZiBbR0VOXUZJRUxEcyAqLwotICB1bnNpZ25lZCBsb25nIHZ0YmxfbG9jICAgICA7ICAgICAvKiBvZmZzZXQgaW4gb2JqIG9mIHB0ciB0byB2dGJsICAqLwotICBkbnR0cG9pbnRlciBwYXJlbnRsaXN0ICAgICA7ICAgICAvKiBwdHIgdG8gS19JTkhFUklUQU5DRSBsaXN0ICAgICAqLwotICB1bnNpZ25lZCBsb25nIGJpdGxlbmd0aCAgICA7ICAgICAvKiB0b3RhbCBhdCB0aGlzIGxldmVsICAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBpZGVudGxpc3QgICAgICA7ICAgICAvKiBwdHIgdG8gY2hhaW4gb2YgY2xhc3MgaWRlbnQncyAqLwotICBkbnR0cG9pbnRlciBmcmllbmRsaXN0ICAgICA7ICAgICAvKiBwdHIgdG8gS19GUklFTkQgbGlzdCAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciB0ZW1wbGF0ZXB0ciAgICA7ICAgICAvKiBwdHIgdG8gdGVtcGxhdGUgICAgICAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBuZXh0ZXhwICAgICAgICA7ICAgICAvKiBwdHIgdG8gbmV4dCBleHBhbnNpb24gICAgICAgICAqLwotfTsKLQotLyogQ2xhc3MgbWVtYmVycyBhcmUgaW5kaWNhdGVkIHZpYSBlaXRoZXIgdGhlIEZJRUxEIHJlY29yZCAoZm9yCi0gICBkYXRhIG1lbWJlcnMsIHNhbWUgYXMgZm9yIEMgc3RydWN0IGZpZWxkcyksIG9yIGJ5IHRoZSBHRU5GSUVMRCByZWNvcmQKLSAgIChmb3IgbWVtYmVyIGZ1bmN0aW9ucykuCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV9nZW5maWVsZCB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9HRU5GSUVMRCAqLwotICB1bnNpZ25lZCBpbnQgdmlzaWJpbGl0eTogIDI7ICAgICAvKiBwdWIgPSAwLCBwcm90ID0gMSwgcHJpdiA9IDIgICAqLwotICB1bnNpZ25lZCBpbnQgYV91bmlvbjogICAgIDE7ICAgICAvKiAxID0+IGFub255bW91cyB1bmlvbiBtZW1iZXIgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAxODsKLSAgZG50dHBvaW50ZXIgZmllbGQJICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGZpZWxkIG9yIHF1YWxpZmllciAqLwotICBkbnR0cG9pbnRlciBuZXh0ZmllbGQgICAgICA7ICAgICAvKiBwb2ludGVyIHRvIG5leHQgZmllbGQgICAgICAgICAqLwotfTsKLQotLyogQysrIHZpcnR1YWwgZnVuY3Rpb25zICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfdmZ1bmMgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfVkZVTkMgKi8KLSAgdW5zaWduZWQgaW50IHB1cmU6ICAgICAgICAxOyAgICAgLyogcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uID8gICAgICAgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjA7Ci0gIGRudHRwb2ludGVyIGZ1bmNwdHIgICAgICAgIDsgICAgIC8qIHBvaW50cyB0byBGVU5DVElPTiBzeW1ib2wgICAgICovCi0gIHVuc2lnbmVkIGxvbmcgdnRibF9vZmZzZXQgIDsgICAgIC8qIG9mZnNldCBpbnRvIHZ0YmwgZm9yIHZpcnR1YWwgICovCi19OwotCi0vKiBOb3QgcHJlY2lzZWx5IHN1cmUgd2hhdCB0aGlzIGlzIGludGVuZGVkIGZvciAtIERERSBpZ25vcmVzIGl0ICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfbWVtYWNjZXNzIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX01FTUFDQ0VTUyAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAyMTsKLSAgZG50dHBvaW50ZXIgY2xhc3NwdHIJICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGJhc2UgY2xhc3MgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBmaWVsZCAgICAgICAgICA7ICAgICAvKiBwb2ludGVyIGZpZWxkICAgICAgICAgICAgICAgICAqLwotfTsKLQotLyogVGhlIEROVFRfVFlQRV9JTkhFUklUQU5DRSByZWNvcmQgZGVzY3JpYmVzIGRlcml2ZWQgY2xhc3Nlcy4KLSAqIEluIHBhcnRpY3VsYXIsIHRoZSAicGFyZW50bGlzdCIgZmllbGQgb2YgdGhlIENMQVNTIHJlY29yZCBwb2ludHMKLSAqIHRvIGEgbGlzdCBvZiBJTkhFUklUQU5DRSByZWNvcmRzIGZvciBjbGFzc2VzIGZyb20gd2hpY2ggd2UgCi0gKiBpbmhlcml0IG1lbWJlcnMuCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV9pbmhlcml0YW5jZSB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9JTkhFUklUQU5DRSAqLwotICB1bnNpZ25lZCBpbnQgVmlydHVhbDogICAgIDE7ICAgICAvKiB2aXJ0dWFsIGJhc2UgY2xhc3MgPyAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgdmlzaWJpbGl0eTogIDI7ICAgICAvKiBwdWIgPSAwLCBwcm90ID0gMSwgcHJpdiA9IDIgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAxODsKLSAgZG50dHBvaW50ZXIgY2xhc3NuYW1lICAgICAgOyAgICAgLyogZmlyc3QgcGFyZW50IGNsYXNzLCBpZiBhbnkgICAgKi8KLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQgICAgICAgOyAgICAgLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGJhc2UgY2xhc3MgKi8KLSAgZG50dHBvaW50ZXIgbmV4dCAgICAgICAgICAgOyAgICAgLyogcG9pbnRlciB0byBuZXh0IEtfSU5IRVJJVEFOQ0UgKi8KLSAgdW5zaWduZWQgbG9uZyBmdXR1cmVbMl0gICAgOyAgICAgLyogcGFkZGluZyB0byAzLXdvcmQgYmxvY2sgZW5kICAgKi8KLX07Ci0KLS8qIEMrKyAiZnJpZW5kIiBjbGFzc2VzIC4uLiAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2ZyaWVuZF9jbGFzcyB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9GUklFTkRfQ0xBU1MgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjE7Ci0gIGRudHRwb2ludGVyIGNsYXNzcHRyICAgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gY2xhc3MgRE5UVCAgICAgICAgICovCi0gIGRudHRwb2ludGVyIG5leHQgICAgICAgICAgIDsgICAgIC8qIG5leHQgRE5UVF9GUklFTkQgICAgICAgICAgICAgICovCi19OwotCi1zdHJ1Y3QgZG50dF90eXBlX2ZyaWVuZF9mdW5jIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX0ZSSUVORF9GVU5DICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDIxOwotICBkbnR0cG9pbnRlciBmdW5jcHRyICAgICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGZ1bmN0aW9uICAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBjbGFzc3B0ciAgICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGNsYXNzIEROVFQgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBuZXh0ICAgICAgICAgICA7ICAgICAvKiBuZXh0IEROVFRfRlJJRU5EICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBsb25nIGZ1dHVyZVsyXSAgICA7ICAgICAvKiBwYWRkaW5nIHRvIDMtd29yZCBibG9jayBlbmQgICAqLwotfTsKLQotLyogRERFIGFwcGVhcnMgdG8gaWdub3JlIHRoZSBETlRUX1RZUEVfTU9ESUZJRVIgcmVjb3JkLgotICogSXQgY291bGQgcGVyaGFwcyBiZSB1c2VkIHRvIGdpdmUgYmV0dGVyICJwdHlwZSIgb3V0cHV0IGluIEdEQjsKLSAqIG90aGVyd2lzZSBpdCBpcyBwcm9iYWJseSBzYWZlIGZvciBHREIgdG8gaWdub3JlIGl0IGFsc28uCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV9tb2RpZmllciB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9NT0RJRklFUiAqLwotICB1bnNpZ25lZCBpbnQgbV9jb25zdDogICAgIDE7ICAgICAvKiBjb25zdCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgbV9zdGF0aWM6ICAgIDE7ICAgICAvKiBzdGF0aWMgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgbV92b2lkOiAgICAgIDE7ICAgICAvKiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgbV92b2xhdGlsZTogIDE7ICAgICAvKiB2b2xhdGlsZSAgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgbV9kdXBsaWNhdGU6IDE7ICAgICAvKiBkdXBsaWNhdGUgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAxNjsKLSAgZG50dHBvaW50ZXIgdHlwZSAgICAgICAgICAgOyAgICAgLyogc3VidHlwZSAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgbG9uZyBmdXR1cmUgICAgICAgOyAgICAgLyogcGFkZGluZyB0byAzLXdvcmQgYmxvY2sgZW5kICAgKi8KLX07Ci0KLS8qIEknbSBub3Qgc3VyZSB3aGF0IHRoaXMgd2FzIGludGVuZGVkIGZvciAtIERERSBpZ25vcmVzIGl0ICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfb2JqZWN0X2lkIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX09CSkVDVF9JRCAqLwotICB1bnNpZ25lZCBpbnQgaW5kaXJlY3Q6ICAgIDE7ICAgICAvKiBJcyBvYmplY3RfaWRlbnQgYWRkciBvZiBhZGRyPyAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAyMDsKLSAgdW5zaWduZWQgbG9uZyBvYmplY3RfaWRlbnQgOyAgICAgLyogb2JqZWN0IGlkZW50aWZpZXIgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQgICAgICAgOyAgICAgLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGJhc2UgY2xhc3MgKi8KLSAgZG50dHBvaW50ZXIgbmV4dCAgICAgICAgICAgOyAgICAgLyogcG9pbnRlciB0byBuZXh0IEtfT0JKRUNUX0lEICAgKi8KLSAgdW5zaWduZWQgbG9uZyBzZWdvZmZzZXQgICAgOyAgICAgLyogZm9yIGxpbmtlciBmaXh1cCAgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgbG9uZyBmdXR1cmUgICAgICAgOyAgICAgLyogcGFkZGluZyB0byAzLXdvcmQgYmxvY2sgZW5kICAgKi8KLX07Ci0KLS8qIE5vIHNlcGFyYXRlIGRudHRfdHlwZV9tZW1mdW5jOyBzYW1lIGFzIGRudHRfdHlwZV9mdW5jICovCi0KLS8qIFN5bWJvbCByZWNvcmRzIHRvIHN1cHBvcnQgdGVtcGxhdGVzLiBUaGVzZSBvbmx5IGdldCB1c2VkCi0gKiBpbiBEREUncyAiZGVzY3JpYmUiIG91dHB1dCAobGlrZSBHREIncyAicHR5cGUiKS4KLSAqLwotCi0vKiBUaGUgVEVNUExBVEUgcmVjb3JkIGlzIHRoZSBoZWFkZXIgZm9yIGEgdGVtcGxhdGUtY2xhc3MuCi0gKiBMaWtlIHRoZSBDTEFTUyByZWNvcmQsIGEgVEVNUExBVEUgcmVjb3JkIGhhcyBhIG1lbWJlcmxpc3QgdGhhdAotICogcG9pbnRzIHRvIGEgbGlzdCBvZiB0ZW1wbGF0ZSBtZW1iZXJzLiBJdCBhbHNvIGhhcyBhbiBhcmdsaXN0Ci0gKiBwb2ludGluZyB0byBhIGxpc3Qgb2YgVEVNUExBVEVfQVJHIHJlY29yZHMuCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV90ZW1wbGF0ZSB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9URU1QTEFURSAqLwotICB1bnNpZ25lZCBpbnQgYWJzdHJhY3Q6ICAgIDE7ICAgICAvKiBpcyB0aGlzIGFuIGFic3RyYWN0IGNsYXNzPyAgICAqLwotICB1bnNpZ25lZCBpbnQgY2xhc3NfZGVjbDogIDI7ICAgICAvKiAwPWNsYXNzLDE9dW5pb24sMj1zdHJ1Y3QgICAgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAxODsKLSAgZG50dHBvaW50ZXIgbWVtYmVybGlzdCAgICAgOyAgICAgLyogcHRyIHRvIGNoYWluIG9mIEtfW0dFTl1GSUVMRHMgKi8KLSAgbG9uZyB1bnVzZWQyICAgICAgICAgICAgICAgOyAgICAgLyogb2Zmc2V0IGluIG9iaiBvZiBwdHIgdG8gdnRibCAgKi8KLSAgZG50dHBvaW50ZXIgcGFyZW50bGlzdCAgICAgOyAgICAgLyogcHRyIHRvIEtfSU5IRVJJVEFOQ0UgbGlzdCAgICAgKi8KLSAgdW5zaWduZWQgbG9uZyBiaXRsZW5ndGggICAgOyAgICAgLyogdG90YWwgYXQgdGhpcyBsZXZlbCAgICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgaWRlbnRsaXN0ICAgICAgOyAgICAgLyogcHRyIHRvIGNoYWluIG9mIGNsYXNzIGlkZW50J3MgKi8KLSAgZG50dHBvaW50ZXIgZnJpZW5kbGlzdCAgICAgOyAgICAgLyogcHRyIHRvIEtfRlJJRU5EIGxpc3QgICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgYXJnbGlzdCAgICAgICAgOyAgICAgLyogcHRyIHRvIGFyZ3VtZW50IGxpc3QgICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgZXhwYW5zaW9ucyAgICAgOyAgICAgLyogcHRyIHRvIGV4cGFuc2lvbiBsaXN0ICAgICAgICAgKi8KLX07Ci0KLS8qIFRlbXBsYXRlLWNsYXNzIGFyZ3VtZW50cyBhcmUgYSBsaXN0IG9mIFRFTVBMX0FSRyByZWNvcmRzCi0gKiBjaGFpbmVkIHRvZ2V0aGVyLiBUaGUgIm5hbWUiIGZpZWxkIGlzIHRoZSBuYW1lIG9mIHRoZSBmb3JtYWwuCi0gKiBFLmcuOgotICogdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIHEgeyAuLi4gfTsKLSAqIFRoZW4gIlQiIGlzIHRoZSBuYW1lIG9mIHRoZSBmb3JtYWwgYXJndW1lbnQuCi0gKi8KLXN0cnVjdCBkbnR0X3R5cGVfdGVtcGxfYXJnIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX1RFTVBMX0FSRyAqLwotICB1bnNpZ25lZCBpbnQgdXNhZ2V0eXBlOiAgIDE7ICAgICAvKiAwIHR5cGUtbmFtZSAxIGV4cHJlc3Npb24gICAgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDIwOwotICB2dHBvaW50ZXIgbmFtZSAgICAgICAgICAgICA7ICAgICAvKiBuYW1lIG9mIGFyZ3VtZW50ICAgICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIHR5cGUgICAgICAgICAgIDsgICAgIC8qIGZvciBub24gdHlwZSBhcmd1bWVudHMgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgbmV4dGFyZyAgICAgICAgOyAgICAgLyogTmV4dCBhcmd1bWVudCBpZiBhbnkgICAgICAgICAqLwotICBsb25nIGZ1dHVyZVsyXSAgICAgICAgICAgICA7ICAgICAvKiBwYWRkaW5nIHRvIDMtd29yZCBibG9jayBlbmQgICovCi19OwotCi0vKiBGVU5DX1RFTVBMQVRFIHJlY29yZHMgYXJlIHNvcnQgb2YgbGlrZSBGVU5DVElPTiwgYnV0IGFyZSBlbWl0dGVkCi0gKiBmb3IgdGVtcGxhdGUgbWVtYmVyIGZ1bmN0aW9ucy4gRS5nLiwKLSAqIHRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBxIHsgCi0gICAgICAuLi4KLSAgICAgIHZvaWQgZigpOwotICAgICAgLi4uIAotICAgfTsKLSAqIFdpdGhpbiB0aGUgbGlzdCBvZiBGSUVMRHMvR0VORklFTERzIGRlZmluaW5nIHRoZSBtZW1iZXIgbGlzdAotICogb2YgdGhlIHRlbXBsYXRlICJxIiwgImYiIHdvdWxkIGFwcGVhciBhcyBhIEZVTkNfVEVNUExBVEUuCi0gKiBXZSdsbCBhbHNvIHNlZSBpbnN0YW5jZXMgb2YgRlVOQ1RJT04gImYiIHJlY29yZHMgZm9yIGVhY2ggCi0gKiBpbnN0YW50aWF0aW9uIG9mIHRoZSB0ZW1wbGF0ZS4KLSAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2Z1bmNfdGVtcGxhdGUgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfRlVOQ19URU1QTEFURSAqLwotICB1bnNpZ25lZCBpbnQgcHVibGljOiAgICAgIDE7ICAgICAvKiAxID0+IGdsb2JhbGx5IHZpc2libGUgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBsYW5ndWFnZTogICAgNDsgICAgIC8qIHR5cGUgb2YgbGFuZ3VhZ2UgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGxldmVsOiAgICAgICA1OyAgICAgLyogbmVzdGluZyBsZXZlbCAodG9wIGxldmVsID0gMCkqLwotICB1bnNpZ25lZCBpbnQgb3B0aW1pemU6ICAgIDI7ICAgICAvKiBsZXZlbCBvZiBvcHRpbWl6YXRpb24gICAgICAgICovCi0gIHVuc2lnbmVkIGludCB2YXJhcmdzOiAgICAgMTsgICAgIC8qIGVsbGlwc2VzLiAgUGFzY2FsLzgwMCBsYXRlciAgKi8gCi0gIHVuc2lnbmVkIGludCBpbmZvOiAgICAgICAgNDsgICAgIC8qIGxhbmctc3BlY2lmaWMgc3R1ZmY7IEZfeHh4eCAgKi8KLSAgdW5zaWduZWQgaW50IGlubGluZWQ6ICAgICAxOwotICB1bnNpZ25lZCBpbnQgbG9jYWxsb2M6ICAgIDE7ICAgICAvKiAwIGF0IHRvcCwgMSBhdCBlbmQgb2YgYmxvY2sgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6ICAgICAgMjsKLSAgdnRwb2ludGVyIG5hbWUgICAgICAgICAgICAgOyAgICAgLyogbmFtZSBvZiBmdW5jdGlvbiAgICAgICAgICAgICAqLwotICB2dHBvaW50ZXIgYWxpYXMgICAgICAgICAgICA7ICAgICAvKiBhbHRlcm5hdGUgbmFtZSwgaWYgYW55ICAgICAgICovCi0gIGRudHRwb2ludGVyIGZpcnN0cGFyYW0gICAgIDsgICAgIC8qIGZpcnN0IEZQQVJBTSwgaWYgYW55ICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgcmV0dmFsICAgICAgICAgOyAgICAgLyogcmV0dXJuIHR5cGUsIGlmIGFueSAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBhcmdsaXN0ICAgICAgICA7ICAgICAvKiBwdHIgdG8gYXJndW1lbnQgbGlzdCAgICAgICAgICovCi19OwotCi0vKiBMSU5LIGlzIGFwcGFyZW50bHkgaW50ZW5kZWQgdG8gbGluayB0b2dldGhlciBmdW5jdGlvbiB0ZW1wbGF0ZQotICogZGVmaW5pdGlvbnMgd2l0aCB0aGVpciBpbnN0YW50aWF0aW9ucy4gSG93ZXZlciwgaXQgaXMgbm90IGNsZWFyCi0gKiB3aHkgdGhpcyB3b3VsZCBiZSBuZWVkZWQsIGV4Y2VwdCB0byBwcm92aWRlIHRoZSBpbmZvcm1hdGlvbiBvbgotICogYSAicHR5cGUiIGNvbW1hbmQuIEFuZCBhcyBmYXIgYXMgSSBjYW4gdGVsbCwgYUNDIGRvZXMgbm90IAotICogZ2VuZXJhdGUgdGhpcyByZWNvcmQuCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV9saW5rIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX0xJTksgKi8KLSAgdW5zaWduZWQgaW50IGxpbmtLaW5kOiAgICA0OyAgICAgLyogYWx3YXlzIExJTktfVU5LTk9XTiAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAxNzsKLSAgbG9uZyBmdXR1cmUxICAgICAgICAgICAgICAgOyAgICAgLyogZXhwYW5zaW9uICAgICAgICAgICAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBwdHIxICAgICAgICAgICA7ICAgICAvKiBsaW5rIGZyb20gdGVtcGxhdGUgICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIHB0cjIgICAgICAgICAgIDsgICAgIC8qIHRvIGV4cGFuc2lvbiAgICAgICAgICAgICAgICAgKi8KLSAgbG9uZyBmdXR1cmVbMl0gICAgICAgICAgICAgOyAgICAgLyogcGFkZGluZyB0byAzLXdvcmQgYmxvY2sgZW5kICAqLwotfTsKLQotLyogZW5kIG9mIEMrKyBzcGVjaWZpYyBTT00ncyAqLwotCi0vKiBETlRUX1RZUEVfRFlOX0FSUkFZX0RFU0MgaXMgdW51c2VkIGJ5IEdEQiAqLwotLyogRE5UVF9UWVBFX0RFU0NfU1VCUkFOR0UgaXMgdW51c2VkIGJ5IEdEQiAqLwotLyogRE5UVF9UWVBFX0JFR0lOX0VYVCBpcyB1bnVzZWQgYnkgR0RCICovCi0vKiBETlRUX1RZUEVfSU5MTiBpcyB1bnVzZWQgYnkgR0RCICovCi0vKiBETlRUX1RZUEVfSU5MTl9MSVNUIGlzIHVudXNlZCBieSBHREIgKi8KLS8qIEROVFRfVFlQRV9BTElBUyBpcyB1bnVzZWQgYnkgR0RCICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfZG9jX2Z1bmN0aW9uIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogMTsgICAvKiBhbHdheXMgemVybyAgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgMTA7ICAgLyogS19ET0NfRlVOQ1RJT04gb3IgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEtfRE9DX01FTUZVTkMgICAgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGdsb2JhbDogICAgMTsgICAvKiAxID0+IGdsb2JhbGx5IHZpc2libGUgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBsYW5ndWFnZTogIDQ7ICAgLyogdHlwZSBvZiBsYW5ndWFnZSAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgbGV2ZWw6ICAgICA1OyAgIC8qIG5lc3RpbmcgbGV2ZWwgKHRvcCBsZXZlbCA9IDApKi8KLSAgdW5zaWduZWQgaW50IG9wdGltaXplOiAgMjsgICAvKiBsZXZlbCBvZiBvcHRpbWl6YXRpb24gICAgICAgICovCi0gIHVuc2lnbmVkIGludCB2YXJhcmdzOiAgIDE7ICAgLyogZWxsaXBzZXMuICBQYXNjYWwvODAwIGxhdGVyICAqLwotICB1bnNpZ25lZCBpbnQgaW5mbzogICAgICA0OyAgIC8qIGxhbmctc3BlY2lmaWMgc3R1ZmY7IEZfeHh4eCAgKi8KLSAgdW5zaWduZWQgaW50IGlubGluZWQ6ICAgMTsKLSAgdW5zaWduZWQgaW50IGxvY2FsbG9jOiAgMTsgICAvKiAwIGF0IHRvcCwgMSBhdCBlbmQgb2YgYmxvY2sgICovCi0gIHVuc2lnbmVkIGludCBleHBhbnNpb246IDE7ICAgLyogMSA9IGZ1bmN0aW9uIGV4cGFuc2lvbiAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgZG9jX2Nsb25lOiAxOwotICB2dHBvaW50ZXIgbmFtZTsgICAgICAgICAgICAgIC8qIG5hbWUgb2YgZnVuY3Rpb24gICAgICAgICAgICAgKi8KLSAgdnRwb2ludGVyIGFsaWFzOyAgICAgICAgICAgICAvKiBhbHRlcm5hdGUgbmFtZSwgaWYgYW55ICAgICAgICovCi0gIGRudHRwb2ludGVyIGZpcnN0cGFyYW07ICAgICAgLyogZmlyc3QgRlBBUkFNLCBpZiBhbnkgICAgICAgICAqLwotICBzbHRwb2ludGVyIGFkZHJlc3M7ICAgICAgICAgIC8qIGNvZGUgYW5kIHRleHQgbG9jYXRpb25zICAgICAgKi8KLSAgQ09SRV9BRERSIGVudHJ5YWRkcjsgICAgICAgICAvKiBhZGRyZXNzIG9mIGVudHJ5IHBvaW50ICAgICAgICovCi0gIGRudHRwb2ludGVyIHJldHZhbDsgICAgICAgICAgLyogcmV0dXJuIHR5cGUsIGlmIGFueSAgICAgICAgICAqLwotICBDT1JFX0FERFIgbG93YWRkcjsgICAgICAgICAgIC8qIGxvd2VzdCBhZGRyZXNzIG9mIGZ1bmN0aW9uICAgKi8KLSAgQ09SRV9BRERSIGhpYWRkcjsgICAgICAgICAgICAvKiBoaWdoZXN0IGFkZHJlc3Mgb2YgZnVuY3Rpb24gICovCi0gIGRudHRwb2ludGVyIGlubGluZV9saXN0OyAgICAgLyogcG9pbnRlciB0byBmaXJzdCBpbmxpbmUgICAgKi8KLSAgbHRwb2ludGVyIGx0X29mZnNldDsgICAgICAgICAvKiBzdGFydCBvZiBmcmFnL2NwIGxpbmUgdGFibGUgICovCi0gIGN0eHRwb2ludGVyIGN0eHRfb2Zmc2V0OyAgICAgLyogc3RhcnQgb2YgY29udGV4dCB0YWJsZSBmb3IgdGhpcyByb3V0aW5lICovCi19OwotCi0vKiBETlRUX1RZUEVfRE9DX01FTUZVTkMgaXMgdW51c2VkIGJ5IEdEQiAqLwotCi0vKiBETlRUX1RZUEVfR0VORVJJQyBhbmQgRE5UVF9UWVBFX0JMT0NLIGFyZSBjb252aWVuY2Ugc3RydWN0dXJlcwotICAgc28gd2UgY2FuIGV4YW1pbmUgYSBETlRUIGVudHJ5IGluIGEgZ2VuZXJpYyBmYXNoaW9uLiAgKi8KLXN0cnVjdCBkbnR0X3R5cGVfZ2VuZXJpYwotewotICB1bnNpZ25lZCBpbnQgd29yZFs5XTsKLX07Ci0KLXN0cnVjdCBkbnR0X3R5cGVfYmxvY2sKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgICAgICAgMTA7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkyMTsKLSAgdW5zaWduZWQgaW50IHdvcmRbMl07Ci19OwotCi0vKiBPbmUgZW50cnkgaW4gYSBETlRUIChlaXRoZXIgdGhlIExOVFQgb3IgR05UVCkuICAKLSAqIFRoaXMgaXMgYSB1bmlvbiBvZiB0aGUgYWJvdmUgNjAgb3Igc28gc3RydWN0dXJlIGRlZmluaXRpb25zLgotICovCi11bmlvbiBkbnR0ZW50cnkKLXsKLSAgc3RydWN0IGRudHRfdHlwZV9zcmNmaWxlIGRzZmlsZTsKLSAgc3RydWN0IGRudHRfdHlwZV9tb2R1bGUgZG1vZHVsZTsKLSAgc3RydWN0IGRudHRfdHlwZV9mdW5jdGlvbiBkZnVuYzsKLSAgc3RydWN0IGRudHRfdHlwZV9mdW5jdGlvbiBkZW50cnk7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfYmVnaW4gZGJlZ2luOwotICBzdHJ1Y3QgZG50dF90eXBlX2VuZCBkZW5kOwotICBzdHJ1Y3QgZG50dF90eXBlX2ZwYXJhbSBkZnBhcmFtOwotICBzdHJ1Y3QgZG50dF90eXBlX3N2YXIgZHN2YXI7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZHZhciBkZHZhcjsKLSAgc3RydWN0IGRudHRfdHlwZV9jb25zdCBkY29uc3Q7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfdHlwZSBkdHlwZTsKLSAgc3RydWN0IGRudHRfdHlwZV90eXBlIGR0YWc7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfcG9pbnRlciBkcHRyOwotICBzdHJ1Y3QgZG50dF90eXBlX2VudW0gZGVudW07Ci0gIHN0cnVjdCBkbnR0X3R5cGVfbWVtZW51bSBkbWVtYmVyOwotICBzdHJ1Y3QgZG50dF90eXBlX3NldCBkc2V0OwotICBzdHJ1Y3QgZG50dF90eXBlX3N1YnJhbmdlIGRzdWJyOwotICBzdHJ1Y3QgZG50dF90eXBlX2FycmF5IGRhcnJheTsKLSAgc3RydWN0IGRudHRfdHlwZV9zdHJ1Y3QgZHN0cnVjdDsKLSAgc3RydWN0IGRudHRfdHlwZV91bmlvbiBkdW5pb247Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZmllbGQgZGZpZWxkOwotICBzdHJ1Y3QgZG50dF90eXBlX2Z1bmN0eXBlIGRmdW5jdHlwZTsKLSAgc3RydWN0IGRudHRfdHlwZV93aXRoIGR3aXRoOwotICBzdHJ1Y3QgZG50dF90eXBlX2Z1bmN0aW9uIGRibG9ja2RhdGE7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfY2xhc3Nfc2NvcGUgZGNsYXNzX3Njb3BlOwotICBzdHJ1Y3QgZG50dF90eXBlX3BvaW50ZXIgZHJlZmVyZW5jZTsKLSAgc3RydWN0IGRudHRfdHlwZV9wdHJtZW0gZHB0cm1lbTsKLSAgc3RydWN0IGRudHRfdHlwZV9wdHJtZW1mdW5jIGRwdHJtZW1mdW5jOwotICBzdHJ1Y3QgZG50dF90eXBlX2NsYXNzIGRjbGFzczsKLSAgc3RydWN0IGRudHRfdHlwZV9nZW5maWVsZCBkZ2VuZmllbGQ7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfdmZ1bmMgZHZmdW5jOwotICBzdHJ1Y3QgZG50dF90eXBlX21lbWFjY2VzcyBkbWVtYWNjZXNzOwotICBzdHJ1Y3QgZG50dF90eXBlX2luaGVyaXRhbmNlIGRpbmhlcml0YW5jZTsKLSAgc3RydWN0IGRudHRfdHlwZV9mcmllbmRfY2xhc3MgZGZyaWVuZF9jbGFzczsKLSAgc3RydWN0IGRudHRfdHlwZV9mcmllbmRfZnVuYyBkZnJpZW5kX2Z1bmM7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfbW9kaWZpZXIgZG1vZGlmaWVyOwotICBzdHJ1Y3QgZG50dF90eXBlX29iamVjdF9pZCBkb2JqZWN0X2lkOwotICBzdHJ1Y3QgZG50dF90eXBlX3RlbXBsYXRlIGR0ZW1wbGF0ZTsKLSAgc3RydWN0IGRudHRfdHlwZV90ZW1wbF9hcmcgZHRlbXBsX2FyZzsKLSAgc3RydWN0IGRudHRfdHlwZV9mdW5jX3RlbXBsYXRlIGRmdW5jX3RlbXBsYXRlOwotICBzdHJ1Y3QgZG50dF90eXBlX2xpbmsgZGxpbms7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZG9jX2Z1bmN0aW9uIGRkb2NmdW5jOwotICBzdHJ1Y3QgZG50dF90eXBlX2dlbmVyaWMgZGdlbmVyaWM7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfYmxvY2sgZGJsb2NrOwotfTsKLQotLyogU291cmNlIGxpbmUgZW50cnkgdHlwZXMuICAqLwotZW51bSBzbHR0eXBlCi17Ci0gIFNMVF9OT1JNQUwsCi0gIFNMVF9TUkNGSUxFLAotICBTTFRfTU9EVUxFLAotICBTTFRfRlVOQ1RJT04sCi0gIFNMVF9FTlRSWSwKLSAgU0xUX0JFR0lOLAotICBTTFRfRU5ELAotICBTTFRfV0lUSCwKLSAgU0xUX0VYSVQsCi0gIFNMVF9BU1NJU1QsCi0gIFNMVF9NQVJLRVIsCi0gIFNMVF9DTEFTU19TQ09QRSwKLSAgU0xUX0lOTE4sCi0gIFNMVF9OT1JNQUxfT0ZGU0VULAotfTsKLQotLyogQSBub3JtYWwgc291cmNlIGxpbmUgZW50cnkuICBTaW1wbHkgcHJvdmlkZXMgYSBtYXBwaW5nIG9mIGEgc291cmNlCi0gICBsaW5lIG51bWJlciB0byBhIGNvZGUgYWRkcmVzcy4KLQotICAgU0xUREVTQyB3aWxsIGFsd2F5cyBiZSBTTFRfTk9STUFMIG9yIFNMVF9FWElULiAgKi8KLQotc3RydWN0IHNsdF9ub3JtYWwKLXsKLSAgdW5zaWduZWQgaW50IHNsdGRlc2M6CTQ7Ci0gIHVuc2lnbmVkIGludCBsaW5lOgkyODsKLSAgQ09SRV9BRERSIGFkZHJlc3M7Ci19OwotCi1zdHJ1Y3Qgc2x0X25vcm1hbF9vZmYKLXsKLSAgdW5zaWduZWQgaW50IHNsdGRlc2M6CTQ7Ci0gIHVuc2lnbmVkIGludCBvZmZzZXQ6CTY7Ci0gIHVuc2lnbmVkIGludCBsaW5lOgkyMjsKLSAgQ09SRV9BRERSIGFkZHJlc3M7Ci19OwotCi0vKiBBIHNwZWNpYWwgc291cmNlIGxpbmUgZW50cnkuICBQcm92aWRlcyBhIG1hcHBpbmcgb2YgYSBkZWNsYXJhdGlvbgotICAgdG8gYSBsaW5lIG51bWJlci4gIFRoZXNlIGVudHJpZXMgcG9pbnQgYmFjayBpbnRvIHRoZSBETlRUIHdoaWNoCi0gICByZWZlcmVuY2VzIHRoZW0uICAqLwotCi1zdHJ1Y3Qgc2x0X3NwZWNpYWwKLXsKLSAgdW5zaWduZWQgaW50IHNsdGRlc2M6CTQ7Ci0gIHVuc2lnbmVkIGludCBsaW5lOgkyODsKLSAgZG50dHBvaW50ZXIgYmFja3B0cjsKLX07Ci0KLS8qIFVzZWQgdG8gZGVzY3JpYmUgbmVzdGluZy4KLQotICAgRm9yIG5lc3RlZCBsYW5ndWFnZXMsIGFuIHNsdF9hc3Npc3QgZW50cnkgbXVzdCBmb2xsb3cgZWFjaCBTTFRfRlVOQwotICAgZW50cnkgaW4gdGhlIFNMVC4gIFRoZSBhZGRyZXNzIGZpZWxkIHdpbGwgcG9pbnQgZm9yd2FyZCB0byB0aGUKLSAgIGZpcnN0IHNsdF9ub3JtYWwgZW50cnkgd2l0aGluIHRoZSBmdW5jdGlvbidzIHNjb3BlLiAgKi8KLQotc3RydWN0IHNsdF9hc3Npc3QKLXsKLSAgdW5zaWduZWQgaW50IHNsdGRlc2M6CTQ7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CTI4OwotICBzbHRwb2ludGVyIGFkZHJlc3M7Ci19OwotCi1zdHJ1Y3Qgc2x0X2dlbmVyaWMKLXsKLSAgdW5zaWduZWQgaW50IHdvcmRbMl07Ci19OwotCi11bmlvbiBzbHRlbnRyeQotewotICBzdHJ1Y3Qgc2x0X25vcm1hbCBzbm9ybTsKLSAgc3RydWN0IHNsdF9ub3JtYWxfb2ZmIHNub3Jtb2ZmOwotICBzdHJ1Y3Qgc2x0X3NwZWNpYWwgc3NwZWM7Ci0gIHN0cnVjdCBzbHRfYXNzaXN0IHNhc3N0OwotICBzdHJ1Y3Qgc2x0X2dlbmVyaWMgc2dlbmVyaWM7Ci19OwotCi0vKiAgJExJTkVTJCBkZWNsYXJhdGlvbnMKLSAqICBUaGlzIGlzIHRoZSBsaW5lIHRhYmxlIHVzZWQgZm9yIG9wdGltaXplZCBjb2RlLCB3aGljaCBpcyBvbmx5IHByZXNlbnQgCi0gKiAgaW4gdGhlIG5ldyAkUFJPR1JBTV9JTkZPJCBkZWJ1ZyBzcGFjZS4gIAotICovCi0KLSNkZWZpbmUgRFNUX0xOX0VTQ0FQRV9GTEFHMSAgIDE1Ci0jZGVmaW5lIERTVF9MTl9FU0NBUEVfRkxBRzIgICAxNAotI2RlZmluZSBEU1RfTE5fQ1RYX1NQRUMxICAgICAgMTMgIAotI2RlZmluZSBEU1RfTE5fQ1RYX1NQRUMyICAgICAgMTIKLQotLyoKLSAgRXNjYXBlIGZ1bmN0aW9uIGNvZGVzOgotKi8KLXR5cGVkZWYgZW51bQotICAgIHsKLSAgICBkc3RfbG5fcGFkLCAgICAgICAgICAvKiBwYWQgYnl0ZSAqLwotICAgIGRzdF9sbl9lc2NhcGVfMSwgICAgIC8qIHJlc2VydmVkICovCi0gICAgZHN0X2xuX2RwYzFfZGxuMSwgICAgLyogMSBieXRlIGxpbmUgZGVsdGEsIDEgYnl0ZSBwYyBkZWx0YSAqLwotICAgIGRzdF9sbl9kcGMyX2RsbjIsICAgIC8qIDIgYnl0ZXMgbGluZSBkZWx0YSwgMiBieXRlcyBwYyBkZWx0YSAqLwotICAgIGRzdF9sbl9wYzRfbG40LCAgICAgIC8qIDQgYnl0ZXMgQUJTT0xVVEUgbGluZSBudW1iZXIsIDQgYnl0ZXMgQUJTT0xVVEUgcGMgKi8KLSAgICBkc3RfbG5fZHBjMF9kbG4xLCAgICAvKiAxIGJ5dGUgbGluZSBkZWx0YSwgcGMgZGVsdGEgPSAwICovCi0gICAgZHN0X2xuX2xuX29mZl8xLCAgICAgLyogc3RhdGVtZW50IGVzY2FwZSwgc3RtdCAjID0gMSAoMm5kIHN0bXQgb24gbGluZSkgKi8KLSAgICBkc3RfbG5fbG5fb2ZmLCAgICAgICAvKiBzdGF0ZW1lbnQgZXNjYXBlLCBzdG10ICMgPSBuZXh0IGJ5dGUgKi8KLSAgICBkc3RfbG5fZW50cnksICAgICAgICAvKiBlbnRyeSBlc2NhcGUsIG5leHQgYnl0ZSBpcyBlbnRyeSBudW1iZXIgKi8KLSAgICBkc3RfbG5fZXhpdCwgICAgICAgICAvKiBleGl0IGVzY2FwZSAqLwotICAgIGRzdF9sbl9zdG10X2VuZCwgICAgIC8qIGdhcCBlc2NhcGUsIDQgYnl0ZXMgcGMgZGVsdGEgKi8KLSAgICBkc3RfbG5fc3RtdF9jcCwgICAgICAvKiBjdXJyZW50IHN0bXQgaXMgYSBjcml0aWNhbCBwb2ludCAqLwotICAgIGRzdF9sbl9lc2NhcGVfMTIsICAgIC8qIHJlc2VydmVkICovCi0gICAgZHN0X2xuX2VzY2FwZV8xMywgICAgLyogdGhpcyBpcyBhbiBleGNlcHRpb24gc2l0ZSByZWNvcmQgKi8KLSAgICBkc3RfbG5fbnh0X2J5dGUsICAgICAvKiBuZXh0IGJ5dGUgY29udGFpbnMgdGhlIHJlYWwgZXNjYXBlIGNvZGUgKi8KLSAgICBkc3RfbG5fZW5kLCAgICAgICAgICAvKiBlbmQgZXNjYXBlLCBmaW5hbCBlbnRyeSBmb2xsb3dzICovCi0gICAgZHN0X2xuX2VzY2FwZTFfRU5EX09GX0VOVU0KLSAgICB9Ci0gICAgZHN0X2xuX2VzY2FwZTFfdDsKLQotdHlwZWRlZiBlbnVtCi0gICAgewotICAgIGRzdF9sbl9jdHhfMSwgICAgICAgIC8qIG5leHQgYnl0ZSBkZXNjcmliZXMgY29udGV4dCBzd2l0Y2ggd2l0aCA1LWJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGludG8gdGhlIGltYWdlIHRhYmxlIGFuZCAzLWJpdCBydW4gbGVuZ3RoLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHJ1biBsZW5ndGggaXMgMCwgZW5kIHdpdGggYW5vdGhlciBjeHQgc3BlY2lmaWVyIG9yIGN0eF9lbmQgKi8KLSAgICBkc3RfbG5fY3R4XzIsICAgICAgICAvKiBuZXh0IDIgYnl0ZXMgc3dpdGNoIGNvbnRleHQ6IDEzIGJpdCBpbmRleCwgMyBiaXQgcnVuIGxlbmd0aCAqLwotICAgIGRzdF9sbl9jdHhfNCwgICAgICAgIC8qIG5leHQgNCBieXRlcyBzd2l0Y2ggY29udGV4dDogMjkgYml0IGluZGV4LCAzIGJpdCBydW4gbGVuZ3RoICovCi0gICAgZHN0X2xuX2N0eF9lbmQsICAgICAgLyogZW5kIGN1cnJlbnQgY29udGV4dCAqLwotICAgIGRzdF9sbl9jb2xfcnVuXzEsICAgIC8qIG5leHQgYnl0ZSBpcyBjb2x1bW4gcG9zaXRpb24gb2Ygc3RhcnQgb2YgbmV4dCBzdGF0ZW1lbnQsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9sbG93aW5nIGJ5dGUgaXMgbGVuZ3RoIG9mIHN0YXRlbWVudCAqLwotICAgIGRzdF9sbl9jb2xfcnVuXzIsICAgIC8qIG5leHQgMiBieXRlcyBpcyBjb2x1bW4gcG9zaXRpb24gb2Ygc3RhcnQgb2YgbmV4dCBzdGF0ZW1lbnQsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9sbG93aW5nIDIgYnl0ZXMgaXMgbGVuZ3RoIG9mIHN0YXRlbWVudCAqLwotICAgIGRzdF9sbl9pbml0X2Jhc2UxLCAgIC8qIG5leHQgNCBieXRlcyBhcmUgYWJzb2x1dGUgUEMsIGZvbGxvd2VkIGJ5IDEgYnl0ZSBvZiBsaW5lIG51bWJlciAqLwotICAgIGRzdF9sbl9pbml0X2Jhc2UyLCAgIC8qIG5leHQgNCBieXRlcyBhcmUgYWJzb2x1dGUgUEMsIGZvbGxvd2VkIGJ5IDIgYnl0ZXMgb2YgbGluZSBudW1iZXIgKi8KLSAgICBkc3RfbG5faW5pdF9iYXNlMywgICAvKiBuZXh0IDQgYnl0ZXMgYXJlIGFic29sdXRlIFBDLCBmb2xsb3dlZCBieSAzIGJ5dGVzIG9mIGxpbmUgbnVtYmVyICovCi0gICAgZHN0X2xuX2VzY2FwZTJfRU5EX09GX0VOVU0KLSAgICB9Ci0gICAgZHN0X2xuX2VzY2FwZTJfdDsgICAgICAgICAgIAotCi10eXBlZGVmIHVuaW9uCi0gICAgewotICAgIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgICAgIHBjX2RlbHRhIDogNDsgICAgICAvKiA0IGJpdCBwYyBkZWx0YSAqLwotICAgICAgICBpbnQgICAgICAgICAgICAgICBsbl9kZWx0YSA6IDQ7ICAgICAgLyogNCBiaXQgbGluZSBudW1iZXIgZGVsdGEgKi8KLSAgICAgICAgfQotICAgICAgICBkZWx0YTsKLQotICAgIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgICAgIGVzY19mbGFnIDogNDsgICAgICAvKiBhbGlhcyBmb3IgcGNfZGVsdGEgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgIGVzY19jb2RlIDogNDsgICAgICAvKiBlc2NhcGUgZnVuY3Rpb24gY29kZSAoZHN0X2xuX2VzY2FwZTFfdCwgb3IgLi4uMl90ICovCi0gICAgICAgIH0KLSAgICAgICAgZXNjOwotCi0gICAgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgZXNjX2ZsYWcgOiA0OyAgICAgIC8qIGRzdF9sbl9jdHhfc3BlYzEsIG9yIGRzdF9sbl9jdHhfc3BlYzIgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgcnVuX2xlbmd0aCA6IDI7ICAgICAgCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgIGN0eF9pbmRleCA6IDI7ICAgICAgLyogLi4uc3BlYzIgY29udGFpbnMgaW5kZXg7ICAuLi5zcGVjMSwgaW5kZXggLSA0ICovCi0gICAgICAgIH0KLSAgICAgICAgY3R4X3NwZWM7Ci0KLSAgICBjaGFyICAgICAgICAgICAgICAgc2RhdGE7ICAgICAgICAgICAgICAgLyogc2lnbmVkIGRhdGEgYnl0ZSAqLwotICAgIHVuc2lnbmVkIGNoYXIgICAgICB1ZGF0YTsgICAgICAgICAgICAgICAvKiB1bnNpZ25lZCBkYXRhIGJ5dGUgKi8KLSAgICB9Ci0gICAgZHN0X2xuX2VudHJ5X3QsCi0gICAgKmRzdF9sbl9lbnRyeV9wdHJfdDsKLQotLyogV2FybmluZzogYWx0aG91Z2ggdGhlIGFib3ZlIHVuaW9uIG9jY3VwaWVzIG9ubHkgMSBieXRlIHRoZSBjb21waWxlciB0cmVhdHMKLSAqIGl0IGFzIGhhdmluZyBzaXplIDIgKHRoZSBtaW5pbXVtIHNpemUgb2YgYSBzdHJ1Y3QpLiAgVGhlcmVmb3JlIGEgc2VxdWVuY2Ugb2YKLSAqIGRzdF9sbl9lbnRyeV90J3MgY2Fubm90IGJlIGRlc2NyaWJlZCBhcyBhbiBhcnJheSwgYW5kIHdhbGtpbmcgdGhyb3VnaCBzdWNoIGEKLSAqIHNlcXVlbmNlIHJlcXVpcmVzIGNvbnZvbHV0ZWQgY29kZSBzdWNoIGFzCi0gKiAgICAgIGxuX3B0ciA9IChkc3RfbG5fZW50cnlfcHRyX3QpIChjaGFyKikgbG5fcHRyICsgMQotICogV2UgcmVncmV0IHRoZSBpbmNvbnZlbmllbmNlLiAqLwotCi0vKiBTdHJ1Y3R1cmUgZm9yIGludGVycHJldGluZyB0aGUgYnl0ZSBmb2xsb3dpbmcgYSBkc3RfbG5fY3R4MSBlbnRyeSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkICBpbnQgICAgICAgICAgY3R4MV9pbmRleCA6IDU7ICAgICAgLyogNSBiaXQgaW5kZXggaW50byBjb250ZXh0IHRhYmxlICovCi0gICAgdW5zaWduZWQgIGludCAgICAgICAgICBjdHgxX3J1bl9sZW5ndGggOiAzOyAvKiAzIGJpdCBydW4gbGVuZ3RoICovCi19IGRzdF9sbl9jdHgxX3QsCi0gICpkc3RfbG5fY3R4MV9wdHJfdDsKLQotLyogU3RydWN0dXJlIGZvciBpbnRlcnByZXRpbmcgdGhlIGJ5dGVzIGZvbGxvd2luZyBhIGRzdF9sbl9jdHgyIGVudHJ5ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgIGludCAgICAgICAgICBjdHgyX2luZGV4IDogMTM7ICAgICAvKiAxMyBiaXQgaW5kZXggaW50byBjb250ZXh0IHRhYmxlICovCi0gICAgdW5zaWduZWQgIGludCAgICAgICAgICBjdHgyX3J1bl9sZW5ndGggOiAzOyAvKiAzIGJpdCBydW4gbGVuZ3RoICovCi19IGRzdF9sbl9jdHgyX3QsCi0gICpkc3RfbG5fY3R4Ml9wdHJfdDsKLQotLyogU3RydWN0dXJlIGZvciBpbnRlcnByZXRpbmcgdGhlIGJ5dGVzIGZvbGxvd2luZyBhIGRzdF9sbl9jdHg0IGVudHJ5ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgIGludCAgICAgICAgICBjdHg0X2luZGV4IDogMjk7ICAgICAvKiAyOSBiaXQgaW5kZXggaW50byBjb250ZXh0IHRhYmxlICovCi0gICAgdW5zaWduZWQgIGludCAgICAgICAgICBjdHg0X3J1bl9sZW5ndGggOiAzOyAvKiAzIGJpdCBydW4gbGVuZ3RoICovCi19IGRzdF9sbl9jdHg0X3QsCi0gICpkc3RfbG5fY3R4NF9wdHJfdDsKLQotCi0vKiAgUFhEQiBkZWZpbml0aW9ucy4KLSAqCi0gKiBQWERCIGlzIGEgcG9zdC1wcm9jZXNzb3Igd2hpY2ggdGFrZXMgdGhlIGV4ZWN1dGFibGUgZmlsZQotICogYW5kIG1hc3NhZ2VzIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBzbyB0aGF0IHRoZSBkZWJ1Z2dlciBtYXkKLSAqIHN0YXJ0IHVwIGFuZCBydW4gbW9yZSBlZmZpY2llbnRseS4gIFNvbWUgb2YgdGhlIHRhc2tzCi0gKiBwZXJmb3JtZWQgYnkgUFhEQiBhcmU6Ci0gKgotICogbyAgIFJlbW92ZSBkdXBsaWNhdGUgZ2xvYmFsIHR5cGUgYW5kIHZhcmlhYmxlIGluZm9ybWF0aW9uCi0gKiAgICAgZnJvbSB0aGUgR05UVCwKLSAqCi0gKiBvICAgQXBwZW5kIHRoZSBHTlRUIG9udG8gdGhlIGVuZCBvZiB0aGUgTE5UVCBhbmQgcGxhY2UgYm90aAotICogICAgIGJhY2sgaW4gdGhlIExOVFQgc2VjdGlvbiwKLSAqCi0gKiBvICAgQnVpbGQgcXVpY2sgbG9vay11cCB0YWJsZXMgKGRlc2NyaXB0aW9uIGZvbGxvd3MpIGZvcgotICogICAgIGZpbGVzLCBwcm9jZWR1cmVzLCBtb2R1bGVzLCBhbmQgcGFyYWdyYXBocyAoZm9yIENvYm9sKSwKLSAqICAgICBwbGFjaW5nIHRoZXNlIGluIHRoZSBHTlRUIHNlY3Rpb24sCi0gKgotICogbyAgIFJlY29uc3RydWN0IHRoZSBoZWFkZXIgYXBwZWFyaW5nIGluIHRoZSBoZWFkZXIgc2VjdGlvbgotICogICAgIHRvIGFjY2VzcyB0aGlzIGluZm9ybWF0aW9uLgotICoKLSAqIFRoZSAicXVpY2sgbG9vay11cCIgdGFibGVzIGFyZSBpbiB0aGUgJEdOVFQkIHN1Yi1zcGFjZSwgaW4KLSAqIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0gKgotICogICAgIFByb2NlZHVyZXMgICAgLXNvcnRlZCBieSBhZGRyZXNzCi0gKiAgICAgU291cmNlIGZpbGVzICAtc29ydGVkIGJ5IGFkZHJlc3MgKG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZCBjb2RlIGZyb20gcm91dGluZXMpCi0gKiAgICAgTW9kdWxlcyAgICAgICAtc29ydGVkIGJ5IGFkZHJlc3MKLSAqICAgICBDbGFzc2VzICAgICAgIC08dW5zb3J0ZWQ/PgotICogICAgIEFkZHJlc3MgQWxpYXMgLXNvcnRlZCBieSBpbmRleCA8Pz4KLSAqICAgICBPYmplY3QgSURzICAgIC1zb3J0ZWQgYnkgb2JqZWN0IGlkZW50aWZpZXIKLSAqCi0gKiBNb3N0IHF1aWNrIGVudHJpZXMgaGF2ZSAoMC1iYXNlZCkgaW5kaWNlcyBpbnRvIHRoZSBMTlRUIHRhYmxlcyB0bwotICogdGhlIGZ1bGwgZW50cmllcyBmb3IgdGhlIGl0ZW0gaXQgZGVzY3JpYmVzLgotICoKLSAqIFRoZSBwb3N0LVBYREIgaGVhZGVyIGlzIGluIHRoZSAkSEVBREVSJCBzdWItc3BhY2UuICBBbGFzLCBpdAotICogb2NjdXJzIGluIGRpZmZlcmVudCBmb3JtcywgZGVwZW5kaW5nIG9uIHRoZSBvcHRpbWl6YXRpb24gbGV2ZWwKLSAqIGluIHRoZSBjb21waWxhdGlvbiBzdGVwIGFuZCB3aGV0aGVyIFBYREIgd2FzIHJ1biBvciBub3QuIFRoZQotICogd29yc3QgcGFydCBpcyB0aGUgZm9ybXMgYXJlbid0IHNlbGYtZGVzY3JpYmluZywgc28gd2UnbGwgaGF2ZQotICogdG8gZ3JvdmVsIGluIHRoZSBiaXRzIHRvIGZpZ3VyZSBvdXQgd2hhdCBraW5kIHdlJ3JlIGxvb2tpbmcgYXQKLSAqIChzZWUgaHBfZ2V0X2hlYWRlciBpbiBocC1wc3ltdGFiLXJlYWQuYykuCi0gKi8KLQotLyogUFhEQiB2ZXJzaW9ucwotICovCi0jZGVmaW5lIFBYREJfVkVSU0lPTl9DUExVU1BMVVMJMQotI2RlZmluZSBQWERCX1ZFUlNJT05fN180CTIKLSNkZWZpbmUgUFhEQl9WRVJTSU9OX0NQUF8zMAkzCi0jZGVmaW5lIFBYREJfVkVSU0lPTl9EREVfM18yQQk0Ci0jZGVmaW5lIFBYREJfVkVSU0lPTl9EREVfM18yCTUKLSNkZWZpbmUgUFhEQl9WRVJTSU9OX0RERV80XzAJNgotCi0jZGVmaW5lIFBYREJfVkVSU0lPTl8yXzEJMQotCi0vKiBIZWFkZXIgdmVyc2lvbiBmb3IgdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBubyBET0MgaW5mbwotICogYnV0IHRoZSBleGVjdXRhYmxlIGhhcyBiZWVuIHByb2Nlc3NlZCBieSBweGRiICh0aGUgZWFzeQotICogY2FzZSwgZnJvbSAiY2MgLWciKS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgUFhEQl9zdHJ1Y3QgewotICAgIGludCAgICAgICAgICAgICAgcGRfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gZnVuY3Rpb24gbG9vay11cCB0YWJsZSAqLwotICAgIGludCAgICAgICAgICAgICAgZmRfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gZmlsZSBsb29rLXVwIHRhYmxlICovCi0gICAgaW50ICAgICAgICAgICAgICBtZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBtb2R1bGUgbG9vay11cCB0YWJsZSAqLwotICAgIHVuc2lnbmVkIGludCAgICAgcHhkYmVkIDogMTsgICAvKiAxID0+IGZpbGUgaGFzIGJlZW4gcHJlcHJvY2Vzc2VkICAgICAgKi8KLSAgICB1bnNpZ25lZCBpbnQgICAgIGJpZ2hkciA6IDE7ICAgLyogMSA9PiB0aGlzIGhlYWRlciBjb250YWlucyAndGltZScgd29yZCAqLwotICAgIHVuc2lnbmVkIGludCAgICAgc2FfaGVhZGVyIDogMTsvKiAxID0+IGNyZWF0ZWQgYnkgU0EgdmVyc2lvbiBvZiBweGRiICovCi0JCQkgICAgICAgICAgIC8qICAgdXNlZCBmb3IgdmVyc2lvbiBjaGVjayBpbiB4ZGIgKi8KLSAgICB1bnNpZ25lZCBpbnQgICAgIGlubGluZWQ6IDE7ICAgLyogb25lIG9yIG1vcmUgZnVuY3Rpb25zIGhhdmUgYmVlbiBpbmxpbmVkICovCi0gICAgdW5zaWduZWQgaW50ICAgICBzcGFyZToxMjsKLSAgICBzaG9ydCAgICAgICAgICAgIHZlcnNpb247ICAgICAgLyogcHhkYiBoZWFkZXIgdmVyc2lvbiAqLwotICAgIGludCAgICAgICAgICAgICAgZ2xvYmFsczsgICAgICAvKiBpbmRleCBpbnRvIHRoZSBETlRUIHdoZXJlIEdOVFQgYmVnaW5zICovCi0gICAgdW5zaWduZWQgaW50ICAgICB0aW1lOyAgICAgICAgIC8qIG1vZGlmeSB0aW1lIG9mIGZpbGUgYmVmb3JlIGJlaW5nIHB4ZGJlZCAqLwotICAgIGludCAgICAgICAgICAgICAgcGdfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gbGFiZWwgbG9vay11cCB0YWJsZSAqLwotICAgIGludCAgICAgICAgICAgICAgZnVuY3Rpb25zOyAgICAvKiBhY3R1YWwgbnVtYmVyIG9mIGZ1bmN0aW9ucyAqLwotICAgIGludCAgICAgICAgICAgICAgZmlsZXM7ICAgICAgICAvKiBhY3R1YWwgbnVtYmVyIG9mIGZpbGVzICovCi0gICAgaW50ICAgICAgICAgICAgICBjZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBjbGFzcyBsb29rLXVwIHRhYmxlICovCi0gICAgaW50ICAgICAgICAgICAgICBhYV9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBhZGRyIGFsaWFzIGxvb2stdXAgdGFibGUgKi8KLSAgICBpbnQgICAgICAgICAgICAgIG9pX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIG9iamVjdCBpZCBsb29rLXVwIHRhYmxlICovCi19IFBYREJfaGVhZGVyLCAqUFhEQl9oZWFkZXJfcHRyOwotCi0vKiBIZWFkZXIgdmVyc2lvbiBmb3IgdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBubyBET0MgaW5mbyBhbmQgdGhlCi0gKiBleGVjdXRhYmxlIGhhcyBOT1QgYmVlbiBwcm9jZXNzZWQgYnkgcHhkYi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgWERCX2hlYWRlcl9zdHJ1Y3QgewotICAgIGxvbmcgZ250dF9sZW5ndGg7IAotICAgIGxvbmcgbG50dF9sZW5ndGg7IAotICAgIGxvbmcgc2x0X2xlbmd0aDsgCi0gICAgbG9uZyB2dF9sZW5ndGg7IAotICAgIGxvbmcgeHRfbGVuZ3RoOyAKLX0gWERCX2hlYWRlcjsKLQotLyogSGVhZGVyIHZlcnNpb24gZm9yIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgRE9DIGluZm8gYW5kIHRoZQotICogZXhlY3V0YWJsZSBoYXMgYmVlbiBwcm9jZXNzZWQgYnkgcHhkYi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgRE9DX2luZm9fUFhEQl9oZWFkZXJfc3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgaW50IHhkYl9oZWFkZXI6IDE7IAkgICAgLyogYml0IHNldCBpZiB0aGlzIGlzIHBvc3QtMy4xIHhkYiAqLyAKLSAgICAgICAgdW5zaWduZWQgaW50IGRvY19oZWFkZXI6IDE7ICAgICAgICAgLyogYml0IHNldCBpZiB0aGlzIGlzIGRvYy1zdHlsZSBoZWFkZXIqLwotICAgICAgICB1bnNpZ25lZCBpbnQgdmVyc2lvbjogODsgICAgICAgICAgICAvKiB2ZXJzaW9uIG9mIHB4ZGIgc2VlIGRlZmluZXMKLQkJCQkJICAgICAqIFBYREJfVkVSU0lPTl8qIGluIHRoaXMgZmlsZSAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfZm9yX2ZsYWdzOiAxNjsvKiBmb3IgZnV0dXJlIHVzZTsgLS0gbXVzdCBiZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIHNldCB0byB6ZXJvICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX2F1eF9wZF90YWJsZTogMTsgICAvKiAkR05UVCQgaGFzIGF1eCBQRCB0YWJsZSAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX2V4cHJfdGFibGU6IDE7ICAgICAvKiBzcGFjZSBoYXMgJEVYUFIkICovICAgICAgIAotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX3JhbmdlX3RhYmxlOiAxOyAgICAvKiBzcGFjZSBoYXMgJFJBTkdFJCAqLyAgICAgICAKLSAgICAgICAgdW5zaWduZWQgaW50IGhhc19jb250ZXh0X3RhYmxlOiAxOyAgLyogc3BhY2UgaGFzICRTUkNfQ1RYVCQgKi8gICAgCi0gICAgICAgIHVuc2lnbmVkIGludCBoYXNfbGluZXNfdGFibGU6IDE7ICAgIC8qIHNwYWNlIGNvbnRhaW5zIGEgJExJTkVTJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgc3Vic3BhY2UgZm9yIGxpbmUgdGFibGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50IGhhc19sdF9vZmZzZXRfbWFwOiAxOyAgLyogc3BhY2UgY29udGFpbnMgYW4gbHRfb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBzdWJzcGFjZSBmb3IgbGluZSB0YWJsZSBtYXBwaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAvKiB0aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgaW4gdGhlIFBYREJfaGVhZGVyIGluICRERUJVRyQgKi8KLSAgICAgICAgaW50ICAgICAgcGRfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gZnVuY3Rpb24gbG9vay11cCB0YWJsZSAqLwotICAgICAgICBpbnQgICAgICBmZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBmaWxlIGxvb2stdXAgdGFibGUgKi8KLSAgICAgICAgaW50ICAgICAgbWRfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gbW9kdWxlIGxvb2stdXAgdGFibGUgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICBweGRiZWQgOiAxOyAgIC8qIDEgPT4gZmlsZSBoYXMgYmVlbiBwcmVwcm9jZXNzZWQgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGJpZ2hkciA6IDE7ICAgLyogMSA9PiB0aGlzIGhlYWRlciBjb250YWlucyAndGltZScgd29yZCAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHNhX2hlYWRlciA6IDE7LyogMSA9PiBjcmVhdGVkIGJ5IFNBIHZlcnNpb24gb2YgcHhkYiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgdXNlZCBmb3IgdmVyc2lvbiBjaGVjayBpbiB4ZGIgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICBpbmxpbmVkOiAxOyAgIC8qIG9uZSBvciBtb3JlIGZ1bmN0aW9ucyBoYXZlIGJlZW4gaW5saW5lZCAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHNwYXJlIDogMjg7Ci0gICAgICAgIGludCAgICAgIGdsb2JhbHM7ICAgICAgLyogaW5kZXggaW50byB0aGUgRE5UVCB3aGVyZSBHTlRUIGJlZ2lucyAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHRpbWU7ICAgICAgICAgLyogbW9kaWZ5IHRpbWUgb2YgZmlsZSBiZWZvcmUgYmVpbmcgcHhkYmVkICovCi0gICAgICAgIGludCAgICAgIHBnX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIGxhYmVsIGxvb2stdXAgdGFibGUgKi8KLSAgICAgICAgaW50ICAgICAgZnVuY3Rpb25zOyAgICAvKiBhY3R1YWwgbnVtYmVyIG9mIGZ1bmN0aW9ucyAqLwotICAgICAgICBpbnQgICAgICBmaWxlczsgICAgICAgIC8qIGFjdHVhbCBudW1iZXIgb2YgZmlsZXMgKi8KLSAgICAgICAgaW50ICAgICAgY2RfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gY2xhc3MgbG9vay11cCB0YWJsZSAqLwotICAgICAgICBpbnQgICAgICBhYV9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBhZGRyIGFsaWFzIGxvb2stdXAgdGFibGUgKi8KLSAgICAgICAgaW50ICAgICAgb2lfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gb2JqZWN0IGlkIGxvb2stdXAgdGFibGUgKi8KLX0gRE9DX2luZm9fUFhEQl9oZWFkZXI7Ci0KLS8qIEhlYWRlciB2ZXJzaW9uIGZvciB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIERPQyBpbmZvIGFuZCB0aGUKLSAqIGV4ZWN1dGFibGUgaGFzIE5PVCBiZWVuIHByb2Nlc3NlZCBieSBweGRiLgotICovCi10eXBlZGVmIHN0cnVjdCBET0NfaW5mb19oZWFkZXJfc3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgaW50IHhkYl9oZWFkZXI6IDE7IAkvKiBiaXQgc2V0IGlmIHRoaXMgaXMgcG9zdC0zLjEgeGRiICovIAotICAgICAgICB1bnNpZ25lZCBpbnQgZG9jX2hlYWRlcjogMTsgICAgIC8qIGJpdCBzZXQgaWYgdGhpcyBpcyBkb2Mtc3R5bGUgaGVhZGVyKi8KLSAgICAgICAgdW5zaWduZWQgaW50IHZlcnNpb246IDg7ICAgICAgICAgICAgIC8qIHZlcnNpb24gb2YgZGVidWcvaGVhZGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LiBGb3IgMTAuMCB0aGUgdmFsdWUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIDEuIEZvciAiRGF2aXMiIHRoZQotCQkJCQkJdmFsdWUgaXMgMi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGludCByZXNlcnZlZF9mb3JfZmxhZ3M6IDE4OyAvKiBmb3IgZnV0dXJlIHVzZTsgLS0gbXVzdCBiZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byB6ZXJvICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50IGhhc19yYW5nZV90YWJsZTogMTsgICAgIC8qIHNwYWNlIGNvbnRhaW5zIGEgJFJBTkdFJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3BhY2UgZm9yIHZhcmlhYmxlIHJhbmdlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX2NvbnRleHRfdGFibGU6IDE7ICAgICAvKiBzcGFjZSBjb250YWlucyBhICRDVFhUJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3BhY2UgZm9yIGNvbnRleHQvaW5saW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGludCBoYXNfbGluZXNfdGFibGU6IDE7ICAgICAvKiBzcGFjZSBjb250YWlucyBhICRMSU5FUyQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNwYWNlIGZvciBsaW5lIHRhYmxlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGludCBoYXNfbHRfb2Zmc2V0X21hcDogMTsgICAvKiBzcGFjZSBjb250YWlucyBhbiBsdF9vZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNwYWNlIGZvciBsaW5lIHRhYmxlIG1hcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgIGxvbmcgICBnbnR0X2xlbmd0aDsgIC8qIHNhbWUgYXMgb2xkIGhlYWRlciAqLwotICAgICAgICBsb25nICAgbG50dF9sZW5ndGg7ICAvKiBzYW1lIGFzIG9sZCBoZWFkZXIgKi8KLSAgICAgICAgbG9uZyAgIHNsdF9sZW5ndGg7ICAgLyogc2FtZSBhcyBvbGQgaGVhZGVyICovCi0gICAgICAgIGxvbmcgICB2dF9sZW5ndGg7ICAgIC8qIHNhbWUgYXMgb2xkIGhlYWRlciAqLwotICAgICAgICBsb25nICAgeHRfbGVuZ3RoOyAgICAvKiBzYW1lIGFzIG9sZCBoZWFkZXIgKi8KLSAgICAgICAgbG9uZyAgIGN0eHRfbGVuZ3RoOyAgLyogcHJlc2VudCBvbmx5IGlmIHZlcnNpb24gPj0gMiAqLwotICAgICAgICBsb25nICAgcmFuZ2VfbGVuZ3RoOyAgLyogcHJlc2VudCBvbmx5IGlmIHZlcnNpb24gPj0gMiAqLwotICAgICAgICBsb25nICAgZXhwcl9sZW5ndGg7ICAvKiBwcmVzZW50IG9ubHkgaWYgdmVyc2lvbiA+PSAyICovCi0KLX0gRE9DX2luZm9faGVhZGVyOwotCi10eXBlZGVmIHVuaW9uIEdlbmVyaWNEZWJ1Z0hlYWRlcl91bmlvbgotewotICAgUFhEQl9oZWFkZXIgICAgICAgICAgbm9fZG9jOwotICAgRE9DX2luZm9fUFhEQl9oZWFkZXIgZG9jOwotICAgWERCX2hlYWRlciAgICAgICAgICAgbm9fcHhkYl9ub19kb2M7Ci0gICBET0NfaW5mb19oZWFkZXIgICAgICBub19weGRiX2RvYzsKLX0gR2VuZXJpY0RlYnVnSGVhZGVyOwotCi0KLS8qICBQcm9jZWR1cmUgRGVzY3JpcHRvcjoKLSAqCi0gKiAgQW4gZWxlbWVudCBvZiB0aGUgcHJvY2VkdXJlIHF1aWNrIGxvb2stdXAgdGFibGUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgcXVpY2tfcHJvY2VkdXJlIHsKLSAgICAgICAgbG9uZyAgICAgICAgICAgICBpc3ltOwkJLyogMC1iYXNlZCBpbmRleCBvZiBmaXJzdCBzeW1ib2wqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgZm9yIHByb2NlZHVyZSBpbiAkTE5UVCQsICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIGkuZS4gdGhlIHByb2NlZHVyZSBpdHNlbGYgICovCi0gICAgICAgIENPUkVfQUREUgkgYWRyU3RhcnQ7CS8qIG1lbW9yeSBhZHIgb2Ygc3RhcnQgb2YgcHJvYwkqLwotICAgICAgICBDT1JFX0FERFIJIGFkckVuZDsJLyogbWVtb3J5IGFkciBvZiBlbmQgb2YgcHJvYwkqLwotICAgICAgICBjaGFyICAgICAgICAgICAJKnNiQWxpYXM7CS8qIGFsaWFzIG5hbWUgb2YgcHJvY2VkdXJlCSovCi0gICAgICAgIGNoYXIgICAgICAgICAgICAqc2JQcm9jOwkvKiByZWFsIG5hbWUgb2YgcHJvY2VkdXJlCSovCi0gICAgICAgIENPUkVfQUREUgkgYWRyQnA7CQkvKiBhZGRyZXNzIG9mIGVudHJ5IGJyZWFrcG9pbnQgICovCi0gICAgICAgIENPUkVfQUREUgkgYWRyRXhpdEJwOwkvKiBhZGRyZXNzIG9mIGV4aXQgYnJlYWtwb2ludCAgICovCi0JaW50ICAgICAgICAgICAgICBpY2Q7ICAgICAgICAgICAvKiBtZW1iZXIgb2YgdGhpcyBjbGFzcyAoaW5kZXgpICovCQotCXVuc2lnbmVkIGludAkgaXBkOwkJLyogaW5kZXggb2YgdGVtcGxhdGUgZm9yIHRoaXMgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgZnVuY3Rpb24gKGluZGV4KSAgICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50CSB1bnVzZWQ6ICAgIDU7Ci0gICAgICAgIHVuc2lnbmVkIGludAkgbm9fbHRfb2Zmc2V0OiAxOy8qIG5vIGVudHJ5IGluIGx0X29mZnNldCB0YWJsZSAqLwotICAgICAgICB1bnNpZ25lZCBpbnQJIGZUZW1wbGF0ZTogMTsJLyogZnVuY3Rpb24gdGVtcGxhdGUJCSovCi0gICAgICAgIHVuc2lnbmVkIGludAkgZkV4cGFuc2lvbjogMTsJLyogZnVuY3Rpb24gZXhwYW5zaW9uCQkqLwotCXVuc2lnbmVkIGludAkgbGlua2VkCSAgOiAxOwkvKiBsaW5rZWQgd2l0aCBvdGhlciBleHBhbnNpb25zCSovCi0JdW5zaWduZWQgaW50CSBkdXBsaWNhdGU6IDE7ICAvKiBjbG9uZSBvZiBhbm90aGVyIHByb2NlZHVyZSAgICovCi0JdW5zaWduZWQgaW50CSBvdmVybG9hZGVkOjE7ICAvKiBvdmVybG9hZGVkIGZ1bmN0aW9uICAgICAgICAgICovCi0JdW5zaWduZWQgaW50CSBtZW1iZXI6ICAgIDE7ICAvKiBjbGFzcyBtZW1iZXIgZnVuY3Rpb24gICAgICAgICovCi0JdW5zaWduZWQgaW50CSBjb25zdHJ1Y3RvcjoxOyAvKiBjb25zdHJ1Y3RvciBmdW5jdGlvbiAgICAgICAgICovCi0JdW5zaWduZWQgaW50CSBkZXN0cnVjdG9yOjE7ICAvKiBkZXN0cnVjdG9yIGZ1bmN0aW9uICAgICAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBTdGF0aWM6ICAgIDE7ICAvKiBzdGF0aWMgZnVuY3Rpb24gICAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBWaXJ0dWFsOiAgIDE7ICAvKiB2aXJ0dWFsIGZ1bmN0aW9uICAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBjb25zdGFudDogIDE7ICAvKiBjb25zdGFudCBmdW5jdGlvbiAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBwdXJlOiAgICAgIDE7ICAvKiBwdXJlICh2aXJ0dWFsKSBmdW5jdGlvbiAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBsYW5ndWFnZTogIDQ7ICAvKiBwcm9jZWR1cmUncyBsYW5ndWFnZSAgICAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBpbmxpbmVkOiAgIDE7ICAvKiBmdW5jdGlvbiBoYXMgYmVlbiBpbmxpbmVkICAgICovCi0JdW5zaWduZWQgaW50ICAgICBPcGVyYXRvcjogIDE7ICAvKiBvcGVyYXRvciBmdW5jdGlvbiAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50CSBzdHViOiAgICAgIDE7ICAvKiBib2R5bGVzcyBmdW5jdGlvbiAgICAgICAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIGludAkgb3B0aW1pemU6ICAyOwkvKiBvcHRpbWl6YXRpb24gbGV2ZWwgICAJKi8KLSAgICAgICAgdW5zaWduZWQgaW50CSBsZXZlbDogICAgIDU7CS8qIG5lc3RpbmcgbGV2ZWwgKHRvcD0wKQkqLwotfSBxdWlja19wcm9jZWR1cmVfZW50cnksICpxdWlja19wcm9jZWR1cmVfZW50cnlfcHRyOwotCi0vKiAgU291cmNlIEZpbGUgRGVzY3JpcHRvcjoKLSAqCi0gKiAgQW4gZWxlbWVudCBvZiB0aGUgc291cmNlIGZpbGUgcXVpY2sgbG9vay11cCB0YWJsZQotICovCi10eXBlZGVmIHN0cnVjdCBxdWlja19zb3VyY2UgewotICAgICAgICBsb25nCSAgICAgICBpc3ltOwkJLyogMC1iYXNlZCBpbmRleCBpbiAkTE5UVCQgb2YgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgZmlyc3Qgc3ltYm9sIGZvciB0aGlzIGZpbGUgICAgKi8KLSAgICAgICAgQ09SRV9BRERSICAgICAgYWRyU3RhcnQ7CS8qIG1lbSBhZHIgb2Ygc3RhcnQgb2YgZmlsZSdzIGNvZGUgKi8KLSAgICAgICAgQ09SRV9BRERSICAgICAgYWRyRW5kOwkJLyogbWVtIGFkciBvZiBlbmQgb2YgZmlsZSdzIGNvZGUgICAqLwotICAgICAgICBjaGFyCSAgICAgICpzYkZpbGU7CQkvKiBuYW1lIG9mIHNvdXJjZSBmaWxlCQkgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICBmSGFzRGVjbDogMTsJLyogZG8gd2UgaGF2ZSBhIC5kIGZpbGU/CSAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgIGZXYXJuZWQ6ICAxOwkvKiBoYXZlIHdhcm5lZCBhYm91dCBhZ2UgcHJvYmxlbXM/ICovCi0JdW5zaWduZWQgaW50ICAgZlNyY2ZpbGU6IDE7ICAgICAvKiAwID0+IGluY2x1ZGUgMT0+IHNvdXJjZSAgICAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIHNob3J0IGlsbk1hYzsJCS8qIGxpbmVzIGluIGZpbGUgKDAgaWYgZG9uJ3Qga25vdykgKi8KLSAgICAgICAgaW50CSAgICAgICBpcGQ7CQkvKiAwLWJhc2VkIGluZGV4IG9mIGZpcnN0IHByb2NlZHVyZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBpbiB0aGlzIGZpbGUsIGluIHRoZSBxdWljayAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgbG9vay11cCB0YWJsZSBvZiBwcm9jZWR1cmVzICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAqcmdMbjsJCS8qIGxpbmUgcG9pbnRlciBhcnJheSwgaWYgYW55CSAgICovCi19IHF1aWNrX2ZpbGVfZW50cnksICpxdWlja19maWxlX2VudHJ5X3B0cjsKLQotLyogIE1vZHVsZSBEZXNjcmlwdG9yOgotICoKLSAqICBBbiBlbGVtZW50IG9mIHRoZSBtb2R1bGUgcXVpY2sgcmVmZXJlbmNlIHRhYmxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHF1aWNrX21vZHVsZSB7Ci0gICAgICAgIGxvbmcgICAgICAgICAgICAgaXN5bTsJCSAgIC8qIDAtYmFzZWQgaW5kZXggb2YgZmlyc3QgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIHN5bWJvbCBmb3IgbW9kdWxlICAgICAgICovCi0gICAgICAgIENPUkVfQUREUgkgYWRyU3RhcnQ7CSAgIC8qIGFkciBvZiBzdGFydCBvZiBtb2QuCSovCi0gICAgICAgIENPUkVfQUREUgkgYWRyRW5kOwkgICAvKiBhZHIgb2YgZW5kIG9mIG1vZC4JKi8KLSAgICAgICAgY2hhcgkgICAgICAgICpzYkFsaWFzOwkgICAvKiBhbGlhcyBuYW1lIG9mIG1vZHVsZSAgIAkqLwotICAgICAgICBjaGFyCSAgICAgICAgKnNiTW9kOwkJICAgLyogcmVhbCBuYW1lIG9mIG1vZHVsZQkqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGltcG9ydHM6ICAgICAgIDE7IC8qIG1vZHVsZSBoYXZlIGFueSBpbXBvcnRzPyAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICB2YXJzX2luX2Zyb250OiAxOyAvKiBtb2R1bGUgZ2xvYmFscyBpbiBmcm9udD8gICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgdmFyc19pbl9nYXBzOiAgMTsgLyogbW9kdWxlIGdsb2JhbHMgaW4gZ2Fwcz8gICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGxhbmd1YWdlOiAgICAgIDQ7IC8qIHR5cGUgb2YgbGFuZ3VhZ2UgICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICB1bnVzZWQgICAgICA6IDI1OwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHVudXNlZDI7CSAgIC8qIHNwYWNlIGZvciBmdXR1cmUgc3R1ZmYJKi8KLX0gcXVpY2tfbW9kdWxlX2VudHJ5LCAqcXVpY2tfbW9kdWxlX2VudHJ5X3B0cjsKLQotLyogIEF1eGlsaWFyeSBQcm9jZWR1cmUgRGVzY3JpcHRvcjoKLSAqCi0gKiAgQW4gZWxlbWVudCBvZiB0aGUgYXV4aWxpYXJ5IHByb2NlZHVyZSBxdWljayBsb29rLXVwIHRhYmxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHF1aWNrX2F1eF9wcm9jZWR1cmUgewotICAgICAgICBsb25nCSBpc3ltX2lubG47CS8qIHN0YXJ0IG9uIGlubGluZSBsaXN0IGZvciBwcm9jICovCi0JbG9uZyAgICAgc3BhcmU7Ci19IHF1aWNrX2F1eF9wcm9jZWR1cmVfZW50cnksICpxdWlja19hdXhfcHJvY2VkdXJlX2VudHJ5X3B0cjsKLQotLyogIFBhcmFncmFwaCBEZXNjcmlwdG9yOgotICoKLSAqICBBbiBlbGVtZW50IG9mIHRoZSBwYXJhZ3JhcGggcXVpY2sgbG9vay11cCB0YWJsZQotICovCi10eXBlZGVmIHN0cnVjdCBxdWlja19wYXJhZ3JhcGggewotICAgICAgICBsb25nICAgICAgICAgICAgIGlzeW07ICAgICAgIC8qIGZpcnN0IHN5bWJvbCBmb3IgbGFiZWwgKGluZGV4KSAgKi8KLSAgICAgICAgQ09SRV9BRERSICAgICAgICBhZHJTdGFydDsgICAvKiBtZW1vcnkgYWRyIG9mIHN0YXJ0IG9mIGxhYmVsICAgICovCi0gICAgICAgIENPUkVfQUREUiAgICAgICAgYWRyRW5kOyAgICAgLyogbWVtb3J5IGFkciBvZiBlbmQgb2YgbGFiZWwgICAgICAqLwotICAgICAgICBjaGFyICAgICAgICAgICAgKnNiTGFiOyAgICAgIC8qIG5hbWUgb2YgbGFiZWwgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICBpbnN0OyAgICAgICAvKiBVc2VkIGluIHhkYiB0byBzdG9yZSBpbnN0IEAgYnAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgc2VjdDogICAgMTsgLyogdHJ1ZSA9IHNlY3Rpb24sIGZhbHNlID0gcGFyYWcuICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHVudXNlZDogMzE7IC8qIGZ1dHVyZSB1c2UgICAgICAgICAgICAgICAgICAgICAgKi8KLX0gcXVpY2tfcGFyYWdyYXBoX2VudHJ5LCAqcXVpY2tfcGFyYWdyYXBoX2VudHJ5X3B0cjsKLQotLyoKLSAqICBDbGFzcyBEZXNjcmlwdG9yOgotICoKLSAqICBBbiBlbGVtZW50IG9mIHRoZSBjbGFzcyBxdWljayBsb29rLXVwIHRhYmxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHF1aWNrX2NsYXNzIHsKLSAgICAgICAgY2hhcgkgICAgICAgICAqc2JDbGFzczsJLyogbmFtZSBvZiBjbGFzcwkgICAgICAgICovCi0gICAgICAgIGxvbmcgICAgICAgICAgICAgIGlzeW07ICAgICAgICAgLyogY2xhc3Mgc3ltYm9sICh0YWcpICAgICAgICAgICAqLwotCXVuc2lnbmVkIGludAkgIHR5cGUgOiAyOwkvKiAwPWNsYXNzLCAxPXVuaW9uLCAyPXN0cnVjdCAgICovCi0JdW5zaWduZWQgaW50CSAgZlRlbXBsYXRlIDogMTsvKiBjbGFzcyB0ZW1wbGF0ZSAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50CSAgZXhwYW5zaW9uIDogMTsvKiB0ZW1wbGF0ZSBleHBhbnNpb24gICAgICAgICAgICovCi0JdW5zaWduZWQgaW50CSAgdW51c2VkICAgIDoyODsKLQlzbHRwb2ludGVyICAgICAgICBsb3dzY29wZTsJLyogYmVnaW5uaW5nIG9mIGRlZmluZWQgc2NvcGUgICAqLwotCXNsdHBvaW50ZXIgICAgICAgIGhpc2NvcGU7CS8qIGVuZCBvZiBkZWZpbmVkIHNjb3BlICAgICAgICAgKi8KLX0gcXVpY2tfY2xhc3NfZW50cnksICpxdWlja19jbGFzc19lbnRyeV9wdHI7Ci0KLS8qICBBZGRyZXNzIEFsaWFzIEVudHJ5Ci0gKgotICogIEFuIGVsZW1lbnQgb2YgdGhlIGFkZHJlc3MgYWxpYXMgcXVpY2sgbG9vay11cCB0YWJsZQotICovCi10eXBlZGVmIHN0cnVjdCBxdWlja19hbGlhcyB7Ci0JQ09SRV9BRERSICAgICAgIGxvdzsKLQlDT1JFX0FERFIgICAgICAgaGlnaDsKLQlpbnQgICAgICAgICAgICAgaW5kZXg7Ci0JdW5zaWduZWQgaW50CXVudXNlZCA6IDMxOwotCXVuc2lnbmVkIGludAlhbHRlcm5hdGUgOiAxOwkvKiBhbHRlcm5hdGUgdW5uYW1lZCBhbGlhc2VzPyAgICovCi19IHF1aWNrX2FsaWFzX2VudHJ5LCAqcXVpY2tfYWxpYXNfZW50cnlfcHRyOwotCi0vKiAgT2JqZWN0IElkZW50aWZpY2F0aW9uIEVudHJ5Ci0gKgotICogIEFuIGVsZW1lbnQgb2YgdGhlIG9iamVjdCBpZGVudGlmaWNhdGlvbiBxdWljayBsb29rLXVwIHRhYmxlCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgcXVpY2tfb2JqX0lEIHsKLQlDT1JFX0FERFIgICAgb2JqX2lkZW50OwkJLyogY2xhc3MgaWRlbnRpZmllciAgICAgICAgICovCi0JbG9uZyAgICAgICAgIGlzeW07CQkvKiBjbGFzcyBzeW1ib2wgICAgICAgICAgICAgKi8KLQlsb25nICAgICAgICAgb2Zmc2V0OwkJLyogb2Zmc2V0IHRvIG9iamVjdCBzdGFydCAgICovCi19IHF1aWNrX29ial9JRF9lbnRyeSwgKnF1aWNrX29ial9JRF9lbnRyeV9wdHI7Ci0KLQotI2VuZGlmIC8qIEhQX1NZTVRBQl9JTkNMVURFRCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2llZWUuaCBiL2luY2x1ZGUvaWVlZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWRlMzlkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaWVlZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qIElFRUUgU3RhbmRhcmQgNjk1LTE5ODAgIlVuaXZlcnNhbCBGb3JtYXQgZm9yIE9iamVjdCBNb2R1bGVzIiBoZWFkZXIgZmlsZQotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0jZGVmaW5lIE5fV19WQVJJQUJMRVMgOAotI2RlZmluZSBNb2R1bGVfQmVnaW5uaW5nIDB4ZTAKLQotdHlwZWRlZiBzdHJ1Y3QgaWVlZV9tb2R1bGUgewotICBjaGFyICpwcm9jZXNzb3I7Ci0gIGNoYXIgKm1vZHVsZV9uYW1lOwotfSBpZWVlX21vZHVsZV9iZWdpbl90eXBlOwotCi0jZGVmaW5lIEFkZHJlc3NfRGVzY3JpcHRvciAweGVjCi10eXBlZGVmIHN0cnVjdCBpZWVlX2FkZHJlc3MgewotYmZkX3ZtYSBudW1iZXJfb2ZfYml0c19tYXU7Ci0gYmZkX3ZtYSBudW1iZXJfb2ZfbWF1c19pbl9hZGRyZXNzOwotCi0gIHVuc2lnbmVkIGNoYXIgYnl0ZV9vcmRlcjsKLSNkZWZpbmUgSUVFRV9MSVRUTEUgMHhjYwotI2RlZmluZSBJRUVFX0JJRyAweGNkCi19IGllZWVfYWRkcmVzc19kZXNjcmlwdG9yX3R5cGU7Ci0KLXR5cGVkZWYgdW5pb24gaWVlZV93X3ZhcmlhYmxlIHsKLSAgZmlsZV9wdHIgb2Zmc2V0W05fV19WQVJJQUJMRVNdOwotICBzdHJ1Y3QgewotICAgIGZpbGVfcHRyIGV4dGVuc2lvbl9yZWNvcmQ7Ci0gICAgZmlsZV9wdHIgZW52aXJvbm1lbnRhbF9yZWNvcmQ7Ci0gICAgZmlsZV9wdHIgc2VjdGlvbl9wYXJ0OwotICAgIGZpbGVfcHRyIGV4dGVybmFsX3BhcnQ7Ci0gICAgZmlsZV9wdHIgZGVidWdfaW5mb3JtYXRpb25fcGFydDsKLSAgICBmaWxlX3B0ciBkYXRhX3BhcnQ7Ci0gICAgZmlsZV9wdHIgdHJhaWxlcl9wYXJ0OwotICAgIGZpbGVfcHRyIG1lX3JlY29yZDsKLSAgfSByOwotfSBpZWVlX3dfdmFyaWFibGVfdHlwZTsKLQotCi0KLQotCi10eXBlZGVmIGVudW0gaWVlZV9yZWNvcmQKLXsgCi0gIGllZWVfbnVtYmVyX3N0YXJ0X2VudW0gPSAweDAwLAotICBpZWVlX251bWJlcl9lbmRfZW51bT0weDdmLAotICBpZWVlX251bWJlcl9yZXBlYXRfc3RhcnRfZW51bSA9IDB4ODAsCi0gIGllZWVfbnVtYmVyX3JlcGVhdF9lbmRfZW51bSA9IDB4ODgsCi0gIGllZWVfbnVtYmVyX3JlcGVhdF80X2VudW0gPSAweDg0LAotICBpZWVlX251bWJlcl9yZXBlYXRfM19lbnVtID0gMHg4MywKLSAgaWVlZV9udW1iZXJfcmVwZWF0XzJfZW51bSA9IDB4ODIsCi0gIGllZWVfbnVtYmVyX3JlcGVhdF8xX2VudW0gPSAweDgxLAotICBpZWVlX21vZHVsZV9iZWdpbm5pbmdfZW51bSA9IDB4ZTAsCi0gIGllZWVfbW9kdWxlX2VuZF9lbnVtID0gMHhlMSwKLSAgaWVlZV9leHRlbnNpb25fbGVuZ3RoXzFfZW51bSA9IDB4ZGUsCi0gIGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8yX2VudW0gPSAweGRmLAotICBpZWVlX3NlY3Rpb25fdHlwZV9lbnVtID0gMHhlNiwKLSAgaWVlZV9zZWN0aW9uX2FsaWdubWVudF9lbnVtID0gMHhlNywKLSAgaWVlZV9leHRlcm5hbF9zeW1ib2xfZW51bSA9IDB4ZTgsCi0gIGllZWVfY29tbWEgPSAweDkwLAotICBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtID0gMHhlOSwKLSAgaWVlZV9zZXRfY3VycmVudF9zZWN0aW9uX2VudW0gPSAweGU1LAotICBpZWVlX2FkZHJlc3NfZGVzY3JpcHRvcl9lbnVtID0gMHhlYywKLSAgaWVlZV9sb2FkX2NvbnN0YW50X2J5dGVzX2VudW0gPSAweGVkLAotICBpZWVlX2xvYWRfd2l0aF9yZWxvY2F0aW9uX2VudW0gPSAweGU0LAotCi0gIGllZWVfdmFyaWFibGVfQV9lbnVtID0gMHhjMSwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9CX2VudW0gPSAweGMyLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0NfZW51bSA9IDB4YzMsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfRF9lbnVtID0gMHhjNCwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9FX2VudW0gPSAweGM1LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0ZfZW51bSA9IDB4YzYsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfR19lbnVtID0gMHhjNywJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9IX2VudW0gPSAweGM4LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0lfZW51bSA9IDB4YzksCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfSl9lbnVtID0gMHhjYSwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9LX2VudW0gPSAweGNiLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0xfZW51bSA9IDB4Y2MsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfTV9lbnVtID0gMHhjZCwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9OX2VudW0gPSAweGNlLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX09fZW51bSA9IDB4Y2YsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfUF9lbnVtID0gMHhkMCwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9RX2VudW0gPSAweGQxLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX1JfZW51bSA9IDB4ZDIsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfU19lbnVtID0gMHhkMywJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9UX2VudW0gPSAweGQ0LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX1VfZW51bSA9IDB4ZDUsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfVl9lbnVtID0gMHhkNiwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9XX2VudW0gPSAweGQ3LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX1hfZW51bSA9IDB4ZDgsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfWV9lbnVtID0gMHhkOSwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9aX2VudW0gPSAweGRhLAotICBpZWVlX2Z1bmN0aW9uX3BsdXNfZW51bSA9IDB4YTUsCi0gIGllZWVfZnVuY3Rpb25fbWludXNfZW51bSA9IDB4YTYsCi0gIGllZWVfZnVuY3Rpb25fc2lnbmVkX29wZW5fYl9lbnVtID0gMHhiYSwKLSAgaWVlZV9mdW5jdGlvbl9zaWduZWRfY2xvc2VfYl9lbnVtID0gMHhiYiwKLQotICBpZWVlX2Z1bmN0aW9uX3Vuc2lnbmVkX29wZW5fYl9lbnVtID0gMHhiYywKLSAgaWVlZV9mdW5jdGlvbl91bnNpZ25lZF9jbG9zZV9iX2VudW0gPSAweGJkLAotCi0gIGllZWVfZnVuY3Rpb25fZWl0aGVyX29wZW5fYl9lbnVtID0gMHhiZSwKLSAgaWVlZV9mdW5jdGlvbl9laXRoZXJfY2xvc2VfYl9lbnVtID0gMHhiZiwKLSAgaWVlZV9yZWNvcmRfc2VwZXJhdG9yX2VudW0gPSAweGRiLAotCi0gIGllZWVfZTJfZmlyc3RfYnl0ZV9lbnVtID0gMHhlMiwKLSAgaWVlZV9zZWN0aW9uX3NpemVfZW51bSA9IDB4ZTJkMywKLSAgaWVlZV9waHlzaWNhbF9yZWdpb25fc2l6ZV9lbnVtID0gMHhlMmMxLAotICBpZWVlX3JlZ2lvbl9iYXNlX2FkZHJlc3NfZW51bSA9IDB4ZTJjMiwKLSAgaWVlZV9tYXVfc2l6ZV9lbnVtID0gMHhlMmM2LAotICBpZWVlX21fdmFsdWVfZW51bSA9IDB4ZTJjZCwKLSAgaWVlZV9zZWN0aW9uX2Jhc2VfYWRkcmVzc19lbnVtID0gMHhlMmNjLAotICBpZWVlX2Fzbl9yZWNvcmRfZW51bSA9IDB4ZTJjZSwKLSAgaWVlZV9zZWN0aW9uX29mZnNldF9lbnVtID0gMHhlMmQyLAotICBpZWVlX3ZhbHVlX3N0YXJ0aW5nX2FkZHJlc3NfZW51bSA9IDB4ZTJjNywKLSAgaWVlZV9hc3NpZ25fdmFsdWVfdG9fdmFyaWFibGVfZW51bSA9IDB4ZTJkNywKLSAgaWVlZV9zZXRfY3VycmVudF9wY19lbnVtID0gMHhlMmQwLAotICBpZWVlX3ZhbHVlX3JlY29yZF9lbnVtID0gMHhlMmM5LAotICBpZWVlX25uX3JlY29yZCA9IDB4ZjAsCi0gIGllZWVfYXRfcmVjb3JkX2VudW0gPSAweGYxLAotICBpZWVlX3R5X3JlY29yZF9lbnVtID0gMHhmMiwKLSAgaWVlZV9hdHRyaWJ1dGVfcmVjb3JkX2VudW0gPSAweGYxYzksCi0gIGllZWVfYXRuX3JlY29yZF9lbnVtID0gMHhmMWNlLAotICBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9pbmZvX3JlY29yZF9lbnVtID0gMHhmMWQ4LAotICBpZWVlX3dlYWtfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW09IDB4ZjQsCi0gIGllZWVfcmVwZWF0X2RhdGFfZW51bSA9IDB4ZjcsCi0gIGllZWVfYmJfcmVjb3JkX2VudW0gPSAweGY4LAotICBpZWVlX2JlX3JlY29yZF9lbnVtID0gMHhmOQotfSBpZWVlX3JlY29yZF9lbnVtX3R5cGU7Ci0JCSAKLQotdHlwZWRlZiBzdHJ1Y3QgaWVlZV9zZWN0aW9uIHsKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25faW5kZXg7Ci0gIHVuc2lnbmVkIGludCBzZWN0aW9uX3R5cGU7Ci0gIGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgdW5zaWduZWQgaW50IHBhcmVudF9zZWN0aW9uX2luZGV4OwotICB1bnNpZ25lZCBpbnQgc2libGluZ19zZWN0aW9uX2luZGV4OwotICB1bnNpZ25lZCBpbnQgY29udGV4dF9pbmRleDsKLX0gaWVlZV9zZWN0aW9uX3R5cGU7Ci0jZGVmaW5lIElFRUVfUkVGRVJFTkNFX0JBU0UgMTEKLSNkZWZpbmUgSUVFRV9QVUJMSUNfQkFTRSAzMgotI2RlZmluZSBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UgMQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpYmliZXJ0eS5oIGIvaW5jbHVkZS9saWJpYmVydHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YzMTM2Ni4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpYmliZXJ0eS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3IgbGliaWJlcnR5LgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydCwgMTk5NC4KLQotICAgVGhlIGxpYmliZXJ0eSBsaWJyYXJ5IHByb3ZpZGVzIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucyB3aGljaCBhcmUKLSAgIG1pc3Npbmcgb24gc29tZSBvcGVyYXRpbmcgc3lzdGVtcy4gIFdlIGRvIG5vdCBkZWNsYXJlIHRob3NlIGhlcmUsCi0gICB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBvbiBvcGVyYXRpbmcKLSAgIHN5c3RlbXMgdGhhdCBkbyBzdXBwb3J0IHRob3NlIGZ1bmN0aW9ucy4gIEluIHRoaXMgZmlsZSB3ZSBvbmx5Ci0gICBkZWNsYXJlIHRob3NlIGZ1bmN0aW9ucyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gbGliaWJlcnR5LiAgKi8KLQotI2lmbmRlZiBMSUJJQkVSVFlfSAotI2RlZmluZSBMSUJJQkVSVFlfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0vKiBCdWlsZCBhbiBhcmd1bWVudCB2ZWN0b3IgZnJvbSBhIHN0cmluZy4gIEFsbG9jYXRlcyBtZW1vcnkgdXNpbmcKLSAgIG1hbGxvYy4gIFVzZSBmcmVlYXJndiB0byBmcmVlIHRoZSB2ZWN0b3IuICAqLwotCi1leHRlcm4gY2hhciAqKmJ1aWxkYXJndiBQQVJBTVMgKChjaGFyICopKTsKLQotLyogRnJlZSBhIHZlY3RvciByZXR1cm5lZCBieSBidWlsZGFyZ3YuICAqLwotCi1leHRlcm4gdm9pZCBmcmVlYXJndiBQQVJBTVMgKChjaGFyICoqKSk7Ci0KLS8qIER1cGxpY2F0ZSBhbiBhcmd1bWVudCB2ZWN0b3IuIEFsbG9jYXRlcyBtZW1vcnkgdXNpbmcgbWFsbG9jLiAgVXNlCi0gICBmcmVlYXJndiB0byBmcmVlIHRoZSB2ZWN0b3IuICAqLwotCi1leHRlcm4gY2hhciAqKmR1cGFyZ3YgUEFSQU1TICgoY2hhciAqKikpOwotCi0KLS8qIFJldHVybiB0aGUgbGFzdCBjb21wb25lbnQgb2YgYSBwYXRoIG5hbWUuICBOb3RlIHRoYXQgd2UgY2FuJ3QgdXNlIGEKLSAgIHByb3RvdHlwZSBoZXJlIGJlY2F1c2UgdGhlIHBhcmFtZXRlciBpcyBkZWNsYXJlZCBpbmNvbnNpc3RlbnRseQotICAgYWNyb3NzIGRpZmZlcmVudCBzeXN0ZW1zLCBzb21ldGltZXMgYXMgImNoYXIgKiIgYW5kIHNvbWV0aW1lcyBhcwotICAgImNvbnN0IGNoYXIgKiIgKi8KLQotI2lmIGRlZmluZWQgKF9fR05VX0xJQlJBUllfXyApIHx8IGRlZmluZWQgKF9fbGludXhfXykgfHwgZGVmaW5lZCAoX19GcmVlQlNEX18pIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLWV4dGVybiBjaGFyICpiYXNlbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLSNlbHNlCi1leHRlcm4gY2hhciAqYmFzZW5hbWUgKCk7Ci0jZW5kaWYKLQotLyogQ29uY2F0ZW5hdGUgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBzdHJpbmdzLCB1cCB0byAoY2hhciAqKSBOVUxMLgotICAgQWxsb2NhdGVzIG1lbW9yeSB1c2luZyB4bWFsbG9jLiAgKi8KLQotZXh0ZXJuIGNoYXIgKmNvbmNhdCBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotCi0vKiBDaGVjayB3aGV0aGVyIHR3byBmaWxlIGRlc2NyaXB0b3JzIHJlZmVyIHRvIHRoZSBzYW1lIGZpbGUuICAqLwotCi1leHRlcm4gaW50IGZkbWF0Y2ggUEFSQU1TICgoaW50IGZkMSwgaW50IGZkMikpOwotCi0vKiBHZXQgdGhlIGFtb3VudCBvZiB0aW1lIHRoZSBwcm9jZXNzIGhhcyBydW4sIGluIG1pY3Jvc2Vjb25kcy4gICovCi0KLWV4dGVybiBsb25nIGdldF9ydW5fdGltZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIENob29zZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gdXNlIGZvciBzY3JhdGNoIGZpbGVzLiAgKi8KLQotZXh0ZXJuIGNoYXIgKmNob29zZV90ZW1wX2Jhc2UgUEFSQU1TICgodm9pZCkpOwotCi0vKiBBbGxvY2F0ZSBtZW1vcnkgZmlsbGVkIHdpdGggc3BhY2VzLiAgQWxsb2NhdGVzIHVzaW5nIG1hbGxvYy4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpzcGFjZXMgUEFSQU1TICgoaW50IGNvdW50KSk7Ci0KLS8qIFJldHVybiB0aGUgbWF4aW11bSBlcnJvciBudW1iZXIgZm9yIHdoaWNoIHN0cmVycm9yIHdpbGwgcmV0dXJuIGEKLSAgIHN0cmluZy4gICovCi0KLWV4dGVybiBpbnQgZXJybm9fbWF4IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogUmV0dXJuIHRoZSBuYW1lIG9mIGFuIGVycm5vIHZhbHVlIChlLmcuLCBzdHJlcnJubyAoRUlOVkFMKSByZXR1cm5zCi0gICAiRUlOVkFMIikuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqc3RyZXJybm8gUEFSQU1TICgoaW50KSk7Ci0KLS8qIEdpdmVuIHRoZSBuYW1lIG9mIGFuIGVycm5vIHZhbHVlLCByZXR1cm4gdGhlIHZhbHVlLiAgKi8KLQotZXh0ZXJuIGludCBzdHJ0b2Vycm5vIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBBTlNJJ3Mgc3RyZXJyb3IoKSwgYnV0IG1vcmUgcm9idXN0LiAgKi8KLQotZXh0ZXJuIGNoYXIgKnhzdHJlcnJvciBQQVJBTVMgKChpbnQpKTsKLQotLyogUmV0dXJuIHRoZSBtYXhpbXVtIHNpZ25hbCBudW1iZXIgZm9yIHdoaWNoIHN0cnNpZ25hbCB3aWxsIHJldHVybiBhCi0gICBzdHJpbmcuICAqLwotCi1leHRlcm4gaW50IHNpZ25vX21heCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFJldHVybiBhIHNpZ25hbCBtZXNzYWdlIHN0cmluZyBmb3IgYSBzaWduYWwgbnVtYmVyCi0gICAoZS5nLiwgc3Ryc2lnbmFsIChTSUdIVVApIHJldHVybnMgc29tZXRoaW5nIGxpa2UgIkhhbmd1cCIpLiAgKi8KLS8qIFRoaXMgaXMgY29tbWVudGVkIG91dCBhcyBpdCBjYW4gY29uZmxpY3Qgd2l0aCBvbmUgaW4gc3lzdGVtIGhlYWRlcnMuCi0gICBXZSBzdGlsbCBkb2N1bWVudCBpdHMgZXhpc3RlbmNlIHRob3VnaC4gICovCi0KLS8qZXh0ZXJuIGNvbnN0IGNoYXIgKnN0cnNpZ25hbCBQQVJBTVMgKChpbnQpKTsqLwotCi0vKiBSZXR1cm4gdGhlIG5hbWUgb2YgYSBzaWduYWwgbnVtYmVyIChlLmcuLCBzdHJzaWdubyAoU0lHSFVQKSByZXR1cm5zCi0gICAiU0lHSFVQIikuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqc3Ryc2lnbm8gUEFSQU1TICgoaW50KSk7Ci0KLS8qIEdpdmVuIHRoZSBuYW1lIG9mIGEgc2lnbmFsLCByZXR1cm4gaXRzIG51bWJlci4gICovCi0KLWV4dGVybiBpbnQgc3RydG9zaWdubyBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotLyogUmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBiZSBydW4gYnkgeGV4aXQuICBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gICovCi0KLWV4dGVybiBpbnQgeGF0ZXhpdCBQQVJBTVMgKCh2b2lkICgqZm4pICh2b2lkKSkpOwotCi0vKiBFeGl0LCBjYWxsaW5nIGFsbCB0aGUgZnVuY3Rpb25zIHJlZ2lzdGVyZWQgd2l0aCB4YXRleGl0LiAgKi8KLQotI2lmbmRlZiBfX0dOVUNfXwotZXh0ZXJuIHZvaWQgeGV4aXQgUEFSQU1TICgoaW50IHN0YXR1cykpOwotI2Vsc2UKLXZvaWQgeGV4aXQgUEFSQU1TICgoaW50IHN0YXR1cykpIF9fYXR0cmlidXRlX18gKChub3JldHVybikpOwotI2VuZGlmCi0KLS8qIFNldCB0aGUgcHJvZ3JhbSBuYW1lIHVzZWQgYnkgeG1hbGxvYy4gICovCi0KLWV4dGVybiB2b2lkIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotLyogQWxsb2NhdGUgbWVtb3J5IHdpdGhvdXQgZmFpbC4gIElmIG1hbGxvYyBmYWlscywgdGhpcyB3aWxsIHByaW50IGEKLSAgIG1lc3NhZ2UgdG8gc3RkZXJyICh1c2luZyB0aGUgbmFtZSBzZXQgYnkgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lLAotICAgaWYgYW55KSBhbmQgdGhlbiBjYWxsIHhleGl0LiAgKi8KLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotLyogR2V0IGEgZGVmaW5pdGlvbiBmb3Igc2l6ZV90LiAgKi8KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotZXh0ZXJuIFBUUiB4bWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotCi0vKiBSZWFsbG9jYXRlIG1lbW9yeSB3aXRob3V0IGZhaWwuICBUaGlzIHdvcmtzIGxpa2UgeG1hbGxvYy4KLQotICAgRklYTUU6IFdlIGRvIG5vdCBkZWNsYXJlIHRoZSBwYXJhbWV0ZXIgdHlwZXMgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcwotICAgeG1hbGxvYy4gICovCi0KLWV4dGVybiBQVFIgeHJlYWxsb2MgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLQotLyogQWxsb2NhdGUgbWVtb3J5IHdpdGhvdXQgZmFpbCBhbmQgc2V0IGl0IHRvIHplcm8uICBUaGlzIHdvcmtzIGxpa2UKLSAgIHhtYWxsb2MuICAqLwotCi1leHRlcm4gUFRSIHhjYWxsb2MgUEFSQU1TICgoc2l6ZV90LCBzaXplX3QpKTsKLQotLyogQ29weSBhIHN0cmluZyBpbnRvIGEgbWVtb3J5IGJ1ZmZlciB3aXRob3V0IGZhaWwuICAqLwotCi1leHRlcm4gY2hhciAqeHN0cmR1cCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotLyogaGV4IGNoYXJhY3RlciBtYW5pcHVsYXRpb24gcm91dGluZXMgKi8KLQotI2RlZmluZSBfaGV4X2FycmF5X3NpemUgMjU2Ci0jZGVmaW5lIF9oZXhfYmFkCTk5Ci1leHRlcm4gY2hhciBfaGV4X3ZhbHVlW19oZXhfYXJyYXlfc2l6ZV07Ci1leHRlcm4gdm9pZCBoZXhfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIGhleF9wKGMpCShoZXhfdmFsdWUgKGMpICE9IF9oZXhfYmFkKQotLyogSWYgeW91IGNoYW5nZSB0aGlzLCBub3RlIHdlbGw6IFNvbWUgY29kZSByZWxpZXMgb24gc2lkZSBlZmZlY3RzIGluCi0gICB0aGUgYXJndW1lbnQgYmVpbmcgcGVyZm9ybWVkIGV4YWN0bHkgb25jZS4gICovCi0jZGVmaW5lIGhleF92YWx1ZShjKQkoX2hleF92YWx1ZVsodW5zaWduZWQgY2hhcikgKGMpXSkKLQotLyogRGVmaW5pdGlvbnMgdXNlZCBieSB0aGUgcGV4ZWN1dGUgcm91dGluZS4gICovCi0KLSNkZWZpbmUgUEVYRUNVVEVfRklSU1QgICAxCi0jZGVmaW5lIFBFWEVDVVRFX0xBU1QgICAgMgotI2RlZmluZSBQRVhFQ1VURV9PTkUgICAgIChQRVhFQ1VURV9GSVJTVCArIFBFWEVDVVRFX0xBU1QpCi0jZGVmaW5lIFBFWEVDVVRFX1NFQVJDSCAgNAotI2RlZmluZSBQRVhFQ1VURV9WRVJCT1NFIDgKLQotLyogRXhlY3V0ZSBhIHByb2dyYW0uICAqLwotCi1leHRlcm4gaW50IHBleGVjdXRlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY2hhciAqIGNvbnN0ICosIGNvbnN0IGNoYXIgKiwKLQkJCSAgICBjb25zdCBjaGFyICosIGNoYXIgKiosIGNoYXIgKiosIGludCkpOwotCi0vKiBXYWl0IGZvciBwZXhlY3V0ZSB0byBmaW5pc2guICAqLwotCi1leHRlcm4gaW50IHB3YWl0IFBBUkFNUyAoKGludCwgaW50ICosIGludCkpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKExJQklCRVJUWV9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvQ2hhbmdlTG9nIGIvaW5jbHVkZS9tcHcvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGJhZDg3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLVR1ZSBGZWIgMjcgMTI6MjM6MDQgMTk5NiAgUmF5bW9uZCBKb3UgIDxyam91QG1leGljYW4uY3lnbnVzLmNvbT4KLQotCSogbXB3LmggKEhBVkVfVlBSSU5URik6IEFkZCBhbmQgZGVmaW5lIHRvIGhhdmUgdGhlIHZhbHVlIDEuCi0KLUZyaSBEZWMgMjkgMTQ6NDA6NDYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHcuaCAoSEFWRV9TVERMSUJfSCwgZXRjKTogRGVmaW5lIHRvIGhhdmUgdGhlIHZhbHVlIDEuCi0JKEhBVkVfRkNOVExfSCk6IERlZmluZS4KLQotTW9uIERlYyAxMSAxNTozOTowNiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5oIChvcGVuLCBhY2Nlc3MpOiBEZWZpbmUgYXMgbXB3X29wZW4gYW5kIG1wd19hY2Nlc3MuCi0KLVRodSBOb3YgIDkgMTU6Mzg6MzcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHcuaDogSW5jbHVkZSB1bml4LmggaWYgVVNFX01XX0hFQURFUlMsIG90aGVyd2lzZSBpbmNsdWRlCi0JdmFyaW91cyBvcmlnaW5hbCBNUFcgaW5jbHVkZSBmaWxlcyAoaW9jdGwuaCwgZXRjKS4KLQkoRUlPKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCSogc3lzL2lvY3RsLmg6IFJlbW92ZSwgbm90IG5lZWRlZC4KLQotV2VkIE9jdCAyNSAxMjozMDo0NCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5oOiBEb24ndCBpbmNsdWRlIGVycm5vLmggb3IgaW9jdGwuaC4KLQkoRU5PRU5ULCBFQUNDRVMsIEVOT1NZUyk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoZmRvcGVuKTogRGVjbGFyZSBpZiBfX1NURENfXy4KLQkoUl9PSywgV19PSywgWF9PSyk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQotVHVlIFNlcCAyNiAxNDo1NzoyMSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5oOiBOZXcgZmlsZSwgdW5pdmVyc2FsbHkgdXNlZnVsIE1QVyBob3N0IGRlZmluaXRpb25zLgotCU1hbnkgb2YgdGhlc2UgdXNlZCB0byBsaXZlIGluIGJmZC9ob3N0cy9tcHcuaC4KLQkqIGdycC5oOiBSZW1vdmUgUkNTIGNvbW1lbnQuCi0JKiBzeXMvaW9jdGwuaDogQWRkIGEgY29tbWVudCBsaW5lLgotCi1XZWQgRGVjIDE0IDEzOjEyOjE0IDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogc3Bpbi5oOiBOZXcgZmlsZSwgY3Vyc29yIHNwaW5uaW5nIGZvciBwcm9ncmVzcy4KLQotVGh1IEp1biAzMCAxNTozMjowNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGZjbnRsLmggKG9wZW4pOiBBbGxvdyBvcHRpb25hbCB0aGlyZCBhcmcuCi0KLVRodSBBcHIgMTQgMTI6NTQ6NTEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBkaXIuaCwgZGlyZW50LmgsIGZjbnRsLmgsIGdycC5oLCBwd2QuaCwgc3RhdC5oOiBOZXcgZmlsZXMuCi0JKiBzeXMvaW9jdGwuaDogTmV3IGZpbGUuCi0KLU1vbiBGZWIgMjEgMDk6NDQ6NDUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBzeXMvc3RhdC5oIChzdHJ1Y3Qgc3RhdCk6IE5ldyBmaWVsZCBzdF9yc2l6ZS4KLQkoU19JRk1ULCBldGMpOiBVc2UgZGlmZmVyZW50IGJpdCBwb3NpdGlvbnMuCi0JKGZzdGF0KTogQWRkIHBhcmFtZXRlciBuYW1lcyB0byBwcm90b3R5cGUuCi0KLU1vbiBKYW4gMzEgMTk6MzA6MTYgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBSRUFETUU6IE5ldyBmaWxlLgotCSogdXRpbWUuaCwgdmFyYXJncy5oOiBOZXcgZmlsZXMsIHNpbXVsYXRlZCBQb3NpeC4KLQkqIHN5cy97ZmlsZSxwYXJhbSxyZXNvdXJjZSxzdGF0LHRpbWUsdHlwZXN9Lmg6IE5ldyBmaWxlcywgbW9yZQotCXNpbXVsYXRlZCBQb3NpeC4KLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9SRUFETUUgYi9pbmNsdWRlL21wdy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZTkyZGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVGhpcyBpcyBhIGNvbGxlY3Rpb24gb2YgaW5jbHVkZSBmaWxlcyB0aGF0IGhlbHAgaW1pdGF0ZSBQb3NpeCBpbiBNUFcuCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9kaXIuaCBiL2luY2x1ZGUvbXB3L2Rpci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmNjZDJkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L2Rpci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogVGhlIDxkaXIuaD4gaGVhZGVyIGdpdmVzIHRoZSBsYXlvdXQgb2YgYSBkaXJlY3RvcnkuICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIF9ESVJfSAotI2RlZmluZSBfRElSX0gKLQotI2lmbmRlZiBfVFlQRVNfSAkJLyogbm90IHF1aXRlIHJpZ2h0ICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLQotI2RlZmluZQlESVJCTEtTSVoJNTEyCS8qIHNpemUgb2YgZGlyZWN0b3J5IGJsb2NrICovCi0KLSNpZm5kZWYgRElSU0laCi0jZGVmaW5lCURJUlNJWgkxNAotI2VuZGlmCi0KLXN0cnVjdCBkaXJlY3QgewotICBpbm9fdCBkX2lubzsKLSAgY2hhciBkX25hbWVbRElSU0laXTsKLX07Ci0KLSNlbmRpZiAvKiBfRElSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L2RpcmVudC5oIGIvaW5jbHVkZS9tcHcvZGlyZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MDAwYjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvZGlyZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jaWZuZGVmIF9fZGlyZW50X2gKLSNkZWZpbmUgX19kaXJlbnRfaAotCi0jaW5jbHVkZSAic3lzL2Rpci5oIgotCi1zdHJ1Y3QgZGlyZW50IHsKLSAgbG9uZyBkX2lubzsJCQkvKiBpbm9kZSBudW1iZXIgb2YgZW50cnkgKi8KLSAgb2ZmX3QJZF9vZmY7CQkJLyogb2Zmc2V0IG9mIGRpc2sgZGlyZWN0b3J5IGVudHJ5ICovCi0gIHVuc2lnbmVkIHNob3J0IGRfcmVjbGVuOwkvKiBsZW5ndGggb2YgdGhpcyByZWNvcmQgKi8KLSAgY2hhciBkX25hbWVbMV07CQkvKiBuYW1lIG9mIGZpbGUgKi8KLX07Ci0KLS8qCi0jZGVmaW5lCURJUkVOVEJBU0VTSVpFIFwKLQkoKChzdHJ1Y3QgZGlyZW50ICopIDApLT5kX25hbWUgLSAoY2hhciAqKSAwKQotI2RlZmluZQlESVJFTlRTSVpFKG5hbWVsZW4pIFwKLQkoKERJUkVOVEJBU0VTSVpFICsgKG5hbWVsZW4pICsgTkJQVykgJiB+KE5CUFcgLSAxKSkKLSovCi0KLS8qIGZyb20gTWlwcyBwb3NpeC9kaXJlbnQuaCAqLwotCi0vKgotI3VuZGVmIHJld2luZGRpcgotKi8KLQotZXh0ZXJuIERJUiAqb3BlbmRpcigpOwotZXh0ZXJuIHN0cnVjdCBkaXJlbnQgKnJlYWRkaXIoKTsKLWV4dGVybiB2b2lkCQlyZXdpbmRkaXIoKTsKLWV4dGVybiBpbnQJCWNsb3NlZGlyKCk7Ci0KLSNlbmRpZiAvKiAhIF9fZGlyZW50X2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L2ZjbnRsLmggYi9pbmNsdWRlL21wdy9mY250bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDk5OWI0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L2ZjbnRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIEZDbnRsLmggLS0gZmFjY2VzcygpLCBmY250bCgpLCBhbmQgb3BlbigpIG1vZGUgZmxhZ3MKLSAqCi0gKiBQb3J0aW9ucyBjb3B5cmlnaHQgQW1lcmljYW4gVGVsZXBob25lICYgVGVsZWdyYXBoCi0gKiBVc2VkIHdpdGggcGVybWlzc2lvbiwgQXBwbGUgQ29tcHV0ZXIgSW5jLiAoMTk4NSwxOTg4LDE5OTAsMTk5MikKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKi8KLQotI2lmbmRlZiBfX0ZDTlRMX18KLSNkZWZpbmUgX19GQ05UTF9fCi0KLSNpZm5kZWYgX19UWVBFU19fCi0jaW5jbHVkZSA8VHlwZXMuaD4KLSNlbmRpZgotCi0vKgotICoJRm9yIHVzZSBieSBsc2VlaygpOgotICovCi0KLSNpZm5kZWYgX19TVERJT19fCQkJLyogdGhlc2UgZGVmbnMgZXhhY3RseSBwYXJhbGxlZCBpbiBTdGRJTy5oIGZvciBmc2VlaygpICovCi0jZGVmaW5lIFNFRUtfQ1VSCTEKLSNkZWZpbmUgU0VFS19FTkQJMgotI2RlZmluZSBTRUVLX1NFVAkwCi0jZW5kaWYKLQotLyoKLSAqIGZhY2Nlc3MoKSBjb21tYW5kczsgZm9yIGdlbmVyYWwgdXNlCi0gKi8KLSAJCQkJCS8qICdkJyA9PiAiZGlyZWN0b3J5IiBvcHMgKi8KLSNkZWZpbmUgRl9ERUxFVEUJCSgoJ2QnPDw4KXwweDAxKQotI2RlZmluZSBGX1JFTkFNRQkJKCgnZCc8PDgpfDB4MDIpCi0KLS8qCi0gKiBtb3JlIGZhY2Nlc3MoKSBjb21tYW5kczsgZm9yIHVzZSBvbmx5IGJ5IE1QVyB0b29scwotICovCi0gCi0jZGVmaW5lIEZfT1BFTiAJCQkoKCdkJzw8OCl8MHgwMCkJCS8qIHJlc2VydmVkIGZvciBvcGVyYXRpbmcgc3lzdGVtIHVzZSAqLwotCQkJCQkvKiAnZScgPT4gImVkaXRvciIgb3BzICovCi0jZGVmaW5lIEZfR1RBQklORk8gCQkoKCdlJzw8OCl8MHgwMCkJCS8qIGdldCB0YWIgb2Zmc2V0IGZvciBmaWxlICovCQotI2RlZmluZSBGX1NUQUJJTkZPIAkJKCgnZSc8PDgpfDB4MDEpCQkvKiBzZXQgCSIJIgkJIgkiICAqLwotI2RlZmluZSBGX0dGT05USU5GTwkJKCgnZSc8PDgpfDB4MDIpCQkvKiBnZXQgZm9udCBudW1iZXIgYW5kIHNpemUgZm9yIGZpbGUgKi8KLSNkZWZpbmUgRl9TRk9OVElORk8JCSgoJ2UnPDw4KXwweDAzKQkJLyogc2V0IAkiCQkiCSIJIgkiCSIgCSAqLwotI2RlZmluZSBGX0dQUklOVFJFQwkJKCgnZSc8PDgpfDB4MDQpCQkvKiBnZXQgcHJpbnQgcmVjb3JkIGZvciBmaWxlICovCi0jZGVmaW5lIEZfU1BSSU5UUkVDCQkoKCdlJzw8OCl8MHgwNSkJCS8qIHNldCAJIgkJIgkiCSIgCSAqLwotI2RlZmluZSBGX0dTRUxJTkZPIAkJKCgnZSc8PDgpfDB4MDYpCQkvKiBnZXQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIGZvciBmaWxlICovCi0jZGVmaW5lIEZfU1NFTElORk8gCQkoKCdlJzw8OCl8MHgwNykJCS8qIHNldAkJIgkJIgkJIgkJIiAqLwotI2RlZmluZSBGX0dXSU5JTkZPIAkJKCgnZSc8PDgpfDB4MDgpCQkvKiBnZXQgY3VycmVudCB3aW5kb3cgcG9zaXRpb24gKi8KLSNkZWZpbmUgRl9TV0lOSU5GTyAJCSgoJ2UnPDw4KXwweDA5KQkJLyogc2V0CSIJCSIJCSIgCSAgICovCi0jZGVmaW5lIEZfR1NDUk9MTElORk8JKCgnZSc8PDgpfDB4MEEpCQkvKiBnZXQgc2Nyb2xsIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIEZfU1NDUk9MTElORk8JKCgnZSc8PDgpfDB4MEIpCQkvKiBzZXQgICAgIiAgIAkJIiAgCSAgKi8KLSNkZWZpbmUgRl9HTUFSS0VSCQkoKCdlJzw8OCl8MHgwRCkJCS8qIEdldCBNYXJrZXIgKi8KLSNkZWZpbmUgRl9TTUFSS0VSCQkoKCdlJzw8OCl8MHgwQykJCS8qIFNldCAgICIgCSAgKi8KLSNkZWZpbmUgRl9HU0FWRU9OQ0xPU0UJKCgnZSc8PDgpfDB4MEYpCQkvKiBHZXQgU2F2ZSBvbiBjbG9zZSAqLwotI2RlZmluZSBGX1NTQVZFT05DTE9TRQkoKCdlJzw8OCl8MHgwRSkJCS8qIFNldCAgICIJICIJICIgCSAqLwotCi0vKgotICoJYXJndW1lbnQgc3RydWN0dXJlcyB1c2VkIGJ5IHZhcmlvdXMgZmFjY2VzcygpIGNvbW1hbmRzCi0gKi8KLSAKLXN0cnVjdCBNYXJrRWxlbWVudCB7Ci0JaW50CQkJCXN0YXJ0OwkJCS8qIHN0YXJ0IHBvc2l0aW9uIG9mIG1hcmsgKi8KLQlpbnQJCQkJZW5kOwkJCS8qIGVuZCBwb3NpdGlvbiAqLwotCXVuc2lnbmVkIGNoYXIJY2hhckNvdW50OwkJLyogbnVtYmVyIG9mIGNoYXJzIGluIG1hcmsgbmFtZSAqLwotCWNoYXIJCQluYW1lWzY0XTsJCS8qIG1hcmsgbmFtZSAqLwotfSA7CQkJCQkJCQkJLyogbm90ZTogbWFya2VyIG5hbWVzIG1heSBiZSB1cCB0byA2NCBjaGFyYWN0ZXJzIGxvbmcgKi8KLQotI2lmbmRlZiBfX2NwbHVzcGx1cwotdHlwZWRlZiBzdHJ1Y3QgTWFya0VsZW1lbnQgTWFya0VsZW1lbnQ7Ci0jZW5kaWYKLQotc3RydWN0IFNlbGVjdGlvblJlY29yZCB7Ci0JbG9uZwlzdGFydGluZ1BvczsKLQlsb25nCWVuZGluZ1BvczsKLQlsb25nCWRpc3BsYXlUb3A7Ci19OwotCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi10eXBlZGVmIHN0cnVjdCBTZWxlY3Rpb25SZWNvcmQgU2VsZWN0aW9uUmVjb3JkOwotI2VuZGlmCi0KLQotLyoKLSAqIE1vZGUgdmFsdWVzIGFjY2Vzc2libGUgdG8gb3BlbigpCi0gKi8KLSNkZWZpbmUgT19SRE9OTFkJCSAwIAkJLyogQml0cyAwIGFuZCAxIGFyZSB1c2VkIGludGVybmFsbHkgKi8KLSNkZWZpbmUgT19XUk9OTFkJCSAxIAkJLyogVmFsdWVzIDAuLjIgYXJlIGhpc3RvcmljYWwgKi8KLSNkZWZpbmUgT19SRFdSIAkJCSAyCQkvKiBOT1RFOiBpdCBnb2VzIDAsIDEsIDIsICohKiA4LCAxNiwgMzIsIC4uLiAqLwotI2RlZmluZSBPX0FQUEVORAkoMTw8IDMpCQkvKiBhcHBlbmQgKHdyaXRlcyBndWFyYW50ZWVkIGF0IHRoZSBlbmQpICovCi0jZGVmaW5lIE9fUlNSQyAJCSgxPDwgNCkJCS8qIE9wZW4gdGhlIHJlc291cmNlIGZvcmsgKi8KLSNkZWZpbmUgT19BTElBUwkJKDE8PCA1KQkJLyogT3BlbiBhbGlhcyBmaWxlICovCi0jZGVmaW5lIE9fQ1JFQVQJCSgxPDwgOCkJCS8qIE9wZW4gd2l0aCBmaWxlIGNyZWF0ZSAqLwotI2RlZmluZSBPX1RSVU5DCQkoMTw8IDkpCQkvKiBPcGVuIHdpdGggdHJ1bmNhdGlvbiAqLwotI2RlZmluZSBPX0VYQ0wgCQkoMTw8MTApIAkvKiB3LyBPX0NSRUFUOiAgRXhjbHVzaXZlICJjcmVhdGUtb25seSIgKi8KLSNkZWZpbmUgT19CSU5BUlkJKDE8PDExKSAJLyogT3BlbiBhcyBhIGJpbmFyeSBzdHJlYW0gKi8KLSNkZWZpbmUgT19OUkVTT0xWRQkoMTw8MTQpCQkvKiBEb24ndCByZXNvbHZlIGFueSBhbGlhc2VzICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqCQlmdW5jdGlvbiBwcm90b3R5cGVzCi0gKi8KLWludCAgY2xvc2UoaW50KTsKLWludCAgY3JlYXQoY29uc3QgY2hhciopOwotaW50CSBkdXAoaW50IGZpbGVkZXMpOwkJLyogT0JTT0xFVEU6IGZjbnRsKGZpbGVkZXMsIEZfRFVQRkQsIDApIGlzIHByZWZlcnJlZCAqLwotaW50CSBmYWNjZXNzKGNoYXIqLCB1bnNpZ25lZCBpbnQsIGxvbmcqKTsKLWludCAgZmNudGwoaW50LCB1bnNpZ25lZCBpbnQsIGludCk7Ci1sb25nIGxzZWVrKGludCwgbG9uZywgaW50KTsKLWludCAgb3Blbihjb25zdCBjaGFyKiwgaW50LCAuLi4pOwotaW50ICByZWFkKGludCwgY2hhciosIHVuc2lnbmVkKTsKLWludCAgdW5saW5rKGNoYXIqKTsKLWludCAgd3JpdGUoaW50LCBjb25zdCBjaGFyKiwgdW5zaWduZWQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0vKgotICogZmNudGwoKSBjb21tYW5kcwotICovCi0jZGVmaW5lIEZfRFVQRkQgMAkgICAvKiBEdXBsaWNhdGUgZmlsZXMgKGZpbGUgZGVzY3JpcHRvcikgKi8KLQotI2VuZGlmIF9fRkNOVExfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvZ3JwLmggYi9pbmNsdWRlL21wdy9ncnAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmMmM2YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9ncnAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAic3lzL3R5cGVzLmgiCi0KLXN0cnVjdCBncm91cCB7Ci0gIGNoYXIgKmdyX25hbWU7Ci0gIGdpZF90IGdyX2dpZDsKLSAgY2hhciAqZ3JfcGFzc3dkOwotICBjaGFyICoqZ3JfbWVtOwotfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L21wdy5oIGIvaW5jbHVkZS9tcHcvbXB3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NzAyZTcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvbXB3LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyogTWFjIE1QVyBob3N0LXNwZWNpZmljIGRlZmluaXRpb25zLiAqLwotCi0jaWZuZGVmCV9fSU5DTFVERV9NUFdfSAotI2RlZmluZSBfX0lOQ0xVREVfTVBXX0gKLQotI2lmbmRlZiBNUFcKLSNkZWZpbmUgTVBXCi0jZW5kaWYKLQotLyogTVBXIEMgaXMgYmFzaWNhbGx5IEFOU0ksIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBfX1NURENfXywKLSAgIG5vciBkb2VzIGl0IGFsbG93IF9fU1REQ19fIHRvIGJlICNkZWZpbmVkLiAqLwotCi0jaWZuZGVmIEFMTU9TVF9TVERDCi0jZGVmaW5lIEFMTU9TVF9TVERDCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jZGVmaW5lIEhBVkVfVElNRV9UX0lOX1RJTUVfSCAxCi0KLSNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi0KLSNkZWZpbmUgSEFWRV9FUlJOT19IIDEKLQotI2RlZmluZSBIQVZFX1NURERFRl9IIDEKLQotI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLQotI2RlZmluZSBIQVZFX1NUREFSR19IIDEKLQotI2RlZmluZSBIQVZFX1ZQUklOVEYgMQotCi0jaWZkZWYgVVNFX01XX0hFQURFUlMKLQotI2luY2x1ZGUgPHVuaXguaD4KLQotI2Vsc2UKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8aW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jZGVmaW5lIEhBVkVfRkNOVExfSCAxCi0KLSNpZm5kZWYJT19BQ0NNT0RFCi0jZGVmaW5lIE9fQUNDTU9ERSAoT19SRE9OTFkgfCBPX1dST05MWSB8IE9fUkRXUikKLSNlbmRpZgotCi0jaWZuZGVmIGZpbGVubwotI2RlZmluZSBmaWxlbm8oZnApICgoZnApLT5fZmlsZSkKLSNlbmRpZgotCi0vKiBzdGRpby5oIGRvZXMgbm90IGRlZmluZSB0aGlzIGlmIF9fU1REQ19fLCBzbyBkZWZpbmUgaGVyZS4gKi8KLQotI2lmZGVmIF9fU1REQ19fCi1GSUxFICpmZG9wZW4oaW50IGZpbGRlcywgY29uc3QgY2hhciAqbW9kZSk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIFVTRV9NV19IRUFERVJTICovCi0KLS8qIEFkZCBlcnNhdHogZGVmaW5pdGlvbnMsIGZvciBzeXN0ZW1zIHRoYXQgbGFjayB0aGVtLiAgKi8KLQotI2lmbmRlZiBFSU8KLSNkZWZpbmUgRUlPIDk2Ci0jZW5kaWYKLSNpZm5kZWYgRU5PRU5UCi0jZGVmaW5lIEVOT0VOVCA5NwotI2VuZGlmCi0jaWZuZGVmIEVBQ0NFUwotI2RlZmluZSBFQUNDRVMgOTgKLSNlbmRpZgotI2lmbmRlZiBFTk9TWVMKLSNkZWZpbmUgRU5PU1lTIDk5Ci0jZW5kaWYKLQotI2lmbmRlZiBSX09LCi0jZGVmaW5lIFJfT0sgNAotI2RlZmluZSBXX09LIDIKLSNkZWZpbmUgWF9PSyAxCi0jZW5kaWYKLQotLyogQmluYXJ5IGZpbGVzIGhhdmUgZGlmZmVyZW50IGNoYXJhY3RlcmlzdGljczsgZm9yIGluc3RhbmNlLCBubyBjci9ubAotICAgdHJhbnNsYXRpb24uICovCi0KLSNkZWZpbmUgVVNFX0JJTkFSWV9GT1BFTgotCi0jaW5jbHVkZSA8c3Bpbi5oPgotCi0jaWZkZWYgTVBXX0MKLSN1bmRlZiAgX19QVFJfVE9fSU5UCi0jZGVmaW5lIF9fUFRSX1RPX0lOVChQKSAoKGludCkoUCkpCi0jdW5kZWYgX19JTlRfVE9fUFRSCi0jZGVmaW5lIF9fSU5UX1RPX1BUUihQKSAoKGNoYXIgKikoUCkpCi0jZW5kaWYgLyogTVBXX0MgKi8KLQotI2RlZmluZSBOT19GQ05UTAotCi1pbnQgZnN0YXQgKCk7Ci0KLUZJTEUgKm1wd19mb3BlbiAoKTsKLWludCBtcHdfZnNlZWsgKCk7Ci1pbnQgbXB3X2ZyZWFkICgpOwotaW50IG1wd19md3JpdGUgKCk7Ci1pbnQgbXB3X2FjY2VzcyAoKTsKLWludCBtcHdfb3BlbiAoKTsKLWludCBtcHdfY3JlYXQgKCk7Ci12b2lkIG1wd19hYm9ydCAodm9pZCk7Ci0KLS8qIE1hcCB0aGVzZSBzdGFuZGFyZCBmdW5jdGlvbnMgdG8gaW1wcm92ZWQgdmVyc2lvbnMgaW4gbGliaWJlcnR5LiAqLwotCi0jZGVmaW5lIGZvcGVuIG1wd19mb3BlbgotI2RlZmluZSBmc2VlayBtcHdfZnNlZWsKLSNkZWZpbmUgZnJlYWQgbXB3X2ZyZWFkCi0jZGVmaW5lIGZ3cml0ZSBtcHdfZndyaXRlCi0jZGVmaW5lIG9wZW4gbXB3X29wZW4KLSNkZWZpbmUgYWNjZXNzIG1wd19hY2Nlc3MKLSNkZWZpbmUgY3JlYXQgbXB3X2NyZWF0Ci0jZGVmaW5lIGFib3J0IG1wd19hYm9ydAotCi0jZGVmaW5lIFBPU0lYX1VUSU1FCi0KLSNkZWZpbmUgTE9TSU5HX1RPVEFMTFkKLQotLyogRGVmaW5lIHRoaXMgc28gdGhhdCBmaWxlcyB3aWxsIGJlIGNsb3NlZCBiZWZvcmUgYmVpbmcgdW5saW5rZWQuICovCi0KLSNkZWZpbmUgQ0xPU0VfQkVGT1JFX1VOTElOSwotCi0jZW5kaWYgLyogX19JTkNMVURFX01QV19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9wd2QuaCBiL2luY2x1ZGUvbXB3L3B3ZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRmYjcwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3B3ZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI2lmbmRlZiBfX3B3ZF9oCi0jZGVmaW5lIF9fcHdkX2gKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi1zdHJ1Y3QgcGFzc3dkIHsKLSAgY2hhciAqcHdfbmFtZTsKLSAgdWlkX3QgcHdfdWlkOwotICBnaWRfdCBwd19naWQ7Ci0gIGNoYXIgKnB3X2RpcjsKLSAgY2hhciAqcHdfc2hlbGw7Ci0gIGNoYXIgKnB3X3Bhc3N3ZDsKLX07Ci0KLSNlbmRpZiAvKiAhIF9fcHdkX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3NwaW4uaCBiL2luY2x1ZGUvbXB3L3NwaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3ZDE0NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9zcGluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKiBQcm9ncmVzcyBtYWNyb3MgdGhhdCB1c2UgU3BpbkN1cnNvciBpbiBNUFcuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX1NQSU5fSAotI2RlZmluZSBfU1BJTl9ICi0KLS8qIEZvciBNUFcsIHByb2dyZXNzIG1hY3JvcyBqdXN0IG5lZWQgdG8gInNwaW4gdGhlIGN1cnNvciIgZnJlcXVlbnRseSwKLSAgIHByZWZlcmFibHkgc2V2ZXJhbCB0aW1lcyBwZXIgc2Vjb25kIG9uIGEgNjhLIE1hYy4gICovCi0KLS8qIEluIG9yZGVyIHRvIGRldGVybWluZSBpZiB3ZSdyZSBtZWV0aW5nIHRoZSBnb2FsLCBkZWZpbmUgdGhpcyBtYWNybwotICAgYW5kIGluZm9ybWF0aW9uIGFib3V0IGZyZXF1ZW5jeSBvZiBzcGlubmluZyB3aWxsIGJlIGNvbGxlY3RlZCBhbmQKLSAgIGRpc3BsYXllZC4gICovCi0KLSNkZWZpbmUgU1BJTl9NRUFTVVJFTUVOVAotCi0jaW5jbHVkZSA8Q3Vyc29yQ3RsLmg+Ci0KLS8qIFByb2dyYW1zIHVzZSB0aGlzIG1hY3JvIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiBhIGxlbmd0aHkKLSAgIGFjdGl2aXR5LiAgU1RSIGlkZW50aWZpZXMgdGhlIHBhcnRpY3VsYXIgYWN0aXZpdHksIHdoaWxlIE4KLSAgIGluZGljYXRlcyB0aGUgZXhwZWN0ZWQgZHVyYXRpb24sIGluIHVuc3BlY2lmaWVkIHVuaXRzLiAgSWYgTiBpcwotICAgemVybywgdGhlbiB0aGUgZXhwZWN0ZWQgdGltZSB0byBjb21wbGV0aW9uIGlzIHVua25vd24uICAqLwotCi0jdW5kZWYgU1RBUlRfUFJPR1JFU1MKLSNkZWZpbmUgU1RBUlRfUFJPR1JFU1MoU1RSLE4pIG1wd19zdGFydF9wcm9ncmVzcyAoU1RSLCBOLCBfX0ZJTEVfXywgX19MSU5FX18pOwotCi0vKiBQcm9ncmFtcyB1c2UgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB0aGF0IHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgb24gYQotICAgbGVuZ3RoeSBhY3Rpdml0eS4gICovCi0KLSN1bmRlZiBQUk9HUkVTUwotI2lmZGVmIFNQSU5fTUVBU1VSRU1FTlQKLSNkZWZpbmUgUFJPR1JFU1MoWCkgbXB3X3Byb2dyZXNzX21lYXN1cmVkIChYLCBfX0ZJTEVfXywgX19MSU5FX18pOwotI2Vsc2UKLSNkZWZpbmUgUFJPR1JFU1MoWCkgbXB3X3Byb2dyZXNzIChYKTsKLSNlbmRpZiAKLQotLyogUHJvZ3JhbXMgdXNlIHRoaXMgbWFjcm8gdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiBhIGxlbmd0aHkgYWN0aXZpdHkuCi0gICBTVFIgbXVzdCBtYXRjaCBhIFNUUiBwYXNzZWQgdG8gU1RBUlRfUFJPR1JFU1MgcHJldmlvdXNseS4gICovCi0KLSN1bmRlZiBFTkRfUFJPR1JFU1MKLSNkZWZpbmUgRU5EX1BST0dSRVNTKFNUUikgbXB3X2VuZF9wcm9ncmVzcyAoU1RSLCBfX0ZJTEVfXywgX19MSU5FX18pOwotCi1leHRlcm4gdm9pZCBtcHdfc3RhcnRfcHJvZ3Jlc3MgKGNoYXIgKiwgaW50LCBjaGFyICosIGludCk7Ci0KLWV4dGVybiB2b2lkIG1wd19wcm9ncmVzcyAoaW50KTsKLQotZXh0ZXJuIHZvaWQgbXB3X3Byb2dyZXNzX21lYXN1cmVkIChpbnQsIGNoYXIgKiwgaW50KTsKLQotZXh0ZXJuIHZvaWQgbXB3X2VuZF9wcm9ncmVzcyAoY2hhciAqLCBjaGFyICosIGludCk7Ci0KLSNlbmRpZiAvKiBfU1BJTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9zdGF0LmggYi9pbmNsdWRlL21wdy9zdGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1N2I4ZDUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvc3RhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyogVGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZGVmaW5lcyBhIHN0cnVjdCB0aGF0IGlzIHVzZWQgaW4gdGhlIHN0YXQoKSBhbmQKLSAqIGZzdGF0IGZ1bmN0aW9ucy4gIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIHN0cnVjdCBjb21lcyBmcm9tIHRoZSBpLW5vZGUgb2YKLSAqIHNvbWUgZmlsZS4gIFRoZXNlIGNhbGxzIGFyZSB0aGUgb25seSBhcHByb3ZlZCB3YXkgdG8gaW5zcGVjdCBpLW5vZGVzLgotICovCi0KLSNpZm5kZWYgX1NUQVRfSAotI2RlZmluZSBfU1RBVF9ICi0KLSNpZm5kZWYgX1RZUEVTX0gJCS8qIG5vdCBxdWl0ZSByaWdodCAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0KLXN0cnVjdCBzdGF0IHsKLSAgZGV2X3Qgc3RfZGV2OwkJCS8qIG1ham9yL21pbm9yIGRldmljZSBudW1iZXIgKi8KLSAgaW5vX3Qgc3RfaW5vOwkJCS8qIGktbm9kZSBudW1iZXIgKi8KLSAgbW9kZV90IHN0X21vZGU7CQkvKiBmaWxlIG1vZGUsIHByb3RlY3Rpb24gYml0cywgZXRjLiAqLwotICBzaG9ydCBpbnQgc3Rfbmxpbms7CQkvKiAjIGxpbmtzOyBURU1QT1JBUlkgSEFDSzogc2hvdWxkIGJlIG5saW5rX3QqLwotICB1aWRfdCBzdF91aWQ7CQkJLyogdWlkIG9mIHRoZSBmaWxlJ3Mgb3duZXIgKi8KLSAgc2hvcnQgaW50IHN0X2dpZDsJCS8qIGdpZDsgVEVNUE9SQVJZIEhBQ0s6IHNob3VsZCBiZSBnaWRfdCAqLwotICBkZXZfdCBzdF9yZGV2OwotICBvZmZfdCBzdF9zaXplOwkJLyogZmlsZSBzaXplICovCi0gIHRpbWVfdCBzdF9hdGltZTsJCS8qIHRpbWUgb2YgbGFzdCBhY2Nlc3MgKi8KLSAgdGltZV90IHN0X210aW1lOwkJLyogdGltZSBvZiBsYXN0IGRhdGEgbW9kaWZpY2F0aW9uICovCi0gIHRpbWVfdCBzdF9jdGltZTsJCS8qIHRpbWUgb2YgbGFzdCBmaWxlIHN0YXR1cyBjaGFuZ2UgKi8KLX07Ci0KLS8qIFRyYWRpdGlvbmFsIG1hc2sgZGVmaW5pdGlvbnMgZm9yIHN0X21vZGUuICovCi0jZGVmaW5lIFNfSUZNVCAgMDE3MDAwMAkJLyogdHlwZSBvZiBmaWxlICovCi0jZGVmaW5lIFNfSUZSRUcgMDEwMDAwMAkJLyogcmVndWxhciAqLwotI2RlZmluZSBTX0lGQkxLIDAwNjAwMDAJCS8qIGJsb2NrIHNwZWNpYWwgKi8KLSNkZWZpbmUgU19JRkRJUiAwMDQwMDAwICAJLyogZGlyZWN0b3J5ICovCi0jZGVmaW5lIFNfSUZDSFIgMDAyMDAwMAkJLyogY2hhcmFjdGVyIHNwZWNpYWwgKi8KLSNkZWZpbmUgU19JRklGTyAwMDEwMDAwCQkvKiB0aGlzIGlzIGEgRklGTyAqLwotI2RlZmluZSBTX0lTVUlEIDAwMDQwMDAJCS8qIHNldCB1c2VyIGlkIG9uIGV4ZWN1dGlvbiAqLwotI2RlZmluZSBTX0lTR0lEIDAwMDIwMDAJCS8qIHNldCBncm91cCBpZCBvbiBleGVjdXRpb24gKi8KLQkJCQkvKiBuZXh0IGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi0jZGVmaW5lIFNfSVNWVFggICAwMTAwMAkJLyogc2F2ZSBzd2FwcGVkIHRleHQgZXZlbiBhZnRlciB1c2UgKi8KLQotLyogUE9TSVggbWFza3MgZm9yIHN0X21vZGUuICovCi0jZGVmaW5lIFNfSVJXWFUgICAwMDcwMAkJLyogb3duZXI6ICByd3gtLS0tLS0gKi8KLSNkZWZpbmUgU19JUlVTUiAgIDAwNDAwCQkvKiBvd25lcjogIHItLS0tLS0tLSAqLwotI2RlZmluZSBTX0lXVVNSICAgMDAyMDAJCS8qIG93bmVyOiAgLXctLS0tLS0tICovCi0jZGVmaW5lIFNfSVhVU1IgICAwMDEwMAkJLyogb3duZXI6ICAtLXgtLS0tLS0gKi8KLQotI2RlZmluZSBTX0lSV1hHICAgMDAwNzAJCS8qIGdyb3VwOiAgLS0tcnd4LS0tICovCi0jZGVmaW5lIFNfSVJHUlAgICAwMDA0MAkJLyogZ3JvdXA6ICAtLS1yLS0tLS0gKi8KLSNkZWZpbmUgU19JV0dSUCAgIDAwMDIwCQkvKiBncm91cDogIC0tLS13LS0tLSAqLwotI2RlZmluZSBTX0lYR1JQICAgMDAwMTAJCS8qIGdyb3VwOiAgLS0tLS14LS0tICovCi0KLSNkZWZpbmUgU19JUldYTyAgIDAwMDA3CQkvKiBvdGhlcnM6IC0tLS0tLXJ3eCAqLwotI2RlZmluZSBTX0lST1RIICAgMDAwMDQJCS8qIG90aGVyczogLS0tLS0tci0tICovIAotI2RlZmluZSBTX0lXT1RIICAgMDAwMDIJCS8qIG90aGVyczogLS0tLS0tLXctICovCi0jZGVmaW5lIFNfSVhPVEggICAwMDAwMQkJLyogb3RoZXJzOiAtLS0tLS0tLXggKi8KLQotLyogVGhlIGZvbGxvd2luZyBtYWNyb3MgdGVzdCBzdF9tb2RlIChmcm9tIFBPU0lYIFNlYy4gNS42LjEuMS4gKi8KLSNkZWZpbmUgU19JU1JFRyhtKQkoKG0gJiBTX0lGTVQpID09IFNfSUZSRUcpCS8qIGlzIGEgcmVnIGZpbGUgKi8KLSNkZWZpbmUgU19JU0RJUihtKQkoKG0gJiBTX0lGTVQpID09IFNfSUZESVIpCS8qIGlzIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIFNfSVNDSFIobSkJKChtICYgU19JRk1UKSA9PSBTX0lGQ0hSKQkvKiBpcyBhIGNoYXIgc3BlYyAqLwotI2RlZmluZSBTX0lTQkxLKG0pCSgobSAmIFNfSUZNVCkgPT0gU19JRkJMSykJLyogaXMgYSBibG9jayBzcGVjICovCi0jZGVmaW5lIFNfSVNGSUZPKG0pCSgobSAmIFNfSUZNVCkgPT0gU19JRklGTykJLyogaXMgYSBwaXBlL0ZJRk8gKi8KLQotCi0vKiBGdW5jdGlvbiBQcm90b3R5cGVzLiAqLwotI2lmbmRlZiBfQU5TSV9ICi0jaW5jbHVkZSA8YW5zaS5oPgotI2VuZGlmCi0KLV9QUk9UT1RZUEUoIGludCBjaG1vZCwgKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX21vZGUpCQkJKTsKLV9QUk9UT1RZUEUoIGludCBmc3RhdCwgKGludCBfZmlsZGVzLCBzdHJ1Y3Qgc3RhdCAqX2J1ZikJCQkpOwotX1BST1RPVFlQRSggaW50IG1rZGlyLCAoY29uc3QgY2hhciAqX3BhdGgsIGludCBfbW9kZSkJCQkpOwotX1BST1RPVFlQRSggaW50IG1rZmlmbywgKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX21vZGUpCQkJKTsKLV9QUk9UT1RZUEUoIGludCBzdGF0ICwgKGNvbnN0IGNoYXIgKl9wYXRoLCBzdHJ1Y3Qgc3RhdCAqX2J1ZikJCSk7Ci1fUFJPVE9UWVBFKCBtb2RlX3QgdW1hc2ssIChpbnQgX2NtYXNrKQkJCQkJKTsKLQotI2VuZGlmIC8qIF9TVEFUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3N5cy9maWxlLmggYi9pbmNsdWRlL21wdy9zeXMvZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGE4YzE3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3N5cy9maWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0vKiBlbXB0eSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvc3lzL3BhcmFtLmggYi9pbmNsdWRlL21wdy9zeXMvcGFyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBhOGMxNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9zeXMvcGFyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS8qIGVtcHR5ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9zeXMvcmVzb3VyY2UuaCBiL2luY2x1ZGUvbXB3L3N5cy9yZXNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzk0MzlkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3N5cy9yZXNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jaWZuZGVmIF9fU1lTX1JFU09VUkNFX0hfXwotI2RlZmluZSBfX1NZU19SRVNPVVJDRV9IX18KLQotc3RydWN0IHJ1c2FnZSB7Ci0gIHN0cnVjdCB0aW1ldmFsIHJ1X3V0aW1lOwotICBzdHJ1Y3QgdGltZXZhbCBydV9zdGltZTsKLX07Ci0KLSNlbmRpZiAvKiBfX1NZU19SRVNPVVJDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3N5cy9zdGF0LmggYi9pbmNsdWRlL21wdy9zeXMvc3RhdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjVjNzJlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3N5cy9zdGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiBJbWl0YXRpb24gc3lzL3N0YXQuaC4gKi8KLQotI2lmbmRlZiBfX1NZU19TVEFUX0hfXwotI2RlZmluZSBfX1NZU19TVEFUX0hfXwotCi0jaW5jbHVkZSAgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgIDx0aW1lLmg+Ci0KLXN0cnVjdCBzdGF0IHsKLSAgZGV2X3QgICBzdF9kZXY7Ci0gIGlub190ICAgc3RfaW5vOwotICBtb2RlX3QgIHN0X21vZGU7Ci0gIHNob3J0ICAgc3Rfbmxpbms7Ci0gIHVpZF90ICAgc3RfdWlkOwotICBnaWRfdCAgIHN0X2dpZDsKLSAgZGV2X3QgICBzdF9yZGV2OwotICBvZmZfdCAgIHN0X3NpemU7Ci0gIG9mZl90ICAgc3RfcnNpemU7Ci0gIHRpbWVfdCAgc3RfYXRpbWU7Ci0gIGludCAgICAgc3Rfc3BhcmUxOwotICB0aW1lX3QgIHN0X210aW1lOwotICBpbnQgICAgIHN0X3NwYXJlMjsKLSAgdGltZV90ICBzdF9jdGltZTsKLSAgaW50ICAgICBzdF9zcGFyZTM7Ci0gIGxvbmcgICAgc3RfYmxrc2l6ZTsKLSAgbG9uZyAgICBzdF9ibG9ja3M7Ci0gIGxvbmcgICAgc3Rfc3BhcmU0WzJdOwotfTsKLQotI2RlZmluZSBTX0lGTVQJMDE3MDAwMEwKLSNkZWZpbmUgU19JRkRJUgkwMDQwMDAwTAotI2RlZmluZSBTX0lGUkVHIDAxMDAwMDBMCi0jZGVmaW5lIFNfSVJFQUQgICAgMDQwMAotI2RlZmluZSBTX0lXUklURSAgIDAyMDAKLSNkZWZpbmUgU19JRVhFQyAgICAwMTAwCi0KLSNkZWZpbmUgU19JRklGTyAwMTAwMDAgIC8qIEZJRk8gc3BlY2lhbCAqLwotI2RlZmluZSBTX0lGQ0hSIDAyMDAwMCAgLyogY2hhcmFjdGVyIHNwZWNpYWwgKi8KLSNkZWZpbmUgU19JRkJMSyAwMzAwMDAgIC8qIGJsb2NrIHNwZWNpYWwgKi8KLQotaW50IHN0YXQgKGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0ICpidWYpOwotaW50IGZzdGF0IChpbnQgZmQsIHN0cnVjdCBzdGF0ICpidWYpOwotCi0jZW5kaWYgLyogX19TWVNfU1RBVF9IX19fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9zeXMvdGltZS5oIGIvaW5jbHVkZS9tcHcvc3lzL3RpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjllNDg1Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9zeXMvdGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLyogSW1pdGF0aW9uIHN5cy90aW1lLmguICovCi0KLSNpZm5kZWYgX19TWVNfVElNRV9IX18KLSNkZWZpbmUgX19TWVNfVElNRV9IX18KLQotI2luY2x1ZGUgPHRpbWUuaD4KLQotc3RydWN0IHRpbWV2YWwgewotICBsb25nIHR2X3NlYzsKLSAgbG9uZyB0dl91c2VjOwotfTsKLQotI2VuZGlmIC8qIF9fU1lTX1RJTUVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9zeXMvdHlwZXMuaCBiL2luY2x1ZGUvbXB3L3N5cy90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2Q5YzlmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3N5cy90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyogSW1pdGF0aW9uIHN5cy90eXBlcy5oLiAqLwotCi0jaWZuZGVmIF9fU1lTX1RZUEVTX0hfXwotI2RlZmluZSBfX1NZU19UWVBFU19IX18KLQotI2luY2x1ZGUgPFR5cGVzLmg+Ci0KLXR5cGVkZWYgc2hvcnQgZGV2X3Q7Ci10eXBlZGVmIHNob3J0IGlub190OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBtb2RlX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVpZF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBnaWRfdDsKLXR5cGVkZWYgbG9uZyBvZmZfdDsKLQotI2VuZGlmIC8qIF9fU1lTX1RZUEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvdXRpbWUuaCBiL2luY2x1ZGUvbXB3L3V0aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YmY2NmYyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3V0aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQotc3RydWN0IHV0aW1idWYgewotICB0aW1lX3QgYWN0aW1lOwotICB0aW1lX3QgbW9kdGltZTsKLX07Ci0KLWludCB1dGltZSAoY2hhciAqLCBzdHJ1Y3QgdXRpbWJ1ZiAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3ZhcmFyZ3MuaCBiL2luY2x1ZGUvbXB3L3ZhcmFyZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiOWU0NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy92YXJhcmdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLS8qIHZhcmFyZ3MuaC4gKi8KLSNpZm5kZWYgX192YV9saXN0X18KLSNkZWZpbmUgX192YV9saXN0X18KLXR5cGVkZWYgY2hhciAqdmFfbGlzdDsKLSNlbmRpZgotI2RlZmluZSB2YV9kY2wgaW50IHZhX2FsaXN0OwotI2RlZmluZSB2YV9zdGFydChsaXN0KSBsaXN0ID0gKGNoYXIgKikgJnZhX2FsaXN0Ci0jZGVmaW5lIHZhX2VuZChsaXN0KQotI2RlZmluZSB2YV9hcmcobGlzdCxtb2RlKSAoKG1vZGUgKikobGlzdCArPSBzaXplb2YobW9kZSkpKVstMV0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL0NoYW5nZUxvZyBiL2luY2x1ZGUvbmxtL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDllYTNkMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL25sbS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi1GcmkgTWF5ICA2IDEzOjMxOjA0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZXh0ZXJuYWwuaCAobmxtTkFNRShFeHRlcm5hbF9DdXN0b21fSGVhZGVyKSk6IEFkZCBsZW5ndGgsCi0JZGF0YU9mZnNldCwgYW5kIGRhdGFTdGFtcCBmaWVsZC4KLQkobmxtTkFNRShFeHRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcikpOiBSZW1vdmUuCi0JKiBpbnRlcm5hbC5oIChObG1fSW50ZXJuYWxfQ3VzdG9tX0hlYWRlcik6IEFkZCBoZHJMZW5ndGgsCi0JZGF0YU9mZnNldCwgZGF0YVN0YW1wIGFuZCBoZHIgZmllbGRzLgotCi1GcmkgQXByIDIyIDExOjEyOjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZXh0ZXJuYWwuaCAoc3RydWN0IG5sbU5BTUUoZXh0ZXJuYWxfY3lnbnVzX2V4dF9oZWFkZXIpKTogUmVuYW1lCi0JZnJvbSBubG1OQU1FKGV4dGVybmFsX2N5Z251c19zZWN0aW9uX2hlYWRlcikuICBDaGFuZ2Ugc3RhbXAgZmllbGQKLQl0byA4IGJ5dGVzLiAgQWRkIGJ5dGVzIGZpZWxkLgotCSogaW50ZXJuYWwuaCAobmxtX2ludGVybmFsX2N5Z251c19leHRfaGVhZGVyKTogUmVuYW1lIGZyb20KLQlubG1faW50ZXJuYWxfY3lnbnVzX3NlY3Rpb25faGVhZGVyLiAgQ2hhbmdlIHN0YW1wIGZpZWxkIHRvIDgKLQlieXRlcy4KLQotVGh1IEFwciAyMSAxMTo1NzowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKHN0cnVjdCBubG1faW50ZXJuYWxfY3lnbnVzX3NlY3Rpb25faGVhZGVyKTogRGVmaW5lLgotCSogZXh0ZXJuYWwuaCAoc3RydWN0IG5sbU5BTUUoZXh0ZXJuYWxfY3lnbnVzX3NlY3Rpb25faGVhZGVyKToKLQlEZWZpbmUuCi0KLVdlZCBBcHIgMjAgMTQ6Mjc6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgbmxtX2ludGVybmFsX2N1c3RvbV9oZWFkZXIpOiBSZW1vdmUKLQlkZWJ1Z1JlY09mZnNldCBhbmQgZGVidWdSZWNMZW5ndGggZmllbGRzLiAgQWRkIGRhdGEgZmllbGQuCi0JKiBleHRlcm5hbC5oIChzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF9jdXN0b21faGVhZGVyKSk6IFJlbW92ZQotCWRlYnVnUmVjT2Zmc2V0IGFuZCBkZWJ1Z1JlY0xlbmd0aCBmaWVsZHMuCi0KLU1vbiBGZWIgIDcgMDg6Mjg6NDAgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IENoYW5nZSBIT1NUXzY0X0JJVCB0byBCRkRfSE9TVF82NF9CSVQuCi0KLVRodSBEZWMgIDIgMTQ6MTQ6NDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhbHBoYS1leHQuaDogTmV3IGZpbGUgZGVzY3JpYmluZyBmb3JtYXRzIG9mIGluZm9ybWF0aW9uIGluIEFscGhhCi0JTmV0V2FyZSBmaWxlcy4KLQkqIGNvbW1vbi5oOiBEZWZpbmUgc29tZSBub24tZXh0ZXJuYWwgQWxwaGEgaW5mb3JtYXRpb24uCi0KLVdlZCBOb3YgMTcgMTc6Mzg6NTggMTk5MyAgU2VhbiBFcmljIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIGV4dGVybmFsLmg6IERvbid0IGRlZmluZSBleHRlcm5hbF9maXhlZF9oZWFkZXIgaGVyZS4KLQkqIGkzODYtZXh0LmgsIHNwYXJjMzItZXh0Lmg6IE5ldyBoZWFkZXIgZmlsZXMgdG8gZGVmaW5lCi0JZXh0ZXJuYWxfZml4ZWRfaGVhZGVyIGZvciBwYXJ0aWN1bGFyIENQVSdzLgotCi1XZWQgT2N0IDI3IDExOjQ1OjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoTmxtX0ludGVybmFsX0V4dGVuZGVkX0hlYWRlcik6IEFkZGVkIGZpZWxkcwotCXNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0IGFuZCBzaGFyZWREZWJ1Z1JlY29yZENvdW50LgotCSogZXh0ZXJuYWwuaCAoTmxtTkFNRShFeHRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpKTogTGlrZXdpc2UuCi0KLQkqIGNvbW1vbi5oIChOTE1fU0lHTkFUVVJFKTogRG8gbm90IGRlZmluZSAoaXQncyBkaWZmZXJlbnQgZm9yIGVhY2gKLQliYWNrZW5kKS4KLQotVHVlIEF1ZyAzMSAxMzoyNDoxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IENoYW5nZSBsZW5ndGggZmllbGRzIG9mIHR5cGUgY2hhciB0byB0eXBlIHVuc2lnbmVkCi0JY2hhci4KLQotU2F0IEp1bCAzMSAwMjoxMjoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChOTE1fSElCSVQsIE5MTV9IRUFERVJfVkVSU0lPTik6IERlZmluZS4KLQotVGh1IEp1bCAyMiAxNjowOTo0NyAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmggKE5MTV9DQVQqLCBOTE1fQVJDSF9TSVpFLCBOTE1fVEFSR0VUX0xPTkdfU0laRSwKLQlOTE1fVEFSR0VUX0FERFJFU1NfU0laRSwgTkxNX05BTUUsIE5sbU5BTUUsIG5sbU5BTUUpOiAgTmV3Ci0JbWFjcm9zLgotCSogZXh0ZXJuYWwuaCAoVEFSR0VUX0xPTkdfU0laRSwgVEFSR0VUX0FERFJFU1NfU0laRSk6IFJlbW92ZQotCW1hY3JvcywgY29udmVydCB1c2FnZXMgdG8gTkxNXyBlcXVpdmFsZW50cy4KLQkqIGV4dGVybmFsLmg6ICBVc2UgbmxtTkFNRSBhbmQgTmxtTkFNRSBtYWNyb3MgdG8gZGVyaXZlIGJvdGgKLQkzMiBhbmQgNjQgYml0IHZlcnNpb25zLgotCi1Nb24gSnVsIDE5IDIyOjEyOjQwIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiAoY29tbW9uLmgsIGV4dGVybmFsLmgsIGludGVybmFsLmgpOiAgTmV3IGZpbGVzIGZvciBOTE0vTmV0V2FyZQotCXN1cHBvcnQuCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL2FscGhhLWV4dC5oIGIvaW5jbHVkZS9ubG0vYWxwaGEtZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MTk5ZGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vYWxwaGEtZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyogQWxwaGEgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBbiBBbHBoYSBOTE0gc3RhcnRzIHdpdGggYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgbmxtMzJfYWxwaGFfZXh0ZXJuYWxfcHJlZml4X2hlYWRlcgotewotICAvKiBNYWdpYyBudW1iZXIuICBNdXN0IGJlIE5MTTMyX0FMUEhBX01BR0lDLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtYWdpY1s0XTsKLSAgLyogRm9ybWF0IGRlc2NyaXB0b3IuICBDdXJyZW50IHZhbHVlIGlzIDIuICAqLwotICB1bnNpZ25lZCBjaGFyIGZvcm1hdFs0XTsKLSAgLyogU2l6ZSBvZiBwcmVmaXggaGVhZGVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzaXplWzRdOwotICAvKiBQYWRkaW5nLiAgKi8KLSAgdW5zaWduZWQgY2hhciBwYWQxWzRdOwotICAvKiBNb3JlIGZpZWxkcyBtYXkgYmUgYWRkZWQgbGF0ZXIsIHN1cHBvc2VkbHkuICAqLwotfTsKLQotLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiBhbiBBbHBoYSBOTE0gcmVsb2MuICBUaGlzIGlzIHRoZSBzYW1lIGFzIGFuCi0gICBBbHBoYSBFQ09GRiByZWxvYy4gICovCi0KLXN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9yZWxvYwotewotICB1bnNpZ25lZCBjaGFyIHJfdmFkZHJbOF07Ci0gIHVuc2lnbmVkIGNoYXIgcl9zeW1uZHhbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcl9iaXRzWzRdOwotfTsKLQotLyogQ29uc3RhbnRzIHRvIHVucGFjayB0aGUgcl9iaXRzIGZpZWxkIG9mIGEgcmVsb2MuICAqLwotCi0jZGVmaW5lIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFCQkJMHhmZgotI2RlZmluZSBSRUxPQ19CSVRTMF9UWVBFX1NIX0xJVFRMRQkJMAotCi0jZGVmaW5lIFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEUJCTB4MDEKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFCQkweDdlCi0jZGVmaW5lIFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUJCTEKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9SRVNFUlZFRF9MSVRUTEUJCTB4ODAKLSNkZWZpbmUgUkVMT0NfQklUUzFfUkVTRVJWRURfU0hfTElUVExFCQk3Ci0jZGVmaW5lIFJFTE9DX0JJVFMyX1JFU0VSVkVEX0xJVFRMRQkJMHhmZgotI2RlZmluZSBSRUxPQ19CSVRTMl9SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRQkxCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1JFU0VSVkVEX0xJVFRMRQkJMHgwMwotI2RlZmluZSBSRUxPQ19CSVRTM19SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRQk5Ci0KLSNkZWZpbmUgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUJCQkweGZjCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1NJWkVfU0hfTElUVExFCQkyCi0KLS8qIFRoZSBleHRlcm5hbCBmb3JtYXQgb2YgdGhlIGZpeGVkIGhlYWRlci4gICovCi0KLXR5cGVkZWYgc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX2ZpeGVkX2hlYWRlcgotewotCi0gIC8qIFRoZSBzaWduYXR1cmUgZmllbGQgaWRlbnRpZmllcyB0aGUgZmlsZSBhcyBhbiBOTE0uICBJdCBtdXN0IGNvbnRhaW4KLSAgICAgdGhlIHNpZ25hdHVyZSBzdHJpbmcsIHdoaWNoIGRlcGVuZHMgdXBvbiB0aGUgTkxNIHRhcmdldC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVsyNF07Ci0KLSAgLyogVGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlci4gIEF0IHRoaXMgdGltZSwgdGhlIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIKLSAgICAgaXMgNC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHZlcnNpb25bNF07Ci0KLSAgLyogVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgd2hpY2ggbXVzdCBiZSBhIERPUyBuYW1lICgxLTggY2hhcmFjdGVycyBmb2xsb3dlZAotICAgICBieSBhIHBlcmlvZCBhbmQgYSAxLTMgY2hhcmFjdGVyIGV4dGVuc2lvbikuICBUaGUgZmlyc3QgYnl0ZSBpcyB0aGUgYnl0ZQotICAgICBsZW5ndGggb2YgdGhlIG5hbWUgYW5kIHRoZSBsYXN0IGJ5dGUgaXMgYSBudWxsIHRlcm1pbmF0b3IgYnl0ZS4gIFRoaXMKLSAgICAgZmllbGQgaXMgZml4ZWQgbGVuZ3RoLCBhbmQgYW55IHVudXNlZCBieXRlcyBzaG91bGQgYmUgbnVsbCBieXRlcy4gIFRoZQotICAgICB2YWx1ZSBpcyBzZXQgYnkgdGhlIE9VVFBVVCBrZXl3b3JkIHRvIE5MTUxJTksuICovCi0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVOYW1lWzE0XTsKLQotICAvKiBQYWRkaW5nIHRvIG1ha2UgaXQgY29tZSBvdXQgY29ycmVjdC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHBhZDFbMl07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjb2RlIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjb2RlIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGNvZGVJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBkYXRhIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBkYXRhIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRhdGFJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWdpb24gdGhhdCB0aGUgbG9hZGVyIGlzIHRvIGJlCi0gICAgIGFsbG9jYXRlZCBhdCBsb2FkIHRpbWUuICBVbmluaXRpYWxpemVkIGRhdGEgZm9sbG93cyB0aGUgaW5pdGlhbGl6ZWQKLSAgICAgZGF0YSBpbiB0aGUgTkxNIGFkZHJlc3Mgc3BhY2UuICovCi0KLSAgdW5zaWduZWQgY2hhciB1bmluaXRpYWxpemVkRGF0YVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXN0b20gZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIFRoZQotICAgICBjdXN0b20gZGF0YSBpcyBzZXQgYnkgdGhlIENVU1RPTSBrZXl3b3JkIHRvIE5MTUxJTksuICBJdCBpcyBwb3NzaWJsZQotICAgICBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gY3VzdG9tIGRhdGEuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjdXN0b20gZGF0YSwgaW4gYnl0ZXMuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIFRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNT0RVTEUga2V5d29yZCBpbgotICAgICBOTE1MSU5LLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlRGVwZW5kZW5jeU9mZnNldFs0XTsKLQotICAvKiBUaGUgbnVtYmVyIG9mIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXQgdGhlIG1vZHVsZURlcGVuZGVuY3lPZmZzZXQuICovCi0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZk1vZHVsZURlcGVuZGVuY2llc1s0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIHJlbG9jYXRpb24gZml4dXAgZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLwotICAgICAKLSAgdW5zaWduZWQgY2hhciByZWxvY2F0aW9uRml4dXBPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlJlbG9jYXRpb25GaXh1cHNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBleHRlcm5hbFJlZmVyZW5jZXNPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIHB1YmxpY3NPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlB1YmxpY3NbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBkZWJ1ZyBpbmZvIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotICAgICBJdCBpcyBwb3NzaWJsZSBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mby4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRlYnVnSW5mb09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRGVidWdSZWNvcmRzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZVN0YXJ0T2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZXhpdFByb2NlZHVyZU9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlVHlwZVs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGZsYWdzWzRdOwotCi19IE5sbTMyX2FscGhhX0V4dGVybmFsX0ZpeGVkX0hlYWRlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL2NvbW1vbi5oIGIvaW5jbHVkZS9ubG0vY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NjU1MGEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBOTE0gc3VwcG9ydCBmb3IgQkZELCBhbmQgY29udGFpbnMgdGhlIHBvcnRpb25zCi0gICB0aGF0IGFyZSBjb21tb24gdG8gYm90aCB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucy4gKi8KLQotLyogU2VtaS1wb3J0YWJsZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpbiBjcHAuCi0gICBUaGUgTkxNX0NBVDQgaGFjayBpcyB0byBhdm9pZCBhIHByb2JsZW0gd2l0aCBzb21lIHN0cmljdCBBTlNJIEMKLSAgIHByZXByb2Nlc3NvcnMuICBUaGUgcHJvYmxlbSBpcywgIjMyXyIgb3IgIjY0XyIgYXJlIG5vdCBhIHZhbGlkCi0gICBwcmVwcm9jZXNzaW5nIHRva2VucywgYW5kIHdlIGRvbid0IHdhbnQgZXh0cmEgdW5kZXJzY29yZXMgKGUuZy4sCi0gICAibmxtXzMyXyIpLiAgVGhlIFhOTE1fQ0FUMiBtYWNybyB3aWxsIGNhdXNlIHRoZSBpbm5lciBOTE1fQ0FUIG1hY3JvcwotICAgdG8gYmUgZXZhbHVhdGVkIGZpcnN0LCBwcm9kdWNpbmcgc3RpbGwtdmFsaWQgcHAtdG9rZW5zLiAgVGhlbiB0aGUKLSAgIGZpbmFsIGNvbmNhdGVuYXRpb24gY2FuIGJlIGRvbmUuICAoU2lnaC4pICAqLwotCi0jaWZkZWYgU0FCRVIKLSMgIGRlZmluZSBOTE1fQ0FUKGEsYikJCWEjI2IKLSMgIGRlZmluZSBOTE1fQ0FUMyhhLGIsYykJYSMjYiMjYwotIyAgZGVmaW5lIE5MTV9DQVQ0KGEsYixjLGQpCWEjI2IjI2MjI2QKLSNlbHNlCi0jICBpZmRlZiBfX1NURENfXwotIyAgICBkZWZpbmUgTkxNX0NBVChhLGIpCWEjI2IKLSMgICAgZGVmaW5lIE5MTV9DQVQzKGEsYixjKQlhIyNiIyNjCi0jICAgIGRlZmluZSBYTkxNX0NBVDIoYSxiKQlOTE1fQ0FUKGEsYikKLSMgICAgZGVmaW5lIE5MTV9DQVQ0KGEsYixjLGQpCVhOTE1fQ0FUMihOTE1fQ0FUKGEsYiksTkxNX0NBVChjLGQpKQotIyAgZWxzZQotIyAgICBkZWZpbmUgTkxNX0NBVChhLGIpCWEvKiovYgotIyAgICBkZWZpbmUgTkxNX0NBVDMoYSxiLGMpCWEvKiovYi8qKi9jCi0jICAgIGRlZmluZSBOTE1fQ0FUNChhLGIsYyxkKQlhLyoqL2IvKiovYy8qKi9kCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIElmIE5MTV9BUkNIX1NJWkUgaXMgbm90IGRlZmluZWQsIGRlZmF1bHQgdG8gMzIuICBOTE1fQVJDSF9TSVpFIGlzCi0gICBvcHRpb25hbGx5IGRlZmluZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAqLwotCi0jaWZuZGVmIE5MTV9BUkNIX1NJWkUKLSMgIGRlZmluZSBOTE1fQVJDSF9TSVpFCQkJMzIKLSNlbmRpZgotCi0jaWYgTkxNX0FSQ0hfU0laRSA9PSAzMgotIyAgZGVmaW5lIE5MTV9UQVJHRVRfTE9OR19TSVpFCQk0Ci0jICBkZWZpbmUgTkxNX1RBUkdFVF9BRERSRVNTX1NJWkUJNAotIyAgZGVmaW5lIE5MTV9OQU1FKHgseSkJCQlOTE1fQ0FUNCh4LDMyLF8seSkKLSMgIGRlZmluZSBOTE1fSElCSVQJCQkoKChiZmRfdm1hKSAxKSA8PCAzMSkKLSNlbmRpZgotI2lmIE5MTV9BUkNIX1NJWkUgPT0gNjQKLSMgIGRlZmluZSBOTE1fVEFSR0VUX0xPTkdfU0laRQkJOAotIyAgZGVmaW5lIE5MTV9UQVJHRVRfQUREUkVTU19TSVpFCTgKLSMgIGRlZmluZSBOTE1fTkFNRSh4LHkpCQkJTkxNX0NBVDQoeCw2NCxfLHkpCi0jICBkZWZpbmUgTkxNX0hJQklUCQkJKCgoYmZkX3ZtYSkgMSkgPDwgNjMpCi0jZW5kaWYKLQotI2RlZmluZSBObG1OQU1FKFgpCQlOTE1fTkFNRShObG0sWCkKLSNkZWZpbmUgbmxtTkFNRShYKQkJTkxNX05BTUUobmxtLFgpCi0KLS8qIEdpdmUgbmFtZXMgdG8gdGhpbmdzIHRoYXQgc2hvdWxkIG5vdCBjaGFuZ2UuICovCi0KLSNkZWZpbmUgTkxNX01BWF9ERVNDUklQVElPTl9MRU5HVEgJCTEyNwotI2RlZmluZSBOTE1fTUFYX1NDUkVFTl9OQU1FX0xFTkdUSAkJNzEKLSNkZWZpbmUgTkxNX01BWF9USFJFQURfTkFNRV9MRU5HVEgJCTcxCi0jZGVmaW5lIE5MTV9NQVhfQ09QWVJJR0hUX01FU1NBR0VfTEVOR1RICTI1NQotI2RlZmluZSBOTE1fT1RIRVJfREFUQV9MRU5HVEggCQkJNDAwCQkvKiBGSVhNRSAqLwotI2RlZmluZSBOTE1fT0xEX1RIUkVBRF9OQU1FX0xFTkdUSAkJNQotI2RlZmluZSBOTE1fU0lHTkFUVVJFX1NJWkUJCQkyNAotI2RlZmluZSBOTE1fSEVBREVSX1ZFUlNJT04JCQk0Ci0jZGVmaW5lIE5MTV9NT0RVTEVfTkFNRV9TSVpFCQkJMTQKLSNkZWZpbmUgTkxNX0RFRkFVTFRfU1RBQ0tTSVpFCQkJKDggKiAxMDI0KQotDAotLyogQWxwaGEgaW5mb3JtYXRpb24uICBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBpbiBhIHNlcGFyYXRlIEFscGhhCi0gICBoZWFkZXIgZmlsZSwgYnV0IGl0IGNhbid0IGdvIGluIGFscGhhLWV4dC5oIGJlY2F1c2Ugc29tZSBvZiBpdCBpcwotICAgbmVlZGVkIGJ5IG5sbWNvbnYuYy4gICovCi0KLS8qIE1hZ2ljIG51bWJlciBpbiBBbHBoYSBwcmVmaXggaGVhZGVyLiAgKi8KLSNkZWZpbmUgTkxNMzJfQUxQSEFfTUFHSUMgKDB4ODM1NjE4NDApCi0KLS8qIFRoZSByX3R5cGUgZmllbGQgaW4gYW4gQWxwaGEgcmVsb2MgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9JR05PUkUJCTAKLSNkZWZpbmUgQUxQSEFfUl9SRUZMT05HCQkxCi0jZGVmaW5lIEFMUEhBX1JfUkVGUVVBRAkJMgotI2RlZmluZSBBTFBIQV9SX0dQUkVMMzIJCTMKLSNkZWZpbmUgQUxQSEFfUl9MSVRFUkFMCQk0Ci0jZGVmaW5lIEFMUEhBX1JfTElUVVNFCQk1Ci0jZGVmaW5lIEFMUEhBX1JfR1BESVNQCQk2Ci0jZGVmaW5lIEFMUEhBX1JfQlJBRERSCQk3Ci0jZGVmaW5lIEFMUEhBX1JfSElOVAkJOAotI2RlZmluZSBBTFBIQV9SX1NSRUwxNgkJOQotI2RlZmluZSBBTFBIQV9SX1NSRUwzMgkgICAgICAgMTAKLSNkZWZpbmUgQUxQSEFfUl9TUkVMNjQJICAgICAgIDExCi0jZGVmaW5lIEFMUEhBX1JfT1BfUFVTSAkgICAgICAgMTIKLSNkZWZpbmUgQUxQSEFfUl9PUF9TVE9SRSAgICAgICAxMwotI2RlZmluZSBBTFBIQV9SX09QX1BTVUIJICAgICAgIDE0Ci0jZGVmaW5lIEFMUEhBX1JfT1BfUFJTSElGVCAgICAgMTUKLSNkZWZpbmUgQUxQSEFfUl9HUFZBTFVFCSAgICAgICAxNgotI2RlZmluZSBBTFBIQV9SX05XX1JFTE9DICAgICAgMjUwCi0KLS8qIEEgbG9jYWwgcmVsb2MsIG90aGVyIHRoYW4gQUxQSEFfUl9HUERJU1Agb3IgQUxQSEFfUl9JR05PUkUsIG11c3QgYmUKLSAgIGFnYWluc3Qgb25lIG9mIHRoZXNlIHN5bWJvbCBpbmRpY2VzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUkVMT0NfU0VDVElPTl9URVhUCTEKLSNkZWZpbmUgQUxQSEFfUkVMT0NfU0VDVElPTl9EQVRBCTMKLQotLyogQW4gQUxQSEFfUl9OV19SRUxPQyBoYXMgb25lIG9mIHRoZXNlIHZhbHVlcyBpbiB0aGUgc2l6ZSBmaWVsZC4gIElmCi0gICBpdCBpcyBTRVRHUCwgdGhlIHJfdmFkZHIgZmllbGQgaG9sZHMgdGhlIEdQIHZhbHVlIHRvIHVzZS4gIElmIGl0IGlzCi0gICBMSVRBLCB0aGUgcl92YWRkciBmaWVsZCBob2xkcyB0aGUgYWRkcmVzcyBvZiB0aGUgLmxpdGEgc2VjdGlvbiBhbmQKLSAgIHRoZSByX3N5bW5keCBmaWVsZCBob2xkcyB0aGUgc2l6ZSBvZiB0aGUgLmxpdGEgc2VjdGlvbi4gICovCi0jZGVmaW5lIEFMUEhBX1JfTldfUkVMT0NfU0VUR1AJMQotI2RlZmluZSBBTFBIQV9SX05XX1JFTE9DX0xJVEEJMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vZXh0ZXJuYWwuaCBiL2luY2x1ZGUvbmxtL2V4dGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3N2E1YmIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vZXh0ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5MTSBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKLSAgIHRoYXQgZGVzY3JpYmUgaG93IE5MTSBpcyByZXByZXNlbnRlZCBleHRlcm5hbGx5IGJ5IHRoZSBCRkQgbGlicmFyeS4KLSAgIEkuRS4gaXQgZGVzY3JpYmVzIHRoZSBpbi1maWxlIHJlcHJlc2VudGF0aW9uIG9mIE5MTS4gIEl0IHJlcXVpcmVzCi0gICB0aGUgbmxtL2NvbW1vbi5oIGZpbGUgd2hpY2ggY29udGFpbnMgdGhlIHBvcnRpb25zIHRoYXQgYXJlIGNvbW1vbiB0bwotICAgYm90aCB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucy4KLQotICAgTm90ZSB0aGF0IGFuIE5MTSBoZWFkZXIgY29uc2lzdHMgb2YgdGhyZWUgcGFydHM6Ci0KLSAgICgxKQlBIGZpeGVkIGxlbmd0aCBoZWFkZXIgdGhhdCBoYXMgc3BlY2lmaWMgZmllbGRzIG9mIGtub3duIGxlbmd0aCwKLQlhdCBzcGVjaWZpYyBvZmZzZXRzIGluIHRoZSBmaWxlLiAKLQotICAgKDIpICBBIHZhcmlhYmxlIGxlbmd0aCBoZWFkZXIgdGhhdCBoYXMgc3BlY2lmaWMgZmllbGRzIGluIGEgc3BlY2lmaWMKLSAgICAgICAgb3JkZXIsIGJ1dCBzb21lIGZpZWxkcyBtYXkgYmUgdmFyaWFibGUgbGVuZ3RoLgotCi0gICAoMykJQSBhdXhpbGlhcnkgaGVhZGVyIHRoYXQgaGFzIHZhcmlvdXMgb3B0aW9uYWwgZmllbGRzIGluIG5vIHNwZWNpZmljCi0gICAgICAgIG9yZGVyLiAgVGhlcmUgaXMgbm8gd2F5IHRvIGlkZW50aWZ5IHRoZSBlbmQgb2YgdGhlIGF1eGlsaWFyeSBoZWFkZXJzCi0JZXhjZXB0IGJ5IGZpbmRpbmcgYSBoZWFkZXIgd2l0aG91dCBhIHJlY29nbml6ZWQgJ3N0YW1wJy4KLQotICAgVGhlIGV4YWN0IGZvcm1hdCBvZiB0aGUgZml4ZWQgbGVuZ3RoIGhlYWRlciB1bmZvcnR1bmF0ZWx5IHZhcmllcwotICAgZnJvbSBvbmUgTkxNIHRhcmdldCB0byBhbm90aGVyLCBkdWUgdG8gcGFkZGluZy4gIEVhY2ggdGFyZ2V0Ci0gICBkZWZpbmVzIHRoZSBjb3JyZWN0IGV4dGVybmFsIGZvcm1hdCBpbiBhIHNlcGFyYXRlIGhlYWRlciBmaWxlLgotCi0qLwotICAgCi0vKiBOTE0gSGVhZGVyICovCi0KLS8qIFRoZSB2ZXJzaW9uIGhlYWRlciBpcyBvbmUgb2YgdGhlIG9wdGlvbmFsIGF1eGlsaWFyeSBoZWFkZXJzIGFuZAotICAgZm9sbG93cyB0aGUgZml4ZWQgbGVuZ3RoIGFuZCB2YXJpYWJsZSBsZW5ndGggTkxNIGhlYWRlcnMuICovCi0KLXR5cGVkZWYgc3RydWN0IG5sbU5BTUUoZXh0ZXJuYWxfdmVyc2lvbl9oZWFkZXIpCi17Ci0KLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJWZVJzSW9OIyIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotICBjaGFyIHN0YW1wWzhdOwotCi0gIHVuc2lnbmVkIGNoYXIgbWFqb3JWZXJzaW9uW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIG1pbm9yVmVyc2lvbltOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciByZXZpc2lvbltOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciB5ZWFyW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIG1vbnRoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIGRheVtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLX0gTmxtTkFNRShFeHRlcm5hbF9WZXJzaW9uX0hlYWRlcik7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF9jb3B5cmlnaHRfaGVhZGVyKQotewotCi0gIC8qIFRoZSBoZWFkZXIgaXMgcmVjb2duaXplZCBieSAiQ29QeVJpR2hUPSIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotCi0gIGNoYXIgc3RhbXBbMTBdOwotCi0gIHVuc2lnbmVkIGNoYXIgY29weXJpZ2h0TWVzc2FnZUxlbmd0aFsxXTsKLQotICAvKiBUaGVyZSBpcyBhIHZhcmlhYmxlIGxlbmd0aCBmaWVsZCBoZXJlIGNhbGxlZCAnY29weXJpZ2h0TWVzc2FnZScKLSAgICAgdGhhdCBpcyB0aGUgbGVuZ3RoIHNwZWNpZmllZCBieSBjb3B5cmlnaHRNZXNzYWdlTGVuZ3RoLiAqLwotCi19IE5sbU5BTUUoRXh0ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcik7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF9leHRlbmRlZF9oZWFkZXIpCi17Ci0KLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJNZVNzQWdFcyIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotCi0gIGNoYXIgc3RhbXBbOF07Ci0KLSAgdW5zaWduZWQgY2hhciBsYW5ndWFnZUlEW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIG1lc3NhZ2VGaWxlT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIG1lc3NhZ2VGaWxlTGVuZ3RoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIG1lc3NhZ2VDb3VudFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBoZWxwRmlsZU9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBoZWxwRmlsZUxlbmd0aFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBSUENEYXRhT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIFJQQ0RhdGFMZW5ndGhbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkQ29kZU9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWRDb2RlTGVuZ3RoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZERhdGFPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkRGF0YUxlbmd0aFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWRQdWJsaWNzT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZFB1YmxpY3NDb3VudFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWREZWJ1Z1JlY29yZE9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWREZWJ1Z1JlY29yZENvdW50W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZEluaXRpYWxpemF0aW9uT2Zmc2V0W05MTV9UQVJHRVRfQUREUkVTU19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIFNoYXJlZEV4aXRQcm9jZWR1cmVPZmZzZXRbTkxNX1RBUkdFVF9BRERSRVNTX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgcHJvZHVjdElEW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkMFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciByZXNlcnZlZDFbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQyW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkM1tOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciByZXNlcnZlZDRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQ1W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotfSBObG1OQU1FKEV4dGVybmFsX0V4dGVuZGVkX0hlYWRlcik7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF9jdXN0b21faGVhZGVyKQotewotCi0gIC8qIFRoZSBoZWFkZXIgaXMgcmVjb2duaXplZCBieSAiQ3VTdEhlQWQiIGluIHRoZSBzdGFtcCBmaWVsZC4gKi8KLSAgY2hhciBzdGFtcFs4XTsKLQotICAvKiBMZW5ndGggb2YgdGhpcyBoZWFkZXIuICAqLwotICB1bnNpZ25lZCBjaGFyIGxlbmd0aFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgLyogT2Zmc2V0IHRvIGRhdGEuICAqLwotICB1bnNpZ25lZCBjaGFyIGRhdGFPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIC8qIExlbmd0aCBvZiBkYXRhLiAgKi8KLSAgdW5zaWduZWQgY2hhciBkYXRhTGVuZ3RoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICAvKiBTdGFtcCBmb3IgdGhpcyBjdXN0b21lciBoZWFkZXItLXdlIHJlY29nbml6ZSAiQ3lHblVzRXgiLiAgKi8KLSAgY2hhciBkYXRhU3RhbXBbOF07Ci0KLX0gTmxtTkFNRShFeHRlcm5hbF9DdXN0b21fSGVhZGVyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL2kzODYtZXh0LmggYi9pbmNsdWRlL25sbS9pMzg2LWV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzNhZDJkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbmxtL2kzODYtZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyogaTM4NiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiB0aGUgZml4ZWQgaGVhZGVyLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtMzJfaTM4Nl9leHRlcm5hbF9maXhlZF9oZWFkZXIKLXsKLQotICAvKiBUaGUgc2lnbmF0dXJlIGZpZWxkIGlkZW50aWZpZXMgdGhlIGZpbGUgYXMgYW4gTkxNLiAgSXQgbXVzdCBjb250YWluCi0gICAgIHRoZSBzaWduYXR1cmUgc3RyaW5nLCB3aGljaCBkZXBlbmRzIHVwb24gdGhlIE5MTSB0YXJnZXQuICovCi0KLSAgdW5zaWduZWQgY2hhciBzaWduYXR1cmVbMjRdOwotCi0gIC8qIFRoZSB2ZXJzaW9uIG9mIHRoZSBoZWFkZXIuICBBdCB0aGlzIHRpbWUsIHRoZSBoaWdoZXN0IHZlcnNpb24gbnVtYmVyCi0gICAgIGlzIDQuICovCi0KLSAgdW5zaWduZWQgY2hhciB2ZXJzaW9uWzRdOwotCi0gIC8qIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUsIHdoaWNoIG11c3QgYmUgYSBET1MgbmFtZSAoMS04IGNoYXJhY3RlcnMgZm9sbG93ZWQKLSAgICAgYnkgYSBwZXJpb2QgYW5kIGEgMS0zIGNoYXJhY3RlciBleHRlbnNpb24pLiAgVGhlIGZpcnN0IGJ5dGUgaXMgdGhlIGJ5dGUKLSAgICAgbGVuZ3RoIG9mIHRoZSBuYW1lIGFuZCB0aGUgbGFzdCBieXRlIGlzIGEgbnVsbCB0ZXJtaW5hdG9yIGJ5dGUuICBUaGlzCi0gICAgIGZpZWxkIGlzIGZpeGVkIGxlbmd0aCwgYW5kIGFueSB1bnVzZWQgYnl0ZXMgc2hvdWxkIGJlIG51bGwgYnl0ZXMuICBUaGUKLSAgICAgdmFsdWUgaXMgc2V0IGJ5IHRoZSBPVVRQVVQga2V5d29yZCB0byBOTE1MSU5LLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlTmFtZVsxNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjb2RlIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjb2RlIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGNvZGVJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBkYXRhIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBkYXRhIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRhdGFJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWdpb24gdGhhdCB0aGUgbG9hZGVyIGlzIHRvIGJlCi0gICAgIGFsbG9jYXRlZCBhdCBsb2FkIHRpbWUuICBVbmluaXRpYWxpemVkIGRhdGEgZm9sbG93cyB0aGUgaW5pdGlhbGl6ZWQKLSAgICAgZGF0YSBpbiB0aGUgTkxNIGFkZHJlc3Mgc3BhY2UuICovCi0KLSAgdW5zaWduZWQgY2hhciB1bmluaXRpYWxpemVkRGF0YVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXN0b20gZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIFRoZQotICAgICBjdXN0b20gZGF0YSBpcyBzZXQgYnkgdGhlIENVU1RPTSBrZXl3b3JkIHRvIE5MTUxJTksuICBJdCBpcyBwb3NzaWJsZQotICAgICBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gY3VzdG9tIGRhdGEuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjdXN0b20gZGF0YSwgaW4gYnl0ZXMuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIFRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNT0RVTEUga2V5d29yZCBpbgotICAgICBOTE1MSU5LLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlRGVwZW5kZW5jeU9mZnNldFs0XTsKLQotICAvKiBUaGUgbnVtYmVyIG9mIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXQgdGhlIG1vZHVsZURlcGVuZGVuY3lPZmZzZXQuICovCi0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZk1vZHVsZURlcGVuZGVuY2llc1s0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIHJlbG9jYXRpb24gZml4dXAgZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLwotICAgICAKLSAgdW5zaWduZWQgY2hhciByZWxvY2F0aW9uRml4dXBPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlJlbG9jYXRpb25GaXh1cHNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBleHRlcm5hbFJlZmVyZW5jZXNPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIHB1YmxpY3NPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlB1YmxpY3NbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBkZWJ1ZyBpbmZvIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotICAgICBJdCBpcyBwb3NzaWJsZSBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mby4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRlYnVnSW5mb09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRGVidWdSZWNvcmRzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZVN0YXJ0T2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZXhpdFByb2NlZHVyZU9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlVHlwZVs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGZsYWdzWzRdOwotCi19IE5sbTMyX2kzODZfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vaW50ZXJuYWwuaCBiL2luY2x1ZGUvbmxtL2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMjdkYzQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBOTE0gc3VwcG9ydCBmb3IgQkZELCBhbmQgY29udGFpbnMgdGhlIHBvcnRpb25zCi0gICB0aGF0IGRlc2NyaWJlIGhvdyBOTE0gaXMgcmVwcmVzZW50ZWQgaW50ZXJuYWxseSBpbiB0aGUgQkZEIGxpYnJhcnkuCi0gICBJLkUuIGl0IGRlc2NyaWJlcyB0aGUgaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIE5MTS4gIEl0IHJlcXVpcmVzCi0gICB0aGUgbmxtL2NvbW1vbi5oIGZpbGUgd2hpY2ggY29udGFpbnMgdGhlIHBvcnRpb25zIHRoYXQgYXJlIGNvbW1vbiB0bwotICAgYm90aCB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucy4gKi8KLSAgIAotI2lmIDAKLQotLyogVHlwZXMgdXNlZCBieSB2YXJpb3VzIHN0cnVjdHVyZXMsIGZ1bmN0aW9ucywgZXRjLiAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcJTmxtMzJfQWRkcjsJLyogVW5zaWduZWQgcHJvZ3JhbSBhZGRyZXNzICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcJTmxtMzJfT2ZmOwkvKiBVbnNpZ25lZCBmaWxlIG9mZnNldCAqLwotdHlwZWRlZiAJIGxvbmcJTmxtMzJfU3dvcmQ7CS8qIFNpZ25lZCBsYXJnZSBpbnRlZ2VyICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcJTmxtMzJfV29yZDsJLyogVW5zaWduZWQgbGFyZ2UgaW50ZWdlciAqLwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlObG0zMl9IYWxmOwkvKiBVbnNpZ25lZCBtZWRpdW0gaW50ZWdlciAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyCU5sbTMyX0NoYXI7CS8qIFVuc2lnbmVkIHRpbnkgaW50ZWdlciAqLwotCi0jaWZkZWYgQkZEX0hPU1RfNjRfQklUCi10eXBlZGVmIHVuc2lnbmVkIEJGRF9IT1NUXzY0X0JJVAlObG02NF9BZGRyOwotdHlwZWRlZiB1bnNpZ25lZCBCRkRfSE9TVF82NF9CSVQJTmxtNjRfT2ZmOwotdHlwZWRlZiAgICAgICAgICBCRkRfSE9TVF82NF9CSVQJTmxtNjRfU3h3b3JkOwotdHlwZWRlZiB1bnNpZ25lZCBCRkRfSE9TVF82NF9CSVQJTmxtNjRfWHdvcmQ7Ci0jZW5kaWYKLXR5cGVkZWYgICAgICAgICAgbG9uZwkJTmxtNjRfU3dvcmQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcJCU5sbTY0X1dvcmQ7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlObG02NF9IYWxmOwotCi0jZW5kaWYgLyogMCAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW50ZXJuYWwgZm9ybSBvZiB0aGUgcG9ydGlvbiBvZiB0aGUgTkxNCi0gICBoZWFkZXIgdGhhdCBpcyBmaXhlZCBsZW5ndGguICovCi0KLXR5cGVkZWYgc3RydWN0IG5sbV9pbnRlcm5hbF9maXhlZF9oZWFkZXIKLXsKLSAgLyogVGhlIHNpZ25hdHVyZSBmaWVsZCBpZGVudGlmaWVzIHRoZSBmaWxlIGFzIGFuIE5MTS4gIEl0IG11c3QgY29udGFpbgotICAgICB0aGUgc2lnbmF0dXJlIHN0cmluZywgd2hpY2ggZGVwZW5kcyB1cG9uIHRoZSBOTE0gdGFyZ2V0LiAqLwotCi0gIGNoYXIgc2lnbmF0dXJlW05MTV9TSUdOQVRVUkVfU0laRV07Ci0KLSAgLyogVGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlci4gIEF0IHRoaXMgdGltZSwgdGhlIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIKLSAgICAgaXMgNC4gKi8KLQotICBsb25nIHZlcnNpb247Ci0KLSAgLyogVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgd2hpY2ggbXVzdCBiZSBhIERPUyBuYW1lICgxLTggY2hhcmFjdGVycyBmb2xsb3dlZAotICAgICBieSBhIHBlcmlvZCBhbmQgYSAxLTMgY2hhcmFjdGVyIGV4dGVuc2lvbi4gIFRoZSBmaXJzdCBieXRlIGlzIHRoZSBieXRlCi0gICAgIGxlbmd0aCBvZiB0aGUgbmFtZSBhbmQgdGhlIGxhc3QgYnl0ZSBpcyBhIG51bGwgdGVybWluYXRvciBieXRlLiAgVGhpcwotICAgICBmaWVsZCBpcyBmaXhlZCBsZW5ndGgsIGFuZCBhbnkgdW51c2VkIGJ5dGVzIHNob3VsZCBiZSBudWxsIGJ5dGVzLiAgVGhlCi0gICAgIHZhbHVlIGlzIHNldCBieSB0aGUgT1VUUFVUIGtleXdvcmQgdG8gTkxNTElOSy4gKi8KLQotICBjaGFyIG1vZHVsZU5hbWVbTkxNX01PRFVMRV9OQU1FX1NJWkVdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgY29kZSBpbWFnZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gKi8KLQotICBmaWxlX3B0ciBjb2RlSW1hZ2VPZmZzZXQ7Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGNvZGUgaW1hZ2UsIGluIGJ5dGVzLiAqLwotCi0gIGJmZF9zaXplX3R5cGUgY29kZUltYWdlU2l6ZTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGRhdGEgaW1hZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0KLSAgZmlsZV9wdHIgZGF0YUltYWdlT2Zmc2V0OwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBkYXRhIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICBiZmRfc2l6ZV90eXBlIGRhdGFJbWFnZVNpemU7Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWdpb24gdGhhdCB0aGUgbG9hZGVyIGlzIHRvIGJlCi0gICAgIGFsbG9jYXRlZCBhdCBsb2FkIHRpbWUuICBVbmluaXRpYWxpemVkIGRhdGEgZm9sbG93cyB0aGUgaW5pdGlhbGl6ZWQKLSAgICAgZGF0YSBpbiB0aGUgTkxNIGFkZHJlc3Mgc3BhY2UuICovCi0KLSAgYmZkX3NpemVfdHlwZSB1bmluaXRpYWxpemVkRGF0YVNpemU7Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXN0b20gZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIFRoZQotICAgICBjdXN0b20gZGF0YSBpcyBzZXQgYnkgdGhlIENVU1RPTSBrZXl3b3JkIHRvIE5MTUxJTksuICovCi0KLSAgZmlsZV9wdHIgY3VzdG9tRGF0YU9mZnNldDsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgY3VzdG9tIGRhdGEsIGluIGJ5dGVzLiAqLwotCi0gIGJmZF9zaXplX3R5cGUgY3VzdG9tRGF0YVNpemU7Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotICAgICBUaGUgbW9kdWxlIGRlcGVuZGVuY2llcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgTU9EVUxFIGtleXdvcmQgaW4KLSAgICAgTkxNTElOSy4gKi8KLQotICBmaWxlX3B0ciBtb2R1bGVEZXBlbmRlbmN5T2Zmc2V0OwotCi0gIC8qIFRoZSBudW1iZXIgb2YgbW9kdWxlIGRlcGVuZGVuY2llcyBhdCB0aGUgbW9kdWxlRGVwZW5kZW5jeU9mZnNldC4gKi8KLQotICBsb25nIG51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgcmVsb2NhdGlvbiBmaXh1cCBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlICovCi0KLSAgZmlsZV9wdHIgcmVsb2NhdGlvbkZpeHVwT2Zmc2V0OwotICBsb25nIG51bWJlck9mUmVsb2NhdGlvbkZpeHVwczsKLSAgZmlsZV9wdHIgZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0OwotICBsb25nIG51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzOwotICBmaWxlX3B0ciBwdWJsaWNzT2Zmc2V0OwotICBsb25nIG51bWJlck9mUHVibGljczsKLSAgZmlsZV9wdHIgZGVidWdJbmZvT2Zmc2V0OwotICBsb25nIG51bWJlck9mRGVidWdSZWNvcmRzOwotICBmaWxlX3B0ciBjb2RlU3RhcnRPZmZzZXQ7Ci0gIGZpbGVfcHRyIGV4aXRQcm9jZWR1cmVPZmZzZXQ7Ci0gIGZpbGVfcHRyIGNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0OwotICBsb25nIG1vZHVsZVR5cGU7Ci0gIGxvbmcgZmxhZ3M7Ci19IE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfZml4ZWRfaGVhZGVyIG5sbV9pbnRlcm5hbF9maXhlZF9oZWFkZXIKLSNkZWZpbmUgTmxtMzJfSW50ZXJuYWxfRml4ZWRfSGVhZGVyIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIKLSNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfZml4ZWRfaGVhZGVyIG5sbV9pbnRlcm5hbF9maXhlZF9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfRml4ZWRfSGVhZGVyIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIKLQotLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIHBvcnRpb25zIG9mIHRoZSBOTE0gaGVhZGVyIHRoYXQgYXJlIGVpdGhlcgotICAgdmFyaWFibGUgaW4gc2l6ZSBpbiB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24sIG9yIGVsc2UgYXJlIG5vdCBhdCBhCi0gICBmaXhlZCBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBOTE0gaGVhZGVyIGR1ZSB0byBwcmVjZWRpbmcKLSAgIHZhcmlhYmxlIHNpemVkIGZpZWxkcy4KLQotICAgTm90ZSB0aGF0IGFsbCB0aGUgZmllbGRzIG11c3QgZXhpc3QgaW4gdGhlIGV4dGVybmFsIGhlYWRlciwgYW5kIGluCi0gICB0aGUgb3JkZXIgdXNlZCBoZXJlICh0aGUgc2FtZSBvcmRlciBpcyB1c2VkIGluIHRoZSBpbnRlcm5hbCBmb3JtCi0gICBmb3IgY29uc2lzdGVuY3ksIG5vdCBvdXQgb2YgbmVjZXNzaXR5KS4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtX2ludGVybmFsX3ZhcmlhYmxlX2hlYWRlcgotewotCi0gIC8qIFRoZSBkZXNjcmlwdGlvbkxlbmd0aCBmaWVsZCBjb250YWlucyB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IGluCi0gICAgIGRlc2NyaXB0aW9uVGV4dCwgZXhjbHVkaW5nIHRoZSBudWxsIHRlcm1pbmF0b3IuICBUaGUgZGVzY3JpcHRpb25UZXh0Ci0gICAgIGZpZWxkIGNvbnRhaW5zIHRoZSBOTE0gZGVzY3JpcHRpb24gb2J0YWluZWQgZnJvbSB0aGUgREVTQ1JJUFRJT04KLSAgICAga2V5d29yZCBpbiBOTE1MSU5LIHBsdXMgdGhlIG51bGwgYnl0ZSB0ZXJtaW5hdG9yLiAgVGhlIGRlc2NyaXB0aW9uVGV4dAotICAgICBjYW4gYmUgdXAgdG8gTkxNX01BWF9ERVNDUklQVElPTl9MRU5HVEggY2hhcmFjdGVycy4gKi8KLSAgICAgCi0gIHVuc2lnbmVkIGNoYXIgZGVzY3JpcHRpb25MZW5ndGg7Ci0gIGNoYXIgZGVzY3JpcHRpb25UZXh0W05MTV9NQVhfREVTQ1JJUFRJT05fTEVOR1RIICsgMV07Ci0KLSAgLyogVGhlIHN0YWNrU2l6ZSBmaWVsZCBjb250YWlucyB0aGUgc2l6ZSBvZiB0aGUgc3RhY2sgaW4gYnl0ZXMsIGFzCi0gICAgIHNwZWNpZmllZCBieSB0aGUgU1RBQ0sgb3IgU1RBQ0tTSVpFIGtleXdvcmQgaW4gTkxNTElOSy4gIElmIG5vIHNpemUKLSAgICAgaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpcyBOTE1fREVGQVVMVF9TVEFDS1NJWkUuICovCi0gICAgIAotICBsb25nIHN0YWNrU2l6ZTsKLQotICAvKiBUaGUgcmVzZXJ2ZWQgZmllbGQgaXMgaW5jbHVkZWQgb25seSBmb3IgY29tcGxldGVuZXNzLiAgSXQgc2hvdWxkIGNvbnRhaW4KLSAgICAgemVyby4gKi8KLQotICBsb25nIHJlc2VydmVkOwotCi0gIC8qIFRoaXMgZmllbGQgaXMgZml4ZWQgbGVuZ3RoLCBzaG91bGQgY29udGFpbiAiIExPTkciIChub3RlIGxlYWRpbmcKLSAgICAgc3BhY2UpLCBhbmQgaXMgdW51c2VkLiAqLwotCi0gIGNoYXIgb2xkVGhyZWFkTmFtZVtOTE1fT0xEX1RIUkVBRF9OQU1FX0xFTkdUSF07Ci0KLSAgLyogVGhlIHNjcmVlbk5hbWVMZW5ndGggZmllbGQgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgYWN0dWFsIHRleHQgc3RvcmVkCi0gICAgIGluIHRoZSBzY3JlZW5OYW1lIGZpZWxkLCBleGNsdWRpbmcgdGhlIG51bGwgYnl0ZSB0ZXJtaW5hdG9yLiAgVGhlCi0gICAgIHNjcmVlbk5hbWUgZmllbGQgY29udGFpbnMgdGhlIHNjcmVlbiBuYW1lIGFzIHNwZWNpZmllZCBieSB0aGUgU0NSRUVOTkFNRQotICAgICBrZXl3b3JkIGluIE5MTUxJTkssIGFuZCBjYW4gYmUgdXAgdG8gTkxNX01BWF9TQ1JFRU5fTkFNRV9MRU5HVEgKLSAgICAgY2hhcmFjdGVycy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHNjcmVlbk5hbWVMZW5ndGg7Ci0gIGNoYXIgc2NyZWVuTmFtZVtOTE1fTUFYX1NDUkVFTl9OQU1FX0xFTkdUSCArIDFdOwotCi0gIC8qIFRoZSB0aHJlYWROYW1lTGVuZ3RoIGZpZWxkIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIGFjdHVhbCB0ZXh0IHN0b3JlZAotICAgICBpbiB0aGUgdGhyZWFkTmFtZSBmaWVsZCwgZXhjbHVkaW5nIHRoZSBudWxsIGJ5dGUgdGVybWluYXRvci4gIFRoZQotICAgICB0aHJlYWROYW1lIGZpZWxkIGNvbnRhaW5zIHRoZSB0aHJlYWQgbmFtZSBhcyBzcGVjaWZpZWQgYnkgdGhlIFRIUkVBRE5BTUUKLSAgICAga2V5d29yZCBpbiBOTE1MSU5LLCBhbmQgY2FuIGJlIHVwIHRvIE5MTV9NQVhfVEhSRUFEX05BTUVfTEVOR1RICi0gICAgIGNoYXJhY3RlcnMuICovCi0KLSAgdW5zaWduZWQgY2hhciB0aHJlYWROYW1lTGVuZ3RoOwotICBjaGFyIHRocmVhZE5hbWVbTkxNX01BWF9USFJFQURfTkFNRV9MRU5HVEggKyAxXTsKLQotfSBObG1fSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyOwotCi0jZGVmaW5lIG5sbTMyX2ludGVybmFsX3ZhcmlhYmxlX2hlYWRlciBubG1faW50ZXJuYWxfdmFyaWFibGVfaGVhZGVyCi0jZGVmaW5lIE5sbTMyX0ludGVybmFsX1ZhcmlhYmxlX0hlYWRlciBObG1fSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyCi0jZGVmaW5lIG5sbTY0X2ludGVybmFsX3ZhcmlhYmxlX2hlYWRlciBubG1faW50ZXJuYWxfdmFyaWFibGVfaGVhZGVyCi0jZGVmaW5lIE5sbTY0X0ludGVybmFsX1ZhcmlhYmxlX0hlYWRlciBObG1fSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyCi0KLS8qIFRoZSB2ZXJzaW9uIGhlYWRlciBpcyBvbmUgb2YgdGhlIG9wdGlvbmFsIGF1eGlsaWFyeSBoZWFkZXJzIGFuZAotICAgZm9sbG93cyB0aGUgZml4ZWQgbGVuZ3RoIGFuZCB2YXJpYWJsZSBsZW5ndGggTkxNIGhlYWRlcnMuICovCi0KLXR5cGVkZWYgc3RydWN0IG5sbV9pbnRlcm5hbF92ZXJzaW9uX2hlYWRlcgotewotICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIlZlUnNJb04jIiBpbiB0aGUgc3RhbXAgZmllbGQuICovCi0gIGNoYXIgc3RhbXBbOF07Ci0gIGxvbmcgbWFqb3JWZXJzaW9uOwotICBsb25nIG1pbm9yVmVyc2lvbjsKLSAgbG9uZyByZXZpc2lvbjsKLSAgbG9uZyB5ZWFyOwotICBsb25nIG1vbnRoOwotICBsb25nIGRheTsKLX0gTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyOwotCi0jZGVmaW5lIG5sbTMyX2ludGVybmFsX3ZlcnNpb25faGVhZGVyIG5sbV9pbnRlcm5hbF92ZXJzaW9uX2hlYWRlcgotI2RlZmluZSBObG0zMl9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlciBObG1fSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXIKLSNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfdmVyc2lvbl9oZWFkZXIgbmxtX2ludGVybmFsX3ZlcnNpb25faGVhZGVyCi0jZGVmaW5lIE5sbTY0X0ludGVybmFsX1ZlcnNpb25fSGVhZGVyIE5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlcgotCi10eXBlZGVmIHN0cnVjdCBubG1faW50ZXJuYWxfY29weXJpZ2h0X2hlYWRlcgotewotICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIkNvUHlSaUdoVD0iIGluIHRoZSBzdGFtcCBmaWVsZC4gKi8KLSAgY2hhciBzdGFtcFsxMF07Ci0gIHVuc2lnbmVkIGNoYXIgY29weXJpZ2h0TWVzc2FnZUxlbmd0aDsKLSAgY2hhciBjb3B5cmlnaHRNZXNzYWdlW05MTV9NQVhfQ09QWVJJR0hUX01FU1NBR0VfTEVOR1RIXTsKLX0gTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfY29weXJpZ2h0X2hlYWRlciBubG1faW50ZXJuYWxfY29weXJpZ2h0X2hlYWRlcgotI2RlZmluZSBObG0zMl9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyIE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyCi0jZGVmaW5lIG5sbTY0X2ludGVybmFsX2NvcHlyaWdodF9oZWFkZXIgbmxtX2ludGVybmFsX2NvcHlyaWdodF9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlciBObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcgotCi10eXBlZGVmIHN0cnVjdCBubG1faW50ZXJuYWxfZXh0ZW5kZWRfaGVhZGVyCi17Ci0gIC8qIFRoZSBoZWFkZXIgaXMgcmVjb2duaXplZCBieSAiTWVTc0FnRXMiIGluIHRoZSBzdGFtcCBmaWVsZC4gKi8KLSAgY2hhciBzdGFtcFs4XTsKLSAgbG9uZyBsYW5ndWFnZUlEOwotICBmaWxlX3B0ciBtZXNzYWdlRmlsZU9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBtZXNzYWdlRmlsZUxlbmd0aDsKLSAgbG9uZyBtZXNzYWdlQ291bnQ7Ci0gIGZpbGVfcHRyIGhlbHBGaWxlT2Zmc2V0OwotICBiZmRfc2l6ZV90eXBlIGhlbHBGaWxlTGVuZ3RoOwotICBmaWxlX3B0ciBSUENEYXRhT2Zmc2V0OwotICBiZmRfc2l6ZV90eXBlIFJQQ0RhdGFMZW5ndGg7Ci0gIGZpbGVfcHRyIHNoYXJlZENvZGVPZmZzZXQ7Ci0gIGJmZF9zaXplX3R5cGUgc2hhcmVkQ29kZUxlbmd0aDsKLSAgZmlsZV9wdHIgc2hhcmVkRGF0YU9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBzaGFyZWREYXRhTGVuZ3RoOwotICBmaWxlX3B0ciBzaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXQ7Ci0gIGxvbmcgc2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnQ7Ci0gIGZpbGVfcHRyIHNoYXJlZEV4dGVybmFsUmVmZXJlbmNlT2Zmc2V0OwotICBsb25nIHNoYXJlZEV4dGVybmFsUmVmZXJlbmNlQ291bnQ7Ci0gIGZpbGVfcHRyIHNoYXJlZFB1YmxpY3NPZmZzZXQ7Ci0gIGxvbmcgc2hhcmVkUHVibGljc0NvdW50OwotICBmaWxlX3B0ciBzaGFyZWREZWJ1Z1JlY29yZE9mZnNldDsKLSAgbG9uZyBzaGFyZWREZWJ1Z1JlY29yZENvdW50OwotICBiZmRfdm1hIFNoYXJlZEluaXRpYWxpemF0aW9uT2Zmc2V0OwotICBiZmRfdm1hIFNoYXJlZEV4aXRQcm9jZWR1cmVPZmZzZXQ7Ci0gIGxvbmcgcHJvZHVjdElEOwotICBsb25nIHJlc2VydmVkMDsKLSAgbG9uZyByZXNlcnZlZDE7Ci0gIGxvbmcgcmVzZXJ2ZWQyOwotICBsb25nIHJlc2VydmVkMzsKLSAgbG9uZyByZXNlcnZlZDQ7Ci0gIGxvbmcgcmVzZXJ2ZWQ1OwotfSBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyOwotCi0jZGVmaW5lIG5sbTMyX2ludGVybmFsX2V4dGVuZGVkX2hlYWRlciBubG1faW50ZXJuYWxfZXh0ZW5kZWRfaGVhZGVyCi0jZGVmaW5lIE5sbTMyX0ludGVybmFsX0V4dGVuZGVkX0hlYWRlciBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyCi0jZGVmaW5lIG5sbTY0X2ludGVybmFsX2V4dGVuZGVkX2hlYWRlciBubG1faW50ZXJuYWxfZXh0ZW5kZWRfaGVhZGVyCi0jZGVmaW5lIE5sbTY0X0ludGVybmFsX0V4dGVuZGVkX0hlYWRlciBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyCi0KLS8qIFRoZSBmb3JtYXQgb2YgYSBjdXN0b20gaGVhZGVyIGFzIHN0b3JlZCBpbnRlcm5hbGx5IGlzIGRpZmZlcmVudAotICAgZnJvbSB0aGUgZXh0ZXJuYWwgZm9ybWF0LiAgVGhpcyBpcyBob3cgd2Ugc3RvcmUgYSBjdXN0b20gaGVhZGVyCi0gICB3aGljaCB3ZSBkbyBub3QgcmVjb2duaXplLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtX2ludGVybmFsX2N1c3RvbV9oZWFkZXIKLXsKLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJDdVN0SGVBZCIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotICBjaGFyIHN0YW1wWzhdOwotICBiZmRfc2l6ZV90eXBlIGhkckxlbmd0aDsKLSAgZmlsZV9wdHIgZGF0YU9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBkYXRhTGVuZ3RoOwotICBjaGFyIGRhdGFTdGFtcFs4XTsKLSAgUFRSIGhkcjsKLX0gTmxtX0ludGVybmFsX0N1c3RvbV9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfY3VzdG9tX2hlYWRlciBubG1faW50ZXJuYWxfY3VzdG9tX2hlYWRlcgotI2RlZmluZSBObG0zMl9JbnRlcm5hbF9DdXN0b21fSGVhZGVyIE5sbV9JbnRlcm5hbF9DdXN0b21fSGVhZGVyCi0jZGVmaW5lIG5sbTY0X2ludGVybmFsX2N1c3RvbV9oZWFkZXIgbmxtX2ludGVybmFsX2N1c3RvbV9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfQ3VzdG9tX0hlYWRlciBObG1fSW50ZXJuYWxfQ3VzdG9tX0hlYWRlcgotCi0vKiBUaGUgaW50ZXJuYWwgQ3lnbnVzIGhlYWRlciBpcyB3cml0dGVuIG91dCBleHRlcm5hbGx5IGFzIGEgY3VzdG9tCi0gICBoZWFkZXIuICBXZSBkb24ndCB0cnkgdG8gcmVwbGljYXRlIHRoYXQgc3RydWN0dXJlIGhlcmUuICAqLwotCi10eXBlZGVmIHN0cnVjdCBubG1faW50ZXJuYWxfY3lnbnVzX2V4dF9oZWFkZXIKLXsKLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJDeUduVXNFeCIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotICBjaGFyIHN0YW1wWzhdOwotICAvKiBGaWxlIGxvY2F0aW9uIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGZpbGVfcHRyIG9mZnNldDsKLSAgLyogTGVuZ3RoIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgbGVuZ3RoOwotfSBObG1fSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfY3lnbnVzX2V4dF9oZWFkZXIgbmxtX2ludGVybmFsX2N5Z251c19leHRfaGVhZGVyCi0jZGVmaW5lIE5sbTMyX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyIE5sbV9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcgotI2RlZmluZSBubG02NF9pbnRlcm5hbF9jeWdudXNfZXh0X2hlYWRlciBubG1faW50ZXJuYWxfY3lnbnVzX2V4dF9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIgTmxtX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyCmRpZmYgLS1naXQgYS9pbmNsdWRlL25sbS9wcGMtZXh0LmggYi9pbmNsdWRlL25sbS9wcGMtZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYWUxMDcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vcHBjLWV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qIFBvd2VyUEMgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBPTERGT1JNQVQKLQotLyogVGhlIGZvcm1hdCBvZiBhIFBvd2VyUEMgTkxNIGNoYW5nZWQuICBUaGVzZSBzdHJ1Y3R1cmVzIGFyZSBvbmx5Ci0gICB1c2VkIGluIHRoZSBvbGQgZm9ybWF0LiAgKi8KLQotLyogQSBQb3dlclBDIE5MTSBzdGFydHMgd2l0aCBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3ByZWZpeF9oZWFkZXIKLXsKLSAgLyogU2lnbmF0dXJlLiAgTXVzdCBiZSAiQXBwbGVOTE0iLiAgKi8KLSAgY2hhciBzaWduYXR1cmVbOF07Ci0gIC8qIFZlcnNpb24gbnVtYmVyLiAgQ3VycmVudCB2YWx1ZSBpcyAxLiAgKi8KLSAgdW5zaWduZWQgY2hhciBoZWFkZXJWZXJzaW9uWzRdOwotICAvKiA/Py4gIFNob3VsZCBiZSBzZXQgdG8gMC4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3JpZ2luc1s0XTsKLSAgLyogRmlsZSBjcmVhdGlvbiBkYXRlIGluIHN0YW5kYXJkIFVuaXggdGltZSBmb3JtYXQgKHNlY29uZHMgc2luY2UKLSAgICAgMS8xLzcwKS4gICovCi0gIHVuc2lnbmVkIGNoYXIgZGF0ZVs0XTsKLX07Ci0KLSNkZWZpbmUgTkxNMzJfUE9XRVJQQ19TSUdOQVRVUkUgIkFwcGxlTkxNIgotI2RlZmluZSBOTE0zMl9QT1dFUlBDX0hFQURFUl9WRVJTSU9OIDEKLQotLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiBhIFBvd2VyUEMgTkxNIHJlbG9jLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyBhbgotICAgWENPRkYgZHluYW1pYyByZWxvYy4gICovCi0KLXN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3JlbG9jCi17Ci0gIC8qIEFkZHJlc3MuICAqLwotICB1bnNpZ25lZCBjaGFyIGxfdmFkZHJbNF07Ci0gIC8qIFN5bWJvbCB0YWJsZSBpbmRleC4gIFRoaXMgaXMgMCBmb3IgLnRleHQgYW5kIDEgZm9yIC5kYXRhLiAgMgotICAgICBtZWFucyAuYnNzLCBidXQgSSBkb24ndCBrbm93IGlmIGl0IGlzIHVzZWQuICBJbiBYQ09GRiwgbGFyZ2VyCi0gICAgIG51bWJlcnMgYXJlIGluZGljZXMgaW50byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGJ1dCB0aGV5IGFyZQotICAgICBwcmVzdW1hYmx5IG5vdCB1c2VkIGluIGFuIE5MTS4gICovCi0gIHVuc2lnbmVkIGNoYXIgbF9zeW1uZHhbNF07Ci0gIC8qIFJlbG9jYXRpb24gdHlwZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgbF9ydHlwZVsyXTsKLSAgLyogU2VjdGlvbiBudW1iZXIgYmVpbmcgcmVsb2NhdGVkLiAgKi8KLSAgdW5zaWduZWQgY2hhciBsX3JzZWNubVsyXTsKLX07Ci0KLSNlbmRpZiAvKiBPTERGT1JNQVQgKi8KLQotLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiB0aGUgZml4ZWQgaGVhZGVyLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtMzJfcG93ZXJwY19leHRlcm5hbF9maXhlZF9oZWFkZXIKLXsKLQotICAvKiBUaGUgc2lnbmF0dXJlIGZpZWxkIGlkZW50aWZpZXMgdGhlIGZpbGUgYXMgYW4gTkxNLiAgSXQgbXVzdCBjb250YWluCi0gICAgIHRoZSBzaWduYXR1cmUgc3RyaW5nLCB3aGljaCBkZXBlbmRzIHVwb24gdGhlIE5MTSB0YXJnZXQuICovCi0KLSAgdW5zaWduZWQgY2hhciBzaWduYXR1cmVbMjRdOwotCi0gIC8qIFRoZSB2ZXJzaW9uIG9mIHRoZSBoZWFkZXIuICBBdCB0aGlzIHRpbWUsIHRoZSBoaWdoZXN0IHZlcnNpb24gbnVtYmVyCi0gICAgIGlzIDQuICovCi0KLSAgdW5zaWduZWQgY2hhciB2ZXJzaW9uWzRdOwotCi0gIC8qIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUsIHdoaWNoIG11c3QgYmUgYSBET1MgbmFtZSAoMS04IGNoYXJhY3RlcnMgZm9sbG93ZWQKLSAgICAgYnkgYSBwZXJpb2QgYW5kIGEgMS0zIGNoYXJhY3RlciBleHRlbnNpb24pLiAgVGhlIGZpcnN0IGJ5dGUgaXMgdGhlIGJ5dGUKLSAgICAgbGVuZ3RoIG9mIHRoZSBuYW1lIGFuZCB0aGUgbGFzdCBieXRlIGlzIGEgbnVsbCB0ZXJtaW5hdG9yIGJ5dGUuICBUaGlzCi0gICAgIGZpZWxkIGlzIGZpeGVkIGxlbmd0aCwgYW5kIGFueSB1bnVzZWQgYnl0ZXMgc2hvdWxkIGJlIG51bGwgYnl0ZXMuICBUaGUKLSAgICAgdmFsdWUgaXMgc2V0IGJ5IHRoZSBPVVRQVVQga2V5d29yZCB0byBOTE1MSU5LLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlTmFtZVsxNF07Ci0KLSAgLyogUGFkZGluZyB0byBtYWtlIGl0IGNvbWUgb3V0IGNvcnJlY3QuICovCi0KLSAgdW5zaWduZWQgY2hhciBwYWQxWzJdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgY29kZSBpbWFnZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGNvZGVJbWFnZU9mZnNldFs0XTsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgY29kZSBpbWFnZSwgaW4gYnl0ZXMuICovCi0KLSAgdW5zaWduZWQgY2hhciBjb2RlSW1hZ2VTaXplWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgZGF0YSBpbWFnZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRhdGFJbWFnZU9mZnNldFs0XTsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgZGF0YSBpbWFnZSwgaW4gYnl0ZXMuICovCi0KLSAgdW5zaWduZWQgY2hhciBkYXRhSW1hZ2VTaXplWzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSB1bmluaXRpYWxpemVkIGRhdGEgcmVnaW9uIHRoYXQgdGhlIGxvYWRlciBpcyB0byBiZQotICAgICBhbGxvY2F0ZWQgYXQgbG9hZCB0aW1lLiAgVW5pbml0aWFsaXplZCBkYXRhIGZvbGxvd3MgdGhlIGluaXRpYWxpemVkCi0gICAgIGRhdGEgaW4gdGhlIE5MTSBhZGRyZXNzIHNwYWNlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgdW5pbml0aWFsaXplZERhdGFTaXplWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgY3VzdG9tIGRhdGEgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICBUaGUKLSAgICAgY3VzdG9tIGRhdGEgaXMgc2V0IGJ5IHRoZSBDVVNUT00ga2V5d29yZCB0byBOTE1MSU5LLiAgSXQgaXMgcG9zc2libGUKLSAgICAgZm9yIHRoaXMgdG8gYmUgRU9GIGlmIHRoZXJlIGlzIG5vIGN1c3RvbSBkYXRhLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY3VzdG9tRGF0YU9mZnNldFs0XTsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgY3VzdG9tIGRhdGEsIGluIGJ5dGVzLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY3VzdG9tRGF0YVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotICAgICBUaGUgbW9kdWxlIGRlcGVuZGVuY2llcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgTU9EVUxFIGtleXdvcmQgaW4KLSAgICAgTkxNTElOSy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIG1vZHVsZURlcGVuZGVuY3lPZmZzZXRbNF07Ci0KLSAgLyogVGhlIG51bWJlciBvZiBtb2R1bGUgZGVwZW5kZW5jaWVzIGF0IHRoZSBtb2R1bGVEZXBlbmRlbmN5T2Zmc2V0LiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZNb2R1bGVEZXBlbmRlbmNpZXNbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSByZWxvY2F0aW9uIGZpeHVwIGRhdGEgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUgKi8KLSAgICAgCi0gIHVuc2lnbmVkIGNoYXIgcmVsb2NhdGlvbkZpeHVwT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBwdWJsaWNzT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZQdWJsaWNzWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgaW50ZXJuYWwgZGVidWcgaW5mbyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KLSAgICAgSXQgaXMgcG9zc2libGUgZm9yIHRoaXMgdG8gYmUgRU9GIGlmIHRoZXJlIGlzIG5vIGRlYnVnIGluZm8uICovCi0KLSAgdW5zaWduZWQgY2hhciBkZWJ1Z0luZm9PZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZkRlYnVnUmVjb3Jkc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIGNvZGVTdGFydE9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGV4aXRQcm9jZWR1cmVPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBjaGVja1VubG9hZFByb2NlZHVyZU9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG1vZHVsZVR5cGVbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBmbGFnc1s0XTsKLQotfSBObG0zMl9wb3dlcnBjX0V4dGVybmFsX0ZpeGVkX0hlYWRlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL3NwYXJjMzItZXh0LmggYi9pbmNsdWRlL25sbS9zcGFyYzMyLWV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGViMmRlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbmxtL3NwYXJjMzItZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyogU1BBUkMgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZSBleHRlcm5hbCBmb3JtYXQgb2YgdGhlIGZpeGVkIGhlYWRlci4gICovCi0KLXR5cGVkZWYgc3RydWN0IG5sbTMyX3NwYXJjX2V4dGVybmFsX2ZpeGVkX2hlYWRlcgotewotCi0gIC8qIFRoZSBzaWduYXR1cmUgZmllbGQgaWRlbnRpZmllcyB0aGUgZmlsZSBhcyBhbiBOTE0uICBJdCBtdXN0IGNvbnRhaW4KLSAgICAgdGhlIHNpZ25hdHVyZSBzdHJpbmcsIHdoaWNoIGRlcGVuZHMgdXBvbiB0aGUgTkxNIHRhcmdldC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVsyNF07Ci0KLSAgLyogVGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlci4gIEF0IHRoaXMgdGltZSwgdGhlIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIKLSAgICAgaXMgNC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHZlcnNpb25bNF07Ci0KLSAgLyogVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgd2hpY2ggbXVzdCBiZSBhIERPUyBuYW1lICgxLTggY2hhcmFjdGVycyBmb2xsb3dlZAotICAgICBieSBhIHBlcmlvZCBhbmQgYSAxLTMgY2hhcmFjdGVyIGV4dGVuc2lvbikuICBUaGUgZmlyc3QgYnl0ZSBpcyB0aGUgYnl0ZQotICAgICBsZW5ndGggb2YgdGhlIG5hbWUgYW5kIHRoZSBsYXN0IGJ5dGUgaXMgYSBudWxsIHRlcm1pbmF0b3IgYnl0ZS4gIFRoaXMKLSAgICAgZmllbGQgaXMgZml4ZWQgbGVuZ3RoLCBhbmQgYW55IHVudXNlZCBieXRlcyBzaG91bGQgYmUgbnVsbCBieXRlcy4gIFRoZQotICAgICB2YWx1ZSBpcyBzZXQgYnkgdGhlIE9VVFBVVCBrZXl3b3JkIHRvIE5MTUxJTksuICovCi0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVOYW1lWzE0XTsKLQotICAvKiBQYWRkaW5nIHRvIG1ha2UgaXQgY29tZSBvdXQgY29ycmVjdC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHBhZDFbMl07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjb2RlIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjb2RlIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGNvZGVJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBkYXRhIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBkYXRhIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRhdGFJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWdpb24gdGhhdCB0aGUgbG9hZGVyIGlzIHRvIGJlCi0gICAgIGFsbG9jYXRlZCBhdCBsb2FkIHRpbWUuICBVbmluaXRpYWxpemVkIGRhdGEgZm9sbG93cyB0aGUgaW5pdGlhbGl6ZWQKLSAgICAgZGF0YSBpbiB0aGUgTkxNIGFkZHJlc3Mgc3BhY2UuICovCi0KLSAgdW5zaWduZWQgY2hhciB1bmluaXRpYWxpemVkRGF0YVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXN0b20gZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIFRoZQotICAgICBjdXN0b20gZGF0YSBpcyBzZXQgYnkgdGhlIENVU1RPTSBrZXl3b3JkIHRvIE5MTUxJTksuICBJdCBpcyBwb3NzaWJsZQotICAgICBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gY3VzdG9tIGRhdGEuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjdXN0b20gZGF0YSwgaW4gYnl0ZXMuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIFRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNT0RVTEUga2V5d29yZCBpbgotICAgICBOTE1MSU5LLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlRGVwZW5kZW5jeU9mZnNldFs0XTsKLQotICAvKiBUaGUgbnVtYmVyIG9mIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXQgdGhlIG1vZHVsZURlcGVuZGVuY3lPZmZzZXQuICovCi0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZk1vZHVsZURlcGVuZGVuY2llc1s0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIHJlbG9jYXRpb24gZml4dXAgZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLwotICAgICAKLSAgdW5zaWduZWQgY2hhciByZWxvY2F0aW9uRml4dXBPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlJlbG9jYXRpb25GaXh1cHNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBleHRlcm5hbFJlZmVyZW5jZXNPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIHB1YmxpY3NPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlB1YmxpY3NbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBkZWJ1ZyBpbmZvIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotICAgICBJdCBpcyBwb3NzaWJsZSBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mby4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRlYnVnSW5mb09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRGVidWdSZWNvcmRzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZVN0YXJ0T2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZXhpdFByb2NlZHVyZU9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlVHlwZVs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGZsYWdzWzRdOwotCi19IE5sbTMyX3NwYXJjX0V4dGVybmFsX0ZpeGVkX0hlYWRlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb2FzeXMuaCBiL2luY2x1ZGUvb2FzeXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3ZDI1MC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29hc3lzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyogT2FzeXMgb2JqZWN0IGZvcm1hdCBoZWFkZXIgZmlsZSBmb3IgQkZELgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0jZGVmaW5lIE9BU1lTX01BWF9TRUNfQ09VTlQgMTYKLS8qICoqKiogKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfYXJjaGl2ZV9oZWFkZXIgewotICB1bnNpZ25lZCBpbnQgIHZlcnNpb247Ci0gIGNoYXIgY3JlYXRlX2RhdGVbMTJdOwotICBjaGFyIHJldmlzaW9uX2RhdGVbMTJdOwotICB1bnNpZ25lZCBpbnQgbW9kX2NvdW50OwotICBmaWxlX3B0ciBtb2RfdGJsX29mZnNldDsKLSAgdW5zaWduZWQgaW50IHN5bV90Ymxfc2l6ZTsKLSAgdW5zaWduZWQgaW50IHN5bV9jb3VudDsKLSAgZmlsZV9wdHIgc3ltX3RibF9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCB4cmVmX2NvdW50OwotICBmaWxlX3B0ciB4cmVmX2xzdF9vZmZzZXQ7Ci19IG9hc3lzX2FyY2hpdmVfaGVhZGVyX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX2V4dGFyY2hpdmVfaGVhZGVyIHsKLSAgYmZkX2J5dGUgdmVyc2lvbls0XTsKLSAgYmZkX2J5dGUgY3JlYXRlX2RhdGVbMTJdOwotICBiZmRfYnl0ZSByZXZpc2lvbl9kYXRlWzEyXTsKLSAgYmZkX2J5dGUgbW9kX2NvdW50WzRdOwotICBiZmRfYnl0ZSBtb2RfdGJsX29mZnNldFs0XTsKLSAgYmZkX2J5dGUgc3ltX3RibF9zaXplWzRdOwotICBiZmRfYnl0ZSBzeW1fY291bnRbNF07Ci0gIGJmZF9ieXRlIHN5bV90Ymxfb2Zmc2V0WzRdOwotICBiZmRfYnl0ZSB4cmVmX2NvdW50WzRdOwotICBiZmRfYnl0ZSB4cmVmX2xzdF9vZmZzZXRbNF07Ci19IG9hc3lzX2V4dGFyY2hpdmVfaGVhZGVyX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX21vZHVsZV90YWJsZSB7Ci0gIGludCBtb2RfbnVtYmVyOwotICBjaGFyIG1vZF9kYXRlWzEyXTsKLSAgdW5zaWduZWQgaW50IG1vZF9zaXplOwotICB1bnNpZ25lZCBpbnQgZGVwX2NvdW50OwotICB1bnNpZ25lZCBpbnQgZGVwZWVfY291bnQ7Ci0gIGZpbGVfcHRyIGZpbGVfb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgc2VjdF9jb3VudDsKLSAgY2hhciAqbW9kdWxlX25hbWU7Ci0gIHVuc2lnbmVkIGludCBtb2R1bGVfbmFtZV9zaXplOwotfSBvYXN5c19tb2R1bGVfdGFibGVfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCBvYXN5c19leHRtb2R1bGVfdGFibGVfYSB7Ci0gIGJmZF9ieXRlIG1vZF9udW1iZXJbNF07Ci0gIGJmZF9ieXRlIG1vZF9kYXRlWzEyXTsKLSAgYmZkX2J5dGUgbW9kX3NpemVbNF07Ci0gIGJmZF9ieXRlIGRlcF9jb3VudFs0XTsKLSAgYmZkX2J5dGUgZGVwZWVfY291bnRbNF07Ci0gIGJmZF9ieXRlIHNlY3RfY291bnRbNF07Ci0gIGJmZF9ieXRlIGZpbGVfb2Zmc2V0WzRdOwotICBiZmRfYnl0ZSBtb2RfbmFtZVszMl07Ci19IG9hc3lzX2V4dG1vZHVsZV90YWJsZV90eXBlX2FfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfZXh0bW9kdWxlX3RhYmxlX2IgewotICBiZmRfYnl0ZSBtb2RfbnVtYmVyWzRdOwotICBiZmRfYnl0ZSBtb2RfZGF0ZVsxMl07Ci0gIGJmZF9ieXRlIG1vZF9zaXplWzRdOwotICBiZmRfYnl0ZSBkZXBfY291bnRbNF07Ci0gIGJmZF9ieXRlIGRlcGVlX2NvdW50WzRdOwotICBiZmRfYnl0ZSBzZWN0X2NvdW50WzRdOwotICBiZmRfYnl0ZSBmaWxlX29mZnNldFs0XTsKLSAgYmZkX2J5dGUgbW9kX25hbWVfbGVuZ3RoWzRdOwotfSBvYXN5c19leHRtb2R1bGVfdGFibGVfdHlwZV9iX3R5cGU7Ci0KLQotdHlwZWRlZiBlbnVtIG9hc3lzX3JlY29yZCB7Ci0gIG9hc3lzX3JlY29yZF9pc19lbmRfZW51bSA9IDAsCi0gIG9hc3lzX3JlY29yZF9pc19kYXRhX2VudW0gPSAxLAotICBvYXN5c19yZWNvcmRfaXNfc3ltYm9sX2VudW0gPSAyLAotICBvYXN5c19yZWNvcmRfaXNfaGVhZGVyX2VudW0gPSAzLAotICBvYXN5c19yZWNvcmRfaXNfbmFtZWRfc2VjdGlvbl9lbnVtID0gNCwKLSAgb2FzeXNfcmVjb3JkX2lzX2NvbV9lbnVtID0gNSwKLSAgb2FzeXNfcmVjb3JkX2lzX2RlYnVnX2VudW0gPSA2LAotICBvYXN5c19yZWNvcmRfaXNfc2VjdGlvbl9lbnVtID0gNywKLSAgb2FzeXNfcmVjb3JkX2lzX2RlYnVnX2ZpbGVfZW51bSA9IDgsCi0gIG9hc3lzX3JlY29yZF9pc19tb2R1bGVfZW51bSA9IDksCi0gIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtID0gMTAKLX0gb2FzeXNfcmVjb3JkX2VudW1fdHlwZTsKLQotICAKLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfcmVjb3JkX2hlYWRlciB7Ci0gIHVuc2lnbmVkIGNoYXIgbGVuZ3RoOwotICB1bnNpZ25lZCBjaGFyIGNoZWNrX3N1bTsKLSAgdW5zaWduZWQgY2hhciB0eXBlOwotICB1bnNpZ25lZCBjaGFyIGZpbGw7Ci19IG9hc3lzX3JlY29yZF9oZWFkZXJfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfZGF0YV9yZWNvcmQgewotICBvYXN5c19yZWNvcmRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bnNpZ25lZCBjaGFyIHJlbGI7Ci0gIGJmZF9ieXRlIGFkZHJbNF07Ci0gIC8qIG1heGltdW0gdG90YWwgc2l6ZSBvZiBkYXRhIHJlY29yZCBpcyAyNTUgYnl0ZXMgKi8KLSAgYmZkX2J5dGUgZGF0YVsyNDZdOwotfSBvYXN5c19kYXRhX3JlY29yZF90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBvYXN5c19oZWFkZXJfcmVjb3JkIHsKLSAgb2FzeXNfcmVjb3JkX2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgdW5zaWduZWQgY2hhciB2ZXJzaW9uX251bWJlcjsKLSAgdW5zaWduZWQgY2hhciByZXZfbnVtYmVyOwotICBjaGFyIG1vZHVsZV9uYW1lWzI2LTZdOwotICBjaGFyIGRlc2NyaXB0aW9uWzY0LTI2XTsKLX0gb2FzeXNfaGVhZGVyX3JlY29yZF90eXBlOwotCi0jZGVmaW5lIE9BU1lTX1ZFUlNJT05fTlVNQkVSIDAKLSNkZWZpbmUgT0FTWVNfUkVWX05VTUJFUiAwCi0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX3N5bWJvbF9yZWNvcmQgewotICBvYXN5c19yZWNvcmRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bnNpZ25lZCBjaGFyIHJlbGI7Ci0gIGJmZF9ieXRlIHZhbHVlWzRdOwotICBiZmRfYnl0ZSByZWZub1syXTsKLSAgY2hhciBuYW1lWzY0XTsKLX0gb2FzeXNfc3ltYm9sX3JlY29yZF90eXBlOwotCi0jZGVmaW5lIFJFTE9DQVRJT05fUENSRUxfQklUIDB4ODAKLSNkZWZpbmUgUkVMT0NBVElPTl8zMkJJVF9CSVQgMHg0MAotI2RlZmluZSBSRUxPQ0FUSU9OX1RZUEVfQklUUyAweDMwCi0jZGVmaW5lIFJFTE9DQVRJT05fVFlQRV9BQlMgMHgwMAotI2RlZmluZSBSRUxPQ0FUSU9OX1RZUEVfUkVMIDB4MTAKLSNkZWZpbmUgUkVMT0NBVElPTl9UWVBFX1VORCAweDIwCi0jZGVmaW5lIFJFTE9DQVRJT05fVFlQRV9DT00gMHgzMAotI2RlZmluZSBSRUxPQ0FUSU9OX1NFQ1RfQklUUyAweDBmCi0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX3NlY3Rpb25fcmVjb3JkIHsKLSAgb2FzeXNfcmVjb3JkX2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgdW5zaWduZWQgY2hhciByZWxiOwotICBiZmRfYnl0ZSB2YWx1ZVs0XTsKLSAgYmZkX2J5dGUgdm1hWzRdOwotICBiZmRfYnl0ZSBmaWxsWzNdOwotfSBvYXN5c19zZWN0aW9uX3JlY29yZF90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBvYXN5c19lbmRfcmVjb3JkIHsKLSAgb2FzeXNfcmVjb3JkX2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgdW5zaWduZWQgY2hhciByZWxiOwotICBiZmRfYnl0ZSBlbnRyeVs0XTsKLSAgYmZkX2J5dGUgZmlsbFsyXTsKLSAgYmZkX2J5dGUgemVybzsKLX0gb2FzeXNfZW5kX3JlY29yZF90eXBlOwotCi10eXBlZGVmIHVuaW9uIG9hc3lzX3JlY29yZF91bmlvbiB7Ci0gIG9hc3lzX3JlY29yZF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIG9hc3lzX2RhdGFfcmVjb3JkX3R5cGUgZGF0YTsKLSAgb2FzeXNfc2VjdGlvbl9yZWNvcmRfdHlwZSBzZWN0aW9uOwotICBvYXN5c19zeW1ib2xfcmVjb3JkX3R5cGUgc3ltYm9sOwotICBvYXN5c19oZWFkZXJfcmVjb3JkX3R5cGUgZmlyc3Q7Ci0gIG9hc3lzX2VuZF9yZWNvcmRfdHlwZSBlbmQ7Ci0gIGJmZF9ieXRlIHBhZFsyNTZdOwotfSBvYXN5c19yZWNvcmRfdW5pb25fdHlwZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb2JqYWxsb2MuaCBiL2luY2x1ZGUvb2JqYWxsb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI0NTFjZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29iamFsbG9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyogb2JqYWxsb2MuaCAtLSByb3V0aW5lcyB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG9iamVjdHMKLSAgIENvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci1sYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBPQkpBTExPQ19ICi0jZGVmaW5lIE9CSkFMTE9DX0gKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIFRoZXNlIHJvdXRpbmVzIGFsbG9jYXRlIHNwYWNlIGZvciBhbiBvYmplY3QuICBUaGUgYXNzdW1wdGlvbiBpcwotICAgdGhhdCB0aGUgb2JqZWN0IHdpbGwgd2FudCB0byBhbGxvY2F0ZSBzcGFjZSBhcyBpdCBnb2VzIGFsb25nLCBidXQKLSAgIHdpbGwgbmV2ZXIgd2FudCB0byBmcmVlIGFueSBwYXJ0aWN1bGFyIGJsb2NrLiAgVGhlcmUgaXMgYSBmdW5jdGlvbgotICAgdG8gZnJlZSBhIGJsb2NrLCB3aGljaCBhbHNvIGZyZWVzIGFsbCBtb3JlIHJlY2VudGx5IGFsbG9jYXRlZAotICAgYmxvY2tzLiAgVGhlcmUgaXMgYWxzbyBhIGZ1bmN0aW9uIHRvIGZyZWUgYWxsIHRoZSBhbGxvY2F0ZWQgc3BhY2UuCi0KLSAgIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBzcGVjaWFsaXphdGlvbiBvZiBvYnN0YWNrcy4gIFRoZSBtYWluCi0gICBkaWZmZXJlbmNlIGlzIHRoYXQgYSBibG9jayBtYXkgbm90IGJlIGFsbG9jYXRlZCBhIGJpdCBhdCBhIHRpbWUuCi0gICBBbm90aGVyIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGVzZSByb3V0aW5lcyBhcmUgYWx3YXlzIGJ1aWx0IG9uIHRvcAotICAgb2YgbWFsbG9jLCBhbmQgYWx3YXlzIHBhc3MgYW4gbWFsbG9jIGZhaWx1cmUgYmFjayB0byB0aGUgY2FsbGVyLAotICAgdW5saWtlIG1vcmUgcmVjZW50IHZlcnNpb25zIG9mIG9ic3RhY2tzLiAgKi8KLQotLyogVGhpcyBpcyB3aGF0IGFuIG9iamFsbG9jIHN0cnVjdHVyZSBsb29rcyBsaWtlLiAgQ2FsbGVycyBzaG91bGQgbm90Ci0gICByZWZlciB0byB0aGVzZSBmaWVsZHMsIG5vciBzaG91bGQgdGhleSBhbGxvY2F0ZSB0aGVzZSBzdHJ1Y3R1cmUKLSAgIHRoZW1zZWx2ZXMuICBJbnN0ZWFkLCB0aGV5IHNob3VsZCBvbmx5IGNyZWF0ZSB0aGVtIHZpYQotICAgb2JqYWxsb2NfaW5pdCwgYW5kIG9ubHkgYWNjZXNzIHRoZW0gdmlhIHRoZSBmdW5jdGlvbnMgYW5kIG1hY3JvcwotICAgbGlzdGVkIGJlbG93LiAgVGhlIHN0cnVjdHVyZSBpcyBvbmx5IGRlZmluZWQgaGVyZSBzbyB0aGF0IHdlIGNhbgotICAgYWNjZXNzIGl0IHZpYSBtYWNyb3MuICAqLwotCi1zdHJ1Y3Qgb2JqYWxsb2MKLXsKLSAgY2hhciAqY3VycmVudF9wdHI7Ci0gIHVuc2lnbmVkIGludCBjdXJyZW50X3NwYWNlOwotICBQVFIgY2h1bmtzOwotfTsKLQotLyogV29yayBvdXQgdGhlIHJlcXVpcmVkIGFsaWdubWVudC4gICovCi0KLXN0cnVjdCBvYmphbGxvY19hbGlnbiB7IGNoYXIgeDsgZG91YmxlIGQ7IH07Ci0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSNpZm5kZWYgb2Zmc2V0b2YKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotI2RlZmluZSBPQkpBTExPQ19BTElHTiBcCi0gICgocHRyZGlmZl90KSAoKGNoYXIgKikgJigoc3RydWN0IG9iamFsbG9jX2FsaWduICopIDApLT5kIC0gKGNoYXIgKikgMCkpCi0jZWxzZQotI2RlZmluZSBPQkpBTExPQ19BTElHTiBcCi0gICgobG9uZykgKChjaGFyICopICYoKHN0cnVjdCBvYmphbGxvY19hbGlnbiAqKSAwKS0+ZCAtIChjaGFyICopIDApKQotI2VuZGlmCi0KLS8qIENyZWF0ZSBhbiBvYmphbGxvYyBzdHJ1Y3R1cmUuICBSZXR1cm5zIE5VTEwgaWYgbWFsbG9jIGZhaWxzLiAgKi8KLQotZXh0ZXJuIHN0cnVjdCBvYmphbGxvYyAqb2JqYWxsb2NfY3JlYXRlIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogQWxsb2NhdGUgc3BhY2UgZnJvbSBhbiBvYmphbGxvYyBzdHJ1Y3R1cmUuICBSZXR1cm5zIE5VTEwgaWYgbWFsbG9jCi0gICBmYWlscy4gICovCi0KLWV4dGVybiBQVFIgX29iamFsbG9jX2FsbG9jIFBBUkFNUyAoKHN0cnVjdCBvYmphbGxvYyAqLCB1bnNpZ25lZCBsb25nKSk7Ci0KLS8qIFRoZSBtYWNybyB2ZXJzaW9uIG9mIG9iamFsbG9jX2FsbG9jLiAgV2Ugb25seSBkZWZpbmUgdGhpcyBpZiB1c2luZwotICAgZ2NjLCBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b3VsZCBoYXZlIHRvIGV2YWx1YXRlIHRoZSBhcmd1bWVudHMKLSAgIG11bHRpcGxlIHRpbWVzLCBvciB1c2UgYSB0ZW1wb3JhcnkgZmllbGQgYXMgb2JzdGFjay5oIGRvZXMuICAqLwotCi0jaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotCi0vKiBOZXh0U3RlcCAyLjAgY2MgaXMgcmVhbGx5IGdjYyAxLjkzIGJ1dCBpdCBkZWZpbmVzIF9fR05VQ19fID0gMiBhbmQKLSAgIGRvZXMgbm90IGltcGxlbWVudCBfX2V4dGVuc2lvbl9fLiAgQnV0IHRoYXQgY29tcGlsZXIgZG9lc24ndCBkZWZpbmUKLSAgIF9fR05VQ19NSU5PUl9fLiAgKi8KLSNpZiBfX0dOVUNfXyA8IDIgfHwgKF9fTmVYVF9fICYmICFfX0dOVUNfTUlOT1JfXykKLSNkZWZpbmUgX19leHRlbnNpb25fXwotI2VuZGlmCi0KLSNkZWZpbmUgb2JqYWxsb2NfYWxsb2MobywgbCkJCQkJCQlcCi0gIF9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSAgKHsgc3RydWN0IG9iamFsbG9jICpfX28gPSAobyk7CQkJCQlcCi0gICAgIHVuc2lnbmVkIGxvbmcgX19sZW4gPSAobCk7CQkJCQkJXAotICAgICBpZiAoX19sZW4gPT0gMCkJCQkJCQkJXAotICAgICAgIF9fbGVuID0gMTsJCQkJCQkJXAotICAgICBfX2xlbiA9IChfX2xlbiArIE9CSkFMTE9DX0FMSUdOIC0gMSkgJn4gKE9CSkFMTE9DX0FMSUdOIC0gMSk7CVwKLSAgICAgKF9fbGVuIDw9IF9fby0+Y3VycmVudF9zcGFjZQkJCQkJXAotICAgICAgPyAoX19vLT5jdXJyZW50X3B0ciArPSBfX2xlbiwJCQkJCVwKLQkgX19vLT5jdXJyZW50X3NwYWNlIC09IF9fbGVuLAkJCQkJXAotCSAoUFRSKSAoX19vLT5jdXJyZW50X3B0ciAtIF9fbGVuKSkJCQkJXAotICAgICAgOiBfb2JqYWxsb2NfYWxsb2MgKF9fbywgX19sZW4pKTsgfSkKLQotI2Vsc2UgLyogISBfX0dOVUNfXyAqLwotCi0jZGVmaW5lIG9iamFsbG9jX2FsbG9jKG8sIGwpIF9vYmphbGxvY19hbGxvYyAoKG8pLCAobCkpCi0KLSNlbmRpZiAvKiAhIF9fR05VQ19fICovCi0KLS8qIEZyZWUgYW4gZW50aXJlIG9iamFsbG9jIHN0cnVjdHVyZS4gICovCi0KLWV4dGVybiB2b2lkIG9iamFsbG9jX2ZyZWUgUEFSQU1TICgoc3RydWN0IG9iamFsbG9jICopKTsKLQotLyogRnJlZSBhIGJsb2NrIGFsbG9jYXRlZCBieSBvYmphbGxvY19hbGxvYy4gIFRoaXMgYWxzbyBmcmVlcyBhbGwgbW9yZQotICAgcmVjZW50bHkgYWxsb2NhdGVkIGJsb2Nrcy4gICovCi0KLWV4dGVybiB2b2lkIG9iamFsbG9jX2ZyZWVfYmxvY2sgUEFSQU1TICgoc3RydWN0IG9iamFsbG9jICosIFBUUikpOwotCi0jZW5kaWYgLyogT0JKQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vYnN0YWNrLmggYi9pbmNsdWRlL29ic3RhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhlOTY3Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29ic3RhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi0vKiBvYnN0YWNrLmggLSBvYmplY3Qgc3RhY2sgbWFjcm9zCi0gICBDb3B5cmlnaHQgKEMpIDE5ODgsODksOTAsOTEsOTIsOTMsOTQsOTYsOTcsOTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLQotICAgTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIEMgTGlicmFyeS4KLSAgIEJ1Z3MgY2FuIGJlIHJlcG9ydGVkIHRvIGJ1Zy1nbGliY0BnbnUub3JnLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gICBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotLyogU3VtbWFyeToKLQotQWxsIHRoZSBhcHBhcmVudCBmdW5jdGlvbnMgZGVmaW5lZCBoZXJlIGFyZSBtYWNyb3MuIFRoZSBpZGVhCi1pcyB0aGF0IHlvdSB3b3VsZCB1c2UgdGhlc2UgcHJlLXRlc3RlZCBtYWNyb3MgdG8gc29sdmUgYQotdmVyeSBzcGVjaWZpYyBzZXQgb2YgcHJvYmxlbXMsIGFuZCB0aGV5IHdvdWxkIHJ1biBmYXN0LgotQ2F1dGlvbjogbm8gc2lkZS1lZmZlY3RzIGluIGFyZ3VtZW50cyBwbGVhc2UhISBUaGV5IG1heSBiZQotZXZhbHVhdGVkIE1BTlkgdGltZXMhIQotCi1UaGVzZSBtYWNyb3Mgb3BlcmF0ZSBhIHN0YWNrIG9mIG9iamVjdHMuICBFYWNoIG9iamVjdCBzdGFydHMgbGlmZQotc21hbGwsIGFuZCBtYXkgZ3JvdyB0byBtYXR1cml0eS4gIChDb25zaWRlciBidWlsZGluZyBhIHdvcmQgc3lsbGFibGUKLWJ5IHN5bGxhYmxlLikgIEFuIG9iamVjdCBjYW4gbW92ZSB3aGlsZSBpdCBpcyBncm93aW5nLiAgT25jZSBpdCBoYXMKLWJlZW4gImZpbmlzaGVkIiBpdCBuZXZlciBjaGFuZ2VzIGFkZHJlc3MgYWdhaW4uICBTbyB0aGUgInRvcCBvZiB0aGUKLXN0YWNrIiBpcyB0eXBpY2FsbHkgYW4gaW1tYXR1cmUgZ3Jvd2luZyBvYmplY3QsIHdoaWxlIHRoZSByZXN0IG9mIHRoZQotc3RhY2sgaXMgb2YgbWF0dXJlLCBmaXhlZCBzaXplIGFuZCBmaXhlZCBhZGRyZXNzIG9iamVjdHMuCi0KLVRoZXNlIHJvdXRpbmVzIGdyYWIgbGFyZ2UgY2h1bmtzIG9mIG1lbW9yeSwgdXNpbmcgYSBmdW5jdGlvbiB5b3UKLXN1cHBseSwgY2FsbGVkIGBvYnN0YWNrX2NodW5rX2FsbG9jJy4gIE9uIG9jY2FzaW9uLCB0aGV5IGZyZWUgY2h1bmtzLAotYnkgY2FsbGluZyBgb2JzdGFja19jaHVua19mcmVlJy4gIFlvdSBtdXN0IGRlZmluZSB0aGVtIGFuZCBkZWNsYXJlCi10aGVtIGJlZm9yZSB1c2luZyBhbnkgb2JzdGFjayBtYWNyb3MuCi0KLUVhY2ggaW5kZXBlbmRlbnQgc3RhY2sgaXMgcmVwcmVzZW50ZWQgYnkgYSBgc3RydWN0IG9ic3RhY2snLgotRWFjaCBvZiB0aGUgb2JzdGFjayBtYWNyb3MgZXhwZWN0cyBhIHBvaW50ZXIgdG8gc3VjaCBhIHN0cnVjdHVyZQotYXMgdGhlIGZpcnN0IGFyZ3VtZW50LgotCi1PbmUgbW90aXZhdGlvbiBmb3IgdGhpcyBwYWNrYWdlIGlzIHRoZSBwcm9ibGVtIG9mIGdyb3dpbmcgY2hhciBzdHJpbmdzCi1pbiBzeW1ib2wgdGFibGVzLiAgVW5sZXNzIHlvdSBhcmUgImZhc2Npc3QgcGlnIHdpdGggYSByZWFkLW9ubHkgbWluZCIKLS0tR29zcGVyJ3MgaW1tb3J0YWwgcXVvdGUgZnJvbSBIQUtNRU0gaXRlbSAxNTQsIG91dCBvZiBjb250ZXh0LS15b3UKLXdvdWxkIG5vdCBsaWtlIHRvIHB1dCBhbnkgYXJiaXRyYXJ5IHVwcGVyIGxpbWl0IG9uIHRoZSBsZW5ndGggb2YgeW91cgotc3ltYm9scy4KLQotSW4gcHJhY3RpY2UgdGhpcyBvZnRlbiBtZWFucyB5b3Ugd2lsbCBidWlsZCBtYW55IHNob3J0IHN5bWJvbHMgYW5kIGEKLWZldyBsb25nIHN5bWJvbHMuICBBdCB0aGUgdGltZSB5b3UgYXJlIHJlYWRpbmcgYSBzeW1ib2wgeW91IGRvbid0IGtub3cKLWhvdyBsb25nIGl0IGlzLiAgT25lIHRyYWRpdGlvbmFsIG1ldGhvZCBpcyB0byByZWFkIGEgc3ltYm9sIGludG8gYQotYnVmZmVyLCByZWFsbG9jKClhdGluZyB0aGUgYnVmZmVyIGV2ZXJ5IHRpbWUgeW91IHRyeSB0byByZWFkIGEgc3ltYm9sCi10aGF0IGlzIGxvbmdlciB0aGFuIHRoZSBidWZmZXIuICBUaGlzIGlzIGJlYXV0LCBidXQgeW91IHN0aWxsIHdpbGwKLXdhbnQgdG8gY29weSB0aGUgc3ltYm9sIGZyb20gdGhlIGJ1ZmZlciB0byBhIG1vcmUgcGVybWFuZW50Ci1zeW1ib2wtdGFibGUgZW50cnkgc2F5IGFib3V0IGhhbGYgdGhlIHRpbWUuCi0KLVdpdGggb2JzdGFja3MsIHlvdSBjYW4gd29yayBkaWZmZXJlbnRseS4gIFVzZSBvbmUgb2JzdGFjayBmb3IgYWxsIHN5bWJvbAotbmFtZXMuICBBcyB5b3UgcmVhZCBhIHN5bWJvbCwgZ3JvdyB0aGUgbmFtZSBpbiB0aGUgb2JzdGFjayBncmFkdWFsbHkuCi1XaGVuIHRoZSBuYW1lIGlzIGNvbXBsZXRlLCBmaW5hbGl6ZSBpdC4gIFRoZW4sIGlmIHRoZSBzeW1ib2wgZXhpc3RzIGFscmVhZHksCi1mcmVlIHRoZSBuZXdseSByZWFkIG5hbWUuCi0KLVRoZSB3YXkgd2UgZG8gdGhpcyBpcyB0byB0YWtlIGEgbGFyZ2UgY2h1bmssIGFsbG9jYXRpbmcgbWVtb3J5IGZyb20KLWxvdyBhZGRyZXNzZXMuICBXaGVuIHlvdSB3YW50IHRvIGJ1aWxkIGEgc3ltYm9sIGluIHRoZSBjaHVuayB5b3UganVzdAotYWRkIGNoYXJzIGFib3ZlIHRoZSBjdXJyZW50ICJoaWdoIHdhdGVyIG1hcmsiIGluIHRoZSBjaHVuay4gIFdoZW4geW91Ci1oYXZlIGZpbmlzaGVkIGFkZGluZyBjaGFycywgYmVjYXVzZSB5b3UgZ290IHRvIHRoZSBlbmQgb2YgdGhlIHN5bWJvbCwKLXlvdSBrbm93IGhvdyBsb25nIHRoZSBjaGFycyBhcmUsIGFuZCB5b3UgY2FuIGNyZWF0ZSBhIG5ldyBvYmplY3QuCi1Nb3N0bHkgdGhlIGNoYXJzIHdpbGwgbm90IGJ1cnN0IG92ZXIgdGhlIGhpZ2hlc3QgYWRkcmVzcyBvZiB0aGUgY2h1bmssCi1iZWNhdXNlIHlvdSB3b3VsZCB0eXBpY2FsbHkgZXhwZWN0IGEgY2h1bmsgdG8gYmUgKHNheSkgMTAwIHRpbWVzIGFzCi1sb25nIGFzIGFuIGF2ZXJhZ2Ugb2JqZWN0LgotCi1JbiBjYXNlIHRoYXQgaXNuJ3QgY2xlYXIsIHdoZW4gd2UgaGF2ZSBlbm91Z2ggY2hhcnMgdG8gbWFrZSB1cAotdGhlIG9iamVjdCwgVEhFWSBBUkUgQUxSRUFEWSBDT05USUdVT1VTIElOIFRIRSBDSFVOSyAoZ3VhcmFudGVlZCkKLXNvIHdlIGp1c3QgcG9pbnQgdG8gaXQgd2hlcmUgaXQgbGllcy4gIE5vIG1vdmluZyBvZiBjaGFycyBpcwotbmVlZGVkIGFuZCB0aGlzIGlzIHRoZSBzZWNvbmQgd2luOiBwb3RlbnRpYWxseSBsb25nIHN0cmluZ3MgbmVlZAotbmV2ZXIgYmUgZXhwbGljaXRseSBzaHVmZmxlZC4gT25jZSBhbiBvYmplY3QgaXMgZm9ybWVkLCBpdCBkb2VzIG5vdAotY2hhbmdlIGl0cyBhZGRyZXNzIGR1cmluZyBpdHMgbGlmZXRpbWUuCi0KLVdoZW4gdGhlIGNoYXJzIGJ1cnN0IG92ZXIgYSBjaHVuayBib3VuZGFyeSwgd2UgYWxsb2NhdGUgYSBsYXJnZXIKLWNodW5rLCBhbmQgdGhlbiBjb3B5IHRoZSBwYXJ0bHkgZm9ybWVkIG9iamVjdCBmcm9tIHRoZSBlbmQgb2YgdGhlIG9sZAotY2h1bmsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV3IGxhcmdlciBjaHVuay4gIFdlIHRoZW4gY2Fycnkgb24KLWFjY3JldGluZyBjaGFyYWN0ZXJzIHRvIHRoZSBlbmQgb2YgdGhlIG9iamVjdCBhcyB3ZSBub3JtYWxseSB3b3VsZC4KLQotQSBzcGVjaWFsIG1hY3JvIGlzIHByb3ZpZGVkIHRvIGFkZCBhIHNpbmdsZSBjaGFyIGF0IGEgdGltZSB0byBhCi1ncm93aW5nIG9iamVjdC4gIFRoaXMgYWxsb3dzIHRoZSB1c2Ugb2YgcmVnaXN0ZXIgdmFyaWFibGVzLCB3aGljaAotYnJlYWsgdGhlIG9yZGluYXJ5ICdncm93dGgnIG1hY3JvLgotCi1TdW1tYXJ5OgotCVdlIGFsbG9jYXRlIGxhcmdlIGNodW5rcy4KLQlXZSBjYXJ2ZSBvdXQgb25lIG9iamVjdCBhdCBhIHRpbWUgZnJvbSB0aGUgY3VycmVudCBjaHVuay4KLQlPbmNlIGNhcnZlZCwgYW4gb2JqZWN0IG5ldmVyIG1vdmVzLgotCVdlIGFyZSBmcmVlIHRvIGFwcGVuZCBkYXRhIG9mIGFueSBzaXplIHRvIHRoZSBjdXJyZW50bHkKLQkgIGdyb3dpbmcgb2JqZWN0LgotCUV4YWN0bHkgb25lIG9iamVjdCBpcyBncm93aW5nIGluIGFuIG9ic3RhY2sgYXQgYW55IG9uZSB0aW1lLgotCVlvdSBjYW4gcnVuIG9uZSBvYnN0YWNrIHBlciBjb250cm9sIGJsb2NrLgotCVlvdSBtYXkgaGF2ZSBhcyBtYW55IGNvbnRyb2wgYmxvY2tzIGFzIHlvdSBkYXJlLgotCUJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBkbyBpdCwgeW91IGNhbiBgdW53aW5kJyBhbiBvYnN0YWNrCi0JICBiYWNrIHRvIGEgcHJldmlvdXMgc3RhdGUuIChZb3UgbWF5IHJlbW92ZSBvYmplY3RzIG11Y2gKLQkgIGFzIHlvdSB3b3VsZCB3aXRoIGEgc3RhY2suKQotKi8KLQotCi0vKiBEb24ndCBkbyB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1vcmUgdGhhbiBvbmNlLiAgKi8KLQotI2lmbmRlZiBfT0JTVEFDS19ICi0jZGVmaW5lIF9PQlNUQUNLX0ggMQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0MCi0vKiBXZSB1c2Ugc3VidHJhY3Rpb24gb2YgKGNoYXIgKikgMCBpbnN0ZWFkIG9mIGNhc3RpbmcgdG8gaW50Ci0gICBiZWNhdXNlIG9uIHdvcmQtYWRkcmVzc2FibGUgbWFjaGluZXMgYSBzaW1wbGUgY2FzdCB0byBpbnQKLSAgIG1heSBpZ25vcmUgdGhlIGJ5dGUtd2l0aGluLXdvcmQgZmllbGQgb2YgdGhlIHBvaW50ZXIuICAqLwotCi0jaWZuZGVmIF9fUFRSX1RPX0lOVAotIyBkZWZpbmUgX19QVFJfVE9fSU5UKFApICgoUCkgLSAoY2hhciAqKSAwKQotI2VuZGlmCi0KLSNpZm5kZWYgX19JTlRfVE9fUFRSCi0jIGRlZmluZSBfX0lOVF9UT19QVFIoUCkgKChQKSArIChjaGFyICopIDApCi0jZW5kaWYKLQotLyogV2UgbmVlZCB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0aW5nIG9iamVjdC4gIElmIF9fUFRSRElGRl9UWVBFX18gaXMKLSAgIGRlZmluZWQsIGFzIHdpdGggR05VIEMsIHVzZSB0aGF0OyB0aGF0IHdheSB3ZSBkb24ndCBwb2xsdXRlIHRoZQotICAgbmFtZXNwYWNlIHdpdGggPHN0ZGRlZi5oPidzIHN5bWJvbHMuICBPdGhlcndpc2UsIGlmIDxzdGRkZWYuaD4gaXMKLSAgIGF2YWlsYWJsZSwgaW5jbHVkZSBpdCBhbmQgdXNlIHB0cmRpZmZfdC4gIEluIHRyYWRpdGlvbmFsIEMsIGxvbmcgaXMKLSAgIHRoZSBiZXN0IHRoYXQgd2UgY2FuIGRvLiAgKi8KLQotI2lmZGVmIF9fUFRSRElGRl9UWVBFX18KLSMgZGVmaW5lIFBUUl9JTlRfVFlQRSBfX1BUUkRJRkZfVFlQRV9fCi0jZWxzZQotIyBpZmRlZiBIQVZFX1NURERFRl9ICi0jICBpbmNsdWRlIDxzdGRkZWYuaD4KLSMgIGRlZmluZSBQVFJfSU5UX1RZUEUgcHRyZGlmZl90Ci0jIGVsc2UKLSMgIGRlZmluZSBQVFJfSU5UX1RZUEUgbG9uZwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJJTkdfSAotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgZGVmaW5lIF9vYnN0YWNrX21lbWNweShUbywgRnJvbSwgTikgbWVtY3B5ICgoVG8pLCAoRnJvbSksIChOKSkKLSNlbHNlCi0jIGlmZGVmIG1lbWNweQotIyAgZGVmaW5lIF9vYnN0YWNrX21lbWNweShUbywgRnJvbSwgTikgbWVtY3B5ICgoVG8pLCAoRnJvbSksIChOKSkKLSMgZWxzZQotIyAgZGVmaW5lIF9vYnN0YWNrX21lbWNweShUbywgRnJvbSwgTikgYmNvcHkgKChGcm9tKSwgKFRvKSwgKE4pKQotIyBlbmRpZgotI2VuZGlmCi0KLXN0cnVjdCBfb2JzdGFja19jaHVuawkJLyogTGl2ZXMgYXQgZnJvbnQgb2YgZWFjaCBjaHVuay4gKi8KLXsKLSAgY2hhciAgKmxpbWl0OwkJCS8qIDEgcGFzdCBlbmQgb2YgdGhpcyBjaHVuayAqLwotICBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKnByZXY7CS8qIGFkZHJlc3Mgb2YgcHJpb3IgY2h1bmsgb3IgTlVMTCAqLwotICBjaGFyCWNvbnRlbnRzWzRdOwkJLyogb2JqZWN0cyBiZWdpbiBoZXJlICovCi19OwotCi1zdHJ1Y3Qgb2JzdGFjawkJLyogY29udHJvbCBjdXJyZW50IG9iamVjdCBpbiBjdXJyZW50IGNodW5rICovCi17Ci0gIGxvbmcJY2h1bmtfc2l6ZTsJCS8qIHByZWZlcnJlZCBzaXplIHRvIGFsbG9jYXRlIGNodW5rcyBpbiAqLwotICBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmNodW5rOwkvKiBhZGRyZXNzIG9mIGN1cnJlbnQgc3RydWN0IG9ic3RhY2tfY2h1bmsgKi8KLSAgY2hhcgkqb2JqZWN0X2Jhc2U7CQkvKiBhZGRyZXNzIG9mIG9iamVjdCB3ZSBhcmUgYnVpbGRpbmcgKi8KLSAgY2hhcgkqbmV4dF9mcmVlOwkJLyogd2hlcmUgdG8gYWRkIG5leHQgY2hhciB0byBjdXJyZW50IG9iamVjdCAqLwotICBjaGFyCSpjaHVua19saW1pdDsJCS8qIGFkZHJlc3Mgb2YgY2hhciBhZnRlciBjdXJyZW50IGNodW5rICovCi0gIFBUUl9JTlRfVFlQRSB0ZW1wOwkJLyogVGVtcG9yYXJ5IGZvciBzb21lIG1hY3Jvcy4gICovCi0gIGludCAgIGFsaWdubWVudF9tYXNrOwkJLyogTWFzayBvZiBhbGlnbm1lbnQgZm9yIGVhY2ggb2JqZWN0LiAqLwotI2lmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLSAgLyogVGhlc2UgcHJvdG90eXBlcyB2YXJ5IGJhc2VkIG9uIGB1c2VfZXh0cmFfYXJnJywgYW5kIHdlIHVzZQotICAgICBjYXN0cyB0byB0aGUgcHJvdG90eXBlbGVzcyBmdW5jdGlvbiB0eXBlIGluIGFsbCBhc3NpZ25tZW50cywKLSAgICAgYnV0IGhhdmluZyBwcm90b3R5cGVzIGhlcmUgcXVpZXRzIC1Xc3RyaWN0LXByb3RvdHlwZXMuICAqLwotICBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKigqY2h1bmtmdW4pICh2b2lkICosIGxvbmcpOwotICB2b2lkICgqZnJlZWZ1bikgKHZvaWQgKiwgc3RydWN0IF9vYnN0YWNrX2NodW5rICopOwotICB2b2lkICpleHRyYV9hcmc7CQkvKiBmaXJzdCBhcmcgZm9yIGNodW5rIGFsbG9jL2RlYWxsb2MgZnVuY3MgKi8KLSNlbHNlCi0gIHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCpjaHVua2Z1bikgKCk7IC8qIFVzZXIncyBmY24gdG8gYWxsb2NhdGUgYSBjaHVuay4gICovCi0gIHZvaWQgKCpmcmVlZnVuKSAoKTsJCS8qIFVzZXIncyBmdW5jdGlvbiB0byBmcmVlIGEgY2h1bmsuICAqLwotICBjaGFyICpleHRyYV9hcmc7CQkvKiBmaXJzdCBhcmcgZm9yIGNodW5rIGFsbG9jL2RlYWxsb2MgZnVuY3MgKi8KLSNlbmRpZgotICB1bnNpZ25lZCB1c2VfZXh0cmFfYXJnOjE7CS8qIGNodW5rIGFsbG9jL2RlYWxsb2MgZnVuY3MgdGFrZSBleHRyYSBhcmcgKi8KLSAgdW5zaWduZWQgbWF5YmVfZW1wdHlfb2JqZWN0OjE7LyogVGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBjdXJyZW50Ci0JCQkJICAgY2h1bmsgY29udGFpbnMgYSB6ZXJvLWxlbmd0aCBvYmplY3QuICBUaGlzCi0JCQkJICAgcHJldmVudHMgZnJlZWluZyB0aGUgY2h1bmsgaWYgd2UgYWxsb2NhdGUKLQkJCQkgICBhIGJpZ2dlciBjaHVuayB0byByZXBsYWNlIGl0LiAqLwotICB1bnNpZ25lZCBhbGxvY19mYWlsZWQ6MTsJLyogTm8gbG9uZ2VyIHVzZWQsIGFzIHdlIG5vdyBjYWxsIHRoZSBmYWlsZWQKLQkJCQkgICBoYW5kbGVyIG9uIGVycm9yLCBidXQgcmV0YWluZWQgZm9yIGJpbmFyeQotCQkJCSAgIGNvbXBhdGliaWxpdHkuICAqLwotfTsKLQotLyogRGVjbGFyZSB0aGUgZXh0ZXJuYWwgZnVuY3Rpb25zIHdlIHVzZTsgdGhleSBhcmUgaW4gb2JzdGFjay5jLiAgKi8KLQotI2lmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLWV4dGVybiB2b2lkIF9vYnN0YWNrX25ld2NodW5rIChzdHJ1Y3Qgb2JzdGFjayAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgX29ic3RhY2tfZnJlZSAoc3RydWN0IG9ic3RhY2sgKiwgdm9pZCAqKTsKLWV4dGVybiBpbnQgX29ic3RhY2tfYmVnaW4gKHN0cnVjdCBvYnN0YWNrICosIGludCwgaW50LAotCQkJICAgIHZvaWQgKigqKSAobG9uZyksIHZvaWQgKCopICh2b2lkICopKTsKLWV4dGVybiBpbnQgX29ic3RhY2tfYmVnaW5fMSAoc3RydWN0IG9ic3RhY2sgKiwgaW50LCBpbnQsCi0JCQkgICAgIHZvaWQgKigqKSAodm9pZCAqLCBsb25nKSwKLQkJCSAgICAgdm9pZCAoKikgKHZvaWQgKiwgdm9pZCAqKSwgdm9pZCAqKTsKLWV4dGVybiBpbnQgX29ic3RhY2tfbWVtb3J5X3VzZWQgKHN0cnVjdCBvYnN0YWNrICopOwotI2Vsc2UKLWV4dGVybiB2b2lkIF9vYnN0YWNrX25ld2NodW5rICgpOwotZXh0ZXJuIHZvaWQgX29ic3RhY2tfZnJlZSAoKTsKLWV4dGVybiBpbnQgX29ic3RhY2tfYmVnaW4gKCk7Ci1leHRlcm4gaW50IF9vYnN0YWNrX2JlZ2luXzEgKCk7Ci1leHRlcm4gaW50IF9vYnN0YWNrX21lbW9yeV91c2VkICgpOwotI2VuZGlmCi0MCi0jaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotCi0vKiBEbyB0aGUgZnVuY3Rpb24tZGVjbGFyYXRpb25zIGFmdGVyIHRoZSBzdHJ1Y3RzCi0gICBidXQgYmVmb3JlIGRlZmluaW5nIHRoZSBtYWNyb3MuICAqLwotCi12b2lkIG9ic3RhY2tfaW5pdCAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2spOwotCi12b2lkICogb2JzdGFja19hbGxvYyAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGludCBzaXplKTsKLQotdm9pZCAqIG9ic3RhY2tfY29weSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmFkZHJlc3MsIGludCBzaXplKTsKLXZvaWQgKiBvYnN0YWNrX2NvcHkwIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgdm9pZCAqYWRkcmVzcywgaW50IHNpemUpOwotCi12b2lkIG9ic3RhY2tfZnJlZSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmJsb2NrKTsKLQotdm9pZCBvYnN0YWNrX2JsYW5rIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IHNpemUpOwotCi12b2lkIG9ic3RhY2tfZ3JvdyAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmRhdGEsIGludCBzaXplKTsKLXZvaWQgb2JzdGFja19ncm93MCAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmRhdGEsIGludCBzaXplKTsKLQotdm9pZCBvYnN0YWNrXzFncm93IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IGRhdGFfY2hhcik7Ci12b2lkIG9ic3RhY2tfcHRyX2dyb3cgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCB2b2lkICpkYXRhKTsKLXZvaWQgb2JzdGFja19pbnRfZ3JvdyAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGludCBkYXRhKTsKLQotdm9pZCAqIG9ic3RhY2tfZmluaXNoIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7Ci0KLWludCBvYnN0YWNrX29iamVjdF9zaXplIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7Ci0KLWludCBvYnN0YWNrX3Jvb20gKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLXZvaWQgb2JzdGFja19tYWtlX3Jvb20gKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBpbnQgc2l6ZSk7Ci12b2lkIG9ic3RhY2tfMWdyb3dfZmFzdCAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGludCBkYXRhX2NoYXIpOwotdm9pZCBvYnN0YWNrX3B0cl9ncm93X2Zhc3QgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCB2b2lkICpkYXRhKTsKLXZvaWQgb2JzdGFja19pbnRfZ3Jvd19mYXN0IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IGRhdGEpOwotdm9pZCBvYnN0YWNrX2JsYW5rX2Zhc3QgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBpbnQgc2l6ZSk7Ci0KLXZvaWQgKiBvYnN0YWNrX2Jhc2UgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLXZvaWQgKiBvYnN0YWNrX25leHRfZnJlZSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2spOwotaW50IG9ic3RhY2tfYWxpZ25tZW50X21hc2sgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLWludCBvYnN0YWNrX2NodW5rX3NpemUgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLWludCBvYnN0YWNrX21lbW9yeV91c2VkIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7Ci0KLSNlbmRpZiAvKiBfX1NURENfXyAqLwotCi0vKiBOb24tQU5TSSBDIGNhbm5vdCByZWFsbHkgc3VwcG9ydCBhbHRlcm5hdGl2ZSBmdW5jdGlvbnMgZm9yIHRoZXNlIG1hY3JvcywKLSAgIHNvIHdlIGRvIG5vdCBkZWNsYXJlIHRoZW0uICAqLwotCi0vKiBFcnJvciBoYW5kbGVyIGNhbGxlZCB3aGVuIGBvYnN0YWNrX2NodW5rX2FsbG9jJyBmYWlsZWQgdG8gYWxsb2NhdGUKLSAgIG1vcmUgbWVtb3J5LiAgVGhpcyBjYW4gYmUgc2V0IHRvIGEgdXNlciBkZWZpbmVkIGZ1bmN0aW9uLiAgVGhlCi0gICBkZWZhdWx0IGFjdGlvbiBpcyB0byBwcmludCBhIG1lc3NhZ2UgYW5kIGFib3J0LiAgKi8KLSNpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi1leHRlcm4gdm9pZCAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICh2b2lkKTsKLSNlbHNlCi1leHRlcm4gdm9pZCAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpOwotI2VuZGlmCi0KLS8qIEV4aXQgdmFsdWUgdXNlZCB3aGVuIGBwcmludF9hbmRfYWJvcnQnIGlzIHVzZWQuICAqLwotZXh0ZXJuIGludCBvYnN0YWNrX2V4aXRfZmFpbHVyZTsKLQwKLS8qIFBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIG9iamVjdCBiZWluZyBhbGxvY2F0ZWQgb3IgdG8gYmUgYWxsb2NhdGVkIG5leHQuCi0gICBOb3RlIHRoYXQgdGhpcyBtaWdodCBub3QgYmUgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlIG9iamVjdAotICAgYmVjYXVzZSBhIG5ldyBjaHVuayBtaWdodCBiZSBuZWVkZWQgdG8gaG9sZCB0aGUgZmluYWwgc2l6ZS4gICovCi0KLSNkZWZpbmUgb2JzdGFja19iYXNlKGgpICgoaCktPm9iamVjdF9iYXNlKQotCi0vKiBTaXplIGZvciBhbGxvY2F0aW5nIG9yZGluYXJ5IGNodW5rcy4gICovCi0KLSNkZWZpbmUgb2JzdGFja19jaHVua19zaXplKGgpICgoaCktPmNodW5rX3NpemUpCi0KLS8qIFBvaW50ZXIgdG8gbmV4dCBieXRlIG5vdCB5ZXQgYWxsb2NhdGVkIGluIGN1cnJlbnQgY2h1bmsuICAqLwotCi0jZGVmaW5lIG9ic3RhY2tfbmV4dF9mcmVlKGgpCSgoaCktPm5leHRfZnJlZSkKLQotLyogTWFzayBzcGVjaWZ5aW5nIGxvdyBiaXRzIHRoYXQgc2hvdWxkIGJlIGNsZWFyIGluIGFkZHJlc3Mgb2YgYW4gb2JqZWN0LiAgKi8KLQotI2RlZmluZSBvYnN0YWNrX2FsaWdubWVudF9tYXNrKGgpICgoaCktPmFsaWdubWVudF9tYXNrKQotCi0vKiBUbyBwcmV2ZW50IHByb3RvdHlwZSB3YXJuaW5ncyBwcm92aWRlIGNvbXBsZXRlIGFyZ3VtZW50IGxpc3QgaW4KLSAgIHN0YW5kYXJkIEMgdmVyc2lvbi4gICovCi0jaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotCi0jIGRlZmluZSBvYnN0YWNrX2luaXQoaCkgXAotICBfb2JzdGFja19iZWdpbiAoKGgpLCAwLCAwLCBcCi0JCSAgKHZvaWQgKigqKSAobG9uZykpIG9ic3RhY2tfY2h1bmtfYWxsb2MsICh2b2lkICgqKSAodm9pZCAqKSkgb2JzdGFja19jaHVua19mcmVlKQotCi0jIGRlZmluZSBvYnN0YWNrX2JlZ2luKGgsIHNpemUpIFwKLSAgX29ic3RhY2tfYmVnaW4gKChoKSwgKHNpemUpLCAwLCBcCi0JCSAgKHZvaWQgKigqKSAobG9uZykpIG9ic3RhY2tfY2h1bmtfYWxsb2MsICh2b2lkICgqKSAodm9pZCAqKSkgb2JzdGFja19jaHVua19mcmVlKQotCi0jIGRlZmluZSBvYnN0YWNrX3NwZWNpZnlfYWxsb2NhdGlvbihoLCBzaXplLCBhbGlnbm1lbnQsIGNodW5rZnVuLCBmcmVlZnVuKSBcCi0gIF9vYnN0YWNrX2JlZ2luICgoaCksIChzaXplKSwgKGFsaWdubWVudCksIFwKLQkJICAgICh2b2lkICooKikgKGxvbmcpKSAoY2h1bmtmdW4pLCAodm9pZCAoKikgKHZvaWQgKikpIChmcmVlZnVuKSkKLQotIyBkZWZpbmUgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb25fd2l0aF9hcmcoaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1biwgYXJnKSBcCi0gIF9vYnN0YWNrX2JlZ2luXzEgKChoKSwgKHNpemUpLCAoYWxpZ25tZW50KSwgXAotCQkgICAgKHZvaWQgKigqKSAodm9pZCAqLCBsb25nKSkgKGNodW5rZnVuKSwgXAotCQkgICAgKHZvaWQgKCopICh2b2lkICosIHZvaWQgKikpIChmcmVlZnVuKSwgKGFyZykpCi0KLSMgZGVmaW5lIG9ic3RhY2tfY2h1bmtmdW4oaCwgbmV3Y2h1bmtmdW4pIFwKLSAgKChoKSAtPiBjaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKigqKSh2b2lkICosIGxvbmcpKSAobmV3Y2h1bmtmdW4pKQotCi0jIGRlZmluZSBvYnN0YWNrX2ZyZWVmdW4oaCwgbmV3ZnJlZWZ1bikgXAotICAoKGgpIC0+IGZyZWVmdW4gPSAodm9pZCAoKikodm9pZCAqLCBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKikpIChuZXdmcmVlZnVuKSkKLQotI2Vsc2UKLQotIyBkZWZpbmUgb2JzdGFja19pbml0KGgpIFwKLSAgX29ic3RhY2tfYmVnaW4gKChoKSwgMCwgMCwgXAotCQkgICh2b2lkICooKikgKCkpIG9ic3RhY2tfY2h1bmtfYWxsb2MsICh2b2lkICgqKSAoKSkgb2JzdGFja19jaHVua19mcmVlKQotCi0jIGRlZmluZSBvYnN0YWNrX2JlZ2luKGgsIHNpemUpIFwKLSAgX29ic3RhY2tfYmVnaW4gKChoKSwgKHNpemUpLCAwLCBcCi0JCSAgKHZvaWQgKigqKSAoKSkgb2JzdGFja19jaHVua19hbGxvYywgKHZvaWQgKCopICgpKSBvYnN0YWNrX2NodW5rX2ZyZWUpCi0KLSMgZGVmaW5lIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uKGgsIHNpemUsIGFsaWdubWVudCwgY2h1bmtmdW4sIGZyZWVmdW4pIFwKLSAgX29ic3RhY2tfYmVnaW4gKChoKSwgKHNpemUpLCAoYWxpZ25tZW50KSwgXAotCQkgICAgKHZvaWQgKigqKSAoKSkgKGNodW5rZnVuKSwgKHZvaWQgKCopICgpKSAoZnJlZWZ1bikpCi0KLSMgZGVmaW5lIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uX3dpdGhfYXJnKGgsIHNpemUsIGFsaWdubWVudCwgY2h1bmtmdW4sIGZyZWVmdW4sIGFyZykgXAotICBfb2JzdGFja19iZWdpbl8xICgoaCksIChzaXplKSwgKGFsaWdubWVudCksIFwKLQkJICAgICh2b2lkICooKikgKCkpIChjaHVua2Z1biksICh2b2lkICgqKSAoKSkgKGZyZWVmdW4pLCAoYXJnKSkKLQotIyBkZWZpbmUgb2JzdGFja19jaHVua2Z1bihoLCBuZXdjaHVua2Z1bikgXAotICAoKGgpIC0+IGNodW5rZnVuID0gKHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCopKCkpIChuZXdjaHVua2Z1bikpCi0KLSMgZGVmaW5lIG9ic3RhY2tfZnJlZWZ1bihoLCBuZXdmcmVlZnVuKSBcCi0gICgoaCkgLT4gZnJlZWZ1biA9ICh2b2lkICgqKSgpKSAobmV3ZnJlZWZ1bikpCi0KLSNlbmRpZgotCi0jZGVmaW5lIG9ic3RhY2tfMWdyb3dfZmFzdChoLGFjaGFyKSAoKigoaCktPm5leHRfZnJlZSkrKyA9IGFjaGFyKQotCi0jZGVmaW5lIG9ic3RhY2tfYmxhbmtfZmFzdChoLG4pICgoaCktPm5leHRfZnJlZSArPSAobikpCi0KLSNkZWZpbmUgb2JzdGFja19tZW1vcnlfdXNlZChoKSBfb2JzdGFja19tZW1vcnlfdXNlZCAoaCkKLQwKLSNpZiBkZWZpbmVkIF9fR05VQ19fICYmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLS8qIE5leHRTdGVwIDIuMCBjYyBpcyByZWFsbHkgZ2NjIDEuOTMgYnV0IGl0IGRlZmluZXMgX19HTlVDX18gPSAyIGFuZAotICAgZG9lcyBub3QgaW1wbGVtZW50IF9fZXh0ZW5zaW9uX18uICBCdXQgdGhhdCBjb21waWxlciBkb2Vzbid0IGRlZmluZQotICAgX19HTlVDX01JTk9SX18uICAqLwotIyBpZiBfX0dOVUNfXyA8IDIgfHwgKF9fTmVYVF9fICYmICFfX0dOVUNfTUlOT1JfXykKLSMgIGRlZmluZSBfX2V4dGVuc2lvbl9fCi0jIGVuZGlmCi0KLS8qIEZvciBHTlUgQywgaWYgbm90IC10cmFkaXRpb25hbCwKLSAgIHdlIGNhbiBkZWZpbmUgdGhlc2UgbWFjcm9zIHRvIGNvbXB1dGUgYWxsIGFyZ3Mgb25seSBvbmNlCi0gICB3aXRob3V0IHVzaW5nIGEgZ2xvYmFsIHZhcmlhYmxlLgotICAgQWxzbywgd2UgY2FuIGF2b2lkIHVzaW5nIHRoZSBgdGVtcCcgc2xvdCwgdG8gbWFrZSBmYXN0ZXIgY29kZS4gICovCi0KLSMgZGVmaW5lIG9ic3RhY2tfb2JqZWN0X3NpemUoT0JTVEFDSykJCQkJCVwKLSAgX19leHRlbnNpb25fXwkJCQkJCQkJXAotICAoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAotICAgICAodW5zaWduZWQpIChfX28tPm5leHRfZnJlZSAtIF9fby0+b2JqZWN0X2Jhc2UpOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX3Jvb20oT0JTVEFDSykJCQkJCQlcCi0gIF9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSAgKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgICAgKHVuc2lnbmVkKSAoX19vLT5jaHVua19saW1pdCAtIF9fby0+bmV4dF9mcmVlKTsgfSkKLQotIyBkZWZpbmUgb2JzdGFja19tYWtlX3Jvb20oT0JTVEFDSyxsZW5ndGgpCQkJCVwKLV9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCi0gICBpbnQgX19sZW4gPSAobGVuZ3RoKTsJCQkJCQlcCi0gICBpZiAoX19vLT5jaHVua19saW1pdCAtIF9fby0+bmV4dF9mcmVlIDwgX19sZW4pCQkJXAotICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBfX2xlbik7CQkJCQlcCi0gICAodm9pZCkgMDsgfSkKLQotIyBkZWZpbmUgb2JzdGFja19lbXB0eV9wKE9CU1RBQ0spCQkJCQlcCi0gIF9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSAgKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgICAgKF9fby0+Y2h1bmstPnByZXYgPT0gMCAmJiBfX28tPm5leHRfZnJlZSAtIF9fby0+Y2h1bmstPmNvbnRlbnRzID09IDApOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX2dyb3coT0JTVEFDSyx3aGVyZSxsZW5ndGgpCQkJCVwKLV9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCi0gICBpbnQgX19sZW4gPSAobGVuZ3RoKTsJCQkJCQlcCi0gICBpZiAoX19vLT5uZXh0X2ZyZWUgKyBfX2xlbiA+IF9fby0+Y2h1bmtfbGltaXQpCQkJXAotICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBfX2xlbik7CQkJCQlcCi0gICBfb2JzdGFja19tZW1jcHkgKF9fby0+bmV4dF9mcmVlLCAoY2hhciAqKSAod2hlcmUpLCBfX2xlbik7CQlcCi0gICBfX28tPm5leHRfZnJlZSArPSBfX2xlbjsJCQkJCQlcCi0gICAodm9pZCkgMDsgfSkKLQotIyBkZWZpbmUgb2JzdGFja19ncm93MChPQlNUQUNLLHdoZXJlLGxlbmd0aCkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIGludCBfX2xlbiA9IChsZW5ndGgpOwkJCQkJCVwKLSAgIGlmIChfX28tPm5leHRfZnJlZSArIF9fbGVuICsgMSA+IF9fby0+Y2h1bmtfbGltaXQpCQkJXAotICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBfX2xlbiArIDEpOwkJCQlcCi0gICBfb2JzdGFja19tZW1jcHkgKF9fby0+bmV4dF9mcmVlLCAoY2hhciAqKSAod2hlcmUpLCBfX2xlbik7CQlcCi0gICBfX28tPm5leHRfZnJlZSArPSBfX2xlbjsJCQkJCQlcCi0gICAqKF9fby0+bmV4dF9mcmVlKSsrID0gMDsJCQkJCQlcCi0gICAodm9pZCkgMDsgfSkKLQotIyBkZWZpbmUgb2JzdGFja18xZ3JvdyhPQlNUQUNLLGRhdHVtKQkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIGlmIChfX28tPm5leHRfZnJlZSArIDEgPiBfX28tPmNodW5rX2xpbWl0KQkJCQlcCi0gICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIDEpOwkJCQkJXAotICAgKihfX28tPm5leHRfZnJlZSkrKyA9IChkYXR1bSk7CQkJCQlcCi0gICAodm9pZCkgMDsgfSkKLQotLyogVGhlc2UgYXNzdW1lIHRoYXQgdGhlIG9ic3RhY2sgYWxpZ25tZW50IGlzIGdvb2QgZW5vdWdoIGZvciBwb2ludGVycyBvciBpbnRzLAotICAgYW5kIHRoYXQgdGhlIGRhdGEgYWRkZWQgc28gZmFyIHRvIHRoZSBjdXJyZW50IG9iamVjdAotICAgc2hhcmVzIHRoYXQgbXVjaCBhbGlnbm1lbnQuICAqLwotCi0jIGRlZmluZSBvYnN0YWNrX3B0cl9ncm93KE9CU1RBQ0ssZGF0dW0pCQkJCVwKLV9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCi0gICBpZiAoX19vLT5uZXh0X2ZyZWUgKyBzaXplb2YgKHZvaWQgKikgPiBfX28tPmNodW5rX2xpbWl0KQkJXAotICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBzaXplb2YgKHZvaWQgKikpOwkJCQlcCi0gICAqKCh2b2lkICoqKV9fby0+bmV4dF9mcmVlKSsrID0gKCh2b2lkICopZGF0dW0pOwkJCVwKLSAgICh2b2lkKSAwOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX2ludF9ncm93KE9CU1RBQ0ssZGF0dW0pCQkJCVwKLV9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCi0gICBpZiAoX19vLT5uZXh0X2ZyZWUgKyBzaXplb2YgKGludCkgPiBfX28tPmNodW5rX2xpbWl0KQkJXAotICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBzaXplb2YgKGludCkpOwkJCQlcCi0gICAqKChpbnQgKilfX28tPm5leHRfZnJlZSkrKyA9ICgoaW50KWRhdHVtKTsJCQkJXAotICAgKHZvaWQpIDA7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3dfZmFzdChoLGFwdHIpICgqKCh2b2lkICoqKSAoaCktPm5leHRfZnJlZSkrKyA9ICh2b2lkICopYXB0cikKLSMgZGVmaW5lIG9ic3RhY2tfaW50X2dyb3dfZmFzdChoLGFpbnQpICgqKChpbnQgKikgKGgpLT5uZXh0X2ZyZWUpKysgPSAoaW50KSBhaW50KQotCi0jIGRlZmluZSBvYnN0YWNrX2JsYW5rKE9CU1RBQ0ssbGVuZ3RoKQkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIGludCBfX2xlbiA9IChsZW5ndGgpOwkJCQkJCVwKLSAgIGlmIChfX28tPmNodW5rX2xpbWl0IC0gX19vLT5uZXh0X2ZyZWUgPCBfX2xlbikJCQlcCi0gICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIF9fbGVuKTsJCQkJCVwKLSAgIF9fby0+bmV4dF9mcmVlICs9IF9fbGVuOwkJCQkJCVwKLSAgICh2b2lkKSAwOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX2FsbG9jKE9CU1RBQ0ssbGVuZ3RoKQkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9faCA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIG9ic3RhY2tfYmxhbmsgKF9faCwgKGxlbmd0aCkpOwkJCQkJXAotICAgb2JzdGFja19maW5pc2ggKF9faCk7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfY29weShPQlNUQUNLLHdoZXJlLGxlbmd0aCkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9faCA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIG9ic3RhY2tfZ3JvdyAoX19oLCAod2hlcmUpLCAobGVuZ3RoKSk7CQkJCVwKLSAgIG9ic3RhY2tfZmluaXNoIChfX2gpOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX2NvcHkwKE9CU1RBQ0ssd2hlcmUsbGVuZ3RoKQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19oID0gKE9CU1RBQ0spOwkJCQkJXAotICAgb2JzdGFja19ncm93MCAoX19oLCAod2hlcmUpLCAobGVuZ3RoKSk7CQkJCVwKLSAgIG9ic3RhY2tfZmluaXNoIChfX2gpOyB9KQotCi0vKiBUaGUgbG9jYWwgdmFyaWFibGUgaXMgbmFtZWQgX19vMSB0byBhdm9pZCBhIG5hbWUgY29uZmxpY3QKLSAgIHdoZW4gb2JzdGFja19ibGFuayBpcyBjYWxsZWQuICAqLwotIyBkZWZpbmUgb2JzdGFja19maW5pc2goT0JTVEFDSykgIAkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbzEgPSAoT0JTVEFDSyk7CQkJCQlcCi0gICB2b2lkICp2YWx1ZTsJCQkJCQkJCVwKLSAgIHZhbHVlID0gKHZvaWQgKikgX19vMS0+b2JqZWN0X2Jhc2U7CQkJCQlcCi0gICBpZiAoX19vMS0+bmV4dF9mcmVlID09IHZhbHVlKQkJCQkJXAotICAgICBfX28xLT5tYXliZV9lbXB0eV9vYmplY3QgPSAxOwkJCQkJXAotICAgX19vMS0+bmV4dF9mcmVlCQkJCQkJCVwKLSAgICAgPSBfX0lOVF9UT19QVFIgKChfX1BUUl9UT19JTlQgKF9fbzEtPm5leHRfZnJlZSkrX19vMS0+YWxpZ25tZW50X21hc2spXAotCQkgICAgICYgfiAoX19vMS0+YWxpZ25tZW50X21hc2spKTsJCQlcCi0gICBpZiAoX19vMS0+bmV4dF9mcmVlIC0gKGNoYXIgKilfX28xLT5jaHVuawkJCQlcCi0gICAgICAgPiBfX28xLT5jaHVua19saW1pdCAtIChjaGFyICopX19vMS0+Y2h1bmspCQkJXAotICAgICBfX28xLT5uZXh0X2ZyZWUgPSBfX28xLT5jaHVua19saW1pdDsJCQkJXAotICAgX19vMS0+b2JqZWN0X2Jhc2UgPSBfX28xLT5uZXh0X2ZyZWU7CQkJCQlcCi0gICB2YWx1ZTsgfSkKLQotIyBkZWZpbmUgb2JzdGFja19mcmVlKE9CU1RBQ0ssIE9CSikJCQkJCVwKLV9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCi0gICB2b2lkICpfX29iaiA9IChPQkopOwkJCQkJCQlcCi0gICBpZiAoX19vYmogPiAodm9pZCAqKV9fby0+Y2h1bmsgJiYgX19vYmogPCAodm9pZCAqKV9fby0+Y2h1bmtfbGltaXQpICBcCi0gICAgIF9fby0+bmV4dF9mcmVlID0gX19vLT5vYmplY3RfYmFzZSA9IF9fb2JqOwkJCQlcCi0gICBlbHNlIChvYnN0YWNrX2ZyZWUpIChfX28sIF9fb2JqKTsgfSkKLQwKLSNlbHNlIC8qIG5vdCBfX0dOVUNfXyBvciBub3QgX19TVERDX18gKi8KLQotIyBkZWZpbmUgb2JzdGFja19vYmplY3Rfc2l6ZShoKSBcCi0gKHVuc2lnbmVkKSAoKGgpLT5uZXh0X2ZyZWUgLSAoaCktPm9iamVjdF9iYXNlKQotCi0jIGRlZmluZSBvYnN0YWNrX3Jvb20oaCkJCVwKLSAodW5zaWduZWQpICgoaCktPmNodW5rX2xpbWl0IC0gKGgpLT5uZXh0X2ZyZWUpCi0KLSMgZGVmaW5lIG9ic3RhY2tfZW1wdHlfcChoKSBcCi0gKChoKS0+Y2h1bmstPnByZXYgPT0gMCAmJiAoaCktPm5leHRfZnJlZSAtIChoKS0+Y2h1bmstPmNvbnRlbnRzID09IDApCi0KLS8qIE5vdGUgdGhhdCB0aGUgY2FsbCB0byBfb2JzdGFja19uZXdjaHVuayBpcyBlbmNsb3NlZCBpbiAoLi4uLCAwKQotICAgc28gdGhhdCB3ZSBjYW4gYXZvaWQgaGF2aW5nIHZvaWQgZXhwcmVzc2lvbnMKLSAgIGluIHRoZSBhcm1zIG9mIHRoZSBjb25kaXRpb25hbCBleHByZXNzaW9uLgotICAgQ2FzdGluZyB0aGUgdGhpcmQgb3BlcmFuZCB0byB2b2lkIHdhcyB0cmllZCBiZWZvcmUsCi0gICBidXQgc29tZSBjb21waWxlcnMgd29uJ3QgYWNjZXB0IGl0LiAgKi8KLQotIyBkZWZpbmUgb2JzdGFja19tYWtlX3Jvb20oaCxsZW5ndGgpCQkJCQlcCi0oIChoKS0+dGVtcCA9IChsZW5ndGgpLAkJCQkJCQlcCi0gICgoKGgpLT5uZXh0X2ZyZWUgKyAoaCktPnRlbXAgPiAoaCktPmNodW5rX2xpbWl0KQkJCVwKLSAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIChoKS0+dGVtcCksIDApIDogMCkpCi0KLSMgZGVmaW5lIG9ic3RhY2tfZ3JvdyhoLHdoZXJlLGxlbmd0aCkJCQkJCVwKLSggKGgpLT50ZW1wID0gKGxlbmd0aCksCQkJCQkJCVwKLSAgKCgoaCktPm5leHRfZnJlZSArIChoKS0+dGVtcCA+IChoKS0+Y2h1bmtfbGltaXQpCQkJXAotICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgKGgpLT50ZW1wKSwgMCkgOiAwKSwJCQlcCi0gIF9vYnN0YWNrX21lbWNweSAoKGgpLT5uZXh0X2ZyZWUsIChjaGFyICopICh3aGVyZSksIChoKS0+dGVtcCksCVwKLSAgKGgpLT5uZXh0X2ZyZWUgKz0gKGgpLT50ZW1wKQotCi0jIGRlZmluZSBvYnN0YWNrX2dyb3cwKGgsd2hlcmUsbGVuZ3RoKQkJCQkJXAotKCAoaCktPnRlbXAgPSAobGVuZ3RoKSwJCQkJCQkJXAotICAoKChoKS0+bmV4dF9mcmVlICsgKGgpLT50ZW1wICsgMSA+IChoKS0+Y2h1bmtfbGltaXQpCQkJXAotICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgKGgpLT50ZW1wICsgMSksIDApIDogMCksCQkJXAotICBfb2JzdGFja19tZW1jcHkgKChoKS0+bmV4dF9mcmVlLCAoY2hhciAqKSAod2hlcmUpLCAoaCktPnRlbXApLAlcCi0gIChoKS0+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+bmV4dF9mcmVlID0gKGgpLT5vYmplY3RfYmFzZQkJCQlcCi0JICAgID0gKGgpLT50ZW1wICsgKGNoYXIgKikgKGgpLT5jaHVuaykJCQkJXAotICAgOiAoX29ic3RhY2tfZnJlZSAoKGgpLCAoaCktPnRlbXAgKyAoY2hhciAqKSAoaCktPmNodW5rKSwgMCkpKQotIyBlbmRpZgotCi0jZW5kaWYgLyogbm90IF9fR05VQ19fIG9yIG5vdCBfX1NURENfXyAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0JLyogQysrICovCi0jZW5kaWYKLQotI2VuZGlmIC8qIG9ic3RhY2suaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvQ2hhbmdlTG9nIGIvaW5jbHVkZS9vcGNvZGUvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODI3YmEwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDE4ODggKzAsMCBAQAotMTk5OS0wNS0xMiAgQWxhbiBNb2RyYSAgPGFsYW5AYXByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKFJldmVyc2VNb2RybSk6IFJlbW92ZSBhbGwgb2NjdXJlbmNlcy4KLQkoSW52TWVtKTogQWRkIHRvIGNvbnRyb2wvZGVidWcvdGVzdCBtb3YgaW5zbnMsIG1vdmhscHMsIG1vdmxocHMsCi0JbW92bXNrcHMsIHBleHRydywgcG1vdm1za2IsIG1hc2ttb3ZxLgotCUNoYW5nZSBOb1N1ZiB0byBGUCBvbiBhbGwgTU1YLCBYTU0gYW5kIEFNRCBpbnNucyBhcyB0aGVzZSBhbGwKLQlpZ25vcmUgdGhlIGRhdGEgc2l6ZSBwcmVmaXguCi0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYiwgaTM4Nl9yZWd0YWIpOiBBZGQgc3VwcG9ydCBmb3IgUElJSSBTSU1ELgotCU1vc3RseSBzdG9sZW4gZnJvbSBEb3VnIExlZGZvcmQgPGRsZWRmb3JkQHJlZGhhdC5jb20+Ci0KLVNhdCBNYXkgIDggMjM6Mjc6MzUgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogcHBjLmggKFBQQ19PUENPREVfNjRfQlJJREdFKTogTmV3LgotCi0xOTk5LTA0LTE0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9BVFRSKTogRGVsZXRlIG1lbWJlciBudW1fbm9uYm9vbHMuCi0JKENHRU5fQVRUUl9UWVBFKTogVXBkYXRlLgotCShDR0VOX0FUVFJfTUFTSyk6IE51bWJlciBib29sZWFucyBzdGFydGluZyBhdCAwLgotCShDR0VOX0FUVFJfVkFMVUUpOiBVcGRhdGUuCi0JKENHRU5fSU5TTl9BVFRSKTogVXBkYXRlLgotCi1Nb24gQXByIDEyIDIzOjQzOjI3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChmbXB5ZmFkZCwgZm1weW5mYWRkLCBmbmVnLCBmbmVnYWJzKTogTmV3IFBBMi4wCi0JaW5zdHJ1Y3Rpb25zLgotCi1UdWUgTWFyIDIzIDExOjI0OjM4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChiYiwgYnZiKTogVHdlYWsgb3Bjb2RlL21hc2suCi0KLQotMTk5OS0wMy0yMiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fSVNBLENHRU5fTUFDSCk6IE5ldyB0eXBlZGVmcy4KLQkoc3RydWN0IGNnZW5fY3B1X2Rlc2MpOiBSZW5hbWUgbWVtYmVyIG1hY2ggdG8gbWFjaHMuICBOZXcgbWVtYmVyIGlzYXMuCi0JTmV3IG1lbWJlcnMgd29yZF9iaXRzaXplLGRlZmF1bHRfaW5zbl9iaXRzaXplLGJhc2VfaW5zbi1iaXRzaXplLAotCW1pbl9pbnNuX2JpdHNpemUsbWF4X2luc25fYml0c2l6ZSxpc2FfdGFibGUsbWFjaF90YWJsZSxyZWJ1aWxkX3RhYmxlcy4KLQlEZWxldGUgbWVtYmVyIG1heF9pbnNuX3NpemUuCi0JKGVudW0gY2dlbl9jcHVfb3Blbl9hcmcpOiBOZXcgZW51bS4KLQkoY3B1X29wZW4pOiBVcGRhdGUgcHJvdG90eXBlLgotCShjcHVfb3Blbl8xKTogRGVjbGFyZS4KLQkoY2dlbl9zZXRfY3B1KTogRGVsZXRlLgotCi0xOTk5LTAzLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9IV19UQUJMRSk6IERlbGV0ZSBgbnVtX2luaXRfZW50cmllcycgbWVtYmVyLgotCShDR0VOX09QRVJBTkRfTklMKTogTmV3IG1hY3JvLgotCShDR0VOX09QRVJBTkQpOiBOZXcgbWVtYmVyIGB0eXBlJy4KLQkoQGFyY2hAX2NnZW5fb3BlcmFuZF90YWJsZSk6IERlbGV0ZSBkZWNsLgotCShDR0VOX09QRVJBTkRfSU5ERVgsQ0dFTl9PUEVSQU5EX1RZUEUsQ0dFTl9PUEVSQU5EX0VOVFJZKTogRGVsZXRlLgotCShDR0VOX09QRVJBTkRfVEFCTEUpOiBOZXcgc3RydWN0LgotCShjZ2VuX29wZXJhbmRfbG9va3VwX2J5X25hbWUsY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9udW0pOiBEZWNsYXJlLgotCShDR0VOX09QSU5TVCk6IFBvaW50ZXIgdG8gb3BlcmFuZCB0YWJsZSBlbnRyeSByZXBsYWNlZCB3aXRoIGVudW0uCi0JKENHRU5fQ1BVX1RBQkxFKTogTmV3IG1lbWJlciBgaXNhJy4gIENoYW5nZSBtZW1iZXIgYG9wZXJhbmRfdGFibGUnLAotCW5vdyBhIENHRU5fT1BFUkFORF9UQUJMRS4gIEFkZCBDR0VOX0NQVV9ERVNDIGFyZyB0bwotCXtnZXQsc2V0fV97aW50LHZtYX1fb3BlcmFuZC4KLQkoQGFyY2hAX2NnZW5fY3B1X29wZW4pOiBOZXcgYXJnIGBpc2EnLgotCShjZ2VuX3NldF9jcHUpOiBEaXR0by4KLQotRnJpIEZlYiAyNiAwMjozNjo0NSAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IEZpbGwgaW4gY21vdiBhbmQgZmNtb3YgYWx0ZXJuYXRlcy4gIEFkZCBmY29taSBzaG9ydCBmb3Jtcy4KLQotMTk5OS0wMi0yNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGVudW0gY2dlbl9hc21fdHlwZSk6IEFkZCBDR0VOX0FTTV9OT05FLgotCShDR0VOX0hXX0VOVFJZKTogRGVsZXRlIG1lbWJlciBgbmV4dCcuICBDaGFuZ2UgdHlwZSBvZiBgdHlwZScgdG8KLQllbnVtIGNnZW5faHdfdHlwZS4KLQkoQ0dFTl9IV19UQUJMRSk6IE5ldyBzdHJ1Y3QuCi0JKGh3X3RhYmxlKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCShDR0VOX09QRVJBTkQpOiBDaGFuZ2UgbWVtYmVyIGh3IHRvIGh3X3R5cGUsIGNoYW5nZSB0eXBlIGZyb20gcG9pbnRlcgotCXRvIHRhYmxlIGVudHJ5IHRvIGVudW0uCi0JKENHRU5fT1BJTlNUKTogRGl0dG8uCi0JKENHRU5fQ1BVX1RBQkxFKTogQ2hhbmdlIG1lbWJlciBod19saXN0IHRvIGh3X3RhYmxlLgotCi1TYXQgRmViIDEzIDE0OjEzOjQ0IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLmggKEFYUF9PUENPREVfRVY2KTogTmV3LgotCShBWFBfT1BDT0RFX05PUEFMKTogSW5jbHVkZSBpdC4KLQotMTk5OS0wMi0wOSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fQ1BVX0RFU0MpOiBSZW5hbWVkIGZyb20gQ0dFTl9PUENPREVfREVTQy4KLQlBbGwgdXNlcyB1cGRhdGVkLiAgTmV3IG1lbWJlcnMgaW50X2luc25fcCwgbWF4X2luc25fc2l6ZSwKLQlwYXJzZV9vcGVyYW5kLGluc2VydF9vcGVyYW5kLGV4dHJhY3Rfb3BlcmFuZCxwcmludF9vcGVyYW5kLAotCXNpemVvZl9maWVsZHMsc2V0X2ZpZWxkc19iaXRzaXplLGdldF9pbnRfb3BlcmFuZCxzZXRfaW50X29wZXJhbmQsCi0JZ2V0X3ZtYV9vcGVyYW5kLHNldF92bWFfb3BlcmFuZCxwYXJzZV9oYW5kbGVycyxpbnNlcnRfaGFuZGxlcnMsCi0JZXh0cmFjdF9oYW5kbGVycyxwcmludF9oYW5kbGVycy4KLQkoQ0dFTl9BVFRSKTogQ2hhbmdlIHR5cGUgb2YgbnVtX25vbmJvb2xzIHRvIHVuc2lnbmVkIGludC4KLQkoQ0dFTl9BVFRSX0JPT0xfT0ZGU0VUKTogTmV3IG1hY3JvLgotCShDR0VOX0FUVFJfTUFTSyk6IFN1YnRyYWN0IGl0IHRvIGNvbXB1dGUgYml0IG51bWJlci4KLQkoQ0dFTl9BVFRSX1ZBTFVFKTogUmVkbyBib29sL25vbmJvb2wgYXR0ciBjYWxjdWxhdGlvbi4KLQkoY2dlbl9vcGNvZGVfaGFuZGxlcik6IFJlbmFtZWQgZnJvbSBjZ2VuX2Jhc2UuCi0JKENHRU5fSFdfQVRUUl9WQUxVRSk6IFJlbmFtZWQgZnJvbSBDR0VOX0hXX0FUVFIsIGFsbCB1c2VzIHVwZGF0ZWQuCi0JKENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFKTogUmVuYW1lZCBmcm9tIENHRU5fT1BFUkFORF9BVFRSLAotCWFsbCB1c2VzIHVwZGF0ZWQuCi0JKENHRU5fT1BFUkFORF9JTkRFWCk6IFJld3JpdGUgdG8gdXNlIHRhYmxlIGVudHJ5LCBub3QgZ2xvYmFsLgotCShlbnVtIGNnZW5fb3BpbnN0X3R5cGUpOiBSZW5hbWVkIGZyb20gY2dlbl9vcGVyYW5kX2luc3RhbmNlX3R5cGUuCi0JKENHRU5fSUZMRF9BVFRSX1ZBTFVFKTogUmVuYW1lZCBmcm9tIENHRU5fSUZMRF9BVFRSLCBhbGwgdXNlcyB1cGRhdGVkLgotCShDR0VOX09QQ09ERSxDR0VOX0lCQVNFKTogTmV3IHR5cGVzLgotCShDR0VOX0lOU04pOiBSZXdyaXRlLgotCShDR0VOX3tBU00sRElTfV9IQVNIKik6IERlbGV0ZS4KLQkoaW5pdF9vcGNvZGVfdGFibGUsaW5pdF9pYmxkX3RhYmxlKTogRGVjbGFyZS4KLQkoQ0dFTl9JTlNOX0FUVFIpOiBOZXcgdHlwZS4KLQotTW9uIEZlYiAgMSAyMTowOToxNCAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBpMzg2LmggKGRfU3VmLCB4X1N1Ziwgc2xkX1N1Ziwgc2xkeF9TdWYsIGJ3bGRfU3VmKTogIERlZmluZS4KLSAgICAgICAgKHhfRlAsIGRfRlAsIGRsc19GUCwgc2xkeF9GUCk6ICBEZWZpbmUuCi0gICAgICAgIENoYW5nZSAqU3VmIGRlZmluaXRpb25zIHRvIGluY2x1ZGUgeCBhbmQgZCBzdWZmaXhlcy4KLSAgICAgICAgKG1vdnN4KTogIFVzZSB3X1N1ZiBhbmQgYl9TdWYuCi0gICAgICAgIChtb3Z6eCk6ICBMaWtld2lzZS4KLSAgICAgICAgKG1vdnMpOiAgVXNlIGJ3bGRfU3VmLgotICAgICAgICAoZmxkKTogIENoYW5nZSBvcmRlcmluZy4gIFVzZSBzbGRfRlAuCi0gICAgICAgIChmaWxkKTogIEFkZCBJbnRlbCBTeW50YXggZXF1aXZhbGVudCBvZiBmaWxkcS4KLSAgICAgICAgKGZzdCk6ICBVc2Ugc2xkX0ZQLgotICAgICAgICAoZmlzdCk6ICBVc2Ugc2xkX0ZQLgotICAgICAgICAoZnN0cCk6ICBVc2Ugc2xkX0ZQLiAgQWRkIHhfRlAgdmVyc2lvbi4KLSAgICAgICAgKGZpc3RwKTogIExMb25nTWVtIHZlcnNpb24gZm9yIEludGVsIFN5bnRheC4KLSAgICAgICAgKGZjb20sIGZjb21wKTogIFVzZSBzbGRfRlAuCi0gICAgICAgIChmYWRkLCBmaWFkZCwgZnN1Yik6ICBVc2Ugc2xkX0ZQLgotICAgICAgICAoZnN1YnIpOiAgVXNlIHNsZF9GUC4KLSAgICAgICAgKGZtdWwsIGZpbXVsLCBmZHZpLCBmaWRpdiwgZmRpdnIpOiAgVXNlIHNsZF9GUC4KLQotMTk5OS0wMS0yNyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGVudW0gY2dlbl9tb2RlKTogQWRkIENHRU5fTU9ERV9UQVJHRVRfTUFYLCBDR0VOX01PREVfSU5ULAotCUNHRU5fTU9ERV9VSU5ULgotCi1TYXQgSmFuIDE2IDAxOjI5OjI1IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChidik6IEZpeCBtYXNrLgotCi0xOTk5LTAxLTA1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9BVFRSX1ZBTFVFX1RZUEUpOiBOZXcgdHlwZWRlZi4KLQkoQ0dFTl9BVFRSKTogVXNlIGl0LgotCShDR0VOX0FUVFJfVFlQRSxDR0VOX0FUVFJfRU5UUlkpOiBEaXR0by4KLQkoQ0dFTl9BVFRSX1RBQkxFKTogTmV3IG1lbWJlciBkZmF1bHQuCi0KLTE5OTgtMTItMzAgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKE1JUFMxNl9JTlNOX0JSQU5DSCk6IE5ldy4KLQotV2VkIERlYyAgOSAxMDozODo0OCAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KLQotCVRoZSBmb2xsb3dpbmcgaXMgcGFydCBvZiBhIGNoYW5nZSBtYWRlIGJ5IEVkaXRoIEVwc3RlaW4KLSAJPGVlcHN0ZWluQHNvcGhpYS5jeWdudXMuY29tPiBhcyBwYXJ0IG9mIGEgcHJvamVjdCB0byBtZXJnZSBpbgotIAljaGFuZ2VzIGJ5IEhQOyBIUCBkaWQgbm90IGNyZWF0ZSBDaGFuZ2VMb2cgZW50cmllcy4KLQotCSogaHBwYS5oIChjb21wbGV0ZXJfY2hhcnMpOiBsaXN0IG9mIGNoYXJzIHRvIG5vdCBwdXQgYSBzcGFjZQotIAlhZnRlci4KLQotU3VuIERlYyAgNiAxMzoyMTozNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IFBlcm1pdCB3IHN1ZmZpeCBvbiBwcm9jZXNzb3IgY29udHJvbCBhbmQKLSAJc3RhdHVzIHdvcmQgaW5zdHJ1Y3Rpb25zLgotCi0xOTk4LTExLTMwICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoc3RydWN0IGNnZW5faHdfZW50cnkpOiBEZWxldGUgY29uc3Qgb24gYXR0cnMgbWVtYmVyLgotCShzdHJ1Y3QgY2dlbl9rZXl3b3JkX2VudHJ5KTogRGl0dG8uCi0JKHN0cnVjdCBjZ2VuX29wZXJhbmQpOiBEaXR0by4KLQkoQ0dFTl9JRkxEKTogTmV3IHR5cGVkZWYsIHdpdGggYXNzb2NpYXRlZCBhY2Nlc3MgbWFjcm9zLgotCShDR0VOX0lGTVQpOiBOZXcgdHlwZWRlZiwgd2l0aCBhc3NvY2lhdGVkIGFjY2VzcyBtYWNyb3MuCi0JKENHRU5fSUZNVCk6IFJlbmFtZWQgZnJvbSBDR0VOX0ZPUk1BVC4gIE5ldyBtZW1iZXIgYGlmbGRzJy4KLQkoQ0dFTl9JVkFMVUUpOiBOZXcgdHlwZWRlZi4KLQkoc3RydWN0IGNnZW5faW5zbik6IERlbGV0ZSBjb25zdCBvbiBzeW50YXgsYXR0cnMgbWVtYmVycy4KLQlgZm9ybWF0JyBub3cgcG9pbnRzIHRvIGZvcm1hdCBkYXRhLiAgVHlwZSBvZiBgdmFsdWUnIGlzIG5vdwotCUNHRU5fSVZBTFVFLgotCShzdHJ1Y3QgY2dlbl9vcGNvZGVfdGFibGUpOiBOZXcgbWVtYmVyIGlmbGRfdGFibGUuCi0KLTE5OTgtMTEtMTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChjZ2VuX2V4dHJhY3RfZm4pOiBVcGRhdGUgdHlwZSBvZiBgYmFzZV9pbnNuJyBhcmcuCi0JKENHRU5fT1BFUkFORF9JTlNUQU5DRSk6IE5ldyBtZW1iZXIgYGF0dHJzJy4KLQkoQ0dFTl9PUEVSQU5EX0lOU1RBTkNFX3tBVFRSUyxBVFRSfSk6IE5ldyBtYWNyb3MuCi0JKGNnZW5fZGlzX2xvb2t1cF9pbnNuKTogVXBkYXRlIHR5cGUgb2YgYGJhc2VfaW5zbicgYXJnLgotCShjZ2VuX29wY29kZV90YWJsZSk6IFVwZGF0ZSB0eXBlIG9mIGRpc19oYXNoIGZuLgotCShleHRyYWN0X29wZXJhbmQpOiBVcGRhdGUgdHlwZSBvZiBgaW5zbl92YWx1ZScgYXJnLgotCi1UaHUgT2N0IDI5IDExOjM4OjM2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9WRVJTSU9OX3tNQUpPUixNSU5PUixGSVhMRVZFTH0pOiBEZWxldGUuCi0KLVR1ZSBPY3QgMjcgMDg6NTc6NTkgMTk5OCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoSU5TTl9NVUxUKTogQWRkZWQuCi0KLVR1ZSBPY3QgMjAgMTE6MzE6MzQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKE1BWF9NTkVNX1NJWkUpOiBSZW5hbWUgZnJvbSBNQVhfT1BDT0RFX1NJWkUuCi0KLU1vbiBPY3QgMTkgMTI6NTA6MDAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9JTlNOX0lOVCk6IE5ldyB0eXBlZGVmLgotCShDR0VOX0lOVF9JTlNOX1ApOiBSZW5hbWVkIGZyb20gQ0dFTl9JTlRfSU5TTi4KLQkoQ0dFTl9JTlNOX0JZVEVTKTogUmVuYW1lZCBmcm9tIGNnZW5faW5zbl90LgotCShDR0VOX0lOU05fQllURVNfUFRSKTogTmV3IHR5cGVkZWYuCi0JKENHRU5fRVhUUkFDVF9JTkZPKTogTmV3IHR5cGVkZWYuCi0JKGNnZW5faW5zZXJ0X2ZuLGNnZW5fZXh0cmFjdF9mbik6IFVwZGF0ZS4KLQkoY2dlbl9vcGNvZGVfdGFibGUpOiBOZXcgbWVtYmVyIGBpbnNuX2VuZGlhbicuCi0JKGFzc2VtYmxlX2luc24sbG9va3VwX2luc24sbG9va3VwX2dldF9pbnNuX29wZXJhbmRzKTogVXBkYXRlLgotCShpbnNlcnRfb3BlcmFuZCxleHRyYWN0X29wZXJhbmQpOiBVcGRhdGUuCi0JKGNnZW5fZ2V0X2luc25fdmFsdWUsY2dlbl9wdXRfaW5zbl92YWx1ZSk6IEFkZCBwcm90b3R5cGVzLgotCi1GcmkgT2N0ICA5IDEzOjM4OjEzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fQVRUUl9CT09MUyk6IE5ldyBtYWNyby4KLQkoc3RydWN0IENHRU5fSFdfRU5UUlkpOiBOZXcgbWVtYmVyIGBhdHRycycuCi0JKENHRU5fSFdfQVRUUik6IE5ldyBtYWNyby4KLQkoc3RydWN0IENHRU5fT1BFUkFORF9JTlNUQU5DRSk6IE5ldyBtZW1iZXIgYG5hbWUnLgotCShDR0VOX0lOU05fSU5WQUxJRF9QKTogTmV3IG1hY3JvLgotCi1Nb24gT2N0ICA1IDAwOjIxOjA3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oOiBBZGQgImZpZCIuCi0JCi1TdW4gT2N0ICA0IDIxOjAwOjAwIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCUZyb20gUm9iZXJ0IEFuZHJldyBEYWxlIDxyb2JAbmIubmV0PgotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQWRkIEFNRCAzRE5vdyEgaW5zdHJ1Y3Rpb25zLgotCShBTURfM0ROT1dfT1BDT0RFKTogRGVmaW5lLgotCi1UdWUgU2VwIDIyIDE3OjUzOjQ3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYuaCAoRUlUSEVSX0JVVF9QUkVGRVJfTVUpOiBEZWZpbmUuCi0KLU1vbiBBdWcgMTAgMTQ6MDk6MzggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChjZ2VuX2luc24pOiAjaWYgMCBvdXQgZWxlbWVudCBgY2R4Jy4KLQotTW9uIEF1ZyAgMyAxMjoyMTo1NyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCU1vdmUgYWxsIGdsb2JhbCBzdGF0ZSBkYXRhIGludG8gb3Bjb2RlIHRhYmxlIHN0cnVjdCwgYW5kIHRyZWF0Ci0Jb3Bjb2RlIHRhYmxlIGFzIHNvbWV0aGluZyB0aGF0IGlzICJvcGVuZWQvY2xvc2VkIi4KLQkqIGNnZW4uaCAoQ0dFTl9PUENPREVfREVTQyk6IE5ldyB0eXBlLgotCShhbGwgZm5zKTogTmV3IGZpcnN0IGFyZyBvZiBvcGNvZGUgdGFibGUgZGVzY3JpcHRvci4KLQkoY2dlbl9zZXRfcGFyc2Vfb3BlcmFuZF9mbik6IEFkZCBwcm90b3R5cGUuCi0JKGNnZW5fY3VycmVudF9tYWNoaW5lLGNnZW5fY3VycmVudF9lbmRpYW4pOiBEZWxldGUuCi0JKENHRU5fT1BDT0RFX1RBQkxFKTogTmV3IG1lbWJlcnMgbWFjaCxlbmRpYW4sb3BlcmFuZF90YWJsZSwKLQlwYXJzZV9vcGVyYW5kX2ZuLGFzbV9oYXNoX3RhYmxlLGFzbV9oYXNoX3RhYmxlX2VudHJpZXMsCi0JZGlzX2hhc2hfdGFibGUsZGlzX2hhc2hfdGFibGVfZW50cmllcy4KLQkob3Bjb2RlX29wZW4sb3Bjb2RlX2Nsb3NlKTogQWRkIHByb3RvdHlwZXMuCi0KLQkqIGNnZW4uaCAoY2dlbl9pbnNuKTogTmV3IGVsZW1lbnQgYGNkeCcuCi0KLVRodSBKdWwgMzAgMjE6NDQ6MjUgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZDMwdi5oIChGTEFHX0xLUik6IE5ldyBmbGFnIGZvciAibGVmdC1raWxscy1yaWdodCIgaW5zdHJ1Y3Rpb25zLgotCi1UdWUgSnVsIDI4IDEwOjU5OjA3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oOiBBZGQgIm5vX21hdGNoX29wZXJhbmRzIiBmaWVsZCBmb3IgaW5zdHJ1Y3Rpb25zLgotCShNTjEwMzAwX01BWF9PUEVSQU5EUyk6IERlZmluZS4KLQotRnJpIEp1bCAyNCAxMTo0NDoyNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGNnZW5fbWFjcm9faW5zbl9jb3VudCk6IERlY2xhcmUuCi0KLVR1ZSBKdWwgMjEgMTM6MTI6MTMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9WRVJTSU9OX3tNQUpPUixNSU5PUixGSVhMRVZFTH0pOiBEZWZpbmUuCi0JKGNnZW5faW5zZXJ0X2ZuLGNnZW5fZXh0cmFjdF9mbik6IE5ldyBhcmcgYHBjJy4KLQkoZ2V0X29wZXJhbmQscHV0X29wZXJhbmQpOiBSZXBsYWNlZCB3aXRoIGdldF97aW50LHZtYX1fb3BlcmFuZCwKLQlzZXRfe2ludCx2bWF9X29wZXJhbmQuCi0KLUZyaSBKdW4gMjYgMTE6MDk6MDYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmg6IEFkZCAibWFjaGluZSIgZmllbGQgZm9yIGluc3RydWN0aW9ucy4KLQkoTU4xMDMsIEFNMzApOiBEZWZpbmUgbWFjaGluZSB0eXBlcy4KLQkKLUZyaSBKdW4gMTkgMTY6MDk6MDkgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2Lmg6IFVzZSBGUCwgbm90IHNsX1N1ZiwgZm9yIGZ4c2F2ZSBhbmQgZnhyc3Rvci4KLQotMTk5OC0wNi0xOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQWRkIHN1cHBvcnQgZm9yIGZ4c2F2ZSwgZnhyc3Rvciwgc3lzZW50ZXIgYW5kIHN5c2V4aXQuCi0KLVNhdCBKdW4gMTMgMTE6MzE6MzUgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBBZGQgZ2VuZXJhbCBmb3JtIG9mIGFhZCBhbmQgYWFtLiAgQWRkIHVkMmEKLQlhbmQgdWQyYi4KLQkoaTM4Nl9yZWd0YWIpOiBBbGxvdyBjcjAuLjcsIGRiMC4uNywgZHIwLi43LCB0cjAuLjcsIG5vdCBqdXN0Ci0JdGhvc2UgdGhhdCBoYXBwZW4gdG8gYmUgaW1wbGVtZW50ZWQgb24gcGVudGl1bXMuCi0KLVR1ZSBKdW4gIDkgMTI6MTY6MDEgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2Lmg6IENoYW5nZSBvY2N1cmVuY2VzIG9mIERhdGExNiB0byBTaXplMTYsIERhdGEzMiB0byBTaXplMzIsCi0JSWdub3JlRGF0YVNpemUgdG8gSWdub3JlU2l6ZS4gIEZsYWcgYWRkcmVzcyBhbmQgZGF0YSBzaXplIHByZWZpeGVzCi0Jd2l0aCBTaXplMTZ8SWdub3JlU2l6ZSBvciBTaXplMzJ8SWdub3JlU2l6ZS4KLQotTW9uIEp1biAgOCAxMjoxNTo1MiAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoUkVQTkUpOiBSZW5hbWUgdG8gUkVQTkVfUFJFRklYX09QQ09ERS4KLQkoUkVQRSk6IFJlbmFtZSB0byBSRVBFX1BSRUZJWF9PUENPREUuCi0JKGkzODZfcmVndGFiX2VuZCk6IFJlbW92ZS4KLQkoaTM4Nl9wcmVmaXh0YWIsIGkzODZfcHJlZml4dGFiX2VuZCk6IFJlbW92ZS4KLQkoaTM4Nl9vcHRhYik6IFVzZSBOVUxMIGFzIHNlbnRpbmVsIHJhdGhlciB0aGFuICIiIHRvIHN1aXQgcmV3cml0ZQotCW9mIG1kX2JlZ2luLgotCShNQVhfT1BDT0RFX1NJWkUpOiBEZWZpbmUuCi0JKGkzODZfb3B0YWJfZW5kKTogUmVtb3ZlLgotCShzbF9TdWYpOiBEZWZpbmUuCi0JKHNsX0ZQKTogVXNlIHNsX1N1Zi4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQWxsb3cgMTYgYml0IGRpc3BsYWNlbWVudCBmb3IgYG1vdgotCW1lbSxhY2MnLiAgQ29tYmluZSAxNiBhbmQgMzIgYml0IGZvcm1zIG9mIHZhcmlvdXMgaW5zbnMuICBBbGxvdyAxNgotCWJpdCBmb3JtIG9mIGxqbXAuICBBZGQgSXNQcmVmaXggbW9kaWZpZXIgdG8gcHJlZml4ZXMuICBBZGQgYWRkcjMyLAotCWRhdGEzMiwgZHdvcmQsIGFuZCBhZHdvcmQgcHJlZml4ZXMuCi0JKGkzODZfcmVndGFiKTogQWRkIEJhc2VJbmRleCBtb2RpZmllciB0byB2YWxpZCAxNiBiaXQgYmFzZS9pbmRleAotCXJlZ3MuCi0KLUZyaSBKdW4gIDUgMjM6NDI6NDMgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKGkzODZfcmVndGFiKTogUmVtb3ZlIEJhc2VJbmRleCBtb2RpZmllciBmcm9tIGVzcC4KLQotCSogaTM4Ni5oOiBBbGxvdyBgbCcgc3VmZml4IG9uIGZsZCwgZnN0LCBmc3RwLCBmY29tLCBmY29tcCB3aXRoCi0JcmVnaXN0ZXIgb3BlcmFuZHMsIGJlY2F1c2UgdGhpcyBpcyBhIGNvbW1vbiBpZGlvbS4gIEZsYWcgdGhlbSB3aXRoCi0JYSB3YXJuaW5nLiAgQWxsb3cgaWxsZWdhbCBmYWRkcCwgZnN1YnAsIGZzdWJycCwgZm11bHAsIGZkaXZwLAotCWZkaXZycCBiZWNhdXNlIGdjYyBlcnJvbmVvdXNseSBnZW5lcmF0ZXMgdGhlbS4gIEFsc28gZmxhZyB3aXRoIGEKLQl3YXJuaW5nLgotCi0JKiBpMzg2Lmg6IEFkZCBzdWZmaXggbW9kaWZpZXJzIHRvIG1vc3QgaW5zbnMsIGFuZCB0aWdodGVyIG9wZXJhbmQKLQljaGVja3MgaW4gc29tZSBjYXNlcy4gIEZpeCBhIG51bWJlciBvZiBVbml4V2FyZSBjb21wYXRpYmlsaXR5Ci0JaXNzdWVzIHdpdGggZmxvYXQgaW5zbnMuICBNZXJnZSBzb21lIGZsb2F0aW5nIHBvaW50IG9wY29kZXMsIHVzaW5nCi0JbmV3IEZsb2F0TUYgbW9kaWZpZXIuCi0JKFdPUkRfUFJFRklYX09QQ09ERSk6IFJlbmFtZSB0byBEQVRBX1BSRUZJWF9PUENPREUgZm9yCi0JY29uc2lzdGVuY3kuCi0KLQkqIGkzODYuaDogQ2hhbmdlIG9jY3VyZW5jZSBvZiBTaG9ydGZvcm1XIHRvIFd8U2hvcnRGb3JtLiAgQWRkCi0JSWdub3JlRGF0YVNpemUgd2hlcmUgYXBwcm9wcmlhdGUuCi0KLVdlZCBKdW4gIDMgMTg6Mjg6NDUgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2Lmg6IChvbmVfYnl0ZV9zZWdtZW50X2RlZmF1bHRzKTogUmVtb3ZlLgotCSh0d29fYnl0ZV9zZWdtZW50X2RlZmF1bHRzKTogUmVtb3ZlLgotCShpMzg2X3JlZ3RhYik6IEFkZCBCYXNlSW5kZXggdG8gMzIgYml0IHJlZ3MgcmVnX3R5cGUuCi0KLUZyaSBNYXkgMTUgMTU6NTk6MDQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoY2dlbl9od19sb29rdXBfYnlfbmFtZSk6IFJlbmFtZWQgZnJvbSBjZ2VuX2h3X2xvb2t1cC4KLQkoY2dlbl9od19sb29rdXBfYnlfbnVtKTogRGVjbGFyZS4KLQotVGh1IE1heSAgNyAwOToyNzo1OCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKE9QX3tTSCxNQVNLfV9DT0RFMik6IEFkZGVkICJxIiBvcGVyYW5kIGZvcm1hdCBmb3IgbG93ZXIKLQl0ZW4gYml0cyBvZiBNSVBTIElTQTEgImJyZWFrIiBpbnN0cnVjdGlvbiwgYW5kIGZvciAic2RiYnAiCi0KLVRodSBNYXkgIDcgMDI6MTQ6MDggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoY2dlbl9hc21faW5pdF9wYXJzZSk6IERlbGV0ZS4KLQkoY2dlbl9zYXZlX2ZpeHVwcyxjZ2VuX3Jlc3RvcmVfZml4dXBzLGNnZW5fc3dhcF9maXh1cHMpOiBEZWxldGUuCi0JKGNnZW5fYXNtX3JlY29yZF9yZWdpc3RlcixjZ2VuX2FzbV9maW5pc2hfaW5zbik6IERlbGV0ZS4KLQotTW9uIEFwciAyNyAxMDoxMzoxMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0FUVFJfVFlQRSk6IERlbGV0ZSBgY29uc3QnLCBtb3ZlZCB0byB1c2VzLgotCShjZ2VuX2FzbV9maW5pc2hfaW5zbik6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKGNnZW5faW5zbik6IE5ldyBtZW1iZXJzIG51bSwgZGF0YS4KLQkoQ0dFTl9JTlNOX1RBQkxFKTogTWVtYmVycyBhc21faGFzaCwgYXNtX2hhc2hfdGFibGVfc2l6ZSwKLQlkaXNfaGFzaCwgZGlzX2hhc2hfdGFibGVfc2l6ZSBtb3ZlZCB0byAuLi4KLQkoQ0dFTl9PUENPREVfVEFCTEUpLiAgSGVyZS4gIFJlbmFtZWQgZnJvbSBDR0VOX09QQ09ERV9EQVRBLgotCUFsbCB1c2VzIHVwZGF0ZWQuICBOZXcgbWVtYmVycyBhc21faGFzaF9wLCBkaXNfaGFzaF9wLgotCShDR0VOX01JTlNOX0VYUEFOU0lPTik6IE5ldyBzdHJ1Y3QuCi0JKGNnZW5fZXhwYW5kX21hY3JvX2luc24pOiBEZWNsYXJlLgotCShjZ2VuX21hY3JvX2luc25fY291bnQpOiBEZWNsYXJlLgotCShnZXRfaW5zbl9vcGVyYW5kcyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKGxvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcyk6IERlY2xhcmUuCi0KLVR1ZSBBcHIgMjEgMTc6MTE6MzIgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBDaGFuZ2UgaWNscktsdWRnZSBhbmQgaW11bEtsdWRnZSB0bwotCXJlZ0tsdWRnZS4gIEFkZCBvcGVyYW5kcyB0eXBlcyBmb3Igc3RyaW5nIGluc3RydWN0aW9ucy4KLQotTW9uIEFwciAyMCAxNDo0MDoyOSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaCAoWCk6IFJlbmFtZWQgZnJvbSBgWl8nIHRvIHByZXNlcnZlIGZvcm1hdHRpbmcgb2Ygb3Bjb2RlCi0JdGFibGUuCi0KLVN1biBBcHIgMTkgMTM6NTQ6MDYgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBpMzg2LmggKFpfKTogUmVuYW1lZCBmcm9tIGBfJyB0byBhdm9pZCBjbGFzaCB3aXRoIGNvbW1vbiBhbGlhcwotCWZvciBgZ2V0dGV4dCcuCi0KLUZyaSBBcHIgIDMgMTI6MDQ6NDggMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2Lmg6IFJlbW92ZSBOb01vZHJtIGZsYWcgZnJvbSBhbGwgaW5zbnM6IGl0J3MgbmV2ZXIgY2hlY2tlZC4KLQlBZGQgSXNTdHJpbmcgZmxhZyB0byBzdHJpbmcgaW5zdHJ1Y3Rpb25zLgotCShJU19TVFJJTkcpOiBEb24ndCBkZWZpbmUuCi0JKExPQ0tfUFJFRklYX09QQ09ERSwgQ1NfUFJFRklYX09QQ09ERSwgRFNfUFJFRklYX09QQ09ERSk6IERlZmluZS4KLQkoRVNfUFJFRklYX09QQ09ERSwgRlNfUFJFRklYX09QQ09ERSwgR1NfUFJFRklYX09QQ09ERSk6IERlZmluZS4KLQkoU1NfUFJFRklYX09QQ09ERSk6IERlZmluZS4KLQotTW9uIE1hciAzMCAyMTozMTo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogUmV2ZXJ0IE1hcmNoIDI0IHBhdGNoOyBubyBtb3JlIExpbmVhckFkZHJlc3MuCi0KLU1vbiBNYXIgMzAgMTA6MjU6NTQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBSZW1vdmUgZndhaXQgKDliKSBmcm9tIGFsbCBmbG9hdGluZyBwb2ludAotCWluc3RydWN0aW9ucywgYW5kIGluc3RlYWQgYWRkIEZXYWl0IG9wY29kZSBtb2RpZmllci4gIEFkZCBzaG9ydAotCWZvcm0gb2YgZmxkZW52IGFuZCBmc3RlbnYuCi0JKEZXQUlUX09QQ09ERSk6IERlZmluZS4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQ2hhbmdlIHNlY29uZCBvcGVyYW5kIGNvbnN0cmFpbnQgb2YgYG1vdgotCXNyZWcscmVnfG1lbScgaW5zdHJ1Y3Rpb24gZnJvbSBSZWcxNnxNZW0gdG8gV29yZFJlZ3xXb3JkTWVtIHRvCi0JYWxsb3cgbGVnYWwgaW5zdHJ1Y3Rpb25zIHN1Y2ggYXMgYG1vdmwgJWdzLCVlc2knCi0KLUZyaSBNYXIgMjcgMTg6MzA6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBoODMwMC5oOiBWYXJpb3VzIGNoYW5nZXMgdG8gZnVsbHkgYnJhY2tldCBpbml0aWFsaXplcnMuCi0KLVR1ZSBNYXIgMjQgMTg6MzI6NDcgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBpMzg2Lmg6IFNldCBMaW5lYXJBZGRyZXNzIGZvciBsaWR0IGFuZCBsZ2R0LgotCi1Nb24gTWFyICAyIDEwOjQ0OjA3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fQk9PTF9BVFRSKTogTmV3IG1hY3JvLgotCi1UaHUgRmViIDI2IDE1OjU0OjMxIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LmggKEZMQUdfREVMQVkpOiBOZXcgZmxhZyBmb3IgZGVsYXllZCBicmFuY2hlcy9qdW1wcy4KLQotTW9uIEZlYiAyMyAxMDozODoyMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0NBVDMpOiBEZWxldGUuICBVc2UgQ09OQ0FUMyBub3cuCi0JKGNnZW5faW5zbik6IFJlY29yZCBzeW50YXggYW5kIGZvcm1hdCBlbnRyaWVzIGhlcmUsIHJhdGhlciB0aGFuCi0Jc2VwYXJhdGVseS4KLQotVHVlIEZlYiAxNyAyMTo0Mjo1NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fU1lOVEFYX01BS0VfRklFTEQpOiBOZXcgbWFjcm8uCi0KLVR1ZSBGZWIgMTcgMTY6MDA6NTYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoY2dlbl9pbnNlcnRfZm4pOiBDaGFuZ2UgdHlwZSBvZiByZXN1bHQgdG8gY29uc3QgY2hhciAqLgotCShjZ2VuX3BhcnNlX3tzaWduZWQsdW5zaWduZWR9X2ludGVnZXIpOiBEZWxldGUgbWluLG1heCBhcmd1bWVudHMuCi0JKENHRU5fe0lOU04sS0VZV09SRCxPUEVSQU5EfV9OQk9PTF9BVFRSUyk6IFJlbmFtZWQgZnJvbSAuLi5fTUFYX0FUVFJTLgotCi1UaHUgRmViIDEyIDE4OjMwOjQxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAobG9va3VwX2luc24pOiBOZXcgYXJndW1lbnQgYWxpYXNfcC4KLQotVGh1IEZlYiAxMiAwMzo0MTowMCAxOTk4ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi1GaXggcmFjIHRvIGFjY2VwdCBvbmx5IGEwOgotCSogZDEwdi5oIChPUEVSQU5EX0FDQyk6IFNwbGl0IGludG86Ci0JKE9QRVJBTkRfQUNDMCwgT1BFUkFORF9BQ0MxKSAuCi0JKE9QRVJBTkRfR1BSKTogRGVmaW5lLgotCi1XZWQgRmViIDExIDE3OjMxOjUzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fRklFTERTKTogRGVmaW5lIGhlcmUuCi0JKENHRU5fSFdfRU5UUlkpOiBOZXcgbWVtYmVyIGB0eXBlJy4KLQkoaHdfbGlzdCk6IERlbGV0ZSBkZWNsLgotCShlbnVtIGNnZW5fbW9kZSk6IERlY2xhcmUuCi0JKENHRU5fT1BFUkFORCk6IE5ldyBtZW1iZXIgYGh3Jy4KLQkoZW51bSBjZ2VuX29wZXJhbmRfaW5zdGFuY2VfdHlwZSk6IERlY2xhcmUuCi0JKENHRU5fT1BFUkFORF9JTlNUQU5DRSk6IE5ldyB0eXBlLgotCShDR0VOX0lOU04pOiBOZXcgbWVtYmVyIGBvcGVyYW5kcycuCi0JKENHRU5fT1BDT0RFX0RBVEEpOiBNYWtlIGh3X2xpc3QgY29uc3QuCi0JKGdldF9pbnNuX29wZXJhbmRzLGxvb2t1cF9pbnNuKTogQWRkIHByb3RvdHlwZXMgZm9yLgotCi1UdWUgRmViICAzIDE3OjExOjIzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fSU5TTl9NQVhfQVRUUlMpOiBSZW5hbWVkIGZyb20gQ0dFTl9NQVhfSU5TTl9BVFRSUy4KLQkoQ0dFTl9IV19FTlRSWSk6IE1vdmUgYG5leHQnIGVudHJ5IHRvIGVuZCBvZiBzdHJ1Y3QuCi0JKENHRU5fS0VZV09SRF9NQVhfQVRUUlMpOiBSZW5hbWVkIGZyb20gQ0dFTl9NQVhfS0VZV09SRF9BVFRSUy4KLQkoQ0dFTl9PUEVSQU5EX01BWF9BVFRSUyk6IFJlbmFtZWQgZnJvbSBDR0VOX01BWF9PUEVSQU5EX0FUVFJTLgotCi1Nb24gRmViICAyIDE5OjE5OjE1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oOiBDb3JyZWN0IHR5cG8gaW4gY29tbWVudCBlbmQgbWFya2VyLgotCi1Nb24gRmViICAyIDE3OjEwOjM4IDE5OTggIFN0ZXZlIEhhd29ydGggIDxzdGV2ZUBwbS5jc2Uucm1pdC5FRFUuQVU+Ci0KLQkqIHRpYzMwLmg6IE5ldyBmaWxlLgotCi1UaHUgSmFuIDIyIDE3OjU0OjU2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaDogQWRkIHByb3RvdHlwZXMgZm9yIGNnZW5fc2F2ZV9maXh1cHMoKSwKLQljZ2VuX3Jlc3RvcmVfZml4dXBzKCksIGFuZCBjZ2VuX3N3YXBfZml4dXBzKCkuICBDaGFuZ2UgcHJvdG90eXBlCi0Jb2YgY2dlbl9hc21fZmluaXNoX2luc24oKSB0byByZXR1cm4gYSBjaGFyICouCi0KLVdlZCBKYW4gMTQgMTc6MjE6NDMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oOiBGb3JtYXR0aW5nIGNoYW5nZXMgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KLQotTW9uIEphbiAxMiAxMTozNzozNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oICgqKTogQ2xlYW4gdXAgcGFzcyBvdmVyIGBzdHJ1Y3QgZm9vJyB1c2FnZS4KLQkoQ0dFTl9BVFRSKTogTWFrZSB1bnNpZ25lZCBjaGFyLgotCShDR0VOX0FUVFJfVFlQRSk6IFVwZGF0ZS4KLQkoQ0dFTl9BVFRSX3tFTlRSWSxUQUJMRX0pOiBOZXcgdHlwZXMuCi0JKGNnZW5fYmFzZSk6IE1vdmUgbWVtYmVyIGBhdHRycycgdG8gY2dlbl9pbnNuLgotCShDR0VOX0tFWVdPUkQpOiBOZXcgbWVtYmVyIGBudWxsX2VudHJ5Jy4KLQkoQ0dFTl97U1lOVEFYLEZPUk1BVH0pOiBOZXcgdHlwZXMuCi0JKGNnZW5faW5zbik6IEZvcm1hdCBhbmQgc3ludGF4IHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIuCi0KLVR1ZSBEZWMgMTYgMTU6MTU6NTIgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYuaCAoZDMwdl9vcGNvZGUpOiBSZW9yZGVyIGZsYWdzIHNvbWV3aGF0LCBhZGQgbmV3IGZsYWdzIGZvcgotCTIgd29yZCBsb2FkL3N0b3JlLCBBRERwcHAvU1VCcHBwLCAxNi8zMiBiaXQgbXVsdGlwbHkuICBNYWtlCi0JZmxhZ3Nfe3VzZWQsc2V0fSBsb25nLgotCShkMzB2X29wZXJhbmQpOiBNYWtlIGZsYWdzIGZpZWxkIGxvbmcuCi0KLU1vbiBEZWMgIDEgMTI6MjQ6NDQgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGsuaDogRml4IGNvbW1lbnQgZGVzY3JpYmluZyBvcGVyYW5kIHR5cGVzLgotCi1TdW4gTm92IDIzIDIyOjMxOjI3IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LmggKFNIT1JUX0NNUFUpOiBBZGQgY2FzZSBmb3IgY21wdSBpbnN0cnVjdGlvbiwgYW5kIG1vdmUKLQlldmVyeXRoaW5nIGVsc2UgYWZ0ZXIgZG93bi4KLQotVHVlIE5vdiAxOCAxODo0NToxNCAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBkMTB2LmggKE9QRVJBTkRfRkxBRyk6IFNwbGl0IGludG86Ci0JKE9QRVJBTkRfRkZMQUcsIE9QRVJBTkRfQ0ZMQUcpIC4KLQotVGh1IE5vdiAxMyAxMTowNDoyNCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChzdHJ1Y3QgbWlwc19vcGNvZGUpOiBDaGFuZ2VkIGNvbW1lbnRzIHRvIHJlZmxlY3QgbmV3Ci0JZmllbGQgdXNhZ2UuCi0KLUZyaSBPY3QgMjQgMjI6MzY6MjAgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQWRkZWQgdG8gY29tbWVudHMgYSBxdWljay1yZWYgbGlzdCBvZiBhbGwgYXNzaWduZWQKLQlvcGVyYW5kIHR5cGUgY2hhcmFjdGVycy4KLQkoT1Bfe01BU0ssU0h9X1BFUkZSRUcpOiBOZXcgbWFjcm9zLgotCi1XZWQgT2N0IDIyIDE3OjI4OjMzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmg6IEFkZCAnXycgYW5kICcvJyBmb3IgdjlhIGFzcidzLgotCVBhdGNoIGZyb20gRGF2aWQgTWlsbGVyIDxkYXZlbUB2Z2VyLnJ1dGdlcnMuZWR1PgotCi1UdWUgT2N0IDE0IDEzOjIyOjI5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogQml0IG9wcyB3aXRoIGFic29sdXRlIGFkZHJlc3NlcyBub3QgaW4gdGhlIDggYml0Ci0JYXJlYSBhcmUgbm90IGF2YWlsYWJsZSBpbiB0aGUgYmFzZSBtb2RlbCAoSDgvMzAwKS4KLQotVGh1IFNlcCAyNSAxMzowMzo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGsuaDogUmVtb3ZlIGRvY3VtZW50YXRpb24gb2YgYCBvcGVyYW5kIHNwZWNpZmllci4KLQotV2VkIFNlcCAyNCAxOTowMDozNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGsuaDogRG9jdW1lbnQgcSBhbmQgdiBvcGVyYW5kIHNwZWNpZmllcnMuCi0KLU1vbiBTZXAgMTUgMTg6Mjg6MzcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChzdHJ1Y3Qgdjg1MF9vcGNvZGUpOiBBZGQgcHJvY2Vzc29ycyBmaWVsZC4KLQkoUFJPQ0VTU09SX1Y4NTAsIFBST0NFU1NPUl9BTEwpOiBOZXcgYml0IGNvbnN0YW50cy4KLQkoUFJPQ0VTU09SX1Y4NTBFLCBQUk9DRVNTT1JfTk9UX1Y4NTApOiBOZXcgYml0IGNvbnN0YW50cy4KLQkoUFJPQ0VTU09SX1Y4NTBFQSk6IE5ldyBiaXQgY29uc3RhbnRzLgotCi1Nb24gU2VwIDE1IDExOjI5OjQzIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTWVyZ2UgY2hhbmdlcyBmcm9tIE1hcnRpbiBIdW50OgotCi0JKiBkMzB2Lmg6IEFsbG93IHVwIHRvIDY0IGNvbnRyb2wgcmVnaXN0ZXJzLiBBZGQKLQlTSE9SVF9BNVMgZm9ybWF0LgotCi0JKiBkMzB2LmggKExPTkdfRGIpOiBOZXcgZm9ybSBmb3IgZGVsYXllZCBicmFuY2hlcy4KLQotCSogZDMwdi5oOiAoTE9OR19EYik6IE5ldyBmb3JtIGZvciByZXBlYXRpLgotCi0JKiBkMzB2LmggKFNIT1JUX0QyQik6IE5ldyBmb3JtLgotCi0JKiBkMzB2LmggKFNIT1JUX0EyKTogTmV3IGZvcm0uCi0KLQkqIGQzMHYuaCAoT1BFUkFORF8yUkVHKTogQWRkIG5ldyBvcGVyYW5kIHRvIGluZGljYXRlIDIKLQlyZWdpc3RlcnMgYXJlIHVzZWQuICBOZWVkZWQgZm9yIFZMSVcgb3B0aW1pemF0aW9uLgotCi1Nb24gU2VwICA4IDE0OjA1OjQ1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaDogTW92ZSBhc3NlbWJsZXIgaW50ZXJmYWNlIHNlY3Rpb24KLQl1cCBzbyBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IGlzIGRlZmluZWQgZm9yIGNnZW5fcGFyc2VfYWRkcmVzcy4KLQkoY2dlbl9wYXJzZV9hZGRyZXNzKTogVXBkYXRlIHByb3RvdHlwZS4KLQotVHVlIFNlcCAgMiAxNTozMjozMiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLmggKFY4NTBfT1BSRUFORF9BREpVU1RfU0hPUlRfTUVNT1JZKTogUmVtb3ZlZC4KLQotVHVlIEF1ZyAyNiAxMjoyMTo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaCAodHdvX2J5dGVfc2VnbWVudF9kZWZhdWx0cyk6IENvcnJlY3QgYmFzZSByZWdpc3RlciA1IGluCi0JbW9kZXMgMSBhbmQgMiB0byBiZSBzcyByYXRoZXIgdGhhbiBkcy4gIEZyb20gR2FicmllbCBQYXViZXJ0Ci0JPHBhdWJlcnRAaXJhbS5lcz4uCi0KLQkqIGkzODYuaDogU2V0IHVkMiB0byAweDBmMGIuICBGcm9tIEdhYnJpZWwgUGF1YmVydAotCTxwYXViZXJ0QGlyYW0uZXM+LgotCi0JKiBpMzg2Lmg6IENvbW1lbnQgZml4ZXMgZm9yIGZpY29tW3BdP3tzLGx9IGZyb20gR2FicmllbCBQYXViZXJ0Ci0JPHBhdWJlcnRAaXJhbS5lcz4uCi0KLQkqIGkzODYuaCAoSlVNUF9PTl9DWF9aRVJPKTogVW5jb21tZW50IChkZWZpbmUgYWdhaW4pLgotCShKVU1QX09OX0VDWF9aRVJPKTogUmVtb3ZlIGNvbW1lbnRlZCBvdXQgbWFjcm8uCi0KLUZyaSBBdWcgMjIgMTA6Mzg6MjkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChWODUwX05PVF9SMCk6IE5ldyBmbGFnLgotCi1Nb24gQXVnIDE4IDExOjA1OjU4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAoc3RydWN0IHY4NTBfb3Bjb2RlKTogUmVtb3ZlIGZsYWdzIGZpZWxkLgotCi1XZWQgQXVnIDEzIDE4OjQ1OjQ4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAoc3RydWN0IHY4NTBfb3Bjb2RlKTogQWRkIGZsYWdzIGZpZWxkLgotCShzdHJ1Y3Qgdjg1MF9vcGVyYW5kKTogRXh0ZW5kIG1lYW5pbmcgb2YgJ2JpdHMnIGFuZCAnc2hpZnQnCi0JZmllbGRzLgotCShWODUwRV9JTlNUUlVDVElPTiwgVjg1MEVBX0lOU1RSVUNUSU9OKTogTmV3IGZsYWdzLgotCShWODUwRV9QVVNIX1BPUCwgVjg1MEVfSU1NRURJQVRFMTYsIFY4NTBFX0lNTUVESUFURTMyKTogTmV3IGZsYWdzLgotCi1GcmkgQXVnICA4IDE2OjU4OjQyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFyYy5oOiBOZXcgZmlsZS4KLQotVGh1IEp1bCAyNCAyMToxNjo1OCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChzcGFyY19vcGNvZGVzKTogRGVjbGFyZSBhcyBjb25zdC4KLQotVGh1IEp1bCAxMCAxMjo1MzoyNSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoRlBfUywgRlBfRCk6IERlZmluZS4gIEJpdG1hc2tzIGluZGljYXRpbmcgaWYgYW4gaW5zbgotCXVzZXMgc2luZ2xlIG9yIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgcmVzb3VyY2VzLgotCShJTlNOX05PX0lTQSwgSU5TTl9JU0ExKTogRGVmaW5lLgotCShjcHUgc3BlY2lmaWMgSU5TTiBtYWNyb3MpOiBUd2VhayBpbnRvIGJpdG1hc2tzIG91dHNpZGUgdGhlIHJhbmdlCi0Jb2YgSU5TTl9JU0EgZmllbGQuCi0KLU1vbiBKdW4gMTYgMTQ6MTA6MDAgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogaTM4Ni5oOiBGaXggcGFuZCBvcGNvZGUuCi0KLU1vbiBKdW4gIDIgMTE6MzU6MDkgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogV2lkZW4gSU5TTl9JU0EgYW5kIG1vdmUgaXQgdG8gYSBtb3JlIGNvbnZlbmllbnQKLQliaXQgcG9zaXRpb24uICBBZGQgSU5TTl8zOTAwLgotCi1UdWUgTWF5IDIwIDExOjI1OjI5IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKHN0cnVjdCBtaXBzX29wY29kZSk6IGFkZGVkIG5ldyBmaWVsZCBtZW1iZXJzaGlwLgotCi1Nb24gTWF5IDEyIDE2OjI2OjUwIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGkzODYuaCAobW92ZCk6IG9ubHkgUmVnMzIgaXMgYWxsb3dlZC4KLQotCSogaTM4Ni5oOiBhZGQgZmNvbXAgYW5kIHVkMi4gIEZyb20gV2F5bmUgU2NvdHQKLQk8d3Njb3R0QGljaGlwcy5pbnRlbC5jb20+LgotCi1Nb24gTWF5ICA1IDE3OjE2OjIxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBBZGQgTU1YIGluc3RydWN0aW9ucy4KLQotTW9uIE1heSAgNSAxMjo0NToxOSAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBpMzg2Lmg6IFJlbW92ZSBXIG1vZGlmaWVyIGZyb20gY29uZGl0aW9uYWwgbW92ZSBpbnN0cnVjdGlvbnMuCi0KLU1vbiBBcHIgMTQgMTQ6NTY6NTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IENoYW5nZSB0aGUgb3Bjb2RlcyBmb3IgZnN1YnAsIGZzdWJycCwgZmRpdnAsIGFuZCBmZGl2cnAKLQl3aXRoIG5vIGFyZ3VtZW50cyB0byBtYXRjaCB0aGF0IGdlbmVyYXRlZCBieSB0aGUgVW5peFdhcmUKLQlhc3NlbWJsZXIuCi0KLVRodSBBcHIgMTAgMTQ6MzU6MDAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oICg8Y3B1Pl9jZ2VuX2Fzc2VtYmxlX2luc24pOiBOZXcgYXJnIGZvciBlcnJtc2cuCi0JKGNnZW5fcGFyc2Vfb3BlcmFuZF9mbik6IERlY2xhcmUuCi0JKGNnZW5faW5pdF9wYXJzZV9vcGVyYW5kKTogRGVjbGFyZS4KLQkoY2dlbl9wYXJzZV9vcGVyYW5kKTogUmVuYW1lZCBmcm9tIGNnZW5fYXNtX3BhcnNlX29wZXJhbmQsCi0JbmV3IGFyZ3VtZW50IGB3YW50Jy4KLQkoZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0KTogUmVuYW1lZCBmcm9tIGNnZW5fYXNtX3Jlc3VsdC4KLQkoZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfdHlwZSk6IE5ldyBlbnVtLgotCi1TYXQgQXByICA1IDEzOjE0OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBSZXZlcnQgbGFzdCBwYXRjaCBmb3IgdGhlIE5PTl9CUk9LRU5fT1BDT0RFUyBjYXNlcy4KLQotRnJpIEFwciAgNCAxMTo0NjoxMSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmg6IE5ldyBmaWxlLgotCi1GcmkgQXByICA0IDE0OjAyOjMyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBDb3JyZWN0IG9wY29kZSB2YWx1ZXMgZm9yIGZzdWJwLCBmc3VicnAsIGZkaXZwLCBhbmQKLQlmZGl2cnAuCi0KLVR1ZSBNYXIgMjUgMjI6NTc6MjYgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogdjg1MC5oIChleHRyYWN0KTogIE1ha2UgdW5zaWduZWQuCi0KLU1vbiBNYXIgMjQgMTQ6Mzg6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IEFkZCBpY2xyLgotCi1UaHUgTWFyIDIwIDE5OjQ5OjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBDaGFuZ2UgRFcgdG8gVyBmb3IgY21weGNoZyBhbmQgeGFkZCwgc2luY2UgdGhleSBkb24ndAotCXRha2UgYSBkaXJlY3Rpb24gYml0LgotCi1TYXQgTWFyIDE1IDE5OjAzOjI5IDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBzcGFyYy5oIChzcGFyY19vcGNvZGVfbG9va3VwX2FyY2gpOiBVc2UgZnVsbCBwcm90b3R5cGUuCi0KLUZyaSBNYXIgMTQgMTU6MjI6MDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcGFyYy5oOiBJbmNsdWRlIDxhbnNpZGVjbC5oPi4gIFVwZGF0ZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgdG8KLQl1c2UgcHJvdG90eXBlcywgYW5kIHRvIHVzZSBjb25zdCB3aGVuIGFwcHJvcHJpYXRlLgotCi1UaHUgTWFyICA2IDE0OjE4OjMwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChNTjEwMzAwX09QRVJBTkRfUkVMQVgpOiBEZWZpbmUuCi0KLU1vbiBGZWIgMjQgMTU6MTU6NTYgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYuaDogQ2hhbmdlIHByZV9kZWZpbmVkX3JlZ2lzdGVycyB0bwotCWQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMgYW5kIHJlZ19uYW1lX2NudCB0byBkMTB2X3JlZ19uYW1lX2NudC4KLQotU2F0IEZlYiAyMiAyMToyNTowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQWRkIG1hY3JvcyBmb3IgY29wMCwgY29wMSBjb3AyIGFuZCBjb3AzLgotCUNoYW5nZSBtaXBzX29wY29kZXMgZnJvbSBjb25zdCBhcnJheSB0byBhIHBvaW50ZXIsCi0JYW5kIGNoYW5nZSBiZmRfbWlwc19udW1fb3Bjb2RlcyBmcm9tIGNvbnN0IGludCB0byBpbnQsCi0Jc28gdGhhdCB3ZSBjYW4gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIG1pcHMgb3Bjb2RlcyB0YWJsZQotCWR5bmFtaWNhbGx5LgotCi1GcmkgRmViIDIxIDE2OjM0OjE4IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMzB2LmggKEZMQUdfWCk6IFJlbW92ZSB1bnVzZWQgZmxhZy4KLQotVHVlIEZlYiAxOCAxNzozNzoyMCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDMwdi5oOiBOZXcgZmlsZS4KLQotRnJpIEZlYiAxNCAxMzoxNjoxNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoUERTX05BTUUpOiBNYWNybyB0byBhY2Nlc3MgbmFtZSBmaWVsZCBvZiBwcmVkZWZpbmVkIHN5bWJvbHMuCi0JKFBEU19WQUxVRSk6IE1hY3JvIHRvIGFjY2VzcyB2YWx1ZSBmaWVsZCBvZiBwcmVkZWZpbmVkIHN5bWJvbHMuCi0JKHRpYzgwX25leHRfcHJlZGVmaW5lZF9zeW1ib2wpOiBBZGQgcHJvdG90eXBlLgotCi1Nb24gRmViIDEwIDEwOjMyOjE3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oICh0aWM4MF9zeW1ib2xfdG9fdmFsdWUpOiBDaGFuZ2UgcHJvdG90eXBlIHRvIG1hdGNoCi0JY2hhbmdlIGluIGZ1bmN0aW9uLCBhZGRlZCBjbGFzcyBwYXJhbWV0ZXIuCi0KLVRodSBGZWIgIDYgMTc6MzA6MTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwX09QRVJBTkRfRU5ETUFTSyk6IEFkZCBmb3IgZmxhZ2dpbmcgVEljODAKLQllbmRtYXNrIGZpZWxkcywgd2hpY2ggYXJlIHNvbWV3aGF0IHdlaXJkIGluIHRoYXQgMCBhbmQgMzIgYXJlCi0JdHJlYXRlZCBleGFjdGx5IHRoZSBzYW1lLgotCi1UaHUgSmFuIDMwIDEzOjQ2OjE4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oOiBDaGFuZ2UgYWxsIHRoZSBPUEVSQU5EIGRlZmluZXMgdG8gdXNlIHRoZSBmb3JtICgxIDw8IFgpCi0JcmF0aGVyIHRoYW4gYSBjb25zdGFudCB0aGF0IGlzIDIqKlguICBSZW9yZGVyIHRoZW0gdG8gcHV0IGJpdHMgZm9yCi0Jb3BlcmFuZHMgdGhhdCBoYXZlIHN5bWJvbGljIG5hbWVzIGluIHRoZSB1cHBlciBiaXRzLCBzbyB0aGV5IGNhbgotCWJlIHBhY2tlZCBpbnRvIGFuIGludCB3aGVyZSB0aGUgbG93ZXIgYml0cyBjb250YWluIHRoZSB2YWx1ZSB0aGF0Ci0JY29ycmVzcG9uZHMgdG8gdGhhdCBzeW1ib2xpYyBuYW1lLgotCShwcmVkZWZpbmVkX3N5bWJvKTogQWRkIHN0cnVjdC4KLQkodGljODBfcHJlZGVmaW5lZF9zeW1ib2xzKTogRGVjbGFyZSBhcnJheSBvZiB0cmFuc2xhdGlvbnMuCi0JKHRpYzgwX251bV9wcmVkZWZpbmVkX3N5bWJvbHMpOiBEZWNsYXJlIHNpemUgb2YgdGhhdCBhcnJheS4KLQkodGljODBfdmFsdWVfdG9fc3ltYm9sKTogRGVjbGFyZSBmdW5jdGlvbi4KLQkodGljODBfc3ltYm9sX3RvX3ZhbHVlKTogRGVjbGFyZSBmdW5jdGlvbi4KLQotV2VkIEphbiAyOSAwOTozNzoyNSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAuaCAoTU4xMDIwMF9PUEVSQU5EX1JFTEFYKTogRGVmaW5lLgotCi1TYXQgSmFuIDE4IDE1OjE4OjU5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4MF9OT19SMF9ERVNUKTogQWRkIGZvciBvcGNvZGVzIHdoZXJlIHIwIGNhbm5vdAotCWJlIHRoZSBkZXN0aW5hdGlvbiByZWdpc3Rlci4KLQotVGh1IEphbiAxNiAyMDo0ODo1NSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoc3RydWN0IHRpYzgwX29wY29kZSk6IENoYW5nZSAiZm9ybWF0IiBmaWVsZCB0byAiZmxhZ3MiLgotCShGTVRfVU5VU0VELCBGTVRfU0ksIEZNVF9MSSwgRk1UX1JFRyk6IERlbGV0ZS4KLQkoVElDODBfVkVDVE9SKTogRGVmaW5lIGEgZmxhZyBiaXQgZm9yIHRoZSBmbGFncy4gIFRoaXMgb25lIG1lYW5zCi0JdGhhdCB0aGUgb3Bjb2RlIGNhbiBoYXZlIHR3byB2ZWN0b3IgaW5zdHJ1Y3Rpb25zIGluIGEgc2luZ2xlCi0JMzIgYml0IHdvcmQgYW5kIHdlIGhhdmUgdG8gZW5jb2RlL2RlY29kZSBib3RoLgotCi1UdWUgSmFuIDE0IDE5OjM3OjA5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4MF9PUEVSQU5EX1BDUkVMKTogUmVuYW1lZCBmcm9tCi0JVElDODBfT1BFUkFORF9SRUxBVElWRSBmb3IgUEMgcmVsYXRpdmUuCi0JKFRJQzgwX09QRVJBTkRfQkFTRVJFTCk6IE5ldyBmbGFnIGJpdCBmb3IgcmVnaXN0ZXIKLQliYXNlIHJlbGF0aXZlLgotCi1Nb24gSmFuIDEzIDE1OjU2OjM4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4MF9PUEVSQU5EX0ZMT0FUKTogQWRkIGZvciBmbG9hdGluZyBwb2ludCBvcGVyYW5kcy4KLQotTW9uIEphbiAgNiAxMDo1MToxNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoVElDODBfT1BFUkFORF9TQ0FMRUQpOiBPcGVyYW5kIG1heSBoYXZlIG9wdGlvbmFsCi0JIjpzIiBtb2RpZmllciBmb3Igc2NhbGluZy4KLQotU3VuIEphbiAgNSAxMjoxMjoxOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoVElDODBfT1BFUkFORF9NX1NJKTogQWRkIG9wZXJhbmQgbW9kaWZpZXIgZm9yICI6bSIuCi0JKFRJQzgwX09QRVJBTkRfTV9MSSk6IERpdHRvCi0KLVNhdCBKYW4gIDQgMTk6MDI6NDQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwX09QRVJBTkRfQklUTlVNKTogUmVuYW1lZCBmcm9tIFRJQzgwX09QRVJBTkRfQ0NfU1ouCi0JKFRJQzgwX09QRVJBTkRfQ0MpOiBOZXcgZGVmaW5lIGZvciBjb25kaXRpb24gY29kZSBvcGVyYW5kLgotCShUSUM4MF9PUEVSQU5EX0NSKTogTmV3IGRlZmluZSBmb3IgY29udHJvbCByZWdpc3RlciBvcGVyYW5kLgotCi1GcmkgSmFuICAzIDE2OjIyOjIzIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChzdHJ1Y3QgdGljODBfb3Bjb2RlKTogTmFtZSBjaGFuZ2VkLgotCShzdHJ1Y3QgdGljODBfb3Bjb2RlKTogUmVtb3ZlIGZvcm1hdCBmaWVsZC4KLQkoc3RydWN0IHRpYzgwX29wZXJhbmQpOiBBZGQgaW5zZXJ0aW9uIGFuZCBleHRyYWN0aW9uIGZ1bmN0aW9ucy4KLQkoVElDODBfT1BFUkFORF8qKTogUmVtb3ZlIG9sZCBib2d1cyB2YWx1ZXMsIHN0YXJ0IGFkZGluZyBuZXcKLQljb3JyZWN0IG9uZXMuCi0JKEZNVF8qKTogRGl0dG8uCi0KLVR1ZSBEZWMgMzEgMTU6MDU6NDEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB2ODUwLmggKFY4NTBfT1BFUkFORF9BREpVU1RfU0hPUlRfTUVNT1JZKTogTmV3IGZsYWcgdG8gYWRqdXN0Ci0JdHlwZSBJViBpbnN0cnVjdGlvbiBvZmZzZXRzLgotCi1GcmkgRGVjIDI3IDIyOjIzOjEwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oOiBOZXcgZmlsZS4KLQotV2VkIERlYyAxOCAxMDowNjozMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAuaCAoTU4xMDIwMF9PUEVSQU5EX05PQ0hFQ0spOiBEZWZpbmUuCi0KLVNhdCBEZWMgMTQgMTA6NDg6MzEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQG5pbmVtb29ucy5jb20+Ci0KLQkqIG1uMTAyMDAuaDogRml4IGNvbW1lbnQsIG1uMTAyMDBfb3BlcmFuZCBub3QgcG93ZXJwY19vcGVyYW5kLgotCSogbW4xMDMwMC5oOiBGaXggY29tbWVudCwgbW4xMDMwMF9vcGVyYW5kIG5vdCBwb3dlcnBjX29wZXJhbmQuCi0JKiB2ODUwLmg6IEZpeCBjb21tZW50LCB2ODUwX29wZXJhbmQgbm90IHBvd2VycGNfb3BlcmFuZC4KLQotTW9uIERlYyAgOSAxNjo0NTozOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAuaDogRmxlc2ggb3V0IHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zIG5lZWRlZCBieQotCXRoZSBtbjEwMjAwIGFzc2VtYmxlciAmIGRpc2Fzc2VtYmxlci4KLQotVHVlIE5vdiAyNiAxMDo0Njo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQWRkIG1pcHMxNiBkZWZpbml0aW9ucy4KLQotTW9uIE5vdiAyNSAxNzo1Njo1NCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAY3lnbnVzLmNvbT4KLQotCSogbTY4ay5oOiBEb2N1bWVudCBuZXcgPCwgPiwgbSwgbiwgbyBhbmQgcCBvcGVyYW5kIHNwZWNpZmllcnMuCi0KLVdlZCBOb3YgMjAgMTA6NTk6NDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKE1OMTAzMDBfT1BFUkFORF9QQ1JFTCk6IERlZmluZS4KLQkoTU4xMDMwMF9PUEVSQU5EX01FTUFERFIpOiBEZWZpbmUuCi0KLVR1ZSBOb3YgMTkgMTM6MzA6NDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVCk6IERlZmluZS4KLQotV2VkIE5vdiAgNiAxMzo0MTowOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoTU4xMDMwMF9PUEVSQU5EX1NQTElUKTogRGVmaW5lLgotCi1UdWUgTm92ICA1IDEzOjI2OjEyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChNTjEwMzAwX09QRVJBTkRfRVhURU5ERUQpOiBEZWZpbmUuCi0KLU1vbiBOb3YgIDQgMTI6NTI6NDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRCk6IERlZmluZS4KLQotRnJpIE5vdiAgMSAxMDozMTowMiAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYWxwaGEuaDogRG9uJ3QgaW5jbHVkZSAiYmZkLmgiOyBwcml2YXRlIHJlbG9jYXRpb24gdHlwZXMgYXJlIG5vdwotIAluZWdhdGl2ZSB0byBtaW5pbWl6ZSBwcm9ibGVtcyB3aXRoIHNoYXJlZCBsaWJyYXJpZXMuICBPcmdhbml6ZQotIAlpbnN0cnVjdGlvbiBzdWJzZXRzIGJ5IEFNQVNLIGV4dGVuc2lvbnMgYW5kIFBBTGNvZGUKLSAJaW1wbGVtZW50YXRpb24uCi0JKHN0cnVjdCBhbHBoYV9vcGVyYW5kKTogTW92ZSBmbGFncyBzbG90IGZvciBiZXR0ZXIgcGFja2luZy4KLQotVHVlIE9jdCAyOSAxMjoxOToxMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAuaCAoVjg1MF9PUEVSQU5EX1JFTEFYKTogTmV3IG9wZXJhbmQgZmxhZy4KLQotVGh1IE9jdCAxMCAxNDoyOToxMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoRk1UXyopOiBNb3ZlIG9wZXJhbmQgZm9ybWF0IGRlZmluaXRpb25zCi0JaGVyZS4KLQotVHVlIE9jdCAgOCAxNDo0ODowNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoTU4xMDMwMF9PUEVSQU5EX1BBUkVOKTogRGVmaW5lLgotCi1Nb24gT2N0ICA3IDE2OjUyOjExIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChtbjEwMzAwX29wY29kZSk6IEFkZCAiZm9ybWF0IiBmaWVsZC4KLQkoTU4xMDMwMF9PUEVSQU5EXyopOiBEZWZpbmUuCi0KLVRodSBPY3QgIDMgMTA6MzM6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEweDAwLmg6IERlbGV0ZS4KLQkqIG1uMTAyMDAuaCwgbW4xMDMwMC5oOiBOZXcgZmlsZXMuCi0KLVdlZCBPY3QgIDIgMjE6MzE6MjYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEweDAwLmg6IE5ldyBmaWxlLgotCi1GcmkgU2VwIDI3IDE4OjI2OjQ2IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHY4NTAuaDogIEFkZCBuZXcgZmxhZyB0byBpbmRpY2F0ZSB0aGlzIGluc3RydWN0aW9uIHVzZXMgYSBQQwotCWRpc3BsYWNlbWVudC4KLQotRnJpIFNlcCAxMyAxNDo1ODoxMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKHN0bWFjKTogQWRkIG1pc3NpbmcgaW5zdHJ1Y3Rpb24uCi0KLVNhdCBBdWcgMzEgMTY6MDI6MDMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLmggKHY4NTBfb3Bjb2RlKTogUmVtb3ZlICJzaXplIiBmaWVsZC4gIEFkZCAibWVtb3AiCi0JZmllbGQuCi0KLUZyaSBBdWcgMjMgMTA6Mzk6MDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLmggKFY4NTBfT1BFUkFORF9FUCk6IERlZmluZS4KLQotCSogdjg1MC5oICh2ODUwX29wY29kZSk6IEFkZCBzaXplIGZpZWxkLgotCi1UaHUgQXVnIDIyIDE2OjUxOjI1IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oICh2ODUwX29wZXJhbmRzKTogQWRkIGluc2VydCBhbmQgZXh0cmFjdCBmaWVsZHMsIHBvaW50ZXJzCi0gCXRvIGZ1bmN0aW9ucyB1c2VkIHRvIGhhbmRsZSB1bnVzdWFsIG9wZXJhbmQgZW5jb2RpbmcuCi0JKFY4NTBfT1BFUkFORF9SRUcsIFY4NTBfT1BFUkFORF9TUkcsIFY4NTBfT1BFUkFORF9DQywKLSAJVjg1MF9PUEVSQU5EX1NJR05FRCk6IERlZmluZWQuCi0KLVdlZCBBdWcgMjEgMTc6NDU6MTAgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiB2ODUwLmggKHY4NTBfb3BlcmFuZHMpOiBBZGQgZmxhZ3MgZmllbGQuCi0JKE9QRVJBTkRfUkVHLCBPUEVSQU5EX05VTSk6IERlZmluZWQuCi0KLVR1ZSBBdWcgMjAgMTQ6NTI6MDIgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiB2ODUwLmg6IE5ldyBmaWxlLgotCi1GcmkgQXVnIDE2IDE0OjQ0OjE1IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogbWlwcy5oIChPUF9TSF9MT0NDLCBPUF9TSF9ISUNDLCBPUF9NQVNLX0NDLCBPUF9TSF9DT1AxTk9STSwKLSAJT1BfTUFTS19DT1AxTk9STSwgT1BfU0hfQ09QMVNQRUMsIE9QX01BU0tfQ09QMVNQRUMsCi0gCU9QX01BU0tfQ09QMVNDTFIsIE9QX01BU0tfQ09QMUNNUCwgT1BfU0hfQ09QMUNNUCwgT1BfU0hfRk9STUFULAotIAlPUF9NQVNLX0ZPUk1BVCwgT1BfU0hfVFJVRSwgT1BfTUFTS19UUlVFLCBPUF9TSF9HRSwgT1BfTUFTS19HRSwKLSAJT1BfU0hfVU5TSUdORUQsIE9QX01BU0tfVU5TSUdORUQsIE9QX1NIX0hJTlQsIE9QX01BU0tfSElOVCk6Ci0gCURlZmluZWQuCi0KLUZyaSBBdWcgMTYgMDA6MTU6MTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKHBpdGxiLCBwaXRsYmUsIGlpdGxiYSwgaWl0bGJwLCBmaWMsIGZpY2UpOiBBY2NlcHQKLQlhIDMgYml0IHNwYWNlIGlkIGluc3RlYWQgb2YgYSAyIGJpdCBzcGFjZSBpZC4KLQotVGh1IEF1ZyAxNSAxMzoxMTo0NiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi5oOiBBZGQgc29tZSBhZGRpdGlvbmFsIGRlZmluZXMgdG8gc3VwcG9ydCB0aGUKLSAJYXNzZW1ibGVyIGluIGRldGVybWluaW5nIHdoaWNoIG9wZXJhdGlvbnMgY2FuIGJlIGRvbmUgaW4gcGFyYWxsZWwuCi0KLVR1ZSBBdWcgIDYgMTE6MTM6MjIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oIChTTik6IERlZmluZS4KLQkoZWVwbW92LmIpOiBSZW5hbWVkIGZyb20gImVlcG1vdiIKLQkobm9wLCBicHQsIHJ0ZSwgcnRzLCBzbGVlcCwgY2xybWFjKTogVGhlc2UgaGF2ZSBubyBzaXplIGFzc29jaWF0ZWQKLQl3aXRoIHRoZW0uCi0KLUZyaSBKdWwgMjYgMTE6NDc6MTAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYuaCAoT1BFUkFORF9TSElGVCk6IE5ldyBvcGVyYW5kIGZsYWcuCi0KLVRodSBKdWwgMjUgMTI6MDY6MjIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYuaDogQ2hhbmdlcyBmb3IgZGl2cywgcGFyYWxsZWwtb25seSBpbnN0cnVjdGlvbnMsIGFuZAotIAlzaWduZWQgbnVtYmVycy4KLQotTW9uIEp1bCAyMiAxMToyMToxNSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi5oIChwZF9yZWcpOiBEZWZpbmUuIFB1dHRpbmcgdGhlIGRlZmluaXRpb24gaGVyZSBhbGxvd3MKLQl0aGUgYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgdG8gc2hhcmUgdGhlIHNhbWUgc3RydWN0LgotCi1Nb24gSnVsIDIyIDEyOjE1OjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTk2MC5oIChpOTYwX29wY29kZXMpOiAiaGFsdCIgdGFrZXMgYW4gYXJndW1lbnQuICBGcm9tIFN0ZXBoZW4KLQlXaWxsaWFtcyA8c3RldmVAaWNhcnVzLmNvbT4uCi0KLVdlZCBKdWwgMTcgMTQ6NDY6MzggMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYuaDogTmV3IGZpbGUuCi0KLVRodSBKdWwgMTEgMTI6MDk6MTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oIChiYW5kLCBiY2xyKTogRm9yY2UgaGlnaCBiaXQgb2YgaW1tZWRpYXRlIG5pYmJsZSB0byB6ZXJvLgotCi1XZWQgSnVsICAzIDE0OjMwOjEyIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotIAkqIG02OGsuaCAobWNmNTIwMCk6IE5ldyBtYWNyby4KLQlEb2N1bWVudCBuYW1lcyBvZiBjb2xkZmlyZSBjb250cm9sIHJlZ2lzdGVycy4KLQotVHVlIEp1bCAgMiAyMzowNTo0NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKFNSQ19JTl9EU1QpOiBEZWZpbmUuCi0KLQkqIGg4MzAwLmggKFVOT1AzKTogTWFyayB0aGUgcmVnaXN0ZXIgb3BlcmFuZCBpbiB0aGlzIGluc24KLQlhcyBhIHNvdXJjZSBvcGVyYW5kLCBub3QgYSBkZXN0aW5hdGlvbiBvcGVyYW5kLgotCShTSElGVF8yLCBTSElGVF9JTU0pOiBSZW1vdmUuICBFbGltaW5hdGUgYWxsIHJlZmVyZW5jZXMuCi0JKFVOT1AzKTogQ2hhbmdlIFNISUZUX0lNTSB0byBJTU0gZm9yIEg4L1MgYml0b3BzLiAgTWFyawotCXJlZ2lzdGVyIG9wZXJhbmQgd2l0aCBTUkNfSU5fRFNULgotCi1GcmkgSnVuIDIxIDEzOjUyOjE3IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBhbHBoYS5oOiBOZXcgZmlsZS4KLQotVGh1IEp1biAyMCAxNTowMjo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJzNmsuaDogUmVtb3ZlIG9ic29sZXRlIGZpbGUuCi0KLVdlZCBKdW4gMTkgMTU6Mjk6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IENvcnJlY3Qgb3Bjb2RlIHZhbHVlcyBmb3IgZmFkZHAsIGZzdWJwLCBmc3VicnAsIGZtdWxwLAotCWZkaXZwLCBhbmQgZmRpdnJwLiAgQWRkIGZmcmVlcC4KLQotVHVlIEp1biAxOCAxNjowNjowMCAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogaDgzMDAuaDogUmVvcmRlciB2YXJpb3VzICNkZWZpbmVzIGZvciByZWFkYWJpbGl0eS4KLQkoQUJTMzJTUkMsIEFCUzMyRFNULCBEU1AzMkxJU1QsIEFCUzMyTElTVCwgQTMyTElTVCk6IERlZmluZS4KLQkoQklUT1ApOiBBY2NlcHQgYWRkaXRpb25hbCAodW51c2VkKSBhcmd1bWVudC4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JKEVCSVRPUCk6IExpa2V3aXNlLgotCShPX0xBU1QpOiBCdW1wLgotCShsZGMsIHN0YywgbW92YiwgbW92dywgbW92bCk6IFVzZSAzMmJpdCBvZmZzZXRzIGFuZCBhYnNvbHV0ZXMuCi0KLQkqIGg4MzAwLmggKEVYUiwgU0hJRlRfMiwgTUFDUkVHLCBTSElGVF9JTU0sIFJESU5DKTogRGVmaW5lLgotCShPX1RBUywgT19DTFJNQUMsIE9fTERNQUMsIE9fTUFDLCBPX0xETSwgT19TVE0pOiBEZWZpbmUuCi0JKEJJVE9QLCBFQklUT1ApOiBIYW5kbGUgbmV3IEg4L1MgYWRkcmVzc2luZyBtb2RlcyBmb3IKLQliaXQgaW5zbnMuCi0JKFVOT1AzKTogSGFuZGxlIG5ldyBzaGlmdC9yb3RhdGUgaW5zbnMgb24gdGhlIEg4L1MuCi0JKGluc25zIHVzaW5nIGV4cik6IE5ldyBpbnN0cnVjdGlvbnMuCi0JKHRhcywgbWFjLCBsZG1hYywgY2xybWFjLCBsZG0sIHN0bSk6IE5ldyBpbnN0cnVjdGlvbnMuCi0KLVRodSBNYXkgMjMgMTY6NTY6NDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oIChhZGQubCk6IFVuZG8gQXByIDV0aCBjaGFuZ2UuICBUaGUgbWFudWFsIEkgaGFkCi0Jd2FzIGluY29ycmVjdC4KLQotTW9uIE1heSAgNiAyMzozODoyMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKFNUQVJUKTogUmVtb3ZlLgotCShNRU1SRUxBWCk6IERlZmluZS4gIE1hcmsgYWJzb2x1dGUgbWVtb3J5IG9wZXJhbmRzIGluIG1vdi5iLCBtb3YudwotCWFuZCBtb3YubCBpbnNucyB0aGF0IGNhbiBiZSByZWxheGVkLgotCi1UdWUgQXByIDMwIDE4OjMwOjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBSZW1vdmUgQWJzMzIgZnJvbSBsY2FsbC4KLQotTW9uIEFwciAyMiAxNzowOToyMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGJsdWVzLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKFNQQVJDX09QQ09ERV9BUkNIX1Y5X1ApOiBOZXcgbWFjcm8uCi0JKFNMQ1BPUCk6IE5ldyBtYWNyby4KLQlNYXJrIFgsWSBvcGNvZGUgbGV0dGVycyBhcyBpbiB1c2UuCi0KLVRodSBBcHIgMTEgMTc6Mjg6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChGX0ZMT0FULCBGX0ZCUik6IERlZmluZS4KLQotRnJpIEFwciAgNSAxNjo1NTozNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKEFCUzhNRU0pOiBSZW5hbWVkIGZyb20gQUJTTU9WLiAgUmVtb3ZlIEFCU01PVgotCWZyb20gYWxsIGluc25zLgotCShBQlM4U1JDLEFCUzhEU1QpOiBBZGQgQUJTOE1FTS4KLQkoYWRkLmwpOiBGaXggcmVnK3JlZyB2YXJpYW50LgotCShlZXBtb3Yudyk6IFJlbmFtZWQgZnJvbSBlZXBtb3Z3LgotCShsZGMsc3RjKTogRml4IG1hbnkgY2FzZXMuCi0KLVN1biBNYXIgMzEgMTM6MzA6MDMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyk6IE5ldyBtYWNyby4KLQotVGh1IE1hciAgNyAxNTowODoyMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoTyk6IE1hcmsgb3BlcmFuZCBsZXR0ZXIgYXMgaW4gdXNlLgotCi1UdWUgRmViIDIwIDIwOjQ2OjIxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChzcGFyY197ZW5jb2RlLGRlY29kZX1fc3BhcmNsZXRfY3ByZWcpOiBEZWNsYXJlLgotCU1hcmsgb3BlcmFuZCBsZXR0ZXJzIHVVIGFzIGluIHVzZS4KLQotTW9uIEZlYiAxOSAwMTo1OTowOCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoc3BhcmNfb3Bjb2RlX2FyY2hfdmFsKTogQWRkIFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTEVULgotCShzcGFyY19vcGNvZGVfYXJjaCk6IERlbGV0ZSBtZW1iZXIgYGNvbmZsaWN0cycuICBBZGQgYHN1cHBvcnRlZCcuCi0JKFNQQVJDX09QQ09ERV9TVVBQT1JURUQpOiBOZXcgbWFjcm8uCi0JKFNQQVJDX09QQ09ERV9DT05GTElDVF9QKTogUmV3cml0ZS4KLQkoRl9OT1RWOSk6IERlbGV0ZS4KLQotRnJpIEZlYiAxNiAxMjoyMzozNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmggKHNwYXJjX29wY29kZV9sb29rdXBfYXJjaCkgTWFrZSByZXR1cm4gdHlwZSBpbgotCWRlY2xhcmF0aW9uIGNvbnNpc3RlbnQgd2l0aCByZXR1cm4gdHlwZSBpbiBkZWZpbml0aW9uLgotCi1XZWQgRmViIDE0IDE4OjE0OjExIDE5OTYgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogUmVtb3ZlIERhdGEzMiBmcm9tIHB1c2hmIGFuZCBwb3BmLgotCi1UaHUgRmViICA4IDE0OjI3OjIxIDE5OTYgIEphbWVzIENhcmxzb24gPGNhcmxzb25AeHlsb2dpY3MuY29tPgotCi0JKiBpMzg2LmggKGkzODZfcmVndGFiKTogQWRkIDgwNDg2IHRlc3QgcmVnaXN0ZXJzLgotCi1Nb24gRmViICA1IDE4OjM1OjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTk2MC5oIChJX0hYKTogRGVmaW5lLgotCShpOTYwX29wY29kZXMpOiBBZGQgSFggaW5zdHJ1Y3Rpb24uCi0KLU1vbiBKYW4gMjkgMTI6NDM6MzkgMTk5NiAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogRml4IHdhaXRpbmcgZm9ybXMgb2YgZmluaXQsIGZzdGVudiwgZnNhdmUsIGZzdHN3LCBmc3RjdywKLQlhbmQgZmNsZXguCi0KLVdlZCBKYW4gMjQgMjI6MzY6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsKTogUmVwbGFjZXMgc3BhcmNfYXJjaGl0ZWN0dXJlLgotCShTUEFSQ19PUENPREVfQ09ORkxJQ1RfUCk6IFJlbmFtZWQgZnJvbSBBUkNISVRFQ1RVUkVTX0NPTkZMSUNUX1AuCi0JKGJmZF8qIGRlZmluZXMpOiBEZWxldGUuCi0JKHNwYXJjX29wY29kZV9hcmNocyk6IFJlcGxhY2VzIGFyY2hpdGVjdHVyZV9wbmFtZS4KLQkoc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoKTogRGVjbGFyZS4KLQkoTlVNT1BDT0RFUyk6IERlbGV0ZS4KLQotTW9uIEphbiAyMiAwODoyNDozMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoZW51bSBzcGFyY19hcmNoaXRlY3R1cmUpOiBBZGQgdjlhLgotCShBUkNISVRFQ1RVUkVTX0NPTkZMSUNUX1ApOiBVcGRhdGUuCi0KLVRodSBEZWMgMjggMTM6Mjc6NTMgMTk5NSAgSm9obiBIYXNzZXkgIDxoYXNzZXlAcnRwLmRnLmNvbT4KLQotCSogaTM4Ni5oOiBBZGRlZCBQZW50aXVtIFBybyBpbnN0cnVjdGlvbnMuCi0KLVRodSBOb3YgIDIgMjI6NTk6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLmg6IERvY3VtZW50IG5ldyAnVycgb3BlcmFuZCBwbGFjZS4KLQotVHVlIE9jdCAyNCAxMDo0OToxMCAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaDogQWRkIGxjaSBhbmQgc3luY2RtYSBpbnN0cnVjdGlvbnMuCi0KLU1vbiBPY3QgMjMgMTE6MDk6MTYgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAcGFzYW5kYS5jeWdudXMuY28udWs+Ci0KLQkqIG1pcHMuaDogQWRkZWQgSU5TTl80MTAwIGZsYWcgdG8gbWFyayBORUMgVlI0MTAwIHNwZWNpZmljCi0gCWluc3RydWN0aW9ucy4KLQotTW9uIE9jdCAxNiAxMDoyODoxNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy5oIChQUENfT1BDT0RFX3tDT01NT04sQU5ZfSk6IE5ldyBvcGNvZGUgZmxhZ3MgZm9yCi0JYXNzZW1ibGVyJ3MgLW1jb20gYW5kIC1tYW55IHN3aXRjaGVzLgotCi1XZWQgT2N0IDExIDE2OjU2OjMzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IEZpeCBjbXB4Y2hnOGIgZXh0ZW5zaW9uIG9wY29kZSBkZXNjcmlwdGlvbi4KLQotVGh1IE9jdCAgNSAxODowMzozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBBZGQgUGVudGl1bSBpbnN0cnVjdGlvbnMgd3Jtc3IsIHJkdHNjLCByZG1zciwgY21weGNoZzhiLAotCWFuZCByZWdpc3RlciBjcjQuCi0KLVR1ZSBTZXAgMTkgMTU6MjY6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLmg6IENoYW5nZSBjb21tZW50OiBzcGxpdCB0eXBlIFAgaW50byB0eXBlcyAwLCAxIGFuZCAyLgotCi1XZWQgQXVnIDMwIDEzOjUwOjU1IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKHNwYXJjX3tlbmNvZGUsZGVjb2RlfV9wcmVmZXRjaCk6IERlY2xhcmUuCi0KLVR1ZSBBdWcgMjkgMTU6MzQ6NTggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoc3BhcmNfe2VuY29kZSxkZWNvZGV9X3thc2ksbWVtYmFyfSk6IERlY2xhcmUuCi0KLVdlZCBBdWcgIDIgMTg6MzI6MTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrbXJpLmg6IFJlbW92ZS4KLQotCSogbTY4ay5oOiBNb3ZlIHRhYmxlcyBpbnRvIG9wY29kZXMvbTY4ay1vcGMuYywgbGVhdmluZyBqdXN0IHRoZQotCWRlY2xhcmF0aW9ucy4gIFJlbW92ZSBGX0FMSUFTIGFuZCBmbGFnIGZpZWxkIG9mIHN0cnVjdAotCW02OGtfb3Bjb2RlLiAgQ2hhbmdlIGFyY2ggZmllbGQgb2Ygc3RydWN0IG02OGtfb3Bjb2RlIHRvIHVuc2lnbmVkCi0JaW50LiAgTWFrZSBuYW1lIGFuZCBhcmdzIGZpZWxkcyBvZiBzdHJ1Y3QgbTY4a19vcGNvZGUgY29uc3QuCi0KLVdlZCBBdWcgIDIgMDg6MTY6NDYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoRl9OT1RWOSk6IERlZmluZS4KLQotVHVlIEp1bCAxMSAxNDoyMDo0MiAxOTk1ICBKZWZmIFNwaWVnZWwgIDxqZWZmc0Bsc2lsLmNvbT4KLQotCSogbWlwcy5oIChJTlNOXzQwMTApOiBEZWZpbmUuCi0KLVdlZCBKdW4gMjEgMTg6NDk6NTEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbTY4ay5oIChUQkwxKTogUmV2ZXJzZSBzZW5zZSBvZiAicm91bmQiIGFyZ3VtZW50IGluIHJlc3VsdC4KLQotCUNoYW5nZXMgZnJvbSBBbmRyZWFzIFNjaHdhYiA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPjoKLQkqIG02OGsuaDogRml4IGFyZ3VtZW50IGRlc2NyaXB0aW9ucyBvZiBjb3Byb2Nlc3NvcgotCWluc3RydWN0aW9ucyB0byBhbGxvdyBvbmx5IGFsdGVyYWJsZSBvcGVyYW5kcyB3aGVyZSBhcHByb3ByaWF0ZS4KLQlbIU5PX0RFRkFVTFRfU0laRVNdOiBBbiBvbWl0dGVkIHNpemUgZGVmYXVsdHMgdG8gYHcnLgotCShtNjhrX29wY29kZV9hbGlhc2VzKTogQWRkIG1vcmUgYWxpYXNlcy4KLQotRnJpIEFwciAxNCAyMjoxNTozNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtNjhrLmg6IEFkZGVkIGV4cGxjaXRseSBzaG9ydC1zaXplZCBjb25kaXRpb25hbCBicmFuY2hlcywgYW5kIGEKLQlidW5jaCBvZiBhbGlhc2VzIChmbW92KiwgZnRlc3QqLCB0ZGl2dWwpIHRvIHN1cHBvcnQgZ2NjJ3MKLQlzdnI0LWJhc2VkIGNvbmZpZ3VyYXRpb25zLgotCi1Nb24gTWFyIDEzIDIxOjMwOjAxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlNb24gRmViIDI3IDA4OjM2OjM5IDE5OTUgIEJyeWFuIEZvcmQgIDxiYWZvcmRAY3MudXRhaC5lZHU+Ci0JKiBpMzg2Lmg6IGFkZGVkIG1pc3NpbmcgRGF0YTE2L0RhdGEzMiBmbGFncyB0byBhIGZldyBpbnN0cnVjdGlvbnMuCi0KLVdlZCBNYXIgIDggMTU6MTk6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKE9QX01BU0tfRlIsIE9QX1NIX0ZSKTogRGVmaW5lLgotCShPUF9NQVNLX0JDQywgT1BfU0hfQkNDKTogRGVmaW5lLgotCShPUF9NQVNLX1BSRUZYLCBPUF9TSF9QUkVGWCk6IERlZmluZS4KLQkoT1BfTUFTS19DQ0MsIE9QX1NIX0NDQyk6IERlZmluZS4KLQkoSU5TTl9SRUFEX0ZQUl9SKTogRGVmaW5lLgotCShJTlNOX1JGRSk6IERlbGV0ZS4KLQotV2VkIE1hciAgOCAwMzoxMzoyMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtNjhrLmggKGVudW0gbTY4a19hcmNoaXRlY3R1cmUpOiBEZWxldGVkLgotCShzdHJ1Y3QgbTY4a19vcGNvZGVfYWxpYXMpOiBOZXcgdHlwZS4KLQkobTY4a19vcGNvZGVzKTogTm93IGNvbnN0LiAgRGVsZXRlZCBvcGNvZGUgYWxpYXNlcyB3aXRoIGV4YWN0bHkKLQltYXRjaGluZyBjb25zdHJhaW50cywgdmFsdWVzIGFuZCBmbGFncy4gIEFzIGEgc2lkZSBlZmZlY3Qgb2YgdGhpcywKLQl0aGUgTU9UT1JPTEFfU1lOVEFYX09OTFkgYW5kIE1JVF9TWU5UQVhfT05MWSBtYWNyb3MsIHdoaWNoIHNvIGZhcgotCWFzIEkga25vdyB3ZXJlIG5ldmVyIHVzZWQsIG5vdyBtYXkgbmVlZCByZS1leGFtaW5pbmcuCi0JKG51bW9wY29kZXMpOiBOb3cgY29uc3QuCi0JKG02OGtfb3Bjb2RlX2FsaWFzZXMsIG51bWFsaWFzZXMpOiBOZXcgdmFyaWFibGVzLgotCShlbmRvcCk6IERlbGV0ZWQuCi0JW0RPTlRfREVGSU5FX1RBQkxFXTogRGVjbGFyZSBudW1vcGNvZGVzLCBudW1hbGlhc2VzLCBhbmQKLQltNjhrX29wY29kZV9hbGlhc2VzOyB1cGRhdGUgZGVjbGFyYXRpb24gb2YgbTY4a19vcGNvZGVzLgotCi1Nb24gTWFyICA2IDEwOjAyOjAwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmggKGRlbGF5X3R5cGUpOiBEZWxldGUgdW51c2VkIGVudW1lcmF0aW9uLgotCShwYV9vcGNvZGUpOiBSZXBsYWNlIHVudXNlZCBkZWxheWVkIGZpZWxkIHdpdGggYW4gYXJjaGl0ZWN0dXJlCi0JZmllbGQuCi0JKHBhX29wY29kZXMpOiBNYXJrIGVhY2ggaW5zdHJ1Y3Rpb24gYXMgZWl0aGVyIFBBMS4wIG9yIFBBMS4xLgotCi1GcmkgTWFyICAzIDE2OjEwOjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChJTlNOX0lTQTQpOiBEZWZpbmUuCi0KLUZyaSBGZWIgMjQgMTk6MTM6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKE1fRExBX0FCLCBNX0RMSSk6IERlZmluZS4KLQotVGh1IEZlYiAyMyAxNzozMzowOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oIChmc3R3eCk6IEZpeCBzaW5nbGUtYml0IGVycm9yLgotCi1XZWQgRmViIDE1IDEyOjE5OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChNX1VMRCwgTV9VTERfQSwgTV9VU0QsIE1fVVNEX0EpOiBEZWZpbmUuCi0KLU1vbiBGZWIgIDYgMTA6MzU6MjMgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IGFkZGVkIGNwdWlkIGluc3RydWN0aW9uICwgYW5kIGRyWzAtN10gYWxpYXNlcyBmb3IgdGhlCi0JICBkZWJ1ZyByZWdpc3RlcnMuICBGcm9tIENoYXJsZXMgSGFubnVtIChteWNyb2Z0QG5ldGJzZC5vcmcpLgotCi1Nb24gRmViICA2IDAzOjMxOjU0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlDaGFuZ2VzIGZyb20gQnJ5YW4gRm9yZCA8YmFmb3JkQHNjaGlyZi5jcy51dGFoLmVkdT4gZm9yIDE2LWJpdAotCWkzODYgc3VwcG9ydDoKLQkqIGkzODYuaCAoTU9WX0FYX0RJU1AzMik6IE5ldyBtYWNyby4KLQkoaTM4Nl9vcHRhYik6IEFkZGVkIERhdGExNiBhbmQgRGF0YTMyIGFzIG5lZWRlZC4gIEFkZGVkICJ3IiBmb3JtcwotCW9mIHNldmVyYWwgY2FsbC9yZXR1cm4gaW5zdHJ1Y3Rpb25zLgotCShBRERSX1BSRUZJWF9PUENPREUpOiBOZXcgbWFjcm8uCi0KLU1vbiBKYW4gMjMgMTY6NDU6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCVNhdCBKYW4gMjEgMTc6NTA6MzggMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIC4uL2luY2x1ZGUvb3Bjb2RlL3ZheC5oIChzdHJ1Y3Qgdm90X3dvdCwgZmllbGQgYGFyZ3MnKTogIG1ha2UKLQlpdCBwb2ludGVyIHRvIGNvbnN0IGNoYXI7Ci0JKHN0cnVjdCB2b3QsIGZpZWxkIGBuYW1lJyk6ICBkaXR0by4KLQotVGh1IEphbiAxOSAxNDo0Nzo1MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiB2YXguaDogU3VwcGx5IGFuZCBwcm9wZXJseSBncm91cCBhbGwgdmFsdWVzIGluIGVuZCBzZW50aW5lbC4KLQotVHVlIEphbiAxNyAxMDo1NTozMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoSU5TTl9JU0EsIElOU05fNDY1MCk6IERlZmluZS4KLQotV2VkIE9jdCAxOSAxMzozNDoxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGEyOWsuaDogQWRkIG9wZXJhbmQgdHlwZSAnSScgZm9yIGBpbnYnIGFuZCBgaXJldGludicuICBPbgotCXN5c3RlbXMgd2l0aCBhIHNlcGFyYXRlIGluc3RydWN0aW9uIGFuZCBkYXRhIGNhY2hlLCBzdWNoIGFzIHRoZQotCTI5MDQwLCB0aGVzZSBpbnN0cnVjdGlvbnMgdGFrZSBhbiBvcHRpb25hbCBhcmd1bWVudC4KLQotV2VkIFNlcCAxNCAxNzo0NDoyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoSU5TTl9TVE9SRV9NRU1PUlkpOiBDb3JyZWN0IHZhbHVlIHRvIG5vdCBjb25mbGljdCB3aXRoCi0JSU5TTl9UUkFQLgotCi1UdWUgU2VwICA2IDExOjM5OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChJTlNOX1NUT1JFX01FTU9SWSk6IERlZmluZS4KLQotVGh1IEp1bCAyOCAxOToyODowNyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiBEb2N1bWVudCBuZXcgb3BlcmFuZCB0eXBlICd4Jy4KLQotVHVlIEp1bCAyNiAxNzo0ODowNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpOTYwLmggKElfQ1gyKTogTmV3IGluc3RydWN0aW9uIGNhdGVnb3J5LiAgSXQgaW5jbHVkZXMKLQlpbnN0cnVjdGlvbnMgYXZhaWxhYmxlIG9uIEN4IGFuZCBKeCBwcm9jZXNzb3JzLgotCShJX0pYKTogTmV3IGluc3RydWN0aW9uIGNhdGVnb3J5LCBmb3IgSlgtb25seSBpbnN0cnVjdGlvbnMuCi0JKGk5NjBfb3Bjb2Rlcyk6IFB1dCBlc2hybyBhbmQgc3lzY3RsIGluIElfQ1gyIGNhdGVnb3J5LiAgQWRkZWQKLQlKeC1vbmx5IGluc3RydWN0aW9ucywgaW4gSV9KWCBjYXRlZ29yeS4KLQotV2VkIEp1bCAxMyAxODo0Mzo0NyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBuczMyay5oIChlbmRvcCk6IE1hZGUgcG9pbnRlciBjb25zdCB0b28uCi0KLVN1biBKdWwgMTAgMTE6MDE6MDkgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCi0KLQkqIG5zMzJrLmg6IERyb3AgUSBvcGVyYW5kIHR5cGUgYXMgdGhlcmUgaXMgbm8gY29ycmVjdCB1c2UKLQlmb3IgaXQuIEFkZCBJIGFuZCBaIG9wZXJhbmQgdHlwZXMgd2hpY2ggYWxsb3cgYmV0dGVyIGNoZWNraW5nLgotCi1UaHUgSnVsICA3IDEyOjM0OjQ4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmggKHhvci5sKSA6Zml4IGJpdCBwYXR0ZXJuLgotCShMXzIpOiBOZXcgc2l6ZSBvZiBvcGVyYW5kLgotCSh0cmFwYSk6IFVzZSBpdC4KLQotRnJpIEp1biAxMCAxNjozODoxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogTW92ZSAidHJhcCIgYmVmb3JlICJ0cGNjIiB0byBjaGFuZ2UgZGlzYXNzZW1ibHkuCi0KLUZyaSBKdW4gIDMgMTU6NTc6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogSW5jbHVkZSB2OSBkZWZpbml0aW9ucy4KLQotVGh1IEp1biAgMiAxMjoyMzoxNyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBtNjhrLmggKG02ODA2MCk6IERlZmluZWQuCi0JKG02ODA0MHVwLCBtZmxvYXQsIG1tbXUpOiBJbmNsdWRlIGl0LgotCShzdHJ1Y3QgbTY4a19vcGNvZGUpOiBXaWRlbiBgYXJjaCcgZmllbGQuCi0JKG02OGtfb3Bjb2Rlcyk6IFVwZGF0ZWQgZm9yIE02ODA2MC4gIFJlbW92ZWQgY29tbWVudHMgdGhhdCB3ZXJlCi0JaW5zdHJ1Y3Rpb25zIGNvbW1lbnRlZCBvdXQgYnkgIkpGIiB5ZWFycyBhZ28uCi0KLVRodSBBcHIgMjggMTg6MzE6MTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oIChzdHJ1Y3QgbTY4a19vcGNvZGUpOiBTaG9ydGVuIGBhcmNoJyBmaWVsZCB0byA4IGJpdHMsIGFuZAotCWFkZCBhIG9uZS1iaXQgYGZsYWdzJyBmaWVsZC4KLQkoRl9BTElBUyk6IE5ldyBtYWNyby4KLQotV2VkIEFwciAyNyAxMToyOTo1MiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oIChkZWMsIGluYyk6IEdldCBlbmNvZGluZyByaWdodC4KLQotTW9uIEFwciAgNCAxMzoxMjo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy5oIChzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kKTogUmVtb3ZlZCBzaWduZWRwIGZpZWxkOyBqdXN0IHVzZQotCWEgZmxhZyBpbnN0ZWFkLgotCShQUENfT1BFUkFORF9TSUdORUQpOiBEZWZpbmUuCi0JKFBQQ19PUEVSQU5EX1NJR05PUFQpOiBEZWZpbmUuCi0KLVRodSBNYXIgMzEgMTk6MzQ6MDggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oIChJU19KVU1QX09OX0VDWF9aRVJPLCAiamN4eiIgcGF0dGVybik6IE9wZXJhbmQgc2l6ZQotCXByZWZpeCBpcyAweDY2LCBub3QgMHg2Ny4gIFBhdGNoIGZyb20gSC5KLiBMdSAoaGx1QG55bmV4c3QuY29tKS4KLQotVGh1IE1hciAgMyAxNTo1MTowNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IFJldmVyc2UgbGFzdCBjaGFuZ2UuICBJdCdsbCBiZSBoYW5kbGVkIGluIGdhcyBpbnN0ZWFkLgotCi1UaHUgRmViIDI0IDE1OjI5OjA1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaCAoc2FyKTogRGlzYWJsZWQgdGhlIHR3by1vcGVyYW5kIEltbTEgZm9ybSwgc2luY2UgaXQgd2FzCi0Jc2xvd2VyIG9uIHRoZSA0ODYgYW5kIHVzZWQgdGhlIGltcGxpY2l0IHNoaWZ0IGNvdW50IGRlc3BpdGUgdGhlCi0JZXhwbGljaXQgb3BlcmFuZC4gIFRoZSBvbmUtb3BlcmFuZCBmb3JtIGlzIHN0aWxsIGF2YWlsYWJsZSB0byBnZXQKLQl0aGUgc2hvcnRlciBmb3JtIHdpdGggdGhlIGltcGxpY2l0IHNoaWZ0IGNvdW50LgotCi1UaHUgRmViIDE3IDEyOjI3OjUyIDE5OTQgIFRvcmJqb3JuIEdyYW5sdW5kICAodGVnZUBtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuaDogRml4IHR5cG8gaW4gZnN0d3MgYXJnIHN0cmluZy4KLQotV2VkIEZlYiAgOSAyMToyMzo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy5oIChzdHJ1Y3QgcG93ZXJwY19vcGNvZGUpOiBNYWtlIG9wZXJhbmRzIGZpZWxkIHVuc2lnbmVkLgotCi1Nb24gRmViICA3IDE5OjE0OjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLmggKFBQQ19PUENPREVfNjAxKTogRGVmaW5lLgotCi1GcmkgRmViICA0IDIzOjQzOjUwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmggKGFkZGIpOiBVc2UgJ0AnIGZvciBhZGRiIGFuZCBhZGRpYiBwc2V1ZG8gb3BzLgotCShzbyB3ZSBjYW4gZGV0ZXJtaW5lIHZhbGlkIGNvbXBsZXRlcnMgZm9yIGJvdGggYWRkYiBhbmQgYWRkYlt0Zl0uKQotCi0JKiBocHBhLmggKHhtcHl1KTogTm8gZmxvYXRpbmcgcG9pbnQgZm9ybWF0IHNwZWNpZmllciBmb3IgdGhlCi0JeG1weXUgaW5zdHJ1Y3Rpb24uCi0KLUZyaSBGZWIgIDQgMjM6MzY6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMuaCAoUFBDX09QRVJBTkRfTkVYVCk6IERlZmluZS4KLQkoUFBDX09QRVJBTkRfTkVHQVRJVkUpOiBDaGFuZ2UgdmFsdWUgdG8gbWFrZSByb29tIGZvciBhYm92ZS4KLQkoc3RydWN0IHBvd2VycGNfbWFjcm8pOiBEZWZpbmUuCi0JKHBvd2VycGNfbWFjcm9zLCBwb3dlcnBjX251bV9tYWNyb3MpOiBEZWNsYXJlLgotCi1GcmkgSmFuIDIxIDE5OjEzOjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLmg6IE5ldyBmaWxlLiAgSGVhZGVyIGZpbGUgZm9yIFBvd2VyUEMgb3Bjb2RlIHRhYmxlLgotCi1Nb24gSmFuIDE3IDAwOjE0OjIzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmg6IE1vcmUgbWlub3IgdGVtcGxhdGUgZml4ZXMgZm9yIHNmdSBhbmQgY29wciAodG8gYWxsb3cKLQlmb3IgZWFzaWVyIGRpc2Fzc2VtYmx5KS4KLQotCSogaHBwYS5oOiBGaXggdGVtcGxhdGVzIGZvciBhbGwgdGhlIHNmdSBhbmQgY29wciBpbnN0cnVjdGlvbnMuCi0KLVdlZCBEZWMgMTUgMTU6MTI6NDIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oIChwdXNoKTogUGVybWl0IEltbTE2IG9wZXJhbmQgdG9vLgotCi1TYXQgRGVjIDExIDE2OjE0OjA2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiAgaDgzMDAuaCAoYW5kYyk6IEV4aXN0cyBpbiBiYXNlIGFyY2guCi0KLVdlZCBEZWMgIDEgMTI6MTU6MzIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIEZyb20gSGlzYXNoaSBNSU5BTUlOTyA8bWluYW1pbm9Ac3JhbWhjLnNyYS5jby5qcD4KLQkqIGhwcGEuaDogI3VuZGVmIE5PTkUgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBoaXV4IGluY2x1ZGUgZmlsZXMuCi0KLVN1biBOb3YgMjEgMjI6MDY6NTcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEuaDogQWRkIEZQIHF1YWR3b3JkIHN0b3JlIGluc3RydWN0aW9ucy4KLQotV2VkIE5vdiAxNyAxNzoxMzoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogKE1fSl9BKTogQWRkZWQuCi0JKE1fTEEpOiBSZW1vdmVkLgotCi1Nb24gTm92ICA4IDEyOjEyOjQ3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChPUF9NQVNLX0NBQ0hFLCBPUF9TSF9DQUNIRSk6IERlZmluZS4gIEZyb20gVGVkIExlbW9uCi0JPG1lbGxvbkBwZXBwZXIubmNkLmNvbT4uCi0KLVN1biBOb3YgIDcgMDA6MzA6MTEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEuaDogSW1tZWRpYXRlIGZpZWxkIGluIHByb2JlaSBpbnN0cnVjdGlvbnMgaXMgdW5zaWduZWQsCi0Jbm90IGxvdy1zaWduIGV4dGVuZGVkLgotCi1XZWQgTm92ICAzIDEwOjMwOjAwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBtODhrLmggKFJSSTEwTUFTSyk6IENoYW5nZSBmcm9tIDB4ZmMwMGZmZTAgdG8gMHhmYzAwZmMwMC4KLQotVHVlIE5vdiAgMiAxMjo0MTozMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBBZGQgImZ4Y2giIHdpdGhvdXQgb3BlcmFuZC4KLQotTW9uIE5vdiAgMSAxODoxMzowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoTV9KQUxfMSwgTV9KQUxfMiwgTV9KQUxfQSk6IEFkZGVkLgotCi1TYXQgT2N0ICAyIDIyOjI2OjExIDE5OTMgIEplZmZyZXkgQSBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEuaDogQWRkIGdmdyBhbmQgZ2ZyIHRvIHRoZSBvcGNvZGUgdGFibGUuCi0KLVdlZCBTZXAgMjkgMTY6MjM6MDAgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBtODhrLmg6IGV4dGVuZGVkIHRvIGhhbmRsZSBtODgxMTAuCi0KLVR1ZSBTZXAgMjggMTk6MTk6MDggMTk5MyAgSmVmZnJleSBBIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oIChiZSwgYmxlKTogVXNlIG9wZXJhbmQgdHlwZSAneicgdG8gZGVub3RlIGFic29sdXRlIGJyYW5jaAotCWFkZHJlc3Nlcy4KLQotVHVlIFNlcCAxNCAxNDowNDozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGk5NjAuaCAoaTk2MF9vcGNvZGVzKTogUHJvcGVybHkgYnJhY2tldCBpbml0aWFsaXplcnMuCi0KLU1vbiBTZXAgMTMgMTI6NTA6NTIgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBtODhrLmggKEJPRkxBRyk6IHJld3JpdGUgdG8gYXZvaWQgbmVzdGVkIGNvbW1lbnQuCi0KLU1vbiBTZXAgMTMgMTU6NDY6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtNjhrLmggKHR3byk6IFByb3RlY3Qgc2Vjb25kIGFyZ3VtZW50IHdpdGggcGFyZW50aGVzZXMuCi0KLUZyaSBTZXAgMTAgMTY6Mjk6NDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBBZGRlZCBuZXcgaW5zdHJ1Y3Rpb24gInJzbSIgKGZvciBpMzg2c2wpLgotCURlbGV0ZWQgb2xkIGluL291dCBpbnN0cnVjdGlvbnMgaW4gIiNpZiAwIiBzZWN0aW9uLgotCi1UaHUgU2VwICA5IDE3OjQyOjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogUHJvcGVybHkgYnJhY2tldCBpbml0aWFsaXplcnMuCi0KLVdlZCBBdWcgMjUgMTM6NTA6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBocHBhLmggKHBhX29wY29kZSk6IFVzZSAnfCcgZm9yIG1vdmIgYW5kIG1vdmliIGluc25zLiAgKEZyb20KLQlKZWZmIExhdywgbGF3QGNzLnV0YWguZWR1KS4KLQotTW9uIEF1ZyAyMyAxNjo1NTowMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaCAobGNhbGwpOiBBY2NlcHQgSW1tMzIgb3BlcmFuZCBhbHNvLgotCi1Nb24gQXVnIDIzIDEyOjQzOjExIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChNX0FCU1UpOiBSZW1vdmVkIChhYnNvbHV0ZSB2YWx1ZSBvZiB1bnNpZ25lZCBudW1iZXI/PykuCi0JKE1fREFCUyk6IEFkZGVkLgotCi1UaHUgQXVnIDE5IDE1OjA4OjM3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChJTlNOXyopOiBDaGFuZ2VkIHZhbHVlcy4gIFJlbW92ZWQgdW51c2VkIGRlZmluaXRpb25zLgotCUFkZGVkIElOU05fQ09ORF9CUkFOQ0hfTElLRUxZLCBJTlNOX0lTQTIgYW5kIElOU05fSVNBMy4gIFNwbGl0Ci0JSU5TTl9MT0FEX0RFTEFZIGludG8gSU5TTl9MT0FEX01FTU9SWV9ERUxBWSBhbmQKLQlJTlNOX0xPQURfQ09QUk9DX0RFTEFZLiAgU3BsaXQgSU5TTl9DT1BST0NfREVMQVkgaW50bwotCUlOU05fQ09QUk9DX01PVkVfREVMQVkgYW5kIElOU05fQ09QUk9DX01FTU9SWV9ERUxBWS4KLQkoTV8qKTogQWRkZWQgbmV3IHZhbHVlcyBmb3IgcjYwMDAgYW5kIHI0MDAwIG1hY3Jvcy4KLQkoQU5ZX0RFTEFZKTogUmVtb3ZlZC4KLQotV2VkIEF1ZyAxOCAxNTozNzo0OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogQWRkZWQgTV9MSV9TIGFuZCBNX0xJX1NTLgotCi1UdWUgQXVnIDE3IDA3OjA4OjA4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6IEdldCBzb21lIHJhcmUgbW92LmJzIGNvcnJlY3QuCi0KLVRodSBBdWcgIDUgMDk6MTU6MTcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6IERvbid0IGRlZmluZSBjb25zdCBvdXJzZWxmOyByZWx5IG9uIGFuc2lkZWNsLmggaGF2aW5nCi0JYmVlbiBpbmNsdWRlZC4KLQotRnJpIEp1bCAzMCAxODo0MToxMSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaCAoRl9KU1IsIEZfVU5CUiwgRl9DT05EQlIpOiAgQWRkIG5ldyBmbGFncyB0byBtYXJrCi0JanVtcCBpbnN0cnVjdGlvbnMsIGZvciB1c2UgaW4gZGlzYXNzZW1ibGVycy4KLQotVGh1IEp1bCAyMiAwNzoyNToyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG04OGsuaDogTWFrZSBiaXRmaWVsZHMganVzdCB1bnNpZ25lZCwgbm90IHVuc2lnbmVkIGxvbmcgb3IKLQl1bnNpZ25lZCBzaG9ydC4KLQotV2VkIEp1bCAyMSAxMTo1NTozMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oOiBOZXcgYXJndW1lbnQgdHlwZSAneScuICBVc2UgaW4gdmFyaW91cyBmbG9hdCBpbnN0cnVjdGlvbnMuCi0KLU1vbiBKdWwgMTkgMTc6MTc6MDMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAoYnJlYWspOiBGaXJzdCBpbW1lZGlhdGUgZmllbGQgaXMgdW5zaWduZWQuCi0KLQkqIGhwcGEuaDogQWRkIHJmaXIgaW5zdHJ1Y3Rpb24uCi0KLVN1biBKdWwgMTggMTY6Mjg6MDggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtaXBzLmg6IFNwbGl0IHRoZSBhY3R1YWwgdGFibGUgb3V0IGludG8gLi4vLi4vb3Bjb2Rlcy9taXBzLW9wYy5jLgotCi1GcmkgSnVsIDE2IDA5OjU5OjI5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiBSZXdvcmtlZCB0aGUgaGF6YXJkIGluZm9ybWF0aW9uIHNvbWV3aGF0LCBhbmQgZml4ZWQgc29tZQotCWJ1Z3MgaW4gdGhlIGluc3RydWN0aW9uIGhhemFyZCBkZXNjcmlwdGlvbnMuCi0KLVRodSBKdWwgMTUgMTI6NDI6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtODhrLmg6IENvcnJlY3RlZCBhIGNvdXBsZSBvZiBvcGNvZGVzLgotCi1UdWUgSnVsICA2IDE1OjE3OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiBSZXBsYWNlZCB3aXRoIHZlcnNpb24gZnJvbSBSYWxwaCBDYW1wYmVsbCBhbmQgT1NGLiAgVGhlCi0JbmV3IHZlcnNpb24gaW5jbHVkZXMgaW5zdHJ1Y3Rpb24gaGF6YXJkIGluZm9ybWF0aW9uLCBidXQgaXMKLQlvdGhlcndpc2UgcmVhc29uYWJseSBzaW1pbGFyLgotCi1UaHUgSnVsICAxIDIwOjM2OjE3IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6IEZpeCB0eXBvIGluIFVOT1AzIChhZmZlY3RlZCBzaFthbF1bbHJdLmwpLgotCi1GcmkgSnVuIDExIDE4OjM4OjQ0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JUGF0Y2hlcyBmcm9tIEplZmYgTGF3LCBsYXdAY3MudXRhaC5lZHU6Ci0JKiBocHBhLmg6IENsZWFuIHVwIHNvbWUgb2YgdGhlIE9MRF9UQUJMRSwgbm9uLU9MRF9UQUJMRSBicmFpbmRhbWFnZS4KLQlNYWtlIHRoZSB0YWJsZXMgYmUgdGhlIHNhbWUgZm9yIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zOgotCSJiYiIsICJhZGRiW3RmXSIsICJhZGRpYlt0Zl0iLCAiYWRkIiwgImFkZFtsb2NdIiwgImFkZGNvIiwKLQkic2hbMTIzXWFkZCIsICJzaFsxMjNdYWRkW2xvXSIsICJzdWIiLCAic3ViW29idF0iLCAic3ViW2J0XW8iLAotCSJkcyIsICJjb21jbHIiLCAiYWRkaSIsICJhZGRpW290XSIsICJhZGRpdG8iLCAic3ViaSIsICJzdWJpbyIsCi0JImNvbWljbHIiLCAiZmFkZCIsICJmc3ViIiwgImZtcHkiLCAiZmRpdiIsICJmc3FydCIsICJmYWJzIiwKLQkiZnJuZCIsICJmY3B5IiwgImZjbnZmZiIsICJmY252eGYiLCAiZmNudmZ4IiwgImZjbnZmeHQiLAotCSJmY21wIiwgYW5kICJmdGVzdCIuCi0KLQkqIGhwcGEuaDogTWFrZSBuZXcgYW5kIG9sZCB0YWJsZXMgdGhlIHNhbWUgZm9yICJicmVhayIsICJtdGN0bCIsCi0JIm1mY3RsIiwgImJiIiwgInNzbSIsICJyc20iLCAieG1weXUiLCAiZm1weWFkZCIsICJmbXB5c3ViIi4KLQlGaXggdHlwbyBpbiBsYXN0IHBhdGNoLiAgQ29sbGFwc2Ugc2V2ZXJhbCAjaWZkZWZzIGludG8gYQotCXNpbmdsZSAjaWZkZWYuCi0KLQkqIGhwcGEuaDogRGVsZXRlIHJlbWFpbmluZyBPTERfVEFCTEUgY29kZS4gIEJyaW5nIHNvbWUKLQlvZiB0aGUgY29tbWVudHMgdXAtdG8tZGF0ZS4KLQotCSogaHBwYS5oOiBVcGRhdGUgImZyZWUgbGlzdCIgb2YgbGV0dGVycyBhbmQgdXBkYXRlCi0JY29tbWVudHMgZGVzY3JpYmluZyBlYWNoIGxldHRlcidzIGZ1bmN0aW9uLgotCi1GcmkgSnVuICA0IDE1OjQxOjM3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6IGNoZWNrcG9pbnQsIGluY2x1ZGVzIEg4LzMwMC1IIG9wY29kZXMuCi0KLVRodSBKdW4gIDMgMTU6NDI6NTkgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogUGF0Y2hlcyBmcm9tIEplZmZyZXkgTGF3IDxsYXdAY3MudXRhaC5lZHU+LgotCSogaHBwYS5oOiBSZXdvcmsgc2luZ2xlIHByZWNpc2lvbiBGUAotCWluc3RydWN0aW9ucyBzbyB0aGF0IHRoZXkgY29ycmVjdGx5IGRpc2Fzc2VtYmxlIGNvZGUKLQlQQTEuMSBjb2RlLgotCi1UaHUgTWF5IDI3IDE5OjIxOjIyIDE5OTMgIEJydWNlIEJhdW1hbiAgKGJvb3RAb3NmLm9yZykKLQotCSogaTM4Ni5oIChpMzg2X29wdGFiLCBtb3YgcGF0dGVybik6IFJlbW92ZSBNZW0xNiByZXN0cmljdGlvbiBmcm9tCi0JbW92IHRvIGFsbG93IGluc3RydWN0aW9ucyBsaWtlIG1vdiBzcyx4eXooZWN4KSB0byBhc3NlbWJsZS4KLQotVHVlIE1heSAyNSAwMDozOTo0MCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oOiBVc2UgbmV3IHZlcnNpb24gZnJvbSBVdGFoIGlmIE9MRF9UQUJMRSBpc24ndCBkZWZpbmVkOwotCWdkYiB3aWxsIGRlZmluZSBpdCBmb3Igbm93LgotCi1Nb24gTWF5IDI0IDE1OjIwOjA2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogRG9uJ3QgZW5kIGVudW1lcmF0b3IgbGlzdCB3aXRoIGNvbW1hLgotCi1GcmkgTWF5IDE0IDE1OjE1OjUwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogQmFzZWQgb24gcGF0Y2hlcyBmcm9tIGRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQgSm9obnNvbik6Ci0JKiBtaXBzLmggKE9QX01BU0tfQ09QWiwgT1BfU0hfQ09QWik6IERlZmluZS4KLQkoImJjMnQiKTogQ29ycmVjdCB0eXBvLgotCSgiW2xzXXdjWzAyM10iKTogVXNlIFQgcmF0aGVyIHRoYW4gdC4KLQkoImNbMDEyM10iKTogRGVmaW5lIGdlbmVyYWwgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gTWF5IDEwIDA2OjAyOjI1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBtNjhrLmg6IE1vdmUgc3BsaXQgcG9pbnQgZm9yIGdjYyBjb21waWxhdGlvbiBtb3JlIHRvd2FyZHMKLQltaWRkbGUuCi0KLUZyaSBBcHIgIDkgMTM6MjY6MTYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIHJzNmsuaDogQ2xlYW4gdXAgaW5zdHJ1Y3Rpb25zIGZvciBwcmltYXJ5IG9wY29kZSAxOSAobWFueSB3ZXJlCi0Jc2ltcGx5IHdyb25nLCBpY3MsIHJmaSwgJiByZnN2YyB3ZXJlIG1pc3NpbmcpLgotCUFkZCAiYSIgdG8gb3ByX2V4dCBmb3IgImJiIi4gIERvYyBmaXguCi0KLVRodSBNYXIgMTggMTM6NDU6MzEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6ICA0ODYgZXh0ZW5zaW9ucyBmcm9tIEpvaG4gSGFzc2V5IChoYXNzZXlAZGctcnRwLmRnLmNvbSkuCi0JKiBtaXBzLmg6ICBBZGQgY2FzdHMsIHRvIHN1cHByZXNzIHdhcm5pbmdzIGFib3V0IHNoaWZ0aW5nIHRvbyBtdWNoLgotCSogbTY4ay5oOiAgRG9jdW1lbnQgdGhlIHBsYWNlbWVudCBjb2RlICc5Jy4KLQotVGh1IEZlYiAxOCAwMjowMzoxNCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oIChCUkVBS19VUF9CSUdfREVDTCwgQU5EX09USEVSX1BBUlQpOiAgQWRkIGtsdWRnZSB3aGljaAotCWFsbG93cyBjYWxsZXJzIHRvIGJyZWFrIHVwIHRoZSBsYXJnZSBpbml0aWFsaXplZCBzdHJ1Y3QgZnVsbCBvZgotCW9wY29kZXMgaW50byB0d28gaGFsZi1zaXplZCBvbmVzLiAgVGhpcyBwZXJtaXRzIEdDQyB0byBjb21waWxlCi0JdGhpcyBtb2R1bGUsIHNpbmNlIGl0IHRha2VzIGV4cG9uZW50aWFsIHNwYWNlIGZvciBpbml0aWFsaXplcnMuCi0JKG51bW9wY29kZXMsIGVuZG9wKTogIFJldmlzZSB0byB1c2UgQU5EX09USEVSX1BBUlQgaW4gc2l6ZSBjYWxjcy4KLQotVGh1IEZlYiAgNCAwMjowNjo1NiAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYTI5ay5oOiAgUmVtb3ZlIFJDUyBjcnVkLCB1cGRhdGUgR1BMIHRvIHYyLCB1cGRhdGUgY29weXJpZ2h0cy4KLQkqIGNvbnZleC5oOiAgQWRkZWQsIGZyb20gR0RCJ3MgY29udngtb3Bjb2RlLmguICBBZGRlZCBDT05TVCB0byBhbGwKLQlpbml0aWFsaXplZCBzdHJ1Y3RzIGluIGl0LgotCi1UaHUgSmFuIDI4IDIxOjMyOjIyIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JRGVsdGEgODggY2hhbmdlcyBpbnNwaXJlZCBieSBDYXJsIEdyZWNvLCA8Y2dyZWNvQENyZWlnaHRvbi5FZHU+OgotCSogbTg4ay5oIChQTUVNKTogIEF2b2lkIHByZXZpb3VzIGRlZmluaXRpb24gZnJvbSA8c3lzL3BhcmFtLmg+LgotCShBTkQpOiAgQ2hhbmdlIHRvIEFORF8gdG8gYXZvaWQgYW5zaWRlY2wuaCBgQU5EJyBjb25mbGljdC4KLQotU2F0IEphbiAyMyAxODoxMDo0OSBQU1QgMTk5MyAgUmFscGggQ2FtcGJlbGwgIChyYWxwaGNAcHlyYW1pZC5jb20pCi0KLQkqIG1pcHMuaDogZG9jdW1lbnQgImkiIGFuZCAiaiIgb3BlcmFuZHMgY29ycmVjdGx5LgotCi1UaHUgSmFuICA3IDE1OjU4OjEzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiBSZW1vdmVkIGVuZGlhbm5lc3MgZGVwZW5kZW5jeS4KLQotU3VuIEphbiAgMyAxNDoxMzozNSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogaW5jbHVkZSBpbmZvIG9uIG51bWJlciBvZiBjeWNsZXMgcGVyIGluc3RydWN0aW9uLgotCi1Nb24gRGVjIDIxIDIxOjI5OjA4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaDogIE1vdmUgaGFuZHkgYWxpYXNlcyB0byB0aGUgZnJvbnQuICBGaXggbWFza3MgZm9yIGV4dHJhY3QKLQlhbmQgZGVwb3NpdCBpbnN0cnVjdGlvbnMuCi0KLVNhdCBEZWMgMTIgMTY6MDk6NDggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IGFjY2VwdCBzaGxkIGFuZCBzaHJkIGJvdGggd2l0aCBhbmQgd2l0aG91dCB0aGUgc2hpZnQKLQljb3VudCBhcmd1bWVudCwgd2hpY2ggaXMgYWx3YXlzICVjbC4KLQotRnJpIE5vdiAyNyAxNzoxMzoxOCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm4gYXQgY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oIChpMzg2X29wdGFiX2VuZCwgaTM4Nl9yZWd0YWJfZW5kKTogTm93IGNvbnN0LgotCShvbmVfYnl0ZV9zZWdtZW50X2RlZmF1bHRzLCB0d29fYnl0ZV9zZWdtZW50X2RlZmF1bHRzLAotCWkzODZfcHJlZml4dGFiX2VuZCk6IERpdHRvLgotCi1Nb24gTm92IDIzIDEwOjQ3OjI1IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiB2YXguaCAoYmIqKTogVXNlICJ2IiAoYml0ZmllbGQgdHlwZSksIG5vdCAiYSIgKGFkZHJlc3Mgb3BlcmFuZCkKLQlmb3Igb3BlcmFuZCAyOyBmcm9tIEpvaG4gQ2FyciwgamZjQGRzZy5kZWMuY29tLgotCi1XZWQgTm92ICA0IDA3OjM2OjQ5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBtNjhrLmg6IERlZmluZSBGSVhFRF9TSVpFX0JSQU5DSCwgc28gYnNyIGFuZCBicmEgaW5zdHJ1Y3Rpb25zCi0JYWx3YXlzIHVzZSAxNi1iaXQgb2Zmc2V0cy4gIE1ha2VzIGNhbGN1bGF0ZWQtc2l6ZSBqdW1wIHRhYmxlcwotCWZlYXNpYmxlLgotCi1GcmkgT2N0IDE2IDIyOjUyOjQzIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IEZpeCBvbmUtb3BlcmFuZCBmb3JtcyBvZiBpbiogYW5kIG91dCogcGF0dGVybnMuCi0KLVR1ZSBTZXAgMjIgMTQ6MDg6MTQgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBtNjhrLmg6IEFkZGVkIENQVTMyIHN1cHBvcnQuCi0KLVR1ZSBTZXAgMjIgMDA6Mzg6NDEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoYnJlYWspOiAgRGlzYXNzZW1ibGUgdGhlIGFyZ3VtZW50LiAgUGF0Y2ggZnJvbQotCWpvbmF0aGFuQGNzLnN0YW5mb3JkLmVkdSAoSm9uYXRoYW4gU3RvbmUpLgotCi1XZWQgU2VwICA5IDExOjI1OjI4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiBtZXJnZWQgTW90b3JvbGEgYW5kIE1JVCBzeW50YXguCi0KLVRodSBTZXAgIDMgMDk6MzM6MjIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaCAocG1vdmUpOiBtYWtlIHRoZSB0ZXN0cyBsZXNzIHN0cmljdCwgdGhlIDY4ayBib29rIGlzCi0Jd3JvbmcuCi0KLVR1ZSBBdWcgMjUgMjM6MjU6MTkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBtNjhrLmggKG02OGVjMDMwKTogRGVmaW5lZCBhcyBhbGlhcyBmb3IgNjgwMzAuCi0JKG02OGtfb3Bjb2Rlcyk6IE5ldyB0eXBlIGNoYXJhY3RlcnMgIjMiIGZvciA2ODAzMCBNTVUgcmVncyBhbmQgInQiCi0JZm9yIGltbWVkaWF0ZSAwLTcgYWRkZWQuICBTZXQgdXAgc29tZSBvcGNvZGVzIChwdGVzdCwgYmtwdCkgdG8gdXNlCi0JdGhlbS4gIFRpZ2h0ZW5lZCBkZXNjcmlwdGlvbiBvZiAiZm1vdmV4IiB0byBkaXN0aW5ndWlzaCBpdCBmcm9tCi0Jc29tZSAicG1vdmUiIGVuY29kaW5ncy4gIEFkZGVkICJwbW92ZSIgZm9yIDY4MDMwIE1NVSByZWdzLCBjbGVhbmVkCi0JdXAgZGVzY3JpcHRpb25zIHRoYXQgY2xhaW1lZCB2ZXJzaW9ucyB3ZXJlIGF2YWlsYWJsZSBmb3IgY2hpcHMgbm90Ci0Jc3VwcG9ydGluZyB0aGVtLiAgQWRkZWQgInBtb3ZlZmQiLgotCi1Nb24gQXVnIDI0IDEyOjA0OjUxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBtNjhrLmg6IGZpeCB3aGVyZSB0aGUgLiBnb2VzIGluIGRpdnVsbAotCi1XZWQgQXVnIDE5IDExOjIyOjI0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiB0aGUgY2FzMiBpbnN0cnVjdGlvbiBpcyBzdXBwb3NlZCB0byBiZSB3cml0dGVuIHdpdGgKLQlpbmRpcmVjdGlvbiBvbiB0aGUgbGFzdCB0d28gb3BlcmFuZHMsIHdoaWNoIGNhbiBiZSBlaXRoZXIgZGF0YSBvcgotCWFkZHJlc3MgcmVnaXN0ZXJzLiAgQWRkZWQgYSBuZXcgb3BlcmFuZCB0eXBlICdyJyB3aGljaCBhY2NlcHRzCi0JZWl0aGVyIHJlZ2lzdGVyIHR5cGUuICBBZGRlZCBuZXcgY2FzZXMgZm9yIGNhczJsIGFuZCBjYXMydyB3aGljaAotCXVzZSB0aGVtLiAgQ29ycmVjdGVkIG1hc2tzIGZvciBjYXMyIHdoaWNoIGZhaWxlZCB0byByZWNvZ25pemUgdXNlCi0Jb2YgYWRkcmVzcyByZWdpc3Rlci4KLQotRnJpIEF1ZyAxNCAxNDoyMDozOCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiAgTWVyZ2VkIGluIHBhdGNoZXMgKG1vc3RseSBtNjgwNDAtc3BlY2lmaWMpIGZyb20KLQlDb2xpbiBTbWl0aCA8Y29saW5Ad3JzLmNvbT4uCi0KLQkqIG02OGsuaDogIE1lcmdlZCBtNjhrbXJpLmggYW5kIG02OGsuaCAodXNpbmcgdGhlIGZvcm1lciBhcyBhCi0JYmFzZSkuICBBbHNvIGNsZWFuZWQgdXAgZHVwbGljYXRlcywgcmUtb3JkZXJlZCBpbnN0cnVjdGlvbnMgZm9yCi0JdGhlIHNha2Ugb2YgZGlzLWFzc2VtYmxpbmcgKHNvIGFsaWFzZXMgY29tZSBhZnRlciBzdGFuZGFyZCBuYW1lcykuCi0JKiBtNjhrbXJpLmg6IE5vdyBqdXN0IGRlZmluZXMgc29tZSBtYWNyb3MsIGFuZCAjaW5jbHVkZXMgbTY4ay5oLgotCi1XZWQgQXVnIDEyIDE2OjM4OjE1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBtNjhrbXJpLmg6IGFkZGVkIHZhcmlvdXMgb3Bjb2Rlcy4gTW92ZWQgamJ4eCB0byBieHhlcy4gRmlsbGVkIGluCi0JYWxsIG1pc3NpbmcgLnMKLQotTW9uIEF1ZyAxMCAyMzoyMjozMyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogTW92ZWQgdGFibGVzIHRvIEJGRCBsaWJyYXJ5LgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBBZGQgZmlsZHEsIGZpc3RwcSBhbGlhc2VzIHVzZWQgYnkgZ2NjLgotCi1TdW4gSnVuIDI4IDEzOjI5OjAzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiAgRmluaXNoIGZpbGxpbmcgaW4gYWxsIHRoZSBob2xlcyBpbiB0aGUgb3Bjb2RlIHRhYmxlLAotCXNvIHRoYXQgdGhlIEx1Y2lkIEMgY29tcGlsZXIgY2FuIGRpZ2VzdCB0aGlzIGFzIHdlbGwuLi4KLQotRnJpIEp1biAyNiAyMToyNzoxNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiAgQWRkIHNldGMsIHNldG5jLCBhZGRyMTYsIGRhdGExNiwgcmVweiwgcmVwbnogYWxpYXNlcy4KLQlGaXggb3Bjb2RlcyBvbiB2YXJpb3VzIHNpemVzIG9mIGZpbGQvZmlzdCBpbnN0cnVjdGlvbnMKLQkoMTZiaXQ9bm8gc3VmZml4LCAzMmJpdD0ibCIgc3VmZml4LCA2NGJpdD0ibGwiIHN1ZmZpeCkuCi0JVXNlIHRhYnMgdG8gaW5kZW50IGZvciBjb21tZW50cy4gIEZpeGVzIHN1Z2dlc3RlZCBieSBNaW5oIFRyYW4tTGUuCi0KLVRodSBKdW4gMjUgMTY6MTM6MjYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogIEZpbGwgaW4gYWxsIHRoZSBob2xlcyBpbiB0aGUgb3Bjb2RlIHRhYmxlIHNvIHRoYXQgdGhlCi0JbG9zaW5nIEhQVVggQyBjb21waWxlciBjYW4gZGlnZXN0IHRoaXMuLi4KLQotVGh1IEp1biAxMSAxMjoxNToyNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiAgRml4IGRlY29kaW5nIG9mIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucywgc29tZXdoYXQuCi0JKEZpeCBieSBFcmljIEFuZGVyc29uLCAzamVhbkBtYWFzLW5lb3Rlay5hcmMubmFzYS5nb3YuKQotCi1UaHUgTWF5IDI4IDExOjE3OjQ0IDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogQWRkIG5ldyBhcmNoaXRlY3R1cmUgdmFyaWFudCBzcGFyY2xpdGU7IGFkZCBpdHMgc2NhbgotCWFuZCBkaXZzY2Mgb3Bjb2Rlcy4gIERlZmluZSBBUkNISVRFQ1RVUkVTX0NPTkZMSUNUX1AgbWFjcm8uCi0KLVR1ZSBNYXkgIDUgMTQ6MjM6MjcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtaXBzLmg6ICBBZGQgc29tZSBtb3JlIG9wY29kZSBzeW5vbnltcyAoZnJvbSBGcmFuayBZZWxsaW4sCi0JZnlAbHVjaWQuY29tKS4KLQotVGh1IEFwciAxNiAxODoyNToyNiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogcnM2ay5oOiAgTmV3IHZlcnNpb24gZnJvbSBJQk0gKE1ldGluKS4KLQotVGh1IEFwciAgOSAwMDozMToxOSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIHJzNmsuaDogRml4IGluY29ycmVjdCBleHRlbmRlZCBvcGNvZGUgZm9yIGluc3RydWN0aW9ucyBgZm0nCi0gICAgICAgIGFuZCBgZmQnLiAgKEZyb20gbWV0aW5AaWJtcGEuYXdkcGEuaWJtLmNvbSAoTWV0aW4gRy4gT3ppc2lrKS4pCi0KLVR1ZSBBcHIgIDcgMTM6Mzg6NDcgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogcnM2ay5oOiAgTW92ZSBmcm9tIC4uLy4uL2dkYi9yczZrLW9wY29kZS5oLgotCi1GcmkgQXByICAzIDExOjMwOjIwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBtNjhrLmggKG9uZSwgdHdvKTogIENhc3QgbWFjcm8gYXJncyB0byB1bnNpZ25lZCB0byBzdXBwcmVzcwotCWNvbXBsYWludHMgZnJvbSBjb21waWxlciBhbmQgbGludCBhYm91dCBpbnRlZ2VyIG92ZXJmbG93IGR1cmluZwotCXNoaWZ0LgotCi1TdW4gTWFyIDI5IDEyOjIyOjA4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oIChPUCk6ICBBdm9pZCBzaWduZWQgb3ZlcmZsb3cgd2hlbiBzaGlmdGluZyB0byBoaWdoIG9yZGVyIGJpdC4KLQotRnJpIE1hciAgNiAwMDoyMjozOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiAgTWFrZSBiaXRmaWVsZCBsYXlvdXQgZGVwZW5kIG9uIHRoZSBIT1NUIGNvbXBpbGVyLAotCW5vdCBvbiB0aGUgVEFSR0VUIHN5c3RlbS4KLQotRnJpIEZlYiAyMSAwMToyOTo1MSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBhZGRlZCBpbmIsIGludywgb3V0Yiwgb3V0dyBvcGNvZGVzLCBhZGRlZCBhdHQgc3ludGF4IGZvcgotCSAgc2NtcCwgc2xvZCwgc21vdiwgc3NjYSwgc3N0by4gIEN1cnRlc3kgTWluaCBUcmFuLUxlCi0JICA8VFJBTkxFQElOVEVMTElDT1JQLkNPTT4uCi0KLVRodSBKYW4gMzAgMDc6MzE6NDQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6IHR1cm5lZCBvcF90eXBlIGVudW0gaW50byAjZGVmaW5lIGxpc3QKLQotVGh1IEphbiAzMCAwMTowNzoyNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogIFJlbW92ZSAiY3lwcmVzcyIgYXJjaGl0ZWN0dXJlLiAgUmVtb3ZlICJmaXRveCIgYW5kCi0Jc2ltaWxhciBpbnN0cnVjdGlvbnMgLS0gdGhleSd2ZSBiZWVuIHJlbmFtZWQgdG8gImZpdG9xIiwgZXRjLgotCVJFQUxMWSBmaXggdHN1YmNjdHYuICBGaXggImZjbXBlcSIgYW5kICJmY21wcSIgd2hpY2ggaGFkIHdyb25nCi0JbnVtYmVyIG9mIGFyZ3VtZW50cy4KLQkqIGg4MzAwLmg6ICBSZW1vdmUgZXh0cmEgOyB3aGljaCBwcm9kdWNlcyBjb21waWxlciB3YXJuaW5nLgotCi1UdWUgSmFuIDI4IDIyOjU5OjIyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6ICBmaXggb3Bjb2RlIGZvciB0c3ViY2N0di4KLQotVHVlIEphbiAgNyAxNzoxOTozOSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogZmJhIGFuZCBjYmEgYXJlIG5vdyBhbGlhc2VzIGZvciBmYiBhbmQgY2IgcmVzcGVjdGl2ZWx5LgotCi1GcmkgRGVjIDI3IDEwOjU1OjUwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oIChub3ApOiAgTWFkZSB0aGUgJ2xvc2UnIGZpZWxkIGJlIGV2ZW4gdGlnaHRlciwKLQlzbyBvbmx5IGEgc3RhbmRhcmQgJ25vcCcgaXMgZGlzYXNzZW1ibGVkIGFzIGEgbm9wLgotCi1TdW4gRGVjIDIyIDEyOjE4OjE4IDE5OTEgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm4gYXQgY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaCAobm9wKTogQWRkIFJEX0dPIHRvIGBsb3NlJyBzbyB0aGF0IG9ubHkgJWcwIGluIGRlc3QgaXMKLQlkaXNhc3NlbWJsZWQgYXMgYSBub3AuCi0KLVR1ZSBEZWMgMTAgMDA6MjI6MjAgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiBmaXggYSB0eXBvLgotCi1TYXQgTm92IDMwIDIwOjQwOjUxIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBhMjlrLmgsIGFybS5oLCBoODMwMC5oLCAgaTM4Ni5oLCAgaTg2MC5oLCBpOTYwLmggLCBtNjhrLmgsCi0JbTg4ay5oLCBtaXBzLmggLCBucDEuaCwgbnMzMmsuaCwgcG4uaCwgcHlyLmgsIHNwYXJjLmgsIHRhaG9lLmgsCi0JdmF4LmgsIENoYW5nZUxvZzogcmVuYW1lZCBmcm9tIC4uLzxmb28+LW9wY29kZS5oCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2EyOWsuaCBiL2luY2x1ZGUvb3Bjb2RlL2EyOWsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyZTEyNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9hMjlrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyogVGFibGUgb2Ygb3Bjb2RlcyBmb3IgdGhlIEFNRCAyOTAwMCBmYW1pbHkuCi0gICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCIGFuZCBHQVMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLXN0cnVjdCBhMjlrX29wY29kZSB7Ci0gIC8qIE5hbWUgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgY2hhciAqbmFtZTsKLQotICAvKiBPcGNvZGUgd29yZCAqLwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAvKiBBIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHdoaWNoIGRlc2NyaWJlIHRoZSBvcGVyYW5kcy4KLSAgICAgVmFsaWQgY2hhcmFjdGVycyBhcmU6Ci0gICAgICwgICAgICAgIEl0c2VsZi4gIFRoZSBjaGFyYWN0ZXIgYXBwZWFycyBpbiB0aGUgYXNzZW1ibHkgY29kZS4KLSAgICAgYSAgICAgICAgUkEuICBUaGUgcmVnaXN0ZXIgbnVtYmVyIGlzIGluIGJpdHMgOC0xNSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIGIgICAgICAgIFJCLiAgVGhlIHJlZ2lzdGVyIG51bWJlciBpcyBpbiBiaXRzIDAtNyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIGMgICAgICAgIFJDLiAgVGhlIHJlZ2lzdGVyIG51bWJlciBpcyBpbiBiaXRzIDE2LTIzIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgaSAgICAgICAgQW4gaW1tZWRpYXRlIG9wZXJhbmQgaXMgaW4gYml0cyAwLTcgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICB4ICAgICAgICBCaXRzIDAtNyBhbmQgMTYtMjMgb2YgdGhlIGluc3RydWN0aW9uIGFyZSBiaXRzIDAtNyBhbmQgOC0xNQotICAgICAgICAgICAgICAocmVzcGVjdGl2ZWx5KSBvZiB0aGUgaW1tZWRpYXRlIG9wZXJhbmQuCi0gICAgIGggICAgICAgIFNhbWUgYXMgeCBidXQgdGhlIGluc3RydWN0aW9uIGNvbnRhaW5zIGJpdHMgMTYtMzEgb2YgdGhlCi0gICAgICAgICAgICAgIGltbWVkaWF0ZSBvcGVyYW5kLgotICAgICBYICAgICAgICBTYW1lIGFzIHggYnV0IGJpdHMgMTYtMzEgb2YgdGhlIHNpZ25lZCBpbW1lZGlhdGUgb3BlcmFuZAotICAgICAgICAgICAgICBhcmUgc2V0IHRvIDEgKHRodXMgdGhlIG9wZXJhbmQgaXMgYWx3YXlzIG5lZ2F0aXZlKS4KLSAgICAgUCxBICAgICAgQml0cyAwLTcgYW5kIDE2LTIzIG9mIHRoZSBpbnN0cnVjdGlvbiBhcmUgYml0cyAyLTkgYW5kIDEwLTE3Ci0gICAgICAgICAgICAgIChyZXNwZWN0aXZlbHkpIG9mIHRoZSBpbW1lZGlhdGUgb3BlcmFuZC4KLQkgICAgICBQPVBDLXJlbGF0aXZlLCBzaWduLWV4dGVuZGVkIHRvIDMyIGJpdHMuCi0JICAgICAgQT1BYnNvbHV0ZSwgemVyby1leHRlbmRlZCB0byAzMiBiaXRzLgotICAgICBlICAgICAgICBDRSBiaXQgKGJpdCAyMykgZm9yIGEgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbi4KLSAgICAgbiAgICAgICAgQ29udHJvbCBmaWVsZCAoYml0cyAxNi0yMikgZm9yIGEgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbi4KLSAgICAgdiAgICAgICAgSW1tZWRpYXRlIG9wZXJhbmQgaW4gYml0cyAxNi0yMyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgICAgICAgICAgICh1c2VkIGZvciB0cmFwIG51bWJlcnMpLgotICAgICBzICAgICAgICBTQS4gIFNwZWNpYWwtcHVycG9zZSByZWdpc3RlciBudW1iZXIgaW4gYml0cyA4LTE1Ci0gICAgICAgICAgICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgdSAgICAgICAgVUktLWJpdCA3IG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgciAgICAgICAgUk5ELS1iaXRzIDQtNiBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIGQgICAgICAgIEZELS1iaXRzIDItMyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIGYgICAgICAgIEZTLS1iaXRzIDAtMSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIEkJICAgICAgSUQtLWJpdHMgMTYtMTcgb2YgdGhlIGluc3RydWN0aW9uLgotCi0gICAgIEV4dGVuc2lvbnMgZm9yIDI5MDUwOgotCi0gICAgIGQJICAgICAgRk1ULS1iaXRzIDItMyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKG5vdCByZWFsbHkgbmV3KS4KLSAgICAgZgkgICAgICBBQ04tLWJpdHMgMC0xIG9mIHRoZSBpbnN0cnVjdGlvbiAobm90IHJlYWxseSBuZXcpLgotICAgICBGCSAgICAgIEZVTkMtLVNwZWNpYWwgZnVuY3Rpb24gaW4gYml0cyAxOC0yMSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIEMJICAgICAgQUNOLS1iaXRzIDE2LTE3IHNwZWNpZnlpbmcgdGhlIGFjY3VtbGF0b3IgcmVnaXN0ZXIuICAqLwotICBjaGFyICphcmdzOwotfTsKLQotI2lmbmRlZiBDT05TVAotI2RlZmluZSBDT05TVAotI2VuZGlmIC8qIENPTlNUICovCi0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYTI5a19vcGNvZGUgYTI5a19vcGNvZGVzW10gPQotewotCi17ICJhZGQiLCAweDE0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhZGQiLCAweDE1MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhZGRjIiwgMHgxYzAwMDAwMCwgImMsYSxiIiB9LAoteyAiYWRkYyIsIDB4MWQwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFkZGNzIiwgMHgxODAwMDAwMCwgImMsYSxiIiB9LAoteyAiYWRkY3MiLCAweDE5MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhZGRjdSIsIDB4MWEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFkZGN1IiwgMHgxYjAwMDAwMCwgImMsYSxpIiB9LAoteyAiYWRkcyIsIDB4MTAwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFkZHMiLCAweDExMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhZGR1IiwgMHgxMjAwMDAwMCwgImMsYSxiIiB9LAoteyAiYWRkdSIsIDB4MTMwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFuZCIsIDB4OTAwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFuZCIsIDB4OTEwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFuZG4iLCAweDljMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhbmRuIiwgMHg5ZDAwMDAwMCwgImMsYSxpIiB9LAoteyAiYXNlcSIsIDB4NzAwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzZXEiLCAweDcxMDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2dlIiwgMHg1YzAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNnZSIsIDB4NWQwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzZ2V1IiwgMHg1ZTAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNnZXUiLCAweDVmMDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2d0IiwgMHg1ODAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNndCIsIDB4NTkwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzZ3R1IiwgMHg1YTAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNndHUiLCAweDViMDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2xlIiwgMHg1NDAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNsZSIsIDB4NTUwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzbGV1IiwgMHg1NjAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNsZXUiLCAweDU3MDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2x0IiwgMHg1MDAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNsdCIsIDB4NTEwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImFzbHR1IiwgMHg1MjAwMDAwMCwgInYsYSxiIiB9LAoteyAiYXNsdHUiLCAweDUzMDAwMDAwLCAidixhLGkiIH0sCi17ICJhc25lcSIsIDB4NzIwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzbmVxIiwgMHg3MzAwMDAwMCwgInYsYSxpIiB9LAoteyAiY2FsbCIsIDB4YTgwMDAwMDAsICJhLFAiIH0sCi17ICJjYWxsIiwgMHhhOTAwMDAwMCwgImEsQSIgfSwKLXsgImNhbGxpIiwgMHhjODAwMDAwMCwgImEsYiIgfSwKLXsgImNsYXNzIiwgMHhlNjAwMDAwMCwgImMsYSxmIiB9LAoteyAiY2x6IiwgMHgwODAwMDAwMCwgImMsYiIgfSwKLXsgImNseiIsIDB4MDkwMDAwMDAsICJjLGkiIH0sCi17ICJjb25zdCIsIDB4MDMwMDAwMDAsICJhLHgiIH0sCi17ICJjb25zdGgiLCAweDAyMDAwMDAwLCAiYSxoIiB9LAoteyAiY29uc3RoeiIsIDB4MDUwMDAwMDAsICJhLGgiIH0sCi17ICJjb25zdG4iLCAweDAxMDAwMDAwLCAiYSxYIiB9LAoteyAiY29udmVydCIsIDB4ZTQwMDAwMDAsICJjLGEsdSxyLGQsZiIgfSwKLXsgImNwYnl0ZSIsIDB4MmUwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwYnl0ZSIsIDB4MmYwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwZXEiLCAweDYwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGVxIiwgMHg2MTAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BnZSIsIDB4NGMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwZ2UiLCAweDRkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGdldSIsIDB4NGUwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwZ2V1IiwgMHg0ZjAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BndCIsIDB4NDgwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwZ3QiLCAweDQ5MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGd0dSIsIDB4NGEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwZ3R1IiwgMHg0YjAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BsZSIsIDB4NDQwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwbGUiLCAweDQ1MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGxldSIsIDB4NDYwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwbGV1IiwgMHg0NzAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BsdCIsIDB4NDAwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwbHQiLCAweDQxMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGx0dSIsIDB4NDIwMDAwMDAsICJjLGEsYiIgfSwKLXsgImNwbHR1IiwgMHg0MzAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BuZXEiLCAweDYyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcG5lcSIsIDB4NjMwMDAwMDAsICJjLGEsaSIgfSwKLXsgImRhZGQiLCAweGYxMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkZGl2IiwgMHhmNzAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGVxIiwgMHhlYjAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGdlIiwgMHhlZjAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGd0IiwgMHhlZDAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGl2IiwgMHg2YTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGl2IiwgMHg2YjAwMDAwMCwgImMsYSxpIiB9LAoteyAiZGl2MCIsIDB4NjgwMDAwMDAsICJjLGIiIH0sCi17ICJkaXYwIiwgMHg2OTAwMDAwMCwgImMsaSIgfSwKLXsgImRpdmlkZSIsIDB4ZTEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRpdmlkdSIsIDB4ZTMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRpdmwiLCAweDZjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkaXZsIiwgMHg2ZDAwMDAwMCwgImMsYSxpIiB9LAoteyAiZGl2cmVtIiwgMHg2ZTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGl2cmVtIiwgMHg2ZjAwMDAwMCwgImMsYSxpIiB9LAoteyAiZG1hYyIsIDB4ZDkwMDAwMDAsICJGLEMsYSxiIiB9LAoteyAiZG1zbSIsIDB4ZGIwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRtdWwiLCAweGY1MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkc3ViIiwgMHhmMzAwMDAwMCwgImMsYSxiIiB9LAoteyAiZW11bGF0ZSIsIDB4ZDcwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImV4Ynl0ZSIsIDB4MGEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImV4Ynl0ZSIsIDB4MGIwMDAwMDAsICJjLGEsaSIgfSwKLXsgImV4aHciLCAweDdjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJleGh3IiwgMHg3ZDAwMDAwMCwgImMsYSxpIiB9LAoteyAiZXhod3MiLCAweDdlMDAwMDAwLCAiYyxhIiB9LAoteyAiZXh0cmFjdCIsIDB4N2EwMDAwMDAsICJjLGEsYiIgfSwKLXsgImV4dHJhY3QiLCAweDdiMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJmYWRkIiwgMHhmMDAwMDAwMCwgImMsYSxiIiB9LAoteyAiZmRpdiIsIDB4ZjYwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZkbXVsIiwgMHhmOTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZmVxIiwgMHhlYTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZmdlIiwgMHhlZTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZmd0IiwgMHhlYzAwMDAwMCwgImMsYSxiIiB9LAoteyAiZm1hYyIsIDB4ZDgwMDAwMDAsICJGLEMsYSxiIiB9LAoteyAiZm1zbSIsIDB4ZGEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZtdWwiLCAweGY0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmc3ViIiwgMHhmMjAwMDAwMCwgImMsYSxiIiB9LAoteyAiaGFsdCIsIDB4ODkwMDAwMDAsICIiIH0sCi17ICJpbmJ5dGUiLCAweDBjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJpbmJ5dGUiLCAweDBkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJpbmh3IiwgMHg3ODAwMDAwMCwgImMsYSxiIiB9LAoteyAiaW5odyIsIDB4NzkwMDAwMDAsICJjLGEsaSIgfSwKLXsgImludiIsIDB4OWYwMDAwMDAsICJJIiB9LAoteyAiaXJldCIsIDB4ODgwMDAwMDAsICIiIH0sCi17ICJpcmV0aW52IiwgMHg4YzAwMDAwMCwgIkkiIH0sCi17ICJqbXAiLCAweGEwMDAwMDAwLCAiUCIgfSwKLXsgImptcCIsIDB4YTEwMDAwMDAsICJBIiB9LAoteyAiam1wZiIsIDB4YTQwMDAwMDAsICJhLFAiIH0sCi17ICJqbXBmIiwgMHhhNTAwMDAwMCwgImEsQSIgfSwKLXsgImptcGZkZWMiLCAweGI0MDAwMDAwLCAiYSxQIiB9LAoteyAiam1wZmRlYyIsIDB4YjUwMDAwMDAsICJhLEEiIH0sCi17ICJqbXBmaSIsIDB4YzQwMDAwMDAsICJhLGIiIH0sCi17ICJqbXBpIiwgMHhjMDAwMDAwMCwgImIiIH0sCi17ICJqbXB0IiwgMHhhYzAwMDAwMCwgImEsUCIgfSwKLXsgImptcHQiLCAweGFkMDAwMDAwLCAiYSxBIiB9LAoteyAiam1wdGkiLCAweGNjMDAwMDAwLCAiYSxiIiB9LAoteyAibG9hZCIsIDB4MTYwMDAwMDAsICJlLG4sYSxiIiB9LAoteyAibG9hZCIsIDB4MTcwMDAwMDAsICJlLG4sYSxpIiB9LAoteyAibG9hZGwiLCAweDA2MDAwMDAwLCAiZSxuLGEsYiIgfSwKLXsgImxvYWRsIiwgMHgwNzAwMDAwMCwgImUsbixhLGkiIH0sCi17ICJsb2FkbSIsIDB4MzYwMDAwMDAsICJlLG4sYSxiIiB9LAoteyAibG9hZG0iLCAweDM3MDAwMDAwLCAiZSxuLGEsaSIgfSwKLXsgImxvYWRzZXQiLCAweDI2MDAwMDAwLCAiZSxuLGEsYiIgfSwKLXsgImxvYWRzZXQiLCAweDI3MDAwMDAwLCAiZSxuLGEsaSIgfSwKLXsgIm1mYWNjIiwgMHhlOTAwMDEwMCwgImMsZCxmIiB9LAoteyAibWZzciIsIDB4YzYwMDAwMDAsICJjLHMiIH0sCi17ICJtZnRsYiIsIDB4YjYwMDAwMDAsICJjLGEiIH0sCi17ICJtdGFjYyIsIDB4ZTgwMTAwMDAsICJhLGQsZiIgfSwKLXsgIm10c3IiLCAweGNlMDAwMDAwLCAicyxiIiB9LAoteyAibXRzcmltIiwgMHgwNDAwMDAwMCwgInMseCIgfSwKLXsgIm10dGxiIiwgMHhiZTAwMDAwMCwgImEsYiIgfSwKLXsgIm11bCIsIDB4NjQwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm11bCIsIDB4NjUwMDAwMDAsICJjLGEsaSIgfSwKLXsgIm11bGwiLCAweDY2MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJtdWxsIiwgMHg2NzAwMDAwMCwgImMsYSxpIiB9LAoteyAibXVsdGlwbHUiLCAweGUyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJtdWx0aXBseSIsIDB4ZTAwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm11bHRtIiwgMHhkZTAwMDAwMCwgImMsYSxiIiB9LAoteyAibXVsdG11IiwgMHhkZjAwMDAwMCwgImMsYSxiIiB9LAoteyAibXVsdSIsIDB4NzQwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm11bHUiLCAweDc1MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJuYW5kIiwgMHg5YTAwMDAwMCwgImMsYSxiIiB9LAoteyAibmFuZCIsIDB4OWIwMDAwMDAsICJjLGEsaSIgfSwKLXsgIm5vcCIsIDB4NzA0MDAxMDEsICIiIH0sCi17ICJub3IiLCAweDk4MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJub3IiLCAweDk5MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJvciIsIDB4OTIwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm9yIiwgMHg5MzAwMDAwMCwgImMsYSxpIiB9LAoteyAib3JuIiwgMHhhYTAwMDAwMCwgImMsYSxiIiB9LAoteyAib3JuIiwgMHhhYjAwMDAwMCwgImMsYSxpIiB9LAotCi0vKiBUaGUgZGVzY3JpcHRpb24gb2YgInNldGlwIiBpbiBDaGFwdGVyIDggKCJpbnN0cnVjdGlvbiBzZXQiKSBvZiB0aGUgdXNlcidzCi0gICBtYW51YWwgY2xhaW1zIHRoYXQgdGhlc2UgYXJlIGFic29sdXRlIHJlZ2lzdGVyIG51bWJlcnMuICBCdXQgc2VjdGlvbgotICAgNy4yLjEgZXhwbGFpbnMgdGhhdCB0aGV5IGFyZSBub3QuICBUaGUgbGF0dGVyIGlzIGNvcnJlY3QsIHNvIHByaW50Ci0gICB0aGVzZSBub3JtYWxseSAoImxyMCIsICJscjUiLCBldGMuKS4gICovCi17ICJzZXRpcCIsIDB4OWUwMDAwMDAsICJjLGEsYiIgfSwKLQoteyAic2xsIiwgMHg4MDAwMDAwMCwgImMsYSxiIiB9LAoteyAic2xsIiwgMHg4MTAwMDAwMCwgImMsYSxpIiB9LAoteyAic3FydCIsIDB4ZTUwMDAwMDAsICJjLGEsZiIgfSwKLXsgInNyYSIsIDB4ODYwMDAwMDAsICJjLGEsYiIgfSwKLXsgInNyYSIsIDB4ODcwMDAwMDAsICJjLGEsaSIgfSwKLXsgInNybCIsIDB4ODIwMDAwMDAsICJjLGEsYiIgfSwKLXsgInNybCIsIDB4ODMwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN0b3JlIiwgMHgxZTAwMDAwMCwgImUsbixhLGIiIH0sCi17ICJzdG9yZSIsIDB4MWYwMDAwMDAsICJlLG4sYSxpIiB9LAoteyAic3RvcmVsIiwgMHgwZTAwMDAwMCwgImUsbixhLGIiIH0sCi17ICJzdG9yZWwiLCAweDBmMDAwMDAwLCAiZSxuLGEsaSIgfSwKLXsgInN0b3JlbSIsIDB4M2UwMDAwMDAsICJlLG4sYSxiIiB9LAoteyAic3RvcmVtIiwgMHgzZjAwMDAwMCwgImUsbixhLGkiIH0sCi17ICJzdWIiLCAweDI0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWIiLCAweDI1MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJjIiwgMHgyYzAwMDAwMCwgImMsYSxiIiB9LAoteyAic3ViYyIsIDB4MmQwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YmNzIiwgMHgyODAwMDAwMCwgImMsYSxiIiB9LAoteyAic3ViY3MiLCAweDI5MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJjdSIsIDB4MmEwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YmN1IiwgMHgyYjAwMDAwMCwgImMsYSxpIiB9LAoteyAic3ViciIsIDB4MzQwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnIiLCAweDM1MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJyYyIsIDB4M2MwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnJjIiwgMHgzZDAwMDAwMCwgImMsYSxpIiB9LAoteyAic3VicmNzIiwgMHgzODAwMDAwMCwgImMsYSxiIiB9LAoteyAic3VicmNzIiwgMHgzOTAwMDAwMCwgImMsYSxpIiB9LAoteyAic3VicmN1IiwgMHgzYTAwMDAwMCwgImMsYSxiIiB9LAoteyAic3VicmN1IiwgMHgzYjAwMDAwMCwgImMsYSxpIiB9LAoteyAic3VicnMiLCAweDMwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJycyIsIDB4MzEwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnJ1IiwgMHgzMjAwMDAwMCwgImMsYSxiIiB9LAoteyAic3VicnUiLCAweDMzMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJzIiwgMHgyMDAwMDAwMCwgImMsYSxiIiB9LAoteyAic3VicyIsIDB4MjEwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnUiLCAweDIyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJ1IiwgMHgyMzAwMDAwMCwgImMsYSxpIiB9LAoteyAieG5vciIsIDB4OTYwMDAwMDAsICJjLGEsYiIgfSwKLXsgInhub3IiLCAweDk3MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJ4b3IiLCAweDk0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJ4b3IiLCAweDk1MDAwMDAwLCAiYyxhLGkiIH0sCi0KLXsgIiIsIDB4MCwgIiIgfQkJLyogRHVtbXkgZW50cnksIG5vdCBpbmNsdWRlZCBpbiBOVU1fT1BDT0RFUy4gIFRoaXMKLQkJCSAgIGxldHMgY29kZSBleGFtaW5lIGVudHJ5IGkrMSB3aXRob3V0IGNoZWNraW5nCi0JCQkgICBpZiB3ZSd2ZSBydW4gb2ZmIHRoZSBlbmQgb2YgdGhlIHRhYmxlLiAgKi8KLX07Ci0KLUNPTlNUIHVuc2lnbmVkIGludCBudW1fb3Bjb2RlcyA9ICgoKHNpemVvZiBhMjlrX29wY29kZXMpIC8gKHNpemVvZiBhMjlrX29wY29kZXNbMF0pKSAtIDEpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvYWxwaGEuaCBiL2luY2x1ZGUvb3Bjb2RlL2FscGhhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOGViMDQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvYWxwaGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKiBhbHBoYS5oIC0tIEhlYWRlciBmaWxlIGZvciBBbHBoYSBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4sCi0gICBwYXR0ZXJuZWQgYWZ0ZXIgdGhlIFBQQyBvcGNvZGUgdGFibGUgd3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIE9QQ09ERV9BTFBIQV9ICi0jZGVmaW5lIE9QQ09ERV9BTFBIQV9ICi0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGFscGhhX29wY29kZS4gICovCi0KLXN0cnVjdCBhbHBoYV9vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gIFRob3NlIGJpdHMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aAotICAgICBvcGVyYW5kcyBhcmUgemVyb2VzLiAgKi8KLSAgdW5zaWduZWQgb3Bjb2RlOwotCi0gIC8qIFRoZSBvcGNvZGUgbWFzay4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVGhpcyBpcyBhCi0gICAgIG1hc2sgY29udGFpbmluZyBvbmVzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBtdXN0IG1hdGNoIHRoZQotICAgICBvcGNvZGUgZmllbGQsIGFuZCB6ZXJvZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG5lZWQgbm90Ci0gICAgIG1hdGNoIChhbmQgYXJlIHByZXN1bWFibHkgZmlsbGVkIGluIGJ5IG9wZXJhbmRzKS4gICovCi0gIHVuc2lnbmVkIG1hc2s7Ci0KLSAgLyogT25lIGJpdCBmbGFncyBmb3IgdGhlIG9wY29kZS4gIFRoZXNlIGFyZSBwcmltYXJpbHkgdXNlZCB0bwotICAgICBpbmRpY2F0ZSBzcGVjaWZpYyBwcm9jZXNzb3JzIGFuZCBlbnZpcm9ubWVudHMgc3VwcG9ydCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb25zLiAgVGhlIGRlZmluZWQgdmFsdWVzIGFyZSBsaXN0ZWQgYmVsb3cuICovCi0gIHVuc2lnbmVkIGZsYWdzOwotCi0gIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMuICBFYWNoIGNvZGUgaXMgYW4gaW5kZXggaW50byB0aGUKLSAgICAgb3BlcmFuZCB0YWJsZS4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciB3aGljaCB0aGUgb3BlcmFuZHMgbXVzdAotICAgICBhcHBlYXIgaW4gYXNzZW1ibHkgY29kZSwgYW5kIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgemVyby4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbNF07Ci19OwotCi0vKiBUaGUgdGFibGUgaXRzZWxmIGlzIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgbnVtYmVyLCBhbmQgaXMgb3RoZXJ3aXNlCi0gICBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY29uc2lkZXIKLSAgIGluc3RydWN0aW9ucy4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSBhbHBoYV9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IGFscGhhX251bV9vcGNvZGVzOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IGFscGhhX29wY29kZS4gICovCi0KLS8qIENQVSBBdmFpbGFiaWxpdHkgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9CQVNFICAweDAwMDEgIC8qIEJhc2UgYXJjaGl0ZWN0dXJlIC0tIGFsbCBjcHVzLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9FVjQgICAweDAwMDIgIC8qIEVWNCBzcGVjaWZpYyBQQUxjb2RlIGluc25zLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9FVjUgICAweDAwMDQgIC8qIEVWNSBzcGVjaWZpYyBQQUxjb2RlIGluc25zLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9FVjYgICAweDAwMDggIC8qIEVWNiBzcGVjaWZpYyBQQUxjb2RlIGluc25zLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9CV1ggICAweDAxMDAgIC8qIEJ5dGUvd29yZCBleHRlbnNpb24gKGFtYXNrIGJpdCAwKS4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfQ0lYICAgMHgwMjAwICAvKiAiQ291bnQiIGV4dGVuc2lvbiAoYW1hc2sgYml0IDEpLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9NQVggICAweDA0MDAgIC8qIE11bHRpbWVkaWEgZXh0ZW5zaW9uIChhbWFzayBiaXQgOCkuICAqLwotCi0jZGVmaW5lIEFYUF9PUENPREVfTk9QQUwgKH4oQVhQX09QQ09ERV9FVjR8QVhQX09QQ09ERV9FVjV8QVhQX09QQ09ERV9FVjYpKQotCi0vKiBBIG1hY3JvIHRvIGV4dHJhY3QgdGhlIG1ham9yIG9wY29kZSBmcm9tIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQVhQX09QKGkpCSgoKGkpID4+IDI2KSAmIDB4M0YpCi0KLS8qIFRoZSB0b3RhbCBudW1iZXIgb2YgbWFqb3Igb3Bjb2Rlcy4gKi8KLSNkZWZpbmUgQVhQX05PUFMJMHg0MAotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGFscGhhX29wZXJhbmQuICAqLwotCi1zdHJ1Y3QgYWxwaGFfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpbnQgc2hpZnQ7Ci0KLSAgLyogVGhlIGRlZmF1bHQgcmVsb2NhdGlvbiB0eXBlIGZvciB0aGlzIG9wZXJhbmQuICAqLwotICBpbnQgZGVmYXVsdF9yZWxvYzsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0gIHVuc2lnbmVkIGZsYWdzOwotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChvcCAmICgoMSA8PCBvLT5iaXRzKSAtIDEpKSA8PCBvLT5zaGlmdDsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIHdlIGFyZSBmaWxsaW5nIGluLCBvIGlzIGEgcG9pbnRlciB0bwotICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wIGlzIHRoZSBvcGNvZGUgdmFsdWU7IHRoaXMgYXNzdW1lcyB0d29zCi0gICAgIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIG9wZXJhbmQgdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgbmV3IHZhbHVlCi0gICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4gIElmIHRoZSBFUlJNU0cgYXJndW1lbnQgaXMgbm90IE5VTEwsIHRoZW4gaWYKLSAgICAgdGhlIG9wZXJhbmQgdmFsdWUgaXMgaWxsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHNldCB0byBhIHdhcm5pbmcKLSAgICAgc3RyaW5nICh0aGUgb3BlcmFuZCB3aWxsIGJlIGluc2VydGVkIGluIGFueSBjYXNlKS4gIElmIHRoZQotICAgICBvcGVyYW5kIHZhbHVlIGlzIGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgdW5jaGFuZ2VkIChtb3N0IG9wZXJhbmRzCi0gICAgIGNhbiBhY2NlcHQgYW55IHZhbHVlKS4gICovCi0gIHVuc2lnbmVkICgqaW5zZXJ0KSBQQVJBTVMgKCh1bnNpZ25lZCBpbnN0cnVjdGlvbiwgaW50IG9wLAotCQkJICAgICAgY29uc3QgY2hhciAqKmVycm1zZykpOwotCi0gIC8qIEV4dHJhY3Rpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRvCi0gICAgIGV4dHJhY3QgdGhpcyBvcGVyYW5kIHR5cGUgZnJvbSBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBjb21wdXRlCi0gICAgICAgICBvcCA9ICgoaSkgPj4gby0+c2hpZnQpICYgKCgxIDw8IG8tPmJpdHMpIC0gMSk7Ci0JIGlmICgoby0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9TSUdORUQpICE9IDAKLQkgICAgICYmIChvcCAmICgxIDw8IChvLT5iaXRzIC0gMSkpKSAhPSAwKQotCSAgIG9wIC09IDEgPDwgby0+Yml0czsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uLCBvIGlzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wCi0gICAgIGlzIHRoZSByZXN1bHQ7IHRoaXMgYXNzdW1lcyB0d29zIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgb3BlcmFuZC4gIElmCi0gICAgIHRoZSBJTlZBTElEIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCAqSU5WQUxJRCB3aWxsIGJlIHNldCB0bwotICAgICBub24temVybyBpZiB0aGlzIG9wZXJhbmQgdHlwZSBjYW4gbm90IGFjdHVhbGx5IGJlIGV4dHJhY3RlZCBmcm9tCi0gICAgIHRoaXMgb3BlcmFuZCAoaS5lLiwgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IG1hdGNoKS4gIElmIHRoZQotICAgICBvcGVyYW5kIGlzIHZhbGlkLCAqSU5WQUxJRCB3aWxsIG5vdCBiZSBjaGFuZ2VkLiAgKi8KLSAgaW50ICgqZXh0cmFjdCkgUEFSQU1TICgodW5zaWduZWQgaW5zdHJ1Y3Rpb24sIGludCAqaW52YWxpZCkpOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSBhbHBoYV9vcGNvZGVzIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kIGFscGhhX29wZXJhbmRzW107Ci1leHRlcm4gY29uc3QgaW50IGFscGhhX251bV9vcGVyYW5kczsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBhbHBoYV9vcGVyYW5kLiAgKi8KLQotLyogTWFzayBmb3Igc2VsZWN0aW5nIHRoZSB0eXBlIGZvciB0eXBlY2hlY2sgcHVycG9zZXMgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfVFlQRUNIRUNLX01BU0sJCQkJCVwKLSAgKEFYUF9PUEVSQU5EX1BBUkVOUyB8IEFYUF9PUEVSQU5EX0NPTU1BIHwgQVhQX09QRVJBTkRfSVIgfAkJXAotICAgQVhQX09QRVJBTkRfRlBSIHwgQVhQX09QRVJBTkRfUkVMQVRJVkUgfCBBWFBfT1BFUkFORF9TSUdORUQgfCAJXAotICAgQVhQX09QRVJBTkRfVU5TSUdORUQpCi0KLS8qIFRoaXMgb3BlcmFuZCBkb2VzIG5vdCBhY3R1YWxseSBleGlzdCBpbiB0aGUgYXNzZW1ibGVyIGlucHV0LiAgVGhpcwotICAgaXMgdXNlZCB0byBzdXBwb3J0IGV4dGVuZGVkIG1uZW1vbmljcywgZm9yIHdoaWNoIHR3byBvcGVyYW5kcyBmaWVsZHMKLSAgIGFyZSBpZGVudGljYWwuICBUaGUgYXNzZW1ibGVyIHNob3VsZCBjYWxsIHRoZSBpbnNlcnQgZnVuY3Rpb24gd2l0aAotICAgYW55IG9wIHZhbHVlLiAgVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY2FsbCB0aGUgZXh0cmFjdCBmdW5jdGlvbiwKLSAgIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlLCBhbmQgY2hlY2sgdGhlIHZhbHVlIHBsYWNlZCBpbiB0aGUgaW52YWxpZAotICAgYXJndW1lbnQuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9GQUtFCTAxCi0KLS8qIFRoZSBvcGVyYW5kIHNob3VsZCBiZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIHJhdGhlciB0aGFuIHNlcGFyYXRlZAotICAgZnJvbSB0aGUgcHJldmlvdXMgYnkgYSBjb21tYS4gIFRoaXMgaXMgdXNlZCBmb3IgdGhlIGxvYWQgYW5kIHN0b3JlCi0gICBpbnN0cnVjdGlvbnMgd2hpY2ggd2FudCB0aGVpciBvcGVyYW5kcyB0byBsb29rIGxpa2UgIlJhLGRpc3AoUmIpIi4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX1BBUkVOUwkwMgotCi0vKiBVc2VkIGluIGNvbWJpbmF0aW9uIHdpdGggUEFSRU5TLCB0aGlzIHN1cHJlc3NlcyB0aGUgc3VwcmVzc2lvbiBvZgotICAgdGhlIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciAiam1wIFJhLChSYiksaGludCIuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9DT01NQQkwNAotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYW4gaW50ZWdlciByZWdpc3Rlci4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0lSCQkwMTAKLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9GUFIJCTAyMAotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSByZWxhdGl2ZSBicmFuY2ggZGlzcGxhY2VtZW50LiAgVGhlIGRpc2Fzc2VtYmxlcgotICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX1JFTEFUSVZFCTA0MAotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcy4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX1NJR05FRAkwMTAwCi0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyB1bnNpZ25lZCB2YWx1ZXMuICBUaGlzIGV4aXN0cyBwcmltYXJpbHkgc28gdGhhdAotICAgYSBmbGFncyB2YWx1ZSBvZiAwIGNhbiBiZSB0cmVhdGVkIGFzIGVuZC1vZi1hcmd1bWVudHMuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9VTlNJR05FRAkwMjAwCi0KLS8qIFN1cHJlc3Mgb3ZlcmZsb3cgZGV0ZWN0aW9uIG9uIHRoaXMgZmllbGQuICBUaGlzIGlzIHVzZWQgZm9yIGhpbnRzLiAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9OT09WRVJGTE9XCTA0MDAKLQotLyogTWFzayBmb3Igb3B0aW9uYWwgYXJndW1lbnQgZGVmYXVsdCB2YWx1ZS4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX09QVElPTkFMX01BU0sgMDcwMDAKLQotLyogVGhpcyBvcGVyYW5kIGRlZmF1bHRzIHRvIHplcm8uICBUaGlzIGlzIHVzZWQgZm9yIGp1bXAgaGludHMuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9ERUZBVUxUX1pFUk8gMDEwMDAKLQotLyogVGhpcyBvcGVyYW5kIHNob3VsZCBkZWZhdWx0IHRvIHRoZSBmaXJzdCAocmVhbCkgb3BlcmFuZCBhbmQgaXMgdXNlZAotICAgaW4gY29uanVuY3Rpb24gd2l0aCBBWFBfT1BFUkFORF9PUFRJT05BTC4gIFRoaXMgYWxsb3dzCi0gICAiYW5kICQwLDMsJDAiIHRvIGJlIHdyaXR0ZW4gYXMgImFuZCAkMCwzIiwgZXRjLiAgSSBkb24ndCBsaWtlCi0gICBpdCwgYnV0IGl0J3Mgd2hhdCBERUMgZG9lcy4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0RFRkFVTFRfRklSU1QgMDIwMDAKLQotLyogU2ltaWxhcmx5LCB0aGlzIG9wZXJhbmQgc2hvdWxkIGRlZmF1bHQgdG8gdGhlIHNlY29uZCAocmVhbCkgb3BlcmFuZC4KLSAgIFRoaXMgYWxsb3dzICJuZWdsICQwIiBpbnN0ZWFkIG9mICJuZWdsICQwLCQwIi4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0RFRkFVTFRfU0VDT05EIDA0MDAwCi0KLQwKLS8qIFJlZ2lzdGVyIGNvbW1vbiBuYW1lcyAqLwotCi0jZGVmaW5lIEFYUF9SRUdfVjAJMAotI2RlZmluZSBBWFBfUkVHX1QwCTEKLSNkZWZpbmUgQVhQX1JFR19UMQkyCi0jZGVmaW5lIEFYUF9SRUdfVDIJMwotI2RlZmluZSBBWFBfUkVHX1QzCTQKLSNkZWZpbmUgQVhQX1JFR19UNAk1Ci0jZGVmaW5lIEFYUF9SRUdfVDUJNgotI2RlZmluZSBBWFBfUkVHX1Q2CTcKLSNkZWZpbmUgQVhQX1JFR19UNwk4Ci0jZGVmaW5lIEFYUF9SRUdfUzAJOQotI2RlZmluZSBBWFBfUkVHX1MxCTEwCi0jZGVmaW5lIEFYUF9SRUdfUzIJMTEKLSNkZWZpbmUgQVhQX1JFR19TMwkxMgotI2RlZmluZSBBWFBfUkVHX1M0CTEzCi0jZGVmaW5lIEFYUF9SRUdfUzUJMTQKLSNkZWZpbmUgQVhQX1JFR19GUAkxNQotI2RlZmluZSBBWFBfUkVHX0EwCTE2Ci0jZGVmaW5lIEFYUF9SRUdfQTEJMTcKLSNkZWZpbmUgQVhQX1JFR19BMgkxOAotI2RlZmluZSBBWFBfUkVHX0EzCTE5Ci0jZGVmaW5lIEFYUF9SRUdfQTQJMjAKLSNkZWZpbmUgQVhQX1JFR19BNQkyMQotI2RlZmluZSBBWFBfUkVHX1Q4CTIyCi0jZGVmaW5lIEFYUF9SRUdfVDkJMjMKLSNkZWZpbmUgQVhQX1JFR19UMTAJMjQKLSNkZWZpbmUgQVhQX1JFR19UMTEJMjUKLSNkZWZpbmUgQVhQX1JFR19SQQkyNgotI2RlZmluZSBBWFBfUkVHX1BWCTI3Ci0jZGVmaW5lIEFYUF9SRUdfVDEyCTI3Ci0jZGVmaW5lIEFYUF9SRUdfQVQJMjgKLSNkZWZpbmUgQVhQX1JFR19HUAkyOQotI2RlZmluZSBBWFBfUkVHX1NQCTMwCi0jZGVmaW5lIEFYUF9SRUdfWkVSTwkzMQotCi0jZW5kaWYgLyogT1BDT0RFX0FMUEhBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2FyYy5oIGIvaW5jbHVkZS9vcGNvZGUvYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZTBjYTEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyogT3Bjb2RlIHRhYmxlIGZvciB0aGUgQVJDLgotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zIChkamVAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIsIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlciwgYW5kCi10aGUgR05VIEJpbnV0aWxzLgotCi1HQVMvR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTL0dEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTIG9yIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCUlmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogTGlzdCBvZiB0aGUgdmFyaW91cyBjcHUgdHlwZXMuCi0gICBUaGUgdGFibGVzIGN1cnJlbnRseSB1c2UgYml0IG1hc2tzIHRvIHNheSB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBvcgotICAgd2hhdGV2ZXIgaXMgc3VwcG9ydGVkIGJ5IGEgcGFydGljdWxhciBjcHUuICBUaGlzIGxldHMgdXMgaGF2ZSBvbmUgZW50cnkKLSAgIGFwcGx5IHRvIHNldmVyYWwgY3B1cy4KLQotICAgVGhpcyBkdXBsaWNhdGVzIGJmZF9tYWNoX2FyY194eHguICBGb3Igbm93IEkgd2lzaCB0byBpc29sYXRlIHRoaXMgZnJvbSBiZmQKLSAgIGFuZCBiZmQgZnJvbSB0aGlzLiAgQWxzbyBub3RlIHRoYXQgdGhlc2UgbnVtYmVycyBhcmUgYml0IHZhbHVlcyBhcyB3ZSB3YW50Ci0gICB0byBhbGxvdyBmb3IgdGhpbmdzIGF2YWlsYWJsZSBvbiBtb3JlIHRoYW4gb25lIEFSQyAoYnV0IG5vdCBuZWNlc3NhcmlseSBhbGwKLSAgIEFSQ3MpLiAgKi8KLQotLyogVGhlIGBiYXNlJyBjcHUgbXVzdCBiZSAwICh0YWJsZSBlbnRyaWVzIGFyZSBvbWl0dGVkIGZvciB0aGUgYmFzZSBjcHUpLgotICAgVGhlIGNwdSB0eXBlIGlzIHRyZWF0ZWQgaW5kZXBlbmRlbnRseSBvZiBlbmRpYW5uZXNzLgotICAgVGhlIGNvbXBsZXRlIGBtYWNoJyBudW1iZXIgaW5jbHVkZXMgZW5kaWFubmVzcy4KLSAgIFRoZXNlIHZhbHVlcyBhcmUgaW50ZXJuYWwgdG8gb3Bjb2Rlcy9iZmQvYmludXRpbHMvZ2FzLiAgKi8KLSNkZWZpbmUgQVJDX01BQ0hfQkFTRSAwCi0jZGVmaW5lIEFSQ19NQUNIX1VOVVNFRDEgMQotI2RlZmluZSBBUkNfTUFDSF9VTlVTRUQyIDIKLSNkZWZpbmUgQVJDX01BQ0hfVU5VU0VENCA0Ci0vKiBBZGRpdGlvbmFsIGNwdSB2YWx1ZXMgY2FuIGJlIGluc2VydGVkIGhlcmUgYW5kIEFSQ19NQUNIX0JJRyBtb3ZlZCBkb3duLiAgKi8KLSNkZWZpbmUgQVJDX01BQ0hfQklHIDgKLQotLyogTWFzayBvZiBudW1iZXIgb2YgYml0cyBuZWNlc3NhcnkgdG8gcmVjb3JkIGNwdSB0eXBlLiAgKi8KLSNkZWZpbmUgQVJDX01BQ0hfQ1BVX01BU0sgNwotLyogTWFzayBvZiBudW1iZXIgb2YgYml0cyBuZWNlc3NhcnkgdG8gcmVjb3JkIGNwdSB0eXBlICsgZW5kaWFubmVzcy4gICovCi0jZGVmaW5lIEFSQ19NQUNIX01BU0sgMTUKLQotLyogVHlwZSB0byBkZW5vdGUgYW4gQVJDIGluc3RydWN0aW9uIChhdCBsZWFzdCBhIDMyIGJpdCB1bnNpZ25lZCBpbnQpLiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IGFyY19pbnNuOwotCi1zdHJ1Y3QgYXJjX29wY29kZSB7Ci0gIGNoYXIgKnN5bnRheDsJCQkvKiBzeW50YXggb2YgaW5zbiAqLwotICB1bnNpZ25lZCBsb25nIG1hc2ssIHZhbHVlOwkvKiByZWNvZ25pemUgaW5zbiBpZiAob3AmbWFzayk9PXZhbHVlICovCi0gIGludCBmbGFnczsJCQkvKiB2YXJpb3VzIGZsYWcgYml0cyAqLwotCi0vKiBWYWx1ZXMgZm9yIGBmbGFncycuICAqLwotCi0vKiBSZXR1cm4gQ1BVIG51bWJlciwgZ2l2ZW4gZmxhZyBiaXRzLiAgKi8KLSNkZWZpbmUgQVJDX09QQ09ERV9DUFUoYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX0NQVV9NQVNLKQotLyogUmV0dXJuIE1BQ0ggbnVtYmVyLCBnaXZlbiBmbGFnIGJpdHMuICAqLwotI2RlZmluZSBBUkNfT1BDT0RFX01BQ0goYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX01BU0spCi0vKiBGaXJzdCBvcGNvZGUgZmxhZyBiaXQgYXZhaWxhYmxlIGFmdGVyIG1hY2hpbmUgbWFzay4gICovCi0jZGVmaW5lIEFSQ19PUENPREVfRkxBR19TVEFSVCAoKEFSQ19NQUNIX01BU0sgKyAxKSA8PCAwKQotLyogVGhpcyBpbnNuIGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSNkZWZpbmUgQVJDX09QQ09ERV9DT05EX0JSQU5DSCAoQVJDX09QQ09ERV9GTEFHX1NUQVJUKQotCi0gIC8qIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBvcHRpbWl6ZSBhc3NlbWJseSBhbmQgZGlzYXNzZW1ibHkuICBFYWNoIGluc24gaXMKLSAgICAgb24gYSBsaXN0IG9mIHJlbGF0ZWQgaW5zbnMgKHNhbWUgZmlyc3QgbGV0dGVyIGZvciBhc3NlbWJseSwgc2FtZSBpbnNuIGNvZGUKLSAgICAgZm9yIGRpc2Fzc2VtYmx5KS4gICovCi0gIHN0cnVjdCBhcmNfb3Bjb2RlICpuZXh0X2FzbTsJLyogTmV4dCBpbnN0cnVjdGlvbiB0byB0cnkgZHVyaW5nIGFzc2VtYmx5LiAgKi8KLSAgc3RydWN0IGFyY19vcGNvZGUgKm5leHRfZGlzOwkvKiBOZXh0IGluc3RydWN0aW9uIHRvIHRyeSBkdXJpbmcgZGlzYXNzZW1ibHkuICAqLwotCi0gIC8qIE1hY3JvcyB0byBjcmVhdGUgdGhlIGhhc2ggdmFsdWVzIGZvciB0aGUgbGlzdHMuICAqLwotI2RlZmluZSBBUkNfSEFTSF9PUENPREUoc3RyaW5nKSBcCi0gICgoc3RyaW5nKVswXSA+PSAnYScgJiYgKHN0cmluZylbMF0gPD0gJ3onID8gKHN0cmluZylbMF0gLSAnYScgOiAyNikKLSNkZWZpbmUgQVJDX0hBU0hfSUNPREUoaW5zbikgXAotICAoKHVuc2lnbmVkIGludCkgKGluc24pID4+IDI3KQotCi0gIC8qIE1hY3JvcyB0byBhY2Nlc3MgYG5leHRfYXNtJywgYG5leHRfZGlzJyBzbyB1c2VycyBuZWVkbid0IGNhcmUgYWJvdXQgdGhlCi0gICAgIHVuZGVybHlpbmcgbWVjaGFuaXNtLiAgKi8KLSNkZWZpbmUgQVJDX09QQ09ERV9ORVhUX0FTTShvcCkgKChvcCktPm5leHRfYXNtKQotI2RlZmluZSBBUkNfT1BDT0RFX05FWFRfRElTKG9wKSAoKG9wKS0+bmV4dF9kaXMpCi19OwotCi1zdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgewotICBjaGFyICpuYW1lOwkJCS8qIGVnOiAiZXEiICovCi0gIHNob3J0IHZhbHVlOwkJCS8qIGVnOiAxICovCi0gIHVuc2lnbmVkIGNoYXIgdHlwZTsJCS8qIGluZGV4IGludG8gYGFyY19vcGVyYW5kcycgKi8KLSAgdW5zaWduZWQgY2hhciBmbGFnczsJCS8qIHZhcmlvdXMgZmxhZyBiaXRzICovCi0KLS8qIFZhbHVlcyBmb3IgYGZsYWdzJy4gICovCi0KLS8qIFJldHVybiBDUFUgbnVtYmVyLCBnaXZlbiBmbGFnIGJpdHMuICAqLwotI2RlZmluZSBBUkNfT1BWQUxfQ1BVKGJpdHMpICgoYml0cykgJiBBUkNfTUFDSF9DUFVfTUFTSykKLS8qIFJldHVybiBNQUNIIG51bWJlciwgZ2l2ZW4gZmxhZyBiaXRzLiAgKi8KLSNkZWZpbmUgQVJDX09QVkFMX01BQ0goYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX01BU0spCi19OwotCi1zdHJ1Y3QgYXJjX29wZXJhbmQgewotICAvKiBPbmUgb2YgdGhlIGluc24gZm9ybWF0IGNoYXJzLiAgKi8KLSAgdW5zaWduZWQgY2hhciBmbXQ7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kIChtYXkgYmUgdW51c2VkIGZvciBhIG1vZGlmaWVyKS4gICovCi0gIHVuc2lnbmVkIGNoYXIgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24sIG9yCi0gICAgIHRoZSBtb2RpZmllcidzIGZsYWcgYml0IChtYXkgYmUgdW51c2VkIGZvciBhIG1vZGlmaWVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzaGlmdDsKLQotICAvKiBWYXJpb3VzIGZsYWcgYml0cy4gICovCi0gIGludCBmbGFnczsKLQotLyogVmFsdWVzIGZvciBgZmxhZ3MnLiAgKi8KLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgc3VmZml4IHRvIHRoZSBvcGNvZGUuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9TVUZGSVggMQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSByZWxhdGl2ZSBicmFuY2ggZGlzcGxhY2VtZW50LiAgVGhlIGRpc2Fzc2VtYmxlcgotICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX1JFTEFUSVZFX0JSQU5DSCAyCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhbiBhYnNvbHV0ZSBicmFuY2ggYWRkcmVzcy4gIFRoZSBkaXNhc3NlbWJsZXIKLSAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9BQlNPTFVURV9CUkFOQ0ggNAotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYW4gYWRkcmVzcy4gIFRoZSBkaXNhc3NlbWJsZXIKLSAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9BRERSRVNTIDgKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgbG9uZyBpbW1lZGlhdGUgdmFsdWUuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9MSU1NIDB4MTAKLQotLyogVGhpcyBvcGVyYW5kIHRha2VzIHNpZ25lZCB2YWx1ZXMuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9TSUdORUQgMHgyMAotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcywgYnV0IGFsc28gYWNjZXB0cyBhIGZ1bGwgcG9zaXRpdmUKLSAgIHJhbmdlIG9mIHZhbHVlcy4gIFRoYXQgaXMsIGlmIGJpdHMgaXMgMTYsIGl0IHRha2VzIGFueSB2YWx1ZSBmcm9tCi0gICAtMHg4MDAwIHRvIDB4ZmZmZi4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX1NJR05PUFQgMHg0MAotCi0vKiBUaGlzIG9wZXJhbmQgc2hvdWxkIGJlIHJlZ2FyZGVkIGFzIGEgbmVnYXRpdmUgbnVtYmVyIGZvciB0aGUKLSAgIHB1cnBvc2VzIG9mIG92ZXJmbG93IGNoZWNraW5nIChpLmUuLCB0aGUgbm9ybWFsIG1vc3QgbmVnYXRpdmUKLSAgIG51bWJlciBpcyBkaXNhbGxvd2VkIGFuZCBvbmUgbW9yZSB0aGFuIHRoZSBub3JtYWwgbW9zdCBwb3NpdGl2ZQotICAgbnVtYmVyIGlzIGFsbG93ZWQpLiAgVGhpcyBmbGFnIHdpbGwgb25seSBiZSBzZXQgZm9yIGEgc2lnbmVkCi0gICBvcGVyYW5kLiAgKi8KLSNkZWZpbmUgQVJDX09QRVJBTkRfTkVHQVRJVkUgMHg4MAotCi0vKiBUaGlzIG9wZXJhbmQgZG9lc24ndCByZWFsbHkgZXhpc3QuICBUaGUgcHJvZ3JhbSB1c2VzIHRoZXNlIG9wZXJhbmRzCi0gICBpbiBzcGVjaWFsIHdheXMuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9GQUtFIDB4MTAwCi0KLS8qIE1vZGlmaWVyIHZhbHVlcy4gICovCi0vKiBBIGRvdCBpcyByZXF1aXJlZCBiZWZvcmUgYSBzdWZmaXguICBFZzogLmxlICAqLwotI2RlZmluZSBBUkNfTU9EX0RPVCAweDEwMDAKLQotLyogQSBub3JtYWwgcmVnaXN0ZXIgaXMgYWxsb3dlZCAobm90IHVzZWQsIGJ1dCBoZXJlIGZvciBjb21wbGV0ZW5lc3MpLiAgKi8KLSNkZWZpbmUgQVJDX01PRF9SRUcgMHgyMDAwCi0KLS8qIEFuIGF1eGlsaWFyeSByZWdpc3RlciBuYW1lIGlzIGV4cGVjdGVkLiAgKi8KLSNkZWZpbmUgQVJDX01PRF9BVVhSRUcgMHg0MDAwCi0KLS8qIFN1bSBvZiBhbGwgQVJDX01PRF9YWFggYml0cy4gICovCi0jZGVmaW5lIEFSQ19NT0RfQklUUyAweDcwMDAKLQotLyogTm9uLXplcm8gaWYgdGhlIG9wZXJhbmQgdHlwZSBpcyByZWFsbHkgYSBtb2RpZmllci4gICovCi0jZGVmaW5lIEFSQ19NT0RfUChYKSAoKFgpICYgQVJDX01PRF9CSVRTKQotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChwICYgKCgxIDw8IG8tPmJpdHMpIC0gMSkpIDw8IG8tPnNoaWZ0OwotICAgICAoSSBpcyB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggd2UgYXJlIGZpbGxpbmcgaW4sIE8gaXMgYSBwb2ludGVyIHRvCi0gICAgIHRoaXMgc3RydWN0dXJlLCBhbmQgT1AgaXMgdGhlIG9wY29kZSB2YWx1ZTsgdGhpcyBhc3N1bWVzIHR3b3MKLSAgICAgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIGFuZCB0aGUgb3BlcmFuZCB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSBuZXcgdmFsdWUKLSAgICAgb2YgdGhlIGluc3RydWN0aW9uLiAgSWYgdGhlIEVSUk1TRyBhcmd1bWVudCBpcyBub3QgTlVMTCwgdGhlbiBpZgotICAgICB0aGUgb3BlcmFuZCB2YWx1ZSBpcyBpbGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgc2V0IHRvIGEgd2FybmluZwotICAgICBzdHJpbmcgKHRoZSBvcGVyYW5kIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gYW55IGNhc2UpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgdmFsdWUgaXMgbGVnYWwsICpFUlJNU0cgd2lsbCBiZSB1bmNoYW5nZWQuCi0KLSAgICAgUkVHIGlzIG5vbi1OVUxMIHdoZW4gaW5zZXJ0aW5nIGEgcmVnaXN0ZXIgdmFsdWUuICAqLwotCi0gIGFyY19pbnNuICgqaW5zZXJ0KSBQQVJBTVMgKChhcmNfaW5zbiBpbnNuLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kLCBpbnQgbW9kcywKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnLCBsb25nIHZhbHVlLAotCQkJICAgICAgY29uc3QgY2hhciAqKmVycm1zZykpOwotCi0gIC8qIEV4dHJhY3Rpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRvCi0gICAgIGV4dHJhY3QgdGhpcyBvcGVyYW5kIHR5cGUgZnJvbSBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBjb21wdXRlCi0gICAgICAgICBvcCA9ICgoaSkgPj4gby0+c2hpZnQpICYgKCgxIDw8IG8tPmJpdHMpIC0gMSk7Ci0JIGlmICgoby0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpICE9IDAKLQkgICAgICYmIChvcCAmICgxIDw8IChvLT5iaXRzIC0gMSkpKSAhPSAwKQotCSAgIG9wIC09IDEgPDwgby0+Yml0czsKLSAgICAgKEkgaXMgdGhlIGluc3RydWN0aW9uLCBPIGlzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSwgYW5kIE9QCi0gICAgIGlzIHRoZSByZXN1bHQ7IHRoaXMgYXNzdW1lcyB0d29zIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgb3BlcmFuZC4gIElmCi0gICAgIHRoZSBJTlZBTElEIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCAqSU5WQUxJRCB3aWxsIGJlIHNldCB0bwotICAgICBub24temVybyBpZiB0aGlzIG9wZXJhbmQgdHlwZSBjYW4gbm90IGFjdHVhbGx5IGJlIGV4dHJhY3RlZCBmcm9tCi0gICAgIHRoaXMgb3BlcmFuZCAoaS5lLiwgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IG1hdGNoKS4gIElmIHRoZQotICAgICBvcGVyYW5kIGlzIHZhbGlkLCAqSU5WQUxJRCB3aWxsIG5vdCBiZSBjaGFuZ2VkLgotCi0gICAgIElOU04gaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHR3byBgYXJjX2luc24ncy4gIFRoZSBmaXJzdCBlbGVtZW50IGlzCi0gICAgIHRoZSBpbnNuLCB0aGUgc2Vjb25kIGlzIHRoZSBsaW1tIGlmIHByZXNlbnQuCi0KLSAgICAgT3BlcmFuZHMgdGhhdCBoYXZlIGEgcHJpbnRhYmxlIGZvcm0gbGlrZSByZWdpc3RlcnMgYW5kIHN1ZmZpeGVzIGhhdmUKLSAgICAgdGhlaXIgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlIHBvaW50ZXIgc3RvcmVkIGluIE9QVkFMLiAgKi8KLQotICBsb25nICgqZXh0cmFjdCkgUEFSQU1TICgoYXJjX2luc24gKmluc24sCi0JCQkgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQsCi0JCQkgICBpbnQgbW9kcywgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqb3B2YWwsCi0JCQkgICBpbnQgKmludmFsaWQpKTsKLX07Ci0KLS8qIEJpdHMgdGhhdCBzYXkgd2hhdCB2ZXJzaW9uIG9mIGNwdSB3ZSBoYXZlLgotICAgVGhlc2Ugc2hvdWxkIGJlIHBhc3NlZCB0byBhcmNfaW5pdF9vcGNvZGVfdGFibGVzLgotICAgQXQgcHJlc2VudCwgYWxsIHRoZXJlIGlzIGlzIHRoZSBjcHUgdHlwZS4gICovCi0KLS8qIENQVSBudW1iZXIsIGdpdmVuIHZhbHVlIHBhc3NlZCB0byBgYXJjX2luaXRfb3Bjb2RlX3RhYmxlcycuICAqLwotI2RlZmluZSBBUkNfSEFWRV9DUFUoYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX0NQVV9NQVNLKQotLyogTUFDSCBudW1iZXIsIGdpdmVuIHZhbHVlIHBhc3NlZCB0byBgYXJjX2luaXRfb3Bjb2RlX3RhYmxlcycuICAqLwotI2RlZmluZSBBUkNfSEFWRV9NQUNIKGJpdHMpICgoYml0cykgJiBBUkNfTUFDSF9NQVNLKQotCi0vKiBTcGVjaWFsIHJlZ2lzdGVyIHZhbHVlczogICovCi0jZGVmaW5lIEFSQ19SRUdfU0hJTU1fVVBEQVRFIDYxCi0jZGVmaW5lIEFSQ19SRUdfU0hJTU0gNjMKLSNkZWZpbmUgQVJDX1JFR19MSU1NIDYyCi0KLS8qIE5vbi16ZXJvIGlmIFJFRyBpcyBhIGNvbnN0YW50IG1hcmtlci4gICovCi0jZGVmaW5lIEFSQ19SRUdfQ09OU1RBTlRfUChSRUcpICgoUkVHKSA+PSA2MSkKLQotLyogUG9zaXRpb25zIGFuZCBtYXNrcyBvZiB2YXJpb3VzIGZpZWxkczogICovCi0jZGVmaW5lIEFSQ19TSElGVF9SRUdBIDIxCi0jZGVmaW5lIEFSQ19TSElGVF9SRUdCIDE1Ci0jZGVmaW5lIEFSQ19TSElGVF9SRUdDIDkKLSNkZWZpbmUgQVJDX01BU0tfUkVHIDYzCi0KLS8qIERlbGF5IHNsb3QgdHlwZXMuICAqLwotI2RlZmluZSBBUkNfREVMQVlfTk9ORSAwCS8qIG5vIGRlbGF5IHNsb3QgKi8KLSNkZWZpbmUgQVJDX0RFTEFZX05PUk1BTCAxCS8qIGRlbGF5IHNsb3QgaW4gYm90aCBjYXNlcyAqLwotI2RlZmluZSBBUkNfREVMQVlfSlVNUCAyCS8qIGRlbGF5IHNsb3Qgb25seSBpZiBicmFuY2ggdGFrZW4gKi8KLQotLyogTm9uLXplcm8gaWYgWCB3aWxsIGZpdCBpbiBhIHNpZ25lZCA5IGJpdCBmaWVsZC4gICovCi0jZGVmaW5lIEFSQ19TSElNTV9DT05TVF9QKHgpICgobG9uZykgKHgpID49IC0yNTYgJiYgKGxvbmcpICh4KSA8PSAyNTUpCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgYXJjX29wZXJhbmRzW107Ci1leHRlcm4gY29uc3QgaW50IGFyY19vcGVyYW5kX2NvdW50OwotZXh0ZXJuIC8qY29uc3QqLyBzdHJ1Y3QgYXJjX29wY29kZSBhcmNfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBhcmNfb3Bjb2Rlc19jb3VudDsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgYXJjX3N1ZmZpeGVzW107Ci1leHRlcm4gY29uc3QgaW50IGFyY19zdWZmaXhlc19jb3VudDsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgYXJjX3JlZ19uYW1lc1tdOwotZXh0ZXJuIGNvbnN0IGludCBhcmNfcmVnX25hbWVzX2NvdW50OwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgYXJjX29wZXJhbmRfbWFwW107Ci0KLS8qIFV0aWxpdHkgZm5zIGluIGFyYy1vcGMuYy4gICovCi1pbnQgYXJjX2dldF9vcGNvZGVfbWFjaCBQQVJBTVMgKChpbnQsIGludCkpOwotLyogYGFyY19vcGNvZGVfaW5pdF90YWJsZXMnIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBgYXJjX3h4eF9zdXBwb3J0ZWQnLiAgKi8KLXZvaWQgYXJjX29wY29kZV9pbml0X3RhYmxlcyBQQVJBTVMgKChpbnQpKTsKLXZvaWQgYXJjX29wY29kZV9pbml0X2luc2VydCBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGFyY19vcGNvZGVfaW5pdF9leHRyYWN0IFBBUkFNUyAoKHZvaWQpKTsKLWNvbnN0IHN0cnVjdCBhcmNfb3Bjb2RlICphcmNfb3Bjb2RlX2xvb2t1cF9hc20gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1jb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqYXJjX29wY29kZV9sb29rdXBfZGlzIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotaW50IGFyY19vcGNvZGVfbGltbV9wIFBBUkFNUyAoKGxvbmcgKikpOwotY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICphcmNfb3Bjb2RlX2xvb2t1cF9zdWZmaXggUEFSQU1TICgoY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICp0eXBlLCBpbnQgdmFsdWUpKTsKLWludCBhcmNfb3Bjb2RlX3N1cHBvcnRlZCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqKSk7Ci1pbnQgYXJjX29wdmFsX3N1cHBvcnRlZCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKikpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvYXJtLmggYi9pbmNsdWRlL29wY29kZS9hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwODdlYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKiBBUk0gb3Bjb2RlIGxpc3QuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIgYW5kIEdBUy4KLQotR0RCIGFuZCBHQVMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCIGFuZCBHQVMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0RCIG9yIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogdHlwZXMgb2YgaW5zdHJ1Y3Rpb24gKGVuY29kZWQgaW4gYml0cyAyNiBhbmQgMjcgb2YgdGhlIGluc3RydWN0aW9uKSAqLwotCi0jZGVmaW5lIFRZUEVfQVJJVEhNRVRJQwkJMAotI2RlZmluZSBUWVBFX0xEUl9TVFIJCTEKLSNkZWZpbmUgVFlQRV9CTE9DS19CUkFOQ0gJMgotI2RlZmluZSBUWVBFX1NXSQkJMwotCi0vKiBiaXQgMjUgZGVjaWRlcyB3aGV0aGVyIGFuIGluc3RydWN0aW9uIGlzIGEgYmxvY2sgbW92ZSBvciBhIGJyYW5jaCAqLwotI2RlZmluZSBTVUJUWVBFX0JMT0NLCQkwCi0jZGVmaW5lIFNVQlRZUEVfQlJBTkNICQkxCi0KLS8qIGNvZGVzIHRvIGRpc3Rpbmd1aXNoIHRoZSBhcml0aG1ldGljIGluc3RydWN0aW9ucyAqLwotCi0jZGVmaW5lIE9QQ09ERV9BTkQJMAotI2RlZmluZSBPUENPREVfRU9SCTEKLSNkZWZpbmUgT1BDT0RFX1NVQgkyCi0jZGVmaW5lIE9QQ09ERV9SU0IJMwotI2RlZmluZSBPUENPREVfQURECTQKLSNkZWZpbmUgT1BDT0RFX0FEQwk1Ci0jZGVmaW5lIE9QQ09ERV9TQkMJNgotI2RlZmluZSBPUENPREVfUlNDCTcKLSNkZWZpbmUgT1BDT0RFX1RTVAk4Ci0jZGVmaW5lIE9QQ09ERV9URVEJOQotI2RlZmluZSBPUENPREVfQ01QCTEwCi0jZGVmaW5lIE9QQ09ERV9DTU4JMTEKLSNkZWZpbmUgT1BDT0RFX09SUgkxMgotI2RlZmluZSBPUENPREVfTU9WCTEzCi0jZGVmaW5lIE9QQ09ERV9CSUMJMTQKLSNkZWZpbmUgT1BDT0RFX01WTgkxNQotCi0vKiBjb25kaXRpb24gY29kZXMgKi8KLQotI2RlZmluZSBDT05EX0VRCQkwCi0jZGVmaW5lIENPTkRfTkUJCTEKLSNkZWZpbmUgQ09ORF9DUwkJMgotI2RlZmluZSBDT05EX0NDCQkzCi0jZGVmaW5lIENPTkRfTUkJCTQKLSNkZWZpbmUgQ09ORF9QTAkJNQotI2RlZmluZSBDT05EX1ZTCQk2Ci0jZGVmaW5lIENPTkRfVkMJCTcKLSNkZWZpbmUgQ09ORF9ISQkJOAotI2RlZmluZSBDT05EX0xTCQk5Ci0jZGVmaW5lIENPTkRfR0UJCTEwCi0jZGVmaW5lIENPTkRfTFQJCTExCi0jZGVmaW5lIENPTkRfR1QJCTEyCi0jZGVmaW5lIENPTkRfTEUJCTEzCi0jZGVmaW5lIENPTkRfQUwJCTE0Ci0jZGVmaW5lIENPTkRfTlYJCTE1Ci0KLS8qIERlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIGFuIEFSTSBtYWNoaW5lIGluc3RydWN0aW9uICovCi0KLXN0cnVjdCBnZW5lcmljX2ZtdCB7Ci0gICAgdW5zaWduZWQgcmVzdAk6MjU7CS8qIHRoZSByZXN0IG9mIHRoZSBpbnN0cnVjdGlvbiAqLwotICAgIHVuc2lnbmVkIHN1YnR5cGUJOjE7CS8qIHVzZWQgdG8gZGVjaWRlIGJldHdlZW4gYmxvY2sgYW5kIGJyYW5jaCAqLwotICAgIHVuc2lnbmVkIHR5cGUJOjI7CS8qIG9uZSBvZiBUWVBFXyogKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KLX07Ci0KLXN0cnVjdCBhcml0aF9mbXQgewotICAgIHVuc2lnbmVkIG9wZXJhbmQyCToxMjsJLyogI25uIG9yIHJuIG9yIHJuIHNoaWZ0ICNtIG9yIHJuIHNoaWZ0IHJtICovCi0gICAgdW5zaWduZWQgZGVzdAk6NDsJLyogcGxhY2Ugd2hlcmUgdGhlIGFuc3dlciBnb2VzICovCi0gICAgdW5zaWduZWQgb3BlcmFuZDEJOjQ7CS8qIGZpcnN0IG9wZXJhbmQgdG8gaW5zdHJ1Y3Rpb24gKi8KLSAgICB1bnNpZ25lZCBzZXQJOjE7CS8qID09IDEgbWVhbnMgc2V0IHByb2Nlc3NvciBmbGFncyAqLwotICAgIHVuc2lnbmVkIG9wY29kZQk6NDsJLyogb25lIG9mIE9QQ09ERV8qIGRlZmluZWQgYWJvdmUgKi8KLSAgICB1bnNpZ25lZCBpbW1lZAk6MTsJLyogb3BlcmFuZDIgaXMgYW4gaW1tZWRpYXRlIHZhbHVlICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9BUklUSE1FVElDICovCi0gICAgdW5zaWduZWQgY29uZAk6NDsJLyogb25lIG9mIENPTkRfKiBkZWZpbmVkIGFib3ZlICovCi19OwotCi1zdHJ1Y3QgbGRyX3N0cl9mbXQgewotICAgIHVuc2lnbmVkIG9mZnNldAk6MTI7CS8qICNubiBvciBybiBvciBybiBzaGlmdCAjbSAqLwotICAgIHVuc2lnbmVkIHJlZwk6NDsJLyogZGVzdGluYXRpb24gZm9yIExEUiwgc291cmNlIGZvciBTVFIgKi8KLSAgICB1bnNpZ25lZCBiYXNlCTo0OwkvKiBiYXNlIHJlZ2lzdGVyICovCi0gICAgdW5zaWduZWQgaXNfbG9hZAk6MTsJLyogPT0gMSBmb3IgTERSICovCi0gICAgdW5zaWduZWQgd3JpdGViYWNrCToxOwkvKiA9PSAxIG1lYW5zIHdyaXRlIGJhY2sgKGJhc2Urb2Zmc2V0KSBpbnRvIGJhc2UgKi8KLSAgICB1bnNpZ25lZCBieXRlCToxOwkvKiA9PSAxIG1lYW5zIGJ5dGUgYWNjZXNzIGVsc2Ugd29yZCAqLwotICAgIHVuc2lnbmVkIHVwCQk6MTsJLyogPT0gMSBtZWFucyBhZGQgb2Zmc2V0IGVsc2Ugc3VidHJhY3QgaXQgKi8KLSAgICB1bnNpZ25lZCBwcmVfaW5kZXgJOjE7CS8qID09IDEgbWVhbnMgW2EsYl0gZm9ybSBlbHNlIFthXSxiIGZvcm0gKi8KLSAgICB1bnNpZ25lZCBpbW1lZAk6MTsJLyogPT0gMCBtZWFucyBpbW1lZGlhdGUgb2Zmc2V0ICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9MRFJfU1RSICovCi0gICAgdW5zaWduZWQgY29uZAk6NDsJLyogb25lIG9mIENPTkRfKiBkZWZpbmVkIGFib3ZlICovCi19OwotCi1zdHJ1Y3QgYmxvY2tfZm10IHsKLSAgICB1bnNpZ25lZCBtYXNrCToxNjsJLyogcmVnaXN0ZXIgbWFzayAqLwotICAgIHVuc2lnbmVkIGJhc2UJOjQ7CS8qIHJlZ2lzdGVyIHVzZWQgYXMgYmFzZSBvZiBtb3ZlICovCi0gICAgdW5zaWduZWQgaXNfbG9hZAk6MTsJLyogPT0gMSBmb3IgTERNICovCi0gICAgdW5zaWduZWQgd3JpdGViYWNrCToxOwkvKiA9PSAxIG1lYW5zIHVwZGF0ZSBiYXNlIGFmdGVyIG1vdmUgKi8KLSAgICB1bnNpZ25lZCBzZXQJOjE7CS8qID09IDEgbWVhbnMgc2V0IGZsYWdzIGluIHBjIGlmIGluY2x1ZGVkIGluIG1hc2sgKi8KLSAgICB1bnNpZ25lZCBpbmNyZW1lbnQJOjE7CS8qID09IDEgbWVhbnMgaW5jcmVtZW50IGJhc2UgcmVnaXN0ZXIgKi8KLSAgICB1bnNpZ25lZCBiZWZvcmUJOjE7CS8qID09IDEgbWVhbnMgaW5jL2RlYyBiZWZvcmUgZWFjaCBtb3ZlICovCi0gICAgdW5zaWduZWQgaXNfYmxvY2sJOjE7CS8qID09IFNVQlRZUEVfQkxPQ0sgKi8KLSAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX0JMT0NLX0JSQU5DSCAqLwotICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIG9uZSBvZiBDT05EXyogZGVmaW5lZCBhYm92ZSAqLwotfTsKLQotc3RydWN0IGJyYW5jaF9mbXQgewotICAgIHVuc2lnbmVkIGRlc3QJOjI0OwkvKiBkZXN0aW5hdGlvbiBvZiB0aGUgYnJhbmNoICovCi0gICAgdW5zaWduZWQgbGluawk6MTsJLyogYnJhbmNoIHdpdGggbGluayAoZnVuY3Rpb24gY2FsbCkgKi8KLSAgICB1bnNpZ25lZCBpc19icmFuY2gJOjE7CS8qID09IFNVQlRZUEVfQlJBTkNIICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9CTE9DS19CUkFOQ0ggKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KLX07Ci0KLSNkZWZpbmUgUk9VTkRfTgkJMAotI2RlZmluZSBST1VORF9QCQkxCi0jZGVmaW5lIFJPVU5EX00JCTIKLSNkZWZpbmUgUk9VTkRfWgkJMwotCi0jZGVmaW5lIEZMT0FUMl9NVkYJMAotI2RlZmluZSBGTE9BVDJfTU5GCTEKLSNkZWZpbmUgRkxPQVQyX0FCUwkyCi0jZGVmaW5lIEZMT0FUMl9STkQJMwotI2RlZmluZSBGTE9BVDJfU1FUCTQKLSNkZWZpbmUgRkxPQVQyX0xPRwk1Ci0jZGVmaW5lIEZMT0FUMl9MR04JNgotI2RlZmluZSBGTE9BVDJfRVhQCTcKLSNkZWZpbmUgRkxPQVQyX1NJTgk4Ci0jZGVmaW5lIEZMT0FUMl9DT1MJOQotI2RlZmluZSBGTE9BVDJfVEFOCTEwCi0jZGVmaW5lIEZMT0FUMl9BU04JMTEKLSNkZWZpbmUgRkxPQVQyX0FDUwkxMgotI2RlZmluZSBGTE9BVDJfQVROCTEzCi0KLSNkZWZpbmUgRkxPQVQzX0FERgkwCi0jZGVmaW5lIEZMT0FUM19NVUYJMQotI2RlZmluZSBGTE9BVDNfU1VGCTIKLSNkZWZpbmUgRkxPQVQzX1JTRgkzCi0jZGVmaW5lIEZMT0FUM19EVkYJNAotI2RlZmluZSBGTE9BVDNfUkRGCTUKLSNkZWZpbmUgRkxPQVQzX1BPVwk2Ci0jZGVmaW5lIEZMT0FUM19SUFcJNwotI2RlZmluZSBGTE9BVDNfUk1GCTgKLSNkZWZpbmUgRkxPQVQzX0ZNTAk5Ci0jZGVmaW5lIEZMT0FUM19GRFYJMTAKLSNkZWZpbmUgRkxPQVQzX0ZSRAkxMQotI2RlZmluZSBGTE9BVDNfUE9MCTEyCi0KLXN0cnVjdCBmbG9hdDJfZm10IHsKLSAgICB1bnNpZ25lZCBvcGVyYW5kMgk6MzsJLyogc2Vjb25kIG9wZXJhbmQgKi8KLSAgICB1bnNpZ25lZCBpbW1lZAk6MTsJLyogPT0gMSBpZiBzZWNvbmQgb3BlcmFuZCBpcyBhIGNvbnN0YW50ICovCi0gICAgdW5zaWduZWQgcGFkMQk6MTsJLyogPT0gMCAqLwotICAgIHVuc2lnbmVkIHJvdW5kaW5nCToyOwkvKiBST1VORF8qICovCi0gICAgdW5zaWduZWQgaXNfZG91YmxlCToxOwkvKiA9PSAxIGlmIHByZWNpc2lvbiBpcyBkb3VibGUgKG9ubHkgaWYgbm90IGV4dGVuZGVkKSAqLwotICAgIHVuc2lnbmVkIHBhZDIJOjQ7CS8qID09IDEgKi8KLSAgICB1bnNpZ25lZCBkZXN0CTozOwkvKiBkZXN0aW5hdGlvbiAqLwotICAgIHVuc2lnbmVkIGlzXzJfb3AJOjE7CS8qID09IDEgaWYgMiBvcGVyYW5kIGlucyAqLwotICAgIHVuc2lnbmVkIG9wZXJhbmQxCTozOwkvKiBmaXJzdCBvcGVyYW5kIChvbmx5IG9mIGlzXzJfb3AgPT0gMCkgKi8KLSAgICB1bnNpZ25lZCBpc19leHRlbmRlZCA6MTsJLyogPT0gMSBpZiBwcmVjaXNpb24gaXMgZXh0ZW5kZWQgKi8KLSAgICB1bnNpZ25lZCBvcGNvZGUJOjQ7CS8qIEZMT0FUMl8qIG9yIEZMT0FUM18qIGRlcGVuZGluZyBvbiBpc18yX29wICovCi0gICAgdW5zaWduZWQgbXVzdF9iZV8yCToyOwkvKiA9PSAyICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9TV0kgKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBDT05EXyogKi8KLX07Ci0KLXN0cnVjdCBzd2lfZm10IHsKLSAgICB1bnNpZ25lZCBhcmd1bWVudAk6MjQ7CS8qIGFyZ3VtZW50IHRvIFNXSSAoc3lzY2FsbCBudW1iZXIpICovCi0gICAgdW5zaWduZWQgbXVzdF9iZV8zCToyOwkvKiA9PSAzICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9TV0kgKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KLX07Ci0KLXVuaW9uIGluc25fZm10IHsKLSAgICBzdHJ1Y3QgZ2VuZXJpY19mbXQJZ2VuZXJpYzsKLSAgICBzdHJ1Y3QgYXJpdGhfZm10CWFyaXRoOwotICAgIHN0cnVjdCBsZHJfc3RyX2ZtdAlsZHJfc3RyOwotICAgIHN0cnVjdCBibG9ja19mbXQJYmxvY2s7Ci0gICAgc3RydWN0IGJyYW5jaF9mbXQJYnJhbmNoOwotICAgIHN0cnVjdCBzd2lfZm10CXN3aTsKLSAgICB1bnNpZ25lZCBsb25nCWluczsKLX07Ci0KLXN0cnVjdCBvcGNvZGUgewotICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUsIG1hc2s7CS8qIHJlY29nbmlzZSBpbnN0cnVjdGlvbiBpZiAob3AmbWFzayk9PXZhbHVlICovCi0gICAgY2hhciAqYXNzZW1ibGVyOwkJLyogaG93IHRvIGRpc2Fzc2VtYmxlIHRoaXMgaW5zdHJ1Y3Rpb24gKi8KLX07Ci0KLS8qIGZvcm1hdCBvZiB0aGUgYXNzZW1ibGVyIHN0cmluZyA6Ci0gICAKLSAgICUlCQkJJQotICAgJTxiaXRmaWVsZD5kCQlwcmludCB0aGUgYml0ZmllbGQgaW4gZGVjaW1hbAotICAgJTxiaXRmaWVsZD54CQlwcmludCB0aGUgYml0ZmllbGQgaW4gaGV4Ci0gICAlPGJpdGZpZWxkPnIJCXByaW50IGFzIGFuIEFSTSByZWdpc3RlcgotICAgJTxiaXRmaWVsZD5mCQlwcmludCBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IGlmID43IGVsc2UgYW4gZnAgcmVnaXN0ZXIKLSAgICVjCQkJcHJpbnQgY29uZGl0aW9uIGNvZGUgKGFsd2F5cyBiaXRzIDI4LTMxKQotICAgJVAJCQlwcmludCBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24gaW4gYXJpdGhtZXRpYyBpbnNuCi0gICAlUQkJCXByaW50IGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpbiBsZGYvc3RmIGluc24KLSAgICVSCQkJcHJpbnQgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgbW9kZQotICAgJTxiaXRudW0+J2MJCXByaW50IHNwZWNpZmllZCBjaGFyIGlmZiBiaXQgaXMgb25lCi0gICAlPGJpdG51bT5gYwkJcHJpbnQgc3BlY2lmaWVkIGNoYXIgaWZmIGJpdCBpcyB6ZXJvCi0gICAlPGJpdG51bT4/YWIJCXByaW50IGEgaWYgYml0IGlzIG9uZSBlbHNlIHByaW50IGIKLSAgICVwCQkJcHJpbnQgJ3AnIGlmZiBiaXRzIDEyLTE1IGFyZSAxNQotICAgJW8JCQlwcmludCBvcGVyYW5kMiAoaW1tZWRpYXRlIG9yIHJlZ2lzdGVyICsgc2hpZnQpCi0gICAlYQkJCXByaW50IGFkZHJlc3MgZm9yIGxkci9zdHIgaW5zdHJ1Y3Rpb24KLSAgICViCQkJcHJpbnQgYnJhbmNoIGRlc3RpbmF0aW9uCi0gICAlQQkJCXByaW50IGFkZHJlc3MgZm9yIGxkYy9zdGMvbGRmL3N0ZiBpbnN0cnVjdGlvbgotICAgJW0JCQlwcmludCByZWdpc3RlciBtYXNrIGZvciBsZG0vc3RtIGluc3RydWN0aW9uCi0qLwotCi1zdGF0aWMgc3RydWN0IG9wY29kZSBvcGNvZGVzW10gPSB7Ci0gICAgLyogQVJNIGluc3RydWN0aW9ucyAqLwotICAgIDB4MDAwMDAwOTAsIDB4MGZlMDAwZjAsICJtdWwlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlMC0zciIsCi0gICAgMHgwMDIwMDA5MCwgMHgwZmUwMDBmMCwgIm1sYSUyMCdzICUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCAlOC0xMXIiLAotICAgIDB4MDAwMDAwMDAsIDB4MGRlMDAwMDAsICJhbmQlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwMjAwMDAwLCAweDBkZTAwMDAwLCAiZW9yJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMDQwMDAwMCwgMHgwZGUwMDAwMCwgInN1YiVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDA2MDAwMDAsIDB4MGRlMDAwMDAsICJyc2IlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwODAwMDAwLCAweDBkZTAwMDAwLCAiYWRkJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMGEwMDAwMCwgMHgwZGUwMDAwMCwgImFkYyVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDBjMDAwMDAsIDB4MGRlMDAwMDAsICJzYmMlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwZTAwMDAwLCAweDBkZTAwMDAwLCAicnNjJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMTAwMDAwMCwgMHgwZGUwMDAwMCwgInRzdCVjJXAgJTE2LTE5ciwgJW8iLAotICAgIDB4MDEyMDAwMDAsIDB4MGRlMDAwMDAsICJ0ZXElYyVwICUxNi0xOXIsICVvIiwKLSAgICAweDAxNDAwMDAwLCAweDBkZTAwMDAwLCAiY21wJWMlcCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMTYwMDAwMCwgMHgwZGUwMDAwMCwgImNtbiVjJXAgJTE2LTE5ciwgJW8iLAotICAgIDB4MDE4MDAwMDAsIDB4MGRlMDAwMDAsICJvcnIlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAxYTAwMDAwLCAweDBkZTAwMDAwLCAibW92JWMlMjAncyAlMTItMTVyLCAlbyIsCi0gICAgMHgwMWMwMDAwMCwgMHgwZGUwMDAwMCwgImJpYyVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDFlMDAwMDAsIDB4MGRlMDAwMDAsICJtdm4lYyUyMCdzICUxMi0xNXIsICVvIiwKLSAgICAweDA0MDAwMDAwLCAweDBjMTAwMDAwLCAic3RyJWMlMjInYiAlMTItMTVyLCAlYSIsCi0gICAgMHgwNDEwMDAwMCwgMHgwYzEwMDAwMCwgImxkciVjJTIyJ2IgJTEyLTE1ciwgJWEiLAotICAgIDB4MDgwMDAwMDAsIDB4MGUxMDAwMDAsICJzdG0lYyUyMz9pZCUyND9iYSAlMTYtMTlyJTIyYCEsICVtIiwKLSAgICAweDA4MTAwMDAwLCAweDBlMTAwMDAwLCAibGRtJWMlMjM/aWQlMjQ/YmEgJTE2LTE5ciUyMmAhLCAlbSUyMideIiwKLSAgICAweDBhMDAwMDAwLCAweDBlMDAwMDAwLCAiYiVjJTI0J2wgJWIiLAotICAgIDB4MGYwMDAwMDAsIDB4MGYwMDAwMDAsICJzd2klYyAlMC0yM3giLAotICAgIC8qIEZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyAqLwotICAgIDB4MGUwMDAxMDAsIDB4MGZmMDhmMTAsICJhZGYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGUxMDAxMDAsIDB4MGZmMDhmMTAsICJtdWYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGUyMDAxMDAsIDB4MGZmMDhmMTAsICJzdWYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGUzMDAxMDAsIDB4MGZmMDhmMTAsICJyc2YlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU0MDAxMDAsIDB4MGZmMDhmMTAsICJkdmYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU1MDAxMDAsIDB4MGZmMDhmMTAsICJyZGYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU2MDAxMDAsIDB4MGZmMDhmMTAsICJwb3clYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU3MDAxMDAsIDB4MGZmMDhmMTAsICJycHclYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU4MDAxMDAsIDB4MGZmMDhmMTAsICJybWYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGU5MDAxMDAsIDB4MGZmMDhmMTAsICJmbWwlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGVhMDAxMDAsIDB4MGZmMDhmMTAsICJmZHYlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGViMDAxMDAsIDB4MGZmMDhmMTAsICJmcmQlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGVjMDAxMDAsIDB4MGZmMDhmMTAsICJwb2wlYyVQJVIgJTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGUwMDgxMDAsIDB4MGZmMDhmMTAsICJtdmYlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGUxMDgxMDAsIDB4MGZmMDhmMTAsICJtbmYlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGUyMDgxMDAsIDB4MGZmMDhmMTAsICJhYnMlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGUzMDgxMDAsIDB4MGZmMDhmMTAsICJybmQlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU0MDgxMDAsIDB4MGZmMDhmMTAsICJzcXQlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU1MDgxMDAsIDB4MGZmMDhmMTAsICJsb2clYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU2MDgxMDAsIDB4MGZmMDhmMTAsICJsZ24lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU3MDgxMDAsIDB4MGZmMDhmMTAsICJleHAlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU4MDgxMDAsIDB4MGZmMDhmMTAsICJzaW4lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGU5MDgxMDAsIDB4MGZmMDhmMTAsICJjb3MlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGVhMDgxMDAsIDB4MGZmMDhmMTAsICJ0YW4lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGViMDgxMDAsIDB4MGZmMDhmMTAsICJhc24lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGVjMDgxMDAsIDB4MGZmMDhmMTAsICJhY3MlYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGVkMDgxMDAsIDB4MGZmMDhmMTAsICJhdG4lYyVQJVIgJTEyLTE0ZiwgJTAtM2YiLAotICAgIDB4MGUwMDAxMTAsIDB4MGZmMDBmMWYsICJmbHQlYyVQJVIgJTE2LTE4ZiwgJTEyLTE1ciIsCi0gICAgMHgwZTEwMDExMCwgMHgwZmZmMGY5OCwgImZpeCVjJVIgJTEyLTE1ciwgJTAtMmYiLAotICAgIDB4MGUyMDAxMTAsIDB4MGZmZjBmZmYsICJ3ZnMlYyAlMTItMTVyIiwKLSAgICAweDBlMzAwMTEwLCAweDBmZmYwZmZmLCAicmZzJWMgJTEyLTE1ciIsCi0gICAgMHgwZTQwMDExMCwgMHgwZmZmMGZmZiwgIndmYyVjICUxMi0xNXIiLAotICAgIDB4MGU1MDAxMTAsIDB4MGZmZjBmZmYsICJyZmMlYyAlMTItMTVyIiwKLSAgICAweDBlOTBmMTEwLCAweDBmZjhmZmYwLCAiY21mJWMgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGViMGYxMTAsIDB4MGZmOGZmZjAsICJjbmYlYyAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZWQwZjExMCwgMHgwZmY4ZmZmMCwgImNtZmUlYyAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZWYwZjExMCwgMHgwZmY4ZmZmMCwgImNuZmUlYyAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwYzAwMDEwMCwgMHgwZTEwMGYwMCwgInN0ZiVjJVEgJTEyLTE0ZiwgJUEiLAotICAgIDB4MGMxMDAxMDAsIDB4MGUxMDBmMDAsICJsZGYlYyVRICUxMi0xNGYsICVBIiwKLSAgICAvKiBHZW5lcmljIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyAqLwotICAgIDB4MGUwMDAwMDAsIDB4MGYwMDAwMTAsICJjZHAlYyAlOC0xMWQsICUyMC0yM2QsIGNyJTEyLTE1ZCwgY3IlMTYtMTlkLCBjciUwLTNkLCB7JTUtN2R9IiwKLSAgICAweDBlMDAwMDEwLCAweDBmMTAwMDEwLCAibXJjJWMgJTgtMTFkLCAlMjEtMjNkLCAlMTItMTVyLCBjciUxNi0xOWQsIGNyJTAtM2QsIHslNS03ZH0iLAotICAgIDB4MGUxMDAwMTAsIDB4MGYxMDAwMTAsICJtY3IlYyAlOC0xMWQsICUyMS0yM2QsICUxMi0xNXIsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSIsCi0gICAgMHgwYzAwMDAwMCwgMHgwZTEwMDAwMCwgInN0YyVjJTIyYGwgJTgtMTFkLCBjciUxMi0xNWQsICVBIiwKLSAgICAweDBjMTAwMDAwLCAweDBlMTAwMDAwLCAibGRjJWMlMjJgbCAlOC0xMWQsIGNyJTEyLTE1ZCwgJUEiLAotICAgIC8qIHRoZSByZXN0ICovCi0gICAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgInVuZGVmaW5lZCBpbnN0cnVjdGlvbiAlMC0zMXgiLAotfTsKLSNkZWZpbmUgTl9PUENPREVTCShzaXplb2Ygb3Bjb2RlcyAvIHNpemVvZiBvcGNvZGVzWzBdKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvY2dlbi5oIGIvaW5jbHVkZS9vcGNvZGUvY2dlbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDU0MmEzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2NnZW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzODAgKzAsMCBAQAotLyogSGVhZGVyIGZpbGUgZm9yIHRhcmdldHMgdXNpbmcgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvci4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIsIGFuZCB0aGUgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIENHRU5fSAotI2RlZmluZSBDR0VOX0gKLQotLyogPz8/IFRoaXMgZmlsZSByZXF1aXJlcyBiZmQuaCBidXQgb25seSB0byBnZXQgYmZkX3ZtYS4KLSAgIFNlZW1zIGxpa2UgYW4gYXdmdWwgbG90IHRvIHJlcXVpcmUganVzdCB0byBnZXQgc3VjaCBhIGZ1bmRhbWVudGFsIHR5cGUuCi0gICBQZXJoYXBzIHRoZSBkZWZpbml0aW9uIG9mIGJmZF92bWEgY2FuIGJlIG1vdmVkIG91dHNpZGUgb2YgYmZkLmguCi0gICBPciBwZXJoYXBzIG9uZSBjb3VsZCBkdXBsaWNhdGUgaXRzIGRlZmluaXRpb24gaW4gYW5vdGhlciBmaWxlLgotICAgVW50aWwgc3VjaCB0aW1lLCB0aGlzIGZpbGUgY29uZGl0aW9uYWxseSBjb21waWxlcyBkZWZpbml0aW9ucyB0aGF0IHJlcXVpcmUKLSAgIGJmZF92bWEgdXNpbmcgQkZEX1ZFUlNJT04uICAqLwotCi0vKiBFbnVtcyBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIHRoZXkgY2FuIGJlIHVzZWQuCi0gICBBbGxvdyB0aGVtIHRvIGJlIHVzZWQgaW4gc3RydWN0IGRlZmluaXRpb25zLCBldmVuIHRob3VnaCB0aGUgZW51bSBtdXN0Ci0gICBiZSBkZWZpbmVkIGVsc2V3aGVyZS4KLSAgIElmIENHRU5fQVJDSCBpc24ndCBkZWZpbmVkLCB0aGlzIGZpbGUgaXMgYmVpbmcgaW5jbHVkZWQgYnkgc29tZXRoaW5nIG90aGVyCi0gICB0aGFuIDxhcmNoPi1kZXNjLmguICAqLwotCi0vKiBQcmVwZW5kIHRoZSBhcmNoIG5hbWUsIGRlZmluZWQgaW4gPGFyY2g+LWRlc2MuaCwgYW5kIF9jZ2VuXyB0byBzeW1ib2wgUy4KLSAgIFRoZSBsYWNrIG9mIHNwYWNlcyBpbiB0aGUgYXJnIGxpc3QgaXMgaW1wb3J0YW50IGZvciBub24tc3RkYyBzeXN0ZW1zLgotICAgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5IDxhcmNoPi1kZXNjLmguCi0gICBJdCBjYW4gYmUgaW5jbHVkZWQgaW5kZXBlbmRlbnRseSBvZiA8YXJjaD4tZGVzYy5oLCBpbiB3aGljaCBjYXNlIHRoZSBhcmNoCi0gICBkZXBlbmRlbnQgcG9ydGlvbnMgd2lsbCBiZSBkZWNsYXJlZCBhcyAidW5rbm93bl9jZ2VuX2ZvbyIuICAqLwotCi0jaWZuZGVmIENHRU5fU1lNCi0jZGVmaW5lIENHRU5fU1lNKHMpIENPTkNBVDMgKHVua25vd24sX2NnZW5fLHMpCi0jZW5kaWYKLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzdGF0aWMgKHVuY2hhbmdpbmcpIHBpZWNlcyBhbmQgYXMgbXVjaCBvdGhlciBzdHVmZgotICAgYXMgd2UgY2FuIHJlYXNvbmFibHkgcHV0IGhlcmUuICBJdCdzIGdlbmVyYWxseSBjbGVhbmVyIHRvIHB1dCBzdHVmZiBoZXJlCi0gICByYXRoZXIgdGhhbiBoYXZpbmcgaXQgbWFjaGluZSBnZW5lcmF0ZWQgaWYgcG9zc2libGUuICAqLwotCi0vKiBUaGUgYXNzZW1ibGVyIHN5bnRheCBpcyBtYWRlIHVwIG9mIGV4cHJlc3Npb25zIChkdWguLi4pLgotICAgQXQgdGhlIGxvd2VzdCBsZXZlbCB0aGUgdmFsdWVzIGFyZSBtbmVtb25pY3MsIHJlZ2lzdGVyIG5hbWVzLCBudW1iZXJzLCBldGMuCi0gICBBYm92ZSB0aGF0IGFyZSBzdWJleHByZXNzaW9ucywgaWYgYW55IChhbiBleGFtcGxlIG1pZ2h0IGJlIHRoZQotICAgImVmZmVjdGl2ZSBhZGRyZXNzIiBpbiBtNjhrIGNwdXMpLiAgU3ViZXhwcmVzc2lvbnMgYXJlIHdpcC4KLSAgIEF0IHRoZSBzZWNvbmQgaGlnaGVzdCBsZXZlbCBhcmUgdGhlIGluc25zIHRoZW1zZWx2ZXMuICBBYm92ZSB0aGF0IGFyZQotICAgcHNldWRvLWluc25zLCBzeW50aGV0aWMgaW5zbnMsIGFuZCBtYWNyb3MsIGlmIGFueS4gICovCi0MCi0vKiBMb3RzIG9mIGNwdSdzIGhhdmUgYSBmaXhlZCBpbnNuIHNpemUsIG9yIG9uZSB3aGljaCByYXJlbHkgY2hhbmdlcywKLSAgIGFuZCBpdCdzIGdlbmVyYWxseSBlYXNpZXIgdG8gaGFuZGxlIHRoZXNlIGJ5IHRyZWF0aW5nIHRoZSBpbnNuIGFzIGFuCi0gICBpbnRlZ2VyIHR5cGUsIHJhdGhlciB0aGFuIGFuIGFycmF5IG9mIGNoYXJhY3RlcnMuICBTbyB3ZSBhbGxvdyB0YXJnZXRzCi0gICB0byBjb250cm9sIHRoaXMuICBXaGVuIGFuIGludGVnZXIgdHlwZSB0aGUgdmFsdWUgaXMgaW4gaG9zdCBieXRlIG9yZGVyLAotICAgd2hlbiBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzIHRoZSB2YWx1ZSBpcyBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gICovCi0KLXR5cGVkZWYgdW5zaWduZWQgaW50IENHRU5fSU5TTl9JTlQ7Ci0jaWYgQ0dFTl9JTlRfSU5TTl9QCi10eXBlZGVmIENHRU5fSU5TTl9JTlQgQ0dFTl9JTlNOX0JZVEVTOwotdHlwZWRlZiBDR0VOX0lOU05fSU5UICpDR0VOX0lOU05fQllURVNfUFRSOwotI2Vsc2UKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAqQ0dFTl9JTlNOX0JZVEVTOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICpDR0VOX0lOU05fQllURVNfUFRSOwotI2VuZGlmCi0KLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBDR0VOX0lOTElORSBfX2lubGluZV9fCi0jZWxzZQotI2RlZmluZSBDR0VOX0lOTElORQotI2VuZGlmCi0KLWVudW0gY2dlbl9lbmRpYW4KLXsKLSAgQ0dFTl9FTkRJQU5fVU5LTk9XTiwKLSAgQ0dFTl9FTkRJQU5fTElUVExFLAotICBDR0VOX0VORElBTl9CSUcKLX07Ci0KLS8qIEZvcndhcmQgZGVjbC4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNnZW5faW5zbiBDR0VOX0lOU047Ci0KLS8qIE9wYXF1ZSBwb2ludGVyIHZlcnNpb24gZm9yIHVzZSBieSBleHRlcm5hbCB3b3JsZC4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNnZW5fY3B1X2Rlc2MgKkNHRU5fQ1BVX0RFU0M7Ci0MCi0vKiBBdHRyaWJ1dGVzLgotICAgQXR0cmlidXRlcyBhcmUgdXNlZCB0byBkZXNjcmliZSB2YXJpb3VzIHJhbmRvbSB0aGluZ3MgYXNzb2NpYXRlZCB3aXRoCi0gICBhbiBvYmplY3QgKGlmaWVsZCwgaGFyZHdhcmUsIG9wZXJhbmQsIGluc24sIHdoYXRldmVyKSBhbmQgYXJlIHNwZWNpZmllZAotICAgYXMgbmFtZS92YWx1ZSBwYWlycy4KLSAgIEludGVnZXIgYXR0cmlidXRlcyBjb21wdXRlZCBhdCBjb21waWxlIHRpbWUgYXJlIGN1cnJlbnRseSBhbGwgdGhhdCdzCi0gICBzdXBwb3J0ZWQsIHRob3VnaCBhZGRpbmcgc3RyaW5nIGF0dHJpYnV0ZXMgYW5kIHJ1bi10aW1lIGNvbXB1dGF0aW9uIGlzCi0gICBzdHJhaWdodGZvcndhcmQuICBJbnRlZ2VyIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIGFsd2F5cyBob3N0IGludCdzCi0gICAoc2lnbmVkIG9yIHVuc2lnbmVkKS4gIEZvciBwb3J0YWJpbGl0eSwgdGhpcyBtZWFucyAzMiBiaXRzLgotICAgSW50ZWdlciBhdHRyaWJ1dGVzIGFyZSBmdXJ0aGVyIGNhdGVnb3JpemVkIGFzIGJvb2xlYW4sIGJpdHNldCwgaW50ZWdlciwKLSAgIGFuZCBlbnVtIHR5cGVzLiAgQm9vbGVhbiBhdHRyaWJ1dGVzIGFwcGVhciBmcmVxdWVudGx5IGVub3VnaCB0aGF0IHRoZXkncmUKLSAgIHJlY29yZGVkIGluIG9uZSBob3N0IGludC4gIFRoaXMgbGltaXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBib29sZWFuCi0gICBhdHRyaWJ1dGVzIHRvIDMyLCB0aG91Z2ggdGhhdCdzIGEgKmxvdCogb2YgYXR0cmlidXRlcy4gICovCi0KLS8qIFR5cGUgb2YgYXR0cmlidXRlIHZhbHVlcy4gICovCi0KLXR5cGVkZWYgaW50IENHRU5fQVRUUl9WQUxVRV9UWVBFOwotCi0vKiBTdHJ1Y3QgdG8gcmVjb3JkIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEJvb2xlYW4gYXR0cmlidXRlcy4gICovCi0gIHVuc2lnbmVkIGludCBib29sOwotICAvKiBOb24tYm9vbGVhbiBpbnRlZ2VyIGF0dHJpYnV0ZXMuICAqLwotICBDR0VOX0FUVFJfVkFMVUVfVFlQRSBub25ib29sWzFdOwotfSBDR0VOX0FUVFI7Ci0KLS8qIERlZmluZSBhIHN0cnVjdHVyZSBtZW1iZXIgZm9yIGF0dHJpYnV0ZXMgd2l0aCBOIG5vbi1ib29sZWFuIGVudHJpZXMuCi0gICBUaGVyZSBpcyBubyBtYXhpbXVtIG51bWJlciBvZiBub24tYm9vbGVhbiBhdHRyaWJ1dGVzLgotICAgVGhlcmUgaXMgYSBtYXhpbXVtIG9mIDMyIGJvb2xlYW4gYXR0cmlidXRlcyAoc2luY2UgdGhleSBhcmUgYWxsIHJlY29yZGVkCi0gICBpbiBvbmUgaG9zdCBpbnQpLiAgKi8KLQotI2RlZmluZSBDR0VOX0FUVFJfVFlQRShuKSBcCi1zdHJ1Y3QgeyB1bnNpZ25lZCBpbnQgYm9vbDsgXAotCSBDR0VOX0FUVFJfVkFMVUVfVFlQRSBub25ib29sWyhuKSA/IChuKSA6IDFdOyB9Ci0KLS8qIFJldHVybiB0aGUgYm9vbGVhbiBhdHRyaWJ1dGVzLiAgKi8KLQotI2RlZmluZSBDR0VOX0FUVFJfQk9PTFMoYSkgKChhKS0+Ym9vbCkKLQotLyogTm9uLWJvb2xlYW4gYXR0cmlidXRlIG51bWJlcnMgYXJlIG9mZnNldCBieSB0aGlzIG11Y2guICAqLwotCi0jZGVmaW5lIENHRU5fQVRUUl9OQk9PTF9PRkZTRVQgMzIKLQotLyogR2l2ZW4gYSBib29sZWFuIGF0dHJpYnV0ZSBudW1iZXIsIHJldHVybiBpdHMgbWFzay4gICovCi0KLSNkZWZpbmUgQ0dFTl9BVFRSX01BU0soYXR0cikgKDEgPDwgKGF0dHIpKQotCi0vKiBSZXR1cm4gdGhlIHZhbHVlIG9mIGJvb2xlYW4gYXR0cmlidXRlIEFUVFIgaW4gQVRUUlMuICAqLwotCi0jZGVmaW5lIENHRU5fQk9PTF9BVFRSKGF0dHJzLCBhdHRyKSAoKENHRU5fQVRUUl9NQVNLIChhdHRyKSAmIChhdHRycykpICE9IDApCi0KLS8qIFJldHVybiB2YWx1ZSBvZiBhdHRyaWJ1dGUgQVRUUiBpbiBBVFRSX1RBQkxFIGZvciBPQkouCi0gICBPQkogaXMgYSBwb2ludGVyIHRvIHRoZSBlbnRpdHkgdGhhdCBoYXMgdGhlIGF0dHJpYnV0ZXMKLSAgICg/Pz8gbm90IHVzZWQgYXQgcHJlc2VudCBidXQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBwdXJwb3NlcyAtIGV2ZW50dWFsbHkKLSAgIHRoZSBnb2FsIGlzIHRvIGFsbG93IHJlY29yZGluZyBhdHRyaWJ1dGVzIGluIHNvdXJjZSBmb3JtIGFuZCBjb21wdXRpbmcKLSAgIHRoZW0gbGF6aWx5IGF0IHJ1bnRpbWUsIG5vdCBzdXJlIG9mIHRoZSBkZXRhaWxzIHlldCkuICAqLwotCi0jZGVmaW5lIENHRU5fQVRUUl9WQUxVRShvYmosIGF0dHJfdGFibGUsIGF0dHIpIFwKLSgodW5zaWduZWQgaW50KSAoYXR0cikgPCBDR0VOX0FUVFJfTkJPT0xfT0ZGU0VUIFwKLSA/ICgoQ0dFTl9BVFRSX0JPT0xTIChhdHRyX3RhYmxlKSAmIENHRU5fQVRUUl9NQVNLIChhdHRyKSkgIT0gMCkgXAotIDogKChhdHRyX3RhYmxlKS0+bm9uYm9vbFsoYXR0cikgLSBDR0VOX0FUVFJfTkJPT0xfT0ZGU0VUXSkpCi0KLS8qIEF0dHJpYnV0ZSBuYW1lL3ZhbHVlIHRhYmxlcy4KLSAgIFRoZXNlIGFyZSB1c2VkIHRvIGFzc2lzdCBwYXJzaW5nIG9mIGRlc2NyaXB0aW9ucyBhdCBydW4tdGltZS4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNvbnN0IGNoYXIgKiBuYW1lOwotICBDR0VOX0FUVFJfVkFMVUVfVFlQRSB2YWx1ZTsKLX0gQ0dFTl9BVFRSX0VOVFJZOwotCi0vKiBGb3IgZWFjaCBkb21haW4gKGlmbGQsaHcsb3BlcmFuZCxpbnNuKSwgbGlzdCBvZiBhdHRyaWJ1dGVzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY29uc3QgY2hhciAqIG5hbWU7Ci0gIGNvbnN0IENHRU5fQVRUUl9FTlRSWSAqIGRmYXVsdDsKLSAgY29uc3QgQ0dFTl9BVFRSX0VOVFJZICogdmFsczsKLX0gQ0dFTl9BVFRSX1RBQkxFOwotDAotLyogSW5zdHJ1Y3Rpb24gc2V0IHZhcmlhbnRzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIERlZmF1bHQgaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuCi0gICAgIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyIHdoZW4gaXQgZW5jb3VudGVycyBhbiB1bmtub3duIGluc24uICAqLwotICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9pbnNuX2JpdHNpemU7Ci0KLSAgLyogQmFzZSBpbnN0cnVjdGlvbiBzaXplIChpbiBiaXRzKS4KLSAgICAgRm9yIG5vbi1MSVcgY3B1cyB0aGlzIGlzIGdlbmVyYWxseSB0aGUgbGVuZ3RoIG9mIHRoZSBzbWFsbGVzdCBpbnNuLgotICAgICBGb3IgTElXIGNwdXMgaXRzIHdpcCAod29yay1pbi1wcm9ncmVzcykuICBGb3IgdGhlIG0zMnIgaXRzIDMyLiAgKi8KLSAgdW5zaWduZWQgaW50IGJhc2VfaW5zbl9iaXRzaXplOwotCi0gIC8qIE1pbmltdW0vbWF4aW11bSBpbnN0cnVjdGlvbiBzaXplIChpbiBiaXRzKS4gICovCi0gIHVuc2lnbmVkIGludCBtaW5faW5zbl9iaXRzaXplOwotICB1bnNpZ25lZCBpbnQgbWF4X2luc25fYml0c2l6ZTsKLX0gQ0dFTl9JU0E7Ci0KLS8qIE1hY2hpbmUgdmFyaWFudHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFRoZSBhcmd1bWVudCB0byBiZmRfYXJjaF9pbmZvLT5zY2FuLiAgKi8KLSAgY29uc3QgY2hhciAqYmZkX25hbWU7Ci0gIC8qIG9uZSBvZiBlbnVtIG1hY2hfYXR0ciAqLwotICBpbnQgbnVtOwotfSBDR0VOX01BQ0g7Ci0MCi0vKiBQYXJzZSByZXN1bHQgKGFsc28gZXh0cmFjdGlvbiByZXN1bHQpLgotCi0gICBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgYW4gaW5zbiBpcyBzdG9yZWQgaGVyZS4KLSAgIFRvIGdlbmVyYXRlIHRoZSBhY3R1YWwgaW5zbiwgdGhpcyBpcyBwYXNzZWQgdG8gdGhlIGluc2VydCBoYW5kbGVyLgotICAgV2hlbiBwcmludGluZyBhbiBpbnNuLCB0aGUgcmVzdWx0IG9mIGV4dHJhY3Rpb24gaXMgc3RvcmVkIGhlcmUuCi0gICBUbyBwcmludCB0aGUgaW5zbiwgdGhpcyBpcyBwYXNzZWQgdG8gdGhlIHByaW50IGhhbmRsZXIuCi0KLSAgIEl0IGlzIG1hY2hpbmUgZ2VuZXJhdGVkIHNvIHdlIGRvbid0IGRlZmluZSBpdCBoZXJlLAotICAgYnV0IHdlIGRvIG5lZWQgYSBmb3J3YXJkIGRlY2wgZm9yIHRoZSBoYW5kbGVyIGZucy4KLQotICAgVGhlcmUgaXMgb25lIG1lbWJlciBmb3IgZWFjaCBwb3NzaWJsZSBmaWVsZCBpbiB0aGUgaW5zbi4KLSAgIFRoZSB0eXBlIGRlcGVuZHMgb24gdGhlIGZpZWxkLgotICAgQWxzbyByZWNvcmRlZCBoZXJlIGlzIHRoZSBjb21wdXRlZCBsZW5ndGggb2YgdGhlIGluc24gZm9yIGFyY2hpdGVjdHVyZXMKLSAgIHdoZXJlIGl0IHZhcmllcy4KLSovCi0KLXR5cGVkZWYgc3RydWN0IGNnZW5fZmllbGRzIENHRU5fRklFTERTOwotCi0vKiBUb3RhbCBsZW5ndGggb2YgdGhlIGluc24sIGFzIHJlY29yZGVkIGluIHRoZSBgZmllbGRzJyBzdHJ1Y3QuICAqLwotLyogPz8/IFRoZSBmaWVsZCBpbnNlcnQgaGFuZGxlciBoYXMgbG90cyBvZiBvcHBvcnR1bml0aWVzIGZvciBvcHRpbWl6YXRpb24KLSAgIGlmIGl0IGV2ZXIgZ2V0cyBpbmxpbmVkLiAgT24gYXJjaGl0ZWN0dXJlcyB3aGVyZSBpbnNucyBhbGwgaGF2ZSB0aGUgc2FtZQotICAgc2l6ZSwgbWF5IHdpc2ggdG8gZGV0ZWN0IHRoYXQgYW5kIG1ha2UgdGhpcyBtYWNybyBhIGNvbnN0YW50IC0gdG8gYWxsb3cKLSAgIGZ1cnRoZXIgb3B0aW1pemF0aW9ucy4gICovCi0KLSNkZWZpbmUgQ0dFTl9GSUVMRFNfQklUU0laRShmaWVsZHMpICgoZmllbGRzKS0+bGVuZ3RoKQotDAotLyogRXh0cmFjdGlvbiBzdXBwb3J0IGZvciB2YXJpYWJsZSBsZW5ndGggaW5zbiBzZXRzLiAgKi8KLQotLyogV2hlbiBkaXNhc3NlbWJsaW5nIHdlIGRvbid0IGtub3cgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGF0IHRoZSBzdGFydC4KLSAgIFNvIHRoZSBmaXJzdCBDR0VOX0JBU0VfSU5TTl9TSVpFIGJ5dGVzIGFyZSByZWFkIGF0IHRoZSBzdGFydCBhbmQgdGhlIHJlc3QKLSAgIGFyZSByZWFkIHdoZW4gbmVlZGVkLiAgVGhpcyBzdHJ1Y3QgY29udHJvbHMgdGhpcy4gIEl0IGlzIGJhc2ljYWxseSB0aGUKLSAgIGRpc2Fzc2VtYmxlX2luZm8gc3R1ZmYsIGV4Y2VwdCB0aGF0IHdlIHByb3ZpZGUgYSBjYWNoZSBmb3IgdmFsdWVzIGFscmVhZHkKLSAgIHJlYWQgKHNpbmNlIGJ5dGVzIGNhbiB0eXBpY2FsbHkgYmUgcmVhZCBzZXZlcmFsIHRpbWVzIHRvIGZldGNoIG11bHRpcGxlCi0gICBvcGVyYW5kcyB0aGF0IG1heSBiZSBpbiB0aGVtKSwgYW5kIHRoYXQgZXh0cmFjdGlvbiBvZiBmaWVsZHMgaXMgbmVlZGVkCi0gICBpbiBjb250ZXh0cyBvdGhlciB0aGFuIGRpc2Fzc2VtYmx5LiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBBIHBvaW50ZXIgdG8gdGhlIGRpc2Fzc2VtYmxlX2luZm8gc3RydWN0LgotICAgICBXZSBkb24ndCByZXF1aXJlIGRpcy1hc20uaCBzbyB3ZSB1c2UgUFRSIGZvciB0aGUgdHlwZSBoZXJlLgotICAgICBJZiBOVUxMLCBCWVRFUyBpcyBmdWxsIG9mIHZhbGlkIGRhdGEgKFZBTElEID09IC0xKS4gICovCi0gIFBUUiBkaXNfaW5mbzsKLSAgLyogUG9pbnRzIHRvIGEgd29ya2luZyBidWZmZXIgb2Ygc3VmZmljaWVudCBzaXplLiAgKi8KLSAgdW5zaWduZWQgY2hhciAqaW5zbl9ieXRlczsKLSAgLyogTWFzayBvZiBieXRlcyB0aGF0IGFyZSB2YWxpZCBpbiBJTlNOX0JZVEVTLiAgKi8KLSAgdW5zaWduZWQgaW50IHZhbGlkOwotfSBDR0VOX0VYVFJBQ1RfSU5GTzsKLQwKLS8qIEFzc29jaWF0ZWQgd2l0aCBlYWNoIGluc24gb3IgZXhwcmVzc2lvbiBpcyBhIHNldCBvZiAiaGFuZGxlcnMiIGZvcgotICAgcGVyZm9ybWluZyBvcGVyYXRpb25zIGxpa2UgcGFyc2luZywgcHJpbnRpbmcsIGV0Yy4gIFRoZXNlIHJlcXVpcmUgYSBiZmRfdm1hCi0gICB2YWx1ZSB0byBiZSBwYXNzZWQgYXJvdW5kIGJ1dCB3ZSBkb24ndCB3YW50IGFsbCBhcHBsaWNhdGlvbnMgdG8gbmVlZCBiZmQuaC4KLSAgIFNvIHRoaXMgc3R1ZmYgaXMgb25seSBwcm92aWRlZCBpZiBiZmQuaCBoYXMgYmVlbiBpbmNsdWRlZC4gICovCi0KLS8qIFBhcnNlIGhhbmRsZXIuCi0gICBDRCBpcyBhIGNwdSB0YWJsZSBkZXNjcmlwdG9yLgotICAgSU5TTiBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZGVzY3JpYmluZyB0aGUgaW5zbiBiZWluZyBwYXJzZWQuCi0gICBTVFJQIGlzIGEgcG9pbnRlciB0byBhIHBvaW50ZXIgdG8gdGhlIHRleHQgYmVpbmcgcGFyc2VkLgotICAgRklFTERTIGlzIGEgcG9pbnRlciB0byBhIGNnZW5fZmllbGRzIHN0cnVjdCBpbiB3aGljaCB0aGUgcmVzdWx0cyBhcmUgcGxhY2VkLgotICAgSWYgdGhlIGV4cHJlc3Npb24gaXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwgKlNUUlAgaXMgdXBkYXRlZC4KLSAgIElmIG5vdCBpdCBpcyBsZWZ0IGFsb25lLgotICAgVGhlIHJlc3VsdCBpcyBOVUxMIGlmIHN1Y2Nlc3Mgb3IgYW4gZXJyb3IgbWVzc2FnZS4gICovCi10eXBlZGVmIGNvbnN0IGNoYXIgKiAoY2dlbl9wYXJzZV9mbikKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICppbnNuXywKLQkgICAgICBjb25zdCBjaGFyICoqc3RycF8sIENHRU5fRklFTERTICpmaWVsZHNfKSk7Ci0KLS8qIEluc2VydCBoYW5kbGVyLgotICAgQ0QgaXMgYSBjcHUgdGFibGUgZGVzY3JpcHRvci4KLSAgIElOU04gaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGRlc2NyaWJpbmcgdGhlIGluc24gYmVpbmcgcGFyc2VkLgotICAgRklFTERTIGlzIGEgcG9pbnRlciB0byBhIGNnZW5fZmllbGRzIHN0cnVjdCBmcm9tIHdoaWNoIHRoZSB2YWx1ZXMKLSAgIGFyZSBmZXRjaGVkLgotICAgSU5TTlAgaXMgYSBwb2ludGVyIHRvIGEgYnVmZmVyIGluIHdoaWNoIHRvIHBsYWNlIHRoZSBpbnNuLgotICAgUEMgaXMgdGhlIHBjIHZhbHVlIG9mIHRoZSBpbnNuLgotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgc3VjY2Vzcy4gICovCi0KLSNpZmRlZiBCRkRfVkVSU0lPTgotdHlwZWRlZiBjb25zdCBjaGFyICogKGNnZW5faW5zZXJ0X2ZuKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKmluc25fLAotCSAgICAgIENHRU5fRklFTERTICpmaWVsZHNfLCBDR0VOX0lOU05fQllURVNfUFRSIGluc25wXywKLQkgICAgICBiZmRfdm1hIHBjXykpOwotI2Vsc2UKLXR5cGVkZWYgY29uc3QgY2hhciAqIChjZ2VuX2luc2VydF9mbikgKCk7Ci0jZW5kaWYKLQotLyogRXh0cmFjdCBoYW5kbGVyLgotICAgQ0QgaXMgYSBjcHUgdGFibGUgZGVzY3JpcHRvci4KLSAgIElOU04gaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGRlc2NyaWJpbmcgdGhlIGluc24gYmVpbmcgcGFyc2VkLgotICAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgY29udHJvbGxpbmcgZXh0cmFjdGlvbgotICAgKG9ubHkgdXNlZCBmb3IgdmFyaWFibGUgbGVuZ3RoIGluc25zKS4KLSAgIEVYX0lORk8gaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGZvciBjb250cm9sbGluZyByZWFkaW5nIG9mIGZ1cnRoZXIKLSAgIGJ5dGVzIGZvciB0aGUgaW5zbi4KLSAgIEJBU0VfSU5TTiBpcyB0aGUgZmlyc3QgQ0dFTl9CQVNFX0lOU05fU0laRSBieXRlcyAoaG9zdCBvcmRlcikuCi0gICBGSUVMRFMgaXMgYSBwb2ludGVyIHRvIGEgY2dlbl9maWVsZHMgc3RydWN0IGluIHdoaWNoIHRoZSByZXN1bHRzIGFyZSBwbGFjZWQuCi0gICBQQyBpcyB0aGUgcGMgdmFsdWUgb2YgdGhlIGluc24uCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBsZW5ndGggb2YgdGhlIGluc24gaW4gYml0cyBvciB6ZXJvIGlmIG5vdCByZWNvZ25pemVkLiAgKi8KLQotI2lmZGVmIEJGRF9WRVJTSU9OCi10eXBlZGVmIGludCAoY2dlbl9leHRyYWN0X2ZuKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKmluc25fLAotCSAgICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvXywgQ0dFTl9JTlNOX0lOVCBiYXNlX2luc25fLAotCSAgICAgIENHRU5fRklFTERTICpmaWVsZHNfLCBiZmRfdm1hIHBjXykpOwotI2Vsc2UKLXR5cGVkZWYgaW50IChjZ2VuX2V4dHJhY3RfZm4pICgpOwotI2VuZGlmCi0KLS8qIFByaW50IGhhbmRsZXIuCi0gICBDRCBpcyBhIGNwdSB0YWJsZSBkZXNjcmlwdG9yLgotICAgSU5GTyBpcyBhIHBvaW50ZXIgdG8gdGhlIGRpc2Fzc2VtYmx5IGluZm8uCi0gICBFZzogZGlzYXNzZW1ibGVfaW5mby4gIEl0J3MgZGVmaW5lZCBhcyBgUFRSJyBzbyB0aGlzIGZpbGUgY2FuIGJlIGluY2x1ZGVkCi0gICB3aXRob3V0IGRpcy1hc20uaC4KLSAgIElOU04gaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGRlc2NyaWJpbmcgdGhlIGluc24gYmVpbmcgcHJpbnRlZC4KLSAgIEZJRUxEUyBpcyBhIHBvaW50ZXIgdG8gYSBjZ2VuX2ZpZWxkcyBzdHJ1Y3QuCi0gICBQQyBpcyB0aGUgcGMgdmFsdWUgb2YgdGhlIGluc24uCi0gICBMRU4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgaW5zbiwgaW4gYml0cy4gICovCi0KLSNpZmRlZiBCRkRfVkVSU0lPTgotdHlwZWRlZiB2b2lkIChjZ2VuX3ByaW50X2ZuKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIgaW5mb18sIGNvbnN0IENHRU5fSU5TTiAqaW5zbl8sCi0JICAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGJmZF92bWEgcGNfLCBpbnQgbGVuXykpOwotI2Vsc2UKLXR5cGVkZWYgdm9pZCAoY2dlbl9wcmludF9mbikgKCk7Ci0jZW5kaWYKLQotLyogUGFyc2UvaW5zZXJ0L2V4dHJhY3QvcHJpbnQgaGFuZGxlcnMuCi0KLSAgIEluZGljZXMgaW50byB0aGUgaGFuZGxlciB0YWJsZXMuCi0gICBXZSBjb3VsZCB1c2UgcG9pbnRlcnMgaGVyZSBpbnN0ZWFkLCBidXQgOTAlIG9mIHRoZW0gYXJlIGdlbmVyYWxseSBpZGVudGljYWwKLSAgIGFuZCB0aGF0J3MgYSBsb3Qgb2YgcmVkdW5kYW50IGRhdGEuICBNYWtpbmcgdGhlc2UgdW5zaWduZWQgY2hhciBpbmRpY2VzCi0gICBpbnRvIHRhYmxlcyBvZiBwb2ludGVycyBzYXZlcyBhIGJpdCBvZiBzcGFjZS4KLSAgIFVzaW5nIGluZGljZXMgYWxzbyBrZWVwcyBhc3NlbWJsZXIgY29kZSBvdXQgb2YgdGhlIGRpc2Fzc2VtYmxlciBhbmQKLSAgIHZpY2UgdmVyc2EuICAqLwotCi1zdHJ1Y3QgY2dlbl9vcGNvZGVfaGFuZGxlcgotewotICB1bnNpZ25lZCBjaGFyIHBhcnNlLCBpbnNlcnQsIGV4dHJhY3QsIHByaW50OwotfTsKLQwKLS8qIEFzc2VtYmxlciBpbnRlcmZhY2UuCi0KLSAgIFRoZSBpbnRlcmZhY2UgdG8gdGhlIGFzc2VtYmxlciBpcyBpbnRlbmRlZCB0byBiZSBjbGVhbiBpbiB0aGUgc2Vuc2UgdGhhdAotICAgbGlib3Bjb2Rlcy5hIGlzIGEgc3RhbmRhbG9uZSBlbnRpdHkgYW5kIGNvdWxkIGJlIHVzZWQgd2l0aCBhbnkgYXNzZW1ibGVyLgotICAgTm90IHRoYXQgb25lIHdvdWxkIG5lY2Vzc2FyaWx5IHdhbnQgdG8gZG8gdGhhdCBidXQgcmF0aGVyIHRoYXQgaXQgaGVscHMKLSAgIGtlZXAgYSBjbGVhbiBpbnRlcmZhY2UuICBUaGUgaW50ZXJmYWNlIHdpbGwgb2J2aW91c2x5IGJlIHNsYW50ZWQgdG93YXJkcwotICAgR0FTLCBidXQgYXQgbGVhc3QgaXQncyBhIHN0YXJ0LgotICAgPz8/IE5vdGUgdGhhdCBvbmUgcG9zc2libGUgdXNlciBvZiB0aGUgYXNzZW1ibGVyIGJlc2lkZXMgR0FTIGlzIEdEQi4KLQotICAgUGFyc2luZyBpcyBjb250cm9sbGVkIGJ5IHRoZSBhc3NlbWJsZXIgd2hpY2ggY2FsbHMKLSAgIENHRU5fU1lNIChhc3NlbWJsZV9pbnNuKS4gIElmIGl0IGNhbiBwYXJzZSBhbmQgYnVpbGQgdGhlIGVudGlyZSBpbnNuCi0gICBpdCBkb2Vzbid0IGNhbGwgYmFjayB0byB0aGUgYXNzZW1ibGVyLiAgSWYgaXQgbmVlZHMvd2FudHMgdG8gY2FsbCBiYWNrCi0gICB0byB0aGUgYXNzZW1ibGVyLCBjZ2VuX3BhcnNlX29wZXJhbmRfZm4gaXMgY2FsbGVkIHdoaWNoIGNhbiBlaXRoZXIKLQotICAgLSByZXR1cm4gYSBudW1iZXIgdG8gYmUgaW5zZXJ0ZWQgaW4gdGhlIGluc24KLSAgIC0gcmV0dXJuIGEgInJlZ2lzdGVyIiB2YWx1ZSB0byBiZSBpbnNlcnRlZAotICAgICAodGhlIHJlZ2lzdGVyIG1pZ2h0IG5vdCBiZSBhIHJlZ2lzdGVyIHBlciBwZSkKLSAgIC0gcXVldWUgdGhlIGFyZ3VtZW50IGFuZCByZXR1cm4gYSBtYXJrZXIgc2F5aW5nIHRoZSBleHByZXNzaW9uIGhhcyBiZWVuCi0gICAgIHF1ZXVlZCAoZWc6IGEgZml4LXVwKQotICAgLSByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoZSBleHByZXNzaW9uIHdhc24ndCByZWNvZ25pemFibGUKLQotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgZm9yIHN1Y2Nlc3MuCi0gICBUaGUgcGFyc2VkIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgYmZkX3ZtYSAqLiAgKi8KLQotLyogVmFsdWVzIGZvciBpbmRpY2F0aW5nIHdoYXQgdGhlIGNhbGxlciB3YW50cy4gICovCi0KLWVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3R5cGUKLXsKLSAgQ0dFTl9QQVJTRV9PUEVSQU5EX0lOSVQsCi0gIENHRU5fUEFSU0VfT1BFUkFORF9JTlRFR0VSLAotICBDR0VOX1BBUlNFX09QRVJBTkRfQUREUkVTUwotfTsKLQotLyogVmFsdWVzIGZvciBpbmRpY2F0aW5nIHdoYXQgd2FzIHBhcnNlZC4gICovCi0KLWVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdAotewotICBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX05VTUJFUiwKLSAgQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9SRUdJU1RFUiwKLSAgQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9RVUVVRUQsCi0gIENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfRVJST1IKLX07Ci0KLSNpZmRlZiBCRkRfVkVSU0lPTiAvKiBEb24ndCByZXF1aXJlIGJmZC5oIHVubmVjZXNzYXJpbHkuICAqLwotdHlwZWRlZiBjb25zdCBjaGFyICogKGNnZW5fcGFyc2Vfb3BlcmFuZF9mbikKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywKLQkgICAgICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF90eXBlLCBjb25zdCBjaGFyICoqLCBpbnQsIGludCwKLQkgICAgICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiwgYmZkX3ZtYSAqKSk7Ci0jZWxzZQotdHlwZWRlZiBjb25zdCBjaGFyICogKGNnZW5fcGFyc2Vfb3BlcmFuZF9mbikgKCk7Ci0jZW5kaWYKLQotLyogU2V0IHRoZSBjZ2VuX3BhcnNlX29wZXJhbmRfZm4gY2FsbGJhY2suICAqLwotCi1leHRlcm4gdm9pZCBjZ2VuX3NldF9wYXJzZV9vcGVyYW5kX2ZuCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNnZW5fcGFyc2Vfb3BlcmFuZF9mbikpOwotCi0vKiBDYWxsZWQgYmVmb3JlIHRyeWluZyB0byBtYXRjaCBhIHRhYmxlIGVudHJ5IHdpdGggdGhlIGluc24uICAqLwotCi1leHRlcm4gdm9pZCBjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7Ci0MCi0vKiBPcGVyYW5kIHZhbHVlcyAoa2V5d29yZHMsIGludGVnZXJzLCBzeW1ib2xzLCBldGMuKSAgKi8KLQotLyogVHlwZXMgb2YgYXNzZW1ibGVyIGVsZW1lbnRzLiAgKi8KLQotZW51bSBjZ2VuX2FzbV90eXBlCi17Ci0gIENHRU5fQVNNX05PTkUsIENHRU5fQVNNX0tFWVdPUkQsIENHRU5fQVNNX01BWAotfTsKLQotI2lmbmRlZiBDR0VOX0FSQ0gKLWVudW0gY2dlbl9od190eXBlIHsgQ0dFTl9IV19NQVggfTsKLSNlbmRpZgotCi0vKiBMaXN0IG9mIGhhcmR3YXJlIGVsZW1lbnRzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY2hhciAqbmFtZTsKLSAgZW51bSBjZ2VuX2h3X3R5cGUgdHlwZTsKLSAgLyogVGhlcmUgaXMgY3VycmVudGx5IG5vIGV4YW1wbGUgd2hlcmUgYm90aCBpbmRleCBzcGVjcyBhbmQgdmFsdWUgc3BlY3MKLSAgICAgYXJlIHJlcXVpcmVkLCBzbyBmb3Igbm93IGJvdGggYXJlIGNsdW1wZWQgdW5kZXIgImFzbV9kYXRhIi4gICovCi0gIGVudW0gY2dlbl9hc21fdHlwZSBhc21fdHlwZTsKLSAgUFRSIGFzbV9kYXRhOwotI2lmbmRlZiBDR0VOX0hXX05CT09MX0FUVFJTCi0jZGVmaW5lIENHRU5fSFdfTkJPT0xfQVRUUlMgMQotI2VuZGlmCi0gIENHRU5fQVRUUl9UWVBFIChDR0VOX0hXX05CT09MX0FUVFJTKSBhdHRyczsKLSNkZWZpbmUgQ0dFTl9IV19BVFRSUyhodykgKCYoaHcpLT5hdHRycykKLX0gQ0dFTl9IV19FTlRSWTsKLQotLyogUmV0dXJuIHZhbHVlIG9mIGF0dHJpYnV0ZSBBVFRSIGluIEhXLiAgKi8KLQotI2RlZmluZSBDR0VOX0hXX0FUVFJfVkFMVUUoaHcsIGF0dHIpIFwKLUNHRU5fQVRUUl9WQUxVRSAoKGh3KSwgQ0dFTl9IV19BVFRSUyAoaHcpLCAoYXR0cikpCi0KLS8qIFRhYmxlIG9mIGhhcmR3YXJlIGVsZW1lbnRzIGZvciBzZWxlY3RlZCBtYWNoLCBjb21wdXRlZCBhdCBydW50aW1lLgotICAgZW51bSBjZ2VuX2h3X3R5cGUgaXMgYW4gaW5kZXggaW50byB0aGlzIHRhYmxlIChzcGVjaWZpY2FsbHkgYGVudHJpZXMnKS4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogUG9pbnRlciB0byBudWxsIHRlcm1pbmF0ZWQgdGFibGUgb2YgYWxsIGNvbXBpbGVkIGluIGVudHJpZXMuICAqLwotICBjb25zdCBDR0VOX0hXX0VOVFJZICppbml0X2VudHJpZXM7Ci0gIHVuc2lnbmVkIGludCBlbnRyeV9zaXplOyAvKiBzaW5jZSB0aGUgYXR0cmlidXRlIG1lbWJlciBpcyB2YXJpYWJsZSBzaXplZCAqLwotICAvKiBBcnJheSBvZiBhbGwgZW50cmllcywgaW5pdGlhbCBhbmQgcnVuLXRpbWUgYWRkZWQuICAqLwotICBjb25zdCBDR0VOX0hXX0VOVFJZICoqZW50cmllczsKLSAgLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIGBlbnRyaWVzJy4gICovCi0gIHVuc2lnbmVkIGludCBudW1fZW50cmllczsKLSAgLyogRm9yIG5vdywgeHJlYWxsb2MgaXMgY2FsbGVkIGVhY2ggdGltZSBhIG5ldyBlbnRyeSBpcyBhZGRlZCBhdCBydW50aW1lLgotICAgICA/Pz8gTWF5IHdpc2ggdG8ga2VlcCB0cmFjayBvZiBzb21lIHNsb3AgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8KLSAgICAgeHJlYWxsb2MsIGV4Y2VwdCB0aGF0IHRoZXJlJ3MgdW5saWtlbHkgdG8gYmUgbWFueSBhbmQgbm90IGV4cGVjdGVkIHRvIGJlCi0gICAgIGluIHNwZWVkIGNyaXRpY2FsIGNvZGUuICAqLwotfSBDR0VOX0hXX1RBQkxFOwotCi1leHRlcm4gY29uc3QgQ0dFTl9IV19FTlRSWSAqIGNnZW5faHdfbG9va3VwX2J5X25hbWUKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgQ0dFTl9IV19FTlRSWSAqIGNnZW5faHdfbG9va3VwX2J5X251bQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQpKTsKLQotLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBkZXNjcmliZSB0aGluZ3MgbGlrZSByZWdpc3RlciBuYW1lcywgZXRjLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9rZXl3b3JkX2VudHJ5Ci17Ci0gIC8qIE5hbWUgKGFzIGluIHJlZ2lzdGVyIG5hbWUpLiAgKi8KLSAgY2hhciAqIG5hbWU7Ci0KLSAgLyogVmFsdWUgKGFzIGluIHJlZ2lzdGVyIG51bWJlcikuCi0gICAgIFRoZSB2YWx1ZSBjYW5ub3QgYmUgLTEgYXMgdGhhdCBpcyB1c2VkIHRvIGluZGljYXRlICJub3QgZm91bmQiLgotICAgICBJREVBOiBIYXZlICJGVU5DVElPTiIgYXR0cmlidXRlPyBbZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGZldGNoIHZhbHVlXS4gICovCi0gIGludCB2YWx1ZTsKLQotICAvKiBBdHRyaWJ1dGVzLgotICAgICBUaGlzIHNob3VsZCwgYnV0IHRlY2huaWNhbGx5IG5lZWRuJ3QsIGFwcGVhciBsYXN0LiAgSXQgaXMgYSB2YXJpYWJsZSBzaXplZAotICAgICBhcnJheSBpbiB0aGF0IG9uZSBhcmNoaXRlY3R1cmUgbWF5IGhhdmUgMSBub25ib29sIGF0dHJpYnV0ZSBhbmQgYW5vdGhlcgotICAgICBtYXkgaGF2ZSBtb3JlLiAgSGF2aW5nIHRoaXMgbGFzdCBtZWFucyB0aGUgbm9uLWFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlCi0gICAgIG5lZWRuJ3QgY2FyZS4gIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVjb3JkCi0gICAgIGF0dHJpYnV0ZXMgaW4gdGhlaXIgcmF3IGZvcm0sIGV2YWx1YXRlIHRoZW0gYXQgcnVuLXRpbWUsIGFuZCBjYWNoZSB0aGUKLSAgICAgdmFsdWVzLCBzbyB0aGlzIHdvcnJ5IHdpbGwgZ28gYXdheSBhbnl3YXkuICAqLwotICAvKiA/Pz8gTW92aW5nIHRoaXMgbGFzdCBzaG91bGQgYmUgZG9uZSBieSB0cmVhdGluZyBrZXl3b3JkcyBsaWtlIGluc24gbGlzdHMKLSAgICAgYW5kIG1vdmluZyB0aGUgYG5leHQnIGZpZWxkcyBpbnRvIGEgQ0dFTl9LRVlXT1JEX0xJU1Qgc3RydWN0LiAgKi8KLSAgLyogRklYTUU6IE5vdCB1c2VkIHlldC4gICovCi0jaWZuZGVmIENHRU5fS0VZV09SRF9OQk9PTF9BVFRSUwotI2RlZmluZSBDR0VOX0tFWVdPUkRfTkJPT0xfQVRUUlMgMQotI2VuZGlmCi0gIENHRU5fQVRUUl9UWVBFIChDR0VOX0tFWVdPUkRfTkJPT0xfQVRUUlMpIGF0dHJzOwotCi0gIC8qID8/PyBQdXR0aW5nIHRoZXNlIGhlcmUgbWVhbnMgY29tcGlsZWQgaW4gZW50cmllcyBjYW4ndCBiZSBjb25zdC4KLSAgICAgTm90IGEgcmVhbGx5IGJpZyBkZWFsLCBidXQgc29tZXRoaW5nIHRvIGNvbnNpZGVyLiAgKi8KLSAgLyogTmV4dCBuYW1lIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgY2dlbl9rZXl3b3JkX2VudHJ5ICpuZXh0X25hbWU7Ci0gIC8qIE5leHQgdmFsdWUgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBjZ2VuX2tleXdvcmRfZW50cnkgKm5leHRfdmFsdWU7Ci19IENHRU5fS0VZV09SRF9FTlRSWTsKLQotLyogVG9wIGxldmVsIHN0cnVjdCBmb3IgZGVzY3JpYmluZyBhIHNldCBvZiByZWxhdGVkIGtleXdvcmRzCi0gICAoZS5nLiByZWdpc3RlciBuYW1lcykuCi0KLSAgIFRoaXMgc3RydWN0IHN1cHBvcnRzIHJ1bi10aW1lIGVudHJ5IG9mIG5ldyB2YWx1ZXMsIGFuZCBoYXNoZWQgbG9va3Vwcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNnZW5fa2V5d29yZAotewotICAvKiBQb2ludGVyIHRvIGluaXRpYWwgW2NvbXBpbGVkIGluXSB2YWx1ZXMuICAqLwotICBDR0VOX0tFWVdPUkRfRU5UUlkgKmluaXRfZW50cmllczsKLSAgCi0gIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIGBpbml0X2VudHJpZXMnLiAgKi8KLSAgdW5zaWduZWQgaW50IG51bV9pbml0X2VudHJpZXM7Ci0gIAotICAvKiBIYXNoIHRhYmxlIHVzZWQgZm9yIG5hbWUgbG9va3VwLiAgKi8KLSAgQ0dFTl9LRVlXT1JEX0VOVFJZICoqbmFtZV9oYXNoX3RhYmxlOwotICAKLSAgLyogSGFzaCB0YWJsZSB1c2VkIGZvciB2YWx1ZSBsb29rdXAuICAqLwotICBDR0VOX0tFWVdPUkRfRU5UUlkgKip2YWx1ZV9oYXNoX3RhYmxlOwotICAKLSAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGhhc2hfdGFibGVzLiAgKi8KLSAgdW5zaWduZWQgaW50IGhhc2hfdGFibGVfc2l6ZTsKLSAgCi0gIC8qIFBvaW50ZXIgdG8gbnVsbCBrZXl3b3JkICIiIGVudHJ5IGlmIHByZXNlbnQuICAqLwotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKm51bGxfZW50cnk7Ci19IENHRU5fS0VZV09SRDsKLQotLyogU3RydWN0dXJlIHVzZWQgZm9yIHNlYXJjaGluZy4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFRhYmxlIGJlaW5nIHNlYXJjaGVkLiAgKi8KLSAgY29uc3QgQ0dFTl9LRVlXT1JEICp0YWJsZTsKLSAgCi0gIC8qIFNwZWNpZmljYXRpb24gb2Ygd2hhdCBpcyBiZWluZyBzZWFyY2hlZCBmb3IuICAqLwotICBjb25zdCBjaGFyICpzcGVjOwotICAKLSAgLyogQ3VycmVudCBpbmRleCBpbiBoYXNoIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgaW50IGN1cnJlbnRfaGFzaDsKLSAgCi0gIC8qIEN1cnJlbnQgZWxlbWVudCBpbiBjdXJyZW50IGhhc2ggY2hhaW4uICAqLwotICBDR0VOX0tFWVdPUkRfRU5UUlkgKmN1cnJlbnRfZW50cnk7Ci19IENHRU5fS0VZV09SRF9TRUFSQ0g7Ci0KLS8qIExvb2t1cCBhIGtleXdvcmQgZnJvbSBpdHMgbmFtZS4gICovCi0KLWNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqY2dlbl9rZXl3b3JkX2xvb2t1cF9uYW1lCi0gIFBBUkFNUyAoKENHRU5fS0VZV09SRCAqLCBjb25zdCBjaGFyICopKTsKLQotLyogTG9va3VwIGEga2V5d29yZCBmcm9tIGl0cyB2YWx1ZS4gICovCi0KLWNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqY2dlbl9rZXl3b3JkX2xvb2t1cF92YWx1ZQotICBQQVJBTVMgKChDR0VOX0tFWVdPUkQgKiwgaW50KSk7Ci0KLS8qIEFkZCBhIGtleXdvcmQuICAqLwotCi12b2lkIGNnZW5fa2V5d29yZF9hZGQgUEFSQU1TICgoQ0dFTl9LRVlXT1JEICosIENHRU5fS0VZV09SRF9FTlRSWSAqKSk7Ci0KLS8qIEtleXdvcmQgc2VhcmNoaW5nLgotICAgVGhpcyBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBldmVyeSBrZXl3b3JkLCBvciBhIHN1YnNldC4gICovCi0KLUNHRU5fS0VZV09SRF9TRUFSQ0ggY2dlbl9rZXl3b3JkX3NlYXJjaF9pbml0Ci0gIFBBUkFNUyAoKENHRU5fS0VZV09SRCAqLCBjb25zdCBjaGFyICopKTsKLWNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqY2dlbl9rZXl3b3JkX3NlYXJjaF9uZXh0Ci0gIFBBUkFNUyAoKENHRU5fS0VZV09SRF9TRUFSQ0ggKikpOwotCi0vKiBPcGVyYW5kIHZhbHVlIHN1cHBvcnQgcm91dGluZXMuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqY2dlbl9wYXJzZV9rZXl3b3JkCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKiosIENHRU5fS0VZV09SRCAqLCBsb25nICopKTsKLSNpZmRlZiBCRkRfVkVSU0lPTiAvKiBEb24ndCByZXF1aXJlIGJmZC5oIHVubmVjZXNzYXJpbHkuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqKiwgaW50LCBsb25nICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqKiwgaW50LCB1bnNpZ25lZCBsb25nICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpjZ2VuX3BhcnNlX2FkZHJlc3MKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqKiwgaW50LCBpbnQsCi0JICAgICAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0ICosIGJmZF92bWEgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmNnZW5fdmFsaWRhdGVfc2lnbmVkX2ludGVnZXIKLSAgICAgUEFSQU1TICgobG9uZywgbG9uZywgbG9uZykpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmNnZW5fdmFsaWRhdGVfdW5zaWduZWRfaW50ZWdlcgotICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7Ci0jZW5kaWYKLQwKLS8qIE9wZXJhbmQgbW9kZXMuICAqLwotCi0vKiA/Pz8gVGhpcyBkdXBsaWNhdGVzIHRoZSB2YWx1ZXMgaW4gYXJjaC5oLiAgUmV2aXNpdC4KLSAgIFRoZXNlIGhvd2V2ZXIgbmVlZCB0aGUgQ0dFTl8gcHJlZml4IFthcyBkb2VzIGV2ZXJ5dGhpbmcgaW4gdGhpcyBmaWxlXS4gICovCi0vKiA/Pz8gVGFyZ2V0cyBtYXkgbmVlZCB0byBhZGQgdGhlaXIgb3duIG1vZGVzIHNvIHdlIG1heSB3aXNoIHRvIG1vdmUgdGhpcwotICAgdG8gPGFyY2g+LW9wYy5oLCBvciBhZGQgYSBob29rLiAgKi8KLQotZW51bSBjZ2VuX21vZGUgewotICBDR0VOX01PREVfVk9JRCwgLyogPz8/IHJlbmFtZSBzaW11bGF0b3IncyBWTSB0byBWT0lEPyAqLwotICBDR0VOX01PREVfQkksIENHRU5fTU9ERV9RSSwgQ0dFTl9NT0RFX0hJLCBDR0VOX01PREVfU0ksIENHRU5fTU9ERV9ESSwKLSAgQ0dFTl9NT0RFX1VCSSwgQ0dFTl9NT0RFX1VRSSwgQ0dFTl9NT0RFX1VISSwgQ0dFTl9NT0RFX1VTSSwgQ0dFTl9NT0RFX1VESSwKLSAgQ0dFTl9NT0RFX1NGLCBDR0VOX01PREVfREYsIENHRU5fTU9ERV9YRiwgQ0dFTl9NT0RFX1RGLAotICBDR0VOX01PREVfVEFSR0VUX01BWCwKLSAgQ0dFTl9NT0RFX0lOVCwgQ0dFTl9NT0RFX1VJTlQsCi0gIENHRU5fTU9ERV9NQVgKLX07Ci0KLS8qIEZJWE1FOiBVbnRpbCBzaW11bGF0b3IgaXMgdXBkYXRlZC4gICovCi0KLSNkZWZpbmUgQ0dFTl9NT0RFX1ZNIENHRU5fTU9ERV9WT0lECi0MCi0vKiBPcGVyYW5kcy4gICovCi0KLSNpZm5kZWYgQ0dFTl9BUkNICi1lbnVtIGNnZW5fb3BlcmFuZF90eXBlIHsgQ0dFTl9PUEVSQU5EX01BWCB9OwotI2VuZGlmCi0KLS8qICJuaWwiIGluZGljYXRvciBmb3IgdGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUgKi8KLSNkZWZpbmUgQ0dFTl9PUEVSQU5EX05JTCBDR0VOX09QRVJBTkRfTUFYCi0KLS8qIFRoaXMgc3RydWN0IGRlZmluZXMgZWFjaCBlbnRyeSBpbiB0aGUgb3BlcmFuZCB0YWJsZS4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIE5hbWUgYXMgaXQgYXBwZWFycyBpbiB0aGUgc3ludGF4IHN0cmluZy4gICovCi0gIGNoYXIgKm5hbWU7Ci0KLSAgLyogT3BlcmFuZCB0eXBlLiAgKi8KLSAgZW51bSBjZ2VuX29wZXJhbmRfdHlwZSB0eXBlOwotCi0gIC8qIFRoZSBoYXJkd2FyZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9wZXJhbmQuICAqLwotICBlbnVtIGNnZW5faHdfdHlwZSBod190eXBlOwotCi0gIC8qIEZJWE1FOiBXZSBkb24ndCB5ZXQgcmVjb3JkIGlmaWVsZCBkZWZpbml0aW9ucywgd2hpY2ggd2Ugc2hvdWxkLgotICAgICBXaGVuIHdlIGRvIGl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gZGVsZXRlIHN0YXJ0L2xlbmd0aCAoc2luY2UgdGhleSB3aWxsCi0gICAgIGJlIGR1cGxpY2F0ZWQgaW4gdGhlIGlmaWVsZCdzIGRlZmluaXRpb24pIGFuZCByZXBsYWNlIHRoZW0gd2l0aCBhCi0gICAgIHBvaW50ZXIgdG8gdGhlIGlmaWVsZCBlbnRyeS4gICovCi0KLSAgLyogQml0IHBvc2l0aW9uLgotICAgICBUaGlzIGlzIGp1c3QgYSBoaW50LCBhbmQgbWF5IGJlIHVudXNlZCBpbiBtb3JlIGNvbXBsZXggb3BlcmFuZHMuCi0gICAgIE1heSBiZSB1bnVzZWQgZm9yIGEgbW9kaWZpZXIuICAqLwotICB1bnNpZ25lZCBjaGFyIHN0YXJ0OwotCi0gIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb3BlcmFuZC4KLSAgICAgVGhpcyBpcyBqdXN0IGEgaGludCwgYW5kIG1heSBiZSB1bnVzZWQgaW4gbW9yZSBjb21wbGV4IG9wZXJhbmRzLgotICAgICBNYXkgYmUgdW51c2VkIGZvciBhIG1vZGlmaWVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBsZW5ndGg7Ci0KLSNpZiAwIC8qID8/PyBJbnRlcmVzdGluZyBpZGVhIGJ1dCByZWxvY3MgdGVuZCB0byBnZXQgdG9vIGNvbXBsaWNhdGVkLAotCSBhbmQgQUJJIGRlcGVuZGVudCwgZm9yIHNpbXBsZSB0YWJsZSBsb29rdXBzIHRvIHdvcmsuICAqLwotICAvKiBJZGVhbGx5IHRoaXMgd291bGQgYmUgdGhlIGludGVybmFsIChleHRlcm5hbD8pIHJlbG9jIHR5cGUuICAqLwotICBpbnQgcmVsb2NfdHlwZTsKLSNlbmRpZgotCi0gIC8qIEF0dHJpYnV0ZXMuCi0gICAgIFRoaXMgc2hvdWxkLCBidXQgdGVjaG5pY2FsbHkgbmVlZG4ndCwgYXBwZWFyIGxhc3QuICBJdCBpcyBhIHZhcmlhYmxlIHNpemVkCi0gICAgIGFycmF5IGluIHRoYXQgb25lIGFyY2hpdGVjdHVyZSBtYXkgaGF2ZSAxIG5vbmJvb2wgYXR0cmlidXRlIGFuZCBhbm90aGVyCi0gICAgIG1heSBoYXZlIG1vcmUuICBIYXZpbmcgdGhpcyBsYXN0IG1lYW5zIHRoZSBub24tYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGNvZGUKLSAgICAgbmVlZG4ndCBjYXJlLCBub3cgb3IgdG9tb3Jyb3cuICBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlY29yZAotICAgICBhdHRyaWJ1dGVzIGluIHRoZWlyIHJhdyBmb3JtLCBldmFsdWF0ZSB0aGVtIGF0IHJ1bi10aW1lLCBhbmQgY2FjaGUgdGhlCi0gICAgIHZhbHVlcywgc28gdGhpcyB3b3JyeSB3aWxsIGdvIGF3YXkgYW55d2F5LiAgKi8KLSNpZm5kZWYgQ0dFTl9PUEVSQU5EX05CT09MX0FUVFJTCi0jZGVmaW5lIENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUyAxCi0jZW5kaWYKLSAgQ0dFTl9BVFRSX1RZUEUgKENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUykgYXR0cnM7Ci0jZGVmaW5lIENHRU5fT1BFUkFORF9BVFRSUyhvcGVyYW5kKSAoJihvcGVyYW5kKS0+YXR0cnMpCi19IENHRU5fT1BFUkFORDsKLQotLyogUmV0dXJuIHZhbHVlIG9mIGF0dHJpYnV0ZSBBVFRSIGluIE9QRVJBTkQuICAqLwotCi0jZGVmaW5lIENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFKG9wZXJhbmQsIGF0dHIpIFwKLUNHRU5fQVRUUl9WQUxVRSAoKG9wZXJhbmQpLCBDR0VOX09QRVJBTkRfQVRUUlMgKG9wZXJhbmQpLCAoYXR0cikpCi0KLS8qIFRhYmxlIG9mIG9wZXJhbmRzIGZvciBzZWxlY3RlZCBtYWNoL2lzYSwgY29tcHV0ZWQgYXQgcnVudGltZS4KLSAgIGVudW0gY2dlbl9vcGVyYW5kX3R5cGUgaXMgYW4gaW5kZXggaW50byB0aGlzIHRhYmxlIChzcGVjaWZpY2FsbHkKLSAgIGBlbnRyaWVzJykuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIFBvaW50ZXIgdG8gbnVsbCB0ZXJtaW5hdGVkIHRhYmxlIG9mIGFsbCBjb21waWxlZCBpbiBlbnRyaWVzLiAgKi8KLSAgY29uc3QgQ0dFTl9PUEVSQU5EICppbml0X2VudHJpZXM7Ci0gIHVuc2lnbmVkIGludCBlbnRyeV9zaXplOyAvKiBzaW5jZSB0aGUgYXR0cmlidXRlIG1lbWJlciBpcyB2YXJpYWJsZSBzaXplZCAqLwotICAvKiBBcnJheSBvZiBhbGwgZW50cmllcywgaW5pdGlhbCBhbmQgcnVuLXRpbWUgYWRkZWQuICAqLwotICBjb25zdCBDR0VOX09QRVJBTkQgKiplbnRyaWVzOwotICAvKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gYGVudHJpZXMnLiAgKi8KLSAgdW5zaWduZWQgaW50IG51bV9lbnRyaWVzOwotICAvKiBGb3Igbm93LCB4cmVhbGxvYyBpcyBjYWxsZWQgZWFjaCB0aW1lIGEgbmV3IGVudHJ5IGlzIGFkZGVkIGF0IHJ1bnRpbWUuCi0gICAgID8/PyBNYXkgd2lzaCB0byBrZWVwIHRyYWNrIG9mIHNvbWUgc2xvcCB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBjYWxscyB0bwotICAgICB4cmVhbGxvYywgZXhjZXB0IHRoYXQgdGhlcmUncyB1bmxpa2VseSB0byBiZSBtYW55IGFuZCBub3QgZXhwZWN0ZWQgdG8gYmUKLSAgICAgaW4gc3BlZWQgY3JpdGljYWwgY29kZS4gICovCi19IENHRU5fT1BFUkFORF9UQUJMRTsKLQotZXh0ZXJuIGNvbnN0IENHRU5fT1BFUkFORCAqIGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbmFtZQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBjb25zdCBDR0VOX09QRVJBTkQgKiBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQpKTsKLQwKLS8qIEluc3RydWN0aW9uIG9wZXJhbmQgaW5zdGFuY2VzLgotCi0gICBGb3IgZWFjaCBpbnN0cnVjdGlvbiwgYSBsaXN0IG9mIHRoZSBoYXJkd2FyZSBlbGVtZW50cyB0aGF0IGFyZSByZWFkIGFuZAotICAgd3JpdHRlbiBhcmUgcmVjb3JkZWQuICAqLwotCi0vKiBUaGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UuICAqLwotCi1lbnVtIGNnZW5fb3BpbnN0X3R5cGUgewotICAvKiBFbmQgb2YgdGFibGUgbWFya2VyLiAgKi8KLSAgQ0dFTl9PUElOU1RfRU5EID0gMCwKLSAgQ0dFTl9PUElOU1RfSU5QVVQsIENHRU5fT1BJTlNUX09VVFBVVAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogSW5wdXQgb3Igb3V0cHV0IGluZGljYXRvci4gICovCi0gIGVudW0gY2dlbl9vcGluc3RfdHlwZSB0eXBlOwotCi0gIC8qIE5hbWUgb2Ygb3BlcmFuZC4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIGhhcmR3YXJlIGVsZW1lbnQgcmVmZXJlbmNlZC4gICovCi0gIGVudW0gY2dlbl9od190eXBlIGh3X3R5cGU7Ci0KLSAgLyogVGhlIG1vZGUgaW4gd2hpY2ggdGhlIG9wZXJhbmQgaXMgYmVpbmcgdXNlZC4gICovCi0gIGVudW0gY2dlbl9tb2RlIG1vZGU7Ci0KLSAgLyogVGhlIG9wZXJhbmQgdGFibGUgZW50cnkgQ0dFTl9PUEVSQU5EX05JTCBpZiB0aGVyZSBpcyBub25lCi0gICAgIChpLmUuIGFuIGV4cGxpY2l0IGhhcmR3YXJlIHJlZmVyZW5jZSkuICAqLwotICBlbnVtIGNnZW5fb3BlcmFuZF90eXBlIG9wX3R5cGU7Ci0KLSAgLyogSWYgYG9wZXJhbmQnIGlzICJuaWwiLCB0aGUgaW5kZXggKGUuZy4gaW50byBhcnJheSBvZiByZWdpc3RlcnMpLiAgKi8KLSAgaW50IGluZGV4OwotCi0gIC8qIEF0dHJpYnV0ZXMuCi0gICAgID8/PyBUaGlzIHBlcmhhcHMgc2hvdWxkIGJlIGEgcmVhbCBhdHRyaWJ1dGUgc3RydWN0IGJ1dCB0aGVyZSdzCi0gICAgIG5vIGN1cnJlbnQgbmVlZCwgc28gd2Ugc2F2ZSBhIGJpdCBvZiBzcGFjZSBhbmQganVzdCBoYXZlIGEgc2V0IG9mCi0gICAgIGZsYWdzLiAgVGhlIGludGVyZmFjZSBpcyBzdWNoIHRoYXQgdGhpcyBjYW4gZWFzaWx5IGJlIG1hZGUgYXR0cmlidXRlcwotICAgICBzaG91bGQgaXQgcHJvdmUgdXNlZnVsLiAgKi8KLSAgdW5zaWduZWQgaW50IGF0dHJzOwotI2RlZmluZSBDR0VOX09QSU5TVF9BVFRSUyhvcGluc3QpICgob3BpbnN0KS0+YXR0cnMpCi0vKiBSZXR1cm4gdmFsdWUgb2YgYXR0cmlidXRlIEFUVFIgaW4gT1BJTlNULiAgKi8KLSNkZWZpbmUgQ0dFTl9PUElOU1RfQVRUUihvcGluc3QsIGF0dHIpIFwKLSgoQ0dFTl9PUElOU1RfQVRUUlMgKG9waW5zdCkgJiAoYXR0cikpICE9IDApCi0vKiBPcGVyYW5kIGlzIGNvbmRpdGlvbmFsbHkgcmVmZXJlbmNlZCAocmVhZC93cml0dGVuKS4gICovCi0jZGVmaW5lIENHRU5fT1BJTlNUX0NPTkRfUkVGIDEKLX0gQ0dFTl9PUElOU1Q7Ci0MCi0vKiBTeW50YXggc3RyaW5nLgotCi0gICBFYWNoIGluc24gZm9ybWF0IGFuZCBzdWJleHByZXNzaW9uIGhhcyBvbmUgb2YgdGhlc2UuCi0KLSAgIFRoZSBzeW50YXggInN0cmluZyIgY29uc2lzdHMgb2YgY2hhcmFjdGVycyAobiA+IDAgJiYgbiA8IDEyOCksIGFuZCBvcGVyYW5kCi0gICB2YWx1ZXMgKG4gPj0gMTI4KSwgYW5kIGlzIHRlcm1pbmF0ZWQgYnkgMC4gIE9wZXJhbmQgdmFsdWVzIGFyZSAxMjggKyBpbmRleAotICAgaW50byB0aGUgb3BlcmFuZCB0YWJsZS4gIFRoZSBvcGVyYW5kIHRhYmxlIGRvZXNuJ3QgZXhpc3QgaW4gQywgcGVyIHNlLCBhcwotICAgdGhlIGRhdGEgaXMgcmVjb3JkZWQgaW4gdGhlIHBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IHN3aXRjaCBzdGF0ZW1lbnRzLiAqLwotCi0jaWZuZGVmIENHRU5fTUFYX1NZTlRBWF9CWVRFUwotI2RlZmluZSBDR0VOX01BWF9TWU5UQVhfQllURVMgMTYKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyIHN5bnRheFtDR0VOX01BWF9TWU5UQVhfQllURVNdOwotfSBDR0VOX1NZTlRBWDsKLQotI2RlZmluZSBDR0VOX1NZTlRBWF9TVFJJTkcoc3luKSAoc3luLT5zeW50YXgpCi0jZGVmaW5lIENHRU5fU1lOVEFYX0NIQVJfUChjKSAoKGMpIDwgMTI4KQotI2RlZmluZSBDR0VOX1NZTlRBWF9DSEFSKGMpIChjKQotI2RlZmluZSBDR0VOX1NZTlRBWF9GSUVMRChjKSAoKGMpIC0gMTI4KQotI2RlZmluZSBDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEKGMpICgoYykgKyAxMjgpCi0KLS8qID8/PyBJIGNhbid0IGN1cnJlbnRseSB0aGluayBvZiBhbnkgY2FzZSB3aGVyZSB0aGUgbW5lbW9uaWMgZG9lc24ndCBjb21lCi0gICBmaXJzdCBbYW5kIGlmIG9uZSBldmVyIGRvZXNuJ3QgYnVpbGRpbmcgdGhlIGhhc2ggdGFibGVzIHdpbGwgYmUgdHJpY2t5XS4KLSAgIEhvd2V2ZXIsIHdlIHRyZWF0IG1uZW1vbmljcyBhcyBqdXN0IGFub3RoZXIgb3BlcmFuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICBBIHZhbHVlIG9mIDEgbWVhbnMgInRoaXMgaXMgd2hlcmUgdGhlIG1uZW1vbmljIGFwcGVhcnMiLiAgMSBpc24ndAotICAgc3BlY2lhbCBvdGhlciB0aGFuIGl0J3MgYSBub24tcHJpbnRhYmxlIEFTQ0lJIGNoYXIuICAqLwotCi0jZGVmaW5lIENHRU5fU1lOVEFYX01ORU1PTklDICAgICAgIDEKLSNkZWZpbmUgQ0dFTl9TWU5UQVhfTU5FTU9OSUNfUChjaCkgKChjaCkgPT0gQ0dFTl9TWU5UQVhfTU5FTU9OSUMpCi0MCi0vKiBJbnN0cnVjdGlvbiBmaWVsZHMuCi0KLSAgID8/PyBXZSBjdXJyZW50bHkgZG9uJ3QgYWxsb3cgYWRkaW5nIGZpZWxkcyBhdCBydW4tdGltZS4KLSAgIEVhc3kgdG8gZml4IHdoZW4gbmVlZGVkLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9pZmxkIHsKLSAgLyogRW51bSBvZiBpZmllbGQuICAqLwotICBpbnQgbnVtOwotI2RlZmluZSBDR0VOX0lGTERfTlVNKGYpICgoZiktPm51bSkKLQotICAvKiBOYW1lIG9mIHRoZSBmaWVsZCwgZGlzdGluZ3Vpc2hlcyBpdCBmcm9tIGFsbCBvdGhlciBmaWVsZHMuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotI2RlZmluZSBDR0VOX0lGTERfTkFNRShmKSAoKGYpLT5uYW1lKQotCi0gIC8qIERlZmF1bHQgb2Zmc2V0LCBpbiBiaXRzLCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zbiB0byB0aGUgd29yZAotICAgICBjb250YWluaW5nIHRoZSBmaWVsZC4gICovCi0gIGludCB3b3JkX29mZnNldDsKLSNkZWZpbmUgQ0dFTl9JRkxEX1dPUkRfT0ZGU0VUKGYpICgoZiktPndvcmRfb2Zmc2V0KQotCi0gIC8qIERlZmF1bHQgbGVuZ3RoIG9mIHRoZSB3b3JkIGNvbnRhaW5pbmcgdGhlIGZpZWxkLiAgKi8KLSAgaW50IHdvcmRfc2l6ZTsKLSNkZWZpbmUgQ0dFTl9JRkxEX1dPUkRfU0laRShmKSAoKGYpLT53b3JkX3NpemUpCi0KLSAgLyogRGVmYXVsdCBzdGFydGluZyBiaXQgbnVtYmVyLgotICAgICBXaGV0aGVyIGxzYj0wIG9yIG1zYj0wIGlzIGRldGVybWluZWQgYnkgQ0dFTl9JTlNOX0xTQjBfUC4gICovCi0gIGludCBzdGFydDsKLSNkZWZpbmUgQ0dFTl9JRkxEX1NUQVJUKGYpICgoZiktPnN0YXJ0KQotCi0gIC8qIExlbmd0aCBvZiB0aGUgZmllbGQsIGluIGJpdHMuICAqLwotICBpbnQgbGVuZ3RoOwotI2RlZmluZSBDR0VOX0lGTERfTEVOR1RIKGYpICgoZiktPmxlbmd0aCkKLQotI2lmbmRlZiBDR0VOX0lGTERfTkJPT0xfQVRUUlMKLSNkZWZpbmUgQ0dFTl9JRkxEX05CT09MX0FUVFJTIDEKLSNlbmRpZgotICBDR0VOX0FUVFJfVFlQRSAoQ0dFTl9JRkxEX05CT09MX0FUVFJTKSBhdHRyczsKLSNkZWZpbmUgQ0dFTl9JRkxEX0FUVFJTKGYpICgmKGYpLT5hdHRycykKLX0gQ0dFTl9JRkxEOwotCi0vKiBSZXR1cm4gdmFsdWUgb2YgYXR0cmlidXRlIEFUVFIgaW4gSUZMRC4gICovCi0jZGVmaW5lIENHRU5fSUZMRF9BVFRSX1ZBTFVFKGlmbGQsIGF0dHIpIFwKLUNHRU5fQVRUUl9WQUxVRSAoKGlmbGQpLCBDR0VOX0lGTERfQVRUUlMgKGlmbGQpLCAoYXR0cikpCi0MCi0vKiBJbnN0cnVjdGlvbiBkYXRhLiAgKi8KLQotLyogSW5zdHJ1Y3Rpb24gZm9ybWF0cy4KLQotICAgSW5zdHJ1Y3Rpb25zIGFyZSBncm91cGVkIGJ5IGZvcm1hdC4gIEFzc29jaWF0ZWQgd2l0aCBhbiBpbnN0cnVjdGlvbiBpcyBpdHMKLSAgIGZvcm1hdC4gIEVhY2ggaW5zbidzIG9wY29kZSB0YWJsZSBlbnRyeSBjb250YWlucyBhIGZvcm1hdCB0YWJsZSBlbnRyeS4KLSAgID8/PyBUaGVyZSBpcyB1c3VhbGx5IHZlcnkgZmV3IGZvcm1hdHMgY29tcGFyZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluc25zLAotICAgc28gb25lIGNhbiByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIG9wY29kZSB0YWJsZSBieSByZWNvcmRpbmcgdGhlIGZvcm1hdCB0YWJsZQotICAgYXMgYSBzZXBhcmF0ZSBlbnRpdHkuICBHaXZlbiB0aGF0IHdlIGN1cnJlbnRseSBkb24ndCwgZm9ybWF0IHRhYmxlIGVudHJpZXMKLSAgIGFyZSBhbHNvIGRpc3Rpbmd1aXNoZWQgYnkgdGhlaXIgb3BlcmFuZHMuICBUaGlzIGluY3JlYXNlcyB0aGUgc2l6ZSBvZiB0aGUKLSAgIHRhYmxlLCBidXQgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHRhYmxlcy4gIEl0J3MgYWxsIG1pbnV0aWFlIGFueXdheSBzbyBpdAotICAgZG9lc24ndCByZWFsbHkgbWF0dGVyIFthdCB0aGlzIHBvaW50IGluIHRpbWVdLgotCi0gICA/Pz8gU3VwcG9ydCBmb3IgdmFyaWFibGUgbGVuZ3RoIElTQSdzIGlzIHdpcC4gICovCi0KLS8qIEFjY29tcGFueWluZyBlYWNoIGlmb3JtYXQgZGVzY3JpcHRpb24gaXMgYSBsaXN0IG9mIGl0cyBmaWVsZHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IENHRU5fSUZMRCAqaWZsZDsKLSNkZWZpbmUgQ0dFTl9JRk1UX0lGTERfSUZMRChpaSkgKChpaSktPmlmbGQpCi19IENHRU5fSUZNVF9JRkxEOwotCi0jaWZuZGVmIENHRU5fTUFYX0lGTVRfT1BFUkFORFMKLSNkZWZpbmUgQ0dFTl9NQVhfSUZNVF9PUEVSQU5EUyAxCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogTGVuZ3RoIHRoYXQgTUFTSyBhbmQgVkFMVUUgaGF2ZSBiZWVuIGNhbGN1bGF0ZWQgdG8KLSAgICAgW1ZBTFVFIGlzIHJlY29yZGVkIGVsc2V3aGVyZV0uCi0gICAgIE5vcm1hbGx5IGl0IGlzIGJhc2VfaW5zbl9iaXRzaXplLiAgT24gW1ZdTElXIGFyY2hpdGVjdHVyZXMgd2hlcmUgdGhlIGJhc2UKLSAgICAgaW5zbiBzaXplIG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiBhbiBpbnNuLCB0aGlzIGZpZWxkIGlzIGxlc3MgdGhhbgotICAgICBiYXNlX2luc25fYml0c2l6ZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgbWFza19sZW5ndGg7Ci0jZGVmaW5lIENHRU5fSUZNVF9NQVNLX0xFTkdUSChpZm10KSAoKGlmbXQpLT5tYXNrX2xlbmd0aCkKLQotICAvKiBUb3RhbCBsZW5ndGggb2YgaW5zdHJ1Y3Rpb24sIGluIGJpdHMuICAqLwotICB1bnNpZ25lZCBjaGFyIGxlbmd0aDsKLSNkZWZpbmUgQ0dFTl9JRk1UX0xFTkdUSChpZm10KSAoKGlmbXQpLT5sZW5ndGgpCi0KLSAgLyogTWFzayB0byBhcHBseSB0byB0aGUgZmlyc3QgTUFTS19MRU5HVEggYml0cy4KLSAgICAgRWFjaCBpbnNuJ3MgdmFsdWUgaXMgc3RvcmVkIHdpdGggdGhlIGluc24uCi0gICAgIFRoZSBmaXJzdCBzdGVwIGluIHJlY29nbml6aW5nIGFuIGluc24gZm9yIGRpc2Fzc2VtYmx5IGlzCi0gICAgIChvcGNvZGUgJiBtYXNrKSA9PSB2YWx1ZS4gICovCi0gIENHRU5fSU5TTl9JTlQgbWFzazsKLSNkZWZpbmUgQ0dFTl9JRk1UX01BU0soaWZtdCkgKChpZm10KS0+bWFzaykKLQotICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuCi0gICAgICsxIGZvciB0cmFpbGluZyBOVUxMLiAgKi8KLSAgQ0dFTl9JRk1UX0lGTEQgaWZsZHNbQ0dFTl9NQVhfSUZNVF9PUEVSQU5EUyArIDFdOwotI2RlZmluZSBDR0VOX0lGTVRfSUZMRFMoaWZtdCkgKChpZm10KS0+aWZsZHMpCi19IENHRU5fSUZNVDsKLQotLyogSW5zdHJ1Y3Rpb24gdmFsdWVzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogVGhlIG9wY29kZSBwb3J0aW9uIG9mIHRoZSBiYXNlIGluc24uICAqLwotICBDR0VOX0lOU05fSU5UIGJhc2VfdmFsdWU7Ci0KLSNpZmRlZiBDR0VOX01BWF9FWFRSQV9PUENPREVfT1BFUkFORFMKLSAgLyogRXh0cmEgb3Bjb2RlIHZhbHVlcyBiZXlvbmQgYmFzZV92YWx1ZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgaWZpZWxkX3ZhbHVlc1tDR0VOX01BWF9FWFRSQV9PUENPREVfT1BFUkFORFNdOwotI2VuZGlmCi19IENHRU5fSVZBTFVFOwotCi0vKiBJbnN0cnVjdGlvbiBvcGNvZGUgdGFibGUuCi0gICBUaGlzIGNvbnRhaW5zIHRoZSBzeW50YXggYW5kIGZvcm1hdCBkYXRhIG9mIGFuIGluc3RydWN0aW9uLiAgKi8KLQotLyogPz8/IFNvbWUgcG9ydHMgYWxyZWFkeSBoYXZlIGFuIG9wY29kZSB0YWJsZSB5ZXQgc3RpbGwgbmVlZCB0byB1c2UgdGhlIHJlc3QKLSAgIG9mIHdoYXQgY2dlbl9pbnNuIGhhcy4gIFBsdXMga2VlcGluZyB0aGUgb3Bjb2RlIGRhdGEgd2l0aCB0aGUgb3BlcmFuZAotICAgaW5zdGFuY2UgZGF0YSBjYW4gY3JlYXRlIGEgcHJldHR5IGJpZyBmaWxlLiAgU28gd2Uga2VlcCB0aGVtIHNlcGFyYXRlbHkuCi0gICBOb3Qgc3VyZSB0aGlzIGlzIGEgZ29vZCBpZGVhIGluIHRoZSBsb25nIHJ1bi4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEluZGljZXMgaW50byBwYXJzZS9pbnNlcnQvZXh0cmFjdC9wcmludCBoYW5kbGVyIHRhYmxlcy4gICovCi0gIHN0cnVjdCBjZ2VuX29wY29kZV9oYW5kbGVyIGhhbmRsZXJzOwotI2RlZmluZSBDR0VOX09QQ09ERV9IQU5ETEVSUyhvcGMpICgmIChvcGMpLT5oYW5kbGVycykKLQotICAvKiBTeW50YXggc3RyaW5nLiAgKi8KLSAgQ0dFTl9TWU5UQVggc3ludGF4OwotI2RlZmluZSBDR0VOX09QQ09ERV9TWU5UQVgob3BjKSAoJiAob3BjKS0+c3ludGF4KQotCi0gIC8qIEZvcm1hdCBlbnRyeS4gICovCi0gIGNvbnN0IENHRU5fSUZNVCAqZm9ybWF0OwotI2RlZmluZSBDR0VOX09QQ09ERV9GT1JNQVQob3BjKSAoKG9wYyktPmZvcm1hdCkKLSNkZWZpbmUgQ0dFTl9PUENPREVfTUFTS19CSVRTSVpFKG9wYykgQ0dFTl9JRk1UX01BU0tfTEVOR1RIIChDR0VOX09QQ09ERV9GT1JNQVQgKG9wYykpCi0jZGVmaW5lIENHRU5fT1BDT0RFX0JJVFNJWkUob3BjKSBDR0VOX0lGTVRfTEVOR1RIIChDR0VOX09QQ09ERV9GT1JNQVQgKG9wYykpCi0jZGVmaW5lIENHRU5fT1BDT0RFX0lGTERTKG9wYykgQ0dFTl9JRk1UX0lGTERTIChDR0VOX09QQ09ERV9GT1JNQVQgKG9wYykpCi0KLSAgLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIHZhbHVlLiAgKi8KLSAgQ0dFTl9JVkFMVUUgdmFsdWU7Ci0jZGVmaW5lIENHRU5fT1BDT0RFX1ZBTFVFKG9wYykgKCYgKG9wYyktPnZhbHVlKQotI2RlZmluZSBDR0VOX09QQ09ERV9CQVNFX1ZBTFVFKG9wYykgKENHRU5fT1BDT0RFX1ZBTFVFIChvcGMpLT5iYXNlX3ZhbHVlKQotI2RlZmluZSBDR0VOX09QQ09ERV9CQVNFX01BU0sob3BjKSBDR0VOX0lGTVRfTUFTSyAoQ0dFTl9PUENPREVfRk9STUFUIChvcGMpKQotfSBDR0VOX09QQ09ERTsKLQotLyogSW5zdHJ1Y3Rpb24gYXR0cmlidXRlcy4KLSAgIFRoaXMgaXMgbWFkZSBhIHB1Ymxpc2hlZCB0eXBlIGFzIGFwcGxpY2F0aW9ucyBjYW4gY2FjaGUgYSBwb2ludGVyIHRvCi0gICB0aGUgYXR0cmlidXRlcyBmb3Igc3BlZWQuICAqLwotCi0jaWZuZGVmIENHRU5fSU5TTl9OQk9PTF9BVFRSUwotI2RlZmluZSBDR0VOX0lOU05fTkJPT0xfQVRUUlMgMQotI2VuZGlmCi10eXBlZGVmIENHRU5fQVRUUl9UWVBFIChDR0VOX0lOU05fTkJPT0xfQVRUUlMpIENHRU5fSU5TTl9BVFRSX1RZUEU7Ci0KLS8qIEVudW0gb2YgYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50IGF0dHJpYnV0ZXMuICAqLwotCi0jaWZuZGVmIENHRU5fQVJDSAotLyogPz8/IE51bWJlcnMgaGVyZSBhcmUgcmVjb3JkZWQgaW4gdHdvIHBsYWNlcy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9pbnNuX2F0dHIgewotICBDR0VOX0lOU05fQUxJQVMgPSAwCi19IENHRU5fSU5TTl9BVFRSOwotI2VuZGlmCi0KLS8qIFRoaXMgc3RydWN0IGRlZmluZXMgZWFjaCBlbnRyeSBpbiB0aGUgaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBFYWNoIHJlYWwgaW5zdHJ1Y3Rpb24gaXMgZW51bWVyYXRlZC4gICovCi0gIC8qID8/PyBUaGlzIG1heSBnbyBhd2F5IGluIHRpbWUuICAqLwotICBpbnQgbnVtOwotI2RlZmluZSBDR0VOX0lOU05fTlVNKGluc24pICgoaW5zbiktPmJhc2UtPm51bSkKLQotICAvKiBOYW1lIG9mIGVudHJ5ICh0aGF0IGRpc3Rpbmd1aXNoZXMgaXQgZnJvbSBhbGwgb3RoZXIgZW50cmllcykuICAqLwotICAvKiA/Pz8gSWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMsIHRyeSB0byBwcmludCBmdWxsIG1uZW1vbmljLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSNkZWZpbmUgQ0dFTl9JTlNOX05BTUUoaW5zbikgKChpbnNuKS0+YmFzZS0+bmFtZSkKLQotICAvKiBNbmVtb25pYy4gIFRoaXMgaXMgdXNlZCB3aGVuIHBhcnNpbmcgYW5kIHByaW50aW5nIHRoZSBpbnNuLgotICAgICBJbiB0aGUgY2FzZSBvZiBpbnNucyB0aGF0IGhhdmUgb3BlcmFuZHMgb24gdGhlIG1uZW1vbmljcywgdGhpcyBpcwotICAgICBvbmx5IHRoZSBjb25zdGFudCBwYXJ0LiAgRS5nLiBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uIG9mIGFuIGBhZGQnIGluc24sCi0gICAgIHdoZXJlIHRoZSBmdWxsIG1uZW1vbmljIGlzIGFkZGVxLCBhZGRuZSwgZXRjLiwgYW5kIHRoZSBjb25kaXRpb24gaXMKLSAgICAgdHJlYXRlZCBhcyBhbiBvcGVyYW5kLCB0aGlzIGlzIG9ubHkgImFkZCIuICAqLwotICBjb25zdCBjaGFyICptbmVtb25pYzsKLSNkZWZpbmUgQ0dFTl9JTlNOX01ORU1PTklDKGluc24pICgoaW5zbiktPmJhc2UtPm1uZW1vbmljKQotCi0gIC8qIFRvdGFsIGxlbmd0aCBvZiBpbnN0cnVjdGlvbiwgaW4gYml0cy4gICovCi0gIGludCBiaXRzaXplOwotI2RlZmluZSBDR0VOX0lOU05fQklUU0laRShpbnNuKSAoKGluc24pLT5iYXNlLT5iaXRzaXplKQotCi0jaWYgMCAvKiA/Pz8gRGlzYWJsZWQgZm9yIG5vdyBhcyB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCBlbWJlZGRlZCBuZXdsaW5lcwotCSBhbmQgdGhlIHRhYmxlIGlzIGFscmVhZHkgcHJldHR5IGJpZy4gIFNob3VsZCBwZXJoYXBzIGJlIG1vdmVkCi0JIHRvIGEgZmlsZSBvZiBpdHMgb3duLiAgKi8KLSAgLyogU2VtYW50aWNzLCBhcyBSVEwuICAqLwotICAvKiA/Pz8gUGxhaW4gdGV4dCBvciBieXRlY29kZXM/ICAqLwotICAvKiA/Pz8gTm90ZSB0aGF0IHRoZSBvcGVyYW5kIGluc3RhbmNlIHRhYmxlIGNvdWxkIGJlIGNvbXB1dGVkIGF0IHJ1bi10aW1lCi0gICAgIGlmIHdlIHBhcnNlIHRoaXMgYW5kIGNhY2hlIHRoZSByZXN1bHRzLiAgU29tZXRoaW5nIHRvIGV2ZW50dWFsbHkgZG8uICAqLwotICBjb25zdCBjaGFyICpydHg7Ci0jZGVmaW5lIENHRU5fSU5TTl9SVFgoaW5zbikgKChpbnNuKS0+YmFzZS0+cnR4KQotI2VuZGlmCi0KLSAgLyogQXR0cmlidXRlcy4KLSAgICAgVGhpcyBtdXN0IGFwcGVhciBsYXN0LiAgSXQgaXMgYSB2YXJpYWJsZSBzaXplZCBhcnJheSBpbiB0aGF0IG9uZQotICAgICBhcmNoaXRlY3R1cmUgbWF5IGhhdmUgMSBub25ib29sIGF0dHJpYnV0ZSBhbmQgYW5vdGhlciBtYXkgaGF2ZSBtb3JlLgotICAgICBIYXZpbmcgdGhpcyBsYXN0IG1lYW5zIHRoZSBub24tYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGNvZGUgbmVlZG4ndAotICAgICBjYXJlLiAgVGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSByZWNvcmQgYXR0cmlidXRlcyBpbiB0aGVpciByYXcgZm9ybSwKLSAgICAgZXZhbHVhdGUgdGhlbSBhdCBydW4tdGltZSwgYW5kIGNhY2hlIHRoZSB2YWx1ZXMsIHNvIHRoaXMgd29ycnkgd2lsbCBnbwotICAgICBhd2F5IGFueXdheS4gICovCi0gIENHRU5fSU5TTl9BVFRSX1RZUEUgYXR0cnM7Ci0jZGVmaW5lIENHRU5fSU5TTl9BVFRSUyhpbnNuKSAoJihpbnNuKS0+YmFzZS0+YXR0cnMpCi0vKiBSZXR1cm4gdmFsdWUgb2YgYXR0cmlidXRlIEFUVFIgaW4gSU5TTi4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9BVFRSX1ZBTFVFKGluc24sIGF0dHIpIFwKLUNHRU5fQVRUUl9WQUxVRSAoKGluc24pLCBDR0VOX0lOU05fQVRUUlMgKGluc24pLCAoYXR0cikpCi19IENHRU5fSUJBU0U7Ci0KLS8qIFJldHVybiBub24temVybyBpZiBJTlNOIGlzIHRoZSAiaW52YWxpZCIgaW5zbiBtYXJrZXIuICAqLwotCi0jZGVmaW5lIENHRU5fSU5TTl9JTlZBTElEX1AoaW5zbikgKENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbikgPT0gMCkKLQotLyogTWFpbiBzdHJ1Y3QgY29udGFpbiBpbnN0cnVjdGlvbiBpbmZvcm1hdGlvbi4KLSAgIEJBU0UgaXMgYWx3YXlzIHByZXNlbnQsIHRoZSByZXN0IGlzIHByZXNlbnQgb25seSBpZiBhc2tlZCBmb3IuICAqLwotCi1zdHJ1Y3QgY2dlbl9pbnNuCi17Ci0gIC8qID8/PyBNYXkgYmUgb2YgdXNlIHRvIHB1dCBhIHR5cGUgaW5kaWNhdG9yIGhlcmUuCi0gICAgIFRoZW4gdGhpcyBzdHJ1Y3QgY291bGQgZGlmZmVyZW50IGluZm8gZm9yIGRpZmZlcmVudCBjbGFzc2VzIG9mIGluc25zLiAgKi8KLSAgLyogPz8/IEEgc3BlZWR1cCBjYW4gYmUgaGFkIGJ5IG1vdmluZyBgYmFzZScgaW50byB0aGlzIHN0cnVjdC4KLSAgICAgTWF5YmUgbGF0ZXIuICAqLwotICBjb25zdCBDR0VOX0lCQVNFICpiYXNlOwotICBjb25zdCBDR0VOX09QQ09ERSAqb3Bjb2RlOwotICBjb25zdCBDR0VOX09QSU5TVCAqb3BpbnN0OwotfTsKLQotLyogSW5zdHJ1Y3Rpb24gbGlzdHMuCi0gICBUaGlzIGlzIHVzZWQgZm9yIGFkZGluZyBuZXcgZW50cmllcyBhbmQgZm9yIGNyZWF0aW5nIHRoZSBoYXNoIGxpc3RzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9pbnNuX2xpc3QKLXsKLSAgc3RydWN0IGNnZW5faW5zbl9saXN0ICpuZXh0OwotICBjb25zdCBDR0VOX0lOU04gKmluc247Ci19IENHRU5fSU5TTl9MSVNUOwotCi0vKiBUYWJsZSBvZiBpbnN0cnVjdGlvbnMuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBjb25zdCBDR0VOX0lOU04gKmluaXRfZW50cmllczsKLSAgdW5zaWduZWQgaW50IGVudHJ5X3NpemU7IC8qIHNpbmNlIHRoZSBhdHRyaWJ1dGUgbWVtYmVyIGlzIHZhcmlhYmxlIHNpemVkICovCi0gIHVuc2lnbmVkIGludCBudW1faW5pdF9lbnRyaWVzOwotICBDR0VOX0lOU05fTElTVCAqbmV3X2VudHJpZXM7Ci19IENHRU5fSU5TTl9UQUJMRTsKLQotLyogUmV0dXJuIG51bWJlciBvZiBpbnN0cnVjdGlvbnMuICBUaGlzIGluY2x1ZGVzIGFueSBhZGRlZCBhdCBydW4tdGltZS4gICovCi0KLWV4dGVybiBpbnQgY2dlbl9pbnNuX2NvdW50IFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKLWV4dGVybiBpbnQgY2dlbl9tYWNyb19pbnNuX2NvdW50IFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKLQotLyogTWFjcm9zIHRvIGFjY2VzcyB0aGUgb3RoZXIgaW5zbiBlbGVtZW50cyBub3QgcmVjb3JkZWQgaW4gQ0dFTl9JQkFTRS4gICovCi0KLS8qIEZldGNoIElOU04ncyBvcGVyYW5kIGluc3RhbmNlIHRhYmxlLiAgKi8KLS8qID8/PyBEb2Vzbid0IGhhbmRsZSBpbnNucyBhZGRlZCBhdCBydW50aW1lLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX09QRVJBTkRTKGluc24pICgoaW5zbiktPm9waW5zdCkKLQotLyogUmV0dXJuIElOU04ncyBvcGNvZGUgdGFibGUgZW50cnkuICAqLwotI2RlZmluZSBDR0VOX0lOU05fT1BDT0RFKGluc24pICgoaW5zbiktPm9wY29kZSkKLQotLyogUmV0dXJuIElOU04ncyBoYW5kbGVyIGRhdGEuICAqLwotI2RlZmluZSBDR0VOX0lOU05fSEFORExFUlMoaW5zbikgQ0dFTl9PUENPREVfSEFORExFUlMgKENHRU5fSU5TTl9PUENPREUgKGluc24pKQotCi0vKiBSZXR1cm4gSU5TTidzIHN5bnRheC4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9TWU5UQVgoaW5zbikgQ0dFTl9PUENPREVfU1lOVEFYIChDR0VOX0lOU05fT1BDT0RFIChpbnNuKSkKLQotLyogUmV0dXJuIHNpemUgb2YgYmFzZSBtYXNrIGluIGJpdHMuICAqLwotI2RlZmluZSBDR0VOX0lOU05fTUFTS19CSVRTSVpFKGluc24pIFwKLSAgQ0dFTl9PUENPREVfTUFTS19CSVRTSVpFIChDR0VOX0lOU05fT1BDT0RFIChpbnNuKSkKLQotLyogUmV0dXJuIG1hc2sgb2YgYmFzZSBwYXJ0IG9mIElOU04uICAqLwotI2RlZmluZSBDR0VOX0lOU05fQkFTRV9NQVNLKGluc24pIFwKLSAgQ0dFTl9PUENPREVfQkFTRV9NQVNLIChDR0VOX0lOU05fT1BDT0RFIChpbnNuKSkKLQotLyogUmV0dXJuIHZhbHVlIG9mIGJhc2UgcGFydCBvZiBJTlNOLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX0JBU0VfVkFMVUUoaW5zbikgXAotICBDR0VOX09QQ09ERV9CQVNFX1ZBTFVFIChDR0VOX0lOU05fT1BDT0RFIChpbnNuKSkKLQwKLS8qIE1hY3JvIGluc3RydWN0aW9ucy4KLSAgIE1hY3JvIGluc25zIGFyZW4ndCByZWFsIGluc25zLCB0aGV5IG1hcCB0byBvbmUgb3IgbW9yZSByZWFsIGluc25zLgotICAgRS5nLiBBbiBhcmNoaXRlY3R1cmUncyAibm9wIiBpbnNuIG1heSBhY3R1YWxseSBiZSBhbiAibXYgcjAscjAiIG9yCi0gICBzb21lIHN1Y2guCi0KLSAgIE1hY3JvIGluc25zIGNhbiBleHBhbmQgdG8gbm90aGluZyAoZS5nLiBhIG5vcCB0aGF0IGlzIG9wdGltaXplZCBhd2F5KS4KLSAgIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLWluc24gbWFjcm9zIHRoYXQgYnVpbGQgYSBjb25zdGFudCBpbiBhIHJlZ2lzdGVyLgotICAgT2YgY291cnNlIHRoaXMgaXNuJ3QgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGFuZCBtdXN0IGJlIGV4cGxpY2l0bHkgZW5hYmxlZC4KLQotICAgQXNzZW1ibHkgb2YgbWFjcm8taW5zbnMgaXMgcmVsYXRpdmVseSBzdHJhaWdodGZvcndhcmQuICBEaXNhc3NlbWJseSBpc24ndC4KLSAgIEhvd2V2ZXIsIGRpc2Fzc2VtYmx5IG9mIGF0IGxlYXN0IHNvbWUga2luZHMgb2YgbWFjcm8gaW5zbnMgaXMgaW1wb3J0YW50Ci0gICBpbiBvcmRlciB0aGF0IHRoZSBkaXNhc3NlbWJsZWQgY29kZSBwcmVzZXJ2ZSB0aGUgcmVhZGFiaWxpdHkgb2YgdGhlIG9yaWdpbmFsCi0gICBpbnNuLiAgV2hhdCBpcyBhdHRlbXB0ZWQgaGVyZSBpcyB0byBkaXNhc3NlbWJsZSBhbGwgInNpbXBsZSIgbWFjcm8taW5zbnMsCi0gICB3aGVyZSAic2ltcGxlIiBpcyBjdXJyZW50bHkgZGVmaW5lZCB0byBtZWFuICJleHBhbmRzIHRvIG9uZSByZWFsIGluc24iLgotCi0gICBTaW1wbGUgbWFjcm8taW5zbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5LiAgVGhleSBhcmUgZW1pdHRlZCBhcyBBTElBUydzCi0gICBvZiByZWFsIGluc25zLiAgVGhpcyBzaW1wbGlmaWVzIHRoZWlyIGhhbmRsaW5nIHNpbmNlIHRoZXJlJ3MgdXN1YWxseSBtb3JlCi0gICBvZiB0aGVtIHRoYW4gYW55IG90aGVyIGtpbmQgb2YgbWFjcm8taW5zbiwgYW5kIHByb3BlciBkaXNhc3NlbWJseSBvZiB0aGVtCi0gICBmYWxscyBvdXQgZm9yIGZyZWUuICAqLwotCi0vKiBGb3IgZWFjaCBtYWNyby1pbnNuIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBleHBhbnNpb24gcG9zc2liaWxpdGllcywKLSAgIGRlcGVuZGluZyBvbiB0aGUgYXJndW1lbnRzLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgYWNjZXNzZWQgdmlhIHRoZSBgZGF0YScKLSAgIG1lbWJlciBvZiBDR0VOX0lOU04uICAqLwotCi10eXBlZGVmIHN0cnVjdCBjZ2VuX21pbnNuX2V4cGFuc2lvbiB7Ci0gIC8qIEZ1bmN0aW9uIHRvIGRvIHRoZSBleHBhbnNpb24uCi0gICAgIElmIHRoZSBleHBhbnNpb24gZmFpbHMgKGUuZy4gIm5vIG1hdGNoIikgTlVMTCBpcyByZXR1cm5lZC4KLSAgICAgU3BhY2UgZm9yIHRoZSBleHBhbnNpb24gaXMgb2J0YWluZWQgd2l0aCBtYWxsb2MuCi0gICAgIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gZnJlZSBpdC4gICovCi0gIGNvbnN0IGNoYXIgKiAoKiBmbikgUEFSQU1TICgoY29uc3Qgc3RydWN0IGNnZW5fbWluc25fZXhwYW5zaW9uICosCi0JCQkgICAgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLCBpbnQgKiwKLQkJCSAgICAgICBDR0VOX09QRVJBTkQgKiopKTsKLSNkZWZpbmUgQ0dFTl9NSUVYUE5fRk4oZXgpICgoZXgpLT5mbikKLQotICAvKiBJbnN0cnVjdGlvbihzKSB0aGUgbWFjcm8gZXhwYW5kcyB0by4KLSAgICAgVGhlIGZvcm1hdCBvZiBTVFIgaXMgZGVmaW5lZCBieSBGTi4KLSAgICAgSXQgaXMgdHlwaWNhbGx5IHRoZSBhc3NlbWJseSBjb2RlIG9mIHRoZSByZWFsIGluc24sIGJ1dCBpdCBjb3VsZCBhbHNvIGJlCi0gICAgIHRoZSBvcmlnaW5hbCBTY2hlbWUgZXhwcmVzc2lvbiBvciBhIHRva2VuaXplZCBmb3JtIG9mIGl0ICh3aXRoIEZOIGJlaW5nCi0gICAgIGFuIGFwcHJvcHJpYXRlIGludGVycHJldGVyKS4gICovCi0gIGNvbnN0IGNoYXIgKiBzdHI7Ci0jZGVmaW5lIENHRU5fTUlFWFBOX1NUUihleCkgKChleCktPnN0cikKLX0gQ0dFTl9NSU5TTl9FWFBBTlNJT047Ci0KLS8qIE5vcm1hbCBleHBhbmRlci4KLSAgIFdoZW4gc3VwcG9ydGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCB0aGUgaW5wdXQgc3RyaW5nIHRvIGFub3RoZXIKLSAgIHN0cmluZyBhbmQgdGhlIHBhcnNlciB3aWxsIGJlIGludm9rZWQgcmVjdXJzaXZlbHkuICBUaGUgb3V0cHV0IHN0cmluZwotICAgbWF5IGNvbnRhaW4gZnVydGhlciBtYWNybyBpbnZvY2F0aW9ucy4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICogY2dlbl9leHBhbmRfbWFjcm9faW5zbgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBzdHJ1Y3QgY2dlbl9taW5zbl9leHBhbnNpb24gKiwKLQkgICAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosIGludCAqLCBDR0VOX09QRVJBTkQgKiopKTsKLQwKLS8qIFRoZSBhc3NlbWJsZXIgaW5zbiB0YWJsZSBpcyBoYXNoZWQgYmFzZWQgb24gc29tZSBmdW5jdGlvbiBvZiB0aGUgbW5lbW9uaWMKLSAgICh0aGUgYWN0dWFsbHkgaGFzaGluZyBkb25lIGlzIHVwIHRvIHRoZSB0YXJnZXQsIGJ1dCB3ZSBwcm92aWRlIGEgZmV3Ci0gICBleGFtcGxlcyBsaWtlIHRoZSBmaXJzdCBsZXR0ZXIgb3IgYSBmdW5jdGlvbiBvZiB0aGUgZW50aXJlIG1uZW1vbmljKS4gICovCi0KLWV4dGVybiBDR0VOX0lOU05fTElTVCAqIGNnZW5fYXNtX2xvb2t1cF9pbnNuCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKikpOwotI2RlZmluZSBDR0VOX0FTTV9MT09LVVBfSU5TTihjZCwgc3RyaW5nKSBjZ2VuX2FzbV9sb29rdXBfaW5zbiAoKGNkKSwgKHN0cmluZykpCi0jZGVmaW5lIENHRU5fQVNNX05FWFRfSU5TTihpbnNuKSAoKGluc24pLT5uZXh0KQotCi0vKiBUaGUgZGlzYXNzZW1ibGVyIGluc24gdGFibGUgaXMgaGFzaGVkIGJhc2VkIG9uIHNvbWUgZnVuY3Rpb24gb2YgbWFjaGluZQotICAgaW5zdHJ1Y3Rpb24gKHRoZSBhY3R1YWxseSBoYXNoaW5nIGRvbmUgaXMgdXAgdG8gdGhlIHRhcmdldCkuICAqLwotCi1leHRlcm4gQ0dFTl9JTlNOX0xJU1QgKiBjZ2VuX2Rpc19sb29rdXBfaW5zbgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICosIENHRU5fSU5TTl9JTlQpKTsKLS8qIEZJWE1FOiBkZWxldGUgdGhlc2UgdHdvICovCi0jZGVmaW5lIENHRU5fRElTX0xPT0tVUF9JTlNOKGNkLCBidWYsIHZhbHVlKSBjZ2VuX2Rpc19sb29rdXBfaW5zbiAoKGNkKSwgKGJ1ZiksICh2YWx1ZSkpCi0jZGVmaW5lIENHRU5fRElTX05FWFRfSU5TTihpbnNuKSAoKGluc24pLT5uZXh0KQotDAotLyogVGhlIENQVSBkZXNjcmlwdGlvbi4KLSAgIEEgY29weSBvZiB0aGlzIGlzIGNyZWF0ZWQgd2hlbiB0aGUgY3B1IHRhYmxlIGlzICJvcGVuZWQiLgotICAgQWxsIGdsb2JhbCBzdGF0ZSBpbmZvcm1hdGlvbiBpcyByZWNvcmRlZCBoZXJlLgotICAgQWNjZXNzIG1hY3JvcyBhcmUgcHJvdmlkZWQgZm9yICJwdWJsaWMiIG1lbWJlcnMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBjZ2VuX2NwdV9kZXNjCi17Ci0gIC8qIEJpdG1hcCBvZiBzZWxlY3RlZCBtYWNoaW5lKHMpIChhIGxhIEJGRCBtYWNoaW5lIG51bWJlcikuICAqLwotICBpbnQgbWFjaHM7Ci0KLSAgLyogQml0bWFwIG9mIHNlbGVjdGVkIGlzYShzKS4KLSAgICAgPz8/IFNpbXVsdGFuZW91cyBtdWx0aXBsZSBpc2FzIG1pZ2h0IG5vdCBtYWtlIHNlbnNlLCBidXQgaXQncyBub3QgKHlldCkKLSAgICAgcHJlY2x1ZGVkLiAgKi8KLSAgaW50IGlzYXM7Ci0KLSAgLyogQ3VycmVudCBlbmRpYW4uICAqLwotICBlbnVtIGNnZW5fZW5kaWFuIGVuZGlhbjsKLSNkZWZpbmUgQ0dFTl9DUFVfRU5ESUFOKGNkKSAoKGNkKS0+ZW5kaWFuKQotCi0gIC8qIEN1cnJlbnQgaW5zbiBlbmRpYW4uICAqLwotICBlbnVtIGNnZW5fZW5kaWFuIGluc25fZW5kaWFuOwotI2RlZmluZSBDR0VOX0NQVV9JTlNOX0VORElBTihjZCkgKChjZCktPmluc25fZW5kaWFuKQotCi0gIC8qIFdvcmQgc2l6ZSAoaW4gYml0cykuICAqLwotICAvKiA/Pz8gT3IgbWF5YmUgbWF4aW11bSB3b3JkIHNpemUgLSBtaWdodCB3ZSBldmVyIG5lZWQgdG8gYWxsb3cgYSBjcHUgdGFibGUKLSAgICAgdG8gYmUgb3BlbmVkIGZvciBib3RoIHNwYXJjMzIvc3BhcmM2ND8KLSAgICAgPz8/IEFub3RoZXIgYWx0ZXJuYXRpdmUgaXMgdG8gY3JlYXRlIGEgdGFibGUgb2Ygc2VsZWN0ZWQgbWFjaHMgYW5kCi0gICAgIGxhemlseSBmZXRjaCB0aGUgZGF0YSBmcm9tIHRoZXJlLiAgKi8KLSAgdW5zaWduZWQgaW50IHdvcmRfYml0c2l6ZTsKLQotICAvKiBJbmRpY2F0b3IgaWYgc2l6ZXMgYXJlIHVua25vd24uCi0gICAgIFRoaXMgaXMgdXNlZCBieSBkZWZhdWx0X2luc25fYml0c2l6ZSxiYXNlX2luc25fYml0c2l6ZSBpZiB0aGVyZSBpcyBhCi0gICAgIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc2VsZWN0ZWQgaXNhJ3MuICAqLwotI2RlZmluZSBDR0VOX1NJWkVfVU5LTk9XTiA2NTUzNQotCi0gIC8qIERlZmF1bHQgaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuCi0gICAgIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyIHdoZW4gaXQgZW5jb3VudGVycyBhbiB1bmtub3duIGluc24uICAqLwotICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9pbnNuX2JpdHNpemU7Ci0KLSAgLyogQmFzZSBpbnN0cnVjdGlvbiBzaXplIChpbiBiaXRzKS4KLSAgICAgRm9yIG5vbi1MSVcgY3B1cyB0aGlzIGlzIGdlbmVyYWxseSB0aGUgbGVuZ3RoIG9mIHRoZSBzbWFsbGVzdCBpbnNuLgotICAgICBGb3IgTElXIGNwdXMgaXRzIHdpcCAod29yay1pbi1wcm9ncmVzcykuICBGb3IgdGhlIG0zMnIgaXRzIDMyLiAgKi8KLSAgdW5zaWduZWQgaW50IGJhc2VfaW5zbl9iaXRzaXplOwotCi0gIC8qIE1pbmltdW0vbWF4aW11bSBpbnN0cnVjdGlvbiBzaXplIChpbiBiaXRzKS4gICovCi0gIHVuc2lnbmVkIGludCBtaW5faW5zbl9iaXRzaXplOwotICB1bnNpZ25lZCBpbnQgbWF4X2luc25fYml0c2l6ZTsKLQotICAvKiBJbnN0cnVjdGlvbiBzZXQgdmFyaWFudHMuICAqLwotICBjb25zdCBDR0VOX0lTQSAqaXNhX3RhYmxlOwotCi0gIC8qIE1hY2hpbmUgdmFyaWFudHMuICAqLwotICBjb25zdCBDR0VOX01BQ0ggKm1hY2hfdGFibGU7Ci0KLSAgLyogSGFyZHdhcmUgZWxlbWVudHMuICAqLwotICBDR0VOX0hXX1RBQkxFIGh3X3RhYmxlOwotCi0gIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovCi0gIGNvbnN0IENHRU5fSUZMRCAqaWZsZF90YWJsZTsKLQotICAvKiBPcGVyYW5kcy4gICovCi0gIENHRU5fT1BFUkFORF9UQUJMRSBvcGVyYW5kX3RhYmxlOwotCi0gIC8qIE1haW4gaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotICBDR0VOX0lOU05fVEFCTEUgaW5zbl90YWJsZTsKLSNkZWZpbmUgQ0dFTl9DUFVfSU5TTl9UQUJMRShjZCkgKCYgKGNkKS0+aW5zbl90YWJsZSkKLQotICAvKiBNYWNybyBpbnN0cnVjdGlvbnMgYXJlIGRlZmluZWQgc2VwYXJhdGVseSBhbmQgYXJlIGNvbWJpbmVkIHdpdGggcmVhbAotICAgICBpbnNucyBkdXJpbmcgaGFzaCB0YWJsZSBjb21wdXRhdGlvbi4gICovCi0gIENHRU5fSU5TTl9UQUJMRSBtYWNyb19pbnNuX3RhYmxlOwotCi0gIC8qIENvcHkgb2YgQ0dFTl9JTlRfSU5TTl9QLiAgKi8KLSAgaW50IGludF9pbnNuX3A7Ci0KLSAgLyogQ2FsbGVkIHRvIHJlYnVpbGQgdGhlIHRhYmxlcyBhZnRlciBzb21ldGhpbmcgaGFzIGNoYW5nZWQuICAqLwotICB2b2lkICgqcmVidWlsZF90YWJsZXMpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKLQotICAvKiBPcGVyYW5kIHBhcnNlciBjYWxsYmFjay4gICovCi0gIGNnZW5fcGFyc2Vfb3BlcmFuZF9mbiAqIHBhcnNlX29wZXJhbmRfZm47Ci0KLSAgLyogUGFyc2UvaW5zZXJ0L2V4dHJhY3QvcHJpbnQgY292ZXIgZm5zIGZvciBvcGVyYW5kcy4gICovCi0gIGNvbnN0IGNoYXIgKiAoKnBhcnNlX29wZXJhbmQpCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgY29uc3QgY2hhciAqKiwKLQkgICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzXykpOwotI2lmZGVmIEJGRF9WRVJTSU9OCi0gIGNvbnN0IGNoYXIgKiAoKmluc2VydF9vcGVyYW5kKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIENHRU5fRklFTERTICpmaWVsZHNfLAotCSAgICAgIENHRU5fSU5TTl9CWVRFU19QVFIsIGJmZF92bWEgcGNfKSk7Ci0gIGludCAoKmV4dHJhY3Rfb3BlcmFuZCkKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBDR0VOX0VYVFJBQ1RfSU5GTyAqLCBDR0VOX0lOU05fSU5ULAotCSAgICAgIENHRU5fRklFTERTICpmaWVsZHNfLCBiZmRfdm1hIHBjXykpOwotICB2b2lkICgqcHJpbnRfb3BlcmFuZCkKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBQVFIgaW5mb18sIENHRU5fRklFTERTICogZmllbGRzXywKLQkgICAgICB2b2lkIGNvbnN0ICphdHRyc18sIGJmZF92bWEgcGNfLCBpbnQgbGVuZ3RoXykpOwotI2Vsc2UKLSAgY29uc3QgY2hhciAqICgqaW5zZXJ0X29wZXJhbmQpICgpOwotICBpbnQgKCpleHRyYWN0X29wZXJhbmQpICgpOwotICB2b2lkICgqcHJpbnRfb3BlcmFuZCkgKCk7Ci0jZW5kaWYKLSNkZWZpbmUgQ0dFTl9DUFVfUEFSU0VfT1BFUkFORChjZCkgKChjZCktPnBhcnNlX29wZXJhbmQpCi0jZGVmaW5lIENHRU5fQ1BVX0lOU0VSVF9PUEVSQU5EKGNkKSAoKGNkKS0+aW5zZXJ0X29wZXJhbmQpCi0jZGVmaW5lIENHRU5fQ1BVX0VYVFJBQ1RfT1BFUkFORChjZCkgKChjZCktPmV4dHJhY3Rfb3BlcmFuZCkKLSNkZWZpbmUgQ0dFTl9DUFVfUFJJTlRfT1BFUkFORChjZCkgKChjZCktPnByaW50X29wZXJhbmQpCi0KLSAgLyogU2l6ZSBvZiBDR0VOX0ZJRUxEUyBzdHJ1Y3QuICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZW9mX2ZpZWxkczsKLSNkZWZpbmUgQ0dFTl9DUFVfU0laRU9GX0ZJRUxEUyhjZCkgKChjZCktPnNpemVvZl9maWVsZHMpCi0KLSAgLyogU2V0IHRoZSBiaXRzaXplIGZpZWxkLiAgKi8KLSAgdm9pZCAoKnNldF9maWVsZHNfYml0c2l6ZSkgUEFSQU1TICgoQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGludCBzaXplXykpOwotI2RlZmluZSBDR0VOX0NQVV9TRVRfRklFTERTX0JJVFNJWkUoY2QpICgoY2QpLT5zZXRfZmllbGRzX2JpdHNpemUpCi0KLSAgLyogQ0dFTl9GSUVMRFMgYWNjZXNzb3JzLiAgKi8KLSAgaW50ICgqZ2V0X2ludF9vcGVyYW5kKQotICAgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgY29uc3QgQ0dFTl9GSUVMRFMgKmZpZWxkc18pKTsKLSAgdm9pZCAoKnNldF9pbnRfb3BlcmFuZCkKLSAgICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIENHRU5fRklFTERTICpmaWVsZHNfLCBpbnQgdmFsdWVfKSk7Ci0jaWZkZWYgQkZEX1ZFUlNJT04KLSAgYmZkX3ZtYSAoKmdldF92bWFfb3BlcmFuZCkKLSAgICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIGNvbnN0IENHRU5fRklFTERTICpmaWVsZHNfKSk7Ci0gIHZvaWQgKCpzZXRfdm1hX29wZXJhbmQpCi0gICAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXywgYmZkX3ZtYSB2YWx1ZV8pKTsKLSNlbHNlCi0gIGxvbmcgKCpnZXRfdm1hX29wZXJhbmQpICgpOwotICB2b2lkICgqc2V0X3ZtYV9vcGVyYW5kKSAoKTsKLSNlbmRpZgotI2RlZmluZSBDR0VOX0NQVV9HRVRfSU5UX09QRVJBTkQoY2QpICgoY2QpLT5nZXRfaW50X29wZXJhbmQpCi0jZGVmaW5lIENHRU5fQ1BVX1NFVF9JTlRfT1BFUkFORChjZCkgKChjZCktPnNldF9pbnRfb3BlcmFuZCkKLSNkZWZpbmUgQ0dFTl9DUFVfR0VUX1ZNQV9PUEVSQU5EKGNkKSAoKGNkKS0+Z2V0X3ZtYV9vcGVyYW5kKQotI2RlZmluZSBDR0VOX0NQVV9TRVRfVk1BX09QRVJBTkQoY2QpICgoY2QpLT5zZXRfdm1hX29wZXJhbmQpCi0KLSAgLyogSW5zdHJ1Y3Rpb24gcGFyc2UvaW5zZXJ0L2V4dHJhY3QvcHJpbnQgaGFuZGxlcnMuICAqLwotICAvKiBGSVhNRTogbWFrZSB0aGVzZSB0eXBlcyB1cHBlcmNhc2UuICAqLwotICBjZ2VuX3BhcnNlX2ZuICogY29uc3QgKnBhcnNlX2hhbmRsZXJzOwotICBjZ2VuX2luc2VydF9mbiAqIGNvbnN0ICppbnNlcnRfaGFuZGxlcnM7Ci0gIGNnZW5fZXh0cmFjdF9mbiAqIGNvbnN0ICpleHRyYWN0X2hhbmRsZXJzOwotICBjZ2VuX3ByaW50X2ZuICogY29uc3QgKnByaW50X2hhbmRsZXJzOwotI2RlZmluZSBDR0VOX1BBUlNFX0ZOKGNkLCBpbnNuKSAgIChjZC0+cGFyc2VfaGFuZGxlcnNbKGluc24pLT5vcGNvZGUtPmhhbmRsZXJzLnBhcnNlXSkKLSNkZWZpbmUgQ0dFTl9JTlNFUlRfRk4oY2QsIGluc24pICAoY2QtPmluc2VydF9oYW5kbGVyc1soaW5zbiktPm9wY29kZS0+aGFuZGxlcnMuaW5zZXJ0XSkKLSNkZWZpbmUgQ0dFTl9FWFRSQUNUX0ZOKGNkLCBpbnNuKSAoY2QtPmV4dHJhY3RfaGFuZGxlcnNbKGluc24pLT5vcGNvZGUtPmhhbmRsZXJzLmV4dHJhY3RdKQotI2RlZmluZSBDR0VOX1BSSU5UX0ZOKGNkLCBpbnNuKSAgIChjZC0+cHJpbnRfaGFuZGxlcnNbKGluc24pLT5vcGNvZGUtPmhhbmRsZXJzLnByaW50XSkKLQotICAvKiBSZXR1cm4gbm9uLXplcm8gaWYgaW5zbiBzaG91bGQgYmUgYWRkZWQgdG8gaGFzaCB0YWJsZS4gICovCi0gIGludCAoKiBhc21faGFzaF9wKSBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOwotCi0gIC8qIEFzc2VtYmxlciBoYXNoIGZ1bmN0aW9uLiAgKi8KLSAgdW5zaWduZWQgaW50ICgqIGFzbV9oYXNoKSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBhc3NlbWJsZXIgaGFzaCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGludCBhc21faGFzaF9zaXplOwotCi0gIC8qIFJldHVybiBub24temVybyBpZiBpbnNuIHNob3VsZCBiZSBhZGRlZCB0byBoYXNoIHRhYmxlLiAgKi8KLSAgaW50ICgqIGRpc19oYXNoX3ApIFBBUkFNUyAoKGNvbnN0IENHRU5fSU5TTiAqKSk7Ci0KLSAgLyogRGlzYXNzZW1ibGVyIGhhc2ggZnVuY3Rpb24uICAqLwotICB1bnNpZ25lZCBpbnQgKCogZGlzX2hhc2gpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgQ0dFTl9JTlNOX0lOVCkpOwotCi0gIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIGRpc2Fzc2VtYmxlciBoYXNoIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgaW50IGRpc19oYXNoX3NpemU7Ci0KLSAgLyogQXNzZW1ibGVyIGluc3RydWN0aW9uIGhhc2ggdGFibGUuICAqLwotICBDR0VOX0lOU05fTElTVCAqKmFzbV9oYXNoX3RhYmxlOwotICBDR0VOX0lOU05fTElTVCAqYXNtX2hhc2hfdGFibGVfZW50cmllczsKLQotICAvKiBEaXNhc3NlbWJsZXIgaW5zdHJ1Y3Rpb24gaGFzaCB0YWJsZS4gICovCi0gIENHRU5fSU5TTl9MSVNUICoqZGlzX2hhc2hfdGFibGU7Ci0gIENHRU5fSU5TTl9MSVNUICpkaXNfaGFzaF90YWJsZV9lbnRyaWVzOwotfSBDR0VOX0NQVV9UQUJMRTsKLQotLyogd2lwICovCi0jaWZuZGVmIENHRU5fV09SRF9FTkRJQU4KLSNkZWZpbmUgQ0dFTl9XT1JEX0VORElBTihjZCkgQ0dFTl9DUFVfRU5ESUFOIChjZCkKLSNlbmRpZgotI2lmbmRlZiBDR0VOX0lOU05fV09SRF9FTkRJQU4KLSNkZWZpbmUgQ0dFTl9JTlNOX1dPUkRfRU5ESUFOKGNkKSBDR0VOX0NQVV9JTlNOX0VORElBTiAoY2QpCi0jZW5kaWYKLQwKLS8qIFByb3RvdHlwZXMgb2YgbWFqb3IgZnVuY3Rpb25zLiAgKi8KLS8qIEZJWE1FOiBNb3ZlIG1vcmUgQ0dFTl9TWU0tZGVmaW5lZCBmdW5jdGlvbnMgaW50byBDR0VOX0NQVV9ERVNDLgotICAgTm90IHRoZSBpbml0IGZucyB0aG91Z2gsIGFzIHRoYXQgd291bGQgZHJhZyBpbiB0aGluZ3MgdGhhdCBtaWdodG4ndCBiZQotICAgdXNlZCBhbmQgbWlnaHQgbm90IGV2ZW4gZXhpc3QuICAqLwotCi0vKiBBcmd1bWVudCB0eXBlcyB0byBjcHVfb3Blbi4gICovCi0KLWVudW0gY2dlbl9jcHVfb3Blbl9hcmcgewotICBDR0VOX0NQVV9PUEVOX0VORCwKLSAgLyogU2VsZWN0IGluc3RydWN0aW9uIHNldChzKSwgYXJnIGlzIGJpdG1hcCBvciAwIG1lYW5pbmcgInVuc3BlY2lmaWVkIi4gICovCi0gIENHRU5fQ1BVX09QRU5fSVNBUywKLSAgLyogU2VsZWN0IG1hY2hpbmUocyksIGFyZyBpcyBiaXRtYXAgb3IgMCBtZWFuaW5nICJ1bnNwZWNpZmllZCIuICAqLwotICBDR0VOX0NQVV9PUEVOX01BQ0hTLAotICAvKiBTZWxlY3QgbWFjaGluZSwgYXJnIGlzIG1hY2gncyBiZmQgbmFtZS4KLSAgICAgTXVsdGlwbGUgbWFjaGluZXMgY2FuIGJlIHNwZWNpZmllZCBieSByZXBlYXRlZCB1c2UuICAqLwotICBDR0VOX0NQVV9PUEVOX0JGRE1BQ0gsCi0gIC8qIFNlbGVjdCBlbmRpYW4sIGFyZyBpcyBDR0VOX0VORElBTl8qLiAgKi8KLSAgQ0dFTl9DUFVfT1BFTl9FTkRJQU4KLX07Ci0KLS8qIE9wZW4gYSBjcHUgZGVzY3JpcHRvciB0YWJsZSBmb3IgdXNlLgotICAgPz8/IFdlIG9ubHkgc3VwcG9ydCBJU08gQyBzdGRhcmdzIGhlcmUsIG5vdCBLJlIuCi0gICBMYXppbmVzcywgcGx1cyBleHBlcmltZW50IHRvIHNlZSBpZiBhbnl0aGluZyByZXF1aXJlcyBLJlIgLSBldmVudHVhbGx5Ci0gICBLJlIgd2lsbCBubyBsb25nZXIgYmUgc3VwcG9ydGVkIC0gZS5nLiBHREIgaXMgY3VycmVudGx5IHRyeWluZyB0aGlzLiAgKi8KLQotZXh0ZXJuIENHRU5fQ1BVX0RFU0MgQ0dFTl9TWU0gKGNwdV9vcGVuKSAoZW51bSBjZ2VuX2NwdV9vcGVuX2FyZywgLi4uKTsKLQotLyogQ292ZXIgZm4gdG8gaGFuZGxlIHNpbXBsZSBjYXNlLiAgKi8KLQotZXh0ZXJuIENHRU5fQ1BVX0RFU0MgQ0dFTl9TWU0gKGNwdV9vcGVuXzEpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm1hY2hfbmFtZV8sCi0JCQkJCQkgICAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW5fKSk7Ci0KLS8qIENsb3NlIGl0LiAgKi8KLQotZXh0ZXJuIHZvaWQgQ0dFTl9TWU0gKGNwdV9jbG9zZSkgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotCi0vKiBJbml0aWFsaXplIHRoZSBvcGNvZGUgdGFibGUgZm9yIHVzZS4KLSAgIENhbGxlZCBieSBpbml0X2FzbS9pbml0X2Rpcy4gICovCi0KLWV4dGVybiB2b2lkIENHRU5fU1lNIChpbml0X29wY29kZV90YWJsZSkgUEFSQU1TICgoQ0dFTl9DUFVfREVTQyBjZF8pKTsKLQotLyogSW5pdGlhbGl6ZSB0aGUgaWJsZCB0YWJsZSBmb3IgdXNlLgotICAgQ2FsbGVkIGJ5IGluaXRfYXNtL2luaXRfZGlzLiAgKi8KLQotZXh0ZXJuIHZvaWQgQ0dFTl9TWU0gKGluaXRfaWJsZF90YWJsZSkgUEFSQU1TICgoQ0dFTl9DUFVfREVTQyBjZF8pKTsKLQotLyogSW5pdGlhbGl6ZSBhbiBjcHUgdGFibGUgZm9yIGFzc2VtYmxlciBvciBkaXNhc3NlbWJsZXIgdXNlLgotICAgVGhlc2UgbXVzdCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY3B1X29wZW4uICAqLwotCi1leHRlcm4gdm9pZCBDR0VOX1NZTSAoaW5pdF9hc20pIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKLWV4dGVybiB2b2lkIENHRU5fU1lNIChpbml0X2RpcykgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotCi0vKiBJbml0aWFsaXplIHRoZSBvcGVyYW5kIGluc3RhbmNlIHRhYmxlIGZvciB1c2UuICAqLwotCi1leHRlcm4gdm9pZCBDR0VOX1NZTSAoaW5pdF9vcGluc3RfdGFibGUpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MgY2RfKSk7Ci0KLS8qIEFzc2VtYmxlIGFuIGluc3RydWN0aW9uLiAgKi8KLQotZXh0ZXJuIGNvbnN0IENHRU5fSU5TTiAqIENHRU5fU1lNIChhc3NlbWJsZV9pbnNuKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICosIENHRU5fRklFTERTICosCi0JICAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiwgY2hhciAqKikpOwotCi1leHRlcm4gY29uc3QgQ0dFTl9LRVlXT1JEIENHRU5fU1lNIChvcGVyYW5kX21hY2gpOwotZXh0ZXJuIGludCBDR0VOX1NZTSAoZ2V0X21hY2gpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBPcGVyYW5kIGluZGV4IGNvbXB1dGF0aW9uLiAgKi8KLWV4dGVybiBjb25zdCBDR0VOX0lOU04gKiBjZ2VuX2xvb2t1cF9pbnNuCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqIGluc25fLAotCSAgICAgIENHRU5fSU5TTl9JTlQgaW50X3ZhbHVlXywgdW5zaWduZWQgY2hhciAqYnl0ZXNfdmFsdWVfLAotCSAgICAgIGludCBsZW5ndGhfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXywgaW50IGFsaWFzX3BfKSk7Ci1leHRlcm4gdm9pZCBjZ2VuX2dldF9pbnNuX29wZXJhbmRzCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqIGluc25fLAotCSAgICAgIGNvbnN0IENHRU5fRklFTERTICpmaWVsZHNfLCBpbnQgKmluZGljZXNfKSk7Ci1leHRlcm4gY29uc3QgQ0dFTl9JTlNOICogY2dlbl9sb29rdXBfZ2V0X2luc25fb3BlcmFuZHMKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICppbnNuXywKLQkgICAgICBDR0VOX0lOU05fSU5UIGludF92YWx1ZV8sIHVuc2lnbmVkIGNoYXIgKmJ5dGVzX3ZhbHVlXywKLQkgICAgICBpbnQgbGVuZ3RoXywgaW50ICppbmRpY2VzXywgQ0dFTl9GSUVMRFMgKmZpZWxkc18pKTsKLQotLyogQ292ZXIgZm5zIHRvIGJmZF9nZXQvc2V0LiAgKi8KLQotZXh0ZXJuIENHRU5fSU5TTl9JTlQgY2dlbl9nZXRfaW5zbl92YWx1ZQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCB1bnNpZ25lZCBjaGFyICosIGludCkpOwotZXh0ZXJuIHZvaWQgY2dlbl9wdXRfaW5zbl92YWx1ZQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCB1bnNpZ25lZCBjaGFyICosIGludCwgQ0dFTl9JTlNOX0lOVCkpOwotCi0vKiBSZWFkIGluIGEgY3B1IGRlc2NyaXB0aW9uIGZpbGUuCi0gICA/Pz8gRm9yIGZ1dHVyZSBjb25jZXJucywgaW5jbHVkaW5nIGFkZGluZyBpbnN0cnVjdGlvbnMgdG8gdGhlIGFzc2VtYmxlci8KLSAgIGRpc2Fzc2VtYmxlciBhdCBydW4tdGltZS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICogY2dlbl9yZWFkX2NwdV9maWxlCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKiBmaWxlbmFtZV8pKTsKLQotI2VuZGlmIC8qIENHRU5fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvY29udmV4LmggYi9pbmNsdWRlL29wY29kZS9jb252ZXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhZWViYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9jb252ZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MTEgKzAsMCBAQAotLyogSW5mb3JtYXRpb24gZm9yIGluc3RydWN0aW9uIGRpc2Fzc2VtYmx5IG9uIHRoZSBDb252ZXguCi0gICBDb3B5cmlnaHQgMTk4OSwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmCUNPTlNUCi0jZGVmaW5lCUNPTlNUCi0jZW5kaWYJLyogQ09OU1QgKi8KLQotI2RlZmluZSB4eHggMAotI2RlZmluZSBycnIgMQotI2RlZmluZSByciAyCi0jZGVmaW5lIHJ4ciAzCi0jZGVmaW5lIHIgNAotI2RlZmluZSBub3BzIDUKLSNkZWZpbmUgbnIgNgotI2RlZmluZSBwY3JlbCA3Ci0jZGVmaW5lIGxyIDgKLSNkZWZpbmUgcnhsIDkKLSNkZWZpbmUgcmxyIDEwCi0jZGVmaW5lIHJybCAxMQotI2RlZmluZSBpbWwgMTIKLSNkZWZpbmUgaW1yIDEzCi0jZGVmaW5lIGExciAxNAotI2RlZmluZSBhMWwgMTUKLSNkZWZpbmUgYTJyIDE2Ci0jZGVmaW5lIGEybCAxNwotI2RlZmluZSBhMyAxOAotI2RlZmluZSBhNCAxOQotI2RlZmluZSBhNSAyMAotI2RlZmluZSBWIDEKLSNkZWZpbmUgUyAyCi0jZGVmaW5lIFZNIDMKLSNkZWZpbmUgQSA0Ci0jZGVmaW5lIFZMIDUKLSNkZWZpbmUgVlMgNgotI2RlZmluZSBWTFMgNwotI2RlZmluZSBQU1cgOAotLyogUHJldmVudCBhbiBlcnJvciBkdXJpbmcgIm1ha2UgZGVwZW5kIi4gICovCi0jaWYgIWRlZmluZWQgKFBDKQotI2RlZmluZSBQQyA5Ci0jZW5kaWYKLSNkZWZpbmUgSVRSIDEwCi0jZGVmaW5lIFZWIDExCi0jZGVmaW5lIElUU1IgMTIKLSNkZWZpbmUgVE9DIDEzCi0jZGVmaW5lIENJUiAxNAotI2RlZmluZSBUVFIgMTUKLSNkZWZpbmUgVk1VIDE2Ci0jZGVmaW5lIFZNTCAxNwotI2RlZmluZSBJQ1IgMTgKLSNkZWZpbmUgVENQVSAxOQotI2RlZmluZSBDUFVJRCAyMAotI2RlZmluZSBUSUQgMjEKLQotQ09OU1QgY2hhciAqb3BbXSA9IHsKLSAgIiIsCi0gICJ2MFwwdjFcMHYyXDB2M1wwdjRcMHY1XDB2NlwwdjciLAotICAiczBcMHMxXDBzMlwwczNcMHM0XDBzNVwwczZcMHM3IiwKLSAgInZtIiwKLSAgInNwXDBhMVwwYTJcMGEzXDBhNFwwYTVcMGFwXDBmcCIsCi0gICJ2bCIsCi0gICJ2cyIsCi0gICJ2bHMiLAotICAicHN3IiwKLSAgInBjIiwKLSAgIml0ciIsCi0gICJ2diIsCi0gICJpdHNyIiwKLSAgInRvYyIsCi0gICJjaXIiLAotICAidHRyIiwKLSAgInZtdSIsCi0gICJ2bWwiLAotICAiaWNyIiwKLSAgInRjcHUiLAotICAiY3B1aWQiLAotICAidGlkIiwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDBbXSA9IHsKLSAgezAsMCxycnIsVixTLFN9LAkvKiBtb3YgKi8KLSAgezAsMCxycnIsUyxTLFZ9LAkvKiBtb3YgKi8KLSAgezEsMSxycnIsVixWLFZ9LAkvKiBtZXJnLnQgKi8KLSAgezIsMSxycnIsVixWLFZ9LAkvKiBtYXNrLnQgKi8KLSAgezEsMixycnIsVixTLFZ9LAkvKiBtZXJnLmYgKi8KLSAgezIsMixycnIsVixTLFZ9LAkvKiBtYXNrLmYgKi8KLSAgezEsMSxycnIsVixTLFZ9LAkvKiBtZXJnLnQgKi8KLSAgezIsMSxycnIsVixTLFZ9LAkvKiBtYXNrLnQgKi8KLSAgezMsMyxycnIsVixWLFZ9LAkvKiBtdWwucyAqLwotICB7Myw0LHJycixWLFYsVn0sCS8qIG11bC5kICovCi0gIHs0LDMscnJyLFYsVixWfSwJLyogZGl2LnMgKi8KLSAgezQsNCxycnIsVixWLFZ9LAkvKiBkaXYuZCAqLwotICB7MywzLHJycixWLFMsVn0sCS8qIG11bC5zICovCi0gIHszLDQscnJyLFYsUyxWfSwJLyogbXVsLmQgKi8KLSAgezQsMyxycnIsVixTLFZ9LAkvKiBkaXYucyAqLwotICB7NCw0LHJycixWLFMsVn0sCS8qIGRpdi5kICovCi0gIHs1LDAscnJyLFYsVixWfSwJLyogYW5kICovCi0gIHs2LDAscnJyLFYsVixWfSwJLyogb3IgKi8KLSAgezcsMCxycnIsVixWLFZ9LAkvKiB4b3IgKi8KLSAgezgsMCxycnIsVixWLFZ9LAkvKiBzaGYgKi8KLSAgezUsMCxycnIsVixTLFZ9LAkvKiBhbmQgKi8KLSAgezYsMCxycnIsVixTLFZ9LAkvKiBvciAqLwotICB7NywwLHJycixWLFMsVn0sCS8qIHhvciAqLwotICB7OCwwLHJycixWLFMsVn0sCS8qIHNoZiAqLwotICB7OSwzLHJycixWLFYsVn0sCS8qIGFkZC5zICovCi0gIHs5LDQscnJyLFYsVixWfSwJLyogYWRkLmQgKi8KLSAgezEwLDMscnJyLFYsVixWfSwJLyogc3ViLnMgKi8KLSAgezEwLDQscnJyLFYsVixWfSwJLyogc3ViLmQgKi8KLSAgezksMyxycnIsVixTLFZ9LAkvKiBhZGQucyAqLwotICB7OSw0LHJycixWLFMsVn0sCS8qIGFkZC5kICovCi0gIHsxMCwzLHJycixWLFMsVn0sCS8qIHN1Yi5zICovCi0gIHsxMCw0LHJycixWLFMsVn0sCS8qIHN1Yi5kICovCi0gIHs5LDUscnJyLFYsVixWfSwJLyogYWRkLmIgKi8KLSAgezksNixycnIsVixWLFZ9LAkvKiBhZGQuaCAqLwotICB7OSw3LHJycixWLFYsVn0sCS8qIGFkZC53ICovCi0gIHs5LDgscnJyLFYsVixWfSwJLyogYWRkLmwgKi8KLSAgezksNSxycnIsVixTLFZ9LAkvKiBhZGQuYiAqLwotICB7OSw2LHJycixWLFMsVn0sCS8qIGFkZC5oICovCi0gIHs5LDcscnJyLFYsUyxWfSwJLyogYWRkLncgKi8KLSAgezksOCxycnIsVixTLFZ9LAkvKiBhZGQubCAqLwotICB7MTAsNSxycnIsVixWLFZ9LAkvKiBzdWIuYiAqLwotICB7MTAsNixycnIsVixWLFZ9LAkvKiBzdWIuaCAqLwotICB7MTAsNyxycnIsVixWLFZ9LAkvKiBzdWIudyAqLwotICB7MTAsOCxycnIsVixWLFZ9LAkvKiBzdWIubCAqLwotICB7MTAsNSxycnIsVixTLFZ9LAkvKiBzdWIuYiAqLwotICB7MTAsNixycnIsVixTLFZ9LAkvKiBzdWIuaCAqLwotICB7MTAsNyxycnIsVixTLFZ9LAkvKiBzdWIudyAqLwotICB7MTAsOCxycnIsVixTLFZ9LAkvKiBzdWIubCAqLwotICB7Myw1LHJycixWLFYsVn0sCS8qIG11bC5iICovCi0gIHszLDYscnJyLFYsVixWfSwJLyogbXVsLmggKi8KLSAgezMsNyxycnIsVixWLFZ9LAkvKiBtdWwudyAqLwotICB7Myw4LHJycixWLFYsVn0sCS8qIG11bC5sICovCi0gIHszLDUscnJyLFYsUyxWfSwJLyogbXVsLmIgKi8KLSAgezMsNixycnIsVixTLFZ9LAkvKiBtdWwuaCAqLwotICB7Myw3LHJycixWLFMsVn0sCS8qIG11bC53ICovCi0gIHszLDgscnJyLFYsUyxWfSwJLyogbXVsLmwgKi8KLSAgezQsNSxycnIsVixWLFZ9LAkvKiBkaXYuYiAqLwotICB7NCw2LHJycixWLFYsVn0sCS8qIGRpdi5oICovCi0gIHs0LDcscnJyLFYsVixWfSwJLyogZGl2LncgKi8KLSAgezQsOCxycnIsVixWLFZ9LAkvKiBkaXYubCAqLwotICB7NCw1LHJycixWLFMsVn0sCS8qIGRpdi5iICovCi0gIHs0LDYscnJyLFYsUyxWfSwJLyogZGl2LmggKi8KLSAgezQsNyxycnIsVixTLFZ9LAkvKiBkaXYudyAqLwotICB7NCw4LHJycixWLFMsVn0sCS8qIGRpdi5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQxW10gPSB7Ci0gIHsxMSwwLHh4eCwwLDAsMH0sCS8qIGV4aXQgKi8KLSAgezEyLDAsYTMsMCwwLDB9LAkvKiBqbXAgKi8KLSAgezEzLDIsYTMsMCwwLDB9LAkvKiBqbXBpLmYgKi8KLSAgezEzLDEsYTMsMCwwLDB9LAkvKiBqbXBpLnQgKi8KLSAgezE0LDIsYTMsMCwwLDB9LAkvKiBqbXBhLmYgKi8KLSAgezE0LDEsYTMsMCwwLDB9LAkvKiBqbXBhLnQgKi8KLSAgezE1LDIsYTMsMCwwLDB9LAkvKiBqbXBzLmYgKi8KLSAgezE1LDEsYTMsMCwwLDB9LAkvKiBqbXBzLnQgKi8KLSAgezE2LDAsYTMsMCwwLDB9LAkvKiB0YWMgKi8KLSAgezE3LDAsYTFyLEEsMCwwfSwJLyogbGRlYSAqLwotICB7MTgsOCxhMWwsVkxTLDAsMH0sCS8qIGxkLmwgKi8KLSAgezE4LDksYTFsLFZNLDAsMH0sCS8qIGxkLnggKi8KLSAgezE5LDAsYTMsMCwwLDB9LAkvKiB0YXMgKi8KLSAgezIwLDAsYTMsMCwwLDB9LAkvKiBwc2hlYSAqLwotICB7MjEsOCxhMmwsVkxTLDAsMH0sCS8qIHN0LmwgKi8KLSAgezIxLDksYTJsLFZNLDAsMH0sCS8qIHN0LnggKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezIyLDAsYTMsMCwwLDB9LAkvKiBjYWxsICovCi0gIHsyMywwLGEzLDAsMCwwfSwJLyogY2FsbHMgKi8KLSAgezI0LDAsYTMsMCwwLDB9LAkvKiBjYWxscSAqLwotICB7MjUsMCxhMXIsQSwwLDB9LAkvKiBwZm9yayAqLwotICB7MjYsNSxhMnIsUywwLDB9LAkvKiBzdGUuYiAqLwotICB7MjYsNixhMnIsUywwLDB9LAkvKiBzdGUuaCAqLwotICB7MjYsNyxhMnIsUywwLDB9LAkvKiBzdGUudyAqLwotICB7MjYsOCxhMnIsUywwLDB9LAkvKiBzdGUubCAqLwotICB7MTgsNSxhMXIsQSwwLDB9LAkvKiBsZC5iICovCi0gIHsxOCw2LGExcixBLDAsMH0sCS8qIGxkLmggKi8KLSAgezE4LDcsYTFyLEEsMCwwfSwJLyogbGQudyAqLwotICB7MjcsNyxhMXIsQSwwLDB9LAkvKiBpbmNyLncgKi8KLSAgezIxLDUsYTJyLEEsMCwwfSwJLyogc3QuYiAqLwotICB7MjEsNixhMnIsQSwwLDB9LAkvKiBzdC5oICovCi0gIHsyMSw3LGEycixBLDAsMH0sCS8qIHN0LncgKi8KLSAgezI3LDgsYTFyLFMsMCwwfSwJLyogaW5jci5sICovCi0gIHsxOCw1LGExcixTLDAsMH0sCS8qIGxkLmIgKi8KLSAgezE4LDYsYTFyLFMsMCwwfSwJLyogbGQuaCAqLwotICB7MTgsNyxhMXIsUywwLDB9LAkvKiBsZC53ICovCi0gIHsxOCw4LGExcixTLDAsMH0sCS8qIGxkLmwgKi8KLSAgezIxLDUsYTJyLFMsMCwwfSwJLyogc3QuYiAqLwotICB7MjEsNixhMnIsUywwLDB9LAkvKiBzdC5oICovCi0gIHsyMSw3LGEycixTLDAsMH0sCS8qIHN0LncgKi8KLSAgezIxLDgsYTJyLFMsMCwwfSwJLyogc3QubCAqLwotICB7MTgsNSxhMXIsViwwLDB9LAkvKiBsZC5iICovCi0gIHsxOCw2LGExcixWLDAsMH0sCS8qIGxkLmggKi8KLSAgezE4LDcsYTFyLFYsMCwwfSwJLyogbGQudyAqLwotICB7MTgsOCxhMXIsViwwLDB9LAkvKiBsZC5sICovCi0gIHsyMSw1LGEycixWLDAsMH0sCS8qIHN0LmIgKi8KLSAgezIxLDYsYTJyLFYsMCwwfSwJLyogc3QuaCAqLwotICB7MjEsNyxhMnIsViwwLDB9LAkvKiBzdC53ICovCi0gIHsyMSw4LGEycixWLDAsMH0sCS8qIHN0LmwgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDJbXSA9IHsKLSAgezI4LDUscnIsQSxBLDB9LAkvKiBjdnR3LmIgKi8KLSAgezI4LDYscnIsQSxBLDB9LAkvKiBjdnR3LmggKi8KLSAgezI5LDcscnIsQSxBLDB9LAkvKiBjdnRiLncgKi8KLSAgezMwLDcscnIsQSxBLDB9LAkvKiBjdnRoLncgKi8KLSAgezI4LDUscnIsUyxTLDB9LAkvKiBjdnR3LmIgKi8KLSAgezI4LDYscnIsUyxTLDB9LAkvKiBjdnR3LmggKi8KLSAgezI5LDcscnIsUyxTLDB9LAkvKiBjdnRiLncgKi8KLSAgezMwLDcscnIsUyxTLDB9LAkvKiBjdnRoLncgKi8KLSAgezI4LDMscnIsUyxTLDB9LAkvKiBjdnR3LnMgKi8KLSAgezMxLDcscnIsUyxTLDB9LAkvKiBjdnRzLncgKi8KLSAgezMyLDMscnIsUyxTLDB9LAkvKiBjdnRkLnMgKi8KLSAgezMxLDQscnIsUyxTLDB9LAkvKiBjdnRzLmQgKi8KLSAgezMxLDgscnIsUyxTLDB9LAkvKiBjdnRzLmwgKi8KLSAgezMyLDgscnIsUyxTLDB9LAkvKiBjdnRkLmwgKi8KLSAgezMzLDMscnIsUyxTLDB9LAkvKiBjdnRsLnMgKi8KLSAgezMzLDQscnIsUyxTLDB9LAkvKiBjdnRsLmQgKi8KLSAgezM0LDAscnIsQSxBLDB9LAkvKiBsZHBhICovCi0gIHs4LDAsbnIsQSwwLDB9LAkvKiBzaGYgKi8KLSAgezE4LDYsbnIsQSwwLDB9LAkvKiBsZC5oICovCi0gIHsxOCw3LG5yLEEsMCwwfSwJLyogbGQudyAqLwotICB7MzMsNyxycixTLFMsMH0sCS8qIGN2dGwudyAqLwotICB7MjgsOCxycixTLFMsMH0sCS8qIGN2dHcubCAqLwotICB7MzUsMSxycixTLFMsMH0sCS8qIHBsYy50ICovCi0gIHszNiwwLHJyLFMsUywwfSwJLyogdHpjICovCi0gIHszNyw2LHJyLEEsQSwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxycixBLEEsMH0sCS8qIGVxLncgKi8KLSAgezM3LDYsbnIsQSwwLDB9LAkvKiBlcS5oICovCi0gIHszNyw3LG5yLEEsMCwwfSwJLyogZXEudyAqLwotICB7MzcsNSxycixTLFMsMH0sCS8qIGVxLmIgKi8KLSAgezM3LDYscnIsUyxTLDB9LAkvKiBlcS5oICovCi0gIHszNyw3LHJyLFMsUywwfSwJLyogZXEudyAqLwotICB7MzcsOCxycixTLFMsMH0sCS8qIGVxLmwgKi8KLSAgezM4LDYscnIsQSxBLDB9LAkvKiBsZXUuaCAqLwotICB7MzgsNyxycixBLEEsMH0sCS8qIGxldS53ICovCi0gIHszOCw2LG5yLEEsMCwwfSwJLyogbGV1LmggKi8KLSAgezM4LDcsbnIsQSwwLDB9LAkvKiBsZXUudyAqLwotICB7MzgsNSxycixTLFMsMH0sCS8qIGxldS5iICovCi0gIHszOCw2LHJyLFMsUywwfSwJLyogbGV1LmggKi8KLSAgezM4LDcscnIsUyxTLDB9LAkvKiBsZXUudyAqLwotICB7MzgsOCxycixTLFMsMH0sCS8qIGxldS5sICovCi0gIHszOSw2LHJyLEEsQSwwfSwJLyogbHR1LmggKi8KLSAgezM5LDcscnIsQSxBLDB9LAkvKiBsdHUudyAqLwotICB7MzksNixucixBLDAsMH0sCS8qIGx0dS5oICovCi0gIHszOSw3LG5yLEEsMCwwfSwJLyogbHR1LncgKi8KLSAgezM5LDUscnIsUyxTLDB9LAkvKiBsdHUuYiAqLwotICB7MzksNixycixTLFMsMH0sCS8qIGx0dS5oICovCi0gIHszOSw3LHJyLFMsUywwfSwJLyogbHR1LncgKi8KLSAgezM5LDgscnIsUyxTLDB9LAkvKiBsdHUubCAqLwotICB7NDAsNixycixBLEEsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcscnIsQSxBLDB9LAkvKiBsZS53ICovCi0gIHs0MCw2LG5yLEEsMCwwfSwJLyogbGUuaCAqLwotICB7NDAsNyxucixBLDAsMH0sCS8qIGxlLncgKi8KLSAgezQwLDUscnIsUyxTLDB9LAkvKiBsZS5iICovCi0gIHs0MCw2LHJyLFMsUywwfSwJLyogbGUuaCAqLwotICB7NDAsNyxycixTLFMsMH0sCS8qIGxlLncgKi8KLSAgezQwLDgscnIsUyxTLDB9LAkvKiBsZS5sICovCi0gIHs0MSw2LHJyLEEsQSwwfSwJLyogbHQuaCAqLwotICB7NDEsNyxycixBLEEsMH0sCS8qIGx0LncgKi8KLSAgezQxLDYsbnIsQSwwLDB9LAkvKiBsdC5oICovCi0gIHs0MSw3LG5yLEEsMCwwfSwJLyogbHQudyAqLwotICB7NDEsNSxycixTLFMsMH0sCS8qIGx0LmIgKi8KLSAgezQxLDYscnIsUyxTLDB9LAkvKiBsdC5oICovCi0gIHs0MSw3LHJyLFMsUywwfSwJLyogbHQudyAqLwotICB7NDEsOCxycixTLFMsMH0sCS8qIGx0LmwgKi8KLSAgezksNyxycixTLEEsMH0sCS8qIGFkZC53ICovCi0gIHs4LDAscnIsQSxBLDB9LAkvKiBzaGYgKi8KLSAgezAsMCxycixBLEEsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJyLFMsQSwwfSwJLyogbW92ICovCi0gIHswLDcscnIsUyxTLDB9LAkvKiBtb3YudyAqLwotICB7OCwwLHJyLFMsUywwfSwJLyogc2hmICovCi0gIHswLDAscnIsUyxTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxycixBLFMsMH0sCS8qIG1vdiAqLwotICB7NSwwLHJyLEEsQSwwfSwJLyogYW5kICovCi0gIHs2LDAscnIsQSxBLDB9LAkvKiBvciAqLwotICB7NywwLHJyLEEsQSwwfSwJLyogeG9yICovCi0gIHs0MiwwLHJyLEEsQSwwfSwJLyogbm90ICovCi0gIHs1LDAscnIsUyxTLDB9LAkvKiBhbmQgKi8KLSAgezYsMCxycixTLFMsMH0sCS8qIG9yICovCi0gIHs3LDAscnIsUyxTLDB9LAkvKiB4b3IgKi8KLSAgezQyLDAscnIsUyxTLDB9LAkvKiBub3QgKi8KLSAgezQwLDMscnIsUyxTLDB9LAkvKiBsZS5zICovCi0gIHs0MCw0LHJyLFMsUywwfSwJLyogbGUuZCAqLwotICB7NDEsMyxycixTLFMsMH0sCS8qIGx0LnMgKi8KLSAgezQxLDQscnIsUyxTLDB9LAkvKiBsdC5kICovCi0gIHs5LDMscnIsUyxTLDB9LAkvKiBhZGQucyAqLwotICB7OSw0LHJyLFMsUywwfSwJLyogYWRkLmQgKi8KLSAgezEwLDMscnIsUyxTLDB9LAkvKiBzdWIucyAqLwotICB7MTAsNCxycixTLFMsMH0sCS8qIHN1Yi5kICovCi0gIHszNywzLHJyLFMsUywwfSwJLyogZXEucyAqLwotICB7MzcsNCxycixTLFMsMH0sCS8qIGVxLmQgKi8KLSAgezQzLDYscnIsQSxBLDB9LAkvKiBuZWcuaCAqLwotICB7NDMsNyxycixBLEEsMH0sCS8qIG5lZy53ICovCi0gIHszLDMscnIsUyxTLDB9LAkvKiBtdWwucyAqLwotICB7Myw0LHJyLFMsUywwfSwJLyogbXVsLmQgKi8KLSAgezQsMyxycixTLFMsMH0sCS8qIGRpdi5zICovCi0gIHs0LDQscnIsUyxTLDB9LAkvKiBkaXYuZCAqLwotICB7OSw2LHJyLEEsQSwwfSwJLyogYWRkLmggKi8KLSAgezksNyxycixBLEEsMH0sCS8qIGFkZC53ICovCi0gIHs5LDYsbnIsQSwwLDB9LAkvKiBhZGQuaCAqLwotICB7OSw3LG5yLEEsMCwwfSwJLyogYWRkLncgKi8KLSAgezksNSxycixTLFMsMH0sCS8qIGFkZC5iICovCi0gIHs5LDYscnIsUyxTLDB9LAkvKiBhZGQuaCAqLwotICB7OSw3LHJyLFMsUywwfSwJLyogYWRkLncgKi8KLSAgezksOCxycixTLFMsMH0sCS8qIGFkZC5sICovCi0gIHsxMCw2LHJyLEEsQSwwfSwJLyogc3ViLmggKi8KLSAgezEwLDcscnIsQSxBLDB9LAkvKiBzdWIudyAqLwotICB7MTAsNixucixBLDAsMH0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LG5yLEEsMCwwfSwJLyogc3ViLncgKi8KLSAgezEwLDUscnIsUyxTLDB9LAkvKiBzdWIuYiAqLwotICB7MTAsNixycixTLFMsMH0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LHJyLFMsUywwfSwJLyogc3ViLncgKi8KLSAgezEwLDgscnIsUyxTLDB9LAkvKiBzdWIubCAqLwotICB7Myw2LHJyLEEsQSwwfSwJLyogbXVsLmggKi8KLSAgezMsNyxycixBLEEsMH0sCS8qIG11bC53ICovCi0gIHszLDYsbnIsQSwwLDB9LAkvKiBtdWwuaCAqLwotICB7Myw3LG5yLEEsMCwwfSwJLyogbXVsLncgKi8KLSAgezMsNSxycixTLFMsMH0sCS8qIG11bC5iICovCi0gIHszLDYscnIsUyxTLDB9LAkvKiBtdWwuaCAqLwotICB7Myw3LHJyLFMsUywwfSwJLyogbXVsLncgKi8KLSAgezMsOCxycixTLFMsMH0sCS8qIG11bC5sICovCi0gIHs0LDYscnIsQSxBLDB9LAkvKiBkaXYuaCAqLwotICB7NCw3LHJyLEEsQSwwfSwJLyogZGl2LncgKi8KLSAgezQsNixucixBLDAsMH0sCS8qIGRpdi5oICovCi0gIHs0LDcsbnIsQSwwLDB9LAkvKiBkaXYudyAqLwotICB7NCw1LHJyLFMsUywwfSwJLyogZGl2LmIgKi8KLSAgezQsNixycixTLFMsMH0sCS8qIGRpdi5oICovCi0gIHs0LDcscnIsUyxTLDB9LAkvKiBkaXYudyAqLwotICB7NCw4LHJyLFMsUywwfSwJLyogZGl2LmwgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDNbXSA9IHsKLSAgezMyLDMscnIsVixWLDB9LAkvKiBjdnRkLnMgKi8KLSAgezMxLDQscnIsVixWLDB9LAkvKiBjdnRzLmQgKi8KLSAgezMzLDQscnIsVixWLDB9LAkvKiBjdnRsLmQgKi8KLSAgezMyLDgscnIsVixWLDB9LAkvKiBjdnRkLmwgKi8KLSAgezAsMCxycmwsUyxTLFZNfSwJLyogbW92ICovCi0gIHswLDAscmxyLFMsVk0sU30sCS8qIG1vdiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7NDQsMCxycixTLFMsMH0sCS8qIGxvcCAqLwotICB7MzYsMCxycixWLFYsMH0sCS8qIHR6YyAqLwotICB7NDQsMCxycixWLFYsMH0sCS8qIGxvcCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7NDIsMCxycixWLFYsMH0sCS8qIG5vdCAqLwotICB7OCwwLHJyLFMsViwwfSwJLyogc2hmICovCi0gIHszNSwxLHJyLFYsViwwfSwJLyogcGxjLnQgKi8KLSAgezQ1LDIscnIsVixWLDB9LAkvKiBjcHJzLmYgKi8KLSAgezQ1LDEscnIsVixWLDB9LAkvKiBjcHJzLnQgKi8KLSAgezM3LDMscnIsVixWLDB9LAkvKiBlcS5zICovCi0gIHszNyw0LHJyLFYsViwwfSwJLyogZXEuZCAqLwotICB7NDMsMyxycixWLFYsMH0sCS8qIG5lZy5zICovCi0gIHs0Myw0LHJyLFYsViwwfSwJLyogbmVnLmQgKi8KLSAgezM3LDMscnIsUyxWLDB9LAkvKiBlcS5zICovCi0gIHszNyw0LHJyLFMsViwwfSwJLyogZXEuZCAqLwotICB7NDMsMyxycixTLFMsMH0sCS8qIG5lZy5zICovCi0gIHs0Myw0LHJyLFMsUywwfSwJLyogbmVnLmQgKi8KLSAgezQwLDMscnIsVixWLDB9LAkvKiBsZS5zICovCi0gIHs0MCw0LHJyLFYsViwwfSwJLyogbGUuZCAqLwotICB7NDEsMyxycixWLFYsMH0sCS8qIGx0LnMgKi8KLSAgezQxLDQscnIsVixWLDB9LAkvKiBsdC5kICovCi0gIHs0MCwzLHJyLFMsViwwfSwJLyogbGUucyAqLwotICB7NDAsNCxycixTLFYsMH0sCS8qIGxlLmQgKi8KLSAgezQxLDMscnIsUyxWLDB9LAkvKiBsdC5zICovCi0gIHs0MSw0LHJyLFMsViwwfSwJLyogbHQuZCAqLwotICB7MzcsNSxycixWLFYsMH0sCS8qIGVxLmIgKi8KLSAgezM3LDYscnIsVixWLDB9LAkvKiBlcS5oICovCi0gIHszNyw3LHJyLFYsViwwfSwJLyogZXEudyAqLwotICB7MzcsOCxycixWLFYsMH0sCS8qIGVxLmwgKi8KLSAgezM3LDUscnIsUyxWLDB9LAkvKiBlcS5iICovCi0gIHszNyw2LHJyLFMsViwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxycixTLFYsMH0sCS8qIGVxLncgKi8KLSAgezM3LDgscnIsUyxWLDB9LAkvKiBlcS5sICovCi0gIHs0MCw1LHJyLFYsViwwfSwJLyogbGUuYiAqLwotICB7NDAsNixycixWLFYsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcscnIsVixWLDB9LAkvKiBsZS53ICovCi0gIHs0MCw4LHJyLFYsViwwfSwJLyogbGUubCAqLwotICB7NDAsNSxycixTLFYsMH0sCS8qIGxlLmIgKi8KLSAgezQwLDYscnIsUyxWLDB9LAkvKiBsZS5oICovCi0gIHs0MCw3LHJyLFMsViwwfSwJLyogbGUudyAqLwotICB7NDAsOCxycixTLFYsMH0sCS8qIGxlLmwgKi8KLSAgezQxLDUscnIsVixWLDB9LAkvKiBsdC5iICovCi0gIHs0MSw2LHJyLFYsViwwfSwJLyogbHQuaCAqLwotICB7NDEsNyxycixWLFYsMH0sCS8qIGx0LncgKi8KLSAgezQxLDgscnIsVixWLDB9LAkvKiBsdC5sICovCi0gIHs0MSw1LHJyLFMsViwwfSwJLyogbHQuYiAqLwotICB7NDEsNixycixTLFYsMH0sCS8qIGx0LmggKi8KLSAgezQxLDcscnIsUyxWLDB9LAkvKiBsdC53ICovCi0gIHs0MSw4LHJyLFMsViwwfSwJLyogbHQubCAqLwotICB7NDMsNSxycixWLFYsMH0sCS8qIG5lZy5iICovCi0gIHs0Myw2LHJyLFYsViwwfSwJLyogbmVnLmggKi8KLSAgezQzLDcscnIsVixWLDB9LAkvKiBuZWcudyAqLwotICB7NDMsOCxycixWLFYsMH0sCS8qIG5lZy5sICovCi0gIHs0Myw1LHJyLFMsUywwfSwJLyogbmVnLmIgKi8KLSAgezQzLDYscnIsUyxTLDB9LAkvKiBuZWcuaCAqLwotICB7NDMsNyxycixTLFMsMH0sCS8qIG5lZy53ICovCi0gIHs0Myw4LHJyLFMsUywwfSwJLyogbmVnLmwgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDRbXSA9IHsKLSAgezQ2LDAsbm9wcywwLDAsMH0sCS8qIG5vcCAqLwotICB7NDcsMCxwY3JlbCwwLDAsMH0sCS8qIGJyICovCi0gIHs0OCwyLHBjcmVsLDAsMCwwfSwJLyogYnJpLmYgKi8KLSAgezQ4LDEscGNyZWwsMCwwLDB9LAkvKiBicmkudCAqLwotICB7NDksMixwY3JlbCwwLDAsMH0sCS8qIGJyYS5mICovCi0gIHs0OSwxLHBjcmVsLDAsMCwwfSwJLyogYnJhLnQgKi8KLSAgezUwLDIscGNyZWwsMCwwLDB9LAkvKiBicnMuZiAqLwotICB7NTAsMSxwY3JlbCwwLDAsMH0sCS8qIGJycy50ICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQ1W10gPSB7Ci0gIHs1MSw1LHJyLFYsViwwfSwJLyogbGR2aS5iICovCi0gIHs1MSw2LHJyLFYsViwwfSwJLyogbGR2aS5oICovCi0gIHs1MSw3LHJyLFYsViwwfSwJLyogbGR2aS53ICovCi0gIHs1MSw4LHJyLFYsViwwfSwJLyogbGR2aS5sICovCi0gIHsyOCwzLHJyLFYsViwwfSwJLyogY3Z0dy5zICovCi0gIHszMSw3LHJyLFYsViwwfSwJLyogY3Z0cy53ICovCi0gIHsyOCw4LHJyLFYsViwwfSwJLyogY3Z0dy5sICovCi0gIHszMyw3LHJyLFYsViwwfSwJLyogY3Z0bC53ICovCi0gIHs1Miw1LHJ4cixWLFYsMH0sCS8qIHN0dmkuYiAqLwotICB7NTIsNixyeHIsVixWLDB9LAkvKiBzdHZpLmggKi8KLSAgezUyLDcscnhyLFYsViwwfSwJLyogc3R2aS53ICovCi0gIHs1Miw4LHJ4cixWLFYsMH0sCS8qIHN0dmkubCAqLwotICB7NTIsNSxyeHIsUyxWLDB9LAkvKiBzdHZpLmIgKi8KLSAgezUyLDYscnhyLFMsViwwfSwJLyogc3R2aS5oICovCi0gIHs1Miw3LHJ4cixTLFYsMH0sCS8qIHN0dmkudyAqLwotICB7NTIsOCxyeHIsUyxWLDB9LAkvKiBzdHZpLmwgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDZbXSA9IHsKLSAgezUzLDAscixBLDAsMH0sCS8qIGxkc2RyICovCi0gIHs1NCwwLHIsQSwwLDB9LAkvKiBsZGtkciAqLwotICB7NTUsMyxyLFMsMCwwfSwJLyogbG4ucyAqLwotICB7NTUsNCxyLFMsMCwwfSwJLyogbG4uZCAqLwotICB7NTYsMCxub3BzLDAsMCwwfSwJLyogcGF0dSAqLwotICB7NTcsMCxyLEEsMCwwfSwJLyogcGF0ZSAqLwotICB7NTgsMCxub3BzLDAsMCwwfSwJLyogcGljaCAqLwotICB7NTksMCxub3BzLDAsMCwwfSwJLyogcGxjaCAqLwotICB7MCwwLGxyLFBTVyxBLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsQSxQU1csMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFBDLEEsMH0sCS8qIG1vdiAqLwotICB7NjAsMCxyLFMsMCwwfSwJLyogaWRsZSAqLwotICB7MCwwLGxyLElUUixTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsUyxJVFIsMH0sCS8qIG1vdiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLHJ4bCxTLElUU1IsMH0sCS8qIG1vdiAqLwotICB7NjEsMCxub3BzLDAsMCwwfSwJLyogcnRucSAqLwotICB7NjIsMCxub3BzLDAsMCwwfSwJLyogY2ZvcmsgKi8KLSAgezYzLDAsbm9wcywwLDAsMH0sCS8qIHJ0biAqLwotICB7NjQsMCxub3BzLDAsMCwwfSwJLyogd2ZvcmsgKi8KLSAgezY1LDAsbm9wcywwLDAsMH0sCS8qIGpvaW4gKi8KLSAgezY2LDAsbm9wcywwLDAsMH0sCS8qIHJ0bmMgKi8KLSAgezY3LDMscixTLDAsMH0sCS8qIGV4cC5zICovCi0gIHs2Nyw0LHIsUywwLDB9LAkvKiBleHAuZCAqLwotICB7NjgsMyxyLFMsMCwwfSwJLyogc2luLnMgKi8KLSAgezY4LDQscixTLDAsMH0sCS8qIHNpbi5kICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs2OSwzLHIsUywwLDB9LAkvKiBjb3MucyAqLwotICB7NjksNCxyLFMsMCwwfSwJLyogY29zLmQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezcwLDcscixBLDAsMH0sCS8qIHBzaC53ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs3MSw3LHIsQSwwLDB9LAkvKiBwb3AudyAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7NzAsNyxyLFMsMCwwfSwJLyogcHNoLncgKi8KLSAgezcwLDgscixTLDAsMH0sCS8qIHBzaC5sICovCi0gIHs3MSw3LHIsUywwLDB9LAkvKiBwb3AudyAqLwotICB7NzEsOCxyLFMsMCwwfSwJLyogcG9wLmwgKi8KLSAgezcyLDAsbm9wcywwLDAsMH0sCS8qIGVuaSAqLwotICB7NzMsMCxub3BzLDAsMCwwfSwJLyogZHNpICovCi0gIHs3NCwwLG5vcHMsMCwwLDB9LAkvKiBia3B0ICovCi0gIHs3NSwwLG5vcHMsMCwwLDB9LAkvKiBtc3luYyAqLwotICB7NzYsMCxyLFMsMCwwfSwJLyogbXNraSAqLwotICB7NzcsMCxyLFMsMCwwfSwJLyogeG10aSAqLwotICB7MCwwLHJ4bCxTLFZWLDB9LAkvKiBtb3YgKi8KLSAgezc4LDAsbm9wcywwLDAsMH0sCS8qIHRzdHZ2ICovCi0gIHswLDAsbHIsVlMsQSwwfSwJLyogbW92ICovCi0gIHswLDAscnhsLEEsVlMsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFZMLEEsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxBLFZMLDB9LAkvKiBtb3YgKi8KLSAgezAsNyxscixWUyxTLDB9LAkvKiBtb3YudyAqLwotICB7MCw3LHJ4bCxTLFZTLDB9LAkvKiBtb3YudyAqLwotICB7MCw3LGxyLFZMLFMsMH0sCS8qIG1vdi53ICovCi0gIHswLDcscnhsLFMsVkwsMH0sCS8qIG1vdi53ICovCi0gIHs3OSwwLHIsQSwwLDB9LAkvKiBkaWFnICovCi0gIHs4MCwwLG5vcHMsMCwwLDB9LAkvKiBwYmtwdCAqLwotICB7ODEsMyxyLFMsMCwwfSwJLyogc3FydC5zICovCi0gIHs4MSw0LHIsUywwLDB9LAkvKiBzcXJ0LmQgKi8KLSAgezgyLDAsbm9wcywwLDAsMH0sCS8qIGNhc3IgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezgzLDMscixTLDAsMH0sCS8qIGF0YW4ucyAqLwotICB7ODMsNCxyLFMsMCwwfSwJLyogYXRhbi5kICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQ3W10gPSB7Ci0gIHs4NCw1LHIsViwwLDB9LAkvKiBzdW0uYiAqLwotICB7ODQsNixyLFYsMCwwfSwJLyogc3VtLmggKi8KLSAgezg0LDcscixWLDAsMH0sCS8qIHN1bS53ICovCi0gIHs4NCw4LHIsViwwLDB9LAkvKiBzdW0ubCAqLwotICB7ODUsMCxyLFYsMCwwfSwJLyogYWxsICovCi0gIHs4NiwwLHIsViwwLDB9LAkvKiBhbnkgKi8KLSAgezg3LDAscixWLDAsMH0sCS8qIHBhcml0eSAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7ODgsNSxyLFYsMCwwfSwJLyogbWF4LmIgKi8KLSAgezg4LDYscixWLDAsMH0sCS8qIG1heC5oICovCi0gIHs4OCw3LHIsViwwLDB9LAkvKiBtYXgudyAqLwotICB7ODgsOCxyLFYsMCwwfSwJLyogbWF4LmwgKi8KLSAgezg5LDUscixWLDAsMH0sCS8qIG1pbi5iICovCi0gIHs4OSw2LHIsViwwLDB9LAkvKiBtaW4uaCAqLwotICB7ODksNyxyLFYsMCwwfSwJLyogbWluLncgKi8KLSAgezg5LDgscixWLDAsMH0sCS8qIG1pbi5sICovCi0gIHs4NCwzLHIsViwwLDB9LAkvKiBzdW0ucyAqLwotICB7ODQsNCxyLFYsMCwwfSwJLyogc3VtLmQgKi8KLSAgezkwLDMscixWLDAsMH0sCS8qIHByb2QucyAqLwotICB7OTAsNCxyLFYsMCwwfSwJLyogcHJvZC5kICovCi0gIHs4OCwzLHIsViwwLDB9LAkvKiBtYXgucyAqLwotICB7ODgsNCxyLFYsMCwwfSwJLyogbWF4LmQgKi8KLSAgezg5LDMscixWLDAsMH0sCS8qIG1pbi5zICovCi0gIHs4OSw0LHIsViwwLDB9LAkvKiBtaW4uZCAqLwotICB7OTAsNSxyLFYsMCwwfSwJLyogcHJvZC5iICovCi0gIHs5MCw2LHIsViwwLDB9LAkvKiBwcm9kLmggKi8KLSAgezkwLDcscixWLDAsMH0sCS8qIHByb2QudyAqLwotICB7OTAsOCxyLFYsMCwwfSwJLyogcHJvZC5sICovCi0gIHszNSwyLGxyLFZNLFMsMH0sCS8qIHBsYy5mICovCi0gIHszNSwxLGxyLFZNLFMsMH0sCS8qIHBsYy50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXR4W10gPSB7Ci0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQxYVtdID0gewotICB7OTEsMCxpbXIsQSwwLDB9LAkvKiBoYWx0ICovCi0gIHs5MiwwLGE0LDAsMCwwfSwJLyogc3lzYyAqLwotICB7MTgsNixpbXIsQSwwLDB9LAkvKiBsZC5oICovCi0gIHsxOCw3LGltcixBLDAsMH0sCS8qIGxkLncgKi8KLSAgezUsMCxpbXIsQSwwLDB9LAkvKiBhbmQgKi8KLSAgezYsMCxpbXIsQSwwLDB9LAkvKiBvciAqLwotICB7NywwLGltcixBLDAsMH0sCS8qIHhvciAqLwotICB7OCwwLGltcixBLDAsMH0sCS8qIHNoZiAqLwotICB7OSw2LGltcixBLDAsMH0sCS8qIGFkZC5oICovCi0gIHs5LDcsaW1yLEEsMCwwfSwJLyogYWRkLncgKi8KLSAgezEwLDYsaW1yLEEsMCwwfSwJLyogc3ViLmggKi8KLSAgezEwLDcsaW1yLEEsMCwwfSwJLyogc3ViLncgKi8KLSAgezMsNixpbXIsQSwwLDB9LAkvKiBtdWwuaCAqLwotICB7Myw3LGltcixBLDAsMH0sCS8qIG11bC53ICovCi0gIHs0LDYsaW1yLEEsMCwwfSwJLyogZGl2LmggKi8KLSAgezQsNyxpbXIsQSwwLDB9LAkvKiBkaXYudyAqLwotICB7MTgsNyxpbWwsVkwsMCwwfSwJLyogbGQudyAqLwotICB7MTgsNyxpbWwsVlMsMCwwfSwJLyogbGQudyAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7OCw3LGltcixTLDAsMH0sCS8qIHNoZi53ICovCi0gIHs5MywwLGE1LDAsMCwwfSwJLyogdHJhcCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MzcsNixpbXIsQSwwLDB9LAkvKiBlcS5oICovCi0gIHszNyw3LGltcixBLDAsMH0sCS8qIGVxLncgKi8KLSAgezM4LDYsaW1yLEEsMCwwfSwJLyogbGV1LmggKi8KLSAgezM4LDcsaW1yLEEsMCwwfSwJLyogbGV1LncgKi8KLSAgezM5LDYsaW1yLEEsMCwwfSwJLyogbHR1LmggKi8KLSAgezM5LDcsaW1yLEEsMCwwfSwJLyogbHR1LncgKi8KLSAgezQwLDYsaW1yLEEsMCwwfSwJLyogbGUuaCAqLwotICB7NDAsNyxpbXIsQSwwLDB9LAkvKiBsZS53ICovCi0gIHs0MSw2LGltcixBLDAsMH0sCS8qIGx0LmggKi8KLSAgezQxLDcsaW1yLEEsMCwwfSwJLyogbHQudyAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0MWJbXSA9IHsKLSAgezE4LDQsaW1yLFMsMCwwfSwJLyogbGQuZCAqLwotICB7MTgsMTAsaW1yLFMsMCwwfSwJLyogbGQudSAqLwotICB7MTgsOCxpbXIsUywwLDB9LAkvKiBsZC5sICovCi0gIHsxOCw3LGltcixTLDAsMH0sCS8qIGxkLncgKi8KLSAgezUsMCxpbXIsUywwLDB9LAkvKiBhbmQgKi8KLSAgezYsMCxpbXIsUywwLDB9LAkvKiBvciAqLwotICB7NywwLGltcixTLDAsMH0sCS8qIHhvciAqLwotICB7OCwwLGltcixTLDAsMH0sCS8qIHNoZiAqLwotICB7OSw2LGltcixTLDAsMH0sCS8qIGFkZC5oICovCi0gIHs5LDcsaW1yLFMsMCwwfSwJLyogYWRkLncgKi8KLSAgezEwLDYsaW1yLFMsMCwwfSwJLyogc3ViLmggKi8KLSAgezEwLDcsaW1yLFMsMCwwfSwJLyogc3ViLncgKi8KLSAgezMsNixpbXIsUywwLDB9LAkvKiBtdWwuaCAqLwotICB7Myw3LGltcixTLDAsMH0sCS8qIG11bC53ICovCi0gIHs0LDYsaW1yLFMsMCwwfSwJLyogZGl2LmggKi8KLSAgezQsNyxpbXIsUywwLDB9LAkvKiBkaXYudyAqLwotICB7OSwzLGltcixTLDAsMH0sCS8qIGFkZC5zICovCi0gIHsxMCwzLGltcixTLDAsMH0sCS8qIHN1Yi5zICovCi0gIHszLDMsaW1yLFMsMCwwfSwJLyogbXVsLnMgKi8KLSAgezQsMyxpbXIsUywwLDB9LAkvKiBkaXYucyAqLwotICB7NDAsMyxpbXIsUywwLDB9LAkvKiBsZS5zICovCi0gIHs0MSwzLGltcixTLDAsMH0sCS8qIGx0LnMgKi8KLSAgezM3LDYsaW1yLFMsMCwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxpbXIsUywwLDB9LAkvKiBlcS53ICovCi0gIHszOCw2LGltcixTLDAsMH0sCS8qIGxldS5oICovCi0gIHszOCw3LGltcixTLDAsMH0sCS8qIGxldS53ICovCi0gIHszOSw2LGltcixTLDAsMH0sCS8qIGx0dS5oICovCi0gIHszOSw3LGltcixTLDAsMH0sCS8qIGx0dS53ICovCi0gIHs0MCw2LGltcixTLDAsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcsaW1yLFMsMCwwfSwJLyogbGUudyAqLwotICB7NDEsNixpbXIsUywwLDB9LAkvKiBsdC5oICovCi0gIHs0MSw3LGltcixTLDAsMH0sCS8qIGx0LncgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUwX2Zvcm1hdDBbXSA9IHsKLSAgezEwLDMscnJyLFMsVixWfSwJLyogc3ViLnMgKi8KLSAgezEwLDQscnJyLFMsVixWfSwJLyogc3ViLmQgKi8KLSAgezQsMyxycnIsUyxWLFZ9LAkvKiBkaXYucyAqLwotICB7NCw0LHJycixTLFYsVn0sCS8qIGRpdi5kICovCi0gIHsxMCwxMSxycnIsUyxWLFZ9LAkvKiBzdWIucy5mICovCi0gIHsxMCwxMixycnIsUyxWLFZ9LAkvKiBzdWIuZC5mICovCi0gIHs0LDExLHJycixTLFYsVn0sCS8qIGRpdi5zLmYgKi8KLSAgezQsMTIscnJyLFMsVixWfSwJLyogZGl2LmQuZiAqLwotICB7MywxMSxycnIsVixWLFZ9LAkvKiBtdWwucy5mICovCi0gIHszLDEyLHJycixWLFYsVn0sCS8qIG11bC5kLmYgKi8KLSAgezQsMTEscnJyLFYsVixWfSwJLyogZGl2LnMuZiAqLwotICB7NCwxMixycnIsVixWLFZ9LAkvKiBkaXYuZC5mICovCi0gIHszLDExLHJycixWLFMsVn0sCS8qIG11bC5zLmYgKi8KLSAgezMsMTIscnJyLFYsUyxWfSwJLyogbXVsLmQuZiAqLwotICB7NCwxMSxycnIsVixTLFZ9LAkvKiBkaXYucy5mICovCi0gIHs0LDEyLHJycixWLFMsVn0sCS8qIGRpdi5kLmYgKi8KLSAgezUsMixycnIsVixWLFZ9LAkvKiBhbmQuZiAqLwotICB7NiwyLHJycixWLFYsVn0sCS8qIG9yLmYgKi8KLSAgezcsMixycnIsVixWLFZ9LAkvKiB4b3IuZiAqLwotICB7OCwyLHJycixWLFYsVn0sCS8qIHNoZi5mICovCi0gIHs1LDIscnJyLFYsUyxWfSwJLyogYW5kLmYgKi8KLSAgezYsMixycnIsVixTLFZ9LAkvKiBvci5mICovCi0gIHs3LDIscnJyLFYsUyxWfSwJLyogeG9yLmYgKi8KLSAgezgsMixycnIsVixTLFZ9LAkvKiBzaGYuZiAqLwotICB7OSwxMSxycnIsVixWLFZ9LAkvKiBhZGQucy5mICovCi0gIHs5LDEyLHJycixWLFYsVn0sCS8qIGFkZC5kLmYgKi8KLSAgezEwLDExLHJycixWLFYsVn0sCS8qIHN1Yi5zLmYgKi8KLSAgezEwLDEyLHJycixWLFYsVn0sCS8qIHN1Yi5kLmYgKi8KLSAgezksMTEscnJyLFYsUyxWfSwJLyogYWRkLnMuZiAqLwotICB7OSwxMixycnIsVixTLFZ9LAkvKiBhZGQuZC5mICovCi0gIHsxMCwxMSxycnIsVixTLFZ9LAkvKiBzdWIucy5mICovCi0gIHsxMCwxMixycnIsVixTLFZ9LAkvKiBzdWIuZC5mICovCi0gIHs5LDEzLHJycixWLFYsVn0sCS8qIGFkZC5iLmYgKi8KLSAgezksMTQscnJyLFYsVixWfSwJLyogYWRkLmguZiAqLwotICB7OSwxNSxycnIsVixWLFZ9LAkvKiBhZGQudy5mICovCi0gIHs5LDE2LHJycixWLFYsVn0sCS8qIGFkZC5sLmYgKi8KLSAgezksMTMscnJyLFYsUyxWfSwJLyogYWRkLmIuZiAqLwotICB7OSwxNCxycnIsVixTLFZ9LAkvKiBhZGQuaC5mICovCi0gIHs5LDE1LHJycixWLFMsVn0sCS8qIGFkZC53LmYgKi8KLSAgezksMTYscnJyLFYsUyxWfSwJLyogYWRkLmwuZiAqLwotICB7MTAsMTMscnJyLFYsVixWfSwJLyogc3ViLmIuZiAqLwotICB7MTAsMTQscnJyLFYsVixWfSwJLyogc3ViLmguZiAqLwotICB7MTAsMTUscnJyLFYsVixWfSwJLyogc3ViLncuZiAqLwotICB7MTAsMTYscnJyLFYsVixWfSwJLyogc3ViLmwuZiAqLwotICB7MTAsMTMscnJyLFYsUyxWfSwJLyogc3ViLmIuZiAqLwotICB7MTAsMTQscnJyLFYsUyxWfSwJLyogc3ViLmguZiAqLwotICB7MTAsMTUscnJyLFYsUyxWfSwJLyogc3ViLncuZiAqLwotICB7MTAsMTYscnJyLFYsUyxWfSwJLyogc3ViLmwuZiAqLwotICB7MywxMyxycnIsVixWLFZ9LAkvKiBtdWwuYi5mICovCi0gIHszLDE0LHJycixWLFYsVn0sCS8qIG11bC5oLmYgKi8KLSAgezMsMTUscnJyLFYsVixWfSwJLyogbXVsLncuZiAqLwotICB7MywxNixycnIsVixWLFZ9LAkvKiBtdWwubC5mICovCi0gIHszLDEzLHJycixWLFMsVn0sCS8qIG11bC5iLmYgKi8KLSAgezMsMTQscnJyLFYsUyxWfSwJLyogbXVsLmguZiAqLwotICB7MywxNSxycnIsVixTLFZ9LAkvKiBtdWwudy5mICovCi0gIHszLDE2LHJycixWLFMsVn0sCS8qIG11bC5sLmYgKi8KLSAgezQsMTMscnJyLFYsVixWfSwJLyogZGl2LmIuZiAqLwotICB7NCwxNCxycnIsVixWLFZ9LAkvKiBkaXYuaC5mICovCi0gIHs0LDE1LHJycixWLFYsVn0sCS8qIGRpdi53LmYgKi8KLSAgezQsMTYscnJyLFYsVixWfSwJLyogZGl2LmwuZiAqLwotICB7NCwxMyxycnIsVixTLFZ9LAkvKiBkaXYuYi5mICovCi0gIHs0LDE0LHJycixWLFMsVn0sCS8qIGRpdi5oLmYgKi8KLSAgezQsMTUscnJyLFYsUyxWfSwJLyogZGl2LncuZiAqLwotICB7NCwxNixycnIsVixTLFZ9LAkvKiBkaXYubC5mICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQxW10gPSB7Ci0gIHswLDAsMCwwLDAsMH0sCi0gIHs5NCwwLGEzLDAsMCwwfSwJLyogdHN0ICovCi0gIHs5NSwwLGEzLDAsMCwwfSwJLyogbGNrICovCi0gIHs5NiwwLGEzLDAsMCwwfSwJLyogdWxrICovCi0gIHsxNywwLGExcixTLDAsMH0sCS8qIGxkZWEgKi8KLSAgezk3LDAsYTFyLEEsMCwwfSwJLyogc3Bhd24gKi8KLSAgezk4LDAsYTFyLEEsMCwwfSwJLyogbGRjbXIgKi8KLSAgezk5LDAsYTJyLEEsMCwwfSwJLyogc3RjbXIgKi8KLSAgezEwMCwwLGExcixBLDAsMH0sCS8qIHBvcHIgKi8KLSAgezEwMSwwLGEycixBLDAsMH0sCS8qIHBzaHIgKi8KLSAgezEwMiw3LGExcixBLDAsMH0sCS8qIHJjdnIudyAqLwotICB7MTAzLDcsYTJyLEEsMCwwfSwJLyogbWF0bS53ICovCi0gIHsxMDQsNyxhMnIsQSwwLDB9LAkvKiBzbmRyLncgKi8KLSAgezEwNCw4LGEycixTLDAsMH0sCS8qIHNuZHIubCAqLwotICB7MTAyLDgsYTFyLFMsMCwwfSwJLyogcmN2ci5sICovCi0gIHsxMDMsOCxhMnIsUywwLDB9LAkvKiBtYXRtLmwgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezEwNSw3LGEycixBLDAsMH0sCS8qIHB1dHIudyAqLwotICB7MTA1LDgsYTJyLFMsMCwwfSwJLyogcHV0ci5sICovCi0gIHsxMDYsNyxhMXIsQSwwLDB9LAkvKiBnZXRyLncgKi8KLSAgezEwNiw4LGExcixTLDAsMH0sCS8qIGdldHIubCAqLwotICB7MjYsMTMsYTJyLFMsMCwwfSwJLyogc3RlLmIuZiAqLwotICB7MjYsMTQsYTJyLFMsMCwwfSwJLyogc3RlLmguZiAqLwotICB7MjYsMTUsYTJyLFMsMCwwfSwJLyogc3RlLncuZiAqLwotICB7MjYsMTYsYTJyLFMsMCwwfSwJLyogc3RlLmwuZiAqLwotICB7MTA3LDcsYTJyLEEsMCwwfSwJLyogbWF0ci53ICovCi0gIHsxMDgsNyxhMnIsQSwwLDB9LAkvKiBtYXQudyAqLwotICB7MTA5LDcsYTFyLEEsMCwwfSwJLyogZ2V0LncgKi8KLSAgezExMCw3LGExcixBLDAsMH0sCS8qIHJjdi53ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMTEsNyxhMXIsQSwwLDB9LAkvKiBpbmMudyAqLwotICB7MTEyLDcsYTJyLEEsMCwwfSwJLyogcHV0LncgKi8KLSAgezExMyw3LGEycixBLDAsMH0sCS8qIHNuZC53ICovCi0gIHsxMDcsOCxhMnIsUywwLDB9LAkvKiBtYXRyLmwgKi8KLSAgezEwOCw4LGEycixTLDAsMH0sCS8qIG1hdC5sICovCi0gIHsxMDksOCxhMXIsUywwLDB9LAkvKiBnZXQubCAqLwotICB7MTEwLDgsYTFyLFMsMCwwfSwJLyogcmN2LmwgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezExMSw4LGExcixTLDAsMH0sCS8qIGluYy5sICovCi0gIHsxMTIsOCxhMnIsUywwLDB9LAkvKiBwdXQubCAqLwotICB7MTEzLDgsYTJyLFMsMCwwfSwJLyogc25kLmwgKi8KLSAgezE4LDEzLGExcixWLDAsMH0sCS8qIGxkLmIuZiAqLwotICB7MTgsMTQsYTFyLFYsMCwwfSwJLyogbGQuaC5mICovCi0gIHsxOCwxNSxhMXIsViwwLDB9LAkvKiBsZC53LmYgKi8KLSAgezE4LDE2LGExcixWLDAsMH0sCS8qIGxkLmwuZiAqLwotICB7MjEsMTMsYTJyLFYsMCwwfSwJLyogc3QuYi5mICovCi0gIHsyMSwxNCxhMnIsViwwLDB9LAkvKiBzdC5oLmYgKi8KLSAgezIxLDE1LGEycixWLDAsMH0sCS8qIHN0LncuZiAqLwotICB7MjEsMTYsYTJyLFYsMCwwfSwJLyogc3QubC5mICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQyW10gPSB7Ci0gIHsyOCw1LHJyLFYsViwwfSwJLyogY3Z0dy5iICovCi0gIHsyOCw2LHJyLFYsViwwfSwJLyogY3Z0dy5oICovCi0gIHsyOSw3LHJyLFYsViwwfSwJLyogY3Z0Yi53ICovCi0gIHszMCw3LHJyLFYsViwwfSwJLyogY3Z0aC53ICovCi0gIHsyOCwxMyxycixWLFYsMH0sCS8qIGN2dHcuYi5mICovCi0gIHsyOCwxNCxycixWLFYsMH0sCS8qIGN2dHcuaC5mICovCi0gIHsyOSwxNSxycixWLFYsMH0sCS8qIGN2dGIudy5mICovCi0gIHszMCwxNSxycixWLFYsMH0sCS8qIGN2dGgudy5mICovCi0gIHszMSw4LHJyLFYsViwwfSwJLyogY3Z0cy5sICovCi0gIHszMiw3LHJyLFYsViwwfSwJLyogY3Z0ZC53ICovCi0gIHszMywzLHJyLFYsViwwfSwJLyogY3Z0bC5zICovCi0gIHsyOCw0LHJyLFYsViwwfSwJLyogY3Z0dy5kICovCi0gIHszMSwxNixycixWLFYsMH0sCS8qIGN2dHMubC5mICovCi0gIHszMiwxNSxycixWLFYsMH0sCS8qIGN2dGQudy5mICovCi0gIHszMywxMSxycixWLFYsMH0sCS8qIGN2dGwucy5mICovCi0gIHsyOCwxMixycixWLFYsMH0sCS8qIGN2dHcuZC5mICovCi0gIHsxMTQsMCxycixTLFMsMH0sCS8qIGVuYWwgKi8KLSAgezgsNyxycixTLFMsMH0sCS8qIHNoZi53ICovCi0gIHsxMTUsMCxycixTLFMsMH0sCS8qIGVuYWcgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezI4LDQscnIsUyxTLDB9LAkvKiBjdnR3LmQgKi8KLSAgezMyLDcscnIsUyxTLDB9LAkvKiBjdnRkLncgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezExNiwzLHJyLFMsUywwfSwJLyogZnJpbnQucyAqLwotICB7MTE2LDQscnIsUyxTLDB9LAkvKiBmcmludC5kICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMTYsMyxycixWLFYsMH0sCS8qIGZyaW50LnMgKi8KLSAgezExNiw0LHJyLFYsViwwfSwJLyogZnJpbnQuZCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MTE2LDExLHJyLFYsViwwfSwJLyogZnJpbnQucy5mICovCi0gIHsxMTYsMTIscnIsVixWLDB9LAkvKiBmcmludC5kLmYgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezgxLDMscnIsVixWLDB9LAkvKiBzcXJ0LnMgKi8KLSAgezgxLDQscnIsVixWLDB9LAkvKiBzcXJ0LmQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezgxLDExLHJyLFYsViwwfSwJLyogc3FydC5zLmYgKi8KLSAgezgxLDEyLHJyLFYsViwwfSwJLyogc3FydC5kLmYgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUwX2Zvcm1hdDNbXSA9IHsKLSAgezMyLDExLHJyLFYsViwwfSwJLyogY3Z0ZC5zLmYgKi8KLSAgezMxLDEyLHJyLFYsViwwfSwJLyogY3Z0cy5kLmYgKi8KLSAgezMzLDEyLHJyLFYsViwwfSwJLyogY3Z0bC5kLmYgKi8KLSAgezMyLDE2LHJyLFYsViwwfSwJLyogY3Z0ZC5sLmYgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezM2LDIscnIsVixWLDB9LAkvKiB0emMuZiAqLwotICB7NDQsMixycixWLFYsMH0sCS8qIGxvcC5mICovCi0gIHsxMTcsMixycixWLFYsMH0sCS8qIHhwbmQuZiAqLwotICB7NDIsMixycixWLFYsMH0sCS8qIG5vdC5mICovCi0gIHs4LDIscnIsUyxWLDB9LAkvKiBzaGYuZiAqLwotICB7MzUsMTcscnIsVixWLDB9LAkvKiBwbGMudC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHszNywxMSxycixWLFYsMH0sCS8qIGVxLnMuZiAqLwotICB7MzcsMTIscnIsVixWLDB9LAkvKiBlcS5kLmYgKi8KLSAgezQzLDExLHJyLFYsViwwfSwJLyogbmVnLnMuZiAqLwotICB7NDMsMTIscnIsVixWLDB9LAkvKiBuZWcuZC5mICovCi0gIHszNywxMSxycixTLFYsMH0sCS8qIGVxLnMuZiAqLwotICB7MzcsMTIscnIsUyxWLDB9LAkvKiBlcS5kLmYgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezQwLDExLHJyLFYsViwwfSwJLyogbGUucy5mICovCi0gIHs0MCwxMixycixWLFYsMH0sCS8qIGxlLmQuZiAqLwotICB7NDEsMTEscnIsVixWLDB9LAkvKiBsdC5zLmYgKi8KLSAgezQxLDEyLHJyLFYsViwwfSwJLyogbHQuZC5mICovCi0gIHs0MCwxMSxycixTLFYsMH0sCS8qIGxlLnMuZiAqLwotICB7NDAsMTIscnIsUyxWLDB9LAkvKiBsZS5kLmYgKi8KLSAgezQxLDExLHJyLFMsViwwfSwJLyogbHQucy5mICovCi0gIHs0MSwxMixycixTLFYsMH0sCS8qIGx0LmQuZiAqLwotICB7MzcsMTMscnIsVixWLDB9LAkvKiBlcS5iLmYgKi8KLSAgezM3LDE0LHJyLFYsViwwfSwJLyogZXEuaC5mICovCi0gIHszNywxNSxycixWLFYsMH0sCS8qIGVxLncuZiAqLwotICB7MzcsMTYscnIsVixWLDB9LAkvKiBlcS5sLmYgKi8KLSAgezM3LDEzLHJyLFMsViwwfSwJLyogZXEuYi5mICovCi0gIHszNywxNCxycixTLFYsMH0sCS8qIGVxLmguZiAqLwotICB7MzcsMTUscnIsUyxWLDB9LAkvKiBlcS53LmYgKi8KLSAgezM3LDE2LHJyLFMsViwwfSwJLyogZXEubC5mICovCi0gIHs0MCwxMyxycixWLFYsMH0sCS8qIGxlLmIuZiAqLwotICB7NDAsMTQscnIsVixWLDB9LAkvKiBsZS5oLmYgKi8KLSAgezQwLDE1LHJyLFYsViwwfSwJLyogbGUudy5mICovCi0gIHs0MCwxNixycixWLFYsMH0sCS8qIGxlLmwuZiAqLwotICB7NDAsMTMscnIsUyxWLDB9LAkvKiBsZS5iLmYgKi8KLSAgezQwLDE0LHJyLFMsViwwfSwJLyogbGUuaC5mICovCi0gIHs0MCwxNSxycixTLFYsMH0sCS8qIGxlLncuZiAqLwotICB7NDAsMTYscnIsUyxWLDB9LAkvKiBsZS5sLmYgKi8KLSAgezQxLDEzLHJyLFYsViwwfSwJLyogbHQuYi5mICovCi0gIHs0MSwxNCxycixWLFYsMH0sCS8qIGx0LmguZiAqLwotICB7NDEsMTUscnIsVixWLDB9LAkvKiBsdC53LmYgKi8KLSAgezQxLDE2LHJyLFYsViwwfSwJLyogbHQubC5mICovCi0gIHs0MSwxMyxycixTLFYsMH0sCS8qIGx0LmIuZiAqLwotICB7NDEsMTQscnIsUyxWLDB9LAkvKiBsdC5oLmYgKi8KLSAgezQxLDE1LHJyLFMsViwwfSwJLyogbHQudy5mICovCi0gIHs0MSwxNixycixTLFYsMH0sCS8qIGx0LmwuZiAqLwotICB7NDMsMTMscnIsVixWLDB9LAkvKiBuZWcuYi5mICovCi0gIHs0MywxNCxycixWLFYsMH0sCS8qIG5lZy5oLmYgKi8KLSAgezQzLDE1LHJyLFYsViwwfSwJLyogbmVnLncuZiAqLwotICB7NDMsMTYscnIsVixWLDB9LAkvKiBuZWcubC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQ0W10gPSB7Ci0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQ1W10gPSB7Ci0gIHs1MSwxMyxycixWLFYsMH0sCS8qIGxkdmkuYi5mICovCi0gIHs1MSwxNCxycixWLFYsMH0sCS8qIGxkdmkuaC5mICovCi0gIHs1MSwxNSxycixWLFYsMH0sCS8qIGxkdmkudy5mICovCi0gIHs1MSwxNixycixWLFYsMH0sCS8qIGxkdmkubC5mICovCi0gIHsyOCwxMSxycixWLFYsMH0sCS8qIGN2dHcucy5mICovCi0gIHszMSwxNSxycixWLFYsMH0sCS8qIGN2dHMudy5mICovCi0gIHsyOCwxNixycixWLFYsMH0sCS8qIGN2dHcubC5mICovCi0gIHszMywxNSxycixWLFYsMH0sCS8qIGN2dGwudy5mICovCi0gIHs1MiwxMyxyeHIsVixWLDB9LAkvKiBzdHZpLmIuZiAqLwotICB7NTIsMTQscnhyLFYsViwwfSwJLyogc3R2aS5oLmYgKi8KLSAgezUyLDE1LHJ4cixWLFYsMH0sCS8qIHN0dmkudy5mICovCi0gIHs1MiwxNixyeHIsVixWLDB9LAkvKiBzdHZpLmwuZiAqLwotICB7NTIsMTMscnhyLFMsViwwfSwJLyogc3R2aS5iLmYgKi8KLSAgezUyLDE0LHJ4cixTLFYsMH0sCS8qIHN0dmkuaC5mICovCi0gIHs1MiwxNSxyeHIsUyxWLDB9LAkvKiBzdHZpLncuZiAqLwotICB7NTIsMTYscnhyLFMsViwwfSwJLyogc3R2aS5sLmYgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUwX2Zvcm1hdDZbXSA9IHsKLSAgezAsMCxyeGwsUyxDSVIsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLENJUixTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixUT0MsUywwfSwJLyogbW92ICovCi0gIHswLDAsbHIsQ1BVSUQsUywwfSwJLyogbW92ICovCi0gIHswLDAscnhsLFMsVFRSLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixUVFIsUywwfSwJLyogbW92ICovCi0gIHsxMTgsMCxub3BzLDAsMCwwfSwJLyogY3Ryc2wgKi8KLSAgezExOSwwLG5vcHMsMCwwLDB9LAkvKiBjdHJzZyAqLwotICB7MCwwLHJ4bCxTLFZNVSwwfSwJLyogbW92ICovCi0gIHswLDAsbHIsVk1VLFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxTLFZNTCwwfSwJLyogbW92ICovCi0gIHswLDAsbHIsVk1MLFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxTLElDUiwwfSwJLyogbW92ICovCi0gIHswLDAsbHIsSUNSLFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxTLFRDUFUsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFRDUFUsUywwfSwJLyogbW92ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMjAsMCxub3BzLDAsMCwwfSwJLyogc3RvcCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLHJ4bCxTLFRJRCwwfSwJLyogbW92ICovCi0gIHswLDAsbHIsVElELFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0N1tdID0gewotICB7ODQsMTMscixWLDAsMH0sCS8qIHN1bS5iLmYgKi8KLSAgezg0LDE0LHIsViwwLDB9LAkvKiBzdW0uaC5mICovCi0gIHs4NCwxNSxyLFYsMCwwfSwJLyogc3VtLncuZiAqLwotICB7ODQsMTYscixWLDAsMH0sCS8qIHN1bS5sLmYgKi8KLSAgezg1LDIscixWLDAsMH0sCS8qIGFsbC5mICovCi0gIHs4NiwyLHIsViwwLDB9LAkvKiBhbnkuZiAqLwotICB7ODcsMixyLFYsMCwwfSwJLyogcGFyaXR5LmYgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezg4LDEzLHIsViwwLDB9LAkvKiBtYXguYi5mICovCi0gIHs4OCwxNCxyLFYsMCwwfSwJLyogbWF4LmguZiAqLwotICB7ODgsMTUscixWLDAsMH0sCS8qIG1heC53LmYgKi8KLSAgezg4LDE2LHIsViwwLDB9LAkvKiBtYXgubC5mICovCi0gIHs4OSwxMyxyLFYsMCwwfSwJLyogbWluLmIuZiAqLwotICB7ODksMTQscixWLDAsMH0sCS8qIG1pbi5oLmYgKi8KLSAgezg5LDE1LHIsViwwLDB9LAkvKiBtaW4udy5mICovCi0gIHs4OSwxNixyLFYsMCwwfSwJLyogbWluLmwuZiAqLwotICB7ODQsMTEscixWLDAsMH0sCS8qIHN1bS5zLmYgKi8KLSAgezg0LDEyLHIsViwwLDB9LAkvKiBzdW0uZC5mICovCi0gIHs5MCwxMSxyLFYsMCwwfSwJLyogcHJvZC5zLmYgKi8KLSAgezkwLDEyLHIsViwwLDB9LAkvKiBwcm9kLmQuZiAqLwotICB7ODgsMTEscixWLDAsMH0sCS8qIG1heC5zLmYgKi8KLSAgezg4LDEyLHIsViwwLDB9LAkvKiBtYXguZC5mICovCi0gIHs4OSwxMSxyLFYsMCwwfSwJLyogbWluLnMuZiAqLwotICB7ODksMTIscixWLDAsMH0sCS8qIG1pbi5kLmYgKi8KLSAgezkwLDEzLHIsViwwLDB9LAkvKiBwcm9kLmIuZiAqLwotICB7OTAsMTQscixWLDAsMH0sCS8qIHByb2QuaC5mICovCi0gIHs5MCwxNSxyLFYsMCwwfSwJLyogcHJvZC53LmYgKi8KLSAgezkwLDE2LHIsViwwLDB9LAkvKiBwcm9kLmwuZiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0MFtdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MTAsMTgscnJyLFMsVixWfSwJLyogc3ViLnMudCAqLwotICB7MTAsMTkscnJyLFMsVixWfSwJLyogc3ViLmQudCAqLwotICB7NCwxOCxycnIsUyxWLFZ9LAkvKiBkaXYucy50ICovCi0gIHs0LDE5LHJycixTLFYsVn0sCS8qIGRpdi5kLnQgKi8KLSAgezMsMTgscnJyLFYsVixWfSwJLyogbXVsLnMudCAqLwotICB7MywxOSxycnIsVixWLFZ9LAkvKiBtdWwuZC50ICovCi0gIHs0LDE4LHJycixWLFYsVn0sCS8qIGRpdi5zLnQgKi8KLSAgezQsMTkscnJyLFYsVixWfSwJLyogZGl2LmQudCAqLwotICB7MywxOCxycnIsVixTLFZ9LAkvKiBtdWwucy50ICovCi0gIHszLDE5LHJycixWLFMsVn0sCS8qIG11bC5kLnQgKi8KLSAgezQsMTgscnJyLFYsUyxWfSwJLyogZGl2LnMudCAqLwotICB7NCwxOSxycnIsVixTLFZ9LAkvKiBkaXYuZC50ICovCi0gIHs1LDEscnJyLFYsVixWfSwJLyogYW5kLnQgKi8KLSAgezYsMSxycnIsVixWLFZ9LAkvKiBvci50ICovCi0gIHs3LDEscnJyLFYsVixWfSwJLyogeG9yLnQgKi8KLSAgezgsMSxycnIsVixWLFZ9LAkvKiBzaGYudCAqLwotICB7NSwxLHJycixWLFMsVn0sCS8qIGFuZC50ICovCi0gIHs2LDEscnJyLFYsUyxWfSwJLyogb3IudCAqLwotICB7NywxLHJycixWLFMsVn0sCS8qIHhvci50ICovCi0gIHs4LDEscnJyLFYsUyxWfSwJLyogc2hmLnQgKi8KLSAgezksMTgscnJyLFYsVixWfSwJLyogYWRkLnMudCAqLwotICB7OSwxOSxycnIsVixWLFZ9LAkvKiBhZGQuZC50ICovCi0gIHsxMCwxOCxycnIsVixWLFZ9LAkvKiBzdWIucy50ICovCi0gIHsxMCwxOSxycnIsVixWLFZ9LAkvKiBzdWIuZC50ICovCi0gIHs5LDE4LHJycixWLFMsVn0sCS8qIGFkZC5zLnQgKi8KLSAgezksMTkscnJyLFYsUyxWfSwJLyogYWRkLmQudCAqLwotICB7MTAsMTgscnJyLFYsUyxWfSwJLyogc3ViLnMudCAqLwotICB7MTAsMTkscnJyLFYsUyxWfSwJLyogc3ViLmQudCAqLwotICB7OSwyMCxycnIsVixWLFZ9LAkvKiBhZGQuYi50ICovCi0gIHs5LDIxLHJycixWLFYsVn0sCS8qIGFkZC5oLnQgKi8KLSAgezksMjIscnJyLFYsVixWfSwJLyogYWRkLncudCAqLwotICB7OSwyMyxycnIsVixWLFZ9LAkvKiBhZGQubC50ICovCi0gIHs5LDIwLHJycixWLFMsVn0sCS8qIGFkZC5iLnQgKi8KLSAgezksMjEscnJyLFYsUyxWfSwJLyogYWRkLmgudCAqLwotICB7OSwyMixycnIsVixTLFZ9LAkvKiBhZGQudy50ICovCi0gIHs5LDIzLHJycixWLFMsVn0sCS8qIGFkZC5sLnQgKi8KLSAgezEwLDIwLHJycixWLFYsVn0sCS8qIHN1Yi5iLnQgKi8KLSAgezEwLDIxLHJycixWLFYsVn0sCS8qIHN1Yi5oLnQgKi8KLSAgezEwLDIyLHJycixWLFYsVn0sCS8qIHN1Yi53LnQgKi8KLSAgezEwLDIzLHJycixWLFYsVn0sCS8qIHN1Yi5sLnQgKi8KLSAgezEwLDIwLHJycixWLFMsVn0sCS8qIHN1Yi5iLnQgKi8KLSAgezEwLDIxLHJycixWLFMsVn0sCS8qIHN1Yi5oLnQgKi8KLSAgezEwLDIyLHJycixWLFMsVn0sCS8qIHN1Yi53LnQgKi8KLSAgezEwLDIzLHJycixWLFMsVn0sCS8qIHN1Yi5sLnQgKi8KLSAgezMsMjAscnJyLFYsVixWfSwJLyogbXVsLmIudCAqLwotICB7MywyMSxycnIsVixWLFZ9LAkvKiBtdWwuaC50ICovCi0gIHszLDIyLHJycixWLFYsVn0sCS8qIG11bC53LnQgKi8KLSAgezMsMjMscnJyLFYsVixWfSwJLyogbXVsLmwudCAqLwotICB7MywyMCxycnIsVixTLFZ9LAkvKiBtdWwuYi50ICovCi0gIHszLDIxLHJycixWLFMsVn0sCS8qIG11bC5oLnQgKi8KLSAgezMsMjIscnJyLFYsUyxWfSwJLyogbXVsLncudCAqLwotICB7MywyMyxycnIsVixTLFZ9LAkvKiBtdWwubC50ICovCi0gIHs0LDIwLHJycixWLFYsVn0sCS8qIGRpdi5iLnQgKi8KLSAgezQsMjEscnJyLFYsVixWfSwJLyogZGl2LmgudCAqLwotICB7NCwyMixycnIsVixWLFZ9LAkvKiBkaXYudy50ICovCi0gIHs0LDIzLHJycixWLFYsVn0sCS8qIGRpdi5sLnQgKi8KLSAgezQsMjAscnJyLFYsUyxWfSwJLyogZGl2LmIudCAqLwotICB7NCwyMSxycnIsVixTLFZ9LAkvKiBkaXYuaC50ICovCi0gIHs0LDIyLHJycixWLFMsVn0sCS8qIGRpdi53LnQgKi8KLSAgezQsMjMscnJyLFYsUyxWfSwJLyogZGl2LmwudCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0MVtdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MjYsMjAsYTJyLFMsMCwwfSwJLyogc3RlLmIudCAqLwotICB7MjYsMjEsYTJyLFMsMCwwfSwJLyogc3RlLmgudCAqLwotICB7MjYsMjIsYTJyLFMsMCwwfSwJLyogc3RlLncudCAqLwotICB7MjYsMjMsYTJyLFMsMCwwfSwJLyogc3RlLmwudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MTgsMjAsYTFyLFYsMCwwfSwJLyogbGQuYi50ICovCi0gIHsxOCwyMSxhMXIsViwwLDB9LAkvKiBsZC5oLnQgKi8KLSAgezE4LDIyLGExcixWLDAsMH0sCS8qIGxkLncudCAqLwotICB7MTgsMjMsYTFyLFYsMCwwfSwJLyogbGQubC50ICovCi0gIHsyMSwyMCxhMnIsViwwLDB9LAkvKiBzdC5iLnQgKi8KLSAgezIxLDIxLGEycixWLDAsMH0sCS8qIHN0LmgudCAqLwotICB7MjEsMjIsYTJyLFYsMCwwfSwJLyogc3Qudy50ICovCi0gIHsyMSwyMyxhMnIsViwwLDB9LAkvKiBzdC5sLnQgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDJbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezI4LDIwLHJyLFYsViwwfSwJLyogY3Z0dy5iLnQgKi8KLSAgezI4LDIxLHJyLFYsViwwfSwJLyogY3Z0dy5oLnQgKi8KLSAgezI5LDIyLHJyLFYsViwwfSwJLyogY3Z0Yi53LnQgKi8KLSAgezMwLDIyLHJyLFYsViwwfSwJLyogY3Z0aC53LnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezMxLDIzLHJyLFYsViwwfSwJLyogY3Z0cy5sLnQgKi8KLSAgezMyLDIyLHJyLFYsViwwfSwJLyogY3Z0ZC53LnQgKi8KLSAgezMzLDE4LHJyLFYsViwwfSwJLyogY3Z0bC5zLnQgKi8KLSAgezI4LDE5LHJyLFYsViwwfSwJLyogY3Z0dy5kLnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezExNiwxOCxycixWLFYsMH0sCS8qIGZyaW50LnMudCAqLwotICB7MTE2LDE5LHJyLFYsViwwfSwJLyogZnJpbnQuZC50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4MSwxOCxycixWLFYsMH0sCS8qIHNxcnQucy50ICovCi0gIHs4MSwxOSxycixWLFYsMH0sCS8qIHNxcnQuZC50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMV9mb3JtYXQzW10gPSB7Ci0gIHszMiwxOCxycixWLFYsMH0sCS8qIGN2dGQucy50ICovCi0gIHszMSwxOSxycixWLFYsMH0sCS8qIGN2dHMuZC50ICovCi0gIHszMywxOSxycixWLFYsMH0sCS8qIGN2dGwuZC50ICovCi0gIHszMiwyMyxycixWLFYsMH0sCS8qIGN2dGQubC50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHszNiwxLHJyLFYsViwwfSwJLyogdHpjLnQgKi8KLSAgezQ0LDEscnIsVixWLDB9LAkvKiBsb3AudCAqLwotICB7MTE3LDEscnIsVixWLDB9LAkvKiB4cG5kLnQgKi8KLSAgezQyLDEscnIsVixWLDB9LAkvKiBub3QudCAqLwotICB7OCwxLHJyLFMsViwwfSwJLyogc2hmLnQgKi8KLSAgezM1LDI0LHJyLFYsViwwfSwJLyogcGxjLnQudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MzcsMTgscnIsVixWLDB9LAkvKiBlcS5zLnQgKi8KLSAgezM3LDE5LHJyLFYsViwwfSwJLyogZXEuZC50ICovCi0gIHs0MywxOCxycixWLFYsMH0sCS8qIG5lZy5zLnQgKi8KLSAgezQzLDE5LHJyLFYsViwwfSwJLyogbmVnLmQudCAqLwotICB7MzcsMTgscnIsUyxWLDB9LAkvKiBlcS5zLnQgKi8KLSAgezM3LDE5LHJyLFMsViwwfSwJLyogZXEuZC50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs0MCwxOCxycixWLFYsMH0sCS8qIGxlLnMudCAqLwotICB7NDAsMTkscnIsVixWLDB9LAkvKiBsZS5kLnQgKi8KLSAgezQxLDE4LHJyLFYsViwwfSwJLyogbHQucy50ICovCi0gIHs0MSwxOSxycixWLFYsMH0sCS8qIGx0LmQudCAqLwotICB7NDAsMTgscnIsUyxWLDB9LAkvKiBsZS5zLnQgKi8KLSAgezQwLDE5LHJyLFMsViwwfSwJLyogbGUuZC50ICovCi0gIHs0MSwxOCxycixTLFYsMH0sCS8qIGx0LnMudCAqLwotICB7NDEsMTkscnIsUyxWLDB9LAkvKiBsdC5kLnQgKi8KLSAgezM3LDIwLHJyLFYsViwwfSwJLyogZXEuYi50ICovCi0gIHszNywyMSxycixWLFYsMH0sCS8qIGVxLmgudCAqLwotICB7MzcsMjIscnIsVixWLDB9LAkvKiBlcS53LnQgKi8KLSAgezM3LDIzLHJyLFYsViwwfSwJLyogZXEubC50ICovCi0gIHszNywyMCxycixTLFYsMH0sCS8qIGVxLmIudCAqLwotICB7MzcsMjEscnIsUyxWLDB9LAkvKiBlcS5oLnQgKi8KLSAgezM3LDIyLHJyLFMsViwwfSwJLyogZXEudy50ICovCi0gIHszNywyMyxycixTLFYsMH0sCS8qIGVxLmwudCAqLwotICB7NDAsMjAscnIsVixWLDB9LAkvKiBsZS5iLnQgKi8KLSAgezQwLDIxLHJyLFYsViwwfSwJLyogbGUuaC50ICovCi0gIHs0MCwyMixycixWLFYsMH0sCS8qIGxlLncudCAqLwotICB7NDAsMjMscnIsVixWLDB9LAkvKiBsZS5sLnQgKi8KLSAgezQwLDIwLHJyLFMsViwwfSwJLyogbGUuYi50ICovCi0gIHs0MCwyMSxycixTLFYsMH0sCS8qIGxlLmgudCAqLwotICB7NDAsMjIscnIsUyxWLDB9LAkvKiBsZS53LnQgKi8KLSAgezQwLDIzLHJyLFMsViwwfSwJLyogbGUubC50ICovCi0gIHs0MSwyMCxycixWLFYsMH0sCS8qIGx0LmIudCAqLwotICB7NDEsMjEscnIsVixWLDB9LAkvKiBsdC5oLnQgKi8KLSAgezQxLDIyLHJyLFYsViwwfSwJLyogbHQudy50ICovCi0gIHs0MSwyMyxycixWLFYsMH0sCS8qIGx0LmwudCAqLwotICB7NDEsMjAscnIsUyxWLDB9LAkvKiBsdC5iLnQgKi8KLSAgezQxLDIxLHJyLFMsViwwfSwJLyogbHQuaC50ICovCi0gIHs0MSwyMixycixTLFYsMH0sCS8qIGx0LncudCAqLwotICB7NDEsMjMscnIsUyxWLDB9LAkvKiBsdC5sLnQgKi8KLSAgezQzLDIwLHJyLFYsViwwfSwJLyogbmVnLmIudCAqLwotICB7NDMsMjEscnIsVixWLDB9LAkvKiBuZWcuaC50ICovCi0gIHs0MywyMixycixWLFYsMH0sCS8qIG5lZy53LnQgKi8KLSAgezQzLDIzLHJyLFYsViwwfSwJLyogbmVnLmwudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0NFtdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0NVtdID0gewotICB7NTEsMjAscnIsVixWLDB9LAkvKiBsZHZpLmIudCAqLwotICB7NTEsMjEscnIsVixWLDB9LAkvKiBsZHZpLmgudCAqLwotICB7NTEsMjIscnIsVixWLDB9LAkvKiBsZHZpLncudCAqLwotICB7NTEsMjMscnIsVixWLDB9LAkvKiBsZHZpLmwudCAqLwotICB7MjgsMTgscnIsVixWLDB9LAkvKiBjdnR3LnMudCAqLwotICB7MzEsMjIscnIsVixWLDB9LAkvKiBjdnRzLncudCAqLwotICB7MjgsMjMscnIsVixWLDB9LAkvKiBjdnR3LmwudCAqLwotICB7MzMsMjIscnIsVixWLDB9LAkvKiBjdnRsLncudCAqLwotICB7NTIsMjAscnhyLFYsViwwfSwJLyogc3R2aS5iLnQgKi8KLSAgezUyLDIxLHJ4cixWLFYsMH0sCS8qIHN0dmkuaC50ICovCi0gIHs1MiwyMixyeHIsVixWLDB9LAkvKiBzdHZpLncudCAqLwotICB7NTIsMjMscnhyLFYsViwwfSwJLyogc3R2aS5sLnQgKi8KLSAgezUyLDIwLHJ4cixTLFYsMH0sCS8qIHN0dmkuYi50ICovCi0gIHs1MiwyMSxyeHIsUyxWLDB9LAkvKiBzdHZpLmgudCAqLwotICB7NTIsMjIscnhyLFMsViwwfSwJLyogc3R2aS53LnQgKi8KLSAgezUyLDIzLHJ4cixTLFYsMH0sCS8qIHN0dmkubC50ICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMV9mb3JtYXQ2W10gPSB7Ci0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMV9mb3JtYXQ3W10gPSB7Ci0gIHs4NCwyMCxyLFYsMCwwfSwJLyogc3VtLmIudCAqLwotICB7ODQsMjEscixWLDAsMH0sCS8qIHN1bS5oLnQgKi8KLSAgezg0LDIyLHIsViwwLDB9LAkvKiBzdW0udy50ICovCi0gIHs4NCwyMyxyLFYsMCwwfSwJLyogc3VtLmwudCAqLwotICB7ODUsMSxyLFYsMCwwfSwJLyogYWxsLnQgKi8KLSAgezg2LDEscixWLDAsMH0sCS8qIGFueS50ICovCi0gIHs4NywxLHIsViwwLDB9LAkvKiBwYXJpdHkudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7ODgsMjAscixWLDAsMH0sCS8qIG1heC5iLnQgKi8KLSAgezg4LDIxLHIsViwwLDB9LAkvKiBtYXguaC50ICovCi0gIHs4OCwyMixyLFYsMCwwfSwJLyogbWF4LncudCAqLwotICB7ODgsMjMscixWLDAsMH0sCS8qIG1heC5sLnQgKi8KLSAgezg5LDIwLHIsViwwLDB9LAkvKiBtaW4uYi50ICovCi0gIHs4OSwyMSxyLFYsMCwwfSwJLyogbWluLmgudCAqLwotICB7ODksMjIscixWLDAsMH0sCS8qIG1pbi53LnQgKi8KLSAgezg5LDIzLHIsViwwLDB9LAkvKiBtaW4ubC50ICovCi0gIHs4NCwxOCxyLFYsMCwwfSwJLyogc3VtLnMudCAqLwotICB7ODQsMTkscixWLDAsMH0sCS8qIHN1bS5kLnQgKi8KLSAgezkwLDE4LHIsViwwLDB9LAkvKiBwcm9kLnMudCAqLwotICB7OTAsMTkscixWLDAsMH0sCS8qIHByb2QuZC50ICovCi0gIHs4OCwxOCxyLFYsMCwwfSwJLyogbWF4LnMudCAqLwotICB7ODgsMTkscixWLDAsMH0sCS8qIG1heC5kLnQgKi8KLSAgezg5LDE4LHIsViwwLDB9LAkvKiBtaW4ucy50ICovCi0gIHs4OSwxOSxyLFYsMCwwfSwJLyogbWluLmQudCAqLwotICB7OTAsMjAscixWLDAsMH0sCS8qIHByb2QuYi50ICovCi0gIHs5MCwyMSxyLFYsMCwwfSwJLyogcHJvZC5oLnQgKi8KLSAgezkwLDIyLHIsViwwLDB9LAkvKiBwcm9kLncudCAqLwotICB7OTAsMjMscixWLDAsMH0sCS8qIHByb2QubC50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1jaGFyICpsb3BbXSA9IHsKLSAgIm1vdiIsCS8qIDAgKi8KLSAgIm1lcmciLAkvKiAxICovCi0gICJtYXNrIiwJLyogMiAqLwotICAibXVsIiwJLyogMyAqLwotICAiZGl2IiwJLyogNCAqLwotICAiYW5kIiwJLyogNSAqLwotICAib3IiLAkvKiA2ICovCi0gICJ4b3IiLAkvKiA3ICovCi0gICJzaGYiLAkvKiA4ICovCi0gICJhZGQiLAkvKiA5ICovCi0gICJzdWIiLAkvKiAxMCAqLwotICAiZXhpdCIsCS8qIDExICovCi0gICJqbXAiLAkvKiAxMiAqLwotICAiam1waSIsCS8qIDEzICovCi0gICJqbXBhIiwJLyogMTQgKi8KLSAgImptcHMiLAkvKiAxNSAqLwotICAidGFjIiwJLyogMTYgKi8KLSAgImxkZWEiLAkvKiAxNyAqLwotICAibGQiLAkvKiAxOCAqLwotICAidGFzIiwJLyogMTkgKi8KLSAgInBzaGVhIiwJLyogMjAgKi8KLSAgInN0IiwJLyogMjEgKi8KLSAgImNhbGwiLAkvKiAyMiAqLwotICAiY2FsbHMiLAkvKiAyMyAqLwotICAiY2FsbHEiLAkvKiAyNCAqLwotICAicGZvcmsiLAkvKiAyNSAqLwotICAic3RlIiwJLyogMjYgKi8KLSAgImluY3IiLAkvKiAyNyAqLwotICAiY3Z0dyIsCS8qIDI4ICovCi0gICJjdnRiIiwJLyogMjkgKi8KLSAgImN2dGgiLAkvKiAzMCAqLwotICAiY3Z0cyIsCS8qIDMxICovCi0gICJjdnRkIiwJLyogMzIgKi8KLSAgImN2dGwiLAkvKiAzMyAqLwotICAibGRwYSIsCS8qIDM0ICovCi0gICJwbGMiLAkvKiAzNSAqLwotICAidHpjIiwJLyogMzYgKi8KLSAgImVxIiwJLyogMzcgKi8KLSAgImxldSIsCS8qIDM4ICovCi0gICJsdHUiLAkvKiAzOSAqLwotICAibGUiLAkvKiA0MCAqLwotICAibHQiLAkvKiA0MSAqLwotICAibm90IiwJLyogNDIgKi8KLSAgIm5lZyIsCS8qIDQzICovCi0gICJsb3AiLAkvKiA0NCAqLwotICAiY3BycyIsCS8qIDQ1ICovCi0gICJub3AiLAkvKiA0NiAqLwotICAiYnIiLAkvKiA0NyAqLwotICAiYnJpIiwJLyogNDggKi8KLSAgImJyYSIsCS8qIDQ5ICovCi0gICJicnMiLAkvKiA1MCAqLwotICAibGR2aSIsCS8qIDUxICovCi0gICJzdHZpIiwJLyogNTIgKi8KLSAgImxkc2RyIiwJLyogNTMgKi8KLSAgImxka2RyIiwJLyogNTQgKi8KLSAgImxuIiwJLyogNTUgKi8KLSAgInBhdHUiLAkvKiA1NiAqLwotICAicGF0ZSIsCS8qIDU3ICovCi0gICJwaWNoIiwJLyogNTggKi8KLSAgInBsY2giLAkvKiA1OSAqLwotICAiaWRsZSIsCS8qIDYwICovCi0gICJydG5xIiwJLyogNjEgKi8KLSAgImNmb3JrIiwJLyogNjIgKi8KLSAgInJ0biIsCS8qIDYzICovCi0gICJ3Zm9yayIsCS8qIDY0ICovCi0gICJqb2luIiwJLyogNjUgKi8KLSAgInJ0bmMiLAkvKiA2NiAqLwotICAiZXhwIiwJLyogNjcgKi8KLSAgInNpbiIsCS8qIDY4ICovCi0gICJjb3MiLAkvKiA2OSAqLwotICAicHNoIiwJLyogNzAgKi8KLSAgInBvcCIsCS8qIDcxICovCi0gICJlbmkiLAkvKiA3MiAqLwotICAiZHNpIiwJLyogNzMgKi8KLSAgImJrcHQiLAkvKiA3NCAqLwotICAibXN5bmMiLAkvKiA3NSAqLwotICAibXNraSIsCS8qIDc2ICovCi0gICJ4bXRpIiwJLyogNzcgKi8KLSAgInRzdHZ2IiwJLyogNzggKi8KLSAgImRpYWciLAkvKiA3OSAqLwotICAicGJrcHQiLAkvKiA4MCAqLwotICAic3FydCIsCS8qIDgxICovCi0gICJjYXNyIiwJLyogODIgKi8KLSAgImF0YW4iLAkvKiA4MyAqLwotICAic3VtIiwJLyogODQgKi8KLSAgImFsbCIsCS8qIDg1ICovCi0gICJhbnkiLAkvKiA4NiAqLwotICAicGFyaXR5IiwJLyogODcgKi8KLSAgIm1heCIsCS8qIDg4ICovCi0gICJtaW4iLAkvKiA4OSAqLwotICAicHJvZCIsCS8qIDkwICovCi0gICJoYWx0IiwJLyogOTEgKi8KLSAgInN5c2MiLAkvKiA5MiAqLwotICAidHJhcCIsCS8qIDkzICovCi0gICJ0c3QiLAkvKiA5NCAqLwotICAibGNrIiwJLyogOTUgKi8KLSAgInVsayIsCS8qIDk2ICovCi0gICJzcGF3biIsCS8qIDk3ICovCi0gICJsZGNtciIsCS8qIDk4ICovCi0gICJzdGNtciIsCS8qIDk5ICovCi0gICJwb3ByIiwJLyogMTAwICovCi0gICJwc2hyIiwJLyogMTAxICovCi0gICJyY3ZyIiwJLyogMTAyICovCi0gICJtYXRtIiwJLyogMTAzICovCi0gICJzbmRyIiwJLyogMTA0ICovCi0gICJwdXRyIiwJLyogMTA1ICovCi0gICJnZXRyIiwJLyogMTA2ICovCi0gICJtYXRyIiwJLyogMTA3ICovCi0gICJtYXQiLAkvKiAxMDggKi8KLSAgImdldCIsCS8qIDEwOSAqLwotICAicmN2IiwJLyogMTEwICovCi0gICJpbmMiLAkvKiAxMTEgKi8KLSAgInB1dCIsCS8qIDExMiAqLwotICAic25kIiwJLyogMTEzICovCi0gICJlbmFsIiwJLyogMTE0ICovCi0gICJlbmFnIiwJLyogMTE1ICovCi0gICJmcmludCIsCS8qIDExNiAqLwotICAieHBuZCIsCS8qIDExNyAqLwotICAiY3Ryc2wiLAkvKiAxMTggKi8KLSAgImN0cnNnIiwJLyogMTE5ICovCi0gICJzdG9wIiwJLyogMTIwICovCi19OwotCi1jaGFyICpyb3BbXSA9IHsKLSAgIiIsCS8qIDAgKi8KLSAgIi50IiwJLyogMSAqLwotICAiLmYiLAkvKiAyICovCi0gICIucyIsCS8qIDMgKi8KLSAgIi5kIiwJLyogNCAqLwotICAiLmIiLAkvKiA1ICovCi0gICIuaCIsCS8qIDYgKi8KLSAgIi53IiwJLyogNyAqLwotICAiLmwiLAkvKiA4ICovCi0gICIueCIsCS8qIDkgKi8KLSAgIi51IiwJLyogMTAgKi8KLSAgIi5zLmYiLAkvKiAxMSAqLwotICAiLmQuZiIsCS8qIDEyICovCi0gICIuYi5mIiwJLyogMTMgKi8KLSAgIi5oLmYiLAkvKiAxNCAqLwotICAiLncuZiIsCS8qIDE1ICovCi0gICIubC5mIiwJLyogMTYgKi8KLSAgIi50LmYiLAkvKiAxNyAqLwotICAiLnMudCIsCS8qIDE4ICovCi0gICIuZC50IiwJLyogMTkgKi8KLSAgIi5iLnQiLAkvKiAyMCAqLwotICAiLmgudCIsCS8qIDIxICovCi0gICIudy50IiwJLyogMjIgKi8KLSAgIi5sLnQiLAkvKiAyMyAqLwotICAiLnQudCIsCS8qIDI0ICovCi19OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvZDEwdi5oIGIvaW5jbHVkZS9vcGNvZGUvZDEwdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yjc0Yzk4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2QxMHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKiBkMTB2LmggLS0gSGVhZGVyIGZpbGUgZm9yIEQxMFYgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgTWFydGluIEh1bnQgKGh1bnRAY3lnbnVzLmNvbSksIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgRDEwVl9ICi0jZGVmaW5lIEQxMFZfSAotCi0vKiBGb3JtYXQgU3BlY2lmaWVyICovCi0jZGVmaW5lIEZNMDAJMAotI2RlZmluZSBGTTAxCTB4NDAwMDAwMDAKLSNkZWZpbmUgRk0xMAkweDgwMDAwMDAwCi0jZGVmaW5lIEZNMTEJMHhDMDAwMDAwMAotCi0jZGVmaW5lIE5PUCAweDVlMDAKLSNkZWZpbmUgT1BDT0RFX0RJVlMJMHgxNDAwMjgwMAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBkMTB2X29wY29kZS4gICovCi0KLXN0cnVjdCBkMTB2X29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIHRoZSBvcGNvZGUgZm9ybWF0ICovCi0gIGludCBmb3JtYXQ7Ci0KLSAgLyogVGhlc2UgbnVtYmVycyB3ZXJlIHBpY2tlZCBzbyB3ZSBjYW4gZG8gaWYoIGkgJiBTSE9SVF9PUENPREUpICovCi0jZGVmaW5lIFNIT1JUX09QQ09ERSAxCi0jZGVmaW5lIExPTkdfT1BDT0RFICA4Ci0jZGVmaW5lIFNIT1JUXzIJICAgICAxCQkvKiBzaG9ydCB3aXRoIDIgb3BlcmFuZHMgKi8KLSNkZWZpbmUgU0hPUlRfQgkgICAgIDMJCS8qIHNob3J0IHdpdGggOC1iaXQgYnJhbmNoICovCi0jZGVmaW5lIExPTkdfQgkgICAgIDgJCS8qIGxvbmcgd2l0aCAxNi1iaXQgYnJhbmNoICovCi0jZGVmaW5lIExPTkdfTCAgICAgICAxMAkJLyogbG9uZyB3aXRoIDMgb3BlcmFuZHMgKi8KLSNkZWZpbmUgTE9OR19SICAgICAgIDEyCQkvKiByZXNlcnZlZCAqLwotCi0gIC8qIGp1c3QgYSBwbGFjZWhvbGRlciBmb3IgdmFyaWFibGUtbGVuZ3RoIGluc3RydWN0aW9ucyAqLwotICAvKiBmb3IgZXhhbXBsZSwgImJyYSIgd2lsbCBiZSBhIGZha2UgZm9yICJicmEucyIgYW5kIGJyYS5sIiAqLwotICAvKiB3aGljaCB3aWxsIGltbWVkaWF0ZWx5IGZvbGxvdyBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSNkZWZpbmUgT1BDT0RFX0ZBS0UgIDMyCi0KLSAgLyogdGhlIG51bWJlciBvZiBjeWNsZXMgKi8KLSAgaW50IGN5Y2xlczsKLQotICAvKiB0aGUgZXhlY3V0aW9uIHVuaXQocykgdXNlZCAqLwotICBpbnQgdW5pdDsKLSNkZWZpbmUgRUlUSEVSCTAKLSNkZWZpbmUgSVUJMQotI2RlZmluZSBNVQkyCi0jZGVmaW5lIEJPVEgJMwotCi0gIC8qIGV4ZWN1dGlvbiB0eXBlOyBwYXJhbGxlbCBvciBzZXF1ZW50aWFsICovCi0gIC8qIHRoaXMgZmllbGQgaXMgdXNlZCB0byBkZWNpZGUgaWYgdHdvIGluc3RydWN0aW9ucyAqLwotICAvKiBjYW4gYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwgKi8KLSAgaW50IGV4ZWNfdHlwZTsKLSNkZWZpbmUgUEFST05MWSAxCS8qIHBhcmFsbGVsIG9ubHkgKi8KLSNkZWZpbmUgU0VRCTIJLyogbXVzdCBiZSBzZXF1ZW50aWFsICovCi0jZGVmaW5lIFBBUgk0CS8qIG1heSBiZSBwYXJhbGxlbCAqLwotI2RlZmluZSBCUkFOQ0hfTElOSyA4CS8qIHN1YnJvdXRpbmUgY2FsbC4gIG11c3QgYmUgYWxpZ25lZCAqLwotI2RlZmluZSBSTUVNICAgICAxNgkvKiByZWFkcyBtZW1vcnkgKi8KLSNkZWZpbmUgV01FTSAgICAgMzIJLyogd3JpdGVzIG1lbW9yeSAqLwotI2RlZmluZSBSRjAgICAgICA2NAkvKiByZWFkcyBmMCAqLwotI2RlZmluZSBXRjAgICAgIDEyOAkvKiBtb2RpZmllcyBmMCAqLwotI2RlZmluZSBXQ0FSICAgIDI1NgkvKiB3cml0ZSBDYXJyeSAqLwotI2RlZmluZSBCUkFOQ0ggIDUxMgkvKiBicmFuY2gsIG5vIGxpbmsgKi8KLQotICAvKiB0aGUgb3Bjb2RlICovCi0gIGxvbmcgb3Bjb2RlOwotCi0gIC8qIG1hc2suICBpZiggKGkgJiBtYXNrKSA9PSBvcGNvZGUgKSB0aGVuIG1hdGNoICovCi0gIGxvbmcgbWFzazsKLQotICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCi0gICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKLSAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLwotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzZdOwotfTsKLQotLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZQotICAgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyCi0gICBpbnN0cnVjdGlvbnMuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBkMTB2X29wY29kZSBkMTB2X29wY29kZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgZDEwdl9udW1fb3Bjb2RlczsKLQotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBkMTB2X29wZXJhbmQuICAqLwotc3RydWN0IGQxMHZfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpbnQgc2hpZnQ7Ci0KLSAgLyogT25lIGJpdCBzeW50YXggZmxhZ3MuICAqLwotICBpbnQgZmxhZ3M7Ci19OwotCi0vKiBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIHJldHJpZXZlZCBieSBpbmRleGluZyB3aXRoIHZhbHVlcyBmcm9tCi0gICB0aGUgb3BlcmFuZHMgZmllbGQgb2YgdGhlIGQxMHZfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZDEwdl9vcGVyYW5kIGQxMHZfb3BlcmFuZHNbXTsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBkMTB2X29wZXJhbmQuICAqLwotCi0vKiB0aGUgb3BlcmFuZCBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyICovCi0jZGVmaW5lIE9QRVJBTkRfRVZFTgkoMSkKLQotLyogdGhlIG9wZXJhbmQgbXVzdCBiZSBhbiBvZGQgbnVtYmVyICovCi0jZGVmaW5lIE9QRVJBTkRfT0RECSgyKQkKLQotLyogdGhpcyBpcyB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXI7IGl0IHdpbGwgYmUgbW9kaWZpZWQgKi8KLS8qIHRoaXMgaXMgdXNlZCBieSB0aGUgb3B0aW1pemVyICovCi0jZGVmaW5lIE9QRVJBTkRfREVTVAkoNCkKLQotLyogbnVtYmVyIG9yIHN5bWJvbCAqLwotI2RlZmluZSBPUEVSQU5EX05VTQkoOCkKLQotLyogYWRkcmVzcyBvciBsYWJlbCAqLwotI2RlZmluZSBPUEVSQU5EX0FERFIJKDB4MTApCi0KLS8qIHJlZ2lzdGVyICovCi0jZGVmaW5lIE9QRVJBTkRfUkVHCSgweDIwKQotCi0vKiBwb3N0aW5jcmVtZW50ICsgICovCi0jZGVmaW5lIE9QRVJBTkRfUExVUwkoMHg0MCkKLQotLyogcG9zdGRlY3JlbWVudCAtICAqLwotI2RlZmluZSBPUEVSQU5EX01JTlVTCSgweDgwKQotCi0vKiBAICAqLwotI2RlZmluZSBPUEVSQU5EX0FUU0lHTgkoMHgxMDApCi0KLS8qIEAoICAqLwotI2RlZmluZSBPUEVSQU5EX0FUUEFSCSgweDIwMCkKLQotLyogYWNjdW11bGF0b3IgMCAqLwotI2RlZmluZSBPUEVSQU5EX0FDQzAJKDB4NDAwKQotCi0vKiBhY2N1bXVsYXRvciAxICovCi0jZGVmaW5lIE9QRVJBTkRfQUNDMQkoMHg4MDApCi0KLS8qIGYwIC8gZjEgZmxhZyByZWdpc3RlciAqLwotI2RlZmluZSBPUEVSQU5EX0ZGTEFHCSgweDEwMDApCi0KLS8qIGMgZmxhZyByZWdpc3RlciAqLwotI2RlZmluZSBPUEVSQU5EX0NGTEFHCSgweDIwMDApCi0KLS8qIGNvbnRyb2wgcmVnaXN0ZXIgICovCi0jZGVmaW5lIE9QRVJBTkRfQ09OVFJPTAkoMHg0MDAwKQotCi0vKiBwcmVkZWNyZW1lbnQgbW9kZSAnQC1zcCcgICovCi0jZGVmaW5lIE9QRVJBTkRfQVRNSU5VUwkoMHg4MDAwKQotCi0vKiBzaWduZWQgbnVtYmVyICovCi0jZGVmaW5lIE9QRVJBTkRfU0lHTkVECSgweDEwMDAwKQotCi0vKiBzcGVjaWFsIGFjY3VtdWxhdG9yIHNoaWZ0cyBuZWVkIGEgNC1iaXQgbnVtYmVyICovCi0vKiAxIDw9IHggPD0gMTYgKi8KLSNkZWZpbmUgT1BFUkFORF9TSElGVAkoMHgyMDAwMCkKLQotLyogZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyICovCi0jZGVmaW5lIE9QRVJBTkRfR1BSCSgweDQwMDAwKQotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHJlZ2lzdGVycy4gICovCi1zdHJ1Y3QgcGRfcmVnCi17Ci0gIGNoYXIgKm5hbWU7CQkvKiBuYW1lIHRvIHJlY29nbml6ZSAqLwotICBjaGFyICpwbmFtZTsJCS8qIG5hbWUgdG8gcHJpbnQgZm9yIHRoaXMgcmVnaXN0ZXIgKi8KLSAgaW50IHZhbHVlOwotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwZF9yZWcgZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1tdOwotaW50IGQxMHZfcmVnX25hbWVfY250KCk7Ci0KLS8qIGFuIGV4cHJlc3Npb25TIG9ubHkgaGFzIG9uZSByZWdpc3RlciB0eXBlLCBzbyB3ZSBmYWtlIGl0ICovCi0vKiBieSBzZXR0aW5nIGhpZ2ggYml0cyB0byBpbmRpY2F0ZSB0eXBlICovCi0jZGVmaW5lIFJFR0lTVEVSX01BU0sJMHhGRgotCi0jZW5kaWYgLyogRDEwVl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9kMzB2LmggYi9pbmNsdWRlL29wY29kZS9kMzB2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MjhkYWIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvZDMwdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qIGQzMHYuaCAtLSBIZWFkZXIgZmlsZSBmb3IgRDMwViBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCAoaHVudEBjeWdudXMuY29tKSwgQ3lnbnVzIFNvbHV0aW9ucwotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEQzMFZfSAotI2RlZmluZSBEMzBWX0gKLQotI2RlZmluZSBOT1AgMHgwMEYwMDAwMAotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHJlZ2lzdGVycy4gICovCi1zdHJ1Y3QgcGRfcmVnCi17Ci0gIGNoYXIgKm5hbWU7CQkvKiBuYW1lIHRvIHJlY29nbml6ZSAqLwotICBjaGFyICpwbmFtZTsJCS8qIG5hbWUgdG8gcHJpbnQgZm9yIHRoaXMgcmVnaXN0ZXIgKi8KLSAgaW50IHZhbHVlOwotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwZF9yZWcgcHJlX2RlZmluZWRfcmVnaXN0ZXJzW107Ci1pbnQgcmVnX25hbWVfY250KCk7Ci0KLS8qIHRoZSBudW1iZXIgb2YgY29udHJvbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgTUFYX0NPTlRST0xfUkVHCTY0Ci0KLS8qIGRlZmluZSB0aGUgZm9ybWF0IHNwZWNpZmllcnMgKi8KLSNkZWZpbmUgRk0wMAkwCi0jZGVmaW5lIEZNMDEJMHg4MDAwMDAwMAotI2RlZmluZSBGTTEwCTB4ODAwMDAwMDAwMDAwMDAwMExMCi0jZGVmaW5lIEZNMTEJMHg4MDAwMDAwMDgwMDAwMDAwTEwKLQotLyogZGVmaW5lIHRoZSBvcGNvZGUgY2xhc3NlcyAqLwotI2RlZmluZSBCUkEJMAotI2RlZmluZSBMT0dJQwkxCi0jZGVmaW5lIElNRU0JMgotI2RlZmluZSBJQUxVMQk0Ci0jZGVmaW5lIElBTFUyCTUKLQotLyogZGVmaW5lIHRoZSBleGVjdXRpb24gY29uZGl0aW9uIGNvZGVzICovCi0jZGVmaW5lIEVDQ19BTAkwCS8qIEFMd2F5cyAoZGVmYXVsdCkgKi8KLSNkZWZpbmUgRUNDX1RYCTEJLyogRjA9VHJ1ZSwgRjE9RG9uJ3QgY2FyZSAqLwotI2RlZmluZSBFQ0NfRlgJMgkvKiBGMD1GYWxzZSwgRjE9RG9uJ3QgY2FyZSAqLwotI2RlZmluZSBFQ0NfWFQJMwkvKiBGMD1Eb24ndCBjYXJlLCBGMT1UcnVlICovCi0jZGVmaW5lIEVDQ19YRgk0CS8qIEYwPURvbid0IGNhcmUsIEYxPUZhbHNlICovCi0jZGVmaW5lIEVDQ19UVAk1CS8qIEYwPVRydWUsIEYxPVRydWUgKi8KLSNkZWZpbmUgRUNDX1RGCTYJLyogRjA9VHJ1ZSwgRjE9RmFsc2UgKi8KLSNkZWZpbmUgRUNDX1JFU0VSVkVECTcJLyogcmVzZXJ2ZWQgKi8KLSNkZWZpbmUgRUNDX01BWAlFQ0NfUkVTRVJWRUQKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmQzMHZfZWNjX25hbWVzW107Ci0KLS8qIGNvbmRpdGlvbiBjb2RlIHRhYmxlIGZvciBDTVAgYW5kIENNUFUgKi8KLWV4dGVybiBjb25zdCBjaGFyICpkMzB2X2NjX25hbWVzW107Ci0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGQzMHZfb3Bjb2RlLiAgKi8KLXN0cnVjdCBkMzB2X29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIHRoZSBvcGNvZGUgKi8KLSAgaW50IG9wMTsJLyogZmlyc3QgcGFydCwgIklBTFUxIiBmb3IgZXhhbXBsZSAqLwotICBpbnQgb3AyOwkvKiB0aGUgcmVzdCBvZiB0aGUgb3Bjb2RlICovCi0KLSAgLyogb3Bjb2RlIGZvcm1hdChzKS4gIFRoZXNlIG51bWJlcnMgY29ycmVzcG9uZCB0byBlbnRyaWVzICovCi0gIC8qIGluIHRoZSBkMzB2X2Zvcm1hdF90YWJsZSAqLwotICB1bnNpZ25lZCBjaGFyIGZvcm1hdFs0XTsKLQotI2RlZmluZSBTSE9SVF9NCQkxCi0jZGVmaW5lIFNIT1JUX00yCTUJLyogZm9yIGxkMncgYW5kIHN0MncgKi8KLSNkZWZpbmUgU0hPUlRfQQkJOQotI2RlZmluZSBTSE9SVF9CMQkxMQotI2RlZmluZSBTSE9SVF9CMgkxMgotI2RlZmluZSBTSE9SVF9CMwkxMwotI2RlZmluZSBTSE9SVF9CM2IJMTUKLSNkZWZpbmUgU0hPUlRfRDEJMTcKLSNkZWZpbmUgU0hPUlRfRDIJMTkKLSNkZWZpbmUgU0hPUlRfRDJCCTIxCi0jZGVmaW5lIFNIT1JUX1UJCTIzCS8qIHVuYXJ5IFNIT1JUX0EuICBBQlMgZm9yIGV4YW1wbGUgKi8KLSNkZWZpbmUgU0hPUlRfRgkJMjUJLyogU0hPUlRfQSB3aXRoIGZsYWcgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFNIT1JUX0FGCTI3CS8qIFNIT1JUX0Egd2l0aCBvbmx5IHRoZSBmaXJzdCByZWdpc3RlciBhIGZsYWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0hPUlRfVAkJMjkJLyogZm9yIHRyYXAgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgU0hPUlRfQTUJMzAJLyogU0hPUlRfQSB3aXRoIGEgNS1iaXQgaW1tZWRpYXRlIGluc3RlYWQgb2YgNiAqLwotI2RlZmluZSBTSE9SVF9DTVAJMzIJLyogc3BlY2lhbCBmb3JtIGZvciBDTVBjYyAqLwotI2RlZmluZSBTSE9SVF9DTVBVCTM0CS8qIHNwZWNpYWwgZm9ybSBmb3IgQ01QVWNjICovCi0jZGVmaW5lIFNIT1JUX0ExCTM2CS8qIHNwZWNpYWwgZm9ybSBvZiBTSE9SVF9BIGZvciBNQUNhIG9wY29kZXMgd2hlcmUgYT0xICovCi0jZGVmaW5lIFNIT1JUX0FBCTM4CS8qIFNIT1JUX0Egd2l0aCB0aGUgZmlyc3QgcmVnaXN0ZXIgYW4gYWNjdW11bGF0b3IgKi8KLSNkZWZpbmUgU0hPUlRfUkEJNDAJLyogU0hPUlRfQSB3aXRoIHRoZSBzZWNvbmQgcmVnaXN0ZXIgYW4gYWNjdW11bGF0b3IgKi8KLSNkZWZpbmUgU0hPUlRfTU9ESU5DCTQyCQotI2RlZmluZSBTSE9SVF9NT0RERUMJNDMKLSNkZWZpbmUgU0hPUlRfQzEJNDQKLSNkZWZpbmUgU0hPUlRfQzIJNDUKLSNkZWZpbmUgU0hPUlRfVUYJNDYKLSNkZWZpbmUgU0hPUlRfQTIJNDcKLSNkZWZpbmUgU0hPUlRfQTVTCTQ5Ci0jZGVmaW5lIFNIT1JUX05PTkUJNTEJLyogbm8gb3BlcmFuZHMgKi8KLSNkZWZpbmUgTE9ORwkJNTIKLSNkZWZpbmUgTE9OR19VCQk1MwkvKiB1bmFyeSBMT05HICovCi0jZGVmaW5lIExPTkdfQUYJCTU0CS8qIExPTkcgd2l0aCB0aGUgZmlyc3QgcmVnaXN0ZXIgYSBmbGFnIHJlZ2lzdGVyICovCi0jZGVmaW5lIExPTkdfQ01QCTU1CS8qIHNwZWNpYWwgZm9ybSBmb3IgQ01QY2MgYW5kIENNUFVjYyAqLwotI2RlZmluZSBMT05HX00JCTU2CS8qIE1lbW9yeSBsb25nIGZvciBsZGIsIHN0YiAqLwotI2RlZmluZSBMT05HX00yCQk1NwkvKiBNZW1vcnkgbG9uZyBmb3IgbGQydywgc3QydyAqLwotI2RlZmluZSBMT05HXzIJCTU4CS8qIExPTkcgd2l0aCAyIG9wZXJhbmRzOyBicmF0bnogKi8KLSNkZWZpbmUgTE9OR18yYgkJNTkJLyogTE9OR18yIHdpdGggbW9kaWZpZXIgb2YgMyAqLwotI2RlZmluZSBMT05HX0QJCTYwCS8qIGZvciBEQlJBSSovCi0jZGVmaW5lIExPTkdfRGIJCTYxCS8qIGZvciByZXBlYXRpKi8KLQotICAvKiB0aGUgZXhlY3V0aW9uIHVuaXQocykgdXNlZCAqLwotICBpbnQgdW5pdDsKLSNkZWZpbmUgRUlUSEVSCTAKLSNkZWZpbmUgSVUJMQotI2RlZmluZSBNVQkyCi0jZGVmaW5lIEVJVEhFUl9CVVRfUFJFRkVSX01VIDMKLQotICAvKiB0aGlzIGZpZWxkIGlzIHVzZWQgdG8gZGVjaWRlIGlmIHR3byBpbnN0cnVjdGlvbnMgKi8KLSAgLyogY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsICovCi0gIGxvbmcgZmxhZ3NfdXNlZDsKLSAgbG9uZyBmbGFnc19zZXQ7Ci0jZGVmaW5lIEZMQUdfMAkJKDFMPDwwKQotI2RlZmluZSBGTEFHXzEJCSgxTDw8MSkKLSNkZWZpbmUgRkxBR18yCQkoMUw8PDIpCi0jZGVmaW5lIEZMQUdfMwkJKDFMPDwzKQotI2RlZmluZSBGTEFHXzQJCSgxTDw8NCkJCS8qIFMgKHNhdHVyYXRpb24pICovCi0jZGVmaW5lIEZMQUdfNQkJKDFMPDw1KQkJLyogViAob3ZlcmZsb3cpICovCi0jZGVmaW5lIEZMQUdfNgkJKDFMPDw2KQkJLyogVkEgKGFjY3VtdWxhdGVkIG92ZXJmbG93KSAqLwotI2RlZmluZSBGTEFHXzcJCSgxTDw8NykJCS8qIEMgKGNhcnJ5L2JvcnJvdykgKi8KLSNkZWZpbmUgRkxBR19TTQkJKDFMPDw4KQkJLyogU00gKHN0YWNrIG1vZGUpICovCi0jZGVmaW5lIEZMQUdfUlAJCSgxTDw8OSkJCS8qIFJQIChyZXBlYXQgZW5hYmxlKSAqLwotI2RlZmluZSBGTEFHX0NPTlRST0wJKDFMPDwxMCkJLyogY29udHJvbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgRkxBR19BMAkJKDFMPDwxMSkJLyogQTAgKi8KLSNkZWZpbmUgRkxBR19BMQkJKDFMPDwxMikJLyogQTEgKi8KLSNkZWZpbmUgRkxBR19KTVAJKDFMPDwxMykJLyogaW5zdHJ1Y3Rpb24gaXMgYSBicmFuY2ggKi8KLSNkZWZpbmUgRkxBR19KU1IJKDFMPDwxNCkJLyogc3Vicm91dGluZSBjYWxsLiAgbXVzdCBiZSBhbGlnbmVkICovCi0jZGVmaW5lIEZMQUdfTUVNCSgxTDw8MTUpCS8qIHJlYWRzL3dyaXRlcyBtZW1vcnkgKi8KLSNkZWZpbmUgRkxBR18yV09SRAkoMUw8PDE2KQkvKiAyIHdvcmQvNCBieXRlIG9wZXJhdGlvbiAqLwotI2RlZmluZSBGTEFHX01VTDE2CSgxTDw8MTcpCS8qIDE2IGJpdCBtdWx0aXBseSAqLwotI2RlZmluZSBGTEFHX01VTDMyCSgxTDw8MTgpCS8qIDMyIGJpdCBtdWx0aXBseSAqLwotI2RlZmluZSBGTEFHX0FERFNVQnBwcAkoMUw8PDE5KQkvKiBBRERwcHAgb3IgU1VCcHBwICovCi0jZGVmaW5lIEZMQUdfREVMQVkJKDFMPDwyMCkJLyogVGhpcyBpcyBhIGRlbGF5ZWQgYnJhbmNoIG9yIGp1bXAgKi8KLSNkZWZpbmUgRkxBR19MS1IJKDFMPDwyMSkJLyogaW5zbiBpbiBsZWZ0IHNsb3Qga2lsbHMgcmlnaHQgc2xvdCAqLwotI2RlZmluZSBGTEFHX0NWVkEJKEZMQUdfNXxGTEFHXzZ8RkxBR183KQotI2RlZmluZSBGTEFHX0MJCUZMQUdfNwotI2RlZmluZSBGTEFHX0FMTAkoRkxBR18wIHwgXAotCQkJIEZMQUdfMSB8IFwKLQkJCSBGTEFHXzIgfCBcCi0JCQkgRkxBR18zIHwgXAotCQkJIEZMQUdfNCB8IFwKLQkJCSBGTEFHXzUgfCBcCi0JCQkgRkxBR182IHwgXAotCQkJIEZMQUdfNyB8IFwKLQkJCSBGTEFHX1NNIHwgXAotCQkJIEZMQUdfUlAgfCBcCi0JCQkgRkxBR19DT05UUk9MKQotCi0gIGludCByZWxvY19mbGFnOwotI2RlZmluZSBSRUxPQ19QQ1JFTAkxCi0jZGVmaW5lIFJFTE9DX0FCUwkyCi19OwotCi1leHRlcm4gY29uc3Qgc3RydWN0IGQzMHZfb3Bjb2RlIGQzMHZfb3Bjb2RlX3RhYmxlW107Ci1leHRlcm4gY29uc3QgaW50IGQzMHZfbnVtX29wY29kZXM7Ci0KLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgZDMwdl9vcGVyYW5kLiAgKi8KLXN0cnVjdCBkMzB2X29wZXJhbmQKLXsKLSAgLyogdGhlIGxlbmd0aCBvZiB0aGUgZmllbGQgKi8KLSAgaW50IGxlbmd0aDsKLQotICAvKiBUaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgYml0czsKLQotICAvKiBwb3NpdGlvbiByZWxhdGl2ZSB0byBSYSAqLwotICBpbnQgcG9zaXRpb247Ci0KLSAgLyogc3ludGF4IGZsYWdzLiAgKi8KLSAgbG9uZyBmbGFnczsKLX07Ci1leHRlcm4gY29uc3Qgc3RydWN0IGQzMHZfb3BlcmFuZCBkMzB2X29wZXJhbmRfdGFibGVbXTsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBkMzB2X29wZXJhbmQuICAqLwotCi0vKiB0aGlzIGlzIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlcjsgaXQgd2lsbCBiZSBtb2RpZmllZCAqLwotLyogdGhpcyBpcyB1c2VkIGJ5IHRoZSBvcHRpbWl6ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9ERVNUCSgxKQotCi0vKiBudW1iZXIgb3Igc3ltYm9sICovCi0jZGVmaW5lIE9QRVJBTkRfTlVNCSgyKQotCi0vKiBhZGRyZXNzIG9yIGxhYmVsICovCi0jZGVmaW5lIE9QRVJBTkRfQUREUgkoNCkKLQotLyogcmVnaXN0ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9SRUcJKDgpCi0KLS8qIHBvc3RpbmNyZW1lbnQgKyAgKi8KLSNkZWZpbmUgT1BFUkFORF9QTFVTCSgweDEwKQotCi0vKiBwb3N0ZGVjcmVtZW50IC0gICovCi0jZGVmaW5lIE9QRVJBTkRfTUlOVVMJKDB4MjApCi0KLS8qIHNpZ25lZCBudW1iZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9TSUdORUQJKDB4NDApCi0KLS8qIHRoaXMgb3BlcmFuZCBtdXN0IGJlIHNoaWZ0ZWQgbGVmdCBieSAzICovCi0jZGVmaW5lIE9QRVJBTkRfU0hJRlQJKDB4ODApCi0KLS8qIGZsYWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9GTEFHCSgweDEwMCkKLQotLyogY29udHJvbCByZWdpc3RlciAgKi8KLSNkZWZpbmUgT1BFUkFORF9DT05UUk9MCSgweDIwMCkKLQotLyogYWNjdW11bGF0b3IgKi8KLSNkZWZpbmUgT1BFUkFORF9BQ0MJKDB4NDAwKQotCi0vKiBAICAqLwotI2RlZmluZSBPUEVSQU5EX0FUU0lHTgkoMHg4MDApCi0KLS8qIEAoICAqLwotI2RlZmluZSBPUEVSQU5EX0FUUEFSCSgweDEwMDApCi0KLS8qIHByZWRlY3JlbWVudCBtb2RlICdALXNwJyAgKi8KLSNkZWZpbmUgT1BFUkFORF9BVE1JTlVTCSgweDIwMDApCi0KLS8qIHRoaXMgb3BlcmFuZCBjaGFuZ2VzIHRoZSBpbnN0cnVjdGlvbiBuYW1lICovCi0vKiBmb3IgZXhhbXBsZSwgQ1BNY2MsIENNUFVjYyAqLwotI2RlZmluZSBPUEVSQU5EX05BTUUJKDB4NDAwMCkKLQotLyogZmFrZSBvcGVyYW5kIGZvciBtdnRzeXMgYW5kIG12ZnN5cyAqLwotI2RlZmluZSBPUEVSQU5EX1NQRUNJQUwJKDB4ODAwMCkKLQotLyogbGV0IHRoZSBvcHRpbWl6ZXIga25vdyB0aGF0IHR3byByZWdpc3RlcnMgYXJlIGFmZmVjdGVkICovCi0jZGVmaW5lIE9QRVJBTkRfMlJFRwkoMHgxMDAwMCkKLQotLyogVGhlIGZvcm1hdCB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgZDMwdl9mb3JtYXQuICAqLwotc3RydWN0IGQzMHZfZm9ybWF0Ci17Ci0gIGludAlmb3JtOwkJLyogU0hPUlRfQSwgTE9ORywgZXRjICovCi0gIGludAltb2RpZmllcjsJLyogdHdvIGJpdCBtb2RpZmllciBmb2xsb3dpbmcgb3Bjb2RlICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbNV07Ci19OwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBkMzB2X2Zvcm1hdCBkMzB2X2Zvcm1hdF90YWJsZVtdOwotCi0KLS8qIGFuIGluc3RydWN0aW9uIGlzIGRlZmluZWQgYnkgYW4gb3Bjb2RlIGFuZCBhIGZvcm1hdCAqLwotLyogZm9yIGV4YW1wbGUsICJhZGQiIGhhcyBvbmUgb3Bjb2RlLCBidXQgdGhyZWUgZGlmZmVyZW50ICovCi0vKiBmb3JtYXRzLCAyIFNIT1JUX0EgZm9ybXMgYW5kIGEgTE9ORyBmb3JtLiAqLwotc3RydWN0IGQzMHZfaW5zbgotewotICBzdHJ1Y3QgZDMwdl9vcGNvZGUgKm9wOwkvKiBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBvcGNvZGUgdGFibGUgKi8KLSAgc3RydWN0IGQzMHZfZm9ybWF0ICpmb3JtOwkvKiBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBmb3JtYXQgdGFibGUgKi8KLSAgaW50IGVjYzsJCQkvKiBleGVjdXRpb24gY29uZGl0aW9uIGNvZGUgKi8KLX07Ci0KLS8qIGFuIGV4cHJlc3Npb25TIG9ubHkgaGFzIG9uZSByZWdpc3RlciB0eXBlLCBzbyB3ZSBmYWtlIGl0ICovCi0vKiBieSBzZXR0aW5nIGhpZ2ggYml0cyB0byBpbmRpY2F0ZSB0eXBlICovCi0jZGVmaW5lIFJFR0lTVEVSX01BU0sJMHhGRgotCi0jZW5kaWYgLyogRDMwVl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9oODMwMC5oIGIvaW5jbHVkZS9vcGNvZGUvaDgzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EwNWU0ZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9oODMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjA0ICswLDAgQEAKLS8qIE9wY29kZSB0YWJsZSBmb3IgdGhlIEg4LTMwMAotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiwgc2FjQGN5Z251cy5jb20uCi0gICAKLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBEZWJ1Z2dlciBhbmQgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgIAotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGFzIGEgc2VxdWVuY2Ugb2YgbmliYmxlcy4KLSAgIElmIHRoZSBuaWJibGUgaGFzIHZhbHVlIDE1IG9yIGxlc3MgdGhlbiB0aGUgcmVwcmVzZW50YXRpb24gaXMgY29tcGxldGUuCi0gICBPdGhlcndpc2UsIHdlIHJlY29yZCB3aGF0IGl0IGNvbnRhaW5zIHdpdGggc2V2ZXJhbCBmbGFncy4gICovCi0KLXR5cGVkZWYgaW50IG9wX3R5cGU7Ci0KLSNkZWZpbmUgSGV4MAkwCi0jZGVmaW5lIEhleDEgCTEKLSNkZWZpbmUgSGV4MiAJMgotI2RlZmluZSBIZXgzIAkzCi0jZGVmaW5lIEhleDQgCTQKLSNkZWZpbmUgSGV4NSAJNQotI2RlZmluZSBIZXg2IAk2Ci0jZGVmaW5lIEhleDcgCTcKLSNkZWZpbmUgSGV4OCAJOAotI2RlZmluZSBIZXg5IAk5Ci0jZGVmaW5lIEhleEEgCTEwCi0jZGVmaW5lIEhleEIgCTExCi0jZGVmaW5lIEhleEMgCTEyCi0jZGVmaW5lIEhleEQgCTEzCi0jZGVmaW5lIEhleEUgCTE0Ci0jZGVmaW5lIEhleEYgCTE1Ci0KLSNkZWZpbmUgTF84CQkweDAxCi0jZGVmaW5lIExfMTYJCTB4MDIKLSNkZWZpbmUgTF8zMgkJMHgwNAotI2RlZmluZSBMX1AgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBMXzI0CQkweDEwCi0jZGVmaW5lIE1FTVJFTEFYIAkweDIwCQkJLyogbW92ZSBpbnNuIHdoaWNoIG1heSByZWxheCAqLyAKLSNkZWZpbmUgU1JDICAgICAgICAgICAgIDB4NDAKLSNkZWZpbmUgRFNUICAgICAgICAgICAgIDB4ODAKLQotI2RlZmluZSBSRUcJCTB4MTAwCi0jZGVmaW5lIEVYUgkJMHgyMDAKLSNkZWZpbmUgTUFDUkVHCQkweDgwMAotI2RlZmluZSBTUkNfSU5fRFNUCTB4NDAwCi0jZGVmaW5lIElNTQkJMHgxMDAwCi0jZGVmaW5lIERJU1AJCTB4MjAwMAotI2RlZmluZSBJTkQJCTB4NDAwMAotI2RlZmluZSBJTkMJCTB4ODAwMAotI2RlZmluZSBERUMJCTB4MTAwMDAKLSNkZWZpbmUgTF8zCQkweDIwMDAwCi0jZGVmaW5lIEtCSVQgCQkweDQwMDAwCi0jZGVmaW5lIERCSVQgICAgICAgICAgICAweDgwMDAwCi0jZGVmaW5lIERJU1BSRUcgICAgICAgICAweDEwMDAwMAotI2RlZmluZSBJR05PUkUgCQkweDIwMDAwMAotI2RlZmluZSBFICAgICAgCQkweDQwMDAwMAkJLyogRklYTUU6IGVuZCBvZiBuaWJibGUgc2VxdWVuY2U/ICovCi0jZGVmaW5lIExfMgkJMHg4MDAwMDAKLSNkZWZpbmUgQjMwICAJCTB4MTAwMDAwMCAJCS8qIGJpdCAzIG11c3QgYmUgbG93ICovCi0jZGVmaW5lIEIzMSAgCQkweDIwMDAwMDAJCS8qIGJpdCAzIG11c3QgYmUgaGlnaCAqLwotI2RlZmluZSBDQ1IJCTB4NDAwMDAwMAotI2RlZmluZSBBQlMgICAgICAgICAgICAgMHg4MDAwMDAwCi0jZGVmaW5lIEFCU0pNUAkJMHgxMDAwMDAwMCAgCi0jZGVmaW5lIEFCUzhNRU0gICAgICAgICAweDIwMDAwMDAwCQotI2RlZmluZSBQQ1JFTCAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBNRU1JTkQgICAgICAgICAgMHg4MDAwMDAwMAotCi0jZGVmaW5lIElNTTMgCQlJTU18TF8zCi0jZGVmaW5lIElNTTIgCQlJTU18TF8yCi0KLSNkZWZpbmUgU0laRQkJKExfMnxMXzN8TF84fExfMTZ8TF8zMnxMX1B8TF8yNCkKLSNkZWZpbmUgTU9ERQkJKFJFR3xJTU18RElTUHxJTkR8SU5DfERFQ3xDQ1J8QUJTfE1FTUlORHxFWFIpCi0KLSNkZWZpbmUgUkQ4IAkJKERTVHxMXzh8UkVHKQotI2RlZmluZSBSRDE2IAkJKERTVHxMXzE2fFJFRykKLSNkZWZpbmUgUkQzMiAJCShEU1R8TF8zMnxSRUcpCi0jZGVmaW5lIFJTOCAJCShTUkN8TF84fFJFRykKLSNkZWZpbmUgUlMxNiAJCShTUkN8TF8xNnxSRUcpCi0jZGVmaW5lIFJTMzIJCShTUkN8TF8zMnxSRUcpCi0KLSNkZWZpbmUgUlNQIAkJKFNSQ3xMX1B8UkVHKQotI2RlZmluZSBSRFAgCQkoRFNUfExfUHxSRUcpCi0KLSNkZWZpbmUgSU1NOCAJCShJTU18U1JDfExfOCkKLSNkZWZpbmUgSU1NMTYgCQkoSU1NfFNSQ3xMXzE2KQotI2RlZmluZSBJTU0zMiAJCShJTU18U1JDfExfMzIpCi0KLSNkZWZpbmUgQUJTOFNSQyAJKFNSQ3xBQlN8TF84fEFCUzhNRU0pCi0jZGVmaW5lIEFCUzhEU1QJCShEU1R8QUJTfExfOHxBQlM4TUVNKQotCi0jZGVmaW5lIERJU1A4IAkJKFBDUkVMfExfOCkKLSNkZWZpbmUgRElTUDE2IAkJKFBDUkVMfExfMTYpCi0KLSNkZWZpbmUgRElTUDhTUkMJKERJU1B8TF84fFNSQykKLSNkZWZpbmUgRElTUDE2U1JDCShESVNQfExfMTZ8U1JDKQotCi0jZGVmaW5lIERJU1A4RFNUCShESVNQfExfOHxEU1QpCi0jZGVmaW5lIERJU1AxNkRTVAkoRElTUHxMXzE2fERTVCkKLQotI2RlZmluZSBBQlMxNlNSQyAJKFNSQ3xBQlN8TF8xNikKLSNkZWZpbmUgQUJTMTZEU1QgCShEU1R8QUJTfExfMTYpCi0jZGVmaW5lIEFCUzI0U1JDIAkoU1JDfEFCU3xMXzI0KQotI2RlZmluZSBBQlMyNERTVCAJKERTVHxBQlN8TF8yNCkKLSNkZWZpbmUgQUJTMzJTUkMgCShTUkN8QUJTfExfMzIpCi0jZGVmaW5lIEFCUzMyRFNUIAkoRFNUfEFCU3xMXzMyKQotCi0jZGVmaW5lIFJEREVDIAkJKERTVHxERUMpCi0jZGVmaW5lIFJTSU5DIAkJKFNSQ3xJTkMpCi0jZGVmaW5lIFJESU5DCQkoRFNUfElOQykKLQotI2RlZmluZSBSRElORCAJCShEU1R8SU5EKQotI2RlZmluZSBSU0lORCAJCShTUkN8SU5EKQotCi0jaWYgMQotI2RlZmluZSBPUjggUlM4CQkvKiA/Pz8gT1IgYXMgaW4gT25lIFJlZ2lzdGVyPyAqLwotI2RlZmluZSBPUjE2IFJTMTYKLSNkZWZpbmUgT1IzMiBSUzMyCi0jZWxzZQotI2RlZmluZSBPUjggUkQ4Ci0jZGVmaW5lIE9SMTYgUkQxNgotI2RlZmluZSBPUjMyIFJEMzIKLSNlbmRpZgotCi1zdHJ1Y3QgY29kZSAKLXsKLSAgb3BfdHlwZSBuaWJbMzBdOwotfTsKLQotc3RydWN0IGFyZyAKLXsKLSAgb3BfdHlwZSBuaWJbM107Ci19OwotCi1zdHJ1Y3QgaDhfb3Bjb2RlIAotewotICBpbnQgaG93OwotICBpbnQgaW5iYXNlOwotICBpbnQgdGltZTsKLSAgY2hhciAqbmFtZTsKLSAgc3RydWN0IGFyZyBhcmdzOwotICBzdHJ1Y3QgY29kZSBkYXRhOwotICBpbnQgbGVuZ3RoOwotICBpbnQgbm9wZXJhbmRzOwotICBpbnQgaWR4OwotICBpbnQgc2l6ZTsKLX07Ci0KLSNpZmRlZiBERUZJTkVfVEFCTEUKLQotI2RlZmluZSBCSVRPUChjb2RlLCBpbW0sIG5hbWUsIG9wMDAsIG9wMDEsb3AxMCxvcDExLCBvcDIwLG9wMjEsb3AzMClcCi17IGNvZGUsIDEsIDIsIG5hbWUsCXt7aW1tLFJEOCxFfX0sCXt7b3AwMCwgb3AwMSwgaW1tLCBSRDgsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sXAoteyBjb2RlLCAxLCA2LCBuYW1lLAl7e2ltbSxSRElORCxFfX0se3tvcDEwLCBvcDExLCBCMzB8UkRJTkQsIDAsIG9wMDAsb3AwMSwgaW1tLCAwLCBFfX0sIDAsIDAsIDAsIDB9LFwKLXsgY29kZSwgMSwgNiwgbmFtZSwJe3tpbW0sQUJTOERTVCxFfX0se3tvcDIwLCBvcDIxLCBBQlM4RFNULCBJR05PUkUsIG9wMDAsb3AwMSwgaW1tLCAwLEV9fSwgMCwgMCwgMCwgMH1cCi0seyBjb2RlLCAwLCA2LCBuYW1lLAl7e2ltbSxBQlMxNkRTVCxFfX0se3sweDYsMHhhLDB4MSxvcDMwLEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLCBvcDAwLG9wMDEsIGltbSwgMCxFfX0sIDAsIDAsIDAsIDB9LFwKLXsgY29kZSwgMCwgNiwgbmFtZSwJe3tpbW0sQUJTMzJEU1QsRX19LHt7MHg2LDB4YSwweDMsb3AzMCxBQlMzMkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsIG9wMDAsb3AwMSwgaW1tLCAwLEV9fSwgMCwgMCwgMCwgMH0KLQotCi0jZGVmaW5lIEVCSVRPUChjb2RlLCBpbW0sIG5hbWUsIG9wMDAsIG9wMDEsb3AxMCxvcDExLCBvcDIwLG9wMjEsb3AzMClcCi0gICBCSVRPUChjb2RlLGltbSwgbmFtZSwgb3AwMCsxLCBvcDAxLCBvcDEwLG9wMTEsIG9wMjAsb3AyMSxvcDMwKSxcCi0gICBCSVRPUChjb2RlLFJTOCwgIG5hbWUsIG9wMDAsIG9wMDEsIG9wMTAsb3AxMSwgb3AyMCxvcDIxLG9wMzApCi0KLSNkZWZpbmUgV1RXT1AoY29kZSxuYW1lLCBvcDEsIG9wMikgXAoteyBjb2RlLCAxLCAyLCBuYW1lLCB7e1JTMTYsIFJEMTYsIEV9fSwge3sgb3AxLCBvcDIsIFJTMTYsIFJEMTYsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0KLQotI2RlZmluZSBCUkFOQ0goY29kZSwgbmFtZSwgb3ApIFwKLXsgY29kZSwgMSwgNCxuYW1lLHt7RElTUDgsRSwwfX0sIHt7IDB4NCwgb3AsIERJU1A4LCBJR05PUkUsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sIFwKLXsgY29kZSwgMCwgNixuYW1lLHt7RElTUDE2LEUsMH19LCB7eyAweDUsIDB4OCwgb3AsIDB4MCwgRElTUDE2LCBJR05PUkUsIElHTk9SRSwgSUdOT1JFLCBFLDB9fSwgMCwgMCwgMCwgMH0gCi0KLSNkZWZpbmUgU09QKGNvZGUsIHgsbmFtZSkgXAote2NvZGUsIDEsIHgsICBuYW1lIAotCi0jZGVmaW5lIE5FV19TT1AoY29kZSwgaW4seCxuYW1lKSBcCi17Y29kZSwgaW4sIHgsICBuYW1lIAotI2RlZmluZSBFT1AgICwwLDAsMCB9Ci0KLSNkZWZpbmUgVFdPT1AoY29kZSwgbmFtZSwgb3AxLCBvcDIsb3AzKSBcCi17IGNvZGUsMSwgMixuYW1lLCB7e0lNTTgsIFJEOCwgRX19LAl7eyBvcDEsIFJEOCwgSU1NOCwgSUdOT1JFLCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9LFwKLXsgY29kZSwgMSwgMixuYW1lLCB7e1JTOCwgUkQ4LCBFfX0sCXt7IG9wMiwgb3AzLCBSUzgsIFJEOCwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSAKLQotI2RlZmluZSBVTk9QKGNvZGUsbmFtZSwgb3AxLCBvcDIpIFwKLXsgY29kZSwgMSwgMiwgbmFtZSwge3tPUjgsIEUsIDB9fSwge3sgb3AxLCBvcDIsIDAsIE9SOCwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfQotCi0jZGVmaW5lIFVOT1AzKGNvZGUsIG5hbWUsIG9wMSwgb3AyLCBvcDMpIFwKLXsgTyhjb2RlLFNCKSwgMSwgMiwgbmFtZSwge3tPUjgsICBFLCAwfX0sIHt7b3AxLCBvcDIsIG9wMyswLCBPUjgsICBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9LCBcCi17IE8oY29kZSxTVyksIDAsIDIsIG5hbWUsIHt7T1IxNiwgRSwgMH19LCB7e29wMSwgb3AyLCBvcDMrMSwgT1IxNiwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSwgXAoteyBPKGNvZGUsU0wpLCAwLCAyLCBuYW1lLCB7e09SMzIsIEUsIDB9fSwge3tvcDEsIG9wMiwgb3AzKzMsIE9SMzJ8QjMwLCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9IFwKLSx7IE8oY29kZSxTQiksIDEsIDIsIG5hbWUsIHt7SU1NLCBPUjggfCBTUkNfSU5fRFNULCAgRX19LCB7e29wMSwgb3AyLCBvcDMrNCwgT1I4IHwgU1JDX0lOX0RTVCwgIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sIFwKLXsgTyhjb2RlLFNXKSwgMCwgMiwgbmFtZSwge3tJTU0sIE9SMTYgfCBTUkNfSU5fRFNULCBFfX0sIHt7b3AxLCBvcDIsIG9wMys1LCBPUjE2IHwgU1JDX0lOX0RTVCwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSwgXAoteyBPKGNvZGUsU0wpLCAwLCAyLCBuYW1lLCB7e0lNTSwgT1IzMiB8IFNSQ19JTl9EU1QsIEV9fSwge3tvcDEsIG9wMiwgb3AzKzcsIE9SMzIgfCBTUkNfSU5fRFNUfEIzMCAsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0KLQotCi0jZGVmaW5lIElNTTMyTElTVCBJTU0zMixJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgSU1NMjRMSVNUIElNTTI0LElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgSU1NMTZMSVNUIElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIEExNkxJU1QgTF8xNixJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBESVNQMjRMSVNUIERJU1B8TF8yNCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIERJU1AzMkxJU1QgRElTUHxMXzMyLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBBQlMyNExJU1QgQUJTfExfMjQsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBBQlMzMkxJU1QgQUJTfExfMzIsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIEEyNExJU1QgTF8yNCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIEEzMkxJU1QgTF8zMixJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgUFJFRklYMzIgMHgwLDB4MSwweDAsMHgwCi0jZGVmaW5lIFBSRUZJWExEQyAweDAsMHgxLDB4NCwweDAKLQotCi0jZGVmaW5lIE8ob3AsIHNpemUpIChvcCo0K3NpemUpCi0KLSNkZWZpbmUgT19SRUNPTVBJTEUgMAotI2RlZmluZSBPX0FERCAgMQotI2RlZmluZSBPX0FERFggMgotI2RlZmluZSBPX0FORCAgMwotI2RlZmluZSBPX0JBTkQgNAotI2RlZmluZSBPX0JSQSAgNQotI2RlZmluZSBPX0JSTiAgNgotI2RlZmluZSBPX0JISSAgNwotI2RlZmluZSBPX0JMUyAgOAotI2RlZmluZSBPX0JDQyAgOQotI2RlZmluZSBPX0JDUyAgMTAKLSNkZWZpbmUgT19CTkUgIDExICAKLSNkZWZpbmUgT19CVkMgIDEyCi0jZGVmaW5lIE9fQlZTICAxMwotI2RlZmluZSBPX0JQTCAgMTQKLSNkZWZpbmUgT19CTUkgIDE1Ci0jZGVmaW5lIE9fQkdFICAxNgotI2RlZmluZSBPX0JMVCAgMTcKLSNkZWZpbmUgT19CR1QgIDE4Ci0jZGVmaW5lIE9fQkxFICAxOQotI2RlZmluZSBPX0FOREMgMjAKLSNkZWZpbmUgT19CRVEgMjEKLSNkZWZpbmUgT19CQ0xSIDIyCi0jZGVmaW5lIE9fQklBTkQgMjMKLSNkZWZpbmUgT19CSUxEIDI0Ci0jZGVmaW5lIE9fQklPUiAyNQotI2RlZmluZSBPX0JJWE9SIDI2Ci0jZGVmaW5lIE9fQklTVCAyNwotI2RlZmluZSBPX0JMRCAyOAotI2RlZmluZSBPX0JOT1QgMjkKLSNkZWZpbmUgT19CU0VUIDMwCi0jZGVmaW5lIE9fQlNSIDMxCi0jZGVmaW5lIE9fQlhPUiAzMgotI2RlZmluZSBPX0NNUCAzMwotI2RlZmluZSBPX0RBQSAzNAotI2RlZmluZSBPX0RBUyAzNQotI2RlZmluZSBPX0RFQyAzNgotI2RlZmluZSBPX0RJVlUgMzcKLSNkZWZpbmUgT19ESVZTIDM4Ci0jZGVmaW5lIE9fSU5DIDM5Ci0jZGVmaW5lIE9fTERDIDQwCi0jZGVmaW5lIE9fTU9WX1RPX01FTSA0MQotI2RlZmluZSBPX09SIDQyCi0jZGVmaW5lIE9fUk9UTCA0MwotI2RlZmluZSBPX1JPVFIgNDQKLSNkZWZpbmUgT19ST1RYTCA0NQotI2RlZmluZSBPX1JPVFhSIDQ2Ci0jZGVmaW5lIE9fQlBUIDQ3Ci0jZGVmaW5lIE9fU0hBTCA0OAotI2RlZmluZSBPX1NIQVIgNDkKLSNkZWZpbmUgT19TSExMIDUwCi0jZGVmaW5lIE9fU0hMUiA1MQotI2RlZmluZSBPX1NVQiAgNTIKLSNkZWZpbmUgT19TVUJTIDUzCi0jZGVmaW5lIE9fVFJBUEEgNTQKLSNkZWZpbmUgT19YT1IgNTUKLSNkZWZpbmUgT19YT1JDIDU2Ci0jZGVmaW5lIE9fQk9SIDU3Ci0jZGVmaW5lIE9fQlNUIDU4Ci0jZGVmaW5lIE9fQlRTVCA1OQotI2RlZmluZSBPX0VFUE1PViA2MAotI2RlZmluZSBPX0VYVFMgNjEKLSNkZWZpbmUgT19FWFRVIDYyCi0jZGVmaW5lIE9fSk1QIDYzCi0jZGVmaW5lIE9fSlNSIDY0Ci0jZGVmaW5lIE9fTVVMVSA2NQotI2RlZmluZSBPX01VTFMgNjYKLSNkZWZpbmUgT19OT1AgNjcKLSNkZWZpbmUgT19OT1QgNjgKLSNkZWZpbmUgT19PUkMgNjkKLSNkZWZpbmUgT19SVEUgNzAKLSNkZWZpbmUgT19TVEMgNzEKLSNkZWZpbmUgT19TVUJYIDcyCi0jZGVmaW5lIE9fTkVHIDczCi0jZGVmaW5lIE9fUlRTIDc0Ci0jZGVmaW5lIE9fU0xFRVAgNzUKLSNkZWZpbmUgT19JTEwgNzYKLSNkZWZpbmUgT19BRERTIDc3Ci0jZGVmaW5lIE9fU1lTQ0FMTCA3OAotI2RlZmluZSBPX01PVl9UT19SRUcgNzkKLSNkZWZpbmUgT19UQVMgODAKLSNkZWZpbmUgT19DTFJNQUMgODIKLSNkZWZpbmUgT19MRE1BQyA4MwotI2RlZmluZSBPX01BQyA4NAotI2RlZmluZSBPX0xETSA4NQotI2RlZmluZSBPX1NUTSA4NgotI2RlZmluZSBPX1NUTUFDIDg3Ci0jZGVmaW5lIE9fTEFTVCA4OAotI2RlZmluZSBTQiAwCi0jZGVmaW5lIFNXIDEKLSNkZWZpbmUgU0wgMgotI2RlZmluZSBTTiAzCi0KLQotLyogRklYTUU6IExvdHMgb2YgaW5zbnMgaGF2ZSAiRSwgMCwgMCwgMCwgMCIgaW4gdGhlIG5pYmJsZSBjb2RlIHNlcXVlbmNlcy4KLSAgIE1ldGhpbmtzIHRoZSB6ZXJvZXMgYXJlbid0IG5lY2Vzc2FyeS4gIE9uY2UgY29uZmlybWVkLCBudWtlICdlbS4gICovCi0KLXN0cnVjdCBoOF9vcGNvZGUgaDhfb3Bjb2Rlc1tdID0gCi17Ci0gIFRXT09QKE8oT19BREQsU0IpLCJhZGQuYiIsIDB4OCwgMHgwLDB4OCksCi0gIAotICBORVdfU09QKE8oT19BREQsU1cpLDEsMiwiYWRkLnciKSx7e1JTMTYsUkQxNixFfX0se3sweDAsMHg5LFJTMTYsUkQxNixFfX0gRU9QLAotICBORVdfU09QKE8oT19BREQsU1cpLDAsNCwiYWRkLnciKSx7e0lNTTE2LFJEMTYsRX19LHt7MHg3LDB4OSwweDEsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX0gRU9QLAotICBORVdfU09QKE8oT19BREQsU0wpLDAsMiwiYWRkLmwiKSx7e1JTMzIsUkQzMixFIH19LCB7ezB4MCwweEEsQjMxfFJTMzIsQjMwfFJEMzIsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQURELFNMKSwwLDYsImFkZC5sIikse3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4MSxCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQUREUyxTTCksMSwyLCJhZGRzIiksIHt7S0JJVCxSRFAsRX19LCAgIHt7MHgwLDB4QixLQklULFJEUCxFLDAsMCwwLDB9fSBFT1AsCi0KLSAgVFdPT1AoTyhPX0FERFgsU0IpLCJhZGR4IiwweDksMHgwLDB4RSksCi0gIFRXT09QKE8oT19BTkQsU0IpLCAiYW5kLmIiLDB4RSwweDEsMHg2KSwKLQotICBORVdfU09QKE8oT19BTkQsU1cpLDAsMiwiYW5kLnciKSx7e1JTMTYsUkQxNixFIH19LHt7MHg2LDB4NixSUzE2LFJEMTYsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQU5ELFNXKSwwLDQsImFuZC53Iikse3tJTU0xNixSRDE2LEUgfX0se3sweDcsMHg5LDB4NixSRDE2LElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fSBFT1AsCi0gIAotICBORVdfU09QKE8oT19BTkQsU0wpLDAsNiwiYW5kLmwiKSx7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHg2LEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAotICBORVdfU09QKE8oT19BTkQsU0wpLDAsMiwiYW5kLmwiKSAse3tSUzMyLFJEMzIsRSB9fSx7ezB4MCwweDEsMHhGLDB4MCwweDYsMHg2LEIzMHxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fQU5EQyxTQiksMSwyLCJhbmRjIiksIHt7SU1NOCxDQ1IsRX19LHt7IDB4MCwweDYsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX0gRU9QLAotICBORVdfU09QKE8oT19BTkRDLFNCKSwxLDIsImFuZGMiKSwge3tJTU04LEVYUixFfX0se3sgMHgwLDB4MSwweDQsMHgxLDB4MCwweDYsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX0gRU9QLAotCi0gIEJJVE9QKE8oT19CQU5ELFNCKSwgSU1NM3xCMzAsImJhbmQiLDB4NywweDYsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEJSQU5DSChPKE9fQlJBLFNCKSwiYnJhIiwweDApLAotICBCUkFOQ0goTyhPX0JSQSxTQiksImJ0IiwweDApLAotICBCUkFOQ0goTyhPX0JSTixTQiksImJybiIsMHgxKSwKLSAgQlJBTkNIKE8oT19CUk4sU0IpLCJiZiIsMHgxKSwKLSAgQlJBTkNIKE8oT19CSEksU0IpLCJiaGkiLDB4MiksCi0gIEJSQU5DSChPKE9fQkxTLFNCKSwiYmxzIiwweDMpLAotICBCUkFOQ0goTyhPX0JDQyxTQiksImJjYyIsMHg0KSwKLSAgQlJBTkNIKE8oT19CQ0MsU0IpLCJiaHMiLDB4NCksCi0gIEJSQU5DSChPKE9fQkNTLFNCKSwiYmNzIiwweDUpLAotICBCUkFOQ0goTyhPX0JDUyxTQiksImJsbyIsMHg1KSwKLSAgQlJBTkNIKE8oT19CTkUsU0IpLCJibmUiLDB4NiksCi0gIEJSQU5DSChPKE9fQkVRLFNCKSwiYmVxIiwweDcpLAotICBCUkFOQ0goTyhPX0JWQyxTQiksImJ2YyIsMHg4KSwKLSAgQlJBTkNIKE8oT19CVlMsU0IpLCJidnMiLDB4OSksCi0gIEJSQU5DSChPKE9fQlBMLFNCKSwiYnBsIiwweEEpLAotICBCUkFOQ0goTyhPX0JNSSxTQiksImJtaSIsMHhCKSwKLSAgQlJBTkNIKE8oT19CR0UsU0IpLCJiZ2UiLDB4QyksCi0gIEJSQU5DSChPKE9fQkxULFNCKSwiYmx0IiwweEQpLAotICBCUkFOQ0goTyhPX0JHVCxTQiksImJndCIsMHhFKSwKLSAgQlJBTkNIKE8oT19CTEUsU0IpLCJibGUiLDB4RiksCi0KLSAgRUJJVE9QKE8oT19CQ0xSLFNCKSxJTU0zfEIzMCwiYmNsciIsIDB4NiwweDIsMHg3LDB4RCwweDcsMHhGLDB4OCksCi0gIEJJVE9QKE8oT19CSUFORCxTQiksSU1NM3xCMzEsImJpYW5kIiwweDcsMHg2LDB4NywweEMsMHg3LDB4RSwweDApLAotICBCSVRPUChPKE9fQklMRCxTQiksIElNTTN8QjMxLCJiaWxkIiwgMHg3LDB4NywweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgQklUT1AoTyhPX0JJT1IsU0IpLCBJTU0zfEIzMSwiYmlvciIsIDB4NywweDQsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEJJVE9QKE8oT19CSVNULFNCKSwgSU1NM3xCMzEsImJpc3QiLCAweDYsMHg3LDB4NywweEQsMHg3LDB4RiwweDgpLAotICBCSVRPUChPKE9fQklYT1IsU0IpLElNTTN8QjMxLCJiaXhvciIsMHg3LDB4NSwweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgQklUT1AoTyhPX0JMRCxTQiksICBJTU0zfEIzMCwiYmxkIiwgIDB4NywweDcsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEVCSVRPUChPKE9fQk5PVCxTQiksSU1NM3xCMzAsImJub3QiLCAweDYsMHgxLDB4NywweEQsMHg3LDB4RiwweDgpLAotICBCSVRPUChPKE9fQk9SLFNCKSwgIElNTTN8QjMwLCJib3IiLCAgMHg3LDB4NCwweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgRUJJVE9QKE8oT19CU0VULFNCKSxJTU0zfEIzMCwiYnNldCIsIDB4NiwweDAsMHg3LDB4RCwweDcsMHhGLDB4OCksCi0KLSAgU09QKE8oT19CU1IsU0IpLDYsImJzciIpLHt7RElTUDgsRSwwfX0se3sgMHg1LDB4NSxESVNQOCxJR05PUkUsRSwwLDAsMCwwfX0gRU9QLAotICBTT1AoTyhPX0JTUixTQiksNiwiYnNyIikse3tESVNQMTYsRSwwfX0se3sgMHg1LDB4QywweDAsMHgwLERJU1AxNixJR05PUkUsSUdOT1JFLElHTk9SRSxFLDAsMCwwLDB9fSBFT1AsCi0gIEJJVE9QKE8oT19CU1QsU0IpLCBJTU0zfEIzMCwiYnN0IiwweDYsMHg3LDB4NywweEQsMHg3LDB4RiwweDgpLAotICBFQklUT1AoTyhPX0JUU1QsU0IpLCBJTU0zfEIzMCwiYnRzdCIsMHg2LDB4MywweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgQklUT1AoTyhPX0JYT1IsU0IpLCBJTU0zfEIzMCwiYnhvciIsMHg3LDB4NSwweDcsMHhDLDB4NywweEUsMHgwKSwKLQotICBUV09PUChPKE9fQ01QLFNCKSwgImNtcC5iIiwweEEsMHgxLDB4QyksCi0gIFdUV09QKE8oT19DTVAsU1cpLCAiY21wLnciLDB4MSwweEQpLAotCi0gIE5FV19TT1AoTyhPX0NNUCxTVyksMSwyLCJjbXAudyIpLHt7UlMxNixSRDE2LEUgfX0se3sweDEsMHhELFJTMTYsUkQxNixFfX0gRU9QLAotICBORVdfU09QKE8oT19DTVAsU1cpLDAsNCwiY21wLnciKSx7e0lNTTE2LFJEMTYsRSB9fSx7ezB4NywweDksMHgyLFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19DTVAsU0wpLDAsNiwiY21wLmwiKSx7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHgyLEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAotICBORVdfU09QKE8oT19DTVAsU0wpLDAsMiwiY21wLmwiKSAse3tSUzMyLFJEMzIsRSB9fSx7ezB4MSwweEYsQjMxfFJTMzIsQjMwfFJEMzIsRX19IEVPUCwKLQotICBVTk9QKE8oT19EQUEsU0IpLCAiZGFhIiwweDAsMHhGKSwKLSAgVU5PUChPKE9fREFTLFNCKSwgImRhcyIsMHgxLDB4RiksCi0gIFVOT1AoTyhPX0RFQyxTQiksICJkZWMuYiIsMHgxLDB4QSksCi0KLSAgTkVXX1NPUChPKE9fREVDLCBTVyksMCwyLCJkZWMudyIpICx7e0RCSVQsUkQxNixFIH19LHt7MHgxLDB4QiwweDV8REJJVCxSRDE2LEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0RFQywgU0wpLDAsMiwiZGVjLmwiKSAse3tEQklULFJEMzIsRSB9fSx7ezB4MSwweEIsMHg3fERCSVQsUkQzMnxCMzAsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19ESVZVLFNCKSwxLDYsImRpdnh1LmIiKSwge3tSUzgsUkQxNixFfX0sIHt7MHg1LDB4MSxSUzgsUkQxNixFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fRElWVSxTVyksMCwyMCwiZGl2eHUudyIpLHt7UlMxNixSRDMyLEV9fSx7ezB4NSwweDMsUlMxNixCMzB8UkQzMixFfX1FT1AsCi0gICAgCi0gIE5FV19TT1AoTyhPX0RJVlMsU0IpLDAsMjAsImRpdnhzLmIiKSAse3tSUzgsUkQxNixFIH19LHt7MHgwLDB4MSwweEQsMHgwLDB4NSwweDEsUlM4LFJEMTYsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fRElWUyxTVyksMCwwMiwiZGl2eHMudyIpICx7e1JTMTYsUkQzMixFIH19LHt7MHgwLDB4MSwweEQsMHgwLDB4NSwweDMsUlMxNixCMzB8UkQzMixFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX0VFUE1PVixTQiksMSw1MCwiZWVwbW92LmIiKSx7e0UsMCwwfX0se3sweDcsMHhCLDB4NSwweEMsMHg1LDB4OSwweDgsMHhGLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fRUVQTU9WLFNXKSwwLDUwLCJlZXBtb3YudyIpLHt7RSwwLDB9fSx7ezB4NywweEIsMHhELDB4NCwweDUsMHg5LDB4OCwweEYsRX19IEVPUCwKLSAgICAKLSAgTkVXX1NPUChPKE9fRVhUUyxTVyksMCwyLCJleHRzLnciKSx7e09SMTYsRSwwfX0se3sweDEsMHg3LDB4RCxPUjE2LEUgICB9fUVPUCwKLSAgTkVXX1NPUChPKE9fRVhUUyxTTCksMCwyLCJleHRzLmwiKSx7e09SMzIsRSwwfX0se3sweDEsMHg3LDB4RixPUjMyfEIzMCxFICAgfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fRVhUVSxTVyksMCwyLCJleHR1LnciKSx7e09SMTYsRSwwfX0se3sweDEsMHg3LDB4NSxPUjE2LEUgICB9fUVPUCwKLSAgTkVXX1NPUChPKE9fRVhUVSxTTCksMCwyLCJleHR1LmwiKSx7e09SMzIsRSwwfX0se3sweDEsMHg3LDB4NyxPUjMyfEIzMCxFICAgfX1FT1AsCi0gICAgCi0gIFVOT1AoTyhPX0lOQyxTQiksICJpbmMiLDB4MCwweEEpLAotCi0gIE5FV19TT1AoTyhPX0lOQyxTVyksMCwyLCJpbmMudyIpICx7e0RCSVQsUkQxNixFIH19LHt7MHgwLDB4QiwweDV8REJJVCxSRDE2LEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0lOQyxTTCksMCwyLCJpbmMubCIpICx7e0RCSVQsUkQzMixFIH19LHt7MHgwLDB4QiwweDd8REJJVCxSRDMyfEIzMCxFfX0gRU9QLAotCi0gIFNPUChPKE9fSk1QLFNCKSw0LCJqbXAiKSx7e1JTSU5ELEUsMH19LHt7MHg1LDB4OSxCMzB8UlNJTkQsMHgwLEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX0pNUCxTQiksNiwiam1wIikse3tTUkN8QUJTSk1QLEUsMH19LHt7MHg1LDB4QSxTUkN8QUJTSk1QLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBTT1AoTyhPX0pNUCxTQiksOCwiam1wIikse3tTUkN8TUVNSU5ELEUsMH19LHt7MHg1LDB4QixTUkN8TUVNSU5ELElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLQotICBTT1AoTyhPX0pTUixTQiksNiwianNyIikse3tTUkN8UlNJTkQsRSwwfX0sIHt7MHg1LDB4RCxCMzB8UlNJTkQsMHgwLEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX0pTUixTQiksOCwianNyIikse3tTUkN8QUJTSk1QLEUsMH19LHt7MHg1LDB4RSxTUkN8QUJTSk1QLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBTT1AoTyhPX0pTUixTQiksOCwianNyIikse3tTUkN8TUVNSU5ELEUsMH19LHt7MHg1LDB4RixTUkN8TUVNSU5ELElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLQotICBORVdfU09QKE8oT19MREMsU0IpLDEsMiwibGRjIikse3tJTU04LENDUixFfX0sICAgICAgICAge3sgMHgwLDB4NyxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwxLDIsImxkYyIpLHt7T1I4LENDUixFfX0sICAgICAgICAgIHt7IDB4MCwweDMsMHgwLE9SOCxFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7QUJTMTZTUkMsQ0NSLEV9fSwgICAgIHt7UFJFRklYTERDLDB4NiwweEIsMHgwLDB4MCxBQlMxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0FCUzMyU1JDLENDUixFfX0sICAgICB7e1BSRUZJWExEQywweDYsMHhCLDB4MiwweDAsU1JDfEFCUzMyTElTVCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0RJU1B8U1JDfExfMTYsQ0NSLEV9fSx7e1BSRUZJWExEQywweDYsMHhGLEIzMHxESVNQUkVHLDAsRElTUHxMXzE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7RElTUHxTUkN8TF8zMixDQ1IsRX19LHt7UFJFRklYTERDLDB4NywweDgsQjMwfERJU1BSRUcsMCwweDYsMHhCLDB4MiwweDAsU1JDfERJU1AzMkxJU1QsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tSU0lOQyxDQ1IsRX19LCAgICAgICAge3tQUkVGSVhMREMsMHg2LDB4RCxCMzB8UlNJTkMsMHgwLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7UlNJTkQsQ0NSLEV9fSwgICAgICAgIHt7UFJFRklYTERDLDB4NiwweDksQjMwfFJESU5ELDB4MCxFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMSwyLCJsZGMiKSx7e0lNTTgsRVhSLEV9fSwgICAgICAgICB7eyAweDAsMHgxLDB4NCwweDEsMHgwLDB4NyxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwxLDIsImxkYyIpLHt7T1I4LEVYUixFfX0sICAgICAgICAgIHt7IDB4MCwweDMsMHgxLE9SOCxFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7QUJTMTZTUkMsRVhSLEV9fSwgICAgIHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHhiLDB4MCwweDAsQUJTMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tBQlMzMlNSQyxFWFIsRX19LCAgICAge3sgMHgwLDB4MSwweDQsMHgxLDB4NiwweGIsMHgyLDB4MCxTUkN8QUJTMzJMSVNULEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7RElTUHxTUkN8TF8xNixFWFIsRX19LHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHhmLEIzMHxESVNQUkVHLDAsRElTUHxMXzE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7RElTUHxTUkN8TF8zMixFWFIsRX19LHt7IDB4MCwweDEsMHg0LDB4MSwweDcsMHg4LEIzMHxESVNQUkVHLDAsMHg2LDB4QiwweDIsMHgwLFNSQ3xESVNQMzJMSVNULEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7UlNJTkMsRVhSLEV9fSwgICAgICAgIHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHhkLEIzMHxSU0lOQywweDAsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tSU0lORCxFWFIsRX19LCAgICAgICAge3sgMHgwLDB4MSwweDQsMHgxLDB4NiwweDksQjMwfFJESU5ELDB4MCxFfX0gRU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNCwibW92LmIiKSx7e0FCU3xTUkN8TF8xNnxNRU1SRUxBWCxSRDgsRX19LCAge3sgMHg2LDB4QSwweDAsUkQ4LFNSQ3xBQlN8TUVNUkVMQVh8QTE2TElTVCxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNiwibW92LmIiKSx7e0FCU3xTUkN8TF8zMnxNRU1SRUxBWCxSRDgsRSB9fSwge3sgMHg2LDB4QSwweDIsUkQ4LFNSQ3xBQlN8TUVNUkVMQVh8QTMyTElTVCxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDQsIm1vdi5iIikse3tSUzgsQUJTfExfMTZ8TUVNUkVMQVh8RFNULEV9fSwgICAgIHt7IDB4NiwweEEsMHg4LFJTOCxEU1R8QUJTfE1FTVJFTEFYfEExNkxJU1QsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDYsIm1vdi5iIikse3tSUzgsQUJTfERTVHxMXzMyfE1FTVJFTEFYLEUgfX0sICAgIHt7IDB4NiwweEEsMHhBLFJTOCxEU1R8QUJTfE1FTVJFTEFYfEEzMkxJU1QsRSB9fUVPUCwKLSAgICAKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSw2LCJtb3YuYiIpLHt7RElTUHxMXzMyfFNSQyxSRDgsRX19LCAge3sgMHg3LDB4OCxCMzB8RElTUFJFRywweDAsMHg2LDB4QSwweDIsUkQ4LFNSQ3xESVNQMzJMSVNULEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw2LCJtb3YuYiIpLHt7UlM4LERJU1B8TF8zMnxEU1QsRX19LCAge3sgMHg3LDB4OCxCMzB8RElTUFJFRywweDAsMHg2LDB4QSwweEEsUlM4LERTVHxESVNQMzJMSVNULEV9fUVPUCwKLQotCi0KLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSwyLCJtb3YuYiIpLHt7UlM4LFJEOCxFfX0sCSAgICB7eyAweDAsMHhDLFJTOCxSRDgsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksMiwibW92LmIiKSx7e0lNTTgsUkQ4LEV9fSwgICAgICAgICAgIHt7IDB4RixSRDgsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNCwibW92LmIiKSx7e1JTSU5ELFJEOCxFfX0sICAgICAgICAgIHt7IDB4NiwweDgsQjMwfFJTSU5ELFJEOCxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSw2LCJtb3YuYiIpLHt7RElTUDE2U1JDLFJEOCxFfX0sICAgICAge3sgMHg2LDB4RSxCMzB8RElTUFJFRyxSRDgsRElTUDE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSw2LCJtb3YuYiIpLHt7UlNJTkMsUkQ4LEV9fSwgICAgICAgICAge3sgMHg2LDB4QyxCMzB8UlNJTkMsUkQ4LEUsMCwwLDAsMH19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNCwibW92LmIiKSx7e0FCUzhTUkMsUkQ4LEV9fSwgICAgICAgIHt7IDB4MixSRDgsQUJTOFNSQyxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNCwibW92LmIiKSx7e1JTOCxSRElORCxFfX0sICAgICAgICAgIHt7IDB4NiwweDgsUkRJTkR8QjMxLFJTOCxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw2LCJtb3YuYiIpLHt7UlM4LERJU1AxNkRTVCxFfX0sICAgICAge3sgMHg2LDB4RSxESVNQUkVHfEIzMSxSUzgsRElTUDE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw2LCJtb3YuYiIpLHt7UlM4LFJEREVDfEIzMSxFfX0sICAgICAge3sgMHg2LDB4QyxSRERFQ3xCMzEsUlM4LEUsMCwwLDAsMH19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNCwibW92LmIiKSx7e1JTOCxBQlM4RFNULEV9fSwgICAgICAgIHt7IDB4MyxSUzgsQUJTOERTVCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0KLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixSRElORCxFfX0sICAgICAgICB7eyAweDYsMHg5LFJESU5EfEIzMSxSUzE2LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tESVNQfExfMzJ8U1JDLFJEMTYsRX19LHt7IDB4NywweDgsQjMwfERJU1BSRUcsMHgwLDB4NiwweEIsMHgyLFJEMTYsU1JDfERJU1AzMkxJU1QsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU1cpLDYsIm1vdi53Iikse3tSUzE2LERJU1B8TF8zMnxEU1QsRX19LHt7IDB4NywweDgsQjMwfERJU1BSRUcsMHgwLDB4NiwweEIsMHhBLFJTMTYsRFNUfERJU1AzMkxJU1QsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tBQlN8TF8zMnxNRU1SRUxBWHxTUkMsUkQxNixFIH19LHt7IDB4NiwweEIsMHgyLFJEMTYsU1JDfE1FTVJFTEFYfEFCUzMyTElTVCxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU1cpLDYsIm1vdi53Iikse3tSUzE2LEFCU3xMXzMyfE1FTVJFTEFYfERTVCxFIH19LHt7IDB4NiwweEIsMHhBLFJTMTYsRFNUfE1FTVJFTEFYfEFCUzMyTElTVCxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDIsIm1vdi53Iikse3tSUzE2LFJEMTYsRX19LCAgICAgICAgIHt7IDB4MCwweEQsUlMxNiwgUkQxNixFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw0LCJtb3YudyIpLHt7SU1NMTYsUkQxNixFfX0sICAgICAgICB7eyAweDcsMHg5LDB4MCxSRDE2LElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw0LCJtb3YudyIpLHt7UlNJTkQsUkQxNixFfX0sICAgICAgICB7eyAweDYsMHg5LEIzMHxSU0lORCxSRDE2LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tESVNQMTZTUkMsUkQxNixFfX0sICAgIHt7IDB4NiwweEYsQjMwfERJU1BSRUcsUkQxNixESVNQMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tSU0lOQyxSRDE2LEV9fSwgICAgICAgIHt7IDB4NiwweEQsQjMwfFJTSU5DLFJEMTYsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTVyksNiwibW92LnciKSx7e0FCUzE2U1JDLFJEMTYsRX19LCAgICAge3sgMHg2LDB4QiwweDAsUkQxNixBQlMxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0KLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixESVNQMTZEU1QsRX19LCAgICB7eyAweDYsMHhGLERJU1BSRUd8QjMxLFJTMTYsRElTUDE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixSRERFQyxFfX0sICAgICAgICB7eyAweDYsMHhELFJEREVDfEIzMSxSUzE2LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU1cpLDYsIm1vdi53Iikse3tSUzE2LEFCUzE2RFNULEV9fSwgICAgIHt7IDB4NiwweEIsMHg4LFJTMTYsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNCwibW92LmwiKSx7e0lNTTMyLFJEMzIsRX19LCAgICAgICAge3sgMHg3LDB4QSwweDAsQjMwfFJEMzIsSU1NMzJMSVNULEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSwyLCJtb3YubCIpLHt7UlMzMixSRDMyLEV9fSwgICAgICAgICB7eyAweDAsMHhGLEIzMXxSUzMyLEIzMHxSRDMyLEUsMCwwLDAsMH19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNCwibW92LmwiKSx7e1JTSU5ELFJEMzIsRX19LCAgICAgICAge3sgUFJFRklYMzIsMHg2LDB4OSxSU0lORHxCMzAsQjMwfFJEMzIsRSwwLDAsMCwwIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDYsIm1vdi5sIikse3tESVNQMTZTUkMsUkQzMixFfX0sICAgIHt7IFBSRUZJWDMyLDB4NiwweEYsRElTUFJFR3xCMzAsQjMwfFJEMzIsRElTUDE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNiwibW92LmwiKSx7e0RJU1B8TF8zMnxTUkMsUkQzMixFfX0se3sgUFJFRklYMzIsMHg3LDB4OCxCMzB8RElTUFJFRywweDAsMHg2LDB4QiwweDIsQjMwfFJEMzIsU1JDfERJU1AzMkxJU1QsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSw2LCJtb3YubCIpLHt7UlNJTkMsUkQzMixFfX0sICAgICAgICB7eyBQUkVGSVgzMiwweDYsMHhELEIzMHxSU0lOQyxCMzB8UkQzMixFLDAsMCwwLDAgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNiwibW92LmwiKSx7e0FCUzE2U1JDLFJEMzIsRX19LCAgICAge3sgUFJFRklYMzIsMHg2LDB4QiwweDAsQjMwfFJEMzIsQUJTMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSw2LCJtb3YubCIpLHt7QUJTMzJTUkN8TUVNUkVMQVgsUkQzMixFIH19LCAgICB7eyBQUkVGSVgzMiwweDYsMHhCLDB4MixCMzB8UkQzMixTUkN8TUVNUkVMQVh8QUJTMzJMSVNULEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsUkRJTkQsRX19LCAgICAgICAge3sgUFJFRklYMzIsMHg2LDB4OSxSRElORHxCMzEsQjMwfFJTMzIsRSwwLDAsMCwwIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0wpLDYsIm1vdi5sIikse3tSUzMyLERJU1AxNkRTVCxFfX0sICAgIHt7IFBSRUZJWDMyLDB4NiwweEYsRElTUFJFR3xCMzEsQjMwfFJTMzIsRElTUDE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsRElTUHxMXzMyfERTVCxFfX0se3sgUFJFRklYMzIsMHg3LDB4OCxCMzF8RElTUFJFRywweDAsMHg2LDB4QiwweEEsQjMwfFJTMzIsRFNUfERJU1AzMkxJU1QsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNMKSw2LCJtb3YubCIpLHt7UlMzMixSRERFQyxFfX0sICAgICAgICB7eyBQUkVGSVgzMiwweDYsMHhELFJEREVDfEIzMSxCMzB8UlMzMixFLDAsMCwwLDAgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsQUJTMTZEU1QsRX19LCAgICAge3sgUFJFRklYMzIsMHg2LDB4QiwweDgsQjMwfFJTMzIsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNMKSw2LCJtb3YubCIpLHt7UlMzMixBQlMzMkRTVHxNRU1SRUxBWCxFIH19LCAgICB7eyBQUkVGSVgzMiwweDYsMHhCLDB4QSxCMzB8UlMzMixEU1R8TUVNUkVMQVh8QUJTMzJMSVNULEUgfX1FT1AsCi0KLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSwxMCwibW92ZnBlIikse3tBQlMxNlNSQyxSRDgsRX19LHt7IDB4NiwweEEsMHg0LFJEOCxBQlMxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksMTAsIm1vdnRwZSIpLHt7UlM4LEFCUzE2RFNULEV9fSx7eyAweDYsMHhBLDB4QyxSUzgsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotCi0gIE5FV19TT1AoTyhPX01VTFUsU0IpLDEsMTQsIm11bHh1LmIiKSx7e1JTOCxSRDE2LEV9fSwge3sgMHg1LDB4MCxSUzgsUkQxNixFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTVVMVSxTVyksMCwxNCwibXVseHUudyIpLHt7UlMxNixSRDMyLEV9fSx7eyAweDUsMHgyLFJTMTYsQjMwfFJEMzIsRSwwLDAsMCwwfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fTVVMUyxTQiksMCwyMCwibXVseHMuYiIpLHt7UlM4LFJEMTYsRX19LCB7eyAweDAsMHgxLDB4YywweDAsMHg1LDB4MCxSUzgsUkQxNixFfX1FT1AsCi0gIE5FV19TT1AoTyhPX01VTFMsU1cpLDAsMjAsIm11bHhzLnciKSx7e1JTMTYsUkQzMixFfX0se3sgMHgwLDB4MSwweGMsMHgwLDB4NSwweDIsUlMxNixCMzB8UkQzMixFfX1FT1AsCi0gIAotICAvKiA/Pz8gVGhpcyBjYW4gdXNlIFVOT1AzLiAgKi8KLSAgTkVXX1NPUChPKE9fTkVHLFNCKSwxLDIsIm5lZy5iIikse3sgT1I4LEUsIDB9fSx7eyAweDEsMHg3LDB4OCxPUjgsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX05FRyxTVyksMCwyLCJuZWcudyIpLHt7IE9SMTYsRSwwfX0se3sgMHgxLDB4NywweDksT1IxNixFfX1FT1AsCi0gIE5FV19TT1AoTyhPX05FRyxTTCksMCwyLCJuZWcubCIpLHt7IE9SMzIsRSwwfX0se3sgMHgxLDB4NywweEIsQjMwfE9SMzIsRX19RU9QLAotICAgIAotICBORVdfU09QKE8oT19OT1AsU04pLDEsMiwibm9wIikse3tFLDAsMH19LHt7IDB4MCwweDAsMHgwLDB4MCxFLDAsMCwwLDB9fUVPUCwKLQotICAvKiA/Pz8gVGhpcyBjYW4gdXNlIFVOT1AzLiAgKi8KLSAgTkVXX1NPUChPKE9fTk9ULFNCKSwxLDIsIm5vdC5iIikse3sgT1I4LEUsIDB9fSx7eyAweDEsMHg3LDB4MCxPUjgsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX05PVCxTVyksMCwyLCJub3QudyIpLHt7IE9SMTYsRSwwfX0se3sgMHgxLDB4NywweDEsT1IxNixFfX1FT1AsCi0gIE5FV19TT1AoTyhPX05PVCxTTCksMCwyLCJub3QubCIpLHt7IE9SMzIsRSwwfX0se3sgMHgxLDB4NywweDMsQjMwfE9SMzIsRX19RU9QLAotCi0gIFRXT09QKE8oT19PUiwgU0IpLCJvci5iIiwweEMsMHgxLDB4NCksCi0gIE5FV19TT1AoTyhPX09SLFNXKSwwLDQsIm9yLnciKSx7e0lNTTE2LFJEMTYsRSB9fSx7ezB4NywweDksMHg0LFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fT1IsU1cpLDAsMiwib3IudyIpLHt7UlMxNixSRDE2LEUgfX0se3sweDYsMHg0LFJTMTYsUkQxNixFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX09SLFNMKSwwLDYsIm9yLmwiKSx7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHg0LEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAotICBORVdfU09QKE8oT19PUixTTCksMCwyLCJvci5sIikse3tSUzMyLFJEMzIsRSB9fSx7ezB4MCwweDEsMHhGLDB4MCwweDYsMHg0LEIzMHxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fT1JDLFNCKSwxLDIsIm9yYyIpLHt7SU1NOCxDQ1IsRX19LHt7IDB4MCwweDQsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX09SQyxTQiksMSwyLCJvcmMiKSx7e0lNTTgsRVhSLEV9fSx7eyAweDAsMHgxLDB4NCwweDEsMHgwLDB4NCxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLQotICBORVdfU09QKE8oT19NT1ZfVE9fUkVHLFNXKSwxLDYsInBvcC53Iikse3tPUjE2LEUsMH19LHt7IDB4NiwweEQsMHg3LE9SMTYsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX01PVl9UT19SRUcsU0wpLDAsNiwicG9wLmwiKSx7e09SMzIsRSwwfX0se3sgUFJFRklYMzIsMHg2LDB4RCwweDcsT1IzMnxCMzAsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX01PVl9UT19NRU0sU1cpLDEsNiwicHVzaC53Iikse3tPUjE2LEUsMH19LHt7IDB4NiwweEQsMHhGLE9SMTYsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX01PVl9UT19NRU0sU0wpLDAsNiwicHVzaC5sIikse3tPUjMyLEUsMH19LHt7IFBSRUZJWDMyLDB4NiwweEQsMHhGLE9SMzJ8QjMwLEUsMCwwLDAsMH19RU9QLAotCi0gIFVOT1AzKE9fUk9UTCwgICJyb3RsIiwgMHgxLDB4MiwweDgpLAotICBVTk9QMyhPX1JPVFIsICAicm90ciIsIDB4MSwweDMsMHg4KSwKLSAgVU5PUDMoT19ST1RYTCwgInJvdHhsIiwweDEsMHgyLDB4MCksCi0gIFVOT1AzKE9fUk9UWFIsICJyb3R4ciIsMHgxLDB4MywweDApLAotCi0gIFNPUChPKE9fQlBULFNOKSwgIDEwLCJicHQiKSx7e0UsMCwwfX0se3sgMHg3LDB4QSwweEYsMHhGLEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX1JURSxTTiksICAxMCwicnRlIikse3tFLDAsMH19LHt7IDB4NSwweDYsMHg3LDB4MCxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19SVFMsU04pLCAgIDgsInJ0cyIpLHt7RSwwLDB9fSx7eyAweDUsMHg0LDB4NywweDAsRSwwLDAsMCwwfX1FT1AsCi0KLSAgVU5PUDMoT19TSEFMLCAgInNoYWwiLDB4MSwweDAsMHg4KSwKLSAgVU5PUDMoT19TSEFSLCAgInNoYXIiLDB4MSwweDEsMHg4KSwKLSAgVU5PUDMoT19TSExMLCAgInNobGwiLDB4MSwweDAsMHgwKSwKLSAgVU5PUDMoT19TSExSLCAgInNobHIiLDB4MSwweDEsMHgwKSwKLQotICBTT1AoTyhPX1NMRUVQLFNOKSwyLCJzbGVlcCIpLHt7RSwwLDB9fSx7eyAweDAsMHgxLDB4OCwweDAsRSwwLDAsMCwwfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksIDEsMiwic3RjIikse3tDQ1IsUkQ4LEV9fSx7eyAweDAsMHgyLDB4MCxSRDgsRSwwLDAsMCwwfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0NDUixSU0lORCxFfX0sICAgICAgICB7e1BSRUZJWExEQywweDYsMHg5LEIzMXxSRElORCwweDAsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLERJU1B8RFNUfExfMTYsRX19LHt7UFJFRklYTERDLDB4NiwweEYsQjMxfERJU1BSRUcsMCxEU1R8RElTUHxMXzE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLERJU1B8RFNUfExfMzIsRX19LHt7UFJFRklYTERDLDB4NywweDgsQjMwfERJU1BSRUcsMCwweDYsMHhCLDB4QSwweDAsRFNUfERJU1AzMkxJU1QsRX19RU9QLAotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tDQ1IsUkRERUMsRX19LCAgICAgICAge3tQUkVGSVhMREMsMHg2LDB4RCxCMzF8UkRERUMsMHgwLEV9fUVPUCwKLQotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tDQ1IsQUJTMTZTUkMsRX19LCAgICAge3tQUkVGSVhMREMsMHg2LDB4QiwweDgsMHgwLEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLEFCUzMyU1JDLEV9fSwgICAgIHt7UFJFRklYTERDLDB4NiwweEIsMHhBLDB4MCxEU1R8QUJTMzJMSVNULEV9fUVPUCwKLQotICBORVdfU09QKE8oT19TVEMsU0IpLCAxLDIsInN0YyIpLHt7RVhSLFJEOCxFfX0se3sgMHgwLDB4MiwweDEsUkQ4LEUsMCwwLDAsMH19IEVPUCwKLQotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tFWFIsUlNJTkQsRX19LCAgICAgICAge3sweDAsMHgxLDB4NCwweDEsMHg2LDB4OSxCMzF8UkRJTkQsMHgwLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixESVNQfERTVHxMXzE2LEV9fSx7ezB4MCwweDEsMHg0LDB4MSwweDYsMHhGLEIzMXxESVNQUkVHLDAsRFNUfERJU1B8TF8xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixESVNQfERTVHxMXzMyLEV9fSx7ezB4MCwweDEsMHg0LDB4MSwweDcsMHg4LEIzMHxESVNQUkVHLDAsMHg2LDB4QiwweEEsMHgwLERTVHxESVNQMzJMSVNULEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7RVhSLFJEREVDLEV9fSwgICAgICAgIHt7MHgwLDB4MSwweDQsMHgxLDB4NiwweEQsQjMxfFJEREVDLDB4MCxFfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7RVhSLEFCUzE2U1JDLEV9fSwgICAgIHt7MHgwLDB4MSwweDQsMHgxLDB4NiwweEIsMHg4LDB4MCxBQlMxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixBQlMzMlNSQyxFfX0sICAgICB7ezB4MCwweDEsMHg0LDB4MSwweDYsMHhCLDB4QSwweDAsRFNUfEFCUzMyTElTVCxFfX1FT1AsCi0KLSAgU09QKE8oT19TVUIsU0IpLDIsInN1Yi5iIikse3tSUzgsUkQ4LEV9fSx7eyAweDEsMHg4LFJTOCxSRDgsRSwwLDAsMCwwfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fU1VCLFNXKSwxLDIsInN1Yi53Iikse3tSUzE2LFJEMTYsRSB9fSwgIHt7MHgxLDB4OSxSUzE2LFJEMTYsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fU1VCLFNXKSwwLDQsInN1Yi53Iikse3tJTU0xNixSRDE2LEUgfX0sIHt7MHg3LDB4OSwweDMsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX0gRU9QLAotICBORVdfU09QKE8oT19TVUIsU0wpLDAsMiwic3ViLmwiKSAse3tSUzMyLFJEMzIsRSB9fSwge3sweDEsMHhBLEIzMXxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1NVQixTTCksMCw2LCJzdWIubCIpLCB7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHgzLEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAotCi0gIFNPUChPKE9fU1VCUyxTTCksMiwic3VicyIpLHt7S0JJVCxSRFAsRX19LHt7IDB4MSwweEIsS0JJVCxSRFAsRSwwLDAsMCwwfX1FT1AsCi0gIFRXT09QKE8oT19TVUJYLFNCKSwic3VieCIsMHhCLDB4MSwweEUpLAotCi0gIE5FV19TT1AoTyhPX1RSQVBBLFNCKSwwLDIsInRyYXBhIikse3sgSU1NMixFfX0sICB7ezB4NSwweDcsSU1NMixJR05PUkUsRSAgfX1FT1AsCi0gIE5FV19TT1AoTyhPX1RBUyxTQiksMCwyLCJ0YXMiKSx7e1JTSU5ELEV9fSwgIHt7MHgwLDB4MSwweGUsMHgwLDB4NywweGIsQjMwfFJTSU5ELDB4YyxFICB9fUVPUCwKLQotICBUV09PUChPKE9fWE9SLCBTQiksInhvciIsMHhELDB4MSwweDUpLAotCi0gIE5FV19TT1AoTyhPX1hPUixTVyksMCw0LCJ4b3IudyIpLHt7SU1NMTYsUkQxNixFIH19LHt7MHg3LDB4OSwweDUsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX0gRU9QLAotICBORVdfU09QKE8oT19YT1IsU1cpLDAsMiwieG9yLnciKSx7e1JTMTYsUkQxNixFIH19LHt7MHg2LDB4NSxSUzE2LFJEMTYsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19YT1IsU0wpLDAsNiwieG9yLmwiKSx7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHg1LEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAotICBORVdfU09QKE8oT19YT1IsU0wpLDAsMiwieG9yLmwiKSAse3tSUzMyLFJEMzIsRSB9fSx7ezB4MCwweDEsMHhGLDB4MCwweDYsMHg1LEIzMHxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0KLSAgU09QKE8oT19YT1JDLFNCKSwyLCJ4b3JjIikse3tJTU04LENDUixFfX0se3sgMHgwLDB4NSxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19YT1JDLFNCKSwyLCJ4b3JjIikse3tJTU04LEVYUixFfX0se3sgMHgwLDB4MSwweDQsMHgxLDB4MCwweDUsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fQ0xSTUFDLFNOKSwxLDIsImNscm1hYyIpLHt7RSwgMCwgMH19LHt7MHgwLDB4MSwweGEsMHgwLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX01BQyxTTCksMSwyLCJtYWMiKSx7e1JTSU5DLFJESU5DLEV9fSx7ezB4MCwweDEsMHg2LDB4MCwweDYsMHhkLEIzMHxSU0lOQyxCMzB8UkRJTkMsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fTERNQUMsU0wpLDEsMiwibGRtYWMiKSx7e1JTMzIsTUFDUkVHLEV9fSx7ezB4MCwweDMsTUFDUkVHLFJTMzIsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fU1RNQUMsU0wpLDEsMiwic3RtYWMiKSx7e01BQ1JFRyxSRDMyLEV9fSx7ezB4MCwweDIsTUFDUkVHLFJEMzIsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fTERNLFNMKSwwLDYsImxkbS5sIikse3tSU0lOQywgUlMzMiwgRX19LHt7IDB4MCwweDEsSUdOT1JFLDB4MCwweDYsMHhELDB4NyxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19TVE0sU0wpLDAsNiwic3RtLmwiKSx7e1JTMzIsIFJEREVDLCBFfX0se3sweDAsMHgxLElHTk9SRSwweDAsMHg2LDB4RCwweEYsSUdOT1JFLEV9fUVPUCwKLSAgeyAwIH0KLX07Ci0jZWxzZQotZXh0ZXJuIHN0cnVjdCBoOF9vcGNvZGUgaDhfb3Bjb2Rlc1tdIDsKLSNlbmRpZgotCi0KLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9ocHBhLmggYi9pbmNsdWRlL29wY29kZS9ocHBhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwY2NiNmMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDg2ICswLDAgQEAKLS8qIFRhYmxlIG9mIG9wY29kZXMgZm9yIHRoZSBQQS1SSVNDLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkzLCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIsIGFuZCBHREIsIHRoZSBHTlUgZGlzYXNzZW1ibGVyLgotCi1HQVMvR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTL0dEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUyBvciBHREI7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZiAhZGVmaW5lZChfX1NURENfXykgJiYgIWRlZmluZWQoY29uc3QpCi0jZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyoKLSAqIFN0cnVjdHVyZSBvZiBhbiBvcGNvZGUgdGFibGUgZW50cnkuCi0gKi8KLQotLyogVGhlcmUgYXJlIHR3byBraW5kcyBvZiBkZWxheSBzbG90IG51bGxpZmljYXRpb246IG5vcm1hbCB3aGljaCBpcwotICogY29udHJvbGVkIGJ5IHRoZSBudWxsaWZpY2F0aW9uIGJpdCwgYW5kIGNvbmRpdGlvbmFsLCB3aGljaCBkZXBlbmRzCi0gKiBvbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBicmFuY2ggYW5kIGl0cyBzdWNjZXNzIG9yIGZhaWx1cmUuCi0gKgotICogTk9ORSBpcyB1bmZvcnR1bmF0ZWx5ICNkZWZpbmVkIGluIHRoZSBoaXV4IHN5c3RlbSBpbmNsdWRlIGZpbGVzLiAgCi0gKiAjdW5kZWYgaXQgYXdheS4KLSAqLwotI3VuZGVmIE5PTkUKLXN0cnVjdCBwYV9vcGNvZGUKLXsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIHVuc2lnbmVkIGxvbmcgaW50IG1hdGNoOwkvKiBCaXRzIHRoYXQgbXVzdCBiZSBzZXQuLi4gICovCi0gICAgdW5zaWduZWQgbG9uZyBpbnQgbWFzazsJLyogLi4uIGluIHRoZXNlIGJpdHMuICovCi0gICAgY2hhciAqYXJnczsKLSAgICBlbnVtIHBhX2FyY2ggYXJjaDsKLX07Ci0KLQotLyoKLSAgIEFsbCBocHBhIG9wY29kZXMgYXJlIDMyIGJpdHMuCi0KLSAgIFRoZSBtYXRjaCBjb21wb25lbnQgaXMgYSBtYXNrIHNheWluZyB3aGljaCBiaXRzIG11c3QgbWF0Y2ggYQotICAgcGFydGljdWxhciBvcGNvZGUgaW4gb3JkZXIgZm9yIGFuIGluc3RydWN0aW9uIHRvIGJlIGFuIGluc3RhbmNlCi0gICBvZiB0aGF0IG9wY29kZS4KLQotICAgVGhlIGFyZ3MgY29tcG9uZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIGNoYXJhY3RlcgotICAgZm9yIGVhY2ggb3BlcmFuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0KLSAgIEJpdCBwb3NpdGlvbnMgaW4gdGhpcyBkZXNjcmlwdGlvbiBmb2xsb3cgSFAgdXNhZ2Ugb2YgbHNiID0gMzEsCi0gICAiYXQiIGlzIGxzYiBvZiBmaWVsZC4KLQotICAgSW4gdGhlIGFyZ3MgZmllbGQsIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyBtdXN0IG1hdGNoIGV4YWN0bHk6Ci0KLQknKywoKSAnCi0KLSAgIEluIHRoZSBhcmdzIGZpZWxkLCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgYXJlIHVudXNlZDoKLQotCScgICIjJCUgICAgKistIC4vICAgICAgICAgIDo7ICAgICcKLQknICAgICAgICAgICAgICAgICAgICAgICAgICBbXF0gICcKLQknICAgICAgICAgICAgICAgICAgICAgICAgICB7IH0gJwotCi0gICBIZXJlIGFyZSBhbGwgdGhlIGNoYXJhY3RlcnM6Ci0KLQknICEiIyQlJicoKSorLSwuLzAxMjM0NTY3ODk6Ozw9Pj9AJwotCSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fJwotCSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4nCi0KLUtpbmRzIG9mIG9wZXJhbmRzOgotICAgeCAgICBpbnRlZ2VyIHJlZ2lzdGVyIGZpZWxkIGF0IDE1LgotICAgYiAgICBpbnRlZ2VyIHJlZ2lzdGVyIGZpZWxkIGF0IDEwLgotICAgdCAgICBpbnRlZ2VyIHJlZ2lzdGVyIGZpZWxkIGF0IDMxLgotICAgeSAgICBmbG9hdGluZyBwb2ludCByZWdpc3RlciBmaWVsZCBhdCAzMQotICAgNSAgICA1IGJpdCBpbW1lZGlhdGUgYXQgMTUuCi0gICBzICAgIDIgYml0IHNwYWNlIHNwZWNpZmllciBhdCAxNy4KLSAgIFMgICAgMyBiaXQgc3BhY2Ugc3BlY2lmaWVyIGF0IDE4LgotICAgYyAgICBpbmRleGVkIGxvYWQgY29tcGxldGVyLgotICAgQyAgICBzaG9ydCBsb2FkIGFuZCBzdG9yZSBjb21wbGV0ZXIuCi0gICBZCVN0b3JlIEJ5dGVzIFNob3J0IGNvbXBsZXRlcgotICAgPCAgICBub24tbmVnYXRlZCBjb21wYXJlL3N1YnRyYWN0IGNvbmRpdGlvbnMuCi0gICBhCWNvbXBhcmUvc3VidHJhY3QgY29uZGl0aW9ucwotICAgZCAgICBub24tbmVnYXRlZCBhZGQgY29uZGl0aW9ucwotICAgJiAgICBsb2dpY2FsIGluc3RydWN0aW9uIGNvbmRpdGlvbnMKLSAgIFUgICAgdW5pdCBpbnN0cnVjdGlvbiBjb25kaXRpb25zCi0gICA+ICAgIHNoaWZ0L2V4dHJhY3QvZGVwb3NpdCBjb25kaXRpb25zLgotICAgfiAgICBidmIsYmIgY29uZGl0aW9ucwotICAgViAgICA1IGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMzEKLSAgIGkgICAgMTEgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAzMQotICAgaiAgICAxNCBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDMxCi0gICBrICAgIDIxIGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMzEKLSAgIG4JbnVsbGlmaWNhdGlvbiBmb3IgYnJhbmNoIGluc3RydWN0aW9ucwotICAgTgludWxsaWZpY2F0aW9uIGZvciBzcG9wIGFuZCBjb3ByIGluc3RydWN0aW9ucwotICAgdyAgICAxMiBiaXQgYnJhbmNoIGRpc3BsYWNlbWVudAotICAgVyAgICAxNyBiaXQgYnJhbmNoIGRpc3BsYWNlbWVudCAoUEMgcmVsYXRpdmUpCi0gICB6ICAgIDE3IGJpdCBicmFuY2ggZGlzcGxhY2VtZW50IChqdXN0IGEgbnVtYmVyLCBub3QgYW4gYWRkcmVzcykKLQotQWxzbyB0aGVzZToKLQotICAgcCAgICA1IGJpdCBzaGlmdCBjb3VudCBhdCAyNiAodG8gc3VwcG9ydCB0aGUgU0hEIGluc3RydWN0aW9uKSBlbmNvZGVkIGFzCi0gICAgICAgIDMxLXAKLSAgIFAgICAgNSBiaXQgYml0IHBvc2l0aW9uIGF0IDI2Ci0gICBUICAgIDUgYml0IGZpZWxkIGxlbmd0aCBhdCAzMSAoZW5jb2RlZCBhcyAzMi1UKQotICAgQSAgICAxMyBiaXQgaW1tZWRpYXRlIGF0IDE4ICh0byBzdXBwb3J0IHRoZSBCUkVBSyBpbnN0cnVjdGlvbikKLSAgIF4JbGlrZSBiLCBidXQgZGVzY3JpYmVzIGEgY29udHJvbCByZWdpc3RlcgotICAgWiAgICBTeXN0ZW0gQ29udHJvbCBDb21wbGV0ZXIgKHRvIHN1cHBvcnQgTFBBLCBMSEEsIGV0Yy4pCi0gICBEICAgIDI2IGJpdCBpbW1lZGlhdGUgYXQgMzEgKHRvIHN1cHBvcnQgdGhlIERJQUcgaW5zdHJ1Y3Rpb24pCi0KLSAgIGYgICAgMyBiaXQgU3BlY2lhbCBGdW5jdGlvbiBVbml0IGlkZW50aWZpZXIgYXQgMjUKLSAgIE8gICAgMjAgYml0IFNwZWNpYWwgRnVuY3Rpb24gVW5pdCBvcGVyYXRpb24gc3BsaXQgYmV0d2VlbiAxNSBiaXRzIGF0IDIwCi0gICAgICAgIGFuZCA1IGJpdHMgYXQgMzEKLSAgIG8gICAgMTUgYml0IFNwZWNpYWwgRnVuY3Rpb24gVW5pdCBvcGVyYXRpb24gYXQgMjAKLSAgIDIgICAgMjIgYml0IFNwZWNpYWwgRnVuY3Rpb24gVW5pdCBvcGVyYXRpb24gc3BsaXQgYmV0d2VlbiAxNyBiaXRzIGF0IDIwCi0gICAgICAgIGFuZCA1IGJpdHMgYXQgMzEKLSAgIDEgICAgMTUgYml0IFNwZWNpYWwgRnVuY3Rpb24gVW5pdCBvcGVyYXRpb24gc3BsaXQgYmV0d2VlbiAxMCBiaXRzIGF0IDIwCi0gICAgICAgIGFuZCA1IGJpdHMgYXQgMzEKLSAgIDAgICAgMTAgYml0IFNwZWNpYWwgRnVuY3Rpb24gVW5pdCBvcGVyYXRpb24gc3BsaXQgYmV0d2VlbiA1IGJpdHMgYXQgMjAKLSAgICAgICAgYW5kIDUgYml0cyBhdCAzMQotICAgdSAgICAzIGJpdCBjb3Byb2Nlc3NvciB1bml0IGlkZW50aWZpZXIgYXQgMjUKLSAgIEYgICAgU291cmNlIEZsb2F0aW5nIFBvaW50IE9wZXJhbmQgRm9ybWF0IENvbXBsZXRlciBlbmNvZGVkIDIgYml0cyBhdCAyMAotICAgSSAgICBTb3VyY2UgRmxvYXRpbmcgUG9pbnQgT3BlcmFuZCBGb3JtYXQgQ29tcGxldGVyIGVuY29kZWQgMSBiaXRzIGF0IDIwCi0JKGZvciAweGUgZm9ybWF0IEZQIGluc3RydWN0aW9ucykKLSAgIEcgICAgRGVzdGluYXRpb24gRmxvYXRpbmcgUG9pbnQgT3BlcmFuZCBGb3JtYXQgQ29tcGxldGVyIGVuY29kZWQgMiBiaXRzIGF0IDE4Ci0gICBNICAgIEZsb2F0aW5nLVBvaW50IENvbXBhcmUgQ29uZGl0aW9ucyAoZW5jb2RlZCBhcyA1IGJpdHMgYXQgMzEpCi0gICA/ICAgIG5vbi1uZWdhdGVkL25lZ2F0ZWQgY29tcGFyZS9zdWJ0cmFjdCBjb25kaXRpb25zLgotICAgQCAgICBub24tbmVnYXRlZC9uZWdhdGVkIGFkZCBjb25kaXRpb25zLgotICAgISAgICBub24tbmVnYXRlZCBhZGQgY29uZGl0aW9ucy4KLQotICAgcyAgICAyIGJpdCBzcGFjZSBzcGVjaWZpZXIgYXQgMTcuCi0gICBiICAgIHJlZ2lzdGVyIGZpZWxkIGF0IDEwLgotICAgcgk1IGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMzEgKGZvciB0aGUgYnJlYWsgaW5zdHJ1Y3Rpb24pCi0JKHZlcnkgc2ltaWxhciB0byBWIGFib3ZlLCBleGNlcHQgdGhlIHZhbHVlIGlzIHVuc2lnbmVkIGluc3RlYWQgb2YKLQlsb3dfc2lnbl9leHQpCi0gICBSCTUgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAxNSAoZm9yIHRoZSBzc20sIHJzbSwgcHJvYmVpIGluc3RydWN0aW9ucykKLQkoc2FtZSBhcyByIGFib3ZlLCBleGNlcHQgdGhlIHZhbHVlIGlzIGluIGEgZGlmZmVyZW50IGxvY2F0aW9uKQotICAgUQk1IGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMTAgKGEgYml0IHBvc2l0aW9uIHNwZWNpZmllZCBpbgotCXRoZSBiYiBpbnN0cnVjdGlvbi4gSXQncyB0aGUgc2FtZSBhcyByIGFib3ZlLCBleGNlcHQgdGhlCi0gICAgICAgIHZhbHVlIGlzIGluIGEgZGlmZmVyZW50IGxvY2F0aW9uKQotICAgfAlzaGlmdC9leHRyYWN0L2RlcG9zaXQgY29uZGl0aW9ucyB3aGVuIHVzZWQgaW4gYSBjb25kaXRpb25hbCBicmFuY2gKLQotQW5kIHRoZXNlIChQSkgpIGZvciBQQS04OSBGLlAuIHJlZ2lzdGVycyBhbmQgaW5zdHJ1Y3Rpb25zOgotCi0gICB2ICAgIGEgJ3QnIG9wZXJhbmQgdHlwZSBleHRlbmRlZCB0byBoYW5kbGUgTC9SIHJlZ2lzdGVyIGhhbHZlcy4KLSAgIEUgICAgYSAnYicgb3BlcmFuZCB0eXBlIGV4dGVuZGVkIHRvIGhhbmRsZSBML1IgcmVnaXN0ZXIgaGFsdmVzLgotICAgWCAgICBhbiAneCcgb3BlcmFuZCB0eXBlIGV4dGVuZGVkIHRvIGhhbmRsZSBML1IgcmVnaXN0ZXIgaGFsdmVzLgotICAgSiAgICBhICdiJyBvcGVyYW5kIHR5cGUgZnVydGhlciBleHRlbmRlZCB0byBoYW5kbGUgZXh0cmEgMS4xIHJlZ2lzdGVycwotICAgSyAgICBhICd4JyBvcGVyYW5kIHR5cGUgZnVydGhlciBleHRlbmRlZCB0byBoYW5kbGUgZXh0cmEgMS4xIHJlZ2lzdGVycwotICAgNCAgICBhIHZhcmlhdGlvbiBvZiB0aGUgJ2InIG9wZXJhbmQgdHlwZSBmb3IgJ2ZtcHlhZGQnIGFuZCAnZm1weXN1YicKLSAgIDYgICAgYSB2YXJpYXRpb24gb2YgdGhlICd4JyBvcGVyYW5kIHR5cGUgZm9yICdmbXB5YWRkJyBhbmQgJ2ZtcHlzdWInCi0gICA3ICAgIGEgdmFyaWF0aW9uIG9mIHRoZSAndCcgb3BlcmFuZCB0eXBlIGZvciAnZm1weWFkZCcgYW5kICdmbXB5c3ViJwotICAgOCAgICA1IGJpdCByZWdpc3RlciBmaWVsZCBhdCAyMCAodXNlZCBpbiAnZm1weWFkZCcgYW5kICdmbXB5c3ViJykKLSAgIDkgICAgNSBiaXQgcmVnaXN0ZXIgZmllbGQgYXQgMjUgKHVzZWQgaW4gJ2ZtcHlhZGQnIGFuZCAnZm1weXN1YicpCi0gICBIICAgIEZsb2F0aW5nIFBvaW50IE9wZXJhbmQgRm9ybWF0IGF0IDI2IGZvciAnZm1weWFkZCcgYW5kICdmbXB5c3ViJwotICAgICAgICAodmVyeSBzaW1pbGFyIHRvICdGJykKLSovCi0KLQotLyogTGlzdCBvZiBjaGFyYWN0ZXJzIG5vdCB0byBwdXQgYSBzcGFjZSBhZnRlci4gIE5vdGUgdGhhdAotICAgIiwiIGlzIGluY2x1ZGVkLCBhcyB0aGUgInNwb3BOIiBvcGVyYXRpb25zIHVzZSBsaXRlcmFsCi0gICBjb21tYXMgaW4gdGhlaXIgY29tcGxldGVyIHNlY3Rpb25zLiAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbXBsZXRlcl9jaGFycyA9ICIsQ2NZPD4/IUArJlV+RmZHSElObk9vWk1hZHV8Lz0wMTIzJWUkbX0iOwotCi0vKiBUaGUgb3JkZXIgb2YgdGhlIG9wY29kZXMgaW4gdGhpcyB0YWJsZSBpcyBzaWduaWZpY2FudDoKLQotICAgKiBUaGUgYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgYWxsIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBtbmVtb25pYyBtdXN0IGJlCi0gICBjb25zZWN1dGl2ZS4gIElmIHRoZXkgYXJlbid0LCB0aGUgYXNzZW1ibGVyIHdpbGwgYm9tYiBhdCBydW50aW1lLgotCi0gICAqIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIG5vdCBjYXJlIGFib3V0IHRoZSBvcmRlciBvZiB0aGUgb3Bjb2Rlcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGFfb3Bjb2RlIHBhX29wY29kZXNbXSA9Ci17Ci0KLQotLyogcHNldWRvLWluc3RydWN0aW9ucyAqLwotCi17ICJiIiwJCTB4ZTgwMDAwMDAsIDB4ZmZlMGUwMDAsICJuVyIsIHBhMTB9LCAvKiBibCBmb28scjAgKi8KLXsgImxkaSIsCTB4MzQwMDAwMDAsIDB4ZmZlMGMwMDAsICJqLHgiLCBwYTEwfSwJLyogbGRvIHZhbChyMCksciAqLwoteyAiY29taWIiLCAJMHg4NDAwMDAwMCwgMHhmYzAwMDAwMCwgIj9uNSxiLHciLCBwYTEwfSwgLyogY29taWJ7dGZ9Ki8KLXsgImNvbWIiLAkweDgwMDAwMDAwLCAweGZjMDAwMDAwLCAiP254LGIsdyIsIHBhMTB9LCAvKiBjb21ie3RmfSAqLwoteyAiYWRkYiIsCTB4YTAwMDAwMDAsIDB4ZmMwMDAwMDAsICJAbngsYix3IiwgcGExMH0sIC8qIGFkZGJ7dGZ9ICovCi17ICJhZGRpYiIsCTB4YTQwMDAwMDAsIDB4ZmMwMDAwMDAsICJAbjUsYix3IiwgcGExMH0sIC8qIGFkZGlie3RmfSovCi17ICJub3AiLCAgICAgICAgMHgwODAwMDI0MCwgMHhmZmZmZmZmZiwgIiIsIHBhMTB9LCAgICAgIC8qIG9yIDAsMCwwICovCi17ICJjb3B5IiwgICAgICAgMHgwODAwMDI0MCwgMHhmZmUwZmZlMCwgIngsdCIsIHBhMTB9LCAgIC8qIG9yIHIsMCx0ICovCi17ICJtdHNhciIsICAgICAgMHgwMTYwMTg0MCwgMHhmZmUwZmZmZiwgIngiLCBwYTEwfSwgLyogbXRjdGwgcixjcjExICovCi0KLS8qIExvYWRzIGFuZCBTdG9yZXMgZm9yIGludGVnZXIgcmVnaXN0ZXJzLiAgKi8KLXsgImxkdyIsICAgICAgICAweDQ4MDAwMDAwLCAweGZjMDAwMDAwLCAiaihzLGIpLHgiLCBwYTEwfSwKLXsgImxkdyIsICAgICAgICAweDQ4MDAwMDAwLCAweGZjMDAwMDAwLCAiaihiKSx4IiwgcGExMH0sCi17ICJsZGgiLCAgICAgICAgMHg0NDAwMDAwMCwgMHhmYzAwMDAwMCwgImoocyxiKSx4IiwgcGExMH0sCi17ICJsZGgiLCAgICAgICAgMHg0NDAwMDAwMCwgMHhmYzAwMDAwMCwgImooYikseCIsIHBhMTB9LAoteyAibGRiIiwgICAgICAgIDB4NDAwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKHMsYikseCIsIHBhMTB9LAoteyAibGRiIiwgICAgICAgIDB4NDAwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKGIpLHgiLCBwYTEwfSwKLXsgInN0dyIsICAgICAgICAweDY4MDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKHMsYikiLCBwYTEwfSwKLXsgInN0dyIsICAgICAgICAweDY4MDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKGIpIiwgcGExMH0sCi17ICJzdGgiLCAgICAgICAgMHg2NDAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihzLGIpIiwgcGExMH0sCi17ICJzdGgiLCAgICAgICAgMHg2NDAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihiKSIsIHBhMTB9LAoteyAic3RiIiwgICAgICAgIDB4NjAwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGoocyxiKSIsIHBhMTB9LAoteyAic3RiIiwgICAgICAgIDB4NjAwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGooYikiLCBwYTEwfSwKLXsgImxkd20iLCAgICAgICAweDRjMDAwMDAwLCAweGZjMDAwMDAwLCAiaihzLGIpLHgiLCBwYTEwfSwKLXsgImxkd20iLCAgICAgICAweDRjMDAwMDAwLCAweGZjMDAwMDAwLCAiaihiKSx4IiwgcGExMH0sCi17ICJzdHdtIiwgICAgICAgMHg2YzAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihzLGIpIiwgcGExMH0sCi17ICJzdHdtIiwgICAgICAgMHg2YzAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihiKSIsIHBhMTB9LAoteyAibGR3eCIsICAgICAgIDB4MGMwMDAwODAsIDB4ZmMwMDFmYzAsICJjeChzLGIpLHQiLCBwYTEwfSwKLXsgImxkd3giLCAgICAgICAweDBjMDAwMDgwLCAweGZjMDAxZmMwLCAiY3goYiksdCIsIHBhMTB9LAoteyAibGRoeCIsICAgICAgIDB4MGMwMDAwNDAsIDB4ZmMwMDFmYzAsICJjeChzLGIpLHQiLCBwYTEwfSwKLXsgImxkaHgiLCAgICAgICAweDBjMDAwMDQwLCAweGZjMDAxZmMwLCAiY3goYiksdCIsIHBhMTB9LAoteyAibGRieCIsICAgICAgIDB4MGMwMDAwMDAsIDB4ZmMwMDFmYzAsICJjeChzLGIpLHQiLCBwYTEwfSwKLXsgImxkYngiLCAgICAgICAweDBjMDAwMDAwLCAweGZjMDAxZmMwLCAiY3goYiksdCIsIHBhMTB9LAoteyAibGR3YXgiLCAgICAgIDB4MGMwMDAxODAsIDB4ZmMwMGRmYzAsICJjeChiKSx0IiwgcGExMH0sCi17ICJsZGN3eCIsICAgICAgMHgwYzAwMDFjMCwgMHhmYzAwMWZjMCwgImN4KHMsYiksdCIsIHBhMTB9LAoteyAibGRjd3giLCAgICAgIDB4MGMwMDAxYzAsIDB4ZmMwMDFmYzAsICJjeChiKSx0IiwgcGExMH0sCi17ICJsZHdzIiwJMHgwYzAwMTA4MCwgMHhmYzAwMWZjMCwgIkM1KHMsYiksdCIsIHBhMTB9LAoteyAibGR3cyIsCTB4MGMwMDEwODAsIDB4ZmMwMDFmYzAsICJDNShiKSx0IiwgcGExMH0sCi17ICJsZGhzIiwJMHgwYzAwMTA0MCwgMHhmYzAwMWZjMCwgIkM1KHMsYiksdCIsIHBhMTB9LAoteyAibGRocyIsCTB4MGMwMDEwNDAsIDB4ZmMwMDFmYzAsICJDNShiKSx0IiwgcGExMH0sCi17ICJsZGJzIiwJMHgwYzAwMTAwMCwgMHhmYzAwMWZjMCwgIkM1KHMsYiksdCIsIHBhMTB9LAoteyAibGRicyIsCTB4MGMwMDEwMDAsIDB4ZmMwMDFmYzAsICJDNShiKSx0IiwgcGExMH0sCi17ICJsZHdhcyIsCTB4MGMwMDExODAsIDB4ZmMwMGRmYzAsICJDNShiKSx0IiwgcGExMH0sCi17ICJsZGN3cyIsCTB4MGMwMDExYzAsIDB4ZmMwMDFmYzAsICJDNShzLGIpLHQiLCBwYTEwfSwKLXsgImxkY3dzIiwJMHgwYzAwMTFjMCwgMHhmYzAwMWZjMCwgIkM1KGIpLHQiLCBwYTEwfSwKLXsgInN0d3MiLAkweDBjMDAxMjgwLCAweGZjMDAxZmMwLCAiQ3gsVihzLGIpIiwgcGExMH0sCi17ICJzdHdzIiwJMHgwYzAwMTI4MCwgMHhmYzAwMWZjMCwgIkN4LFYoYikiLCBwYTEwfSwKLXsgInN0aHMiLAkweDBjMDAxMjQwLCAweGZjMDAxZmMwLCAiQ3gsVihzLGIpIiwgcGExMH0sCi17ICJzdGhzIiwJMHgwYzAwMTI0MCwgMHhmYzAwMWZjMCwgIkN4LFYoYikiLCBwYTEwfSwKLXsgInN0YnMiLAkweDBjMDAxMjAwLCAweGZjMDAxZmMwLCAiQ3gsVihzLGIpIiwgcGExMH0sCi17ICJzdGJzIiwJMHgwYzAwMTIwMCwgMHhmYzAwMWZjMCwgIkN4LFYoYikiLCBwYTEwfSwKLXsgInN0d2FzIiwJMHgwYzAwMTM4MCwgMHhmYzAwZGZjMCwgIkN4LFYoYikiLCBwYTEwfSwKLXsgInN0YnlzIiwJMHgwYzAwMTMwMCwgMHhmYzAwMWZjMCwgIll4LFYocyxiKSIsIHBhMTB9LAoteyAic3RieXMiLAkweDBjMDAxMzAwLCAweGZjMDAxZmMwLCAiWXgsVihiKSIsIHBhMTB9LAotCi0vKiBJbW1lZGlhdGUgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsgImxkbyIsCTB4MzQwMDAwMDAsIDB4ZmMwMGMwMDAsICJqKGIpLHgiLCBwYTEwfSwKLXsgImxkaWwiLAkweDIwMDAwMDAwLCAweGZjMDAwMDAwLCAiayxiIiwgcGExMH0sCi17ICJhZGRpbCIsCTB4MjgwMDAwMDAsIDB4ZmMwMDAwMDAsICJrLGIiLCBwYTEwfSwKLQotLyogQnJhbmNoaW5nIGluc3RydWN0aW9ucy4gKi8KLXsgImJsIiwJCTB4ZTgwMDAwMDAsIDB4ZmMwMGUwMDAsICJuVyxiIiwgcGExMH0sCi17ICJnYXRlIiwJMHhlODAwMjAwMCwgMHhmYzAwZTAwMCwgIm5XLGIiLCBwYTEwfSwKLXsgImJsciIsCTB4ZTgwMDQwMDAsIDB4ZmMwMGUwMDEsICJueCxiIiwgcGExMH0sCi17ICJidiIsCQkweGU4MDBjMDAwLCAweGZjMDBmZmZkLCAibngoYikiLCBwYTEwfSwKLXsgImJ2IiwJCTB4ZTgwMGMwMDAsIDB4ZmMwMGZmZmQsICJuKGIpIiwgcGExMH0sCi17ICJiZSIsCQkweGUwMDAwMDAwLCAweGZjMDAwMDAwLCAibnooUyxiKSIsIHBhMTB9LAoteyAiYmxlIiwJMHhlNDAwMDAwMCwgMHhmYzAwMDAwMCwgIm56KFMsYikiLCBwYTEwfSwKLXsgIm1vdmIiLAkweGM4MDAwMDAwLCAweGZjMDAwMDAwLCAifG54LGIsdyIsIHBhMTB9LAoteyAibW92aWIiLAkweGNjMDAwMDAwLCAweGZjMDAwMDAwLCAifG41LGIsdyIsIHBhMTB9LAoteyAiY29tYnQiLAkweDgwMDAwMDAwLCAweGZjMDAwMDAwLCAiPG54LGIsdyIsIHBhMTB9LAoteyAiY29tYmYiLAkweDg4MDAwMDAwLCAweGZjMDAwMDAwLCAiPG54LGIsdyIsIHBhMTB9LAoteyAiY29taWJ0IiwJMHg4NDAwMDAwMCwgMHhmYzAwMDAwMCwgIjxuNSxiLHciLCBwYTEwfSwKLXsgImNvbWliZiIsCTB4OGMwMDAwMDAsIDB4ZmMwMDAwMDAsICI8bjUsYix3IiwgcGExMH0sCi17ICJhZGRidCIsCTB4YTAwMDAwMDAsIDB4ZmMwMDAwMDAsICIhbngsYix3IiwgcGExMH0sCi17ICJhZGRiZiIsCTB4YTgwMDAwMDAsIDB4ZmMwMDAwMDAsICIhbngsYix3IiwgcGExMH0sCi17ICJhZGRpYnQiLAkweGE0MDAwMDAwLCAweGZjMDAwMDAwLCAiIW41LGIsdyIsIHBhMTB9LAoteyAiYWRkaWJmIiwJMHhhYzAwMDAwMCwgMHhmYzAwMDAwMCwgIiFuNSxiLHciLCBwYTEwfSwKLXsgImJiIiwJCTB4YzQwMDQwMDAsIDB4ZmMwMDQwMDAsICJ+bngsUSx3IiwgcGExMH0sIAoteyAiYnZiIiwJMHhjMDAwNDAwMCwgMHhmZmUwNDAwMCwgIn5ueCx3IiwgcGExMH0sCi0KLS8qIENvbXB1dGF0aW9uIEluc3RydWN0aW9ucyAqLwotCi17ICJhZGQiLCAgICAgICAgMHgwODAwMDYwMCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoteyAiYWRkbCIsICAgICAgIDB4MDgwMDBhMDAsIDB4ZmMwMDBmZTAsICJkeCxiLHQiLCBwYTEwfSwKLXsgImFkZG8iLCAgICAgICAweDA4MDAwZTAwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCi17ICJhZGRjIiwgICAgICAgMHgwODAwMDcwMCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoteyAiYWRkY28iLCAgICAgIDB4MDgwMDBmMDAsIDB4ZmMwMDBmZTAsICJkeCxiLHQiLCBwYTEwfSwKLXsgInNoMWFkZCIsICAgICAweDA4MDAwNjQwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCi17ICJzaDFhZGRsIiwgICAgMHgwODAwMGE0MCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoteyAic2gxYWRkbyIsICAgIDB4MDgwMDBlNDAsIDB4ZmMwMDBmZTAsICJkeCxiLHQiLCBwYTEwfSwKLXsgInNoMmFkZCIsICAgICAweDA4MDAwNjgwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCi17ICJzaDJhZGRsIiwgICAgMHgwODAwMGE4MCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoteyAic2gyYWRkbyIsICAgIDB4MDgwMDBlODAsIDB4ZmMwMDBmZTAsICJkeCxiLHQiLCBwYTEwfSwKLXsgInNoM2FkZCIsICAgICAweDA4MDAwNmMwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCi17ICJzaDNhZGRsIiwgICAgMHgwODAwMGFjMCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoteyAic2gzYWRkbyIsICAgIDB4MDgwMDBlYzAsIDB4ZmMwMDBmZTAsICJkeCxiLHQiLCBwYTEwfSwKLXsgInN1YiIsICAgICAgICAweDA4MDAwNDAwLCAweGZjMDAwZmUwLCAiYXgsYix0IiwgcGExMH0sCi17ICJzdWJvIiwgICAgICAgMHgwODAwMGMwMCwgMHhmYzAwMGZlMCwgImF4LGIsdCIsIHBhMTB9LAoteyAic3ViYiIsICAgICAgIDB4MDgwMDA1MDAsIDB4ZmMwMDBmZTAsICJheCxiLHQiLCBwYTEwfSwKLXsgInN1YmJvIiwgICAgICAweDA4MDAwZDAwLCAweGZjMDAwZmUwLCAiYXgsYix0IiwgcGExMH0sCi17ICJzdWJ0IiwgICAgICAgMHgwODAwMDRjMCwgMHhmYzAwMGZlMCwgImF4LGIsdCIsIHBhMTB9LAoteyAic3VidG8iLCAgICAgIDB4MDgwMDBjYzAsIDB4ZmMwMDBmZTAsICJheCxiLHQiLCBwYTEwfSwKLXsgImRzIiwgICAgICAgICAweDA4MDAwNDQwLCAweGZjMDAwZmUwLCAiYXgsYix0IiwgcGExMH0sCi17ICJjb21jbHIiLCAgICAgMHgwODAwMDg4MCwgMHhmYzAwMGZlMCwgImF4LGIsdCIsIHBhMTB9LAoteyAib3IiLCAgICAgICAgIDB4MDgwMDAyNDAsIDB4ZmMwMDBmZTAsICImeCxiLHQiLCBwYTEwfSwKLXsgInhvciIsICAgICAgICAweDA4MDAwMjgwLCAweGZjMDAwZmUwLCAiJngsYix0IiwgcGExMH0sCi17ICJhbmQiLCAgICAgICAgMHgwODAwMDIwMCwgMHhmYzAwMGZlMCwgIiZ4LGIsdCIsIHBhMTB9LAoteyAiYW5kY20iLCAgICAgIDB4MDgwMDAwMDAsIDB4ZmMwMDBmZTAsICImeCxiLHQiLCBwYTEwfSwKLXsgInV4b3IiLCAgICAgICAweDA4MDAwMzgwLCAweGZjMDAwZmUwLCAiVXgsYix0IiwgcGExMH0sCi17ICJ1YWRkY20iLCAgICAgMHgwODAwMDk4MCwgMHhmYzAwMGZlMCwgIlV4LGIsdCIsIHBhMTB9LAoteyAidWFkZGNtdCIsICAgIDB4MDgwMDA5YzAsIDB4ZmMwMDBmZTAsICJVeCxiLHQiLCBwYTEwfSwKLXsgImRjb3IiLCAgICAgICAweDA4MDAwYjgwLCAweGZjMWYwZmUwLCAiVWIsdCIsICAgcGExMH0sCi17ICJpZGNvciIsICAgICAgMHgwODAwMGJjMCwgMHhmYzFmMGZlMCwgIlViLHQiLCAgIHBhMTB9LAoteyAiYWRkaSIsICAgICAgIDB4YjQwMDAwMDAsIDB4ZmMwMDA4MDAsICJkaSxiLHgiLCBwYTEwfSwKLXsgImFkZGlvIiwgICAgICAweGI0MDAwODAwLCAweGZjMDAwODAwLCAiZGksYix4IiwgcGExMH0sCi17ICJhZGRpdCIsICAgICAgMHhiMDAwMDAwMCwgMHhmYzAwMDgwMCwgImRpLGIseCIsIHBhMTB9LAoteyAiYWRkaXRvIiwgICAgIDB4YjAwMDA4MDAsIDB4ZmMwMDA4MDAsICJkaSxiLHgiLCBwYTEwfSwKLXsgInN1YmkiLCAgICAgICAweDk0MDAwMDAwLCAweGZjMDAwODAwLCAiYWksYix4IiwgcGExMH0sCi17ICJzdWJpbyIsICAgICAgMHg5NDAwMDgwMCwgMHhmYzAwMDgwMCwgImFpLGIseCIsIHBhMTB9LAoteyAiY29taWNsciIsICAgIDB4OTAwMDAwMDAsIDB4ZmMwMDA4MDAsICJhaSxiLHgiLCBwYTEwfSwKLQotLyogRXh0cmFjdCBhbmQgRGVwb3NpdCBJbnN0cnVjdGlvbnMgKi8KLQoteyAidnNoZCIsICAgICAgIDB4ZDAwMDAwMDAsIDB4ZmMwMDFmZTAsICI+eCxiLHQiLCBwYTEwfSwKLXsgInNoZCIsICAgICAgICAweGQwMDAwODAwLCAweGZjMDAxYzAwLCAiPngsYixwLHQiLCBwYTEwfSwKLXsgInZleHRydSIsICAgICAweGQwMDAxMDAwLCAweGZjMDAxZmUwLCAiPmIsVCx4IiwgcGExMH0sCi17ICJ2ZXh0cnMiLCAgICAgMHhkMDAwMTQwMCwgMHhmYzAwMWZlMCwgIj5iLFQseCIsIHBhMTB9LAoteyAiZXh0cnUiLCAgICAgIDB4ZDAwMDE4MDAsIDB4ZmMwMDFjMDAsICI+YixQLFQseCIsIHBhMTB9LAoteyAiZXh0cnMiLCAgICAgIDB4ZDAwMDFjMDAsIDB4ZmMwMDFjMDAsICI+YixQLFQseCIsIHBhMTB9LAoteyAienZkZXAiLCAgICAgIDB4ZDQwMDAwMDAsIDB4ZmMwMDFmZTAsICI+eCxULGIiLCBwYTEwfSwKLXsgInZkZXAiLCAgICAgICAweGQ0MDAwNDAwLCAweGZjMDAxZmUwLCAiPngsVCxiIiwgcGExMH0sCi17ICJ6ZGVwIiwgICAgICAgMHhkNDAwMDgwMCwgMHhmYzAwMWMwMCwgIj54LHAsVCxiIiwgcGExMH0sCi17ICJkZXAiLCAgICAgICAgMHhkNDAwMGMwMCwgMHhmYzAwMWMwMCwgIj54LHAsVCxiIiwgcGExMH0sCi17ICJ6dmRlcGkiLCAgICAgMHhkNDAwMTAwMCwgMHhmYzAwMWZlMCwgIj41LFQsYiIsIHBhMTB9LAoteyAidmRlcGkiLCAgICAgIDB4ZDQwMDE0MDAsIDB4ZmMwMDFmZTAsICI+NSxULGIiLCBwYTEwfSwKLXsgInpkZXBpIiwgICAgICAweGQ0MDAxODAwLCAweGZjMDAxYzAwLCAiPjUscCxULGIiLCBwYTEwfSwKLXsgImRlcGkiLCAgICAgICAweGQ0MDAxYzAwLCAweGZjMDAxYzAwLCAiPjUscCxULGIiLCBwYTEwfSwKLQotLyogU3lzdGVtIENvbnRyb2wgSW5zdHJ1Y3Rpb25zICovCi0KLXsgImJyZWFrIiwgICAgICAweDAwMDAwMDAwLCAweGZjMDAxZmUwLCAicixBIiwgcGExMH0sCi17ICJyZmkiLCAgICAgICAgMHgwMDAwMGMwMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTB9LAoteyAicmZpciIsICAgICAgIDB4MDAwMDBjYTAsIDB4ZmZmZmZmZmYsICIiLCBwYTExfSwKLXsgInNzbSIsICAgICAgICAweDAwMDAwZDYwLCAweGZmZTBmZmUwLCAiUix0IiwgcGExMH0sCi17ICJyc20iLCAgICAgICAgMHgwMDAwMGU2MCwgMHhmZmUwZmZlMCwgIlIsdCIsIHBhMTB9LAoteyAibXRzbSIsICAgICAgIDB4MDAwMDE4NjAsIDB4ZmZlMGZmZmYsICJ4IiwgcGExMH0sCi17ICJsZHNpZCIsICAgICAgMHgwMDAwMTBhMCwgMHhmYzFmM2ZlMCwgIihzLGIpLHQiLCBwYTEwfSwKLXsgImxkc2lkIiwgICAgICAweDAwMDAxMGEwLCAweGZjMWYzZmUwLCAiKGIpLHQiLCBwYTEwfSwKLXsgIm10c3AiLCAgICAgICAweDAwMDAxODIwLCAweGZmZTAxZmZmLCAieCxTIiwgcGExMH0sCi17ICJtdGN0bCIsICAgICAgMHgwMDAwMTg0MCwgMHhmYzAwZmZmZiwgIngsXiIsIHBhMTB9LAoteyAibWZzcCIsICAgICAgIDB4MDAwMDA0YTAsIDB4ZmZmZjFmZTAsICJTLHQiLCBwYTEwfSwKLXsgIm1mY3RsIiwgICAgICAweDAwMDAwOGEwLCAweGZjMWZmZmUwLCAiXix0IiwgcGExMH0sCi17ICJzeW5jIiwgICAgICAgMHgwMDAwMDQwMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTB9LAoteyAic3luY2RtYSIsICAgIDB4MDAxMDA0MDAsIDB4ZmZmZmZmZmYsICIiLCBwYTEwfSwKLXsgInByb2JlciIsICAgICAweDA0MDAxMTgwLCAweGZjMDAzZmUwLCAiKHMsYikseCx0IiwgcGExMH0sCi17ICJwcm9iZXIiLCAgICAgMHgwNDAwMTE4MCwgMHhmYzAwM2ZlMCwgIihiKSx4LHQiLCBwYTEwfSwKLXsgInByb2JlcmkiLCAgICAweDA0MDAzMTgwLCAweGZjMDAzZmUwLCAiKHMsYiksUix0IiwgcGExMH0sCi17ICJwcm9iZXJpIiwgICAgMHgwNDAwMzE4MCwgMHhmYzAwM2ZlMCwgIihiKSxSLHQiLCBwYTEwfSwKLXsgInByb2JldyIsICAgICAweDA0MDAxMWMwLCAweGZjMDAzZmUwLCAiKHMsYikseCx0IiwgcGExMH0sCi17ICJwcm9iZXciLCAgICAgMHgwNDAwMTFjMCwgMHhmYzAwM2ZlMCwgIihiKSx4LHQiLCBwYTEwfSwKLXsgInByb2Jld2kiLCAgICAweDA0MDAzMWMwLCAweGZjMDAzZmUwLCAiKHMsYiksUix0IiwgcGExMH0sCi17ICJwcm9iZXdpIiwgICAgMHgwNDAwMzFjMCwgMHhmYzAwM2ZlMCwgIihiKSxSLHQiLCBwYTEwfSwKLXsgImxwYSIsICAgICAgICAweDA0MDAxMzQwLCAweGZjMDAzZmMwLCAiWngocyxiKSx0IiwgcGExMH0sCi17ICJscGEiLCAgICAgICAgMHgwNDAwMTM0MCwgMHhmYzAwM2ZjMCwgIlp4KGIpLHQiLCBwYTEwfSwKLXsgImxoYSIsICAgICAgICAweDA0MDAxMzAwLCAweGZjMDAzZmMwLCAiWngocyxiKSx0IiwgcGExMH0sCi17ICJsaGEiLCAgICAgICAgMHgwNDAwMTMwMCwgMHhmYzAwM2ZjMCwgIlp4KGIpLHQiLCBwYTEwfSwKLXsgImxjaSIsICAgICAgICAweDA0MDAxMzAwLCAweGZjMDAzZmUwLCAieChzLGIpLHQiLCBwYTEwfSwKLXsgImxjaSIsICAgICAgICAweDA0MDAxMzAwLCAweGZjMDAzZmUwLCAieChiKSx0IiwgcGExMH0sCi17ICJwZHRsYiIsICAgICAgMHgwNDAwMTIwMCwgMHhmYzAwM2ZkZiwgIlp4KHMsYikiLCBwYTEwfSwKLXsgInBkdGxiIiwgICAgICAweDA0MDAxMjAwLCAweGZjMDAzZmRmLCAiWngoYikiLCBwYTEwfSwKLXsgInBpdGxiIiwgICAgICAweDA0MDAwMjAwLCAweGZjMDAxZmRmLCAiWngoUyxiKSIsIHBhMTB9LAoteyAicGl0bGIiLCAgICAgIDB4MDQwMDAyMDAsIDB4ZmMwMDFmZGYsICJaeChiKSIsIHBhMTB9LAoteyAicGR0bGJlIiwgICAgIDB4MDQwMDEyNDAsIDB4ZmMwMDNmZGYsICJaeChzLGIpIiwgcGExMH0sCi17ICJwZHRsYmUiLCAgICAgMHgwNDAwMTI0MCwgMHhmYzAwM2ZkZiwgIlp4KGIpIiwgcGExMH0sCi17ICJwaXRsYmUiLCAgICAgMHgwNDAwMDI0MCwgMHhmYzAwMWZkZiwgIlp4KFMsYikiLCBwYTEwfSwKLXsgInBpdGxiZSIsICAgICAweDA0MDAwMjQwLCAweGZjMDAxZmRmLCAiWngoYikiLCBwYTEwfSwKLXsgImlkdGxiYSIsICAgICAweDA0MDAxMDQwLCAweGZjMDAzZmZmLCAieCwocyxiKSIsIHBhMTB9LAoteyAiaWR0bGJhIiwgICAgIDB4MDQwMDEwNDAsIDB4ZmMwMDNmZmYsICJ4LChiKSIsIHBhMTB9LAoteyAiaWl0bGJhIiwgICAgIDB4MDQwMDAwNDAsIDB4ZmMwMDFmZmYsICJ4LChTLGIpIiwgcGExMH0sCi17ICJpaXRsYmEiLCAgICAgMHgwNDAwMDA0MCwgMHhmYzAwMWZmZiwgIngsKGIpIiwgcGExMH0sCi17ICJpZHRsYnAiLCAgICAgMHgwNDAwMTAwMCwgMHhmYzAwM2ZmZiwgIngsKHMsYikiLCBwYTEwfSwKLXsgImlkdGxicCIsICAgICAweDA0MDAxMDAwLCAweGZjMDAzZmZmLCAieCwoYikiLCBwYTEwfSwKLXsgImlpdGxicCIsICAgICAweDA0MDAwMDAwLCAweGZjMDAxZmZmLCAieCwoUyxiKSIsIHBhMTB9LAoteyAiaWl0bGJwIiwgICAgIDB4MDQwMDAwMDAsIDB4ZmMwMDFmZmYsICJ4LChiKSIsIHBhMTB9LAoteyAicGRjIiwgICAgICAgIDB4MDQwMDEzODAsIDB4ZmMwMDNmZGYsICJaeChzLGIpIiwgcGExMH0sCi17ICJwZGMiLCAgICAgICAgMHgwNDAwMTM4MCwgMHhmYzAwM2ZkZiwgIlp4KGIpIiwgcGExMH0sCi17ICJmZGMiLCAgICAgICAgMHgwNDAwMTI4MCwgMHhmYzAwM2ZkZiwgIlp4KHMsYikiLCBwYTEwfSwKLXsgImZkYyIsICAgICAgICAweDA0MDAxMjgwLCAweGZjMDAzZmRmLCAiWngoYikiLCBwYTEwfSwKLXsgImZpYyIsICAgICAgICAweDA0MDAwMjgwLCAweGZjMDAxZmRmLCAiWngoUyxiKSIsIHBhMTB9LAoteyAiZmljIiwgICAgICAgIDB4MDQwMDAyODAsIDB4ZmMwMDFmZGYsICJaeChiKSIsIHBhMTB9LAoteyAiZmRjZSIsICAgICAgIDB4MDQwMDEyYzAsIDB4ZmMwMDNmZGYsICJaeChzLGIpIiwgcGExMH0sCi17ICJmZGNlIiwgICAgICAgMHgwNDAwMTJjMCwgMHhmYzAwM2ZkZiwgIlp4KGIpIiwgcGExMH0sCi17ICJmaWNlIiwgICAgICAgMHgwNDAwMDJjMCwgMHhmYzAwMWZkZiwgIlp4KFMsYikiLCBwYTEwfSwKLXsgImZpY2UiLCAgICAgICAweDA0MDAwMmMwLCAweGZjMDAxZmRmLCAiWngoYikiLCBwYTEwfSwKLXsgImRpYWciLCAgICAgICAweDE0MDAwMDAwLCAweGZjMDAwMDAwLCAiRCIsIHBhMTB9LAotCi0vKiBnZncgYW5kIGdmciBhcmUgbm90IGluIHRoZSBIUCBQQSAxLjEgbWFudWFsLCBidXQgdGhleSBhcmUgaW4gZWl0aGVyCi0gICB0aGUgVGltZXggRlBVIG9yIHRoZSBNdXN0YW5nIEVSUyAobm90IHN1cmUgd2hpY2gpIG1hbnVhbC4gICovCi17ICJnZnciLAkweDA0MDAxNjgwLCAweGZjMDAzZmRmLCAiWngocyxiKSIsIHBhMTF9LAoteyAiZ2Z3IiwJMHgwNDAwMTY4MCwgMHhmYzAwM2ZkZiwgIlp4KGIpIiwgcGExMX0sCi17ICJnZnIiLAkweDA0MDAxYTgwLCAweGZjMDAzZmRmLCAiWngocyxiKSIsIHBhMTF9LAoteyAiZ2ZyIiwJMHgwNDAwMWE4MCwgMHhmYzAwM2ZkZiwgIlp4KGIpIiwgcGExMX0sCi0KLS8qIEZsb2F0aW5nIFBvaW50IENvcHJvY2Vzc29yIEluc3RydWN0aW9ucyAqLwotICAKLXsgImZsZHd4IiwgICAgICAweDI0MDAwMDAwLCAweGZjMDAxZjgwLCAiY3gocyxiKSx2IiwgcGExMH0sCi17ICJmbGR3eCIsICAgICAgMHgyNDAwMDAwMCwgMHhmYzAwMWY4MCwgImN4KGIpLHYiLCBwYTEwfSwKLXsgImZsZGR4IiwgICAgICAweDJjMDAwMDAwLCAweGZjMDAxZmMwLCAiY3gocyxiKSx5IiwgcGExMH0sCi17ICJmbGRkeCIsICAgICAgMHgyYzAwMDAwMCwgMHhmYzAwMWZjMCwgImN4KGIpLHkiLCBwYTEwfSwKLXsgImZzdHd4IiwgICAgICAweDI0MDAwMjAwLCAweGZjMDAxZjgwLCAiY3YseChzLGIpIiwgcGExMH0sCi17ICJmc3R3eCIsICAgICAgMHgyNDAwMDIwMCwgMHhmYzAwMWY4MCwgImN2LHgoYikiLCBwYTEwfSwKLXsgImZzdGR4IiwgICAgICAweDJjMDAwMjAwLCAweGZjMDAxZmMwLCAiY3kseChzLGIpIiwgcGExMH0sCi17ICJmc3RkeCIsICAgICAgMHgyYzAwMDIwMCwgMHhmYzAwMWZjMCwgImN5LHgoYikiLCBwYTEwfSwKLXsgImZzdHF4IiwgICAgICAweDNjMDAwMjAwLCAweGZjMDAxZmMwLCAiY3kseChzLGIpIiwgcGExMH0sCi17ICJmc3RxeCIsICAgICAgMHgzYzAwMDIwMCwgMHhmYzAwMWZjMCwgImN5LHgoYikiLCBwYTEwfSwKLXsgImZsZHdzIiwgICAgICAweDI0MDAxMDAwLCAweGZjMDAxZjgwLCAiQzUocyxiKSx2IiwgcGExMH0sCi17ICJmbGR3cyIsICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMWY4MCwgIkM1KGIpLHYiLCBwYTEwfSwKLXsgImZsZGRzIiwgICAgICAweDJjMDAxMDAwLCAweGZjMDAxZmMwLCAiQzUocyxiKSx5IiwgcGExMH0sCi17ICJmbGRkcyIsICAgICAgMHgyYzAwMTAwMCwgMHhmYzAwMWZjMCwgIkM1KGIpLHkiLCBwYTEwfSwKLXsgImZzdHdzIiwgICAgICAweDI0MDAxMjAwLCAweGZjMDAxZjgwLCAiQ3YsNShzLGIpIiwgcGExMH0sCi17ICJmc3R3cyIsICAgICAgMHgyNDAwMTIwMCwgMHhmYzAwMWY4MCwgIkN2LDUoYikiLCBwYTEwfSwKLXsgImZzdGRzIiwgICAgICAweDJjMDAxMjAwLCAweGZjMDAxZmMwLCAiQ3ksNShzLGIpIiwgcGExMH0sCi17ICJmc3RkcyIsICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMWZjMCwgIkN5LDUoYikiLCBwYTEwfSwKLXsgImZzdHFzIiwgICAgICAweDNjMDAxMjAwLCAweGZjMDAxZmMwLCAiQ3ksNShzLGIpIiwgcGExMH0sCi17ICJmc3RxcyIsICAgICAgMHgzYzAwMTIwMCwgMHhmYzAwMWZjMCwgIkN5LDUoYikiLCBwYTEwfSwKLXsgImZhZGQiLCAgICAgICAweDMwMDAwNjAwLCAweGZjMDBlN2UwLCAiRkUsWCx2IiwgcGExMH0sCi17ICJmYWRkIiwgICAgICAgMHgzODAwMDYwMCwgMHhmYzAwZTcyMCwgIklKLEssdiIsIHBhMTB9LAoteyAiZnN1YiIsICAgICAgIDB4MzAwMDI2MDAsIDB4ZmMwMGU3ZTAsICJGRSxYLHYiLCBwYTEwfSwKLXsgImZzdWIiLCAgICAgICAweDM4MDAyNjAwLCAweGZjMDBlNzIwLCAiSUosSyx2IiwgcGExMH0sCi17ICJmbXB5IiwgICAgICAgMHgzMDAwNDYwMCwgMHhmYzAwZTdlMCwgIkZFLFgsdiIsIHBhMTB9LAoteyAiZm1weSIsICAgICAgIDB4MzgwMDQ2MDAsIDB4ZmMwMGU3MjAsICJJSixLLHYiLCBwYTEwfSwKLXsgImZkaXYiLCAgICAgICAweDMwMDA2NjAwLCAweGZjMDBlN2UwLCAiRkUsWCx2IiwgcGExMH0sCi17ICJmZGl2IiwgICAgICAgMHgzODAwNjYwMCwgMHhmYzAwZTcyMCwgIklKLEssdiIsIHBhMTB9LAoteyAiZnNxcnQiLCAgICAgIDB4MzAwMDgwMDAsIDB4ZmMxZmU3ZTAsICJGRSx2IiwgcGExMH0sCi17ICJmc3FydCIsICAgICAgMHgzODAwODAwMCwgMHhmYzFmZTcyMCwgIkZKLHYiLCBwYTEwfSwKLXsgImZhYnMiLCAgICAgICAweDMwMDA2MDAwLCAweGZjMWZlN2UwLCAiRkUsdiIsIHBhMTB9LAoteyAiZmFicyIsICAgICAgIDB4MzgwMDYwMDAsIDB4ZmMxZmU3MjAsICJGSix2IiwgcGExMH0sCi17ICJmcmVtIiwgICAgICAgMHgzMDAwODYwMCwgMHhmYzAwZTdlMCwgIkZFLFgsdiIsIHBhMTB9LAoteyAiZnJlbSIsICAgICAgIDB4MzgwMDg2MDAsIDB4ZmMwMGU3MjAsICJGSixLLHYiLCBwYTEwfSwKLXsgImZybmQiLCAgICAgICAweDMwMDBhMDAwLCAweGZjMWZlN2UwLCAiRkUsdiIsIHBhMTB9LAoteyAiZnJuZCIsICAgICAgIDB4MzgwMGEwMDAsIDB4ZmMxZmU3MjAsICJGSix2IiwgcGExMH0sCi17ICJmY3B5IiwgICAgICAgMHgzMDAwNDAwMCwgMHhmYzFmZTdlMCwgIkZFLHYiLCBwYTEwfSwKLXsgImZjcHkiLCAgICAgICAweDM4MDA0MDAwLCAweGZjMWZlNzIwLCAiRkosdiIsIHBhMTB9LAoteyAiZmNudmZmIiwgICAgIDB4MzAwMDAyMDAsIDB4ZmMxZjg3ZTAsICJGR0UsdiIsIHBhMTB9LAoteyAiZmNudmZmIiwgICAgIDB4MzgwMDAyMDAsIDB4ZmMxZjg3MjAsICJGR0osdiIsIHBhMTB9LAoteyAiZmNudnhmIiwgICAgIDB4MzAwMDgyMDAsIDB4ZmMxZjg3ZTAsICJGR0UsdiIsIHBhMTB9LAoteyAiZmNudnhmIiwgICAgIDB4MzgwMDgyMDAsIDB4ZmMxZjg3MjAsICJGR0osdiIsIHBhMTB9LAoteyAiZmNudmZ4IiwgICAgIDB4MzAwMTAyMDAsIDB4ZmMxZjg3ZTAsICJGR0UsdiIsIHBhMTB9LAoteyAiZmNudmZ4IiwgICAgIDB4MzgwMTAyMDAsIDB4ZmMxZjg3MjAsICJGR0osdiIsIHBhMTB9LAoteyAiZmNudmZ4dCIsICAgIDB4MzAwMTgyMDAsIDB4ZmMxZjg3ZTAsICJGR0UsdiIsIHBhMTB9LAoteyAiZmNudmZ4dCIsICAgIDB4MzgwMTgyMDAsIDB4ZmMxZjg3MjAsICJGR0osdiIsIHBhMTB9LAoteyAiZm1weWZhZGQiLCAgIDB4YjgwMDAwMDAsIDB4ZmMwMDAwMjAsICJGRSxYLDMsdiIsIHBhMjB9LAoteyAiZm1weW5mYWRkIiwgIDB4YjgwMDAwMjAsIDB4ZmMwMDAwMjAsICJGRSxYLDMsdiIsIHBhMjB9LAoteyAiZm5lZyIsICAgICAgIDB4MzAwMGMwMDAsIDB4ZmMxZmU3ZTAsICJGRSx2IiwgcGEyMH0sCi17ICJmbmVnIiwgICAgICAgMHgzODAwYzAwMCwgMHhmYzFmZTcyMCwgIkZKLHYiLCBwYTIwfSwKLXsgImZuZWdhYnMiLCAgICAweDMwMDBlMDAwLCAweGZjMWZlN2UwLCAiRkUsdiIsIHBhMjB9LAoteyAiZm5lZ2FicyIsICAgIDB4MzgwMGUwMDAsIDB4ZmMxZmU3MjAsICJGSix2IiwgcGEyMH0sCi17ICJmY21wIiwgICAgICAgMHgzMDAwMDQwMCwgMHhmYzAwZTdlMCwgIkZNRSxYIiwgcGExMH0sCi17ICJmY21wIiwgICAgICAgMHgzODAwMDQwMCwgMHhmYzAwZTcyMCwgIklNSixLIiwgcGExMH0sCi17ICJ4bXB5dSIsCTB4MzgwMDQ3MDAsIDB4ZmMwMGU3MjAsICJFLFgsdiIsIHBhMTF9LAoteyAiZm1weWFkZCIsCTB4MTgwMDAwMDAsIDB4ZmMwMDAwMDAsICJINCw2LDcsOSw4IiwgcGExMX0sCi17ICJmbXB5c3ViIiwJMHg5ODAwMDAwMCwgMHhmYzAwMDAwMCwgIkg0LDYsNyw5LDgiLCBwYTExfSwKLXsgImZ0ZXN0IiwgICAgICAweDMwMDAyNDIwLCAweGZmZmZmZmZmLCAiIiwgcGExMH0sCi17ICJmaWQiLCAgICAgICAgMHgzMDAwMDAwMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTF9LAotCi0KLS8qIEFzc2lzdCBJbnN0cnVjdGlvbnMgKi8KLQoteyAic3BvcDAiLCAgICAgIDB4MTAwMDAwMDAsIDB4ZmMwMDA2MDAsICJmLE9OIiwgcGExMH0sCi17ICJzcG9wMSIsICAgICAgMHgxMDAwMDIwMCwgMHhmYzAwMDYwMCwgImYsb050IiwgcGExMH0sCi17ICJzcG9wMiIsICAgICAgMHgxMDAwMDQwMCwgMHhmYzAwMDYwMCwgImYsMU5iIiwgcGExMH0sCi17ICJzcG9wMyIsICAgICAgMHgxMDAwMDYwMCwgMHhmYzAwMDYwMCwgImYsME54LGIiLCBwYTEwfSwKLXsgImNvcHIiLCAgICAgICAweDMwMDAwMDAwLCAweGZjMDAwMDAwLCAidSwyTiIsIHBhMTB9LAoteyAiY2xkd3giLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmMwMDFlMDAsICJ1Y3gocyxiKSx0IiwgcGExMH0sCi17ICJjbGR3eCIsICAgICAgMHgyNDAwMDAwMCwgMHhmYzAwMWUwMCwgInVjeChiKSx0IiwgcGExMH0sCi17ICJjbGRkeCIsICAgICAgMHgyYzAwMDAwMCwgMHhmYzAwMWUwMCwgInVjeChzLGIpLHQiLCBwYTEwfSwKLXsgImNsZGR4IiwgICAgICAweDJjMDAwMDAwLCAweGZjMDAxZTAwLCAidWN4KGIpLHQiLCBwYTEwfSwKLXsgImNzdHd4IiwgICAgICAweDI0MDAwMjAwLCAweGZjMDAxZTAwLCAidWN0LHgocyxiKSIsIHBhMTB9LAoteyAiY3N0d3giLCAgICAgIDB4MjQwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3QseChiKSIsIHBhMTB9LAoteyAiY3N0ZHgiLCAgICAgIDB4MmMwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3QseChzLGIpIiwgcGExMH0sCi17ICJjc3RkeCIsICAgICAgMHgyYzAwMDIwMCwgMHhmYzAwMWUwMCwgInVjdCx4KGIpIiwgcGExMH0sCi17ICJjbGR3cyIsICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMWUwMCwgInVDNShzLGIpLHQiLCBwYTEwfSwKLXsgImNsZHdzIiwgICAgICAweDI0MDAxMDAwLCAweGZjMDAxZTAwLCAidUM1KGIpLHQiLCBwYTEwfSwKLXsgImNsZGRzIiwgICAgICAweDJjMDAxMDAwLCAweGZjMDAxZTAwLCAidUM1KHMsYiksdCIsIHBhMTB9LAoteyAiY2xkZHMiLCAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDFlMDAsICJ1QzUoYiksdCIsIHBhMTB9LAoteyAiY3N0d3MiLCAgICAgIDB4MjQwMDEyMDAsIDB4ZmMwMDFlMDAsICJ1Q3QsNShzLGIpIiwgcGExMH0sCi17ICJjc3R3cyIsICAgICAgMHgyNDAwMTIwMCwgMHhmYzAwMWUwMCwgInVDdCw1KGIpIiwgcGExMH0sCi17ICJjc3RkcyIsICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMWUwMCwgInVDdCw1KHMsYikiLCBwYTEwfSwKLXsgImNzdGRzIiwgICAgICAweDJjMDAxMjAwLCAweGZjMDAxZTAwLCAidUN0LDUoYikiLCBwYTEwfSwKLX07Ci0KLSNkZWZpbmUgTlVNT1BDT0RFUyAoKHNpemVvZiBwYV9vcGNvZGVzKS8oc2l6ZW9mIHBhX29wY29kZXNbMF0pKQotCi0vKiBTS1YgMTIvMTgvOTIuIEFkZGVkIHNvbWUgZGVub3RhdGlvbnMgZm9yIHZhcmlvdXMgb3BlcmFuZHMuICovCi0KLSNkZWZpbmUgUEFfSU1NMTFfQVRfMzEgJ2knCi0jZGVmaW5lIFBBX0lNTTE0X0FUXzMxICdqJwotI2RlZmluZSBQQV9JTU0yMV9BVF8zMSAnaycKLSNkZWZpbmUgUEFfRElTUDEyICd3JwotI2RlZmluZSBQQV9ESVNQMTcgJ1cnCi0KLSNkZWZpbmUgTl9IUFBBX09QRVJBTkRfRk9STUFUUyA1CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9pMzg2LmggYi9pbmNsdWRlL29wY29kZS9pMzg2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZjI0MTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvaTM4Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE1NyArMCwwIEBACi0vKiBvcGNvZGUvaTM4Ni5oIC0tIEludGVsIDgwMzg2IG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIsIGFuZCBHREIsIHRoZSBHTlUgRGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZSBVbml4V2FyZSBhc3NlbWJsZXIsIGFuZCBwcm9iYWJseSBvdGhlciBBVCZUIGRlcml2ZWQgaXg4NiBVbml4Ci0gICBhc3NlbWJsZXJzLCBnZW5lcmF0ZSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgd2l0aCByZXZlcnNlZAotICAgc291cmNlIGFuZCBkZXN0aW5hdGlvbiByZWdpc3RlcnMgaW4gY2VydGFpbiBjYXNlcy4gIFVuZm9ydHVuYXRlbHksCi0gICBnY2MgYW5kIHBvc3NpYmx5IG1hbnkgb3RoZXIgcHJvZ3JhbXMgdXNlIHRoaXMgcmV2ZXJzZWQgc3ludGF4LCBzbwotICAgd2UncmUgc3R1Y2sgd2l0aCBpdC4KLQotICAgZWcuIGBmc3ViICVzdCgzKSwlc3QnIHJlc3VsdHMgaW4gc3QgPC0gc3QgLSBzdCgzKSBhcyBleHBlY3RlZCwgYnV0Ci0gICBgZnN1YiAlc3QsJXN0KDMpJyByZXN1bHRzIGluIHN0KDMpIDwtIHN0IC0gc3QoMyksIHJhdGhlciB0aGFuCi0gICB0aGUgZXhwZWN0ZWQgc3QoMykgPC0gc3QoMykgLSBzdCAhCi0KLSAgIFRoaXMgaGFwcGVucyB3aXRoIGFsbCB0aGUgbm9uLWNvbW11dGF0aXZlIGFyaXRobWV0aWMgZmxvYXRpbmcgcG9pbnQKLSAgIG9wZXJhdGlvbnMgd2l0aCB0d28gcmVnaXN0ZXIgb3BlcmFuZHMsIHdoZXJlIHRoZSBzb3VyY2UgcmVnaXN0ZXIgaXMKLSAgICVzdCwgYW5kIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGlzICVzdChpKS4gIExvb2sgZm9yIEZsb2F0RFIgYmVsb3cuICAqLwotCi0jaWZuZGVmIFVOSVhXQVJFX0NPTVBBVAotLyogU2V0IG5vbi16ZXJvIGZvciBicm9rZW4sIGNvbXBhdGlibGUgaW5zdHJ1Y3Rpb25zLiAgU2V0IHRvIHplcm8gZm9yCi0gICBub24tYnJva2VuIG9wY29kZXMgYXQgeW91ciBwZXJpbC4gIGdjYyBnZW5lcmF0ZXMgVW5peFdhcmUKLSAgIGNvbXBhdGlibGUgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgVU5JWFdBUkVfQ09NUEFUIDEKLSNlbmRpZgotCi0KLXN0YXRpYyBjb25zdCB0ZW1wbGF0ZSBpMzg2X29wdGFiW10gPSB7Ci0KLSNkZWZpbmUgWCBOb25lCi0jZGVmaW5lIE5vU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9fbFN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgYl9TdWYgKE5vX3dTdWZ8Tm9fbFN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgd19TdWYgKE5vX2JTdWZ8Tm9fbFN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgbF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgZF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb19zU3VmfE5vX2xTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgeF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb19zU3VmfE5vX2xTdWZ8Tm9fZFN1ZikKLSNkZWZpbmUgYndfU3VmIChOb19sU3VmfE5vX3NTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSBibF9TdWYgKE5vX3dTdWZ8Tm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIHdsX1N1ZiAoTm9fYlN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgc2xfU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSBzbGRfU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgc2xkeF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZikKLSNkZWZpbmUgYndsX1N1ZiAoTm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIGJ3bGRfU3VmIChOb19zU3VmfE5vX3hTdWYpCi0jZGVmaW5lIEZQIChOb1N1ZnxJZ25vcmVTaXplKQotI2RlZmluZSBsX0ZQIChsX1N1ZnxJZ25vcmVTaXplKQotI2RlZmluZSBkX0ZQIChkX1N1ZnxJZ25vcmVTaXplKQotI2RlZmluZSB4X0ZQICh4X1N1ZnxJZ25vcmVTaXplKQotI2RlZmluZSBzbF9GUCAoc2xfU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIHNsZF9GUCAoc2xkX1N1ZnxJZ25vcmVTaXplKQotI2RlZmluZSBzbGR4X0ZQIChzbGR4X1N1ZnxJZ25vcmVTaXplKQotI2lmIFVOSVhXQVJFX0NPTVBBVAotI2RlZmluZSBGbG9hdERSIEZsb2F0RAotI2Vsc2UKLSNkZWZpbmUgRmxvYXREUiAoRmxvYXREfEZsb2F0UikKLSNlbmRpZgotCi0vKiBtb3ZlIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBNT1ZfQVhfRElTUDMyIDB4YTAKLXsgIm1vdiIsICAgMiwJMHhhMCwgWCwgYndsX1N1ZnxEfFcsCQkJeyBEaXNwMTZ8RGlzcDMyLCBBY2MsIDAgfSB9LAoteyAibW92IiwgICAyLAkweDg4LCBYLCBid2xfU3VmfER8V3xNb2RybSwJCXsgUmVnLCBSZWd8QW55TWVtLCAwIH0gfSwKLXsgIm1vdiIsICAgMiwJMHhiMCwgWCwgYndsX1N1ZnxXfFNob3J0Rm9ybSwJCXsgSW1tLCBSZWcsIDAgfSB9LAoteyAibW92IiwgICAyLAkweGM2LCBYLCBid2xfU3VmfFd8TW9kcm0sCQl7IEltbSwgUmVnfEFueU1lbSwgMCB9IH0sCi0vKiBUaGUgbmV4dCB0d28gaW5zdHJ1Y3Rpb25zIGFjY2VwdCBXb3JkUmVnIHNvIHRoYXQgYSBzZWdtZW50IHJlZ2lzdGVyCi0gICBjYW4gYmUgY29waWVkIHRvIGEgMzIgYml0IHJlZ2lzdGVyLCBhbmQgdmljZSB2ZXJzYSwgd2l0aG91dCB1c2luZyBhCi0gICBzaXplIHByZWZpeC4gIFdoZW4gbW92aW5nIHRvIGEgMzIgYml0IHJlZ2lzdGVyLCB0aGUgdXBwZXIgMTYgYml0cwotICAgYXJlIHNldCB0byBhbiBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHZhbHVlIChvbiB0aGUgUGVudGl1bSBQcm8sCi0gICB0aGUgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB2YWx1ZSBpcyB6ZXJvKS4gICovCi17ICJtb3YiLCAgIDIsCTB4OGMsIFgsIHdsX1N1ZnxNb2RybSwJCQl7IFNSZWczfFNSZWcyLCBXb3JkUmVnfFdvcmRNZW0sIDAgfSB9LAoteyAibW92IiwgICAyLAkweDhlLCBYLCB3bF9TdWZ8TW9kcm18SWdub3JlU2l6ZSwJeyBXb3JkUmVnfFdvcmRNZW0sIFNSZWczfFNSZWcyLCAwIH0gfSwKLS8qIG1vdmUgdG8vZnJvbSBjb250cm9sIGRlYnVnIHJlZ2lzdGVycyAqLwoteyAibW92IiwgICAyLCAweDBmMjAsIFgsIGxfU3VmfER8TW9kcm18SWdub3JlU2l6ZSwJeyBDb250cm9sLCBSZWczMnxJbnZNZW0sIDB9IH0sCi17ICJtb3YiLCAgIDIsIDB4MGYyMSwgWCwgbF9TdWZ8RHxNb2RybXxJZ25vcmVTaXplLAl7IERlYnVnLCBSZWczMnxJbnZNZW0sIDB9IH0sCi17ICJtb3YiLCAgIDIsIDB4MGYyNCwgWCwgbF9TdWZ8RHxNb2RybXxJZ25vcmVTaXplLAl7IFRlc3QsIFJlZzMyfEludk1lbSwgMH0gfSwKLQotLyogbW92ZSB3aXRoIHNpZ24gZXh0ZW5kICovCi0vKiAibW92c2JsIiAmICJtb3ZzYnciIG11c3Qgbm90IGJlIHVuaWZpZWQgaW50byAibW92c2IiIHRvIGF2b2lkCi0gICBjb25mbGljdCB3aXRoIHRoZSAibW92cyIgc3RyaW5nIG1vdmUgaW5zdHJ1Y3Rpb24uICAqLwoteyJtb3ZzYmwiLCAyLCAweDBmYmUsIFgsIE5vU3VmfE1vZHJtLAkJCXsgUmVnOHxCeXRlTWVtLCBSZWczMiwgMH0gfSwKLXsibW92c2J3IiwgMiwgMHgwZmJlLCBYLCBOb1N1ZnxNb2RybSwJCQl7IFJlZzh8Qnl0ZU1lbSwgUmVnMTYsIDB9IH0sCi17Im1vdnN3bCIsIDIsIDB4MGZiZiwgWCwgTm9TdWZ8TW9kcm0sCQkJeyBSZWcxNnxTaG9ydE1lbSwgUmVnMzIsIDB9IH0sCi0vKiBJbnRlbCBTeW50YXggKi8KLXsibW92c3giLCAgMiwgMHgwZmJmLCBYLCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLAl7IFJlZzE2fFNob3J0TWVtLCBSZWczMiwgMH0gfSwKLXsibW92c3giLCAgMiwgMHgwZmJlLCBYLCBiX1N1ZnxNb2RybSwJCQl7IFJlZzh8Qnl0ZU1lbSwgV29yZFJlZywgMH0gfSwKLQotLyogbW92ZSB3aXRoIHplcm8gZXh0ZW5kICovCi17Im1vdnpiIiwgIDIsIDB4MGZiNiwgWCwgd2xfU3VmfE1vZHJtLAkJCXsgUmVnOHxCeXRlTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJtb3Z6d2wiLCAyLCAweDBmYjcsIFgsIE5vU3VmfE1vZHJtLAkJCXsgUmVnMTZ8U2hvcnRNZW0sIFJlZzMyLCAwfSB9LAotLyogSW50ZWwgU3ludGF4ICovCi17Im1vdnp4IiwgIDIsIDB4MGZiNywgWCwgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSwJeyBSZWcxNnxTaG9ydE1lbSwgUmVnMzIsIDB9IH0sCi17Im1vdnp4IiwgIDIsIDB4MGZiNiwgWCwgYl9TdWZ8TW9kcm0sCQkJeyBSZWc4fEJ5dGVNZW0sIFdvcmRSZWcsIDB9IH0sCi0KLS8qIHB1c2ggaW5zdHJ1Y3Rpb25zICovCi17InB1c2giLCAgIDEsCTB4NTAsIFgsIHdsX1N1ZnxTaG9ydEZvcm0sCXsgV29yZFJlZywwLDAgfSB9LAoteyJwdXNoIiwgICAxLAkweGZmLCA2LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgMCwgMCB9IH0sCi17InB1c2giLCAgIDEsCTB4NmEsIFgsIHdsX1N1ZiwJCXsgSW1tOFMsIDAsIDB9IH0sCi17InB1c2giLCAgIDEsCTB4NjgsIFgsIHdsX1N1ZiwJCXsgSW1tMTZ8SW1tMzIsIDAsIDB9IH0sCi17InB1c2giLCAgIDEsCTB4MDYsIFgsIHdsX1N1ZnxTZWcyU2hvcnRGb3JtLAl7IFNSZWcyLDAsMCB9IH0sCi17InB1c2giLCAgIDEsIDB4MGZhMCwgWCwgd2xfU3VmfFNlZzNTaG9ydEZvcm0sCXsgU1JlZzMsMCwwIH0gfSwKLS8qIHB1c2ggYWxsICovCi17InB1c2hhIiwgIDAsCTB4NjAsIFgsIHdsX1N1ZiwJCXsgMCwgMCwgMCB9IH0sCi0KLS8qIHBvcCBpbnN0cnVjdGlvbnMgKi8KLXsicG9wIiwJICAgMSwJMHg1OCwgWCwgd2xfU3VmfFNob3J0Rm9ybSwJeyBXb3JkUmVnLDAsMCB9IH0sCi17InBvcCIsCSAgIDEsCTB4OGYsIDAsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCAwLCAwIH0gfSwKLSNkZWZpbmUgUE9QX1NFR19TSE9SVCAweDA3Ci17InBvcCIsCSAgIDEsCTB4MDcsIFgsIHdsX1N1ZnxTZWcyU2hvcnRGb3JtLAl7IFNSZWcyLDAsMCB9IH0sCi17InBvcCIsCSAgIDEsIDB4MGZhMSwgWCwgd2xfU3VmfFNlZzNTaG9ydEZvcm0sCXsgU1JlZzMsMCwwIH0gfSwKLS8qIHBvcCBhbGwgKi8KLXsicG9wYSIsICAgMCwJMHg2MSwgWCwgd2xfU3VmLAkJeyAwLCAwLCAwIH0gfSwKLQotLyogeGNoZyBleGNoYW5nZSBpbnN0cnVjdGlvbnMKLSAgIHhjaGcgY29tbXV0ZXM6ICB3ZSBhbGxvdyBib3RoIG9wZXJhbmQgb3JkZXJzICovCi17InhjaGciLCAgIDIsCTB4OTAsIFgsIHdsX1N1ZnxTaG9ydEZvcm0sCXsgV29yZFJlZywgQWNjLCAwIH0gfSwKLXsieGNoZyIsICAgMiwJMHg5MCwgWCwgd2xfU3VmfFNob3J0Rm9ybSwJeyBBY2MsIFdvcmRSZWcsIDAgfSB9LAoteyJ4Y2hnIiwgICAyLAkweDg2LCBYLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwIH0gfSwKLXsieGNoZyIsICAgMiwJMHg4NiwgWCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIFJlZywgMCB9IH0sCi0KLS8qIGluL291dCBmcm9tIHBvcnRzICovCi17ImluIiwJICAgMiwJMHhlNCwgWCwgYndsX1N1ZnxXLAkJeyBJbW04LCBBY2MsIDAgfSB9LAoteyJpbiIsCSAgIDIsCTB4ZWMsIFgsIGJ3bF9TdWZ8VywJCXsgSW5PdXRQb3J0UmVnLCBBY2MsIDAgfSB9LAoteyJpbiIsCSAgIDEsCTB4ZTQsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tOCwgMCwgMCB9IH0sCi17ImluIiwJICAgMSwJMHhlYywgWCwgYndsX1N1ZnxXLAkJeyBJbk91dFBvcnRSZWcsIDAsIDAgfSB9LAoteyJvdXQiLAkgICAyLAkweGU2LCBYLCBid2xfU3VmfFcsCQl7IEFjYywgSW1tOCwgMCB9IH0sCi17Im91dCIsCSAgIDIsCTB4ZWUsIFgsIGJ3bF9TdWZ8VywJCXsgQWNjLCBJbk91dFBvcnRSZWcsIDAgfSB9LAoteyJvdXQiLAkgICAxLAkweGU2LCBYLCBid2xfU3VmfFcsCQl7IEltbTgsIDAsIDAgfSB9LAoteyJvdXQiLAkgICAxLAkweGVlLCBYLCBid2xfU3VmfFcsCQl7IEluT3V0UG9ydFJlZywgMCwgMCB9IH0sCi0KLS8qIGxvYWQgZWZmZWN0aXZlIGFkZHJlc3MgKi8KLXsibGVhIiwJICAgMiwgMHg4ZCwgICBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDAgfSB9LAotCi0vKiBsb2FkIHNlZ21lbnQgcmVnaXN0ZXJzIGZyb20gbWVtb3J5ICovCi17ImxkcyIsCSAgIDIsCTB4YzUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsibGVzIiwJICAgMiwJMHhjNCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJsZnMiLAkgICAyLCAweDBmYjQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsibGdzIiwJICAgMiwgMHgwZmI1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImxzcyIsCSAgIDIsIDB4MGZiMiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAotCi0vKiBmbGFncyByZWdpc3RlciBpbnN0cnVjdGlvbnMgKi8KLXsiY2xjIiwJICAgMCwJMHhmOCwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJjbGQiLAkgICAwLAkweGZjLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImNsaSIsCSAgIDAsCTB4ZmEsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiY2x0cyIsICAgMCwgMHgwZjA2LCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImNtYyIsCSAgIDAsCTB4ZjUsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsibGFoZiIsICAgMCwJMHg5ZiwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJzYWhmIiwgICAwLAkweDllLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17InB1c2hmIiwgIDAsCTB4OWMsIFgsIHdsX1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsicG9wZiIsICAgMCwJMHg5ZCwgWCwgd2xfU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJzdGMiLAkgICAwLAkweGY5LCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17InN0ZCIsCSAgIDAsCTB4ZmQsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsic3RpIiwJICAgMCwJMHhmYiwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAotCi0vKiBhcml0aG1ldGljICovCi17ImFkZCIsCSAgIDIsCTB4MDAsIFgsIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKLXsiYWRkIiwJICAgMiwJMHg4MywgMCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJhZGQiLAkgICAyLAkweDA0LCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJhZGQiLAkgICAyLAkweDgwLCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi17ImluYyIsCSAgIDEsCTB4NDAsIFgsIHdsX1N1ZnxTaG9ydEZvcm0sCXsgV29yZFJlZywgMCwgMH0gfSwKLXsiaW5jIiwJICAgMSwJMHhmZSwgMCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsic3ViIiwJICAgMiwJMHgyOCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJzdWIiLAkgICAyLAkweDgzLCA1LCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17InN1YiIsCSAgIDIsCTB4MmMsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17InN1YiIsCSAgIDIsCTB4ODAsIDUsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLXsiZGVjIiwJICAgMSwJMHg0OCwgWCwgd2xfU3VmfFNob3J0Rm9ybSwJeyBXb3JkUmVnLCAwLCAwfSB9LAoteyJkZWMiLAkgICAxLAkweGZlLCAxLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJzYmIiLAkgICAyLAkweDE4LCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNiYiIsCSAgIDIsCTB4ODMsIDMsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsic2JiIiwJICAgMiwJMHgxYywgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsic2JiIiwJICAgMiwJMHg4MCwgMywgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJjbXAiLAkgICAyLAkweDM4LCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17ImNtcCIsCSAgIDIsCTB4ODMsIDcsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiY21wIiwJICAgMiwJMHgzYywgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsiY21wIiwJICAgMiwJMHg4MCwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJ0ZXN0IiwgICAyLAkweDg0LCBYLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgUmVnLCAwfSB9LAoteyJ0ZXN0IiwgICAyLAkweDg0LCBYLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJ0ZXN0IiwgICAyLAkweGE4LCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJ0ZXN0IiwgICAyLAkweGY2LCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi17ImFuZCIsCSAgIDIsCTB4MjAsIFgsIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKLXsiYW5kIiwJICAgMiwJMHg4MywgNCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJhbmQiLAkgICAyLAkweDI0LCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJhbmQiLAkgICAyLAkweDgwLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi17Im9yIiwJICAgMiwJMHgwOCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJvciIsCSAgIDIsCTB4ODMsIDEsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsib3IiLAkgICAyLAkweDBjLCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJvciIsCSAgIDIsCTB4ODAsIDEsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLXsieG9yIiwJICAgMiwJMHgzMCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJ4b3IiLAkgICAyLAkweDgzLCA2LCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17InhvciIsCSAgIDIsCTB4MzQsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17InhvciIsCSAgIDIsCTB4ODAsIDYsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLS8qIGljbHIgd2l0aCAxIG9wZXJhbmQgaXMgcmVhbGx5IHhvciB3aXRoIDIgb3BlcmFuZHMuICovCi17ImNsciIsCSAgIDEsCTB4MzAsIFgsIGJ3bF9TdWZ8V3xNb2RybXxyZWdLbHVkZ2UsCXsgUmVnLCAwLCAwIH0gfSwKLQoteyJhZGMiLAkgICAyLAkweDEwLCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17ImFkYyIsCSAgIDIsCTB4ODMsIDIsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYWRjIiwJICAgMiwJMHgxNCwgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsiYWRjIiwJICAgMiwJMHg4MCwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJuZWciLAkgICAxLAkweGY2LCAzLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsibm90IiwJICAgMSwJMHhmNiwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsiYWFhIiwJICAgMCwJMHgzNywgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJhYXMiLAkgICAwLAkweDNmLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImRhYSIsCSAgIDAsCTB4MjcsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiZGFzIiwJICAgMCwJMHgyZiwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJhYWQiLAkgICAwLCAweGQ1MGEsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiYWFkIiwJICAgMSwgICAweGQ1LCBYLCBOb1N1ZiwJCQl7IEltbThTLCAwLCAwfSB9LAoteyJhYW0iLAkgICAwLCAweGQ0MGEsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiYWFtIiwJICAgMSwgICAweGQ0LCBYLCBOb1N1ZiwJCQl7IEltbThTLCAwLCAwfSB9LAotCi0vKiBjb252ZXJzaW9uIGluc25zICovCi0vKiBjb252ZXJzaW9uOglpbnRlbCBuYW1pbmcgKi8KLXsiY2J3IiwJICAgMCwJMHg5OCwgWCwgTm9TdWZ8U2l6ZTE2LAkJeyAwLCAwLCAwfSB9LAoteyJjd2RlIiwgICAwLAkweDk4LCBYLCBOb1N1ZnxTaXplMzIsCQl7IDAsIDAsIDB9IH0sCi17ImN3ZCIsCSAgIDAsCTB4OTksIFgsIE5vU3VmfFNpemUxNiwJCXsgMCwgMCwgMH0gfSwKLXsiY2RxIiwJICAgMCwJMHg5OSwgWCwgTm9TdWZ8U2l6ZTMyLAkJeyAwLCAwLCAwfSB9LAotLyogIGF0dCBuYW1pbmcgKi8KLXsiY2J0dyIsICAgMCwJMHg5OCwgWCwgTm9TdWZ8U2l6ZTE2LAkJeyAwLCAwLCAwfSB9LAoteyJjd3RsIiwgICAwLAkweDk4LCBYLCBOb1N1ZnxTaXplMzIsCQl7IDAsIDAsIDB9IH0sCi17ImN3dGQiLCAgIDAsCTB4OTksIFgsIE5vU3VmfFNpemUxNiwJCXsgMCwgMCwgMH0gfSwKLXsiY2x0ZCIsICAgMCwJMHg5OSwgWCwgTm9TdWZ8U2l6ZTMyLAkJeyAwLCAwLCAwfSB9LAotCi0vKiBXYXJuaW5nISB0aGUgbXVsL2ltdWwgKG9wY29kZSAweGY2KSBtdXN0IG9ubHkgaGF2ZSAxIG9wZXJhbmQhICBUaGV5IGFyZQotICAgZXhwYW5kaW5nIDY0LWJpdCBtdWx0aXBsaWVzLCBhbmQgKmNhbm5vdCogYmUgc2VsZWN0ZWQgdG8gYWNjb21wbGlzaAotICAgJ2ltdWwgJWVieCwgJWVheCcgKG9wY29kZSAweDBmYWYgbXVzdCBiZSB1c2VkIGluIHRoaXMgY2FzZSkKLSAgIFRoZXNlIG11bHRpcGxpZXMgY2FuIG9ubHkgYmUgc2VsZWN0ZWQgd2l0aCBzaW5nbGUgb3BlcmFuZCBmb3Jtcy4gICovCi17Im11bCIsCSAgIDEsCTB4ZjYsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAoteyJpbXVsIiwgICAxLAkweGY2LCA1LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsiaW11bCIsICAgMiwgMHgwZmFmLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiaW11bCIsICAgMywJMHg2YiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnfSB9LAoteyJpbXVsIiwgICAzLAkweDY5LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IEltbTE2fEltbTMyLCBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWd9IH0sCi0vKiBpbXVsIHdpdGggMiBvcGVyYW5kcyBtaW1pY3MgaW11bCB3aXRoIDMgYnkgcHV0dGluZyB0aGUgcmVnaXN0ZXIgaW4KLSAgIGJvdGggaS5ybS5yZWcgJiBpLnJtLnJlZ21lbSBmaWVsZHMuICByZWdLbHVkZ2UgZW5hYmxlcyB0aGlzCi0gICB0cmFuc2Zvcm1hdGlvbi4gICovCi17ImltdWwiLCAgIDIsCTB4NmIsIFgsIHdsX1N1ZnxNb2RybXxyZWdLbHVkZ2UseyBJbW04UywgV29yZFJlZywgMH0gfSwKLXsiaW11bCIsICAgMiwJMHg2OSwgWCwgd2xfU3VmfE1vZHJtfHJlZ0tsdWRnZSx7IEltbTE2fEltbTMyLCBXb3JkUmVnLCAwfSB9LAotCi17ImRpdiIsCSAgIDEsCTB4ZjYsIDYsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAoteyJkaXYiLAkgICAyLAkweGY2LCA2LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgQWNjLCAwfSB9LAoteyJpZGl2IiwgICAxLAkweGY2LCA3LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsiaWRpdiIsICAgMiwJMHhmNiwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIEFjYywgMH0gfSwKLQoteyJyb2wiLAkgICAyLAkweGQwLCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsicm9sIiwJICAgMiwJMHhjMCwgMCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJvbCIsCSAgIDIsCTB4ZDIsIDAsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyb2wiLAkgICAxLAkweGQwLCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJyb3IiLAkgICAyLAkweGQwLCAxLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsicm9yIiwJICAgMiwJMHhjMCwgMSwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJvciIsCSAgIDIsCTB4ZDIsIDEsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyb3IiLAkgICAxLAkweGQwLCAxLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJyY2wiLAkgICAyLAkweGQwLCAyLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsicmNsIiwJICAgMiwJMHhjMCwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJjbCIsCSAgIDIsCTB4ZDIsIDIsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyY2wiLAkgICAxLAkweGQwLCAyLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJyY3IiLAkgICAyLAkweGQwLCAzLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsicmNyIiwJICAgMiwJMHhjMCwgMywgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJjciIsCSAgIDIsCTB4ZDIsIDMsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyY3IiLAkgICAxLAkweGQwLCAzLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJzYWwiLAkgICAyLAkweGQwLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2FsIiwJICAgMiwJMHhjMCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNhbCIsCSAgIDIsCTB4ZDIsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzYWwiLAkgICAxLAkweGQwLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsic2hsIiwJICAgMiwJMHhkMCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNobCIsCSAgIDIsCTB4YzAsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzaGwiLAkgICAyLAkweGQyLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2hsIiwJICAgMSwJMHhkMCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsic2hsZCIsICAgMywgMHgwZmE0LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IEltbTgsIFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbX0gfSwKLXsic2hsZCIsICAgMywgMHgwZmE1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFNoaWZ0Q291bnQsIFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbX0gfSwKLXsic2hsZCIsICAgMiwgMHgwZmE1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLQoteyJzaHIiLAkgICAyLAkweGQwLCA1LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2hyIiwJICAgMiwJMHhjMCwgNSwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNociIsCSAgIDIsCTB4ZDIsIDUsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzaHIiLAkgICAxLAkweGQwLCA1LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJzaHJkIiwgICAzLCAweDBmYWMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOCwgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtfSB9LAoteyJzaHJkIiwgICAzLCAweDBmYWQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgU2hpZnRDb3VudCwgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtfSB9LAoteyJzaHJkIiwgICAyLCAweDBmYWQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAotCi17InNhciIsCSAgIDIsCTB4ZDAsIDcsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0xLCBSZWd8QW55TWVtLCAwfSB9LAoteyJzYXIiLAkgICAyLAkweGMwLCA3LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tOCwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2FyIiwJICAgMiwJMHhkMiwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IFNoaWZ0Q291bnQsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNhciIsCSAgIDEsCTB4ZDAsIDcsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAotCi0vKiBjb250cm9sIHRyYW5zZmVyIGluc3RydWN0aW9ucyAqLwoteyJjYWxsIiwgICAxLAkweGU4LCBYLCB3bF9TdWZ8SnVtcER3b3JkLAl7IERpc3AxNnxEaXNwMzIsIDAsIDB9IH0sCi17ImNhbGwiLCAgIDEsCTB4ZmYsIDIsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtfEp1bXBBYnNvbHV0ZSwgMCwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJjYWxsIiwgICAyLCAweDlhLCBYLCB3bF9TdWZ8SnVtcEludGVyU2VnbWVudCwgeyBJbW0xNiwgSW1tMTZ8SW1tMzIsIDB9IH0sCi17ImxjYWxsIiwgIDIsCTB4OWEsIFgsIHdsX1N1ZnxKdW1wSW50ZXJTZWdtZW50LCB7IEltbTE2LCBJbW0xNnxJbW0zMiwgMH0gfSwKLXsibGNhbGwiLCAgMSwJMHhmZiwgMywgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAotCi0jZGVmaW5lIEpVTVBfUENfUkVMQVRJVkUgMHhlYgoteyJqbXAiLAkgICAxLAkweGViLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbXAiLAkgICAxLAkweGZmLCA0LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbXxKdW1wQWJzb2x1dGUsIDAsIDB9IH0sCi0vKiBJbnRlbCBTeW50YXggKi8KLXsiam1wIiwgICAyLAkweGVhLCBYLCB3bF9TdWZ8SnVtcEludGVyU2VnbWVudCwgeyBJbW0xNiwgSW1tMTZ8SW1tMzIsIDB9IH0sCi17ImptcCIsICAgMSwJMHhmZiwgNSwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAoteyJsam1wIiwgICAyLAkweGVhLCBYLCB3bF9TdWZ8SnVtcEludGVyU2VnbWVudCwgeyBJbW0xNiwgSW1tMTZ8SW1tMzIsIDB9IH0sCi17ImxqbXAiLCAgIDEsCTB4ZmYsIDUsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgMCwgMH0gfSwKLQoteyJyZXQiLAkgICAwLAkweGMzLCBYLCB3bF9TdWYsCQl7IDAsIDAsIDB9IH0sCi17InJldCIsCSAgIDEsCTB4YzIsIFgsIHdsX1N1ZiwJCXsgSW1tMTYsIDAsIDB9IH0sCi17ImxyZXQiLCAgIDAsCTB4Y2IsIFgsIHdsX1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsibHJldCIsICAgMSwJMHhjYSwgWCwgd2xfU3VmLAkJeyBJbW0xNiwgMCwgMH0gfSwKLXsiZW50ZXIiLCAgMiwJMHhjOCwgWCwgd2xfU3VmLAkJeyBJbW0xNiwgSW1tOCwgMH0gfSwKLXsibGVhdmUiLCAgMCwJMHhjOSwgWCwgd2xfU3VmLAkJeyAwLCAwLCAwfSB9LAotCi0vKiBjb25kaXRpb25hbCBqdW1wcyAqLwoteyJqbyIsCSAgIDEsCTB4NzAsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpubyIsCSAgIDEsCTB4NzEsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpiIiwJICAgMSwJMHg3MiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamMiLAkgICAxLAkweDcyLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmFlIiwgICAxLAkweDcyLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmIiLAkgICAxLAkweDczLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmMiLAkgICAxLAkweDczLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqYWUiLAkgICAxLAkweDczLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqZSIsCSAgIDEsCTB4NzQsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17Imp6IiwJICAgMSwJMHg3NCwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5lIiwJICAgMSwJMHg3NSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam56IiwJICAgMSwJMHg3NSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamJlIiwJICAgMSwJMHg3NiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5hIiwJICAgMSwJMHg3NiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5iZSIsICAgMSwJMHg3NywgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamEiLAkgICAxLAkweDc3LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqcyIsCSAgIDEsCTB4NzgsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpucyIsCSAgIDEsCTB4NzksIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpwIiwJICAgMSwJMHg3YSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsianBlIiwJICAgMSwJMHg3YSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5wIiwJICAgMSwJMHg3YiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsianBvIiwJICAgMSwJMHg3YiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamwiLAkgICAxLAkweDdjLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmdlIiwgICAxLAkweDdjLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmwiLAkgICAxLAkweDdkLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqZ2UiLAkgICAxLAkweDdkLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbGUiLAkgICAxLAkweDdlLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmciLAkgICAxLAkweDdlLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmxlIiwgICAxLAkweDdmLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqZyIsCSAgIDEsCTB4N2YsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi0KLS8qIGpjeHogdnMuIGplY3h6IGlzIGNob3NlbiBvbiB0aGUgYmFzaXMgb2YgdGhlIGFkZHJlc3Mgc2l6ZSBwcmVmaXguICAqLwoteyJqY3h6IiwgICAxLAkweGUzLCBYLCBOb1N1ZnxKdW1wQnl0ZXxTaXplMTYsIHsgRGlzcCwgMCwgMH0gfSwKLXsiamVjeHoiLCAgMSwJMHhlMywgWCwgTm9TdWZ8SnVtcEJ5dGV8U2l6ZTMyLCB7IERpc3AsIDAsIDB9IH0sCi0KLS8qIFRoZSBsb29wIGluc3RydWN0aW9ucyBhbHNvIHVzZSB0aGUgYWRkcmVzcyBzaXplIHByZWZpeCB0byBzZWxlY3QKLSAgICVjeCByYXRoZXIgdGhhbiAlZWN4IGZvciB0aGUgbG9vcCBjb3VudCwgc28gdGhlIGB3JyBmb3JtIG9mIHRoZXNlCi0gICBpbnN0cnVjdGlvbnMgZW1pdCBhbiBhZGRyZXNzIHNpemUgcHJlZml4IHJhdGhlciB0aGFuIGEgZGF0YSBzaXplCi0gICBwcmVmaXguICAqLwoteyJsb29wIiwgICAxLAkweGUyLCBYLCB3bF9TdWZ8SnVtcEJ5dGUsCXsgRGlzcCwgMCwgMH0gfSwKLXsibG9vcHoiLCAgMSwJMHhlMSwgWCwgd2xfU3VmfEp1bXBCeXRlLAl7IERpc3AsIDAsIDB9IH0sCi17Imxvb3BlIiwgIDEsCTB4ZTEsIFgsIHdsX1N1ZnxKdW1wQnl0ZSwJeyBEaXNwLCAwLCAwfSB9LAoteyJsb29wbnoiLCAxLAkweGUwLCBYLCB3bF9TdWZ8SnVtcEJ5dGUsCXsgRGlzcCwgMCwgMH0gfSwKLXsibG9vcG5lIiwgMSwJMHhlMCwgWCwgd2xfU3VmfEp1bXBCeXRlLAl7IERpc3AsIDAsIDB9IH0sCi0KLS8qIHNldCBieXRlIG9uIGZsYWcgaW5zdHJ1Y3Rpb25zICovCi17InNldG8iLCAgIDEsIDB4MGY5MCwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bm8iLCAgMSwgMHgwZjkxLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRiIiwgICAxLCAweDBmOTIsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGMiLCAgIDEsIDB4MGY5MiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmFlIiwgMSwgMHgwZjkyLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuYiIsICAxLCAweDBmOTMsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5jIiwgIDEsIDB4MGY5MywgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0YWUiLCAgMSwgMHgwZjkzLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRlIiwgICAxLCAweDBmOTQsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldHoiLCAgIDEsIDB4MGY5NCwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmUiLCAgMSwgMHgwZjk1LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRueiIsICAxLCAweDBmOTUsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGJlIiwgIDEsIDB4MGY5NiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmEiLCAgMSwgMHgwZjk2LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuYmUiLCAxLCAweDBmOTcsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGEiLCAgIDEsIDB4MGY5NywgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0cyIsICAgMSwgMHgwZjk4LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRucyIsICAxLCAweDBmOTksIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldHAiLCAgIDEsIDB4MGY5YSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0cGUiLCAgMSwgMHgwZjlhLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRucCIsICAxLCAweDBmOWIsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldHBvIiwgIDEsIDB4MGY5YiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bCIsICAgMSwgMHgwZjljLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuZ2UiLCAxLCAweDBmOWMsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5sIiwgIDEsIDB4MGY5ZCwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0Z2UiLCAgMSwgMHgwZjlkLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRsZSIsICAxLCAweDBmOWUsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5nIiwgIDEsIDB4MGY5ZSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmxlIiwgMSwgMHgwZjlmLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRnIiwgICAxLCAweDBmOWYsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi0KLS8qIHN0cmluZyBtYW5pcHVsYXRpb24gKi8KLXsiY21wcyIsICAgMCwJMHhhNiwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJjbXBzIiwgICAyLAkweGE2LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgQW55TWVtLCAwfSB9LAoteyJzY21wIiwgICAwLAkweGE2LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17InNjbXAiLCAgIDIsCTB4YTYsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtfEVzU2VnLCBBbnlNZW0sIDB9IH0sCi17ImlucyIsCSAgIDAsCTB4NmMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsiaW5zIiwJICAgMiwJMHg2YywgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBJbk91dFBvcnRSZWcsIEFueU1lbXxFc1NlZywgMH0gfSwKLXsib3V0cyIsICAgMCwJMHg2ZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJvdXRzIiwgICAyLAkweDZlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgSW5PdXRQb3J0UmVnLCAwfSB9LAoteyJsb2RzIiwgICAwLAkweGFjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17ImxvZHMiLCAgIDEsCTB4YWMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCAwLCAwfSB9LAoteyJsb2RzIiwgICAyLAkweGFjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgQWNjLCAwfSB9LAoteyJzbG9kIiwgICAwLAkweGFjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17InNsb2QiLCAgIDEsCTB4YWMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCAwLCAwfSB9LAoteyJzbG9kIiwgICAyLAkweGFjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgQWNjLCAwfSB9LAoteyJtb3ZzIiwgICAwLAkweGE0LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17Im1vdnMiLCAgIDIsCTB4YTQsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCBBbnlNZW18RXNTZWcsIDB9IH0sCi17InNtb3YiLCAgIDAsCTB4YTQsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsic21vdiIsICAgMiwJMHhhNCwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIEFueU1lbXxFc1NlZywgMH0gfSwKLXsic2NhcyIsICAgMCwJMHhhZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzY2FzIiwgICAxLAkweGFlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgMCwgMH0gfSwKLXsic2NhcyIsICAgMiwJMHhhZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIEFjYywgMH0gfSwKLXsic3NjYSIsICAgMCwJMHhhZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzc2NhIiwgICAxLAkweGFlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgMCwgMH0gfSwKLXsic3NjYSIsICAgMiwJMHhhZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIEFjYywgMH0gfSwKLXsic3RvcyIsICAgMCwJMHhhYSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzdG9zIiwgICAxLAkweGFhLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgMCwgMH0gfSwKLXsic3RvcyIsICAgMiwJMHhhYSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBY2MsIEFueU1lbXxFc1NlZywgMH0gfSwKLXsic3N0byIsICAgMCwJMHhhYSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzc3RvIiwgICAxLAkweGFhLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgMCwgMH0gfSwKLXsic3N0byIsICAgMiwJMHhhYSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBY2MsIEFueU1lbXxFc1NlZywgMH0gfSwKLXsieGxhdCIsICAgMCwJMHhkNywgWCwgYl9TdWZ8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsieGxhdCIsICAgMSwJMHhkNywgWCwgYl9TdWZ8SXNTdHJpbmcsCXsgQW55TWVtLCAwLCAwfSB9LAotCi0vKiBiaXQgbWFuaXB1bGF0aW9uICovCi17ImJzZiIsCSAgIDIsIDB4MGZiYywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImJzciIsCSAgIDIsIDB4MGZiZCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImJ0IiwJICAgMiwgMHgwZmEzLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYnQiLAkgICAyLCAweDBmYmEsIDQsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOCwgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJidGMiLAkgICAyLCAweDBmYmIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJidGMiLAkgICAyLCAweDBmYmEsIDcsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOCwgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJidHIiLAkgICAyLCAweDBmYjMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJidHIiLAkgICAyLCAweDBmYmEsIDYsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOCwgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJidHMiLAkgICAyLCAweDBmYWIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJidHMiLAkgICAyLCAweDBmYmEsIDUsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOCwgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAotCi0vKiBpbnRlcnJ1cHRzICYgb3AuIHN5cyBpbnNucyAqLwotLyogU2VlIGdhcy9jb25maWcvdGMtaTM4Ni5jIGZvciBjb252ZXJzaW9uIG9mICdpbnQgJDMnIGludG8gdGhlIHNwZWNpYWwKLSAgIGludCAzIGluc24uICovCi0jZGVmaW5lIElOVF9PUENPREUgMHhjZAotI2RlZmluZSBJTlQzX09QQ09ERSAweGNjCi17ImludCIsCSAgIDEsCTB4Y2QsIFgsIE5vU3VmLAkJCXsgSW1tOCwgMCwgMH0gfSwKLXsiaW50MyIsICAgMCwJMHhjYywgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJpbnRvIiwgICAwLAkweGNlLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImlyZXQiLCAgIDAsCTB4Y2YsIFgsIHdsX1N1ZiwJCXsgMCwgMCwgMH0gfSwKLS8qIGkzODZzbCwgaTQ4NnNsLCBsYXRlciA0ODYsIGFuZCBQZW50aXVtICovCi17InJzbSIsCSAgIDAsIDB4MGZhYSwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAotCi17ImJvdW5kIiwgIDIsCTB4NjIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZE1lbSwgMH0gfSwKLQoteyJobHQiLAkgICAwLAkweGY0LCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi0vKiBub3AgaXMgYWN0dWFsbHkgJ3hjaGdsICVlYXgsICVlYXgnICovCi17Im5vcCIsCSAgIDAsCTB4OTAsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLQotLyogcHJvdGVjdGlvbiBjb250cm9sICovCi17ImFycGwiLCAgIDIsCTB4NjMsIFgsIE5vU3VmfE1vZHJtfElnbm9yZVNpemUseyBSZWcxNiwgUmVnMTZ8U2hvcnRNZW0sIDB9IH0sCi17ImxhciIsCSAgIDIsIDB4MGYwMiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImxnZHQiLCAgIDEsIDB4MGYwMSwgMiwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAoteyJsaWR0IiwgICAxLCAweDBmMDEsIDMsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgMCwgMH0gfSwKLXsibGxkdCIsICAgMSwgMHgwZjAwLCAyLCBOb1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTZ8U2hvcnRNZW0sIDAsIDB9IH0sCi17Imxtc3ciLCAgIDEsIDB4MGYwMSwgNiwgTm9TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2fFNob3J0TWVtLCAwLCAwfSB9LAoteyJsc2wiLAkgICAyLCAweDBmMDMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJsdHIiLAkgICAxLCAweDBmMDAsIDMsIE5vU3VmfE1vZHJtfElnbm9yZVNpemUseyBSZWcxNnxTaG9ydE1lbSwgMCwgMH0gfSwKLQoteyJzZ2R0IiwgICAxLCAweDBmMDEsIDAsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgMCwgMH0gfSwKLXsic2lkdCIsICAgMSwgMHgwZjAxLCAxLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIDAsIDB9IH0sCi17InNsZHQiLCAgIDEsIDB4MGYwMCwgMCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIDAsIDB9IH0sCi17InNtc3ciLCAgIDEsIDB4MGYwMSwgNCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIDAsIDB9IH0sCi17InN0ciIsCSAgIDEsIDB4MGYwMCwgMSwgTm9TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2fFNob3J0TWVtLCAwLCAwfSB9LAotCi17InZlcnIiLCAgIDEsIDB4MGYwMCwgNCwgTm9TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2fFNob3J0TWVtLCAwLCAwfSB9LAoteyJ2ZXJ3IiwgICAxLCAweDBmMDAsIDUsIE5vU3VmfE1vZHJtfElnbm9yZVNpemUseyBSZWcxNnxTaG9ydE1lbSwgMCwgMH0gfSwKLQotLyogZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zICovCi0KLS8qIGxvYWQgKi8KLXsiZmxkIiwJICAgMSwgMHhkOWMwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LCAvKiByZWdpc3RlciAqLwoteyJmbGQiLAkgICAxLAkweGQ5LCAwLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gZmxvYXQvZG91YmxlICovCi17ImZsZCIsCSAgIDEsIDB4ZDljMCwgWCwgbF9GUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCAwLCAwfSB9LAotLyogSW50ZWwgU3ludGF4ICovCi17ImZsZCIsICAgIDEsCTB4ZGIsIDUsIHhfRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gZWZsb2F0ICovCi17ImZpbGQiLCAgIDEsCTB4ZGYsIDAsIHNsX1N1ZnxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgPC0tIG1lbSB3b3JkKDE2KS9kd29yZCgzMikgKi8KLS8qIEludGVsIFN5bnRheCAqLwoteyJmaWxkIiwgIDEsCTB4ZGYsIDUsIGRfU3VmfElnbm9yZVNpemV8TW9kcm0seyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIHF3b3JkICg2NCkgKi8KLXsiZmlsZHEiLCAgMSwJMHhkZiwgNSwgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gcXdvcmQgKDY0KSAqLwoteyJmaWxkbGwiLCAxLAkweGRmLCA1LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgPC0tIG1lbSBxd29yZCAoNjQpICovCi17ImZsZHQiLCAgIDEsCTB4ZGIsIDUsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIGVmbG9hdCAqLwoteyJmYmxkIiwgICAxLAkweGRmLCA0LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgPC0tIG1lbSBiY2QgKi8KLQotLyogc3RvcmUgKG5vIHBvcCkgKi8KLXsiZnN0IiwJICAgMSwgMHhkZGQwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LCAvKiByZWdpc3RlciAqLwoteyJmc3QiLAkgICAxLAkweGQ5LCAyLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gZmxvYXQvZG91YmxlICovCi17ImZzdCIsCSAgIDEsIDB4ZGRkMCwgWCwgbF9GUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmaXN0IiwgICAxLAkweGRmLCAyLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gd29yZCgxNikvZHdvcmQoMzIpICovCi0KLS8qIHN0b3JlICh3aXRoIHBvcCkgKi8KLXsiZnN0cCIsICAgMSwgMHhkZGQ4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LCAvKiByZWdpc3RlciAqLwoteyJmc3RwIiwgICAxLAkweGQ5LCAzLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gZmxvYXQvZG91YmxlICovCi17ImZzdHAiLCAgIDEsIDB4ZGRkOCwgWCwgbF9GUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCAwLCAwfSB9LAotLyogSW50ZWwgU3ludGF4ICovCi17ImZzdHAiLCAgIDEsCTB4ZGIsIDcsIHhfRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gZWZsb2F0ICovCi17ImZpc3RwIiwgIDEsCTB4ZGYsIDMsIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIHdvcmQoMTYpL2R3b3JkKDMyKSAqLwotLyogSW50ZWwgU3ludGF4ICovCi17ImZpc3RwIiwgMSwJMHhkZiwgNywgZF9GUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBxd29yZCAoNjQpICovCi17ImZpc3RwcSIsIDEsCTB4ZGYsIDcsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIHF3b3JkICg2NCkgKi8KLXsiZmlzdHBsbCIsMSwJMHhkZiwgNywgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gcXdvcmQgKDY0KSAqLwoteyJmc3RwdCIsICAxLAkweGRiLCA3LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBlZmxvYXQgKi8KLXsiZmJzdHAiLCAgMSwJMHhkZiwgNiwgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gYmNkICovCi0KLS8qIGV4Y2hhbmdlICVzdDxuPiB3aXRoICVzdDAgKi8KLXsiZnhjaCIsICAgMSwgMHhkOWM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmeGNoIiwgICAwLCAweGQ5YzksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZnhjaCAlc3QoMSkgKi8KLQotLyogY29tcGFyaXNvbiAod2l0aG91dCBwb3ApICovCi17ImZjb20iLCAgIDEsIDB4ZDhkMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmNvbSIsICAgMCwgMHhkOGQxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZjb20gJXN0KDEpICovCi17ImZjb20iLCAgIDEsCTB4ZDgsIDIsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sIC8qIGNvbXBhcmUgJXN0MCwgbWVtIGZsb2F0L2RvdWJsZSAqLwoteyJmY29tIiwgICAxLCAweGQ4ZDAsIFgsIGxfRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmljb20iLCAgMSwJMHhkZSwgMiwgc2xfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LCAvKiBjb21wYXJlICVzdDAsIG1lbSB3b3JkL2R3b3JkICovCi0KLS8qIGNvbXBhcmlzb24gKHdpdGggcG9wKSAqLwoteyJmY29tcCIsICAxLCAweGQ4ZDgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZjb21wIiwgIDAsIDB4ZDhkOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmY29tcCAlc3QoMSkgKi8KLXsiZmNvbXAiLCAgMSwJMHhkOCwgMywgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwgLyogY29tcGFyZSAlc3QwLCBtZW0gZmxvYXQvZG91YmxlICovCi17ImZjb21wIiwgIDEsIDB4ZDhkOCwgWCwgbF9GUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmaWNvbXAiLCAxLAkweGRlLCAzLCBzbF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sIC8qIGNvbXBhcmUgJXN0MCwgbWVtIHdvcmQvZHdvcmQgKi8KLXsiZmNvbXBwIiwgMCwgMHhkZWQ5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogY29tcGFyZSAlc3QwLCAlc3QxICYgcG9wIDIgKi8KLQotLyogdW5vcmRlcmVkIGNvbXBhcmlzb24gKHdpdGggcG9wKSAqLwoteyJmdWNvbSIsICAxLCAweGRkZTAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZ1Y29tIiwgIDAsIDB4ZGRlMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmdWNvbSAlc3QoMSkgKi8KLXsiZnVjb21wIiwgMSwgMHhkZGU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmdWNvbXAiLCAwLCAweGRkZTksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZnVjb21wICVzdCgxKSAqLwoteyJmdWNvbXBwIiwwLCAweGRhZTksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiB1Y29tcGFyZSAlc3QwLCAlc3QxICYgcG9wIHR3aWNlICovCi0KLXsiZnRzdCIsICAgMCwgMHhkOWU0LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogdGVzdCAlc3QwICovCi17ImZ4YW0iLCAgIDAsIDB4ZDllNSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGV4YW1pbmUgJXN0MCAqLwotCi0vKiBsb2FkIGNvbnN0YW50cyBpbnRvICVzdDAgKi8KLXsiZmxkMSIsICAgMCwgMHhkOWU4LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogJXN0MCA8LS0gMS4wICovCi17ImZsZGwydCIsIDAsIDB4ZDllOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIGxvZzIoMTApICovCi17ImZsZGwyZSIsIDAsIDB4ZDllYSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIGxvZzIoZSkgKi8KLXsiZmxkcGkiLCAgMCwgMHhkOWViLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogJXN0MCA8LS0gcGkgKi8KLXsiZmxkbGcyIiwgMCwgMHhkOWVjLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogJXN0MCA8LS0gbG9nMTAoMikgKi8KLXsiZmxkbG4yIiwgMCwgMHhkOWVkLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogJXN0MCA8LS0gbG4oMikgKi8KLXsiZmxkeiIsICAgMCwgMHhkOWVlLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogJXN0MCA8LS0gMC4wICovCi0KLS8qIGFyaXRobWV0aWMgKi8KLQotLyogYWRkICovCi17ImZhZGQiLCAgIDIsIDB4ZDhjMCwgWCwgRlB8U2hvcnRGb3JtfEZsb2F0RCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZhZGQiLCAgIDEsIDB4ZDhjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwgLyogYWxpYXMgZm9yIGZhZGQgJXN0KGkpLCAlc3QgKi8KLSNpZiBVTklYV0FSRV9DT01QQVQKLXsiZmFkZCIsICAgMCwgMHhkZWMxLCBYLCBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZhZGRwICovCi0jZW5kaWYKLXsiZmFkZCIsICAgMSwJMHhkOCwgMCwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmlhZGQiLCAgMSwJMHhkZSwgMCwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLQoteyJmYWRkcCIsICAyLCAweGRlYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmYWRkcCIsICAxLCAweGRlYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZhZGRwIiwgIDAsIDB4ZGVjMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmYWRkcCAlc3QsICVzdCgxKSAqLwoteyJmYWRkcCIsICAyLCAweGRlYzAsIFgsIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAotCi0vKiBzdWJ0cmFjdCAqLwoteyJmc3ViIiwgICAyLCAweGQ4ZTAsIFgsIEZQfFNob3J0Rm9ybXxGbG9hdERSLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZnN1YiIsICAgMSwgMHhkOGUwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmc3ViIiwgICAwLCAweGRlZTEsIFgsIEZQfFVnaCwJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZnN1YnAgKi8KLSNlbmRpZgoteyJmc3ViIiwgICAxLAkweGQ4LCA0LCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LAoteyJmaXN1YiIsICAxLAkweGRlLCA0LCBzbF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sCi0KLSNpZiBVTklYV0FSRV9DT01QQVQKLXsiZnN1YnAiLCAgMiwgMHhkZWUwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZnN1YnAiLCAgMSwgMHhkZWUwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmc3VicCIsICAwLCAweGRlZTEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnN1YnAiLCAgMiwgMHhkZWUwLCBYLCBGUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLSNlbHNlCi17ImZzdWJwIiwgIDIsIDB4ZGVlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZzdWJwIiwgIDEsIDB4ZGVlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnN1YnAiLCAgMCwgMHhkZWU5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi0jZW5kaWYKLQotLyogc3VidHJhY3QgcmV2ZXJzZSAqLwoteyJmc3ViciIsICAyLCAweGQ4ZTgsIFgsIEZQfFNob3J0Rm9ybXxGbG9hdERSLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZnN1YnIiLCAgMSwgMHhkOGU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmc3ViciIsICAwLCAweGRlZTksIFgsIEZQfFVnaCwJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZnN1YnJwICovCi0jZW5kaWYKLXsiZnN1YnIiLCAgMSwJMHhkOCwgNSwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmlzdWJyIiwgMSwJMHhkZSwgNSwgc2xfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LAotCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi17ImZzdWJycCIsIDIsIDB4ZGVlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZzdWJycCIsIDEsIDB4ZGVlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnN1YnJwIiwgMCwgMHhkZWU5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZzdWJycCIsIDIsIDB4ZGVlOCwgWCwgRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi0jZWxzZQoteyJmc3VicnAiLCAyLCAweGRlZTAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmc3VicnAiLCAxLCAweGRlZTAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZzdWJycCIsIDAsIDB4ZGVlMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAotI2VuZGlmCi0KLS8qIG11bHRpcGx5ICovCi17ImZtdWwiLCAgIDIsIDB4ZDhjOCwgWCwgRlB8U2hvcnRGb3JtfEZsb2F0RCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZtdWwiLCAgIDEsIDB4ZDhjOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLSNpZiBVTklYV0FSRV9DT01QQVQKLXsiZm11bCIsICAgMCwgMHhkZWM5LCBYLCBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZtdWxwICovCi0jZW5kaWYKLXsiZm11bCIsICAgMSwJMHhkOCwgMSwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmltdWwiLCAgMSwJMHhkZSwgMSwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLQoteyJmbXVscCIsICAyLCAweGRlYzgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmbXVscCIsICAxLCAweGRlYzgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZtdWxwIiwgIDAsIDB4ZGVjOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmbXVscCIsICAyLCAweGRlYzgsIFgsIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAotCi0vKiBkaXZpZGUgKi8KLXsiZmRpdiIsICAgMiwgMHhkOGYwLCBYLCBGUHxTaG9ydEZvcm18RmxvYXREUiwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZkaXYiLCAgIDEsIDB4ZDhmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLSNpZiBVTklYV0FSRV9DT01QQVQKLXsiZmRpdiIsICAgMCwgMHhkZWYxLCBYLCBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZkaXZwICovCi0jZW5kaWYKLXsiZmRpdiIsICAgMSwJMHhkOCwgNiwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmlkaXYiLCAgMSwJMHhkZSwgNiwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLQotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmZGl2cCIsICAyLCAweGRlZjAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmZGl2cCIsICAxLCAweGRlZjAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZkaXZwIiwgIDAsIDB4ZGVmMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmZGl2cCIsICAyLCAweGRlZjAsIFgsIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAotI2Vsc2UKLXsiZmRpdnAiLCAgMiwgMHhkZWY4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZmRpdnAiLCAgMSwgMHhkZWY4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmZGl2cCIsICAwLCAweGRlZjksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLSNlbmRpZgotCi0vKiBkaXZpZGUgcmV2ZXJzZSAqLwoteyJmZGl2ciIsICAyLCAweGQ4ZjgsIFgsIEZQfFNob3J0Rm9ybXxGbG9hdERSLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmRpdnIiLCAgMSwgMHhkOGY4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmZGl2ciIsICAwLCAweGRlZjksIFgsIEZQfFVnaCwJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZmRpdnJwICovCi0jZW5kaWYKLXsiZmRpdnIiLCAgMSwJMHhkOCwgNywgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmlkaXZyIiwgMSwJMHhkZSwgNywgc2xfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LAotCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi17ImZkaXZycCIsIDIsIDB4ZGVmOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZkaXZycCIsIDEsIDB4ZGVmOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmRpdnJwIiwgMCwgMHhkZWY5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZkaXZycCIsIDIsIDB4ZGVmOCwgWCwgRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi0jZWxzZQoteyJmZGl2cnAiLCAyLCAweGRlZjAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmZGl2cnAiLCAxLCAweGRlZjAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZkaXZycCIsIDAsIDB4ZGVmMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAotI2VuZGlmCi0KLXsiZjJ4bTEiLCAgMCwgMHhkOWYwLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZ5bDJ4IiwgIDAsIDB4ZDlmMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmcHRhbiIsICAwLCAweGQ5ZjIsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnBhdGFuIiwgMCwgMHhkOWYzLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZ4dHJhY3QiLDAsIDB4ZDlmNCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmcHJlbTEiLCAwLCAweGQ5ZjUsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmRlY3N0cCIsMCwgMHhkOWY2LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZpbmNzdHAiLDAsIDB4ZDlmNywgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmcHJlbSIsICAwLCAweGQ5ZjgsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnlsMnhwMSIsMCwgMHhkOWY5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZzcXJ0IiwgIDAsIDB4ZDlmYSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmc2luY29zIiwwLCAweGQ5ZmIsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnJuZGludCIsMCwgMHhkOWZjLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZzY2FsZSIsIDAsIDB4ZDlmZCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmc2luIiwgICAwLCAweGQ5ZmUsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmNvcyIsICAgMCwgMHhkOWZmLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZjaHMiLCAgIDAsIDB4ZDllMCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmYWJzIiwgICAwLCAweGQ5ZTEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLQotLyogcHJvY2Vzc29yIGNvbnRyb2wgKi8KLXsiZm5pbml0IiwgMCwgMHhkYmUzLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZpbml0IiwgIDAsIDB4ZGJlMywgWCwgRlB8RldhaXQsCQl7IDAsIDAsIDB9IH0sCi17ImZsZGN3IiwgIDEsCTB4ZDksIDUsIEZQfE1vZHJtLAkJeyBTaG9ydE1lbSwgMCwgMH0gfSwKLXsiZm5zdGN3IiwgMSwJMHhkOSwgNywgRlB8TW9kcm0sCQl7IFNob3J0TWVtLCAwLCAwfSB9LAoteyJmc3RjdyIsICAxLAkweGQ5LCA3LCBGUHxGV2FpdHxNb2RybSwJeyBTaG9ydE1lbSwgMCwgMH0gfSwKLXsiZm5zdHN3IiwgMSwgMHhkZmUwLCBYLCBGUCwJCQl7IEFjYywgMCwgMH0gfSwKLXsiZm5zdHN3IiwgMSwJMHhkZCwgNywgRlB8TW9kcm0sCQl7IFNob3J0TWVtLCAwLCAwfSB9LAoteyJmbnN0c3ciLCAwLCAweGRmZTAsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnN0c3ciLCAgMSwgMHhkZmUwLCBYLCBGUHxGV2FpdCwJCXsgQWNjLCAwLCAwfSB9LAoteyJmc3RzdyIsICAxLAkweGRkLCA3LCBGUHxGV2FpdHxNb2RybSwJeyBTaG9ydE1lbSwgMCwgMH0gfSwKLXsiZnN0c3ciLCAgMCwgMHhkZmUwLCBYLCBGUHxGV2FpdCwJCXsgMCwgMCwgMH0gfSwKLXsiZm5jbGV4IiwgMCwgMHhkYmUyLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZjbGV4IiwgIDAsIDB4ZGJlMiwgWCwgRlB8RldhaXQsCQl7IDAsIDAsIDB9IH0sCi0vKiBTaG9ydCBmb3JtcyBvZiBmbGRlbnYsIGZzdGVudiB1c2UgZGF0YSBzaXplIHByZWZpeC4KLSAgIEZJWE1FOiBBcmUgdGhlc2UgdGhlIHJpZ2h0IHN1ZmZpeGVzPyAgKi8KLXsiZm5zdGVudiIsMSwJMHhkOSwgNiwgc2xfU3VmfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZnN0ZW52IiwgMSwJMHhkOSwgNiwgc2xfU3VmfEZXYWl0fE1vZHJtLAl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmbGRlbnYiLCAxLAkweGQ5LCA0LCBzbF9TdWZ8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmbnNhdmUiLCAxLAkweGRkLCA2LCBzbF9TdWZ8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmc2F2ZSIsICAxLAkweGRkLCA2LCBzbF9TdWZ8RldhaXR8TW9kcm0sCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17ImZyc3RvciIsIDEsCTB4ZGQsIDQsIHNsX1N1ZnxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi0KLXsiZmZyZWUiLCAgMSwgMHhkZGMwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotLyogUDY6ZnJlZSBzdChpKSwgcG9wIHN0ICovCi17ImZmcmVlcCIsIDEsIDB4ZGZjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZm5vcCIsICAgMCwgMHhkOWQwLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIEZXQUlUX09QQ09ERSAweDliCi17ImZ3YWl0IiwgIDAsCTB4OWIsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLQotLyoKLSAgb3Bjb2RlIHByZWZpeGVzOyB3ZSBhbGxvdyB0aGVtIGFzIHNlcGVyYXRlIGluc25zIHRvbwotKi8KLSNkZWZpbmUgQUREUl9QUkVGSVhfT1BDT0RFIDB4NjcKLXsiYWRkcjE2IiwgMCwJMHg2NywgWCwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTE2fElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLXsiYWRkcjMyIiwgMCwJMHg2NywgWCwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTMyfElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLXsiYXdvcmQiLCAgMCwJMHg2NywgWCwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTE2fElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLXsiYWR3b3JkIiwgMCwJMHg2NywgWCwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTMyfElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgREFUQV9QUkVGSVhfT1BDT0RFIDB4NjYKLXsiZGF0YTE2IiwgMCwJMHg2NiwgWCwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTE2fElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLXsiZGF0YTMyIiwgMCwJMHg2NiwgWCwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTMyfElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLXsid29yZCIsICAgMCwJMHg2NiwgWCwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTE2fElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLXsiZHdvcmQiLCAgMCwJMHg2NiwgWCwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTMyfElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgTE9DS19QUkVGSVhfT1BDT0RFIDB4ZjAKLXsibG9jayIsICAgMCwJMHhmMCwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLXsid2FpdCIsICAgMCwgICAweDliLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBDU19QUkVGSVhfT1BDT0RFIDB4MmUKLXsiY3MiLAkgICAwLAkweDJlLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBEU19QUkVGSVhfT1BDT0RFIDB4M2UKLXsiZHMiLAkgICAwLAkweDNlLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBFU19QUkVGSVhfT1BDT0RFIDB4MjYKLXsiZXMiLAkgICAwLAkweDI2LCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBGU19QUkVGSVhfT1BDT0RFIDB4NjQKLXsiZnMiLAkgICAwLAkweDY0LCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBHU19QUkVGSVhfT1BDT0RFIDB4NjUKLXsiZ3MiLAkgICAwLAkweDY1LCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBTU19QUkVGSVhfT1BDT0RFIDB4MzYKLXsic3MiLAkgICAwLAkweDM2LCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBSRVBORV9QUkVGSVhfT1BDT0RFIDB4ZjIKLSNkZWZpbmUgUkVQRV9QUkVGSVhfT1BDT0RFICAweGYzCi17InJlcCIsCSAgIDAsCTB4ZjMsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi17InJlcGUiLCAgIDAsCTB4ZjMsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi17InJlcHoiLCAgIDAsCTB4ZjMsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi17InJlcG5lIiwgIDAsCTB4ZjIsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi17InJlcG56IiwgIDAsCTB4ZjIsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0KLS8qIDQ4NiBleHRlbnNpb25zICovCi0KLXsiYnN3YXAiLCAgIDEsIDB4MGZjOCwgWCwgTm9TdWZ8U2hvcnRGb3JtLAl7IFJlZzMyLDAsMCB9IH0sCi17InhhZGQiLCAgICAyLCAweDBmYzAsIFgsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDAgfSB9LAoteyJjbXB4Y2hnIiwgMiwgMHgwZmIwLCBYLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwIH0gfSwKLXsiaW52ZCIsICAgIDAsIDB4MGYwOCwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17IndiaW52ZCIsICAwLCAweDBmMDksIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJpbnZscGciLCAgMSwgMHgwZjAxLCA3LCBOb1N1ZnxNb2RybSwJCXsgQW55TWVtLCAwLCAwfSB9LAotCi0vKiA1ODYgYW5kIGxhdGUgNDg2IGV4dGVuc2lvbnMgKi8KLXsiY3B1aWQiLCAgIDAsIDB4MGZhMiwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi0KLS8qIFBlbnRpdW0gZXh0ZW5zaW9ucyAqLwoteyJ3cm1zciIsICAgMCwgMHgwZjMwLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsicmR0c2MiLCAgIDAsIDB4MGYzMSwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17InJkbXNyIiwgICAwLCAweDBmMzIsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJjbXB4Y2hnOGIiLDEsMHgwZmM3LCAxLCBOb1N1ZnxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17InN5c2VudGVyIiwgMCwgMHgwZjM0LCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsic3lzZXhpdCIsICAwLCAweDBmMzUsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJmeHNhdmUiLCAgIDEsCTB4MGZhZSwgMCwgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmeHJzdG9yIiwgIDEsCTB4MGZhZSwgMSwgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAotCi0vKiBQZW50aXVtIFBybyBleHRlbnNpb25zICovCi17InJkcG1jIiwgICAwLCAweDBmMzMsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAotCi17InVkMiIsCSAgICAwLCAweDBmMGIsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LCAvKiBvZmZpY2lhbCB1bmRlZmluZWQgaW5zdHIuICovCi17InVkMmEiLCAgICAwLCAweDBmMGIsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LCAvKiBhbGlhcyBmb3IgdWQyICovCi17InVkMmIiLCAgICAwLCAweDBmYjksIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LCAvKiAybmQuIG9mZmljaWFsIHVuZGVmaW5lZCBpbnN0ci4gKi8KLQoteyJjbW92byIsICAgMiwgMHgwZjQwLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5vIiwgIDIsIDB4MGY0MSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZiIiwgICAyLCAweDBmNDIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92YyIsICAgMiwgMHgwZjQyLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5hZSIsIDIsIDB4MGY0MiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZhZSIsICAyLCAweDBmNDMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bmMiLCAgMiwgMHgwZjQzLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5iIiwgIDIsIDB4MGY0MywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZlIiwgICAyLCAweDBmNDQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92eiIsICAgMiwgMHgwZjQ0LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5lIiwgIDIsIDB4MGY0NSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZueiIsICAyLCAweDBmNDUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92YmUiLCAgMiwgMHgwZjQ2LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5hIiwgIDIsIDB4MGY0NiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZhIiwgICAyLCAweDBmNDcsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bmJlIiwgMiwgMHgwZjQ3LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdnMiLCAgIDIsIDB4MGY0OCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZucyIsICAyLCAweDBmNDksIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92cCIsICAgMiwgMHgwZjRhLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5wIiwgIDIsIDB4MGY0YiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZsIiwgICAyLCAweDBmNGMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bmdlIiwgMiwgMHgwZjRjLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmdlIiwgIDIsIDB4MGY0ZCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZubCIsICAyLCAweDBmNGQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bGUiLCAgMiwgMHgwZjRlLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5nIiwgIDIsIDB4MGY0ZSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZnIiwgICAyLCAweDBmNGYsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bmxlIiwgMiwgMHgwZjRmLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLQoteyJmY21vdmIiLCAgMiwgMHhkYWMwLCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm5hZSIsMiwgMHhkYWMwLCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdmUiLCAgMiwgMHhkYWM4LCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdmJlIiwgMiwgMHhkYWQwLCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm5hIiwgMiwgMHhkYWQwLCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdnUiLCAgMiwgMHhkYWQ4LCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdmFlIiwgMiwgMHhkYmMwLCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm5iIiwgMiwgMHhkYmMwLCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm5lIiwgMiwgMHhkYmM4LCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdmEiLCAgMiwgMHhkYmQwLCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm5iZSIsMiwgMHhkYmQwLCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm51IiwgMiwgMHhkYmQ4LCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAotCi17ImZjb21pIiwgICAyLCAweGRiZjAsIFgsIE5vU3VmfFNob3J0Rm9ybSwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjb21pIiwgICAwLCAweGRiZjEsIFgsIE5vU3VmfFNob3J0Rm9ybSwJeyAwLCAwLCAwfSB9LAoteyJmY29taSIsICAgMSwgMHhkYmYwLCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZ1Y29taSIsICAyLCAweGRiZTgsIFgsIE5vU3VmfFNob3J0Rm9ybSwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZ1Y29taSIsICAwLCAweGRiZTksIFgsIE5vU3VmfFNob3J0Rm9ybSwJeyAwLCAwLCAwfSB9LAoteyJmdWNvbWkiLCAgMSwgMHhkYmU4LCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZjb21pcCIsICAyLCAweGRmZjAsIFgsIE5vU3VmfFNob3J0Rm9ybSwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjb21waSIsICAyLCAweGRmZjAsIFgsIE5vU3VmfFNob3J0Rm9ybSwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjb21waSIsICAwLCAweGRmZjEsIFgsIE5vU3VmfFNob3J0Rm9ybSwJeyAwLCAwLCAwfSB9LAoteyJmY29tcGkiLCAgMSwgMHhkZmYwLCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZ1Y29taXAiLCAyLCAweGRmZTgsIFgsIE5vU3VmfFNob3J0Rm9ybSwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZ1Y29tcGkiLCAyLCAweGRmZTgsIFgsIE5vU3VmfFNob3J0Rm9ybSwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZ1Y29tcGkiLCAwLCAweGRmZTksIFgsIE5vU3VmfFNob3J0Rm9ybSwJeyAwLCAwLCAwfSB9LAoteyJmdWNvbXBpIiwgMSwgMHhkZmU4LCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0KLS8qIE1NWCBpbnN0cnVjdGlvbnMuICAqLwotCi17ImVtbXMiLCAgICAgMCwgMHgwZjc3LCBYLCBGUCwJCQl7IDAsIDAsIDAgfSB9LAoteyJtb3ZkIiwgICAgIDIsIDB4MGY2ZSwgWCwgRlB8TW9kcm0sCQl7IFJlZzMyfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17Im1vdmQiLCAgICAgMiwgMHgwZjdlLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YLCBSZWczMnxMb25nTWVtLCAwIH0gfSwKLXsibW92cSIsICAgICAyLCAweDBmNmYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsibW92cSIsICAgICAyLCAweDBmN2YsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVgsIFJlZ01NWHxMb25nTWVtLCAwIH0gfSwKLXsicGFja3NzZHciLCAyLCAweDBmNmIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFja3Nzd2IiLCAyLCAweDBmNjMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFja3Vzd2IiLCAyLCAweDBmNjcsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZGIiLCAgICAyLCAweDBmZmMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHciLCAgICAyLCAweDBmZmQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZGQiLCAgICAyLCAweDBmZmUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHNiIiwgICAyLCAweDBmZWMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHN3IiwgICAyLCAweDBmZWQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHVzYiIsICAyLCAweDBmZGMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHVzdyIsICAyLCAweDBmZGQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFuZCIsICAgICAyLCAweDBmZGIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFuZG4iLCAgICAyLCAweDBmZGYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGVxYiIsICAyLCAweDBmNzQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGVxdyIsICAyLCAweDBmNzUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGVxZCIsICAyLCAweDBmNzYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGd0YiIsICAyLCAweDBmNjQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGd0dyIsICAyLCAweDBmNjUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGd0ZCIsICAyLCAweDBmNjYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG1hZGR3ZCIsICAyLCAweDBmZjUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG11bGh3IiwgICAyLCAweDBmZTUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG11bGx3IiwgICAyLCAweDBmZDUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG9yIiwJICAgICAyLCAweDBmZWIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNsbHciLCAgICAyLCAweDBmZjEsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNsbHciLCAgICAyLCAweDBmNzEsIDYsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc2xsZCIsICAgIDIsIDB4MGZmMiwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc2xsZCIsICAgIDIsIDB4MGY3MiwgNiwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzbGxxIiwgICAgMiwgMHgwZmYzLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzbGxxIiwgICAgMiwgMHgwZjczLCA2LCBGUHxNb2RybSwJCXsgSW1tOCwgUmVnTU1YLCAwIH0gfSwKLXsicHNyYXciLCAgICAyLCAweDBmZTEsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNyYXciLCAgICAyLCAweDBmNzEsIDQsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc3JhZCIsICAgIDIsIDB4MGZlMiwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3JhZCIsICAgIDIsIDB4MGY3MiwgNCwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzcmx3IiwgICAgMiwgMHgwZmQxLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzcmx3IiwgICAgMiwgMHgwZjcxLCAyLCBGUHxNb2RybSwJCXsgSW1tOCwgUmVnTU1YLCAwIH0gfSwKLXsicHNybGQiLCAgICAyLCAweDBmZDIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNybGQiLCAgICAyLCAweDBmNzIsIDIsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc3JscSIsICAgIDIsIDB4MGZkMywgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3JscSIsICAgIDIsIDB4MGY3MywgMiwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzdWJiIiwgICAgMiwgMHgwZmY4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJ3IiwgICAgMiwgMHgwZmY5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJkIiwgICAgMiwgMHgwZmZhLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJzYiIsICAgMiwgMHgwZmU4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJzdyIsICAgMiwgMHgwZmU5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJ1c2IiLCAgMiwgMHgwZmQ4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJ1c3ciLCAgMiwgMHgwZmQ5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2hidyIsMiwgMHgwZjY4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2h3ZCIsMiwgMHgwZjY5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2hkcSIsMiwgMHgwZjZhLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2xidyIsMiwgMHgwZjYwLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2x3ZCIsMiwgMHgwZjYxLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2xkcSIsMiwgMHgwZjYyLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB4b3IiLCAgICAgMiwgMHgwZmVmLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi0KLQotLyogUElJSSBLYXRtYWkgTmV3IEluc3RydWN0aW9ucyAvIFNJTUQgaW5zdHJ1Y3Rpb25zICovCi0KLXsiYWRkcHMiLCAgICAgMiwgMHgwZjU4LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImFkZHNzIiwgICAgIDIsIDB4ZjMwZjU4LCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImFuZG5wcyIsICAgIDIsIDB4MGY1NSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJhbmRwcyIsICAgICAyLCAweDBmNTQsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBwcyIsICAgICAzLCAweDBmYzIsICAgIFgsIEZQfE1vZHJtLAl7IEltbTgsIFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NIH0gfSwKLXsiY21wc3MiLCAgICAgMywgMHhmMzBmYzIsICBYLCBGUHxNb2RybSwJeyBJbW04LCBSZWdYTU18V29yZE1lbSwgUmVnWE1NIH0gfSwKLXsiY21wZXFwcyIsICAgMiwgMHgwZmMyLCAgICAwLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBlcXNzIiwgICAyLCAweGYzMGZjMiwgIDAsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbHRwcyIsICAgMiwgMHgwZmMyLCAgICAxLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBsdHNzIiwgICAyLCAweGYzMGZjMiwgIDEsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbGVwcyIsICAgMiwgMHgwZmMyLCAgICAyLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBsZXNzIiwgICAyLCAweGYzMGZjMiwgIDIsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wdW5vcmRwcyIsMiwgMHgwZmMyLCAgICAzLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXB1bm9yZHNzIiwyLCAweGYzMGZjMiwgIDMsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbmVxcHMiLCAgMiwgMHgwZmMyLCAgICA0LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBuZXFzcyIsICAyLCAweGYzMGZjMiwgIDQsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbmx0cHMiLCAgMiwgMHgwZmMyLCAgICA1LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBubHRzcyIsICAyLCAweGYzMGZjMiwgIDUsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbmxlcHMiLCAgMiwgMHgwZmMyLCAgICA2LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBubGVzcyIsICAyLCAweGYzMGZjMiwgIDYsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wb3JkcHMiLCAgMiwgMHgwZmMyLCAgICA3LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBvcmRzcyIsICAyLCAweGYzMGZjMiwgIDcsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY29taXNzIiwgICAgMiwgMHgwZjJmLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY3Z0cGkycHMiLCAgMiwgMHgwZjJhLCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImN2dHNpMnNzIiwgIDIsIDB4ZjMwZjJhLCAgWCwgRlB8TW9kcm0sCXsgUmVnMzJ8V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY3Z0cHMycGkiLCAgMiwgMHgwZjJkLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17ImN2dHNzMnNpIiwgIDIsIDB4ZjMwZjJkLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZzMyLCAwIH0gfSwKLXsiY3Z0dHBzMnBpIiwgMiwgMHgwZjJjLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17ImN2dHRzczJzaSIsIDIsIDB4ZjMwZjJjLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZzMyLCAwIH0gfSwKLXsiZGl2cHMiLCAgICAgMiwgMHgwZjVlLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImRpdnNzIiwgICAgIDIsIDB4ZjMwZjVlLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImxkbXhjc3IiLCAgIDEsIDB4MGZhZSwgICAgMiwgRlB8TW9kcm0sIAl7IFdvcmRNZW0sIDAsIDAgfSB9LAoteyJzdG14Y3NyIiwgICAxLCAweDBmYWUsICAgIDMsIEZQfE1vZHJtLCAJeyBXb3JkTWVtLCAwLCAwIH0gfSwKLXsic2ZlbmNlIiwgICAgMCwgMHgwZmFlZjgsICBYLCBGUCwJCXsgMCwgMCwgMCB9IH0sCi17Im1heHBzIiwgICAgIDIsIDB4MGY1ZiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtYXhzcyIsICAgICAyLCAweGYzMGY1ZiwgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtaW5wcyIsICAgICAyLCAweDBmNWQsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsibWluc3MiLCAgICAgMiwgMHhmMzBmNWQsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92YXBzIiwgICAgMiwgMHgwZjI4LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdmFwcyIsICAgIDIsIDB4MGYyOSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NLCBSZWdYTU18TExvbmdNZW0sIDAgfSB9LAoteyJtb3ZobHBzIiwgICAyLCAweDBmMTIsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxJbnZNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdmhwcyIsICAgIDIsIDB4MGYxNiwgICAgWCwgRlB8TW9kcm0sCXsgTExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdmhwcyIsICAgIDIsIDB4MGYxNywgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NLCBMTG9uZ01lbSwgMCB9IH0sCi17Im1vdmxocHMiLCAgIDIsIDB4MGYxNiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfEludk1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92bHBzIiwgICAgMiwgMHgwZjEyLCAgICBYLCBGUHxNb2RybSwJeyBMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92bHBzIiwgICAgMiwgMHgwZjEzLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU0sIExMb25nTWVtLCAwIH0gfSwKLXsibW92bXNrcHMiLCAgMiwgMHgwZjUwLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18SW52TWVtLCBSZWczMiwgMCB9IH0sCi17Im1vdnVwcyIsICAgIDIsIDB4MGYxMCwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtb3Z1cHMiLCAgICAyLCAweDBmMTEsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTSwgUmVnWE1NfExMb25nTWVtLCAwIH0gfSwKLXsibW92c3MiLCAgICAgMiwgMHhmMzBmMTAsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92c3MiLCAgICAgMiwgMHhmMzBmMTEsICBYLCBGUHxNb2RybSwJeyBSZWdYTU0sIFJlZ1hNTXxXb3JkTWVtLCAwIH0gfSwKLXsibXVscHMiLCAgICAgMiwgMHgwZjU5LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im11bHNzIiwgICAgIDIsIDB4ZjMwZjU5LCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im9ycHMiLCAgICAgIDIsIDB4MGY1NiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJyY3BwcyIsICAgICAyLCAweDBmNTMsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsicmNwc3MiLCAgICAgMiwgMHhmMzBmNTMsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsicnNxcnRwcyIsICAgMiwgMHgwZjUyLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InJzcXJ0c3MiLCAgIDIsIDB4ZjMwZjUyLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InNodWZwcyIsICAgIDMsIDB4MGZjNiwgICAgWCwgRlB8TW9kcm0sCXsgSW1tOCwgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0gfSB9LAoteyJzcXJ0cHMiLCAgICAyLCAweDBmNTEsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsic3FydHNzIiwgICAgMiwgMHhmMzBmNTEsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsic3VicHMiLCAgICAgMiwgMHgwZjVjLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InN1YnNzIiwgICAgIDIsIDB4ZjMwZjVjLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InVjb21pc3MiLCAgIDIsIDB4MGYyZSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InVucGNraHBzIiwgIDIsIDB4MGYxNSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJ1bnBja2xwcyIsICAyLCAweDBmMTQsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsieG9ycHMiLCAgICAgMiwgMHgwZjU3LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InBhdmdiIiwgICAgIDIsIDB4MGZlMCwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwYXZndyIsICAgICAyLCAweDBmZTMsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGV4dHJ3IiwgICAgMywgMHgwZmM1LCAgICBYLCBGUHxNb2RybSwJeyBJbW04LCBSZWdNTVgsIFJlZzMyfEludk1lbSB9IH0sCi17InBpbnNydyIsICAgIDMsIDB4MGZjNCwgICAgWCwgRlB8TW9kcm0sCXsgSW1tOCwgUmVnMzJ8U2hvcnRNZW0sIFJlZ01NWCB9IH0sCi17InBtYXhzdyIsICAgIDIsIDB4MGZlZSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbWF4dWIiLCAgICAyLCAweDBmZGUsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG1pbnN3IiwgICAgMiwgMHgwZmVhLCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBtaW51YiIsICAgIDIsIDB4MGZkYSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbW92bXNrYiIsICAyLCAweDBmZDcsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWCwgUmVnMzJ8SW52TWVtLCAwIH0gfSwKLXsicG11bGh1dyIsICAgMiwgMHgwZmU0LCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzYWRidyIsICAgIDIsIDB4MGZmNiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc2h1ZnciLCAgICAzLCAweDBmNzAsICAgIFgsIEZQfE1vZHJtLAl7IEltbTgsIFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YIH0gfSwKLXsibWFza21vdnEiLCAgMiwgMHgwZmY3LCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8SW52TWVtLCBSZWdNTVgsIDAgfSB9LAoteyJtb3ZudHBzIiwgICAyLCAweDBmMmIsICAgIFgsIEZQfE1vZHJtLCAJeyBSZWdYTU0sIExMb25nTWVtLCAwIH0gfSwKLXsibW92bnRxIiwgICAgMiwgMHgwZmU3LCAgICBYLCBGUHxNb2RybSwgCXsgUmVnTU1YLCBMTG9uZ01lbSwgMCB9IH0sCi17InByZWZldGNobnRhIiwgMSwgMHgwZjE4LCAgMCwgRlB8TW9kcm0sIAl7IExMb25nTWVtLCAwLCAwIH0gfSwKLXsicHJlZmV0Y2h0MCIsICAxLCAweDBmMTgsICAxLCBGUHxNb2RybSwgCXsgTExvbmdNZW0sIDAsIDAgfSB9LAoteyJwcmVmZXRjaHQxIiwgIDEsIDB4MGYxOCwgIDIsIEZQfE1vZHJtLCAJeyBMTG9uZ01lbSwgMCwgMCB9IH0sCi17InByZWZldGNodDIiLCAgMSwgMHgwZjE4LCAgMywgRlB8TW9kcm0sIAl7IExMb25nTWVtLCAwLCAwIH0gfSwKLQotLyogQU1EIDNETm93ISBpbnN0cnVjdGlvbnMgKi8KLQoteyJwcmVmZXRjaCIsIDEsIDB4MGYwZCwJICAgMCwgRlB8TW9kcm0sCQl7IEJ5dGVNZW0sIDAsIDAgfSB9LAoteyJwcmVmZXRjaHciLDEsIDB4MGYwZCwJICAgMSwgRlB8TW9kcm0sCQl7IEJ5dGVNZW0sIDAsIDAgfSB9LAoteyJmZW1tcyIsICAgIDAsIDB4MGYwZSwJICAgWCwgRlAsCQl7IDAsIDAsIDAgfSB9LAoteyJwYXZndXNiIiwgIDIsIDB4MGYwZiwgMHhiZiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZjJpZCIsICAgIDIsIDB4MGYwZiwgMHgxZCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZmFjYyIsICAgIDIsIDB4MGYwZiwgMHhhZSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZmFkZCIsICAgIDIsIDB4MGYwZiwgMHg5ZSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZmNtcGVxIiwgIDIsIDB4MGYwZiwgMHhiMCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZmNtcGdlIiwgIDIsIDB4MGYwZiwgMHg5MCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZmNtcGd0IiwgIDIsIDB4MGYwZiwgMHhhMCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZm1heCIsICAgIDIsIDB4MGYwZiwgMHhhNCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZm1pbiIsICAgIDIsIDB4MGYwZiwgMHg5NCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZm11bCIsICAgIDIsIDB4MGYwZiwgMHhiNCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJjcCIsICAgIDIsIDB4MGYwZiwgMHg5NiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJjcGl0MSIsIDIsIDB4MGYwZiwgMHhhNiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJjcGl0MiIsIDIsIDB4MGYwZiwgMHhiNiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJzcWl0MSIsIDIsIDB4MGYwZiwgMHhhNywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJzcXJ0IiwgIDIsIDB4MGYwZiwgMHg5NywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnN1YiIsICAgIDIsIDB4MGYwZiwgMHg5YSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnN1YnIiLCAgIDIsIDB4MGYwZiwgMHhhYSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwaTJmZCIsICAgIDIsIDB4MGYwZiwgMHgwZCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbXVsaHJ3IiwgIDIsIDB4MGYwZiwgMHhiNywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAotCi17TlVMTCwgMCwgMCwgMCwgMCwgeyAwLCAwLCAwfSB9CS8qIHNlbnRpbmVsICovCi19OwotI3VuZGVmIFgKLSN1bmRlZiBOb1N1ZgotI3VuZGVmIGJfU3VmCi0jdW5kZWYgd19TdWYKLSN1bmRlZiBsX1N1ZgotI3VuZGVmIGJ3X1N1ZgotI3VuZGVmIGJsX1N1ZgotI3VuZGVmIHdsX1N1ZgotI3VuZGVmIHNsX1N1ZgotI3VuZGVmIGJ3bF9TdWYKLSN1bmRlZiBGUAotI3VuZGVmIGxfRlAKLSN1bmRlZiBzbF9GUAotCi0jZGVmaW5lIE1BWF9NTkVNX1NJWkUgMTYJLyogZm9yIHBhcnNpbmcgaW5zbiBtbmVtb25pY3MgZnJvbSBpbnB1dCAqLwotCi0KLS8qIDM4NiByZWdpc3RlciB0YWJsZSAqLwotCi1zdGF0aWMgY29uc3QgcmVnX2VudHJ5IGkzODZfcmVndGFiW10gPSB7Ci0gIC8qIDggYml0IHJlZ3MgKi8KLSAgeyJhbCIsIFJlZzh8QWNjLCAwfSwKLSAgeyJjbCIsIFJlZzh8U2hpZnRDb3VudCwgMX0sCi0gIHsiZGwiLCBSZWc4LCAyfSwKLSAgeyJibCIsIFJlZzgsIDN9LAotICB7ImFoIiwgUmVnOCwgNH0sCi0gIHsiY2giLCBSZWc4LCA1fSwKLSAgeyJkaCIsIFJlZzgsIDZ9LAotICB7ImJoIiwgUmVnOCwgN30sCi0gIC8qIDE2IGJpdCByZWdzICovCi0gIHsiYXgiLCBSZWcxNnxBY2MsIDB9LAotICB7ImN4IiwgUmVnMTYsIDF9LAotICB7ImR4IiwgUmVnMTZ8SW5PdXRQb3J0UmVnLCAyfSwKLSAgeyJieCIsIFJlZzE2fEJhc2VJbmRleCwgM30sCi0gIHsic3AiLCBSZWcxNiwgNH0sCi0gIHsiYnAiLCBSZWcxNnxCYXNlSW5kZXgsIDV9LAotICB7InNpIiwgUmVnMTZ8QmFzZUluZGV4LCA2fSwKLSAgeyJkaSIsIFJlZzE2fEJhc2VJbmRleCwgN30sCi0gIC8qIDMyIGJpdCByZWdzICovCi0gIHsiZWF4IiwgUmVnMzJ8QmFzZUluZGV4fEFjYywgMH0sCi0gIHsiZWN4IiwgUmVnMzJ8QmFzZUluZGV4LCAxfSwKLSAgeyJlZHgiLCBSZWczMnxCYXNlSW5kZXgsIDJ9LAotICB7ImVieCIsIFJlZzMyfEJhc2VJbmRleCwgM30sCi0gIHsiZXNwIiwgUmVnMzIsIDR9LAotICB7ImVicCIsIFJlZzMyfEJhc2VJbmRleCwgNX0sCi0gIHsiZXNpIiwgUmVnMzJ8QmFzZUluZGV4LCA2fSwKLSAgeyJlZGkiLCBSZWczMnxCYXNlSW5kZXgsIDd9LAotICAvKiBzZWdtZW50IHJlZ2lzdGVycyAqLwotICB7ImVzIiwgU1JlZzIsIDB9LAotICB7ImNzIiwgU1JlZzIsIDF9LAotICB7InNzIiwgU1JlZzIsIDJ9LAotICB7ImRzIiwgU1JlZzIsIDN9LAotICB7ImZzIiwgU1JlZzMsIDR9LAotICB7ImdzIiwgU1JlZzMsIDV9LAotICAvKiBjb250cm9sIHJlZ2lzdGVycyAqLwotICB7ImNyMCIsIENvbnRyb2wsIDB9LAotICB7ImNyMSIsIENvbnRyb2wsIDF9LAotICB7ImNyMiIsIENvbnRyb2wsIDJ9LAotICB7ImNyMyIsIENvbnRyb2wsIDN9LAotICB7ImNyNCIsIENvbnRyb2wsIDR9LAotICB7ImNyNSIsIENvbnRyb2wsIDV9LAotICB7ImNyNiIsIENvbnRyb2wsIDZ9LAotICB7ImNyNyIsIENvbnRyb2wsIDd9LAotICAvKiBkZWJ1ZyByZWdpc3RlcnMgKi8KLSAgeyJkYjAiLCBEZWJ1ZywgMH0sCi0gIHsiZGIxIiwgRGVidWcsIDF9LAotICB7ImRiMiIsIERlYnVnLCAyfSwKLSAgeyJkYjMiLCBEZWJ1ZywgM30sCi0gIHsiZGI0IiwgRGVidWcsIDR9LAotICB7ImRiNSIsIERlYnVnLCA1fSwKLSAgeyJkYjYiLCBEZWJ1ZywgNn0sCi0gIHsiZGI3IiwgRGVidWcsIDd9LAotICB7ImRyMCIsIERlYnVnLCAwfSwKLSAgeyJkcjEiLCBEZWJ1ZywgMX0sCi0gIHsiZHIyIiwgRGVidWcsIDJ9LAotICB7ImRyMyIsIERlYnVnLCAzfSwKLSAgeyJkcjQiLCBEZWJ1ZywgNH0sCi0gIHsiZHI1IiwgRGVidWcsIDV9LAotICB7ImRyNiIsIERlYnVnLCA2fSwKLSAgeyJkcjciLCBEZWJ1ZywgN30sCi0gIC8qIHRlc3QgcmVnaXN0ZXJzICovCi0gIHsidHIwIiwgVGVzdCwgMH0sCi0gIHsidHIxIiwgVGVzdCwgMX0sCi0gIHsidHIyIiwgVGVzdCwgMn0sCi0gIHsidHIzIiwgVGVzdCwgM30sCi0gIHsidHI0IiwgVGVzdCwgNH0sCi0gIHsidHI1IiwgVGVzdCwgNX0sCi0gIHsidHI2IiwgVGVzdCwgNn0sCi0gIHsidHI3IiwgVGVzdCwgN30sCi0gIC8qIGZsb2F0IHJlZ2lzdGVycyAqLwotICB7InN0KDApIiwgRmxvYXRSZWd8RmxvYXRBY2MsIDB9LAotICB7InN0IiwgRmxvYXRSZWd8RmxvYXRBY2MsIDB9LAotICB7InN0KDEpIiwgRmxvYXRSZWcsIDF9LAotICB7InN0KDIpIiwgRmxvYXRSZWcsIDJ9LAotICB7InN0KDMpIiwgRmxvYXRSZWcsIDN9LAotICB7InN0KDQpIiwgRmxvYXRSZWcsIDR9LAotICB7InN0KDUpIiwgRmxvYXRSZWcsIDV9LAotICB7InN0KDYpIiwgRmxvYXRSZWcsIDZ9LAotICB7InN0KDcpIiwgRmxvYXRSZWcsIDd9LAotICB7Im1tMCIsIFJlZ01NWCwgMH0sCi0gIHsibW0xIiwgUmVnTU1YLCAxfSwKLSAgeyJtbTIiLCBSZWdNTVgsIDJ9LAotICB7Im1tMyIsIFJlZ01NWCwgM30sCi0gIHsibW00IiwgUmVnTU1YLCA0fSwKLSAgeyJtbTUiLCBSZWdNTVgsIDV9LAotICB7Im1tNiIsIFJlZ01NWCwgNn0sCi0gIHsibW03IiwgUmVnTU1YLCA3fSwKLSAgeyJ4bW0wIiwgUmVnWE1NLCAwfSwKLSAgeyJ4bW0xIiwgUmVnWE1NLCAxfSwKLSAgeyJ4bW0yIiwgUmVnWE1NLCAyfSwKLSAgeyJ4bW0zIiwgUmVnWE1NLCAzfSwKLSAgeyJ4bW00IiwgUmVnWE1NLCA0fSwKLSAgeyJ4bW01IiwgUmVnWE1NLCA1fSwKLSAgeyJ4bW02IiwgUmVnWE1NLCA2fSwKLSAgeyJ4bW03IiwgUmVnWE1NLCA3fQotfTsKLQotI2RlZmluZSBNQVhfUkVHX05BTUVfU0laRSA4CS8qIGZvciBwYXJzaW5nIHJlZ2lzdGVyIG5hbWVzIGZyb20gaW5wdXQgKi8KLQotLyogc2VnbWVudCBzdHVmZiAqLwotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBjcyA9IHsgImNzIiwgMHgyZSB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBkcyA9IHsgImRzIiwgMHgzZSB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBzcyA9IHsgInNzIiwgMHgzNiB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBlcyA9IHsgImVzIiwgMHgyNiB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBmcyA9IHsgImZzIiwgMHg2NCB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBncyA9IHsgImdzIiwgMHg2NSB9OwotCi0vKiBlbmQgb2Ygb3Bjb2RlL2kzODYuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvaTg2MC5oIGIvaW5jbHVkZS9vcGNvZGUvaTg2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmViZDI1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2k4NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi0vKiBUYWJsZSBvZiBvcGNvZGVzIGZvciB0aGUgaTg2MC4KLSAgIENvcHlyaWdodCAoQykgMTk4OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlciwgYW5kIEdEQiwgdGhlIEdOVSBkaXNhc3NlbWJsZXIuCi0KLUdBUy9HREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMvR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTIG9yIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkKF9fU1REQ19fKSAmJiAhZGVmaW5lZChjb25zdCkKLSNkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKgotICogU3RydWN0dXJlIG9mIGFuIG9wY29kZSB0YWJsZSBlbnRyeS4KLSAqLwotc3RydWN0IGk4NjBfb3Bjb2RlCi17Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICB1bnNpZ25lZCBsb25nIG1hdGNoOwkvKiBCaXRzIHRoYXQgbXVzdCBiZSBzZXQuICAqLwotICAgIHVuc2lnbmVkIGxvbmcgbG9zZTsJLyogQml0cyB0aGF0IG11c3Qgbm90IGJlIHNldC4gICovCi0gICAgY29uc3QgY2hhciAqYXJnczsKLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgaXMgYSBwb3NzaWJsZSBleHBhbmQtaW5zdHJ1Y3Rpb24uICAqLwotICAgIGNoYXIgZXhwYW5kOwotfTsKLQotZW51bSBleHBhbmRfdHlwZQotewotICAgIEVfTU9WID0gMSwgRV9BRERSLCBFX1UzMiwgRV9BTkQsIEVfUzMyLCBFX0RFTEFZCi19OwotCi0vKgotICAgQWxsIGk4NjAgb3Bjb2RlcyBhcmUgMzIgYml0cywgZXhjZXB0IGZvciB0aGUgcHNldWRvaW5zdHJ1Y3Rpb25zCi0gICBhbmQgdGhlIG9wZXJhdGlvbnMgdXRpbGl6aW5nIGEgMzItYml0IGFkZHJlc3MgZXhwcmVzc2lvbiwgYW4KLSAgIHVuc2lnbmVkIDMyLWJpdCBjb25zdGFudCwgb3IgYSBzaWduZWQgMzItYml0IGNvbnN0YW50LgotICAgVGhlc2Ugb3Bjb2RlcyBhcmUgZXhwYW5kZWQgaW50byBhIHR3by1pbnN0cnVjdGlvbiBzZXF1ZW5jZSBmb3IKLSAgIGFueSBzaXR1YXRpb24gd2hlcmUgdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGRvZXMgbm90IGZpdCBpbiAzMiBiaXRzLgotICAgSW4gdGhlIGNhc2Ugb2YgdGhlIGFkZCBhbmQgc3VidHJhY3Qgb3BlcmF0aW9ucyB0aGUgZXhwYW5zaW9uIGlzCi0gICB0byBhIHRocmVlLWluc3RydWN0aW9uIHNlcXVlbmNlIChleDogb3JoLCBvciwgYWRkcykuICBJbiBjYXNlcwotICAgd2hlcmUgdGhlIGFkZHJlc3MgaXMgdG8gYmUgcmVsb2NhdGVkLCB0aGUgaW5zdHJ1Y3Rpb24gaXMKLSAgIGV4cGFuZGVkIHRvIGhhbmRsZSB0aGUgd29yc2UgY2FzZSwgdGhpcyBjb3VsZCBiZSBvcHRpbWl6ZWQgYXQKLSAgIHRoZSBmaW5hbCBsaW5rIGlmIHRoZSBhY3R1YWwgYWRkcmVzcyB3ZXJlIGtub3duLgotCi0gICBUaGUgcHNldWRvaW5zdHJ1Y3Rpb25zIGFyZTogIG1vdiwgZm1vdiwgcG1vdiwgbm9wLCBhbmQgZm5vcC4KLSAgIFRoZXNlIGluc3RydWN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYXMgYSBvbmUgb3IgdHdvIGluc3RydWN0aW9uCi0gICBzZXF1ZW5jZSBvZiBvdGhlciBvcGVyYXRpb25zLgotCi0gICBUaGUgbWF0Y2ggY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoIGEKLSAgIHBhcnRpY3VsYXIgb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZQotICAgb2YgdGhhdCBvcGNvZGUuCi0KLSAgIFRoZSBhcmdzIGNvbXBvbmVudCBpcyBhIHN0cmluZyBjb250YWluaW5nIG9uZSBjaGFyYWN0ZXIKLSAgIGZvciBlYWNoIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uLgotCi1LaW5kcyBvZiBvcGVyYW5kczoKLSAgICMgICAgTnVtYmVyIHVzZWQgYnkgb3B0aW1pemVyLiAgSXQgaXMgaWdub3JlZC4KLSAgIDEgICAgc3JjMSBpbnRlZ2VyIHJlZ2lzdGVyLgotICAgMiAgICBzcmMyIGludGVnZXIgcmVnaXN0ZXIuCi0gICBkICAgIGRlc3QgcmVnaXN0ZXIuCi0gICBjCWN0cmxyZWcgY29udHJvbCByZWdpc3Rlci4KLSAgIGkgICAgMTYgYml0IGltbWVkaWF0ZS4KLSAgIEkgICAgMTYgYml0IGltbWVkaWF0ZSwgYWxpZ25lZC4KLSAgIDUgICAgNSBiaXQgaW1tZWRpYXRlLgotICAgbCAgICBsYnJvZmYgMjYgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZS4KLSAgIHIgICAgc2Jyb2ZmIDE2IGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuCi0gICBzCXNwbGl0IDE2IGJpdCBpbW1lZGlhdGUuCi0gICBTCXNwbGl0IDE2IGJpdCBpbW1lZGlhdGUsIGFsaWduZWQuCi0gICBlICAgIHNyYzEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0gICBmICAgIHNyYzIgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0gICBnICAgIGRlc3QgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0KLSovCi0KLS8qIFRoZSBvcmRlciBvZiB0aGUgb3Bjb2RlcyBpbiB0aGlzIHRhYmxlIGlzIHNpZ25pZmljYW50OgotICAgCi0gICAqIFRoZSBhc3NlbWJsZXIgcmVxdWlyZXMgdGhhdCBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUKLSAgIGNvbnNlY3V0aXZlLiAgSWYgdGhleSBhcmVuJ3QsIHRoZSBhc3NlbWJsZXIgd2lsbCBib21iIGF0IHJ1bnRpbWUuCi0KLSAgICogVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgbm90IGNhcmUgYWJvdXQgdGhlIG9yZGVyIG9mIHRoZSBvcGNvZGVzLiAgKi8KLQotc3RhdGljIHN0cnVjdCBpODYwX29wY29kZSBpODYwX29wY29kZXNbXSA9Ci17Ci0KLS8qIFJFRy1Gb3JtYXQgSW5zdHJ1Y3Rpb25zICovCi17ICJsZC5jIiwJMHgzMDAwMDAwMCwgMHhjYzAwMDAwMCwgImMsZCIsIDAgfSwJLyogbGQuYyBjc3JjMixpZGVzdCAqLwoteyAibGQuYiIsCTB4MDAwMDAwMDAsIDB4ZmMwMDAwMDAsICIxKDIpLGQiLCAwIH0sCS8qIGxkLmIgaXNyYzEoaXNyYzIpLGlkZXN0ICovCi17ICJsZC5iIiwJMHgwNDAwMDAwMCwgMHhmODAwMDAwMCwgIkkoMiksZCIsIEVfQUREUiB9LAkvKiBsZC5iICNjb25zdChpc3JjMiksaWRlc3QgKi8KLXsgImxkLnMiLAkweDEwMDAwMDAwLCAweGVjMDAwMDAxLCAiMSgyKSxkIiwgMCB9LAkvKiBsZC5zIGlzcmMxKGlzcmMyKSxpZGVzdCAqLwoteyAibGQucyIsCTB4MTQwMDAwMDEsIDB4ZTgwMDAwMDAsICJJKDIpLGQiLCBFX0FERFIgfSwJLyogbGQucyAjY29uc3QoaXNyYzIpLGlkZXN0ICovCi17ICJsZC5sIiwJMHgxMDAwMDAwMSwgMHhlYzAwMDAwMCwgIjEoMiksZCIsIDAgfSwJLyogbGQubCBpc3JjMShpc3JjMiksaWRlc3QgKi8KLXsgImxkLmwiLAkweDE0MDAwMDAxLCAweGU4MDAwMDAwLCAiSSgyKSxkIiwgRV9BRERSIH0sCS8qIGxkLmwgI2NvbnN0KGlzcmMyKSxpZGVzdCAqLwotCi17ICJzdC5jIiwJMHgzODAwMDAwMCwgMHhjNDAwMDAwMCwgIjEsYyIsIDAgfSwJLyogc3QuYyBpc3JjMW5pLGNzcmMyICovCi17ICJzdC5iIiwJMHgwYzAwMDAwMCwgMHhmMDAwMDAwMCwgIjEsUygyKSIsIEVfQUREUiB9LAkvKiBzdC5iIGlzcmMxbmksI2NvbnN0KGlzcmMyKSAqLwoteyAic3QucyIsCTB4MWMwMDAwMDAsIDB4ZTAwMDAwMDAsICIxLFMoMikiLCBFX0FERFIgfSwJLyogc3QucyBpc3JjMW5pLCNjb25zdChpc3JjMikgKi8KLXsgInN0LmwiLAkweDFjMDAwMDAxLCAweGUwMDAwMDAwLCAiMSxTKDIpIiwgRV9BRERSIH0sCS8qIHN0LmwgaXNyYzFuaSwjY29uc3QoaXNyYzIpICovCi0KLXsgIml4ZnIiLAkweDA4MDAwMDAwLCAweGY0MDAwMDAwLCAiMSxnIiwgMCB9LAkvKiBpeGZyIGlzcmMxbmksZmRlc3QgKi8KLQoteyAiZmxkLmwiLAkweDIwMDAwMDAyLCAweGRjMDAwMDAxLCAiMSgyKSxnIiwgMCB9LAkvKiBmbGQubCBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5sIiwJMHgyNDAwMDAwMiwgMHhkODAwMDAwMSwgImkoMiksZyIsIEVfQUREUiB9LAkvKiBmbGQubCAjY29uc3QoaXNyYzIpLGZkZXN0ICovCi17ICJmbGQubCIsCTB4MjAwMDAwMDMsIDB4ZGMwMDAwMDAsICIxKDIpKyssZyIsIDAgfSwJLyogZmxkLmwgaXNyYzEoaXNyYzIpKyssZmRlc3QgKi8KLXsgImZsZC5sIiwJMHgyNDAwMDAwMywgMHhkODAwMDAwMCwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIGZsZC5sICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwoteyAiZmxkLmQiLAkweDIwMDAwMDAwLCAweGRjMDAwMDA3LCAiMSgyKSxnIiwgMCB9LAkvKiBmbGQuZCBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5kIiwJMHgyNDAwMDAwMCwgMHhkODAwMDAwNywgImkoMiksZyIsIEVfQUREUiB9LAkvKiBmbGQuZCAjY29uc3QoaXNyYzIpLGZkZXN0ICovCi17ICJmbGQuZCIsCTB4MjAwMDAwMDEsIDB4ZGMwMDAwMDYsICIxKDIpKyssZyIsIDAgfSwJLyogZmxkLmQgaXNyYzEoaXNyYzIpKyssZmRlc3QgKi8KLXsgImZsZC5kIiwJMHgyNDAwMDAwMSwgMHhkODAwMDAwNiwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIGZsZC5kICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwoteyAiZmxkLnEiLAkweDIwMDAwMDA0LCAweGRjMDAwMDAzLCAiMSgyKSxnIiwgMCB9LAkvKiBmbGQucSBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5xIiwJMHgyNDAwMDAwNCwgMHhkODAwMDAwMywgImkoMiksZyIsIEVfQUREUiB9LAkvKiBmbGQucSAjY29uc3QoaXNyYzIpLGZkZXN0ICovCi17ICJmbGQucSIsCTB4MjAwMDAwMDUsIDB4ZGMwMDAwMDIsICIxKDIpKyssZyIsIDAgfSwJLyogZmxkLnEgaXNyYzEoaXNyYzIpKyssZmRlc3QgKi8KLXsgImZsZC5xIiwJMHgyNDAwMDAwNSwgMHhkODAwMDAwMiwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIGZsZC5xICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwotCi17ICJwZmxkLmwiLAkweDYwMDAwMDAwLCAweDljMDAwMDAzLCAiMSgyKSxnIiwgMCB9LAkvKiBwZmxkLmwgaXNyYzEoaXNyYzIpLGZkZXN0ICovCi17ICJwZmxkLmwiLAkweDY0MDAwMDAwLCAweDk4MDAwMDAzLCAiaSgyKSxnIiwgRV9BRERSIH0sCS8qIHBmbGQubCAjY29uc3QoaXNyYzIpLGZkZXN0ICovCi17ICJwZmxkLmwiLAkweDYwMDAwMDAxLCAweDljMDAwMDAyLCAiMSgyKSsrLGciLCAwIH0sCS8qIHBmbGQubCBpc3JjMShpc3JjMikrKyxmZGVzdCAqLwoteyAicGZsZC5sIiwJMHg2NDAwMDAwMSwgMHg5ODAwMDAwMiwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIHBmbGQubCAjY29uc3QoaXNyYzIpKyssZmRlc3QgKi8KLXsgInBmbGQuZCIsCTB4NjAwMDAwMDAsIDB4OWMwMDAwMDcsICIxKDIpLGciLCAwIH0sCS8qIHBmbGQuZCBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgInBmbGQuZCIsCTB4NjQwMDAwMDAsIDB4OTgwMDAwMDcsICJpKDIpLGciLCBFX0FERFIgfSwJLyogcGZsZC5kICNjb25zdChpc3JjMiksZmRlc3QgKi8KLXsgInBmbGQuZCIsCTB4NjAwMDAwMDEsIDB4OWMwMDAwMDYsICIxKDIpKyssZyIsIDAgfSwJLyogcGZsZC5kIGlzcmMxKGlzcmMyKSsrLGZkZXN0ICovCi17ICJwZmxkLmQiLAkweDY0MDAwMDAxLCAweDk4MDAwMDA2LCAiaSgyKSsrLGciLCBFX0FERFIgfSwJLyogcGZsZC5kICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwotCi17ICJmc3QubCIsCTB4MjgwMDAwMDIsIDB4ZDQwMDAwMDEsICJnLDEoMikiLCAwIH0sCS8qIGZzdC5sIGZkZXN0LGlzcmMxKGlzcmMyKSAqLwoteyAiZnN0LmwiLAkweDJjMDAwMDAyLCAweGQwMDAwMDAxLCAiZyxpKDIpIiwgRV9BRERSIH0sCS8qIGZzdC5sIGZkZXN0LCNjb25zdChpc3JjMikgKi8KLXsgImZzdC5sIiwJMHgyODAwMDAwMywgMHhkNDAwMDAwMCwgImcsMSgyKSsrIiwgMCB9LAkvKiBmc3QubCBmZGVzdCxpc3JjMShpc3JjMikrKyAqLwoteyAiZnN0LmwiLAkweDJjMDAwMDAzLCAweGQwMDAwMDAwLCAiZyxpKDIpKysiLCBFX0FERFIgfSwJLyogZnN0LmwgZmRlc3QsI2NvbnN0KGlzcmMyKSsrICovCi17ICJmc3QuZCIsCTB4MjgwMDAwMDAsIDB4ZDQwMDAwMDcsICJnLDEoMikiLCAwIH0sCS8qIGZzdC5kIGZkZXN0LGlzcmMxKGlzcmMyKSAqLwoteyAiZnN0LmQiLAkweDJjMDAwMDAwLCAweGQwMDAwMDA3LCAiZyxpKDIpIiwgRV9BRERSIH0sCS8qIGZzdC5kIGZkZXN0LCNjb25zdChpc3JjMikgKi8KLXsgImZzdC5kIiwJMHgyODAwMDAwMSwgMHhkNDAwMDAwNiwgImcsMSgyKSsrIiwgMCB9LAkvKiBmc3QuZCBmZGVzdCxpc3JjMShpc3JjMikrKyAqLwoteyAiZnN0LmQiLAkweDJjMDAwMDAxLCAweGQwMDAwMDA2LCAiZyxpKDIpKysiLCBFX0FERFIgfSwJLyogZnN0LmQgZmRlc3QsI2NvbnN0KGlzcmMyKSsrICovCi0KLXsgInBzdC5kIiwJMHgzYzAwMDAwMCwgMHhjMDAwMDAwNywgImcsaSgyKSIsIEVfQUREUiB9LAkvKiBwc3QuZCBmZGVzdCwjY29uc3QoaXNyYzIpICovCi17ICJwc3QuZCIsCTB4M2MwMDAwMDEsIDB4YzAwMDAwMDYsICJnLGkoMikrKyIsIEVfQUREUiB9LAkvKiBwc3QuZCBmZGVzdCwjY29uc3QoaXNyYzIpKysgKi8KLQoteyAiYWRkdSIsCTB4ODAwMDAwMDAsIDB4N2MwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogYWRkdSBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAiYWRkdSIsCTB4ODQwMDAwMDAsIDB4NzgwMDAwMDAsICJpLDIsZCIsIEVfUzMyIH0sCS8qIGFkZHUgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJhZGRzIiwJMHg5MDAwMDAwMCwgMHg2YzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBhZGRzIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJhZGRzIiwJMHg5NDAwMDAwMCwgMHg2ODAwMDAwMCwgImksMixkIiwgRV9TMzIgfSwJLyogYWRkcyAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInN1YnUiLAkweDg4MDAwMDAwLCAweDc0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHN1YnUgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInN1YnUiLAkweDhjMDAwMDAwLCAweDcwMDAwMDAwLCAiaSwyLGQiLCBFX1MzMiB9LAkvKiBzdWJ1ICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAic3VicyIsCTB4OTgwMDAwMDAsIDB4NjQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc3VicyBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAic3VicyIsCTB4OWMwMDAwMDAsIDB4NjAwMDAwMDAsICJpLDIsZCIsIEVfUzMyIH0sCS8qIHN1YnMgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi0KLXsgInNobCIsCTB4YTAwMDAwMDAsIDB4NWMwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc2hsIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJzaGwiLAkweGE0MDAwMDAwLCAweDU4MDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIHNobCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInNociIsCTB4YTgwMDAwMDAsIDB4NTQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc2hyIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJzaHIiLAkweGFjMDAwMDAwLCAweDUwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIHNociAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInNocmQiLAkweGIwMDAwMDAwLCAweDRjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHNocmQgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInNocmEiLAkweGI4MDAwMDAwLCAweDQ0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHNocmEgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInNocmEiLAkweGJjMDAwMDAwLCAweDQwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIHNocmEgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi0KLXsgIm1vdiIsCTB4YTAwMDAwMDAsIDB4NWMwMGY4MDAsICIyLGQiLCAwIH0sCS8qIHNobCByMCxpc3JjMixpZGVzdCAqLwoteyAibW92IiwJMHg5NDAwMDAwMCwgMHg2OWUwMDAwMCwgImksZCIsIEVfTU9WIH0sCS8qIGFkZHMgI2NvbnN0LHIwLGlkZXN0ICovCi17ICJub3AiLAkweGEwMDAwMDAwLCAweDVmZmZmODAwLCAiIiwgMCB9LAkvKiBzaGwgcjAscjAscjAgKi8KLXsgImZub3AiLAkweGIwMDAwMDAwLCAweDRmZmZmODAwLCAiIiwgMCB9LAkvKiBzaHJkIHIwLHIwLHIwICovCi0KLXsgInRyYXAiLAkweDQ0MDAwMDAwLCAweGI4MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHRyYXAgaXNyYzFuaSxpc3JjMixpZGVzdCAqLwotCi17ICJmbHVzaCIsCTB4MzQwMDAwMDAsIDB4YzgxZjAwMDEsICJpKDIpIiwgRV9BRERSIH0sCS8qIGZsdXNoICNjb25zdChpc3JjMikgKi8KLXsgImZsdXNoIiwJMHgzNDAwMDAwMSwgMHhjODFmMDAwMCwgImkoMikrKyIsIEVfQUREUiB9LAkvKiBmbHVzaCAjY29uc3QoaXNyYzIpKysgKi8KLQoteyAiYW5kIiwJMHhjMDAwMDAwMCwgMHgzYzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBhbmQgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgImFuZCIsCTB4YzQwMDAwMDAsIDB4MzgwMDAwMDAsICJpLDIsZCIsIEVfQU5EIH0sCS8qIGFuZCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgImFuZGgiLAkweGM4MDAwMDAwLCAweDM0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIGFuZGggaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgImFuZGgiLAkweGNjMDAwMDAwLCAweDMwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIGFuZGggI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJhbmRub3QiLAkweGQwMDAwMDAwLCAweDJjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIGFuZG5vdCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAiYW5kbm90IiwJMHhkNDAwMDAwMCwgMHgyODAwMDAwMCwgImksMixkIiwgRV9VMzIgfSwJLyogYW5kbm90ICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAiYW5kbm90aCIsCTB4ZDgwMDAwMDAsIDB4MjQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogYW5kbm90aCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAiYW5kbm90aCIsCTB4ZGMwMDAwMDAsIDB4MjAwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogYW5kbm90aCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgIm9yIiwJCTB4ZTAwMDAwMDAsIDB4MWMwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogb3IgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgIm9yIiwJCTB4ZTQwMDAwMDAsIDB4MTgwMDAwMDAsICJpLDIsZCIsIEVfVTMyIH0sCS8qIG9yICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAib3JoIiwJMHhlODAwMDAwMCwgMHgxNDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBvcmggaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgIm9yaCIsCTB4ZWMwMDAwMDAsIDB4MTAwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogb3JoICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAieG9yIiwJMHhmMDAwMDAwMCwgMHgwYzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiB4b3IgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInhvciIsCTB4ZjQwMDAwMDAsIDB4MDgwMDAwMDAsICJpLDIsZCIsIEVfVTMyIH0sCS8qIHhvciAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInhvcmgiLAkweGY4MDAwMDAwLCAweDA0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHhvcmggaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInhvcmgiLAkweGZjMDAwMDAwLCAweDAwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIHhvcmggI2NvbnN0LGlzcmMyLGlkZXN0ICovCi0KLXsgImJ0ZSIsCTB4NTgwMDAwMDAsIDB4YTQwMDAwMDAsICIxLDIscyIsIDAgfSwJLyogYnRlIGlzcmMxcyxpc3JjMixzYnJvZmYgKi8KLXsgImJ0ZSIsCTB4NWMwMDAwMDAsIDB4YTAwMDAwMDAsICI1LDIscyIsIDAgfSwJLyogYnRlICNjb25zdDUsaXNyYzIsc2Jyb2ZmICovCi17ICJidG5lIiwJMHg1MDAwMDAwMCwgMHhhYzAwMDAwMCwgIjEsMixzIiwgMCB9LAkvKiBidG5lIGlzcmMxcyxpc3JjMixzYnJvZmYgKi8KLXsgImJ0bmUiLAkweDU0MDAwMDAwLCAweGE4MDAwMDAwLCAiNSwyLHMiLCAwIH0sCS8qIGJ0bmUgI2NvbnN0NSxpc3JjMixzYnJvZmYgKi8KLXsgImJsYSIsCTB4YjQwMDAwMDAsIDB4NDgwMDAwMDAsICIxLDIscyIsIEVfREVMQVkgfSwJLyogYmxhIGlzcmMxcyxpc3JjMixzYnJvZmYgKi8KLXsgImJyaSIsCTB4NDAwMDAwMDAsIDB4YmMwMDAwMDAsICIxIiwgRV9ERUxBWSB9LAkvKiBicmkgaXNyYzFuaSAqLwotCi0vKiBDb3JlIEVzY2FwZSBJbnN0cnVjdGlvbiBGb3JtYXQgKi8KLXsgImxvY2siLAkweDRjMDAwMDAxLCAweGIwMDAwMDFlLCAiIiwgMCB9LAkvKiBsb2NrIHNldCBCTCBpbiBkaXJiYXNlICovCi17ICJjYWxsaSIsCTB4NGMwMDAwMDIsIDB4YjAwMDAwMWQsICIxIiwgRV9ERUxBWSB9LAkvKiBjYWxsaSBpc3JjMW5pICovCi17ICJpbnRvdnIiLAkweDRjMDAwMDA0LCAweGIwMDAwMDFiLCAiIiwgMCB9LAkvKiBpbnRvdnIgdHJhcCBvbiBpbnRlZ2VyIG92ZXJmbG93ICovCi17ICJ1bmxvY2siLAkweDRjMDAwMDA3LCAweGIwMDAwMDE4LCAiIiwgMCB9LAkvKiB1bmxvY2sgY2xlYXIgQkwgaW4gZGlyYmFzZSAqLwotCi0vKiBDVFJMLUZvcm1hdCBJbnN0cnVjdGlvbnMgKi8KLXsgImJyIiwJCTB4NjgwMDAwMDAsIDB4OTQwMDAwMDAsICJsIiwgRV9ERUxBWSB9LAkvKiBiciBsYnJvZmYgKi8KLXsgImNhbGwiLAkweDZjMDAwMDAwLCAweDkwMDAwMDAwLCAibCIsIEVfREVMQVkgfSwJLyogY2FsbCBsYnJvZmYgKi8KLXsgImJjIiwJCTB4NzAwMDAwMDAsIDB4OGMwMDAwMDAsICJsIiwgMCB9LAkvKiBiYyBsYnJvZmYgKi8KLXsgImJjLnQiLAkweDc0MDAwMDAwLCAweDg4MDAwMDAwLCAibCIsIEVfREVMQVkgfSwJLyogYmMudCBsYnJvZmYgKi8KLXsgImJuYyIsCTB4NzgwMDAwMDAsIDB4ODQwMDAwMDAsICJsIiwgMCB9LAkvKiBibmMgbGJyb2ZmICovCi17ICJibmMudCIsCTB4N2MwMDAwMDAsIDB4ODAwMDAwMDAsICJsIiwgRV9ERUxBWSB9LAkvKiBibmMudCBsYnJvZmYgKi8KLQotLyogRmxvYXRpbmcgUG9pbnQgRXNjYXBlIEluc3RydWN0aW9uIEZvcm1hdCAtIHBmYW0ucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicjJwMS5zcyIsCTB4NDgwMDA0MDAsIDB4YjQwMDAzZmYsICJlLGYsZyIsIDAgfSwKLXsgInIycDEuc2QiLAkweDQ4MDAwNDgwLCAweGI0MDAwMzdmLCAiZSxmLGciLCAwIH0sCi17ICJyMnAxLmRkIiwJMHg0ODAwMDU4MCwgMHhiNDAwMDI3ZiwgImUsZixnIiwgMCB9LAoteyAicjJwdC5zcyIsCTB4NDgwMDA0MDEsIDB4YjQwMDAzZmUsICJlLGYsZyIsIDAgfSwKLXsgInIycHQuc2QiLAkweDQ4MDAwNDgxLCAweGI0MDAwMzdlLCAiZSxmLGciLCAwIH0sCi17ICJyMnB0LmRkIiwJMHg0ODAwMDU4MSwgMHhiNDAwMDI3ZSwgImUsZixnIiwgMCB9LAoteyAicjJhcDEuc3MiLAkweDQ4MDAwNDAyLCAweGI0MDAwM2ZkLCAiZSxmLGciLCAwIH0sCi17ICJyMmFwMS5zZCIsCTB4NDgwMDA0ODIsIDB4YjQwMDAzN2QsICJlLGYsZyIsIDAgfSwKLXsgInIyYXAxLmRkIiwJMHg0ODAwMDU4MiwgMHhiNDAwMDI3ZCwgImUsZixnIiwgMCB9LAoteyAicjJhcHQuc3MiLAkweDQ4MDAwNDAzLCAweGI0MDAwM2ZjLCAiZSxmLGciLCAwIH0sCi17ICJyMmFwdC5zZCIsCTB4NDgwMDA0ODMsIDB4YjQwMDAzN2MsICJlLGYsZyIsIDAgfSwKLXsgInIyYXB0LmRkIiwJMHg0ODAwMDU4MywgMHhiNDAwMDI3YywgImUsZixnIiwgMCB9LAoteyAiaTJwMS5zcyIsCTB4NDgwMDA0MDQsIDB4YjQwMDAzZmIsICJlLGYsZyIsIDAgfSwKLXsgImkycDEuc2QiLAkweDQ4MDAwNDg0LCAweGI0MDAwMzdiLCAiZSxmLGciLCAwIH0sCi17ICJpMnAxLmRkIiwJMHg0ODAwMDU4NCwgMHhiNDAwMDI3YiwgImUsZixnIiwgMCB9LAoteyAiaTJwdC5zcyIsCTB4NDgwMDA0MDUsIDB4YjQwMDAzZmEsICJlLGYsZyIsIDAgfSwKLXsgImkycHQuc2QiLAkweDQ4MDAwNDg1LCAweGI0MDAwMzdhLCAiZSxmLGciLCAwIH0sCi17ICJpMnB0LmRkIiwJMHg0ODAwMDU4NSwgMHhiNDAwMDI3YSwgImUsZixnIiwgMCB9LAoteyAiaTJhcDEuc3MiLAkweDQ4MDAwNDA2LCAweGI0MDAwM2Y5LCAiZSxmLGciLCAwIH0sCi17ICJpMmFwMS5zZCIsCTB4NDgwMDA0ODYsIDB4YjQwMDAzNzksICJlLGYsZyIsIDAgfSwKLXsgImkyYXAxLmRkIiwJMHg0ODAwMDU4NiwgMHhiNDAwMDI3OSwgImUsZixnIiwgMCB9LAoteyAiaTJhcHQuc3MiLAkweDQ4MDAwNDA3LCAweGI0MDAwM2Y4LCAiZSxmLGciLCAwIH0sCi17ICJpMmFwdC5zZCIsCTB4NDgwMDA0ODcsIDB4YjQwMDAzNzgsICJlLGYsZyIsIDAgfSwKLXsgImkyYXB0LmRkIiwJMHg0ODAwMDU4NywgMHhiNDAwMDI3OCwgImUsZixnIiwgMCB9LAoteyAicmF0MXAyLnNzIiwJMHg0ODAwMDQwOCwgMHhiNDAwMDNmNywgImUsZixnIiwgMCB9LAoteyAicmF0MXAyLnNkIiwJMHg0ODAwMDQ4OCwgMHhiNDAwMDM3NywgImUsZixnIiwgMCB9LAoteyAicmF0MXAyLmRkIiwJMHg0ODAwMDU4OCwgMHhiNDAwMDI3NywgImUsZixnIiwgMCB9LAoteyAibTEyYXBtLnNzIiwJMHg0ODAwMDQwOSwgMHhiNDAwMDNmNiwgImUsZixnIiwgMCB9LAoteyAibTEyYXBtLnNkIiwJMHg0ODAwMDQ4OSwgMHhiNDAwMDM3NiwgImUsZixnIiwgMCB9LAoteyAibTEyYXBtLmRkIiwJMHg0ODAwMDU4OSwgMHhiNDAwMDI3NiwgImUsZixnIiwgMCB9LAoteyAicmExcDIuc3MiLAkweDQ4MDAwNDBhLCAweGI0MDAwM2Y1LCAiZSxmLGciLCAwIH0sCi17ICJyYTFwMi5zZCIsCTB4NDgwMDA0OGEsIDB4YjQwMDAzNzUsICJlLGYsZyIsIDAgfSwKLXsgInJhMXAyLmRkIiwJMHg0ODAwMDU4YSwgMHhiNDAwMDI3NSwgImUsZixnIiwgMCB9LAoteyAibTEydHRwYS5zcyIsCTB4NDgwMDA0MGIsIDB4YjQwMDAzZjQsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnR0cGEuc2QiLAkweDQ4MDAwNDhiLCAweGI0MDAwMzc0LCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0dHBhLmRkIiwJMHg0ODAwMDU4YiwgMHhiNDAwMDI3NCwgImUsZixnIiwgMCB9LAoteyAiaWF0MXAyLnNzIiwJMHg0ODAwMDQwYywgMHhiNDAwMDNmMywgImUsZixnIiwgMCB9LAoteyAiaWF0MXAyLnNkIiwJMHg0ODAwMDQ4YywgMHhiNDAwMDM3MywgImUsZixnIiwgMCB9LAoteyAiaWF0MXAyLmRkIiwJMHg0ODAwMDU4YywgMHhiNDAwMDI3MywgImUsZixnIiwgMCB9LAoteyAibTEydHBtLnNzIiwJMHg0ODAwMDQwZCwgMHhiNDAwMDNmMiwgImUsZixnIiwgMCB9LAoteyAibTEydHBtLnNkIiwJMHg0ODAwMDQ4ZCwgMHhiNDAwMDM3MiwgImUsZixnIiwgMCB9LAoteyAibTEydHBtLmRkIiwJMHg0ODAwMDU4ZCwgMHhiNDAwMDI3MiwgImUsZixnIiwgMCB9LAoteyAiaWExcDIuc3MiLAkweDQ4MDAwNDBlLCAweGI0MDAwM2YxLCAiZSxmLGciLCAwIH0sCi17ICJpYTFwMi5zZCIsCTB4NDgwMDA0OGUsIDB4YjQwMDAzNzEsICJlLGYsZyIsIDAgfSwKLXsgImlhMXAyLmRkIiwJMHg0ODAwMDU4ZSwgMHhiNDAwMDI3MSwgImUsZixnIiwgMCB9LAoteyAibTEydHBhLnNzIiwJMHg0ODAwMDQwZiwgMHhiNDAwMDNmMCwgImUsZixnIiwgMCB9LAoteyAibTEydHBhLnNkIiwJMHg0ODAwMDQ4ZiwgMHhiNDAwMDM3MCwgImUsZixnIiwgMCB9LAoteyAibTEydHBhLmRkIiwJMHg0ODAwMDU4ZiwgMHhiNDAwMDI3MCwgImUsZixnIiwgMCB9LAotCi0vKiBGbG9hdGluZyBQb2ludCBFc2NhcGUgSW5zdHJ1Y3Rpb24gRm9ybWF0IC0gcGZzbS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJyMnMxLnNzIiwJMHg0ODAwMDQxMCwgMHhiNDAwMDNlZiwgImUsZixnIiwgMCB9LAoteyAicjJzMS5zZCIsCTB4NDgwMDA0OTAsIDB4YjQwMDAzNmYsICJlLGYsZyIsIDAgfSwKLXsgInIyczEuZGQiLAkweDQ4MDAwNTkwLCAweGI0MDAwMjZmLCAiZSxmLGciLCAwIH0sCi17ICJyMnN0LnNzIiwJMHg0ODAwMDQxMSwgMHhiNDAwMDNlZSwgImUsZixnIiwgMCB9LAoteyAicjJzdC5zZCIsCTB4NDgwMDA0OTEsIDB4YjQwMDAzNmUsICJlLGYsZyIsIDAgfSwKLXsgInIyc3QuZGQiLAkweDQ4MDAwNTkxLCAweGI0MDAwMjZlLCAiZSxmLGciLCAwIH0sCi17ICJyMmFzMS5zcyIsCTB4NDgwMDA0MTIsIDB4YjQwMDAzZWQsICJlLGYsZyIsIDAgfSwKLXsgInIyYXMxLnNkIiwJMHg0ODAwMDQ5MiwgMHhiNDAwMDM2ZCwgImUsZixnIiwgMCB9LAoteyAicjJhczEuZGQiLAkweDQ4MDAwNTkyLCAweGI0MDAwMjZkLCAiZSxmLGciLCAwIH0sCi17ICJyMmFzdC5zcyIsCTB4NDgwMDA0MTMsIDB4YjQwMDAzZWMsICJlLGYsZyIsIDAgfSwKLXsgInIyYXN0LnNkIiwJMHg0ODAwMDQ5MywgMHhiNDAwMDM2YywgImUsZixnIiwgMCB9LAoteyAicjJhc3QuZGQiLAkweDQ4MDAwNTkzLCAweGI0MDAwMjZjLCAiZSxmLGciLCAwIH0sCi17ICJpMnMxLnNzIiwJMHg0ODAwMDQxNCwgMHhiNDAwMDNlYiwgImUsZixnIiwgMCB9LAoteyAiaTJzMS5zZCIsCTB4NDgwMDA0OTQsIDB4YjQwMDAzNmIsICJlLGYsZyIsIDAgfSwKLXsgImkyczEuZGQiLAkweDQ4MDAwNTk0LCAweGI0MDAwMjZiLCAiZSxmLGciLCAwIH0sCi17ICJpMnN0LnNzIiwJMHg0ODAwMDQxNSwgMHhiNDAwMDNlYSwgImUsZixnIiwgMCB9LAoteyAiaTJzdC5zZCIsCTB4NDgwMDA0OTUsIDB4YjQwMDAzNmEsICJlLGYsZyIsIDAgfSwKLXsgImkyc3QuZGQiLAkweDQ4MDAwNTk1LCAweGI0MDAwMjZhLCAiZSxmLGciLCAwIH0sCi17ICJpMmFzMS5zcyIsCTB4NDgwMDA0MTYsIDB4YjQwMDAzZTksICJlLGYsZyIsIDAgfSwKLXsgImkyYXMxLnNkIiwJMHg0ODAwMDQ5NiwgMHhiNDAwMDM2OSwgImUsZixnIiwgMCB9LAoteyAiaTJhczEuZGQiLAkweDQ4MDAwNTk2LCAweGI0MDAwMjY5LCAiZSxmLGciLCAwIH0sCi17ICJpMmFzdC5zcyIsCTB4NDgwMDA0MTcsIDB4YjQwMDAzZTgsICJlLGYsZyIsIDAgfSwKLXsgImkyYXN0LnNkIiwJMHg0ODAwMDQ5NywgMHhiNDAwMDM2OCwgImUsZixnIiwgMCB9LAoteyAiaTJhc3QuZGQiLAkweDQ4MDAwNTk3LCAweGI0MDAwMjY4LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxczIuc3MiLAkweDQ4MDAwNDE4LCAweGI0MDAwM2U3LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxczIuc2QiLAkweDQ4MDAwNDk4LCAweGI0MDAwMzY3LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxczIuZGQiLAkweDQ4MDAwNTk4LCAweGI0MDAwMjY3LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhc20uc3MiLAkweDQ4MDAwNDE5LCAweGI0MDAwM2U2LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhc20uc2QiLAkweDQ4MDAwNDk5LCAweGI0MDAwMzY2LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhc20uZGQiLAkweDQ4MDAwNTk5LCAweGI0MDAwMjY2LCAiZSxmLGciLCAwIH0sCi17ICJyYTFzMi5zcyIsCTB4NDgwMDA0MWEsIDB4YjQwMDAzZTUsICJlLGYsZyIsIDAgfSwKLXsgInJhMXMyLnNkIiwJMHg0ODAwMDQ5YSwgMHhiNDAwMDM2NSwgImUsZixnIiwgMCB9LAoteyAicmExczIuZGQiLAkweDQ4MDAwNTlhLCAweGI0MDAwMjY1LCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0dHNhLnNzIiwJMHg0ODAwMDQxYiwgMHhiNDAwMDNlNCwgImUsZixnIiwgMCB9LAoteyAibTEydHRzYS5zZCIsCTB4NDgwMDA0OWIsIDB4YjQwMDAzNjQsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnR0c2EuZGQiLAkweDQ4MDAwNTliLCAweGI0MDAwMjY0LCAiZSxmLGciLCAwIH0sCi17ICJpYXQxczIuc3MiLAkweDQ4MDAwNDFjLCAweGI0MDAwM2UzLCAiZSxmLGciLCAwIH0sCi17ICJpYXQxczIuc2QiLAkweDQ4MDAwNDljLCAweGI0MDAwMzYzLCAiZSxmLGciLCAwIH0sCi17ICJpYXQxczIuZGQiLAkweDQ4MDAwNTljLCAweGI0MDAwMjYzLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c20uc3MiLAkweDQ4MDAwNDFkLCAweGI0MDAwM2UyLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c20uc2QiLAkweDQ4MDAwNDlkLCAweGI0MDAwMzYyLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c20uZGQiLAkweDQ4MDAwNTlkLCAweGI0MDAwMjYyLCAiZSxmLGciLCAwIH0sCi17ICJpYTFzMi5zcyIsCTB4NDgwMDA0MWUsIDB4YjQwMDAzZTEsICJlLGYsZyIsIDAgfSwKLXsgImlhMXMyLnNkIiwJMHg0ODAwMDQ5ZSwgMHhiNDAwMDM2MSwgImUsZixnIiwgMCB9LAoteyAiaWExczIuZGQiLAkweDQ4MDAwNTllLCAweGI0MDAwMjYxLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c2Euc3MiLAkweDQ4MDAwNDFmLCAweGI0MDAwM2UwLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c2Euc2QiLAkweDQ4MDAwNDlmLCAweGI0MDAwMzYwLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c2EuZGQiLAkweDQ4MDAwNTlmLCAweGI0MDAwMjYwLCAiZSxmLGciLCAwIH0sCi0KLS8qIEZsb2F0aW5nIFBvaW50IEVzY2FwZSBJbnN0cnVjdGlvbiBGb3JtYXQgLSBwZm1hbS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJtcjJwMS5zcyIsCTB4NDgwMDAwMDAsIDB4YjQwMDA3ZmYsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnAxLnNkIiwJMHg0ODAwMDA4MCwgMHhiNDAwMDc3ZiwgImUsZixnIiwgMCB9LAoteyAibXIycDEuZGQiLAkweDQ4MDAwMTgwLCAweGI0MDAwNjdmLCAiZSxmLGciLCAwIH0sCi17ICJtcjJwdC5zcyIsCTB4NDgwMDAwMDEsIDB4YjQwMDA3ZmUsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnB0LnNkIiwJMHg0ODAwMDA4MSwgMHhiNDAwMDc3ZSwgImUsZixnIiwgMCB9LAoteyAibXIycHQuZGQiLAkweDQ4MDAwMTgxLCAweGI0MDAwNjdlLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcDEuc3MiLAkweDQ4MDAwMDAyLCAweGI0MDAwN2ZkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcDEuc2QiLAkweDQ4MDAwMDgyLCAweGI0MDAwNzdkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcDEuZGQiLAkweDQ4MDAwMTgyLCAweGI0MDAwNjdkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcHQuc3MiLAkweDQ4MDAwMDAzLCAweGI0MDAwN2ZjLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcHQuc2QiLAkweDQ4MDAwMDgzLCAweGI0MDAwNzdjLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcHQuZGQiLAkweDQ4MDAwMTgzLCAweGI0MDAwNjdjLCAiZSxmLGciLCAwIH0sCi17ICJtaTJwMS5zcyIsCTB4NDgwMDAwMDQsIDB4YjQwMDA3ZmIsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnAxLnNkIiwJMHg0ODAwMDA4NCwgMHhiNDAwMDc3YiwgImUsZixnIiwgMCB9LAoteyAibWkycDEuZGQiLAkweDQ4MDAwMTg0LCAweGI0MDAwNjdiLCAiZSxmLGciLCAwIH0sCi17ICJtaTJwdC5zcyIsCTB4NDgwMDAwMDUsIDB4YjQwMDA3ZmEsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnB0LnNkIiwJMHg0ODAwMDA4NSwgMHhiNDAwMDc3YSwgImUsZixnIiwgMCB9LAoteyAibWkycHQuZGQiLAkweDQ4MDAwMTg1LCAweGI0MDAwNjdhLCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcDEuc3MiLAkweDQ4MDAwMDA2LCAweGI0MDAwN2Y5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcDEuc2QiLAkweDQ4MDAwMDg2LCAweGI0MDAwNzc5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcDEuZGQiLAkweDQ4MDAwMTg2LCAweGI0MDAwNjc5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcHQuc3MiLAkweDQ4MDAwMDA3LCAweGI0MDAwN2Y4LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcHQuc2QiLAkweDQ4MDAwMDg3LCAweGI0MDAwNzc4LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcHQuZGQiLAkweDQ4MDAwMTg3LCAweGI0MDAwNjc4LCAiZSxmLGciLCAwIH0sCi17ICJtcm10MXAyLnNzIiwJMHg0ODAwMDAwOCwgMHhiNDAwMDdmNywgImUsZixnIiwgMCB9LAoteyAibXJtdDFwMi5zZCIsCTB4NDgwMDAwODgsIDB4YjQwMDA3NzcsICJlLGYsZyIsIDAgfSwKLXsgIm1ybXQxcDIuZGQiLAkweDQ4MDAwMTg4LCAweGI0MDAwNjc3LCAiZSxmLGciLCAwIH0sCi17ICJtbTEybXBtLnNzIiwJMHg0ODAwMDAwOSwgMHhiNDAwMDdmNiwgImUsZixnIiwgMCB9LAoteyAibW0xMm1wbS5zZCIsCTB4NDgwMDAwODksIDB4YjQwMDA3NzYsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJtcG0uZGQiLAkweDQ4MDAwMTg5LCAweGI0MDAwNjc2LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xcDIuc3MiLAkweDQ4MDAwMDBhLCAweGI0MDAwN2Y1LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xcDIuc2QiLAkweDQ4MDAwMDhhLCAweGI0MDAwNzc1LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xcDIuZGQiLAkweDQ4MDAwMThhLCAweGI0MDAwNjc1LCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHRwbS5zcyIsMHg0ODAwMDAwYiwgMHhiNDAwMDdmNCwgImUsZixnIiwgMCB9LAoteyAibW0xMnR0cG0uc2QiLDB4NDgwMDAwOGIsIDB4YjQwMDA3NzQsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0dHBtLmRkIiwweDQ4MDAwMThiLCAweGI0MDAwNjc0LCAiZSxmLGciLCAwIH0sCi17ICJtaW10MXAyLnNzIiwJMHg0ODAwMDAwYywgMHhiNDAwMDdmMywgImUsZixnIiwgMCB9LAoteyAibWltdDFwMi5zZCIsCTB4NDgwMDAwOGMsIDB4YjQwMDA3NzMsICJlLGYsZyIsIDAgfSwKLXsgIm1pbXQxcDIuZGQiLAkweDQ4MDAwMThjLCAweGI0MDAwNjczLCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHBtLnNzIiwJMHg0ODAwMDAwZCwgMHhiNDAwMDdmMiwgImUsZixnIiwgMCB9LAoteyAibW0xMnRwbS5zZCIsCTB4NDgwMDAwOGQsIDB4YjQwMDA3NzIsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0cG0uZGQiLAkweDQ4MDAwMThkLCAweGI0MDAwNjcyLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xcDIuc3MiLAkweDQ4MDAwMDBlLCAweGI0MDAwN2YxLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xcDIuc2QiLAkweDQ4MDAwMDhlLCAweGI0MDAwNzcxLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xcDIuZGQiLAkweDQ4MDAwMThlLCAweGI0MDAwNjcxLCAiZSxmLGciLCAwIH0sCi0KLS8qIEZsb2F0aW5nIFBvaW50IEVzY2FwZSBJbnN0cnVjdGlvbiBGb3JtYXQgLSBwZm1zbS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJtcjJzMS5zcyIsCTB4NDgwMDAwMTAsIDB4YjQwMDA3ZWYsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnMxLnNkIiwJMHg0ODAwMDA5MCwgMHhiNDAwMDc2ZiwgImUsZixnIiwgMCB9LAoteyAibXIyczEuZGQiLAkweDQ4MDAwMTkwLCAweGI0MDAwNjZmLCAiZSxmLGciLCAwIH0sCi17ICJtcjJzdC5zcyIsCTB4NDgwMDAwMTEsIDB4YjQwMDA3ZWUsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnN0LnNkIiwJMHg0ODAwMDA5MSwgMHhiNDAwMDc2ZSwgImUsZixnIiwgMCB9LAoteyAibXIyc3QuZGQiLAkweDQ4MDAwMTkxLCAweGI0MDAwNjZlLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtczEuc3MiLAkweDQ4MDAwMDEyLCAweGI0MDAwN2VkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtczEuc2QiLAkweDQ4MDAwMDkyLCAweGI0MDAwNzZkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtczEuZGQiLAkweDQ4MDAwMTkyLCAweGI0MDAwNjZkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtc3Quc3MiLAkweDQ4MDAwMDEzLCAweGI0MDAwN2VjLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtc3Quc2QiLAkweDQ4MDAwMDkzLCAweGI0MDAwNzZjLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtc3QuZGQiLAkweDQ4MDAwMTkzLCAweGI0MDAwNjZjLCAiZSxmLGciLCAwIH0sCi17ICJtaTJzMS5zcyIsCTB4NDgwMDAwMTQsIDB4YjQwMDA3ZWIsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnMxLnNkIiwJMHg0ODAwMDA5NCwgMHhiNDAwMDc2YiwgImUsZixnIiwgMCB9LAoteyAibWkyczEuZGQiLAkweDQ4MDAwMTk0LCAweGI0MDAwNjZiLCAiZSxmLGciLCAwIH0sCi17ICJtaTJzdC5zcyIsCTB4NDgwMDAwMTUsIDB4YjQwMDA3ZWEsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnN0LnNkIiwJMHg0ODAwMDA5NSwgMHhiNDAwMDc2YSwgImUsZixnIiwgMCB9LAoteyAibWkyc3QuZGQiLAkweDQ4MDAwMTk1LCAweGI0MDAwNjZhLCAiZSxmLGciLCAwIH0sCi17ICJtaTJtczEuc3MiLAkweDQ4MDAwMDE2LCAweGI0MDAwN2U5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtczEuc2QiLAkweDQ4MDAwMDk2LCAweGI0MDAwNzY5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtczEuZGQiLAkweDQ4MDAwMTk2LCAweGI0MDAwNjY5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtc3Quc3MiLAkweDQ4MDAwMDE3LCAweGI0MDAwN2U4LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtc3Quc2QiLAkweDQ4MDAwMDk3LCAweGI0MDAwNzY4LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtc3QuZGQiLAkweDQ4MDAwMTk3LCAweGI0MDAwNjY4LCAiZSxmLGciLCAwIH0sCi17ICJtcm10MXMyLnNzIiwJMHg0ODAwMDAxOCwgMHhiNDAwMDdlNywgImUsZixnIiwgMCB9LAoteyAibXJtdDFzMi5zZCIsCTB4NDgwMDAwOTgsIDB4YjQwMDA3NjcsICJlLGYsZyIsIDAgfSwKLXsgIm1ybXQxczIuZGQiLAkweDQ4MDAwMTk4LCAweGI0MDAwNjY3LCAiZSxmLGciLCAwIH0sCi17ICJtbTEybXNtLnNzIiwJMHg0ODAwMDAxOSwgMHhiNDAwMDdlNiwgImUsZixnIiwgMCB9LAoteyAibW0xMm1zbS5zZCIsCTB4NDgwMDAwOTksIDB4YjQwMDA3NjYsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJtc20uZGQiLAkweDQ4MDAwMTk5LCAweGI0MDAwNjY2LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xczIuc3MiLAkweDQ4MDAwMDFhLCAweGI0MDAwN2U1LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xczIuc2QiLAkweDQ4MDAwMDlhLCAweGI0MDAwNzY1LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xczIuZGQiLAkweDQ4MDAwMTlhLCAweGI0MDAwNjY1LCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHRzbS5zcyIsMHg0ODAwMDAxYiwgMHhiNDAwMDdlNCwgImUsZixnIiwgMCB9LAoteyAibW0xMnR0c20uc2QiLDB4NDgwMDAwOWIsIDB4YjQwMDA3NjQsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0dHNtLmRkIiwweDQ4MDAwMTliLCAweGI0MDAwNjY0LCAiZSxmLGciLCAwIH0sCi17ICJtaW10MXMyLnNzIiwJMHg0ODAwMDAxYywgMHhiNDAwMDdlMywgImUsZixnIiwgMCB9LAoteyAibWltdDFzMi5zZCIsCTB4NDgwMDAwOWMsIDB4YjQwMDA3NjMsICJlLGYsZyIsIDAgfSwKLXsgIm1pbXQxczIuZGQiLAkweDQ4MDAwMTljLCAweGI0MDAwNjYzLCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHNtLnNzIiwJMHg0ODAwMDAxZCwgMHhiNDAwMDdlMiwgImUsZixnIiwgMCB9LAoteyAibW0xMnRzbS5zZCIsCTB4NDgwMDAwOWQsIDB4YjQwMDA3NjIsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0c20uZGQiLAkweDQ4MDAwMTlkLCAweGI0MDAwNjYyLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xczIuc3MiLAkweDQ4MDAwMDFlLCAweGI0MDAwN2UxLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xczIuc2QiLAkweDQ4MDAwMDllLCAweGI0MDAwNzYxLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xczIuZGQiLAkweDQ4MDAwMTllLCAweGI0MDAwNjYxLCAiZSxmLGciLCAwIH0sCi0KLQoteyAiZm11bC5zcyIsCTB4NDgwMDAwMjAsIDB4YjQwMDA3ZGYsICJlLGYsZyIsIDAgfSwJLyogZm11bC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmbXVsLnNkIiwJMHg0ODAwMDBhMCwgMHhiNDAwMDc1ZiwgImUsZixnIiwgMCB9LAkvKiBmbXVsLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZtdWwuZGQiLAkweDQ4MDAwMWEwLCAweGI0MDAwNjVmLCAiZSxmLGciLCAwIH0sCS8qIGZtdWwucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZtdWwuc3MiLAkweDQ4MDAwNDIwLCAweGI0MDAwM2RmLCAiZSxmLGciLCAwIH0sCS8qIHBmbXVsLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmbXVsLnNkIiwJMHg0ODAwMDRhMCwgMHhiNDAwMDM1ZiwgImUsZixnIiwgMCB9LAkvKiBwZm11bC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZm11bC5kZCIsCTB4NDgwMDA1YTAsIDB4YjQwMDAyNWYsICJlLGYsZyIsIDAgfSwJLyogcGZtdWwucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZtdWwzLmRkIiwJMHg0ODAwMDVhNCwgMHhiNDAwMDI1YiwgImUsZixnIiwgMCB9LAkvKiBwZm11bDMucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZm1sb3cuZGQiLAkweDQ4MDAwMWExLCAweGI0MDAwNjVlLCAiZSxmLGciLCAwIH0sCS8qIGZtbG93LmRkIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmcmNwLnNzIiwJMHg0ODAwMDAyMiwgMHhiNDAwMDdkZCwgImYsZyIsIDAgfSwJLyogZnJjcC5wIGZzcmMyLGZkZXN0ICovCi17ICJmcmNwLnNkIiwJMHg0ODAwMDBhMiwgMHhiNDAwMDc1ZCwgImYsZyIsIDAgfSwJLyogZnJjcC5wIGZzcmMyLGZkZXN0ICovCi17ICJmcmNwLmRkIiwJMHg0ODAwMDFhMiwgMHhiNDAwMDY1ZCwgImYsZyIsIDAgfSwJLyogZnJjcC5wIGZzcmMyLGZkZXN0ICovCi17ICJmcnNxci5zcyIsCTB4NDgwMDAwMjMsIDB4YjQwMDA3ZGMsICJmLGciLCAwIH0sCS8qIGZyc3FyLnAgZnNyYzIsZmRlc3QgKi8KLXsgImZyc3FyLnNkIiwJMHg0ODAwMDBhMywgMHhiNDAwMDc1YywgImYsZyIsIDAgfSwJLyogZnJzcXIucCBmc3JjMixmZGVzdCAqLwoteyAiZnJzcXIuZGQiLAkweDQ4MDAwMWEzLCAweGI0MDAwNjVjLCAiZixnIiwgMCB9LAkvKiBmcnNxci5wIGZzcmMyLGZkZXN0ICovCi17ICJmYWRkLnNzIiwJMHg0ODAwMDAzMCwgMHhiNDAwMDdjZiwgImUsZixnIiwgMCB9LAkvKiBmYWRkLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZhZGQuc2QiLAkweDQ4MDAwMGIwLCAweGI0MDAwNzRmLCAiZSxmLGciLCAwIH0sCS8qIGZhZGQucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZmFkZC5kZCIsCTB4NDgwMDAxYjAsIDB4YjQwMDA2NGYsICJlLGYsZyIsIDAgfSwJLyogZmFkZC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmFkZC5zcyIsCTB4NDgwMDA0MzAsIDB4YjQwMDAzY2YsICJlLGYsZyIsIDAgfSwJLyogcGZhZGQucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZhZGQuc2QiLAkweDQ4MDAwNGIwLCAweGI0MDAwMzRmLCAiZSxmLGciLCAwIH0sCS8qIHBmYWRkLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmYWRkLmRkIiwJMHg0ODAwMDViMCwgMHhiNDAwMDI0ZiwgImUsZixnIiwgMCB9LAkvKiBwZmFkZC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmc3ViLnNzIiwJMHg0ODAwMDAzMSwgMHhiNDAwMDdjZSwgImUsZixnIiwgMCB9LAkvKiBmc3ViLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZzdWIuc2QiLAkweDQ4MDAwMGIxLCAweGI0MDAwNzRlLCAiZSxmLGciLCAwIH0sCS8qIGZzdWIucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZnN1Yi5kZCIsCTB4NDgwMDAxYjEsIDB4YjQwMDA2NGUsICJlLGYsZyIsIDAgfSwJLyogZnN1Yi5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZnN1Yi5zcyIsCTB4NDgwMDA0MzEsIDB4YjQwMDAzY2UsICJlLGYsZyIsIDAgfSwJLyogcGZzdWIucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZzdWIuc2QiLAkweDQ4MDAwNGIxLCAweGI0MDAwMzRlLCAiZSxmLGciLCAwIH0sCS8qIHBmc3ViLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmc3ViLmRkIiwJMHg0ODAwMDViMSwgMHhiNDAwMDI0ZSwgImUsZixnIiwgMCB9LAkvKiBwZnN1Yi5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmaXguc3MiLAkweDQ4MDAwMDMyLCAweGI0MDAwN2NkLCAiZSxnIiwgMCB9LAkvKiBmaXgucCBmc3JjMSxmZGVzdCAqLwoteyAiZml4LnNkIiwJMHg0ODAwMDBiMiwgMHhiNDAwMDc0ZCwgImUsZyIsIDAgfSwJLyogZml4LnAgZnNyYzEsZmRlc3QgKi8KLXsgImZpeC5kZCIsCTB4NDgwMDAxYjIsIDB4YjQwMDA2NGQsICJlLGciLCAwIH0sCS8qIGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJwZml4LnNzIiwJMHg0ODAwMDQzMiwgMHhiNDAwMDNjZCwgImUsZyIsIDAgfSwJLyogcGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJwZml4LnNkIiwJMHg0ODAwMDRiMiwgMHhiNDAwMDM0ZCwgImUsZyIsIDAgfSwJLyogcGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJwZml4LmRkIiwJMHg0ODAwMDViMiwgMHhiNDAwMDI0ZCwgImUsZyIsIDAgfSwJLyogcGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJmYW1vdi5zcyIsCTB4NDgwMDAwMzMsIDB4YjQwMDA3Y2MsICJlLGciLCAwIH0sCS8qIGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgImZhbW92LmRzIiwJMHg0ODAwMDEzMywgMHhiNDAwMDZjYywgImUsZyIsIDAgfSwJLyogZmFtb3YucCBmc3JjMSxmZGVzdCAqLwoteyAiZmFtb3Yuc2QiLAkweDQ4MDAwMGIzLCAweGI0MDAwNzRjLCAiZSxnIiwgMCB9LAkvKiBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi17ICJmYW1vdi5kZCIsCTB4NDgwMDAxYjMsIDB4YjQwMDA2NGMsICJlLGciLCAwIH0sCS8qIGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmYW1vdi5zcyIsCTB4NDgwMDA0MzMsIDB4YjQwMDAzY2MsICJlLGciLCAwIH0sCS8qIHBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi17ICJwZmFtb3YuZHMiLAkweDQ4MDAwNTMzLCAweGI0MDAwMmNjLCAiZSxnIiwgMCB9LAkvKiBwZmFtb3YucCBmc3JjMSxmZGVzdCAqLwoteyAicGZhbW92LnNkIiwJMHg0ODAwMDRiMywgMHhiNDAwMDM0YywgImUsZyIsIDAgfSwJLyogcGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmYW1vdi5kZCIsCTB4NDgwMDA1YjMsIDB4YjQwMDAyNGMsICJlLGciLCAwIH0sCS8qIHBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi0vKiBwZmd0IGhhcyBSIGJpdCBjbGVhcmVkOyBwZmxlIGhhcyBSIGJpdCBzZXQgKi8KLXsgInBmZ3Quc3MiLAkweDQ4MDAwNDM0LCAweGI0MDAwM2NiLCAiZSxmLGciLCAwIH0sCS8qIHBmZ3QucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZndC5zZCIsCTB4NDgwMDA0MzQsIDB4YjQwMDAzY2IsICJlLGYsZyIsIDAgfSwJLyogcGZndC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmd0LmRkIiwJMHg0ODAwMDUzNCwgMHhiNDAwMDJjYiwgImUsZixnIiwgMCB9LAkvKiBwZmd0LnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLS8qIHBmZ3QgaGFzIFIgYml0IGNsZWFyZWQ7IHBmbGUgaGFzIFIgYml0IHNldCAqLwoteyAicGZsZS5zcyIsCTB4NDgwMDA0YjQsIDB4YjQwMDAzNGIsICJlLGYsZyIsIDAgfSwJLyogcGZsZS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmxlLnNkIiwJMHg0ODAwMDRiNCwgMHhiNDAwMDM0YiwgImUsZixnIiwgMCB9LAkvKiBwZmxlLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmbGUuZGQiLAkweDQ4MDAwNWI0LCAweGI0MDAwMjRiLCAiZSxmLGciLCAwIH0sCS8qIHBmbGUucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZnRydW5jLnNzIiwJMHg0ODAwMDAzYSwgMHhiNDAwMDdjNSwgImUsZyIsIDAgfSwJLyogZnRydW5jLnAgZnNyYzEsZmRlc3QgKi8KLXsgImZ0cnVuYy5zZCIsCTB4NDgwMDAwYmEsIDB4YjQwMDA3NDUsICJlLGciLCAwIH0sCS8qIGZ0cnVuYy5wIGZzcmMxLGZkZXN0ICovCi17ICJmdHJ1bmMuZGQiLAkweDQ4MDAwMWJhLCAweGI0MDAwNjQ1LCAiZSxnIiwgMCB9LAkvKiBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAicGZ0cnVuYy5zcyIsCTB4NDgwMDA0M2EsIDB4YjQwMDAzYzUsICJlLGciLCAwIH0sCS8qIHBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAicGZ0cnVuYy5zZCIsCTB4NDgwMDA0YmEsIDB4YjQwMDAzNDUsICJlLGciLCAwIH0sCS8qIHBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAicGZ0cnVuYy5kZCIsCTB4NDgwMDA1YmEsIDB4YjQwMDAyNDUsICJlLGciLCAwIH0sCS8qIHBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAiZnhmciIsCTB4NDgwMDAwNDAsIDB4YjQwMDA3YmYsICJlLGQiLCAwIH0sCS8qIGZ4ZnIgZnNyYzEsaWRlc3QgKi8KLXsgImZpYWRkLnNzIiwJMHg0ODAwMDA0OSwgMHhiNDAwMDdiNiwgImUsZixnIiwgMCB9LAkvKiBmaWFkZC53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmaWFkZC5kZCIsCTB4NDgwMDAxYzksIDB4YjQwMDA2MzYsICJlLGYsZyIsIDAgfSwJLyogZmlhZGQudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZpYWRkLnNzIiwJMHg0ODAwMDQ0OSwgMHhiNDAwMDNiNiwgImUsZixnIiwgMCB9LAkvKiBwZmlhZGQudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZpYWRkLmRkIiwJMHg0ODAwMDVjOSwgMHhiNDAwMDIzNiwgImUsZixnIiwgMCB9LAkvKiBwZmlhZGQudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZmlzdWIuc3MiLAkweDQ4MDAwMDRkLCAweGI0MDAwN2IyLCAiZSxmLGciLCAwIH0sCS8qIGZpc3ViLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZpc3ViLmRkIiwJMHg0ODAwMDFjZCwgMHhiNDAwMDYzMiwgImUsZixnIiwgMCB9LAkvKiBmaXN1Yi53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmlzdWIuc3MiLAkweDQ4MDAwNDRkLCAweGI0MDAwM2IyLCAiZSxmLGciLCAwIH0sCS8qIHBmaXN1Yi53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmlzdWIuZGQiLAkweDQ4MDAwNWNkLCAweGI0MDAwMjMyLCAiZSxmLGciLCAwIH0sCS8qIHBmaXN1Yi53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmemNoa2wiLAkweDQ4MDAwMDU3LCAweGI0MDAwN2E4LCAiZSxmLGciLCAwIH0sCS8qIGZ6Y2hrbCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZ6Y2hrbCIsCTB4NDgwMDA0NTcsIDB4YjQwMDAzYTgsICJlLGYsZyIsIDAgfSwJLyogcGZ6Y2hrbCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZnpjaGtzIiwJMHg0ODAwMDA1ZiwgMHhiNDAwMDdhMCwgImUsZixnIiwgMCB9LAkvKiBmemNoa3MgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmemNoa3MiLAkweDQ4MDAwNDVmLCAweGI0MDAwM2EwLCAiZSxmLGciLCAwIH0sCS8qIHBmemNoa3MgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZhZGRwIiwJMHg0ODAwMDA1MCwgMHhiNDAwMDdhZiwgImUsZixnIiwgMCB9LAkvKiBmYWRkcCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZhZGRwIiwJMHg0ODAwMDQ1MCwgMHhiNDAwMDNhZiwgImUsZixnIiwgMCB9LAkvKiBwZmFkZHAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZhZGR6IiwJMHg0ODAwMDA1MSwgMHhiNDAwMDdhZSwgImUsZixnIiwgMCB9LAkvKiBmYWRkeiBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZhZGR6IiwJMHg0ODAwMDQ1MSwgMHhiNDAwMDNhZSwgImUsZixnIiwgMCB9LAkvKiBwZmFkZHogZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZvcm0iLAkweDQ4MDAwMDVhLCAweGI0MDAwN2E1LCAiZSxnIiwgMCB9LAkvKiBmb3JtIGZzcmMxLGZkZXN0ICovCi17ICJwZm9ybSIsCTB4NDgwMDA0NWEsIDB4YjQwMDAzYTUsICJlLGciLCAwIH0sCS8qIHBmb3JtIGZzcmMxLGZkZXN0ICovCi0KLS8qIEZsb2F0aW5nIHBvaW50IHBzZXVkby1pbnN0cnVjdGlvbnMgKi8KLXsgImZtb3Yuc3MiLAkweDQ4MDAwMDQ5LCAweGI3ZTAwN2I2LCAiZSxnIiwgMCB9LAkvKiBmaWFkZC5zcyBmc3JjMSxmMCxmZGVzdCAqLwoteyAiZm1vdi5kZCIsCTB4NDgwMDAxYzksIDB4YjdlMDA2MzYsICJlLGciLCAwIH0sCS8qIGZpYWRkLmRkIGZzcmMxLGYwLGZkZXN0ICovCi17ICJmbW92LnNkIiwJMHg0ODAwMDBiMCwgMHhiN2UwMDc0ZiwgImUsZyIsIDAgfSwJLyogZmFkZC5zZCBmc3JjMSxmMCxmZGVzdCAqLwoteyAiZm1vdi5kcyIsCTB4NDgwMDAxMzAsIDB4YjdlMDA2Y2YsICJlLGciLCAwIH0sCS8qIGZhZGQuZHMgZnNyYzEsZjAsZmRlc3QgKi8KLXsgInBmbW92LmRzIiwJMHg0ODAwMDUzMCwgMHhiNzMwMDJjZiwgImUsZyIsIDAgfSwJLyogcGZhZGQuZHMgZnNyYzEsZjAsZmRlc3QgKi8KLXsgInBmbW92LmRkIiwJMHg0ODAwMDVjOSwgMHhiN2UwMDIzNiwgImUsZyIsIDAgfSwJLyogcGZpYWRkLmRkIGZzcmMxLGYwLGZkZXN0ICovCi0KLQotfTsKLQotI2RlZmluZSBOVU1PUENPREVTICgoc2l6ZW9mIGk4NjBfb3Bjb2RlcykvKHNpemVvZiBpODYwX29wY29kZXNbMF0pKQotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2k5NjAuaCBiL2luY2x1ZGUvb3Bjb2RlL2k5NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyZmMzMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9pOTYwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MDkgKzAsMCBAQAotLyogQmFzaWMgODA5NjAgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4KLSAqCi0gKiBUaGUgJ0NPSicgaW5zdHJ1Y3Rpb25zIGFyZSBhY3R1YWxseSBDT0JSIGluc3RydWN0aW9ucyB3aXRoIHRoZSAnYicgaW4KLSAqIHRoZSBtbmVtb25pYyByZXBsYWNlZCBieSBhICdqJzsgIHRoZXkgYXJlIEFMV0FZUyAiZGUtb3B0aW1pemVkIiBpZiBuZWNlc3Nhcnk6Ci0gKiBpZiB0aGUgZGlzcGxhY2VtZW50IHdpbGwgbm90IGZpdCBpbiAxMyBiaXRzLCB0aGUgYXNzZW1ibGVyIHdpbGwgcmVwbGFjZSB0aGVtCi0gKiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBhcmUgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMuCi0gKgotICogQWxsIG9mIHRoZSAnTUVNbicgaW5zdHJ1Y3Rpb25zIGFyZSB0aGUgc2FtZSBmb3JtYXQ7IHRoZSAnbicgaW4gdGhlIG5hbWUKLSAqIGluZGljYXRlcyB0aGUgZGVmYXVsdCBpbmRleCBzY2FsZSBmYWN0b3IgKHRoZSBzaXplIG9mIHRoZSBkYXR1bSBvcGVyYXRlZCBvbikuCi0gKgotICogVGhlIEZCUkEgZm9ybWF0cyBhcmUgbm90IGFjdHVhbGx5IGFuIGluc3RydWN0aW9uIGZvcm1hdC4gIFRoZXkgYXJlIHRoZQotICogImNvbnZlbmllbmNlIGRpcmVjdGl2ZXMiIGZvciBicmFuY2hpbmcgb24gZmxvYXRpbmctcG9pbnQgY29tcGFyaXNvbnMsCi0gKiBlYWNoIG9mIHdoaWNoIGdlbmVyYXRlcyAyIGluc3RydWN0aW9ucyAoYSAnYm5vJyBhbmQgb25lIG90aGVyIGJyYW5jaCkuCi0gKgotICogVGhlIENBTExKIGZvcm1hdCBpcyBub3QgYWN0dWFsbHkgYW4gaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgSXQgaW5kaWNhdGVzIHRoYXQKLSAqIHRoZSBpbnN0cnVjdGlvbiBnZW5lcmF0ZWQgKGEgQ1RSTC1mb3JtYXQgJ2NhbGwnKSBzaG91bGQgaGF2ZSBpdHMgcmVsb2NhdGlvbgotICogc3BlY2lhbGx5IGZsYWdnZWQgZm9yIGxpbmstdGltZSByZXBsYWNlbWVudCB3aXRoIGEgJ2JhbCcgb3IgJ2NhbGxzJyBpZgotICogYXBwcm9wcmlhdGUuCi0gKi8gCi0KLSNkZWZpbmUgQ1RSTAkwCi0jZGVmaW5lIENPQlIJMQotI2RlZmluZSBDT0oJMgotI2RlZmluZSBSRUcJMwotI2RlZmluZSBNRU0xCTQKLSNkZWZpbmUgTUVNMgk1Ci0jZGVmaW5lIE1FTTQJNgotI2RlZmluZSBNRU04CTcKLSNkZWZpbmUgTUVNMTIJOAotI2RlZmluZSBNRU0xNgk5Ci0jZGVmaW5lIEZCUkEJMTAKLSNkZWZpbmUgQ0FMTEoJMTEKLQotLyogTWFza3MgZm9yIHRoZSBtb2RlIGJpdHMgaW4gUkVHIGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgTTEJCTB4MDgwMAotI2RlZmluZSBNMgkJMHgxMDAwCi0jZGVmaW5lIE0zCQkweDIwMDAKLQotLyogR2VuZXJhdGUgdGhlIDEyLWJpdCBvcGNvZGUgZm9yIGEgUkVHIGZvcm1hdCBpbnN0cnVjdGlvbiBieSBwbGFjaW5nIHRoZSAKLSAqIGhpZ2ggOCBiaXRzIGluIGluc3RydWN0aW9uIGJpdHMgMjQtMzEsIHRoZSBsb3cgNCBiaXRzIGluIGluc3RydWN0aW9uIGJpdHMKLSAqIDctMTAuCi0gKi8KLQotI2RlZmluZSBSRUdfT1BDKG9wYykJKChvcGMgJiAweGZmMCkgPDwgMjApIHwgKChvcGMgJiAweGYpIDw8IDcpCi0KLS8qIEdlbmVyYXRlIGEgdGVtcGxhdGUgZm9yIGEgUkVHIGZvcm1hdCBpbnN0cnVjdGlvbjogIHBsYWNlIHRoZSBvcGNvZGUgYml0cwotICogaW4gdGhlIGFwcHJvcHJpYXRlIGZpZWxkcyBhbmQgT1IgaW4gbW9kZSBiaXRzIGZvciB0aGUgb3BlcmFuZHMgdGhhdCB3aWxsIG5vdAotICogYmUgdXNlZC4gIEkuZS4sCi0gKgkJc2V0IG0xPTEsIGlmIHNyYzEgd2lsbCBub3QgYmUgdXNlZAotICoJCXNldCBtMj0xLCBpZiBzcmMyIHdpbGwgbm90IGJlIHVzZWQKLSAqCQlzZXQgbTM9MSwgaWYgZHN0ICB3aWxsIG5vdCBiZSB1c2VkCi0gKgotICogU2V0dGluZyB0aGUgInVudXNlZCIgbW9kZSBiaXRzIHRvIDEgc3BlZWRzIHVwIGluc3RydWN0aW9uIGV4ZWN1dGlvbighKS4KLSAqIFRoZSBpbmZvcm1hdGlvbiBpcyBhbHNvIHVzZWZ1bCB0byB1cyBiZWNhdXNlIHNvbWUgMS1vcGVyYW5kIFJFRyBpbnN0cnVjdGlvbnMKLSAqIHVzZSB0aGUgc3JjMSBmaWVsZCwgb3RoZXJzIHRoZSBkc3QgZmllbGQ7IGFuZCBzb21lIDItb3BlcmFuZCBSRUcgaW5zdHJ1Y3Rpb25zCi0gKiB1c2Ugc3JjMS9zcmMyLCBvdGhlcnMgc3JjMS9kc3QuICBUaGUgc2V0IG1vZGUgYml0cyBlbmFibGUgdXMgdG8gZGlzdGluZ3Vpc2guCi0gKi8KLSNkZWZpbmUgUl8wKG9wYykJKCBSRUdfT1BDKG9wYykgfCBNMSB8IE0yIHwgTTMgKQkvKiBObyBvcGVyYW5kcyAgICAgICovCi0jZGVmaW5lIFJfMShvcGMpCSggUkVHX09QQyhvcGMpIHwgTTIgfCBNMyApCS8qIDEgb3BlcmFuZDogc3JjMSAgKi8KLSNkZWZpbmUgUl8xRChvcGMpCSggUkVHX09QQyhvcGMpIHwgTTEgfCBNMiApCS8qIDEgb3BlcmFuZDogZHN0ICAgKi8KLSNkZWZpbmUgUl8yKG9wYykJKCBSRUdfT1BDKG9wYykgfCBNMyApCQkvKiAyIG9wczogc3JjMS9zcmMyICovCi0jZGVmaW5lIFJfMkQob3BjKQkoIFJFR19PUEMob3BjKSB8IE0yICkJCS8qIDIgb3BzOiBzcmMxL2RzdCAgKi8KLSNkZWZpbmUgUl8zKG9wYykJKCBSRUdfT1BDKG9wYykgKQkJLyogMyBvcGVyYW5kcyAgICAgICAqLwotCi0vKiBERVNDUklQVE9SIEJZVEVTIEZPUiBSRUdJU1RFUiBPUEVSQU5EUwotICoKLSAqIEludGVycHJldCBuYW1lcyBhcyBmb2xsb3dzOgotICoJUjogICBnbG9iYWwgb3IgbG9jYWwgcmVnaXN0ZXIgb25seQotICoJUlM6ICBnbG9iYWwsIGxvY2FsLCBvciAoaWYgdGFyZ2V0IGFsbG93cykgc3BlY2lhbC1mdW5jdGlvbiByZWdpc3RlciBvbmx5Ci0gKglSTDogIGdsb2JhbCBvciBsb2NhbCByZWdpc3Rlciwgb3IgaW50ZWdlciBsaXRlcmFsCi0gKglSU0w6IGdsb2JhbCwgbG9jYWwsIG9yIChpZiB0YXJnZXQgYWxsb3dzKSBzcGVjaWFsLWZ1bmN0aW9uIHJlZ2lzdGVyOwotICoJCW9yIGludGVnZXIgbGl0ZXJhbAotICoJRjogICBnbG9iYWwsIGxvY2FsLCBvciBmbG9hdGluZy1wb2ludCByZWdpc3RlcgotICoJRkw6ICBnbG9iYWwsIGxvY2FsLCBvciBmbG9hdGluZy1wb2ludCByZWdpc3Rlcjsgb3IgbGl0ZXJhbCAoaW5jbHVkaW5nCi0gKgkJZmxvYXRpbmcgcG9pbnQpCi0gKgotICogQSBudW1iZXIgYXBwZW5kZWQgdG8gYSBuYW1lIGluZGljYXRlcyB0aGF0IHJlZ2lzdGVycyBtdXN0IGJlIGFsaWduZWQsCi0gKiBhcyBmb2xsb3dzOgotICoJMjogcmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgbXVsdGlwbGUgb2YgMgotICoJNDogcmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgbXVsdGlwbGUgb2YgNAotICovCi0KLSNkZWZpbmUgU0ZSCTB4MTAJCS8qIE1hc2sgZm9yIHRoZSAic2ZyLU9LIiBiaXQgKi8KLSNkZWZpbmUgTElUCTB4MDgJCS8qIE1hc2sgZm9yIHRoZSAibGl0ZXJhbC1PSyIgYml0ICovCi0jZGVmaW5lIEZQCTB4MDQJCS8qIE1hc2sgZm9yICJmbG9hdGluZy1wb2ludC1PSyIgYml0ICovCi0KLS8qIFRoaXMgbWFjcm8gb3JzIHRoZSBiaXRzIHRvZ2V0aGVyLiAgTm90ZSB0aGF0ICdhbGlnbicgaXMgYSBtYXNrCi0gKiBmb3IgdGhlIGxvdyAwLCAxLCBvciAyIGJpdHMgb2YgdGhlIHJlZ2lzdGVyIG51bWJlciwgYXMgYXBwcm9wcmlhdGUuCi0gKi8KLSNkZWZpbmUgT1AoYWxpZ24sbGl0LGZwLHNmcikJKCBhbGlnbiB8IGxpdCB8IGZwIHwgc2ZyICkKLQotI2RlZmluZSBSCU9QKCAwLCAwLCAgIDAsICAwICAgKQotI2RlZmluZSBSUwlPUCggMCwgMCwgICAwLCAgU0ZSICkKLSNkZWZpbmUgUkwJT1AoIDAsIExJVCwgMCwgIDAgICApCi0jZGVmaW5lIFJTTAlPUCggMCwgTElULCAwLCAgU0ZSICkKLSNkZWZpbmUgRglPUCggMCwgMCwgICBGUCwgMCAgICkKLSNkZWZpbmUgRkwJT1AoIDAsIExJVCwgRlAsIDAgICApCi0jZGVmaW5lIFIyCU9QKCAxLCAwLCAgIDAsICAwICAgKQotI2RlZmluZSBSTDIJT1AoIDEsIExJVCwgMCwgIDAgICApCi0jZGVmaW5lIEYyCU9QKCAxLCAwLCAgIEZQLCAwICAgKQotI2RlZmluZSBGTDIJT1AoIDEsIExJVCwgRlAsIDAgICApCi0jZGVmaW5lIFI0CU9QKCAzLCAwLCAgIDAsICAwICAgKQotI2RlZmluZSBSTDQJT1AoIDMsIExJVCwgMCwgIDAgICApCi0jZGVmaW5lIEY0CU9QKCAzLCAwLCAgIEZQLCAwICAgKQotI2RlZmluZSBGTDQJT1AoIDMsIExJVCwgRlAsIDAgICApCi0KLSNkZWZpbmUgTQkweDdmCS8qIE1lbW9yeSBvcGVyYW5kIChNRU1BICYgTUVNQiBmb3JtYXQgaW5zdHJ1Y3Rpb25zKSAqLwotCi0vKiBNYWNyb3MgdG8gZXh0cmFjdCBpbmZvIGZyb20gdGhlIHJlZ2lzdGVyIG9wZXJhbmQgZGVzY3JpcHRvciBieXRlICdvZCcuCi0gKi8KLSNkZWZpbmUgU0ZSX09LKG9kKQkob2QgJiBTRlIpCS8qIFRSVUUgaWYgc2ZyIG9wZXJhbmQgYWxsb3dlZCAqLwotI2RlZmluZSBMSVRfT0sob2QpCShvZCAmIExJVCkJLyogVFJVRSBpZiBsaXRlcmFsIG9wZXJhbmQgYWxsb3dlZCAqLwotI2RlZmluZSBGUF9PSyhvZCkJKG9kICYgRlApCS8qIFRSVUUgaWYgZmxvYXRpbmctcG9pbnQgb3AgYWxsb3dlZCAqLwotI2RlZmluZSBSRUdfQUxJR04ob2QsbikJKChvZCAmIDB4MyAmIG4pID09IDApCi0JCQkJCS8qIFRSVUUgaWYgcmVnICNuIGlzIHByb3Blcmx5IGFsaWduZWQgKi8KLSNkZWZpbmUgTUVNT1Aob2QpCShvZCA9PSBNKQkvKiBUUlVFIGlmIG9wZXJhbmQgaXMgYSBtZW1vcnkgb3BlcmFuZCovCi0KLS8qIERlc2NyaXB0aW9uIG9mIGEgc2luZ2xlIGk4MDk2MCBpbnN0cnVjdGlvbiAqLwotc3RydWN0IGk5NjBfb3Bjb2RlIHsKLQlsb25nIG9wY29kZTsJLyogMzIgYml0cywgY29uc3RhbnQgZmllbGRzIGZpbGxlZCBpbiwgcmVzdCB6ZXJvZWQgKi8KLQljaGFyICpuYW1lOwkvKiBBc3NlbWJsZXIgbW5lbW9uaWMJCQkJICAgKi8KLQlzaG9ydCBpY2xhc3M7CS8qIENsYXNzOiBzZWUgI2RlZmluZXMgYmVsb3cJCQkgICAqLwotCWNoYXIgZm9ybWF0OwkvKiBSRUcsIENPQlIsIENUUkwsIE1FTW4sIENPSiwgRkJSQSwgb3IgQ0FMTEoJICAgKi8KLQljaGFyIG51bV9vcHM7CS8qIE51bWJlciBvZiBvcGVyYW5kcwkJCQkgICAqLwotCWNoYXIgb3BlcmFuZFszXTsvKiBPcGVyYW5kIGRlc2NyaXB0b3JzOyBzYW1lIG9yZGVyIGFzIGFzc2VtYmxlciBpbnN0ciAqLwotfTsKLQotLyogQ2xhc3NlcyBvZiA5NjAgaW50cnVjdGlvbnM6Ci0gKgktIGVhY2ggaW5zdHJ1Y3Rpb24gZmFsbHMgaW50byBvbmUgY2xhc3MuCi0gKgktIGVhY2ggdGFyZ2V0IGFyY2hpdGVjdHVyZSBzdXBwb3J0cyBvbmUgb3IgbW9yZSBjbGFzc2VzLgotICoKLSAqIEVBQ0ggQ09OU1RBTlQgTVVTVCBDT05UQUlOIDEgQU5EIE9OTFkgMSBTRVQgQklUITogIHNlZSB0YXJnX2hhc19pY2xhc3MoKS4KLSAqLwotI2RlZmluZSBJX0JBU0UJMHgwMQkvKiA4MDk2MCBiYXNlIGluc3RydWN0aW9uIHNldAkqLwotI2RlZmluZSBJX0NYCTB4MDIJLyogODA5NjBDeCBpbnN0cnVjdGlvbgkJKi8KLSNkZWZpbmUgSV9ERUMJMHgwNAkvKiBEZWNpbWFsIGluc3RydWN0aW9uCQkqLwotI2RlZmluZSBJX0ZQCTB4MDgJLyogRmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24JKi8KLSNkZWZpbmUgSV9LWAkweDEwCS8qIDgwOTYwS3ggaW5zdHJ1Y3Rpb24JCSovCi0jZGVmaW5lIElfTUlMCTB4MjAJLyogTWlsaXRhcnkgaW5zdHJ1Y3Rpb24JCSovCi0jZGVmaW5lIElfQ0FTSU0JMHg0MAkvKiBDQSBzaW11bGF0b3IgaW5zdHJ1Y3Rpb24JKi8KLSNkZWZpbmUgSV9DWDIJMHg4MAkvKiBDeC9KeC9IeCBpbnN0cnVjdGlvbnMJKi8KLSNkZWZpbmUgSV9KWAkweDEwMAkvKiBKeC9IeCBpbnN0cnVjdGlvbgkJKi8KLSNkZWZpbmUgSV9IWAkweDIwMAkvKiBIeCBpbnN0cnVjdGlvbnMJCSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKgkJVEFCTEUgT0YgaTk2MCBJTlNUUlVDVElPTiBERVNDUklQVElPTlMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1jb25zdCBzdHJ1Y3QgaTk2MF9vcGNvZGUgaTk2MF9vcGNvZGVzW10gPSB7Ci0KLQkvKiBpZiBhIENUUkwgaW5zdHJ1Y3Rpb24gaGFzIGFuIG9wZXJhbmQsIGl0J3MgYWx3YXlzIGEgZGlzcGxhY2VtZW50ICovCi0KLQkvKiBjYWxsaiBkZWZhdWx0PT0nY2FsbCcgKi8KLQl7IDB4MDkwMDAwMDAsCSJjYWxsaiIsCUlfQkFTRSwJQ0FMTEosIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgwODAwMDAwMCwJImIiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MDkwMDAwMDAsCSJjYWxsIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDBhMDAwMDAwLAkicmV0IiwJCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDBiMDAwMDAwLAkiYmFsIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDEwMDAwMDAwLAkiYm5vIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYmYgc2FtZSBhcyBibm8gKi8KLQl7IDB4MTAwMDAwMDAsCSJiZiIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJydSBzYW1lIGFzIGJubyAqLwotCXsgMHgxMDAwMDAwMCwJImJydSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxMTAwMDAwMCwJImJnIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJnIHNhbWUgYXMgYmcgKi8KLQl7IDB4MTEwMDAwMDAsCSJicmciLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTIwMDAwMDAsCSJiZSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJyZSBzYW1lIGFzIGJlICovCi0JeyAweDEyMDAwMDAwLAkiYnJlIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDEzMDAwMDAwLAkiYmdlIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJnZSBzYW1lIGFzIGJnZSAqLwotCXsgMHgxMzAwMDAwMCwJImJyZ2UiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTQwMDAwMDAsCSJibCIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJybCBzYW1lIGFzIGJsICovCi0JeyAweDE0MDAwMDAwLAkiYnJsIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDE1MDAwMDAwLAkiYm5lIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJsZyBzYW1lIGFzIGJuZSAqLwotCXsgMHgxNTAwMDAwMCwJImJybGciLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTYwMDAwMDAsCSJibGUiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBicmxlIHNhbWUgYXMgYmxlICovCi0JeyAweDE2MDAwMDAwLAkiYnJsZSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxNzAwMDAwMCwJImJvIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnQgc2FtZSBhcyBibyAqLwotCXsgMHgxNzAwMDAwMCwJImJ0IiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJvIHNhbWUgYXMgYm8gKi8KLQl7IDB4MTcwMDAwMDAsCSJicm8iLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTgwMDAwMDAsCSJmYXVsdG5vIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQkvKiBmYXVsdGYgc2FtZSBhcyBmYXVsdG5vICovCi0JeyAweDE4MDAwMDAwLAkiZmF1bHRmIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTkwMDAwMDAsCSJmYXVsdGciLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxYTAwMDAwMCwJImZhdWx0ZSIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDFiMDAwMDAwLAkiZmF1bHRnZSIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDFjMDAwMDAwLAkiZmF1bHRsIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MWQwMDAwMDAsCSJmYXVsdG5lIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MWUwMDAwMDAsCSJmYXVsdGxlIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MWYwMDAwMDAsCSJmYXVsdG8iLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCS8qIGZhdWx0dCBzeW4gZm9yIGZhdWx0byAqLwotCXsgMHgxZjAwMDAwMCwJImZhdWx0dCIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0KLQl7IDB4MDEwMDAwMDAsCSJzeXNjYWxsIiwJSV9DQVNJTSxDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQotCS8qIElmIGEgQ09CUiAob3IgQ09KKSBoYXMgMyBvcGVyYW5kcywgdGhlIGxhc3Qgb25lIGlzIGFsd2F5cyBhCi0JICogZGlzcGxhY2VtZW50IGFuZCBkb2VzIG5vdCBhcHBlYXIgZXhwbGljaXRseSBpbiB0aGUgdGFibGUuCi0JICovCi0KLQl7IDB4MjAwMDAwMDAsCSJ0ZXN0bm8iLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDIxMDAwMDAwLAkidGVzdGciLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDIyMDAwMDAwLAkidGVzdGUiLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDIzMDAwMDAwLAkidGVzdGdlIiwJSV9CQVNFLAlDT0JSLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgMHgyNDAwMDAwMCwJInRlc3RsIiwJSV9CQVNFLAlDT0JSLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgMHgyNTAwMDAwMCwJInRlc3RuZSIsCUlfQkFTRSwJQ09CUiwJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IDB4MjYwMDAwMDAsCSJ0ZXN0bGUiLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDI3MDAwMDAwLAkidGVzdG8iLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDMwMDAwMDAwLAkiYmJjIiwJCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMTAwMDAwMCwJImNtcG9iZyIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMjAwMDAwMCwJImNtcG9iZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMzAwMDAwMCwJImNtcG9iZ2UiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzQwMDAwMDAsCSJjbXBvYmwiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzUwMDAwMDAsCSJjbXBvYm5lIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM2MDAwMDAwLAkiY21wb2JsZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzNzAwMDAwMCwJImJicyIsCQlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzgwMDAwMDAsCSJjbXBpYm5vIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM5MDAwMDAwLAkiY21waWJnIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNhMDAwMDAwLAkiY21waWJlIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNiMDAwMDAwLAkiY21waWJnZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzYzAwMDAwMCwJImNtcGlibCIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzZDAwMDAwMCwJImNtcGlibmUiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2UwMDAwMDAsCSJjbXBpYmxlIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNmMDAwMDAwLAkiY21waWJvIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDMxMDAwMDAwLAkiY21wb2pnIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzIwMDAwMDAsCSJjbXBvamUiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMzAwMDAwMCwJImNtcG9qZ2UiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzNDAwMDAwMCwJImNtcG9qbCIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM1MDAwMDAwLAkiY21wb2puZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM2MDAwMDAwLAkiY21wb2psZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM4MDAwMDAwLAkiY21waWpubyIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM5MDAwMDAwLAkiY21waWpnIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2EwMDAwMDAsCSJjbXBpamUiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzYjAwMDAwMCwJImNtcGlqZ2UiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzYzAwMDAwMCwJImNtcGlqbCIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNkMDAwMDAwLAkiY21waWpuZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNlMDAwMDAwLAkiY21waWpsZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNmMDAwMDAwLAkiY21waWpvIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQotCXsgMHg4MDAwMDAwMCwJImxkb2IiLAkJSV9CQVNFLAlNRU0xLAkyLCB7IE0sICBSLCAgMCB9IH0sCi0JeyAweDgyMDAwMDAwLAkic3RvYiIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgUiwgIE0sICAwIH0gfSwKLQl7IDB4ODQwMDAwMDAsCSJieCIsCQlJX0JBU0UsCU1FTTEsCTEsIHsgTSwgIDAsICAwIH0gfSwKLQl7IDB4ODUwMDAwMDAsCSJiYWx4IiwJCUlfQkFTRSwJTUVNMSwJMiwgeyBNLCAgUiwgIDAgfSB9LAotCXsgMHg4NjAwMDAwMCwJImNhbGx4IiwJSV9CQVNFLAlNRU0xLAkxLCB7IE0sICAwLCAgMCB9IH0sCi0JeyAweDg4MDAwMDAwLAkibGRvcyIsCQlJX0JBU0UsCU1FTTIsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4OGEwMDAwMDAsCSJzdG9zIiwJCUlfQkFTRSwJTUVNMiwJMiwgeyBSLCAgTSwgIDAgfSB9LAotCXsgMHg4YzAwMDAwMCwJImxkYSIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4OTAwMDAwMDAsCSJsZCIsCQlJX0JBU0UsCU1FTTQsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4OTIwMDAwMDAsCSJzdCIsCQlJX0JBU0UsCU1FTTQsCTIsIHsgUiwgIE0sICAwIH0gfSwKLQl7IDB4OTgwMDAwMDAsCSJsZGwiLAkJSV9CQVNFLAlNRU04LAkyLCB7IE0sICBSMiwgMCB9IH0sCi0JeyAweDlhMDAwMDAwLAkic3RsIiwJCUlfQkFTRSwJTUVNOCwJMiwgeyBSMiwgTSwgIDAgfSB9LAotCXsgMHhhMDAwMDAwMCwJImxkdCIsCQlJX0JBU0UsCU1FTTEyLAkyLCB7IE0sICBSNCwgMCB9IH0sCi0JeyAweGEyMDAwMDAwLAkic3R0IiwJCUlfQkFTRSwJTUVNMTIsCTIsIHsgUjQsIE0sICAwIH0gfSwKLQl7IDB4YjAwMDAwMDAsCSJsZHEiLAkJSV9CQVNFLAlNRU0xNiwJMiwgeyBNLCAgUjQsIDAgfSB9LAotCXsgMHhiMjAwMDAwMCwJInN0cSIsCQlJX0JBU0UsCU1FTTE2LAkyLCB7IFI0LCBNLCAgMCB9IH0sCi0JeyAweGMwMDAwMDAwLAkibGRpYiIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4YzIwMDAwMDAsCSJzdGliIiwJCUlfQkFTRSwJTUVNMSwJMiwgeyBSLCAgTSwgIDAgfSB9LAotCXsgMHhjODAwMDAwMCwJImxkaXMiLAkJSV9CQVNFLAlNRU0yLAkyLCB7IE0sICBSLCAgMCB9IH0sCi0JeyAweGNhMDAwMDAwLAkic3RpcyIsCQlJX0JBU0UsCU1FTTIsCTIsIHsgUiwgIE0sICAwIH0gfSwKLQotCXsgUl8zKDB4NTgwKSwJIm5vdGJpdCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTgxKSwJImFuZCIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4MiksCSJhbmRub3QiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4MyksCSJzZXRiaXQiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4NCksCSJub3RhbmQiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4NiksCSJ4b3IiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1ODcpLAkib3IiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1ODgpLAkibm9yIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTg5KSwJInhub3IiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzJEKDB4NThhKSwJIm5vdCIsCQlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlMsIDAgfSB9LAotCXsgUl8zKDB4NThiKSwJIm9ybm90IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OGMpLAkiY2xyYml0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OGQpLAkibm90b3IiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4ZSksCSJuYW5kIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NThmKSwJImFsdGVyYml0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OTApLAkiYWRkbyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5MSksCSJhZGRpIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTkyKSwJInN1Ym8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OTMpLAkic3ViaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5OCksCSJzaHJvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTlhKSwJInNocmRpIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OWIpLAkic2hyaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5YyksCSJzaGxvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTlkKSwJInJvdGF0ZSIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTllKSwJInNobGkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzIoMHg1YTApLAkiY21wbyIsCQlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMigweDVhMSksCSJjbXBpIiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NWEyKSwJImNvbmNtcG8iLAlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMigweDVhMyksCSJjb25jbXBpIiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzMoMHg1YTQpLAkiY21waW5jbyIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NWE1KSwJImNtcGluY2kiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDVhNiksCSJjbXBkZWNvIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1YTcpLAkiY21wZGVjaSIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8yKDB4NWFjKSwJInNjYW5ieXRlIiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzIoMHg1YWUpLAkiY2hrYml0IiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzMoMHg1YjApLAkiYWRkYyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDViMiksCSJzdWJjIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8yRCgweDVjYyksCSJtb3YiLAkJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTLCAwIH0gfSwKLQl7IFJfMkQoMHg1ZGMpLAkibW92bCIsCQlJX0JBU0UsCVJFRywJMiwgeyBSTDIsUjIsIDAgfSB9LAotCXsgUl8yRCgweDVlYyksCSJtb3Z0IiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJMNCxSNCwgMCB9IH0sCi0JeyBSXzJEKDB4NWZjKSwJIm1vdnEiLAkJSV9CQVNFLAlSRUcsCTIsIHsgUkw0LFI0LCAwIH0gfSwKLQl7IFJfMygweDYxMCksCSJhdG1vZCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTLCBSU0wsUiB9IH0sCi0JeyBSXzMoMHg2MTIpLAkiYXRhZGQiLAlJX0JBU0UsCVJFRywJMywgeyBSUywgUlNMLFJTIH0gfSwKLQl7IFJfMkQoMHg2NDApLAkic3BhbmJpdCIsCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSUywgMCB9IH0sCi0JeyBSXzJEKDB4NjQxKSwJInNjYW5iaXQiLAlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlMsIDAgfSB9LAotCXsgUl8zKDB4NjQ1KSwJIm1vZGFjIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg2NTApLAkibW9kaWZ5IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSIH0gfSwKLQl7IFJfMygweDY1MSksCSJleHRyYWN0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSIH0gfSwKLQl7IFJfMygweDY1NCksCSJtb2R0YyIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NjU1KSwJIm1vZHBjIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSIH0gfSwKLQl7IFJfMSgweDY2MCksCSJjYWxscyIsCUlfQkFTRSwJUkVHLAkxLCB7IFJTTCwgMCwgMCB9IH0sCi0JeyBSXzAoMHg2NmIpLAkibWFyayIsCQlJX0JBU0UsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKLQl7IFJfMCgweDY2YyksCSJmbWFyayIsCUlfQkFTRSwJUkVHLAkwLCB7IDAsIDAsIDAgfQl9LAotCXsgUl8wKDB4NjZkKSwJImZsdXNocmVnIiwJSV9CQVNFLAlSRUcsCTAsIHsgMCwgMCwgMCB9CX0sCi0JeyBSXzAoMHg2NmYpLAkic3luY2YiLAlJX0JBU0UsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKLQl7IFJfMygweDY3MCksCSJlbXVsIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUjIgfSB9LAotCXsgUl8zKDB4NjcxKSwJImVkaXYiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJMMixSUyB9IH0sCi0JeyBSXzJEKDB4NjcyKSwJImN2dGFkciIsCUlfQ0FTSU0sUkVHLCAJMiwgeyBSTCwgUjIsIDAgfSB9LAotCXsgUl8zKDB4NzAxKSwJIm11bG8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3MDgpLAkicmVtbyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDcwYiksCSJkaXZvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzQxKSwJIm11bGkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3NDgpLAkicmVtaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc0OSksCSJtb2RpIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzRiKSwJImRpdmkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0KLQkvKiBGbG9hdGluZy1wb2ludCBpbnN0cnVjdGlvbnMgKi8KLQotCXsgUl8yRCgweDY3NCksCSJjdnRpciIsCUlfRlAsCVJFRywJMiwgeyBSTCwgRiwgMCB9IH0sCi0JeyBSXzJEKDB4Njc1KSwJImN2dGlsciIsCUlfRlAsCVJFRywJMiwgeyBSTCwgRiwgMCB9IH0sCi0JeyBSXzMoMHg2NzYpLAkic2NhbGVybCIsCUlfRlAsCVJFRywJMywgeyBSTCwgRkwyLEYyIH0gfSwKLQl7IFJfMygweDY3NyksCSJzY2FsZXIiLAlJX0ZQLAlSRUcsCTMsIHsgUkwsIEZMLCBGIH0gfSwKLQl7IFJfMygweDY4MCksCSJhdGFuciIsCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NjgxKSwJImxvZ2VwciIsCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NjgyKSwJImxvZ3IiLAkJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg2ODMpLAkicmVtciIsCQlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKLQl7IFJfMigweDY4NCksCSJjbXBvciIsCUlfRlAsCVJFRywJMiwgeyBGTCwgRkwsIDAgfSB9LAotCXsgUl8yKDB4Njg1KSwJImNtcHIiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGTCwgMCB9IH0sCi0JeyBSXzJEKDB4Njg4KSwJInNxcnRyIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2ODkpLAkiZXhwciIsCQlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY4YSksCSJsb2dibnIiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY4YiksCSJyb3VuZHIiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY4YyksCSJzaW5yIiwJCUlfRlAsCVJFRywJMiwgeyBGTCwgRiwgMCB9IH0sCi0JeyBSXzJEKDB4NjhkKSwJImNvc3IiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2OGUpLAkidGFuciIsCQlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8xKDB4NjhmKSwJImNsYXNzciIsCUlfRlAsCVJFRywJMSwgeyBGTCwgMCwgMCB9CX0sCi0JeyBSXzMoMHg2OTApLAkiYXRhbnJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NjkxKSwJImxvZ2VwcmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzMoMHg2OTIpLAkibG9ncmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzMoMHg2OTMpLAkicmVtcmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzIoMHg2OTQpLAkiY21wb3JsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGTDIsIDAgfSB9LAotCXsgUl8yKDB4Njk1KSwJImNtcHJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGTDIsIDAgfSB9LAotCXsgUl8yRCgweDY5OCksCSJzcXJ0cmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2OTkpLAkiZXhwcmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2OWEpLAkibG9nYm5ybCIsCUlfRlAsCVJFRywJMiwgeyBGTDIsRjIsIDAgfSB9LAotCXsgUl8yRCgweDY5YiksCSJyb3VuZHJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzJEKDB4NjljKSwJInNpbnJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzJEKDB4NjlkKSwJImNvc3JsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzJEKDB4NjllKSwJInRhbnJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzEoMHg2OWYpLAkiY2xhc3NybCIsCUlfRlAsCVJFRywJMSwgeyBGTDIsIDAsIDAgfSB9LAotCXsgUl8yRCgweDZjMCksCSJjdnRyaSIsCUlfRlAsCVJFRywJMiwgeyBGTCwgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NmMxKSwJImN2dHJpbCIsCUlfRlAsCVJFRywJMiwgeyBGTCwgUjIsIDAgfSB9LAotCXsgUl8yRCgweDZjMiksCSJjdnR6cmkiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIFIsIDAgfSB9LAotCXsgUl8yRCgweDZjMyksCSJjdnR6cmlsIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBSMiwgMCB9IH0sCi0JeyBSXzJEKDB4NmM5KSwJIm1vdnIiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2ZDkpLAkibW92cmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2ZTEpLAkibW92cmUiLAlJX0ZQLAlSRUcsCTIsIHsgRkw0LEY0LCAwIH0gfSwKLQl7IFJfMygweDZlMiksCSJjcHlzcmUiLAlJX0ZQLAlSRUcsCTMsIHsgRkw0LEZMNCxGNCB9IH0sCi0JeyBSXzMoMHg2ZTMpLAkiY3B5cnNyZSIsCUlfRlAsCVJFRywJMywgeyBGTDQsRkw0LEY0IH0gfSwKLQl7IFJfMygweDc4YiksCSJkaXZyIiwJCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NzhjKSwJIm11bHIiLAkJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg3OGQpLAkic3ViciIsCQlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKLQl7IFJfMygweDc4ZiksCSJhZGRyIiwJCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NzliKSwJImRpdnJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NzljKSwJIm11bHJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NzlkKSwJInN1YnJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NzlmKSwJImFkZHJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCi0JLyogVGhlc2UgYXJlIHRoZSBmbG9hdGluZyBwb2ludCBicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgRWFjaCBhY3R1YWxseQotCSAqIGdlbmVyYXRlcyAyIGJyYW5jaCBpbnN0cnVjdGlvbnM6ICB0aGUgZmlyc3QgYSBDVFJMIGluc3RydWN0aW9uIHdpdGgKLQkgKiB0aGUgaW5kaWNhdGVkIG9wY29kZSwgYW5kIHRoZSBzZWNvbmQgYSAnYm5vJy4KLQkgKi8KLQotCXsgMHgxMjAwMDAwMCwJImJydWUiLAkJSV9GUCwJRkJSQSwgCTEsIHsgMCwgMCwgMCB9CX0sCi0JeyAweDExMDAwMDAwLAkiYnJ1ZyIsCQlJX0ZQLAlGQlJBLCAJMSwgeyAwLCAwLCAwIH0JfSwKLQl7IDB4MTMwMDAwMDAsCSJicnVnZSIsCUlfRlAsCUZCUkEsIAkxLCB7IDAsIDAsIDAgfQl9LAotCXsgMHgxNDAwMDAwMCwJImJydWwiLAkJSV9GUCwJRkJSQSwgCTEsIHsgMCwgMCwgMCB9CX0sCi0JeyAweDE2MDAwMDAwLAkiYnJ1bGUiLAlJX0ZQLAlGQlJBLCAJMSwgeyAwLCAwLCAwIH0JfSwKLQl7IDB4MTUwMDAwMDAsCSJicnVsZyIsCUlfRlAsCUZCUkEsIAkxLCB7IDAsIDAsIDAgfQl9LAotCi0KLQkvKiBEZWNpbWFsIGluc3RydWN0aW9ucyAqLwotCi0JeyBSXzMoMHg2NDIpLAkiZGFkZGMiLAlJX0RFQywJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NjQzKSwJImRzdWJjIiwJSV9ERUMsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMkQoMHg2NDQpLAkiZG1vdnQiLAlJX0RFQywJUkVHLAkyLCB7IFJTTCxSUywgMCB9IH0sCi0KLQotCS8qIEtYIGV4dGVuc2lvbnMgKi8KLQotCXsgUl8yKDB4NjAwKSwJInN5bm1vdiIsCUlfS1gsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzIoMHg2MDEpLAkic3lubW92bCIsCUlfS1gsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzIoMHg2MDIpLAkic3lubW92cSIsCUlfS1gsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NjE1KSwJInN5bmxkIiwJSV9LWCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQotCi0JLyogTUMgZXh0ZW5zaW9ucyAqLwotCi0JeyBSXzMoMHg2MDMpLAkiY21wc3RyIiwJSV9NSUwsCVJFRywJMywgeyBSLCAgUiwgIFJMIH0gfSwKLQl7IFJfMygweDYwNCksCSJtb3Zxc3RyIiwJSV9NSUwsCVJFRywJMywgeyBSLCAgUiwgIFJMIH0gfSwKLQl7IFJfMygweDYwNSksCSJtb3ZzdHIiLAlJX01JTCwJUkVHLAkzLCB7IFIsICBSLCAgUkwgfSB9LAotCXsgUl8yRCgweDYxMyksCSJpbnNwYWNjIiwJSV9NSUwsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NjE0KSwJImxkcGh5IiwJSV9NSUwsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzMoMHg2MTcpLAkiZmlsbCIsCQlJX01JTCwJUkVHLAkzLCB7IFIsICBSTCwgUkwgfSB9LAotCXsgUl8yRCgweDY0NiksCSJjb25kcmVjIiwJSV9NSUwsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NjU2KSwJInJlY2VpdmUiLAlJX01JTCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQl7IFJfMygweDY2MiksCSJzZW5kIiwJCUlfTUlMLAlSRUcsCTMsIHsgUiwgIFJMLCBSIH0gfSwKLQl7IFJfMSgweDY2MyksCSJzZW5kc2VydiIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyBSXzEoMHg2NjQpLAkicmVzdW1wcmNzIiwJSV9NSUwsCVJFRywJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IFJfMSgweDY2NSksCSJzY2hlZHByY3MiLAlJX01JTCwJUkVHLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgUl8wKDB4NjY2KSwJInNhdmVwcmNzIiwJSV9NSUwsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKLQl7IFJfMSgweDY2OCksCSJjb25kd2FpdCIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyBSXzEoMHg2NjkpLAkid2FpdCIsCQlJX01JTCwJUkVHLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgUl8xKDB4NjZhKSwJInNpZ25hbCIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyBSXzFEKDB4NjczKSwJImxkdGltZSIsCUlfTUlMLAlSRUcsCTEsIHsgUjIsIDAsIDAgfQl9LAotCi0KLQkvKiBDWCBleHRlbnNpb25zICovCi0KLQl7IFJfMygweDVkOCksCSJlc2hybyIsCUlfQ1gyLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg2MzApLAkic2RtYSIsCQlJX0NYLAlSRUcsCTMsIHsgUlNMLFJTTCxSTCB9IH0sCi0JeyBSXzMoMHg2MzEpLAkidWRtYSIsCQlJX0NYLAlSRUcsCTAsIHsgMCwgMCwgMCB9CX0sCi0JeyBSXzMoMHg2NTkpLAkic3lzY3RsIiwJSV9DWDIsCVJFRywJMywgeyBSU0wsUlNMLFJMIH0gfSwKLQotCi0JLyogSnggZXh0ZW5zaW9ucy4gICovCi0JeyBSXzMoMHg3ODApLAkiYWRkb25vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzkwKSwJImFkZG9nIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2EwKSwJImFkZG9lIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2IwKSwJImFkZG9nZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdjMCksCSJhZGRvbCIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdkMCksCSJhZGRvbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZTApLAkiYWRkb2xlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2YwKSwJImFkZG9vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzgxKSwJImFkZGlubyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc5MSksCSJhZGRpZyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdhMSksCSJhZGRpZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdiMSksCSJhZGRpZ2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YzEpLAkiYWRkaWwiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZDEpLAkiYWRkaW5lIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2UxKSwJImFkZGlsZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdmMSksCSJhZGRpbyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQotCXsgUl8yRCgweDVhZCksCSJic3dhcCIsCUlfSlgsCVJFRywJMiwgeyBSU0wsIFJTLCAwIH0gfSwKLQotCXsgUl8yKDB4NTk0KSwJImNtcG9iIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NTk1KSwJImNtcGliIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NTk2KSwJImNtcG9zIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NTk3KSwJImNtcGlzIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCi0JeyBSXzMoMHg3ODQpLAkic2Vsbm8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3OTQpLAkic2VsZyIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YTQpLAkic2VsZSIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YjQpLAkic2VsZ2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YzQpLAkic2VsbCIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZDQpLAkic2VsbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZTQpLAkic2VsbGUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZjQpLAkic2VsbyIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0KLQl7IFJfMygweDc4MiksCSJzdWJvbm8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3OTIpLAkic3Vib2ciLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YTIpLAkic3Vib2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YjIpLAkic3Vib2dlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2MyKSwJInN1Ym9sIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2QyKSwJInN1Ym9uZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdlMiksCSJzdWJvbGUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZjIpLAkic3Vib28iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ODMpLAkic3ViaW5vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzkzKSwJInN1YmlnIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2EzKSwJInN1YmllIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2IzKSwJInN1YmlnZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdjMyksCSJzdWJpbCIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdkMyksCSJzdWJpbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZTMpLAkic3ViaWxlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2YzKSwJInN1YmlvIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCi0JeyBSXzMoMHg2NWMpLAkiZGNjdGwiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSTCB9IH0sCi0JeyBSXzMoMHg2NWIpLAkiaWNjdGwiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzJEKDB4NjU4KSwJImludGN0bCIsCUlfSlgsCVJFRywJMiwgeyBSU0wsIFJTLCAwIH0gfSwKLQl7IFJfMCgweDViNCksCSJpbnRkaXMiLAlJX0pYLAlSRUcsCTAsIHsgICAwLCAgMCwgMCB9IH0sCi0JeyBSXzAoMHg1YjUpLAkiaW50ZW4iLAlJX0pYLAlSRUcsCTAsIHsgICAwLCAgMCwgMCB9IH0sCi0JeyBSXzAoMHg2NWQpLAkiaGFsdCIsCQlJX0pYLAlSRUcsCTEsIHsgUlNMLCAgMCwgMCB9IH0sCi0KLQkvKiBIeCBleHRlbnNpb25zLiAgKi8KLQl7IDB4YWMwMDAwMDAsCSJkY2ludmEiLAlJX0hYLAlNRU0xLAkxLCB7ICAgTSwgIDAsIDAgfSB9LAotCi0JLyogRU5EIE9GIFRBQkxFICovCi0KLQl7IDAsCQlOVUxMLAkJMCwJMCwJMCwgeyAwLCAwLCAwIH0JfQotfTsKLQotIC8qIGVuZCBvZiBpOTYwLW9wY29kZS5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9tNjhrLmggYi9pbmNsdWRlL29wY29kZS9tNjhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYjNmOTUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbTY4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qIE9wY29kZSB0YWJsZSBoZWFkZXIgZm9yIG02ODBbMDEyMzRdMC9tNjg4OFsxMl0vbTY4ODUxLgotICAgQ29weXJpZ2h0IDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhlc2UgYXJlIHVzZWQgYXMgYml0IGZsYWdzIGZvciB0aGUgYXJjaCBmaWVsZCBpbiB0aGUgbTY4a19vcGNvZGUKLSAgIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lCV9tNjhrX3VuZGVmICAwCi0jZGVmaW5lCW02ODAwMCAgMHgwMDEKLSNkZWZpbmUJbTY4MDA4ICBtNjgwMDAgLyogc3lub255bSBmb3IgLW02ODAwMC4gIG90aGVyd2lzZSB1bnVzZWQuICovCi0jZGVmaW5lCW02ODAxMCAgMHgwMDIKLSNkZWZpbmUJbTY4MDIwICAweDAwNAotI2RlZmluZQltNjgwMzAgIDB4MDA4Ci0jZGVmaW5lIG02OGVjMDMwIG02ODAzMCAvKiBzaW1pbGFyIGVub3VnaCB0byAtbTY4MDMwIHRvIGlnbm9yZSBkaWZmZXJlbmNlczsKLQkJCSAgIGdhcyB3aWxsIGRlYWwgd2l0aCB0aGUgZmV3IGRpZmZlcmVuY2VzLiAgKi8KLSNkZWZpbmUJbTY4MDQwICAweDAxMAotLyogdGhlcmUgaXMgbm8gNjgwNTAgKi8KLSNkZWZpbmUgbTY4MDYwICAweDAyMAotI2RlZmluZQltNjg4ODEgIDB4MDQwCi0jZGVmaW5lCW02ODg4MiAgbTY4ODgxIC8qIHN5bm9ueW0gZm9yIC1tNjg4ODEuICBvdGhlcndpc2UgdW51c2VkLiAqLwotI2RlZmluZQltNjg4NTEgIDB4MDgwCi0jZGVmaW5lIGNwdTMyCTB4MTAwCS8qIGUuZy4sIDY4MzMyICovCi0jZGVmaW5lIG1jZjUyMDAgMHgyMDAKLQotIC8qIGhhbmR5IGFsaWFzZXMgKi8KLSNkZWZpbmUJbTY4MDQwdXAgIChtNjgwNDAgfCBtNjgwNjApCi0jZGVmaW5lCW02ODAzMHVwICAobTY4MDMwIHwgbTY4MDQwdXApCi0jZGVmaW5lCW02ODAyMHVwICAobTY4MDIwIHwgbTY4MDMwdXApCi0jZGVmaW5lCW02ODAxMHVwICAobTY4MDEwIHwgY3B1MzIgfCBtNjgwMjB1cCkKLSNkZWZpbmUJbTY4MDAwdXAgIChtNjgwMDAgfCBtNjgwMTB1cCkKLQotI2RlZmluZQltZmxvYXQgIChtNjg4ODEgfCBtNjg4ODIgfCBtNjgwNDAgfCBtNjgwNjApCi0jZGVmaW5lCW1tbXUgICAgKG02ODg1MSB8IG02ODAzMCB8IG02ODA0MCB8IG02ODA2MCkKLQotLyogVGhlIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgaW5mb3JtYXRpb24gZm9yIGFuIG9wY29kZS4gICovCi0KLXN0cnVjdCBtNjhrX29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gICovCi0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICAvKiBUaGUgbWFzayB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICAqLwotICB1bnNpZ25lZCBsb25nIG1hdGNoOwotICAvKiBUaGUgYXJndW1lbnRzLiAgKi8KLSAgY29uc3QgY2hhciAqYXJnczsKLSAgLyogVGhlIGFyY2hpdGVjdHVyZXMgd2hpY2ggc3VwcG9ydCB0aGlzIG9wY29kZS4gICovCi0gIHVuc2lnbmVkIGludCBhcmNoOwotfTsKLQotLyogVGhlIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgaW5mb3JtYXRpb24gZm9yIGFuIG9wY29kZSBhbGlhcy4gICovCi0KLXN0cnVjdCBtNjhrX29wY29kZV9hbGlhcwotewotICAvKiBUaGUgYWxpYXMgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKmFsaWFzOwotICAvKiBUaGUgaW5zdHJ1Y3Rpb24gZm9yIHdoaWNoIHRoaXMgaXMgYW4gYWxpYXMuICAqLwotICBjb25zdCBjaGFyICpwcmltYXJ5OwotfTsKLQotLyogV2Ugc3RvcmUgZm91ciBieXRlcyBvZiBvcGNvZGUgZm9yIGFsbCBvcGNvZGVzIGJlY2F1c2UgdGhhdCBpcyB0aGUKLSAgIG1vc3QgYW55IG9mIHRoZW0gbmVlZC4gIFRoZSBhY3R1YWwgbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uIGlzCi0gICBhbHdheXMgYXQgbGVhc3QgMiBieXRlcywgYW5kIGlzIGFzIG11Y2ggbG9uZ2VyIGFzIG5lY2Vzc2FyeSB0byBob2xkCi0gICB0aGUgb3BlcmFuZHMgaXQgaGFzLgotCi0gICBUaGUgbWF0Y2ggZmllbGQgaXMgYSBtYXNrIHNheWluZyB3aGljaCBiaXRzIG11c3QgbWF0Y2ggcGFydGljdWxhcgotICAgb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZSBvZiB0aGF0Ci0gICBvcGNvZGUuCi0KLSAgIFRoZSBhcmdzIGZpZWxkIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdHdvIGNoYXJhY3RlcnMgZm9yIGVhY2gKLSAgIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uLiAgVGhlIGZpcnN0IHNwZWNpZmllcyB0aGUga2luZCBvZgotICAgb3BlcmFuZDsgdGhlIHNlY29uZCwgdGhlIHBsYWNlIGl0IGlzIHN0b3JlZC4gICovCi0KLS8qIEtpbmRzIG9mIG9wZXJhbmRzOgotICAgQ2hhcmFjdGVycyB1c2VkOiBBYUJDY0RkRmZJSmtMbE1tbk9vcFFxUnJTc1R0VVZ2V1hZWjAxMjN8Kn4lO0AhJiQ/Lzw+I14rLQotCi0gICBEICBkYXRhIHJlZ2lzdGVyIG9ubHkuICBTdG9yZWQgYXMgMyBiaXRzLgotICAgQSAgYWRkcmVzcyByZWdpc3RlciBvbmx5LiAgU3RvcmVkIGFzIDMgYml0cy4KLSAgIGEgIGFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3Qgb25seS4gIFN0b3JlZCBhcyAzIGJpdHMuCi0gICBSICBlaXRoZXIga2luZCBvZiByZWdpc3Rlci4gIFN0b3JlZCBhcyA0IGJpdHMuCi0gICByICBlaXRoZXIga2luZCBvZiByZWdpc3RlciBpbmRpcmVjdCBvbmx5LiAgU3RvcmVkIGFzIDQgYml0cy4KLSAgICAgIEF0IHRoZSBtb21lbnQsIHVzZWQgb25seSBmb3IgY2FzMiBpbnN0cnVjdGlvbi4KLSAgIEYgIGZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yIHJlZ2lzdGVyIG9ubHkuICAgU3RvcmVkIGFzIDMgYml0cy4KLSAgIE8gIGFuIG9mZnNldCAob3Igd2lkdGgpOiBpbW1lZGlhdGUgZGF0YSAwLTMxIG9yIGRhdGEgcmVnaXN0ZXIuCi0gICAgICBTdG9yZWQgYXMgNiBiaXRzIGluIHNwZWNpYWwgZm9ybWF0IGZvciBCRi4uLiBpbnNucy4KLSAgICsgIGF1dG9pbmNyZW1lbnQgb25seS4gIFN0b3JlZCBhcyAzIGJpdHMgKG51bWJlciBvZiB0aGUgYWRkcmVzcyByZWdpc3RlcikuCi0gICAtICBhdXRvZGVjcmVtZW50IG9ubHkuICBTdG9yZWQgYXMgMyBiaXRzIChudW1iZXIgb2YgdGhlIGFkZHJlc3MgcmVnaXN0ZXIpLgotICAgUSAgcXVpY2sgaW1tZWRpYXRlIGRhdGEuICBTdG9yZWQgYXMgMyBiaXRzLgotICAgICAgVGhpcyBtYXRjaGVzIGFuIGltbWVkaWF0ZSBvcGVyYW5kIG9ubHkgd2hlbiB2YWx1ZSBpcyBpbiByYW5nZSAxIC4uIDguCi0gICBNICBtb3ZlcSBpbW1lZGlhdGUgZGF0YS4gIFN0b3JlZCBhcyA4IGJpdHMuCi0gICAgICBUaGlzIG1hdGNoZXMgYW4gaW1tZWRpYXRlIG9wZXJhbmQgb25seSB3aGVuIHZhbHVlIGlzIGluIHJhbmdlIC0xMjguLjEyNwotICAgVCAgdHJhcCB2ZWN0b3IgaW1tZWRpYXRlIGRhdGEuICBTdG9yZWQgYXMgNCBiaXRzLgotCi0gICBrICBLLWZhY3RvciBmb3IgZm1vdmUucCBpbnN0cnVjdGlvbi4gICBTdG9yZWQgYXMgYSA3LWJpdCBjb25zdGFudCBvcgotICAgICAgYSB0aHJlZSBiaXQgcmVnaXN0ZXIgb2Zmc2V0LCBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIHR5cGUuCi0KLSAgICMgIGltbWVkaWF0ZSBkYXRhLiAgU3RvcmVkIGluIHNwZWNpYWwgcGxhY2VzIChiLCB3IG9yIGwpCi0gICAgICB3aGljaCBzYXkgaG93IG1hbnkgYml0cyB0byBzdG9yZS4KLSAgIF4gIGltbWVkaWF0ZSBkYXRhIGZvciBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuICAgU3BlY2lhbCBwbGFjZXMKLSAgICAgIGFyZSBvZmZzZXQgYnkgMiBieXRlcyBmcm9tICcjJy4uLgotICAgQiAgcGMtcmVsYXRpdmUgYWRkcmVzcywgY29udmVydGVkIHRvIGFuIG9mZnNldAotICAgICAgdGhhdCBpcyB0cmVhdGVkIGFzIGltbWVkaWF0ZSBkYXRhLgotICAgZCAgZGlzcGxhY2VtZW50IGFuZCByZWdpc3Rlci4gIFN0b3JlcyB0aGUgcmVnaXN0ZXIgYXMgMyBiaXRzCi0gICAgICBhbmQgc3RvcmVzIHRoZSBkaXNwbGFjZW1lbnQgaW4gdGhlIGVudGlyZSBzZWNvbmQgd29yZC4KLQotICAgQyAgdGhlIENDUi4gIE5vIG5lZWQgdG8gc3RvcmUgaXQ7IHRoaXMgaXMganVzdCBmb3IgZmlsdGVyaW5nIHZhbGlkaXR5LgotICAgUyAgdGhlIFNSLiAgTm8gbmVlZCB0byBzdG9yZSwganVzdCBhcyB3aXRoIENDUi4KLSAgIFUgIHRoZSBVU1AuICBObyBuZWVkIHRvIHN0b3JlLCBqdXN0IGFzIHdpdGggQ0NSLgotCi0gICBJICBDb3Byb2Nlc3NvciBJRC4gICBOb3QgcHJpbnRlZCBpZiAxLiAgIFRoZSBDb3Byb2Nlc3NvciBJRCBpcyBhbHdheXMKLSAgICAgIGV4dHJhY3RlZCBmcm9tIHRoZSAnZCcgZmllbGQgb2Ygd29yZCBvbmUsIHdoaWNoIG1lYW5zIHRoYXQgYW4gZXh0ZW5kZWQKLSAgICAgIGNvcHJvY2Vzc29yIG9wY29kZSBjYW4gYmUgc2tpcHBlZCB1c2luZyB0aGUgJ2knIHBsYWNlLCBpZiBuZWVkZWQuCi0KLSAgIHMgIFN5c3RlbSBDb250cm9sIHJlZ2lzdGVyIGZvciB0aGUgZmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IuCi0KLSAgIEogIE1pc2MgcmVnaXN0ZXIgZm9yIG1vdmVjIGluc3RydWN0aW9uLCBzdG9yZWQgaW4gJ2onIGZvcm1hdC4KLQlQb3NzaWJsZSB2YWx1ZXM6Ci0JMHgwMDAJU0ZDCVNvdXJjZSBGdW5jdGlvbiBDb2RlIHJlZwlbNjAsIDQwLCAzMCwgMjAsIDEwXQotCTB4MDAxCURGQwlEYXRhIEZ1bmN0aW9uIENvZGUgcmVnCQlbNjAsIDQwLCAzMCwgMjAsIDEwXQotCTB4MDAyCUNBQ1IJQ2FjaGUgQ29udHJvbCBSZWdpc3RlcgkJWzYwLCA0MCwgMzAsIDIwXQotCTB4MDAzCVRDCU1NVSBUcmFuc2xhdGlvbiBDb250cm9sCQlbNjAsIDQwXQotCTB4MDA0CUlUVDAJSW5zdHJ1Y3Rpb24gVHJhbnNwYXJlbnQKLQkJCQlUcmFuc2xhdGlvbiByZWcgMAlbNjAsIDQwXQotCTB4MDA1CUlUVDEJSW5zdHJ1Y3Rpb24gVHJhbnNwYXJlbnQKLQkJCQlUcmFuc2xhdGlvbiByZWcgMQlbNjAsIDQwXQotCTB4MDA2CURUVDAJRGF0YSBUcmFuc3BhcmVudAotCQkJCVRyYW5zbGF0aW9uIHJlZyAwCVs2MCwgNDBdCi0JMHgwMDcJRFRUMQlEYXRhIFRyYW5zcGFyZW50Ci0JCQkJVHJhbnNsYXRpb24gcmVnIDEJWzYwLCA0MF0KLQkweDAwOAlCVVNDUglCdXMgQ29udHJvbCBSZWdpc3RlcgkJWzYwXQotCTB4ODAwCVVTUAlVc2VyIFN0YWNrIFBvaW50ZXIJCVs2MCwgNDAsIDMwLCAyMCwgMTBdCi0JMHg4MDEJVkJSCVZlY3RvciBCYXNlIHJlZwkJCVs2MCwgNDAsIDMwLCAyMCwgMTBdCi0JMHg4MDIJQ0FBUglDYWNoZSBBZGRyZXNzIFJlZ2lzdGVyCQlbICAgICAgICAzMCwgMjBdCi0JMHg4MDMJTVNQCU1hc3RlciBTdGFjayBQb2ludGVyCQlbICAgIDQwLCAzMCwgMjBdCi0JMHg4MDQJSVNQCUludGVycnVwdCBTdGFjayBQb2ludGVyCQlbICAgIDQwLCAzMCwgMjBdCi0JMHg4MDUJTU1VU1IJTU1VIFN0YXR1cyByZWcJCQlbICAgIDQwXQotCTB4ODA2CVVSUAlVc2VyIFJvb3QgUG9pbnRlcgkJWzYwLCA0MF0KLQkweDgwNwlTUlAJU3VwZXJ2aXNvciBSb290IFBvaW50ZXIJCVs2MCwgNDBdCi0JMHg4MDgJUENSCVByb2Nlc3NvciBDb25maWd1cmF0aW9uIHJlZwlbNjBdCi0JMHhDMDAJUk9NQkFSCVJPTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIJWzUyMFhdCi0JMHhDMDQJUkFNQkFSMAlSQU0gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDAJWzUyMFhdCi0JMHhDMDUJUkFNQkFSMQlSQU0gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDAJWzUyMFhdCi0JMHhDMEYJTUJBUjAJUkFNIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAwCVs1MjBYXQotCi0gICAgTCAgUmVnaXN0ZXIgbGlzdCBvZiB0aGUgdHlwZSBkMC1kNy9hMC1hNyBldGMuCi0gICAgICAgKE5ldyEgIEltcHJvdmVkISAgQ2FuIGFsc28gaG9sZCBmcDAtZnA3LCBhcyB3ZWxsISkKLSAgICAgICBUaGUgYXNzZW1ibGVyIHRyaWVzIHRvIHNlZSBpZiB0aGUgcmVnaXN0ZXJzIG1hdGNoIHRoZSBpbnNuIGJ5Ci0gICAgICAgbG9va2luZyBhdCB3aGVyZSB0aGUgaW5zbiB3YW50cyB0aGVtIHN0b3JlZC4KLQotICAgIGwgIFJlZ2lzdGVyIGxpc3QgbGlrZSBMLCBidXQgd2l0aCBhbGwgdGhlIGJpdHMgcmV2ZXJzZWQuCi0gICAgICAgVXNlZCBmb3IgZ29pbmcgdGhlIG90aGVyIHdheS4gLiAuCi0KLSAgICBjICBjYWNoZSBpZGVudGlmaWVyIHdoaWNoIG1heSBiZSAibmMiIGZvciBubyBjYWNoZSwgImljIgotICAgICAgIGZvciBpbnN0cnVjdGlvbiBjYWNoZSwgImRjIiBmb3IgZGF0YSBjYWNoZSwgb3IgImJjIgotICAgICAgIGZvciBib3RoIGNhY2hlcy4gIFVzZWQgaW4gY2ludiBhbmQgY3B1c2guICBBbHdheXMKLSAgICAgICBzdG9yZWQgaW4gcG9zaXRpb24gImQiLgotCi0gVGhlIHJlbWFpbmRlciBhcmUgYWxsIHN0b3JlZCBhcyA2IGJpdHMgdXNpbmcgYW4gYWRkcmVzcyBtb2RlIGFuZCBhCi0gcmVnaXN0ZXIgbnVtYmVyOyB0aGV5IGRpZmZlciBpbiB3aGljaCBhZGRyZXNzaW5nIG1vZGVzIHRoZXkgbWF0Y2guCi0KLSAgICogIGFsbAkJCQkJKG1vZGVzIDAtNiw3LjAtNCkKLSAgIH4gIGFsdGVyYWJsZSBtZW1vcnkJCQkJKG1vZGVzIDItNiw3LjAsNy4xKQotICAgCQkJCQkJKG5vdCAwLDEsNy4yLTQpCi0gICAlICBhbHRlcmFibGUJCQkJCShtb2RlcyAwLTYsNy4wLDcuMSkKLQkJCQkJCShub3QgNy4yLTQpCi0gICA7ICBkYXRhCQkJCQkobW9kZXMgMCwyLTYsNy4wLTQpCi0JCQkJCQkobm90IDEpCi0gICBAICBkYXRhLCBidXQgbm90IGltbWVkaWF0ZQkJCShtb2RlcyAwLDItNiw3LjAtMykKLQkJCQkJCShub3QgMSw3LjQpCi0gICAhICBjb250cm9sCQkJCQkobW9kZXMgMiw1LDYsNy4wLTMpCi0JCQkJCQkobm90IDAsMSwzLDQsNy40KQotICAgJiAgYWx0ZXJhYmxlIGNvbnRyb2wJCQkJKG1vZGVzIDIsNSw2LDcuMCw3LjEpCi0JCQkJCQkobm90IDAsMSw3LjItNCkKLSAgICQgIGFsdGVyYWJsZSBkYXRhCQkJCShtb2RlcyAwLDItNiw3LjAsNy4xKQotCQkJCQkJKG5vdCAxLDcuMi00KQotICAgPyAgYWx0ZXJhYmxlIGNvbnRyb2wsIG9yIGRhdGEgcmVnaXN0ZXIJKG1vZGVzIDAsMiw1LDYsNy4wLDcuMSkKLQkJCQkJCShub3QgMSwzLDQsNy4yLTQpCi0gICAvICBjb250cm9sLCBvciBkYXRhIHJlZ2lzdGVyCQkJKG1vZGVzIDAsMiw1LDYsNy4wLTMpCi0JCQkJCQkobm90IDEsMyw0LDcuNCkKLSAgID4gICpzYXZlIG9wZXJhbmRzCQkJCShtb2RlcyAyLDQsNSw2LDcuMCw3LjEpCi0JCQkJCQkobm90IDAsMSwzLDcuMi00KQotICAgPCAgKnJlc3RvcmUgb3BlcmFuZHMJCQkJKG1vZGVzIDIsMyw1LDYsNy4wLTMpCi0JCQkJCQkobm90IDAsMSw0LDcuNCkKLQotICAgY29sZGZpcmUgbW92ZSBvcGVyYW5kczoKLSAgIG0gIAkJCQkJCShtb2RlcyAwLTQpCi0gICBuCQkJCQkJKG1vZGVzIDUsNy4yKQotICAgbwkJCQkJCShtb2RlcyA2LDcuMCw3LjEsNy4zLDcuNCkKLSAgIHAJCQkJCQkobW9kZXMgMC01KQotCi0gICBjb2xkZmlyZSBic2V0L2JjbHIvYnRzdC9tdWxzbC9tdWx1bCBvcGVyYW5kczoKLSAgIHEJCQkJCQkobW9kZXMgMCwyLTUpCi0gICB2CQkJCQkJKG1vZGVzIDAsMi01LDcuMCw3LjEpCi0qLwotCi0vKiBGb3IgdGhlIDY4ODUxOiAqLwotLyoKLSAgIEkgZGlkbid0IHVzZSBtdWNoIGltYWdpbmF0aW9uIGluIGNob29zaW5nIHRoZSAKLSAgIGZvbGxvd2luZyBjb2Rlcywgc28gbWFueSBvZiB0aGVtIGFyZW4ndCB2ZXJ5Ci0gICBtbmVtb25pYy4gLXJhYgotCi0gICAwICAzMiBiaXQgcG1tdSByZWdpc3RlcgotCVBvc3NpYmxlIHZhbHVlczoKLQkwMDAJVEMJVHJhbnNsYXRpb24gQ29udHJvbCBSZWdpc3RlciAoNjgwMzAsIDY4ODUxKQotCi0gICAxICAxNiBiaXQgcG1tdSByZWdpc3RlcgotCTExMQlBQwlBY2Nlc3MgQ29udHJvbCAoNjg4NTEpCi0KLSAgIDIgIDggYml0IHBtbXUgcmVnaXN0ZXIKLQkxMDAJQ0FMCUN1cnJlbnQgQWNjZXNzIExldmVsICg2ODg1MSkKLQkxMDEJVkFMCVZhbGlkYXRlIEFjY2VzcyBMZXZlbCAoNjg4NTEpCi0JMTEwCVNDQwlTdGFjayBDaGFuZ2UgQ29udHJvbCAoNjg4NTEpCi0KLSAgIDMgIDY4MDMwLW9ubHkgcG1tdSByZWdpc3RlcnMgKDMyIGJpdCkKLQkwMTAJVFQwCVRyYW5zcGFyZW50IFRyYW5zbGF0aW9uIHJlZyAwCi0JCQkoYWthIEFjY2VzcyBDb250cm9sIHJlZyAwIC0tIEFDMCAtLSBvbiA2OGVjMDMwKQotCTAxMQlUVDEJVHJhbnNwYXJlbnQgVHJhbnNsYXRpb24gcmVnIDEKLQkJCShha2EgQWNjZXNzIENvbnRyb2wgcmVnIDEgLS0gQUMxIC0tIG9uIDY4ZWMwMzApCi0KLSAgIFcgIHdpZGUgcG1tdSByZWdpc3RlcnMKLQlQb3NzaWJsZSB2YWx1ZXM6Ci0JMDAxCURSUAlEbWEgUm9vdCBQb2ludGVyICg2ODg1MSkKLQkwMTAJU1JQCVN1cGVydmlzb3IgUm9vdCBQb2ludGVyICg2ODAzMCwgNjg4NTEpCi0JMDExCUNSUAlDcHUgUm9vdCBQb2ludGVyICg2ODAzMCwgNjg4NTEpCi0KLSAgIGYJZnVuY3Rpb24gY29kZSByZWdpc3RlciAoNjgwMzAsIDY4ODUxKQotCTAJU0ZDCi0JMQlERkMKLQotICAgVglWQUwgcmVnaXN0ZXIgb25seSAoNjg4NTEpCi0KLSAgIFgJQkFEeCwgQkFDeCAoMTYgYml0KQotCTEwMAlCQUQJQnJlYWtwb2ludCBBY2tub3dsZWRnZSBEYXRhICg2ODg1MSkKLQkxMDEJQkFDCUJyZWFrcG9pbnQgQWNrbm93bGVkZ2UgQ29udHJvbCAoNjg4NTEpCi0KLSAgIFkJUFNSICg2ODg1MSkgKE1NVVNSIG9uIDY4MDMwKSAoQUNVU1Igb24gNjhlYzAzMCkKLSAgIFoJUENTUiAoNjg4NTEpCi0KLSAgIHwJbWVtb3J5IAkJKG1vZGVzIDItNiwgNy4qKQotCi0gICB0ICBhZGRyZXNzIHRlc3QgbGV2ZWwgKDY4MDMwIG9ubHkpCi0gICAgICBTdG9yZWQgYXMgMyBiaXRzLCByYW5nZSAwLTcuCi0gICAgICBBbHNvIHVzZWQgZm9yIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gbm93LgotCi0qLwotCi0vKiBQbGFjZXMgdG8gcHV0IGFuIG9wZXJhbmQsIGZvciBub24tZ2VuZXJhbCBvcGVyYW5kczoKLSAgIHMgIHNvdXJjZSwgbG93IGJpdHMgb2YgZmlyc3Qgd29yZC4KLSAgIGQgIGRlc3QsIHNoaWZ0ZWQgOSBpbiBmaXJzdCB3b3JkCi0gICAxICBzZWNvbmQgd29yZCwgc2hpZnRlZCAxMgotICAgMiAgc2Vjb25kIHdvcmQsIHNoaWZ0ZWQgNgotICAgMyAgc2Vjb25kIHdvcmQsIHNoaWZ0ZWQgMAotICAgNCAgdGhpcmQgd29yZCwgc2hpZnRlZCAxMgotICAgNSAgdGhpcmQgd29yZCwgc2hpZnRlZCA2Ci0gICA2ICB0aGlyZCB3b3JkLCBzaGlmdGVkIDAKLSAgIDcgIHNlY29uZCB3b3JkLCBzaGlmdGVkIDcKLSAgIDggIHNlY29uZCB3b3JkLCBzaGlmdGVkIDEwCi0gICA5ICBzZWNvbmQgd29yZCwgc2hpZnRlZCA1Ci0gICBEICBzdG9yZSBpbiBib3RoIHBsYWNlIDEgYW5kIHBsYWNlIDM7IGZvciBkaXZ1bCBhbmQgZGl2c2wuCi0gICBCICBmaXJzdCB3b3JkLCBsb3cgYnl0ZSwgZm9yIGJyYW5jaCBkaXNwbGFjZW1lbnRzCi0gICBXICBzZWNvbmQgd29yZCAoZW50aXJlKSwgZm9yIGJyYW5jaCBkaXNwbGFjZW1lbnRzCi0gICBMICBzZWNvbmQgYW5kIHRoaXJkIHdvcmRzIChlbnRpcmUpLCBmb3IgYnJhbmNoIGRpc3BsYWNlbWVudHMKLSAgICAgIChhbHNvIG92ZXJsb2FkZWQgZm9yIG1vdmUxNikKLSAgIGIgIHNlY29uZCB3b3JkLCBsb3cgYnl0ZQotICAgdyAgc2Vjb25kIHdvcmQgKGVudGlyZSkgW3ZhcmlhYmxlIHdvcmQvbG9uZyBicmFuY2ggb2Zmc2V0IGZvciBkYnJhXQotICAgVyAgc2Vjb25kIHdvcmQgKGVudGlyZSkgKG11c3QgYmUgc2lnbmVkIDE2IGJpdCB2YWx1ZSkKLSAgIGwgIHNlY29uZCBhbmQgdGhpcmQgd29yZCAoZW50aXJlKQotICAgZyAgdmFyaWFibGUgYnJhbmNoIG9mZnNldCBmb3IgYnJhIGFuZCBzaW1pbGFyIGluc3RydWN0aW9ucy4KLSAgICAgIFRoZSBwbGFjZSB0byBzdG9yZSBkZXBlbmRzIG9uIHRoZSBtYWduaXR1ZGUgb2Ygb2Zmc2V0LgotICAgdCAgc3RvcmUgaW4gYm90aCBwbGFjZSA3IGFuZCBwbGFjZSA4OyBmb3IgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucwotICAgYyAgYnJhbmNoIG9mZnNldCBmb3IgY3BCY2Mgb3BlcmF0aW9ucy4KLSAgICAgIFRoZSBwbGFjZSB0byBzdG9yZSBpcyB3b3JkIHR3byBpZiBiaXQgc2l4IG9mIHdvcmQgb25lIGlzIHplcm8sCi0gICAgICBhbmQgd29yZHMgdHdvIGFuZCB0aHJlZSBpZiBiaXQgc2l4IG9mIHdvcmQgb25lIGlzIG9uZS4KLSAgIGkgIEluY3JlbWVudCBieSB0d28sIHRvIHNraXAgb3ZlciBjb3Byb2Nlc3NvciBleHRlbmRlZCBvcGVyYW5kcy4gICBPbmx5Ci0gICAgICB3b3JrcyB3aXRoIHRoZSAnSScgZm9ybWF0LgotICAgayAgRHluYW1pYyBLLWZhY3RvciBmaWVsZC4gICBCaXRzIDYtNCBvZiB3b3JkIDIsIHVzZWQgYXMgYSByZWdpc3RlciBudW1iZXIuCi0gICAgICBBbHNvIHVzZWQgZm9yIGR5bmFtaWMgZm1vdmVtIGluc3RydWN0aW9uLgotICAgQyAgZmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IgY29uc3RhbnQgLSA3IGJpdHMuICBBbHNvIHVzZWQgZm9yIHN0YXRpYwotICAgICAgSy1mYWN0b3JzLi4uCi0gICBqICBNb3ZlYyByZWdpc3RlciAjLCBzdG9yZWQgaW4gMTIgbG93IGJpdHMgb2Ygc2Vjb25kIHdvcmQuCi0KLSBQbGFjZXMgdG8gcHV0IG9wZXJhbmQsIGZvciBnZW5lcmFsIG9wZXJhbmRzOgotICAgZCAgZGVzdGluYXRpb24sIHNoaWZ0ZWQgNiBiaXRzIGluIGZpcnN0IHdvcmQKLSAgIGIgIHNvdXJjZSwgYXQgbG93IGJpdCBvZiBmaXJzdCB3b3JkLCBhbmQgaW1tZWRpYXRlIHVzZXMgb25lIGJ5dGUKLSAgIHcgIHNvdXJjZSwgYXQgbG93IGJpdCBvZiBmaXJzdCB3b3JkLCBhbmQgaW1tZWRpYXRlIHVzZXMgdHdvIGJ5dGVzCi0gICBsICBzb3VyY2UsIGF0IGxvdyBiaXQgb2YgZmlyc3Qgd29yZCwgYW5kIGltbWVkaWF0ZSB1c2VzIGZvdXIgYnl0ZXMKLSAgIHMgIHNvdXJjZSwgYXQgbG93IGJpdCBvZiBmaXJzdCB3b3JkLgotICAgICAgVXNlZCBzb21ldGltZXMgaW4gY29udGV4dHMgd2hlcmUgaW1tZWRpYXRlIGlzIG5vdCBhbGxvd2VkIGFueXdheS4KLSAgIGYgIHNpbmdsZSBwcmVjaXNpb24gZmxvYXQsIGxvdyBiaXQgb2YgMXN0IHdvcmQsIGltbWVkaWF0ZSB1c2VzIDQgYnl0ZXMKLSAgIEYgIGRvdWJsZSBwcmVjaXNpb24gZmxvYXQsIGxvdyBiaXQgb2YgMXN0IHdvcmQsIGltbWVkaWF0ZSB1c2VzIDggYnl0ZXMKLSAgIHggIGV4dGVuZGVkIHByZWNpc2lvbiBmbG9hdCwgbG93IGJpdCBvZiAxc3Qgd29yZCwgaW1tZWRpYXRlIHVzZXMgMTIgYnl0ZXMKLSAgIHAgIHBhY2tlZCBmbG9hdCwgbG93IGJpdCBvZiAxc3Qgd29yZCwgaW1tZWRpYXRlIHVzZXMgMTIgYnl0ZXMKLSovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgbTY4a19vcGNvZGVzW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlX2FsaWFzIG02OGtfb3Bjb2RlX2FsaWFzZXNbXTsKLQotZXh0ZXJuIGNvbnN0IGludCBtNjhrX251bW9wY29kZXMsIG02OGtfbnVtYWxpYXNlczsKLQotLyogZW5kIG9mIG02OGstb3Bjb2RlLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL204OGsuaCBiL2luY2x1ZGUvb3Bjb2RlL204OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3ZmEwMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9tODhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MjMgKzAsMCBAQAotLyogVGFibGUgb2Ygb3Bjb2RlcyBmb3IgdGhlIG1vdG9yb2xhIDg4ayBmYW1pbHkuCi0gICBDb3B5cmlnaHQgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCIGFuZCBHQVMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKgkJCURpc2Fzc2VtYmxlciBJbnN0cnVjdGlvbiBUYWJsZQotICoKLSAqCVRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgdGFibGUgaXMgdGhlIG9wY29kZSBmaWVsZC4gSWYgYW4gb3Bjb2RlCi0gKglpcyBzcGVjaWZpZWQgd2hpY2ggaGFzIGFueSBub24tb3Bjb2RlIGJpdHMgb24sIGEgc3lzdGVtIGVycm9yCi0gKgl3aWxsIG9jY3VyIHdoZW4gdGhlIHN5c3RlbSBhdHRlbXB0cyB0aGUgaW5zdGFsbCBpdCBpbnRvIHRoZQotICoJaW5zdHJ1Y3Rpb24gdGFibGUuICBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlCi0gKglpbnN0cnVjdGlvbiBtbmVtb25pYy4gRWFjaCBvcGVyYW5kIGlzIHNwZWNpZmllZCBieSBvZmZzZXQsIHdpZHRoLAotICoJYW5kIHR5cGUuIFRoZSBvZmZzZXQgaXMgdGhlIGJpdCBudW1iZXIgb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50Ci0gKgliaXQgb2YgdGhlIG9wZXJhbmQgd2l0aCBiaXQgMCBiZWluZyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mCi0gKgl0aGUgaW5zdHJ1Y3Rpb24uIFRoZSB3aWR0aCBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCB0byBzcGVjaWZ5Ci0gKgl0aGUgb3BlcmFuZC4gVGhlIHR5cGUgc3BlY2lmaWVzIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGJlIHVzZWQgZm9yCi0gKgl0aGUgb3BlcmFuZC4gVGhlIHZhbGlkIGZvcm1hdHMgYXJlOiByZWdpc3RlciwgcmVnaXN0ZXIgaW5kaXJlY3QsCi0gKgloZXggY29uc3RhbnQsIGFuZCBiaXQgZmllbGQgc3BlY2lmaWNhdGlvbi4gIFRoZSBsYXN0IGZpZWxkIGlzIGEKLSAqCXBvaW50ZXIgdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaW4gdGhlIGxpbmtlZCBsaXN0LiAgVGhlc2UgcG9pbnRlcnMKLSAqCWFyZSBpbml0aWFsaXplZCBieSBpbml0X2Rpc2FzbSgpLgotICoKLSAqCQkJCVN0cnVjdHVyZSBGb3JtYXQKLSAqCi0gKiAgICAgICBzdHJ1Y3QgSU5TVEFCIHsKLSAqICAgICAgICAgIFVQSU5UIG9wY29kZTsKLSAqICAgICAgICAgIGNoYXIgKm1uZW1vbmljOwotICogICAgICAgICAgc3RydWN0IE9QU1BFQyBvcDEsb3AyLG9wMzsKLSAqICAgICAgICAgIHN0cnVjdCBTSU1fRkxBR1MgZmxnczsKLSAqICAgICAgICAgIHN0cnVjdCBJTlNUQUIgKm5leHQ7Ci0gKiAgICAgICB9Ci0gKgotICogICAgICAgc3RydWN0IE9QU1BFQyB7Ci0gKiAgICAgICAgICBVUElOVCBvZmZzZXQ6NTsKLSAqICAgICAgICAgIFVQSU5UIHdpZHRoOjY7Ci0gKiAgICAgICAgICBVUElOVCB0eXBlOjU7Ci0gKiAgICAgICB9Ci0gKgotICoJCQkJUmV2aXNpb24gSGlzdG9yeQotICoKLSAqCVJldmlzaW9uIDEuMAkxMS8wOC84NQlDcmVhdGlvbiBkYXRlCi0gKgkJIDEuMQkwMi8wNS84NglVcGRhdGVkIGluc3RydWN0aW9uIG1uZW1vbmljIHRhYmxlIE1ECi0gKgkJIDEuMgkwNi8xNi84NglVcGRhdGVkIFNJTV9GTEFHUyBmb3IgZmxvYXRpbmcgcG9pbnQKLSAqCQkgMS4zCTA5LzIwLzg2CVVwZGF0ZWQgZm9yIG5ldyBlbmNvZGluZwotICoJCSAJMDUvMTEvODkJUi4gVHJhd2ljayBhZGFwdGVkIGZyb20gTW90b3JvbGEgZGlzYXNzZW1ibGVyCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLQotLyoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzIG5lZWRlZCB0byBidWlsZCB0aGUgTTg4MDAwCi0gKiBzaW11bGF0b3IuICBJdCBpcyB0aGUgbWFpbiBpbmNsdWRlIGZpbGUsIGNvbnRhaW5pbmcgYWxsIHRoZQotICogc3RydWN0dXJlcywgbWFjcm9zIGFuZCBkZWZpbml0aW9ucyBleGNlcHQgZm9yIHRoZSBmbG9hdGluZyBwb2ludAotICogaW5zdHJ1Y3Rpb24gc2V0LgotICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGZsYWcgaW5mb3JtcyB0aGUgU2ltdWxhdG9yIGFzIHRvIHdoYXQgdHlwZSBvZiBieXRlIG9yZGVyaW5nCi0gKiB3aWxsIGJlIHVzZWQuIEZvciBpbnN0YW5jZSwgYSBCT0ZMQUcgPSAxIGluZGljYXRlcyBhIERFQyBWQVggYW5kIElCTSB0eXBlCi0gKiBvZiBvcmRlcmluZyBzaGFsbCBiZSB1c2VkLgotKi8KLQotLyogIyBkZWZpbmUgICAgIEJPRkxBRyAgIDEgKi8gICAgICAgICAgICAgICAgICAgICAgIC8qIEJZVEUgT1JERVJJTkcgRkxBRyAqLwotCi0vKiBkZWZpbmUgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBwcmltYXJ5IG9wY29kZSBmaWVsZCBvZiB0aGUgaW5zdHJ1Y3Rpb24sCi0gKiB0aGUgZGVzdGluYXRpb24gZmllbGQsIHRoZSBzb3VyY2UgMSBhbmQgc291cmNlIDIgZmllbGRzLgotICovCi0jIGRlZmluZSAgICBPUCAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBvcGNvZGUgZmllbGQgKi8KLSMgZGVmaW5lICAgIERFU1QgICAgIDYgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIGRlc3RpbmF0aW9uICAqLwotIyBkZWZpbmUgICAgU09VUkNFMSAgNiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2Ygc291cmNlMSAgICAgICovCi0jIGRlZmluZSAgICBTT1VSQ0UyICA2ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBzb3VyY2UyICAgICAgKi8KLQotIyBkZWZpbmUgICAgUkVHcyAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiByZWdpc3RlcnMgICovCi0KLSMgZGVmaW5lICAgIFdPUkQgICAgbG9uZwotIyBkZWZpbmUgICAgRkxBRyAgICB1bnNpZ25lZAotIyBkZWZpbmUgICAgU1RBVEUgICBzaG9ydAotCi0jIGRlZmluZSAgICBUUlVFICAgICAxCi0jIGRlZmluZSAgICBGQUxTRSAgICAwCi0KLSMgZGVmaW5lICAgIFJFQUQgICAgIDAKLSMgZGVmaW5lICAgIFdSSVRFICAgIDEKLQotLyogVGhlIG5leHQgZm91ciBlcXVhdGVzIGRlZmluZSB0aGUgcHJpb3JpdGllcyB0aGF0IHRoZSB2YXJpb3VzIGNsYXNzZXMKLSAqIG9mIGluc3RydWN0aW9ucyBoYXZlIHJlZ2FyZGluZyB3cml0aW5nIHJlc3VsdHMgYmFjayBpbnRvIHJlZ2lzdGVycyBhbmQKLSAqIHNpZ25hbGxpbmcgZXhjZXB0aW9ucy4KLSAqLwotLyogUE1FTSBpcyBhbHNvIGRlZmluZWQgaW4gPHN5cy9wYXJhbS5oPiBvbiBEZWx0YSA4OCdzLiAgU2lnaCEgICovCi0jdW5kZWYgUE1FTQotCi0jIGRlZmluZSAgICBQSU5UICAwICAgLyogSW50ZWdlciBQcmlvcml0eSAqLwotIyBkZWZpbmUgICAgUEZMVCAgMSAgIC8qIEZsb2F0aW5nIFBvaW50IFByaW9yaXR5ICovCi0jIGRlZmluZSAgICBQTUVNICAyICAgLyogTWVtb3J5IFByaW9yaXR5ICovCi0jIGRlZmluZSAgICBOQSAgICAzICAgLyogTm90IEFwcGxpY2FibGUsIGluc3RydWN0aW9uIGRvZXNudCB3cml0ZSB0byByZWdzICovCi0jIGRlZmluZSAgICBISVBSSSAzICAgLyogaGlnaGVzdCBvZiB0aGVzZSBwcmlvcml0aWVzICovCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiByZWdpc3RlcnMgYXJlIGFuIGFydGlmaWNpYWwgbWVjaGFuaXNtIHRvIHNwZWVkIHVwCi0gKiBzaW11bGF0b3IgZXhlY3V0aW9uLiAgSW4gdGhlIHJlYWwgcHJvY2Vzc29yLCBhbiBpbnN0cnVjdGlvbiByZWdpc3RlcgotICogaXMgMzIgYml0cyB3aWRlLiAgSW4gdGhlIHNpbXVsYXRvciwgdGhlIDMyIGJpdCBpbnN0cnVjdGlvbiBpcyBrZXB0IGluCi0gKiBhIHN0cnVjdHVyZSBmaWVsZCBjYWxsZWQgcmF3b3AsIGFuZCB0aGUgaW5zdHJ1Y3Rpb24gaXMgcGFydGlhbGx5IGRlY29kZWQsCi0gKiBhbmQgc3BsaXQgaW50byB2YXJpb3VzIGZpZWxkcyBhbmQgZmxhZ3Mgd2hpY2ggbWFrZSB1cCB0aGUgb3RoZXIgZmllbGRzCi0gKiBvZiB0aGUgc3RydWN0dXJlLgotICogVGhlIHBhcnRpYWwgZGVjb2RlIGlzIGRvbmUgd2hlbiB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBpbml0aWFsbHkgbG9hZGVkCi0gKiBpbnRvIHNpbXVsYXRvciBtZW1vcnkuICBUaGUgc2ltdWxhdG9yIGNvZGUgbWVtb3J5IGlzIG5vdCBhbiBhcnJheSBvZgotICogMzIgYml0IHdvcmRzLCBidXQgaXMgYW4gYXJyYXkgb2YgaW5zdHJ1Y3Rpb24gcmVnaXN0ZXIgc3RydWN0dXJlcy4KLSAqIFllcyB0aGlzIHdhc3RlcyBtZW1vcnksIGJ1dCBpdCBleGVjdXRlcyBtdWNoIHF1aWNrZXIuCi0gKi8KLQotc3RydWN0IElSX0ZJRUxEUyB7Ci0JCSAgICB1bnNpZ25lZCAgICAgICAgb3A6T1AsCi0JCQkJICAgIGRlc3Q6IERFU1QsCi0JCQkJICAgIHNyYzE6IFNPVVJDRTEsCi0JCQkJICAgIHNyYzI6IFNPVVJDRTI7Ci0JCQkgICAgICBpbnQgICBsdG5jeSwKLQkJCQkgICAgZXh0aW1lLAotCQkJCSAgICB3Yl9wcmk7ICAgICAvKiB3cml0ZWJhY2sgcHJpb3JpdHkgICAgICovCi0JCSAgICB1bnNpZ25lZCAgICAgICAgaW1tX2ZsYWdzOjIsLyogaW1tZWRpYXRlIHNpemUgICAgICAgICAqLwotCQkJCSAgICByczFfdXNlZDoxLCAvKiByZWdpc3RlciBzb3VyY2UgMSB1c2VkICovCi0JCQkJICAgIHJzMl91c2VkOjEsIC8qIHJlZ2lzdGVyIHNvdXJjZSAyIHVzZWQgKi8KLQkJCQkgICAgcnNkX3VzZWQ6MSwgLyogcmVnaXN0ZXIgc291cmNlL2Rlc3QuIHVzZWQgKi8KLQkJCQkgICAgY19mbGFnOjEsICAgLyogY29tcGxlbWVudCAgICAgICovCi0JCQkJICAgIHVfZmxhZzoxLCAgIC8qIHVwcGVyIGhhbGYgd29yZCAqLwotCQkJCSAgICBuX2ZsYWc6MSwgICAvKiBleGVjdXRlIG5leHQgICAgKi8KLQkJCQkgICAgd2JfZmxhZzoxLCAgLyogdXNlcyB3cml0ZWJhY2sgc2xvdCAqLwotCQkJCSAgICBkZXN0XzY0OjEsICAvKiBkZXN0IHNpemUgICAgICAgKi8KLQkJCQkgICAgczFfNjQ6MSwgICAgLyogc291cmNlIDEgc2l6ZSAgICovCi0JCQkJICAgIHMyXzY0OjEsICAgIC8qIHNvdXJjZSAyIHNpemUgICAqLwotCQkJCSAgICBzY2FsZV9mbGFnOjEsIC8qIHNjYWxlZCByZWdpc3RlciAqLwotCQkJCSAgICBicmtfZmxnOjE7Ci0gICAgICAgICAgICAgICAgIH07Ci0KLXN0cnVjdAltZW1fc2VncyB7Ci0Jc3RydWN0IG1lbV93cmQgKnNlZzsJCQkvKiBwb2ludGVyIChyZXR1cm5lZCBieSBjYWxsb2MpIHRvIHNlZ21lbnQgKi8KLQl1bnNpZ25lZCBsb25nIGJhc2VhZGRyOwkJCS8qIGJhc2UgbG9hZCBhZGRyZXNzIGZyb20gZmlsZSBoZWFkZXJzICovCi0JdW5zaWduZWQgbG9uZyBlbmRhZGRyOwkJCS8qIEVuZGluZyBhZGRyZXNzIG9mIHNlZ21lbnQgKi8KLQlpbnQJICAgICAgZmxhZ3M7CQkJLyogc2VnbWVudCBjb250cm9sIGZsYWdzIChub25lIGRlZmluZWQgMTIvNS84NikgKi8KLX07Ci0KLSNkZWZpbmUJTUFYU0VHUwkJKDEwKQkJCS8qIG1heCBudW1iZXIgb2Ygc2VnbWVudCBhbGxvd2VkICovCi0jZGVmaW5lCU1FTVNFR1NJWkUJKHNpemVvZihzdHJ1Y3QgbWVtX3NlZ3MpKS8qIHNpemUgb2YgbWVtX3NlZ3Mgc3RydWN0dXJlICovCi0KLQotI2RlZmluZSBCUktfUkQJCSgweDAxKQkJCS8qIGJyZWFrIG9uIG1lbW9yeSByZWFkICovCi0jZGVmaW5lIEJSS19XUgkJKDB4MDIpCQkJLyogYnJlYWsgb24gbWVtb3J5IHdyaXRlICovCi0jZGVmaW5lIEJSS19FWEVDCSgweDA0KQkJCS8qIGJyZWFrIG9uIGV4ZWN1dGlvbiAqLwotI2RlZmluZQlCUktfQ05UCQkoMHgwOCkJCQkvKiBicmVhayBvbiB0ZXJtaW5hbCBjb3VudCAqLwotCi0KLXN0cnVjdAltZW1fd3JkIHsKLQlzdHJ1Y3QgSVJfRklFTERTIG9wY29kZTsJCS8qIHNpbXVsYXRvciBpbnN0cnVjdGlvbiBicmVhayBkb3duICovCi0JdW5pb24gewotCQl1bnNpZ25lZCBsb25nICBsOwkJLyogbWVtb3J5IGVsZW1lbnQgYnJlYWsgZG93biAqLwotCQl1bnNpZ25lZCBzaG9ydCBzWzJdOwotCQl1bnNpZ25lZCBjaGFyICBjWzRdOwotCX0gbWVtOwotfTsKLQotI2RlZmluZQlNRU1XUkRTSVpFCShzaXplb2Yoc3RydWN0IG1lbV93cmQpKQkvKiBzaXplIG9mIGVhY2ggMzIgYml0IG1lbW9yeSBtb2RlbCAqLwotCi0vKiBFeHRlcm5hbCBkZWNsYXJhdGlvbnMgKi8KLQotZXh0ZXJuCXN0cnVjdCBtZW1fc2VncyBtZW1vcnlbXTsKLWV4dGVybglzdHJ1Y3QgUFJPQ0VTU09SIG03ODAwMDsKLQotc3RydWN0ICBQUk9DRVNTT1IgICB7Ci0JICAgICB1bnNpZ25lZCBXT1JECi0JCQkgICAgaXAsICAgICAgICAgIC8qIGV4ZWN1dGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciAqLwotCQkJICAgIHZiciwgICAgICAgICAvKiB2ZWN0b3IgYmFzZSByZWdpc3RlciAqLwotCQkJICAgIHBzcjsgICAgICAgICAvKiBwcm9jZXNzb3Igc3RhdHVzIHJlZ2lzdGVyICovCi0KLQkJICAgIFdPUkQgICAgUzFidXMsIC8qIHNvdXJjZSAxICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUzJidXMsIC8qIHNvdXJjZSAyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGJ1cywgIC8qIGRlc3RpbmF0aW9uICovCi0JCQkgICAgREFidXMsIC8qIGRhdGEgYWRkcmVzcyBidXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFUsCi0JCQkgICAgUmVnc1tSRUdzXSwgICAgICAgLyogZGF0YSByZWdpc3RlcnMgKi8KLQkJCSAgICB0aW1lX2xlZnRbUkVHc10sICAvKiBtYXggY2xvY2tzIGJlZm9yZSByZWcgaXMgYXZhaWxhYmxlICovCi0JCQkgICAgd2JfcHJpW1JFR3NdLCAgICAgLyogd3JpdGViYWNrIHByaW9yaXR5IG9mIHJlZyAqLwotCQkJICAgIFNGVTBfcmVnc1tSRUdzXSwgIC8qIGludGVnZXIgdW5pdCBjb250cm9sIHJlZ3MgKi8KLQkJCSAgICBTRlUxX3JlZ3NbUkVHc10sICAvKiBmbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ3MgKi8KLQkJCSAgICBTY29yZWJvYXJkW1JFR3NdLAotCQkJICAgIFZicjsKLQkgICAgdW5zaWduZWQgV09SRCAgIHNjb3JlYm9hcmQsCi0JCQkgICAgUHN3LAotCQkJICAgIFRwc3c7Ci0JCSAgICBGTEFHICAganVtcF9wZW5kaW5nOjE7ICAgLyogd2FpdGluZyBmb3IgYSBqdW1wIGluc3RyLiAqLwotICAgICAgICAgICAgICAgICAgICB9OwotCi0jIGRlZmluZSAgICBpMjZiaXQgICAgICAxICAgIC8qIHNpemUgb2YgaW1tZWRpYXRlIGZpZWxkICovCi0jIGRlZmluZSAgICBpMTZiaXQgICAgICAyCi0jIGRlZmluZSAgICBpMTBiaXQgICAgICAzCi0KLS8qIERlZmluaXRpb25zIGZvciBmaWVsZHMgaW4gcHNyICovCi0KLSMgZGVmaW5lIG1vZGUgIDMxCi0jIGRlZmluZSByYm8gICAzMAotIyBkZWZpbmUgc2VyICAgMjkKLSMgZGVmaW5lIGNhcnJ5IDI4Ci0jIGRlZmluZSBzZjdtICAxMQotIyBkZWZpbmUgc2Y2bSAgMTAKLSMgZGVmaW5lIHNmNW0gICA5Ci0jIGRlZmluZSBzZjRtICAgOAotIyBkZWZpbmUgc2YzbSAgIDcKLSMgZGVmaW5lIHNmMm0gICA2Ci0jIGRlZmluZSBzZjFtICAgNQotIyBkZWZpbmUgbWFtICAgIDQKLSMgZGVmaW5lIGlubSAgICAzCi0jIGRlZmluZSBleG0gICAgMgotIyBkZWZpbmUgdHJtICAgIDEKLSMgZGVmaW5lIG92Zm0gICAwCi0KLSNkZWZpbmUJICAgIE1PREVNQVNLICAgKDE8PChtb2RlLTEpKQotIyBkZWZpbmUgICAgU0lMRU5UICAgICAwICAgLyogc2ltdWxhdGUgd2l0aG91dCBvdXRwdXQgdG8gY3J0ICovCi0jIGRlZmluZSAgICBWRVJCT1NFICAgIDEgICAvKiBzaW11bGF0ZSBpbiB2ZXJib3NlIG1vZGUgKi8KLSMgZGVmaW5lICAgIFBSX0lOU1RSICAgMiAgIC8qIG9ubHkgcHJpbnQgaW5zdHJ1Y3Rpb25zICovCi0KLSMgZGVmaW5lICAgIFJFU0VUICAgICAgMTYgLyogcmVzZXQgcGhhc2UgKi8KLQotIyBkZWZpbmUgICAgUEhBU0UxICAgICAwICAvKiBkYXRhIHBhdGggcGhhc2VzICovCi0jIGRlZmluZSAgICBQSEFTRTIgICAgIDEKLQotLyogdGhlIDEgY2xvY2sgb3BlcmF0aW9ucyAqLwotCi0jIGRlZmluZSAgICBBRERVICAgICAgICAxCi0jIGRlZmluZSAgICBBRERDICAgICAgICAyCi0jIGRlZmluZSAgICBBRERVQyAgICAgICAzCi0jIGRlZmluZSAgICBBREQgICAgICAgICA0Ci0KLSMgZGVmaW5lICAgIFNVQlUgICAgQUREKzEKLSMgZGVmaW5lICAgIFNVQkIgICAgQUREKzIKLSMgZGVmaW5lICAgIFNVQlVCICAgQUREKzMKLSMgZGVmaW5lICAgIFNVQiAgICAgQUREKzQKLQotIyBkZWZpbmUgICAgQU5EXyAgICBBREQrNQotIyBkZWZpbmUgICAgT1IgICAgICBBREQrNgotIyBkZWZpbmUgICAgWE9SICAgICBBREQrNwotIyBkZWZpbmUgICAgQ01QICAgICBBREQrOAotCi0vKiB0aGUgTE9BRFMgKi8KLQotIyBkZWZpbmUgICAgTERBQiAgICBDTVArMQotIyBkZWZpbmUgICAgTERBSCAgICBDTVArMgotIyBkZWZpbmUgICAgTERBICAgICBDTVArMwotIyBkZWZpbmUgICAgTERBRCAgICBDTVArNAotCi0jIGRlZmluZSAgICBMREIgICBMREFEKzEKLSMgZGVmaW5lICAgIExESCAgIExEQUQrMgotIyBkZWZpbmUgICAgTEQgICAgTERBRCszCi0jIGRlZmluZSAgICBMREQgICBMREFEKzQKLSMgZGVmaW5lICAgIExEQlUgIExEQUQrNQotIyBkZWZpbmUgICAgTERIVSAgTERBRCs2Ci0KLS8qIHRoZSBTVE9SRVMgKi8KLQotIyBkZWZpbmUgICAgU1RCICAgIExESFUrMQotIyBkZWZpbmUgICAgU1RIICAgIExESFUrMgotIyBkZWZpbmUgICAgU1QgICAgIExESFUrMwotIyBkZWZpbmUgICAgU1REICAgIExESFUrNAotCi0vKiB0aGUgZXhjaGFuZ2UgKi8KLQotIyBkZWZpbmUgICAgWE1FTUJVIExESFUrNQotIyBkZWZpbmUgICAgWE1FTSAgIExESFUrNgotCi0vKiB0aGUgYnJhbmNoZXMgKi8KLSMgZGVmaW5lICAgIEpTUiAgICBTVEQrMQotIyBkZWZpbmUgICAgQlNSICAgIFNURCsyCi0jIGRlZmluZSAgICBCUiAgICAgU1REKzMKLSMgZGVmaW5lICAgIEpNUCAgICBTVEQrNAotIyBkZWZpbmUgICAgQkIxICAgIFNURCs1Ci0jIGRlZmluZSAgICBCQjAgICAgU1REKzYKLSMgZGVmaW5lICAgIFJUTiAgICBTVEQrNwotIyBkZWZpbmUgICAgQkNORCAgIFNURCs4Ci0KLS8qIHRoZSBUUkFQUyAqLwotIyBkZWZpbmUgICAgVEIxICAgIEJDTkQrMQotIyBkZWZpbmUgICAgVEIwICAgIEJDTkQrMgotIyBkZWZpbmUgICAgVENORCAgIEJDTkQrMwotIyBkZWZpbmUgICAgUlRFICAgIEJDTkQrNAotIyBkZWZpbmUgICAgVEJORCAgIEJDTkQrNQotCi0vKiB0aGUgTUlTQyBpbnN0cnVjdGlvbnMgKi8KLSMgZGVmaW5lICAgIE1VTCAgICAgVEJORCArIDEKLSMgZGVmaW5lICAgIERJViAgICAgTVVMICArMgotIyBkZWZpbmUgICAgRElWVSAgICBNVUwgICszCi0jIGRlZmluZSAgICBNQVNLICAgIE1VTCAgKzQKLSMgZGVmaW5lICAgIEZGMCAgICAgTVVMICArNQotIyBkZWZpbmUgICAgRkYxICAgICBNVUwgICs2Ci0jIGRlZmluZSAgICBDTFIgICAgIE1VTCAgKzcKLSMgZGVmaW5lICAgIFNFVCAgICAgTVVMICArOAotIyBkZWZpbmUgICAgRVhUICAgICBNVUwgICs5Ci0jIGRlZmluZSAgICBFWFRVICAgIE1VTCAgKzEwCi0jIGRlZmluZSAgICBNQUsgICAgIE1VTCAgKzExCi0jIGRlZmluZSAgICBST1QgICAgIE1VTCAgKzEyCi0KLS8qIGNvbnRyb2wgcmVnaXN0ZXIgbWFuaXB1bGF0aW9ucyAqLwotCi0jIGRlZmluZSAgICBMRENSICAgIFJPVCAgKzEKLSMgZGVmaW5lICAgIFNUQ1IgICAgUk9UICArMgotIyBkZWZpbmUgICAgWENSICAgICBST1QgICszCi0KLSMgZGVmaW5lICAgIEZMRENSICAgIFJPVCAgKzQKLSMgZGVmaW5lICAgIEZTVENSICAgIFJPVCAgKzUKLSMgZGVmaW5lICAgIEZYQ1IgICAgIFJPVCAgKzYKLQotCi0jIGRlZmluZSAgICBOT1AgICAgIFhDUiArMQotCi0vKiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgKi8KLQotIyBkZWZpbmUgICAgRkFERCAgICBOT1AgKzEKLSMgZGVmaW5lICAgIEZTVUIgICAgTk9QICsyCi0jIGRlZmluZSAgICBGTVVMICAgIE5PUCArMwotIyBkZWZpbmUgICAgRkRJViAgICBOT1AgKzQKLSMgZGVmaW5lICAgIEZTUVJUICAgTk9QICs1Ci0jIGRlZmluZSAgICBGQ01QICAgIE5PUCArNgotIyBkZWZpbmUgICAgRklQICAgICBOT1AgKzcKLSMgZGVmaW5lICAgIEZMVCAgICAgTk9QICs4Ci0jIGRlZmluZSAgICBJTlQgICAgIE5PUCArOQotIyBkZWZpbmUgICAgTklOVCAgICBOT1AgKzEwCi0jIGRlZmluZSAgICBUUk5DICAgIE5PUCArMTEKLSMgZGVmaW5lICAgIEZMREMgICBOT1AgKzEyCi0jIGRlZmluZSAgICBGU1RDICAgTk9QICsxMwotIyBkZWZpbmUgICAgRlhDICAgIE5PUCArMTQKLQotIyBkZWZpbmUgVUVYVChzcmMsb2ZmLHdpZCkgKCgoKHVuc2lnbmVkIGludCkoc3JjKSk+PihvZmYpKSAmICgoMTw8KHdpZCkpIC0gMSkpCi0jIGRlZmluZSBTRVhUKHNyYyxvZmYsd2lkKSAoKCgoKGludCkoc3JjKSk8PCgzMi0oKG9mZikrKHdpZCkpKSkgPj4oMzItKHdpZCkpKSApCi0jIGRlZmluZSBNQUtFKHNyYyxvZmYsd2lkKSBcCi0gICgoKCh1bnNpZ25lZCBpbnQpKHNyYykpICYgKCgxPDwod2lkKSkgLSAxKSkgPDwgKG9mZikpCi0KLSMgZGVmaW5lIG9wd29yZChuKSAodW5zaWduZWQgbG9uZykgKG1lbWFkZHItPm1lbS5sKQotCi0vKiAgQ29uc3RhbnRzIGFuZCBNYXNrcyAqLwotCi0jZGVmaW5lIFNGVTAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBTRlUxICAgICAgIDB4ODQwMDAwMDAKLSNkZWZpbmUgU0ZVNyAgICAgICAweDljMDAwMDAwCi0jZGVmaW5lIFJSSTEwICAgICAgMHhmMDAwMDAwMAotI2RlZmluZSBSUlIgICAgICAgIDB4ZjQwMDAwMDAKLSNkZWZpbmUgU0ZVTUFTSyAgICAweGZjMDBmZmUwCi0jZGVmaW5lIFJSUk1BU0sgICAgMHhmYzAwZmZlMAotI2RlZmluZSBSUkkxME1BU0sgIDB4ZmMwMGZjMDAKLSNkZWZpbmUgREVGTUFTSyAgICAweGZjMDAwMDAwCi0jZGVmaW5lIENUUkwgICAgICAgMHgwMDAwZjAwMAotI2RlZmluZSBDVFJMTUFTSyAgIDB4ZmMwMGY4MDAKLQotLyogT3BlcmFuZHMgdHlwZXMgKi8KLQotZW51bSBvcGVyYW5kX3R5cGUgewotICBIRVggPSAxLAotICBSRUcgPSAyLAotICBDT05UID0gMywKLSAgSU5EID0gMywKLSAgQkYgPSA0LAotICBSRUdTQyA9IDUgICAgLyogc2NhbGVkIHJlZ2lzdGVyICovLAotICBDUlJFRyA9IDYgICAgLyogY29udHJvbCByZWdpc3RlciAqLywKLSAgRkNSUkVHID0gNyAgICAvKiBmbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVyICovLAotICBQQ1JFTCA9IDgsCi0gIENPTkRNQVNLID0gOSwKLSAgWFJFRyA9IDEwLCAvKiBleHRlbmRlZCByZWdpc3RlciAqLwotICBERUMgPSAxMSwgLyogZGVjaW1hbCAqLwotfTsKLQotLyogSGFzaGluZyBTcGVjaWZpY2F0aW9uICovCi0KLSNkZWZpbmUgSEFTSFZBTCAgICAgNzkKLQotLyogVHlwZSBkZWZpbml0aW9ucyAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UOwotCi0vKiBTdHJ1Y3R1cmUgdGVtcGxhdGVzICovCi0KLSNpZiBuZXZlcgotdHlwZWRlZiBzdHJ1Y3QgewotICAgdW5zaWduZWQgaW50IG9mZnNldDo1OwotICAgdW5zaWduZWQgaW50IHdpZHRoOjY7Ci0gICB1bnNpZ25lZCBpbnQgdHlwZTo1OwotfSBPUFNQRUM7Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgdW5zaWduZWQgaW50IG9mZnNldDsKLSAgIHVuc2lnbmVkIGludCB3aWR0aDsKLSAgIGVudW0gb3BlcmFuZF90eXBlIHR5cGU7Ci19IE9QU1BFQzsKLQotCXN0cnVjdCBTSU1fRkxBR1MgewotCSAgICAgIGludCAgbHRuY3ksICAgLyogbGF0ZW5jeSAobWF4IG51bWJlciBvZiBjbG9ja3MgbmVlZGVkIHRvIGV4ZWN1dGUpICovCi0JCSAgZXh0aW1lLCAgIC8qIGV4ZWN1dGlvbiB0aW1lIChtaW4gbnVtYmVyIG9mIGNsb2NrcyBuZWVkZWQgdG8gZXhlY3V0ZSkgKi8KLQkJICB3Yl9wcmk7ICAgLyogd3JpdGViYWNrIHNsb3QgcHJpb3JpdHkgKi8KLSAgIHVuc2lnbmVkICAgICAgICAgb3A6T1AsICAgLyogc2ltdWxhdG9yIHZlcnNpb24gb2Ygb3Bjb2RlICovCi0JICAgICBpbW1fZmxhZ3M6MiwgICAvKiAxMCwxNiBvciAyNiBiaXQgaW1tZWRpYXRlIGZsYWdzICovCi0JICAgICAgcnMxX3VzZWQ6MSwgICAvKiByZWdpc3RlciBzb3VyY2UgMSB1c2VkICovCi0JICAgICAgcnMyX3VzZWQ6MSwgICAvKiByZWdpc3RlciBzb3VyY2UgMiB1c2VkICovCi0JICAgICAgcnNkX3VzZWQ6MSwgICAvKiByZWdpc3RlciBzb3VyY2UvZGVzdCB1c2VkICovCi0JCWNfZmxhZzoxLCAgIC8qIGNvbXBsZW1lbnQgKi8KLQkJdV9mbGFnOjEsICAgLyogdXBwZXIgaGFsZiB3b3JkICovCi0JCW5fZmxhZzoxLCAgIC8qIGV4ZWN1dGUgbmV4dCAqLwotCSAgICAgICB3Yl9mbGFnOjEsICAgLyogdXNlcyB3cml0ZWJhY2sgc2xvdCAqLwotCSAgICAgICBkZXN0XzY0OjEsICAgLyogZG91YmxlIHByZWNpc2lvbiBkZXN0ICovCi0JCSBzMV82NDoxLCAgIC8qIGRvdWJsZSBwcmVjaXNpb24gc291cmNlIDEgKi8KLQkJIHMyXzY0OjEsICAgLyogZG91YmxlIHByZWNpc2lvbiBzb3VyY2UgMiAqLwotCSAgICBzY2FsZV9mbGFnOjE7ICAgLyogcmVnaXN0ZXIgaXMgc2NhbGVkICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBJTlNUUlVDVEFCIHsKLSAgIHVuc2lnbmVkIGludCAgb3Bjb2RlOwotICAgY2hhciAgICAgICAgICAqbW5lbW9uaWM7Ci0gICBPUFNQRUMgICAgICAgIG9wMSxvcDIsb3AzOwotICAgc3RydWN0IFNJTV9GTEFHUyBmbGdzOwotICAgc3RydWN0IElOU1RSVUNUQUIgICAgKm5leHQ7Ci19IElOU1RBQjsKLQwKLQotI2RlZmluZSBOT19PUEVSQU5EIHswLDAsMH0KLQotLyogT3Bjb2RlICAgICBNbmVtb25pYyAgICAgICBPcCAxIFNwZWMgICAgIE9wIDIgU3BlYyAgICBPcCAzIFNwZWMgICAgICAgICBTaW1mbGFncyAgICAgICAgICAgICBOZXh0ICAqLwotCi1zdGF0aWMgSU5TVEFCICBpbnN0cnVjdGlvbnNbXSA9IHsKLSAgezB4ZjQwMGM4MDAsImpzciAgICAgICAgICIsezAsNSxSRUd9ICAgLE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxKU1IgLCAgICAgICAgICAwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMGNjMDAsImpzci5uICAgICAgICIsezAsNSxSRUd9ICAgLE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezEsMSxOQSxKU1IgLCAgICAgICAgICAwLDAsMSwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMGMwMDAsImptcCAgICAgICAgICIsezAsNSxSRUd9ICAgLE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxKTVAgLCAgICAgICAgICAwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMGM0MDAsImptcC5uICAgICAgICIsezAsNSxSRUd9ICAgLE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezEsMSxOQSxKTVAgLCAgICAgICAgICAwLDAsMSwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4YzgwMDAwMDAsImJzciAgICAgICAgICIsezAsMjYsUENSRUx9LE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxCU1IgLCAgICAgaTI2Yml0LDAsMCwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4Y2MwMDAwMDAsImJzci5uICAgICAgICIsezAsMjYsUENSRUx9LE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezEsMSxOQSxCU1IgLCAgICAgaTI2Yml0LDAsMCwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4YzAwMDAwMDAsImJyICAgICAgICAgICIsezAsMjYsUENSRUx9LE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxCUiAgLCAgICAgaTI2Yml0LDAsMCwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4YzQwMDAwMDAsImJyLm4gICAgICAgICIsezAsMjYsUENSRUx9LE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezEsMSxOQSxCUiAgLCAgICAgaTI2Yml0LDAsMCwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZDAwMDAwMDAsImJiMCAgICAgICAgICIsezIxLDUsSEVYfSAgLHsxNiw1LFJFR30gICAsezAsMTYsUENSRUx9LHsyLDIsTkEsQkIwLCAgICAgaTE2Yml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZDQwMDAwMDAsImJiMC5uICAgICAgICIsezIxLDUsSEVYfSAgLHsxNiw1LFJFR30gICAsezAsMTYsUENSRUx9LHsxLDEsTkEsQkIwLCAgICAgaTE2Yml0LDAsMSwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZDgwMDAwMDAsImJiMSAgICAgICAgICIsezIxLDUsSEVYfSx7MTYsNSxSRUd9ICAgICAsezAsMTYsUENSRUx9LHsyLDIsTkEsQkIxLCAgICAgaTE2Yml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZGMwMDAwMDAsImJiMS5uICAgICAgICIsezIxLDUsSEVYfSx7MTYsNSxSRUd9ICAgICAsezAsMTYsUENSRUx9LHsxLDEsTkEsQkIxLCAgICAgaTE2Yml0LDAsMSwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMGQwMDAsInRiMCAgICAgICAgICIsezIxLDUsSEVYfSAgLHsxNiw1LFJFR30gICAsezAsMTAsSEVYfSwgezIsMixOQSxUQjAgLCAgICAgaTEwYml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMGQ4MDAsInRiMSAgICAgICAgICIsezIxLDUsSEVYfSAgLHsxNiw1LFJFR30gICAsezAsMTAsSEVYfSwgezIsMixOQSxUQjEgLCAgICAgaTEwYml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZTgwMDAwMDAsImJjbmQgICAgICAgICIsezIxLDUsQ09ORE1BU0t9LHsxNiw1LFJFR30sezAsMTYsUENSRUx9LHsyLDIsTkEsQkNORCwgICAgaTE2Yml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZWMwMDAwMDAsImJjbmQubiAgICAgICIsezIxLDUsQ09ORE1BU0t9LHsxNiw1LFJFR30sezAsMTYsUENSRUx9LHsxLDEsTkEsQkNORCwgICAgaTE2Yml0LDAsMSwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMGU4MDAsInRjbmQgICAgICAgICIsezIxLDUsQ09ORE1BU0t9LHsxNiw1LFJFR30sezAsMTAsSEVYfSwgezIsMixOQSxUQ05ELCAgICAgaTEwYml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjgwMDAwMDAsInRibmQgICAgICAgICIsezE2LDUsUkVHfSAgLHswLDE2LEhFWH0gICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxUQk5ELCAgICAgaTEwYml0LDEsMCwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMGY4MDAsInRibmQgICAgICAgICIsezE2LDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxUQk5ELCAgICAgICAgICAwLDEsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMGZjMDAsInJ0ZSAgICAgICAgICIsTk9fT1BFUkFORCAgICAgLE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxSVEUgLCAgICAgICAgICAwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MWMwMDAwMDAsImxkLmIgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExEQiAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDFjMDAsImxkLmIgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExEQiAgICAgLCAgICAwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MGMwMDAwMDAsImxkLmJ1ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExEQlUsICAgaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDBjMDAsImxkLmJ1ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExEQlUgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MTgwMDAwMDAsImxkLmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExESCAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDE4MDAsImxkLmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExESCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDFhMDAsImxkLmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLExESCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4MDgwMDAwMDAsImxkLmh1ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExESFUsICAgaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDA4MDAsImxkLmh1ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExESFUgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDBhMDAsImxkLmh1ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLExESFUgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4MTQwMDAwMDAsImxkICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExEICAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDE0MDAsImxkICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExEICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDE2MDAsImxkICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLExEICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4MTAwMDAwMDAsImxkLmQgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExERCAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDEwMDAsImxkLmQgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExERCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDEyMDAsImxkLmQgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLExERCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4ZjQwMDE1MDAsImxkLnVzciAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExEICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDE3MDAsImxkLnVzciAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLExEICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4MmMwMDAwMDAsInN0LmIgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxOQSxTVEIgICAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDJjMDAsInN0LmIgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxOQSxTVEIgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MjgwMDAwMDAsInN0LmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxOQSxTVEggICAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI4MDAsInN0LmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxOQSxTVEggICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDJhMDAsInN0LmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxOQSxTVEggICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4MjQwMDAwMDAsInN0ICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxOQSxTVCAgICAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI0MDAsInN0ICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxOQSxTVCAgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwMjYwMCwic3QgICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLE5BLFNUICAgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwxfSAgICxOVUxMIH0sCi0gIHsweDIwMDAwMDAwLCJzdC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsTkEsU1REICAgICAgLGkxNmJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDIwMDAsInN0LmQgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxOQSxTVEQgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwMjIwMCwic3QuZCAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLE5BLFNURCAgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwxfSAgICxOVUxMIH0sCi0gIHsweGY0MDAyNTAwLCJzdC51c3IgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1QgICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDI3MDAsInN0LnVzciAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxOQSxTVCAgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAotLyogIG04ODEwMCBvbmx5OgotICB7MHgwMDAwMDAwMCwieG1lbS5idSAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MywxLFBNRU0sWE1FTUJVICxpMTZiaXQsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gKi8KLSAgezB4ZjQwMDAwMDAsInhtZW0uYnUgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLFhNRU0gICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotLyogIG04ODEwMCBvbmx5OgotICB7MHgwNDAwMDAwMCwieG1lbSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MywxLFBNRU0sWE1FTSAgICxpMTZiaXQsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gKi8KLSAgezB4ZjQwMDA0MDAsInhtZW0gICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLFhNRU0gICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwMDYwMCwieG1lbSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MywxLFBNRU0sWE1FTSAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwxfSAgICxOVUxMIH0sCi0gIHsweGY0MDAwNTAwLCJ4bWVtLnVzciAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxYTUVNICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDA3MDAsInhtZW0udXNyICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLFhNRU0gICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAotLyogbTg4MTAwIG9ubHk6Ci0gIHsweGY0MDAzZTAwLCJsZGEuYiAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsUElOVCxMREFILCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDF9ICAgLE5VTEwgfSwKLSAqLwotICB7MHhmNDAwM2UwMCwibGRhLnggICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLFBJTlQsTERBSCwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwxfSAgICxOVUxMIH0sCi0gIHsweGY0MDAzYTAwLCJsZGEuaCAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsUElOVCxMREFILCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDF9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDM2MDAsImxkYSAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxQSU5ULExEQSAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMX0gICAsTlVMTCB9LAotICB7MHhmNDAwMzIwMCwibGRhLmQgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLFBJTlQsTERBRCwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwxfSAgICxOVUxMIH0sCi0KLSAgezB4ODAwMDQwMDAsImxkY3IgICAgICAgICIsezIxLDUsUkVHfSAgLHs1LDYsQ1JSRUd9ICAsTk9fT1BFUkFORCAgICAsezEsMSxQSU5ULExEQ1IsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4MDAwODAwMCwic3RjciAgICAgICAgIix7MTYsNSxSRUd9ICAsezUsNixDUlJFR30gICxOT19PUEVSQU5EICAgICx7MSwxLFBJTlQsU1RDUiwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDgwMDBjMDAwLCJ4Y3IgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHs1LDYsQ1JSRUd9LHsxLDEsUElOVCxYQ1IsICAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHhmNDAwNjAwMCwiYWRkdSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2MjAwLCJhZGR1LmNpICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBRERVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDYxMDAsImFkZHUuY28gICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERFUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjMwMCwiYWRkdS5jaW8gICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2NDAwLCJzdWJ1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUJVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDY2MDAsInN1YnUuY2kgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQlUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjUwMCwic3VidS5jbyAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2NzAwLCJzdWJ1LmNpbyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUJVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDY4MDAsImRpdnUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMyLDMyLFBJTlQsRElWVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2OTAwLCJkaXZ1LmQgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLH0sIE5VTEwgfSwKLSAgezB4ZjQwMDZlMDAsIm11bHMgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsfSwgTlVMTCB9LAotICB7MHhmNDAwNmMwMCwibXVsdSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSw0LFBJTlQsTVVMLCAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3MDAwLCJhZGQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBREQgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDcyMDAsImFkZC5jaSAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERCAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzEwMCwiYWRkLmNvICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3MzAwLCJhZGQuY2lvICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBREQgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDc0MDAsInN1YiAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQiAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzYwMCwic3ViLmNpICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3NTAwLCJzdWIuY28gICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUIgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDc3MDAsInN1Yi5jaW8gICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQiAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzgwMCwiZGl2cyAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MzIsMzIsUElOVCxESVYgLCAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3YzAwLCJjbXAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxDTVAsICAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHg2MDAwMDAwMCwiYWRkdSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsQUREVSwgICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDY0MDAwMDAwLCJzdWJ1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxTVUJVLCAgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHg2ODAwMDAwMCwiZGl2dSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MzIsMzIsUElOVCxESVZVLCBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDZjMDAwMDAwLCJtdWx1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHs0LDEsUElOVCxNVUwsICAgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NzAwMDAwMDAsImFkZCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULEFERCwgICAgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg3NDAwMDAwMCwic3ViICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsU1VCLCAgICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDc4MDAwMDAwLCJkaXZzICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszMiwzMixQSU5ULERJViwgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4N2MwMDAwMDAsImNtcCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULENNUCwgICAgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotCi0gIHsweGY0MDA0MDAwLCJhbmQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBTkRfICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDQ0MDAsImFuZC5jICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFORF8gICAgICAgICwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNTgwMCwib3IgICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsT1IgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA1YzAwLCJvci5jICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxPUiAgICAgICAgICAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDUwMDAsInhvciAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFhPUiAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNTQwMCwieG9yLmMgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsWE9SICAgICAgICAgLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDQwMDAwMDAwLCJhbmQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxBTkRfICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NDQwMDAwMDAsImFuZC51ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULEFORF8gICAsaTE2Yml0LDEsMCwxLDAsMSwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg1ODAwMDAwMCwib3IgICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsT1IgICAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDVjMDAwMDAwLCJvci51ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxPUiAgICAgLGkxNmJpdCwxLDAsMSwwLDEsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NTAwMDAwMDAsInhvciAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULFhPUiAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg1NDAwMDAwMCwieG9yLnUgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsWE9SICAgICxpMTZiaXQsMSwwLDEsMCwxLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDQ4MDAwMDAwLCJtYXNrICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxNQVNLICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NGMwMDAwMDAsIm1hc2sudSAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULE1BU0sgICAsaTE2Yml0LDEsMCwxLDAsMSwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwZWMwMCwiZmYwICAgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7MSwxLFBJTlQsRkYwICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDBlODAwLCJmZjEgICAgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHsxLDEsUElOVCxGRjEgICAgICAgICAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjAwMDgwMDAsImNsciAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTAsQkZ9ICwgezEsMSxQSU5ULENMUiAgICAsaTEwYml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmMDAwODgwMCwic2V0ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxCRn0gLCB7MSwxLFBJTlQsU0VUICAgICxpMTBiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGYwMDA5MDAwLCJleHQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDEwLEJGfSAsIHsxLDEsUElOVCxFWFQgICAgLGkxMGJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjAwMDk4MDAsImV4dHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTAsQkZ9ICwgezEsMSxQSU5ULEVYVFUgICAsaTEwYml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmMDAwYTAwMCwibWFrICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxCRn0gLCB7MSwxLFBJTlQsTUFLICAgICxpMTBiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGYwMDBhODAwLCJyb3QgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDEwLEJGfSAsIHsxLDEsUElOVCxST1QgICAgLGkxMGJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDgwMDAsImNsciAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULENMUiAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwODgwMCwic2V0ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU0VUICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA5MDAwLCJleHQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxFWFQgICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDk4MDAsImV4dHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEVYVFUgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwYTAwMCwibWFrICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsTUFLICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDBhODAwLCJyb3QgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxST1QgICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHg4NDAwMjgwMCwiZmFkZC5zc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NSwxLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyODgwLCJmYWRkLnNzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDJhMDAsImZhZGQuc2RzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMmE4MCwiZmFkZC5zZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyODIwLCJmYWRkLmRzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDI4YTAsImZhZGQuZHNkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMmEyMCwiZmFkZC5kZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyYWEwLCJmYWRkLmRkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMwMDAsImZzdWIuc3NzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezUsMSxQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzA4MCwiZnN1Yi5zc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMjAwLCJmc3ViLnNkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMyODAsImZzdWIuc2RkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzAyMCwiZnN1Yi5kc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMGEwLCJmc3ViLmRzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMyMjAsImZzdWIuZGRzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzJhMCwiZnN1Yi5kZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMDAwLCJmbXVsLnNzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDEsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAwODAsImZtdWwuc3NkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDIwMCwiZm11bC5zZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7OSwyLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMjgwLCJmbXVsLnNkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAwMjAsImZtdWwuZHNzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDBhMCwiZm11bC5kc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7OSwyLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMjIwLCJmbXVsLmRkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAyYTAsImZtdWwuZGRkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzAwMCwiZmRpdi5zc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MzAsMzAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MDgwLCJmZGl2LnNzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcyMDAsImZkaXYuc2RzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYwLDYwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzI4MCwiZmRpdi5zZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MDIwLCJmZGl2LmRzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcwYTAsImZkaXYuZHNkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYwLDYwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzIyMCwiZmRpdi5kZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MmEwLCJmZGl2LmRkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDc4MDAsImZzcXJ0LnNzICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezUsMSxQRkxULEZMVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzgyMCwiZnNxcnQuc2QgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsRkxUICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3ODgwLCJmc3FydC5kcyAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDc4YTAsImZzcXJ0LmRkICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezYsMSxQRkxULEZMVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzgwMCwiZmNtcC5zcyAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NSwxLFBGTFQsRkNNUCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzODgwLCJmY21wLnNkICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDEsUEZMVCxGQ01QICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDNhMDAsImZjbXAuZHMgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMSxQRkxULEZDTVAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwM2E4MCwiZmNtcC5kZCAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwxLFBGTFQsRkNNUCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyMDAwLCJmbHQucyAgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDIwMjAsImZsdC5kICAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezYsMSxQRkxULEZMVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNDgwMCwiaW50LnMgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsSU5UICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA0ODgwLCJpbnQuZCAgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs2LDEsUEZMVCxJTlQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDUwMDAsIm5pbnQucyAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezUsMSxQRkxULElOVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNTA4MCwibmludC5kICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NiwxLFBGTFQsSU5UICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA1ODAwLCJ0cm5jLnMgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxUUk5DICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDU4ODAsInRybmMuZCAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezYsMSxQRkxULFRSTkMgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotCi0gIHsweDgwMDA0ODAwLCJmbGRjciAgICAgICAiLHsyMSw1LFJFR30gICx7NSw2LEZDUlJFR30gLE5PX09QRVJBTkQgICAsIHsxLDEsUEZMVCxGTERDICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODAwMDg4MDAsImZzdGNyICAgICAgICIsezE2LDUsUkVHfSAgLHs1LDYsRkNSUkVHfSAsTk9fT1BFUkFORCAgICwgezEsMSxQRkxULEZTVEMgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4MDAwYzgwMCwiZnhjciAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7NSw2LEZDUlJFR30gLCB7MSwxLFBGTFQsRlhDICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0KLS8qIFRoZSBmb2xsb3dpbmcgYXJlIG5ldyBmb3IgdGhlIDg4MTEwLiAqLwotCi0gIHsweDg0MDBhYWEwLCJmYWRkLmRkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWE4MCwiZmFkZC5kZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFhYzAsImZhZGQuZGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYTIwLCJmYWRkLmRzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWEwMCwiZmFkZC5kc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFhNDAsImZhZGQuZHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYjIwLCJmYWRkLmR4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWIwMCwiZmFkZC5keHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFiNDAsImZhZGQuZHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhOGEwLCJmYWRkLnNkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYTg4MCwiZmFkZC5zZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE4YzAsImZhZGQuc2R4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhODIwLCJmYWRkLnNzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYTgwMCwiZmFkZC5zc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE4NDAsImZhZGQuc3N4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhOTIwLCJmYWRkLnN4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYTkwMCwiZmFkZC5zeHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE5NDAsImZhZGQuc3h4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhY2EwLCJmYWRkLnhkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWM4MCwiZmFkZC54ZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFjYzAsImZhZGQueGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYzIwLCJmYWRkLnhzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWMwMCwiZmFkZC54c3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFjNDAsImZhZGQueHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhZDIwLCJmYWRkLnh4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWQwMCwiZmFkZC54eHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFkNDAsImZhZGQueHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGJhODAsImZjbXAuc2RkICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJhMDAsImZjbXAuc2RzICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJiMDAsImZjbXAuc2R4ICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI4ODAsImZjbXAuc3NkICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI4MDAsImZjbXAuc3NzICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI5MDAsImZjbXAuc3N4ICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJjODAsImZjbXAuc3hkICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJjMDAsImZjbXAuc3hzICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJkMDAsImZjbXAuc3h4ICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwYmFhMCwiZmNtcHUuc2RkICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmEyMCwiZmNtcHUuc2RzICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmIyMCwiZmNtcHUuc2R4ICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjhhMCwiZmNtcHUuc3NkICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjgyMCwiZmNtcHUuc3NzICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjkyMCwiZmNtcHUuc3N4ICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmNhMCwiZmNtcHUuc3hkICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmMyMCwiZmNtcHUuc3hzICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmQyMCwiZmNtcHUuc3h4ICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDAwODIwLCJmY3Z0LnNkICAgICAiLHsyMSw1LFJFR30gLHswLDUsUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwMDg4MCwiZmN2dC5kcyAgICAgIix7MjEsNSxSRUd9ICx7MCw1LFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwODg4MCwiZmN2dC5kcyAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODhjMCwiZmN2dC5keCAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODgyMCwiZmN2dC5zZCAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODg0MCwiZmN2dC5zeCAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODkyMCwiZmN2dC54ZCAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODkwMCwiZmN2dC54cyAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBmMmEwLCJmZGl2LmRkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjI4MCwiZmRpdi5kZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYyYzAsImZkaXYuZGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMjIwLCJmZGl2LmRzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjIwMCwiZmRpdi5kc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYyNDAsImZkaXYuZHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMzIwLCJmZGl2LmR4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjMwMCwiZmRpdi5keHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYzNDAsImZkaXYuZHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMGEwLCJmZGl2LnNkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjA4MCwiZmRpdi5zZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYwYzAsImZkaXYuc2R4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMDIwLCJmZGl2LnNzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjAwMCwiZmRpdi5zc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYwNDAsImZkaXYuc3N4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMTIwLCJmZGl2LnN4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjEwMCwiZmRpdi5zeHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYxNDAsImZkaXYuc3h4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNGEwLCJmZGl2LnhkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjQ4MCwiZmRpdi54ZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY0YzAsImZkaXYueGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNDIwLCJmZGl2LnhzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjQwMCwiZmRpdi54c3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY0NDAsImZkaXYueHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNTIwLCJmZGl2Lnh4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjUwMCwiZmRpdi54eHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY1NDAsImZkaXYueHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMDIyMjAsImZsdC5kcyAgICAgICIsezIxLDUsWFJFR30gLHswLDUsUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwMjIwMCwiZmx0LnNzICAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDAyMjQwLCJmbHQueHMgICAgICAiLHsyMSw1LFhSRUd9ICx7MCw1LFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwODJhMCwiZm11bC5kZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgyODAsImZtdWwuZGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MmMwLCJmbXVsLmRkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODIyMCwiZm11bC5kc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgyMDAsImZtdWwuZHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MjQwLCJmbXVsLmRzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODMyMCwiZm11bC5keGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgzMDAsImZtdWwuZHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MzQwLCJmbXVsLmR4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODBhMCwiZm11bC5zZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgwODAsImZtdWwuc2RzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MGMwLCJmbXVsLnNkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODAyMCwiZm11bC5zc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgwMDAsImZtdWwuc3NzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MDQwLCJmbXVsLnNzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODEyMCwiZm11bC5zeGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgxMDAsImZtdWwuc3hzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MTQwLCJmbXVsLnN4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODRhMCwiZm11bC54ZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg0ODAsImZtdWwueGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NGMwLCJmbXVsLnhkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODQyMCwiZm11bC54c2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg0MDAsImZtdWwueHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NDQwLCJmbXVsLnhzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODUyMCwiZm11bC54eGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg1MDAsImZtdWwueHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NTQwLCJmbXVsLnh4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBmOGEwLCJmc3FydC5kZCAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY4ODAsImZzcXJ0LmRzICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjhjMCwiZnNxcnQuZHggICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmODIwLCJmc3FydC5zZCAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY4MDAsImZzcXJ0LnNzICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjg0MCwiZnNxcnQuc3ggICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmOTIwLCJmc3FydC54ZCAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY5MDAsImZzcXJ0LnhzICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjk0MCwiZnNxcnQueHggICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGIyYTAsImZzdWIuZGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMjgwLCJmc3ViLmRkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjJjMCwiZnN1Yi5kZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIyMjAsImZzdWIuZHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMjAwLCJmc3ViLmRzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjI0MCwiZnN1Yi5kc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIzMjAsImZzdWIuZHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMzAwLCJmc3ViLmR4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjM0MCwiZnN1Yi5keHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIwYTAsImZzdWIuc2RkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMDgwLCJmc3ViLnNkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjBjMCwiZnN1Yi5zZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIwMjAsImZzdWIuc3NkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMDAwLCJmc3ViLnNzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjA0MCwiZnN1Yi5zc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIxMjAsImZzdWIuc3hkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMTAwLCJmc3ViLnN4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjE0MCwiZnN1Yi5zeHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI0YTAsImZzdWIueGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNDgwLCJmc3ViLnhkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjRjMCwiZnN1Yi54ZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI0MjAsImZzdWIueHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNDAwLCJmc3ViLnhzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjQ0MCwiZnN1Yi54c3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI1MjAsImZzdWIueHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNTAwLCJmc3ViLnh4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjU0MCwiZnN1Yi54eHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwZmMwMCwiaWxsb3AiLCB7MCwyLERFQ30sIE5PX09QRVJBTkQsIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBjODAwLCJpbnQuc3MgICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGM4ODAsImludC5zZCAgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYzkwMCwiaW50LnN4ICAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4MDQwMDAwMDAsImxkICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MDAwMDAwMDAsImxkLmQgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4M2MwMDAwMDAsImxkLnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmMDAwMTQwMCwibGQgICAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxMDAwLCJsZC5kICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDE4MDAsImxkLnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTUwMCwibGQudXNyICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxMTAwLCJsZC5kLnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDE5MDAsImxkLngudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweGYwMDAxNjAwLCJsZCAgICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTIwMCwibGQuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDFhMDAsImxkLnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxNzAwLCJsZC51c3IgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTMwMCwibGQuZC51c3IgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDFiMDAsImxkLngudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGMwMDAsIm1vdi5zICAgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYzA4MCwibW92LmQgICAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA0MjAwLCJtb3YucyAgICAgICAiLCB7MjEsNSxYUkVHfSwgezAsNSxSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDQyODAsIm1vdi5kICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MCw1LFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYzMwMCwibW92ICAgICAgICAgIiwgezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweGY0MDA2ZDAwLCJtdWx1LmQgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBkMDgwLCJuaW50LnNkICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGQwMDAsIm5pbnQuc3MgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZDEwMCwibmludC5zeCAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDIwMjAsInBhZGQuYiAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMDQwLCJwYWRkLmggICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjA2MCwicGFkZCAgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwMjFlMCwicGFkZHMucyAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIxYTAsInBhZGRzLnMuYiAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMWMwLCJwYWRkcy5zLmggICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjBlMCwicGFkZHMudSAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIwYTAsInBhZGRzLnUuYiAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMGMwLCJwYWRkcy51LmggICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjE2MCwicGFkZHMudXMgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIxMjAsInBhZGRzLnVzLmIgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMTQwLCJwYWRkcy51cy5oICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDAzODYwLCJwY21wICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDAwMDAwLCJwbXVsICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDA2MjYwLCJwcGFjay4xNiAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwNjI0MCwicHBhY2suMTYuaCAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDY0NjAsInBwYWNrLjMyICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDA2NDIwLCJwcGFjay4zMi5iICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwNjQ0MCwicHBhY2suMzIuaCAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDYxNjAsInBwYWNrLjggICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDcyMDAsInByb3QgICAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHs1LDYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDA3ODAwLCJwcm90ICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDAzMDIwLCJwc3ViLmIgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzA0MCwicHN1Yi5oICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMwNjAsInBzdWIgICAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDMxZTAsInBzdWJzLnMgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMWEwLCJwc3Vicy5zLmIgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzFjMCwicHN1YnMucy5oICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMwZTAsInBzdWJzLnUgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMGEwLCJwc3Vicy51LmIgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzBjMCwicHN1YnMudS5oICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMxNjAsInBzdWJzLnVzICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMTIwLCJwc3Vicy51cy5iICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzE0MCwicHN1YnMudXMuaCAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwNjgwMCwicHVucGsubiAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDA2ODIwLCJwdW5way5iICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHgzNDAwMDAwMCwic3QgICAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDE2LEhFWH0sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHgzMDAwMDAwMCwic3QuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDE2LEhFWH0sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHgzODAwMDAwMCwic3QueCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDE2LEhFWH0sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweGY0MDAyYzgwLCJzdC5iLnd0ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjg4MCwic3QuaC53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI0ODAsInN0Lnd0ICAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyMDgwLCJzdC5kLnd0ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMmQ4MCwic3QuYi51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI5ODAsInN0LmgudXNyLnd0ICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyNTgwLCJzdC51c3Iud3QgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjE4MCwic3QuZC51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmMDAwMjQwMCwic3QgICAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMDAwLCJzdC5kICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDIxMDAsInN0LmQudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjE4MCwic3QuZC51c3Iud3QgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMDgwLCJzdC5kLnd0ICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI1MDAsInN0LnVzciAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjU4MCwic3QudXNyLnd0ICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyNDgwLCJzdC53dCAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI4MDAsInN0LnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjkwMCwic3QueC51c3IgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyOTgwLCJzdC54LnVzci53dCAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI4ODAsInN0Lngud3QgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweGY0MDAyZjgwLCJzdC5iLnVzci53dCAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyZTgwLCJzdC5iLnd0ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyMzgwLCJzdC5kLnVzci53dCAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyMjgwLCJzdC5kLnd0ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyYjgwLCJzdC5oLnVzci53dCAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyYTgwLCJzdC5oLnd0ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyNzgwLCJzdC51c3Iud3QgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyNjgwLCJzdC53dCAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ZjAwMDI2MDAsInN0ICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMjAwLCJzdC5kICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjMwMCwic3QuZC51c3IgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDIzODAsInN0LmQudXNyLnd0ICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMjgwLCJzdC5kLnd0ICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjcwMCwic3QudXNyICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI3ODAsInN0LnVzci53dCAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyNjgwLCJzdC53dCAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMmEwMCwic3QueCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDJiMDAsInN0LngudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyYjgwLCJzdC54LnVzci53dCAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMmE4MCwic3QueC53dCAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwZDg4MCwidHJuYy5zZCAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBkODAwLCJ0cm5jLnNzICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGQ5MDAsInRybmMuc3ggICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi19OwotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9taXBzLmggYi9pbmNsdWRlL29wY29kZS9taXBzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYThjN2UuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbWlwcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzIzICswLDAgQEAKLS8qIG1pcHMuaC4gIE1pcHMgb3Bjb2RlIGxpc3QgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmFscGggQ2FtcGJlbGwgYW5kIE9TRgotICAgQ29tbWVudGVkIGFuZCBtb2RpZmllZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9NSVBTX0hfCi0jZGVmaW5lIF9NSVBTX0hfCi0KLS8qIFRoZXNlIGFyZSBiaXQgbWFza3MgYW5kIHNoaWZ0IGNvdW50cyB0byB1c2UgdG8gYWNjZXNzIHRoZSB2YXJpb3VzCi0gICBmaWVsZHMgb2YgYW4gaW5zdHJ1Y3Rpb24uICBUbyByZXRyaWV2ZSB0aGUgWCBmaWVsZCBvZiBhbgotICAgaW5zdHJ1Y3Rpb24sIHVzZSB0aGUgZXhwcmVzc2lvbgotCShpID4+IE9QX1NIX1gpICYgT1BfTUFTS19YCi0gICBUbyBzZXQgdGhlIHNhbWUgZmllbGQgKHRvIGopLCB1c2UKLQlpID0gKGkgJn4gKE9QX01BU0tfWCA8PCBPUF9TSF9YKSkgfCAoaiA8PCBPUF9TSF9YKQotCi0gICBNYWtlIHN1cmUgeW91IHVzZSBmaWVsZHMgdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnN0cnVjdGlvbiwKLSAgIG9mIGNvdXJzZS4gIAotCi0gICBUaGUgJ2knIGZvcm1hdCB1c2VzIE9QLCBSUywgUlQgYW5kIElNTUVESUFURS4gIAotCi0gICBUaGUgJ2onIGZvcm1hdCB1c2VzIE9QIGFuZCBUQVJHRVQuCi0KLSAgIFRoZSAncicgZm9ybWF0IHVzZXMgT1AsIFJTLCBSVCwgUkQsIFNIQU1UIGFuZCBGVU5DVC4KLQotICAgVGhlICdiJyBmb3JtYXQgdXNlcyBPUCwgUlMsIFJUIGFuZCBERUxUQS4KLQotICAgVGhlIGZsb2F0aW5nIHBvaW50ICdpJyBmb3JtYXQgdXNlcyBPUCwgUlMsIFJUIGFuZCBJTU1FRElBVEUuCi0KLSAgIFRoZSBmbG9hdGluZyBwb2ludCAncicgZm9ybWF0IHVzZXMgT1AsIEZNVCwgRlQsIEZTLCBGRCBhbmQgRlVOQ1QuCi0KLSAgIEEgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiB1c2VzIE9QLCBDT0RFIGFuZCBTUEVDICgxMCBiaXRzIG9mIHRoZQotICAgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiBhcmUgbm90IGRlZmluZWQ7IEthbmUgc2F5cyB0aGUgYnJlYWtwb2ludAotICAgY29kZSBmaWVsZCBpbiBCUkVBSyBpcyAyMCBiaXRzOyB5ZXQgTUlQUyBhc3NlbWJsZXJzIGFuZCBkZWJ1Z2dlcnMKLSAgIG9ubHkgdXNlIHRlbiBiaXRzKS4gIEFuIG9wdGlvbmFsIHR3by1vcGVyYW5kIGZvcm0gb2YgYnJlYWsvc2RiYnAKLSAgIGFsbG93cyB0aGUgbG93ZXIgdGVuIGJpdHMgdG8gYmUgc2V0IHRvby4KLQotICAgVGhlIHN5c2NhbGwgaW5zdHJ1Y3Rpb24gdXNlcyBTWVNDQUxMLgotCi0gICBUaGUgZ2VuZXJhbCBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgdXNlIENPUFouICAqLwotCi0jZGVmaW5lIE9QX01BU0tfT1AJCTB4M2YKLSNkZWZpbmUgT1BfU0hfT1AJCTI2Ci0jZGVmaW5lIE9QX01BU0tfUlMJCTB4MWYKLSNkZWZpbmUgT1BfU0hfUlMJCTIxCi0jZGVmaW5lIE9QX01BU0tfRlIJCTB4MWYKLSNkZWZpbmUgT1BfU0hfRlIJCTIxCi0jZGVmaW5lIE9QX01BU0tfRk1UCQkweDFmCi0jZGVmaW5lIE9QX1NIX0ZNVAkJMjEKLSNkZWZpbmUgT1BfTUFTS19CQ0MJCTB4NwotI2RlZmluZSBPUF9TSF9CQ0MJCTE4Ci0jZGVmaW5lIE9QX01BU0tfQ09ERQkJMHgzZmYKLSNkZWZpbmUgT1BfU0hfQ09ERQkJMTYKLSNkZWZpbmUgT1BfTUFTS19DT0RFMgkJMHgzZmYKLSNkZWZpbmUgT1BfU0hfQ09ERTIJCTYKLSNkZWZpbmUgT1BfTUFTS19SVAkJMHgxZgotI2RlZmluZSBPUF9TSF9SVAkJMTYKLSNkZWZpbmUgT1BfTUFTS19GVAkJMHgxZgotI2RlZmluZSBPUF9TSF9GVAkJMTYKLSNkZWZpbmUgT1BfTUFTS19DQUNIRQkJMHgxZgotI2RlZmluZSBPUF9TSF9DQUNIRQkJMTYKLSNkZWZpbmUgT1BfTUFTS19SRAkJMHgxZgotI2RlZmluZSBPUF9TSF9SRAkJMTEKLSNkZWZpbmUgT1BfTUFTS19GUwkJMHgxZgotI2RlZmluZSBPUF9TSF9GUwkJMTEKLSNkZWZpbmUgT1BfTUFTS19QUkVGWAkJMHgxZgotI2RlZmluZSBPUF9TSF9QUkVGWAkJMTEKLSNkZWZpbmUgT1BfTUFTS19DQ0MJCTB4NwotI2RlZmluZSBPUF9TSF9DQ0MJCTgKLSNkZWZpbmUgT1BfTUFTS19TWVNDQUxMCQkweGZmZmZmCi0jZGVmaW5lIE9QX1NIX1NZU0NBTEwJCTYKLSNkZWZpbmUgT1BfTUFTS19TSEFNVAkJMHgxZgotI2RlZmluZSBPUF9TSF9TSEFNVAkJNgotI2RlZmluZSBPUF9NQVNLX0ZECQkweDFmCi0jZGVmaW5lIE9QX1NIX0ZECQk2Ci0jZGVmaW5lIE9QX01BU0tfVEFSR0VUCQkweDNmZmZmZmYKLSNkZWZpbmUgT1BfU0hfVEFSR0VUCQkwCi0jZGVmaW5lIE9QX01BU0tfQ09QWgkJMHgxZmZmZmZmCi0jZGVmaW5lIE9QX1NIX0NPUFoJCTAKLSNkZWZpbmUgT1BfTUFTS19JTU1FRElBVEUJMHhmZmZmCi0jZGVmaW5lIE9QX1NIX0lNTUVESUFURQkJMAotI2RlZmluZSBPUF9NQVNLX0RFTFRBCQkweGZmZmYKLSNkZWZpbmUgT1BfU0hfREVMVEEJCTAKLSNkZWZpbmUgT1BfTUFTS19GVU5DVAkJMHgzZgotI2RlZmluZSBPUF9TSF9GVU5DVAkJMAotI2RlZmluZSBPUF9NQVNLX1NQRUMJCTB4M2YKLSNkZWZpbmUgT1BfU0hfU1BFQwkJMAotI2RlZmluZSBPUF9TSF9MT0NDICAgICAgICAgICAgICA4ICAgICAgIC8qIEZQIGNvbmRpdGlvbiBjb2RlICovCi0jZGVmaW5lIE9QX1NIX0hJQ0MgICAgICAgICAgICAgIDE4ICAgICAgLyogRlAgY29uZGl0aW9uIGNvZGUgKi8KLSNkZWZpbmUgT1BfTUFTS19DQyAgICAgICAgICAgICAgMHg3Ci0jZGVmaW5lIE9QX1NIX0NPUDFOT1JNICAgICAgICAgIDI1ICAgICAgLyogTm9ybWFsIENPUDEgZW5jb2RpbmcgKi8KLSNkZWZpbmUgT1BfTUFTS19DT1AxTk9STSAgICAgICAgMHgxICAgICAvKiBhIHNpbmdsZSBiaXQgKi8KLSNkZWZpbmUgT1BfU0hfQ09QMVNQRUMgICAgICAgICAgMjEgICAgICAvKiBDT1AxIGVuY29kaW5ncyAqLwotI2RlZmluZSBPUF9NQVNLX0NPUDFTUEVDICAgICAgICAweGYKLSNkZWZpbmUgT1BfTUFTS19DT1AxU0NMUiAgICAgICAgMHg0Ci0jZGVmaW5lIE9QX01BU0tfQ09QMUNNUCAgICAgICAgIDB4MwotI2RlZmluZSBPUF9TSF9DT1AxQ01QICAgICAgICAgICA0Ci0jZGVmaW5lIE9QX1NIX0ZPUk1BVCAgICAgICAgICAgIDIxICAgICAgLyogRlAgc2hvcnQgZm9ybWF0IGZpZWxkICovCi0jZGVmaW5lIE9QX01BU0tfRk9STUFUICAgICAgICAgIDB4NwotI2RlZmluZSBPUF9TSF9UUlVFICAgICAgICAgICAgICAxNgotI2RlZmluZSBPUF9NQVNLX1RSVUUgICAgICAgICAgICAweDEKLSNkZWZpbmUgT1BfU0hfR0UgICAgICAgICAgICAgICAgMTcKLSNkZWZpbmUgT1BfTUFTS19HRSAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBPUF9TSF9VTlNJR05FRCAgICAgICAgICAxNgotI2RlZmluZSBPUF9NQVNLX1VOU0lHTkVEICAgICAgICAweDEKLSNkZWZpbmUgT1BfU0hfSElOVCAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgT1BfTUFTS19ISU5UICAgICAgICAgICAgMHgxZgotI2RlZmluZSBPUF9TSF9NTUkgICAgICAgICAgICAgICAwICAgICAgIC8qIE11bHRpbWVkaWEgKHBhcmFsbGVsKSBvcCAqLwotI2RlZmluZSBPUF9NQVNLX01NSSAgICAgICAgICAgICAweDNmIAotI2RlZmluZSBPUF9TSF9NTUlTVUIgICAgICAgICAgICA2Ci0jZGVmaW5lIE9QX01BU0tfTU1JU1VCICAgICAgICAgIDB4MWYKLSNkZWZpbmUgT1BfTUFTS19QRVJGUkVHCQkweDFmCS8qIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgKi8KLSNkZWZpbmUgT1BfU0hfUEVSRlJFRwkJMQotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGluc3RydWN0aW9uLiAgKi8KLQotc3RydWN0IG1pcHNfb3Bjb2RlCi17Ci0gIC8qIFRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGFyZ3VtZW50cyBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIC8qIFRoZSBiYXNpYyBvcGNvZGUgZm9yIHRoZSBpbnN0cnVjdGlvbi4gIFdoZW4gYXNzZW1ibGluZywgdGhpcwotICAgICBvcGNvZGUgaXMgbW9kaWZpZWQgYnkgdGhlIGFyZ3VtZW50cyB0byBwcm9kdWNlIHRoZSBhY3R1YWwgb3Bjb2RlCi0gICAgIHRoYXQgaXMgdXNlZC4gIElmIHBpbmZvIGlzIElOU05fTUFDUk8sIHRoZW4gdGhpcyBpcyAwLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXRjaDsKLSAgLyogSWYgcGluZm8gaXMgbm90IElOU05fTUFDUk8sIHRoZW4gdGhpcyBpcyBhIGJpdCBtYXNrIGZvciB0aGUKLSAgICAgcmVsZXZhbnQgcG9ydGlvbnMgb2YgdGhlIG9wY29kZSB3aGVuIGRpc2Fzc2VtYmxpbmcuICBJZiB0aGUKLSAgICAgYWN0dWFsIG9wY29kZSBhbmRlZCB3aXRoIHRoZSBtYXRjaCBmaWVsZCBlcXVhbHMgdGhlIG9wY29kZSBmaWVsZCwKLSAgICAgdGhlbiB3ZSBoYXZlIGZvdW5kIHRoZSBjb3JyZWN0IGluc3RydWN0aW9uLiAgSWYgcGluZm8gaXMKLSAgICAgSU5TTl9NQUNSTywgdGhlbiB0aGlzIGZpZWxkIGlzIHRoZSBtYWNybyBpZGVudGlmaWVyLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotICAvKiBGb3IgYSBtYWNybywgdGhpcyBpcyBJTlNOX01BQ1JPLiAgT3RoZXJ3aXNlLCBpdCBpcyBhIGNvbGxlY3Rpb24KLSAgICAgb2YgYml0cyBkZXNjcmliaW5nIHRoZSBpbnN0cnVjdGlvbiwgbm90YWJseSBhbnkgcmVsZXZhbnQgaGF6YXJkCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBwaW5mbzsKLSAgLyogQSBjb2xsZWN0aW9uIG9mIGJpdHMgZGVzY3JpYmluZyB0aGUgaW5zdHJ1Y3Rpb24gc2V0cyBvZiB3aGljaCB0aGlzCi0gICAgIGluc3RydWN0aW9uIG9yIG1hY3JvIGlzIGEgbWVtYmVyLiAqLwotICB1bnNpZ25lZCBsb25nIG1lbWJlcnNoaXA7Ci19OwotCi0vKiBUaGVzZSBhcmUgdGhlIGNoYXJhY3RlcnMgd2hpY2ggbWF5IGFwcGVhcnMgaW4gdGhlIGFyZ3MgZmllbGQgb2YgYW4KLSAgIGluc3RydWN0aW9uLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmaWVsZHMgYXBwZWFyCi0gICB3aGVuIHRoZSBpbnN0cnVjdGlvbiBpcyB1c2VkLiAgQ29tbWFzIGFuZCBwYXJlbnRoZXNlcyBpbiB0aGUgYXJncwotICAgc3RyaW5nIGFyZSBpZ25vcmVkIHdoZW4gYXNzZW1ibGluZywgYW5kIHdyaXR0ZW4gaW50byB0aGUgb3V0cHV0Ci0gICB3aGVuIGRpc2Fzc2VtYmxpbmcuCi0KLSAgIEVhY2ggb2YgdGhlc2UgY2hhcmFjdGVycyBjb3JyZXNwb25kcyB0byBhIG1hc2sgZmllbGQgZGVmaW5lZCBhYm92ZS4KLQotICAgIjwiIDUgYml0IHNoaWZ0IGFtb3VudCAoT1BfKl9TSEFNVCkKLSAgICI+IiBzaGlmdCBhbW91bnQgYmV0d2VlbiAzMiBhbmQgNjMsIHN0b3JlZCBhZnRlciBzdWJ0cmFjdGluZyAzMiAoT1BfKl9TSEFNVCkKLSAgICJhIiAyNiBiaXQgdGFyZ2V0IGFkZHJlc3MgKE9QXypfVEFSR0VUKQotICAgImIiIDUgYml0IGJhc2UgcmVnaXN0ZXIgKE9QXypfUlMpCi0gICAiYyIgMTAgYml0IGJyZWFrcG9pbnQgY29kZSAoT1BfKl9DT0RFKQotICAgImQiIDUgYml0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyIHNwZWNpZmllciAoT1BfKl9SRCkKLSAgICJoIiA1IGJpdCBwcmVmeCBoaW50IChPUF8qX1BSRUZYKQotICAgImkiIDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKE9QXypfSU1NRURJQVRFKQotICAgImoiIDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlIChPUF8qX0RFTFRBKQotICAgImsiIDUgYml0IGNhY2hlIG9wY29kZSBpbiB0YXJnZXQgcmVnaXN0ZXIgcG9zaXRpb24gKE9QXypfQ0FDSEUpCi0gICAibyIgMTYgYml0IHNpZ25lZCBvZmZzZXQgKE9QXypfREVMVEEpCi0gICAicCIgMTYgYml0IFBDIHJlbGF0aXZlIGJyYW5jaCB0YXJnZXQgYWRkcmVzcyAoT1BfKl9ERUxUQSkKLSAgICJxIiAxMCBiaXQgZXh0cmEgYnJlYWtwb2ludCBjb2RlIChPUF8qX0NPREUyKQotICAgInIiIDUgYml0IHNhbWUgcmVnaXN0ZXIgdXNlZCBhcyBib3RoIHNvdXJjZSBhbmQgdGFyZ2V0IChPUF8qX1JTKQotICAgInMiIDUgYml0IHNvdXJjZSByZWdpc3RlciBzcGVjaWZpZXIgKE9QXypfUlMpCi0gICAidCIgNSBiaXQgdGFyZ2V0IHJlZ2lzdGVyIChPUF8qX1JUKQotICAgInUiIDE2IGJpdCB1cHBlciAxNiBiaXRzIG9mIGFkZHJlc3MgKE9QXypfSU1NRURJQVRFKQotICAgInYiIDUgYml0IHNhbWUgcmVnaXN0ZXIgdXNlZCBhcyBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gKE9QXypfUlMpCi0gICAidyIgNSBiaXQgc2FtZSByZWdpc3RlciB1c2VkIGFzIGJvdGggdGFyZ2V0IGFuZCBkZXN0aW5hdGlvbiAoT1BfKl9SVCkKLSAgICJDIiAyNSBiaXQgY29wcm9jZXNzb3IgZnVuY3Rpb24gY29kZSAoT1BfKl9DT1BaKQotICAgIkIiIDIwIGJpdCBzeXNjYWxsIGZ1bmN0aW9uIGNvZGUgKE9QXypfU1lTQ0FMTCkKLSAgICJ4IiBhY2NlcHQgYW5kIGlnbm9yZSByZWdpc3RlciBuYW1lCi0gICAieiIgbXVzdCBiZSB6ZXJvIHJlZ2lzdGVyCi0KLSAgIEZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uczoKLSAgICJEIiA1IGJpdCBkZXN0aW5hdGlvbiByZWdpc3RlciAoT1BfKl9GRCkKLSAgICJNIiAzIGJpdCBjb21wYXJlIGNvbmRpdGlvbiBjb2RlIChPUF8qX0NDQykgKG9ubHkgdXNlZCBmb3IgbWlwczQgYW5kIHVwKQotICAgIk4iIDMgYml0IGJyYW5jaCBjb25kaXRpb24gY29kZSAoT1BfKl9CQ0MpIChvbmx5IHVzZWQgZm9yIG1pcHM0IGFuZCB1cCkKLSAgICJTIiA1IGJpdCBmcyBzb3VyY2UgMSByZWdpc3RlciAoT1BfKl9GUykKLSAgICJUIiA1IGJpdCBmdCBzb3VyY2UgMiByZWdpc3RlciAoT1BfKl9GVCkKLSAgICJSIiA1IGJpdCBmciBzb3VyY2UgMyByZWdpc3RlciAoT1BfKl9GUikKLSAgICJWIiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgZmxvYXRpbmcgc291cmNlIGFuZCBkZXN0aW5hdGlvbiAoT1BfKl9GUykKLSAgICJXIiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgZmxvYXRpbmcgdGFyZ2V0IGFuZCBkZXN0aW5hdGlvbiAoT1BfKl9GVCkKLQotICAgQ29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zOgotICAgIkUiIDUgYml0IHRhcmdldCByZWdpc3RlciAoT1BfKl9SVCkKLSAgICJHIiA1IGJpdCBkZXN0aW5hdGlvbiByZWdpc3RlciAoT1BfKl9SRCkKLSAgICJQIiA1IGJpdCBwZXJmb3JtYW5jZS1tb25pdG9yIHJlZ2lzdGVyIChPUF8qX1BFUkZSRUcpCi0KLSAgIE1hY3JvIGluc3RydWN0aW9uczoKLSAgICJBIiBHZW5lcmFsIDMyIGJpdCBleHByZXNzaW9uCi0gICAiSSIgMzIgYml0IGltbWVkaWF0ZQotICAgIkYiIDY0IGJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudCBpbiAucmRhdGEKLSAgICJMIiA2NCBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaW4gLmxpdDgKLSAgICJmIiAzMiBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgICJsIiAzMiBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaW4gLmxpdDQKLQotICAgT3RoZXI6Ci0gICAiKCkiIHBhcmVucyBzdXJyb3VuZGluZyBvcHRpb25hbCB2YWx1ZQotICAgIiwiICBzZXBhcmF0ZXMgb3BlcmFuZHMKLQotICAgQ2hhcmFjdGVycyB1c2VkIHNvIGZhciwgZm9yIHF1aWNrIHJlZmVyZW5jZSB3aGVuIGFkZGluZyBtb3JlOgotICAgIjw+KCksIgotICAgIkFCQ0RFRkdJTE1OU1RSVlciCi0gICAiYWJjZGZoaWprbG9wcXJzdHV2d3h6IgotKi8KLQotLyogVGhlc2UgYXJlIHRoZSBiaXRzIHdoaWNoIG1heSBiZSBzZXQgaW4gdGhlIHBpbmZvIGZpZWxkIG9mIGFuCi0gICBpbnN0cnVjdGlvbnMsIGlmIGl0IGlzIG5vdCBlcXVhbCB0byBJTlNOX01BQ1JPLiAgKi8KLQotLyogTW9kaWZpZXMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBPUF8qX1JELiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9HUFJfRCAgICAgICAgICAgIDB4MDAwMDAwMDEKLS8qIE1vZGlmaWVzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gT1BfKl9SVC4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfR1BSX1QgICAgICAgICAgICAweDAwMDAwMDAyCi0vKiBNb2RpZmllcyBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgMzEuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0dQUl8zMSAgICAgICAgICAgMHgwMDAwMDAwNAotLyogTW9kaWZpZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRkQuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0ZQUl9EICAgICAgICAgICAgMHgwMDAwMDAwOAotLyogTW9kaWZpZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRlMuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0ZQUl9TICAgICAgICAgICAgMHgwMDAwMDAxMAotLyogTW9kaWZpZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRlQuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0ZQUl9UICAgICAgICAgICAgMHgwMDAwMDAyMAotLyogUmVhZHMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBPUF8qX1JTLiAgKi8KLSNkZWZpbmUgSU5TTl9SRUFEX0dQUl9TICAgICAgICAgICAgIDB4MDAwMDAwNDAKLS8qIFJlYWRzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gT1BfKl9SVC4gICovCi0jZGVmaW5lIElOU05fUkVBRF9HUFJfVCAgICAgICAgICAgICAweDAwMDAwMDgwCi0vKiBSZWFkcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GUy4gICovCi0jZGVmaW5lIElOU05fUkVBRF9GUFJfUyAgICAgICAgICAgICAweDAwMDAwMTAwCi0vKiBSZWFkcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GVC4gICovCi0jZGVmaW5lIElOU05fUkVBRF9GUFJfVCAgICAgICAgICAgICAweDAwMDAwMjAwCi0vKiBSZWFkcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GUi4gICovCi0jZGVmaW5lIElOU05fUkVBRF9GUFJfUgkJICAgIDB4MDAwMDA0MDAKLS8qIE1vZGlmaWVzIGNvcHJvY2Vzc29yIGNvbmRpdGlvbiBjb2RlLiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9DT05EX0NPREUgICAgICAgIDB4MDAwMDA4MDAKLS8qIFJlYWRzIGNvcHJvY2Vzc29yIGNvbmRpdGlvbiBjb2RlLiAgKi8KLSNkZWZpbmUgSU5TTl9SRUFEX0NPTkRfQ09ERSAgICAgICAgIDB4MDAwMDEwMDAKLS8qIFRMQiBvcGVyYXRpb24uICAqLwotI2RlZmluZSBJTlNOX1RMQiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAotLyogUmVhZHMgY29wcm9jZXNzb3IgcmVnaXN0ZXIgb3RoZXIgdGhhbiBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gICovCi0jZGVmaW5lIElOU05fQ09QICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCi0vKiBJbnN0cnVjdGlvbiBsb2FkcyB2YWx1ZSBmcm9tIG1lbW9yeSwgcmVxdWlyaW5nIGRlbGF5LiAgKi8KLSNkZWZpbmUgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSAgICAgIDB4MDAwMDgwMDAKLS8qIEluc3RydWN0aW9uIGxvYWRzIHZhbHVlIGZyb20gY29wcm9jZXNzb3IsIHJlcXVpcmluZyBkZWxheS4gICovCi0jZGVmaW5lIElOU05fTE9BRF9DT1BST0NfREVMQVkJICAgIDB4MDAwMTAwMDAKLS8qIEluc3RydWN0aW9uIGhhcyB1bmNvbmRpdGlvbmFsIGJyYW5jaCBkZWxheSBzbG90LiAgKi8KLSNkZWZpbmUgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZICAgIDB4MDAwMjAwMDAKLS8qIEluc3RydWN0aW9uIGhhcyBjb25kaXRpb25hbCBicmFuY2ggZGVsYXkgc2xvdC4gICovCi0jZGVmaW5lIElOU05fQ09ORF9CUkFOQ0hfREVMQVkgICAgICAweDAwMDQwMDAwCi0vKiBDb25kaXRpb25hbCBicmFuY2ggbGlrZWx5OiBpZiBicmFuY2ggbm90IHRha2VuLCBpbnNuIG51bGxpZmllZC4gICovCi0jZGVmaW5lIElOU05fQ09ORF9CUkFOQ0hfTElLRUxZCSAgICAweDAwMDgwMDAwCi0vKiBNb3ZlcyB0byBjb3Byb2Nlc3NvciByZWdpc3RlciwgcmVxdWlyaW5nIGRlbGF5LiAgKi8KLSNkZWZpbmUgSU5TTl9DT1BST0NfTU9WRV9ERUxBWSAgICAgIDB4MDAxMDAwMDAKLS8qIExvYWRzIGNvcHJvY2Vzc29yIHJlZ2lzdGVyIGZyb20gbWVtb3J5LCByZXF1aXJpbmcgZGVsYXkuICAqLwotI2RlZmluZSBJTlNOX0NPUFJPQ19NRU1PUllfREVMQVkgICAgMHgwMDIwMDAwMAotLyogUmVhZHMgdGhlIEhJIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgSU5TTl9SRUFEX0hJCQkgICAgMHgwMDQwMDAwMAotLyogUmVhZHMgdGhlIExPIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgSU5TTl9SRUFEX0xPCQkgICAgMHgwMDgwMDAwMAotLyogTW9kaWZpZXMgdGhlIEhJIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9ISQkJICAgIDB4MDEwMDAwMDAKLS8qIE1vZGlmaWVzIHRoZSBMTyByZWdpc3Rlci4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfTE8JCSAgICAweDAyMDAwMDAwCi0vKiBUYWtlcyBhIHRyYXAgKGVhc2llciB0byBrZWVwIG91dCBvZiBkZWxheSBzbG90KS4gICovCi0jZGVmaW5lIElOU05fVFJBUCAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCi0vKiBJbnN0cnVjdGlvbiBzdG9yZXMgdmFsdWUgaW50byBtZW1vcnkuICAqLwotI2RlZmluZSBJTlNOX1NUT1JFX01FTU9SWQkgICAgMHgwODAwMDAwMAotLyogSW5zdHJ1Y3Rpb24gdXNlcyBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LiAgKi8KLSNkZWZpbmUgRlBfUwkJCSAgICAweDEwMDAwMDAwCi0vKiBJbnN0cnVjdGlvbiB1c2VzIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQuICAqLwotI2RlZmluZSBGUF9ECQkJICAgIDB4MjAwMDAwMDAKLS8qIEluc3RydWN0aW9uIGlzIHBhcnQgb2YgdGhlIHR4MzkncyBpbnRlZ2VyIG11bHRpcGx5IGZhbWlseS4gICAgKi8KLSNkZWZpbmUgSU5TTl9NVUxUICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLS8qIEluc3RydWN0aW9uIHN5bmNocm9uaXplIHNoYXJlZCBtZW1vcnkuICAqLwotI2RlZmluZSBJTlNOX1NZTkMJCSAgICAweDgwMDAwMDAwCi0KLS8qIEluc3RydWN0aW9uIGlzIGFjdHVhbGx5IGEgbWFjcm8uICBJdCBzaG91bGQgYmUgaWdub3JlZCBieSB0aGUKLSAgIGRpc2Fzc2VtYmxlciwgYW5kIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50IGJ5IHRoZSBhc3NlbWJsZXIuICAqLwotI2RlZmluZSBJTlNOX01BQ1JPICAgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgotCi0KLQotCi0KLS8qIE1JUFMgSVNBIGZpZWxkLS1DUFUgbGV2ZWwgYXQgd2hpY2ggaW5zbiBpcyBzdXBwb3J0ZWQuICAqLwotI2RlZmluZSBJTlNOX0lTQQkJICAgIDB4MDAwMDAwMEYKLS8qIEFuIGluc3RydWN0aW9uIHdoaWNoIGlzIG5vdCBwYXJ0IG9mIGFueSBiYXNpYyBNSVBTIElTQS4KLSAgIChpZSBpdCBpcyBhIGNoaXAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb24pICAqLwotI2RlZmluZSBJTlNOX05PX0lTQQkJICAgIDB4MDAwMDAwMDAKLS8qIE1JUFMgSVNBIDEgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBJTlNOX0lTQTEJCSAgICAweDAwMDAwMDAxCi0vKiBNSVBTIElTQSAyIGluc3RydWN0aW9uIChSNjAwMCBvciBSNDAwMCkuICAqLwotI2RlZmluZSBJTlNOX0lTQTIJCSAgICAweDAwMDAwMDAyCi0vKiBNSVBTIElTQSAzIGluc3RydWN0aW9uIChSNDAwMCkuICAqLwotI2RlZmluZSBJTlNOX0lTQTMJCSAgICAweDAwMDAwMDAzCi0vKiBNSVBTIElTQSA0IGluc3RydWN0aW9uIChSODAwMCkuICAqLwotI2RlZmluZSBJTlNOX0lTQTQJCSAgICAweDAwMDAwMDA0Ci0KLS8qIENoaXAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zLiAgVGhlc2UgYXJlIGJpdG1hc2tzLiAgKi8KLS8qIE1JUFMgUjQ2NTAgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBJTlNOXzQ2NTAJCSAgICAweDAwMDAwMDEwCi0vKiBMU0kgUjQwMTAgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBJTlNOXzQwMTAJCSAgICAweDAwMDAwMDIwCi0vKiBORUMgVlI0MTAwIGluc3RydWN0aW9uLiAqLwotI2RlZmluZSBJTlNOXzQxMDAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotLyogVG9zaGliYSBSMzkwMCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIElOU05fMzkwMCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0KLQotLyogVGhpcyBpcyBhIGxpc3Qgb2YgbWFjcm8gZXhwYW5kZWQgaW5zdHJ1Y3Rpb25zLgotICoKLSAqIF9JIGFwcGVuZGVkIG1lYW5zIGltbWVkaWF0ZQotICogX0EgYXBwZW5kZWQgbWVhbnMgYWRkcmVzcwotICogX0FCIGFwcGVuZGVkIG1lYW5zIGFkZHJlc3Mgd2l0aCBiYXNlIHJlZ2lzdGVyCi0gKiBfRCBhcHBlbmRlZCBtZWFucyA2NCBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAqIF9TIGFwcGVuZGVkIG1lYW5zIDMyIGJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudAotICovCi1lbnVtIHsKLSAgICBNX0FCUywKLSAgICBNX0FERF9JLAotICAgIE1fQUREVV9JLAotICAgIE1fQU5EX0ksCi0gICAgTV9CRVEsCi0gICAgTV9CRVFfSSwKLSAgICBNX0JFUUxfSSwKLSAgICBNX0JHRSwKLSAgICBNX0JHRUwsCi0gICAgTV9CR0VfSSwKLSAgICBNX0JHRUxfSSwKLSAgICBNX0JHRVUsCi0gICAgTV9CR0VVTCwKLSAgICBNX0JHRVVfSSwKLSAgICBNX0JHRVVMX0ksCi0gICAgTV9CR1QsCi0gICAgTV9CR1RMLAotICAgIE1fQkdUX0ksCi0gICAgTV9CR1RMX0ksCi0gICAgTV9CR1RVLAotICAgIE1fQkdUVUwsCi0gICAgTV9CR1RVX0ksCi0gICAgTV9CR1RVTF9JLAotICAgIE1fQkxFLAotICAgIE1fQkxFTCwKLSAgICBNX0JMRV9JLAotICAgIE1fQkxFTF9JLAotICAgIE1fQkxFVSwKLSAgICBNX0JMRVVMLAotICAgIE1fQkxFVV9JLAotICAgIE1fQkxFVUxfSSwKLSAgICBNX0JMVCwKLSAgICBNX0JMVEwsCi0gICAgTV9CTFRfSSwKLSAgICBNX0JMVExfSSwKLSAgICBNX0JMVFUsCi0gICAgTV9CTFRVTCwKLSAgICBNX0JMVFVfSSwKLSAgICBNX0JMVFVMX0ksCi0gICAgTV9CTkUsCi0gICAgTV9CTkVfSSwKLSAgICBNX0JORUxfSSwKLSAgICBNX0RBQlMsCi0gICAgTV9EQUREX0ksCi0gICAgTV9EQUREVV9JLAotICAgIE1fRERJVl8zLAotICAgIE1fRERJVl8zSSwKLSAgICBNX0RESVZVXzMsCi0gICAgTV9ERElWVV8zSSwKLSAgICBNX0RJVl8zLAotICAgIE1fRElWXzNJLAotICAgIE1fRElWVV8zLAotICAgIE1fRElWVV8zSSwKLSAgICBNX0RMQV9BQiwKLSAgICBNX0RMSSwKLSAgICBNX0RNVUwsCi0gICAgTV9ETVVMX0ksIAotICAgIE1fRE1VTE8sCi0gICAgTV9ETVVMT19JLCAKLSAgICBNX0RNVUxPVSwKLSAgICBNX0RNVUxPVV9JLCAKLSAgICBNX0RSRU1fMywKLSAgICBNX0RSRU1fM0ksCi0gICAgTV9EUkVNVV8zLAotICAgIE1fRFJFTVVfM0ksCi0gICAgTV9EU1VCX0ksCi0gICAgTV9EU1VCVV9JLAotICAgIE1fRFNVQlVfSV8yLAotICAgIE1fSl9BLAotICAgIE1fSkFMXzEsCi0gICAgTV9KQUxfMiwKLSAgICBNX0pBTF9BLAotICAgIE1fTF9ET0IsCi0gICAgTV9MX0RBQiwKLSAgICBNX0xBX0FCLAotICAgIE1fTEJfQSwKLSAgICBNX0xCX0FCLAotICAgIE1fTEJVX0EsCi0gICAgTV9MQlVfQUIsCi0gICAgTV9MRF9BLAotICAgIE1fTERfT0IsCi0gICAgTV9MRF9BQiwKLSAgICBNX0xEQzFfQUIsCi0gICAgTV9MREMyX0FCLAotICAgIE1fTERDM19BQiwKLSAgICBNX0xETF9BQiwKLSAgICBNX0xEUl9BQiwKLSAgICBNX0xIX0EsCi0gICAgTV9MSF9BQiwKLSAgICBNX0xIVV9BLAotICAgIE1fTEhVX0FCLAotICAgIE1fTEksCi0gICAgTV9MSV9ELAotICAgIE1fTElfREQsCi0gICAgTV9MSV9TLAotICAgIE1fTElfU1MsCi0gICAgTV9MTF9BQiwKLSAgICBNX0xMRF9BQiwKLSAgICBNX0xTX0EsCi0gICAgTV9MV19BLAotICAgIE1fTFdfQUIsCi0gICAgTV9MV0MwX0EsCi0gICAgTV9MV0MwX0FCLAotICAgIE1fTFdDMV9BLAotICAgIE1fTFdDMV9BQiwKLSAgICBNX0xXQzJfQSwKLSAgICBNX0xXQzJfQUIsCi0gICAgTV9MV0MzX0EsCi0gICAgTV9MV0MzX0FCLAotICAgIE1fTFdMX0EsCi0gICAgTV9MV0xfQUIsCi0gICAgTV9MV1JfQSwKLSAgICBNX0xXUl9BQiwKLSAgICBNX0xXVV9BQiwKLSAgICBNX01VTCwKLSAgICBNX01VTF9JLCAKLSAgICBNX01VTE8sCi0gICAgTV9NVUxPX0ksIAotICAgIE1fTVVMT1UsCi0gICAgTV9NVUxPVV9JLCAKLSAgICBNX05PUl9JLAotICAgIE1fT1JfSSwKLSAgICBNX1JFTV8zLAotICAgIE1fUkVNXzNJLAotICAgIE1fUkVNVV8zLAotICAgIE1fUkVNVV8zSSwKLSAgICBNX1JPTCwKLSAgICBNX1JPTF9JLAotICAgIE1fUk9SLAotICAgIE1fUk9SX0ksCi0gICAgTV9TX0RBLAotICAgIE1fU19ET0IsCi0gICAgTV9TX0RBQiwKLSAgICBNX1NfUywKLSAgICBNX1NDX0FCLAotICAgIE1fU0NEX0FCLAotICAgIE1fU0RfQSwKLSAgICBNX1NEX09CLAotICAgIE1fU0RfQUIsCi0gICAgTV9TREMxX0FCLAotICAgIE1fU0RDMl9BQiwKLSAgICBNX1NEQzNfQUIsCi0gICAgTV9TRExfQUIsCi0gICAgTV9TRFJfQUIsCi0gICAgTV9TRVEsCi0gICAgTV9TRVFfSSwKLSAgICBNX1NHRSwKLSAgICBNX1NHRV9JLAotICAgIE1fU0dFVSwKLSAgICBNX1NHRVVfSSwKLSAgICBNX1NHVCwKLSAgICBNX1NHVF9JLAotICAgIE1fU0dUVSwKLSAgICBNX1NHVFVfSSwKLSAgICBNX1NMRSwKLSAgICBNX1NMRV9JLAotICAgIE1fU0xFVSwKLSAgICBNX1NMRVVfSSwKLSAgICBNX1NMVF9JLAotICAgIE1fU0xUVV9JLAotICAgIE1fU05FLAotICAgIE1fU05FX0ksCi0gICAgTV9TQl9BLAotICAgIE1fU0JfQUIsCi0gICAgTV9TSF9BLAotICAgIE1fU0hfQUIsCi0gICAgTV9TV19BLAotICAgIE1fU1dfQUIsCi0gICAgTV9TV0MwX0EsCi0gICAgTV9TV0MwX0FCLAotICAgIE1fU1dDMV9BLAotICAgIE1fU1dDMV9BQiwKLSAgICBNX1NXQzJfQSwKLSAgICBNX1NXQzJfQUIsCi0gICAgTV9TV0MzX0EsCi0gICAgTV9TV0MzX0FCLAotICAgIE1fU1dMX0EsCi0gICAgTV9TV0xfQUIsCi0gICAgTV9TV1JfQSwKLSAgICBNX1NXUl9BQiwKLSAgICBNX1NVQl9JLAotICAgIE1fU1VCVV9JLAotICAgIE1fU1VCVV9JXzIsCi0gICAgTV9URVFfSSwKLSAgICBNX1RHRV9JLAotICAgIE1fVEdFVV9JLAotICAgIE1fVExUX0ksCi0gICAgTV9UTFRVX0ksCi0gICAgTV9UTkVfSSwKLSAgICBNX1RSVU5DV0QsCi0gICAgTV9UUlVOQ1dTLAotICAgIE1fVUxELAotICAgIE1fVUxEX0EsCi0gICAgTV9VTEgsCi0gICAgTV9VTEhfQSwKLSAgICBNX1VMSFUsCi0gICAgTV9VTEhVX0EsCi0gICAgTV9VTFcsCi0gICAgTV9VTFdfQSwKLSAgICBNX1VTSCwKLSAgICBNX1VTSF9BLAotICAgIE1fVVNXLAotICAgIE1fVVNXX0EsCi0gICAgTV9VU0QsCi0gICAgTV9VU0RfQSwKLSAgICBNX1hPUl9JLAotICAgIE1fQ09QMCwKLSAgICBNX0NPUDEsCi0gICAgTV9DT1AyLAotICAgIE1fQ09QMywKLSAgICBNX05VTV9NQUNST1MKLX07Ci0KLQotLyogVGhlIG9yZGVyIG9mIG92ZXJsb2FkZWQgaW5zdHJ1Y3Rpb25zIG1hdHRlcnMuICBMYWJlbCBhcmd1bWVudHMgYW5kCi0gICByZWdpc3RlciBhcmd1bWVudHMgbG9vayB0aGUgc2FtZS4gSW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIGhhdmUgZWl0aGVyCi0gICBmb3IgYXJndW1lbnRzIG11c3QgYXBlYXIgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgaW4gdGhpcyB0YWJsZSBmb3IgdGhlCi0gICBhc3NlbWJsZXIgdG8gcGljayB0aGUgcmlnaHQgb25lLiBJbiBvdGhlciB3b3JkcywgZW50cmllcyB3aXRoCi0gICBpbW1lZGlhdGUgb3BlcmFuZHMgbXVzdCBhcGVhciBhZnRlciB0aGUgc2FtZSBpbnN0cnVjdGlvbiB3aXRoCi0gICByZWdpc3RlcnMuCi0KLSAgIE1hbnkgaW5zdHJ1Y3Rpb25zIGFyZSBzaG9ydCBoYW5kIGZvciBvdGhlciBpbnN0cnVjdGlvbnMgKGkuZS4sIFRoZQotICAgamFsIDxyZWdpc3Rlcj4gaW5zdHJ1Y3Rpb24gaXMgc2hvcnQgZm9yIGphbHIgPHJlZ2lzdGVyPikuICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlIG1pcHNfYnVpbHRpbl9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IGJmZF9taXBzX251bV9idWlsdGluX29wY29kZXM7Ci1leHRlcm4gc3RydWN0IG1pcHNfb3Bjb2RlICptaXBzX29wY29kZXM7Ci1leHRlcm4gaW50IGJmZF9taXBzX251bV9vcGNvZGVzOwotI2RlZmluZSBOVU1PUENPREVTIGJmZF9taXBzX251bV9vcGNvZGVzCi0KLQwKLS8qIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBhZGRzIGRlZmluaXRpb25zIGZvciB0aGUgbWlwczE2IFRpbnlSSVNDCi0gICBwcm9jZXNzb3IuICAqLwotCi0vKiBUaGVzZSBhcmUgdGhlIGJpdG1hc2tzIGFuZCBzaGlmdCBjb3VudHMgdXNlZCBmb3IgdGhlIGRpZmZlcmVudAotICAgZmllbGRzIGluIHRoZSBpbnN0cnVjdGlvbiBmb3JtYXRzLiAgT3RoZXIgdGhhbiBPUCwgbm8gbWFza3MgYXJlCi0gICBwcm92aWRlZCBmb3IgdGhlIGZpeGVkIHBvcnRpb25zIG9mIGFuIGluc3RydWN0aW9uLCBzaW5jZSB0aGV5IGFyZQotICAgbm90IG5lZWRlZC4KLQotICAgVGhlIEkgZm9ybWF0IHVzZXMgSU1NMTEuCi0KLSAgIFRoZSBSSSBmb3JtYXQgdXNlcyBSWCBhbmQgSU1NOC4KLQotICAgVGhlIFJSIGZvcm1hdCB1c2VzIFJYLCBhbmQgUlkuCi0KLSAgIFRoZSBSUkkgZm9ybWF0IHVzZXMgUlgsIFJZLCBhbmQgSU1NNS4KLQotICAgVGhlIFJSUiBmb3JtYXQgdXNlcyBSWCwgUlksIGFuZCBSWi4KLQotICAgVGhlIFJSSV9BIGZvcm1hdCB1c2VzIFJYLCBSWSwgYW5kIElNTTQuCi0KLSAgIFRoZSBTSElGVCBmb3JtYXQgdXNlcyBSWCwgUlksIGFuZCBTSEFNVC4KLQotICAgVGhlIEk4IGZvcm1hdCB1c2VzIElNTTguCi0KLSAgIFRoZSBJOF9NT1ZSMzIgZm9ybWF0IHVzZXMgUlkgYW5kIFJFR1IzMi4KLQotICAgVGhlIElSX01PVjMyUiBmb3JtYXQgdXNlcyBSRUczMlIgYW5kIE1PVjMyWi4KLQotICAgVGhlIEk2NCBmb3JtYXQgdXNlcyBJTU04LgotCi0gICBUaGUgUkk2NCBmb3JtYXQgdXNlcyBSWSBhbmQgSU1NNS4KLSAgICovCi0KLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19PUAkweDFmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX09QCQkxMQotI2RlZmluZSBNSVBTMTZPUF9NQVNLX0lNTTExCTB4N2ZmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTExCTAKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19SWAkweDcKLSNkZWZpbmUgTUlQUzE2T1BfU0hfUlgJCTgKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19JTU04CTB4ZmYKLSNkZWZpbmUgTUlQUzE2T1BfU0hfSU1NOAkwCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfUlkJMHg3Ci0jZGVmaW5lIE1JUFMxNk9QX1NIX1JZCQk1Ci0jZGVmaW5lIE1JUFMxNk9QX01BU0tfSU1NNQkweDFmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTUJMAotI2RlZmluZSBNSVBTMTZPUF9NQVNLX1JaCTB4NwotI2RlZmluZSBNSVBTMTZPUF9TSF9SWgkJMgotI2RlZmluZSBNSVBTMTZPUF9NQVNLX0lNTTQJMHhmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTQJMAotI2RlZmluZSBNSVBTMTZPUF9NQVNLX1JFR1IzMgkweDFmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX1JFR1IzMgkwCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfUkVHMzJSCTB4MWYKLSNkZWZpbmUgTUlQUzE2T1BfU0hfUkVHMzJSCTMKLSNkZWZpbmUgTUlQUzE2T1BfRVhUUkFDVF9SRUczMlIoaSkgKCgoKGkpID4+IDUpICYgNykgfCAoKGkpICYgMHgxOCkpCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfTU9WRTMyWgkweDcKLSNkZWZpbmUgTUlQUzE2T1BfU0hfTU9WRTMyWgkwCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfSU1NNgkweDNmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTYJNQotCi0vKiBUaGVzZSBhcmUgdGhlIGNoYXJhY3RlcnMgd2hpY2ggbWF5IGFwcGVhcnMgaW4gdGhlIGFyZ3MgZmllbGQgb2YgYW4KLSAgIGluc3RydWN0aW9uLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmaWVsZHMgYXBwZWFyCi0gICB3aGVuIHRoZSBpbnN0cnVjdGlvbiBpcyB1c2VkLiAgQ29tbWFzIGFuZCBwYXJlbnRoZXNlcyBpbiB0aGUgYXJncwotICAgc3RyaW5nIGFyZSBpZ25vcmVkIHdoZW4gYXNzZW1ibGluZywgYW5kIHdyaXR0ZW4gaW50byB0aGUgb3V0cHV0Ci0gICB3aGVuIGRpc2Fzc2VtYmxpbmcuCi0KLSAgICJ5IiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9SWSkKLSAgICJ4IiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9SWCkKLSAgICJ6IiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9SWikKLSAgICJaIiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9NT1ZFMzJaKQotICAgInYiIDMgYml0IHNhbWUgcmVnaXN0ZXIgYXMgc291cmNlIGFuZCBkZXN0aW5hdGlvbiAoTUlQUzE2T1BfKl9SWCkKLSAgICJ3IiAzIGJpdCBzYW1lIHJlZ2lzdGVyIGFzIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gKE1JUFMxNk9QXypfUlkpCi0gICAiMCIgemVybyByZWdpc3RlciAoJDApCi0gICAiUyIgc3RhY2sgcG9pbnRlciAoJHNwIG9yICQyOSkKLSAgICJQIiBwcm9ncmFtIGNvdW50ZXIKLSAgICJSIiByZXR1cm4gYWRkcmVzcyByZWdpc3RlciAoJHJhIG9yICQzMSkKLSAgICJYIiA1IGJpdCBNSVBTIHJlZ2lzdGVyIChNSVBTMTZPUF8qX1JFR1IzMikKLSAgICJZIiA1IGJpdCBNSVBTIHJlZ2lzdGVyIChNSVBTMTZPUF8qX1JFRzMyUikKLSAgICI2IiA2IGJpdCB1bnNpZ25lZCBicmVhayBjb2RlIChNSVBTMTZPUF8qX0lNTTYpCi0gICAiYSIgMjYgYml0IGp1bXAgYWRkcmVzcwotICAgImUiIDExIGJpdCBleHRlbnNpb24gdmFsdWUKLSAgICJsIiByZWdpc3RlciBsaXN0IGZvciBlbnRyeSBpbnN0cnVjdGlvbgotICAgIkwiIHJlZ2lzdGVyIGxpc3QgZm9yIGV4aXQgaW5zdHJ1Y3Rpb24KLQotICAgVGhlIHJlbWFpbmluZyBjb2RlcyBtYXkgYmUgZXh0ZW5kZWQuICBFeGNlcHQgYXMgb3RoZXJ3aXNlIG5vdGVkLAotICAgdGhlIGZ1bGwgZXh0ZW5kZWQgb3BlcmFuZCBpcyBhIDE2IGJpdCBzaWduZWQgdmFsdWUuCi0gICAiPCIgMyBiaXQgdW5zaWduZWQgc2hpZnQgY291bnQgKiAwIChNSVBTMTZPUF8qX1JaKSAoZnVsbCA1IGJpdCB1bnNpZ25lZCkKLSAgICI+IiAzIGJpdCB1bnNpZ25lZCBzaGlmdCBjb3VudCAqIDAgKE1JUFMxNk9QXypfUlgpIChmdWxsIDUgYml0IHVuc2lnbmVkKQotICAgIlsiIDMgYml0IHVuc2lnbmVkIHNoaWZ0IGNvdW50ICogMCAoTUlQUzE2T1BfKl9SWikgKGZ1bGwgNiBiaXQgdW5zaWduZWQpCi0gICAiXSIgMyBiaXQgdW5zaWduZWQgc2hpZnQgY291bnQgKiAwIChNSVBTMTZPUF8qX1JYKSAoZnVsbCA2IGJpdCB1bnNpZ25lZCkKLSAgICI0IiA0IGJpdCBzaWduZWQgaW1tZWRpYXRlICogMCAoTUlQUzE2T1BfKl9JTU00KSAoZnVsbCAxNSBiaXQgc2lnbmVkKQotICAgIjUiIDUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NNSkKLSAgICJIIiA1IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiAyIChNSVBTMTZPUF8qX0lNTTUpCi0gICAiVyIgNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogNCAoTUlQUzE2T1BfKl9JTU01KQotICAgIkQiIDUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDggKE1JUFMxNk9QXypfSU1NNSkKLSAgICJqIiA1IGJpdCBzaWduZWQgaW1tZWRpYXRlICogMCAoTUlQUzE2T1BfKl9JTU01KQotICAgIjgiIDggYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NOCkKLSAgICJWIiA4IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiA0IChNSVBTMTZPUF8qX0lNTTgpCi0gICAiQyIgOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogOCAoTUlQUzE2T1BfKl9JTU04KQotICAgIlUiIDggYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NOCkgKGZ1bGwgMTYgYml0IHVuc2lnbmVkKQotICAgImsiIDggYml0IHNpZ25lZCBpbW1lZGlhdGUgKiAwIChNSVBTMTZPUF8qX0lNTTgpCi0gICAiSyIgOCBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqIDggKE1JUFMxNk9QXypfSU1NOCkKLSAgICJwIiA4IGJpdCBjb25kaXRpb25hbCBicmFuY2ggYWRkcmVzcyAoTUlQUzE2T1BfKl9JTU04KQotICAgInEiIDExIGJpdCBicmFuY2ggYWRkcmVzcyAoTUlQUzE2T1BfKl9JTU0xMSkKLSAgICJBIiA4IGJpdCBQQyByZWxhdGl2ZSBhZGRyZXNzICogNCAoTUlQUzE2T1BfKl9JTU04KQotICAgIkIiIDUgYml0IFBDIHJlbGF0aXZlIGFkZHJlc3MgKiA4IChNSVBTMTZPUF8qX0lNTTUpCi0gICAiRSIgNSBiaXQgUEMgcmVsYXRpdmUgYWRkcmVzcyAqIDQgKE1JUFMxNk9QXypfSU1NNSkKLSAgICovCi0KLS8qIEZvciB0aGUgbWlwczE2LCB3ZSB1c2UgdGhlIHNhbWUgb3Bjb2RlIHRhYmxlIGZvcm1hdCBhbmQgYSBmZXcgb2YKLSAgIHRoZSBzYW1lIGZsYWdzLiAgSG93ZXZlciwgbW9zdCBvZiB0aGUgZmxhZ3MgYXJlIGRpZmZlcmVudC4gICovCi0KLS8qIE1vZGlmaWVzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JYLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfWAkJICAgIDB4MDAwMDAwMDEKLS8qIE1vZGlmaWVzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JZLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfWQkJICAgIDB4MDAwMDAwMDIKLS8qIE1vZGlmaWVzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JaLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfWgkJICAgIDB4MDAwMDAwMDQKLS8qIE1vZGlmaWVzIHRoZSBUICgkMjQpIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfVAkJICAgIDB4MDAwMDAwMDgKLS8qIE1vZGlmaWVzIHRoZSBTUCAoJDI5KSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX1NQCQkgICAgMHgwMDAwMDAxMAotLyogTW9kaWZpZXMgdGhlIFJBICgkMzEpIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfMzEJCSAgICAweDAwMDAwMDIwCi0vKiBNb2RpZmllcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUkVHMzJSLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfR1BSX1kJCSAgICAweDAwMDAwMDQwCi0vKiBSZWFkcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SWC4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfWAkJICAgIDB4MDAwMDAwODAKLS8qIFJlYWRzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JZLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9ZCQkgICAgMHgwMDAwMDEwMAotLyogUmVhZHMgdGhlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfTU9WRTMyWi4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfWgkJICAgIDB4MDAwMDAyMDAKLS8qIFJlYWRzIHRoZSBUICgkMjQpIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9UCQkgICAgMHgwMDAwMDQwMAotLyogUmVhZHMgdGhlIFNQICgkMjkpIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9TUAkJICAgIDB4MDAwMDA4MDAKLS8qIFJlYWRzIHRoZSBSQSAoJDMxKSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfMzEJCSAgICAweDAwMDAxMDAwCi0vKiBSZWFkcyB0aGUgcHJvZ3JhbSBjb3VudGVyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9QQwkJICAgIDB4MDAwMDIwMDAKLS8qIFJlYWRzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SRUdSMzIuICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX0dQUl9YCQkgICAgMHgwMDAwNDAwMAotLyogSXMgYSBicmFuY2ggaW5zbi4gKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fQlJBTkNIICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAotCi0vKiBUaGUgZm9sbG93aW5nIGZsYWdzIGhhdmUgdGhlIHNhbWUgdmFsdWUgZm9yIHRoZSBtaXBzMTYgb3Bjb2RlCi0gICB0YWJsZToKLSAgIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWQotICAgSU5TTl9DT05EX0JSQU5DSF9ERUxBWQotICAgSU5TTl9DT05EX0JSQU5DSF9MSUtFTFkgKG5ldmVyIHVzZWQpCi0gICBJTlNOX1JFQURfSEkKLSAgIElOU05fUkVBRF9MTwotICAgSU5TTl9XUklURV9ISQotICAgSU5TTl9XUklURV9MTwotICAgSU5TTl9UUkFQCi0gICBJTlNOX0lTQTMKLSAgICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgbWlwczE2X29wY29kZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgYmZkX21pcHMxNl9udW1fb3Bjb2RlczsKLQotI2VuZGlmIC8qIF9NSVBTX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9tbjEwMjAwLmggYi9pbmNsdWRlL29wY29kZS9tbjEwMjAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZmE5NGIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbW4xMDIwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qIG1uMTAyMDAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgTWF0c3VzaGl0YSAxMDIwMCBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBKZWZmIExhdywgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBNTjEwMjAwX0gKLSNkZWZpbmUgTU4xMDIwMF9ICi0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IG1uMTAyMDBfb3Bjb2RlLiAgKi8KLQotc3RydWN0IG1uMTAyMDBfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIG9wY29kZSBpdHNlbGYuICBUaG9zZSBiaXRzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKLSAgICAgb3BlcmFuZHMgYXJlIHplcm9lcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotCi0gIC8qIFRoZSBvcGNvZGUgbWFzay4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVGhpcyBpcyBhCi0gICAgIG1hc2sgY29udGFpbmluZyBvbmVzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBtdXN0IG1hdGNoIHRoZQotICAgICBvcGNvZGUgZmllbGQsIGFuZCB6ZXJvZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG5lZWQgbm90Ci0gICAgIG1hdGNoIChhbmQgYXJlIHByZXN1bWFibHkgZmlsbGVkIGluIGJ5IG9wZXJhbmRzKS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLQotICAvKiBUaGUgZm9ybWF0IG9mIHRoaXMgb3Bjb2RlLiAgKi8KLSAgdW5zaWduZWQgY2hhciBmb3JtYXQ7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZQotICAgICBvcGVyYW5kIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0Ci0gICAgIGFwcGVhciBpbiBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s4XTsKLX07Ci0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKLSAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgbW4xMDIwMF9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IG1uMTAyMDBfbnVtX29wY29kZXM7Ci0KLQwKLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kLiAgKi8KLQotc3RydWN0IG1uMTAyMDBfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpbnQgc2hpZnQ7Ci0KLSAgLyogT25lIGJpdCBzeW50YXggZmxhZ3MuICAqLwotICBpbnQgZmxhZ3M7Ci19OwotCi0vKiBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIHJldHJpZXZlZCBieSBpbmRleGluZyB3aXRoIHZhbHVlcyBmcm9tCi0gICB0aGUgb3BlcmFuZHMgZmllbGQgb2YgdGhlIG1uMTAyMDBfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kIG1uMTAyMDBfb3BlcmFuZHNbXTsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBtbjEwMjAwX29wZXJhbmQuICAqLwotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfRFJFRyAweDEKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfQVJFRyAweDIKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfUFNXIDB4NAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9NRFIgMHg4Ci0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCAweDEwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1BST01PVEUgMHgyMAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9QQVJFTiAweDQwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1JFUEVBVEVEIDB4ODAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfRVhURU5ERUQgMHgxMDAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfTk9DSEVDSyAweDIwMAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9QQ1JFTCAweDQwMAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9NRU1BRERSIDB4ODAwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1JFTEFYIDB4MTAwMAotCi0jZGVmaW5lIEZNVF8xIDEKLSNkZWZpbmUgRk1UXzIgMgotI2RlZmluZSBGTVRfMyAzCi0jZGVmaW5lIEZNVF80IDQKLSNkZWZpbmUgRk1UXzUgNQotI2RlZmluZSBGTVRfNiA2Ci0jZGVmaW5lIEZNVF83IDcKLSNlbmRpZiAvKiBNTjEwMjAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL21uMTAzMDAuaCBiL2luY2x1ZGUvb3Bjb2RlL21uMTAzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRlNGIwYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9tbjEwMzAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyogbW4xMDMwMC5oIC0tIEhlYWRlciBmaWxlIGZvciBNYXRzdXNoaXRhIDEwMzAwIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEplZmYgTGF3LCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIE1OMTAzMDBfSAotI2RlZmluZSBNTjEwMzAwX0gKLQotLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUuICAqLwotCi0jZGVmaW5lIE1OMTAzMDBfTUFYX09QRVJBTkRTIDgKLXN0cnVjdCBtbjEwMzAwX29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoCi0gICAgIG9wZXJhbmRzIGFyZSB6ZXJvZXMuICAqLwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQotICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAotICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0KLSAgLyogQSBiaXRtYXNrLiAgRm9yIGVhY2ggb3BlcmFuZCwgbm9uemVybyBpZiBpdCBtdXN0IG5vdCBoYXZlIHRoZSBzYW1lCi0gICAgIHJlZ2lzdGVyIHNwZWNpZmljYXRpb24gYXMgYWxsIG90aGVyIG9wZXJhbmRzIHdpdGggYSBub256ZXJvIGJpdCBpbgotICAgICB0aGlzIGZsYWcuICBpZSAweDgxIHdvdWxkIGluZGljYXRlIHRoYXQgb3BlcmFuZHMgNyBhbmQgMCBtdXN0IG5vdAotICAgICBtYXRjaC4gIE5vdGUgdGhhdCB3ZSBjb3VudCBvcGVyYW5kcyBmcm9tIGxlZnQgdG8gcmlnaHQgYXMgdGhleSBhcHBlYXIKLSAgICAgaW4gdGhlIG9wZXJhbmRzIHNwZWNpZmljYXRpb24gYmVsb3cuICAqLwotICB1bnNpZ25lZCBpbnQgbm9fbWF0Y2hfb3BlcmFuZHM7Ci0KLSAgLyogVGhlIGZvcm1hdCBvZiB0aGlzIG9wY29kZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgZm9ybWF0OwotCi0gIC8qIEJpdG1hc2sgaW5kaWNhdGluZyB3aGF0IGNwdSB2YXJpYW50cyB0aGlzIG9wY29kZSBpcyBhdmFpbGFibGUgb24uCi0gICAgIFdlIGFzc3VtZSBtbjEwMzAwIGJhc2Ugb3Bjb2RlcyBhcmUgYXZhaWxhYmxlIGV2ZXJ5d2hlcmUsIHNvIHdlIG9ubHkKLSAgICAgaGF2ZSB0byBub3RlIG9wY29kZXMgd2hpY2ggYXJlIGF2YWlsYWJsZSBvbiBvdGhlciB2YXJpYW50cy4gICovCi0gIHVuc2lnbmVkIGludCBtYWNoaW5lOwotCi0gIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMuICBFYWNoIGNvZGUgaXMgYW4gaW5kZXggaW50byB0aGUKLSAgICAgb3BlcmFuZCB0YWJsZS4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciB3aGljaCB0aGUgb3BlcmFuZHMgbXVzdAotICAgICBhcHBlYXIgaW4gYXNzZW1ibHkgY29kZSwgYW5kIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgemVyby4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbTU4xMDMwMF9NQVhfT1BFUkFORFNdOwotfTsKLQotLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZQotICAgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyCi0gICBpbnN0cnVjdGlvbnMuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wY29kZSBtbjEwMzAwX29wY29kZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgbW4xMDMwMF9udW1fb3Bjb2RlczsKLQotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBtbjEwMzAwX29wZXJhbmQuICAqLwotCi1zdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kCi17Ci0gIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb3BlcmFuZC4gICovCi0gIGludCBiaXRzOwotCi0gIC8qIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGludCBzaGlmdDsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0gIGludCBmbGFnczsKLX07Ci0KLS8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KLSAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgbW4xMDMwMF9vcGNvZGVzIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgbW4xMDMwMF9vcGVyYW5kc1tdOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IG1uMTAzMDBfb3BlcmFuZC4gICovCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9EUkVHIDB4MQotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9BUkVHIDB4MgotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9TUCAweDQKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUFNXIDB4OAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9NRFIgMHgxMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9TSUdORUQgMHgyMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFIDB4NDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUEFSRU4gMHg4MAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRCAweDEwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9FWFRFTkRFRCAweDIwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9TUExJVCAweDQwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVCAweDgwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9QQ1JFTCAweDEwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfTUVNQUREUiAweDIwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUkVMQVggMHg0MDAwCi0KLQotLyogT3Bjb2RlIEZvcm1hdHMuICAqLwotI2RlZmluZSBGTVRfUzAgMQotI2RlZmluZSBGTVRfUzEgMgotI2RlZmluZSBGTVRfUzIgMwotI2RlZmluZSBGTVRfUzQgNAotI2RlZmluZSBGTVRfUzYgNQotI2RlZmluZSBGTVRfRDAgNgotI2RlZmluZSBGTVRfRDEgNwotI2RlZmluZSBGTVRfRDIgOAotI2RlZmluZSBGTVRfRDQgOQotI2RlZmluZSBGTVRfRDUgMTAKLQotLyogVmFyaWFudHMgb2YgdGhlIG1uMTAzMDAgd2hpY2ggaGF2ZSBhZGRpdGlvbmFsIG9wY29kZXMuICAqLwotI2RlZmluZSBNTjEwMyAzMDAKLSNkZWZpbmUgQU0zMCAgMzAwCi0KLQotI2VuZGlmIC8qIE1OMTAzMDBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvbnAxLmggYi9pbmNsdWRlL29wY29kZS9ucDEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIzYWRjNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9ucDEuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKiBQcmludCBHT1VMRCBOUEwgaW5zdHJ1Y3Rpb25zIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0RCOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1zdHJ1Y3QgZ2xkX29wY29kZQotewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotICBjaGFyICphcmdzOwotICBpbnQgbGVuZ3RoOwotfTsKLQotLyogV2Ugc3RvcmUgZm91ciBieXRlcyBvZiBvcGNvZGUgZm9yIGFsbCBvcGNvZGVzIGJlY2F1c2UgdGhhdAotICAgaXMgdGhlIG1vc3QgYW55IG9mIHRoZW0gbmVlZC4gIFRoZSBhY3R1YWwgbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uCi0gICBpcyBhbHdheXMgYXQgbGVhc3QgMiBieXRlcywgYW5kIGF0IG1vc3QgZm91ci4gIFRoZSBsZW5ndGggb2YgdGhlCi0gICBpbnN0cnVjdGlvbiBpcyBiYXNlZCBvbiB0aGUgb3Bjb2RlLgotCi0gICBUaGUgbWFzayBjb21wb25lbnQgaXMgYSBtYXNrIHNheWluZyB3aGljaCBiaXRzIG11c3QgbWF0Y2gKLSAgIHBhcnRpY3VsYXIgb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZQotICAgb2YgdGhhdCBvcGNvZGUuCi0KLSAgIFRoZSBhcmdzIGNvbXBvbmVudCBpcyBhIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMKLSAgIHRoYXQgYXJlIHVzZWQgdG8gZm9ybWF0IHRoZSBhcmd1bWVudHMgdG8gdGhlIGluc3RydWN0aW9uLiAqLwotCi0vKiBLaW5kcyBvZiBvcGVyYW5kczoKLSAgIHIgIFJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBSICBSZWdpc3RlciBpbiBzZWNvbmQgZmllbGQKLSAgIGIgIEJhc2UgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIEIgIEJhc2UgcmVnaXN0ZXIgaW4gc2Vjb25kIGZpZWxkCi0gICB2ICBWZWN0b3IgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIFYgIFZlY3RvciByZWdpc3RlciBpbiBmaXJzdCBmaWVsZAotICAgQSAgT3B0aW9uYWwgYWRkcmVzcyByZWdpc3RlciAoYmFzZSByZWdpc3RlcikKLSAgIFggIE9wdGlvbmFsIGluZGV4IHJlZ2lzdGVyCi0gICBJICBJbW1lZGlhdGUgZGF0YSAoMTZiaXRzIHNpZ25lZCkKLSAgIE8gIE9mZnNldCBmaWVsZCAoMTZiaXRzIHNpZ25lZCkKLSAgIGggIE9mZnNldCBmaWVsZCAoMTViaXRzIHNpZ25lZCkKLSAgIGQgIE9mZnNldCBmaWVsZCAoMTRiaXRzIHNpZ25lZCkKLSAgIFMgIFNoaWZ0IGNvdW50IGZpZWxkCi0KLSAgIGFueSBvdGhlciBjaGFyYWN0ZXJzIGFyZSBwcmludGVkIGFzIGlzLi4uCi0qLwotCi0vKiBUaGUgYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgdGhpcyBhcnJheSBiZSBzb3J0ZWQgYXMgZm9sbG93czoKLSAgIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdCBiZSBjb25zZWN1dGl2ZS4KLSAgIEFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygb3BlcmFuZHMKLSAgIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gKi8KLXN0cnVjdCBnbGRfb3Bjb2RlIGdsZF9vcGNvZGVzW10gPQotewoteyAibGIiLAkJMHhiNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsbmIiLAkweGI4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxicyIsCTB4ZWMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGgiLAkJMHhiNDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJsbmgiLAkweGI4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImx3IiwJCTB4YjQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibG53IiwJMHhiODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsZCIsCQkweGI0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImxuZCIsCTB4YjgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAibGkiLAkJMHhmODAwMDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJscGEiLAkweDUwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxhIiwJCTB4NTAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGFiciIsCTB4NTgwODAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAibGJwIiwJMHg5MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsaHAiLAkweDkwMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImx3cCIsCTB4OTAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGRwIiwJMHg5MDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdWFiciIsCTB4NTgwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAibGYiLAkJMHhiYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsZmJyIiwJMHhiYzA4MDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJsd2JyIiwJMHg1YzAwMDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJzdGIiLAkweGQ0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0aCIsCTB4ZDQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAic3R3IiwJMHhkNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGQiLAkweGQ0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN0ZiIsCTB4ZGMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RmYnIiLAkweGRjMDgwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgInN0d2JyIiwJMHg1NDAwMDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJ6bWIiLAkweGQ4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInptaCIsCTB4ZDgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiem13IiwJMHhkODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ6bWQiLAkweGQ4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN0YnAiLAkweDk0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0aHAiLAkweDk0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInN0d3AiLAkweDk0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0ZHAiLAkweDk0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImxpbCIsCTB4ZjgwYjAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEQiLAkJNCB9LAoteyAibHdzbDEiLAkweGVjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImx3c2wyIiwJMHhmYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsd3NsMyIsCTB4ZmMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAotCi17ICJsdmIiLAkweGIwMDgwMDAwLAkweGZjMDgwMDAwLAkidix4T0EsWCIsCTQgfSwKLXsgImx2aCIsCTB4YjAwMDAwMDEsCTB4ZmMwODAwMDEsCSJ2LHhPQSxYIiwJNCB9LAoteyAibHZ3IiwJMHhiMDAwMDAwMCwJMHhmYzA4MDAwMCwJInYseE9BLFgiLAk0IH0sCi17ICJsdmQiLAkweGIwMDAwMDAyLAkweGZjMDgwMDAyLAkidix4T0EsWCIsCTQgfSwKLXsgImxpdiIsCTB4M2MwNDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibGl2ZiIsCTB4M2MwODAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAic3R2YiIsCTB4ZDAwODAwMDAsCTB4ZmMwODAwMDAsCSJ2LHhPQSxYIiwJNCB9LAoteyAic3R2aCIsCTB4ZDAwMDAwMDEsCTB4ZmMwODAwMDEsCSJ2LHhPQSxYIiwJNCB9LAoteyAic3R2dyIsCTB4ZDAwMDAwMDAsCTB4ZmMwODAwMDAsCSJ2LHhPQSxYIiwJNCB9LAoteyAic3R2ZCIsCTB4ZDAwMDAwMDIsCTB4ZmMwODAwMDIsCSJ2LHhPQSxYIiwJNCB9LAotCi17ICJ0cnIiLAkweDJjMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRybiIsCTB4MmMwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJuZCIsCTB4MmMwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJhYnMiLAkweDJjMDEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyYWJzZCIsCTB4MmMwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJjIiwJMHgyYzAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ4Y3IiLAkweDI4MDQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImN4Y3IiLAkweDJjMDYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImN4Y3JkIiwJMHgyYzBlMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0YnJyIiwJMHgyYzAyMDAwMCwJMHhmYzBmMDAwMCwJInIsQiIsCQkyIH0sCi17ICJ0cmJyIiwJMHgyODAzMDAwMCwJMHhmYzBmMDAwMCwJImIsUiIsCQkyIH0sCi17ICJ4Y2JyIiwJMHgyODAyMDAwMCwJMHhmYzBmMDAwMCwJImIsQiIsCQkyIH0sCi17ICJ0YnJiciIsCTB4MjgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJiLEIiLAkJMiB9LAotCi17ICJ0cnZ2IiwJMHgyODA1MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJ0cnZ2biIsCTB4MmMwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAidHJ2dm5kIiwJMHgyYzBkMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJ0cnZhYiIsCTB4MmMwNzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAidHJ2YWJkIiwJMHgyYzBmMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJjbXB2IiwJMHgxNDA2MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJleHB2IiwJMHgxNDA3MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcnZ2bHQiLAkweDEwMDMwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1ydnZsZSIsCTB4MTAwNDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2dmd0IiwJMHgxNDAzMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcnZ2Z2UiLAkweDE0MDQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1ydnZlcSIsCTB4MTAwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2dm5lIiwJMHgxMDA1MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcnZybHQiLAkweDEwMGQwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1ydnJsZSIsCTB4MTAwZTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXJ2cmd0IiwJMHgxNDBkMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJtcnZyZ2UiLAkweDE0MGUwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1ydnJlcSIsCTB4MTAwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXJ2cm5lIiwJMHgxNDBmMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJ0cnZyIiwJMHgxNDBiMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJ0cnJ2IiwJMHgxNDBjMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi0KLXsgImJ1IiwJCTB4NDAwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJucyIsCTB4NzAwODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJuY28iLAkweDcwODgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJiZ2UiLAkweDcxMDgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJibmUiLAkweDcxODgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJidW5nZSIsCTB4NzIwODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJ1bmxlIiwJMHg3Mjg4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmd0IiwJMHg3MzA4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYm5hbnkiLAkweDczODgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJicyIJLAkweDcwMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJiY28iLAkweDcwODAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJibHQiLAkweDcxMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJiZXEiLAkweDcxODAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJidWdlIiwJMHg3MjAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnVsdCIsCTB4NzI4MDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJsZSIsCTB4NzMwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJhbnkiLAkweDczODAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJicmxuayIsCTB4NDQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYmliIiwJMHg0ODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiaWgiLAkweDQ4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJpdyIsCTB4NGMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYmlkIiwJMHg0YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiaXZiIiwJMHg2MDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiaXZoIiwJMHg2MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiaXZ3IiwJMHg2NDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiaXZkIiwJMHg2NDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJidnNiIiwJMHg2ODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJidnNoIiwJMHg2ODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJidnN3IiwJMHg2YzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJidnNkIiwJMHg2YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi0KLXsgImNhbWIiLAkweDgwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImNhbWgiLAkweDgwMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImNhbXciLAkweDgwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImNhbWQiLAkweDgwMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImNhciIsCTB4MTAwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiY2FyZCIsCTB4MTQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiY2kiLAkJMHhmODA1MDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJjaGtibmQiLAkweDVjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLQoteyAiY2F2diIsCTB4MTAwMTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiY2F2ciIsCTB4MTAwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAiY2F2dmQiLAkweDEwMDkwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImNhdnJkIiwJMHgxMDBiMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi0KLXsgImFubWIiLAkweDg0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFubWgiLAkweDg0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImFubXciLAkweDg0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFubWQiLAkweDg0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImFuciIsCTB4MDQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYW5pIiwJMHhmODA4MDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJvcm1iIiwJMHhiODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJvcm1oIiwJMHhiODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJvcm13IiwJMHhiODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJvcm1kIiwJMHhiODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJvcnIiLAkweDA4MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm9pIiwJCTB4ZjgwOTAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiZW9tYiIsCTB4OGMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9taCIsCTB4OGMwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9tdyIsCTB4OGMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9tZCIsCTB4OGMwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9yIiwJMHgwYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJlb2kiLAkweGY4MGEwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLQoteyAiYW52diIsCTB4MDQwMTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiYW52ciIsCTB4MDQwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAib3J2diIsCTB4MDgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAib3J2ciIsCTB4MDgwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAiZW92diIsCTB4MGMwMTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiZW92ciIsCTB4MGMwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAotCi17ICJzYWN6IiwJMHgxMDBjMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzbGEiLAkweDFjNDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNsbCIsCTB4MWM2MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xjIiwJMHgyNDQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGFkIiwJMHgyMDQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGxkIiwJMHgyMDYwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmEiLAkweDFjMDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNybCIsCTB4MWMyMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JjIiwJMHgyNDAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmFkIiwJMHgyMDAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmxkIiwJMHgyMDIwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzZGEiLAkweDNjMDMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInNkbCIsCTB4M2MwMjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic2RjIiwJMHgzYzAxMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzZGFkIiwJMHgzYzBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzZGxkIiwJMHgzYzBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi0KLXsgInN2ZGEiLAkweDNjMDcwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN2ZGwiLAkweDNjMDYwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN2ZGMiLAkweDNjMDUwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN2ZGFkIiwJMHgzYzBlMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdmRsZCIsCTB4M2MwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAotCi17ICJzYm0iLAkweGFjMDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgInpibSIsCTB4YWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAidGJtIiwJMHhhODA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJpbmNtYiIsCTB4YTAwMDAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImluY21oIiwJMHhhMDA4MDAwMCwJMHhmYzA4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiaW5jbXciLAkweGE0MDAwMDAwLAkweGZjMDgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJpbmNtZCIsCTB4YTQwODAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgInNibWQiLAkweDdjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInpibWQiLAkweDdjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInRibWQiLAkweDc4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLQoteyAic3NtIiwJMHg5YzA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJ6c20iLAkweDljMDAwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgInRzbSIsCTB4OTgwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAotCi17ICJhZG1iIiwJMHhjODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhZG1oIiwJMHhjODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJhZG13IiwJMHhjODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhZG1kIiwJMHhjODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhZHIiLAkweDM4MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFybWIiLAkweGU4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFybWgiLAkweGU4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImFybXciLAkweGU4MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFybWQiLAkweGU4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImFkaSIsCTB4ZjgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAic3VtYiIsCTB4Y2MwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VtaCIsCTB4Y2MwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VtdyIsCTB4Y2MwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VtZCIsCTB4Y2MwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VyIiwJMHgzYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzdWkiLAkweGY4MDIwMDAwLAkweGZjMGYwMDAwLAkicixJIiwJCTQgfSwKLXsgIm1wbWIiLAkweGMwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgIm1wbWgiLAkweGMwMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgIm1wbXciLAkweGMwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgIm1wciIsCTB4MzgwMjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibXByZCIsCTB4M2MwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibXBpIiwJMHhmODAzMDAwMCwJMHhmYzBmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJkdm1iIiwJMHhjNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJkdm1oIiwJMHhjNDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJkdm13IiwJMHhjNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJkdnIiLAkweDM4MGEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImR2aSIsCTB4ZjgwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiZXhzIiwJMHgzODA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi0KLXsgImFkdnYiLAkweDMwMDAwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImFkdnZkIiwJMHgzMDA4MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJhZHJ2IiwJMHgzNDAwMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJhZHJ2ZCIsCTB4MzQwODAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAic3V2diIsCTB4MzAwMTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAic3V2dmQiLAkweDMwMDkwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInN1cnYiLAkweDM0MDEwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN1cnZkIiwJMHgzNDA5MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJtcHZ2IiwJMHgzMDAyMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcHJ2IiwJMHgzNDAyMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi0KLXsgImFkZnciLAkweGUwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFkZmQiLAkweGUwMDgwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImFkcmZ3IiwJMHgzODAxMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhZHJmZCIsCTB4MzgwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic3VyZnciLAkweGUwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1cmZkIiwJMHhlMDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdXJmdyIsCTB4MzgwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic3VyZmQiLAkweDM4MGIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm1wZnciLAkweGU0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgIm1wZmQiLAkweGU0MDgwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgIm1wcmZ3IiwJMHgzODA2MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJtcHJmZCIsCTB4MzgwZTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAicmZ3IiwJMHhlNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJyZmQiLAkweGU0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInJyZnciLAkweDBjMGUwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJycmZkIiwJMHgwYzBmMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAotCi17ICJhZHZ2ZnciLAkweDMwMDQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImFkdnZmZCIsCTB4MzAwYzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiYWRydmZ3IiwJMHgzNDA0MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJhZHJ2ZmQiLAkweDM0MGMwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN1dnZmdyIsCTB4MzAwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAic3V2dmZkIiwJMHgzMDBkMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJzdXJ2ZnciLAkweDM0MDUwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN1cnZmZCIsCTB4MzQwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXB2dmZ3IiwJMHgzMDA2MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcHZ2ZmQiLAkweDMwMGUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1wcnZmdyIsCTB4MzQwNjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXBydmZkIiwJMHgzNDBlMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJydmZ3IiwJMHgzMDA3MDAwMCwJMHhmYzBmMDAwMCwJInYiLAkJMiB9LAoteyAicnZmZCIsCTB4MzAwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2IiwJCTIgfSwKLQoteyAiZmx0dyIsCTB4MzgwNzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZmx0ZCIsCTB4MzgwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZml4dyIsCTB4MzgwNTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZml4ZCIsCTB4MzgwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiY2ZwZHMiLAkweDNjMDkwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLQoteyAiZmx0dnciLAkweDA4MGQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImZsdHZkIiwJMHgwODBmMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJmaXh2dyIsCTB4MDgwYzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiZml4dmQiLAkweDA4MGUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImNmcHZkcyIsCTB4MGMwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAotCi17ICJvcnZybiIsCTB4MDAwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAiYW5kdnJuIiwJMHgwMDA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJmcnN0ZXEiLAkweDA0MDkwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgInNpZ21hIiwJMHgwYzA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJzaWdtYWQiLAkweDBjMGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgInNpZ21mIiwJMHgwODA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJzaWdtZmQiLAkweDA4MGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgInByb2RmIiwJMHgwNDA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJwcm9kZmQiLAkweDA0MGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgIm1heHYiLAkweDEwMDgwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgIm1heHZkIiwJMHgxMDBhMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJtaW52IiwJMHgxNDA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJtaW52ZCIsCTB4MTQwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAotCi17ICJscHNkIiwJMHhmMDAwMDAwMCwJMHhmYzA4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAibGRjIiwJMHhmMDA4MDAwMCwJMHhmYzA4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAic3BtIiwJMHgwNDBjMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAicnBtIiwJMHgwNDBkMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAidHJpdHIiLAkweDAwMDcwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJ0cnJpdCIsCTB4MDAwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJwc3d0IiwJMHgwNDA4MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAiZXhyIiwJMHhmODA3MDAwMCwJMHhmYzBmMDAwMCwJIiIsCQk0IH0sCi17ICJoYWx0IiwJMHgwMDAwMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJ3YWl0IiwJMHgwMDAxMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJub3AiLAkweDAwMDIwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImVpYWUiLAkweDAwMDMwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImVmYWUiLAkweDAwMGQwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImRpYWUiLAkweDAwMGUwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImRmYWUiLAkweDAwMGYwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgInNwdmMiLAkweGY4MDYwMDAwLAkweGZjMGYwMDAwLAkicixULE4iLAk0IH0sCi17ICJyZHN0cyIsCTB4MDAwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInNldGNwdSIsCTB4MDAwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImNtYyIsCTB4MDAwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInRycmN1IiwJMHgwMDA0MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAiYXR0bmlvIiwJMHgwMDA1MDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJmdWRpdCIsCTB4MjgwODAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAiYnJlYWsiLAkweDI4MDkwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImZyenNzIiwJMHgyODBhMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJyaXBpIiwJMHgwNDA0MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ4Y3AiLAkweDA0MDUwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJibG9jayIsCTB4MDQwNjAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAidW5ibG9jayIsCTB4MDQwNzAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAidHJzYyIsCTB4MDgwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHNjciIsCTB4MDgwNzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZnEiLAkJMHgwNDA4MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAiZmx1cHRlIiwJMHgyYzA4MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAicnZpdSIsCTB4MDQwZjAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAibGRlbCIsCTB4MjgwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibGR1IiwJMHgyODBkMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzdGRlY2MiLAkweDI4MGIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRycGMiLAkweDA4MDQwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJ0cGNyIiwJMHgwODA1MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAiZ2hhbHQiLAkweDBjMDUwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJncnVuIiwJMHgwYzA0MDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJ0bXByIiwJMHgyYzBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cm1wIiwJMHgyYzBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi0KLXsgInRycnZlIiwJMHgyODA2MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAidHJ2ZXIiLAkweDI4MDcwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJ0cnZsciIsCTB4MjgwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLQoteyAibGlua2ZsIiwJMHgxODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJsaW5rYmwiLAkweDE4MDIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImxpbmtmcCIsCTB4MTgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibGlua2JwIiwJMHgxODAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJsaW5rcGwiLAkweDE4MDQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInVsaW5rbCIsCTB4MTgwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidWxpbmtwIiwJMHgxODA5MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ1bGlua3RsIiwJMHgxODBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ1bGlua3RwIiwJMHgxODBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi19OwotCi1pbnQgbnVtb3Bjb2RlcyA9IHNpemVvZihnbGRfb3Bjb2RlcykgLyBzaXplb2YoZ2xkX29wY29kZXNbMF0pOwotCi1zdHJ1Y3QgZ2xkX29wY29kZSAqZW5kb3AgPSBnbGRfb3Bjb2RlcyArIHNpemVvZihnbGRfb3Bjb2RlcykgLwotCQkgCQlzaXplb2YoZ2xkX29wY29kZXNbMF0pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvbnMzMmsuaCBiL2luY2x1ZGUvb3Bjb2RlL25zMzJrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYmI4YjguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbnMzMmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi0vKiBuczMyay1vcGNvZGUuaCAtLSBPcGNvZGUgdGFibGUgZm9yIE5hdGlvbmFsIFNlbWkgMzJrIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IChDKSAxOTg3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2lmZGVmIFNFUVVFTlRfQ09NUEFUQUJJTElUWQotI2RlZmluZSBERUZfTU9ERUMgMjAKLSNkZWZpbmUgREVGX01PREVMIDIxCi0jZW5kaWYKLQotI2lmbmRlZiBERUZfTU9ERUMKLSNkZWZpbmUgREVGX01PREVDIDIwCi0jZW5kaWYKLQotI2lmbmRlZiBERUZfTU9ERUwKLSNkZWZpbmUgREVGX01PREVMIDIwCi0jZW5kaWYKLS8qCi0gICBBZnRlciBkZWNpZGluZyB0aGUgaW5zdHJ1Y3Rpb24gZW50cnkgKHZpYSBoYXNoLmMpIHRoZSBpbnN0cnVjdGlvbiBwYXJzZXIKLSAgIHdpbGwgdHJ5IHRvIG1hdGNoIHRoZSBvcGVyYW5kcyBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIHJlcXVpcmVkIHNldAotICAgZ2l2ZW4gaW4gdGhlIGVudHJ5IG9wZXJhbmRmaWVsZC4gRXZlcnkgb3BlcmFuZCB3aWxsIHJlc3VsdCBpbiBhIGNoYW5nZSBpbgotICAgdGhlIG9wY29kZSBvciB0aGUgYWRkaXRpb24gb2YgZGF0YSB0byB0aGUgb3Bjb2RlLgotICAgVGhlIG9wZXJhbmRzIGluIHRoZSBzb3VyY2UgaW5zdHJ1Y3Rpb24gYXJlIGNoZWNrZWQgZm9yIGluY29uc2lzdGVudAotICAgc2VtYW50aWNzLgotIAotCUYgOiAzMiBiaXQgZmxvYXQJZ2VuZXJhbCBmb3JtCi0JTCA6IDY0IGJpdCBmbG9hdAkgICAgIgotCUIgOiBieXRlCQkgICAgIgotCVcgOiB3b3JkCQkgICAgIgotCUQgOiBkb3VibGUtd29yZAkJICAgICIKLQlBIDogZG91YmxlLXdvcmQJCWdlbi1hZGRyZXNzLWZvcm0gaWUgbm8gcmVncywgbm8gaW1tZWRpYXRlCi0JSSA6IGludGVnZXIgd3JpdGVhYmxlICAgZ2VuIGludCBleGNlcHQgaW1tZWRpYXRlIChBICsgcmVnKQotCVogOiBmbG9hdGluZyB3cml0ZWFibGUJZ2VuIGZsb2F0IGV4Y2VwdCBpbW1lZGlhdGUgKFogKyBmcmVnKQotCWQgOiBkaXNwbGFjZW1lbnQKLQliIDogZGlzcGxhY2VtZW50IC0gcGMgcmVsYXRpdmUgYWRkcmVzc2luZyAgYWNiCi0JcCA6IGRpc3BsYWNlbWVudCAtIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcgIGJyIGJjb25kIGJzciBjeHAKLQlxIDogcXVpY2sKLQlpIDogaW1tZWRpYXRlICg4IGJpdHMpCi0JICAgIFRoaXMgaXMgbm90IGEgc3RhbmRhcmQgbnMzMmsgb3BlcmFuZHR5cGUsIGl0IGlzIHVzZWQgdG8gYnVpbGQKLQkgICAgaW5zdHJ1Y3Rpb25zIGxpa2UgICAgc3ZjIGFyZzEsYXJnMgotCSAgICBTdmMgaXMgdGhlIGluc3RydWN0aW9uIFN1cGVyVmlzb3JDYWxsIGFuZCBpcyBzb21ldGltZXMgdXNlZCB0bwotCSAgICBjYWxsIE9TLXJvdXRpbmVzIGZyb20gdXNlcm1vZGUuIFNvbWUgYXJncyBtaWdodCBiZSBoYW5keSEKLQlyIDogcmVnaXN0ZXIgbnVtYmVyICgzIGJpdHMpCi0JTyA6IHNldGNmZyBpbnN0cnVjdGlvbiBvcHRpb25zbGlzdAotCUMgOiBjaW52IGluc3RydWN0aW9uIG9wdGlvbnNsaXN0Ci0JUyA6IHN0cmluZ2luc3RydWN0aW9uIG9wdGlvbnNsaXN0Ci0JVSA6IHJlZ2lzdGVybGlzdAlzYXZlLGVudGVyCi0JdSA6IHJlZ2lzdGVybGlzdAlyZXN0b3JlLGV4aXQKLQlNIDogbW11IHJlZ2lzdGVyCi0JUCA6IGNwdSByZWdpc3RlcgotCWcgOiAzOnJkIG9wZXJhbmQgb2YgaW5zcyBvciBleHRzIGluc3RydWN0aW9uCi0JRyA6IDQ6dGggb3BlcmFuZCBvZiBpbnNzIG9yIGV4dHMgaW5zdHJ1Y3Rpb24KLQkgICAgVGhvc2Ugb3BlcmFuZHMgYXJlIGVuY29kZWQgaW4gdGhlIHNhbWUgYnl0ZS4KLQkgICAgVGhpcyBieXRlIGlzIHBsYWNlZCBsYXN0IGluIHRoZSBpbnN0cnVjdGlvbi4KLQlmIDogb3BlcmFuZCBvZiBzZnNyCi0JSCA6IHNlcXVlbnQtaGFjayBmb3IgYnNyIChXYXJuaW5nKQotCi1jb2x1bW4JMSAJaW5zdHJ1Y3Rpb25zCi0JMiAJbnVtYmVyIG9mIGJpdHMgaW4gb3Bjb2RlLgotCTMgCW51bWJlciBvZiBiaXRzIGluIG9wY29kZSBleHBsaWNpdGx5Ci0JCWRldGVybWluZWQgYnkgdGhlIGluc3RydWN0aW9uIHR5cGUuCi0JNCAJb3Bjb2Rlc2VlZCwgdGhlIG51bWJlciB3ZSBidWlsZCBvdXIgb3Bjb2RlCi0JCWZyb20uCi0JNSAJb3BlcmFuZHR5cGVzLCB1c2VkIGJ5IG9wZXJhbmRwYXJzZXIuCi0JNiAJc2l6ZSBpbiBieXRlcyBvZiBpbW1lZGlhdGUKLSovCi1zdHJ1Y3QgbnMzMmtfb3Bjb2RlIHsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgY2hhciBvcGNvZGVfaWRfc2l6ZTsgLyogbm90IHVzZWQgYnkgdGhlIGFzc2VtYmxlciAqLwotICB1bnNpZ25lZCBjaGFyIG9wY29kZV9zaXplOwotICB1bnNpZ25lZCBsb25nIG9wY29kZV9zZWVkOwotICBjaGFyICpvcGVyYW5kczsKLSAgdW5zaWduZWQgY2hhciBpbV9zaXplOwkvKiBub3QgdXNlZCBieSBkaXNzYXNzZW1ibGVyICovCi0gIGNoYXIgKmRlZmF1bHRfYXJnczsJCS8qIGRlZmF1bHQgdG8gdGhvc2UgYXJncyB3aGVuIG5vbmUgZ2l2ZW4gKi8KLSAgY2hhciBkZWZhdWx0X21vZGVjOwkJLyogZGVmYXVsdCB0byB0aGlzIGFkZHItbW9kZSB3aGVuIGFtYmlnb3VzCi0JCQkJICAgaWUgd2hlbiB0aGUgYXJndW1lbnQgb2YgYSBnZW5lcmFsIGFkZHItbW9kZQotCQkJCSAgIGlzIGEgcGxhaW4gY29uc3RhbnQgKi8KLSAgY2hhciBkZWZhdWx0X21vZGVsOwkJLyogaXMgYSBwbGFpbiBsYWJlbCAqLwotfTsKLQotI2lmZGVmIGNvbW1lbnQKLS8qIFRoaXMgc2VjdGlvbiB3YXMgZnJvbSB0aGUgZ2RiIHZlcnNpb24gb2YgdGhpcyBmaWxlLiAqLwotCi0jaWZuZGVmIG5zMzJrX29wY29kZVQKLSNkZWZpbmUgbnMzMmtfb3Bjb2RlVCBpbnQKLSNlbmRpZiAvKiBubyBuczMya19vcGNvZGVUICovCi0KLXN0cnVjdCBub3Rfd290CQkJLyogbnMzMmsgb3Bjb2RlIHRhYmxlOiB3b3QgdG8gZG8gd2l0aCB0aGlzICovCi0JCQkJLyogcGFydGljdWxhciBvcGNvZGUgKi8KLXsKLSAgaW50IG9iaXRzOwkJLyogbnVtYmVyIG9mIG9wY29kZSBiaXRzICovCi0gIGludCBpYml0czsJCS8qIG51bWJlciBvZiBpbnN0cnVjdGlvbiBiaXRzICovCi0gIG5zMzJrX29wY29kZVQJY29kZTsJLyogb3AtY29kZSAobWF5IGJlID4gOCBiaXRzISkgKi8KLSAgY2hhciAqYXJnczsJCS8qIGhvdyB0byBjb21waWxlIHNhaWQgb3Bjb2RlICovCi19OwotCi1zdHJ1Y3Qgbm90CQkJLyogbnMzMmsgb3Bjb2RlIHRleHQgKi8KLXsKLSAgY2hhciAqICAgICAgICAgICAgbmFtZTsJLyogb3Bjb2RlIG5hbWU6IGxvd2VyY2FzZSBzdHJpbmcgIFtrZXldICAqLwotICBzdHJ1Y3Qgbm90X3dvdCAgICBkZXRhaWw7CS8qIHJlc3Qgb2Ygb3Bjb2RlIHRhYmxlICAgICAgICAgIFtkYXR1bV0gKi8KLX07Ci0KLS8qIEluc3RydWN0aW9ucyBsb29rIGxpa2UgdGhpczoKLSAgICAKLSAgIGJhc2ljIGluc3RydWN0aW9uLS0xLCAyLCBvciAzIGJ5dGVzCi0gICBpbmRleCBieXRlIGZvciBvcGVyYW5kIEEsIGlmIG9wZXJhbmQgQSBpcyBpbmRleGVkLS0xIGJ5dGUKLSAgIGluZGV4IGJ5dGUgZm9yIG9wZXJhbmQgQiwgaWYgb3BlcmFuZCBCIGlzIGluZGV4ZWQtLTEgYnl0ZQotICAgYWRkcmVzc2luZyBleHRlbnNpb24gZm9yIG9wZXJhbmQgQQotICAgYWRkcmVzc2luZyBleHRlbnNpb24gZm9yIG9wZXJhbmQgQgotICAgaW1wbGllZCBvcGVyYW5kcwotCi0gICBPcGVyYW5kIEEgaXMgdGhlIG9wZXJhbmQgbGlzdGVkIGZpcnN0IGluIHRoZSBmb2xsb3dpbmcgb3Bjb2RlIHRhYmxlLgotICAgT3BlcmFuZCBCIGlzIHRoZSBvcGVyYW5kIGxpc3RlZCBzZWNvbmQgaW4gdGhlIGZvbGxvd2luZyBvcGNvZGUgdGFibGUuCi0gICBBbGwgaW5zdHJ1Y3Rpb25zIGhhdmUgYXQgbW9zdCAyIGdlbmVyYWwgb3BlcmFuZHMsIHNvIHRoaXMgaXMgZW5vdWdoLgotICAgVGhlIGltcGxpZWQgb3BlcmFuZHMgYXJlIGFzc29jaWF0ZWQgd2l0aCBvcGVyYW5kcyBvdGhlciB0aGFuIEEgYW5kIEIuCi0KLSAgIEVhY2ggb3BlcmFuZCBoYXMgYSBkaWdpdCBhbmQgYSBsZXR0ZXIuCi0gICAKLSAgIFRoZSBkaWdpdCBnaXZlcyB0aGUgcG9zaXRpb24gaW4gdGhlIGFzc2VtYmx5IGxhbmd1YWdlLiAgVGhlIGxldHRlciwKLSAgIG9uZSBvZiB0aGUgZm9sbG93aW5nLCB0ZWxscyB1cyB3aGF0IGtpbmQgb2Ygb3BlcmFuZCBpdCBpcy4gICovCi0KLS8qIEYgOiAzMiBiaXQgZmxvYXQKLSAqIEwgOiA2NCBiaXQgZmxvYXQKLSAqIEIgOiBieXRlCi0gKiBXIDogd29yZAotICogRCA6IGRvdWJsZS13b3JkCi0gKiBJIDogaW50ZWdlciBub3QgaW1tZWRpYXRlCi0gKiBaIDogZmxvYXRpbmcgbm90IGltbWVkaWF0ZQotICogZCA6IGRpc3BsYWNlbWVudAotICogcSA6IHF1aWNrCi0gKiBpIDogaW1tZWRpYXRlICg4IGJpdHMpCi0gKiByIDogcmVnaXN0ZXIgbnVtYmVyICgzIGJpdHMpCi0gKiBwIDogZGlzcGxhY2VtZW50IC0gcGMgcmVsYXRpdmUgYWRkcmVzc2luZwotKi8KLQotCi0jZW5kaWYgLyogY29tbWVudCAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wY29kZSBuczMya19vcGNvZGVzW109Ci17Ci0gIHsgImFic2YiLAkxNCwyNCwJMHgzNWJlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhYnNsIiwJMTQsMjQsCTB4MzRiZSwJIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWJzYiIsCTE0LDI0LAkweDMwNGUsICIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFic3ciLAkxNCwyNCwJMHgzMTRlLCAiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhYnNkIiwJMTQsMjQsCTB4MzM0ZSwgIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWNiYiIsCSA3LDE2LAkweDRjLAkiMkkxcTNwIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWNidyIsCSA3LDE2LAkweDRkLAkiMkkxcTNwIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWNiZCIsCSA3LDE2LAkweDRmLAkiMkkxcTNwIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkZiIsCTE0LDI0LAkweDAxYmUsCSIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZGwiLAkxNCwyNCwJMHgwMGJlLCAiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRiIiwJIDYsMTYsCTB4MDAsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZHciLAkgNiwxNiwJMHgwMSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkZCIsCSA2LDE2LAkweDAzLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRjYiIsCSA2LDE2LAkweDEwLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRjdyIsCSA2LDE2LAkweDExLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRjZCIsCSA2LDE2LAkweDEzLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRwYiIsCTE0LDI0LAkweDNjNGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZHB3IiwJMTQsMjQsCTB4M2Q0ZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcGQiLAkxNCwyNCwJMHgzZjRlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRxYiIsCSA3LDE2LAkweDBjLAkiMkkxcSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRxdyIsCSA3LDE2LAkweDBkLAkiMkkxcSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRxZCIsCSA3LDE2LAkweDBmLAkiMkkxcSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRyIiwJIDYsMTYsCTB4MjcsCSIxQTJJIiwJCTQsCSIiLAkyMSwyMQl9LAotICB7ICJhZGpzcGIiLAkxMSwxNiwJMHgwNTdjLAkiMUIiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRqc3B3IiwJMTEsMTYsCTB4MDU3ZCwJIjFXIiwgCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGpzcGQiLAkxMSwxNiwJMHgwNTdmLAkiMUQiLCAJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFuZGIiLAkgNiwxNiwJMHgyOCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYW5kdyIsCSA2LDE2LAkweDI5LAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhbmRkIiwJIDYsMTYsCTB4MmIsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFzaGIiLAkxNCwyNCwJMHgwNDRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhc2h3IiwJMTQsMjQsCTB4MDU0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYXNoZCIsCTE0LDI0LAkweDA3NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJlcSIsCSA4LDgsCTB4MGEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYm5lIiwJIDgsOCwJMHgxYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiY3MiLAkgOCw4LAkweDJhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJjYyIsCSA4LDgsCTB4M2EsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmhpIiwJIDgsOCwJMHg0YSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJibHMiLAkgOCw4LAkweDVhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJndCIsCSA4LDgsCTB4NmEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmxlIiwJIDgsOCwJMHg3YSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiZnMiLAkgOCw4LAkweDhhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJmYyIsCSA4LDgsCTB4OWEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmxvIiwJIDgsOCwJMHhhYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiaHMiLAkgOCw4LAkweGJhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJsdCIsCSA4LDgsCTB4Y2EsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmdlIiwJIDgsOCwJMHhkYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJidXQiLAkgOCw4LAkweGVhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJ1ZiIsCSA4LDgsCTB4ZmEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmljYiIsCSA2LDE2LAkweDA4LAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiaWN3IiwJIDYsMTYsCTB4MDksCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJpY2QiLAkgNiwxNiwJMHgwYiwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYmljcHNyYiIsCTExLDE2LAkweDE3YywJIjFCIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJpY3BzcnciLAkxMSwxNiwJMHgxN2QsCSIxVyIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiaXNwc3JiIiwJMTEsMTYsCTB4MzdjLAkiMUIiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYmlzcHNydyIsCTExLDE2LAkweDM3ZCwJIjFXIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJwdCIsCSA4LDgsCTB4ZjIsCSIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYnIiLAkgOCw4LAkweGVhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0jaWZkZWYgU0VRVUVOVF9DT01QQVRBQklMSVRZCi0gIHsgImJzciIsCSA4LDgsCTB4MDIsCSIxSCIsCQkwLAkiIiwJMjEsMjEJfSwKLSNlbHNlCi0gIHsgImJzciIsCSA4LDgsCTB4MDIsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSNlbmRpZgotICB7ICJjYXNlYiIsCTExLDE2LAkweDc3YywJIjFCIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNhc2V3IiwJMTEsMTYsCTB4NzdkLAkiMVciLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2FzZWQiLAkxMSwxNiwJMHg3N2YsCSIxRCIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYml0YiIsCTE0LDI0LAkweDA4NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNiaXR3IiwJMTQsMjQsCTB4MDk0ZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGQiLAkxNCwyNCwJMHgwYjRlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYml0aWIiLAkxNCwyNCwJMHgwYzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYml0aXciLAkxNCwyNCwJMHgwZDRlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYml0aWQiLAkxNCwyNCwJMHgwZjRlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjaGVja2IiLAkxMSwyNCwJMHgwZWUsCSIyQTNCMXIiLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjaGVja3ciLAkxMSwyNCwJMHgxZWUsCSIyQTNXMXIiLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjaGVja2QiLAkxMSwyNCwJMHgzZWUsCSIyQTNEMXIiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjaW52IiwJMTQsMjQsCTB4MjcxZSwJIjJEMUMiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wZiIsCTE0LDI0LAkweDA5YmUsCSIxRjJGIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcGwiLAkxNCwyNCwJMHgwOGJlLAkiMUwyTCIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBiIiwJIDYsMTYsCTB4MDQsCSIxQjJCIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcHciLAkgNiwxNiwJMHgwNSwJIjFXMlciLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wZCIsCSA2LDE2LAkweDA3LAkiMUQyRCIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBtYiIsCTE0LDI0LAkweDA0Y2UsCSIxQTJBM2IiLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBtdyIsCTE0LDI0LAkweDA1Y2UsCSIxQTJBM2IiLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBtZCIsCTE0LDI0LAkweDA3Y2UsCSIxQTJBM2IiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBxYiIsCSA3LDE2LAkweDFjLAkiMkIxcSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBxdyIsCSA3LDE2LAkweDFkLAkiMlcxcSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBxZCIsCSA3LDE2LAkweDFmLAkiMkQxcSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBzYiIsCTE2LDI0LAkweDA0MGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcHN3IiwJMTYsMjQsCTB4MDUwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wc2QiLAkxNiwyNCwJMHgwNzBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBzdCIsCTE2LDI0LAkweDg0MGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNvbWIiLAkxNCwyNCwJMHgzNDRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjb213IiwJMTQsMjQsCTB4MzU0ZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY29tZCIsCTE0LDI0LAkweDM3NGUsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImN2dHAiLAkxMSwyNCwJMHgwMzZlLAkiMkEzRDFyIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY3hwIiwJIDgsOCwJMHgyMiwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJjeHBkIiwJMTEsMTYsCTB4MDdmLAkiMUEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGVpYiIsCTE0LDI0LAkweDJjY2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRlaXciLAkxNCwyNCwJMHgyZGNlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkZWlkIiwJMTQsMjQsCTB4MmZjZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGlhIiwJIDgsOCwJMHhjMiwJIiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkaXZmIiwJMTQsMjQsCTB4MjFiZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGl2bCIsCTE0LDI0LAkweDIwYmUsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRpdmIiLAkxNCwyNCwJMHgzY2NlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkaXZ3IiwJMTQsMjQsCTB4M2RjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGl2ZCIsCTE0LDI0LAkweDNmY2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImVudGVyIiwJIDgsOCwJMHg4MiwJIjFVMmQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXhpdCIsCSA4LDgsCTB4OTIsCSIxdSIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJleHRiIiwJMTEsMjQsCTB4MDJlLAkiMkkzQjFyNGQiLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJleHR3IiwJMTEsMjQsCTB4MTJlLAkiMkkzVzFyNGQiLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJleHRkIiwJMTEsMjQsCTB4MzJlLAkiMkkzRDFyNGQiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJleHRzYiIsCTE0LDI0LAkweDBjY2UsCSIxSTJJNEczZyIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImV4dHN3IiwJMTQsMjQsCTB4MGRjZSwJIjFJMkk0RzNnIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0c2QiLAkxNCwyNCwJMHgwZmNlLAkiMUkySTRHM2ciLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmZnNiIiwJMTQsMjQsCTB4MDQ2ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmZzdyIsCTE0LDI0LAkweDA1NmUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZmc2QiLAkxNCwyNCwJMHgwNzZlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmbGFnIiwJIDgsOCwJMHhkMiwJIiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmbG9vcmZiIiwJMTQsMjQsCTB4M2MzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxvb3JmdyIsCTE0LDI0LAkweDNkM2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZsb29yZmQiLAkxNCwyNCwJMHgzZjNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmbG9vcmxiIiwJMTQsMjQsCTB4MzgzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxvb3JsdyIsCTE0LDI0LAkweDM5M2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZsb29ybGQiLAkxNCwyNCwJMHgzYjNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpYml0YiIsCTE0LDI0LAkweDM4NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImliaXR3IiwJMTQsMjQsCTB4Mzk0ZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaWJpdGQiLAkxNCwyNCwJMHgzYjRlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbmRleGIiLAkxMSwyNCwJMHg0MmUsCSIyQjNCMXIiLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbmRleHciLAkxMSwyNCwJMHg1MmUsCSIyVzNXMXIiLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbmRleGQiLAkxMSwyNCwJMHg3MmUsCSIyRDNEMXIiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbnNiIiwJMTEsMjQsCTB4MGFlLAkiMkIzSTFyNGQiLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbnN3IiwJMTEsMjQsCTB4MWFlLAkiMlczSTFyNGQiLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbnNkIiwJMTEsMjQsCTB4M2FlLAkiMkQzSTFyNGQiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbnNzYiIsCTE0LDI0LAkweDA4Y2UsCSIxQjJJNEczZyIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImluc3N3IiwJMTQsMjQsCTB4MDljZSwJIjFXMkk0RzNnIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zc2QiLAkxNCwyNCwJMHgwYmNlLAkiMUQySTRHM2ciLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJqc3IiLAkxMSwxNiwJMHg2N2YsCSIxQSIsCQk0LAkiIiwJMjEsMjEJfSwKLSAgeyAianVtcCIsCTExLDE2LAkweDI3ZiwJIjFBIiwJCTQsCSIiLAkyMSwyMQl9LAotICB7ICJsZnNyIiwJMTksMjQsCTB4MDBmM2UsIjFEIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxtciIsCTE1LDI0LAkweDBiMWUsCSIyRDFNIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxwcmIiLAkgNywxNiwJMHg2YywJIjJCMVAiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibHBydyIsCSA3LDE2LAkweDZkLAkiMlcxUCIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJscHJkIiwJIDcsMTYsCTB4NmYsCSIyRDFQIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxzaGIiLAkxNCwyNCwJMHgxNDRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsc2h3IiwJMTQsMjQsCTB4MTU0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibHNoZCIsCTE0LDI0LAkweDE3NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1laWIiLAkxNCwyNCwJMHgyNGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtZWl3IiwJMTQsMjQsCTB4MjVjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibWVpZCIsCTE0LDI0LAkweDI3Y2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vZGIiLAkxNCwyNCwJMHgzOGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb2R3IiwJMTQsMjQsCTB4MzljZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW9kZCIsCTE0LDI0LAkweDNiY2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmYiLAkxNCwyNCwJMHgwNWJlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZsIiwJMTQsMjQsCTB4MDRiZSwJIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92YiIsCSA2LDE2LAkweDE0LAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3Z3IiwJIDYsMTYsCTB4MTUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmQiLAkgNiwxNiwJMHgxNywJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92YmYiLAkxNCwyNCwJMHgwNDNlLAkiMUIyWiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3Z3ZiIsCTE0LDI0LAkweDA1M2UsCSIxVzJaIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmRmIiwJMTQsMjQsCTB4MDczZSwJIjFEMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92YmwiLAkxNCwyNCwJMHgwMDNlLAkiMUIyWiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3Z3bCIsCTE0LDI0LAkweDAxM2UsCSIxVzJaIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmRsIiwJMTQsMjQsCTB4MDMzZSwJIjFEMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92ZmwiLAkxNCwyNCwJMHgxYjNlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZsZiIsCTE0LDI0LAkweDE2M2UsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdm1iIiwJMTQsMjQsCTB4MDBjZSwJIjFBMkEzYiIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdm13IiwJMTQsMjQsCTB4MDFjZSwJIjFBMkEzYiIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdm1kIiwJMTQsMjQsCTB4MDNjZSwJIjFBMkEzYiIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnFiIiwJIDcsMTYsCTB4NWMsCSIySTFxIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnF3IiwJIDcsMTYsCTB4NWQsCSIySTFxIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnFkIiwJIDcsMTYsCTB4NWYsCSIySTFxIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnNiIiwJMTYsMjQsCTB4MDAwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92c3ciLAkxNiwyNCwJMHgwMTBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZzZCIsCTE2LDI0LAkweDAzMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN0IiwJMTYsMjQsCTB4ODAwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92c3ViIiwJMTQsMjQsCTB4MGNhZSwJIjFBMkEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92c3V3IiwJMTQsMjQsCTB4MGRhZSwJIjFBMkEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92c3VkIiwJMTQsMjQsCTB4MGZhZSwJIjFBMkEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92dXNiIiwJMTQsMjQsCTB4MWNhZSwJIjFBMkEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92dXN3IiwJMTQsMjQsCTB4MWRhZSwJIjFBMkEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92dXNkIiwJMTQsMjQsCTB4MWZhZSwJIjFBMkEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92eGJkIiwJMTQsMjQsCTB4MWNjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92eHdkIiwJMTQsMjQsCTB4MWRjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92eGJ3IiwJMTQsMjQsCTB4MTBjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92emJkIiwJMTQsMjQsCTB4MThjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92endkIiwJMTQsMjQsCTB4MTljZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92emJ3IiwJMTQsMjQsCTB4MTRjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibXVsZiIsCTE0LDI0LAkweDMxYmUsCSIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm11bGwiLAkxNCwyNCwJMHgzMGJlLAkiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtdWxiIiwJMTQsMjQsCTB4MjBjZSwgIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibXVsdyIsCTE0LDI0LAkweDIxY2UsICIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm11bGQiLAkxNCwyNCwJMHgyM2NlLCAiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJuZWdmIiwJMTQsMjQsCTB4MTViZSwgIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibmVnbCIsCTE0LDI0LAkweDE0YmUsICIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5lZ2IiLAkxNCwyNCwJMHgyMDRlLCAiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJuZWd3IiwJMTQsMjQsCTB4MjE0ZSwgIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibmVnZCIsCTE0LDI0LAkweDIzNGUsICIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5vcCIsCSA4LDgsCTB4YTIsCSIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibm90YiIsCTE0LDI0LAkweDI0NGUsICIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5vdHciLAkxNCwyNCwJMHgyNTRlLCAiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJub3RkIiwJMTQsMjQsCTB4Mjc0ZSwgIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAib3JiIiwJIDYsMTYsCTB4MTgsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm9ydyIsCSA2LDE2LAkweDE5LAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJvcmQiLAkgNiwxNiwJMHgxYiwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicXVvYiIsCTE0LDI0LAkweDMwY2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInF1b3ciLAkxNCwyNCwJMHgzMWNlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJxdW9kIiwJMTQsMjQsCTB4MzNjZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmR2YWwiLAkxOSwyNCwJMHgwMDMxZSwiMUEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmVtYiIsCTE0LDI0LAkweDM0Y2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJlbXciLAkxNCwyNCwJMHgzNWNlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyZW1kIiwJMTQsMjQsCTB4MzdjZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmVzdG9yZSIsCSA4LDgsCTB4NzIsCSIxdSIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyZXQiLAkgOCw4LAkweDEyLAkiMWQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmV0aSIsCSA4LDgsCTB4NTIsCSIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmV0dCIsCSA4LDgsCTB4NDIsCSIxZCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3RiIiwJMTQsMjQsCTB4MDA0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm90dyIsCTE0LDI0LAkweDAxNGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdGQiLAkxNCwyNCwJMHgwMzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3VuZGZiIiwJMTQsMjQsCTB4MjQzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm91bmRmdyIsCTE0LDI0LAkweDI1M2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdW5kZmQiLAkxNCwyNCwJMHgyNzNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3VuZGxiIiwJMTQsMjQsCTB4MjAzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm91bmRsdyIsCTE0LDI0LAkweDIxM2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdW5kbGQiLAkxNCwyNCwJMHgyMzNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyeHAiLAkgOCw4LAkweDMyLAkiMWQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2VxYiIsCTExLDE2LAkweDNjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2VxdyIsCTExLDE2LAkweDNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2VxZCIsCTExLDE2LAkweDNmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic25lYiIsCTExLDE2LAkweGJjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic25ldyIsCTExLDE2LAkweGJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic25lZCIsCTExLDE2LAkweGJmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NzYiIsCTExLDE2LAkweDEzYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNjc3ciLAkxMSwxNiwJMHgxM2QsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY3NkIiwJMTEsMTYsCTB4MTNmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NjYiIsCTExLDE2LAkweDFiYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNjY3ciLAkxMSwxNiwJMHgxYmQsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY2NkIiwJMTEsMTYsCTB4MWJmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2hpYiIsCTExLDE2LAkweDIzYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNoaXciLAkxMSwxNiwJMHgyM2QsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzaGlkIiwJMTEsMTYsCTB4MjNmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xzYiIsCTExLDE2LAkweDJiYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsc3ciLAkxMSwxNiwJMHgyYmQsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbHNkIiwJMTEsMTYsCTB4MmJmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2d0YiIsCTExLDE2LAkweDMzYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNndHciLAkxMSwxNiwJMHgzM2QsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZ3RkIiwJMTEsMTYsCTB4MzNmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xlYiIsCTExLDE2LAkweDNiYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsZXciLAkxMSwxNiwJMHgzYmQsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbGVkIiwJMTEsMTYsCTB4M2JmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2ZzYiIsCTExLDE2LAkweDQzYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmc3ciLAkxMSwxNiwJMHg0M2QsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZnNkIiwJMTEsMTYsCTB4NDNmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2ZjYiIsCTExLDE2LAkweDRiYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmY3ciLAkxMSwxNiwJMHg0YmQsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZmNkIiwJMTEsMTYsCTB4NGJmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xvYiIsCTExLDE2LAkweDUzYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsb3ciLAkxMSwxNiwJMHg1M2QsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbG9kIiwJMTEsMTYsCTB4NTNmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2hzYiIsCTExLDE2LAkweDViYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNoc3ciLAkxMSwxNiwJMHg1YmQsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzaHNkIiwJMTEsMTYsCTB4NWJmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2x0YiIsCTExLDE2LAkweDYzYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsdHciLAkxMSwxNiwJMHg2M2QsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbHRkIiwJMTEsMTYsCTB4NjNmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2dlYiIsCTExLDE2LAkweDZiYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNnZXciLAkxMSwxNiwJMHg2YmQsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZ2VkIiwJMTEsMTYsCTB4NmJmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3V0YiIsCTExLDE2LAkweDczYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1dHciLAkxMSwxNiwJMHg3M2QsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdXRkIiwJMTEsMTYsCTB4NzNmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VmYiIsCTExLDE2LAkweDdiYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1ZnciLAkxMSwxNiwJMHg3YmQsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWZkIiwJMTEsMTYsCTB4N2JmLAkiMUQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2F2ZSIsCSA4LDgsCTB4NjIsCSIxVSIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzYml0YiIsICAgIDE0LDI0LAkweDE4NGUsCSIxQjJBIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNiaXR3IiwJMTQsMjQsCTB4MTk0ZSwJIjFXMkEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGQiLAkxNCwyNCwJMHgxYjRlLAkiMUQyQSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzYml0aWIiLAkxNCwyNCwJMHgxYzRlLAkiMUIyQSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzYml0aXciLAkxNCwyNCwJMHgxZDRlLAkiMVcyQSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzYml0aWQiLAkxNCwyNCwJMHgxZjRlLAkiMUQyQSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZXRjZmciLAkxNSwyNCwJMHgwYjBlLAkiMU8iLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2ZzciIsCTE0LDI0LAkweDM3M2UsCSIxZiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJza3BzYiIsCTE2LDI0LAkweDBjMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNrcHN3IiwJMTYsMjQsCTB4MGQwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2twc2QiLAkxNiwyNCwJMHgwZjBlLCAiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJza3BzdCIsCTE2LDI0LAkweDhjMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNtciIsCTE1LDI0LAkweDBmMWUsCSIySTFNIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNwcmIiLAkgNywxNiwJMHgyYywJIjJJMVAiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3BydyIsCSA3LDE2LAkweDJkLAkiMkkxUCIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzcHJkIiwJIDcsMTYsCTB4MmYsCSIySTFQIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmYiLAkxNCwyNCwJMHgxMWJlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJsIiwJMTQsMjQsCTB4MTBiZSwJIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3ViYiIsCSA2LDE2LAkweDIwLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJ3IiwJIDYsMTYsCTB4MjEsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmQiLAkgNiwxNiwJMHgyMywJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3ViY2IiLAkgNiwxNiwJMHgzMCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3ViY3ciLAkgNiwxNiwJMHgzMSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3ViY2QiLAkgNiwxNiwJMHgzMywJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VicGIiLAkxNCwyNCwJMHgyYzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJwdyIsCTE0LDI0LAkweDJkNGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YnBkIiwJMTQsMjQsCTB4MmY0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSNpZmRlZiBOUzMyS19TVkNfSU1NRURfT1BFUkFORFMKLSAgeyAic3ZjIiwJIDgsOCwJMHhlMiwJIjJpMWkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwgLyogbm90IHJlYWxseSwgYnV0IHNvbWUgdW5peCB1c2VzIGl0ICovCi0jZWxzZQotICB7ICJzdmMiLAkgOCw4LAkweGUyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0jZW5kaWYKLSAgeyAidGJpdGIiLAkgNiwxNiwJMHgzNCwJIjFCMkEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidGJpdHciLAkgNiwxNiwJMHgzNSwJIjFXMkEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidGJpdGQiLAkgNiwxNiwJMHgzNywJIjFEMkEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidHJ1bmNmYiIsCTE0LDI0LAkweDJjM2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRydW5jZnciLAkxNCwyNCwJMHgyZDNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ0cnVuY2ZkIiwJMTQsMjQsCTB4MmYzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidHJ1bmNsYiIsCTE0LDI0LAkweDI4M2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRydW5jbHciLAkxNCwyNCwJMHgyOTNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ0cnVuY2xkIiwJMTQsMjQsCTB4MmIzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAid2FpdCIsCSA4LDgsCTB4YjIsCSIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAid3J2YWwiLAkxOSwyNCwJMHgwMDcxZSwiMUEiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAieG9yYiIsCSA2LDE2LAkweDM4LAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ4b3J3IiwJIDYsMTYsCTB4MzksCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInhvcmQiLAkgNiwxNiwJMHgzYiwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZG90ZiIsCTE0LDI0LCAgMHgwZGZlLCAiMUYyRiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkb3RsIiwJMTQsMjQsICAweDBjZmUsICIxTDJMIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxvZ2JmIiwJMTQsMjQsICAweDE1ZmUsICIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxvZ2JsIiwJMTQsMjQsICAweDE0ZmUsICIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInBvbHlmIiwJMTQsMjQsICAweDA5ZmUsICIxRjJGIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInBvbHlsIiwJMTQsMjQsICAweDA4ZmUsICIxTDJMIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNjYWxiZiIsCTE0LDI0LCAgMHgxMWZlLCAiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY2FsYmwiLAkxNCwyNCwgIDB4MTBmZSwgIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgbnVtb3Bjb2Rlcz1zaXplb2YobnMzMmtfb3Bjb2Rlcykvc2l6ZW9mKG5zMzJrX29wY29kZXNbMF0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wY29kZSAqY29uc3QgZW5kb3AgPSBuczMya19vcGNvZGVzK3NpemVvZihuczMya19vcGNvZGVzKS9zaXplb2YobnMzMmtfb3Bjb2Rlc1swXSk7Ci0KLSNkZWZpbmUgTUFYX0FSR1MgNAotI2RlZmluZSBBUkdfTEVOIDUwCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3BuLmggYi9pbmNsdWRlL29wY29kZS9wbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjU5YTJhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3BuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyogUHJpbnQgR09VTEQgUE4gKFBvd2VyTm9kZSkgaW5zdHJ1Y3Rpb25zIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0RCOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1zdHJ1Y3QgZ2xkX29wY29kZQotewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotICBjaGFyICphcmdzOwotICBpbnQgbGVuZ3RoOwotfTsKLQotLyogV2Ugc3RvcmUgZm91ciBieXRlcyBvZiBvcGNvZGUgZm9yIGFsbCBvcGNvZGVzIGJlY2F1c2UgdGhhdAotICAgaXMgdGhlIG1vc3QgYW55IG9mIHRoZW0gbmVlZC4gIFRoZSBhY3R1YWwgbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uCi0gICBpcyBhbHdheXMgYXQgbGVhc3QgMiBieXRlcywgYW5kIGF0IG1vc3QgZm91ci4gIFRoZSBsZW5ndGggb2YgdGhlCi0gICBpbnN0cnVjdGlvbiBpcyBiYXNlZCBvbiB0aGUgb3Bjb2RlLgotCi0gICBUaGUgbWFzayBjb21wb25lbnQgaXMgYSBtYXNrIHNheWluZyB3aGljaCBiaXRzIG11c3QgbWF0Y2gKLSAgIHBhcnRpY3VsYXIgb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZQotICAgb2YgdGhhdCBvcGNvZGUuCi0KLSAgIFRoZSBhcmdzIGNvbXBvbmVudCBpcyBhIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMKLSAgIHRoYXQgYXJlIHVzZWQgdG8gZm9ybWF0IHRoZSBhcmd1bWVudHMgdG8gdGhlIGluc3RydWN0aW9uLiAqLwotCi0vKiBLaW5kcyBvZiBvcGVyYW5kczoKLSAgIHIgIFJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBSICBSZWdpc3RlciBpbiBzZWNvbmQgZmllbGQKLSAgIGIgIEJhc2UgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIEIgIEJhc2UgcmVnaXN0ZXIgaW4gc2Vjb25kIGZpZWxkCi0gICB2ICBWZWN0b3IgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIFYgIFZlY3RvciByZWdpc3RlciBpbiBmaXJzdCBmaWVsZAotICAgQSAgT3B0aW9uYWwgYWRkcmVzcyByZWdpc3RlciAoYmFzZSByZWdpc3RlcikKLSAgIFggIE9wdGlvbmFsIGluZGV4IHJlZ2lzdGVyCi0gICBJICBJbW1lZGlhdGUgZGF0YSAoMTZiaXRzIHNpZ25lZCkKLSAgIE8gIE9mZnNldCBmaWVsZCAoMTZiaXRzIHNpZ25lZCkKLSAgIGggIE9mZnNldCBmaWVsZCAoMTViaXRzIHNpZ25lZCkKLSAgIGQgIE9mZnNldCBmaWVsZCAoMTRiaXRzIHNpZ25lZCkKLSAgIFMgIFNoaWZ0IGNvdW50IGZpZWxkCi0KLSAgIGFueSBvdGhlciBjaGFyYWN0ZXJzIGFyZSBwcmludGVkIGFzIGlzLi4uCi0qLwotCi0vKiBUaGUgYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgdGhpcyBhcnJheSBiZSBzb3J0ZWQgYXMgZm9sbG93czoKLSAgIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdCBiZSBjb25zZWN1dGl2ZS4KLSAgIEFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygb3BlcmFuZHMKLSAgIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gKi8KLXN0cnVjdCBnbGRfb3Bjb2RlIGdsZF9vcGNvZGVzW10gPQotewoteyAiYWJtIiwJMHhhMDA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJhYnIiLAkweDE4MDgwMDAwLAkweGZjMGMwMDAwLAkicixmIiwJCTIgfSwKLXsgImFjaSIsCTB4ZmM3NzAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAiYWRmZCIsCTB4ZTAwODAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRmdyIsCTB4ZTAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRpIiwJMHhjODAxMDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJhZG1iIiwJMHhiODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhZG1kIiwJMHhiODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhZG1oIiwJMHhiODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJhZG13IiwJMHhiODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhZHIiLAkweDM4MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFkcmZkIiwJMHgzODA5MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhZHJmdyIsCTB4MzgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYWRybSIsCTB4MzgwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYWkiLCAJMHhmYzAzMDAwMCwJMHhmYzA3ZmZmZiwJIkkiLAkJNCB9LAoteyAiYW5tYiIsCTB4ODQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYW5tZCIsCTB4ODQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYW5taCIsCTB4ODQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiYW5tdyIsCTB4ODQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYW5yIiwJMHgwNDAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhcm1iIiwJMHhlODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhcm1kIiwJMHhlODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhcm1oIiwJMHhlODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJhcm13IiwJMHhlODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiY2YiLAkweGYwMDAwMDAwLAkweGZjMDgwMDAwLAkiSSx4T0EsWCIsCTQgfSwKLXsgImJjdCIsCTB4ZWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJJLHhPQSxYIiwJNCB9LAoteyAiYmVpIiwJMHgwMDA2MDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJiZnQiLAkweGYwMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJiaWIiLAkweGY0MDAwMDAwLAkweGZjNzgwMDAwLAkicix4T0EiLAk0IH0sCi17ICJiaWQiLAkweGY0NjAwMDAwLAkweGZjNzgwMDAwLAkicix4T0EiLAk0IH0sCi17ICJiaWgiLAkweGY0MjAwMDAwLAkweGZjNzgwMDAwLAkicix4T0EiLAk0IH0sCi17ICJiaXciLAkweGY0NDAwMDAwLAkweGZjNzgwMDAwLAkicix4T0EiLAk0IH0sCi17ICJibCIsIAkweGY4ODAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJic3ViIiwJMHg1YzA4MDAwMCwJMHhmZjhmMDAwMCwJIiIsCQkyIH0sCi17ICJic3VibSIsCTB4MjgwODAwMDAsCTB4ZmMwODAwMDAsCSIiLAkJNCB9LAoteyAiYnUiLCAJMHhlYzAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiY2FsbCIsCTB4MjgwODAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAiY2FsbG0iLAkweDVjMDgwMDAwLAkweGZmODgwMDAwLAkiIiwJCTQgfSwKLXsgImNhbWIiLAkweDkwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImNhbWQiLAkweDkwMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImNhbWgiLAkweDkwMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImNhbXciLAkweDkwMDAwMDAwLAkweGZjMDgwMDAwLAkici54T0EsWCIsCTQgfSwKLXsgImNhciIsCTB4MTAwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiY2QiLCAJMHhmYzA2MDAwMCwJMHhmYzA3MDAwMCwJInIsZiIsCQk0IH0sCi17ICJjZWEiLAkweDAwMGYwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgImNpIiwgCTB4YzgwNTAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiY21jIiwJMHgwNDBhMDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAiY21tYiIsCTB4OTQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiY21tZCIsCTB4OTQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiY21taCIsCTB4OTQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiY21tdyIsCTB4OTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiY21yIiwJMHgxNDAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJkYWNpIiwJMHhmYzdmMDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJkYWUiLAkweDAwMGUwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgImRhaSIsCTB4ZmMwNDAwMDAsCTB4ZmMwN2ZmZmYsCSJJIiwJCTQgfSwKLXsgImRjaSIsCTB4ZmM2ZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAiZGkiLCAJMHhmYzAxMDAwMCwJMHhmYzA3ZmZmZiwJIkkiLAkJNCB9LAoteyAiZHZmZCIsCTB4ZTQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZmdyIsCTB4ZTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZpIiwJMHhjODA0MDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJkdm1iIiwJMHhjNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJkdm1oIiwJMHhjNDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJkdm13IiwJMHhjNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJkdnIiLAkweDM4MGEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImR2cmZkIiwJMHgzODBjMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQk0IH0sCi17ICJkdnJmdyIsCTB4MzgwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZWFlIiwJMHgwMDA4MDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJlY2kiLAkweGZjNjcwMDAwLAkweGZjN2Y4MDgwLAkicixJIiwJCTQgfSwKLXsgImVjd2NzIiwJMHhmYzRmMDAwMCwJMHhmYzdmODAwMCwJIiIsCQk0IH0sCi17ICJlaSIsIAkweGZjMDAwMDAwLAkweGZjMDdmZmZmLAkiSSIsCQk0IH0sCi17ICJlb21iIiwJMHg4YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJlb21kIiwJMHg4YzAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJlb21oIiwJMHg4YzAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJlb213IiwJMHg4YzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJlb3IiLAkweDBjMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImVvcm0iLAkweDBjMDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImVzIiwgCTB4MDAwNDAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgImV4bSIsCTB4YTgwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImV4ciIsCTB4YzgwNzAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgImV4cnIiLAkweGM4MDcwMDAyLAkweGZjN2YwMDAyLAkiciIsCQkyIH0sCi17ICJmaXhkIiwJMHgzODBkMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJmaXh3IiwJMHgzODA1MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJmbHRkIiwJMHgzODBmMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJmbHR3IiwJMHgzODA3MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJncmlvIiwJMHhmYzNmMDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJoYWx0IiwJMHgwMDAwMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJoaW8iLAkweGZjMzcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgImp3Y3MiLAkweGZhMDgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJsYSIsIAkweDUwMDAwMDAwLAkweGZjMDAwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxhYnIiLAkweDU4MDgwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgImxiIiwgCTB4YWMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGNzIiwgCTB4MDAwMzAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgImxkIiwgCTB4YWMwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAibGVhciIsIAkweDgwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxmIiwgCTB4Y2MwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGZiciIsIAkweGNjMDgwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgImxoIiwgCTB4YWMwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibGkiLCAJMHhjODAwMDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJsbWFwIiwJMHgyYzA3MDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAibG1iIiwJMHhiMDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsbWQiLAkweGIwMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImxtaCIsCTB4YjAwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibG13IiwJMHhiMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsbmIiLAkweGI0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxuZCIsCTB4YjQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAibG5oIiwJMHhiNDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJsbnciLAkweGI0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxwc2QiLAkweGY5ODAwMDAwLAkweGZmODgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxwc2RjbSIsCTB4ZmE4MDAwMDAsCTB4ZmY4ODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibHciLCAJMHhhYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsd2JyIiwgCTB4NWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAibXBmZCIsCTB4ZTQwODAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAibXBmdyIsCTB4ZTQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibXBpIiwJMHhjODAzMDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJtcG1iIiwJMHhjMDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcG1oIiwJMHhjMDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJtcG13IiwJMHhjMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcHIiLAkweDM4MDIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm1wcmZkIiwJMHgzODBlMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJtcHJmdyIsCTB4MzgwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibm9wIiwJMHgwMDAyMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJvcm1iIiwJMHg4ODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJvcm1kIiwJMHg4ODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJvcm1oIiwJMHg4ODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJvcm13IiwJMHg4ODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJvcnIiLAkweDA4MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm9ycm0iLAkweDA4MDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInJkc3RzIiwJMHgwMDA5MDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAicmV0dXJuIiwJMHgyODBlMDAwMCwJMHhmYzdmMDAwMCwJIiIsCQkyIH0sCi17ICJyaSIsIAkweGZjMDIwMDAwLAkweGZjMDdmZmZmLAkiSSIsCQk0IH0sCi17ICJybmQiLAkweDAwMDUwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJycHN3dCIsCTB4MDQwYjAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJzY2hubCIsCTB4ZmMyZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAicnNjdGwiLAkweGZjNDcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgInJ3Y3MiLAkweDAwMGIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInNhY3oiLAkweDEwMDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInNibSIsCTB4OTgwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAic2JyIiwJMHgxODAwMDAwMCwJMHhmYzBjMDAwMCwJInIsZiIsCQk0IH0sCi17ICJzZWEiLAkweDAwMGQwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgInNldGNwdSIsCTB4MmMwOTAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgInNpbyIsCTB4ZmMxNzAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAic2lwdSIsCTB4MDAwYTAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAic2xhIiwJMHgxYzQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGFkIiwJMHgyMDQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGMiLAkweDI0NDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNsbCIsCTB4MWM2MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xsZCIsCTB4MjA2MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic21jIiwJMHgwNDA3MDAwMCwJMHhmYzA3MDAwMCwJIiIsCQkyIH0sCi17ICJzcmEiLAkweDFjMDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNyYWQiLAkweDIwMDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNyYyIsCTB4MjQwMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JsIiwJMHgxYzIwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmxkIiwJMHgyMDIwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzdGIiLAkweGQ0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0ZCIsCTB4ZDQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RmIiwJMHhkYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGZiciIsCTB4NTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAic3RoIiwJMHhkNDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJzdG1iIiwJMHhkODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdG1kIiwJMHhkODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdG1oIiwJMHhkODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJzdG13IiwJMHhkODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdHBpbyIsCTB4ZmMyNzAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAic3R3IiwJMHhkNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdHdiciIsCTB4NTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAic3VhYnIiLAkweDU4MDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgInN1ZmQiLAkweGUwMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN1ZnciLAkweGUwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1aSIsCTB4YzgwMjAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAic3VtYiIsCTB4YmMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VtZCIsCTB4YmMwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VtaCIsCTB4YmMwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VtdyIsCTB4YmMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VyIiwJMHgzYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzdXJmZCIsCTB4MzgwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VyZnciLAkweDM4MDMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInN1cm0iLAkweDNjMDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInN2YyIsCTB4YzgwNjAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJNCB9LAoteyAidGJtIiwJMHhhNDA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJ0YnIiLAkweDE4MGMwMDAwLAkweGZjMGMwMDAwLAkicixmIiwJCTIgfSwKLXsgInRicnIiLAkweDJjMDIwMDAwLAkweGZjMGYwMDAwLAkicixCIiwJCTIgfSwKLXsgInRjY3IiLAkweDI4MDQwMDAwLAkweGZjN2YwMDAwLAkiIiwJCTIgfSwKLXsgInRkIiwgCTB4ZmMwNTAwMDAsCTB4ZmMwNzAwMDAsCSJyLGYiLAkJNCB9LAoteyAidGlvIiwJMHhmYzFmMDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJ0bWFwciIsCTB4MmMwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHBjYnIiLAkweDI4MGMwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJ0cmJyIiwJMHgyYzAxMDAwMCwJMHhmYzBmMDAwMCwJImIsUiIsCQkyIH0sCi17ICJ0cmMiLAkweDJjMDMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyY2MiLAkweDI4MDUwMDAwLAkweGZjN2YwMDAwLAkiIiwJCTIgfSwKLXsgInRyY20iLAkweDJjMGIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRybiIsCTB4MmMwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJubSIsCTB4MmMwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJyIiwJMHgyYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cnJtIiwJMHgyYzA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cnNjIiwJMHgyYzBlMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cnN3IiwJMHgyODAwMDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAidHNjciIsCTB4MmMwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidWVpIiwJMHgwMDA3MDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJ3YWl0IiwJMHgwMDAxMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJ3Y3djcyIsCTB4ZmM1ZjAwMDAsCTB4ZmM3ZjgwMDAsCSIiLAkJNCB9LAoteyAid3djcyIsCTB4MDAwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAieGNiciIsCTB4MjgwMjAwMDAsCTB4ZmMwZjAwMDAsCSJiLEIiLAkJMiB9LAoteyAieGNyIiwJMHgyYzA1MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ4Y3JtIiwJMHgyYzBkMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ6Ym0iLAkweDljMDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgInpiciIsCTB4MTgwNDAwMDAsCTB4ZmMwYzAwMDAsCSJyLGYiLAkJMiB9LAoteyAiem1iIiwJMHhmODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ6bWQiLAkweGY4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInptaCIsCTB4ZjgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiem13IiwJMHhmODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ6ciIsIAkweDBjMDAwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi19OwotCi1pbnQgbnVtb3Bjb2RlcyA9IHNpemVvZihnbGRfb3Bjb2RlcykgLyBzaXplb2YoZ2xkX29wY29kZXNbMF0pOwotCi1zdHJ1Y3QgZ2xkX29wY29kZSAqZW5kb3AgPSBnbGRfb3Bjb2RlcyArIHNpemVvZihnbGRfb3Bjb2RlcykgLwotCQlzaXplb2YoZ2xkX29wY29kZXNbMF0pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvcHBjLmggYi9pbmNsdWRlL29wY29kZS9wcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0ZjBkZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9wcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKiBwcGMuaCAtLSBIZWFkZXIgZmlsZSBmb3IgUG93ZXJQQyBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFBQQ19ICi0jZGVmaW5lIFBQQ19ICi0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHBvd2VycGNfb3Bjb2RlLiAgKi8KLQotc3RydWN0IHBvd2VycGNfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIG9wY29kZSBpdHNlbGYuICBUaG9zZSBiaXRzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKLSAgICAgb3BlcmFuZHMgYXJlIHplcm9lcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotCi0gIC8qIFRoZSBvcGNvZGUgbWFzay4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVGhpcyBpcyBhCi0gICAgIG1hc2sgY29udGFpbmluZyBvbmVzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBtdXN0IG1hdGNoIHRoZQotICAgICBvcGNvZGUgZmllbGQsIGFuZCB6ZXJvZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG5lZWQgbm90Ci0gICAgIG1hdGNoIChhbmQgYXJlIHByZXN1bWFibHkgZmlsbGVkIGluIGJ5IG9wZXJhbmRzKS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLQotICAvKiBPbmUgYml0IGZsYWdzIGZvciB0aGUgb3Bjb2RlLiAgVGhlc2UgYXJlIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2gKLSAgICAgc3BlY2lmaWMgcHJvY2Vzc29ycyBzdXBwb3J0IHRoZSBpbnN0cnVjdGlvbnMuICBUaGUgZGVmaW5lZCB2YWx1ZXMKLSAgICAgYXJlIGxpc3RlZCBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZQotICAgICBvcGVyYW5kIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0Ci0gICAgIGFwcGVhciBpbiBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s4XTsKLX07Ci0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKLSAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgcG93ZXJwY19vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IHBvd2VycGNfbnVtX29wY29kZXM7Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUuICAqLwotCi0vKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIFBvd2VyUEMgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV9QUEMgKDAxKQotCi0vKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIFBPV0VSIChSUy82MDAwKSBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBQUENfT1BDT0RFX1BPV0VSICgwMikKLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBQT1dFUjIgKFJpb3MgMikgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV9QT1dFUjIgKDA0KQotCi0vKiBPcGNvZGUgaXMgb25seSBkZWZpbmVkIG9uIDMyIGJpdCBhcmNoaXRlY3R1cmVzLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV8zMiAoMDEwKQotCi0vKiBPcGNvZGUgaXMgb25seSBkZWZpbmVkIG9uIDY0IGJpdCBhcmNoaXRlY3R1cmVzLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV82NCAoMDIwKQotCi0vKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBNb3Rvcm9sYSBQb3dlclBDIDYwMSBwcm9jZXNzb3IuICBUaGUgNjAxCi0gICBpcyBhc3N1bWVkIHRvIHN1cHBvcnQgYWxsIFBvd2VyUEMgKFBQQ19PUENPREVfUFBDKSBpbnN0cnVjdGlvbnMsCi0gICBidXQgaXQgYWxzbyBzdXBwb3J0cyBtYW55IGFkZGl0aW9uYWwgUE9XRVIgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV82MDEgKDA0MCkKLQotLyogT3Bjb2RlIGlzIHN1cHBvcnRlZCBpbiBib3RoIHRoZSBQb3dlciBhbmQgUG93ZXJQQyBhcmNoaXRlY3R1cmVzCi0gICAoaWUsIGNvbXBpbGVyJ3MgLW1jcHU9Y29tbW9uIG9yIGFzc2VtYmxlcidzIC1tY29tKS4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfQ09NTU9OICgwMTAwKQotCi0vKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGZvciBhbnkgUG93ZXIgb3IgUG93ZXJQQyBwbGF0Zm9ybSAodGhpcyBpcwotICAgZm9yIHRoZSBhc3NlbWJsZXIncyAtbWFueSBvcHRpb24sIGFuZCBpdCBlbGltaW5hdGVzIGR1cGxpY2F0ZXMpLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV9BTlkgKDAyMDApCi0KLS8qIE9wY29kZSBpcyBzdXBwb3J0ZWQgYXMgcGFydCBvZiB0aGUgNjQtYml0IGJyaWRnZS4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfNjRfQlJJREdFICgwNDAwKQotCi0vKiBBIG1hY3JvIHRvIGV4dHJhY3QgdGhlIG1ham9yIG9wY29kZSBmcm9tIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUFBDX09QKGkpICgoKGkpID4+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+IDggYml0cyEpICovCi19OwotCi1zdHJ1Y3Qgdm90CQkJLyogdmF4IG9wY29kZSB0ZXh0ICovCi17Ci0gIGNvbnN0IGNoYXIgICAgICAgKm5hbWU7CS8qIG9wY29kZSBuYW1lOiBsb3dlcmNhc2Ugc3RyaW5nICBba2V5XSAgKi8KLSAgc3RydWN0IHZvdF93b3QgICAgZGV0YWlsOwkvKiByZXN0IG9mIG9wY29kZSB0YWJsZSAgICAgICAgICBbZGF0dW1dICovCi19OwotCi0jZGVmaW5lIHZvdF9ob3cgYXJncwotI2RlZmluZSB2b3RfY29kZSBjb2RlCi0jZGVmaW5lIHZvdF9kZXRhaWwgZGV0YWlsCi0jZGVmaW5lIHZvdF9uYW1lIG5hbWUKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2b3QKLXZvdHN0cnNbXSA9Ci17Ci17ICAgICJoYWx0IiwJeyIiLAkJCTB4MDAJfSB9LAoteyAgICAibm9wIiwJeyIiLAkJCTB4MDEJfSB9LAoteyAgICAicmVpIiwJeyIiLAkJCTB4MDIJfSB9LAoteyAgICAiYnB0IiwJeyIiLAkJCTB4MDMJfSB9LAoteyAgICAicmV0IiwJeyIiLAkJCTB4MDQJfSB9LAoteyAgICAicnNiIiwJeyIiLAkJCTB4MDUJfSB9LAoteyAgICAibGRwY3R4IiwJeyIiLAkJCTB4MDYJfSB9LAoteyAgICAic3ZwY3R4IiwJeyIiLAkJCTB4MDcJfSB9LAoteyAgICAiY3Z0cHMiLAl7InJ3YWJyd2FiIiwJCTB4MDgJfSB9LAoteyAgICAiY3Z0c3AiLAl7InJ3YWJyd2FiIiwJCTB4MDkJfSB9LAoteyAgICAiaW5kZXgiLAl7InJscmxybHJscmx3bCIsCTB4MGEJfSB9LAoteyAgICAiY3JjIiwJeyJhYnJscndhYiIsCQkweDBiCX0gfSwKLXsgICAgInByb2JlciIsCXsicmJyd2FiIiwJCTB4MGMJfSB9LAoteyAgICAicHJvYmV3IiwJeyJyYnJ3YWIiLAkgICAgICAgIDB4MGQJfSB9LAoteyAgICAiaW5zcXVlIiwJeyJhYmFiIiwJCTB4MGUJfSB9LAoteyAgICAicmVtcXVlIiwJeyJhYndsIiwJCTB4MGYJfSB9LAoteyAgICAiYnNiYiIsCXsiYmIiLAkJCTB4MTAJfSB9LAoteyAgICAiYnJiIiwJeyJiYiIsCQkJMHgxMQl9IH0sCi17ICAgICJibmVxIiwJeyJiYiIsCQkJMHgxMgl9IH0sCi17ICAgICJibmVxdSIsCXsiYmIiLAkJCTB4MTIJfSB9LAoteyAgICAiYmVxbCIsCXsiYmIiLAkJCTB4MTMJfSB9LAoteyAgICAiYmVxbHUiLAl7ImJiIiwJCQkweDEzCX0gfSwKLXsgICAgImJndHIiLAl7ImJiIiwJCQkweDE0CX0gfSwKLXsgICAgImJsZXEiLAl7ImJiIiwJCQkweDE1CX0gfSwKLXsgICAgImpzYiIsCXsiYWIiLAkJCTB4MTYJfSB9LAoteyAgICAiam1wIiwJeyJhYiIsCQkJMHgxNwl9IH0sCi17ICAgICJiZ2VxIiwJeyJiYiIsCQkJMHgxOAl9IH0sCi17ICAgICJibHNzIiwJeyJiYiIsCQkJMHgxOQl9IH0sCi17ICAgICJiZ3RydSIsCXsiYmIiLAkJCTB4MWEJfSB9LAoteyAgICAiYmxlcXUiLAl7ImJiIiwJCQkweDFiCX0gfSwKLXsgICAgImJ2YyIsCXsiYmIiLAkJCTB4MWMJfSB9LAoteyAgICAiYnZzIiwJeyJiYiIsCQkJMHgxZAl9IH0sCi17ICAgICJiY2MiLAl7ImJiIiwJCQkweDFlCX0gfSwKLXsgICAgImJnZXF1IiwJeyJiYiIsCQkJMHgxZQl9IH0sCi17ICAgICJibHNzdSIsCXsiYmIiLAkJCTB4MWYJfSB9LAoteyAgICAiYmNzIiwJeyJiYiIsCQkJMHgxZgl9IH0sCi17ICAgICJhZGRwNCIsCXsicndhYnJ3YWIiLAkJMHgyMAl9IH0sCi17ICAgICJhZGRwNiIsCXsicndhYnJ3YWJyd2FiIiwJMHgyMQl9IH0sCi17ICAgICJzdWJwNCIsCXsicndhYnJ3YWIiLAkJMHgyMgl9IH0sCi17ICAgICJzdWJwNiIsCXsicndhYnJ3YWJyd2FiIiwJMHgyMwl9IH0sCi17ICAgICJjdnRwdCIsCXsicndhYmFicndhYiIsCQkweDI0CX0gfSwKLXsgICAgIm11bHAiLAl7InJ3YWJyd2FicndhYiIsCTB4MjUJfSB9LAoteyAgICAiY3Z0dHAiLAl7InJ3YWJhYnJ3YWIiLAkJMHgyNgl9IH0sCi17ICAgICJkaXZwIiwJeyJyd2FicndhYnJ3YWIiLAkweDI3CX0gfSwKLXsgICAgIm1vdmMzIiwJeyJyd2FiYWIiLAkJMHgyOAl9IH0sCi17ICAgICJjbXBjMyIsCXsicndhYmFiIiwJCTB4MjkJfSB9LAoteyAgICAic2NhbmMiLAl7InJ3YWJhYnJiIiwJCTB4MmEJfSB9LAoteyAgICAic3BhbmMiLAl7InJ3YWJhYnJiIiwJCTB4MmIJfSB9LAoteyAgICAibW92YzUiLAl7InJ3YWJyYnJ3YWIiLAkJMHgyYwl9IH0sCi17ICAgICJjbXBjNSIsCXsicndhYnJicndhYiIsCQkweDJkCX0gfSwKLXsgICAgIm1vdnRjIiwJeyJyd2FicmJhYnJ3YWIiLAkweDJlCX0gfSwKLXsgICAgIm1vdnR1YyIsCXsicndhYnJiYWJyd2FiIiwJMHgyZgl9IH0sCi17ICAgICJic2J3IiwJeyJidyIsCQkJMHgzMAl9IH0sCi17ICAgICJicnciLAl7ImJ3IiwJCQkweDMxCX0gfSwKLXsgICAgImN2dHdsIiwJeyJyd3dsIiwJCTB4MzIJfSB9LAoteyAgICAiY3Z0d2IiLAl7InJ3d2IiLAkJMHgzMwl9IH0sCi17ICAgICJtb3ZwIiwJeyJyd2FiYWIiLAkJMHgzNAl9IH0sCi17ICAgICJjbXBwMyIsCXsicndhYmFiIiwJCTB4MzUJfSB9LAoteyAgICAiY3Z0cGwiLAl7InJ3YWJ3bCIsCQkweDM2CX0gfSwKLXsgICAgImNtcHA0IiwJeyJyd2FicndhYiIsCQkweDM3CX0gfSwKLXsgICAgImVkaXRwYyIsCXsicndhYmFiYWIiLAkJMHgzOAl9IH0sCi17ICAgICJtYXRjaGMiLAl7InJ3YWJyd2FiIiwJCTB4MzkJfSB9LAoteyAgICAibG9jYyIsCXsicmJyd2FiIiwJCTB4M2EJfSB9LAoteyAgICAic2twYyIsCXsicmJyd2FiIiwJCTB4M2IJfSB9LAoteyAgICAibW92endsIiwJeyJyd3dsIiwJCTB4M2MJfSB9LAoteyAgICAiYWNidyIsCXsicndyd213YnciLAkJMHgzZAl9IH0sCi17ICAgICJtb3ZhdyIsCXsiYXd3bCIsCQkweDNlCX0gfSwKLXsgICAgInB1c2hhdyIsCXsiYXciLAkJCTB4M2YJfSB9LAoteyAgICAiYWRkZjIiLAl7InJmbWYiLAkJMHg0MAl9IH0sCi17ICAgICJhZGRmMyIsCXsicmZyZndmIiwJCTB4NDEJfSB9LAoteyAgICAic3ViZjIiLAl7InJmbWYiLAkJMHg0Mgl9IH0sCi17ICAgICJzdWJmMyIsCXsicmZyZndmIiwJCTB4NDMJfSB9LAoteyAgICAibXVsZjIiLAl7InJmbWYiLAkJMHg0NAl9IH0sCi17ICAgICJtdWxmMyIsCXsicmZyZndmIiwJCTB4NDUJfSB9LAoteyAgICAiZGl2ZjIiLAl7InJmbWYiLAkJMHg0Ngl9IH0sCi17ICAgICJkaXZmMyIsCXsicmZyZndmIiwJCTB4NDcJfSB9LAoteyAgICAiY3Z0ZmIiLAl7InJmd2IiLAkJMHg0OAl9IH0sCi17ICAgICJjdnRmdyIsCXsicmZ3dyIsCQkweDQ5CX0gfSwKLXsgICAgImN2dGZsIiwJeyJyZndsIiwJCTB4NGEJfSB9LAoteyAgICAiY3Z0cmZsIiwJeyJyZndsIiwJCTB4NGIJfSB9LAoteyAgICAiY3Z0YmYiLAl7InJid2YiLAkJMHg0Ywl9IH0sCi17ICAgICJjdnR3ZiIsCXsicnd3ZiIsCQkweDRkCX0gfSwKLXsgICAgImN2dGxmIiwJeyJybHdmIiwJCTB4NGUJfSB9LAoteyAgICAiYWNiZiIsCXsicmZyZm1mYnciLAkJMHg0Zgl9IH0sCi17ICAgICJtb3ZmIiwJeyJyZndmIiwJCTB4NTAJfSB9LAoteyAgICAiY21wZiIsCXsicmZyZiIsCQkweDUxCX0gfSwKLXsgICAgIm1uZWdmIiwJeyJyZndmIiwJCTB4NTIJfSB9LAoteyAgICAidHN0ZiIsCXsicmYiLAkJCTB4NTMJfSB9LAoteyAgICAiZW1vZGYiLAl7InJmcmJyZndsd2YiLAkJMHg1NAl9IH0sCi17ICAgICJwb2x5ZiIsCXsicmZyd2FiIiwJCTB4NTUJfSB9LAoteyAgICAiY3Z0ZmQiLAl7InJmd2QiLAkJMHg1Ngl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3Bjb2RlIDU3IGlzIG5vdCBkZWZpbmVkIHlldCAqLwoteyAgICAiYWRhd2kiLAl7InJ3bXciLAkJMHg1OAl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3Bjb2RlIDU5IGlzIG5vdCBkZWZpbmVkIHlldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wY29kZSA1YSBpcyBub3QgZGVmaW5lZCB5ZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGNvZGUgNWIgaXMgbm90IGRlZmluZWQgeWV0ICovCi17ICAgICJpbnNxaGkiLAl7ImFiYXEiLAkJMHg1Ywl9IH0sCi17ICAgICJpbnNxdGkiLAl7ImFiYXEiLAkJMHg1ZAl9IH0sCi17ICAgICJyZW1xaGkiLAl7ImFxd2wiLAkJMHg1ZQl9IH0sCi17ICAgICJyZW1xdGkiLAl7ImFxd2wiLAkJMHg1Zgl9IH0sCi17ICAgICJhZGRkMiIsCXsicmRtZCIsCQkweDYwCX0gfSwKLXsgICAgImFkZGQzIiwJeyJyZHJkd2QiLAkJMHg2MQl9IH0sCi17ICAgICJzdWJkMiIsCXsicmRtZCIsCQkweDYyCX0gfSwKLXsgICAgInN1YmQzIiwJeyJyZHJkd2QiLAkJMHg2Mwl9IH0sCi17ICAgICJtdWxkMiIsCXsicmRtZCIsCQkweDY0CX0gfSwKLXsgICAgIm11bGQzIiwJeyJyZHJkd2QiLAkJMHg2NQl9IH0sCi17ICAgICJkaXZkMiIsCXsicmRtZCIsCQkweDY2CX0gfSwKLXsgICAgImRpdmQzIiwJeyJyZHJkd2QiLAkJMHg2Nwl9IH0sCi17ICAgICJjdnRkYiIsCXsicmR3YiIsCQkweDY4CX0gfSwKLXsgICAgImN2dGR3IiwJeyJyZHd3IiwJCTB4NjkJfSB9LAoteyAgICAiY3Z0ZGwiLAl7InJkd2wiLAkJMHg2YQl9IH0sCi17ICAgICJjdnRyZGwiLAl7InJkd2wiLAkJMHg2Ygl9IH0sCi17ICAgICJjdnRiZCIsCXsicmJ3ZCIsCQkweDZjCX0gfSwKLXsgICAgImN2dHdkIiwJeyJyd3dkIiwJCTB4NmQJfSB9LAoteyAgICAiY3Z0bGQiLAl7InJsd2QiLAkJMHg2ZQl9IH0sCi17ICAgICJhY2JkIiwJeyJyZHJkbWRidyIsCQkweDZmCX0gfSwKLXsgICAgIm1vdmQiLAl7InJkd2QiLAkJMHg3MAl9IH0sCi17ICAgICJjbXBkIiwJeyJyZHJkIiwJCTB4NzEJfSB9LAoteyAgICAibW5lZ2QiLAl7InJkd2QiLAkJMHg3Mgl9IH0sCi17ICAgICJ0c3RkIiwJeyJyZCIsCQkJMHg3Mwl9IH0sCi17ICAgICJlbW9kZCIsCXsicmRyYnJkd2x3ZCIsCQkweDc0CX0gfSwKLXsgICAgInBvbHlkIiwJeyJyZHJ3YWIiLAkJMHg3NQl9IH0sCi17ICAgICJjdnRkZiIsCXsicmR3ZiIsCQkweDc2CX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGNvZGUgNzcgaXMgbm90IGRlZmluZWQgeWV0ICovCi17ICAgICJhc2hsIiwJeyJyYnJsd2wiLAkJMHg3OAl9IH0sCi17ICAgICJhc2hxIiwJeyJyYnJxd3EiLAkJMHg3OQl9IH0sCi17ICAgICJlbXVsIiwJeyJybHJscmx3cSIsCQkweDdhCX0gfSwKLXsgICAgImVkaXYiLAl7InJscnF3bHdsIiwJCTB4N2IJfSB9LAoteyAgICAiY2xyZCIsCXsid2QiLAkJCTB4N2MJfSB9LAoteyAgICAiY2xyZyIsCXsid2ciLAkJCTB4N2MJfSB9LAoteyAgICAiY2xycSIsCXsid2QiLAkJCTB4N2MJfSB9LAoteyAgICAibW92cSIsCXsicnF3cSIsCQkweDdkCX0gfSwKLXsgICAgIm1vdmFxIiwJeyJhcXdsIiwJCTB4N2UJfSB9LAoteyAgICAibW92YWQiLAl7ImFkd2wiLAkJMHg3ZQl9IH0sCi17ICAgICJwdXNoYXEiLAl7ImFxIiwJCQkweDdmCX0gfSwKLXsgICAgInB1c2hhZCIsCXsiYWQiLAkJCTB4N2YJfSB9LAoteyAgICAiYWRkYjIiLAl7InJibWIiLAkJMHg4MAl9IH0sCi17ICAgICJhZGRiMyIsCXsicmJyYndiIiwJCTB4ODEJfSB9LAoteyAgICAic3ViYjIiLAl7InJibWIiLAkJMHg4Mgl9IH0sCi17ICAgICJzdWJiMyIsCXsicmJyYndiIiwJCTB4ODMJfSB9LAoteyAgICAibXVsYjIiLAl7InJibWIiLAkJMHg4NAl9IH0sCi17ICAgICJtdWxiMyIsCXsicmJyYndiIiwJCTB4ODUJfSB9LAoteyAgICAiZGl2YjIiLAl7InJibWIiLAkJMHg4Ngl9IH0sCi17ICAgICJkaXZiMyIsCXsicmJyYndiIiwJCTB4ODcJfSB9LAoteyAgICAiYmlzYjIiLAl7InJibWIiLAkJMHg4OAl9IH0sCi17ICAgICJiaXNiMyIsCXsicmJyYndiIiwJCTB4ODkJfSB9LAoteyAgICAiYmljYjIiLAl7InJibWIiLAkJMHg4YQl9IH0sCi17ICAgICJiaWNiMyIsCXsicmJyYndiIiwJCTB4OGIJfSB9LAoteyAgICAieG9yYjIiLAl7InJibWIiLAkJMHg4Ywl9IH0sCi17ICAgICJ4b3JiMyIsCXsicmJyYndiIiwJCTB4OGQJfSB9LAoteyAgICAibW5lZ2IiLAl7InJid2IiLAkJMHg4ZQl9IH0sCi17ICAgICJjYXNlYiIsCXsicmJyYnJiIiwJCTB4OGYJfSB9LAoteyAgICAibW92YiIsCXsicmJ3YiIsCQkweDkwCX0gfSwKLXsgICAgImNtcGIiLAl7InJicmIiLAkJMHg5MQl9IH0sCi17ICAgICJtY29tYiIsCXsicmJ3YiIsCQkweDkyCX0gfSwKLXsgICAgImJpdGIiLAl7InJicmIiLAkJMHg5Mwl9IH0sCi17ICAgICJjbHJiIiwJeyJ3YiIsCQkJMHg5NAl9IH0sCi17ICAgICJ0c3RiIiwJeyJyYiIsCQkJMHg5NQl9IH0sCi17ICAgICJpbmNiIiwJeyJtYiIsCQkJMHg5Ngl9IH0sCi17ICAgICJkZWNiIiwJeyJtYiIsCQkJMHg5Nwl9IH0sCi17ICAgICJjdnRibCIsCXsicmJ3bCIsCQkweDk4CX0gfSwKLXsgICAgImN2dGJ3IiwJeyJyYnd3IiwJCTB4OTkJfSB9LAoteyAgICAibW92emJsIiwJeyJyYndsIiwJCTB4OWEJfSB9LAoteyAgICAibW92emJ3IiwJeyJyYnd3IiwJCTB4OWIJfSB9LAoteyAgICAicm90bCIsCXsicmJybHdsIiwJCTB4OWMJfSB9LAoteyAgICAiYWNiYiIsCXsicmJyYm1iYnciLAkJMHg5ZAl9IH0sCi17ICAgICJtb3ZhYiIsCXsiYWJ3bCIsCQkweDllCX0gfSwKLXsgICAgInB1c2hhYiIsCXsiYWIiLAkJCTB4OWYJfSB9LAoteyAgICAiYWRkdzIiLAl7InJ3bXciLAkJMHhhMAl9IH0sCi17ICAgICJhZGR3MyIsCXsicndyd3d3IiwJCTB4YTEJfSB9LAoteyAgICAic3VidzIiLAl7InJ3bXciLAkJMHhhMgl9IH0sCi17ICAgICJzdWJ3MyIsCXsicndyd3d3IiwJCTB4YTMJfSB9LAoteyAgICAibXVsdzIiLAl7InJ3bXciLAkJMHhhNAl9IH0sCi17ICAgICJtdWx3MyIsCXsicndyd3d3IiwJCTB4YTUJfSB9LAoteyAgICAiZGl2dzIiLAl7InJ3bXciLAkJMHhhNgl9IH0sCi17ICAgICJkaXZ3MyIsCXsicndyd3d3IiwJCTB4YTcJfSB9LAoteyAgICAiYmlzdzIiLAl7InJ3bXciLAkJMHhhOAl9IH0sCi17ICAgICJiaXN3MyIsCXsicndyd3d3IiwJCTB4YTkJfSB9LAoteyAgICAiYmljdzIiLAl7InJ3bXciLAkJMHhhYQl9IH0sCi17ICAgICJiaWN3MyIsCXsicndyd3d3IiwJCTB4YWIJfSB9LAoteyAgICAieG9ydzIiLAl7InJ3bXciLAkJMHhhYwl9IH0sCi17ICAgICJ4b3J3MyIsCXsicndyd3d3IiwJCTB4YWQJfSB9LAoteyAgICAibW5lZ3ciLAl7InJ3d3ciLAkJMHhhZQl9IH0sCi17ICAgICJjYXNldyIsCXsicndyd3J3IiwJCTB4YWYJfSB9LAoteyAgICAibW92dyIsCXsicnd3dyIsCQkweGIwCX0gfSwKLXsgICAgImNtcHciLAl7InJ3cnciLAkJMHhiMQl9IH0sCi17ICAgICJtY29tdyIsCXsicnd3dyIsCQkweGIyCX0gfSwKLXsgICAgImJpdHciLAl7InJ3cnciLAkJMHhiMwl9IH0sCi17ICAgICJjbHJ3IiwJeyJ3dyIsCQkJMHhiNAl9IH0sCi17ICAgICJ0c3R3IiwJeyJydyIsCQkJMHhiNQl9IH0sCi17ICAgICJpbmN3IiwJeyJtdyIsCQkJMHhiNgl9IH0sCi17ICAgICJkZWN3IiwJeyJtdyIsCQkJMHhiNwl9IH0sCi17ICAgICJiaXNwc3ciLAl7InJ3IiwJCQkweGI4CX0gfSwKLXsgICAgImJpY3BzdyIsCXsicnciLAkJCTB4YjkJfSB9LAoteyAgICAicG9wciIsCXsicnciLAkJCTB4YmEJfSB9LAoteyAgICAicHVzaHIiLAl7InJ3IiwJCQkweGJiCX0gfSwKLXsgICAgImNobWsiLAl7InJ3IiwJCQkweGJjCX0gfSwKLXsgICAgImNobWUiLAl7InJ3IiwJCQkweGJkCX0gfSwKLXsgICAgImNobXMiLAl7InJ3IiwJCQkweGJlCX0gfSwKLXsgICAgImNobXUiLAl7InJ3IiwJCQkweGJmCX0gfSwKLXsgICAgImFkZGwyIiwJeyJybG1sIiwJCTB4YzAJfSB9LAoteyAgICAiYWRkbDMiLAl7InJscmx3bCIsCQkweGMxCX0gfSwKLXsgICAgInN1YmwyIiwJeyJybG1sIiwJCTB4YzIJfSB9LAoteyAgICAic3VibDMiLAl7InJscmx3bCIsCQkweGMzCX0gfSwKLXsgICAgIm11bGwyIiwJeyJybG1sIiwJCTB4YzQJfSB9LAoteyAgICAibXVsbDMiLAl7InJscmx3bCIsCQkweGM1CX0gfSwKLXsgICAgImRpdmwyIiwJeyJybG1sIiwJCTB4YzYJfSB9LAoteyAgICAiZGl2bDMiLAl7InJscmx3bCIsCQkweGM3CX0gfSwKLXsgICAgImJpc2wyIiwJeyJybG1sIiwJCTB4YzgJfSB9LAoteyAgICAiYmlzbDMiLAl7InJscmx3bCIsCQkweGM5CX0gfSwKLXsgICAgImJpY2wyIiwJeyJybG1sIiwJCTB4Y2EJfSB9LAoteyAgICAiYmljbDMiLAl7InJscmx3bCIsCQkweGNiCX0gfSwKLXsgICAgInhvcmwyIiwJeyJybG1sIiwJCTB4Y2MJfSB9LAoteyAgICAieG9ybDMiLAl7InJscmx3bCIsCQkweGNkCX0gfSwKLXsgICAgIm1uZWdsIiwJeyJybHdsIiwJCTB4Y2UJfSB9LAoteyAgICAiY2FzZWwiLAl7InJscmxybCIsCQkweGNmCX0gfSwKLXsgICAgIm1vdmwiLAl7InJsd2wiLAkJMHhkMAl9IH0sCi17ICAgICJjbXBsIiwJeyJybHJsIiwJCTB4ZDEJfSB9LAoteyAgICAibWNvbWwiLAl7InJsd2wiLAkJMHhkMgl9IH0sCi17ICAgICJiaXRsIiwJeyJybHJsIiwJCTB4ZDMJfSB9LAoteyAgICAiY2xyZiIsCXsid2YiLAkJCTB4ZDQJfSB9LAoteyAgICAiY2xybCIsCXsid2wiLAkJCTB4ZDQJfSB9LAoteyAgICAidHN0bCIsCXsicmwiLAkJCTB4ZDUJfSB9LAoteyAgICAiaW5jbCIsCXsibWwiLAkJCTB4ZDYJfSB9LAoteyAgICAiZGVjbCIsCXsibWwiLAkJCTB4ZDcJfSB9LAoteyAgICAiYWR3YyIsCXsicmxtbCIsCQkweGQ4CX0gfSwKLXsgICAgInNid2MiLAl7InJsbWwiLAkJMHhkOQl9IH0sCi17ICAgICJtdHByIiwJeyJybHJsIiwJCTB4ZGEJfSB9LAoteyAgICAibWZwciIsCXsicmx3bCIsCQkweGRiCX0gfSwKLXsgICAgIm1vdnBzbCIsCXsid2wiLAkJCTB4ZGMJfSB9LAoteyAgICAicHVzaGwiLAl7InJsIiwJCQkweGRkCX0gfSwKLXsgICAgIm1vdmFsIiwJeyJhbHdsIiwJCTB4ZGUJfSB9LAoteyAgICAibW92YWYiLAl7ImFmd2wiLAkJMHhkZQl9IH0sCi17ICAgICJwdXNoYWwiLAl7ImFsIiwJCQkweGRmCX0gfSwKLXsgICAgInB1c2hhZiIsCXsiYWYiLAkJCTB4ZGYJfSB9LAoteyAgICAiYmJzIiwJeyJybHZiYmIiLAkJMHhlMAl9IH0sCi17ICAgICJiYmMiLAl7InJsdmJiYiIsCQkweGUxCX0gfSwKLXsgICAgImJic3MiLAl7InJsdmJiYiIsCQkweGUyCX0gfSwKLXsgICAgImJiY3MiLAl7InJsdmJiYiIsCQkweGUzCX0gfSwKLXsgICAgImJic2MiLAl7InJsdmJiYiIsCQkweGU0CX0gfSwKLXsgICAgImJiY2MiLAl7InJsdmJiYiIsCQkweGU1CX0gfSwKLXsgICAgImJic3NpIiwJeyJybHZiYmIiLAkJMHhlNgl9IH0sCi17ICAgICJiYmNjaSIsCXsicmx2YmJiIiwJCTB4ZTcJfSB9LAoteyAgICAiYmxicyIsCXsicmxiYiIsCQkweGU4CX0gfSwKLXsgICAgImJsYmMiLAl7InJsYmIiLAkJMHhlOQl9IH0sCi17ICAgICJmZnMiLAl7InJscmJ2YndsIiwJCTB4ZWEJfSB9LAoteyAgICAiZmZjIiwJeyJybHJidmJ3bCIsCQkweGViCX0gfSwKLXsgICAgImNtcHYiLAl7InJscmJ2YnJsIiwJCTB4ZWMJfSB9LAoteyAgICAiY21wenYiLAl7InJscmJ2YnJsIiwJCTB4ZWQJfSB9LAoteyAgICAiZXh0diIsCXsicmxyYnZid2wiLAkJMHhlZQl9IH0sCi17ICAgICJleHR6diIsCXsicmxyYnZid2wiLAkJMHhlZgl9IH0sCi17ICAgICJpbnN2IiwJeyJybHJscmJ2YiIsCQkweGYwCX0gfSwKLXsgICAgImFjYmwiLAl7InJscmxtbGJ3IiwJCTB4ZjEJfSB9LAoteyAgICAiYW9ibHNzIiwJeyJybG1sYmIiLAkJMHhmMgl9IH0sCi17ICAgICJhb2JsZXEiLAl7InJsbWxiYiIsCQkweGYzCX0gfSwKLXsgICAgInNvYmdlcSIsCXsibWxiYiIsCQkweGY0CX0gfSwKLXsgICAgInNvYmd0ciIsCXsibWxiYiIsCQkweGY1CX0gfSwKLXsgICAgImN2dGxiIiwJeyJybHdiIiwJCTB4ZjYJfSB9LAoteyAgICAiY3Z0bHciLAl7InJsd3ciLAkJMHhmNwl9IH0sCi17ICAgICJhc2hwIiwJeyJyYnJ3YWJyYnJ3YWIiLAkweGY4CX0gfSwKLXsgICAgImN2dGxwIiwJeyJybHJ3YWIiLAkJMHhmOQl9IH0sCi17ICAgICJjYWxsZyIsCXsiYWJhYiIsCQkweGZhCX0gfSwKLXsgICAgImNhbGxzIiwJeyJybGFiIiwJCTB4ZmIJfSB9LAoteyAgICAieGZjIiwJeyIiLAkJCTB4ZmMJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuZGVmaW5lZCBvcGNvZGVzIGhlcmUgKi8KLXsgICAgImN2dGRoIiwJeyJyZHdoIiwJCTB4MzJmZAl9IH0sCi17ICAgICJjdnRnZiIsCXsicmd3aCIsCQkweDMzZmQJfSB9LAoteyAgICAiYWRkZzIiLAl7InJnbWciLAkJMHg0MGZkCX0gfSwKLXsgICAgImFkZGczIiwJeyJyZ3Jnd2ciLAkJMHg0MWZkCX0gfSwKLXsgICAgInN1YmcyIiwJeyJyZ21nIiwJCTB4NDJmZAl9IH0sCi17ICAgICJzdWJnMyIsCXsicmdyZ3dnIiwJCTB4NDNmZAl9IH0sCi17ICAgICJtdWxnMiIsCXsicmdtZyIsCQkweDQ0ZmQJfSB9LAoteyAgICAibXVsZzMiLAl7InJncmd3ZyIsCQkweDQ1ZmQJfSB9LAoteyAgICAiZGl2ZzIiLAl7InJnbWciLAkJMHg0NmZkCX0gfSwKLXsgICAgImRpdmczIiwJeyJyZ3Jnd2ciLAkJMHg0N2ZkCX0gfSwKLXsgICAgImN2dGdiIiwJeyJyZ3diIiwJCTB4NDhmZAl9IH0sCi17ICAgICJjdnRndyIsCXsicmd3dyIsCQkweDQ5ZmQJfSB9LAoteyAgICAiY3Z0Z2wiLAl7InJnd2wiLAkJMHg0YWZkCX0gfSwKLXsgICAgImN2dHJnbCIsCXsicmd3bCIsCQkweDRiZmQJfSB9LAoteyAgICAiY3Z0YmciLAl7InJid2ciLAkJMHg0Y2ZkCX0gfSwKLXsgICAgImN2dHdnIiwJeyJyd3dnIiwJCTB4NGRmZAl9IH0sCi17ICAgICJjdnRsZyIsCXsicmx3ZyIsCQkweDRlZmQJfSB9LAoteyAgICAiYWNiZyIsCXsicmdyZ21nYnciLAkJMHg0ZmZkCX0gfSwKLXsgICAgIm1vdmciLAl7InJnd2ciLAkJMHg1MGZkCX0gfSwKLXsgICAgImNtcGciLAl7InJncmciLAkJMHg1MWZkCX0gfSwKLXsgICAgIm1uZWdnIiwJeyJyZ3dnIiwJCTB4NTJmZAl9IH0sCi17ICAgICJ0c3RnIiwJeyJyZyIsCQkJMHg1M2ZkCX0gfSwKLXsgICAgImVtb2RnIiwJeyJyZ3J3cmd3bHdnIiwJCTB4NTRmZAl9IH0sCi17ICAgICJwb2x5ZyIsCXsicmdyd2FiIiwJCTB4NTVmZAl9IH0sCi17ICAgICJjdnRnaCIsCXsicmd3aCIsCQkweDU2ZmQJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuZGVmaW5lZCBvcGNvZGVzIGhlcmUgKi8KLXsgICAgImFkZGgyIiwJeyJyaG1oIiwJCTB4NjBmZAl9IH0sCi17ICAgICJhZGRoMyIsCXsicmhyaHdoIiwJCTB4NjFmZAl9IH0sCi17ICAgICJzdWJoMiIsCXsicmhtaCIsCQkweDYyZmQJfSB9LAoteyAgICAic3ViaDMiLAl7InJocmh3aCIsCQkweDYzZmQJfSB9LAoteyAgICAibXVsaDIiLAl7InJobWgiLAkJMHg2NGZkCX0gfSwKLXsgICAgIm11bGgzIiwJeyJyaHJod2giLAkJMHg2NWZkCX0gfSwKLXsgICAgImRpdmgyIiwJeyJyaG1oIiwJCTB4NjZmZAl9IH0sCi17ICAgICJkaXZoMyIsCXsicmhyaHdoIiwJCTB4NjdmZAl9IH0sCi17ICAgICJjdnRoYiIsCXsicmh3YiIsCQkweDY4ZmQJfSB9LAoteyAgICAiY3Z0aHciLAl7InJod3ciLAkJMHg2OWZkCX0gfSwKLXsgICAgImN2dGhsIiwJeyJyaHdsIiwJCTB4NmFmZAl9IH0sCi17ICAgICJjdnRyaGwiLAl7InJod2wiLAkJMHg2YmZkCX0gfSwKLXsgICAgImN2dGJoIiwJeyJyYndoIiwJCTB4NmNmZAl9IH0sCi17ICAgICJjdnR3aCIsCXsicnd3aCIsCQkweDZkZmQJfSB9LAoteyAgICAiY3Z0bGgiLAl7InJsd2giLAkJMHg2ZWZkCX0gfSwKLXsgICAgImFjYmgiLAl7InJocmhtaGJ3IiwJCTB4NmZmZAl9IH0sCi17ICAgICJtb3ZoIiwJeyJyaHdoIiwJCTB4NzBmZAl9IH0sCi17ICAgICJjbXBoIiwJeyJyaHJoIiwJCTB4NzFmZAl9IH0sCi17ICAgICJtbmVnaCIsCXsicmh3aCIsCQkweDcyZmQJfSB9LAoteyAgICAidHN0aCIsCXsicmgiLAkJCTB4NzNmZAl9IH0sCi17ICAgICJlbW9kaCIsCXsicmhyd3Jod2x3aCIsCQkweDc0ZmQJfSB9LAoteyAgICAicG9seWgiLAl7InJocndhYiIsCQkweDc1ZmQJfSB9LAoteyAgICAiY3Z0aGciLAl7InJod2ciLAkJMHg3NmZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJjbHJoIiwJeyJ3aCIsCQkJMHg3Y2ZkCX0gfSwKLXsgICAgImNscm8iLAl7IndvIiwJCQkweDdjZmQJfSB9LAoteyAgICAibW92byIsCXsicm93byIsCQkweDdkZmQJfSB9LAoteyAgICAibW92YWgiLAl7ImFod2wiLAkJMHg3ZWZkCX0gfSwKLXsgICAgIm1vdmFvIiwJeyJhb3dsIiwJCTB4N2VmZAl9IH0sCi17ICAgICJwdXNoYWgiLAl7ImFoIiwJCQkweDdmZmQJfSB9LAoteyAgICAicHVzaGFvIiwJeyJhbyIsCQkJMHg3ZmZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJjdnRmaCIsCXsicmZ3aCIsCQkweDk4ZmQJfSB9LAoteyAgICAiY3Z0ZmciLAl7InJmd2ciLAkJMHg5OWZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJjdnRoZiIsCXsicmh3ZiIsCQkweGY2ZmQJfSB9LAoteyAgICAiY3Z0aGQiLAl7InJod2QiLAkJMHhmN2ZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJidWdsIiwJeyJybCIsCQkJMHhmZGZmCX0gfSwKLXsgICAgImJ1Z3ciLAl7InJ3IiwJCQkweGZlZmYJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuZGVmaW5lZCBvcGNvZGVzIGhlcmUgKi8KLQoteyAgICAgICIiLAl7IiIsIDB9IH0JCS8qIGVtcHR5IGlzIGVuZCBzZW50aW5lbCAqLwotCi19OwkJCQkvKiB2b3RzdHJzICovCi0KLS8qIGVuZDogdmF4Lm9wY29kZS5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zOWsuaCBiL2luY2x1ZGUvb3M5ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjJlZWQyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3M5ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLSNpZiAhZGVmaW5lZChfTU9EVUxFX0gpCi0jZGVmaW5lIF9NT0RVTEVfSAotCi0vKiBPUy05MDAwIGkzODYgbW9kdWxlIGhlYWRlciBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBfTVBGMzg2Ci0KLS8qIHNpemVvZiBjb21tb24gaGVhZGVyIGxlc3MgcGFyaXR5IGZpZWxkICovCi0jZGVmaW5lIE5fTV9QQVJJVFkgIChzaXplb2YobWhfY29tKS1zaXplb2YodW5pc2duZWQgc2hvcnQpKQotI2RlZmluZSBPTERfTV9QQVJJVFkgNDYKLSNkZWZpbmUgTV9QQVJJVFkgTl9NX1BBUklUWQotCi0jaWZkZWYgX01QRjY4SwotI2RlZmluZSBNT0RTWU5DIDB4NGFmZCAgICAgIC8qIG1vZHVsZSBoZWFkZXIgc3luYyBjb2RlIGZvciA2ODB4MCBwcm9jZXNzb3JzICovCi0jZW5kaWYKLQotI2lmZGVmIF9NUEYzODYKLSNkZWZpbmUgTU9EU1lOQyAweDRhZmMgICAgICAvKiBtb2R1bGUgaGVhZGVyIHN5bmMgY29kZSBmb3IgODAzODYgcHJvY2Vzc29ycyAqLwotI2VuZGlmCi0KLSNkZWZpbmUgTU9EUkVWCTEJCQkvKiBtb2R1bGUgZm9ybWF0IHJldmlzaW9uIDEgKi8KLSNkZWZpbmUgQ1JDQ09OCTB4ODAwZmUzCS8qIGNyYyBwb2x5bm9taWFsIGNvbnN0YW50ICovCi0KLS8qIE1vZHVsZSBhY2Nlc3MgcGVybWlzc2lvbiB2YWx1ZXMgKi8KLSNkZWZpbmUgTVBfT1dORVJfUkVBRAkweDAwMDEKLSNkZWZpbmUgTVBfT1dORVJfV1JJVEUJMHgwMDAyCi0jZGVmaW5lIE1QX09XTkVSX0VYRUMJMHgwMDA0Ci0jZGVmaW5lIE1QX0dST1VQX1JFQUQJMHgwMDEwCi0jZGVmaW5lIE1QX0dST1VQX1dSSVRFCTB4MDAyMAotI2RlZmluZSBNUF9HUk9VUF9FWEVDCTB4MDA0MAotI2RlZmluZSBNUF9XT1JMRF9SRUFECTB4MDEwMAotI2RlZmluZSBNUF9XT1JMRF9XUklURQkweDAyMDAKLSNkZWZpbmUgTVBfV09STERfRVhFQwkweDA0MDAKLSNkZWZpbmUgTVBfV09STERfQUNDRVNTCTB4MDc3NwotI2RlZmluZSBNUF9PV05FUl9NQVNLCTB4MDAwZgotI2RlZmluZSBNUF9HUk9VUF9NQVNLCTB4MDBmMAotI2RlZmluZSBNUF9XT1JMRF9NQVNLCTB4MGYwMAotI2RlZmluZSBNUF9TWVNUTV9NQVNLCTB4ZjAwMAotCi0vKiBNb2R1bGUgVHlwZS9MYW5ndWFnZSB2YWx1ZXMgKi8KLSNkZWZpbmUgTVRfQU5ZCQkwCi0jZGVmaW5lIE1UX1BST0dSQU0JMHgwMDAxCi0jZGVmaW5lIE1UX1NVQlJPVVQJMHgwMDAyCi0jZGVmaW5lIE1UX01VTFRJCTB4MDAwMwotI2RlZmluZSBNVF9EQVRBCQkweDAwMDQKLSNkZWZpbmUgTVRfVFJBUExJQgkweDAwMGIKLSNkZWZpbmUgTVRfU1lTVEVNCTB4MDAwYwotI2RlZmluZSBNVF9GSUxFTUFOCTB4MDAwZAotI2RlZmluZSBNVF9ERVZEUlZSCTB4MDAwZSAKLSNkZWZpbmUgTVRfREVWREVTQwkweDAwMGYKLSNkZWZpbmUgTVRfTUFTSwkJMHhmZjAwCi0KLSNkZWZpbmUgTUxfQU5ZCQkwCi0jZGVmaW5lIE1MX09CSkVDVAkxCi0jZGVmaW5lIE1MX0lDT0RFCTIKLSNkZWZpbmUgTUxfUENPREUJMwotI2RlZmluZSBNTF9DQ09ERQk0Ci0jZGVmaW5lIE1MX0NCTENPREUJNQotI2RlZmluZSBNTF9GUlROQ09ERQk2Ci0jZGVmaW5lIE1MX01BU0sJCTB4MDBmZgotCi0jZGVmaW5lIG1rdHlwZWxhbmcodHlwZSxsYW5nKQkoKCh0eXBlKTw8OCl8KGxhbmcpKQotCi0vKiBNb2R1bGUgQXR0cmlidXRlIHZhbHVlcyAqLwotI2RlZmluZSBNQV9SRUVOVAkweDgwCi0jZGVmaW5lIE1BX0dIT1NUCTB4NDAKLSNkZWZpbmUgTUFfU1VQRVIJMHgyMAotI2RlZmluZSBNQV9NQVNLCQkweGZmMDAKLSNkZWZpbmUgTVJfTUFTSwkJMHgwMGZmCi0KLSNkZWZpbmUgbWthdHRyZXZzKGF0dHIsIHJldnMpCSgoKGF0dHIpPDw4KXwocmV2cykpCi0KLSNkZWZpbmUgbV91c2VyIG1fb3duZXIuZ3JwX3Vzci51c3IKLSNkZWZpbmUgbV9ncm91cCBtX293bmVyLmdycF91c3IuZ3JwCi0jZGVmaW5lIG1fZ3JvdXBfdXNlciBtX293bmVyLmdyb3VwX3VzZXIKLQotLyogbWFjcm8gZGVmaW5pdGlvbnMgZm9yIGFjY2Vzc2luZyBtb2R1bGUgaGVhZGVyIGZpZWxkcyAqLwotI2RlZmluZSBNT0ROQU1FKG1vZCkgKCh1X2NoYXIqKSgodV9jaGFyKiltb2QgKyAoKE1oX2NvbSltb2QpLT5tX25hbWUpKQotI2lmIDAKLS8qIEFwcGVhcnMgbm90IHRvIGJlIHVzZWQsIGFuZCB0aGUgdV9pbnQzMiB0eXBlZGVmIGlzIGdvbmUgKGJlY2F1c2UgaXQKLSAgIGNvbmZsaWN0ZWQgd2l0aCBhIE1hY2ggaGVhZGVyLiAgKi8KLSNkZWZpbmUgTU9EU0laRShtb2QpICgodV9pbnQzMikoKE1oX2NvbSltb2QpLT5tX3NpemUpCi0jZW5kaWYgLyogMCAqLwotI2RlZmluZSBNSENPTV9CWVRFU19TSVpFIDgwCi0jZGVmaW5lIE5fQkFETUFHKGEpICgoKGEpLmFfaW5mbykgIT0gTU9EU1lOQykKLQotdHlwZWRlZiBzdHJ1Y3QgbWhfY29tIHsKLSAgLyogc3luYyBieXRlcyAoJDRhZmMpLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtX3N5bmNbMl07Ci0gIHVuc2lnbmVkIGNoYXIgbV9zeXNyZXZbMl07CQkvKiBzeXN0ZW0gcmV2aXNpb24gY2hlY2sgdmFsdWUgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fc2l6ZVs0XTsJCQkvKiBtb2R1bGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyCi0gICAgbV9vd25lcls0XTsJCS8qIGdyb3VwL3VzZXIgaWQgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fbmFtZVs0XTsJCQkvKiBvZmZzZXQgdG8gbW9kdWxlIG5hbWUgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fYWNjZXNzWzJdLAkJLyogYWNjZXNzIHBlcm1pc3Npb25zICovCi0gICAgbV90eWxhblsyXSwJCS8qIHR5cGUvbGFuZyAqLwotICAgIG1fYXR0cmV2WzJdLAkJLyogcmV2L2F0dHIgKi8KLSAgICBtX2VkaXRbMl07CQkJLyogZWRpdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCi0gICAgbV9uZWVkc1s0XSwJCS8qIG1vZHVsZSBoYXJkd2FyZSByZXF1aXJlbWVudHMgZmxhZ3MuIChyZXNlcnZlZCkgKi8KLSAgICBtX3VzYWdlWzRdLAkJLyogY29tbWVudCBzdHJpbmcgb2Zmc2V0ICovCi0gICAgbV9zeW1ib2xbNF0sCQkvKiBzeW1ib2wgdGFibGUgb2Zmc2V0ICovCi0gICAgbV9leGVjWzRdLAkJCS8qIG9mZnNldCB0byBleGVjdXRpb24gZW50cnkgcG9pbnQgKi8KLSAgICBtX2V4Y3B0WzRdLAkJLyogb2Zmc2V0IHRvIGV4Y2VwdGlvbiBlbnRyeSBwb2ludCAqLwotICAgIG1fZGF0YVs0XSwJCQkvKiBkYXRhIHN0b3JhZ2UgcmVxdWlyZW1lbnQgKi8KLSAgICBtX3N0YWNrWzRdLAkJLyogc3RhY2sgc2l6ZSAqLwotICAgIG1faWRhdGFbNF0sCQkvKiBvZmZzZXQgdG8gaW5pdGlhbGl6ZWQgZGF0YSAqLwotICAgIG1faWRyZWZbNF0sCQkvKiBvZmZzZXQgdG8gZGF0YSByZWZlcmVuY2UgbGlzdHMgKi8KLSAgICBtX2luaXRbNF0sCQkJLyogaW5pdGlhbGl6YXRpb24gcm91dGluZSBvZmZzZXQgKi8KLSAgICBtX3Rlcm1bNF07CQkJLyogdGVybWluYXRpb24gcm91dGluZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1faWRlbnRbMl07CQkvKiBpZGVudCBjb2RlIGZvciBpZGVudCBwcm9ncmFtICovCi0gIGNoYXIKLSAgICBtX3NwYXJlWzhdOwkvKiByZXNlcnZlZCBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCi0gICAgbV9wYXJpdHlbMl07IAkJLyogaGVhZGVyIHBhcml0eSAqLwotfSBtaF9jb20sKk1oX2NvbTsKLQotLyogRXhlY3V0YWJsZSBtZW1vcnkgbW9kdWxlICovCi10eXBlZGVmIG1oX2NvbSAqTWhfZXhlYyxtaF9leGVjOwotCi0vKiBEYXRhIG1lbW9yeSBtb2R1bGUgKi8KLXR5cGVkZWYgbWhfY29tICpNaF9kYXRhLG1oX2RhdGE7Ci0KLS8qIEZpbGUgbWFuYWdlciBtZW1vcnkgbW9kdWxlICovCi10eXBlZGVmIG1oX2NvbSAqTWhfZm1hbixtaF9mbWFuOwotCi0vKiBkZXZpY2UgZHJpdmVyIG1vZHVsZSAqLwotdHlwZWRlZiBtaF9jb20gKk1oX2RydnIsbWhfZHJ2cjsKLQotLyogdHJhcCBoYW5kbGVyIG1vZHVsZSAqLwotdHlwZWRlZgltaF9jb20gbWhfdHJhcCwgKk1oX3RyYXA7Ci0KLS8qIERldmljZSBkZXNjcmlwdG9yIG1vZHVsZSAqLwotdHlwZWRlZgltaF9jb20gKk1oX2RldixtaF9kZXY7Ci0KLS8qIENvbmZpZ3VyYXRpb24gbW9kdWxlICovCi10eXBlZGVmIG1oX2NvbSAqTWhfY29uZmlnLCBtaF9jb25maWc7Ci0KLSNpZiAwIAotCi0jaWYgIWRlZmluZWQoX01PRERJUl9IKQotLyogZ28gZ2V0IF9vc19mbW9kIChhbmQgb3RoZXJzKSAqLwotI2luY2x1ZGUgPG1vZGRpci5oPgotI2VuZGlmCi0KLWVycm9yX2NvZGUgX29zX2NyYyh2b2lkICosIHVfaW50MzIsIGludCAqKTsKLWVycm9yX2NvZGUgX29zX2RhdG1vZChjaGFyICosIHVfaW50MzIsIHVfaW50MTYgKiwgdV9pbnQxNiAqLCB1X2ludDMyLCB2b2lkICoqLCBtaF9kYXRhICoqKTsKLWVycm9yX2NvZGUgX29zX2dldF9tb2RkaXIodm9pZCAqLCB1X2ludDMyICopOwotZXJyb3JfY29kZSBfb3NfaW5pdGRhdGEobWhfY29tICosIHZvaWQgKik7Ci1lcnJvcl9jb2RlIF9vc19saW5rKGNoYXIgKiosIG1oX2NvbSAqKiwgdm9pZCAqKiwgdV9pbnQxNiAqLCB1X2ludDE2ICopOwotZXJyb3JfY29kZSBfb3NfbGlua20obWhfY29tICosIHZvaWQgKiosIHVfaW50MTYgKiwgdV9pbnQxNiAqKTsKLWVycm9yX2NvZGUgX29zX2xvYWQoY2hhciAqLCBtaF9jb20gKiosIHZvaWQgKiosIHVfaW50MzIsIHVfaW50MTYgKiwgdV9pbnQxNiAqLCB1X2ludDMyKTsKLWVycm9yX2NvZGUgX29zX21rbW9kdWxlKGNoYXIgKiwgdV9pbnQzMiwgdV9pbnQxNiAqLCB1X2ludDE2ICosIHVfaW50MzIsIHZvaWQgKiosIG1oX2NvbSAqKiwgdV9pbnQzMik7Ci1lcnJvcl9jb2RlIF9vc19tb2RhZGRyKHZvaWQgKiwgbWhfY29tICoqKTsKLWVycm9yX2NvZGUgX29zX3NldGNyYyhtaF9jb20gKik7Ci1lcnJvcl9jb2RlIF9vc19zbGluayh1X2ludDMyLCBjaGFyICosIHZvaWQgKiosIHZvaWQgKiosIG1oX2NvbSAqKik7Ci1lcnJvcl9jb2RlIF9vc19zbGlua20odV9pbnQzMiwgbWhfY29tICosIHZvaWQgKiosIHZvaWQgKiopOwotZXJyb3JfY29kZSBfb3NfdW5saW5rKG1oX2NvbSAqKTsKLWVycm9yX2NvZGUgX29zX3VubG9hZChjaGFyICosIHVfaW50MzIpOwotZXJyb3JfY29kZSBfb3NfdGxpbmsodV9pbnQzMiwgY2hhciAqLCB2b2lkICoqLCBtaF90cmFwICoqLCB2b2lkICosIHVfaW50MzIpOwotZXJyb3JfY29kZSBfb3NfdGxpbmttKHVfaW50MzIsIG1oX2NvbSAqLCB2b2lkICoqLCB2b2lkICosIHVfaW50MzIpOwotZXJyb3JfY29kZSBfb3NfaW9kZWwobWhfY29tICopOwotZXJyb3JfY29kZSBfb3Nfdm1vZHVsKG1oX2NvbSAqLCBtaF9jb20gKiwgdV9pbnQzMik7Ci0jZW5kaWYgLyogMCAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJvZ3Jlc3MuaCBiL2luY2x1ZGUvcHJvZ3Jlc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE4MzE4YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3Byb2dyZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiBEZWZhdWx0IGRlZmluaXRpb25zIGZvciBwcm9ncmVzcyBtYWNyb3MuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZSBkZWZhdWx0IGRlZmluaXRpb25zIGJlbG93IGFyZSBpbnRlbmRlZCB0byBiZSByZXBsYWNlZCBieSByZWFsCi0gICBkZWZpbml0aW9ucywgaWYgYnVpbGRpbmcgdGhlIHRvb2xzIGZvciBhbiBpbnRlcmFjdGl2ZSBwcm9ncmFtbWluZwotICAgZW52aXJvbm1lbnQuICAqLwotCi0jaWZuZGVmIF9QUk9HUkVTU19ICi0jZGVmaW5lIF9QUk9HUkVTU19ICi0KLSNpZm5kZWYgU1RBUlRfUFJPR1JFU1MKLSNkZWZpbmUgU1RBUlRfUFJPR1JFU1MoU1RSLE4pCi0jZW5kaWYKLQotI2lmbmRlZiBQUk9HUkVTUwotI2RlZmluZSBQUk9HUkVTUyhYKQotI2VuZGlmCi0KLSNpZm5kZWYgRU5EX1BST0dSRVNTCi0jZGVmaW5lIEVORF9QUk9HUkVTUyhTVFIpCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9QUk9HUkVTU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3JlZ3MvQ2hhbmdlTG9nIGIvaW5jbHVkZS9yZWdzL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JlZ3MvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmVtb3RlLXNpbS5oIGIvaW5jbHVkZS9yZW1vdGUtc2ltLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NDgwYjQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yZW1vdGUtc2ltLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotLyogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBzaW11bGF0b3IgYW5kIGdkYi4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWYgIWRlZmluZWQgKFJFTU9URV9TSU1fSCkKLSNkZWZpbmUgUkVNT1RFX1NJTV9IIDEKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBUaGlzIGZpbGUgaXMgdXNlZCB3aGVuIGJ1aWxkaW5nIHN0YW5kLWFsb25lIHNpbXVsYXRvcnMsIHNvIGlzb2xhdGUgdGhpcwotICAgZmlsZSBmcm9tIGdkYi4gICovCi0KLS8qIFBpY2sgdXAgQ09SRV9BRERSX1RZUEUgaWYgZGVmaW5lZCAoZnJvbSBnZGIpLCBvdGhlcndpc2UgdXNlIHNhbWUgdmFsdWUgYXMKLSAgIGdkYiBkb2VzICh1bnNpZ25lZCBpbnQgLSBmcm9tIGRlZnMuaCkuICAqLwotCi0jaWZuZGVmIENPUkVfQUREUl9UWVBFCi10eXBlZGVmIHVuc2lnbmVkIGludCBTSU1fQUREUjsKLSNlbHNlCi10eXBlZGVmIENPUkVfQUREUl9UWVBFIFNJTV9BRERSOwotI2VuZGlmCi0KLQotLyogU2VtaS1vcGFxdWUgdHlwZSB1c2VkIGFzIHJlc3VsdCBvZiBzaW1fb3BlbiBhbmQgcGFzc2VkIGJhY2sgdG8gYWxsCi0gICBvdGhlciByb3V0aW5lcy4gICJkZXNjIiBpcyBzaG9ydCBmb3IgImRlc2NyaXB0b3IiLgotICAgSXQgaXMgdXAgdG8gZWFjaCBzaW11bGF0b3IgdG8gZGVmaW5lIGBzaW1fc3RhdGUnLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgc2ltX3N0YXRlICpTSU1fREVTQzsKLQotCi0vKiBWYWx1ZXMgZm9yIGBraW5kJyBhcmcgdG8gc2ltX29wZW4uICAqLwotCi10eXBlZGVmIGVudW0gewotICBTSU1fT1BFTl9TVEFOREFMT05FLCAvKiBzaW11bGF0b3IgdXNlZCBzdGFuZGFsb25lIChydW4uYykgKi8KLSAgU0lNX09QRU5fREVCVUcgICAgICAgLyogc2ltdWxhdG9yIHVzZWQgYnkgZGVidWdnZXIgKGdkYikgKi8KLX0gU0lNX09QRU5fS0lORDsKLQotCi0vKiBSZXR1cm4gY29kZXMgZnJvbSB2YXJpb3VzIGZ1bmN0aW9ucy4gICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIFNJTV9SQ19GQUlMID0gMCwKLSAgU0lNX1JDX09LID0gMSwKLSAgU0lNX1JDX1VOS05PV05fQlJFQUtQT0lOVCA9IDIsCi0gIFNJTV9SQ19JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTID0gMywKLSAgU0lNX1JDX0RVUExJQ0FURV9CUkVBS1BPSU5UID0gNAotfSBTSU1fUkM7Ci0KLQotLyogVGhlIGJmZCBzdHJ1Y3QsIGFzIGFuIG9wYXF1ZSB0eXBlLiAgKi8KLQotc3RydWN0IF9iZmQ7Ci0KLQotLyogTWFpbiBzaW11bGF0b3IgZW50cnkgcG9pbnRzLiAgKi8KLQotCi0vKiBDcmVhdGUgYSBmdWxseSBpbml0aWFsaXplZCBzaW11bGF0b3IgaW5zdGFuY2UuCi0KLSAgIChUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBzaW11bGF0b3IgaXMgc2VsZWN0ZWQgZnJvbSB0aGUKLSAgIGdkYiBjb21tYW5kIGxpbmUuKQotCi0gICBLSU5EIHNwZWNpZmllcyBob3cgdGhlIHNpbXVsYXRvciBzaGFsbCBiZSB1c2VkLiAgQ3VycmVudGx5IHRoZXJlCi0gICBhcmUgb25seSB0d28ga2luZHM6IHN0YW5kLWFsb25lIGFuZCBkZWJ1Zy4KLQotICAgQ0FMTEJBQ0sgc3BlY2lmaWVzIGEgc3RhbmRhcmQgaG9zdCBjYWxsYmFjayAoZGVmaW5lZCBpbiBjYWxsYmFjay5oKS4KLQotICAgQUJGRCwgd2hlbiBub24gTlVMTCwgZGVzaWduYXRlcyBhIHRhcmdldCBwcm9ncmFtLiAgVGhlIHByb2dyYW0gaXMKLSAgIG5vdCBsb2FkZWQuCi0KLSAgIEFSR1YgaXMgYSBzdGFuZGFyZCBBUkdWIHBvaW50ZXIgc3VjaCBhcyB0aGF0IHBhc3NlZCBmcm9tIHRoZQotICAgY29tbWFuZCBsaW5lLiAgVGhlIHN5bnRheCBvZiB0aGUgYXJndW1lbnQgbGlzdCBpcyBpcyBhc3N1bWVkIHRvIGJlCi0gICBgYFNJTS1QUk9HIHsgU0lNLU9QVElPTiB9IFsgVEFSR0VULVBST0dSQU0geyBUQVJHRVQtT1BUSU9OIH0gXScnLgotICAgVGhlIHRyYWlsaW5nIFRBUkdFVC1QUk9HUkFNIGFuZCBhcmdzIGFyZSBvbmx5IHZhbGlkIGZvciBhCi0gICBzdGFuZC1hbG9uZSBzaW11bGF0b3IuCi0KLSAgIE9uIHN1Y2Nlc3MsIHRoZSByZXN1bHQgaXMgYSBub24gTlVMTCBkZXNjcmlwdG9yIHRoYXQgc2hhbGwgYmUKLSAgIHBhc3NlZCB0byB0aGUgb3RoZXIgc2ltX2ZvbyBmdW5jdGlvbnMuICBXaGlsZSB0aGUgc2ltdWxhdG9yCi0gICBjb25maWd1cmF0aW9uIGNhbiBiZSBwYXJhbWV0ZXJpemVkIGJ5IChpbiBkZWNyZWFzaW5nIHByZWNlZGVuY2UpCi0gICBBUkdWJ3MgU0lNLU9QVElPTiwgQVJHVidzIFRBUkdFVC1QUk9HUkFNIGFuZCB0aGUgQUJGRCBhcmd1bWVudCwgdGhlCi0gICBzdWNjZXNzZnVsIGNyZWF0aW9uIG9mIHRoZSBzaW11bGF0b3Igc2hhbGwgbm90IGRlcGVuZGVudCBvbiB0aGUKLSAgIHByZXNlbmNlIG9mIGFueSBvZiB0aGVzZSBhcmd1bWVudHMvb3B0aW9ucy4KLQotICAgSGFyZHdhcmUgc2ltdWxhdG9yOiBUaGUgY3JlYXRlZCBzaW11bGF0b3Igc2hhbGwgYmUgc3VmZmljaWVudGx5Ci0gICBpbml0aWFsaXplZCB0byBoYW5kbGUsIHdpdGggb3V0IHJlc3RyaWN0aW9ucyBhbnkgY2xpZW50IHJlcXVlc3RzCi0gICAoaW5jbHVkaW5nIG1lbW9yeSByZWFkcy93cml0ZXMsIHJlZ2lzdGVyIGZldGNoL3N0b3JlcyBhbmQgYQotICAgcmVzdW1lKS4KLQotICAgUHJvY2VzcyBzaW11bGF0b3I6IHRoYXQgcHJvY2VzcyBpcyBub3QgY3JlYXRlZCB1bnRpbCBhIGNhbGwgdG8KLSAgIHNpbV9jcmVhdGVfaW5mZXJpb3IuICBGSVhNRTogV2hhdCBzaG91bGQgdGhlIHN0YXRlIG9mIHRoZSBzaW11bGF0b3IKLSAgIGJlPyAqLwotCi1TSU1fREVTQyBzaW1fb3BlbiBQQVJBTVMgKChTSU1fT1BFTl9LSU5EIGtpbmQsIHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCAqY2FsbGJhY2ssIHN0cnVjdCBfYmZkICphYmZkLCBjaGFyICoqYXJndikpOwotCi0KLS8qIERlc3RvcnkgYSBzaW11bGF0b3IgaW5zdGFuY2UuCi0KLSAgIFFVSVRUSU5HIGlzIG5vbi16ZXJvIGlmIHdlIGNhbm5vdCBoYW5nIG9uIGVycm9ycy4KLQotICAgVGhpcyBtYXkgaW52b2x2ZSBmcmVlaW5nIHRhcmdldCBtZW1vcnkgYW5kIGNsb3NpbmcgYW55IG9wZW4gZmlsZXMKLSAgIGFuZCBtbWFwJ2QgYXJlYXMuICBZb3UgY2Fubm90IGFzc3VtZSBzaW1fa2lsbCBoYXMgYWxyZWFkeSBiZWVuCi0gICBjYWxsZWQuICovCi0KLXZvaWQgc2ltX2Nsb3NlIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBpbnQgcXVpdHRpbmcpKTsKLQotCi0vKiBMb2FkIHByb2dyYW0gUFJPRyBpbnRvIHRoZSBzaW11bGF0b3JzIG1lbW9yeS4KLQotICAgSWYgQUJGRCBpcyBub24tTlVMTCwgdGhlIGJmZCBmb3IgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBvcGVuZWQuCi0gICBUaGUgcmVzdWx0IGlzIGEgcmV0dXJuIGNvZGUgaW5kaWNhdGluZyBzdWNjZXNzLgotCi0gICBIYXJkd2FyZSBzaW11bGF0b3I6IE5vcm1hbGx5LCBlYWNoIHByb2dyYW0gc2VjdGlvbiBpcyB3cml0dGVuIGludG8KLSAgIG1lbW9yeSBhY2NvcmRpbmcgdG8gdGhhdCBzZWN0aW9ucyBMTUEgdXNpbmcgcGh5c2ljYWwgKGRpcmVjdCkKLSAgIGFkZHJlc3NpbmcuICBUaGUgZXhjZXB0aW9uIGJlaW5nIHN5c3RlbXMsIHN1Y2ggYXMgUFBDL0NIUlAsIHdoaWNoCi0gICBzdXBwb3J0IG1vcmUgY29tcGxpY2F0ZWQgcHJvZ3JhbSBsb2FkZXJzLiAgQSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24KLSAgIHNob3VsZCBub3QgZWZmZWN0IHRoZSBzdGF0ZSBvZiB0aGUgcHJvY2Vzc29yIHJlZ2lzdGVycy4gIE11bHRpcGxlCi0gICBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGFyZSBwZXJtaXR0ZWQgYW5kIGhhdmUgYW4gYWNjdW11bGF0aXZlCi0gICBlZmZlY3QuCi0KLSAgIFByb2Nlc3Mgc2ltdWxhdG9yOiBDYWxscyB0byB0aGlzIGZ1bmN0aW9uIG1heSBiZSBpZ25vcmVkLgotCi0gICBGSVhNRTogTW9zdCBoYXJkd2FyZSBzaW11bGF0b3JzIGxvYWQgdGhlIGltYWdlIGF0IHRoZSBWTUEgdXNpbmcKLSAgIHZpcnR1YWwgYWRkcmVzc2luZy4KLQotICAgRklYTUU6IEZvciBzb21lIGhhcmR3YXJlIHRhcmdldHMsIGJlZm9yZSBhIGxvYWRlZCBwcm9ncmFtIGNhbiBiZQotICAgZXhlY3V0ZWQsIGl0IHJlcXVpcmVzIHRoZSBtYW5pcHVsYXRpb24gb2YgVk0gcmVnaXN0ZXJzIGFuZCB0YWJsZXMuCi0gICBTdWNoIG1hbmlwdWxhdGlvbiBzaG91bGQgcHJvYmFibHkgKD8pIG9jY3VyZSBpbgotICAgc2ltX2NyZWF0ZV9pbmZlcmlvci4gKi8KLQotU0lNX1JDIHNpbV9sb2FkIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBjaGFyICpwcm9nLCBzdHJ1Y3QgX2JmZCAqYWJmZCwgaW50IGZyb21fdHR5KSk7Ci0KLQotLyogUHJlcGFyZSB0byBydW4gdGhlIHNpbXVsYXRlZCBwcm9ncmFtLgotCi0gICBBQkZELCBpZiBub3QgTlVMTCwgcHJvdmlkZXMgaW5pdGlhbCBwcm9jZXNzb3Igc3RhdGUgaW5mb3JtYXRpb24uCi0gICBBUkdWIGFuZCBFTlYsIGlmIG5vbiBOVUxMLCBhcmUgTlVMTCB0ZXJtaW5hdGVkIGxpc3RzIG9mIHBvaW50ZXJzLgotCi0gICBIYXJkd2FyZSBzaW11bGF0b3I6IFRoaXMgZnVuY3Rpb24gc2hhbGwgaW5pdGlhbGl6ZSB0aGUgcHJvY2Vzc29yCi0gICByZWdpc3RlcnMgdG8gYSBrbm93biB2YWx1ZS4gIFRoZSBwcm9ncmFtIGNvdW50ZXIgYW5kIHBvc3NpYmx5IHN0YWNrCi0gICBwb2ludGVyIHNoYWxsIGJlIHNldCB1c2luZyBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIEFCRkQgKG9yCi0gICBoYXJkd2FyZSByZXNldCBkZWZhdWx0cykuICBBUkdWIGFuZCBFTlYsIGRlcGVuZGFudCBvbiB0aGUgdGFyZ2V0Ci0gICBBQkksIG1heSBiZSB3cml0dGVuIHRvIG1lbW9yeS4KLQotICAgUHJvY2VzcyBzaW11bGF0b3I6IEFmdGVyIGEgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLCBhIG5ldyBwcm9jZXNzCi0gICBpbnN0YW5jZSBzaGFsbCBleGlzdC4gVGhlIFRFWFQsIERBVEEsIEJTUyBhbmQgc3RhY2sgcmVnaW9ucyBzaGFsbAotICAgYWxsIGJlIGluaXRpYWxpemVkLCBBUkdWIGFuZCBFTlYgc2hhbGwgYmUgd3JpdHRlbiB0byBwcm9jZXNzCi0gICBhZGRyZXNzIHNwYWNlIChhY2NvcmRpbmcgdG8gdGhlIGFwcGxpY2FibGUgQUJJKSBhbmQgdGhlIHByb2dyYW0KLSAgIGNvdW50ZXIgYW5kIHN0YWNrIHBvaW50ZXIgc2V0IGFjY29yZGluZ2x5LiAqLwotCi1TSU1fUkMgc2ltX2NyZWF0ZV9pbmZlcmlvciBQQVJBTVMgKChTSU1fREVTQyBzZCwgc3RydWN0IF9iZmQgKmFiZmQsIGNoYXIgKiphcmd2LCBjaGFyICoqZW52KSk7Ci0KLQotLyogRmV0Y2ggTEVOR1RIIGJ5dGVzIG9mIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbSdzIG1lbW9yeS4gIFN0YXJ0IGZldGNoCi0gICBhdCB2aXJ0dWFsIGFkZHJlc3MgTUVNIGFuZCBzdG9yZSBpbiBCVUYuICBSZXN1bHQgaXMgbnVtYmVyIG9mIGJ5dGVzCi0gICByZWFkLCBvciB6ZXJvIGlmIGVycm9yLiAgKi8KLQotaW50IHNpbV9yZWFkIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBtZW0sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkpOwotCi0KLS8qIFN0b3JlIExFTkdUSCBieXRlcyBmcm9tIEJVRiBpbnRvIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbSdzCi0gICBtZW1vcnkuIFN0b3JlIGJ5dGVzIHN0YXJ0aW5nIGF0IHZpcnR1YWwgYWRkcmVzcyBNRU0uIFJlc3VsdCBpcwotICAgbnVtYmVyIG9mIGJ5dGVzIHdyaXRlLCBvciB6ZXJvIGlmIGVycm9yLiAgKi8KLQotaW50IHNpbV93cml0ZSBQQVJBTVMgKChTSU1fREVTQyBzZCwgU0lNX0FERFIgbWVtLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW5ndGgpKTsKLQotCi0vKiBGZXRjaCByZWdpc3RlciBSRUdOTyBzdG9yaW5nIGl0cyByYXcgKHRhcmdldCBlbmRpYW4pIHZhbHVlIGluIHRoZQotICAgTEVOR1RIIGJ5dGUgYnVmZmVyIEJVRi4gIFJldHVybiB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHJlZ2lzdGVyIG9yCi0gICB6ZXJvIGlmIFJFR05PIGlzIG5vdCBhcHBsaWNhYmxlLgotCi0gICBMZWdhY3kgaW1wbGVtZW50YXRpb25zIGlnbm9yZSBMRU5HVEggYW5kIGFsd2F5cyByZXR1cm4gLTEuCi0KLSAgIElmIExFTkdUSCBkb2VzIG5vdCBtYXRjaCB0aGUgc2l6ZSBvZiBSRUdOTyBubyBkYXRhIGlzIHRyYW5zZmVyZWQKLSAgICh0aGUgYWN0dWFsIHJlZ2lzdGVyIHNpemUgaXMgc3RpbGwgcmV0dXJuZWQpLiAqLwotCi1pbnQgc2ltX2ZldGNoX3JlZ2lzdGVyIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBpbnQgcmVnbm8sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkpOwotCi0KLS8qIFN0b3JlIHJlZ2lzdGVyIFJFR05PIGZyb20gdGhlIHJhdyAodGFyZ2V0IGVuZGlhbikgdmFsdWUgaW4gQlVGLgotICAgUmV0dXJuIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgcmVnaXN0ZXIgb3IgemVybyBpZiBSRUdOTyBpcyBub3QKLSAgIGFwcGxpY2FibGUuCi0KLSAgIExlZ2FjeSBpbXBsZW1lbnRhdGlvbnMgaWdub3JlIExFTkdUSCBhbmQgYWx3YXlzIHJldHVybiAtMS4KLQotICAgSWYgTEVOR1RIIGRvZXMgbm90IG1hdGNoIHRoZSBzaXplIG9mIFJFR05PIG5vIGRhdGEgaXMgdHJhbnNmZXJlZAotICAgKHRoZSBhY3R1YWwgcmVnaXN0ZXIgc2l6ZSBpcyBzdGlsbCByZXR1cm5lZCkuICovCi0KLWludCBzaW1fc3RvcmVfcmVnaXN0ZXIgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGludCByZWdubywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKSk7Ci0KLQotLyogUHJpbnQgd2hhdGV2ZXIgc3RhdGlzdGljcyB0aGUgc2ltdWxhdG9yIGhhcyBjb2xsZWN0ZWQuCi0KLSAgIFZFUkJPU0UgaXMgY3VycmVudGx5IHVudXNlZCBhbmQgbXVzdCBhbHdheXMgYmUgemVyby4gICovCi0KLXZvaWQgc2ltX2luZm8gUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGludCB2ZXJib3NlKSk7Ci0KLQotLyogUnVuIChvciByZXN1bWUpIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbS4gICovCi0KLXZvaWQgc2ltX3Jlc3VtZSBQQVJBTVMgKChTSU1fREVTQyBzZCwgaW50IHN0ZXAsIGludCBzaWdnbmFsKSk7Ci0KLQotLyogQXN5bmNocm9ub3VzIHJlcXVlc3QgdG8gc3RvcCB0aGUgc2ltdWxhdGlvbi4KLSAgIEEgbm9uemVybyByZXR1cm4gaW5kaWNhdGVzIHRoYXQgdGhlIHNpbXVsYXRvciBpcyBhYmxlIHRvIGhhbmRsZQotICAgdGhlIHJlcXVlc3QgKi8KLQotaW50IHNpbV9zdG9wIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci0KLQotLyogRmV0Y2ggdGhlIFJFQVNPTiB3aHkgdGhlIHByb2dyYW0gc3RvcHBlZC4KLQotICAgU0lNX0VYSVRFRDogVGhlIHByb2dyYW0gaGFzIHRlcm1pbmF0ZWQuIFNJR1JDIGluZGljYXRlcyB0aGUgdGFyZ2V0Ci0gICBkZXBlbmRhbnQgZXhpdCBzdGF0dXMuCi0KLSAgIFNJTV9TVE9QUEVEOiBUaGUgcHJvZ3JhbSBoYXMgc3RvcHBlZC4gIFNJR1JDIHVzZXMgdGhlIGhvc3QncyBzaWduYWwKLSAgIG51bWJlcmluZyBhcyBhIHdheSBvZiBpZGVudGlmeWluZyB0aGUgcmVhb246IHByb2dyYW0gaW50ZXJydXB0ZWQgYnkKLSAgIHVzZXIgdmlhIGEgc2ltX3N0b3AgcmVxdWVzdCAoU0lHSU5UKTsgYSBicmVha3BvaW50IGluc3RydWN0aW9uCi0gICAoU0lHVFJBUCk7IGEgY29tcGxldGVkIHNpbmdsZSBzdGVwIChTSUdUUkFQKTsgYW4gaW50ZXJuYWwgZXJyb3IKLSAgIGNvbmRpdGlvbiAoU0lHQUJSVCk7IGFuIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gKFNJR0lMTCk7IEFjY2VzcyB0byBhbgotICAgdW5kZWZpbmVkIG1lbW9yeSByZWdpb24gKFNJR1NFR1YpOyBNaXMtYWxpZ25lZCBtZW1vcnkgYWNjZXNzCi0gICAoU0lHQlVTKS4KLQotICAgU0lNX1NJR05BTExFRDogVGhlIHByb2dyYW0gaGFzIHN0b3BwZWQuIFRoZSBzaW11bGF0b3IgaGFzCi0gICBlbmNvdW50ZXJlZCB0YXJnZXQgY29kZSB0aGF0IHJlcXVpcmVzIHRoZSAoSE9TVCkgc2lnbmFsIFNJR1JDIHRvIGJlCi0gICBkZWxpdmVyZWQgdG8gdGhlIHNpbXVsYXRlZCBwcm9ncmFtLiAgRXg6IGBraWxsIChnZXRwaWQgKCksCi0gICBUQVJHRVRfU0lHeHh4KScuICBXaGVyZSBUQVJHRVRfU0lHeHh4IGhhcyBiZWVuIHRyYW5zbGF0ZWQgaW50byBhCi0gICBob3N0IHNpZ25hbC4gIEZJWE1FOiBUaGlzIGlzIG5vdCBhbHdheXMgcG9zc2libGUuLgotCi0gICBTSU1fUlVOTklORywgU0lNX1BPTExJTkc6IFRoZSByZXR1cm4gb2Ygb25lIG9mIHRoZXNlIHZhbHVlcwotICAgaW5kaWNhdGVzIGEgcHJvYmxlbSBpbnRlcm5hbCB0byB0aGUgc2ltdWxhdG9yLiAqLwotCi1lbnVtIHNpbV9zdG9wIHsgc2ltX3J1bm5pbmcsIHNpbV9wb2xsaW5nLCBzaW1fZXhpdGVkLCBzaW1fc3RvcHBlZCwgc2ltX3NpZ25hbGxlZCB9OwotCi12b2lkIHNpbV9zdG9wX3JlYXNvbiBQQVJBTVMgKChTSU1fREVTQyBzZCwgZW51bSBzaW1fc3RvcCAqcmVhc29uLCBpbnQgKnNpZ3JjKSk7Ci0KLQotLyogUGFzc3RocnUgZm9yIG90aGVyIGNvbW1hbmRzIHRoYXQgdGhlIHNpbXVsYXRvciBtaWdodCBzdXBwb3J0LgotICAgU2ltdWxhdG9ycyBzaG91bGQgYmUgcHJlcGFyZWQgdG8gZGVhbCB3aXRoIGFueSBjb21iaW5hdGlvbiBvZiBOVUxMCi0gICBvciBlbXB0eSBDTUQuICovCi0KLXZvaWQgc2ltX2RvX2NvbW1hbmQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGNoYXIgKmNtZCkpOwotCi0vKiBDYWxsIHRoZXNlIGZ1bmN0aW9ucyB0byBzZXQgYW5kIGNsZWFyIGJyZWFrcG9pbnRzIGF0IEFERFIuICovCi0KLVNJTV9SQyBzaW1fc2V0X2JyZWFrcG9pbnQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIGFkZHIpKTsKLVNJTV9SQyBzaW1fY2xlYXJfYnJlYWtwb2ludCBQQVJBTVMgKChTSU1fREVTQyBzZCwgU0lNX0FERFIgYWRkcikpOwotU0lNX1JDIHNpbV9jbGVhcl9hbGxfYnJlYWtwb2ludHMgUEFSQU1TICgoU0lNX0RFU0Mgc2QpKTsKLQotLyogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBicmVha3BvaW50cy4gKi8KLQotU0lNX1JDIHNpbV9lbmFibGVfYnJlYWtwb2ludCBQQVJBTVMgKChTSU1fREVTQyBzZCwgU0lNX0FERFIgYWRkcikpOwotU0lNX1JDIHNpbV9kaXNhYmxlX2JyZWFrcG9pbnQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIGFkZHIpKTsKLVNJTV9SQyBzaW1fZW5hYmxlX2FsbF9icmVha3BvaW50cyBQQVJBTVMgKChTSU1fREVTQyBzZCkpOwotU0lNX1JDIHNpbV9kaXNhYmxlX2FsbF9icmVha3BvaW50cyBQQVJBTVMgKChTSU1fREVTQyBzZCkpOwotDAotCi0vKiBQcm92aWRlIHNpbXVsYXRvciB3aXRoIGEgZGVmYXVsdCAoZ2xvYmFsKSBob3N0X2NhbGxiYWNrX3N0cnVjdC4KLSAgIFRISVMgUFJPQ0VEVVJFIElTIERFUFJFQ0lBVEVELgotICAgR0RCIGFuZCBOUlVOIGRvIG5vdCB1c2UgdGhpcyBpbnRlcmZhY2UuCi0gICBUaGlzIHByb2NlZHVyZSBkb2VzIG5vdCB0YWtlIGEgU0lNX0RFU0MgYXJndW1lbnQgYXMgaXQgaXMKLSAgIHVzZWQgYmVmb3JlIHNpbV9vcGVuLiAqLwotCi12b2lkIHNpbV9zZXRfY2FsbGJhY2tzIFBBUkFNUyAoKHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCAqKSk7Ci0KLQotLyogU2V0IHRoZSBzaXplIG9mIHRoZSBzaW11bGF0b3IgbWVtb3J5IGFycmF5LgotICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCi0gICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KLSAgIFRoaXMgcHJvY2VkdXJlIGRvZXMgbm90IHRha2UgYSBTSU1fREVTQyBhcmd1bWVudCBhcyBpdCBpcwotICAgdXNlZCBiZWZvcmUgc2ltX29wZW4uICovCi0KLXZvaWQgc2ltX3NpemUgUEFSQU1TICgoaW50IGkpKTsKLQotCi0vKiBSdW4gYSBzaW11bGF0aW9uIHdpdGggdHJhY2luZyBlbmFibGVkLgotICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCi0gICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KLSAgIFRoaXMgcHJvY2VkdXJlIGRvZXMgbm90IHRha2UgYSBTSU1fREVTQyBhcmd1bWVudCBhcyBpdCBpcwotICAgdXNlZCBiZWZvcmUgc2ltX29wZW4uICovCi0KLWludCBzaW1fdHJhY2UgUEFSQU1TICgoU0lNX0RFU0Mgc2QpKTsKLQotCi0vKiBDb25maWd1cmUgdGhlIHNpemUgb2YgdGhlIHByb2ZpbGUgYnVmZmVyLgotICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCi0gICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KLSAgIFRoaXMgcHJvY2VkdXJlIGRvZXMgbm90IHRha2UgYSBTSU1fREVTQyBhcmd1bWVudCBhcyBpdCBpcwotICAgdXNlZCBiZWZvcmUgc2ltX29wZW4uICovCi0KLXZvaWQgc2ltX3NldF9wcm9maWxlX3NpemUgUEFSQU1TICgoaW50IG4pKTsKLQotCi0vKiBLaWxsIHRoZSBydW5uaW5nIHByb2dyYW0uCi0gICBUSElTIFBST0NFRFVSRSBJUyBERVBSRUNJQVRFRC4KLSAgIEdEQiBhbmQgTlJVTiBkbyBub3QgdXNlIHRoaXMgaW50ZXJmYWNlLgotICAgVGhpcyBwcm9jZWR1cmUgd2lsbCBiZSByZXBsYWNlZCBhcyBwYXJ0IG9mIHRoZSBpbnRyb2R1Y3Rpb24gb2YKLSAgIG11bHRpLWNwdSBzaW11bGF0b3JzLiAqLwotCi12b2lkIHNpbV9raWxsIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhZGVmaW5lZCAoUkVNT1RFX1NJTV9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zcGxheS10cmVlLmggYi9pbmNsdWRlL3NwbGF5LXRyZWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyOGZlNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3NwbGF5LXRyZWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKiBBIHNwbGF5LXRyZWUgZGF0YXR5cGUuICAKLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcmsgTWl0Y2hlbGwgKG1hcmtAbWFya21pdGNoZWxsLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLSAgIAotR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRm9yIGFuIGVhc2lseSByZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiBzcGxheS10cmVlcywgc2VlOgotCi0gICAgIExld2lzLCBIYXJyeSBSLiBhbmQgRGVuZW5iZXJnLCBMYXJyeS4gIERhdGEgU3RydWN0dXJlcyBhbmQgVGhlaXIKLSAgICAgQWxnb3JpdGhtcy4gIEhhcnBlci1Db2xsaW5zLCBJbmMuICAxOTkxLiAgCi0KLSAgIFRoZSBtYWpvciBmZWF0dXJlIG9mIHNwbGF5IHRyZWVzIGlzIHRoYXQgYWxsIGJhc2ljIHRyZWUgb3BlcmF0aW9ucwotICAgYXJlIGFtb3J0aXplZCBPKGxvZyBuKSB0aW1lIGZvciBhIHRyZWUgd2l0aCBuIG5vZGVzLiAgKi8KLQotI2lmbmRlZiBfU1BMQVlfVFJFRV9ICi0jZGVmaW5lIF9TUExBWV9UUkVFX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotLyogVXNlIHR5cGVkZWZzIGZvciB0aGUga2V5IGFuZCBkYXRhIHR5cGVzIHRvIGZhY2lsaXRhdGUgY2hhbmdpbmcKLSAgIHRoZXNlIHR5cGVzLCBpZiBuZWNlc3NhcnkuICBUaGVzZSB0eXBlcyBzaG91bGQgYmUgc3VmZmljaWVudGx5IHdpZGUKLSAgIHRoYXQgYW55IHBvaW50ZXIgb3Igc2NhbGFyIGNhbiBiZSBjYXN0IHRvIHRoZXNlIHR5cGVzLCBhbmQgdGhlbgotICAgY2FzdCBiYWNrLCB3aXRob3V0IGxvc3Mgb2YgcHJlY2lzaW9uLiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgc3BsYXlfdHJlZV9rZXk7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHNwbGF5X3RyZWVfdmFsdWU7Ci0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIGEgbm9kZSBpbiB0aGUgdHJlZS4gICovCi10eXBlZGVmIHN0cnVjdCBzcGxheV90cmVlX25vZGUgKnNwbGF5X3RyZWVfbm9kZTsKLQotLyogVGhlIHR5cGUgb2YgYSBmdW5jdGlvbiB3aGljaCBjb21wYXJlcyB0d28gc3BsYXktdHJlZSBrZXlzLiAgVGhlCi0gICBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHZhbHVlcyBhcyBmb3IgcXNvcnQuICAqLwotdHlwZWRlZiBpbnQgKCpzcGxheV90cmVlX2NvbXBhcmVfZm4pIFBBUkFNUygoc3BsYXlfdHJlZV9rZXksIHNwbGF5X3RyZWVfa2V5KSk7Ci0KLS8qIFRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gdXNlZCB0byBkZWFsbG9jYXRlIGFueSByZXNvdXJjZXMgYXNzb2NpYXRlZAotICAgd2l0aCB0aGUga2V5LiAgKi8KLXR5cGVkZWYgdm9pZCAoKnNwbGF5X3RyZWVfZGVsZXRlX2tleV9mbikgUEFSQU1TKChzcGxheV90cmVlX2tleSkpOwotCi0vKiBUaGUgdHlwZSBvZiBhIGZ1bmN0aW9uIHVzZWQgdG8gZGVhbGxvY2F0ZSBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQKLSAgIHdpdGggdGhlIHZhbHVlLiAgKi8KLXR5cGVkZWYgdm9pZCAoKnNwbGF5X3RyZWVfZGVsZXRlX3ZhbHVlX2ZuKSBQQVJBTVMoKHNwbGF5X3RyZWVfdmFsdWUpKTsKLQotLyogVGhlIHR5cGUgb2YgYSBmdW5jdGlvbiB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgdHJlZS4gICovCi10eXBlZGVmIGludCAoKnNwbGF5X3RyZWVfZm9yZWFjaF9mbikgUEFSQU1TKChzcGxheV90cmVlX25vZGUsIHZvaWQqKSk7Ci0KLS8qIFRoZSBub2RlcyBpbiB0aGUgc3BsYXkgdHJlZS4gICovCi1zdHJ1Y3Qgc3BsYXlfdHJlZV9ub2RlCi17Ci0gIC8qIFRoZSBrZXkuICAqLwotICBzcGxheV90cmVlX2tleSBrZXk7Ci0KLSAgLyogVGhlIHZhbHVlLiAgKi8KLSAgc3BsYXlfdHJlZV92YWx1ZSB2YWx1ZTsKLQotICAvKiBUaGUgbGVmdCBhbmQgcmlnaHQgY2hpbGRyZW4sIHJlc3BlY3RpdmVseS4gICovCi0gIHNwbGF5X3RyZWVfbm9kZSBsZWZ0OwotICBzcGxheV90cmVlX25vZGUgcmlnaHQ7Ci19OwotCi0vKiBUaGUgc3BsYXkgdHJlZSBpdHNlbGYuICAqLwotdHlwZWRlZiBzdHJ1Y3Qgc3BsYXlfdHJlZQotewotICAvKiBUaGUgcm9vdCBvZiB0aGUgdHJlZS4gICovCi0gIHNwbGF5X3RyZWVfbm9kZSByb290OwotCi0gIC8qIFRoZSBjb21wYXJpc2lvbiBmdW5jdGlvbi4gICovCi0gIHNwbGF5X3RyZWVfY29tcGFyZV9mbiBjb21wOwotCi0gIC8qIFRoZSBkZWFsbG9jYXRlLWtleSBmdW5jdGlvbi4gIE5VTEwgaWYgbm8gY2xlYW51cCBpcyBuZWNlc3NhcnkuICAqLwotICBzcGxheV90cmVlX2RlbGV0ZV9rZXlfZm4gZGVsZXRlX2tleTsKLQotICAvKiBUaGUgZGVhbGxvY2F0ZS12YWx1ZSBmdW5jdGlvbi4gIE5VTEwgaWYgbm8gY2xlYW51cCBpcyBuZWNlc3NhcnkuICAqLwotICBzcGxheV90cmVlX2RlbGV0ZV92YWx1ZV9mbiBkZWxldGVfdmFsdWU7Ci19ICpzcGxheV90cmVlOwotCi1leHRlcm4gc3BsYXlfdHJlZSBzcGxheV90cmVlX25ldyAgICAgICAgUEFSQU1TKChzcGxheV90cmVlX2NvbXBhcmVfZm4sCi0JCQkJCSAgICAgICAgc3BsYXlfdHJlZV9kZWxldGVfa2V5X2ZuLAotCQkJCQkgICAgICAgIHNwbGF5X3RyZWVfZGVsZXRlX3ZhbHVlX2ZuKSk7Ci1leHRlcm4gdm9pZCBzcGxheV90cmVlX2RlbGV0ZSAgICAgICAgICAgUEFSQU1TKChzcGxheV90cmVlKSk7Ci1leHRlcm4gdm9pZCBzcGxheV90cmVlX2luc2VydCAgICAgICAgICAgUEFSQU1TKChzcGxheV90cmVlLAotCQkJCQkgICAgICAgIHNwbGF5X3RyZWVfa2V5LAotCQkJCQkgICAgICAgIHNwbGF5X3RyZWVfdmFsdWUpKTsKLWV4dGVybiBzcGxheV90cmVlX25vZGUgc3BsYXlfdHJlZV9sb29rdXAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUsCi0JCQkJCSAgICAgICAgc3BsYXlfdHJlZV9rZXkpKTsKLWV4dGVybiBpbnQgc3BsYXlfdHJlZV9mb3JlYWNoICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUsCi0JCQkJCSAgICAgICAgc3BsYXlfdHJlZV9mb3JlYWNoX2ZuLAotCQkJCQkgICAgICAgIHZvaWQqKSk7Ci1leHRlcm4gaW50IHNwbGF5X3RyZWVfY29tcGFyZV9pbnRzICAgICAgUEFSQU1TKChzcGxheV90cmVlX2tleSwKLQkJCQkJCXNwbGF5X3RyZWVfa2V5KSk7Ci1leHRlcm4gaW50IHNwbGF5X3RyZWVfY29tcGFyZV9wb2ludGVycyAgUEFSQU1TKChzcGxheV90cmVlX2tleSwKLQkJCQkJCXNwbGF5X3RyZWVfa2V5KSk7Ci0JCQkJCSAgICAgICAKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBfU1BMQVlfVFJFRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N5bWNhdC5oIGIvaW5jbHVkZS9zeW1jYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlZmFkYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3N5bWNhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogU3ltYm9sIGNvbmNhdGVuYXRpb24gdXRpbGl0aWVzLgotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBTWU1fQ0FUX0gKLSNkZWZpbmUgU1lNX0NBVF9ICi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoQUxNT1NUX1NUREMpCi0jZGVmaW5lIENPTkNBVDIoYSxiKQkgYSMjYgotI2RlZmluZSBDT05DQVQzKGEsYixjKQkgYSMjYiMjYwotI2RlZmluZSBDT05DQVQ0KGEsYixjLGQpIGEjI2IjI2MjI2QKLSNkZWZpbmUgU1RSSU5HWChzKSAjcwotI2Vsc2UKLSNkZWZpbmUgQ09OQ0FUMihhLGIpCSBhLyoqL2IKLSNkZWZpbmUgQ09OQ0FUMyhhLGIsYykJIGEvKiovYi8qKi9jCi0jZGVmaW5lIENPTkNBVDQoYSxiLGMsZCkgYS8qKi9iLyoqL2MvKiovZAotI2RlZmluZSBTVFJJTkdYKHMpICI/IgotI2VuZGlmCi0KLSNkZWZpbmUgWENPTkNBVDIoYSxiKSAgICAgQ09OQ0FUMihhLGIpCi0jZGVmaW5lIFhDT05DQVQzKGEsYixjKSAgIENPTkNBVDMoYSxiLGMpCi0jZGVmaW5lIFhDT05DQVQ0KGEsYixjLGQpIENPTkNBVDQoYSxiLGMsZCkKLQotI2RlZmluZSBYU1RSSU5HKHMpIFNUUklOR1gocykgCi0KLSNlbmRpZiBTWU1fQ0FUX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2FpdC5oIGIvaW5jbHVkZS93YWl0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2M5Y2MuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS93YWl0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKiBEZWZpbmUgaG93IHRvIGFjY2VzcyB0aGUgaW50IHRoYXQgdGhlIHdhaXQgc3lzdGVtIGNhbGwgc3RvcmVzLgotICAgVGhpcyBoYXMgYmVlbiBjb21wYXRpYmxlIGluIGFsbCBVbml4IHN5c3RlbXMgc2luY2UgdGltZSBpbW1lbW9yaWFsLAotICAgYnV0IHZhcmlvdXMgd2VsbC1tZWFuaW5nIHBlb3BsZSBoYXZlIGRlZmluZWQgdmFyaW91cyBkaWZmZXJlbnQKLSAgIHdvcmRzIGZvciB0aGUgc2FtZSBvbGQgYml0cyBpbiB0aGUgc2FtZSBvbGQgaW50IChzb21ldGltZXMgY2xhaW1lZAotICAgdG8gYmUgYSBzdHJ1Y3QpLiAgV2UganVzdCBrbm93IGl0J3MgYW4gaW50IGFuZCB3ZSB1c2UgdGhlc2UgbWFjcm9zCi0gICB0byBhY2Nlc3MgdGhlIGJpdHMuICAqLwotCi0vKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgZGVmaW5lZCBlcXVpdmFsZW50bHkgdG8gdGhlaXIgZGVmaW5pdGlvbnMKLSAgIGluIFBPU0lYLjEuICBXZSBmYWlsIHRvIGRlZmluZSBXTk9IQU5HIGFuZCBXVU5UUkFDRUQsIHdoaWNoIFBPU0lYLjEKLSAgIDxzeXMvd2FpdC5oPiBkZWZpbmVzLCBzaW5jZSBvdXIgY29kZSBkb2VzIG5vdCB1c2Ugd2FpdHBpZCgpLiAgV2UKLSAgIGFsc28gZmFpbCB0byBkZWNsYXJlIHdhaXQoKSBhbmQgd2FpdHBpZCgpLiAgKi8gICAKLQotI2lmbmRlZglXSUZFWElURUQKLSNkZWZpbmUgV0lGRVhJVEVEKHcpCSgoKHcpJjAzNzcpID09IDApCi0jZW5kaWYKLQotI2lmbmRlZglXSUZTSUdOQUxFRAotI2RlZmluZSBXSUZTSUdOQUxFRCh3KQkoKCh3KSYwMzc3KSAhPSAwMTc3ICYmICgodykmfjAzNzcpID09IDApCi0jZW5kaWYKLQotI2lmbmRlZglXSUZTVE9QUEVECi0jaWZkZWYgSUJNNjAwMAotCi0vKiBVbmZvcnR1bmF0ZWx5LCB0aGUgYWJvdmUgY29tbWVudCAoYWJvdXQgYmVpbmcgY29tcGF0aWJsZSBpbiBhbGwgVW5peCAKLSAgIHN5c3RlbXMpIGlzIG5vdCBxdWl0ZSBjb3JyZWN0IGZvciBBSVgsIHNpZ2guICBBbmQgQUlYIDMuMiBjYW4gZ2VuZXJhdGUKLSAgIHN0YXR1cyB3b3JkcyBsaWtlIDB4NTdjIChzaWd0cmFwIHJlY2VpdmVkIGFmdGVyIGxvYWQpLCBhbmQgZ2RiIHdvdWxkCi0gICBjaG9rZSBvbiBpdC4gKi8KLQotI2RlZmluZSBXSUZTVE9QUEVEKHcpCSgodykmMHg0MCkKLQotI2Vsc2UKLSNkZWZpbmUgV0lGU1RPUFBFRCh3KQkoKCh3KSYwMzc3KSA9PSAwMTc3KQotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZglXRVhJVFNUQVRVUwotI2RlZmluZSBXRVhJVFNUQVRVUyh3KQkoKCh3KSA+PiA4KSAmIDAzNzcpIC8qIHNhbWUgYXMgV1JFVENPREUgKi8KLSNlbmRpZgotCi0jaWZuZGVmCVdURVJNU0lHCi0jZGVmaW5lIFdURVJNU0lHKHcpCSgodykgJiAwMTc3KQotI2VuZGlmCi0KLSNpZm5kZWYJV1NUT1BTSUcKLSNkZWZpbmUgV1NUT1BTSUcJV0VYSVRTVEFUVVMKLSNlbmRpZgotCi0vKiBUaGVzZSBhcmUgbm90IGRlZmluZWQgaW4gUE9TSVgsIGJ1dCBhcmUgdXNlZCBieSBvdXIgcHJvZ3JhbXMuICAqLwotCi0jZGVmaW5lIFdBSVRUWVBFCWludAotCi0jaWZuZGVmCVdDT1JFRFVNUAotI2RlZmluZSBXQ09SRURVTVAodykJKCgodykmMDIwMCkgIT0gMCkKLSNlbmRpZgotCi0jaWZuZGVmCVdTRVRFWElUCi0jZGVmaW5lIFdTRVRFWElUKHcsc3RhdHVzKSAoKHcpID0gKDAgfCAoKHN0YXR1cykgPDwgOCkpKQotI2VuZGlmCi0KLSNpZm5kZWYJV1NFVFNUT1AKLSNkZWZpbmUgV1NFVFNUT1AodyxzaWcpCSAgICgodykgPSAoMDE3NyB8ICgoc2lnKSA8PCA4KSkpCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvaW5zdGFsbC1zaCBiL2luc3RhbGwtc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5ZGUyMzguLjAwMDAwMDAKLS0tIGEvaW5zdGFsbC1zaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCi0jIFRoaXMgY29tZXMgZnJvbSBYMTFSNSAobWl0L3V0aWwvc2NyaXB0cy9pbnN0YWxsLnNoKS4KLSMKLSMgQ29weXJpZ2h0IDE5OTEgYnkgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKLSMKLSMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0jIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci0jIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0jIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE0uSS5ULiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgotIyBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCi0jIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCi0jIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgotIyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSMKLSMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKLSMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKLSMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KLSMKLSMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgotIyBmcm9tIHNjcmF0Y2guICBJdCBjYW4gb25seSBpbnN0YWxsIG9uZSBmaWxlIGF0IGEgdGltZSwgYSByZXN0cmljdGlvbgotIyBzaGFyZWQgd2l0aCBtYW55IE9TJ3MgaW5zdGFsbCBwcm9ncmFtcy4KLQotCi0jIHNldCBET0lUUFJPRyB0byBlY2hvIHRvIHRlc3QgdGhpcyBzY3JpcHQKLQotIyBEb24ndCB1c2UgOi0gc2luY2UgNC4zQlNEIGFuZCBlYXJsaWVyIHNoZWxscyBkb24ndCBsaWtlIGl0LgotZG9pdD0iJHtET0lUUFJPRy19IgotCi0KLSMgcHV0IGluIGFic29sdXRlIHBhdGhzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOyBvciB1c2UgZW52LiB2YXJzLgotCi1tdnByb2c9IiR7TVZQUk9HLW12fSIKLWNwcHJvZz0iJHtDUFBST0ctY3B9IgotY2htb2Rwcm9nPSIke0NITU9EUFJPRy1jaG1vZH0iCi1jaG93bnByb2c9IiR7Q0hPV05QUk9HLWNob3dufSIKLWNoZ3JwcHJvZz0iJHtDSEdSUFBST0ctY2hncnB9Igotc3RyaXBwcm9nPSIke1NUUklQUFJPRy1zdHJpcH0iCi1ybXByb2c9IiR7Uk1QUk9HLXJtfSIKLW1rZGlycHJvZz0iJHtNS0RJUlBST0ctbWtkaXJ9IgotCi10cmFuc2Zvcm1iYXNlbmFtZT0iIgotdHJhbnNmb3JtX2FyZz0iIgotaW5zdGNtZD0iJG12cHJvZyIKLWNobW9kY21kPSIkY2htb2Rwcm9nIDA3NTUiCi1jaG93bmNtZD0iIgotY2hncnBjbWQ9IiIKLXN0cmlwY21kPSIiCi1ybWNtZD0iJHJtcHJvZyAtZiIKLW12Y21kPSIkbXZwcm9nIgotc3JjPSIiCi1kc3Q9IiIKLWRpcl9hcmc9IiIKLQotd2hpbGUgWyB4IiQxIiAhPSB4IF07IGRvCi0gICAgY2FzZSAkMSBpbgotCS1jKSBpbnN0Y21kPSIkY3Bwcm9nIgotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktZCkgZGlyX2FyZz10cnVlCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1tKSBjaG1vZGNtZD0iJGNobW9kcHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1zKSBzdHJpcGNtZD0iJHN0cmlwcHJvZyIKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLXQ9KikgdHJhbnNmb3JtYXJnPWBlY2hvICQxIHwgc2VkICdzLy10PS8vJ2AKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWI9KikgdHJhbnNmb3JtYmFzZW5hbWU9YGVjaG8gJDEgfCBzZWQgJ3MvLWI9Ly8nYAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQkqKSAgaWYgWyB4IiRzcmMiID0geCBdCi0JICAgIHRoZW4KLQkJc3JjPSQxCi0JICAgIGVsc2UKLQkJIyB0aGlzIGNvbG9uIGlzIHRvIHdvcmsgYXJvdW5kIGEgMzg2QlNEIC9iaW4vc2ggYnVnCi0JCToKLQkJZHN0PSQxCi0JICAgIGZpCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLSAgICBlc2FjCi1kb25lCi0KLWlmIFsgeCIkc3JjIiA9IHggXQotdGhlbgotCWVjaG8gImluc3RhbGw6CW5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIgotCWV4aXQgMQotZWxzZQotCXRydWUKLWZpCi0KLWlmIFsgeCIkZGlyX2FyZyIgIT0geCBdOyB0aGVuCi0JZHN0PSRzcmMKLQlzcmM9IiIKLQkKLQlpZiBbIC1kICRkc3QgXTsgdGhlbgotCQlpbnN0Y21kPToKLQkJY2htb2RjbWQ9IiIKLQllbHNlCi0JCWluc3RjbWQ9bWtkaXIKLQlmaQotZWxzZQotCi0jIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQKLSMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQgCi0jIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KLQotCWlmIFsgLWYgJHNyYyAtbyAtZCAkc3JjIF0KLQl0aGVuCi0JCXRydWUKLQllbHNlCi0JCWVjaG8gImluc3RhbGw6ICAkc3JjIGRvZXMgbm90IGV4aXN0IgotCQlleGl0IDEKLQlmaQotCQotCWlmIFsgeCIkZHN0IiA9IHggXQotCXRoZW4KLQkJZWNobyAiaW5zdGFsbDoJbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkIgotCQlleGl0IDEKLQllbHNlCi0JCXRydWUKLQlmaQotCi0jIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyBpZiB5b3VyIHN5c3RlbQotIyBkb2VzIG5vdCBsaWtlIGRvdWJsZSBzbGFzaGVzIGluIGZpbGVuYW1lcywgeW91IG1heSBuZWVkIHRvIGFkZCBzb21lIGxvZ2ljCi0KLQlpZiBbIC1kICRkc3QgXQotCXRoZW4KLQkJZHN0PSIkZHN0Ii9gYmFzZW5hbWUgJHNyY2AKLQllbHNlCi0JCXRydWUKLQlmaQotZmkKLQotIyMgdGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kCi1kc3RkaXI9YGVjaG8gJGRzdCB8IHNlZCAtZSAncyxbXi9dKiQsLDtzLC8kLCw7cyxeJCwuLCdgCi0KLSMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCi0jICB0aGlzIHBhcnQgaXMgdGFrZW4gZnJvbSBOb2FoIEZyaWVkbWFuJ3MgbWtpbnN0YWxsZGlycyBzY3JpcHQKLQotIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KLWlmIFsgISAtZCAiJGRzdGRpciIgXTsgdGhlbgotZGVmYXVsdElGUz0nCQotJwotSUZTPSIke0lGUy0ke2RlZmF1bHRJRlN9fSIKLQotb0lGUz0iJHtJRlN9IgotIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KLUlGUz0nJScKLXNldCAtIGBlY2hvICR7ZHN0ZGlyfSB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAotSUZTPSIke29JRlN9IgotCi1wYXRoY29tcD0nJwotCi13aGlsZSBbICQjIC1uZSAwIF0gOyBkbwotCXBhdGhjb21wPSIke3BhdGhjb21wfSR7MX0iCi0Jc2hpZnQKLQotCWlmIFsgISAtZCAiJHtwYXRoY29tcH0iIF0gOwotICAgICAgICB0aGVuCi0JCSRta2RpcnByb2cgIiR7cGF0aGNvbXB9IgotCWVsc2UKLQkJdHJ1ZQotCWZpCi0KLQlwYXRoY29tcD0iJHtwYXRoY29tcH0vIgotZG9uZQotZmkKLQotaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF0KLXRoZW4KLQkkZG9pdCAkaW5zdGNtZCAkZHN0ICYmCi0KLQlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpCi1lbHNlCi0KLSMgSWYgd2UncmUgZ29pbmcgdG8gcmVuYW1lIHRoZSBmaW5hbCBleGVjdXRhYmxlLCBkZXRlcm1pbmUgdGhlIG5hbWUgbm93LgotCi0JaWYgWyB4IiR0cmFuc2Zvcm1hcmciID0geCBdIAotCXRoZW4KLQkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKLQllbHNlCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3QgJHRyYW5zZm9ybWJhc2VuYW1lIHwgCi0JCQlzZWQgJHRyYW5zZm9ybWFyZ2AkdHJhbnNmb3JtYmFzZW5hbWUKLQlmaQotCi0jIGRvbid0IGFsbG93IHRoZSBzZWQgY29tbWFuZCB0byBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUgZmlsZW5hbWUKLQotCWlmIFsgeCIkZHN0ZmlsZSIgPSB4IF0gCi0JdGhlbgotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAotCWVsc2UKLQkJdHJ1ZQotCWZpCi0KLSMgTWFrZSBhIHRlbXAgZmlsZSBuYW1lIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgotCi0JZHN0dG1wPSRkc3RkaXIvI2luc3QuJCQjCi0KLSMgTW92ZSBvciBjb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZQotCi0JJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wICYmCi0KLQl0cmFwICJybSAtZiAke2RzdHRtcH0iIDAgJiYKLQotIyBhbmQgc2V0IGFueSBvcHRpb25zOyBkbyBjaG1vZCBsYXN0IHRvIHByZXNlcnZlIHNldHVpZCBiaXRzCi0KLSMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KLSMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQotIyBlcnJvcnMgZnJvbSB0aGUgYWJvdmUgIiRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KLQotCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0KLSMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KLQotCSRkb2l0ICRybWNtZCAtZiAkZHN0ZGlyLyRkc3RmaWxlICYmCi0JJGRvaXQgJG12Y21kICRkc3R0bXAgJGRzdGRpci8kZHN0ZmlsZSAKLQotZmkgJiYKLQotCi1leGl0IDAKZGlmZiAtLWdpdCBhL2ludGwvQ2hhbmdlTG9nIGIvaW50bC9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZmY2ZjYuLjAwMDAwMDAKLS0tIGEvaW50bC9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIyICswLDAgQEAKLTE5OTctMDktMDYgMDI6MTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBpbnRsaC5pbnN0LmluOiBSZWZvcm1hdCBjb3B5cmlnaHQuCi0KLTE5OTctMDgtMTkgMTU6MjIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBkY2dldHRleHQuYyAoRENHRVRURVhUKTogUmVtb3ZlIHdyb25nIGNvbW1lbnQuCi0KLTE5OTctMDgtMTYgMDA6MTMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1kYXRhKTogRG9uJ3QgY2hhbmdlIGRpcmVjdG9yeSB0byBpbnN0YWxsLgotCi0xOTk3LTA4LTAxIDE0OjMwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogY2F0LWNvbXBhdC5jOiBGaXggY29weXJpZ2h0LgotCi0JKiBsb2NhbGVhbGlhcy5jOiBEb24ndCBkZWZpbmUgc3RyY2hyIHVubGVzcyAhSEFWRV9TVFJDSFIuCi0KLQkqIGxvYWRtc2djYXQuYzogVXBkYXRlIGNvcHlyaWdodC4gIEZpeCB0eXBvcy4KLQotCSogbDEwbmZsaXN0LmM6IERvbid0IGRlZmluZSBzdHJjaHIgdW5sZXNzICFIQVZFX1NUUkNIUi4KLQkoX25sX21ha2VfbDEwbmZsaXN0KTogSGFuZGxlIHNwb25zb3IgYW5kIHJldmlzaW9uIGNvcnJlY3RseS4KLQotCSogZ2V0dGV4dC5jOiBVcGRhdGUgY29weXJpZ2h0LgotCSogZ2V0dGV4dC5oOiBMaWtld2lzZS4KLQkqIGhhc2gtc3RyaW5nLmg6IExpa2V3aXNlLgotCi0JKiBmaW5kZG9tYWluLmM6IFJlbW9hdmUgZGVhZCBjb2RlLiAgRGVmaW5lIHN0cmNociBvbmx5IGlmCi0JIUhBVkVfU1RSQ0hSLgotCi0JKiBleHBsb2RlbmFtZS5jOiBJbmNsdWRlIDxzeXMvdHlwZXMuaD4uCi0KLQkqIGV4cGxvZGVuYW1lLmM6IFJlZm9ybWF0IGNvcHlyaWdodCB0ZXh0LgotCShfbmxfZXhwbG9kZV9uYW1lKTogRml4IHR5cG8uCi0KLQkqIGRjZ2V0dGV4dC5jOiBEZWZpbmUgYW5kIHVzZSBfX3NldF9lcnJuby4KLQkoZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUpOiBEb24ndCB1c2Ugc2V0bG9jYWxlIGlmIEhBVkVfTENfTUVTU0FHRVMgaXMKLQlub3QgZGVmaW5lZC4KLQotCSogYmluZHRleHRkb20uYzogUHJldHR5IHByaW50aW5nLgotCi0xOTk3LTA1LTAxIDAyOjI1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZGNnZXR0ZXh0LmMgKGd1ZXNzX2NhdGVnb3J5X3ZhbHVlKTogRG9uJ3QgZGVwZW5kIG9uCi0JSEFWRV9MQ19NRVNTQUdFUy4gIFdlIGRvbid0IG5lZWQgdGhlIG1hY3JvIGhlcmUuCi0JUGF0Y2ggYnkgQnJ1bm8gSGFpYmxlIDxoYWlibGVAaWxvZy5mcj4uCi0KLQkqIGNhdC1jb21wYXQuYyAodGV4dGRvbWFpbik6IERvTid0IHJlZmVyIHRvIEhBVkVfU0VUTE9DQUxFX05VTEwKLQltYWNyby4gIEluc3RlYWQgdXNlIEhBVkVfTE9DQUxFX05VTEwgYW5kIGRlZmluZSBpdCB3aGVuIHVzaW5nCi0JZ2xpYmMsIGFzIGluIGRjZ2V0dGV4dC5jLgotCVBhdGNoIGJ5IEJydW5vIEhhaWJsZSA8aGFpYmxlQGlsb2cuZnI+LgotCi0JKiBNYWtlZmlsZS5pbiAoQ1BQRkxBR1MpOiBOZXcgdmFyaWFibGUuICBSZXBvcnRlZCBieSBGcmFuYyxvaXMKLQlQaW5hcmQuCi0KLU1vbiBNYXIgMTAgMDY6NTE6MTcgMTk5NyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBJbXBsZW1lbnQgaGFuZGxpbmcgb2YgbGlidG9vbC4KLQotCSogZ2V0dGV4dFAuaDogQ2hhbmdlIGRhdGEgc3RydWN0dXJlcyBmb3IgdXNlIG9mIGdlbmVyaWMgbG93bGV2ZWwKLQlpMThuIGZpbGUgaGFuZGxpbmcuCi0KLVdlZCBEZWMgIDQgMjA6MjE6MTggMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHRleHRkb21haW4uYzogUHV0IHBhcmVudGhlc2VzIGFyb3VuZCBhcmd1bWVudHMgb2YgbWVtY3B5IG1hY3JvCi0JZGVmaW5pdGlvbi4KLQkqIGxvY2FsZWFsaWFzLmM6IExpa2V3aXNlLgotCSogbDEwbmZsaXN0LmM6IExpa2V3aXNlLgotCSogZmluZGRvbWFpbi5jOiBMaWtld2lzZS4KLQkqIGJpbmR0ZXh0ZG9tLmM6IExpa2V3aXNlLgotCVJlcG9ydGVkIGJ5IFRob21hcyBFc2tlbi4KLQotTW9uIE5vdiAyNSAyMjo1Nzo1MSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogdGV4dGRvbWFpbi5jOiBNb3ZlIGRlZmluaXRpb24gb2YgYG1lbWNweWAgbWFjcm8gdG8gcmlnaHQKLQlwb3NpdGlvbi4KLQotRnJpIE5vdiAyMiAwNDowMTo1OCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZmluZGRvbWFpbi5jIFshSEFWRV9TVFJJTkdfSCAmJiAhX0xJQkNdOiBEZWZpbmUgbWVtY3B5IHVzaW5nCi0gCWJjb3B5IGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuICBSZXBvcnRlZCBieSBUaG9tYXMgRXNrZW4uCi0JKiBiaW5kdGV4dGRvbS5jOiBMaWtld2lzZS4KLQkqIGwxMG5mbGlzdC5jOiBMaWtld2lzZS4KLQkqIGxvY2FsZWFsaWFzLmM6IExpa2V3aXNlLgotCSogdGV4dGRvbWFpbi5jOiBMaWtld2lzZS4KLQotVHVlIE9jdCAyOSAxMToxMDoyNyAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGxpYmRpcik6IENoYW5nZSB0byB1c2UgZXhlY19wcmVmaXggaW5zdGVhZCBvZgotIAlwcmVmaXguICBSZXBvcnRlZCBieSBLbnV0LUjldmFyZEFrc25lcyA8ZXRva25hQGV0by5lcmljc3Nvbi5zZT4uCi0KLVNhdCBBdWcgMzEgMDM6MDc6MDkgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGwxMG5mbGlzdC5jIChfbmxfbm9ybWFsaXplX2NvZGVzZXQpOiBXZSBjb252ZXJ0IHRvIGxvd2VyIGNhc2UsCi0Jc28gZG9uJ3QgcHJlcGVuZCB1cHBlcmNhc2UgYElTTycgZm9yIG9ubHkgbnVtZXJpYyBhcmcuCi0KLUZyaSBKdWwgMTkgMDA6MTU6NDYgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGwxMG5mbGlzdC5jOiBNb3ZlIGluY2x1c2lvbiBvZiBhcmd6LmgsIGN0eXBlLmgsIHN0ZGxpYi5oIGFmdGVyCi0JZGVmaW5pdGlvbiBvZiBfR05VX1NPVVJDRS4gIFBhdGNoIGJ5IFJvbGFuZCBNY0dyYXRoLgotCi0JKiBNYWtlZmlsZS5pbiAodW5pbnN0YWxsKTogRml4IGFub3RoZXIgYnVnIHdpdGggYGZvcicgbG9vcCBhbmQKLQllbXB0eSBhcmd1bWVudHMuICBQYXRjaCBieSBKaW0gTWV5ZXJpbmcuICBDb3JyZWN0IG5hbWUgb3MKLQl1bmluc3RhbGxlZCBmaWxlczogbm8gaW50bC0gcHJlZml4IGFueW1vcmUuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWRhdGEpOiBBZ2FpbiB3b3JrIGFyb3VuZCBzaGVsbHMgd2hpY2gKLQljYW5ub3QgaGFuZGxlIG1wdHkgZm9yIGxpc3QuICBSZXBvcnRlZCBieSBKaW0gTWV5ZXJpbmcuCi0KLVNhdCBKdWwgMTMgMTg6MTE6MzUgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogU3BsaXQgZ29hbC4gIE5vdyBkZXBlbmQgb24gaW5zdGFsbC1leGVjCi0gICAgICAgIGFuZCBpbnN0YWxsLWRhdGEuCi0JKGluc3RhbGwtZXhlYywgaW5zdGFsbC1kYXRhKTogTmV3IGdvYWxzLiAgQ3JlYXRlZCBmcm9tIGZvcm1lcgotCWluc3RhbGwgZ29hbC4KLQlSZXBvcnRlZCBieSBLYXJsIEJlcnJ5LgotCi1TYXQgSnVuIDIyIDA0OjU4OjE0IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTUtJTlNUQUxMRElSUyk6IE5ldyB2YXJpYWJsZS4gIFBhdGggdG8KLSAgICAgICAgbWtpbnN0YWxsZGlycyBzY3JpcHQuCi0JKGluc3RhbGwpOiB1c2UgTUtJTlNUQUxMRElSUyB2YXJpYWJsZSBvciBpZiB0aGUgc2NyaXB0IGlzIG5vdCBwcmVzZW50Ci0JdHJ5IHRvIGZpbmQgaXQgaW4gdGhlICR0b3Bfc2NyZGlyKS4KLQotV2VkIEp1biAxOSAwMjo1Njo1NiAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbDEwbmZsaXN0LmM6IExpbnV4IGxpYmMgKnBhcnRseSogaW5jbHVkZXMgdGhlIGFyZ3pfKiBmdW5jdGlvbnMuCi0JR3JyLiAgV29yayBhcm91bmQgYnkgcmVuYW1pbmcgdGhlIHN0YXRpYyB2ZXJzaW9uIGFuZCB1c2UgbWFjcm9zCi0JZm9yIHJlbmFtaW5nLgotCi1UdWUgSnVuIDE4IDIwOjExOjE3IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsMTBuZmxpc3QuYzogQ29ycmVjdCBwcmVzZW5jZSB0ZXN0IG1hY3JvcyBvZiBfX2FyZ3pfKiBmdW5jdGlvbnMuCi0KLQkqIGwxMG5mbGlzdC5jOiBJbmNsdWRlIDxhcmd6Lmg+IGJhc2VkIG9uIHRlc3Qgb2YgaXQgaW5zdGVhZCB3aGVuCi0JX19hcmd6XyogZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUuCi0JUmVwb3J0ZWQgYnkgQW5kcmVhcyBTY2h3YWIuCi0KLVRodSBKdW4gMTMgMTU6MTc6NDQgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGV4cGxvZGVuYW1lLmMsIGwxMG5mbGlzdC5jOiBEZWZpbmUgTlVMTCBmb3IgZHVtYiBzeXN0ZW1zLgotCi1UdWUgSnVuIDExIDE3OjA1OjEzIDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBpbnRsaC5pbnN0LmluLCBsaWJnZXR0ZXh0LmggKGRjZ2V0dGV4dCk6IFJlbmFtZSBsb2NhbCB2YXJpYWJsZQotCXJlc3VsdCB0byBfX3Jlc3VsdCB0byBwcmV2ZW50IG5hbWUgY2xhc2guCi0KLQkqIGwxMG5mbGlzdC5jLCBsb2NhbGVhbGlhcy5jLCBkY2dldHRleHQuYzogRGVmaW5lIF9HTlVfU09VUkNFIHRvCi0gICAgICAgIGdldCBwcm90b3R5cGUgZm9yIHN0cGNweSBhbmQgc3RyY2FzZWNtcC4KLQotCSogaW50bGguaW5zdC5pbiwgbGliZ2V0dGV4dC5oOiBNb3ZlIGRlY2xhcmF0aW9uIG9mCi0JYF9ubF9tc2dfY2F0X2NudHInIG91dHNpZGUgX19leHRlbnNpb25fXyBibG9jayB0byBwcmV2ZW50IHdhcm5pbmcKLQlmcm9tIGdjYydzIC1XbmVzdGVkLWV4dGVybiBvcHRpb24uCi0KLUZyaSBKdW4gIDcgMDE6NTg6MDAgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogUmVtb3ZlIGNvbW1lbnQuCi0KLVRodSBKdW4gIDYgMTc6Mjg6MTcgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogV29yayBhcm91bmQgZm9yIGFub3RoZXIgQnVnbGl4IHN0dXBpZGl0eS4KLQlBbHdheXMgdXNlIGFuIGBlbHNlJyBjbG9zZSBmb3IgYGlmJ3MuICBSZXBvcnRlZCBieSBOZWxzb24gQmVlYmUuCi0KLQkqIE1ha2VmaWxlLmluIChpbnRsaC5pbnN0KTogQ29ycmVjdCB0eXBvIGluIHBob255IHJ1bGUuCi0JUmVwb3J0ZWQgYnkgTmVsc29uIEJlZWJlLgotCi1UaHUgSnVuICA2IDAxOjQ5OjUyIDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBkY2dldHRleHQuYyAocmVhZF9hbGlhc19maWxlKTogUmVuYW1lIHZhcmlhYmxlIGFsbG9jYV9saXN0IHRvCi0JYmxvY2tfbGlzdCBhcyB0aGUgbWFjcm8gY2FsbHMgYXNzdW1lLgotCVBhdGNoIGJ5IEVyaWMgQmFja3VzLgotCi0JKiBsb2NhbGVhbGlhcy5jIFshSEFWRV9BTExPQ0FdOiBEZWZpbmUgYWxsb2NhIGFzIG1hY3JvIHVzaW5nCi0gICAgICAgIG1hbGxvYy4KLQkocmVhZF9hbGlhc19maWxlKTogUmVuYW1lIHZhcnJpYWJlIGFsbG9jYV9saXN0IHRvIGJsb2NrX2xpc3QgYXMgdGhlCi0JbWFjcm8gY2FsbHMgYXNzdW1lLgotCVBhdGNoIGJ5IEVyaWMgQmFja3VzLgotCi0JKiBsMTBuZmxpc3QuYzogQ29ycmVjdCBjb25kaXRpb25hbCBmb3IgPGFyZ3ouaD4gaW5jbHVzaW9uLgotCVJlcG9ydGVkIGJ5IFJvbGFuZCBNY0dyYXRoLgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsKTogRGVwZW5kIG9uIGFsbC1AVVNFX0lOQ0xVREVEX0xJQklOVExALCBub3QKLSAgICAgICAgYWxsLUBVU0VfTkxTQC4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBpbnRsaC5pbnN0IGNvbWVzIGZyb20gbG9jYWwgZGlyLCBub3QKLSAgICAgICAgJChzcmNkaXIpLgotCi0JKiBNYWtlZmlsZS5pbiAoaW50bGguaW5zdCk6IFNwZWNpYWwgaGFuZGxpbmcgb2YgdGhpcyBnb2FsLiAgSWYKLQl1c2VkIGluIGdldHRleHQsIHRoaXMgaXMgcmVhbGx5IGEgcnVsIHRvIGNvbnN0cnVjdCB0aGlzIGZpbGUuICBJZgotCXVzZWQgaW4gYW55IG90aGVyIHBhY2thZ2UgaXQgaXMgZGVmaW5lZCBhcyBhIC5QSE9OWSBydWxlIHdpdGgKLQllbXB0eSBib2R5LgotCi0JKiBmaW5kZG9tYWluLmM6IEV4dHJhY3QgbG9jYWxlIGZpbGUgaW5mb3JtYXRpb24gaGFuZGxpbmcgaW50bwotCWwxMG5maWxlLmMuICBSZW5hbWUgbG9jYWwgc3RwY3B5X18gZnVuY3Rpb24gdG8gc3RwY3B5LgotCi0JKiBkY2dldHRleHQuYyAoc3RwY3B5KTogQWRkIGxvY2FsIGRlZmluaXRpb24uCi0KLQkqIGwxMG5mbGlzdC5jOiBTb2x2ZSBzb21lIHBvcnRhYmlsaXR5IHByb2JsZW1zLiAgUGF0Y2hlcyBwYXJ0bHkgYnkKLQlUaG9tYXMgRXNrZW4uICBBZGQgbG9jYWwgZGVmaW5pdGlvbiBvZiBzdHBjcHkuCi0KLVR1ZSBKdW4gIDQgMDI6NDc6NDkgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGludGxoLmluc3QuaW46IERvbid0IGRlcGVuZCBpbmNsdWRpbmcgPGxvY2FsZS5oPiBvbgotCUhBVkVfTE9DQUxFX0guICBJbnN0ZWFkIGNvbmZpZ3VyZSBtdXN0IHJld3JpdGUgdGhpcyBmaWlsZQotCWRlcGVuZGluZyBvbiB0aGUgcmVzdWx0IG9mIHRoZSBjb25maWd1cmUgcnVuLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IGxpYmludGwuaW5zdCBpcyBub3cgY2FsbGVkIGludGxoLmluc3QuCi0JQWRkIHJ1bGVzIGZvciB1cGRhdGluZyBpbnRsaC5pbnN0IGZyb20gaW50bGguaW5zdC5pbi4KLQotCSogbGliaW50bC5pbnN0OiBSZW5hbWVkIHRvIGludGxoLmluc3QuaW4uCi0KLQkqIGxvY2FsZWFsaWFzLmMsIGRjZ2V0dGV4dC5jIFtfX0dOVUNfX106IERlZmluZSBIQVZFX0FMTE9DQSB0byAxCi0gICAgICAgIGJlY2F1c2UgZ2NjIGhhcyBfX2J1aXRsaW5fYWxsb2NhLgotCVJlcG9ydGVkIGJ5IFJvbGFuZCBNY0dyYXRoLgotCi1Nb24gSnVuICAzIDAwOjMyOjE2IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbGNoZWNrKTogTmV3IGdvYWwgdG8gZnVsZmlsbCBuZWVkcyBvZgotICAgICAgICBhdXRvbWFrZSdzIGRpc3RjaGVjay4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBSZW9yZGVyIGNvbW1hbmRzIHNvIHRoYXQgVkVSU0lPTiBpcwotICAgICAgICBmb3VuZC4KLQotCSogTWFrZWZpbGUuaW4gKGdldHRleHRzcmNkaXIpOiBOb3cgdXNlIHN1YmRpcmVjdG9yeSBpbnRsLyBpbgotICAgICAgICBAZGF0YWRpckAvZ2V0dGV4dC4KLQkoQ09NU1JDUyk6IEFkZCBsMTBuZmlsZS5jLgotCShPQkpFQ1RTKTogQWRkIGwxMG5maWxlLm8uCi0JKERJU1RGSUxFUyk6IFJlbmFtZSB0byBESVNURklMRS5ub3JtYWwuICBSZW1vdmUgJChESVNURklMRVMuY29tbW9uKS4KLQkoRElTVEZJTEUuZ2V0dGV4dCk6IFJlbW92ZSAkKERJU1RGSUxFUy5jb21tb24pLgotCShhbGwtZ2V0dGV4dCk6IFJlbW92ZSBnb2FsLgotCShpbnN0YWxsKTogSWYgJChQQUNLQUdFKSA9IGdldHRleHQgaW5zdGFsbCwgb3RoZXJ3b3NlIGRvIG5vdGhpbmcuICBObwotCXBhY2thZ2UgYnV0IGdldHRleHQgaXRzZWxmIHNob3VsZCBpbnN0YWxsIGxpYmludGwuaCArIGhlYWRlcnMuCi0JKGRpc3QpOiBFeHRlbmQgZ29hbCB0byB3b3JrIGZvciBnZXR0ZXh0LCB0b28uCi0JKGRpc3QtZ2V0dGV4dCk6IFJlbW92ZSBnb2FsLgotCi0JKiBkY2dldHRleHQuYyBbIUhBVkVfQUxMT0NBXTogRGVmaW5lIG1hY3JvIGFsbG9jYSBieSB1c2luZyBtYWxsb2MuCi0KLVN1biBKdW4gIDIgMTc6MzM6MDYgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGxvYWRtc2djYXQuYyAoX25sX2xvYWRfZG9tYWluKTogUGFyYW1ldGVyIGlzIG5vdyBjb21lcyBmcm9tCi0gICAgICAgIGZpbmRfbDEwbmZpbGUuCi0KLVNhdCBKdW4gIDEgMDI6MjM6MDMgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGwxMG5mbGlzdC5jIChfX2FyZ3pfbmV4dCk6IEFkZCBkZWZpbml0aW9uLgotCi0JKiBkY2dldHRleHQuYyBbIUhBVkVfQUxMT0NBXTogQWRkIGNvZGUgZm9yIGhhbmRsaW5nIG1pc3NpbmcgYWxsb2NhCi0JY29kZS4gIFVzZSBuZXcgbDEwbmZpbGUgaGFuZGxpbmcuCi0KLQkqIGxvY2FsZWFsaWFzLmMgWyFIQVZFX0FMTE9DQV06IEFkZCBjb2RlIGZvciBoYW5kbGluZyBtaXNzaW5nCi0gICAgICAgIGFsbG9jYSBjb2RlLgotCi0JKiBsMTBuZmxpc3QuYzogSW5pdGlhbCByZXZpc2lvbi4KLQotVHVlIEFwciAgMiAxODo1MToxOCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdldHRleHQpOiBOZXcgZ29hbC4gIFNhbWUgYXMgYWxsLXllcy4KLQotVGh1IE1hciAyOCAyMzowMToyMiAxOTk2ICBLYXJsIEVpY2h3YWxkZXIgIDxrZUBrZS5jZW50cmFsLmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoZ2V0dGV4dHNyY2Rpcik6IERlZmluZSB1c2luZyBAZGF0YWRpckAuCi0KLVR1ZSBNYXIgMjYgMTI6Mzk6MTQgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jOiBJbmNsdWRlIDxjdHlwZS5oPi4gIFJlcG9ydGVkIGJ5IFJvbGFuZCBNY0dyYXRoLgotCi1TYXQgTWFyIDIzIDAyOjAwOjM1IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYyAoc3RwY3B5KTogUmVuYW1lIHRvIHN0cGNweV9fIHRvIHByZXZlbnQgY2xhc2hpbmcKLSAgICAgICAgd2l0aCBleHRlcm5hbCBkZWNsYXJhdGlvbi4KLQotU2F0IE1hciAgMiAwMDo0NzowOSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLW5vKTogUmVuYW1lIGZyb20gYWxsX25vLgotCi1TYXQgRmViIDE3IDAwOjI1OjU5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGdldHRleHRQLmggW2xvYWRlZF9kb21haW5dOiBBcnJheSBgc3VjY2Vzc29yJyBtdXN0IG5vdyBjb250YWluIHVwCi0gICAgICAgIHRvIDYzIGVsZW1lbnRzIChiZWNhdXNlIG9mIGNvZGVzZXQgbmFtZSBub3JtYWxpemF0aW9uKS4KLQotCSogZmluZGRvbWFpbi5jOiBJbXBsZW1lbnQgY29kZXNldCBuYW1lIG5vcm1hbGl6YXRpb24uCi0KLVRodSBGZWIgMTUgMDQ6Mzk6MDkgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbCk6IERlZmluZSB0byBgYWxsLUBVU0VfTkxTQCcuCi0JKGFsbC15ZXMsIGFsbF9ubyk6IE5ldyBnb2Fscy4gIGBhbGwtbm8nIGlzIG5vb3AsIGBhbGwteWVzJwotCWlzIGZvcm1lciBhbGwuCi0KLU1vbiBKYW4gMTUgMjE6NDY6MDEgMTk5NiAgSG93YXJkIEdheWxlICA8aG93YXJkQGhhbC5jb20+Ci0KLQkqIGxvY2FsZWFsaWFzLmMgKGFsaWFzX2NvbXBhcmUpOiBJbmNyZW1lbnQgc3RyaW5nIHBvaW50ZXJzIGluIGxvb3AKLSAgICAgICAgb2Ygc3RyY2FzZWNtcCByZXBsYWNlbWVudC4KLQotRnJpIERlYyAyOSAyMToxNjozNCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1zcmMpOiBXaG8gY29tbWVudGVkIHRoaXMgZ29hbCBvdXQgPyA6LSkKLQotRnJpIERlYyAyOSAxNTowODoxNiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBkY2dldHRleHQuYyAoRENHRVRURVhUKTogU2F2ZSBgZXJybm8nLiAgRmFpbGluZyBzeXN0ZW0gY2FsbHMKLQlzaG91bGQgbm90IGVmZmVjdCBpdCBiZWNhdXNlIGEgbWlzc2luZyBjYXRhbG9nIGlzIG5vIGVycm9yLgotCVJlcG9ydGVkIGJ5IEhhcmFsZCBLPG86Pm5pZyA8a29lbmlnQHRhdC5waHlzaWsudW5pLXR1ZWJpbmdlbi5kZT4uCi0KLVR1ZSBEZWMgMTkgMjI6MDk6MTMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogRXhwbGljaXRseSB1c2UgJChTSEVMTCkgZm9yIHJ1bm5pbmcKLSAgICAgICAgc2hlbGwgc2NyaXB0cy4KLQotRnJpIERlYyAxNSAxNzozNDo1OSAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtc3JjKTogT25seSBpbnN0YWxsIGxpYnJhcnkgYW5kIGhlYWRlciB3aGVuCi0Jd2UgdXNlIHRoZSBvd24gaW1wbGVtZW50YXRpb24uICBEb24ndCBkbyBpdCB3aGVuIHVzaW5nIHRoZQotCXN5c3RlbSdzIGdldHRleHQgb3IgY2F0Z2V0cyBmdW5jdGlvbnMuCi0KLQkqIGRjZ2V0dGV4dC5jIChmaW5kX21zZyk6IE11c3Qgbm90IHN3YXAgZG9tYWluLT5oYXNoX3NpemUgaGVyZS4KLQotU2F0IERlYyAgOSAxNjoyNDozNyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2NhbGVhbGlhcy5jLCBsaWJpbnRsLmluc3QsIGxpYmdldHRleHQuaCwgaGFzaC1zdHJpbmcuaCwKLQlnZXR0ZXh0UC5oLCBmaW5kZG9tYWluLmMsIGRjZ2V0dGV4dC5jLCBjYXQtY29tcGF0LmM6Ci0JVXNlIFBBUkFNUyBpbnN0ZWFkIG9mIF9fUC4gIFN1Z2dlc3RlZCBieSBSb2xhbmQgTWNHcmF0aC4KLQotVHVlIERlYyAgNSAxMTozOToxNCAxOTk1ICBMYXJyeSBTY2h3aW1tZXIgIDxyb3NlYnVkQGN5Y2xvbmUuc3RhbmZvcmQuZWR1PgotCi0JKiBsaWJnZXR0ZXh0Lmg6IFVzZSBgI2lmICFkZWZpbmVkIChfTElCSU5UTF9IKScgaW5zdGVhZCBvZiBgI2lmCi0JIV9MSUJJTlRMX0gnIGJlY2F1c2UgU29sYXJpcyBkZWZpbmVzIF9MSUJJTlRMX0ggYXMgZW1wdHkuCi0KLU1vbiBEZWMgIDQgMTU6NDI6MDcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtc3JjKToKLQlJbnN0YWxsIGxpYmludGwuaW5zdCBpbnN0ZWFkIG9mIGxpYmludGwuaC5pbnN0YWxsLgotCi1TYXQgRGVjICAyIDIyOjUxOjM4IDE5OTUgIE1hcmN1cyBEYW5pZWxzICA8bWFyY3VzQHN5c2MucGR4LmVkdT4KLQotCSogY2F0LWNvbXBhdC5jICh0ZXh0ZG9tYWluKToKLQlSZXZlcnNlIG9yZGVyIGluIHdoaWNoIGZpbGVzIGFyZSB0cmllZCB5b3UgbG9hZC4gIEZpcnN0Ci0JdHJ5IGxvY2FsIGZpbGUsIHdoZW4gdGhpcyBmYWlsZWQgYWJzb2x1dGUgcGF0aC4KLQotV2VkIE5vdiAyOSAwMjowMzo1MyAxOTk1ICBOZWxzb24gSC4gRi4gQmVlYmUgIDxiZWViZUBtYXRoLnV0YWguZWR1PgotCi0JKiBjYXQtY29tcGF0LmMgKGJpbmR0ZXh0ZG9tYWluKTogQWRkIG1pc3NpbmcgeyB9LgotCi1TdW4gTm92IDI2IDE4OjIxOjQxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxpYmludGwuaW5zdDogQWRkIG1pc3NpbmcgX19QIGRlZmluaXRpb24uICBSZXBvcnRlZCBieSBOZWxzb24gQmVlYmUuCi0KLQkqIE1ha2VmaWxlLmluOgotCUFkZCBkdW1teSBgYWxsJyBhbmQgYGR2aScgZ29hbHMuICBSZXBvcnRlZCBieSBUb20gVHJvbWV5LgotCi1TYXQgTm92IDI1IDE2OjEyOjAxIDE5OTUgIEZyYW5jLG9pcyBQaW5hcmQgIDxwaW5hcmRAaXJvLnVtb250cmVhbC5jYT4KLQotCSogaGFzaC1zdHJpbmcuaDogQ2FwaXRhbGl6ZSBhcmd1bWVudHMgb2YgbWFjcm9zLgotCi1TYXQgTm92IDI1IDEyOjAxOjM2IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOiBQcmV2ZW50IGZpbGVzIG5hbWVzIGxvbmdlciB0aGFuIDEzCi0JY2hhcmFjdGVycy4gIGxpYmludGwuaC5nbGliYy0+bGliaW50bC5nbGliYywKLQlsaWJpbnRsLmguaW5zdGFsbC0+bGliaW50bC5pbnN0LiAgUmVwb3J0ZWQgYnkgSm9zaHVhIFIuIFBvdWxzb24uCi0KLVNhdCBOb3YgMjUgMTE6MzE6MTIgMTk5NSAgRXJpYyBCYWNrdXMgIDxlcmljYkBsc2lkLmhwLmNvbT4KLQotCSogZGNnZXR0ZXh0LmM6IEZpeCBidWcgaW4gcHJlcHJvY2Vzc29yIGNvbmRpdGlvbmFscy4KLQotU2F0IE5vdiAyNSAwMjozNToyNyAxOTk1ICBOZWxzb24gSC4gRi4gQmVlYmUgIDxiZWViZUBtYXRoLnV0YWguZWR1PgotCi0JKiBsaWJnZXR0ZXh0Lmg6IFNvbGFyaXMgY2MgZG9lcyBub3QgdW5kZXJzdGFuZAotCSAjaWYgIVNZTUJPTDEgJiYgIVNZTUJPTDIuICBTYWQJYnV0IHRydWUuCi0KLVRodSBOb3YgMjMgMTY6MjI6MTQgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogaGFzaC1zdHJpbmcuaCAoaGFzaF9zdHJpbmcpOgotCUZpeCBmb3IgbWFjaGluZSB3aXRoID4zMiBiaXQgYHVuc2lnbmVkIGxvbmcncy4KLQotCSogZGNnZXR0ZXh0LmMgKERDR0VUVEVYVCk6Ci0JRml4IGhvcnJpYmxlIGJ1ZyBpbiBsb29wIGZvciBhbHRlcm5hdGl2ZSB0cmFuc2xhdGlvbi4KLQotVGh1IE5vdiAyMyAwMTo0NToyOSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBwbzJ0Ymwuc2VkLmluLCBsaW51eC1tc2cuc2VkLCB4b3Blbi1tc2cuc2VkOgotCVNvbWUgZnVydGhlciBzaW1wbGlmaWNhdGlvbnMgaW4gbWVzc2FnZSBudW1iZXIgZ2VuZXJhdGlvbi4KLQotTW9uIE5vdiAyMCAyMTowODo0MyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsaWJpbnRsLmguZ2xpYmM6IFVzZSBfX2NvbnN0IGluc3RlYWQgb2YgY29uc3QgaW4gcHJvdG90eXBlcy4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtc3JjKToKLQlJbnN0YWxsIGxpYmludGwuaC5pbnN0YWxsIGluc3RlYWQgb2YgbGliaW50bC5oLiAgVGhpcwotCWlzIGEgc3RyaXBwZWQtZG93biB2ZXJzaW9uLiAgU3VnZ2VzdGVkIGJ5IFBldGVyIE1pbGxlci4KLQotCSogbGliaW50bC5oLmluc3RhbGwsIGxpYmludGwuaC5nbGliYzogSW5pdGlhbCByZXZpc2lvbi4KLQotCSogbG9jYWxlYWxpYXMuYyAoX25sX2V4cGFuZF9hbGlhcywgcmVhZF9hbGlhc19maWxlKToKLQlQcm90ZWN0IHByb3RvdHlwZXMgaW4gdHlwZSBjYXN0cyBieSBfX1AuCi0KLVR1ZSBOb3YgMTQgMTY6NDM6NTggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogaGFzaC1zdHJpbmcuaDogQ29ycmVjdCBwcm90b3R5cGUgZm9yIGhhc2hfc3RyaW5nLgotCi1TdW4gTm92IDEyIDEyOjQyOjMwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGhhc2gtc3RyaW5nLmggKGhhc2hfc3RyaW5nKTogQWRkIHByb3RvdHlwZS4KLQotCSogZ2V0dGV4dFAuaDogRml4IGNvcHlyaWdodC4KLQkoU1dBUCk6IEFkZCBwcm90b3R5cGUuCi0KLVdlZCBOb3YgIDggMjI6NTY6MzMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9jYWxlYWxpYXMuYyAocmVhZF9hbGlhc19maWxlKTogRm9yZ290IHNpemVvZi4KLQlBdm9pZCBjYWxsaW5nICpwcmludGYgZnVuY3Rpb24uICBUaGlzIGludHJvZHVjZXMgYSBiaWcgb3ZlcmhlYWQuCi0JUGF0Y2ggYnkgUm9sYW5kIE1jR3JhdGguCi0KLVR1ZSBOb3YgIDcgMTQ6MjE6MDggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jLCBjYXQtY29tcGF0LmM6IFdyb25nIGluZGVudGF0aW9uIGluICNpZiBmb3Igc3RwY3B5LgotCi0JKiBmaW5kZG9tYWluLmMgKHN0cGNweSk6Ci0JRGVmaW5lIHN1YnN0aXR1dGlvbiBmdW5jdGlvbiBsb2NhbC4gIFRoZSBtYWNybyB3YXMgdG8gZmxha3kuCi0KLQkqIGNhdC1jb21wYXQuYzogRml4IHR5cG8uCi0KLQkqIHhvcGVuLW1zZy5zZWQsIGxpbnV4LW1zZy5zZWQ6Ci0JV2hpbGUgYnJpbmdpbmcgbWVzc2FnZSBudW1iZXIgdG8gcmlnaHQgcGxhY2Ugb25seSBhY2NlcHQgZGlnaXRzLgotCi0JKiBsaW51eC1tc2cuc2VkLCB4b3Blbi1tc2cuc2VkOiBOb3cgdGhhdCB0aGUgY291bnRlciBkb2VzIG5vdCBoYXZlCi0JbGVhZGluZyAwcyB3ZSBkb24ndCBuZWVkIHRvIHJlbW92ZSB0aGVtLiAgUmVwb3J0ZWQgYnkgTWFyY3VzCi0JRGFuaWVscy4KLQotCSogTWFrZWZpbGUuaW4gKC4uL3BvL2NhdC1pZC10Ymwubyk6IFVzZSAkKHRvcF9zcmRpcikgaW4KLQlkZXBlbmRlbmN5LiAgUmVwb3J0ZWQgYnkgTWFyY3VzIERhbmllbHMuCi0KLQkqIGNhdC1jb21wYXQuYzogKHN0cGNweSkgWyFfTElCQyAmJiAhSEFWRV9TVFBDUFldOiBEZWZpbmUgcmVwbGFjZW1lbnQuCi0JR2VuZXJhbGx5IGNsZWFudXAgdXNpbmcgI2lmIGluc3RlYWQgb2YgI2lmbmRlZi4KLQotCSogTWFrZWZpbGUuaW46IENvcnJlY3QgdHlwb3MgaW4gY29tbWVudC4gIEJ5IEZyYW5jLG9pcyBQaW5hcmQuCi0KLU1vbiBOb3YgIDYgMDA6Mjc6MDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtc3JjKTogRG9uJ3QgaW5zdGFsbCBsaWJpbnRsLmggYW5kIGxpYmludGwuYQotCWlmIHdlIHVzZSBhbiBhdmFpbGFibGUgZ2V0dGV4dCBpbXBsZW1lbnRhdGlvbi4KLQotU3VuIE5vdiAgNSAyMjowMjowOCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsaWJnZXR0ZXh0Lmg6IEZpeCB0eXBvOiBIQVZFX0NBVEdFVFRTIC0+IEhBVkVfQ0FUR0VUUy4gIFJlcG9ydGVkCi0JYnkgRnJhbmMsb2lzIFBpbmFyZC4KLQotCSogbGliZ2V0dGV4dC5oOiBVc2UgI2lmIGluc3RlYWQgb2YgI2lmZGVmLyNpZm5kZWYuCi0KLQkqIGZpbmRkb21haW4uYzoKLQlDb21tZW50cyBkZXNjcmliaW5nIHdoYXQgaGFzIHRvIGJlIGRvbmUgc2hvdWxkIHN0YXJ0IHdpdGggRklYTUUuCi0KLVN1biBOb3YgIDUgMTk6Mzg6MDEgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6IFNwbGl0LiAgVXNlIERJU1RGSUxFUyB3aXRoIG5vcm1hbCBtZWFuaW5nLgotCURJU1RGSUxFUy5jb21tb24gbmFtZXMgdGhlIGZpbGVzIGNvbW1vbiB0byBib3RoIGRpc3QgZ29hbHMuCi0JRElTVEZJTEVTLmdldHRleHQgYXJlIHRoZSBmaWxlcyBvbmx5IGRpc3RyaWJ1dGVkIGluIEdOVSBnZXR0ZXh0LgotCi1TdW4gTm92ICA1IDE3OjMyOjU0IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGRjZ2V0dGV4dC5jIChEQ0dFVFRFWFQpOiBDb3JyZWN0IHNlYXJjaGluZyBpbiBkZXJpdmVkIGxvY2FsZXMuCi0JVGhpcyB3YXMgbmVjZXNzYXJ5IHNpbmNlIGEgY2hhbmdlIGluIF9ubF9maW5kX21zZyBzZXZlcmFsIHdlZWtzCi0JYWdvLiAgSSByZWFsbHkgZG9uJ3Qga25vdyB0aGlzIGlzIHN0aWxsIG5vdCBmaXhlZC4KLQotU3VuIE5vdiAgNSAxMjo0MzoxMiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2FkbXNnY2F0LmMgKF9ubF9sb2FkX2RvbWFpbik6IFRlc3QgZm9yIEZJTEVOQU1FID09IE5VTEwuICBUaGlzCi0JbWlnaHQgbWFyayBhIHNwZWNpYWwgY29uZGl0aW9uLgotCi0JKiBmaW5kZG9tYWluLmMgKG1ha2VfZW50cnlfcmVjKTogRG9uJ3QgbWFrZSBpbGxlZ2FsIGVudHJ5IGFzIGRlY2lkZWQuCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0KTogU3VwcHJlc3MgZXJyb3IgbWVzc2FnZSB3aGVuIGxuIGZhaWxlZC4KLQlHZXQgZmlsZXMgZnJvbSAkKHNyY2RpcikgZXhwbGljaXRseS4KLQotCSogbGliZ2V0dGV4dC5oIChnZXR0ZXh0X2NvbnN0KTogUmVuYW1lIHRvIGdldHRleHRfbm9vcC4KLQotRnJpIE5vdiAgMyAwNzozNjo1MCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmMgKG1ha2VfZW50cnlfcmVjKToKLQlQcm90ZWN0IGFnYWluc3Qgd3JvbmcgbG9jYWxlIG5hbWVzIGJ5IHRlc3RpbmcgbWFzay4KLQotCSogbGliZ2V0dGV4dC5oIChnZXR0ZXh0X2NvbnN0KTogQWRkIG1hY3JvIGRlZmluaXRpb24uCi0JQ2FwaXRhbGl6ZSBtYWNybyBhcmd1bWVudHMuCi0KLVRodSBOb3YgIDIgMjM6MTU6NTEgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOgotCVRlc3QgZm9yIHBvaW50ZXIgIT0gTlVMTCBiZWZvcmUgYWNjZXNzaW5nIHZhbHVlLgotCVJlcG9ydGVkIGJ5IFRvbSBUcm9tZXkuCi0KLQkqIGdldHRleHQuYyAoTlVMTCk6Ci0JRGVmaW5lIGFzICh2b2lkKikwIGluc3RhZCBvZiAwLiAgUmVwb3J0ZWQgYnkgRnJhbmMsb2lzIFBpbmFyZC4KLQotTW9uIE9jdCAzMCAyMToyODo1MiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBwbzJ0Ymwuc2VkLmluOiBTZXJpb3VzIHR5cG8gYnVnIGZpeGVkIGJ5IEppbSBNZXllcmluZy4KLQotU2F0IE9jdCAyOCAyMzoyMDo0NyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsaWJnZXR0ZXh0Lmg6IERpc2FibGUgZGNnZXR0ZXh0IG9wdGltaXphdGlvbiBmb3IgU29sYXJpcyAyLjMuCi0KLQkqIGxvY2FsZWFsaWFzLmMgKGFsaWFzX2NvbXBhcmUpOgotCVBldGVyIE1pbGxlciByZXBvcnRlZCB0aGF0IHRvbG93ZXIgaW4gc29tZSBzeXN0ZW1zIGlzCi0JZXZlbiBkdW1iZXIgdGhhbiBJIHRob3VnaHQuICBQcm90ZWN0IGNhbGwgYnkgYGlzdXBwZXInLgotCi1GcmkgT2N0IDI3IDIyOjIyOjUxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChsaWJkaXIsIGluY2x1ZGVkaXIpOiBOZXcgdmFyaWFibGVzLgotCShpbnN0YWxsLXNyYyk6IEluc3RhbGwgbGliaW50bC5hIGFuZCBsaWJpbnRsLmggaW4gY29ycmVjdCBkaXJzLgotCi1GcmkgT2N0IDI3IDIyOjA3OjI5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChTT1VSQ0VTKTogRml4IHR5cG86IGludHJsLmNvbXBhdC5jIC0+IGludGwtY29tcGF0LmMuCi0KLQkqIHBvMnRibC5zZWQuaW46IFBhdGNoIGZvciBidWdneSBTRURzIGJ5IENocmlzdGlhbiB2b24gUm9xdWVzLgotCi0JKiBsb2NhbGVhbGlhcy5jOgotCUZpeCB0eXBvIGFuZCBzdXBlcmZsb3VzIHRlc3QuICBSZXBvcnRlZCBieSBDaHJpc3RpYW4gdm9uIFJvcXVlcy4KLQotRnJpIE9jdCAgNiAxMTo1MjowNSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmMgKF9ubF9maW5kX2RvbWFpbik6Ci0JQ29ycmVjdCBzb21lIHJlbWFpbmRlciBmcm9tIHRoZSBwcmUtQ0VOIHN5bnRheC4gIE5vdwotCXdlIGRvbid0IGhhdmUgYSBjb25zdGFudCBudW1iZXIgb2Ygc3VjY2Vzc29ycyBhbnltb3JlLgotCi1XZWQgU2VwIDI3IDIxOjQxOjEzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOiBBZGQgbGliaW50bC5oLmdsaWJjLgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdC1saWJjKTogQWRkIGdvYWwgZm9yIHBhY2tpbmcgc291cmNlcyBmb3IgZ2xpYmMuCi0JKENPTVNSQ1MsIENPTUhEUlMpOiBTcGxpdHRlZCB0byBzZXBhcmF0ZSBzb3VyY2VzIHNoYXJlZCB3aXRoIGdsaWJjLgotCi0JKiBsb2FkbXNnY2F0LmM6IEZvcmdldCB0byBjb250aW51ZSAjaWYgbGluZS4KLQotCSogbG9jYWxlYWxpYXMuYzoKLQlbX0xJQkNdOiBSZW5hbWUgc3RyY2FzZWNtcCB0byBfX3N0cmNhc2VjbXAgdG8ga2VlcCBBTlNJIEMgbmFtZQotCXNwYWNlIGNsZWFuLgotCi0JKiBkY2dldHRleHQuYywgZmluZGRvbWFpbi5jOiBCZXR0ZXIgY29tbWVudCB0byBsYXN0IGNoYW5nZS4KLQotCSogbG9hZG1zZ2NhdC5jOgotCVtfTElCQ106IFJlbmFtZSBmc3RhdCwgb3BlbiwgY2xvc2UsIHJlYWQsIG1tYXAsIGFuZCBtdW5tYXAgdG8KLQlfX2ZzdGF0LCBfX29wZW4sIF9fY2xvc2UsIF9fcmVhZCwgX19tbWFwLCBhbmQgX19tdW5tYXAgcmVzcAotCXRvIGtlZXAgQU5TSSBDIG5hbWUgc3BhY2UgY2xlYW4uCi0KLQkqIGZpbmRkb21haW4uYzoKLQlbX0xJQkNdOiBSZW5hbWUgc3RwY3B5IHRvIF9fc3RwY3B5IHRvIGtlZXAgQU5TSSBDIG5hbWUgc3BhY2UgY2xlYW4uCi0KLQkqIGRjZ2V0dGV4dC5jOgotCVtfTElCQ106IFJlbmFtZSBnZXRjZWQgYW5kIHN0cGNweSB0byBfX2dldGN3ZCBhbmQgX19zdHBjcHkgcmVzcCB0bwotCWtlZXAgQU5TSSBDIG5hbWUgc3BhY2UgY2xlYW4uCi0KLQkqIGxpYmdldHRleHQuaDoKLQlJbmNsdWRlIHN5cy90eXBlcy5oIGZvciB0aG9zZSBvbGQgU3lzViBzeXN0ZW1zIG91dCB0aGVyZS4KLQlSZXBvcnRlZCBieSBGcmFuY2VzY28gUG90b3J0aWAuCi0KLQkqIGxvYWRtc2djYXQuYyAodXNlX21tYXApOiBEZWZpbmUgaWYgY29tcGlsZWQgZm9yIGdsaWJjLgotCi0JKiBiaW5kdGV4dGRvbS5jOiBJbmNsdWRlIGFsbCB0aG9zZSBzdGFuZGFyZCBoZWFkZXJzCi0JdW5jb25kaXRpb25hbGx5IGlmIF9MSUJDIGlzIGRlZmluZWQuCi0KLQkqIGZpbmRkb21haW4uYzogRml4IDIgdGltZXMgZGVmaWVuZCAtPiBkZWZpbmVkLgotCi0JKiB0ZXh0ZG9tYWluLmM6IEluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YgbGliZ2V0dGV4dC5oIHdoZW4KLQljb21waWxpbmcgZm9yIGdsaWJjLiAgSW5jbHVkZSBhbGwgdGhvc2Ugc3RhbmRhcmQgaGVhZGVycwotCXVuY29uZGl0aW9uYWxseSBpZiBfTElCQyBpcyBkZWZpbmVkLgotCi0JKiBsb2NhbGVhbGlhcy5jLCBsb2FkbXNnY2F0LmM6IFByZXBhcmUgdG8gYmUgY29tcGlsZWQgaW4gZ2xpYmMuCi0KLQkqIGdldHRleHQuYzoKLQlJbmNsdWRlIGxpYmludGwuaCBpbnN0ZWFkIG9mIGxpYmdldHRleHQuaCB3aGVuIGNvbXBpbGluZyBmb3IgZ2xpYmMuCi0JR2V0IE5VTEwgZnJvbSBzdGRkZWYuaCBpZiB3ZSBjb21waWxlIGZvciBnbGliYy4KLQotCSogZmluZGRvbWFpbi5jOiBJbmNsdWRlIGxpYmludGwuaCBpbnN0ZWFkIG9mIGxpYmdldHRleHQuaCB3aGVuCi0JY29tcGlsaW5nIGZvciBnbGliYy4gIEluY2x1ZGUgYWxsIHRob3NlIHN0YW5kYXJkIGhlYWRlcnMKLQl1bmNvbmRpdGlvbmFsbHkgaWYgX0xJQkMgaXMgZGVmaW5lZC4KLQotCSogZGNnZXR0ZXh0LmM6IEluY2x1ZGUgYWxsIHRob3NlIHN0YW5kYXJkIGhlYWRlcnMgdW5jb25kaXRpb25hbGx5Ci0JaWYgX0xJQkMgaXMgZGVmaW5lZC4KLQotCSogZGdldHRleHQuYzogSWYgY29tcGlsZWQgaW4gZ2xpYmMgaW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZgotCWxpYmdldHRleHQuaC4KLQkobG9jYWxlLmgpOiBEb24ndCByZWx5IG9uIEhBVkVfTE9DQUxFX0ggd2hlbiBjb21waWxpbmcgZm9yIGdsaWJjLgotCi0JKiBkY2dldHRleHQuYzogSWYgY29tcGlsZWQgaW4gZ2xpYmMgaW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZgotCWxpYmdldHRleHQuaC4KLQkoZ2V0Y3dkKTogRG9uJ3QgcmVseSBvbiBIQVZFX0dFVENXRCB3aGVuIGNvbXBpbGluZyBmb3IgZ2xpYmMuCi0KLQkqIGJpbmR0ZXh0ZG9tLmM6Ci0JSWYgY29tcGlsZWQgaW4gZ2xpYmMgaW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZiBsaWJnZXR0ZXh0LmguCi0KLU1vbiBTZXAgMjUgMjI6MjM6MDYgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9jYWxlYWxpYXMuYyAoX25sX2V4cGFuZF9hbGlhcyk6IERvbid0IGNhbGwgYnNlYXJjaCBpZiBOTUFQIDw9IDAuCi0JUmVwb3J0ZWQgYnkgTWFyY3VzIERhbmllbHMuCi0KLQkqIGNhdC1jb21wYXQuYyAoYmluZHRleHRkb21haW4pOgotCVN0cmluZyB1c2VkIGluIHB1dGVudiBtdXN0IG5vdCBiZSByZWN5Y2xlZC4KLQlSZXBvcnRlZCBieSBNYXJjdXMgRGFuaWVscy4KLQotCSogbGliZ2V0dGV4dC5oIChfX1VTRV9HTlVfR0VUVEVYVCk6Ci0JQWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIEdOVSBnZXR0ZXh0Ci0JbGlicmFyeS4KLQotCSogY2F0LWNvbXBhdC5jIChiaW5kdGV4dGRvbWFpbik6Ci0JRml4IGJ1ZyB3aXRoIHRoZSBzdHJhbmdlIHN0cGNweSByZXBsYWNlbWVudC4KLQlSZXBvcnRlZCBieSBOZWxzb24gQmVlYmUuCi0KLVNhdCBTZXAgMjMgMDg6MjM6NTEgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogY2F0LWNvbXBhdC5jOiBJbmNsdWRlIDxzdHJpbmcuaD4gZm9yIHN0cGNweSBwcm90b3R5cGUuCi0KLQkqIGxvY2FsZWFsaWFzLmMgKHJlYWRfYWxpYXNfZmlsZSk6Ci0JV2hpbGUgZXhwYW5kIHN0cmR1cCBjb2RlIHRlbXBvcmFyeSB2YXJpYWJsZSBgY3AnIGhpZGVkCi0JaGlnaGVyIGxldmVsIHZhcmlhYmxlIHdpdGggc2FtZSBuYW1lLiAgUmVuYW1lIHRvIGB0cCcuCi0KLQkqIHRleHRkb21haW4uYyAodGV4dGRvbWFpbik6Ci0JQXZvaWQgd2FybmluZyBieSB1c2luZyB0ZW1wb3JhcnkgdmFyaWFibGUgaW4gc3RyZHVwIGNvZGUuCi0KLQkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBgYXBwbGljYXRpb24nLgotCi1UaHUgU2VwIDIxIDE1OjUxOjQ0IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvY2FsZWFsaWFzLmMgKGFsaWFzX2NvbXBhcmUpOgotCVVzZSBzdHJjYXNlY21wKCkgb25seSBpZiBhdmFpbGFibGUuICBFbHNlIHVzZQotCWltcGxlbWVudGF0aW9uIGluIHBsYWNlLgotCi0JKiBpbnRsLWNvbXBhdC5jOgotCVdyYXBwZXIgZnVuY3Rpb25zIG5vdyBjYWxsICpfXyBmdW5jdGlvbnMgaW5zdGVhZCBvZiBfXyouCi0KLQkqIGxpYmdldHRleHQuaDogRGVjbGFyZSBwcm90b3R5cGVzIGZvciAqX18gZnVuY3Rpb25zIGluc3RlYWQgZm9yIF9fKi4KLQotCSogY2F0LWNvbXBhdC5jLCBsb2FkbXNnY2F0LmM6Ci0JRG9uJ3QgdXNlIHhtYWxsb2MsIHhzdHJkdXAsIGFuZCBzdHBjcHkuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0Ci0Jb2YgdGhlIHN0YW5kYXJkIGxpYmMgYW5kIHNvIHByZXZlbnQgbGliaW50bC5hIGZyb20gYmVpbmcgdXNlZAotCXN0YW5kYWxvbmUuCi0KLQkqIGJpbmR0ZXh0ZG9tLmM6Ci0JRG9uJ3QgdXNlIHhtYWxsb2MsIHhzdHJkdXAsIGFuZCBzdHBjcHkuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0Ci0Jb2YgdGhlIHN0YW5kYXJkIGxpYmMgYW5kIHNvIHByZXZlbnQgbGliaW50bC5hIGZyb20gYmVpbmcgdXNlZAotCXN0YW5kYWxvbmUuCi0JUmVuYW1lIHRvIGJpbmR0ZXh0ZG9tYWluX18gaWYgbm90IHVzZWQgaW4gR05VIEMgTGlicmFyeS4KLQotCSogZGdldHRleHQuYzoKLQlSZW5hbWUgZnVuY3Rpb24gdG8gZGdldHRleHRfXyBpZiBub3QgdXNlZCBpbiBHTlUgQyBMaWJyYXJ5LgotCi0JKiBnZXR0ZXh0LmM6Ci0JRG9uJ3QgdXNlIHhtYWxsb2MsIHhzdHJkdXAsIGFuZCBzdHBjcHkuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0Ci0Jb2YgdGhlIHN0YW5kYXJkIGxpYmMgYW5kIHNvIHByZXZlbnQgbGliaW50bC5hIGZyb20gYmVpbmcgdXNlZAotCXN0YW5kYWxvbmUuCi0JRnVuY3Rpb25zIG5vdyBjYWxsZWQgZ2V0dGV4dF9fIGlmIG5vdCB1c2VkIGluIEdOVSBDIExpYnJhcnkuCi0KLQkqIGRjZ2V0dGV4dC5jLCBsb2NhbGVhbGlhcy5jLCB0ZXh0ZG9tYWluLmMsIGZpbmRkb21haW4uYzoKLQlEb24ndCB1c2UgeG1hbGxvYywgeHN0cmR1cCwgYW5kIHN0cGNweS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQKLQlvZiB0aGUgc3RhbmRhcmQgbGliYyBhbmQgc28gcHJldmVudCBsaWJpbnRsLmEgZnJvbSBiZWluZyB1c2VkCi0Jc3RhbmRhbG9uZS4KLQotU3VuIFNlcCAxNyAyMzoxNDo0OSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmM6IENvcnJlY3Qgc29tZSBidWdzIGluIGhhbmRsaW5nIG9mIENFTiBzdGFuZGFyZAotIAlsb2NhbGUgZGVmaW5pdGlvbnMuCi0KLVRodSBTZXAgIDcgMDE6NDk6MjggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jOiBJbXBsZW1lbnQgQ0VOIHN5bnRheC4KLQotCSogZ2V0dGV4dFAuaCAobG9hZGVkX2RvbWFpbik6IEV4dGVuZCBudW1iZXIgb2Ygc3VjY2Vzc29ycyB0byAzMS4KLQotU2F0IEF1ZyAxOSAxOToyNToyOSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxpYXNwYXRoKTogUmVtb3ZlIHBhdGggdG8gWDExIGxvY2FsZSBkaXIuCi0KLQkqIE1ha2VmaWxlLmluOiBNYWtlIGluc3RhbGwtc3JjIGRlcGVuZCBvbiBpbnN0YWxsLiAgVGhpcyBoZWxwcwotIAlnZXR0ZXh0IHRvIGluc3RhbGwgdGhlIHNvdXJjZXMgYW5kIG90aGVyIHBhY2thZ2VzIGNhbiB1c2UgdGhlCi0gCWluc3RhbGwgZ29hbC4KLQotU2F0IEF1ZyAxOSAxNToxOTozMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAodW5pbnN0YWxsKTogUmVtb3ZlIHN0dWZmIGluc3RhbGxlZCBieSBpbnN0YWxsLXNyYy4KLQotVHVlIEF1ZyAxNSAxMzoxMzo1MyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBWRVJTSU9OLmluOiBJbml0aWFsIHJldmlzaW9uLgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKToKLQlBZGQgVkVSU0lPTiBmaWxlLiAgVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGZvciBnZXR0ZXh0LCBidXQKLQlmb3Igb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhpcyBsaWJyYXJ5LgotCi1UdWUgQXVnIDE1IDA2OjE2OjQ0IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGdldHRleHRQLmggKF9ubF9maW5kX2RvbWFpbik6Ci0JTmV3IHByb3RvdHlwZSBhZnRlciBjaGFuZ2luZyBzZWFyY2ggc3RyYXRlZ3kuCi0KLQkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKToKLQlXZSBub3cgdHJ5IG9ubHkgdG8gZmluZCBhIHNwZWNpZmllZCBjYXRhbG9nLiAgRmFsbCBiYWNrIHRvIG90aGVyCi0JY2F0YWxvZ3MgbGlzdGVkIGluIHRoZSBsb2NhbGUgbGlzdCBpcyBub3cgZG9uZSBpbiBfX2RjZ2V0dGV4dC4KLQotCSogZGNnZXR0ZXh0LmMgKF9fZGNnZXR0ZXh0KToKLQlOb3cgd2UgcHJvdmlkZSBtZXNzYWdlIGZhbGwgYmFjayBldmVuIHRvIGRpZmZlcmVudCBsYW5ndWFnZXMuCi0JSS5lLiBpZiBhIG1lc3NhZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiBvbmUgbGFuZ3VhZ2UgYWxsIHRoZSBvdGhlcgotIAlpbiB0aGUgbG9jYWxlIGxpc3QgYSB0cmllZC4gIEZvcm1lcmx5IGZhbGwgYmFjayB3YXMgb25seSBwb3NzaWJsZQotIAl3aXRoaW4gb25lIGxhbmd1YWdlLiAgSW1wbGVtZW50ZWQgYnkgbW92aW5nIG9uZSBsb29wIGZyb20KLSAJX25sX2ZpbmRfZG9tYWluIHRvIGhlcmUuCi0KLU1vbiBBdWcgMTQgMjM6NDU6NTAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGdldHRleHRzcmNkaXIpOgotCURpcmVjdG9yeSB3aGVyZSBzb3VyY2Ugb2YgR05VIGdldHRleHQgbGlicmFyeSBhcmUgbWFkZQotCWF2YWlsYWJsZS4KLQkoSU5TVEFMTCwgSU5TVEFMTF9EQVRBKTogUHJvZ3JhbXMgdXNlZCBmb3IgaW5zdGFsbGluZyBzb3VyY2VzLgotCShnZXR0ZXh0LXNyYyk6IE5ldy4gIFJ1bGUgdG8gaW5zdGFsbCBHTlUgZ2V0dGV4dCBzb3VyY2VzIGZvciB1c2UgaW4KLQlnZXR0ZXh0aXplIHNoZWxsIHNjcmlwdC4KLQotU3VuIEF1ZyAxMyAxNDo0MDo0OCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2FkbXNnY2F0LmMgKF9ubF9sb2FkX2RvbWFpbik6Ci0JVXNlIG1tYXAgZm9yIGxvYWRpbmcgb25seSB3aGVuIG11bm1hcCBmdW5jdGlvbiBpcwotCWFsc28gYXZhaWxhYmxlLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERlcGVuZCBvbiBgYWxsJyBnb2FsLgotCi1XZWQgQXVnICA5IDExOjA0OjMzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvY2FsZWFsaWFzLmMgKHJlYWRfYWxpYXNfZmlsZSk6Ci0JRG8gbm90IG92ZXJ3cml0ZSAnXG4nIHdoZW4gdGVybWluYXRpbmcgYWxpYXMgdmFsdWUgc3RyaW5nLgotCi0JKiBsb2NhbGVhbGlhcy5jIChyZWFkX2FsaWFzX2ZpbGUpOgotCUhhbmRsZSBsb25nIGxpbmVzLiAgSWdub3JlIHRoZSByZXN0IG5vdCBmaXR0aW5nIGluCi0JdGhlIGJ1ZmZlciBhZnRlciB0aGUgaW5pdGlhbCBgZmdldHMnIGNhbGwuCi0KLVdlZCBBdWcgIDkgMDA6NTQ6MjkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZ2V0dGV4dFAuaCAoX25sX2xvYWRfZG9tYWluKToKLQlBZGQgcHJvdG90eXBlLCByZXBsYWNpbmcgcHJvdG90eXBlIGZvciBfbmxfbG9hZF9tc2dfY2F0LgotCi0JKiBmaW5kZG9tYWluLmMgKF9ubF9maW5kX2RvbWFpbik6Ci0JUmVtb3ZlIHVubmVlZGVkIHZhcmlhYmxlIGZpbGVuYW1lIGFuZCBmaWxlbmFtZV9sZW4uCi0JKGV4cGFuZF9hbGlhcyk6IFJlbW92ZSBwcm90b3R5cGUgYmVjYXVzZSBmdW5jdGlvbnMgZG9lcyBub3QKLSAJZXhpc3QgYW55bW9yZS4KLQotCSogbG9jYWxlYWxpYXMuYyAocmVhZF9hbGlhc19maWxlKToKLQlDaGFuZ2UgdHlwZSBvZiBmbmFtZV9sZW4gcGFyYW1ldGVyIHRvIGludC4KLQkoeG1hbGxvYyk6IEFkZCBwcm90b3R5cGUuCi0KLQkqIGxvYWRtc2djYXQuYzogQmV0dGVyIHByb3RvdHlwZXMgZm9yIHhtYWxsb2MuCi0KLVR1ZSBBdWcgIDggMjI6MzA6MzkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOgotCUFsbG93IGFsaWFzIG5hbWUgdG8gYmUgY29uc3RydWN0ZWQgZnJvbSB0aGUgZm91ciBjb21wb25lbnRzLgotCi0JKiBNYWtlZmlsZS5pbiAoYWxpYXNwYXRoKTogTmV3IHZhcmlhYmxlLiAgU2V0IHRvIHByZWxpbWluYXJ5IHZhbHVlLgotCShTT1VSQ0VTKTogQWRkIGxvY2FsZWFsaWFzLmMuCi0JKE9CSkVDVFMpOiBBZGQgbG9jYWxlYWxpYXMuby4KLQotCSogZ2V0dGV4dFAuaDogQWRkIHByb3RvdHlwZSBmb3IgX25sX2V4cGFuZF9hbGlhcy4KLQotCSogZmluZGRvbWFpbi5jOiBBbGlhc2luZyBoYW5kbGVkIGluIGludGwvbG9jYWxlYWxpYXMuYy4KLQotCSogbG9jYWxlYWxpYXMuYzogQWxpYXNpbmcgZm9yIGxvY2FsZSBuYW1lcy4KLQotCSogYmluZHRleHRkb20uYzogQmV0dGVyIHByb3RvdHlwZXMgZm9yIHhtYWxsb2MgYW5kIHhzdHJkdXAuCi0KLU1vbiBBdWcgIDcgMjM6NDc6NDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6IGdldHRleHQucGVybCBpcyBub3cgZm91bmQgaW4gbWlzYy8uCi0KLQkqIGNhdC1jb21wYXQuYyAoYmluZHRleHRkb21haW4pOgotCUNvcnJlY3QgaW1wbGVtZW50YXRpb24uICBkaXJuYW1lIHBhcmFtZXRlciB3YXMgbm90IHVzZWQuCi0JUmVwb3J0ZWQgYnkgTWFyY3VzIERhbmllbHMuCi0KLQkqIGdldHRleHRQLmggKGxvYWRlZF9kb21haW4pOgotCU5ldyBmaWVsZHMgYHN1Y2Nlc3NvcicgYW5kIGBkZWNpZGVkJyBmb3Igb28sIGxhenkKLQltZXNzYWdlIGhhbmRsaW5nIGltcGxlbWVudGF0aW9uLgotCi0JKiBkY2dldHRleHQuYzoKLQlBZG9wdCBmb3Igb28sIGxhenkgbWVzc2FnZSBoYW5kbGlpbmcuCi0gIAlOb3cgd2UgY2FuIGluaGVyaXQgdHJhbnNsYXRpb25zIGZyb20gbGVzcyBzcGVjaWZpYyBsb2NhbGVzLgotCShmaW5kX21zZyk6IE5ldyBmdW5jdGlvbi4KLQotCSogbG9hZG1zZ2NhdC5jLCBmaW5kZG9tYWluLmM6Ci0JQ29tcGxldGUgcmV3cml0ZS4gIEltcGxlbWVudCBvbywgbGF6eSBtZXNzYWdlIGhhbmRsaW5nIDotKS4KLSAgCVdlIG5vdyBoYXZlIGFuIGFkZGl0aW9uYWwgZW52aXJvbm1lbnQgdmFyaWFibGUgYExBTkdVQUdFJyB3aXRoCi0gCWEgaGlnaGVyIHByaW9yaXR5IHRoYW4gTENfQUxMIGZvciB0aGUgTENfTUVTU0FHRSBsb2NhbGUuCi0gIAlIZXJlIHdlIGNhbiBzZXQgYSBjb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBzcGVjaWZpY2F0aW9ucyBlYWNoCi0gCW9mIHRoZSBmb3JtIGBsYW5ndWFnZVtfdGVycml0b3J5Wy5jb2Rlc2V0XV1bQG1vZGlmaWVyXScuCi0KLVNhdCBBdWcgIDUgMDk6NTU6NDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jICh1bmlzdGQuaCk6Ci0JSW5jbHVkZSB0byBnZXQgX1BDX1BBVEhfTUFYIGRlZmluZWQgb24gc3lzdGVtIGhhdmluZyBpdC4KLQotRnJpIEF1ZyAgNCAyMjo0MjowMCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmMgKHN0cGNweSk6IEluY2x1ZGUgcHJvdG90eXBlLgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdCk6IFJlbW92ZSBgY29weWluZyBpbnN0ZWFkJyBtZXNzYWdlLgotCi1XZWQgQXVnICAyIDE4OjUyOjAzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChJRCwgVEFHUyk6IERvIG5vdCB1c2UgJF4uCi0KLVR1ZSBBdWcgIDEgMjA6MDc6MTEgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKFRBR1MsIElEKTogVXNlICReIGFzIGNvbW1hbmQgYXJndW1lbnQuCi0JKFRBR1MpOiBHaXZlIGV0YWdzIC1vIG9wdGlvbiB0IHdyaXRlIHRvIGN1cnJlbnQgZGlyZWN0b3J5LAotIAlub3QgJChzcmNkaXIpLgotCShJRCk6IFVzZSAkKHNyY2RpcikgaW5zdGVhZCBvcyAkKHRvcF9zcmNkaXIpL3NyYy4KLQkoZGlzdGNsZWFuKTogUmVtb3ZlIElELgotCi1TdW4gSnVsIDMwIDExOjUxOjQ2IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChnbnVsb2NhbGVkaXIpOgotCU5ldyB2YXJpYWJsZSwgYWx3YXlzIHVzaW5nIHNoYXJlLyBmb3IgZGF0YSBkaXJlY3RvcnkuCi0JKERFRlMpOiBBZGQgR05VTE9DQUxFRElSLCB1c2VkIGluIGZpbmRkb21haW4uYy4KLQotCSogZmluZGRvbWFpbi5jIChfbmxfZGVmYXVsdF9kaXJuYW1lKToKLQlTZXQgdG8gR05VTE9DQUxFRElSLCBiZWNhdXNlIGl0IGFsd2F5cyBoYXMgdG8gcG9pbnQKLQl0byB0aGUgZGlyZWN0b3J5IHdoZXJlIEdOVSBnZXR0ZXh0IExpYnJhcnkgd3JpdGVzIGl0IHRvLgotCi0JKiBpbnRsLWNvbXBhdC5jICh0ZXh0ZG9tYWluLCBiaW5kdGV4dGRvbWFpbik6Ci0JVW5kZWZpbmUgbWFjcm9zIGJlZm9yZSBmdW5jdGlvbiBkZWZpbml0aW9uLgotCi1TYXQgSnVsIDIyIDAxOjEwOjAyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxpYmdldHRleHQuaCAoX0xJQklOVExfSCk6Ci0JUHJvdGVjdCBkZWZpbml0aW9uIGluIGNhc2Ugd2hlcmUgdGhpcyBmaWxlIGlzIGluY2x1ZGVkIGFzCi0JbGliZ2V0dGV4dC5oIG9uIFNvbGFyaXMgbWFjaGluZXMuICBBZGQgY29tbWVudCBhYm91dCB0aGlzLgotCi1XZWQgSnVsIDE5IDAyOjM2OjQyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGludGwtY29tcGF0LmMgKHRleHRkb21haW4pOiBDb3JyZWN0IHR5cG8uCi0KLVdlZCBKdWwgMTkgMDE6NTE6MzUgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZGNnZXR0ZXh0LmMgKGRjZ2V0dGV4dCk6IEZ1bmN0aW9uIG5vdyBjYWxsZWQgX19kY2dldHRleHQuCi0KLQkqIGRnZXR0ZXh0LmMgKGRnZXR0ZXh0KTogTm93IGNhbGxlZCBfX2RnZXR0ZXh0IGFuZCBjYWxscwotIAlfX2RjZ2V0dGV4dC4KLQotCSogZ2V0dGV4dC5jIChnZXR0ZXh0KToKLQlGdW5jdGlvbiBub3cgY2FsbGVkIF9fZ2V0dGV4dCBhbmQgY2FsbHMgX19kZ2V0dGV4dC4KLQotCSogdGV4dGRvbWFpbi5jICh0ZXh0ZG9tYWluKTogRnVuY3Rpb24gbm93IGNhbGxlZCBfX3RleHRkb21haW4uCi0KLQkqIGJpbmR0ZXh0ZG9tLmMgKGJpbmR0ZXh0ZG9tYWluKTogRnVuY3Rpb24gbm93IGNhbGxlZAotIAlfX2JpbmR0ZXh0ZG9tYWluLgotCi0JKiBpbnRsLWNvbXBhdC5jOiBJbml0aWFsIHJldmlzaW9uLgotCi0JKiBNYWtlZmlsZS5pbiAoU09VUkNFUyk6IEFkZCBpbnRsLWNvbXBhdC5jLgotCShPQkpFQ1RTKTogV2UgYWx3YXlzIGNvbXBpbGUgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgZnVuY3Rpb25zLgotICAJT0JKRUNUUyBjb250YWlucyBhbGwgb2JqZWN0cyBidXQgY2F0LWNvbXBhdC5vLCAuLi9wby9jYXQtaWYtdGJsLm8sCi0gCWFuZCBpbnRsLWNvbXBhdC5vLgotICAJKEdFVFRPQkpTKTogQ29udGFpbnMgbm93IG9ubHkgaW50bC1jb21wYXQuby4KLQotCSogbGliZ2V0dGV4dC5oOgotCVJlLWluY2x1ZGUgcHJvdGVjdGlvbiBtYXRjaGVzIGR1YWxpc3RpYyBjaGFyYWN0ZXIgb2YgbGliZ2V0dGV4dC5oLgotCUZvciBhbGwgZnVuY3Rpb25zIGluIEdOVSBnZXR0ZXh0IGxpYnJhcnkgZGVmaW5lIF9fIGNvdW50ZXIgcGFydC4KLQotCSogZmluZGRvbWFpbi5jIChzdHJjaHIpOiBEZWZpbmUgYXMgaW5kZXggaWYgbm90IGZvdW5kIGluIEMgbGlicmFyeS4KLQkoX25sX2ZpbmRfZG9tYWluKTogRm9yIHJlbGF0aXZlIHBhdGhzIHBhc3RlIC8gaW4gYmV0d2Vlbi4KLQotVHVlIEp1bCAxOCAxNjozNzo0NSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2FkbXNnY2F0LmMsIGZpbmRkb21haW4uYzogQWRkIGluY2x1c2lvbiBvZiBzeXMvdHlwZXMuaC4KLQotCSogeG9wZW4tbXNnLnNlZDogRml4IGJ1ZyB3aXRoIGBtc2dzdHIgIiInIGxpbmVzLgotCUEgbGl0dGxlIGJpdCBiZXR0ZXIgY29tbWVudHMuCi0KLVR1ZSBKdWwgMTggMDE6MTg6MjcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW46Ci0JcG8tbW9kZS5lbCwgbWFrZWxpbmtzLCBjb21iaW5lLXNoIGFyZSBub3cgZm91bmQgaW4gLi4vbWlzYy4KLQotCSogcG8tbW9kZS5lbCwgbWFrZWxpbmtzLCBjb21iaW5lLXNoLCBlbGlzcC1jb21wOgotCU1vdmVkIHRvIC4uL21pc2MvLgotCi0JKiBsaWJnZXR0ZXh0LmgsIGdldHRleHRQLmgsIGdldHRleHQuaDogVW5pZm9ybSB0ZXN0IGZvciBfX1NURENfXy4KLQotU3VuIEp1bCAxNiAyMjozMzowMiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCwgSU5TVEFMTF9EQVRBKTogTmV3IHZhcmlhYmxlcy4KLQkoaW5zdGFsbC1kYXRhLCB1bmluc3RhbGwpOiBJbnN0YWxsL3VuaW5zdGFsbCAuZWxjIGZpbGUuCi0KLQkqIHBvLW1vZGUuZWwgKEluc3RhbGxhdGlvbiBjb21tZW50KToKLQlBZGQgLnBveCBhcyBwb3NzaWJsZSBleHRlbnNpb24gb2YgLnBvIGZpbGVzLgotCi1TdW4gSnVsIDE2IDEzOjIzOjI3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGVsaXNwLWNvbXA6IENvbXBsZXRlIG5ldyB2ZXJzaW9uIGJ5IEZyYW5jLG9pczogVGhpcyBkb2VzIG5vdAotIAlmYWlsIHdoZW4gbm90IGNvbXBpbGluZyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4KLQotU3VuIEp1bCAxNiAwMDoxMjoxNyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoLi4vcG8vY2F0LWlkLXRibC5vKToKLQlVc2UgJChNQUtFKSBpbnN0ZWFkIG9mIG1ha2UgZm9yIHJlY3Vyc2l2ZSBtYWtlLgotCi0JKiBNYWtlZmlsZS5pbiAoLmVsLmVsYyk6IFVzZSAkKFNIRUxMKSBpbnN0ZWFkIG9mIC9iaW4vc2guCi0JKGluc3RhbGwtZXhlYyk6IEFkZCBtaXNzaW5nIGR1bW15IGdvYWwuCi0JKGluc3RhbGwtZGF0YSwgdW5pbnN0YWxsKTogQCBpbiBtdWx0aS1saW5lIHNoZWxsIGNvbW1hbmQgYXQKLSAJYmVnaW5uaW5nLCBub3QgaW4gZnJvbnQgb2YgZWNoby4gIFJlcG9ydGVkIGJ5IEVyaWMgQmFja3VzLgotCi1TYXQgSnVsIDE1IDAwOjIxOjI4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOgotCVJlbmFtZSBsaWJnZXR0ZXh0LnBlcmwgdG8gZ2V0dGV4dC5wZXJsIHRvIGZpdCBpbiAxNCBjaGFycwotCWZpbGUgc3lzdGVtcy4KLQotCSogZ2V0dGV4dC5wZXJsOgotIAlSZW5hbWUgdG8gZ2V0dGV4dC5wZXJsIHRvIGZpdCBpbiAxNCBjaGFycyBmaWxlIHN5c3RlbXMuCi0KLVRodSBKdWwgMTMgMjM6MTc6MjAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogY2F0LWNvbXBhdC5jOiBJZiAhU1REQ19IRUFERVJTIHRyeSB0byBpbmNsdWRlIG1hbGxvYy5oLgotCi1UaHUgSnVsIDEzIDIwOjU1OjAyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIHBvMnRibC5zZWQuaW46IFByZXR0eSBwcmludGluZy4KLQotCSogbGludXgtbXNnLnNlZCwgeG9wZW4tbXNnLnNlZDoKLQlDb3JyZWN0IGJ1Z3Mgd2l0aCBoYW5kbGluZyBzdWJzdGl0dXRlIGZsYWdzIGluIGJyYW5jaGVzLgotCi0JKiBoYXNoLXN0cmluZy5oIChoYXNoX3N0cmluZyk6Ci0JT2xkIEsmUiBjb21waWxlcnMgZG9uJ3QgdW5kZXIgc3RhbmQgYHVuc2lnbmVkIGNoYXInLgotCi0JKiBnZXR0ZXh0LmggKG5sc191aW50MzIpOgotCVNvbWUgb2xkIEsmUiBjb21waWxlcnMgKGVnIEhQKSBkb24ndCB1bmRlcnN0YW5kIGB1bnNpZ25lZCBpbnQnLgotCi0JKiBjYXQtY29tcGF0LmMgKG1zZ190b19jYXRfaWQpOiBEZS1BTlNJLWZ5IHByb3RvdHlwZXMuCi0KLVRodSBKdWwgMTMgMDE6MzQ6MzMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKEVMQ0ZJTEVTKTogTmV3IHZhcmlhYmxlLgotCShESVNURklMRVMpOiBBZGQgZWxpc3AtY29tcC4KLQlBZGQgaW1wbGljaXQgcnVsZSBmb3IgLmVsIC0+IC5lbGMgY29tcGlsYXRpb24uCi0JKGluc3RhbGwtZGF0YSk6IGluc3RhbGwgJEVMQ0ZJTEVTCi0JKGNsZWFuKTogcmVuYW1lZCBwby10by10YmwgYW5kIHBvLXRvLW1zZyB0byBwbzJ0YmwgYW5kIHBvMm1zZyByZXNwLgotCi0JKiBlbGlzcC1jb21wOiBJbml0aWFsIHJldmlzaW9uCi0KLVdlZCBKdWwgMTIgMTY6MTQ6NTIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW46Ci0JY2F0LWlkLXRibC5jIGlzIG5vdyBmb3VuZCBpbiBwby8uICBUaGlzIGVuYWJsZXMgdXMgdG8gdXNlIGFuIGlkZW50aWNhbAotCWludGwvIGRpcmVjdG9yeSBpbiBhbGwgcGFja2FnZXMuCi0KLQkqIGRjZ2V0dGV4dC5jIChkY2dldHRleHQpOiBoYXNoaW5nIGRvZXMgbm90IHdvcmsgZm9yIHRhYmxlIHNpemUgPD0gMi4KLQotCSogdGV4dGRvbWFpbi5jOiBmaXggdHlwbyAoI2lmIGRlZiAtPiAjaWYgZGVmaW5lZCkKLQotVHVlIEp1bCAxMSAxODo0NDo0MyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoc3RhbXAtY2F0LWlkKTogdXNlIHRvcF9zcmNkaXIgdG8gYWRkcmVzcyBzb3VyY2UgZmlsZXMKLQkoRElTVEZJTEVTLGRpc3RjbGVhbik6IG1vdmUgdHVwZGF0ZS5wZXJsIHRvIHNyYy8KLQotCSogcG8tdG8tdGJsLnNlZC5pbjoKLQlhZGQgYWRkaXRpb25hbCBqdW1wIHRvIGNsZWFyIGNoYW5nZSBmbGFnIHRvIHJlY29nbml6ZSBtdWx0aWxpbmUgc3RyaW5ncwotCi1UdWUgSnVsIDExIDAxOjMyOjUwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIHRleHRkb21haW4uYzogUHJvdGVjdCBpbmNsdXNpb24gb2Ygc3RkbGliLmggYW5kIHN0cmluZy5oLgotCi0JKiBsb2FkbXNnY2F0LmM6IFByb3RlY3QgaW5jbHVzaW9uIG9mIHN0ZGxpYi5oLgotCi0JKiBsaWJnZXR0ZXh0Lmg6IFByb3RlY3QgaW5jbHVzaW9uIG9mIGxvY2FsZS5oLgotCUFsbG93IHVzZSBpbiBDKysgcHJvZ3JhbXMuCi0JRGVmaW5lIE5VTEwgaXMgbm90IGhhcHBlbmVkIGFscmVhZHkuCi0KLQkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOiBzaGlwIHBvLXRvLXRibC5zZWQuaW4gaW5zdGVhZCBvZgotCXBvLXRvLXRibC5zZWQuCi0JKGRpc3RjbGVhbik6IHJlbW92ZSBwby10by10Ymwuc2VkIGFuZCB0dXBkYXRlLnBlcmwuCi0KLQkqIHR1cGRhdGUucGVybC5pbjogU3Vic3RpdHV0ZSBQZXJsIHBhdGggZXZlbiBpbiBleGVjIGxpbmUuCi0JRG9uJ3QgaW5jbHVkZSBlbnRyaWVzIHdpdGhvdXQgdHJhbnNsYXRpb24gZnJvbSBvbGQgLnBvIGZpbGUuCi0KLVR1ZSBKdWwgIDQgMDA6NDE6NTEgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogdHVwZGF0ZS5wZXJsLmluOiB1c2UgIlVwZGF0ZWQ6ICIgaW4gbXNnaWQgIiIuCi0KLQkqIGNhdC1jb21wYXQuYzogRml4IHR5cG8gKExPQ0FMRElSIC0+IExPQ0FMRURJUikuCi0gCURlZmluZSBnZXRlbnYgaWYgIV9fU1REQ19fLgotCi0JKiBiaW5kdGV4dGRvbS5jOiBQcm90ZWN0IHN0ZGxpYi5oIGFuZCBzdHJpbmcuaCBpbmNsdXNpb24uCi0gCURlZmluZSBmcmVlIGlmICFfX1NURENfXy4KLQotCSogZmluZGRvbWFpbi5jOiBDaGFuZ2UgREVGX01TR19ET01fRElSIHRvIExPQ0FMRURJUi4KLSAJRGVmaW5lIGZyZWUgaWYgIV9fU1REQ19fLgotCi0JKiBjYXQtY29tcGF0LmM6IENoYW5nZSBERUZfTVNHX0RPTV9ESVIgdG8gTE9DQUxFRElSLgotCi1Nb24gSnVsICAzIDIzOjU2OjMwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluOiBVc2UgTE9DQUxFRElSIGluc3RlYWQgb2YgREVGX01TR19ET01fRElSLgotCVJlbW92ZSB1bm5lZWRlZCAkKHNyY2RpcikgZnJvbSBNYWtlZmlsZS5pbiBkZXBlbmRlbmN5LgotCi0JKiBtYWtlbGlua3M6IEFkZCBjb3B5cmlnaHQgYW5kIHNob3J0IGRlc2NyaXB0aW9uLgotCi0JKiBwby1tb2RlLmVsOiBMYXN0IHZlcnNpb24gZm9yIDAuNy4KLQotCSogdHVwZGF0ZS5wZXJsLmluOiBGaXggZGllIG1lc3NhZ2UuCi0KLQkqIGRjZ2V0dGV4dC5jOiBQcm90ZWN0IGluY2x1ZGUgb2Ygc3RyaW5nLmguCi0KLQkqIGdldHRleHQuYzogUHJvdGVjdCBpbmNsdWRlIG9mIHN0ZGxpYi5oIGFuZCBmdXJ0aGVyIHRyaWVzIHRvIGdldCBOVUxMLgotCi0JKiBmaW5kZG9tYWluLmM6IFNvbWUgY29ycmVjdGlvbnMgaW4gaW5jbHVkZXMuCi0KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFUyk6IFBydW5lIGxpc3QgY29ycmVjdCBwYXRoIHRvIE1ha2VmaWxlLmluLgotCi0JKiBwby10by10Ymwuc2VkOiBBZG9wdCBmb3IgbmV3IC5wbyBmaWxlIGZvcm1hdC4KLQotCSogbGludXgtbXNnLnNlZCwgeG9wZW4tbXNnLnNlZDogQWRvcHQgZm9yIG5ldyAucG8gZmlsZSBmb3JtYXQuCi0KLVN1biBKdWwgIDIgMjM6NTU6MDMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogdHVwZGF0ZS5wZXJsLmluOiBDb21wbGV0ZSByZXdyaXRlIGZvciBuZXcgLnBvIGZpbGUgZm9ybWF0LgotCi1TdW4gSnVsICAyIDAyOjA2OjUwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIEZpcnN0IG9mZmljaWFsIHJlbGVhc2UuICBUaGlzIGRpcmVjdG9yeSBjb250YWlucyBhbGwgdGhlIGNvZGUKLQluZWVkZWQgdG8gaW50ZXJuYXRpb25hbGl6ZSBvd24gcGFja2FnZXMuICBJdCBwcm92aWRlcyBmdW5jdGlvbnMKLQl3aGljaCBhbGxvdyB0byB1c2UgdGhlIFgvT3BlbiBjYXRnZXRzIGZ1bmN0aW9uIHdpdGggYW4gaW50ZXJmYWNlCi0JbGlrZSB0aGUgVW5pZm9ydW0gZ2V0dGV4dCBmdW5jdGlvbi4gIEZvciBzeXN0ZW0gd2hpY2ggZG9lcyBub3QKLQloYXZlIG5laXRoZXIgb2YgdGhvc2UgYSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZC4KZGlmZiAtLWdpdCBhL2ludGwvQ2hhbmdlTG9nLkN5Z251cyBiL2ludGwvQ2hhbmdlTG9nLkN5Z251cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQzMmRhNi4uMDAwMDAwMAotLS0gYS9pbnRsL0NoYW5nZUxvZy5DeWdudXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1UdWUgTWF5IDI2IDE4OjI5OjA5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgotCi1TdW4gTWF5IDEwIDIyOjM1OjU0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIHBvL01ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBOZXcgdGFyZ2V0LgotCi1TdW4gQXByIDE5IDE5OjIwOjAwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWx0LgotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0xJTktfRklMRVMgc28gdGhhdCA8bGliaW50bC5oPiB3aWxsCi0JYWx3YXlzIGV4aXN0LgotCi1GcmkgTWFyIDI3IDE2OjM3OjI1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWx0IHdpdGggbmV3IGN5Z2V0dGV4dC5tNC4KLQotV2VkIE1hciAyNSAxNTowMDoxNCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgY29uZmlnLmggZnJvbSBjb25maWcuaW4uCi0JKiBjb25maWcuaC5pbjogUmVtb3ZlZC4KLQkqIGNvbmZpZy5pbjogTmV3IGZpbGUuCi0KLQkqIGNvbmZpZy5oLmluOiBOZXcgZmlsZS4KLQotCSogY29uZmlndXJlLmluLCBjb25maWd1cmUsIGFjY29uZmlnLmgsIGFjbG9jYWwubTQ6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluIChPQkpFQ1RTKTogRGVwZW5kIG9uIGNvbmZpZy5oLCBub3QgLi4vY29uZmlnLmguCi0JKE1ha2VmaWxlKTogUmVidWlsZCBNYWtlZmlsZSBoZXJlLCBub3QgaW4gYC4uJy4KLQpkaWZmIC0tZ2l0IGEvaW50bC9NYWtlZmlsZS5pbiBiL2ludGwvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjQ3ZGUuLjAwMDAwMDAKLS0tIGEvaW50bC9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBkaXJlY3Rvcnkgd2l0aCBtZXNzYWdlIGNhdGFsb2cgaGFuZGxpbmcgaW4gR05VIE5MUyBVdGlsaXRpZXMuCi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotUEFDS0FHRSA9IEBQQUNLQUdFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotCi1TSEVMTCA9IC9iaW4vc2gKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLXRvcF9idWlsZGRpciA9IC4uCi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotbGliZGlyID0gJChleGVjX3ByZWZpeCkvbGliCi1pbmNsdWRlZGlyID0gJChwcmVmaXgpL2luY2x1ZGUKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSBAZGF0YWRpckAvZ2V0dGV4dC9pbnRsCi1hbGlhc3BhdGggPSAkKGxvY2FsZWRpcik6Lgotc3ViZGlyID0gaW50bAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotCi1sID0gQGxACi0KLUFSID0gYXIKLUNDID0gQENDQAotTElCVE9PTCA9IEBMSUJUT09MQAotUkFOTElCID0gQFJBTkxJQkAKLQotREVGUyA9IC1ETE9DQUxFRElSPVwiJChsb2NhbGVkaXIpXCIgLURHTlVMT0NBTEVESVI9XCIkKGdudWxvY2FsZWRpcilcIiBcCi0tRExPQ0FMRV9BTElBU19QQVRIPVwiJChhbGlhc3BhdGgpXCIgQERFRlNACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUNGTEFHUyA9IEBDRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi0KLUNPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCi0KLUhFQURFUlMgPSAkKENPTUhEUlMpIGxpYmdldHRleHQuaCBsb2FkaW5mby5oCi1DT01IRFJTID0gZ2V0dGV4dC5oIGdldHRleHRQLmggaGFzaC1zdHJpbmcuaAotU09VUkNFUyA9ICQoQ09NU1JDUykgaW50bC1jb21wYXQuYyBjYXQtY29tcGF0LmMKLUNPTVNSQ1MgPSBiaW5kdGV4dGRvbS5jIGRjZ2V0dGV4dC5jIGRnZXR0ZXh0LmMgZ2V0dGV4dC5jIFwKLWZpbmRkb21haW4uYyBsb2FkbXNnY2F0LmMgbG9jYWxlYWxpYXMuYyB0ZXh0ZG9tYWluLmMgbDEwbmZsaXN0LmMgXAotZXhwbG9kZW5hbWUuYwotT0JKRUNUUyA9IEBJTlRMT0JKU0AgYmluZHRleHRkb20uJGxvIGRjZ2V0dGV4dC4kbG8gZGdldHRleHQuJGxvIGdldHRleHQuJGxvIFwKLWZpbmRkb21haW4uJGxvIGxvYWRtc2djYXQuJGxvIGxvY2FsZWFsaWFzLiRsbyB0ZXh0ZG9tYWluLiRsbyBsMTBuZmxpc3QuJGxvIFwKLWV4cGxvZGVuYW1lLiRsbwotQ0FUT0JKUyA9IGNhdC1jb21wYXQuJGxvIC4uL3BvL2NhdC1pZC10YmwuJGxvCi1HRVRUT0JKUyA9IGludGwtY29tcGF0LiRsbwotRElTVEZJTEVTLmNvbW1vbiA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbiBsaW51eC1tc2cuc2VkIHBvMnRibC5zZWQuaW4gXAoteG9wZW4tbXNnLnNlZCAkKEhFQURFUlMpICQoU09VUkNFUykKLURJU1RGSUxFUy5ub3JtYWwgPSBWRVJTSU9OCi1ESVNURklMRVMuZ2V0dGV4dCA9IGxpYmludGwuZ2xpYmMgaW50bGguaW5zdC5pbgotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5sbwotLmMubzoKLQkkKENPTVBJTEUpICQ8Ci0uYy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJDwKLQotSU5DTFVERVMgPSAtSS4gLUkkKHNyY2RpcikKLQotYWxsOiBhbGwtQFVTRV9JTkNMVURFRF9MSUJJTlRMQAotCi1hbGwteWVzOiBsaWJpbnRsLiRsYSBpbnRsaC5pbnN0Ci1hbGwtbm86Ci1pbnN0YWxsLWluZm86Ci0KLWxpYmludGwuYTogJChPQkpFQ1RTKQotCXJtIC1mICRACi0JJChBUikgY3J1ICRAICQoT0JKRUNUUykKLQkkKFJBTkxJQikgJEAKLQotbGliaW50bC5sYTogJChPQkpFQ1RTKQotCSQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQykgJChMREZMQUdTKSAtbyAkQCAkKE9CSkVDVFMpIFwKLQkJICAgLXZlcnNpb24taW5mbyAxOjAgLXJwYXRoICQobGliZGlyKQotCi0uLi9wby9jYXQtaWQtdGJsLiRsbzogLi4vcG8vY2F0LWlkLXRibC5jICQodG9wX3NyY2RpcikvcG8vJChQQUNLQUdFKS5wb3QKLQljZCAuLi9wbyAmJiAkKE1BS0UpIGNhdC1pZC10YmwuJGxvCi0KLWNoZWNrOiBhbGwKLQotIyBUaGlzIGluc3RhbGxhdGlvbiBnb2FsIGlzIG9ubHkgdXNlZCBpbiBHTlUgZ2V0dGV4dC4gIFBhY2thZ2VzIHdoaWNoCi0jIG9ubHkgdXNlIHRoZSBsaWJyYXJ5IHNob3VsZCB1c2UgaW5zdGFsbCBpbnN0ZWFkLgotCi0jIFdlIG11c3Qgbm90IGluc3RhbGwgdGhlIGxpYmludGwuaC9saWJpbnRsLmEgZmlsZXMgaWYgd2UgYXJlIG9uIGEKLSMgc3lzdGVtIHdoaWNoIGhhcyB0aGUgZ2V0dGV4dCgpIGZ1bmN0aW9uIGluIGl0cyBDIGxpYnJhcnkgb3IgaW4gYQotIyBzZXBhcmF0ZSBsaWJyYXJ5IG9yIHVzZSB0aGUgY2F0Z2V0cyBpbnRlcmZhY2UuICBBIHNwZWNpYWwgY2FzZSBpcwotIyB3aGVyZSBjb25maWd1cmUgZm91bmQgYSBwcmV2aW91c2x5IGluc3RhbGxlZCBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgotIyBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIG9uZSB3aGljaCBjb21lcyB3aXRoIHRoaXMgdmVyc2lvbiBvZiB0aGUKLSMgcGFja2FnZSwgeW91IGhhdmUgdG8gdXNlIGBjb25maWd1cmUgLS13aXRoLWluY2x1ZGVkLWdldHRleHQnLgotaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQotaW5zdGFsbC1leGVjOiBhbGwKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IiBcCi0JICAgJiYgdGVzdCAnQElOVExPQkpTQCcgPSAnJChHRVRUT0JKUyknOyB0aGVuIFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJChsaWJkaXIpICQoaW5jbHVkZWRpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChsaWJkaXIpICQoaW5jbHVkZWRpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgaW50bGguaW5zdCAkKGluY2x1ZGVkaXIpL2xpYmludGwuaDsgXAotCSAgJChJTlNUQUxMX0RBVEEpIGxpYmludGwuYSAkKGxpYmRpcikvbGliaW50bC5hOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi1pbnN0YWxsLWRhdGE6IGFsbAotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpIFZFUlNJT04gJChnZXR0ZXh0c3JjZGlyKS9WRVJTSU9OOyBcCi0JICBkaXN0cz0iJChESVNURklMRVMuY29tbW9uKSI7IFwKLQkgIGZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGZpbGUgJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQotIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgotaW5zdGFsbGNoZWNrOgotCi11bmluc3RhbGw6Ci0JZGlzdHM9IiQoRElTVEZJTEVTLmNvbW1vbikiOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKLQlkb25lCi0KLWluZm8gZHZpOgotCi0kKE9CSkVDVFMpOiBjb25maWcuaCBsaWJnZXR0ZXh0LmgKLWJpbmR0ZXh0ZG9tLiRsbyBmaW5kZG9tYWluLiRsbyBsb2FkbXNnY2F0LiRsbzogZ2V0dGV4dFAuaCBnZXR0ZXh0LmggbG9hZGluZm8uaAotZGNnZXR0ZXh0LiRsbzogZ2V0dGV4dFAuaCBnZXR0ZXh0LmggaGFzaC1zdHJpbmcuaCBsb2FkaW5mby5oCi0KLXRhZ3M6IFRBR1MKLQotVEFHUzogJChIRUFERVJTKSAkKFNPVVJDRVMpCi0JaGVyZT1gcHdkYDsgY2QgJChzcmNkaXIpICYmIGV0YWdzIC1vICQkaGVyZS9UQUdTICQoSEVBREVSUykgJChTT1VSQ0VTKQotCi1pZDogSUQKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKQotCWhlcmU9YHB3ZGA7IGNkICQoc3JjZGlyKSAmJiBta2lkIC1mJCRoZXJlL0lEICQoSEVBREVSUykgJChTT1VSQ0VTKQotCi0KLW1vc3RseWNsZWFuOgotCXJtIC1mICouYSAqLm8gKi5sbyBjb3JlIGNvcmUuKgotCi1jbGVhbjogbW9zdGx5Y2xlYW4KLQotZGlzdGNsZWFuOiBjbGVhbgotCXJtIC1mIE1ha2VmaWxlIElEIFRBR1MgcG8ybXNnLnNlZCBwbzJ0Ymwuc2VkIGxpYmludGwuaCBjb25maWcubG9nCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi0KLSMgR05VIGdldHRleHQgbmVlZHMgbm90IGNvbnRhaW4gdGhlIGZpbGUgYFZFUlNJT04nIGJ1dCBjb250YWlucyBzb21lCi0jIG90aGVyIGZpbGVzIHdoaWNoIHNob3VsZCBub3QgYmUgZGlzdHJpYnV0ZWQgaW4gb3RoZXIgcGFja2FnZXMuCi1kaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotZGlzdCBkaXN0ZGlyOiBNYWtlZmlsZSAkKERJU1RGSUxFUykKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9IGdldHRleHQ7IHRoZW4gXAotCSAgYWRkaXRpb25hbD0iJChESVNURklMRVMuZ2V0dGV4dCkiOyBcCi0JZWxzZSBcCi0JICBhZGRpdGlvbmFsPSIkKERJU1RGSUxFUy5ub3JtYWwpIjsgXAotCWZpOyBcCi0JZm9yIGZpbGUgaW4gJChESVNURklMRVMuY29tbW9uKSAkJGFkZGl0aW9uYWw7IGRvIFwKLQkgIGxuICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKLQlkb25lCi0KLWRpc3QtbGliYzoKLQl0YXIgemN2ZiBpbnRsLWdsaWJjLnRhci5neiAkKENPTVNSQ1MpICQoQ09NSERSUykgbGliaW50bC5oLmdsaWJjCi0KLU1ha2VmaWxlOiBNYWtlZmlsZS5pbiBjb25maWcuc3RhdHVzCi0JQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIyBUaGUgZGVwZW5kZW5jeSBmb3IgaW50bGguaW5zdCBpcyBkaWZmZXJlbnQgaW4gZ2V0dGV4dCBhbmQgYWxsIG90aGVyCi0jIHBhY2thZ2VzLiAgQmVjYXVzZSB3ZSBjYW5ub3QgeW91IEdOVSBtYWtlIGZlYXR1cmVzIHdlIGhhdmUgdG8gc29sdmUKLSMgdGhlIHByb2JsZW0gd2hpbGUgcmV3cml0aW5nIE1ha2VmaWxlLmluLgotQEdUX1lFU0BpbnRsaC5pbnN0OiBpbnRsaC5pbnN0LmluIC4uL2NvbmZpZy5zdGF0dXMKLUBHVF9ZRVNACWNkIC4uIFwKLUBHVF9ZRVNACSYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9IFwKLUBHVF9ZRVNACSAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi1AR1RfTk9ALlBIT05ZOiBpbnRsaC5pbnN0Ci1AR1RfTk9AaW50bGguaW5zdDoKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvaW50bC9hY2NvbmZpZy5oIGIvaW50bC9hY2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGY4MWY4Li4wMDAwMDAwCi0tLSBhL2ludGwvYWNjb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgY2F0Z2V0cyBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfQ0FUR0VUUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKZGlmZiAtLWdpdCBhL2ludGwvYWNsb2NhbC5tNCBiL2ludGwvYWNsb2NhbC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1NDM5Zi4uMDAwMDAwMAotLS0gYS9pbnRsL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjMKLQotZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLWRubCBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLWRubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotZG5sIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotZG5sIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci1kbmwgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotZG5sIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotIyBMaWtlIEFDX0NPTkZJR19IRUFERVIsIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdGFtcCBmaWxlLgotCi1BQ19ERUZVTihBTV9DT05GSUdfSEVBREVSLAotW0FDX1BSRVJFUShbMi4xMl0pCi1BQ19DT05GSUdfSEVBREVSKFskMV0pCi1kbmwgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KLWRubCBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKLWRubCB0aGF0IGlzIGdlbmVyYXRlZC4gIFdlIG11c3Qgc3RyaXAgZXZlcnl0aGluZyBwYXN0IHRoZSBmaXJzdCAiOiIsCi1kbmwgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgbGFzdCAiLyIuCi1BQ19PVVRQVVRfQ09NTUFORFMoY2hhbmdlcXVvdGUoPDwsPj4pZG5sCi1pZmVsc2UocGF0c3Vic3QoPDwkMT4+LCA8PFteIF0+PiwgPDw+PiksIDw8Pj4sCi08PHRlc3QgLXogIjw8JD4+Q09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gcGF0c3Vic3QoPDwkMT4+LCA8PF5cKFteOl0qL1wpPy4qPj4sIDw8XDE+PilzdGFtcC1oPDw+PmRubD4+LAotPDxhbV9pbmR4PTEKLWZvciBhbV9maWxlIGluIDw8JDE+PjsgZG8KLSAgY2FzZSAiIDw8JD4+Q09ORklHX0hFQURFUlMgIiBpbgotICAqIiA8PCQ+PmFtX2ZpbGUgIio8PCk+PgotICAgIGVjaG8gdGltZXN0YW1wID4gYGVjaG8gPDwkPj5hbV9maWxlIHwgc2VkIC1lICdzJTouKiUlJyAtZSAncyVbXi9dKiQlJSdgc3RhbXAtaCRhbV9pbmR4Ci0gICAgOzsKLSAgZXNhYwotICBhbV9pbmR4PWBleHByICI8PCQ+PmFtX2luZHgiICsgMWAKLWRvbmU8PD4+ZG5sPj4pCi1jaGFuZ2VxdW90ZShbLF0pKV0pCi0KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9QUk9HX0lOU1RBTEwsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLUFDX1NVQlNUKElOU1RBTExfU0NSSVBUKWRubAotXSkKLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotQUNfREVGVU4oQ1lfV0lUSF9OTFMsCi0gIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKLSAgICBBQ19BUkdfRU5BQkxFKG5scywKLSAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAotICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKLSAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQotICAgIEFDX1NVQlNUKFVTRV9OTFMpCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAotICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUykKLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAotICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCi0gICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0Ci0gICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKLSAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCi0JZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCi0JbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCi0JICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKLQkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAotCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCi0JCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhUKQotCSAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JCVt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbm8pZG5sCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlBQ19DSEVDS19GVU5DUyhkY2dldHRleHQpCi0JCUFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotCQlBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0JCUFDX1RSWV9MSU5LKCwgW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cl0sCi0JCSAgW0NBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlXSwKLQkJICBbQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWJdKQotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JXSkKLQotCWRubCBJbiB0aGUgc3RhbmRhcmQgZ2V0dGV4dCwgd2Ugd291bGQgbm93IGNoZWNrIGZvciBjYXRnZXRzLgotICAgICAgICBkbmwgSG93ZXZlciwgd2UgbmV2ZXIgd2FudCB0byB1c2UgY2F0Z2V0cyBmb3Igb3VyIHJlbGVhc2VzLgotCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICBkbmwgTmVpdGhlciBnZXR0ZXh0IG5vciBjYXRnZXRzIGluIGluY2x1ZGVkIGluIHRoZSBDIGxpYnJhcnkuCi0JICBkbmwgRmFsbCBiYWNrIG9uIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCi0JICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIEdOVSBOTFMgbGlicmFyeS4KLSAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbXNnZm10KQotICAgICAgICBBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0gICAgICAgIEFDX1NVQlNUKE1TR0ZNVCkKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICBkbmwgVGVzdCB3aGV0aGVyIHdlIHJlYWxseSBmb3VuZCBHTlUgeGdldHRleHQuCi0gICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCWRubCBJZiBpdCBpcyBubyBHTlUgeGdldHRleHQgd2UgZGVmaW5lIGl0IGFzIDogc28gdGhhdCB0aGUKLQlkbmwgTWFrZWZpbGVzIHN0aWxsIGNhbiB3b3JrLgotCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIEFDX01TR19SRVNVTFQoCi0JICAgIFtmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXRdKQotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICBkbmwgVGhlc2UgcnVsZXMgYXJlIHNvbGVseSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBnb2FsLiAgV2hpbGUgZG9pbmcgdGhpcwotICAgIGRubCB3ZSBvbmx5IGhhdmUgdG8ga2VlcCBleGFjdGx5IG9uZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgY2F0YWxvZ3MKLSAgICBkbmwgaW4gY29uZmlndXJlLmluLgotICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgZG5sIE1ha2UgYWxsIHZhcmlhYmxlcyB3ZSB1c2Uga25vd24gdG8gYXV0b2NvbmYuCi0gICAgQUNfU1VCU1QoVVNFX0lOQ0xVREVEX0xJQklOVEwpCi0gICAgQUNfU1VCU1QoQ0FUQUxPR1MpCi0gICAgQUNfU1VCU1QoQ0FUT0JKRVhUKQotICAgIEFDX1NVQlNUKERBVEFESVJOQU1FKQotICAgIEFDX1NVQlNUKEdNT0ZJTEVTKQotICAgIEFDX1NVQlNUKElOU1RPQkpFWFQpCi0gICAgQUNfU1VCU1QoSU5UTERFUFMpCi0gICAgQUNfU1VCU1QoSU5UTExJQlMpCi0gICAgQUNfU1VCU1QoSU5UTE9CSlMpCi0gICAgQUNfU1VCU1QoUE9GSUxFUykKLSAgICBBQ19TVUJTVChQT1NVQikKLSAgXSkKLQotQUNfREVGVU4oQ1lfR05VX0dFVFRFWFQsCi0gIFtBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSVNDX1BPU0lYXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0hFQURFUl9TVERDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfQ09OU1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19JTkxJTkVdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9PRkZfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX1NJWkVfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX0FMTE9DQV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX01NQVBdKWRubAotCi0gICBBQ19DSEVDS19IRUFERVJTKFthcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaF0pCi0gICBBQ19DSEVDS19GVU5DUyhbZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dF0pCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgQUNfQ0hFQ0tfRlVOQ1Moc3RwY3B5KQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIEFDX0RFRklORShIQVZFX1NUUENQWSkKLSAgIGZpCi0KLSAgIEFNX0xDX01FU1NBR0VTCi0gICBDWV9XSVRIX05MUwotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkKQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgQUNfTVNHX1JFU1VMVCgkTElOR1VBUykKLSAgICAgZmkKLQotICAgICBkbmwgQ29uc3RydWN0IGxpc3Qgb2YgbmFtZXMgb2YgY2F0YWxvZyBmaWxlcyB0byBiZSBjb25zdHJ1Y3RlZC4KLSAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgZG5sIFRoZSByZWZlcmVuY2UgdG8gPGxvY2FsZS5oPiBpbiB0aGUgaW5zdGFsbGVkIDxsaWJpbnRsLmg+IGZpbGUKLSAgIGRubCBtdXN0IGJlIHJlc29sdmVkIGJlY2F1c2Ugd2UgY2Fubm90IGV4cGVjdCB0aGUgdXNlcnMgb2YgdGhpcwotICAgZG5sIHRvIGRlZmluZSBIQVZFX0xPQ0FMRV9ILgotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICBBQ19TVUJTVChJTkNMVURFX0xPQ0FMRV9IKQotCi0gICBkbmwgRGV0ZXJtaW5lIHdoaWNoIGNhdGFsb2cgZm9ybWF0IHdlIGhhdmUgKGlmIGFueSBpcyBuZWVkZWQpCi0gICBkbmwgRm9yIG5vdyB3ZSBrbm93IGFib3V0IHR3byBkaWZmZXJlbnQgZm9ybWF0czoKLSAgIGRubCAgIExpbnV4IGxpYmMtNSBhbmQgdGhlIG5vcm1hbCBYL09wZW4gZm9ybWF0Ci0gICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L3ZlcnNpb24uaCwgbXNnZm9ybWF0PWxpbnV4LCBtc2dmb3JtYXQ9eG9wZW4pCi0KLQkgZG5sIFRyYW5zZm9ybSB0aGUgU0VEIHNjcmlwdHMgd2hpbGUgY29weWluZyBiZWNhdXNlIHNvbWUgZHVtYiBTRURzCi0gICAgICAgICBkbmwgY2Fubm90IGhhbmRsZSBjb21tZW50cy4KLQkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgZG5sIHBvMnRibC5zZWQgaXMgYWx3YXlzIG5lZWRlZC4KLSAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICBkbmwgSW4gdGhlIGludGwvTWFrZWZpbGUuaW4gd2UgaGF2ZSBhIHNwZWNpYWwgZGVwZW5kZW5jeSB3aGljaCBtYWtlcwotICAgZG5sIG9ubHkgc2Vuc2UgZm9yIGdldHRleHQuICBXZSBjb21tZW50IHRoaXMgb3V0IGZvciBub24tZ2V0dGV4dAotICAgZG5sIHBhY2thZ2VzLgotICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIEFDX1NVQlNUKEdUX05PKQotICAgQUNfU1VCU1QoR1RfWUVTKQotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICBBQ19TVUJTVChNS0lOU1RBTExESVJTKQotCi0gICBkbmwgKioqIEZvciBub3cgdGhlIGxpYnRvb2wgc3VwcG9ydCBpbiBpbnRsL01ha2VmaWxlIGlzIG5vdCBmb3IgcmVhbC4KLSAgIGw9Ci0gICBBQ19TVUJTVChsKQotCi0gICBkbmwgR2VuZXJhdGUgbGlzdCBvZiBmaWxlcyB0byBiZSBwcm9jZXNzZWQgYnkgeGdldHRleHQgd2hpY2ggd2lsbAotICAgZG5sIGJlIGluY2x1ZGVkIGluIHBvL01ha2VmaWxlLiAgQnV0IG9ubHkgZG8gdGhpcyBpZiB0aGUgcG8gZGlyZWN0b3J5Ci0gICBkbmwgZXhpc3RzIGluIHNyY2Rpci4KLSAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICBdKQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1kbmwgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChWQVJJQUJMRSwgUFJPRy1UTy1DSEVDSy1GT1IsCi1kbmwgICBURVNULVBFUkZPUk1FRC1PTi1GT1VORF9QUk9HUkFNIFssIFZBTFVFLUlGLU5PVC1GT1VORCBbLCBQQVRIXV0pCi1BQ19ERUZVTihBTV9QQVRIX1BST0dfV0lUSF9URVNULAotWyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJDIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICQyOyBhY193b3JkPVskXTIKLUFDX01TR19DSEVDS0lORyhbZm9yICRhY193b3JkXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoXyQxLAotW2Nhc2UgIlskXSQxIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF8kMT0iWyRdJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluIGlmZWxzZShbJDVdLCAsICRQQVRILCBbJDVdKTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgWyQzXTsgdGhlbgotCWFjX2N2X3BhdGhfJDE9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWRubCBJZiBubyA0dGggYXJnIGlzIGdpdmVuLCBsZWF2ZSB0aGUgY2FjaGUgdmFyaWFibGUgdW5zZXQsCi1kbmwgc28gQUNfUEFUSF9QUk9HUyB3aWxsIGtlZXAgbG9va2luZy4KLWlmZWxzZShbJDRdLCAsICwgWyAgdGVzdCAteiAiWyRdYWNfY3ZfcGF0aF8kMSIgJiYgYWNfY3ZfcGF0aF8kMT0iJDQiCi1dKWRubAotICA7OwotZXNhY10pZG5sCi0kMT0iJGFjX2N2X3BhdGhfJDEiCi1pZiB0ZXN0IC1uICJbJF0kMSI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVChbJF0kMSkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi1BQ19TVUJTVCgkMSlkbmwKLV0pCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTENfTUVTU0FHRVMsCi0gIFtpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIExDX01FU1NBR0VTXSwgYW1fY3ZfdmFsX0xDX01FU1NBR0VTLAotICAgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bG9jYWxlLmg+XSwgW3JldHVybiBMQ19NRVNTQUdFU10sCi0gICAgICAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcywgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vKV0pCi0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoSEFWRV9MQ19NRVNTQUdFUykKLSAgICBmaQotICBmaV0pCi0KZGlmZiAtLWdpdCBhL2ludGwvYmluZHRleHRkb20uYyBiL2ludGwvYmluZHRleHRkb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZjYjhkOS4uMDAwMDAwMAotLS0gYS9pbnRsL2JpbmR0ZXh0ZG9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGJpbmR0ZXh0ZG9tYWluKDMpIGZ1bmN0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLSMgaWZkZWYgSEFWRV9NQUxMT0NfSAotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jIGVsc2UKLXZvaWQgZnJlZSAoKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jIGlmbmRlZiBtZW1jcHkKLSMgIGRlZmluZSBtZW1jcHkoRHN0LCBTcmMsIE51bSkgYmNvcHkgKFNyYywgRHN0LCBOdW0pCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdldHRleHQuaCIKLSNlbmRpZgotI2luY2x1ZGUgImdldHRleHQuaCIKLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIENvbnRhaW5zIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2dzLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2Rpcm5hbWVbXTsKLQotLyogTGlzdCB3aXRoIGJpbmRpbmdzIG9mIHNwZWNpZmljIGRvbWFpbnMuICAqLwotZXh0ZXJuIHN0cnVjdCBiaW5kaW5nICpfbmxfZG9tYWluX2JpbmRpbmdzOwotCi0KLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgQklORFRFWFRET01BSU4gX19iaW5kdGV4dGRvbWFpbgotIyBkZWZpbmUgc3RyZHVwKHN0cikgX19zdHJkdXAgKHN0cikKLSNlbHNlCi0jIGRlZmluZSBCSU5EVEVYVERPTUFJTiBiaW5kdGV4dGRvbWFpbl9fCi0jZW5kaWYKLQotLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCi0gICBpbiBESVJOQU1FIHJhdGhlciB0aGFuIGluIHRoZSBzeXN0ZW0gbG9jYWxlIGRhdGEgYmFzZS4gICovCi1jaGFyICoKLUJJTkRURVhURE9NQUlOIChkb21haW5uYW1lLCBkaXJuYW1lKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotICAgICBjb25zdCBjaGFyICpkaXJuYW1lOwotewotICBzdHJ1Y3QgYmluZGluZyAqYmluZGluZzsKLQotICAvKiBTb21lIHNhbml0eSBjaGVja3MuICAqLwotICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMIHx8IGRvbWFpbm5hbWVbMF0gPT0gJ1wwJykKLSAgICByZXR1cm4gTlVMTDsKLQotICBmb3IgKGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOyBiaW5kaW5nICE9IE5VTEw7IGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBjb21wYXJlID0gc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5kb21haW5uYW1lKTsKLSAgICAgIGlmIChjb21wYXJlID09IDApCi0JLyogV2UgZm91bmQgaXQhICAqLwotCWJyZWFrOwotICAgICAgaWYgKGNvbXBhcmUgPCAwKQotCXsKLQkgIC8qIEl0IGlzIG5vdCBpbiB0aGUgbGlzdC4gICovCi0JICBiaW5kaW5nID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGRpcm5hbWUgPT0gTlVMTCkKLSAgICAvKiBUaGUgY3VycmVudCBiaW5kaW5nIGhhcyBiZSB0byByZXR1cm5lZC4gICovCi0gICAgcmV0dXJuIGJpbmRpbmcgPT0gTlVMTCA/IChjaGFyICopIF9ubF9kZWZhdWx0X2Rpcm5hbWUgOiBiaW5kaW5nLT5kaXJuYW1lOwotCi0gIGlmIChiaW5kaW5nICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVGhlIGRvbWFpbiBpcyBhbHJlYWR5IGJvdW5kLiAgSWYgdGhlIG5ldyB2YWx1ZSBhbmQgdGhlIG9sZAotCSBvbmUgYXJlIGVxdWFsIHdlIHNpbXBseSBkbyBub3RoaW5nLiAgT3RoZXJ3aXNlIHJlcGxhY2UgdGhlCi0JIG9sZCBiaW5kaW5nLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGRpcm5hbWUsIGJpbmRpbmctPmRpcm5hbWUpICE9IDApCi0JewotCSAgY2hhciAqbmV3X2Rpcm5hbWU7Ci0KLQkgIGlmIChzdHJjbXAgKGRpcm5hbWUsIF9ubF9kZWZhdWx0X2Rpcm5hbWUpID09IDApCi0JICAgIG5ld19kaXJuYW1lID0gKGNoYXIgKikgX25sX2RlZmF1bHRfZGlybmFtZTsKLQkgIGVsc2UKLQkgICAgewotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotCSAgICAgIG5ld19kaXJuYW1lID0gc3RyZHVwIChkaXJuYW1lKTsKLQkgICAgICBpZiAobmV3X2Rpcm5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0jZWxzZQotCSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRpcm5hbWUpICsgMTsKLQkgICAgICBuZXdfZGlybmFtZSA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLQkgICAgICBpZiAobmV3X2Rpcm5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkgICAgICBtZW1jcHkgKG5ld19kaXJuYW1lLCBkaXJuYW1lLCBsZW4pOwotI2VuZGlmCi0JICAgIH0KLQotCSAgaWYgKGJpbmRpbmctPmRpcm5hbWUgIT0gX25sX2RlZmF1bHRfZGlybmFtZSkKLQkgICAgZnJlZSAoYmluZGluZy0+ZGlybmFtZSk7Ci0KLQkgIGJpbmRpbmctPmRpcm5hbWUgPSBuZXdfZGlybmFtZTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgYmluZGluZy4gICovCi0gICAgICBzaXplX3QgbGVuOwotICAgICAgc3RydWN0IGJpbmRpbmcgKm5ld19iaW5kaW5nID0KLQkoc3RydWN0IGJpbmRpbmcgKikgbWFsbG9jIChzaXplb2YgKCpuZXdfYmluZGluZykpOwotCi0gICAgICBpZiAobmV3X2JpbmRpbmcgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLQotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotICAgICAgbmV3X2JpbmRpbmctPmRvbWFpbm5hbWUgPSBzdHJkdXAgKGRvbWFpbm5hbWUpOwotICAgICAgaWYgKG5ld19iaW5kaW5nLT5kb21haW5uYW1lID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0jZWxzZQotICAgICAgbGVuID0gc3RybGVuIChkb21haW5uYW1lKSArIDE7Ci0gICAgICBuZXdfYmluZGluZy0+ZG9tYWlubmFtZSA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLSAgICAgIGlmIChuZXdfYmluZGluZy0+ZG9tYWlubmFtZSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgICAgbWVtY3B5IChuZXdfYmluZGluZy0+ZG9tYWlubmFtZSwgZG9tYWlubmFtZSwgbGVuKTsKLSNlbmRpZgotCi0gICAgICBpZiAoc3RyY21wIChkaXJuYW1lLCBfbmxfZGVmYXVsdF9kaXJuYW1lKSA9PSAwKQotCW5ld19iaW5kaW5nLT5kaXJuYW1lID0gKGNoYXIgKikgX25sX2RlZmF1bHRfZGlybmFtZTsKLSAgICAgIGVsc2UKLQl7Ci0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCi0JICBuZXdfYmluZGluZy0+ZGlybmFtZSA9IHN0cmR1cCAoZGlybmFtZSk7Ci0JICBpZiAobmV3X2JpbmRpbmctPmRpcm5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0jZWxzZQotCSAgbGVuID0gc3RybGVuIChkaXJuYW1lKSArIDE7Ci0JICBuZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLQkgIGlmIChuZXdfYmluZGluZy0+ZGlybmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQkgIG1lbWNweSAobmV3X2JpbmRpbmctPmRpcm5hbWUsIGRpcm5hbWUsIGxlbik7Ci0jZW5kaWYKLQl9Ci0KLSAgICAgIC8qIE5vdyBlbnF1ZXVlIGl0LiAgKi8KLSAgICAgIGlmIChfbmxfZG9tYWluX2JpbmRpbmdzID09IE5VTEwKLQkgIHx8IHN0cmNtcCAoZG9tYWlubmFtZSwgX25sX2RvbWFpbl9iaW5kaW5ncy0+ZG9tYWlubmFtZSkgPCAwKQotCXsKLQkgIG5ld19iaW5kaW5nLT5uZXh0ID0gX25sX2RvbWFpbl9iaW5kaW5nczsKLQkgIF9ubF9kb21haW5fYmluZGluZ3MgPSBuZXdfYmluZGluZzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmluZGluZyA9IF9ubF9kb21haW5fYmluZGluZ3M7Ci0JICB3aGlsZSAoYmluZGluZy0+bmV4dCAhPSBOVUxMCi0JCSAmJiBzdHJjbXAgKGRvbWFpbm5hbWUsIGJpbmRpbmctPm5leHQtPmRvbWFpbm5hbWUpID4gMCkKLQkgICAgYmluZGluZyA9IGJpbmRpbmctPm5leHQ7Ci0KLQkgIG5ld19iaW5kaW5nLT5uZXh0ID0gYmluZGluZy0+bmV4dDsKLQkgIGJpbmRpbmctPm5leHQgPSBuZXdfYmluZGluZzsKLQl9Ci0KLSAgICAgIGJpbmRpbmcgPSBuZXdfYmluZGluZzsKLSAgICB9Ci0KLSAgcmV0dXJuIGJpbmRpbmctPmRpcm5hbWU7Ci19Ci0KLSNpZmRlZiBfTElCQwotLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi13ZWFrX2FsaWFzIChfX2JpbmR0ZXh0ZG9tYWluLCBiaW5kdGV4dGRvbWFpbik7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvY2F0LWNvbXBhdC5jIGIvaW50bC9jYXQtY29tcGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2N2Q5MDEuLjAwMDAwMDAKLS0tIGEvaW50bC9jYXQtY29tcGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyogQ29tcGF0aWJpbGl0eSBjb2RlIGZvciBnZXR0ZXh0LXVzaW5nLWNhdGdldHMgaW50ZXJmYWNlLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIFNURENfSEVBREVSUwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotY2hhciAqZ2V0ZW52ICgpOwotIyBpZmRlZiBIQVZFX01BTExPQ19ICi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9OTF9UWVBFU19ICi0jIGluY2x1ZGUgPG5sX3R5cGVzLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmdldHRleHQuaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBYUEczIGRlZmluZXMgdGhlIHJlc3VsdCBvZiBgc2V0bG9jYWxlIChjYXRlZ29yeSwgTlVMTCknIGFzOgotICAgYGBEaXJlY3RzIGBzZXRsb2NhbGUoKScgdG8gcXVlcnkgYGNhdGVnb3J5JyBhbmQgcmV0dXJuIHRoZSBjdXJyZW50Ci0gICAgIHNldHRpbmcgb2YgYGxvY2FsJy4nJwotICAgSG93ZXZlciBpdCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBleGFjdCBmb3JtYXQuICBBbmQgZXZlbiB3b3JzZTogUE9TSVgKLSAgIGRlZmluZXMgdGhpcyBub3QgYXQgYWxsLiAgU28gd2UgY2FuIHVzZSB0aGlzIGZlYXR1cmUgb25seSBvbiBzZWxlY3RlZAotICAgc3lzdGVtIChlLmcuIHRob3NlIHVzaW5nIEdOVSBDIExpYnJhcnkpLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgSEFWRV9MT0NBTEVfTlVMTAotI2VuZGlmCi0KLS8qIFRoZSBjYXRhbG9nIGRlc2NyaXB0b3IuICAqLwotc3RhdGljIG5sX2NhdGQgY2F0YWxvZyA9IChubF9jYXRkKSAtMTsKLQotLyogTmFtZSBvZiB0aGUgZGVmYXVsdCBjYXRhbG9nLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyIGRlZmF1bHRfY2F0YWxvZ19uYW1lW10gPSAibWVzc2FnZXMiOwotCi0vKiBOYW1lIG9mIGN1cnJlbnRseSB1c2VkIGNhdGFsb2cuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmNhdGFsb2dfbmFtZSA9IGRlZmF1bHRfY2F0YWxvZ19uYW1lOwotCi0vKiBHZXQgSUQgZm9yIGdpdmVuIHN0cmluZy4gIElmIG5vdCBmb3VuZCByZXR1cm4gLTEuICAqLwotc3RhdGljIGludCBtc2dfdG9fY2F0X2lkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm1zZykpOwotCi0vKiBTdWJzdGl0dXRpb24gZm9yIHN5c3RlbXMgbGFja2luZyB0aGlzIGZ1bmN0aW9uIGluIHRoZWlyIEMgbGlicmFyeS4gICovCi0jaWYgIV9MSUJDICYmICFIQVZFX1NUUENQWQotc3RhdGljIGNoYXIgKnN0cGNweSBQQVJBTVMgKChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpKTsKLSNlbmRpZgotCi0KLS8qIFNldCBjdXJyZW50bHkgdXNlZCBkb21haW4vY2F0YWxvZy4gICovCi1jaGFyICoKLXRleHRkb21haW4gKGRvbWFpbm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci17Ci0gIG5sX2NhdGQgbmV3X2NhdGFsb2c7Ci0gIGNoYXIgKm5ld19uYW1lOwotICBzaXplX3QgbmV3X25hbWVfbGVuOwotICBjaGFyICpsYW5nOwotCi0jaWYgZGVmaW5lZCBIQVZFX1NFVExPQ0FMRSAmJiBkZWZpbmVkIEhBVkVfTENfTUVTU0FHRVMgXAotICAgICYmIGRlZmluZWQgSEFWRV9MT0NBTEVfTlVMTAotICBsYW5nID0gc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgTlVMTCk7Ci0jZWxzZQotICBsYW5nID0gZ2V0ZW52ICgiTENfQUxMIik7Ci0gIGlmIChsYW5nID09IE5VTEwgfHwgbGFuZ1swXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIGxhbmcgPSBnZXRlbnYgKCJMQ19NRVNTQUdFUyIpOwotICAgICAgaWYgKGxhbmcgPT0gTlVMTCB8fCBsYW5nWzBdID09ICdcMCcpCi0JbGFuZyA9IGdldGVudiAoIkxBTkciKTsKLSAgICB9Ci0jZW5kaWYKLSAgaWYgKGxhbmcgPT0gTlVMTCB8fCBsYW5nWzBdID09ICdcMCcpCi0gICAgbGFuZyA9ICJDIjsKLQotICAvKiBTZWUgd2hldGhlciBuYW1lIG9mIGN1cnJlbnRseSB1c2VkIGRvbWFpbiBpcyBhc2tlZC4gICovCi0gIGlmIChkb21haW5uYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIChjaGFyICopIGNhdGFsb2dfbmFtZTsKLQotICBpZiAoZG9tYWlubmFtZVswXSA9PSAnXDAnKQotICAgIGRvbWFpbm5hbWUgPSBkZWZhdWx0X2NhdGFsb2dfbmFtZTsKLQotICAvKiBDb21wdXRlIGxlbmd0aCBvZiBhZGRlZCBwYXRoIGVsZW1lbnQuICAqLwotICBuZXdfbmFtZV9sZW4gPSBzaXplb2YgKExPQ0FMRURJUikgLSAxICsgMSArIHN0cmxlbiAobGFuZykKLQkJICsgc2l6ZW9mICgiL0xDX01FU1NBR0VTLyIpIC0gMSArIHNpemVvZiAoUEFDS0FHRSkgLSAxCi0JCSArIHNpemVvZiAoIi5jYXQiKTsKLQotICBuZXdfbmFtZSA9IChjaGFyICopIG1hbGxvYyAobmV3X25hbWVfbGVuKTsKLSAgaWYgKG5ld19uYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3RyY3B5IChuZXdfbmFtZSwgUEFDS0FHRSk7Ci0gIG5ld19jYXRhbG9nID0gY2F0b3BlbiAobmV3X25hbWUsIDApOwotCi0gIGlmIChuZXdfY2F0YWxvZyA9PSAobmxfY2F0ZCkgLTEpCi0gICAgewotICAgICAgLyogTkxTUEFUSCBzZWFyY2ggZGlkbid0IHdvcmssIHRyeSBhYnNvbHV0ZSBwYXRoICovCi0gICAgICBzcHJpbnRmIChuZXdfbmFtZSwgIiVzLyVzL0xDX01FU1NBR0VTLyVzLmNhdCIsIExPQ0FMRURJUiwgbGFuZywKLQkgICAgICAgUEFDS0FHRSk7Ci0gICAgICBuZXdfY2F0YWxvZyA9IGNhdG9wZW4gKG5ld19uYW1lLCAwKTsKLQotICAgICAgaWYgKG5ld19jYXRhbG9nID09IChubF9jYXRkKSAtMSkKLQl7Ci0JICBmcmVlIChuZXdfbmFtZSk7Ci0JICByZXR1cm4gKGNoYXIgKikgY2F0YWxvZ19uYW1lOwotCX0KLSAgICB9Ci0KLSAgLyogQ2xvc2Ugb2xkIGNhdGFsb2cuICAqLwotICBpZiAoY2F0YWxvZyAhPSAobmxfY2F0ZCkgLTEpCi0gICAgY2F0Y2xvc2UgKGNhdGFsb2cpOwotICBpZiAoY2F0YWxvZ19uYW1lICE9IGRlZmF1bHRfY2F0YWxvZ19uYW1lKQotICAgIGZyZWUgKChjaGFyICopIGNhdGFsb2dfbmFtZSk7Ci0KLSAgY2F0YWxvZyA9IG5ld19jYXRhbG9nOwotICBjYXRhbG9nX25hbWUgPSBuZXdfbmFtZTsKLQotICByZXR1cm4gKGNoYXIgKikgY2F0YWxvZ19uYW1lOwotfQotCi1jaGFyICoKLWJpbmR0ZXh0ZG9tYWluIChkb21haW5uYW1lLCBkaXJuYW1lKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotICAgICBjb25zdCBjaGFyICpkaXJuYW1lOwotewotI2lmIEhBVkVfU0VURU5WIHx8IEhBVkVfUFVURU5WCi0gIGNoYXIgKm9sZF92YWwsICpuZXdfdmFsLCAqY3A7Ci0gIHNpemVfdCBuZXdfdmFsX2xlbjsKLQotICAvKiBUaGlzIGRvZXMgbm90IG1ha2UgbXVjaCBzZW5zZSBoZXJlIGJ1dCB0byBiZSBjb21wYXRpYmxlIGRvIGl0LiAgKi8KLSAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDb21wdXRlIGxlbmd0aCBvZiBhZGRlZCBwYXRoIGVsZW1lbnQuICBJZiB3ZSB1c2Ugc2V0ZW52IHdlIGRvbid0IG5lZWQKLSAgICAgdGhlIGZpcnN0IGJ5dHMgZm9yIE5MU1BBVEg9LCBidXQgd2h5IGNvbXBsaWNhdGUgdGhlIGNvZGUgZm9yIHRoaXMKLSAgICAgcGVhbnV0cy4gICovCi0gIG5ld192YWxfbGVuID0gc2l6ZW9mICgiTkxTUEFUSD0iKSAtIDEgKyBzdHJsZW4gKGRpcm5hbWUpCi0JCSsgc2l6ZW9mICgiLyVML0xDX01FU1NBR0VTLyVOLmNhdCIpOwotCi0gIG9sZF92YWwgPSBnZXRlbnYgKCJOTFNQQVRIIik7Ci0gIGlmIChvbGRfdmFsID09IE5VTEwgfHwgb2xkX3ZhbFswXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIG9sZF92YWwgPSBOVUxMOwotICAgICAgbmV3X3ZhbF9sZW4gKz0gMSArIHNpemVvZiAoTE9DQUxFRElSKSAtIDEKLQkgICAgICAgICAgICAgKyBzaXplb2YgKCIvJUwvTENfTUVTU0FHRVMvJU4uY2F0Iik7Ci0gICAgfQotICBlbHNlCi0gICAgbmV3X3ZhbF9sZW4gKz0gc3RybGVuIChvbGRfdmFsKTsKLQotICBuZXdfdmFsID0gKGNoYXIgKikgbWFsbG9jIChuZXdfdmFsX2xlbik7Ci0gIGlmIChuZXdfdmFsID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSMgaWYgSEFWRV9TRVRFTlYKLSAgY3AgPSBuZXdfdmFsOwotIyBlbHNlCi0gIGNwID0gc3RwY3B5IChuZXdfdmFsLCAiTkxTUEFUSD0iKTsKLSMgZW5kaWYKLQotICBjcCA9IHN0cGNweSAoY3AsIGRpcm5hbWUpOwotICBjcCA9IHN0cGNweSAoY3AsICIvJUwvTENfTUVTU0FHRVMvJU4uY2F0OiIpOwotCi0gIGlmIChvbGRfdmFsID09IE5VTEwpCi0gICAgewotIyBpZiBfX1NURENfXwotICAgICAgc3RwY3B5IChjcCwgTE9DQUxFRElSICIvJUwvTENfTUVTU0FHRVMvJU4uY2F0Iik7Ci0jIGVsc2UKLQotICAgICAgY3AgPSBzdHBjcHkgKGNwLCBMT0NBTEVESVIpOwotICAgICAgc3RwY3B5IChjcCwgIi8lTC9MQ19NRVNTQUdFUy8lTi5jYXQiKTsKLSMgZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICBzdHBjcHkgKGNwLCBvbGRfdmFsKTsKLQotIyBpZiBIQVZFX1NFVEVOVgotICBzZXRlbnYgKCJOTFNQQVRIIiwgbmV3X3ZhbCwgMSk7Ci0gIGZyZWUgKG5ld192YWwpOwotIyBlbHNlCi0gIHB1dGVudiAobmV3X3ZhbCk7Ci0gIC8qIERvICpub3QqIGZyZWUgdGhlIGVudmlyb25tZW50IGVudHJ5IHdlIGp1c3QgZW50ZXJlZC4gIEl0IGlzIHVzZWQKLSAgICAgZnJvbSBub3cgb24uICAgKi8KLSMgZW5kaWYKLQotI2VuZGlmCi0KLSAgcmV0dXJuIChjaGFyICopIGRvbWFpbm5hbWU7Ci19Ci0KLSN1bmRlZiBnZXR0ZXh0Ci1jaGFyICoKLWdldHRleHQgKG1zZykKLSAgICAgY29uc3QgY2hhciAqbXNnOwotewotICBpbnQgbXNnaWQ7Ci0KLSAgaWYgKG1zZyA9PSBOVUxMIHx8IGNhdGFsb2cgPT0gKG5sX2NhdGQpIC0xKQotICAgIHJldHVybiAoY2hhciAqKSBtc2c7Ci0KLSAgLyogR2V0IHRoZSBtZXNzYWdlIGZyb20gdGhlIGNhdGFsb2cuICBXZSBhbHdheXMgdXNlIHNldCBudW1iZXIgMS4KLSAgICAgVGhlIG1lc3NhZ2UgSUQgaXMgY29tcHV0ZWQgYnkgdGhlIGZ1bmN0aW9uIGBtc2dfdG9fY2F0X2lkJwotICAgICB3aGljaCB3b3JrcyBvbiB0aGUgdGFibGUgZ2VuZXJhdGVkIGJ5IGBwby10by10YmwnLiAgKi8KLSAgbXNnaWQgPSBtc2dfdG9fY2F0X2lkIChtc2cpOwotICBpZiAobXNnaWQgPT0gLTEpCi0gICAgcmV0dXJuIChjaGFyICopIG1zZzsKLQotICByZXR1cm4gY2F0Z2V0cyAoY2F0YWxvZywgMSwgbXNnaWQsIChjaGFyICopIG1zZyk7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgdGFibGUgYF9tc2dfdGJsJyB3aGljaCBoYXMgYF9tc2dfdGJsX2xlbmd0aCcgZW50cmllcwotICAgZm9yIHRoZSBvbmUgZXF1YWwgdG8gbXNnLiAgSWYgaXQgaXMgZm91bmQgcmV0dXJuIHRoZSBJRC4gIEluIGNhc2Ugd2hlbgotICAgdGhlIHN0cmluZyBpcyBub3QgZm91bmQgcmV0dXJuIC0xLiAgKi8KLXN0YXRpYyBpbnQKLW1zZ190b19jYXRfaWQgKG1zZykKLSAgICAgY29uc3QgY2hhciAqbXNnOwotewotICBpbnQgY250OwotCi0gIGZvciAoY250ID0gMDsgY250IDwgX21zZ190YmxfbGVuZ3RoOyArK2NudCkKLSAgICBpZiAoc3RyY21wIChtc2csIF9tc2dfdGJsW2NudF0uX21zZykgPT0gMCkKLSAgICAgIHJldHVybiBfbXNnX3RibFtjbnRdLl9tc2dfbnVtYmVyOwotCi0gIHJldHVybiAtMTsKLX0KLQotCi0vKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KLQotLyogV2UgZG9uJ3Qgd2FudCBsaWJpbnRsLmEgdG8gZGVwZW5kIG9uIGFueSBvdGhlciBsaWJyYXJ5LiAgU28gd2UKLSAgIGF2b2lkIHRoZSBub24tc3RhbmRhcmQgZnVuY3Rpb24gc3RwY3B5LiAgSW4gR05VIEMgTGlicmFyeSB0aGlzCi0gICBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIHRob3VnaC4gIEFsc28gYWxsb3cgdGhlIHN5bWJvbCBIQVZFX1NUUENQWQotICAgdG8gYmUgZGVmaW5lZC4gICovCi0jaWYgIV9MSUJDICYmICFIQVZFX1NUUENQWQotc3RhdGljIGNoYXIgKgotc3RwY3B5IChkZXN0LCBzcmMpCi0gICAgIGNoYXIgKmRlc3Q7Ci0gICAgIGNvbnN0IGNoYXIgKnNyYzsKLXsKLSAgd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSAhPSAnXDAnKQotICAgIC8qIERvIG5vdGhpbmcuICovIDsKLSAgcmV0dXJuIGRlc3QgLSAxOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2NvbmZpZy5pbiBiL2ludGwvY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTkwNDliLi4wMDAwMDAwCi0tLSBhL2ludGwvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9DQVRHRVRTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFMVUVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpIGxpYnJhcnkgKC1saSkuICAqLwotI3VuZGVmIEhBVkVfTElCSQpkaWZmIC0tZ2l0IGEvaW50bC9jb25maWd1cmUgYi9pbnRsL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQxZWVhMC4uMDAwMDAwMAotLS0gYS9pbnRsL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDI5NTAgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPWRnZXR0ZXh0LmMKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGVsc2UKLSAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGZpCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NjI6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYxNjogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2MzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjYzNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2NDggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjY1NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY3NzogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci1zZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgotYWxsOgotCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCi1FT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCi1pZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcwotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0bWFrZQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgU0VUX01BS0U9Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcwNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzM1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc4MzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzkzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjc5NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgxNzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgyMjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODMxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi0gIGFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPQotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg0NjogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotICBpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0gIGVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1PMiIKLSAgZmkKLWVsc2UKLSAgR0NDPQotICB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldCB8fCBDRkxBR1M9Ii1nIgotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NzY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTAzOiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MjQ6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDkyOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6OTM3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTU0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDk3MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5OTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAwNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDI4OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwMzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTA4MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTAzOiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTE3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE0MzogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTE0OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAib2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE3NjogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTgxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIxMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyMTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIyMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNDQ6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI0OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmIEhBVkVfQUxMT0NBX0gKLSMgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyBlbHNlCi0jICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgIGVsc2UKLSMgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjcyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLm8KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMDQ6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzA5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMzNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTMzOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzYyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzODk6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ0MTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0NDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjE0NTE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDgwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1MzM6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1NDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2ODE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzA5OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTcxNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTcxOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc0OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTc1NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzc3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODA2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4MzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg2ODogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODczICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg4MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MDE6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTkyMTogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTQwOiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTQ1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjE5NTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5Njc6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTk3MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk3OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTk1OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjAwMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwMTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMzA6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjAzNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDcwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTA0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTA5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNTk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxOTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIyNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIzNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmUKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCSAgICAgICAgCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyNjY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzAwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzM1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDI1OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDUzOiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDU4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0NjM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjEgfCBncmVwIGFjX3NwYWNlYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQENDQCUkQ0MlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotYWNfc291cmNlcz0iJG5sc19jdl9oZWFkZXJfbGliZ3QiCi1hY19kZXN0cz0iJG5sc19jdl9oZWFkZXJfaW50bCIKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1zcmNkaXI9JGFjX2dpdmVuX3NyY2Rpcgotd2hpbGUgdGVzdCAtbiAiJGFjX3NvdXJjZXMiOyBkbwotICBzZXQgJGFjX2Rlc3RzOyBhY19kZXN0PSQxOyBzaGlmdDsgYWNfZGVzdHM9JCoKLSAgc2V0ICRhY19zb3VyY2VzOyBhY19zb3VyY2U9JDE7IHNoaWZ0OyBhY19zb3VyY2VzPSQqCi0KLSAgZWNobyAibGlua2luZyAkc3JjZGlyLyRhY19zb3VyY2UgdG8gJGFjX2Rlc3QiCi0KLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3NvdXJjZTsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBGaWxlIG5vdCBmb3VuZCIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mICRhY19kZXN0Ci0KLSAgIyBNYWtlIHJlbGF0aXZlIHN5bWxpbmtzLgotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGVzdF9kaXI9YGVjaG8gJGFjX2Rlc3R8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9ICIkYWNfZGVzdCIgJiYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZGVzdCBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2Rlc3RfZGlyIiAmJiBta2RpciAiJGFjX2Rlc3RfZGlyIgotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kZXN0X2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGVzdF9kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rlc3RfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkc3JjZGlyIiBpbgotICBbLyRdKikgYWNfcmVsX3NvdXJjZT0iJHNyY2Rpci8kYWNfc291cmNlIiA7OwotICAqKSBhY19yZWxfc291cmNlPSIkYWNfZG90cyRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKLSAgZXNhYwotCi0gICMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGU7IG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsuCi0gIGlmIGxuIC1zICRhY19yZWxfc291cmNlICRhY19kZXN0IDI+L2Rldi9udWxsIHx8Ci0gICAgbG4gJHNyY2Rpci8kYWNfc291cmNlICRhY19kZXN0OyB0aGVuIDoKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBsaW5rICRhY19kZXN0IHRvICRzcmNkaXIvJGFjX3NvdXJjZSIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1kb25lCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotdGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgKLQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL2ludGwvY29uZmlndXJlLmluIGIvaW50bC9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYTljMjQuLjAwMDAwMDAKLS0tIGEvaW50bC9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLQotQUNfSU5JVChkZ2V0dGV4dC5jKQotQU1fQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi0KLUFNX1BST0dfSU5TVEFMTAotQ1lfR05VX0dFVFRFWFQKLUFDX0xJTktfRklMRVMoJG5sc19jdl9oZWFkZXJfbGliZ3QsICRubHNfY3ZfaGVhZGVyX2ludGwpCi0KLUFDX09VVFBVVChNYWtlZmlsZSkKZGlmZiAtLWdpdCBhL2ludGwvZGNnZXR0ZXh0LmMgYi9pbnRsL2RjZ2V0dGV4dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzE2YmZkLi4wMDAwMDAwCi0tLSBhL2ludGwvZGNnZXR0ZXh0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTMgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRjZ2V0dGV4dCgzKSBmdW5jdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSMgZGVmaW5lIEhBVkVfQUxMT0NBIDEKLSNlbHNlCi0jIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCi0jICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgZWxzZQotIyAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICBlbHNlCi0jICAgaWZuZGVmIGFsbG9jYQotY2hhciAqYWxsb2NhICgpOwotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmbmRlZiBlcnJubwotZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZgotI2lmbmRlZiBfX3NldF9lcnJubwotIyBkZWZpbmUgX19zZXRfZXJybm8odmFsKSBlcnJubyA9ICh2YWwpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotY2hhciAqZ2V0ZW52ICgpOwotIyBpZmRlZiBIQVZFX01BTExPQ19ICi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgZWxzZQotdm9pZCBmcmVlICgpOwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgX0dOVV9TT1VSQ0UKLSMgIGRlZmluZSBfR05VX1NPVVJDRQkxCi0jIGVuZGlmCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jaWYgIUhBVkVfU1RSQ0hSICYmICFkZWZpbmVkIF9MSUJDCi0jIGlmbmRlZiBzdHJjaHIKLSMgIGRlZmluZSBzdHJjaHIgaW5kZXgKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1VOSVNURF9IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImdldHRleHQuaCIKLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdldHRleHQuaCIKLSNlbmRpZgotI2luY2x1ZGUgImhhc2gtc3RyaW5nLmgiCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmZGVmIF9MSUJDCi0vKiBSZW5hbWUgdGhlIG5vbiBBTlNJIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKLSAgIGJlY2F1c2Ugc29tZSBBTlNJIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKLSAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KLSMgZGVmaW5lIGdldGN3ZCBfX2dldGN3ZAotIyBkZWZpbmUgc3RwY3B5IF9fc3RwY3B5Ci0jZWxzZQotIyBpZiAhZGVmaW5lZCBIQVZFX0dFVENXRAotY2hhciAqZ2V0d2QgKCk7Ci0jICBkZWZpbmUgZ2V0Y3dkKGJ1ZiwgbWF4KSBnZXR3ZCAoYnVmKQotIyBlbHNlCi1jaGFyICpnZXRjd2QgKCk7Ci0jIGVuZGlmCi0jIGlmbmRlZiBIQVZFX1NUUENQWQotc3RhdGljIGNoYXIgKnN0cGNweSBQQVJBTVMgKChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBBbW91bnQgdG8gaW5jcmVhc2UgYnVmZmVyIHNpemUgYnkgaW4gZWFjaCB0cnkuICAqLwotI2RlZmluZSBQQVRIX0lOQ1IgMzIKLQotLyogVGhlIGZvbGxvd2luZyBpcyBmcm9tIHBhdGhtYXguaC4gICovCi0vKiBOb24tUE9TSVggQlNEIHN5c3RlbXMgbWlnaHQgaGF2ZSBnY2MncyBsaW1pdHMuaCwgd2hpY2ggZG9lc24ndCBkZWZpbmUKLSAgIFBBVEhfTUFYIGJ1dCBtaWdodCBjYXVzZSByZWRlZmluaXRpb24gd2FybmluZ3Mgd2hlbiBzeXMvcGFyYW0uaCBpcwotICAgbGF0ZXIgaW5jbHVkZWQgKGFzIG9uIE1PUkUvQlNEIDQuMykuICAqLwotI2lmIGRlZmluZWQoX1BPU0lYX1ZFUlNJT04pIHx8IChkZWZpbmVkKEhBVkVfTElNSVRTX0gpICYmICFkZWZpbmVkKF9fR05VQ19fKSkKLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfUE9TSVhfUEFUSF9NQVgKLSMgZGVmaW5lIF9QT1NJWF9QQVRIX01BWCAyNTUKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoUEFUSF9NQVgpICYmIGRlZmluZWQoX1BDX1BBVEhfTUFYKQotIyBkZWZpbmUgUEFUSF9NQVggKHBhdGhjb25mICgiLyIsIF9QQ19QQVRIX01BWCkgPCAxID8gMTAyNCA6IHBhdGhjb25mICgiLyIsIF9QQ19QQVRIX01BWCkpCi0jZW5kaWYKLQotLyogRG9uJ3QgaW5jbHVkZSBzeXMvcGFyYW0uaCBpZiBpdCBhbHJlYWR5IGhhcyBiZWVuLiAgKi8KLSNpZiBkZWZpbmVkKEhBVkVfU1lTX1BBUkFNX0gpICYmICFkZWZpbmVkKFBBVEhfTUFYKSAmJiAhZGVmaW5lZChNQVhQQVRITEVOKQotIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoUEFUSF9NQVgpICYmIGRlZmluZWQoTUFYUEFUSExFTikKLSMgZGVmaW5lIFBBVEhfTUFYIE1BWFBBVEhMRU4KLSNlbmRpZgotCi0jaWZuZGVmIFBBVEhfTUFYCi0jIGRlZmluZSBQQVRIX01BWCBfUE9TSVhfUEFUSF9NQVgKLSNlbmRpZgotCi0vKiBYUEczIGRlZmluZXMgdGhlIHJlc3VsdCBvZiBgc2V0bG9jYWxlIChjYXRlZ29yeSwgTlVMTCknIGFzOgotICAgYGBEaXJlY3RzIGBzZXRsb2NhbGUoKScgdG8gcXVlcnkgYGNhdGVnb3J5JyBhbmQgcmV0dXJuIHRoZSBjdXJyZW50Ci0gICAgIHNldHRpbmcgb2YgYGxvY2FsJy4nJwotICAgSG93ZXZlciBpdCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBleGFjdCBmb3JtYXQuICBBbmQgZXZlbiB3b3JzZTogUE9TSVgKLSAgIGRlZmluZXMgdGhpcyBub3QgYXQgYWxsLiAgU28gd2UgY2FuIHVzZSB0aGlzIGZlYXR1cmUgb25seSBvbiBzZWxlY3RlZAotICAgc3lzdGVtIChlLmcuIHRob3NlIHVzaW5nIEdOVSBDIExpYnJhcnkpLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgSEFWRV9MT0NBTEVfTlVMTAotI2VuZGlmCi0KLS8qIE5hbWUgb2YgdGhlIGRlZmF1bHQgZG9tYWluIHVzZWQgZm9yIGdldHRleHQoMykgcHJpb3IgYW55IGNhbGwgdG8KLSAgIHRleHRkb21haW4oMykuICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBpcyAibWVzc2FnZXMiLiAgKi8KLWNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW5bXSA9ICJtZXNzYWdlcyI7Ci0KLS8qIFZhbHVlIHVzZWQgYXMgdGhlIGRlZmF1bHQgZG9tYWluIGZvciBnZXR0ZXh0KDMpLiAgKi8KLWNvbnN0IGNoYXIgKl9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW47Ci0KLS8qIENvbnRhaW5zIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2dzLiAgKi8KLWNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdID0gR05VTE9DQUxFRElSOwotCi0vKiBMaXN0IHdpdGggYmluZGluZ3Mgb2Ygc3BlY2lmaWMgZG9tYWlucyBjcmVhdGVkIGJ5IGJpbmR0ZXh0ZG9tYWluKCkKLSAgIGNhbGxzLiAgKi8KLXN0cnVjdCBiaW5kaW5nICpfbmxfZG9tYWluX2JpbmRpbmdzOwotCi0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGNoYXIgKmZpbmRfbXNnIFBBUkFNUyAoKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKm1zZ2lkKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqY2F0ZWdvcnlfdG9fbmFtZSBQQVJBTVMgKChpbnQgY2F0ZWdvcnkpKTsKLXN0YXRpYyBjb25zdCBjaGFyICpndWVzc19jYXRlZ29yeV92YWx1ZSBQQVJBTVMgKChpbnQgY2F0ZWdvcnksCi0JCQkJCQkgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lKSk7Ci0KLQotLyogRm9yIHRob3NlIGxvb3Npbmcgc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIGBhbGxvY2EnIHdlIGhhdmUgdG8gYWRkCi0gICBzb21lIGFkZGl0aW9uYWwgY29kZSBlbXVsYXRpbmcgaXQuICAqLwotI2lmZGVmIEhBVkVfQUxMT0NBCi0vKiBOb3RoaW5nIGhhcyB0byBiZSBkb25lLiAgKi8KLSMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyZXNzKSAvKiBub3RoaW5nICovCi0jIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KSAvKiBub3RoaW5nICovCi0jZWxzZQotc3RydWN0IGJsb2NrX2xpc3QKLXsKLSAgdm9pZCAqYWRkcmVzczsKLSAgc3RydWN0IGJsb2NrX2xpc3QgKm5leHQ7Ci19OwotIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHIpCQkJCQkJICAgICAgXAotICBkbyB7CQkJCQkJCQkJICAgICAgXAotICAgIHN0cnVjdCBibG9ja19saXN0ICpuZXdwID0gKHN0cnVjdCBibG9ja19saXN0ICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOyAgXAotICAgIC8qIElmIHdlIGNhbm5vdCBnZXQgYSBmcmVlIGJsb2NrIHdlIGNhbm5vdCBhZGQgdGhlIG5ldyBlbGVtZW50IHRvCSAgICAgIFwKLSAgICAgICB0aGUgbGlzdC4gICovCQkJCQkJCSAgICAgIFwKLSAgICBpZiAobmV3cCAhPSBOVUxMKSB7CQkJCQkJCSAgICAgIFwKLSAgICAgIG5ld3AtPmFkZHJlc3MgPSAoYWRkcik7CQkJCQkJICAgICAgXAotICAgICAgbmV3cC0+bmV4dCA9IChsaXN0KTsJCQkJCQkgICAgICBcCi0gICAgICAobGlzdCkgPSBuZXdwOwkJCQkJCQkgICAgICBcCi0gICAgfQkJCQkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpCQkJCQkJICAgICAgXAotICBkbyB7CQkJCQkJCQkJICAgICAgXAotICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsJCQkJCQkgICAgICBcCi0gICAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqb2xkID0gbGlzdDsJCQkJCSAgICAgIFwKLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwkJCQkJCSAgICAgIFwKLSAgICAgIGZyZWUgKG9sZCk7CQkJCQkJCSAgICAgIFwKLSAgICB9CQkJCQkJCQkJICAgICAgXAotICB9IHdoaWxlICgwKQotIyB1bmRlZiBhbGxvY2EKLSMgZGVmaW5lIGFsbG9jYShzaXplKSAobWFsbG9jIChzaXplKSkKLSNlbmRpZgkvKiBoYXZlIGFsbG9jYSAqLwotCi0KLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgRENHRVRURVhUIF9fZGNnZXR0ZXh0Ci0jZWxzZQotIyBkZWZpbmUgRENHRVRURVhUIGRjZ2V0dGV4dF9fCi0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCi0gICBsb2NhbGUuICAqLwotY2hhciAqCi1EQ0dFVFRFWFQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBjYXRlZ29yeSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci0gICAgIGludCBjYXRlZ29yeTsKLXsKLSNpZm5kZWYgSEFWRV9BTExPQ0EKLSAgc3RydWN0IGJsb2NrX2xpc3QgKmJsb2NrX2xpc3QgPSBOVUxMOwotI2VuZGlmCi0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbjsKLSAgc3RydWN0IGJpbmRpbmcgKmJpbmRpbmc7Ci0gIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZTsKLSAgY29uc3QgY2hhciAqY2F0ZWdvcnl2YWx1ZTsKLSAgY2hhciAqZGlybmFtZSwgKnhkb21haW5uYW1lOwotICBjaGFyICpzaW5nbGVfbG9jYWxlOwotICBjaGFyICpyZXR2YWw7Ci0gIGludCBzYXZlZF9lcnJubyA9IGVycm5vOwotCi0gIC8qIElmIG5vIHJlYWwgTVNHSUQgaXMgZ2l2ZW4gcmV0dXJuIE5VTEwuICAqLwotICBpZiAobXNnaWQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBJZiBET01BSU5OQU1FIGlzIE5VTEwsIHdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBkZWZhdWx0IGRvbWFpbi4gIElmCi0gICAgIENBVEVHT1JZIGlzIG5vdCBMQ19NRVNTQUdFUyB0aGlzIG1pZ2h0IG5vdCBtYWtlIG11Y2ggc2Vuc2UgYnV0IHRoZQotICAgICBkZWZpbnRpb24gbGVmdCB0aGlzIHVuZGVmaW5lZC4gICovCi0gIGlmIChkb21haW5uYW1lID09IE5VTEwpCi0gICAgZG9tYWlubmFtZSA9IF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOwotCi0gIC8qIEZpcnN0IGZpbmQgbWF0Y2hpbmcgYmluZGluZy4gICovCi0gIGZvciAoYmluZGluZyA9IF9ubF9kb21haW5fYmluZGluZ3M7IGJpbmRpbmcgIT0gTlVMTDsgYmluZGluZyA9IGJpbmRpbmctPm5leHQpCi0gICAgewotICAgICAgaW50IGNvbXBhcmUgPSBzdHJjbXAgKGRvbWFpbm5hbWUsIGJpbmRpbmctPmRvbWFpbm5hbWUpOwotICAgICAgaWYgKGNvbXBhcmUgPT0gMCkKLQkvKiBXZSBmb3VuZCBpdCEgICovCi0JYnJlYWs7Ci0gICAgICBpZiAoY29tcGFyZSA8IDApCi0JewotCSAgLyogSXQgaXMgbm90IGluIHRoZSBsaXN0LiAgKi8KLQkgIGJpbmRpbmcgPSBOVUxMOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoYmluZGluZyA9PSBOVUxMKQotICAgIGRpcm5hbWUgPSAoY2hhciAqKSBfbmxfZGVmYXVsdF9kaXJuYW1lOwotICBlbHNlIGlmIChiaW5kaW5nLT5kaXJuYW1lWzBdID09ICcvJykKLSAgICBkaXJuYW1lID0gYmluZGluZy0+ZGlybmFtZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoLiAgTWFrZSBpdCBhYnNvbHV0ZSBub3cuICAqLwotICAgICAgc2l6ZV90IGRpcm5hbWVfbGVuID0gc3RybGVuIChiaW5kaW5nLT5kaXJuYW1lKSArIDE7Ci0gICAgICBzaXplX3QgcGF0aF9tYXg7Ci0gICAgICBjaGFyICpyZXQ7Ci0KLSAgICAgIHBhdGhfbWF4ID0gKHVuc2lnbmVkKSBQQVRIX01BWDsKLSAgICAgIHBhdGhfbWF4ICs9IDI7CQkvKiBUaGUgZ2V0Y3dkIGRvY3Mgc2F5IHRvIGRvIHRoaXMuICAqLwotCi0gICAgICBkaXJuYW1lID0gKGNoYXIgKikgYWxsb2NhIChwYXRoX21heCArIGRpcm5hbWVfbGVuKTsKLSAgICAgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgZGlybmFtZSk7Ci0KLSAgICAgIF9fc2V0X2Vycm5vICgwKTsKLSAgICAgIHdoaWxlICgocmV0ID0gZ2V0Y3dkIChkaXJuYW1lLCBwYXRoX21heCkpID09IE5VTEwgJiYgZXJybm8gPT0gRVJBTkdFKQotCXsKLQkgIHBhdGhfbWF4ICs9IFBBVEhfSU5DUjsKLQkgIGRpcm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHBhdGhfbWF4ICsgZGlybmFtZV9sZW4pOwotCSAgQUREX0JMT0NLIChibG9ja19saXN0LCBkaXJuYW1lKTsKLQkgIF9fc2V0X2Vycm5vICgwKTsKLQl9Ci0KLSAgICAgIGlmIChyZXQgPT0gTlVMTCkKLQl7Ci0JICAvKiBXZSBjYW5ub3QgZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgRG9uJ3Qgc2lnbmFsIGFuCi0JICAgICBlcnJvciBidXQgc2ltcGx5IHJldHVybiB0aGUgZGVmYXVsdCBzdHJpbmcuICAqLwotCSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotCSAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKLQkgIHJldHVybiAoY2hhciAqKSBtc2dpZDsKLQl9Ci0KLSAgICAgIHN0cGNweSAoc3RwY3B5IChzdHJjaHIgKGRpcm5hbWUsICdcMCcpLCAiLyIpLCBiaW5kaW5nLT5kaXJuYW1lKTsKLSAgICB9Ci0KLSAgLyogTm93IGRldGVybWluZSB0aGUgc3ltYm9saWMgbmFtZSBvZiBDQVRFR09SWSBhbmQgaXRzIHZhbHVlLiAgKi8KLSAgY2F0ZWdvcnluYW1lID0gY2F0ZWdvcnlfdG9fbmFtZSAoY2F0ZWdvcnkpOwotICBjYXRlZ29yeXZhbHVlID0gZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUpOwotCi0gIHhkb21haW5uYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGNhdGVnb3J5bmFtZSkKLQkJCQkgKyBzdHJsZW4gKGRvbWFpbm5hbWUpICsgNSk7Ci0gIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgeGRvbWFpbm5hbWUpOwotCi0gIHN0cGNweSAoc3RwY3B5IChzdHBjcHkgKHN0cGNweSAoeGRvbWFpbm5hbWUsIGNhdGVnb3J5bmFtZSksICIvIiksCi0JCSAgZG9tYWlubmFtZSksCi0JICAiLm1vIik7Ci0KLSAgLyogQ3JlYXRpbmcgd29ya2luZyBhcmVhLiAgKi8KLSAgc2luZ2xlX2xvY2FsZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChjYXRlZ29yeXZhbHVlKSArIDEpOwotICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHNpbmdsZV9sb2NhbGUpOwotCi0KLSAgLyogU2VhcmNoIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLiAgVGhpcyBpcyBhIGxvb3AgYmVjYXVzZSB3ZSBwZXJoYXBzCi0gICAgIGdvdCBhbiBvcmRlcmVkIGxpc3Qgb2YgbGFuZ3VhZ2VzIHRvIGNvbnNpZGVyIGZvciB0aCB0cmFuc2xhdGlvbi4gICovCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIC8qIE1ha2UgQ0FURUdPUllWQUxVRSBwb2ludCB0byB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0LiAgKi8KLSAgICAgIHdoaWxlIChjYXRlZ29yeXZhbHVlWzBdICE9ICdcMCcgJiYgY2F0ZWdvcnl2YWx1ZVswXSA9PSAnOicpCi0JKytjYXRlZ29yeXZhbHVlOwotICAgICAgaWYgKGNhdGVnb3J5dmFsdWVbMF0gPT0gJ1wwJykKLQl7Ci0JICAvKiBUaGUgd2hvbGUgY29udGVudHMgb2YgQ0FURUdPUllWQUxVRSBoYXMgYmVlbiBzZWFyY2hlZCBidXQKLQkgICAgIG5vIHZhbGlkIGVudHJ5IGhhcyBiZWVuIGZvdW5kLiAgV2Ugc29sdmUgdGhpcyBzaXR1YXRpb24KLQkgICAgIGJ5IGltcGxpY2l0bHkgYXBwZW5kaW5nIGEgIkMiIGVudHJ5LCBpLmUuIG5vIHRyYW5zbGF0aW9uCi0JICAgICB3aWxsIHRha2UgcGxhY2UuICAqLwotCSAgc2luZ2xlX2xvY2FsZVswXSA9ICdDJzsKLQkgIHNpbmdsZV9sb2NhbGVbMV0gPSAnXDAnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICpjcCA9IHNpbmdsZV9sb2NhbGU7Ci0JICB3aGlsZSAoY2F0ZWdvcnl2YWx1ZVswXSAhPSAnXDAnICYmIGNhdGVnb3J5dmFsdWVbMF0gIT0gJzonKQotCSAgICAqY3ArKyA9ICpjYXRlZ29yeXZhbHVlKys7Ci0JICAqY3AgPSAnXDAnOwotCX0KLQotICAgICAgLyogSWYgdGhlIGN1cnJlbnQgbG9jYWxlIHZhbHVlIGlzIEMgKG9yIFBPU0lYKSB3ZSBkb24ndCBsb2FkIGEKLQkgZG9tYWluLiAgUmV0dXJuIHRoZSBNU0dJRC4gICovCi0gICAgICBpZiAoc3RyY21wIChzaW5nbGVfbG9jYWxlLCAiQyIpID09IDAKLQkgIHx8IHN0cmNtcCAoc2luZ2xlX2xvY2FsZSwgIlBPU0lYIikgPT0gMCkKLQl7Ci0JICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7Ci0JICBfX3NldF9lcnJubyAoc2F2ZWRfZXJybm8pOwotCSAgcmV0dXJuIChjaGFyICopIG1zZ2lkOwotCX0KLQotCi0gICAgICAvKiBGaW5kIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGNhdGFsb2cgbWF0Y2hpbmcgdGhlCi0JIERPTUFJTk5BTUUgYW5kIENBVEVHT1JZLiAgKi8KLSAgICAgIGRvbWFpbiA9IF9ubF9maW5kX2RvbWFpbiAoZGlybmFtZSwgc2luZ2xlX2xvY2FsZSwgeGRvbWFpbm5hbWUpOwotCi0gICAgICBpZiAoZG9tYWluICE9IE5VTEwpCi0JewotCSAgcmV0dmFsID0gZmluZF9tc2cgKGRvbWFpbiwgbXNnaWQpOwotCi0JICBpZiAocmV0dmFsID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpbnQgY250OwotCi0JICAgICAgZm9yIChjbnQgPSAwOyBkb21haW4tPnN1Y2Nlc3NvcltjbnRdICE9IE5VTEw7ICsrY250KQotCQl7Ci0JCSAgcmV0dmFsID0gZmluZF9tc2cgKGRvbWFpbi0+c3VjY2Vzc29yW2NudF0sIG1zZ2lkKTsKLQotCQkgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQkJICAgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKHJldHZhbCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotCSAgICAgIF9fc2V0X2Vycm5vIChzYXZlZF9lcnJubyk7Ci0JICAgICAgcmV0dXJuIHJldHZhbDsKLQkgICAgfQotCX0KLSAgICB9Ci0gIC8qIE5PVFJFQUNIRUQgKi8KLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fZGNnZXR0ZXh0LCBkY2dldHRleHQpOwotI2VuZGlmCi0KLQotc3RhdGljIGNoYXIgKgotZmluZF9tc2cgKGRvbWFpbl9maWxlLCBtc2dpZCkKLSAgICAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluX2ZpbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotewotICBzaXplX3QgdG9wLCBhY3QsIGJvdHRvbTsKLSAgc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbjsKLQotICBpZiAoZG9tYWluX2ZpbGUtPmRlY2lkZWQgPT0gMCkKLSAgICBfbmxfbG9hZF9kb21haW4gKGRvbWFpbl9maWxlKTsKLQotICBpZiAoZG9tYWluX2ZpbGUtPmRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBkb21haW4gPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgZG9tYWluX2ZpbGUtPmRhdGE7Ci0KLSAgLyogTG9jYXRlIHRoZSBNU0dJRCBhbmQgaXRzIHRyYW5zbGF0aW9uLiAgKi8KLSAgaWYgKGRvbWFpbi0+aGFzaF9zaXplID4gMiAmJiBkb21haW4tPmhhc2hfdGFiICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVXNlIHRoZSBoYXNoaW5nIHRhYmxlLiAgKi8KLSAgICAgIG5sc191aW50MzIgbGVuID0gc3RybGVuIChtc2dpZCk7Ci0gICAgICBubHNfdWludDMyIGhhc2hfdmFsID0gaGFzaF9zdHJpbmcgKG1zZ2lkKTsKLSAgICAgIG5sc191aW50MzIgaWR4ID0gaGFzaF92YWwgJSBkb21haW4tPmhhc2hfc2l6ZTsKLSAgICAgIG5sc191aW50MzIgaW5jciA9IDEgKyAoaGFzaF92YWwgJSAoZG9tYWluLT5oYXNoX3NpemUgLSAyKSk7Ci0gICAgICBubHNfdWludDMyIG5zdHIgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT5oYXNoX3RhYltpZHhdKTsKLQotICAgICAgaWYgKG5zdHIgPT0gMCkKLQkvKiBIYXNoIHRhYmxlIGVudHJ5IGlzIGVtcHR5LiAgKi8KLQlyZXR1cm4gTlVMTDsKLQotICAgICAgaWYgKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPm9yaWdfdGFiW25zdHIgLSAxXS5sZW5ndGgpID09IGxlbgotCSAgJiYgc3RyY21wIChtc2dpZCwKLQkJICAgICBkb21haW4tPmRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLQkJCQkgICAgICAgZG9tYWluLT5vcmlnX3RhYltuc3RyIC0gMV0ub2Zmc2V0KSkgPT0gMCkKLQlyZXR1cm4gKGNoYXIgKikgZG9tYWluLT5kYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJCSAgZG9tYWluLT50cmFuc190YWJbbnN0ciAtIDFdLm9mZnNldCk7Ci0KLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIGlmIChpZHggPj0gZG9tYWluLT5oYXNoX3NpemUgLSBpbmNyKQotCSAgICBpZHggLT0gZG9tYWluLT5oYXNoX3NpemUgLSBpbmNyOwotCSAgZWxzZQotCSAgICBpZHggKz0gaW5jcjsKLQotCSAgbnN0ciA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPmhhc2hfdGFiW2lkeF0pOwotCSAgaWYgKG5zdHIgPT0gMCkKLQkgICAgLyogSGFzaCB0YWJsZSBlbnRyeSBpcyBlbXB0eS4gICovCi0JICAgIHJldHVybiBOVUxMOwotCi0JICBpZiAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+b3JpZ190YWJbbnN0ciAtIDFdLmxlbmd0aCkgPT0gbGVuCi0JICAgICAgJiYgc3RyY21wIChtc2dpZCwKLQkJCSBkb21haW4tPmRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLQkJCQkJICAgZG9tYWluLT5vcmlnX3RhYltuc3RyIC0gMV0ub2Zmc2V0KSkKLQkgICAgICAgICA9PSAwKQotCSAgICByZXR1cm4gKGNoYXIgKikgZG9tYWluLT5kYXRhCi0JICAgICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT50cmFuc190YWJbbnN0ciAtIDFdLm9mZnNldCk7Ci0JfQotICAgICAgLyogTk9UUkVBQ0hFRCAqLwotICAgIH0KLQotICAvKiBOb3cgd2UgdHJ5IHRoZSBkZWZhdWx0IG1ldGhvZDogIGJpbmFyeSBzZWFyY2ggaW4gdGhlIHNvcnRlZAotICAgICBhcnJheSBvZiBtZXNzYWdlcy4gICovCi0gIGJvdHRvbSA9IDA7Ci0gIHRvcCA9IGRvbWFpbi0+bnN0cmluZ3M7Ci0gIHdoaWxlIChib3R0b20gPCB0b3ApCi0gICAgewotICAgICAgaW50IGNtcF92YWw7Ci0KLSAgICAgIGFjdCA9IChib3R0b20gKyB0b3ApIC8gMjsKLSAgICAgIGNtcF92YWwgPSBzdHJjbXAgKG1zZ2lkLCBkb21haW4tPmRhdGEKLQkJCSAgICAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotCQkJCSAgICBkb21haW4tPm9yaWdfdGFiW2FjdF0ub2Zmc2V0KSk7Ci0gICAgICBpZiAoY21wX3ZhbCA8IDApCi0JdG9wID0gYWN0OwotICAgICAgZWxzZSBpZiAoY21wX3ZhbCA+IDApCi0JYm90dG9tID0gYWN0ICsgMTsKLSAgICAgIGVsc2UKLQlicmVhazsKLSAgICB9Ci0KLSAgLyogSWYgYW4gdHJhbnNsYXRpb24gaXMgZm91bmQgcmV0dXJuIHRoaXMuICAqLwotICByZXR1cm4gYm90dG9tID49IHRvcCA/IE5VTEwgOiAoY2hhciAqKSBkb21haW4tPmRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLQkJCQkgICAgIGRvbWFpbi0+dHJhbnNfdGFiW2FjdF0ub2Zmc2V0KTsKLX0KLQotCi0vKiBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGxvY2FsZSBDQVRFR09SWS4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi1jYXRlZ29yeV90b19uYW1lIChjYXRlZ29yeSkKLSAgICAgaW50IGNhdGVnb3J5OwotewotICBjb25zdCBjaGFyICpyZXR2YWw7Ci0KLSAgc3dpdGNoIChjYXRlZ29yeSkKLSAgewotI2lmZGVmIExDX0NPTExBVEUKLSAgY2FzZSBMQ19DT0xMQVRFOgotICAgIHJldHZhbCA9ICJMQ19DT0xMQVRFIjsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIExDX0NUWVBFCi0gIGNhc2UgTENfQ1RZUEU6Ci0gICAgcmV0dmFsID0gIkxDX0NUWVBFIjsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIExDX01PTkVUQVJZCi0gIGNhc2UgTENfTU9ORVRBUlk6Ci0gICAgcmV0dmFsID0gIkxDX01PTkVUQVJZIjsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIExDX05VTUVSSUMKLSAgY2FzZSBMQ19OVU1FUklDOgotICAgIHJldHZhbCA9ICJMQ19OVU1FUklDIjsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIExDX1RJTUUKLSAgY2FzZSBMQ19USU1FOgotICAgIHJldHZhbCA9ICJMQ19USU1FIjsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIExDX01FU1NBR0VTCi0gIGNhc2UgTENfTUVTU0FHRVM6Ci0gICAgcmV0dmFsID0gIkxDX01FU1NBR0VTIjsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIExDX1JFU1BPTlNFCi0gIGNhc2UgTENfUkVTUE9OU0U6Ci0gICAgcmV0dmFsID0gIkxDX1JFU1BPTlNFIjsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIExDX0FMTAotICBjYXNlIExDX0FMTDoKLSAgICAvKiBUaGlzIG1pZ2h0IG5vdCBtYWtlIHNlbnNlIGJ1dCBpcyBwZXJoYXBzIGJldHRlciB0aGFuIGFueSBvdGhlcgotICAgICAgIHZhbHVlLiAgKi8KLSAgICByZXR2YWwgPSAiTENfQUxMIjsKLSAgICBicmVhazsKLSNlbmRpZgotICBkZWZhdWx0OgotICAgIC8qIElmIHlvdSBoYXZlIGEgYmV0dGVyIGlkZWEgZm9yIGEgZGVmYXVsdCB2YWx1ZSBsZXQgbWUga25vdy4gICovCi0gICAgcmV0dmFsID0gIkxDX1hYWCI7Ci0gIH0KLQotICByZXR1cm4gcmV0dmFsOwotfQotCi0vKiBHdWVzcyB2YWx1ZSBvZiBjdXJyZW50IGxvY2FsZSBmcm9tIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUpCi0gICAgIGludCBjYXRlZ29yeTsKLSAgICAgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lOwotewotICBjb25zdCBjaGFyICpyZXR2YWw7Ci0KLSAgLyogVGhlIGhpZ2hlc3QgcHJpb3JpdHkgdmFsdWUgaXMgdGhlIGBMQU5HVUFHRScgZW52aXJvbm1lbnQKLSAgICAgdmFyaWFibGUuICBUaGlzIGlzIGEgR05VIGV4dGVuc2lvbi4gICovCi0gIHJldHZhbCA9IGdldGVudiAoIkxBTkdVQUdFIik7Ci0gIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKLSAgICByZXR1cm4gcmV0dmFsOwotCi0gIC8qIGBMQU5HVUFHRScgaXMgbm90IHNldC4gIFNvIHdlIGhhdmUgdG8gcHJvY2VlZCB3aXRoIHRoZSBQT1NJWAotICAgICBtZXRob2RzIG9mIGxvb2tpbmcgdG8gYExDX0FMTCcsIGBMQ194eHgnLCBhbmQgYExBTkcnLiAgT24gc29tZQotICAgICBzeXN0ZW1zIHRoaXMgY2FuIGJlIGRvbmUgYnkgdGhlIGBzZXRsb2NhbGUnIGZ1bmN0aW9uIGl0c2VsZi4gICovCi0jaWYgZGVmaW5lZCBIQVZFX1NFVExPQ0FMRSAmJiBkZWZpbmVkIEhBVkVfTENfTUVTU0FHRVMgJiYgZGVmaW5lZCBIQVZFX0xPQ0FMRV9OVUxMCi0gIHJldHVybiBzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKTsKLSNlbHNlCi0gIC8qIFNldHRpbmcgb2YgTENfQUxMIG92ZXJ3cml0ZXMgYWxsIG90aGVyLiAgKi8KLSAgcmV0dmFsID0gZ2V0ZW52ICgiTENfQUxMIik7Ci0gIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKLSAgICByZXR1cm4gcmV0dmFsOwotCi0gIC8qIE5leHQgY29tZXMgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgY2F0ZWdvcnkuICAqLwotICByZXR2YWwgPSBnZXRlbnYgKGNhdGVnb3J5bmFtZSk7Ci0gIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKLSAgICByZXR1cm4gcmV0dmFsOwotCi0gIC8qIExhc3QgcG9zc2liaWxpdHkgaXMgdGhlIExBTkcgZW52aXJvbm1lbnQgdmFyaWFibGUuICAqLwotICByZXR2YWwgPSBnZXRlbnYgKCJMQU5HIik7Ci0gIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKLSAgICByZXR1cm4gcmV0dmFsOwotCi0gIC8qIFdlIHVzZSBDIGFzIHRoZSBkZWZhdWx0IGRvbWFpbi4gIFBPU0lYIHNheXMgdGhpcyBpcyBpbXBsZW1lbnRhdGlvbgotICAgICBkZWZpbmVkLiAgKi8KLSAgcmV0dXJuICJDIjsKLSNlbmRpZgotfQotCi0vKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KLQotLyogV2UgZG9uJ3Qgd2FudCBsaWJpbnRsLmEgdG8gZGVwZW5kIG9uIGFueSBvdGhlciBsaWJyYXJ5LiAgU28gd2UKLSAgIGF2b2lkIHRoZSBub24tc3RhbmRhcmQgZnVuY3Rpb24gc3RwY3B5LiAgSW4gR05VIEMgTGlicmFyeSB0aGlzCi0gICBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIHRob3VnaC4gIEFsc28gYWxsb3cgdGhlIHN5bWJvbCBIQVZFX1NUUENQWQotICAgdG8gYmUgZGVmaW5lZC4gICovCi0jaWYgIV9MSUJDICYmICFIQVZFX1NUUENQWQotc3RhdGljIGNoYXIgKgotc3RwY3B5IChkZXN0LCBzcmMpCi0gICAgIGNoYXIgKmRlc3Q7Ci0gICAgIGNvbnN0IGNoYXIgKnNyYzsKLXsKLSAgd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSAhPSAnXDAnKQotICAgIC8qIERvIG5vdGhpbmcuICovIDsKLSAgcmV0dXJuIGRlc3QgLSAxOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2RnZXR0ZXh0LmMgYi9pbnRsL2RnZXR0ZXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZGU2NzcuLjAwMDAwMDAKLS0tIGEvaW50bC9kZ2V0dGV4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogZGdldHRleHQuYyAtLSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGdldHRleHQoMykgZnVuY3Rpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfTE9DQUxFX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxsb2NhbGUuaD4KLSNlbmRpZgotCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBER0VUVEVYVCBfX2RnZXR0ZXh0Ci0jIGRlZmluZSBEQ0dFVFRFWFQgX19kY2dldHRleHQKLSNlbHNlCi0jIGRlZmluZSBER0VUVEVYVCBkZ2V0dGV4dF9fCi0jIGRlZmluZSBEQ0dFVFRFWFQgZGNnZXR0ZXh0X18KLSNlbmRpZgotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBvZiB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KLWNoYXIgKgotREdFVFRFWFQgKGRvbWFpbm5hbWUsIG1zZ2lkKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotICAgICBjb25zdCBjaGFyICptc2dpZDsKLXsKLSAgcmV0dXJuIERDR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQsIExDX01FU1NBR0VTKTsKLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fZGdldHRleHQsIGRnZXR0ZXh0KTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9leHBsb2RlbmFtZS5jIGIvaW50bC9leHBsb2RlbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2M0NmU5Li4wMDAwMDAwCi0tLSBhL2ludGwvZXhwbG9kZW5hbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgImxvYWRpbmZvLmgiCi0KLS8qIE9uIHNvbWUgc3RyYW5nZSBzeXN0ZW1zIHN0aWxsIG5vIGRlZmluaXRpb24gb2YgTlVMTCBpcyBmb3VuZC4gIFNpZ2ghICAqLwotI2lmbmRlZiBOVUxMCi0jIGlmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLSMgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQotIyBlbHNlCi0jICBkZWZpbmUgTlVMTCAwCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi1pbnQKLV9ubF9leHBsb2RlX25hbWUgKG5hbWUsIGxhbmd1YWdlLCBtb2RpZmllciwgdGVycml0b3J5LCBjb2Rlc2V0LAotCQkgIG5vcm1hbGl6ZWRfY29kZXNldCwgc3BlY2lhbCwgc3BvbnNvciwgcmV2aXNpb24pCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKipsYW5ndWFnZTsKLSAgICAgY29uc3QgY2hhciAqKm1vZGlmaWVyOwotICAgICBjb25zdCBjaGFyICoqdGVycml0b3J5OwotICAgICBjb25zdCBjaGFyICoqY29kZXNldDsKLSAgICAgY29uc3QgY2hhciAqKm5vcm1hbGl6ZWRfY29kZXNldDsKLSAgICAgY29uc3QgY2hhciAqKnNwZWNpYWw7Ci0gICAgIGNvbnN0IGNoYXIgKipzcG9uc29yOwotICAgICBjb25zdCBjaGFyICoqcmV2aXNpb247Ci17Ci0gIGVudW0geyB1bmRlY2lkZWQsIHhwZywgY2VuIH0gc3ludGF4OwotICBjaGFyICpjcDsKLSAgaW50IG1hc2s7Ci0KLSAgKm1vZGlmaWVyID0gTlVMTDsKLSAgKnRlcnJpdG9yeSA9IE5VTEw7Ci0gICpjb2Rlc2V0ID0gTlVMTDsKLSAgKm5vcm1hbGl6ZWRfY29kZXNldCA9IE5VTEw7Ci0gICpzcGVjaWFsID0gTlVMTDsKLSAgKnNwb25zb3IgPSBOVUxMOwotICAqcmV2aXNpb24gPSBOVUxMOwotCi0gIC8qIE5vdyB3ZSBkZXRlcm1pbmUgdGhlIHNpbmdsZSBwYXJ0cyBvZiB0aGUgbG9jYWxlIG5hbWUuICBGaXJzdAotICAgICBsb29rIGZvciB0aGUgbGFuZ3VhZ2UuICBUZXJtaW5hdGlvbiBzeW1ib2xzIGFyZSBgXycgYW5kIGBAJyBpZgotICAgICB3ZSB1c2UgWFBHNCBzdHlsZSwgYW5kIGBfJywgYCsnLCBhbmQgYCwnIGlmIHdlIHVzZSBDRU4gc3ludGF4LiAgKi8KLSAgbWFzayA9IDA7Ci0gIHN5bnRheCA9IHVuZGVjaWRlZDsKLSAgKmxhbmd1YWdlID0gY3AgPSBuYW1lOwotICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnXycgJiYgY3BbMF0gIT0gJ0AnCi0JICYmIGNwWzBdICE9ICcrJyAmJiBjcFswXSAhPSAnLCcpCi0gICAgKytjcDsKLQotICBpZiAoKmxhbmd1YWdlID09IGNwKQotICAgIC8qIFRoaXMgZG9lcyBub3QgbWFrZSBzZW5zZTogbGFuZ3VhZ2UgaGFzIHRvIGJlIHNwZWNpZmllZC4gIFVzZQotICAgICAgIHRoaXMgZW50cnkgYXMgaXQgaXMgd2l0aG91dCBleHBsb2RpbmcuICBQZXJoYXBzIGl0IGlzIGFuIGFsaWFzLiAgKi8KLSAgICBjcCA9IHN0cmNociAoKmxhbmd1YWdlLCAnXDAnKTsKLSAgZWxzZSBpZiAoY3BbMF0gPT0gJ18nKQotICAgIHsKLSAgICAgIC8qIE5leHQgaXMgdGhlIHRlcnJpdG9yeS4gICovCi0gICAgICBjcFswXSA9ICdcMCc7Ci0gICAgICAqdGVycml0b3J5ID0gKytjcDsKLQotICAgICAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJy4nICYmIGNwWzBdICE9ICdAJwotCSAgICAgJiYgY3BbMF0gIT0gJysnICYmIGNwWzBdICE9ICcsJyAmJiBjcFswXSAhPSAnXycpCi0JKytjcDsKLQotICAgICAgbWFzayB8PSBURVJSSVRPUlk7Ci0KLSAgICAgIGlmIChjcFswXSA9PSAnLicpCi0JewotCSAgLyogTmV4dCBpcyB0aGUgY29kZXNldC4gICovCi0JICBzeW50YXggPSB4cGc7Ci0JICBjcFswXSA9ICdcMCc7Ci0JICAqY29kZXNldCA9ICsrY3A7Ci0KLQkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICdAJykKLQkgICAgKytjcDsKLQotCSAgbWFzayB8PSBYUEdfQ09ERVNFVDsKLQotCSAgaWYgKCpjb2Rlc2V0ICE9IGNwICYmICgqY29kZXNldClbMF0gIT0gJ1wwJykKLQkgICAgewotCSAgICAgICpub3JtYWxpemVkX2NvZGVzZXQgPSBfbmxfbm9ybWFsaXplX2NvZGVzZXQgKCpjb2Rlc2V0LAotCQkJCQkJCSAgIGNwIC0gKmNvZGVzZXQpOwotCSAgICAgIGlmIChzdHJjbXAgKCpjb2Rlc2V0LCAqbm9ybWFsaXplZF9jb2Rlc2V0KSA9PSAwKQotCQlmcmVlICgoY2hhciAqKSAqbm9ybWFsaXplZF9jb2Rlc2V0KTsKLQkgICAgICBlbHNlCi0JCW1hc2sgfD0gWFBHX05PUk1fQ09ERVNFVDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGNwWzBdID09ICdAJyB8fCAoc3ludGF4ICE9IHhwZyAmJiBjcFswXSA9PSAnKycpKQotICAgIHsKLSAgICAgIC8qIE5leHQgaXMgdGhlIG1vZGlmaWVyLiAgKi8KLSAgICAgIHN5bnRheCA9IGNwWzBdID09ICdAJyA/IHhwZyA6IGNlbjsKLSAgICAgIGNwWzBdID0gJ1wwJzsKLSAgICAgICptb2RpZmllciA9ICsrY3A7Ci0KLSAgICAgIHdoaWxlIChzeW50YXggPT0gY2VuICYmIGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJysnCi0JICAgICAmJiBjcFswXSAhPSAnLCcgJiYgY3BbMF0gIT0gJ18nKQotCSsrY3A7Ci0KLSAgICAgIG1hc2sgfD0gWFBHX01PRElGSUVSIHwgQ0VOX0FVRElFTkNFOwotICAgIH0KLQotICBpZiAoc3ludGF4ICE9IHhwZyAmJiAoY3BbMF0gPT0gJysnIHx8IGNwWzBdID09ICcsJyB8fCBjcFswXSA9PSAnXycpKQotICAgIHsKLSAgICAgIHN5bnRheCA9IGNlbjsKLQotICAgICAgaWYgKGNwWzBdID09ICcrJykKLQl7Ci0gCSAgLyogTmV4dCBpcyBzcGVjaWFsIGFwcGxpY2F0aW9uIChDRU4gc3ludGF4KS4gICovCi0JICBjcFswXSA9ICdcMCc7Ci0JICAqc3BlY2lhbCA9ICsrY3A7Ci0KLQkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcsJyAmJiBjcFswXSAhPSAnXycpCi0JICAgICsrY3A7Ci0KLQkgIG1hc2sgfD0gQ0VOX1NQRUNJQUw7Ci0JfQotCi0gICAgICBpZiAoY3BbMF0gPT0gJywnKQotCXsKLSAJICAvKiBOZXh0IGlzIHNwb25zb3IgKENFTiBzeW50YXgpLiAgKi8KLQkgIGNwWzBdID0gJ1wwJzsKLQkgICpzcG9uc29yID0gKytjcDsKLQotCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJ18nKQotCSAgICArK2NwOwotCi0JICBtYXNrIHw9IENFTl9TUE9OU09SOwotCX0KLQotICAgICAgaWYgKGNwWzBdID09ICdfJykKLQl7Ci0gCSAgLyogTmV4dCBpcyByZXZpc2lvbiAoQ0VOIHN5bnRheCkuICAqLwotCSAgY3BbMF0gPSAnXDAnOwotCSAgKnJldmlzaW9uID0gKytjcDsKLQotCSAgbWFzayB8PSBDRU5fUkVWSVNJT047Ci0JfQotICAgIH0KLQotICAvKiBGb3IgQ0VOIHN5bnRheCB2YWx1ZXMgaXQgbWlnaHQgYmUgaW1wb3J0YW50IHRvIGhhdmUgdGhlCi0gICAgIHNlcGFyYXRvciBjaGFyYWN0ZXIgaW4gdGhlIGZpbGUgbmFtZSwgbm90IGZvciBYUEcgc3ludGF4LiAgKi8KLSAgaWYgKHN5bnRheCA9PSB4cGcpCi0gICAgewotICAgICAgaWYgKCp0ZXJyaXRvcnkgIT0gTlVMTCAmJiAoKnRlcnJpdG9yeSlbMF0gPT0gJ1wwJykKLQltYXNrICY9IH5URVJSSVRPUlk7Ci0KLSAgICAgIGlmICgqY29kZXNldCAhPSBOVUxMICYmICgqY29kZXNldClbMF0gPT0gJ1wwJykKLQltYXNrICY9IH5YUEdfQ09ERVNFVDsKLQotICAgICAgaWYgKCptb2RpZmllciAhPSBOVUxMICYmICgqbW9kaWZpZXIpWzBdID09ICdcMCcpCi0JbWFzayAmPSB+WFBHX01PRElGSUVSOwotICAgIH0KLQotICByZXR1cm4gbWFzazsKLX0KZGlmZiAtLWdpdCBhL2ludGwvZmluZGRvbWFpbi5jIGIvaW50bC9maW5kZG9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjODVkNGQuLjAwMDAwMDAKLS0tIGEvaW50bC9maW5kZG9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyogSGFuZGxlIGxpc3Qgb2YgbmVlZGVkIG1lc3NhZ2UgY2F0YWxvZ3MKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLSMgaWZkZWYgSEFWRV9NQUxMT0NfSAotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jIGVsc2UKLXZvaWQgZnJlZSAoKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jIGlmbmRlZiBtZW1jcHkKLSMgIGRlZmluZSBtZW1jcHkoRHN0LCBTcmMsIE51bSkgYmNvcHkgKFNyYywgRHN0LCBOdW0pCi0jIGVuZGlmCi0jZW5kaWYKLSNpZiAhSEFWRV9TVFJDSFIgJiYgIWRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIHN0cmNocgotIyAgZGVmaW5lIHN0cmNociBpbmRleAotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiZ2V0dGV4dC5oIgotI2luY2x1ZGUgImdldHRleHRQLmgiCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLS8qIExpc3Qgb2YgYWxyZWFkeSBsb2FkZWQgZG9tYWlucy4gICovCi1zdGF0aWMgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX25sX2xvYWRlZF9kb21haW5zOwotCi0KLS8qIFJldHVybiBhIGRhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZyBkZXNjcmliZWQgYnkKLSAgIHRoZSBET01BSU5OQU1FIGFuZCBDQVRFR09SWSBwYXJhbWV0ZXJzIHdpdGggcmVzcGVjdCB0byB0aGUgY3VycmVudGx5Ci0gICBlc3RhYmxpc2hlZCBiaW5kaW5ncy4gICovCi1zdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKLV9ubF9maW5kX2RvbWFpbiAoZGlybmFtZSwgbG9jYWxlLCBkb21haW5uYW1lKQotICAgICBjb25zdCBjaGFyICpkaXJuYW1lOwotICAgICBjaGFyICpsb2NhbGU7Ci0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci17Ci0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnJldHZhbDsKLSAgY29uc3QgY2hhciAqbGFuZ3VhZ2U7Ci0gIGNvbnN0IGNoYXIgKm1vZGlmaWVyOwotICBjb25zdCBjaGFyICp0ZXJyaXRvcnk7Ci0gIGNvbnN0IGNoYXIgKmNvZGVzZXQ7Ci0gIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZWRfY29kZXNldDsKLSAgY29uc3QgY2hhciAqc3BlY2lhbDsKLSAgY29uc3QgY2hhciAqc3BvbnNvcjsKLSAgY29uc3QgY2hhciAqcmV2aXNpb247Ci0gIGNvbnN0IGNoYXIgKmFsaWFzX3ZhbHVlOwotICBpbnQgbWFzazsKLQotICAvKiBMT0NBTEUgY2FuIGNvbnNpc3Qgb2YgdXAgdG8gZm91ciByZWNvZ25pemVkIHBhcnRzIGZvciB0aGUgWFBHIHN5bnRheDoKLQotCQlsYW5ndWFnZVtfdGVycml0b3J5Wy5jb2Rlc2V0XV1bQG1vZGlmaWVyXQotCi0gICAgIGFuZCBzaXggcGFydHMgZm9yIHRoZSBDRU4gc3ludGF4OgotCi0JbGFuZ3VhZ2VbX3RlcnJpdG9yeV1bK2F1ZGllbmNlXVsrc3BlY2lhbF1bLFtzcG9uc29yXVtfcmV2aXNpb25dXQotCi0gICAgIEJlc2lkZSB0aGUgZmlyc3QgYWxsIG9mIHRoZW0gYXJlIGFsbG93ZWQgdG8gYmUgbWlzc2luZy4gIElmIHRoZQotICAgICBmdWxsIHNwZWNpZmllZCBsb2NhbGUgaXMgbm90IGZvdW5kLCB0aGUgbGVzcyBzcGVjaWZpYyBvbmUgYXJlCi0gICAgIGxvb2tlZCBmb3IuICBUaGUgdmFyaW91cyBwYXJ0IHdpbGwgYmUgc3RyaXBwZWQgb2YgYWNjb3JkaW5nIHRvCi0gICAgIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0JCSgxKSByZXZpc2lvbgotCQkoMikgc3BvbnNvcgotCQkoMykgc3BlY2lhbAotCQkoNCkgY29kZXNldAotCQkoNSkgbm9ybWFsaXplZCBjb2Rlc2V0Ci0JCSg2KSB0ZXJyaXRvcnkKLQkJKDcpIGF1ZGllbmNlL21vZGlmaWVyCi0gICAqLwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSB0ZXN0ZWQgZm9yIHRoaXMgbG9jYWxlIGVudHJ5IHRoZXJlIGhhcyB0bwotICAgICBiZSBvbmUgZGF0YSBzZXQgaW4gdGhlIGxpc3Qgb2YgbG9hZGVkIGRvbWFpbnMuICAqLwotICByZXR2YWwgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKCZfbmxfbG9hZGVkX2RvbWFpbnMsIGRpcm5hbWUsCi0JCQkgICAgICAgc3RybGVuIChkaXJuYW1lKSArIDEsIDAsIGxvY2FsZSwgTlVMTCwgTlVMTCwKLQkJCSAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBkb21haW5uYW1lLCAwKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGtub3cgc29tZXRoaW5nIGFib3V0IHRoaXMgbG9jYWxlLiAgKi8KLSAgICAgIGludCBjbnQ7Ci0KLSAgICAgIGlmIChyZXR2YWwtPmRlY2lkZWQgPT0gMCkKLQlfbmxfbG9hZF9kb21haW4gKHJldHZhbCk7Ci0KLSAgICAgIGlmIChyZXR2YWwtPmRhdGEgIT0gTlVMTCkKLQlyZXR1cm4gcmV0dmFsOwotCi0gICAgICBmb3IgKGNudCA9IDA7IHJldHZhbC0+c3VjY2Vzc29yW2NudF0gIT0gTlVMTDsgKytjbnQpCi0JewotCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRlY2lkZWQgPT0gMCkKLQkgICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdKTsKLQotCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRhdGEgIT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgcmV0dXJuIGNudCA+PSAwID8gcmV0dmFsIDogTlVMTDsKLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KLSAgICB9Ci0KLSAgLyogU2VlIHdoZXRoZXIgdGhlIGxvY2FsZSB2YWx1ZSBpcyBhbiBhbGlhcy4gIElmIHllcyBpdHMgdmFsdWUKLSAgICAgKm92ZXJ3cml0ZXMqIHRoZSBhbGlhcyBuYW1lLiAgTm8gdGVzdCBmb3IgdGhlIG9yaWdpbmFsIHZhbHVlIGlzCi0gICAgIGRvbmUuICAqLwotICBhbGlhc192YWx1ZSA9IF9ubF9leHBhbmRfYWxpYXMgKGxvY2FsZSk7Ci0gIGlmIChhbGlhc192YWx1ZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGFsaWFzX3ZhbHVlKSArIDE7Ci0gICAgICBsb2NhbGUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0gICAgICBpZiAobG9jYWxlID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIG1lbWNweSAobG9jYWxlLCBhbGlhc192YWx1ZSwgbGVuKTsKLSAgICB9Ci0KLSAgLyogTm93IHdlIGRldGVybWluZSB0aGUgc2luZ2xlIHBhcnRzIG9mIHRoZSBsb2NhbGUgbmFtZS4gIEZpcnN0Ci0gICAgIGxvb2sgZm9yIHRoZSBsYW5ndWFnZS4gIFRlcm1pbmF0aW9uIHN5bWJvbHMgYXJlIGBfJyBhbmQgYEAnIGlmCi0gICAgIHdlIHVzZSBYUEc0IHN0eWxlLCBhbmQgYF8nLCBgKycsIGFuZCBgLCcgaWYgd2UgdXNlIENFTiBzeW50YXguICAqLwotICBtYXNrID0gX25sX2V4cGxvZGVfbmFtZSAobG9jYWxlLCAmbGFuZ3VhZ2UsICZtb2RpZmllciwgJnRlcnJpdG9yeSwKLQkJCSAgICZjb2Rlc2V0LCAmbm9ybWFsaXplZF9jb2Rlc2V0LCAmc3BlY2lhbCwKLQkJCSAgICZzcG9uc29yLCAmcmV2aXNpb24pOwotCi0gIC8qIENyZWF0ZSBhbGwgcG9zc2libGUgbG9jYWxlIGVudHJpZXMgd2hpY2ggbWlnaHQgYmUgaW50ZXJlc3RlZCBpbgotICAgICBnZW5lcmFsaXphdGlvbi4gICovCi0gIHJldHZhbCA9IF9ubF9tYWtlX2wxMG5mbGlzdCAoJl9ubF9sb2FkZWRfZG9tYWlucywgZGlybmFtZSwKLQkJCSAgICAgICBzdHJsZW4gKGRpcm5hbWUpICsgMSwgbWFzaywgbGFuZ3VhZ2UsIHRlcnJpdG9yeSwKLQkJCSAgICAgICBjb2Rlc2V0LCBub3JtYWxpemVkX2NvZGVzZXQsIG1vZGlmaWVyLCBzcGVjaWFsLAotCQkJICAgICAgIHNwb25zb3IsIHJldmlzaW9uLCBkb21haW5uYW1lLCAxKTsKLSAgaWYgKHJldHZhbCA9PSBOVUxMKQotICAgIC8qIFRoaXMgbWVhbnMgd2UgYXJlIG91dCBvZiBjb3JlLiAgKi8KLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAocmV0dmFsLT5kZWNpZGVkID09IDApCi0gICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwpOwotICBpZiAocmV0dmFsLT5kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgaW50IGNudDsKLSAgICAgIGZvciAoY250ID0gMDsgcmV0dmFsLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKLQl7Ci0JICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGVjaWRlZCA9PSAwKQotCSAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbC0+c3VjY2Vzc29yW2NudF0pOwotCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRhdGEgIT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgcm9vbSBmb3IgYW4gYWxpYXMgd2FzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gIEZyZWUgaXQgbm93LiAgKi8KLSAgaWYgKGFsaWFzX3ZhbHVlICE9IE5VTEwpCi0gICAgZnJlZSAobG9jYWxlKTsKLQotICByZXR1cm4gcmV0dmFsOwotfQpkaWZmIC0tZ2l0IGEvaW50bC9nZXR0ZXh0LmMgYi9pbnRsL2dldHRleHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzNmQyMS4uMDAwMDAwMAotLS0gYS9pbnRsL2dldHRleHQuYworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIGdldHRleHQoMykgZnVuY3Rpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBfX25lZWRfTlVMTAotIyBpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jIGlmZGVmIFNURENfSEVBREVSUwotIyAgaW5jbHVkZSA8c3RkbGliLmg+CQkvKiBKdXN0IGZvciBOVUxMLiAgKi8KLSMgZWxzZQotIyAgaWZkZWYgSEFWRV9TVFJJTkdfSAotIyAgIGluY2x1ZGUgPHN0cmluZy5oPgotIyAgZWxzZQotIyAgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBHRVRURVhUIF9fZ2V0dGV4dAotIyBkZWZpbmUgREdFVFRFWFQgX19kZ2V0dGV4dAotI2Vsc2UKLSMgZGVmaW5lIEdFVFRFWFQgZ2V0dGV4dF9fCi0jIGRlZmluZSBER0VUVEVYVCBkZ2V0dGV4dF9fCi0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0Ci0gICB0ZXh0KS4gICovCi1jaGFyICoKLUdFVFRFWFQgKG1zZ2lkKQotICAgICBjb25zdCBjaGFyICptc2dpZDsKLXsKLSAgcmV0dXJuIERHRVRURVhUIChOVUxMLCBtc2dpZCk7Ci19Ci0KLSNpZmRlZiBfTElCQwotLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi13ZWFrX2FsaWFzIChfX2dldHRleHQsIGdldHRleHQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2dldHRleHQuaCBiL2ludGwvZ2V0dGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjRiOWUzLi4wMDAwMDAwCi0tLSBhL2ludGwvZ2V0dGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qIEludGVybmFsIGhlYWRlciBmb3IgR05VIGdldHRleHQgaW50ZXJuYXRpb25hbGl6YXRpb24gZnVuY3Rpb25zCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLSAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfR0VUVEVYVF9ICi0jZGVmaW5lIF9HRVRURVhUX0ggMQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmIEhBVkVfTElNSVRTX0ggfHwgX0xJQkMKLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBUaGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBHTlUgbWVzc2FnZSBjYXRhbG9nIGZvcm1hdC4gICovCi0jZGVmaW5lIF9NQUdJQyAweDk1MDQxMmRlCi0jZGVmaW5lIF9NQUdJQ19TV0FQUEVEIDB4ZGUxMjA0OTUKLQotLyogUmV2aXNpb24gbnVtYmVyIG9mIHRoZSBjdXJyZW50bHkgdXNlZCAubW8gKGJpbmFyeSkgZmlsZSBmb3JtYXQuICAqLwotI2RlZmluZSBNT19SRVZJU0lPTl9OVU1CRVIgMAotCi0vKiBUaGUgZm9sbG93aW5nIGNvbnRvcnRpb25zIGFyZSBhbiBhdHRlbXB0IHRvIHVzZSB0aGUgQyBwcmVwcm9jZXNzb3IKLSAgIHRvIGRldGVybWluZSBhbiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlIHRoYXQgaXMgMzIgYml0cyB3aWRlLiAgQW4KLSAgIGFsdGVybmF0aXZlIGFwcHJvYWNoIGlzIHRvIHVzZSBhdXRvY29uZidzIEFDX0NIRUNLX1NJWkVPRiBtYWNybywgYnV0Ci0gICBkb2luZyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBjb21waWxlIGFuZCAqcnVuKgotICAgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlLiAgTG9jYWxseSBydW5uaW5nIGNyb3NzLWNvbXBpbGVkIGV4ZWN1dGFibGVzCi0gICBpcyB1c3VhbGx5IG5vdCBwb3NzaWJsZS4gICovCi0KLSNpZiBfX1NURENfXwotIyBkZWZpbmUgVUlOVF9NQVhfMzJfQklUUyA0Mjk0OTY3Mjk1VQotI2Vsc2UKLSMgZGVmaW5lIFVJTlRfTUFYXzMyX0JJVFMgMHhGRkZGRkZGRgotI2VuZGlmCi0KLS8qIElmIFVJTlRfTUFYIGlzbid0IGRlZmluZWQsIGFzc3VtZSBpdCdzIGEgMzItYml0IHR5cGUuCi0gICBUaGlzIHNob3VsZCBiZSB2YWxpZCBmb3IgYWxsIHN5c3RlbXMgR05VIGNhcmVzIGFib3V0IGJlY2F1c2UKLSAgIHRoYXQgZG9lc24ndCBpbmNsdWRlIDE2LWJpdCBzeXN0ZW1zLCBhbmQgb25seSBtb2Rlcm4gc3lzdGVtcwotICAgKHRoYXQgY2VydGFpbmx5IGhhdmUgPGxpbWl0cy5oPikgaGF2ZSA2NCstYml0IGludGVncmFsIHR5cGVzLiAgKi8KLQotI2lmbmRlZiBVSU5UX01BWAotIyBkZWZpbmUgVUlOVF9NQVggVUlOVF9NQVhfMzJfQklUUwotI2VuZGlmCi0KLSNpZiBVSU5UX01BWCA9PSBVSU5UX01BWF8zMl9CSVRTCi10eXBlZGVmIHVuc2lnbmVkIG5sc191aW50MzI7Ci0jZWxzZQotIyBpZiBVU0hSVF9NQVggPT0gVUlOVF9NQVhfMzJfQklUUwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBubHNfdWludDMyOwotIyBlbHNlCi0jICBpZiBVTE9OR19NQVggPT0gVUlOVF9NQVhfMzJfQklUUwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIG5sc191aW50MzI7Ci0jICBlbHNlCi0gIC8qIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBpbnRlbmRlZCB0byB0aHJvdyBhbiBlcnJvci4gIFVzaW5nICNlcnJvciBpcwotICAgICBub3QgcG9ydGFibGUgZW5vdWdoLiAgKi8KLSAgIkNhbm5vdCBkZXRlcm1pbmUgdW5zaWduZWQgMzItYml0IGRhdGEgdHlwZS4iCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLQotLyogSGVhZGVyIGZvciBiaW5hcnkgLm1vIGZpbGUgZm9ybWF0LiAgKi8KLXN0cnVjdCBtb19maWxlX2hlYWRlcgotewotICAvKiBUaGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgbmxzX3VpbnQzMiBtYWdpYzsKLSAgLyogVGhlIHJldmlzaW9uIG51bWJlciBvZiB0aGUgZmlsZSBmb3JtYXQuICAqLwotICBubHNfdWludDMyIHJldmlzaW9uOwotICAvKiBUaGUgbnVtYmVyIG9mIHN0cmluZ3MgcGFpcnMuICAqLwotICBubHNfdWludDMyIG5zdHJpbmdzOwotICAvKiBPZmZzZXQgb2YgdGFibGUgd2l0aCBzdGFydCBvZmZzZXRzIG9mIG9yaWdpbmFsIHN0cmluZ3MuICAqLwotICBubHNfdWludDMyIG9yaWdfdGFiX29mZnNldDsKLSAgLyogT2Zmc2V0IG9mIHRhYmxlIHdpdGggc3RhcnQgb2Zmc2V0cyBvZiB0cmFuc2xhdGlvbiBzdHJpbmdzLiAgKi8KLSAgbmxzX3VpbnQzMiB0cmFuc190YWJfb2Zmc2V0OwotICAvKiBTaXplIG9mIGhhc2hpbmcgdGFibGUuICAqLwotICBubHNfdWludDMyIGhhc2hfdGFiX3NpemU7Ci0gIC8qIE9mZnNldCBvZiBmaXJzdCBoYXNoaW5nIGVudHJ5LiAgKi8KLSAgbmxzX3VpbnQzMiBoYXNoX3RhYl9vZmZzZXQ7Ci19OwotCi1zdHJ1Y3Qgc3RyaW5nX2Rlc2MKLXsKLSAgLyogTGVuZ3RoIG9mIGFkZHJlc3NlZCBzdHJpbmcuICAqLwotICBubHNfdWludDMyIGxlbmd0aDsKLSAgLyogT2Zmc2V0IG9mIHN0cmluZyBpbiBmaWxlLiAgKi8KLSAgbmxzX3VpbnQzMiBvZmZzZXQ7Ci19OwotCi0vKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KLQotI2VuZGlmCS8qIGdldHRleHQuaCAgKi8KZGlmZiAtLWdpdCBhL2ludGwvZ2V0dGV4dFAuaCBiL2ludGwvZ2V0dGV4dFAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4ZDU1Mi4uMDAwMDAwMAotLS0gYS9pbnRsL2dldHRleHRQLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiBIZWFkZXIgZGVzY3JpYmluZyBpbnRlcm5hbHMgb2YgZ2V0dGV4dCBsaWJyYXJ5Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0dFVFRFWFRQX0gKLSNkZWZpbmUgX0dFVFRFWFRQX0gKLQotI2luY2x1ZGUgImxvYWRpbmZvLmgiCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmbmRlZiBQQVJBTVMKLSMgaWYgX19TVERDX18KLSMgIGRlZmluZSBQQVJBTVMoYXJncykgYXJncwotIyBlbHNlCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpICgpCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBXCi0jIGRlZmluZSBXKGZsYWcsIGRhdGEpICgoZmxhZykgPyBTV0FQIChkYXRhKSA6IChkYXRhKSkKLSNlbmRpZgotCi0KLXN0YXRpYyBubHNfdWludDMyIFNXQVAgUEFSQU1TICgobmxzX3VpbnQzMiBpKSk7Ci0KLXN0YXRpYyBpbmxpbmUgbmxzX3VpbnQzMgotU1dBUCAoaSkKLSAgICAgbmxzX3VpbnQzMiBpOwotewotICByZXR1cm4gKGkgPDwgMjQpIHwgKChpICYgMHhmZjAwKSA8PCA4KSB8ICgoaSA+PiA4KSAmIDB4ZmYwMCkgfCAoaSA+PiAyNCk7Ci19Ci0KLQotc3RydWN0IGxvYWRlZF9kb21haW4KLXsKLSAgY29uc3QgY2hhciAqZGF0YTsKLSAgaW50IG11c3Rfc3dhcDsKLSAgbmxzX3VpbnQzMiBuc3RyaW5nczsKLSAgc3RydWN0IHN0cmluZ19kZXNjICpvcmlnX3RhYjsKLSAgc3RydWN0IHN0cmluZ19kZXNjICp0cmFuc190YWI7Ci0gIG5sc191aW50MzIgaGFzaF9zaXplOwotICBubHNfdWludDMyICpoYXNoX3RhYjsKLX07Ci0KLXN0cnVjdCBiaW5kaW5nCi17Ci0gIHN0cnVjdCBiaW5kaW5nICpuZXh0OwotICBjaGFyICpkb21haW5uYW1lOwotICBjaGFyICpkaXJuYW1lOwotfTsKLQotc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX25sX2ZpbmRfZG9tYWluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZGlybmFtZSwKLQkJCQkJCSBjaGFyICpfX2xvY2FsZSwKLQkJCQkJCSBjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpKTsKLXZvaWQgX25sX2xvYWRfZG9tYWluIFBBUkFNUyAoKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9fZG9tYWluKSk7Ci0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0jZW5kaWYgLyogZ2V0dGV4dFAuaCAgKi8KZGlmZiAtLWdpdCBhL2ludGwvaGFzaC1zdHJpbmcuaCBiL2ludGwvaGFzaC1zdHJpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY2ZTg0MS4uMDAwMDAwMAotLS0gYS9pbnRsL2hhc2gtc3RyaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKiBJbXBsZW1lbnRzIGEgc3RyaW5nIGhhc2hpbmcgZnVuY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLSAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfVkFMVUVTX0gKLSMgaW5jbHVkZSA8dmFsdWVzLmg+Ci0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZuZGVmIFBBUkFNUwotIyBpZiBfX1NURENfXwotIyAgZGVmaW5lIFBBUkFNUyhBcmdzKSBBcmdzCi0jIGVsc2UKLSMgIGRlZmluZSBQQVJBTVMoQXJncykgKCkKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBXZSBhc3N1bWUgdG8gaGF2ZSBgdW5zaWduZWQgbG9uZyBpbnQnIHZhbHVlIHdpdGggYXQgbGVhc3QgMzIgYml0cy4gICovCi0jZGVmaW5lIEhBU0hXT1JEQklUUyAzMgotCi0KLS8qIERlZmluZXMgdGhlIHNvIGNhbGxlZCBgaGFzaHBqdycgZnVuY3Rpb24gYnkgUC5KLiBXZWluYmVyZ2VyCi0gICBbc2VlIEFoby9TZXRoaS9VbGxtYW4sIENPTVBJTEVSUzogUHJpbmNpcGxlcywgVGVjaG5pcXVlcyBhbmQgVG9vbHMsCi0gICAxOTg2LCAxOTg3IEJlbGwgVGVsZXBob25lIExhYm9yYXRvcmllcywgSW5jLl0gICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBoYXNoX3N0cmluZyBQQVJBTVMgKChjb25zdCBjaGFyICpfX3N0cl9wYXJhbSkpOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLWhhc2hfc3RyaW5nIChzdHJfcGFyYW0pCi0gICAgIGNvbnN0IGNoYXIgKnN0cl9wYXJhbTsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnQgaHZhbCwgZzsKLSAgY29uc3QgY2hhciAqc3RyID0gc3RyX3BhcmFtOwotCi0gIC8qIENvbXB1dGUgdGhlIGhhc2ggdmFsdWUgZm9yIHRoZSBnaXZlbiBzdHJpbmcuICAqLwotICBodmFsID0gMDsKLSAgd2hpbGUgKCpzdHIgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBodmFsIDw8PSA0OwotICAgICAgaHZhbCArPSAodW5zaWduZWQgbG9uZykgKnN0cisrOwotICAgICAgZyA9IGh2YWwgJiAoKHVuc2lnbmVkIGxvbmcpIDB4ZiA8PCAoSEFTSFdPUkRCSVRTIC0gNCkpOwotICAgICAgaWYgKGcgIT0gMCkKLQl7Ci0JICBodmFsIF49IGcgPj4gKEhBU0hXT1JEQklUUyAtIDgpOwotCSAgaHZhbCBePSBnOwotCX0KLSAgICB9Ci0gIHJldHVybiBodmFsOwotfQpkaWZmIC0tZ2l0IGEvaW50bC9pbnRsLWNvbXBhdC5jIGIvaW50bC9pbnRsLWNvbXBhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDNlZmEwLi4wMDAwMDAwCi0tLSBhL2ludGwvaW50bC1jb21wYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qIGludGwtY29tcGF0LmMgLSBTdHViIGZ1bmN0aW9ucyB0byBjYWxsIGdldHRleHQgZnVuY3Rpb25zIGZyb20gR05VIGdldHRleHQKLSAgIExpYnJhcnkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLQotI3VuZGVmIGdldHRleHQKLSN1bmRlZiBkZ2V0dGV4dAotI3VuZGVmIGRjZ2V0dGV4dAotI3VuZGVmIHRleHRkb21haW4KLSN1bmRlZiBiaW5kdGV4dGRvbWFpbgotCi0KLWNoYXIgKgotYmluZHRleHRkb21haW4gKGRvbWFpbm5hbWUsIGRpcm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU7Ci17Ci0gIHJldHVybiBiaW5kdGV4dGRvbWFpbl9fIChkb21haW5uYW1lLCBkaXJuYW1lKTsKLX0KLQotCi1jaGFyICoKLWRjZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQsIGNhdGVnb3J5KQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotICAgICBjb25zdCBjaGFyICptc2dpZDsKLSAgICAgaW50IGNhdGVnb3J5OwotewotICByZXR1cm4gZGNnZXR0ZXh0X18gKGRvbWFpbm5hbWUsIG1zZ2lkLCBjYXRlZ29yeSk7Ci19Ci0KLQotY2hhciAqCi1kZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotewotICByZXR1cm4gZGdldHRleHRfXyAoZG9tYWlubmFtZSwgbXNnaWQpOwotfQotCi0KLWNoYXIgKgotZ2V0dGV4dCAobXNnaWQpCi0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotewotICByZXR1cm4gZ2V0dGV4dF9fIChtc2dpZCk7Ci19Ci0KLQotY2hhciAqCi10ZXh0ZG9tYWluIChkb21haW5uYW1lKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotewotICByZXR1cm4gdGV4dGRvbWFpbl9fIChkb21haW5uYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2ludGwvaW50bGguaW5zdC5pbiBiL2ludGwvaW50bGguaW5zdC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkMzIzYy4uMDAwMDAwMAotLS0gYS9pbnRsL2ludGxoLmluc3QuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyogTWVzc2FnZSBjYXRhbG9ncyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0jaWZuZGVmIF9MSUJJTlRMX0gKLSNkZWZpbmUgX0xJQklOVExfSAkxCi0KLUBJTkNMVURFX0xPQ0FMRV9IQAotCi0vKiBXZSBkZWZpbmUgYW4gYWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIHRoZSBHTlUKLSAgIGltcGxlbWVudGF0aW9uIG9mIGdldHRleHQuICAqLwotI2RlZmluZSBfX1VTRV9HTlVfR0VUVEVYVCAxCi0KLSNpZm5kZWYgUEFSQU1TCi0jIGlmIF9fU1REQ19fCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpIGFyZ3MKLSMgZWxzZQotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSAoKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0Ci0gICB0ZXh0KS4gICovCi1leHRlcm4gY2hhciAqZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX21zZ2lkKSk7Ci0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KLWV4dGVybiBjaGFyICpkZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCi0gICBsb2NhbGUuICAqLwotZXh0ZXJuIGNoYXIgKmRjZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCi0JCQkJaW50IF9fY2F0ZWdvcnkpKTsKLQotCi0vKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KLSAgIElmIERPTUFJTk5BTUUgaXMgbnVsbCwgcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQuCi0gICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KLWV4dGVybiBjaGFyICp0ZXh0ZG9tYWluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOwotCi0vKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKLSAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KLWV4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbiBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICAgICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpKTsKLQotCi0vKiBPcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLiAgKi8KLSNpZiBkZWZpbmVkIF9fT1BUSU1JWkVECi0vKiBUaGVzZSBtdXN0IGJlIGEgbWFjcm8uICBJbmxpbmVkIGZ1bmN0aW9ucyBhcmUgdXNlbGVzcyBiZWNhdXNlIHRoZQotICAgYF9fYnVpbHRpbl9jb25zdGFudF9wJyBwcmVkaWNhdGUgaW4gZGNnZXR0ZXh0IHdvdWxkIGFsd2F5cyByZXR1cm4KLSAgIGZhbHNlLiAgKi8KLQotIyBkZWZpbmUgZ2V0dGV4dChtc2dpZCkgZGdldHRleHQgKChjaGFyICopIDAsIG1zZ2lkKQotCi0jIGRlZmluZSBkZ2V0dGV4dChkb21haW5uYW1lLCBtc2dpZCkJCQkJCSAgICAgIFwKLSAgZGNnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCwgTENfTUVTU0FHRVMpCi0KLSMgaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDcpCi0vKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyBkZWZpbmVkIGluIGxvYWRtc2djYXQuYy4gIFdlIG5lZWQgYSBzaWduLAotICAgd2hldGhlciBhIG5ldyBjYXRhbG9nIHdhcyBsb2FkZWQsIHdoaWNoIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYWxsCi0gICB0cmFuc2xhdGlvbnMuICAqLwotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCi0jICBkZWZpbmUgZGNnZXR0ZXh0KGRvbWFpbm5hbWUsIG1zZ2lkLCBjYXRlZ29yeSkJCQkgICAgICBcCi0gIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKLSAgICh7CQkJCQkJCQkJICAgICAgXAotICAgICBjaGFyICpfX3Jlc3VsdDsJCQkJCQkJICAgICAgXAotICAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKG1zZ2lkKSkJCQkJCSAgICAgIFwKLSAgICAgICB7CQkJCQkJCQkgICAgICBcCi0JIHN0YXRpYyBjaGFyICpfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCi0JIHN0YXRpYyBpbnQgX19jYXRhbG9nX2NvdW50ZXJfXzsJCQkJICAgICAgXAotCSBpZiAoISBfX3RyYW5zbGF0aW9uX18gfHwgX19jYXRhbG9nX2NvdW50ZXJfXyAhPSBfbmxfbXNnX2NhdF9jbnRyKSAgICBcCi0JICAgewkJCQkJCQkJICAgICAgXAotCSAgICAgX190cmFuc2xhdGlvbl9fID0JCQkJCQkgICAgICBcCi0JICAgICAgIChkY2dldHRleHQpICgoZG9tYWlubmFtZSksIChtc2dpZCksIChjYXRlZ29yeSkpOwkJICAgICAgXAotCSAgICAgX19jYXRhbG9nX2NvdW50ZXJfXyA9IF9ubF9tc2dfY2F0X2NudHI7CQkJICAgICAgXAotCSAgIH0JCQkJCQkJCSAgICAgIFwKLQkgX19yZXN1bHQgPSBfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCi0gICAgICAgfQkJCQkJCQkJICAgICAgXAotICAgICBlbHNlCQkJCQkJCQkgICAgICBcCi0gICAgICAgX19yZXN1bHQgPSAoZGNnZXR0ZXh0KSAoKGRvbWFpbm5hbWUpLCAobXNnaWQpLCAoY2F0ZWdvcnkpKTsJICAgICAgXAotICAgICBfX3Jlc3VsdDsJCQkJCQkJCSAgICAgIFwKLSAgICB9KSkKLSMgZW5kaWYKLSNlbmRpZiAvKiBPcHRpbWl6aW5nLiAqLwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBsaWJpbnRsLmggKi8KZGlmZiAtLWdpdCBhL2ludGwvbDEwbmZsaXN0LmMgYi9pbnRsL2wxMG5mbGlzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTJiYzEzLi4wMDAwMDAwCi0tLSBhL2ludGwvbDEwbmZsaXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyogSGFuZGxlIGxpc3Qgb2YgbmVlZGVkIG1lc3NhZ2UgY2F0YWxvZ3MKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0KLSNpZiBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgX0dOVV9TT1VSQ0UKLSMgIGRlZmluZSBfR05VX1NPVVJDRQkxCi0jIGVuZGlmCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyBpZm5kZWYgbWVtY3B5Ci0jICBkZWZpbmUgbWVtY3B5KERzdCwgU3JjLCBOdW0pIGJjb3B5IChTcmMsIERzdCwgTnVtKQotIyBlbmRpZgotI2VuZGlmCi0jaWYgIUhBVkVfU1RSQ0hSICYmICFkZWZpbmVkIF9MSUJDCi0jIGlmbmRlZiBzdHJjaHIKLSMgIGRlZmluZSBzdHJjaHIgaW5kZXgKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfQVJHWl9ICi0jIGluY2x1ZGUgPGFyZ3ouaD4KLSNlbmRpZgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsb2FkaW5mby5oIgotCi0vKiBPbiBzb21lIHN0cmFuZ2Ugc3lzdGVtcyBzdGlsbCBubyBkZWZpbml0aW9uIG9mIE5VTEwgaXMgZm91bmQuICBTaWdoISAgKi8KLSNpZm5kZWYgTlVMTAotIyBpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi0jICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKLSMgZWxzZQotIyAgZGVmaW5lIE5VTEwgMAotIyBlbmRpZgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmZGVmIF9MSUJDCi0vKiBSZW5hbWUgdGhlIG5vbiBBTlNJIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKLSAgIGJlY2F1c2Ugc29tZSBBTlNJIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKLSAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KLSMgZGVmaW5lIHN0cGNweShkZXN0LCBzcmMpIF9fc3RwY3B5KGRlc3QsIHNyYykKLSNlbHNlCi0jIGlmbmRlZiBIQVZFX1NUUENQWQotc3RhdGljIGNoYXIgKnN0cGNweSBQQVJBTVMgKChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBEZWZpbmUgZnVuY3Rpb24gd2hpY2ggYXJlIHVzdWFsbHkgbm90IGF2YWlsYWJsZS4gICovCi0KLSNpZiAhZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBIQVZFX19fQVJHWl9DT1VOVAotLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgaW4gQVJHWi4gICovCi1zdGF0aWMgc2l6ZV90IGFyZ3pfY291bnRfXyBQQVJBTVMgKChjb25zdCBjaGFyICphcmd6LCBzaXplX3QgbGVuKSk7Ci0KLXN0YXRpYyBzaXplX3QKLWFyZ3pfY291bnRfXyAoYXJneiwgbGVuKQotICAgICBjb25zdCBjaGFyICphcmd6OwotICAgICBzaXplX3QgbGVuOwotewotICBzaXplX3QgY291bnQgPSAwOwotICB3aGlsZSAobGVuID4gMCkKLSAgICB7Ci0gICAgICBzaXplX3QgcGFydF9sZW4gPSBzdHJsZW4gKGFyZ3opOwotICAgICAgYXJneiArPSBwYXJ0X2xlbiArIDE7Ci0gICAgICBsZW4gLT0gcGFydF9sZW4gKyAxOwotICAgICAgY291bnQrKzsKLSAgICB9Ci0gIHJldHVybiBjb3VudDsKLX0KLSMgdW5kZWYgX19hcmd6X2NvdW50Ci0jIGRlZmluZSBfX2FyZ3pfY291bnQoYXJneiwgbGVuKSBhcmd6X2NvdW50X18gKGFyZ3osIGxlbikKLSNlbmRpZgkvKiAhX0xJQkMgJiYgIUhBVkVfX19BUkdaX0NPVU5UICovCi0KLSNpZiAhZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBIQVZFX19fQVJHWl9TVFJJTkdJRlkKLS8qIE1ha2UgJ1wwJyBzZXBhcmF0ZWQgYXJnIHZlY3RvciBBUkdaIHByaW50YWJsZSBieSBjb252ZXJ0aW5nIGFsbCB0aGUgJ1wwJ3MKLSAgIGV4Y2VwdCB0aGUgbGFzdCBpbnRvIHRoZSBjaGFyYWN0ZXIgU0VQLiAgKi8KLXN0YXRpYyB2b2lkIGFyZ3pfc3RyaW5naWZ5X18gUEFSQU1TICgoY2hhciAqYXJneiwgc2l6ZV90IGxlbiwgaW50IHNlcCkpOwotCi1zdGF0aWMgdm9pZAotYXJnel9zdHJpbmdpZnlfXyAoYXJneiwgbGVuLCBzZXApCi0gICAgIGNoYXIgKmFyZ3o7Ci0gICAgIHNpemVfdCBsZW47Ci0gICAgIGludCBzZXA7Ci17Ci0gIHdoaWxlIChsZW4gPiAwKQotICAgIHsKLSAgICAgIHNpemVfdCBwYXJ0X2xlbiA9IHN0cmxlbiAoYXJneik7Ci0gICAgICBhcmd6ICs9IHBhcnRfbGVuOwotICAgICAgbGVuIC09IHBhcnRfbGVuICsgMTsKLSAgICAgIGlmIChsZW4gPiAwKQotCSphcmd6KysgPSBzZXA7Ci0gICAgfQotfQotIyB1bmRlZiBfX2FyZ3pfc3RyaW5naWZ5Ci0jIGRlZmluZSBfX2FyZ3pfc3RyaW5naWZ5KGFyZ3osIGxlbiwgc2VwKSBhcmd6X3N0cmluZ2lmeV9fIChhcmd6LCBsZW4sIHNlcCkKLSNlbmRpZgkvKiAhX0xJQkMgJiYgIUhBVkVfX19BUkdaX1NUUklOR0lGWSAqLwotCi0jaWYgIWRlZmluZWQgX0xJQkMgJiYgIWRlZmluZWQgSEFWRV9fX0FSR1pfTkVYVAotc3RhdGljIGNoYXIgKmFyZ3pfbmV4dF9fIFBBUkFNUyAoKGNoYXIgKmFyZ3osIHNpemVfdCBhcmd6X2xlbiwKLQkJCQkgIGNvbnN0IGNoYXIgKmVudHJ5KSk7Ci0KLXN0YXRpYyBjaGFyICoKLWFyZ3pfbmV4dF9fIChhcmd6LCBhcmd6X2xlbiwgZW50cnkpCi0gICAgIGNoYXIgKmFyZ3o7Ci0gICAgIHNpemVfdCBhcmd6X2xlbjsKLSAgICAgY29uc3QgY2hhciAqZW50cnk7Ci17Ci0gIGlmIChlbnRyeSkKLSAgICB7Ci0gICAgICBpZiAoZW50cnkgPCBhcmd6ICsgYXJnel9sZW4pCi0gICAgICAgIGVudHJ5ID0gc3RyY2hyIChlbnRyeSwgJ1wwJykgKyAxOwotCi0gICAgICByZXR1cm4gZW50cnkgPj0gYXJneiArIGFyZ3pfbGVuID8gTlVMTCA6IChjaGFyICopIGVudHJ5OwotICAgIH0KLSAgZWxzZQotICAgIGlmIChhcmd6X2xlbiA+IDApCi0gICAgICByZXR1cm4gYXJnejsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLX0KLSMgdW5kZWYgX19hcmd6X25leHQKLSMgZGVmaW5lIF9fYXJnel9uZXh0KGFyZ3osIGxlbiwgZW50cnkpIGFyZ3pfbmV4dF9fIChhcmd6LCBsZW4sIGVudHJ5KQotI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9fX0FSR1pfTkVYVCAqLwotCi0KLS8qIFJldHVybiBudW1iZXIgb2YgYml0cyBzZXQgaW4gWC4gICovCi1zdGF0aWMgaW50IHBvcCBQQVJBTVMgKChpbnQgeCkpOwotCi1zdGF0aWMgaW5saW5lIGludAotcG9wICh4KQotICAgICBpbnQgeDsKLXsKLSAgLyogV2UgYXNzdW1lIHRoYXQgbm8gbW9yZSB0aGFuIDE2IGJpdHMgYXJlIHVzZWQuICAqLwotICB4ID0gKCh4ICYgfjB4NTU1NSkgPj4gMSkgKyAoeCAmIDB4NTU1NSk7Ci0gIHggPSAoKHggJiB+MHgzMzMzKSA+PiAyKSArICh4ICYgMHgzMzMzKTsKLSAgeCA9ICgoeCA+PiA0KSArIHgpICYgMHgwZjBmOwotICB4ID0gKCh4ID4+IDgpICsgeCkgJiAweGZmOwotCi0gIHJldHVybiB4OwotfQotCi0MCi1zdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKLV9ubF9tYWtlX2wxMG5mbGlzdCAobDEwbmZpbGVfbGlzdCwgZGlybGlzdCwgZGlybGlzdF9sZW4sIG1hc2ssIGxhbmd1YWdlLAotCQkgICAgdGVycml0b3J5LCBjb2Rlc2V0LCBub3JtYWxpemVkX2NvZGVzZXQsIG1vZGlmaWVyLCBzcGVjaWFsLAotCQkgICAgc3BvbnNvciwgcmV2aXNpb24sIGZpbGVuYW1lLCBkb19hbGxvY2F0ZSkKLSAgICAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKmwxMG5maWxlX2xpc3Q7Ci0gICAgIGNvbnN0IGNoYXIgKmRpcmxpc3Q7Ci0gICAgIHNpemVfdCBkaXJsaXN0X2xlbjsKLSAgICAgaW50IG1hc2s7Ci0gICAgIGNvbnN0IGNoYXIgKmxhbmd1YWdlOwotICAgICBjb25zdCBjaGFyICp0ZXJyaXRvcnk7Ci0gICAgIGNvbnN0IGNoYXIgKmNvZGVzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZWRfY29kZXNldDsKLSAgICAgY29uc3QgY2hhciAqbW9kaWZpZXI7Ci0gICAgIGNvbnN0IGNoYXIgKnNwZWNpYWw7Ci0gICAgIGNvbnN0IGNoYXIgKnNwb25zb3I7Ci0gICAgIGNvbnN0IGNoYXIgKnJldmlzaW9uOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgaW50IGRvX2FsbG9jYXRlOwotewotICBjaGFyICphYnNfZmlsZW5hbWU7Ci0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmxhc3QgPSBOVUxMOwotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpyZXR2YWw7Ci0gIGNoYXIgKmNwOwotICBzaXplX3QgZW50cmllczsKLSAgaW50IGNudDsKLQotICAvKiBBbGxvY2F0ZSByb29tIGZvciB0aGUgZnVsbCBmaWxlIG5hbWUuICAqLwotICBhYnNfZmlsZW5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGRpcmxpc3RfbGVuCi0JCQkJICArIHN0cmxlbiAobGFuZ3VhZ2UpCi0JCQkJICArICgobWFzayAmIFRFUlJJVE9SWSkgIT0gMAotCQkJCSAgICAgPyBzdHJsZW4gKHRlcnJpdG9yeSkgKyAxIDogMCkKLQkJCQkgICsgKChtYXNrICYgWFBHX0NPREVTRVQpICE9IDAKLQkJCQkgICAgID8gc3RybGVuIChjb2Rlc2V0KSArIDEgOiAwKQotCQkJCSAgKyAoKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKSAhPSAwCi0JCQkJICAgICA/IHN0cmxlbiAobm9ybWFsaXplZF9jb2Rlc2V0KSArIDEgOiAwKQotCQkJCSAgKyAoKChtYXNrICYgWFBHX01PRElGSUVSKSAhPSAwCi0JCQkJICAgICAgfHwgKG1hc2sgJiBDRU5fQVVESUVOQ0UpICE9IDApCi0JCQkJICAgICA/IHN0cmxlbiAobW9kaWZpZXIpICsgMSA6IDApCi0JCQkJICArICgobWFzayAmIENFTl9TUEVDSUFMKSAhPSAwCi0JCQkJICAgICA/IHN0cmxlbiAoc3BlY2lhbCkgKyAxIDogMCkKLQkJCQkgICsgKCgobWFzayAmIENFTl9TUE9OU09SKSAhPSAwCi0JCQkJICAgICAgfHwgKG1hc2sgJiBDRU5fUkVWSVNJT04pICE9IDApCi0JCQkJICAgICA/ICgxICsgKChtYXNrICYgQ0VOX1NQT05TT1IpICE9IDAKLQkJCQkJICAgICA/IHN0cmxlbiAoc3BvbnNvcikgKyAxIDogMCkKLQkJCQkJKyAoKG1hc2sgJiBDRU5fUkVWSVNJT04pICE9IDAKLQkJCQkJICAgPyBzdHJsZW4gKHJldmlzaW9uKSArIDEgOiAwKSkgOiAwKQotCQkJCSAgKyAxICsgc3RybGVuIChmaWxlbmFtZSkgKyAxKTsKLQotICBpZiAoYWJzX2ZpbGVuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dmFsID0gTlVMTDsKLSAgbGFzdCA9IE5VTEw7Ci0KLSAgLyogQ29uc3RydWN0IGZpbGUgbmFtZS4gICovCi0gIG1lbWNweSAoYWJzX2ZpbGVuYW1lLCBkaXJsaXN0LCBkaXJsaXN0X2xlbik7Ci0gIF9fYXJnel9zdHJpbmdpZnkgKGFic19maWxlbmFtZSwgZGlybGlzdF9sZW4sICc6Jyk7Ci0gIGNwID0gYWJzX2ZpbGVuYW1lICsgKGRpcmxpc3RfbGVuIC0gMSk7Ci0gICpjcCsrID0gJy8nOwotICBjcCA9IHN0cGNweSAoY3AsIGxhbmd1YWdlKTsKLQotICBpZiAoKG1hc2sgJiBURVJSSVRPUlkpICE9IDApCi0gICAgewotICAgICAgKmNwKysgPSAnXyc7Ci0gICAgICBjcCA9IHN0cGNweSAoY3AsIHRlcnJpdG9yeSk7Ci0gICAgfQotICBpZiAoKG1hc2sgJiBYUEdfQ09ERVNFVCkgIT0gMCkKLSAgICB7Ci0gICAgICAqY3ArKyA9ICcuJzsKLSAgICAgIGNwID0gc3RwY3B5IChjcCwgY29kZXNldCk7Ci0gICAgfQotICBpZiAoKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKSAhPSAwKQotICAgIHsKLSAgICAgICpjcCsrID0gJy4nOwotICAgICAgY3AgPSBzdHBjcHkgKGNwLCBub3JtYWxpemVkX2NvZGVzZXQpOwotICAgIH0KLSAgaWYgKChtYXNrICYgKFhQR19NT0RJRklFUiB8IENFTl9BVURJRU5DRSkpICE9IDApCi0gICAgewotICAgICAgLyogVGhpcyBjb21wb25lbnQgY2FuIGJlIHBhcnQgb2YgYm90aCBzeW50YWNlcyBidXQgaGFzIGRpZmZlcmVudAotCSBsZWFkaW5nIGNoYXJhY3RlcnMuICBGb3IgQ0VOIHdlIHVzZSBgKycsIGVsc2UgYEAnLiAgKi8KLSAgICAgICpjcCsrID0gKG1hc2sgJiBDRU5fQVVESUVOQ0UpICE9IDAgPyAnKycgOiAnQCc7Ci0gICAgICBjcCA9IHN0cGNweSAoY3AsIG1vZGlmaWVyKTsKLSAgICB9Ci0gIGlmICgobWFzayAmIENFTl9TUEVDSUFMKSAhPSAwKQotICAgIHsKLSAgICAgICpjcCsrID0gJysnOwotICAgICAgY3AgPSBzdHBjcHkgKGNwLCBzcGVjaWFsKTsKLSAgICB9Ci0gIGlmICgobWFzayAmIChDRU5fU1BPTlNPUiB8IENFTl9SRVZJU0lPTikpICE9IDApCi0gICAgewotICAgICAgKmNwKysgPSAnLCc7Ci0gICAgICBpZiAoKG1hc2sgJiBDRU5fU1BPTlNPUikgIT0gMCkKLQljcCA9IHN0cGNweSAoY3AsIHNwb25zb3IpOwotICAgICAgaWYgKChtYXNrICYgQ0VOX1JFVklTSU9OKSAhPSAwKQotCXsKLQkgICpjcCsrID0gJ18nOwotCSAgY3AgPSBzdHBjcHkgKGNwLCByZXZpc2lvbik7Ci0JfQotICAgIH0KLQotICAqY3ArKyA9ICcvJzsKLSAgc3RwY3B5IChjcCwgZmlsZW5hbWUpOwotCi0gIC8qIExvb2sgaW4gbGlzdCBvZiBhbHJlYWR5IGxvYWRlZCBkb21haW5zIHdoZXRoZXIgaXQgaXMgYWxyZWFkeQotICAgICBhdmFpbGFibGUuICAqLwotICBsYXN0ID0gTlVMTDsKLSAgZm9yIChyZXR2YWwgPSAqbDEwbmZpbGVfbGlzdDsgcmV0dmFsICE9IE5VTEw7IHJldHZhbCA9IHJldHZhbC0+bmV4dCkKLSAgICBpZiAocmV0dmFsLT5maWxlbmFtZSAhPSBOVUxMKQotICAgICAgewotCWludCBjb21wYXJlID0gc3RyY21wIChyZXR2YWwtPmZpbGVuYW1lLCBhYnNfZmlsZW5hbWUpOwotCWlmIChjb21wYXJlID09IDApCi0JICAvKiBXZSBmb3VuZCBpdCEgICovCi0JICBicmVhazsKLQlpZiAoY29tcGFyZSA8IDApCi0JICB7Ci0JICAgIC8qIEl0J3Mgbm90IGluIHRoZSBsaXN0LiAgKi8KLQkgICAgcmV0dmFsID0gTlVMTDsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQlsYXN0ID0gcmV0dmFsOwotICAgICAgfQotCi0gIGlmIChyZXR2YWwgIT0gTlVMTCB8fCBkb19hbGxvY2F0ZSA9PSAwKQotICAgIHsKLSAgICAgIGZyZWUgKGFic19maWxlbmFtZSk7Ci0gICAgICByZXR1cm4gcmV0dmFsOwotICAgIH0KLQotICByZXR2YWwgPSAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKQotICAgIG1hbGxvYyAoc2l6ZW9mICgqcmV0dmFsKSArIChfX2FyZ3pfY291bnQgKGRpcmxpc3QsIGRpcmxpc3RfbGVuKQotCQkJCSogKDEgPDwgcG9wIChtYXNrKSkKLQkJCQkqIHNpemVvZiAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKSkpOwotICBpZiAocmV0dmFsID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dmFsLT5maWxlbmFtZSA9IGFic19maWxlbmFtZTsKLSAgcmV0dmFsLT5kZWNpZGVkID0gKF9fYXJnel9jb3VudCAoZGlybGlzdCwgZGlybGlzdF9sZW4pICE9IDEKLQkJICAgICB8fCAoKG1hc2sgJiBYUEdfQ09ERVNFVCkgIT0gMAotCQkJICYmIChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMCkpOwotICByZXR2YWwtPmRhdGEgPSBOVUxMOwotCi0gIGlmIChsYXN0ID09IE5VTEwpCi0gICAgewotICAgICAgcmV0dmFsLT5uZXh0ID0gKmwxMG5maWxlX2xpc3Q7Ci0gICAgICAqbDEwbmZpbGVfbGlzdCA9IHJldHZhbDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXR2YWwtPm5leHQgPSBsYXN0LT5uZXh0OwotICAgICAgbGFzdC0+bmV4dCA9IHJldHZhbDsKLSAgICB9Ci0KLSAgZW50cmllcyA9IDA7Ci0gIC8qIElmIHRoZSBESVJMSVNUIGlzIGEgcmVhbCBsaXN0IHRoZSBSRVRWQUwgZW50cnkgY29ycmVzcG9uZHMgbm90IHRvCi0gICAgIGEgcmVhbCBmaWxlLiAgU28gd2UgaGF2ZSB0byB1c2UgdGhlIERJUkxJU1Qgc2VwYXJhdGlvbiBtZWNoYW5pc20KLSAgICAgb2YgdGhlIGlubmVyIGxvb3AuICAqLwotICBjbnQgPSBfX2FyZ3pfY291bnQgKGRpcmxpc3QsIGRpcmxpc3RfbGVuKSA9PSAxID8gbWFzayAtIDEgOiBtYXNrOwotICBmb3IgKDsgY250ID49IDA7IC0tY250KQotICAgIGlmICgoY250ICYgfm1hc2spID09IDAKLQkmJiAoKGNudCAmIENFTl9TUEVDSUZJQykgPT0gMCB8fCAoY250ICYgWFBHX1NQRUNJRklDKSA9PSAwKQotCSYmICgoY250ICYgWFBHX0NPREVTRVQpID09IDAgfHwgKGNudCAmIFhQR19OT1JNX0NPREVTRVQpID09IDApKQotICAgICAgewotCS8qIEl0ZXJhdGUgb3ZlciBhbGwgZWxlbWVudHMgb2YgdGhlIERJUkxJU1QuICAqLwotCWNoYXIgKmRpciA9IE5VTEw7Ci0KLQl3aGlsZSAoKGRpciA9IF9fYXJnel9uZXh0ICgoY2hhciAqKSBkaXJsaXN0LCBkaXJsaXN0X2xlbiwgZGlyKSkKLQkgICAgICAgIT0gTlVMTCkKLQkgIHJldHZhbC0+c3VjY2Vzc29yW2VudHJpZXMrK10KLQkgICAgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKGwxMG5maWxlX2xpc3QsIGRpciwgc3RybGVuIChkaXIpICsgMSwgY250LAotCQkJCSAgbGFuZ3VhZ2UsIHRlcnJpdG9yeSwgY29kZXNldCwKLQkJCQkgIG5vcm1hbGl6ZWRfY29kZXNldCwgbW9kaWZpZXIsIHNwZWNpYWwsCi0JCQkJICBzcG9uc29yLCByZXZpc2lvbiwgZmlsZW5hbWUsIDEpOwotICAgICAgfQotICByZXR2YWwtPnN1Y2Nlc3NvcltlbnRyaWVzXSA9IE5VTEw7Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQwKLS8qIE5vcm1hbGl6ZSBjb2Rlc2V0IG5hbWUuICBUaGVyZSBpcyBubyBzdGFuZGFyZCBmb3IgdGhlIGNvZGVzZXQKLSAgIG5hbWVzLiAgTm9ybWFsaXphdGlvbiBhbGxvd3MgdGhlIHVzZXIgdG8gdXNlIGFueSBvZiB0aGUgY29tbW9uCi0gICBuYW1lcy4gICovCi1jb25zdCBjaGFyICoKLV9ubF9ub3JtYWxpemVfY29kZXNldCAoY29kZXNldCwgbmFtZV9sZW4pCi0gICAgIGNvbnN0IGNoYXIgKmNvZGVzZXQ7Ci0gICAgIHNpemVfdCBuYW1lX2xlbjsKLXsKLSAgaW50IGxlbiA9IDA7Ci0gIGludCBvbmx5X2RpZ2l0ID0gMTsKLSAgY2hhciAqcmV0dmFsOwotICBjaGFyICp3cDsKLSAgc2l6ZV90IGNudDsKLQotICBmb3IgKGNudCA9IDA7IGNudCA8IG5hbWVfbGVuOyArK2NudCkKLSAgICBpZiAoaXNhbG51bSAoY29kZXNldFtjbnRdKSkKLSAgICAgIHsKLQkrK2xlbjsKLQotCWlmIChpc2FscGhhIChjb2Rlc2V0W2NudF0pKQotCSAgb25seV9kaWdpdCA9IDA7Ci0gICAgICB9Ci0KLSAgcmV0dmFsID0gKGNoYXIgKikgbWFsbG9jICgob25seV9kaWdpdCA/IDMgOiAwKSArIGxlbiArIDEpOwotCi0gIGlmIChyZXR2YWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAob25seV9kaWdpdCkKLQl3cCA9IHN0cGNweSAocmV0dmFsLCAiaXNvIik7Ci0gICAgICBlbHNlCi0Jd3AgPSByZXR2YWw7Ci0KLSAgICAgIGZvciAoY250ID0gMDsgY250IDwgbmFtZV9sZW47ICsrY250KQotCWlmIChpc2FscGhhIChjb2Rlc2V0W2NudF0pKQotCSAgKndwKysgPSB0b2xvd2VyIChjb2Rlc2V0W2NudF0pOwotCWVsc2UgaWYgKGlzZGlnaXQgKGNvZGVzZXRbY250XSkpCi0JICAqd3ArKyA9IGNvZGVzZXRbY250XTsKLQotICAgICAgKndwID0gJ1wwJzsKLSAgICB9Ci0KLSAgcmV0dXJuIChjb25zdCBjaGFyICopIHJldHZhbDsKLX0KLQotCi0vKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KLQotLyogV2UgZG9uJ3Qgd2FudCBsaWJpbnRsLmEgdG8gZGVwZW5kIG9uIGFueSBvdGhlciBsaWJyYXJ5LiAgU28gd2UKLSAgIGF2b2lkIHRoZSBub24tc3RhbmRhcmQgZnVuY3Rpb24gc3RwY3B5LiAgSW4gR05VIEMgTGlicmFyeSB0aGlzCi0gICBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIHRob3VnaC4gIEFsc28gYWxsb3cgdGhlIHN5bWJvbCBIQVZFX1NUUENQWQotICAgdG8gYmUgZGVmaW5lZC4gICovCi0jaWYgIV9MSUJDICYmICFIQVZFX1NUUENQWQotc3RhdGljIGNoYXIgKgotc3RwY3B5IChkZXN0LCBzcmMpCi0gICAgIGNoYXIgKmRlc3Q7Ci0gICAgIGNvbnN0IGNoYXIgKnNyYzsKLXsKLSAgd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSAhPSAnXDAnKQotICAgIC8qIERvIG5vdGhpbmcuICovIDsKLSAgcmV0dXJuIGRlc3QgLSAxOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2xpYmdldHRleHQuaCBiL2ludGwvbGliZ2V0dGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDRkZTRkLi4wMDAwMDAwCi0tLSBhL2ludGwvbGliZ2V0dGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qIE1lc3NhZ2UgY2F0YWxvZ3MgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBCZWNhdXNlIG9uIHNvbWUgc3lzdGVtcyAoZS5nLiBTb2xhcmlzKSB3ZSBzb21ldGltZXMgaGF2ZSB0byBpbmNsdWRlCi0gICB0aGUgc3lzdGVtcyBsaWJpbnRsLmggYXMgd2VsbCBhcyB0aGlzIGZpbGUgd2UgaGF2ZSBtb3JlIGNvbXBsZXgKLSAgIGluY2x1ZGUgcHJvdGVjdGlvbiBhYm92ZS4gIEJ1dCB0aGUgc3lzdGVtcyBoZWFkZXIgbWlnaHQgcGVyaGFwcyBhbHNvCi0gICBkZWZpbmUgX0xJQklOVExfSCBhbmQgdGhlcmVmb3JlIHdlIGhhdmUgdG8gcHJvdGVjdCB0aGUgZGVmaW5pdGlvbiBoZXJlLiAgKi8KLQotI2lmICFkZWZpbmVkIChfTElCSU5UTF9IKSB8fCAhZGVmaW5lZCAoX0xJQkdFVFRFWFRfSCkKLSNpZiAhZGVmaW5lZCAoX0xJQklOVExfSCkKLSMgZGVmaW5lIF9MSUJJTlRMX0gJMQotI2VuZGlmCi0jZGVmaW5lIF9MSUJHRVRURVhUX0gJMQotCi0vKiBXZSBkZWZpbmUgYW4gYWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIHRoZSBHTlUKLSAgIGltcGxlbWVudGF0aW9uIG9mIGdldHRleHQuICAqLwotI2RlZmluZSBfX1VTRV9HTlVfR0VUVEVYVCAxCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmIEhBVkVfTE9DQUxFX0gKLSMgaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmbmRlZiBQQVJBTVMKLSMgaWYgX19TVERDX18KLSMgIGRlZmluZSBQQVJBTVMoYXJncykgYXJncwotIyBlbHNlCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpICgpCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBOVUxMCi0jIGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX19HTlVDX18KLSMgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQotIyBlbHNlCi0jICBkZWZpbmUgTlVMTCAoMCkKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgIUhBVkVfTENfTUVTU0FHRVMKLS8qIFRoaXMgdmFsdWUgZGV0ZXJtaW5lcyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBnZXR0ZXh0KCkgYW5kIGRnZXR0ZXh0KCkKLSAgIGZ1bmN0aW9uLiAgQnV0IHNvbWUgc3lzdGVtIGRvZXMgbm90IGhhdmUgdGhpcyBkZWZpbmVkLiAgRGVmaW5lIGl0Ci0gICB0byBhIGRlZmF1bHQgdmFsdWUuICAqLwotIyBkZWZpbmUgTENfTUVTU0FHRVMgKC0xKQotI2VuZGlmCi0KLQotLyogRGVjbGFyYXRpb25zIGZvciBnZXR0ZXh0LXVzaW5nLWNhdGdldHMgaW50ZXJmYWNlLiAgRGVyaXZlZCBmcm9tCi0gICBKaW0gTWV5ZXJpbmcncyBsaWJpbnRsLmguICAqLwotc3RydWN0IF9tc2dfZW50Ci17Ci0gIGNvbnN0IGNoYXIgKl9tc2c7Ci0gIGludCBfbXNnX251bWJlcjsKLX07Ci0KLQotI2lmIEhBVkVfQ0FUR0VUUwotLyogVGhlc2UgdHdvIHZhcmlhYmxlcyBhcmUgZGVmaW5lZCBpbiB0aGUgYXV0b21hdGljYWxseSBieSBwby10by10Ymwuc2VkCi0gICBnZW5lcmF0ZWQgZmlsZSBgY2F0LWlkLXRibC5jJy4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IF9tc2dfZW50IF9tc2dfdGJsW107Ci1leHRlcm4gaW50IF9tc2dfdGJsX2xlbmd0aDsKLSNlbmRpZgotCi0KLS8qIEZvciBhdXRvbWF0aWNhbCBleHRyYWN0aW9uIG9mIG1lc3NhZ2VzIHNvbWV0aW1lcyBubyByZWFsCi0gICB0cmFuc2xhdGlvbiBpcyBuZWVkZWQuICBJbnN0ZWFkIHRoZSBzdHJpbmcgaXRzZWxmIGlzIHRoZSByZXN1bHQuICAqLwotI2RlZmluZSBnZXR0ZXh0X25vb3AoU3RyKSAoU3RyKQotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKLSAgIHRleHQpLiAgKi8KLWV4dGVybiBjaGFyICpnZXR0ZXh0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLWV4dGVybiBjaGFyICpnZXR0ZXh0X18gUEFSQU1TICgoY29uc3QgY2hhciAqX19tc2dpZCkpOwotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gICovCi1leHRlcm4gY2hhciAqZGdldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKSk7Ci1leHRlcm4gY2hhciAqZGdldHRleHRfXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJIGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCi0gICBsb2NhbGUuICAqLwotZXh0ZXJuIGNoYXIgKmRjZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCi0JCQkJaW50IF9fY2F0ZWdvcnkpKTsKLWV4dGVybiBjaGFyICpkY2dldHRleHRfXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICBjb25zdCBjaGFyICpfX21zZ2lkLCBpbnQgX19jYXRlZ29yeSkpOwotCi0KLS8qIFNldCB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyB0byBET01BSU5OQU1FLgotICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KLSAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLwotZXh0ZXJuIGNoYXIgKnRleHRkb21haW4gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lKSk7Ci1leHRlcm4gY2hhciAqdGV4dGRvbWFpbl9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOwotCi0vKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKLSAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KLWV4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbiBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpKTsKLWV4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbl9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgICAgY29uc3QgY2hhciAqX19kaXJuYW1lKSk7Ci0KLSNpZiBFTkFCTEVfTkxTCi0KLS8qIFNvbGFyaXMgMi4zIGhhcyB0aGUgZ2V0dGV4dCBmdW5jdGlvbiBidXQgZGNnZXR0ZXh0IGlzIG1pc3NpbmcuCi0gICBTbyB3ZSBvbWl0IHRoaXMgb3B0aW1pemF0aW9uIGZvciBTb2xhcmlzIDIuMy4gIEJUVywgU29sYXJpcyAyLjQKLSAgIGhhcyBkY2dldHRleHQuICAqLwotIyBpZiAhSEFWRV9DQVRHRVRTICYmICghSEFWRV9HRVRURVhUIHx8IEhBVkVfRENHRVRURVhUKQotCi0jICBkZWZpbmUgZ2V0dGV4dChNc2dpZCkJCQkJCQkgICAgICBcCi0gICAgIGRnZXR0ZXh0IChOVUxMLCBNc2dpZCkKLQotIyAgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkKQkJCQkJICAgICAgXAotICAgICBkY2dldHRleHQgKERvbWFpbm5hbWUsIE1zZ2lkLCBMQ19NRVNTQUdFUykKLQotIyAgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDcKLS8qIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGlzIGRlZmluZWQgaW4gbG9hZG1zZ2NhdC5jLiAgV2UgbmVlZCBhIHNpZ24sCi0gICB3aGV0aGVyIGEgbmV3IGNhdGFsb2cgd2FzIGxvYWRlZCwgd2hpY2ggY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhbGwKLSAgIHRyYW5zbGF0aW9ucy4gICovCi1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0KLSMgICBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSkJCQkgICAgICBcCi0gIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKLSAgICh7CQkJCQkJCQkJICAgICAgXAotICAgICBjaGFyICpfX3Jlc3VsdDsJCQkJCQkJICAgICAgXAotICAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKE1zZ2lkKSkJCQkJCSAgICAgIFwKLSAgICAgICB7CQkJCQkJCQkgICAgICBcCi0JIHN0YXRpYyBjaGFyICpfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCi0JIHN0YXRpYyBpbnQgX19jYXRhbG9nX2NvdW50ZXJfXzsJCQkJICAgICAgXAotCSBpZiAoISBfX3RyYW5zbGF0aW9uX18gfHwgX19jYXRhbG9nX2NvdW50ZXJfXyAhPSBfbmxfbXNnX2NhdF9jbnRyKSAgICBcCi0JICAgewkJCQkJCQkJICAgICAgXAotCSAgICAgX190cmFuc2xhdGlvbl9fID0JCQkJCQkgICAgICBcCi0JICAgICAgIGRjZ2V0dGV4dF9fIChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpOwkJICAgICAgXAotCSAgICAgX19jYXRhbG9nX2NvdW50ZXJfXyA9IF9ubF9tc2dfY2F0X2NudHI7CQkJICAgICAgXAotCSAgIH0JCQkJCQkJCSAgICAgIFwKLQkgX19yZXN1bHQgPSBfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCi0gICAgICAgfQkJCQkJCQkJICAgICAgXAotICAgICBlbHNlCQkJCQkJCQkgICAgICBcCi0gICAgICAgX19yZXN1bHQgPSBkY2dldHRleHRfXyAoRG9tYWlubmFtZSwgTXNnaWQsIENhdGVnb3J5KTsJCSAgICAgIFwKLSAgICAgX19yZXN1bHQ7CQkJCQkJCQkgICAgICBcCi0gICAgfSkpCi0jICBlbmRpZgotIyBlbmRpZgotCi0jZWxzZQotCi0jIGRlZmluZSBnZXR0ZXh0KE1zZ2lkKSAoTXNnaWQpCi0jIGRlZmluZSBkZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCkgKE1zZ2lkKQotIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSkgKE1zZ2lkKQotIyBkZWZpbmUgdGV4dGRvbWFpbihEb21haW5uYW1lKSB3aGlsZSAoMCkgLyogbm90aGluZyAqLwotIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWlubmFtZSwgRGlybmFtZSkgd2hpbGUgKDApIC8qIG5vdGhpbmcgKi8KLQotI2VuZGlmCi0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvbGliaW50bC5nbGliYyBiL2ludGwvbGliaW50bC5nbGliYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU1YjhmOS4uMDAwMDAwMAotLS0gYS9pbnRsL2xpYmludGwuZ2xpYmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyogbGliZ2V0dGV4dC5oIC0tIE1lc3NhZ2UgY2F0YWxvZ3MgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLgotQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCi1Db250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlci4KLVRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gdGhlIGZpbGUgbGliZ2V0dGV4dC5oIGluIHRoZSBHTlUgZ2V0dGV4dCBwYWNrYWdlLgotCi1UaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQotTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfTElCSU5UTF9ICi0jZGVmaW5lIF9MSUJJTlRMX0gJMQotI2luY2x1ZGUgPGZlYXR1cmVzLmg+Ci0KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLQotI2RlZmluZSBfX25lZWRfTlVMTAotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0vKiBXZSBkZWZpbmUgYW4gYWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIHRoZSBHTlUKLSAgIGltcGxlbWVudGF0aW9uIG9mIGdldHRleHQuICAqLwotI2RlZmluZSBfX1VTRV9HTlVfR0VUVEVYVCAxCi0KLV9fQkVHSU5fREVDTFMKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0Ci0gICB0ZXh0KS4gICovCi1leHRlcm4gY2hhciAqZ2V0dGV4dCBfX1AgKChfX2NvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLWV4dGVybiBjaGFyICpfX2dldHRleHQgX19QICgoX19jb25zdCBjaGFyICpfX21zZ2lkKSk7Ci0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KLWV4dGVybiBjaGFyICpkZ2V0dGV4dCBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCSAgICBfX2NvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLWV4dGVybiBjaGFyICpfX2RnZXR0ZXh0IF9fUCAoKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJICAgICAgX19jb25zdCBjaGFyICpfX21zZ2lkKSk7Ci0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQotICAgbG9jYWxlLiAgKi8KLWV4dGVybiBjaGFyICpkY2dldHRleHQgX19QICgoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkgICAgIF9fY29uc3QgY2hhciAqX19tc2dpZCwgaW50IF9fY2F0ZWdvcnkpKTsKLWV4dGVybiBjaGFyICpfX2RjZ2V0dGV4dCBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9fbXNnaWQsIGludCBfX2NhdGVnb3J5KSk7Ci0KLQotLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCi0gICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgotICAgSWYgRE9NQUlOTkFNRSBpcyAiIiwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgIm1lc3NhZ2VzIi4gICovCi1leHRlcm4gY2hhciAqdGV4dGRvbWFpbiBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOwotZXh0ZXJuIGNoYXIgKl9fdGV4dGRvbWFpbiBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOwotCi0vKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKLSAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KLWV4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbiBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgIF9fY29uc3QgY2hhciAqX19kaXJuYW1lKSk7Ci1leHRlcm4gY2hhciAqX19iaW5kdGV4dGRvbWFpbiBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgICAgX19jb25zdCBjaGFyICpfX2Rpcm5hbWUpKTsKLQotCi0vKiBPcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gYWJvdmUuICAqLwotI2lmIGRlZmluZWQgX19PUFRJTUlaRUQKLS8qIFRoZXNlIG11c3QgYmUgYSBtYWNyby4gIElubGluZWQgZnVuY3Rpb25zIGFyZSB1c2VsZXNzIGJlY2F1c2UgdGhlCi0gICBgX19idWlsdGluX2NvbnN0YW50X3AnIHByZWRpY2F0ZSBpbiBkY2dldHRleHQgd291bGQgYWx3YXlzIHJldHVybgotICAgZmFsc2UuICAqLwotCi0jIGRlZmluZSBnZXR0ZXh0KG1zZ2lkKSBkZ2V0dGV4dCAoTlVMTCwgbXNnaWQpCi0KLSMgZGVmaW5lIGRnZXR0ZXh0KGRvbWFpbm5hbWUsIG1zZ2lkKQkJCQkJICAgICAgXAotICBkY2dldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBMQ19NRVNTQUdFUykKLQotIyBpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gNykKLSMgIGRlZmluZSBkY2dldHRleHQoZG9tYWlubmFtZSwgbXNnaWQsIGNhdGVnb3J5KQkJCSAgICAgIFwKLSAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAotICAgKHsJCQkJCQkJCQkgICAgICBcCi0gICAgIGNoYXIgKnJlc3VsdDsJCQkJCQkJICAgICAgXAotICAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKG1zZ2lkKSkJCQkJCSAgICAgIFwKLSAgICAgICB7CQkJCQkJCQkgICAgICBcCi0JIGV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsJCQkJCSAgICAgIFwKLQkgc3RhdGljIGNoYXIgKl9fdHJhbnNsYXRpb25fXzsJCQkJCSAgICAgIFwKLQkgc3RhdGljIGludCBfX2NhdGFsb2dfY291bnRlcl9fOwkJCQkgICAgICBcCi0JIGlmICghIF9fdHJhbnNsYXRpb25fXyB8fCBfX2NhdGFsb2dfY291bnRlcl9fICE9IF9ubF9tc2dfY2F0X2NudHIpICAgIFwKLQkgICB7CQkJCQkJCQkgICAgICBcCi0JICAgICBfX3RyYW5zbGF0aW9uX18gPQkJCQkJCSAgICAgIFwKLQkgICAgICAgX19kY2dldHRleHQgKChkb21haW5uYW1lKSwgKG1zZ2lkKSwgKGNhdGVnb3J5KSk7CQkgICAgICBcCi0JICAgICBfX2NhdGFsb2dfY291bnRlcl9fID0gX25sX21zZ19jYXRfY250cjsJCQkgICAgICBcCi0JICAgfQkJCQkJCQkJICAgICAgXAotCSByZXN1bHQgPSBfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCi0gICAgICAgfQkJCQkJCQkJICAgICAgXAotICAgICBlbHNlCQkJCQkJCQkgICAgICBcCi0gICAgICAgcmVzdWx0ID0gX19kY2dldHRleHQgKChkb21haW5uYW1lKSwgKG1zZ2lkKSwgKGNhdGVnb3J5KSk7CSAgICAgIFwKLSAgICAgcmVzdWx0OwkJCQkJCQkJICAgICAgXAotICAgIH0pKQotIyBlbmRpZgotI2VuZGlmIC8qIE9wdGltaXppbmcuICovCi0KLQotX19FTkRfREVDTFMKLQotI2VuZGlmIC8qIGxpYmludGwuaCAqLwpkaWZmIC0tZ2l0IGEvaW50bC9saW51eC1tc2cuc2VkIGIvaW50bC9saW51eC1tc2cuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTE4ZTcyLi4wMDAwMDAwCi0tLSBhL2ludGwvbGludXgtbXNnLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0jIHBvMm1zZy5zZWQgLSBDb252ZXJ0IFVuaWZvcnVtIHN0eWxlIC5wbyBmaWxlIHRvIExpbnV4IHN0eWxlIC5tc2cgZmlsZQotIyBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMKLSMgVGhlIGZpcnN0IGRpcmVjdGl2ZSBpbiB0aGUgLm1zZyBzaG91bGQgYmUgdGhlIGRlZmluaXRpb24gb2YgdGhlCi0jIG1lc3NhZ2Ugc2V0IG51bWJlci4gIFdlIHVzZSBhbHdheXMgc2V0IG51bWJlciAxLgotIwotMSB7Ci0gIGlcCi0kc2V0IDEgIyBBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgcG8ybXNnLnNlZAotICBoCi0gIHMvLiovMC8KLSAgeAotfQotIwotIyBNaXRjaCdzIG9sZCBjYXRhbG9nIGZvcm1hdCBkb2VzIG5vdCBhbGxvdyBjb21tZW50cy4KLSMKLSMgV2UgY29weSB0aGUgb3JpZ2luYWwgbWVzc2FnZSBhcyBhIGNvbW1lbnQgaW50byB0aGUgLm1zZyBmaWxlLgotIwotL15tc2dpZC8gewotICBzL21zZ2lkWyAJXSoiLy8KLSMKLSMgVGhpcyBkb2VzIG5vdCB3b3JrIG5vdyB3aXRoIHRoZSBuZXcgZm9ybWF0LgotIyAvIiQvISB7Ci0jICAgcy9cXCQvLwotIyAgIHMvJC8gLi4uIChtb3JlIGxpbmVzIGZvbGxvd2luZykiLwotIyB9Ci0gIHgKLSMgVGhlIGZvbGxvd2luZyBuaWNlIHNvbHV0aW9uIGlzIGJ5Ci0jIEJydW5vIDxIYWlibGVAbWEyczIubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlPgotICB0ZAotIyBJbmNyZW1lbnQgYSBkZWNpbWFsIG51bWJlciBpbiBwYXR0ZXJuIHNwYWNlLgotIyBGaXJzdCBoaWRlIHRyYWlsaW5nIGA5JyBkaWdpdHMuCi0gIDpkCi0gIHMvOVwoXypcKSQvX1wxLwotICB0ZAotIyBBc3N1cmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGlzIGF2YWlsYWJsZS4KLSAgcy9eXChfKlwpJC8wXDEvCi0jIEluY3JlbWVudCB0aGUgbGFzdCBkaWdpdC4KLSAgcy84XChfKlwpJC85XDEvCi0gIHMvN1woXypcKSQvOFwxLwotICBzLzZcKF8qXCkkLzdcMS8KLSAgcy81XChfKlwpJC82XDEvCi0gIHMvNFwoXypcKSQvNVwxLwotICBzLzNcKF8qXCkkLzRcMS8KLSAgcy8yXChfKlwpJC8zXDEvCi0gIHMvMVwoXypcKSQvMlwxLwotICBzLzBcKF8qXCkkLzFcMS8KLSMgQ29udmVydCB0aGUgaGlkZGVuIGA5JyBkaWdpdHMgdG8gYDAncy4KLSAgcy9fLzAvZwotICB4Ci0gIEcKLSAgcy9cKC4qXCkiXG5cKFswLTldKlwpLyQgI1wyIE9yaWdpbmFsIE1lc3NhZ2U6KFwxKS9wCi19Ci0jCi0jIFRoZSAubXNnIGZpbGUgY29udGFpbnMsIG90aGVyIHRoZW4gdGhlIC5wbyBmaWxlLCBvbmx5IHRoZSB0cmFuc2xhdGlvbnMKLSMgYnV0IGVhY2ggZ2l2ZW4gYSB1bmlxdWUgSUQuICBTdGFydGluZyBmcm9tIDEgYW5kIGluY3JlbWVudGluZyBieSAxIGZvcgotIyBlYWNoIG1lc3NhZ2Ugd2UgYXNzaWduIHRoZW0gdG8gdGhlIG1lc3NhZ2VzLgotIyBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgLnBvIGZpbGUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY2F0LWlkLXRibC5jIGZpbGUKLSMgKHdpdGggcG8tdG8tdGJsKSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHVzZWQgaGVyZS4gIChBdCBsZWFzdCB0aGUgb3JkZXIKLSMgb2YgZGVjbGFyYXRpb25zIG11c3Qgbm90IGJlIGNoYW5nZWQuKQotIwotL15tc2dzdHIvIHsKLSAgcy9tc2dzdHJbIAldKiJcKC4qXCkiLyMgXDEvCi0jIENsZWFyIHN1YnN0aXR1dGlvbiBmbGFnLgotICB0YgotIyBBcHBlbmQgdGhlIG5leHQgbGluZS4KLSAgOmIKLSAgTgotIyBMb29rIHdoZXRoZXIgc2Vjb25kIHBhcnQgaXMgY29udGludWF0aW9uIGxpbmUuCi0gIHMvXCguKlxuXCkiXCguKlwpIi9cMVwyLwotIyBZZXMsIHRoZW4gYnJhbmNoLgotICB0YQotICBQCi0gIEQKLSMgTm90ZSB0aGF0IEQgaW5jbHVkZXMgYSBqdW1wIHRvIHRoZSBzdGFydCEhCi0jIFdlIGZvdW5kIGEgY29udGludWF0aW9uIGxpbmUuICBCdXQgYmVmb3JlIHByaW50aW5nIGluc2VydCAnXCcuCi0gIDphCi0gIHMvXCguKlwpXChcbi4qXCkvXDFcXFwyLwotICBQCi0jIFdlIGNhbm5vdCB1c2UgRCBoZXJlLgotICBzLy4qXG5cKC4qXCkvXDEvCi0gIHRiCi19Ci1kCmRpZmYgLS1naXQgYS9pbnRsL2xvYWRpbmZvLmggYi9pbnRsL2xvYWRpbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2N2MyZWIuLjAwMDAwMDAKLS0tIGEvaW50bC9sb2FkaW5mby5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotI2lmbmRlZiBQQVJBTVMKLSMgaWYgX19TVERDX18KLSMgIGRlZmluZSBQQVJBTVMoYXJncykgYXJncwotIyBlbHNlCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpICgpCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogRW5jb2Rpbmcgb2YgbG9jYWxlIG5hbWUgcGFydHMuICAqLwotI2RlZmluZSBDRU5fUkVWSVNJT04JCTEKLSNkZWZpbmUgQ0VOX1NQT05TT1IJCTIKLSNkZWZpbmUgQ0VOX1NQRUNJQUwJCTQKLSNkZWZpbmUgWFBHX05PUk1fQ09ERVNFVAk4Ci0jZGVmaW5lIFhQR19DT0RFU0VUCQkxNgotI2RlZmluZSBURVJSSVRPUlkJCTMyCi0jZGVmaW5lIENFTl9BVURJRU5DRQkJNjQKLSNkZWZpbmUgWFBHX01PRElGSUVSCQkxMjgKLQotI2RlZmluZSBDRU5fU1BFQ0lGSUMJKENFTl9SRVZJU0lPTnxDRU5fU1BPTlNPUnxDRU5fU1BFQ0lBTHxDRU5fQVVESUVOQ0UpCi0jZGVmaW5lIFhQR19TUEVDSUZJQwkoWFBHX0NPREVTRVR8WFBHX05PUk1fQ09ERVNFVHxYUEdfTU9ESUZJRVIpCi0KLQotc3RydWN0IGxvYWRlZF9sMTBuZmlsZQotewotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgaW50IGRlY2lkZWQ7Ci0KLSAgY29uc3Qgdm9pZCAqZGF0YTsKLQotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpuZXh0OwotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpzdWNjZXNzb3JbMV07Ci19OwotCi0KLWV4dGVybiBjb25zdCBjaGFyICpfbmxfbm9ybWFsaXplX2NvZGVzZXQgUEFSQU1TICgoY29uc3QgY2hhciAqY29kZXNldCwKLQkJCQkJCSAgc2l6ZV90IG5hbWVfbGVuKSk7Ci0KLWV4dGVybiBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKLV9ubF9tYWtlX2wxMG5mbGlzdCBQQVJBTVMgKChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbDEwbmZpbGVfbGlzdCwKLQkJCSAgICBjb25zdCBjaGFyICpkaXJsaXN0LCBzaXplX3QgZGlybGlzdF9sZW4sIGludCBtYXNrLAotCQkJICAgIGNvbnN0IGNoYXIgKmxhbmd1YWdlLCBjb25zdCBjaGFyICp0ZXJyaXRvcnksCi0JCQkgICAgY29uc3QgY2hhciAqY29kZXNldCwKLQkJCSAgICBjb25zdCBjaGFyICpub3JtYWxpemVkX2NvZGVzZXQsCi0JCQkgICAgY29uc3QgY2hhciAqbW9kaWZpZXIsIGNvbnN0IGNoYXIgKnNwZWNpYWwsCi0JCQkgICAgY29uc3QgY2hhciAqc3BvbnNvciwgY29uc3QgY2hhciAqcmV2aXNpb24sCi0JCQkgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBkb19hbGxvY2F0ZSkpOwotCi0KLWV4dGVybiBjb25zdCBjaGFyICpfbmxfZXhwYW5kX2FsaWFzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLQotZXh0ZXJuIGludCBfbmxfZXhwbG9kZV9uYW1lIFBBUkFNUyAoKGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKipsYW5ndWFnZSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKiptb2RpZmllciwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKip0ZXJyaXRvcnksCi0JCQkJICAgICBjb25zdCBjaGFyICoqY29kZXNldCwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKipub3JtYWxpemVkX2NvZGVzZXQsCi0JCQkJICAgICBjb25zdCBjaGFyICoqc3BlY2lhbCwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKipzcG9uc29yLAotCQkJCSAgICAgY29uc3QgY2hhciAqKnJldmlzaW9uKSk7CmRpZmYgLS1naXQgYS9pbnRsL2xvYWRtc2djYXQuYyBiL2ludGwvbG9hZG1zZ2NhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2U5MGE5Li4wMDAwMDAwCi0tLSBhL2ludGwvbG9hZG1zZ2NhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qIExvYWQgbmVlZGVkIG1lc3NhZ2UgY2F0YWxvZ3MKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCkgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0LmgiCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZkZWYgX0xJQkMKLS8qIFJlbmFtZSB0aGUgbm9uIElTTyBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0gICBiZWNhdXNlIHNvbWUgSVNPIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKLSAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KLSMgZGVmaW5lIGZzdGF0ICBfX2ZzdGF0Ci0jIGRlZmluZSBvcGVuICAgX19vcGVuCi0jIGRlZmluZSBjbG9zZSAgX19jbG9zZQotIyBkZWZpbmUgcmVhZCAgIF9fcmVhZAotIyBkZWZpbmUgbW1hcCAgIF9fbW1hcAotIyBkZWZpbmUgbXVubWFwIF9fbXVubWFwCi0jZW5kaWYKLQotLyogV2UgbmVlZCBhIHNpZ24sIHdoZXRoZXIgYSBuZXcgY2F0YWxvZyB3YXMgbG9hZGVkLCB3aGljaCBjYW4gYmUgYXNzb2NpYXRlZAotICAgd2l0aCBhbGwgdHJhbnNsYXRpb25zLiAgVGhpcyBpcyBpbXBvcnRhbnQgaWYgdGhlIHRyYW5zbGF0aW9ucyBhcmUKLSAgIGNhY2hlZCBieSBvbmUgb2YgR0NDJ3MgZmVhdHVyZXMuICAqLwotaW50IF9ubF9tc2dfY2F0X2NudHIgPSAwOwotCi0KLS8qIExvYWQgdGhlIG1lc3NhZ2UgY2F0YWxvZ3Mgc3BlY2lmaWVkIGJ5IEZJTEVOQU1FLiAgSWYgaXQgaXMgbm8gdmFsaWQKLSAgIG1lc3NhZ2UgY2F0YWxvZyBkbyBub3RoaW5nLiAgKi8KLXZvaWQKLV9ubF9sb2FkX2RvbWFpbiAoZG9tYWluX2ZpbGUpCi0gICAgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlOwotewotICBpbnQgZmQ7Ci0gIHN0cnVjdCBzdGF0IHN0OwotICBzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKmRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIC0xOwotI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKLSAgICB8fCBkZWZpbmVkIF9MSUJDCi0gIGludCB1c2VfbW1hcCA9IDA7Ci0jZW5kaWYKLSAgc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbjsKLQotICBkb21haW5fZmlsZS0+ZGVjaWRlZCA9IDE7Ci0gIGRvbWFpbl9maWxlLT5kYXRhID0gTlVMTDsKLQotICAvKiBJZiB0aGUgcmVjb3JkIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIGxvY2FsZSB0aGUgRklMRU5BTUUKLSAgICAgbWlnaHQgYmUgTlVMTC4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4KLSAgICAgc3BlY2lmaWNhdGlvbiB0aGUgbG9jYWxlIGZpbGUgbmFtZSBpcyBkaWZmZXJlbnQgZm9yIFhQRyBhbmQgQ0VOCi0gICAgIHN5bnRheC4gICovCi0gIGlmIChkb21haW5fZmlsZS0+ZmlsZW5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogVHJ5IHRvIG9wZW4gdGhlIGFkZHJlc3NlZCBmaWxlLiAgKi8KLSAgZmQgPSBvcGVuIChkb21haW5fZmlsZS0+ZmlsZW5hbWUsIE9fUkRPTkxZKTsKLSAgaWYgKGZkID09IC0xKQotICAgIHJldHVybjsKLQotICAvKiBXZSBtdXN0IGtub3cgYWJvdXQgdGhlIHNpemUgb2YgdGhlIGZpbGUuICAqLwotICBpZiAoZnN0YXQgKGZkLCAmc3QpICE9IDAKLSAgICAgICYmIHN0LnN0X3NpemUgPCAob2ZmX3QpIHNpemVvZiAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyKSkKLSAgICB7Ci0gICAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gICovCi0gICAgICBjbG9zZSAoZmQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKLSAgICB8fCBkZWZpbmVkIF9MSUJDCi0gIC8qIE5vdyB3ZSBhcmUgcmVhZHkgdG8gbG9hZCB0aGUgZmlsZS4gIElmIG1tYXAoKSBpcyBhdmFpbGFibGUgd2UgdHJ5Ci0gICAgIHRoaXMgZmlyc3QuICBJZiBub3QgYXZhaWxhYmxlIG9yIGl0IGZhaWxlZCB3ZSB0cnkgdG8gbG9hZCBpdC4gICovCi0gIGRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIG1tYXAgKE5VTEwsIHN0LnN0X3NpemUsIFBST1RfUkVBRCwKLQkJCQkJIE1BUF9QUklWQVRFLCBmZCwgMCk7Ci0KLSAgaWYgKGRhdGEgIT0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMSkKLSAgICB7Ci0gICAgICAvKiBtbWFwKCkgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4gICovCi0gICAgICBjbG9zZSAoZmQpOwotICAgICAgdXNlX21tYXAgPSAxOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIElmIHRoZSBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIChpLmUuIG1tYXAnZWQpIHdlIHRyeSB0byBsb2FkCi0gICAgIGl0IG1hbnVhbGx5LiAgKi8KLSAgaWYgKGRhdGEgPT0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMSkKLSAgICB7Ci0gICAgICBvZmZfdCB0b19yZWFkOwotICAgICAgY2hhciAqcmVhZF9wdHI7Ci0KLSAgICAgIGRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIG1hbGxvYyAoc3Quc3Rfc2l6ZSk7Ci0gICAgICBpZiAoZGF0YSA9PSBOVUxMKQotCXJldHVybjsKLQotICAgICAgdG9fcmVhZCA9IHN0LnN0X3NpemU7Ci0gICAgICByZWFkX3B0ciA9IChjaGFyICopIGRhdGE7Ci0gICAgICBkbwotCXsKLQkgIGxvbmcgaW50IG5iID0gKGxvbmcgaW50KSByZWFkIChmZCwgcmVhZF9wdHIsIHRvX3JlYWQpOwotCSAgaWYgKG5iID09IC0xKQotCSAgICB7Ci0JICAgICAgY2xvc2UgKGZkKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgcmVhZF9wdHIgKz0gbmI7Ci0JICB0b19yZWFkIC09IG5iOwotCX0KLSAgICAgIHdoaWxlICh0b19yZWFkID4gMCk7Ci0KLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgfQotCi0gIC8qIFVzaW5nIHRoZSBtYWdpYyBudW1iZXIgd2UgY2FuIHRlc3Qgd2hldGhlciBpdCByZWFsbHkgaXMgYSBtZXNzYWdlCi0gICAgIGNhdGFsb2cgZmlsZS4gICovCi0gIGlmIChkYXRhLT5tYWdpYyAhPSBfTUFHSUMgJiYgZGF0YS0+bWFnaWMgIT0gX01BR0lDX1NXQVBQRUQpCi0gICAgewotICAgICAgLyogVGhlIG1hZ2ljIG51bWJlciBpcyB3cm9uZzogbm90IGEgbWVzc2FnZSBjYXRhbG9nIGZpbGUuICAqLwotI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKLSAgICB8fCBkZWZpbmVkIF9MSUJDCi0gICAgICBpZiAodXNlX21tYXApCi0JbXVubWFwICgoY2FkZHJfdCkgZGF0YSwgc3Quc3Rfc2l6ZSk7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQlmcmVlIChkYXRhKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZG9tYWluX2ZpbGUtPmRhdGEKLSAgICA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxvYWRlZF9kb21haW4pKTsKLSAgaWYgKGRvbWFpbl9maWxlLT5kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGRvbWFpbiA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBkb21haW5fZmlsZS0+ZGF0YTsKLSAgZG9tYWluLT5kYXRhID0gKGNoYXIgKikgZGF0YTsKLSAgZG9tYWluLT5tdXN0X3N3YXAgPSBkYXRhLT5tYWdpYyAhPSBfTUFHSUM7Ci0KLSAgLyogRmlsbCBpbiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGF2YWlsYWJsZSB0YWJsZXMuICAqLwotICBzd2l0Y2ggKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5yZXZpc2lvbikpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIGRvbWFpbi0+bnN0cmluZ3MgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+bnN0cmluZ3MpOwotICAgICAgZG9tYWluLT5vcmlnX3RhYiA9IChzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKikKLQkoKGNoYXIgKikgZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5vcmlnX3RhYl9vZmZzZXQpKTsKLSAgICAgIGRvbWFpbi0+dHJhbnNfdGFiID0gKHN0cnVjdCBzdHJpbmdfZGVzYyAqKQotCSgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnRyYW5zX3RhYl9vZmZzZXQpKTsKLSAgICAgIGRvbWFpbi0+aGFzaF9zaXplID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPmhhc2hfdGFiX3NpemUpOwotICAgICAgZG9tYWluLT5oYXNoX3RhYiA9IChubHNfdWludDMyICopCi0JKChjaGFyICopIGRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+aGFzaF90YWJfb2Zmc2V0KSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogVGhpcyBpcyBhbiBpbGxlZ2FsIHJldmlzaW9uLiAgKi8KLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCi0gICAgfHwgZGVmaW5lZCBfTElCQwotICAgICAgaWYgKHVzZV9tbWFwKQotCW11bm1hcCAoKGNhZGRyX3QpIGRhdGEsIHN0LnN0X3NpemUpOwotICAgICAgZWxzZQotI2VuZGlmCi0JZnJlZSAoZGF0YSk7Ci0gICAgICBmcmVlIChkb21haW4pOwotICAgICAgZG9tYWluX2ZpbGUtPmRhdGEgPSBOVUxMOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBTaG93IHRoYXQgb25lIGRvbWFpbiBpcyBjaGFuZ2VkLiAgVGhpcyBtaWdodCBtYWtlIHNvbWUgY2FjaGVkCi0gICAgIHRyYW5zbGF0aW9ucyBpbnZhbGlkLiAgKi8KLSAgKytfbmxfbXNnX2NhdF9jbnRyOwotfQpkaWZmIC0tZ2l0IGEvaW50bC9sb2NhbGVhbGlhcy5jIGIvaW50bC9sb2NhbGVhbGlhcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGQ5MTk0Li4wMDAwMDAwCi0tLSBhL2ludGwvbG9jYWxlYWxpYXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vKiBIYW5kbGUgYWxpYXNlcyBmb3IgbG9jYWxlIG5hbWVzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQotI2Vsc2UKLSMgaWYgZGVmaW5lZCBIQVZFX0FMTE9DQV9IIHx8IGRlZmluZWQgX0xJQkMKLSMgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyBlbHNlCi0jICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgIGVsc2UKLSMgICBpZm5kZWYgYWxsb2NhCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotY2hhciAqZ2V0ZW52ICgpOwotIyBpZmRlZiBIQVZFX01BTExPQ19ICi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgZWxzZQotdm9pZCBmcmVlICgpOwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgX0dOVV9TT1VSQ0UKLSMgIGRlZmluZSBfR05VX1NPVVJDRQkxCi0jIGVuZGlmCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyBpZm5kZWYgbWVtY3B5Ci0jICBkZWZpbmUgbWVtY3B5KERzdCwgU3JjLCBOdW0pIGJjb3B5IChTcmMsIERzdCwgTnVtKQotIyBlbmRpZgotI2VuZGlmCi0jaWYgIUhBVkVfU1RSQ0hSICYmICFkZWZpbmVkIF9MSUJDCi0jIGlmbmRlZiBzdHJjaHIKLSMgIGRlZmluZSBzdHJjaHIgaW5kZXgKLSMgZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSAiZ2V0dGV4dC5oIgotI2luY2x1ZGUgImdldHRleHRQLmgiCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmZGVmIF9MSUJDCi0vKiBSZW5hbWUgdGhlIG5vbiBBTlNJIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKLSAgIGJlY2F1c2Ugc29tZSBBTlNJIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKLSAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KLSMgZGVmaW5lIHN0cmNhc2VjbXAgX19zdHJjYXNlY21wCi0jZW5kaWYKLQotCi0vKiBGb3IgdGhvc2UgbG9vc2luZyBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgYGFsbG9jYScgd2UgaGF2ZSB0byBhZGQKLSAgIHNvbWUgYWRkaXRpb25hbCBjb2RlIGVtdWxhdGluZyBpdC4gICovCi0jaWZkZWYgSEFWRV9BTExPQ0EKLS8qIE5vdGhpbmcgaGFzIHRvIGJlIGRvbmUuICAqLwotIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHJlc3MpIC8qIG5vdGhpbmcgKi8KLSMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpIC8qIG5vdGhpbmcgKi8KLSNlbHNlCi1zdHJ1Y3QgYmxvY2tfbGlzdAotewotICB2b2lkICphZGRyZXNzOwotICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV4dDsKLX07Ci0jIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcikJCQkJCQkgICAgICBcCi0gIGRvIHsJCQkJCQkJCQkgICAgICBcCi0gICAgc3RydWN0IGJsb2NrX2xpc3QgKm5ld3AgPSAoc3RydWN0IGJsb2NrX2xpc3QgKikgbWFsbG9jIChzaXplb2YgKCpuZXdwKSk7ICBcCi0gICAgLyogSWYgd2UgY2Fubm90IGdldCBhIGZyZWUgYmxvY2sgd2UgY2Fubm90IGFkZCB0aGUgbmV3IGVsZW1lbnQgdG8JICAgICAgXAotICAgICAgIHRoZSBsaXN0LiAgKi8JCQkJCQkJICAgICAgXAotICAgIGlmIChuZXdwICE9IE5VTEwpIHsJCQkJCQkJICAgICAgXAotICAgICAgbmV3cC0+YWRkcmVzcyA9IChhZGRyKTsJCQkJCQkgICAgICBcCi0gICAgICBuZXdwLT5uZXh0ID0gKGxpc3QpOwkJCQkJCSAgICAgIFwKLSAgICAgIChsaXN0KSA9IG5ld3A7CQkJCQkJCSAgICAgIFwKLSAgICB9CQkJCQkJCQkJICAgICAgXAotICB9IHdoaWxlICgwKQotIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkJCQkJCQkgICAgICBcCi0gIGRvIHsJCQkJCQkJCQkgICAgICBcCi0gICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkgewkJCQkJCSAgICAgIFwKLSAgICAgIHN0cnVjdCBibG9ja19saXN0ICpvbGQgPSBsaXN0OwkJCQkJICAgICAgXAotICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CQkJCQkJICAgICAgXAotICAgICAgZnJlZSAob2xkKTsJCQkJCQkJICAgICAgXAotICAgIH0JCQkJCQkJCQkgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jIHVuZGVmIGFsbG9jYQotIyBkZWZpbmUgYWxsb2NhKHNpemUpIChtYWxsb2MgKHNpemUpKQotI2VuZGlmCS8qIGhhdmUgYWxsb2NhICovCi0KLQotc3RydWN0IGFsaWFzX21hcAotewotICBjb25zdCBjaGFyICphbGlhczsKLSAgY29uc3QgY2hhciAqdmFsdWU7Ci19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgYWxpYXNfbWFwICptYXA7Ci1zdGF0aWMgc2l6ZV90IG5tYXAgPSAwOwotc3RhdGljIHNpemVfdCBtYXhtYXAgPSAwOwotCi0KLS8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgc2l6ZV90IHJlYWRfYWxpYXNfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICpmbmFtZSwgaW50IGZuYW1lX2xlbikpOwotc3RhdGljIHZvaWQgZXh0ZW5kX2FsaWFzX3RhYmxlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgYWxpYXNfY29tcGFyZSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAxLAotCQkJCSAgY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMikpOwotCi0KLWNvbnN0IGNoYXIgKgotX25sX2V4cGFuZF9hbGlhcyAobmFtZSkKLSAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdGF0aWMgY29uc3QgY2hhciAqbG9jYWxlX2FsaWFzX3BhdGggPSBMT0NBTEVfQUxJQVNfUEFUSDsKLSAgc3RydWN0IGFsaWFzX21hcCAqcmV0dmFsOwotICBzaXplX3QgYWRkZWQ7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWxpYXNfbWFwIGl0ZW07Ci0KLSAgICAgIGl0ZW0uYWxpYXMgPSBuYW1lOwotCi0gICAgICBpZiAobm1hcCA+IDApCi0JcmV0dmFsID0gKHN0cnVjdCBhbGlhc19tYXAgKikgYnNlYXJjaCAoJml0ZW0sIG1hcCwgbm1hcCwKLQkJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCksCi0JCQkJCSAgICAgICAoaW50ICgqKSBQQVJBTVMgKChjb25zdCB2b2lkICosCi0JCQkJCQkJCSBjb25zdCB2b2lkICopKQotCQkJCQkJKSBhbGlhc19jb21wYXJlKTsKLSAgICAgIGVsc2UKLQlyZXR2YWwgPSBOVUxMOwotCi0gICAgICAvKiBXZSByZWFsbHkgZm91bmQgYW4gYWxpYXMuICBSZXR1cm4gdGhlIHZhbHVlLiAgKi8KLSAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQlyZXR1cm4gcmV0dmFsLT52YWx1ZTsKLQotICAgICAgLyogUGVyaGFwcyB3ZSBjYW4gZmluZCBhbm90aGVyIGFsaWFzIGZpbGUuICAqLwotICAgICAgYWRkZWQgPSAwOwotICAgICAgd2hpbGUgKGFkZGVkID09IDAgJiYgbG9jYWxlX2FsaWFzX3BhdGhbMF0gIT0gJ1wwJykKLQl7Ci0JICBjb25zdCBjaGFyICpzdGFydDsKLQotCSAgd2hpbGUgKGxvY2FsZV9hbGlhc19wYXRoWzBdID09ICc6JykKLQkgICAgKytsb2NhbGVfYWxpYXNfcGF0aDsKLQkgIHN0YXJ0ID0gbG9jYWxlX2FsaWFzX3BhdGg7Ci0KLQkgIHdoaWxlIChsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSAnXDAnICYmIGxvY2FsZV9hbGlhc19wYXRoWzBdICE9ICc6JykKLQkgICAgKytsb2NhbGVfYWxpYXNfcGF0aDsKLQotCSAgaWYgKHN0YXJ0IDwgbG9jYWxlX2FsaWFzX3BhdGgpCi0JICAgIGFkZGVkID0gcmVhZF9hbGlhc19maWxlIChzdGFydCwgbG9jYWxlX2FsaWFzX3BhdGggLSBzdGFydCk7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGFkZGVkICE9IDApOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBzaXplX3QKLXJlYWRfYWxpYXNfZmlsZSAoZm5hbWUsIGZuYW1lX2xlbikKLSAgICAgY29uc3QgY2hhciAqZm5hbWU7Ci0gICAgIGludCBmbmFtZV9sZW47Ci17Ci0jaWZuZGVmIEhBVkVfQUxMT0NBCi0gIHN0cnVjdCBibG9ja19saXN0ICpibG9ja19saXN0ID0gTlVMTDsKLSNlbmRpZgotICBGSUxFICpmcDsKLSAgY2hhciAqZnVsbF9mbmFtZTsKLSAgc2l6ZV90IGFkZGVkOwotICBzdGF0aWMgY29uc3QgY2hhciBhbGlhc2ZpbGVbXSA9ICIvbG9jYWxlLmFsaWFzIjsKLQotICBmdWxsX2ZuYW1lID0gKGNoYXIgKikgYWxsb2NhIChmbmFtZV9sZW4gKyBzaXplb2YgYWxpYXNmaWxlKTsKLSAgQUREX0JMT0NLIChibG9ja19saXN0LCBmdWxsX2ZuYW1lKTsKLSAgbWVtY3B5IChmdWxsX2ZuYW1lLCBmbmFtZSwgZm5hbWVfbGVuKTsKLSAgbWVtY3B5ICgmZnVsbF9mbmFtZVtmbmFtZV9sZW5dLCBhbGlhc2ZpbGUsIHNpemVvZiBhbGlhc2ZpbGUpOwotCi0gIGZwID0gZm9wZW4gKGZ1bGxfZm5hbWUsICJyIik7Ci0gIGlmIChmcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBhZGRlZCA9IDA7Ci0gIHdoaWxlICghZmVvZiAoZnApKQotICAgIHsKLSAgICAgIC8qIEl0IGlzIGEgcmVhc29uYWJsZSBhcHByb2FjaCB0byB1c2UgYSBmaXggYnVmZmVyIGhlcmUgYmVjYXVzZQotCSBhKSB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBmaXJzdCB0d28gZmllbGRzCi0JIGIpIHRoZXNlIGZpZWxkcyBtdXN0IGJlIHVzYWJsZSBhcyBmaWxlIG5hbWVzIGFuZCBzbyBtdXN0IG5vdAotCSAgICBiZSB0aGF0IGxvbmcKLSAgICAgICAqLwotICAgICAgY2hhciBidWZbQlVGU0laXTsKLSAgICAgIGNoYXIgKmFsaWFzOwotICAgICAgY2hhciAqdmFsdWU7Ci0gICAgICBjaGFyICpjcDsKLQotICAgICAgaWYgKGZnZXRzIChidWYsIEJVRlNJWiwgZnApID09IE5VTEwpCi0JLyogRU9GIHJlYWNoZWQuICAqLwotCWJyZWFrOwotCi0gICAgICBjcCA9IGJ1ZjsKLSAgICAgIC8qIElnbm9yZSBsZWFkaW5nIHdoaXRlIHNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlIChjcFswXSkpCi0JKytjcDsKLQotICAgICAgLyogQSBsZWFkaW5nICcjJyBzaWduYWxzIGEgY29tbWVudCBsaW5lLiAgKi8KLSAgICAgIGlmIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcjJykKLQl7Ci0JICBhbGlhcyA9IGNwKys7Ci0JICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiAhaXNzcGFjZSAoY3BbMF0pKQotCSAgICArK2NwOwotCSAgLyogVGVybWluYXRlIGFsaWFzIG5hbWUuICAqLwotCSAgaWYgKGNwWzBdICE9ICdcMCcpCi0JICAgICpjcCsrID0gJ1wwJzsKLQotCSAgLyogTm93IGxvb2sgZm9yIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHZhbHVlLiAgKi8KLQkgIHdoaWxlIChpc3NwYWNlIChjcFswXSkpCi0JICAgICsrY3A7Ci0KLQkgIGlmIChjcFswXSAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgY2hhciAqdHA7Ci0JICAgICAgc2l6ZV90IGxlbjsKLQotCSAgICAgIHZhbHVlID0gY3ArKzsKLQkgICAgICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiAhaXNzcGFjZSAoY3BbMF0pKQotCQkrK2NwOwotCSAgICAgIC8qIFRlcm1pbmF0ZSB2YWx1ZS4gICovCi0JICAgICAgaWYgKGNwWzBdID09ICdcbicpCi0JCXsKLQkJICAvKiBUaGlzIGhhcyB0byBiZSBkb25lIHRvIG1ha2UgdGhlIGZvbGxvd2luZyB0ZXN0Ci0JCSAgICAgZm9yIHRoZSBlbmQgb2YgbGluZSBwb3NzaWJsZS4gIFdlIGFyZSBsb29raW5nIGZvcgotCQkgICAgIHRoZSB0ZXJtaW5hdGluZyAnXG4nIHdoaWNoIGRvIG5vdCBvdmVyd3JpdGUgaGVyZS4gICovCi0JCSAgKmNwKysgPSAnXDAnOwotCQkgICpjcCA9ICdcbic7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChjcFswXSAhPSAnXDAnKQotCQkqY3ArKyA9ICdcMCc7Ci0KLQkgICAgICBpZiAobm1hcCA+PSBtYXhtYXApCi0JCWV4dGVuZF9hbGlhc190YWJsZSAoKTsKLQotCSAgICAgIC8qIFdlIGNhbm5vdCBkZXBlbmQgb24gc3RyZHVwIGF2YWlsYWJsZSBpbiB0aGUgbGliYy4gIFNpZ2ghICAqLwotCSAgICAgIGxlbiA9IHN0cmxlbiAoYWxpYXMpICsgMTsKLQkgICAgICB0cCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLQkgICAgICBpZiAodHAgPT0gTlVMTCkKLQkJewotCQkgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLQkJICByZXR1cm4gYWRkZWQ7Ci0JCX0KLQkgICAgICBtZW1jcHkgKHRwLCBhbGlhcywgbGVuKTsKLQkgICAgICBtYXBbbm1hcF0uYWxpYXMgPSB0cDsKLQotCSAgICAgIGxlbiA9IHN0cmxlbiAodmFsdWUpICsgMTsKLQkgICAgICB0cCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLQkgICAgICBpZiAodHAgPT0gTlVMTCkKLQkJewotCQkgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLQkJICByZXR1cm4gYWRkZWQ7Ci0JCX0KLQkgICAgICBtZW1jcHkgKHRwLCB2YWx1ZSwgbGVuKTsKLQkgICAgICBtYXBbbm1hcF0udmFsdWUgPSB0cDsKLQotCSAgICAgICsrbm1hcDsKLQkgICAgICArK2FkZGVkOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBQb3NzaWJseSBub3QgdGhlIHdob2xlIGxpbmUgZml0cyBpbnRvIHRoZSBidWZmZXIuICBJZ25vcmUKLQkgdGhlIHJlc3Qgb2YgdGhlIGxpbmUuICAqLwotICAgICAgd2hpbGUgKHN0cmNociAoY3AsICdcbicpID09IE5VTEwpCi0JewotCSAgY3AgPSBidWY7Ci0JICBpZiAoZmdldHMgKGJ1ZiwgQlVGU0laLCBmcCkgPT0gTlVMTCkKLQkgICAgLyogTWFrZSBzdXJlIHRoZSBpbm5lciBsb29wIHdpbGwgYmUgbGVmdC4gIFRoZSBvdXRlciBsb29wCi0JICAgICAgIHdpbGwgZXhpdCBhdCB0aGUgYGZlb2YnIHRlc3QuICAqLwotCSAgICAqY3AgPSAnXG4nOwotCX0KLSAgICB9Ci0KLSAgLyogU2hvdWxkIHdlIHRlc3QgZm9yIGZlcnJvcigpPyAgSSB0aGluayB3ZSBoYXZlIHRvIHNpbGVudGx5IGlnbm9yZQotICAgICBlcnJvcnMuICAtLWRyZXBwZXIgICovCi0gIGZjbG9zZSAoZnApOwotCi0gIGlmIChhZGRlZCA+IDApCi0gICAgcXNvcnQgKG1hcCwgbm1hcCwgc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSwKLQkgICAoaW50ICgqKSBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpKSBhbGlhc19jb21wYXJlKTsKLQotICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7Ci0gIHJldHVybiBhZGRlZDsKLX0KLQotCi1zdGF0aWMgdm9pZAotZXh0ZW5kX2FsaWFzX3RhYmxlICgpCi17Ci0gIHNpemVfdCBuZXdfc2l6ZTsKLSAgc3RydWN0IGFsaWFzX21hcCAqbmV3X21hcDsKLQotICBuZXdfc2l6ZSA9IG1heG1hcCA9PSAwID8gMTAwIDogMiAqIG1heG1hcDsKLSAgbmV3X21hcCA9IChzdHJ1Y3QgYWxpYXNfbWFwICopIG1hbGxvYyAobmV3X3NpemUKLQkJCQkJICogc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSk7Ci0gIGlmIChuZXdfbWFwID09IE5VTEwpCi0gICAgLyogU2ltcGx5IGRvbid0IGV4dGVuZDogd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBjb3JlLiAgKi8KLSAgICByZXR1cm47Ci0KLSAgbWVtY3B5IChuZXdfbWFwLCBtYXAsIG5tYXAgKiBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApKTsKLQotICBpZiAobWF4bWFwICE9IDApCi0gICAgZnJlZSAobWFwKTsKLQotICBtYXAgPSBuZXdfbWFwOwotICBtYXhtYXAgPSBuZXdfc2l6ZTsKLX0KLQotCi1zdGF0aWMgaW50Ci1hbGlhc19jb21wYXJlIChtYXAxLCBtYXAyKQotICAgICBjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAxOwotICAgICBjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAyOwotewotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkNBU0VDTVAKLSAgcmV0dXJuIHN0cmNhc2VjbXAgKG1hcDEtPmFsaWFzLCBtYXAyLT5hbGlhcyk7Ci0jZWxzZQotICBjb25zdCB1bnNpZ25lZCBjaGFyICpwMSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG1hcDEtPmFsaWFzOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpwMiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG1hcDItPmFsaWFzOwotICB1bnNpZ25lZCBjaGFyIGMxLCBjMjsKLQotICBpZiAocDEgPT0gcDIpCi0gICAgcmV0dXJuIDA7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICAvKiBJIGtub3cgdGhpcyBzZWVtcyB0byBiZSBvZGQgYnV0IHRoZSB0b2xvd2VyKCkgZnVuY3Rpb24gaW4KLQkgc29tZSBzeXN0ZW1zIGxpYmMgY2Fubm90IGhhbmRsZSBub25hbHBoYSBjaGFyYWN0ZXJzLiAgKi8KLSAgICAgIGMxID0gaXN1cHBlciAoKnAxKSA/IHRvbG93ZXIgKCpwMSkgOiAqcDE7Ci0gICAgICBjMiA9IGlzdXBwZXIgKCpwMikgPyB0b2xvd2VyICgqcDIpIDogKnAyOwotICAgICAgaWYgKGMxID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICArK3AxOwotICAgICAgKytwMjsKLSAgICB9Ci0gIHdoaWxlIChjMSA9PSBjMik7Ci0KLSAgcmV0dXJuIGMxIC0gYzI7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2ludGwvcG8ydGJsLnNlZC5pbiBiL2ludGwvcG8ydGJsLnNlZC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNiY2NhNC4uMDAwMDAwMAotLS0gYS9pbnRsL3BvMnRibC5zZWQuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotIyBwbzJ0Ymwuc2VkIC0gQ29udmVydCBVbmlmb3J1bSBzdHlsZSAucG8gZmlsZSB0byBsb29rdXAgdGFibGUgZm9yIGNhdGdldHMKLSMgQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0xIHsKLSAgaVwKLS8qIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHBvMnRibC5zZWQgZnJvbSBAUEFDS0FHRSBOQU1FQC5wb3QuICAqL1wKLVwKLSNpZiBIQVZFX0NPTkZJR19IXAotIyBpbmNsdWRlIDxjb25maWcuaD5cCi0jZW5kaWZcCi1cCi0jaW5jbHVkZSAibGliZ2V0dGV4dC5oIlwKLVwKLWNvbnN0IHN0cnVjdCBfbXNnX2VudCBfbXNnX3RibFtdID0gewotICBoCi0gIHMvLiovMC8KLSAgeAotfQotIwotIyBXcml0ZSBtc2dpZCBlbnRyaWVzIGluIEMgYXJyYXkgZm9ybS4KLSMKLS9ebXNnaWQvIHsKLSAgcy9tc2dpZFsgCV0qXCgiLioiXCkvICB7XDEvCi0gIHRiCi0jIEFwcGVuZCB0aGUgbmV4dCBsaW5lCi0gIDpiCi0gIE4KLSMgTG9vayB3aGV0aGVyIHNlY29uZCBwYXJ0IGlzIGNvbnRpbnVhdGlvbiBsaW5lLgotICBzL1woLipcKSJcKFxuXCkiXCguKiJcKS9cMVwyXDMvCi0jIFllcywgdGhlbiBicmFuY2guCi0gIHRhCi0jIEJlY2F1c2Ugd2UgYXNzdW1lIHRoYXQgdGhlIGlucHV0IGZpbGUgY29ycmVjdGx5IGZvcm1lZCB0aGUgbGluZQotIyBqdXN0IHJlYWQgY2Fubm90IGJlIGFnYWluIGJlIGEgbXNnaWQgbGluZS4gIFNvIGl0J3Mgc2FmZSB0byBpZ25vcmUKLSMgaXQuCi0gIHMvXCguKlwpXG4uKi9cMS8KLSAgYmMKLSMgV2UgZm91bmQgYSBjb250aW51YXRpb24gbGluZS4gIEJ1dCBiZWZvcmUgcHJpbnRpbmcgaW5zZXJ0ICdcJy4KLSAgOmEKLSAgcy9cKC4qXClcKFxuLipcKS9cMVxcXDIvCi0gIFAKLSMgV2UgY2Fubm90IHVzZSBEIGhlcmUuCi0gIHMvLipcblwoLipcKS9cMS8KLSMgU29tZSBidWdneSBzZWRzIGRvIG5vdCBjbGVhciB0aGUgYHN1Y2Nlc3NmdWwgc3Vic3RpdHV0aW9uIHNpbmNlIGxhc3QgYGB0JycnCi0jIGZsYWcgb24gYE4nLCBzbyB3ZSBkbyBhIGB0JyBoZXJlIHRvIGNsZWFyIGl0LgotICB0YgotIyBOb3QgcmVhY2hlZAotICA6YwotICB4Ci0jIFRoZSBmb2xsb3dpbmcgbmljZSBzb2x1dGlvbiBpcyBieQotIyBCcnVubyA8SGFpYmxlQG1hMnMyLm1hdGhlbWF0aWsudW5pLWthcmxzcnVoZS5kZT4KLSAgdGQKLSMgSW5jcmVtZW50IGEgZGVjaW1hbCBudW1iZXIgaW4gcGF0dGVybiBzcGFjZS4KLSMgRmlyc3QgaGlkZSB0cmFpbGluZyBgOScgZGlnaXRzLgotICA6ZAotICBzLzlcKF8qXCkkL19cMS8KLSAgdGQKLSMgQXNzdXJlIGF0IGxlYXN0IG9uZSBkaWdpdCBpcyBhdmFpbGFibGUuCi0gIHMvXlwoXypcKSQvMFwxLwotIyBJbmNyZW1lbnQgdGhlIGxhc3QgZGlnaXQuCi0gIHMvOFwoXypcKSQvOVwxLwotICBzLzdcKF8qXCkkLzhcMS8KLSAgcy82XChfKlwpJC83XDEvCi0gIHMvNVwoXypcKSQvNlwxLwotICBzLzRcKF8qXCkkLzVcMS8KLSAgcy8zXChfKlwpJC80XDEvCi0gIHMvMlwoXypcKSQvM1wxLwotICBzLzFcKF8qXCkkLzJcMS8KLSAgcy8wXChfKlwpJC8xXDEvCi0jIENvbnZlcnQgdGhlIGhpZGRlbiBgOScgZGlnaXRzIHRvIGAwJ3MuCi0gIHMvXy8wL2cKLSAgeAotICBHCi0gIHMvXCguKlwpXG5cKFswLTldKlwpL1wxLCBcMn0sLwotICBzL1woLipcKSIkL1wxLwotICBwCi19Ci0jCi0jIExhc3QgbGluZS4KLSMKLSQgewotICBpXAotfTtcCi0KLSAgZwotICBzLzAqXCguKlwpL2ludCBfbXNnX3RibF9sZW5ndGggPSBcMTsvcAotfQotZApkaWZmIC0tZ2l0IGEvaW50bC90ZXh0ZG9tYWluLmMgYi9pbnRsL3RleHRkb21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkOTM0MC4uMDAwMDAwMAotLS0gYS9pbnRsL3RleHRkb21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGV4dGRvbWFpbigzKSBmdW5jdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSMgaWZuZGVmIG1lbWNweQotIyAgZGVmaW5lIG1lbWNweShEc3QsIFNyYywgTnVtKSBiY29weSAoU3JjLCBEc3QsIE51bSkKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogTmFtZSBvZiB0aGUgZGVmYXVsdCB0ZXh0IGRvbWFpbi4gICovCi1leHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbltdOwotCi0vKiBEZWZhdWx0IHRleHQgZG9tYWluIGluIHdoaWNoIGVudHJpZXMgZm9yIGdldHRleHQoMykgYXJlIHRvIGJlIGZvdW5kLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICpfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLQotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIFRFWFRET01BSU4gX190ZXh0ZG9tYWluCi0jIGRlZmluZSBzdHJkdXAoc3RyKSBfX3N0cmR1cCAoc3RyKQotI2Vsc2UKLSMgZGVmaW5lIFRFWFRET01BSU4gdGV4dGRvbWFpbl9fCi0jZW5kaWYKLQotLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCi0gICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgotICAgSWYgRE9NQUlOTkFNRSBpcyAiIiwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgIm1lc3NhZ2VzIi4gICovCi1jaGFyICoKLVRFWFRET01BSU4gKGRvbWFpbm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci17Ci0gIGNoYXIgKm9sZDsKLQotICAvKiBBIE5VTEwgcG9pbnRlciByZXF1ZXN0cyB0aGUgY3VycmVudCBzZXR0aW5nLiAgKi8KLSAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47Ci0KLSAgb2xkID0gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47Ci0KLSAgLyogSWYgZG9tYWluIG5hbWUgaXMgdGhlIG51bGwgc3RyaW5nIHNldCB0byBkZWZhdWx0IGRvbWFpbiAibWVzc2FnZXMiLiAgKi8KLSAgaWYgKGRvbWFpbm5hbWVbMF0gPT0gJ1wwJwotICAgICAgfHwgc3RyY21wIChkb21haW5uYW1lLCBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikgPT0gMCkKLSAgICBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluOwotICBlbHNlCi0gICAgewotICAgICAgLyogSWYgdGhlIGZvbGxvd2luZyBtYWxsb2MgZmFpbHMgYF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluJwotCSB3aWxsIGJlIE5VTEwuICBUaGlzIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQgYW5kIHNvIHNpZ25hbHMgd2UKLQkgYXJlIG91dCBvZiBjb3JlLiAgKi8KLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLSAgICAgIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gc3RyZHVwIChkb21haW5uYW1lKTsKLSNlbHNlCi0gICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkb21haW5uYW1lKSArIDE7Ci0gICAgICBjaGFyICpjcCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLSAgICAgIGlmIChjcCAhPSBOVUxMKQotCW1lbWNweSAoY3AsIGRvbWFpbm5hbWUsIGxlbik7Ci0gICAgICBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IGNwOwotI2VuZGlmCi0gICAgfQotCi0gIGlmIChvbGQgIT0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4pCi0gICAgZnJlZSAob2xkKTsKLQotICByZXR1cm4gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47Ci19Ci0KLSNpZmRlZiBfTElCQwotLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi13ZWFrX2FsaWFzIChfX3RleHRkb21haW4sIHRleHRkb21haW4pOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL3hvcGVuLW1zZy5zZWQgYi9pbnRsL3hvcGVuLW1zZy5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOWMwYmIuLjAwMDAwMDAKLS0tIGEvaW50bC94b3Blbi1tc2cuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLSMgcG8ybXNnLnNlZCAtIENvbnZlcnQgVW5pZm9ydW0gc3R5bGUgLnBvIGZpbGUgdG8gWC9PcGVuIHN0eWxlIC5tc2cgZmlsZQotIyBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMKLSMgVGhlIGZpcnN0IGRpcmVjdGl2ZSBpbiB0aGUgLm1zZyBzaG91bGQgYmUgdGhlIGRlZmluaXRpb24gb2YgdGhlCi0jIG1lc3NhZ2Ugc2V0IG51bWJlci4gIFdlIHVzZSBhbHdheXMgc2V0IG51bWJlciAxLgotIwotMSB7Ci0gIGlcCi0kc2V0IDEgIyBBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgcG8ybXNnLnNlZAotICBoCi0gIHMvLiovMC8KLSAgeAotfQotIwotIyBXZSBjb3B5IGFsbCBjb21tZW50cyBpbnRvIHRoZSAubXNnIGZpbGUuICBQZXJoYXBzIHRoZXkgY2FuIGhlbHAuCi0jCi0vXiMvIHMvXiNbIAldKi8kIC9wCi0jCi0jIFdlIGNvcHkgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgYXMgYSBjb21tZW50IGludG8gdGhlIC5tc2cgZmlsZS4KLSMKLS9ebXNnaWQvIHsKLSMgRG9lcyBub3Qgd29yayBub3cKLSMgIC8iJC8hIHsKLSMgICAgcy9cXCQvLwotIyAgICBzLyQvIC4uLiAobW9yZSBsaW5lcyBmb2xsb3dpbmcpIi8KLSMgIH0KLSAgcy9ebXNnaWRbIAldKiJcKC4qXCkiJC8kIE9yaWdpbmFsIE1lc3NhZ2U6IFwxLwotICBwCi19Ci0jCi0jIFRoZSAubXNnIGZpbGUgY29udGFpbnMsIG90aGVyIHRoZW4gdGhlIC5wbyBmaWxlLCBvbmx5IHRoZSB0cmFuc2xhdGlvbnMKLSMgYnV0IGVhY2ggZ2l2ZW4gYSB1bmlxdWUgSUQuICBTdGFydGluZyBmcm9tIDEgYW5kIGluY3JlbWVudGluZyBieSAxIGZvcgotIyBlYWNoIG1lc3NhZ2Ugd2UgYXNzaWduIHRoZW0gdG8gdGhlIG1lc3NhZ2VzLgotIyBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgLnBvIGZpbGUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY2F0LWlkLXRibC5jIGZpbGUKLSMgKHdpdGggcG8tdG8tdGJsKSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHVzZWQgaGVyZS4gIChBdCBsZWFzdCB0aGUgb3JkZXIKLSMgb2YgZGVjbGFyYXRpb25zIG11c3Qgbm90IGJlIGNoYW5nZWQuKQotIwotL15tc2dzdHIvIHsKLSAgcy9tc2dzdHJbIAldKiJcKC4qXCkiL1wxLwotICB4Ci0jIFRoZSBmb2xsb3dpbmcgbmljZSBzb2x1dGlvbiBpcyBieQotIyBCcnVubyA8SGFpYmxlQG1hMnMyLm1hdGhlbWF0aWsudW5pLWthcmxzcnVoZS5kZT4KLSAgdGQKLSMgSW5jcmVtZW50IGEgZGVjaW1hbCBudW1iZXIgaW4gcGF0dGVybiBzcGFjZS4KLSMgRmlyc3QgaGlkZSB0cmFpbGluZyBgOScgZGlnaXRzLgotICA6ZAotICBzLzlcKF8qXCkkL19cMS8KLSAgdGQKLSMgQXNzdXJlIGF0IGxlYXN0IG9uZSBkaWdpdCBpcyBhdmFpbGFibGUuCi0gIHMvXlwoXypcKSQvMFwxLwotIyBJbmNyZW1lbnQgdGhlIGxhc3QgZGlnaXQuCi0gIHMvOFwoXypcKSQvOVwxLwotICBzLzdcKF8qXCkkLzhcMS8KLSAgcy82XChfKlwpJC83XDEvCi0gIHMvNVwoXypcKSQvNlwxLwotICBzLzRcKF8qXCkkLzVcMS8KLSAgcy8zXChfKlwpJC80XDEvCi0gIHMvMlwoXypcKSQvM1wxLwotICBzLzFcKF8qXCkkLzJcMS8KLSAgcy8wXChfKlwpJC8xXDEvCi0jIENvbnZlcnQgdGhlIGhpZGRlbiBgOScgZGlnaXRzIHRvIGAwJ3MuCi0gIHMvXy8wL2cKLSAgeAotIyBCcmluZyB0aGUgbGluZSBpbiB0aGUgZm9ybWF0IGA8bnVtYmVyPiA8bWVzc2FnZT4nCi0gIEcKLSAgcy9eW15cbl0qJC8mIC8KLSAgcy9cKC4qXClcblwoWzAtOV0qXCkvXDIgXDEvCi0jIENsZWFyIGZsYWcgZnJvbSBsYXN0IHN1YnN0aXR1dGlvbi4KLSAgdGIKLSMgQXBwZW5kIHRoZSBuZXh0IGxpbmUuCi0gIDpiCi0gIE4KLSMgTG9vayB3aGV0aGVyIHNlY29uZCBwYXJ0IGlzIGEgY29udGludWF0aW9uIGxpbmUuCi0gIHMvXCguKlxuXCkiXCguKlwpIi9cMVwyLwotIyBZZXMsIHRoZW4gYnJhbmNoLgotICB0YQotICBQCi0gIEQKLSMgTm90ZSB0aGF0IGBEJyBpbmNsdWRlcyBhIGp1bXAgdG8gdGhlIHN0YXJ0ISEKLSMgV2UgZm91bmQgYSBjb250aW51YXRpb24gbGluZS4gIEJ1dCBiZWZvcmUgcHJpbnRpbmcgaW5zZXJ0ICdcJy4KLSAgOmEKLSAgcy9cKC4qXClcKFxuLipcKS9cMVxcXDIvCi0gIFAKLSMgV2UgY2Fubm90IHVzZSB0aGUgc2VkIGNvbW1hbmQgYEQnIGhlcmUKLSAgcy8uKlxuXCguKlwpL1wxLwotICB0YgotfQotZApkaWZmIC0tZ2l0IGEvbGQvQ2hhbmdlTG9nIGIvbGQvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdjMGE5Li4wMDAwMDAwCi0tLSBhL2xkL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDg5NzIgKzAsMCBAQAotMTk5OS0wNS0yNCAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KLQotCSogZW11bHRlbXBsL2FybWVsZi5lbSAoYmVmb3JlX3BhcnNlKTogU2V0IGNvbmZpZy5keW5hbWljX2xpbmsgYW5kCi0gCWNvbmZpZy5oYXNfc2hhcmVkLgotCSogZW11bHBhcmFtcy9hcm1lbGYuc2ggKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IERlZmluZS4KLQkqIGVtdWxwYXJhbXMvYXJtZWxmX2xpbnV4LnNoIChHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBMaWtld2lzZS4KLQotMTk5OS0wNC0xMyAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KLQotCSogZW11bHRlbXBsL2FybWVsZi5lbTogQWRkIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gc2hhcmVkIG9iamVjdHMKLQkoY29waWVkIGZyb20gZWxmMzIuZW0pLgotCi1XZWQgTWF5IDE5IDEyOjQ0OjI2IDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogUmVtb3ZlIGVhcm1saW51eC5vIGFuZAotCWVhcm0yNmxpbnV4Lm8sIGFkZCBlYXJtZWxmX2xpbnV4Lm8gYW5kIGVhcm1lbGZfbGludXgyNi5vLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgotCi0xOTk5LTA1LTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZjMybWNvcmUuc2ggKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IERlZmluZS4KLQkoVEVNUExBVEVfTkFNRSk6IERlZmluZS4KLQotVGh1IE1heSAxMyAwOTo0ODowOSAxOTk5ICBKb2VsIFNoZXJyaWxsIChqb2VsQE9BUmNvcnAuY29tKQotCi0JKiBjb25maWd1cmUudGd0IChpMzg2LSotcnRlbXNlbGYqLCBzaC0qLXJ0ZW1zZWxmKik6IE5ldyB0YXJnZXRzLgotCShtaXBzKmVsLSotcnRlbXMqLCBwb3dlcnBjbGUtKi1ydGVtcyopOiBOZXcgdGFyZ2V0cy4KLQotMTk5OS0wNS0xMCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+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+ZmxhZ3MgaGVyZS4KLQkqIGxkbGFuZy5jOiBSZW1vdmUgc29tZSBkdXBsaWNhdGUgZXh0ZXJuIGRlY2xhcmF0aW9ucy4KLQkqIGxkZ3JhbS55OiBGaXhlcyB0byAtTiBhbmQgLW4gb3B0aW9ucy4KLQkqIE1ha2VmaWxlLmluOiAgUmVjb2duaXplIHVwcGVyIGNhc2UgbGV0dGVycyBpbiBzZWQgc2NyaXB0Ci0JdG8gcmVtb3ZlIGFzc2lnbm1lbnRzIGZyb20gc2NyaXB0IGZpbGVzLgotCSogbGR0ZW1wbGF0ZTogIERvbid0IGFzc3VrbWUgdGhhdCAtTiBvciAtbiBvcHRpb25zCi0JaW1wbHkgdXNlIG9mIC1yIHNjcmlwdC4KLQkqIG1rc2NyaXB0LmM6ICBUd2Vha2luZyB0byBjb3JyZWN0bHkgaGFuZGxlIFxuIGFuZCBcXCBpbiBpbnB1dC4KLQotRnJpIE9jdCAxMSAxMDoyOToyNyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGxkdGVtcGxhdGU6IGluY2x1ZGUgYmZkLmggYmVmb3JlIHN5c2RlcC5oLgotCi1GcmkgT2N0IDExIDA0OjI0OjQ1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JUmVzdHJ1Y3R1cmUgY29uZmlndXJhdGlvbiBzY2hlbWUgZm9yIGJmZCwgYmludXRpbHMsIGxkLgotCi0JKiBpbmNsdWRlL3N5cy9oLSouaDogIE1vdmUgdG8gYmZkL2hvc3RzL2gtKi5oLgotCSogY29uZmlndXJlLmluOiAgUmV2aXNlIHRvIHN5bWxpbmsgc3lzZGVwLmggdG8gLi4vYmZkL2hvc3RzL2gteHh4LmguCi0JQ2hhbmdlIHNvbWUgY29uZmlnIG5hbWVzIHRvIG1hdGNoIG90aGVyIGRpcnMuCi0JKiAqLmM6ICBJbmNsdWRlIGJmZC5oIGJlZm9yZSBzeXNkZXAuaCwgc28gYW5zaWRlY2wgYW5kIFBST1RPKCkKLQlnZXQgZGVmaW5lZCBmaXJzdC4KLQkqIGNvbmZpZy86ICBSZW5hbWUgc29tZSBjb25maWcgZmlsZXMgdG8gbWF0Y2ggdXAgaC0qLmggbmFtZXMuCi0JUmVtb3ZlIGFsbCB0aGUgSE9TVF9TWVMgZGVmaW5pdGlvbnMgZnJvbSB0aGUgY29uZmlnIGZpbGVzLgotCi1UdWUgT2N0ICA4IDE2OjAwOjU3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBsZGV4cC5oLCBsZGxhbmcuaDogQ2hhbmdlIGVudW0gYm9vbGVhbiAtPiBlbnVtIGJmZF9ib29sZWFuLgotCSogbGR0ZW1wbGF0ZTogUmVtb3ZlIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIGNhbGxzOwotCWp1c3QgdXNlIHRoZSBTRUFSQ0hfRElSIGNvbW1hbmRzIGluIHRoZSBzY3JpcHQgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbjogQWRkIExJQl9QQVRIIG1hY3JvLCB3aGljaCBpZiBzZXQgaXMgdXNlZCB0byByZXBsYWNlCi0JdGhlIFNFQVJDSF9ESVIgY29tbWFuZHMgaW4gdGhlIHNjcmlwdHMgKHVzaW5nIHVnbHkgc2VkIG1hZ2ljKS4KLQlUaGlzIGlzIHByaW1hcmlseSBpbnRlbmRlZCBmb3IgY3Jvc3MtbGlua2luZywgd2hlcmUgeW91IHdvdWxkCi0JcGxhY2UgbGliYXJpZXMgaW4gYSBkaWZmZXJlbnQgcGxhY2UgdGhhbiBuYXRpdmUgbGlicmFyaWVzLgotCUFsc28sIGVtdWxhdGlvbnMgbWFkZSBmcm9tIGxkdGVtcGxhdGUgbm93IHVzZSAkKHNyY2RpcikuCi0JKiBsZGdsZGEyOWsuc2M6ICBDaGFuZ2UgU0VBUkNIX0RJUiBjb21tYW5kcyB0byBhIGNvbnZlbnRpb25hbAotCWZvcm07IHBlb3BsZSBjYW4gdXNlIHRoZSBNYWtlZmlsZSdzIExJQl9QQVRIIHRvIG92ZXJyaWRlLgotCi1UdWUgT2N0ICA4IDE0OjUxOjIxIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBmaXggdGFyZ2V0IGxkLmR2aSwgYWRkIHRhcmdldCBsZC5pbmZvCi0JbGQudGV4aW5mbzogbWFrZSBpbmZvIGZpbGVuYW1lIGxkLmluZm8KLQotRnJpIE9jdCAgNCAyMTo1MTo1OCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBdm9pZCB1c2luZyAkPCBpbiBub24tc3VmZml4IHJ1bGVzIChicmVha3Mgb24gU3VuCi0JTWFrZSkuCi0JKiBsZGZpbGUuYywgbGRsYW5nLmMsIGxkbWFpbi5jLCBsZHdyaXRlLmM6ICBDb3BlIHdpdGggcmVuYW1lcyBvZiBhCi0JZmV3IEJGRCB0eXBlcyAmIGVudW1zLgotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBjaGFuZ2UtbG9nCi1sZWZ0LW1hcmdpbjogOAotZmlsbC1jb2x1bW46IDc0Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9sZC9NYWtlZmlsZS5hbSBiL2xkL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmVlNGVhLi4wMDAwMDAwCi0tLSBhL2xkL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsODYzICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gZ2VuZXJhdGUgTWFrZWZpbGUuaW4KLQotIyMgRklYTUU6IHdvcmsgYXJvdW5kIGFwcGFyZW50IGF1dG9tYWtlIGJ1Zy4KLUlOVExMSUJTID0gQElOVExMSUJTQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzIGRlamFnbnUKLQotU1VCRElSUyA9IHBvCi0KLXRvb2xkaXIgPSAkKGV4ZWNfcHJlZml4KS8kKHRhcmdldF9hbGlhcykKLQotWUFDQyA9IGBpZiBbIC1mIC4uL2Jpc29uL2Jpc29uIF0gOyB0aGVuIGVjaG8gLi4vYmlzb24vYmlzb24gLXkgLUwkKHNyY2RpcikvLi4vYmlzb24vIDsgZWxzZSBlY2hvIGJpc29uIC15IDsgZmlgCi1ZRkxBR1MgPSAtZAotTEVYID0gYGlmIFsgLWYgLi4vZmxleC9mbGV4IF0gOyB0aGVuIGVjaG8gLi4vZmxleC9mbGV4IDsgZWxzZSBlY2hvIGZsZXggOyBmaWAKLQotIyBXZSBwdXQgdGhlIHNjcmlwdHMgaW4gdGhlIGRpcmVjdG9yeSAkKHNjcmlwdGRpcikvbGRzY3JpcHRzLgotIyBXZSBjYW4ndCBwdXQgdGhlIHNjcmlwdHMgaW4gJChkYXRhZGlyKSBiZWNhdXNlIHRoZSBTRUFSQ0hfRElSCi0jIGRpcmVjdGl2ZXMgbmVlZCB0byBiZSBkaWZmZXJlbnQgZm9yIG5hdGl2ZSBhbmQgY3Jvc3MgbGlua2Vycy4KLXNjcmlwdGRpciA9ICQodG9vbGRpcikvbGliCi0KLUVNVUwgPSBARU1VTEAKLUVNVUxBVElPTl9PRklMRVMgPSBARU1VTEFUSU9OX09GSUxFU0AKLUVNVUxfRVhUUkFfT0ZJTEVTID0gQEVNVUxfRVhUUkFfT0ZJTEVTQAotCi0jIFNlYXJjaCBwYXRoIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoIGZvciAtbGZvbyBsaWJyYXJpZXMuCi0jIElmIExJQl9QQVRIIGlzIGVtcHR5LCB0aGUgb25lcyBpbiB0aGUgc2NyaXB0IChpZiBhbnkpIGFyZSBsZWZ0IGFsb25lLgotIyAoVGhlIGRlZmF1bHQgaXMgdXN1YWxseSAvbGliOi91c3IvbGliOi91c3IvbG9jYWwvbGliLCB1bmxlc3MgYnVpbGRpbmcKLSMgYSBjcm9zcy1saW5rZXIsIGluIHdoaWNoIGNhc2UgdGhlIGRlZmF1bHQgaXMgZW1wdHkuICBTZWUgZ2Vuc2NyaXB0cy5zaC4pCi0jIE90aGVyd2lzZSwgdGhleSBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgb25lcyBnaXZlbiBpbiBMSUJfUEFUSCwKLSMgd2hpY2ggbWF5IGhhdmUgdGhlIGZvcm06IExJQl9QQVRIPS9saWI6L3Vzci9sb2NhbC9saWIKLUxJQl9QQVRIID0KLQotQkFTRURJUiA9ICQoc3JjZGlyKS8uLgotQkZERElSID0gJChCQVNFRElSKS9iZmQKLUlOQ0RJUgk9ICQoQkFTRURJUikvaW5jbHVkZQotREVQID0gbWtkZXAKLQotIyBXaGF0IHZlcnNpb24gb2YgdGhlIG1hbnVhbCB0byBidWlsZAotRE9DVkVSID0gZ2VuCi0KLSNzdHVmZiBmb3Igc2VsZiBob3N0aW5nIChjYW4gYmUgb3ZlcnJpZGRlbiBpbiBjb25maWcgZmlsZSkuCi1IT1NUSU5HX0NSVDAgPSBASE9TVElOR19DUlQwQAotSE9TVElOR19MSUJTID0gQEhPU1RJTkdfTElCU0AKLUhPU1RJTkdfRU1VID0gLW0gJChFTVVMKQotCi0jIFNldHVwIHRoZSB0ZXN0aW5nIGZyYW1ld29yaywgaWYgeW91IGhhdmUgb25lCi1FWFBFQ1QgPSBgaWYgWyAtZiAkJHIvLi4vZXhwZWN0L2V4cGVjdCBdIDsgXAotCXRoZW4gZWNobyAkJHIvLi4vZXhwZWN0L2V4cGVjdCA7IFwKLQllbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi0KLVJVTlRFU1QgPSBgaWYgWyAtZiAkJHtzcmNyb290fS8uLi9kZWphZ251L3J1bnRlc3QgXSA7IFwKLQl0aGVuIGVjaG8gJCR7c3Jjcm9vdH0vLi4vZGVqYWdudS9ydW50ZXN0IDsgXAotCWVsc2UgZWNobyBydW50ZXN0IDsgZmlgCi0KLVJVTlRFU1RGTEFHUyA9Ci0KLUNDX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvLi4vZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGlmIFsgLWYgJCRyLy4uL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvIC1pZGlyYWZ0ZXIgJCRyLy4uL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHtzcmNyb290fS8uLi9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIkBob3N0QCIgPSAiQHRhcmdldEAiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChDQyk7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gZ2NjIHwgc2VkICckKHRyYW5zZm9ybSknOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUNYWCA9IGdjYwotQ1hYX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvLi4vZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGlmIFsgLWYgJCRyLy4uL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvIC1pZGlyYWZ0ZXIgJCRyLy4uL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHtzcmNyb290fS8uLi9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIkBob3N0QCIgPSAiQHRhcmdldEAiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChDWFgpOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1ub2luc3RfUFJPR1JBTVMgPSBsZC1uZXcKLWluZm9fVEVYSU5GT1MgPSBsZC50ZXhpbmZvCi1ub2luc3RfVEVYSU5GT1MgPSBsZGludC50ZXhpbmZvCi1tYW5fTUFOUyA9IGxkLjEKLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoQkZERElSKSAtSSQoSU5DRElSKSAtSSQodG9wX3NyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgJChIREVGSU5FUykgJChDRkxBR1MpIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotQkZETElCID0gLi4vYmZkL2xpYmJmZC5sYQotTElCSUJFUlRZID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi0KLUFMTF9FTVVMQVRJT05TID0gXAotCWVhMjlrLm8gXAotCWVhaXhwcGMubyBcCi0JZWFpeHJzNi5vIFwKLQllYWxwaGEubyBcCi0JZWFyY2VsZi5vIFwKLQllYXJtZWxmLm8gXAotCWVhcm1lbGZfb2FiaS5vIFwKLQllYXJtZWxmX2xpbnV4Lm8gXAotCWVhcm1lbGZfbGludXgyNi5vIFwKLQllYXJtYW91dGIubyBcCi0JZWFybWFvdXRsLm8gXAotCWVhcm1jb2ZmLm8gXAotCWVhcm1wZS5vIFwKLQllY29mZl9zcGFyYy5vIFwKLQllZDEwdmVsZi5vIFwKLQllZDMwdmVsZi5vIFwKLQllZDMwdl9lLm8gXAotCWVkMzB2X28ubyBcCi0JZWRlbHRhNjgubyBcCi0JZWVibW9uMjlrLm8gXAotCWVlbGYzMl9zcGFyYy5vIFwKLQllZWxmMzJiNDMwMC5vIFwKLQllZWxmMzJibWlwLm8gXAotCWVlbGYzMmVibWlwLm8gXAotCWVlbGYzMmVsbWlwLm8gXAotCWVlbGYzMmw0MzAwLm8gXAotCWVlbGYzMmxtaXAubyBcCi0JZWVsZjMybHBwYy5vIFwKLQllZWxmMzJwcGMubyBcCi0JZWVsZl9pMzg2Lm8gXAotCWVlbGZfaTM4Nl9iZS5vIFwKLQllZ2xkOTYwLm8gXAotCWVnbGQ5NjBjb2ZmLm8gXAotCWVlbGYzMmZyMzAubyBcCi0JZWVsZjMybWNvcmUubyBcCi0JZWdvMzIubyBcCi0JZWg4MzAwLm8gXAotCWVoODMwMGgubyBcCi0JZWg4MzAwcy5vIFwKLQllaDg1MDAubyBcCi0JZWg4NTAwYi5vIFwKLQllaDg1MDBjLm8gXAotCWVoODUwMG0ubyBcCi0JZWg4NTAwcy5vIFwKLQllaHAzMDBic2QubyBcCi0JZWhwM2hwdXgubyBcCi0JZWhwcGFlbGYubyBcCi0JZWkzODZhb3V0Lm8gXAotCWVpMzg2YmVvcy5vIFwKLQllaTM4NmJzZC5vIFwKLQllaTM4NmNvZmYubyBcCi0JZWkzODZnbzMyLm8gXAotCWVpMzg2bGludXgubyBcCi0JZWkzODZseW54Lm8gXAotCWVpMzg2bWFjaC5vIFwKLQllaTM4Nm1vc3MubyBcCi0JZWkzODZtc2Rvcy5vIFwKLQllaTM4Nm5ic2QubyBcCi0JZWkzODZudy5vIFwKLQllaTM4NnBlLm8gXAotCWVsbms5NjAubyBcCi0JZW02OGs0a25ic2QubyBcCi0JZW02OGthb3V0Lm8gXAotCWVtNjhrYXV4Lm8gXAotCWVtNjhrY29mZi5vIFwKLQllbTY4a2VsZi5vIFwKLQllbTY4a2xpbnV4Lm8gXAotCWVtNjhrbHlueC5vIFwKLQllbTY4a25ic2QubyBcCi0JZW02OGtwc29zLm8gXAotCWVtODhrYmNzLm8gXAotCWVtY29yZXBlLm8gXAotCWVtaXBzYmlnLm8gXAotCWVtaXBzYnNkLm8gXAotCWVtaXBzaWR0Lm8gXAotCWVtaXBzaWR0bC5vIFwKLQllbWlwc2xpdC5vIFwKLQllbWlwc2xuZXdzLm8gXAotCWVuZXdzLm8gXAotCWVuczMya25ic2QubyBcCi0JZXBjNTMybWFjaGEubyBcCi0JZXBwY21hY29zLm8gXAotCWVwcGNudy5vIFwKLQllcHBjcGUubyBcCi0JZXJpc2NpeC5vIFwKLQllc2EyOTIwMC5vIFwKLQllc2gubyBcCi0JZXNoZWxmLm8gXAotCWVzaGxlbGYubyBcCi0JZXNobC5vIFwKLQllc3BhcmNhb3V0Lm8gXAotCWVzcGFyY2xpbnV4Lm8gXAotCWVzcGFyY2x5bngubyBcCi0JZXNwYXJjbmJzZC5vIFwKLQllc3QyMDAwLm8gXAotCWVzdW4zLm8gXAotCWVzdW40Lm8gXAotCWV0aWMzMGFvdXQubyBcCi0JZXRpYzMwY29mZi5vIFwKLQlldGljODBjb2ZmLm8gXAotCWV2YW5pbGxhLm8gXAotCWV2YXgubyBcCi0JZXZzdGEubyBcCi0JZXc2NS5vIFwKLQllejgwMDEubyBcCi0JZXo4MDAyLm8KLQotQUxMXzY0X0VNVUxBVElPTlMgPSBcCi0JZWVsZjY0X3NwYXJjLm8gXAotCWVlbGY2NGFscGhhLm8KLQotQUxMX0VNVUxfRVhUUkFfT0ZJTEVTID0gXAotCXBlLWRsbC5vIFwKLQlkZWZmaWxlcC5vCi0KLUNGSUxFUyA9IGxkY3Rvci5jIGxkZW11bC5jIGxkZXhwLmMgbGRmaWxlLmMgbGRsYW5nLmMgXAotCWxkbWFpbi5jIGxkbWlzYy5jIGxkdmVyLmMgbGR3cml0ZS5jIGxleHN1cC5jIFwKLQltcmkuYyBsZGNyZWYuYyBwZS1kbGwuYwotCi1IRklMRVMgPSBsZC5oIGxkY3Rvci5oIGxkZW11bC5oIGxkZXhwLmggbGRmaWxlLmggXAotCWxkbGFuZy5oIGxkbGV4LmggbGRtYWluLmggbGRtaXNjLmggbGR2ZXIuaCBcCi0JbGR3cml0ZS5oIG1yaS5oIGRlZmZpbGUuaAotCi1HRU5FUkFURURfQ0ZJTEVTID0gbGRncmFtLmMgbGRsZXguYyBkZWZmaWxlcC5jCi1HRU5FUkFURURfSEZJTEVTID0gbGRncmFtLmggbGRlbXVsLWxpc3QuaCBkZWZmaWxlcC5oCi0KLU9GSUxFUyA9IGxkZ3JhbS5vIGxkbGV4Lm8gbGV4c3VwLm8gbGRsYW5nLm8gbXJpLm8gbGRjdG9yLm8gbGRtYWluLm8gXAotCWxkd3JpdGUubyBsZGV4cC5vICBsZGVtdWwubyBsZHZlci5vIGxkbWlzYy5vIFwKLQlsZGZpbGUubyBsZGNyZWYubyAke0VNVUxBVElPTl9PRklMRVN9ICR7RU1VTF9FWFRSQV9PRklMRVN9Ci0KLVNUQUdFU1RVRkYgPSAqLm8gbGRzY3JpcHRzLyogZSouYwotCi0jIEF0IHRoZSBtb21lbnQgdGhpcyBpcyBqdXN0IGEgbGlzdCBvZiB0aG9zZSBlbXVsYXRpb24gdGVtcGxhdGUgZmlsZXMKLSMgdGhhdCBjb250YWluIGludGVybmF0aW9uYWxpc2VkIHN0cmluZ3MuCi1FTVVMQVRJT05fRklMRVMgPSBlbXVsdGVtcGwvcGUuZW0gZW11bHRlbXBsL2FybWNvZmYuZW0KLQotUE9URklMRVMgPSAkKENGSUxFUykgJChIRklMRVMpICQoRU1VTEFUSU9OX0ZJTEVTKQotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1sZG1haW4ubzogbGRtYWluLmMgY29uZmlnLnN0YXR1cwotCSQoQ09NUElMRSkgLWMgLURERUZBVUxUX0VNVUxBVElPTj0nIiQoRU1VTCkiJyAtRFNDUklQVERJUj0nIiQoc2NyaXB0ZGlyKSInIC1EVEFSR0VUPSciQHRhcmdldEAiJyAkKHNyY2RpcikvbGRtYWluLmMKLQotbGRlbXVsLWxpc3QuaDogTWFrZWZpbGUKLQkoZWNobyAiLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiAgRE8gTk9UIEVESVQhICovIjtcCi0JZm9yIGYgaW4gYGVjaG8gIiAiICR7RU1VTEFUSU9OX09GSUxFU30gIiIgXAotCSB8IHNlZCAtZSAncy8gZS8gbGQvZycgLWUgJ3MvIGxkLyAvZycgLWUgJ3MvWy5dby8vZydgOyBkbyBcCi0JICAgIGVjaG8gImV4dGVybiBsZF9lbXVsYXRpb25feGZlcl90eXBlIGxkXyQke2Z9X2VtdWxhdGlvbjsiOyBcCi0JZG9uZTtcCi0JZWNobyAiIjtcCi0JZWNobyAiI2RlZmluZSBFTVVMQVRJT05fTElTVCBcXCI7XAotCWZvciBmIGluIGBlY2hvICIgIiAke0VNVUxBVElPTl9PRklMRVN9ICIiIFwKLQkgfCBzZWQgLWUgJ3MvIGUvIGxkL2cnIC1lICdzLyBsZC8gL2cnIC1lICdzL1suXW8vL2cnYDsgZG8gXAotCSAgICBlY2hvICIgICZsZF8kJHtmfV9lbXVsYXRpb24sIFxcIjsgXAotCWRvbmU7XAotCWVjaG8gIiAgMCIpID5sZGVtdWwtdG1wLmgKLQltdiBsZGVtdWwtdG1wLmggbGRlbXVsLWxpc3QuaAotCi0jIFRoZXNlIGFsbCBzdGFydCB3aXRoIGUgc28gJ21ha2UgY2xlYW4nIGNhbiBmaW5kIHRoZW0uCi0KLUdFTlNDUklQVFMgPSAkKFNIRUxMKSAkKHNyY2RpcikvZ2Vuc2NyaXB0cy5zaCAke3NyY2Rpcn0gJHtsaWJkaXJ9IEBob3N0QCBAdGFyZ2V0QCBAdGFyZ2V0X2FsaWFzQCAke0VNVUx9ICJATkFUSVZFX0xJQl9ESVJTQCIKLUdFTl9ERVBFTkRTID0gJChzcmNkaXIpL2dlbnNjcmlwdHMuc2ggJChzcmNkaXIpL2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkCi1AVERJUlNACi0KLWVhMjlrLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2EyOWsuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2EyOWsuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGEyOWsgIiQodGRpcl9hMjlrKSIKLWVhaXhwcGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYWl4cHBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9haXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FpeC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYWl4cHBjICIkKHRkaXJfYWl4cHBjKSIKLWVhaXhyczYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYWl4cnM2LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9haXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FpeC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYWl4cnM2ICIkKHRkaXJfYWl4cnM2KSIKLWVhbHBoYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hbHBoYS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWxwaGEuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFscGhhICIkKHRkaXJfYWxwaGEpIgotZWFyY2VsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcmNlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJjZWxmICIkKHRkaXJfYXJjZWxmKSIKLWVhcm1lbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtZWxmICIkKHRkaXJfYXJtZWxmKSIKLWVhcm1lbGZfb2FiaS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGZfb2FiaS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmX29hYmkuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtZWxmX29hYmkgIiQodGRpcl9hcm1lbGYpIgotZWFybWVsZl9saW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGZfbGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGZfbGludXggIiQodGRpcl9hcm1lbGZfbGludXgpIgotZWFybWVsZl9saW51eDI2LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtZWxmX2xpbnV4MjYgIiQodGRpcl9hcm1lbGZfbGludXgyNikiCi1lYXJtYW91dGIuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtYW91dGIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FybWFvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWFvdXRiICIkKHRkaXJfYXJtYW91dGIpIgotZWFybWFvdXRsLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWFvdXRsLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1hb3V0bCAiJCh0ZGlyX2FybWFvdXRsKSIKLWVhcm1jb2ZmLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWNvZmYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FybWNvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWNvZmYgIiQodGRpcl9hcm1jb2ZmKSIKLWVhcm1wZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1wZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1wZSAiJCh0ZGlyX2FybXBlKSIKLWVjb2ZmX3NwYXJjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2NvZmZfc3BhcmMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NwYXJjY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gY29mZl9zcGFyYyAiJCh0ZGlyX2NvZmZfc3BhcmMpIgotZWQxMHZlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDEwdmVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmZDEwdi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZDEwdmVsZiAiJCh0ZGlyX2QxMHYpIgotZWQzMHZlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDMwdmVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZDMwdmVsZiAiJCh0ZGlyX2QzMHYpIgotZWQzMHZfby5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kMzB2X28uc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGQzMHZfbyAiJCh0ZGlyX2QzMHYpIgotZWQzMHZfZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kMzB2X2Uuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGQzMHZfZSAiJCh0ZGlyX2QzMHYpIgotZWRlbHRhNjguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZGVsdGE2OC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZGVsdGE2OC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZGVsdGE2OCAiJCh0ZGlyX2RlbHRhNjgpIgotZWVibW9uMjlrLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VibW9uMjlrLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lYm1vbjI5ay5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWJtb24yOWsgIiQodGRpcl9lYm1vbjI5aykiCi1lZWxmMzJmcjMwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyZnIzMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJmcjMwICIkKHRkaXJfZnIzMCkiCi1lZWxmMzJtY29yZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMm1jb3JlICIkKHRkaXJfbWNvcmUpIgotZW0zMnJlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTMycmVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtMzJyZWxmICIkKHRkaXJfbTMycikiCi1lZWxmMzJfc3BhcmMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyX3NwYXJjICIkKHRkaXJfZWxmMzJfc3BhcmMpIgotZWVsZjMyYjQzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJiNDMwMCAiJCh0ZGlyX2VsZjMyYjQzMDApIgotZWVsZjMyYm1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmJtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyYm1pcCAiJCh0ZGlyX2VsZjMyYm1pcCkiCi1lZWxmMzJic21pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmJzbWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmJzbWlwICIkKHRkaXJfZWxmMzJic21pcCkiCi1lZWxmMzJlYm1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmVibWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmVibWlwICIkKHRkaXJfZWxmMzJlYm1pcCkiCi1lZWxmMzJlbG1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmVsbWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmVsbWlwICIkKHRkaXJfZWxmMzJlbG1pcCkiCi1lZWxmMzJsNDMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmw0MzAwICIkKHRkaXJfZWxmMzJsNDMwMCkiCi1lZWxmMzJsbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybG1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJsbWlwICIkKHRkaXJfZWxmMzJsbWlwKSIKLWVlbGYzMmxwcGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJscHBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmcHBjLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmxwcGMgIiQodGRpcl9lbGYzMmxwcGMpIgotZWVsZjMybHNtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJsc21pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJsc21pcCAiJCh0ZGlyX2VsZjMybHNtaXApIgotZWVsZjMycHBjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMycHBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmcHBjLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMnBwYyAiJCh0ZGlyX2VsZjMycHBjKSIKLWVlbGY2NGFscGhhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjY0YWxwaGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjY0YWxwaGEgIiQodGRpcl9lbGY2NGFscGhhKSIKLWVlbGY2NF9zcGFyYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmNjRfc3BhcmMgIiQodGRpcl9lbGY2NF9zcGFyYykiCi1lZWxmX2kzODYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmX2kzODYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZl9pMzg2ICIkKHRkaXJfZWxmX2kzODYpIgotZWVsZl9pMzg2X2JlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZl9pMzg2X2JlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGZfaTM4Nl9iZSAiJCh0ZGlyX2VsZl9pMzg2X2JlKSIKLWVnbGQ5NjAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZ2xkOTYwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nbGQ5NjAuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2k5NjAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGdsZDk2MCAiJCh0ZGlyX2dsZDk2MCkiCi1lZ2xkOTYwY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9nbGQ5NjBjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nbGQ5NjBjLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pOTYwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBnbGQ5NjBjb2ZmICIkKHRkaXJfZ2xkOTYwY29mZikiCi1lZ28zMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9nbzMyLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBnbzMyICIkKHRkaXJfZ28zMikiCi1laDgzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDgzMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4MzAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODMwMCAiJCh0ZGlyX2g4MzAwKSIKLWVoODMwMGguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDgzMDBoLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODMwMGguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4MzAwaCAiJCh0ZGlyX2g4MzAwaCkiCi1laDgzMDBzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4MzAwcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDgzMDBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODMwMHMgIiQodGRpcl9oODMwMHMpIgotZWg4NTAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDAgIiQodGRpcl9oODUwMCkiCi1laDg1MDBiLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwYi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBiLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMGIgIiQodGRpcl9oODUwMGIpIgotZWg4NTAwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwYy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDBjICIkKHRkaXJfaDg1MDBjKSIKLWVoODUwMG0uYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDBtLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMG0uc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwbSAiJCh0ZGlyX2g4NTAwbSkiCi1laDg1MDBzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMHMgIiQodGRpcl9oODUwMHMpIgotZWhwMzAwYnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2hwMzAwYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBocDMwMGJzZCAiJCh0ZGlyX2hwMzAwYnNkKSIKLWVocDNocHV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2hwM2hwdXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGhwM2hwdXggIiQodGRpcl9ocDNocHV4KSIKLWVocHBhZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2hwcGFlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2hwcGFlbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2hwcGFlbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGhwcGFlbGYgIiQodGRpcl9ocHBhZWxmKSIKLWVpMzg2YW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2YW91dC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmFvdXQgIiQodGRpcl9pMzg2YW91dCkiCi1laTM4NmJlb3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmJlb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2Jlb3MuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZiZW9zLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2YmVvcyAiJCh0ZGlyX2kzODZiZW9zKSIKLWVpMzg2YnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZic2QgIiQodGRpcl9pMzg2YnNkKSIKLWVpMzg2Y29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2Y29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZjb2ZmICIkKHRkaXJfaTM4NmNvZmYpIgotZWkzODZnbzMyLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZnbzMyLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmdvMzIgIiQodGRpcl9pMzg2Z28zMikiCi1laTM4NmxpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZsaW51eCAiJCh0ZGlyX2kzODZsaW51eCkiCi1laTM4Nmx5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nmx5bnguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZseW54LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bHlueCAiJCh0ZGlyX2kzODZseW54KSIKLWVpMzg2bWFjaC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bWFjaC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm1hY2ggIiQodGRpcl9pMzg2bWFjaCkiCi1laTM4Nm1vc3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm1vc3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm1vc3MgIiQodGRpcl9pMzg2bW9zcykiCi1laTM4Nm1zZG9zLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZtc2Rvcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4Nm1zZG9zLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bXNkb3MgIiQodGRpcl9pMzg2bXNkb3MpIgotZWkzODZuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bmJzZCAiJCh0ZGlyX2kzODZuYnNkKSIKLWVpMzg2bncuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm53LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbncuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZudyAiJCh0ZGlyX2kzODZudykiCi1laTM4NnBlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZwZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2cGUgIiQodGRpcl9pMzg2cGUpIgotZWxuazk2MC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9sbms5NjAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2xuazk2MC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTk2MC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbG5rOTYwICIkKHRkaXJfbG5rOTYwKSIKLWVtNjhrNGtuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL202OGs0a25ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGs0a25ic2QgIiQodGRpcl9tNjhrNGtuYnNkKSIKLWVtNjhrYW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrYW91dC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2FvdXQgIiQodGRpcl9tNjhrYW91dCkiCi1lbTY4a2F1eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrYXV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tNjhrYXV4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrYXV4ICIkKHRkaXJfbTY4a2F1eCkiCi1lbTY4a2NvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2NvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL202OGtjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrY29mZiAiJCh0ZGlyX202OGtjb2ZmKSIKLWVtNjhrZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtlbGYgIiQodGRpcl9tNjhrZWxmKSIKLWVtNjhrbGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2xpbnV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9saW51eC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2xpbnV4ICIkKHRkaXJfbTY4a2xpbnV4KSIKLWVtNjhrbHlueC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrbHlueC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTY4a2x5bnguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtseW54ICIkKHRkaXJfbTY4a2x5bngpIgotZW02OGtuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrbmJzZCAiJCh0ZGlyX202OGtuYnNkKSIKLWVtNjhrcHNvcy5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrcHNvcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3Bzb3Muc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtwc29zICIkKHRkaXJfbTY4a3Bzb3MpIgotZW04OGtiY3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTg4a2Jjcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTg4a2JjcyAiJCh0ZGlyX204OGtiY3MpIgotZW1jb3JlcGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbWNvcmVwZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtY29yZXBlICIkKHRkaXJfbWNvcmVwZSkiCi1lbWlwc2JpZy5jOiAgJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2JpZy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2JpZwotZW1pcHNic2QuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2JzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwc2JzZC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2JzZAotZW1pcHNpZHQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2lkdC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzaWR0ICIkKHRkaXJfbWlwc2lkdCkiCi1lbWlwc2lkdGwuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2lkdGwuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL21pcHNlY29mZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2lkdGwgIiQodGRpcl9taXBzaWR0bCkiCi1lbWlwc2xpdC5jOiAgJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2xpdC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2xpdCAiJCh0ZGlyX21pcHNsaXQpIgotZW1pcHNsbmV3cy5jOiAgJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2xuZXdzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzbG5ld3MKLWVtbjEwMzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21uMTAzMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1uMTAzMDAgIiQodGRpcl9tbjEwMzAwKSIKLWVtbjEwMjAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21uMTAyMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1uMTAyMDAgIiQodGRpcl9tbjEwMjAwKSIKLWVuZXdzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL25ld3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG5ld3MgIiQodGRpcl9uZXdzKSIKLWVuczMya25ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbnMzMmtuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBuczMya25ic2QgIiQodGRpcl9uczMya25ic2QpIgotZXBjNTMybWFjaGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvcGM1MzJtYWNoYS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcGM1MzJtYWNoYSAiJCh0ZGlyX3BjNTMybWFjaGEpIgotZXBwY21hY29zLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL3BwY21hY29zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9haXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FpeC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcHBjbWFjb3MgIiQodGRpcl9wcGNtYWNvcykiCi1lcHBjbncuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvcHBjbncuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9udy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcHBjbncgIiQodGRpcl9wcGNudykiCi1lcHBjcGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvcHBjcGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wcGNwZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcHBjcGUgIiQodGRpcl9wcGNwZSkiCi1lcmlzY2l4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3Jpc2NpeC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcmlzY2l4ICIkKHRkaXJfcmlzY2l4KSIKLWVzYTI5MjAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NhMjkyMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NhMjkyMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNhMjkyMDAgIiQodGRpcl9zYTI5MjAwKSIKLWVzaC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc2guc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNoICIkKHRkaXJfc2gpIgotZXNoZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NoZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzaGVsZiAiJCh0ZGlyX3NoZWxmKSIKLWVzaGxlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2hsZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzaGxlbGYgIiQodGRpcl9zaGxlbGYpIgotZXNobC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaGwuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NoLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzaGwgIiQodGRpcl9zaGwpIgotZXNwYXJjYW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zcGFyY2FvdXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNwYXJjYW91dCAiJCh0ZGlyX3NwYXJjYW91dCkiCi1lc3BhcmNsaW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zcGFyY2xpbnV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9saW51eC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3BhcmNsaW51eCAiJCh0ZGlyX3NwYXJjbGludXgpIgotZXNwYXJjbHlueC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zcGFyY2x5bnguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NwYXJjbHlueC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3BhcmNseW54ICIkKHRkaXJfc3BhcmNseW54KSIKLWVzcGFyY25ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzcGFyY25ic2QgIiQodGRpcl9zcGFyY25ic2QpIgotZXN0MjAwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zdDIwMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3N0MjAwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3QyMDAwICIkKHRkaXJfc3QyMDAwKSIKLWVzdW4zLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3N1bjMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3N1bm9zLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzdW4zICIkKHRkaXJfc3VuMykiCi1lc3VuNC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zdW40LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9zdW5vcy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3VuNCAiJCh0ZGlyX3N1bjQpIgotZXRpYzMwYW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy90aWMzMGFvdXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3RpYzMwYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdGljMzBhb3V0ICIkKHRkaXJfdGljMzBhb3V0KSIKLWV0aWMzMGNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdGljMzBjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC90aWMzMGNvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHRpYzMwY29mZiAiJCh0ZGlyX3RpYzMwY29mZikiCi1ldGljODBjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3RpYzgwY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB0aWM4MGNvZmYgIiQodGRpcl90aWM4MGNvZmYpIgotZXZhbmlsbGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdmFuaWxsYS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvdmFuaWxsYS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdmFuaWxsYS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdmFuaWxsYSAiJCh0ZGlyX3ZhbmlsbGEpIgotZXZheC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy92YXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHZheCAiJCh0ZGlyX3ZheCkiCi1ldnN0YS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy92c3RhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB2c3RhICIkKHRkaXJfdnN0YSkiCi1ldjg1MC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy92ODUwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdjg1MC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdjg1MCAiJCh0ZGlyX3Y4NTApIgotZXc2NS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy93NjUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3c2NS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdzY1ICIkKHRkaXJfdzY1KSIKLWV6ODAwMS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy96ODAwMS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvejgwMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHo4MDAxICIkKHRkaXJfejgwMDEpIgotZXo4MDAyLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3o4MDAyLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC96ODAwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gejgwMDIgIiQodGRpcl96ODAwMikiCi0KLWxkX25ld19TT1VSQ0VTID0gbGRncmFtLnkgbGRsZXgubCBsZXhzdXAuYyBsZGxhbmcuYyBtcmkuYyBsZGN0b3IuYyBsZG1haW4uYyBcCi0JbGR3cml0ZS5jIGxkZXhwLmMgbGRlbXVsLmMgbGR2ZXIuYyBsZG1pc2MuYyBsZGZpbGUuYyBsZGNyZWYuYwotbGRfbmV3X0RFUEVOREVOQ0lFUyA9ICQoRU1VTEFUSU9OX09GSUxFUykgJChFTVVMX0VYVFJBX09GSUxFUykgJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExERVBTKQotbGRfbmV3X0xEQUREID0gJChFTVVMQVRJT05fT0ZJTEVTKSAkKEVNVUxfRVhUUkFfT0ZJTEVTKSAkKEJGRExJQikgJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLSMgVGhlIGdlbmVyYXRlZCBlbXVsYXRpb24gZmlsZXMgbW9zdGx5IGhhdmUgdGhlIHNhbWUgZGVwZW5kZW5jaWVzLgotJChFTVVMQVRJT05fT0ZJTEVTKTogLi4vYmZkL2JmZC5oIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkbWFpbi5oIGxkZW11bC5oIGxkZmlsZS5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggXAotICBsZGN0b3IuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZ3JhbS5oCi0KLSMgVGhpcyBpcyB0aGUgcmVhbCBsaWJiZmQuYSBjcmVhdGVkIGJ5IGxpYnRvb2wuCi1URVNUQkZETElCID0gQFRFU1RCRkRMSUJACi0KLWNoZWNrLURFSkFHTlU6IHNpdGUuZXhwCi0Jc3Jjcm9vdD1gY2QgJChzcmNkaXIpICYmIHB3ZGA7IGV4cG9ydCBzcmNyb290OyBcCi0Jcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlFWFBFQ1Q9JChFWFBFQ1QpOyBleHBvcnQgRVhQRUNUOyBcCi0JaWYgWyAtZiAkKHRvcF9idWlsZGRpcikvLi4vZXhwZWN0L2V4cGVjdCBdOyB0aGVuIFwKLQkgIFRDTF9MSUJSQVJZPWBjZCAkKHRvcF9zcmNkaXIpLy4uL3RjbC9saWJyYXJ5ICYmIHB3ZGA7IFwKLQkgIGV4cG9ydCBUQ0xfTElCUkFSWTsgXAotCWZpOyBcCi0JcnVudGVzdD0kKFJVTlRFU1QpOyBcCi0JaWYgJChTSEVMTCkgLWMgIiQkcnVudGVzdCAtLXZlcnNpb24iID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgJCRydW50ZXN0IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHtzcmNyb290fS90ZXN0c3VpdGUgXAotCQlDQz0iJChDQ19GT1JfVEFSR0VUKSIgQ0ZMQUdTPSIkKENGTEFHUykiIFwKLQkJQ1hYPSIkKENYWF9GT1JfVEFSR0VUKSIgQ1hYRkxBR1M9IiQoQ1hYRkxBR1MpIiBcCi0JCUNDX0ZPUl9IT1NUPSIkKENDKSIgQ0ZMQUdTX0ZPUl9IT1NUPSIkKENGTEFHUykiIFwKLQkJT0ZJTEVTPSIkKE9GSUxFUykiIEJGRExJQj0iJChURVNUQkZETElCKSIgXAotCQlMSUJJQkVSVFk9IiQoTElCSUJFUlRZKSAkKElOVExMSUJTKSIgXAotCQkkKFJVTlRFU1RGTEFHUyk7IFwKLQllbHNlIGVjaG8gIldBUk5JTkc6IGNvdWxkIG5vdCBmaW5kIFxgcnVudGVzdCciIDE+JjI7IDo7XAotCWZpCi0KLSMgUnVsZXMgZm9yIHRlc3RpbmcgYnkgcmVsaW5raW5nIGxkIGl0c2VsZi4KLSMgQSBzaW1pbGFyIHRlc3QgaXMgaW4gdGhlIHRlc3RzdWl0ZS4gIFRoaXMgdGFyZ2V0IGlzIGZvciBlYXNlIG9mIHVzZQotIyB3aGVuIHBvcnRpbmcgbGQuCi0KLWxkLXBhcnRpYWwubzogbGQtbmV3JChFWEVFWFQpCi0JLi9sZC1uZXckKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQtcGFydGlhbC5vIC1yICQoT0ZJTEVTKQotbGQxJChFWEVFWFQpOiBsZC1wYXJ0aWFsLm8KLQkuL2xkLW5ldyQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDEkKEVYRUVYVCkgJChIT1NUSU5HX0NSVDApIGxkLXBhcnRpYWwubyAkKFRFU1RCRkRMSUIpICQoTElCSUJFUlRZKSAkKEhPU1RJTkdfTElCUykKLQotbGQxLWZ1bGwkKEVYRUVYVCk6IGxkLW5ldwotCS4vbGQtbmV3JChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMS1mdWxsJChFWEVFWFQpICQoSE9TVElOR19DUlQwKSAkKE9GSUxFUykgJChURVNUQkZETElCKSAkKExJQklCRVJUWSkgJChIT1NUSU5HX0xJQlMpCi0KLWxkMiQoRVhFRVhUKTogbGQxJChFWEVFWFQpCi0JLi9sZDEkKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQyJChFWEVFWFQpICQoSE9TVElOR19DUlQwKSAkKE9GSUxFUykgJChURVNUQkZETElCKSAkKExJQklCRVJUWSkgJChIT1NUSU5HX0xJQlMpCi0KLWxkMyQoRVhFRVhUKTogbGQyJChFWEVFWFQpCi0JLi9sZDIkKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQzJChFWEVFWFQpICQoSE9TVElOR19DUlQwKSAkKE9GSUxFUykgJChURVNUQkZETElCKSAkKExJQklCRVJUWSkgJChIT1NUSU5HX0xJQlMpCi0KLWJvb3RzdHJhcDogbGQzJChFWEVFWFQpCi0JY21wIGxkMiQoRVhFRVhUKSBsZDMkKEVYRUVYVCkKLQotLlBIT05ZOiBib290c3RyYXAKLQotIyBBIHRlc3QgcHJvZ3JhbSBmb3IgQysrIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMuCi0jIFRoaXMgdGVzdCBpcyBub3cgaW4gdGhlIHRlc3RzdWl0ZS4KLSMKLSNjZHRlc3Q6IGNkdGVzdC1tYWluLm8gY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubyBsZC5uZXcKLSMJLi9sZC5uZXcgJChIT1NUSU5HX0VNVSkgLW8gY2R0ZXN0ICQoSE9TVElOR19DUlQwKSBcCi0jCSAgY2R0ZXN0LW1haW4ubyBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vICQoSE9TVElOR19MSUJTKQotIwotI2NkdGVzdC5vdXQ6IGNkdGVzdAotIwkuL2NkdGVzdCA+IGNkdGVzdC50bXAKLSMJbXYgY2R0ZXN0LnRtcCBjZHRlc3Qub3V0Ci0jCi0jY2R0ZXN0LXVyLm86IGNkdGVzdC1tYWluLm8gY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubyBsZC5uZXcKLSMJLi9sZC5uZXcgJChIT1NUSU5HX0VNVSkgLW8gY2R0ZXN0LXVyLm8gLVVyIGNkdGVzdC1tYWluLm8gXAotIwkgIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8KLSMKLSNjZHRlc3QtdXI6IGNkdGVzdC11ci5vCi0jCS4vbGQubmV3ICQoSE9TVElOR19FTVUpIC1vIGNkdGVzdC11ciAkKEhPU1RJTkdfQ1JUMCkgY2R0ZXN0LXVyLm8gXAotIwkgICQoSE9TVElOR19MSUJTKQotIwotI2NkdGVzdC11ci5vdXQ6IGNkdGVzdC11cgotIwkuL2NkdGVzdC11ciA+IGNkdGVzdC11ci50bXAKLSMJbXYgY2R0ZXN0LXVyLnRtcCBjZHRlc3QtdXIub3V0Ci0jCi0jY2hlY2stY2R0ZXN0OiBjZHRlc3Qub3V0IGNkdGVzdC11ci5vdXQgJChzcmNkaXIpL2NkdGVzdC5leHAKLSMJZGlmZiAkKHNyY2RpcikvY2R0ZXN0LmV4cCBjZHRlc3Qub3V0Ci0jCWRpZmYgJChzcmNkaXIpL2NkdGVzdC5leHAgY2R0ZXN0LXVyLm91dAotIwotIy5QSE9OWTogY2hlY2stY2R0ZXN0Ci0KLSMgRU5EIE9GIENIRUNLIFRBUkdFVFMKLQotIyBET0NVTUVOVEFUSU9OIFRBUkdFVFMKLSMgTWFudWFsIGNvbmZpZ3VyYXRpb24gZmlsZTsgbm90IHVzdWFsbHkgYXR0YWNoZWQgdG8gbm9ybWFsIGNvbmZpZ3VyYXRpb24sCi0jIGJlY2F1c2UgYWxtb3N0IGFsbCBjb25maWdzIHVzZSAiZ2VuIiB2ZXJzaW9uIG9mIG1hbnVhbC4KLSMgIFNldCBET0NWRVIgYWJvdmUgdG8gY2hhbmdlLgotY29uZmlnZG9jLnRleGk6CSR7RE9DVkVSfS1kb2MudGV4aQotCWxuIC1zICR7c3JjZGlyfS8ke0RPQ1ZFUn0tZG9jLnRleGkgLi9jb25maWdkb2MudGV4aSA+L2Rldi9udWxsIDI+JjEgXAotCSAgfHwgbG4gJHtzcmNkaXJ9LyR7RE9DVkVSfS1kb2MudGV4aSAuL2NvbmZpZ2RvYy50ZXhpID4vZGV2L251bGwgMj4mMSBcCi0JICB8fCBjcCAke3NyY2Rpcn0vJHtET0NWRVJ9LWRvYy50ZXhpIC4vY29uZmlnZG9jLnRleGkKLQotbGR2ZXIudGV4aTogTWFrZWZpbGUKLQlybSAtZiAkQAotCWVjaG8gJ0BzZXQgVkVSU0lPTiAkKFZFUlNJT04pJyA+ICRACi0KLWxkLmluZm86ICQoc3JjZGlyKS9sZC50ZXhpbmZvIGNvbmZpZ2RvYy50ZXhpIGxkdmVyLnRleGkKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAtSSAkKEJGRERJUikvZG9jICQoc3JjZGlyKS9sZC50ZXhpbmZvCi0KLWxkLmR2aTogJChzcmNkaXIpL2xkLnRleGluZm8gY29uZmlnZG9jLnRleGkgbGR2ZXIudGV4aQotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm86JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89IiQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAtSSAkKEJGRERJUikvZG9jIiAkKFRFWEkyRFZJKSAkKHNyY2RpcikvbGQudGV4aW5mbwotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IGxkdmVyLnRleGkKLQotIyBXZSB3YW50IHRvIHJlY29uZmlndXJlIGlmIGNvbmZpZ3VyZS5ob3N0IG9yIGNvbmZpZ3VyZS50Z3QgY2hhbmdlcy4KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpL2NvbmZpZ3VyZS5ob3N0ICQoc3JjZGlyKS9jb25maWd1cmUudGd0Ci0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi1NT1NUTFlDTEVBTkZJTEVTID0gJChTVEFHRVNUVUZGKSBsZDEkKEVYRUVYVCkgbGQyJChFWEVFWFQpIGxkMyQoRVhFRVhUKSBcCi0JbGRlbXVsLWxpc3QuaCBjcnRiZWdpbi5vIGNydGVuZC5vIGxkLmxvZyBsZC5zdW0KLW1vc3RseWNsZWFuLWxvY2FsOgotCS1ybSAtcmYgdG1wZGlyCi1DTEVBTkZJTEVTID0gZGVwLnNlZCAuZGVwIC5kZXAxCi0KLS5QSE9OWTogaW5zdGFsbC1leGVjLWxvY2FsIGluc3RhbGwtZGF0YS1sb2NhbAotCi1pbnN0YWxsLWV4ZWMtbG9jYWw6IGxkLW5ldyQoRVhFRVhUKQotCSQobWtpbnN0YWxsZGlycykgJChiaW5kaXIpICQodG9vbGRpcikvYmluCi0JQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0Jbj1gZWNobyBsZCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2A7IFwKLQlpZiBbICIkKGJpbmRpcikvJCRuJChFWEVFWFQpIiAhPSAiJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCkiIF07IHRoZW4gXAotCSAgcm0gLWYgJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCk7IFwKLQkgIGxuICQoYmluZGlyKS8kJG4kKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCkgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCBcCi0JICB8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSBsZC1uZXckKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCk7IFwKLQlmaQotCi1pbnN0YWxsLWRhdGEtbG9jYWw6Ci0JJChta2luc3RhbGxkaXJzKSAkKHNjcmlwdGRpcikvbGRzY3JpcHRzCi0JZm9yIGYgaW4gbGRzY3JpcHRzLyo7IGRvIFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkJGYgJChzY3JpcHRkaXIpLyQkZiA7IFwKLQlkb25lCi0KLSMgU3R1ZmYgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYSBkaXN0cmlidXRpb24uICBUaGUgZGlzdHN0dWZmCi0jIHRhcmdldCBpcyBydW4gYnkgdGhlIHRheiB0YXJnZXQgaW4gLi4vTWFrZWZpbGUuaW4uCi1MRERJU1RTVFVGRiA9IGxkZ3JhbS5jIGxkZ3JhbS5oIGxkbGV4LmMKLWRpc3RzdHVmZjogJChMRERJU1RTVFVGRikgaW5mbwotCi1ESVNUQ0xFQU5GSUxFUyA9IHRkaXJzIHNpdGUuZXhwIHNpdGUuYmFrCi1kaXN0Y2xlYW4tbG9jYWw6Ci0Jcm0gLXJmIGxkc2NyaXB0cwotCi0jIFRhcmdldHMgdG8gcmVidWlsZCBkZXBlbmRlbmNpZXMgaW4gdGhpcyBNYWtlZmlsZS4KLSMgSGF2ZSB0byBnZXQgcmlkIG9mIC5kZXAxIGhlcmUgc28gdGhhdCAiJD8iIGxhdGVyIGluY2x1ZGVzIGFsbCBvZiAkKENGSUxFUykuCi0uZGVwOiBkZXAuc2VkICQoQ0ZJTEVTKSAkKEhGSUxFUykgJChHRU5FUkFURURfQ0ZJTEVTKSAkKEdFTkVSQVRFRF9IRklMRVMpIGNvbmZpZy5oCi0Jcm0gLWYgLmRlcDEKLQkkKE1BS0UpIERFUD0kKERFUCkgLmRlcDEKLQlzZWQgLWYgZGVwLnNlZCA8LmRlcDEgPi5kZXAKLQotIyBUaGlzIHJ1bGUgcmVhbGx5IHdhbnRzIGEgbWtkZXAgdGhhdCBydW5zICJnY2MgLU1NIi4KLS5kZXAxOiAkKENGSUxFUykgJChHRU5FUkFURURfQ0ZJTEVTKQotCXJtIC1mIC5kZXAyCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiAuZGVwMgotCSQoREVQKSAtZiAuZGVwMiAkKElOQ0xVREVTKSAkPwotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSAuZGVwMiAuZGVwMQotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkCVwKLQkJLWUgJ3MhQElOQ0RJUkAhJChJTkNESVIpIScJXAotCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJwotCi1kZXA6IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmFtCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KLQotLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotCi1sZGN0b3IubzogbGRjdG9yLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZGV4cC5oIGxkbGFuZy5oIGxkbWlzYy5oIGxkZ3JhbS5oIGxkbWFpbi5oIGxkY3Rvci5oCi1sZGVtdWwubzogbGRlbXVsLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBsZC5oIGxkZW11bC5oIFwKLSAgbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGZpbGUuaCBsZG1haW4uaCBsZGVtdWwtbGlzdC5oCi1sZGV4cC5vOiBsZGV4cC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRtYWluLmggbGRtaXNjLmggbGRleHAuaCBsZGdyYW0uaCBsZGxhbmcuaAotbGRmaWxlLm86IGxkZmlsZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGZpbGUuaCBsZG1haW4uaCBsZGdyYW0uaCBcCi0gIGxkbGV4LmggbGRlbXVsLmgKLWxkbGFuZy5vOiBsZGxhbmcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2JmZGxpbmsuaCBsZC5oIGxkbWFpbi5oIFwKLSAgbGRncmFtLmggbGRleHAuaCBsZGxhbmcuaCBsZGVtdWwuaCBsZGxleC5oIGxkbWlzYy5oIFwKLSAgbGRjdG9yLmggbGRmaWxlLmggJChJTkNESVIpL2ZubWF0Y2guaAotbGRtYWluLm86IGxkbWFpbi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL3Byb2dyZXNzLmggJChJTkNESVIpL2JmZGxpbmsuaCBsZC5oIGxkbWFpbi5oIFwKLSAgbGRtaXNjLmggbGR3cml0ZS5oIGxkZ3JhbS5oIGxkZXhwLmggbGRsYW5nLmggbGRlbXVsLmggXAotICBsZGxleC5oIGxkZmlsZS5oIGxkY3Rvci5oCi1sZG1pc2MubzogbGRtaXNjLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvZGVtYW5nbGUuaCBsZC5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggXAotICBsZGdyYW0uaCBsZGxleC5oIGxkbWFpbi5oIGxkZmlsZS5oCi1sZHZlci5vOiBsZHZlci5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggbGQuaCBsZHZlci5oIFwKLSAgbGRlbXVsLmggbGRtYWluLmgKLWxkd3JpdGUubzogbGR3cml0ZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBsZC5oIGxkZXhwLmggbGRsYW5nLmggbGR3cml0ZS5oIFwKLSAgbGRtaXNjLmggbGRncmFtLmggbGRtYWluLmgKLWxleHN1cC5vOiBsZXhzdXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCAkKElOQ0RJUikvYmZkbGluay5oIGxkLmggbGRtYWluLmggXAotICBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZ3JhbS5oIGxkbGV4LmggbGRmaWxlLmggXAotICBsZHZlci5oIGxkZW11bC5oCi1tcmkubzogbXJpLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIFwKLSAgY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBsZC5oIGxkZXhwLmggbGRsYW5nLmggXAotICBsZG1pc2MuaCBtcmkuaCBsZGdyYW0uaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWxkY3JlZi5vOiBsZGNyZWYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggbGQuaCBsZG1haW4uaCBsZG1pc2MuaCBsZGV4cC5oIFwKLSAgbGRsYW5nLmgKLXBlLWRsbC5vOiBwZS1kbGwuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggbGQuaCBsZGV4cC5oIGxkbGFuZy5oIGxkd3JpdGUuaCBcCi0gIGxkbWlzYy5oIGxkZ3JhbS5oIGxkbWFpbi5oIGxkZW11bC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAuLi9iZmQvbGliY29mZi5oIGRlZmZpbGUuaAotbGRncmFtLm86IGxkZ3JhbS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRleHAuaCBsZHZlci5oIGxkbGFuZy5oIGxkZW11bC5oIGxkZmlsZS5oIGxkbWlzYy5oIFwKLSAgbGRtYWluLmggbXJpLmggbGRjdG9yLmggbGRsZXguaAotbGRsZXgubzogbGRsZXguYyAuLi9iZmQvYmZkLmggc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gIGxkLmggbGRncmFtLmggbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGZpbGUuaCBsZGxleC5oIFwKLSAgbGRtYWluLmgKLWRlZmZpbGVwLm86IGRlZmZpbGVwLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgLi4vYmZkL2JmZC5oIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICBsZC5oIGxkbWlzYy5oIGRlZmZpbGUuaAotCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKZGlmZiAtLWdpdCBhL2xkL01ha2VmaWxlLmluIGIvbGQvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjcwNWUuLjAwMDAwMDAKLS0tIGEvbGQvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNTQ2ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1ERVNURElSID0KLQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLQotdG9wX2J1aWxkZGlyID0gLgotCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfdHJpcGxldCA9IEBob3N0QAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKLUFTID0gQEFTQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1DQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1FWEVFWFQgPSBARVhFRVhUQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MRCA9IEBMREAKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotTkFUSVZFX0xJQl9ESVJTID0gQE5BVElWRV9MSUJfRElSU0AKLU5NID0gQE5NQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotbCA9IEBsQAotCi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyBkZWphZ251Ci0KLVNVQkRJUlMgPSBwbwotCi10b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpCi0KLVlBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdIDsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MJChzcmNkaXIpLy4uL2Jpc29uLyA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAotWUZMQUdTID0gLWQKLUxFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdIDsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleCA7IGVsc2UgZWNobyBmbGV4IDsgZmlgCi0KLSMgV2UgcHV0IHRoZSBzY3JpcHRzIGluIHRoZSBkaXJlY3RvcnkgJChzY3JpcHRkaXIpL2xkc2NyaXB0cy4KLSMgV2UgY2FuJ3QgcHV0IHRoZSBzY3JpcHRzIGluICQoZGF0YWRpcikgYmVjYXVzZSB0aGUgU0VBUkNIX0RJUgotIyBkaXJlY3RpdmVzIG5lZWQgdG8gYmUgZGlmZmVyZW50IGZvciBuYXRpdmUgYW5kIGNyb3NzIGxpbmtlcnMuCi1zY3JpcHRkaXIgPSAkKHRvb2xkaXIpL2xpYgotCi1FTVVMID0gQEVNVUxACi1FTVVMQVRJT05fT0ZJTEVTID0gQEVNVUxBVElPTl9PRklMRVNACi1FTVVMX0VYVFJBX09GSUxFUyA9IEBFTVVMX0VYVFJBX09GSUxFU0AKLQotIyBTZWFyY2ggcGF0aCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aCBmb3IgLWxmb28gbGlicmFyaWVzLgotIyBJZiBMSUJfUEFUSCBpcyBlbXB0eSwgdGhlIG9uZXMgaW4gdGhlIHNjcmlwdCAoaWYgYW55KSBhcmUgbGVmdCBhbG9uZS4KLSMgKFRoZSBkZWZhdWx0IGlzIHVzdWFsbHkgL2xpYjovdXNyL2xpYjovdXNyL2xvY2FsL2xpYiwgdW5sZXNzIGJ1aWxkaW5nCi0jIGEgY3Jvc3MtbGlua2VyLCBpbiB3aGljaCBjYXNlIHRoZSBkZWZhdWx0IGlzIGVtcHR5LiAgU2VlIGdlbnNjcmlwdHMuc2guKQotIyBPdGhlcndpc2UsIHRoZXkgYXJlIHJlcGxhY2VkIHdpdGggdGhlIG9uZXMgZ2l2ZW4gaW4gTElCX1BBVEgsCi0jIHdoaWNoIG1heSBoYXZlIHRoZSBmb3JtOiBMSUJfUEFUSD0vbGliOi91c3IvbG9jYWwvbGliCi1MSUJfUEFUSCA9IAotCi1CQVNFRElSID0gJChzcmNkaXIpLy4uCi1CRkRESVIgPSAkKEJBU0VESVIpL2JmZAotSU5DRElSID0gJChCQVNFRElSKS9pbmNsdWRlCi1ERVAgPSBta2RlcAotCi0jIFdoYXQgdmVyc2lvbiBvZiB0aGUgbWFudWFsIHRvIGJ1aWxkCi1ET0NWRVIgPSBnZW4KLQotI3N0dWZmIGZvciBzZWxmIGhvc3RpbmcgKGNhbiBiZSBvdmVycmlkZGVuIGluIGNvbmZpZyBmaWxlKS4KLUhPU1RJTkdfQ1JUMCA9IEBIT1NUSU5HX0NSVDBACi1IT1NUSU5HX0xJQlMgPSBASE9TVElOR19MSUJTQAotSE9TVElOR19FTVUgPSAtbSAkKEVNVUwpCi0KLSMgU2V0dXAgdGhlIHRlc3RpbmcgZnJhbWV3b3JrLCBpZiB5b3UgaGF2ZSBvbmUKLUVYUEVDVCA9IGBpZiBbIC1mICQkci8uLi9leHBlY3QvZXhwZWN0IF0gOyBcCi0JdGhlbiBlY2hvICQkci8uLi9leHBlY3QvZXhwZWN0IDsgXAotCWVsc2UgZWNobyBleHBlY3QgOyBmaWAKLQotCi1SVU5URVNUID0gYGlmIFsgLWYgJCR7c3Jjcm9vdH0vLi4vZGVqYWdudS9ydW50ZXN0IF0gOyBcCi0JdGhlbiBlY2hvICQke3NyY3Jvb3R9Ly4uL2RlamFnbnUvcnVudGVzdCA7IFwKLQllbHNlIGVjaG8gcnVudGVzdCA7IGZpYAotCi0KLVJVTlRFU1RGTEFHUyA9IAotCi1DQ19GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyLy4uL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8uLi9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLyAtaWRpcmFmdGVyICQkci8uLi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCR7c3Jjcm9vdH0vLi4vbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy87IFwKLSAgICBmaTsgXAotICBlbHNlIFwKLSAgICBpZiBbICJAaG9zdEAiID0gIkB0YXJnZXRAIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAotICAgIGZpOyBcCi0gIGZpYAotCi0KLUNYWCA9IGdjYwotQ1hYX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvLi4vZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGlmIFsgLWYgJCRyLy4uL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvIC1pZGlyYWZ0ZXIgJCRyLy4uL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHtzcmNyb290fS8uLi9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIkBob3N0QCIgPSAiQHRhcmdldEAiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChDWFgpOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAotICAgIGZpOyBcCi0gIGZpYAotCi0KLW5vaW5zdF9QUk9HUkFNUyA9IGxkLW5ldwotaW5mb19URVhJTkZPUyA9IGxkLnRleGluZm8KLW5vaW5zdF9URVhJTkZPUyA9IGxkaW50LnRleGluZm8KLW1hbl9NQU5TID0gbGQuMQotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChCRkRESVIpIC1JJChJTkNESVIpIC1JJCh0b3Bfc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAkKEhERUZJTkVTKSAkKENGTEFHUykgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi1CRkRMSUIgPSAuLi9iZmQvbGliYmZkLmxhCi1MSUJJQkVSVFkgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLQotQUxMX0VNVUxBVElPTlMgPSBcCi0JZWEyOWsubyBcCi0JZWFpeHBwYy5vIFwKLQllYWl4cnM2Lm8gXAotCWVhbHBoYS5vIFwKLQllYXJjZWxmLm8gXAotCWVhcm1lbGYubyBcCi0JZWFybWVsZl9vYWJpLm8gXAotCWVhcm1lbGZfbGludXgubyBcCi0JZWFybWVsZl9saW51eDI2Lm8gXAotCWVhcm1hb3V0Yi5vIFwKLQllYXJtYW91dGwubyBcCi0JZWFybWNvZmYubyBcCi0JZWFybXBlLm8gXAotCWVjb2ZmX3NwYXJjLm8gXAotCWVkMTB2ZWxmLm8gXAotCWVkMzB2ZWxmLm8gXAotCWVkMzB2X2UubyBcCi0JZWQzMHZfby5vIFwKLQllZGVsdGE2OC5vIFwKLQllZWJtb24yOWsubyBcCi0JZWVsZjMyX3NwYXJjLm8gXAotCWVlbGYzMmI0MzAwLm8gXAotCWVlbGYzMmJtaXAubyBcCi0JZWVsZjMyZWJtaXAubyBcCi0JZWVsZjMyZWxtaXAubyBcCi0JZWVsZjMybDQzMDAubyBcCi0JZWVsZjMybG1pcC5vIFwKLQllZWxmMzJscHBjLm8gXAotCWVlbGYzMnBwYy5vIFwKLQllZWxmX2kzODYubyBcCi0JZWVsZl9pMzg2X2JlLm8gXAotCWVnbGQ5NjAubyBcCi0JZWdsZDk2MGNvZmYubyBcCi0JZWVsZjMyZnIzMC5vIFwKLQllZWxmMzJtY29yZS5vIFwKLQllZ28zMi5vIFwKLQllaDgzMDAubyBcCi0JZWg4MzAwaC5vIFwKLQllaDgzMDBzLm8gXAotCWVoODUwMC5vIFwKLQllaDg1MDBiLm8gXAotCWVoODUwMGMubyBcCi0JZWg4NTAwbS5vIFwKLQllaDg1MDBzLm8gXAotCWVocDMwMGJzZC5vIFwKLQllaHAzaHB1eC5vIFwKLQllaHBwYWVsZi5vIFwKLQllaTM4NmFvdXQubyBcCi0JZWkzODZiZW9zLm8gXAotCWVpMzg2YnNkLm8gXAotCWVpMzg2Y29mZi5vIFwKLQllaTM4NmdvMzIubyBcCi0JZWkzODZsaW51eC5vIFwKLQllaTM4Nmx5bngubyBcCi0JZWkzODZtYWNoLm8gXAotCWVpMzg2bW9zcy5vIFwKLQllaTM4Nm1zZG9zLm8gXAotCWVpMzg2bmJzZC5vIFwKLQllaTM4Nm53Lm8gXAotCWVpMzg2cGUubyBcCi0JZWxuazk2MC5vIFwKLQllbTY4azRrbmJzZC5vIFwKLQllbTY4a2FvdXQubyBcCi0JZW02OGthdXgubyBcCi0JZW02OGtjb2ZmLm8gXAotCWVtNjhrZWxmLm8gXAotCWVtNjhrbGludXgubyBcCi0JZW02OGtseW54Lm8gXAotCWVtNjhrbmJzZC5vIFwKLQllbTY4a3Bzb3MubyBcCi0JZW04OGtiY3MubyBcCi0JZW1jb3JlcGUubyBcCi0JZW1pcHNiaWcubyBcCi0JZW1pcHNic2QubyBcCi0JZW1pcHNpZHQubyBcCi0JZW1pcHNpZHRsLm8gXAotCWVtaXBzbGl0Lm8gXAotCWVtaXBzbG5ld3MubyBcCi0JZW5ld3MubyBcCi0JZW5zMzJrbmJzZC5vIFwKLQllcGM1MzJtYWNoYS5vIFwKLQllcHBjbWFjb3MubyBcCi0JZXBwY253Lm8gXAotCWVwcGNwZS5vIFwKLQllcmlzY2l4Lm8gXAotCWVzYTI5MjAwLm8gXAotCWVzaC5vIFwKLQllc2hlbGYubyBcCi0JZXNobGVsZi5vIFwKLQllc2hsLm8gXAotCWVzcGFyY2FvdXQubyBcCi0JZXNwYXJjbGludXgubyBcCi0JZXNwYXJjbHlueC5vIFwKLQllc3BhcmNuYnNkLm8gXAotCWVzdDIwMDAubyBcCi0JZXN1bjMubyBcCi0JZXN1bjQubyBcCi0JZXRpYzMwYW91dC5vIFwKLQlldGljMzBjb2ZmLm8gXAotCWV0aWM4MGNvZmYubyBcCi0JZXZhbmlsbGEubyBcCi0JZXZheC5vIFwKLQlldnN0YS5vIFwKLQlldzY1Lm8gXAotCWV6ODAwMS5vIFwKLQllejgwMDIubwotCi0KLUFMTF82NF9FTVVMQVRJT05TID0gXAotCWVlbGY2NF9zcGFyYy5vIFwKLQllZWxmNjRhbHBoYS5vCi0KLQotQUxMX0VNVUxfRVhUUkFfT0ZJTEVTID0gXAotCXBlLWRsbC5vIFwKLQlkZWZmaWxlcC5vCi0KLQotQ0ZJTEVTID0gbGRjdG9yLmMgbGRlbXVsLmMgbGRleHAuYyBsZGZpbGUuYyBsZGxhbmcuYyBcCi0JbGRtYWluLmMgbGRtaXNjLmMgbGR2ZXIuYyBsZHdyaXRlLmMgbGV4c3VwLmMgXAotCW1yaS5jIGxkY3JlZi5jIHBlLWRsbC5jCi0KLQotSEZJTEVTID0gbGQuaCBsZGN0b3IuaCBsZGVtdWwuaCBsZGV4cC5oIGxkZmlsZS5oIFwKLQlsZGxhbmcuaCBsZGxleC5oIGxkbWFpbi5oIGxkbWlzYy5oIGxkdmVyLmggXAotCWxkd3JpdGUuaCBtcmkuaCBkZWZmaWxlLmgKLQotCi1HRU5FUkFURURfQ0ZJTEVTID0gbGRncmFtLmMgbGRsZXguYyBkZWZmaWxlcC5jCi1HRU5FUkFURURfSEZJTEVTID0gbGRncmFtLmggbGRlbXVsLWxpc3QuaCBkZWZmaWxlcC5oCi0KLU9GSUxFUyA9IGxkZ3JhbS5vIGxkbGV4Lm8gbGV4c3VwLm8gbGRsYW5nLm8gbXJpLm8gbGRjdG9yLm8gbGRtYWluLm8gXAotCWxkd3JpdGUubyBsZGV4cC5vICBsZGVtdWwubyBsZHZlci5vIGxkbWlzYy5vIFwKLQlsZGZpbGUubyBsZGNyZWYubyAke0VNVUxBVElPTl9PRklMRVN9ICR7RU1VTF9FWFRSQV9PRklMRVN9Ci0KLQotU1RBR0VTVFVGRiA9ICoubyBsZHNjcmlwdHMvKiBlKi5jCi0KLSMgQXQgdGhlIG1vbWVudCB0aGlzIGlzIGp1c3QgYSBsaXN0IG9mIHRob3NlIGVtdWxhdGlvbiB0ZW1wbGF0ZSBmaWxlcwotIyB0aGF0IGNvbnRhaW4gaW50ZXJuYXRpb25hbGlzZWQgc3RyaW5ncy4KLUVNVUxBVElPTl9GSUxFUyA9IGVtdWx0ZW1wbC9wZS5lbSBlbXVsdGVtcGwvYXJtY29mZi5lbQotCi1QT1RGSUxFUyA9ICQoQ0ZJTEVTKSAkKEhGSUxFUykgJChFTVVMQVRJT05fRklMRVMpCi0KLSMgVGhlc2UgYWxsIHN0YXJ0IHdpdGggZSBzbyAnbWFrZSBjbGVhbicgY2FuIGZpbmQgdGhlbS4KLQotR0VOU0NSSVBUUyA9ICQoU0hFTEwpICQoc3JjZGlyKS9nZW5zY3JpcHRzLnNoICR7c3JjZGlyfSAke2xpYmRpcn0gQGhvc3RAIEB0YXJnZXRAIEB0YXJnZXRfYWxpYXNAICR7RU1VTH0gIkBOQVRJVkVfTElCX0RJUlNAIgotR0VOX0RFUEVORFMgPSAkKHNyY2RpcikvZ2Vuc2NyaXB0cy5zaCAkKHNyY2RpcikvZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQKLQotbGRfbmV3X1NPVVJDRVMgPSBsZGdyYW0ueSBsZGxleC5sIGxleHN1cC5jIGxkbGFuZy5jIG1yaS5jIGxkY3Rvci5jIGxkbWFpbi5jIFwKLQlsZHdyaXRlLmMgbGRleHAuYyBsZGVtdWwuYyBsZHZlci5jIGxkbWlzYy5jIGxkZmlsZS5jIGxkY3JlZi5jCi0KLWxkX25ld19ERVBFTkRFTkNJRVMgPSAkKEVNVUxBVElPTl9PRklMRVMpICQoRU1VTF9FWFRSQV9PRklMRVMpICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMREVQUykKLWxkX25ld19MREFERCA9ICQoRU1VTEFUSU9OX09GSUxFUykgJChFTVVMX0VYVFJBX09GSUxFUykgJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi0jIFRoaXMgaXMgdGhlIHJlYWwgbGliYmZkLmEgY3JlYXRlZCBieSBsaWJ0b29sLgotVEVTVEJGRExJQiA9IEBURVNUQkZETElCQAotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IGxkdmVyLnRleGkKLQotTU9TVExZQ0xFQU5GSUxFUyA9ICQoU1RBR0VTVFVGRikgbGQxJChFWEVFWFQpIGxkMiQoRVhFRVhUKSBsZDMkKEVYRUVYVCkgXAotCWxkZW11bC1saXN0LmggY3J0YmVnaW4ubyBjcnRlbmQubyBsZC5sb2cgbGQuc3VtCi0KLUNMRUFORklMRVMgPSBkZXAuc2VkIC5kZXAgLmRlcDEKLQotIyBTdHVmZiB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhIGRpc3RyaWJ1dGlvbi4gIFRoZSBkaXN0c3R1ZmYKLSMgdGFyZ2V0IGlzIHJ1biBieSB0aGUgdGF6IHRhcmdldCBpbiAuLi9NYWtlZmlsZS5pbi4KLUxERElTVFNUVUZGID0gbGRncmFtLmMgbGRncmFtLmggbGRsZXguYwotCi1ESVNUQ0xFQU5GSUxFUyA9IHRkaXJzIHNpdGUuZXhwIHNpdGUuYmFrCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1ta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS8uLi9ta2luc3RhbGxkaXJzCi1DT05GSUdfSEVBREVSID0gY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9IAotbm9pbnN0X1BST0dSQU1TID0gIGxkLW5ldyQoRVhFRVhUKQotUFJPR1JBTVMgPSAgJChub2luc3RfUFJPR1JBTVMpCi0KLQotREVGUyA9IEBERUZTQCAtSS4gLUkkKHNyY2RpcikgLUkuCi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQlMgPSBATElCU0AKLWxkX25ld19PQkpFQ1RTID0gIGxkZ3JhbS5vIGxkbGV4Lm8gbGV4c3VwLm8gbGRsYW5nLm8gbXJpLm8gbGRjdG9yLm8gXAotbGRtYWluLm8gbGR3cml0ZS5vIGxkZXhwLm8gbGRlbXVsLm8gbGR2ZXIubyBsZG1pc2MubyBsZGZpbGUubyBsZGNyZWYubwotbGRfbmV3X0xERkxBR1MgPSAKLUxFWF9PVVRQVVRfUk9PVCA9IEBMRVhfT1VUUFVUX1JPT1RACi1MRVhMSUIgPSBATEVYTElCQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRACi1URVhJMkRWSSA9IGBpZiB0ZXN0IC1mICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyB0aGVuIGVjaG8gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IGVsc2UgZWNobyB0ZXhpMmR2aTsgZmlgCi1URVhJTkZPX1RFWCA9ICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleAotSU5GT19ERVBTID0gbGQuaW5mbwotRFZJUyA9IGxkLmR2aQotVEVYSU5GT1MgPSBsZC50ZXhpbmZvCi1tYW4xZGlyID0gJChtYW5kaXIpL21hbjEKLU1BTlMgPSAkKG1hbl9NQU5TKQotCi1OUk9GRiA9IG5yb2ZmCi1ESVNUX0NPTU1PTiA9ICBSRUFETUUgLi9zdGFtcC1oLmluIENoYW5nZUxvZyBNYWtlZmlsZS5hbSBNYWtlZmlsZS5pbiBcCi1ORVdTIFRPRE8gYWNpbmNsdWRlLm00IGFjbG9jYWwubTQgY29uZmlnLmluIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4gXAotbGRncmFtLmMgbGRsZXguYwotCi0KLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoU09VUkNFUykgJChIRUFERVJTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi0KLVRBUiA9IHRhcgotR1pJUF9FTlYgPSAtLWJlc3QKLVNPVVJDRVMgPSAkKGxkX25ld19TT1VSQ0VTKQotT0JKRUNUUyA9ICQobGRfbmV3X09CSkVDVFMpCi0KLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5TIC5jIC5kdmkgLmluZm8gLmwgLmxvIC5vIC5wcyAucyAudGV4aSAudGV4aW5mbyAudHhpIC55Ci0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluICBhY2luY2x1ZGUubTQKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQotJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0KLWNvbmZpZy5oOiBzdGFtcC1oCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mIHN0YW1wLWg7IFwKLQkJJChNQUtFKSBzdGFtcC1oOyBcCi0JZWxzZSA6OyBmaQotc3RhbXAtaDogJChzcmNkaXIpL2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiBcCi0JICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAotJChzcmNkaXIpL2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQllbHNlIDo7IGZpCi0kKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKLQotbW9zdGx5Y2xlYW4taGRyOgotCi1jbGVhbi1oZHI6Ci0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oCi0KLW1haW50YWluZXItY2xlYW4taGRyOgotCi1tb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUzoKLQotY2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0JLXRlc3QgLXogIiQobm9pbnN0X1BST0dSQU1TKSIgfHwgcm0gLWYgJChub2luc3RfUFJPR1JBTVMpCi0KLWRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUzoKLQotbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUzoKLQotLmMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0uUy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi5vIGNvcmUgKi5jb3JlCi0KLWNsZWFuLWNvbXBpbGU6Ci0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLW1haW50YWluZXItY2xlYW4tY29tcGlsZToKLQotLmMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0uUy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tbGlidG9vbDoKLQktcm0gLWYgKi5sbwotCi1jbGVhbi1saWJ0b29sOgotCS1ybSAtcmYgLmxpYnMgX2xpYnMKLQotZGlzdGNsZWFuLWxpYnRvb2w6Ci0KLW1haW50YWluZXItY2xlYW4tbGlidG9vbDoKLQotbGQtbmV3JChFWEVFWFQpOiAkKGxkX25ld19PQkpFQ1RTKSAkKGxkX25ld19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGxkLW5ldyQoRVhFRVhUKQotCSQoTElOSykgJChsZF9uZXdfTERGTEFHUykgJChsZF9uZXdfT0JKRUNUUykgJChsZF9uZXdfTERBREQpICQoTElCUykKLS5sLmM6Ci0JJChMRVgpICQoQU1fTEZMQUdTKSAkKExGTEFHUykgJDwgJiYgbXYgJChMRVhfT1VUUFVUX1JPT1QpLmMgJEAKLS55LmM6Ci0JJChZQUNDKSAkKEFNX1lGTEFHUykgJChZRkxBR1MpICQ8ICYmIG12IHkudGFiLmMgJCouYwotCWlmIHRlc3QgLWYgeS50YWIuaDsgdGhlbiBcCi0JaWYgY21wIC1zIHkudGFiLmggJCouaDsgdGhlbiBybSAtZiB5LnRhYi5oOyBlbHNlIG12IHkudGFiLmggJCouaDsgZmk7IFwKLQllbHNlIDo7IGZpCi1sZGdyYW0uaDogbGRncmFtLmMKLQotCi1sZC5pbmZvOiBsZC50ZXhpbmZvCi1sZC5kdmk6IGxkLnRleGluZm8KLQotCi1EVklQUyA9IGR2aXBzCi0KLS50ZXhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnRleGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnR4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0uZHZpLnBzOgotCSQoRFZJUFMpICQ8IC1vICRACi0KLWluc3RhbGwtaW5mby1hbTogJChJTkZPX0RFUFMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChpbmZvZGlyKQotCUBsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgaWZpbGUgaW4gYGNkICQkZCAmJiBlY2hvICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV1gOyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgJCRkLyQkaWZpbGU7IHRoZW4gXAotCSAgICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZSI7IFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZTsgXAotCSAgICBlbHNlIDogOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQlAJChQT1NUX0lOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGVjaG8gIiBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUiO1wKLQkgICAgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIHx8IDo7XAotCSAgZG9uZTsgXAotCWVsc2UgOiA7IGZpCi0KLXVuaW5zdGFsbC1pbmZvOgotCSQoUFJFX1VOSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBpaT15ZXM7IFwKLQllbHNlIGlpPTsgZmk7IFwKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0IC16ICIkaWkiIFwKLQkgICAgfHwgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgLS1yZW1vdmUgJCRmaWxlOyBcCi0JZG9uZQotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgKGNkICQoREVTVERJUikkKGluZm9kaXIpICYmIHJtIC1mICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV0pOyBcCi0JZG9uZQotCi1kaXN0LWluZm86ICQoSU5GT19ERVBTKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgYmFzZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRiYXNlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBmaWxlIGluIGBjZCAkJGQgJiYgZXZhbCBlY2hvICQkYmFzZSpgOyBkbyBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0KLW1vc3RseWNsZWFuLWFtaW5mbzoKLQktcm0gLWYgbGQuYXV4IGxkLmNwIGxkLmNwcyBsZC5kdmkgbGQuZm4gbGQuZm5zIGxkLmt5IGxkLmt5cyBsZC5wcyBcCi0JICBsZC5sb2cgbGQucGcgbGQudG9jIGxkLnRwIGxkLnRwcyBsZC52ciBsZC52cnMgbGQub3AgbGQudHIgXAotCSAgbGQuY3YgbGQuY24KLQotY2xlYW4tYW1pbmZvOgotCi1kaXN0Y2xlYW4tYW1pbmZvOgotCi1tYWludGFpbmVyLWNsZWFuLWFtaW5mbzoKLQlmb3IgaSBpbiAkKElORk9fREVQUyk7IGRvIFwKLQkgIHJtIC1mICQkaTsgXAotCSAgaWYgdGVzdCAiYGVjaG8gJCRpLVswLTldKmAiICE9ICIkJGktWzAtOV0qIjsgdGhlbiBcCi0JICAgIHJtIC1mICQkaS1bMC05XSo7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2xlYW4taW5mbzogbW9zdGx5Y2xlYW4tYW1pbmZvCi0KLWluc3RhbGwtbWFuMToKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKG1hbjFkaXIpCi0JQGxpc3Q9JyQobWFuMV9NQU5TKSc7IFwKLQlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBcCi0JICBjYXNlICIkJGkiIGluIFwKLQkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJChzcmNkaXIpLyQkaTsgdGhlbiBmaWxlPSQoc3JjZGlyKS8kJGk7IFwKLQkgIGVsc2UgZmlsZT0kJGk7IGZpOyBcCi0JICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCi0JICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZSAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCi0JICAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAotCWRvbmUKLQotdW5pbnN0YWxsLW1hbjE6Ci0JQGxpc3Q9JyQobWFuMV9NQU5TKSc7IFwKLQlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBcCi0JICBjYXNlICIkJGkiIGluIFwKLQkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiBybSAtZiAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCi0JICBybSAtZiAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3Q7IFwKLQlkb25lCi1pbnN0YWxsLW1hbjogJChNQU5TKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtbWFuMQotdW5pbnN0YWxsLW1hbjoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHVuaW5zdGFsbC1tYW4xCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0KLUBTRVRfTUFLRUAKLQotYWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi1jaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBkb3Rfc2Vlbj15ZXM7IFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZTsgXAotCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAotCWZpOyB0ZXN0IC16ICIkJGZhaWwiCi0KLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JcmV2PScnOyBsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAiLiIgJiYgZG90X3NlZW49eWVzOyBcCi0JZG9uZTsgXAotCXRlc3QgIiQkZG90X3NlZW4iID0gIm5vIiAmJiByZXY9Ii4gJCRyZXYiOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgotdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAotCWRvbmUKLQotdGFnczogVEFHUwotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JaGVyZT1gcHdkYCAmJiBjZCAkKHNyY2RpcikgXAotCSAgJiYgbWtpZCAtZiQkaGVyZS9JRCAkJHVuaXF1ZSAkKExJU1ApCi0KLVRBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotICAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZiAkJHN1YmRpci9UQUdTICYmIHRhZ3M9IiQkdGFncyAtaSAkJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKLSAgIGZpOyBcCi0JZG9uZTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQl0ZXN0IC16ICIkKEVUQUdTX0FSR1MpY29uZmlnLmluJCR1bmlxdWUkKExJU1ApJCR0YWdzIiBcCi0JICB8fCAoY2QgJChzcmNkaXIpICYmIGV0YWdzICQoRVRBR1NfQVJHUykgJCR0YWdzIGNvbmZpZy5pbiAkJHVuaXF1ZSAkKExJU1ApIC1vICQkaGVyZS9UQUdTKQotCi1tb3N0bHljbGVhbi10YWdzOgotCi1jbGVhbi10YWdzOgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRAotCi1tYWludGFpbmVyLWNsZWFuLXRhZ3M6Ci0KLWRpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKLXRvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQotCi0jIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCi0jIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCi0jIHRhcmZpbGUuCi1kaXN0Y2hlY2s6IGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSB6eGYgJChkaXN0ZGlyKS50YXIuZ3oKLQlta2RpciAkKGRpc3RkaXIpLz1idWlsZAotCW1rZGlyICQoZGlzdGRpcikvPWluc3QKLQlkY19pbnN0YWxsX2Jhc2U9YGNkICQoZGlzdGRpcikvPWluc3QgJiYgcHdkYDsgXAotCWNkICQoZGlzdGRpcikvPWJ1aWxkIFwKLQkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0kJGRjX2luc3RhbGxfYmFzZSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUBiYW5uZXI9IiQoZGlzdGRpcikudGFyLmd6IGlzIHJlYWR5IGZvciBkaXN0cmlidXRpb24iOyBcCi0JZGFzaGVzPWBlY2hvICIkJGJhbm5lciIgfCBzZWQgcy8uLz0vZ2A7IFwKLQllY2hvICIkJGRhc2hlcyI7IFwKLQllY2hvICIkJGJhbm5lciI7IFwKLQllY2hvICIkJGRhc2hlcyIKLWRpc3Q6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0LWFsbDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikKLQktY2htb2QgNzc3ICQoZGlzdGRpcikKLQlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBjcCAtcHIgJCQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCi0JICBmaTsgXAotCWRvbmUKLQlmb3Igc3ViZGlyIGluICQoU1VCRElSUyk7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWQgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IG1rZGlyICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgICAgY2htb2QgNzc3ICQoZGlzdGRpcikvJCRzdWJkaXI7IFwKLQkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPS4uLyQoZGlzdGRpcikgZGlzdGRpcj0uLi8kKGRpc3RkaXIpLyQkc3ViZGlyIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgZGlzdC1pbmZvCi0KLURFSkFUT09MID0gJChQQUNLQUdFKQotCi1SVU5URVNUREVGQVVMVEZMQUdTID0gLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQkc3JjZGlyCi1zaXRlLmV4cDogTWFrZWZpbGUKLQlAZWNobyAnTWFraW5nIGEgbmV3IHNpdGUuZXhwIGZpbGUuLi4nCi0JQHRlc3QgISAtZiBzaXRlLmJhayB8fCBybSAtZiBzaXRlLmJhawotCUBlY2hvICcjIyB0aGVzZSB2YXJpYWJsZXMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IG1ha2UgIyMnID4gJEAtdAotCUBlY2hvICcjIERvIG5vdCBlZGl0IGhlcmUuICBJZiB5b3Ugd2lzaCB0byBvdmVycmlkZSB0aGVzZSB2YWx1ZXMnID4+ICRALXQKLQlAZWNobyAnIyBlZGl0IHRoZSBsYXN0IHNlY3Rpb24nID4+ICRALXQKLQlAZWNobyAnc2V0IHRvb2wgJChERUpBVE9PTCknID4+ICRALXQKLQlAZWNobyAnc2V0IHNyY2RpciAkKHNyY2RpciknID4+ICRALXQKLQlAZWNobyAnc2V0IG9iamRpcicgYHB3ZGAgPj4gJEAtdAotCUBlY2hvICdzZXQgaG9zdF9hbGlhcyAkKGhvc3RfYWxpYXMpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBob3N0X3RyaXBsZXQgJChob3N0X3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCB0YXJnZXRfYWxpYXMgJCh0YXJnZXRfYWxpYXMpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCB0YXJnZXRfdHJpcGxldCAkKHRhcmdldF90cmlwbGV0KScgPj4gJEAtdAotCUBlY2hvICdzZXQgYnVpbGRfYWxpYXMgJChidWlsZF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IGJ1aWxkX3RyaXBsZXQgJChidWlsZF90cmlwbGV0KScgPj4gJEAtdAotCUBlY2hvICcjIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZSBnZW5lcmF0ZWQgYnkgY29uZmlndXJlLiBEbyBOb3QgRWRpdCAjIycgPj4gJEAtdAotCUB0ZXN0ICEgLWYgc2l0ZS5leHAgfHwgc2VkICcxLC9eIyMgQWxsIHZhcmlhYmxlcyBhYm92ZSBhcmUuKiMjLyBkJyBzaXRlLmV4cCA+PiAkQC10Ci0JQHRlc3QgISAtZiBzaXRlLmV4cCB8fCBtdiBzaXRlLmV4cCBzaXRlLmJhawotCUBtdiAkQC10IHNpdGUuZXhwCi1pbmZvLWFtOiAkKElORk9fREVQUykKLWluZm86IGluZm8tcmVjdXJzaXZlCi1kdmktYW06ICQoRFZJUykKLWR2aTogZHZpLXJlY3Vyc2l2ZQotY2hlY2stYW06Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2stREVKQUdOVQotY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbGNoZWNrLWFtOgotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsLWluZm8tYW06IAotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCi1hbGwtcmVjdXJzaXZlLWFtOiBjb25maWcuaAotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWV4ZWMtbG9jYWwKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtbWFuIGluc3RhbGwtZGF0YS1sb2NhbAotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbWFuCi11bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKLWFsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykgJChNQU5TKSBjb25maWcuaAotYWxsLXJlZGlyZWN0OiBhbGwtcmVjdXJzaXZlLWFtCi1pbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUz0tcyBpbnN0YWxsCi1pbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCi1pbnN0YWxsZGlycy1hbToKLQkkKG1raW5zdGFsbGRpcnMpICAkKERFU1RESVIpJChtYW5kaXIpL21hbjEKLQotCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKE1PU1RMWUNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1PU1RMWUNMRUFORklMRVMpCi0KLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQktdGVzdCAteiAiJChESVNUQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoRElTVENMRUFORklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAibGRsZXhsbGRncmFtaGxkZ3JhbWMkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgbGRsZXhsIGxkZ3JhbWggbGRncmFtYyAkKE1BSU5UQUlORVJDTEVBTkZJTEVTKQotbW9zdGx5Y2xlYW4tYW06ICBtb3N0bHljbGVhbi1oZHIgbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotCQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgXAotCQltb3N0bHljbGVhbi1hbWluZm8gbW9zdGx5Y2xlYW4tdGFncyBtb3N0bHljbGVhbi1nZW5lcmljIFwKLQkJbW9zdGx5Y2xlYW4tbG9jYWwKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQotCi1jbGVhbi1hbTogIGNsZWFuLWhkciBjbGVhbi1ub2luc3RQUk9HUkFNUyBjbGVhbi1jb21waWxlIGNsZWFuLWxpYnRvb2wgXAotCQljbGVhbi1hbWluZm8gY2xlYW4tdGFncyBjbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWFtCi0KLWNsZWFuOiBjbGVhbi1yZWN1cnNpdmUKLQotZGlzdGNsZWFuLWFtOiAgZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVMgZGlzdGNsZWFuLWNvbXBpbGUgXAotCQlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tYW1pbmZvIGRpc3RjbGVhbi10YWdzIFwKLQkJZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tYW0gZGlzdGNsZWFuLWxvY2FsCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUyBcCi0JCW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgXAotCQltYWludGFpbmVyLWNsZWFuLWFtaW5mbyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgXAotCQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotLlBIT05ZOiBtb3N0bHljbGVhbi1oZHIgZGlzdGNsZWFuLWhkciBjbGVhbi1oZHIgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVMgZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLWNsZWFuLW5vaW5zdFBST0dSQU1TIG1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotbW9zdGx5Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tY29tcGlsZSBjbGVhbi1jb21waWxlIFwKLW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJ0b29sIFwKLWNsZWFuLWxpYnRvb2wgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIGluc3RhbGwtaW5mby1hbSB1bmluc3RhbGwtaW5mbyBcCi1tb3N0bHljbGVhbi1hbWluZm8gZGlzdGNsZWFuLWFtaW5mbyBjbGVhbi1hbWluZm8gXAotbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gaW5zdGFsbC1tYW4xIHVuaW5zdGFsbC1tYW4xIGluc3RhbGwtbWFuIFwKLXVuaW5zdGFsbC1tYW4gaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAotaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZXhlYy1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIFwKLWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUgdGFncyB0YWdzLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbi10YWdzIFwKLWRpc3RjbGVhbi10YWdzIGNsZWFuLXRhZ3MgbWFpbnRhaW5lci1jbGVhbi10YWdzIGRpc3RkaXIgY2hlY2stREVKQUdOVSBcCi1pbmZvLWFtIGluZm8gZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIFwKLWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtbG9jYWwgXAotaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEtbG9jYWwgaW5zdGFsbC1kYXRhLWFtIFwKLWluc3RhbGwtZGF0YSBpbnN0YWxsLWFtIGluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbCBhbGwtcmVkaXJlY3QgXAotYWxsLWFtIGFsbCBpbnN0YWxsZGlycy1hbSBpbnN0YWxsZGlycyBtb3N0bHljbGVhbi1nZW5lcmljIFwKLWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWdlbmVyaWMgbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGNsZWFuIFwKLW1vc3RseWNsZWFuIGRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuCi0KLQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotbGRtYWluLm86IGxkbWFpbi5jIGNvbmZpZy5zdGF0dXMKLQkkKENPTVBJTEUpIC1jIC1EREVGQVVMVF9FTVVMQVRJT049JyIkKEVNVUwpIicgLURTQ1JJUFRESVI9JyIkKHNjcmlwdGRpcikiJyAtRFRBUkdFVD0nIkB0YXJnZXRAIicgJChzcmNkaXIpL2xkbWFpbi5jCi0KLWxkZW11bC1saXN0Lmg6IE1ha2VmaWxlCi0JKGVjaG8gIi8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gIERPIE5PVCBFRElUISAqLyI7XAotCWZvciBmIGluIGBlY2hvICIgIiAke0VNVUxBVElPTl9PRklMRVN9ICIiIFwKLQkgfCBzZWQgLWUgJ3MvIGUvIGxkL2cnIC1lICdzLyBsZC8gL2cnIC1lICdzL1suXW8vL2cnYDsgZG8gXAotCSAgICBlY2hvICJleHRlcm4gbGRfZW11bGF0aW9uX3hmZXJfdHlwZSBsZF8kJHtmfV9lbXVsYXRpb247IjsgXAotCWRvbmU7XAotCWVjaG8gIiI7XAotCWVjaG8gIiNkZWZpbmUgRU1VTEFUSU9OX0xJU1QgXFwiO1wKLQlmb3IgZiBpbiBgZWNobyAiICIgJHtFTVVMQVRJT05fT0ZJTEVTfSAiIiBcCi0JIHwgc2VkIC1lICdzLyBlLyBsZC9nJyAtZSAncy8gbGQvIC9nJyAtZSAncy9bLl1vLy9nJ2A7IGRvIFwKLQkgICAgZWNobyAiICAmbGRfJCR7Zn1fZW11bGF0aW9uLCBcXCI7IFwKLQlkb25lO1wKLQllY2hvICIgIDAiKSA+bGRlbXVsLXRtcC5oCi0JbXYgbGRlbXVsLXRtcC5oIGxkZW11bC1saXN0LmgKLUBURElSU0AKLQotZWEyOWsuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYTI5ay5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYTI5ay5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYTI5ayAiJCh0ZGlyX2EyOWspIgotZWFpeHBwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9haXhwcGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FpeC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWl4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhaXhwcGMgIiQodGRpcl9haXhwcGMpIgotZWFpeHJzNi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9haXhyczYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FpeC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWl4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhaXhyczYgIiQodGRpcl9haXhyczYpIgotZWFscGhhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FscGhhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hbHBoYS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYWxwaGEgIiQodGRpcl9hbHBoYSkiCi1lYXJjZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FyY2VsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcmNlbGYgIiQodGRpcl9hcmNlbGYpIgotZWFybWVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGYgIiQodGRpcl9hcm1lbGYpIgotZWFybWVsZl9vYWJpLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGZfb2FiaSAiJCh0ZGlyX2FybWVsZikiCi1lYXJtZWxmX2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZl9saW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWVsZl9saW51eCAiJCh0ZGlyX2FybWVsZl9saW51eCkiCi1lYXJtZWxmX2xpbnV4MjYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4MjYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGZfbGludXgyNiAiJCh0ZGlyX2FybWVsZl9saW51eDI2KSIKLWVhcm1hb3V0Yi5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1hb3V0Yi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYXJtYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtYW91dGIgIiQodGRpcl9hcm1hb3V0YikiCi1lYXJtYW91dGwuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtYW91dGwuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FybWFvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWFvdXRsICIkKHRkaXJfYXJtYW91dGwpIgotZWFybWNvZmYuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtY29mZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYXJtY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtY29mZiAiJCh0ZGlyX2FybWNvZmYpIgotZWFybXBlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybXBlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybXBlICIkKHRkaXJfYXJtcGUpIgotZWNvZmZfc3BhcmMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvY29mZl9zcGFyYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBjb2ZmX3NwYXJjICIkKHRkaXJfY29mZl9zcGFyYykiCi1lZDEwdmVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kMTB2ZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMTB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMTB2ZWxmICIkKHRkaXJfZDEwdikiCi1lZDMwdmVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kMzB2ZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMzB2ZWxmICIkKHRkaXJfZDMwdikiCi1lZDMwdl9vLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QzMHZfby5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZDMwdl9vICIkKHRkaXJfZDMwdikiCi1lZDMwdl9lLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QzMHZfZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZDMwdl9lICIkKHRkaXJfZDMwdikiCi1lZGVsdGE2OC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kZWx0YTY4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9kZWx0YTY4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkZWx0YTY4ICIkKHRkaXJfZGVsdGE2OCkiCi1lZWJtb24yOWsuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWJtb24yOWsuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VibW9uMjlrLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlYm1vbjI5ayAiJCh0ZGlyX2VibW9uMjlrKSIKLWVlbGYzMmZyMzAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJmcjMwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmZyMzAgIiQodGRpcl9mcjMwKSIKLWVlbGYzMm1jb3JlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybWNvcmUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybWNvcmUgIiQodGRpcl9tY29yZSkiCi1lbTMycmVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tMzJyZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG0zMnJlbGYgIiQodGRpcl9tMzJyKSIKLWVlbGYzMl9zcGFyYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJfc3BhcmMgIiQodGRpcl9lbGYzMl9zcGFyYykiCi1lZWxmMzJiNDMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmI0MzAwICIkKHRkaXJfZWxmMzJiNDMwMCkiCi1lZWxmMzJibWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyYm1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJibWlwICIkKHRkaXJfZWxmMzJibWlwKSIKLWVlbGYzMmJzbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyYnNtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyYnNtaXAgIiQodGRpcl9lbGYzMmJzbWlwKSIKLWVlbGYzMmVibWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyZWJtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyZWJtaXAgIiQodGRpcl9lbGYzMmVibWlwKSIKLWVlbGYzMmVsbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyZWxtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyZWxtaXAgIiQodGRpcl9lbGYzMmVsbWlwKSIKLWVlbGYzMmw0MzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybDQzMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybDQzMDAgIiQodGRpcl9lbGYzMmw0MzAwKSIKLWVlbGYzMmxtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJsbWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmxtaXAgIiQodGRpcl9lbGYzMmxtaXApIgotZWVsZjMybHBwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmxwcGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZwcGMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybHBwYyAiJCh0ZGlyX2VsZjMybHBwYykiCi1lZWxmMzJsc21pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmxzbWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmxzbWlwICIkKHRkaXJfZWxmMzJsc21pcCkiCi1lZWxmMzJwcGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJwcGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZwcGMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMycHBjICIkKHRkaXJfZWxmMzJwcGMpIgotZWVsZjY0YWxwaGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmNjRhbHBoYS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmNjRhbHBoYSAiJCh0ZGlyX2VsZjY0YWxwaGEpIgotZWVsZjY0X3NwYXJjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGY2NF9zcGFyYyAiJCh0ZGlyX2VsZjY0X3NwYXJjKSIKLWVlbGZfaTM4Ni5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGZfaTM4Ni5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmX2kzODYgIiQodGRpcl9lbGZfaTM4NikiCi1lZWxmX2kzODZfYmUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmX2kzODZfYmUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZl9pMzg2X2JlICIkKHRkaXJfZWxmX2kzODZfYmUpIgotZWdsZDk2MC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9nbGQ5NjAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dsZDk2MC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTk2MC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZ2xkOTYwICIkKHRkaXJfZ2xkOTYwKSIKLWVnbGQ5NjBjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2dsZDk2MGNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dsZDk2MGMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2k5NjAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGdsZDk2MGNvZmYgIiQodGRpcl9nbGQ5NjBjb2ZmKSIKLWVnbzMyLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2dvMzIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGdvMzIgIiQodGRpcl9nbzMyKSIKLWVoODMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODMwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDgzMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4MzAwICIkKHRkaXJfaDgzMDApIgotZWg4MzAwaC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODMwMGguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4MzAwaC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDgzMDBoICIkKHRkaXJfaDgzMDBoKSIKLWVoODMwMHMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDgzMDBzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODMwMHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4MzAwcyAiJCh0ZGlyX2g4MzAwcykiCi1laDg1MDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMCAiJCh0ZGlyX2g4NTAwKSIKLWVoODUwMGIuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDBiLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMGIuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwYiAiJCh0ZGlyX2g4NTAwYikiCi1laDg1MDBjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBjLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMGMgIiQodGRpcl9oODUwMGMpIgotZWg4NTAwbS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMG0uc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwbS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDBtICIkKHRkaXJfaDg1MDBtKSIKLWVoODUwMHMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDBzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwcyAiJCh0ZGlyX2g4NTAwcykiCi1laHAzMDBic2QuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaHAzMDBic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGhwMzAwYnNkICIkKHRkaXJfaHAzMDBic2QpIgotZWhwM2hwdXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaHAzaHB1eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaHAzaHB1eCAiJCh0ZGlyX2hwM2hwdXgpIgotZWhwcGFlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaHBwYWVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvaHBwYWVsZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaHBwYWVsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaHBwYWVsZiAiJCh0ZGlyX2hwcGFlbGYpIgotZWkzODZhb3V0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZhb3V0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2YW91dCAiJCh0ZGlyX2kzODZhb3V0KSIKLWVpMzg2YmVvcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2YmVvcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYmVvcy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4NmJlb3Muc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZiZW9zICIkKHRkaXJfaTM4NmJlb3MpIgotZWkzODZic2QuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmJzZCAiJCh0ZGlyX2kzODZic2QpIgotZWkzODZjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmNvZmYgIiQodGRpcl9pMzg2Y29mZikiCi1laTM4NmdvMzIuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmdvMzIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZnbzMyLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2Z28zMiAiJCh0ZGlyX2kzODZnbzMyKSIKLWVpMzg2bGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmxpbnV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9saW51eC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmxpbnV4ICIkKHRkaXJfaTM4NmxpbnV4KSIKLWVpMzg2bHlueC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bHlueC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4Nmx5bnguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZseW54ICIkKHRkaXJfaTM4Nmx5bngpIgotZWkzODZtYWNoLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZtYWNoLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bWFjaCAiJCh0ZGlyX2kzODZtYWNoKSIKLWVpMzg2bW9zcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bW9zcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bW9zcyAiJCh0ZGlyX2kzODZtb3NzKSIKLWVpMzg2bXNkb3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm1zZG9zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZtc2RvcyAiJCh0ZGlyX2kzODZtc2RvcykiCi1laTM4Nm5ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm5ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZuYnNkICIkKHRkaXJfaTM4Nm5ic2QpIgotZWkzODZudy5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bncuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9udy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm53ICIkKHRkaXJfaTM4Nm53KSIKLWVpMzg2cGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NnBlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZwZSAiJCh0ZGlyX2kzODZwZSkiCi1lbG5rOTYwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2xuazk2MC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbG5rOTYwLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pOTYwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBsbms5NjAgIiQodGRpcl9sbms5NjApIgotZW02OGs0a25ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4azRrbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4azRrbmJzZCAiJCh0ZGlyX202OGs0a25ic2QpIgotZW02OGthb3V0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGthb3V0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrYW91dCAiJCh0ZGlyX202OGthb3V0KSIKLWVtNjhrYXV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGthdXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL202OGthdXguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGthdXggIiQodGRpcl9tNjhrYXV4KSIKLWVtNjhrY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtjb2ZmICIkKHRkaXJfbTY4a2NvZmYpIgotZW02OGtlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2VsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2VsZiAiJCh0ZGlyX202OGtlbGYpIgotZW02OGtsaW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrbGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2xpbnV4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrbGludXggIiQodGRpcl9tNjhrbGludXgpIgotZW02OGtseW54LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtseW54LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tNjhrbHlueC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2x5bnggIiQodGRpcl9tNjhrbHlueCkiCi1lbTY4a25ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a25ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtuYnNkICIkKHRkaXJfbTY4a25ic2QpIgotZW02OGtwc29zLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtwc29zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcHNvcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a3Bzb3MgIiQodGRpcl9tNjhrcHNvcykiCi1lbTg4a2Jjcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tODhrYmNzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tODhrYmNzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtODhrYmNzICIkKHRkaXJfbTg4a2JjcykiCi1lbWNvcmVwZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tY29yZXBlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1jb3JlcGUgIiQodGRpcl9tY29yZXBlKSIKLWVtaXBzYmlnLmM6ICAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzYmlnLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzYmlnCi1lbWlwc2JzZC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzYnNkLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzYnNkCi1lbWlwc2lkdC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzaWR0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9taXBzZWNvZmYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNpZHQgIiQodGRpcl9taXBzaWR0KSIKLWVtaXBzaWR0bC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzaWR0bC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzaWR0bCAiJCh0ZGlyX21pcHNpZHRsKSIKLWVtaXBzbGl0LmM6ICAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzbGl0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzbGl0ICIkKHRkaXJfbWlwc2xpdCkiCi1lbWlwc2xuZXdzLmM6ICAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzbG5ld3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNsbmV3cwotZW1uMTAzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbW4xMDMwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbW4xMDMwMCAiJCh0ZGlyX21uMTAzMDApIgotZW1uMTAyMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbW4xMDIwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbW4xMDIwMCAiJCh0ZGlyX21uMTAyMDApIgotZW5ld3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbmV3cy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbmV3cyAiJCh0ZGlyX25ld3MpIgotZW5zMzJrbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9uczMya25ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG5zMzJrbmJzZCAiJCh0ZGlyX25zMzJrbmJzZCkiCi1lcGM1MzJtYWNoYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9wYzUzMm1hY2hhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwYzUzMm1hY2hhICIkKHRkaXJfcGM1MzJtYWNoYSkiCi1lcHBjbWFjb3MuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvcHBjbWFjb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FpeC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWl4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwcGNtYWNvcyAiJCh0ZGlyX3BwY21hY29zKSIKLWVwcGNudy5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9wcGNudy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL253LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwcGNudyAiJCh0ZGlyX3BwY253KSIKLWVwcGNwZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9wcGNwZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BwY3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwcGNwZSAiJCh0ZGlyX3BwY3BlKSIKLWVyaXNjaXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvcmlzY2l4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSByaXNjaXggIiQodGRpcl9yaXNjaXgpIgotZXNhMjkyMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2EyOTIwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc2EyOTIwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2EyOTIwMCAiJCh0ZGlyX3NhMjkyMDApIgotZXNoLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NoLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zaC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2ggIiQodGRpcl9zaCkiCi1lc2hlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2hlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNoZWxmICIkKHRkaXJfc2hlbGYpIgotZXNobGVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaGxlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNobGVsZiAiJCh0ZGlyX3NobGVsZikiCi1lc2hsLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NobC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc2guc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNobCAiJCh0ZGlyX3NobCkiCi1lc3BhcmNhb3V0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjYW91dC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3BhcmNhb3V0ICIkKHRkaXJfc3BhcmNhb3V0KSIKLWVzcGFyY2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjbGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2xpbnV4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzcGFyY2xpbnV4ICIkKHRkaXJfc3BhcmNsaW51eCkiCi1lc3BhcmNseW54LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjbHlueC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzcGFyY2x5bnggIiQodGRpcl9zcGFyY2x5bngpIgotZXNwYXJjbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9zcGFyY25ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNwYXJjbmJzZCAiJCh0ZGlyX3NwYXJjbmJzZCkiCi1lc3QyMDAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3N0MjAwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc3QyMDAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzdDIwMDAgIiQodGRpcl9zdDIwMDApIgotZXN1bjMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3VuMy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvc3Vub3MuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHN1bjMgIiQodGRpcl9zdW4zKSIKLWVzdW40LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3N1bjQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3N1bm9zLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzdW40ICIkKHRkaXJfc3VuNCkiCi1ldGljMzBhb3V0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3RpYzMwYW91dC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdGljMzBhb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB0aWMzMGFvdXQgIiQodGRpcl90aWMzMGFvdXQpIgotZXRpYzMwY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy90aWMzMGNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3RpYzMwY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdGljMzBjb2ZmICIkKHRkaXJfdGljMzBjb2ZmKSIKLWV0aWM4MGNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdGljODBjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHRpYzgwY29mZiAiJCh0ZGlyX3RpYzgwY29mZikiCi1ldmFuaWxsYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy92YW5pbGxhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC92YW5pbGxhLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC92YW5pbGxhLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB2YW5pbGxhICIkKHRkaXJfdmFuaWxsYSkiCi1ldmF4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3ZheC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdmF4ICIkKHRkaXJfdmF4KSIKLWV2c3RhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3ZzdGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHZzdGEgIiQodGRpcl92c3RhKSIKLWV2ODUwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3Y4NTAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC92ODUwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB2ODUwICIkKHRkaXJfdjg1MCkiCi1ldzY1LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3c2NS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdzY1LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB3NjUgIiQodGRpcl93NjUpIgotZXo4MDAxLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3o4MDAxLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC96ODAwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gejgwMDEgIiQodGRpcl96ODAwMSkiCi1lejgwMDIuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvejgwMDIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3o4MDAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB6ODAwMiAiJCh0ZGlyX3o4MDAyKSIKLQotIyBUaGUgZ2VuZXJhdGVkIGVtdWxhdGlvbiBmaWxlcyBtb3N0bHkgaGF2ZSB0aGUgc2FtZSBkZXBlbmRlbmNpZXMuCi0kKEVNVUxBVElPTl9PRklMRVMpOiAuLi9iZmQvYmZkLmggc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRtYWluLmggbGRlbXVsLmggbGRmaWxlLmggbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBcCi0gIGxkY3Rvci5oIGxkZXhwLmggbGRsYW5nLmggbGRncmFtLmgKLQotY2hlY2stREVKQUdOVTogc2l0ZS5leHAKLQlzcmNyb290PWBjZCAkKHNyY2RpcikgJiYgcHdkYDsgZXhwb3J0IHNyY3Jvb3Q7IFwKLQlyPWBwd2RgOyBleHBvcnQgcjsgXAotCUVYUEVDVD0kKEVYUEVDVCk7IGV4cG9ydCBFWFBFQ1Q7IFwKLQlpZiBbIC1mICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IF07IHRoZW4gXAotCSAgVENMX0xJQlJBUlk9YGNkICQodG9wX3NyY2RpcikvLi4vdGNsL2xpYnJhcnkgJiYgcHdkYDsgXAotCSAgZXhwb3J0IFRDTF9MSUJSQVJZOyBcCi0JZmk7IFwKLQlydW50ZXN0PSQoUlVOVEVTVCk7IFwKLQlpZiAkKFNIRUxMKSAtYyAiJCRydW50ZXN0IC0tdmVyc2lvbiIgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICAkJHJ1bnRlc3QgLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQke3NyY3Jvb3R9L3Rlc3RzdWl0ZSBcCi0JCUNDPSIkKENDX0ZPUl9UQVJHRVQpIiBDRkxBR1M9IiQoQ0ZMQUdTKSIgXAotCQlDWFg9IiQoQ1hYX0ZPUl9UQVJHRVQpIiBDWFhGTEFHUz0iJChDWFhGTEFHUykiIFwKLQkJQ0NfRk9SX0hPU1Q9IiQoQ0MpIiBDRkxBR1NfRk9SX0hPU1Q9IiQoQ0ZMQUdTKSIgXAotCQlPRklMRVM9IiQoT0ZJTEVTKSIgQkZETElCPSIkKFRFU1RCRkRMSUIpIiBcCi0JCUxJQklCRVJUWT0iJChMSUJJQkVSVFkpICQoSU5UTExJQlMpIiBcCi0JCSQoUlVOVEVTVEZMQUdTKTsgXAotCWVsc2UgZWNobyAiV0FSTklORzogY291bGQgbm90IGZpbmQgXGBydW50ZXN0JyIgMT4mMjsgOjtcCi0JZmkKLQotIyBSdWxlcyBmb3IgdGVzdGluZyBieSByZWxpbmtpbmcgbGQgaXRzZWxmLgotIyBBIHNpbWlsYXIgdGVzdCBpcyBpbiB0aGUgdGVzdHN1aXRlLiAgVGhpcyB0YXJnZXQgaXMgZm9yIGVhc2Ugb2YgdXNlCi0jIHdoZW4gcG9ydGluZyBsZC4KLQotbGQtcGFydGlhbC5vOiBsZC1uZXckKEVYRUVYVCkKLQkuL2xkLW5ldyQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZC1wYXJ0aWFsLm8gLXIgJChPRklMRVMpCi1sZDEkKEVYRUVYVCk6IGxkLXBhcnRpYWwubwotCS4vbGQtbmV3JChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMSQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgbGQtcGFydGlhbC5vICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQotCi1sZDEtZnVsbCQoRVhFRVhUKTogbGQtbmV3Ci0JLi9sZC1uZXckKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQxLWZ1bGwkKEVYRUVYVCkgJChIT1NUSU5HX0NSVDApICQoT0ZJTEVTKSAkKFRFU1RCRkRMSUIpICQoTElCSUJFUlRZKSAkKEhPU1RJTkdfTElCUykKLQotbGQyJChFWEVFWFQpOiBsZDEkKEVYRUVYVCkKLQkuL2xkMSQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDIkKEVYRUVYVCkgJChIT1NUSU5HX0NSVDApICQoT0ZJTEVTKSAkKFRFU1RCRkRMSUIpICQoTElCSUJFUlRZKSAkKEhPU1RJTkdfTElCUykKLQotbGQzJChFWEVFWFQpOiBsZDIkKEVYRUVYVCkKLQkuL2xkMiQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDMkKEVYRUVYVCkgJChIT1NUSU5HX0NSVDApICQoT0ZJTEVTKSAkKFRFU1RCRkRMSUIpICQoTElCSUJFUlRZKSAkKEhPU1RJTkdfTElCUykKLQotYm9vdHN0cmFwOiBsZDMkKEVYRUVYVCkKLQljbXAgbGQyJChFWEVFWFQpIGxkMyQoRVhFRVhUKQotCi0uUEhPTlk6IGJvb3RzdHJhcAotCi0jIEEgdGVzdCBwcm9ncmFtIGZvciBDKysgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycy4KLSMgVGhpcyB0ZXN0IGlzIG5vdyBpbiB0aGUgdGVzdHN1aXRlLgotIwotI2NkdGVzdDogY2R0ZXN0LW1haW4ubyBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vIGxkLm5ldwotIwkuL2xkLm5ldyAkKEhPU1RJTkdfRU1VKSAtbyBjZHRlc3QgJChIT1NUSU5HX0NSVDApIFwKLSMJICBjZHRlc3QtbWFpbi5vIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8gJChIT1NUSU5HX0xJQlMpCi0jCi0jY2R0ZXN0Lm91dDogY2R0ZXN0Ci0jCS4vY2R0ZXN0ID4gY2R0ZXN0LnRtcAotIwltdiBjZHRlc3QudG1wIGNkdGVzdC5vdXQKLSMKLSNjZHRlc3QtdXIubzogY2R0ZXN0LW1haW4ubyBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vIGxkLm5ldwotIwkuL2xkLm5ldyAkKEhPU1RJTkdfRU1VKSAtbyBjZHRlc3QtdXIubyAtVXIgY2R0ZXN0LW1haW4ubyBcCi0jCSAgY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubwotIwotI2NkdGVzdC11cjogY2R0ZXN0LXVyLm8KLSMJLi9sZC5uZXcgJChIT1NUSU5HX0VNVSkgLW8gY2R0ZXN0LXVyICQoSE9TVElOR19DUlQwKSBjZHRlc3QtdXIubyBcCi0jCSAgJChIT1NUSU5HX0xJQlMpCi0jCi0jY2R0ZXN0LXVyLm91dDogY2R0ZXN0LXVyCi0jCS4vY2R0ZXN0LXVyID4gY2R0ZXN0LXVyLnRtcAotIwltdiBjZHRlc3QtdXIudG1wIGNkdGVzdC11ci5vdXQKLSMKLSNjaGVjay1jZHRlc3Q6IGNkdGVzdC5vdXQgY2R0ZXN0LXVyLm91dCAkKHNyY2RpcikvY2R0ZXN0LmV4cAotIwlkaWZmICQoc3JjZGlyKS9jZHRlc3QuZXhwIGNkdGVzdC5vdXQKLSMJZGlmZiAkKHNyY2RpcikvY2R0ZXN0LmV4cCBjZHRlc3QtdXIub3V0Ci0jCi0jLlBIT05ZOiBjaGVjay1jZHRlc3QKLQotIyBFTkQgT0YgQ0hFQ0sgVEFSR0VUUwotCi0jIERPQ1VNRU5UQVRJT04gVEFSR0VUUwotIyBNYW51YWwgY29uZmlndXJhdGlvbiBmaWxlOyBub3QgdXN1YWxseSBhdHRhY2hlZCB0byBub3JtYWwgY29uZmlndXJhdGlvbiwKLSMgYmVjYXVzZSBhbG1vc3QgYWxsIGNvbmZpZ3MgdXNlICJnZW4iIHZlcnNpb24gb2YgbWFudWFsLgotIyAgU2V0IERPQ1ZFUiBhYm92ZSB0byBjaGFuZ2UuCi1jb25maWdkb2MudGV4aToJJHtET0NWRVJ9LWRvYy50ZXhpCi0JbG4gLXMgJHtzcmNkaXJ9LyR7RE9DVkVSfS1kb2MudGV4aSAuL2NvbmZpZ2RvYy50ZXhpID4vZGV2L251bGwgMj4mMSBcCi0JICB8fCBsbiAke3NyY2Rpcn0vJHtET0NWRVJ9LWRvYy50ZXhpIC4vY29uZmlnZG9jLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGNwICR7c3JjZGlyfS8ke0RPQ1ZFUn0tZG9jLnRleGkgLi9jb25maWdkb2MudGV4aQotCi1sZHZlci50ZXhpOiBNYWtlZmlsZQotCXJtIC1mICRACi0JZWNobyAnQHNldCBWRVJTSU9OICQoVkVSU0lPTiknID4gJEAKLQotbGQuaW5mbzogJChzcmNkaXIpL2xkLnRleGluZm8gY29uZmlnZG9jLnRleGkgbGR2ZXIudGV4aQotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpIC1JICQoQkZERElSKS9kb2MgJChzcmNkaXIpL2xkLnRleGluZm8KLQotbGQuZHZpOiAkKHNyY2RpcikvbGQudGV4aW5mbyBjb25maWdkb2MudGV4aSBsZHZlci50ZXhpCi0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mbzokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0iJChNQUtFSU5GTykgLUkgJChzcmNkaXIpIC1JICQoQkZERElSKS9kb2MiICQoVEVYSTJEVkkpICQoc3JjZGlyKS9sZC50ZXhpbmZvCi0KLSMgV2Ugd2FudCB0byByZWNvbmZpZ3VyZSBpZiBjb25maWd1cmUuaG9zdCBvciBjb25maWd1cmUudGd0IGNoYW5nZXMuCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS9jb25maWd1cmUuaG9zdCAkKHNyY2RpcikvY29uZmlndXJlLnRndAotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLW1vc3RseWNsZWFuLWxvY2FsOgotCS1ybSAtcmYgdG1wZGlyCi0KLS5QSE9OWTogaW5zdGFsbC1leGVjLWxvY2FsIGluc3RhbGwtZGF0YS1sb2NhbAotCi1pbnN0YWxsLWV4ZWMtbG9jYWw6IGxkLW5ldyQoRVhFRVhUKQotCSQobWtpbnN0YWxsZGlycykgJChiaW5kaXIpICQodG9vbGRpcikvYmluCi0JQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0Jbj1gZWNobyBsZCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2A7IFwKLQlpZiBbICIkKGJpbmRpcikvJCRuJChFWEVFWFQpIiAhPSAiJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCkiIF07IHRoZW4gXAotCSAgcm0gLWYgJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCk7IFwKLQkgIGxuICQoYmluZGlyKS8kJG4kKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCkgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCBcCi0JICB8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSBsZC1uZXckKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCk7IFwKLQlmaQotCi1pbnN0YWxsLWRhdGEtbG9jYWw6Ci0JJChta2luc3RhbGxkaXJzKSAkKHNjcmlwdGRpcikvbGRzY3JpcHRzCi0JZm9yIGYgaW4gbGRzY3JpcHRzLyo7IGRvIFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkJGYgJChzY3JpcHRkaXIpLyQkZiA7IFwKLQlkb25lCi1kaXN0c3R1ZmY6ICQoTERESVNUU1RVRkYpIGluZm8KLWRpc3RjbGVhbi1sb2NhbDoKLQlybSAtcmYgbGRzY3JpcHRzCi0KLSMgVGFyZ2V0cyB0byByZWJ1aWxkIGRlcGVuZGVuY2llcyBpbiB0aGlzIE1ha2VmaWxlLgotIyBIYXZlIHRvIGdldCByaWQgb2YgLmRlcDEgaGVyZSBzbyB0aGF0ICIkPyIgbGF0ZXIgaW5jbHVkZXMgYWxsIG9mICQoQ0ZJTEVTKS4KLS5kZXA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpICQoR0VORVJBVEVEX0hGSUxFUykgY29uZmlnLmgKLQlybSAtZiAuZGVwMQotCSQoTUFLRSkgREVQPSQoREVQKSAuZGVwMQotCXNlZCAtZiBkZXAuc2VkIDwuZGVwMSA+LmRlcAotCi0jIFRoaXMgcnVsZSByZWFsbHkgd2FudHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotLmRlcDE6ICQoQ0ZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpCi0Jcm0gLWYgLmRlcDIKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXAyCi0JJChERVApIC1mIC5kZXAyICQoSU5DTFVERVMpICQ/Ci0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIC5kZXAyIC5kZXAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCi0KLWRlcDogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgTWFrZWZpbGUgPiB0bXAtTWFrZWZpbGUKLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUKLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmluCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5pbiAkKHNyY2RpcikvTWFrZWZpbGUuaW4KLQotZGVwLWFtOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi0uUEhPTlk6IGRlcCBkZXAtaW4gZGVwLWFtCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi0KLWxkY3Rvci5vOiBsZGN0b3IuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkZXhwLmggbGRsYW5nLmggbGRtaXNjLmggbGRncmFtLmggbGRtYWluLmggbGRjdG9yLmgKLWxkZW11bC5vOiBsZGVtdWwuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGxkLmggbGRlbXVsLmggXAotICBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZmlsZS5oIGxkbWFpbi5oIGxkZW11bC1saXN0LmgKLWxkZXhwLm86IGxkZXhwLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZG1haW4uaCBsZG1pc2MuaCBsZGV4cC5oIGxkZ3JhbS5oIGxkbGFuZy5oCi1sZGZpbGUubzogbGRmaWxlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZmlsZS5oIGxkbWFpbi5oIGxkZ3JhbS5oIFwKLSAgbGRsZXguaCBsZGVtdWwuaAotbGRsYW5nLm86IGxkbGFuZy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYmZkbGluay5oIGxkLmggbGRtYWluLmggXAotICBsZGdyYW0uaCBsZGV4cC5oIGxkbGFuZy5oIGxkZW11bC5oIGxkbGV4LmggbGRtaXNjLmggXAotICBsZGN0b3IuaCBsZGZpbGUuaCAkKElOQ0RJUikvZm5tYXRjaC5oCi1sZG1haW4ubzogbGRtYWluLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvcHJvZ3Jlc3MuaCAkKElOQ0RJUikvYmZkbGluay5oIGxkLmggbGRtYWluLmggXAotICBsZG1pc2MuaCBsZHdyaXRlLmggbGRncmFtLmggbGRleHAuaCBsZGxhbmcuaCBsZGVtdWwuaCBcCi0gIGxkbGV4LmggbGRmaWxlLmggbGRjdG9yLmgKLWxkbWlzYy5vOiBsZG1pc2MuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9kZW1hbmdsZS5oIGxkLmggbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBcCi0gIGxkZ3JhbS5oIGxkbGV4LmggbGRtYWluLmggbGRmaWxlLmgKLWxkdmVyLm86IGxkdmVyLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBsZC5oIGxkdmVyLmggXAotICBsZGVtdWwuaCBsZG1haW4uaAotbGR3cml0ZS5vOiBsZHdyaXRlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGxkLmggbGRleHAuaCBsZGxhbmcuaCBsZHdyaXRlLmggXAotICBsZG1pc2MuaCBsZGdyYW0uaCBsZG1haW4uaAotbGV4c3VwLm86IGxleHN1cC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGQuaCBsZG1haW4uaCBcCi0gIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRncmFtLmggbGRsZXguaCBsZGZpbGUuaCBcCi0gIGxkdmVyLmggbGRlbXVsLmgKLW1yaS5vOiBtcmkuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAotICBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGxkLmggbGRleHAuaCBsZGxhbmcuaCBcCi0gIGxkbWlzYy5oIG1yaS5oIGxkZ3JhbS5oICQoSU5DRElSKS9saWJpYmVydHkuaAotbGRjcmVmLm86IGxkY3JlZi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBsZC5oIGxkbWFpbi5oIGxkbWlzYy5oIGxkZXhwLmggXAotICBsZGxhbmcuaAotcGUtZGxsLm86IHBlLWRsbC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBsZC5oIGxkZXhwLmggbGRsYW5nLmggbGR3cml0ZS5oIFwKLSAgbGRtaXNjLmggbGRncmFtLmggbGRtYWluLmggbGRlbXVsLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIC4uL2JmZC9saWJjb2ZmLmggZGVmZmlsZS5oCi1sZGdyYW0ubzogbGRncmFtLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZGV4cC5oIGxkdmVyLmggbGRsYW5nLmggbGRlbXVsLmggbGRmaWxlLmggbGRtaXNjLmggXAotICBsZG1haW4uaCBtcmkuaCBsZGN0b3IuaCBsZGxleC5oCi1sZGxleC5vOiBsZGxleC5jIC4uL2JmZC9iZmQuaCBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgbGQuaCBsZGdyYW0uaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZmlsZS5oIGxkbGV4LmggXAotICBsZG1haW4uaAotZGVmZmlsZXAubzogZGVmZmlsZXAuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAuLi9iZmQvYmZkLmggc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gIGxkLmggbGRtaXNjLmggZGVmZmlsZS5oCi0KLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9sZC9ORVdTIGIvbGQvTkVXUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyZTg0NS4uMDAwMDAwMAotLS0gYS9sZC9ORVdTCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS0qLSB0ZXh0IC0qLQotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi4xMDoKLQotKiBBZGRlZCBnYXJiYWdlIGNvbGxlY3Rpb24gb2YgdW51c2VkIHNlY3Rpb25zLCBlbmFibGVkIGJ5IC0tZ2Mtc2VjdGlvbnMuIAotICBJdCBkb2VzIHJlcXVpcmUgYSBiaXQgb2YgYmFja2VuZCBzdXBwb3J0OyBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXJlCi0gIHBwYy1lbGYsIG1pcHMtZWxmLCBhbmQgbW4xMDMwMC1lbGYuICBPdGhlcnMgd2lsbCBpZ25vcmUgdGhlIG9wdGlvbi4KLQotKiBBZGRlZCBTT1JUIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlIHRvIHBlcm1pdCBzb3J0aW5nIHNlY3Rpb25zIGJ5IGZpbGUKLSAgbmFtZSBvciBzZWN0aW9uIG5hbWUuCi0KLSogQWRkZWQgRVhURVJOIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlIGFzIGFuIGVxdWl2YWxlbnQgdG8gdGhlIC11Ci0gIGNvbW1hbmQtbGluZSBvcHRpb24uCi0KLSogQWRkZWQgQVNTRVJUIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi0qIEFkZGVkIC1PIG9wdGlvbiB0byBvcHRpbWl6ZSBsaW5rZXIgb3V0cHV0IChhcyBvZiB0aGlzIHdyaXRpbmcsIHRoaXMgb25seQotYWZmZWN0cyBFTEYgc2hhcmVkIGxpYnJhcnkgZ2VuZXJhdGlvbikuCi0KLSogVGhlIC1lIG9wdGlvbiBub3cgYWNjZXB0cyBhIG51bWJlciBhcyB3ZWxsIGFzIGEgc3ltYm9sIG5hbWUuCi0KLSogQWRkZWQgLS1kZW1hbmdsZSBhbmQgLS1uby1kZW1hbmdsZSBvcHRpb25zLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi45OgotCi0qIEFkZGVkIFNRVUFEIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi0qIE5ldyBvcHRpb24gLS1uby13YXJuLW1pc21hdGNoLgotCi0qIFRoZSBNRU1PUlkgY29tbWFuZCBub3cgcGFyc2VzIHRoZSBhdHRyaWJ1dGVzIHRvIGRldGVybWluZSB3aGVyZSBzZWN0aW9ucyB0aGF0Ci0gIGFyZSBub3QgcGxhY2VkIGluIGEgc3BlY2lmaWMgbWVtb3J5IHJlZ2lvbiBhcmUgcGxhY2VkLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi44OgotCi0qIExpbmtlciBzY3JpcHRzIG1heSBub3cgY29udGFpbiBzaGVsbCB3aWxkY2FyZCBjaGFyYWN0ZXJzIGZvciBmaWxlIGFuZCBzZWN0aW9uCi0gIG5hbWVzLgotCi0qIFRoZSBsaW5rZXIgbm93IHN1cHBvcnRzIHN5bWJvbCB2ZXJzaW9ucyBpbiBFTEYuCi0KLSogVGhlIE5PQ1JPU1NSRUZTIGNvbW1hbmQgd2FzIGFkZGVkIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi0qIFRoZSBMT0FEQUREUiBleHByZXNzaW9uIHdhcyBhZGRlZCB0byB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZS4KLQotKiBNQVggYW5kIE1JTiBmdW5jdGlvbnMgd2VyZSBhZGRlZCB0byB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZS4KLQotKiBUaGUgT1ZFUkxBWSBjb25zdHJ1Y3Qgd2FzIGFkZGVkIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi0qIE5ldyBvcHRpb24gLS13YXJuLXNlY3Rpb24tYWxpZ24gdG8gd2FybiB3aGVuIHRoZSBhZGRyZXNzIG9mIGFuIG91dHB1dCBzZWN0aW9uCi0gIGNoYW5nZXMgZHVlIHRvIGFsaWdubWVudCBvZiBhbiBpbnB1dCBzZWN0aW9uLgotCi0qIE5ldyBvcHRpb25zIC0tZmlsdGVyLy1GIGFuZCAtLWF1eGlsaWFyeS8tZi4KLQotQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuNzoKLQotKiBOZXcgb3B0aW9uIC0tY3JlZiB0byBwcmludCBvdXQgYSBjcm9zcyByZWZlcmVuY2UgdGFibGUuCi0KLSogTmV3IG9wdGlvbiAtLXdyYXAgU1lNQk9MLgotCi0qIE5ldyBvcHRpb24gLS1uby13aG9sZS1hcmNoaXZlLCB0byB0dXJuIG9mZiB0aGUgZWZmZWN0IG9mIC0td2hvbGUtYXJjaGl2ZS4KLQotKiBJbnB1dCBzZWN0aW9ucyBhc3NpZ25lZCB0byB0aGUgb3V0cHV0IHNlY3Rpb24gL0RJU0NBUkQvIGluIHRoZSBsaW5rZXIgc2NyaXB0Ci0gIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLgotCi0qIFRoZSBTdW5PUyBhbmQgRUxGIGxpbmtlcnMgbm93IG1lcmdlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB3aGljaCB1c2VzCi0gIHRoZSBOX0JJTkNMIGFuZCBOX0VJTkNMIHN0YWIgdHlwZXMuICBUaGlzIHJlZHVjZXMgdGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcKLSAgaW5mb3JtYXRpb24gZ2VuZXJhdGVkLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi42OgotCi0qIFdoZW4gYW4gRUxGIHNlY3Rpb24gbmFtZSBpcyByZXByZXNlbnRhYmxlIGFzIGEgQyBpZGVudGlmaWVyICh0aGlzIGlzIG5vdCB0cnVlCi1vZiBtb3N0IEVMRiBzZWN0aW9uIG5hbWVzKSwgdGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGVmaW5lIHN5bWJvbHMKLV9fc3RhcnRfU0VDTkFNRSBhbmQgX19zdG9wX1NFQ05BTUUsIHdoZXJlIFNFQ05BTUUgaXMgdGhlIHNlY3Rpb24gbmFtZSwgYXQgdGhlCi1iZWdpbm5pbmcgYW5kIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgZ2xpYmMuCi0KLSogV2hlbiBhbiBFTEYgc2VjdGlvbiBuYW1lZCAuZ251Lndhcm5pbmcgaXMgZW5jb3VudGVyZWQgaW4gYW4gaW5wdXQgZmlsZSwgdGhlCi1jb250ZW50cyBvZiB0aGUgc2VjdGlvbiBhcmUgZGlzcGxheWVkIGFzIGFuIGVycm9yIG1lc3NhZ2UsIGFuZCB0aGUgc2VjdGlvbiBpcwotbm90IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgdXNlZCBieSBnbGliYy4KLQotKiBXaGVuIGFuIEVMRiBzZWN0aW9uIG5hbWVkIC5nbnUud2FybmluZy5TWU1CT0wgaXMgZW5jb3VudGVyZWQgaW4gYW4gaW5wdXQKLWZpbGUsIGFuZCB0aGUgc3ltYm9sIFNZTUJPTCBpcyByZWZlcmVuY2VkIGJ5IHNvbWUgb2JqZWN0IGZpbGUsIHRoZSBjb250ZW50cyBvZgotdGhlIHNlY3Rpb24gYXJlIGRpc3BsYXllZCBhcyBhbiBlcnJvciBtZXNzYWdlLiAgVGhlIHNlY3Rpb24gaXMgbm90IGNvcGllZCBpbnRvCi10aGUgb3V0cHV0IGZpbGUsIHVubGVzcyBkb2luZyBhIHJlbG9jYXRlYWJsZSBvciBzaGFyZWQgbGluay4gIFRoaXMgaXMgdXNlZCBieQotZ2xpYmMuCi0KLSogTmV3IG9wdGlvbnMgLXNwbGl0LWJ5LXJlbG9jIGFuZCAtc3BsaXQtYnktZmlsZS4KLQotKiBUaGUgbGlua2VyIG5vdyBzdXBwb3J0cyBsaW5raW5nIFBJQyBjb21waWxlZCBjb2RlIG9uIFNQQVJDIFN1bk9TLiAgSXQgY2FuCi1hbHNvIGNyZWF0ZSBTUEFSQyBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLCBhbmQsIGxpa2UgdGhlIG5hdGl2ZSBTdW5PUyBsaW5rZXIsCi13aWxsIGRvIHNvIHdoZW5ldmVyIHRoZXJlIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wgaW4gdGhlIGxpbmsgYW5kIG5laXRoZXIgdGhlIC1lCi1ub3IgdGhlIC1yIG9wdGlvbiB3YXMgdXNlZC4KLQotKiBUaGUgLXJwYXRoIG9wdGlvbiBtYXkgYmUgdXNlZCBvbiBTdW5PUyB0byBzZXQgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gYmUKLXNlYXJjaGVkIGF0IHJ1biB0aW1lLiAgVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgb2YgYnVpbGRpbmcgdGhlIGxpc3QgZnJvbSB0aGUKLS1MIG9wdGlvbnMuCi0KLSogVGhlIENPRkYgbGlua2VyIG5vdyBjb21iaW5lcyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIHN0cnVjdHMsIHVuaW9ucywgYW5kCi1lbnVtcywgc28gdGhhdCBldmVuIGlmIHRoZSBzYW1lIHR5cGUgaXMgZGVmaW5lZCBpbiBtdWx0aXBsZSBpbnB1dCBmaWxlcyBpdCB3aWxsCi1vbmx5IGJlIGRlZmluZWQgb25jZSBpbiB0aGUgb3V0cHV0IGZpbGUuICBUaGUgLS10cmFkaXRpb25hbC1mb3JtYXQgc3dpdGNoIHdpbGwKLXByZXZlbnQgdGhpcyBvcHRpbWl6YXRpb24uCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjU6Ci0KLSogVGhlIGxpbmtlciBub3cgc3VwcG9ydHMgbGlua2luZyBhZ2FpbnN0IFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMuICBJdCBzdGlsbCBjYW4KLW5vdCBsaW5rIFN1bk9TIFBJQyAoUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSkgZmlsZXMsIHNvIGl0IGNhbiBub3QgYmUgdXNlZCB0bwotZ2VuZXJhdGUgc2hhcmVkIGxpYmFyaWVzLgotCi0qIFRoZSBsaW5rZXIgbm93IHN1cHBvcnRzIGxpbmtpbmcgYWdhaW5zdCBFTEYgc2hhcmVkIGxpYnJhcmllcyBmb3IgdGhlIGkzODYKLShVbml4V2FyZSkgYW5kIFNQQVJDIChTb2xhcmlzKS4gIEl0IGNhbiBhbHNvIGxpbmsgRUxGIFBJQyBmaWxlcywgYW5kIGNhbiBiZQotdXNlZCB0byBnZW5lcmF0ZSBzaGFyZWQgbGlicmFyaWVzLiAgU2hhcmVkIGxpYnJhcnkgZ2VuZXJhdGlvbiBpcyBub3Qgd2VsbAotdGVzdGVkOyBwbGVhc2UgcmVwb3J0IGFueSBwcm9ibGVtcyBlbmNvdW50ZXJlZC4gIFRoZSBsaW5rZXIgaXMgbm93IGVuYWJsZWQgZm9yCi1Tb2xhcmlzIGFnYWluLgotCi0qIEVyaWMgWW91bmdkYWxlIGhhcyBjb250cmlidXRlZCBMaW51eCBzdXBwb3J0IGNvZGUsIGluY2x1ZGluZyBsaW5raW5nIGFnYWluc3QKLUxpbnV4IGEub3V0IHNoYXJlZCBsaWJyYXJpZXMuICBUaGUgbGlua2VyIHByb2R1Y2VzIExpbnV4IFFNQUdJQyBiaW5hcmllcy4KLQotKiBUaGUgRUxGIGJhY2tlbmQgaGFzIGJlZW4gY29udmVydGVkIHRvIHRoZSBuZXcgbGlua2VyIGNvZGUuICBUbyB1c2UgdGhlIG5ldwotRUxGIGxpbmtlciwgZWFjaCBwYXJ0aWN1bGFyIHRhcmdldCByZXF1aXJlcyBhIHJlbG9jYXRpb24gZnVuY3Rpb24uICBTbyBmYXIsCi10aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIGkzODYgKFVuaXhXYXJlKSwgU1BBUkMgKFNvbGFyaXMpIE1JUFMgKElyaXgKLTUpLCBhbmQgSFBQQSBFTEYgdGFyZ2V0cy4KLQotKiBUaGUgLSggKC0tc3RhcnQtZ3JvdXApIGFuZCAtKSAoLS1lbmQtZ3JvdXApIG9wdGlvbnMgaGF2ZSBiZWVuIGFkZGVkIHRvCi1zdXBwb3J0IHNlYXJjaGluZyBhIGdyb3VwIG9mIGFyY2hpdmVzIGFzIHRob3VnaCB0aGV5IHdlcmUgYSBzaW5nbGUgYXJjaGl2ZS4KLVRoaXMgY2FuIGFsc28gYmUgdXNlZCBpbiBhIGxpbmtlciBzY3JpcHQsIGFzIEdST1VQICggZmlsZXMgKS4KLQotKiBXaGVuIGEgZmlsZSBpcyBuYW1lZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgdGhlIGxpbmtlciBkb2VzIG5vdCByZWNvZ25pemUKLWl0IGFzIGFuIG9iamVjdCBmaWxlLCB0aGUgbGlua2VyIHdpbGwgbm93IHRyZWF0IHRoZSBmaWxlIGFzIGEgbGlua2VyIHNjcmlwdAotZmlsZS4gIEEgbGlua2VyIHNjcmlwdCBuYW1lZCBpbiB0aGlzIHdheSBhdWdtZW50cywgYnV0IGRvZXMgbm90IHJlcGxhY2UsIHRoZQotZGVmYXVsdCBsaW5rZXIgc2NyaXB0LgotCi0qIFRoZSAtd2Fybi1vbmNlIG9wdGlvbiB3YXMgYWRkZWQuICBJdCBjYXVzZXMgdGhlIGxpbmtlciB0byBvbmx5IHdhcm4gb25jZSBwZXIKLXVuZGVmaW5lZCBzeW1ib2wsIHJhdGhlciB0aGFuIG9uY2UgcGVyIHJlZmVyZW5jZS4KLQotKiBUaGUgQ09GRiBiYWNrZW5kIGhhcyBiZWVuIGNvbnZlcnRlZCB0byB0aGUgbmV3IGxpbmtlciBjb2RlLiAgQXMgd2l0aCBFTEYsIHRvCi11c2UgdGhlIG5ldyBsaW5rZXIsIGVhY2ggcGFydGljdWxhciB0YXJnZXQgcmVxdWlyZXMgYSByZWxvY2F0aW9uIGZ1bmN0aW9uLiAgU28KLWZhciwgdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiB3cml0dGVuIGZvciB0aGUgaTM4NiwgbTY4aywgYTI5ayBhbmQgU0ggdGFyZ2V0cy4KLQotKiBUaGUgLVYgZmxhZyB3YXMgbWFkZSBhIHN5bm9ueW0gZm9yIC12LCBmb3IgU1ZSNCBjb21wYXRpYmlsaXR5LiAgVGhlIG9sZCAtVgotYmVoYXZpb3VyIGlzIGF2YWlsYWJsZSB2aWEgLS12ZXJib3NlLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi40OgotCi0qIE5ldyBsaW5rZXIgY29kZSwgYnkgU3RldmUgQ2hhbWJlcmxhaW4gYW5kIElhbiBUYXlsb3IuICBGb3IgYS5vdXQgYW5kIGVjb2ZmCi0gIGZvcm1hdHMgKHNvIGZhciksIHRoaXMgc2hvdWxkIHJlc3VsdCBpbiBjb25zaWRlcmFibGUgc2F2aW5ncyBpbiB0aW1lCi0gIGFuZCBtZW1vcnkgdXNlZCB3aGlsZSBsaW5raW5nOyBzbGlnaHRseSBwb29yZXIgcGVyZm9ybWFuY2UgdGhhbgotICBiZWZvcmUgZm9yIGZvcm1hdHMgbm90IGNvbnZlcnRlZCB5ZXQuCi0KLSogQ29tbWFuZC1saW5lIHBhcnNpbmcgaXMgbm8gbG9uZ2VyIGRvbmUgd2l0aCBmbGV4LiAgVGhpcyBtZWFucwotICBvZGRiYWxsIGNoYXJhY3RlcnMgaW4gZmlsZW5hbWVzIHdvbid0IGdldCB0cmVhdGVkIGFzIGFyZ3VtZW50Ci0gIHNlcGFyYXRvcnMuCi0KLSogSFAtUEEgRUxGIHN1cHBvcnQsIGJ5IEplZmYgTGF3LiAgKE5vIFNPTSBzdXBwb3J0IHlldC4pCi0KLSogTWFjaCBpMzg2IHN1cHBvcnQsIGJ5IERhdmlkIE1hY2tlbnppZS4KLQotKiBJcml4IDQgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm93IHN1cHBvcnRlZCAoSXJpeCA1IHVzZXMgRUxGLCBhbmQgRUxGIHNoYXJlZAotICBsaWJyYXJpZXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkKS4KLQotKiBDT0ZGIHNoYXJlZCBsaWJyYXJpZXMgKGFzIG9uIFNDTykgc2hvdWxkIHdvcmsgYXMgd2VsbC4KLQotKiBUaGUgbGlua2VyIGlzIGRpc2FibGVkIGZvciBTb2xhcmlzLiAgKEFjdHVhbGx5LCBpdCB3YXMgaW4gMi4zIGFsc28sIEkganVzdAotICBmb3Jnb3QgdG8gbm90ZSBpdC4pICBTb21lIG9mIHRoZWlyIEMgbGlicmFyeSByb3V0aW5lcyBkb24ndCB3b3JrIHdoZW4KLSAgc3RhdGljYWxseSBsaW5rZWQsIGFuZCB0aGUgR05VIGxpbmtlciBkb2Vzbid0IHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHlldC4KLQotQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuMzoKLQotKiBXZWFrIHN5bWJvbHMgYXJlIG5vdyBzdXBwb3J0ZWQuCi0KLSogRUxGIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuICBUaGUgbGlua2VyIGhhcyBiZWVuIGJvb3RzdHJhcHBlZCBvbgotICBVbml4V2FyZSBhbmQgU29sYXJpcy4KLQotKiBBbHBoYSBPU0YvMSBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkIChub24gZHluYW1pYyBsaW5raW5nIG9ubHkpLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi4yOgotCi0qIFRoZSBgYmZkJyBsaWJyYXJ5IGhhcyBiZWVuIHVwZGF0ZWQgdG8gcmVkdWNlIGEub3V0LWZvcm1hdCBzdHJpbmcKLSAgdGFibGUgc2l6ZS4gIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IGZpbGVzIGxpbmtlZCBmcm9tIG1hbnkgaW5wdXQKLSAgZmlsZXMgd2l0aCBkdXBsaWNhdGUgc3ltYm9scyAoYC1nJyBkZWJ1Z2dpbmcgcmVjb3Jkcywgb3IgaWRlbnRpY2FsCi0gIHN0YXRpYyBzeW1ib2xzKSBzaG91bGQgYmUgbXVjaCBzbWFsbGVyLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi4xOgotCi0qIFRoZSBsZCAteVNZTUJPTCBmbGFnICh0byB0cmFjZSByZWZlcmVuY2VzIHRvIFNZTUJPTCkgaXMgbm93IGltcGxlbWVudGVkLgotCi0qIFRoZXJlIGlzIG5vdyBzdXBwb3J0IGZvciB3cml0aW5nIEVDT0ZGIGZpbGVzLCBzbyBsZCBhbmQgdGhlCi0gIG90aGVyIHV0aWxpdGllcyBzaG91bGQgd29yayBvbiBSaXNjL1VsdHJpeCBhbmQgSXJpeC4KLQotDAotTG9jYWwgdmFyaWFibGVzOgotZmlsbC1jb2x1bW46IDc5Ci1FbmQ6CmRpZmYgLS1naXQgYS9sZC9SRUFETUUgYi9sZC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NDdkMDQuLjAwMDAwMDAKLS0tIGEvbGQvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotVGhpcyBpcyB0aGUgR05VIGxpbmtlci4gIEl0IGlzIGRpc3RyaWJ1dGVkIHdpdGggb3RoZXIgImJpbmFyeQotdXRpbGl0aWVzIiB3aGljaCBzaG91bGQgYmUgaW4gLi4vYmludXRpbHMuICBTZWUgLi4vYmludXRpbHMvUkVBRE1FIGZvcgotbW9yZSBnZW5lcmFsIG5vdGVzLCBpbmNsdWRpbmcgd2hlcmUgdG8gc2VuZCBidWcgcmVwb3J0cy4KLQotVGhlcmUgYXJlIG1hbnkgZmVhdHVyZXMgb2YgdGhlIGxpbmtlcjoKLQotKiBUaGUgbGlua2VyIHVzZXMgYSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkgKC4uL2JmZCkKLSAgdGhhdCBpdCB1c2VzIHRvIHJlYWQgYW5kIHdyaXRlIG9iamVjdCBmaWxlcy4gIFRoaXMgaGVscHMKLSAgaW5zdWxhdGUgdGhlIGxpbmtlciBpdHNlbGYgZnJvbSB0aGUgZm9ybWF0IG9mIG9iamVjdCBmaWxlcy4KLQotKiBUaGUgbGlua2VyIHN1cHBvcnRzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBvYmplY3QgZmlsZQotICBmb3JtYXRzLiAgSXQgY2FuIGV2ZW4gaGFuZGxlIG11bHRpcGxlIGZvcm1hdHMgYXQgb25jZToKLSAgUmVhZCB0d28gaW5wdXQgZm9ybWF0cyBhbmQgd3JpdGUgYSB0aGlyZC4KLQotKiBUaGUgbGlua2VyIGNhbiBiZSBjb25maWd1cmVkIGZvciBjcm9zcy1saW5raW5nLgotCi0qIFRoZSBsaW5rZXIgc3VwcG9ydHMgYSBjb250cm9sIGxhbmd1YWdlLgotCi0qIFRoZXJlIGlzIGEgdXNlciBtYW51YWwgKGxkLnRleGluZm8pLCBhcyB3ZWxsIGFzIHRoZQotICBiZWdpbm5pbmdzIG9mIGFuIGludGVybmFscyBtYW51YWwgKGxkaW50LnRleGluZm8pLgotCi1JbnN0YWxsYXRpb24KLT09PT09PT09PT09PQotCi1TZWUgLi4vYmludXRpbHMvUkVBRE1FLgotCi1JZiB5b3Ugd2FudCB0byBtYWtlIGEgY3Jvc3MtbGlua2VyLCB5b3UgbWF5IHdhbnQgdG8gc3BlY2lmeQotYSBkaWZmZXJlbnQgc2VhcmNoIHBhdGggb2YgLWxmb28gbGlicmFyaWVzIHRoYW4gdGhlIGRlZmF1bHQuCi1Zb3UgY2FuIGRvIHRoaXMgYnkgc2V0dGluZyB0aGUgTElCX1BBVEggdmFyaWFibGUgaW4gLi9NYWtlZmlsZS4KLQotVG8gYnVpbGQganVzdCB0aGUgbGlua2VyLCBtYWtlIHRoZSB0YXJnZXQgYWxsLWxkIGZyb20gdGhlIHRvcCBsZXZlbAotZGlyZWN0b3J5IChvbmUgZGlyZWN0b3J5IGFib3ZlIHRoaXMgb25lKS4KLQotUG9ydGluZyB0byBhIG5ldyB0YXJnZXQKLT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVNlZSB0aGUgbGRpbnQudGV4aW5mbyBtYW51YWwuCi0KLVJlcG9ydGluZyBidWdzIGV0YwotPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVNlZSAuLi9iaW51dGlscy9SRUFETUUuCi0KLUtub3duIHByb2JsZW1zCi09PT09PT09PT09PT09PQotCi1UaGUgU29sYXJpcyBsaW5rZXIgbm9ybWFsbHkgZXhwb3J0cyBhbGwgZHluYW1pYyBzeW1ib2xzIGZyb20gYW4KLWV4ZWN1dGFibGUuICBUaGUgR05VIGxpbmtlciBkb2VzIG5vdCBkbyB0aGlzIGJ5IGRlZmF1bHQuICBUaGlzIGlzCi1iZWNhdXNlIHRoZSBHTlUgbGlua2VyIHRyaWVzIHRvIHByZXNlbnQgdGhlIHNhbWUgaW50ZXJmYWNlIGZvciBhbGwKLXNpbWlsYXIgdGFyZ2V0cyAoaW4gdGhpcyBjYXNlLCBhbGwgbmF0aXZlIEVMRiB0YXJnZXRzKS4gIFRoaXMgZG9lcyBub3QKLW1hdHRlciBmb3Igbm9ybWFsIHByb2dyYW1zLCBidXQgaXQgY2FuIG1ha2UgYSBkaWZmZXJlbmNlIGZvciBwcm9ncmFtcwotd2hpY2ggdHJ5IHRvIGRsb3BlbiBhbiBleGVjdXRhYmxlLCBzdWNoIGFzIFBFUkwgb3IgVGNsLiAgWW91IGNhbiBtYWtlCi10aGUgR05VIGxpbmtlciBleHBvcnQgYWxsIGR5bmFtaWMgc3ltYm9scyB3aXRoIHRoZSAtRSBvcgotLS1leHBvcnQtZHluYW1pYyBjb21tYW5kIGxpbmUgb3B0aW9uLgotCi1IUC9VWCA5LjAxIGhhcyBhIHNoZWxsIGJ1ZyB0aGF0IGNhdXNlcyB0aGUgbGlua2VyIHNjcmlwdHMgdG8gYmUKLWdlbmVyYXRlZCBpbmNvcnJlY3RseS4gIFRoZSBzeW1wdG9tIG9mIHRoaXMgYXBwZWFycyB0byBiZSAiZmF0YWwgZXJyb3IKLS0gc2Nhbm5lciBpbnB1dCBidWZmZXIgb3ZlcmZsb3ciIGVycm9yIG1lc3NhZ2VzLiAgVGhlcmUgYXJlIHZhcmlvdXMKLXdvcmthcm91bmRzIHRvIHRoaXM6Ci0gICogQnVpbGQgYW5kIGluc3RhbGwgYmFzaCwgYW5kIGJ1aWxkIHdpdGggIm1ha2UgU0hFTEw9YmFzaCIuCi0gICogVXBkYXRlIHRvIGEgdmVyc2lvbiBvZiBIUC9VWCB3aXRoIGEgd29ya2luZyBzaGVsbCAoZS5nLiwgOS4wNSkuCi0gICogUmVwbGFjZSAiKC4gJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNjKSIgaW4KLSAgICBnZW5zY3JpcHRzLnNoIHdpdGggInNoICR7c3JjZGlyfS4uLiIgKG5vIHBhcmVucykgYW5kIG1ha2Ugc3VyZSB0aGUKLSAgICBlbXVscGFyYW1zIHNjcmlwdCB1c2VkIGV4cG9ydHMgYW55IHNoZWxsIHZhcmlhYmxlcyBpdCBzZXRzLgpkaWZmIC0tZ2l0IGEvbGQvVE9ETyBiL2xkL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxY2Q5OGIuLjAwMDAwMDAKLS0tIGEvbGQvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotVm9sdW50ZWVycyB0byB0YWNrbGUgc29tZSBvZiB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHdlbGNvbWU6Ci0KLVN1cHBvcnQgdGhlICJ0cmFkaXRpb25hbCIgQlNEICAtQSBmbGFnIChpbmNyZW1lbnRhbCBsb2FkaW5nKS4KLShUaGVyZSBpcyBhIC1BIGZsYWcgaW4gbGQgbm93LCBidXQgaXQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQotYXJjaGl0ZWN0dXJlLiAgVGhhdCBzaG91bGQgcHJvYmFibHkgYmUgY2hhbmdlZC4pCi0KLVN1cHBvcnQgZm9yIGR5bmFtaWMgbG9hZGluZyAoYSBsYSBkbGQsIGJ1dCBiZmQtYmFzZWQpIHdvdWxkIGJlIG5pY2UuCi0KLUF2b2lkIHJlLW9wZW4gKGFuZCByZS1zZWVraW5nKSBvdXRwdXQgYmZkIGFuZCBhcmNoaXZlcy4KZGlmZiAtLWdpdCBhL2xkL2FjaW5jbHVkZS5tNCBiL2xkL2FjaW5jbHVkZS5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiMDliOS4uMDAwMDAwMAotLS0gYS9sZC9hY2luY2x1ZGUubTQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQpkaWZmIC0tZ2l0IGEvbGQvYWNsb2NhbC5tNCBiL2xkL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOTM0YjAuLjAwMDAwMDAKLS0tIGEvbGQvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDExMjAgKzAsMCBAQAotZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjQKLQotZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLWRubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWRubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLWRubCBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLXNpbmNsdWRlKC4uL2JmZC9hY2luY2x1ZGUubTQpCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCAtLQotIyBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuCi0jIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIHNlcmlhbCAxCi0KLWRubCBVc2FnZToKLWRubCBBTV9JTklUX0FVVE9NQUtFKHBhY2thZ2UsdmVyc2lvbiwgW25vLWRlZmluZV0pCi0KLUFDX0RFRlVOKEFNX0lOSVRfQVVUT01BS0UsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKLVBBQ0tBR0U9WyQxXQotQUNfU1VCU1QoUEFDS0FHRSkKLVZFUlNJT049WyQyXQotQUNfU1VCU1QoVkVSU0lPTikKLWRubCB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLWZpCi1pZmVsc2UoWyQzXSwsCi1BQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKSkKLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCi1kbmwgRklYTUUgVGhpcyBpcyB0cnVseSBncm9zcy4KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8sICRtaXNzaW5nX2RpcikKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCi0jCi0KLUFDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIlskXSoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICJbJF0qIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIlskXSoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKLSAgIGZpCi0KLSAgIHRlc3QgIlskXTIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUFDX01TR19SRVNVTFQoeWVzKV0pCi0KLWRubCBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSwgRElSRUNUT1JZKQotZG5sIFRoZSBwcm9ncmFtIG11c3QgcHJvcGVybHkgaW1wbGVtZW50IC0tdmVyc2lvbi4KLUFDX0RFRlVOKEFNX01JU1NJTkdfUFJPRywKLVtBQ19NU0dfQ0hFQ0tJTkcoZm9yIHdvcmtpbmcgJDIpCi0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoJDIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAkMT0kMgotICAgQUNfTVNHX1JFU1VMVChmb3VuZCkKLWVsc2UKLSAgICQxPSIkMy9taXNzaW5nICQyIgotICAgQUNfTVNHX1JFU1VMVChtaXNzaW5nKQotZmkKLUFDX1NVQlNUKCQxKV0pCi0KLQotIyBzZXJpYWwgMzUgQUNfUFJPR19MSUJUT09MCi1BQ19ERUZVTihBQ19QUk9HX0xJQlRPT0wsCi1bQUNfUkVRVUlSRShbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotQUNfQ0FDSEVfU0FWRQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIExOX1M9IiRMTl9TIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRob3N0IFwKLXx8IEFDX01TR19FUlJPUihbbGlidG9vbCBjb25maWd1cmUgZmFpbGVkXSkKLQotIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZwotQUNfQ0FDSEVfTE9BRAotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotQUNfU1VCU1QoTElCVE9PTClkbmwKLQotIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKLSMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotXSkKLQotQUNfREVGVU4oQUNfTElCVE9PTF9TRVRVUCwKLVtBQ19QUkVSRVEoMi4xMylkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TSEFSRURdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NUQVRJQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfTk1fUEFSU0VdKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCi1kbmwKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRsdF9kbG9wZW4iID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZW5hYmxlLWRsb3BlbiIKLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGhvc3QiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ1sjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAotICAgIFtBQ19UUllfTElOSyhbXSxbXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSldKQotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi0qLSotY3lnd2luKikKLSAgQUNfU1lTX0xJQlRPT0xfQ1lHV0lOCi0gIDs7Ci0KLWVzYWMKLQotIyBlbmFibGUgdGhlIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgc3dpdGNoCi0KLUFDX0FSR19FTkFCTEUobGlidG9vbC1sb2NrLAotWyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgZm9yY2UgbGlidG9vbCBub3QgdG8gZG8gZmlsZSBsb2NraW5nXSwKLW5lZWRfbG9ja3M9JGVuYWJsZXZhbCwKLW5lZWRfbG9ja3M9eWVzKQotCi1pZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCi0gIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotZmkKLV0pCi0KLSMgQUNfTElCVE9PTF9ETE9QRU4gLSBjaGVjayBmb3IgZGxvcGVuIHN1cHBvcnQKLUFDX0RFRlVOKEFDX0xJQlRPT0xfRExPUEVOLCBbbHRfZGxvcGVuPXllc10pCi0KLSMgQUNfRU5BQkxFX1NIQVJFRCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc2hhcmVkIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9TSEFSRURbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX1NIQVJFRCwKLVtkZWZpbmUoW0FDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzaGFyZWQsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zaGFyZWQ9QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NIQVJFRCAtIHNldCB0aGUgZGVmYXVsdCBzaGFyZWQgZmxhZyB0byAtLWRpc2FibGUtc2hhcmVkCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NIQVJFRCwKLVtBQ19FTkFCTEVfU0hBUkVEKG5vKV0pCi0KLSMgQUNfRU5BQkxFX1NUQVRJQyAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc3RhdGljIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9TVEFUSUNbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX1NUQVRJQywKLVtkZWZpbmUoW0FDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzdGF0aWMsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc3RhdGljPXllcyA7Owotbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSopCi0gIGVuYWJsZV9zdGF0aWM9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc3RhdGljPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zdGF0aWM9QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NUQVRJQyAtIHNldCB0aGUgZGVmYXVsdCBzdGF0aWMgZmxhZyB0byAtLWRpc2FibGUtc3RhdGljCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NUQVRJQywKLVtBQ19FTkFCTEVfU1RBVElDKG5vKV0pCi0KLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfRkFTVF9JTlNUQUxMLAotW2RlZmluZShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKGZhc3QtaW5zdGFsbCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfZmFzdF9pbnN0YWxsPUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIHNldCB0aGUgZGVmYXVsdCB0byAtLWRpc2FibGUtZmFzdC1pbnN0YWxsCi1BQ19ERUZVTihBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTCwKLVtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMKG5vKV0pCi0KLQotIyBBQ19QUk9HX0xEIC0gZmluZCB0aGUgcGF0aCB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCi1BQ19ERUZVTihBQ19QUk9HX0xELAotW0FDX0FSR19XSVRIKGdudS1sZCwKLVsgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub11dLAotdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzLCB3aXRoX2dudV9sZD1ubykKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgR0NDXSkKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLWNoYW5nZXF1b3RlKCwpZG5sCi0gICAgLyogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKLWVsc2UKLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCi1maQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTEQsCi1baWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpXSkKLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVCgkTEQpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotdGVzdCAteiAiJExEIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIXSkKLUFDX1NVQlNUKExEKQotQUNfUFJPR19MRF9HTlUKLV0pCi0KLUFDX0RFRlVOKEFDX1BST0dfTERfR05VLAotW0FDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGFjX2N2X3Byb2dfZ251X2xkLAotWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmldKQotXSkKLQotIyBBQ19QUk9HX05NIC0gZmluZCB0aGUgcGF0aCB0byBhIEJTRC1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCi1BQ19ERUZVTihBQ19QUk9HX05NLAotW0FDX01TR19DSEVDS0lORyhbZm9yIEJTRC1jb21wYXRpYmxlIG5tXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX05NLAotW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmldKQotTk09IiRhY19jdl9wYXRoX05NIgotQUNfTVNHX1JFU1VMVChbJE5NXSkKLUFDX1NVQlNUKE5NKQotXSkKLQotIyBBQ19TWVNfTk1fUEFSU0UgLSBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQKLSMgYnkgQyBzeW1ib2wgbmFtZSBmcm9tIG5tLgotQUNfREVGVU4oQUNfU1lTX05NX1BBUlNFLAotW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLUFDX01TR19DSEVDS0lORyhbY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0XSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlLAotWyMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyB7VGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KX0KLQotY2hhbmdlcXVvdGUoLClkbmwKLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsgCV1cKCRhY19zeW1jb2RlXClbIAldWyAJXSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBhY19ubGlzdD1jb25mdGVzdC5ubQotICAKLSAgICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotY2hhbmdlcXVvdGUoLClkbmwKLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQotY2hhbmdlcXVvdGUoWyxdKWRubAotewotRU9GCi0Jc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jCi0JY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdG0uJGFjX29iamV4dAotCSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRlc3RtLiRhY19vYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLQkgICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotCSAgZmkKLQkgIExJQlM9IiRhY19zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBQ19GRF9DQwotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLSAgICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRhY19waXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGlmIHRlc3QgeCIkYWNfc3ltcHJmeCIgPSB4Il8iOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi0gICAgZmkKLSAgICBicmVhawotICBlbHNlCi0gICAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLV0pCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotQUNfTVNHX1JFU1VMVCgkYWNfcmVzdWx0KQotXSkKLQotIyBBQ19TWVNfTElCVE9PTF9DWUdXSU4gLSBmaW5kIHRvb2xzIG5lZWRlZCBvbiBjeWd3aW4KLUFDX0RFRlVOKEFDX1NZU19MSUJUT09MX0NZR1dJTiwKLVtBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQotQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQotXSkKLQotIyBBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkUgLSBkb2VzIHRoZSBjb21waWxlciBwcmVmaXggZ2xvYmFsIHN5bWJvbHMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhbiB1bmRlcnNjb3JlPwotQUNfREVGVU4oQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKLUFDX01TR19DSEVDS0lORyhbZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHNdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSwKLVthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBQ19GRF9DQwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLSAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotZmkKLXJtIC1yZiBjb25mdGVzdCoKLV0pCi1BQ19NU0dfUkVTVUxUKCRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUpCi1VU0VfU1lNQk9MX1VOREVSU0NPUkU9JHthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm99Ci1BQ19TVUJTVChVU0VfU1lNQk9MX1VOREVSU0NPUkUpZG5sCi1dKQotCi0jIEFDX0NIRUNLX0xJQk0gLSBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5Ci1BQ19ERUZVTihBQ19DSEVDS19MSUJNLCBbCi1BQ19DSEVDS19MSUIobXcsIF9td3ZhbGlkY2hlY2tsKQotQUNfQ0hFQ0tfTElCKG0sIGNvcykKLV0pCi0KLSMgQUNfTElCTFRETF9DT05WRU5JRU5DRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGNvbnZlbmllbmNlIGxpYnJhcnksIGFkZHMgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSB0bwotIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKLSMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAotIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAotIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90Ci0jIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcwotIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgotQUNfREVGVU4oQUNfTElCTFRETF9DT05WRU5JRU5DRSwgWwotICBjYXNlICIkZW5hYmxlX2x0ZGxfY29udmVuaWVuY2UiIGluCi0gIG5vKSBBQ19NU0dfRVJST1IoW3RoaXMgcGFja2FnZSBuZWVkcyBhIGNvbnZlbmllbmNlIGxpYmx0ZGxdKSA7OwotICAiIikgZW5hYmxlX2x0ZGxfY29udmVuaWVuY2U9eWVzCi0gICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UiIDs7Ci0gIGVzYWMKLSAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGxjLmxhCi1dKQotCi0jIEFDX0xJQkxURExfSU5TVEFMTEFCTEVbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBpbnN0YWxsYWJsZSBsaWJyYXJ5LCBhbmQgYWRkcyAtLWVuYWJsZS1sdGRsLWluc3RhbGwgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLSMgSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYWNybyBtYXkgaGF2ZSB0byBiZSBjYWxsZWQgYWZ0ZXIgQUNfUFJPR19MSUJUT09MLgotQUNfREVGVU4oQUNfTElCTFRETF9JTlNUQUxMQUJMRSwgWwotICBBQ19DSEVDS19MSUIobHRkbCwgbWFpbiwgTElCTFRETD0iLWxsdGRsIiwgWwotICAgIGNhc2UgIiRlbmFibGVfbHRkbF9pbnN0YWxsIiBpbgotICAgIG5vKSBBQ19NU0dfV0FSTihbbGlibHRkbCBub3QgaW5zdGFsbGVkLCBidXQgaW5zdGFsbGF0aW9uIGRpc2FibGVkXSkgOzsKLSAgICAiIikgZW5hYmxlX2x0ZGxfaW5zdGFsbD15ZXMKLSAgICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWluc3RhbGwiIDs7Ci0gICAgZXNhYwotICBdKQotICBpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiICE9IHgibm8iOyB0aGVuCi0gICAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGwubGEKLSAgZmkKLV0pCi0KLWRubCBvbGQgbmFtZXMKLUFDX0RFRlVOKEFNX1BST0dfTElCVE9PTCwgW2luZGlyKFtBQ19QUk9HX0xJQlRPT0xdKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0VOQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NUQVRJQywgW2luZGlyKFtBQ19FTkFCTEVfU1RBVElDXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0RJU0FCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0RJU0FCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0RJU0FCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0RJU0FCTEVfU1RBVElDXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX1BST0dfTEQsIFtpbmRpcihbQUNfUFJPR19MRF0pXSlkbmwKLUFDX0RFRlVOKEFNX1BST0dfTk0sIFtpbmRpcihbQUNfUFJPR19OTV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19OTV9QQVJTRSwgW2luZGlyKFtBQ19TWVNfTk1fUEFSU0VdKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfU1lNQk9MX1VOREVSU0NPUkUsIFtpbmRpcihbQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFXSldKWRubAotQUNfREVGVU4oQU1fU1lTX0xJQlRPT0xfQ1lHV0lOLCBbaW5kaXIoW0FDX1NZU19MSUJUT09MX0NZR1dJTl0pXSlkbmwKLQotIyBMaWtlIEFDX0NPTkZJR19IRUFERVIsIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdGFtcCBmaWxlLgotCi1BQ19ERUZVTihBTV9DT05GSUdfSEVBREVSLAotW0FDX1BSRVJFUShbMi4xMl0pCi1BQ19DT05GSUdfSEVBREVSKFskMV0pCi1kbmwgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KLWRubCBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKLWRubCB0aGF0IGlzIGdlbmVyYXRlZC4gIFdlIG11c3Qgc3RyaXAgZXZlcnl0aGluZyBwYXN0IHRoZSBmaXJzdCAiOiIsCi1kbmwgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgbGFzdCAiLyIuCi1BQ19PVVRQVVRfQ09NTUFORFMoY2hhbmdlcXVvdGUoPDwsPj4pZG5sCi1pZmVsc2UocGF0c3Vic3QoPDwkMT4+LCA8PFteIF0+PiwgPDw+PiksIDw8Pj4sCi08PHRlc3QgLXogIjw8JD4+Q09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gcGF0c3Vic3QoPDwkMT4+LCA8PF5cKFteOl0qL1wpPy4qPj4sIDw8XDE+PilzdGFtcC1oPDw+PmRubD4+LAotPDxhbV9pbmR4PTEKLWZvciBhbV9maWxlIGluIDw8JDE+PjsgZG8KLSAgY2FzZSAiIDw8JD4+Q09ORklHX0hFQURFUlMgIiBpbgotICAqIiA8PCQ+PmFtX2ZpbGUgIio8PCk+PgotICAgIGVjaG8gdGltZXN0YW1wID4gYGVjaG8gPDwkPj5hbV9maWxlIHwgc2VkIC1lICdzJTouKiUlJyAtZSAncyVbXi9dKiQlJSdgc3RhbXAtaCRhbV9pbmR4Ci0gICAgOzsKLSAgZXNhYwotICBhbV9pbmR4PWBleHByICI8PCQ+PmFtX2luZHgiICsgMWAKLWRvbmU8PD4+ZG5sPj4pCi1jaGFuZ2VxdW90ZShbLF0pKV0pCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLUFDX0RFRlVOKENZX1dJVEhfTkxTLAotICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCi0gICAgQUNfQVJHX0VOQUJMRShubHMsCi0gICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCi0gICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKLSAgICBBQ19TVUJTVChVU0VfTkxTKQotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKLSAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMsIDEsIFtEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAotICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCi0gICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0Ci0gICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKLSAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCi0JZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCi0JbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCi0JICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKLQkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAotCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCi0JCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhULCAxLAotCQkJW0RlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0Ll0pCi0JICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKLQkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0JCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLQkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKLQkJICBbQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmVdLAotCQkgIFtDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYl0pCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQldKQotCi0JZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCi0gICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCi0KLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KLQkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KLQkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgotICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCi0gICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLSAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KLSAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQotCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCi0JaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgQUNfTVNHX1JFU1VMVCgKLQkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCi0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCi0gICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncwotICAgIGRubCBpbiBjb25maWd1cmUuaW4uCi0gICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KLSAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKLSAgICBBQ19TVUJTVChDQVRBTE9HUykKLSAgICBBQ19TVUJTVChDQVRPQkpFWFQpCi0gICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCi0gICAgQUNfU1VCU1QoR01PRklMRVMpCi0gICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKLSAgICBBQ19TVUJTVChJTlRMREVQUykKLSAgICBBQ19TVUJTVChJTlRMTElCUykKLSAgICBBQ19TVUJTVChJTlRMT0JKUykKLSAgICBBQ19TVUJTVChQT0ZJTEVTKQotICAgIEFDX1NVQlNUKFBPU1VCKQotICBdKQotCi1BQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKLSAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCi0KLSAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKLSAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb25dKQotICAgZmkKLQotICAgQU1fTENfTUVTU0FHRVMKLSAgIENZX1dJVEhfTkxTCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCi0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQotICAgICBmaQotCi0gICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgotICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQotICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCi0gICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCi0KLSAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKLSAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgotICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKLSAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKLQotCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKLSAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgotCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgotICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCi0gICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0Ci0gICBkbmwgcGFja2FnZXMuCi0gICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgQUNfU1VCU1QoR1RfTk8pCi0gICBBQ19TVUJTVChHVF9ZRVMpCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCi0KLSAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgotICAgbD0KLSAgIEFDX1NVQlNUKGwpCi0KLSAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCi0gICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKLSAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgotICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIF0pCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLWRubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKLWRubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKLUFDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCi1bIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCi1bY2FzZSAiWyRdJDEiIGluCi0gIC8qKQotICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiBbJDNdOyB0aGVuCi0JYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKLWRubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgotaWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKLV0pZG5sCi0gIDs7Ci1lc2FjXSlkbmwKLSQxPSIkYWNfY3ZfcGF0aF8kMSIKLWlmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFskXSQxKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFDX1NVQlNUKCQxKWRubAotXSkKLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQotCi1kbmwgQU1fUFJPR19MRVgKLWRubCBMb29rIGZvciBmbGV4LCBsZXggb3IgbWlzc2luZywgdGhlbiBydW4gQUNfUFJPR19MRVggYW5kIEFDX0RFQ0xfWVlURVhUCi1BQ19ERUZVTihBTV9QUk9HX0xFWCwKLVttaXNzaW5nX2Rpcj1pZmVsc2UoWyQxXSwsYGNkICRhY19hdXhfZGlyICYmIHB3ZGAsJDEpCi1BQ19DSEVDS19QUk9HUyhMRVgsIGZsZXggbGV4LCAiJG1pc3NpbmdfZGlyL21pc3NpbmcgZmxleCIpCi1BQ19QUk9HX0xFWAotQUNfREVDTF9ZWVRFWFRdKQotCi0jIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KLSMgRnJvbSBKaW0gTWV5ZXJpbmcKLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9NQUlOVEFJTkVSX01PREUsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCi0gIGRubCBtYWludGFpbmVyLW1vZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAotICBBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKLVsgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQotICBBQ19NU0dfUkVTVUxUKCRVU0VfTUFJTlRBSU5FUl9NT0RFKQotICBBTV9DT05ESVRJT05BTChNQUlOVEFJTkVSX01PREUsIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXMpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICBBQ19TVUJTVChNQUlOVClkbmwKLV0KLSkKLQotIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KLQotQUNfREVGVU4oQU1fQ09ORElUSU9OQUwsCi1bQUNfU1VCU1QoJDFfVFJVRSkKLUFDX1NVQlNUKCQxX0ZBTFNFKQotaWYgJDI7IHRoZW4KLSAgJDFfVFJVRT0KLSAgJDFfRkFMU0U9JyMnCi1lbHNlCi0gICQxX1RSVUU9JyMnCi0gICQxX0ZBTFNFPQotZmldKQotCmRpZmYgLS1naXQgYS9sZC9jb25maWcuaW4gYi9sZC9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MTUwNDYuLjAwMDAwMDAKLS0tIGEvbGQvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIGxleCBkZWNsYXJlcyB5eXRleHQgYXMgYSBjaGFyICogYnkgZGVmYXVsdCwgbm90IGEgY2hhcltdLiAgKi8KLSN1bmRlZiBZWVRFWFRfUE9JTlRFUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNicmsgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0JSSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZW50Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0RJUkVOVF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19ESVJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvbmRpci5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIFVzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/ICovCi0jdW5kZWYgVVNFX0JJTkFSWV9GT1BFTgotCi0vKiBEZWZpbmUgaWYgc3Ryc3RyIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi0KLS8qIERlZmluZSBpZiBmcmVlIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotCi0vKiBEZWZpbmUgaWYgc2JyayBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLQotLyogRGVmaW5lIGlmIGdldGVudiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVgotCi0vKiBEZWZpbmUgaWYgZW52aXJvbiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04KLQpkaWZmIC0tZ2l0IGEvbGQvY29uZmlndXJlIGIvbGQvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDU3M2IyLi4wMDAwMDAwCi0tLSBhL2xkL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDUyMTQgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLTY0LWJpdC1iZmQgICAgIDY0LWJpdCBzdXBwb3J0IChvbiBob3N0cyB3aXRoIG5hcnJvd2VyIHdvcmQgc2l6ZXMpIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1sZG1haW4uYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZWxzZQotICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZmkKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1OTQ6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjE1OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MzM6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjY4OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcyMTogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3Nzg6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotCi1QQUNLQUdFPWxkCi0KLVZFUlNJT049Mi45LjQKLQotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCi1FT0YKLQotCi0KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MjQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBQ0xPQ0FMPWFjbG9jYWwKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODM3OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPQ09ORj1hdXRvY29uZgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPQ09ORj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2NvbmYiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg1MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9tYWtlIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT01BS0U9YXV0b21ha2UKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT01BS0U9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9tYWtlIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg2MzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NzY6IGNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChtYWtlaW5mbyAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIE1BS0VJTkZPPW1ha2VpbmZvCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIE1BS0VJTkZPPSIkbWlzc2luZ19kaXIvbWlzc2luZyBtYWtlaW5mbyIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc3RhdGljPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBvciAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZmFzdF9pbnN0YWxsIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5NjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk5MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAyMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNzM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMDU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDExMTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTIxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNDc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTUyOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTYxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExODA6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCi0gIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjIzOiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNDc6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI1MDogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotdGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyODY6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2dudV9sZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nbnVfbGQiIDE+JjYKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMDI6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9OTScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi0KLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLWVjaG8gIiRhY190IiIkTk0iIDE+JjYKLQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzQwOiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKiAJXCgkYWNfc3ltY29kZVwpIAkgCSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDAzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDA3OiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0NTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotCSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotCi1maQotCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotZWNobyAiJGFjX3QiIiRhY19yZXN1bHQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1MDU6IGNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUxNzogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci1maQotcm0gLXJmIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSIgMT4mNgotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTQzOiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdGRhdGEKLWlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsCi10aGVuCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotICBhY19jdl9wcm9nX0xOX1M9ImxuIC1zIgotZWxzZQotICBhY19jdl9wcm9nX0xOX1M9bG4KLWZpCi1maQotTE5fUz0iJGFjX2N2X3Byb2dfTE5fUyIKLWlmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAkaG9zdCAhPSAkYnVpbGQ7IHRoZW4KLSAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KLWVsc2UKLSAgYWNfdG9vbF9wcmVmaXg9Ci1maQotCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICcjbGluZSAxNTg1ICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTg2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MDc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2NjX25lZWRzX2JlbGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjEyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjE5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2NjX25lZWRzX2JlbGYiIDE+JjYKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY0MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iJHthY190b29sX3ByZWZpeH1kbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBkbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9ImRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiICYmIGFjX2N2X3Byb2dfRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBETExUT09MPSJmYWxzZSIKLWZpCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcwOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSIke2FjX3Rvb2xfcHJlZml4fWFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9ImFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyIgJiYgYWNfY3ZfcHJvZ19BUz0iZmFsc2UiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgQVM9ImZhbHNlIgotZmkKLWZpCi0KLQotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIG9yIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9saWJ0b29sX2xvY2siCi0gIG5lZWRfbG9ja3M9JGVuYWJsZXZhbAotZWxzZQotICBuZWVkX2xvY2tzPXllcwotZmkKLQotCi1pZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCi0gIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotZmkKLQotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxpYnRvb2wgY29uZmlndXJlIGZhaWxlZCIgMT4mMjsgZXhpdCAxOyB9Ci0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGFyZ2V0cyBvciAtLWRpc2FibGUtdGFyZ2V0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV90YXJnZXRzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV90YXJnZXRzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnIiAxPiYyOyBleGl0IDE7IH0KLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWMKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtNjQtYml0LWJmZCBvciAtLWRpc2FibGUtNjQtYml0LWJmZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV82NF9iaXRfYmZkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV82NF9iaXRfYmZkIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgIHdhbnQ2ND10cnVlICA7OwotICBubykgICB3YW50NjQ9ZmFsc2UgOzsKLSAgKikgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciA2NC1iaXQtYmZkIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1lbHNlCi0gIHdhbnQ2ND1mYWxzZQotZmkKLQotCi0KLQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotaWYgdGVzdCAteiAiJGhvc3QiIDsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogVW5yZWNvZ25pemVkIGhvc3Qgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi0jIGhvc3Qtc3BlY2lmaWMgc3R1ZmY6Ci0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTkxMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk0MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5OTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMjM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDIwMzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDM5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNjU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDcwOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDc5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwOTg6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE0MTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi1BTExfTElOR1VBUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTk2OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyMTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyMzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyNTE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyNzY6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyOTc6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIzMTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzQ1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM3NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDAxOiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ1NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDc2OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0ODMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDkwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjUxNjogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUyMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTQ5OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1NTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1ODQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTg5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1OTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjE3OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2MjIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY1MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2ODI6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjg3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcxMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjcxNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzQwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3Njc6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzc1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3OTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjgxOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4MjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI4Mjk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg1ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjg2MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODg2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTExOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTE5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDU5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA4NzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwOTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwOTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTI3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTMyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxODQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxODkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIxMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjQ2OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyNTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjU4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI3OTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjk5OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzMTg6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzMjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMyODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzNDU6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM1MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM1NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzczOiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM4MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzOTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MDg6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQxMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDQ4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDgyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDg3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1MTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1Mzc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTczOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2MDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2MTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjQ1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY3OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3MTU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4MDU6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4MzM6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM4MzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzg0MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5MDY6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5MjI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5Mzk6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzk0NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5NTE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk3MDogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk4MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLQotZm9yIGFjX3Byb2cgaW4gJ2Jpc29uIC15JyBieWFjYwotZG8KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwMDY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ZQUNDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFlBQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfWUFDQz0iJFlBQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1lBQ0M9IiRhY19wcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1ZQUNDPSIkYWNfY3ZfcHJvZ19ZQUNDIgotaWYgdGVzdCAtbiAiJFlBQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWUFDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLXRlc3QgLW4gIiRZQUNDIiAmJiBicmVhawotZG9uZQotdGVzdCAtbiAiJFlBQ0MiIHx8IFlBQ0M9InlhY2MiCi0KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1mb3IgYWNfcHJvZyBpbiBmbGV4IGxleAotZG8KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwNDI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MRVgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBhY19jdl9wcm9nX0xFWD0iJExFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfTEVYPSIkYWNfcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotTEVYPSIkYWNfY3ZfcHJvZ19MRVgiCi1pZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExFWCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLXRlc3QgLW4gIiRMRVgiICYmIGJyZWFrCi1kb25lCi10ZXN0IC1uICIkTEVYIiB8fCBMRVg9IiIkbWlzc2luZ19kaXIvbWlzc2luZyBmbGV4IiIKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJmbGV4Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBmbGV4OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwNzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MRVgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBhY19jdl9wcm9nX0xFWD0iJExFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfTEVYPSJmbGV4IgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19MRVgiICYmIGFjX2N2X3Byb2dfTEVYPSJsZXgiCi1maQotZmkKLUxFWD0iJGFjX2N2X3Byb2dfTEVYIgotaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRVgiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkTEVYTElCIgotdGhlbgotICBjYXNlICIkTEVYIiBpbgotICBmbGV4KikgYWNfbGliPWZsIDs7Ci0gICopIGFjX2xpYj1sIDs7Ci0gIGVzYWMKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxMDk6IGNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gJGFjX2xpYidfJ3l5d3JhcCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWwkYWNfbGliICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQxMTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciB5eXdyYXAoKTsKLQotaW50IG1haW4oKSB7Ci15eXdyYXAoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxMjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIExFWExJQj0iLWwkYWNfbGliIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGxleCBvdXRwdXQgZmlsZSByb290IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTUxOiBjaGVja2luZyBsZXggb3V0cHV0IGZpbGUgcm9vdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19sZXhfcm9vdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgVGhlIG1pbmltYWwgbGV4IHByb2dyYW0gaXMganVzdCBhIHNpbmdsZSBsaW5lOiAlJS4gIEJ1dCBzb21lIGJyb2tlbiBsZXhlcwotIyAoU29sYXJpcywgSSB0aGluayBpdCB3YXMpIHdhbnQgdHdvICUlIGxpbmVzLCBzbyBhY2NvbW1vZGF0ZSB0aGVtLgotZWNobyAnJSUKLSUlJyB8ICRMRVgKLWlmIHRlc3QgLWYgbGV4Lnl5LmM7IHRoZW4KLSAgYWNfY3ZfcHJvZ19sZXhfcm9vdD1sZXgueXkKLWVsaWYgdGVzdCAtZiBsZXh5eS5jOyB0aGVuCi0gIGFjX2N2X3Byb2dfbGV4X3Jvb3Q9bGV4eXkKLWVsc2UKLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW5ub3QgZmluZCBvdXRwdXQgZnJvbSAkTEVYOyBnaXZpbmcgdXAiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19sZXhfcm9vdCIgMT4mNgotTEVYX09VVFBVVF9ST09UPSRhY19jdl9wcm9nX2xleF9yb290Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgeXl0ZXh0IGlzIGEgcG9pbnRlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDE3MjogY2hlY2tpbmcgd2hldGhlciB5eXRleHQgaXMgYSBwb2ludGVyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgUE9TSVggc2F5cyBsZXggY2FuIGRlY2xhcmUgeXl0ZXh0IGVpdGhlciBhcyBhIHBvaW50ZXIgb3IgYW4gYXJyYXk7IHRoZQotIyBkZWZhdWx0IGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4gRmlndXJlIG91dCB3aGljaCBpdCBpcywgc2luY2UKLSMgbm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgcHJvdmlkZSB0aGUgJXBvaW50ZXIgYW5kICVhcnJheSBkZWNsYXJhdGlvbnMuCi1hY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcj1ubwotZWNobyAnZXh0ZXJuIGNoYXIgKnl5dGV4dDsnID4+JExFWF9PVVRQVVRfUk9PVC5jCi1hY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iJExJQlMgJExFWExJQiIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQxODQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotYGNhdCAkTEVYX09VVFBVVF9ST09ULmNgCi1pbnQgbWFpbigpIHsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxOTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi1ybSAtZiAiJHtMRVhfT1VUUFVUX1JPT1R9LmMiCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBZWVRFWFRfUE9JTlRFUiAxCi1FT0YKLQotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDIxNDogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQotICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKLSAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9bm8KLWZpCi0KLSAgZWNobyAiJGFjX3QiIiRVU0VfTUFJTlRBSU5FUl9NT0RFIiAxPiY2Ci0gIAotCi1pZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPQotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9JyMnCi1lbHNlCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPScjJwotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9Ci1maQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgCi0KLQotLiAke3NyY2Rpcn0vY29uZmlndXJlLmhvc3QKLQotCi0KLQotCi0KLWZvciBhY19oZHIgaW4gc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDI0ODogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyNTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQyNTg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBzYnJrCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0Mjg3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MjkyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzMTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWFjX2hlYWRlcl9kaXJlbnQ9bm8KLWZvciBhY19oZHIgaW4gZGlyZW50Lmggc3lzL25kaXIuaCBzeXMvZGlyLmggbmRpci5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciB0aGF0IGRlZmluZXMgRElSIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzQ0OiBjaGVja2luZyBmb3IgJGFjX2hkciB0aGF0IGRlZmluZXMgRElSIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDM0OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8JGFjX2hkcj4KLWludCBtYWluKCkgewotRElSICpkaXJwID0gMDsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzU3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyX2RpcmVudF8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gYWNfaGVhZGVyX2RpcmVudD0kYWNfaGRyOyBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0jIFR3byB2ZXJzaW9ucyBvZiBvcGVuZGlyIGV0IGFsLiBhcmUgaW4gLWxkaXIgYW5kIC1seCBvbiBTQ08gWGVuaXguCi1pZiB0ZXN0ICRhY19oZWFkZXJfZGlyZW50ID0gZGlyZW50Lmg7IHRoZW4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1sZGlyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzgyOiBjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbGRpciIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGRpcidfJ29wZW5kaXIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sZGlyICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQzOTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBvcGVuZGlyKCk7Ci0KLWludCBtYWluKCkgewotb3BlbmRpcigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQwMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgTElCUz0iJExJQlMgLWxkaXIiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWx4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDIzOiBjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbHgiID4mNQotYWNfbGliX3Zhcj1gZWNobyB4J18nb3BlbmRpciB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWx4ICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ0MzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBvcGVuZGlyKCk7Ci0KLWludCBtYWluKCkgewotb3BlbmRpcigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQ0MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgTElCUz0iJExJQlMgLWx4IgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWZpCi0KLQotCi1jYXNlICIke2hvc3R9IiBpbgotKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MpCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBVU0VfQklOQVJZX0ZPUEVOIDEKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0NzU6IGNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDgwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHN0cnN0cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1MDE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHI9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU1RSU1RSIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDUyMjogY2hlY2tpbmcgd2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9mcmVlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDUyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBmcmVlCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDU0ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZSIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRlJFRSAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzYnJrIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1Njk6IGNoZWNraW5nIHdoZXRoZXIgc2JyayBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ1NzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc2JyawotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1OTU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3NicmsiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NCUksgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZ2V0ZW52IG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2MTY6IGNoZWNraW5nIHdoZXRoZXIgZ2V0ZW52IG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NjIxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGdldGVudgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2NDI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52PW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnY9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fR0VURU5WIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGVudmlyb24gbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDY2MzogY2hlY2tpbmcgd2hldGhlciBlbnZpcm9uIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDY2OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBlbnZpcm9uCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDY4OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbiIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24gPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTiAxCi1FT0YKLQotZmkKLQotCi0jIHRhcmdldC1zcGVjaWZpYyBzdHVmZjoKLQotYWxsX3RhcmdldHM9Ci1FTVVMPQotYWxsX2VtdWxzPQotYWxsX2VtdWxfZXh0cmFzPQotCi1ybSAtZiB0ZGlycwotCi1mb3IgdGFyZ19hbGlhcyBpbiBgZWNobyAkdGFyZ2V0X2FsaWFzICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi1kbwotICBpZiB0ZXN0ICIkdGFyZ19hbGlhcyIgPSAiYWxsIjsgdGhlbgotICAgIGFsbF90YXJnZXRzPXRydWUKLSAgZWxzZQotICAgICMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgotICAgIHJlc3VsdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdfYWxpYXMgMj4vZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJHJlc3VsdCI7IHRoZW4KLQl0YXJnPSRyZXN1bHQKLSAgICBlbHNlCi0JdGFyZz0kdGFyZ19hbGlhcwotICAgIGZpCi0KLSAgICAuICR7c3JjZGlyfS9jb25maWd1cmUudGd0Ci0KLSAgICBpZiB0ZXN0ICIkdGFyZyIgPSAiJHRhcmdldCI7IHRoZW4KLSAgICAgIEVNVUw9JHRhcmdfZW11bAotICAgIGZpCi0KLSAgICBmb3IgaSBpbiAkdGFyZ19lbXVsICR0YXJnX2V4dHJhX2VtdWxzOyBkbwotCWNhc2UgIiAkYWxsX2VtdWxzICIgaW4KLQkqIiBlJHtpfS5vICIqKSA7OwotCSopCi0JICBhbGxfZW11bHM9IiRhbGxfZW11bHMgZSR7aX0ubyIKLQkgIGV2YWwgcmVzdWx0PVwkdGRpcl8kaQotCSAgdGVzdCAteiAiJHJlc3VsdCIgJiYgcmVzdWx0PSR0YXJnX2FsaWFzCi0JICBlY2hvIHRkaXJfJGk9JHJlc3VsdCA+PiB0ZGlycwotCSAgOzsKLQllc2FjCi0gICAgZG9uZQotCi0gICAgZm9yIGkgaW4gJHRhcmdfZXh0cmFfb2ZpbGVzOyBkbwotCWNhc2UgIiAkYWxsX2VtdWxfZXh0cmFzICIgaW4KLQkqIiAke2l9ICIqKSA7OwotCSopCi0JICBhbGxfZW11bF9leHRyYXM9IiRhbGxfZW11bF9leHRyYXMgJHtpfSIKLQkgIDs7Ci0JZXNhYwotICAgIGRvbmUKLSAgZmkKLWRvbmUKLQotCi0KLVRESVJTPXRkaXJzCi0KLQotaWYgdGVzdCB4JHthbGxfdGFyZ2V0c30gPSB4dHJ1ZTsgdGhlbgotICBpZiB0ZXN0IHgke3dhbnQ2NH0gPSB4dHJ1ZTsgdGhlbgotICAgIEVNVUxBVElPTl9PRklMRVM9JyQoQUxMX0VNVUxBVElPTlMpICQoQUxMXzY0X0VNVUxBVElPTlMpJwotICBlbHNlCi0gICAgRU1VTEFUSU9OX09GSUxFUz0nJChBTExfRU1VTEFUSU9OUyknCi0gIGZpCi0gIEVNVUxfRVhUUkFfT0ZJTEVTPSckKEFMTF9FTVVMX0VYVFJBX09GSUxFUyknCi1lbHNlCi0gIEVNVUxBVElPTl9PRklMRVM9JGFsbF9lbXVscwotICBFTVVMX0VYVFJBX09GSUxFUz0kYWxsX2VtdWxfZXh0cmFzCi1maQotCi0KLQotaWYgdGVzdCB4JHtlbmFibGVfc3RhdGljfSA9IHhubzsgdGhlbgotICBURVNUQkZETElCPSItLXJwYXRoIC4uL2JmZC8ubGlicyAuLi9iZmQvLmxpYnMvbGliYmZkLnNvIgotZWxzZQotICBURVNUQkZETElCPSIuLi9iZmQvLmxpYnMvbGliYmZkLmEiCi1maQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKLXMlQFZFUlNJT05AJSRWRVJTSU9OJWcKLXMlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKLXMlQEFVVE9DT05GQCUkQVVUT0NPTkYlZwotcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCi1zJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCi1zJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQENDQCUkQ0MlZwotcyVATERAJSRMRCVnCi1zJUBOTUAlJE5NJWcKLXMlQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAlJFVTRV9TWU1CT0xfVU5ERVJTQ09SRSVnCi1zJUBMTl9TQCUkTE5fUyVnCi1zJUBETExUT09MQCUkRExMVE9PTCVnCi1zJUBBU0AlJEFTJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBFWEVFWFRAJSRFWEVFWFQlZwotcyVAWUFDQ0AlJFlBQ0MlZwotcyVATEVYQCUkTEVYJWcKLXMlQExFWExJQkAlJExFWExJQiVnCi1zJUBMRVhfT1VUUFVUX1JPT1RAJSRMRVhfT1VUUFVUX1JPT1QlZwotcyVATUFJTlRBSU5FUl9NT0RFX1RSVUVAJSRNQUlOVEFJTkVSX01PREVfVFJVRSVnCi1zJUBNQUlOVEFJTkVSX01PREVfRkFMU0VAJSRNQUlOVEFJTkVSX01PREVfRkFMU0UlZwotcyVATUFJTlRAJSRNQUlOVCVnCi1zJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKLXMlQEhPU1RJTkdfQ1JUMEAlJEhPU1RJTkdfQ1JUMCVnCi1zJUBIT1NUSU5HX0xJQlNAJSRIT1NUSU5HX0xJQlMlZwotcyVATkFUSVZFX0xJQl9ESVJTQCUkTkFUSVZFX0xJQl9ESVJTJWcKLXMlQEVNVUxAJSRFTVVMJWcKLS9AVERJUlNAL3IgJFRESVJTCi1zJUBURElSU0AlJWcKLXMlQEVNVUxBVElPTl9PRklMRVNAJSRFTVVMQVRJT05fT0ZJTEVTJWcKLXMlQEVNVUxfRVhUUkFfT0ZJTEVTQCUkRU1VTF9FWFRSQV9PRklMRVMlZwotcyVAVEVTVEJGRExJQkAlJFRFU1RCRkRMSUIlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi1zZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGUKLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9sZC9jb25maWd1cmUuYmF0IGIvbGQvY29uZmlndXJlLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0M2JkYi4uMDAwMDAwMAotLS0gYS9sZC9jb25maWd1cmUuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotQGVjaG8gb2ZmDQotZWNobyBDb25maWd1cmluZyBsZCBmb3IgZ28zMg0KLWVjaG8gVGhpcyBtYWtlZmlsZSB3aWxsIGJlIGJ1aWx0IGZvciBHTlVJU0ggbWFrZQ0KLXJlbSBUaGlzIGJhdGNoIGZpbGUgYXNzdW1lcyBhIHVuaXgtdHlwZSAic2VkIiBwcm9ncmFtDQotDQotdXBkYXRlIC4uXGJmZFxob3N0c1xnbzMyLmggc3lzZGVwLmgNCi0NCi1lY2hvICMgTWFrZWZpbGUgZ2VuZXJhdGVkIGJ5ICJjb25maWd1cmUuYmF0Ij4gTWFrZWZpbGUNCi1lY2hvIExPTkdBUkdTID0gZ2NjOmFyID4+IE1ha2VmaWxlDQotZWNobyBDQz1nY2MgPj4gTWFrZWZpbGUNCi1lY2hvIGhvc3RfYWxpYXM9Z28zMiA+PiBNYWtlZmlsZQ0KLWVjaG8gdGFyZ2V0X2FsaWFzPWdvMzIgPj4gTWFrZWZpbGUNCi0NCi11cGRhdGUgLi4vYmZkL2hvc3RzL2dvMzIuaCBzeXNkZXAuaA0KLQ0KLWlmIGV4aXN0IGNvbmZpZy5zZWQgZGVsIGNvbmZpZy5zZWQNCi0NCi1lY2hvICJzL14JXCQoc3JjZGlyKVwvbW92ZS1pZi1jaGFuZ2UvCXVwZGF0ZS8JIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzLzpcKFteIAldXCkvOiBcMS9nCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9eCVwgKlwuXC8vCWdvMzIgLwkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9gZWNobyBcJChzcmNkaXIpXC8vL2cJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzLyB8IHNlZCAncyxcXlxcXC5cLywsJ2AvL2cJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvXgljZCBcJChzcmNkaXIpWyAJXSo7Ly8JCQkiPj4gY29uZmlnLnNlZA0KLQ0KLWVjaG8gIi9eIyMjIyQvIGlcCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIkNDID0gZ2NjXAkJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiRU1VTD1nbzMyXAkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJFTVVMQVRJT05fT0ZJTEVTPWVnbzMyLm8gZWkzODZhb3V0Lm8JCSI+PiBjb25maWcuc2VkDQotDQotZWNobyAiL15TSEVMTCAqPS8gZAkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzLyQoU0hFTEwpL3NoLmV4ZS9nCQkJCSI+PiBjb25maWcuc2VkDQotDQotZWNobyAicy8nIi9cXCIvZwkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzLyInL1xcIi9nCQkJCQkiPj4gY29uZmlnLnNlZA0KLQ0KLWVjaG8gIi9ebGRtYWluLm86IGxkbWFpbi5jLywvZmkvIHsJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIiAgcy87ICpcXCQvLwkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIgIHMvLURTQ1JJUFRESVJbXiAJXSovLURTQ1JJUFRESVI9XFwiLlxcIi8JIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIgIHMvY29uZmlnLnN0YXR1cy8vCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiICAvbGRtYWluLm86LyBwCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIiAgLyhDQykvIHAJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiICBkCQkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJ9CQkJCQkJCSI+PiBjb25maWcuc2VkDQotDQotZWNobyAicy9eU0hFTEwuKiQvU0hFTEw9c2guZXhlLwkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvZ2Vuc2NyaXB0cy5zaC9nZW5zY3JpcHRzLmRvcy9nCQkJIj4+IGNvbmZpZy5zZWQNCi0NCi1lY2hvICJzL15sZGVtdWwtbGlzdC5oL25vdC1sZGVtdWwtbGlzdC5oLwkJIj4+IGNvbmZpZy5zZWQNCi0NCi1zZWQgLWUgInMvXlwiLy8iIC1lICJzL1wiJC8vIiAtZSAicy9bIAldKiQvLyIgY29uZmlnLnNlZCA+IGNvbmZpZzIuc2VkDQotc2VkIC1mIGNvbmZpZzIuc2VkIE1ha2VmaWxlLmluID4+IE1ha2VmaWxlDQotZGVsIGNvbmZpZy5zZWQNCi1kZWwgY29uZmlnMi5zZWQNCi0NCi1lY2hvIHNldCAtYSA+IGdlbnNjcmlwdHMuZGoNCi1zZWQgLWUgIi9eW2EtekEtWjAtOV9dKj0vIHMvXi9leHBvcnQgLyIgLWUgInMvKC4gXCguKlwpKS9zaCBcMS8iIC1lICIvXC5lbS8gZCIgZ2Vuc2NyaXB0cy5zaCA+PiBnZW5zY3JpcHRzLmRqDQotdHlwZSBlbXVsdGVtcGxcZ2VuZXJpYy5lbSA+PiBnZW5zY3JpcHRzLmRqDQotdXBkYXRlIGdlbnNjcmlwdHMuZGogZ2Vuc2NyaXB0cy5kb3MNCi0NCi1lY2hvIGV4dGVybiBsZF9lbXVsYXRpb25feGZlcl90eXBlIGxkX2dvMzJfZW11bGF0aW9uOyA+IGxkZW11bC1saXN0LmgyDQotZWNobyBleHRlcm4gbGRfZW11bGF0aW9uX3hmZXJfdHlwZSBsZF9pMzg2YW91dF9lbXVsYXRpb247ID4+IGxkZW11bC1saXN0LmgyDQotZWNobyAjZGVmaW5lIEVNVUxBVElPTl9MSVNUIFw+PmxkZW11bC1saXN0LmgyDQotZWNobyAgICZsZF9nbzMyX2VtdWxhdGlvbixcPj5sZGVtdWwtbGlzdC5oMg0KLWVjaG8gICAmbGRfaTM4NmFvdXRfZW11bGF0aW9uLFw+PmxkZW11bC1saXN0LmgyDQotZWNobyAwPj5sZGVtdWwtbGlzdC5oMg0KLQ0KLXVwZGF0ZSBsZGVtdWwtbGlzdC5oMiBsZGVtdWwtbGlzdC5oDQotDQotaWYgZXhpc3QgbGRzY3JpcHRzXGRvc3Rlc3QgZ290byBsZHNjcmlwdHMNCi1ta2RpciBsZHNjcmlwdHMNCi1kaXIgPiBsZHNjcmlwdHNcZG9zdGVzdA0KLTpsZHNjcmlwdHMNCmRpZmYgLS1naXQgYS9sZC9jb25maWd1cmUuaG9zdCBiL2xkL2NvbmZpZ3VyZS5ob3N0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGViMzExLi4wMDAwMDAwCi0tLSBhL2xkL2NvbmZpZ3VyZS5ob3N0CisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLSMgVGhpcyBpcyB0aGUgbGlua2VyIGhvc3Qgc3BlY2lmaWMgZmlsZS4gIFRoaXMgaXMgaW52b2tlZCBieSB0aGUKLSMgYXV0b2NvbmYgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQuICBQdXR0aW5nIGl0IGluIGEgc2VwYXJhdGUgc2hlbGwKLSMgZmlsZSBsZXRzIHVzIHNraXAgcnVubmluZyBhdXRvY29uZiB3aGVuIG1vZGlmeWluZyBob3N0IHNwZWNpZmljCi0jIGluZm9ybWF0aW9uLgotCi0jIFRoaXMgZmlsZSBzZXRzIHRoZSBmb2xsb3dpbmcgc2hlbGwgdmFyaWFibGVzOgotIyAgSERFRklORVMJCWhvc3Qgc3BlY2lmaWMgY29tcGlsZXIgZmxhZ3MKLSMgIEhPU1RJTkdfQ1JUMAkJY3J0MC5vIGZpbGUgdXNlZCBmb3IgYm9vdHN0cmFwcGluZwotIyAgSE9TVElOR19MSUJTCQlsaWJyYXJpZXMgdXNlZCBmb3IgYm9vdHN0cmFwcGluZwotIyAgTkFUSVZFX0xJQl9ESVJTCWxpYnJhcnkgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIG9uIHRoaXMgaG9zdAotCi1IREVGSU5FUz0KLUhPU1RJTkdfQ1JUMD0vbGliL2NydDAubwotSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYycKLU5BVElWRV9MSUJfRElSUz0KLQotY2FzZSAiJHtob3N0fSIgaW4KLQotYWxwaGEqLSotbGludXgtZ251KikKLSAgSE9TVElOR19DUlQwPSctZHluYW1pYy1saW5rZXIgYGVncmVwICJsZFteIF0qXC5zbyIgXGBnY2MgLS1wcmludC1maWxlLW5hbWU9c3BlY3NcYCB8IHNlZCAtZSAicywuKi1keW5hbWljLWxpbmtlclsgCV1bIAldKlwoLiovbGRbXiBdKi5zby4uXCkuKixcMSwiYCBgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydDEub2AgYGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRpLm9gIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLUxgZGlybmFtZSBcYGdjYyAtLXByaW50LWZpbGUtbmFtZT1saWJjLnNvXGBgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlIGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIGBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0bi5vYCcKLSAgOzsKLQotYWxwaGEqLSotbmV0YnNkKikKLSAgIyBUaGUgbmV3IEJTRCBgbWFrZScgaGFzIGEgYnVnOiBpdCBkb2Vzbid0IHBhc3MgZW1wdHkgYXJndW1lbnRzIGluCi0gICMgc2hlbGwgY29tbWFuZHMuICBTbyB3ZSBuZWVkIHRvIG1ha2UgdGhpcyB2YWx1ZSBub24tZW1wdHkgaW4gb3JkZXIKLSAgIyBmb3IgdGhlIGdlbnNjcmlwdHMuc2ggY2FsbCB0byB3b3JrLiAgVGhlcmUncyBub3RoaW5nIG1hZ2ljIGFib3V0Ci0gICMgdGhlIHZhbHVlIGAvbGliJzsgaXQncyBqdXN0IGEgZHVtbXkuCi0gIE5BVElWRV9MSUJfRElSUz0vbGliCi0gIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQwLm8KLSAgOzsKLQotYWxwaGEqLSotKikKLSAgSE9TVElOR19DUlQwPS91c3IvY2NzL2xpYi9jcnQwLm8KLSAgTkFUSVZFX0xJQl9ESVJTPS91c3IvY2NzL2xpYgotICA7OwotCi1pWzM0NTZdODYtKi1ic2QqIHwgaVszNDU2XTg2LSotZnJlZWJzZCogfCBpWzM0NTZdODYtKi1uZXRic2QqKQotICAjIFRoZSBuZXcgQlNEIGBtYWtlJyBoYXMgYSBidWc6IGl0IGRvZXNuJ3QgcGFzcyBlbXB0eSBhcmd1bWVudHMgaW4KLSAgIyBzaGVsbCBjb21tYW5kcy4gIFNvIHdlIG5lZWQgdG8gbWFrZSB0aGlzIHZhbHVlIG5vbi1lbXB0eSBpbiBvcmRlcgotICAjIGZvciB0aGUgZ2Vuc2NyaXB0cy5zaCBjYWxsIHRvIHdvcmsuICBUaGVyZSdzIG5vdGhpbmcgbWFnaWMgYWJvdXQKLSAgIyB0aGUgdmFsdWUgYC9saWInOyBpdCdzIGp1c3QgYSBkdW1teS4KLSAgTkFUSVZFX0xJQl9ESVJTPS9saWIKLSAgSE9TVElOR19DUlQwPS91c3IvbGliL2NydDAubwotICA7OwotCi1pWzM0NTZdODYtKi1zeXN2NCopCi0gIEhPU1RJTkdfQ1JUMD0nL3Vzci9jY3MvbGliL2NydDEubyAvdXNyL2Njcy9saWIvY3J0aS5vIC91c3IvY2NzL2xpYi92YWx1ZXMtWGEubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgL3Vzci9jY3MvbGliL2NydG4ubycKLSAgTkFUSVZFX0xJQl9ESVJTPS91c3IvY2NzL2xpYgotICA7OwotCi1pWzM0NTZdODYtc2VxdWVudC1wdHgqIHwgaVszNDU2XTg2LXNlcXVlbnQtc3lzdiopCi0gIEhPU1RJTkdfQ1JUMD0nL2xpYi9jcnQwLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgJwotICA7OwotCi1pWzM0NTZdODYtKi1zeXN2KikKLSAgSE9TVElOR19DUlQwPScvbGliL2NydDEubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZmlgIC9saWIvY3J0bi5vJwotICA7OwotCi1pWzM0NTZdODYtKi1zb2xhcmlzKikKLSAgSE9TVElOR19DUlQwPSdgaWYgWyAtZiAuLi9nY2MvY3J0MS5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0MS5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydDEubzsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRpLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRpLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0aS5vOyBmaWAgL3Vzci9jY3MvbGliL3ZhbHVlcy1YYS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0bi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0bi5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydG4ubzsgZmlgJwotICBOQVRJVkVfTElCX0RJUlM9L3Vzci9jY3MvbGliCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLXNjbyogfCBpWzM0NTZdODYtKi1pc2MqKQotICAjIEluIHNvbWUgY29uZmlndXJhdGlvbnMgZ2NjIGRvZXMgbm90IHVzZSBjcnRiZWdpbi5vIGFuZCBjcnRlbmQuby4KLSAgIyBJbiB0aGF0IGNhc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubyB3aWxsIHNpbXBseSBwcmludAotICAjIGNydGJlZ2luLm8uICBXZSBjcmVhdGUgZHVtbXkgY3J0YmVnaW4ubyBhbmQgY3J0ZW5kLm8gZmlsZXMgdG8KLSAgIyBoYW5kbGUgdGhpcy4KLSAgZWNobyAiaW50IGR1bW15X2NydGJlZ2luICgpIHsgcmV0dXJuIDA7IH0iID4gY3J0YmVnaW4uYwotICAke0NDfSAtYyBjcnRiZWdpbi5jIC1vIGNydGJlZ2luLm8KLSAgcm0gLWYgY3J0YmVnaW4uYwotICBlY2hvICJpbnQgZHVtbXlfY3J0ZW5nICgpIHsgcmV0dXJuIDA7IH0iID4gY3J0ZW5kLmMKLSAgJHtDQ30gLWMgY3J0ZW5kLmMgLW8gY3J0ZW5kLm8KLSAgcm0gLWYgY3J0ZW5kLmMKLSAgSE9TVElOR19DUlQwPScvbGliL2NydDEubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLWxpbnV4KmFvdXQqIHwgaVszNDU2XTg2LSotbGludXhvbGRsZCkKLSAgSE9TVElOR19DUlQwPS91c3IvbGliL2NydDAubwotICA7OwotCi1pWzM0NTZdODYtKi1saW51eCpsaWJjMSopCi0gIEhPU1RJTkdfQ1JUMD0nLWR5bmFtaWMtbGlua2VyIC9saWIvbGQtbGludXguc28uMSAvdXNyL2xpYi9jcnQxLm8gL3Vzci9saWIvY3J0aS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxpZiBbIC1mIC91c3IvbGliL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC91c3IvbGliL2NydGJlZ2luLm87IGVsc2UgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbGlmIFsgLWYgL3Vzci9saWIvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC91c3IvbGliL2NydGVuZC5vOyBlbHNlIGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC91c3IvbGliL2NydG4ubycKLSAgOzsKLQotaVszNDU2XTg2LSotbGludXgtZ251KikKLSAgSE9TVElOR19DUlQwPSctZHluYW1pYy1saW5rZXIgYGZncmVwIGxkLWxpbnV4LnNvIFxgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPXNwZWNzXGAgfCBzZWQgLWUgInMsLiotZHluYW1pYy1saW5rZXJbIAldWyAJXSpcKC4qL2xkLWxpbnV4LnNvLi5cKS4qLFwxLCJgIGBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0MS5vYCBgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydGkub2AgYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlIGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtTGBkaXJuYW1lIFxgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWxpYmMuc29cYGAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgYGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRuLm9gJwotICA7OwotCi1pWzM0NTZdODYtKi1seW54b3MqKQotICBIT1NUSU5HX0NSVDA9L2xpYi9pbml0MS5vCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgLWxtIC9saWIvaW5pdG4ubycKLSAgOzsKLQotbWlwcyotZGVjLWJzZCopCi0gIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQwLm8KLSAgOzsKLQotbWlwcyotc2dpLWlyaXg0KikKLSAgSE9TVElOR19DUlQwPS91c3IvbGliL2NydDEubwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIC91c3IvbGliL2NydG4ubycKLSAgOzsKLQotbWlwcyotc2dpLWlyaXhbNTZdKikKLSAgSE9TVElOR19DUlQwPS91c3IvbGliL2NydDEubwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIC91c3IvbGliL2NydG4ubycKLSAgOzsKLQotbTY4Ki0qLWxpbnV4KmFvdXQqKQotICBIT1NUSU5HX0NSVDA9L3Vzci9saWIvY3J0MC5vCi0gIDs7Ci0KLW02OCotKi1saW51eCpsaWJjMSopCi0gIEhPU1RJTkdfQ1JUMD0nLWR5bmFtaWMtbGlua2VyIC9saWIvbGQtbGludXguc28uMSAvdXNyL2xpYi9jcnQxLm8gL3Vzci9saWIvY3J0aS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxpZiBbIC1mIC91c3IvbGliL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC91c3IvbGliL2NydGJlZ2luLm87IGVsc2UgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbGlmIFsgLWYgL3Vzci9saWIvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC91c3IvbGliL2NydGVuZC5vOyBlbHNlIGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC91c3IvbGliL2NydG4ubycKLSAgOzsKLQotbTY4Ki0qLWxpbnV4LWdudSopCi0gIEhPU1RJTkdfQ1JUMD0nLWR5bmFtaWMtbGlua2VyIC9saWIvbGQuc28uMSAvdXNyL2xpYi9jcnQxLm8gL3Vzci9saWIvY3J0aS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgL3Vzci9saWIvY3J0bi5vJwotICA7OwotCi1tNjgqLSotbHlueG9zKikKLSAgSE9TVElOR19DUlQwPS9saWIvaW5pdDEubwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIC1sbSAvbGliL2luaXRuLm8nCi0gIDs7Ci0KLW02OCotbW90b3JvbGEtc3lzdikKLSAgSE9TVElOR19DUlQwPSdgaWYgWyAtZiAuLi9nY2MvY3J0MC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0MC5vOyBlbGlmIFsgLWYgXGBnY2MgLXByaW50LWZpbGUtbmFtZT1cYGNydDAubyBdOyB0aGVuIGVjaG8gXGBnY2MgLXByaW50LWZpbGUtbmFtZT1cYGNydDAubzsgZWxzZSBlY2hvIC9saWIvY3J0MC5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGM4ODEgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCcKLSAgOzsKLQotbTY4Ki1zdW4tKikKLSAgSE9TVElOR19DUlQwPScvdXNyL2xpYi9jcnQwLm8gL3Vzci9saWIvRmNydDEubyAtTC91c3IvbGliL2Zzb2Z0Lm8nCi0gIDs7Ci0KLW04OCotKi1kZ3V4KikKLSAgSERFRklORVM9LURfX3VzaW5nX0RHVVgKLSAgSE9TVElOR19DUlQwPScvbGliL2NydDAubyAtWCcKLSAgSE9TVElOR19MSUJTPS91c3Ivc2RlL204OGtiY3MvbGliL2xpYmMuYQotICA7OwotCi1tODgqLW1vdG9yb2xhLXN5c3YzKQotICBIT1NUSU5HX0NSVDA9Jy9saWIvY3J0MC5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgJwotICA7OwotCi1wb3dlcnBjKi0qLWxpbnV4LWdudSopCi0gIEhPU1RJTkdfQ1JUMD0nLWR5bmFtaWMtbGlua2VyIC9saWIvbGQuc28uMSAvdXNyL2xpYi9jcnQxLm8gL3Vzci9saWIvY3J0aS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgL3Vzci9saWIvY3J0bi5vJwotICA7OwotCi1yb21wLSotKikKLSAgSERFRklORVM9LUROT19WQVJBUkdTCi0gIDs7Ci0KLXNwYXJjKi0qLXNvbGFyaXMyKikKLSAgSE9TVElOR19DUlQwPSdgaWYgWyAtZiAuLi9nY2MvY3J0MS5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0MS5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydDEubzsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRpLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRpLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0aS5vOyBmaWAgL3Vzci9jY3MvbGliL3ZhbHVlcy1YYS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0bi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0bi5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydG4ubzsgZmlgJwotICBOQVRJVkVfTElCX0RJUlM9L3Vzci9jY3MvbGliCi0gIDs7Ci0KLWVzYWMKZGlmZiAtLWdpdCBhL2xkL2NvbmZpZ3VyZS5pbiBiL2xkL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzYzFkYS4uMDAwMDAwMAotLS0gYS9sZC9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQKLWRubAotQUNfUFJFUkVHKDIuMTMpCi1BQ19JTklUKGxkbWFpbi5jKQotCi1BQ19DQU5PTklDQUxfU1lTVEVNCi0KLUFNX0lOSVRfQVVUT01BS0UobGQsIDIuOS40KQotCi1BTV9QUk9HX0xJQlRPT0wKLQotQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAotWyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWNdKWRubAotQUNfQVJHX0VOQUJMRSg2NC1iaXQtYmZkLAotWyAgLS1lbmFibGUtNjQtYml0LWJmZCAgICAgNjQtYml0IHN1cHBvcnQgKG9uIGhvc3RzIHdpdGggbmFycm93ZXIgd29yZCBzaXplcyldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSAgd2FudDY0PXRydWUgIDs7Ci0gIG5vKSAgIHdhbnQ2ND1mYWxzZSA7OwotICAqKSAgICBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgNjQtYml0LWJmZCBvcHRpb24pIDs7Ci1lc2FjXSxbd2FudDY0PWZhbHNlXSlkbmwKLQotQU1fQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi0KLWlmIHRlc3QgLXogIiR0YXJnZXQiIDsgdGhlbgotICAgIEFDX01TR19FUlJPUihVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4pCi1maQotaWYgdGVzdCAteiAiJGhvc3QiIDsgdGhlbgotICAgIEFDX01TR19FUlJPUihVbnJlY29nbml6ZWQgaG9zdCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQotZmkKLQotIyBob3N0LXNwZWNpZmljIHN0dWZmOgotCi1BQ19QUk9HX0NDCi1BQ19QUk9HX0lOU1RBTEwKLQotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi1BQ19FWEVFWFQKLQotQUNfUFJPR19ZQUNDCi1BTV9QUk9HX0xFWAotCi1BTV9NQUlOVEFJTkVSX01PREUKLQotLiAke3NyY2Rpcn0vY29uZmlndXJlLmhvc3QKLQotQUNfU1VCU1QoSERFRklORVMpCi1BQ19TVUJTVChIT1NUSU5HX0NSVDApCi1BQ19TVUJTVChIT1NUSU5HX0xJQlMpCi1BQ19TVUJTVChOQVRJVkVfTElCX0RJUlMpCi0KLUFDX0NIRUNLX0hFQURFUlMoc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHVuaXN0ZC5oKQotQUNfQ0hFQ0tfRlVOQ1Moc2JyaykKLUFDX0hFQURFUl9ESVJFTlQKLQotQkZEX0JJTkFSWV9GT1BFTgotCi1CRkRfTkVFRF9ERUNMQVJBVElPTihzdHJzdHIpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihmcmVlKQotQkZEX05FRURfREVDTEFSQVRJT04oc2JyaykKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKGdldGVudikKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKGVudmlyb24pCi0KLSMgdGFyZ2V0LXNwZWNpZmljIHN0dWZmOgotCi1hbGxfdGFyZ2V0cz0KLUVNVUw9Ci1hbGxfZW11bHM9Ci1hbGxfZW11bF9leHRyYXM9Ci0KLWRubCBXZSBuZWVkIHRvIGdldCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHRkaXIgZGVmaW5pdGlvbnMgaW50bwotZG5sIE1ha2VmaWxlLiAgV2UgY2FuJ3QgZG8gaXQgdXNpbmcgQUNfU1VCU1QsIGJlY2F1c2UgYXV0b2NvbmYgZG9lcwotZG5sIG5vdCBwZXJtaXQgbGl0ZXJhbCBuZXdsaW5lcyBpbiBhbiBBQ19TVUJTVCB2YXJpYWJsZXMuICBTbyB3ZSB1c2UgYQotZG5sIGZpbGUuCi1ybSAtZiB0ZGlycwotCi1mb3IgdGFyZ19hbGlhcyBpbiBgZWNobyAkdGFyZ2V0X2FsaWFzICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi1kbwotICBpZiB0ZXN0ICIkdGFyZ19hbGlhcyIgPSAiYWxsIjsgdGhlbgotICAgIGFsbF90YXJnZXRzPXRydWUKLSAgZWxzZQotICAgICMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgotICAgIHJlc3VsdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdfYWxpYXMgMj4vZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJHJlc3VsdCI7IHRoZW4KLQl0YXJnPSRyZXN1bHQKLSAgICBlbHNlCi0JdGFyZz0kdGFyZ19hbGlhcwotICAgIGZpCi0KLSAgICAuICR7c3JjZGlyfS9jb25maWd1cmUudGd0Ci0KLSAgICBpZiB0ZXN0ICIkdGFyZyIgPSAiJHRhcmdldCI7IHRoZW4KLSAgICAgIEVNVUw9JHRhcmdfZW11bAotICAgIGZpCi0KLSAgICBmb3IgaSBpbiAkdGFyZ19lbXVsICR0YXJnX2V4dHJhX2VtdWxzOyBkbwotCWNhc2UgIiAkYWxsX2VtdWxzICIgaW4KLQkqIiBlJHtpfS5vICIqKSA7OwotCSopCi0JICBhbGxfZW11bHM9IiRhbGxfZW11bHMgZSR7aX0ubyIKLQkgIGV2YWwgcmVzdWx0PVwkdGRpcl8kaQotCSAgdGVzdCAteiAiJHJlc3VsdCIgJiYgcmVzdWx0PSR0YXJnX2FsaWFzCi0JICBlY2hvIHRkaXJfJGk9JHJlc3VsdCA+PiB0ZGlycwotCSAgOzsKLQllc2FjCi0gICAgZG9uZQotCi0gICAgZm9yIGkgaW4gJHRhcmdfZXh0cmFfb2ZpbGVzOyBkbwotCWNhc2UgIiAkYWxsX2VtdWxfZXh0cmFzICIgaW4KLQkqIiAke2l9ICIqKSA7OwotCSopCi0JICBhbGxfZW11bF9leHRyYXM9IiRhbGxfZW11bF9leHRyYXMgJHtpfSIKLQkgIDs7Ci0JZXNhYwotICAgIGRvbmUKLSAgZmkKLWRvbmUKLQotQUNfU1VCU1QoRU1VTCkKLQotVERJUlM9dGRpcnMKLUFDX1NVQlNUX0ZJTEUoVERJUlMpCi0KLWRubCBGSVhNRTogV2Ugd2lsbCBidWlsZCBhIDY0IGJpdCBCRkQgZm9yIGEgNjQgYml0IGhvc3Qgb3IgYSA2NCBiaXQKLWRubCB0YXJnZXQsIGFuZCBpbiB0aG9zZSBjYXNlcyB3ZSBzaG91bGQgYWxzbyBidWlsZCB0aGUgNjQgYml0Ci1kbmwgZW11bGF0aW9ucy4KLWlmIHRlc3QgeCR7YWxsX3RhcmdldHN9ID0geHRydWU7IHRoZW4KLSAgaWYgdGVzdCB4JHt3YW50NjR9ID0geHRydWU7IHRoZW4KLSAgICBFTVVMQVRJT05fT0ZJTEVTPSckKEFMTF9FTVVMQVRJT05TKSAkKEFMTF82NF9FTVVMQVRJT05TKScKLSAgZWxzZQotICAgIEVNVUxBVElPTl9PRklMRVM9JyQoQUxMX0VNVUxBVElPTlMpJwotICBmaQotICBFTVVMX0VYVFJBX09GSUxFUz0nJChBTExfRU1VTF9FWFRSQV9PRklMRVMpJwotZWxzZQotICBFTVVMQVRJT05fT0ZJTEVTPSRhbGxfZW11bHMKLSAgRU1VTF9FWFRSQV9PRklMRVM9JGFsbF9lbXVsX2V4dHJhcwotZmkKLUFDX1NVQlNUKEVNVUxBVElPTl9PRklMRVMpCi1BQ19TVUJTVChFTVVMX0VYVFJBX09GSUxFUykKLQotaWYgdGVzdCB4JHtlbmFibGVfc3RhdGljfSA9IHhubzsgdGhlbgotICBURVNUQkZETElCPSItLXJwYXRoIC4uL2JmZC8ubGlicyAuLi9iZmQvLmxpYnMvbGliYmZkLnNvIgotZWxzZQotICBURVNUQkZETElCPSIuLi9iZmQvLmxpYnMvbGliYmZkLmEiCi1maQotQUNfU1VCU1QoVEVTVEJGRExJQikKLQotQUNfT1VUUFVUKE1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCi1bc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlXSkKZGlmZiAtLWdpdCBhL2xkL2NvbmZpZ3VyZS50Z3QgYi9sZC9jb25maWd1cmUudGd0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjRmNTgyLi4wMDAwMDAwCi0tLSBhL2xkL2NvbmZpZ3VyZS50Z3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotIyBUaGlzIGlzIHRoZSBsaW5rZXIgdGFyZ2V0IHNwZWNpZmljIGZpbGUuICBUaGlzIGlzIGludm9rZWQgYnkgdGhlCi0jIGF1dG9jb25mIGdlbmVyYXRlZCBjb25maWd1cmUgc2NyaXB0LiAgUHV0dGluZyBpdCBpbiBhIHNlcGFyYXRlIHNoZWxsCi0jIGZpbGUgbGV0cyB1cyBza2lwIHJ1bm5pbmcgYXV0b2NvbmYgd2hlbiBtb2RpZnlpbmcgdGFyZ2V0IHNwZWNpZmljCi0jIGluZm9ybWF0aW9uLgotCi0jIFRoaXMgZmlsZSBzd2l0Y2hlcyBvbiB0aGUgc2hlbGwgdmFyaWFibGUgJHt0YXJnfSwgYW5kIHNldHMgdGhlCi0jIGZvbGxvd2luZyBzaGVsbCB2YXJpYWJsZXM6Ci0jICB0YXJnX2VtdWwJCW5hbWUgb2YgbGlua2VyIGVtdWxhdGlvbiB0byB1c2UKLSMgIHRhcmdfZXh0cmFfZW11bHMJYWRkaXRpb25hbCBsaW5rZXIgZW11bGF0aW9ucyB0byBwcm92aWRlCi0jICB0YXJnX2V4dHJhX29maWxlcwlhZGRpdGlvbmFsIG9iamVjdHMgbmVlZGVkIGJ5IHRoZSBlbXVsYXRpb24KLQotdGFyZ19leHRyYV9lbXVscz0KLXRhcmdfZXh0cmFfb2ZpbGVzPQotCi1jYXNlICIke3Rhcmd9IiBpbgotYXJtLWVwb2MtcGUpCQl0YXJnX2VtdWw9YXJtX2Vwb2NfcGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1hcm0tKi1wZSkJCXRhcmdfZW11bD1hcm1wZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLWFyYy0qLWVsZiopCQl0YXJnX2VtdWw9YXJjZWxmIDs7Ci1kMTB2LSotKikJCXRhcmdfZW11bD1kMTB2ZWxmIDs7Ci1kMzB2LSotKmV4dCopCQl0YXJnX2VtdWw9ZDMwdl9lOyB0YXJnX2V4dHJhX2VtdWxzPSJkMzB2ZWxmIGQzMHZfbyIgOzsKLWQzMHYtKi0qb25jaGlwKikJdGFyZ19lbXVsPWQzMHZfbzsgdGFyZ19leHRyYV9lbXVscz0iZDMwdmVsZiBkMzB2X2UiIDs7Ci1kMzB2LSotKikJCXRhcmdfZW11bD1kMzB2ZWxmOyB0YXJnX2V4dHJhX2VtdWxzPSJkMzB2X2UgZDMwdl9vIiA7Owotc3BhcmM2NC0qLWFvdXQqKQl0YXJnX2VtdWw9c3BhcmNhb3V0IDs7Ci1zcGFyYzY0LSotZWxmKikJCXRhcmdfZW11bD1lbGY2NF9zcGFyYyA7Owotc3BhcmMtc3VuLXN1bm9zNCopIAl0YXJnX2VtdWw9c3VuNCA7Owotc3BhcmNsaXRlKi0qLWVsZikJdGFyZ19lbXVsPWVsZjMyX3NwYXJjIDs7Ci1zcGFyY2xpdGUqLSotY29mZikJdGFyZ19lbXVsPWNvZmZfc3BhcmMgOzsKLXNwYXJjbGl0ZSotZnVqaXRzdS0qKQl0YXJnX2VtdWw9c3BhcmNhb3V0IDs7Ci1zcGFyYyotKi1hb3V0KQkJdGFyZ19lbXVsPXNwYXJjYW91dCA7Owotc3BhcmMqLSotY29mZikJCXRhcmdfZW11bD1jb2ZmX3NwYXJjIDs7Ci1zcGFyYyotKi1lbGYpCQl0YXJnX2VtdWw9ZWxmMzJfc3BhcmMgOzsKLXNwYXJjKi0qLXN5c3Y0KikJdGFyZ19lbXVsPWVsZjMyX3NwYXJjIDs7Ci1zcGFyYyotKi1saW51eCphb3V0KikJdGFyZ19lbXVsPXNwYXJjbGludXgKLQkJCXRhcmdfZXh0cmFfZW11bHM9ImVsZjMyX3NwYXJjIHN1bjQiCi0JCQl0ZGlyX2VsZjMyX3NwYXJjPWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvYW91dC8vJ2AKLQkJCXRkaXJfc3VuND1zcGFyYy1zdW4tc3Vub3M0Ci0JCQk7Owotc3BhcmM2NC0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGY2NF9zcGFyYwotCQkJdGFyZ19leHRyYV9lbXVscz0iZWxmMzJfc3BhcmMgc3BhcmNsaW51eCBzdW40IgotCQkJdGRpcl9lbGYzMl9zcGFyYz1gZWNobyAke3RhcmdfYWxpYXN9IHwgc2VkIC1lICdzLzY0Ly8nYAotCQkJdGRpcl9zcGFyY2xpbnV4PSR7dGRpcl9lbGYzMl9zcGFyY31hb3V0Ci0JCQl0ZGlyX3N1bjQ9c3BhcmMtc3VuLXN1bm9zNAotCQkJOzsKLXNwYXJjKi0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGYzMl9zcGFyYwotCQkJdGFyZ19leHRyYV9lbXVscz0ic3BhcmNsaW51eCBzdW40IgotCQkJdGRpcl9zcGFyY2xpbnV4PSR7dGFyZ19hbGlhc31hb3V0Ci0JCQl0ZGlyX3N1bjQ9c3BhcmMtc3VuLXN1bm9zNAotCQkJOzsKLXNwYXJjKi0qLWx5bnhvcyopCXRhcmdfZW11bD1zcGFyY2x5bnggOzsKLXNwYXJjKi0qLW5ldGJzZCopCXRhcmdfZW11bD1zcGFyY25ic2QgOzsKLXNwYXJjKi0qLXNvbGFyaXMyKikJdGFyZ19lbXVsPWVsZjMyX3NwYXJjIDs7Ci1zcGFyYyotd3JzLXZ4d29ya3MqKQl0YXJnX2VtdWw9c3BhcmNhb3V0IDs7Ci1zcGFyYyotKi1ydGVtcyopCXRhcmdfZW11bD1zcGFyY2FvdXQgOzsKLWk5NjAtd3JzLXZ4d29ya3M1LjAqKQl0YXJnX2VtdWw9Z2xkOTYwIDs7Ci1pOTYwLXdycy12eHdvcmtzNSopCXRhcmdfZW11bD1nbGQ5NjBjb2ZmIDs7Ci1pOTYwLXdycy12eHdvcmtzKikJdGFyZ19lbXVsPWdsZDk2MCA7OwotaTk2MC0qLWNvZmYpCQl0YXJnX2VtdWw9Z2xkOTYwY29mZiA7OwotaTk2MC1pbnRlbC1uaW5keSkJdGFyZ19lbXVsPWdsZDk2MCA7OwotaTk2MC0qLXJ0ZW1zKikJCXRhcmdfZW11bD1nbGQ5NjBjb2ZmIDs7Ci1tMzJyLSotKikJCXRhcmdfZW11bD1tMzJyZWxmIDs7Ci1tNjgqLXN1bi1zdW5vc1szNF0qKQl0YXJnX2VtdWw9c3VuMyA7OwotbTY4Ki13cnMtdnh3b3JrcyopCXRhcmdfZW11bD1zdW4zIDs7Ci1tNjgqLWVyaWNzc29uLW9zZSkJdGFyZ19lbXVsPXN1bjMgOzsKLW02OCotYXBwbGUtYXV4KikJdGFyZ19lbXVsPW02OGthdXggOzsKLSotdGFuZGVtLW5vbmUpCQl0YXJnX2VtdWw9c3QyMDAwIDs7Ci1pWzM0NTZdODYtKi12c3RhKQl0YXJnX2VtdWw9dnN0YSA7OwotaVszNDU2XTg2LWdvMzItcnRlbXMqKQl0YXJnX2VtdWw9aTM4NmdvMzIgOzsKLWlbMzQ1Nl04Ni0qLWdvMzIpCXRhcmdfZW11bD1pMzg2Z28zMiA7OwotaVszNDU2XTg2LSotbXNkb3NkamdwcCopIHRhcmdfZW11bD1pMzg2Z28zMiA7OwotaVszNDU2XTg2LSotYWl4KikJdGFyZ19lbXVsPWkzODZjb2ZmIDs7Ci1pWzM0NTZdODYtKi1zY28qKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKLWlbMzQ1Nl04Ni0qLWlzYyopCXRhcmdfZW11bD1pMzg2Y29mZiA7OwotaVszNDU2XTg2LSotbHlueG9zKikJdGFyZ19lbXVsPWkzODZseW54IDs7Ci1pWzM0NTZdODYtKi1jb2ZmKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKLWlbMzQ1Nl04Ni0qLXJ0ZW1zZWxmKikgIHRhcmdfZW11bD1lbGZfaTM4NiA7OwotaVszNDU2XTg2LSotcnRlbXMqKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKLWlbMzQ1Nl04Ni0qLWJzZCkJdGFyZ19lbXVsPWkzODZic2QgOzsKLWlbMzQ1Nl04Ni0qLWJzZDM4NikJdGFyZ19lbXVsPWkzODZic2QgOzsKLWlbMzQ1Nl04Ni0qLWJzZGkqKQl0YXJnX2VtdWw9aTM4NmJzZCA7OwotaVszNDU2XTg2LSotYW91dCkJdGFyZ19lbXVsPWkzODZhb3V0IDs7Ci1pWzM0NTZdODYtKi1saW51eCphb3V0KikJdGFyZ19lbXVsPWkzODZsaW51eAotCQkJdGFyZ19leHRyYV9lbXVscz1lbGZfaTM4NgotCQkJdGRpcl9lbGZfaTM4Nj1gZWNobyAke3RhcmdfYWxpYXN9IHwgc2VkIC1lICdzL2FvdXQvLydgCi0JCQk7OwotaVszNDU2XTg2LSotbGludXhvbGRsZCkJdGFyZ19lbXVsPWkzODZsaW51eDsgdGFyZ19leHRyYV9lbXVscz1lbGZfaTM4NiA7OwotaVszNDU2XTg2LSotbGludXgtZ251KikJdGFyZ19lbXVsPWVsZl9pMzg2Ci0JCQl0YXJnX2V4dHJhX2VtdWxzPWkzODZsaW51eAotCQkJdGRpcl9pMzg2bGludXg9JHt0YXJnX2FsaWFzfWFvdXQKLQkJCTs7Ci1pWzM0NTZdODYtKi1zeXN2NCopCXRhcmdfZW11bD1lbGZfaTM4NiA7OwotaVszNDU2XTg2LSotc29sYXJpczIqKQl0YXJnX2VtdWw9ZWxmX2kzODYgOzsKLWlbMzQ1Nl04Ni0qLXVuaXh3YXJlKQl0YXJnX2VtdWw9ZWxmX2kzODYgOzsKLWlbMzQ1Nl04Ni0qLXNvbGFyaXMqKQl0YXJnX2VtdWw9ZWxmX2kzODYgOzsKLWlbMzQ1Nl04Ni0qLW5ldGJzZCopCXRhcmdfZW11bD1pMzg2bmJzZCA7OwotaVszNDU2XTg2LSotbmV0d2FyZSkJdGFyZ19lbXVsPWkzODZudyA7OwotaVszNDU2XTg2LSotZWxmKikJdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1mcmVlYnNkZWxmKikgdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1mcmVlYnNkKikJdGFyZ19lbXVsPWkzODZic2QgOzsKLWlbMzQ1Nl04Ni0qLXN5c3YqKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKLWlbMzQ1Nl04Ni0qLXB0eCopCXRhcmdfZW11bD1pMzg2Y29mZiA7OwotaVszNDU2XTg2LSotbWFjaCopCXRhcmdfZW11bD1pMzg2bWFjaCA7OwotaVszNDU2XTg2LSotZ251KikJdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1tc2RvcyopCXRhcmdfZW11bD1pMzg2bXNkb3M7IHRhcmdfZXh0cmFfZW11bHM9aTM4NmFvdXQgOzsKLWlbMzQ1Nl04Ni0qLW1vc3MqKQl0YXJnX2VtdWw9aTM4Nm1vc3M7IHRhcmdfZXh0cmFfZW11bHM9aTM4Nm1zZG9zIDs7Ci1pWzM0NTZdODYtKi13aW5udCopCXRhcmdfZW11bD1pMzg2cGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1pWzM0NTZdODYtKi1wZSkJCXRhcmdfZW11bD1pMzg2cGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1pWzM0NTZdODYtKi1jeWd3aW4qKQl0YXJnX2VtdWw9aTM4NnBlIDsKLQkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OwotaVszNDU2XTg2LSotbWluZ3czMiopCXRhcmdfZW11bD1pMzg2cGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1pWzM0NTZdODYtKi1iZW9zcGUqKSAgICB0YXJnX2VtdWw9aTM4NmJlb3MgOzsKLWlbMzQ1Nl04Ni0qLWJlb3MqKQl0YXJnX2VtdWw9ZWxmX2kzODZfYmUgOzsKLW04Ki0qLSopCQl0YXJnX2VtdWw9bTg4a2JjcyA7OwotYTI5ay0qLXVkaSkJCXRhcmdfZW11bD1zYTI5MjAwIDs7Ci1hMjlrLSotZWJtb24pCQl0YXJnX2VtdWw9ZWJtb24yOWsgOzsKLWEyOWstKi0qKQkJdGFyZ19lbXVsPWEyOWsgOzsKLSMgIGFybS0qLXJpc2NpeCopCQl0YXJnX2VtdWw9cmlzY2l4IDs7Ci1hcm0tKi1hb3V0IHwgYXJtZWwtKi1hb3V0KSB0YXJnX2VtdWw9YXJtYW91dGwgOzsKLWFybWViLSotYW91dCkJCXRhcmdfZW11bD1hcm1hb3V0YiA7OwotYXJtLSotY29mZikJCXRhcmdfZW11bD1hcm1jb2ZmIDs7Ci1hcm0tKi1lbGYpCQl0YXJnX2VtdWw9YXJtZWxmIDs7Ci1hcm0tKi1vYWJpKSAgICAgICAgICAgICB0YXJnX2VtdWw9YXJtZWxmX29hYmkgOzsKLWFybSotKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9YXJtZWxmX2xpbnV4OyB0YXJnX2V4dHJhX2VtdWxzPSJhcm1lbGZfbGludXgyNiBhcm1lbGYiOzsKLXN0cm9uZ2FybS0qLWNvZmYpCXRhcmdfZW11bD1hcm1jb2ZmIDs7Ci1zdHJvbmdhcm0tKi1lbGYpCXRhcmdfZW11bD1hcm1lbGYgOzsKLXRodW1iLSotY29mZikJCXRhcmdfZW11bD1hcm1jb2ZmIDs7Ci10aHVtYi0qLWVsZikJCXRhcmdfZW11bD1hcm1lbGYgOzsKLXRodW1iLSotb2FiaSkgICAgICAgICAgIHRhcmdfZW11bD1hcm1lbGZfb2FiaSA7OwotdGh1bWItZXBvYy1wZSkJCXRhcmdfZW11bD1hcm1fZXBvY19wZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLXRodW1iLSotcGUpCQl0YXJnX2VtdWw9YXJtcGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1oODMwMC0qLWhtcyogfCBoODMwMC0qLWNvZmYqKQotCQkJdGFyZ19lbXVsPWg4MzAwOyB0YXJnX2V4dHJhX2VtdWxzPSJoODMwMGggaDgzMDBzIgotCQkJOzsKLWg4NTAwLSotaG1zKiB8IGg4NTAwLSotY29mZiopCi0JCQl0YXJnX2VtdWw9aDg1MDAKLQkJCXRhcmdfZXh0cmFfZW11bHM9Img4NTAwcyBoODUwMGIgaDg1MDBtIGg4NTAwYyIKLQkJCTs7Ci1zaC0qLWVsZiogfCBzaC0qLXJ0ZW1zZWxmKikKLQkJCXRhcmdfZW11bD1zaGVsZgotCQkJdGFyZ19leHRyYV9lbXVscz0ic2hsZWxmIHNoIHNobCIKLQkJCTs7Ci1zaC0qLSp8c2gtKi1ydGVtcyopCXRhcmdfZW11bD1zaDsgdGFyZ19leHRyYV9lbXVscz1zaGwgOzsKLW02OGstc29ueS0qKQkJdGFyZ19lbXVsPW5ld3MgOzsKLW02OGstaHAtYnNkKikJCXRhcmdfZW11bD1ocDMwMGJzZCA7OwotbTY4Ki1tb3Rvcm9sYS1zeXN2KikJdGFyZ19lbXVsPWRlbHRhNjggOzsKLW02OCotKi1hb3V0KQkJdGFyZ19lbXVsPW02OGthb3V0IDs7Ci1tNjgqLSotY29mZikJCXRhcmdfZW11bD1tNjhrY29mZiA7OwotbTY4Ki0qLWVsZikJCXRhcmdfZW11bD1tNjhrZWxmIDs7Ci1tNjgqLSotaHB1eCopCQl0YXJnX2VtdWw9aHAzaHB1eCA7OwotbTY4ay0qLWxpbnV4KmFvdXQqKQl0YXJnX2VtdWw9bTY4a2xpbnV4Ci0JCQl0YXJnX2V4dHJhX2VtdWxzPW02OGtlbGYKLQkJCXRkaXJfbTY4a2VsZj1gZWNobyAke3RhcmdfYWxpYXN9IHwgc2VkIC1lICdzL2FvdXQvLydgCi0JCQk7OwotbTY4ay0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1tNjhrZWxmCi0JCQl0YXJnX2V4dHJhX2VtdWxzPW02OGtsaW51eAotCQkJdGRpcl9tNjhrbGludXg9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy9saW51eC9saW51eGFvdXQvJ2AKLQkJCTs7Ci1tNjgqLSotZ251KikJCXRhcmdfZW11bD1tNjhrZWxmIDs7Ci1tNjgqLSotbHlueG9zKikJCXRhcmdfZW11bD1tNjhrbHlueCA7OwotbTY4Ki1ocCotbmV0YnNkKikJdGFyZ19lbXVsPW02OGs0a25ic2QgOzsKLW02OCotKi1uZXRic2QqKQkJdGFyZ19lbXVsPW02OGtuYnNkIDs7Ci1tNjgqLSotcHNvcyopCQl0YXJnX2VtdWw9bTY4a3Bzb3MgOzsKLW02OCotKi1ydGVtcyopCQl0YXJnX2VtdWw9bTY4a2NvZmYgOzsKLWhwcGEqLSotKmVsZiopCQl0YXJnX2VtdWw9aHBwYWVsZiA7OwotaHBwYSotKi1saXRlcyopCQl0YXJnX2VtdWw9aHBwYWVsZiA7OwotaHBwYSotKi1ydGVtcyopCQl0YXJnX2VtdWw9aHBwYWVsZiA7OwotdmF4LWRlYy11bHRyaXgqIHwgdmF4LWRlYy1ic2QqKSB0YXJnX2VtdWw9dmF4IDs7Ci1taXBzKi1kZWMtdWx0cml4KikJdGFyZ19lbXVsPW1pcHNsaXQgOzsKLW1pcHMqLWRlYy1vc2YqKQkJdGFyZ19lbXVsPW1pcHNsaXQgOzsKLW1pcHMqLXNnaS1pcml4WzU2XSopCXRhcmdfZW11bD1lbGYzMmJzbWlwIDs7Ci1taXBzKi1zZ2ktaXJpeCopCXRhcmdfZW11bD1taXBzYmlnIDs7Ci1taXBzKmVsLSotZWNvZmYqKQl0YXJnX2VtdWw9bWlwc2lkdGwgOzsKLW1pcHMqLSotZWNvZmYqKQkJdGFyZ19lbXVsPW1pcHNpZHQgOzsKLW1pcHMqLWRlYy1ic2QqKQkJdGFyZ19lbXVsPW1pcHNic2QgOzsKLW1pcHMqLWRlYy1uZXRic2QqKQl0YXJnX2VtdWw9ZWxmMzJsbWlwIDs7Ci1taXBzKi0qLWJzZCopCQl0YXJnX2VtdWw9bWlwc2JpZyA7OwotbWlwcyp2cjQzMDBlbC0qLWVsZiopCXRhcmdfZW11bD1lbGYzMmw0MzAwIDs7Ci1taXBzKnZyNDMwMC0qLWVsZiopCXRhcmdfZW11bD1lbGYzMmI0MzAwIDs7Ci1taXBzKnZyNDEwMGVsLSotZWxmKikJdGFyZ19lbXVsPWVsZjMybDQzMDAgOzsKLW1pcHMqdnI0MTAwLSotZWxmKikJdGFyZ19lbXVsPWVsZjMyYjQzMDAgOzsKLW1pcHMqdnI1MDAwZWwtKi1lbGYqKQl0YXJnX2VtdWw9ZWxmMzJsNDMwMCA7OwotbWlwcyp2cjUwMDAtKi1lbGYqKQl0YXJnX2VtdWw9ZWxmMzJiNDMwMCA7OwotbWlwcyplbC0qLWVsZiopCQl0YXJnX2VtdWw9ZWxmMzJlbG1pcCA7OwotbWlwcyotKi1lbGYqKQkJdGFyZ19lbXVsPWVsZjMyZWJtaXAgOzsKLW1pcHMqZWwtKi1ydGVtcyopCXRhcmdfZW11bD1lbGYzMmVsbWlwIDs7Ci1taXBzKi0qLXJ0ZW1zKikJCXRhcmdfZW11bD1lbGYzMmVibWlwIDs7Ci1taXBzKi0qLXZ4d29ya3MqKQl0YXJnX2VtdWw9ZWxmMzJlYm1pcCA7OwotbWlwcyplbC0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGYzMmxzbWlwCi0JCQl0YXJnX2V4dHJhX2VtdWxzPSJlbGYzMmJzbWlwIG1pcHNsaXQgbWlwc2JpZyIKLQkJCTs7Ci1taXBzKi0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGYzMmJzbWlwCi0JCQl0YXJnX2V4dHJhX2VtdWxzPSJlbGYzMmxzbWlwIG1pcHNiaWcgbWlwc2xpdCIKLQkJCTs7Ci1taXBzKi0qLWxuZXdzKikJCXRhcmdfZW11bD1taXBzbG5ld3MgOzsKLW1uMTAyMDAtKi0qKQkJdGFyZ19lbXVsPW1uMTAyMDAgOzsKLW1uMTAzMDAtKi0qKQkJdGFyZ19lbXVsPW1uMTAzMDAgOzsKLWFscGhhKi0qLWxpbnV4ZWNvZmYqKQl0YXJnX2VtdWw9YWxwaGEgdGFyZ19leHRyYV9lbXVscz1lbGY2NGFscGhhCi0JCQl0ZGlyX2VsZjY0YWxwaGE9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy9lY29mZi8vJ2AKLQkJCTs7Ci1hbHBoYSotKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9ZWxmNjRhbHBoYSB0YXJnX2V4dHJhX2VtdWxzPWFscGhhCi0JCQl0ZGlyX2FscGhhPWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvbGludXgvbGludXhlY29mZi8nYAotCQkJOzsKLWFscGhhKi0qLW9zZiopCQl0YXJnX2VtdWw9YWxwaGEgOzsKLWFscGhhKi0qLWdudSopCQl0YXJnX2VtdWw9ZWxmNjRhbHBoYSA7OwotYWxwaGEqLSotbmV0d2FyZSopCXRhcmdfZW11bD1hbHBoYSA7OwotYWxwaGEqLSotbmV0YnNkKikJdGFyZ19lbXVsPWVsZjY0YWxwaGEgOzsKLXo4ay0qLWNvZmYpIAkJdGFyZ19lbXVsPXo4MDAyOyB0YXJnX2V4dHJhX2VtdWxzPXo4MDAxIDs7Ci1uczMyay1wYzUzMi1tYWNoKiB8IG5zMzJrLXBjNTMyLXV4KikJdGFyZ19lbXVsPXBjNTMybWFjaGEgOzsKLW5zMzJrLXBjNTMyLW5ldGJzZCogfCBuczMyay1wYzUzMi1saXRlcyopIHRhcmdfZW11bD1uczMya25ic2QgOzsKLXBvd2VycGMtKi1lbGYqIHwgcG93ZXJwYy0qLWVhYmkqIHwgcG93ZXJwYy0qLWxpbnV4LWdudSogfCBwb3dlcnBjLSotc3lzdiogXAotICB8IHBvd2VycGMtKi1uZXRic2QqIHwgcG93ZXJwYy0qLXZ4d29ya3MqKQotCXRhcmdfZW11bD1lbGYzMnBwYyA7OwotcG93ZXJwY2xlLSotZWxmKiB8IHBvd2VycGNsZS0qLWVhYmkqIHwgcG93ZXJwY2xlLSotc29sYXJpcyogXAotICB8IHBvd2VycGNsZS0qLXN5c3YqIHwgcG93ZXJwY2xlLSotdnh3b3JrcyopCi0JdGFyZ19lbXVsPWVsZjMybHBwYyA7OwotcG93ZXJwY2xlLSotcnRlbXMqKQl0YXJnX2VtdWw9ZWxmMzJsZXBwYyA7OwotcG93ZXJwYy0qLXJ0ZW1zKikJdGFyZ19lbXVsPWVsZjMycHBjIDs7Ci1wb3dlcnBjLSotbWFjb3MqKQl0YXJnX2VtdWw9cHBjbWFjb3MgOzsKLXBvd2VycGMtKi1uZXR3YXJlKikJdGFyZ19lbXVsPXBwY253IDs7Ci1wb3dlcnBjbGUtKi1wZSkgICAgICAgICB0YXJnX2VtdWw9cHBjcGUgOzsKLXBvd2VycGNsZS0qLXdpbm50KikgICAgIHRhcmdfZW11bD1wcGNwZSA7OwotcG93ZXJwY2xlLSotY3lnd2luKikgICB0YXJnX2VtdWw9cHBjcGUgOzsKLXBvd2VycGMtKi1haXgqKQkJdGFyZ19lbXVsPWFpeHBwYyA7OwotcG93ZXJwYy0qLWJlb3MqKQl0YXJnX2VtdWw9YWl4cHBjIDs7Ci1yczYwMDAtKi1haXgqKQkJdGFyZ19lbXVsPWFpeHJzNiA7OwotdGljMzAtKi0qYW91dCopCQl0YXJnX2VtdWw9dGljMzBhb3V0IDs7Ci10aWMzMC0qLSpjb2ZmKikJCXRhcmdfZW11bD10aWMzMGNvZmYgOzsKLXRpYzgwLSotKikJCXRhcmdfZW11bD10aWM4MGNvZmYgOzsKLXY4NTAtKi0qKQkJdGFyZ19lbXVsPXY4NTAgOzsKLXY4NTBlLSotKikJCXRhcmdfZW11bD12ODUwIDs7Ci12ODUwZWEtKi0qKQkJdGFyZ19lbXVsPXY4NTAgOzsKLXc2NS0qLSopCQl0YXJnX2VtdWw9dzY1IDs7Ci1mcjMwLSotKikJCXRhcmdfZW11bD1lbGYzMmZyMzAgOzsKLW1jb3JlLSotcGUpCQl0YXJnX2VtdWw9bWNvcmVwZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLW1jb3JlLSotZWxmKQkJdGFyZ19lbXVsPWVsZjMybWNvcmUgOzsKLSotKi1hb3V0KQkJdGFyZ19lbXVsPSR7dGFyZ2V0X2NwdX0tJHt0YXJnZXRfdmVuZG9yfSA7OwotKi0qLWNvZmYpCQl0YXJnX2VtdWw9JHt0YXJnZXRfY3B1fS0ke3RhcmdldF92ZW5kb3J9IDs7Ci0qLSotbmV0d2FyZSkJCXRhcmdfZW11bD0ke3RhcmdldF9jcHV9LW53IDs7Ci0qLSotaWVlZSopCQl0YXJnX2VtdWw9dmFuaWxsYSA7OwotCi0qKQotICBlY2hvIDI+JjEgIioqKiBsZCBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldCAke3Rhcmd9IgotICBlY2hvIDI+JjEgIioqKiBzZWUgbGQvY29uZmlndXJlLnRndCBmb3Igc3VwcG9ydGVkIHRhcmdldHMiCi0gIGV4aXQgMQotCi1lc2FjCmRpZmYgLS1naXQgYS9sZC9kZWZmaWxlLmggYi9sZC9kZWZmaWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNmMxY2UuLjAwMDAwMDAKLS0tIGEvbGQvZGVmZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qIGRlZmZpbGUuaCAtIGhlYWRlciBmb3IgLkRFRiBmaWxlIHBhcnNlcgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBESiBEZWxvcmllIGRqQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIERFRiBzdG9yYWdlIGRlZmluaXRpb25zLiAgTm90ZSB0aGF0IGFueSBvcmRpbmFsIG1heSBiZSB6ZXJvLCBhbmQKLSAgIGFueSBwb2ludGVyIG1heSBiZSBOVUxMLCBpZiBub3QgZGVmaW5lZCBieSB0aGUgREVGIGZpbGUuICovCi0KLXR5cGVkZWYgc3RydWN0IGRlZl9maWxlX3NlY3Rpb24KLSAgewotICAgIGNoYXIgKm5hbWU7CQkJLyogYWx3YXlzIHNldCAqLwotICAgIGNoYXIgKmNsYXNzOwkJLyogbWF5IGJlIE5VTEwgKi8KLSAgICBjaGFyIGZsYWdfcmVhZCwgZmxhZ193cml0ZSwgZmxhZ19leGVjdXRlLCBmbGFnX3NoYXJlZDsKLSAgfQotZGVmX2ZpbGVfc2VjdGlvbjsKLQotdHlwZWRlZiBzdHJ1Y3QgZGVmX2ZpbGVfZXhwb3J0Ci0gIHsKLSAgICBjaGFyICpuYW1lOwkJCS8qIGFsd2F5cyBzZXQgKi8KLSAgICBjaGFyICppbnRlcm5hbF9uYW1lOwkvKiBhbHdheXMgc2V0LCBtYXkgPT0gbmFtZSAqLwotICAgIGludCBvcmRpbmFsOwkJLyogLTEgaWYgbm90IHNwZWNpZmllZCAqLwotICAgIGludCBoaW50OwotICAgIGNoYXIgZmxhZ19wcml2YXRlLCBmbGFnX2NvbnN0YW50LCBmbGFnX25vbmFtZSwgZmxhZ19kYXRhOwotICB9Ci1kZWZfZmlsZV9leHBvcnQ7Ci0KLXR5cGVkZWYgc3RydWN0IGRlZl9maWxlX21vZHVsZQotICB7Ci0gICAgc3RydWN0IGRlZl9maWxlX21vZHVsZSAqbmV4dDsKLSAgICB2b2lkICp1c2VyX2RhdGE7Ci0gICAgY2hhciBuYW1lWzFdOyAvKiBleHRlbmRlZCB2aWEgbWFsbG9jICovCi0gIH0KLWRlZl9maWxlX21vZHVsZTsKLQotdHlwZWRlZiBzdHJ1Y3QgZGVmX2ZpbGVfaW1wb3J0Ci0gIHsKLSAgICBjaGFyICppbnRlcm5hbF9uYW1lOwkvKiBhbHdheXMgc2V0ICovCi0gICAgZGVmX2ZpbGVfbW9kdWxlICptb2R1bGU7CS8qIGFsd2F5cyBzZXQgKi8KLSAgICBjaGFyICpuYW1lOwkJCS8qIG1heSBiZSBOVUxMOyBlaXRoZXIgdGhpcyBvciBvcmRpbmFsIHdpbGwgYmUgc2V0ICovCi0gICAgaW50IG9yZGluYWw7CQkvKiBtYXkgYmUgLTEgKi8KLSAgfQotZGVmX2ZpbGVfaW1wb3J0OwotCi10eXBlZGVmIHN0cnVjdCBkZWZfZmlsZQotICB7Ci0KLSAgICAvKiBmcm9tIHRoZSBOQU1FIG9yIExJQlJBUlkgY29tbWFuZCAqLwotICAgIGNoYXIgKm5hbWU7Ci0gICAgaW50IGlzX2RsbDsJCQkvKiAtMSBpZiBOQU1FL0xJQlJBUlkgbm90IGdpdmVuICovCi0gICAgYmZkX3ZtYSBiYXNlX2FkZHJlc3M7CS8qIChiZmRfdm1hKSgtMSkgaWYgdW5zcGVjaWZpZWQgKi8KLQotICAgIC8qIGZyb20gdGhlIERFU0NSSVBUSU9OIGNvbW1hbmQgKi8KLSAgICBjaGFyICpkZXNjcmlwdGlvbjsKLQotICAgIC8qIGZyb20gdGhlIFNUQUNLL0hFQVAgY29tbWFuZCwgLTEgaWYgdW5zcGVjaWZpZWQgKi8KLSAgICBpbnQgc3RhY2tfcmVzZXJ2ZSwgc3RhY2tfY29tbWl0OwotICAgIGludCBoZWFwX3Jlc2VydmUsIGhlYXBfY29tbWl0OwotCi0gICAgLyogZnJvbSB0aGUgU0VDVElPTi9TRUdNRU5UIGNvbW1hbmRzICovCi0gICAgaW50IG51bV9zZWN0aW9uX2RlZnM7Ci0gICAgZGVmX2ZpbGVfc2VjdGlvbiAqc2VjdGlvbl9kZWZzOwotCi0gICAgLyogZnJvbSB0aGUgRVhQT1JUUyBjb21tYW5kcyAqLwotICAgIGludCBudW1fZXhwb3J0czsKLSAgICBkZWZfZmlsZV9leHBvcnQgKmV4cG9ydHM7Ci0KLSAgICAvKiB1c2VkIGJ5IGltcG9ydHMgZm9yIG1vZHVsZSBuYW1lcyAqLwotICAgIGRlZl9maWxlX21vZHVsZSAqbW9kdWxlczsKLQotICAgIC8qIGZyb20gdGhlIElNUE9SVFMgY29tbWFuZHMgKi8KLSAgICBpbnQgbnVtX2ltcG9ydHM7Ci0gICAgZGVmX2ZpbGVfaW1wb3J0ICppbXBvcnRzOwotCi0gICAgLyogZnJvbSB0aGUgVkVSU0lPTiBjb21tYW5kLCAtMSBpZiBub3Qgc3BlY2lmaWVkICovCi0gICAgaW50IHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3I7Ci0gIH0KLWRlZl9maWxlOwotCi1leHRlcm4gZGVmX2ZpbGUgKmRlZl9maWxlX2VtcHR5IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogYWRkX3RvIG1heSBiZSBOVUxMLiAgSWYgbm90LCB0aGlzIC5kZWYgaXMgYXBwZW5kZWQgdG8gaXQgKi8KLWV4dGVybiBkZWZfZmlsZSAqZGVmX2ZpbGVfcGFyc2UgUEFSQU1TICgoY29uc3QgY2hhciAqX2ZpbGVuYW1lLAotCQkJCQkgZGVmX2ZpbGUgKiBfYWRkX3RvKSk7Ci0KLWV4dGVybiB2b2lkIGRlZl9maWxlX2ZyZWUgUEFSQU1TICgoZGVmX2ZpbGUgKiBfZGVmKSk7Ci0KLWV4dGVybiBkZWZfZmlsZV9leHBvcnQgKmRlZl9maWxlX2FkZF9leHBvcnQgUEFSQU1TICgoZGVmX2ZpbGUgKiBfZGVmLAotCQkJCQkJICAgICBjb25zdCBjaGFyICpfbmFtZSwKLQkJCQkJCSBjb25zdCBjaGFyICpfaW50ZXJuYWxfbmFtZSwKLQkJCQkJCSAgICAgaW50IF9vcmRpbmFsKSk7Ci0KLWV4dGVybiBkZWZfZmlsZV9pbXBvcnQgKmRlZl9maWxlX2FkZF9pbXBvcnQgUEFSQU1TICgoZGVmX2ZpbGUgKiBfZGVmLAotCQkJCQkJICAgICBjb25zdCBjaGFyICpfbmFtZSwKLQkJCQkJCSAgICAgY29uc3QgY2hhciAqX2Zyb20sCi0JCQkJCQkgICAgIGludCBfb3JkaW5hbCwKLQkJCQkJICAgICAgIGNvbnN0IGNoYXIgKl9pbXBvcnRlZF9uYW1lKSk7Ci0KLWV4dGVybiB2b2lkIGRlZl9maWxlX2FkZF9kaXJlY3RpdmUgUEFSQU1TICgoZGVmX2ZpbGUgKiBfZGVmLAotCQkJCQkgICAgY29uc3QgY2hhciAqcGFyYW0sCi0JCQkJCSAgICBpbnQgbGVuKSk7Ci0KLSNpZmRlZiBERUZfRklMRV9QUklOVAotZXh0ZXJuIHZvaWQgZGVmX2ZpbGVfcHJpbnQgUEFSQU1TICgoRklMRSAqIF9maWxlLAotCQkJCSAgICBkZWZfZmlsZSAqIF9kZWYpKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvZGVmZmlsZXAueSBiL2xkL2RlZmZpbGVwLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhY2RlNmIuLjAwMDAwMDAKLS0tIGEvbGQvZGVmZmlsZXAueQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDQgKzAsMCBAQAotJXsgLyogZGVmZmlsZXAueSAtIHBhcnNlciBmb3IgLmRlZiBmaWxlcyAqLwotCi0vKiAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAiZGVmZmlsZS5oIgotCi0jZGVmaW5lIFRSQUNFIDAKLQotI2RlZmluZSBST1VORF9VUChhLCBiKSAoKChhKSsoKGIpLTEpKSZ+KChiKS0xKSkKLQotLyogUmVtYXAgbm9ybWFsIHlhY2MgcGFyc2VyIGludGVyZmFjZSBuYW1lcyAoeXlwYXJzZSwgeXlsZXgsIHl5ZXJyb3IsIGV0YyksCi0gICBhcyB3ZWxsIGFzIGdyYXR1aXRpb3VzbHkgZ2xvYmFsIHN5bWJvbCBuYW1lcywgc28gd2UgY2FuIGhhdmUgbXVsdGlwbGUKLSAgIHlhY2MgZ2VuZXJhdGVkIHBhcnNlcnMgaW4gbGQuICBOb3RlIHRoYXQgdGhlc2UgYXJlIG9ubHkgdGhlIHZhcmlhYmxlcwotICAgcHJvZHVjZWQgYnkgeWFjYy4gIElmIG90aGVyIHBhcnNlciBnZW5lcmF0b3JzIChiaXNvbiwgYnlhY2MsIGV0YykgcHJvZHVjZQotICAgYWRkaXRpb25hbCBnbG9iYWwgbmFtZXMgdGhhdCBjb25mbGljdCBhdCBsaW5rIHRpbWUsIHRoZW4gdGhvc2UgcGFyc2VyCi0gICBnZW5lcmF0b3JzIG5lZWQgdG8gYmUgZml4ZWQgaW5zdGVhZCBvZiBhZGRpbmcgdGhvc2UgbmFtZXMgdG8gdGhpcyBsaXN0LiAqLwotCi0jZGVmaW5lCXl5bWF4ZGVwdGggZGVmX21heGRlcHRoCi0jZGVmaW5lCXl5cGFyc2UJZGVmX3BhcnNlCi0jZGVmaW5lCXl5bGV4CWRlZl9sZXgKLSNkZWZpbmUJeXllcnJvcglkZWZfZXJyb3IKLSNkZWZpbmUJeXlsdmFsCWRlZl9sdmFsCi0jZGVmaW5lCXl5Y2hhcglkZWZfY2hhcgotI2RlZmluZQl5eWRlYnVnCWRlZl9kZWJ1ZwotI2RlZmluZQl5eXBhY3QJZGVmX3BhY3QJCi0jZGVmaW5lCXl5cjEJZGVmX3IxCQkJCi0jZGVmaW5lCXl5cjIJZGVmX3IyCQkJCi0jZGVmaW5lCXl5ZGVmCWRlZl9kZWYJCQotI2RlZmluZQl5eWNoawlkZWZfY2hrCQkKLSNkZWZpbmUJeXlwZ28JZGVmX3BnbwkJCi0jZGVmaW5lCXl5YWN0CWRlZl9hY3QJCQotI2RlZmluZQl5eWV4Y2EJZGVmX2V4Y2EKLSNkZWZpbmUgeXllcnJmbGFnIGRlZl9lcnJmbGFnCi0jZGVmaW5lIHl5bmVycnMJZGVmX25lcnJzCi0jZGVmaW5lCXl5cHMJZGVmX3BzCi0jZGVmaW5lCXl5cHYJZGVmX3B2Ci0jZGVmaW5lCXl5cwlkZWZfcwotI2RlZmluZQl5eV95eXMJZGVmX3l5cwotI2RlZmluZQl5eXN0YXRlCWRlZl9zdGF0ZQotI2RlZmluZQl5eXRtcAlkZWZfdG1wCi0jZGVmaW5lCXl5dglkZWZfdgotI2RlZmluZQl5eV95eXYJZGVmX3l5dgotI2RlZmluZQl5eXZhbAlkZWZfdmFsCi0jZGVmaW5lCXl5bGxvYwlkZWZfbGxvYwotI2RlZmluZSB5eXJlZHMJZGVmX3JlZHMJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5dG9rcwlkZWZfdG9rcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KLSNkZWZpbmUgeXlsaHMJZGVmX3l5bGhzCi0jZGVmaW5lIHl5bGVuCWRlZl95eWxlbgotI2RlZmluZSB5eWRlZnJlZCBkZWZfeXlkZWZyZWQKLSNkZWZpbmUgeXlkZ290bwlkZWZfeXlkZ290bwotI2RlZmluZSB5eXNpbmRleCBkZWZfeXlzaW5kZXgKLSNkZWZpbmUgeXlyaW5kZXggZGVmX3l5cmluZGV4Ci0jZGVmaW5lIHl5Z2luZGV4IGRlZl95eWdpbmRleAotI2RlZmluZSB5eXRhYmxlCSBkZWZfeXl0YWJsZQotI2RlZmluZSB5eWNoZWNrCSBkZWZfeXljaGVjawotCi1zdGF0aWMgaW50IGRlZl9sZXggKCk7Ci0KLXN0YXRpYyB2b2lkIGRlZl9kZXNjcmlwdGlvbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRlZl9leHBvcnRzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgZGVmX2hlYXBzaXplIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfaW1wb3J0Ci0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfbGlicmFyeSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgZGVmX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRlZl9zZWN0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfc2VjdGlvbl9hbHQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRlZl9zdGFja3NpemUgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRlZl92ZXJzaW9uIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfZGlyZWN0aXZlIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGludCBkZWZfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBkZWZfZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IGRlZl9kZWJ1ZzsKLXN0YXRpYyBpbnQgZGVmX2xleCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBpbnQgbGV4X2ZvcmNlZF90b2tlbiA9IDA7Ci1zdGF0aWMgY29uc3QgY2hhciAqbGV4X3BhcnNlX3N0cmluZyA9IDA7Ci1zdGF0aWMgY29uc3QgY2hhciAqbGV4X3BhcnNlX3N0cmluZ19lbmQgPSAwOwotCi0lfQotCi0ldW5pb24gewotICBjaGFyICppZDsKLSAgaW50IG51bWJlcjsKLX07Ci0KLSV0b2tlbiBOQU1FLCBMSUJSQVJZLCBERVNDUklQVElPTiwgU1RBQ0tTSVpFLCBIRUFQU0laRSwgQ09ERSwgREFUQQotJXRva2VuIFNFQ1RJT05TLCBFWFBPUlRTLCBJTVBPUlRTLCBWRVJTSU9OSywgQkFTRSwgQ09OU1RBTlQsIFBSSVZBVEUKLSV0b2tlbiBSRUFEIFdSSVRFIEVYRUNVVEUgU0hBUkVEIE5PTkFNRSBESVJFQ1RJVkUKLSV0b2tlbiA8aWQ+IElECi0ldG9rZW4gPG51bWJlcj4gTlVNQkVSCi0ldHlwZSAgPG51bWJlcj4gb3B0X2Jhc2Ugb3B0X29yZGluYWwKLSV0eXBlICA8bnVtYmVyPiBhdHRyIGF0dHJfbGlzdCBvcHRfbnVtYmVyIGV4cF9vcHRfbGlzdCBleHBfb3B0Ci0ldHlwZSAgPGlkPiBvcHRfbmFtZSBvcHRfZXF1YWxfbmFtZSAKLQotJSUKLQotc3RhcnQ6IHN0YXJ0IGNvbW1hbmQKLQl8IGNvbW1hbmQKLQk7Ci0KLWNvbW1hbmQ6IAotCQlOQU1FIG9wdF9uYW1lIG9wdF9iYXNlIHsgZGVmX25hbWUgKCQyLCAkMyk7IH0KLQl8CUxJQlJBUlkgb3B0X25hbWUgb3B0X2Jhc2UgeyBkZWZfbGlicmFyeSAoJDIsICQzKTsgfQotCXwJREVTQ1JJUFRJT04gSUQgeyBkZWZfZGVzY3JpcHRpb24gKCQyKTt9Ci0JfAlTVEFDS1NJWkUgTlVNQkVSIG9wdF9udW1iZXIgeyBkZWZfc3RhY2tzaXplICgkMiwgJDMpO30KLQl8CUhFQVBTSVpFIE5VTUJFUiBvcHRfbnVtYmVyIHsgZGVmX2hlYXBzaXplICgkMiwgJDMpO30KLQl8CUNPREUgYXR0cl9saXN0IHsgZGVmX3NlY3Rpb24gKCJDT0RFIiwgJDIpO30KLQl8CURBVEEgYXR0cl9saXN0ICB7IGRlZl9zZWN0aW9uICgiREFUQSIsICQyKTt9Ci0JfAlTRUNUSU9OUyBzZWNsaXN0Ci0JfAlFWFBPUlRTIGV4cGxpc3QgCi0JfAlJTVBPUlRTIGltcGxpc3QKLQl8CVZFUlNJT05LIE5VTUJFUiB7IGRlZl92ZXJzaW9uICgkMiwgMCk7fQotCXwJVkVSU0lPTksgTlVNQkVSICcuJyBOVU1CRVIgeyBkZWZfdmVyc2lvbiAoJDIsICQ0KTt9Ci0JfAlESVJFQ1RJVkUgSUQgeyBkZWZfZGlyZWN0aXZlICgkMik7fQotCTsKLQotCi1leHBsaXN0OgotCQkvKiBFTVBUWSAqLwotCXwJZXhwbGluZQotCXwJZXhwbGlzdCBleHBsaW5lCi0JOwotCi1leHBsaW5lOgotCQlJRCBvcHRfZXF1YWxfbmFtZSBvcHRfb3JkaW5hbCBleHBfb3B0X2xpc3QKLQkJCXsgZGVmX2V4cG9ydHMgKCQxLCAkMiwgJDMsICQ0KTsgfQotCTsKLWV4cF9vcHRfbGlzdDoKLQkJZXhwX29wdCBleHBfb3B0X2xpc3QgeyAkJCA9ICQxIHwgJDI7IH0KLQl8CXsgJCQgPSAwOyB9Ci0JOwotZXhwX29wdDoKLQkJTk9OQU1FCQl7ICQkID0gMTsgfQotCXwJQ09OU1RBTlQJeyAkJCA9IDI7IH0KLQl8CURBVEEJCXsgJCQgPSA0OyB9Ci0JfAlQUklWQVRFCQl7ICQkID0gODsgfQotCTsKLWltcGxpc3Q6CQotCQlpbXBsaXN0IGltcGxpbmUKLQl8CWltcGxpbmUKLQk7Ci0KLWltcGxpbmU6Ci0gICAgICAgICAgICAgICBJRCAnPScgSUQgJy4nIElEICcuJyBJRCAgICAgeyBkZWZfaW1wb3J0ICgkMSwgJDMsICQ1LCAkNywgLTEpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIElEICcuJyBOVU1CRVIgeyBkZWZfaW1wb3J0ICgkMSwgJDMsICQ1LCAgMCwgJDcpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIElEICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICgkMSwgJDMsICAwLCAkNSwgLTEpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIE5VTUJFUiAgICAgICAgeyBkZWZfaW1wb3J0ICgkMSwgJDMsICAwLCAgMCwgJDUpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnLicgSUQgJy4nIElEICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICggMCwgJDEsICQzLCAkNSwgLTEpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnLicgSUQgICAgICAgICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICggMCwgJDEsICAwLCAkMywgLTEpOyB9Ci07Ci0KLXNlY2xpc3Q6Ci0JCXNlY2xpc3Qgc2VjbGluZQotCXwJc2VjbGluZQotCTsKLQotc2VjbGluZToKLQlJRCBhdHRyX2xpc3QgeyBkZWZfc2VjdGlvbiAoJDEsICQyKTt9Ci0JfCBJRCBJRCB7IGRlZl9zZWN0aW9uX2FsdCAoJDEsICQyKTt9Ci0JOwotCi1hdHRyX2xpc3Q6Ci0JYXR0cl9saXN0IG9wdF9jb21tYSBhdHRyIHsgJCQgPSAkMSB8ICQzOyB9Ci0JfCBhdHRyIHsgJCQgPSAkMTsgfQotCTsKLQotb3B0X2NvbW1hOgotCScsJwotCXwgCi0JOwotb3B0X251bWJlcjogJywnIE5VTUJFUiB7ICQkPSQyO30KLQl8CSAgIHsgJCQ9LTE7fQotCTsKLQkKLWF0dHI6Ci0JCVJFQUQJeyAkJCA9IDE7fQotCXwJV1JJVEUJeyAkJCA9IDI7fQkKLQl8CUVYRUNVVEUJeyAkJD00O30KLQl8CVNIQVJFRAl7ICQkPTg7fQotCTsKLQotb3B0X25hbWU6IElECQl7ICQkID0gJDE7IH0KLQl8CQl7ICQkID0gMDsgfQotCTsKLQotb3B0X29yZGluYWw6IAotCSAgJ0AnIE5VTUJFUiAgICAgeyAkJCA9ICQyO30KLQl8ICAgICAgICAgICAgICAgIHsgJCQgPSAtMTt9Ci0JOwotCi1vcHRfZXF1YWxfbmFtZToKLSAgICAgICAgICAnPScgSUQJeyAkJCA9ICQyOyB9Ci0gICAgICAgIHwgCQl7ICQkID0gIDA7IH0JCQkgCi0JOwotCi1vcHRfYmFzZTogQkFTRQknPScgTlVNQkVSCXsgJCQgPSAkMzt9Ci0JfAl7ICQkID0gMDt9Ci0JOwotCi0JCi0KLSUlCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgRklMRSAqdGhlX2ZpbGU7Ci1zdGF0aWMgY29uc3QgY2hhciAqZGVmX2ZpbGVuYW1lOwotc3RhdGljIGludCBsaW5lbnVtYmVyOwotc3RhdGljIGRlZl9maWxlICpkZWY7Ci1zdGF0aWMgaW50IHNhd19uZXdsaW5lOwotCi1zdHJ1Y3QgZGlyZWN0aXZlCi0gIHsKLSAgICBzdHJ1Y3QgZGlyZWN0aXZlICpuZXh0OwotICAgIGNoYXIgKm5hbWU7Ci0gICAgaW50IGxlbjsKLSAgfTsKLQotc3RhdGljIHN0cnVjdCBkaXJlY3RpdmUgKmRpcmVjdGl2ZXMgPSAwOwotCi1kZWZfZmlsZSAqCi1kZWZfZmlsZV9lbXB0eSAoKQotewotICBkZWZfZmlsZSAqcnYgPSAoZGVmX2ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mIChkZWZfZmlsZSkpOwotICBtZW1zZXQgKHJ2LCAwLCBzaXplb2YgKGRlZl9maWxlKSk7Ci0gIHJ2LT5pc19kbGwgPSAtMTsKLSAgcnYtPmJhc2VfYWRkcmVzcyA9IChiZmRfdm1hKSAoLTEpOwotICBydi0+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/ICovCi0gICAgICBpZiAoYnVmZmVyKQotCWJ1ZmZlciA9IChjaGFyICopIHhyZWFsbG9jIChidWZmZXIsIGJ1ZmxlbiArIDEpOwotICAgICAgZWxzZQotCWJ1ZmZlciA9IChjaGFyICopIHhtYWxsb2MgKGJ1ZmxlbiArIDEpOwotICAgIH0KLSAgYnVmZmVyW2J1ZnB0cisrXSA9IGM7Ci0gIGJ1ZmZlcltidWZwdHJdID0gMDsJCS8qIG5vdCBvcHRpbWFsLCBidXQgdmVyeSBjb252ZW5pZW50ICovCi19Ci0KLXN0YXRpYyBzdHJ1Y3QKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IHRva2VuOwotfQotdG9rZW5zW10gPQotewotICB7ICJCQVNFIiwgQkFTRSB9LAotICB7ICJDT0RFIiwgQ09ERSB9LAotICB7ICJDT05TVEFOVCIsIENPTlNUQU5UIH0sCi0gIHsgIkRBVEEiLCBEQVRBIH0sCi0gIHsgIkRFU0NSSVBUSU9OIiwgREVTQ1JJUFRJT04gfSwKLSAgeyAiRElSRUNUSVZFIiwgRElSRUNUSVZFIH0sCi0gIHsgIkVYRUNVVEUiLCBFWEVDVVRFIH0sCi0gIHsgIkVYUE9SVFMiLCBFWFBPUlRTIH0sCi0gIHsgIkhFQVBTSVpFIiwgSEVBUFNJWkUgfSwKLSAgeyAiSU1QT1JUUyIsIElNUE9SVFMgfSwKLSAgeyAiTElCUkFSWSIsIExJQlJBUlkgfSwKLSAgeyAiTkFNRSIsIE5BTUUgfSwKLSAgeyAiTk9OQU1FIiwgTk9OQU1FIH0sCi0gIHsgIlBSSVZBVEUiLCBQUklWQVRFIH0sCi0gIHsgIlJFQUQiLCBSRUFEIH0sCi0gIHsgIlNFQ1RJT05TIiwgU0VDVElPTlMgfSwKLSAgeyAiU0VHTUVOVFMiLCBTRUNUSU9OUyB9LAotICB7ICJTSEFSRUQiLCBTSEFSRUQgfSwKLSAgeyAiU1RBQ0tTSVpFIiwgU1RBQ0tTSVpFIH0sCi0gIHsgIlZFUlNJT04iLCBWRVJTSU9OSyB9LAotICB7ICJXUklURSIsIFdSSVRFIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgaW50Ci1kZWZfZ2V0YyAoKQotewotICBpbnQgcnY7Ci0gIGlmIChsZXhfcGFyc2Vfc3RyaW5nKQotICAgIHsKLSAgICAgIGlmIChsZXhfcGFyc2Vfc3RyaW5nID49IGxleF9wYXJzZV9zdHJpbmdfZW5kKQotCXJ2ID0gRU9GOwotICAgICAgZWxzZQotCXJ2ID0gKmxleF9wYXJzZV9zdHJpbmcrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBydiA9IGZnZXRjICh0aGVfZmlsZSk7Ci0gICAgfQotICBpZiAocnYgPT0gJ1xuJykKLSAgICBzYXdfbmV3bGluZSA9IDE7Ci0gIHJldHVybiBydjsKLX0KLQotc3RhdGljIGludAotZGVmX3VuZ2V0YyAoYykKLSAgICAgaW50IGM7Ci17Ci0gIGlmIChsZXhfcGFyc2Vfc3RyaW5nKQotICAgIHsKLSAgICAgIGxleF9wYXJzZV9zdHJpbmctLTsKLSAgICAgIHJldHVybiBjOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiB1bmdldGMgKGMsIHRoZV9maWxlKTsKLX0KLQotc3RhdGljIGludAotZGVmX2xleCAoKQotewotICBpbnQgYywgaSwgcTsKLQotICBpZiAobGV4X2ZvcmNlZF90b2tlbikKLSAgICB7Ci0gICAgICBpID0gbGV4X2ZvcmNlZF90b2tlbjsKLSAgICAgIGxleF9mb3JjZWRfdG9rZW4gPSAwOwotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IGZvcmNpbmcgdG9rZW4gJWRcbiIsIGkpOwotI2VuZGlmCi0gICAgICByZXR1cm4gaTsKLSAgICB9Ci0KLSAgYyA9IGRlZl9nZXRjICgpOwotCi0gIC8qIHRyaW0gbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gIHdoaWxlIChjICE9IEVPRiAmJiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKSAmJiBzYXdfbmV3bGluZSkKLSAgICBjID0gZGVmX2dldGMgKCk7Ci0KLSAgaWYgKGMgPT0gRU9GKQotICAgIHsKLSNpZiBUUkFDRQotICAgICAgcHJpbnRmICgibGV4OiBFT0ZcbiIpOwotI2VuZGlmCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKHNhd19uZXdsaW5lICYmIGMgPT0gJzsnKQotICAgIHsKLSAgICAgIGRvCi0JewotCSAgYyA9IGRlZl9nZXRjICgpOwotCX0KLSAgICAgIHdoaWxlIChjICE9IEVPRiAmJiBjICE9ICdcbicpOwotICAgICAgaWYgKGMgPT0gJ1xuJykKLQlyZXR1cm4gZGVmX2xleCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgLyogbXVzdCBiZSBzb21ldGhpbmcgZWxzZSAqLwotICBzYXdfbmV3bGluZSA9IDA7Ci0KLSAgaWYgKGlzZGlnaXQgKGMpKQotICAgIHsKLSAgICAgIGJ1ZnB0ciA9IDA7Ci0gICAgICB3aGlsZSAoYyAhPSBFT0YgJiYgKGlzeGRpZ2l0IChjKSB8fCAoYyA9PSAneCcpKSkKLQl7Ci0JICBwdXRfYnVmIChjKTsKLQkgIGMgPSBkZWZfZ2V0YyAoKTsKLQl9Ci0gICAgICBpZiAoYyAhPSBFT0YpCi0JZGVmX3VuZ2V0YyAoYyk7Ci0gICAgICB5eWx2YWwubnVtYmVyID0gc3RydG91bCAoYnVmZmVyLCAwLCAwKTsKLSNpZiBUUkFDRQotICAgICAgcHJpbnRmICgibGV4OiBgJXMnIHJldHVybnMgTlVNQkVSICVkXG4iLCBidWZmZXIsIHl5bHZhbC5udW1iZXIpOwotI2VuZGlmCi0gICAgICByZXR1cm4gTlVNQkVSOwotICAgIH0KLQotICBpZiAoaXNhbHBoYSAoYykgfHwgc3RyY2hyICgiJDotXz8iLCBjKSkKLSAgICB7Ci0gICAgICBidWZwdHIgPSAwOwotICAgICAgd2hpbGUgKGMgIT0gRU9GICYmIChpc2FsbnVtIChjKSB8fCBzdHJjaHIgKCIkOi1fPy9AIiwgYykpKQotCXsKLQkgIHB1dF9idWYgKGMpOwotCSAgYyA9IGRlZl9nZXRjICgpOwotCX0KLSAgICAgIGlmIChjICE9IEVPRikKLQlkZWZfdW5nZXRjIChjKTsKLSAgICAgIGZvciAoaSA9IDA7IHRva2Vuc1tpXS5uYW1lOyBpKyspCi0JaWYgKHN0cmNtcCAodG9rZW5zW2ldLm5hbWUsIGJ1ZmZlcikgPT0gMCkKLQkgIHsKLSNpZiBUUkFDRQotCSAgICBwcmludGYgKCJsZXg6IGAlcycgaXMgYSBzdHJpbmcgdG9rZW5cbiIsIGJ1ZmZlcik7Ci0jZW5kaWYKLQkgICAgcmV0dXJuIHRva2Vuc1tpXS50b2tlbjsKLQkgIH0KLSNpZiBUUkFDRQotICAgICAgcHJpbnRmICgibGV4OiBgJXMnIHJldHVybnMgSURcbiIsIGJ1ZmZlcik7Ci0jZW5kaWYKLSAgICAgIHl5bHZhbC5pZCA9IHhzdHJkdXAgKGJ1ZmZlcik7Ci0gICAgICByZXR1cm4gSUQ7Ci0gICAgfQotCi0gIGlmIChjID09ICdcJycgfHwgYyA9PSAnIicpCi0gICAgewotICAgICAgcSA9IGM7Ci0gICAgICBjID0gZGVmX2dldGMgKCk7Ci0gICAgICBidWZwdHIgPSAwOwotICAgICAgd2hpbGUgKGMgIT0gRU9GICYmIGMgIT0gcSkKLQl7Ci0JICBwdXRfYnVmIChjKTsKLQkgIGMgPSBkZWZfZ2V0YyAoKTsKLQl9Ci0gICAgICB5eWx2YWwuaWQgPSB4c3RyZHVwIChidWZmZXIpOwotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IGAlcycgcmV0dXJucyBJRFxuIiwgYnVmZmVyKTsKLSNlbmRpZgotICAgICAgcmV0dXJuIElEOwotICAgIH0KLQotICBpZiAoYyA9PSAnPScgfHwgYyA9PSAnLicgfHwgYyA9PSAnQCcgfHwgYyA9PSAnLCcpCi0gICAgewotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IGAlYycgcmV0dXJucyBpdHNlbGZcbiIsIGMpOwotI2VuZGlmCi0gICAgICByZXR1cm4gYzsKLSAgICB9Ci0KLSAgaWYgKGMgPT0gJ1xuJykKLSAgICB7Ci0gICAgICBsaW5lbnVtYmVyKys7Ci0gICAgICBzYXdfbmV3bGluZSA9IDE7Ci0gICAgfQotCi0gIC8qcHJpbnRmICgibGV4OiAweCUwMnggaWdub3JlZFxuIiwgYyk7ICovCi0gIHJldHVybiBkZWZfbGV4ICgpOwotfQpkaWZmIC0tZ2l0IGEvbGQvZGVwLWluLnNlZCBiL2xkL2RlcC1pbi5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjODBlYjAuLjAwMDAwMDAKLS0tIGEvbGQvZGVwLWluLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTpsb29wCi0vXFwkL04KLS9cXCQvYiBsb29wCi0KLXMhQElOQ0RJUkAhJChJTkNESVIpIWcKLXMhQFNSQ0RJUkAvISFnCi1zIVwuXC4vYmZkL2hvc3RzL1teIF0qXC5oICEgIWcKLQotcy9cXFxuICovIC9nCi0KLXMvICokLy8KLXMvICAqLyAvZwotLzokL2QKLQotcy9cKC5cezUwXH1bXiBdKlwpIC9cMSBcXFwKLSAgL2cKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvUkVBRE1FIGIvbGQvZW11bHBhcmFtcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZDZkMjYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBhcmUgcmVhZCBieSBnZW5zY3JpcHRzLnNoIGFzIHNoZWxsIGNvbW1hbmRzLgotVGhleSBzZXQgcGFyYW1ldGVycyBmb3IgdGhlIGVtdWxhdGlvbnMuCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2EyOWsuc2ggYi9sZC9lbXVscGFyYW1zL2EyOWsuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzhlODUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hMjlrLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1hMjlrCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWEyOWstYmlnIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAwMAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAwMDAKLUFSQ0g9YTI5awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9haXhwcGMuc2ggYi9sZC9lbXVscGFyYW1zL2FpeHBwYy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyZTY4Ni4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FpeHBwYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVEVNUExBVEVfTkFNRT1haXgKLVNDUklQVF9OQU1FPWFpeAotT1VUUFVUX0ZPUk1BVD0iYWl4Y29mZi1yczYwMDAiCi1BUkNIPXBvd2VycGMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYWl4cnM2LnNoIGIvbGQvZW11bHBhcmFtcy9haXhyczYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczM2MzZjcuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9haXhyczYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVRFTVBMQVRFX05BTUU9YWl4Ci1TQ1JJUFRfTkFNRT1haXgKLU9VVFBVVF9GT1JNQVQ9ImFpeGNvZmYtcnM2MDAwIgotQVJDSD1yczYwMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYWxwaGEuc2ggYi9sZC9lbXVscGFyYW1zL2FscGhhLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDE5MjNmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYWxwaGEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVNDUklQVF9OQU1FPWFscGhhCi1PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVhbHBoYSIKLUFSQ0g9YWxwaGEKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJjZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9hcmNlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYzljMTcuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcmNlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFyYyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcmMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnYXJjIgotVEVYVF9TVEFSVF9BRERSPTB4MAotTUFYUEFHRVNJWkU9MHgxMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwCi1BUkNIPWFyYwotTUFDSElORT0KLUVOVFJZPXN0YXJ0Ci0jVEVNUExBVEVfTkFNRT1lbGYzMgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtX2Vwb2NfcGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNmZhMmEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQVJDSD1hcm0KLVNDUklQVF9OQU1FPXBlCi1PVVRQVVRfRk9STUFUPSJlcG9jLXBlaS1hcm0tbGl0dGxlIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVwb2MtcGVpLWFybS1saXR0bGUiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZXBvYy1wZWktYXJtLWJpZyIKLVRFTVBMQVRFX05BTUU9cGUKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtYW91dGIuc2ggYi9sZC9lbXVscGFyYW1zL2FybWFvdXRiLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWFiNmYxLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtYW91dGIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFybWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWFybS1iaWciCi1IRUFERVJfU1RBUlRfQUREUj0weDgwMDAKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUkVTUz0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MzI3NjgKLUFSQ0g9YXJtCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWFvdXRsLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1hb3V0bC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwMWYzMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FybWFvdXRsLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1hcm1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1hcm0tbGl0dGxlIgotSEVBREVSX1NUQVJUX0FERFI9MHg4MDAwCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFJFU1M9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTMyNzY4Ci1BUkNIPWFybQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1jb2ZmLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1jb2ZmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWRmN2QzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtY29mZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQVJDSD1hcm0KLVNDUklQVF9OQU1FPWFybWNvZmYKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtYXJtLWxpdHRsZSIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJjb2ZmLWFybS1saXR0bGUiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iY29mZi1hcm0tYmlnIgotVEVNUExBVEVfTkFNRT1hcm1jb2ZmCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtZWxmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTg0YjVlLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ2FybSIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0iCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1URU1QTEFURV9OQU1FPWFybWVsZgotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKiguZ2x1ZV83dCkgKiguZ2x1ZV83KScKLU9USEVSX0JTU19TWU1CT0xTPSdfX2Jzc19zdGFydF9fID0gLjsnCi1PVEhFUl9CU1NfRU5EX1NZTUJPTFM9J19ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsnCi0KLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLQotQVJDSD1hcm0KLU1BQ0hJTkU9Ci1NQVhQQUdFU0laRT0yNTYKLUVOVFJZPV9zdGFydAotRU1CRURERUQ9eWVzCi0KLSMgSG1tbSwgdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5LiAgVGhpcyBzZXRzIHRoZSBzdGFjayB0byB0aGUKLSMgdG9wIG9mIHRoZSBzaW11bGF0b3IgbWVtb3J5ICgyXjE5IGJ5dGVzKS4KLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9Jy5zdGFjayAweDgwMDAwIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfScKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4LnNoIGIvbGQvZW11bHBhcmFtcy9hcm1lbGZfbGludXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZDc0MGIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1lbGZfbGludXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1BUkNIPWFybQotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0iCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnYXJtIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFybSIKLU1BWFBBR0VTSVpFPTB4ODAwMAotVEVNUExBVEVfTkFNRT1hcm1lbGYKLQotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5nbHVlXzd0KSAqKC5nbHVlXzcpJwotT1RIRVJfQlNTX1NZTUJPTFM9J19fYnNzX3N0YXJ0X18gPSAuOycKLU9USEVSX0JTU19FTkRfU1lNQk9MUz0nX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOycKLQotIyBUaGlzIG5lZWRzIHRvIGJlIGhpZ2ggZW5vdWdoIHNvIHRoYXQgd2UgY2FuIGxvYWQgbGQuc28gYmVsb3cgaXQsCi0jIHlldCBsb3cgZW5vdWdoIHRvIHN0YXkgYXdheSBmcm9tIHRoZSBtbWFwIGFyZWEgMHg0MDAwMDAwMC4KLSMgQWxzbywgaXQgaXMgc21hbGwgZW5vdWdoIHNvIHRoYXQgcmVsb2NzIHdoaWNoIGFyZSBwb2ludGluZwotIyBhdCBhYnNvbHV0ZSAwIHdpbGwgc3RpbGwgYmUgZml4ZWQgdXAuCi1URVhUX1NUQVJUX0FERFI9MHgwMjAwMDAwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1lbGZfbGludXgyNi5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4MjYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNTNkZGMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1lbGZfbGludXgyNi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLUFSQ0g9YXJtCi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFybSIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdhcm0iCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtIgotTUFYUEFHRVNJWkU9MHg4MDAwCi1URU1QTEFURV9OQU1FPWFybWVsZgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotCi0jIFRoaXMgbmVlZHMgdG8gYmUgaGlnaCBlbm91Z2ggc28gdGhhdCB3ZSBjYW4gbG9hZCBsZC5zbyBiZWxvdyBpdCwKLSMgeWV0IGxvdyBlbm91Z2ggdG8gc3RheSBhd2F5IGZyb20gdGhlIG1tYXAgYXJlYSBhdCAweDAxMTAwMDAwLgotIyBBbHNvLCBpdCBpcyBzbWFsbCBlbm91Z2ggc28gdGhhdCByZWxvY3Mgd2hpY2ggYXJlIHBvaW50aW5nCi0jIGF0IGFic29sdXRlIDAgd2lsbCBzdGlsbCBiZSBmaXhlZCB1cC4KLSMgVGhlc2UgdmFsdWVzIGdpdmUgdXMgYWJvdXQgMC41TUIgZm9yIGxkLnNvLCAxNi41TUIgZm9yIHVzZXIgCi0jIHByb2dyYW1zLCBhbmQgMTVNQiBmb3IgbW1hcCB3aGljaCBzZWVtcyBhIHJlYXNvbmFibGUgY29tcHJvbWlzZS4KLVRFWFRfU1RBUlRfQUREUj0weDAwMDgwMDAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1lbGZfb2FiaS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU3NzUzZS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtLW9hYmkiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnYXJtLW9hYmkiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtLW9hYmkiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1URU1QTEFURV9OQU1FPWFybWVsZgotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKiguZ2x1ZV83dCkgKiguZ2x1ZV83KScKLU9USEVSX0JTU19TWU1CT0xTPSdfX2Jzc19zdGFydF9fID0gLjsnCi1PVEhFUl9CU1NfRU5EX1NZTUJPTFM9J19ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsnCi0gCi0gCi1BUkNIPWFybQotTUFDSElORT0KLU1BWFBBR0VTSVpFPTI1NgotRU5UUlk9X3N0YXJ0Ci1FTUJFRERFRD15ZXMKLSAKLSMgSG1tbSwgdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5LiAgVGhpcyBzZXRzIHRoZSBzdGFjayB0byB0aGUKLSMgdG9wIG9mIHRoZSBzaW11bGF0b3IgbWVtb3J5ICgyXjE5IGJ5dGVzKS4KLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9Jy5zdGFjayAweDgwMDAwIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfScKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtcGUuc2ggYi9sZC9lbXVscGFyYW1zL2FybXBlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjQ2ODA1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtcGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUFSQ0g9YXJtCi1TQ1JJUFRfTkFNRT1wZQotT1VUUFVUX0ZPUk1BVD0icGVpLWFybS1saXR0bGUiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0icGVpLWFybS1saXR0bGUiCi1CSUdfT1VUUFVUX0ZPUk1BVD0icGVpLWFybS1iaWciCi1URU1QTEFURV9OQU1FPXBlCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2NvZmZfc3BhcmMuc2ggYi9sZC9lbXVscGFyYW1zL2NvZmZfc3BhcmMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZjg1MmEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9jb2ZmX3NwYXJjLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1zcGFyY2NvZmYKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtc3BhcmMiCi0jIGZvbGxvd2luZyBhcmUgZHViaW91cyAoYm9ycm93ZWQgZnJvbSBzcGFyYyBseW54KQotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0wCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1BUkNIPXNwYXJjCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2QxMHZlbGYuc2ggYi9sZC9lbXVscGFyYW1zL2QxMHZlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjY2U1MWYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9kMTB2ZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmZDEwdgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItZDEwdiIKLVRFWFRfU1RBUlRfQUREUj0weDAxMDAwMDAwCi1SRUFET05MWV9TVEFSVF9BRERSPTB4MDAwMDAwMDQKLUFSQ0g9ZDEwdgotTUFYUEFHRVNJWkU9MzIKLUVNQkVEREVEPXQKLVRFTVBMQVRFX05BTUU9ZWxmMzIKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZDMwdl9lLnNoIGIvbGQvZW11bHBhcmFtcy9kMzB2X2Uuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YWI1YTIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9kMzB2X2Uuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmZDMwdgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItZDMwdiIKLVRFWFRfU1RBUlRfQUREUj0weDAwMDAwMDAwCi1EQVRBX1NUQVJUX0FERFI9MHgyMDAwMDAwMAotRU1FTV9TVEFSVF9BRERSPTB4ODAwMDAwMDAKLVNUQUNLX1NUQVJUX0FERFI9MHgyMDAwODAwMAotRUlUX1NUQVJUX0FERFI9MHhmZmZmZjAyMAotVEVYVF9TSVpFPTY0SwotREFUQV9TSVpFPTMySwotRU1FTV9TSVpFPThNCi1FSVRfU0laRT0zMjAKLVRFWFRfTUVNT1JZPWVtZW0KLURBVEFfTUVNT1JZPWVtZW0KLUJTU19NRU1PUlk9ZW1lbQotVEVYVF9ERUZfU0VDVElPTj0iIgotREFUQV9ERUZfU0VDVElPTj0iIgotRU1FTV9ERUZfU0VDVElPTj0iKHJ3eCkiCi1BUkNIPWQzMHYKLUVNQkVEREVEPXQKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZDMwdl9vLnNoIGIvbGQvZW11bHBhcmFtcy9kMzB2X28uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYmNiNDIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9kMzB2X28uc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmZDMwdgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItZDMwdiIKLVRFWFRfU1RBUlRfQUREUj0weDAwMDAwMDAwCi1EQVRBX1NUQVJUX0FERFI9MHgyMDAwMDAwMAotRU1FTV9TVEFSVF9BRERSPTB4ODAwMDAwMDAKLVNUQUNLX1NUQVJUX0FERFI9MHgyMDAwODAwMAotRUlUX1NUQVJUX0FERFI9MHhmZmZmZjAyMAotVEVYVF9TSVpFPTY0SwotREFUQV9TSVpFPTMySwotRU1FTV9TSVpFPThNCi1FSVRfU0laRT0zMjAKLVRFWFRfTUVNT1JZPXRleHQKLURBVEFfTUVNT1JZPWRhdGEKLUJTU19NRU1PUlk9ZGF0YQotVEVYVF9ERUZfU0VDVElPTj0iKHgpIgotREFUQV9ERUZfU0VDVElPTj0iKHJ3KSIKLUVNRU1fREVGX1NFQ1RJT049IiIKLUFSQ0g9ZDMwdgotRU1CRURERUQ9dApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9kMzB2ZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9kMzB2ZWxmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDlkZTc4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZDMwdmVsZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGZkMzB2Ci1PVVRQVVRfRk9STUFUPSJlbGYzMi1kMzB2IgotVEVYVF9TVEFSVF9BRERSPTB4MDAwMDAwMDAKLURBVEFfU1RBUlRfQUREUj0weDIwMDAwMDAwCi1FTUVNX1NUQVJUX0FERFI9MHg4MDAwMDAwMAotU1RBQ0tfU1RBUlRfQUREUj0weDIwMDA4MDAwCi1FSVRfU1RBUlRfQUREUj0weGZmZmZmMDIwCi1URVhUX1NJWkU9MjAwMEsKLURBVEFfU0laRT0yMDAwSwotRU1FTV9TSVpFPThNCi1FSVRfU0laRT0zMjAKLVRFWFRfTUVNT1JZPXRleHQKLURBVEFfTUVNT1JZPWRhdGEKLUJTU19NRU1PUlk9ZGF0YQotVEVYVF9ERUZfU0VDVElPTj0iKHgpIgotREFUQV9ERUZfU0VDVElPTj0iKHJ3KSIKLUVNRU1fREVGX1NFQ1RJT049IiIKLUFSQ0g9ZDMwdgotRU1CRURERUQ9dApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9kZWx0YTY4LnNoIGIvbGQvZW11bHBhcmFtcy9kZWx0YTY4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2M1OTA5Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZGVsdGE2OC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9ZGVsdGE2OAotT1VUUFVUX0ZPUk1BVD0iY29mZi1tNjhrLXN5c3YiCi1URVhUX1NUQVJUX0FERFI9MHgyMDAwCi1QQUdFX1NJWkU9MHgxMDAwMDAwCi1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWJtb24yOWsuc2ggYi9sZC9lbXVscGFyYW1zL2VibW9uMjlrLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmMyYmQxLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWJtb24yOWsuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWVibW9uMjlrCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWEyOWstYmlnIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9YTI5awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZTIzMjYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItc3BhcmMiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAKLUFMSUdOTUVOVD04Ci1BUkNIPXNwYXJjCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotREFUQV9QTFQ9Ci1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyYjQzMDAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyYjQzMDAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZjhkOTguLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLVRFWFRfU1RBUlRfQUREUj0weGEwMDIwMDAwCi1NQVhQQUdFU0laRT0weDQwMDAwCi1JTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TPScucmVnaW5mbyA6IHsgKigucmVnaW5mbykgfScKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLm1pcHMxNi5mbi4qKSAqKC5taXBzMTYuY2FsbC4qKScKLU9USEVSX0dPVF9TWU1CT0xTPScKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOwotJwotT1RIRVJfR09UX1NFQ1RJT05TPScKLSAgLmxpdDggOiB7ICooLmxpdDgpIH0KLSAgLmxpdDQgOiB7ICooLmxpdDQpIH0KLScKLVRFWFRfU1RBUlRfU1lNQk9MUz0nX2Z0ZXh0ID0gLiA7JwotREFUQV9TVEFSVF9TWU1CT0xTPSdfZmRhdGEgPSAuIDsnCi1PVEhFUl9CU1NfU1lNQk9MUz0nX2Zic3MgPSAuOycKLUVYRUNVVEFCTEVfU1lNQk9MUz0nX0RZTkFNSUNfTElOSyA9IDA7JwotT1RIRVJfU0VDVElPTlM9JwotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9Ci0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH0KLScKLUFSQ0g9bWlwcwotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLURZTkFNSUNfTElOSz1mYWxzZQotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyYm1pcC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJibWlwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzNjNDExLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJibWlwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLVRFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLURBVEFfQUREUj0weDEwMDAwMDAwCi1NQVhQQUdFU0laRT0weDQwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1TSExJQl9URVhUX1NUQVJUX0FERFI9MHg1ZmZlMDAwMAotVEVYVF9EWU5BTUlDPQotSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1PVEhFUl9TRUNUSU9OUz0nCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQotJwotQVJDSD1taXBzCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmJzbWlwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmJzbWlwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWYxMzA3Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJic21pcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1EQVRBX0FERFI9MHgxMDAwMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4NWZmZTAwMDAKLVRFWFRfRFlOQU1JQz0KLUlOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlM9Jy5yZWdpbmZvIDogeyAqKC5yZWdpbmZvKSB9JwotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKigubWlwczE2LmZuLiopICooLm1pcHMxNi5jYWxsLiopJwotT1RIRVJfR09UX1NZTUJPTFM9JwotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7Ci0nCi1PVEhFUl9HT1RfU0VDVElPTlM9JwotICAubGl0OCA6IHsgKigubGl0OCkgfQotICAubGl0NCA6IHsgKigubGl0NCkgfQotJwotVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKLU9USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JwotT1RIRVJfU0VDVElPTlM9JwotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9Ci0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH0KLScKLUFSQ0g9bWlwcwotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLUVOVFJZPV9fc3RhcnQKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlYThmZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMyZWJtaXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4NWZmZTAwMDAKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLm1pcHMxNi5mbi4qKSAqKC5taXBzMTYuY2FsbC4qKScKLU9USEVSX0dPVF9TWU1CT0xTPScKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOwotJwotT1RIRVJfR09UX1NFQ1RJT05TPScKLSAgLmxpdDggOiB7ICooLmxpdDgpIH0KLSAgLmxpdDQgOiB7ICooLmxpdDQpIH0KLScKLVRFWFRfU1RBUlRfU1lNQk9MUz0nX2Z0ZXh0ID0gLiA7JwotREFUQV9TVEFSVF9TWU1CT0xTPSdfZmRhdGEgPSAuIDsnCi1PVEhFUl9CU1NfU1lNQk9MUz0nX2Zic3MgPSAuOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1FTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwMDhjOC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMyZWxtaXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4NWZmZTAwMDAKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLm1pcHMxNi5mbi4qKSAqKC5taXBzMTYuY2FsbC4qKScKLU9USEVSX0dPVF9TWU1CT0xTPScKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOwotJwotT1RIRVJfR09UX1NFQ1RJT05TPScKLSAgLmxpdDggOiB7ICooLmxpdDgpIH0KLSAgLmxpdDQgOiB7ICooLmxpdDQpIH0KLScKLVRFWFRfU1RBUlRfU1lNQk9MUz0nX2Z0ZXh0ID0gLiA7JwotREFUQV9TVEFSVF9TWU1CT0xTPSdfZmRhdGEgPSAuIDsnCi1PVEhFUl9CU1NfU1lNQk9MUz0nX2Zic3MgPSAuOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1FTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJmcjMwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmZyMzAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFiZTFmNTMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmZyMzAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1mcjMwIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAKLUFSQ0g9ZnIzMAotTUFYUEFHRVNJWkU9MjU2Ci1FTlRSWT1fc3RhcnQKLUVNQkVEREVEPXllcwotTk9QPTB4OWZhMAotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nUFJPVklERSAoX19zdGFjayA9IDB4MjAwMDAwKTsnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTBkZTg4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1URVhUX1NUQVJUX0FERFI9MHhhMDAyMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1FWEVDVVRBQkxFX1NZTUJPTFM9J19EWU5BTUlDX0xJTksgPSAwOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1EWU5BTUlDX0xJTks9ZmFsc2UKLUVNQkVEREVEPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmxtaXAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMybG1pcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzMTJmNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMybG1pcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1EQVRBX0FERFI9MHgxMDAwMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4NWZmZTAwMDAKLVRFWFRfRFlOQU1JQz0KLUlOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlM9Jy5yZWdpbmZvIDogeyAqKC5yZWdpbmZvKSB9JwotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKigubWlwczE2LmZuLiopICooLm1pcHMxNi5jYWxsLiopJwotT1RIRVJfR09UX1NZTUJPTFM9JwotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7Ci0nCi1PVEhFUl9HT1RfU0VDVElPTlM9JwotICAubGl0OCA6IHsgKigubGl0OCkgfQotICAubGl0NCA6IHsgKigubGl0NCkgfQotJwotVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKLU9USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JwotT1RIRVJfU0VDVElPTlM9JwotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9Ci0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH0KLScKLUFSQ0g9bWlwcwotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJscHBjLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmxwcGMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZmZjNjEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmxwcGMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLVNDUklQVF9OQU1FPWVsZnBwYwotT1VUUFVUX0ZPUk1BVD0iZWxmMzItcG93ZXJwY2xlIgotVEVYVF9TVEFSVF9BRERSPTB4NDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLUFSQ0g9cG93ZXJwYwotTUFDSElORT0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJsc21pcC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJsc21pcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkYzhhMS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMybHNtaXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotREFUQV9BRERSPTB4MTAwMDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLVNITElCX1RFWFRfU1RBUlRfQUREUj0weDVmZmUwMDAwCi1URVhUX0RZTkFNSUM9Ci1JTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TPScucmVnaW5mbyA6IHsgKigucmVnaW5mbykgfScKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLm1pcHMxNi5mbi4qKSAqKC5taXBzMTYuY2FsbC4qKScKLU9USEVSX0dPVF9TWU1CT0xTPScKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOwotJwotT1RIRVJfR09UX1NFQ1RJT05TPScKLSAgLmxpdDggOiB7ICooLmxpdDgpIH0KLSAgLmxpdDQgOiB7ICooLmxpdDQpIH0KLScKLVRFWFRfU1RBUlRfU1lNQk9MUz0nX2Z0ZXh0ID0gLiA7JwotREFUQV9TVEFSVF9TWU1CT0xTPSdfZmRhdGEgPSAuIDsnCi1PVEhFUl9CU1NfU1lNQk9MUz0nX2Zic3MgPSAuOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1FTlRSWT1fX3N0YXJ0CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMybWNvcmUuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMybWNvcmUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMWZkYWUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1tY29yZS1iaWciCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbWNvcmUtYmlnIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLW1jb3JlLWxpdHRsZSIKLVBBR0VfU0laRT0weDEwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MHg0MDAKLU1BWFBBR0VTSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0wCi1BUkNIPW1jb3JlCi1FTUJFRERFRD15ZXMKLQotIyBUaGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgTk9QIHZhbHVlIC0gaXQgbXVzdCB3b3JrIGZvciBib3RoCi0jIGJpZyBlbmRpYW4gYW5kIGxpdHRsZSBlbmRpYW4gc3lzdGVtcy4gIFVuZm9ydHVuYXRlbHkgdGhlcmUgaXMKLSMgbm8gc3ltbWV0cmljYWwgbWNvcmUgb3Bjb2RlIHRoYXQgZnVuY3Rpb25zIGFzIGEgbm9vcC4gIFRoZQotIyBjaG9zZW4gc29sdXRpb24gaXMgdG8gdXNlICJ0c3QgcjAsIHIxNCIuICBUaGlzIGlzIGEgc3ltZXRyaWNhbAotIyB2YWx1ZSwgYW5kIGFwYXJ0IGZyb20gdGhlIGNvcnJ1cHRpb24gb2YgdGhlIEMgYml0LCBpdCBoYXMgbm8gb3RoZXIKLSMgc2lkZSBlZmZlY3RzLiAgU2luY2UgdGhlIGNhcnJ5IGJpdCBpcyBuZXZlciB0ZXN0ZWQgd2l0aG91dCBiZWluZwotIyBleHBsaWNpdGx5IHNldCBmaXJzdCwgYW5kIHNpbmNlIHRoZSBOT1AgY29kZSBpcyBvbmx5IHVzZWQgYXMgYQotIyBmaWxsIHZhbHVlIGJldHdlZW4gaW5kZXBlbmRhbnRseSB2aWFibGUgcGVpY2VzIG9mIGNvZGUsIGl0IHNob3VsZAotIyBub3QgbWF0dGVyLgotTk9QPTB4MGUwZQotCi1PVEhFUl9CU1NfU1lNQk9MUz0iX19ic3Nfc3RhcnRfXyA9IC4gOyIKLU9USEVSX0JTU19FTkRfU1lNQk9MUz0iX19ic3NfZW5kX18gPSAuIDsiCi0KLSMgSG1tbSwgdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5LiAgVGhpcyBzZXRzIHRoZSBzdGFjayB0byB0aGUKLSMgdG9wIG9mIHRoZSBzaW11bGF0b3IgbWVtb3J5ICgyXjE5IGJ5dGVzKS4KLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9Jy5zdGFjayAweDgwMDAwIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfScKLQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMnBwYy5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJwcGMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZjQyZjEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMnBwYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotU0NSSVBUX05BTUU9ZWxmcHBjCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1wb3dlcnBjIgotVEVYVF9TVEFSVF9BRERSPTB4MDE4MDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLUFSQ0g9cG93ZXJwYwotTUFDSElORT0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGZiZGZkLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLUVMRlNJWkU9NjQKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLU9VVFBVVF9GT1JNQVQ9ImVsZjY0LXNwYXJjIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAwCi1NQVhQQUdFU0laRT0weDEwMDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAwCi1BUkNIPSJzcGFyYzp2OSIKLU1BQ0hJTkU9Ci1EQVRBX1BMVD0KLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLU5PUD0weDAxMDAwMDAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjY0YWxwaGEuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjY0YWxwaGEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTIxZjIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGY2NGFscGhhLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotRU5UUlk9X19zdGFydAotU0NSSVBUX05BTUU9ZWxmCi1FTEZTSVpFPTY0Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1PVVRQVVRfRk9STUFUPSJlbGY2NC1hbHBoYSIKLVRFWFRfU1RBUlRfQUREUj0iMHgxMjAwMDAwMDAiCi1NQVhQQUdFU0laRT0weDEwMDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPSIweDEyMDAwMDAwMCIKLUFSQ0g9YWxwaGEKLU1BQ0hJTkU9Ci1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1EQVRBX1BMVD0KLU5PUD0weDQ3ZmYwNDFmCi0KLU9USEVSX1JFQURPTkxZX1NFQ1RJT05TPScucmVnaW5mbyA6IHsgKigucmVnaW5mbykgfScKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmX2kzODYuc2ggYi9sZC9lbXVscGFyYW1zL2VsZl9pMzg2LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmY1NjdiLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmX2kzODYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWkzODYiCi1URVhUX1NUQVJUX0FERFI9MHgwODA0ODAwMAotTUFYUEFHRVNJWkU9MHgxMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwODA0ODAwMAotQVJDSD1pMzg2Ci1NQUNISU5FPQotTk9QPTB4OTA5MAotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGZfaTM4Nl9iZS5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmX2kzODZfYmUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NzdhMDYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGZfaTM4Nl9iZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItaTM4NiIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAwMDAwCi0jU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4ODAwMDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDgwMDAwMDAwCi1NQVhQQUdFU0laRT0weDEwMDAKLUFSQ0g9aTM4NgotTUFDSElORT0KLU5PUD0weDkwOTAKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZ2xkOTYwLnNoIGIvbGQvZW11bHBhcmFtcy9nbGQ5NjAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODFhNzguLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9nbGQ5NjAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWk5NjAKLU9VVFBVVF9GT1JNQVQ9IiIKLVRFWFRfU1RBUlRfQUREUj0/PwotVEFSR0VUX1BBR0VfU0laRT0/PwotQVJDSD1pOTYwCi1URU1QTEFURV9OQU1FPWdsZDk2MAotR0xEX1NUWUxFPTEKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZ2xkOTYwY29mZi5zaCBiL2xkL2VtdWxwYXJhbXMvZ2xkOTYwY29mZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgyMDIyMC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2dsZDk2MGNvZmYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1TQ1JJUFRfTkFNRT1pOTYwCi1PVVRQVVRfRk9STUFUPSIiCi1URVhUX1NUQVJUX0FERFI9Pz8KLVRBUkdFVF9QQUdFX1NJWkU9Pz8KLUFSQ0g9aTk2MAotVEVNUExBVEVfTkFNRT1nbGQ5NjBjCi1HTERfU1RZTEU9MQotQ09GRl9DVE9SUz0nCi0JX19fQ1RPUl9MSVNUX18gPSAuOwotCUxPTkcoKF9fX0NUT1JfRU5EX18gLSBfX19DVE9SX0xJU1RfXykgLyA0IC0gMikKLQkqKC5jdG9ycykKLQlMT05HKDApCi0JX19fQ1RPUl9FTkRfXyA9IC47Ci0JX19fRFRPUl9MSVNUX18gPSAuOwotCUxPTkcoKF9fX0RUT1JfRU5EX18gLSBfX19EVE9SX0xJU1RfXykgLyA0IC0gMikKLQkqKC5kdG9ycykKLQlMT05HKDApCi0JX19fRFRPUl9FTkRfXyA9IC47Ci0nCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2dvMzIuc2ggYi9sZC9lbXVscGFyYW1zL2dvMzIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMzM1N2YuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9nbzMyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1nbzMyY29mZgotT1VUUFVUX0ZPUk1BVD0iY29mZi1nbzMyIgotVEVYVF9TVEFSVF9BRERSPTB4MTBhOAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVNFR01FTlRfU0laRT0weDEwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDAKLUFSQ0g9aTM4NgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9oODMwMC5zaCBiL2xkL2VtdWxwYXJhbXMvaDgzMDAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZWIzYzQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9oODMwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aDgzMDAKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaDgzMDAiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1oODMwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9oODMwMGguc2ggYi9sZC9lbXVscGFyYW1zL2g4MzAwaC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FiNzk0ZS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2g4MzAwaC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aDgzMDBoCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWg4MzAwIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9aDgzMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDgzMDBzLnNoIGIvbGQvZW11bHBhcmFtcy9oODMwMHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyN2I0ZjUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9oODMwMHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWg4MzAwcwotT1VUUFVUX0ZPUk1BVD0iY29mZi1oODMwMCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPWg4MzAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4NTAwLnNoIGIvbGQvZW11bHBhcmFtcy9oODUwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY0Y2E4MC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2g4NTAwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1oODUwMAotT1VUUFVUX0ZPUk1BVD0iY29mZi1oODUwMCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPWg4NTAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4NTAwYi5zaCBiL2xkL2VtdWxwYXJhbXMvaDg1MDBiLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmQzZmVlLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaDg1MDBiLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1oODUwMGIKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaDg1MDAiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1oODUwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9oODUwMGMuc2ggYi9sZC9lbXVscGFyYW1zL2g4NTAwYy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwYTA2NS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2g4NTAwYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aDg1MDBjCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWg4NTAwIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9aDg1MDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDg1MDBtLnNoIGIvbGQvZW11bHBhcmFtcy9oODUwMG0uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOWY3YjYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9oODUwMG0uc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWg4NTAwbQotT1VUUFVUX0ZPUk1BVD0iY29mZi1oODUwMCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPWg4NTAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4NTAwcy5zaCBiL2xkL2VtdWxwYXJhbXMvaDg1MDBzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWUyOTRhLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaDg1MDBzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1oODUwMHMKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaDg1MDAiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1oODUwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9ocDMwMGJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvaHAzMDBic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNWM1MGIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9ocDMwMGJzZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaHAzMDBic2QiCi1URVhUX1NUQVJUX0FERFI9MAotVEFSR0VUX1BBR0VfU0laRT00MDk2Ci1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaHAzaHB1eC5zaCBiL2xkL2VtdWxwYXJhbXMvaHAzaHB1eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiYWRkOC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2hwM2hwdXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWhwMzAwaHB1eCIKLVRFWFRfU1RBUlRfQUREUj0wCi1UQVJHRVRfUEFHRV9TSVpFPTQwOTYKLUFSQ0g9bTY4awotU1RBQ0taRVJPPSJfX19zdGFja196ZXJvID0gMHgyMDAwOyBfX0RZTkFNSUMgPSAwOyIKLSMgVGhpcyBpcyBuZWVkZWQgZm9yIEhQVVggOS4wOyBpdCBpcyB1bm5lY2Vzc2FyeSBidXQgaGFybWxlc3MgZm9yIDguMC4KLVNITElCX1BBVEg9Il9fX2RsZF9zaGxpYl9wYXRoID0gMDsiCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2hwcGFlbGYuc2ggYi9sZC9lbXVscGFyYW1zL2hwcGFlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3Yjg5ZWEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9ocHBhZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1ocHBhZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1ocHBhIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMAotVEFSR0VUX1BBR0VfU0laRT00MDk2Ci1BUkNIPWhwcGEKLVNUQVJUPSIkU1RBUlQkIgotVEVNUExBVEVfTkFNRT1ocHBhZWxmCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZhb3V0LnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2YW91dC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5ZTU1NC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZhb3V0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1pMzg2IgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0wCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NmJlb3Muc2ggYi9sZC9lbXVscGFyYW1zL2kzODZiZW9zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjlkYTVmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4NmJlb3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUFSQ0g9aTM4NgotU0NSSVBUX05BTUU9aTM4NmJlb3MKLU9VVFBVVF9GT1JNQVQ9InBlaS1pMzg2IgotUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQ9InBlLWkzODYiCi1URU1QTEFURV9OQU1FPWJlb3MKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NmJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4NmJzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjMGUyZi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWkzODYtYnNkIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0wCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NmNvZmYuc2ggYi9sZC9lbXVscGFyYW1zL2kzODZjb2ZmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDE3YjdkLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4NmNvZmYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWkzODZjb2ZmCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWkzODYiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1pMzg2CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZnbzMyLnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2Z28zMi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVmMTZjNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZnbzMyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1pMzg2Z28zMgotT1VUUFVUX0ZPUk1BVD0iY29mZi1nbzMyIgotVEVYVF9TVEFSVF9BRERSPTB4MTBhOAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVNFR01FTlRfU0laRT0weDIwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MAotQVJDSD1pMzg2Ci0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NmxpbnV4LnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2bGludXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MTY0MjIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2bGludXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWkzODYtbGludXgiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTAKLUFSQ0g9aTM4NgotVEVNUExBVEVfTkFNRT1saW51eApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bHlueC5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4Nmx5bnguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OGMxNzUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2bHlueC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotU0NSSVBUX05BTUU9aTM4Nmx5bngKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaTM4Ni1seW54IgotIyBUaGlzIGlzIHdoYXQgTHlueE9TIC9saWIvaW5pdDEubyB3YW50cy4KLUVOVFJZPV9tYWluCi0jIGZvbGxvd2luZyBhcmUgZHViaW91cwotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0wCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nm1hY2guc2ggYi9sZC9lbXVscGFyYW1zL2kzODZtYWNoLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2NiMjc2Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4Nm1hY2guc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LW1hY2gzIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMjAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAwCi1TRUdNRU5UX1NJWkU9MHgxMDAwCi1QQURfVEVYVD10Ci1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nm1vc3Muc2ggYi9sZC9lbXVscGFyYW1zL2kzODZtb3NzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWUwZTA1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4Nm1vc3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWkzODYiCi1URVhUX1NUQVJUX0FERFI9MHgwMDAwMjAwMAotTUFYUEFHRVNJWkU9MHgxMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwMDAwMjAwMAotQVJDSD1pMzg2Ci1NQUNISU5FPQotTk9QPTB4OTA5MAotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bXNkb3Muc2ggYi9sZC9lbXVscGFyYW1zL2kzODZtc2Rvcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxMWZhMS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZtc2Rvcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9aTM4Nm1zZG9zCi1PVVRQVVRfRk9STUFUPSJtc2RvcyIKLVRFWFRfU1RBUlRfQUREUj0weDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDAKLVNFR01FTlRfU0laRT0weDEwCi1QQURfVEVYVD10Ci1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nm5ic2Quc2ggYi9sZC9lbXVscGFyYW1zL2kzODZuYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWU2YTM4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4Nm5ic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWkzODYtbmV0YnNkIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9aTM4NgotRVhFQ1VUQUJMRV9TWU1CT0xTPSdfX0RZTkFNSUMgPSAwOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nm53LnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2bncuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MGVkNjcuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2bncuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVNDUklQVF9OQU1FPW53Ci1PVVRQVVRfRk9STUFUPSJlbGYzMi1pMzg2IgotVEVYVF9TVEFSVF9BRERSPTB4MDgwMDAwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDgwMDAwMDAKLUFSQ0g9aTM4NgotTk9QPTB4OTA5MAotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2cGUuc2ggYi9sZC9lbXVscGFyYW1zL2kzODZwZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4YThhZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZwZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQVJDSD1pMzg2Ci1TQ1JJUFRfTkFNRT1wZQotT1VUUFVUX0ZPUk1BVD0icGVpLWkzODYiCi1SRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0icGUtaTM4NiIKLVRFTVBMQVRFX05BTUU9cGUKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbG5rOTYwLnNoIGIvbGQvZW11bHBhcmFtcy9sbms5NjAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZjNmYzQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9sbms5NjAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPWk5NjAKLU9VVFBVVF9GT1JNQVQ9IiIKLVRFWFRfU1RBUlRfQUREUj0/PwotVEFSR0VUX1BBR0VfU0laRT0/PwotQVJDSD1pOTYwCi1URU1QTEFURV9OQU1FPWxuazk2MApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tMzJyZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9tMzJyZWxmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDc3MDVhLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTMycmVsZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGYKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLW0zMnIiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAKLUFSQ0g9bTMycgotTUFDSElORT0KLU1BWFBBR0VTSVpFPTMyCi1FTUJFRERFRD15ZXMKLQotIyBIbW1tLCB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkuICBUaGlzIHNldHMgdGhlIHN0YWNrIHRvIHRoZQotIyB0b3Agb2Ygc2ltdWxhdG9yIG1lbW9yeSAoOE1CKS4KLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9J1BST1ZJREUgKF9zdGFjayA9IDB4ODAwMDAwKTsnCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL202OGs0a25ic2Quc2ggYi9sZC9lbXVscGFyYW1zL202OGs0a25ic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYzI0YzBlLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4azRrbmJzZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbTY4azRrLW5ldGJzZCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1BUkNIPW02OGsKLUVYRUNVVEFCTEVfU1lNQk9MUz0nX19EWU5BTUlDID0gMDsnCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL202OGthb3V0LnNoIGIvbGQvZW11bHBhcmFtcy9tNjhrYW91dC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmYWFmNy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL202OGthb3V0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC16ZXJvLWJpZyIKLVRFWFRfU1RBUlRfQUREUj0weDIwMjAKLVRBUkdFVF9QQUdFX1NJWkU9MHgyMDAwCi1TRUdNRU5UX1NJWkU9MHgyMDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MjAwMAotQVJDSD1tNjhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL202OGthdXguc2ggYi9sZC9lbXVscGFyYW1zL202OGthdXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZTg2Y2MuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tNjhrYXV4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1tNjhrYXV4Ci1PVVRQVVRfRk9STUFUPSJjb2ZmLW02OGstYXV4IgotU0VHTUVOVF9TSVpFPTB4NDAwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1URVhUX1NUQVJUX0FERFI9IiRTRUdNRU5UX1NJWkUgKyBTSVpFT0ZfSEVBREVSUyIKLU5PTl9QQUdFRF9URVhUX1NUQVJUX0FERFI9U0laRU9GX0hFQURFUlMKLURBVEFfQUxJR05NRU5UXz0iKC4gJiAoLSRTRUdNRU5UX1NJWkUgfCAkVEFSR0VUX1BBR0VfU0laRS0xKSkgKyAkU0VHTUVOVF9TSVpFIgotQVJDSD1tNjhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL202OGtjb2ZmLnNoIGIvbGQvZW11bHBhcmFtcy9tNjhrY29mZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxN2MwZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL202OGtjb2ZmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1tNjhrY29mZgotT1VUUFVUX0ZPUk1BVD0iY29mZi1tNjhrIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAwMAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAwMDAKLUFSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9tNjhrZWxmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDM1MmM1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a2VsZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbTY4ayIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAwMDAwCi1NQVhQQUdFU0laRT0weDIwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0ke1RFWFRfU1RBUlRfQUREUn0KLUFSQ0g9bTY4awotTUFDSElORT0KLU5PUD0weDRlNzUKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a2xpbnV4LnNoIGIvbGQvZW11bHBhcmFtcy9tNjhrbGludXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YzNkYWQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tNjhrbGludXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LW02OGstbGludXgiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTAKLUFSQ0g9bTY4awotVEVNUExBVEVfTkFNRT1saW51eApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrbHlueC5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a2x5bnguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMjBmZWIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tNjhrbHlueC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotU0NSSVBUX05BTUU9bTY4a2x5bngKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtbTY4ay1seW54IgotIyBUaGlzIGlzIHdoYXQgTHlueE9TIC9saWIvaW5pdDEubyB3YW50cy4KLUVOVFJZPV9fbWFpbgotIyBmb2xsb3dpbmcgYXJlIGR1YmlvdXMKLVRFWFRfU1RBUlRfQUREUj0wCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotQVJDSD1tNjhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL202OGtuYnNkLnNoIGIvbGQvZW11bHBhcmFtcy9tNjhrbmJzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc0MjgwNy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL202OGtuYnNkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1URVhUX1NUQVJUX0FERFI9MHgyMDIwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgyMDAwCi1PVVRQVVRfRk9STUFUPSJhLm91dC1tNjhrLW5ldGJzZCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgyMDAwCi1BUkNIPW02OGsKLUVYRUNVVEFCTEVfU1lNQk9MUz0nX19EWU5BTUlDID0gMDsnCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL202OGtwc29zLnNoIGIvbGQvZW11bHBhcmFtcy9tNjhrcHNvcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRlYjhjYS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL202OGtwc29zLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TQ1JJUFRfTkFNRT1wc29zCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1tNjhrIgotVEVYVF9TVEFSVF9BRERSPTB4MjAwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMAotQVJDSD1tNjhrCi1URU1QTEFURV9OQU1FPWVsZjMyCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL204OGtiY3Muc2ggYi9sZC9lbXVscGFyYW1zL204OGtiY3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNjczN2MuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tODhrYmNzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1tODhrYmNzCi1PVVRQVVRfRk9STUFUPSJjb2ZmLW04OGtiY3MiCi1URVhUX1NUQVJUX0FERFI9Pz8KLVRBUkdFVF9QQUdFX1NJWkU9Pz8KLUFSQ0g9bTg4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tY29yZXBlLnNoIGIvbGQvZW11bHBhcmFtcy9tY29yZXBlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWJhZWU5Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbWNvcmVwZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQVJDSD1tY29yZQotU0NSSVBUX05BTUU9bWNvcmVwZQotT1VUUFVUX0ZPUk1BVD0icGVpLW1jb3JlLWJpZyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJwZWktbWNvcmUtbGl0dGxlIgotQklHX09VVFBVVF9GT1JNQVQ9InBlaS1tY29yZS1iaWciCi1URU1QTEFURV9OQU1FPXBlCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21pcHNiaWcuc2ggYi9sZC9lbXVscGFyYW1zL21pcHNiaWcuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZTI5NTMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9taXBzYmlnLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TQ1JJUFRfTkFNRT1taXBzCi1PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwMDAwCi1BUkNIPW1pcHMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbWlwc2JzZC5zaCBiL2xkL2VtdWxwYXJhbXMvbWlwc2JzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmYjM1Yi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21pcHNic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPW1pcHNic2QKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LW1pcHMtbGl0dGxlIgotQklHX09VVFBVVF9GT1JNQVQ9ImEub3V0LW1pcHMtYmlnIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImEub3V0LW1pcHMtbGl0dGxlIgotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotVEFSR0VUX1BBR0VfU0laRT00MDk2Ci1BUkNIPW1pcHMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbWlwc2lkdC5zaCBiL2xkL2VtdWxwYXJhbXMvbWlwc2lkdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMxNzZmNS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21pcHNpZHQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1taXBzCi1PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwMDAwCi1BUkNIPW1pcHMKLUVOVFJZPXN0YXJ0Ci1URVhUX1NUQVJUX0FERFI9MHhhMDAxMjAwMAotREFUQV9BRERSPS4KLVRFTVBMQVRFX05BTUU9bWlwc2Vjb2ZmCi1FTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbWlwc2lkdGwuc2ggYi9sZC9lbXVscGFyYW1zL21pcHNpZHRsLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjI3OWRlLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbWlwc2lkdGwuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1taXBzCi1PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwMDAwCi1BUkNIPW1pcHMKLUVOVFJZPXN0YXJ0Ci1URVhUX1NUQVJUX0FERFI9MHhhMDAxMjAwMAotREFUQV9BRERSPS4KLVRFTVBMQVRFX05BTUU9bWlwc2Vjb2ZmCi1FTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbWlwc2xpdC5zaCBiL2xkL2VtdWxwYXJhbXMvbWlwc2xpdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiMjM0NC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21pcHNsaXQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPW1pcHMKLU9VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVtaXBzIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAwMDAKLUFSQ0g9bWlwcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9taXBzbG5ld3Muc2ggYi9sZC9lbXVscGFyYW1zL21pcHNsbmV3cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiYjkxYy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21pcHNsbmV3cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotU0NSSVBUX05BTUU9bWlwcwotT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1taXBzCi1URVhUX1NUQVJUX0FERFI9MHg4MDA4MDAwMAotREFUQV9BRERSPS4KLUVNQkVEREVEPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tbjEwMjAwLnNoIGIvbGQvZW11bHBhcmFtcy9tbjEwMjAwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzI0MzIyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbW4xMDIwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLW1uMTAyMDAiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1BUkNIPW1uMTAyMDAKLU1BQ0hJTkU9Ci1NQVhQQUdFU0laRT0xCi1FTlRSWT1fc3RhcnQKLUVNQkVEREVEPXllcwotCi0jIEhtbW0sIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheS4gIFRoaXMgc2V0cyB0aGUgc3RhY2sgdG8gdGhlCi0jIHRvcCBvZiB0aGUgc2ltdWxhdG9yIG1lbW9yeSAoMl4xOSBieXRlcykuCi1PVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPScuc3RhY2sgMHg4MDAwMCA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0nCi0KLSMgVGhlc2UgYXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIENPRkYgdG9vbGNoYWluLgotIyBYWFggVGhlc2Ugc2hvdWxkIGRlZmluaXRlbHkgZGlzYXBwZWFyLgotQ1RPUl9TVEFSVD0nX19fY3RvcnMgPSAuOycKLUNUT1JfRU5EPSdfX19jdG9yc19lbmQgPSAuOycKLURUT1JfU1RBUlQ9J19fX2R0b3JzID0gLjsnCi1EVE9SX0VORD0nX19fZHRvcnNfZW5kID0gLjsnCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21uMTAzMDAuc2ggYi9sZC9lbXVscGFyYW1zL21uMTAzMDAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YTQwZTUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tbjEwMzAwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbW4xMDMwMCIKLVRFWFRfU1RBUlRfQUREUj0weDAKLUFSQ0g9bW4xMDMwMAotTUFDSElORT0KLU1BWFBBR0VTSVpFPTEKLUVOVFJZPV9zdGFydAotRU1CRURERUQ9eWVzCi0KLSMgSG1tbSwgdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5LiAgVGhpcyBzZXRzIHRoZSBzdGFjayB0byB0aGUKLSMgdG9wIG9mIHRoZSBzaW11bGF0b3IgbWVtb3J5ICgyXjE5IGJ5dGVzKS4KLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9Jy5zdGFjayAweDgwMDAwIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfScKLQotIyBUaGVzZSBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQ09GRiB0b29sY2hhaW4uCi0jIFhYWCBUaGVzZSBzaG91bGQgZGVmaW5pdGVseSBkaXNhcHBlYXIuCi1DVE9SX1NUQVJUPSdfX19jdG9ycyA9IC47JwotQ1RPUl9FTkQ9J19fX2N0b3JzX2VuZCA9IC47JwotRFRPUl9TVEFSVD0nX19fZHRvcnMgPSAuOycKLURUT1JfRU5EPSdfX19kdG9yc19lbmQgPSAuOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbmV3cy5zaCBiL2xkL2VtdWxwYXJhbXMvbmV3cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwZGRmOS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL25ld3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LW5ld3NvczMiCi1URVhUX1NUQVJUX0FERFI9MAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9uczMya25ic2Quc2ggYi9sZC9lbXVscGFyYW1zL25zMzJrbmJzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0ZmRmMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL25zMzJrbmJzZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbnMzMmstbmV0YnNkIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9bnMzMmsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvcGM1MzJtYWNoYS5zaCBiL2xkL2VtdWxwYXJhbXMvcGM1MzJtYWNoYS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxZDA3OS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3BjNTMybWFjaGEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXBjNTMyLW1hY2giCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPSIweDEwMDIwIgotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAKLUFSQ0g9bnMzMmsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvcHBjbWFjb3Muc2ggYi9sZC9lbXVscGFyYW1zL3BwY21hY29zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmI4MDBjLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvcHBjbWFjb3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVRFTVBMQVRFX05BTUU9YWl4Ci1TQ1JJUFRfTkFNRT1haXgKLU9VVFBVVF9GT1JNQVQ9Inhjb2ZmLXBvd2VybWFjIgotQVJDSD1wb3dlcnBjCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3BwY253LnNoIGIvbGQvZW11bHBhcmFtcy9wcGNudy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlYWQ0My4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3BwY253LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1udwotT1VUUFVUX0ZPUk1BVD0iZWxmMzItcG93ZXJwYyIKLVRFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLURBVEFfQUREUj0weDEwMDAwMDAwCi1NQVhQQUdFU0laRT0weDQwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1BUkNIPXBvd2VycGMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvcHBjcGUuc2ggYi9sZC9lbXVscGFyYW1zL3BwY3BlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTUyODJkLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvcHBjcGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLUFSQ0g9cG93ZXJwYwotU0NSSVBUX05BTUU9cHBjcGUKLU9VVFBVVF9GT1JNQVQ9InBlaS1wb3dlcnBjbGUiCi1URU1QTEFURV9OQU1FPXBlCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3Jpc2NpeC5zaCBiL2xkL2VtdWxwYXJhbXMvcmlzY2l4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2Y2ZDkyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvcmlzY2l4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1yaXNjaXgKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXJpc2NpeCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MHg4MDAwCi1BUkNIPWFybQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zYTI5MjAwLnNoIGIvbGQvZW11bHBhcmFtcy9zYTI5MjAwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjUyZjkyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc2EyOTIwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9c2EyOTIwMAotT1VUUFVUX0ZPUk1BVD0iY29mZi1hMjlrLWJpZyIKLVRFWFRfU1RBUlRfQUREUj0weDQwMDA0MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotQVJDSD1hMjlrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NoLnNoIGIvbGQvZW11bHBhcmFtcy9zaC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg4NDRmYi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NoLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1zaAotT1VUUFVUX0ZPUk1BVD0iY29mZi1zaCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPXNoCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NoZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9zaGVsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVkYjU4Ny4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NoZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1zaCIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAKLU1BWFBBR0VTSVpFPTEyOAotQVJDSD1zaAotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLUVNQkVEREVEPXllcwotCi0jIFRoZXNlIGFyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBDT0ZGIHRvb2xjaGFpbi4KLUVOVFJZPXN0YXJ0Ci1DVE9SX1NUQVJUPSdfX19jdG9ycyA9IC47JwotQ1RPUl9FTkQ9J19fX2N0b3JzX2VuZCA9IC47JwotRFRPUl9TVEFSVD0nX19fZHRvcnMgPSAuOycKLURUT1JfRU5EPSdfX19kdG9yc19lbmQgPSAuOycKLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9Jy5zdGFjayAweDMwMDAwIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfScKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc2hsLnNoIGIvbGQvZW11bHBhcmFtcy9zaGwuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MGFhYzguLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zaGwuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPXNoCi1PVVRQVVRfRk9STUFUPSJjb2ZmLXNobCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPXNoCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NobGVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvc2hsZWxmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjI3Zjg2Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc2hsZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1zaGwiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1NQVhQQUdFU0laRT0xMjgKLUFSQ0g9c2gKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1FTUJFRERFRD15ZXMKLQotIyBUaGVzZSBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQ09GRiB0b29sY2hhaW4uCi1FTlRSWT1zdGFydAotQ1RPUl9TVEFSVD0nX19fY3RvcnMgPSAuOycKLUNUT1JfRU5EPSdfX19jdG9yc19lbmQgPSAuOycKLURUT1JfU1RBUlQ9J19fX2R0b3JzID0gLjsnCi1EVE9SX0VORD0nX19fZHRvcnNfZW5kID0gLjsnCi1PVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPScuc3RhY2sgMHgzMDAwMCA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0nCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NwYXJjYW91dC5zaCBiL2xkL2VtdWxwYXJhbXMvc3BhcmNhb3V0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjliOTI1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc3BhcmNhb3V0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1zdW5vcy1iaWciCi1CSUdfT1VUUFVUX0ZPUk1BVD0iYS5vdXQtc3Vub3MtYmlnIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImEub3V0LXNwYXJjLWxpdHRsZSIKLVRFWFRfU1RBUlRfQUREUj0weDIwMjAKLVRBUkdFVF9QQUdFX1NJWkU9MHgyMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgyMDAwCi1BUkNIPXNwYXJjCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NwYXJjbGludXguc2ggYi9sZC9lbXVscGFyYW1zL3NwYXJjbGludXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjY2IwYmVjLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc3BhcmNsaW51eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtc3BhcmMtbGludXgiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTAKLUFSQ0g9c3BhcmMKLVRFTVBMQVRFX05BTUU9bGludXgKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc3BhcmNseW54LnNoIGIvbGQvZW11bHBhcmFtcy9zcGFyY2x5bnguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZWIzMGIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zcGFyY2x5bnguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVNDUklQVF9OQU1FPXNwYXJjbHlueAotT1VUUFVUX0ZPUk1BVD0iY29mZi1zcGFyYy1seW54IgotIyBUaGlzIGlzIHdoYXQgTHlueE9TIC9saWIvaW5pdDEubyB3YW50cy4KLUVOVFJZPV9fbWFpbgotIyBmb2xsb3dpbmcgYXJlIGR1YmlvdXMKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1URVhUX1NUQVJUX0FERFI9MAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMAotQVJDSD1zcGFyYwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zcGFyY25ic2Quc2ggYi9sZC9lbXVscGFyYW1zL3NwYXJjbmJzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI3ZGFmMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NwYXJjbmJzZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtc3BhcmMtbmV0YnNkIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9c3BhcmMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc3QyMDAwLnNoIGIvbGQvZW11bHBhcmFtcy9zdDIwMDAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OTg4MzIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zdDIwMDAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPXN0MjAwMAotT1VUUFVUX0ZPUk1BVD0iY29mZi1tNjhrIgotVEVYVF9TVEFSVF9BRERSPTB4MAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zdW4zLnNoIGIvbGQvZW11bHBhcmFtcy9zdW4zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjBmNzFmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc3VuMy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtc3Vub3MtYmlnIgotVEVYVF9TVEFSVF9BRERSPTB4MjAyMAotVEFSR0VUX1BBR0VfU0laRT0weDIwMDAKLVNFR01FTlRfU0laRT0weDIwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgyMDAwCi1BUkNIPW02OGsKLVRFTVBMQVRFX05BTUU9c3Vub3MKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc3VuNC5zaCBiL2xkL2VtdWxwYXJhbXMvc3VuNC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0Mjc3NS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3N1bjQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXN1bm9zLWJpZyIKLVRFWFRfU1RBUlRfQUREUj0weDIwMjAKLVRBUkdFVF9QQUdFX1NJWkU9MHgyMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgyMDAwCi1BTElHTk1FTlQ9OAotQVJDSD1zcGFyYwotVEVNUExBVEVfTkFNRT1zdW5vcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy90aWMzMGFvdXQuc2ggYi9sZC9lbXVscGFyYW1zL3RpYzMwYW91dC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE0YzEzZi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3RpYzMwYW91dC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9dGljMzBhb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC10aWMzMCIKLU9VVFBVVF9BUkNIPSJ0bXMzMjBjMzAiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD10bXMzMjBjMzAKLUJJRz0xCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3RpYzMwY29mZi5zaCBiL2xkL2VtdWxwYXJhbXMvdGljMzBjb2ZmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjc3OTQzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvdGljMzBjb2ZmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT10aWMzMGNvZmYKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtdGljMzAiCi1PVVRQVVRfQVJDSD0idG1zMzIwYzMwIgotVEVYVF9TVEFSVF9BRERSPTB4MAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9dG1zMzIwYzMwCi1CSUc9MQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy90aWM4MGNvZmYuc2ggYi9sZC9lbXVscGFyYW1zL3RpYzgwY29mZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA3MDMyMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3RpYzgwY29mZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMgVGhpcyBmaWxlIGlzIHNvdXJjZWQgYnkgdGhlIGdlbnNjcmlwdHMuc2ggc2NyaXB0LgotIyBUaGVzZSBhcmUgc2hlbGwgdmFyaWFibGVzIHRoYXQgYXJlIHVzZWQgbGF0ZXIgYnkgZWl0aGVyIGdlbnNjcmlwdHMKLSMgb3Igb24gb2YgdGhlIHNjcmlwdHMgdGhhdCBpdCBzb3VyY2VzLgotCi0jIFRoZSBuYW1lIG9mIHRoZSBzY3JpcHR0ZW1wbCBzY3JpcHQgdG8gdXNlLiAgSW4gdGhpcyBjYXNlLCBnZW5zY3JpcHRzCi0jIHVzZXMgc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjCi0jCi1TQ1JJUFRfTkFNRT10aWM4MGNvZmYKLQotIyBUaGUgbmFtZSBvZiB0aGUgZW11bHRlbXBsIHNjcmlwdCB0byB1c2UuICBJZiBzZXQgdG8gInRlbXBsYXRlIiB0aGVuCi0jIGdlbnNjcmlwdHMuc2ggd2lsbCB1c2UgdGhlIHNjcmlwdCBlbXVsdGVtcGwvdGVtcGxhdGUuZW0uICBJZiBub3Qgc2V0LAotIyB0aGVuIHRoZSBkZWZhdWx0IHZhbHVlIGlzICJnZW5lcmljIi4KLSMKLSMgVEVNUExBVEVfTkFNRT0KLQotIyBJZiB0aGlzIGlzIHNldCB0byBhbiBub25lbXB0eSBzdHJpbmcsIGdlbnNjcmlwdHMuc2ggd2lsbCBpbnZva2UgdGhlCi0jIHNjcmlwdHRlbXBsIHNjcmlwdCBhbiBleHRyYSB0aW1lIHRvIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IHNjcmlwdC4KLSMKLSMgR0VORVJBVEVfU0hMSUJfU0NSSVBUPQotCi0jIFRoZSBCRkQgb3V0cHV0IGZvcm1hdCB0byB1c2UuICBUaGUgc2NyaXB0dGVtcGwgc2NyaXB0IHdpbGwgdXNlIGl0IGluCi0jIGFuIE9VVFBVVF9GT1JNQVQgZXhwcmVzc2lvbiBpbiB0aGUgbGlua2VyIHNjcmlwdC4KLSMKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtdGljODAiCi0KLSMgVGhpcyBpcyBub3JtYWxseSBzZXQgdG8gaW5kaWNhdGUgdGhlIGFyY2hpdGVjdHVyZSB0byB1c2UsIHN1Y2ggYXMKLSMgInNwYXJjIi4gIFRoZSBzY3JpcHR0ZW1wbCBzY3JpcHQgd2lsbCBub3JtYWxseSB1c2UgaXQgaW4gYW4gT1VUUFVUX0FSQ0gKLSMgZXhwcmVzc2lvbiBpbiB0aGUgbGlua2VyIHNjcmlwdC4KLSMKLUFSQ0g9dGljODAKLQotIyBTb21lIHNjcmlwdHRlbXBsIHNjcmlwdHMgdXNlIHRoaXMgdG8gc2V0IHRoZSBlbnRyeSBhZGRyZXNzIGluIGFuIEVOVFJZCi0jIGV4cHJlc3Npb24gaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0jCi0jIEVOVFJZPQotCi0jIFRoZSBzY3JpcHR0ZW1wbCBzY3JpcHQgdXNlcyB0aGlzIHRvIHNldCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUKLSMgIi50ZXh0IiBzZWN0aW9uLgotIwotVEVYVF9TVEFSVF9BRERSPTB4MjAwMDAwMAotCi0jIElmIHRoaXMgaXMgZGVmaW5lZCwgdGhlIGdlbnNjcmlwdHMuc2ggc2NyaXB0IHNldHMgVEVYVF9TVEFSVF9BRERSIHRvCi0jIGl0cyB2YWx1ZSBiZWZvcmUgcnVubmluZyB0aGUgc2NyaXB0dGVtcGwgc2NyaXB0IGZvciB0aGUgLW4gYW5kIC1OCi0jIG9wdGlvbnMuCi0jCi0jIE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0KLQotIyBUaGUgZ2Vuc2NyaXB0cy5zaCBzY3JpcHQgdXNlcyB0aGlzIHRvIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiAKLSMgREFUQV9BTElHTk1FTlQgd2hlbiBydW5uaW5nIHRoZSBzY3JpcHR0ZW1wbCBzY3JpcHQuCi0jCi0jIFNFR01FTlRfU0laRT0KLQotIyBJZiBTRUdNRU5UX1NJWkUgaXMgbm90IGRlZmluZWQsIHRoZSBnZW5zY3JpcHRzLnNoIHNjcmlwdCB1c2VzIHRoaXMKLSMgdG8gZGVmaW5lIGl0LgotIwotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvdjg1MC5zaCBiL2xkL2VtdWxwYXJhbXMvdjg1MC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiZmJkMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3Y4NTAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9djg1MAotT1VUUFVUX0ZPUk1BVD0iZWxmMzItdjg1MCIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwMAotWkRBVEFfU1RBUlRfQUREUj0weDE2MAotUk9aREFUQV9TVEFSVF9BRERSPSJBTElHTiAoNCkiCi1TREFUQV9TVEFSVF9BRERSPSJBTElHTiAoNCkiCi1ST1NEQVRBX1NUQVJUX0FERFI9IkFMSUdOICg0KSIKLVREQVRBX1NUQVJUX0FERFI9IkFMSUdOICg0KSIKLUNBTExfVEFCTEVfU1RBUlRfQUREUj0iQUxJR04gKDQpIgotQVJDSD12ODUwCi1NQVhQQUdFU0laRT0yNTYKLUVOVFJZPV9zdGFydAotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3ZhbmlsbGEuc2ggYi9sZC9lbXVscGFyYW1zL3ZhbmlsbGEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YTNiNzIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy92YW5pbGxhLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT12YW5pbGxhCi1URVhUX1NUQVJUX0FERFI9Pz8KLVRBUkdFVF9QQUdFX1NJWkU9Pz8KLUFSQ0g9dW5rbm93bgotVEVNUExBVEVfTkFNRT12YW5pbGxhCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3ZheC5zaCBiL2xkL2VtdWxwYXJhbXMvdmF4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg1NDgzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvdmF4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dCIKLVRFWFRfU1RBUlRfQUREUj0wCi1UQVJHRVRfUEFHRV9TSVpFPTEwMjQKLUFSQ0g9dmF4CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3ZzdGEuc2ggYi9sZC9lbXVscGFyYW1zL3ZzdGEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjI0OWIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy92c3RhLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1pMzg2IgotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVNFR01FTlRfU0laRT0weDQwMDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MAotQVJDSD1pMzg2Ci0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvdzY1LnNoIGIvbGQvZW11bHBhcmFtcy93NjUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDJiMjMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy93NjUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPXc2NQotT1VUUFVUX0ZPUk1BVD0iY29mZi13NjUiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1UQVJHRVRfUEFHRV9TSVpFPTY0Ci1BUkNIPXc2NQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy96ODAwMS5zaCBiL2xkL2VtdWxwYXJhbXMvejgwMDEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNjQ1YzMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy96ODAwMS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9ejgwMDAKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtejhrIgotT1VUUFVUX0FSQ0g9Ino4MDAxIgotVEVYVF9TVEFSVF9BRERSPTB4MAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9ejhrCi1CSUc9MQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy96ODAwMi5zaCBiL2xkL2VtdWxwYXJhbXMvejgwMDIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OWI1ZjUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy96ODAwMi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9ejgwMDAKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtejhrIgotT1VUUFVUX0FSQ0g9Ino4MDAyIgotVEVYVF9TVEFSVF9BRERSPTB4MAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9ejgwMDIKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9SRUFETUUgYi9sZC9lbXVsdGVtcGwvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGVjMGFiLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBhcmUgc291cmNlZCBieSBnZW5zY3JpcHRzLnNoLCBhZnRlcgotc2V0dGluZyBzb21lIHZhcmlhYmxlcyB0byBzdWJzdGl0dXRlIGluLCB0byBwcm9kdWNlCi1DIHNvdXJjZSBmaWxlcyB0aGF0IGNvbnRhaW4ganVtcCB0YWJsZXMgZm9yIGVhY2ggZW11bGF0aW9uLgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2FpeC5lbSBiL2xkL2VtdWx0ZW1wbC9haXguZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Nzg1N2YuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL2FpeC5lbQorKysgL2Rldi9udWxsCkBAIC0xLDEwNTQgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBBSVggZW11bGF0aW9uIGNvZGUgZm9yICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0gICBBSVggc3VwcG9ydCBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9mcmVlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9yZWxvY3MKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IFBBUkFNUyAoKGV0cmVlX3R5cGUgKikpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotLyogVGhlIGZpbGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciBlYWNoIHNlY3Rpb24uICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZmlsZV9hbGlnbjsKLQotLyogVGhlIG1heGltdW0gc2l6ZSB0aGUgc3RhY2sgaXMgcGVybWl0dGVkIHRvIGdyb3cuICBUaGlzIGlzIHN0b3JlZCBpbgotICAgdGhlIGEub3V0IGhlYWRlci4gICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhzdGFjazsKLQotLyogVGhlIG1heGltdW0gZGF0YSBzaXplLiAgVGhpcyBpcyBzdG9yZWQgaW4gdGhlIGEub3V0IGhlYWRlci4gICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhkYXRhOwotCi0vKiBXaGV0aGVyIHRvIHBlcmZvcm0gZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLXN0YXRpYyBpbnQgZ2MgPSAxOwotCi0vKiBUaGUgbW9kdWxlIHR5cGUgdG8gdXNlLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBtb2R0eXBlID0gKCcxJyA8PCA4KSB8ICdMJzsKLQotLyogV2hldGhlciB0aGUgLnRleHQgc2VjdGlvbiBtdXN0IGJlIHJlYWQtb25seSAoaS5lLiwgbm8gcmVsb2NzCi0gICBwZXJtaXR0ZWQpLiAgKi8KLXN0YXRpYyBpbnQgdGV4dHJvOwotCi0vKiBXaGV0aGVyIHRvIGltcGxlbWVudCBVbml4IGxpa2UgbGlua2VyIHNlbWFudGljcy4gICovCi1zdGF0aWMgaW50IHVuaXhfbGQ7Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgaW1wb3J0IGZpbGUgbGlzdC4gICovCi0KLXN0cnVjdCBmaWxlbGlzdAotewotICBzdHJ1Y3QgZmlsZWxpc3QgKm5leHQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCi0vKiBMaXN0IG9mIGltcG9ydCBmaWxlcy4gICovCi1zdGF0aWMgc3RydWN0IGZpbGVsaXN0ICppbXBvcnRfZmlsZXM7Ci0KLS8qIExpc3Qgb2YgZXhwb3J0IHN5bWJvbHMgcmVhZCBmcm9tIHRoZSBleHBvcnQgZmlsZXMuICAqLwotCi1zdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0Ci17Ci0gIHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKm5leHQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGJvb2xlYW4gc3lzY2FsbDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICpleHBvcnRfc3ltYm9sczsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBkb25lLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0jaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCi0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfJHtBUkNIfTsKLSNlbmRpZiAvKiBub3QgVEFSR0VUXyAqLwotICBjb25maWcuaGFzX3NoYXJlZCA9IHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBBSVggc3BlY2lmaWMgb3B0aW9ucy4gICovCi0KLXN0YXRpYyBpbnQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IHByZXZvcHRpbmQgPSBvcHRpbmQ7Ci0gIGludCBwcmV2b3B0ZXJyID0gb3B0ZXJyOwotICBpbnQgaW5keDsKLSAgaW50IGxvbmdpbmQ7Ci0gIGludCBvcHRjOwotICBsb25nIHZhbDsKLSAgY2hhciAqZW5kOwotCi0jZGVmaW5lIE9QVElPTl9JR05PUkUgKDMwMCkKLSNkZWZpbmUgT1BUSU9OX0FVVE9JTVAgKE9QVElPTl9JR05PUkUgKyAxKQotI2RlZmluZSBPUFRJT05fRVJOT1RPSyAoT1BUSU9OX0FVVE9JTVAgKyAxKQotI2RlZmluZSBPUFRJT05fRVJPSyAoT1BUSU9OX0VSTk9UT0sgKyAxKQotI2RlZmluZSBPUFRJT05fRVhQT1JUIChPUFRJT05fRVJPSyArIDEpCi0jZGVmaW5lIE9QVElPTl9JTVBPUlQgKE9QVElPTl9FWFBPUlQgKyAxKQotI2RlZmluZSBPUFRJT05fTE9BRE1BUCAoT1BUSU9OX0lNUE9SVCArIDEpCi0jZGVmaW5lIE9QVElPTl9NQVhEQVRBIChPUFRJT05fTE9BRE1BUCArIDEpCi0jZGVmaW5lIE9QVElPTl9NQVhTVEFDSyAoT1BUSU9OX01BWERBVEEgKyAxKQotI2RlZmluZSBPUFRJT05fTU9EVFlQRSAoT1BUSU9OX01BWFNUQUNLICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PQVVUT0lNUCAoT1BUSU9OX01PRFRZUEUgKyAxKQotI2RlZmluZSBPUFRJT05fTk9TVFJDTVBDVCAoT1BUSU9OX05PQVVUT0lNUCArIDEpCi0jZGVmaW5lIE9QVElPTl9QRCAoT1BUSU9OX05PU1RSQ01QQ1QgKyAxKQotI2RlZmluZSBPUFRJT05fUFQgKE9QVElPTl9QRCArIDEpCi0jZGVmaW5lIE9QVElPTl9TVFJDTVBDVCAoT1BUSU9OX1BUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1VOSVggKE9QVElPTl9TVFJDTVBDVCArIDEpCi0KLSAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKLSAgICB7ImJhc2lzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYmF1dG9pbXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FVVE9JTVB9LAotICAgIHsiYmNvbXBybGQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiY3JsZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJjcm9yMzEiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiRCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFYREFUQX0sCi0gICAgeyJiRSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhQT1JUfSwKLSAgICB7ImJlcm5vdG9rIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FUk5PVE9LfSwKLSAgICB7ImJlcm9rIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FUk9LfSwKLSAgICB7ImJlcnJtc2ciLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiZXhwb3J0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlR9LAotICAgIHsiYmYiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VSTk9UT0t9LAotICAgIHsiYmdjIiwgbm9fYXJndW1lbnQsICZnYywgMX0sCi0gICAgeyJiaCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJoYWx0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYkkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNUE9SVH0sCi0gICAgeyJiaW1wb3J0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTVBPUlR9LAotICAgIHsiYmwiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xPQURNQVB9LAotICAgIHsiYmxvYWRtYXAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xPQURNQVB9LAotICAgIHsiYm1heGRhdGEiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BWERBVEF9LAotICAgIHsiYm1heHN0YWNrIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhTVEFDS30sCi0gICAgeyJiTSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTU9EVFlQRX0sCi0gICAgeyJibW9kdHlwZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTU9EVFlQRX0sCi0gICAgeyJibm9hdXRvaW1wIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0FVVE9JTVB9LAotICAgIHsiYm5vZGVsY3NlY3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJibm9lbnRyeSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJub2djIiwgbm9fYXJndW1lbnQsICZnYywgMH0sCi0gICAgeyJibnNvIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0FVVE9JTVB9LAotICAgIHsiYm5vc3RyY21wY3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PU1RSQ01QQ1R9LAotICAgIHsiYm5vdGV4dHJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDB9LAotICAgIHsiYm5ybyIsIG5vX2FyZ3VtZW50LCAmdGV4dHJvLCAwfSwKLSAgICB7ImJwRCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUER9LAotICAgIHsiYnBUIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QVH0sCi0gICAgeyJicm8iLCBub19hcmd1bWVudCwgJnRleHRybywgMX0sCi0gICAgeyJiUyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFYU1RBQ0t9LAotICAgIHsiYnNvIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BVVRPSU1QfSwKLSAgICB7ImJzdHJjbXBjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RSQ01QQ1R9LAotICAgIHsiYnRleHRybyIsIG5vX2FyZ3VtZW50LCAmdGV4dHJvLCAxfSwKLSAgICB7InN0YXRpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9BVVRPSU1QfSwKLSAgICB7InVuaXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1VOSVh9LAotICAgIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLSAgfTsKLQotICAvKiBPcHRpb25zIHN1cHBvcnRlZCBieSB0aGUgQUlYIGxpbmtlciB3aGljaCB3ZSBkbyBub3Qgc3VwcG9ydDogLWYsCi0gICAgIC1TLCAtdiwgLVosIC1iYmluZGNtZHMsIC1iYmluZGVyLCAtYmJpbmRvcHRzLCAtYmNhbGxzLCAtYmNhcHMsCi0gICAgIC1iY3JvcjE1LCAtYmRlYnVnb3B0LCAtYmRiZywgLWJkZWxjc2VjdCwgLWJleD8sIC1iZmlsZWxpc3QsIC1iZmwsCi0gICAgIC1iZ2NieXBhc3MsIC1iZ2xpbmssIC1iaW5zZXJ0LCAtYmksIC1ibG9hZG1hcCwgLWJsLCAtYm1hcCwgLWJubCwKLSAgICAgLWJub2JpbmQsIC1ibm9jb21wcmxkLCAtYm5vY3JsZCwgLWJub2Vycm1zZywgLWJub2dsaW5rLAotICAgICAtYm5vbG9hZG1hcCwgLWJubCwgLWJub29ianJlb3JkZXIsIC1ibm9xdWlldCwgLWJub3Jlb3JkZXIsCi0gICAgIC1ibm90eXBjaGssIC1ibm94LCAtYnF1aWV0LCAtYlIsIC1icmVuYW1lLCAtYnJlb3JkZXIsIC1idHlwY2hrLAotICAgICAtYngsIC1iWCwgLWJ4cmVmLiAgKi8KLQotICAvKiBJZiB0aGUgY3VycmVudCBvcHRpb24gc3RhcnRzIHdpdGggLWIsIGNoYW5nZSB0aGUgZmlyc3QgOiB0byBhbiA9LgotICAgICBUaGUgQUlYIGxpbmtlciB1c2VzIDogdG8gc2VwYXJhdGUgdGhlIG9wdGlvbiBmcm9tIHRoZSBhcmd1bWVudDsKLSAgICAgY2hhbmdpbmcgaXQgdG8gPSBsZXRzIHVzIHRyZWF0IGl0IGFzIGEgZ2V0b3B0IG9wdGlvbi4gICovCi0gIGluZHggPSBvcHRpbmQ7Ci0gIGlmIChpbmR4ID09IDApCi0gICAgaW5keCA9IDE7Ci0gIGlmIChpbmR4IDwgYXJnYyAmJiBzdHJuY21wIChhcmd2W2luZHhdLCAiLWIiLCAyKSA9PSAwKQotICAgIHsKLSAgICAgIGNoYXIgKnM7Ci0KLSAgICAgIGZvciAocyA9IGFyZ3ZbaW5keF07ICpzICE9ICdcMCc7IHMrKykKLQl7Ci0JICBpZiAoKnMgPT0gJzonKQotCSAgICB7Ci0JICAgICAgKnMgPSAnPSc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFdlIGFkZCBzIGFuZCB1IHNvIHRvIHRoZSBzaG9ydCBvcHRpb25zIGxpc3Qgc28gdGhhdCAtcyBhbmQgLXUgb24KLSAgICAgdGhlIGNvbW1hbmQgbGluZSBkbyBub3QgbWF0Y2ggLXN0YXRpYyBhbmQgLXVuaXguICAqLwotCi0gIG9wdGVyciA9IDA7Ci0gIG9wdGMgPSBnZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCAiLUQ6SDpLVDp6c3UiLCBsb25nb3B0cywgJmxvbmdpbmQpOwotICBvcHRlcnIgPSBwcmV2b3B0ZXJyOwotCi0gIHN3aXRjaCAob3B0YykKLSAgICB7Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAndSc6Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9wdGluZCA9IHByZXZvcHRpbmQ7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgMDoKLSAgICAgIC8qIExvbmcgb3B0aW9uIHdoaWNoIGp1c3Qgc2V0cyBhIGZsYWcuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdEJzoKLSAgICAgIHZhbCA9IHN0cnRvbCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtRCBudW1iZXIgJXNcbiIsIG9wdGFyZyk7Ci0gICAgICBlbHNlIGlmICh2YWwgIT0gLTEpCi0JbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLmRhdGEiLCBleHBfaW50b3AgKHZhbCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdIJzoKLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnCi0JICB8fCAodmFsICYgKHZhbCAtIDEpKSAhPSAwKQotCWVpbmZvICgiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLUggbnVtYmVyICVzXG4iLCBvcHRhcmcpOwotICAgICAgZWxzZQotCWZpbGVfYWxpZ24gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0snOgotICAgIGNhc2UgJ3onOgotICAgICAgLyogRklYTUU6IFRoaXMgc2hvdWxkIHVzZSB0aGUgcGFnZSBzaXplIGZvciB0aGUgdGFyZ2V0IHN5c3RlbS4gICovCi0gICAgICBmaWxlX2FsaWduID0gNDA5NjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgICAvKiBPbiBBSVggdGhpcyBpcyB0aGUgc2FtZSBhcyBHTlUgbGQgLVR0ZXh0LiAgV2hlbiB3ZSBzZWUgLVQKLSAgICAgICAgIG51bWJlciwgd2UgYXNzdW1lIHRoZSBBSVggb3B0aW9uIGlzIGludGVuZGVkLiAgT3RoZXJ3aXNlLCB3ZQotICAgICAgICAgYXNzdW1lIHRoZSB1c3VhbCBHTlUgbGQgLVQgb3B0aW9uIGlzIGludGVuZGVkLiAgV2UgY2FuJ3QganVzdAotICAgICAgICAgaWdub3JlIHRoZSBBSVggb3B0aW9uLCBiZWNhdXNlIGdjYyBwYXNzZXMgaXQgdG8gdGhlIGxpbmtlci4gICovCi0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQl7Ci0JICBvcHRpbmQgPSBwcmV2b3B0aW5kOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLnRleHQiLCBleHBfaW50b3AgKHZhbCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9JR05PUkU6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0FVVE9JTVA6Ci0gICAgICBsaW5rX2luZm8uc3RhdGljX2xpbmsgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fRVJOT1RPSzoKLSAgICAgIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9FUk9LOgotICAgICAgZm9yY2VfbWFrZV9leGVjdXRhYmxlID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fRVhQT1JUOgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcmVhZF9maWxlIChvcHRhcmcsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fSU1QT1JUOgotICAgICAgewotCXN0cnVjdCBmaWxlbGlzdCAqbjsKLQlzdHJ1Y3QgZmlsZWxpc3QgKipmbHBwOwotCi0JbiA9IChzdHJ1Y3QgZmlsZWxpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZmlsZWxpc3QpKTsKLQluLT5uZXh0ID0gTlVMTDsKLQluLT5uYW1lID0gb3B0YXJnOwotCWZscHAgPSAmaW1wb3J0X2ZpbGVzOwotCXdoaWxlICgqZmxwcCAhPSBOVUxMKQotCSAgZmxwcCA9ICYoKmZscHApLT5uZXh0OwotCSpmbHBwID0gbjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTE9BRE1BUDoKLSAgICAgIGNvbmZpZy5tYXBfZmlsZW5hbWUgPSBvcHRhcmc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01BWERBVEE6Ci0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1ibWF4ZGF0YSBudW1iZXIgJXNcbiIsCi0JICAgICAgIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JbWF4ZGF0YSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUFYU1RBQ0s6Ci0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1ibWF4c3RhY2sgbnVtYmVyICVzXG4iLAotCSAgICAgICBvcHRhcmcpOwotICAgICAgZWxzZQotCW1heHN0YWNrID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NT0RUWVBFOgotICAgICAgaWYgKCpvcHRhcmcgPT0gJ1MnKQotCXsKLQkgIGxpbmtfaW5mby5zaGFyZWQgPSB0cnVlOwotCSAgKytvcHRhcmc7Ci0JfQotICAgICAgaWYgKCpvcHRhcmcgPT0gJ1wwJyB8fCBvcHRhcmdbMV0gPT0gJ1wwJykKLQllaW5mbyAoIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIG1vZHVsZSB0eXBlICVzXG4iLCBvcHRhcmcpOwotICAgICAgZWxzZQotCW1vZHR5cGUgPSAoKm9wdGFyZyA8PCA4KSB8IG9wdGFyZ1sxXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9BVVRPSU1QOgotICAgICAgbGlua19pbmZvLnN0YXRpY19saW5rID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9TVFJDTVBDVDoKLSAgICAgIGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9QRDoKLSAgICAgIC8qIFRoaXMgc2V0cyB0aGUgcGFnZSB0aGF0IHRoZSAuZGF0YSBzZWN0aW9uIGlzIHN1cHBvc2VkIHRvCi0gICAgICAgICBzdGFydCBvbi4gIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBwYWdlIHNob3VsZCBzdGlsbCBiZSB0aGUKLSAgICAgICAgIG9mZnNldCB3aXRoaW4gdGhlIGZpbGUsIHNvIHdlIG5lZWQgdG8gYnVpbGQgYW4gYXBwcm9wcmlhdGUKLSAgICAgICAgIGV4cHJlc3Npb24uICAqLwotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtcEQgbnVtYmVyICVzXG4iLCBvcHRhcmcpOwotICAgICAgZWxzZQotCXsKLQkgIGV0cmVlX3R5cGUgKnQ7Ci0KLQkgIHQgPSBleHBfYmlub3AgKCcrJywKLQkJCSBleHBfaW50b3AgKHZhbCksCi0JCQkgZXhwX2Jpbm9wICgnJicsCi0JCQkJICAgIGV4cF9uYW1lb3AgKE5BTUUsICIuIiksCi0JCQkJICAgIGV4cF9pbnRvcCAoMHhmZmYpKSk7Ci0JICB0ID0gZXhwX2Jpbm9wICgnJicsCi0JCQkgZXhwX2Jpbm9wICgnKycsIHQsIGV4cF9pbnRvcCAoMzEpKSwKLQkJCSBleHBfaW50b3AgKH4gKGJmZF92bWEpIDMxKSk7Ci0JICBsYW5nX3NlY3Rpb25fc3RhcnQgKCIuZGF0YSIsIHQpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fUFQ6Ci0gICAgICAvKiBUaGlzIHNldCB0aGUgcGFnZSB0aGF0IHRoZSAudGV4dCBzZWN0aW9uIGlzIHN1cHBvc2VkIHRvIHN0YXJ0Ci0gICAgICAgICBvbi4gIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBwYWdlIHNob3VsZCBzdGlsbCBiZSB0aGUgb2Zmc2V0Ci0gICAgICAgICB3aXRoaW4gdGhlIGZpbGUuICAqLwotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtcFQgbnVtYmVyICVzXG4iLCBvcHRhcmcpOwotICAgICAgZWxzZQotCXsKLQkgIGV0cmVlX3R5cGUgKnQ7Ci0KLQkgIHQgPSBleHBfYmlub3AgKCcrJywKLQkJCSBleHBfaW50b3AgKHZhbCksCi0JCQkgZXhwX25hbWVvcCAoU0laRU9GX0hFQURFUlMsIE5VTEwpKTsKLQkgIHQgPSBleHBfYmlub3AgKCcmJywKLQkJCSBleHBfYmlub3AgKCcrJywgdCwgZXhwX2ludG9wICgzMSkpLAotCQkJIGV4cF9pbnRvcCAofiAoYmZkX3ZtYSkgMzEpKTsKLQkgIGxhbmdfc2VjdGlvbl9zdGFydCAoIi50ZXh0IiwgdCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9TVFJDTVBDVDoKLSAgICAgIGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVU5JWDoKLSAgICAgIHVuaXhfbGQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuIGlucHV0IGZpbGUgY2FuIG5vdCBiZSByZWNvZ25pemVkIGFzIGEgQkZECi0gICBvYmplY3Qgb3IgYW4gYXJjaGl2ZS4gIElmIHRoZSBmaWxlIHN0YXJ0cyB3aXRoICMhLCB3ZSBtdXN0IHRyZWF0IGl0Ci0gICBhcyBhbiBpbXBvcnQgZmlsZS4gIFRoaXMgaXMgZm9yIEFJWCBjb21wYXRpYmlsaXR5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X3VucmVjb2duaXplZF9maWxlIChlbnRyeSkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIEZJTEUgKmU7Ci0gIGJvb2xlYW4gcmV0OwotCi0gIGUgPSBmb3BlbiAoZW50cnktPmZpbGVuYW1lLCBGT1BFTl9SVCk7Ci0gIGlmIChlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldCA9IGZhbHNlOwotCi0gIGlmIChnZXRjIChlKSA9PSAnIycgJiYgZ2V0YyAoZSkgPT0gJyEnKQotICAgIHsKLSAgICAgIHN0cnVjdCBmaWxlbGlzdCAqbjsKLSAgICAgIHN0cnVjdCBmaWxlbGlzdCAqKmZscHA7Ci0KLSAgICAgIG4gPSAoc3RydWN0IGZpbGVsaXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGZpbGVsaXN0KSk7Ci0gICAgICBuLT5uZXh0ID0gTlVMTDsKLSAgICAgIG4tPm5hbWUgPSBlbnRyeS0+ZmlsZW5hbWU7Ci0gICAgICBmbHBwID0gJmltcG9ydF9maWxlczsKLSAgICAgIHdoaWxlICgqZmxwcCAhPSBOVUxMKQotCWZscHAgPSAmKCpmbHBwKS0+bmV4dDsKLSAgICAgICpmbHBwID0gbjsKLQotICAgICAgcmV0ID0gdHJ1ZTsKLSAgICAgIGVudHJ5LT5sb2FkZWQgPSB0cnVlOwotICAgIH0KLQotICBmY2xvc2UgKGUpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLSAgYm9vbGVhbiByOwotICBzdHJ1Y3Qgc2V0X2luZm8gKnA7Ci0KLSAgLyogQ2FsbCBsZGN0b3JfYnVpbGRfc2V0cywgYWZ0ZXIgcHJldGVuZGluZyB0aGF0IHRoaXMgaXMgYQotICAgICByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvIHRoaXMgYmVjYXVzZSBBSVggcmVxdWlyZXMgcmVsb2NhdGlvbgotICAgICBlbnRyaWVzIGZvciBhbGwgcmVmZXJlbmNlcyB0byBzeW1ib2xzLCBldmVuIGluIGEgZmluYWwKLSAgICAgZXhlY3V0YWJsZS4gIE9mIGNvdXJzZSwgd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgaWYgd2UgYXJlCi0gICAgIHByb2R1Y2luZyBhbiBYQ09GRiBvdXRwdXQgZmlsZS4gICovCi0gIHIgPSBsaW5rX2luZm8ucmVsb2NhdGVhYmxlOwotICBpZiAoc3Ryc3RyIChiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCksICJ4Y29mZiIpICE9IE5VTEwpCi0gICAgbGlua19pbmZvLnJlbG9jYXRlYWJsZSA9IHRydWU7Ci0gIGxkY3Rvcl9idWlsZF9zZXRzICgpOwotICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gcjsKLQotICAvKiBGb3IgZWFjaCBzZXQsIHJlY29yZCB0aGUgc2l6ZSwgc28gdGhhdCB0aGUgWENPRkYgYmFja2VuZCBjYW4KLSAgICAgb3V0cHV0IHRoZSBjb3JyZWN0IGNzZWN0IGxlbmd0aC4gICovCi0gIGZvciAocCA9IHNldHM7IHAgIT0gKHN0cnVjdCBzZXRfaW5mbyAqKSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLSAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgd2UgbWF5IGhhdmUgYmVlbiBpbnZva2VkIGZyb20KLQkgY29sbGVjdCwgYW5kIHRoZSBzZXRzIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBidWlsdCwgc28gd2UgZG8KLQkgbm90IGRvIGFueXRoaW5nLiAgKi8KLSAgICAgIGlmIChwLT5oLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgcC0+aC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChwLT5yZWxvYyAhPSBCRkRfUkVMT0NfQ1RPUikKLQl7Ci0JICAvKiBIYW5kbGUgdGhpcyBpZiB3ZSBuZWVkIHRvLiAgKi8KLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgc2l6ZSA9IChwLT5jb3VudCArIDIpICogNDsKLSAgICAgIGlmICghIGJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIHAtPmgsIHNpemUpKQotCWVpbmZvICgiJUYlUDogYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCBmYWlsZWQ6ICVFXG4iKTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0Ci0gICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgc3RydWN0IGZpbGVsaXN0ICpmbDsKLSAgc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqZWw7Ci0gIGNoYXIgKmxpYnBhdGg7Ci0gIGFzZWN0aW9uICpzcGVjaWFsX3NlY3Rpb25zWzZdOwotICBpbnQgaTsKLQotICAvKiBIYW5kbGUgdGhlIGltcG9ydCBhbmQgZXhwb3J0IGZpbGVzLCBpZiBhbnkuICAqLwotICBmb3IgKGZsID0gaW1wb3J0X2ZpbGVzOyBmbCAhPSBOVUxMOyBmbCA9IGZsLT5uZXh0KQotICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSAoZmwtPm5hbWUsIHRydWUpOwotICBmb3IgKGVsID0gZXhwb3J0X3N5bWJvbHM7IGVsICE9IE5VTEw7IGVsID0gZWwtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGVsLT5uYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JZWluZm8gKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBvZiBleHBvcnQgc3ltYm9sIGZhaWxlZDogJUVcbiIpOwotICAgICAgaWYgKCEgYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGgsIGVsLT5zeXNjYWxsKSkKLQllaW5mbyAoIiVQJUY6IGJmZF94Y29mZl9leHBvcnRfc3ltYm9sIGZhaWxlZDogJUVcbiIpOwotICAgIH0KLQotICAvKiBUcmFjayBkb3duIGFsbCByZWxvY2F0aW9ucyBjYWxsZWQgZm9yIGJ5IHRoZSBsaW5rZXIgc2NyaXB0ICh0aGVzZQotICAgICBhcmUgdHlwaWNhbGx5IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZW50cmllcyBjcmVhdGVkIGJ5Ci0gICAgIENPTlNUUlVDVE9SUykgYW5kIGxldCB0aGUgYmFja2VuZCBrbm93IGl0IHdpbGwgbmVlZCB0byBjcmVhdGUKLSAgICAgLmxvYWRlciByZWxvY3MgZm9yIHRoZW0uICAqLwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9yZWxvY3MpOwotCi0gIC8qIFdlIG5lZWQgdG8gYnVpbGQgTElCUEFUSCBmcm9tIHRoZSAtTCBhcmd1bWVudHMuICBJZiBhbnkgLXJwYXRoCi0gICAgIGFyZ3VtZW50cyB3ZXJlIHVzZWQsIHRob3VnaCwgd2UgdXNlIC1ycGF0aCBpbnN0ZWFkLCBhcyBhIEdOVQotICAgICBleHRlbnNpb24uICAqLwotICBpZiAoY29tbWFuZF9saW5lLnJwYXRoICE9IE5VTEwpCi0gICAgbGlicGF0aCA9IGNvbW1hbmRfbGluZS5ycGF0aDsKLSAgZWxzZSBpZiAoc2VhcmNoX2hlYWQgPT0gTlVMTCkKLSAgICBsaWJwYXRoID0gKGNoYXIgKikgIiI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuOwotICAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotCi0gICAgICBsZW4gPSBzdHJsZW4gKHNlYXJjaF9oZWFkLT5uYW1lKTsKLSAgICAgIGxpYnBhdGggPSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgICAgIHN0cmNweSAobGlicGF0aCwgc2VhcmNoX2hlYWQtPm5hbWUpOwotICAgICAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZC0+bmV4dDsgc2VhcmNoICE9IE5VTEw7IHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkKLQl7Ci0JICBzaXplX3QgbmxlbjsKLQotCSAgbmxlbiA9IHN0cmxlbiAoc2VhcmNoLT5uYW1lKTsKLQkgIGxpYnBhdGggPSB4cmVhbGxvYyAobGlicGF0aCwgbGVuICsgbmxlbiArIDIpOwotCSAgbGlicGF0aFtsZW5dID0gJzonOwotCSAgc3RyY3B5IChsaWJwYXRoICsgbGVuICsgMSwgc2VhcmNoLT5uYW1lKTsKLQkgIGxlbiArPSBubGVuICsgMTsKLQl9Ci0gICAgfQotCi0gIC8qIExldCB0aGUgWENPRkYgYmFja2VuZCBzZXQgdXAgdGhlIC5sb2FkZXIgc2VjdGlvbi4gICovCi0gIGlmICghIGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGxpYnBhdGgsCi0JCQkJCSBlbnRyeV9zeW1ib2wsIGZpbGVfYWxpZ24sCi0JCQkJCSBtYXhzdGFjaywgbWF4ZGF0YSwKLQkJCQkJIGdjICYmICEgdW5peF9sZCA/IHRydWUgOiBmYWxzZSwKLQkJCQkJIG1vZHR5cGUsCi0JCQkJCSB0ZXh0cm8gPyB0cnVlIDogZmFsc2UsCi0JCQkJCSB1bml4X2xkLAotCQkJCQkgc3BlY2lhbF9zZWN0aW9ucykpCi0gICAgZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gc2V0IGR5bmFtaWMgc2VjdGlvbiBzaXplczogJUVcbiIpOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc3BlY2lhbCBzZWN0aW9ucywgYW5kIHB1dCB0aGVtIGluIHRoZSByaWdodAotICAgICBwbGFjZSBpbiB0aGUgbGluayBvcmRlcmluZy4gIFRoaXMgaXMgZXNwZWNpYWxseSBtYWdpYy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotICAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnBsczsKLSAgICAgIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICppczsKLSAgICAgIGNvbnN0IGNoYXIgKm9uYW1lOwotICAgICAgYm9vbGVhbiBzdGFydDsKLQotICAgICAgc2VjID0gc3BlY2lhbF9zZWN0aW9uc1tpXTsKLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgLyogUmVtb3ZlIHRoaXMgc2VjdGlvbiBmcm9tIHRoZSBsaXN0IG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4KLSAgICAgICAgIFRoaXMgYXNzdW1lcyB3ZSBrbm93IHdoYXQgdGhlIHNjcmlwdCBsb29rcyBsaWtlLiAgKi8KLSAgICAgIGlzID0gTlVMTDsKLSAgICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kIChzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lKTsKLSAgICAgIGlmIChvcyA9PSBOVUxMKQotCWVpbmZvICgiJVAlRjogY2FuJ3QgZmluZCBvdXRwdXQgc2VjdGlvbiAlc1xuIiwKLQkgICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSk7Ci0gICAgICBmb3IgKHBscyA9ICZvcy0+Y2hpbGRyZW4uaGVhZDsgKnBscyAhPSBOVUxMOyBwbHMgPSAmKCpwbHMpLT5uZXh0KQotCXsKLQkgIGlmICgoKnBscyktPmhlYWRlci50eXBlID09IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtCi0JICAgICAgJiYgKCpwbHMpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24gPT0gc2VjKQotCSAgICB7Ci0JICAgICAgaXMgPSAobGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKikgKnBsczsKLQkgICAgICAqcGxzID0gKCpwbHMpLT5uZXh0OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAoKCpwbHMpLT5oZWFkZXIudHlwZSA9PSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW0pCi0JICAgIHsKLQkgICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcHdsczsKLQotCSAgICAgIGZvciAocHdscyA9ICYoKnBscyktPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQ7Ci0JCSAgICpwd2xzICE9IE5VTEw7Ci0JCSAgIHB3bHMgPSAmKCpwd2xzKS0+bmV4dCkKLQkJewotCQkgIGlmICgoKnB3bHMpLT5oZWFkZXIudHlwZSA9PSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bQotCQkgICAgICAmJiAoKnB3bHMpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24gPT0gc2VjKQotCQkgICAgewotCQkgICAgICBpcyA9IChsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqKSAqcHdsczsKLQkJICAgICAgKnB3bHMgPSAoKnB3bHMpLT5uZXh0OwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgIGlmIChpcyAhPSBOVUxMKQotCQlicmVhazsKLQkgICAgfQotCX0JCi0KLSAgICAgIGlmIChpcyA9PSBOVUxMKQotCWVpbmZvICgiJVAlRjogY2FuJ3QgZmluZCAlcyBpbiBvdXRwdXQgc2VjdGlvblxuIiwKLQkgICAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKHNlYy0+b3duZXIsIHNlYykpOwotCi0gICAgICAvKiBOb3cgZmlndXJlIG91dCB3aGVyZSB0aGUgc2VjdGlvbiBzaG91bGQgZ28uICAqLwotICAgICAgc3dpdGNoIChpKQotCXsKLQlkZWZhdWx0OiAvKiB0byBhdm9pZCB3YXJuaW5ncyAqLwotCWNhc2UgMDoKLQkgIC8qIF90ZXh0ICovCi0JICBvbmFtZSA9ICIudGV4dCI7Ci0JICBzdGFydCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICAvKiBfZXRleHQgKi8KLQkgIG9uYW1lID0gIi50ZXh0IjsKLQkgIHN0YXJ0ID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICAvKiBfZGF0YSAqLwotCSAgb25hbWUgPSAiLmRhdGEiOwotCSAgc3RhcnQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgLyogX2VkYXRhICovCi0JICBvbmFtZSA9ICIuZGF0YSI7Ci0JICBzdGFydCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSA0OgotCWNhc2UgNToKLQkgIC8qIF9lbmQgYW5kIGVuZCAqLwotCSAgb25hbWUgPSAiLmJzcyI7Ci0JICBzdGFydCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAob25hbWUpOwotCi0gICAgICBpZiAoc3RhcnQpCi0JewotCSAgaXMtPmhlYWRlci5uZXh0ID0gb3MtPmNoaWxkcmVuLmhlYWQ7Ci0JICBvcy0+Y2hpbGRyZW4uaGVhZCA9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIGlzOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpcy0+aGVhZGVyLm5leHQgPSBOVUxMOwotCSAgbGFuZ19zdGF0ZW1lbnRfYXBwZW5kICgmb3MtPmNoaWxkcmVuLAotCQkJCSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBpcywKLQkJCQkgJmlzLT5oZWFkZXIubmV4dCk7Ci0JfQotICAgIH0KLX0KLQotLyogUmVhZCBhbiBpbXBvcnQgb3IgZXhwb3J0IGZpbGUuICBGb3IgYW4gaW1wb3J0IGZpbGUsIHRoaXMgaXMgY2FsbGVkCi0gICBieSB0aGUgYmVmb3JlX2FsbG9jYXRpb24gZW11bGF0aW9uIHJvdXRpbmUuICBGb3IgYW4gZXhwb3J0IGZpbGUsCi0gICB0aGlzIGlzIGNhbGxlZCBieSB0aGUgcGFyc2VfYXJncyBlbXVsYXRpb24gcm91dGluZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUgKGZpbGVuYW1lLCBpbXBvcnQpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBib29sZWFuIGltcG9ydDsKLXsKLSAgc3RydWN0IG9ic3RhY2sgKm87Ci0gIEZJTEUgKmY7Ci0gIGludCBsaW5lbm87Ci0gIGludCBjOwotICBib29sZWFuIGtlZXA7Ci0gIGNvbnN0IGNoYXIgKmltcHBhdGg7Ci0gIGNvbnN0IGNoYXIgKmltcGZpbGU7Ci0gIGNvbnN0IGNoYXIgKmltcG1lbWJlcjsKLQotICBvID0gKHN0cnVjdCBvYnN0YWNrICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG9ic3RhY2spKTsKLSAgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb24gKG8sIDAsIDAsIHhtYWxsb2MsIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZyZWUpOwotCi0gIGYgPSBmb3BlbiAoZmlsZW5hbWUsIEZPUEVOX1JUKTsKLSAgaWYgKGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgZWluZm8gKCIlRiVzOiAlRVxuIiwgZmlsZW5hbWUpOwotICAgIH0KLQotICBrZWVwID0gZmFsc2U7Ci0KLSAgaW1wcGF0aCA9IE5VTEw7Ci0gIGltcGZpbGUgPSBOVUxMOwotICBpbXBtZW1iZXIgPSBOVUxMOwotCi0gIGxpbmVubyA9IDA7Ci0gIHdoaWxlICgoYyA9IGdldGMgKGYpKSAhPSBFT0YpCi0gICAgewotICAgICAgY2hhciAqczsKLSAgICAgIGNoYXIgKnN5bW5hbWU7Ci0gICAgICBib29sZWFuIHN5c2NhbGw7Ci0gICAgICBiZmRfdm1hIGFkZHJlc3M7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaWYgKGMgIT0gJ1xuJykKLQl7Ci0JICBvYnN0YWNrXzFncm93IChvLCBjKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgb2JzdGFja18xZ3JvdyAobywgJ1wwJyk7Ci0gICAgICArK2xpbmVubzsKLQotICAgICAgcyA9IChjaGFyICopIG9ic3RhY2tfYmFzZSAobyk7Ci0gICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkrK3M7Ci0gICAgICBpZiAoKnMgPT0gJ1wwJwotCSAgfHwgKnMgPT0gJyonCi0JICB8fCAoKnMgPT0gJyMnICYmIHNbMV0gPT0gJyAnKQotCSAgfHwgKCEgaW1wb3J0ICYmICpzID09ICcjJyAmJiBzWzFdID09ICchJykpCi0JewotCSAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKCpzID09ICcjJyAmJiBzWzFdID09ICchJykKLQl7Ci0JICBzICs9IDI7Ci0JICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkgICAgKytzOwotCSAgaWYgKCpzID09ICdcMCcpCi0JICAgIHsKLQkgICAgICBpbXBwYXRoID0gTlVMTDsKLQkgICAgICBpbXBmaWxlID0gTlVMTDsKLQkgICAgICBpbXBtZW1iZXIgPSBOVUxMOwotCSAgICAgIG9ic3RhY2tfZnJlZSAobywgb2JzdGFja19iYXNlIChvKSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpzID09ICcoJykKLQkgICAgZWluZm8gKCIlRiVzJWQ6ICMhIChbbWVtYmVyXSkgaXMgbm90IHN1cHBvcnRlZCBpbiBpbXBvcnQgZmlsZXNcbiIsCi0JCSAgIGZpbGVuYW1lLCBsaW5lbm8pOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciBjczsKLQkgICAgICBjaGFyICpmaWxlOwotCi0JICAgICAgKHZvaWQpIG9ic3RhY2tfZmluaXNoIChvKTsKLQkgICAgICBrZWVwID0gdHJ1ZTsKLQkgICAgICBpbXBwYXRoID0gczsKLQkgICAgICBmaWxlID0gTlVMTDsKLQkgICAgICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpICYmICpzICE9ICcoJyAmJiAqcyAhPSAnXDAnKQotCQl7Ci0JCSAgaWYgKCpzID09ICcvJykKLQkJICAgIGZpbGUgPSBzICsgMTsKLQkJICArK3M7Ci0JCX0KLQkgICAgICBpZiAoZmlsZSAhPSBOVUxMKQotCQl7Ci0JCSAgZmlsZVstMV0gPSAnXDAnOwotCQkgIGltcGZpbGUgPSBmaWxlOwotCQkgIGlmIChpbXBwYXRoID09IGZpbGUgLSAxKQotCQkgICAgaW1wcGF0aCA9ICIvIjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGltcGZpbGUgPSBpbXBwYXRoOwotCQkgIGltcHBhdGggPSAiIjsKLQkJfQotCSAgICAgIGNzID0gKnM7Ci0JICAgICAgKnMgPSAnXDAnOwotCSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgY3MpKQotCQl7Ci0JCSAgKytzOwotCQkgIGNzID0gKnM7Ci0JCX0KLQkgICAgICBpZiAoY3MgIT0gJygnKQotCQl7Ci0JCSAgaW1wbWVtYmVyID0gIiI7Ci0JCSAgaWYgKGNzICE9ICdcMCcpCi0JCSAgICBlaW5mbyAoIiVzOiVkOiB3YXJuaW5nOiBzeW50YXggZXJyb3IgaW4gaW1wb3J0IGZpbGVcbiIsCi0JCQkgICBmaWxlbmFtZSwgbGluZW5vKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgICsrczsKLQkJICBpbXBtZW1iZXIgPSBzOwotCQkgIHdoaWxlICgqcyAhPSAnKScgJiYgKnMgIT0gJ1wwJykKLQkJICAgICsrczsKLQkJICBpZiAoKnMgPT0gJyknKQotCQkgICAgKnMgPSAnXDAnOwotCQkgIGVsc2UKLQkJICAgIGVpbmZvICgiJXM6JWQ6IHdhcm5pbmc6IHN5bnRheCBlcnJvciBpbiBpbXBvcnQgZmlsZVxuIiwKLQkJCSAgIGZpbGVuYW1lLCBsaW5lbm8pOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgc3ltYm9sIHRvIGJlIGltcG9ydGVkIG9yIGV4cG9ydGVkLiAgKi8KLSAgICAgIHN5bW5hbWUgPSBzOwotICAgICAgc3lzY2FsbCA9IGZhbHNlOwotICAgICAgYWRkcmVzcyA9IChiZmRfdm1hKSAtMTsKLQotICAgICAgd2hpbGUgKCEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSAmJiAqcyAhPSAnXDAnKQotCSsrczsKLSAgICAgIGlmICgqcyAhPSAnXDAnKQotCXsKLQkgIGNoYXIgKnNlOwotCi0JICAqcysrID0gJ1wwJzsKLQotCSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JICAgICsrczsKLQotCSAgc2UgPSBzOwotCSAgd2hpbGUgKCEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzZSkgJiYgKnNlICE9ICdcMCcpCi0JICAgICsrc2U7Ci0JICBpZiAoKnNlICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICAqc2UrKyA9ICdcMCc7Ci0JICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqc2UpKQotCQkrK3NlOwotCSAgICAgIGlmICgqc2UgIT0gJ1wwJykKLQkJZWluZm8gKCIlcyVkOiB3YXJuaW5nOiBzeW50YXggZXJyb3IgaW4gaW1wb3J0L2V4cG9ydCBmaWxlXG4iLAotCQkgICAgICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0JICAgIH0KLQotCSAgaWYgKHMgPT0gc2UpCi0JICAgIHsKLQkgICAgICAvKiBUaGVyZSB3YXMgbm8gYWRkcmVzcyBhZnRlciBhbGwuICAqLwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjYXNlY21wIChzLCAic3ZjIikgPT0gMAotCQkgICB8fCBzdHJjYXNlY21wIChzLCAic3lzY2FsbCIpID09IDApCi0JICAgIHN5c2NhbGwgPSB0cnVlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqZW5kOwotCi0JICAgICAgYWRkcmVzcyA9IHN0cnRvdWwgKHMsICZlbmQsIDApOwotCSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JCWVpbmZvICgiJXM6JWQ6IHdhcm5pbmc6IHN5bnRheCBlcnJvciBpbiBpbXBvcnQvZXhwb3J0IGZpbGVcbiIsCi0JCSAgICAgICBmaWxlbmFtZSwgbGluZW5vKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgaW1wb3J0KQotCXsKLQkgIHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKm47Ci0KLQkgIGxkbGFuZ19hZGRfdW5kZWYgKHN5bW5hbWUpOwotCSAgbiA9ICgoc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqKQotCSAgICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QpKSk7Ci0JICBuLT5uZXh0ID0gZXhwb3J0X3N5bWJvbHM7Ci0JICBuLT5uYW1lID0gYnV5c3RyaW5nIChzeW1uYW1lKTsKLQkgIG4tPnN5c2NhbGwgPSBzeXNjYWxsOwotCSAgZXhwb3J0X3N5bWJvbHMgPSBuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBzeW1uYW1lLCBmYWxzZSwgZmFsc2UsCi0JCQkJICAgIHRydWUpOwotCSAgaWYgKGggPT0gTlVMTCB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotCSAgICB7Ci0JICAgICAgLyogV2UgY2FuIGp1c3QgaWdub3JlIGF0dGVtcHRzIHRvIGltcG9ydCBhbiB1bnJlZmVyZW5jZWQKLQkJIHN5bWJvbC4gICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBoLAotCQkJCQkgICAgIGFkZHJlc3MsIGltcHBhdGgsIGltcGZpbGUsCi0JCQkJCSAgICAgaW1wbWVtYmVyKSkKLQkJZWluZm8gKCIlWCVzOiVkOiBmYWlsZWQgdG8gaW1wb3J0IHN5bWJvbCAlczogJUVcbiIsCi0JCSAgICAgICBmaWxlbmFtZSwgbGluZW5vLCBzeW1uYW1lKTsKLQkgICAgfQotCX0KLQotICAgICAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKLSAgICB9Ci0KLSAgaWYgKG9ic3RhY2tfb2JqZWN0X3NpemUgKG8pID4gMCkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVzOiVkOiB3YXJuaW5nOiBpZ25vcmluZyB1bnRlcm1pbmF0ZWQgbGFzdCBsaW5lXG4iLAotCSAgICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0gICAgICBvYnN0YWNrX2ZyZWUgKG8sIG9ic3RhY2tfYmFzZSAobykpOwotICAgIH0KLQotICBpZiAoISBrZWVwKQotICAgIHsKLSAgICAgIG9ic3RhY2tfZnJlZSAobywgTlVMTCk7Ci0gICAgICBmcmVlIChvKTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgcm91dGluZSBzYXZlcyB1cyBmcm9tIHdvcnJ5aW5nIGFib3V0IGRlY2xhcmluZyBmcmVlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZyZWUgKHApCi0gICAgIFBUUiBwOwotewotICBmcmVlIChwKTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUgdmlhCi0gICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEl0IGxvb2tzIGZvciByZWxvY2F0aW9ucyBhbmQgYXNzaWdubWVudHMKLSAgIHRvIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9yZWxvY3MgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtKQotICAgIHsKLSAgICAgIGxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUgKnJzOwotCi0gICAgICBycyA9ICZzLT5yZWxvY19zdGF0ZW1lbnQ7Ci0gICAgICBpZiAocnMtPm5hbWUgPT0gTlVMTCkKLQllaW5mbyAoIiVGJVA6IG9ubHkgcmVsb2NhdGlvbnMgYWdhaW5zdCBzeW1ib2xzIGFyZSBwZXJtaXR0ZWRcbiIpOwotICAgICAgaWYgKCEgYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIHJzLT5uYW1lKSkKLQllaW5mbyAoIiVGJVA6IGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jIGZhaWxlZDogJUVcbiIpOwotICAgIH0KLQotICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtKQotICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCk7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCBhbiBleHByZXNzaW9uIGZvciBhbiBhc3NpZ25tZW50IHN0YXRlbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHApCi0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgc3dpdGNoIChleHAtPnR5cGUubm9kZV9jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBldHJlZV9wcm92aWRlOgotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZXhwLT5hc3NpZ24uZHN0LAotCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQlicmVhazsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBldHJlZV9hc3NpZ246Ci0gICAgICBpZiAoc3RyY21wIChleHAtPmFzc2lnbi5kc3QsICIuIikgIT0gMCkKLQl7Ci0JICBpZiAoISBiZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywKLQkJCQkJCSAgZXhwLT5hc3NpZ24uZHN0KSkKLQkgICAgZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gcmVjb3JkIGFzc2lnbm1lbnQgdG8gJXM6ICVFXG4iLAotCQkgICBleHAtPmFzc2lnbi5kc3QpOwotCX0KLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YXNzaWduLnNyYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYmluYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkubGhzKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdHJpbmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5jb25kKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5saHMpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnVuYXJ5LmNoaWxkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiAke3NyY2Rpcn0vZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4sCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgMCwJLyogZmluaXNoICovCi0gIDAsCS8qIGNyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzICovCi0gIDAsCS8qIG9wZW5fZHluYW1pY19hcmNoaXZlICovCi0gIDAsCS8qIHBsYWNlX29ycGhhbiAqLwotICAwLAkvKiBzZXRfc3ltYm9scyAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV91bnJlY29nbml6ZWRfZmlsZQotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2FybWNvZmYuZW0gYi9sZC9lbXVsdGVtcGwvYXJtY29mZi5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1NWZkYS4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvYXJtY29mZi5lbQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIGVtdWxhdGUgdGhlIG9yaWdpbmFsIGdsZCBmb3IgdGhlIGdpdmVuICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0KLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLXN0YXRpYyBpbnQgIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgUEFSQU1TKChpbnQsIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMgUEFSQU1TICgoRklMRSAqKSk7Ci0KLS8qIElmIHRydWUsIHRoZW4gaW50ZXJ3b3JraW5nIHN0dWJzIHdoaWNoIHN1cHBvcnQgY2FsbHMgdG8gb2xkLCBub24taW50ZXJ3b3JraW5nCi0gICBhd2FyZSBBUk0gY29kZSBzaG91bGQgYmUgZ2VuZXJhdGVkLiAgKi8KLQotc3RhdGljIGludCBzdXBwb3J0X29sZF9jb2RlID0gMDsKLQotI2RlZmluZSBPUFRJT05fU1VQUE9SVF9PTERfQ09ERQkJMzAwCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPQotewotICB7InN1cHBvcnQtb2xkLWNvZGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NVUFBPUlRfT0xEX0NPREV9LAotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19OwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLXN1cHBvcnQtb2xkLWNvZGUgICBTdXBwb3J0IGludGVyd29ya2luZyB3aXRoIG9sZCBjb2RlXG4iKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCAgICAgYXJnYzsKLSAgICAgY2hhciAqKiBhcmd2OwotewotICBpbnQgICAgICAgIGxvbmdpbmQ7Ci0gIGludCAgICAgICAgb3B0YzsKLSAgaW50ICAgICAgICBwcmV2b3B0aW5kID0gb3B0aW5kOwotICBpbnQgICAgICAgIHByZXZvcHRlcnIgPSBvcHRlcnI7Ci0gIGludCAgICAgICAgd2FudGVycm9yOwotICBzdGF0aWMgaW50IGxhc3RvcHRpbmQgPSAtMTsKLQotICBpZiAobGFzdG9wdGluZCAhPSBvcHRpbmQpCi0gICAgb3B0ZXJyID0gMDsKLSAgCi0gIHdhbnRlcnJvciAgPSBvcHRlcnI7Ci0gIGxhc3RvcHRpbmQgPSBvcHRpbmQ7Ci0KLSAgb3B0YyAgID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgIi0iLCBsb25nb3B0cywgJiBsb25naW5kKTsKLSAgb3B0ZXJyID0gcHJldm9wdGVycjsKLQotICBzd2l0Y2ggKG9wdGMpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAod2FudGVycm9yKQotCXhleGl0ICgxKTsKLSAgICAgIG9wdGluZCA9ICBwcmV2b3B0aW5kOwotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIE9QVElPTl9TVVBQT1JUX09MRF9DT0RFOgotICAgICAgc3VwcG9ydF9vbGRfY29kZSA9IDE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICByZXR1cm4gMTsKLX0KLQwKLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgKCkKLXsKLSNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KLSAgbGRmaWxlX3NldF9vdXRwdXRfYXJjaCAoImBlY2hvICR7QVJDSH1gIik7Ci0jZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKLSAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiAoKQotewotICAvKiB3ZSBzaG91bGQgYmUgYWJsZSB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGludGVyd29ya2luZyBzdHViIHNlY3Rpb24gKi8KLQotICAvKiBIZXJlIHdlIHJ1bW1hZ2UgdGhyb3VnaCB0aGUgZm91bmQgYmZkcyB0byBjb2xsZWN0IGdsdWUgaW5mb3JtYXRpb24gKi8KLSAgLyogRklYTUU6IHNob3VsZCB0aGlzIGJlIGJhc2VkIG9uIGEgY29tbWFuZCBsaW5lIG9wdGlvbj8ga3JrQGN5Z251cy5jb20gKi8KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlpZiAoISBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLQkgICAgKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbywgc3VwcG9ydF9vbGRfY29kZSkpCi0JICB7Ci0JICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgIGVpbmZvIChfKCJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIiksIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zICgmIGxpbmtfaW5mbyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuICgpCi17Ci0gIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICB7Ci0gICAgICBpZiAoYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbykpCi0JYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiAke3NyY2Rpcn0vZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4sCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgTlVMTCwgLyogZmluaXNoICovCi0gIE5VTEwsIC8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIE5VTEwsIC8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCi0gIE5VTEwsIC8qIHBsYWNlIG9ycGhhbiAqLwotICBOVUxMLCAvKiBzZXRfc3ltYm9scyAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzLAotICBOVUxMLCAvKiB1bnJlY29nbmlzZWQgZmlsZSAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9hcm1lbGYuZW0gYi9sZC9lbXVsdGVtcGwvYXJtZWxmLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2Y3YWNhLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9hcm1lbGYuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTUzICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLUVMRlNJWkU9MzIKLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogZW11bGF0ZSB0aGUgb3JpZ2luYWwgZ2xkIGZvciB0aGUgZ2l2ZW4gJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0KLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotCi1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHNlYXJjaF9kaXJzX3R5cGUgKiwgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZAotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3N0YXRfbmVlZGVkCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV92ZXJjaGVjawotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IFBBUkFNUyAoKGV0cmVlX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbgotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlICgpCi17Ci0jaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCi0gIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggKCJgZWNobyAke0FSQ0h9YCIpOwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi0gIGNvbmZpZy5keW5hbWljX2xpbmsgPSAke0RZTkFNSUNfTElOSy10cnVlfTsKLSAgY29uZmlnLmhhc19zaGFyZWQgPSBgaWYgdGVzdCAtbiAiJEdFTkVSQVRFX1NITElCX1NDUklQVCIgOyB0aGVuIGVjaG8gdHJ1ZSA7IGVsc2UgZWNobyBmYWxzZSA7IGZpYDsKLX0KLQotLyogVHJ5IHRvIG9wZW4gYSBkeW5hbWljIGFyY2hpdmUuICBUaGlzIGlzIHdoZXJlIHdlIGtub3cgdGhhdCBFTEYKLSAgIGR5bmFtaWMgbGlicmFyaWVzIGhhdmUgYW4gZXh0ZW5zaW9uIG9mIC5zby4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSAoYXJjaCwgc2VhcmNoLCBlbnRyeSkKLSAgICAgY29uc3QgY2hhciAqYXJjaDsKLSAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKnN0cmluZzsKLQotICBpZiAoISBlbnRyeS0+aXNfYXJjaGl2ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmlsZW5hbWUgPSBlbnRyeS0+ZmlsZW5hbWU7Ci0KLSAgc3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpCi0JCQkgICAgICsgc3RybGVuIChmaWxlbmFtZSkKLQkJCSAgICAgKyBzdHJsZW4gKGFyY2gpCi0JCQkgICAgICsgc2l6ZW9mICIvbGliLnNvIik7Ci0KLSAgc3ByaW50ZiAoc3RyaW5nLCAiJXMvbGliJXMlcy5zbyIsIHNlYXJjaC0+bmFtZSwgZmlsZW5hbWUsIGFyY2gpOwotCi0gIGlmICghIGxkZmlsZV90cnlfb3Blbl9iZmQgKHN0cmluZywgZW50cnkpKQotICAgIHsKLSAgICAgIGZyZWUgKHN0cmluZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVudHJ5LT5maWxlbmFtZSA9IHN0cmluZzsKLQotICAvKiBXZSBoYXZlIGZvdW5kIGEgZHluYW1pYyBvYmplY3QgdG8gaW5jbHVkZSBpbiB0aGUgbGluay4gIFRoZSBFTEYKLSAgICAgYmFja2VuZCBsaW5rZXIgd2lsbCBjcmVhdGUgYSBEVF9ORUVERUQgZW50cnkgaW4gdGhlIC5keW5hbWljCi0gICAgIHNlY3Rpb24gbmFtaW5nIHRoaXMgZmlsZS4gIElmIHRoaXMgZmlsZSBpbmNsdWRlcyBhIERUX1NPTkFNRQotICAgICBlbnRyeSwgaXQgd2lsbCBiZSB1c2VkLiAgT3RoZXJ3aXNlLCB0aGUgRUxGIGxpbmtlciB3aWxsIGp1c3QgdXNlCi0gICAgIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiAgRm9yIGFuIGFyY2hpdmUgZm91bmQgYnkgc2VhcmNoaW5nLCBsaWtlCi0gICAgIHRoaXMgb25lLCB0aGUgRFRfTkVFREVEIGVudHJ5IHNob3VsZCBjb25zaXN0IG9mIGp1c3QgdGhlIG5hbWUgb2YKLSAgICAgdGhlIGZpbGUsIHdpdGhvdXQgdGhlIHBhdGggaW5mb3JtYXRpb24gdXNlZCB0byBmaW5kIGl0LiAgTm90ZQotICAgICB0aGF0IHdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIGlmIHdlIGhhdmUgYSBkeW5hbWljIG9iamVjdDsgYW4KLSAgICAgYXJjaGl2ZSB3aWxsIG5ldmVyIGJlIHJlZmVyZW5jZWQgYnkgYSBEVF9ORUVERUQgZW50cnkuCi0KLSAgICAgRklYTUU6IFRoaXMgYXBwcm9hY2gtLXVzaW5nIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lLS1pcyBub3QKLSAgICAgdmVyeSBwcmV0dHkuICBJIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIHRoaW5rIG9mIGFueXRoaW5nIHRoYXQgaXMKLSAgICAgcHJldHR5LCB0aG91Z2guICAqLwotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZW50cnktPnRoZV9iZmQsIGJmZF9vYmplY3QpCi0gICAgICAmJiAoZW50cnktPnRoZV9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICpuZWVkZWRfbmFtZTsKLQotICAgICAgQVNTRVJUIChlbnRyeS0+aXNfYXJjaGl2ZSAmJiBlbnRyeS0+c2VhcmNoX2RpcnNfZmxhZyk7Ci0gICAgICBuZWVkZWRfbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoZmlsZW5hbWUpCi0JCQkJICAgICAgKyBzdHJsZW4gKGFyY2gpCi0JCQkJICAgICAgKyBzaXplb2YgImxpYi5zbyIpOwotICAgICAgc3ByaW50ZiAobmVlZGVkX25hbWUsICJsaWIlcyVzLnNvIiwgZmlsZW5hbWUsIGFyY2gpOwotICAgICAgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUgKGVudHJ5LT50aGVfYmZkLCBuZWVkZWRfbmFtZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1FT0YKLWlmIFsgIngke2hvc3R9IiA9ICJ4JHt0YXJnZXR9IiBdIDsgdGhlbgotICBpZiBbICJ4JHtERUZBVUxUX0VNVUxBVElPTn0iID0gIngke0VNVUxBVElPTl9OQU1FfSIgXSA7IHRoZW4KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLS8qIEZvciBhIG5hdGl2ZSBsaW5rZXIsIGNoZWNrIHRoZSBmaWxlIC9ldGMvbGQuc28uY29uZiBmb3IgZGlyZWN0b3JpZXMKLSAgIGluIHdoaWNoIHdlIG1heSBmaW5kIHNoYXJlZCBsaWJyYXJpZXMuICAvZXRjL2xkLnNvLmNvbmYgaXMgcmVhbGx5Ci0gICBvbmx5IG1lYW5pbmdmdWwgb24gTGludXgsIGJ1dCB3ZSBjaGVjayBpdCBvbiBvdGhlciBzeXN0ZW1zIGFueWhvdy4gICovCi0KLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX2xkX3NvX2NvbmYKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX2xkX3NvX2NvbmYgKG5hbWUsIGZvcmNlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgZm9yY2U7Ci17Ci0gIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkOwotICBzdGF0aWMgY2hhciAqbGRfc29fY29uZjsKLQotICBpZiAoISBpbml0aWFsaXplZCkKLSAgICB7Ci0gICAgICBGSUxFICpmOwotCi0gICAgICBmID0gZm9wZW4gKCIvZXRjL2xkLnNvLmNvbmYiLCBGT1BFTl9SVCk7Ci0gICAgICBpZiAoZiAhPSBOVUxMKQotCXsKLQkgIGNoYXIgKmI7Ci0JICBzaXplX3QgbGVuLCBhbGxvYzsKLQkgIGludCBjOwotCi0JICBsZW4gPSAwOwotCSAgYWxsb2MgPSAxMDA7Ci0JICBiID0gKGNoYXIgKikgeG1hbGxvYyAoYWxsb2MpOwotCi0JICB3aGlsZSAoKGMgPSBnZXRjIChmKSkgIT0gRU9GKQotCSAgICB7Ci0JICAgICAgaWYgKGxlbiArIDEgPj0gYWxsb2MpCi0JCXsKLQkJICBhbGxvYyAqPSAyOwotCQkgIGIgPSAoY2hhciAqKSB4cmVhbGxvYyAoYiwgYWxsb2MpOwotCQl9Ci0JICAgICAgaWYgKGMgIT0gJzonCi0JCSAgJiYgYyAhPSAnICcKLQkJICAmJiBjICE9ICdcdCcKLQkJICAmJiBjICE9ICdcbicKLQkJICAmJiBjICE9ICcsJykKLQkJewotCQkgIGJbbGVuXSA9IGM7Ci0JCSAgKytsZW47Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAobGVuID4gMCAmJiBiW2xlbiAtIDFdICE9ICc6JykKLQkJICAgIHsKLQkJICAgICAgYltsZW5dID0gJzonOwotCQkgICAgICArK2xlbjsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmIChsZW4gPiAwICYmIGJbbGVuIC0gMV0gPT0gJzonKQotCSAgICAtLWxlbjsKLQotCSAgaWYgKGxlbiA+IDApCi0JICAgIGJbbGVuXSA9ICdcMCc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcmVlIChiKTsKLQkgICAgICBiID0gTlVMTDsKLQkgICAgfQotCi0JICBmY2xvc2UgKGYpOwotCi0JICBsZF9zb19jb25mID0gYjsKLQl9Ci0KLSAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGxkX3NvX2NvbmYgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGxkX3NvX2NvbmYsIG5hbWUsIGZvcmNlKTsKLX0KLQotRU9GCi0gIGZpCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotLyogVGhlc2UgdmFyaWFibGVzIGFyZSByZXF1aXJlZCB0byBwYXNzIGluZm9ybWF0aW9uIGJhY2sgYW5kIGZvcnRoCi0gICBiZXR3ZWVuIGFmdGVyX29wZW4gYW5kIGNoZWNrX25lZWRlZCBhbmQgc3RhdF9uZWVkZWQgYW5kIHZlcmNoZWNrLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqZ2xvYmFsX25lZWRlZDsKLXN0YXRpYyBzdHJ1Y3Qgc3RhdCBnbG9iYWxfc3RhdDsKLXN0YXRpYyBib29sZWFuIGdsb2JhbF9mb3VuZDsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmdsb2JhbF92ZXJjaGVja19uZWVkZWQ7Ci1zdGF0aWMgYm9vbGVhbiBnbG9iYWxfdmVyY2hlY2tfZmFpbGVkOwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiAoKQotewotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZCwgKmw7Ci0KLSAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgIHsKLSAgICAgIC8qIFRoZSBpbnRlcndvcmtpbmcgYmZkIG11c3QgYmUgdGhlIGxhc3Qgb25lIHRvIGJlIHByb2Nlc3NlZCAqLwotICAgICAgaWYgKCFpcy0+bmV4dCkKLSAgICAgICAgIGJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8pOwotICAgIH0KLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcyB3aGVuIGRvaW5nIGEgZmluYWwgbGluay4gICovCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlIHx8IGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcmV0dXJuOwotCi0gIC8qIEdldCB0aGUgbGlzdCBvZiBmaWxlcyB3aGljaCBhcHBlYXIgaW4gRFRfTkVFREVEIGVudHJpZXMgaW4KLSAgICAgZHluYW1pYyBvYmplY3RzIGluY2x1ZGVkIGluIHRoZSBsaW5rIChvZnRlbiB0aGVyZSB3aWxsIGJlIG5vbmUpLgotICAgICBGb3IgZWFjaCBzdWNoIGZpbGUsIHdlIHdhbnQgdG8gdHJhY2sgZG93biB0aGUgY29ycmVzcG9uZGluZwotICAgICBsaWJyYXJ5LCBhbmQgaW5jbHVkZSB0aGUgc3ltYm9sIHRhYmxlIGluIHRoZSBsaW5rLiAgVGhpcyBpcyB3aGF0Ci0gICAgIHRoZSBydW50aW1lIGR5bmFtaWMgbGlua2VyIHdpbGwgZG8uICBUcmFja2luZyB0aGUgZmlsZXMgZG93biBoZXJlCi0gICAgIHBlcm1pdHMgb25lIGR5bmFtaWMgb2JqZWN0IHRvIGluY2x1ZGUgYW5vdGhlciB3aXRob3V0IHJlcXVpcmluZwotICAgICBzcGVjaWFsIGFjdGlvbiBieSB0aGUgcGVyc29uIGRvaW5nIHRoZSBsaW5rLiAgTm90ZSB0aGF0IHRoZQotICAgICBuZWVkZWQgbGlzdCBjYW4gYWN0dWFsbHkgZ3JvdyB3aGlsZSB3ZSBhcmUgc3RlcHBpbmcgdGhyb3VnaCB0aGlzCi0gICAgIGxvb3AuICAqLwotICBuZWVkZWQgPSBiZmRfZWxmX2dldF9uZWVkZWRfbGlzdCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0gIGZvciAobCA9IG5lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmxsOwotICAgICAgaW50IGZvcmNlOwotCi0gICAgICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBmaWxlLCBza2lwIGl0LiAgKi8KLSAgICAgIGZvciAobGwgPSBuZWVkZWQ7IGxsICE9IGw7IGxsID0gbGwtPm5leHQpCi0JaWYgKHN0cmNtcCAobGwtPm5hbWUsIGwtPm5hbWUpID09IDApCi0JICBicmVhazsKLSAgICAgIGlmIChsbCAhPSBsKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBmaWxlIHdhcyBpbmNsdWRlZCBpbiB0aGUgbGluayBleHBsaWNpdGx5LiAgKi8KLSAgICAgIGdsb2JhbF9uZWVkZWQgPSBsOwotICAgICAgZ2xvYmFsX2ZvdW5kID0gZmFsc2U7Ci0gICAgICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCk7Ci0gICAgICBpZiAoZ2xvYmFsX2ZvdW5kKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBuZWVkIHRvIGZpbmQgdGhpcyBmaWxlIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2wgdGFibGUuICBXZQotCSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlIGZpbGUgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhlIGR5bmFtaWMKLQkgbGlua2VyIHdpbGwgc2VhcmNoLiAgVGhhdCBtZWFucyB0aGF0IHdlIHdhbnQgdG8gdXNlCi0JIHJwYXRoX2xpbmssIHJwYXRoLCB0aGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotCSBMRF9MSUJSQVJZX1BBVEggKG5hdGl2ZSBvbmx5KSwgdGhlbiB0aGUgbGlua2VyIHNjcmlwdAotCSBMSUJfU0VBUkNIX0RJUlMuICBXZSBkbyBub3Qgc2VhcmNoIHVzaW5nIHRoZSAtTCBhcmd1bWVudHMuCi0KLQkgV2Ugc2VhcmNoIHR3aWNlLiAgVGhlIGZpcnN0IHRpbWUsIHdlIHNraXAgb2JqZWN0cyB3aGljaCBtYXkKLQkgaW50cm9kdWNlIHZlcnNpb24gbWlzbWF0Y2hlcy4gIFRoZSBzZWNvbmQgdGltZSwgd2UgZm9yY2UKLQkgdGhlaXIgdXNlLiAgU2VlIGdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrIGNvbW1lbnQuICAqLwotICAgICAgZm9yIChmb3JjZSA9IDA7IGZvcmNlIDwgMjsgZm9yY2UrKykKLQl7Ci0JICBjb25zdCBjaGFyICpsaWJfcGF0aDsKLQkgIHNpemVfdCBsZW47Ci0JICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0KLQkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChjb21tYW5kX2xpbmUucnBhdGhfbGluaywKLQkJCQkJCSAgbC0+bmFtZSwgZm9yY2UpKQotCSAgICBicmVhazsKLQkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChjb21tYW5kX2xpbmUucnBhdGgsCi0JCQkJCQkgIGwtPm5hbWUsIGZvcmNlKSkKLQkgICAgYnJlYWs7Ci0JICBpZiAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmsgPT0gTlVMTAotCSAgICAgICYmIGNvbW1hbmRfbGluZS5ycGF0aCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbGliX3BhdGggPSAoY29uc3QgY2hhciAqKSBnZXRlbnYgKCJMRF9SVU5fUEFUSCIpOwotCSAgICAgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChsaWJfcGF0aCwgbC0+bmFtZSwKLQkJCQkJCSAgICAgIGZvcmNlKSkKLQkJYnJlYWs7Ci0JICAgIH0KLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGlmIFsgIngke0RFRkFVTFRfRU1VTEFUSU9OfSIgPSAieCR7RU1VTEFUSU9OX05BTUV9IiBdIDsgdGhlbgotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQkgIGxpYl9wYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfTElCUkFSWV9QQVRIIik7Ci0JICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAobGliX3BhdGgsIGwtPm5hbWUsIGZvcmNlKSkKLQkgICAgYnJlYWs7Ci1FT0YKLSAgZmkKLWZpCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCSAgbGVuID0gc3RybGVuIChsLT5uYW1lKTsKLQkgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCi0JICAgIHsKLQkgICAgICBjaGFyICpmaWxlbmFtZTsKLQotCSAgICAgIGlmIChzZWFyY2gtPmNtZGxpbmUpCi0JCWNvbnRpbnVlOwotCSAgICAgIGZpbGVuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpICsgbGVuICsgMik7Ci0JICAgICAgc3ByaW50ZiAoZmlsZW5hbWUsICIlcy8lcyIsIHNlYXJjaC0+bmFtZSwgbC0+bmFtZSk7Ci0JICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKGZpbGVuYW1lLCBmb3JjZSkpCi0JCWJyZWFrOwotCSAgICAgIGZyZWUgKGZpbGVuYW1lKTsKLQkgICAgfQotCSAgaWYgKHNlYXJjaCAhPSBOVUxMKQotCSAgICBicmVhazsKLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGlmIFsgIngke0RFRkFVTFRfRU1VTEFUSU9OfSIgPSAieCR7RU1VTEFUSU9OX05BTUV9IiBdIDsgdGhlbgotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19sZF9zb19jb25mIChsLT5uYW1lLCBmb3JjZSkpCi0JICAgIGJyZWFrOwotRU9GCi0gIGZpCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQl9Ci0KLSAgICAgIGlmIChmb3JjZSA8IDIpCi0JY29udGludWU7Ci0KLSAgICAgIGVpbmZvICgiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG5vdCBmb3VuZCAodHJ5IHVzaW5nIC0tcnBhdGgpXG4iLAotCSAgICAgbC0+bmFtZSwgbC0+YnkpOwotICAgIH0KLX0KLQotLyogU2VhcmNoIGZvciBhIG5lZWRlZCBmaWxlIGluIGEgcGF0aC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChwYXRoLCBuYW1lLCBmb3JjZSkKLSAgICAgY29uc3QgY2hhciAqcGF0aDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGZvcmNlOwotewotICBjb25zdCBjaGFyICpzOwotICBzaXplX3QgbGVuOwotCi0gIGlmIChwYXRoID09IE5VTEwgfHwgKnBhdGggPT0gJ1wwJykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGNoYXIgKmZpbGVuYW1lLCAqc3NldDsKLQotICAgICAgcyA9IHN0cmNociAocGF0aCwgJzonKTsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JcyA9IHBhdGggKyBzdHJsZW4gKHBhdGgpOwotCi0gICAgICBmaWxlbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHMgLSBwYXRoICsgbGVuICsgMik7Ci0gICAgICBpZiAocyA9PSBwYXRoKQotCXNzZXQgPSBmaWxlbmFtZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1jcHkgKGZpbGVuYW1lLCBwYXRoLCBzIC0gcGF0aCk7Ci0JICBmaWxlbmFtZVtzIC0gcGF0aF0gPSAnLyc7Ci0JICBzc2V0ID0gZmlsZW5hbWUgKyAocyAtIHBhdGgpICsgMTsKLQl9Ci0gICAgICBzdHJjcHkgKHNzZXQsIG5hbWUpOwotCi0gICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoZmlsZW5hbWUsIGZvcmNlKSkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgZnJlZSAoZmlsZW5hbWUpOwotCi0gICAgICBpZiAoKnMgPT0gJ1wwJykKLQlicmVhazsKLSAgICAgIHBhdGggPSBzICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwkgIAotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBwb3NzaWJsZSBuYW1lIGZvciBhIGR5bmFtaWMgb2JqZWN0Ci0gICBuYW1lZCBieSBhIERUX05FRURFRCBlbnRyeS4gIFRoZSBGT1JDRSBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIKLSAgIHRvIHNraXAgdGhlIGNoZWNrIGZvciBhIGNvbmZsaWN0aW5nIHZlcnNpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAobmFtZSwgZm9yY2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBmb3JjZTsKLXsKLSAgYmZkICphYmZkOwotCi0gIGFiZmQgPSBiZmRfb3BlbnIgKG5hbWUsIGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSk7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLSAgICB7Ci0gICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpID09IDApCi0gICAgewotICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBvYmplY3Qgd291bGQgaW5jbHVkZSBhbnkgY29uZmxpY3RpbmcgbGlicmFyeQotICAgICB2ZXJzaW9ucy4gIElmIEZPUkNFIGlzIHNldCwgdGhlbiB3ZSBza2lwIHRoaXMgY2hlY2s7IHdlIHVzZSB0aGlzCi0gICAgIHRoZSBzZWNvbmQgdGltZSBhcm91bmQsIGlmIHdlIGNvdWxkbid0IGZpbmQgYW55IGNvbXBhdGlibGUKLSAgICAgaW5zdGFuY2Ugb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotICBpZiAoISBmb3JjZSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZDsKLQotICAgICAgaWYgKCEgYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0IChhYmZkLCAmbmVlZGVkKSkKLQllaW5mbyAoIiVGJVA6JUI6IGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdCBmYWlsZWQ6ICVFXG4iLCBhYmZkKTsKLQotICAgICAgaWYgKG5lZWRlZCAhPSBOVUxMKQotCXsKLQkgIGdsb2JhbF92ZXJjaGVja19uZWVkZWQgPSBuZWVkZWQ7Ci0JICBnbG9iYWxfdmVyY2hlY2tfZmFpbGVkID0gZmFsc2U7Ci0JICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrKTsKLQkgIGlmIChnbG9iYWxfdmVyY2hlY2tfZmFpbGVkKQotCSAgICB7Ci0JICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0JICAgICAgLyogUmV0dXJuIGZhbHNlIHRvIGZvcmNlIHRoZSBjYWxsZXIgdG8gbW92ZSBvbiB0byB0cnkKLSAgICAgICAgICAgICAgICAgYW5vdGhlciBmaWxlIG9uIHRoZSBzZWFyY2ggcGF0aC4gICovCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIEJ1dCB3YWl0ISAgSXQgZ2V0cyBtdWNoIHdvcnNlLiAgT24gTGludXgsIGlmIGEgc2hhcmVkCi0gICAgICAgICAgICAgbGlicmFyeSBkb2VzIG5vdCB1c2UgbGliYyBhdCBhbGwsIHdlIGFyZSBzdXBwb3NlZCB0byBza2lwCi0gICAgICAgICAgICAgaXQgdGhlIGZpcnN0IHRpbWUgYXJvdW5kIGluIGNhc2Ugd2UgZW5jb3VudGVyIGEgc2hhcmVkCi0gICAgICAgICAgICAgbGlicmFyeSBsYXRlciBvbiB3aXRoIHRoZSBzYW1lIG5hbWUgd2hpY2ggZG9lcyB1c2UgdGhlCi0gICAgICAgICAgICAgdmVyc2lvbiBvZiBsaWJjIHRoYXQgd2Ugd2FudC4gIFRoaXMgaXMgbXVjaCB0b28gaG9ycmlibGUKLSAgICAgICAgICAgICB0byB1c2Ugb24gYW55IHN5c3RlbSBvdGhlciB0aGFuIExpbnV4LiAgKi8KLQotRU9GCi1jYXNlICR7dGFyZ2V0fSBpbgotICAqLSotbGludXgtZ251KikKLSAgICBjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCSAgewotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmw7Ci0KLQkgICAgZm9yIChsID0gbmVlZGVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCSAgICAgIGlmIChzdHJuY21wIChsLT5uYW1lLCAibGliYy5zbyIsIDcpID09IDApCi0JCWJyZWFrOwotCSAgICBpZiAobCA9PSBOVUxMKQotCSAgICAgIHsKLQkJKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICB9Ci0KLUVPRgotICAgIDs7Ci1lc2FjCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCX0KLSAgICB9Ci0KLSAgLyogV2UndmUgZm91bmQgYSBkeW5hbWljIG9iamVjdCBtYXRjaGluZyB0aGUgRFRfTkVFREVEIGVudHJ5LiAgKi8KLQotICAvKiBXZSBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZXJlIGlzIG5vIG90aGVyIGlucHV0IGZpbGUgb2YgdGhlCi0gICAgIHNhbWUgbmFtZS4gIFdlIG11c3Qgbm93IGNoZWNrIGFnYWluIHRoYXQgd2UgYXJlIG5vdCBpbmNsdWRpbmcgdGhlCi0gICAgIHNhbWUgZmlsZSB0d2ljZS4gIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIG9uIG1hbnkgc3lzdGVtcwotICAgICBsaWJjLnNvIGlzIGEgc3ltbGluayB0bywgZS5nLiwgbGliYy5zby4xLiAgVGhlIFNPTkFNRSBlbnRyeSB3aWxsCi0gICAgIHJlZmVyZW5jZSBsaWJjLnNvLjEuICBJZiB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgbGliYy5zbywgd2UKLSAgICAgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIGxpYmMuc28uMSBpZiB0aGV5IGFyZSB0aGUgc2FtZSBmaWxlLCBhbmQgd2UKLSAgICAgY2FuIG9ubHkgY2hlY2sgdGhhdCB1c2luZyBzdGF0LiAgKi8KLQotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZnbG9iYWxfc3RhdCkgIT0gMCkKLSAgICBlaW5mbyAoIiVGJVA6JUI6IGJmZF9zdGF0IGZhaWxlZDogJUVcbiIsIGFiZmQpOwotICBnbG9iYWxfZm91bmQgPSBmYWxzZTsKLSAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZCk7Ci0gIGlmIChnbG9iYWxfZm91bmQpCi0gICAgewotICAgICAgLyogUmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB3ZSBmb3VuZCB0aGUgZmlsZSwgZXZlbiB0aG91Z2gKLSAgICAgICAgIHdlIGFyZW4ndCBnb2luZyB0byBkbyBhbnl0aGluZyB3aXRoIGl0LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUZWxsIHRoZSBFTEYgYmFja2VuZCB0aGF0IGRvbid0IHdhbnQgdGhlIG91dHB1dCBmaWxlIHRvIGhhdmUgYQotICAgICBEVF9ORUVERUQgZW50cnkgZm9yIHRoaXMgZmlsZS4gICovCi0gIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIChhYmZkLCAiIik7Ci0KLSAgLyogQWRkIHRoaXMgZmlsZSBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoISBiZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgJmxpbmtfaW5mbykpCi0gICAgZWluZm8gKCIlRiVCOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiwgYWJmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlZSBpZiBhbiBpbnB1dCBmaWxlIG1hdGNoZXMgYSBEVF9ORUVERUQgZW50cnkgYnkgbmFtZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQgKHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIGlmIChnbG9iYWxfZm91bmQpCi0gICAgcmV0dXJuOwotCi0gIGlmIChzLT5maWxlbmFtZSAhPSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKHMtPmZpbGVuYW1lLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotICAgIHsKLSAgICAgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzLT50aGVfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc29uYW1lOwotCi0gICAgICBzb25hbWUgPSBiZmRfZWxmX2dldF9kdF9zb25hbWUgKHMtPnRoZV9iZmQpOwotICAgICAgaWYgKHNvbmFtZSAhPSBOVUxMCi0JICAmJiBzdHJjbXAgKHNvbmFtZSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLQl7Ci0JICBnbG9iYWxfZm91bmQgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0JICAKLSAgaWYgKHMtPnNlYXJjaF9kaXJzX2ZsYWcKLSAgICAgICYmIHMtPmZpbGVuYW1lICE9IE5VTEwKLSAgICAgICYmIHN0cmNociAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgJy8nKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmY7Ci0KLSAgICAgIGYgPSBzdHJyY2hyIChzLT5maWxlbmFtZSwgJy8nKTsKLSAgICAgIGlmIChmICE9IE5VTEwKLQkgICYmIHN0cmNtcCAoZiArIDEsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0JewotCSAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0vKiBTZWUgaWYgYW4gaW5wdXQgZmlsZSBtYXRjaGVzIGEgRFRfTkVFREVEIGVudHJ5IGJ5IHJ1bm5pbmcgc3RhdCBvbgotICAgdGhlIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQgKHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIHN0cnVjdCBzdGF0IHN0OwotICBjb25zdCBjaGFyICpzdWZmaXg7Ci0gIGNvbnN0IGNoYXIgKnNvbmFtZTsKLSAgY29uc3QgY2hhciAqZjsKLQotICBpZiAoZ2xvYmFsX2ZvdW5kKQotICAgIHJldHVybjsKLSAgaWYgKHMtPnRoZV9iZmQgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGJmZF9zdGF0IChzLT50aGVfYmZkLCAmc3QpICE9IDApCi0gICAgewotICAgICAgZWluZm8gKCIlUDolQjogYmZkX3N0YXQgZmFpbGVkOiAlRVxuIiwgcy0+dGhlX2JmZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzdC5zdF9kZXYgPT0gZ2xvYmFsX3N0YXQuc3RfZGV2Ci0gICAgICAmJiBzdC5zdF9pbm8gPT0gZ2xvYmFsX3N0YXQuc3RfaW5vKQotICAgIHsKLSAgICAgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFdlIGlzc3VlIGEgd2FybmluZyBpZiBpdCBsb29rcyBsaWtlIHdlIGFyZSBpbmNsdWRpbmcgdHdvCi0gICAgIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBzaGFyZWQgbGlicmFyeS4gIEZvciBleGFtcGxlLAotICAgICB0aGVyZSBtYXkgYmUgYSBwcm9ibGVtIGlmIC1sYyBwaWNrcyB1cCBsaWJjLnNvLjYgYnV0IHNvbWUgb3RoZXIKLSAgICAgc2hhcmVkIGxpYnJhcnkgaGFzIGEgRFRfTkVFREVEIGVudHJ5IG9mIGxpYmMuc28uNS4gIFRoaXMgaXMgYQotICAgICBodWVyaXN0aWMgdGVzdCwgYW5kIGl0IHdpbGwgb25seSB3b3JrIGlmIHRoZSBuYW1lIGxvb2tzIGxpa2UKLSAgICAgTkFNRS5zby5WRVJTSU9OLiAgRklYTUU6IERlcGVuZGluZyBvbiBmaWxlIG5hbWVzIGlzIGVycm9yLXByb25lLgotICAgICBJZiB3ZSByZWFsbHkgd2FudCB0byBpc3N1ZSB3YXJuaW5ncyBhYm91dCBtaXhpbmcgdmVyc2lvbiBudW1iZXJzCi0gICAgIG9mIHNoYXJlZCBsaWJyYXJpZXMsIHdlIG5lZWQgdG8gZmluZCBhIGJldHRlciB3YXkuICAqLwotCi0gIGlmIChzdHJjaHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICcvJykgIT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIHN1ZmZpeCA9IHN0cnN0ciAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgIi5zby4iKTsKLSAgaWYgKHN1ZmZpeCA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgc3VmZml4ICs9IHNpemVvZiAiLnNvLiIgLSAxOwotCi0gIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7Ci0gIGlmIChzb25hbWUgPT0gTlVMTCkKLSAgICBzb25hbWUgPSBzLT5maWxlbmFtZTsKLQotICBmID0gc3RycmNociAoc29uYW1lLCAnLycpOwotICBpZiAoZiAhPSBOVUxMKQotICAgICsrZjsKLSAgZWxzZQotICAgIGYgPSBzb25hbWU7Ci0KLSAgaWYgKHN0cm5jbXAgKGYsIGdsb2JhbF9uZWVkZWQtPm5hbWUsIHN1ZmZpeCAtIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0gICAgZWluZm8gKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbWF5IGNvbmZsaWN0IHdpdGggJXNcbiIsCi0JICAgZ2xvYmFsX25lZWRlZC0+bmFtZSwgZ2xvYmFsX25lZWRlZC0+YnksIGYpOwotfQotCi0vKiBPbiBMaW51eCwgaXQncyBwb3NzaWJsZSB0byBoYXZlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZQotICAgc2hhcmVkIGxpYnJhcnkgbGlua2VkIGFnYWluc3QgZGlmZmVyZW50IHZlcnNpb25zIG9mIGxpYmMuICBUaGUKLSAgIGR5bmFtaWMgbGlua2VyIHNvbWVob3cgdGFncyB3aGljaCBsaWJjIHZlcnNpb24gdG8gdXNlIGluCi0gICAvZXRjL2xkLnNvLmNhY2hlLCBhbmQsIGJhc2VkIG9uIHRoZSBsaWJjIHRoYXQgaXQgc2VlcyBpbiB0aGUKLSAgIGV4ZWN1dGFibGUsIGNob29zZXMgd2hpY2ggdmVyc2lvbiBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgdG8gdXNlLgotCi0gICBXZSB0cnkgdG8gZG8gYSBzaW1pbGFyIGNoZWNrIGhlcmUgYnkgY2hlY2tpbmcgd2hldGhlciB0aGlzIHNoYXJlZAotICAgbGlicmFyeSBuZWVkcyBhbnkgb3RoZXIgc2hhcmVkIGxpYnJhcmllcyB3aGljaCBtYXkgY29uZmxpY3Qgd2l0aAotICAgbGlicmFyaWVzIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgbGluay4gIElmIGl0IGRvZXMsIHdlCi0gICBza2lwIGl0LCBhbmQgdHJ5IHRvIGZpbmQgYW5vdGhlciBzaGFyZWQgbGlicmFyeSBmYXJ0aGVyIG9uIGRvd24gdGhlCi0gICBsaW5rIHBhdGguCi0KLSAgIFRoaXMgaXMgY2FsbGVkIHZpYSBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUuCi0gICBHTE9CQUxfVkVSQ0hFQ0tfTkVFREVEIGlzIHRoZSBsaXN0IG9mIG9iamVjdHMgbmVlZGVkIGJ5IHRoZSBvYmplY3QKLSAgIHdoaWNoIHdlIGFyIGNoZWNraW5nLiAgVGhpcyBzZXRzIEdMT0JBTF9WRVJDSEVDS19GQUlMRUQgaWYgd2UgZmluZAotICAgYSBjb25mbGljdGluZyB2ZXJzaW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBjb25zdCBjaGFyICpzb25hbWUsICpmOwotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmw7Ci0KLSAgaWYgKGdsb2JhbF92ZXJjaGVja19mYWlsZWQpCi0gICAgcmV0dXJuOwotICBpZiAocy0+dGhlX2JmZCA9PSBOVUxMCi0gICAgICB8fCAoYmZkX2dldF9maWxlX2ZsYWdzIChzLT50aGVfYmZkKSAmIERZTkFNSUMpID09IDApCi0gICAgcmV0dXJuOwotCi0gIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7Ci0gIGlmIChzb25hbWUgPT0gTlVMTCkKLSAgICBzb25hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChzLT50aGVfYmZkKTsKLQotICBmID0gc3RycmNociAoc29uYW1lLCAnLycpOwotICBpZiAoZiAhPSBOVUxMKQotICAgICsrZjsKLSAgZWxzZQotICAgIGYgPSBzb25hbWU7Ci0KLSAgZm9yIChsID0gZ2xvYmFsX3ZlcmNoZWNrX25lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzdWZmaXg7Ci0KLSAgICAgIGlmIChzdHJjbXAgKGYsIGwtPm5hbWUpID09IDApCi0JewotCSAgLyogUHJvYmFibHkgY2FuJ3QgaGFwcGVuLCBidXQgaXQncyBhbiBlYXN5IGNoZWNrLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmNociAobC0+bmFtZSwgJy8nKSAhPSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBzdWZmaXggPSBzdHJzdHIgKGwtPm5hbWUsICIuc28uIik7Ci0gICAgICBpZiAoc3VmZml4ID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIHN1ZmZpeCArPSBzaXplb2YgIi5zby4iIC0gMTsKLQotICAgICAgaWYgKHN0cm5jbXAgKGYsIGwtPm5hbWUsIHN1ZmZpeCAtIGwtPm5hbWUpID09IDApCi0JewotCSAgLyogSGVyZSB3ZSBrbm93IHRoYXQgUyBpcyBhIGR5bmFtaWMgb2JqZWN0IEZPTy5TTy5WRVIxLCBhbmQKLSAgICAgICAgICAgICB0aGUgb2JqZWN0IHdlIGFyZSBjb25zaWRlcmluZyBuZWVkcyBhIGR5bmFtaWMgb2JqZWN0Ci0gICAgICAgICAgICAgRk9PLlNPLlZFUjIsIGFuZCBWRVIxIGFuZCBWRVIyIGFyZSBkaWZmZXJlbnQuICBUaGlzCi0gICAgICAgICAgICAgYXBwZWFycyB0byBiZSBhIHZlcnNpb24gbWlzbWF0Y2gsIHNvIHdlIHRlbGwgdGhlIGNhbGxlcgotICAgICAgICAgICAgIHRvIHRyeSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHRoaXMgbGlicmFyeS4gICovCi0JICBnbG9iYWxfdmVyY2hlY2tfZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0vKiBQbGFjZSBhbiBvcnBoYW4gc2VjdGlvbi4gIFdlIHVzZSB0aGlzIHRvIHB1dCByYW5kb20gU0hGX0FMTE9DCi0gICBzZWN0aW9ucyBpbiB0aGUgcmlnaHQgc2VnbWVudC4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqaG9sZF9zZWN0aW9uOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdXNlOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdGV4dDsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3JvZGF0YTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2RhdGE7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9ic3M7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yZWw7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9pbnRlcnA7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbiAoZmlsZSwgcykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnBsYWNlOwotICBhc2VjdGlvbiAqc25ldywgKipwcHM7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqb2xkOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgYWRkOwotICBldHJlZV90eXBlICphZGRyZXNzOwotICBjb25zdCBjaGFyICpzZWNuYW1lLCAqcHM7Ci0gIGNvbnN0IGNoYXIgKm91dHNlY25hbWU7Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0gIGlmICgocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc2NyaXB0IHRvIHNlZSB3aGVyZSB0byBwbGFjZSB0aGlzIHNlY3Rpb24uICAqLwotICBob2xkX3NlY3Rpb24gPSBzOwotICBob2xkX3VzZSA9IE5VTEw7Ci0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTsKLQotICBpZiAoaG9sZF91c2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGFscmVhZHkgcGxhY2VkIGEgc2VjdGlvbiB3aXRoIHRoaXMgbmFtZS4gICovCi0gICAgICB3aWxkX2RvaXQgKCZob2xkX3VzZS0+Y2hpbGRyZW4sIHMsIGhvbGRfdXNlLCBmaWxlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKHMtPm93bmVyLCBzKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZmluYWwgbGluaywgdGhlbiBhbHdheXMgcHV0IC5nbnUud2FybmluZy5TWU1CT0wKLSAgICAgc2VjdGlvbnMgaW50byB0aGUgLnRleHQgc2VjdGlvbiB0byBnZXQgdGhlbSBvdXQgb2YgdGhlIHdheS4gICovCi0gIGlmICghIGxpbmtfaW5mby5zaGFyZWQKLSAgICAgICYmICEgbGlua19pbmZvLnJlbG9jYXRlYWJsZQotICAgICAgJiYgc3RybmNtcCAoc2VjbmFtZSwgIi5nbnUud2FybmluZy4iLCBzaXplb2YgIi5nbnUud2FybmluZy4iIC0gMSkgPT0gMAotICAgICAgJiYgaG9sZF90ZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgd2lsZF9kb2l0ICgmaG9sZF90ZXh0LT5jaGlsZHJlbiwgcywgaG9sZF90ZXh0LCBmaWxlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBEZWNpZGUgd2hpY2ggc2VnbWVudCB0aGUgc2VjdGlvbiBzaG91bGQgZ28gaW4gYmFzZWQgb24gdGhlCi0gICAgIHNlY3Rpb24gbmFtZSBhbmQgc2VjdGlvbiBmbGFncy4gIFdlIHB1dCBsb2FkYWJsZSAubm90ZSBzZWN0aW9ucwotICAgICByaWdodCBhZnRlciB0aGUgLmludGVycCBzZWN0aW9uLCBzbyB0aGF0IHRoZSBQVF9OT1RFIHNlZ21lbnQgaXMKLSAgICAgc3RvcmVkIHJpZ2h0IGFmdGVyIHRoZSBwcm9ncmFtIGhlYWRlcnMgd2hlcmUgdGhlIE9TIGNhbiByZWFkIGl0Ci0gICAgIGluIHRoZSBmaXJzdCBwYWdlLiAgKi8KLSAgcGxhY2UgPSBOVUxMOwotICBpZiAocy0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwCi0gICAgICAmJiBzdHJuY21wIChzZWNuYW1lLCAiLm5vdGUiLCA0KSA9PSAwCi0gICAgICAmJiBob2xkX2ludGVycCAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9pbnRlcnA7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkgICAmJiBob2xkX2JzcyAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9ic3M7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMAotCSAgICYmIGhvbGRfZGF0YSAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9kYXRhOwotICBlbHNlIGlmIChzdHJuY21wIChzZWNuYW1lLCAiLnJlbCIsIDQpID09IDAKLQkgICAmJiBob2xkX3JlbCAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9yZWw7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0JICAgJiYgKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgJiYgaG9sZF9yb2RhdGEgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfcm9kYXRhOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkgICAmJiBob2xkX3RleHQgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfdGV4dDsKLSAgaWYgKHBsYWNlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENob29zZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgc2VjdGlvbi4gIFRoaXMgd2lsbCBiZSBuZWVkZWQgaWYgdGhlCi0gICAgIHNhbWUgc2VjdGlvbiBuYW1lIGFwcGVhcnMgaW4gdGhlIGlucHV0IGZpbGUgd2l0aCBkaWZmZXJlbnQKLSAgICAgbG9hZGFibGUgb3IgYWxsb2NhdGVhYmxlIGNoYXJhY3RlcmlzdGljcy4gICovCi0gIG91dHNlY25hbWUgPSBzZWNuYW1lOwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dHNlY25hbWUpICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGxlbjsKLSAgICAgIGNoYXIgKm5ld25hbWU7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgbGVuID0gc3RybGVuIChvdXRzZWNuYW1lKTsKLSAgICAgIG5ld25hbWUgPSB4bWFsbG9jIChsZW4gKyA1KTsKLSAgICAgIHN0cmNweSAobmV3bmFtZSwgb3V0c2VjbmFtZSk7Ci0gICAgICBpID0gMDsKLSAgICAgIGRvCi0JewotCSAgc3ByaW50ZiAobmV3bmFtZSArIGxlbiwgIiVkIiwgaSk7Ci0JICArK2k7Ci0JfQotICAgICAgd2hpbGUgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuZXduYW1lKSAhPSBOVUxMKTsKLQotICAgICAgb3V0c2VjbmFtZSA9IG5ld25hbWU7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSB0aGUgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUsIGFuZCBwdXQgaXQgaW4gdGhlIHJpZ2h0Ci0gICAgIHBsYWNlLiAgVGhpcyBzaHVmZmxpbmcgaXMgdG8gbWFrZSB0aGUgb3V0cHV0IGZpbGUgbG9vayBuZWF0ZXIuICAqLwotICBzbmV3ID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0cHV0X2JmZCwgb3V0c2VjbmFtZSk7Ci0gIGlmIChzbmV3ID09IE5VTEwpCi0gICAgICBlaW5mbyAoIiVQJUY6IG91dHB1dCBmb3JtYXQgJXMgY2Fubm90IHJlcHJlc2VudCBzZWN0aW9uIGNhbGxlZCAlc1xuIiwKLQkgICAgIG91dHB1dF9iZmQtPnh2ZWMtPm5hbWUsIG91dHNlY25hbWUpOwotICBpZiAocGxhY2UtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChwcHMgPSAmb3V0cHV0X2JmZC0+c2VjdGlvbnM7ICpwcHMgIT0gc25ldzsgcHBzID0gJigqcHBzKS0+bmV4dCkKLQk7Ci0gICAgICAqcHBzID0gc25ldy0+bmV4dDsKLSAgICAgIHNuZXctPm5leHQgPSBwbGFjZS0+YmZkX3NlY3Rpb24tPm5leHQ7Ci0gICAgICBwbGFjZS0+YmZkX3NlY3Rpb24tPm5leHQgPSBzbmV3OwotICAgIH0KLQotICAvKiBTdGFydCBidWlsZGluZyBhIGxpc3Qgb2Ygc3RhdGVtZW50cyBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgb2xkID0gc3RhdF9wdHI7Ci0gIHN0YXRfcHRyID0gJmFkZDsKLSAgbGFuZ19saXN0X2luaXQgKHN0YXRfcHRyKTsKLQotICAvKiBJZiB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbiBpcyByZXByZXNlbnRhYmxlIGluIEMsIHRoZW4gY3JlYXRlCi0gICAgIHN5bWJvbHMgdG8gbWFyayB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24uICAqLwotICBmb3IgKHBzID0gb3V0c2VjbmFtZTsgKnBzICE9ICdcMCc7IHBzKyspCi0gICAgaWYgKCEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpwcykgJiYgKnBzICE9ICdfJykKLSAgICAgIGJyZWFrOwotICBpZiAoKnBzID09ICdcMCcgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKLSAgICB7Ci0gICAgICBjaGFyICpzeW1uYW1lOwotCi0gICAgICBzeW1uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocHMgLSBvdXRzZWNuYW1lICsgc2l6ZW9mICJfX3N0YXJ0XyIpOwotICAgICAgc3ByaW50ZiAoc3ltbmFtZSwgIl9fc3RhcnRfJXMiLCBvdXRzZWNuYW1lKTsKLSAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBzeW1uYW1lLAotCQkJCSAgICAgIGV4cF91bm9wIChBTElHTl9LLAotCQkJCQkJZXhwX2ludG9wICgoYmZkX3ZtYSkgMQotCQkJCQkJCSAgIDw8IHMtPmFsaWdubWVudF9wb3dlcikpKSk7Ci0gICAgfQotCi0gIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgYWRkcmVzcyA9IE5VTEw7Ci0gIGVsc2UKLSAgICBhZGRyZXNzID0gZXhwX2ludG9wICgoYmZkX3ZtYSkgMCk7Ci0KLSAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKG91dHNlY25hbWUsIGFkZHJlc3MsIDAsCi0JCQkJICAgICAgIChiZmRfdm1hKSAwLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMKTsKLQotICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAob3V0c2VjbmFtZSk7Ci0gIHdpbGRfZG9pdCAoJm9zLT5jaGlsZHJlbiwgcywgb3MsIGZpbGUpOwotCi0gIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Ci0gICAgKChiZmRfdm1hKSAwLCAiKmRlZmF1bHQqIiwgKHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqKSBOVUxMKTsKLSAgc3RhdF9wdHIgPSAmYWRkOwotCi0gIGlmICgqcHMgPT0gJ1wwJyAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bW5hbWU7Ci0KLSAgICAgIHN5bW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChwcyAtIG91dHNlY25hbWUgKyBzaXplb2YgIl9fc3RvcF8iKTsKLSAgICAgIHNwcmludGYgKHN5bW5hbWUsICJfX3N0b3BfJXMiLCBvdXRzZWNuYW1lKTsKLSAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBzeW1uYW1lLAotCQkJCSAgICAgIGV4cF9uYW1lb3AgKE5BTUUsICIuIikpKTsKLSAgICB9Ci0KLSAgLyogTm93IHN0aWNrIHRoZSBuZXcgc3RhdGVtZW50IGxpc3QgcmlnaHQgYWZ0ZXIgUExBQ0UuICAqLwotICAqYWRkLnRhaWwgPSBwbGFjZS0+aGVhZGVyLm5leHQ7Ci0gIHBsYWNlLT5oZWFkZXIubmV4dCA9IGFkZC5oZWFkOwotCi0gIHN0YXRfcHRyID0gb2xkOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbiAocykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLSAgaWYgKHMtPmhlYWRlci50eXBlICE9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW0pCi0gICAgcmV0dXJuOwotCi0gIG9zID0gJnMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLQotICBpZiAoc3RyY21wIChvcy0+bmFtZSwgaG9sZF9zZWN0aW9uLT5uYW1lKSA9PSAwCi0gICAgICAmJiBvcy0+YmZkX3NlY3Rpb24gIT0gTlVMTAotICAgICAgJiYgKChob2xkX3NlY3Rpb24tPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkKLQkgID09IChvcy0+YmZkX3NlY3Rpb24tPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkpKQotICAgIGhvbGRfdXNlID0gb3M7Ci0KLSAgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIudGV4dCIpID09IDApCi0gICAgaG9sZF90ZXh0ID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIucm9kYXRhIikgPT0gMCkKLSAgICBob2xkX3JvZGF0YSA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmRhdGEiKSA9PSAwKQotICAgIGhvbGRfZGF0YSA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmJzcyIpID09IDApCi0gICAgaG9sZF9ic3MgPSBvczsKLSAgZWxzZSBpZiAoaG9sZF9yZWwgPT0gTlVMTAotCSAgICYmIG9zLT5iZmRfc2VjdGlvbiAhPSBOVUxMCi0JICAgJiYgKG9zLT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkgICAmJiBzdHJuY21wIChvcy0+bmFtZSwgIi5yZWwiLCA0KSA9PSAwKQotICAgIGhvbGRfcmVsID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuaW50ZXJwIikgPT0gMCkKLSAgICBob2xkX2ludGVycCA9IG9zOwotfQotCi0vKiBMb29rIHRocm91Z2ggYW4gZXhwcmVzc2lvbiBmb3IgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwKQotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIHN3aXRjaCAoZXhwLT50eXBlLm5vZGVfY2xhc3MpCi0gICAgewotICAgIGNhc2UgZXRyZWVfcHJvdmlkZToKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGV4cC0+YXNzaWduLmRzdCwKLQkJCQlmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JYnJlYWs7Ci0KLSAgICAgIC8qIFdlIGNhbGwgcmVjb3JkX2xpbmtfYXNzaWdubWVudCBldmVuIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZC4KLQkgVGhpcyBpcyBiZWNhdXNlIGlmIGl0IGlzIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgd2UKLQkgYWN0dWFsbHkgd2FudCB0byB1c2UgdGhlIHZhbHVlIGRlZmluZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQsCi0JIG5vdCB0aGUgdmFsdWUgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgKGJlY2F1c2Ugd2UgYXJlIHNldHRpbmcKLQkgc3ltYm9scyBsaWtlIGV0ZXh0KS4gIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBieSBhIHJlZ3VsYXIKLQkgb2JqZWN0LCB0aGVuLCBhcyBpdCBoYXBwZW5zLCBjYWxsaW5nIHJlY29yZF9saW5rX2Fzc2lnbm1lbnQKLQkgd2lsbCBkbyBubyBoYXJtLiAgKi8KLQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIGV0cmVlX2Fzc2lnbjoKLSAgICAgIGlmIChzdHJjbXAgKGV4cC0+YXNzaWduLmRzdCwgIi4iKSAhPSAwKQotCXsKLQkgIGlmICghIChiZmRfZWxmJHtFTEZTSVpFfV9yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0JCSAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgZXhwLT5hc3NpZ24uZHN0LAotCQkgIGV4cC0+dHlwZS5ub2RlX2NsYXNzID09IGV0cmVlX3Byb3ZpZGUgPyB0cnVlIDogZmFsc2UpKSkKLQkgICAgZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gcmVjb3JkIGFzc2lnbm1lbnQgdG8gJXM6ICVFXG4iLAotCQkgICBleHAtPmFzc2lnbi5kc3QpOwotCX0KLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YXNzaWduLnNyYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYmluYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkubGhzKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdHJpbmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5jb25kKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5saHMpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnVuYXJ5LmNoaWxkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUgdmlhCi0gICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEl0IGxvY2F0ZXMgYW55IGFzc2lnbm1lbnQgc3RhdGVtZW50cywgYW5kCi0gICB0ZWxscyB0aGUgRUxGIGJhY2tlbmQgYWJvdXQgdGhlbSwgaW4gY2FzZSB0aGV5IGFyZSBhc3NpZ25tZW50cyB0bwotICAgc3ltYm9scyB3aGljaCBhcmUgcmVmZXJyZWQgdG8gYnkgZHluYW1pYyBvYmplY3RzLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW0pCi0gICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAocy0+YXNzaWdubWVudF9zdGF0ZW1lbnQuZXhwKTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKLSAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiAoKQotewotICBjb25zdCBjaGFyICpycGF0aDsKLSAgYXNlY3Rpb24gKnNpbnRlcnA7Ci0KLSAgLyogSWYgd2UgYXJlIGdvaW5nIHRvIG1ha2UgYW55IHZhcmlhYmxlIGFzc2lnbm1lbnRzLCB3ZSBuZWVkIHRvIGxldAotICAgICB0aGUgRUxGIGJhY2tlbmQga25vdyBhYm91dCB0aGVtIGluIGNhc2UgdGhlIHZhcmlhYmxlcyBhcmUKLSAgICAgcmVmZXJyZWQgdG8gYnkgZHluYW1pYyBvYmplY3RzLiAgKi8KLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQpOwotCi0gIC8qIExldCB0aGUgRUxGIGJhY2tlbmQgd29yayBvdXQgdGhlIHNpemVzIG9mIGFueSBzZWN0aW9ucyByZXF1aXJlZAotICAgICBieSBkeW5hbWljIGxpbmtpbmcuICAqLwotICBycGF0aCA9IGNvbW1hbmRfbGluZS5ycGF0aDsKLSAgaWYgKHJwYXRoID09IE5VTEwpCi0gICAgcnBhdGggPSAoY29uc3QgY2hhciAqKSBnZXRlbnYgKCJMRF9SVU5fUEFUSCIpOwotICBpZiAoISAoYmZkX2VsZiR7RUxGU0laRX1fc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gICAgICAgICAob3V0cHV0X2JmZCwgY29tbWFuZF9saW5lLnNvbmFtZSwgcnBhdGgsCi0JICBjb21tYW5kX2xpbmUuZXhwb3J0X2R5bmFtaWMsIGNvbW1hbmRfbGluZS5maWx0ZXJfc2hsaWIsCi0JICAoY29uc3QgY2hhciAqIGNvbnN0ICopIGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVycywKLQkgICZsaW5rX2luZm8sICZzaW50ZXJwLCBsYW5nX2VsZl92ZXJzaW9uX2luZm8pKSkKLSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byBzZXQgZHluYW1pYyBzZWN0aW9uIHNpemVzOiAlRVxuIik7Ci0KLSAgLyogTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBkeW5hbWljIGxpbmtlciB3ZSBhcmUgdXNpbmcuICAqLwotICBpZiAoY29tbWFuZF9saW5lLmludGVycHJldGVyICE9IE5VTEwKLSAgICAgICYmIHNpbnRlcnAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaW50ZXJwLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXI7Ci0gICAgICBzaW50ZXJwLT5fcmF3X3NpemUgPSBzdHJsZW4gKGNvbW1hbmRfbGluZS5pbnRlcnByZXRlcikgKyAxOwotICAgIH0KLQotICAvKiBMb29rIGZvciBhbnkgc2VjdGlvbnMgbmFtZWQgLmdudS53YXJuaW5nLiAgQXMgYSBHTlUgZXh0ZW5zaW9ucywKLSAgICAgd2UgdHJlYXQgc3VjaCBzZWN0aW9ucyBhcyBjb250YWluaW5nIHdhcm5pbmcgbWVzc2FnZXMuICBXZSBwcmludAotICAgICBvdXQgdGhlIHdhcm5pbmcgbWVzc2FnZSwgYW5kIHRoZW4gemVybyBvdXQgdGhlIHNlY3Rpb24gc2l6ZSBzbwotICAgICB0aGF0IGl0IGRvZXMgbm90IGdldCBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JYXNlY3Rpb24gKnM7Ci0JYmZkX3NpemVfdHlwZSBzejsKLQljaGFyICptc2c7Ci0JYm9vbGVhbiByZXQ7Ci0KLQlpZiAoaXMtPmp1c3Rfc3ltc19mbGFnKQotCSAgY29udGludWU7Ci0KLQlzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlzLT50aGVfYmZkLCAiLmdudS53YXJuaW5nIik7Ci0JaWYgKHMgPT0gTlVMTCkKLQkgIGNvbnRpbnVlOwotCi0Jc3ogPSBiZmRfc2VjdGlvbl9zaXplIChpcy0+dGhlX2JmZCwgcyk7Ci0JbXNnID0geG1hbGxvYyAoKHNpemVfdCkgc3ogKyAxKTsKLQlpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlzLT50aGVfYmZkLCBzLCBtc2csIChmaWxlX3B0cikgMCwgc3opKQotCSAgZWluZm8gKCIlRiVCOiBDYW4ndCByZWFkIGNvbnRlbnRzIG9mIHNlY3Rpb24gLmdudS53YXJuaW5nOiAlRVxuIiwKLQkJIGlzLT50aGVfYmZkKTsKLQltc2dbc3pdID0gJ1wwJzsKLQlyZXQgPSBsaW5rX2luZm8uY2FsbGJhY2tzLT53YXJuaW5nICgmbGlua19pbmZvLCBtc2csCi0JCQkJCSAgICAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkgICAgaXMtPnRoZV9iZmQsIChhc2VjdGlvbiAqKSBOVUxMLAotCQkJCQkgICAgKGJmZF92bWEpIDApOwotCUFTU0VSVCAocmV0KTsKLQlmcmVlIChtc2cpOwotCi0JLyogQ2xvYmJlciB0aGUgc2VjdGlvbiBzaXplLCBzbyB0aGF0IHdlIGRvbid0IHdhc3RlIGNvcHlpbmcgdGhlCi0JICAgd2FybmluZyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0Jcy0+X3Jhd19zaXplID0gMDsKLSAgICAgIH0KLSAgfQotCi0gIC8qIHdlIHNob3VsZCBiZSBhYmxlIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJ3b3JraW5nIHN0dWIgc2VjdGlvbiAqLwotCi0gIC8qIEhlcmUgd2UgcnVtbWFnZSB0aHJvdWdoIHRoZSBmb3VuZCBiZmRzIHRvIGNvbGxlY3QgZ2x1ZSBpbmZvcm1hdGlvbiAqLwotICAvKiBGSVhNRTogc2hvdWxkIHRoaXMgYmUgYmFzZWQgb24gYSBjb21tYW5kIGxpbmUgb3B0aW9uPyBrcmtAY3lnbnVzLmNvbSAqLwotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmICghYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIChpcy0+dGhlX2JmZCwgJmxpbmtfaW5mbykpCi0JICB7Ci0JICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgIGVpbmZvIChfKCJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIiksIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zICgmIGxpbmtfaW5mbyk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgKGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mICR7c3JjZGlyfS9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iLAotICBOVUxMLCAvKiBmaW5pc2ggKi8KLSAgTlVMTCwgLyogY3JlYXRlIG91dHB1dCBzZWN0aW9uIHN0YXRlbWVudHMgKi8KLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbiwKLSAgTlVMTCwgLyogc2V0X3N5bWJvbHMgKi8KLSAgTlVMTCwKLSAgTlVMTCwgLyogdW5yZWNvZ25pc2VkIGZpbGUgKi8KLSAgTlVMTAotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtIGIvbGQvZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDUyNmU1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIGVtdWxhdGUgdGhlIG9yaWdpbmFsIGdsZCBmb3IgdGhlIGdpdmVuICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgXAotCWJmZF9lbGYzMl9hcm1fb2FiaV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgXAotCWJmZF9lbGYzMl9hcm1fb2FiaV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIFwKLQliZmRfZWxmMzJfYXJtX29hYmlfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLQotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0KLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlICgpCi17Ci0jaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCi0gIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggKCJgZWNobyAke0FSQ0h9YCIpOwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0Ci0gICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgLyogd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBpbnRlcndvcmtpbmcgc3R1YiBzZWN0aW9uICovCi0KLSAgLyogSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCBnbHVlIGluZm9ybWF0aW9uICovCi0gIC8qIEZJWE1FOiBzaG91bGQgdGhpcyBiZSBiYXNlZCBvbiBhIGNvbW1hbmQgbGluZSBvcHRpb24/IGtya0BjeWdudXMuY29tICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCFiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGlzLT50aGVfYmZkLCAmbGlua19pbmZvKSkKLQkgIHsKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgZWluZm8gKF8oIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXMiKSwgaXMtPmZpbGVuYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIC8qIFdlIGhhdmUgc2VlbiBpdCBhbGwuIEFsbG9jYXRlIGl0LCBhbmQgY2Fycnkgb24gKi8KLSAgYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgKCYgbGlua19pbmZvKTsKLX0KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLQotICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgewotICAgICAgLyogVGhlIGludGVyd29ya2luZyBiZmQgbXVzdCBiZSB0aGUgbGFzdCBvbmUgdG8gYmUgcHJvY2Vzc2VkICovCi0gICAgICBpZiAoIWlzLT5uZXh0KQotICAgICAgICAgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbyk7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiAke3NyY2Rpcn0vZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4sCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgTlVMTCwgLyogZmluaXNoICovCi0gIE5VTEwsIC8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIE5VTEwsIC8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCi0gIE5VTEwsIC8qIHBsYWNlIG9ycGhhbiAqLwotICBOVUxMLCAvKiBzZXRfc3ltYm9scyAqLwotICBOVUxMLAotICBOVUxMLCAvKiB1bnJlY29nbmlzZWQgZmlsZSAqLwotICBOVUxMCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvYmVvcy5lbSBiL2xkL2VtdWx0ZW1wbC9iZW9zLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmIzZWMyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9iZW9zLmVtCisrKyAvZGV2L251bGwKQEAgLTEsODM3ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0gICBDb3B5cmlnaHQgMTk5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBGb3IgV0lORE9XU19OVCAqLwotLyogVGhlIG9yaWdpbmFsIGZpbGUgZ2VuZXJhdGVkIHJldHVybmVkIGRpZmZlcmVudCBkZWZhdWx0IHNjcmlwdHMgZGVwZW5kaW5nCi0gICBvbiB3aGV0aGVyIGNlcnRhaW4gc3dpdGNoZXMgd2VyZSBzZXQsIGJ1dCB0aGVzZSBzd2l0Y2hlcyBwZXJ0YWluIHRvIHRoZQotICAgTGludXggc3lzdGVtIGFuZCB0aGF0IHBhcnRpY3VsYXIgdmVyc2lvbiBvZiBjb2ZmLiAgSW4gdGhlIE5UIGNhc2UsIHdlCi0gICBvbmx5IGRldGVybWluZSBpZiB0aGUgc3Vic3lzdGVtIGlzIGNvbnNvbGUgb3Igd2luZG93cyBpbiBvcmRlciB0byBzZWxlY3QKLSAgIHRoZSBjb3JyZWN0IGVudHJ5IHBvaW50IGJ5IGRlZmF1bHQuICovIAotICAKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRjdG9yLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIi4uL2JmZC9saWJjb2ZmLmgiCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4KLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgY2hhciAqZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICopKTsKLXN0YXRpYyBpbnQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci0KLSNpZiAwIC8qIGFyZ3VtZW50IHRvIHFzb3J0IHNvIGRvbid0IHByb3RvdHlwZSAqLwotc3RhdGljIGludCBzb3J0X2J5X2ZpbGVfbmFtZSBQQVJBTVMgKCh2b2lkICosIHZvaWQgKikpOwotc3RhdGljIGludCBzb3J0X2J5X3NlY3Rpb25fbmFtZSBQQVJBTVMgKCh2b2lkICosIHZvaWQgKikpOwotI2VuZGlmCi1zdGF0aWMgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnNvcnRfc2VjdGlvbnNfMQotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqLCBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICosIGludCwKLQkgICBpbnQgKCopKCkpKTsKLXN0YXRpYyB2b2lkIHNvcnRfc2VjdGlvbnMgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciBwZTsKLXN0YXRpYyBpbnQgZGxsOwotCi1leHRlcm4gY29uc3QgY2hhciAqb3V0cHV0X2ZpbGVuYW1lOwotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0gIG91dHB1dF9maWxlbmFtZSA9ICJhLmV4ZSI7Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfJHtBUkNIfTsKLX0KLQwKLS8qIFBFIGZvcm1hdCBleHRyYSBjb21tYW5kIGxpbmUgb3B0aW9ucy4gICovCi0KLS8qIFVzZWQgZm9yIHNldHRpbmcgZmxhZ3MgaW4gdGhlIFBFIGhlYWRlci4gKi8KLSNkZWZpbmUgT1BUSU9OX0JBU0VfRklMRQkJKDMwMCAgKyAxKQotI2RlZmluZSBPUFRJT05fRExMCQkJKE9QVElPTl9CQVNFX0ZJTEUgKyAxKQotI2RlZmluZSBPUFRJT05fRklMRV9BTElHTk1FTlQJCShPUFRJT05fRExMICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lNQUdFX0JBU0UJCShPUFRJT05fRklMRV9BTElHTk1FTlQgKyAxKQotI2RlZmluZSBPUFRJT05fTUFKT1JfSU1BR0VfVkVSU0lPTgkoT1BUSU9OX0lNQUdFX0JBU0UgKyAxKQotI2RlZmluZSBPUFRJT05fTUFKT1JfT1NfVkVSU0lPTgkJKE9QVElPTl9NQUpPUl9JTUFHRV9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OCShPUFRJT05fTUFKT1JfT1NfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NSU5PUl9JTUFHRV9WRVJTSU9OCShPUFRJT05fTUFKT1JfU1VCU1lTVEVNX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fTUlOT1JfT1NfVkVSU0lPTgkJKE9QVElPTl9NSU5PUl9JTUFHRV9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX01JTk9SX1NVQlNZU1RFTV9WRVJTSU9OCShPUFRJT05fTUlOT1JfT1NfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9TRUNUSU9OX0FMSUdOTUVOVAkoT1BUSU9OX01JTk9SX1NVQlNZU1RFTV9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NUQUNLICAgICAgICAgICAgICAgICAgICAoT1BUSU9OX1NFQ1RJT05fQUxJR05NRU5UICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NVQlNZU1RFTSAgICAgICAgICAgICAgICAoT1BUSU9OX1NUQUNLICsgMSkKLSNkZWZpbmUgT1BUSU9OX0hFQVAJCQkoT1BUSU9OX1NVQlNZU1RFTSArIDEpCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPSB7Ci0gIC8qIFBFIG9wdGlvbnMgKi8KLSAgICB7ImJhc2UtZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQkFTRV9GSUxFfSwKLSAgICB7ImRsbCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRExMfSwKLSAgICB7ImZpbGUtYWxpZ25tZW50IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9GSUxFX0FMSUdOTUVOVH0sCi0gICAgeyJoZWFwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IRUFQfSwgCi0gICAgeyJpbWFnZS1iYXNlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTUFHRV9CQVNFfSwgCi0gICAgeyJtYWpvci1pbWFnZS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUpPUl9JTUFHRV9WRVJTSU9OfSwKLSAgICB7Im1ham9yLW9zLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BSk9SX09TX1ZFUlNJT059LAotICAgIHsibWFqb3Itc3Vic3lzdGVtLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OfSwKLSAgICB7Im1pbm9yLWltYWdlLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT059LAotICAgIHsibWlub3Itb3MtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlOT1JfT1NfVkVSU0lPTn0sCi0gICAgeyJtaW5vci1zdWJzeXN0ZW0tdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT059LAotICAgIHsic2VjdGlvbi1hbGlnbm1lbnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NFQ1RJT05fQUxJR05NRU5UfSwKLSAgICB7InN0YWNrIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVEFDS30sCi0gICAgeyJzdWJzeXN0ZW0iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NVQlNZU1RFTX0sCi0gICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci0gIH07Ci0KLQotLyogUEUvV0lOMzI7IGFkZGVkIHJvdXRpbmVzIHRvIGdldCB0aGUgc3Vic3lzdGVtIHR5cGUsIGhlYXAgYW5kL29yIHN0YWNrCi0gICBwYXJhbWV0ZXJzIHdoaWNoIG1heSBiZSBpbnB1dCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB2b2lkICpwdHI7Ci0gIGludCBzaXplOwotICBpbnQgdmFsdWU7Ci0gIGNoYXIgKnN5bWJvbDsKLSAgaW50IGluaXRlZDsKLX0gZGVmaW5mbzsKLQotI2RlZmluZSBEKGZpZWxkLHN5bWJvbCxkZWYpICB7JnBlLmZpZWxkLHNpemVvZihwZS5maWVsZCksIGRlZiwgc3ltYm9sLDB9Ci0KLXN0YXRpYyBkZWZpbmZvIGluaXRbXSA9Ci17Ci0gIC8qIGltYWdlYmFzZSBtdXN0IGJlIGZpcnN0ICovCi0jZGVmaW5lIElNQUdFQkFTRU9GRiAwCi0gIEQoSW1hZ2VCYXNlLCJfX2ltYWdlX2Jhc2VfXyIsIEJFT1NfRVhFX0lNQUdFX0JBU0UpLAotI2RlZmluZSBETExPRkYgMQotICB7JmRsbCwgc2l6ZW9mKGRsbCksIDAsICJfX2RsbF9fIn0sCi0gIEQoU2VjdGlvbkFsaWdubWVudCwiX19zZWN0aW9uX2FsaWdubWVudF9fIiwgUEVfREVGX1NFQ1RJT05fQUxJR05NRU5UKSwKLSAgRChGaWxlQWxpZ25tZW50LCJfX2ZpbGVfYWxpZ25tZW50X18iLCBQRV9ERUZfRklMRV9BTElHTk1FTlQpLAotICBEKE1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiwiX19tYWpvcl9vc192ZXJzaW9uX18iLCA0KSwKLSAgRChNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sIl9fbWlub3Jfb3NfdmVyc2lvbl9fIiwgMCksCi0gIEQoTWFqb3JJbWFnZVZlcnNpb24sIl9fbWFqb3JfaW1hZ2VfdmVyc2lvbl9fIiwgMSksCi0gIEQoTWlub3JJbWFnZVZlcnNpb24sIl9fbWlub3JfaW1hZ2VfdmVyc2lvbl9fIiwgMCksCi0gIEQoTWFqb3JTdWJzeXN0ZW1WZXJzaW9uLCJfX21ham9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLCA0KSwKLSAgRChNaW5vclN1YnN5c3RlbVZlcnNpb24sIl9fbWlub3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIsIDApLAotICBEKFN1YnN5c3RlbSwiX19zdWJzeXN0ZW1fXyIsIDMpLAotICBEKFNpemVPZlN0YWNrUmVzZXJ2ZSwiX19zaXplX29mX3N0YWNrX3Jlc2VydmVfXyIsIDB4MjAwMDAwMCksCi0gIEQoU2l6ZU9mU3RhY2tDb21taXQsIl9fc2l6ZV9vZl9zdGFja19jb21taXRfXyIsIDB4MTAwMCksCi0gIEQoU2l6ZU9mSGVhcFJlc2VydmUsIl9fc2l6ZV9vZl9oZWFwX3Jlc2VydmVfXyIsIDB4MTAwMDAwKSwKLSAgRChTaXplT2ZIZWFwQ29tbWl0LCJfX3NpemVfb2ZfaGVhcF9jb21taXRfXyIsIDB4MTAwMCksCi0gIEQoTG9hZGVyRmxhZ3MsIl9fbG9hZGVyX2ZsYWdzX18iLCAweDApLAotICB7IE5VTEwsIDAsIDAsIE5VTEwsIDAgfQotfTsKLQotCi1zdGF0aWMgdm9pZAotc2V0X3BlX25hbWUgKG5hbWUsIHZhbCkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGludCBpOwotICAvKiBGaW5kIHRoZSBuYW1lIGFuZCBzZXQgaXQuICovCi0gIGZvciAoaSA9IDA7IGluaXRbaV0ucHRyOyBpKyspCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgaW5pdFtpXS5zeW1ib2wpID09IDApCi0JewotCSAgaW5pdFtpXS52YWx1ZSA9IHZhbDsKLQkgIGluaXRbaV0uaW5pdGVkID0gMTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBhYm9ydCgpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zZXRfcGVfc3Vic3lzdGVtICgpCi17Ci0gIGNvbnN0IGNoYXIgKnN2ZXI7Ci0gIGludCBsZW47Ci0gIGludCBpOwotICBzdGF0aWMgY29uc3Qgc3RydWN0IAotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjb25zdCBpbnQgdmFsdWU7Ci0gICAgICBjb25zdCBjaGFyICplbnRyeTsKLSAgICB9Ci0gIHZbXSA9Ci0gICAgewotICAgICAgeyAibmF0aXZlIiwgMSwgIl9OdFByb2Nlc3NTdGFydHVwIiB9LAotICAgICAgeyAid2luZG93cyIsIDIsICJfV2luTWFpbkNSVFN0YXJ0dXAiIH0sCi0gICAgICB7ICJ3d2luZG93cyIsIDIsICJfd1dpbk1haW5DUlRTdGFydHVwIiB9LAotICAgICAgeyAiY29uc29sZSIsIDMsICJfbWFpbkNSVFN0YXJ0dXAiIH0sCi0gICAgICB7ICJ3Y29uc29sZSIsIDMsICJfd21haW5DUlRTdGFydHVwIiB9LAotI2lmIDAKLSAgICAgIC8qIFRoZSBNaWNyb3NvZnQgbGlua2VyIGRvZXMgbm90IHJlY29nbml6ZSB0aGlzLiAgKi8KLSAgICAgIHsgIm9zMiIsIDUsICIiIH0sCi0jZW5kaWYKLSAgICAgIHsgInBvc2l4IiwgNywgIl9fX1Bvc2l4UHJvY2Vzc1N0YXJ0dXAifSwKLSAgICAgIHsgMCwgMCwgMCB9Ci0gICAgfTsKLQotICBzdmVyID0gc3RyY2hyIChvcHRhcmcsICc6Jyk7Ci0gIGlmIChzdmVyID09IE5VTEwpCi0gICAgbGVuID0gc3RybGVuIChvcHRhcmcpOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqZW5kOwotCi0gICAgICBsZW4gPSBzdmVyIC0gb3B0YXJnOwotICAgICAgc2V0X3BlX25hbWUgKCJfX21ham9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLAotCQkgICBzdHJ0b3VsIChzdmVyICsgMSwgJmVuZCwgMCkpOwotICAgICAgaWYgKCplbmQgPT0gJy4nKQotCXNldF9wZV9uYW1lICgiX19taW5vcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwKLQkJICAgICBzdHJ0b3VsIChlbmQgKyAxLCAmZW5kLCAwKSk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvICgiJVA6IHdhcm5pbmc6IGJhZCB2ZXJzaW9uIG51bWJlciBpbiAtc3Vic3lzdGVtIG9wdGlvblxuIik7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IHZbaV0ubmFtZTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChvcHRhcmcsIHZbaV0ubmFtZSwgbGVuKSA9PSAwCi0JICAmJiB2W2ldLm5hbWVbbGVuXSA9PSAnXDAnKQotCXsKLQkgIHNldF9wZV9uYW1lICgiX19zdWJzeXN0ZW1fXyIsIHZbaV0udmFsdWUpOwotCi0JICAvKiBJZiB0aGUgc3Vic3lzdGVtIGlzIHdpbmRvd3MsIHdlIHVzZSBhIGRpZmZlcmVudCBlbnRyeQotCSAgICAgcG9pbnQuICBXZSBhbHNvIHJlZ2lzdGVyIHRoZSBlbnRyeSBwb2ludCBhcyBhbiB1bmRlZmluZWQKLQkgICAgIHN5bWJvbC4gZnJvbSBsYW5nX2FkZF9lbnRyeSgpIFRoZSByZWFzb24gd2UgZG8KLQkgICAgIHRoaXMgaXMgc28gdGhhdCB0aGUgdXNlcgotCSAgICAgZG9lc24ndCBoYXZlIHRvIGJlY2F1c2UgdGhleSB3b3VsZCBoYXZlIHRvIHVzZSB0aGUgLXUKLQkgICAgIHN3aXRjaCBpZiB0aGV5IHdlcmUgc3BlY2lmeWluZyBhbiBlbnRyeSBwb2ludCBvdGhlciB0aGFuCi0JICAgICBfbWFpbkNSVFN0YXJ0dXAuICBTcGVjaWZpY2FsbHksIGlmIGNyZWF0aW5nIGEgd2luZG93cwotCSAgICAgYXBwbGljYXRpb24sIGVudHJ5IHBvaW50IF9XaW5NYWluQ1JUU3RhcnR1cCBtdXN0IGJlCi0JICAgICBzcGVjaWZpZWQuICBXaGF0IEkgaGF2ZSBmb3VuZCBmb3Igbm9uIGNvbnNvbGUKLQkgICAgIGFwcGxpY2F0aW9ucyAoZW50cnkgbm90IF9tYWluQ1JUU3RhcnR1cCkgaXMgdGhhdCB0aGUgLm9iagotCSAgICAgdGhhdCBjb250YWlucyBtYWluQ1JUU3RhcnR1cCBpcyBicm91Z2h0IGluIHNpbmNlIGl0IGlzCi0JICAgICB0aGUgZmlyc3QgZW5jb3VudGVyZWQgaW4gbGliYy5saWIgYW5kIGl0IGhhcyBvdGhlcgotCSAgICAgc3ltYm9scyBpbiBpdCB3aGljaCB3aWxsIGJlIHB1bGxlZCBpbiBieSB0aGUgbGluawotCSAgICAgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIGFkZGluZyAtdSB3aXRoIHRoZSBlbnRyeSBwb2ludAotCSAgICAgbmFtZSBzcGVjaWZpZWQgZm9yY2VzIHRoZSBjb3JyZWN0IC5vYmogdG8gYmUgdXNlZC4gIFdlCi0JICAgICBjYW4gYXZvaWQgbWFraW5nIHRoZSB1c2VyIGRvIHRoaXMgYnkgYWx3YXlzIGFkZGluZyB0aGUKLQkgICAgIGVudHJ5IHBvaW50IG5hbWUgYXMgYW4gdW5kZWZpbmVkIHN5bWJvbC4gICovCi0JICBsYW5nX2FkZF9lbnRyeSAodltpXS5lbnRyeSwgMSk7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlaW5mbyAoIiVQJUY6IGludmFsaWQgc3Vic3lzdGVtIHR5cGUgJXNcbiIsIG9wdGFyZyk7Ci19Ci0KLQotCi1zdGF0aWMgdm9pZAotc2V0X3BlX3ZhbHVlIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotICAgICAKLXsKLSAgY2hhciAqZW5kOwotICBzZXRfcGVfbmFtZSAobmFtZSwgIHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCkpOwotICBpZiAoZW5kID09IG9wdGFyZykKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVQJUY6IGludmFsaWQgaGV4IG51bWJlciBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIsIG9wdGFyZyk7Ci0gICAgfQotCi0gIG9wdGFyZyA9IGVuZDsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9wZV9zdGFja19oZWFwIChyZXNuYW1lLCBjb21uYW1lKQotICAgICBjaGFyICpyZXNuYW1lOwotICAgICBjaGFyICpjb21uYW1lOwotewotICBzZXRfcGVfdmFsdWUgKHJlc25hbWUpOwotICBpZiAoKm9wdGFyZyA9PSAnLCcpCi0gICAgewotICAgICAgb3B0YXJnKys7Ci0gICAgICBzZXRfcGVfdmFsdWUgKGNvbW5hbWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKm9wdGFyZykKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVQJUY6IHN0cmFuZ2UgaGV4IGluZm8gZm9yIFBFIHBhcmFtZXRlciAnJXMnXG4iLCBvcHRhcmcpOwotICAgIH0KLX0KLQotCi0KLXN0YXRpYyBpbnQKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGxvbmdpbmQ7Ci0gIGludCBvcHRjOwotICBpbnQgcHJldm9wdGluZCA9IG9wdGluZDsKLSAgaW50IHByZXZvcHRlcnIgPSBvcHRlcnI7Ci0gIGludCB3YW50ZXJyb3I7Ci0gIHN0YXRpYyBpbnQgbGFzdG9wdGluZCA9IC0xOwotCi0gIGlmIChsYXN0b3B0aW5kICE9IG9wdGluZCkKLSAgICBvcHRlcnIgPSAwOwotICB3YW50ZXJyb3IgPSBvcHRlcnI7Ci0KLSAgbGFzdG9wdGluZCA9IG9wdGluZDsKLQotICBvcHRjID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgIi0iLCBsb25nb3B0cywgJmxvbmdpbmQpOwotICBvcHRlcnIgPSBwcmV2b3B0ZXJyOwotCi0gIHN3aXRjaCAob3B0YykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICh3YW50ZXJyb3IpCi0JeGV4aXQgKDEpOwotICAgICAgb3B0aW5kID0gIHByZXZvcHRpbmQ7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgT1BUSU9OX0JBU0VfRklMRToKLSAgICAgIGxpbmtfaW5mby5iYXNlX2ZpbGUgPSAoUFRSKSBmb3BlbiAob3B0YXJnLCBGT1BFTl9XQik7Ci0gICAgICBpZiAobGlua19pbmZvLmJhc2VfZmlsZSA9PSBOVUxMKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBDYW4ndCBvcGVuIGJhc2UgZmlsZSAlc1xuIiwKLQkJICAgcHJvZ3JhbV9uYW1lLCBvcHRhcmcpOwotCSAgeGV4aXQgKDEpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBQRSBvcHRpb25zICovCi0gICAgY2FzZSBPUFRJT05fSEVBUDogCi0gICAgICBzZXRfcGVfc3RhY2tfaGVhcCAoIl9fc2l6ZV9vZl9oZWFwX3Jlc2VydmVfXyIsICJfX3NpemVfb2ZfaGVhcF9jb21taXRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1RBQ0s6IAotICAgICAgc2V0X3BlX3N0YWNrX2hlYXAgKCJfX3NpemVfb2Zfc3RhY2tfcmVzZXJ2ZV9fIiwgIl9fc2l6ZV9vZl9zdGFja19jb21taXRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1VCU1lTVEVNOgotICAgICAgc2V0X3BlX3N1YnN5c3RlbSAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01BSk9SX09TX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX29zX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfT1NfVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWlub3Jfb3NfdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWFqb3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21pbm9yX3N1YnN5c3RlbV92ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX2ltYWdlX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWlub3JfaW1hZ2VfdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9GSUxFX0FMSUdOTUVOVDoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fZmlsZV9hbGlnbm1lbnRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU0VDVElPTl9BTElHTk1FTlQ6Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX3NlY3Rpb25fYWxpZ25tZW50X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0RMTDoKLSAgICAgIHNldF9wZV9uYW1lICgiX19kbGxfXyIsIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fSU1BR0VfQkFTRToKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9faW1hZ2VfYmFzZV9fIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotDAotLyogQXNzaWduIHZhbHVlcyB0byB0aGUgc3BlY2lhbCBzeW1ib2xzIGJlZm9yZSB0aGUgbGlua2VyIHNjcmlwdCBpcwotICAgcmVhZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMoKQotewotICAvKiBSdW4gdGhyb3VnaCBhbmQgaW52ZW50IHN5bWJvbHMgZm9yIGFsbCB0aGUKLSAgICAgbmFtZXMgYW5kIGluc2VydCB0aGUgZGVmYXVsdHMuICovCi0gIGludCBqOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKnNhdmU7Ci0KLSAgaWYgKCFpbml0W0lNQUdFQkFTRU9GRl0uaW5pdGVkKQotICAgIHsKLSAgICAgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotCWluaXRbSU1BR0VCQVNFT0ZGXS52YWx1ZSA9IDA7Ci0gICAgICBlbHNlIGlmIChpbml0W0RMTE9GRl0udmFsdWUpCi0JaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gQkVPU19ETExfSU1BR0VfQkFTRTsKLSAgICAgIGVsc2UKLQlpbml0W0lNQUdFQkFTRU9GRl0udmFsdWUgPSBCRU9TX0VYRV9JTUFHRV9CQVNFOwotICAgIH0KLQotICAvKiBEb24ndCBkbyBhbnkgc3ltYm9sIGFzc2lnbm1lbnRzIGlmIHRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gICovCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHJldHVybjsKLQotICAvKiBHbHVlIHRoZSBhc3NpZ25tZW50cyBpbnRvIHRoZSBhYnMgc2VjdGlvbiAqLwotICBzYXZlID0gc3RhdF9wdHI7Ci0KLSAgc3RhdF9wdHIgPSAmKGFic19vdXRwdXRfc2VjdGlvbi0+Y2hpbGRyZW4pOwotCi0gIGZvciAoaiA9IDA7IGluaXRbal0ucHRyOyBqKyspCi0gICAgewotICAgICAgbG9uZyB2YWwgPSBpbml0W2pdLnZhbHVlOwotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScgLGluaXRbal0uc3ltYm9sLCBleHBfaW50b3AgKHZhbCkpKTsKLSAgICAgIGlmIChpbml0W2pdLnNpemUgPT0gc2l6ZW9mKHNob3J0KSkKLQkqKHNob3J0ICopaW5pdFtqXS5wdHIgPSB2YWw7Ci0gICAgICBlbHNlIGlmIChpbml0W2pdLnNpemUgPT0gc2l6ZW9mKGludCkpCi0JKihpbnQgKilpbml0W2pdLnB0ciA9IHZhbDsKLSAgICAgIGVsc2UgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2YobG9uZykpCi0JKihsb25nICopaW5pdFtqXS5wdHIgPSB2YWw7Ci0gICAgICAvKiBUaGlzIG1pZ2h0IGJlIGEgbG9uZyBsb25nIG9yIG90aGVyIHNwZWNpYWwgdHlwZS4gICovCi0gICAgICBlbHNlIGlmIChpbml0W2pdLnNpemUgPT0gc2l6ZW9mKGJmZF92bWEpKQotCSooYmZkX3ZtYSAqKWluaXRbal0ucHRyID0gdmFsOwotICAgICAgZWxzZQlhYm9ydCgpOwotICAgIH0KLSAgLyogUmVzdG9yZSB0aGUgcG9pbnRlci4gKi8KLSAgc3RhdF9wdHIgPSBzYXZlOwotICAKLSAgaWYgKHBlLkZpbGVBbGlnbm1lbnQgPgotICAgICAgcGUuU2VjdGlvbkFsaWdubWVudCkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVQOiB3YXJuaW5nLCBmaWxlIGFsaWdubWVudCA+IHNlY3Rpb24gYWxpZ25tZW50LlxuIik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4oKQotewotICAvKiBQYXNzIHRoZSB3YWNreSBQRSBjb21tYW5kIGxpbmUgb3B0aW9ucyBpbnRvIHRoZSBvdXRwdXQgYmZkLgotICAgICBGSVhNRTogVGhpcyBzaG91bGQgYmUgZG9uZSB2aWEgYSBmdW5jdGlvbiwgcmF0aGVyIHRoYW4gYnkKLSAgICAgaW5jbHVkaW5nIGFuIGludGVybmFsIEJGRCBoZWFkZXIuICAqLwotICBpZiAoIWNvZmZfZGF0YShvdXRwdXRfYmZkKS0+cGUpCi0gICAgewotICAgICAgZWluZm8gKCIlRiVQOiBQRSBvcGVyYXRpb25zIG9uIG5vbiBQRSBmaWxlLlxuIik7Ci0gICAgfQotCi0gIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkciA9IHBlOwotICBwZV9kYXRhKG91dHB1dF9iZmQpLT5kbGwgPSBpbml0W0RMTE9GRl0udmFsdWU7Ci0KLX0KLQwKLS8qIENhbGxiYWNrIGZ1bmN0aW9ucyBmb3IgcXNvcnQgaW4gc29ydF9zZWN0aW9ucy4gKi8KLQotc3RhdGljIGludAotc29ydF9ieV9maWxlX25hbWUgKGEsIGIpCi0gICAgIHZvaWQgKmE7Ci0gICAgIHZvaWQgKmI7Ci17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipyYSA9IGE7Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipyYiA9IGI7Ci0gIGludCBpLCBhX3NlYywgYl9zZWM7Ci0KLSAgaSA9IHN0cmNtcCAoKCpyYSktPmlucHV0X3NlY3Rpb24uaWZpbGUtPnRoZV9iZmQtPm15X2FyY2hpdmUtPmZpbGVuYW1lLAotCSAgICAgICgqcmIpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkLT5teV9hcmNoaXZlLT5maWxlbmFtZSk7Ci0gIGlmIChpICE9IDApCi0gICAgcmV0dXJuIGk7Ci0KLSAgaSA9IHN0cmNtcCAoKCpyYSktPmlucHV0X3NlY3Rpb24uaWZpbGUtPmZpbGVuYW1lLAotCQkgKCpyYiktPmlucHV0X3NlY3Rpb24uaWZpbGUtPmZpbGVuYW1lKTsKLSAgaWYgKGkgIT0gMCkKLSAgICByZXR1cm4gaTsKLSAgLyogdGhlIHRhaWwgaWRhdGE0LzUgYXJlIHRoZSBvbmx5IG9uZXMgd2l0aG91dCByZWxvY3MgdG8gYW4KLSAgICAgaWRhdGEkNiBzZWN0aW9uIHVubGVzcyB3ZSBhcmUgaW1wb3J0aW5nIGJ5IG9yZGluYWwsIAotICAgICBzbyBzb3J0IHRoZW0gdG8gbGFzdCB0byB0ZXJtaW5hdGUgdGhlIElBVAotICAgICBhbmQgSE5UIHByb3Blcmx5LiBpZiBubyByZWxvYyB0aGlzIG9uZSBpcyBpbXBvcnQgYnkgb3JkaW5hbAotICAgICBzbyB3ZSBoYXZlIHRvIHNvcnQgYnkgc2VjdGlvbiBjb250ZW50cyAqLwotCi0gIGlmICggKCgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPnJlbG9jX2NvdW50ICsgKCpyYiktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+cmVsb2NfY291bnQpICkKLSAgICB7Ci0gICAgICAgaSA9ICAoKCgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPnJlbG9jX2NvdW50ID4gCi0JCSAoKnJiKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5yZWxvY19jb3VudCkgPyAtMSA6IDApOwotICAgICAgIGlmICggaSAhPSAwKQotICAgICAgICAgcmV0dXJuIGk7Ci0KLSAgICAgICAgcmV0dXJuICAoKCgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPnJlbG9jX2NvdW50ID4gCi0JCSAoKnJiKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5yZWxvY19jb3VudCkgPyAwIDogMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgIGlmICggKHN0cmNtcCggKCpyYSktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+bmFtZSwgIi5pZGF0YSQ2IikgPT0gMCkgKQotICAgICAgICAgIHJldHVybiAwOyAvKiBkb24ndCBzb3J0IC5pZGF0YSQ2IG9yIC5pZGF0YSQ3IEZJWE1FIGRsbHRvb2wgZWxpbWluYXRlIC5pZGF0YSQ3ICovCi0KLSAgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKCgqcmEpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkLCAKLSAgICAgICAgICgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24sICZhX3NlYywgKGZpbGVfcHRyKSAwLCAoYmZkX3NpemVfdHlwZSlzaXplb2YoYV9zZWMpKSkKLSAgICAgICAgICAgIGVpbmZvICgiJUYlQjogQ2FuJ3QgcmVhZCBjb250ZW50cyBvZiBzZWN0aW9uIC5pZGF0YTogJUVcbiIsCi0gICAgICAgICAgICAgICAgICgqcmEpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkKTsKLQotICAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoKCpyYiktPmlucHV0X3NlY3Rpb24uaWZpbGUtPnRoZV9iZmQsIAotICAgICAgICAoKnJiKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLCAmYl9zZWMsIChmaWxlX3B0cikgMCwgKGJmZF9zaXplX3R5cGUpc2l6ZW9mKGJfc2VjKSApKQotICAgICAgICAgICBlaW5mbyAoIiVGJUI6IENhbid0IHJlYWQgY29udGVudHMgb2Ygc2VjdGlvbiAuaWRhdGE6ICVFXG4iLAotICAgICAgICAgICAgICAgICgqcmIpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkKTsKLQotICAgICAgaSA9ICAoKGFfc2VjIDwgYl9zZWMpID8gLTEgOiAwKTsKLSAgICAgIGlmICggaSAhPSAwKQotICAgICAgICByZXR1cm4gaTsKLSAgICAgIHJldHVybiAgKChhX3NlYyA8IGJfc2VjKSA/IDAgOiAxKTsKLSAgIH0KLXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1zb3J0X2J5X3NlY3Rpb25fbmFtZSAoYSwgYikKLSAgICAgdm9pZCAqYTsKLSAgICAgdm9pZCAqYjsKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnJhID0gYTsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnJiID0gYjsKLSAgaW50IGk7Ci0gIGkgPSBzdHJjbXAgKCgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPm5hbWUsCi0JCSAoKnJiKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5uYW1lKTsKLS8qIHRoaXMgaXMgYSBoYWNrIHRvIG1ha2UgLnN0YWIgYW5kIC5zdGFic3RyIGxhc3QsIHNvIHdlIGRvbid0IGhhdmUKLSAgIHRvIGZpeCBzdHJpcC9vYmpjb3B5IGZvciAucmVsb2Mgc2VjdGlvbnMuCi0gICBGSVhNRSBzdHJpcHBpbmcgaW1hZ2VzIHdpdGggYSAucnNyYyBzZWN0aW9uIHN0aWxsIG5lZWRzIHRvIGJlIGZpeGVkICovCi0gIGlmICggaSAhPSAwKQotICAgIHsKLSAgICAgIGlmICgoc3RybmNtcCAoKCpyYSktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+bmFtZSwgIi5zdGFiIiwgNSkgPT0gMCkKLSAgICAgICAgICAgJiYgKHN0cm5jbXAgKCgqcmIpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPm5hbWUsICIuc3RhYiIsIDUpICE9IDApKQotICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICByZXR1cm4gaTsKLSAgICB9Ci0gIHJldHVybiBpOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIHNvcnRfc2VjdGlvbnMgdG8gYSBjb250aWd1b3VzIHN1YnNldCBvZiBhIGxpc3Qgb2Ygc2VjdGlvbnMuCi0gICBORVhUX0FGVEVSIGlzIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBsYXN0IG9uZSB0byBzb3J0LgotICAgVGhlIHJlc3VsdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGxhc3QgZWxlbWVudCdzICJuZXh0IiBwb2ludGVyLiAgKi8KLQotc3RhdGljIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKioKLXNvcnRfc2VjdGlvbnNfMSAoc3RhcnRwdHIsIG5leHRfYWZ0ZXIsIGNvdW50LCBzb3J0X2Z1bmMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipzdGFydHB0ciwqbmV4dF9hZnRlcjsKLSAgICAgaW50IGNvdW50OwotICAgICBpbnQgKCpzb3J0X2Z1bmMpICgpOwotewotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqdmVjOwotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpwOwotICBpbnQgaTsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnJldDsKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gc3RhcnRwdHI7Ci0KLSAgdmVjID0gKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqKQotCSB4bWFsbG9jIChjb3VudCAqIHNpemVvZiAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSkpOwotCi0gIGZvciAocCA9ICpzdGFydHB0ciwgaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBwID0gcC0+bmV4dCkKLSAgICB2ZWNbaV0gPSBwOwotCi0gIHFzb3J0ICh2ZWMsIGNvdW50LCBzaXplb2YgKHZlY1swXSksIHNvcnRfZnVuYyk7Ci0KLSAgLyogRmlsbCBpbiB0aGUgbmV4dCBwb2ludGVycyBhZ2Fpbi4gKi8KLSAgKnN0YXJ0cHRyID0gdmVjWzBdOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQgLSAxOyBpKyspCi0gICAgdmVjW2ldLT5oZWFkZXIubmV4dCA9IHZlY1tpICsgMV07Ci0gIHZlY1tpXS0+aGVhZGVyLm5leHQgPSBuZXh0X2FmdGVyOwotICByZXQgPSAmdmVjW2ldLT5oZWFkZXIubmV4dDsKLSAgZnJlZSAodmVjKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogU29ydCB0aGUgLmlkYXRhXCRmb28gaW5wdXQgc2VjdGlvbnMgb2YgYXJjaGl2ZXMgaW50byBmaWxlbmFtZSBvcmRlci4KLSAgIFRoZSByZWFzb24gaXMgc28gZGxsdG9vbCBjYW4gYXJyYW5nZSB0byBoYXZlIHRoZSBwZSBkbGwgaW1wb3J0IGluZm9ybWF0aW9uCi0gICBnZW5lcmF0ZWQgY29ycmVjdGx5IC0gdGhlIGhlYWQgb2YgdGhlIGxpc3QgZ29lcyBpbnRvIGRoLm8sIHRoZSB0YWlsIGludG8KLSAgIGR0Lm8sIGFuZCB0aGUgZ3V0cyBpbnRvIGRzW25ubm5dLm8uICBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgdGhlCi0gICAuaWRhdGEgc2VjdGlvbi4KLSAgIEZJWE1FOiBUaGlzIG1heSBubyBsb25nZXIgYmUgbmVjZXNzYXJ5IHdpdGggZ3JvdXBlZCBzZWN0aW9ucy4gIEluc3RlYWQgb2YKLSAgIHNvcnRpbmcgb24gZGgubywgZHNbbm5ubl0ubywgZHQubywgb25lIGNvdWxkLCBmb3IgZXhhbXBsZSwgaGF2ZSBkaC5vIHVzZQotICAgLmlkYXRhXCQ0aCwgaGF2ZSBkc1tubm5uXS5vIHVzZSAuaWRhdGFcJDRzW25ubm5dLCBhbmQgaGF2ZSBkdC5vIHVzZSAuaWRhdGFcJDR0LgotICAgVGhpcyB3b3VsZCBoYXZlIHRvIGJlIGVsYWJvcmF0ZWQgdXBvbiB0byBoYW5kbGUgbXVsdGlwbGUgZGxsJ3MKLSAgIFthc3N1bWluZyBzdWNoIGFuIGVsb2JvcmF0aW9uIGlzIHBvc3NpYmxlIG9mIGNvdXJzZV0uCi0KLSAgIFdlIGFsc28gc29ydCBzZWN0aW9ucyBpbiAnXCQnIHdpbGQgc3RhdGVtZW50cy4gIFRoZXNlIGFyZSBjcmVhdGVkIGJ5IHRoZQotICAgcGxhY2Vfb3JwaGFucyByb3V0aW5lIHRvIGltcGxlbWVudCBncm91cGVkIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLXNvcnRfc2VjdGlvbnMgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGZvciAoOyBzIDsgcyA9IHMtPm5leHQpCi0gICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLSAgICAgIHsKLSAgICAgIGNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQlzb3J0X3NlY3Rpb25zIChzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQl7Ci0JICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcCA9ICZzLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkOwotCi0JICAvKiBJcyB0aGlzIHRoZSAuaWRhdGEgc2VjdGlvbj8gICovCi0JICBpZiAocy0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lICE9IE5VTEwKLQkgICAgICAmJiBzdHJuY21wIChzLT53aWxkX3N0YXRlbWVudC5zZWN0aW9uX25hbWUsICIuaWRhdGEiLCA2KSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogU29ydCB0aGUgY2hpbGRyZW4uICBXZSB3YW50IHRvIHNvcnQgYW55IG9iamVjdHMgaW4KLSAgICAgICAgICAgICAgICAgdGhlIHNhbWUgYXJjaGl2ZS4gIEluIG9yZGVyIHRvIGhhbmRsZSB0aGUgY2FzZSBvZgotICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgYSBzaW5nbGUgYXJjaGl2ZSBtdWx0aXBsZSB0aW1lcywgd2Ugc29ydAotICAgICAgICAgICAgICAgICBhbGwgdGhlIGNoaWxkcmVuIGJ5IGFyY2hpdmUgbmFtZSBhbmQgdGhlbiBieSBvYmplY3QKLSAgICAgICAgICAgICAgICAgbmFtZS4gIEFmdGVyIHNvcnRpbmcgdGhlbSwgd2UgcmUtdGhyZWFkIHRoZSBwb2ludGVyCi0gICAgICAgICAgICAgICAgIGNoYWluLiAgKi8KLQotCSAgICAgIHdoaWxlICgqcCkKLQkJewotCQkgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnN0YXJ0ID0gKnA7Ci0JCSAgaWYgKHN0YXJ0LT5oZWFkZXIudHlwZSAhPSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bQotCQkgICAgICB8fCAhc3RhcnQtPmlucHV0X3NlY3Rpb24uaWZpbGUtPnRoZV9iZmQtPm15X2FyY2hpdmUpCi0JCSAgICBwID0gJihzdGFydC0+aGVhZGVyLm5leHQpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqZW5kOwotCQkgICAgICBpbnQgY291bnQ7Ci0KLQkJICAgICAgZm9yIChlbmQgPSBzdGFydCwgY291bnQgPSAwOwotCQkJICAgZW5kICYmIGVuZC0+aGVhZGVyLnR5cGUgPT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW07Ci0JCQkgICBlbmQgPSBlbmQtPm5leHQpCi0JCQljb3VudCsrOwotCi0JCSAgICAgIHAgPSBzb3J0X3NlY3Rpb25zXzEgKHAsIGVuZCwgY291bnQsIHNvcnRfYnlfZmlsZV9uYW1lKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIGdyb3VwZWQgc2VjdGlvbnMsIHNvcnQgdGhlbS4KLQkgICAgIFRoZSBsaW5rZXIgc2NyaXB0IG11c3QgZXhwbGljaXRseSBtZW50aW9uICIqKC5mb29cJCkiIG9yCi0JICAgICAiKiguZm9vXCQqKSIuICBEb24ndCBzb3J0IHRoZW0gaWYgXCQgaXMgbm90IHRoZSBsYXN0Ci0JICAgICBjaGFyYWN0ZXIgKG5vdCBzdXJlIGlmIHRoaXMgaXMgcmVhbGx5IHVzZWZ1bCwgYnV0IGl0Ci0JICAgICBhbGxvd3MgZXhwbGljaXRseSBtZW50aW9uaW5nIHNvbWUgXCQgc2VjdGlvbnMgYW5kIGxldHRpbmcKLQkgICAgIHRoZSBsaW5rZXIgaGFuZGxlIHRoZSByZXN0KS4gICovCi0JICBpZiAocy0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBjaGFyICpxID0gc3RyY2hyIChzLT53aWxkX3N0YXRlbWVudC5zZWN0aW9uX25hbWUsICdcJCcpOwotCi0JICAgICAgaWYgKHEgIT0gTlVMTAotCQkgICYmIChxWzFdID09ICdcMCcKLQkJICAgICAgfHwgKHFbMV0gPT0gJyonICYmIHFbMl0gPT0gJ1wwJykpKQotCQl7Ci0JCSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqZW5kOwotCQkgIGludCBjb3VudDsKLQotCQkgIGZvciAoZW5kID0gKnAsIGNvdW50ID0gMDsgZW5kOyBlbmQgPSBlbmQtPm5leHQpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChlbmQtPmhlYWRlci50eXBlICE9IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtKQotCQkJYWJvcnQgKCk7Ci0JCSAgICAgIGNvdW50Kys7Ci0JCSAgICB9Ci0JCSAgKHZvaWQpIHNvcnRfc2VjdGlvbnNfMSAocCwgZW5kLCBjb3VudCwgc29ydF9ieV9zZWN0aW9uX25hbWUpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotfQotCi1zdGF0aWMgdm9pZCAgCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24oKQotewotICBleHRlcm4gbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpzdGF0X3B0cjsKLQotI2lmZGVmIFRBUkdFVF9JU19wcGNwZQotICAvKiBIZXJlIHdlIHJ1bW1hZ2UgdGhyb3VnaCB0aGUgZm91bmQgYmZkcyB0byBjb2xsZWN0IHRvYyBpbmZvcm1hdGlvbiAqLwotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmICghcHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24oaXMtPnRoZV9iZmQsICZsaW5rX2luZm8pKQotCSAgewotCSAgICBlaW5mbygiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlc1xuIiwgaXMtPmZpbGVuYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIC8qIFdlIGhhdmUgc2VlbiBpdCBhbGwuIEFsbG9jYXRlIGl0LCBhbmQgY2Fycnkgb24gKi8KLSAgcHBjX2FsbG9jYXRlX3RvY19zZWN0aW9uICgmbGlua19pbmZvKTsKLSNlbHNlCi0jaWZkZWYgVEFSR0VUX0lTX2FybXBlCi0gIC8qIEZJWE1FOiB3ZSBzaG91bGQgYmUgYWJsZSB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGludGVyd29ya2luZyBzdHViCi0gICAgIHNlY3Rpb24uCi0KLSAgICAgSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCBnbHVlCi0gICAgIGluZm9ybWF0aW9uLiAgRklYTUU6IHNob3VsZCB0aGlzIGJlIGJhc2VkIG9uIGEgY29tbWFuZCBsaW5lCi0gICAgIG9wdGlvbj8gIGtya0BjeWdudXMuY29tICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCFhcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoaXMtPnRoZV9iZmQsICYgbGlua19pbmZvKSkKLQkgIHsKLQkgICAgZWluZm8gKCJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIiwgaXMtPmZpbGVuYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIC8qIFdlIGhhdmUgc2VlbiBpdCBhbGwuIEFsbG9jYXRlIGl0LCBhbmQgY2Fycnkgb24gKi8KLSAgYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyAoJiBsaW5rX2luZm8pOwotI2VuZGlmIC8qIFRBUkdFVF9JU19hcm1wZSAqLwotI2VuZGlmIC8qIFRBUkdFVF9JU19wcGNwZSAqLwotCi0gIHNvcnRfc2VjdGlvbnMgKHN0YXRfcHRyLT5oZWFkKTsKLX0KLQwKLS8qIFBsYWNlIGFuIG9ycGhhbiBzZWN0aW9uLiAgV2UgdXNlIHRoaXMgdG8gcHV0IHNlY3Rpb25zIHdpdGggYSAnXCQnIGluIHRoZW0KLSAgIGludG8gdGhlIHJpZ2h0IHBsYWNlLiAgQW55IHNlY3Rpb24gd2l0aCBhICdcJCcgaW4gdGhlbSAoZS5nLiAudGV4dFwkZm9vKQotICAgZ2V0cyBtYXBwZWQgdG8gdGhlIG91dHB1dCBzZWN0aW9uIHdpdGggZXZlcnl0aGluZyBmcm9tIHRoZSAnXCQnIG9uIHN0cmlwcGVkCi0gICAoZS5nLiAudGV4dCkuCi0gICBTZWUgdGhlIE1pY3Jvc29mdCBQb3J0YWJsZSBFeGVjdXRhYmxlIGFuZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0Ci0gICBTcGVjaWZpY2F0aW9uIDQuMSwgc2VjdGlvbiA0LjIsIEdyb3VwZWQgU2VjdGlvbnMuCi0KLSAgIEZJWE1FOiBUaGlzIGlzIG5vdyBoYW5kbGVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0IHVzaW5nIHdpbGRjYXJkcywKLSAgIGJ1dCBJJ20gbGVhdmluZyB0aGlzIGhlcmUgaW4gY2FzZSB3ZSB3YW50IHRvIGVuYWJsZSBpdCBmb3Igc2VjdGlvbnMKLSAgIHdoaWNoIGFyZSBub3QgbWVudGlvbmVkIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuIChmaWxlLCBzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgY29uc3QgY2hhciAqc2VjbmFtZTsKLSAgY2hhciAqb3V0cHV0X3NlY25hbWUsICpwczsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKmw7Ci0KLSAgaWYgKChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRG9uJ3QgcHJvY2VzcyBncm91cGVkIHNlY3Rpb25zIHVubGVzcyBkb2luZyBhIGZpbmFsIGxpbmsuCi0gICAgIElmIHRoZXkncmUgbWFya2VkIGFzIENPTURBVCBzZWN0aW9ucywgd2UgZG9uJ3Qgd2FudCAudGV4dFwkZm9vIHRvCi0gICAgIGVuZCB1cCBpbiAudGV4dCBhbmQgdGhlbiBoYXZlIC50ZXh0IGRpc2FwcGVhciBiZWNhdXNlIGl0J3MgbWFya2VkCi0gICAgIGxpbmstb25jZS1kaXNjYXJkLiAgKi8KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAocy0+b3duZXIsIHMpOwotCi0gIC8qIEV2ZXJ5dGhpbmcgZnJvbSB0aGUgJ1wkJyBvbiBnZXRzIGRlbGV0ZWQgc28gZG9uJ3QgYWxsb3cgJ1wkJyBhcyB0aGUKLSAgICAgZmlyc3QgY2hhcmFjdGVyLiAgKi8KLSAgaWYgKCpzZWNuYW1lID09ICdcJCcpCi0gICAgZWluZm8gKCIlUCVGOiBzZWN0aW9uICVzIGhhcyAnXCQnIGFzIGZpcnN0IGNoYXJhY3RlclxuIiwgc2VjbmFtZSk7Ci0gIGlmIChzdHJjaHIgKHNlY25hbWUgKyAxLCAnXCQnKSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBMb29rIHVwIHRoZSBvdXRwdXQgc2VjdGlvbi4gIFRoZSBNaWNyb3NvZnQgc3BlY3Mgc2F5IHNlY3Rpb25zIG5hbWVzIGluCi0gICAgIGltYWdlIGZpbGVzIG5ldmVyIGNvbnRhaW4gYSAnXCQnLiAgRm9ydHVuYXRlbHksIGxhbmdfLi4uX2xvb2t1cCBjcmVhdGVzCi0gICAgIHRoZSBzZWN0aW9uIGlmIGl0IGRvZXNuJ3QgZXhpc3QuICAqLwotICBvdXRwdXRfc2VjbmFtZSA9IGJ1eXN0cmluZyAoc2VjbmFtZSk7Ci0gIHBzID0gc3RyY2hyIChvdXRwdXRfc2VjbmFtZSArIDEsICdcJCcpOwotICAqcHMgPSAwOwotICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAob3V0cHV0X3NlY25hbWUpOwotCi0gIC8qIEZpbmQgdGhlICdcJCcgd2lsZCBzdGF0ZW1lbnQgZm9yIHRoaXMgc2VjdGlvbi4gIFdlIGN1cnJlbnRseSByZXF1aXJlIHRoZQotICAgICBsaW5rZXIgc2NyaXB0IHRvIGV4cGxpY2l0bHkgbWVudGlvbiAiKiguZm9vXCQpIi4KLSAgICAgRklYTUU6IHBwY3BlLnNjIGhhcyAuQ1JUXCRmb28gaW4gdGhlIC5yZGF0YSBzZWN0aW9uLiAgQWNjb3JkaW5nIHRvIHRoZQotICAgICBNaWNyb3NvZnQgZG9jcyB0aGlzIGlzbid0IGNvcnJlY3Qgc28gaXQncyBub3QgKGN1cnJlbnRseSkgaGFuZGxlZC4gICovCi0KLSAgcHNbMF0gPSAnXCQnOwotICBwc1sxXSA9IDA7Ci0gIGZvciAobCA9IG9zLT5jaGlsZHJlbi5oZWFkOyBsOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobC0+aGVhZGVyLnR5cGUgPT0gbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtCi0JICAmJiBzdHJjbXAgKGwtPndpbGRfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSwgb3V0cHV0X3NlY25hbWUpID09IDApCi0JYnJlYWs7Ci0gICAgfQotICBwc1swXSA9IDA7Ci0gIGlmIChsID09IE5VTEwpCi0jaWYgMQotICAgIGVpbmZvICgiJVAlRjogKiglc1wkKSBtaXNzaW5nIGZyb20gbGlua2VyIHNjcmlwdFxuIiwgb3V0cHV0X3NlY25hbWUpOwotI2Vsc2UgLyogRklYTUU6IFRoaXMgYmxvY2sgaXMgdW50cmllZC4gIEl0IGV4aXN0cyB0byBjb252ZXkgdGhlIGludGVudCwKLQkgc2hvdWxkIG9uZSBkZWNpZGUgdG8gbm90IHJlcXVpcmUgKiguZm9vXCQpIHRvIGFwcGVhciBpbiB0aGUgbGlua2VyCi0JIHNjcmlwdC4gICovCi0gICAgewotICAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpuZXcgPSBuZXdfc3RhdCAobGFuZ193aWxkX3N0YXRlbWVudCwKLQkJCQkJCSZvcy0+Y2hpbGRyZW4pOwotICAgICAgbmV3LT5zZWN0aW9uX25hbWUgPSB4bWFsbG9jIChzdHJsZW4gKG91dHB1dF9zZWNuYW1lKSArIDIpOwotICAgICAgc3ByaW50ZiAobmV3LT5zZWN0aW9uX25hbWUsICIlc1wkIiwgb3V0cHV0X3NlY25hbWUpOwotICAgICAgbmV3LT5maWxlbmFtZSA9IE5VTEw7Ci0gICAgICBsYW5nX2xpc3RfaW5pdCAoJm5ldy0+Y2hpbGRyZW4pOwotICAgICAgbCA9IG5ldzsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBMaW5rIHRoZSBpbnB1dCBzZWN0aW9uIGluIGFuZCB3ZSdyZSBkb25lIGZvciBub3cuCi0gICAgIFRoZSBzZWN0aW9ucyBzdGlsbCBoYXZlIHRvIGJlIHNvcnRlZCwgYnV0IHRoYXQgaGFzIHRvIHdhaXQgdW50aWwKLSAgICAgYWxsIHN1Y2ggc2VjdGlvbnMgaGF2ZSBiZWVuIHByb2Nlc3NlZCBieSB1cy4gIFRoZSBzb3J0aW5nIGlzIGRvbmUgYnkKLSAgICAgc29ydF9zZWN0aW9ucy4gICovCi0gIHdpbGRfZG9pdCAoJmwtPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLCBzLCBvcywgZmlsZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi1zdGF0aWMgY2hhciAqCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiAke3NyY2Rpcn0vZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgTlVMTCwgLyogZmluaXNoICovCi0gIE5VTEwsIC8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIE5VTEwsIC8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbiwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzLAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncwotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2VsZjMyLmVtIGIvbGQvZW11bHRlbXBsL2VsZjMyLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzU4Njc2Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9lbGYzMi5lbQorKysgL2Rldi9udWxsCkBAIC0xLDExNDMgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotIyBUaGlzIGZpbGUgaXMgbm93IG1pc25hbWVkLCBiZWNhdXNlIGl0IHN1cHBvcnRzIGJvdGggMzIgYml0IGFuZCA2NCBiaXQKLSMgRUxGIGVtdWxhdGlvbnMuCi10ZXN0IC16ICIke0VMRlNJWkV9IiAmJiBFTEZTSVpFPTMyCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qICR7RUxGU0laRX0gYml0IEVMRiBlbXVsYXRpb24gY29kZSBmb3IgJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0gICBFTEYgc3VwcG9ydCBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLQotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc2VhcmNoX2RpcnNfdHlwZSAqLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudAotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4KLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfYGVjaG8gJHtBUkNIfSB8IHNlZCAtZSAncy86LiovLydgOwotICBjb25maWcuZHluYW1pY19saW5rID0gJHtEWU5BTUlDX0xJTkstdHJ1ZX07Ci0gIGNvbmZpZy5oYXNfc2hhcmVkID0gYGlmIHRlc3QgLW4gIiRHRU5FUkFURV9TSExJQl9TQ1JJUFQiIDsgdGhlbiBlY2hvIHRydWUgOyBlbHNlIGVjaG8gZmFsc2UgOyBmaWA7Ci19Ci0KLS8qIFRyeSB0byBvcGVuIGEgZHluYW1pYyBhcmNoaXZlLiAgVGhpcyBpcyB3aGVyZSB3ZSBrbm93IHRoYXQgRUxGCi0gICBkeW5hbWljIGxpYnJhcmllcyBoYXZlIGFuIGV4dGVuc2lvbiBvZiAuc28uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUgKGFyY2gsIHNlYXJjaCwgZW50cnkpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2g7Ci0gICAgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBjaGFyICpzdHJpbmc7Ci0KLSAgaWYgKCEgZW50cnktPmlzX2FyY2hpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZpbGVuYW1lID0gZW50cnktPmZpbGVuYW1lOwotCi0gIHN0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKQotCQkJICAgICArIHN0cmxlbiAoZmlsZW5hbWUpCi0JCQkgICAgICsgc3RybGVuIChhcmNoKQotCQkJICAgICArIHNpemVvZiAiL2xpYi5zbyIpOwotCi0gIHNwcmludGYgKHN0cmluZywgIiVzL2xpYiVzJXMuc28iLCBzZWFyY2gtPm5hbWUsIGZpbGVuYW1lLCBhcmNoKTsKLQotICBpZiAoISBsZGZpbGVfdHJ5X29wZW5fYmZkIChzdHJpbmcsIGVudHJ5KSkKLSAgICB7Ci0gICAgICBmcmVlIChzdHJpbmcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlbnRyeS0+ZmlsZW5hbWUgPSBzdHJpbmc7Ci0KLSAgLyogV2UgaGF2ZSBmb3VuZCBhIGR5bmFtaWMgb2JqZWN0IHRvIGluY2x1ZGUgaW4gdGhlIGxpbmsuICBUaGUgRUxGCi0gICAgIGJhY2tlbmQgbGlua2VyIHdpbGwgY3JlYXRlIGEgRFRfTkVFREVEIGVudHJ5IGluIHRoZSAuZHluYW1pYwotICAgICBzZWN0aW9uIG5hbWluZyB0aGlzIGZpbGUuICBJZiB0aGlzIGZpbGUgaW5jbHVkZXMgYSBEVF9TT05BTUUKLSAgICAgZW50cnksIGl0IHdpbGwgYmUgdXNlZC4gIE90aGVyd2lzZSwgdGhlIEVMRiBsaW5rZXIgd2lsbCBqdXN0IHVzZQotICAgICB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gIEZvciBhbiBhcmNoaXZlIGZvdW5kIGJ5IHNlYXJjaGluZywgbGlrZQotICAgICB0aGlzIG9uZSwgdGhlIERUX05FRURFRCBlbnRyeSBzaG91bGQgY29uc2lzdCBvZiBqdXN0IHRoZSBuYW1lIG9mCi0gICAgIHRoZSBmaWxlLCB3aXRob3V0IHRoZSBwYXRoIGluZm9ybWF0aW9uIHVzZWQgdG8gZmluZCBpdC4gIE5vdGUKLSAgICAgdGhhdCB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBpZiB3ZSBoYXZlIGEgZHluYW1pYyBvYmplY3Q7IGFuCi0gICAgIGFyY2hpdmUgd2lsbCBuZXZlciBiZSByZWZlcmVuY2VkIGJ5IGEgRFRfTkVFREVEIGVudHJ5LgotCi0gICAgIEZJWE1FOiBUaGlzIGFwcHJvYWNoLS11c2luZyBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZS0taXMgbm90Ci0gICAgIHZlcnkgcHJldHR5LiAgSSBoYXZlbid0IGJlZW4gYWJsZSB0byB0aGluayBvZiBhbnl0aGluZyB0aGF0IGlzCi0gICAgIHByZXR0eSwgdGhvdWdoLiAgKi8KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGVudHJ5LT50aGVfYmZkLCBiZmRfb2JqZWN0KQotICAgICAgJiYgKGVudHJ5LT50aGVfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgewotICAgICAgY2hhciAqbmVlZGVkX25hbWU7Ci0KLSAgICAgIEFTU0VSVCAoZW50cnktPmlzX2FyY2hpdmUgJiYgZW50cnktPnNlYXJjaF9kaXJzX2ZsYWcpOwotICAgICAgbmVlZGVkX25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGZpbGVuYW1lKQotCQkJCSAgICAgICsgc3RybGVuIChhcmNoKQotCQkJCSAgICAgICsgc2l6ZW9mICJsaWIuc28iKTsKLSAgICAgIHNwcmludGYgKG5lZWRlZF9uYW1lLCAibGliJXMlcy5zbyIsIGZpbGVuYW1lLCBhcmNoKTsKLSAgICAgIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIChlbnRyeS0+dGhlX2JmZCwgbmVlZGVkX25hbWUpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotRU9GCi1pZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXSA7IHRoZW4KLSAgaWYgWyAieCR7REVGQVVMVF9FTVVMQVRJT059IiA9ICJ4JHtFTVVMQVRJT05fTkFNRX0iIF0gOyB0aGVuCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi0vKiBGb3IgYSBuYXRpdmUgbGlua2VyLCBjaGVjayB0aGUgZmlsZSAvZXRjL2xkLnNvLmNvbmYgZm9yIGRpcmVjdG9yaWVzCi0gICBpbiB3aGljaCB3ZSBtYXkgZmluZCBzaGFyZWQgbGlicmFyaWVzLiAgL2V0Yy9sZC5zby5jb25mIGlzIHJlYWxseQotICAgb25seSBtZWFuaW5nZnVsIG9uIExpbnV4LCBidXQgd2UgY2hlY2sgaXQgb24gb3RoZXIgc3lzdGVtcyBhbnlob3cuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19sZF9zb19jb25mCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19sZF9zb19jb25mIChuYW1lLCBmb3JjZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGZvcmNlOwotewotICBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZDsKLSAgc3RhdGljIGNoYXIgKmxkX3NvX2NvbmY7Ci0KLSAgaWYgKCEgaW5pdGlhbGl6ZWQpCi0gICAgewotICAgICAgRklMRSAqZjsKLQotICAgICAgZiA9IGZvcGVuICgiL2V0Yy9sZC5zby5jb25mIiwgRk9QRU5fUlQpOwotICAgICAgaWYgKGYgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICpiOwotCSAgc2l6ZV90IGxlbiwgYWxsb2M7Ci0JICBpbnQgYzsKLQotCSAgbGVuID0gMDsKLQkgIGFsbG9jID0gMTAwOwotCSAgYiA9IChjaGFyICopIHhtYWxsb2MgKGFsbG9jKTsKLQotCSAgd2hpbGUgKChjID0gZ2V0YyAoZikpICE9IEVPRikKLQkgICAgewotCSAgICAgIGlmIChsZW4gKyAxID49IGFsbG9jKQotCQl7Ci0JCSAgYWxsb2MgKj0gMjsKLQkJICBiID0gKGNoYXIgKikgeHJlYWxsb2MgKGIsIGFsbG9jKTsKLQkJfQotCSAgICAgIGlmIChjICE9ICc6JwotCQkgICYmIGMgIT0gJyAnCi0JCSAgJiYgYyAhPSAnXHQnCi0JCSAgJiYgYyAhPSAnXG4nCi0JCSAgJiYgYyAhPSAnLCcpCi0JCXsKLQkJICBiW2xlbl0gPSBjOwotCQkgICsrbGVuOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGxlbiA+IDAgJiYgYltsZW4gLSAxXSAhPSAnOicpCi0JCSAgICB7Ci0JCSAgICAgIGJbbGVuXSA9ICc6JzsKLQkJICAgICAgKytsZW47Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAobGVuID4gMCAmJiBiW2xlbiAtIDFdID09ICc6JykKLQkgICAgLS1sZW47Ci0KLQkgIGlmIChsZW4gPiAwKQotCSAgICBiW2xlbl0gPSAnXDAnOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnJlZSAoYik7Ci0JICAgICAgYiA9IE5VTEw7Ci0JICAgIH0KLQotCSAgZmNsb3NlIChmKTsKLQotCSAgbGRfc29fY29uZiA9IGI7Ci0JfQotCi0gICAgICBpbml0aWFsaXplZCA9IHRydWU7Ci0gICAgfQotCi0gIGlmIChsZF9zb19jb25mID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChsZF9zb19jb25mLCBuYW1lLCBmb3JjZSk7Ci19Ci0KLUVPRgotICBmaQotZmkKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLS8qIFRoZXNlIHZhcmlhYmxlcyBhcmUgcmVxdWlyZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBiYWNrIGFuZCBmb3J0aAotICAgYmV0d2VlbiBhZnRlcl9vcGVuIGFuZCBjaGVja19uZWVkZWQgYW5kIHN0YXRfbmVlZGVkIGFuZCB2ZXJjaGVjay4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmdsb2JhbF9uZWVkZWQ7Ci1zdGF0aWMgc3RydWN0IHN0YXQgZ2xvYmFsX3N0YXQ7Ci1zdGF0aWMgYm9vbGVhbiBnbG9iYWxfZm91bmQ7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpnbG9iYWxfdmVyY2hlY2tfbmVlZGVkOwotc3RhdGljIGJvb2xlYW4gZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZDsKLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQsICpsOwotCi0gIC8qIFdlIG9ubHkgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzIHdoZW4gZG9pbmcgYSBmaW5hbCBsaW5rLiAgKi8KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgfHwgbGlua19pbmZvLnNoYXJlZCkKLSAgICByZXR1cm47Ci0KLSAgLyogR2V0IHRoZSBsaXN0IG9mIGZpbGVzIHdoaWNoIGFwcGVhciBpbiBEVF9ORUVERUQgZW50cmllcyBpbgotICAgICBkeW5hbWljIG9iamVjdHMgaW5jbHVkZWQgaW4gdGhlIGxpbmsgKG9mdGVuIHRoZXJlIHdpbGwgYmUgbm9uZSkuCi0gICAgIEZvciBlYWNoIHN1Y2ggZmlsZSwgd2Ugd2FudCB0byB0cmFjayBkb3duIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgIGxpYnJhcnksIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2wgdGFibGUgaW4gdGhlIGxpbmsuICBUaGlzIGlzIHdoYXQKLSAgICAgdGhlIHJ1bnRpbWUgZHluYW1pYyBsaW5rZXIgd2lsbCBkby4gIFRyYWNraW5nIHRoZSBmaWxlcyBkb3duIGhlcmUKLSAgICAgcGVybWl0cyBvbmUgZHluYW1pYyBvYmplY3QgdG8gaW5jbHVkZSBhbm90aGVyIHdpdGhvdXQgcmVxdWlyaW5nCi0gICAgIHNwZWNpYWwgYWN0aW9uIGJ5IHRoZSBwZXJzb24gZG9pbmcgdGhlIGxpbmsuICBOb3RlIHRoYXQgdGhlCi0gICAgIG5lZWRlZCBsaXN0IGNhbiBhY3R1YWxseSBncm93IHdoaWxlIHdlIGFyZSBzdGVwcGluZyB0aHJvdWdoIHRoaXMKLSAgICAgbG9vcC4gICovCi0gIG5lZWRlZCA9IGJmZF9lbGZfZ2V0X25lZWRlZF9saXN0IChvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKLSAgZm9yIChsID0gbmVlZGVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbGw7Ci0gICAgICBpbnQgZm9yY2U7Ci0KLSAgICAgIC8qIElmIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGZpbGUsIHNraXAgaXQuICAqLwotICAgICAgZm9yIChsbCA9IG5lZWRlZDsgbGwgIT0gbDsgbGwgPSBsbC0+bmV4dCkKLQlpZiAoc3RyY21wIChsbC0+bmFtZSwgbC0+bmFtZSkgPT0gMCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGxsICE9IGwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIGZpbGUgd2FzIGluY2x1ZGVkIGluIHRoZSBsaW5rIGV4cGxpY2l0bHkuICAqLwotICAgICAgZ2xvYmFsX25lZWRlZCA9IGw7Ci0gICAgICBnbG9iYWxfZm91bmQgPSBmYWxzZTsKLSAgICAgIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkKTsKLSAgICAgIGlmIChnbG9iYWxfZm91bmQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gZmluZCB0aGlzIGZpbGUgYW5kIGluY2x1ZGUgdGhlIHN5bWJvbCB0YWJsZS4gIFdlCi0JIHdhbnQgdG8gc2VhcmNoIGZvciB0aGUgZmlsZSBpbiB0aGUgc2FtZSB3YXkgdGhhdCB0aGUgZHluYW1pYwotCSBsaW5rZXIgd2lsbCBzZWFyY2guICBUaGF0IG1lYW5zIHRoYXQgd2Ugd2FudCB0byB1c2UKLQkgcnBhdGhfbGluaywgcnBhdGgsIHRoZW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0JIExEX0xJQlJBUllfUEFUSCAobmF0aXZlIG9ubHkpLCB0aGVuIHRoZSBsaW5rZXIgc2NyaXB0Ci0JIExJQl9TRUFSQ0hfRElSUy4gIFdlIGRvIG5vdCBzZWFyY2ggdXNpbmcgdGhlIC1MIGFyZ3VtZW50cy4KLQotCSBXZSBzZWFyY2ggdHdpY2UuICBUaGUgZmlyc3QgdGltZSwgd2Ugc2tpcCBvYmplY3RzIHdoaWNoIG1heQotCSBpbnRyb2R1Y2UgdmVyc2lvbiBtaXNtYXRjaGVzLiAgVGhlIHNlY29uZCB0aW1lLCB3ZSBmb3JjZQotCSB0aGVpciB1c2UuICBTZWUgZ2xkJHtFTVVMQVRJT05fTkFNRX1fdmVyY2hlY2sgY29tbWVudC4gICovCi0gICAgICBmb3IgKGZvcmNlID0gMDsgZm9yY2UgPCAyOyBmb3JjZSsrKQotCXsKLQkgIGNvbnN0IGNoYXIgKmxpYl9wYXRoOwotCSAgc2l6ZV90IGxlbjsKLQkgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLQotCSAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGNvbW1hbmRfbGluZS5ycGF0aF9saW5rLAotCQkJCQkJICBsLT5uYW1lLCBmb3JjZSkpCi0JICAgIGJyZWFrOwotCSAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGNvbW1hbmRfbGluZS5ycGF0aCwKLQkJCQkJCSAgbC0+bmFtZSwgZm9yY2UpKQotCSAgICBicmVhazsKLQkgIGlmIChjb21tYW5kX2xpbmUucnBhdGhfbGluayA9PSBOVUxMCi0JICAgICAgJiYgY29tbWFuZF9saW5lLnJwYXRoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBsaWJfcGF0aCA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX1JVTl9QQVRIIik7Ci0JICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGxpYl9wYXRoLCBsLT5uYW1lLAotCQkJCQkJICAgICAgZm9yY2UpKQotCQlicmVhazsKLQkgICAgfQotRU9GCi1pZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXSA7IHRoZW4KLSAgaWYgWyAieCR7REVGQVVMVF9FTVVMQVRJT059IiA9ICJ4JHtFTVVMQVRJT05fTkFNRX0iIF0gOyB0aGVuCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCSAgbGliX3BhdGggPSAoY29uc3QgY2hhciAqKSBnZXRlbnYgKCJMRF9MSUJSQVJZX1BBVEgiKTsKLQkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChsaWJfcGF0aCwgbC0+bmFtZSwgZm9yY2UpKQotCSAgICBicmVhazsKLUVPRgotICBmaQotZmkKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JICBsZW4gPSBzdHJsZW4gKGwtPm5hbWUpOwotCSAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsgc2VhcmNoICE9IE5VTEw7IHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkKLQkgICAgewotCSAgICAgIGNoYXIgKmZpbGVuYW1lOwotCi0JICAgICAgaWYgKHNlYXJjaC0+Y21kbGluZSkKLQkJY29udGludWU7Ci0JICAgICAgZmlsZW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHNlYXJjaC0+bmFtZSkgKyBsZW4gKyAyKTsKLQkgICAgICBzcHJpbnRmIChmaWxlbmFtZSwgIiVzLyVzIiwgc2VhcmNoLT5uYW1lLCBsLT5uYW1lKTsKLQkgICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoZmlsZW5hbWUsIGZvcmNlKSkKLQkJYnJlYWs7Ci0JICAgICAgZnJlZSAoZmlsZW5hbWUpOwotCSAgICB9Ci0JICBpZiAoc2VhcmNoICE9IE5VTEwpCi0JICAgIGJyZWFrOwotRU9GCi1pZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXSA7IHRoZW4KLSAgaWYgWyAieCR7REVGQVVMVF9FTVVMQVRJT059IiA9ICJ4JHtFTVVMQVRJT05fTkFNRX0iIF0gOyB0aGVuCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCSAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX2xkX3NvX2NvbmYgKGwtPm5hbWUsIGZvcmNlKSkKLQkgICAgYnJlYWs7Ci1FT0YKLSAgZmkKLWZpCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCX0KLQotICAgICAgaWYgKGZvcmNlIDwgMikKLQljb250aW51ZTsKLQotICAgICAgZWluZm8gKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbm90IGZvdW5kICh0cnkgdXNpbmcgLS1ycGF0aClcbiIsCi0JICAgICBsLT5uYW1lLCBsLT5ieSk7Ci0gICAgfQotfQotCi0vKiBTZWFyY2ggZm9yIGEgbmVlZGVkIGZpbGUgaW4gYSBwYXRoLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKHBhdGgsIG5hbWUsIGZvcmNlKQotICAgICBjb25zdCBjaGFyICpwYXRoOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgZm9yY2U7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIHNpemVfdCBsZW47Ci0KLSAgaWYgKHBhdGggPT0gTlVMTCB8fCAqcGF0aCA9PSAnXDAnKQotICAgIHJldHVybiBmYWxzZTsKLSAgbGVuID0gc3RybGVuIChuYW1lKTsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY2hhciAqZmlsZW5hbWUsICpzc2V0OwotCi0gICAgICBzID0gc3RyY2hyIChwYXRoLCAnOicpOwotICAgICAgaWYgKHMgPT0gTlVMTCkKLQlzID0gcGF0aCArIHN0cmxlbiAocGF0aCk7Ci0KLSAgICAgIGZpbGVuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocyAtIHBhdGggKyBsZW4gKyAyKTsKLSAgICAgIGlmIChzID09IHBhdGgpCi0Jc3NldCA9IGZpbGVuYW1lOwotICAgICAgZWxzZQotCXsKLQkgIG1lbWNweSAoZmlsZW5hbWUsIHBhdGgsIHMgLSBwYXRoKTsKLQkgIGZpbGVuYW1lW3MgLSBwYXRoXSA9ICcvJzsKLQkgIHNzZXQgPSBmaWxlbmFtZSArIChzIC0gcGF0aCkgKyAxOwotCX0KLSAgICAgIHN0cmNweSAoc3NldCwgbmFtZSk7Ci0KLSAgICAgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIChmaWxlbmFtZSwgZm9yY2UpKQotCXJldHVybiB0cnVlOwotCi0gICAgICBmcmVlIChmaWxlbmFtZSk7Ci0KLSAgICAgIGlmICgqcyA9PSAnXDAnKQotCWJyZWFrOwotICAgICAgcGF0aCA9IHMgKyAxOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7CSAgCi19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIHBvc3NpYmxlIG5hbWUgZm9yIGEgZHluYW1pYyBvYmplY3QKLSAgIG5hbWVkIGJ5IGEgRFRfTkVFREVEIGVudHJ5LiAgVGhlIEZPUkNFIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlcgotICAgdG8gc2tpcCB0aGUgY2hlY2sgZm9yIGEgY29uZmxpY3RpbmcgdmVyc2lvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIChuYW1lLCBmb3JjZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGZvcmNlOwotewotICBiZmQgKmFiZmQ7Ci0KLSAgYWJmZCA9IGJmZF9vcGVuciAobmFtZSwgYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpKTsKLSAgaWYgKGFiZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQotICAgIHsKLSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgd2hldGhlciB0aGlzIG9iamVjdCB3b3VsZCBpbmNsdWRlIGFueSBjb25mbGljdGluZyBsaWJyYXJ5Ci0gICAgIHZlcnNpb25zLiAgSWYgRk9SQ0UgaXMgc2V0LCB0aGVuIHdlIHNraXAgdGhpcyBjaGVjazsgd2UgdXNlIHRoaXMKLSAgICAgdGhlIHNlY29uZCB0aW1lIGFyb3VuZCwgaWYgd2UgY291bGRuJ3QgZmluZCBhbnkgY29tcGF0aWJsZQotICAgICBpbnN0YW5jZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCi0gIGlmICghIGZvcmNlKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmVlZGVkOwotCi0gICAgICBpZiAoISBiZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QgKGFiZmQsICZuZWVkZWQpKQotCWVpbmZvICgiJUYlUDolQjogYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0IGZhaWxlZDogJUVcbiIsIGFiZmQpOwotCi0gICAgICBpZiAobmVlZGVkICE9IE5VTEwpCi0JewotCSAgZ2xvYmFsX3ZlcmNoZWNrX25lZWRlZCA9IG5lZWRlZDsKLQkgIGdsb2JhbF92ZXJjaGVja19mYWlsZWQgPSBmYWxzZTsKLQkgIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdmVyY2hlY2spOwotCSAgaWYgKGdsb2JhbF92ZXJjaGVja19mYWlsZWQpCi0JICAgIHsKLQkgICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLQkgICAgICAvKiBSZXR1cm4gZmFsc2UgdG8gZm9yY2UgdGhlIGNhbGxlciB0byBtb3ZlIG9uIHRvIHRyeQotICAgICAgICAgICAgICAgICBhbm90aGVyIGZpbGUgb24gdGhlIHNlYXJjaCBwYXRoLiAgKi8KLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogQnV0IHdhaXQhICBJdCBnZXRzIG11Y2ggd29yc2UuICBPbiBMaW51eCwgaWYgYSBzaGFyZWQKLSAgICAgICAgICAgICBsaWJyYXJ5IGRvZXMgbm90IHVzZSBsaWJjIGF0IGFsbCwgd2UgYXJlIHN1cHBvc2VkIHRvIHNraXAKLSAgICAgICAgICAgICBpdCB0aGUgZmlyc3QgdGltZSBhcm91bmQgaW4gY2FzZSB3ZSBlbmNvdW50ZXIgYSBzaGFyZWQKLSAgICAgICAgICAgICBsaWJyYXJ5IGxhdGVyIG9uIHdpdGggdGhlIHNhbWUgbmFtZSB3aGljaCBkb2VzIHVzZSB0aGUKLSAgICAgICAgICAgICB2ZXJzaW9uIG9mIGxpYmMgdGhhdCB3ZSB3YW50LiAgVGhpcyBpcyBtdWNoIHRvbyBob3JyaWJsZQotICAgICAgICAgICAgIHRvIHVzZSBvbiBhbnkgc3lzdGVtIG90aGVyIHRoYW4gTGludXguICAqLwotCi1FT0YKLWNhc2UgJHt0YXJnZXR9IGluCi0gICotKi1saW51eC1nbnUqKQotICAgIGNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JICB7Ci0JICAgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbDsKLQotCSAgICBmb3IgKGwgPSBuZWVkZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0JICAgICAgaWYgKHN0cm5jbXAgKGwtPm5hbWUsICJsaWJjLnNvIiwgNykgPT0gMCkKLQkJYnJlYWs7Ci0JICAgIGlmIChsID09IE5VTEwpCi0JICAgICAgewotCQkodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgIH0KLQotRU9GCi0gICAgOzsKLWVzYWMKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JfQotICAgIH0KLQotICAvKiBXZSd2ZSBmb3VuZCBhIGR5bmFtaWMgb2JqZWN0IG1hdGNoaW5nIHRoZSBEVF9ORUVERUQgZW50cnkuICAqLwotCi0gIC8qIFdlIGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoYXQgdGhlcmUgaXMgbm8gb3RoZXIgaW5wdXQgZmlsZSBvZiB0aGUKLSAgICAgc2FtZSBuYW1lLiAgV2UgbXVzdCBub3cgY2hlY2sgYWdhaW4gdGhhdCB3ZSBhcmUgbm90IGluY2x1ZGluZyB0aGUKLSAgICAgc2FtZSBmaWxlIHR3aWNlLiAgV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2Ugb24gbWFueSBzeXN0ZW1zCi0gICAgIGxpYmMuc28gaXMgYSBzeW1saW5rIHRvLCBlLmcuLCBsaWJjLnNvLjEuICBUaGUgU09OQU1FIGVudHJ5IHdpbGwKLSAgICAgcmVmZXJlbmNlIGxpYmMuc28uMS4gIElmIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBsaWJjLnNvLCB3ZQotICAgICBkb24ndCB3YW50IHRvIGluY2x1ZGUgbGliYy5zby4xIGlmIHRoZXkgYXJlIHRoZSBzYW1lIGZpbGUsIGFuZCB3ZQotICAgICBjYW4gb25seSBjaGVjayB0aGF0IHVzaW5nIHN0YXQuICAqLwotCi0gIGlmIChiZmRfc3RhdCAoYWJmZCwgJmdsb2JhbF9zdGF0KSAhPSAwKQotICAgIGVpbmZvICgiJUYlUDolQjogYmZkX3N0YXQgZmFpbGVkOiAlRVxuIiwgYWJmZCk7Ci0gIGdsb2JhbF9mb3VuZCA9IGZhbHNlOwotICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3N0YXRfbmVlZGVkKTsKLSAgaWYgKGdsb2JhbF9mb3VuZCkKLSAgICB7Ci0gICAgICAvKiBSZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHdlIGZvdW5kIHRoZSBmaWxlLCBldmVuIHRob3VnaAotICAgICAgICAgd2UgYXJlbid0IGdvaW5nIHRvIGRvIGFueXRoaW5nIHdpdGggaXQuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRlbGwgdGhlIEVMRiBiYWNrZW5kIHRoYXQgZG9uJ3Qgd2FudCB0aGUgb3V0cHV0IGZpbGUgdG8gaGF2ZSBhCi0gICAgIERUX05FRURFRCBlbnRyeSBmb3IgdGhpcyBmaWxlLiAgKi8KLSAgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUgKGFiZmQsICIiKTsKLQotICAvKiBBZGQgdGhpcyBmaWxlIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmICghIGJmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCAmbGlua19pbmZvKSkKLSAgICBlaW5mbyAoIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iLCBhYmZkKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIGlmIGFuIGlucHV0IGZpbGUgbWF0Y2hlcyBhIERUX05FRURFRCBlbnRyeSBieSBuYW1lLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCAocykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqczsKLXsKLSAgaWYgKGdsb2JhbF9mb3VuZCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHMtPmZpbGVuYW1lICE9IE5VTEwKLSAgICAgICYmIHN0cmNtcCAocy0+ZmlsZW5hbWUsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0gICAgewotICAgICAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHMtPnRoZV9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzb25hbWU7Ci0KLSAgICAgIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7Ci0gICAgICBpZiAoc29uYW1lICE9IE5VTEwKLQkgICYmIHN0cmNtcCAoc29uYW1lLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotCXsKLQkgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQkgIAotICBpZiAocy0+c2VhcmNoX2RpcnNfZmxhZwotICAgICAgJiYgcy0+ZmlsZW5hbWUgIT0gTlVMTAotICAgICAgJiYgc3RyY2hyIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAnLycpID09IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZjsKLQotICAgICAgZiA9IHN0cnJjaHIgKHMtPmZpbGVuYW1lLCAnLycpOwotICAgICAgaWYgKGYgIT0gTlVMTAotCSAgJiYgc3RyY21wIChmICsgMSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLQl7Ci0JICBnbG9iYWxfZm91bmQgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci19Ci0KLS8qIFNlZSBpZiBhbiBpbnB1dCBmaWxlIG1hdGNoZXMgYSBEVF9ORUVERUQgZW50cnkgYnkgcnVubmluZyBzdGF0IG9uCi0gICB0aGUgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZCAocykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqczsKLXsKLSAgc3RydWN0IHN0YXQgc3Q7Ci0gIGNvbnN0IGNoYXIgKnN1ZmZpeDsKLSAgY29uc3QgY2hhciAqc29uYW1lOwotICBjb25zdCBjaGFyICpmOwotCi0gIGlmIChnbG9iYWxfZm91bmQpCi0gICAgcmV0dXJuOwotICBpZiAocy0+dGhlX2JmZCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBpZiAoYmZkX3N0YXQgKHMtPnRoZV9iZmQsICZzdCkgIT0gMCkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVQOiVCOiBiZmRfc3RhdCBmYWlsZWQ6ICVFXG4iLCBzLT50aGVfYmZkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHN0LnN0X2RldiA9PSBnbG9iYWxfc3RhdC5zdF9kZXYKLSAgICAgICYmIHN0LnN0X2lubyA9PSBnbG9iYWxfc3RhdC5zdF9pbm8pCi0gICAgewotICAgICAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogV2UgaXNzdWUgYSB3YXJuaW5nIGlmIGl0IGxvb2tzIGxpa2Ugd2UgYXJlIGluY2x1ZGluZyB0d28KLSAgICAgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lIHNoYXJlZCBsaWJyYXJ5LiAgRm9yIGV4YW1wbGUsCi0gICAgIHRoZXJlIG1heSBiZSBhIHByb2JsZW0gaWYgLWxjIHBpY2tzIHVwIGxpYmMuc28uNiBidXQgc29tZSBvdGhlcgotICAgICBzaGFyZWQgbGlicmFyeSBoYXMgYSBEVF9ORUVERUQgZW50cnkgb2YgbGliYy5zby41LiAgVGhpcyBpcyBhCi0gICAgIGh1ZXJpc3RpYyB0ZXN0LCBhbmQgaXQgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIG5hbWUgbG9va3MgbGlrZQotICAgICBOQU1FLnNvLlZFUlNJT04uICBGSVhNRTogRGVwZW5kaW5nIG9uIGZpbGUgbmFtZXMgaXMgZXJyb3ItcHJvbmUuCi0gICAgIElmIHdlIHJlYWxseSB3YW50IHRvIGlzc3VlIHdhcm5pbmdzIGFib3V0IG1peGluZyB2ZXJzaW9uIG51bWJlcnMKLSAgICAgb2Ygc2hhcmVkIGxpYnJhcmllcywgd2UgbmVlZCB0byBmaW5kIGEgYmV0dGVyIHdheS4gICovCi0KLSAgaWYgKHN0cmNociAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgJy8nKSAhPSBOVUxMKQotICAgIHJldHVybjsKLSAgc3VmZml4ID0gc3Ryc3RyIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAiLnNvLiIpOwotICBpZiAoc3VmZml4ID09IE5VTEwpCi0gICAgcmV0dXJuOwotICBzdWZmaXggKz0gc2l6ZW9mICIuc28uIiAtIDE7Ci0KLSAgc29uYW1lID0gYmZkX2VsZl9nZXRfZHRfc29uYW1lIChzLT50aGVfYmZkKTsKLSAgaWYgKHNvbmFtZSA9PSBOVUxMKQotICAgIHNvbmFtZSA9IHMtPmZpbGVuYW1lOwotCi0gIGYgPSBzdHJyY2hyIChzb25hbWUsICcvJyk7Ci0gIGlmIChmICE9IE5VTEwpCi0gICAgKytmOwotICBlbHNlCi0gICAgZiA9IHNvbmFtZTsKLQotICBpZiAoc3RybmNtcCAoZiwgZ2xvYmFsX25lZWRlZC0+bmFtZSwgc3VmZml4IC0gZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLSAgICBlaW5mbyAoIiVQOiB3YXJuaW5nOiAlcywgbmVlZGVkIGJ5ICVCLCBtYXkgY29uZmxpY3Qgd2l0aCAlc1xuIiwKLQkgICBnbG9iYWxfbmVlZGVkLT5uYW1lLCBnbG9iYWxfbmVlZGVkLT5ieSwgZik7Ci19Ci0KLS8qIE9uIExpbnV4LCBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lCi0gICBzaGFyZWQgbGlicmFyeSBsaW5rZWQgYWdhaW5zdCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgbGliYy4gIFRoZQotICAgZHluYW1pYyBsaW5rZXIgc29tZWhvdyB0YWdzIHdoaWNoIGxpYmMgdmVyc2lvbiB0byB1c2UgaW4KLSAgIC9ldGMvbGQuc28uY2FjaGUsIGFuZCwgYmFzZWQgb24gdGhlIGxpYmMgdGhhdCBpdCBzZWVzIGluIHRoZQotICAgZXhlY3V0YWJsZSwgY2hvb3NlcyB3aGljaCB2ZXJzaW9uIG9mIHRoZSBzaGFyZWQgbGlicmFyeSB0byB1c2UuCi0KLSAgIFdlIHRyeSB0byBkbyBhIHNpbWlsYXIgY2hlY2sgaGVyZSBieSBjaGVja2luZyB3aGV0aGVyIHRoaXMgc2hhcmVkCi0gICBsaWJyYXJ5IG5lZWRzIGFueSBvdGhlciBzaGFyZWQgbGlicmFyaWVzIHdoaWNoIG1heSBjb25mbGljdCB3aXRoCi0gICBsaWJyYXJpZXMgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgSWYgaXQgZG9lcywgd2UKLSAgIHNraXAgaXQsIGFuZCB0cnkgdG8gZmluZCBhbm90aGVyIHNoYXJlZCBsaWJyYXJ5IGZhcnRoZXIgb24gZG93biB0aGUKLSAgIGxpbmsgcGF0aC4KLQotICAgVGhpcyBpcyBjYWxsZWQgdmlhIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZS4KLSAgIEdMT0JBTF9WRVJDSEVDS19ORUVERUQgaXMgdGhlIGxpc3Qgb2Ygb2JqZWN0cyBuZWVkZWQgYnkgdGhlIG9iamVjdAotICAgd2hpY2ggd2UgYXIgY2hlY2tpbmcuICBUaGlzIHNldHMgR0xPQkFMX1ZFUkNIRUNLX0ZBSUxFRCBpZiB3ZSBmaW5kCi0gICBhIGNvbmZsaWN0aW5nIHZlcnNpb24uICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fdmVyY2hlY2sgKHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIGNvbnN0IGNoYXIgKnNvbmFtZSwgKmY7Ci0gIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbDsKLQotICBpZiAoZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCkKLSAgICByZXR1cm47Ci0gIGlmIChzLT50aGVfYmZkID09IE5VTEwKLSAgICAgIHx8IChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKHMtPnRoZV9iZmQpICYgRFlOQU1JQykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgc29uYW1lID0gYmZkX2VsZl9nZXRfZHRfc29uYW1lIChzLT50aGVfYmZkKTsKLSAgaWYgKHNvbmFtZSA9PSBOVUxMKQotICAgIHNvbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKHMtPnRoZV9iZmQpOwotCi0gIGYgPSBzdHJyY2hyIChzb25hbWUsICcvJyk7Ci0gIGlmIChmICE9IE5VTEwpCi0gICAgKytmOwotICBlbHNlCi0gICAgZiA9IHNvbmFtZTsKLQotICBmb3IgKGwgPSBnbG9iYWxfdmVyY2hlY2tfbmVlZGVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnN1ZmZpeDsKLQotICAgICAgaWYgKHN0cmNtcCAoZiwgbC0+bmFtZSkgPT0gMCkKLQl7Ci0JICAvKiBQcm9iYWJseSBjYW4ndCBoYXBwZW4sIGJ1dCBpdCdzIGFuIGVhc3kgY2hlY2suICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyY2hyIChsLT5uYW1lLCAnLycpICE9IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIHN1ZmZpeCA9IHN0cnN0ciAobC0+bmFtZSwgIi5zby4iKTsKLSAgICAgIGlmIChzdWZmaXggPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgc3VmZml4ICs9IHNpemVvZiAiLnNvLiIgLSAxOwotCi0gICAgICBpZiAoc3RybmNtcCAoZiwgbC0+bmFtZSwgc3VmZml4IC0gbC0+bmFtZSkgPT0gMCkKLQl7Ci0JICAvKiBIZXJlIHdlIGtub3cgdGhhdCBTIGlzIGEgZHluYW1pYyBvYmplY3QgRk9PLlNPLlZFUjEsIGFuZAotICAgICAgICAgICAgIHRoZSBvYmplY3Qgd2UgYXJlIGNvbnNpZGVyaW5nIG5lZWRzIGEgZHluYW1pYyBvYmplY3QKLSAgICAgICAgICAgICBGT08uU08uVkVSMiwgYW5kIFZFUjEgYW5kIFZFUjIgYXJlIGRpZmZlcmVudC4gIFRoaXMKLSAgICAgICAgICAgICBhcHBlYXJzIHRvIGJlIGEgdmVyc2lvbiBtaXNtYXRjaCwgc28gd2UgdGVsbCB0aGUgY2FsbGVyCi0gICAgICAgICAgICAgdG8gdHJ5IGEgZGlmZmVyZW50IHZlcnNpb24gb2YgdGhpcyBsaWJyYXJ5LiAgKi8KLQkgIGdsb2JhbF92ZXJjaGVja19mYWlsZWQgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0Ci0gICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgY29uc3QgY2hhciAqcnBhdGg7Ci0gIGFzZWN0aW9uICpzaW50ZXJwOwotCi0gIC8qIElmIHdlIGFyZSBnb2luZyB0byBtYWtlIGFueSB2YXJpYWJsZSBhc3NpZ25tZW50cywgd2UgbmVlZCB0byBsZXQKLSAgICAgdGhlIEVMRiBiYWNrZW5kIGtub3cgYWJvdXQgdGhlbSBpbiBjYXNlIHRoZSB2YXJpYWJsZXMgYXJlCi0gICAgIHJlZmVycmVkIHRvIGJ5IGR5bmFtaWMgb2JqZWN0cy4gICovCi0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50KTsKLQotICAvKiBMZXQgdGhlIEVMRiBiYWNrZW5kIHdvcmsgb3V0IHRoZSBzaXplcyBvZiBhbnkgc2VjdGlvbnMgcmVxdWlyZWQKLSAgICAgYnkgZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgcnBhdGggPSBjb21tYW5kX2xpbmUucnBhdGg7Ci0gIGlmIChycGF0aCA9PSBOVUxMKQotICAgIHJwYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfUlVOX1BBVEgiKTsKLSAgaWYgKCEgKGJmZF9lbGYke0VMRlNJWkV9X3NpemVfZHluYW1pY19zZWN0aW9ucwotICAgICAgICAgKG91dHB1dF9iZmQsIGNvbW1hbmRfbGluZS5zb25hbWUsIHJwYXRoLAotCSAgY29tbWFuZF9saW5lLmV4cG9ydF9keW5hbWljLCBjb21tYW5kX2xpbmUuZmlsdGVyX3NobGliLAotCSAgKGNvbnN0IGNoYXIgKiBjb25zdCAqKSBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnMsCi0JICAmbGlua19pbmZvLCAmc2ludGVycCwgbGFuZ19lbGZfdmVyc2lvbl9pbmZvKSkpCi0gICAgZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gc2V0IGR5bmFtaWMgc2VjdGlvbiBzaXplczogJUVcbiIpOwotCi0gIC8qIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgZHluYW1pYyBsaW5rZXIgd2UgYXJlIHVzaW5nLiAgKi8KLSAgaWYgKGNvbW1hbmRfbGluZS5pbnRlcnByZXRlciAhPSBOVUxMCi0gICAgICAmJiBzaW50ZXJwICE9IE5VTEwpCi0gICAgewotICAgICAgc2ludGVycC0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgY29tbWFuZF9saW5lLmludGVycHJldGVyOwotICAgICAgc2ludGVycC0+X3Jhd19zaXplID0gc3RybGVuIChjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIpICsgMTsKLSAgICB9Ci0KLSAgLyogTG9vayBmb3IgYW55IHNlY3Rpb25zIG5hbWVkIC5nbnUud2FybmluZy4gIEFzIGEgR05VIGV4dGVuc2lvbnMsCi0gICAgIHdlIHRyZWF0IHN1Y2ggc2VjdGlvbnMgYXMgY29udGFpbmluZyB3YXJuaW5nIG1lc3NhZ2VzLiAgV2UgcHJpbnQKLSAgICAgb3V0IHRoZSB3YXJuaW5nIG1lc3NhZ2UsIGFuZCB0aGVuIHplcm8gb3V0IHRoZSBzZWN0aW9uIHNpemUgc28KLSAgICAgdGhhdCBpdCBkb2VzIG5vdCBnZXQgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWFzZWN0aW9uICpzOwotCWJmZF9zaXplX3R5cGUgc3o7Ci0JY2hhciAqbXNnOwotCWJvb2xlYW4gcmV0OwotCi0JaWYgKGlzLT5qdXN0X3N5bXNfZmxhZykKLQkgIGNvbnRpbnVlOwotCi0JcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpcy0+dGhlX2JmZCwgIi5nbnUud2FybmluZyIpOwotCWlmIChzID09IE5VTEwpCi0JICBjb250aW51ZTsKLQotCXN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoaXMtPnRoZV9iZmQsIHMpOwotCW1zZyA9IHhtYWxsb2MgKChzaXplX3QpIHN6ICsgMSk7Ci0JaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpcy0+dGhlX2JmZCwgcywgbXNnLCAoZmlsZV9wdHIpIDAsIHN6KSkKLQkgIGVpbmZvICgiJUYlQjogQ2FuJ3QgcmVhZCBjb250ZW50cyBvZiBzZWN0aW9uIC5nbnUud2FybmluZzogJUVcbiIsCi0JCSBpcy0+dGhlX2JmZCk7Ci0JbXNnW3N6XSA9ICdcMCc7Ci0JcmV0ID0gbGlua19pbmZvLmNhbGxiYWNrcy0+d2FybmluZyAoJmxpbmtfaW5mbywgbXNnLAotCQkJCQkgICAgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJICAgIGlzLT50aGVfYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwKLQkJCQkJICAgIChiZmRfdm1hKSAwKTsKLQlBU1NFUlQgKHJldCk7Ci0JZnJlZSAobXNnKTsKLQotCS8qIENsb2JiZXIgdGhlIHNlY3Rpb24gc2l6ZSwgc28gdGhhdCB3ZSBkb24ndCB3YXN0ZSBjb3B5aW5nIHRoZQotCSAgIHdhcm5pbmcgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgICB9Ci0gIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUgdmlhCi0gICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEl0IGxvY2F0ZXMgYW55IGFzc2lnbm1lbnQgc3RhdGVtZW50cywgYW5kCi0gICB0ZWxscyB0aGUgRUxGIGJhY2tlbmQgYWJvdXQgdGhlbSwgaW4gY2FzZSB0aGV5IGFyZSBhc3NpZ25tZW50cyB0bwotICAgc3ltYm9scyB3aGljaCBhcmUgcmVmZXJyZWQgdG8gYnkgZHluYW1pYyBvYmplY3RzLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW0pCi0gICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAocy0+YXNzaWdubWVudF9zdGF0ZW1lbnQuZXhwKTsKLX0KLQotLyogTG9vayB0aHJvdWdoIGFuIGV4cHJlc3Npb24gZm9yIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cCkKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzd2l0Y2ggKGV4cC0+dHlwZS5ub2RlX2NsYXNzKQotICAgIHsKLSAgICBjYXNlIGV0cmVlX3Byb3ZpZGU6Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBleHAtPmFzc2lnbi5kc3QsCi0JCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCA9PSBOVUxMKQotCWJyZWFrOwotCi0gICAgICAvKiBXZSBjYWxsIHJlY29yZF9saW5rX2Fzc2lnbm1lbnQgZXZlbiBpZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQuCi0JIFRoaXMgaXMgYmVjYXVzZSBpZiBpdCBpcyBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIHdlCi0JIGFjdHVhbGx5IHdhbnQgdG8gdXNlIHRoZSB2YWx1ZSBkZWZpbmVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LAotCSBub3QgdGhlIHZhbHVlIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IChiZWNhdXNlIHdlIGFyZSBzZXR0aW5nCi0JIHN5bWJvbHMgbGlrZSBldGV4dCkuICBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQgYnkgYSByZWd1bGFyCi0JIG9iamVjdCwgdGhlbiwgYXMgaXQgaGFwcGVucywgY2FsbGluZyByZWNvcmRfbGlua19hc3NpZ25tZW50Ci0JIHdpbGwgZG8gbm8gaGFybS4gICovCi0KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBldHJlZV9hc3NpZ246Ci0gICAgICBpZiAoc3RyY21wIChleHAtPmFzc2lnbi5kc3QsICIuIikgIT0gMCkKLQl7Ci0JICBpZiAoISAoYmZkX2VsZiR7RUxGU0laRX1fcmVjb3JkX2xpbmtfYXNzaWdubWVudAotCQkgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGV4cC0+YXNzaWduLmRzdCwKLQkJICBleHAtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9wcm92aWRlID8gdHJ1ZSA6IGZhbHNlKSkpCi0JICAgIGVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHJlY29yZCBhc3NpZ25tZW50IHRvICVzOiAlRVxuIiwKLQkJICAgZXhwLT5hc3NpZ24uZHN0KTsKLQl9Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmFzc2lnbi5zcmMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX2JpbmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5Lmxocyk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3RyaW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkuY29uZCk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkubGhzKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3VuYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT51bmFyeS5jaGlsZCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIFBsYWNlIGFuIG9ycGhhbiBzZWN0aW9uLiAgV2UgdXNlIHRoaXMgdG8gcHV0IHJhbmRvbSBTSEZfQUxMT0MKLSAgIHNlY3Rpb25zIGluIHRoZSByaWdodCBzZWdtZW50LiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICpob2xkX3NlY3Rpb247Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF91c2U7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF90ZXh0Owotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfcm9kYXRhOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfZGF0YTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2JzczsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3JlbDsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2ludGVycDsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuIChmaWxlLCBzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqcGxhY2U7Ci0gIGFzZWN0aW9uICpzbmV3LCAqKnBwczsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpvbGQ7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBhZGQ7Ci0gIGV0cmVlX3R5cGUgKmFkZHJlc3M7Ci0gIGNvbnN0IGNoYXIgKnNlY25hbWUsICpwczsKLSAgY29uc3QgY2hhciAqb3V0c2VjbmFtZTsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLSAgaWYgKChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzY3JpcHQgdG8gc2VlIHdoZXJlIHRvIHBsYWNlIHRoaXMgc2VjdGlvbi4gICovCi0gIGhvbGRfc2VjdGlvbiA9IHM7Ci0gIGhvbGRfdXNlID0gTlVMTDsKLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOwotCi0gIGlmIChob2xkX3VzZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSBwbGFjZWQgYSBzZWN0aW9uIHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgICAgIHdpbGRfZG9pdCAoJmhvbGRfdXNlLT5jaGlsZHJlbiwgcywgaG9sZF91c2UsIGZpbGUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAocy0+b3duZXIsIHMpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmaW5hbCBsaW5rLCB0aGVuIGFsd2F5cyBwdXQgLmdudS53YXJuaW5nLlNZTUJPTAotICAgICBzZWN0aW9ucyBpbnRvIHRoZSAudGV4dCBzZWN0aW9uIHRvIGdldCB0aGVtIG91dCBvZiB0aGUgd2F5LiAgKi8KLSAgaWYgKCEgbGlua19pbmZvLnNoYXJlZAotICAgICAgJiYgISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlCi0gICAgICAmJiBzdHJuY21wIChzZWNuYW1lLCAiLmdudS53YXJuaW5nLiIsIHNpemVvZiAiLmdudS53YXJuaW5nLiIgLSAxKSA9PSAwCi0gICAgICAmJiBob2xkX3RleHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB3aWxkX2RvaXQgKCZob2xkX3RleHQtPmNoaWxkcmVuLCBzLCBob2xkX3RleHQsIGZpbGUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIERlY2lkZSB3aGljaCBzZWdtZW50IHRoZSBzZWN0aW9uIHNob3VsZCBnbyBpbiBiYXNlZCBvbiB0aGUKLSAgICAgc2VjdGlvbiBuYW1lIGFuZCBzZWN0aW9uIGZsYWdzLiAgV2UgcHV0IGxvYWRhYmxlIC5ub3RlIHNlY3Rpb25zCi0gICAgIHJpZ2h0IGFmdGVyIHRoZSAuaW50ZXJwIHNlY3Rpb24sIHNvIHRoYXQgdGhlIFBUX05PVEUgc2VnbWVudCBpcwotICAgICBzdG9yZWQgcmlnaHQgYWZ0ZXIgdGhlIHByb2dyYW0gaGVhZGVycyB3aGVyZSB0aGUgT1MgY2FuIHJlYWQgaXQKLSAgICAgaW4gdGhlIGZpcnN0IHBhZ2UuICAqLwotICBwbGFjZSA9IE5VTEw7Ci0gIGlmIChzLT5mbGFncyAmIFNFQ19FWENMVURFKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAKLSAgICAgICYmIHN0cm5jbXAgKHNlY25hbWUsICIubm90ZSIsIDQpID09IDAKLSAgICAgICYmIGhvbGRfaW50ZXJwICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX2ludGVycDsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCSAgICYmIGhvbGRfYnNzICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX2JzczsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwCi0JICAgJiYgaG9sZF9kYXRhICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX2RhdGE7Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKHNlY25hbWUsICIucmVsIiwgNCkgPT0gMAotCSAgICYmIGhvbGRfcmVsICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX3JlbDsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX0NPREUpID09IDAKLQkgICAmJiAocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkgICAmJiBob2xkX3JvZGF0YSAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9yb2RhdGE7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCSAgICYmIGhvbGRfdGV4dCAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF90ZXh0OwotICBpZiAocGxhY2UgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQ2hvb3NlIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBzZWN0aW9uLiAgVGhpcyB3aWxsIGJlIG5lZWRlZCBpZiB0aGUKLSAgICAgc2FtZSBzZWN0aW9uIG5hbWUgYXBwZWFycyBpbiB0aGUgaW5wdXQgZmlsZSB3aXRoIGRpZmZlcmVudAotICAgICBsb2FkYWJsZSBvciBhbGxvY2F0ZWFibGUgY2hhcmFjdGVyaXN0aWNzLiAgKi8KLSAgb3V0c2VjbmFtZSA9IHNlY25hbWU7Ci0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0c2VjbmFtZSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotICAgICAgY2hhciAqbmV3bmFtZTsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBsZW4gPSBzdHJsZW4gKG91dHNlY25hbWUpOwotICAgICAgbmV3bmFtZSA9IHhtYWxsb2MgKGxlbiArIDUpOwotICAgICAgc3RyY3B5IChuZXduYW1lLCBvdXRzZWNuYW1lKTsKLSAgICAgIGkgPSAwOwotICAgICAgZG8KLQl7Ci0JICBzcHJpbnRmIChuZXduYW1lICsgbGVuLCAiJWQiLCBpKTsKLQkgICsraTsKLQl9Ci0gICAgICB3aGlsZSAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5ld25hbWUpICE9IE5VTEwpOwotCi0gICAgICBvdXRzZWNuYW1lID0gbmV3bmFtZTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIHRoZSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZSwgYW5kIHB1dCBpdCBpbiB0aGUgcmlnaHQKLSAgICAgcGxhY2UuICBUaGlzIHNodWZmbGluZyBpcyB0byBtYWtlIHRoZSBvdXRwdXQgZmlsZSBsb29rIG5lYXRlci4gICovCi0gIHNuZXcgPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBvdXRzZWNuYW1lKTsKLSAgaWYgKHNuZXcgPT0gTlVMTCkKLSAgICAgIGVpbmZvICgiJVAlRjogb3V0cHV0IGZvcm1hdCAlcyBjYW5ub3QgcmVwcmVzZW50IHNlY3Rpb24gY2FsbGVkICVzXG4iLAotCSAgICAgb3V0cHV0X2JmZC0+eHZlYy0+bmFtZSwgb3V0c2VjbmFtZSk7Ci0gIGlmIChwbGFjZS0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKHBwcyA9ICZvdXRwdXRfYmZkLT5zZWN0aW9uczsgKnBwcyAhPSBzbmV3OyBwcHMgPSAmKCpwcHMpLT5uZXh0KQotCTsKLSAgICAgICpwcHMgPSBzbmV3LT5uZXh0OwotICAgICAgc25ldy0+bmV4dCA9IHBsYWNlLT5iZmRfc2VjdGlvbi0+bmV4dDsKLSAgICAgIHBsYWNlLT5iZmRfc2VjdGlvbi0+bmV4dCA9IHNuZXc7Ci0gICAgfQotCi0gIC8qIFN0YXJ0IGJ1aWxkaW5nIGEgbGlzdCBvZiBzdGF0ZW1lbnRzIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICBvbGQgPSBzdGF0X3B0cjsKLSAgc3RhdF9wdHIgPSAmYWRkOwotICBsYW5nX2xpc3RfaW5pdCAoc3RhdF9wdHIpOwotCi0gIC8qIElmIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uIGlzIHJlcHJlc2VudGFibGUgaW4gQywgdGhlbiBjcmVhdGUKLSAgICAgc3ltYm9scyB0byBtYXJrIHRoZSBzdGFydCBhbmQgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbi4gICovCi0gIGZvciAocHMgPSBvdXRzZWNuYW1lOyAqcHMgIT0gJ1wwJzsgcHMrKykKLSAgICBpZiAoISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnBzKSAmJiAqcHMgIT0gJ18nKQotICAgICAgYnJlYWs7Ci0gIGlmICgqcHMgPT0gJ1wwJyAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bW5hbWU7Ci0KLSAgICAgIHN5bW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChwcyAtIG91dHNlY25hbWUgKyBzaXplb2YgIl9fc3RhcnRfIik7Ci0gICAgICBzcHJpbnRmIChzeW1uYW1lLCAiX19zdGFydF8lcyIsIG91dHNlY25hbWUpOwotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIHN5bW5hbWUsCi0JCQkJICAgICAgZXhwX3Vub3AgKEFMSUdOX0ssCi0JCQkJCQlleHBfaW50b3AgKChiZmRfdm1hKSAxCi0JCQkJCQkJICAgPDwgcy0+YWxpZ25tZW50X3Bvd2VyKSkpKTsKLSAgICB9Ci0KLSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICBhZGRyZXNzID0gTlVMTDsKLSAgZWxzZQotICAgIGFkZHJlc3MgPSBleHBfaW50b3AgKChiZmRfdm1hKSAwKTsKLQotICBsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAob3V0c2VjbmFtZSwgYWRkcmVzcywgMCwKLQkJCQkgICAgICAgKGJmZF92bWEpIDAsCi0JCQkJICAgICAgIChldHJlZV90eXBlICopIE5VTEwsCi0JCQkJICAgICAgIChldHJlZV90eXBlICopIE5VTEwsCi0JCQkJICAgICAgIChldHJlZV90eXBlICopIE5VTEwpOwotCi0gIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwIChvdXRzZWNuYW1lKTsKLSAgd2lsZF9kb2l0ICgmb3MtPmNoaWxkcmVuLCBzLCBvcywgZmlsZSk7Ci0KLSAgbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQKLSAgICAoKGJmZF92bWEpIDAsICIqZGVmYXVsdCoiLCAoc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICopIE5VTEwpOwotICBzdGF0X3B0ciA9ICZhZGQ7Ci0KLSAgaWYgKCpwcyA9PSAnXDAnICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCi0gICAgewotICAgICAgY2hhciAqc3ltbmFtZTsKLQotICAgICAgc3ltbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHBzIC0gb3V0c2VjbmFtZSArIHNpemVvZiAiX19zdG9wXyIpOwotICAgICAgc3ByaW50ZiAoc3ltbmFtZSwgIl9fc3RvcF8lcyIsIG91dHNlY25hbWUpOwotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIHN5bW5hbWUsCi0JCQkJICAgICAgZXhwX25hbWVvcCAoTkFNRSwgIi4iKSkpOwotICAgIH0KLQotICAvKiBOb3cgc3RpY2sgdGhlIG5ldyBzdGF0ZW1lbnQgbGlzdCByaWdodCBhZnRlciBQTEFDRS4gICovCi0gICphZGQudGFpbCA9IHBsYWNlLT5oZWFkZXIubmV4dDsKLSAgcGxhY2UtPmhlYWRlci5uZXh0ID0gYWRkLmhlYWQ7Ci0KLSAgc3RhdF9wdHIgPSBvbGQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uIChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBpZiAocy0+aGVhZGVyLnR5cGUgIT0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bSkKLSAgICByZXR1cm47Ci0KLSAgb3MgPSAmcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCBob2xkX3NlY3Rpb24tPm5hbWUpID09IDAKLSAgICAgICYmIG9zLT5iZmRfc2VjdGlvbiAhPSBOVUxMCi0gICAgICAmJiAoKGhvbGRfc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpKQotCSAgPT0gKG9zLT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpKSkpCi0gICAgaG9sZF91c2UgPSBvczsKLQotICBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICBob2xkX3RleHQgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5yb2RhdGEiKSA9PSAwKQotICAgIGhvbGRfcm9kYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuZGF0YSIpID09IDApCi0gICAgaG9sZF9kYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuYnNzIikgPT0gMCkKLSAgICBob2xkX2JzcyA9IG9zOwotICBlbHNlIGlmIChob2xkX3JlbCA9PSBOVUxMCi0JICAgJiYgb3MtPmJmZF9zZWN0aW9uICE9IE5VTEwKLQkgICAmJiAob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCSAgICYmIHN0cm5jbXAgKG9zLT5uYW1lLCAiLnJlbCIsIDQpID09IDApCi0gICAgaG9sZF9yZWwgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5pbnRlcnAiKSA9PSAwKQotICAgIGhvbGRfaW50ZXJwID0gb3M7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0ncy9bIlxcXS9cXCYvZwotcy8kL1xcblxcLwotMXMvXi8iLwotJHMvJC9uIi8KLScKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHVgOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyYDsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuYDsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuYDsKLUVPRgotCi1pZiB0ZXN0IC1uICIkR0VORVJBVEVfU0hMSUJfU0NSSVBUIiA7IHRoZW4KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0gIGVsc2UgaWYgKGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhzYDsKLUVPRgotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLSAgZWxzZQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54YDsKLX0KLUVPRgotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHMiOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4sCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbgotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2dlbmVyaWMuZW0gYi9sZC9lbXVsdGVtcGwvZ2VuZXJpYy5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwYzhlYi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvZ2VuZXJpYy5lbQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIGVtdWxhdGUgdGhlIG9yaWdpbmFsIGdsZCBmb3IgdGhlIGdpdmVuICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0KLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKLXsKLSNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KLSAgbGRmaWxlX3NldF9vdXRwdXRfYXJjaCAoImBlY2hvICR7QVJDSH1gIik7Ci0jZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiAke3NyY2Rpcn0vZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGFmdGVyX29wZW5fZGVmYXVsdCwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9nbGQ5NjAuZW0gYi9sZC9lbXVsdGVtcGwvZ2xkOTYwLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjk5OGZiLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9nbGQ5NjAuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIAotICogZW11bGF0ZSB0aGUgSW50ZWxzIHBvcnQgb2YgIGdsZAotICovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0KLSNpZmRlZiBHTlU5NjAKLQotc3RhdGljIHZvaWQKLWdsZDk2MF9iZWZvcmVfcGFyc2UoKQotewotICBzdGF0aWMgY2hhciAqZW52X3ZhcmlhYmxlc1tdID0geyAiRzk2MExJQiIsICJHOTYwQkFTRSIsIDAgfTsKLSAgY2hhciAqKnA7Ci0gIGNoYXIgKmVudiA7Ci0KLSAgZm9yICggcCA9IGVudl92YXJpYWJsZXM7ICpwOyBwKysgKXsKLSAgICBlbnYgPSAgKGNoYXIgKikgZ2V0ZW52KCpwKTsKLSAgICBpZiAoZW52KSB7Ci0gICAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAoY29uY2F0IChlbnYsCi0JCQkJICAgICAgICIvbGliL2xpYmJvdXQiLAotCQkJCSAgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKSwKLQkJCSAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKLX0KLQotI2Vsc2UJLyogbm90IEdOVTk2MCAqLwotCi1zdGF0aWMgdm9pZCBnbGQ5NjBfYmVmb3JlX3BhcnNlKCkKLXsKLSAgY2hhciAqZW52IDsKLSAgZW52ID0gIGdldGVudigiRzk2MExJQiIpOwotICBpZiAoZW52KSB7Ci0gICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgoZW52LCBmYWxzZSk7Ci0gIH0KLSAgZW52ID0gZ2V0ZW52KCJHOTYwQkFTRSIpOwotICBpZiAoZW52KQotICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChjb25jYXQgKGVudiwgIi9saWIiLCAoY29uc3QgY2hhciAqKSBOVUxMKSwgZmFsc2UpOwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX2k5NjA7Ci19Ci0KLSNlbmRpZgkvKiBHTlU5NjAgKi8KLQotCi1zdGF0aWMgdm9pZAotZ2xkOTYwX3NldF9vdXRwdXRfYXJjaCgpCi17Ci0gIGJmZF9zZXRfYXJjaF9tYWNoKG91dHB1dF9iZmQsIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlLCBiZmRfbWFjaF9pOTYwX2NvcmUpOwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQ5NjBfY2hvb3NlX3RhcmdldCgpCi17Ci0jaWZkZWYgR05VOTYwCi0KLSAgb3V0cHV0X2ZpbGVuYW1lID0gImIub3V0IjsKLSAgcmV0dXJuIGJmZF9tYWtlX3RhcmdfbmFtZShCRkRfQk9VVF9GT1JNQVQsIDApOwotCi0jZWxzZQotCi0gIGNoYXIgKmZyb21fb3V0c2lkZSA9IGdldGVudihUQVJHRVRfRU5WSVJPTik7Ci0gIG91dHB1dF9maWxlbmFtZSA9ICJiLm91dCI7Ci0KLSAgaWYgKGZyb21fb3V0c2lkZSAhPSAoY2hhciAqKU5VTEwpCi0gICAgcmV0dXJuIGZyb21fb3V0c2lkZTsKLQotICByZXR1cm4gImIub3V0LmxpdHRsZSI7Ci0KLSNlbmRpZgotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQ5NjBfZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSdzL1siXFxdL1xcJi9nCi1zLyQvXFxuXFwvCi0xcy9eLyIvCi0kcy8kL24iLwotJwotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dWA7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHJgOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym5gOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG5gOwotICBlbHNlCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhgOwotfQotRU9GCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfZ2xkOTYwX2VtdWxhdGlvbiA9IAotewotICBnbGQ5NjBfYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGFmdGVyX29wZW5fZGVmYXVsdCwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGQ5NjBfc2V0X291dHB1dF9hcmNoLAotICBnbGQ5NjBfY2hvb3NlX3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgZ2xkOTYwX2dldF9zY3JpcHQsCi0gICI5NjAiLAotICAiIgotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2dsZDk2MGMuZW0gYi9sZC9lbXVsdGVtcGwvZ2xkOTYwYy5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjYjVlZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvZ2xkOTYwYy5lbQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIAotICogZW11bGF0ZSB0aGUgSW50ZWxzIHBvcnQgb2YgIGdsZAotICovCi0KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLQotI2lmZGVmIEdOVTk2MAotCi1zdGF0aWMgdm9pZAotZ2xkOTYwX2JlZm9yZV9wYXJzZSgpCi17Ci0gIHN0YXRpYyBjaGFyICplbnZfdmFyaWFibGVzW10gPSB7ICJHOTYwTElCIiwgIkc5NjBCQVNFIiwgMCB9OwotICBjaGFyICoqcDsKLSAgY2hhciAqZW52IDsKLQotICBmb3IgKCBwID0gZW52X3ZhcmlhYmxlczsgKnA7IHArKyApewotICAgIGVudiA9ICAoY2hhciAqKSBnZXRlbnYoKnApOwotICAgIGlmIChlbnYpIHsKLSAgICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChjb25jYXQgKGVudiwKLQkJCQkgICAgICAgIi9saWIvbGliY29mZiIsCi0JCQkJICAgICAgIChjb25zdCBjaGFyICopIE5VTEwpLAotCQkJICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gIH0KLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9pOTYwOwotfQotCi0jZWxzZQkvKiBub3QgR05VOTYwICovCi0KLXN0YXRpYyB2b2lkIGdsZDk2MF9iZWZvcmVfcGFyc2UoKQotewotICBjaGFyICplbnYgOwotICBlbnYgPSAgZ2V0ZW52KCJHOTYwTElCIik7Ci0gIGlmIChlbnYpIHsKLSAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aChlbnYsIGZhbHNlKTsKLSAgfQotICBlbnYgPSBnZXRlbnYoIkc5NjBCQVNFIik7Ci0gIGlmIChlbnYpCi0gICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKGNvbmNhdCAoZW52LCAiL2xpYiIsIChjb25zdCBjaGFyICopIE5VTEwpLAotCQkJICAgICBmYWxzZSk7Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKLX0KLQotI2VuZGlmCS8qIEdOVTk2MCAqLwotCi0KLXN0YXRpYyB2b2lkCi1nbGQ5NjBfc2V0X291dHB1dF9hcmNoKCkKLXsKLSAgaWYgKGxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lICE9IE5VTEwKLSAgICAgICYmICpsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGNoYXIgKnMsICpzMTsKLQotICAgICAgcyA9IGNvbmNhdCAoImk5NjA6IiwgbGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWUsIChjaGFyICopIE5VTEwpOwotICAgICAgZm9yIChzMSA9IHM7ICpzMSAhPSAnXDAnOyBzMSsrKQotCWlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgKnMxKSkKLQkgICpzMSA9IHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqczEpOwotICAgICAgbGRmaWxlX3NldF9vdXRwdXRfYXJjaCAocyk7Ci0gICAgICBmcmVlIChzKTsKLSAgICB9Ci0KLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQgKCk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZDk2MF9jaG9vc2VfdGFyZ2V0KCkKLXsKLSNpZmRlZiBHTlU5NjAKLQotICBvdXRwdXRfZmlsZW5hbWUgPSAiYi5vdXQiOwotICByZXR1cm4gYmZkX21ha2VfdGFyZ19uYW1lKEJGRF9CT1VUX0ZPUk1BVCwgMCk7Ci0KLSNlbHNlCi0KLSAgY2hhciAqZnJvbV9vdXRzaWRlID0gZ2V0ZW52KFRBUkdFVF9FTlZJUk9OKTsKLSAgb3V0cHV0X2ZpbGVuYW1lID0gImIub3V0IjsKLQotICBpZiAoZnJvbV9vdXRzaWRlICE9IChjaGFyICopTlVMTCkKLSAgICByZXR1cm4gZnJvbV9vdXRzaWRlOwotCi0gIHJldHVybiAiY29mZi1JbnRlbC1saXR0bGUiOwotCi0jZW5kaWYKLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkOTYwX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0ncy9bIlxcXS9cXCYvZwotcy8kL1xcblxcLwotMXMvXi8iLwotJHMvJC9uIi8KLScKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHVgOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyYDsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuYDsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuYDsKLSAgZWxzZQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54YDsKLX0KLUVPRgotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX2dsZDk2MGNvZmZfZW11bGF0aW9uID0gCi17Ci0gIGdsZDk2MF9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgYWZ0ZXJfb3Blbl9kZWZhdWx0LAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIGdsZDk2MF9zZXRfb3V0cHV0X2FyY2gsCi0gIGdsZDk2MF9jaG9vc2VfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGQ5NjBfZ2V0X3NjcmlwdCwKLSAgIjk2MGNvZmYiLAotICAiIgotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2hwcGFlbGYuZW0gYi9sZC9lbXVsdGVtcGwvaHBwYWVsZi5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBjYTExMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvaHBwYWVsZi5lbQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBBbiBlbXVsYXRpb24gZm9yIEhQIFBBLVJJU0MgRUxGIGxpbmtlcnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGN0b3IuaCIKLQotLyogU2VjdGlvbiBpbiB3aGljaCB3ZSBidWlsZCBzdHVicy4gICovCi1zdGF0aWMgYXNlY3Rpb24gKnN0dWJfc2VjOwotc3RhdGljIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnN0dWJfZmlsZTsKLQotCi0vKiBGSVhNRS4gIFRoaXMgZG9lc24ndCBiZWxvbmcgaGVyZS4gICovCi1leHRlcm4gbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGZpbGVfY2hhaW47Ci0KLS8qIFBlcmZvcm0gc29tZSBlbXVsYXRpb24gc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24uICBGb3IgUEEgRUxGIHdlIHNldAotICAgdXAgdGhlIGxvY2FsIGxhYmVsIHByZWZpeCBhbmQgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAotaHBwYWVsZl9iZWZvcmVfcGFyc2UgKCkKLXsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9ocHBhOwotfQotCi0vKiBTZXQgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotaHBwYWVsZl9zZXRfb3V0cHV0X2FyY2goKQotewotICB1bnNpZ25lZCBsb25nIG1hY2hpbmUgPSAwOwotCi0gIGJmZF9zZXRfYXJjaF9tYWNoIChvdXRwdXRfYmZkLCBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSwgbWFjaGluZSk7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSB0aGUgaW5wdXQgZmlsZXMgYXJlIG9wZW5lZC4gIFdlIGNyZWF0ZSBhIG5ldwotICAgZmFrZSBpbnB1dCBmaWxlIHRvIGhvbGQgdGhlIHN0dWIgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1ocHBhZWxmX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzICgpCi17Ci0gIHN0dWJfZmlsZSA9IGxhbmdfYWRkX2lucHV0X2ZpbGUgKCJsaW5rZXIgc3R1YnMiLAotCQkJCSAgIGxhbmdfaW5wdXRfZmlsZV9pc19mYWtlX2VudW0sCi0JCQkJICAgTlVMTCk7Ci0gIHN0dWJfZmlsZS0+dGhlX2JmZCA9IGJmZF9jcmVhdGUgKCJsaW5rZXIgc3R1YnMiLCBvdXRwdXRfYmZkKTsKLSAgaWYgKHN0dWJfZmlsZS0+dGhlX2JmZCA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfYXJjaF9tYWNoIChzdHViX2ZpbGUtPnRoZV9iZmQsCi0JCQkgICAgICBiZmRfZ2V0X2FyY2ggKG91dHB1dF9iZmQpLAotCQkJICAgICAgYmZkX2dldF9tYWNoIChvdXRwdXRfYmZkKSkpCi0gICAgewotICAgICAgZWluZm8gKCIlWCVQOiBjYW4gbm90IGNyZWF0ZSBCRkQgJUVcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdHViX3NlYyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoc3R1Yl9maWxlLT50aGVfYmZkLCAiLnRleHQiKTsKLSAgLyogRG9uJ3Qgc2V0IFNFQ19SRUxPQyB1bnRpbCB3ZSBhY3R1YWxseSBoYXZlIHJlbG9jYXRpb25zIGluIHRoaXMKLSAgICAgc2VjdGlvbi4gICovCi0gIGlmIChzdHViX3NlYyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3R1Yl9maWxlLT50aGVfYmZkLCBzdHViX3NlYywKLQkJCQkgIChTRUNfSEFTX0NPTlRFTlRTCi0JCQkJICAgfCBTRUNfQUxMT0MKLQkJCQkgICB8IFNFQ19MT0FECi0JCQkJICAgfCBTRUNfQ09ERQotCQkJCSAgIHwgU0VDX0lOX01FTU9SWSkpKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVglUDogY2FuIG5vdCBjcmVhdGUgc3R1YiBzZWN0aW9uOiAlRVxuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGxkbGFuZ19hZGRfZmlsZSAoc3R1Yl9maWxlKTsKLX0KLQotLyogV2FsayBhbGwgdGhlIGxhbmcgc3RhdGVtZW50cyBzcGxpY2luZyBvdXQgYW55IHBhZGRpbmcgc3RhdGVtZW50cyBmcm9tIAotICAgdGhlIGxpc3QuICAqLwotCi1zdGF0aWMgdm9pZAotaHBwYWVsZl9kZWxldGVfcGFkZGluZ19zdGF0ZW1lbnRzIChzLCBwcmV2KQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcHJldjsKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqc3ByZXYgPSBOVUxMOwotICBmb3IgKDsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotCXsKLQotCS8qIFdlIHdhbnQgcmVjdXJzaXZlbHkgd2FsayB0aGVzZSBzZWN0aW9ucy4gICovCi0JY2FzZSBsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bToKLQkgIGhwcGFlbGZfZGVsZXRlX3BhZGRpbmdfc3RhdGVtZW50cyAoY29uc3RydWN0b3JfbGlzdC5oZWFkLAotCQkJCQkgICAgICZjb25zdHJ1Y3Rvcl9saXN0LmhlYWQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0JICBocHBhZWxmX2RlbGV0ZV9wYWRkaW5nX3N0YXRlbWVudHMgKHMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC4KLQkJCQkJICAgICAgIGNoaWxkcmVuLmhlYWQsCi0JCQkJCSAgICAgJnMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC4KLQkJCQkJICAgICAgIGNoaWxkcmVuLmhlYWQpOwotCSAgYnJlYWs7Ci0KLQkvKiBIdWg/ICBXaGF0IGlzIGEgbGFuZ193aWxkX3N0YXRlbWVudD8gICovCi0JY2FzZSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW06Ci0JICBocHBhZWxmX2RlbGV0ZV9wYWRkaW5nX3N0YXRlbWVudHMgKHMtPndpbGRfc3RhdGVtZW50LgotCQkJCQkgICAgICAgY2hpbGRyZW4uaGVhZCwKLQkJCQkJICAgICAmcy0+d2lsZF9zdGF0ZW1lbnQuCi0JCQkJCSAgICAgICBjaGlsZHJlbi5oZWFkKTsKLQkgIGJyZWFrOwotCi0JLyogSGVyZSdzIHdoYXQgd2UgYXJlIHJlYWxseSBsb29raW5nIGZvci4gIFNwbGljZSB0aGVzZSBvdXQgb2YKLQkgICB0aGUgbGlzdC4gICovCi0JY2FzZSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW06Ci0JICBpZiAoc3ByZXYpCi0JICAgIHNwcmV2LT5oZWFkZXIubmV4dCA9IHMtPmhlYWRlci5uZXh0OwotCSAgZWxzZQotCSAgICAqKnByZXYgPSAqczsKLQkgIGJyZWFrOwotCi0JLyogV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGVzZSBjYXNlcy4gICovCi0JY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX29iamVjdF9zeW1ib2xzX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19vdXRwdXRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgotCWNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgc3ByZXYgPSBzOwotICAgIH0KLX0KLQotLyogRmluYWwgZW11bGF0aW9uIHNwZWNpZmljIGNhbGwuICBGb3IgdGhlIFBBIHdlIHVzZSB0aGlzIG9wcG9ydHVuaXR5Ci0gICB0byBidWlsZCBsaW5rZXIgc3R1YnMuICAqLwotCi1zdGF0aWMgdm9pZAotaHBwYWVsZl9maW5pc2ggKCkKLXsKLSAgLyogQ2FsbCBpbnRvIHRoZSBCRkQgYmFja2VuZCB0byBkbyB0aGUgcmVhbCB3b3JrLiAgKi8KLSAgaWYgKGVsZjMyX2hwcGFfc2l6ZV9zdHVicyAoc3R1Yl9maWxlLT50aGVfYmZkLCBvdXRwdXRfYmZkLCAmbGlua19pbmZvKQotICAgICAgPT0gZmFsc2UpCi0gICAgewotICAgICAgZWluZm8gKCIlWCVQOiBjYW4gbm90IHNpemUgc3R1YiBzZWN0aW9uOiAlRVxuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgLyogSWYgdGhlIHNpemUgb2YgdGhlIHN0dWIgc2VjdGlvbiBpcyBub256ZXJvLCB0aGVuIHdlIG5lZWQKLSAgICAgdG8gcmVzaXplIHRoZSBzZWN0aW9ucywgcmVjb21wdXRlIHRoZSBhc3NpZ25tZW50cywgYW5kIGZpbmFsbHkKLSAgICAgYnVpbGQgdGhlIHN0dWJzLiAgKi8KLSAgaWYgKGJmZF9zZWN0aW9uX3NpemUgKHN0dWJfZmlsZS0+dGhlX2JmZCwgc3R1Yl9maWxlLT50aGVfYmZkLT5zZWN0aW9ucykgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBEZWxldGUgYWxsIHRoZSBwYWRkaW5nIHN0YXRlbWVudHMsIHRoZXkncmUgbm8gbG9uZ2VyIHZhbGlkLiAgKi8KLSAgICAgIGhwcGFlbGZfZGVsZXRlX3BhZGRpbmdfc3RhdGVtZW50cyAoc3RhdF9wdHItPmhlYWQsICZzdGF0X3B0ci0+aGVhZCk7Ci0gICAgICAKLSAgICAgIC8qIFJlc2l6ZSB0aGUgc2VjdGlvbnMuICAqLwotICAgICAgbGFuZ19zaXplX3NlY3Rpb25zIChzdGF0X3B0ci0+aGVhZCwgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAmc3RhdF9wdHItPmhlYWQsIDAsIChiZmRfdm1hKSAwLCBmYWxzZSk7Ci0gICAgICAKLSAgICAgIC8qIFJlZG8gc3BlY2lhbCBzdHVmZi4gICovCi0gICAgICBsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbiAoKTsKLSAgICAgIAotICAgICAgLyogRG8gdGhlIGFzc2lnbm1lbnRzIGFnYWluLiAgKi8KLSAgICAgIGxhbmdfZG9fYXNzaWdubWVudHMgKHN0YXRfcHRyLT5oZWFkLAotCQkJICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAgKGZpbGxfdHlwZSkgMCwgKGJmZF92bWEpIDApOwotICAgICAgCi0gICAgICAvKiBOb3cgYnVpbGQgdGhlIGxpbmtlciBzdHVicy4gICovCi0gICAgICBpZiAoZWxmMzJfaHBwYV9idWlsZF9zdHVicyAoc3R1Yl9maWxlLT50aGVfYmZkLCAmbGlua19pbmZvKSA9PSBmYWxzZSkKLQl7Ci0JICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgYnVpbGQgc3R1YnM6ICVFXG4iKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0vKiBUaGUgc2NyaXB0IGl0c2VsZiBnZXRzIGluc2VydGVkIGhlcmUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1ocHBhZWxmX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0ncy9bIlxcXS9cXCYvZwotcy8kL1xcblxcLwotMXMvXi8iLwotJHMvJC9uIi8KLScKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHVgOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyYDsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuYDsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuYDsKLSAgZWxzZQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54YDsKLX0KLUVPRgotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX2hwcGFlbGZfZW11bGF0aW9uID0gCi17Ci0gIGhwcGFlbGZfYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGFmdGVyX29wZW5fZGVmYXVsdCwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBocHBhZWxmX3NldF9vdXRwdXRfYXJjaCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBocHBhZWxmX2dldF9zY3JpcHQsCi0gICJocHBhZWxmIiwKLSAgImVsZjMyLWhwcGEiLAotICBocHBhZWxmX2ZpbmlzaCwKLSAgaHBwYWVsZl9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cywKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9saW51eC5lbSBiL2xkL2VtdWx0ZW1wbC9saW51eC5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMwODU1ZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvbGludXguZW0KKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBMaW51eCBhLm91dCBlbXVsYXRpb24gY29kZSBmb3IgJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLSAgIExpbnV4IHN1cHBvcnQgYnkgRXJpYyBZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY2Fpcy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0KLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHNlYXJjaF9kaXJzX3R5cGUgKiwgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2FkZHJlc3Nfc3RhdGVtZW50Ci0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMKLSAgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfJHtBUkNIfTsKLSAgY29uZmlnLmR5bmFtaWNfbGluayA9IHRydWU7Ci0gIGNvbmZpZy5oYXNfc2hhcmVkID0gdHJ1ZTsKLX0KLQotLyogVHJ5IHRvIG9wZW4gYSBkeW5hbWljIGFyY2hpdmUuICBUaGlzIGlzIHdoZXJlIHdlIGtub3cgdGhhdCBMaW51eAotICAgZHluYW1pYyBsaWJyYXJpZXMgaGF2ZSBhbiBleHRlbnNpb24gb2YgLnNhLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlIChhcmNoLCBzZWFyY2gsIGVudHJ5KQotICAgICBjb25zdCBjaGFyICphcmNoOwotICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBjaGFyICpzdHJpbmc7Ci0KLSAgaWYgKCEgZW50cnktPmlzX2FyY2hpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKQotCQkJICAgICArIHN0cmxlbiAoZW50cnktPmZpbGVuYW1lKQotCQkJICAgICArIHN0cmxlbiAoYXJjaCkKLQkJCSAgICAgKyBzaXplb2YgIi9saWIuc2EiKTsKLQotICBzcHJpbnRmIChzdHJpbmcsICIlcy9saWIlcyVzLnNhIiwgc2VhcmNoLT5uYW1lLCBlbnRyeS0+ZmlsZW5hbWUsIGFyY2gpOwotCi0gIGlmICghIGxkZmlsZV90cnlfb3Blbl9iZmQgKHN0cmluZywgZW50cnkpKQotICAgIHsKLSAgICAgIGZyZWUgKHN0cmluZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVudHJ5LT5maWxlbmFtZSA9IHN0cmluZzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGNyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzIHJvdXRpbmUgdmlhCi0gICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEl0IGxvY2F0ZXMgYW55IGFkZHJlc3MgYXNzaWdubWVudCB0bwotICAgLnRleHQsIGFuZCBtb2RpZmllcyBpdCB0byBpbmNsdWRlIHRoZSBzaXplIG9mIHRoZSBoZWFkZXJzLiAgVGhpcwotICAgY2F1c2VzIC1UdGV4dCB0byBtZWFuIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBoZWFkZXIsIHJhdGhlcgotICAgdGhhbiB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiAudGV4dCwgd2hpY2ggaXMgY29tcGF0aWJsZSB3aXRoIG90aGVyCi0gICBMaW51eCB0b29scy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2FkZHJlc3Nfc3RhdGVtZW50IChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hZGRyZXNzX3N0YXRlbWVudF9lbnVtCi0gICAgICAmJiBzdHJjbXAgKHMtPmFkZHJlc3Nfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICB7Ci0gICAgICBBU1NFUlQgKHMtPmFkZHJlc3Nfc3RhdGVtZW50LmFkZHJlc3MtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV92YWx1ZSk7Ci0gICAgICBzLT5hZGRyZXNzX3N0YXRlbWVudC5hZGRyZXNzLT52YWx1ZS52YWx1ZSArPSAweDIwOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIG9wZW5pbmcgdGhlIGlucHV0IEJGRCdzLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzICgpCi17Ci0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2FkZHJlc3Nfc3RhdGVtZW50KTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKLSAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiAoKQotewotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgLyogTGV0IHRoZSBiYWNrZW5kIHdvcmsgb3V0IHRoZSBzaXplcyBvZiBhbnkgc2VjdGlvbnMgcmVxdWlyZWQgYnkKLSAgICAgZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgaWYgKCEgYmZkXyR7RU1VTEFUSU9OX05BTUV9X3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbykpCi0gICAgZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gc2V0IGR5bmFtaWMgc2VjdGlvbiBzaXplczogJUVcbiIpOwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9J3MvWyJcXF0vXFwmL2cKLXMvJC9cXG5cXC8KLTFzL14vIi8KLSRzLyQvbiIvCi0nCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1YDsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cmA7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibmA7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54bmA7Ci0gIGVsc2UKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGA7Ci19Ci1FT0YKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGFmdGVyX29wZW5fZGVmYXVsdCwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iLAotICBOVUxMLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cywKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9sbms5NjAuZW0gYi9sZC9lbXVsdGVtcGwvbG5rOTYwLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjZkNDZiLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9sbms5NjAuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogaW50ZWwgY29mZiBsb2FkZXIgZW11bGF0aW9uIHNwZWNpZmljIHN0dWZmCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0vKiNpbmNsdWRlICJhcmNodXJlcy5oIiovCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotCi10eXBlZGVmIHN0cnVjdCBsaWJfbGlzdCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBsaWJfbGlzdCAqbmV4dDsKLX0gbGliX2xpc3RfdHlwZTsKLQotc3RhdGljIGxpYl9saXN0X3R5cGUgKmhsbF9saXN0Owotc3RhdGljIGxpYl9saXN0X3R5cGUgKipobGxfbGlzdF90YWlsID0gJmhsbF9saXN0OwotCi1zdGF0aWMgbGliX2xpc3RfdHlwZSAqc3lzbGliX2xpc3Q7Ci1zdGF0aWMgbGliX2xpc3RfdHlwZSAqKnN5c2xpYl9saXN0X3RhaWwgPSAmc3lzbGliX2xpc3Q7Ci0KLQotc3RhdGljIHZvaWQKLWFwcGVuZChsaXN0LCBuYW1lKQotICAgICBsaWJfbGlzdF90eXBlICoqKmxpc3Q7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGxpYl9saXN0X3R5cGUgKmVsZW1lbnQgPSAKLSAgICAobGliX2xpc3RfdHlwZSAqKSh4bWFsbG9jKHNpemVvZihsaWJfbGlzdF90eXBlKSkpOwotCi0gIGVsZW1lbnQtPm5hbWUgPSBuYW1lOwotICBlbGVtZW50LT5uZXh0ID0gKGxpYl9saXN0X3R5cGUgKilOVUxMOwotICAqKmxpc3QgPSBlbGVtZW50OwotICAqbGlzdCA9ICZlbGVtZW50LT5uZXh0OwotCi19Ci0KLXN0YXRpYyBib29sZWFuIGhhZF9obGwgPSBmYWxzZTsKLXN0YXRpYyBib29sZWFuIGhhZF9obGxfbmFtZSA9IGZhbHNlOwotCi1zdGF0aWMgdm9pZAotbG5rOTYwX2hsbChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBoYWRfaGxsID0gdHJ1ZTsKLSAgaWYgKG5hbWUgIT0gKGNoYXIgKilOVUxMKSB7Ci0gICAgaGFkX2hsbF9uYW1lID0gdHJ1ZTsKLSAgICBhcHBlbmQoJmhsbF9saXN0X3RhaWwsIG5hbWUpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIAotbG5rOTYwX3N5c2xpYihuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBhcHBlbmQoJnN5c2xpYl9saXN0X3RhaWwsbmFtZSk7Ci19Ci0KLQotI2lmZGVmIEdOVTk2MAotCi1zdGF0aWMgdm9pZCAKLWxuazk2MF9iZWZvcmVfcGFyc2UoKQotewotICBzdGF0aWMgY2hhciAqZW52X3ZhcmlhYmxlc1tdID0geyAiRzk2MExJQiIsICJHOTYwQkFTRSIsIDAgfTsKLSAgY2hhciAqKnA7Ci0gIGNoYXIgKmVudiA7Ci0KLSAgZm9yICggcCA9IGVudl92YXJpYWJsZXM7ICpwOyBwKysgKXsKLSAgICBlbnYgPSAgKGNoYXIgKikgZ2V0ZW52KCpwKTsKLSAgICBpZiAoZW52KSB7Ci0gICAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aChjb25jYXQoZW52LCIvbGliL2xpYmNvZmYiLCIiKSwgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIGVudj0gKGNoYXIgKikgZ2V0ZW52KCJJOTYwQkFTRSIpOwotICBpZiAoIGVudiApIHsKLSAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aChjb25jYXQoZW52LCIvbGliIiwiIiksIGZhbHNlKTsKLSAgfQotCi0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKLSAgbGRmaWxlX291dHB1dF9tYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jb3JlOwotfQotCi0jZWxzZQkvKiBub3QgR05VOTYwICovCi0KLXN0YXRpYyB2b2lkIAotbG5rOTYwX2JlZm9yZV9wYXJzZSgpCi17Ci0gIGNoYXIgKm5hbWUgPSBnZXRlbnYoIkk5NjBCQVNFIik7Ci0KLSAgaWYgKG5hbWUgPT0gKGNoYXIgKilOVUxMKSB7Ci0gICAgbmFtZSA9IGdldGVudigiRzk2MEJBU0UiKTsKLSAgICBpZiAobmFtZSA9PSAoY2hhciAqKU5VTEwpIHsKLSAgICAgIGVpbmZvKCIlUCVGIEk5NjBCQVNFIGFuZCBHOTYwQkFTRSBub3Qgc2V0XG4iKTsKLSAgICB9Ci0gIH0KLQotCi0gIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoKGNvbmNhdChuYW1lLCIvbGliIiwiIiksIGZhbHNlKTsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9pOTYwOwotICBsZGZpbGVfb3V0cHV0X21hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2NvcmU7Ci19Ci0KLSNlbmRpZgkvKiBHTlU5NjAgKi8KLQotCi1zdGF0aWMgdm9pZAotYWRkX29uKGxpc3QsIHNlYXJjaCkKLSAgICAgbGliX2xpc3RfdHlwZSAqbGlzdDsKLSAgICAgbGFuZ19pbnB1dF9maWxlX2VudW1fdHlwZSBzZWFyY2g7Ci17Ci0gIHdoaWxlIChsaXN0KSB7Ci0gICAgbGFuZ19hZGRfaW5wdXRfZmlsZShsaXN0LT5uYW1lLAotCQkJc2VhcmNoLAotCQkJKGNoYXIgKilOVUxMKTsKLSAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgfQotfQotc3RhdGljIHZvaWQKLWxuazk2MF9hZnRlcl9wYXJzZSgpCi17Ci0gIC8qIElmIHRoZXJlIGhhcyBiZWVuIG5vIGFyY2gsIGRlZmF1bHQgdG8gLUtCICovCi0gIGlmIChsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZVswXSA9PTApIHsKLSAgICBsZGZpbGVfYWRkX2FyY2goIktCIik7Ci0gIH0KLQotICAvKiBpZiB0aGVyZSBoYXMgYmVlbiBubyBobGwgbGlzdCB0aGVuIGFkZCBvdXIgb3duICovCi0gIAotICBpZihoYWRfaGxsICYmICFoYWRfaGxsX25hbWUpIHsKLSAgICBhcHBlbmQoJmhsbF9saXN0X3RhaWwsImNnIik7Ci0gICAgaWYgKGxkZmlsZV9vdXRwdXRfbWFjaGluZSA9PSBiZmRfbWFjaF9pOTYwX2thX3NhIHx8Ci0gIAlsZGZpbGVfb3V0cHV0X21hY2hpbmUgPT0gYmZkX21hY2hfaTk2MF9jYSkgewotICAgICAgICB7Ci0JICBhcHBlbmQoJmhsbF9saXN0X3RhaWwsImZwZyIpOwotICAgICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBhZGRfb24oaGxsX2xpc3QsIGxhbmdfaW5wdXRfZmlsZV9pc19sX2VudW0pOwotICBhZGRfb24oc3lzbGliX2xpc3QsIGxhbmdfaW5wdXRfZmlsZV9pc19zZWFyY2hfZmlsZV9lbnVtKTsKLX0KLQotc3RhdGljIHZvaWQKLWxuazk2MF9iZWZvcmVfYWxsb2NhdGlvbigpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi1sbms5NjBfYWZ0ZXJfYWxsb2NhdGlvbigpCi17Ci0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IGZhbHNlKSB7Ci0gICAgbGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZigiLnRleHQiLCJfZXRleHQiKTsKLSAgICBsYW5nX2Fic19zeW1ib2xfYXRfZW5kX29mKCIuZGF0YSIsIl9lZGF0YSIpOwotICAgIGxhbmdfYWJzX3N5bWJvbF9hdF9iZWdpbm5pbmdfb2YoIi5ic3MiLCJfYnNzX3N0YXJ0Iik7Ci0gICAgbGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZigiLmJzcyIsIl9lbmQiKTsKLSAgfQotfQotCi0KLXN0YXRpYyBzdHJ1Y3QKLSB7Ci0gICB1bnNpZ25lZCAgbG9uZyBudW1iZXI7Ci0gICBjaGFyICpuYW1lOyAKLSB9Ci1tYWNoaW5lX3RhYmxlW10gPQotewotICB7IGJmZF9tYWNoX2k5NjBfY29yZQksIkNPUkUiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9rYl9zYgksIktCIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfa2Jfc2IJLCJTQiIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX21jCSwiTUMiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF94YQksIlhBIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfY2EJLCJDQSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2thX3NhCSwiS0EiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9rYV9zYQksIlNBIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfangJLCJKWCIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2h4CSwiSFgiIH0sCi0KLSAgeyBiZmRfbWFjaF9pOTYwX2NvcmUJLCJjb3JlIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfa2Jfc2IJLCJrYiIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2tiX3NiCSwic2IiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9tYwksIm1jIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfeGEJLCJ4YSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2NhCSwiY2EiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9rYV9zYQksImthIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfa2Ffc2EJLCJzYSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2p4CSwiangiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9oeAksImh4IiB9LAotCi0gIHsgMCwgKGNoYXIgKikgTlVMTCB9Ci19OwotCi1zdGF0aWMgdm9pZAotbG5rOTYwX3NldF9vdXRwdXRfYXJjaCgpCi17Ci0gIC8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBpZiBwb3NzaWJsZSAqLwotICB1bnNpZ25lZCBpbnQgaTsKLSAgbGRmaWxlX291dHB1dF9tYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jb3JlOwotICBmb3IgKGk9IDA7IG1hY2hpbmVfdGFibGVbaV0ubmFtZSAhPSAoY2hhciopTlVMTDsgaSsrKSB7Ci0gICAgaWYgKHN0cmNtcChsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSxtYWNoaW5lX3RhYmxlW2ldLm5hbWUpPT0wKSB7Ci0gICAgICBsZGZpbGVfb3V0cHV0X21hY2hpbmUgPSBtYWNoaW5lX3RhYmxlW2ldLm51bWJlcjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBiZmRfc2V0X2FyY2hfbWFjaChvdXRwdXRfYmZkLCBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSwgbGRmaWxlX291dHB1dF9tYWNoaW5lKTsKLX0KLQotc3RhdGljIGNoYXIgKgotbG5rOTYwX2Nob29zZV90YXJnZXQoKQotewotI2lmZGVmIEdOVTk2MAotCi0gIHJldHVybiBiZmRfbWFrZV90YXJnX25hbWUoQkZEX0NPRkZfRk9STUFULCAwKTsKLQotI2Vsc2UKLQotICBjaGFyICpmcm9tX291dHNpZGUgPSBnZXRlbnYoVEFSR0VUX0VOVklST04pOwotICBpZiAoZnJvbV9vdXRzaWRlICE9IChjaGFyICopTlVMTCkKLSAgICByZXR1cm4gZnJvbV9vdXRzaWRlOwotI2lmZGVmIExOSzk2MF9MSVRUTEUKLSAgcmV0dXJuICJjb2ZmLUludGVsLWxpdHRsZSI7Ci0jZWxzZQotICByZXR1cm4gImNvZmYtSW50ZWwtYmlnIjsKLSNlbmRpZgotI2VuZGlmCi0KLX0KLQotc3RhdGljIGNoYXIgKgotbG5rOTYwX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0ncy9bIlxcXS9cXCYvZwotcy8kL1xcblxcLwotMXMvXi8iLwotJHMvJC9uIi8KLScKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1YDsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cmA7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibmA7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54bmA7Ci0gIGVsc2UKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGA7Ci19Ci1FT0YKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9sbms5NjBfZW11bGF0aW9uID0gCi17Ci0gIGxuazk2MF9iZWZvcmVfcGFyc2UsCi0gIGxuazk2MF9zeXNsaWIsCi0gIGxuazk2MF9obGwsCi0gIGxuazk2MF9hZnRlcl9wYXJzZSwKLSAgTlVMTCwJCQkvKiBhZnRlcl9vcGVuICovCi0gIGxuazk2MF9hZnRlcl9hbGxvY2F0aW9uLAotICBsbms5NjBfc2V0X291dHB1dF9hcmNoLAotICBsbms5NjBfY2hvb3NlX3RhcmdldCwKLSAgbG5rOTYwX2JlZm9yZV9hbGxvY2F0aW9uLAotICBsbms5NjBfZ2V0X3NjcmlwdCwKLSAgImxuazk2MCIsCi0gICIiCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtIGIvbGQvZW11bHRlbXBsL21pcHNlY29mZi5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyMDBjNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogSGFuZGxlIGVtYmVkZGVkIHJlbG9jcyBmb3IgTUlQUy4KLSAgIENvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4gYmFzZWQgb24gZ2VuZXJpYy5lbS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0KLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGNoZWNrX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0jaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCi0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfJHtBUkNIfTsKLSNlbmRpZiAvKiBub3QgVEFSR0VUXyAqLwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHJ1biBhZnRlciBhbGwgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBvcGVuZWQuCi0gICBXZSBjcmVhdGUgYSAucmVsLnNkYXRhIHNlY3Rpb24gZm9yIGVhY2ggaW5wdXQgZmlsZSB3aXRoIGEgbm9uIHplcm8KLSAgIC5zZGF0YSBzZWN0aW9uLiAgVGhlIEJGRCBiYWNrZW5kIHdpbGwgZmlsbCBpbiB0aGVzZSBzZWN0aW9ucyB3aXRoCi0gICBtYWdpYyBudW1iZXJzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbG9jYXRlIHRoZSBkYXRhIHNlY3Rpb24gYXQgcnVuCi0gICB0aW1lLiAgVGhpcyB3aWxsIG9ubHkgZG8gdGhlIHJpZ2h0IHRoaW5nIGlmIGFsbCB0aGUgaW5wdXQgZmlsZXMKLSAgIGhhdmUgYmVlbiBjb21waWxlZCB1c2luZyAtbWVtYmVkZGVkLXBpYy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuICgpCi17Ci0gIGJmZCAqYWJmZDsKLQotICBpZiAoISBjb21tYW5kX2xpbmUuZW1iZWRkZWRfcmVsb2NzCi0gICAgICB8fCBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHJldHVybjsKLQotICBmb3IgKGFiZmQgPSBsaW5rX2luZm8uaW5wdXRfYmZkczsgYWJmZCAhPSBOVUxMOyBhYmZkID0gYWJmZC0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpkYXRhc2VjOwotCi0gICAgICBkYXRhc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc2RhdGEiKTsKLQotICAgICAgLyogTm90ZSB0aGF0IHdlIGFzc3VtZSB0aGF0IHRoZSByZWxvY19jb3VudCBmaWVsZCBoYXMgYWxyZWFkeQotICAgICAgICAgYmVlbiBzZXQgdXAuICBXZSBjb3VsZCBjYWxsIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQsIGJ1dAotICAgICAgICAgdGhhdCByZXR1cm5zIHRoZSBzaXplIG9mIGEgbWVtb3J5IGJ1ZmZlciByYXRoZXIgdGhhbiBhIHJlbG9jCi0gICAgICAgICBjb3VudC4gIFdlIGRvIG5vdCB3YW50IHRvIGNhbGwgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYywKLSAgICAgICAgIGJlY2F1c2UgYWx0aG91Z2ggaXQgd291bGQgYWx3YXlzIHdvcmsgaXQgd291bGQgZm9yY2UgdXMgdG8KLSAgICAgICAgIHJlYWQgaW4gdGhlIHJlbG9jcyBpbnRvIEJGRCBjYW5vbmljYWwgZm9ybSwgd2hpY2ggd291bGQgd2FzdGUKLSAgICAgICAgIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHRpbWUgYW5kIG1lbW9yeS4gICovCi0gICAgICBpZiAoZGF0YXNlYyAhPSBOVUxMICYmIGRhdGFzZWMtPnJlbG9jX2NvdW50ID4gMCkKLQl7Ci0JICBhc2VjdGlvbiAqcmVsc2VjOwotCi0JICByZWxzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJlbC5zZGF0YSIpOwotCSAgaWYgKHJlbHNlYyA9PSBOVUxMCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHJlbHNlYywKLQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCSAgIHwgU0VDX0lOX01FTU9SWSkpCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCByZWxzZWMsIDIpCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgcmVsc2VjLAotCQkJCQkgZGF0YXNlYy0+cmVsb2NfY291bnQgKiA0KSkKLQkgICAgZWluZm8gKCIlRiVCOiBjYW4gbm90IGNyZWF0ZSAucmVsLnNkYXRhIHNlY3Rpb246ICVFXG4iKTsKLQl9Ci0KLSAgICAgIC8qIERvdWJsZSBjaGVjayB0aGF0IGFsbCBvdGhlciBkYXRhIHNlY3Rpb25zIGFyZSBlbXB0eSwgYXMgaXMKLSAgICAgICAgIHJlcXVpcmVkIGZvciBlbWJlZGRlZCBQSUMgY29kZS4gICovCi0gICAgICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIGNoZWNrX3NlY3Rpb25zLCAoUFRSKSBkYXRhc2VjKTsKLSAgICB9Ci19Ci0KLS8qIENoZWNrIHRoYXQgb2YgdGhlIGRhdGEgc2VjdGlvbnMsIG9ubHkgdGhlIC5zZGF0YSBzZWN0aW9uIGhhcwotICAgcmVsb2NzLiAgVGhpcyBpcyBjYWxsZWQgdmlhIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1jaGVja19zZWN0aW9ucyAoYWJmZCwgc2VjLCBzZGF0YXNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgc2RhdGFzZWM7Ci17Ci0gIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0NPREUpID09IDAKLSAgICAgICYmIHNlYyAhPSAoYXNlY3Rpb24gKikgc2RhdGFzZWMKLSAgICAgICYmIHNlYy0+cmVsb2NfY291bnQgIT0gMCkKLSAgICBlaW5mbyAoIiVQJVg6IHNlY3Rpb24gJXMgaGFzIHJlbG9jczsgY2FuIG5vdCB1c2UgLS1lbWJlZGRlZC1yZWxvY3NcbiIsCi0JICAgYWJmZCwgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbiBzaXplcyBhbmQgb2Zmc2V0cyBoYXZlCi0gICBiZWVuIHNldC4gIElmIHdlIGFyZSBnZW5lcmF0aW5nIGVtYmVkZGVkIHJlbG9jcywgaXQgY2FsbHMgYSBzcGVjaWFsCi0gICBCRkQgYmFja2VuZCByb3V0aW5lIHRvIGRvIHRoZSB3b3JrLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX2FsbG9jYXRpb24gKCkKLXsKLSAgYmZkICphYmZkOwotCi0gIGlmICghIGNvbW1hbmRfbGluZS5lbWJlZGRlZF9yZWxvY3MKLSAgICAgIHx8IGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoYWJmZCA9IGxpbmtfaW5mby5pbnB1dF9iZmRzOyBhYmZkICE9IE5VTEw7IGFiZmQgPSBhYmZkLT5saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKmRhdGFzZWMsICpyZWxzZWM7Ci0gICAgICBjaGFyICplcnJtc2c7Ci0KLSAgICAgIGRhdGFzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zZGF0YSIpOwotCi0gICAgICBpZiAoZGF0YXNlYyA9PSBOVUxMIHx8IGRhdGFzZWMtPnJlbG9jX2NvdW50ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIHJlbHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlbC5zZGF0YSIpOwotICAgICAgQVNTRVJUIChyZWxzZWMgIT0gTlVMTCk7Ci0KLSAgICAgIGlmICghIGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MgKGFiZmQsICZsaW5rX2luZm8sCi0JCQkJCQkgICBkYXRhc2VjLCByZWxzZWMsCi0JCQkJCQkgICAmZXJybXNnKSkKLQl7Ci0JICBpZiAoZXJybXNnID09IE5VTEwpCi0JICAgIGVpbmZvICgiJUIlWDogY2FuIG5vdCBjcmVhdGUgcnVudGltZSByZWxvYyBpbmZvcm1hdGlvbjogJUVcbiIsCi0JCSAgIGFiZmQpOwotCSAgZWxzZQotCSAgICBlaW5mbyAoIiVYJUI6IGNhbiBub3QgY3JlYXRlIHJ1bnRpbWUgcmVsb2MgaW5mb3JtYXRpb246ICVzXG4iLAotCQkgICBhYmZkLCBlcnJtc2cpOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgJHtzcmNkaXJ9L2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9hbGxvY2F0aW9uLAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9wZS5lbSBiL2xkL2VtdWx0ZW1wbC9wZS5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhMWVlYy4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvcGUuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTc5ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLShlY2hvO2VjaG87ZWNobztlY2hvKT5lJHtFTVVMQVRJT05fTkFNRX0uYyAjIHRoZXJlLCBub3cgbGluZSBudW1iZXJzIG1hdGNoIDstKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0gICBDb3B5cmlnaHQgMTk5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBGb3IgV0lORE9XU19OVCAqLwotLyogVGhlIG9yaWdpbmFsIGZpbGUgZ2VuZXJhdGVkIHJldHVybmVkIGRpZmZlcmVudCBkZWZhdWx0IHNjcmlwdHMgZGVwZW5kaW5nCi0gICBvbiB3aGV0aGVyIGNlcnRhaW4gc3dpdGNoZXMgd2VyZSBzZXQsIGJ1dCB0aGVzZSBzd2l0Y2hlcyBwZXJ0YWluIHRvIHRoZQotICAgTGludXggc3lzdGVtIGFuZCB0aGF0IHBhcnRpY3VsYXIgdmVyc2lvbiBvZiBjb2ZmLiAgSW4gdGhlIE5UIGNhc2UsIHdlCi0gICBvbmx5IGRldGVybWluZSBpZiB0aGUgc3Vic3lzdGVtIGlzIGNvbnNvbGUgb3Igd2luZG93cyBpbiBvcmRlciB0byBzZWxlY3QKLSAgIHRoZSBjb3JyZWN0IGVudHJ5IHBvaW50IGJ5IGRlZmF1bHQuICovIAotICAKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRjdG9yLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIi4uL2JmZC9saWJjb2ZmLmgiCi0jaW5jbHVkZSAiLi4vYmZkL2xpYmJmZC5oIgotI2luY2x1ZGUgImRlZmZpbGUuaCIKLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2lmIGRlZmluZWQoVEFSR0VUX0lTX2kzODZwZSkKLSNkZWZpbmUgRExMX1NVUFBPUlQKLSNlbmRpZgotCi0jZGVmaW5lCVBFX0RFRl9TVUJTWVNURU0JCTMKLQotc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbgotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyBjaGFyICpnbGRfJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKikpOwotc3RhdGljIGludCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLQotc3RhdGljIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyIHBlOwotc3RhdGljIGludCBkbGw7Ci1zdGF0aWMgaW50IHN1cHBvcnRfb2xkX2NvZGUgPSAwOwotZXh0ZXJuIGRlZl9maWxlICpwZV9kZWZfZmlsZTsKLXN0YXRpYyBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgKmltYWdlX2Jhc2Vfc3RhdGVtZW50ID0gMDsKLQotc3RhdGljIGNoYXIgKnBlX291dF9kZWZfZmlsZW5hbWUgPSAwOwotZXh0ZXJuIGludCBwZV9kbGxfZXhwb3J0X2V2ZXJ5dGhpbmc7Ci1leHRlcm4gaW50IHBlX2RsbF9raWxsX2F0czsKLWV4dGVybiBpbnQgcGVfZGxsX3N0ZGNhbGxfYWxpYXNlczsKLXN0YXRpYyBpbnQgcGVfZW5hYmxlX3N0ZGNhbGxfZml4dXAgPSAtMTsgLyogMD1kaXNhYmxlIDE9ZW5hYmxlICovCi1zdGF0aWMgY2hhciAqcGVfaW1wbGliX2ZpbGVuYW1lID0gMDsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKm91dHB1dF9maWxlbmFtZTsKLQotc3RhdGljIHZvaWQKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UoKQotewotICBvdXRwdXRfZmlsZW5hbWUgPSAiYS5leGUiOwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoXyR7QVJDSH07Ci0jaWZkZWYgRExMX1NVUFBPUlQKLSAgY29uZmlnLmhhc19zaGFyZWQgPSAxOwotI2VuZGlmCi19Ci0MCi0vKiBQRSBmb3JtYXQgZXh0cmEgY29tbWFuZCBsaW5lIG9wdGlvbnMuICAqLwotCi0vKiBVc2VkIGZvciBzZXR0aW5nIGZsYWdzIGluIHRoZSBQRSBoZWFkZXIuICovCi0jZGVmaW5lIE9QVElPTl9CQVNFX0ZJTEUJCSgzMDAgICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RMTAkJCShPUFRJT05fQkFTRV9GSUxFICsgMSkKLSNkZWZpbmUgT1BUSU9OX0ZJTEVfQUxJR05NRU5UCQkoT1BUSU9OX0RMTCArIDEpCi0jZGVmaW5lIE9QVElPTl9JTUFHRV9CQVNFCQkoT1BUSU9OX0ZJTEVfQUxJR05NRU5UICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT04JKE9QVElPTl9JTUFHRV9CQVNFICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BSk9SX09TX1ZFUlNJT04JCShPUFRJT05fTUFKT1JfSU1BR0VfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTgkoT1BUSU9OX01BSk9SX09TX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTgkoT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX01JTk9SX09TX1ZFUlNJT04JCShPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTgkoT1BUSU9OX01JTk9SX09TX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fU0VDVElPTl9BTElHTk1FTlQJKE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9TVEFDSyAgICAgICAgICAgICAgICAgICAgKE9QVElPTl9TRUNUSU9OX0FMSUdOTUVOVCArIDEpCi0jZGVmaW5lIE9QVElPTl9TVUJTWVNURU0gICAgICAgICAgICAgICAgKE9QVElPTl9TVEFDSyArIDEpCi0jZGVmaW5lIE9QVElPTl9IRUFQCQkJKE9QVElPTl9TVUJTWVNURU0gKyAxKQotI2RlZmluZSBPUFRJT05fU1VQUE9SVF9PTERfQ09ERQkJKE9QVElPTl9IRUFQICsgMSkKLSNkZWZpbmUgT1BUSU9OX09VVF9ERUYJCQkoT1BUSU9OX1NVUFBPUlRfT0xEX0NPREUgKyAxKQotI2RlZmluZSBPUFRJT05fRVhQT1JUX0FMTAkJKE9QVElPTl9PVVRfREVGICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VYQ0xVREVfU1lNQk9MUwkJKE9QVElPTl9FWFBPUlRfQUxMICsgMSkKLSNkZWZpbmUgT1BUSU9OX0tJTExfQVRTCQkJKE9QVElPTl9FWENMVURFX1NZTUJPTFMgKyAxKQotI2RlZmluZSBPUFRJT05fU1REQ0FMTF9BTElBU0VTCQkoT1BUSU9OX0tJTExfQVRTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VOQUJMRV9TVERDQUxMX0ZJWFVQCShPUFRJT05fU1REQ0FMTF9BTElBU0VTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RJU0FCTEVfU1REQ0FMTF9GSVhVUAkoT1BUSU9OX0VOQUJMRV9TVERDQUxMX0ZJWFVQICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lNUExJQl9GSUxFTkFNRQkJKE9QVElPTl9ESVNBQkxFX1NURENBTExfRklYVVAgKyAxKQotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0KLXsKLSAgLyogUEUgb3B0aW9ucyAqLwotICB7ImJhc2UtZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQkFTRV9GSUxFfSwKLSAgeyJkbGwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RMTH0sCi0gIHsiZmlsZS1hbGlnbm1lbnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0ZJTEVfQUxJR05NRU5UfSwKLSAgeyJoZWFwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IRUFQfSwgCi0gIHsiaW1hZ2UtYmFzZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU1BR0VfQkFTRX0sCi0gIHsibWFqb3ItaW1hZ2UtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFKT1JfSU1BR0VfVkVSU0lPTn0sCi0gIHsibWFqb3Itb3MtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFKT1JfT1NfVkVSU0lPTn0sCi0gIHsibWFqb3Itc3Vic3lzdGVtLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OfSwKLSAgeyJtaW5vci1pbWFnZS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSU5PUl9JTUFHRV9WRVJTSU9OfSwKLSAgeyJtaW5vci1vcy12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSU5PUl9PU19WRVJTSU9OfSwKLSAgeyJtaW5vci1zdWJzeXN0ZW0tdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT059LAotICB7InNlY3Rpb24tYWxpZ25tZW50IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TRUNUSU9OX0FMSUdOTUVOVH0sCi0gIHsic3RhY2siLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NUQUNLfSwKLSAgeyJzdWJzeXN0ZW0iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NVQlNZU1RFTX0sCi0gIHsic3VwcG9ydC1vbGQtY29kZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1VQUE9SVF9PTERfQ09ERX0sCi0jaWZkZWYgRExMX1NVUFBPUlQKLSAgLyogZ2V0b3B0IGFsbG93cyBhYmJyZXZpYXRpb25zLCBzbyB3ZSBkbyB0aGlzIHRvIHN0b3AgaXQgZnJvbSB0cmVhdGluZyAtbwotICAgICBhcyBhbiBhYmJyZXZpYXRpb24gZm9yIHRoaXMgb3B0aW9uICovCi0gIHsib3V0cHV0LWRlZiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fT1VUX0RFRn0sCi0gIHsib3V0cHV0LWRlZiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fT1VUX0RFRn0sCi0gIHsiZXhwb3J0LWFsbC1zeW1ib2xzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlRfQUxMfSwKLSAgeyJleGNsdWRlLXN5bWJvbHMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYQ0xVREVfU1lNQk9MU30sCi0gIHsia2lsbC1hdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fS0lMTF9BVFN9LAotICB7ImFkZC1zdGRjYWxsLWFsaWFzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVERDQUxMX0FMSUFTRVN9LAotICB7ImVuYWJsZS1zdGRjYWxsLWZpeHVwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTkFCTEVfU1REQ0FMTF9GSVhVUH0sCi0gIHsiZGlzYWJsZS1zdGRjYWxsLWZpeHVwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ESVNBQkxFX1NURENBTExfRklYVVB9LAotICB7Im91dC1pbXBsaWIiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNUExJQl9GSUxFTkFNRX0sCi0jZW5kaWYKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLQotCi0vKiBQRS9XSU4zMjsgYWRkZWQgcm91dGluZXMgdG8gZ2V0IHRoZSBzdWJzeXN0ZW0gdHlwZSwgaGVhcCBhbmQvb3Igc3RhY2sKLSAgIHBhcmFtZXRlcnMgd2hpY2ggbWF5IGJlIGlucHV0IGZyb20gdGhlIGNvbW1hbmQgbGluZSAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICB2b2lkICpwdHI7Ci0gIGludCBzaXplOwotICBpbnQgdmFsdWU7Ci0gIGNoYXIgKnN5bWJvbDsKLSAgaW50IGluaXRlZDsKLX0gZGVmaW5mbzsKLQotI2RlZmluZSBEKGZpZWxkLHN5bWJvbCxkZWYpICB7JnBlLmZpZWxkLHNpemVvZihwZS5maWVsZCksIGRlZiwgc3ltYm9sLDB9Ci0KLXN0YXRpYyBkZWZpbmZvIGluaXRbXSA9Ci17Ci0gIC8qIGltYWdlYmFzZSBtdXN0IGJlIGZpcnN0ICovCi0jZGVmaW5lIElNQUdFQkFTRU9GRiAwCi0gIEQoSW1hZ2VCYXNlLCJfX2ltYWdlX2Jhc2VfXyIsIE5UX0VYRV9JTUFHRV9CQVNFKSwKLSNkZWZpbmUgRExMT0ZGIDEKLSAgeyZkbGwsIHNpemVvZihkbGwpLCAwLCAiX19kbGxfXyJ9LAotICBEKFNlY3Rpb25BbGlnbm1lbnQsIl9fc2VjdGlvbl9hbGlnbm1lbnRfXyIsIFBFX0RFRl9TRUNUSU9OX0FMSUdOTUVOVCksCi0gIEQoRmlsZUFsaWdubWVudCwiX19maWxlX2FsaWdubWVudF9fIiwgUEVfREVGX0ZJTEVfQUxJR05NRU5UKSwKLSAgRChNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sIl9fbWFqb3Jfb3NfdmVyc2lvbl9fIiwgNCksCi0gIEQoTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uLCJfX21pbm9yX29zX3ZlcnNpb25fXyIsIDApLAotICBEKE1ham9ySW1hZ2VWZXJzaW9uLCJfX21ham9yX2ltYWdlX3ZlcnNpb25fXyIsIDEpLAotICBEKE1pbm9ySW1hZ2VWZXJzaW9uLCJfX21pbm9yX2ltYWdlX3ZlcnNpb25fXyIsIDApLAotICBEKE1ham9yU3Vic3lzdGVtVmVyc2lvbiwiX19tYWpvcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwgNCksCi0gIEQoTWlub3JTdWJzeXN0ZW1WZXJzaW9uLCJfX21pbm9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLCAwKSwKLSAgRChTdWJzeXN0ZW0sIl9fc3Vic3lzdGVtX18iLCBQRV9ERUZfU1VCU1lTVEVNKSwKLSAgRChTaXplT2ZTdGFja1Jlc2VydmUsIl9fc2l6ZV9vZl9zdGFja19yZXNlcnZlX18iLCAweDIwMDAwMDApLAotICBEKFNpemVPZlN0YWNrQ29tbWl0LCJfX3NpemVfb2Zfc3RhY2tfY29tbWl0X18iLCAweDEwMDApLAotICBEKFNpemVPZkhlYXBSZXNlcnZlLCJfX3NpemVfb2ZfaGVhcF9yZXNlcnZlX18iLCAweDEwMDAwMCksCi0gIEQoU2l6ZU9mSGVhcENvbW1pdCwiX19zaXplX29mX2hlYXBfY29tbWl0X18iLCAweDEwMDApLAotICBEKExvYWRlckZsYWdzLCJfX2xvYWRlcl9mbGFnc19fIiwgMHgwKSwKLSAgeyBOVUxMLCAwLCAwLCBOVUxMLCAwIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWJhc2VfZmlsZSA8YmFzZWZpbGU+ICAgICAgICAgICAgIEdlbmVyYXRlIGEgYmFzZSBmaWxlIGZvciByZWxvY2F0YWJsZSBETExzXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1kbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgaW1hZ2UgYmFzZSB0byB0aGUgZGVmYXVsdCBmb3IgRExMc1xuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tZmlsZS1hbGlnbm1lbnQgPHNpemU+ICAgICAgICAgICAgU2V0IGZpbGUgYWxpZ25tZW50XG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1oZWFwIDxzaXplPiAgICAgICAgICAgICAgICAgICAgICBTZXQgaW5pdGlhbCBzaXplIG9mIHRoZSBoZWFwXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1pbWFnZS1iYXNlIDxhZGRyZXNzPiAgICAgICAgICAgICBTZXQgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZXhlY3V0YWJsZVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tbWFqb3ItaW1hZ2UtdmVyc2lvbiA8bnVtYmVyPiAgICAgU2V0IHZlcnNpb24gbnVtYmVyIG9mIHRoZSBleGVjdXRhYmxlXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1tYWpvci1vcy12ZXJzaW9uIDxudW1iZXI+ICAgICAgICBTZXQgbWluaW11bSByZXF1aXJlZCBPUyB2ZXJzaW9uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1tYWpvci1zdWJzeXN0ZW0tdmVyc2lvbiA8bnVtYmVyPiBTZXQgbWluaW11bSByZXF1aXJlZCBPUyBzdWJzeXN0ZW0gdmVyc2lvblxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tbWlub3ItaW1hZ2UtdmVyc2lvbiA8bnVtYmVyPiAgICAgU2V0IHJldmlzaW9uIG51bWJlciBvZiB0aGUgZXhlY3V0YWJsZVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tbWlub3Itb3MtdmVyc2lvbiA8bnVtYmVyPiAgICAgICAgU2V0IG1pbmltdW0gcmVxdWlyZWQgT1MgcmV2aXNpb25cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLW1pbm9yLXN1YnN5c3RlbS12ZXJzaW9uIDxudW1iZXI+IFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHN1YnN5c3RlbSByZXZpc2lvblxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tc2VjdGlvbi1hbGlnbm1lbnQgPHNpemU+ICAgICAgICAgU2V0IHNlY3Rpb24gYWxpZ25tZW50XG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1zdGFjayA8c2l6ZT4gICAgICAgICAgICAgICAgICAgICBTZXQgc2l6ZSBvZiB0aGUgaW5pdGlhbCBzdGFja1xuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tc3Vic3lzdGVtIDxuYW1lPls6PHZlcnNpb24+XSAgICAgU2V0IHJlcXVpcmVkIE9TIHN1YnN5c3RlbSBbJiB2ZXJzaW9uXVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tc3VwcG9ydC1vbGQtY29kZSAgICAgICAgICAgICAgICAgU3VwcG9ydCBpbnRlcndvcmtpbmcgd2l0aCBvbGQgY29kZVxuIikpOwotI2lmZGVmIERMTF9TVVBQT1JUCi0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1hZGQtc3RkY2FsbC1hbGlhcyAgICAgICAgICAgICAgICBFeHBvcnQgc3ltYm9scyB3aXRoIGFuZCB3aXRob3V0IEBublxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwICAgICAgICAgICAgRG9uJ3QgbGluayBfc3ltIHRvIF9zeW1Abm5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwICAgICAgICAgICAgIExpbmsgX3N5bSB0byBfc3ltQG5uIHdpdGhvdXQgd2FybmluZ3NcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWV4Y2x1ZGUtc3ltYm9scyBzeW0sc3ltLC4uLiAgICAgIEV4Y2x1ZGUgc3ltYm9scyBmcm9tIGF1dG9tYXRpYyBleHBvcnRcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWV4cG9ydC1hbGwtc3ltYm9scyAgICAgICAgICAgICAgIEF1dG9tYXRpY2FsbHkgZXhwb3J0IGFsbCBnbG9iYWxzIHRvIERMTFxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0ta2lsbC1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIEBubiBmcm9tIGV4cG9ydGVkIHN5bWJvbHNcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLW91dC1pbXBsaWIgPGZpbGU+ICAgICAgICAgICAgICAgIEdlbmVyYXRlIGltcG9ydCBsaWJyYXJ5XG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1vdXRwdXQtZGVmIDxmaWxlPiAgICAgICAgICAgICAgICBHZW5lcmF0ZSBhIC5ERUYgZmlsZSBmb3IgdGhlIGJ1aWx0IERMTFxuIikpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfcGVfbmFtZSAobmFtZSwgdmFsKQotICAgICBjaGFyICpuYW1lOwotICAgICBsb25nIHZhbDsKLXsKLSAgaW50IGk7Ci0gIC8qIEZpbmQgdGhlIG5hbWUgYW5kIHNldCBpdC4gKi8KLSAgZm9yIChpID0gMDsgaW5pdFtpXS5wdHI7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCBpbml0W2ldLnN5bWJvbCkgPT0gMCkKLQl7Ci0JICBpbml0W2ldLnZhbHVlID0gdmFsOwotCSAgaW5pdFtpXS5pbml0ZWQgPSAxOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGFib3J0KCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNldF9wZV9zdWJzeXN0ZW0gKCkKLXsKLSAgY29uc3QgY2hhciAqc3ZlcjsKLSAgaW50IGxlbjsKLSAgaW50IGk7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGNvbnN0IGludCB2YWx1ZTsKLSAgICAgIGNvbnN0IGNoYXIgKmVudHJ5OwotICAgIH0KLSAgdltdID0KLSAgICB7Ci0gICAgICB7ICJuYXRpdmUiLCAxLCAiX050UHJvY2Vzc1N0YXJ0dXAiIH0sCi0gICAgICB7ICJ3aW5kb3dzIiwgMiwgIl9XaW5NYWluQ1JUU3RhcnR1cCIgfSwKLSAgICAgIHsgImNvbnNvbGUiLCAzLCAiX21haW5DUlRTdGFydHVwIiB9LAotI2lmIDAKLSAgICAgIC8qIFRoZSBNaWNyb3NvZnQgbGlua2VyIGRvZXMgbm90IHJlY29nbml6ZSB0aGlzLiAgKi8KLSAgICAgIHsgIm9zMiIsIDUsICIiIH0sCi0jZW5kaWYKLSAgICAgIHsgInBvc2l4IiwgNywgIl9fX1Bvc2l4UHJvY2Vzc1N0YXJ0dXAifSwKLSAgICAgIHsgMCwgMCwgMCB9Ci0gICAgfTsKLQotICBzdmVyID0gc3RyY2hyIChvcHRhcmcsICc6Jyk7Ci0gIGlmIChzdmVyID09IE5VTEwpCi0gICAgbGVuID0gc3RybGVuIChvcHRhcmcpOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqZW5kOwotCi0gICAgICBsZW4gPSBzdmVyIC0gb3B0YXJnOwotICAgICAgc2V0X3BlX25hbWUgKCJfX21ham9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLAotCQkgICBzdHJ0b3VsIChzdmVyICsgMSwgJmVuZCwgMCkpOwotICAgICAgaWYgKCplbmQgPT0gJy4nKQotCXNldF9wZV9uYW1lICgiX19taW5vcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwKLQkJICAgICBzdHJ0b3VsIChlbmQgKyAxLCAmZW5kLCAwKSk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvIChfKCIlUDogd2FybmluZzogYmFkIHZlcnNpb24gbnVtYmVyIGluIC1zdWJzeXN0ZW0gb3B0aW9uXG4iKSk7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IHZbaV0ubmFtZTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChvcHRhcmcsIHZbaV0ubmFtZSwgbGVuKSA9PSAwCi0JICAmJiB2W2ldLm5hbWVbbGVuXSA9PSAnXDAnKQotCXsKLQkgIHNldF9wZV9uYW1lICgiX19zdWJzeXN0ZW1fXyIsIHZbaV0udmFsdWUpOwotCi0JICBsYW5nX2FkZF9lbnRyeSAodltpXS5lbnRyeSwgMSk7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICAKLSAgZWluZm8gKF8oIiVQJUY6IGludmFsaWQgc3Vic3lzdGVtIHR5cGUgJXNcbiIpLCBvcHRhcmcpOwotfQotCi0KLQotc3RhdGljIHZvaWQKLXNldF9wZV92YWx1ZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgCi17Ci0gIGNoYXIgKmVuZDsKLSAgCi0gIHNldF9wZV9uYW1lIChuYW1lLCAgc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKSk7Ci0gIAotICBpZiAoZW5kID09IG9wdGFyZykKLSAgICBlaW5mbyAoXygiJVAlRjogaW52YWxpZCBoZXggbnVtYmVyIGZvciBQRSBwYXJhbWV0ZXIgJyVzJ1xuIiksIG9wdGFyZyk7Ci0KLSAgb3B0YXJnID0gZW5kOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X3BlX3N0YWNrX2hlYXAgKHJlc25hbWUsIGNvbW5hbWUpCi0gICAgIGNoYXIgKnJlc25hbWU7Ci0gICAgIGNoYXIgKmNvbW5hbWU7Ci17Ci0gIHNldF9wZV92YWx1ZSAocmVzbmFtZSk7Ci0gIAotICBpZiAoKm9wdGFyZyA9PSAnLCcpCi0gICAgewotICAgICAgb3B0YXJnKys7Ci0gICAgICBzZXRfcGVfdmFsdWUgKGNvbW5hbWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKm9wdGFyZykKLSAgICBlaW5mbyAoXygiJVAlRjogc3RyYW5nZSBoZXggaW5mbyBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIpLCBvcHRhcmcpOwotfQotCi0KLQotc3RhdGljIGludAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgbG9uZ2luZDsKLSAgaW50IG9wdGM7Ci0gIGludCBwcmV2b3B0aW5kID0gb3B0aW5kOwotICBpbnQgcHJldm9wdGVyciA9IG9wdGVycjsKLSAgaW50IHdhbnRlcnJvcjsKLSAgc3RhdGljIGludCBsYXN0b3B0aW5kID0gLTE7Ci0KLSAgaWYgKGxhc3RvcHRpbmQgIT0gb3B0aW5kKQotICAgIG9wdGVyciA9IDA7Ci0gIHdhbnRlcnJvciA9IG9wdGVycjsKLQotICBsYXN0b3B0aW5kID0gb3B0aW5kOwotCi0gIG9wdGMgPSBnZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCAiLSIsIGxvbmdvcHRzLCAmbG9uZ2luZCk7Ci0gIG9wdGVyciA9IHByZXZvcHRlcnI7Ci0KLSAgc3dpdGNoIChvcHRjKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHdhbnRlcnJvcikKLQl4ZXhpdCAoMSk7Ci0gICAgICBvcHRpbmQgPSAgcHJldm9wdGluZDsKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBPUFRJT05fQkFTRV9GSUxFOgotICAgICAgbGlua19pbmZvLmJhc2VfZmlsZSA9IChQVFIpIGZvcGVuIChvcHRhcmcsIEZPUEVOX1dCKTsKLSAgICAgIGlmIChsaW5rX2luZm8uYmFzZV9maWxlID09IE5VTEwpCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IENhbid0IG9wZW4gYmFzZSBmaWxlICVzXG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLCBvcHRhcmcpOwotCSAgeGV4aXQgKDEpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBQRSBvcHRpb25zICovCi0gICAgY2FzZSBPUFRJT05fSEVBUDogCi0gICAgICBzZXRfcGVfc3RhY2tfaGVhcCAoIl9fc2l6ZV9vZl9oZWFwX3Jlc2VydmVfXyIsICJfX3NpemVfb2ZfaGVhcF9jb21taXRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1RBQ0s6IAotICAgICAgc2V0X3BlX3N0YWNrX2hlYXAgKCJfX3NpemVfb2Zfc3RhY2tfcmVzZXJ2ZV9fIiwgIl9fc2l6ZV9vZl9zdGFja19jb21taXRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1VCU1lTVEVNOgotICAgICAgc2V0X3BlX3N1YnN5c3RlbSAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01BSk9SX09TX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX29zX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfT1NfVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWlub3Jfb3NfdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWFqb3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21pbm9yX3N1YnN5c3RlbV92ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX2ltYWdlX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWlub3JfaW1hZ2VfdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9GSUxFX0FMSUdOTUVOVDoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fZmlsZV9hbGlnbm1lbnRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU0VDVElPTl9BTElHTk1FTlQ6Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX3NlY3Rpb25fYWxpZ25tZW50X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0RMTDoKLSAgICAgIHNldF9wZV9uYW1lICgiX19kbGxfXyIsIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fSU1BR0VfQkFTRToKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9faW1hZ2VfYmFzZV9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9TVVBQT1JUX09MRF9DT0RFOgotICAgICAgc3VwcG9ydF9vbGRfY29kZSA9IDE7Ci0gICAgICBicmVhazsKLSNpZmRlZiBETExfU1VQUE9SVAotICAgIGNhc2UgT1BUSU9OX09VVF9ERUY6Ci0gICAgICBwZV9vdXRfZGVmX2ZpbGVuYW1lID0geHN0cmR1cCAob3B0YXJnKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0VYUE9SVF9BTEw6Ci0gICAgICBwZV9kbGxfZXhwb3J0X2V2ZXJ5dGhpbmcgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fRVhDTFVERV9TWU1CT0xTOgotICAgICAgcGVfZGxsX2FkZF9leGNsdWRlcyAob3B0YXJnKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0tJTExfQVRTOgotICAgICAgcGVfZGxsX2tpbGxfYXRzID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NURENBTExfQUxJQVNFUzoKLSAgICAgIHBlX2RsbF9zdGRjYWxsX2FsaWFzZXMgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fRU5BQkxFX1NURENBTExfRklYVVA6Ci0gICAgICBwZV9lbmFibGVfc3RkY2FsbF9maXh1cCA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9ESVNBQkxFX1NURENBTExfRklYVVA6Ci0gICAgICBwZV9lbmFibGVfc3RkY2FsbF9maXh1cCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9JTVBMSUJfRklMRU5BTUU6Ci0gICAgICBwZV9pbXBsaWJfZmlsZW5hbWUgPSB4c3RyZHVwIChvcHRhcmcpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICB9Ci0gIHJldHVybiAxOwotfQotDAotLyogQXNzaWduIHZhbHVlcyB0byB0aGUgc3BlY2lhbCBzeW1ib2xzIGJlZm9yZSB0aGUgbGlua2VyIHNjcmlwdCBpcwotICAgcmVhZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMgKCkKLXsKLSAgLyogUnVuIHRocm91Z2ggYW5kIGludmVudCBzeW1ib2xzIGZvciBhbGwgdGhlCi0gICAgIG5hbWVzIGFuZCBpbnNlcnQgdGhlIGRlZmF1bHRzLiAqLwotICBpbnQgajsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpzYXZlOwotCi0gIGlmICghaW5pdFtJTUFHRUJBU0VPRkZdLmluaXRlZCkKLSAgICB7Ci0gICAgICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQlpbml0W0lNQUdFQkFTRU9GRl0udmFsdWUgPSAwOwotICAgICAgZWxzZSBpZiAoaW5pdFtETExPRkZdLnZhbHVlIHx8IGxpbmtfaW5mby5zaGFyZWQpCi0JaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gTlRfRExMX0lNQUdFX0JBU0U7Ci0gICAgICBlbHNlCi0JaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gTlRfRVhFX0lNQUdFX0JBU0U7Ci0gICAgfQotCi0gIC8qIERvbid0IGRvIGFueSBzeW1ib2wgYXNzaWdubWVudHMgaWYgdGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgKi8KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuOwotCi0gIC8qIEdsdWUgdGhlIGFzc2lnbm1lbnRzIGludG8gdGhlIGFicyBzZWN0aW9uICovCi0gIHNhdmUgPSBzdGF0X3B0cjsKLQotICBzdGF0X3B0ciA9ICYoYWJzX291dHB1dF9zZWN0aW9uLT5jaGlsZHJlbik7Ci0KLSAgZm9yIChqID0gMDsgaW5pdFtqXS5wdHI7IGorKykKLSAgICB7Ci0gICAgICBsb25nIHZhbCA9IGluaXRbal0udmFsdWU7Ci0gICAgICBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgKnJ2OwotICAgICAgcnYgPSBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9JyAsaW5pdFtqXS5zeW1ib2wsIGV4cF9pbnRvcCAodmFsKSkpOwotICAgICAgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2Yoc2hvcnQpKQotCSooc2hvcnQgKilpbml0W2pdLnB0ciA9IHZhbDsKLSAgICAgIGVsc2UgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2YoaW50KSkKLQkqKGludCAqKWluaXRbal0ucHRyID0gdmFsOwotICAgICAgZWxzZSBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihsb25nKSkKLQkqKGxvbmcgKilpbml0W2pdLnB0ciA9IHZhbDsKLSAgICAgIC8qIFRoaXMgbWlnaHQgYmUgYSBsb25nIGxvbmcgb3Igb3RoZXIgc3BlY2lhbCB0eXBlLiAgKi8KLSAgICAgIGVsc2UgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2YoYmZkX3ZtYSkpCi0JKihiZmRfdm1hICopaW5pdFtqXS5wdHIgPSB2YWw7Ci0gICAgICBlbHNlCWFib3J0KCk7Ci0gICAgICBpZiAoaiA9PSBJTUFHRUJBU0VPRkYpCi0JaW1hZ2VfYmFzZV9zdGF0ZW1lbnQgPSBydjsKLSAgICB9Ci0gIC8qIFJlc3RvcmUgdGhlIHBvaW50ZXIuICovCi0gIHN0YXRfcHRyID0gc2F2ZTsKLSAgCi0gIGlmIChwZS5GaWxlQWxpZ25tZW50ID4KLSAgICAgIHBlLlNlY3Rpb25BbGlnbm1lbnQpCi0gICAgewotICAgICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nLCBmaWxlIGFsaWdubWVudCA+IHNlY3Rpb24gYWxpZ25tZW50LlxuIikpOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGxpbmtlciBzY3JpcHQgYW5kIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucwotICAgaGF2ZSBiZWVuIHJlYWQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX3BhcnNlICgpCi17Ci0gIC8qIFRoZSBXaW5kb3dzIGxpYnJhcmllcyBhcmUgZGVzaWduZWQgZm9yIHRoZSBsaW5rZXIgdG8gdHJlYXQgdGhlCi0gICAgIGVudHJ5IHBvaW50IGFzIGFuIHVuZGVmaW5lZCBzeW1ib2wuICBPdGhlcndpc2UsIHRoZSAub2JqIHRoYXQKLSAgICAgZGVmaW5lcyBtYWluQ1JUU3RhcnR1cCBpcyBicm91Z2h0IGluIGJlY2F1c2UgaXQgaXMgdGhlIGZpcnN0Ci0gICAgIGVuY291bnRlcmVkIGluIGxpYmMubGliIGFuZCBpdCBoYXMgb3RoZXIgc3ltYm9scyBpbiBpdCB3aGljaCB3aWxsCi0gICAgIGJlIHB1bGxlZCBpbiBieSB0aGUgbGluayBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgYWN0IGFzCi0gICAgIHRob3VnaCB0aGUgdXNlciBzcGVjaWZpZWQgLXUgd2l0aCB0aGUgZW50cnkgcG9pbnQgc3ltYm9sLgotCi0gICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBsaW5rZXIgc2NyaXB0IGFuZCBjb21tYW5kIGxpbmUKLSAgICAgb3B0aW9ucyBoYXZlIGJlZW4gcmVhZCwgc28gYXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZSByaWdodCBlbnRyeQotICAgICBwb2ludC4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSB0aGUgaW5wdXQgZmlsZXMgYXJlCi0gICAgIG9wZW5lZCwgc28gcmVnaXN0ZXJpbmcgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQgd2lsbCBtYWtlIGEKLSAgICAgZGlmZmVyZW5jZS4gICovCi0KLSAgaWYgKGVudHJ5X3N5bWJvbCkKLSAgICBsZGxhbmdfYWRkX3VuZGVmIChlbnRyeV9zeW1ib2wpOwotfQotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnBlX3VuZGVmX2ZvdW5kX3N5bTsKLQotc3RhdGljIGJvb2xlYW4KLXBlX3VuZGVmX2NkZWNsX21hdGNoIChoLCBzdHJpbmcpCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICBQVFIgc3RyaW5nOwotewotICBpbnQgc2wgPSBzdHJsZW4gKHN0cmluZyk7Ci0gIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgc3RybmNtcCAoaC0+cm9vdC5zdHJpbmcsIHN0cmluZywgc2wpID09IDAKLSAgICAgICYmIGgtPnJvb3Quc3RyaW5nW3NsXSA9PSAnQCcpCi0gIHsKLSAgICBwZV91bmRlZl9mb3VuZF9zeW0gPSBoOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLXBlX2ZpeHVwX3N0ZGNhbGxzICgpCi17Ci0gIHN0YXRpYyBpbnQgZ2F2ZV93YXJuaW5nX21lc3NhZ2UgPSAwOwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqdW5kZWYsICpzeW07Ci0gIGNoYXIgKmF0OwotICBmb3IgKHVuZGVmID0gbGlua19pbmZvLmhhc2gtPnVuZGVmczsgdW5kZWY7IHVuZGVmPXVuZGVmLT5uZXh0KQotICAgIGlmICh1bmRlZi0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLSAgICB7Ci0gICAgICBhdCA9IHN0cmNociAodW5kZWYtPnJvb3Quc3RyaW5nLCAnQCcpOwotICAgICAgaWYgKGF0KQotICAgICAgewotCS8qIFRoZSBzeW1ib2wgaXMgYSBzdGRjYWxsIHN5bWJvbCwgc28gbGV0J3MgbG9vayBmb3IgYSBjZGVjbAotCSAgIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHJlc29sdmUgdG8gdGhhdCAqLwotCWNoYXIgKmNuYW1lID0geHN0cmR1cCAodW5kZWYtPnJvb3Quc3RyaW5nKTsKLQlhdCA9IHN0cmNociAoY25hbWUsICdAJyk7Ci0JKmF0ID0gMDsKLQlzeW0gPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGNuYW1lLCAwLCAwLCAxKTsKLQlpZiAoc3ltICYmIHN5bS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JewotCSAgdW5kZWYtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JICB1bmRlZi0+dS5kZWYudmFsdWUgPSBzeW0tPnUuZGVmLnZhbHVlOwotCSAgdW5kZWYtPnUuZGVmLnNlY3Rpb24gPSBzeW0tPnUuZGVmLnNlY3Rpb247Ci0JICBpZiAocGVfZW5hYmxlX3N0ZGNhbGxfZml4dXAgPT0gLTEpCi0JICAgIHsKLQkgICAgICBlaW5mbyAoXygiV2FybmluZzogcmVzb2x2aW5nICVzIGJ5IGxpbmtpbmcgdG8gJXNcbiIpLAotCQkgICAgIHVuZGVmLT5yb290LnN0cmluZywgY25hbWUpOwotCSAgICAgIGlmICghIGdhdmVfd2FybmluZ19tZXNzYWdlKQotCQl7Ci0JCSAgZ2F2ZV93YXJuaW5nX21lc3NhZ2UgPSAxOwotCQkgIGVpbmZvKF8oIlVzZSAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwIHRvIGRpc2FibGUgdGhlc2Ugd2FybmluZ3NcbiIpKTsKLQkJICBlaW5mbyhfKCJVc2UgLS1kaXNhYmxlLXN0ZGNhbGwtZml4dXAgdG8gZGlzYWJsZSB0aGVzZSBmaXh1cHNcbiIpKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotCS8qIFRoZSBzeW1ib2wgaXMgYSBjZGVjbCBzeW1ib2wsIHNvIHdlIGxvb2sgZm9yIHN0ZGNhbGwKLQkgICBzeW1ib2xzIC0gd2hpY2ggbWVhbnMgc2Nhbm5pbmcgdGhlIHdob2xlIHN5bWJvbCB0YWJsZSAqLwotCXBlX3VuZGVmX2ZvdW5kX3N5bSA9IDA7Ci0JYmZkX2xpbmtfaGFzaF90cmF2ZXJzZSAobGlua19pbmZvLmhhc2gsIHBlX3VuZGVmX2NkZWNsX21hdGNoLAotCQkJCShQVFIpIHVuZGVmLT5yb290LnN0cmluZyk7Ci0Jc3ltID0gcGVfdW5kZWZfZm91bmRfc3ltOwotCWlmIChzeW0pCi0JewotCSAgdW5kZWYtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JICB1bmRlZi0+dS5kZWYudmFsdWUgPSBzeW0tPnUuZGVmLnZhbHVlOwotCSAgdW5kZWYtPnUuZGVmLnNlY3Rpb24gPSBzeW0tPnUuZGVmLnNlY3Rpb247Ci0JICBpZiAocGVfZW5hYmxlX3N0ZGNhbGxfZml4dXAgPT0gLTEpCi0JICAgIHsKLQkgICAgICBlaW5mbyAoXygiV2FybmluZzogcmVzb2x2aW5nICVzIGJ5IGxpbmtpbmcgdG8gJXNcbiIpLAotCQkgICAgIHVuZGVmLT5yb290LnN0cmluZywgc3ltLT5yb290LnN0cmluZyk7Ci0JICAgICAgaWYgKCEgZ2F2ZV93YXJuaW5nX21lc3NhZ2UpCi0JCXsKLQkJICBnYXZlX3dhcm5pbmdfbWVzc2FnZSA9IDE7Ci0JCSAgZWluZm8oXygiVXNlIC0tZW5hYmxlLXN0ZGNhbGwtZml4dXAgdG8gZGlzYWJsZSB0aGVzZSB3YXJuaW5nc1xuIikpOwotCQkgIGVpbmZvKF8oIlVzZSAtLWRpc2FibGUtc3RkY2FsbC1maXh1cCB0byBkaXNhYmxlIHRoZXNlIGZpeHVwc1xuIikpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLSAgLyogUGFzcyB0aGUgd2Fja3kgUEUgY29tbWFuZCBsaW5lIG9wdGlvbnMgaW50byB0aGUgb3V0cHV0IGJmZC4KLSAgICAgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGRvbmUgdmlhIGEgZnVuY3Rpb24sIHJhdGhlciB0aGFuIGJ5Ci0gICAgIGluY2x1ZGluZyBhbiBpbnRlcm5hbCBCRkQgaGVhZGVyLiAgKi8KLSAgCi0gIGlmICghY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+cGUpCi0gICAgZWluZm8gKF8oIiVGJVA6IFBFIG9wZXJhdGlvbnMgb24gbm9uIFBFIGZpbGUuXG4iKSk7Ci0KLSAgcGVfZGF0YSAob3V0cHV0X2JmZCktPnBlX29wdGhkciA9IHBlOwotICBwZV9kYXRhIChvdXRwdXRfYmZkKS0+ZGxsID0gaW5pdFtETExPRkZdLnZhbHVlOwotCi0jaWZkZWYgRExMX1NVUFBPUlQKLSAgaWYgKHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwKSAvKiAtMT13YXJuIG9yIDE9ZGlzYWJsZSAqLwotICAgIHBlX2ZpeHVwX3N0ZGNhbGxzICgpOwotCi0gIHBlX3Byb2Nlc3NfaW1wb3J0X2RlZnMob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0gIGlmIChsaW5rX2luZm8uc2hhcmVkKQotICAgIHBlX2RsbF9idWlsZF9zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoVEFSR0VUX0lTX2FybXBlKSB8fCBkZWZpbmVkKFRBUkdFVF9JU19hcm1fZXBvY19wZSkKLSAgewotICAgIC8qIEZpbmQgYSBCRkQgdGhhdCBjYW4gaG9sZCB0aGUgaW50ZXJ3b3JraW5nIHN0dWJzLiAgKi8KLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKGJmZF9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8pKQotCSAgYnJlYWs7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIHsKLSAgICBzdGF0aWMgaW50IHNlcXVlbmNlID0gMDsKLSAgICBpbnQgaXNfbXNfYXJjaDsKLSAgICBiZmQgKmN1cl9hcmNoID0gMCwgKmVsdDsKLSAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppczI7Ci0gICAgLyogQ2FyZWZ1bCAtIHRoaXMgaXMgYSBzaGVsbCBzY3JpcHQuICBXYXRjaCB0aG9zZSBkb2xsYXIgc2lnbnMhICovCi0gICAgLyogTWljcm9zb2Z0IGltcG9ydCBsaWJyYXJpZXMgaGF2ZSBldmVyeSBtZW1iZXIgbmFtZWQgdGhlIHNhbWUsCi0gICAgICAgYW5kIG5vdCBpbiB0aGUgcmlnaHQgb3JkZXIgZm9yIHVzIHRvIGxpbmsgdGhlbSBjb3JyZWN0bHkuICBXZQotICAgICAgIG11c3QgZGV0ZWN0IHRoZXNlIGFuZCByZW5hbWUgdGhlIG1lbWJlcnMgc28gdGhhdCB0aGV5J2xsIGxpbmsKLSAgICAgICBjb3JyZWN0bHkuICBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2Ygb2JqZWN0czogdGhlIGhlYWQsIHRoZQotICAgICAgIHRodW5rcywgYW5kIHRoZSBzZW50aW5lbChzKS4gIFRoZSBoZWFkIGlzIGVhc3k7IGl0J3MgdGhlIG9uZQotICAgICAgIHdpdGggaWRhdGEyLiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNlbnRpbmVscyB3b24ndCBoYXZlIHJlbG9jcywKLSAgICAgICBhbmQgdGhlIHRodW5rcyB3aWxsLiAgSXQncyBlYXNpZXIgdGhhbiBjaGVja2luZyB0aGUgc3ltYm9sCi0gICAgICAgdGFibGUgZm9yIGV4dGVybmFsIHJlZmVyZW5jZXMuICovCi0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmIChpcy0+dGhlX2JmZC0+bXlfYXJjaGl2ZSkKLQkgIHsKLQkgICAgYmZkICphcmNoID0gaXMtPnRoZV9iZmQtPm15X2FyY2hpdmU7Ci0JICAgIGlmIChjdXJfYXJjaCAhPSBhcmNoKQotCSAgICAgIHsKLQkJY3VyX2FyY2ggPSBhcmNoOwotCQlpc19tc19hcmNoID0gMTsKLQkJZm9yIChpczIgPSBpczsKLQkJICAgICBpczIgJiYgaXMyLT50aGVfYmZkLT5teV9hcmNoaXZlID09IGFyY2g7Ci0JCSAgICAgaXMyID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKilpczItPm5leHQpCi0JCSAgewotCQkgICAgaWYgKHN0cmNtcCAoaXMtPnRoZV9iZmQtPmZpbGVuYW1lLCBpczItPnRoZV9iZmQtPmZpbGVuYW1lKSkKLQkJICAgICAgaXNfbXNfYXJjaCA9IDA7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBpZiAoaXNfbXNfYXJjaCkKLQkgICAgICB7Ci0JCWludCBpZGF0YTIgPSAwLCBpLCByZWxvY19jb3VudD0wOwotCQlhc2VjdGlvbiAqc2VjOwotCQljaGFyICpuZXdfbmFtZSwgc2VxOwotCQlmb3IgKHNlYyA9IGlzLT50aGVfYmZkLT5zZWN0aW9uczsgc2VjOyBzZWMgPSBzZWMtPm5leHQpCi0JCSAgewotCQkgICAgaWYgKHN0cmNtcCAoc2VjLT5uYW1lLCAiLmlkYXRhXCQyIikgPT0gMCkKLQkJICAgICAgaWRhdGEyID0gMTsKLQkJICAgIHJlbG9jX2NvdW50ICs9IHNlYy0+cmVsb2NfY291bnQ7Ci0JCSAgfQotCi0JCWlmIChpZGF0YTIpIC8qIC5pZGF0YTIgaXMgdGhlIFRPQyAqLwotCQkgIHNlcSA9ICdhJzsKLQkJZWxzZSBpZiAocmVsb2NfY291bnQgPiAwKSAvKiB0aHVua3MgKi8KLQkJICBzZXEgPSAnYic7Ci0JCWVsc2UgLyogc2VudGluZWwgKi8KLQkJICBzZXEgPSAnYyc7Ci0KLQkJbmV3X25hbWUgPSBiZmRfYWxsb2MgKGlzLT50aGVfYmZkLAotCQkJCSAgICAgIHN0cmxlbiAoaXMtPnRoZV9iZmQtPmZpbGVuYW1lKSsyKTsKLQkJc3ByaW50ZiAobmV3X25hbWUsICIlcy4lYyIsIGlzLT50aGVfYmZkLT5maWxlbmFtZSwgc2VxKTsKLQkJaXMtPnRoZV9iZmQtPmZpbGVuYW1lID0gbmV3X25hbWU7Ci0KLQkJbmV3X25hbWUgPSBiZmRfYWxsb2MoaXMtPnRoZV9iZmQsIHN0cmxlbihpcy0+ZmlsZW5hbWUpKzIpOwotCQlzcHJpbnRmIChuZXdfbmFtZSwgIiVzLiVjIiwgaXMtPmZpbGVuYW1lLCBzZXEpOwotCQlpcy0+ZmlsZW5hbWUgPSBuZXdfbmFtZTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gIH0KLX0KLQwKLXN0YXRpYyB2b2lkICAKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbigpCi17Ci0jaWZkZWYgVEFSR0VUX0lTX3BwY3BlCi0gIC8qIEhlcmUgd2UgcnVtbWFnZSB0aHJvdWdoIHRoZSBmb3VuZCBiZmRzIHRvIGNvbGxlY3QgdG9jIGluZm9ybWF0aW9uICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCFwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoaXMtPnRoZV9iZmQsICZsaW5rX2luZm8pKQotCSAgewotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICBlaW5mbyAoXygiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlc1xuIiksIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiAoJmxpbmtfaW5mbyk7Ci0jZW5kaWYgLyogVEFSR0VUX0lTX3BwY3BlICovCi0KLSNpZiBkZWZpbmVkKFRBUkdFVF9JU19hcm1wZSkgfHwgZGVmaW5lZChUQVJHRVRfSVNfYXJtX2Vwb2NfcGUpCi0gIC8qIEZJWE1FOiB3ZSBzaG91bGQgYmUgYWJsZSB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGludGVyd29ya2luZyBzdHViCi0gICAgIHNlY3Rpb24uCi0KLSAgICAgSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCBnbHVlCi0gICAgIGluZm9ybWF0aW9uLiAgRklYTUU6IHNob3VsZCB0aGlzIGJlIGJhc2VkIG9uIGEgY29tbWFuZCBsaW5lCi0gICAgIG9wdGlvbj8gIGtya0BjeWdudXMuY29tICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCEgYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0JICAgIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8sIHN1cHBvcnRfb2xkX2NvZGUpKQotCSAgewotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICBlaW5mbyAoXygiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlcyBmb3IgaW50ZXJ3b3JraW5nIiksCi0JCSAgIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zICgmIGxpbmtfaW5mbyk7Ci0jZW5kaWYgLyogVEFSR0VUX0lTX2FybXBlICovCi19Ci0MCi0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gaW5wdXQgZmlsZSBpc24ndCByZWNvZ25pemVkIGFzIGEgQkZELiAgV2UKLSAgIGNoZWNrIGhlcmUgZm9yIC5ERUYgZmlsZXMgYW5kIHB1bGwgdGhlbSBpbiBhdXRvbWF0aWNhbGx5LiAqLwotCi1zdGF0aWMgaW50Ci1zYXdfb3B0aW9uKGNoYXIgKm9wdGlvbikKLXsKLSAgaW50IGk7Ci0gIGZvciAoaT0wOyBpbml0W2ldLnB0cjsgaSsrKQotICAgIGlmIChzdHJjbXAgKGluaXRbaV0uc3ltYm9sLCBvcHRpb24pID09IDApCi0gICAgICByZXR1cm4gaW5pdFtpXS5pbml0ZWQ7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3VucmVjb2duaXplZF9maWxlKGVudHJ5KQotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSNpZmRlZiBETExfU1VQUE9SVAotICBjb25zdCBjaGFyICpleHQgPSBlbnRyeS0+ZmlsZW5hbWUgKyBzdHJsZW4gKGVudHJ5LT5maWxlbmFtZSkgLSA0OwotCi0gIGlmIChzdHJjbXAgKGV4dCwgIi5kZWYiKSA9PSAwIHx8IHN0cmNtcCAoZXh0LCAiLkRFRiIpID09IDApCi0gIHsKLSAgICBpZiAocGVfZGVmX2ZpbGUgPT0gMCkKLSAgICAgIHBlX2RlZl9maWxlID0gZGVmX2ZpbGVfZW1wdHkgKCk7Ci0gICAgZGVmX2ZpbGVfcGFyc2UgKGVudHJ5LT5maWxlbmFtZSwgcGVfZGVmX2ZpbGUpOwotICAgIGlmIChwZV9kZWZfZmlsZSkKLSAgICB7Ci0gICAgICBpbnQgaSwgYnVmbGVuPTAsIGxlbjsKLSAgICAgIGNoYXIgKmJ1ZjsKLSAgICAgIGZvciAoaT0wOyBpPHBlX2RlZl9maWxlLT5udW1fZXhwb3J0czsgaSsrKQotCXsKLQkgIGxlbiA9IHN0cmxlbihwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQkgIGlmIChidWZsZW4gPCBsZW4rMikKLQkgICAgYnVmbGVuID0gbGVuKzI7Ci0JfQotICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoYnVmbGVuKTsKLSAgICAgIGZvciAoaT0wOyBpPHBlX2RlZl9maWxlLT5udW1fZXhwb3J0czsgaSsrKQotCXsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCSAgc3ByaW50ZihidWYsICJfJXMiLCBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgYnVmLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkgIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotCSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JICAgIHsKLQkgICAgICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICAgICAgaC0+dS51bmRlZi5hYmZkID0gTlVMTDsKLQkgICAgICBiZmRfbGlua19hZGRfdW5kZWYgKGxpbmtfaW5mby5oYXNoLCBoKTsKLQkgICAgfQotCX0KLSAgICAgIGZyZWUgKGJ1Zik7Ci0KLSAgICAgIC8qIGRlZl9maWxlX3ByaW50IChzdGRvdXQsIHBlX2RlZl9maWxlKTsgKi8KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+aXNfZGxsID09IDEpCi0JbGlua19pbmZvLnNoYXJlZCA9IDE7Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+YmFzZV9hZGRyZXNzICE9IChiZmRfdm1hKSgtMSkpCi0gICAgICB7Ci0JcGUuSW1hZ2VCYXNlID0KLQlwZV9kYXRhIChvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZSA9Ci0JaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gcGVfZGVmX2ZpbGUtPmJhc2VfYWRkcmVzczsKLQlpbml0W0lNQUdFQkFTRU9GRl0uaW5pdGVkID0gMTsKLQlpZiAoaW1hZ2VfYmFzZV9zdGF0ZW1lbnQpCi0JICBpbWFnZV9iYXNlX3N0YXRlbWVudC0+ZXhwID0KLQkgICAgZXhwX2Fzc29wICgnPScsICJfX2ltYWdlX2Jhc2VfXyIsIGV4cF9pbnRvcCAocGUuSW1hZ2VCYXNlKSk7Ci0gICAgICB9Ci0KLSNpZiAwCi0gICAgICAvKiBOb3Qgc3VyZSBpZiB0aGVzZSAqc2hvdWxkKiBiZSBzZXQgKi8KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvciAhPSAtMSkKLSAgICAgIHsKLQlwZS5NYWpvckltYWdlVmVyc2lvbiA9IHBlX2RlZl9maWxlLT52ZXJzaW9uX21ham9yOwotCXBlLk1pbm9ySW1hZ2VWZXJzaW9uID0gcGVfZGVmX2ZpbGUtPnZlcnNpb25fbWlub3I7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c3RhY2tfcmVzZXJ2ZSAhPSAtMQotCSAgJiYgISBzYXdfb3B0aW9uICgiX19zaXplX29mX3N0YWNrX3Jlc2VydmVfXyIpKQotICAgICAgewotCXBlLlNpemVPZlN0YWNrUmVzZXJ2ZSA9IHBlX2RlZl9maWxlLT5zdGFja19yZXNlcnZlOwotCWlmIChwZV9kZWZfZmlsZS0+c3RhY2tfY29tbWl0ICE9IC0xKQotCSAgcGUuU2l6ZU9mU3RhY2tDb21taXQgPSBwZV9kZWZfZmlsZS0+c3RhY2tfY29tbWl0OwotICAgICAgfQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5oZWFwX3Jlc2VydmUgIT0gLTEKLQkgICYmICEgc2F3X29wdGlvbiAoIl9fc2l6ZV9vZl9oZWFwX3Jlc2VydmVfXyIpKQotICAgICAgewotCXBlLlNpemVPZkhlYXBSZXNlcnZlID0gcGVfZGVmX2ZpbGUtPmhlYXBfcmVzZXJ2ZTsKLQlpZiAocGVfZGVmX2ZpbGUtPmhlYXBfY29tbWl0ICE9IC0xKQotCSAgcGUuU2l6ZU9mSGVhcENvbW1pdCA9IHBlX2RlZl9maWxlLT5oZWFwX2NvbW1pdDsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLSAgCi19Ci0KLXN0YXRpYyBib29sZWFuCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fcmVjb2duaXplZF9maWxlKGVudHJ5KQotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSNpZmRlZiBETExfU1VQUE9SVAotI2lmZGVmIFRBUkdFVF9JU19pMzg2cGUKLSAgcGVfZGxsX2lkX3RhcmdldCAoInBlaS1pMzg2Iik7Ci0jZW5kaWYKLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChlbnRyeS0+dGhlX2JmZCkgPT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpleHQgPSBlbnRyeS0+ZmlsZW5hbWUgKyBzdHJsZW4gKGVudHJ5LT5maWxlbmFtZSkgLSA0OwotICAgICAgaWYgKHN0cmNtcCAoZXh0LCAiLmRsbCIpID09IDAgfHwgc3RyY21wIChleHQsICIuRExMIikgPT0gMCkKLQlyZXR1cm4gcGVfaW1wbGllZF9pbXBvcnRfZGxsIChlbnRyeS0+ZmlsZW5hbWUpOwotICAgIH0KLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fZmluaXNoICgpCi17Ci0jaWZkZWYgRExMX1NVUFBPUlQKLSAgaWYgKGxpbmtfaW5mby5zaGFyZWQpCi0gICAgewotICAgICAgcGVfZGxsX2ZpbGxfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOwotICAgICAgaWYgKHBlX2ltcGxpYl9maWxlbmFtZSkKLQlwZV9kbGxfZ2VuZXJhdGVfaW1wbGliIChwZV9kZWZfZmlsZSwgcGVfaW1wbGliX2ZpbGVuYW1lKTsKLSAgICB9Ci0gIGlmIChwZV9vdXRfZGVmX2ZpbGVuYW1lKQotICAgIHBlX2RsbF9nZW5lcmF0ZV9kZWZfZmlsZSAocGVfb3V0X2RlZl9maWxlbmFtZSk7Ci0jZW5kaWYKLX0KLQotDAotLyogUGxhY2UgYW4gb3JwaGFuIHNlY3Rpb24uCi0KLSAgIFdlIHVzZSB0aGlzIHRvIHB1dCBzZWN0aW9ucyBpbiBhIHJlYXNvbmFibGUgcGxhY2UgaW4gdGhlIGZpbGUsIGFuZAotICAgdG8gZW5zdXJlIHRoYXQgdGhleSBhcmUgYWxpZ25lZCBhcyByZXF1aXJlZC4KLQotICAgV2UgaGFuZGxlIGdyb3VwZWQgc2VjdGlvbnMgaGVyZSBhcyB3ZWxsLiAgQSBzZWN0aW9uIG5hbWVkIC5mb28kbm4KLSAgIGdvZXMgaW50byB0aGUgb3V0cHV0IHNlY3Rpb24gLmZvby4gIEFsbCBncm91cGVkIHNlY3Rpb25zIGFyZSBzb3J0ZWQKLSAgIGJ5IG5hbWUuCi0KLSAgIEdyb3VwZWQgc2VjdGlvbnMgZm9yIHRoZSBkZWZhdWx0IHNlY3Rpb25zIGFyZSBoYW5kbGVkIGJ5IHRoZQotICAgZGVmYXVsdCBsaW5rZXIgc2NyaXB0IHVzaW5nIHdpbGRjYXJkcywgYW5kIGFyZSBzb3J0ZWQgYnkKLSAgIHNvcnRfc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKmhvbGRfc2VjdGlvbjsKLXN0YXRpYyBjaGFyICpob2xkX3NlY3Rpb25fbmFtZTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3VzZTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3RleHQ7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yZGF0YTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2RhdGE7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9ic3M7Ci0KLS8qIFBsYWNlIGFuIG9ycGhhbiBzZWN0aW9uLiAgV2UgdXNlIHRoaXMgdG8gcHV0IHJhbmRvbSBTSEZfQUxMT0MKLSAgIHNlY3Rpb25zIGluIHRoZSByaWdodCBzZWdtZW50LiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbiAoZmlsZSwgcykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGNvbnN0IGNoYXIgKnNlY25hbWU7Ci0gIGNoYXIgKmRvbGxhcjsKLQotICBpZiAoKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKHMtPm93bmVyLCBzKTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNjcmlwdCB0byBzZWUgd2hlcmUgdG8gcGxhY2UgdGhpcyBzZWN0aW9uLiAgKi8KLQotICBob2xkX3NlY3Rpb24gPSBzOwotCi0gIGhvbGRfc2VjdGlvbl9uYW1lID0geHN0cmR1cCAoc2VjbmFtZSk7Ci0gIGRvbGxhciA9IHN0cmNociAoaG9sZF9zZWN0aW9uX25hbWUsICckJyk7Ci0gIGlmIChkb2xsYXIgIT0gTlVMTCkKLSAgICAqZG9sbGFyID0gJ1wwJzsKLQotICBob2xkX3VzZSA9IE5VTEw7Ci0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTsKLQotICBpZiAoaG9sZF91c2UgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpwbGFjZTsKLSAgICAgIGNoYXIgKm91dHNlY25hbWU7Ci0gICAgICBhc2VjdGlvbiAqc25ldywgKipwcHM7Ci0gICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKm9sZDsKLSAgICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBhZGQ7Ci0gICAgICBldHJlZV90eXBlICphZGRyZXNzOwotCi0gICAgICAvKiBUcnkgdG8gcHV0IHRoZSBuZXcgb3V0cHV0IHNlY3Rpb24gaW4gYSByZWFzb25hYmxlIHBsYWNlIGJhc2VkCi0JIG9uIHRoZSBzZWN0aW9uIG5hbWUgYW5kIHNlY3Rpb24gZmxhZ3MuICAqLwotICAgICAgcGxhY2UgPSBOVUxMOwotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkgICYmIGhvbGRfYnNzICE9IE5VTEwpCi0JcGxhY2UgPSBob2xkX2JzczsKLSAgICAgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMAotCSAgICAgICAmJiBob2xkX2RhdGEgIT0gTlVMTCkKLQlwbGFjZSA9IGhvbGRfZGF0YTsKLSAgICAgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0JICAgICAgICYmIChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCSAgICAgICAmJiBob2xkX3JkYXRhICE9IE5VTEwpCi0JcGxhY2UgPSBob2xkX3JkYXRhOwotICAgICAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgICAgICYmIGhvbGRfdGV4dCAhPSBOVUxMKQotCXBsYWNlID0gaG9sZF90ZXh0OwotCi0gICAgICAvKiBDaG9vc2UgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIHNlY3Rpb24uICBUaGlzIHdpbGwgYmUgbmVlZGVkIGlmCi0JIHRoZSBzYW1lIHNlY3Rpb24gbmFtZSBhcHBlYXJzIGluIHRoZSBpbnB1dCBmaWxlIHdpdGgKLQkgZGlmZmVyZW50IGxvYWRhYmxlIG9yIGFsbG9jYXRlYWJsZSBjaGFyYWN0ZXJpc3RpY3MuICAqLwotICAgICAgb3V0c2VjbmFtZSA9IHhzdHJkdXAgKGhvbGRfc2VjdGlvbl9uYW1lKTsKLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0c2VjbmFtZSkgIT0gTlVMTCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbGVuOwotCSAgY2hhciAqbmV3bmFtZTsKLQkgIHVuc2lnbmVkIGludCBpOwotCi0JICBsZW4gPSBzdHJsZW4gKG91dHNlY25hbWUpOwotCSAgbmV3bmFtZSA9IHhtYWxsb2MgKGxlbiArIDUpOwotCSAgc3RyY3B5IChuZXduYW1lLCBvdXRzZWNuYW1lKTsKLQkgIGkgPSAwOwotCSAgZG8KLQkgICAgewotCSAgICAgIHNwcmludGYgKG5ld25hbWUgKyBsZW4sICIlZCIsIGkpOwotCSAgICAgICsraTsKLQkgICAgfQotCSAgd2hpbGUgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuZXduYW1lKSAhPSBOVUxMKTsKLQotCSAgZnJlZSAob3V0c2VjbmFtZSk7Ci0JICBvdXRzZWNuYW1lID0gbmV3bmFtZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gZnJlZSBPVVRTRUNOQU1FLCBhcyBpdCBtYXkgZ2V0IGF0dGFjaGVkIHRvCi0JIHRoZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnQuICAqLwotCi0gICAgICAvKiBDcmVhdGUgdGhlIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBhbmQgcHV0IGl0IGluIHRoZQotCSByaWdodCBwbGFjZS4gIFRoaXMgc2h1ZmZsaW5nIGlzIHRvIG1ha2UgdGhlIG91dHB1dCBmaWxlIGxvb2sKLQkgbmVhdGVyLiAgKi8KLSAgICAgIHNuZXcgPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBvdXRzZWNuYW1lKTsKLSAgICAgIGlmIChzbmV3ID09IE5VTEwpCi0JZWluZm8gKCIlUCVGOiBvdXRwdXQgZm9ybWF0ICVzIGNhbm5vdCByZXByZXNlbnQgc2VjdGlvbiBjYWxsZWQgJXNcbiIsCi0JICAgICAgIG91dHB1dF9iZmQtPnh2ZWMtPm5hbWUsIG91dHNlY25hbWUpOwotICAgICAgaWYgKHBsYWNlICE9IE5VTEwgJiYgcGxhY2UtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0JewotCSAgZm9yIChwcHMgPSAmb3V0cHV0X2JmZC0+c2VjdGlvbnM7ICpwcHMgIT0gc25ldzsgcHBzID0gJigqcHBzKS0+bmV4dCkKLQkgICAgOwotCSAgKnBwcyA9IHNuZXctPm5leHQ7Ci0JICBzbmV3LT5uZXh0ID0gcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0OwotCSAgcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0ID0gc25ldzsKLQl9Ci0KLSAgICAgIC8qIFN0YXJ0IGJ1aWxkaW5nIGEgbGlzdCBvZiBzdGF0ZW1lbnRzIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgb2xkID0gc3RhdF9wdHI7Ci0gICAgICBzdGF0X3B0ciA9ICZhZGQ7Ci0gICAgICBsYW5nX2xpc3RfaW5pdCAoc3RhdF9wdHIpOwotCi0gICAgICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQlhZGRyZXNzID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBBbGwgc2VjdGlvbnMgaW4gYW4gZXhlY3V0YWJsZSBtdXN0IGJlIGFsaWduZWQgdG8gYSBwYWdlCi0JICAgICBib3VuZGFyeS4gICovCi0JICBhZGRyZXNzID0gZXhwX3Vub3AgKEFMSUdOX0ssCi0JCQkgICAgICBleHBfbmFtZW9wIChOQU1FLCAiX19zZWN0aW9uX2FsaWdubWVudF9fIikpOwotCX0KLQotICAgICAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKG91dHNlY25hbWUsIGFkZHJlc3MsIDAsCi0JCQkJCSAgIChiZmRfdm1hKSAwLAotCQkJCQkgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCQkgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCQkgICAoZXRyZWVfdHlwZSAqKSBOVUxMKTsKLQotICAgICAgaG9sZF91c2UgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKG91dHNlY25hbWUpOwotCi0gICAgICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudAotCSgoYmZkX3ZtYSkgMCwgIipkZWZhdWx0KiIsCi0JIChzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikgTlVMTCk7Ci0KLSAgICAgIC8qIE5vdyBzdGljayB0aGUgbmV3IHN0YXRlbWVudCBsaXN0IHJpZ2h0IGFmdGVyIFBMQUNFLiAgKi8KLSAgICAgIGlmIChwbGFjZSAhPSBOVUxMKQotCXsKLQkgICphZGQudGFpbCA9IHBsYWNlLT5oZWFkZXIubmV4dDsKLQkgIHBsYWNlLT5oZWFkZXIubmV4dCA9IGFkZC5oZWFkOwotCX0KLQotICAgICAgc3RhdF9wdHIgPSBvbGQ7Ci0gICAgfQotCi0gIGlmIChkb2xsYXIgPT0gTlVMTCkKLSAgICB3aWxkX2RvaXQgKCZob2xkX3VzZS0+Y2hpbGRyZW4sIHMsIGhvbGRfdXNlLCBmaWxlKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwbDsKLSAgICAgIGJvb2xlYW4gZm91bmRfZG9sbGFyOwotICAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGxpc3Q7Ci0KLSAgICAgIC8qIFRoZSBzZWN0aW9uIG5hbWUgaGFzIGEgJyQnLiAgU29ydCBpdCB3aXRoIHRoZSBvdGhlciAnJCcKLSAgICAgICAgIHNlY3Rpb25zLiAgKi8KLQotICAgICAgZm91bmRfZG9sbGFyID0gZmFsc2U7Ci0gICAgICBmb3IgKHBsID0gJmhvbGRfdXNlLT5jaGlsZHJlbi5oZWFkOyAqcGwgIT0gTlVMTDsgcGwgPSAmKCpwbCktPm5leHQpCi0JewotCSAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKmxzOwotCSAgY29uc3QgY2hhciAqbG5hbWU7Ci0KLQkgIGlmICgoKnBsKS0+aGVhZGVyLnR5cGUgIT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0pCi0JICAgIGNvbnRpbnVlOwotCi0JICBscyA9ICYoKnBsKS0+aW5wdXRfc2VjdGlvbjsKLQotCSAgbG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAobHMtPmlmaWxlLT50aGVfYmZkLCBscy0+c2VjdGlvbik7Ci0JICBpZiAoc3RyY2hyIChsbmFtZSwgJyQnKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGZvdW5kX2RvbGxhcikKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZvdW5kX2RvbGxhciA9IHRydWU7Ci0JICAgICAgaWYgKHN0cmNtcCAoc2VjbmFtZSwgbG5hbWUpIDwgMCkKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGxhbmdfbGlzdF9pbml0ICgmbGlzdCk7Ci0gICAgICB3aWxkX2RvaXQgKCZsaXN0LCBzLCBob2xkX3VzZSwgZmlsZSk7Ci0gICAgICBpZiAobGlzdC5oZWFkICE9IE5VTEwpCi0JewotCSAgQVNTRVJUIChsaXN0LmhlYWQtPm5leHQgPT0gTlVMTCk7Ci0JICBsaXN0LmhlYWQtPm5leHQgPSAqcGw7Ci0JICAqcGwgPSBsaXN0LmhlYWQ7Ci0JfQotICAgIH0KLQotICBmcmVlIChob2xkX3NlY3Rpb25fbmFtZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uIChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBpZiAocy0+aGVhZGVyLnR5cGUgIT0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bSkKLSAgICByZXR1cm47Ci0KLSAgb3MgPSAmcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCBob2xkX3NlY3Rpb25fbmFtZSkgPT0gMAotICAgICAgJiYgb3MtPmJmZF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmICgoaG9sZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpCi0JICA9PSAob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpKSkKLSAgICBob2xkX3VzZSA9IG9zOwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIGhvbGRfdGV4dCA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnJkYXRhIikgPT0gMCkKLSAgICBob2xkX3JkYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuZGF0YSIpID09IDApCi0gICAgaG9sZF9kYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuYnNzIikgPT0gMCkKLSAgICBob2xkX2JzcyA9IG9zOwotfQotDAotc3RhdGljIGNoYXIgKgotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgJHtzcmNkaXJ9L2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfcGFyc2UsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2ZpbmlzaCwgLyogZmluaXNoICovCi0gIE5VTEwsIC8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIE5VTEwsIC8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4sCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scywKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV91bnJlY29nbml6ZWRfZmlsZSwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2xpc3Rfb3B0aW9ucywKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3JlY29nbml6ZWRfZmlsZQotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQgYi9sZC9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUyNmQzZi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcy9bIlxcXS9cXCYvZwotcy8kL1xcblxcLwotMSBzL14vIi8KLSQgcy8kL24iLwpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL3N1bm9zLmVtIGIvbGQvZW11bHRlbXBsL3N1bm9zLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTk1OTljLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9zdW5vcy5lbQorKysgL2Rldi9udWxsCkBAIC0xLDEwMzcgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBTdW5PUyBlbXVsYXRpb24gY29kZSBmb3IgJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLSAgIFN1bk9TIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotCi0jaWZkZWYgSEFWRV9ESVJFTlRfSAotIyBpbmNsdWRlIDxkaXJlbnQuaD4KLSNlbHNlCi0jIGRlZmluZSBkaXJlbnQgZGlyZWN0Ci0jIGlmZGVmIEhBVkVfU1lTX05ESVJfSAotIyAgaW5jbHVkZSA8c3lzL25kaXIuaD4KLSMgZW5kaWYKLSMgaWZkZWYgSEFWRV9TWVNfRElSX0gKLSMgIGluY2x1ZGUgPHN5cy9kaXIuaD4KLSMgZW5kaWYKLSMgaWZkZWYgSEFWRV9ORElSX0gKLSMgIGluY2x1ZGUgPG5kaXIuaD4KLSMgZW5kaWYKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMKLSAgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbwotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfZGlyCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCBQQVJBTVMgKChldHJlZV90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NvdW50X25lZWQKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9zZXRfbmVlZAotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UoKQotewotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoXyR7QVJDSH07Ci0gIGNvbmZpZy5keW5hbWljX2xpbmsgPSB0cnVlOwotICBjb25maWcuaGFzX3NoYXJlZCA9IHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGhhdmUgYmVlbiBwYXJzZWQsCi0gICBidXQgYmVmb3JlIHRoZSBsaW5rZXIgc2NyaXB0IGhhcyBiZWVuIHJlYWQuICBJZiB0aGlzIGlzIGEgbmF0aXZlCi0gICBsaW5rZXIsIHdlIGFkZCB0aGUgZGlyZWN0b3JpZXMgaW4gTERfTElCUkFSWV9QQVRIIHRvIHRoZSBzZWFyY2gKLSAgIGxpc3QuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMgKCkKLXsKLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGlmIFsgIngke0RFRkFVTFRfRU1VTEFUSU9OfSIgPSAieCR7RU1VTEFUSU9OX05BTUV9IiBdIDsgdGhlbgotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLSAgY29uc3QgY2hhciAqZW52OwotCi0gIGVudiA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX0xJQlJBUllfUEFUSCIpOwotICBpZiAoZW52ICE9IE5VTEwpCi0gICAgewotICAgICAgY2hhciAqbDsKLQotICAgICAgbCA9IHhzdHJkdXAgKGVudik7Ci0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBjaGFyICpjOwotCi0JICBjID0gc3RyY2hyIChsLCAnOicpOwotCSAgaWYgKGMgIT0gTlVMTCkKLQkgICAgKmMrKyA9ICdcMCc7Ci0JICBpZiAoKmwgIT0gJ1wwJykKLQkgICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKGwsIGZhbHNlKTsKLQkgIGlmIChjID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgbCA9IGM7Ci0JfQotICAgIH0KLUVPRgotICBmaQotZmkKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi19Ci0KLS8qIERlc3BpdGUgdGhlIG5hbWUsIHdlIHVzZSB0aGlzIHJvdXRpbmUgdG8gc2VhcmNoIGZvciBkeW5hbWljCi0gICBsaWJyYXJpZXMuICBPbiBTdW5PUyB0aGlzIHJlcXVpcmVzIGEgZGlyZWN0b3J5IHNlYXJjaC4gIFdlIG5lZWQgdG8KLSAgIGZpbmQgdGhlIC5zbyBmaWxlIHdpdGggdGhlIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIuICBUaGUgdXNlciBtYXkKLSAgIHJlc3RyaWN0IHRoZSBtYWpvciB2ZXJzaW9uIGJ5IHNheWluZywgZS5nLiwgLWxjLjEuICBBbHNvLCBpZiB3ZQotICAgZmluZCBhIC5zbyBmaWxlLCB3ZSBuZWVkIHRvIGxvb2sgZm9yIGEgdGhlIHNhbWUgZmlsZSBhZnRlcgotICAgcmVwbGFjaW5nIC5zbyB3aXRoIC5zYTsgaWYgaXQgZXhpc3RzLCBpdCB3aWxsIGJlIGFuIGFyY2hpdmUgd2hpY2gKLSAgIHByb3ZpZGUgc29tZSBpbml0aWFsaXphdGlvbnMgZm9yIGRhdGEgc3ltYm9scywgYW5kIHdlIG5lZWQgdG8KLSAgIHNlYXJjaCBpdCBhZnRlciBpbmNsdWRpbmcgdGhlIC5zbyBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzICgpCi17Ci0gIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk7Ci19Ci0KLS8qIFNlYXJjaCB0aGUgZGlyZWN0b3J5IGZvciBhIC5zbyBmaWxlIGZvciBlYWNoIGxpYnJhcnkgc2VhcmNoLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28gKGlucCkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqaW5wOwotewotICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0gIGNoYXIgKmZvdW5kID0gTlVMTDsKLSAgY2hhciAqYWxjOwotICBzdHJ1Y3Qgc3RhdCBzdDsKLQotICBpZiAoISBpbnAtPnNlYXJjaF9kaXJzX2ZsYWcKLSAgICAgIHx8ICEgaW5wLT5pc19hcmNoaXZlCi0gICAgICB8fCAhIGlucC0+ZHluYW1pYykKLSAgICByZXR1cm47Ci0KLSAgQVNTRVJUIChzdHJuY21wIChpbnAtPmxvY2FsX3N5bV9uYW1lLCAiLWwiLCAyKSA9PSAwKTsKLQotICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotICAgIHsKLSAgICAgIGJvb2xlYW4gZm91bmRfc3RhdGljOwotCi0gICAgICBmb3VuZCA9IGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIgKHNlYXJjaC0+bmFtZSwgaW5wLT5maWxlbmFtZSwKLQkJCQkJICAgICAgICZmb3VuZF9zdGF0aWMpOwotICAgICAgaWYgKGZvdW5kICE9IE5VTEwgfHwgZm91bmRfc3RhdGljKQotCWJyZWFrOwotICAgIH0KLQotICBpZiAoZm91bmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBkaWQgbm90IGZpbmQgYSBtYXRjaGluZyAuc28gZmlsZS4gIFRoaXMgaXNuJ3QgYW4gZXJyb3IsCi0JIHNpbmNlIHRoZXJlIG1pZ2h0IHN0aWxsIGJlIGEgbWF0Y2hpbmcgLmEgZmlsZSwgd2hpY2ggd2lsbCBiZQotCSBmb3VuZCBieSB0aGUgdXN1YWwgc2VhcmNoLiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogUmVwbGFjZSB0aGUgZmlsZW5hbWUgd2l0aCB0aGUgb25lIHdlIGhhdmUgZm91bmQuICAqLwotICBhbGMgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHNlYXJjaC0+bmFtZSkgKyBzdHJsZW4gKGZvdW5kKSArIDIpOwotICBzcHJpbnRmIChhbGMsICIlcy8lcyIsIHNlYXJjaC0+bmFtZSwgZm91bmQpOwotICBpbnAtPmZpbGVuYW1lID0gYWxjOwotCi0gIC8qIFR1cm4gb2ZmIHRoZSBzZWFyY2hfZGlyc19mbGFnIHRvIHByZXZlbnQgbGRmaWxlX29wZW5fZmlsZSBmcm9tCi0gICAgIHNlYXJjaGluZyBmb3IgdGhpcyBmaWxlIGFnYWluLiAgKi8KLSAgaW5wLT5zZWFyY2hfZGlyc19mbGFnID0gZmFsc2U7Ci0KLSAgZnJlZSAoZm91bmQpOwotCi0gIC8qIE5vdyBsb29rIGZvciB0aGUgc2FtZSBmaWxlIG5hbWUsIGJ1dCB3aXRoIC5zYSBpbnN0ZWFkIG9mIC5zby4gIElmCi0gICAgIGZvdW5kLCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgaW5wdXQgZmlsZXMuICAqLwotICBhbGMgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGlucC0+ZmlsZW5hbWUpICsgMSk7Ci0gIHN0cmNweSAoYWxjLCBpbnAtPmZpbGVuYW1lKTsKLSAgc3Ryc3RyIChhbGMgKyBzdHJsZW4gKHNlYXJjaC0+bmFtZSksICIuc28iKVsyXSA9ICdhJzsKLSAgaWYgKHN0YXQgKGFsYywgJnN0KSAhPSAwKQotICAgIGZyZWUgKGFsYyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzYTsKLQotICAgICAgLyogQWRkIHRoZSAuc2EgZmlsZSB0byB0aGUgc3RhdGVtZW50IGxpc3QganVzdCBiZWZvcmUgdGhlIC5zbwotCSBmaWxlLiAgVGhpcyBpcyByZWFsbHkgYSBoYWNrLiAgKi8KLSAgICAgIHNhID0gKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopCi0JICAgIHhtYWxsb2MgKHNpemVvZiAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSkpKTsKLSAgICAgICpzYSA9ICppbnA7Ci0KLSAgICAgIGlucC0+ZmlsZW5hbWUgPSBhbGM7Ci0gICAgICBpbnAtPmxvY2FsX3N5bV9uYW1lID0gYWxjOwotCi0gICAgICBpbnAtPmhlYWRlci5uZXh0ID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgc2E7Ci0gICAgICBpbnAtPm5leHRfcmVhbF9maWxlID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgc2E7Ci0gICAgfQotfQotCi0vKiBTZWFyY2ggYSBkaXJlY3RvcnkgZm9yIGEgLnNvIGZpbGUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfZGlyIChkaXJuYW1lLCBmaWxlbmFtZSwgZm91bmRfc3RhdGljKQotICAgICBjb25zdCBjaGFyICpkaXJuYW1lOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgYm9vbGVhbiAqZm91bmRfc3RhdGljOwotewotICBpbnQgZm9yY2VfbWFqLCBmb3JjZV9taW47Ci0gIGNvbnN0IGNoYXIgKmRvdDsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgY2hhciAqYWxjOwotICBjaGFyICpmb3VuZDsKLSAgaW50IG1heF9tYWosIG1heF9taW47Ci0gIERJUiAqZGlyOwotICBzdHJ1Y3QgZGlyZW50ICplbnRyeTsKLSAgdW5zaWduZWQgaW50IGRpcm5hbWVsZW47Ci0gIGNoYXIgKmZ1bGxfcGF0aDsKLSAgaW50IHN0YXR2YWw7Ci0gIHN0cnVjdCBzdGF0IHN0OwotCi0gICpmb3VuZF9zdGF0aWMgPSBmYWxzZTsKLQotICBmb3JjZV9tYWogPSAtMTsKLSAgZm9yY2VfbWluID0gLTE7Ci0gIGRvdCA9IHN0cmNociAoZmlsZW5hbWUsICcuJyk7Ci0gIGlmIChkb3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsZW4gPSBzdHJsZW4gKGZpbGVuYW1lKTsKLSAgICAgIGFsYyA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yY2VfbWFqID0gYXRvaSAoZG90ICsgMSk7Ci0KLSAgICAgIGxlbiA9IGRvdCAtIGZpbGVuYW1lOwotICAgICAgYWxjID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgMSk7Ci0gICAgICBzdHJuY3B5IChhbGMsIGZpbGVuYW1lLCBsZW4pOwotICAgICAgYWxjW2xlbl0gPSAnXDAnOwotICAgICAgZmlsZW5hbWUgPSBhbGM7Ci0KLSAgICAgIGRvdCA9IHN0cmNociAoZG90ICsgMSwgJy4nKTsKLSAgICAgIGlmIChkb3QgIT0gTlVMTCkKLQlmb3JjZV9taW4gPSBhdG9pIChkb3QgKyAxKTsKLSAgICB9Ci0KLSAgZm91bmQgPSBOVUxMOwotICBtYXhfbWFqID0gbWF4X21pbiA9IDA7Ci0KLSAgZGlyID0gb3BlbmRpciAoZGlybmFtZSk7Ci0gIGlmIChkaXIgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgZGlybmFtZWxlbiA9IHN0cmxlbiAoZGlybmFtZSk7Ci0gIAotICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpciAoZGlyKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzOwotICAgICAgaW50IGZvdW5kX21haiwgZm91bmRfbWluOwotCi0gICAgICBpZiAoc3RybmNtcCAoZW50cnktPmRfbmFtZSwgImxpYiIsIDMpICE9IDAKLQkgIHx8IHN0cm5jbXAgKGVudHJ5LT5kX25hbWUgKyAzLCBmaWxlbmFtZSwgbGVuKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZG90ID09IE5VTEwKLQkgICYmIHN0cmNtcCAoZW50cnktPmRfbmFtZSArIDMgKyBsZW4sICIuYSIpID09IDApCi0JewotCSAgKmZvdW5kX3N0YXRpYyA9IHRydWU7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGFjY2VwdCBsaWJmb28uc28gd2l0aG91dCBhIHZlcnNpb24gbnVtYmVyLCBldmVuIHRob3VnaCB0aGUKLSAgICAgICAgIG5hdGl2ZSBsaW5rZXIgZG9lcyBub3QuICBUaGlzIGlzIG1vcmUgY29udmVuaWVudCBmb3IgcGFja2FnZXMKLSAgICAgICAgIHdoaWNoIGp1c3QgZ2VuZXJhdGUgLnNvIGZpbGVzIGZvciBzaGFyZWQgbGlicmFyaWVzLCBhcyBvbiBFTEYKLSAgICAgICAgIHN5c3RlbXMuICAqLwotICAgICAgaWYgKHN0cm5jbXAgKGVudHJ5LT5kX25hbWUgKyAzICsgbGVuLCAiLnNvIiwgMykgIT0gMCkKLQljb250aW51ZTsKLSAgICAgIGlmIChlbnRyeS0+ZF9uYW1lWzYgKyBsZW5dID09ICdcMCcpCi0JOwotICAgICAgZWxzZSBpZiAoZW50cnktPmRfbmFtZVs2ICsgbGVuXSA9PSAnLicKLQkgICAgICAgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGVudHJ5LT5kX25hbWVbNyArIGxlbl0pKQotCTsKLSAgICAgIGVsc2UKLQljb250aW51ZTsKLQotICAgICAgZm9yIChzID0gZW50cnktPmRfbmFtZSArIDYgKyBsZW47ICpzICE9ICdcMCc7IHMrKykKLQlpZiAoKnMgIT0gJy4nICYmICEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkgIGJyZWFrOwotICAgICAgaWYgKCpzICE9ICdcMCcpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlJ3ZlIGZvdW5kIGEgLnNvIGZpbGUuICBXb3JrIG91dCB0aGUgbWFqb3IgYW5kIG1pbm9yCi0JIHZlcnNpb24gbnVtYmVycy4gICovCi0gICAgICBmb3VuZF9tYWogPSAwOwotICAgICAgZm91bmRfbWluID0gMDsKLSAgICAgIHNzY2FuZiAoZW50cnktPmRfbmFtZSArIDMgKyBsZW4sICIuc28uJWQuJWQiLAotCSAgICAgICZmb3VuZF9tYWosICZmb3VuZF9taW4pOwotCi0gICAgICBpZiAoKGZvcmNlX21haiAhPSAtMSAmJiBmb3JjZV9tYWogIT0gZm91bmRfbWFqKQotCSAgfHwgKGZvcmNlX21pbiAhPSAtMSAmJiBmb3JjZV9taW4gIT0gZm91bmRfbWluKSkKLQljb250aW51ZTsKLQotICAgICAgLyogTWFrZSBzdXJlIHRoZSBmaWxlIHJlYWxseSBleGlzdHMgKGlnbm9yZSBicm9rZW4gc3ltbGlua3MpLiAgKi8KLSAgICAgIGZ1bGxfcGF0aCA9IHhtYWxsb2MgKGRpcm5hbWVsZW4gKyAxICsgc3RybGVuIChlbnRyeS0+ZF9uYW1lKSArIDEpOwotICAgICAgc3ByaW50ZiAoZnVsbF9wYXRoLCAiJXMvJXMiLCBkaXJuYW1lLCBlbnRyeS0+ZF9uYW1lKTsKLSAgICAgIHN0YXR2YWwgPSBzdGF0IChmdWxsX3BhdGgsICZzdCk7Ci0gICAgICBmcmVlIChmdWxsX3BhdGgpOwotICAgICAgaWYgKHN0YXR2YWwgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UndmUgZm91bmQgYSBtYXRjaCBmb3IgdGhlIG5hbWUgd2UgYXJlIHNlYXJjaGluZyBmb3IuICBTZWUKLQkgaWYgdGhpcyBpcyB0aGUgdmVyc2lvbiB3ZSBzaG91bGQgdXNlLiAgSWYgdGhlIG1ham9yIGFuZCBtaW5vcgotCSB2ZXJzaW9ucyBtYXRjaCwgd2UgdXNlIHRoZSBsYXN0IGVudHJ5IGluIGFscGhhYmV0aWNhbCBvcmRlcjsKLQkgSSBkb24ndCBrbm93IGlmIHRoaXMgaXMgaG93IFN1bk9TIGRpc3Rpbmd1aXNoZXMgbGliYy5zby4xLjgKLQkgZnJvbSBsaWJjLnNvLjEuOC4xLCBidXQgaXQgb3VnaHQgdG8gc3VmZmljZS4gICovCi0gICAgICBpZiAoZm91bmQgPT0gTlVMTAotCSAgfHwgKGZvdW5kX21haiA+IG1heF9tYWopCi0JICB8fCAoZm91bmRfbWFqID09IG1heF9tYWoKLQkgICAgICAmJiAoZm91bmRfbWluID4gbWF4X21pbgotCQkgIHx8IChmb3VuZF9taW4gPT0gbWF4X21pbgotCQkgICAgICAmJiBzdHJjbXAgKGVudHJ5LT5kX25hbWUsIGZvdW5kKSA+IDApKSkpCi0JewotCSAgaWYgKGZvdW5kICE9IE5VTEwpCi0JICAgIGZyZWUgKGZvdW5kKTsKLQkgIGZvdW5kID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChlbnRyeS0+ZF9uYW1lKSArIDEpOwotCSAgc3RyY3B5IChmb3VuZCwgZW50cnktPmRfbmFtZSk7Ci0JICBtYXhfbWFqID0gZm91bmRfbWFqOwotCSAgbWF4X21pbiA9IGZvdW5kX21pbjsKLQl9Ci0gICAgfQotCi0gIGNsb3NlZGlyIChkaXIpOwotCi0gIGlmIChhbGMgIT0gTlVMTCkKLSAgICBmcmVlIChhbGMpOwotCi0gIHJldHVybiBmb3VuZDsKLX0KLQotLyogVGhlc2UgdmFyaWFibGVzIGFyZSByZXF1aXJlZCB0byBwYXNzIGluZm9ybWF0aW9uIGJhY2sgYW5kIGZvcnRoCi0gICBiZXR3ZWVuIGFmdGVyX29wZW4gYW5kIGNoZWNrX25lZWRlZC4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmdsb2JhbF9uZWVkZWQ7Ci1zdGF0aWMgYm9vbGVhbiBnbG9iYWxfZm91bmQ7Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIG9wZW5lZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuICgpCi17Ci0gIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmVlZGVkLCAqbDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcyB3aGVuIGRvaW5nIGEgZmluYWwgbGluay4gICovCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlIHx8IGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcmV0dXJuOwotCi0gIC8qIEdldCB0aGUgbGlzdCBvZiBmaWxlcyB3aGljaCBhcHBlYXIgaW4gbGRfbmVlZCBlbnRyaWVzIGluIGR5bmFtaWMKLSAgICAgb2JqZWN0cyBpbmNsdWRlZCBpbiB0aGUgbGluay4gIEZvciBlYWNoIHN1Y2ggZmlsZSwgd2Ugd2FudCB0bwotICAgICB0cmFjayBkb3duIHRoZSBjb3JyZXNwb25kaW5nIGxpYnJhcnksIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2wKLSAgICAgdGFibGUgaW4gdGhlIGxpbmsuICBUaGlzIGlzIHdoYXQgdGhlIHJ1bnRpbWUgZHluYW1pYyBsaW5rZXIgd2lsbAotICAgICBkby4gIFRyYWNraW5nIHRoZSBmaWxlcyBkb3duIGhlcmUgcGVybWl0cyBvbmUgZHluYW1pYyBvYmplY3QgdG8KLSAgICAgaW5jbHVkZSBhbm90aGVyIHdpdGhvdXQgcmVxdWlyaW5nIHNwZWNpYWwgYWN0aW9uIGJ5IHRoZSBwZXJzb24KLSAgICAgZG9pbmcgdGhlIGxpbmsuICBOb3RlIHRoYXQgdGhlIG5lZWRlZCBsaXN0IGNhbiBhY3R1YWxseSBncm93Ci0gICAgIHdoaWxlIHdlIGFyZSBzdGVwcGluZyB0aHJvdWdoIHRoaXMgbG9vcC4gICovCi0gIG5lZWRlZCA9IGJmZF9zdW5vc19nZXRfbmVlZGVkX2xpc3QgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOwotICBmb3IgKGwgPSBuZWVkZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsbDsKLSAgICAgIGNvbnN0IGNoYXIgKmxuYW1lOwotICAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotCi0gICAgICBsbmFtZSA9IGwtPm5hbWU7Ci0KLSAgICAgIC8qIElmIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGZpbGUsIHNraXAgaXQuICAqLwotICAgICAgZm9yIChsbCA9IG5lZWRlZDsgbGwgIT0gbDsgbGwgPSBsbC0+bmV4dCkKLQlpZiAoc3RyY21wIChsbC0+bmFtZSwgbG5hbWUpID09IDApCi0JICBicmVhazsKLSAgICAgIGlmIChsbCAhPSBsKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBmaWxlIHdhcyBpbmNsdWRlZCBpbiB0aGUgbGluayBleHBsaWNpdGx5LiAgKi8KLSAgICAgIGdsb2JhbF9uZWVkZWQgPSBsOwotICAgICAgZ2xvYmFsX2ZvdW5kID0gZmFsc2U7Ci0gICAgICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCk7Ci0gICAgICBpZiAoZ2xvYmFsX2ZvdW5kKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoc3RybmNtcCAobG5hbWUsICItbCIsIDIpICE9IDApCi0JewotCSAgYmZkICphYmZkOwotCi0JICBhYmZkID0gYmZkX29wZW5yIChsbmFtZSwgYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpKTsKLQkgIGlmIChhYmZkICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLQkJewotCQkgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotCQkgIGFiZmQgPSBOVUxMOwotCQl9Ci0JICAgIH0KLQkgIGlmIChhYmZkICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBEWU5BTUlDKSA9PSAwKQotCQl7Ci0JCSAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0JCSAgYWJmZCA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCSAgaWYgKGFiZmQgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFdlJ3ZlIGZvdW5kIHRoZSBuZWVkZWQgZHluYW1pYyBvYmplY3QuICAqLwotCSAgICAgIGlmICghIGJmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCAmbGlua19pbmZvKSkKLQkJZWluZm8gKCIlRiVCOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiwgYWJmZCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVpbmZvICgiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG5vdCBmb3VuZFxuIiwKLQkJICAgICBsbmFtZSwgbC0+YnkpOwotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgbG5hbWUgKz0gMjsKLQotICAgICAgLyogV2Ugd2FudCB0byBzZWFyY2ggZm9yIHRoZSBmaWxlIGluIHRoZSBzYW1lIHdheSB0aGF0IHRoZQotCSBkeW5hbWljIGxpbmtlciB3aWxsIHNlYXJjaC4gIFRoYXQgbWVhbnMgdGhhdCB3ZSB3YW50IHRvIHVzZQotCSBycGF0aF9saW5rLCBycGF0aCBvciAtTCwgdGhlbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLQkgTERfTElCUkFSWV9QQVRIIChuYXRpdmUgb25seSksIHRoZW4gKGlmIHJwYXRoIHdhcyB1c2VkKSB0aGUKLQkgbGlua2VyIHNjcmlwdCBMSUJfU0VBUkNIX0RJUlMuICAqLwotICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGNvbW1hbmRfbGluZS5ycGF0aF9saW5rLAotCQkJCQkgICAgICBsbmFtZSkpCi0JY29udGludWU7Ci0gICAgICBpZiAoY29tbWFuZF9saW5lLnJwYXRoICE9IE5VTEwpCi0JewotCSAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGNvbW1hbmRfbGluZS5ycGF0aCwgbG5hbWUpKQotCSAgICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsgc2VhcmNoICE9IE5VTEw7IHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkKLQkgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKHNlYXJjaC0+bmFtZSwgbG5hbWUpKQotCSAgICAgIGJyZWFrOwotCSAgaWYgKHNlYXJjaCAhPSBOVUxMKQotCSAgICBjb250aW51ZTsKLQl9Ci1FT0YKLWlmIFsgIngke2hvc3R9IiA9ICJ4JHt0YXJnZXR9IiBdIDsgdGhlbgotICBpZiBbICJ4JHtERUZBVUxUX0VNVUxBVElPTn0iID0gIngke0VNVUxBVElPTl9OQU1FfSIgXSA7IHRoZW4KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0gICAgICB7Ci0JY29uc3QgY2hhciAqbGliX3BhdGg7Ci0KLQlsaWJfcGF0aCA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX0xJQlJBUllfUEFUSCIpOwotCWlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChsaWJfcGF0aCwgbG5hbWUpKQotCSAgY29udGludWU7Ci0gICAgICB9Ci1FT0YKLSAgZmkKLWZpCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotICAgICAgaWYgKGNvbW1hbmRfbGluZS5ycGF0aCAhPSBOVUxMKQotCXsKLQkgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoc2VhcmNoLT5jbWRsaW5lKQotCQljb250aW51ZTsKLQkgICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoc2VhcmNoLT5uYW1lLCBsbmFtZSkpCi0JCWJyZWFrOwotCSAgICB9Ci0JICBpZiAoc2VhcmNoICE9IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCX0KLQotICAgICAgZWluZm8gKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbm90IGZvdW5kXG4iLAotCSAgICAgbC0+bmFtZSwgbC0+YnkpOwotICAgIH0KLX0KLQotLyogU2VhcmNoIGZvciBhIG5lZWRlZCBmaWxlIGluIGEgcGF0aC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChwYXRoLCBuYW1lKQotICAgICBjb25zdCBjaGFyICpwYXRoOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBjaGFyICpzOwotCi0gIGlmIChwYXRoID09IE5VTEwgfHwgKnBhdGggPT0gJ1wwJykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmRpcjsKLSAgICAgIGNoYXIgKmRpcmNvcHk7Ci0KLSAgICAgIHMgPSBzdHJjaHIgKHBhdGgsICc6Jyk7Ci0gICAgICBpZiAocyA9PSBOVUxMKQotCXsKLQkgIGRpcmNvcHkgPSBOVUxMOwotCSAgZGlyID0gcGF0aDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZGlyY29weSA9IChjaGFyICopIHhtYWxsb2MgKHMgLSBwYXRoICsgMSk7Ci0JICBtZW1jcHkgKGRpcmNvcHksIHBhdGgsIHMgLSBwYXRoKTsKLQkgIGRpcmNvcHlbcyAtIHBhdGhdID0gJ1wwJzsKLQkgIGRpciA9IGRpcmNvcHk7Ci0JfQotCi0gICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoZGlyLCBuYW1lKSkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgaWYgKGRpcmNvcHkgIT0gTlVMTCkKLQlmcmVlIChkaXJjb3B5KTsKLQotICAgICAgaWYgKHMgPT0gTlVMTCkKLQlicmVhazsKLSAgICAgIHBhdGggPSBzICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwkgIAotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBwb3NzaWJsZSBkaXJlY3RvcnkgZm9yIGEgbmVlZGVkCi0gICBkeW5hbWljIG9iamVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIChkaXIsIG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmRpcjsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY2hhciAqZmlsZTsKLSAgY2hhciAqYWxjOwotICBib29sZWFuIGlnbm9yZTsKLSAgYmZkICphYmZkOwotCi0gIGZpbGUgPSBnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfZGlyIChkaXIsIG5hbWUsICZpZ25vcmUpOwotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhbGMgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGRpcikgKyBzdHJsZW4gKGZpbGUpICsgMik7Ci0gIHNwcmludGYgKGFsYywgIiVzLyVzIiwgZGlyLCBmaWxlKTsKLSAgZnJlZSAoZmlsZSk7Ci0gIGFiZmQgPSBiZmRfb3BlbnIgKGFsYywgYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpKTsKLSAgaWYgKGFiZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQotICAgIHsKLSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV2UndmUgZm91bmQgdGhlIG5lZWRlZCBkeW5hbWljIG9iamVjdC4gICovCi0KLSAgLyogQWRkIHRoaXMgZmlsZSBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoISBiZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgJmxpbmtfaW5mbykpCi0gICAgZWluZm8gKCIlRiVCOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiwgYWJmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgYSBuZWVkZWQgb2JqZWN0IGluIHRoZSBsaW5rLiAgVGhpcwotICAgZG9lcyBub3QgaGF2ZSB0byBiZSBwcmVjaXNlLCBhcyBpdCBkb2VzIG5vIGhhcm0gdG8gaW5jbHVkZSBhCi0gICBkeW5hbWljIG9iamVjdCBtb3JlIHRoYW4gb25jZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQgKHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIGlmIChzLT5maWxlbmFtZSA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgaWYgKHN0cm5jbXAgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICItbCIsIDIpICE9IDApCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocy0+ZmlsZW5hbWUsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0JZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzbmFtZSwgKmxuYW1lOwotICAgICAgY29uc3QgY2hhciAqc2RvdCwgKmxkb3Q7Ci0gICAgICBpbnQgbG1haiwgbG1pbiwgc21haiwgc21pbjsKLQotICAgICAgbG5hbWUgPSBnbG9iYWxfbmVlZGVkLT5uYW1lICsgMjsKLQotICAgICAgc25hbWUgPSBzdHJyY2hyIChzLT5maWxlbmFtZSwgJy8nKTsKLSAgICAgIGlmIChzbmFtZSA9PSBOVUxMKQotCXNuYW1lID0gcy0+ZmlsZW5hbWU7Ci0gICAgICBlbHNlCi0JKytzbmFtZTsKLQotICAgICAgaWYgKHN0cm5jbXAgKHNuYW1lLCAibGliIiwgMykgIT0gMCkKLQlyZXR1cm47Ci0gICAgICBzbmFtZSArPSAzOwotCi0gICAgICBsZG90ID0gc3RyY2hyIChsbmFtZSwgJy4nKTsKLSAgICAgIGlmIChsZG90ID09IE5VTEwpCi0JbGRvdCA9IGxuYW1lICsgc3RybGVuIChsbmFtZSk7Ci0KLSAgICAgIHNkb3QgPSBzdHJzdHIgKHNuYW1lLCAiLnNvLiIpOwotICAgICAgaWYgKHNkb3QgPT0gTlVMTCkKLQlyZXR1cm47Ci0KLSAgICAgIGlmIChzZG90IC0gc25hbWUgIT0gbGRvdCAtIGxuYW1lCi0JICB8fCBzdHJuY21wIChsbmFtZSwgc25hbWUsIHNkb3QgLSBzbmFtZSkgIT0gMCkKLQlyZXR1cm47Ci0KLSAgICAgIGxtYWogPSBsbWluID0gLTE7Ci0gICAgICBzc2NhbmYgKGxkb3QsICIuJWQuJWQiLCAmbG1haiwgJmxtaW4pOwotICAgICAgc21haiA9IHNtaW4gPSAtMTsKLSAgICAgIHNzY2FuZiAoc2RvdCwgIi5zby4lZC4lZCIsICZzbWFqLCAmc21pbik7Ci0gICAgICBpZiAoKHNtYWogIT0gbG1haiAmJiBzbWFqICE9IC0xICYmIGxtYWogIT0gLTEpCi0JICB8fCAoc21pbiAhPSBsbWluICYmIHNtaW4gIT0gLTEgJiYgbG1pbiAhPSAtMSkpCi0JcmV0dXJuOwotCi0gICAgICBnbG9iYWxfZm91bmQgPSB0cnVlOwotICAgIH0KLX0KLQotLyogV2UgbmVlZCB0byB1c2Ugc3RhdGljIHZhcmlhYmxlcyB0byBwYXNzIGluZm9ybWF0aW9uIGFyb3VuZCB0aGUgY2FsbAotICAgdG8gbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQuICBJY2suICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqZmluZF9hc3NpZ247Ci1zdGF0aWMgYm9vbGVhbiBmb3VuZF9hc3NpZ247Ci0KLS8qIFdlIG5lZWQgdG8gdXNlIHN0YXRpYyB2YXJpYWJsZXMgdG8gcGFzcyBpbmZvcm1hdGlvbiBhcm91bmQgdGhlIGNhbGwKLSAgIHRvIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZS4gIEljay4gICovCi0KLXN0YXRpYyBiZmRfc2l6ZV90eXBlIG5lZWRfc2l6ZTsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIG5lZWRfZW50cmllczsKLXN0YXRpYyBiZmRfYnl0ZSAqbmVlZF9jb250ZW50czsKLXN0YXRpYyBiZmRfYnl0ZSAqbmVlZF9waW5mbzsKLXN0YXRpYyBiZmRfYnl0ZSAqbmVlZF9wbmFtZXM7Ci0KLS8qIFRoZSBzaXplIG9mIG9uZSBlbnRyeSBpbiB0aGUgLm5lZWQgc2VjdGlvbiwgbm90IGluY2x1ZGluZyB0aGUgZmlsZQotICAgbmFtZS4gICovCi0KLSNkZWZpbmUgTkVFRF9FTlRSWV9TSVpFICgxNikKLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKLSAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiAoKQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGR5biA9IE5VTEw7Ci0gIGFzZWN0aW9uICpzbmVlZDsKLSAgYXNlY3Rpb24gKnNydWxlczsKLSAgYXNlY3Rpb24gKnNkeW47Ci0KLSAgLyogVGhlIFN1bk9TIG5hdGl2ZSBsaW5rZXIgY3JlYXRlcyBhIHNoYXJlZCBsaWJyYXJ5IHdoZW5ldmVyIHRoZXJlCi0gICAgIGFyZSBhbnkgdW5kZWZpbmVkIHN5bWJvbHMgaW4gYSBsaW5rLCB1bmxlc3MgLWUgaXMgdXNlZC4gIFRoaXMgaXMKLSAgICAgcHJldHR5IHdlaXJkLCBidXQgd2UgYXJlIGNvbXBhdGlibGUuICAqLwotICBpZiAoISBsaW5rX2luZm8uc2hhcmVkICYmICEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSAmJiAhIGVudHJ5X2Zyb21fY21kbGluZSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIAotICAgICAgZm9yIChoID0gbGlua19pbmZvLmhhc2gtPnVuZGVmczsgaCAhPSBOVUxMOyBoID0gaC0+bmV4dCkKLQl7Ci0JICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgICYmIGgtPnUudW5kZWYuYWJmZCAhPSBOVUxMCi0JICAgICAgJiYgKGgtPnUudW5kZWYuYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwCi0JICAgICAgJiYgc3RyY21wIChoLT5yb290LnN0cmluZywgIl9fRFlOQU1JQyIpICE9IDAKLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Quc3RyaW5nLCAiX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpICE9IDApCi0JICAgIHsKLQkgICAgICBmaW5kX2Fzc2lnbiA9IGgtPnJvb3Quc3RyaW5nOwotCSAgICAgIGZvdW5kX2Fzc2lnbiA9IGZhbHNlOwotCSAgICAgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2Fzc2lnbm1lbnQpOwotCSAgICAgIGlmICghIGZvdW5kX2Fzc2lnbikKLQkJewotCQkgIGxpbmtfaW5mby5zaGFyZWQgPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChsaW5rX2luZm8uc2hhcmVkKQotICAgIHsKLSAgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0gICAgICAvKiBTZXQgdGhlIC50ZXh0IHNlY3Rpb24gdG8gc3RhcnQgYXQgMHgyMCwgbm90IDB4MjAyMC4gIEZJWE1FOgotICAgICAgICAgVGhpcyBpcyB0b28gbWFnaWNhbC4gICovCi0gICAgICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAoIi50ZXh0Iik7Ci0gICAgICBpZiAob3MtPmFkZHJfdHJlZSA9PSBOVUxMKQotCW9zLT5hZGRyX3RyZWUgPSBleHBfaW50b3AgKDB4MjApOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSBhIF9fRFlOQU1JQyBzeW1ib2wuICBXZSBkb24ndCBkbyB0aGlzIGluIHRoZQotICAgICBsaW5rZXIgc2NyaXB0IGJlY2F1c2Ugd2Ugd2FudCB0byBzZXQgdGhlIHZhbHVlIHRvIHRoZSBzdGFydCBvZgotICAgICB0aGUgZHluYW1pYyBzZWN0aW9uIGlmIHRoZXJlIGlzIG9uZSwgb3IgdG8gemVybyBpZiB0aGVyZSBpc24ndAotICAgICBvbmUuICBXZSBuZWVkIHRvIGNyZWF0ZSB0aGUgc3ltYm9sIGJlZm9yZSBjYWxsaW5nCi0gICAgIHNpemVfZHluYW1pY19zZWN0aW9ucywgYWx0aG91Z2ggd2UgY2FuJ3Qgc2V0IHRoZSB2YWx1ZSB1bnRpbAotICAgICBhZnRlcndhcmQuICAqLwotICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIGhkeW4gPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsICJfX0RZTkFNSUMiLCB0cnVlLCBmYWxzZSwKLQkJCQkgICBmYWxzZSk7Ci0gICAgICBpZiAoaGR5biA9PSBOVUxMKQotCWVpbmZvICgiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXA6ICVFXG4iKTsKLSAgICAgIGlmICghIGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50IChvdXRwdXRfYmZkLCAmbGlua19pbmZvLAotCQkJCQkgICAgICAiX19EWU5BTUlDIikpCi0JZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gcmVjb3JkIGFzc2lnbm1lbnQgdG8gX19EWU5BTUlDOiAlRVxuIik7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBnb2luZyB0byBtYWtlIGFueSB2YXJpYWJsZSBhc3NpZ25tZW50cywgd2UgbmVlZCB0byBsZXQKLSAgICAgdGhlIGJhY2tlbmQgbGlua2VyIGtub3cgYWJvdXQgdGhlbSBpbiBjYXNlIHRoZSB2YXJpYWJsZXMgYXJlCi0gICAgIHJlZmVycmVkIHRvIGJ5IGR5bmFtaWMgb2JqZWN0cy4gICovCi0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2Fzc2lnbm1lbnQpOwotCi0gIC8qIExldCB0aGUgYmFja2VuZCBsaW5rZXIgd29yayBvdXQgdGhlIHNpemVzIG9mIGFueSBzZWN0aW9ucwotICAgICByZXF1aXJlZCBieSBkeW5hbWljIGxpbmtpbmcuICAqLwotICBpZiAoISBiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCAmc2R5biwKLQkJCQkJICZzbmVlZCwgJnNydWxlcykpCi0gICAgZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gc2V0IGR5bmFtaWMgc2VjdGlvbiBzaXplczogJUVcbiIpOwotCi0gIGlmIChzbmVlZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCB1cCB0aGUgLm5lZWQgc2VjdGlvbi4gIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGxkX25lZWQKLQkgZmllbGQgaW4gaW5jbHVkZS9hb3V0L3N1bjQuaC4gICovCi0KLSAgICAgIG5lZWRfZW50cmllcyA9IDA7Ci0gICAgICBuZWVkX3NpemUgPSAwOwotCi0gICAgICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NvdW50X25lZWQpOwotCi0gICAgICAvKiBXZSBzaG91bGQgb25seSBoYXZlIGEgLm5lZWQgc2VjdGlvbiBpZiB3ZSBoYXZlIGF0IGxlYXN0IG9uZQotCSBkeW5hbWljIG9iamVjdC4gICovCi0gICAgICBBU1NFUlQgKG5lZWRfZW50cmllcyAhPSAwKTsKLQotICAgICAgc25lZWQtPl9yYXdfc2l6ZSA9IG5lZWRfc2l6ZTsKLSAgICAgIHNuZWVkLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChuZWVkX3NpemUpOwotCi0gICAgICBuZWVkX2NvbnRlbnRzID0gc25lZWQtPmNvbnRlbnRzOwotICAgICAgbmVlZF9waW5mbyA9IHNuZWVkLT5jb250ZW50czsKLSAgICAgIG5lZWRfcG5hbWVzID0gc25lZWQtPmNvbnRlbnRzICsgbmVlZF9lbnRyaWVzICogMTY7Ci0KLSAgICAgIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2V0X25lZWQpOwotCi0gICAgICBBU1NFUlQgKChiZmRfc2l6ZV90eXBlKSAobmVlZF9wbmFtZXMgLSBzbmVlZC0+Y29udGVudHMpID09IG5lZWRfc2l6ZSk7Ci0gICAgfQotCi0gIGlmIChzcnVsZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdXAgdGhlIC5ydWxlcyBzZWN0aW9uLiAgVGhpcyBpcyBqdXN0IGEgUEFUSCBsaWtlIHN0cmluZwotCSBvZiB0aGUgLUwgYXJndW1lbnRzIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICBXZSBwZXJtaXQgdGhlCi0JIHVzZXIgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3JpZXMgdXNpbmcgdGhlIC1ycGF0aCBjb21tYW5kIGxpbmUKLQkgb3B0aW9uLiAgKi8KLSAgICAgIGlmIChjb21tYW5kX2xpbmUucnBhdGgpCi0JewotCSAgc3J1bGVzLT5fcmF3X3NpemUgPSBzdHJsZW4gKGNvbW1hbmRfbGluZS5ycGF0aCk7Ci0JICBzcnVsZXMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGNvbW1hbmRfbGluZS5ycGF0aDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgaW50IHNpemU7Ci0JICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0KLQkgIHNpemUgPSAwOwotCSAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsgc2VhcmNoICE9IE5VTEw7IHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkKLQkgICAgaWYgKHNlYXJjaC0+Y21kbGluZSkKLQkgICAgICBzaXplICs9IHN0cmxlbiAoc2VhcmNoLT5uYW1lKSArIDE7Ci0JICBzcnVsZXMtPl9yYXdfc2l6ZSA9IHNpemU7Ci0JICBpZiAoc2l6ZSA+IDApCi0JICAgIHsKLQkgICAgICBjaGFyICpwOwotCi0JICAgICAgc3J1bGVzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChzaXplKTsKLQkgICAgICBwID0gKGNoYXIgKikgc3J1bGVzLT5jb250ZW50czsKLQkgICAgICAqcCA9ICdcMCc7Ci0JICAgICAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsgc2VhcmNoICE9IE5VTEw7IHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkKLQkJewotCQkgIGlmIChzZWFyY2gtPmNtZGxpbmUpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChwICE9IChjaGFyICopIHNydWxlcy0+Y29udGVudHMpCi0JCQkqcCsrID0gJzonOwotCQkgICAgICBzdHJjcHkgKHAsIHNlYXJjaC0+bmFtZSk7Ci0JCSAgICAgIHAgKz0gc3RybGVuIChwKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBXZSBtdXN0IGFzc2lnbiBhIHZhbHVlIHRvIF9fRFlOQU1JQy4gIEl0IHNob3VsZCBiZSB6ZXJvIGlmIHdlIGFyZQotICAgICBub3QgZG9pbmcgYSBkeW5hbWljIGxpbmssIG9yIHRoZSBzdGFydCBvZiB0aGUgLmR5bmFtaWMgc2VjdGlvbiBpZgotICAgICB3ZSBhcmUgZG9pbmcgb25lLiAgKi8KLSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBoZHluLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotICAgICAgaGR5bi0+dS5kZWYudmFsdWUgPSAwOwotICAgICAgaWYgKHNkeW4gIT0gTlVMTCkKLQloZHluLT51LmRlZi5zZWN0aW9uID0gc2R5bjsKLSAgICAgIGVsc2UKLQloZHluLT51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBiZWZvcmVfYWxsb2NhdGlvbiByb3V0aW5lIHZpYQotICAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQuICBJdCBkb2VzIG9uZSBvZiB0d28gdGhpbmdzOiBpZiB0aGUKLSAgIHZhcmlhYmxlIGZpbmRfYXNzaWduIGlzIHNldCwgaXQgc2V0cyBmb3VuZF9hc3NpZ24gaWYgaXQgZmluZHMgYW4KLSAgIGFzc2lnbm1lbnQgdG8gdGhhdCB2YXJpYWJsZTsgb3RoZXJ3aXNlIGl0IHRlbGxzIHRoZSBiYWNrZW5kIGxpbmtlcgotICAgYWJvdXQgYWxsIGFzc2lnbm1lbnQgc3RhdGVtZW50cywgaW4gY2FzZSB0aGV5IGFyZSBhc3NpZ25tZW50cyB0bwotICAgc3ltYm9scyB3aGljaCBhcmUgcmVmZXJyZWQgdG8gYnkgZHluYW1pYyBvYmplY3RzLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYXNzaWdubWVudCAocykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgaWYgKHMtPmhlYWRlci50eXBlID09IGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bQotICAgICAgJiYgKGZpbmRfYXNzaWduID09IE5VTEwgfHwgISBmb3VuZF9hc3NpZ24pKQotICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCk7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCBhbiBleHByZXNzaW9uIGZvciBhbiBhc3NpZ25tZW50IHN0YXRlbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHApCi0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgc3dpdGNoIChleHAtPnR5cGUubm9kZV9jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBldHJlZV9hc3NpZ246Ci0gICAgICBpZiAoZmluZF9hc3NpZ24gIT0gTlVMTCkKLQl7Ci0JICBpZiAoc3RyY21wIChmaW5kX2Fzc2lnbiwgZXhwLT5hc3NpZ24uZHN0KSA9PSAwKQotCSAgICBmb3VuZF9hc3NpZ24gPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKHN0cmNtcCAoZXhwLT5hc3NpZ24uZHN0LCAiLiIpICE9IDApCi0JewotCSAgaWYgKCEgYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sCi0JCQkJCQkgIGV4cC0+YXNzaWduLmRzdCkpCi0JICAgIGVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHJlY29yZCBhc3NpZ25tZW50IHRvICVzOiAlRVxuIiwKLQkJICAgZXhwLT5hc3NpZ24uZHN0KTsKLQl9Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmFzc2lnbi5zcmMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX2JpbmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5Lmxocyk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3RyaW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkuY29uZCk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkubGhzKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3VuYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT51bmFyeS5jaGlsZCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIFdvcmsgb3V0IHRoZSBzaXplIG9mIHRoZSAubmVlZCBzZWN0aW9uLCBhbmQgdGhlIG51bWJlciBvZiBlbnRyaWVzLgotICAgVGhlIGJhY2tlbmQgd2lsbCBzZXQgdGhlIGxkX25lZWQgZmllbGQgb2YgdGhlIGR5bmFtaWMgbGlua2luZwotICAgaW5mb3JtYXRpb24gdG8gcG9pbnQgdG8gdGhlIC5uZWVkIHNlY3Rpb24uICBTZWUgaW5jbHVkZS9hb3V0L3N1bjQuaAotICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fY291bnRfbmVlZCAoaW5wKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppbnA7Ci17Ci0gIGlmIChpbnAtPnRoZV9iZmQgIT0gTlVMTAotICAgICAgJiYgKGlucC0+dGhlX2JmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgIHsKLSAgICAgICsrbmVlZF9lbnRyaWVzOwotICAgICAgbmVlZF9zaXplICs9IE5FRURfRU5UUllfU0laRTsKLSAgICAgIGlmICghIGlucC0+aXNfYXJjaGl2ZSkKLQluZWVkX3NpemUgKz0gc3RybGVuIChpbnAtPmZpbGVuYW1lKSArIDE7Ci0gICAgICBlbHNlCi0JewotCSAgQVNTRVJUIChpbnAtPmxvY2FsX3N5bV9uYW1lWzBdID09ICctJwotCQkgICYmIGlucC0+bG9jYWxfc3ltX25hbWVbMV0gPT0gJ2wnKTsKLQkgIG5lZWRfc2l6ZSArPSBzdHJsZW4gKGlucC0+bG9jYWxfc3ltX25hbWUgKyAyKSArIDE7Ci0JfQotICAgIH0KLX0KLQotLyogRmlsbCBpbiB0aGUgY29udGVudHMgb2YgdGhlIC5uZWVkIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2V0X25lZWQgKGlucCkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqaW5wOwotewotICBpZiAoaW5wLT50aGVfYmZkICE9IE5VTEwKLSAgICAgICYmIChpbnAtPnRoZV9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGM7Ci0KLSAgICAgIC8qIFRvIHJlYWxseSBmaWxsIGluIHRoZSAubmVlZCBzZWN0aW9uIGNvbnRlbnRzLCB3ZSBuZWVkIHRvIGtub3cKLQkgdGhlIGZpbmFsIGZpbGUgcG9zaXRpb24gb2YgdGhlIHNlY3Rpb24sIGJ1dCB3ZSBkb24ndC4KLQkgSW5zdGVhZCwgd2UgdXNlIG9mZnNldHMsIGFuZCByZWx5IG9uIHRoZSBCRkQgYmFja2VuZCB0bwotCSBmaW5pc2ggdGhlIHNlY3Rpb24gdXAgY29ycmVjdGx5LiAgRklYTUU6IFRhbGsgYWJvdXQgbGFjayBvZgotCSByZWZlcmVudGlhbCBsb2NhbGl0eS4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZWVkX3BuYW1lcyAtIG5lZWRfY29udGVudHMsIG5lZWRfcGluZm8pOwotICAgICAgaWYgKCEgaW5wLT5pc19hcmNoaXZlKQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBuZWVkX3BpbmZvICsgNCk7Ci0JICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgbmVlZF9waW5mbyArIDgpOwotCSAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIG5lZWRfcGluZm8gKyAxMCk7Ci0JICBzdHJjcHkgKG5lZWRfcG5hbWVzLCBpbnAtPmZpbGVuYW1lKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqdmVyc3RyOwotCSAgaW50IG1haiwgbWluOwotCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMHg4MDAwMDAwMCwgbmVlZF9waW5mbyArIDQpOwotCSAgbWFqID0gMDsKLQkgIG1pbiA9IDA7Ci0JICB2ZXJzdHIgPSBzdHJzdHIgKGlucC0+ZmlsZW5hbWUsICIuc28uIik7Ci0JICBpZiAodmVyc3RyICE9IE5VTEwpCi0JICAgIHNzY2FuZiAodmVyc3RyLCAiLnNvLiVkLiVkIiwgJm1haiwgJm1pbik7Ci0JICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgbWFqLCBuZWVkX3BpbmZvICsgOCk7Ci0JICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgbWluLCBuZWVkX3BpbmZvICsgMTApOwotCSAgc3RyY3B5IChuZWVkX3BuYW1lcywgaW5wLT5sb2NhbF9zeW1fbmFtZSArIDIpOwotCX0KLQotICAgICAgYyA9IChuZWVkX3BpbmZvIC0gbmVlZF9jb250ZW50cykgLyBORUVEX0VOVFJZX1NJWkU7Ci0gICAgICBpZiAoYyArIDEgPj0gbmVlZF9lbnRyaWVzKQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBuZWVkX3BpbmZvICsgMTIpOwotICAgICAgZWxzZQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAoYyArIDEpICogTkVFRF9FTlRSWV9TSVpFLAotCQkgICAgbmVlZF9waW5mbyArIDEyKTsKLQotICAgICAgbmVlZF9waW5mbyArPSBORUVEX0VOVFJZX1NJWkU7Ci0gICAgICBuZWVkX3BuYW1lcyArPSBzdHJsZW4gKG5lZWRfcG5hbWVzKSArIDE7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9J3MvWyJcXF0vXFwmL2cKLXMvJC9cXG5cXC8KLTFzL14vIi8KLSRzLyQvbiIvCi0nCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1YDsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cmA7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibmA7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54bmA7Ci0gIGVsc2UKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGA7Ci19Ci1FT0YKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4sCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgTlVMTCwgLyogZmluaXNoICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzLAotICBOVUxMLCAvKiBvcGVuX2R5bmFtaWNfbGlicmFyeSAqLwotICBOVUxMLCAvKiBwbGFjZV9vcnBoYW4gKi8KLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC92YW5pbGxhLmVtIGIvbGQvZW11bHRlbXBsL3ZhbmlsbGEuZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTM2ZmIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL3ZhbmlsbGEuZW0KKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBBIHZhbmlsbGEgZW11bGF0aW9uIHdpdGggbm8gZGVmYXVsdHMKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc3RldmVAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0KLXN0YXRpYyB2b2lkIHZhbmlsbGFfYmVmb3JlX3BhcnNlKCkKLXsKLX0KLQotc3RhdGljIHZvaWQKLXZhbmlsbGFfc2V0X291dHB1dF9hcmNoKCkKLXsKLSAgLyogU2V0IHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIGlmIHBvc3NpYmxlICovCi0gIHVuc2lnbmVkIGxvbmcgIG1hY2hpbmUgPSAwOwotICBiZmRfc2V0X2FyY2hfbWFjaChvdXRwdXRfYmZkLCBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSwgbWFjaGluZSk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXZhbmlsbGFfZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotewotICAqaXNmaWxlID0gMDsKLSAgcmV0dXJuICIiOwotfQotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX3ZhbmlsbGFfZW11bGF0aW9uID0gCi17Ci0gIHZhbmlsbGFfYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGFmdGVyX29wZW5fZGVmYXVsdCwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICB2YW5pbGxhX3NldF9vdXRwdXRfYXJjaCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICB2YW5pbGxhX2dldF9zY3JpcHQsCi0gICJ2YW5pbGxhIiwKLSAgImEub3V0LXN1bm9zLWJpZyIKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2dlbi1kb2MudGV4aSBiL2xkL2dlbi1kb2MudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzNjcyNy4uMDAwMDAwMAotLS0gYS9sZC9nZW4tZG9jLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1AYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ09ORklHVVJBVElPTiBWQVJTOgotQGMgMS4gSW5jbHVzaXZlbmVzcyBvZiB0aGlzIG1hbnVhbAotQHNldCBHRU5FUklDCi0KLUBjIDIuIFNwZWNpZmljIHRhcmdldCBtYWNoaW5lcwotQHNldCBIODMwMAotQHNldCBJOTYwCi0KLUBjIDMuIFByb3BlcnRpZXMgb2YgdGhpcyBjb25maWd1cmF0aW9uCi1AY2xlYXIgU2luZ2xlRm9ybWF0Ci1Ac2V0IFVzZXNFbnZWYXJzCi1AYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZW5kIENPTkZJR1VSQVRJT04gVkFSUwotCmRpZmYgLS1naXQgYS9sZC9nZW5zY3JpcHRzLnNoIGIvbGQvZ2Vuc2NyaXB0cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWVhNTQwMS4uMDAwMDAwMAotLS0gYS9sZC9nZW5zY3JpcHRzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLSMhL2Jpbi9zaAotIyBnZW5zY3JpcHRzLnNoIC0gZ2VuZXJhdGUgdGhlIGxkLWVtdWxhdGlvbi10YXJnZXQgc3BlY2lmaWMgZmlsZXMKLSMKLSMgVXNhZ2U6IGdlbnNjcmlwdHMuc2ggc3JjZGlyIGxpYmRpciBob3N0IHRhcmdldCB0YXJnZXRfYWxpYXMgXAotIyBkZWZhdWx0X2VtdWxhdGlvbiBuYXRpdmVfbGliX2RpcnMgdGhpc19lbXVsYXRpb24gdG9vbF9kaXIKLSMKLSMgU2FtcGxlIHVzYWdlOgotIyBnZW5zY3JpcHRzLnNoIC9kam0vbGQtZGV2by9kZXZvL2xkIC91c3IvbG9jYWwvbGliIHNwYXJjLXN1bi1zdW5vczQuMS4zIFwKLSMgc3BhcmMtc3VuLXN1bm9zNC4xLjMgc3BhcmMtc3VuLXN1bm9zNC4xLjMgc3VuNCAiIiBzdW4zIHNwYXJjLXN1bi1zdW5vczQuMS4zCi0jIHByb2R1Y2VzIHN1bjMueCBzdW4zLnhibiBzdW4zLnhuIHN1bjMueHIgc3VuMy54dSBlbV9zdW4zLmMKLQotc3JjZGlyPSQxCi1saWJkaXI9JDIKLWhvc3Q9JDMKLXRhcmdldD0kNAotdGFyZ2V0X2FsaWFzPSQ1Ci1ERUZBVUxUX0VNVUxBVElPTj0kNgotTkFUSVZFX0xJQl9ESVJTPSQ3Ci1FTVVMQVRJT05fTkFNRT0kOAotdG9vbF9saWI9YGVjaG8gJHtsaWJkaXJ9IHwgc2VkIC1lICdzfC9saWIkfHwnYC8kezktJHRhcmdldF9hbGlhc30vbGliCi0KLSMgSW5jbHVkZSB0aGUgZW11bGF0aW9uLXNwZWNpZmljIHBhcmFtZXRlcnM6Ci0uICR7c3JjZGlyfS9lbXVscGFyYW1zLyR7RU1VTEFUSU9OX05BTUV9LnNoCi0KLWlmIHRlc3QgLWQgbGRzY3JpcHRzOyB0aGVuCi0gIHRydWUKLWVsc2UKLSAgbWtkaXIgbGRzY3JpcHRzCi1maQotCi0jIFNldCB0aGUgbGlicmFyeSBzZWFyY2ggcGF0aCwgZm9yIGxpYnJhcmllcyBuYW1lZCBieSAtbGZvby4KLSMgSWYgTElCX1BBVEggaXMgZGVmaW5lZCAoZS5nLiwgYnkgTWFrZWZpbGUpIGFuZCBub24tZW1wdHksIGl0IGlzIHVzZWQuCi0jIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgaXMgc2V0IGhlcmUuCi0jCi0jIFRoZSBmb3JtYXQgaXMgdGhlIHVzdWFsIGxpc3Qgb2YgY29sb24tc2VwYXJhdGVkIGRpcmVjdG9yaWVzLgotIyBUbyBmb3JjZSBhIGxvZ2ljYWxseSBlbXB0eSBMSUJfUEFUSCwgZG8gTElCUEFUSD0iOiIuCi0KLWlmIFsgIngke0xJQl9QQVRIfSIgPSAieCIgXSA7IHRoZW4KLSAgaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gICAgaWYgWyAieCR7REVGQVVMVF9FTVVMQVRJT059IiA9ICJ4JHtFTVVMQVRJT05fTkFNRX0iIF0gOyB0aGVuCi0gICAgICAjIE5hdGl2ZS4KLSAgICAgIExJQl9QQVRIPS9saWI6L3Vzci9saWIKLSAgICAgIGlmIFsgLW4gIiR7TkFUSVZFX0xJQl9ESVJTfSIgXTsgdGhlbgotCUxJQl9QQVRIPSR7TElCX1BBVEh9OiR7TkFUSVZFX0xJQl9ESVJTfQotICAgICAgZmkKLSAgICAgIGlmIFsgIiR7bGliZGlyfSIgIT0gL3Vzci9saWIgXTsgdGhlbgotCUxJQl9QQVRIPSR7TElCX1BBVEh9OiR7bGliZGlyfQotICAgICAgZmkKLSAgICAgIGlmIFsgIiR7bGliZGlyfSIgIT0gL3Vzci9sb2NhbC9saWIgXSA7IHRoZW4KLQlMSUJfUEFUSD0ke0xJQl9QQVRIfTovdXNyL2xvY2FsL2xpYgotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICAjIE5hdGl2ZSwgYnV0IG5vdCBkZWZhdWx0IGVtdWxhdGlvbi4KLSAgICAgIExJQl9QQVRIPQotICAgIGZpCi0gIGVsc2UKLSAgICAjIENyb3NzLgotICAgIExJQl9QQVRIPQotICBmaQotZmkKLQotIyBBbHdheXMgc2VhcmNoICQodG9vbGRpcikvbGliLCBha2EgL3Vzci9sb2NhbC9UQVJHRVQvbGliLgotTElCX1BBVEg9JHtMSUJfUEFUSH06JHt0b29sX2xpYn0KLQotTElCX1NFQVJDSF9ESVJTPWBlY2hvICR7TElCX1BBVEh9IHwgdHIgJzonICcgJyB8IHNlZCAtZSAncy9cKFteIF1bXiBdKlwpL1NFQVJDSF9ESVIoXDEpOy9nJ2AKLQotIyBHZW5lcmF0ZSA1IG9yIDYgc2NyaXB0IGZpbGVzIGZyb20gYSBtYXN0ZXIgc2NyaXB0IHRlbXBsYXRlIGluCi0jICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zaC4gIFdoaWNoIG9uZSBvZiB0aGUgNSBvciA2Ci0jIHNjcmlwdCBmaWxlcyBpcyBhY3R1YWxseSB1c2VkIGRlcGVuZHMgb24gY29tbWFuZCBsaW5lIG9wdGlvbnMgZ2l2ZW4KLSMgdG8gbGQuICAoU0NSSVBUX05BTUUgd2FzIHNldCBpbiB0aGUgZW11bHBhcmFtc19maWxlLikKLSMKLSMgQSAueCBzY3JpcHQgZmlsZSBpcyB0aGUgZGVmYXVsdCBzY3JpcHQuCi0jIEEgLnhyIHNjcmlwdCBpcyBmb3IgbGlua2luZyB3aXRob3V0IHJlbG9jYXRpb24gKC1yIGZsYWcpLgotIyBBIC54dSBzY3JpcHQgaXMgbGlrZSAueHIsIGJ1dCAqZG8qIGNyZWF0ZSBjb25zdHJ1Y3RvcnMgKC1VciBmbGFnKS4KLSMgQSAueG4gc2NyaXB0IGlzIGZvciBsaW5raW5nIHdpdGggLW4gZmxhZyAobWl4IHRleHQgYW5kIGRhdGEgb24gc2FtZSBwYWdlKS4KLSMgQSAueGJuIHNjcmlwdCBpcyBmb3IgbGlua2luZyB3aXRoIC1OIGZsYWcgKG1peCB0ZXh0IGFuZCBkYXRhIG9uIHNhbWUgcGFnZSkuCi0jIEEgLnhzIHNjcmlwdCBpcyBmb3IgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5IHdpdGggdGhlIC0tc2hhcmVkCi0jICAgZmxhZzsgaXQgaXMgb25seSBnZW5lcmF0ZWQgaWYgJEdFTkVSQVRFX1NITElCX1NDUklQVCBpcyBzZXQgYnkgdGhlCi0jICAgZW11bGF0aW9uIHBhcmFtZXRlcnMuCi0KLVNFR01FTlRfU0laRT0ke1NFR01FTlRfU0laRS0ke1RBUkdFVF9QQUdFX1NJWkV9fQotCi0jIERldGVybWluZSBEQVRBX0FMSUdOTUVOVCBmb3IgdGhlIDUgdmFyaWFudHMsIHVzaW5nCi0jIHZhbHVlcyBzcGVjaWZpZWQgaW4gdGhlIGVtdWxwYXJhbXMvPGVtdWxhdGlvbj4uc2ggZmlsZSBvciBkZWZhdWx0LgotCi1EQVRBX0FMSUdOTUVOVF89IiR7REFUQV9BTElHTk1FTlRfLSR7REFUQV9BTElHTk1FTlQtQUxJR04oJHtTRUdNRU5UX1NJWkV9KX19IgotREFUQV9BTElHTk1FTlRfbj0iJHtEQVRBX0FMSUdOTUVOVF9uLSR7REFUQV9BTElHTk1FTlRffX0iCi1EQVRBX0FMSUdOTUVOVF9OPSIke0RBVEFfQUxJR05NRU5UX04tJHtEQVRBX0FMSUdOTUVOVC0ufX0iCi1EQVRBX0FMSUdOTUVOVF9yPSIke0RBVEFfQUxJR05NRU5UX3ItJHtEQVRBX0FMSUdOTUVOVC19fSIKLURBVEFfQUxJR05NRU5UX3U9IiR7REFUQV9BTElHTk1FTlRfdS0ke0RBVEFfQUxJR05NRU5UX3J9fSIKLQotTERfRkxBRz1yCi1EQVRBX0FMSUdOTUVOVD0ke0RBVEFfQUxJR05NRU5UX3J9Ci1ERUZBVUxUX0RBVEFfQUxJR05NRU5UPSJBTElHTigke1NFR01FTlRfU0laRX0pIgotKC4gJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNjKSB8IHNlZCAtZSAnL14gKiQvZCcgPiBcCi0gIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cgotCi1MRF9GTEFHPXUKLURBVEFfQUxJR05NRU5UPSR7REFUQV9BTElHTk1FTlRfdX0KLUNPTlNUUlVDVElORz0iICIKLSguICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zYykgfCBzZWQgLWUgJy9eICokL2QnID4gXAotICBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUKLQotTERfRkxBRz0KLURBVEFfQUxJR05NRU5UPSR7REFUQV9BTElHTk1FTlRffQotUkVMT0NBVElORz0iICIKLSguICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zYykgfCBzZWQgLWUgJy9eICokL2QnID4gXAotICBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueAotCi1MRF9GTEFHPW4KLURBVEFfQUxJR05NRU5UPSR7REFUQV9BTElHTk1FTlRfbn0KLVRFWFRfU1RBUlRfQUREUj0ke05PTlBBR0VEX1RFWFRfU1RBUlRfQUREUi0ke1RFWFRfU1RBUlRfQUREUn19Ci0oLiAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2MpIHwgc2VkIC1lICcvXiAqJC9kJyA+IFwKLSAgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuCi0KLUxEX0ZMQUc9TgotREFUQV9BTElHTk1FTlQ9JHtEQVRBX0FMSUdOTUVOVF9OfQotKC4gJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNjKSB8IHNlZCAtZSAnL14gKiQvZCcgPiBcCi0gIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4KLQotaWYgdGVzdCAtbiAiJEdFTkVSQVRFX1NITElCX1NDUklQVCI7IHRoZW4KLSAgTERfRkxBRz1zaGFyZWQKLSAgREFUQV9BTElHTk1FTlQ9JHtEQVRBX0FMSUdOTUVOVF9zLSR7REFUQV9BTElHTk1FTlRffX0KLSAgQ1JFQVRFX1NITElCPSIgIgotICAjIE5vdGUgdGhhdCBURVhUX1NUQVJUX0FERFIgaXMgc2V0IHRvIE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUi4KLSAgKC4gJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNjKSB8IHNlZCAtZSAnL14gKiQvZCcgPiBcCi0gICAgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhzCi1maQotCi10ZXN0ICIkREVGQVVMVF9FTVVMQVRJT04iID0gIiRFTVVMQVRJT05fTkFNRSIgJiYgQ09NUElMRV9JTj10cnVlCi0KLSMgR2VuZXJhdGUgZSR7RU1VTEFUSU9OX05BTUV9LmMuCi0uICR7c3JjZGlyfS9lbXVsdGVtcGwvJHtURU1QTEFURV9OQU1FLWdlbmVyaWN9LmVtCmRpZmYgLS1naXQgYS9sZC9oOC1kb2MudGV4aSBiL2xkL2g4LWRvYy50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2M2MmExLi4wMDAwMDAwCi0tLSBhL2xkL2g4LWRvYy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENPTkZJR1VSQVRJT04gVkFSUzoKLUBjIDEuIEluY2x1c2l2ZW5lc3Mgb2YgdGhpcyBtYW51YWwKLUBjbGVhciBHRU5FUklDCi0KLUBjIDIuIFNwZWNpZmljIHRhcmdldCBtYWNoaW5lcwotQHNldCBIODMwMAotQHNldCBIaXRhY2hpCi1AY2xlYXIgSTk2MAotCi1AYyAzLiBQcm9wZXJ0aWVzIG9mIHRoaXMgY29uZmlndXJhdGlvbgotQHNldCBTaW5nbGVGb3JtYXQKLUBjbGVhciBVc2VzRW52VmFycwotQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVuZCBDT05GSUdVUkFUSU9OIFZBUlMKLQpkaWZmIC0tZ2l0IGEvbGQvbGQuMSBiL2xkL2xkLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NTE2YjkuLjAwMDAwMDAKLS0tIGEvbGQvbGQuMQorKysgL2Rldi9udWxsCkBAIC0xLDExMTUgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBsZCAxICIxNyBBdWd1c3QgMTk5MiIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLWxkIFwtIHRoZSBHTlUgbGlua2VyCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBsZCAKLS5SQiAiW1x8IiBcLW8gIgotLkkgb3V0cHV0XGMKLVwmXHxdIFxjCi0uSSBvYmpmaWxlXGMKLVwmLlx8Llx8LgotLmJyCi0uUkIgIltcfCIgXC1BXGMKLS5JIGFyY2hpdGVjdHVyZVxjCi1cJlx8XSAKLS5SQiAiW1x8IiAiXC1iXCAiXGMKLS5JIGlucHV0LWZvcm1hdFxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLUJzdGF0aWMgIlx8XSIgIAotLlJCICJbXHwiIFwtQmR5bmFtaWMgIlx8XSIgIAotLlJCICJbXHwiIFwtQnN5bWJvbGljICJcfF0iICAKLS5SQiAiW1x8IiAiXC1jXCAiXGMKLS5JIGNvbW1hbmRmaWxlXGMKLVwmXHxdIAotLlJCICJbXHwiIFwtXC1jcmVmICJcfF0iCi0uUkIgIltcfCIgXC1kIHwgXC1kYyB8IFwtZHBcYwotXHxdCi0uYnIKLS5SQiAiW1x8IiAiXC1kZWZzeW1cICJcYwotLkkgc3ltYm9sXGMKLVwmID0gXGMKLS5JIGV4cHJlc3Npb25cYwotXCZcfF0KLS5SQiAiW1x8IiBcLVwtZGVtYW5nbGUgIlx8XSIKLS5SQiAiW1x8IiBcLVwtbm9cLWRlbWFuZ2xlICJcfF0iCi0uUkIgIltcfCIgIlwtZVwgIlxjCi0uSSBlbnRyeVxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLWVtYmVkZGVkXC1yZWxvY3MgIlx8XSIKLS5SQiAiW1x8IiBcLUUgIlx8XSIgCi0uUkIgIltcfCIgXC1leHBvcnRcLWR5bmFtaWMgIlx8XSIKLS5SQiAiW1x8IiAiXC1mXCAiXGMKLS5JIG5hbWVcYwotXCZcfF0KLS5SQiAiW1x8IiAiXC1cLWF1eGlsaWFyeVwgIlxjCi0uSSBuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtRlwgIlxjCi0uSSBuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtXC1maWx0ZXJcICJcYwotLkkgbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiICJcLWZvcm1hdFwgIlxjCi0uSSBpbnB1dC1mb3JtYXRcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1nICJcfF0iIAotLlJCICJbXHwiIFwtRwotLkkgc2l6ZVxjCi1cJlx8XQotLlJCICJbXHwiICJcLWhcICJcYwotLkkgbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiICJcLXNvbmFtZVwgIlxjCi0uSSBuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIKLS5SQiAiW1x8IiBcLWkgIlx8XSIKLS5SQiAiW1x8IiBcLWxcYwotLkkgYXJcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1MXGMKLS5JIHNlYXJjaGRpclxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLU0gIlx8XSIgCi0uUkIgIltcfCIgXC1NYXAKLS5JIG1hcGZpbGVcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1tCi0uSSBlbXVsYXRpb25cYwotXCZcfF0gCi0uUkIgIltcfCIgXC1uIHwgXC1OICJcfF0iIAotLlJCICJbXHwiIFwtbm9pbmhpYml0LWV4ZWMgIlx8XSIgCi0uUkIgIltcfCIgXC1ub1wta2VlcFwtbWVtb3J5ICJcfF0iIAotLlJCICJbXHwiIFwtbm9cLXdhcm5cLW1pc21hdGNoICJcfF0iIAotLlJCICJbXHwiIFwtT1xjCi0uSSBsZXZlbFxjCi1cJlx8XQotLlJCICJbXHwiICJcLW9mb3JtYXRcICJcYwotLkkgb3V0cHV0LWZvcm1hdFxjCi1cJlx8XSAKLS5SQiAiW1x8IiAiXC1SXCAiXGMKLS5JIGZpbGVuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1yZWxheCAiXHxdIgotLlJCICJbXHwiIFwtciB8IFwtVXIgIlx8XSIgCi0uUkIgIltcfCIgIlwtcnBhdGhcICJcYwotLkkgZGlyZWN0b3J5XGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtcnBhdGhcLWxpbmtcICJcYwotLkkgZGlyZWN0b3J5XGMKLVwmXHxdCi0uUkIgIltcfCIgXC1TICJcfF0iIAotLlJCICJbXHwiIFwtcyAiXHxdIiAKLS5SQiAiW1x8IiBcLXNoYXJlZCAiXHxdIiAKLS5SQiAiW1x8IiBcLXNvcnRcLWNvbW1vbiAiXHxdIiAKLS5SQiAiW1x8IiAiXC1zcGxpdFwtYnlcLXJlbG9jXCAiXGMKLS5JIGNvdW50XGMKLVwmXHxdCi0uUkIgIltcfCIgXC1zcGxpdFwtYnlcLWZpbGUgIlx8XSIgCi0uUkIgIltcfCIgIlwtVFwgIlxjCi0uSSBjb21tYW5kZmlsZVxjCi1cJlx8XSAgCi0uUkIgIltcfCIgIlwtVHRleHRcICJcYwotLkkgdGV4dG9yZ1xjCi1cJlx8XSAKLS5SQiAiW1x8IiAiXC1UZGF0YVwgIlxjCi0uSSBkYXRhb3JnXGMKLVwmXHxdIAotLlJCICJbXHwiICJcLVRic3NcICJcYwotLkkgYnNzb3JnXGMKLVwmXHxdCi0uUkIgIltcfCIgXC10ICJcfF0iIAotLlJCICJbXHwiICJcLXVcICJcYwotLkkgc3ltXGMKLVwmXQotLlJCICJbXHwiIFwtViAiXHxdIgotLlJCICJbXHwiIFwtdiAiXHxdIgotLlJCICJbXHwiIFwtXC12ZXJib3NlICJcfF0iCi0uUkIgIltcfCIgXC1cLXZlcnNpb24gIlx8XSIKLS5SQiAiW1x8IiBcLXdhcm5cLWNvbW1vbiAiXHxdIiAKLS5SQiAiW1x8IiBcLXdhcm5cLWNvbnN0cnVjdG9ycyAiXHxdIiAKLS5SQiAiW1x8IiBcLXdhcm5cLW11bHRpcGxlXC1ncCAiXHxdIiAKLS5SQiAiW1x8IiBcLXdhcm5cLW9uY2UgIlx8XSIgCi0uUkIgIltcfCIgXC13YXJuXC1zZWN0aW9uXC1hbGlnbiAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtd2hvbGVcLWFyY2hpdmUgIlx8XSIgCi0uUkIgIltcfCIgXC1cLW5vXC13aG9sZVwtYXJjaGl2ZSAiXHxdIiAKLS5SQiAiW1x8IiAiXC1cLXdyYXBcICJcYwotLkkgc3ltYm9sXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1YICJcfF0iIAotLlJCICJbXHwiIFwteCAiXHxdIiAKLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1cYwotLkIgbGRcYwotXCYgY29tYmluZXMgYSBudW1iZXIgb2Ygb2JqZWN0IGFuZCBhcmNoaXZlIGZpbGVzLCByZWxvY2F0ZXMKLXRoZWlyIGRhdGEgYW5kIHRpZXMgdXAgc3ltYm9sIHJlZmVyZW5jZXMuIE9mdGVuIHRoZSBsYXN0IHN0ZXAgaW4KLWJ1aWxkaW5nIGEgbmV3IGNvbXBpbGVkIHByb2dyYW0gdG8gcnVuIGlzIGEgY2FsbCB0byBcYwotLkIgbGRcYwotXCYuCi0KLVxjCi0uQiBsZFxjCi1cJiBhY2NlcHRzIExpbmtlciBDb21tYW5kIExhbmd1YWdlIGZpbGVzIAotdG8gcHJvdmlkZSBleHBsaWNpdCBhbmQgdG90YWwgY29udHJvbCBvdmVyIHRoZSBsaW5raW5nIHByb2Nlc3MuCi1UaGlzIG1hbiBwYWdlIGRvZXMgbm90IGRlc2NyaWJlIHRoZSBjb21tYW5kIGxhbmd1YWdlOyBzZWUgdGhlIGBcfFxjCi0uQiBsZFxjCi1cfCcgZW50cnkgaW4gYFx8XGMKLS5CIGluZm9cYwotXHwnLCBvciB0aGUgbWFudWFsCi0uSQotbGQ6IHRoZSBHTlUgbGlua2VyCi1cJiwgZm9yIGZ1bGwgZGV0YWlscyBvbiB0aGUgY29tbWFuZCBsYW5ndWFnZSBhbmQgb24gb3RoZXIgYXNwZWN0cyBvZgotdGhlIEdOVSBsaW5rZXIuIAotCi1UaGlzIHZlcnNpb24gb2YgXGMKLS5CIGxkXGMKLVwmIHVzZXMgdGhlIGdlbmVyYWwgcHVycG9zZSBCRkQgbGlicmFyaWVzCi10byBvcGVyYXRlIG9uIG9iamVjdCBmaWxlcy4gVGhpcyBhbGxvd3MgXGMKLS5CIGxkXGMKLVwmIHRvIHJlYWQsIGNvbWJpbmUsIGFuZAotd3JpdGUgb2JqZWN0IGZpbGVzIGluIG1hbnkgZGlmZmVyZW50IGZvcm1hdHNcKGVtXCZmb3IgZXhhbXBsZSwgQ09GRiBvcgotXGMKLS5CIGEub3V0XGMKLVwmLiAgRGlmZmVyZW50IGZvcm1hdHMgbWF5IGJlIGxpbmtlZCB0b2dldGhlciB0byBwcm9kdWNlIGFueQotYXZhaWxhYmxlIGtpbmQgb2Ygb2JqZWN0IGZpbGUuICBZb3UgY2FuIHVzZSBgXHxcYwotLkIgb2JqZHVtcCBcLWlcYwotXHwnIHRvIGdldCBhIGxpc3Qgb2YgZm9ybWF0cyBzdXBwb3J0ZWQgb24gdmFyaW91cyBhcmNoaXRlY3R1cmVzOyBzZWUgCi0uQlIgb2JqZHVtcCAoIDEgKS4KLQotQXNpZGUgZnJvbSBpdHMgZmxleGliaWxpdHksIHRoZSBHTlUgbGlua2VyIGlzIG1vcmUgaGVscGZ1bCB0aGFuIG90aGVyCi1saW5rZXJzIGluIHByb3ZpZGluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiAgTWFueSBsaW5rZXJzIGFiYW5kb24KLWV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGVuY291bnRlcmluZyBhbiBlcnJvcjsgd2hlbmV2ZXIgcG9zc2libGUsCi1cYwotLkIgbGRcYwotXCYgY29udGludWVzIGV4ZWN1dGluZywgYWxsb3dpbmcgeW91IHRvIGlkZW50aWZ5IG90aGVyIGVycm9ycwotKG9yLCBpbiBzb21lIGNhc2VzLCB0byBnZXQgYW4gb3V0cHV0IGZpbGUgaW4gc3BpdGUgb2YgdGhlIGVycm9yKS4KLQotVGhlIEdOVSBsaW5rZXIgXGMKLS5CIGxkXGMKLVwmIGlzIG1lYW50IHRvIGNvdmVyIGEgYnJvYWQgcmFuZ2Ugb2Ygc2l0dWF0aW9ucywKLWFuZCB0byBiZSBhcyBjb21wYXRpYmxlIGFzIHBvc3NpYmxlIHdpdGggb3RoZXIgbGlua2Vycy4gIEFzIGEgcmVzdWx0LAoteW91IGhhdmUgbWFueSBjaG9pY2VzIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW9yIHRocm91Z2ggdGhlIGNvbW1hbmQgbGluZSwKLWFuZCB0aHJvdWdoIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLQotLlNIIE9QVElPTlMKLVRoZSBwbGV0aG9yYSBvZiBjb21tYW5kLWxpbmUgb3B0aW9ucyBtYXkgc2VlbSBpbnRpbWlkYXRpbmcsIGJ1dCBpbgotYWN0dWFsIHByYWN0aWNlIGZldyBvZiB0aGVtIGFyZSB1c2VkIGluIGFueSBwYXJ0aWN1bGFyIGNvbnRleHQuCi1Gb3IgaW5zdGFuY2UsIGEgZnJlcXVlbnQgdXNlIG9mIFxjCi0uQiBsZFxjCi1cJiBpcyB0byBsaW5rIHN0YW5kYXJkIFVuaXgKLW9iamVjdCBmaWxlcyBvbiBhIHN0YW5kYXJkLCBzdXBwb3J0ZWQgVW5peCBzeXN0ZW0uICBPbiBzdWNoIGEgc3lzdGVtLCB0bwotbGluayBhIGZpbGUgXGMKLS5CIGhlbGxvLm9cYwotXCY6Ci0uc3AKLS5icgotJFwgbGRcIFwtb1wgb3V0cHV0XCAvbGliL2NydDAub1wgaGVsbG8ub1wgXC1sYwotLmJyCi0uc3AKLVRoaXMgdGVsbHMgXGMKLS5CIGxkXGMKLVwmIHRvIHByb2R1Y2UgYSBmaWxlIGNhbGxlZCBcYwotLkIgb3V0cHV0XGMKLVwmIGFzIHRoZQotcmVzdWx0IG9mIGxpbmtpbmcgdGhlIGZpbGUgXGMKLS5CIC9saWIvY3J0MC5vXGMKLVwmIHdpdGggXGMKLS5CIGhlbGxvLm9cYwotXCYgYW5kCi10aGUgbGlicmFyeSBcYwotLkIgbGliYy5hXGMKLVwmIHdoaWNoIHdpbGwgY29tZSBmcm9tIHRoZSBzdGFuZGFyZCBzZWFyY2gKLWRpcmVjdG9yaWVzLgotCi1UaGUgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gXGMKLS5CIGxkXGMKLVwmIG1heSBiZSBzcGVjaWZpZWQgaW4gYW55IG9yZGVyLCBhbmQKLW1heSBiZSByZXBlYXRlZCBhdCB3aWxsLiAgRm9yIHRoZSBtb3N0IHBhcnQsIHJlcGVhdGluZyBhbiBvcHRpb24gd2l0aCBhCi1kaWZmZXJlbnQgYXJndW1lbnQgd2lsbCBlaXRoZXIgaGF2ZSBubyBmdXJ0aGVyIGVmZmVjdCwgb3Igb3ZlcnJpZGUgcHJpb3IKLW9jY3VycmVuY2VzICh0aG9zZSBmdXJ0aGVyIHRvIHRoZSBsZWZ0IG9uIHRoZSBjb21tYW5kIGxpbmUpIG9mIGFuCi1vcHRpb24uICAKLQotVGhlIGV4Y2VwdGlvbnNcKGVtXCZ3aGljaCBtYXkgbWVhbmluZ2Z1bGx5IGJlIHVzZWQgbW9yZSB0aGFuIG9uY2VcKGVtXCZhcmUKLVxjCi0uQiBcLUFcYwotXCYsIFxjCi0uQiBcLWJcYwotXCYgKG9yIGl0cyBzeW5vbnltIFxjCi0uQiBcLWZvcm1hdFxjCi1cJiksIFxjCi0uQiBcLWRlZnN5bVxjCi1cJiwKLVxjCi0uQiBcLUxcYwotXCYsIFxjCi0uQiBcLWxcYwotXCYsIFxjCi0uQiBcLVJcYwotXCYsIGFuZCBcYwotLkIgXC11XGMKLVwmLgotCi1UaGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgdG8gYmUgbGlua2VkIHRvZ2V0aGVyLCBzaG93biBhcyBcYwotLkkgb2JqZmlsZVxjCi1cJiwKLW1heSBmb2xsb3csIHByZWNlZGUsIG9yIGJlIG1peGVkIGluIHdpdGggY29tbWFuZC1saW5lIG9wdGlvbnM7IHNhdmUgdGhhdAotYW4gXGMKLS5JIG9iamZpbGVcYwotXCYgYXJndW1lbnQgbWF5IG5vdCBiZSBwbGFjZWQgYmV0d2VlbiBhbiBvcHRpb24gZmxhZyBhbmQKLWl0cyBhcmd1bWVudC4KLQotVXN1YWxseSB0aGUgbGlua2VyIGlzIGludm9rZWQgd2l0aCBhdCBsZWFzdCBvbmUgb2JqZWN0IGZpbGUsIGJ1dCBvdGhlcgotZm9ybXMgb2YgYmluYXJ5IGlucHV0IGZpbGVzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCB3aXRoIFxjCi0uQiBcLWxcYwotXCYsCi1cYwotLkIgXC1SXGMKLVwmLCBhbmQgdGhlIHNjcmlwdCBjb21tYW5kIGxhbmd1YWdlLiAgSWYgXGMKLS5JIG5vXGMKLVwmIGJpbmFyeSBpbnB1dAotZmlsZXMgYXQgYWxsIGFyZSBzcGVjaWZpZWQsIHRoZSBsaW5rZXIgZG9lcyBub3QgcHJvZHVjZSBhbnkgb3V0cHV0LCBhbmQKLWlzc3VlcyB0aGUgbWVzc2FnZSBgXHxcYwotLkIgTm8gaW5wdXQgZmlsZXNcYwotXHwnLgotCi1PcHRpb24gYXJndW1lbnRzIG11c3QgZWl0aGVyIGZvbGxvdyB0aGUgb3B0aW9uIGxldHRlciB3aXRob3V0IGludGVydmVuaW5nCi13aGl0ZXNwYWNlLCBvciBiZSBnaXZlbiBhcyBzZXBhcmF0ZSBhcmd1bWVudHMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZQotb3B0aW9uIHRoYXQgcmVxdWlyZXMgdGhlbS4KLQotLlRQCi0uQkkgIi1BIiAiYXJjaGl0ZWN0dXJlIgotSW4gdGhlIGN1cnJlbnQgcmVsZWFzZSBvZiBcYwotLkIgbGRcYwotXCYsIHRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBvbmx5IGZvciB0aGUKLUludGVsIDk2MCBmYW1pbHkgb2YgYXJjaGl0ZWN0dXJlcy4gIEluIHRoYXQgXGMKLS5CIGxkXGMKLVwmIGNvbmZpZ3VyYXRpb24sIHRoZQotXGMKLS5JIGFyY2hpdGVjdHVyZVxjCi1cJiBhcmd1bWVudCBpcyBvbmUgb2YgdGhlIHR3by1sZXR0ZXIgbmFtZXMgaWRlbnRpZnlpbmcKLW1lbWJlcnMgb2YgdGhlIDk2MCBmYW1pbHk7IHRoZSBvcHRpb24gc3BlY2lmaWVzIHRoZSBkZXNpcmVkIG91dHB1dAotdGFyZ2V0LCBhbmQgd2FybnMgb2YgYW55IGluY29tcGF0aWJsZSBpbnN0cnVjdGlvbnMgaW4gdGhlIGlucHV0IGZpbGVzLgotSXQgYWxzbyBtb2RpZmllcyB0aGUgbGlua2VyJ3Mgc2VhcmNoIHN0cmF0ZWd5IGZvciBhcmNoaXZlIGxpYnJhcmllcywgdG8KLXN1cHBvcnQgdGhlIHVzZSBvZiBsaWJyYXJpZXMgc3BlY2lmaWMgdG8gZWFjaCBwYXJ0aWN1bGFyCi1hcmNoaXRlY3R1cmUsIGJ5IGluY2x1ZGluZyBpbiB0aGUgc2VhcmNoIGxvb3AgbmFtZXMgc3VmZml4ZWQgd2l0aCB0aGUKLXN0cmluZyBpZGVudGlmeWluZyB0aGUgYXJjaGl0ZWN0dXJlLgotCi1Gb3IgZXhhbXBsZSwgaWYgeW91ciBcYwotLkIgbGRcYwotXCYgY29tbWFuZCBsaW5lIGluY2x1ZGVkIGBcfFxjCi0uQiBcLUFDQVxjCi1cfCcgYXMKLXdlbGwgYXMgYFx8XGMKLS5CIFwtbHRyeVxjCi1cfCcsIHRoZSBsaW5rZXIgd291bGQgbG9vayAoaW4gaXRzIGJ1aWx0LWluIHNlYXJjaAotcGF0aHMsIGFuZCBpbiBhbnkgcGF0aHMgeW91IHNwZWNpZnkgd2l0aCBcYwotLkIgXC1MXGMKLVwmKSBmb3IgYSBsaWJyYXJ5IHdpdGgKLXRoZSBuYW1lcwotLnNwCi0uYnIKLXRyeQotLmJyCi1saWJ0cnkuYQotLmJyCi10cnljYQotLmJyCi1saWJ0cnljYS5hCi0uYnIKLS5zcAotCi1UaGUgZmlyc3QgdHdvIHBvc3NpYmlsaXRpZXMgd291bGQgYmUgY29uc2lkZXJlZCBpbiBhbnkgZXZlbnQ7IHRoZSBsYXN0Ci10d28gYXJlIGR1ZSB0byB0aGUgdXNlIG9mIGBcfFxjCi0uQiBcLUFDQVxjCi1cfCcuCi0KLUZ1dHVyZSByZWxlYXNlcyBvZiBcYwotLkIgbGRcYwotXCYgbWF5IHN1cHBvcnQgc2ltaWxhciBmdW5jdGlvbmFsaXR5IGZvcgotb3RoZXIgYXJjaGl0ZWN0dXJlIGZhbWlsaWVzLgotCi1Zb3UgY2FuIG1lYW5pbmdmdWxseSB1c2UgXGMKLS5CIFwtQVxjCi1cJiBtb3JlIHRoYW4gb25jZSBvbiBhIGNvbW1hbmQgbGluZSwgaWYKLWFuIGFyY2hpdGVjdHVyZSBmYW1pbHkgYWxsb3dzIGNvbWJpbmF0aW9uIG9mIHRhcmdldCBhcmNoaXRlY3R1cmVzOyBlYWNoCi11c2Ugd2lsbCBhZGQgYW5vdGhlciBwYWlyIG9mIG5hbWUgdmFyaWFudHMgdG8gc2VhcmNoIGZvciB3aGVuIFxjCi0uQiBcLWwKLXNwZWNpZmllcyBhIGxpYnJhcnkuCi0KLS5UUAotLkJJICJcLWIgIiAiaW5wdXQtZm9ybWF0IgotU3BlY2lmeSB0aGUgYmluYXJ5IGZvcm1hdCBmb3IgaW5wdXQgb2JqZWN0IGZpbGVzIHRoYXQgZm9sbG93IHRoaXMgb3B0aW9uCi1vbiB0aGUgY29tbWFuZCBsaW5lLiAgWW91IGRvbid0IHVzdWFsbHkgbmVlZCB0byBzcGVjaWZ5IHRoaXMsIGFzCi1cYwotLkIgbGRcYwotXCYgaXMgY29uZmlndXJlZCB0byBleHBlY3QgYXMgYSBkZWZhdWx0IGlucHV0IGZvcm1hdCB0aGUgbW9zdAotdXN1YWwgZm9ybWF0IG9uIGVhY2ggbWFjaGluZS4gIFxjCi0uSSBpbnB1dC1mb3JtYXRcYwotXCYgaXMgYSB0ZXh0IHN0cmluZywgdGhlCi1uYW1lIG9mIGEgcGFydGljdWxhciBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZSBCRkQgbGlicmFyaWVzLiAgCi1cYwotLkIgXC1mb3JtYXQgXGMKLS5JIGlucHV0LWZvcm1hdFxjCi1cJlxjCi1cJiBoYXMgdGhlIHNhbWUgZWZmZWN0LCBhcyBkb2VzIHRoZSBzY3JpcHQgY29tbWFuZAotLkJSIFRBUkdFVCAuCi0KLVlvdSBtYXkgd2FudCB0byB1c2UgdGhpcyBvcHRpb24gaWYgeW91IGFyZSBsaW5raW5nIGZpbGVzIHdpdGggYW4gdW51c3VhbAotYmluYXJ5IGZvcm1hdC4gIFlvdSBjYW4gYWxzbyB1c2UgXGMKLS5CIFwtYlxjCi1cJiB0byBzd2l0Y2ggZm9ybWF0cyBleHBsaWNpdGx5ICh3aGVuCi1saW5raW5nIG9iamVjdCBmaWxlcyBvZiBkaWZmZXJlbnQgZm9ybWF0cyksIGJ5IGluY2x1ZGluZwotXGMKLS5CIFwtYiBcYwotLkkgaW5wdXQtZm9ybWF0XGMKLVwmXGMKLVwmIGJlZm9yZSBlYWNoIGdyb3VwIG9mIG9iamVjdCBmaWxlcyBpbiBhCi1wYXJ0aWN1bGFyIGZvcm1hdC4gIAotCi1UaGUgZGVmYXVsdCBmb3JtYXQgaXMgdGFrZW4gZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLS5CIEdOVVRBUkdFVFxjCi1cJi4gIFlvdSBjYW4gYWxzbyBkZWZpbmUgdGhlIGlucHV0Ci1mb3JtYXQgZnJvbSBhIHNjcmlwdCwgdXNpbmcgdGhlIGNvbW1hbmQgXGMKLS5CIFRBUkdFVFxjCi1cJi4KLQotLlRQCi0uQiBcLUJzdGF0aWMgCi1EbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbgotcGxhdGZvcm1zIGZvciB3aGljaCBzaGFyZWQgbGlicmFyaWVzIGFyZSBzdXBwb3J0ZWQuCi0KLS5UUAotLkIgXC1CZHluYW1pYwotTGluayBhZ2FpbnN0IGR5bmFtaWMgbGlicmFyaWVzLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgb24gcGxhdGZvcm1zCi1mb3Igd2hpY2ggc2hhcmVkIGxpYnJhcmllcyBhcmUgc3VwcG9ydGVkLiAgVGhpcyBvcHRpb24gaXMgbm9ybWFsbHkgdGhlCi1kZWZhdWx0IG9uIHN1Y2ggcGxhdGZvcm1zLgotCi0uVFAKLS5CIFwtQnN5bWJvbGljCi1XaGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGJpbmQgcmVmZXJlbmNlcyB0byBnbG9iYWwgc3ltYm9scyB0bwotdGhlIGRlZmluaXRpb24gd2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeSwgaWYgYW55LiAgTm9ybWFsbHksIGl0IGlzCi1wb3NzaWJsZSBmb3IgYSBwcm9ncmFtIGxpbmtlZCBhZ2FpbnN0IGEgc2hhcmVkIGxpYnJhcnkgdG8gb3ZlcnJpZGUgdGhlCi1kZWZpbml0aW9uIHdpdGhpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICBUaGlzIG9wdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwKLW9uIEVMRiBwbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLgotCi0uVFAKLS5CSSAiXC1jICIgImNvbW1hbmRmaWxlIgotRGlyZWN0cyBcYwotLkIgbGRcYwotXCYgdG8gcmVhZCBsaW5rIGNvbW1hbmRzIGZyb20gdGhlIGZpbGUKLVxjCi0uSSBjb21tYW5kZmlsZVxjCi1cJi4gIFRoZXNlIGNvbW1hbmRzIHdpbGwgY29tcGxldGVseSBvdmVycmlkZSBcYwotLkIgbGRcYwotXCYncwotZGVmYXVsdCBsaW5rIGZvcm1hdCAocmF0aGVyIHRoYW4gYWRkaW5nIHRvIGl0KTsgXGMKLS5JIGNvbW1hbmRmaWxlXGMKLVwmIG11c3QKLXNwZWNpZnkgZXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gZGVzY3JpYmUgdGhlIHRhcmdldCBmb3JtYXQuCi0KLQotWW91IG1heSBhbHNvIGluY2x1ZGUgYSBzY3JpcHQgb2YgbGluayBjb21tYW5kcyBkaXJlY3RseSBpbiB0aGUgY29tbWFuZAotbGluZSBieSBicmFja2V0aW5nIGl0IGJldHdlZW4gYFx8XGMKLS5CIHtcYwotXHwnIGFuZCBgXHxcYwotLkIgfVxjCi1cfCcgY2hhcmFjdGVycy4KLQotLlRQCi0uQiBcLVwtY3JlZgotT3V0cHV0IGEgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlLiAgSWYgYSBsaW5rZXIgbWFwIGZpbGUgaXMgYmVpbmcKLWdlbmVyYXRlZCwgdGhlIGNyb3NzIHJlZmVyZW5jZSB0YWJsZSBpcyBwcmludGVkIHRvIHRoZSBtYXAgZmlsZS4KLU90aGVyd2lzZSwgaXQgaXMgcHJpbnRlZCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotCi0uVFAKLS5CIFwtZCAKLS5UUAotLkIgXC1kYwotLlRQCi0uQiBcLWRwCi1UaGVzZSB0aHJlZSBvcHRpb25zIGFyZSBlcXVpdmFsZW50OyBtdWx0aXBsZSBmb3JtcyBhcmUgc3VwcG9ydGVkIGZvcgotY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGxpbmtlcnMuICBVc2UgYW55IG9mIHRoZW0gdG8gbWFrZSBcYwotLkIgbGQKLWFzc2lnbiBzcGFjZSB0byBjb21tb24gc3ltYm9scyBldmVuIGlmIGEgcmVsb2NhdGFibGUgb3V0cHV0IGZpbGUgaXMKLXNwZWNpZmllZCAoXGMKLS5CIFwtclxjCi1cJikuICBUaGUgc2NyaXB0IGNvbW1hbmQKLVxjCi0uQiBGT1JDRV9DT01NT05fQUxMT0NBVElPTlxjCi1cJiBoYXMgdGhlIHNhbWUgZWZmZWN0LgotCi0uVFAKLS5CSSAiLWRlZnN5bSAiICJzeW1ib2wiICJcZlIgPSBcZlAiIGV4cHJlc3Npb24KLUNyZWF0ZSBhIGdsb2JhbCBzeW1ib2wgaW4gdGhlIG91dHB1dCBmaWxlLCBjb250YWluaW5nIHRoZSBhYnNvbHV0ZQotYWRkcmVzcyBnaXZlbiBieSBcYwotLkkgZXhwcmVzc2lvblxjCi1cJi4gIFlvdSBtYXkgdXNlIHRoaXMgb3B0aW9uIGFzIG1hbnkKLXRpbWVzIGFzIG5lY2Vzc2FyeSB0byBkZWZpbmUgbXVsdGlwbGUgc3ltYm9scyBpbiB0aGUgY29tbWFuZCBsaW5lLiAgQQotbGltaXRlZCBmb3JtIG9mIGFyaXRobWV0aWMgaXMgc3VwcG9ydGVkIGZvciB0aGUgXGMKLS5JIGV4cHJlc3Npb25cYwotXCYgaW4gdGhpcwotY29udGV4dDogeW91IG1heSBnaXZlIGEgaGV4YWRlY2ltYWwgY29uc3RhbnQgb3IgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcKLXN5bWJvbCwgb3IgdXNlIFxjCi0uQiArXGMKLVwmIGFuZCBcYwotLkIgXC1cYwotXCYgdG8gYWRkIG9yIHN1YnRyYWN0IGhleGFkZWNpbWFsCi1jb25zdGFudHMgb3Igc3ltYm9scy4gIElmIHlvdSBuZWVkIG1vcmUgZWxhYm9yYXRlIGV4cHJlc3Npb25zLCBjb25zaWRlcgotdXNpbmcgdGhlIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlIGZyb20gYSBzY3JpcHQuCi0KLS5UUAotLkIgXC1cLWRlbWFuZ2xlCi0uVFAKLS5CIFwtXC1ub1wtZGVtYW5nbGUKLVRoZXNlIG9wdGlvbnMgY29udHJvbCB3aGV0aGVyIHRvIGRlbWFuZ2xlIHN5bWJvbCBuYW1lcyBpbiBlcnJvcgotbWVzc2FnZXMgYW5kIG90aGVyIG91dHB1dC4gIFdoZW4gdGhlIGxpbmtlciBpcyB0b2xkIHRvIGRlbWFuZ2xlLCBpdAotdHJpZXMgdG8gcHJlc2VudCBzeW1ib2wgbmFtZXMgaW4gYSByZWFkYWJsZSBmYXNoaW9uOiBpdCBzdHJpcHMgbGVhZGluZwotdW5kZXJzY29yZXMgaWYgdGhleSBhcmUgdXNlZCBieSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LCBhbmQgY29udmVydHMKLUMrKyBtYW5nbGVkIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXIgcmVhZGFibGUgbmFtZXMuICBUaGUgbGlua2VyIHdpbGwKLWRlbWFuZ2xlIGJ5IGRlZmF1bHQgdW5sZXNzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotLkIgQ09MTEVDVF9OT19ERU1BTkdMRQotaXMgc2V0LiAgVGhlc2Ugb3B0aW9ucyBtYXkgYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdC4KLQotLlRQCi0uQkkgIi1lICIgImVudHJ5IlxjCi1cJiAKLVVzZSBcYwotLkkgZW50cnlcYwotXCYgYXMgdGhlIGV4cGxpY2l0IHN5bWJvbCBmb3IgYmVnaW5uaW5nIGV4ZWN1dGlvbiBvZiB5b3VyCi1wcm9ncmFtLCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBlbnRyeSBwb2ludC4gIFNlZSB0aGUgYFx8XGMKLS5CIGxkXGMKLVx8JyBlbnRyeSBpbiBgXHxcYwotLkIgaW5mb1xjCi1cfCcgZm9yIGEKLWRpc2N1c3Npb24gb2YgZGVmYXVsdHMgYW5kIG90aGVyIHdheXMgb2Ygc3BlY2lmeWluZyB0aGUKLWVudHJ5IHBvaW50LgotCi0uVFAKLS5CIFwtZW1iZWRkZWRcLXJlbG9jcwotVGhpcyBvcHRpb24gaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gbGlua2luZyBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLAotZ2VuZXJhdGVkIGJ5IHRoZQotLkIgXC1tZW1iZWRkZWRcLXBpYwotb3B0aW9uIHRvIHRoZSBHTlUgY29tcGlsZXIgYW5kIGFzc2VtYmxlci4gIEl0IGNhdXNlcyB0aGUgbGlua2VyIHRvCi1jcmVhdGUgYSB0YWJsZSB3aGljaCBtYXkgYmUgdXNlZCBhdCBydW50aW1lIHRvIHJlbG9jYXRlIGFueSBkYXRhIHdoaWNoCi13YXMgc3RhdGljYWxseSBpbml0aWFsaXplZCB0byBwb2ludGVyIHZhbHVlcy4gIFNlZSB0aGUgY29kZSBpbgotdGVzdHN1aXRlL2xkLWVtcGljIGZvciBkZXRhaWxzLgotCi0uVFAKLS5CIFwtRQotLlRQCi0uQiBcLWV4cG9ydFwtZHluYW1pYwotV2hlbiBjcmVhdGluZyBhbiBFTEYgZmlsZSwgYWRkIGFsbCBzeW1ib2xzIHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLU5vcm1hbGx5LCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgY29udGFpbnMgb25seSBzeW1ib2xzIHdoaWNoIGFyZSB1c2VkCi1ieSBhIGR5bmFtaWMgb2JqZWN0LiAgVGhpcyBvcHRpb24gaXMgbmVlZGVkIGZvciBzb21lIHVzZXMgb2YKLS5JIGRsb3Blbi4KLQotLlRQCi0uQkkgIi1mICIgIm5hbWUiCi0uVFAKLS5CSSAiLS1hdXhpbGlhcnkgIiAibmFtZSIKLVdoZW4gY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QsIHNldCB0aGUgaW50ZXJuYWwgRFRfQVVYSUxJQVJZIGZpZWxkCi10byB0aGUgc3BlY2lmaWVkIG5hbWUuICBUaGlzIHRlbGxzIHRoZSBkeW5hbWljIGxpbmtlciB0aGF0IHRoZSBzeW1ib2wKLXRhYmxlIG9mIHRoZSBzaGFyZWQgb2JqZWN0IHNob3VsZCBiZSB1c2VkIGFzIGFuIGF1eGlsaWFyeSBmaWx0ZXIgb24gdGhlCi1zeW1ib2wgdGFibGUgb2YgdGhlIHNoYXJlZCBvYmplY3QKLS5JIG5hbWUuCi0KLS5UUAotLkJJICItRiAiICJuYW1lIgotLlRQCi0uQkkgIi0tZmlsdGVyICIgIm5hbWUiCi1XaGVuIGNyZWF0aW5nIGFuIEVMRiBzaGFyZWQgb2JqZWN0LCBzZXQgdGhlIGludGVybmFsIERUX0ZJTFRFUiBmaWVsZCB0bwotdGhlIHNwZWNpZmllZCBuYW1lLiAgVGhpcyB0ZWxscyB0aGUgZHluYW1pYyBsaW5rZXIgdGhhdCB0aGUgc3ltYm9sIHRhYmxlCi1vZiB0aGUgc2hhcmVkIG9iamVjdCBzaG91bGQgYmUgdXNlZCBhcyBhIGZpbHRlciBvbiB0aGUgc3ltYm9sIHRhYmxlIG9mCi10aGUgc2hhcmVkIG9iamVjdAotLkkgbmFtZS4KLQotLlRQCi0uQkkgIlwtZm9ybWF0ICIgImlucHV0XC1mb3JtYXQiCi1TeW5vbnltIGZvciBcYwotLkIgXC1iXGMKLVwmIFxjCi0uSSBpbnB1dFwtZm9ybWF0XGMKLVwmLgotCi0uVFAKLS5CIFwtZwotQWNjZXB0ZWQsIGJ1dCBpZ25vcmVkOyBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIHRvb2xzLgotCi0uVFAKLS5CSSAiXC1HICIgInNpemUiXGMKLVNldCB0aGUgbWF4aW11bSBzaXplIG9mIG9iamVjdHMgdG8gYmUgb3B0aW1pemVkIHVzaW5nIHRoZSBHUCByZWdpc3RlcgotdG8KLS5JIHNpemUKLXVuZGVyIE1JUFMgRUNPRkYuICBJZ25vcmVkIGZvciBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi0uVFAKLS5CSSAiLWggIiAibmFtZSIKLS5UUAotLkJJICItc29uYW1lICIgIm5hbWUiCi1XaGVuIGNyZWF0aW5nIGFuIEVMRiBzaGFyZWQgb2JqZWN0LCBzZXQgdGhlIGludGVybmFsIERUX1NPTkFNRSBmaWVsZCB0bwotdGhlIHNwZWNpZmllZCBuYW1lLiAgV2hlbiBhbiBleGVjdXRhYmxlIGlzIGxpbmtlZCB3aXRoIGEgc2hhcmVkIG9iamVjdAotd2hpY2ggaGFzIGEgRFRfU09OQU1FIGZpZWxkLCB0aGVuIHdoZW4gdGhlIGV4ZWN1dGFibGUgaXMgcnVuIHRoZSBkeW5hbWljCi1saW5rZXIgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIHNoYXJlZCBvYmplY3Qgc3BlY2lmaWVkIGJ5IHRoZSBEVF9TT05BTUUKLWZpZWxkIHJhdGhlciB0aGFuIHRoZSB1c2luZyB0aGUgZmlsZSBuYW1lIGdpdmVuIHRvIHRoZSBsaW5rZXIuCi0KLS5UUAotLkIgXC1cLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KLVRoaXMgb3B0aW9uIGFuZAotLkIgXC1cLXZlcnNpb24KLWJlZ2luIHdpdGggdHdvIGRhc2hlcyBpbnN0ZWFkIG9mIG9uZQotZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBHTlUgcHJvZ3JhbXMuICBUaGUgb3RoZXIgb3B0aW9ucyBzdGFydCB3aXRoCi1vbmx5IG9uZSBkYXNoIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgbGlua2Vycy4KLQotLlRQCi0uQiBcLWkKLVBlcmZvcm0gYW4gaW5jcmVtZW50YWwgbGluayAoc2FtZSBhcyBvcHRpb24gXGMKLS5CIFwtclxjCi1cJikuCi0KLS5UUAotLkJJICJcLWwiICJhciJcYwotXCYgCi1BZGQgYW4gYXJjaGl2ZSBmaWxlIFxjCi0uSSBhclxjCi1cJiB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byBsaW5rLiAgVGhpcyAKLW9wdGlvbiBtYXkgYmUgdXNlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLiAgXGMKLS5CIGxkXGMKLVwmIHdpbGwgc2VhcmNoIGl0cwotcGF0aC1saXN0IGZvciBvY2N1cnJlbmNlcyBvZiBcYwotLkIgbGliXGMKLS5JIGFyXGMKLVwmLmFcYwotXCYgZm9yIGV2ZXJ5IFxjCi0uSSBhcgotc3BlY2lmaWVkLgotCi0uVFAKLS5CSSAiXC1MIiAic2VhcmNoZGlyIgotVGhpcyBjb21tYW5kIGFkZHMgcGF0aCBcYwotLkkgc2VhcmNoZGlyXGMKLVwmIHRvIHRoZSBsaXN0IG9mIHBhdGhzIHRoYXQKLVxjCi0uQiBsZFxjCi1cJiB3aWxsIHNlYXJjaCBmb3IgYXJjaGl2ZSBsaWJyYXJpZXMuICBZb3UgbWF5IHVzZSB0aGlzIG9wdGlvbgotYW55IG51bWJlciBvZiB0aW1lcy4KLQotVGhlIGRlZmF1bHQgc2V0IG9mIHBhdGhzIHNlYXJjaGVkICh3aXRob3V0IGJlaW5nIHNwZWNpZmllZCB3aXRoCi1cYwotLkIgXC1MXGMKLVwmKSBkZXBlbmRzIG9uIHdoYXQgZW11bGF0aW9uIG1vZGUgXGMKLS5CIGxkXGMKLVwmIGlzIHVzaW5nLCBhbmQgaW4KLXNvbWUgY2FzZXMgYWxzbyBvbiBob3cgaXQgd2FzIGNvbmZpZ3VyZWQuICAgIFRoZQotcGF0aHMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGluIGEgbGluayBzY3JpcHQgd2l0aCB0aGUgXGMKLS5CIFNFQVJDSF9ESVIKLWNvbW1hbmQuCi0KLS5UUAotLkIgXC1NIAotUHJpbnQgKHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgZmlsZSkgYSBsaW5rIG1hcFwoZW1cJmRpYWdub3N0aWMgaW5mb3JtYXRpb24KLWFib3V0IHdoZXJlIHN5bWJvbHMgYXJlIG1hcHBlZCBieSBcYwotLkIgbGRcYwotXCYsIGFuZCBpbmZvcm1hdGlvbiBvbiBnbG9iYWwKLWNvbW1vbiBzdG9yYWdlIGFsbG9jYXRpb24uCi0KLS5UUAotLkJJICJcLU1hcCAiICJtYXBmaWxlIlxjCi1QcmludCB0byB0aGUgZmlsZQotLkkgbWFwZmlsZQotYSBsaW5rIG1hcFwoZW1cJmRpYWdub3N0aWMgaW5mb3JtYXRpb24KLWFib3V0IHdoZXJlIHN5bWJvbHMgYXJlIG1hcHBlZCBieSBcYwotLkIgbGRcYwotXCYsIGFuZCBpbmZvcm1hdGlvbiBvbiBnbG9iYWwKLWNvbW1vbiBzdG9yYWdlIGFsbG9jYXRpb24uCi0KLS5UUAotLkJJICJcLW0gIiAiZW11bGF0aW9uIlxjCi1FbXVsYXRlIHRoZQotLkkgZW11bGF0aW9uCi1saW5rZXIuICBZb3UgY2FuIGxpc3QgdGhlIGF2YWlsYWJsZSBlbXVsYXRpb25zIHdpdGggdGhlCi0uSSBcLVwtdmVyYm9zZQotb3IKLS5JIFwtVgotb3B0aW9ucy4gIFRoaXMgb3B0aW9uIG92ZXJyaWRlcyB0aGUgY29tcGlsZWQtaW4gZGVmYXVsdCwgd2hpY2ggaXMgdGhlCi1zeXN0ZW0gZm9yIHdoaWNoIHlvdSBjb25maWd1cmVkCi0uQlIgbGQgLgotCi0uVFAKLS5CIFwtTiAKLXNwZWNpZmllcyByZWFkYWJsZSBhbmQgd3JpdGFibGUgXGMKLS5CIHRleHRcYwotXCYgYW5kIFxjCi0uQiBkYXRhXGMKLVwmIHNlY3Rpb25zLiBJZgotdGhlIG91dHB1dCBmb3JtYXQgc3VwcG9ydHMgVW5peCBzdHlsZSBtYWdpYyBudW1iZXJzLCB0aGUgb3V0cHV0IGlzCi1tYXJrZWQgYXMgXGMKLS5CIE9NQUdJQ1xjCi1cJi4KLQotV2hlbiB5b3UgdXNlIHRoZSBgXHxcYwotLkIgXC1OXGMKLVwmXHwnIG9wdGlvbiwgdGhlIGxpbmtlciBkb2VzIG5vdCBwYWdlLWFsaWduIHRoZQotZGF0YSBzZWdtZW50LgotCi0uVFAKLS5CIFwtbiAKLXNldHMgdGhlIHRleHQgc2VnbWVudCB0byBiZSByZWFkIG9ubHksIGFuZCBcYwotLkIgTk1BR0lDXGMKLVwmIGlzIHdyaXR0ZW4KLWlmIHBvc3NpYmxlLgotCi0uVFAKLS5CIFwtbm9pbmhpYml0XC1leGVjCi1Ob3JtYWxseSwgdGhlIGxpbmtlciB3aWxsIG5vdCBwcm9kdWNlIGFuIG91dHB1dCBmaWxlIGlmIGl0IGVuY291bnRlcnMKLWVycm9ycyBkdXJpbmcgdGhlIGxpbmsgcHJvY2Vzcy4gIFdpdGggdGhpcyBmbGFnLCB5b3UgY2FuIHNwZWNpZnkgdGhhdAoteW91IHdpc2ggdGhlIG91dHB1dCBmaWxlIHJldGFpbmVkIGV2ZW4gYWZ0ZXIgbm9uLWZhdGFsIGVycm9ycy4KLQotLlRQCi0uQiBcLW5vXC1rZWVwXC1tZW1vcnkKLVRoZSBsaW5rZXIgbm9ybWFsbHkgb3B0aW1pemVzIGZvciBzcGVlZCBvdmVyIG1lbW9yeSB1c2FnZSBieSBjYWNoaW5nCi10aGUgc3ltYm9sIHRhYmxlcyBvZiBpbnB1dCBmaWxlcyBpbiBtZW1vcnkuICBUaGlzIG9wdGlvbiB0ZWxscyB0aGUKLWxpbmtlciB0byBpbnN0ZWFkIG9wdGltaXplIGZvciBtZW1vcnkgdXNhZ2UsIGJ5IHJlcmVhZGluZyB0aGUgc3ltYm9sCi10YWJsZXMgYXMgbmVjZXNzYXJ5LiAgVGhpcyBtYXkgYmUgcmVxdWlyZWQgaWYgdGhlIGxpbmtlciBydW5zIG91dCBvZgotbWVtb3J5IHNwYWNlIHdoaWxlIGxpbmtpbmcgYSBsYXJnZSBleGVjdXRhYmxlLgotCi0uVFAKLS5CIFwtbm9cLXdhcm5cLW1pc21hdGNoCi1Ob3JtYWxseSB0aGUgbGlua2VyIHdpbGwgZ2l2ZSBhbiBlcnJvciBpZiB5b3UgdHJ5IHRvIGxpbmsgdG9nZXRoZXIKLWlucHV0IGZpbGVzIHRoYXQgYXJlIG1pc21hdGNoZWQgZm9yIHNvbWUgcmVhc29uLCBwZXJoYXBzIGJlY2F1c2UgdGhleQotaGF2ZSBiZWVuIGNvbXBpbGVkIGZvciBkaWZmZXJlbnQgcHJvY2Vzc29ycyBvciBmb3IgZGlmZmVyZW50Ci1lbmRpYW5uZXNzZXMuICBUaGlzIG9wdGlvbiB0ZWxscyB0aGUgbGlua2VyIHRoYXQgaXQgc2hvdWxkIHNpbGVudGx5Ci1wZXJtaXQgc3VjaCBwb3NzaWJsZSBlcnJvcnMuICBUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIHdpdGgKLWNhcmUsIGluIGNhc2VzIHdoZW4geW91IGhhdmUgdGFrZW4gc29tZSBzcGVjaWFsIGFjdGlvbiB0aGF0IGVuc3VyZXMKLXRoYXQgdGhlIGxpbmtlciBlcnJvcnMgYXJlIGluYXBwcm9wcmlhdGUuCi0KLS5UUAotLkJJICJcLW8gIiAib3V0cHV0IgotLkkgb3V0cHV0XGMKLVwmIGlzIGEgbmFtZSBmb3IgdGhlIHByb2dyYW0gcHJvZHVjZWQgYnkgXGMKLS5CIGxkXGMKLVwmOyBpZiB0aGlzCi1vcHRpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlIG5hbWUgYFx8XGMKLS5CIGEub3V0XGMKLVx8JyBpcyB1c2VkIGJ5IGRlZmF1bHQuICBUaGUKLXNjcmlwdCBjb21tYW5kIFxjCi0uQiBPVVRQVVRcYwotXCYgY2FuIGFsc28gc3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KLQotLlRQCi0uQkkgIlwtTyIgImxldmVsIgotR2VuZXJhdGUgb3B0aW1pemVkIG91dHB1dCBmaWxlcy4gIFRoaXMgbWlnaHQgdXNlIHNpZ25pZmljYW50bHkgbW9yZQotdGltZSBhbmQgdGhlcmVmb3JlIHByb2JhYmx5IHNob3VsZCBiZSBlbmFibGVkIG9ubHkgZm9yIGdlbmVyYXRpbmcgdGhlCi1maW5hbCBiaW5hcnkuCi1cYwotLkkgbGV2ZWxcYwotXCYgaXMgc3VwcG9zZWQgdG8gYmUgYSBudW1lcmljIHZhbHVlLiAgQW55IHZhbHVlIGdyZWF0ZXIgdGhhbiB6ZXJvIGVuYWJsZXMKLXRoZSBvcHRpbWl6YXRpb25zLgotCi0uVFAKLS5CSSAiXC1vZm9ybWF0ICIgIm91dHB1dFwtZm9ybWF0IgotU3BlY2lmeSB0aGUgYmluYXJ5IGZvcm1hdCBmb3IgdGhlIG91dHB1dCBvYmplY3QgZmlsZS4KLVlvdSBkb24ndCB1c3VhbGx5IG5lZWQgdG8gc3BlY2lmeSB0aGlzLCBhcwotXGMKLS5CIGxkXGMKLVwmIGlzIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBhcyBhIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCB0aGUgbW9zdAotdXN1YWwgZm9ybWF0IG9uIGVhY2ggbWFjaGluZS4gIFxjCi0uSSBvdXRwdXQtZm9ybWF0XGMKLVwmIGlzIGEgdGV4dCBzdHJpbmcsIHRoZQotbmFtZSBvZiBhIHBhcnRpY3VsYXIgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgQkZEIGxpYnJhcmllcy4gIAotVGhlIHNjcmlwdCBjb21tYW5kCi0uQiBPVVRQVVRfRk9STUFUCi1jYW4gYWxzbyBzcGVjaWZ5IHRoZSBvdXRwdXQgZm9ybWF0LCBidXQgdGhpcyBvcHRpb24gb3ZlcnJpZGVzIGl0LgotCi0uVFAKLS5CSSAiXC1SICIgImZpbGVuYW1lIgotUmVhZCBzeW1ib2wgbmFtZXMgYW5kIHRoZWlyIGFkZHJlc3NlcyBmcm9tIFxjCi0uSSBmaWxlbmFtZVxjCi1cJiwgYnV0IGRvIG5vdAotcmVsb2NhdGUgaXQgb3IgaW5jbHVkZSBpdCBpbiB0aGUgb3V0cHV0LiAgVGhpcyBhbGxvd3MgeW91ciBvdXRwdXQgZmlsZQotdG8gcmVmZXIgc3ltYm9saWNhbGx5IHRvIGFic29sdXRlIGxvY2F0aW9ucyBvZiBtZW1vcnkgZGVmaW5lZCBpbiBvdGhlcgotcHJvZ3JhbXMuCi0KLS5UUAotLkIgXC1yZWxheAotQW4gb3B0aW9uIHdpdGggbWFjaGluZSBkZXBlbmRlbnQgZWZmZWN0cy4gIEN1cnJlbnRseSB0aGlzIG9wdGlvbiBpcyBvbmx5Ci1zdXBwb3J0ZWQgb24gdGhlIEg4LzMwMC4KLQotT24gc29tZSBwbGF0Zm9ybXMsIHVzZSB0aGlzIG9wdGlvbiB0byBwZXJmb3JtIGdsb2JhbCBvcHRpbWl6YXRpb25zIHRoYXQKLWJlY29tZSBwb3NzaWJsZSB3aGVuIHRoZSBsaW5rZXIgcmVzb2x2ZXMgYWRkcmVzc2luZyBpbiB5b3VyIHByb2dyYW0sIHN1Y2gKLWFzIHJlbGF4aW5nIGFkZHJlc3MgbW9kZXMgYW5kIHN5bnRoZXNpemluZyBuZXcgaW5zdHJ1Y3Rpb25zIGluIHRoZQotb3V0cHV0IG9iamVjdCBmaWxlLiAgCi0KLU9uIHBsYXRmb3JtcyB3aGVyZSB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQsIGBcfFxjCi0uQiBcLXJlbGF4XGMKLVwmXHwnIGlzIGFjY2VwdGVkLCBidXQgaGFzIG5vIGVmZmVjdC4KLQotLlRQCi0uQiBcLXIgCi1HZW5lcmF0ZXMgcmVsb2NhdGFibGUgb3V0cHV0XChlbVwmaS5lLiwgZ2VuZXJhdGUgYW4gb3V0cHV0IGZpbGUgdGhhdCBjYW4gaW4KLXR1cm4gc2VydmUgYXMgaW5wdXQgdG8gXGMKLS5CIGxkXGMKLVwmLiAgVGhpcyBpcyBvZnRlbiBjYWxsZWQgXGMKLS5JIHBhcnRpYWwKLWxpbmtpbmdcYwotXCYuICBBcyBhIHNpZGUgZWZmZWN0LCBpbiBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IHN0YW5kYXJkIFVuaXgKLW1hZ2ljIG51bWJlcnMsIHRoaXMgb3B0aW9uIGFsc28gc2V0cyB0aGUgb3V0cHV0IGZpbGUncyBtYWdpYyBudW1iZXIgdG8KLVxjCi0uQiBPTUFHSUNcYwotXCYuCi1JZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBhbiBhYnNvbHV0ZSBmaWxlIGlzIHByb2R1Y2VkLiAgV2hlbgotbGlua2luZyBDKysgcHJvZ3JhbXMsIHRoaXMgb3B0aW9uIFxjCi0uSSB3aWxsIG5vdFxjCi1cJiByZXNvbHZlIHJlZmVyZW5jZXMgdG8KLWNvbnN0cnVjdG9yczsgXGMKLS5CIFwtVXJcYwotXCYgaXMgYW4gYWx0ZXJuYXRpdmUuIAotCi1UaGlzIG9wdGlvbiBkb2VzIHRoZSBzYW1lIGFzIFxjCi0uQiBcLWlcYwotXCYuCi0KLS5UUAotLkIgXC1ycGF0aFwgXGZJZGlyZWN0b3J5Ci1BZGQgYSBkaXJlY3RvcnkgdG8gdGhlIHJ1bnRpbWUgbGlicmFyeSBzZWFyY2ggcGF0aC4gIFRoaXMgaXMgdXNlZCB3aGVuCi1saW5raW5nIGFuIEVMRiBleGVjdXRhYmxlIHdpdGggc2hhcmVkIG9iamVjdHMuICBBbGwgCi0uQiBcLXJwYXRoCi1hcmd1bWVudHMgYXJlIGNvbmNhdGVuYXRlZCBhbmQgcGFzc2VkIHRvIHRoZSBydW50aW1lIGxpbmtlciwgd2hpY2ggdXNlcwotdGhlbSB0byBsb2NhdGUgc2hhcmVkIG9iamVjdHMgYXQgcnVudGltZS4gIFRoZQotLkIgXC1ycGF0aAotb3B0aW9uIGlzIGFsc28gdXNlZCB3aGVuIGxvY2F0aW5nIHNoYXJlZCBvYmplY3RzIHdoaWNoIGFyZSBuZWVkZWQgYnkKLXNoYXJlZCBvYmplY3RzIGV4cGxpY2l0bHkgaW5jbHVkZWQgaW4gdGhlIGxpbms7IHNlZSB0aGUgZGVzY3JpcHRpb24gb2YKLXRoZQotLkIgXC1ycGF0aFwtbGluawotb3B0aW9uLiAgSWYKLS5CIFwtcnBhdGgKLWlzIG5vdCB1c2VkIHdoZW4gbGlua2luZyBhbiBFTEYgZXhlY3V0YWJsZSwgdGhlIGNvbnRlbnRzIG9mIHRoZQotZW52aXJvbm1lbnQgdmFyaWFibGUKLS5CIExEX1JVTl9QQVRICi13aWxsIGJlIHVzZWQgaWYgaXQgaXMgZGVmaW5lZC4KLQotVGhlCi0uQiBcLXJwYXRoCi1vcHRpb24gbWF5IGFsc28gYmUgdXNlZCBvbiBTdW5PUy4gIEJ5IGRlZmF1bHQsIG9uIFN1bk9TLCB0aGUgbGlua2VyCi13aWxsIGZvcm0gYSBydW50aW1lIHNlYXJjaCBwYXRoIG91dCBvZiBhbGwgdGhlCi0uQiBcLUwKLW9wdGlvbnMgaXQgaXMgZ2l2ZW4uICBJZiBhCi0uQiBcLXJwYXRoCi1vcHRpb24gaXMgdXNlZCwgdGhlIHJ1bnRpbWUgc2VhcmNoIHBhdGggd2lsbCBiZSBmb3JtZWQgZXhjbHVzaXZlbHkKLXVzaW5nIHRoZQotLkIgXC1ycGF0aAotb3B0aW9ucywgaWdub3JpbmcKLXRoZQotLkIgXC1MCi1vcHRpb25zLiAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdXNpbmcgZ2NjLCB3aGljaCBhZGRzIG1hbnkKLS5CIFwtTAotb3B0aW9ucyB3aGljaCBtYXkgYmUgb24gTkZTIG1vdW50ZWQgZmlsZXN5c3RlbXMuCi0KLS5UUAotLkIgXC1ycGF0aFwtbGlua1wgXGZJZGlyZWN0b3J5Ci1XaGVuIHVzaW5nIEVMRiBvciBTdW5PUywgb25lIHNoYXJlZCBsaWJyYXJ5IG1heSByZXF1aXJlIGFub3RoZXIuICBUaGlzCi1oYXBwZW5zIHdoZW4gYW4KLS5CIGxkXCBcLXNoYXJlZAotbGluayBpbmNsdWRlcyBhIHNoYXJlZCBsaWJyYXJ5IGFzIG9uZSBvZiB0aGUgaW5wdXQgZmlsZXMuCi0KLVdoZW4gdGhlIGxpbmtlciBlbmNvdW50ZXJzIHN1Y2ggYSBkZXBlbmRlbmN5IHdoZW4gZG9pbmcgYSBub24tc2hhcmVkLAotbm9uLXJlbG9jYXRlYWJsZSBsaW5rLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgdHJ5IHRvIGxvY2F0ZSB0aGUgcmVxdWlyZWQKLXNoYXJlZCBsaWJyYXJ5IGFuZCBpbmNsdWRlIGl0IGluIHRoZSBsaW5rLCBpZiBpdCBpcyBub3QgaW5jbHVkZWQKLWV4cGxpY2l0bHkuICBJbiBzdWNoIGEgY2FzZSwgdGhlCi0uQiBcLXJwYXRoXC1saW5rCi1vcHRpb24gc3BlY2lmaWVzIHRoZSBmaXJzdCBzZXQgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoLiAgVGhlCi0uQiBcLXJwYXRoXC1saW5rCi1vcHRpb24gbWF5IHNwZWNpZnkgYSBzZXF1ZW5jZSBvZiBkaXJlY3RvcnkgbmFtZXMgZWl0aGVyIGJ5IHNwZWNpZnlpbmcKLWEgbGlzdCBvZiBuYW1lcyBzZXBhcmF0ZWQgYnkgY29sb25zLCBvciBieSBhcHBlYXJpbmcgbXVsdGlwbGUgdGltZXMuCi0KLUlmIHRoZSByZXF1aXJlZCBzaGFyZWQgbGlicmFyeSBpcyBub3QgZm91bmQsIHRoZSBsaW5rZXIgd2lsbCBpc3N1ZSBhCi13YXJuaW5nIGFuZCBjb250aW51ZSB3aXRoIHRoZSBsaW5rLgotCi0uVFAKLS5CIFwtUyAKLU9taXRzIGRlYnVnZ2VyIHN5bWJvbCBpbmZvcm1hdGlvbiAoYnV0IG5vdCBhbGwgc3ltYm9scykgZnJvbSB0aGUgb3V0cHV0IGZpbGUuCi0KLS5UUAotLkIgXC1zIAotT21pdHMgYWxsIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvdXRwdXQgZmlsZS4KLQotLlRQCi0uQiBcLXNoYXJlZAotQ3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkuICBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBvbiBFTEYgYW5kCi1TdW5PUyBwbGF0Zm9ybXMgKG9uIFN1bk9TIGl0IGlzIG5vdCByZXF1aXJlZCwgYXMgdGhlIGxpbmtlciB3aWxsCi1hdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IHdoZW4gdGhlcmUgYXJlIHVuZGVmaW5lZCBzeW1ib2xzCi1hbmQgdGhlCi0uQiBcLWUKLW9wdGlvbiBpcyBub3QgdXNlZCkuCi0KLS5UUAotLkIgXC1zb3J0XC1jb21tb24KLU5vcm1hbGx5LCB3aGVuCi0uQiBsZAotcGxhY2VzIHRoZSBnbG9iYWwgY29tbW9uIHN5bWJvbHMgaW4gdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBzZWN0aW9ucywKLWl0IHNvcnRzIHRoZW0gYnkgc2l6ZS4gIEZpcnN0IGNvbWUgYWxsIHRoZSBvbmUgYnl0ZSBzeW1ib2xzLCB0aGVuIGFsbAotdGhlIHR3byBieXRlcywgdGhlbiBhbGwgdGhlIGZvdXIgYnl0ZXMsIGFuZCB0aGVuIGV2ZXJ5dGhpbmcgZWxzZS4KLVRoaXMgaXMgdG8gcHJldmVudCBnYXBzIGJldHdlZW4gc3ltYm9scyBkdWUgdG8KLWFsaWdubWVudCBjb25zdHJhaW50cy4gIFRoaXMgb3B0aW9uIGRpc2FibGVzIHRoYXQgc29ydGluZy4KLQotLlRQCi0uQiBcLXNwbGl0XC1ieVwtcmVsb2NcIFxmSWNvdW50Ci1UcnlzIHRvIGNyZWF0ZXMgZXh0cmEgc2VjdGlvbnMgaW4gdGhlIG91dHB1dCBmaWxlIHNvIHRoYXQgbm8gc2luZ2xlCi1vdXRwdXQgc2VjdGlvbiBpbiB0aGUgZmlsZSBjb250YWlucyBtb3JlIHRoYW4KLS5JIGNvdW50Ci1yZWxvY2F0aW9ucy4KLVRoaXMgaXMgdXNlZnVsIHdoZW4gZ2VuZXJhdGluZyBodWdlIHJlbG9jYXRhYmxlIGZvciBkb3dubG9hZGluZyBpbnRvCi1jZXJ0YWluIHJlYWwgdGltZSBrZXJuZWxzIHdpdGggdGhlIENPRkYgb2JqZWN0IGZpbGUgZm9ybWF0OyBzaW5jZSBDT0ZGCi1jYW5ub3QgcmVwcmVzZW50IG1vcmUgdGhhbiA2NTUzNSByZWxvY2F0aW9ucyBpbiBhIHNpbmdsZSBzZWN0aW9uLgotTm90ZSB0aGF0IHRoaXMgd2lsbCBmYWlsIHRvIHdvcmsgd2l0aCBvYmplY3QgZmlsZSBmb3JtYXRzIHdoaWNoIGRvIG5vdAotc3VwcG9ydCBhcmJpdHJhcnkgc2VjdGlvbnMuICBUaGUgbGlua2VyIHdpbGwgbm90IHNwbGl0IHVwIGluZGl2aWR1YWwKLWlucHV0IHNlY3Rpb25zIGZvciByZWRpc3RyaWJ1dGlvbiwgc28gaWYgYSBzaW5nbGUgaW5wdXQgc2VjdGlvbgotY29udGFpbnMgbW9yZSB0aGFuCi0uSSBjb3VudAotcmVsb2NhdGlvbnMgb25lIG91dHB1dCBzZWN0aW9uIHdpbGwgY29udGFpbiB0aGF0IG1hbnkgcmVsb2NhdGlvbnMuCi0KLS5UUAotLkIgXC1zcGxpdFwtYnlcLWZpbGUKLVNpbWlsYXIgdG8KLS5CIFwtc3BsaXRcLWJ5XC1yZWxvYwotYnV0IGNyZWF0ZXMgYSBuZXcgb3V0cHV0IHNlY3Rpb24gZm9yIGVhY2ggaW5wdXQgZmlsZS4KLQotLlRQCi0uQkkgIlwtVGJzcyAiICJvcmciXGMKLS5UUAotLkJJICJcLVRkYXRhICIgIm9yZyJcYwotLlRQCi0uQkkgIlwtVHRleHQgIiAib3JnIlxjCi1Vc2UgXGMKLS5JIG9yZ1xjCi1cJiBhcyB0aGUgc3RhcnRpbmcgYWRkcmVzcyBmb3JcKGVtXCZyZXNwZWN0aXZlbHlcKGVtXCZ0aGUKLVxjCi0uQiBic3NcYwotXCYsIFxjCi0uQiBkYXRhXGMKLVwmLCBvciB0aGUgXGMKLS5CIHRleHRcYwotXCYgc2VnbWVudCBvZiB0aGUgb3V0cHV0IGZpbGUuCi1cYwotLkkgb3JnXGMKLVwmIG11c3QgYmUgYSBoZXhhZGVjaW1hbCBpbnRlZ2VyLgotCi0uVFAKLS5CSSAiXC1UICIgImNvbW1hbmRmaWxlIgotRXF1aXZhbGVudCB0byBcYwotLkIgXC1jIFxjCi0uSSBjb21tYW5kZmlsZVxjCi1cJlxjCi1cJjsgc3VwcG9ydGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKLW90aGVyIHRvb2xzLiAgCi0KLS5UUAotLkIgXC10IAotUHJpbnRzIG5hbWVzIG9mIGlucHV0IGZpbGVzIGFzIFxjCi0uQiBsZFxjCi1cJiBwcm9jZXNzZXMgdGhlbS4KLQotLlRQCi0uQkkgIlwtdSAiICJzeW0iCi1Gb3JjZXMgXGMKLS5JIHN5bVxjCi1cJiB0byBiZSBlbnRlcmVkIGluIHRoZSBvdXRwdXQgZmlsZSBhcyBhbiB1bmRlZmluZWQgc3ltYm9sLgotVGhpcyBtYXksIGZvciBleGFtcGxlLCB0cmlnZ2VyIGxpbmtpbmcgb2YgYWRkaXRpb25hbCBtb2R1bGVzIGZyb20KLXN0YW5kYXJkIGxpYnJhcmllcy4gIFxjCi0uQiBcLXVcYwotXCYgbWF5IGJlIHJlcGVhdGVkIHdpdGggZGlmZmVyZW50IG9wdGlvbgotYXJndW1lbnRzIHRvIGVudGVyIGFkZGl0aW9uYWwgdW5kZWZpbmVkIHN5bWJvbHMuCi0KLS5UUAotLkIgXC1VciAKLUZvciBhbnl0aGluZyBvdGhlciB0aGFuIEMrKyBwcm9ncmFtcywgdGhpcyBvcHRpb24gaXMgZXF1aXZhbGVudCB0bwotXGMKLS5CIFwtclxjCi1cJjogaXQgZ2VuZXJhdGVzIHJlbG9jYXRhYmxlIG91dHB1dFwoZW1cJmkuZS4sIGFuIG91dHB1dCBmaWxlIHRoYXQgY2FuIGluCi10dXJuIHNlcnZlIGFzIGlucHV0IHRvIFxjCi0uQiBsZFxjCi1cJi4gIFdoZW4gbGlua2luZyBDKysgcHJvZ3JhbXMsIFxjCi0uQiBcLVVyCi0uSSB3aWxsXGMKLVwmIHJlc29sdmUgcmVmZXJlbmNlcyB0byBjb25zdHJ1Y3RvcnMsIHVubGlrZSBcYwotLkIgXC1yXGMKLVwmLgotCi0uVFAKLS5CIFwtXC12ZXJib3NlCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgXGMKLS5CIGxkCi1hbmQgbGlzdCB0aGUgc3VwcG9ydGVkIGVtdWxhdGlvbnMuCi1EaXNwbGF5IHdoaWNoIGlucHV0IGZpbGVzIGNhbiBhbmQgY2FuIG5vdCBiZSBvcGVuZWQuCi0KLS5UUAotLkIgXC12LCBcLVYKLURpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBcYwotLkIgbGRcYwotXCYuCi1UaGUKLS5CIFwtVgotb3B0aW9uIGFsc28gbGlzdHMgdGhlIHN1cHBvcnRlZCBlbXVsYXRpb25zLgotCi0uVFAKLS5CIFwtXC12ZXJzaW9uCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgXGMKLS5CIGxkCi1hbmQgZXhpdC4KLQotLlRQCi0uQiBcLXdhcm5cLWNvbW1vbgotV2FybiB3aGVuIGEgY29tbW9uIHN5bWJvbCBpcyBjb21iaW5lZCB3aXRoIGFub3RoZXIgY29tbW9uIHN5bWJvbCBvciB3aXRoCi1hIHN5bWJvbCBkZWZpbml0aW9uLiAgVW5peCBsaW5rZXJzIGFsbG93IHRoaXMgc29tZXdoYXQgc2xvcHB5IHByYWN0aWNlLAotYnV0IGxpbmtlcnMgb24gc29tZSBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyBkbyBub3QuICBUaGlzIG9wdGlvbiBhbGxvd3MKLXlvdSB0byBmaW5kIHBvdGVudGlhbCBwcm9ibGVtcyBmcm9tIGNvbWJpbmluZyBnbG9iYWwgc3ltYm9scy4KLQotLlRQCi0uQiBcLXdhcm5cLWNvbnN0cnVjdG9ycwotV2FybiBpZiBhbnkgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhcmUgdXNlZC4gIFRoaXMgaXMgb25seSB1c2VmdWwgZm9yIGEKLWZldyBvYmplY3QgZmlsZSBmb3JtYXRzLiAgRm9yIGZvcm1hdHMgbGlrZSBDT0ZGIG9yIEVMRiwgdGhlIGxpbmtlciBjYW4KLW5vdCBkZXRlY3QgdGhlIHVzZSBvZiBnbG9iYWwgY29uc3RydWN0b3JzLgotCi0uVFAKLS5CIFwtd2FyblwtbXVsdGlwbGVcLWdwCi1XYXJuIGlmIHRoZSBvdXRwdXQgZmlsZSByZXF1aXJlcyBtdWx0aXBsZSBnbG9iYWwtcG9pbnRlciB2YWx1ZXMuICBUaGlzCi1vcHRpb24gaXMgb25seSBtZWFuaW5nZnVsIGZvciBjZXJ0YWluIHByb2Nlc3NvcnMsIHN1Y2ggYXMgdGhlIEFscGhhLgotCi0uVFAKLS5CIFwtd2Fyblwtb25jZQotT25seSB3YXJuIG9uY2UgZm9yIGVhY2ggdW5kZWZpbmVkIHN5bWJvbCwgcmF0aGVyIHRoYW4gb25jZSBwZXIgbW9kdWxlCi13aGljaCByZWZlcnMgdG8gaXQuCi0KLS5UUAotLkIgXC13YXJuXC1zZWN0aW9uXC1hbGlnbgotV2FybiBpZiB0aGUgYWRkcmVzcyBvZiBhbiBvdXRwdXQgc2VjdGlvbiBpcyBjaGFuZ2VkIGJlY2F1c2Ugb2YKLWFsaWdubWVudC4gIFR5cGljYWxseSwgdGhlIGFsaWdubWVudCB3aWxsIGJlIHNldCBieSBhbiBpbnB1dCBzZWN0aW9uLgotVGhlIGFkZHJlc3Mgd2lsbCBvbmx5IGJlIGNoYW5nZWQgaWYgaXQgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkOyB0aGF0Ci1pcywgaWYgdGhlIFNFQ1RJT05TIGNvbW1hbmQgZG9lcyBub3Qgc3BlY2lmeSBhIHN0YXJ0IGFkZHJlc3MgZm9yIHRoZQotc2VjdGlvbi4KLQotLlRQCi0uQiBcLVwtd2hvbGVcLWFyY2hpdmUKLUZvciBlYWNoIGFyY2hpdmUgbWVudGlvbmVkIG9uIHRoZSBjb21tYW5kIGxpbmUgYWZ0ZXIgdGhlCi0uQiBcLVwtd2hvbGVcLWFyY2hpdmUKLW9wdGlvbiwgaW5jbHVkZSBldmVyeSBvYmplY3QgZmlsZSBpbiB0aGUgYXJjaGl2ZSBpbiB0aGUgbGluaywgcmF0aGVyCi10aGFuIHNlYXJjaGluZyB0aGUgYXJjaGl2ZSBmb3IgdGhlIHJlcXVpcmVkIG9iamVjdCBmaWxlcy4gIFRoaXMgaXMKLW5vcm1hbGx5IHVzZWQgdG8gdHVybiBhbiBhcmNoaXZlIGZpbGUgaW50byBhIHNoYXJlZCBsaWJyYXJ5LCBmb3JjaW5nCi1ldmVyeSBvYmplY3QgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBzaGFyZWQgbGlicmFyeS4KLQotLlRQCi0uQiBcLVwtbm9cLXdob2xlXC1hcmNoaXZlCi1UdXJuIG9mZiB0aGUgZWZmZWN0IG9mIHRoZQotLkIgXC1cLXdob2xlXC1hcmNoaXZlCi1vcHRpb24gZm9yIGFyY2hpdmVzIHdoaWNoIGFwcGVhciBsYXRlciBvbiB0aGUgY29tbWFuZCBsaW5lLgotCi0uVFAKLS5CSSAiLS13cmFwICIgInN5bWJvbCIKLVVzZSBhIHdyYXBwZXIgZnVuY3Rpb24gZm9yIAotLkkgc3ltYm9sLgotQW55IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8KLS5JIHN5bWJvbAotd2lsbCBiZSByZXNvbHZlZCB0bwotLkJJICJfX3dyYXBfIiAic3ltYm9sIi4KLUFueSB1bmRlZmluZWQgcmVmZXJlbmNlIHRvCi0uQkkgIl9fcmVhbF8iICJzeW1ib2wiCi13aWxsIGJlIHJlc29sdmVkIHRvCi0uSSBzeW1ib2wuCi0KLS5UUAotLkIgXC1YIAotRGVsZXRlIGFsbCB0ZW1wb3JhcnkgbG9jYWwgc3ltYm9scy4gIEZvciBtb3N0IHRhcmdldHMsIHRoaXMgaXMgYWxsIGxvY2FsCi1zeW1ib2xzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggYFx8XGMKLS5CIExcYwotXHwnLgotCi0uVFAKLS5CIFwteAotRGVsZXRlIGFsbCBsb2NhbCBzeW1ib2xzLgotCi0uUFAKLQotLlNIIEVOVklST05NRU5UCi1cYwotWW91IGNhbiBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCi0uQiBsZFxjCi1cJiB3aXRoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBcYwotLkIgR05VVEFSR0VUXGMKLVwmLgotCi1cYwotLkIgR05VVEFSR0VUXGMKLVwmIGRldGVybWluZXMgdGhlIGlucHV0LWZpbGUgb2JqZWN0IGZvcm1hdCBpZiB5b3UgZG9uJ3QKLXVzZSBcYwotLkIgXC1iXGMKLVwmIChvciBpdHMgc3lub255bSBcYwotLkIgXC1mb3JtYXRcYwotXCYpLiAgSXRzIHZhbHVlIHNob3VsZCBiZSBvbmUKLW9mIHRoZSBCRkQgbmFtZXMgZm9yIGFuIGlucHV0IGZvcm1hdC4gIElmIHRoZXJlIGlzIG5vCi1cYwotLkIgR05VVEFSR0VUXGMKLVwmIGluIHRoZSBlbnZpcm9ubWVudCwgXGMKLS5CIGxkXGMKLVwmIHVzZXMgdGhlIG5hdHVyYWwgZm9ybWF0Ci1vZiB0aGUgaG9zdC4gSWYgXGMKLS5CIEdOVVRBUkdFVFxjCi1cJiBpcyBzZXQgdG8gXGMKLS5CIGRlZmF1bHRcYwotXCYgdGhlbiBCRkQgYXR0ZW1wdHMgdG8gZGlzY292ZXIgdGhlCi1pbnB1dCBmb3JtYXQgYnkgZXhhbWluaW5nIGJpbmFyeSBpbnB1dCBmaWxlczsgdGhpcyBtZXRob2Qgb2Z0ZW4KLXN1Y2NlZWRzLCBidXQgdGhlcmUgYXJlIHBvdGVudGlhbCBhbWJpZ3VpdGllcywgc2luY2UgdGhlcmUgaXMgbm8gbWV0aG9kCi1vZiBlbnN1cmluZyB0aGF0IHRoZSBtYWdpYyBudW1iZXIgdXNlZCB0byBmbGFnIG9iamVjdC1maWxlIGZvcm1hdHMgaXMKLXVuaXF1ZS4gIEhvd2V2ZXIsIHRoZSBjb25maWd1cmF0aW9uIHByb2NlZHVyZSBmb3IgQkZEIG9uIGVhY2ggc3lzdGVtCi1wbGFjZXMgdGhlIGNvbnZlbnRpb25hbCBmb3JtYXQgZm9yIHRoYXQgc3lzdGVtIGZpcnN0IGluIHRoZSBzZWFyY2gtbGlzdCwKLXNvIGFtYmlndWl0aWVzIGFyZSByZXNvbHZlZCBpbiBmYXZvciBvZiBjb252ZW50aW9uLgotCi0uUFAKLQotLlNIICJTRUUgQUxTTyIKLQotLkJSIG9iamR1bXAgKCAxICkKLS5icgotLmJyCi0uUkIgImBcfCIgbGQgIlx8JyBhbmQgYFx8IiBiaW51dGlscyAiXHwnIgotZW50cmllcyBpbgotLkIgaW5mb1xjCi0uYnIKLS5JIAotbGQ6IHRoZSBHTlUgbGlua2VyXGMKLSwgU3RldmUgQ2hhbWJlcmxhaW4gYW5kIFJvbGFuZCBQZXNjaDsKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotLCBSb2xhbmQgSC4gUGVzY2guCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2xkL2xkLmggYi9sZC9sZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2E3NDYyLi4wMDAwMDAwCi0tLSBhL2xkL2xkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyogbGQuaCAtLSBnZW5lcmFsIGxpbmtlciBoZWFkZXIgZmlsZQotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBMRF9ICi0jZGVmaW5lIExEX0gKLQotI2lmZGVmIEhBVkVfTE9DQUxFX0gKLSMgaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEVOQUJMRV9OTFMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotIyBkZWZpbmUgXyhTdHJpbmcpIGdldHRleHQgKFN0cmluZykKLSMgaWZkZWYgZ2V0dGV4dF9ub29wCi0jICBkZWZpbmUgTl8oU3RyaW5nKSBnZXR0ZXh0X25vb3AgKFN0cmluZykKLSMgZWxzZQotIyAgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSMgZW5kaWYKLSNlbHNlCi0vKiBTdHVicyB0aGF0IGRvIHNvbWV0aGluZyBjbG9zZSBlbm91Z2guICAqLwotIyBkZWZpbmUgdGV4dGRvbWFpbihTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBnZXR0ZXh0KFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbixNZXNzYWdlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGRjZ2V0dGV4dChEb21haW4sTWVzc2FnZSxUeXBlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbixEaXJlY3RvcnkpIChEb21haW4pCi0jIGRlZmluZSBfKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSNlbmRpZgotCi0vKiBMb29rIGluIHRoaXMgZW52aXJvbm1lbnQgbmFtZSBmb3IgdGhlIGxpbmtlciB0byBwcmV0ZW5kIHRvIGJlICovCi0jZGVmaW5lIEVNVUxBVElPTl9FTlZJUk9OICJMREVNVUxBVElPTiIKLS8qIElmIGluIHRoZXJlIGxvb2sgZm9yIHRoZSBzdHJpbmdzOiAqLwotCi0vKiBMb29rIGluIHRoaXMgdmFyaWFibGUgZm9yIGEgdGFyZ2V0IGZvcm1hdCAqLwotI2RlZmluZSBUQVJHRVRfRU5WSVJPTiAiR05VVEFSR0VUIgotCi0vKiBJbnB1dCBzZWN0aW9ucyB3aGljaCBhcmUgcHV0IGluIGEgc2VjdGlvbiBvZiB0aGlzIG5hbWUgYXJlIGFjdHVhbGx5Ci0gICBkaXNjYXJkZWQuICAqLwotI2RlZmluZSBESVNDQVJEX1NFQ1RJT05fTkFNRSAiL0RJU0NBUkQvIgotCi0vKiBBIHdpbGRjYXJkIHNwZWNpZmljYXRpb24uICBUaGlzIGlzIG9ubHkgdXNlZCBpbiBsZGdyYW0ueSwgYnV0IGl0Ci0gICB3aW5kcyB1cCBpbiBsZGdyYW0uaCwgc28gd2UgbmVlZCB0byBkZWZpbmUgaXQgb3V0c2lkZS4gICovCi0KLXN0cnVjdCB3aWxkY2FyZF9zcGVjCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNvbnN0IGNoYXIgKmV4Y2x1ZGVfbmFtZTsKLSAgYm9vbGVhbiBzb3J0ZWQ7Ci19OwotCi0vKiBFeHRyYSBpbmZvcm1hdGlvbiB3ZSBob2xkIG9uIHNlY3Rpb25zICovCi10eXBlZGVmIHN0cnVjdCAgdXNlcl9zZWN0aW9uX3N0cnVjdAotewotICAvKiBQb2ludGVyIHRvIHRoZSBzZWN0aW9uIHdoZXJlIHRoaXMgZGF0YSB3aWxsIGdvICovCi0gIHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKmZpbGU7Ci19IHNlY3Rpb25fdXNlcmRhdGFfdHlwZTsKLQotCi0jZGVmaW5lIGdldF91c2VyZGF0YSh4KSAoKHgpLT51c2VyZGF0YSkKLQotI2RlZmluZSBCWVRFX1NJWkUJKDEpCi0jZGVmaW5lIFNIT1JUX1NJWkUJKDIpCi0jZGVmaW5lIExPTkdfU0laRQkoNCkKLSNkZWZpbmUgUVVBRF9TSVpFCSg4KQotCi0vKiBBTElHTiBtYWNybyBjaGFuZ2VkIHRvIEFMSUdOX04gdG8gYXZvaWQJKi8KLS8qIGNvbmZsaWN0IGluIC91c3IvaW5jbHVkZS9tYWNoaW5lL21hY2hwYXJhbS5oICovCi0vKiBXQVJOSU5HOiBJZiBUSElTIGlzIGEgNjQgYml0IGFkZHJlc3MgYW5kIEJPVU5EQVJZIGlzIGEgMzIgYml0IGludCwKLSAgIHlvdSBtdXN0IGNvZXJjZSBib3VuZGFyeSB0byB0aGUgc2FtZSB0eXBlIGFzIFRISVMuCi0gICA/Pz8gSXMgdGhlcmUgYSBwb3J0YWJsZSB3YXkgdG8gYXZvaWQgdGhpcy4gICovCi0jZGVmaW5lIEFMSUdOX04odGhpcywgYm91bmRhcnkpIFwKLSAgKCgoICh0aGlzKSArICgoYm91bmRhcnkpIC0xKSkgJiAofigoYm91bmRhcnkpLTEpKSkpCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIDEgPT4gYXNzaWduIHNwYWNlIHRvIGNvbW1vbiBzeW1ib2xzIGV2ZW4gaWYgYHJlbG9jYXRhYmxlX291dHB1dCcuICAqLwotICBib29sZWFuIGZvcmNlX2NvbW1vbl9kZWZpbml0aW9uOwotICBib29sZWFuIHJlbGF4OwotCi0gIC8qIE5hbWUgb2YgcnVudGltZSBpbnRlcnByZXRlciB0byBpbnZva2UuICAqLwotICBjaGFyICppbnRlcnByZXRlcjsKLQotICAvKiBOYW1lIHRvIGdpdmUgcnVudGltZSBsaWJhcnkgZnJvbSB0aGUgLXNvbmFtZSBhcmd1bWVudC4gICovCi0gIGNoYXIgKnNvbmFtZTsKLQotICAvKiBSdW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGggZnJvbSB0aGUgLXJwYXRoIGFyZ3VtZW50LiAgKi8KLSAgY2hhciAqcnBhdGg7Ci0KLSAgLyogTGluayB0aW1lIHJ1bnRpbWUgbGlicmFyeSBzZWFyY2ggcGF0aCBmcm9tIHRoZSAtcnBhdGgtbGluawotICAgICBhcmd1bWVudC4gICovCi0gIGNoYXIgKnJwYXRoX2xpbms7Ci0KLSAgLyogQmlnIG9yIGxpdHRsZSBlbmRpYW4gYXMgc2V0IG9uIGNvbW1hbmQgbGluZS4gICovCi0gIGVudW0geyBFTkRJQU5fVU5TRVQgPSAwLCBFTkRJQU5fQklHLCBFTkRJQU5fTElUVExFIH0gZW5kaWFuOwotCi0gIC8qIElmIHRydWUsIGV4cG9ydCBhbGwgc3ltYm9scyBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgb2YgYW4gRUxGCi0gICAgIGV4ZWN1dGFibGUuICAqLwotICBib29sZWFuIGV4cG9ydF9keW5hbWljOwotCi0gIC8qIElmIHRydWUsIGJ1aWxkIE1JUFMgZW1iZWRkZWQgUElDIHJlbG9jYXRpb24gdGFibGVzIGluIHRoZSBvdXRwdXQKLSAgICAgZmlsZS4gICovCi0gIGJvb2xlYW4gZW1iZWRkZWRfcmVsb2NzOwotCi0gIC8qIElmIHRydWUsIGZvcmNlIGdlbmVyYXRpb24gb2YgYSBmaWxlIHdpdGggYSAuZXhlIGZpbGUuICovCi0gIGJvb2xlYW4gZm9yY2VfZXhlX3N1ZmZpeDsKLQotICAvKiBJZiB0cnVlLCBnZW5lcmF0ZSBhIGNyb3NzIHJlZmVyZW5jZSByZXBvcnQuICAqLwotICBib29sZWFuIGNyZWY7Ci0KLSAgLyogSWYgdHJ1ZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQpLCB3YXJuIGFib3V0IG1pc21hdGNoZWQgaW5wdXQKLSAgICAgZmlsZXMuICAqLwotICBib29sZWFuIHdhcm5fbWlzbWF0Y2g7Ci0KLSAgLyogUmVtb3ZlIHVucmVmZXJlbmNlZCBzZWN0aW9ucz8gICovCi0gIGJvb2xlYW4gZ2Nfc2VjdGlvbnM7Ci0KLSAgLyogTmFtZSBvZiBzaGFyZWQgb2JqZWN0IHdob3NlIHN5bWJvbCB0YWJsZSBzaG91bGQgYmUgZmlsdGVyZWQgd2l0aAotICAgICB0aGlzIHNoYXJlZCBvYmplY3QuICBGcm9tIHRoZSAtLWZpbHRlciBvcHRpb24uICAqLwotICBjaGFyICpmaWx0ZXJfc2hsaWI7Ci0KLSAgLyogTmFtZSBvZiBzaGFyZWQgb2JqZWN0IGZvciB3aG9zZSBzeW1ib2wgdGFibGUgdGhpcyBzaGFyZWQgb2JqZWN0Ci0gICAgIGlzIGFuIGF1eGlsaWFyeSBmaWx0ZXIuICBGcm9tIHRoZSAtLWF1eGlsaWFyeSBvcHRpb24uICAqLwotICBjaGFyICoqYXV4aWxpYXJ5X2ZpbHRlcnM7Ci0KLSAgLyogQSB2ZXJzaW9uIHN5bWJvbCB0byBiZSBhcHBsaWVkIHRvIHRoZSBzeW1ib2wgbmFtZXMgZm91bmQgaW4gdGhlCi0gICAgIC5leHBvcnRzIHNlY3Rpb25zLiAgKi8KLSAgY2hhciAqdmVyc2lvbl9leHBvcnRzX3NlY3Rpb247Ci0KLSAgLyogSWYgdHJ1ZSAodGhlIGRlZmF1bHQpIGNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzLCBvbmNlIGNvbXB1dGUsCi0gICAgIGZwb3Igb3ZlcmxhcHMuICAqLwotICBib29sZWFuIGNoZWNrX3NlY3Rpb25fYWRkcmVzc2VzOwotICAKLX0gYXJnc190eXBlOwotCi1leHRlcm4gYXJnc190eXBlIGNvbW1hbmRfbGluZTsKLQotdHlwZWRlZiBpbnQgdG9rZW5fY29kZV90eXBlOwotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgYmZkX3NpemVfdHlwZSBzcGVjaWZpZWRfZGF0YV9zaXplOwotICBib29sZWFuIG1hZ2ljX2RlbWFuZF9wYWdlZDsKLSAgYm9vbGVhbiBtYWtlX2V4ZWN1dGFibGU7Ci0KLSAgLyogSWYgdHJ1ZSwgZG9pbmcgYSBkeW5hbWljIGxpbmsuICAqLwotICBib29sZWFuIGR5bmFtaWNfbGluazsKLQotICAvKiBJZiB0cnVlLCAtc2hhcmVkIGlzIHN1cHBvcnRlZC4gICovCi0gIC8qID8/PyBBIGJldHRlciB3YXkgdG8gZG8gdGhpcyBpcyBwZXJoYXBzIHRvIGRlZmluZSB0aGlzIGluIHRoZQotICAgICBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3Qgc2luY2UgdGhpcyBpcyByZWFsbHkgYSB0YXJnZXQgZGVwZW5kZW50Ci0gICAgIHBhcmFtZXRlci4gICovCi0gIGJvb2xlYW4gaGFzX3NoYXJlZDsKLQotICAvKiBJZiB0cnVlLCBidWlsZCBjb25zdHJ1Y3RvcnMuICAqLwotICBib29sZWFuIGJ1aWxkX2NvbnN0cnVjdG9yczsKLQotICAvKiBJZiB0cnVlLCB3YXJuIGFib3V0IGFueSBjb25zdHJ1Y3RvcnMuICAqLwotICBib29sZWFuIHdhcm5fY29uc3RydWN0b3JzOwotCi0gIC8qIElmIHRydWUsIHdhcm4gYWJvdXQgbWVyZ2luZyBjb21tb24gc3ltYm9scyB3aXRoIG90aGVycy4gICovCi0gIGJvb2xlYW4gd2Fybl9jb21tb247Ci0KLSAgLyogSWYgdHJ1ZSwgb25seSB3YXJuIG9uY2UgYWJvdXQgYSBwYXJ0aWN1bGFyIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotICBib29sZWFuIHdhcm5fb25jZTsKLQotICAvKiBJZiB0cnVlLCB3YXJuIGlmIG11bHRpcGxlIGdsb2JhbC1wb2ludGVycyBhcmUgbmVlZGVkIChBbHBoYQotICAgICBvbmx5KS4gICovCi0gIGJvb2xlYW4gd2Fybl9tdWx0aXBsZV9ncDsKLQotICAvKiBJZiB0cnVlLCB3YXJuIGlmIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIGFuIG91dHB1dCBzZWN0aW9uCi0gICAgIGNoYW5nZXMgZHVlIHRvIHRoZSBhbGlnbm1lbnQgb2YgYW4gaW5wdXQgc2VjdGlvbi4gICovCi0gIGJvb2xlYW4gd2Fybl9zZWN0aW9uX2FsaWduOwotCi0gIGJvb2xlYW4gc29ydF9jb21tb247Ci0KLSAgYm9vbGVhbiB0ZXh0X3JlYWRfb25seTsKLQotICBjaGFyICptYXBfZmlsZW5hbWU7Ci0gIEZJTEUgKm1hcF9maWxlOwotCi0gIGJvb2xlYW4gc3RhdHM7Ci0KLSAgaW50IHNwbGl0X2J5X3JlbG9jOwotICBib29sZWFuIHNwbGl0X2J5X2ZpbGU7Ci19IGxkX2NvbmZpZ190eXBlOwotCi1leHRlcm4gbGRfY29uZmlnX3R5cGUgY29uZmlnOwotCi10eXBlZGVmIGVudW0KLXsKLSAgbGFuZ19maXJzdF9waGFzZV9lbnVtLAotICBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bSwKLSAgbGFuZ19maW5hbF9waGFzZV9lbnVtCi19IGxhbmdfcGhhc2VfdHlwZTsKLQotZXh0ZXJuIGJvb2xlYW4gaGFkX3NjcmlwdDsKLWV4dGVybiBib29sZWFuIGZvcmNlX21ha2VfZXhlY3V0YWJsZTsKLQotLyogTm9uLXplcm8gaWYgd2UgYXJlIHByb2Nlc3NpbmcgYSAtLWRlZnN5bSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuICAqLwotZXh0ZXJuIGludCBwYXJzaW5nX2RlZnN5bTsKLQotZXh0ZXJuIGludCB5eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIHZvaWQgYWRkX2NyZWYgUEFSQU1TICgoY29uc3QgY2hhciAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotZXh0ZXJuIHZvaWQgb3V0cHV0X2NyZWYgUEFSQU1TICgoRklMRSAqKSk7Ci1leHRlcm4gdm9pZCBjaGVja19ub2Nyb3NzcmVmcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGQudGV4aW5mbyBiL2xkL2xkLnRleGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyN2YxOTYuLjAwMDAwMDAKLS0tIGEvbGQvbGQudGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDQzMDUgKzAsMCBAQAotXGlucHV0IHRleGluZm8KLUBzZXRmaWxlbmFtZSBsZC5pbmZvCi1Ac3luY29kZWluZGV4IGt5IGNwCi1AaW5jbHVkZSBjb25maWdkb2MudGV4aQotQGMgKGNvbmZpZ2RvYy50ZXhpIGlzIGdlbmVyYXRlZCBieSB0aGUgTWFrZWZpbGUpCi1AaW5jbHVkZSBsZHZlci50ZXhpCi0KLUBjIEBzbWFsbGJvb2sKLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogTGQ6IChsZCkuICAgICAgICAgICAgICAgICAgICAgICBUaGUgR05VIGxpbmtlci4KLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi0KLUBpZmluZm8KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEBzY3tnbnV9IGxpbmtlciBMRCB2ZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfS4KLQotQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdAotdGhlIGVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi1AZW5kIGlmaW5mbwotQGlmdGV4Ci1AZmluYWxvdXQKLUBzZXRjaGFwdGVybmV3cGFnZSBvZGQKLUBzZXR0aXRsZSBVc2luZyBMRCwgdGhlIEdOVSBsaW5rZXIKLUB0aXRsZXBhZ2UKLUB0aXRsZSBVc2luZyBsZAotQHN1YnRpdGxlIFRoZSBHTlUgbGlua2VyCi1Ac3AgMQotQHN1YnRpdGxlIEBjb2Rle2xkfSB2ZXJzaW9uIDIKLUBzdWJ0aXRsZSBWZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfQotQGF1dGhvciBTdGV2ZSBDaGFtYmVybGFpbgotQGF1dGhvciBJYW4gTGFuY2UgVGF5bG9yCi1AYXV0aG9yIEN5Z251cyBTb2x1dGlvbnMKLUBwYWdlCi0KLUB0ZXgKLXtccGFyc2tpcD0wcHQKLVxoZmlsbCBDeWdudXMgU29sdXRpb25zXHBhcgotXGhmaWxsIGlhblxAY3lnbnVzLmNvbSwgZG9jXEBjeWdudXMuY29tXHBhcgotXGhmaWxsIHtcaXQgVXNpbmcgTEQsIHRoZSBHTlUgbGlua2VyfVxwYXIKLVxoZmlsbCBFZGl0ZWQgYnkgSmVmZnJleSBPc2llciAoamVmZnJleVxAY3lnbnVzLmNvbSlccGFyCi19Ci1cZ2xvYmFsXHBhcmluZGVudD0wcHQgJSBTdGV2ZSBsaWtlcyBpdCB0aGlzIHdheS4KLUBlbmQgdGV4Ci0KLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKLXRoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCB0aXRsZXBhZ2UKLUBlbmQgaWZ0ZXgKLUBjIEZJWE1FOiBUYWxrIGFib3V0IGltcG9ydGFuY2Ugb2YgKm9yZGVyKiBvZiBhcmdzLCBjbWRzIHRvIGxpbmtlciEKLQotQGlmaW5mbwotQG5vZGUgVG9wCi1AdG9wIFVzaW5nIGxkCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBAc2N7Z251fSBsaW5rZXIgbGQgdmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0uCi0KLUBtZW51Ci0qIE92ZXJ2aWV3OjogICAgICAgICAgICAgICAgICAgIE92ZXJ2aWV3Ci0qIEludm9jYXRpb246OiAgICAgICAgICAgICAgICAgIEludm9jYXRpb24KLSogU2NyaXB0czo6ICAgICAgICAgICAgICAgICAgICAgTGlua2VyIFNjcmlwdHMKLUBpZnNldCBHRU5FUklDCi0qIE1hY2hpbmUgRGVwZW5kZW50OjogICAgICAgICAgIE1hY2hpbmUgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSDgzMDAKLSogSDgvMzAwOjogICAgICAgICAgICAgICAgICAgICAgbGQgYW5kIHRoZSBIOC8zMDAKLUBlbmQgaWZzZXQKLUBpZnNldCBIaXRhY2hpCi0qIEhpdGFjaGk6OiAgICAgICAgICAgICAgICAgICAgIGxkIGFuZCBvdGhlciBIaXRhY2hpIG1pY3JvcwotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLSogaTk2MDo6ICAgICAgICAgICAgICAgICAgICAgICAgbGQgYW5kIHRoZSBJbnRlbCA5NjAgZmFtaWx5Ci1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotKiBCRkQ6OiAgICAgICAgICAgICAgICAgICAgICAgICBCRkQKLUBlbmQgaWZjbGVhcgotQGMgRm9sbG93aW5nIGJsYW5rIGxpbmUgcmVxdWlyZWQgZm9yIHJlbWFpbmluZyBidWcgaW4gbWFrZWluZm8gY29uZHMvbWVudXMKLQotKiBSZXBvcnRpbmcgQnVnczo6ICAgICAgICAgICAgICBSZXBvcnRpbmcgQnVncwotKiBNUkk6OiAgICAgICAgICAgICAgICAgICAgICAgICBNUkkgQ29tcGF0aWJsZSBTY3JpcHQgRmlsZXMKLSogSW5kZXg6OiAgICAgICAgICAgICAgICAgICAgICAgSW5kZXgKLUBlbmQgbWVudQotQGVuZCBpZmluZm8KLQotQG5vZGUgT3ZlcnZpZXcKLUBjaGFwdGVyIE92ZXJ2aWV3Ci0KLUBjaW5kZXggQHNje2dudX0gbGlua2VyCi1AY2luZGV4IHdoYXQgaXMgdGhpcz8KLUBjb2Rle2xkfSBjb21iaW5lcyBhIG51bWJlciBvZiBvYmplY3QgYW5kIGFyY2hpdmUgZmlsZXMsIHJlbG9jYXRlcwotdGhlaXIgZGF0YSBhbmQgdGllcyB1cCBzeW1ib2wgcmVmZXJlbmNlcy4gVXN1YWxseSB0aGUgbGFzdCBzdGVwIGluCi1jb21waWxpbmcgYSBwcm9ncmFtIGlzIHRvIHJ1biBAY29kZXtsZH0uCi0KLUBjb2Rle2xkfSBhY2NlcHRzIExpbmtlciBDb21tYW5kIExhbmd1YWdlIGZpbGVzIHdyaXR0ZW4gaW4KLWEgc3VwZXJzZXQgb2YgQVQmVCdzIExpbmsgRWRpdG9yIENvbW1hbmQgTGFuZ3VhZ2Ugc3ludGF4LAotdG8gcHJvdmlkZSBleHBsaWNpdCBhbmQgdG90YWwgY29udHJvbCBvdmVyIHRoZSBsaW5raW5nIHByb2Nlc3MuCi0KLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotVGhpcyB2ZXJzaW9uIG9mIEBjb2Rle2xkfSB1c2VzIHRoZSBnZW5lcmFsIHB1cnBvc2UgQkZEIGxpYnJhcmllcwotdG8gb3BlcmF0ZSBvbiBvYmplY3QgZmlsZXMuIFRoaXMgYWxsb3dzIEBjb2Rle2xkfSB0byByZWFkLCBjb21iaW5lLCBhbmQKLXdyaXRlIG9iamVjdCBmaWxlcyBpbiBtYW55IGRpZmZlcmVudCBmb3JtYXRzLS0tZm9yIGV4YW1wbGUsIENPRkYgb3IKLUBjb2Rle2Eub3V0fS4gIERpZmZlcmVudCBmb3JtYXRzIG1heSBiZSBsaW5rZWQgdG9nZXRoZXIgdG8gcHJvZHVjZSBhbnkKLWF2YWlsYWJsZSBraW5kIG9mIG9iamVjdCBmaWxlLiAgQHhyZWZ7QkZEfSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1AZW5kIGlmY2xlYXIKLQotQXNpZGUgZnJvbSBpdHMgZmxleGliaWxpdHksIHRoZSBAc2N7Z251fSBsaW5rZXIgaXMgbW9yZSBoZWxwZnVsIHRoYW4gb3RoZXIKLWxpbmtlcnMgaW4gcHJvdmlkaW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uICBNYW55IGxpbmtlcnMgYWJhbmRvbgotZXhlY3V0aW9uIGltbWVkaWF0ZWx5IHVwb24gZW5jb3VudGVyaW5nIGFuIGVycm9yOyB3aGVuZXZlciBwb3NzaWJsZSwKLUBjb2Rle2xkfSBjb250aW51ZXMgZXhlY3V0aW5nLCBhbGxvd2luZyB5b3UgdG8gaWRlbnRpZnkgb3RoZXIgZXJyb3JzCi0ob3IsIGluIHNvbWUgY2FzZXMsIHRvIGdldCBhbiBvdXRwdXQgZmlsZSBpbiBzcGl0ZSBvZiB0aGUgZXJyb3IpLgotCi1Abm9kZSBJbnZvY2F0aW9uCi1AY2hhcHRlciBJbnZvY2F0aW9uCi0KLVRoZSBAc2N7Z251fSBsaW5rZXIgQGNvZGV7bGR9IGlzIG1lYW50IHRvIGNvdmVyIGEgYnJvYWQgcmFuZ2Ugb2Ygc2l0dWF0aW9ucywKLWFuZCB0byBiZSBhcyBjb21wYXRpYmxlIGFzIHBvc3NpYmxlIHdpdGggb3RoZXIgbGlua2Vycy4gIEFzIGEgcmVzdWx0LAoteW91IGhhdmUgbWFueSBjaG9pY2VzIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW9yLgotCi1AaWZzZXQgVXNlc0VudlZhcnMKLUBtZW51Ci0qIE9wdGlvbnM6OiAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQgTGluZSBPcHRpb25zCi0qIEVudmlyb25tZW50OjogICAgICAgICAgICAgICAgIEVudmlyb25tZW50IFZhcmlhYmxlcwotQGVuZCBtZW51Ci0KLUBub2RlIE9wdGlvbnMKLUBzZWN0aW9uIENvbW1hbmQgTGluZSBPcHRpb25zCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggY29tbWFuZCBsaW5lCi1AY2luZGV4IG9wdGlvbnMKLVRoZSBsaW5rZXIgc3VwcG9ydHMgYSBwbGV0aG9yYSBvZiBjb21tYW5kLWxpbmUgb3B0aW9ucywgYnV0IGluIGFjdHVhbAotcHJhY3RpY2UgZmV3IG9mIHRoZW0gYXJlIHVzZWQgaW4gYW55IHBhcnRpY3VsYXIgY29udGV4dC4KLUBjaW5kZXggc3RhbmRhcmQgVW5peCBzeXN0ZW0KLUZvciBpbnN0YW5jZSwgYSBmcmVxdWVudCB1c2Ugb2YgQGNvZGV7bGR9IGlzIHRvIGxpbmsgc3RhbmRhcmQgVW5peAotb2JqZWN0IGZpbGVzIG9uIGEgc3RhbmRhcmQsIHN1cHBvcnRlZCBVbml4IHN5c3RlbS4gIE9uIHN1Y2ggYSBzeXN0ZW0sIHRvCi1saW5rIGEgZmlsZSBAY29kZXtoZWxsby5vfToKLQotQHNtYWxsZXhhbXBsZQotbGQgLW8gQHZhcntvdXRwdXR9IC9saWIvY3J0MC5vIGhlbGxvLm8gLWxjCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGlzIHRlbGxzIEBjb2Rle2xkfSB0byBwcm9kdWNlIGEgZmlsZSBjYWxsZWQgQHZhcntvdXRwdXR9IGFzIHRoZQotcmVzdWx0IG9mIGxpbmtpbmcgdGhlIGZpbGUgQGNvZGV7L2xpYi9jcnQwLm99IHdpdGggQGNvZGV7aGVsbG8ub30gYW5kCi10aGUgbGlicmFyeSBAY29kZXtsaWJjLmF9LCB3aGljaCB3aWxsIGNvbWUgZnJvbSB0aGUgc3RhbmRhcmQgc2VhcmNoCi1kaXJlY3Rvcmllcy4gIChTZWUgdGhlIGRpc2N1c3Npb24gb2YgdGhlIEBzYW1wey1sfSBvcHRpb24gYmVsb3cuKQotCi1UaGUgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gQGNvZGV7bGR9IG1heSBiZSBzcGVjaWZpZWQgaW4gYW55IG9yZGVyLCBhbmQKLW1heSBiZSByZXBlYXRlZCBhdCB3aWxsLiAgUmVwZWF0aW5nIG1vc3Qgb3B0aW9ucyB3aXRoIGEgZGlmZmVyZW50Ci1hcmd1bWVudCB3aWxsIGVpdGhlciBoYXZlIG5vIGZ1cnRoZXIgZWZmZWN0LCBvciBvdmVycmlkZSBwcmlvcgotb2NjdXJyZW5jZXMgKHRob3NlIGZ1cnRoZXIgdG8gdGhlIGxlZnQgb24gdGhlIGNvbW1hbmQgbGluZSkgb2YgdGhhdAotb3B0aW9uLiAgT3B0aW9ucyB3aGljaCBtYXkgYmUgbWVhbmluZ2Z1bGx5IHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSBhcmUKLW5vdGVkIGluIHRoZSBkZXNjcmlwdGlvbnMgYmVsb3cuCi0KLUBjaW5kZXggb2JqZWN0IGZpbGVzCi1Ob24tb3B0aW9uIGFyZ3VtZW50cyBhcmUgb2JqZWN0cyBmaWxlcyB3aGljaCBhcmUgdG8gYmUgbGlua2VkIHRvZ2V0aGVyLgotVGhleSBtYXkgZm9sbG93LCBwcmVjZWRlLCBvciBiZSBtaXhlZCBpbiB3aXRoIGNvbW1hbmQtbGluZSBvcHRpb25zLAotZXhjZXB0IHRoYXQgYW4gb2JqZWN0IGZpbGUgYXJndW1lbnQgbWF5IG5vdCBiZSBwbGFjZWQgYmV0d2VlbiBhbiBvcHRpb24KLWFuZCBpdHMgYXJndW1lbnQuCi0KLVVzdWFsbHkgdGhlIGxpbmtlciBpcyBpbnZva2VkIHdpdGggYXQgbGVhc3Qgb25lIG9iamVjdCBmaWxlLCBidXQgeW91IGNhbgotc3BlY2lmeSBvdGhlciBmb3JtcyBvZiBiaW5hcnkgaW5wdXQgZmlsZXMgdXNpbmcgQHNhbXB7LWx9LCBAc2FtcHstUn0sCi1hbmQgdGhlIHNjcmlwdCBjb21tYW5kIGxhbmd1YWdlLiAgSWYgQGVtcGh7bm99IGJpbmFyeSBpbnB1dCBmaWxlcyBhdCBhbGwKLWFyZSBzcGVjaWZpZWQsIHRoZSBsaW5rZXIgZG9lcyBub3QgcHJvZHVjZSBhbnkgb3V0cHV0LCBhbmQgaXNzdWVzIHRoZQotbWVzc2FnZSBAc2FtcHtObyBpbnB1dCBmaWxlc30uCi0KLUlmIHRoZSBsaW5rZXIgY2FuIG5vdCByZWNvZ25pemUgdGhlIGZvcm1hdCBvZiBhbiBvYmplY3QgZmlsZSwgaXQgd2lsbAotYXNzdW1lIHRoYXQgaXQgaXMgYSBsaW5rZXIgc2NyaXB0LiAgQSBzY3JpcHQgc3BlY2lmaWVkIGluIHRoaXMgd2F5Ci1hdWdtZW50cyB0aGUgbWFpbiBsaW5rZXIgc2NyaXB0IHVzZWQgZm9yIHRoZSBsaW5rIChlaXRoZXIgdGhlIGRlZmF1bHQKLWxpbmtlciBzY3JpcHQgb3IgdGhlIG9uZSBzcGVjaWZpZWQgYnkgdXNpbmcgQHNhbXB7LVR9KS4gIFRoaXMgZmVhdHVyZQotcGVybWl0cyB0aGUgbGlua2VyIHRvIGxpbmsgYWdhaW5zdCBhIGZpbGUgd2hpY2ggYXBwZWFycyB0byBiZSBhbiBvYmplY3QKLW9yIGFuIGFyY2hpdmUsIGJ1dCBhY3R1YWxseSBtZXJlbHkgZGVmaW5lcyBzb21lIHN5bWJvbCB2YWx1ZXMsIG9yIHVzZXMKLUBjb2Rle0lOUFVUfSBvciBAY29kZXtHUk9VUH0gdG8gbG9hZCBvdGhlciBvYmplY3RzLiAgTm90ZSB0aGF0Ci1zcGVjaWZ5aW5nIGEgc2NyaXB0IGluIHRoaXMgd2F5IHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gYXVnbWVudCB0aGUgbWFpbgotbGlua2VyIHNjcmlwdDsgaWYgeW91IHdhbnQgdG8gdXNlIHNvbWUgY29tbWFuZCB0aGF0IGxvZ2ljYWxseSBjYW4gb25seQotYXBwZWFyIG9uY2UsIHN1Y2ggYXMgdGhlIEBjb2Rle1NFQ1RJT05TfSBvciBAY29kZXtNRU1PUll9IGNvbW1hbmQsIHlvdQotbXVzdCByZXBsYWNlIHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQgdXNpbmcgdGhlIEBzYW1wey1UfSBvcHRpb24uCi1AeHJlZntTY3JpcHRzfS4KLQotRm9yIG9wdGlvbnMgd2hvc2UgbmFtZXMgYXJlIGEgc2luZ2xlIGxldHRlciwKLW9wdGlvbiBhcmd1bWVudHMgbXVzdCBlaXRoZXIgZm9sbG93IHRoZSBvcHRpb24gbGV0dGVyIHdpdGhvdXQgaW50ZXJ2ZW5pbmcKLXdoaXRlc3BhY2UsIG9yIGJlIGdpdmVuIGFzIHNlcGFyYXRlIGFyZ3VtZW50cyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlCi1vcHRpb24gdGhhdCByZXF1aXJlcyB0aGVtLgotCi1Gb3Igb3B0aW9ucyB3aG9zZSBuYW1lcyBhcmUgbXVsdGlwbGUgbGV0dGVycywgZWl0aGVyIG9uZSBkYXNoIG9yIHR3byBjYW4KLXByZWNlZGUgdGhlIG9wdGlvbiBuYW1lOyBmb3IgZXhhbXBsZSwgQHNhbXB7LS1vZm9ybWF0fSBhbmQKLUBzYW1wey0tb2Zvcm1hdH0gYXJlIGVxdWl2YWxlbnQuICBBcmd1bWVudHMgdG8gbXVsdGlwbGUtbGV0dGVyIG9wdGlvbnMKLW11c3QgZWl0aGVyIGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBvcHRpb24gbmFtZSBieSBhbiBlcXVhbHMgc2lnbiwgb3IgYmUKLWdpdmVuIGFzIHNlcGFyYXRlIGFyZ3VtZW50cyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIG9wdGlvbiB0aGF0Ci1yZXF1aXJlcyB0aGVtLiAgRm9yIGV4YW1wbGUsIEBzYW1wey0tb2Zvcm1hdCBzcmVjfSBhbmQKLUBzYW1wey0tb2Zvcm1hdD1zcmVjfSBhcmUgZXF1aXZhbGVudC4gIFVuaXF1ZSBhYmJyZXZpYXRpb25zIG9mIHRoZSBuYW1lcwotb2YgbXVsdGlwbGUtbGV0dGVyIG9wdGlvbnMgYXJlIGFjY2VwdGVkLgotCi1AdGFibGUgQGNvZGUKLUBraW5kZXggLWFAdmFye2tleXdvcmR9Ci1AaXRlbSAtYUB2YXJ7a2V5d29yZH0KLVRoaXMgb3B0aW9uIGlzIHN1cHBvcnRlZCBmb3IgSFAvVVggY29tcGF0aWJpbGl0eS4gIFRoZSBAdmFye2tleXdvcmR9Ci1hcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgc3RyaW5ncyBAc2FtcHthcmNoaXZlfSwgQHNhbXB7c2hhcmVkfSwgb3IKLUBzYW1we2RlZmF1bHR9LiAgQHNhbXB7LWFhcmNoaXZlfSBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0bwotQHNhbXB7LUJzdGF0aWN9LCBhbmQgdGhlIG90aGVyIHR3byBrZXl3b3JkcyBhcmUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQKLXRvIEBzYW1wey1CZHluYW1pY30uICBUaGlzIG9wdGlvbiBtYXkgYmUgdXNlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLgotCi1AaWZzZXQgSTk2MAotQGNpbmRleCBhcmNoaXRlY3R1cmVzCi1Aa2luZGV4IC1BQHZhcnthcmNofQotQGl0ZW0gLUFAdmFye2FyY2hpdGVjdHVyZX0KLUBraW5kZXggLS1hcmNoaXRlY3R1cmU9QHZhcnthcmNofQotQGl0ZW14IC0tYXJjaGl0ZWN0dXJlPUB2YXJ7YXJjaGl0ZWN0dXJlfQotSW4gdGhlIGN1cnJlbnQgcmVsZWFzZSBvZiBAY29kZXtsZH0sIHRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBvbmx5IGZvciB0aGUKLUludGVsIDk2MCBmYW1pbHkgb2YgYXJjaGl0ZWN0dXJlcy4gIEluIHRoYXQgQGNvZGV7bGR9IGNvbmZpZ3VyYXRpb24sIHRoZQotQHZhcnthcmNoaXRlY3R1cmV9IGFyZ3VtZW50IGlkZW50aWZpZXMgdGhlIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlIGluCi10aGUgOTYwIGZhbWlseSwgZW5hYmxpbmcgc29tZSBzYWZlZ3VhcmRzIGFuZCBtb2RpZnlpbmcgdGhlCi1hcmNoaXZlLWxpYnJhcnkgc2VhcmNoIHBhdGguICBAeHJlZntpOTYwLCxAY29kZXtsZH0gYW5kIHRoZSBJbnRlbCA5NjAKLWZhbWlseX0sIGZvciBkZXRhaWxzLgotCi1GdXR1cmUgcmVsZWFzZXMgb2YgQGNvZGV7bGR9IG1heSBzdXBwb3J0IHNpbWlsYXIgZnVuY3Rpb25hbGl0eSBmb3IKLW90aGVyIGFyY2hpdGVjdHVyZSBmYW1pbGllcy4KLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci1AY2luZGV4IGJpbmFyeSBpbnB1dCBmb3JtYXQKLUBraW5kZXggLWIgQHZhcntmb3JtYXR9Ci1Aa2luZGV4IC0tZm9ybWF0PUB2YXJ7Zm9ybWF0fQotQGNpbmRleCBpbnB1dCBmb3JtYXQKLUBjaW5kZXggaW5wdXQgZm9ybWF0Ci1AaXRlbSAtYiBAdmFye2lucHV0LWZvcm1hdH0KLUBpdGVteCAtLWZvcm1hdD1AdmFye2lucHV0LWZvcm1hdH0KLUBjb2Rle2xkfSBtYXkgYmUgY29uZmlndXJlZCB0byBzdXBwb3J0IG1vcmUgdGhhbiBvbmUga2luZCBvZiBvYmplY3QKLWZpbGUuICBJZiB5b3VyIEBjb2Rle2xkfSBpcyBjb25maWd1cmVkIHRoaXMgd2F5LCB5b3UgY2FuIHVzZSB0aGUKLUBzYW1wey1ifSBvcHRpb24gdG8gc3BlY2lmeSB0aGUgYmluYXJ5IGZvcm1hdCBmb3IgaW5wdXQgb2JqZWN0IGZpbGVzCi10aGF0IGZvbGxvdyB0aGlzIG9wdGlvbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgRXZlbiB3aGVuIEBjb2Rle2xkfSBpcwotY29uZmlndXJlZCB0byBzdXBwb3J0IGFsdGVybmF0aXZlIG9iamVjdCBmb3JtYXRzLCB5b3UgZG9uJ3QgdXN1YWxseSBuZWVkCi10byBzcGVjaWZ5IHRoaXMsIGFzIEBjb2Rle2xkfSBzaG91bGQgYmUgY29uZmlndXJlZCB0byBleHBlY3QgYXMgYQotZGVmYXVsdCBpbnB1dCBmb3JtYXQgdGhlIG1vc3QgdXN1YWwgZm9ybWF0IG9uIGVhY2ggbWFjaGluZS4KLUB2YXJ7aW5wdXQtZm9ybWF0fSBpcyBhIHRleHQgc3RyaW5nLCB0aGUgbmFtZSBvZiBhIHBhcnRpY3VsYXIgZm9ybWF0Ci1zdXBwb3J0ZWQgYnkgdGhlIEJGRCBsaWJyYXJpZXMuICAoWW91IGNhbiBsaXN0IHRoZSBhdmFpbGFibGUgYmluYXJ5Ci1mb3JtYXRzIHdpdGggQHNhbXB7b2JqZHVtcCAtaX0uKQotQHhyZWZ7QkZEfS4KLQotWW91IG1heSB3YW50IHRvIHVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgYXJlIGxpbmtpbmcgZmlsZXMgd2l0aCBhbiB1bnVzdWFsCi1iaW5hcnkgZm9ybWF0LiAgWW91IGNhbiBhbHNvIHVzZSBAc2FtcHstYn0gdG8gc3dpdGNoIGZvcm1hdHMgZXhwbGljaXRseSAod2hlbgotbGlua2luZyBvYmplY3QgZmlsZXMgb2YgZGlmZmVyZW50IGZvcm1hdHMpLCBieSBpbmNsdWRpbmcKLUBzYW1wey1iIEB2YXJ7aW5wdXQtZm9ybWF0fX0gYmVmb3JlIGVhY2ggZ3JvdXAgb2Ygb2JqZWN0IGZpbGVzIGluIGEKLXBhcnRpY3VsYXIgZm9ybWF0LiAgCi0KLVRoZSBkZWZhdWx0IGZvcm1hdCBpcyB0YWtlbiBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotQGNvZGV7R05VVEFSR0VUfS4KLUBpZnNldCBVc2VzRW52VmFycwotQHhyZWZ7RW52aXJvbm1lbnR9LgotQGVuZCBpZnNldAotWW91IGNhbiBhbHNvIGRlZmluZSB0aGUgaW5wdXQgZm9ybWF0IGZyb20gYSBzY3JpcHQsIHVzaW5nIHRoZSBjb21tYW5kCi1AY29kZXtUQVJHRVR9OyBzZWUgQHJlZntGb3JtYXQgQ29tbWFuZHN9LgotQGVuZCBpZmNsZWFyCi0KLUBraW5kZXggLWMgQHZhcntNUkktY21kZmlsZX0KLUBraW5kZXggLS1tcmktc2NyaXB0PUB2YXJ7TVJJLWNtZGZpbGV9Ci1AY2luZGV4IGNvbXBhdGliaWxpdHksIE1SSQotQGl0ZW0gLWMgQHZhcntNUkktY29tbWFuZGZpbGV9Ci1AaXRlbXggLS1tcmktc2NyaXB0PUB2YXJ7TVJJLWNvbW1hbmRmaWxlfQotRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBsaW5rZXJzIHByb2R1Y2VkIGJ5IE1SSSwgQGNvZGV7bGR9IGFjY2VwdHMgc2NyaXB0Ci1maWxlcyB3cml0dGVuIGluIGFuIGFsdGVybmF0ZSwgcmVzdHJpY3RlZCBjb21tYW5kIGxhbmd1YWdlLCBkZXNjcmliZWQgaW4KLUByZWZ7TVJJLCxNUkkgQ29tcGF0aWJsZSBTY3JpcHQgRmlsZXN9LiAgSW50cm9kdWNlIE1SSSBzY3JpcHQgZmlsZXMgd2l0aAotdGhlIG9wdGlvbiBAc2FtcHstY307IHVzZSB0aGUgQHNhbXB7LVR9IG9wdGlvbiB0byBydW4gbGlua2VyCi1zY3JpcHRzIHdyaXR0ZW4gaW4gdGhlIGdlbmVyYWwtcHVycG9zZSBAY29kZXtsZH0gc2NyaXB0aW5nIGxhbmd1YWdlLgotSWYgQHZhcntNUkktY21kZmlsZX0gZG9lcyBub3QgZXhpc3QsIEBjb2Rle2xkfSBsb29rcyBmb3IgaXQgaW4gdGhlIGRpcmVjdG9yaWVzCi1zcGVjaWZpZWQgYnkgYW55IEBzYW1wey1MfSBvcHRpb25zLgotCi1AY2luZGV4IGNvbW1vbiBhbGxvY2F0aW9uCi1Aa2luZGV4IC1kCi1Aa2luZGV4IC1kYwotQGtpbmRleCAtZHAKLUBpdGVtIC1kIAotQGl0ZW14IC1kYwotQGl0ZW14IC1kcAotVGhlc2UgdGhyZWUgb3B0aW9ucyBhcmUgZXF1aXZhbGVudDsgbXVsdGlwbGUgZm9ybXMgYXJlIHN1cHBvcnRlZCBmb3IKLWNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBsaW5rZXJzLiAgVGhleSBhc3NpZ24gc3BhY2UgdG8gY29tbW9uIHN5bWJvbHMKLWV2ZW4gaWYgYSByZWxvY2F0YWJsZSBvdXRwdXQgZmlsZSBpcyBzcGVjaWZpZWQgKHdpdGggQHNhbXB7LXJ9KS4gIFRoZQotc2NyaXB0IGNvbW1hbmQgQGNvZGV7Rk9SQ0VfQ09NTU9OX0FMTE9DQVRJT059IGhhcyB0aGUgc2FtZSBlZmZlY3QuCi1AeHJlZntNaXNjZWxsYW5lb3VzIENvbW1hbmRzfS4KLQotQGNpbmRleCBlbnRyeSBwb2ludCwgZnJvbSBjb21tYW5kIGxpbmUKLUBraW5kZXggLWUgQHZhcntlbnRyeX0KLUBraW5kZXggLS1lbnRyeT1AdmFye2VudHJ5fQotQGl0ZW0gLWUgQHZhcntlbnRyeX0gCi1AaXRlbXggLS1lbnRyeT1AdmFye2VudHJ5fQotVXNlIEB2YXJ7ZW50cnl9IGFzIHRoZSBleHBsaWNpdCBzeW1ib2wgZm9yIGJlZ2lubmluZyBleGVjdXRpb24gb2YgeW91cgotcHJvZ3JhbSwgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgZW50cnkgcG9pbnQuICBJZiB0aGVyZSBpcyBubyBzeW1ib2wKLW5hbWVkIEB2YXJ7ZW50cnl9LCB0aGUgbGlua2VyIHdpbGwgdHJ5IHRvIHBhcnNlIEB2YXJ7ZW50cnl9IGFzIGEgbnVtYmVyLAotYW5kIHVzZSB0aGF0IGFzIHRoZSBlbnRyeSBhZGRyZXNzICh0aGUgbnVtYmVyIHdpbGwgYmUgaW50ZXJwcmV0ZWQgaW4KLWJhc2UgMTA7IHlvdSBtYXkgdXNlIGEgbGVhZGluZyBAc2FtcHsweH0gZm9yIGJhc2UgMTYsIG9yIGEgbGVhZGluZwotQHNhbXB7MH0gZm9yIGJhc2UgOCkuICBAeHJlZntFbnRyeSBQb2ludH0sIGZvciBhIGRpc2N1c3Npb24gb2YgZGVmYXVsdHMKLWFuZCBvdGhlciB3YXlzIG9mIHNwZWNpZnlpbmcgdGhlIGVudHJ5IHBvaW50LgotCi1AY2luZGV4IGR5bmFtaWMgc3ltYm9sIHRhYmxlCi1Aa2luZGV4IC1FCi1Aa2luZGV4IC0tZXhwb3J0LWR5bmFtaWMKLUBpdGVtIC1FCi1AaXRlbXggLS1leHBvcnQtZHluYW1pYwotV2hlbiBjcmVhdGluZyBhIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlLCBhZGQgYWxsIHN5bWJvbHMgdG8gdGhlCi1keW5hbWljIHN5bWJvbCB0YWJsZS4gIFRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBpcyB0aGUgc2V0IG9mIHN5bWJvbHMKLXdoaWNoIGFyZSB2aXNpYmxlIGZyb20gZHluYW1pYyBvYmplY3RzIGF0IHJ1biB0aW1lLgotCi1JZiB5b3UgZG8gbm90IHVzZSB0aGlzIG9wdGlvbiwgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIHdpbGwgbm9ybWFsbHkKLWNvbnRhaW4gb25seSB0aG9zZSBzeW1ib2xzIHdoaWNoIGFyZSByZWZlcmVuY2VkIGJ5IHNvbWUgZHluYW1pYyBvYmplY3QKLW1lbnRpb25lZCBpbiB0aGUgbGluay4KLQotSWYgeW91IHVzZSBAY29kZXtkbG9wZW59IHRvIGxvYWQgYSBkeW5hbWljIG9iamVjdCB3aGljaCBuZWVkcyB0byByZWZlcgotYmFjayB0byB0aGUgc3ltYm9scyBkZWZpbmVkIGJ5IHRoZSBwcm9ncmFtLCByYXRoZXIgdGhhbiBzb21lIG90aGVyCi1keW5hbWljIG9iamVjdCwgdGhlbiB5b3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIHVzZSB0aGlzIG9wdGlvbiB3aGVuCi1saW5raW5nIHRoZSBwcm9ncmFtIGl0c2VsZi4KLQotQGNpbmRleCBiaWctZW5kaWFuIG9iamVjdHMKLUBjaW5kZXggZW5kaWFubmVzcwotQGtpbmRleCAtRUIKLUBpdGVtIC1FQgotTGluayBiaWctZW5kaWFuIG9iamVjdHMuICBUaGlzIGFmZmVjdHMgdGhlIGRlZmF1bHQgb3V0cHV0IGZvcm1hdC4KLQotQGNpbmRleCBsaXR0bGUtZW5kaWFuIG9iamVjdHMKLUBraW5kZXggLUVMCi1AaXRlbSAtRUwKLUxpbmsgbGl0dGxlLWVuZGlhbiBvYmplY3RzLiAgVGhpcyBhZmZlY3RzIHRoZSBkZWZhdWx0IG91dHB1dCBmb3JtYXQuCi0KLUBraW5kZXggLWYKLUBraW5kZXggLS1hdXhpbGlhcnkKLUBpdGVtIC1mCi1AaXRlbXggLS1hdXhpbGlhcnkgQHZhcntuYW1lfQotV2hlbiBjcmVhdGluZyBhbiBFTEYgc2hhcmVkIG9iamVjdCwgc2V0IHRoZSBpbnRlcm5hbCBEVF9BVVhJTElBUlkgZmllbGQKLXRvIHRoZSBzcGVjaWZpZWQgbmFtZS4gIFRoaXMgdGVsbHMgdGhlIGR5bmFtaWMgbGlua2VyIHRoYXQgdGhlIHN5bWJvbAotdGFibGUgb2YgdGhlIHNoYXJlZCBvYmplY3Qgc2hvdWxkIGJlIHVzZWQgYXMgYW4gYXV4aWxpYXJ5IGZpbHRlciBvbiB0aGUKLXN5bWJvbCB0YWJsZSBvZiB0aGUgc2hhcmVkIG9iamVjdCBAdmFye25hbWV9LgotCi1JZiB5b3UgbGF0ZXIgbGluayBhIHByb2dyYW0gYWdhaW5zdCB0aGlzIGZpbHRlciBvYmplY3QsIHRoZW4sIHdoZW4geW91Ci1ydW4gdGhlIHByb2dyYW0sIHRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHNlZSB0aGUgRFRfQVVYSUxJQVJZIGZpZWxkLiAgSWYKLXRoZSBkeW5hbWljIGxpbmtlciByZXNvbHZlcyBhbnkgc3ltYm9scyBmcm9tIHRoZSBmaWx0ZXIgb2JqZWN0LCBpdCB3aWxsCi1maXJzdCBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgZGVmaW5pdGlvbiBpbiB0aGUgc2hhcmVkIG9iamVjdAotQHZhcntuYW1lfS4gIElmIHRoZXJlIGlzIG9uZSwgaXQgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGRlZmluaXRpb24KLWluIHRoZSBmaWx0ZXIgb2JqZWN0LiAgVGhlIHNoYXJlZCBvYmplY3QgQHZhcntuYW1lfSBuZWVkIG5vdCBleGlzdC4KLVRodXMgdGhlIHNoYXJlZCBvYmplY3QgQHZhcntuYW1lfSBtYXkgYmUgdXNlZCB0byBwcm92aWRlIGFuIGFsdGVybmF0aXZlCi1pbXBsZW1lbnRhdGlvbiBvZiBjZXJ0YWluIGZ1bmN0aW9ucywgcGVyaGFwcyBmb3IgZGVidWdnaW5nIG9yIGZvcgotbWFjaGluZSBzcGVjaWZpYyBwZXJmb3JtYW5jZS4KLQotVGhpcyBvcHRpb24gbWF5IGJlIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZS4gIFRoZSBEVF9BVVhJTElBUlkgZW50cmllcwotd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBvbiB0aGUgY29tbWFuZCBsaW5lLgotCi1Aa2luZGV4IC1GCi1Aa2luZGV4IC0tZmlsdGVyCi1AaXRlbSAtRiBAdmFye25hbWV9Ci1AaXRlbXggLS1maWx0ZXIgQHZhcntuYW1lfQotV2hlbiBjcmVhdGluZyBhbiBFTEYgc2hhcmVkIG9iamVjdCwgc2V0IHRoZSBpbnRlcm5hbCBEVF9GSUxURVIgZmllbGQgdG8KLXRoZSBzcGVjaWZpZWQgbmFtZS4gIFRoaXMgdGVsbHMgdGhlIGR5bmFtaWMgbGlua2VyIHRoYXQgdGhlIHN5bWJvbCB0YWJsZQotb2YgdGhlIHNoYXJlZCBvYmplY3Qgd2hpY2ggaXMgYmVpbmcgY3JlYXRlZCBzaG91bGQgYmUgdXNlZCBhcyBhIGZpbHRlcgotb24gdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUgc2hhcmVkIG9iamVjdCBAdmFye25hbWV9LgotCi1JZiB5b3UgbGF0ZXIgbGluayBhIHByb2dyYW0gYWdhaW5zdCB0aGlzIGZpbHRlciBvYmplY3QsIHRoZW4sIHdoZW4geW91Ci1ydW4gdGhlIHByb2dyYW0sIHRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHNlZSB0aGUgRFRfRklMVEVSIGZpZWxkLiAgVGhlCi1keW5hbWljIGxpbmtlciB3aWxsIHJlc29sdmUgc3ltYm9scyBhY2NvcmRpbmcgdG8gdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUKLWZpbHRlciBvYmplY3QgYXMgdXN1YWwsIGJ1dCBpdCB3aWxsIGFjdHVhbGx5IGxpbmsgdG8gdGhlIGRlZmluaXRpb25zCi1mb3VuZCBpbiB0aGUgc2hhcmVkIG9iamVjdCBAdmFye25hbWV9LiAgVGh1cyB0aGUgZmlsdGVyIG9iamVjdCBjYW4gYmUKLXVzZWQgdG8gc2VsZWN0IGEgc3Vic2V0IG9mIHRoZSBzeW1ib2xzIHByb3ZpZGVkIGJ5IHRoZSBvYmplY3QKLUB2YXJ7bmFtZX0uCi0KLVNvbWUgb2xkZXIgbGlua2VycyB1c2VkIHRoZSBAY29kZXstRn0gb3B0aW9uIHRocm91Z2hvdXQgYSBjb21waWxhdGlvbgotdG9vbGNoYWluIGZvciBzcGVjaWZ5aW5nIG9iamVjdC1maWxlIGZvcm1hdCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0Ci1vYmplY3QgZmlsZXMuICBUaGUgQHNje2dudX0gbGlua2VyIHVzZXMgb3RoZXIgbWVjaGFuaXNtcyBmb3IgdGhpcwotcHVycG9zZTogdGhlIEBjb2Rley1ifSwgQGNvZGV7LS1mb3JtYXR9LCBAY29kZXstLW9mb3JtYXR9IG9wdGlvbnMsIHRoZQotQGNvZGV7VEFSR0VUfSBjb21tYW5kIGluIGxpbmtlciBzY3JpcHRzLCBhbmQgdGhlIEBjb2Rle0dOVVRBUkdFVH0KLWVudmlyb25tZW50IHZhcmlhYmxlLiAgVGhlIEBzY3tnbnV9IGxpbmtlciB3aWxsIGlnbm9yZSB0aGUgQGNvZGV7LUZ9Ci1vcHRpb24gd2hlbiBub3QgY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QuCi0KLUBraW5kZXggLWcKLUBpdGVtIC1nCi1JZ25vcmVkLiAgUHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciB0b29scy4KLQotQGtpbmRleCAtRwotQGtpbmRleCAtLWdwc2l6ZQotQGNpbmRleCBvYmplY3Qgc2l6ZQotQGl0ZW0gLUdAdmFye3ZhbHVlfQotQGl0ZW14IC0tZ3BzaXplPUB2YXJ7dmFsdWV9Ci1TZXQgdGhlIG1heGltdW0gc2l6ZSBvZiBvYmplY3RzIHRvIGJlIG9wdGltaXplZCB1c2luZyB0aGUgR1AgcmVnaXN0ZXIgdG8KLUB2YXJ7c2l6ZX0uICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3Igb2JqZWN0IGZpbGUgZm9ybWF0cyBzdWNoIGFzCi1NSVBTIEVDT0ZGIHdoaWNoIHN1cHBvcnRzIHB1dHRpbmcgbGFyZ2UgYW5kIHNtYWxsIG9iamVjdHMgaW50byBkaWZmZXJlbnQKLXNlY3Rpb25zLiAgVGhpcyBpcyBpZ25vcmVkIGZvciBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi1AY2luZGV4IHJ1bnRpbWUgbGlicmFyeSBuYW1lCi1Aa2luZGV4IC1oQHZhcntuYW1lfQotQGtpbmRleCAtc29uYW1lPUB2YXJ7bmFtZX0KLUBpdGVtIC1oQHZhcntuYW1lfQotQGl0ZW14IC1zb25hbWU9QHZhcntuYW1lfQotV2hlbiBjcmVhdGluZyBhbiBFTEYgc2hhcmVkIG9iamVjdCwgc2V0IHRoZSBpbnRlcm5hbCBEVF9TT05BTUUgZmllbGQgdG8KLXRoZSBzcGVjaWZpZWQgbmFtZS4gIFdoZW4gYW4gZXhlY3V0YWJsZSBpcyBsaW5rZWQgd2l0aCBhIHNoYXJlZCBvYmplY3QKLXdoaWNoIGhhcyBhIERUX1NPTkFNRSBmaWVsZCwgdGhlbiB3aGVuIHRoZSBleGVjdXRhYmxlIGlzIHJ1biB0aGUgZHluYW1pYwotbGlua2VyIHdpbGwgYXR0ZW1wdCB0byBsb2FkIHRoZSBzaGFyZWQgb2JqZWN0IHNwZWNpZmllZCBieSB0aGUgRFRfU09OQU1FCi1maWVsZCByYXRoZXIgdGhhbiB0aGUgdXNpbmcgdGhlIGZpbGUgbmFtZSBnaXZlbiB0byB0aGUgbGlua2VyLgotCi1Aa2luZGV4IC1pCi1AY2luZGV4IGluY3JlbWVudGFsIGxpbmsKLUBpdGVtIC1pCi1QZXJmb3JtIGFuIGluY3JlbWVudGFsIGxpbmsgKHNhbWUgYXMgb3B0aW9uIEBzYW1wey1yfSkuCi0KLUBjaW5kZXggYXJjaGl2ZSBmaWxlcywgZnJvbSBjbWQgbGluZQotQGtpbmRleCAtbEB2YXJ7YXJjaGl2ZX0KLUBraW5kZXggLS1saWJyYXJ5PUB2YXJ7YXJjaGl2ZX0KLUBpdGVtIC1sQHZhcnthcmNoaXZlfQotQGl0ZW14IC0tbGlicmFyeT1AdmFye2FyY2hpdmV9Ci1BZGQgYXJjaGl2ZSBmaWxlIEB2YXJ7YXJjaGl2ZX0gdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gbGluay4gIFRoaXMKLW9wdGlvbiBtYXkgYmUgdXNlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLiAgQGNvZGV7bGR9IHdpbGwgc2VhcmNoIGl0cwotcGF0aC1saXN0IGZvciBvY2N1cnJlbmNlcyBvZiBAY29kZXtsaWJAdmFye2FyY2hpdmV9LmF9IGZvciBldmVyeQotQHZhcnthcmNoaXZlfSBzcGVjaWZpZWQuCi0KLU9uIHN5c3RlbXMgd2hpY2ggc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLCBAY29kZXtsZH0gbWF5IGFsc28gc2VhcmNoIGZvcgotbGlicmFyaWVzIHdpdGggZXh0ZW5zaW9ucyBvdGhlciB0aGFuIEBjb2Rley5hfS4gIFNwZWNpZmljYWxseSwgb24gRUxGCi1hbmQgU3VuT1Mgc3lzdGVtcywgQGNvZGV7bGR9IHdpbGwgc2VhcmNoIGEgZGlyZWN0b3J5IGZvciBhIGxpYnJhcnkgd2l0aAotYW4gZXh0ZW5zaW9uIG9mIEBjb2Rley5zb30gYmVmb3JlIHNlYXJjaGluZyBmb3Igb25lIHdpdGggYW4gZXh0ZW5zaW9uIG9mCi1AY29kZXsuYX0uICBCeSBjb252ZW50aW9uLCBhIEBjb2Rley5zb30gZXh0ZW5zaW9uIGluZGljYXRlcyBhIHNoYXJlZAotbGlicmFyeS4KLQotVGhlIGxpbmtlciB3aWxsIHNlYXJjaCBhbiBhcmNoaXZlIG9ubHkgb25jZSwgYXQgdGhlIGxvY2F0aW9uIHdoZXJlIGl0IGlzCi1zcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIElmIHRoZSBhcmNoaXZlIGRlZmluZXMgYSBzeW1ib2wgd2hpY2gKLXdhcyB1bmRlZmluZWQgaW4gc29tZSBvYmplY3Qgd2hpY2ggYXBwZWFyZWQgYmVmb3JlIHRoZSBhcmNoaXZlIG9uIHRoZQotY29tbWFuZCBsaW5lLCB0aGUgbGlua2VyIHdpbGwgaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgZmlsZShzKSBmcm9tIHRoZQotYXJjaGl2ZS4gIEhvd2V2ZXIsIGFuIHVuZGVmaW5lZCBzeW1ib2wgaW4gYW4gb2JqZWN0IGFwcGVhcmluZyBsYXRlciBvbgotdGhlIGNvbW1hbmQgbGluZSB3aWxsIG5vdCBjYXVzZSB0aGUgbGlua2VyIHRvIHNlYXJjaCB0aGUgYXJjaGl2ZSBhZ2Fpbi4KLQotU2VlIHRoZSBAY29kZXstKH0gb3B0aW9uIGZvciBhIHdheSB0byBmb3JjZSB0aGUgbGlua2VyIHRvIHNlYXJjaAotYXJjaGl2ZXMgbXVsdGlwbGUgdGltZXMuCi0KLVlvdSBtYXkgbGlzdCB0aGUgc2FtZSBhcmNoaXZlIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLUBpZnNldCBHRU5FUklDCi1UaGlzIHR5cGUgb2YgYXJjaGl2ZSBzZWFyY2hpbmcgaXMgc3RhbmRhcmQgZm9yIFVuaXggbGlua2Vycy4gIEhvd2V2ZXIsCi1pZiB5b3UgYXJlIHVzaW5nIEBjb2Rle2xkfSBvbiBBSVgsIG5vdGUgdGhhdCBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUKLWJlaGF2aW91ciBvZiB0aGUgQUlYIGxpbmtlci4KLUBlbmQgaWZzZXQKLQotQGNpbmRleCBzZWFyY2ggZGlyZWN0b3J5LCBmcm9tIGNtZCBsaW5lCi1Aa2luZGV4IC1MQHZhcntkaXJ9Ci1Aa2luZGV4IC0tbGlicmFyeS1wYXRoPUB2YXJ7ZGlyfQotQGl0ZW0gLUxAdmFye3NlYXJjaGRpcn0gCi1AaXRlbXggLS1saWJyYXJ5LXBhdGg9QHZhcntzZWFyY2hkaXJ9Ci1BZGQgcGF0aCBAdmFye3NlYXJjaGRpcn0gdG8gdGhlIGxpc3Qgb2YgcGF0aHMgdGhhdCBAY29kZXtsZH0gd2lsbCBzZWFyY2gKLWZvciBhcmNoaXZlIGxpYnJhcmllcyBhbmQgQGNvZGV7bGR9IGNvbnRyb2wgc2NyaXB0cy4gIFlvdSBtYXkgdXNlIHRoaXMKLW9wdGlvbiBhbnkgbnVtYmVyIG9mIHRpbWVzLiAgVGhlIGRpcmVjdG9yaWVzIGFyZSBzZWFyY2hlZCBpbiB0aGUgb3JkZXIKLWluIHdoaWNoIHRoZXkgYXJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgRGlyZWN0b3JpZXMgc3BlY2lmaWVkCi1vbiB0aGUgY29tbWFuZCBsaW5lIGFyZSBzZWFyY2hlZCBiZWZvcmUgdGhlIGRlZmF1bHQgZGlyZWN0b3JpZXMuICBBbGwKLUBjb2Rley1MfSBvcHRpb25zIGFwcGx5IHRvIGFsbCBAY29kZXstbH0gb3B0aW9ucywgcmVnYXJkbGVzcyBvZiB0aGUKLW9yZGVyIGluIHdoaWNoIHRoZSBvcHRpb25zIGFwcGVhci4KLQotQGlmc2V0IFVzZXNFbnZWYXJzCi1UaGUgZGVmYXVsdCBzZXQgb2YgcGF0aHMgc2VhcmNoZWQgKHdpdGhvdXQgYmVpbmcgc3BlY2lmaWVkIHdpdGgKLUBzYW1wey1MfSkgZGVwZW5kcyBvbiB3aGljaCBlbXVsYXRpb24gbW9kZSBAY29kZXtsZH0gaXMgdXNpbmcsIGFuZCBpbgotc29tZSBjYXNlcyBhbHNvIG9uIGhvdyBpdCB3YXMgY29uZmlndXJlZC4gIEB4cmVme0Vudmlyb25tZW50fS4KLUBlbmQgaWZzZXQKLQotVGhlIHBhdGhzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBpbiBhIGxpbmsgc2NyaXB0IHdpdGggdGhlCi1AY29kZXtTRUFSQ0hfRElSfSBjb21tYW5kLiAgRGlyZWN0b3JpZXMgc3BlY2lmaWVkIHRoaXMgd2F5IGFyZSBzZWFyY2hlZAotYXQgdGhlIHBvaW50IGluIHdoaWNoIHRoZSBsaW5rZXIgc2NyaXB0IGFwcGVhcnMgaW4gdGhlIGNvbW1hbmQgbGluZS4KLQotQGNpbmRleCBlbXVsYXRpb24KLUBraW5kZXggLW0gQHZhcntlbXVsYXRpb259Ci1AaXRlbSAtbUB2YXJ7ZW11bGF0aW9ufQotRW11bGF0ZSB0aGUgQHZhcntlbXVsYXRpb259IGxpbmtlci4gIFlvdSBjYW4gbGlzdCB0aGUgYXZhaWxhYmxlCi1lbXVsYXRpb25zIHdpdGggdGhlIEBzYW1wey0tdmVyYm9zZX0gb3IgQHNhbXB7LVZ9IG9wdGlvbnMuCi0KLUlmIHRoZSBAc2FtcHstbX0gb3B0aW9uIGlzIG5vdCB1c2VkLCB0aGUgZW11bGF0aW9uIGlzIHRha2VuIGZyb20gdGhlCi1AY29kZXtMREVNVUxBVElPTn0gZW52aXJvbm1lbnQgdmFyaWFibGUsIGlmIHRoYXQgaXMgZGVmaW5lZC4KLQotT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBlbXVsYXRpb24gZGVwZW5kcyB1cG9uIGhvdyB0aGUgbGlua2VyIHdhcwotY29uZmlndXJlZC4KLQotQGNpbmRleCBsaW5rIG1hcAotQGtpbmRleCAtTQotQGtpbmRleCAtLXByaW50LW1hcAotQGl0ZW0gLU0KLUBpdGVteCAtLXByaW50LW1hcAotUHJpbnQgYSBsaW5rIG1hcCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiAgQSBsaW5rIG1hcCBwcm92aWRlcwotaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpbmssIGluY2x1ZGluZyB0aGUgZm9sbG93aW5nOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotV2hlcmUgb2JqZWN0IGZpbGVzIGFuZCBzeW1ib2xzIGFyZSBtYXBwZWQgaW50byBtZW1vcnkuCi1AaXRlbQotSG93IGNvbW1vbiBzeW1ib2xzIGFyZSBhbGxvY2F0ZWQuCi1AaXRlbQotQWxsIGFyY2hpdmUgbWVtYmVycyBpbmNsdWRlZCBpbiB0aGUgbGluaywgd2l0aCBhIG1lbnRpb24gb2YgdGhlIHN5bWJvbAotd2hpY2ggY2F1c2VkIHRoZSBhcmNoaXZlIG1lbWJlciB0byBiZSBicm91Z2h0IGluLgotQGVuZCBpdGVtaXplCi0KLUBraW5kZXggLW4KLUBjaW5kZXggcmVhZC1vbmx5IHRleHQKLUBjaW5kZXggTk1BR0lDCi1Aa2luZGV4IC0tbm1hZ2ljCi1AaXRlbSAtbgotQGl0ZW14IC0tbm1hZ2ljCi1TZXQgdGhlIHRleHQgc2VnbWVudCB0byBiZSByZWFkIG9ubHksIGFuZCBtYXJrIHRoZSBvdXRwdXQgYXMKLUBjb2Rle05NQUdJQ30gaWYgcG9zc2libGUuCi0KLUBraW5kZXggLU4KLUBraW5kZXggLS1vbWFnaWMKLUBjaW5kZXggcmVhZC93cml0ZSBmcm9tIGNtZCBsaW5lCi1AY2luZGV4IE9NQUdJQwotQGl0ZW0gLU4gCi1AaXRlbXggLS1vbWFnaWMKLVNldCB0aGUgdGV4dCBhbmQgZGF0YSBzZWN0aW9ucyB0byBiZSByZWFkYWJsZSBhbmQgd3JpdGFibGUuICBBbHNvLCBkbwotbm90IHBhZ2UtYWxpZ24gdGhlIGRhdGEgc2VnbWVudC4gIElmIHRoZSBvdXRwdXQgZm9ybWF0IHN1cHBvcnRzIFVuaXgKLXN0eWxlIG1hZ2ljIG51bWJlcnMsIG1hcmsgdGhlIG91dHB1dCBhcyBAY29kZXtPTUFHSUN9LgotCi1Aa2luZGV4IC1vIEB2YXJ7b3V0cHV0fQotQGtpbmRleCAtLW91dHB1dD1AdmFye291dHB1dH0KLUBjaW5kZXggbmFtaW5nIHRoZSBvdXRwdXQgZmlsZQotQGl0ZW0gLW8gQHZhcntvdXRwdXR9Ci1AaXRlbXggLS1vdXRwdXQ9QHZhcntvdXRwdXR9Ci1Vc2UgQHZhcntvdXRwdXR9IGFzIHRoZSBuYW1lIGZvciB0aGUgcHJvZ3JhbSBwcm9kdWNlZCBieSBAY29kZXtsZH07IGlmIHRoaXMKLW9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmFtZSBAZmlsZXthLm91dH0gaXMgdXNlZCBieSBkZWZhdWx0LiAgVGhlCi1zY3JpcHQgY29tbWFuZCBAY29kZXtPVVRQVVR9IGNhbiBhbHNvIHNwZWNpZnkgdGhlIG91dHB1dCBmaWxlIG5hbWUuCi0KLUBraW5kZXggLU8gQHZhcntsZXZlbH0KLUBjaW5kZXggZ2VuZXJhdGluZyBvcHRpbWl6ZWQgb3V0cHV0Ci1AaXRlbSAtTyBAdmFye2xldmVsfQotSWYgQHZhcntsZXZlbH0gaXMgYSBudW1lcmljIHZhbHVlcyBncmVhdGVyIHRoYW4gemVybyBAY29kZXtsZH0gb3B0aW1pemVzCi10aGUgb3V0cHV0LiAgVGhpcyBtaWdodCB0YWtlIHNpZ25pZmljYW50bHkgbG9uZ2VyIGFuZCB0aGVyZWZvcmUgcHJvYmFibHkKLXNob3VsZCBvbmx5IGJlIGVuYWJsZWQgZm9yIHRoZSBmaW5hbCBiaW5hcnkuCi0KLUBjaW5kZXggcGFydGlhbCBsaW5rCi1AY2luZGV4IHJlbG9jYXRhYmxlIG91dHB1dAotQGtpbmRleCAtcgotQGtpbmRleCAtLXJlbG9jYXRlYWJsZQotQGl0ZW0gLXIKLUBpdGVteCAtLXJlbG9jYXRlYWJsZQotR2VuZXJhdGUgcmVsb2NhdGFibGUgb3V0cHV0LS0taS5lLiwgZ2VuZXJhdGUgYW4gb3V0cHV0IGZpbGUgdGhhdCBjYW4gaW4KLXR1cm4gc2VydmUgYXMgaW5wdXQgdG8gQGNvZGV7bGR9LiAgVGhpcyBpcyBvZnRlbiBjYWxsZWQgQGRmbntwYXJ0aWFsCi1saW5raW5nfS4gIEFzIGEgc2lkZSBlZmZlY3QsIGluIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgc3RhbmRhcmQgVW5peAotbWFnaWMgbnVtYmVycywgdGhpcyBvcHRpb24gYWxzbyBzZXRzIHRoZSBvdXRwdXQgZmlsZSdzIG1hZ2ljIG51bWJlciB0bwotQGNvZGV7T01BR0lDfS4KLUBjIDsgc2VlIEBjb2Rley1OfS4gCi1JZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBhbiBhYnNvbHV0ZSBmaWxlIGlzIHByb2R1Y2VkLiAgV2hlbgotbGlua2luZyBDKysgcHJvZ3JhbXMsIHRoaXMgb3B0aW9uIEBlbXBoe3dpbGwgbm90fSByZXNvbHZlIHJlZmVyZW5jZXMgdG8KLWNvbnN0cnVjdG9yczsgdG8gZG8gdGhhdCwgdXNlIEBzYW1wey1Vcn0uCi0KLVRoaXMgb3B0aW9uIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgQHNhbXB7LWl9LgotCi1Aa2luZGV4IC1SIEB2YXJ7ZmlsZX0KLUBraW5kZXggLS1qdXN0LXN5bWJvbHM9QHZhcntmaWxlfQotQGNpbmRleCBzeW1ib2wtb25seSBpbnB1dAotQGl0ZW0gLVIgQHZhcntmaWxlbmFtZX0KLUBpdGVteCAtLWp1c3Qtc3ltYm9scz1AdmFye2ZpbGVuYW1lfQotUmVhZCBzeW1ib2wgbmFtZXMgYW5kIHRoZWlyIGFkZHJlc3NlcyBmcm9tIEB2YXJ7ZmlsZW5hbWV9LCBidXQgZG8gbm90Ci1yZWxvY2F0ZSBpdCBvciBpbmNsdWRlIGl0IGluIHRoZSBvdXRwdXQuICBUaGlzIGFsbG93cyB5b3VyIG91dHB1dCBmaWxlCi10byByZWZlciBzeW1ib2xpY2FsbHkgdG8gYWJzb2x1dGUgbG9jYXRpb25zIG9mIG1lbW9yeSBkZWZpbmVkIGluIG90aGVyCi1wcm9ncmFtcy4gIFlvdSBtYXkgdXNlIHRoaXMgb3B0aW9uIG1vcmUgdGhhbiBvbmNlLgotCi1Gb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIEVMRiBsaW5rZXJzLCBpZiB0aGUgQGNvZGV7LVJ9IG9wdGlvbiBpcwotZm9sbG93ZWQgYnkgYSBkaXJlY3RvcnkgbmFtZSwgcmF0aGVyIHRoYW4gYSBmaWxlIG5hbWUsIGl0IGlzIHRyZWF0ZWQgYXMKLXRoZSBAY29kZXstcnBhdGh9IG9wdGlvbi4KLQotQGtpbmRleCAtcwotQGtpbmRleCAtLXN0cmlwLWFsbAotQGNpbmRleCBzdHJpcCBhbGwgc3ltYm9scwotQGl0ZW0gLXMgCi1AaXRlbXggLS1zdHJpcC1hbGwKLU9taXQgYWxsIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvdXRwdXQgZmlsZS4KLQotQGtpbmRleCAtUwotQGtpbmRleCAtLXN0cmlwLWRlYnVnCi1AY2luZGV4IHN0cmlwIGRlYnVnZ2VyIHN5bWJvbHMKLUBpdGVtIC1TIAotQGl0ZW14IC0tc3RyaXAtZGVidWcKLU9taXQgZGVidWdnZXIgc3ltYm9sIGluZm9ybWF0aW9uIChidXQgbm90IGFsbCBzeW1ib2xzKSBmcm9tIHRoZSBvdXRwdXQgZmlsZS4KLQotQGtpbmRleCAtdAotQGtpbmRleCAtLXRyYWNlCi1AY2luZGV4IGlucHV0IGZpbGVzLCBkaXNwbGF5aW5nCi1AaXRlbSAtdCAKLUBpdGVteCAtLXRyYWNlCi1QcmludCB0aGUgbmFtZXMgb2YgdGhlIGlucHV0IGZpbGVzIGFzIEBjb2Rle2xkfSBwcm9jZXNzZXMgdGhlbS4KLQotQGtpbmRleCAtVCBAdmFye3NjcmlwdH0KLUBraW5kZXggLS1zY3JpcHQ9QHZhcntzY3JpcHR9Ci1AY2luZGV4IHNjcmlwdCBmaWxlcwotQGl0ZW0gLVQgQHZhcntzY3JpcHRmaWxlfQotQGl0ZW14IC0tc2NyaXB0PUB2YXJ7c2NyaXB0ZmlsZX0KLVVzZSBAdmFye3NjcmlwdGZpbGV9IGFzIHRoZSBsaW5rZXIgc2NyaXB0LiAgVGhpcyBzY3JpcHQgcmVwbGFjZXMKLUBjb2Rle2xkfSdzIGRlZmF1bHQgbGlua2VyIHNjcmlwdCAocmF0aGVyIHRoYW4gYWRkaW5nIHRvIGl0KSwgc28KLUB2YXJ7Y29tbWFuZGZpbGV9IG11c3Qgc3BlY2lmeSBldmVyeXRoaW5nIG5lY2Vzc2FyeSB0byBkZXNjcmliZSB0aGUKLW91dHB1dCBmaWxlLiAgWW91IG11c3QgdXNlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIHVzZSBhIGNvbW1hbmQKLXdoaWNoIGNhbiBvbmx5IGFwcGVhciBvbmNlIGluIGEgbGlua2VyIHNjcmlwdCwgc3VjaCBhcyB0aGUKLUBjb2Rle1NFQ1RJT05TfSBvciBAY29kZXtNRU1PUll9IGNvbW1hbmQuICBAeHJlZntTY3JpcHRzfS4gIElmCi1AdmFye3NjcmlwdGZpbGV9IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgQGNvZGV7bGR9Ci1sb29rcyBmb3IgaXQgaW4gdGhlIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSBhbnkgcHJlY2VkaW5nIEBzYW1wey1MfQotb3B0aW9ucy4gIE11bHRpcGxlIEBzYW1wey1UfSBvcHRpb25zIGFjY3VtdWxhdGUuCi0KLUBraW5kZXggLXUgQHZhcntzeW1ib2x9Ci1Aa2luZGV4IC0tdW5kZWZpbmVkPUB2YXJ7c3ltYm9sfQotQGNpbmRleCB1bmRlZmluZWQgc3ltYm9sCi1AaXRlbSAtdSBAdmFye3N5bWJvbH0KLUBpdGVteCAtLXVuZGVmaW5lZD1AdmFye3N5bWJvbH0KLUZvcmNlIEB2YXJ7c3ltYm9sfSB0byBiZSBlbnRlcmVkIGluIHRoZSBvdXRwdXQgZmlsZSBhcyBhbiB1bmRlZmluZWQKLXN5bWJvbC4gIERvaW5nIHRoaXMgbWF5LCBmb3IgZXhhbXBsZSwgdHJpZ2dlciBsaW5raW5nIG9mIGFkZGl0aW9uYWwKLW1vZHVsZXMgZnJvbSBzdGFuZGFyZCBsaWJyYXJpZXMuICBAc2FtcHstdX0gbWF5IGJlIHJlcGVhdGVkIHdpdGgKLWRpZmZlcmVudCBvcHRpb24gYXJndW1lbnRzIHRvIGVudGVyIGFkZGl0aW9uYWwgdW5kZWZpbmVkIHN5bWJvbHMuICBUaGlzCi1vcHRpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgQGNvZGV7RVhURVJOfSBsaW5rZXIgc2NyaXB0IGNvbW1hbmQuCi0KLUBraW5kZXggLVVyCi1AY2luZGV4IGNvbnN0cnVjdG9ycwotQGl0ZW0gLVVyIAotRm9yIGFueXRoaW5nIG90aGVyIHRoYW4gQysrIHByb2dyYW1zLCB0aGlzIG9wdGlvbiBpcyBlcXVpdmFsZW50IHRvCi1Ac2FtcHstcn06IGl0IGdlbmVyYXRlcyByZWxvY2F0YWJsZSBvdXRwdXQtLS1pLmUuLCBhbiBvdXRwdXQgZmlsZSB0aGF0IGNhbiBpbgotdHVybiBzZXJ2ZSBhcyBpbnB1dCB0byBAY29kZXtsZH0uICBXaGVuIGxpbmtpbmcgQysrIHByb2dyYW1zLCBAc2FtcHstVXJ9Ci1AZW1waHtkb2VzfSByZXNvbHZlIHJlZmVyZW5jZXMgdG8gY29uc3RydWN0b3JzLCB1bmxpa2UgQHNhbXB7LXJ9LgotSXQgZG9lcyBub3Qgd29yayB0byB1c2UgQHNhbXB7LVVyfSBvbiBmaWxlcyB0aGF0IHdlcmUgdGhlbXNlbHZlcyBsaW5rZWQKLXdpdGggQHNhbXB7LVVyfTsgb25jZSB0aGUgY29uc3RydWN0b3IgdGFibGUgaGFzIGJlZW4gYnVpbHQsIGl0IGNhbm5vdAotYmUgYWRkZWQgdG8uICBVc2UgQHNhbXB7LVVyfSBvbmx5IGZvciB0aGUgbGFzdCBwYXJ0aWFsIGxpbmssIGFuZAotQHNhbXB7LXJ9IGZvciB0aGUgb3RoZXJzLgotCi1Aa2luZGV4IC12Ci1Aa2luZGV4IC1WCi1Aa2luZGV4IC0tdmVyc2lvbgotQGNpbmRleCB2ZXJzaW9uCi1AaXRlbSAtdgotQGl0ZW14IC0tdmVyc2lvbgotQGl0ZW14IC1WCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgQGNvZGV7bGR9LiAgVGhlIEBjb2Rley1WfSBvcHRpb24gYWxzbwotbGlzdHMgdGhlIHN1cHBvcnRlZCBlbXVsYXRpb25zLgotCi1Aa2luZGV4IC14Ci1Aa2luZGV4IC0tZGlzY2FyZC1hbGwKLUBjaW5kZXggZGVsZXRpbmcgbG9jYWwgc3ltYm9scwotQGl0ZW0gLXgKLUBpdGVteCAtLWRpc2NhcmQtYWxsCi1EZWxldGUgYWxsIGxvY2FsIHN5bWJvbHMuCi0KLUBraW5kZXggLVgKLUBraW5kZXggLS1kaXNjYXJkLWxvY2FscwotQGNpbmRleCBsb2NhbCBzeW1ib2xzLCBkZWxldGluZwotQGNpbmRleCBMLCBkZWxldGluZyBzeW1ib2xzIGJlZ2lubmluZwotQGl0ZW0gLVggCi1AaXRlbXggLS1kaXNjYXJkLWxvY2FscwotRGVsZXRlIGFsbCB0ZW1wb3JhcnkgbG9jYWwgc3ltYm9scy4gIEZvciBtb3N0IHRhcmdldHMsIHRoaXMgaXMgYWxsIGxvY2FsCi1zeW1ib2xzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggQHNhbXB7TH0uCi0KLUBraW5kZXggLXkgQHZhcntzeW1ib2x9Ci1Aa2luZGV4IC0tdHJhY2Utc3ltYm9sPUB2YXJ7c3ltYm9sfQotQGNpbmRleCBzeW1ib2wgdHJhY2luZwotQGl0ZW0gLXkgQHZhcntzeW1ib2x9Ci1AaXRlbXggLS10cmFjZS1zeW1ib2w9QHZhcntzeW1ib2x9Ci1QcmludCB0aGUgbmFtZSBvZiBlYWNoIGxpbmtlZCBmaWxlIGluIHdoaWNoIEB2YXJ7c3ltYm9sfSBhcHBlYXJzLiAgVGhpcwotb3B0aW9uIG1heSBiZSBnaXZlbiBhbnkgbnVtYmVyIG9mIHRpbWVzLiAgT24gbWFueSBzeXN0ZW1zIGl0IGlzIG5lY2Vzc2FyeQotdG8gcHJlcGVuZCBhbiB1bmRlcnNjb3JlLgotCi1UaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhbiB1bmRlZmluZWQgc3ltYm9sIGluIHlvdXIgbGluayBidXQKLWRvbid0IGtub3cgd2hlcmUgdGhlIHJlZmVyZW5jZSBpcyBjb21pbmcgZnJvbS4KLQotQGtpbmRleCAtWSBAdmFye3BhdGh9Ci1AaXRlbSAtWSBAdmFye3BhdGh9Ci1BZGQgQHZhcntwYXRofSB0byB0aGUgZGVmYXVsdCBsaWJyYXJ5IHNlYXJjaCBwYXRoLiAgVGhpcyBvcHRpb24gZXhpc3RzCi1mb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5LgotCi1Aa2luZGV4IC16IEB2YXJ7a2V5d29yZH0KLUBpdGVtIC16IEB2YXJ7a2V5d29yZH0KLVRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eS4KLQotQGtpbmRleCAtKAotQGNpbmRleCBncm91cHMgb2YgYXJjaGl2ZXMKLUBpdGVtIC0oIEB2YXJ7YXJjaGl2ZXN9IC0pCi1AaXRlbXggLS1zdGFydC1ncm91cCBAdmFye2FyY2hpdmVzfSAtLWVuZC1ncm91cAotVGhlIEB2YXJ7YXJjaGl2ZXN9IHNob3VsZCBiZSBhIGxpc3Qgb2YgYXJjaGl2ZSBmaWxlcy4gIFRoZXkgbWF5IGJlCi1laXRoZXIgZXhwbGljaXQgZmlsZSBuYW1lcywgb3IgQHNhbXB7LWx9IG9wdGlvbnMuCi0KLVRoZSBzcGVjaWZpZWQgYXJjaGl2ZXMgYXJlIHNlYXJjaGVkIHJlcGVhdGVkbHkgdW50aWwgbm8gbmV3IHVuZGVmaW5lZAotcmVmZXJlbmNlcyBhcmUgY3JlYXRlZC4gIE5vcm1hbGx5LCBhbiBhcmNoaXZlIGlzIHNlYXJjaGVkIG9ubHkgb25jZSBpbgotdGhlIG9yZGVyIHRoYXQgaXQgaXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBJZiBhIHN5bWJvbCBpbiB0aGF0Ci1hcmNoaXZlIGlzIG5lZWRlZCB0byByZXNvbHZlIGFuIHVuZGVmaW5lZCBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgYW4KLW9iamVjdCBpbiBhbiBhcmNoaXZlIHRoYXQgYXBwZWFycyBsYXRlciBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGUgbGlua2VyCi13b3VsZCBub3QgYmUgYWJsZSB0byByZXNvbHZlIHRoYXQgcmVmZXJlbmNlLiAgQnkgZ3JvdXBpbmcgdGhlIGFyY2hpdmVzLAotdGhleSBhbGwgYmUgc2VhcmNoZWQgcmVwZWF0ZWRseSB1bnRpbCBhbGwgcG9zc2libGUgcmVmZXJlbmNlcyBhcmUKLXJlc29sdmVkLgotCi1Vc2luZyB0aGlzIG9wdGlvbiBoYXMgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBjb3N0LiAgSXQgaXMgYmVzdCB0byB1c2UKLWl0IG9ubHkgd2hlbiB0aGVyZSBhcmUgdW5hdm9pZGFibGUgY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuIHR3byBvcgotbW9yZSBhcmNoaXZlcy4KLQotQGtpbmRleCAtYXNzZXJ0IEB2YXJ7a2V5d29yZH0KLUBpdGVtIC1hc3NlcnQgQHZhcntrZXl3b3JkfQotVGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3IgU3VuT1MgY29tcGF0aWJpbGl0eS4KLQotQGtpbmRleCAtQmR5bmFtaWMKLUBraW5kZXggLWR5Ci1Aa2luZGV4IC1jYWxsX3NoYXJlZAotQGl0ZW0gLUJkeW5hbWljCi1AaXRlbXggLWR5Ci1AaXRlbXggLWNhbGxfc2hhcmVkCi1MaW5rIGFnYWluc3QgZHluYW1pYyBsaWJyYXJpZXMuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbiBwbGF0Zm9ybXMKLWZvciB3aGljaCBzaGFyZWQgbGlicmFyaWVzIGFyZSBzdXBwb3J0ZWQuICBUaGlzIG9wdGlvbiBpcyBub3JtYWxseSB0aGUKLWRlZmF1bHQgb24gc3VjaCBwbGF0Zm9ybXMuICBUaGUgZGlmZmVyZW50IHZhcmlhbnRzIG9mIHRoaXMgb3B0aW9uIGFyZQotZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2YXJpb3VzIHN5c3RlbXMuICBZb3UgbWF5IHVzZSB0aGlzIG9wdGlvbgotbXVsdGlwbGUgdGltZXMgb24gdGhlIGNvbW1hbmQgbGluZTogaXQgYWZmZWN0cyBsaWJyYXJ5IHNlYXJjaGluZyBmb3IKLUBjb2Rley1sfSBvcHRpb25zIHdoaWNoIGZvbGxvdyBpdC4KLQotQGtpbmRleCAtQnN0YXRpYwotQGtpbmRleCAtZG4KLUBraW5kZXggLW5vbl9zaGFyZWQKLUBraW5kZXggLXN0YXRpYwotQGl0ZW0gLUJzdGF0aWMgCi1AaXRlbXggLWRuCi1AaXRlbXggLW5vbl9zaGFyZWQKLUBpdGVteCAtc3RhdGljCi1EbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbgotcGxhdGZvcm1zIGZvciB3aGljaCBzaGFyZWQgbGlicmFyaWVzIGFyZSBzdXBwb3J0ZWQuICBUaGUgZGlmZmVyZW50Ci12YXJpYW50cyBvZiB0aGlzIG9wdGlvbiBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2YXJpb3VzIHN5c3RlbXMuICBZb3UKLW1heSB1c2UgdGhpcyBvcHRpb24gbXVsdGlwbGUgdGltZXMgb24gdGhlIGNvbW1hbmQgbGluZTogaXQgYWZmZWN0cwotbGlicmFyeSBzZWFyY2hpbmcgZm9yIEBjb2Rley1sfSBvcHRpb25zIHdoaWNoIGZvbGxvdyBpdC4KLQotQGtpbmRleCAtQnN5bWJvbGljCi1AaXRlbSAtQnN5bWJvbGljCi1XaGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGJpbmQgcmVmZXJlbmNlcyB0byBnbG9iYWwgc3ltYm9scyB0byB0aGUKLWRlZmluaXRpb24gd2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeSwgaWYgYW55LiAgTm9ybWFsbHksIGl0IGlzIHBvc3NpYmxlCi1mb3IgYSBwcm9ncmFtIGxpbmtlZCBhZ2FpbnN0IGEgc2hhcmVkIGxpYnJhcnkgdG8gb3ZlcnJpZGUgdGhlIGRlZmluaXRpb24KLXdpdGhpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICBUaGlzIG9wdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwgb24gRUxGCi1wbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLgotCi1Aa2luZGV4IC0tY2hlY2stc2VjdGlvbnMKLUBraW5kZXggLS1uby1jaGVjay1zZWN0aW9ucwotQGl0ZW0gLS1jaGVjay1zZWN0aW9ucwotQGl0ZW0gLS1uby1jaGVjay1zZWN0aW9ucwotQXNrcyB0aGUgbGlua2VyIEBlbXBoe25vdH0gdG8gY2hlY2sgc2VjdGlvbiBhZGRyZXNzZXMgYWZ0ZXIgdGhleSBoYXZlCi1iZWVuIGFzc2lnbmVkIHRvIHNlZSBpZiB0aGVyZSBhbnkgb3ZlcmxhcHMuICBOb3JtYWxseSB0aGUgbGlua2VyIHdpbGwKLXBlcmZvcm0gdGhpcyBjaGVjaywgYW5kIGlmIGl0IGZpbmRzIGFueSBvdmVybGFwcyBpdCB3aWxsIHByb2R1Y2UKLXN1aXRhYmxlIGVycm9yIG1lc3NhZ2VzLiAgVGhlIGxpbmtlciBkb2VzIGtub3cgYWJvdXQsIGFuZCBkb2VzIG1ha2UKLWFsbG93YW5jZXMgZm9yIHNlY3Rpb25zIGluIG92ZXJsYXlzLiAgVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGNhbiBiZQotcmVzdG9yZWQgYnkgdXNpbmcgdGhlIGNvbW1hbmQgbGluZSBzd2l0Y2ggQHNhbXB7LS1jaGVjay1zZWN0aW9uc30uCi0KLUBjaW5kZXggY3Jvc3MgcmVmZXJlbmNlIHRhYmxlCi1Aa2luZGV4IC0tY3JlZgotQGl0ZW0gLS1jcmVmCi1PdXRwdXQgYSBjcm9zcyByZWZlcmVuY2UgdGFibGUuICBJZiBhIGxpbmtlciBtYXAgZmlsZSBpcyBiZWluZwotZ2VuZXJhdGVkLCB0aGUgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlIGlzIHByaW50ZWQgdG8gdGhlIG1hcCBmaWxlLgotT3RoZXJ3aXNlLCBpdCBpcyBwcmludGVkIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCi0KLVRoZSBmb3JtYXQgb2YgdGhlIHRhYmxlIGlzIGludGVudGlvbmFsbHkgc2ltcGxlLCBzbyB0aGF0IGl0IG1heSBiZQotZWFzaWx5IHByb2Nlc3NlZCBieSBhIHNjcmlwdCBpZiBuZWNlc3NhcnkuICBUaGUgc3ltYm9scyBhcmUgcHJpbnRlZCBvdXQsCi1zb3J0ZWQgYnkgbmFtZS4gIEZvciBlYWNoIHN5bWJvbCwgYSBsaXN0IG9mIGZpbGUgbmFtZXMgaXMgZ2l2ZW4uICBJZiB0aGUKLXN5bWJvbCBpcyBkZWZpbmVkLCB0aGUgZmlyc3QgZmlsZSBsaXN0ZWQgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZQotZGVmaW5pdGlvbi4gIFRoZSByZW1haW5pbmcgZmlsZXMgY29udGFpbiByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wuCi0KLUBjaW5kZXggc3ltYm9scywgZnJvbSBjb21tYW5kIGxpbmUKLUBraW5kZXggLS1kZWZzeW0gQHZhcntzeW1ib2x9PUB2YXJ7ZXhwfQotQGl0ZW0gLS1kZWZzeW0gQHZhcntzeW1ib2x9PUB2YXJ7ZXhwcmVzc2lvbn0KLUNyZWF0ZSBhIGdsb2JhbCBzeW1ib2wgaW4gdGhlIG91dHB1dCBmaWxlLCBjb250YWluaW5nIHRoZSBhYnNvbHV0ZQotYWRkcmVzcyBnaXZlbiBieSBAdmFye2V4cHJlc3Npb259LiAgWW91IG1heSB1c2UgdGhpcyBvcHRpb24gYXMgbWFueQotdGltZXMgYXMgbmVjZXNzYXJ5IHRvIGRlZmluZSBtdWx0aXBsZSBzeW1ib2xzIGluIHRoZSBjb21tYW5kIGxpbmUuICBBCi1saW1pdGVkIGZvcm0gb2YgYXJpdGhtZXRpYyBpcyBzdXBwb3J0ZWQgZm9yIHRoZSBAdmFye2V4cHJlc3Npb259IGluIHRoaXMKLWNvbnRleHQ6IHlvdSBtYXkgZ2l2ZSBhIGhleGFkZWNpbWFsIGNvbnN0YW50IG9yIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nCi1zeW1ib2wsIG9yIHVzZSBAY29kZXsrfSBhbmQgQGNvZGV7LX0gdG8gYWRkIG9yIHN1YnRyYWN0IGhleGFkZWNpbWFsCi1jb25zdGFudHMgb3Igc3ltYm9scy4gIElmIHlvdSBuZWVkIG1vcmUgZWxhYm9yYXRlIGV4cHJlc3Npb25zLCBjb25zaWRlcgotdXNpbmcgdGhlIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlIGZyb20gYSBzY3JpcHQgKEBweHJlZntBc3NpZ25tZW50cywsCi1Bc3NpZ25tZW50OiBTeW1ib2wgRGVmaW5pdGlvbnN9KS4gIEBlbXBoe05vdGU6fSB0aGVyZSBzaG91bGQgYmUgbm8gd2hpdGUKLXNwYWNlIGJldHdlZW4gQHZhcntzeW1ib2x9LCB0aGUgZXF1YWxzIHNpZ24gKGBgQGtleXs9fScnKSwgYW5kCi1AdmFye2V4cHJlc3Npb259LgotCi1AY2luZGV4IGRlbWFuZ2xpbmcsIGZyb20gY29tbWFuZCBsaW5lCi1Aa2luZGV4IC0tZGVtYW5nbGUKLUBraW5kZXggLS1uby1kZW1hbmdsZQotQGl0ZW0gLS1kZW1hbmdsZQotQGl0ZW14IC0tbm8tZGVtYW5nbGUKLVRoZXNlIG9wdGlvbnMgY29udHJvbCB3aGV0aGVyIHRvIGRlbWFuZ2xlIHN5bWJvbCBuYW1lcyBpbiBlcnJvciBtZXNzYWdlcwotYW5kIG90aGVyIG91dHB1dC4gIFdoZW4gdGhlIGxpbmtlciBpcyB0b2xkIHRvIGRlbWFuZ2xlLCBpdCB0cmllcyB0bwotcHJlc2VudCBzeW1ib2wgbmFtZXMgaW4gYSByZWFkYWJsZSBmYXNoaW9uOiBpdCBzdHJpcHMgbGVhZGluZwotdW5kZXJzY29yZXMgaWYgdGhleSBhcmUgdXNlZCBieSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LCBhbmQgY29udmVydHMgQysrCi1tYW5nbGVkIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXIgcmVhZGFibGUgbmFtZXMuICBUaGUgbGlua2VyIHdpbGwgZGVtYW5nbGUKLWJ5IGRlZmF1bHQgdW5sZXNzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBAc2FtcHtDT0xMRUNUX05PX0RFTUFOR0xFfSBpcwotc2V0LiAgVGhlc2Ugb3B0aW9ucyBtYXkgYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdC4KLQotQGNpbmRleCBkeW5hbWljIGxpbmtlciwgZnJvbSBjb21tYW5kIGxpbmUKLUBraW5kZXggLS1keW5hbWljLWxpbmtlciBAdmFye2ZpbGV9Ci1AaXRlbSAtLWR5bmFtaWMtbGlua2VyIEB2YXJ7ZmlsZX0KLVNldCB0aGUgbmFtZSBvZiB0aGUgZHluYW1pYyBsaW5rZXIuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuCi1nZW5lcmF0aW5nIGR5bmFtaWNhbGx5IGxpbmtlZCBFTEYgZXhlY3V0YWJsZXMuICBUaGUgZGVmYXVsdCBkeW5hbWljCi1saW5rZXIgaXMgbm9ybWFsbHkgY29ycmVjdDsgZG9uJ3QgdXNlIHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZQotZG9pbmcuCi0KLUBjaW5kZXggTUlQUyBlbWJlZGRlZCBQSUMgY29kZQotQGtpbmRleCAtLWVtYmVkZGVkLXJlbG9jcwotQGl0ZW0gLS1lbWJlZGRlZC1yZWxvY3MKLVRoaXMgb3B0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIGxpbmtpbmcgTUlQUyBlbWJlZGRlZCBQSUMgY29kZSwKLWdlbmVyYXRlZCBieSB0aGUgLW1lbWJlZGRlZC1waWMgb3B0aW9uIHRvIHRoZSBAc2N7Z251fSBjb21waWxlciBhbmQKLWFzc2VtYmxlci4gIEl0IGNhdXNlcyB0aGUgbGlua2VyIHRvIGNyZWF0ZSBhIHRhYmxlIHdoaWNoIG1heSBiZSB1c2VkIGF0Ci1ydW50aW1lIHRvIHJlbG9jYXRlIGFueSBkYXRhIHdoaWNoIHdhcyBzdGF0aWNhbGx5IGluaXRpYWxpemVkIHRvIHBvaW50ZXIKLXZhbHVlcy4gIFNlZSB0aGUgY29kZSBpbiB0ZXN0c3VpdGUvbGQtZW1waWMgZm9yIGRldGFpbHMuCi0KLUBraW5kZXggLS1mb3JjZS1leGUtc3VmZml4Ci1AaXRlbSAgLS1mb3JjZS1leGUtc3VmZml4Ci1NYWtlIHN1cmUgdGhhdCBhbiBvdXRwdXQgZmlsZSBoYXMgYSAuZXhlIHN1ZmZpeC4KLQotSWYgYSBzdWNjZXNzZnVsbHkgYnVpbHQgZnVsbHkgbGlua2VkIG91dHB1dCBmaWxlIGRvZXMgbm90IGhhdmUgYQotQGNvZGV7LmV4ZX0gb3IgQGNvZGV7LmRsbH0gc3VmZml4LCB0aGlzIG9wdGlvbiBmb3JjZXMgdGhlIGxpbmtlciB0byBjb3B5Ci10aGUgb3V0cHV0IGZpbGUgdG8gb25lIG9mIHRoZSBzYW1lIG5hbWUgd2l0aCBhIEBjb2Rley5leGV9IHN1ZmZpeC4gVGhpcwotb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIHVubW9kaWZpZWQgVW5peCBtYWtlZmlsZXMgb24gYSBNaWNyb3NvZnQKLVdpbmRvd3MgaG9zdCwgc2luY2Ugc29tZSB2ZXJzaW9ucyBvZiBXaW5kb3dzIHdvbid0IHJ1biBhbiBpbWFnZSB1bmxlc3MKLWl0IGVuZHMgaW4gYSBAY29kZXsuZXhlfSBzdWZmaXguCi0KLUBraW5kZXggLS1nYy1zZWN0aW9ucwotQGtpbmRleCAtLW5vLWdjLXNlY3Rpb25zCi1AY2luZGV4IGdhcmJhZ2UgY29sbGVjdGlvbgotQGl0ZW0gLS1uby1nYy1zZWN0aW9ucwotQGl0ZW14IC0tZ2Mtc2VjdGlvbnMKLUVuYWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24gb2YgdW51c2VkIGlucHV0IHNlY3Rpb25zLiAgSXQgaXMgaWdub3JlZCBvbgotdGFyZ2V0cyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoaXMgb3B0aW9uLiAgVGhpcyBvcHRpb24gaXMgbm90IGNvbXBhdGlibGUKLXdpdGggQHNhbXB7LXJ9LCBub3Igc2hvdWxkIGl0IGJlIHVzZWQgd2l0aCBkeW5hbWljIGxpbmtpbmcuICBUaGUgZGVmYXVsdAotYmVoYXZpb3VyIChvZiBub3QgcGVyZm9ybWluZyB0aGlzIGdhcmJhZ2UgY29sbGVjdGlvbikgY2FuIGJlIHJlc3RvcmVkIGJ5Ci1zcGVjaWZ5aW5nIEBzYW1wey0tbm8tZ2Mtc2VjdGlvbnN9IG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLUBjaW5kZXggaGVscAotQGNpbmRleCB1c2FnZQotQGtpbmRleCAtLWhlbHAKLUBpdGVtIC0taGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgotCi1Aa2luZGV4IC1NYXAKLUBpdGVtIC1NYXAgQHZhcnttYXBmaWxlfQotUHJpbnQgYSBsaW5rIG1hcCB0byB0aGUgZmlsZSBAdmFye21hcGZpbGV9LiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUKLUBzYW1wey1NfSBvcHRpb24sIGFib3ZlLgotCi1AY2luZGV4IG1lbW9yeSB1c2FnZQotQGtpbmRleCAtLW5vLWtlZXAtbWVtb3J5Ci1AaXRlbSAtLW5vLWtlZXAtbWVtb3J5Ci1AY29kZXtsZH0gbm9ybWFsbHkgb3B0aW1pemVzIGZvciBzcGVlZCBvdmVyIG1lbW9yeSB1c2FnZSBieSBjYWNoaW5nIHRoZQotc3ltYm9sIHRhYmxlcyBvZiBpbnB1dCBmaWxlcyBpbiBtZW1vcnkuICBUaGlzIG9wdGlvbiB0ZWxscyBAY29kZXtsZH0gdG8KLWluc3RlYWQgb3B0aW1pemUgZm9yIG1lbW9yeSB1c2FnZSwgYnkgcmVyZWFkaW5nIHRoZSBzeW1ib2wgdGFibGVzIGFzCi1uZWNlc3NhcnkuICBUaGlzIG1heSBiZSByZXF1aXJlZCBpZiBAY29kZXtsZH0gcnVucyBvdXQgb2YgbWVtb3J5IHNwYWNlCi13aGlsZSBsaW5raW5nIGEgbGFyZ2UgZXhlY3V0YWJsZS4KLQotQGtpbmRleCAtLW5vLXVuZGVmaW5lZAotQGl0ZW0gLS1uby11bmRlZmluZWQKLU5vcm1hbGx5IHdoZW4gY3JlYXRpbmcgYSBub24tc3ltYm9saWMgc2hhcmVkIGxpYnJhcnksIHVuZGVmaW5lZCBzeW1ib2xzCi1hcmUgYWxsb3dlZCBhbmQgbGVmdCB0byBiZSByZXNvbHZlZCBieSB0aGUgcnVudGltZSBsb2FkZXIuICBUaGlzIG9wdGlvbgotZGlzYWxsb3dzIHN1Y2ggdW5kZWZpbmVkIHN5bWJvbHMuCi0KLUBraW5kZXggLS1uby13YXJuLW1pc21hdGNoCi1AaXRlbSAtLW5vLXdhcm4tbWlzbWF0Y2gKLU5vcm1hbGx5IEBjb2Rle2xkfSB3aWxsIGdpdmUgYW4gZXJyb3IgaWYgeW91IHRyeSB0byBsaW5rIHRvZ2V0aGVyIGlucHV0Ci1maWxlcyB0aGF0IGFyZSBtaXNtYXRjaGVkIGZvciBzb21lIHJlYXNvbiwgcGVyaGFwcyBiZWNhdXNlIHRoZXkgaGF2ZQotYmVlbiBjb21waWxlZCBmb3IgZGlmZmVyZW50IHByb2Nlc3NvcnMgb3IgZm9yIGRpZmZlcmVudCBlbmRpYW5uZXNzZXMuCi1UaGlzIG9wdGlvbiB0ZWxscyBAY29kZXtsZH0gdGhhdCBpdCBzaG91bGQgc2lsZW50bHkgcGVybWl0IHN1Y2ggcG9zc2libGUKLWVycm9ycy4gIFRoaXMgb3B0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCBjYXJlLCBpbiBjYXNlcyB3aGVuIHlvdQotaGF2ZSB0YWtlbiBzb21lIHNwZWNpYWwgYWN0aW9uIHRoYXQgZW5zdXJlcyB0aGF0IHRoZSBsaW5rZXIgZXJyb3JzIGFyZQotaW5hcHByb3ByaWF0ZS4KLQotQGtpbmRleCAtLW5vLXdob2xlLWFyY2hpdmUKLUBpdGVtIC0tbm8td2hvbGUtYXJjaGl2ZQotVHVybiBvZmYgdGhlIGVmZmVjdCBvZiB0aGUgQGNvZGV7LS13aG9sZS1hcmNoaXZlfSBvcHRpb24gZm9yIHN1YnNlcXVlbnQKLWFyY2hpdmUgZmlsZXMuCi0KLUBjaW5kZXggb3V0cHV0IGZpbGUgYWZ0ZXIgZXJyb3JzCi1Aa2luZGV4IC0tbm9pbmhpYml0LWV4ZWMKLUBpdGVtIC0tbm9pbmhpYml0LWV4ZWMKLVJldGFpbiB0aGUgZXhlY3V0YWJsZSBvdXRwdXQgZmlsZSB3aGVuZXZlciBpdCBpcyBzdGlsbCB1c2FibGUuCi1Ob3JtYWxseSwgdGhlIGxpbmtlciB3aWxsIG5vdCBwcm9kdWNlIGFuIG91dHB1dCBmaWxlIGlmIGl0IGVuY291bnRlcnMKLWVycm9ycyBkdXJpbmcgdGhlIGxpbmsgcHJvY2VzczsgaXQgZXhpdHMgd2l0aG91dCB3cml0aW5nIGFuIG91dHB1dCBmaWxlCi13aGVuIGl0IGlzc3VlcyBhbnkgZXJyb3Igd2hhdHNvZXZlci4KLQotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci1Aa2luZGV4IC0tb2Zvcm1hdAotQGl0ZW0gLS1vZm9ybWF0IEB2YXJ7b3V0cHV0LWZvcm1hdH0KLUBjb2Rle2xkfSBtYXkgYmUgY29uZmlndXJlZCB0byBzdXBwb3J0IG1vcmUgdGhhbiBvbmUga2luZCBvZiBvYmplY3QKLWZpbGUuICBJZiB5b3VyIEBjb2Rle2xkfSBpcyBjb25maWd1cmVkIHRoaXMgd2F5LCB5b3UgY2FuIHVzZSB0aGUKLUBzYW1wey0tb2Zvcm1hdH0gb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGJpbmFyeSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQKLW9iamVjdCBmaWxlLiAgRXZlbiB3aGVuIEBjb2Rle2xkfSBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQgYWx0ZXJuYXRpdmUKLW9iamVjdCBmb3JtYXRzLCB5b3UgZG9uJ3QgdXN1YWxseSBuZWVkIHRvIHNwZWNpZnkgdGhpcywgYXMgQGNvZGV7bGR9Ci1zaG91bGQgYmUgY29uZmlndXJlZCB0byBwcm9kdWNlIGFzIGEgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IHRoZSBtb3N0Ci11c3VhbCBmb3JtYXQgb24gZWFjaCBtYWNoaW5lLiAgQHZhcntvdXRwdXQtZm9ybWF0fSBpcyBhIHRleHQgc3RyaW5nLCB0aGUKLW5hbWUgb2YgYSBwYXJ0aWN1bGFyIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIEJGRCBsaWJyYXJpZXMuICAoWW91IGNhbgotbGlzdCB0aGUgYXZhaWxhYmxlIGJpbmFyeSBmb3JtYXRzIHdpdGggQHNhbXB7b2JqZHVtcCAtaX0uKSAgVGhlIHNjcmlwdAotY29tbWFuZCBAY29kZXtPVVRQVVRfRk9STUFUfSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSBvdXRwdXQgZm9ybWF0LCBidXQKLXRoaXMgb3B0aW9uIG92ZXJyaWRlcyBpdC4gIEB4cmVme0JGRH0uCi1AZW5kIGlmY2xlYXIKLQotQGtpbmRleCAtcW1hZ2ljCi1AaXRlbSAtcW1hZ2ljCi1UaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBMaW51eCBjb21wYXRpYmlsaXR5LgotCi1Aa2luZGV4IC1ReQotQGl0ZW0gLVF5Ci1UaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBTVlI0IGNvbXBhdGliaWxpdHkuCi0KLUBraW5kZXggLS1yZWxheAotQGNpbmRleCBzeW50aGVzaXppbmcgbGlua2VyCi1AY2luZGV4IHJlbGF4aW5nIGFkZHJlc3NpbmcgbW9kZXMKLUBpdGVtIC0tcmVsYXgKLUFuIG9wdGlvbiB3aXRoIG1hY2hpbmUgZGVwZW5kZW50IGVmZmVjdHMuICAKLUBpZnNldCBHRU5FUklDCi1UaGlzIG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBvbiBhIGZldyB0YXJnZXRzLgotQGVuZCBpZnNldAotQGlmc2V0IEg4MzAwCi1AeHJlZntIOC8zMDAsLEBjb2Rle2xkfSBhbmQgdGhlIEg4LzMwMH0uCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSTk2MAotQHhyZWZ7aTk2MCwsIEBjb2Rle2xkfSBhbmQgdGhlIEludGVsIDk2MCBmYW1pbHl9LgotQGVuZCBpZnNldAotCi0KLU9uIHNvbWUgcGxhdGZvcm1zLCB0aGUgQHNhbXB7LS1yZWxheH0gb3B0aW9uIHBlcmZvcm1zIGdsb2JhbAotb3B0aW1pemF0aW9ucyB0aGF0IGJlY29tZSBwb3NzaWJsZSB3aGVuIHRoZSBsaW5rZXIgcmVzb2x2ZXMgYWRkcmVzc2luZwotaW4gdGhlIHByb2dyYW0sIHN1Y2ggYXMgcmVsYXhpbmcgYWRkcmVzcyBtb2RlcyBhbmQgc3ludGhlc2l6aW5nIG5ldwotaW5zdHJ1Y3Rpb25zIGluIHRoZSBvdXRwdXQgb2JqZWN0IGZpbGUuCi0KLU9uIHNvbWUgcGxhdGZvcm1zIHRoZXNlIGxpbmsgdGltZSBnbG9iYWwgb3B0aW1pemF0aW9ucyBtYXkgbWFrZSBzeW1ib2xpYwotZGVidWdnaW5nIG9mIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSBpbXBvc3NpYmxlLgotQGlmc2V0IEdFTkVSSUMKLVRoaXMgaXMga25vd24gdG8gYmUKLXRoZSBjYXNlIGZvciB0aGUgTWF0c3VzaGl0YSBNTjEwMjAwIGFuZCBNTjEwMzAwIGZhbWlseSBvZiBwcm9jZXNzb3JzLgotQGVuZCBpZnNldAotCi1AaWZzZXQgR0VORVJJQwotT24gcGxhdGZvcm1zIHdoZXJlIHRoaXMgaXMgbm90IHN1cHBvcnRlZCwgQHNhbXB7LS1yZWxheH0gaXMgYWNjZXB0ZWQsCi1idXQgaWdub3JlZC4KLUBlbmQgaWZzZXQKLQotQGNpbmRleCByZXRhaW5pbmcgc3BlY2lmaWVkIHN5bWJvbHMKLUBjaW5kZXggc3RyaXBwaW5nIGFsbCBidXQgc29tZSBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbHMsIHJldGFpbmluZyBzZWxlY3RpdmVseQotQGl0ZW0gLS1yZXRhaW4tc3ltYm9scy1maWxlIEB2YXJ7ZmlsZW5hbWV9Ci1SZXRhaW4gQGVtcGh7b25seX0gdGhlIHN5bWJvbHMgbGlzdGVkIGluIHRoZSBmaWxlIEB2YXJ7ZmlsZW5hbWV9LAotZGlzY2FyZGluZyBhbGwgb3RoZXJzLiAgQHZhcntmaWxlbmFtZX0gaXMgc2ltcGx5IGEgZmxhdCBmaWxlLCB3aXRoIG9uZQotc3ltYm9sIG5hbWUgcGVyIGxpbmUuICBUaGlzIG9wdGlvbiBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpbiBlbnZpcm9ubWVudHMKLUBpZnNldCBHRU5FUklDCi0oc3VjaCBhcyBWeFdvcmtzKQotQGVuZCBpZnNldAotd2hlcmUgYSBsYXJnZSBnbG9iYWwgc3ltYm9sIHRhYmxlIGlzIGFjY3VtdWxhdGVkIGdyYWR1YWxseSwgdG8gY29uc2VydmUKLXJ1bi10aW1lIG1lbW9yeS4KLQotQHNhbXB7LS1yZXRhaW4tc3ltYm9scy1maWxlfSBkb2VzIEBlbXBoe25vdH0gZGlzY2FyZCB1bmRlZmluZWQgc3ltYm9scywKLW9yIHN5bWJvbHMgbmVlZGVkIGZvciByZWxvY2F0aW9ucy4KLQotWW91IG1heSBvbmx5IHNwZWNpZnkgQHNhbXB7LS1yZXRhaW4tc3ltYm9scy1maWxlfSBvbmNlIGluIHRoZSBjb21tYW5kCi1saW5lLiAgSXQgb3ZlcnJpZGVzIEBzYW1wey1zfSBhbmQgQHNhbXB7LVN9LgotCi1AaWZzZXQgR0VORVJJQwotQGl0ZW0gLXJwYXRoIEB2YXJ7ZGlyfQotQGNpbmRleCBydW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGgKLUBraW5kZXggLXJwYXRoCi1BZGQgYSBkaXJlY3RvcnkgdG8gdGhlIHJ1bnRpbWUgbGlicmFyeSBzZWFyY2ggcGF0aC4gIFRoaXMgaXMgdXNlZCB3aGVuCi1saW5raW5nIGFuIEVMRiBleGVjdXRhYmxlIHdpdGggc2hhcmVkIG9iamVjdHMuICBBbGwgQGNvZGV7LXJwYXRofQotYXJndW1lbnRzIGFyZSBjb25jYXRlbmF0ZWQgYW5kIHBhc3NlZCB0byB0aGUgcnVudGltZSBsaW5rZXIsIHdoaWNoIHVzZXMKLXRoZW0gdG8gbG9jYXRlIHNoYXJlZCBvYmplY3RzIGF0IHJ1bnRpbWUuICBUaGUgQGNvZGV7LXJwYXRofSBvcHRpb24gaXMKLWFsc28gdXNlZCB3aGVuIGxvY2F0aW5nIHNoYXJlZCBvYmplY3RzIHdoaWNoIGFyZSBuZWVkZWQgYnkgc2hhcmVkCi1vYmplY3RzIGV4cGxpY2l0bHkgaW5jbHVkZWQgaW4gdGhlIGxpbms7IHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlCi1AY29kZXstcnBhdGgtbGlua30gb3B0aW9uLiAgSWYgQGNvZGV7LXJwYXRofSBpcyBub3QgdXNlZCB3aGVuIGxpbmtpbmcgYW4KLUVMRiBleGVjdXRhYmxlLCB0aGUgY29udGVudHMgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi1AY29kZXtMRF9SVU5fUEFUSH0gd2lsbCBiZSB1c2VkIGlmIGl0IGlzIGRlZmluZWQuCi0KLVRoZSBAY29kZXstcnBhdGh9IG9wdGlvbiBtYXkgYWxzbyBiZSB1c2VkIG9uIFN1bk9TLiAgQnkgZGVmYXVsdCwgb24KLVN1bk9TLCB0aGUgbGlua2VyIHdpbGwgZm9ybSBhIHJ1bnRpbWUgc2VhcmNoIHBhdGNoIG91dCBvZiBhbGwgdGhlCi1AY29kZXstTH0gb3B0aW9ucyBpdCBpcyBnaXZlbi4gIElmIGEgQGNvZGV7LXJwYXRofSBvcHRpb24gaXMgdXNlZCwgdGhlCi1ydW50aW1lIHNlYXJjaCBwYXRoIHdpbGwgYmUgZm9ybWVkIGV4Y2x1c2l2ZWx5IHVzaW5nIHRoZSBAY29kZXstcnBhdGh9Ci1vcHRpb25zLCBpZ25vcmluZyB0aGUgQGNvZGV7LUx9IG9wdGlvbnMuICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB1c2luZwotZ2NjLCB3aGljaCBhZGRzIG1hbnkgQGNvZGV7LUx9IG9wdGlvbnMgd2hpY2ggbWF5IGJlIG9uIE5GUyBtb3VudGVkCi1maWxlc3lzdGVtcy4KLQotRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBFTEYgbGlua2VycywgaWYgdGhlIEBjb2Rley1SfSBvcHRpb24gaXMKLWZvbGxvd2VkIGJ5IGEgZGlyZWN0b3J5IG5hbWUsIHJhdGhlciB0aGFuIGEgZmlsZSBuYW1lLCBpdCBpcyB0cmVhdGVkIGFzCi10aGUgQGNvZGV7LXJwYXRofSBvcHRpb24uCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBHRU5FUklDCi1AY2luZGV4IGxpbmstdGltZSBydW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGgKLUBraW5kZXggLXJwYXRoLWxpbmsKLUBpdGVtIC1ycGF0aC1saW5rIEB2YXJ7RElSfQotV2hlbiB1c2luZyBFTEYgb3IgU3VuT1MsIG9uZSBzaGFyZWQgbGlicmFyeSBtYXkgcmVxdWlyZSBhbm90aGVyLiAgVGhpcwotaGFwcGVucyB3aGVuIGFuIEBjb2Rle2xkIC1zaGFyZWR9IGxpbmsgaW5jbHVkZXMgYSBzaGFyZWQgbGlicmFyeSBhcyBvbmUKLW9mIHRoZSBpbnB1dCBmaWxlcy4KLQotV2hlbiB0aGUgbGlua2VyIGVuY291bnRlcnMgc3VjaCBhIGRlcGVuZGVuY3kgd2hlbiBkb2luZyBhIG5vbi1zaGFyZWQsCi1ub24tcmVsb2NhdGFibGUgbGluaywgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHRyeSB0byBsb2NhdGUgdGhlIHJlcXVpcmVkCi1zaGFyZWQgbGlicmFyeSBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgbGluaywgaWYgaXQgaXMgbm90IGluY2x1ZGVkCi1leHBsaWNpdGx5LiAgSW4gc3VjaCBhIGNhc2UsIHRoZSBAY29kZXstcnBhdGgtbGlua30gb3B0aW9uCi1zcGVjaWZpZXMgdGhlIGZpcnN0IHNldCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2guICBUaGUKLUBjb2Rley1ycGF0aC1saW5rfSBvcHRpb24gbWF5IHNwZWNpZnkgYSBzZXF1ZW5jZSBvZiBkaXJlY3RvcnkgbmFtZXMKLWVpdGhlciBieSBzcGVjaWZ5aW5nIGEgbGlzdCBvZiBuYW1lcyBzZXBhcmF0ZWQgYnkgY29sb25zLCBvciBieQotYXBwZWFyaW5nIG11bHRpcGxlIHRpbWVzLgotCi1UaGUgbGlua2VyIHVzZXMgdGhlIGZvbGxvd2luZyBzZWFyY2ggcGF0aHMgdG8gbG9jYXRlIHJlcXVpcmVkIHNoYXJlZAotbGlicmFyaWVzLgotQGVudW1lcmF0ZQotQGl0ZW0KLUFueSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgQGNvZGV7LXJwYXRoLWxpbmt9IG9wdGlvbnMuCi1AaXRlbQotQW55IGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSBAY29kZXstcnBhdGh9IG9wdGlvbnMuICBUaGUgZGlmZmVyZW5jZQotYmV0d2VlbiBAY29kZXstcnBhdGh9IGFuZCBAY29kZXstcnBhdGgtbGlua30gaXMgdGhhdCBkaXJlY3Rvcmllcwotc3BlY2lmaWVkIGJ5IEBjb2Rley1ycGF0aH0gb3B0aW9ucyBhcmUgaW5jbHVkZWQgaW4gdGhlIGV4ZWN1dGFibGUgYW5kCi11c2VkIGF0IHJ1bnRpbWUsIHdoZXJlYXMgdGhlIEBjb2Rley1ycGF0aC1saW5rfSBvcHRpb24gaXMgb25seSBlZmZlY3RpdmUKLWF0IGxpbmsgdGltZS4KLUBpdGVtCi1PbiBhbiBFTEYgc3lzdGVtLCBpZiB0aGUgQGNvZGV7LXJwYXRofSBhbmQgQGNvZGV7cnBhdGgtbGlua30gb3B0aW9ucwotd2VyZSBub3QgdXNlZCwgc2VhcmNoIHRoZSBjb250ZW50cyBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLUBjb2Rle0xEX1JVTl9QQVRIfS4KLUBpdGVtCi1PbiBTdW5PUywgaWYgdGhlIEBjb2Rley1ycGF0aH0gb3B0aW9uIHdhcyBub3QgdXNlZCwgc2VhcmNoIGFueQotZGlyZWN0b3JpZXMgc3BlY2lmaWVkIHVzaW5nIEBjb2Rley1MfSBvcHRpb25zLgotQGl0ZW0KLUZvciBhIG5hdGl2ZSBsaW5rZXIsIHRoZSBjb250ZW50cyBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLUBjb2Rle0xEX0xJQlJBUllfUEFUSH0uCi1AaXRlbQotVGhlIGRlZmF1bHQgZGlyZWN0b3JpZXMsIG5vcm1hbGx5IEBmaWxley9saWJ9IGFuZCBAZmlsZXsvdXNyL2xpYn0uCi1AaXRlbQotRm9yIGEgbmF0aXZlIGxpbmtlciBvbiBhbiBFTEYgc3lzdGVtLCBpZiB0aGUgZmlsZSBAZmlsZXsvZXRjL2xkLnNvLmNvbmZ9Ci1leGlzdHMsIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGZvdW5kIGluIHRoYXQgZmlsZS4KLUBlbmQgZW51bWVyYXRlCi0KLUlmIHRoZSByZXF1aXJlZCBzaGFyZWQgbGlicmFyeSBpcyBub3QgZm91bmQsIHRoZSBsaW5rZXIgd2lsbCBpc3N1ZSBhCi13YXJuaW5nIGFuZCBjb250aW51ZSB3aXRoIHRoZSBsaW5rLgotQGVuZCBpZnNldAotCi1Aa2luZGV4IC1zaGFyZWQKLUBraW5kZXggLUJzaGFyZWFibGUKLUBpdGVtIC1zaGFyZWQKLUBpdGVteCAtQnNoYXJlYWJsZQotQGNpbmRleCBzaGFyZWQgbGlicmFyaWVzCi1DcmVhdGUgYSBzaGFyZWQgbGlicmFyeS4gIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIG9uIEVMRiwgWENPRkYKLWFuZCBTdW5PUyBwbGF0Zm9ybXMuICBPbiBTdW5PUywgdGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEKLXNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBAY29kZXstZX0gb3B0aW9uIGlzIG5vdCB1c2VkIGFuZCB0aGVyZSBhcmUKLXVuZGVmaW5lZCBzeW1ib2xzIGluIHRoZSBsaW5rLgotCi1AaXRlbSAtLXNvcnQtY29tbW9uCi1Aa2luZGV4IC0tc29ydC1jb21tb24KLVRoaXMgb3B0aW9uIHRlbGxzIEBjb2Rle2xkfSB0byBzb3J0IHRoZSBjb21tb24gc3ltYm9scyBieSBzaXplIHdoZW4gaXQKLXBsYWNlcyB0aGVtIGluIHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgc2VjdGlvbnMuICBGaXJzdCBjb21lIGFsbCB0aGUgb25lCi1ieXRlIHN5bWJvbHMsIHRoZW4gYWxsIHRoZSB0d28gYnl0ZXMsIHRoZW4gYWxsIHRoZSBmb3VyIGJ5dGVzLCBhbmQgdGhlbgotZXZlcnl0aGluZyBlbHNlLiAgVGhpcyBpcyB0byBwcmV2ZW50IGdhcHMgYmV0d2VlbiBzeW1ib2xzIGR1ZSB0bwotYWxpZ25tZW50IGNvbnN0cmFpbnRzLgotCi1Aa2luZGV4IC0tc3BsaXQtYnktZmlsZQotQGl0ZW0gLS1zcGxpdC1ieS1maWxlCi1TaW1pbGFyIHRvIEBjb2Rley0tc3BsaXQtYnktcmVsb2N9IGJ1dCBjcmVhdGVzIGEgbmV3IG91dHB1dCBzZWN0aW9uIGZvcgotZWFjaCBpbnB1dCBmaWxlLgotCi1Aa2luZGV4IC0tc3BsaXQtYnktcmVsb2MKLUBpdGVtIC0tc3BsaXQtYnktcmVsb2MgQHZhcntjb3VudH0KLVRyeXMgdG8gY3JlYXRlcyBleHRyYSBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0IGZpbGUgc28gdGhhdCBubyBzaW5nbGUKLW91dHB1dCBzZWN0aW9uIGluIHRoZSBmaWxlIGNvbnRhaW5zIG1vcmUgdGhhbiBAdmFye2NvdW50fSByZWxvY2F0aW9ucy4KLVRoaXMgaXMgdXNlZnVsIHdoZW4gZ2VuZXJhdGluZyBodWdlIHJlbG9jYXRhYmxlIGZvciBkb3dubG9hZGluZyBpbnRvCi1jZXJ0YWluIHJlYWwgdGltZSBrZXJuZWxzIHdpdGggdGhlIENPRkYgb2JqZWN0IGZpbGUgZm9ybWF0OyBzaW5jZSBDT0ZGCi1jYW5ub3QgcmVwcmVzZW50IG1vcmUgdGhhbiA2NTUzNSByZWxvY2F0aW9ucyBpbiBhIHNpbmdsZSBzZWN0aW9uLiAgTm90ZQotdGhhdCB0aGlzIHdpbGwgZmFpbCB0byB3b3JrIHdpdGggb2JqZWN0IGZpbGUgZm9ybWF0cyB3aGljaCBkbyBub3QKLXN1cHBvcnQgYXJiaXRyYXJ5IHNlY3Rpb25zLiAgVGhlIGxpbmtlciB3aWxsIG5vdCBzcGxpdCB1cCBpbmRpdmlkdWFsCi1pbnB1dCBzZWN0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24sIHNvIGlmIGEgc2luZ2xlIGlucHV0IHNlY3Rpb24gY29udGFpbnMKLW1vcmUgdGhhbiBAdmFye2NvdW50fSByZWxvY2F0aW9ucyBvbmUgb3V0cHV0IHNlY3Rpb24gd2lsbCBjb250YWluIHRoYXQKLW1hbnkgcmVsb2NhdGlvbnMuCi0KLUBraW5kZXggLS1zdGF0cwotQGl0ZW0gLS1zdGF0cwotQ29tcHV0ZSBhbmQgZGlzcGxheSBzdGF0aXN0aWNzIGFib3V0IHRoZSBvcGVyYXRpb24gb2YgdGhlIGxpbmtlciwgc3VjaAotYXMgZXhlY3V0aW9uIHRpbWUgYW5kIG1lbW9yeSB1c2FnZS4KLQotQGtpbmRleCAtLXRyYWRpdGlvbmFsLWZvcm1hdAotQGNpbmRleCB0cmFkaXRpb25hbCBmb3JtYXQKLUBpdGVtIC0tdHJhZGl0aW9uYWwtZm9ybWF0Ci1Gb3Igc29tZSB0YXJnZXRzLCB0aGUgb3V0cHV0IG9mIEBjb2Rle2xkfSBpcyBkaWZmZXJlbnQgaW4gc29tZSB3YXlzIGZyb20KLXRoZSBvdXRwdXQgb2Ygc29tZSBleGlzdGluZyBsaW5rZXIuICBUaGlzIHN3aXRjaCByZXF1ZXN0cyBAY29kZXtsZH0gdG8KLXVzZSB0aGUgdHJhZGl0aW9uYWwgZm9ybWF0IGluc3RlYWQuCi0KLUBjaW5kZXggZGJ4Ci1Gb3IgZXhhbXBsZSwgb24gU3VuT1MsIEBjb2Rle2xkfSBjb21iaW5lcyBkdXBsaWNhdGUgZW50cmllcyBpbiB0aGUKLXN5bWJvbCBzdHJpbmcgdGFibGUuICBUaGlzIGNhbiByZWR1Y2UgdGhlIHNpemUgb2YgYW4gb3V0cHV0IGZpbGUgd2l0aAotZnVsbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYnkgb3ZlciAzMCBwZXJjZW50LiAgVW5mb3J0dW5hdGVseSwgdGhlIFN1bk9TCi1AY29kZXtkYnh9IHByb2dyYW0gY2FuIG5vdCByZWFkIHRoZSByZXN1bHRpbmcgcHJvZ3JhbSAoQGNvZGV7Z2RifSBoYXMgbm8KLXRyb3VibGUpLiAgVGhlIEBzYW1wey0tdHJhZGl0aW9uYWwtZm9ybWF0fSBzd2l0Y2ggdGVsbHMgQGNvZGV7bGR9IHRvIG5vdAotY29tYmluZSBkdXBsaWNhdGUgZW50cmllcy4KLQotQGtpbmRleCAtVGJzcyBAdmFye29yZ30KLUBraW5kZXggLVRkYXRhIEB2YXJ7b3JnfQotQGtpbmRleCAtVHRleHQgQHZhcntvcmd9Ci1AY2luZGV4IHNlZ21lbnQgb3JpZ2lucywgY21kIGxpbmUKLUBpdGVtIC1UYnNzIEB2YXJ7b3JnfQotQGl0ZW14IC1UZGF0YSBAdmFye29yZ30KLUBpdGVteCAtVHRleHQgQHZhcntvcmd9Ci1Vc2UgQHZhcntvcmd9IGFzIHRoZSBzdGFydGluZyBhZGRyZXNzIGZvci0tLXJlc3BlY3RpdmVseS0tLXRoZQotQGNvZGV7YnNzfSwgQGNvZGV7ZGF0YX0sIG9yIHRoZSBAY29kZXt0ZXh0fSBzZWdtZW50IG9mIHRoZSBvdXRwdXQgZmlsZS4KLUB2YXJ7b3JnfSBtdXN0IGJlIGEgc2luZ2xlIGhleGFkZWNpbWFsIGludGVnZXI7Ci1mb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGxpbmtlcnMsIHlvdSBtYXkgb21pdCB0aGUgbGVhZGluZwotQHNhbXB7MHh9IHVzdWFsbHkgYXNzb2NpYXRlZCB3aXRoIGhleGFkZWNpbWFsIHZhbHVlcy4KLQotQGtpbmRleCAtLXZlcmJvc2UKLUBjaW5kZXggdmVyYm9zZQotQGl0ZW0gLS1kbGwtdmVyYm9zZQotQGl0ZW0gLS12ZXJib3NlCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgQGNvZGV7bGR9IGFuZCBsaXN0IHRoZSBsaW5rZXIgZW11bGF0aW9ucwotc3VwcG9ydGVkLiAgRGlzcGxheSB3aGljaCBpbnB1dCBmaWxlcyBjYW4gYW5kIGNhbm5vdCBiZSBvcGVuZWQuICBEaXNwbGF5Ci10aGUgbGlua2VyIHNjcmlwdCBpZiB1c2luZyBhIGRlZmF1bHQgYnVpbHRpbiBzY3JpcHQuCi0KLUBraW5kZXggLS12ZXJzaW9uLXNjcmlwdD1AdmFye3ZlcnNpb24tc2NyaXB0ZmlsZX0KLUBjaW5kZXggdmVyc2lvbiBzY3JpcHQsIHN5bWJvbCB2ZXJzaW9ucwotQGl0ZW14IC0tdmVyc2lvbi1zY3JpcHQ9QHZhcnt2ZXJzaW9uLXNjcmlwdGZpbGV9Ci1TcGVjaWZ5IHRoZSBuYW1lIG9mIGEgdmVyc2lvbiBzY3JpcHQgdG8gdGhlIGxpbmtlci4gIFRoaXMgaXMgdHlwaWNhbGx5Ci11c2VkIHdoZW4gY3JlYXRpbmcgc2hhcmVkIGxpYnJhcmllcyB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLWFib3V0IHRoZSB2ZXJzaW9uIGhlaXJhcmNoeSBmb3IgdGhlIGxpYnJhcnkgYmVpbmcgY3JlYXRlZC4gIFRoaXMgb3B0aW9uCi1pcyBvbmx5IG1lYW5pbmdmdWwgb24gRUxGIHBsYXRmb3JtcyB3aGljaCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuCi1AeHJlZntWRVJTSU9OfS4KLQotQGtpbmRleCAtLXdhcm4tY29tb24KLUBjaW5kZXggd2FybmluZ3MsIG9uIGNvbWJpbmluZyBzeW1ib2xzCi1AY2luZGV4IGNvbWJpbmluZyBzeW1ib2xzLCB3YXJuaW5ncyBvbgotQGl0ZW0gLS13YXJuLWNvbW1vbgotV2FybiB3aGVuIGEgY29tbW9uIHN5bWJvbCBpcyBjb21iaW5lZCB3aXRoIGFub3RoZXIgY29tbW9uIHN5bWJvbCBvciB3aXRoCi1hIHN5bWJvbCBkZWZpbml0aW9uLiAgVW5peCBsaW5rZXJzIGFsbG93IHRoaXMgc29tZXdoYXQgc2xvcHB5IHByYWN0aWNlLAotYnV0IGxpbmtlcnMgb24gc29tZSBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyBkbyBub3QuICBUaGlzIG9wdGlvbiBhbGxvd3MKLXlvdSB0byBmaW5kIHBvdGVudGlhbCBwcm9ibGVtcyBmcm9tIGNvbWJpbmluZyBnbG9iYWwgc3ltYm9scy4KLVVuZm9ydHVuYXRlbHksIHNvbWUgQyBsaWJyYXJpZXMgdXNlIHRoaXMgcHJhY3RpY2UsIHNvIHlvdSBtYXkgZ2V0IHNvbWUKLXdhcm5pbmdzIGFib3V0IHN5bWJvbHMgaW4gdGhlIGxpYnJhcmllcyBhcyB3ZWxsIGFzIGluIHlvdXIgcHJvZ3JhbXMuCi0KLVRoZXJlIGFyZSB0aHJlZSBraW5kcyBvZiBnbG9iYWwgc3ltYm9scywgaWxsdXN0cmF0ZWQgaGVyZSBieSBDIGV4YW1wbGVzOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGludCBpID0gMTsKLUEgZGVmaW5pdGlvbiwgd2hpY2ggZ29lcyBpbiB0aGUgaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uIG9mIHRoZSBvdXRwdXQKLWZpbGUuCi0KLUBpdGVtIGV4dGVybiBpbnQgaTsKLUFuIHVuZGVmaW5lZCByZWZlcmVuY2UsIHdoaWNoIGRvZXMgbm90IGFsbG9jYXRlIHNwYWNlLgotVGhlcmUgbXVzdCBiZSBlaXRoZXIgYSBkZWZpbml0aW9uIG9yIGEgY29tbW9uIHN5bWJvbCBmb3IgdGhlCi12YXJpYWJsZSBzb21ld2hlcmUuCi0KLUBpdGVtIGludCBpOwotQSBjb21tb24gc3ltYm9sLiAgSWYgdGhlcmUgYXJlIG9ubHkgKG9uZSBvciBtb3JlKSBjb21tb24gc3ltYm9scyBmb3IgYQotdmFyaWFibGUsIGl0IGdvZXMgaW4gdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhIG9mIHRoZSBvdXRwdXQgZmlsZS4KLVRoZSBsaW5rZXIgbWVyZ2VzIG11bHRpcGxlIGNvbW1vbiBzeW1ib2xzIGZvciB0aGUgc2FtZSB2YXJpYWJsZSBpbnRvIGEKLXNpbmdsZSBzeW1ib2wuICBJZiB0aGV5IGFyZSBvZiBkaWZmZXJlbnQgc2l6ZXMsIGl0IHBpY2tzIHRoZSBsYXJnZXN0Ci1zaXplLiAgVGhlIGxpbmtlciB0dXJucyBhIGNvbW1vbiBzeW1ib2wgaW50byBhIGRlY2xhcmF0aW9uLCBpZiB0aGVyZSBpcwotYSBkZWZpbml0aW9uIG9mIHRoZSBzYW1lIHZhcmlhYmxlLgotQGVuZCB0YWJsZQotCi1UaGUgQHNhbXB7LS13YXJuLWNvbW1vbn0gb3B0aW9uIGNhbiBwcm9kdWNlIGZpdmUga2luZHMgb2Ygd2FybmluZ3MuCi1FYWNoIHdhcm5pbmcgY29uc2lzdHMgb2YgYSBwYWlyIG9mIGxpbmVzOiB0aGUgZmlyc3QgZGVzY3JpYmVzIHRoZSBzeW1ib2wKLWp1c3QgZW5jb3VudGVyZWQsIGFuZCB0aGUgc2Vjb25kIGRlc2NyaWJlcyB0aGUgcHJldmlvdXMgc3ltYm9sCi1lbmNvdW50ZXJlZCB3aXRoIHRoZSBzYW1lIG5hbWUuICBPbmUgb3IgYm90aCBvZiB0aGUgdHdvIHN5bWJvbHMgd2lsbCBiZQotYSBjb21tb24gc3ltYm9sLgotCi1AZW51bWVyYXRlCi1AaXRlbQotVHVybmluZyBhIGNvbW1vbiBzeW1ib2wgaW50byBhIHJlZmVyZW5jZSwgYmVjYXVzZSB0aGVyZSBpcyBhbHJlYWR5IGEKLWRlZmluaXRpb24gZm9yIHRoZSBzeW1ib2wuCi1Ac21hbGxleGFtcGxlCi1AdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBjb21tb24gb2YgYEB2YXJ7c3ltYm9sfScKLSAgIG92ZXJyaWRkZW4gYnkgZGVmaW5pdGlvbgotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogZGVmaW5lZCBoZXJlCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbQotVHVybmluZyBhIGNvbW1vbiBzeW1ib2wgaW50byBhIHJlZmVyZW5jZSwgYmVjYXVzZSBhIGxhdGVyIGRlZmluaXRpb24gZm9yCi10aGUgc3ltYm9sIGlzIGVuY291bnRlcmVkLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgY2FzZSwKLWV4Y2VwdCB0aGF0IHRoZSBzeW1ib2xzIGFyZSBlbmNvdW50ZXJlZCBpbiBhIGRpZmZlcmVudCBvcmRlci4KLUBzbWFsbGV4YW1wbGUKLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IGRlZmluaXRpb24gb2YgYEB2YXJ7c3ltYm9sfScKLSAgIG92ZXJyaWRpbmcgY29tbW9uCi1AdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBjb21tb24gaXMgaGVyZQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0KLU1lcmdpbmcgYSBjb21tb24gc3ltYm9sIHdpdGggYSBwcmV2aW91cyBzYW1lLXNpemVkIGNvbW1vbiBzeW1ib2wuCi1Ac21hbGxleGFtcGxlCi1AdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBtdWx0aXBsZSBjb21tb24KLSAgIG9mIGBAdmFye3N5bWJvbH0nCi1AdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBwcmV2aW91cyBjb21tb24gaXMgaGVyZQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0KLU1lcmdpbmcgYSBjb21tb24gc3ltYm9sIHdpdGggYSBwcmV2aW91cyBsYXJnZXIgY29tbW9uIHN5bWJvbC4KLUBzbWFsbGV4YW1wbGUKLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IGNvbW1vbiBvZiBgQHZhcntzeW1ib2x9JwotICAgb3ZlcnJpZGRlbiBieSBsYXJnZXIgY29tbW9uCi1AdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBsYXJnZXIgY29tbW9uIGlzIGhlcmUKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtCi1NZXJnaW5nIGEgY29tbW9uIHN5bWJvbCB3aXRoIGEgcHJldmlvdXMgc21hbGxlciBjb21tb24gc3ltYm9sLiAgVGhpcyBpcwotdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGNhc2UsIGV4Y2VwdCB0aGF0IHRoZSBzeW1ib2xzIGFyZQotZW5jb3VudGVyZWQgaW4gYSBkaWZmZXJlbnQgb3JkZXIuCi1Ac21hbGxleGFtcGxlCi1AdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBjb21tb24gb2YgYEB2YXJ7c3ltYm9sfScKLSAgIG92ZXJyaWRpbmcgc21hbGxlciBjb21tb24KLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IHNtYWxsZXIgY29tbW9uIGlzIGhlcmUKLUBlbmQgc21hbGxleGFtcGxlCi1AZW5kIGVudW1lcmF0ZQotCi1Aa2luZGV4IC0td2Fybi1jb25zdHJ1Y3RvcnMKLUBpdGVtIC0td2Fybi1jb25zdHJ1Y3RvcnMKLVdhcm4gaWYgYW55IGdsb2JhbCBjb25zdHJ1Y3RvcnMgYXJlIHVzZWQuICBUaGlzIGlzIG9ubHkgdXNlZnVsIGZvciBhIGZldwotb2JqZWN0IGZpbGUgZm9ybWF0cy4gIEZvciBmb3JtYXRzIGxpa2UgQ09GRiBvciBFTEYsIHRoZSBsaW5rZXIgY2FuIG5vdAotZGV0ZWN0IHRoZSB1c2Ugb2YgZ2xvYmFsIGNvbnN0cnVjdG9ycy4KLQotQGtpbmRleCAtLXdhcm4tbXVsdGlwbGUtZ3AKLUBpdGVtIC0td2Fybi1tdWx0aXBsZS1ncAotV2FybiBpZiBtdWx0aXBsZSBnbG9iYWwgcG9pbnRlciB2YWx1ZXMgYXJlIHJlcXVpcmVkIGluIHRoZSBvdXRwdXQgZmlsZS4KLVRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGZvciBjZXJ0YWluIHByb2Nlc3NvcnMsIHN1Y2ggYXMgdGhlIEFscGhhLgotU3BlY2lmaWNhbGx5LCBzb21lIHByb2Nlc3NvcnMgcHV0IGxhcmdlLXZhbHVlZCBjb25zdGFudHMgaW4gYSBzcGVjaWFsCi1zZWN0aW9uLiAgQSBzcGVjaWFsIHJlZ2lzdGVyICh0aGUgZ2xvYmFsIHBvaW50ZXIpIHBvaW50cyBpbnRvIHRoZSBtaWRkbGUKLW9mIHRoaXMgc2VjdGlvbiwgc28gdGhhdCBjb25zdGFudHMgY2FuIGJlIGxvYWRlZCBlZmZpY2llbnRseSB2aWEgYQotYmFzZS1yZWdpc3RlciByZWxhdGl2ZSBhZGRyZXNzaW5nIG1vZGUuICBTaW5jZSB0aGUgb2Zmc2V0IGluCi1iYXNlLXJlZ2lzdGVyIHJlbGF0aXZlIG1vZGUgaXMgZml4ZWQgYW5kIHJlbGF0aXZlbHkgc21hbGwgKGUuZy4sIDE2Ci1iaXRzKSwgdGhpcyBsaW1pdHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY29uc3RhbnQgcG9vbC4gIFRodXMsIGluCi1sYXJnZSBwcm9ncmFtcywgaXQgaXMgb2Z0ZW4gbmVjZXNzYXJ5IHRvIHVzZSBtdWx0aXBsZSBnbG9iYWwgcG9pbnRlcgotdmFsdWVzIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gYWRkcmVzcyBhbGwgcG9zc2libGUgY29uc3RhbnRzLiAgVGhpcwotb3B0aW9uIGNhdXNlcyBhIHdhcm5pbmcgdG8gYmUgaXNzdWVkIHdoZW5ldmVyIHRoaXMgY2FzZSBvY2N1cnMuCi0KLUBraW5kZXggLS13YXJuLW9uY2UKLUBjaW5kZXggd2FybmluZ3MsIG9uIHVuZGVmaW5lZCBzeW1ib2xzCi1AY2luZGV4IHVuZGVmaW5lZCBzeW1ib2xzLCB3YXJuaW5ncyBvbgotQGl0ZW0gLS13YXJuLW9uY2UKLU9ubHkgd2FybiBvbmNlIGZvciBlYWNoIHVuZGVmaW5lZCBzeW1ib2wsIHJhdGhlciB0aGFuIG9uY2UgcGVyIG1vZHVsZQotd2hpY2ggcmVmZXJzIHRvIGl0LgotCi1Aa2luZGV4IC0td2Fybi1zZWN0aW9uLWFsaWduCi1AY2luZGV4IHdhcm5pbmdzLCBvbiBzZWN0aW9uIGFsaWdubWVudAotQGNpbmRleCBzZWN0aW9uIGFsaWdubWVudCwgd2FybmluZ3Mgb24KLUBpdGVtIC0td2Fybi1zZWN0aW9uLWFsaWduCi1XYXJuIGlmIHRoZSBhZGRyZXNzIG9mIGFuIG91dHB1dCBzZWN0aW9uIGlzIGNoYW5nZWQgYmVjYXVzZSBvZgotYWxpZ25tZW50LiAgVHlwaWNhbGx5LCB0aGUgYWxpZ25tZW50IHdpbGwgYmUgc2V0IGJ5IGFuIGlucHV0IHNlY3Rpb24uCi1UaGUgYWRkcmVzcyB3aWxsIG9ubHkgYmUgY2hhbmdlZCBpZiBpdCBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQ7IHRoYXQKLWlzLCBpZiB0aGUgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQgZG9lcyBub3Qgc3BlY2lmeSBhIHN0YXJ0IGFkZHJlc3MgZm9yCi10aGUgc2VjdGlvbiAoQHB4cmVme1NFQ1RJT05TfSkuCi0KLUBraW5kZXggLS13aG9sZS1hcmNoaXZlCi1AY2luZGV4IGluY2x1ZGluZyBhbiBlbnRpcmUgYXJjaGl2ZQotQGl0ZW0gLS13aG9sZS1hcmNoaXZlCi1Gb3IgZWFjaCBhcmNoaXZlIG1lbnRpb25lZCBvbiB0aGUgY29tbWFuZCBsaW5lIGFmdGVyIHRoZQotQGNvZGV7LS13aG9sZS1hcmNoaXZlfSBvcHRpb24sIGluY2x1ZGUgZXZlcnkgb2JqZWN0IGZpbGUgaW4gdGhlIGFyY2hpdmUKLWluIHRoZSBsaW5rLCByYXRoZXIgdGhhbiBzZWFyY2hpbmcgdGhlIGFyY2hpdmUgZm9yIHRoZSByZXF1aXJlZCBvYmplY3QKLWZpbGVzLiAgVGhpcyBpcyBub3JtYWxseSB1c2VkIHRvIHR1cm4gYW4gYXJjaGl2ZSBmaWxlIGludG8gYSBzaGFyZWQKLWxpYnJhcnksIGZvcmNpbmcgZXZlcnkgb2JqZWN0IHRvIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgc2hhcmVkCi1saWJyYXJ5LiAgVGhpcyBvcHRpb24gbWF5IGJlIHVzZWQgbW9yZSB0aGFuIG9uY2UuCi0KLUBraW5kZXggLS13cmFwCi1AaXRlbSAtLXdyYXAgQHZhcntzeW1ib2x9Ci1Vc2UgYSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBAdmFye3N5bWJvbH0uICBBbnkgdW5kZWZpbmVkIHJlZmVyZW5jZSB0bwotQHZhcntzeW1ib2x9IHdpbGwgYmUgcmVzb2x2ZWQgdG8gQGNvZGV7X193cmFwX0B2YXJ7c3ltYm9sfX0uICBBbnkKLXVuZGVmaW5lZCByZWZlcmVuY2UgdG8gQGNvZGV7X19yZWFsX0B2YXJ7c3ltYm9sfX0gd2lsbCBiZSByZXNvbHZlZCB0bwotQHZhcntzeW1ib2x9LgotCi1UaGlzIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgYSB3cmFwcGVyIGZvciBhIHN5c3RlbSBmdW5jdGlvbi4gIFRoZQotd3JhcHBlciBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIEBjb2Rle19fd3JhcF9AdmFye3N5bWJvbH19LiAgSWYgaXQKLXdpc2hlcyB0byBjYWxsIHRoZSBzeXN0ZW0gZnVuY3Rpb24sIGl0IHNob3VsZCBjYWxsCi1AY29kZXtfX3JlYWxfQHZhcntzeW1ib2x9fS4KLQotSGVyZSBpcyBhIHRyaXZpYWwgZXhhbXBsZToKLQotQHNtYWxsZXhhbXBsZQotdm9pZCAqCi1fX3dyYXBfbWFsbG9jIChpbnQgYykKLUB7Ci0gIHByaW50ZiAoIm1hbGxvYyBjYWxsZWQgd2l0aCAlbGRcbiIsIGMpOwotICByZXR1cm4gX19yZWFsX21hbGxvYyAoYyk7Ci1AfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgeW91IGxpbmsgb3RoZXIgY29kZSB3aXRoIHRoaXMgZmlsZSB1c2luZyBAY29kZXstLXdyYXAgbWFsbG9jfSwgdGhlbgotYWxsIGNhbGxzIHRvIEBjb2Rle21hbGxvY30gd2lsbCBjYWxsIHRoZSBmdW5jdGlvbiBAY29kZXtfX3dyYXBfbWFsbG9jfQotaW5zdGVhZC4gIFRoZSBjYWxsIHRvIEBjb2Rle19fcmVhbF9tYWxsb2N9IGluIEBjb2Rle19fd3JhcF9tYWxsb2N9IHdpbGwKLWNhbGwgdGhlIHJlYWwgQGNvZGV7bWFsbG9jfSBmdW5jdGlvbi4KLQotWW91IG1heSB3aXNoIHRvIHByb3ZpZGUgYSBAY29kZXtfX3JlYWxfbWFsbG9jfSBmdW5jdGlvbiBhcyB3ZWxsLCBzbyB0aGF0Ci1saW5rcyB3aXRob3V0IHRoZSBAY29kZXstLXdyYXB9IG9wdGlvbiB3aWxsIHN1Y2NlZWQuICBJZiB5b3UgZG8gdGhpcywKLXlvdSBzaG91bGQgbm90IHB1dCB0aGUgZGVmaW5pdGlvbiBvZiBAY29kZXtfX3JlYWxfbWFsbG9jfSBpbiB0aGUgc2FtZQotZmlsZSBhcyBAY29kZXtfX3dyYXBfbWFsbG9jfTsgaWYgeW91IGRvLCB0aGUgYXNzZW1ibGVyIG1heSByZXNvbHZlIHRoZQotY2FsbCBiZWZvcmUgdGhlIGxpbmtlciBoYXMgYSBjaGFuY2UgdG8gd3JhcCBpdCB0byBAY29kZXttYWxsb2N9LgotCi1AZW5kIHRhYmxlCi0KLUBzdWJzZWN0aW9uIE9wdGlvbnMgc3BlY2lmaWMgdG8gaTM4NiBQRSB0YXJnZXRzCi0KLVRoZSBpMzg2IFBFIGxpbmtlciBzdXBwb3J0cyB0aGUgQGNvZGV7LXNoYXJlZH0gb3B0aW9uLCB3aGljaCBjYXVzZXMKLXRoZSBvdXRwdXQgdG8gYmUgYSBkeW5hbWljYWxseSBsaW5rZWQgbGlicmFyeSAoRExMKSBpbnN0ZWFkIG9mIGEKLW5vcm1hbCBleGVjdXRhYmxlLiAgWW91IHNob3VsZCBuYW1lIHRoZSBvdXRwdXQgQGNvZGV7Ki5kbGx9IHdoZW4geW91Ci11c2UgdGhpcyBvcHRpb24uICBJbiBhZGRpdGlvbiwgdGhlIGxpbmtlciBmdWxseSBzdXBwb3J0cyB0aGUgc3RhbmRhcmQKLUBjb2RleyouZGVmfSBmaWxlcywgd2hpY2ggbWF5IGJlIHNwZWNpZmllZCBvbiB0aGUgbGlua2VyIGNvbW1hbmQgbGluZQotbGlrZSBhbiBvYmplY3QgZmlsZSAoaW4gZmFjdCwgaXQgc2hvdWxkIHByZWNlZGUgYXJjaGl2ZXMgaXQgZXhwb3J0cwotc3ltYm9scyBmcm9tLCB0byBlbnN1cmUgdGhhdCB0aGV5IGdldCBsaW5rZWQgaW4sIGp1c3QgbGlrZSBhIG5vcm1hbAotb2JqZWN0IGZpbGUpLgotCi1JbiBhZGRpdGlvbiB0byB0aGUgb3B0aW9ucyBjb21tb24gdG8gYWxsIHRhcmdldHMsIHRoZSBpMzg2IFBFIGxpbmtlcgotc3VwcG9ydCBhZGRpdGlvbmFsIGNvbW1hbmQgbGluZSBvcHRpb25zIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZSBpMzg2Ci1QRSB0YXJnZXQuICBPcHRpb25zIHRoYXQgdGFrZSB2YWx1ZXMgbWF5IGJlIHNlcGFyYXRlZCBmcm9tIHRoZWlyCi12YWx1ZXMgYnkgZWl0aGVyIGEgc3BhY2Ugb3IgYW4gZXF1YWxzIHNpZ24uCi0KLUB0YWJsZSBAY29kZQotCi1Aa2luZGV4IC0tYWRkLXN0ZGNhbGwtYWxpYXMKLUBpdGVtIC0tYWRkLXN0ZGNhbGwtYWxpYXMKLUlmIGdpdmVuLCBzeW1ib2xzIHdpdGggYSBzdGRjYWxsIHN1ZmZpeCAoQEBAdmFye25ufSkgd2lsbCBiZSBleHBvcnRlZAotYXMtaXMgYW5kIGFsc28gd2l0aCB0aGUgc3VmZml4IHN0cmlwcGVkLgotCi1Aa2luZGV4IC0tYmFzZS1maWxlCi1AaXRlbSAtLWJhc2UtZmlsZSBAdmFye2ZpbGV9Ci1Vc2UgQHZhcntmaWxlfSBhcyB0aGUgbmFtZSBvZiBhIGZpbGUgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgYmFzZQotYWRkcmVzc2VzIG9mIGFsbCB0aGUgcmVsb2NhdGlvbnMgbmVlZGVkIGZvciBnZW5lcmF0aW5nIERMTHMgd2l0aAotQGZpbGV7ZGxsdG9vbH0uCi0KLUBraW5kZXggLS1kbGwKLUBpdGVtIC0tZGxsCi1DcmVhdGUgYSBETEwgaW5zdGVhZCBvZiBhIHJlZ3VsYXIgZXhlY3V0YWJsZS4gIFlvdSBtYXkgYWxzbyB1c2UKLUBjb2Rley1zaGFyZWR9IG9yIHNwZWNpZnkgYSBAY29kZXtMSUJSQVJZfSBpbiBhIGdpdmVuIEBjb2Rley5kZWZ9Ci1maWxlLgotCi1Aa2luZGV4IC0tZW5hYmxlLXN0ZGNhbGwtZml4dXAKLUBraW5kZXggLS1kaXNhYmxlLXN0ZGNhbGwtZml4dXAKLUBpdGVtIC0tZW5hYmxlLXN0ZGNhbGwtZml4dXAKLUBpdGVteCAtLWRpc2FibGUtc3RkY2FsbC1maXh1cAotSWYgdGhlIGxpbmsgZmluZHMgYSBzeW1ib2wgdGhhdCBpdCBjYW5ub3QgcmVzb2x2ZSwgaXQgd2lsbCBhdHRlbXB0IHRvCi1kbyAiZnV6enkgbGlua2luZyIgYnkgbG9va2luZyBmb3IgYW5vdGhlciBkZWZpbmVkIHN5bWJvbCB0aGF0IGRpZmZlcnMKLW9ubHkgaW4gdGhlIGZvcm1hdCBvZiB0aGUgc3ltYm9sIG5hbWUgKGNkZWNsIHZzIHN0ZGNhbGwpIGFuZCB3aWxsCi1yZXNvbHZlIHRoYXQgc3ltYm9sIGJ5IGxpbmtpbmcgdG8gdGhlIG1hdGNoLiAgRm9yIGV4YW1wbGUsIHRoZQotdW5kZWZpbmVkIHN5bWJvbCBAY29kZXtfZm9vfSBtaWdodCBiZSBsaW5rZWQgdG8gdGhlIGZ1bmN0aW9uCi1AY29kZXtfZm9vQEAxMn0sIG9yIHRoZSB1bmRlZmluZWQgc3ltYm9sIEBjb2Rle19iYXJAQDE2fSBtaWdodCBiZSBsaW5rZWQKLXRvIHRoZSBmdW5jdGlvbiBAY29kZXtfYmFyfS4gIFdoZW4gdGhlIGxpbmtlciBkb2VzIHRoaXMsIGl0IHByaW50cyBhCi13YXJuaW5nLCBzaW5jZSBpdCBub3JtYWxseSBzaG91bGQgaGF2ZSBmYWlsZWQgdG8gbGluaywgYnV0IHNvbWV0aW1lcwotaW1wb3J0IGxpYnJhcmllcyBnZW5lcmF0ZWQgZnJvbSB0aGlyZC1wYXJ0eSBkbGxzIG1heSBuZWVkIHRoaXMgZmVhdHVyZQotdG8gYmUgdXNhYmxlLiAgSWYgeW91IHNwZWNpZnkgQGNvZGV7LS1lbmFibGUtc3RkY2FsbC1maXh1cH0sIHRoaXMKLWZlYXR1cmUgaXMgZnVsbHkgZW5hYmxlZCBhbmQgd2FybmluZ3MgYXJlIG5vdCBwcmludGVkLiAgSWYgeW91IHNwZWNpZnkKLUBjb2Rley0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwfSwgdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIGFuZCBzdWNoCi1taXNtYXRjaGVzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGVycm9ycy4KLQotQGNpbmRleCBETExzLCBjcmVhdGluZwotQGtpbmRleCAtLWV4cG9ydC1hbGwtc3ltYm9scwotQGl0ZW0gLS1leHBvcnQtYWxsLXN5bWJvbHMKLUlmIGdpdmVuLCBhbGwgZ2xvYmFsIHN5bWJvbHMgaW4gdGhlIG9iamVjdHMgdXNlZCB0byBidWlsZCBhIERMTCB3aWxsCi1iZSBleHBvcnRlZCBieSB0aGUgRExMLiAgTm90ZSB0aGF0IHRoaXMgaXMgdGhlIGRlZmF1bHQgaWYgdGhlcmUKLW90aGVyd2lzZSB3b3VsZG4ndCBiZSBhbnkgZXhwb3J0ZWQgc3ltYm9scy4gIFdoZW4gc3ltYm9scyBhcmUKLWV4cGxpY2l0bHkgZXhwb3J0ZWQgdmlhIERFRiBmaWxlcyBvciBpbXBsaWNpdGx5IGV4cG9ydGVkIHZpYSBmdW5jdGlvbgotYXR0cmlidXRlcywgdGhlIGRlZmF1bHQgaXMgdG8gbm90IGV4cG9ydCBhbnl0aGluZyBlbHNlIHVubGVzcyB0aGlzCi1vcHRpb24gaXMgZ2l2ZW4uICBOb3RlIHRoYXQgdGhlIHN5bWJvbHMgQGNvZGV7RGxsTWFpbkBAMTJ9LAotQGNvZGV7RGxsRW50cnlQb2ludEBAMH0sIGFuZCBAY29kZXtpbXB1cmVfcHRyfSB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5Ci1leHBvcnRlZC4KLQotQGtpbmRleCAtLWV4Y2x1ZGUtc3ltYm9scwotQGl0ZW0gLS1leGNsdWRlLXN5bWJvbHMgQHZhcntzeW1ib2wsc3ltYm9sLC4uLn0KLVNwZWNpZmllcyBhIGxpc3Qgb2Ygc3ltYm9scyB3aGljaCBzaG91bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkKLWV4cG9ydGVkLiAgVGhlIHN5bWJvbCBuYW1lcyBtYXkgYmUgZGVsaW1pdGVkIGJ5IGNvbW1hcyBvciBjb2xvbnMuCi0KLUBraW5kZXggLS1maWxlLWFsaWdubWVudAotQGl0ZW0gLS1maWxlLWFsaWdubWVudAotU3BlY2lmeSB0aGUgZmlsZSBhbGlnbm1lbnQuICBTZWN0aW9ucyBpbiB0aGUgZmlsZSB3aWxsIGFsd2F5cyBiZWdpbiBhdAotZmlsZSBvZmZzZXRzIHdoaWNoIGFyZSBtdWx0aXBsZXMgb2YgdGhpcyBudW1iZXIuICBUaGlzIGRlZmF1bHRzIHRvCi01MTIuCi0KLUBjaW5kZXggaGVhcCBzaXplCi1Aa2luZGV4IC0taGVhcAotQGl0ZW0gLS1oZWFwIEB2YXJ7cmVzZXJ2ZX0KLUBpdGVteCAtLWhlYXAgQHZhcntyZXNlcnZlfSxAdmFye2NvbW1pdH0KLVNwZWNpZnkgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVzZXJ2ZSAoYW5kIG9wdGlvbmFsbHkgY29tbWl0KSB0byBiZQotdXNlZCBhcyBoZWFwIGZvciB0aGlzIHByb2dyYW0uICBUaGUgZGVmYXVsdCBpcyAxTWIgcmVzZXJ2ZWQsIDRLCi1jb21taXR0ZWQuCi0KLUBjaW5kZXggaW1hZ2UgYmFzZQotQGtpbmRleCAtLWltYWdlLWJhc2UKLUBpdGVtIC0taW1hZ2UtYmFzZSBAdmFye3ZhbHVlfQotVXNlIEB2YXJ7dmFsdWV9IGFzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgeW91ciBwcm9ncmFtIG9yIGRsbC4gIFRoaXMgaXMKLXRoZSBsb3dlc3QgbWVtb3J5IGxvY2F0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4geW91ciBwcm9ncmFtIG9yIGRsbAotaXMgbG9hZGVkLiAgVG8gcmVkdWNlIHRoZSBuZWVkIHRvIHJlbG9jYXRlIGFuZCBpbXByb3ZlIHBlcmZvcm1hbmNlIG9mCi15b3VyIGRsbHMsIGVhY2ggc2hvdWxkIGhhdmUgYSB1bmlxdWUgYmFzZSBhZGRyZXNzIGFuZCBub3Qgb3ZlcmxhcCBhbnkKLW90aGVyIGRsbHMuICBUaGUgZGVmYXVsdCBpcyAweDQwMDAwMCBmb3IgZXhlY3V0YWJsZXMsIGFuZCAweDEwMDAwMDAwCi1mb3IgZGxscy4KLQotQGtpbmRleCAtLWtpbGwtYXQKLUBpdGVtIC0ta2lsbC1hdAotSWYgZ2l2ZW4sIHRoZSBzdGRjYWxsIHN1ZmZpeGVzIChAQEB2YXJ7bm59KSB3aWxsIGJlIHN0cmlwcGVkIGZyb20KLXN5bWJvbHMgYmVmb3JlIHRoZXkgYXJlIGV4cG9ydGVkLgotCi1Aa2luZGV4IC0tbWFqb3ItaW1hZ2UtdmVyc2lvbgotQGl0ZW0gLS1tYWpvci1pbWFnZS12ZXJzaW9uIEB2YXJ7dmFsdWV9Ci1TZXRzIHRoZSBtYWpvciBudW1iZXIgb2YgdGhlICJpbWFnZSB2ZXJzaW9uIi4gIERlZmF1bHRzIHRvIDEuCi0KLUBraW5kZXggLS1tYWpvci1vcy12ZXJzaW9uCi1AaXRlbSAtLW1ham9yLW9zLXZlcnNpb24gQHZhcnt2YWx1ZX0KLVNldHMgdGhlIG1ham9yIG51bWJlciBvZiB0aGUgIm9zIHZlcnNpb24iLiAgRGVmYXVsdHMgdG8gNC4KLQotQGtpbmRleCAtLW1ham9yLXN1YnN5c3RlbS12ZXJzaW9uCi1AaXRlbSAtLW1ham9yLXN1YnN5c3RlbS12ZXJzaW9uIEB2YXJ7dmFsdWV9Ci1TZXRzIHRoZSBtYWpvciBudW1iZXIgb2YgdGhlICJzdWJzeXN0ZW0gdmVyc2lvbiIuICBEZWZhdWx0cyB0byA0LgotCi1Aa2luZGV4IC0tbWlub3ItaW1hZ2UtdmVyc2lvbgotQGl0ZW0gLS1taW5vci1pbWFnZS12ZXJzaW9uIEB2YXJ7dmFsdWV9Ci1TZXRzIHRoZSBtaW5vciBudW1iZXIgb2YgdGhlICJpbWFnZSB2ZXJzaW9uIi4gIERlZmF1bHRzIHRvIDAuCi0KLUBraW5kZXggLS1taW5vci1vcy12ZXJzaW9uCi1AaXRlbSAtLW1pbm9yLW9zLXZlcnNpb24gQHZhcnt2YWx1ZX0KLVNldHMgdGhlIG1pbm9yIG51bWJlciBvZiB0aGUgIm9zIHZlcnNpb24iLiAgRGVmYXVsdHMgdG8gMC4KLQotQGtpbmRleCAtLW1pbm9yLXN1YnN5c3RlbS12ZXJzaW9uCi1AaXRlbSAtLW1pbm9yLXN1YnN5c3RlbS12ZXJzaW9uIEB2YXJ7dmFsdWV9Ci1TZXRzIHRoZSBtaW5vciBudW1iZXIgb2YgdGhlICJzdWJzeXN0ZW0gdmVyc2lvbiIuICBEZWZhdWx0cyB0byAwLgotCi1AY2luZGV4IERFRiBmaWxlcywgY3JlYXRpbmcKLUBjaW5kZXggRExMcywgY3JlYXRpbmcKLUBraW5kZXggLS1vdXRwdXQtZGVmCi1AaXRlbSAtLW91dHB1dC1kZWYgQHZhcntmaWxlfQotVGhlIGxpbmtlciB3aWxsIGNyZWF0ZSB0aGUgZmlsZSBAdmFye2ZpbGV9IHdoaWNoIHdpbGwgY29udGFpbiBhIERFRgotZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBETEwgdGhlIGxpbmtlciBpcyBnZW5lcmF0aW5nLiAgVGhpcyBERUYgZmlsZQotKHdoaWNoIHNob3VsZCBiZSBjYWxsZWQgQGNvZGV7Ki5kZWZ9KSBtYXkgYmUgdXNlZCB0byBjcmVhdGUgYW4gaW1wb3J0Ci1saWJyYXJ5IHdpdGggQGNvZGV7ZGxsdG9vbH0gb3IgbWF5IGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgdG8KLWF1dG9tYXRpY2FsbHkgb3IgaW1wbGljaXRseSBleHBvcnRlZCBzeW1ib2xzLgotCi1Aa2luZGV4IC0tc2VjdGlvbi1hbGlnbm1lbnQKLUBpdGVtIC0tc2VjdGlvbi1hbGlnbm1lbnQKLVNldHMgdGhlIHNlY3Rpb24gYWxpZ25tZW50LiAgU2VjdGlvbnMgaW4gbWVtb3J5IHdpbGwgYWx3YXlzIGJlZ2luIGF0Ci1hZGRyZXNzZXMgd2hpY2ggYXJlIGEgbXVsdGlwbGUgb2YgdGhpcyBudW1iZXIuICBEZWZhdWx0cyB0byAweDEwMDAuCi0KLUBjaW5kZXggc3RhY2sgc2l6ZQotQGtpbmRleCAtLXN0YWNrCi1AaXRlbSAtLXN0YWNrIEB2YXJ7cmVzZXJ2ZX0KLUBpdGVteCAtLXN0YWNrIEB2YXJ7cmVzZXJ2ZX0sQHZhcntjb21taXR9Ci1TcGVjaWZ5IHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlc2VydmUgKGFuZCBvcHRpb25hbGx5IGNvbW1pdCkgdG8gYmUKLXVzZWQgYXMgc3RhY2sgZm9yIHRoaXMgcHJvZ3JhbS4gIFRoZSBkZWZhdWx0IGlzIDMyTWIgcmVzZXJ2ZWQsIDRLCi1jb21taXR0ZWQuCi0KLUBraW5kZXggLS1zdWJzeXN0ZW0KLUBpdGVtIC0tc3Vic3lzdGVtIEB2YXJ7d2hpY2h9Ci1AaXRlbXggLS1zdWJzeXN0ZW0gQHZhcnt3aGljaH06QHZhcnttYWpvcn0KLUBpdGVteCAtLXN1YnN5c3RlbSBAdmFye3doaWNofTpAdmFye21ham9yfS5AdmFye21pbm9yfQotU3BlY2lmaWVzIHRoZSBzdWJzeXN0ZW0gdW5kZXIgd2hpY2ggeW91ciBwcm9ncmFtIHdpbGwgZXhlY3V0ZS4gIFRoZQotbGVnYWwgdmFsdWVzIGZvciBAdmFye3doaWNofSBhcmUgQGNvZGV7bmF0aXZlfSwgQGNvZGV7d2luZG93c30sCi1AY29kZXtjb25zb2xlfSwgYW5kIEBjb2Rle3Bvc2l4fS4gIFlvdSBtYXkgb3B0aW9uYWxseSBzZXQgdGhlCi1zdWJzeXN0ZW0gdmVyc2lvbiBhbHNvLgotCi1AZW5kIHRhYmxlCi0KLUBpZnNldCBVc2VzRW52VmFycwotQG5vZGUgRW52aXJvbm1lbnQKLUBzZWN0aW9uIEVudmlyb25tZW50IFZhcmlhYmxlcwotCi1Zb3UgY2FuIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgQGNvZGV7bGR9IHdpdGggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcwotQGNvZGV7R05VVEFSR0VUfSwgQGNvZGV7TERFTVVMQVRJT059LCBhbmQgQGNvZGV7Q09MTEVDVF9OT19ERU1BTkdMRX0uCi0KLUBraW5kZXggR05VVEFSR0VUCi1AY2luZGV4IGRlZmF1bHQgaW5wdXQgZm9ybWF0Ci1AY29kZXtHTlVUQVJHRVR9IGRldGVybWluZXMgdGhlIGlucHV0LWZpbGUgb2JqZWN0IGZvcm1hdCBpZiB5b3UgZG9uJ3QKLXVzZSBAc2FtcHstYn0gKG9yIGl0cyBzeW5vbnltIEBzYW1wey0tZm9ybWF0fSkuICBJdHMgdmFsdWUgc2hvdWxkIGJlIG9uZQotb2YgdGhlIEJGRCBuYW1lcyBmb3IgYW4gaW5wdXQgZm9ybWF0IChAcHhyZWZ7QkZEfSkuICBJZiB0aGVyZSBpcyBubwotQGNvZGV7R05VVEFSR0VUfSBpbiB0aGUgZW52aXJvbm1lbnQsIEBjb2Rle2xkfSB1c2VzIHRoZSBuYXR1cmFsIGZvcm1hdAotb2YgdGhlIHRhcmdldC4gSWYgQGNvZGV7R05VVEFSR0VUfSBpcyBzZXQgdG8gQGNvZGV7ZGVmYXVsdH0gdGhlbiBCRkQKLWF0dGVtcHRzIHRvIGRpc2NvdmVyIHRoZSBpbnB1dCBmb3JtYXQgYnkgZXhhbWluaW5nIGJpbmFyeSBpbnB1dCBmaWxlczsKLXRoaXMgbWV0aG9kIG9mdGVuIHN1Y2NlZWRzLCBidXQgdGhlcmUgYXJlIHBvdGVudGlhbCBhbWJpZ3VpdGllcywgc2luY2UKLXRoZXJlIGlzIG5vIG1ldGhvZCBvZiBlbnN1cmluZyB0aGF0IHRoZSBtYWdpYyBudW1iZXIgdXNlZCB0byBzcGVjaWZ5Ci1vYmplY3QtZmlsZSBmb3JtYXRzIGlzIHVuaXF1ZS4gIEhvd2V2ZXIsIHRoZSBjb25maWd1cmF0aW9uIHByb2NlZHVyZSBmb3IKLUJGRCBvbiBlYWNoIHN5c3RlbSBwbGFjZXMgdGhlIGNvbnZlbnRpb25hbCBmb3JtYXQgZm9yIHRoYXQgc3lzdGVtIGZpcnN0Ci1pbiB0aGUgc2VhcmNoLWxpc3QsIHNvIGFtYmlndWl0aWVzIGFyZSByZXNvbHZlZCBpbiBmYXZvciBvZiBjb252ZW50aW9uLgotCi1Aa2luZGV4IExERU1VTEFUSU9OCi1AY2luZGV4IGRlZmF1bHQgZW11bGF0aW9uCi1AY2luZGV4IGVtdWxhdGlvbiwgZGVmYXVsdAotQGNvZGV7TERFTVVMQVRJT059IGRldGVybWluZXMgdGhlIGRlZmF1bHQgZW11bGF0aW9uIGlmIHlvdSBkb24ndCB1c2UgdGhlCi1Ac2FtcHstbX0gb3B0aW9uLiAgVGhlIGVtdWxhdGlvbiBjYW4gYWZmZWN0IHZhcmlvdXMgYXNwZWN0cyBvZiBsaW5rZXIKLWJlaGF2aW91ciwgcGFydGljdWxhcmx5IHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQuICBZb3UgY2FuIGxpc3QgdGhlCi1hdmFpbGFibGUgZW11bGF0aW9ucyB3aXRoIHRoZSBAc2FtcHstLXZlcmJvc2V9IG9yIEBzYW1wey1WfSBvcHRpb25zLiAgSWYKLXRoZSBAc2FtcHstbX0gb3B0aW9uIGlzIG5vdCB1c2VkLCBhbmQgdGhlIEBjb2Rle0xERU1VTEFUSU9OfSBlbnZpcm9ubWVudAotdmFyaWFibGUgaXMgbm90IGRlZmluZWQsIHRoZSBkZWZhdWx0IGVtdWxhdGlvbiBkZXBlbmRzIHVwb24gaG93IHRoZQotbGlua2VyIHdhcyBjb25maWd1cmVkLgotQGVuZCBpZnNldAotCi1Aa2luZGV4IENPTExFQ1RfTk9fREVNQU5HTEUKLUBjaW5kZXggZGVtYW5nbGluZywgZGVmYXVsdAotTm9ybWFsbHksIHRoZSBsaW5rZXIgd2lsbCBkZWZhdWx0IHRvIGRlbWFuZ2xpbmcgc3ltYm9scy4gIEhvd2V2ZXIsIGlmCi1AY29kZXtDT0xMRUNUX05PX0RFTUFOR0xFfSBpcyBzZXQgaW4gdGhlIGVudmlyb25tZW50LCB0aGVuIGl0IHdpbGwKLWRlZmF1bHQgdG8gbm90IGRlbWFuZ2xpbmcgc3ltYm9scy4gIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdXNlZCBpbgotYSBzaW1pbGFyIGZhc2hpb24gYnkgdGhlIEBjb2Rle2djY30gbGlua2VyIHdyYXBwZXIgcHJvZ3JhbS4gIFRoZSBkZWZhdWx0Ci1tYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUgQHNhbXB7LS1kZW1hbmdsZX0gYW5kIEBzYW1wey0tbm8tZGVtYW5nbGV9Ci1vcHRpb25zLgotCi1Abm9kZSBTY3JpcHRzCi1AY2hhcHRlciBMaW5rZXIgU2NyaXB0cwotCi1AY2luZGV4IHNjcmlwdHMKLUBjaW5kZXggbGlua2VyIHNjcmlwdHMKLUBjaW5kZXggY29tbWFuZCBmaWxlcwotRXZlcnkgbGluayBpcyBjb250cm9sbGVkIGJ5IGEgQGRmbntsaW5rZXIgc2NyaXB0fS4gIFRoaXMgc2NyaXB0IGlzCi13cml0dGVuIGluIHRoZSBsaW5rZXIgY29tbWFuZCBsYW5ndWFnZS4KLQotVGhlIG1haW4gcHVycG9zZSBvZiB0aGUgbGlua2VyIHNjcmlwdCBpcyB0byBkZXNjcmliZSBob3cgdGhlIHNlY3Rpb25zIGluCi10aGUgaW5wdXQgZmlsZXMgc2hvdWxkIGJlIG1hcHBlZCBpbnRvIHRoZSBvdXRwdXQgZmlsZSwgYW5kIHRvIGNvbnRyb2wKLXRoZSBtZW1vcnkgbGF5b3V0IG9mIHRoZSBvdXRwdXQgZmlsZS4gIE1vc3QgbGlua2VyIHNjcmlwdHMgZG8gbm90aGluZwotbW9yZSB0aGFuIHRoaXMuICBIb3dldmVyLCB3aGVuIG5lY2Vzc2FyeSwgdGhlIGxpbmtlciBzY3JpcHQgY2FuIGFsc28KLWRpcmVjdCB0aGUgbGlua2VyIHRvIHBlcmZvcm0gbWFueSBvdGhlciBvcGVyYXRpb25zLCB1c2luZyB0aGUgY29tbWFuZHMKLWRlc2NyaWJlZCBiZWxvdy4KLQotVGhlIGxpbmtlciBhbHdheXMgdXNlcyBhIGxpbmtlciBzY3JpcHQuICBJZiB5b3UgZG8gbm90IHN1cHBseSBvbmUKLXlvdXJzZWxmLCB0aGUgbGlua2VyIHdpbGwgdXNlIGEgZGVmYXVsdCBzY3JpcHQgdGhhdCBpcyBjb21waWxlZCBpbnRvIHRoZQotbGlua2VyIGV4ZWN1dGFibGUuICBZb3UgY2FuIHVzZSB0aGUgQHNhbXB7LS12ZXJib3NlfSBjb21tYW5kIGxpbmUgb3B0aW9uCi10byBkaXNwbGF5IHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQuICBDZXJ0YWluIGNvbW1hbmQgbGluZSBvcHRpb25zLAotc3VjaCBhcyBAc2FtcHstcn0gb3IgQHNhbXB7LU59LCB3aWxsIGFmZmVjdCB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LgotCi1Zb3UgbWF5IHN1cHBseSB5b3VyIG93biBsaW5rZXIgc2NyaXB0IGJ5IHVzaW5nIHRoZSBAc2FtcHstVH0gY29tbWFuZAotbGluZSBvcHRpb24uICBXaGVuIHlvdSBkbyB0aGlzLCB5b3VyIGxpbmtlciBzY3JpcHQgd2lsbCByZXBsYWNlIHRoZQotZGVmYXVsdCBsaW5rZXIgc2NyaXB0LgotCi1Zb3UgbWF5IGFsc28gdXNlIGxpbmtlciBzY3JpcHRzIGltcGxpY2l0bHkgYnkgbmFtaW5nIHRoZW0gYXMgaW5wdXQgZmlsZXMKLXRvIHRoZSBsaW5rZXIsIGFzIHRob3VnaCB0aGV5IHdlcmUgZmlsZXMgdG8gYmUgbGlua2VkLiAgQHhyZWZ7SW1wbGljaXQKLUxpbmtlciBTY3JpcHRzfS4KLQotQG1lbnUKLSogQmFzaWMgU2NyaXB0IENvbmNlcHRzOjoJQmFzaWMgTGlua2VyIFNjcmlwdCBDb25jZXB0cwotKiBTY3JpcHQgRm9ybWF0OjoJCUxpbmtlciBTY3JpcHQgRm9ybWF0Ci0qIFNpbXBsZSBFeGFtcGxlOjoJCVNpbXBsZSBMaW5rZXIgU2NyaXB0IEV4YW1wbGUKLSogU2ltcGxlIENvbW1hbmRzOjoJCVNpbXBsZSBMaW5rZXIgU2NyaXB0IENvbW1hbmRzCi0qIEFzc2lnbm1lbnRzOjoJCQlBc3NpZ25pbmcgVmFsdWVzIHRvIFN5bWJvbHMKLSogU0VDVElPTlM6OgkJCVNFQ1RJT05TIENvbW1hbmQKLSogTUVNT1JZOjoJCQlNRU1PUlkgQ29tbWFuZAotKiBQSERSUzo6CQkJUEhEUlMgQ29tbWFuZAotKiBWRVJTSU9OOjoJCQlWRVJTSU9OIENvbW1hbmQKLSogRXhwcmVzc2lvbnM6OgkJCUV4cHJlc3Npb25zIGluIExpbmtlciBTY3JpcHRzCi0qIEltcGxpY2l0IExpbmtlciBTY3JpcHRzOjoJSW1wbGljaXQgTGlua2VyIFNjcmlwdHMKLUBlbmQgbWVudQotCi1Abm9kZSBCYXNpYyBTY3JpcHQgQ29uY2VwdHMKLUBzZWN0aW9uIEJhc2ljIExpbmtlciBTY3JpcHQgQ29uY2VwdHMKLUBjaW5kZXggbGlua2VyIHNjcmlwdCBjb25jZXB0cwotV2UgbmVlZCB0byBkZWZpbmUgc29tZSBiYXNpYyBjb25jZXB0cyBhbmQgdm9jYWJ1bGFyeSBpbiBvcmRlciB0bwotZGVzY3JpYmUgdGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UuCi0KLVRoZSBsaW5rZXIgY29tYmluZXMgaW5wdXQgZmlsZXMgaW50byBhIHNpbmdsZSBvdXRwdXQgZmlsZS4gIFRoZSBvdXRwdXQKLWZpbGUgYW5kIGVhY2ggaW5wdXQgZmlsZSBhcmUgaW4gYSBzcGVjaWFsIGRhdGEgZm9ybWF0IGtub3duIGFzIGFuCi1AZGZue29iamVjdCBmaWxlIGZvcm1hdH0uICBFYWNoIGZpbGUgaXMgY2FsbGVkIGFuIEBkZm57b2JqZWN0IGZpbGV9LgotVGhlIG91dHB1dCBmaWxlIGlzIG9mdGVuIGNhbGxlZCBhbiBAZGZue2V4ZWN1dGFibGV9LCBidXQgZm9yIG91cgotcHVycG9zZXMgd2Ugd2lsbCBhbHNvIGNhbGwgaXQgYW4gb2JqZWN0IGZpbGUuICBFYWNoIG9iamVjdCBmaWxlIGhhcywKLWFtb25nIG90aGVyIHRoaW5ncywgYSBsaXN0IG9mIEBkZm57c2VjdGlvbnN9LiAgV2Ugc29tZXRpbWVzIHJlZmVyIHRvIGEKLXNlY3Rpb24gaW4gYW4gaW5wdXQgZmlsZSBhcyBhbiBAZGZue2lucHV0IHNlY3Rpb259OyBzaW1pbGFybHksIGEgc2VjdGlvbgotaW4gdGhlIG91dHB1dCBmaWxlIGlzIGFuIEBkZm57b3V0cHV0IHNlY3Rpb259LgotCi1FYWNoIHNlY3Rpb24gaW4gYW4gb2JqZWN0IGZpbGUgaGFzIGEgbmFtZSBhbmQgYSBzaXplLiAgTW9zdCBzZWN0aW9ucwotYWxzbyBoYXZlIGFuIGFzc29jaWF0ZWQgYmxvY2sgb2YgZGF0YSwga25vd24gYXMgdGhlIEBkZm57c2VjdGlvbgotY29udGVudHN9LiAgQSBzZWN0aW9uIG1heSBiZSBtYXJrZWQgYXMgQGRmbntsb2FkYWJsZX0sIHdoaWNoIG1lYW4gdGhhdAotdGhlIGNvbnRlbnRzIHNob3VsZCBiZSBsb2FkZWQgaW50byBtZW1vcnkgd2hlbiB0aGUgb3V0cHV0IGZpbGUgaXMgcnVuLgotQSBzZWN0aW9uIHdpdGggbm8gY29udGVudHMgbWF5IGJlIEBkZm57YWxsb2NhdGFibGV9LCB3aGljaCBtZWFucyB0aGF0IGFuCi1hcmVhIGluIG1lbW9yeSBzaG91bGQgYmUgc2V0IGFzaWRlLCBidXQgbm90aGluZyBpbiBwYXJ0aWN1bGFyIHNob3VsZCBiZQotbG9hZGVkIHRoZXJlIChpbiBzb21lIGNhc2VzIHRoaXMgbWVtb3J5IG11c3QgYmUgemVyb2VkIG91dCkuICBBIHNlY3Rpb24KLXdoaWNoIGlzIG5laXRoZXIgbG9hZGFibGUgbm9yIGFsbG9jYXRhYmxlIHR5cGljYWxseSBjb250YWlucyBzb21lIHNvcnQKLW9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQotRXZlcnkgbG9hZGFibGUgb3IgYWxsb2NhdGFibGUgb3V0cHV0IHNlY3Rpb24gaGFzIHR3byBhZGRyZXNzZXMuICBUaGUKLWZpcnN0IGlzIHRoZSBAZGZue1ZNQX0sIG9yIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MuICBUaGlzIGlzIHRoZSBhZGRyZXNzCi10aGUgc2VjdGlvbiB3aWxsIGhhdmUgd2hlbiB0aGUgb3V0cHV0IGZpbGUgaXMgcnVuLiAgVGhlIHNlY29uZCBpcyB0aGUKLUBkZm57TE1BfSwgb3IgbG9hZCBtZW1vcnkgYWRkcmVzcy4gIFRoaXMgaXMgdGhlIGFkZHJlc3MgYXQgd2hpY2ggdGhlCi1zZWN0aW9uIHdpbGwgYmUgbG9hZGVkLiAgSW4gbW9zdCBjYXNlcyB0aGUgdHdvIGFkZHJlc3NlcyB3aWxsIGJlIHRoZQotc2FtZS4gIEFuIGV4YW1wbGUgb2Ygd2hlbiB0aGV5IG1pZ2h0IGJlIGRpZmZlcmVudCBpcyB3aGVuIGEgZGF0YSBzZWN0aW9uCi1pcyBsb2FkZWQgaW50byBST00sIGFuZCB0aGVuIGNvcGllZCBpbnRvIFJBTSB3aGVuIHRoZSBwcm9ncmFtIHN0YXJ0cyB1cAotKHRoaXMgdGVjaG5pcXVlIGlzIG9mdGVuIHVzZWQgdG8gaW5pdGlhbGl6ZSBnbG9iYWwgdmFyaWFibGVzIGluIGEgUk9NCi1iYXNlZCBzeXN0ZW0pLiAgSW4gdGhpcyBjYXNlIHRoZSBST00gYWRkcmVzcyB3b3VsZCBiZSB0aGUgTE1BLCBhbmQgdGhlCi1SQU0gYWRkcmVzcyB3b3VsZCBiZSB0aGUgVk1BLgotCi1Zb3UgY2FuIHNlZSB0aGUgc2VjdGlvbnMgaW4gYW4gb2JqZWN0IGZpbGUgYnkgdXNpbmcgdGhlIEBjb2Rle29iamR1bXB9Ci1wcm9ncmFtIHdpdGggdGhlIEBzYW1wey1ofSBvcHRpb24uCi0KLUV2ZXJ5IG9iamVjdCBmaWxlIGFsc28gaGFzIGEgbGlzdCBvZiBAZGZue3N5bWJvbHN9LCBrbm93biBhcyB0aGUKLUBkZm57c3ltYm9sIHRhYmxlfS4gIEEgc3ltYm9sIG1heSBiZSBkZWZpbmVkIG9yIHVuZGVmaW5lZC4gIEVhY2ggc3ltYm9sCi1oYXMgYSBuYW1lLCBhbmQgZWFjaCBkZWZpbmVkIHN5bWJvbCBoYXMgYW4gYWRkcmVzcywgYW1vbmcgb3RoZXIKLWluZm9ybWF0aW9uLiAgSWYgeW91IGNvbXBpbGUgYSBDIG9yIEMrKyBwcm9ncmFtIGludG8gYW4gb2JqZWN0IGZpbGUsIHlvdQotd2lsbCBnZXQgYSBkZWZpbmVkIHN5bWJvbCBmb3IgZXZlcnkgZGVmaW5lZCBmdW5jdGlvbiBhbmQgZ2xvYmFsIG9yCi1zdGF0aWMgdmFyaWFibGUuICBFdmVyeSB1bmRlZmluZWQgZnVuY3Rpb24gb3IgZ2xvYmFsIHZhcmlhYmxlIHdoaWNoIGlzCi1yZWZlcmVuY2VkIGluIHRoZSBpbnB1dCBmaWxlIHdpbGwgYmVjb21lIGFuIHVuZGVmaW5lZCBzeW1ib2wuCi0KLVlvdSBjYW4gc2VlIHRoZSBzeW1ib2xzIGluIGFuIG9iamVjdCBmaWxlIGJ5IHVzaW5nIHRoZSBAY29kZXtubX0KLXByb2dyYW0sIG9yIGJ5IHVzaW5nIHRoZSBAY29kZXtvYmpkdW1wfSBwcm9ncmFtIHdpdGggdGhlIEBzYW1wey10fQotb3B0aW9uLgotCi1Abm9kZSBTY3JpcHQgRm9ybWF0Ci1Ac2VjdGlvbiBMaW5rZXIgU2NyaXB0IEZvcm1hdAotQGNpbmRleCBsaW5rZXIgc2NyaXB0IGZvcm1hdAotTGlua2VyIHNjcmlwdHMgYXJlIHRleHQgZmlsZXMuCi0KLVlvdSB3cml0ZSBhIGxpbmtlciBzY3JpcHQgYXMgYSBzZXJpZXMgb2YgY29tbWFuZHMuICBFYWNoIGNvbW1hbmQgaXMKLWVpdGhlciBhIGtleXdvcmQsIHBvc3NpYmx5IGZvbGxvd2VkIGJ5IGFyZ3VtZW50cywgb3IgYW4gYXNzaWdubWVudCB0byBhCi1zeW1ib2wuICBZb3UgbWF5IHNlcGFyYXRlIGNvbW1hbmRzIHVzaW5nIHNlbWljb2xvbnMuICBXaGl0ZXNwYWNlIGlzCi1nZW5lcmFsbHkgaWdub3JlZC4KLQotU3RyaW5ncyBzdWNoIGFzIGZpbGUgb3IgZm9ybWF0IG5hbWVzIGNhbiBub3JtYWxseSBiZSBlbnRlcmVkIGRpcmVjdGx5LgotSWYgdGhlIGZpbGUgbmFtZSBjb250YWlucyBhIGNoYXJhY3RlciBzdWNoIGFzIGEgY29tbWEgd2hpY2ggd291bGQKLW90aGVyd2lzZSBzZXJ2ZSB0byBzZXBhcmF0ZSBmaWxlIG5hbWVzLCB5b3UgbWF5IHB1dCB0aGUgZmlsZSBuYW1lIGluCi1kb3VibGUgcXVvdGVzLiAgVGhlcmUgaXMgbm8gd2F5IHRvIHVzZSBhIGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXIgaW4gYQotZmlsZSBuYW1lLgotCi1Zb3UgbWF5IGluY2x1ZGUgY29tbWVudHMgaW4gbGlua2VyIHNjcmlwdHMganVzdCBhcyBpbiBDLCBkZWxpbWl0ZWQgYnkKLUBzYW1wey8qfSBhbmQgQHNhbXB7Ki99LiAgQXMgaW4gQywgY29tbWVudHMgYXJlIHN5bnRhY3RpY2FsbHkgZXF1aXZhbGVudAotdG8gd2hpdGVzcGFjZS4KLQotQG5vZGUgU2ltcGxlIEV4YW1wbGUKLUBzZWN0aW9uIFNpbXBsZSBMaW5rZXIgU2NyaXB0IEV4YW1wbGUKLUBjaW5kZXggbGlua2VyIHNjcmlwdCBleGFtcGxlCi1AY2luZGV4IGV4YW1wbGUgb2YgbGlua2VyIHNjcmlwdAotTWFueSBsaW5rZXIgc2NyaXB0cyBhcmUgZmFpcmx5IHNpbXBsZS4KLQotVGhlIHNpbXBsZXN0IHBvc3NpYmxlIGxpbmtlciBzY3JpcHQgaGFzIGp1c3Qgb25lIGNvbW1hbmQ6Ci1Ac2FtcHtTRUNUSU9OU30uICBZb3UgdXNlIHRoZSBAc2FtcHtTRUNUSU9OU30gY29tbWFuZCB0byBkZXNjcmliZSB0aGUKLW1lbW9yeSBsYXlvdXQgb2YgdGhlIG91dHB1dCBmaWxlLgotCi1UaGUgQHNhbXB7U0VDVElPTlN9IGNvbW1hbmQgaXMgYSBwb3dlcmZ1bCBjb21tYW5kLiAgSGVyZSB3ZSB3aWxsCi1kZXNjcmliZSBhIHNpbXBsZSB1c2Ugb2YgaXQuICBMZXQncyBhc3N1bWUgeW91ciBwcm9ncmFtIGNvbnNpc3RzIG9ubHkgb2YKLWNvZGUsIGluaXRpYWxpemVkIGRhdGEsIGFuZCB1bmluaXRpYWxpemVkIGRhdGEuICBUaGVzZSB3aWxsIGJlIGluIHRoZQotQHNhbXB7LnRleHR9LCBAc2FtcHsuZGF0YX0sIGFuZCBAc2FtcHsuYnNzfSBzZWN0aW9ucywgcmVzcGVjdGl2ZWx5LgotTGV0J3MgYXNzdW1lIGZ1cnRoZXIgdGhhdCB0aGVzZSBhcmUgdGhlIG9ubHkgc2VjdGlvbnMgd2hpY2ggYXBwZWFyIGluCi15b3VyIGlucHV0IGZpbGVzLgotCi1Gb3IgdGhpcyBleGFtcGxlLCBsZXQncyBzYXkgdGhhdCB0aGUgY29kZSBzaG91bGQgYmUgbG9hZGVkIGF0IGFkZHJlc3MKLTB4MTAwMDAsIGFuZCB0aGF0IHRoZSBkYXRhIHNob3VsZCBzdGFydCBhdCBhZGRyZXNzIDB4ODAwMDAwMC4gIEhlcmUgaXMgYQotbGlua2VyIHNjcmlwdCB3aGljaCB3aWxsIGRvIHRoYXQ6Ci1Ac21hbGxleGFtcGxlCi1TRUNUSU9OUwotQHsKLSAgLiA9IDB4MTAwMDA7Ci0gIC50ZXh0IDogQHsgKigudGV4dCkgQH0KLSAgLiA9IDB4ODAwMDAwMDsKLSAgLmRhdGEgOiBAeyAqKC5kYXRhKSBAfQotICAuYnNzIDogQHsgKiguYnNzKSBAfQotQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVlvdSB3cml0ZSB0aGUgQHNhbXB7U0VDVElPTlN9IGNvbW1hbmQgYXMgdGhlIGtleXdvcmQgQHNhbXB7U0VDVElPTlN9LAotZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2Ygc3ltYm9sIGFzc2lnbm1lbnRzIGFuZCBvdXRwdXQgc2VjdGlvbgotZGVzY3JpcHRpb25zIGVuY2xvc2VkIGluIGN1cmx5IGJyYWNlcy4KLQotVGhlIGZpcnN0IGxpbmUgaW4gdGhlIGFib3ZlIGV4YW1wbGUgc2V0cyB0aGUgc3BlY2lhbCBzeW1ib2wgQHNhbXB7Ln0sCi13aGljaCBpcyB0aGUgbG9jYXRpb24gY291bnRlci4gIElmIHlvdSBkbyBub3Qgc3BlY2lmeSB0aGUgYWRkcmVzcyBvZiBhbgotb3V0cHV0IHNlY3Rpb24gaW4gc29tZSBvdGhlciB3YXkgKG90aGVyIHdheXMgYXJlIGRlc2NyaWJlZCBsYXRlciksIHRoZQotYWRkcmVzcyBpcyBzZXQgZnJvbSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gY291bnRlci4gIFRoZQotbG9jYXRpb24gY291bnRlciBpcyB0aGVuIGluY3JlbWVudGVkIGJ5IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4KLQotVGhlIGZpcnN0IGxpbmUgaW5zaWRlIHRoZSBAc2FtcHtTRUNUSU9OU30gY29tbWFuZCBvZiB0aGUgYWJvdmUgZXhhbXBsZQotc2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpYWwgc3ltYm9sIEBzYW1wey59LCB3aGljaCBpcyB0aGUgbG9jYXRpb24KLWNvdW50ZXIuICBJZiB5b3UgZG8gbm90IHNwZWNpZnkgdGhlIGFkZHJlc3Mgb2YgYW4gb3V0cHV0IHNlY3Rpb24gaW4gc29tZQotb3RoZXIgd2F5IChvdGhlciB3YXlzIGFyZSBkZXNjcmliZWQgbGF0ZXIpLCB0aGUgYWRkcmVzcyBpcyBzZXQgZnJvbSB0aGUKLWN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIuICBUaGUgbG9jYXRpb24gY291bnRlciBpcyB0aGVuCi1pbmNyZW1lbnRlZCBieSB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICBBdCB0aGUgc3RhcnQgb2YgdGhlCi1Ac2FtcHtTRUNUSU9OU30gY29tbWFuZCwgdGhlIGxvY2F0aW9uIGNvdW50ZXIgaGFzIHRoZSB2YWx1ZSBAc2FtcHswfS4KLQotVGhlIHNlY29uZCBsaW5lIGRlZmluZXMgYW4gb3V0cHV0IHNlY3Rpb24sIEBzYW1wey50ZXh0fS4gIFRoZSBjb2xvbiBpcwotcmVxdWlyZWQgc3ludGF4IHdoaWNoIG1heSBiZSBpZ25vcmVkIGZvciBub3cuICBXaXRoaW4gdGhlIGN1cmx5IGJyYWNlcwotYWZ0ZXIgdGhlIG91dHB1dCBzZWN0aW9uIG5hbWUsIHlvdSBsaXN0IHRoZSBuYW1lcyBvZiB0aGUgaW5wdXQgc2VjdGlvbnMKLXdoaWNoIHNob3VsZCBiZSBwbGFjZWQgaW50byB0aGlzIG91dHB1dCBzZWN0aW9uLiAgVGhlIEBzYW1weyp9IGlzIGEKLXdpbGRjYXJkIHdoaWNoIG1hdGNoZXMgYW55IGZpbGUgbmFtZS4gIFRoZSBleHByZXNzaW9uIEBzYW1weyooLnRleHQpfQotbWVhbnMgYWxsIEBzYW1wey50ZXh0fSBpbnB1dCBzZWN0aW9ucyBpbiBhbGwgaW5wdXQgZmlsZXMuCi0KLVNpbmNlIHRoZSBsb2NhdGlvbiBjb3VudGVyIGlzIEBzYW1wezB4MTAwMDB9IHdoZW4gdGhlIG91dHB1dCBzZWN0aW9uCi1Ac2FtcHsudGV4dH0gaXMgZGVmaW5lZCwgdGhlIGxpbmtlciB3aWxsIHNldCB0aGUgYWRkcmVzcyBvZiB0aGUKLUBzYW1wey50ZXh0fSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZSB0byBiZSBAc2FtcHsweDEwMDAwfS4KLQotVGhlIHJlbWFpbmluZyBsaW5lcyBkZWZpbmUgdGhlIEBzYW1wey5kYXRhfSBhbmQgQHNhbXB7LmJzc30gc2VjdGlvbnMgaW4KLXRoZSBvdXRwdXQgZmlsZS4gIFRoZSBsaW5rZXIgd2lsbCBwbGFjZSB0aGUgQHNhbXB7LmRhdGF9IG91dHB1dCBzZWN0aW9uCi1hdCBhZGRyZXNzIEBzYW1wezB4ODAwMDAwMH0uICBBZnRlciB0aGUgbGlua2VyIHBsYWNlcyB0aGUgQHNhbXB7LmRhdGF9Ci1vdXRwdXQgc2VjdGlvbiwgdGhlIHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyIHdpbGwgYmUKLUBzYW1wezB4ODAwMDAwMH0gcGx1cyB0aGUgc2l6ZSBvZiB0aGUgQHNhbXB7LmRhdGF9IG91dHB1dCBzZWN0aW9uLiAgVGhlCi1lZmZlY3QgaXMgdGhhdCB0aGUgbGlua2VyIHdpbGwgcGxhY2UgdGhlIEBzYW1wey5ic3N9IG91dHB1dCBzZWN0aW9uCi1pbW1lZGlhdGVseSBhZnRlciB0aGUgQHNhbXB7LmRhdGF9IG91dHB1dCBzZWN0aW9uIGluIG1lbW9yeQotCi1UaGUgbGlua2VyIHdpbGwgZW5zdXJlIHRoYXQgZWFjaCBvdXRwdXQgc2VjdGlvbiBoYXMgdGhlIHJlcXVpcmVkCi1hbGlnbm1lbnQsIGJ5IGluY3JlYXNpbmcgdGhlIGxvY2F0aW9uIGNvdW50ZXIgaWYgbmVjZXNzYXJ5LiAgSW4gdGhpcwotZXhhbXBsZSwgdGhlIHNwZWNpZmllZCBhZGRyZXNzZXMgZm9yIHRoZSBAc2FtcHsudGV4dH0gYW5kIEBzYW1wey5kYXRhfQotc2VjdGlvbnMgd2lsbCBwcm9iYWJseSBzYXRpc2Z5IGFueSBhbGlnbm1lbnQgY29uc3RyYWludHMsIGJ1dCB0aGUgbGlua2VyCi1tYXkgaGF2ZSB0byBjcmVhdGUgYSBzbWFsbCBnYXAgYmV0d2VlbiB0aGUgQHNhbXB7LmRhdGF9IGFuZCBAc2FtcHsuYnNzfQotc2VjdGlvbnMuCi0KLVRoYXQncyBpdCEgIFRoYXQncyBhIHNpbXBsZSBhbmQgY29tcGxldGUgbGlua2VyIHNjcmlwdC4KLQotQG5vZGUgU2ltcGxlIENvbW1hbmRzCi1Ac2VjdGlvbiBTaW1wbGUgTGlua2VyIFNjcmlwdCBDb21tYW5kcwotQGNpbmRleCBsaW5rZXIgc2NyaXB0IHNpbXBsZSBjb21tYW5kcwotSW4gdGhpcyBzZWN0aW9uIHdlIGRlc2NyaWJlIHRoZSBzaW1wbGUgbGlua2VyIHNjcmlwdCBjb21tYW5kcy4KLQotQG1lbnUKLSogRW50cnkgUG9pbnQ6OgkJCVNldHRpbmcgdGhlIGVudHJ5IHBvaW50Ci0qIEZpbGUgQ29tbWFuZHM6OgkJQ29tbWFuZHMgZGVhbGluZyB3aXRoIGZpbGVzCi1AaWZjbGVhciBTaW5nbGVGb3JtYXQKLSogRm9ybWF0IENvbW1hbmRzOjoJCUNvbW1hbmRzIGRlYWxpbmcgd2l0aCBvYmplY3QgZmlsZSBmb3JtYXRzCi1AZW5kIGlmY2xlYXIKLQotKiBNaXNjZWxsYW5lb3VzIENvbW1hbmRzOjoJT3RoZXIgbGlua2VyIHNjcmlwdCBjb21tYW5kcwotQGVuZCBtZW51Ci0KLUBub2RlIEVudHJ5IFBvaW50Ci1Ac3Vic2VjdGlvbiBTZXR0aW5nIHRoZSBlbnRyeSBwb2ludAotQGtpbmRleCBFTlRSWShAdmFye3N5bWJvbH0pCi1AY2luZGV4IHN0YXJ0IG9mIGV4ZWN1dGlvbgotQGNpbmRleCBmaXJzdCBpbnN0cnVjdGlvbgotQGNpbmRleCBlbnRyeSBwb2ludAotVGhlIGZpcnN0IGluc3RydWN0aW9uIHRvIGV4ZWN1dGUgaW4gYSBwcm9ncmFtIGlzIGNhbGxlZCB0aGUgQGRmbntlbnRyeQotcG9pbnR9LiAgWW91IGNhbiB1c2UgdGhlIEBjb2Rle0VOVFJZfSBsaW5rZXIgc2NyaXB0IGNvbW1hbmQgdG8gc2V0IHRoZQotZW50cnkgcG9pbnQuICBUaGUgYXJndW1lbnQgaXMgYSBzeW1ib2wgbmFtZToKLUBzbWFsbGV4YW1wbGUKLUVOVFJZKEB2YXJ7c3ltYm9sfSkKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdG8gc2V0IHRoZSBlbnRyeSBwb2ludC4gIFRoZSBsaW5rZXIgd2lsbCBzZXQgdGhlCi1lbnRyeSBwb2ludCBieSB0cnlpbmcgZWFjaCBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHMgaW4gb3JkZXIsIGFuZAotc3RvcHBpbmcgd2hlbiBvbmUgb2YgdGhlbSBzdWNjZWVkczoKLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtIAotdGhlIEBzYW1wey1lfSBAdmFye2VudHJ5fSBjb21tYW5kLWxpbmUgb3B0aW9uOwotQGl0ZW0gCi10aGUgQGNvZGV7RU5UUlkoQHZhcntzeW1ib2x9KX0gY29tbWFuZCBpbiBhIGxpbmtlciBzY3JpcHQ7Ci1AaXRlbSAKLXRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIEBjb2Rle3N0YXJ0fSwgaWYgZGVmaW5lZDsKLUBpdGVtIAotdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIEBzYW1wey50ZXh0fSBzZWN0aW9uLCBpZiBwcmVzZW50OwotQGl0ZW0gCi1UaGUgYWRkcmVzcyBAY29kZXswfS4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBGaWxlIENvbW1hbmRzCi1Ac3Vic2VjdGlvbiBDb21tYW5kcyBkZWFsaW5nIHdpdGggZmlsZXMKLUBjaW5kZXggbGlua2VyIHNjcmlwdCBmaWxlIGNvbW1hbmRzCi1TZXZlcmFsIGxpbmtlciBzY3JpcHQgY29tbWFuZHMgZGVhbCB3aXRoIGZpbGVzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIElOQ0xVREUgQHZhcntmaWxlbmFtZX0KLUBraW5kZXggSU5DTFVERSBAdmFye2ZpbGVuYW1lfQotQGNpbmRleCBpbmNsdWRpbmcgYSBsaW5rZXIgc2NyaXB0Ci1JbmNsdWRlIHRoZSBsaW5rZXIgc2NyaXB0IEB2YXJ7ZmlsZW5hbWV9IGF0IHRoaXMgcG9pbnQuICBUaGUgZmlsZSB3aWxsCi1iZSBzZWFyY2hlZCBmb3IgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBhbmQgaW4gYW55IGRpcmVjdG9yeSBzcGVjaWZpZWQKLXdpdGggdGhlIEBjb2Rley1MfSBvcHRpb24uICBZb3UgY2FuIG5lc3QgY2FsbHMgdG8gQGNvZGV7SU5DTFVERX0gdXAgdG8KLTEwIGxldmVscyBkZWVwLgotCi1AaXRlbSBJTlBVVChAdmFye2ZpbGV9LCBAdmFye2ZpbGV9LCBAZG90c3t9KQotQGl0ZW14IElOUFVUKEB2YXJ7ZmlsZX0gQHZhcntmaWxlfSBAZG90c3t9KQotQGtpbmRleCBJTlBVVChAdmFye2ZpbGVzfSkKLUBjaW5kZXggaW5wdXQgZmlsZXMgaW4gbGlua2VyIHNjcmlwdHMKLUBjaW5kZXggaW5wdXQgb2JqZWN0IGZpbGVzIGluIGxpbmtlciBzY3JpcHRzCi1AY2luZGV4IGxpbmtlciBzY3JpcHQgaW5wdXQgb2JqZWN0IGZpbGVzCi1UaGUgQGNvZGV7SU5QVVR9IGNvbW1hbmQgZGlyZWN0cyB0aGUgbGlua2VyIHRvIGluY2x1ZGUgdGhlIG5hbWVkIGZpbGVzCi1pbiB0aGUgbGluaywgYXMgdGhvdWdoIHRoZXkgd2VyZSBuYW1lZCBvbiB0aGUgY29tbWFuZCBsaW5lLgotCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGFsd2F5cyB3YW50IHRvIGluY2x1ZGUgQGZpbGV7c3Vici5vfSBhbnkgdGltZSB5b3UgZG8KLWEgbGluaywgYnV0IHlvdSBjYW4ndCBiZSBib3RoZXJlZCB0byBwdXQgaXQgb24gZXZlcnkgbGluayBjb21tYW5kIGxpbmUsCi10aGVuIHlvdSBjYW4gcHV0IEBzYW1we0lOUFVUIChzdWJyLm8pfSBpbiB5b3VyIGxpbmtlciBzY3JpcHQuCi0KLUluIGZhY3QsIGlmIHlvdSBsaWtlLCB5b3UgY2FuIGxpc3QgYWxsIG9mIHlvdXIgaW5wdXQgZmlsZXMgaW4gdGhlIGxpbmtlcgotc2NyaXB0LCBhbmQgdGhlbiBpbnZva2UgdGhlIGxpbmtlciB3aXRoIG5vdGhpbmcgYnV0IGEgQHNhbXB7LVR9IG9wdGlvbi4KLQotVGhlIGxpbmtlciB3aWxsIGZpcnN0IHRyeSB0byBvcGVuIHRoZSBmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIElmCi1pdCBpcyBub3QgZm91bmQsIHRoZSBsaW5rZXIgd2lsbCBzZWFyY2ggdGhyb3VnaCB0aGUgYXJjaGl2ZSBsaWJyYXJ5Ci1zZWFyY2ggcGF0aC4gIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgQHNhbXB7LUx9IGluIEByZWZ7T3B0aW9ucywsQ29tbWFuZAotTGluZSBPcHRpb25zfS4KLQotSWYgeW91IHVzZSBAc2FtcHtJTlBVVCAoLWxAdmFye2ZpbGV9KX0sIEBjb2Rle2xkfSB3aWxsIHRyYW5zZm9ybSB0aGUKLW5hbWUgdG8gQGNvZGV7bGliQHZhcntmaWxlfS5hfSwgYXMgd2l0aCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50Ci1Ac2FtcHstbH0uCi0KLVdoZW4geW91IHVzZSB0aGUgQGNvZGV7SU5QVVR9IGNvbW1hbmQgaW4gYW4gaW1wbGljaXQgbGlua2VyIHNjcmlwdCwgdGhlCi1maWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBsaW5rIGF0IHRoZSBwb2ludCBhdCB3aGljaCB0aGUgbGlua2VyCi1zY3JpcHQgZmlsZSBpcyBpbmNsdWRlZC4gIFRoaXMgY2FuIGFmZmVjdCBhcmNoaXZlIHNlYXJjaGluZy4KLQotQGl0ZW0gR1JPVVAoQHZhcntmaWxlfSwgQHZhcntmaWxlfSwgQGRvdHN7fSkKLUBpdGVteCBHUk9VUChAdmFye2ZpbGV9IEB2YXJ7ZmlsZX0gQGRvdHN7fSkKLUBraW5kZXggR1JPVVAoQHZhcntmaWxlc30pCi1AY2luZGV4IGdyb3VwaW5nIGlucHV0IGZpbGVzCi1UaGUgQGNvZGV7R1JPVVB9IGNvbW1hbmQgaXMgbGlrZSBAY29kZXtJTlBVVH0sIGV4Y2VwdCB0aGF0IHRoZSBuYW1lZAotZmlsZXMgc2hvdWxkIGFsbCBiZSBhcmNoaXZlcywgYW5kIHRoZXkgYXJlIHNlYXJjaGVkIHJlcGVhdGVkbHkgdW50aWwgbm8KLW5ldyB1bmRlZmluZWQgcmVmZXJlbmNlcyBhcmUgY3JlYXRlZC4gIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgQHNhbXB7LSh9Ci1pbiBAcmVme09wdGlvbnMsLENvbW1hbmQgTGluZSBPcHRpb25zfS4KLQotQGl0ZW0gT1VUUFVUKEB2YXJ7ZmlsZW5hbWV9KQotQGtpbmRleCBPVVRQVVQoQHZhcntmaWxlbmFtZX0pCi1AY2luZGV4IG91dHB1dCBmaWxlIG5hbWUgaW4gbGlua2VyIHNjcmlwb3QKLVRoZSBAY29kZXtPVVRQVVR9IGNvbW1hbmQgbmFtZXMgdGhlIG91dHB1dCBmaWxlLiAgVXNpbmcKLUBjb2Rle09VVFBVVChAdmFye2ZpbGVuYW1lfSl9IGluIHRoZSBsaW5rZXIgc2NyaXB0IGlzIGV4YWN0bHkgbGlrZSB1c2luZwotQHNhbXB7LW8gQHZhcntmaWxlbmFtZX19IG9uIHRoZSBjb21tYW5kIGxpbmUgKEBweHJlZntPcHRpb25zLCxDb21tYW5kCi1MaW5lIE9wdGlvbnN9KS4gIElmIGJvdGggYXJlIHVzZWQsIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9uIHRha2VzCi1wcmVjZWRlbmNlLgotCi1Zb3UgY2FuIHVzZSB0aGUgQGNvZGV7T1VUUFVUfSBjb21tYW5kIHRvIGRlZmluZSBhIGRlZmF1bHQgbmFtZSBmb3IgdGhlCi1vdXRwdXQgZmlsZSBvdGhlciB0aGFuIHRoZSB1c3VhbCBkZWZhdWx0IG9mIEBmaWxle2Eub3V0fS4KLQotQGl0ZW0gU0VBUkNIX0RJUihAdmFye3BhdGh9KQotQGtpbmRleCBTRUFSQ0hfRElSKEB2YXJ7cGF0aH0pCi1AY2luZGV4IGxpYnJhcnkgc2VhcmNoIHBhdGggaW4gbGlua2VyIHNjcmlwdAotQGNpbmRleCBhcmNoaXZlIHNlYXJjaCBwYXRoIGluIGxpbmtlciBzY3JpcHQKLUBjaW5kZXggc2VhcmNoIHBhdGggaW4gbGlua2VyIHNjcmlwdAotVGhlIEBjb2Rle1NFQVJDSF9ESVJ9IGNvbW1hbmQgYWRkcyBAdmFye3BhdGh9IHRvIHRoZSBsaXN0IG9mIHBhdGhzIHdoZXJlCi1AY29kZXtsZH0gbG9va3MgZm9yIGFyY2hpdmUgbGlicmFyaWVzLiAgVXNpbmcKLUBjb2Rle1NFQVJDSF9ESVIoQHZhcntwYXRofSl9IGlzIGV4YWN0bHkgbGlrZSB1c2luZyBAc2FtcHstTCBAdmFye3BhdGh9fQotb24gdGhlIGNvbW1hbmQgbGluZSAoQHB4cmVme09wdGlvbnMsLENvbW1hbmQgTGluZSBPcHRpb25zfSkuICBJZiBib3RoCi1hcmUgdXNlZCwgdGhlbiB0aGUgbGlua2VyIHdpbGwgc2VhcmNoIGJvdGggcGF0aHMuICBQYXRocyBzcGVjaWZpZWQgdXNpbmcKLXRoZSBjb21tYW5kIGxpbmUgb3B0aW9uIGFyZSBzZWFyY2hlZCBmaXJzdC4KLQotQGl0ZW0gU1RBUlRVUChAdmFye2ZpbGVuYW1lfSkKLUBraW5kZXggU1RBUlRVUChAdmFye2ZpbGVuYW1lfSkKLUBjaW5kZXggZmlyc3QgaW5wdXQgZmlsZQotVGhlIEBjb2Rle1NUQVJUVVB9IGNvbW1hbmQgaXMganVzdCBsaWtlIHRoZSBAY29kZXtJTlBVVH0gY29tbWFuZCwgZXhjZXB0Ci10aGF0IEB2YXJ7ZmlsZW5hbWV9IHdpbGwgYmVjb21lIHRoZSBmaXJzdCBpbnB1dCBmaWxlIHRvIGJlIGxpbmtlZCwgYXMKLXRob3VnaCBpdCB3ZXJlIHNwZWNpZmllZCBmaXJzdCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgVGhpcyBtYXkgYmUgdXNlZnVsCi13aGVuIHVzaW5nIGEgc3lzdGVtIGluIHdoaWNoIHRoZSBlbnRyeSBwb2ludCBpcyBhbHdheXMgdGhlIHN0YXJ0IG9mIHRoZQotZmlyc3QgZmlsZS4KLUBlbmQgdGFibGUKLQotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci1Abm9kZSBGb3JtYXQgQ29tbWFuZHMKLUBzdWJzZWN0aW9uIENvbW1hbmRzIGRlYWxpbmcgd2l0aCBvYmplY3QgZmlsZSBmb3JtYXRzCi1BIGNvdXBsZSBvZiBsaW5rZXIgc2NyaXB0IGNvbW1hbmRzIGRlYWwgd2l0aCBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIE9VVFBVVF9GT1JNQVQoQHZhcntiZmRuYW1lfSkKLUBpdGVteCBPVVRQVVRfRk9STUFUKEB2YXJ7ZGVmYXVsdH0sIEB2YXJ7YmlnfSwgQHZhcntsaXR0bGV9KQotQGtpbmRleCBPVVRQVVRfRk9STUFUKEB2YXJ7YmZkbmFtZX0pCi1AY2luZGV4IG91dHB1dCBmaWxlIGZvcm1hdCBpbiBsaW5rZXIgc2NyaXB0Ci1UaGUgQGNvZGV7T1VUUFVUX0ZPUk1BVH0gY29tbWFuZCBuYW1lcyB0aGUgQkZEIGZvcm1hdCB0byB1c2UgZm9yIHRoZQotb3V0cHV0IGZpbGUgKEBweHJlZntCRkR9KS4gIFVzaW5nIEBjb2Rle09VVFBVVF9GT1JNQVQoQHZhcntiZmRuYW1lfSl9IGlzCi1leGFjdGx5IGxpa2UgdXNpbmcgQHNhbXB7LW9mb3JtYXQgQHZhcntiZmRuYW1lfX0gb24gdGhlIGNvbW1hbmQgbGluZQotKEBweHJlZntPcHRpb25zLCxDb21tYW5kIExpbmUgT3B0aW9uc30pLiAgSWYgYm90aCBhcmUgdXNlZCwgdGhlIGNvbW1hbmQKLWxpbmUgb3B0aW9uIHRha2VzIHByZWNlZGVuY2UuCi0KLVlvdSBjYW4gdXNlIEBjb2Rle09VVFBVVF9GT1JNQVR9IHdpdGggdGhyZWUgYXJndW1lbnRzIHRvIHVzZSBkaWZmZXJlbnQKLWZvcm1hdHMgYmFzZWQgb24gdGhlIEBzYW1wey1FQn0gYW5kIEBzYW1wey1FTH0gY29tbWFuZCBsaW5lIG9wdGlvbnMuCi1UaGlzIHBlcm1pdHMgdGhlIGxpbmtlciBzY3JpcHQgdG8gc2V0IHRoZSBvdXRwdXQgZm9ybWF0IGJhc2VkIG9uIHRoZQotZGVzaXJlZCBlbmRpYW5uZXNzLgotCi1JZiBuZWl0aGVyIEBzYW1wey1FQn0gbm9yIEBzYW1wey1FTH0gYXJlIHVzZWQsIHRoZW4gdGhlIG91dHB1dCBmb3JtYXQKLXdpbGwgYmUgdGhlIGZpcnN0IGFyZ3VtZW50LCBAdmFye2RlZmF1bHR9LiAgSWYgQHNhbXB7LUVCfSBpcyB1c2VkLCB0aGUKLW91dHB1dCBmb3JtYXQgd2lsbCBiZSB0aGUgc2Vjb25kIGFyZ3VtZW50LCBAdmFye2JpZ30uICBJZiBAc2FtcHstRUx9IGlzCi11c2VkLCB0aGUgb3V0cHV0IGZvcm1hdCB3aWxsIGJlIHRoZSB0aGlyZCBhcmd1bWVudCwgQHZhcntsaXR0bGV9LgotCi1Gb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdCBmb3IgdGhlIE1JUFMgRUxGIHRhcmdldCB1c2VzIHRoaXMKLWNvbW1hbmQ6Ci1Ac21hbGxleGFtcGxlCi1PVVRQVVRfRk9STUFUKGVsZjMyLWJpZ21pcHMsIGVsZjMyLWJpZ21pcHMsIGVsZjMyLWxpdHRsZW1pcHMpCi1AZW5kIHNtYWxsZXhhbXBsZQotVGhpcyBzYXlzIHRoYXQgdGhlIGRlZmF1bHQgZm9ybWF0IGZvciB0aGUgb3V0cHV0IGZpbGUgaXMKLUBzYW1we2VsZjMyLWJpZ21pcHN9LCBidXQgaWYgdGhlIHVzZXIgdXNlcyB0aGUgQHNhbXB7LUVMfSBjb21tYW5kIGxpbmUKLW9wdGlvbiwgdGhlIG91dHB1dCBmaWxlIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgQHNhbXB7ZWxmMzItbGl0dGxlbWlwc30KLWZvcm1hdC4KLQotQGl0ZW0gVEFSR0VUKEB2YXJ7YmZkbmFtZX0pCi1Aa2luZGV4IFRBUkdFVChAdmFye2JmZG5hbWV9KQotQGNpbmRleCBpbnB1dCBmaWxlIGZvcm1hdCBpbiBsaW5rZXIgc2NyaXB0Ci1UaGUgQGNvZGV7VEFSR0VUfSBjb21tYW5kIG5hbWVzIHRoZSBCRkQgZm9ybWF0IHRvIHVzZSB3aGVuIHJlYWRpbmcgaW5wdXQKLWZpbGVzLiAgSXQgYWZmZWN0cyBzdWJzZXF1ZW50IEBjb2Rle0lOUFVUfSBhbmQgQGNvZGV7R1JPVVB9IGNvbW1hbmRzLgotVGhpcyBjb21tYW5kIGlzIGxpa2UgdXNpbmcgQHNhbXB7LWIgQHZhcntiZmRuYW1lfX0gb24gdGhlIGNvbW1hbmQgbGluZQotKEBweHJlZntPcHRpb25zLCxDb21tYW5kIExpbmUgT3B0aW9uc30pLiAgSWYgdGhlIEBjb2Rle1RBUkdFVH0gY29tbWFuZAotaXMgdXNlZCBidXQgQGNvZGV7T1VUUFVUX0ZPUk1BVH0gaXMgbm90LCB0aGVuIHRoZSBsYXN0IEBjb2Rle1RBUkdFVH0KLWNvbW1hbmQgaXMgYWxzbyB1c2VkIHRvIHNldCB0aGUgZm9ybWF0IGZvciB0aGUgb3V0cHV0IGZpbGUuICBAeHJlZntCRkR9LgotQGVuZCB0YWJsZQotQGVuZCBpZmNsZWFyCi0KLUBub2RlIE1pc2NlbGxhbmVvdXMgQ29tbWFuZHMKLUBzdWJzZWN0aW9uIE90aGVyIGxpbmtlciBzY3JpcHQgY29tbWFuZHMKLVRoZXJlIGFyZSBhIGZldyBvdGhlciBsaW5rZXIgc2NyaXB0cyBjb21tYW5kcy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBBU1NFUlQoQHZhcntleHB9LCBAdmFye21lc3NhZ2V9KQotQGtpbmRleCBBU1NFUlQKLUBjaW5kZXggYXNzZXJ0aW9uIGluIGxpbmtlciBzY3JpcHQKLUVuc3VyZSB0aGF0IEB2YXJ7ZXhwfSBpcyBub24temVyby4gIElmIGl0IGlzIHplcm8sIHRoZW4gZXhpdCB0aGUgbGlua2VyCi13aXRoIGFuIGVycm9yIGNvZGUsIGFuZCBwcmludCBAdmFye21lc3NhZ2V9LgotCi1AaXRlbSBFWFRFUk4oQHZhcntzeW1ib2x9IEB2YXJ7c3ltYm9sfSBAZG90c3t9KQotQGtpbmRleCBFWFRFUk4KLUBjaW5kZXggdW5kZWZpbmVkIHN5bWJvbCBpbiBsaW5rZXIgc2NyaXB0Ci1Gb3JjZSBAdmFye3N5bWJvbH0gdG8gYmUgZW50ZXJlZCBpbiB0aGUgb3V0cHV0IGZpbGUgYXMgYW4gdW5kZWZpbmVkCi1zeW1ib2wuICBEb2luZyB0aGlzIG1heSwgZm9yIGV4YW1wbGUsIHRyaWdnZXIgbGlua2luZyBvZiBhZGRpdGlvbmFsCi1tb2R1bGVzIGZyb20gc3RhbmRhcmQgbGlicmFyaWVzLiAgWW91IG1heSBsaXN0IHNldmVyYWwgQHZhcntzeW1ib2x9cyBmb3IKLWVhY2ggQGNvZGV7RVhURVJOfSwgYW5kIHlvdSBtYXkgdXNlIEBjb2Rle0VYVEVSTn0gbXVsdGlwbGUgdGltZXMuICBUaGlzCi1jb21tYW5kIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgdGhlIEBzYW1wey11fSBjb21tYW5kLWxpbmUgb3B0aW9uLgotCi1AaXRlbSBGT1JDRV9DT01NT05fQUxMT0NBVElPTgotQGtpbmRleCBGT1JDRV9DT01NT05fQUxMT0NBVElPTgotQGNpbmRleCBjb21tb24gYWxsb2NhdGlvbiBpbiBsaW5rZXIgc2NyaXB0Ci1UaGlzIGNvbW1hbmQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyB0aGUgQHNhbXB7LWR9IGNvbW1hbmQtbGluZSBvcHRpb246Ci10byBtYWtlIEBjb2Rle2xkfSBhc3NpZ24gc3BhY2UgdG8gY29tbW9uIHN5bWJvbHMgZXZlbiBpZiBhIHJlbG9jYXRhYmxlCi1vdXRwdXQgZmlsZSBpcyBzcGVjaWZpZWQgKEBzYW1wey1yfSkuCi0KLUBpdGVtIE5PQ1JPU1NSRUZTKEB2YXJ7c2VjdGlvbn0gQHZhcntzZWN0aW9ufSBAZG90c3t9KQotQGtpbmRleCBOT0NST1NTUkVGUyhAdmFye3NlY3Rpb25zfSkKLUBjaW5kZXggY3Jvc3MgcmVmZXJlbmNlcwotVGhpcyBjb21tYW5kIG1heSBiZSB1c2VkIHRvIHRlbGwgQGNvZGV7bGR9IHRvIGlzc3VlIGFuIGVycm9yIGFib3V0IGFueQotcmVmZXJlbmNlcyBhbW9uZyBjZXJ0YWluIG91dHB1dCBzZWN0aW9ucy4KLQotSW4gY2VydGFpbiB0eXBlcyBvZiBwcm9ncmFtcywgcGFydGljdWxhcmx5IG9uIGVtYmVkZGVkIHN5c3RlbXMgd2hlbgotdXNpbmcgb3ZlcmxheXMsIHdoZW4gb25lIHNlY3Rpb24gaXMgbG9hZGVkIGludG8gbWVtb3J5LCBhbm90aGVyIHNlY3Rpb24KLXdpbGwgbm90IGJlLiAgQW55IGRpcmVjdCByZWZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBzZWN0aW9ucyB3b3VsZCBiZQotZXJyb3JzLiAgRm9yIGV4YW1wbGUsIGl0IHdvdWxkIGJlIGFuIGVycm9yIGlmIGNvZGUgaW4gb25lIHNlY3Rpb24gY2FsbGVkCi1hIGZ1bmN0aW9uIGRlZmluZWQgaW4gdGhlIG90aGVyIHNlY3Rpb24uCi0KLVRoZSBAY29kZXtOT0NST1NTUkVGU30gY29tbWFuZCB0YWtlcyBhIGxpc3Qgb2Ygb3V0cHV0IHNlY3Rpb24gbmFtZXMuICBJZgotQGNvZGV7bGR9IGRldGVjdHMgYW55IGNyb3NzIHJlZmVyZW5jZXMgYmV0d2VlbiB0aGUgc2VjdGlvbnMsIGl0IHJlcG9ydHMKLWFuIGVycm9yIGFuZCByZXR1cm5zIGEgbm9uLXplcm8gZXhpdCBzdGF0dXMuICBOb3RlIHRoYXQgdGhlCi1AY29kZXtOT0NST1NTUkVGU30gY29tbWFuZCB1c2VzIG91dHB1dCBzZWN0aW9uIG5hbWVzLCBub3QgaW5wdXQgc2VjdGlvbgotbmFtZXMuCi0KLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotQGl0ZW0gT1VUUFVUX0FSQ0goQHZhcntiZmRhcmNofSkKLUBraW5kZXggT1VUUFVUX0FSQ0goQHZhcntiZmRhcmNofSkKLUBjaW5kZXggbWFjaGluZSBhcmNoaXRlY3R1cmUKLUBjaW5kZXggYXJjaGl0ZWN0dXJlCi1TcGVjaWZ5IGEgcGFydGljdWxhciBvdXRwdXQgbWFjaGluZSBhcmNoaXRlY3R1cmUuICBUaGUgYXJndW1lbnQgaXMgb25lCi1vZiB0aGUgbmFtZXMgdXNlZCBieSB0aGUgQkZEIGxpYnJhcnkgKEBweHJlZntCRkR9KS4gIFlvdSBjYW4gc2VlIHRoZQotYXJjaGl0ZWN0dXJlIG9mIGFuIG9iamVjdCBmaWxlIGJ5IHVzaW5nIHRoZSBAY29kZXtvYmpkdW1wfSBwcm9ncmFtIHdpdGgKLXRoZSBAc2FtcHstZn0gb3B0aW9uLgotQGVuZCBpZmNsZWFyCi1AZW5kIHRhYmxlCi0KLUBub2RlIEFzc2lnbm1lbnRzCi1Ac2VjdGlvbiBBc3NpZ25pbmcgVmFsdWVzIHRvIFN5bWJvbHMKLUBjaW5kZXggYXNzaWdubWVudCBpbiBzY3JpcHRzCi1AY2luZGV4IHN5bWJvbCBkZWZpbml0aW9uLCBzY3JpcHRzCi1AY2luZGV4IHZhcmlhYmxlcywgZGVmaW5pbmcKLVlvdSBtYXkgYXNzaWduIGEgdmFsdWUgdG8gYSBzeW1ib2wgaW4gYSBsaW5rZXIgc2NyaXB0LiAgVGhpcyB3aWxsIGRlZmluZQotdGhlIHN5bWJvbCBhcyBhIGdsb2JhbCBzeW1ib2wuCi0KLUBtZW51Ci0qIFNpbXBsZSBBc3NpZ25tZW50czo6CQlTaW1wbGUgQXNzaWdubWVudHMKLSogUFJPVklERTo6CQkJUFJPVklERQotQGVuZCBtZW51Ci0KLUBub2RlIFNpbXBsZSBBc3NpZ25tZW50cwotQHN1YnNlY3Rpb24gU2ltcGxlIEFzc2lnbm1lbnRzCi0KLVlvdSBtYXkgYXNzaWduIHRvIGEgc3ltYm9sIHVzaW5nIGFueSBvZiB0aGUgQyBhc3NpZ25tZW50IG9wZXJhdG9yczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBAdmFye3N5bWJvbH0gPSBAdmFye2V4cHJlc3Npb259IDsKLUBpdGVteCBAdmFye3N5bWJvbH0gKz0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9IC09IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGl0ZW14IEB2YXJ7c3ltYm9sfSAqPSBAdmFye2V4cHJlc3Npb259IDsKLUBpdGVteCBAdmFye3N5bWJvbH0gLz0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9IDw8PSBAdmFye2V4cHJlc3Npb259IDsKLUBpdGVteCBAdmFye3N5bWJvbH0gPj49IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGl0ZW14IEB2YXJ7c3ltYm9sfSAmPSBAdmFye2V4cHJlc3Npb259IDsKLUBpdGVteCBAdmFye3N5bWJvbH0gfD0gQHZhcntleHByZXNzaW9ufSA7Ci1AZW5kIHRhYmxlCi0KLVRoZSBmaXJzdCBjYXNlIHdpbGwgZGVmaW5lIEB2YXJ7c3ltYm9sfSB0byB0aGUgdmFsdWUgb2YKLUB2YXJ7ZXhwcmVzc2lvbn0uICBJbiB0aGUgb3RoZXIgY2FzZXMsIEB2YXJ7c3ltYm9sfSBtdXN0IGFscmVhZHkgYmUKLWRlZmluZWQsIGFuZCB0aGUgdmFsdWUgd2lsbCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseS4KLQotVGhlIHNwZWNpYWwgc3ltYm9sIG5hbWUgQHNhbXB7Ln0gaW5kaWNhdGVzIHRoZSBsb2NhdGlvbiBjb3VudGVyLiAgWW91Ci1tYXkgb25seSB1c2UgdGhpcyB3aXRoaW4gYSBAY29kZXtTRUNUSU9OU30gY29tbWFuZC4KLQotVGhlIHNlbWljb2xvbiBhZnRlciBAdmFye2V4cHJlc3Npb259IGlzIHJlcXVpcmVkLgotCi1FeHByZXNzaW9ucyBhcmUgZGVmaW5lZCBiZWxvdzsgc2VlIEByZWZ7RXhwcmVzc2lvbnN9LgotCi1Zb3UgbWF5IHdyaXRlIHN5bWJvbCBhc3NpZ25tZW50cyBhcyBjb21tYW5kcyBpbiB0aGVpciBvd24gcmlnaHQsIG9yIGFzCi1zdGF0ZW1lbnRzIHdpdGhpbiBhIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kLCBvciBhcyBwYXJ0IG9mIGFuIG91dHB1dAotc2VjdGlvbiBkZXNjcmlwdGlvbiBpbiBhIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kLgotCi1UaGUgc2VjdGlvbiBvZiB0aGUgc3ltYm9sIHdpbGwgYmUgc2V0IGZyb20gdGhlIHNlY3Rpb24gb2YgdGhlCi1leHByZXNzaW9uOyBmb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIEByZWZ7RXhwcmVzc2lvbiBTZWN0aW9ufS4KLQotSGVyZSBpcyBhbiBleGFtcGxlIHNob3dpbmcgdGhlIHRocmVlIGRpZmZlcmVudCBwbGFjZXMgdGhhdCBzeW1ib2wKLWFzc2lnbm1lbnRzIG1heSBiZSB1c2VkOgotCi1Ac21hbGxleGFtcGxlCi1mbG9hdGluZ19wb2ludCA9IDA7Ci1TRUNUSU9OUwotQHsKLSAgLnRleHQgOgotICAgIEB7Ci0gICAgICAqKC50ZXh0KQotICAgICAgX2V0ZXh0ID0gLjsKLSAgICBAfQotICBfYmRhdGEgPSAoLiArIDMpICYgfiA0OwotICAuZGF0YSA6IEB7ICooLmRhdGEpIEB9Ci1AfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotSW4gdGhpcyBleGFtcGxlLCB0aGUgc3ltYm9sIEBzYW1we2Zsb2F0aW5nX3BvaW50fSB3aWxsIGJlIGRlZmluZWQgYXMKLXplcm8uICBUaGUgc3ltYm9sIEBzYW1we19ldGV4dH0gd2lsbCBiZSBkZWZpbmVkIGFzIHRoZSBhZGRyZXNzIGZvbGxvd2luZwotdGhlIGxhc3QgQHNhbXB7LnRleHR9IGlucHV0IHNlY3Rpb24uICBUaGUgc3ltYm9sIEBzYW1we19iZGF0YX0gd2lsbCBiZQotZGVmaW5lZCBhcyB0aGUgYWRkcmVzcyBmb2xsb3dpbmcgdGhlIEBzYW1wey50ZXh0fSBvdXRwdXQgc2VjdGlvbiBhbGlnbmVkCi11cHdhcmQgdG8gYSA0IGJ5dGUgYm91bmRhcnkuCi0KLUBub2RlIFBST1ZJREUKLUBzdWJzZWN0aW9uIFBST1ZJREUKLUBjaW5kZXggUFJPVklERQotSW4gc29tZSBjYXNlcywgaXQgaXMgZGVzaXJhYmxlIGZvciBhIGxpbmtlciBzY3JpcHQgdG8gZGVmaW5lIGEgc3ltYm9sCi1vbmx5IGlmIGl0IGlzIHJlZmVyZW5jZWQgYW5kIGlzIG5vdCBkZWZpbmVkIGJ5IGFueSBvYmplY3QgaW5jbHVkZWQgaW4KLXRoZSBsaW5rLiAgRm9yIGV4YW1wbGUsIHRyYWRpdGlvbmFsIGxpbmtlcnMgZGVmaW5lZCB0aGUgc3ltYm9sCi1Ac2FtcHtldGV4dH0uICBIb3dldmVyLCBBTlNJIEMgcmVxdWlyZXMgdGhhdCB0aGUgdXNlciBiZSBhYmxlIHRvIHVzZQotQHNhbXB7ZXRleHR9IGFzIGEgZnVuY3Rpb24gbmFtZSB3aXRob3V0IGVuY291bnRlcmluZyBhbiBlcnJvci4gIFRoZQotQGNvZGV7UFJPVklERX0ga2V5d29yZCBtYXkgYmUgdXNlZCB0byBkZWZpbmUgYSBzeW1ib2wsIHN1Y2ggYXMKLUBzYW1we2V0ZXh0fSwgb25seSBpZiBpdCBpcyByZWZlcmVuY2VkIGJ1dCBub3QgZGVmaW5lZC4gIFRoZSBzeW50YXggaXMKLUBjb2Rle1BST1ZJREUoQHZhcntzeW1ib2x9ID0gQHZhcntleHByZXNzaW9ufSl9LgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgdXNpbmcgQGNvZGV7UFJPVklERX0gdG8gZGVmaW5lIEBzYW1we2V0ZXh0fToKLUBzbWFsbGV4YW1wbGUKLVNFQ1RJT05TCi1AewotICAudGV4dCA6Ci0gICAgQHsKLSAgICAgICooLnRleHQpCi0gICAgICBfZXRleHQgPSAuOwotICAgICAgUFJPVklERShldGV4dCA9IC4pOwotICAgIEB9Ci1AfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotSW4gdGhpcyBleGFtcGxlLCBpZiB0aGUgcHJvZ3JhbSBkZWZpbmVzIEBzYW1we19ldGV4dH0gKHdpdGggYSBsZWFkaW5nCi11bmRlcnNjb3JlKSwgdGhlIGxpbmtlciB3aWxsIGdpdmUgYSBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9yLiAgSWYsIG9uCi10aGUgb3RoZXIgaGFuZCwgdGhlIHByb2dyYW0gZGVmaW5lcyBAc2FtcHtldGV4dH0gKHdpdGggbm8gbGVhZGluZwotdW5kZXJzY29yZSksIHRoZSBsaW5rZXIgd2lsbCBzaWxlbnRseSB1c2UgdGhlIGRlZmluaXRpb24gaW4gdGhlIHByb2dyYW0uCi1JZiB0aGUgcHJvZ3JhbSByZWZlcmVuY2VzIEBzYW1we2V0ZXh0fSBidXQgZG9lcyBub3QgZGVmaW5lIGl0LCB0aGUKLWxpbmtlciB3aWxsIHVzZSB0aGUgZGVmaW5pdGlvbiBpbiB0aGUgbGlua2VyIHNjcmlwdC4KLQotQG5vZGUgU0VDVElPTlMKLUBzZWN0aW9uIFNFQ1RJT05TIGNvbW1hbmQKLUBraW5kZXggU0VDVElPTlMKLVRoZSBAY29kZXtTRUNUSU9OU30gY29tbWFuZCB0ZWxscyB0aGUgbGlua2VyIGhvdyB0byBtYXAgaW5wdXQgc2VjdGlvbnMKLWludG8gb3V0cHV0IHNlY3Rpb25zLCBhbmQgaG93IHRvIHBsYWNlIHRoZSBvdXRwdXQgc2VjdGlvbnMgaW4gbWVtb3J5LgotCi1UaGUgZm9ybWF0IG9mIHRoZSBAY29kZXtTRUNUSU9OU30gY29tbWFuZCBpczoKLUBzbWFsbGV4YW1wbGUKLVNFQ1RJT05TCi1AewotICBAdmFye3NlY3Rpb25zLWNvbW1hbmR9Ci0gIEB2YXJ7c2VjdGlvbnMtY29tbWFuZH0KLSAgQGRvdHN7fQotQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUVhY2ggQHZhcntzZWN0aW9ucy1jb21tYW5kfSBtYXkgb2YgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1hbiBAY29kZXtFTlRSWX0gY29tbWFuZCAoQHB4cmVme0VudHJ5IFBvaW50LCxFbnRyeSBjb21tYW5kfSkKLUBpdGVtCi1hIHN5bWJvbCBhc3NpZ25tZW50IChAcHhyZWZ7QXNzaWdubWVudHN9KQotQGl0ZW0KLWFuIG91dHB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uCi1AaXRlbQotYW4gb3ZlcmxheSBkZXNjcmlwdGlvbgotQGVuZCBpdGVtaXplCi0KLVRoZSBAY29kZXtFTlRSWX0gY29tbWFuZCBhbmQgc3ltYm9sIGFzc2lnbm1lbnRzIGFyZSBwZXJtaXR0ZWQgaW5zaWRlIHRoZQotQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQgZm9yIGNvbnZlbmllbmNlIGluIHVzaW5nIHRoZSBsb2NhdGlvbiBjb3VudGVyIGluCi10aG9zZSBjb21tYW5kcy4gIFRoaXMgY2FuIGFsc28gbWFrZSB0aGUgbGlua2VyIHNjcmlwdCBlYXNpZXIgdG8KLXVuZGVyc3RhbmQgYmVjYXVzZSB5b3UgY2FuIHVzZSB0aG9zZSBjb21tYW5kcyBhdCBtZWFuaW5nZnVsIHBvaW50cyBpbgotdGhlIGxheW91dCBvZiB0aGUgb3V0cHV0IGZpbGUuCi0KLU91dHB1dCBzZWN0aW9uIGRlc2NyaXB0aW9ucyBhbmQgb3ZlcmxheSBkZXNjcmlwdGlvbnMgYXJlIGRlc2NyaWJlZAotYmVsb3cuCi0KLUlmIHlvdSBkbyBub3QgdXNlIGEgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQgaW4geW91ciBsaW5rZXIgc2NyaXB0LCB0aGUKLWxpbmtlciB3aWxsIHBsYWNlIGVhY2ggaW5wdXQgc2VjdGlvbiBpbnRvIGFuIGlkZW50aWNhbGx5IG5hbWVkIG91dHB1dAotc2VjdGlvbiBpbiB0aGUgb3JkZXIgdGhhdCB0aGUgc2VjdGlvbnMgYXJlIGZpcnN0IGVuY291bnRlcmVkIGluIHRoZQotaW5wdXQgZmlsZXMuICBJZiBhbGwgaW5wdXQgc2VjdGlvbnMgYXJlIHByZXNlbnQgaW4gdGhlIGZpcnN0IGZpbGUsIGZvcgotZXhhbXBsZSwgdGhlIG9yZGVyIG9mIHNlY3Rpb25zIGluIHRoZSBvdXRwdXQgZmlsZSB3aWxsIG1hdGNoIHRoZSBvcmRlcgotaW4gdGhlIGZpcnN0IGlucHV0IGZpbGUuICBUaGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIGF0IGFkZHJlc3MgemVyby4KLQotQG1lbnUKLSogT3V0cHV0IFNlY3Rpb24gRGVzY3JpcHRpb246OglPdXRwdXQgc2VjdGlvbiBkZXNjcmlwdGlvbgotKiBPdXRwdXQgU2VjdGlvbiBOYW1lOjoJCU91dHB1dCBzZWN0aW9uIG5hbWUKLSogT3V0cHV0IFNlY3Rpb24gQWRkcmVzczo6CU91dHB1dCBzZWN0aW9uIGFkZHJlc3MKLSogSW5wdXQgU2VjdGlvbjo6CQlJbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uCi0qIE91dHB1dCBTZWN0aW9uIERhdGE6OgkJT3V0cHV0IHNlY3Rpb24gZGF0YQotKiBPdXRwdXQgU2VjdGlvbiBLZXl3b3Jkczo6CU91dHB1dCBzZWN0aW9uIGtleXdvcmRzCi0qIE91dHB1dCBTZWN0aW9uIERpc2NhcmRpbmc6OglPdXRwdXQgc2VjdGlvbiBkaXNjYXJkaW5nCi0qIE91dHB1dCBTZWN0aW9uIEF0dHJpYnV0ZXM6OglPdXRwdXQgc2VjdGlvbiBhdHRyaWJ1dGVzCi0qIE92ZXJsYXkgRGVzY3JpcHRpb246OgkJT3ZlcmxheSBkZXNjcmlwdGlvbgotQGVuZCBtZW51Ci0KLUBub2RlIE91dHB1dCBTZWN0aW9uIERlc2NyaXB0aW9uCi1Ac3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBkZXNjcmlwdGlvbgotVGhlIGZ1bGwgZGVzY3JpcHRpb24gb2YgYW4gb3V0cHV0IHNlY3Rpb24gbG9va3MgbGlrZSB0aGlzOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwIAotQHZhcntzZWN0aW9ufSBbQHZhcnthZGRyZXNzfV0gWyhAdmFye3R5cGV9KV0gOiBbQVQoQHZhcntsbWF9KV0KLSAgQHsKLSAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfQotICAgIEBkb3Rze30KLSAgQH0gWz5AdmFye3JlZ2lvbn1dIFs6QHZhcntwaGRyfSA6QHZhcntwaGRyfSBAZG90c3t9XSBbPUB2YXJ7ZmlsbGV4cH1dCi1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Nb3N0IG91dHB1dCBzZWN0aW9ucyBkbyBub3QgdXNlIG1vc3Qgb2YgdGhlIG9wdGlvbmFsIHNlY3Rpb24gYXR0cmlidXRlcy4KLQotVGhlIHdoaXRlc3BhY2UgYXJvdW5kIEB2YXJ7c2VjdGlvbn0gaXMgcmVxdWlyZWQsIHNvIHRoYXQgdGhlIHNlY3Rpb24KLW5hbWUgaXMgdW5hbWJpZ3VvdXMuICBUaGUgY29sb24gYW5kIHRoZSBjdXJseSBicmFjZXMgYXJlIGFsc28gcmVxdWlyZWQuCi1UaGUgbGluZSBicmVha3MgYW5kIG90aGVyIHdoaXRlIHNwYWNlIGFyZSBvcHRpb25hbC4KLQotRWFjaCBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9IG1heSBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLWEgc3ltYm9sIGFzc2lnbm1lbnQgKEBweHJlZntBc3NpZ25tZW50c30pCi1AaXRlbQotYW4gaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbiAoQHB4cmVme0lucHV0IFNlY3Rpb259KQotQGl0ZW0KLWRhdGEgdmFsdWVzIHRvIGluY2x1ZGUgZGlyZWN0bHkgKEBweHJlZntPdXRwdXQgU2VjdGlvbiBEYXRhfSkKLUBpdGVtCi1hIHNwZWNpYWwgb3V0cHV0IHNlY3Rpb24ga2V5d29yZCAoQHB4cmVme091dHB1dCBTZWN0aW9uIEtleXdvcmRzfSkKLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBOYW1lCi1Ac3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBuYW1lCi1AY2luZGV4IG5hbWUsIHNlY3Rpb24KLUBjaW5kZXggc2VjdGlvbiBuYW1lCi1UaGUgbmFtZSBvZiB0aGUgb3V0cHV0IHNlY3Rpb24gaXMgQHZhcntzZWN0aW9ufS4gIEB2YXJ7c2VjdGlvbn0gbXVzdAotbWVldCB0aGUgY29uc3RyYWludHMgb2YgeW91ciBvdXRwdXQgZm9ybWF0LiAgSW4gZm9ybWF0cyB3aGljaCBvbmx5Ci1zdXBwb3J0IGEgbGltaXRlZCBudW1iZXIgb2Ygc2VjdGlvbnMsIHN1Y2ggYXMgQGNvZGV7YS5vdXR9LCB0aGUgbmFtZQotbXVzdCBiZSBvbmUgb2YgdGhlIG5hbWVzIHN1cHBvcnRlZCBieSB0aGUgZm9ybWF0IChAY29kZXthLm91dH0sIGZvcgotZXhhbXBsZSwgYWxsb3dzIG9ubHkgQHNhbXB7LnRleHR9LCBAc2FtcHsuZGF0YX0gb3IgQHNhbXB7LmJzc30pLiBJZiB0aGUKLW91dHB1dCBmb3JtYXQgc3VwcG9ydHMgYW55IG51bWJlciBvZiBzZWN0aW9ucywgYnV0IHdpdGggbnVtYmVycyBhbmQgbm90Ci1uYW1lcyAoYXMgaXMgdGhlIGNhc2UgZm9yIE9hc3lzKSwgdGhlIG5hbWUgc2hvdWxkIGJlIHN1cHBsaWVkIGFzIGEKLXF1b3RlZCBudW1lcmljIHN0cmluZy4gIEEgc2VjdGlvbiBuYW1lIG1heSBjb25zaXN0IG9mIGFueSBzZXF1ZW5jZSBvZgotY2hhcmFjdGVycywgYnV0IGEgbmFtZSB3aGljaCBjb250YWlucyBhbnkgdW51c3VhbCBjaGFyYWN0ZXJzIHN1Y2ggYXMKLWNvbW1hcyBtdXN0IGJlIHF1b3RlZC4KLQotVGhlIG91dHB1dCBzZWN0aW9uIG5hbWUgQHNhbXB7L0RJU0NBUkQvfSBpcyBzcGVjaWFsOyBAcmVme091dHB1dCBTZWN0aW9uCi1EaXNjYXJkaW5nfS4KLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gQWRkcmVzcwotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gYWRkcmVzcwotQGNpbmRleCBhZGRyZXNzLCBzZWN0aW9uCi1AY2luZGV4IHNlY3Rpb24gYWRkcmVzcwotVGhlIEB2YXJ7YWRkcmVzc30gaXMgYW4gZXhwcmVzc2lvbiBmb3IgdGhlIFZNQSAodGhlIHZpcnR1YWwgbWVtb3J5Ci1hZGRyZXNzKSBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICBJZiB5b3UgZG8gbm90IHByb3ZpZGUgQHZhcnthZGRyZXNzfSwKLXRoZSBsaW5rZXIgd2lsbCBzZXQgaXQgYmFzZWQgb24gQHZhcntyZWdpb259IGlmIHByZXNlbnQsIG9yIG90aGVyd2lzZQotYmFzZWQgb24gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIuCi0KLUlmIHlvdSBwcm92aWRlIEB2YXJ7YWRkcmVzc30sIHRoZSBhZGRyZXNzIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiB3aWxsIGJlCi1zZXQgdG8gcHJlY2lzZWx5IHRoYXQuICBJZiB5b3UgcHJvdmlkZSBuZWl0aGVyIEB2YXJ7YWRkcmVzc30gbm9yCi1AdmFye3JlZ2lvbn0sIHRoZW4gdGhlIGFkZHJlc3Mgb2YgdGhlIG91dHB1dCBzZWN0aW9uIHdpbGwgYmUgc2V0IHRvIHRoZQotY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gY291bnRlciBhbGlnbmVkIHRvIHRoZSBhbGlnbm1lbnQKLXJlcXVpcmVtZW50cyBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICBUaGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IG9mIHRoZQotb3V0cHV0IHNlY3Rpb24gaXMgdGhlIHN0cmljdGVzdCBhbGlnbm1lbnQgb2YgYW55IGlucHV0IHNlY3Rpb24gY29udGFpbmVkCi13aXRoaW4gdGhlIG91dHB1dCBzZWN0aW9uLgotCi1Gb3IgZXhhbXBsZSwKLUBzbWFsbGV4YW1wbGUKLS50ZXh0IC4gOiBAeyAqKC50ZXh0KSBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotYW5kCi1Ac21hbGxleGFtcGxlCi0udGV4dCA6IEB7ICooLnRleHQpIEB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1hcmUgc3VidGx5IGRpZmZlcmVudC4gIFRoZSBmaXJzdCB3aWxsIHNldCB0aGUgYWRkcmVzcyBvZiB0aGUKLUBzYW1wey50ZXh0fSBvdXRwdXQgc2VjdGlvbiB0byB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24KLWNvdW50ZXIuICBUaGUgc2Vjb25kIHdpbGwgc2V0IGl0IHRvIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb2NhdGlvbgotY291bnRlciBhbGlnbmVkIHRvIHRoZSBzdHJpY3Rlc3QgYWxpZ25tZW50IG9mIGEgQHNhbXB7LnRleHR9IGlucHV0Ci1zZWN0aW9uLgotCi1UaGUgQHZhcnthZGRyZXNzfSBtYXkgYmUgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb247IEByZWZ7RXhwcmVzc2lvbnN9LgotRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGFsaWduIHRoZSBzZWN0aW9uIG9uIGEgMHgxMCBieXRlIGJvdW5kYXJ5LAotc28gdGhhdCB0aGUgbG93ZXN0IGZvdXIgYml0cyBvZiB0aGUgc2VjdGlvbiBhZGRyZXNzIGFyZSB6ZXJvLCB5b3UgY291bGQKLWRvIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci1Ac21hbGxleGFtcGxlCi0udGV4dCBBTElHTigweDEwKSA6IEB7ICooLnRleHQpIEB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGlzIHdvcmtzIGJlY2F1c2UgQGNvZGV7QUxJR059IHJldHVybnMgdGhlIGN1cnJlbnQgbG9jYXRpb24gY291bnRlcgotYWxpZ25lZCB1cHdhcmQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQotU3BlY2lmeWluZyBAdmFye2FkZHJlc3N9IGZvciBhIHNlY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZQotbG9jYXRpb24gY291bnRlci4KLQotQG5vZGUgSW5wdXQgU2VjdGlvbgotQHN1YnNlY3Rpb24gSW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbgotQGNpbmRleCBpbnB1dCBzZWN0aW9ucwotQGNpbmRleCBtYXBwaW5nIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dCBzZWN0aW9ucwotVGhlIG1vc3QgY29tbW9uIG91dHB1dCBzZWN0aW9uIGNvbW1hbmQgaXMgYW4gaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbi4KLQotVGhlIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24gaXMgdGhlIG1vc3QgYmFzaWMgbGlua2VyIHNjcmlwdCBvcGVyYXRpb24uCi1Zb3UgdXNlIG91dHB1dCBzZWN0aW9ucyB0byB0ZWxsIHRoZSBsaW5rZXIgaG93IHRvIGxheSBvdXQgeW91ciBwcm9ncmFtCi1pbiBtZW1vcnkuICBZb3UgdXNlIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb25zIHRvIHRlbGwgdGhlIGxpbmtlciBob3cgdG8KLW1hcCB0aGUgaW5wdXQgZmlsZXMgaW50byB5b3VyIG1lbW9yeSBsYXlvdXQuCi0KLUBtZW51Ci0qIElucHV0IFNlY3Rpb24gQmFzaWNzOjoJSW5wdXQgc2VjdGlvbiBiYXNpY3MKLSogSW5wdXQgU2VjdGlvbiBXaWxkY2FyZHM6OglJbnB1dCBzZWN0aW9uIHdpbGRjYXJkIHBhdHRlcm5zCi0qIElucHV0IFNlY3Rpb24gQ29tbW9uOjoJSW5wdXQgc2VjdGlvbiBmb3IgY29tbW9uIHN5bWJvbHMKLSogSW5wdXQgU2VjdGlvbiBLZWVwOjoJCUlucHV0IHNlY3Rpb24gYW5kIGdhcmJhZ2UgY29sbGVjdGlvbgotKiBJbnB1dCBTZWN0aW9uIEV4YW1wbGU6OglJbnB1dCBzZWN0aW9uIGV4YW1wbGUKLUBlbmQgbWVudQotCi1Abm9kZSBJbnB1dCBTZWN0aW9uIEJhc2ljcwotQHN1YnN1YnNlY3Rpb24gSW5wdXQgc2VjdGlvbiBiYXNpY3MKLUBjaW5kZXggaW5wdXQgc2VjdGlvbiBiYXNpY3MKLUFuIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24gY29uc2lzdHMgb2YgYSBmaWxlIG5hbWUgb3B0aW9uYWxseSBmb2xsb3dlZAotYnkgYSBsaXN0IG9mIHNlY3Rpb24gbmFtZXMgaW4gcGFyZW50aGVzZXMuCi0KLVRoZSBmaWxlIG5hbWUgYW5kIHRoZSBzZWN0aW9uIG5hbWUgbWF5IGJlIHdpbGRjYXJkIHBhdHRlcm5zLCB3aGljaCB3ZQotZGVzY3JpYmUgZnVydGhlciBiZWxvdyAoQHB4cmVme0lucHV0IFNlY3Rpb24gV2lsZGNhcmRzfSkuCi0KLVRoZSBtb3N0IGNvbW1vbiBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uIGlzIHRvIGluY2x1ZGUgYWxsIGlucHV0Ci1zZWN0aW9ucyB3aXRoIGEgcGFydGljdWxhciBuYW1lIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gIEZvciBleGFtcGxlLCB0bwotaW5jbHVkZSBhbGwgaW5wdXQgQHNhbXB7LnRleHR9IHNlY3Rpb25zLCB5b3Ugd291bGQgd3JpdGU6Ci1Ac21hbGxleGFtcGxlCi0qKC50ZXh0KQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotSGVyZSB0aGUgQHNhbXB7Kn0gaXMgYSB3aWxkY2FyZCB3aGljaCBtYXRjaGVzIGFueSBmaWxlIG5hbWUuICBUbyBleGNsdWRlIGEgZmlsZQotZnJvbSBtYXRjaGluZyB0aGUgZmlsZSBuYW1lIHdpbGRjYXJkLCBFWENMVURFX0ZJTEUgbWF5IGJlIHVzZWQgdG8gbWF0Y2ggYWxsIGZpbGVzCi1leGNlcHQgdGhlIG9uZSBzcGVjaWZpZWQgYnkgRVhDTFVERV9GSUxFLiAgRm9yIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi0oKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmN0b3JzKSkKLUBlbmQgc21hbGxleGFtcGxlCi13aWxsIGNhdXNlIGFsbCAuY3RvcnMgc2VjdGlvbnMgZnJvbSBhbGwgZmlsZXMgZXhjZXB0IGNydGVuZC5vIHRvIGJlIGluY2x1ZGVkLgotCi1UaGVyZSBhcmUgdHdvIHdheXMgdG8gaW5jbHVkZSBtb3JlIHRoYW4gb25lIHNlY3Rpb246Ci1Ac21hbGxleGFtcGxlCi0qKC50ZXh0IC5yZGF0YSkKLSooLnRleHQpICooLnJkYXRhKQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIEBzYW1wey50ZXh0fSBhbmQKLUBzYW1wey5yZGF0YX0gaW5wdXQgc2VjdGlvbnMgd2lsbCBhcHBlYXIgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgSW4gdGhlCi1maXJzdCBleGFtcGxlLCB0aGV5IHdpbGwgYmUgaW50ZXJtaW5nbGVkLiAgSW4gdGhlIHNlY29uZCBleGFtcGxlLCBhbGwKLUBzYW1wey50ZXh0fSBpbnB1dCBzZWN0aW9ucyB3aWxsIGFwcGVhciBmaXJzdCwgZm9sbG93ZWQgYnkgYWxsCi1Ac2FtcHsucmRhdGF9IGlucHV0IHNlY3Rpb25zLgotCi1Zb3UgY2FuIHNwZWNpZnkgYSBmaWxlIG5hbWUgdG8gaW5jbHVkZSBzZWN0aW9ucyBmcm9tIGEgcGFydGljdWxhciBmaWxlLgotWW91IHdvdWxkIGRvIHRoaXMgaWYgb25lIG9yIG1vcmUgb2YgeW91ciBmaWxlcyBjb250YWluIHNwZWNpYWwgZGF0YSB0aGF0Ci1uZWVkcyB0byBiZSBhdCBhIHBhcnRpY3VsYXIgbG9jYXRpb24gaW4gbWVtb3J5LiAgRm9yIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi1kYXRhLm8oLmRhdGEpCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1JZiB5b3UgdXNlIGEgZmlsZSBuYW1lIHdpdGhvdXQgYSBsaXN0IG9mIHNlY3Rpb25zLCB0aGVuIGFsbCBzZWN0aW9ucyBpbgotdGhlIGlucHV0IGZpbGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICBUaGlzIGlzIG5vdAotY29tbW9ubHkgZG9uZSwgYnV0IGl0IG1heSBieSB1c2VmdWwgb24gb2NjYXNpb24uICBGb3IgZXhhbXBsZToKLUBzbWFsbGV4YW1wbGUKLWRhdGEubwotQGVuZCBzbWFsbGV4YW1wbGUKLQotV2hlbiB5b3UgdXNlIGEgZmlsZSBuYW1lIHdoaWNoIGRvZXMgbm90IGNvbnRhaW4gYW55IHdpbGQgY2FyZAotY2hhcmFjdGVycywgdGhlIGxpbmtlciB3aWxsIGZpcnN0IHNlZSBpZiB5b3UgYWxzbyBzcGVjaWZpZWQgdGhlIGZpbGUKLW5hbWUgb24gdGhlIGxpbmtlciBjb21tYW5kIGxpbmUgb3IgaW4gYW4gQGNvZGV7SU5QVVR9IGNvbW1hbmQuICBJZiB5b3UKLWRpZCBub3QsIHRoZSBsaW5rZXIgd2lsbCBhdHRlbXB0IHRvIG9wZW4gdGhlIGZpbGUgYXMgYW4gaW5wdXQgZmlsZSwgYXMKLXRob3VnaCBpdCBhcHBlYXJlZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgTm90ZSB0aGF0IHRoaXMgZGlmZmVycyBmcm9tIGFuCi1AY29kZXtJTlBVVH0gY29tbWFuZCwgYmVjYXVzZSB0aGUgbGlua2VyIHdpbGwgbm90IHNlYXJjaCBmb3IgdGhlIGZpbGUgaW4KLXRoZSBhcmNoaXZlIHNlYXJjaCBwYXRoLgotCi1Abm9kZSBJbnB1dCBTZWN0aW9uIFdpbGRjYXJkcwotQHN1YnN1YnNlY3Rpb24gSW5wdXQgc2VjdGlvbiB3aWxkY2FyZCBwYXR0ZXJucwotQGNpbmRleCBpbnB1dCBzZWN0aW9uIHdpbGRjYXJkcwotQGNpbmRleCB3aWxkY2FyZCBmaWxlIG5hbWUgcGF0dGVybnMKLUBjaW5kZXggZmlsZSBuYW1lIHdpbGRjYXJkIHBhdHRlcm5zCi1AY2luZGV4IHNlY3Rpb24gbmFtZSB3aWxkY2FyZCBwYXR0ZXJucwotSW4gYW4gaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbiwgZWl0aGVyIHRoZSBmaWxlIG5hbWUgb3IgdGhlIHNlY3Rpb24KLW5hbWUgb3IgYm90aCBtYXkgYmUgd2lsZGNhcmQgcGF0dGVybnMuCi0KLVRoZSBmaWxlIG5hbWUgb2YgQHNhbXB7Kn0gc2VlbiBpbiBtYW55IGV4YW1wbGVzIGlzIGEgc2ltcGxlIHdpbGRjYXJkCi1wYXR0ZXJuIGZvciB0aGUgZmlsZSBuYW1lLgotCi1UaGUgd2lsZGNhcmQgcGF0dGVybnMgYXJlIGxpa2UgdGhvc2UgdXNlZCBieSB0aGUgVW5peCBzaGVsbC4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSAqCi1tYXRjaGVzIGFueSBudW1iZXIgb2YgY2hhcmFjdGVycwotQGl0ZW0gPwotbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlcgotQGl0ZW0gW0B2YXJ7Y2hhcnN9XQotbWF0Y2hlcyBhIHNpbmdsZSBpbnN0YW5jZSBvZiBhbnkgb2YgdGhlIEB2YXJ7Y2hhcnN9OyB0aGUgQHNhbXB7LX0KLWNoYXJhY3RlciBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5IGEgcmFuZ2Ugb2YgY2hhcmFjdGVycywgYXMgaW4KLUBzYW1we1thLXpdfSB0byBtYXRjaCBhbnkgbG93ZXIgY2FzZSBsZXR0ZXIKLUBpdGVtIFwKLXF1b3RlcyB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcgotQGVuZCB0YWJsZQotCi1XaGVuIGEgZmlsZSBuYW1lIGlzIG1hdGNoZWQgd2l0aCBhIHdpbGRjYXJkLCB0aGUgd2lsZGNhcmQgY2hhcmFjdGVycwotd2lsbCBub3QgbWF0Y2ggYSBAc2FtcHsvfSBjaGFyYWN0ZXIgKHVzZWQgdG8gc2VwYXJhdGUgZGlyZWN0b3J5IG5hbWVzIG9uCi1Vbml4KS4gIEEgcGF0dGVybiBjb25zaXN0aW5nIG9mIGEgc2luZ2xlIEBzYW1weyp9IGNoYXJhY3RlciBpcyBhbgotZXhjZXB0aW9uOyBpdCB3aWxsIGFsd2F5cyBtYXRjaCBhbnkgZmlsZSBuYW1lLCB3aGV0aGVyIGl0IGNvbnRhaW5zIGEKLUBzYW1wey99IG9yIG5vdC4gIEluIGEgc2VjdGlvbiBuYW1lLCB0aGUgd2lsZGNhcmQgY2hhcmFjdGVycyB3aWxsIG1hdGNoCi1hIEBzYW1wey99IGNoYXJhY3Rlci4KLQotRmlsZSBuYW1lIHdpbGRjYXJkIHBhdHRlcm5zIG9ubHkgbWF0Y2ggZmlsZXMgd2hpY2ggYXJlIGV4cGxpY2l0bHkKLXNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIG9yIGluIGFuIEBjb2Rle0lOUFVUfSBjb21tYW5kLiAgVGhlIGxpbmtlcgotZG9lcyBub3Qgc2VhcmNoIGRpcmVjdG9yaWVzIHRvIGV4cGFuZCB3aWxkY2FyZHMuCi0KLUlmIGEgZmlsZSBuYW1lIG1hdGNoZXMgbW9yZSB0aGFuIG9uZSB3aWxkY2FyZCBwYXR0ZXJuLCBvciBpZiBhIGZpbGUgbmFtZQotYXBwZWFycyBleHBsaWNpdGx5IGFuZCBpcyBhbHNvIG1hdGNoZWQgYnkgYSB3aWxkY2FyZCBwYXR0ZXJuLCB0aGUgbGlua2VyCi13aWxsIHVzZSB0aGUgZmlyc3QgbWF0Y2ggaW4gdGhlIGxpbmtlciBzY3JpcHQuICBGb3IgZXhhbXBsZSwgdGhpcwotc2VxdWVuY2Ugb2YgaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbnMgaXMgcHJvYmFibHkgaW4gZXJyb3IsIGJlY2F1c2UgdGhlCi1AZmlsZXtkYXRhLm99IHJ1bGUgd2lsbCBub3QgYmUgdXNlZDoKLUBzbWFsbGV4YW1wbGUKLS5kYXRhIDogQHsgKiguZGF0YSkgQH0KLS5kYXRhMSA6IEB7IGRhdGEubyguZGF0YSkgQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjaW5kZXggU09SVAotTm9ybWFsbHksIHRoZSBsaW5rZXIgd2lsbCBwbGFjZSBmaWxlcyBhbmQgc2VjdGlvbnMgbWF0Y2hlZCBieSB3aWxkY2FyZHMKLWluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBzZWVuIGR1cmluZyB0aGUgbGluay4gIFlvdSBjYW4gY2hhbmdlCi10aGlzIGJ5IHVzaW5nIHRoZSBAY29kZXtTT1JUfSBrZXl3b3JkLCB3aGljaCBhcHBlYXJzIGJlZm9yZSBhIHdpbGRjYXJkCi1wYXR0ZXJuIGluIHBhcmVudGhlc2VzIChlLmcuLCBAY29kZXtTT1JUKC50ZXh0Kil9KS4gIFdoZW4gdGhlCi1AY29kZXtTT1JUfSBrZXl3b3JkIGlzIHVzZWQsIHRoZSBsaW5rZXIgd2lsbCBzb3J0IHRoZSBmaWxlcyBvciBzZWN0aW9ucwotaW50byBhc2NlbmRpbmcgb3JkZXIgYnkgbmFtZSBiZWZvcmUgcGxhY2luZyB0aGVtIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotSWYgeW91IGV2ZXIgZ2V0IGNvbmZ1c2VkIGFib3V0IHdoZXJlIGlucHV0IHNlY3Rpb25zIGFyZSBnb2luZywgdXNlIHRoZQotQHNhbXB7LU19IGxpbmtlciBvcHRpb24gdG8gZ2VuZXJhdGUgYSBtYXAgZmlsZS4gIFRoZSBtYXAgZmlsZSBzaG93cwotcHJlY2lzZWx5IGhvdyBpbnB1dCBzZWN0aW9ucyBhcmUgbWFwcGVkIHRvIG91dHB1dCBzZWN0aW9ucy4KLQotVGhpcyBleGFtcGxlIHNob3dzIGhvdyB3aWxkY2FyZCBwYXR0ZXJucyBtaWdodCBiZSB1c2VkIHRvIHBhcnRpdGlvbgotZmlsZXMuICBUaGlzIGxpbmtlciBzY3JpcHQgZGlyZWN0cyB0aGUgbGlua2VyIHRvIHBsYWNlIGFsbCBAc2FtcHsudGV4dH0KLXNlY3Rpb25zIGluIEBzYW1wey50ZXh0fSBhbmQgYWxsIEBzYW1wey5ic3N9IHNlY3Rpb25zIGluIEBzYW1wey5ic3N9LgotVGhlIGxpbmtlciB3aWxsIHBsYWNlIHRoZSBAc2FtcHsuZGF0YX0gc2VjdGlvbiBmcm9tIGFsbCBmaWxlcyBiZWdpbm5pbmcKLXdpdGggYW4gdXBwZXIgY2FzZSBjaGFyYWN0ZXIgaW4gQHNhbXB7LkRBVEF9OyBmb3IgYWxsIG90aGVyIGZpbGVzLCB0aGUKLWxpbmtlciB3aWxsIHBsYWNlIHRoZSBAc2FtcHsuZGF0YX0gc2VjdGlvbiBpbiBAc2FtcHsuZGF0YX0uCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TIEB7Ci0gIC50ZXh0IDogQHsgKigudGV4dCkgQH0KLSAgLkRBVEEgOiBAeyBbQS1aXSooLmRhdGEpIEB9Ci0gIC5kYXRhIDogQHsgKiguZGF0YSkgQH0KLSAgLmJzcyA6IEB7ICooLmJzcykgQH0KLUB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBJbnB1dCBTZWN0aW9uIENvbW1vbgotQHN1YnN1YnNlY3Rpb24gSW5wdXQgc2VjdGlvbiBmb3IgY29tbW9uIHN5bWJvbHMKLUBjaW5kZXggY29tbW9uIHN5bWJvbCBwbGFjZW1lbnQKLUBjaW5kZXggdW5pbml0aWFsaXplZCBkYXRhIHBsYWNlbWVudAotQSBzcGVjaWFsIG5vdGF0aW9uIGlzIG5lZWRlZCBmb3IgY29tbW9uIHN5bWJvbHMsIGJlY2F1c2UgaW4gbWFueSBvYmplY3QKLWZpbGUgZm9ybWF0cyBjb21tb24gc3ltYm9scyBkbyBub3QgaGF2ZSBhIHBhcnRpY3VsYXIgaW5wdXQgc2VjdGlvbi4gIFRoZQotbGlua2VyIHRyZWF0cyBjb21tb24gc3ltYm9scyBhcyB0aG91Z2ggdGhleSBhcmUgaW4gYW4gaW5wdXQgc2VjdGlvbgotbmFtZWQgQHNhbXB7Q09NTU9OfS4KLQotWW91IG1heSB1c2UgZmlsZSBuYW1lcyB3aXRoIHRoZSBAc2FtcHtDT01NT059IHNlY3Rpb24ganVzdCBhcyB3aXRoIGFueQotb3RoZXIgaW5wdXQgc2VjdGlvbnMuICBZb3UgY2FuIHVzZSB0aGlzIHRvIHBsYWNlIGNvbW1vbiBzeW1ib2xzIGZyb20gYQotcGFydGljdWxhciBpbnB1dCBmaWxlIGluIG9uZSBzZWN0aW9uIHdoaWxlIGNvbW1vbiBzeW1ib2xzIGZyb20gb3RoZXIKLWlucHV0IGZpbGVzIGFyZSBwbGFjZWQgaW4gYW5vdGhlciBzZWN0aW9uLgotCi1JbiBtb3N0IGNhc2VzLCBjb21tb24gc3ltYm9scyBpbiBpbnB1dCBmaWxlcyB3aWxsIGJlIHBsYWNlZCBpbiB0aGUKLUBzYW1wey5ic3N9IHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLiAgRm9yIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi0uYnNzIEB7ICooLmJzcykgKihDT01NT04pIEB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY2luZGV4IHNjb21tb24gc2VjdGlvbgotQGNpbmRleCBzbWFsbCBjb21tb24gc3ltYm9scwotU29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIGhhdmUgbW9yZSB0aGFuIG9uZSB0eXBlIG9mIGNvbW1vbiBzeW1ib2wuICBGb3IKLWV4YW1wbGUsIHRoZSBNSVBTIEVMRiBvYmplY3QgZmlsZSBmb3JtYXQgZGlzdGluZ3Vpc2hlcyBzdGFuZGFyZCBjb21tb24KLXN5bWJvbHMgYW5kIHNtYWxsIGNvbW1vbiBzeW1ib2xzLiAgSW4gdGhpcyBjYXNlLCB0aGUgbGlua2VyIHdpbGwgdXNlIGEKLWRpZmZlcmVudCBzcGVjaWFsIHNlY3Rpb24gbmFtZSBmb3Igb3RoZXIgdHlwZXMgb2YgY29tbW9uIHN5bWJvbHMuICBJbgotdGhlIGNhc2Ugb2YgTUlQUyBFTEYsIHRoZSBsaW5rZXIgdXNlcyBAc2FtcHtDT01NT059IGZvciBzdGFuZGFyZCBjb21tb24KLXN5bWJvbHMgYW5kIEBzYW1wey5zY29tbW9ufSBmb3Igc21hbGwgY29tbW9uIHN5bWJvbHMuICBUaGlzIHBlcm1pdHMgeW91Ci10byBtYXAgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBjb21tb24gc3ltYm9scyBpbnRvIG1lbW9yeSBhdCBkaWZmZXJlbnQKLWxvY2F0aW9ucy4KLQotQGNpbmRleCBbQ09NTU9OXQotWW91IHdpbGwgc29tZXRpbWVzIHNlZSBAc2FtcHtbQ09NTU9OXX0gaW4gb2xkIGxpbmtlciBzY3JpcHRzLiAgVGhpcwotbm90YXRpb24gaXMgbm93IGNvbnNpZGVyZWQgb2Jzb2xldGUuICBJdCBpcyBlcXVpdmFsZW50IHRvCi1Ac2FtcHsqKENPTU1PTil9LgotCi1Abm9kZSBJbnB1dCBTZWN0aW9uIEtlZXAKLUBzdWJzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gYW5kIGdhcmJhZ2UgY29sbGVjdGlvbgotQGNpbmRleCBLRUVQCi1AY2luZGV4IGdhcmJhZ2UgY29sbGVjdGlvbgotV2hlbiBsaW5rLXRpbWUgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzIGluIHVzZSAoQHNhbXB7LS1nYy1zZWN0aW9uc30pLAotaXQgaXMgb2Z0ZW4gdXNlZnVsIHRvIG1hcmsgc2VjdGlvbnMgdGhhdCBzaG91bGQgbm90IGJlIGVsaW1pbmF0ZWQuIAotVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgc3Vycm91bmRpbmcgYW4gaW5wdXQgc2VjdGlvbidzIHdpbGRjYXJkIGVudHJ5Ci13aXRoIEBjb2Rle0tFRVAoKX0sIGFzIGluIEBjb2Rle0tFRVAoKiguaW5pdCkpfSBvcgotQGNvZGV7S0VFUChTT1JUKCopKC5jdG9ycykpfS4KLQotQG5vZGUgSW5wdXQgU2VjdGlvbiBFeGFtcGxlCi1Ac3Vic3Vic2VjdGlvbiBJbnB1dCBzZWN0aW9uIGV4YW1wbGUKLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpcyBhIGNvbXBsZXRlIGxpbmtlciBzY3JpcHQuICBJdCB0ZWxscyB0aGUgbGlua2VyCi10byByZWFkIGFsbCBvZiB0aGUgc2VjdGlvbnMgZnJvbSBmaWxlIEBmaWxle2FsbC5vfSBhbmQgcGxhY2UgdGhlbSBhdCB0aGUKLXN0YXJ0IG9mIG91dHB1dCBzZWN0aW9uIEBzYW1we291dHB1dGF9IHdoaWNoIHN0YXJ0cyBhdCBsb2NhdGlvbgotQHNhbXB7MHgxMDAwMH0uICBBbGwgb2Ygc2VjdGlvbiBAc2FtcHsuaW5wdXQxfSBmcm9tIGZpbGUgQGZpbGV7Zm9vLm99Ci1mb2xsb3dzIGltbWVkaWF0ZWx5LCBpbiB0aGUgc2FtZSBvdXRwdXQgc2VjdGlvbi4gIEFsbCBvZiBzZWN0aW9uCi1Ac2FtcHsuaW5wdXQyfSBmcm9tIEBmaWxle2Zvby5vfSBnb2VzIGludG8gb3V0cHV0IHNlY3Rpb24KLUBzYW1we291dHB1dGJ9LCBmb2xsb3dlZCBieSBzZWN0aW9uIEBzYW1wey5pbnB1dDF9IGZyb20gQGZpbGV7Zm9vMS5vfS4KLUFsbCBvZiB0aGUgcmVtYWluaW5nIEBzYW1wey5pbnB1dDF9IGFuZCBAc2FtcHsuaW5wdXQyfSBzZWN0aW9ucyBmcm9tIGFueQotZmlsZXMgYXJlIHdyaXR0ZW4gdG8gb3V0cHV0IHNlY3Rpb24gQHNhbXB7b3V0cHV0Y30uCi0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMgQHsKLSAgb3V0cHV0YSAweDEwMDAwIDoKLSAgICBAewotICAgIGFsbC5vCi0gICAgZm9vLm8gKC5pbnB1dDEpCi0gICAgQH0KLSAgb3V0cHV0YiA6Ci0gICAgQHsKLSAgICBmb28ubyAoLmlucHV0MikKLSAgICBmb28xLm8gKC5pbnB1dDEpCi0gICAgQH0KLSAgb3V0cHV0YyA6Ci0gICAgQHsKLSAgICAqKC5pbnB1dDEpCi0gICAgKiguaW5wdXQyKQotICAgIEB9Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUgICAgICAgIAotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBEYXRhCi1Ac3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBkYXRhCi1AY2luZGV4IGRhdGEKLUBjaW5kZXggc2VjdGlvbiBkYXRhCi1AY2luZGV4IG91dHB1dCBzZWN0aW9uIGRhdGEKLUBraW5kZXggQllURShAdmFye2V4cHJlc3Npb259KQotQGtpbmRleCBTSE9SVChAdmFye2V4cHJlc3Npb259KQotQGtpbmRleCBMT05HKEB2YXJ7ZXhwcmVzc2lvbn0pCi1Aa2luZGV4IFFVQUQoQHZhcntleHByZXNzaW9ufSkKLUBraW5kZXggU1FVQUQoQHZhcntleHByZXNzaW9ufSkKLVlvdSBjYW4gaW5jbHVkZSBleHBsaWNpdCBieXRlcyBvZiBkYXRhIGluIGFuIG91dHB1dCBzZWN0aW9uIGJ5IHVzaW5nCi1AY29kZXtCWVRFfSwgQGNvZGV7U0hPUlR9LCBAY29kZXtMT05HfSwgQGNvZGV7UVVBRH0sIG9yIEBjb2Rle1NRVUFEfSBhcwotYW4gb3V0cHV0IHNlY3Rpb24gY29tbWFuZC4gIEVhY2gga2V5d29yZCBpcyBmb2xsb3dlZCBieSBhbiBleHByZXNzaW9uIGluCi1wYXJlbnRoZXNlcyBwcm92aWRpbmcgdGhlIHZhbHVlIHRvIHN0b3JlIChAcHhyZWZ7RXhwcmVzc2lvbnN9KS4gIFRoZQotdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMgc3RvcmVkIGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb2NhdGlvbgotY291bnRlci4KLQotVGhlIEBjb2Rle0JZVEV9LCBAY29kZXtTSE9SVH0sIEBjb2Rle0xPTkd9LCBhbmQgQGNvZGV7UVVBRH0gY29tbWFuZHMKLXN0b3JlIG9uZSwgdHdvLCBmb3VyLCBhbmQgZWlnaHQgYnl0ZXMgKHJlc3BlY3RpdmVseSkuICBBZnRlciBzdG9yaW5nIHRoZQotYnl0ZXMsIHRoZSBsb2NhdGlvbiBjb3VudGVyIGlzIGluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMKLXN0b3JlZC4KLQotRm9yIGV4YW1wbGUsIHRoaXMgd2lsbCBzdG9yZSB0aGUgYnl0ZSAxIGZvbGxvd2VkIGJ5IHRoZSBmb3VyIGJ5dGUgdmFsdWUKLW9mIHRoZSBzeW1ib2wgQHNhbXB7YWRkcn06Ci1Ac21hbGxleGFtcGxlCi1CWVRFKDEpCi1MT05HKGFkZHIpCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1XaGVuIHVzaW5nIGEgNjQgYml0IGhvc3Qgb3IgdGFyZ2V0LCBAY29kZXtRVUFEfSBhbmQgQGNvZGV7U1FVQUR9IGFyZSB0aGUKLXNhbWU7IHRoZXkgYm90aCBzdG9yZSBhbiA4IGJ5dGUsIG9yIDY0IGJpdCwgdmFsdWUuICBXaGVuIGJvdGggaG9zdCBhbmQKLXRhcmdldCBhcmUgMzIgYml0cywgYW4gZXhwcmVzc2lvbiBpcyBjb21wdXRlZCBhcyAzMiBiaXRzLiAgSW4gdGhpcyBjYXNlCi1AY29kZXtRVUFEfSBzdG9yZXMgYSAzMiBiaXQgdmFsdWUgemVybyBleHRlbmRlZCB0byA2NCBiaXRzLCBhbmQKLUBjb2Rle1NRVUFEfSBzdG9yZXMgYSAzMiBiaXQgdmFsdWUgc2lnbiBleHRlbmRlZCB0byA2NCBiaXRzLgotCi1JZiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgZmlsZSBoYXMgYW4gZXhwbGljaXQgZW5kaWFubmVzcywKLXdoaWNoIGlzIHRoZSBub3JtYWwgY2FzZSwgdGhlIHZhbHVlIHdpbGwgYmUgc3RvcmVkIGluIHRoYXQgZW5kaWFubmVzcy4KLVdoZW4gdGhlIG9iamVjdCBmaWxlIGZvcm1hdCBkb2VzIG5vdCBoYXZlIGFuIGV4cGxpY2l0IGVuZGlhbm5lc3MsIGFzIGlzCi10cnVlIG9mLCBmb3IgZXhhbXBsZSwgUy1yZWNvcmRzLCB0aGUgdmFsdWUgd2lsbCBiZSBzdG9yZWQgaW4gdGhlCi1lbmRpYW5uZXNzIG9mIHRoZSBmaXJzdCBpbnB1dCBvYmplY3QgZmlsZS4KLQotQGtpbmRleCBGSUxMKEB2YXJ7ZXhwcmVzc2lvbn0pCi1AY2luZGV4IGhvbGVzLCBmaWxsaW5nCi1AY2luZGV4IHVuc3BlY2lmaWVkIG1lbW9yeQotWW91IG1heSB1c2UgdGhlIEBjb2Rle0ZJTEx9IGNvbW1hbmQgdG8gc2V0IHRoZSBmaWxsIHBhdHRlcm4gZm9yIHRoZQotY3VycmVudCBzZWN0aW9uLiAgSXQgaXMgZm9sbG93ZWQgYnkgYW4gZXhwcmVzc2lvbiBpbiBwYXJlbnRoZXNlcy4gIEFueQotb3RoZXJ3aXNlIHVuc3BlY2lmaWVkIHJlZ2lvbnMgb2YgbWVtb3J5IHdpdGhpbiB0aGUgc2VjdGlvbiAoZm9yIGV4YW1wbGUsCi1nYXBzIGxlZnQgZHVlIHRvIHRoZSByZXF1aXJlZCBhbGlnbm1lbnQgb2YgaW5wdXQgc2VjdGlvbnMpIGFyZSBmaWxsZWQKLXdpdGggdGhlIHR3byBsZWFzdCBzaWduaWZpY2FudCBieXRlcyBvZiB0aGUgZXhwcmVzc2lvbiwgcmVwZWF0ZWQgYXMKLW5lY2Vzc2FyeS4gIEEgQGNvZGV7RklMTH0gc3RhdGVtZW50IGNvdmVycyBtZW1vcnkgbG9jYXRpb25zIGFmdGVyIHRoZQotcG9pbnQgYXQgd2hpY2ggaXQgb2NjdXJzIGluIHRoZSBzZWN0aW9uIGRlZmluaXRpb247IGJ5IGluY2x1ZGluZyBtb3JlCi10aGFuIG9uZSBAY29kZXtGSUxMfSBzdGF0ZW1lbnQsIHlvdSBjYW4gaGF2ZSBkaWZmZXJlbnQgZmlsbCBwYXR0ZXJucyBpbgotZGlmZmVyZW50IHBhcnRzIG9mIGFuIG91dHB1dCBzZWN0aW9uLgotCi1UaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGZpbGwgdW5zcGVjaWZpZWQgcmVnaW9ucyBvZiBtZW1vcnkgd2l0aCB0aGUKLXZhbHVlIEBzYW1wezB4OTA5MH06Ci1Ac21hbGxleGFtcGxlCi1GSUxMKDB4OTA5MCkKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAY29kZXtGSUxMfSBjb21tYW5kIGlzIHNpbWlsYXIgdG8gdGhlIEBzYW1wez1AdmFye2ZpbGxleHB9fSBvdXRwdXQKLXNlY3Rpb24gYXR0cmlidXRlIChAcHhyZWZ7T3V0cHV0IFNlY3Rpb24gRmlsbH0pLCBidXQgaXQgb25seSBhZmZlY3RzIHRoZQotcGFydCBvZiB0aGUgc2VjdGlvbiBmb2xsb3dpbmcgdGhlIEBjb2Rle0ZJTEx9IGNvbW1hbmQsIHJhdGhlciB0aGFuIHRoZQotZW50aXJlIHNlY3Rpb24uICBJZiBib3RoIGFyZSB1c2VkLCB0aGUgQGNvZGV7RklMTH0gY29tbWFuZCB0YWtlcwotcHJlY2VkZW5jZS4KLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gS2V5d29yZHMKLUBzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIGtleXdvcmRzCi1UaGVyZSBhcmUgYSBjb3VwbGUgb2Yga2V5d29yZHMgd2hpY2ggY2FuIGFwcGVhciBhcyBvdXRwdXQgc2VjdGlvbgotY29tbWFuZHMuCi0KLUB0YWJsZSBAY29kZQotQGtpbmRleCBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKLUBjaW5kZXggaW5wdXQgZmlsZW5hbWUgc3ltYm9scwotQGNpbmRleCBmaWxlbmFtZSBzeW1ib2xzCi1AaXRlbSBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKLVRoZSBjb21tYW5kIHRlbGxzIHRoZSBsaW5rZXIgdG8gY3JlYXRlIGEgc3ltYm9sIGZvciBlYWNoIGlucHV0IGZpbGUuCi1UaGUgbmFtZSBvZiBlYWNoIHN5bWJvbCB3aWxsIGJlIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0Ci1maWxlLiAgVGhlIHNlY3Rpb24gb2YgZWFjaCBzeW1ib2wgd2lsbCBiZSB0aGUgb3V0cHV0IHNlY3Rpb24gaW4gd2hpY2gKLXRoZSBAY29kZXtDUkVBVEVfT0JKRUNUX1NZTUJPTFN9IGNvbW1hbmQgYXBwZWFycy4KLQotVGhpcyBpcyBjb252ZW50aW9uYWwgZm9yIHRoZSBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQuICBJdCBpcyBub3QKLW5vcm1hbGx5IHVzZWQgZm9yIGFueSBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXQuCi0KLUBraW5kZXggQ09OU1RSVUNUT1JTCi1AY2luZGV4IEMrKyBjb25zdHJ1Y3RvcnMsIGFycmFuZ2luZyBpbiBsaW5rCi1AY2luZGV4IGNvbnN0cnVjdG9ycywgYXJyYW5naW5nIGluIGxpbmsKLUBpdGVtIENPTlNUUlVDVE9SUwotV2hlbiBsaW5raW5nIHVzaW5nIHRoZSBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQsIHRoZSBsaW5rZXIgdXNlcyBhbgotdW51c3VhbCBzZXQgY29uc3RydWN0IHRvIHN1cHBvcnQgQysrIGdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kCi1kZXN0cnVjdG9ycy4gIFdoZW4gbGlua2luZyBvYmplY3QgZmlsZSBmb3JtYXRzIHdoaWNoIGRvIG5vdCBzdXBwb3J0Ci1hcmJpdHJhcnkgc2VjdGlvbnMsIHN1Y2ggYXMgRUNPRkYgYW5kIFhDT0ZGLCB0aGUgbGlua2VyIHdpbGwKLWF1dG9tYXRpY2FsbHkgcmVjb2duaXplIEMrKyBnbG9iYWwgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBieSBuYW1lLgotRm9yIHRoZXNlIG9iamVjdCBmaWxlIGZvcm1hdHMsIHRoZSBAY29kZXtDT05TVFJVQ1RPUlN9IGNvbW1hbmQgdGVsbHMgdGhlCi1saW5rZXIgdG8gcGxhY2UgY29uc3RydWN0b3IgaW5mb3JtYXRpb24gaW4gdGhlIG91dHB1dCBzZWN0aW9uIHdoZXJlIHRoZQotQGNvZGV7Q09OU1RSVUNUT1JTfSBjb21tYW5kIGFwcGVhcnMuICBUaGUgQGNvZGV7Q09OU1RSVUNUT1JTfSBjb21tYW5kIGlzCi1pZ25vcmVkIGZvciBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi1UaGUgc3ltYm9sIEB3e0Bjb2Rle19fQ1RPUl9MSVNUX199fSBtYXJrcyB0aGUgc3RhcnQgb2YgdGhlIGdsb2JhbAotY29uc3RydWN0b3JzLCBhbmQgdGhlIHN5bWJvbCBAd3tAY29kZXtfX0RUT1JfTElTVH19IG1hcmtzIHRoZSBlbmQuICBUaGUKLWZpcnN0IHdvcmQgaW4gdGhlIGxpc3QgaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzLCBmb2xsb3dlZCBieSB0aGUgYWRkcmVzcwotb2YgZWFjaCBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLCBmb2xsb3dlZCBieSBhIHplcm8gd29yZC4gIFRoZQotY29tcGlsZXIgbXVzdCBhcnJhbmdlIHRvIGFjdHVhbGx5IHJ1biB0aGUgY29kZS4gIEZvciB0aGVzZSBvYmplY3QgZmlsZQotZm9ybWF0cyBAc2N7Z251fSBDKysgbm9ybWFsbHkgY2FsbHMgY29uc3RydWN0b3JzIGZyb20gYSBzdWJyb3V0aW5lCi1AY29kZXtfX21haW59OyBhIGNhbGwgdG8gQGNvZGV7X19tYWlufSBpcyBhdXRvbWF0aWNhbGx5IGluc2VydGVkIGludG8KLXRoZSBzdGFydHVwIGNvZGUgZm9yIEBjb2Rle21haW59LiAgQHNje2dudX0gQysrIG5vcm1hbGx5IHJ1bnMKLWRlc3RydWN0b3JzIGVpdGhlciBieSB1c2luZyBAY29kZXthdGV4aXR9LCBvciBkaXJlY3RseSBmcm9tIHRoZSBmdW5jdGlvbgotQGNvZGV7ZXhpdH0uCi0KLUZvciBvYmplY3QgZmlsZSBmb3JtYXRzIHN1Y2ggYXMgQGNvZGV7Q09GRn0gb3IgQGNvZGV7RUxGfSB3aGljaCBzdXBwb3J0Ci1hcmJpdHJhcnkgc2VjdGlvbiBuYW1lcywgQHNje2dudX0gQysrIHdpbGwgbm9ybWFsbHkgYXJyYW5nZSB0byBwdXQgdGhlCi1hZGRyZXNzZXMgb2YgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgaW50byB0aGUgQGNvZGV7LmN0b3JzfQotYW5kIEBjb2Rley5kdG9yc30gc2VjdGlvbnMuICBQbGFjaW5nIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2UgaW50byB5b3VyCi1saW5rZXIgc2NyaXB0IHdpbGwgYnVpbGQgdGhlIHNvcnQgb2YgdGFibGUgd2hpY2ggdGhlIEBzY3tnbnV9IEMrKwotcnVudGltZSBjb2RlIGV4cGVjdHMgdG8gc2VlLgotCi1Ac21hbGxleGFtcGxlCi0gICAgICBfX0NUT1JfTElTVF9fID0gLjsKLSAgICAgIExPTkcoKF9fQ1RPUl9FTkRfXyAtIF9fQ1RPUl9MSVNUX18pIC8gNCAtIDIpCi0gICAgICAqKC5jdG9ycykKLSAgICAgIExPTkcoMCkKLSAgICAgIF9fQ1RPUl9FTkRfXyA9IC47Ci0gICAgICBfX0RUT1JfTElTVF9fID0gLjsKLSAgICAgIExPTkcoKF9fRFRPUl9FTkRfXyAtIF9fRFRPUl9MSVNUX18pIC8gNCAtIDIpCi0gICAgICAqKC5kdG9ycykKLSAgICAgIExPTkcoMCkKLSAgICAgIF9fRFRPUl9FTkRfXyA9IC47Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1JZiB5b3UgYXJlIHVzaW5nIHRoZSBAc2N7Z251fSBDKysgc3VwcG9ydCBmb3IgaW5pdGlhbGl6YXRpb24gcHJpb3JpdHksCi13aGljaCBwcm92aWRlcyBzb21lIGNvbnRyb2wgb3ZlciB0aGUgb3JkZXIgaW4gd2hpY2ggZ2xvYmFsIGNvbnN0cnVjdG9ycwotYXJlIHJ1biwgeW91IG11c3Qgc29ydCB0aGUgY29uc3RydWN0b3JzIGF0IGxpbmsgdGltZSB0byBlbnN1cmUgdGhhdCB0aGV5Ci1hcmUgZXhlY3V0ZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuICBXaGVuIHVzaW5nIHRoZSBAY29kZXtDT05TVFJVQ1RPUlN9Ci1jb21tYW5kLCB1c2UgQHNhbXB7U09SVChDT05TVFJVQ1RPUlMpfSBpbnN0ZWFkLiAgV2hlbiB1c2luZyB0aGUKLUBjb2Rley5jdG9yc30gYW5kIEBjb2Rley5kdG9yc30gc2VjdGlvbnMsIHVzZSBAc2FtcHsqKFNPUlQoLmN0b3JzKSl9IGFuZAotQHNhbXB7KihTT1JUKC5kdG9ycykpfSBpbnN0ZWFkIG9mIGp1c3QgQHNhbXB7KiguY3RvcnMpfSBhbmQKLUBzYW1weyooLmR0b3JzKX0uCi0KLU5vcm1hbGx5IHRoZSBjb21waWxlciBhbmQgbGlua2VyIHdpbGwgaGFuZGxlIHRoZXNlIGlzc3VlcyBhdXRvbWF0aWNhbGx5LAotYW5kIHlvdSB3aWxsIG5vdCBuZWVkIHRvIGNvbmNlcm4geW91cnNlbGYgd2l0aCB0aGVtLiAgSG93ZXZlciwgeW91IG1heQotbmVlZCB0byBjb25zaWRlciB0aGlzIGlmIHlvdSBhcmUgdXNpbmcgQysrIGFuZCB3cml0aW5nIHlvdXIgb3duIGxpbmtlcgotc2NyaXB0cy4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBEaXNjYXJkaW5nCi1Ac3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBkaXNjYXJkaW5nCi1AY2luZGV4IGRpc2NhcmRpbmcgc2VjdGlvbnMKLUBjaW5kZXggc2VjdGlvbnMsIGRpc2NhcmRpbmcKLUBjaW5kZXggcmVtb3Zpbmcgc2VjdGlvbnMKLVRoZSBsaW5rZXIgd2lsbCBub3QgY3JlYXRlIG91dHB1dCBzZWN0aW9uIHdoaWNoIGRvIG5vdCBoYXZlIGFueQotY29udGVudHMuICBUaGlzIGlzIGZvciBjb252ZW5pZW5jZSB3aGVuIHJlZmVycmluZyB0byBpbnB1dCBzZWN0aW9ucyB0aGF0Ci1tYXkgb3IgbWF5IG5vdCBiZSBwcmVzZW50IGluIGFueSBvZiB0aGUgaW5wdXQgZmlsZXMuICBGb3IgZXhhbXBsZToKLUBzbWFsbGV4YW1wbGUKLS5mb28gQHsgKiguZm9vKSBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotd2lsbCBvbmx5IGNyZWF0ZSBhIEBzYW1wey5mb299IHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlIGlmIHRoZXJlIGlzIGEKLUBzYW1wey5mb299IHNlY3Rpb24gaW4gYXQgbGVhc3Qgb25lIGlucHV0IGZpbGUuCi0KLUlmIHlvdSB1c2UgYW55dGhpbmcgb3RoZXIgdGhhbiBhbiBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uIGFzIGFuIG91dHB1dAotc2VjdGlvbiBjb21tYW5kLCBzdWNoIGFzIGEgc3ltYm9sIGFzc2lnbm1lbnQsIHRoZW4gdGhlIG91dHB1dCBzZWN0aW9uCi13aWxsIGFsd2F5cyBiZSBjcmVhdGVkLCBldmVuIGlmIHRoZXJlIGFyZSBubyBtYXRjaGluZyBpbnB1dCBzZWN0aW9ucy4KLQotQGNpbmRleCAvRElTQ0FSRC8KLVRoZSBzcGVjaWFsIG91dHB1dCBzZWN0aW9uIG5hbWUgQHNhbXB7L0RJU0NBUkQvfSBtYXkgYmUgdXNlZCB0byBkaXNjYXJkCi1pbnB1dCBzZWN0aW9ucy4gIEFueSBpbnB1dCBzZWN0aW9ucyB3aGljaCBhcmUgYXNzaWduZWQgdG8gYW4gb3V0cHV0Ci1zZWN0aW9uIG5hbWVkIEBzYW1wey9ESVNDQVJEL30gYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIEF0dHJpYnV0ZXMKLUBzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIGF0dHJpYnV0ZXMKLUBjaW5kZXggb3V0cHV0IHNlY3Rpb24gYXR0cmlidXRlcwotV2Ugc2hvd2VkIGFib3ZlIHRoYXQgdGhlIGZ1bGwgZGVzY3JpcHRpb24gb2YgYW4gb3V0cHV0IHNlY3Rpb24gbG9va2VkCi1saWtlIHRoaXM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAgCi1AdmFye3NlY3Rpb259IFtAdmFye2FkZHJlc3N9XSBbKEB2YXJ7dHlwZX0pXSA6IFtBVChAdmFye2xtYX0pXQotICBAewotICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KLSAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgQGRvdHN7fQotICBAfSBbPkB2YXJ7cmVnaW9ufV0gWzpAdmFye3BoZHJ9IDpAdmFye3BoZHJ9IEBkb3Rze31dIFs9QHZhcntmaWxsZXhwfV0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi1XZSd2ZSBhbHJlYWR5IGRlc2NyaWJlZCBAdmFye3NlY3Rpb259LCBAdmFye2FkZHJlc3N9LCBhbmQKLUB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0uICBJbiB0aGlzIHNlY3Rpb24gd2Ugd2lsbCBkZXNjcmliZSB0aGUKLXJlbWFpbmluZyBzZWN0aW9uIGF0dHJpYnV0ZXMuCi0KLUBtZW51IAotKiBPdXRwdXQgU2VjdGlvbiBUeXBlOjoJCU91dHB1dCBzZWN0aW9uIHR5cGUKLSogT3V0cHV0IFNlY3Rpb24gTE1BOjoJCU91dHB1dCBzZWN0aW9uIExNQQotKiBPdXRwdXQgU2VjdGlvbiBSZWdpb246OglPdXRwdXQgc2VjdGlvbiByZWdpb24KLSogT3V0cHV0IFNlY3Rpb24gUGhkcjo6CQlPdXRwdXQgc2VjdGlvbiBwaGRyCi0qIE91dHB1dCBTZWN0aW9uIEZpbGw6OgkJT3V0cHV0IHNlY3Rpb24gZmlsbAotQGVuZCBtZW51Ci0KLUBub2RlIE91dHB1dCBTZWN0aW9uIFR5cGUKLUBzdWJzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIHR5cGUKLUVhY2ggb3V0cHV0IHNlY3Rpb24gbWF5IGhhdmUgYSB0eXBlLiAgVGhlIHR5cGUgaXMgYSBrZXl3b3JkIGluCi1wYXJlbnRoZXNlcy4gIFRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIGRlZmluZWQ6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gTk9MT0FECi1UaGUgc2VjdGlvbiBzaG91bGQgYmUgbWFya2VkIGFzIG5vdCBsb2FkYWJsZSwgc28gdGhhdCBpdCB3aWxsIG5vdCBiZQotbG9hZGVkIGludG8gbWVtb3J5IHdoZW4gdGhlIHByb2dyYW0gaXMgcnVuLgotQGl0ZW0gRFNFQ1QKLUBpdGVteCBDT1BZCi1AaXRlbXggSU5GTwotQGl0ZW14IE9WRVJMQVkKLVRoZXNlIHR5cGUgbmFtZXMgYXJlIHN1cHBvcnRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgYW5kIGFyZQotcmFyZWx5IHVzZWQuICBUaGV5IGFsbCBoYXZlIHRoZSBzYW1lIGVmZmVjdDogdGhlIHNlY3Rpb24gc2hvdWxkIGJlCi1tYXJrZWQgYXMgbm90IGFsbG9jYXRhYmxlLCBzbyB0aGF0IG5vIG1lbW9yeSBpcyBhbGxvY2F0ZWQgZm9yIHRoZQotc2VjdGlvbiB3aGVuIHRoZSBwcm9ncmFtIGlzIHJ1bi4KLUBlbmQgdGFibGUKLQotQGtpbmRleCBOT0xPQUQKLUBjaW5kZXggcHJldmVudCB1bm5lY2Vzc2FyeSBsb2FkaW5nCi1AY2luZGV4IGxvYWRpbmcsIHByZXZlbnRpbmcKLVRoZSBsaW5rZXIgbm9ybWFsbHkgc2V0cyB0aGUgYXR0cmlidXRlcyBvZiBhbiBvdXRwdXQgc2VjdGlvbiBiYXNlZCBvbgotdGhlIGlucHV0IHNlY3Rpb25zIHdoaWNoIG1hcCBpbnRvIGl0LiAgWW91IGNhbiBvdmVycmlkZSB0aGlzIGJ5IHVzaW5nCi10aGUgc2VjdGlvbiB0eXBlLiAgRm9yIGV4YW1wbGUsIGluIHRoZSBzY3JpcHQgc2FtcGxlIGJlbG93LCB0aGUKLUBzYW1we1JPTX0gc2VjdGlvbiBpcyBhZGRyZXNzZWQgYXQgbWVtb3J5IGxvY2F0aW9uIEBzYW1wezB9IGFuZCBkb2VzIG5vdAotbmVlZCB0byBiZSBsb2FkZWQgd2hlbiB0aGUgcHJvZ3JhbSBpcyBydW4uICBUaGUgY29udGVudHMgb2YgdGhlCi1Ac2FtcHtST019IHNlY3Rpb24gd2lsbCBhcHBlYXIgaW4gdGhlIGxpbmtlciBvdXRwdXQgZmlsZSBhcyB1c3VhbC4KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMgQHsKLSAgUk9NIDAgKE5PTE9BRCkgOiBAeyBAZG90c3t9IEB9Ci0gIEBkb3Rze30KLUB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBMTUEKLUBzdWJzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIExNQQotQGtpbmRleCBBVChAdmFye2xtYX0pCi1AY2luZGV4IGxvYWQgYWRkcmVzcwotQGNpbmRleCBzZWN0aW9uIGxvYWQgYWRkcmVzcwotRXZlcnkgc2VjdGlvbiBoYXMgYSB2aXJ0dWFsIGFkZHJlc3MgKFZNQSkgYW5kIGEgbG9hZCBhZGRyZXNzIChMTUEpOyBzZWUKLUByZWZ7QmFzaWMgU2NyaXB0IENvbmNlcHRzfS4gIFRoZSBhZGRyZXNzIGV4cHJlc3Npb24gd2hpY2ggbWF5IGFwcGVhciBpbgotYW4gb3V0cHV0IHNlY3Rpb24gZGVzY3JpcHRpb24gc2V0cyB0aGUgVk1BIChAcHhyZWZ7T3V0cHV0IFNlY3Rpb24KLUFkZHJlc3N9KS4KLQotVGhlIGxpbmtlciB3aWxsIG5vcm1hbGx5IHNldCB0aGUgTE1BIGVxdWFsIHRvIHRoZSBWTUEuICBZb3UgY2FuIGNoYW5nZQotdGhhdCBieSB1c2luZyB0aGUgQGNvZGV7QVR9IGtleXdvcmQuICBUaGUgZXhwcmVzc2lvbiBAdmFye2xtYX0gdGhhdAotZm9sbG93cyB0aGUgQGNvZGV7QVR9IGtleXdvcmQgc3BlY2lmaWVzIHRoZSBsb2FkIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24uCi0KLUBjaW5kZXggUk9NIGluaXRpYWxpemVkIGRhdGEKLUBjaW5kZXggaW5pdGlhbGl6ZWQgZGF0YSBpbiBST00KLVRoaXMgZmVhdHVyZSBpcyBkZXNpZ25lZCB0byBtYWtlIGl0IGVhc3kgdG8gYnVpbGQgYSBST00gaW1hZ2UuICBGb3IKLWV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgbGlua2VyIHNjcmlwdCBjcmVhdGVzIHRocmVlIG91dHB1dCBzZWN0aW9uczogb25lCi1jYWxsZWQgQHNhbXB7LnRleHR9LCB3aGljaCBzdGFydHMgYXQgQGNvZGV7MHgxMDAwfSwgb25lIGNhbGxlZAotQHNhbXB7Lm1kYXRhfSwgd2hpY2ggaXMgbG9hZGVkIGF0IHRoZSBlbmQgb2YgdGhlIEBzYW1wey50ZXh0fSBzZWN0aW9uCi1ldmVuIHRob3VnaCBpdHMgVk1BIGlzIEBjb2RlezB4MjAwMH0sIGFuZCBvbmUgY2FsbGVkIEBzYW1wey5ic3N9IHRvIGhvbGQKLXVuaW5pdGlhbGl6ZWQgZGF0YSBhdCBhZGRyZXNzIEBjb2RlezB4MzAwMH0uICBUaGUgc3ltYm9sIEBjb2Rle19kYXRhfSBpcwotZGVmaW5lZCB3aXRoIHRoZSB2YWx1ZSBAY29kZXsweDIwMDB9LCB3aGljaCBzaG93cyB0aGF0IHRoZSBsb2NhdGlvbgotY291bnRlciBob2xkcyB0aGUgVk1BIHZhbHVlLCBub3QgdGhlIExNQSB2YWx1ZS4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1TRUNUSU9OUwotICBAewotICAudGV4dCAweDEwMDAgOiBAeyAqKC50ZXh0KSBfZXRleHQgPSAuIDsgQH0KLSAgLm1kYXRhIDB4MjAwMCA6IAotICAgIEFUICggQUREUiAoLnRleHQpICsgU0laRU9GICgudGV4dCkgKQotICAgIEB7IF9kYXRhID0gLiA7ICooLmRhdGEpOyBfZWRhdGEgPSAuIDsgIEB9Ci0gIC5ic3MgMHgzMDAwIDoKLSAgICBAeyBfYnN0YXJ0ID0gLiA7ICAqKC5ic3MpICooQ09NTU9OKSA7IF9iZW5kID0gLiA7QH0KLUB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgcnVuLXRpbWUgaW5pdGlhbGl6YXRpb24gY29kZSBmb3IgdXNlIHdpdGggYSBwcm9ncmFtIGdlbmVyYXRlZCB3aXRoCi10aGlzIGxpbmtlciBzY3JpcHQgd291bGQgaW5jbHVkZSBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nLCB0byBjb3B5Ci10aGUgaW5pdGlhbGl6ZWQgZGF0YSBmcm9tIHRoZSBST00gaW1hZ2UgdG8gaXRzIHJ1bnRpbWUgYWRkcmVzcy4gIE5vdGljZQotaG93IHRoaXMgY29kZSB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIHN5bWJvbHMgZGVmaW5lZCBieSB0aGUgbGlua2VyCi1zY3JpcHQuCi0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotZXh0ZXJuIGNoYXIgX2V0ZXh0LCBfZGF0YSwgX2VkYXRhLCBfYnN0YXJ0LCBfYmVuZDsKLWNoYXIgKnNyYyA9ICZfZXRleHQ7Ci1jaGFyICpkc3QgPSAmX2RhdGE7Ci0KLS8qIFJPTSBoYXMgZGF0YSBhdCBlbmQgb2YgdGV4dDsgY29weSBpdC4gKi8KLXdoaWxlIChkc3QgPCAmX2VkYXRhKSBAewotICAqZHN0KysgPSAqc3JjKys7Ci1AfQotCi0vKiBaZXJvIGJzcyAqLwotZm9yIChkc3QgPSAmX2JzdGFydDsgZHN0PCAmX2JlbmQ7IGRzdCsrKQotICAqZHN0ID0gMDsKLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIFJlZ2lvbgotQHN1YnN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gcmVnaW9uCi1Aa2luZGV4ID5AdmFye3JlZ2lvbn0KLUBjaW5kZXggc2VjdGlvbiwgYXNzaWduaW5nIHRvIG1lbW9yeSByZWdpb24KLUBjaW5kZXggbWVtb3J5IHJlZ2lvbnMgYW5kIHNlY3Rpb25zCi1Zb3UgY2FuIGFzc2lnbiBhIHNlY3Rpb24gdG8gYSBwcmV2aW91c2x5IGRlZmluZWQgcmVnaW9uIG9mIG1lbW9yeSBieQotdXNpbmcgQHNhbXB7PkB2YXJ7cmVnaW9ufX0uICBAeHJlZntNRU1PUll9LgotCi1IZXJlIGlzIGEgc2ltcGxlIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLU1FTU9SWSBAeyByb20gOiBPUklHSU4gPSAweDEwMDAsIExFTkdUSCA9IDB4MTAwMCBAfQotU0VDVElPTlMgQHsgUk9NIDogQHsgKigudGV4dCkgQH0gPnJvbSBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gUGhkcgotQHN1YnN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gcGhkcgotQGtpbmRleCA6QHZhcntwaGRyfQotQGNpbmRleCBzZWN0aW9uLCBhc3NpZ25pbmcgdG8gcHJvZ3JhbSBoZWFkZXIKLUBjaW5kZXggcHJvZ3JhbSBoZWFkZXJzIGFuZCBzZWN0aW9ucwotWW91IGNhbiBhc3NpZ24gYSBzZWN0aW9uIHRvIGEgcHJldmlvdXNseSBkZWZpbmVkIHByb2dyYW0gc2VnbWVudCBieQotdXNpbmcgQHNhbXB7OkB2YXJ7cGhkcn19LiAgQHhyZWZ7UEhEUlN9LiAgSWYgYSBzZWN0aW9uIGlzIGFzc2lnbmVkIHRvCi1vbmUgb3IgbW9yZSBzZWdtZW50cywgdGhlbiBhbGwgc3Vic2VxdWVudCBhbGxvY2F0ZWQgc2VjdGlvbnMgd2lsbCBiZQotYXNzaWduZWQgdG8gdGhvc2Ugc2VnbWVudHMgYXMgd2VsbCwgdW5sZXNzIHRoZXkgdXNlIGFuIGV4cGxpY2l0bHkKLUBjb2RlezpAdmFye3BoZHJ9fSBtb2RpZmllci4gIFlvdSBjYW4gdXNlIEBjb2RlezpOT05FfSB0byB0ZWxsIHRoZQotbGlua2VyIHRvIG5vdCBwdXQgdGhlIHNlY3Rpb24gaW4gYW55IHNlZ21lbnQgYXQgYWxsLgotCi1IZXJlIGlzIGEgc2ltcGxlIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVBIRFJTIEB7IHRleHQgUFRfTE9BRCA7IEB9Ci1TRUNUSU9OUyBAeyAudGV4dCA6IEB7ICooLnRleHQpIEB9IDp0ZXh0IEB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBGaWxsCi1Ac3Vic3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBmaWxsCi1Aa2luZGV4ID1AdmFye2ZpbGxleHB9Ci1AY2luZGV4IHNlY3Rpb24gZmlsbCBwYXR0ZXJuCi1AY2luZGV4IGZpbGwgcGF0dGVybiwgZW50aXJlIHNlY3Rpb24KLVlvdSBjYW4gc2V0IHRoZSBmaWxsIHBhdHRlcm4gZm9yIGFuIGVudGlyZSBzZWN0aW9uIGJ5IHVzaW5nCi1Ac2FtcHs9QHZhcntmaWxsZXhwfX0uICBAdmFye2ZpbGxleHB9IGlzIGFuIGV4cHJlc3Npb24KLShAcHhyZWZ7RXhwcmVzc2lvbnN9KS4gIEFueSBvdGhlcndpc2UgdW5zcGVjaWZpZWQgcmVnaW9ucyBvZiBtZW1vcnkKLXdpdGhpbiB0aGUgb3V0cHV0IHNlY3Rpb24gKGZvciBleGFtcGxlLCBnYXBzIGxlZnQgZHVlIHRvIHRoZSByZXF1aXJlZAotYWxpZ25tZW50IG9mIGlucHV0IHNlY3Rpb25zKSB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSB0d28gbGVhc3QKLXNpZ25pZmljYW50IGJ5dGVzIG9mIHRoZSB2YWx1ZSwgcmVwZWF0ZWQgYXMgbmVjZXNzYXJ5LgotCi1Zb3UgY2FuIGFsc28gY2hhbmdlIHRoZSBmaWxsIHZhbHVlIHdpdGggYSBAY29kZXtGSUxMfSBjb21tYW5kIGluIHRoZQotb3V0cHV0IHNlY3Rpb24gY29tbWFuZHM7IHNlZSBAcmVme091dHB1dCBTZWN0aW9uIERhdGF9LgotCi1IZXJlIGlzIGEgc2ltcGxlIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TIEB7IC50ZXh0IDogQHsgKigudGV4dCkgQH0gPTB4OTA5MCBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgT3ZlcmxheSBEZXNjcmlwdGlvbgotQHN1YnNlY3Rpb24gT3ZlcmxheSBkZXNjcmlwdGlvbgotQGtpbmRleCBPVkVSTEFZCi1AY2luZGV4IG92ZXJsYXlzCi1BbiBvdmVybGF5IGRlc2NyaXB0aW9uIHByb3ZpZGVzIGFuIGVhc3kgd2F5IHRvIGRlc2NyaWJlIHNlY3Rpb25zIHdoaWNoCi1hcmUgdG8gYmUgbG9hZGVkIGFzIHBhcnQgb2YgYSBzaW5nbGUgbWVtb3J5IGltYWdlIGJ1dCBhcmUgdG8gYmUgcnVuIGF0Ci10aGUgc2FtZSBtZW1vcnkgYWRkcmVzcy4gIEF0IHJ1biB0aW1lLCBzb21lIHNvcnQgb2Ygb3ZlcmxheSBtYW5hZ2VyIHdpbGwKLWNvcHkgdGhlIG92ZXJsYWlkIHNlY3Rpb25zIGluIGFuZCBvdXQgb2YgdGhlIHJ1bnRpbWUgbWVtb3J5IGFkZHJlc3MgYXMKLXJlcXVpcmVkLCBwZXJoYXBzIGJ5IHNpbXBseSBtYW5pcHVsYXRpbmcgYWRkcmVzc2luZyBiaXRzLiAgVGhpcyBhcHByb2FjaAotY2FuIGJlIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIHdoZW4gYSBjZXJ0YWluIHJlZ2lvbiBvZiBtZW1vcnkgaXMgZmFzdGVyCi10aGFuIGFub3RoZXIuCi0KLU92ZXJsYXlzIGFyZSBkZXNjcmliZWQgdXNpbmcgdGhlIEBjb2Rle09WRVJMQVl9IGNvbW1hbmQuICBUaGUKLUBjb2Rle09WRVJMQVl9IGNvbW1hbmQgaXMgdXNlZCB3aXRoaW4gYSBAY29kZXtTRUNUSU9OU30gY29tbWFuZCwgbGlrZSBhbgotb3V0cHV0IHNlY3Rpb24gZGVzY3JpcHRpb24uICBUaGUgZnVsbCBzeW50YXggb2YgdGhlIEBjb2Rle09WRVJMQVl9Ci1jb21tYW5kIGlzIGFzIGZvbGxvd3M6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLU9WRVJMQVkgW0B2YXJ7c3RhcnR9XSA6IFtOT0NST1NTUkVGU10gW0FUICggQHZhcntsZGFkZHJ9ICldCi0gIEB7Ci0gICAgQHZhcntzZWNuYW1lMX0KLSAgICAgIEB7Ci0gICAgICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KLSAgICAgICAgQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfQotICAgICAgICBAZG90c3t9Ci0gICAgICBAfSBbOkB2YXJ7cGhkcn1AZG90c3t9XSBbPUB2YXJ7ZmlsbH1dCi0gICAgQHZhcntzZWNuYW1lMn0KLSAgICAgIEB7Ci0gICAgICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KLSAgICAgICAgQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfQotICAgICAgICBAZG90c3t9Ci0gICAgICBAfSBbOkB2YXJ7cGhkcn1AZG90c3t9XSBbPUB2YXJ7ZmlsbH1dCi0gICAgQGRvdHN7fQotICBAfSBbPkB2YXJ7cmVnaW9ufV0gWzpAdmFye3BoZHJ9QGRvdHN7fV0gWz1AdmFye2ZpbGx9XQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotRXZlcnl0aGluZyBpcyBvcHRpb25hbCBleGNlcHQgQGNvZGV7T1ZFUkxBWX0gKGEga2V5d29yZCksIGFuZCBlYWNoCi1zZWN0aW9uIG11c3QgaGF2ZSBhIG5hbWUgKEB2YXJ7c2VjbmFtZTF9IGFuZCBAdmFye3NlY25hbWUyfSBhYm92ZSkuICBUaGUKLXNlY3Rpb24gZGVmaW5pdGlvbnMgd2l0aGluIHRoZSBAY29kZXtPVkVSTEFZfSBjb25zdHJ1Y3QgYXJlIGlkZW50aWNhbCB0bwotdGhvc2Ugd2l0aGluIHRoZSBnZW5lcmFsIEBjb2Rle1NFQ1RJT05TfSBjb250cnVjdCAoQHB4cmVme1NFQ1RJT05TfSksCi1leGNlcHQgdGhhdCBubyBhZGRyZXNzZXMgYW5kIG5vIG1lbW9yeSByZWdpb25zIG1heSBiZSBkZWZpbmVkIGZvcgotc2VjdGlvbnMgd2l0aGluIGFuIEBjb2Rle09WRVJMQVl9LgotCi1UaGUgc2VjdGlvbnMgYXJlIGFsbCBkZWZpbmVkIHdpdGggdGhlIHNhbWUgc3RhcnRpbmcgYWRkcmVzcy4gIFRoZSBsb2FkCi1hZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zIGFyZSBhcnJhbmdlZCBzdWNoIHRoYXQgdGhleSBhcmUgY29uc2VjdXRpdmUgaW4KLW1lbW9yeSBzdGFydGluZyBhdCB0aGUgbG9hZCBhZGRyZXNzIHVzZWQgZm9yIHRoZSBAY29kZXtPVkVSTEFZfSBhcyBhCi13aG9sZSAoYXMgd2l0aCBub3JtYWwgc2VjdGlvbiBkZWZpbml0aW9ucywgdGhlIGxvYWQgYWRkcmVzcyBpcyBvcHRpb25hbCwKLWFuZCBkZWZhdWx0cyB0byB0aGUgc3RhcnQgYWRkcmVzczsgdGhlIHN0YXJ0IGFkZHJlc3MgaXMgYWxzbyBvcHRpb25hbCwKLWFuZCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gY291bnRlcikuCi0KLUlmIHRoZSBAY29kZXtOT0NST1NTUkVGU30ga2V5d29yZCBpcyB1c2VkLCBhbmQgdGhlcmUgYW55IHJlZmVyZW5jZXMKLWFtb25nIHRoZSBzZWN0aW9ucywgdGhlIGxpbmtlciB3aWxsIHJlcG9ydCBhbiBlcnJvci4gIFNpbmNlIHRoZSBzZWN0aW9ucwotYWxsIHJ1biBhdCB0aGUgc2FtZSBhZGRyZXNzLCBpdCBub3JtYWxseSBkb2VzIG5vdCBtYWtlIHNlbnNlIGZvciBvbmUKLXNlY3Rpb24gdG8gcmVmZXIgZGlyZWN0bHkgdG8gYW5vdGhlci4gIEB4cmVme01pc2NlbGxhbmVvdXMgQ29tbWFuZHMsCi1OT0NST1NTUkVGU30uCi0KLUZvciBlYWNoIHNlY3Rpb24gd2l0aGluIHRoZSBAY29kZXtPVkVSTEFZfSwgdGhlIGxpbmtlciBhdXRvbWF0aWNhbGx5Ci1kZWZpbmVzIHR3byBzeW1ib2xzLiAgVGhlIHN5bWJvbCBAY29kZXtfX2xvYWRfc3RhcnRfQHZhcntzZWNuYW1lfX0gaXMKLWRlZmluZWQgYXMgdGhlIHN0YXJ0aW5nIGxvYWQgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbi4gIFRoZSBzeW1ib2wKLUBjb2Rle19fbG9hZF9zdG9wX0B2YXJ7c2VjbmFtZX19IGlzIGRlZmluZWQgYXMgdGhlIGZpbmFsIGxvYWQgYWRkcmVzcyBvZgotdGhlIHNlY3Rpb24uICBBbnkgY2hhcmFjdGVycyB3aXRoaW4gQHZhcntzZWNuYW1lfSB3aGljaCBhcmUgbm90IGxlZ2FsCi13aXRoaW4gQyBpZGVudGlmaWVycyBhcmUgcmVtb3ZlZC4gIEMgKG9yIGFzc2VtYmxlcikgY29kZSBtYXkgdXNlIHRoZXNlCi1zeW1ib2xzIHRvIG1vdmUgdGhlIG92ZXJsYWlkIHNlY3Rpb25zIGFyb3VuZCBhcyBuZWNlc3NhcnkuCi0KLUF0IHRoZSBlbmQgb2YgdGhlIG92ZXJsYXksIHRoZSB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gY291bnRlciBpcyBzZXQgdG8KLXRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBvdmVybGF5IHBsdXMgdGhlIHNpemUgb2YgdGhlIGxhcmdlc3Qgc2VjdGlvbi4KLQotSGVyZSBpcyBhbiBleGFtcGxlLiAgUmVtZW1iZXIgdGhhdCB0aGlzIHdvdWxkIGFwcGVhciBpbnNpZGUgYQotQGNvZGV7U0VDVElPTlN9IGNvbnN0cnVjdC4KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotICBPVkVSTEFZIDB4MTAwMCA6IEFUICgweDQwMDApCi0gICBAewotICAgICAudGV4dDAgQHsgbzEvKi5vKC50ZXh0KSBAfQotICAgICAudGV4dDEgQHsgbzIvKi5vKC50ZXh0KSBAfQotICAgQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLVRoaXMgd2lsbCBkZWZpbmUgYm90aCBAc2FtcHsudGV4dDB9IGFuZCBAc2FtcHsudGV4dDF9IHRvIHN0YXJ0IGF0Ci1hZGRyZXNzIDB4MTAwMC4gIEBzYW1wey50ZXh0MH0gd2lsbCBiZSBsb2FkZWQgYXQgYWRkcmVzcyAweDQwMDAsIGFuZAotQHNhbXB7LnRleHQxfSB3aWxsIGJlIGxvYWRlZCBpbW1lZGlhdGVseSBhZnRlciBAc2FtcHsudGV4dDB9LiAgVGhlCi1mb2xsb3dpbmcgc3ltYm9scyB3aWxsIGJlIGRlZmluZWQ6IEBjb2Rle19fbG9hZF9zdGFydF90ZXh0MH0sCi1AY29kZXtfX2xvYWRfc3RvcF90ZXh0MH0sIEBjb2Rle19fbG9hZF9zdGFydF90ZXh0MX0sCi1AY29kZXtfX2xvYWRfc3RvcF90ZXh0MX0uCi0KLUMgY29kZSB0byBjb3B5IG92ZXJsYXkgQGNvZGV7LnRleHQxfSBpbnRvIHRoZSBvdmVybGF5IGFyZWEgbWlnaHQgbG9vawotbGlrZSB0aGUgZm9sbG93aW5nLgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLSAgZXh0ZXJuIGNoYXIgX19sb2FkX3N0YXJ0X3RleHQxLCBfX2xvYWRfc3RvcF90ZXh0MTsKLSAgbWVtY3B5ICgoY2hhciAqKSAweDEwMDAsICZfX2xvYWRfc3RhcnRfdGV4dDEsCi0gICAgICAgICAgJl9fbG9hZF9zdG9wX3RleHQxIC0gJl9fbG9hZF9zdGFydF90ZXh0MSk7Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Ob3RlIHRoYXQgdGhlIEBjb2Rle09WRVJMQVl9IGNvbW1hbmQgaXMganVzdCBzeW50YWN0aWMgc3VnYXIsIHNpbmNlCi1ldmVyeXRoaW5nIGl0IGRvZXMgY2FuIGJlIGRvbmUgdXNpbmcgdGhlIG1vcmUgYmFzaWMgY29tbWFuZHMuICBUaGUgYWJvdmUKLWV4YW1wbGUgY291bGQgaGF2ZSBiZWVuIHdyaXR0ZW4gaWRlbnRpY2FsbHkgYXMgZm9sbG93cy4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi0gIC50ZXh0MCAweDEwMDAgOiBBVCAoMHg0MDAwKSBAeyBvMS8qLm8oLnRleHQpIEB9Ci0gIF9fbG9hZF9zdGFydF90ZXh0MCA9IExPQURBRERSICgudGV4dDApOwotICBfX2xvYWRfc3RvcF90ZXh0MCA9IExPQURBRERSICgudGV4dDApICsgU0laRU9GICgudGV4dDApOwotICAudGV4dDEgMHgxMDAwIDogQVQgKDB4NDAwMCArIFNJWkVPRiAoLnRleHQwKSkgQHsgbzIvKi5vKC50ZXh0KSBAfQotICBfX2xvYWRfc3RhcnRfdGV4dDEgPSBMT0FEQUREUiAoLnRleHQxKTsKLSAgX19sb2FkX3N0b3BfdGV4dDEgPSBMT0FEQUREUiAoLnRleHQxKSArIFNJWkVPRiAoLnRleHQxKTsKLSAgLiA9IDB4MTAwMCArIE1BWCAoU0laRU9GICgudGV4dDApLCBTSVpFT0YgKC50ZXh0MSkpOwotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgTUVNT1JZCi1Ac2VjdGlvbiBNRU1PUlkgY29tbWFuZAotQGtpbmRleCBNRU1PUlkKLUBjaW5kZXggbWVtb3J5IHJlZ2lvbnMKLUBjaW5kZXggcmVnaW9ucyBvZiBtZW1vcnkKLUBjaW5kZXggYWxsb2NhdGluZyBtZW1vcnkKLUBjaW5kZXggZGlzY29udGludW91cyBtZW1vcnkKLVRoZSBsaW5rZXIncyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcGVybWl0cyBhbGxvY2F0aW9uIG9mIGFsbCBhdmFpbGFibGUKLW1lbW9yeS4gIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBieSB1c2luZyB0aGUgQGNvZGV7TUVNT1JZfSBjb21tYW5kLgotCi1UaGUgQGNvZGV7TUVNT1JZfSBjb21tYW5kIGRlc2NyaWJlcyB0aGUgbG9jYXRpb24gYW5kIHNpemUgb2YgYmxvY2tzIG9mCi1tZW1vcnkgaW4gdGhlIHRhcmdldC4gIFlvdSBjYW4gdXNlIGl0IHRvIGRlc2NyaWJlIHdoaWNoIG1lbW9yeSByZWdpb25zCi1tYXkgYmUgdXNlZCBieSB0aGUgbGlua2VyLCBhbmQgd2hpY2ggbWVtb3J5IHJlZ2lvbnMgaXQgbXVzdCBhdm9pZC4gIFlvdQotY2FuIHRoZW4gYXNzaWduIHNlY3Rpb25zIHRvIHBhcnRpY3VsYXIgbWVtb3J5IHJlZ2lvbnMuICBUaGUgbGlua2VyIHdpbGwKLXNldCBzZWN0aW9uIGFkZHJlc3NlcyBiYXNlZCBvbiB0aGUgbWVtb3J5IHJlZ2lvbnMsIGFuZCB3aWxsIHdhcm4gYWJvdXQKLXJlZ2lvbnMgdGhhdCBiZWNvbWUgdG9vIGZ1bGwuICBUaGUgbGlua2VyIHdpbGwgbm90IHNodWZmbGUgc2VjdGlvbnMKLWFyb3VuZCB0byBmaXQgaW50byB0aGUgYXZhaWxhYmxlIHJlZ2lvbnMuCi0KLUEgbGlua2VyIHNjcmlwdCBtYXkgY29udGFpbiBhdCBtb3N0IG9uZSB1c2Ugb2YgdGhlIEBjb2Rle01FTU9SWX0KLWNvbW1hbmQuICBIb3dldmVyLCB5b3UgY2FuIGRlZmluZSBhcyBtYW55IGJsb2NrcyBvZiBtZW1vcnkgd2l0aGluIGl0IGFzCi15b3Ugd2lzaC4gIFRoZSBzeW50YXggaXM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLU1FTU9SWSAKLSAgQHsKLSAgICBAdmFye25hbWV9IFsoQHZhcnthdHRyfSldIDogT1JJR0lOID0gQHZhcntvcmlnaW59LCBMRU5HVEggPSBAdmFye2xlbn0KLSAgICBAZG90c3t9Ci0gIEB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgQHZhcntuYW1lfSBpcyBhIG5hbWUgdXNlZCBpbiB0aGUgbGlua2VyIHNjcmlwdCB0byByZWZlciB0byB0aGUKLXJlZ2lvbi4gIFRoZSByZWdpb24gbmFtZSBoYXMgbm8gbWVhbmluZyBvdXRzaWRlIG9mIHRoZSBsaW5rZXIgc2NyaXB0LgotUmVnaW9uIG5hbWVzIGFyZSBzdG9yZWQgaW4gYSBzZXBhcmF0ZSBuYW1lIHNwYWNlLCBhbmQgd2lsbCBub3QgY29uZmxpY3QKLXdpdGggc3ltYm9sIG5hbWVzLCBmaWxlIG5hbWVzLCBvciBzZWN0aW9uIG5hbWVzLiAgRWFjaCBtZW1vcnkgcmVnaW9uCi1tdXN0IGhhdmUgYSBkaXN0aW5jdCBuYW1lLgotCi1AY2luZGV4IG1lbW9yeSByZWdpb24gYXR0cmlidXRlcwotVGhlIEB2YXJ7YXR0cn0gc3RyaW5nIGlzIGFuIG9wdGlvbmFsIGxpc3Qgb2YgYXR0cmlidXRlcyB0aGF0IHNwZWNpZnkKLXdoZXRoZXIgdG8gdXNlIGEgcGFydGljdWxhciBtZW1vcnkgcmVnaW9uIGZvciBhbiBpbnB1dCBzZWN0aW9uIHdoaWNoIGlzCi1ub3QgZXhwbGljaXRseSBtYXBwZWQgaW4gdGhlIGxpbmtlciBzY3JpcHQuICBBcyBkZXNjcmliZWQgaW4KLUByZWZ7U0VDVElPTlN9LCBpZiB5b3UgZG8gbm90IHNwZWNpZnkgYW4gb3V0cHV0IHNlY3Rpb24gZm9yIHNvbWUgaW5wdXQKLXNlY3Rpb24sIHRoZSBsaW5rZXIgd2lsbCBjcmVhdGUgYW4gb3V0cHV0IHNlY3Rpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFzCi10aGUgaW5wdXQgc2VjdGlvbi4gIElmIHlvdSBkZWZpbmUgcmVnaW9uIGF0dHJpYnV0ZXMsIHRoZSBsaW5rZXIgd2lsbCB1c2UKLXRoZW0gdG8gc2VsZWN0IHRoZSBtZW1vcnkgcmVnaW9uIGZvciB0aGUgb3V0cHV0IHNlY3Rpb24gdGhhdCBpdCBjcmVhdGVzLgotCi1UaGUgQHZhcnthdHRyfSBzdHJpbmcgbXVzdCBjb25zaXN0IG9ubHkgb2YgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOgotQHRhYmxlIEBzYW1wCi1AaXRlbSBSCi1SZWFkLW9ubHkgc2VjdGlvbgotQGl0ZW0gVwotUmVhZC93cml0ZSBzZWN0aW9uCi1AaXRlbSBYCi1FeGVjdXRhYmxlIHNlY3Rpb24KLUBpdGVtIEEKLUFsbG9jYXRhYmxlIHNlY3Rpb24KLUBpdGVtIEkKLUluaXRpYWxpemVkIHNlY3Rpb24KLUBpdGVtIEwKLVNhbWUgYXMgQHNhbXB7SX0KLUBpdGVtICEKLUludmVydCB0aGUgc2Vuc2Ugb2YgYW55IG9mIHRoZSBwcmVjZWRpbmcgYXR0cmlidXRlcwotQGVuZCB0YWJsZQotCi1JZiBhIHVubWFwcGVkIHNlY3Rpb24gbWF0Y2hlcyBhbnkgb2YgdGhlIGxpc3RlZCBhdHRyaWJ1dGVzIG90aGVyIHRoYW4KLUBzYW1weyF9LCBpdCB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgbWVtb3J5IHJlZ2lvbi4gIFRoZSBAc2FtcHshfQotYXR0cmlidXRlIHJldmVyc2VzIHRoaXMgdGVzdCwgc28gdGhhdCBhbiB1bm1hcHBlZCBzZWN0aW9uIHdpbGwgYmUgcGxhY2VkCi1pbiB0aGUgbWVtb3J5IHJlZ2lvbiBvbmx5IGlmIGl0IGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgbGlzdGVkCi1hdHRyaWJ1dGVzLgotCi1Aa2luZGV4IE9SSUdJTiA9Ci1Aa2luZGV4IG8gPQotQGtpbmRleCBvcmcgPQotVGhlIEB2YXJ7b3JpZ2lufSBpcyBhbiBleHByZXNzaW9uIGZvciB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbWVtb3J5Ci1yZWdpb24uICBUaGUgZXhwcmVzc2lvbiBtdXN0IGV2YWx1YXRlIHRvIGEgY29uc3RhbnQgYmVmb3JlIG1lbW9yeQotYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQsIHdoaWNoIG1lYW5zIHRoYXQgeW91IG1heSBub3QgdXNlIGFueSBzZWN0aW9uCi1yZWxhdGl2ZSBzeW1ib2xzLiAgVGhlIGtleXdvcmQgQGNvZGV7T1JJR0lOfSBtYXkgYmUgYWJicmV2aWF0ZWQgdG8KLUBjb2Rle29yZ30gb3IgQGNvZGV7b30gKGJ1dCBub3QsIGZvciBleGFtcGxlLCBAY29kZXtPUkd9KS4KLQotQGtpbmRleCBMRU5HVEggPQotQGtpbmRleCBsZW4gPQotQGtpbmRleCBsID0KLVRoZSBAdmFye2xlbn0gaXMgYW4gZXhwcmVzc2lvbiBmb3IgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG1lbW9yeQotcmVnaW9uLiAgQXMgd2l0aCB0aGUgQHZhcntvcmlnaW59IGV4cHJlc3Npb24sIHRoZSBleHByZXNzaW9uIG11c3QKLWV2YWx1YXRlIHRvIGEgY29uc3RhbnQgYmVmb3JlIG1lbW9yeSBhbGxvY2F0aW9uIGlzIHBlcmZvcm1lZC4gIFRoZQota2V5d29yZCBAY29kZXtMRU5HVEh9IG1heSBiZSBhYmJyZXZpYXRlZCB0byBAY29kZXtsZW59IG9yIEBjb2Rle2x9LgotCi1JbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHdlIHNwZWNpZnkgdGhhdCB0aGVyZSBhcmUgdHdvIG1lbW9yeSByZWdpb25zCi1hdmFpbGFibGUgZm9yIGFsbG9jYXRpb246IG9uZSBzdGFydGluZyBhdCBAc2FtcHswfSBmb3IgMjU2IGtpbG9ieXRlcywKLWFuZCB0aGUgb3RoZXIgc3RhcnRpbmcgYXQgQHNhbXB7MHg0MDAwMDAwMH0gZm9yIGZvdXIgbWVnYWJ5dGVzLiAgVGhlCi1saW5rZXIgd2lsbCBwbGFjZSBpbnRvIHRoZSBAc2FtcHtyb219IG1lbW9yeSByZWdpb24gZXZlcnkgc2VjdGlvbiB3aGljaAotaXMgbm90IGV4cGxpY2l0bHkgbWFwcGVkIGludG8gYSBtZW1vcnkgcmVnaW9uLCBhbmQgaXMgZWl0aGVyIHJlYWQtb25seQotb3IgZXhlY3V0YWJsZS4gIFRoZSBsaW5rZXIgd2lsbCBwbGFjZSBvdGhlciBzZWN0aW9ucyB3aGljaCBhcmUgbm90Ci1leHBsaWNpdGx5IG1hcHBlZCBpbnRvIGEgbWVtb3J5IHJlZ2lvbiBpbnRvIHRoZSBAc2FtcHtyYW19IG1lbW9yeQotcmVnaW9uLgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLU1FTU9SWSAKLSAgQHsKLSAgICByb20gKHJ4KSAgOiBPUklHSU4gPSAwLCBMRU5HVEggPSAyNTZLCi0gICAgcmFtICghcngpIDogb3JnID0gMHg0MDAwMDAwMCwgbCA9IDRNCi0gIEB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1PbmNlIHlvdSBkZWZpbmUgYSBtZW1vcnkgcmVnaW9uLCB5b3UgY2FuIGRpcmVjdCB0aGUgbGlua2VyIHRvIHBsYWNlCi1zcGVjaWZpYyBvdXRwdXQgc2VjdGlvbnMgaW50byB0aGF0IG1lbW9yeSByZWdpb24gYnkgdXNpbmcgdGhlCi1Ac2FtcHs+QHZhcntyZWdpb259fSBvdXRwdXQgc2VjdGlvbiBhdHRyaWJ1dGUuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUKLWEgbWVtb3J5IHJlZ2lvbiBuYW1lZCBAc2FtcHttZW19LCB5b3Ugd291bGQgdXNlIEBzYW1wez5tZW19IGluIHRoZQotb3V0cHV0IHNlY3Rpb24gZGVmaW5pdGlvbi4gIEB4cmVme091dHB1dCBTZWN0aW9uIFJlZ2lvbn0uICBJZiBubyBhZGRyZXNzCi13YXMgc3BlY2lmaWVkIGZvciB0aGUgb3V0cHV0IHNlY3Rpb24sIHRoZSBsaW5rZXIgd2lsbCBzZXQgdGhlIGFkZHJlc3MgdG8KLXRoZSBuZXh0IGF2YWlsYWJsZSBhZGRyZXNzIHdpdGhpbiB0aGUgbWVtb3J5IHJlZ2lvbi4gIElmIHRoZSBjb21iaW5lZAotb3V0cHV0IHNlY3Rpb25zIGRpcmVjdGVkIHRvIGEgbWVtb3J5IHJlZ2lvbiBhcmUgdG9vIGxhcmdlIGZvciB0aGUKLXJlZ2lvbiwgdGhlIGxpbmtlciB3aWxsIGlzc3VlIGFuIGVycm9yIG1lc3NhZ2UuCi0KLUBub2RlIFBIRFJTCi1Ac2VjdGlvbiBQSERSUyBDb21tYW5kCi1Aa2luZGV4IFBIRFJTCi1AY2luZGV4IHByb2dyYW0gaGVhZGVycwotQGNpbmRleCBFTEYgcHJvZ3JhbSBoZWFkZXJzCi1AY2luZGV4IHByb2dyYW0gc2VnbWVudHMKLUBjaW5kZXggc2VnbWVudHMsIEVMRgotVGhlIEVMRiBvYmplY3QgZmlsZSBmb3JtYXQgdXNlcyBAZGZue3Byb2dyYW0gaGVhZGVyc30sIGFsc28ga25vd3MgYXMKLUBkZm57c2VnbWVudHN9LiAgVGhlIHByb2dyYW0gaGVhZGVycyBkZXNjcmliZSBob3cgdGhlIHByb2dyYW0gc2hvdWxkIGJlCi1sb2FkZWQgaW50byBtZW1vcnkuICBZb3UgY2FuIHByaW50IHRoZW0gb3V0IGJ5IHVzaW5nIHRoZSBAY29kZXtvYmpkdW1wfQotcHJvZ3JhbSB3aXRoIHRoZSBAc2FtcHstcH0gb3B0aW9uLgotCi1XaGVuIHlvdSBydW4gYW4gRUxGIHByb2dyYW0gb24gYSBuYXRpdmUgRUxGIHN5c3RlbSwgdGhlIHN5c3RlbSBsb2FkZXIKLXJlYWRzIHRoZSBwcm9ncmFtIGhlYWRlcnMgaW4gb3JkZXIgdG8gZmlndXJlIG91dCBob3cgdG8gbG9hZCB0aGUKLXByb2dyYW0uICBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBwcm9ncmFtIGhlYWRlcnMgYXJlIHNldCBjb3JyZWN0bHkuCi1UaGlzIG1hbnVhbCBkb2VzIG5vdCBkZXNjcmliZSB0aGUgZGV0YWlscyBvZiBob3cgdGhlIHN5c3RlbSBsb2FkZXIKLWludGVycHJldHMgcHJvZ3JhbSBoZWFkZXJzOyBmb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBFTEYgQUJJLgotCi1UaGUgbGlua2VyIHdpbGwgY3JlYXRlIHJlYXNvbmFibGUgcHJvZ3JhbSBoZWFkZXJzIGJ5IGRlZmF1bHQuICBIb3dldmVyLAotaW4gc29tZSBjYXNlcywgeW91IG1heSBuZWVkIHRvIHNwZWNpZnkgdGhlIHByb2dyYW0gaGVhZGVycyBtb3JlCi1wcmVjaXNlbHkuICBZb3UgbWF5IHVzZSB0aGUgQGNvZGV7UEhEUlN9IGNvbW1hbmQgZm9yIHRoaXMgcHVycG9zZS4gIFdoZW4KLXRoZSBsaW5rZXIgc2VlcyB0aGUgQGNvZGV7UEhEUlN9IGNvbW1hbmQgaW4gdGhlIGxpbmtlciBzY3JpcHQsIGl0IHdpbGwKLW5vdCBjcmVhdGUgYW55IHByb2dyYW0gaGVhZGVycyBvdGhlciB0aGFuIHRoZSBvbmVzIHNwZWNpZmllZC4KLQotVGhlIGxpbmtlciBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBAY29kZXtQSERSU30gY29tbWFuZCB3aGVuCi1nZW5lcmF0aW5nIGFuIEVMRiBvdXRwdXQgZmlsZS4gIEluIG90aGVyIGNhc2VzLCB0aGUgbGlua2VyIHdpbGwgc2ltcGx5Ci1pZ25vcmUgQGNvZGV7UEhEUlN9LgotCi1UaGlzIGlzIHRoZSBzeW50YXggb2YgdGhlIEBjb2Rle1BIRFJTfSBjb21tYW5kLiAgVGhlIHdvcmRzIEBjb2Rle1BIRFJTfSwKLUBjb2Rle0ZJTEVIRFJ9LCBAY29kZXtBVH0sIGFuZCBAY29kZXtGTEFHU30gYXJlIGtleXdvcmRzLgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVBIRFJTCi1AewotICBAdmFye25hbWV9IEB2YXJ7dHlwZX0gWyBGSUxFSERSIF0gWyBQSERSUyBdIFsgQVQgKCBAdmFye2FkZHJlc3N9ICkgXQotICAgICAgICBbIEZMQUdTICggQHZhcntmbGFnc30gKSBdIDsKLUB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgQHZhcntuYW1lfSBpcyB1c2VkIG9ubHkgZm9yIHJlZmVyZW5jZSBpbiB0aGUgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQKLW9mIHRoZSBsaW5rZXIgc2NyaXB0LiAgSXQgaXMgbm90IHB1dCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFByb2dyYW0KLWhlYWRlciBuYW1lcyBhcmUgc3RvcmVkIGluIGEgc2VwYXJhdGUgbmFtZSBzcGFjZSwgYW5kIHdpbGwgbm90IGNvbmZsaWN0Ci13aXRoIHN5bWJvbCBuYW1lcywgZmlsZSBuYW1lcywgb3Igc2VjdGlvbiBuYW1lcy4gIEVhY2ggcHJvZ3JhbSBoZWFkZXIKLW11c3QgaGF2ZSBhIGRpc3RpbmN0IG5hbWUuCi0KLUNlcnRhaW4gcHJvZ3JhbSBoZWFkZXIgdHlwZXMgZGVzY3JpYmUgc2VnbWVudHMgb2YgbWVtb3J5IHdoaWNoIHRoZQotc3lzdGVtIGxvYWRlciB3aWxsIGxvYWQgZnJvbSB0aGUgZmlsZS4gIEluIHRoZSBsaW5rZXIgc2NyaXB0LCB5b3UKLXNwZWNpZnkgdGhlIGNvbnRlbnRzIG9mIHRoZXNlIHNlZ21lbnRzIGJ5IHBsYWNpbmcgYWxsb2NhdGFibGUgb3V0cHV0Ci1zZWN0aW9ucyBpbiB0aGUgc2VnbWVudHMuICBZb3UgdXNlIHRoZSBAc2FtcHs6QHZhcntwaGRyfX0gb3V0cHV0IHNlY3Rpb24KLWF0dHJpYnV0ZSB0byBwbGFjZSBhIHNlY3Rpb24gaW4gYSBwYXJ0aWN1bGFyIHNlZ21lbnQuICBAeHJlZntPdXRwdXQKLVNlY3Rpb24gUGhkcn0uCi0KLUl0IGlzIG5vcm1hbCB0byBwdXQgY2VydGFpbiBzZWN0aW9ucyBpbiBtb3JlIHRoYW4gb25lIHNlZ21lbnQuICBUaGlzCi1tZXJlbHkgaW1wbGllcyB0aGF0IG9uZSBzZWdtZW50IG9mIG1lbW9yeSBjb250YWlucyBhbm90aGVyLiAgWW91IG1heQotcmVwZWF0IEBzYW1wezpAdmFye3BoZHJ9fSwgdXNpbmcgaXQgb25jZSBmb3IgZWFjaCBzZWdtZW50IHdoaWNoIHNob3VsZAotY29udGFpbiB0aGUgc2VjdGlvbi4KLQotSWYgeW91IHBsYWNlIGEgc2VjdGlvbiBpbiBvbmUgb3IgbW9yZSBzZWdtZW50cyB1c2luZyBAc2FtcHs6QHZhcntwaGRyfX0sCi10aGVuIHRoZSBsaW5rZXIgd2lsbCBwbGFjZSBhbGwgc3Vic2VxdWVudCBhbGxvY2F0YWJsZSBzZWN0aW9ucyB3aGljaCBkbwotbm90IHNwZWNpZnkgQHNhbXB7OkB2YXJ7cGhkcn19IGluIHRoZSBzYW1lIHNlZ21lbnRzLiAgVGhpcyBpcyBmb3IKLWNvbnZlbmllbmNlLCBzaW5jZSBnZW5lcmFsbHkgYSB3aG9sZSBzZXQgb2YgY29udGlndW91cyBzZWN0aW9ucyB3aWxsIGJlCi1wbGFjZWQgaW4gYSBzaW5nbGUgc2VnbWVudC4gIFlvdSBjYW4gdXNlIEBjb2RlezpOT05FfSB0byBvdmVycmlkZSB0aGUKLWRlZmF1bHQgc2VnbWVudCBhbmQgdGVsbCB0aGUgbGlua2VyIHRvIG5vdCBwdXQgdGhlIHNlY3Rpb24gaW4gYW55Ci1zZWdtZW50IGF0IGFsbC4KLQotQGtpbmRleCBGSUxFSERSCi1Aa2luZGV4IFBIRFJTCi1Zb3UgbWF5IHVzZSB0aGUgQGNvZGV7RklMRUhEUn0gYW5kIEBjb2Rle1BIRFJTfSBrZXl3b3JkcyBhcHBlYXIgYWZ0ZXIKLXRoZSBwcm9ncmFtIGhlYWRlciB0eXBlIHRvIGZ1cnRoZXIgZGVzY3JpYmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWdtZW50LgotVGhlIEBjb2Rle0ZJTEVIRFJ9IGtleXdvcmQgbWVhbnMgdGhhdCB0aGUgc2VnbWVudCBzaG91bGQgaW5jbHVkZSB0aGUgRUxGCi1maWxlIGhlYWRlci4gIFRoZSBAY29kZXtQSERSU30ga2V5d29yZCBtZWFucyB0aGF0IHRoZSBzZWdtZW50IHNob3VsZAotaW5jbHVkZSB0aGUgRUxGIHByb2dyYW0gaGVhZGVycyB0aGVtc2VsdmVzLgotCi1UaGUgQHZhcnt0eXBlfSBtYXkgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcuICBUaGUgbnVtYmVycyBpbmRpY2F0ZSB0aGUKLXZhbHVlIG9mIHRoZSBrZXl3b3JkLgotCi1AdGFibGUgQGFzaXMKLUBpdGVtIEBjb2Rle1BUX05VTEx9ICgwKQotSW5kaWNhdGVzIGFuIHVudXNlZCBwcm9ncmFtIGhlYWRlci4KLQotQGl0ZW0gQGNvZGV7UFRfTE9BRH0gKDEpCi1JbmRpY2F0ZXMgdGhhdCB0aGlzIHByb2dyYW0gaGVhZGVyIGRlc2NyaWJlcyBhIHNlZ21lbnQgdG8gYmUgbG9hZGVkIGZyb20KLXRoZSBmaWxlLgotCi1AaXRlbSBAY29kZXtQVF9EWU5BTUlDfSAoMikKLUluZGljYXRlcyBhIHNlZ21lbnQgd2hlcmUgZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZC4KLQotQGl0ZW0gQGNvZGV7UFRfSU5URVJQfSAoMykKLUluZGljYXRlcyBhIHNlZ21lbnQgd2hlcmUgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gaW50ZXJwcmV0ZXIgbWF5IGJlCi1mb3VuZC4KLQotQGl0ZW0gQGNvZGV7UFRfTk9URX0gKDQpCi1JbmRpY2F0ZXMgYSBzZWdtZW50IGhvbGRpbmcgbm90ZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gQGNvZGV7UFRfU0hMSUJ9ICg1KQotQSByZXNlcnZlZCBwcm9ncmFtIGhlYWRlciB0eXBlLCBkZWZpbmVkIGJ1dCBub3Qgc3BlY2lmaWVkIGJ5IHRoZSBFTEYKLUFCSS4KLQotQGl0ZW0gQGNvZGV7UFRfUEhEUn0gKDYpCi1JbmRpY2F0ZXMgYSBzZWdtZW50IHdoZXJlIHRoZSBwcm9ncmFtIGhlYWRlcnMgbWF5IGJlIGZvdW5kLgotCi1AaXRlbSBAdmFye2V4cHJlc3Npb259Ci1BbiBleHByZXNzaW9uIGdpdmluZyB0aGUgbnVtZXJpYyB0eXBlIG9mIHRoZSBwcm9ncmFtIGhlYWRlci4gIFRoaXMgbWF5Ci1iZSB1c2VkIGZvciB0eXBlcyBub3QgZGVmaW5lZCBhYm92ZS4KLUBlbmQgdGFibGUKLQotWW91IGNhbiBzcGVjaWZ5IHRoYXQgYSBzZWdtZW50IHNob3VsZCBiZSBsb2FkZWQgYXQgYSBwYXJ0aWN1bGFyIGFkZHJlc3MKLWluIG1lbW9yeSBieSB1c2luZyBhbiBAY29kZXtBVH0gZXhwcmVzc2lvbi4gIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZQotQGNvZGV7QVR9IGNvbW1hbmQgdXNlZCBhcyBhbiBvdXRwdXQgc2VjdGlvbiBhdHRyaWJ1dGUgKEBweHJlZntPdXRwdXQKLVNlY3Rpb24gTE1BfSkuICBUaGUgQGNvZGV7QVR9IGNvbW1hbmQgZm9yIGEgcHJvZ3JhbSBoZWFkZXIgb3ZlcnJpZGVzIHRoZQotb3V0cHV0IHNlY3Rpb24gYXR0cmlidXRlLgotCi1UaGUgbGlua2VyIHdpbGwgbm9ybWFsbHkgc2V0IHRoZSBzZWdtZW50IGZsYWdzIGJhc2VkIG9uIHRoZSBzZWN0aW9ucwotd2hpY2ggY29tcHJpc2UgdGhlIHNlZ21lbnQuICBZb3UgbWF5IHVzZSB0aGUgQGNvZGV7RkxBR1N9IGtleXdvcmQgdG8KLWV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgc2VnbWVudCBmbGFncy4gIFRoZSB2YWx1ZSBvZiBAdmFye2ZsYWdzfSBtdXN0IGJlCi1hbiBpbnRlZ2VyLiAgSXQgaXMgdXNlZCB0byBzZXQgdGhlIEBjb2Rle3BfZmxhZ3N9IGZpZWxkIG9mIHRoZSBwcm9ncmFtCi1oZWFkZXIuCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBvZiBAY29kZXtQSERSU30uICBUaGlzIHNob3dzIGEgdHlwaWNhbCBzZXQgb2YgcHJvZ3JhbQotaGVhZGVycyB1c2VkIG9uIGEgbmF0aXZlIEVMRiBzeXN0ZW0uCi0KLUBleGFtcGxlCi1AZ3JvdXAKLVBIRFJTCi1AewotICBoZWFkZXJzIFBUX1BIRFIgUEhEUlMgOwotICBpbnRlcnAgUFRfSU5URVJQIDsKLSAgdGV4dCBQVF9MT0FEIEZJTEVIRFIgUEhEUlMgOwotICBkYXRhIFBUX0xPQUQgOwotICBkeW5hbWljIFBUX0RZTkFNSUMgOwotQH0KLQotU0VDVElPTlMKLUB7Ci0gIC4gPSBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IEB7ICooLmludGVycCkgQH0gOnRleHQgOmludGVycAotICAudGV4dCA6IEB7ICooLnRleHQpIEB9IDp0ZXh0Ci0gIC5yb2RhdGEgOiBAeyAqKC5yb2RhdGEpIEB9IC8qIGRlZmF1bHRzIHRvIDp0ZXh0ICovCi0gIEBkb3Rze30KLSAgLiA9IC4gKyAweDEwMDA7IC8qIG1vdmUgdG8gYSBuZXcgcGFnZSBpbiBtZW1vcnkgKi8KLSAgLmRhdGEgOiBAeyAqKC5kYXRhKSBAfSA6ZGF0YQotICAuZHluYW1pYyA6IEB7ICooLmR5bmFtaWMpIEB9IDpkYXRhIDpkeW5hbWljCi0gIEBkb3Rze30KLUB9Ci1AZW5kIGdyb3VwCi1AZW5kIGV4YW1wbGUKLQotQG5vZGUgVkVSU0lPTgotQHNlY3Rpb24gVkVSU0lPTiBDb21tYW5kCi1Aa2luZGV4IFZFUlNJT04gQHtzY3JpcHQgdGV4dEB9Ci1AY2luZGV4IHN5bWJvbCB2ZXJzaW9ucwotQGNpbmRleCB2ZXJzaW9uIHNjcmlwdAotQGNpbmRleCB2ZXJzaW9ucyBvZiBzeW1ib2xzCi1UaGUgbGlua2VyIHN1cHBvcnRzIHN5bWJvbCB2ZXJzaW9ucyB3aGVuIHVzaW5nIEVMRi4gIFN5bWJvbCB2ZXJzaW9ucyBhcmUKLW9ubHkgdXNlZnVsIHdoZW4gdXNpbmcgc2hhcmVkIGxpYnJhcmllcy4gIFRoZSBkeW5hbWljIGxpbmtlciBjYW4gdXNlCi1zeW1ib2wgdmVyc2lvbnMgdG8gc2VsZWN0IGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBhIGZ1bmN0aW9uIHdoZW4gaXQgcnVucwotYSBwcm9ncmFtIHRoYXQgbWF5IGhhdmUgYmVlbiBsaW5rZWQgYWdhaW5zdCBhbiBlYXJsaWVyIHZlcnNpb24gb2YgdGhlCi1zaGFyZWQgbGlicmFyeS4KLQotWW91IGNhbiBpbmNsdWRlIGEgdmVyc2lvbiBzY3JpcHQgZGlyZWN0bHkgaW4gdGhlIG1haW4gbGlua2VyIHNjcmlwdCwgb3IKLXlvdSBjYW4gc3VwcGx5IHRoZSB2ZXJzaW9uIHNjcmlwdCBhcyBhbiBpbXBsaWNpdCBsaW5rZXIgc2NyaXB0LiAgWW91IGNhbgotYWxzbyB1c2UgdGhlIEBzYW1wey0tdmVyc2lvbi1zY3JpcHR9IGxpbmtlciBvcHRpb24uCi0KLVRoZSBzeW50YXggb2YgdGhlIEBjb2Rle1ZFUlNJT059IGNvbW1hbmQgaXMgc2ltcGx5Ci1Ac21hbGxleGFtcGxlCi1WRVJTSU9OIEB7IHZlcnNpb24tc2NyaXB0LWNvbW1hbmRzIEB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgZm9ybWF0IG9mIHRoZSB2ZXJzaW9uIHNjcmlwdCBjb21tYW5kcyBpcyBpZGVudGljYWwgdG8gdGhhdCB1c2VkIGJ5Ci1TdW4ncyBsaW5rZXIgaW4gU29sYXJpcyAyLjUuICBUaGUgdmVyc2lvbiBzY3JpcHQgZGVmaW5lcyBhIHRyZWUgb2YKLXZlcnNpb24gbm9kZXMuICBZb3Ugc3BlY2lmeSB0aGUgbm9kZSBuYW1lcyBhbmQgaW50ZXJkZXBlbmRlbmNpZXMgaW4gdGhlCi12ZXJzaW9uIHNjcmlwdC4gIFlvdSBjYW4gc3BlY2lmeSB3aGljaCBzeW1ib2xzIGFyZSBib3VuZCB0byB3aGljaAotdmVyc2lvbiBub2RlcywgYW5kIHlvdSBjYW4gcmVkdWNlIGEgc3BlY2lmaWVkIHNldCBvZiBzeW1ib2xzIHRvIGxvY2FsCi1zY29wZSBzbyB0aGF0IHRoZXkgYXJlIG5vdCBnbG9iYWxseSB2aXNpYmxlIG91dHNpZGUgb2YgdGhlIHNoYXJlZAotbGlicmFyeS4KLQotVGhlIGVhc2llc3Qgd2F5IHRvIGRlbW9uc3RyYXRlIHRoZSB2ZXJzaW9uIHNjcmlwdCBsYW5ndWFnZSBpcyB3aXRoIGEgZmV3Ci1leGFtcGxlcy4KLQotQHNtYWxsZXhhbXBsZQotVkVSU18xLjEgQHsKLQkgZ2xvYmFsOgotCQkgZm9vMTsKLQkgbG9jYWw6Ci0JCSBvbGQqOyAKLQkJIG9yaWdpbmFsKjsgCi0JCSBuZXcqOyAKLUB9OwotCi1WRVJTXzEuMiBAewotCQkgZm9vMjsKLUB9IFZFUlNfMS4xOwotCi1WRVJTXzIuMCBAewotCQkgYmFyMTsgYmFyMjsKLUB9IFZFUlNfMS4yOwotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhpcyBleGFtcGxlIHZlcnNpb24gc2NyaXB0IGRlZmluZXMgdGhyZWUgdmVyc2lvbiBub2Rlcy4gIFRoZSBmaXJzdAotdmVyc2lvbiBub2RlIGRlZmluZWQgaXMgQHNhbXB7VkVSU18xLjF9OyBpdCBoYXMgbm8gb3RoZXIgZGVwZW5kZW5jaWVzLgotVGhlIHNjcmlwdCBiaW5kcyB0aGUgc3ltYm9sIEBzYW1we2ZvbzF9IHRvIEBzYW1we1ZFUlNfMS4xfS4gIEl0IHJlZHVjZXMKLWEgbnVtYmVyIG9mIHN5bWJvbHMgdG8gbG9jYWwgc2NvcGUgc28gdGhhdCB0aGV5IGFyZSBub3QgdmlzaWJsZSBvdXRzaWRlCi1vZiB0aGUgc2hhcmVkIGxpYnJhcnkuCi0KLU5leHQsIHRoZSB2ZXJzaW9uIHNjcmlwdCBkZWZpbmVzIG5vZGUgQHNhbXB7VkVSU18xLjJ9LiAgVGhpcyBub2RlCi1kZXBlbmRzIHVwb24gQHNhbXB7VkVSU18xLjF9LiAgVGhlIHNjcmlwdCBiaW5kcyB0aGUgc3ltYm9sIEBzYW1we2ZvbzJ9Ci10byB0aGUgdmVyc2lvbiBub2RlIEBzYW1we1ZFUlNfMS4yfS4KLQotRmluYWxseSwgdGhlIHZlcnNpb24gc2NyaXB0IGRlZmluZXMgbm9kZSBAc2FtcHtWRVJTXzIuMH0uICBUaGlzIG5vZGUKLWRlcGVuZHMgdXBvbiBAc2FtcHtWRVJTXzEuMn0uICBUaGUgc2NyaXB0cyBiaW5kcyB0aGUgc3ltYm9scyBAc2FtcHtiYXIxfQotYW5kIEBzYW1we2JhcjJ9IGFyZSBib3VuZCB0byB0aGUgdmVyc2lvbiBub2RlIEBzYW1we1ZFUlNfMi4wfS4KLQotV2hlbiB0aGUgbGlua2VyIGZpbmRzIGEgc3ltYm9sIGRlZmluZWQgaW4gYSBsaWJyYXJ5IHdoaWNoIGlzIG5vdAotc3BlY2lmaWNhbGx5IGJvdW5kIHRvIGEgdmVyc2lvbiBub2RlLCBpdCB3aWxsIGVmZmVjdGl2ZWx5IGJpbmQgaXQgdG8gYW4KLXVuc3BlY2lmaWVkIGJhc2UgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gIFlvdSBjYW4gYmluZCBhbGwgb3RoZXJ3aXNlCi11bnNwZWNpZmllZCBzeW1ib2xzIHRvIGEgZ2l2ZW4gdmVyc2lvbiBub2RlIGJ5IHVzaW5nIEBzYW1we2dsb2JhbDogKn0KLXNvbWV3aGVyZSBpbiB0aGUgdmVyc2lvbiBzY3JpcHQuCi0KLVRoZSBuYW1lcyBvZiB0aGUgdmVyc2lvbiBub2RlcyBoYXZlIG5vIHNwZWNpZmljIG1lYW5pbmcgb3RoZXIgdGhhbiB3aGF0Ci10aGV5IG1pZ2h0IHN1Z2dlc3QgdG8gdGhlIHBlcnNvbiByZWFkaW5nIHRoZW0uICBUaGUgQHNhbXB7Mi4wfSB2ZXJzaW9uCi1jb3VsZCBqdXN0IGFzIHdlbGwgaGF2ZSBhcHBlYXJlZCBpbiBiZXR3ZWVuIEBzYW1wezEuMX0gYW5kIEBzYW1wezEuMn0uCi1Ib3dldmVyLCB0aGlzIHdvdWxkIGJlIGEgY29uZnVzaW5nIHdheSB0byB3cml0ZSBhIHZlcnNpb24gc2NyaXB0LgotCi1XaGVuIHlvdSBsaW5rIGFuIGFwcGxpY2F0aW9uIGFnYWluc3QgYSBzaGFyZWQgbGlicmFyeSB0aGF0IGhhcyB2ZXJzaW9uZWQKLXN5bWJvbHMsIHRoZSBhcHBsaWNhdGlvbiBpdHNlbGYga25vd3Mgd2hpY2ggdmVyc2lvbiBvZiBlYWNoIHN5bWJvbCBpdAotcmVxdWlyZXMsIGFuZCBpdCBhbHNvIGtub3dzIHdoaWNoIHZlcnNpb24gbm9kZXMgaXQgbmVlZHMgZnJvbSBlYWNoCi1zaGFyZWQgbGlicmFyeSBpdCBpcyBsaW5rZWQgYWdhaW5zdC4gIFRodXMgYXQgcnVudGltZSwgdGhlIGR5bmFtaWMKLWxvYWRlciBjYW4gbWFrZSBhIHF1aWNrIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBsaWJyYXJpZXMgeW91IGhhdmUKLWxpbmtlZCBhZ2FpbnN0IGRvIGluIGZhY3Qgc3VwcGx5IGFsbCBvZiB0aGUgdmVyc2lvbiBub2RlcyB0aGF0IHRoZQotYXBwbGljYXRpb24gd2lsbCBuZWVkIHRvIHJlc29sdmUgYWxsIG9mIHRoZSBkeW5hbWljIHN5bWJvbHMuICBJbiB0aGlzCi13YXkgaXQgaXMgcG9zc2libGUgZm9yIHRoZSBkeW5hbWljIGxpbmtlciB0byBrbm93IHdpdGggY2VydGFpbnR5IHRoYXQKLWFsbCBleHRlcm5hbCBzeW1ib2xzIHRoYXQgaXQgbmVlZHMgd2lsbCBiZSByZXNvbHZhYmxlIHdpdGhvdXQgaGF2aW5nIHRvCi1zZWFyY2ggZm9yIGVhY2ggc3ltYm9sIHJlZmVyZW5jZS4KLQotVGhlIHN5bWJvbCB2ZXJzaW9uaW5nIGlzIGluIGVmZmVjdCBhIG11Y2ggbW9yZSBzb3BoaXN0aWNhdGVkIHdheSBvZgotZG9pbmcgbWlub3IgdmVyc2lvbiBjaGVja2luZyB0aGF0IFN1bk9TIGRvZXMuICBUaGUgZnVuZGFtZW50YWwgcHJvYmxlbQotdGhhdCBpcyBiZWluZyBhZGRyZXNzZWQgaGVyZSBpcyB0aGF0IHR5cGljYWxseSByZWZlcmVuY2VzIHRvIGV4dGVybmFsCi1mdW5jdGlvbnMgYXJlIGJvdW5kIG9uIGFuIGFzLW5lZWRlZCBiYXNpcywgYW5kIGFyZSBub3QgYWxsIGJvdW5kIHdoZW4KLXRoZSBhcHBsaWNhdGlvbiBzdGFydHMgdXAuICBJZiBhIHNoYXJlZCBsaWJyYXJ5IGlzIG91dCBvZiBkYXRlLCBhCi1yZXF1aXJlZCBpbnRlcmZhY2UgbWF5IGJlIG1pc3Npbmc7IHdoZW4gdGhlIGFwcGxpY2F0aW9uIHRyaWVzIHRvIHVzZQotdGhhdCBpbnRlcmZhY2UsIGl0IG1heSBzdWRkZW5seSBhbmQgdW5leHBlY3RlZGx5IGZhaWwuICBXaXRoIHN5bWJvbAotdmVyc2lvbmluZywgdGhlIHVzZXIgd2lsbCBnZXQgYSB3YXJuaW5nIHdoZW4gdGhleSBzdGFydCB0aGVpciBwcm9ncmFtIGlmCi10aGUgbGlicmFyaWVzIGJlaW5nIHVzZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gYXJlIHRvbyBvbGQuCi0KLVRoZXJlIGFyZSBzZXZlcmFsIEdOVSBleHRlbnNpb25zIHRvIFN1bidzIHZlcnNpb25pbmcgYXBwcm9hY2guICBUaGUKLWZpcnN0IG9mIHRoZXNlIGlzIHRoZSBhYmlsaXR5IHRvIGJpbmQgYSBzeW1ib2wgdG8gYSB2ZXJzaW9uIG5vZGUgaW4gdGhlCi1zb3VyY2UgZmlsZSB3aGVyZSB0aGUgc3ltYm9sIGlzIGRlZmluZWQgaW5zdGVhZCBvZiBpbiB0aGUgdmVyc2lvbmluZwotc2NyaXB0LiAgVGhpcyB3YXMgZG9uZSBtYWlubHkgdG8gcmVkdWNlIHRoZSBidXJkZW4gb24gdGhlIGxpYnJhcnkKLW1haW50YWluZXIuICBZb3UgY2FuIGRvIHRoaXMgYnkgcHV0dGluZyBzb21ldGhpbmcgbGlrZToKLUBzbWFsbGV4YW1wbGUKLV9fYXNtX18oIi5zeW12ZXIgb3JpZ2luYWxfZm9vLGZvb0BAVkVSU18xLjEiKTsKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLWluIHRoZSBDIHNvdXJjZSBmaWxlLiAgVGhpcyByZW5hbWVzIHRoZSBmdW5jdGlvbiBAc2FtcHtvcmlnaW5hbF9mb299IHRvCi1iZSBhbiBhbGlhcyBmb3IgQHNhbXB7Zm9vfSBib3VuZCB0byB0aGUgdmVyc2lvbiBub2RlIEBzYW1we1ZFUlNfMS4xfS4KLVRoZSBAc2FtcHtsb2NhbDp9IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBwcmV2ZW50IHRoZSBzeW1ib2wKLUBzYW1we29yaWdpbmFsX2Zvb30gZnJvbSBiZWluZyBleHBvcnRlZC4KLQotVGhlIHNlY29uZCBHTlUgZXh0ZW5zaW9uIGlzIHRvIGFsbG93IG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBzYW1lCi1mdW5jdGlvbiB0byBhcHBlYXIgaW4gYSBnaXZlbiBzaGFyZWQgbGlicmFyeS4gIEluIHRoaXMgd2F5IHlvdSBjYW4gbWFrZQotYW4gaW5jb21wYXRpYmxlIGNoYW5nZSB0byBhbiBpbnRlcmZhY2Ugd2l0aG91dCBpbmNyZWFzaW5nIHRoZSBtYWpvcgotdmVyc2lvbiBudW1iZXIgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LCB3aGlsZSBzdGlsbCBhbGxvd2luZyBhcHBsaWNhdGlvbnMKLWxpbmtlZCBhZ2FpbnN0IHRoZSBvbGQgaW50ZXJmYWNlIHRvIGNvbnRpbnVlIHRvIGZ1bmN0aW9uLgotCi1UbyBkbyB0aGlzLCB5b3UgbXVzdCB1c2UgbXVsdGlwbGUgQHNhbXB7LnN5bXZlcn0gZGlyZWN0aXZlcyBpbiB0aGUKLXNvdXJjZSBmaWxlLiAgSGVyZSBpcyBhbiBleGFtcGxlOgotCi1Ac21hbGxleGFtcGxlCi1fX2FzbV9fKCIuc3ltdmVyIG9yaWdpbmFsX2Zvbyxmb29AQCIpOwotX19hc21fXygiLnN5bXZlciBvbGRfZm9vLGZvb0BAVkVSU18xLjEiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2ZvbzEsZm9vQEBWRVJTXzEuMiIpOwotX19hc21fXygiLnN5bXZlciBuZXdfZm9vLGZvb0BAQEBWRVJTXzIuMCIpOwotQGVuZCBzbWFsbGV4YW1wbGUKLQotSW4gdGhpcyBleGFtcGxlLCBAc2FtcHtmb29AQH0gcmVwcmVzZW50cyB0aGUgc3ltYm9sIEBzYW1we2Zvb30gYm91bmQgdG8gdGhlCi11bnNwZWNpZmllZCBiYXNlIHZlcnNpb24gb2YgdGhlIHN5bWJvbC4gIFRoZSBzb3VyY2UgZmlsZSB0aGF0IGNvbnRhaW5zIHRoaXMKLWV4YW1wbGUgd291bGQgZGVmaW5lIDQgQyBmdW5jdGlvbnM6IEBzYW1we29yaWdpbmFsX2Zvb30sIEBzYW1we29sZF9mb299LAotQHNhbXB7b2xkX2ZvbzF9LCBhbmQgQHNhbXB7bmV3X2Zvb30uCi0KLVdoZW4geW91IGhhdmUgbXVsdGlwbGUgZGVmaW5pdGlvbnMgb2YgYSBnaXZlbiBzeW1ib2wsIHRoZXJlIG5lZWRzIHRvIGJlCi1zb21lIHdheSB0byBzcGVjaWZ5IGEgZGVmYXVsdCB2ZXJzaW9uIHRvIHdoaWNoIGV4dGVybmFsIHJlZmVyZW5jZXMgdG8KLXRoaXMgc3ltYm9sIHdpbGwgYmUgYm91bmQuICBZb3UgY2FuIGRvIHRoaXMgd2l0aCB0aGUKLUBzYW1we2Zvb0BAQEBWRVJTXzIuMH0gdHlwZSBvZiBAc2FtcHsuc3ltdmVyfSBkaXJlY3RpdmUuICBZb3UgY2FuIG9ubHkKLWRlY2xhcmUgb25lIHZlcnNpb24gb2YgYSBzeW1ib2wgYXMgdGhlIGRlZmF1bHQgaW4gdGhpcyBtYW5uZXI7IG90aGVyd2lzZQoteW91IHdvdWxkIGVmZmVjdGl2ZWx5IGhhdmUgbXVsdGlwbGUgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgc3ltYm9sLgotCi1JZiB5b3Ugd2lzaCB0byBiaW5kIGEgcmVmZXJlbmNlIHRvIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgc3ltYm9sCi13aXRoaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LCB5b3UgY2FuIHVzZSB0aGUgYWxpYXNlcyBvZiBjb252ZW5pZW5jZQotKGkuZS4gQHNhbXB7b2xkX2Zvb30pLCBvciB5b3UgY2FuIHVzZSB0aGUgQHNhbXB7LnN5bXZlcn0gZGlyZWN0aXZlIHRvCi1zcGVjaWZpY2FsbHkgYmluZCB0byBhbiBleHRlcm5hbCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBpbiBxdWVzdGlvbi4KLQotQG5vZGUgRXhwcmVzc2lvbnMKLUBzZWN0aW9uIEV4cHJlc3Npb25zIGluIExpbmtlciBTY3JpcHRzCi1AY2luZGV4IGV4cHJlc3Npb25zCi1AY2luZGV4IGFyaXRobWV0aWMKLVRoZSBzeW50YXggZm9yIGV4cHJlc3Npb25zIGluIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlIGlzIGlkZW50aWNhbCB0bwotdGhhdCBvZiBDIGV4cHJlc3Npb25zLiAgQWxsIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgYXMgaW50ZWdlcnMuICBBbGwKLWV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgaW4gdGhlIHNhbWUgc2l6ZSwgd2hpY2ggaXMgMzIgYml0cyBpZiBib3RoIHRoZQotaG9zdCBhbmQgdGFyZ2V0IGFyZSAzMiBiaXRzLCBhbmQgaXMgb3RoZXJ3aXNlIDY0IGJpdHMuCi0KLVlvdSBjYW4gdXNlIGFuZCBzZXQgc3ltYm9sIHZhbHVlcyBpbiBleHByZXNzaW9ucy4KLQotVGhlIGxpbmtlciBkZWZpbmVzIHNldmVyYWwgc3BlY2lhbCBwdXJwb3NlIGJ1aWx0aW4gZnVuY3Rpb25zIGZvciB1c2UgaW4KLWV4cHJlc3Npb25zLgotCi1AbWVudQotKiBDb25zdGFudHM6OgkJCUNvbnN0YW50cwotKiBTeW1ib2xzOjoJCQlTeW1ib2wgTmFtZXMKLSogTG9jYXRpb24gQ291bnRlcjo6CQlUaGUgTG9jYXRpb24gQ291bnRlcgotKiBPcGVyYXRvcnM6OgkJCU9wZXJhdG9ycwotKiBFdmFsdWF0aW9uOjoJCQlFdmFsdWF0aW9uCi0qIEV4cHJlc3Npb24gU2VjdGlvbjo6CQlUaGUgU2VjdGlvbiBvZiBhbiBFeHByZXNzaW9uCi0qIEJ1aWx0aW4gRnVuY3Rpb25zOjoJCUJ1aWx0aW4gRnVuY3Rpb25zCi1AZW5kIG1lbnUKLQotQG5vZGUgQ29uc3RhbnRzCi1Ac3Vic2VjdGlvbiBDb25zdGFudHMKLUBjaW5kZXggaW50ZWdlciBub3RhdGlvbgotQGNpbmRleCBjb25zdGFudHMgaW4gbGlua2VyIHNjcmlwdHMKLUFsbCBjb25zdGFudHMgYXJlIGludGVnZXJzLgotCi1BcyBpbiBDLCB0aGUgbGlua2VyIGNvbnNpZGVycyBhbiBpbnRlZ2VyIGJlZ2lubmluZyB3aXRoIEBzYW1wezB9IHRvIGJlCi1vY3RhbCwgYW5kIGFuIGludGVnZXIgYmVnaW5uaW5nIHdpdGggQHNhbXB7MHh9IG9yIEBzYW1wezBYfSB0byBiZQotaGV4YWRlY2ltYWwuICBUaGUgbGlua2VyIGNvbnNpZGVycyBvdGhlciBpbnRlZ2VycyB0byBiZSBkZWNpbWFsLgotCi1AY2luZGV4IHNjYWxlZCBpbnRlZ2VycwotQGNpbmRleCBLIGFuZCBNIGludGVnZXIgc3VmZml4ZXMKLUBjaW5kZXggTSBhbmQgSyBpbnRlZ2VyIHN1ZmZpeGVzCi1AY2luZGV4IHN1ZmZpeGVzIGZvciBpbnRlZ2VycwotQGNpbmRleCBpbnRlZ2VyIHN1ZmZpeGVzCi1JbiBhZGRpdGlvbiwgeW91IGNhbiB1c2UgdGhlIHN1ZmZpeGVzIEBjb2Rle0t9IGFuZCBAY29kZXtNfSB0byBzY2FsZSBhCi1jb25zdGFudCBieQotQGMgVEVYSTJST0ZGLUtJTEwKLUBpZmluZm8KLUBjIEVORCBURVhJMlJPRkYtS0lMTAotQGNvZGV7MTAyNH0gb3IgQGNvZGV7MTAyNCoxMDI0fQotQGMgVEVYSTJST0ZGLUtJTEwKLUBlbmQgaWZpbmZvCi1AdGV4Ci0ke1xybSAxMDI0fSQgb3IgJHtccm0gMTAyNH1eMiQKLUBlbmQgdGV4Ci1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLXJlc3BlY3RpdmVseS4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgYWxsIHJlZmVyIHRvIHRoZSBzYW1lIHF1YW50aXR5OgotQHNtYWxsZXhhbXBsZQotICBfZm91cmtfMSA9IDRLOwotICBfZm91cmtfMiA9IDQwOTY7Ci0gIF9mb3Vya18zID0gMHgxMDAwOwotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgU3ltYm9scwotQHN1YnNlY3Rpb24gU3ltYm9sIE5hbWVzCi1AY2luZGV4IHN5bWJvbCBuYW1lcwotQGNpbmRleCBuYW1lcwotQGNpbmRleCBxdW90ZWQgc3ltYm9sIG5hbWVzCi1Aa2luZGV4ICIKLVVubGVzcyBxdW90ZWQsIHN5bWJvbCBuYW1lcyBzdGFydCB3aXRoIGEgbGV0dGVyLCB1bmRlcnNjb3JlLCBvciBwZXJpb2QKLWFuZCBtYXkgaW5jbHVkZSBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmVzLCBwZXJpb2RzLCBhbmQgaHlwaGVucy4KLVVucXVvdGVkIHN5bWJvbCBuYW1lcyBtdXN0IG5vdCBjb25mbGljdCB3aXRoIGFueSBrZXl3b3Jkcy4gIFlvdSBjYW4KLXNwZWNpZnkgYSBzeW1ib2wgd2hpY2ggY29udGFpbnMgb2RkIGNoYXJhY3RlcnMgb3IgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYQota2V5d29yZCBieSBzdXJyb3VuZGluZyB0aGUgc3ltYm9sIG5hbWUgaW4gZG91YmxlIHF1b3RlczoKLUBzbWFsbGV4YW1wbGUKLSAgIlNFQ1RJT04iID0gOTsKLSAgIndpdGggYSBzcGFjZSIgPSAiYWxzbyB3aXRoIGEgc3BhY2UiICsgMTA7Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1TaW5jZSBzeW1ib2xzIGNhbiBjb250YWluIG1hbnkgbm9uLWFscGhhYmV0aWMgY2hhcmFjdGVycywgaXQgaXMgc2FmZXN0Ci10byBkZWxpbWl0IHN5bWJvbHMgd2l0aCBzcGFjZXMuICBGb3IgZXhhbXBsZSwgQHNhbXB7QS1CfSBpcyBvbmUgc3ltYm9sLAotd2hlcmVhcyBAc2FtcHtBIC0gQn0gaXMgYW4gZXhwcmVzc2lvbiBpbnZvbHZpbmcgc3VidHJhY3Rpb24uCi0KLUBub2RlIExvY2F0aW9uIENvdW50ZXIKLUBzdWJzZWN0aW9uIFRoZSBMb2NhdGlvbiBDb3VudGVyCi1Aa2luZGV4IC4KLUBjaW5kZXggZG90Ci1AY2luZGV4IGxvY2F0aW9uIGNvdW50ZXIKLUBjaW5kZXggY3VycmVudCBvdXRwdXQgbG9jYXRpb24KLVRoZSBzcGVjaWFsIGxpbmtlciB2YXJpYWJsZSBAZGZue2RvdH0gQHNhbXB7Ln0gYWx3YXlzIGNvbnRhaW5zIHRoZQotY3VycmVudCBvdXRwdXQgbG9jYXRpb24gY291bnRlci4gIFNpbmNlIHRoZSBAY29kZXsufSBhbHdheXMgcmVmZXJzIHRvIGEKLWxvY2F0aW9uIGluIGFuIG91dHB1dCBzZWN0aW9uLCBpdCBtYXkgb25seSBhcHBlYXIgaW4gYW4gZXhwcmVzc2lvbgotd2l0aGluIGEgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQuICBUaGUgQGNvZGV7Ln0gc3ltYm9sIG1heSBhcHBlYXIKLWFueXdoZXJlIHRoYXQgYW4gb3JkaW5hcnkgc3ltYm9sIGlzIGFsbG93ZWQgaW4gYW4gZXhwcmVzc2lvbi4KLQotQGNpbmRleCBob2xlcwotQXNzaWduaW5nIGEgdmFsdWUgdG8gQGNvZGV7Ln0gd2lsbCBjYXVzZSB0aGUgbG9jYXRpb24gY291bnRlciB0byBiZQotbW92ZWQuICBUaGlzIG1heSBiZSB1c2VkIHRvIGNyZWF0ZSBob2xlcyBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICBUaGUKLWxvY2F0aW9uIGNvdW50ZXIgbWF5IG5ldmVyIGJlIG1vdmVkIGJhY2t3YXJkcy4KLQotQHNtYWxsZXhhbXBsZQotU0VDVElPTlMKLUB7Ci0gIG91dHB1dCA6Ci0gICAgQHsKLSAgICAgIGZpbGUxKC50ZXh0KQotICAgICAgLiA9IC4gKyAxMDAwOwotICAgICAgZmlsZTIoLnRleHQpCi0gICAgICAuICs9IDEwMDA7Ci0gICAgICBmaWxlMygudGV4dCkKLSAgICBAfSA9IDB4MTIzNDsKLUB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1JbiB0aGUgcHJldmlvdXMgZXhhbXBsZSwgdGhlIEBzYW1wey50ZXh0fSBzZWN0aW9uIGZyb20gQGZpbGV7ZmlsZTF9IGlzCi1sb2NhdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBzZWN0aW9uIEBzYW1we291dHB1dH0uICBJdCBpcwotZm9sbG93ZWQgYnkgYSAxMDAwIGJ5dGUgZ2FwLiAgVGhlbiB0aGUgQHNhbXB7LnRleHR9IHNlY3Rpb24gZnJvbQotQGZpbGV7ZmlsZTJ9IGFwcGVhcnMsIGFsc28gd2l0aCBhIDEwMDAgYnl0ZSBnYXAgZm9sbG93aW5nIGJlZm9yZSB0aGUKLUBzYW1wey50ZXh0fSBzZWN0aW9uIGZyb20gQGZpbGV7ZmlsZTN9LiAgVGhlIG5vdGF0aW9uIEBzYW1wez0gMHgxMjM0fQotc3BlY2lmaWVzIHdoYXQgZGF0YSB0byB3cml0ZSBpbiB0aGUgZ2FwcyAoQHB4cmVme091dHB1dCBTZWN0aW9uIEZpbGx9KS4KLQotQG5lZWQgMjAwMAotQG5vZGUgT3BlcmF0b3JzCi1Ac3Vic2VjdGlvbiBPcGVyYXRvcnMKLUBjaW5kZXggb3BlcmF0b3JzIGZvciBhcml0aG1ldGljCi1AY2luZGV4IGFyaXRobWV0aWMgb3BlcmF0b3JzCi1AY2luZGV4IHByZWNlZGVuY2UgaW4gZXhwcmVzc2lvbnMKLVRoZSBsaW5rZXIgcmVjb2duaXplcyB0aGUgc3RhbmRhcmQgQyBzZXQgb2YgYXJpdGhtZXRpYyBvcGVyYXRvcnMsIHdpdGgKLXRoZSBzdGFuZGFyZCBiaW5kaW5ncyBhbmQgcHJlY2VkZW5jZSBsZXZlbHM6Ci1AYyBURVhJMlJPRkYtS0lMTAotQGlmaW5mbwotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi1Ac21hbGxleGFtcGxlCi1wcmVjZWRlbmNlICAgICAgYXNzb2NpYXRpdml0eSAgIE9wZXJhdG9ycyAgICAgICAgICAgICAgICBOb3RlcwotKGhpZ2hlc3QpCi0xICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgICEgIC0gIH4gICAgICAgICAgICAgICAgICAoMSkKLTIgICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgKiAgLyAgJQotMyAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICArICAtCi00ICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgID4+ICA8PAotNSAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICA9PSAgIT0gID4gIDwgIDw9ICA+PQotNiAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICAmCi03ICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgIHwKLTggICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgJiYKLTkgICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgfHwKLTEwICAgICAgICAgICAgICByaWdodCAgICAgICAgICAgPyA6Ci0xMSAgICAgICAgICAgICAgcmlnaHQgICAgICAgICAgICY9ICArPSAgLT0gICo9ICAvPSAgICAgICAoMikKLShsb3dlc3QpCi1AZW5kIHNtYWxsZXhhbXBsZQotTm90ZXM6Ci0oMSkgUHJlZml4IG9wZXJhdG9ycyAKLSgyKSBAeHJlZntBc3NpZ25tZW50c30uCi1AYyBURVhJMlJPRkYtS0lMTAotQGVuZCBpZmluZm8KLUB0ZXgKLVx2c2tpcCBcYmFzZWxpbmVza2lwCi0lImxpc3BuYXJyb3dpbmciIGlzIHRoZSBleHRyYSBpbmRlbnQgdXNlZCBnZW5lcmFsbHkgZm9yIHNtYWxsZXhhbXBsZQotXGhza2lwXGxpc3BuYXJyb3dpbmdcdmJveHtcb2ZmaW50ZXJsaW5lc2tpcAotXGhydWxlCi1caGFsaWduCi17XHZydWxlIyZcc3RydXRcaGZpbFwgI1wgXGhmaWwmXHZydWxlIyZcc3RydXRcaGZpbFwgI1wgXGhmaWwmXHZydWxlIyZcc3RydXRcaGZpbFwge1x0dCAjfVwgXGhmaWwmXHZydWxlI1xjcgotaGVpZ2h0MnB0JlxvbWl0JiZcb21pdCYmXG9taXQmXGNyCi0mUHJlY2VkZW5jZSYmICBBc3NvY2lhdGl2aXR5ICAmJntccm0gT3BlcmF0b3JzfSZcY3IKLWhlaWdodDJwdCZcb21pdCYmXG9taXQmJlxvbWl0JlxjcgotXG5vYWxpZ257XGhydWxlfQotaGVpZ2h0MnB0JlxvbWl0JiZcb21pdCYmXG9taXQmXGNyCi0maGlnaGVzdCYmJiYmXGNyCi0lICcxNzYgaXMgdGlsZGUsICd+JyBpbiB0dCBmb250Ci0mMSYmbGVmdCYmXHFxdWFkLSAgICAgICAgICBcY2hhcicxNzZcICAgICAgIVxxcXVhZFxkYWcmXGNyIAotJjImJmxlZnQmJiogICAgICAgICAgLyAgICAgICAgXCUmXGNyCi0mMyYmbGVmdCYmKyAgICAgICAgICAtJlxjcgotJjQmJmxlZnQmJj4+ICAgICAgICAgPDwmXGNyCi0mNSYmbGVmdCYmPT0gICAgICAgICAhPSAgICAgICA+ICAgICAgPCAgICAgIDw9ICAgICAgPj0mXGNyCi0mNiYmbGVmdCYmXCYmXGNyCi0mNyYmbGVmdCYmfCZcY3IKLSY4JiZsZWZ0JiZ7XCZcJn0mXGNyCi0mOSYmbGVmdCYmfHwmXGNyCi0mMTAmJnJpZ2h0JiY/ICAgICAgICA6JlxjcgotJjExJiZyaWdodCYmXHFxdWFkXCY9ICAgICAgKz0gICAgICAgLT0gICAgICo9ICAgICAvPVxxcXVhZFxkZGFnJlxjcgotJmxvd2VzdCYmJiYmXGNyCi1oZWlnaHQycHQmXG9taXQmJlxvbWl0JiZcb21pdCZcY3J9Ci1caHJ1bGV9Ci1AZW5kIHRleAotQGlmdGV4Ci17Ci1Ab2JleWxpbmVzQHBhcnNraXA9MHB0QHBhcmluZGVudD0wcHQKLUBkYWdAcXVhZCBQcmVmaXggb3BlcmF0b3JzLgotQGRkYWdAcXVhZCBAeHJlZntBc3NpZ25tZW50c30uCi19Ci1AZW5kIGlmdGV4Ci1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLQotQG5vZGUgRXZhbHVhdGlvbgotQHN1YnNlY3Rpb24gRXZhbHVhdGlvbgotQGNpbmRleCBsYXp5IGV2YWx1YXRpb24KLUBjaW5kZXggZXhwcmVzc2lvbiBldmFsdWF0aW9uIG9yZGVyCi1UaGUgbGlua2VyIGV2YWx1YXRlcyBleHByZXNzaW9ucyBsYXppbHkuICBJdCBvbmx5IGNvbXB1dGVzIHRoZSB2YWx1ZSBvZgotYW4gZXhwcmVzc2lvbiB3aGVuIGFic29sdXRlbHkgbmVjZXNzYXJ5LgotCi1UaGUgbGlua2VyIG5lZWRzIHNvbWUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIHZhbHVlIG9mIHRoZSBzdGFydAotYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc2VjdGlvbiwgYW5kIHRoZSBvcmlnaW5zIGFuZCBsZW5ndGhzIG9mIG1lbW9yeQotcmVnaW9ucywgaW4gb3JkZXIgdG8gZG8gYW55IGxpbmtpbmcgYXQgYWxsLiAgVGhlc2UgdmFsdWVzIGFyZSBjb21wdXRlZAotYXMgc29vbiBhcyBwb3NzaWJsZSB3aGVuIHRoZSBsaW5rZXIgcmVhZHMgaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0KLUhvd2V2ZXIsIG90aGVyIHZhbHVlcyAoc3VjaCBhcyBzeW1ib2wgdmFsdWVzKSBhcmUgbm90IGtub3duIG9yIG5lZWRlZAotdW50aWwgYWZ0ZXIgc3RvcmFnZSBhbGxvY2F0aW9uLiAgU3VjaCB2YWx1ZXMgYXJlIGV2YWx1YXRlZCBsYXRlciwgd2hlbgotb3RoZXIgaW5mb3JtYXRpb24gKHN1Y2ggYXMgdGhlIHNpemVzIG9mIG91dHB1dCBzZWN0aW9ucykgaXMgYXZhaWxhYmxlCi1mb3IgdXNlIGluIHRoZSBzeW1ib2wgYXNzaWdubWVudCBleHByZXNzaW9uLgotCi1UaGUgc2l6ZXMgb2Ygc2VjdGlvbnMgY2Fubm90IGJlIGtub3duIHVudGlsIGFmdGVyIGFsbG9jYXRpb24sIHNvCi1hc3NpZ25tZW50cyBkZXBlbmRlbnQgdXBvbiB0aGVzZSBhcmUgbm90IHBlcmZvcm1lZCB1bnRpbCBhZnRlcgotYWxsb2NhdGlvbi4KLQotU29tZSBleHByZXNzaW9ucywgc3VjaCBhcyB0aG9zZSBkZXBlbmRpbmcgdXBvbiB0aGUgbG9jYXRpb24gY291bnRlcgotQHNhbXB7Ln0sIG11c3QgYmUgZXZhbHVhdGVkIGR1cmluZyBzZWN0aW9uIGFsbG9jYXRpb24uCi0KLUlmIHRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiBpcyByZXF1aXJlZCwgYnV0IHRoZSB2YWx1ZSBpcyBub3QKLWF2YWlsYWJsZSwgdGhlbiBhbiBlcnJvciByZXN1bHRzLiAgRm9yIGV4YW1wbGUsIGEgc2NyaXB0IGxpa2UgdGhlCi1mb2xsb3dpbmcKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMKLSAgQHsKLSAgICAudGV4dCA5K3RoaXNfaXNudF9jb25zdGFudCA6IAotICAgICAgQHsgKigudGV4dCkgQH0KLSAgQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdpbGwgY2F1c2UgdGhlIGVycm9yIG1lc3NhZ2UgQHNhbXB7bm9uIGNvbnN0YW50IGV4cHJlc3Npb24gZm9yIGluaXRpYWwKLWFkZHJlc3N9LgotCi1Abm9kZSBFeHByZXNzaW9uIFNlY3Rpb24KLUBzdWJzZWN0aW9uIFRoZSBTZWN0aW9uIG9mIGFuIEV4cHJlc3Npb24KLUBjaW5kZXggZXhwcmVzc2lvbiBzZWN0aW9ucwotQGNpbmRleCBhYnNvbHV0ZSBleHByZXNzaW9ucwotQGNpbmRleCByZWxhdGl2ZSBleHByZXNzaW9ucwotQGNpbmRleCBhYnNvbHV0ZSBhbmQgcmVsb2NhdGFibGUgc3ltYm9scwotQGNpbmRleCByZWxvY2F0YWJsZSBhbmQgYWJzb2x1dGUgc3ltYm9scwotQGNpbmRleCBzeW1ib2xzLCByZWxvY2F0YWJsZSBhbmQgYWJzb2x1dGUKLVdoZW4gdGhlIGxpbmtlciBldmFsdWF0ZXMgYW4gZXhwcmVzc2lvbiwgdGhlIHJlc3VsdCBpcyBlaXRoZXIgYWJzb2x1dGUKLW9yIHJlbGF0aXZlIHRvIHNvbWUgc2VjdGlvbi4gIEEgcmVsYXRpdmUgZXhwcmVzc2lvbiBpcyBleHByZXNzZWQgYXMgYQotZml4ZWQgb2Zmc2V0IGZyb20gdGhlIGJhc2Ugb2YgYSBzZWN0aW9uLgotCi1UaGUgcG9zaXRpb24gb2YgdGhlIGV4cHJlc3Npb24gd2l0aGluIHRoZSBsaW5rZXIgc2NyaXB0IGRldGVybWluZXMKLXdoZXRoZXIgaXQgaXMgYWJzb2x1dGUgb3IgcmVsYXRpdmUuICBBbiBleHByZXNzaW9uIHdoaWNoIGFwcGVhcnMgd2l0aGluCi1hbiBvdXRwdXQgc2VjdGlvbiBkZWZpbml0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBiYXNlIG9mIHRoZSBvdXRwdXQKLXNlY3Rpb24uICBBbiBleHByZXNzaW9uIHdoaWNoIGFwcGVhcnMgZWxzZXdoZXJlIHdpbGwgYmUgYWJzb2x1dGUuCi0KLUEgc3ltYm9sIHNldCB0byBhIHJlbGF0aXZlIGV4cHJlc3Npb24gd2lsbCBiZSByZWxvY2F0YWJsZSBpZiB5b3UgcmVxdWVzdAotcmVsb2NhdGFibGUgb3V0cHV0IHVzaW5nIHRoZSBAc2FtcHstcn0gb3B0aW9uLiAgVGhhdCBtZWFucyB0aGF0IGEKLWZ1cnRoZXIgbGluayBvcGVyYXRpb24gbWF5IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFRoZSBzeW1ib2wncwotc2VjdGlvbiB3aWxsIGJlIHRoZSBzZWN0aW9uIG9mIHRoZSByZWxhdGl2ZSBleHByZXNzaW9uLgotCi1BIHN5bWJvbCBzZXQgdG8gYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiB3aWxsIHJldGFpbiB0aGUgc2FtZSB2YWx1ZQotdGhyb3VnaCBhbnkgZnVydGhlciBsaW5rIG9wZXJhdGlvbi4gIFRoZSBzeW1ib2wgd2lsbCBiZSBhYnNvbHV0ZSwgYW5kCi13aWxsIG5vdCBoYXZlIGFueSBwYXJ0aWN1bGFyIGFzc29jaWF0ZWQgc2VjdGlvbi4KLQotWW91IGNhbiB1c2UgdGhlIGJ1aWx0aW4gZnVuY3Rpb24gQGNvZGV7QUJTT0xVVEV9IHRvIGZvcmNlIGFuIGV4cHJlc3Npb24KLXRvIGJlIGFic29sdXRlIHdoZW4gaXQgd291bGQgb3RoZXJ3aXNlIGJlIHJlbGF0aXZlLiAgRm9yIGV4YW1wbGUsIHRvCi1jcmVhdGUgYW4gYWJzb2x1dGUgc3ltYm9sIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBvdXRwdXQKLXNlY3Rpb24gQHNhbXB7LmRhdGF9OgotQHNtYWxsZXhhbXBsZQotU0VDVElPTlMKLSAgQHsKLSAgICAuZGF0YSA6IEB7ICooLmRhdGEpIF9lZGF0YSA9IEFCU09MVVRFKC4pOyBAfQotICBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotSWYgQHNhbXB7QUJTT0xVVEV9IHdlcmUgbm90IHVzZWQsIEBzYW1we19lZGF0YX0gd291bGQgYmUgcmVsYXRpdmUgdG8gdGhlCi1Ac2FtcHsuZGF0YX0gc2VjdGlvbi4KLQotQG5vZGUgQnVpbHRpbiBGdW5jdGlvbnMKLUBzdWJzZWN0aW9uIEJ1aWx0aW4gRnVuY3Rpb25zCi1AY2luZGV4IGZ1bmN0aW9ucyBpbiBleHByZXNzaW9ucwotVGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UgaW5jbHVkZXMgYSBudW1iZXIgb2YgYnVpbHRpbiBmdW5jdGlvbnMgZm9yCi11c2UgaW4gbGlua2VyIHNjcmlwdCBleHByZXNzaW9ucy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBBQlNPTFVURShAdmFye2V4cH0pCi1Aa2luZGV4IEFCU09MVVRFKEB2YXJ7ZXhwfSkKLUBjaW5kZXggZXhwcmVzc2lvbiwgYWJzb2x1dGUKLVJldHVybiB0aGUgYWJzb2x1dGUgKG5vbi1yZWxvY2F0YWJsZSwgYXMgb3Bwb3NlZCB0byBub24tbmVnYXRpdmUpIHZhbHVlCi1vZiB0aGUgZXhwcmVzc2lvbiBAdmFye2V4cH0uICBQcmltYXJpbHkgdXNlZnVsIHRvIGFzc2lnbiBhbiBhYnNvbHV0ZQotdmFsdWUgdG8gYSBzeW1ib2wgd2l0aGluIGEgc2VjdGlvbiBkZWZpbml0aW9uLCB3aGVyZSBzeW1ib2wgdmFsdWVzIGFyZQotbm9ybWFsbHkgc2VjdGlvbiByZWxhdGl2ZS4gIEB4cmVme0V4cHJlc3Npb24gU2VjdGlvbn0uCi0KLUBpdGVtIEFERFIoQHZhcntzZWN0aW9ufSkKLUBraW5kZXggQUREUihAdmFye3NlY3Rpb259KQotQGNpbmRleCBzZWN0aW9uIGFkZHJlc3MgaW4gZXhwcmVzc2lvbgotUmV0dXJuIHRoZSBhYnNvbHV0ZSBhZGRyZXNzICh0aGUgVk1BKSBvZiB0aGUgbmFtZWQgQHZhcntzZWN0aW9ufS4gIFlvdXIKLXNjcmlwdCBtdXN0IHByZXZpb3VzbHkgaGF2ZSBkZWZpbmVkIHRoZSBsb2NhdGlvbiBvZiB0aGF0IHNlY3Rpb24uICBJbgotdGhlIGZvbGxvd2luZyBleGFtcGxlLCBAY29kZXtzeW1ib2xfMX0gYW5kIEBjb2Rle3N5bWJvbF8yfSBhcmUgYXNzaWduZWQKLWlkZW50aWNhbCB2YWx1ZXM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TIEB7IEBkb3Rze30KLSAgLm91dHB1dDEgOgotICAgIEB7IAotICAgIHN0YXJ0X29mX291dHB1dF8xID0gQUJTT0xVVEUoLik7Ci0gICAgQGRvdHN7fQotICAgIEB9Ci0gIC5vdXRwdXQgOgotICAgIEB7Ci0gICAgc3ltYm9sXzEgPSBBRERSKC5vdXRwdXQxKTsKLSAgICBzeW1ib2xfMiA9IHN0YXJ0X29mX291dHB1dF8xOwotICAgIEB9Ci1AZG90c3t9IEB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbSBBTElHTihAdmFye2V4cH0pCi1Aa2luZGV4IEFMSUdOKEB2YXJ7ZXhwfSkKLUBjaW5kZXggcm91bmQgdXAgbG9jYXRpb24gY291bnRlcgotQGNpbmRleCBhbGlnbiBsb2NhdGlvbiBjb3VudGVyCi1SZXR1cm4gdGhlIGxvY2F0aW9uIGNvdW50ZXIgKEBjb2Rley59KSBhbGlnbmVkIHRvIHRoZSBuZXh0IEB2YXJ7ZXhwfQotYm91bmRhcnkuICBAdmFye2V4cH0gbXVzdCBiZSBhbiBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGEgcG93ZXIgb2YKLXR3by4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotQHNtYWxsZXhhbXBsZQotKC4gKyBAdmFye2V4cH0gLSAxKSAmIH4oQHZhcntleHB9IC0gMSkKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle0FMSUdOfSBkb2Vzbid0IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXItLS1pdCBqdXN0Ci1kb2VzIGFyaXRobWV0aWMgb24gaXQuICBIZXJlIGlzIGFuIGV4YW1wbGUgd2hpY2ggYWxpZ25zIHRoZSBvdXRwdXQKLUBjb2Rley5kYXRhfSBzZWN0aW9uIHRvIHRoZSBuZXh0IEBjb2RlezB4MjAwMH0gYnl0ZSBib3VuZGFyeSBhZnRlciB0aGUKLXByZWNlZGluZyBzZWN0aW9uIGFuZCBzZXRzIGEgdmFyaWFibGUgd2l0aGluIHRoZSBzZWN0aW9uIHRvIHRoZSBuZXh0Ci1AY29kZXsweDgwMDB9IGJvdW5kYXJ5IGFmdGVyIHRoZSBpbnB1dCBzZWN0aW9uczoKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMgQHsgQGRvdHN7fQotICAuZGF0YSBBTElHTigweDIwMDApOiBAewotICAgICooLmRhdGEpCi0gICAgdmFyaWFibGUgPSBBTElHTigweDgwMDApOwotICBAfQotQGRvdHN7fSBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhlIGZpcnN0IHVzZSBvZiBAY29kZXtBTElHTn0gaW4gdGhpcyBleGFtcGxlIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YKLWEgc2VjdGlvbiBiZWNhdXNlIGl0IGlzIHVzZWQgYXMgdGhlIG9wdGlvbmFsIEB2YXJ7YWRkcmVzc30gYXR0cmlidXRlIG9mCi1hIHNlY3Rpb24gZGVmaW5pdGlvbiAoQHB4cmVme091dHB1dCBTZWN0aW9uIEFkZHJlc3N9KS4gIFRoZSBzZWNvbmQgdXNlCi1vZiBAY29kZXtBTElHTn0gaXMgdXNlZCB0byBkZWZpbmVzIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4KLQotVGhlIGJ1aWx0aW4gZnVuY3Rpb24gQGNvZGV7TkVYVH0gaXMgY2xvc2VseSByZWxhdGVkIHRvIEBjb2Rle0FMSUdOfS4KLQotQGl0ZW0gQkxPQ0soQHZhcntleHB9KQotQGtpbmRleCBCTE9DSyhAdmFye2V4cH0pCi1UaGlzIGlzIGEgc3lub255bSBmb3IgQGNvZGV7QUxJR059LCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGxpbmtlcgotc2NyaXB0cy4gIEl0IGlzIG1vc3Qgb2Z0ZW4gc2VlbiB3aGVuIHNldHRpbmcgdGhlIGFkZHJlc3Mgb2YgYW4gb3V0cHV0Ci1zZWN0aW9uLgotCi1AaXRlbSBERUZJTkVEKEB2YXJ7c3ltYm9sfSkKLUBraW5kZXggREVGSU5FRChAdmFye3N5bWJvbH0pCi1AY2luZGV4IHN5bWJvbCBkZWZhdWx0cwotUmV0dXJuIDEgaWYgQHZhcntzeW1ib2x9IGlzIGluIHRoZSBsaW5rZXIgZ2xvYmFsIHN5bWJvbCB0YWJsZSBhbmQgaXMKLWRlZmluZWQsIG90aGVyd2lzZSByZXR1cm4gMC4gIFlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gcHJvdmlkZQotZGVmYXVsdCB2YWx1ZXMgZm9yIHN5bWJvbHMuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzY3JpcHQgZnJhZ21lbnQKLXNob3dzIGhvdyB0byBzZXQgYSBnbG9iYWwgc3ltYm9sIEBzYW1we2JlZ2lufSB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4KLXRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbi0tLWJ1dCBpZiBhIHN5bWJvbCBjYWxsZWQgQHNhbXB7YmVnaW59IGFscmVhZHkKLWV4aXN0ZWQsIGl0cyB2YWx1ZSBpcyBwcmVzZXJ2ZWQ6Ci0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMgQHsgQGRvdHN7fQotICAudGV4dCA6IEB7Ci0gICAgYmVnaW4gPSBERUZJTkVEKGJlZ2luKSA/IGJlZ2luIDogLiA7Ci0gICAgQGRvdHN7fQotICBAfQotICBAZG90c3t9Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0gTE9BREFERFIoQHZhcntzZWN0aW9ufSkKLUBraW5kZXggTE9BREFERFIoQHZhcntzZWN0aW9ufSkKLUBjaW5kZXggc2VjdGlvbiBsb2FkIGFkZHJlc3MgaW4gZXhwcmVzc2lvbgotUmV0dXJuIHRoZSBhYnNvbHV0ZSBMTUEgb2YgdGhlIG5hbWVkIEB2YXJ7c2VjdGlvbn0uICBUaGlzIGlzIG5vcm1hbGx5Ci10aGUgc2FtZSBhcyBAY29kZXtBRERSfSwgYnV0IGl0IG1heSBiZSBkaWZmZXJlbnQgaWYgdGhlIEBjb2Rle0FUfQotYXR0cmlidXRlIGlzIHVzZWQgaW4gdGhlIG91dHB1dCBzZWN0aW9uIGRlZmluaXRpb24gKEBweHJlZntPdXRwdXQKLVNlY3Rpb24gTE1BfSkuCi0KLUBraW5kZXggTUFYCi1AaXRlbSBNQVgoQHZhcntleHAxfSwgQHZhcntleHAyfSkKLVJldHVybnMgdGhlIG1heGltdW0gb2YgQHZhcntleHAxfSBhbmQgQHZhcntleHAyfS4KLQotQGtpbmRleCBNSU4KLUBpdGVtIE1JTihAdmFye2V4cDF9LCBAdmFye2V4cDJ9KQotUmV0dXJucyB0aGUgbWluaW11bSBvZiBAdmFye2V4cDF9IGFuZCBAdmFye2V4cDJ9LgotCi1AaXRlbSBORVhUKEB2YXJ7ZXhwfSkKLUBraW5kZXggTkVYVChAdmFye2V4cH0pCi1AY2luZGV4IHVuYWxsb2NhdGVkIGFkZHJlc3MsIG5leHQKLVJldHVybiB0aGUgbmV4dCB1bmFsbG9jYXRlZCBhZGRyZXNzIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiBAdmFye2V4cH0uCi1UaGlzIGZ1bmN0aW9uIGlzIGNsb3NlbHkgcmVsYXRlZCB0byBAY29kZXtBTElHTihAdmFye2V4cH0pfTsgdW5sZXNzIHlvdQotdXNlIHRoZSBAY29kZXtNRU1PUll9IGNvbW1hbmQgdG8gZGVmaW5lIGRpc2NvbnRpbnVvdXMgbWVtb3J5IGZvciB0aGUKLW91dHB1dCBmaWxlLCB0aGUgdHdvIGZ1bmN0aW9ucyBhcmUgZXF1aXZhbGVudC4KLQotQGl0ZW0gU0laRU9GKEB2YXJ7c2VjdGlvbn0pCi1Aa2luZGV4IFNJWkVPRihAdmFye3NlY3Rpb259KQotQGNpbmRleCBzZWN0aW9uIHNpemUKLVJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgbmFtZWQgQHZhcntzZWN0aW9ufSwgaWYgdGhhdCBzZWN0aW9uIGhhcwotYmVlbiBhbGxvY2F0ZWQuICBJZiB0aGUgc2VjdGlvbiBoYXMgbm90IGJlZW4gYWxsb2NhdGVkIHdoZW4gdGhpcyBpcwotZXZhbHVhdGVkLCB0aGUgbGlua2VyIHdpbGwgcmVwb3J0IGFuIGVycm9yLiAgSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLAotQGNvZGV7c3ltYm9sXzF9IGFuZCBAY29kZXtzeW1ib2xfMn0gYXJlIGFzc2lnbmVkIGlkZW50aWNhbCB2YWx1ZXM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TQHsgQGRvdHN7fQotICAub3V0cHV0IEB7Ci0gICAgLnN0YXJ0ID0gLiA7Ci0gICAgQGRvdHN7fQotICAgIC5lbmQgPSAuIDsKLSAgICBAfQotICBzeW1ib2xfMSA9IC5lbmQgLSAuc3RhcnQgOwotICBzeW1ib2xfMiA9IFNJWkVPRigub3V0cHV0KTsKLUBkb3Rze30gQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtIFNJWkVPRl9IRUFERVJTCi1AaXRlbXggc2l6ZW9mX2hlYWRlcnMKLUBraW5kZXggU0laRU9GX0hFQURFUlMKLUBjaW5kZXggaGVhZGVyIHNpemUKLVJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgb3V0cHV0IGZpbGUncyBoZWFkZXJzLiAgVGhpcyBpcwotaW5mb3JtYXRpb24gd2hpY2ggYXBwZWFycyBhdCB0aGUgc3RhcnQgb2YgdGhlIG91dHB1dCBmaWxlLiAgWW91IGNhbiB1c2UKLXRoaXMgbnVtYmVyIHdoZW4gc2V0dGluZyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc2VjdGlvbiwgaWYgeW91Ci1jaG9vc2UsIHRvIGZhY2lsaXRhdGUgcGFnaW5nLgotCi1AY2luZGV4IG5vdCBlbm91Z2ggcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzCi1AY2luZGV4IHByb2dyYW0gaGVhZGVycywgbm90IGVub3VnaCByb29tCi1XaGVuIHByb2R1Y2luZyBhbiBFTEYgb3V0cHV0IGZpbGUsIGlmIHRoZSBsaW5rZXIgc2NyaXB0IHVzZXMgdGhlCi1AY29kZXtTSVpFT0ZfSEVBREVSU30gYnVpbHRpbiBmdW5jdGlvbiwgdGhlIGxpbmtlciBtdXN0IGNvbXB1dGUgdGhlCi1udW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzIGJlZm9yZSBpdCBoYXMgZGV0ZXJtaW5lZCBhbGwgdGhlIHNlY3Rpb24KLWFkZHJlc3NlcyBhbmQgc2l6ZXMuICBJZiB0aGUgbGlua2VyIGxhdGVyIGRpc2NvdmVycyB0aGF0IGl0IG5lZWRzCi1hZGRpdGlvbmFsIHByb2dyYW0gaGVhZGVycywgaXQgd2lsbCByZXBvcnQgYW4gZXJyb3IgQHNhbXB7bm90IGVub3VnaAotcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzfS4gIFRvIGF2b2lkIHRoaXMgZXJyb3IsIHlvdSBtdXN0IGF2b2lkIHVzaW5nCi10aGUgQGNvZGV7U0laRU9GX0hFQURFUlN9IGZ1bmN0aW9uLCBvciB5b3UgbXVzdCByZXdvcmsgeW91ciBsaW5rZXIKLXNjcmlwdCB0byBhdm9pZCBmb3JjaW5nIHRoZSBsaW5rZXIgdG8gdXNlIGFkZGl0aW9uYWwgcHJvZ3JhbSBoZWFkZXJzLCBvcgoteW91IG11c3QgZGVmaW5lIHRoZSBwcm9ncmFtIGhlYWRlcnMgeW91cnNlbGYgdXNpbmcgdGhlIEBjb2Rle1BIRFJTfQotY29tbWFuZCAoQHB4cmVme1BIRFJTfSkuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEltcGxpY2l0IExpbmtlciBTY3JpcHRzCi1Ac2VjdGlvbiBJbXBsaWNpdCBMaW5rZXIgU2NyaXB0cwotQGNpbmRleCBpbXBsaWNpdCBsaW5rZXIgc2NyaXB0cwotSWYgeW91IHNwZWNpZnkgYSBsaW5rZXIgaW5wdXQgZmlsZSB3aGljaCB0aGUgbGlua2VyIGNhbiBub3QgcmVjb2duaXplIGFzCi1hbiBvYmplY3QgZmlsZSBvciBhbiBhcmNoaXZlIGZpbGUsIGl0IHdpbGwgdHJ5IHRvIHJlYWQgdGhlIGZpbGUgYXMgYQotbGlua2VyIHNjcmlwdC4gIElmIHRoZSBmaWxlIGNhbiBub3QgYmUgcGFyc2VkIGFzIGEgbGlua2VyIHNjcmlwdCwgdGhlCi1saW5rZXIgd2lsbCByZXBvcnQgYW4gZXJyb3IuCi0KLUFuIGltcGxpY2l0IGxpbmtlciBzY3JpcHQgd2lsbCBub3QgcmVwbGFjZSB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LgotCi1UeXBpY2FsbHkgYW4gaW1wbGljaXQgbGlua2VyIHNjcmlwdCB3b3VsZCBjb250YWluIG9ubHkgc3ltYm9sCi1hc3NpZ25tZW50cywgb3IgdGhlIEBjb2Rle0lOUFVUfSwgQGNvZGV7R1JPVVB9LCBvciBAY29kZXtWRVJTSU9OfQotY29tbWFuZHMuCi0KLUFueSBpbnB1dCBmaWxlcyByZWFkIGJlY2F1c2Ugb2YgYW4gaW1wbGljaXQgbGlua2VyIHNjcmlwdCB3aWxsIGJlIHJlYWQKLWF0IHRoZSBwb3NpdGlvbiBpbiB0aGUgY29tbWFuZCBsaW5lIHdoZXJlIHRoZSBpbXBsaWNpdCBsaW5rZXIgc2NyaXB0IHdhcwotcmVhZC4gIFRoaXMgY2FuIGFmZmVjdCBhcmNoaXZlIHNlYXJjaGluZy4KLQotQGlmc2V0IEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW50Ci1AY2hhcHRlciBNYWNoaW5lIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4IG1hY2hpbmUgZGVwZW5kZW5jaWVzCi1AY29kZXtsZH0gaGFzIGFkZGl0aW9uYWwgZmVhdHVyZXMgb24gc29tZSBwbGF0Zm9ybXM7IHRoZSBmb2xsb3dpbmcKLXNlY3Rpb25zIGRlc2NyaWJlIHRoZW0uICBNYWNoaW5lcyB3aGVyZSBAY29kZXtsZH0gaGFzIG5vIGFkZGl0aW9uYWwKLWZ1bmN0aW9uYWxpdHkgYXJlIG5vdCBsaXN0ZWQuCi0KLUBtZW51Ci0qIEg4LzMwMDo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rle2xkfSBhbmQgdGhlIEg4LzMwMAotKiBpOTYwOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXtsZH0gYW5kIHRoZSBJbnRlbCA5NjAgZmFtaWx5Ci0qIEFSTTo6CQkJCUBjb2Rle2xkfSBhbmQgdGhlIEFSTSBmYW1pbHkKLUBlbmQgbWVudQotQGVuZCBpZnNldAotCi1AYyBGSVhNRSEgIFRoaXMgY291bGQgdXNlIEByYWlzZXNlY3Rpb25zL0Bsb3dlcnNlY3Rpb25zLCBidXQgdGhlcmUgc2VlbXMgdG8gYmUgYSBjb25mbGljdAotQGMgICAgICAgICBiZXR3ZWVuIHRob3NlIGFuZCBub2RlLWRlZmF1bHRpbmcuCi1AaWZzZXQgSDgzMDAKLUBpZmNsZWFyIEdFTkVSSUMKLUByYWlzZXNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLQotQG5vZGUgSDgvMzAwCi1Ac2VjdGlvbiBAY29kZXtsZH0gYW5kIHRoZSBIOC8zMDAKLQotQGNpbmRleCBIOC8zMDAgc3VwcG9ydAotRm9yIHRoZSBIOC8zMDAsIEBjb2Rle2xkfSBjYW4gcGVyZm9ybSB0aGVzZSBnbG9iYWwgb3B0aW1pemF0aW9ucyB3aGVuCi15b3Ugc3BlY2lmeSB0aGUgQHNhbXB7LS1yZWxheH0gY29tbWFuZC1saW5lIG9wdGlvbi4KLQotQHRhYmxlIEBlbXBoCi1AY2luZGV4IHJlbGF4aW5nIG9uIEg4LzMwMAotQGl0ZW0gcmVsYXhpbmcgYWRkcmVzcyBtb2RlcwotQGNvZGV7bGR9IGZpbmRzIGFsbCBAY29kZXtqc3J9IGFuZCBAY29kZXtqbXB9IGluc3RydWN0aW9ucyB3aG9zZQotdGFyZ2V0cyBhcmUgd2l0aGluIGVpZ2h0IGJpdHMsIGFuZCB0dXJucyB0aGVtIGludG8gZWlnaHQtYml0Ci1wcm9ncmFtLWNvdW50ZXIgcmVsYXRpdmUgQGNvZGV7YnNyfSBhbmQgQGNvZGV7YnJhfSBpbnN0cnVjdGlvbnMsCi1yZXNwZWN0aXZlbHkuCi0KLUBjaW5kZXggc3ludGhlc2l6aW5nIG9uIEg4LzMwMAotQGl0ZW0gc3ludGhlc2l6aW5nIGluc3RydWN0aW9ucwotQGMgRklYTUU6IHNwZWNpZmljYWxseSBtb3YuYiwgb3IgYW55IG1vdiBpbnN0cnVjdGlvbnMgcmVhbGx5PwotQGNvZGV7bGR9IGZpbmRzIGFsbCBAY29kZXttb3YuYn0gaW5zdHJ1Y3Rpb25zIHdoaWNoIHVzZSB0aGUKLXNpeHRlZW4tYml0IGFic29sdXRlIGFkZHJlc3MgZm9ybSwgYnV0IHJlZmVyIHRvIHRoZSB0b3AKLXBhZ2Ugb2YgbWVtb3J5LCBhbmQgY2hhbmdlcyB0aGVtIHRvIHVzZSB0aGUgZWlnaHQtYml0IGFkZHJlc3MgZm9ybS4KLShUaGF0IGlzOiB0aGUgbGlua2VyIHR1cm5zIEBzYW1we21vdi5iIEBjb2Rle0BAfUB2YXJ7YWF9OjE2fSBpbnRvCi1Ac2FtcHttb3YuYiBAY29kZXtAQH1AdmFye2FhfTo4fSB3aGVuZXZlciB0aGUgYWRkcmVzcyBAdmFye2FhfSBpcyBpbiB0aGUKLXRvcCBwYWdlIG9mIG1lbW9yeSkuCi1AZW5kIHRhYmxlCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEhpdGFjaGkKLUBjIFRoaXMgc3R1ZmYgaXMgcG9pbnRsZXNzIHRvIHNheSB1bmxlc3MgeW91J3JlIGVzcGVjaWFsbHkgY29uY2VybmVkCi1AYyB3aXRoIEhpdGFjaGkgY2hpcHM7IGRvbid0IGVuYWJsZSBpdCBmb3IgZ2VuZXJpYyBjYXNlLCBwbGVhc2UuCi1Abm9kZSBIaXRhY2hpCi1AY2hhcHRlciBAY29kZXtsZH0gYW5kIG90aGVyIEhpdGFjaGkgY2hpcHMKLQotQGNvZGV7bGR9IGFsc28gc3VwcG9ydHMgdGhlIEg4LzMwMEgsIHRoZSBIOC81MDAsIGFuZCB0aGUgSGl0YWNoaSBTSC4gIE5vCi1zcGVjaWFsIGZlYXR1cmVzLCBjb21tYW5kcywgb3IgY29tbWFuZC1saW5lIG9wdGlvbnMgYXJlIHJlcXVpcmVkIGZvcgotdGhlc2UgY2hpcHMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQGlmc2V0IEk5NjAKLUBpZmNsZWFyIEdFTkVSSUMKLUByYWlzZXNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLQotQG5vZGUgaTk2MAotQHNlY3Rpb24gQGNvZGV7bGR9IGFuZCB0aGUgSW50ZWwgOTYwIGZhbWlseQotCi1AY2luZGV4IGk5NjAgc3VwcG9ydAotCi1Zb3UgY2FuIHVzZSB0aGUgQHNhbXB7LUFAdmFye2FyY2hpdGVjdHVyZX19IGNvbW1hbmQgbGluZSBvcHRpb24gdG8KLXNwZWNpZnkgb25lIG9mIHRoZSB0d28tbGV0dGVyIG5hbWVzIGlkZW50aWZ5aW5nIG1lbWJlcnMgb2YgdGhlIDk2MAotZmFtaWx5OyB0aGUgb3B0aW9uIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBvdXRwdXQgdGFyZ2V0LCBhbmQgd2FybnMgb2YgYW55Ci1pbmNvbXBhdGlibGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBpbnB1dCBmaWxlcy4gIEl0IGFsc28gbW9kaWZpZXMgdGhlCi1saW5rZXIncyBzZWFyY2ggc3RyYXRlZ3kgZm9yIGFyY2hpdmUgbGlicmFyaWVzLCB0byBzdXBwb3J0IHRoZSB1c2Ugb2YKLWxpYnJhcmllcyBzcGVjaWZpYyB0byBlYWNoIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlLCBieSBpbmNsdWRpbmcgaW4gdGhlCi1zZWFyY2ggbG9vcCBuYW1lcyBzdWZmaXhlZCB3aXRoIHRoZSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIGFyY2hpdGVjdHVyZS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdXIgQGNvZGV7bGR9IGNvbW1hbmQgbGluZSBpbmNsdWRlZCBAd3tAc2FtcHstQUNBfX0gYXMKLXdlbGwgYXMgQHd7QHNhbXB7LWx0cnl9fSwgdGhlIGxpbmtlciB3b3VsZCBsb29rIChpbiBpdHMgYnVpbHQtaW4gc2VhcmNoCi1wYXRocywgYW5kIGluIGFueSBwYXRocyB5b3Ugc3BlY2lmeSB3aXRoIEBzYW1wey1MfSkgZm9yIGEgbGlicmFyeSB3aXRoCi10aGUgbmFtZXMKLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi10cnkKLWxpYnRyeS5hCi10cnljYQotbGlidHJ5Y2EuYQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGUgZmlyc3QgdHdvIHBvc3NpYmlsaXRpZXMgd291bGQgYmUgY29uc2lkZXJlZCBpbiBhbnkgZXZlbnQ7IHRoZSBsYXN0Ci10d28gYXJlIGR1ZSB0byB0aGUgdXNlIG9mIEB3e0BzYW1wey1BQ0F9fS4KLQotWW91IGNhbiBtZWFuaW5nZnVsbHkgdXNlIEBzYW1wey1BfSBtb3JlIHRoYW4gb25jZSBvbiBhIGNvbW1hbmQgbGluZSwgc2luY2UKLXRoZSA5NjAgYXJjaGl0ZWN0dXJlIGZhbWlseSBhbGxvd3MgY29tYmluYXRpb24gb2YgdGFyZ2V0IGFyY2hpdGVjdHVyZXM7IGVhY2gKLXVzZSB3aWxsIGFkZCBhbm90aGVyIHBhaXIgb2YgbmFtZSB2YXJpYW50cyB0byBzZWFyY2ggZm9yIHdoZW4gQHd7QHNhbXB7LWx9fQotc3BlY2lmaWVzIGEgbGlicmFyeS4KLQotQGNpbmRleCBAY29kZXstLXJlbGF4fSBvbiBpOTYwCi1AY2luZGV4IHJlbGF4aW5nIG9uIGk5NjAKLUBjb2Rle2xkfSBzdXBwb3J0cyB0aGUgQHNhbXB7LS1yZWxheH0gb3B0aW9uIGZvciB0aGUgaTk2MCBmYW1pbHkuICBJZgoteW91IHNwZWNpZnkgQHNhbXB7LS1yZWxheH0sIEBjb2Rle2xkfSBmaW5kcyBhbGwgQGNvZGV7YmFseH0gYW5kCi1AY29kZXtjYWx4fSBpbnN0cnVjdGlvbnMgd2hvc2UgdGFyZ2V0cyBhcmUgd2l0aGluIDI0IGJpdHMsIGFuZCB0dXJucwotdGhlbSBpbnRvIDI0LWJpdCBwcm9ncmFtLWNvdW50ZXIgcmVsYXRpdmUgQGNvZGV7YmFsfSBhbmQgQGNvZGV7Y2FsfQotaW5zdHJ1Y3Rpb25zLCByZXNwZWN0aXZlbHkuICBAY29kZXtsZH0gYWxzbyB0dXJucyBAY29kZXtjYWx9Ci1pbnN0cnVjdGlvbnMgaW50byBAY29kZXtiYWx9IGluc3RydWN0aW9ucyB3aGVuIGl0IGRldGVybWluZXMgdGhhdCB0aGUKLXRhcmdldCBzdWJyb3V0aW5lIGlzIGEgbGVhZiByb3V0aW5lICh0aGF0IGlzLCB0aGUgdGFyZ2V0IHN1YnJvdXRpbmUgZG9lcwotbm90IGl0c2VsZiBjYWxsIGFueSBzdWJyb3V0aW5lcykuCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgR0VORVJJQwotQHJhaXNlc2VjdGlvbnMKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBBUk0KLUBzZWN0aW9uIEBjb2Rle2xkfSdzIHN1cHBvcnQgZm9yIGludGVyd29ya2luZyBiZXR3ZWVuIEFSTSBhbmQgVGh1bWIgY29kZQotCi1AY2luZGV4IEFSTSBpbnRlcndvcmtpbmcgc3VwcG9ydAotQGNpbmRleCAtLXN1cHBvcnQtb2xkLWNvZGUKLUZvciB0aGUgQVJNLCBAY29kZXtsZH0gd2lsbCBnZW5lcmF0ZSBjb2RlIHN0dWJzIHRvIGFsbG93IGZ1bmN0aW9ucyBjYWxscwotYmV0d2VlbSBBUk0gYW5kIFRodW1iIGNvZGUuICBUaGVzZSBzdHVicyBvbmx5IHdvcmsgd2l0aCBjb2RlIHRoYXQgaGFzCi1iZWVuIGNvbXBpbGVkIGFuZCBhc3NlbWJsZWQgd2l0aCB0aGUgQHNhbXB7LW10aHVtYi1pbnRlcndvcmt9IGNvbW1hbmQKLWxpbmUgb3B0aW9uLiAgSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGxpbmsgd2l0aCBvbGQgQVJNIG9iamVjdCBmaWxlcyBvcgotbGlicmFyaWVzLCB3aGljaCBoYXZlIG5vdCBiZWVuIGNvbXBpbGVkIHdpdGggdGhlIC1tdGh1bWItaW50ZXJ3b3JrCi1vcHRpb24gdGhlbiB0aGUgQHNhbXB7LS1zdXBwb3J0LW9sZC1jb2RlfSBjb21tYW5kIGxpbmUgc3dpdGNoIHNob3VsZCBiZQotZ2l2ZW4gdG8gdGhlIGxpbmtlci4gIFRoaXMgd2lsbCBtYWtlIGl0IGdlbmVyYXRlIGxhcmdlciBzdHViIGZ1bmN0aW9ucwotd2hpY2ggd2lsbCB3b3JrIHdpdGggbm9uLWludGVyd29ya2luZyBhd2FyZSBBUk0gY29kZS4gIE5vdGUsIGhvd2V2ZXIsCi10aGUgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgZ2VuZXJhdGluZyBzdHVicyBmb3IgZnVuY3Rpb24gY2FsbHMgdG8KLW5vbi1pbnRlcndvcmtpbmcgYXdhcmUgVGh1bWIgY29kZS4KLQotQGlmY2xlYXIgR0VORVJJQwotQGxvd2Vyc2VjdGlvbnMKLUBlbmQgaWZjbGVhcgotCi1AaWZjbGVhciBTaW5nbGVGb3JtYXQKLUBub2RlIEJGRAotQGNoYXB0ZXIgQkZECi0KLUBjaW5kZXggYmFjayBlbmQKLUBjaW5kZXggb2JqZWN0IGZpbGUgbWFuYWdlbWVudAotQGNpbmRleCBvYmplY3QgZm9ybWF0cyBhdmFpbGFibGUKLUBraW5kZXggb2JqZHVtcCAtaQotVGhlIGxpbmtlciBhY2Nlc3NlcyBvYmplY3QgYW5kIGFyY2hpdmUgZmlsZXMgdXNpbmcgdGhlIEJGRCBsaWJyYXJpZXMuCi1UaGVzZSBsaWJyYXJpZXMgYWxsb3cgdGhlIGxpbmtlciB0byB1c2UgdGhlIHNhbWUgcm91dGluZXMgdG8gb3BlcmF0ZSBvbgotb2JqZWN0IGZpbGVzIHdoYXRldmVyIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuICBBIGRpZmZlcmVudCBvYmplY3QgZmlsZQotZm9ybWF0IGNhbiBiZSBzdXBwb3J0ZWQgc2ltcGx5IGJ5IGNyZWF0aW5nIGEgbmV3IEJGRCBiYWNrIGVuZCBhbmQgYWRkaW5nCi1pdCB0byB0aGUgbGlicmFyeS4gIFRvIGNvbnNlcnZlIHJ1bnRpbWUgbWVtb3J5LCBob3dldmVyLCB0aGUgbGlua2VyIGFuZAotYXNzb2NpYXRlZCB0b29scyBhcmUgdXN1YWxseSBjb25maWd1cmVkIHRvIHN1cHBvcnQgb25seSBhIHN1YnNldCBvZiB0aGUKLW9iamVjdCBmaWxlIGZvcm1hdHMgYXZhaWxhYmxlLiAgWW91IGNhbiB1c2UgQGNvZGV7b2JqZHVtcCAtaX0KLShAcHhyZWZ7b2JqZHVtcCwsb2JqZHVtcCxiaW51dGlscy5pbmZvLFRoZSBHTlUgQmluYXJ5IFV0aWxpdGllc30pIHRvCi1saXN0IGFsbCB0aGUgZm9ybWF0cyBhdmFpbGFibGUgZm9yIHlvdXIgY29uZmlndXJhdGlvbi4KLQotQGNpbmRleCBCRkQgcmVxdWlyZW1lbnRzCi1AY2luZGV4IHJlcXVpcmVtZW50cyBmb3IgQkZECi1BcyB3aXRoIG1vc3QgaW1wbGVtZW50YXRpb25zLCBCRkQgaXMgYSBjb21wcm9taXNlIGJldHdlZW4KLXNldmVyYWwgY29uZmxpY3RpbmcgcmVxdWlyZW1lbnRzLiBUaGUgbWFqb3IgZmFjdG9yIGluZmx1ZW5jaW5nCi1CRkQgZGVzaWduIHdhcyBlZmZpY2llbmN5OiBhbnkgdGltZSB1c2VkIGNvbnZlcnRpbmcgYmV0d2VlbgotZm9ybWF0cyBpcyB0aW1lIHdoaWNoIHdvdWxkIG5vdCBoYXZlIGJlZW4gc3BlbnQgaGFkIEJGRCBub3QKLWJlZW4gaW52b2x2ZWQuIFRoaXMgaXMgcGFydGx5IG9mZnNldCBieSBhYnN0cmFjdGlvbiBwYXliYWNrOyBzaW5jZQotQkZEIHNpbXBsaWZpZXMgYXBwbGljYXRpb25zIGFuZCBiYWNrIGVuZHMsIG1vcmUgdGltZSBhbmQgY2FyZQotbWF5IGJlIHNwZW50IG9wdGltaXppbmcgYWxnb3JpdGhtcyBmb3IgYSBncmVhdGVyIHNwZWVkLgotCi1PbmUgbWlub3IgYXJ0aWZhY3Qgb2YgdGhlIEJGRCBzb2x1dGlvbiB3aGljaCB5b3Ugc2hvdWxkIGJlYXIgaW4KLW1pbmQgaXMgdGhlIHBvdGVudGlhbCBmb3IgaW5mb3JtYXRpb24gbG9zcy4gIFRoZXJlIGFyZSB0d28gcGxhY2VzIHdoZXJlCi11c2VmdWwgaW5mb3JtYXRpb24gY2FuIGJlIGxvc3QgdXNpbmcgdGhlIEJGRCBtZWNoYW5pc206IGR1cmluZwotY29udmVyc2lvbiBhbmQgZHVyaW5nIG91dHB1dC4gQHhyZWZ7QkZEIGluZm9ybWF0aW9uIGxvc3N9LgotCi1AbWVudQotKiBCRkQgb3V0bGluZTo6ICAgICAgICAgICAgICAgICBIb3cgaXQgd29ya3M6IGFuIG91dGxpbmUgb2YgQkZECi1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIG91dGxpbmUKLUBzZWN0aW9uIEhvdyBpdCB3b3JrczogYW4gb3V0bGluZSBvZiBCRkQKLUBjaW5kZXggb3BlbmluZyBvYmplY3QgZmlsZXMKLUBpbmNsdWRlIGJmZHN1bW0udGV4aQotQGVuZCBpZmNsZWFyCi0KLUBub2RlIFJlcG9ydGluZyBCdWdzCi1AY2hhcHRlciBSZXBvcnRpbmcgQnVncwotQGNpbmRleCBidWdzIGluIEBjb2Rle2xkfQotQGNpbmRleCByZXBvcnRpbmcgYnVncyBpbiBAY29kZXtsZH0KLQotWW91ciBidWcgcmVwb3J0cyBwbGF5IGFuIGVzc2VudGlhbCByb2xlIGluIG1ha2luZyBAY29kZXtsZH0gcmVsaWFibGUuCi0KLVJlcG9ydGluZyBhIGJ1ZyBtYXkgaGVscCB5b3UgYnkgYnJpbmdpbmcgYSBzb2x1dGlvbiB0byB5b3VyIHByb2JsZW0sIG9yCi1pdCBtYXkgbm90LiAgQnV0IGluIGFueSBjYXNlIHRoZSBwcmluY2lwYWwgZnVuY3Rpb24gb2YgYSBidWcgcmVwb3J0IGlzCi10byBoZWxwIHRoZSBlbnRpcmUgY29tbXVuaXR5IGJ5IG1ha2luZyB0aGUgbmV4dCB2ZXJzaW9uIG9mIEBjb2Rle2xkfQotd29yayBiZXR0ZXIuICBCdWcgcmVwb3J0cyBhcmUgeW91ciBjb250cmlidXRpb24gdG8gdGhlIG1haW50ZW5hbmNlIG9mCi1AY29kZXtsZH0uCi0KLUluIG9yZGVyIGZvciBhIGJ1ZyByZXBvcnQgdG8gc2VydmUgaXRzIHB1cnBvc2UsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCi1pbmZvcm1hdGlvbiB0aGF0IGVuYWJsZXMgdXMgdG8gZml4IHRoZSBidWcuCi0KLUBtZW51Ci0qIEJ1ZyBDcml0ZXJpYTo6ICAgICAgICAgICAgICAgIEhhdmUgeW91IGZvdW5kIGEgYnVnPwotKiBCdWcgUmVwb3J0aW5nOjogICAgICAgICAgICAgICBIb3cgdG8gcmVwb3J0IGJ1Z3MKLUBlbmQgbWVudQotCi1Abm9kZSBCdWcgQ3JpdGVyaWEKLUBzZWN0aW9uIEhhdmUgeW91IGZvdW5kIGEgYnVnPwotQGNpbmRleCBidWcgY3JpdGVyaWEKLQotSWYgeW91IGFyZSBub3Qgc3VyZSB3aGV0aGVyIHlvdSBoYXZlIGZvdW5kIGEgYnVnLCBoZXJlIGFyZSBzb21lIGd1aWRlbGluZXM6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBjaW5kZXggZmF0YWwgc2lnbmFsCi1AY2luZGV4IGxpbmtlciBjcmFzaAotQGNpbmRleCBjcmFzaCBvZiBsaW5rZXIKLUBpdGVtCi1JZiB0aGUgbGlua2VyIGdldHMgYSBmYXRhbCBzaWduYWwsIGZvciBhbnkgaW5wdXQgd2hhdGV2ZXIsIHRoYXQgaXMgYQotQGNvZGV7bGR9IGJ1Zy4gIFJlbGlhYmxlIGxpbmtlcnMgbmV2ZXIgY3Jhc2guCi0KLUBjaW5kZXggZXJyb3Igb24gdmFsaWQgaW5wdXQKLUBpdGVtCi1JZiBAY29kZXtsZH0gcHJvZHVjZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdmFsaWQgaW5wdXQsIHRoYXQgaXMgYSBidWcuCi0KLUBjaW5kZXggaW52YWxpZCBpbnB1dAotQGl0ZW0KLUlmIEBjb2Rle2xkfSBkb2VzIG5vdCBwcm9kdWNlIGFuIGVycm9yIG1lc3NhZ2UgZm9yIGludmFsaWQgaW5wdXQsIHRoYXQKLW1heSBiZSBhIGJ1Zy4gIEluIHRoZSBnZW5lcmFsIGNhc2UsIHRoZSBsaW5rZXIgY2FuIG5vdCB2ZXJpZnkgdGhhdAotb2JqZWN0IGZpbGVzIGFyZSBjb3JyZWN0LgotCi1AaXRlbQotSWYgeW91IGFyZSBhbiBleHBlcmllbmNlZCB1c2VyIG9mIGxpbmtlcnMsIHlvdXIgc3VnZ2VzdGlvbnMgZm9yCi1pbXByb3ZlbWVudCBvZiBAY29kZXtsZH0gYXJlIHdlbGNvbWUgaW4gYW55IGNhc2UuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgQnVnIFJlcG9ydGluZwotQHNlY3Rpb24gSG93IHRvIHJlcG9ydCBidWdzCi1AY2luZGV4IGJ1ZyByZXBvcnRzCi1AY2luZGV4IEBjb2Rle2xkfSBidWdzLCByZXBvcnRpbmcKLQotQSBudW1iZXIgb2YgY29tcGFuaWVzIGFuZCBpbmRpdmlkdWFscyBvZmZlciBzdXBwb3J0IGZvciBAc2N7Z251fQotcHJvZHVjdHMuICBJZiB5b3Ugb2J0YWluZWQgQGNvZGV7bGR9IGZyb20gYSBzdXBwb3J0IG9yZ2FuaXphdGlvbiwgd2UKLXJlY29tbWVuZCB5b3UgY29udGFjdCB0aGF0IG9yZ2FuaXphdGlvbiBmaXJzdC4KLQotWW91IGNhbiBmaW5kIGNvbnRhY3QgaW5mb3JtYXRpb24gZm9yIG1hbnkgc3VwcG9ydCBjb21wYW5pZXMgYW5kCi1pbmRpdmlkdWFscyBpbiB0aGUgZmlsZSBAZmlsZXtldGMvU0VSVklDRX0gaW4gdGhlIEBzY3tnbnV9IEVtYWNzCi1kaXN0cmlidXRpb24uCi0KLU90aGVyd2lzZSwgc2VuZCBidWcgcmVwb3J0cyBmb3IgQGNvZGV7bGR9IHRvCi1Ac2FtcHtidWctZ251LXV0aWxzQEBnbnUub3JnfS4KLQotVGhlIGZ1bmRhbWVudGFsIHByaW5jaXBsZSBvZiByZXBvcnRpbmcgYnVncyB1c2VmdWxseSBpcyB0aGlzOgotQHN0cm9uZ3tyZXBvcnQgYWxsIHRoZSBmYWN0c30uICBJZiB5b3UgYXJlIG5vdCBzdXJlIHdoZXRoZXIgdG8gc3RhdGUgYQotZmFjdCBvciBsZWF2ZSBpdCBvdXQsIHN0YXRlIGl0IQotCi1PZnRlbiBwZW9wbGUgb21pdCBmYWN0cyBiZWNhdXNlIHRoZXkgdGhpbmsgdGhleSBrbm93IHdoYXQgY2F1c2VzIHRoZQotcHJvYmxlbSBhbmQgYXNzdW1lIHRoYXQgc29tZSBkZXRhaWxzIGRvIG5vdCBtYXR0ZXIuICBUaHVzLCB5b3UgbWlnaHQKLWFzc3VtZSB0aGF0IHRoZSBuYW1lIG9mIGEgc3ltYm9sIHlvdSB1c2UgaW4gYW4gZXhhbXBsZSBkb2VzIG5vdCBtYXR0ZXIuCi1XZWxsLCBwcm9iYWJseSBpdCBkb2VzIG5vdCwgYnV0IG9uZSBjYW5ub3QgYmUgc3VyZS4gIFBlcmhhcHMgdGhlIGJ1ZyBpcwotYSBzdHJheSBtZW1vcnkgcmVmZXJlbmNlIHdoaWNoIGhhcHBlbnMgdG8gZmV0Y2ggZnJvbSB0aGUgbG9jYXRpb24gd2hlcmUKLXRoYXQgbmFtZSBpcyBzdG9yZWQgaW4gbWVtb3J5OyBwZXJoYXBzLCBpZiB0aGUgbmFtZSB3ZXJlIGRpZmZlcmVudCwgdGhlCi1jb250ZW50cyBvZiB0aGF0IGxvY2F0aW9uIHdvdWxkIGZvb2wgdGhlIGxpbmtlciBpbnRvIGRvaW5nIHRoZSByaWdodAotdGhpbmcgZGVzcGl0ZSB0aGUgYnVnLiAgUGxheSBpdCBzYWZlIGFuZCBnaXZlIGEgc3BlY2lmaWMsIGNvbXBsZXRlCi1leGFtcGxlLiAgVGhhdCBpcyB0aGUgZWFzaWVzdCB0aGluZyBmb3IgeW91IHRvIGRvLCBhbmQgdGhlIG1vc3QgaGVscGZ1bC4KLQotS2VlcCBpbiBtaW5kIHRoYXQgdGhlIHB1cnBvc2Ugb2YgYSBidWcgcmVwb3J0IGlzIHRvIGVuYWJsZSB1cyB0byBmaXggdGhlIGJ1ZyBpZgotaXQgaXMgbmV3IHRvIHVzLiAgVGhlcmVmb3JlLCBhbHdheXMgd3JpdGUgeW91ciBidWcgcmVwb3J0cyBvbiB0aGUgYXNzdW1wdGlvbgotdGhhdCB0aGUgYnVnIGhhcyBub3QgYmVlbiByZXBvcnRlZCBwcmV2aW91c2x5LgotCi1Tb21ldGltZXMgcGVvcGxlIGdpdmUgYSBmZXcgc2tldGNoeSBmYWN0cyBhbmQgYXNrLCBgYERvZXMgdGhpcyByaW5nIGEKLWJlbGw/JycgIFRob3NlIGJ1ZyByZXBvcnRzIGFyZSB1c2VsZXNzLCBhbmQgd2UgdXJnZSBldmVyeW9uZSB0bwotQGVtcGh7cmVmdXNlIHRvIHJlc3BvbmQgdG8gdGhlbX0gZXhjZXB0IHRvIGNoaWRlIHRoZSBzZW5kZXIgdG8gcmVwb3J0Ci1idWdzIHByb3Blcmx5LgotCi1UbyBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcsIHlvdSBzaG91bGQgaW5jbHVkZSBhbGwgdGhlc2UgdGhpbmdzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotVGhlIHZlcnNpb24gb2YgQGNvZGV7bGR9LiAgQGNvZGV7bGR9IGFubm91bmNlcyBpdCBpZiB5b3Ugc3RhcnQgaXQgd2l0aAotdGhlIEBzYW1wey0tdmVyc2lvbn0gYXJndW1lbnQuCi0KLVdpdGhvdXQgdGhpcywgd2Ugd2lsbCBub3Qga25vdyB3aGV0aGVyIHRoZXJlIGlzIGFueSBwb2ludCBpbiBsb29raW5nIGZvcgotdGhlIGJ1ZyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIEBjb2Rle2xkfS4KLQotQGl0ZW0KLUFueSBwYXRjaGVzIHlvdSBtYXkgaGF2ZSBhcHBsaWVkIHRvIHRoZSBAY29kZXtsZH0gc291cmNlLCBpbmNsdWRpbmcgYW55Ci1wYXRjaGVzIG1hZGUgdG8gdGhlIEBjb2Rle0JGRH0gbGlicmFyeS4KLQotQGl0ZW0KLVRoZSB0eXBlIG9mIG1hY2hpbmUgeW91IGFyZSB1c2luZywgYW5kIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG5hbWUgYW5kCi12ZXJzaW9uIG51bWJlci4KLQotQGl0ZW0KLVdoYXQgY29tcGlsZXIgKGFuZCBpdHMgdmVyc2lvbikgd2FzIHVzZWQgdG8gY29tcGlsZSBAY29kZXtsZH0tLS1lLmcuCi1gYEBjb2Rle2djYy0yLjd9JycuCi0KLUBpdGVtCi1UaGUgY29tbWFuZCBhcmd1bWVudHMgeW91IGdhdmUgdGhlIGxpbmtlciB0byBsaW5rIHlvdXIgZXhhbXBsZSBhbmQKLW9ic2VydmUgdGhlIGJ1Zy4gIFRvIGd1YXJhbnRlZSB5b3Ugd2lsbCBub3Qgb21pdCBzb21ldGhpbmcgaW1wb3J0YW50LAotbGlzdCB0aGVtIGFsbC4gIEEgY29weSBvZiB0aGUgTWFrZWZpbGUgKG9yIHRoZSBvdXRwdXQgZnJvbSBtYWtlKSBpcwotc3VmZmljaWVudC4KLQotSWYgd2Ugd2VyZSB0byB0cnkgdG8gZ3Vlc3MgdGhlIGFyZ3VtZW50cywgd2Ugd291bGQgcHJvYmFibHkgZ3Vlc3Mgd3JvbmcKLWFuZCB0aGVuIHdlIG1pZ2h0IG5vdCBlbmNvdW50ZXIgdGhlIGJ1Zy4KLQotQGl0ZW0KLUEgY29tcGxldGUgaW5wdXQgZmlsZSwgb3Igc2V0IG9mIGlucHV0IGZpbGVzLCB0aGF0IHdpbGwgcmVwcm9kdWNlIHRoZQotYnVnLiAgSXQgaXMgZ2VuZXJhbGx5IG1vc3QgaGVscGZ1bCB0byBzZW5kIHRoZSBhY3R1YWwgb2JqZWN0IGZpbGVzLAotdXVlbmNvZGVkIGlmIG5lY2Vzc2FyeSB0byBnZXQgdGhlbSB0aHJvdWdoIHRoZSBtYWlsIHN5c3RlbS4gIE1ha2luZyB0aGVtCi1hdmFpbGFibGUgZm9yIGFub255bW91cyBGVFAgaXMgbm90IGFzIGdvb2QsIGJ1dCBtYXkgYmUgdGhlIG9ubHkKLXJlYXNvbmFibGUgY2hvaWNlIGZvciBsYXJnZSBvYmplY3QgZmlsZXMuCi0KLUlmIHRoZSBzb3VyY2UgZmlsZXMgd2VyZSBhc3NlbWJsZWQgdXNpbmcgQGNvZGV7Z2FzfSBvciBjb21waWxlZCB1c2luZwotQGNvZGV7Z2NjfSwgdGhlbiBpdCBtYXkgYmUgT0sgdG8gc2VuZCB0aGUgc291cmNlIGZpbGVzIHJhdGhlciB0aGFuIHRoZQotb2JqZWN0IGZpbGVzLiAgSW4gdGhpcyBjYXNlLCBiZSBzdXJlIHRvIHNheSBleGFjdGx5IHdoYXQgdmVyc2lvbiBvZgotQGNvZGV7Z2FzfSBvciBAY29kZXtnY2N9IHdhcyB1c2VkIHRvIHByb2R1Y2UgdGhlIG9iamVjdCBmaWxlcy4gIEFsc28gc2F5Ci1ob3cgQGNvZGV7Z2FzfSBvciBAY29kZXtnY2N9IHdlcmUgY29uZmlndXJlZC4KLQotQGl0ZW0KLUEgZGVzY3JpcHRpb24gb2Ygd2hhdCBiZWhhdmlvciB5b3Ugb2JzZXJ2ZSB0aGF0IHlvdSBiZWxpZXZlIGlzCi1pbmNvcnJlY3QuICBGb3IgZXhhbXBsZSwgYGBJdCBnZXRzIGEgZmF0YWwgc2lnbmFsLicnCi0KLU9mIGNvdXJzZSwgaWYgdGhlIGJ1ZyBpcyB0aGF0IEBjb2Rle2xkfSBnZXRzIGEgZmF0YWwgc2lnbmFsLCB0aGVuIHdlCi13aWxsIGNlcnRhaW5seSBub3RpY2UgaXQuICBCdXQgaWYgdGhlIGJ1ZyBpcyBpbmNvcnJlY3Qgb3V0cHV0LCB3ZSBtaWdodAotbm90IG5vdGljZSB1bmxlc3MgaXQgaXMgZ2xhcmluZ2x5IHdyb25nLiAgWW91IG1pZ2h0IGFzIHdlbGwgbm90IGdpdmUgdXMKLWEgY2hhbmNlIHRvIG1ha2UgYSBtaXN0YWtlLgotCi1FdmVuIGlmIHRoZSBwcm9ibGVtIHlvdSBleHBlcmllbmNlIGlzIGEgZmF0YWwgc2lnbmFsLCB5b3Ugc2hvdWxkIHN0aWxsCi1zYXkgc28gZXhwbGljaXRseS4gIFN1cHBvc2Ugc29tZXRoaW5nIHN0cmFuZ2UgaXMgZ29pbmcgb24sIHN1Y2ggYXMsIHlvdXIKLWNvcHkgb2YgQGNvZGV7bGR9IGlzIG91dCBvZiBzeW5jaCwgb3IgeW91IGhhdmUgZW5jb3VudGVyZWQgYSBidWcgaW4gdGhlCi1DIGxpYnJhcnkgb24geW91ciBzeXN0ZW0uICAoVGhpcyBoYXMgaGFwcGVuZWQhKSAgWW91ciBjb3B5IG1pZ2h0IGNyYXNoCi1hbmQgb3VycyB3b3VsZCBub3QuICBJZiB5b3UgdG9sZCB1cyB0byBleHBlY3QgYSBjcmFzaCwgdGhlbiB3aGVuIG91cnMKLWZhaWxzIHRvIGNyYXNoLCB3ZSB3b3VsZCBrbm93IHRoYXQgdGhlIGJ1ZyB3YXMgbm90IGhhcHBlbmluZyBmb3IgdXMuICBJZgoteW91IGhhZCBub3QgdG9sZCB1cyB0byBleHBlY3QgYSBjcmFzaCwgdGhlbiB3ZSB3b3VsZCBub3QgYmUgYWJsZSB0byBkcmF3Ci1hbnkgY29uY2x1c2lvbiBmcm9tIG91ciBvYnNlcnZhdGlvbnMuCi0KLUBpdGVtCi1JZiB5b3Ugd2lzaCB0byBzdWdnZXN0IGNoYW5nZXMgdG8gdGhlIEBjb2Rle2xkfSBzb3VyY2UsIHNlbmQgdXMgY29udGV4dAotZGlmZnMsIGFzIGdlbmVyYXRlZCBieSBAY29kZXtkaWZmfSB3aXRoIHRoZSBAc2FtcHstdX0sIEBzYW1wey1jfSwgb3IKLUBzYW1wey1wfSBvcHRpb24uICBBbHdheXMgc2VuZCBkaWZmcyBmcm9tIHRoZSBvbGQgZmlsZSB0byB0aGUgbmV3IGZpbGUuCi1JZiB5b3UgZXZlbiBkaXNjdXNzIHNvbWV0aGluZyBpbiB0aGUgQGNvZGV7bGR9IHNvdXJjZSwgcmVmZXIgdG8gaXQgYnkKLWNvbnRleHQsIG5vdCBieSBsaW5lIG51bWJlci4KLQotVGhlIGxpbmUgbnVtYmVycyBpbiBvdXIgZGV2ZWxvcG1lbnQgc291cmNlcyB3aWxsIG5vdCBtYXRjaCB0aG9zZSBpbiB5b3VyCi1zb3VyY2VzLiAgWW91ciBsaW5lIG51bWJlcnMgd291bGQgY29udmV5IG5vIHVzZWZ1bCBpbmZvcm1hdGlvbiB0byB1cy4KLUBlbmQgaXRlbWl6ZQotCi1IZXJlIGFyZSBzb21lIHRoaW5ncyB0aGF0IGFyZSBub3QgbmVjZXNzYXJ5OgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQSBkZXNjcmlwdGlvbiBvZiB0aGUgZW52ZWxvcGUgb2YgdGhlIGJ1Zy4KLQotT2Z0ZW4gcGVvcGxlIHdobyBlbmNvdW50ZXIgYSBidWcgc3BlbmQgYSBsb3Qgb2YgdGltZSBpbnZlc3RpZ2F0aW5nCi13aGljaCBjaGFuZ2VzIHRvIHRoZSBpbnB1dCBmaWxlIHdpbGwgbWFrZSB0aGUgYnVnIGdvIGF3YXkgYW5kIHdoaWNoCi1jaGFuZ2VzIHdpbGwgbm90IGFmZmVjdCBpdC4KLQotVGhpcyBpcyBvZnRlbiB0aW1lIGNvbnN1bWluZyBhbmQgbm90IHZlcnkgdXNlZnVsLCBiZWNhdXNlIHRoZSB3YXkgd2UKLXdpbGwgZmluZCB0aGUgYnVnIGlzIGJ5IHJ1bm5pbmcgYSBzaW5nbGUgZXhhbXBsZSB1bmRlciB0aGUgZGVidWdnZXIKLXdpdGggYnJlYWtwb2ludHMsIG5vdCBieSBwdXJlIGRlZHVjdGlvbiBmcm9tIGEgc2VyaWVzIG9mIGV4YW1wbGVzLgotV2UgcmVjb21tZW5kIHRoYXQgeW91IHNhdmUgeW91ciB0aW1lIGZvciBzb21ldGhpbmcgZWxzZS4KLQotT2YgY291cnNlLCBpZiB5b3UgY2FuIGZpbmQgYSBzaW1wbGVyIGV4YW1wbGUgdG8gcmVwb3J0IEBlbXBoe2luc3RlYWR9Ci1vZiB0aGUgb3JpZ2luYWwgb25lLCB0aGF0IGlzIGEgY29udmVuaWVuY2UgZm9yIHVzLiAgRXJyb3JzIGluIHRoZQotb3V0cHV0IHdpbGwgYmUgZWFzaWVyIHRvIHNwb3QsIHJ1bm5pbmcgdW5kZXIgdGhlIGRlYnVnZ2VyIHdpbGwgdGFrZQotbGVzcyB0aW1lLCBhbmQgc28gb24uCi0KLUhvd2V2ZXIsIHNpbXBsaWZpY2F0aW9uIGlzIG5vdCB2aXRhbDsgaWYgeW91IGRvIG5vdCB3YW50IHRvIGRvIHRoaXMsCi1yZXBvcnQgdGhlIGJ1ZyBhbnl3YXkgYW5kIHNlbmQgdXMgdGhlIGVudGlyZSB0ZXN0IGNhc2UgeW91IHVzZWQuCi0KLUBpdGVtCi1BIHBhdGNoIGZvciB0aGUgYnVnLgotCi1BIHBhdGNoIGZvciB0aGUgYnVnIGRvZXMgaGVscCB1cyBpZiBpdCBpcyBhIGdvb2Qgb25lLiAgQnV0IGRvIG5vdCBvbWl0Ci10aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSB0ZXN0IGNhc2UsIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQKLWEgcGF0Y2ggaXMgYWxsIHdlIG5lZWQuICBXZSBtaWdodCBzZWUgcHJvYmxlbXMgd2l0aCB5b3VyIHBhdGNoIGFuZCBkZWNpZGUKLXRvIGZpeCB0aGUgcHJvYmxlbSBhbm90aGVyIHdheSwgb3Igd2UgbWlnaHQgbm90IHVuZGVyc3RhbmQgaXQgYXQgYWxsLgotCi1Tb21ldGltZXMgd2l0aCBhIHByb2dyYW0gYXMgY29tcGxpY2F0ZWQgYXMgQGNvZGV7bGR9IGl0IGlzIHZlcnkgaGFyZCB0bwotY29uc3RydWN0IGFuIGV4YW1wbGUgdGhhdCB3aWxsIG1ha2UgdGhlIHByb2dyYW0gZm9sbG93IGEgY2VydGFpbiBwYXRoCi10aHJvdWdoIHRoZSBjb2RlLiAgSWYgeW91IGRvIG5vdCBzZW5kIHVzIHRoZSBleGFtcGxlLCB3ZSB3aWxsIG5vdCBiZQotYWJsZSB0byBjb25zdHJ1Y3Qgb25lLCBzbyB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIHZlcmlmeSB0aGF0IHRoZSBidWcgaXMKLWZpeGVkLgotCi1BbmQgaWYgd2UgY2Fubm90IHVuZGVyc3RhbmQgd2hhdCBidWcgeW91IGFyZSB0cnlpbmcgdG8gZml4LCBvciB3aHkgeW91cgotcGF0Y2ggc2hvdWxkIGJlIGFuIGltcHJvdmVtZW50LCB3ZSB3aWxsIG5vdCBpbnN0YWxsIGl0LiAgQSB0ZXN0IGNhc2Ugd2lsbAotaGVscCB1cyB0byB1bmRlcnN0YW5kLgotCi1AaXRlbQotQSBndWVzcyBhYm91dCB3aGF0IHRoZSBidWcgaXMgb3Igd2hhdCBpdCBkZXBlbmRzIG9uLgotCi1TdWNoIGd1ZXNzZXMgYXJlIHVzdWFsbHkgd3JvbmcuICBFdmVuIHdlIGNhbm5vdCBndWVzcyByaWdodCBhYm91dCBzdWNoCi10aGluZ3Mgd2l0aG91dCBmaXJzdCB1c2luZyB0aGUgZGVidWdnZXIgdG8gZmluZCB0aGUgZmFjdHMuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgTVJJCi1AYXBwZW5kaXggTVJJIENvbXBhdGlibGUgU2NyaXB0IEZpbGVzCi1AY2luZGV4IE1SSSBjb21wYXRpYmlsaXR5Ci1UbyBhaWQgdXNlcnMgbWFraW5nIHRoZSB0cmFuc2l0aW9uIHRvIEBzY3tnbnV9IEBjb2Rle2xkfSBmcm9tIHRoZSBNUkkKLWxpbmtlciwgQGNvZGV7bGR9IGNhbiB1c2UgTVJJIGNvbXBhdGlibGUgbGlua2VyIHNjcmlwdHMgYXMgYW4KLWFsdGVybmF0aXZlIHRvIHRoZSBtb3JlIGdlbmVyYWwtcHVycG9zZSBsaW5rZXIgc2NyaXB0aW5nIGxhbmd1YWdlCi1kZXNjcmliZWQgaW4gQHJlZntTY3JpcHRzfS4gIE1SSSBjb21wYXRpYmxlIGxpbmtlciBzY3JpcHRzIGhhdmUgYSBtdWNoCi1zaW1wbGVyIGNvbW1hbmQgc2V0IHRoYW4gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBvdGhlcndpc2UgdXNlZCB3aXRoCi1AY29kZXtsZH0uICBAc2N7Z251fSBAY29kZXtsZH0gc3VwcG9ydHMgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBNUkkKLWxpbmtlciBjb21tYW5kczsgdGhlc2UgY29tbWFuZHMgYXJlIGRlc2NyaWJlZCBoZXJlLgotCi1JbiBnZW5lcmFsLCBNUkkgc2NyaXB0cyBhcmVuJ3Qgb2YgbXVjaCB1c2Ugd2l0aCB0aGUgQGNvZGV7YS5vdXR9IG9iamVjdAotZmlsZSBmb3JtYXQsIHNpbmNlIGl0IG9ubHkgaGFzIHRocmVlIHNlY3Rpb25zIGFuZCBNUkkgc2NyaXB0cyBsYWNrIHNvbWUKLWZlYXR1cmVzIHRvIG1ha2UgdXNlIG9mIHRoZW0uCi0KLVlvdSBjYW4gc3BlY2lmeSBhIGZpbGUgY29udGFpbmluZyBhbiBNUkktY29tcGF0aWJsZSBzY3JpcHQgdXNpbmcgdGhlCi1Ac2FtcHstY30gY29tbWFuZC1saW5lIG9wdGlvbi4KLQotRWFjaCBjb21tYW5kIGluIGFuIE1SSS1jb21wYXRpYmxlIHNjcmlwdCBvY2N1cGllcyBpdHMgb3duIGxpbmU7IGVhY2gKLWNvbW1hbmQgbGluZSBzdGFydHMgd2l0aCB0aGUga2V5d29yZCB0aGF0IGlkZW50aWZpZXMgdGhlIGNvbW1hbmQgKHRob3VnaAotYmxhbmsgbGluZXMgYXJlIGFsc28gYWxsb3dlZCBmb3IgcHVuY3R1YXRpb24pLiAgSWYgYSBsaW5lIG9mIGFuCi1NUkktY29tcGF0aWJsZSBzY3JpcHQgYmVnaW5zIHdpdGggYW4gdW5yZWNvZ25pemVkIGtleXdvcmQsIEBjb2Rle2xkfQotaXNzdWVzIGEgd2FybmluZyBtZXNzYWdlLCBidXQgY29udGludWVzIHByb2Nlc3NpbmcgdGhlIHNjcmlwdC4KLQotTGluZXMgYmVnaW5uaW5nIHdpdGggQHNhbXB7Kn0gYXJlIGNvbW1lbnRzLgotCi1Zb3UgY2FuIHdyaXRlIHRoZXNlIGNvbW1hbmRzIHVzaW5nIGFsbCB1cHBlci1jYXNlIGxldHRlcnMsIG9yIGFsbAotbG93ZXIgY2FzZTsgZm9yIGV4YW1wbGUsIEBzYW1we2NoaXB9IGlzIHRoZSBzYW1lIGFzIEBzYW1we0NISVB9LgotVGhlIGZvbGxvd2luZyBsaXN0IHNob3dzIG9ubHkgdGhlIHVwcGVyLWNhc2UgZm9ybSBvZiBlYWNoIGNvbW1hbmQuCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtBQlNPTFVURX0gKE1SSSkKLUBpdGVtIEFCU09MVVRFIEB2YXJ7c2VjbmFtZX0KLUBpdGVteCBBQlNPTFVURSBAdmFye3NlY25hbWV9LCBAdmFye3NlY25hbWV9LCBAZG90c3t9IEB2YXJ7c2VjbmFtZX0KLU5vcm1hbGx5LCBAY29kZXtsZH0gaW5jbHVkZXMgaW4gdGhlIG91dHB1dCBmaWxlIGFsbCBzZWN0aW9ucyBmcm9tIGFsbAotdGhlIGlucHV0IGZpbGVzLiAgSG93ZXZlciwgaW4gYW4gTVJJLWNvbXBhdGlibGUgc2NyaXB0LCB5b3UgY2FuIHVzZSB0aGUKLUBjb2Rle0FCU09MVVRFfSBjb21tYW5kIHRvIHJlc3RyaWN0IHRoZSBzZWN0aW9ucyB0aGF0IHdpbGwgYmUgcHJlc2VudCBpbgoteW91ciBvdXRwdXQgcHJvZ3JhbS4gIElmIHRoZSBAY29kZXtBQlNPTFVURX0gY29tbWFuZCBpcyB1c2VkIGF0IGFsbCBpbiBhCi1zY3JpcHQsIHRoZW4gb25seSB0aGUgc2VjdGlvbnMgbmFtZWQgZXhwbGljaXRseSBpbiBAY29kZXtBQlNPTFVURX0KLWNvbW1hbmRzIHdpbGwgYXBwZWFyIGluIHRoZSBsaW5rZXIgb3V0cHV0LiAgWW91IGNhbiBzdGlsbCB1c2Ugb3RoZXIKLWlucHV0IHNlY3Rpb25zICh3aGF0ZXZlciB5b3Ugc2VsZWN0IG9uIHRoZSBjb21tYW5kIGxpbmUsIG9yIHVzaW5nCi1AY29kZXtMT0FEfSkgdG8gcmVzb2x2ZSBhZGRyZXNzZXMgaW4gdGhlIG91dHB1dCBmaWxlLgotCi1AY2luZGV4IEBjb2Rle0FMSUFTfSAoTVJJKQotQGl0ZW0gQUxJQVMgQHZhcntvdXQtc2VjbmFtZX0sIEB2YXJ7aW4tc2VjbmFtZX0KLVVzZSB0aGlzIGNvbW1hbmQgdG8gcGxhY2UgdGhlIGRhdGEgZnJvbSBpbnB1dCBzZWN0aW9uIEB2YXJ7aW4tc2VjbmFtZX0KLWluIGEgc2VjdGlvbiBjYWxsZWQgQHZhcntvdXQtc2VjbmFtZX0gaW4gdGhlIGxpbmtlciBvdXRwdXQgZmlsZS4KLQotQHZhcntpbi1zZWNuYW1lfSBtYXkgYmUgYW4gaW50ZWdlci4KLQotQGNpbmRleCBAY29kZXtBTElHTn0gKE1SSSkKLUBpdGVtIEFMSUdOIEB2YXJ7c2VjbmFtZX0gPSBAdmFye2V4cHJlc3Npb259Ci1BbGlnbiB0aGUgc2VjdGlvbiBjYWxsZWQgQHZhcntzZWNuYW1lfSB0byBAdmFye2V4cHJlc3Npb259LiAgVGhlCi1AdmFye2V4cHJlc3Npb259IHNob3VsZCBiZSBhIHBvd2VyIG9mIHR3by4KLQotQGNpbmRleCBAY29kZXtCQVNFfSAoTVJJKQotQGl0ZW0gQkFTRSBAdmFye2V4cHJlc3Npb259Ci1Vc2UgdGhlIHZhbHVlIG9mIEB2YXJ7ZXhwcmVzc2lvbn0gYXMgdGhlIGxvd2VzdCBhZGRyZXNzIChvdGhlciB0aGFuCi1hYnNvbHV0ZSBhZGRyZXNzZXMpIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotQGNpbmRleCBAY29kZXtDSElQfSAoTVJJKQotQGl0ZW0gQ0hJUCBAdmFye2V4cHJlc3Npb259Ci1AaXRlbXggQ0hJUCBAdmFye2V4cHJlc3Npb259LCBAdmFye2V4cHJlc3Npb259Ci1UaGlzIGNvbW1hbmQgZG9lcyBub3RoaW5nOyBpdCBpcyBhY2NlcHRlZCBvbmx5IGZvciBjb21wYXRpYmlsaXR5LgotCi1AY2luZGV4IEBjb2Rle0VORH0gKE1SSSkKLUBpdGVtIEVORAotVGhpcyBjb21tYW5kIGRvZXMgbm90aGluZyB3aGF0ZXZlcjsgaXQncyBvbmx5IGFjY2VwdGVkIGZvciBjb21wYXRpYmlsaXR5LgotCi1AY2luZGV4IEBjb2Rle0ZPUk1BVH0gKE1SSSkKLUBpdGVtIEZPUk1BVCBAdmFye291dHB1dC1mb3JtYXR9Ci1TaW1pbGFyIHRvIHRoZSBAY29kZXtPVVRQVVRfRk9STUFUfSBjb21tYW5kIGluIHRoZSBtb3JlIGdlbmVyYWwgbGlua2VyCi1sYW5ndWFnZSwgYnV0IHJlc3RyaWN0ZWQgdG8gb25lIG9mIHRoZXNlIG91dHB1dCBmb3JtYXRzOiAKLQotQGVudW1lcmF0ZQotQGl0ZW0gCi1TLXJlY29yZHMsIGlmIEB2YXJ7b3V0cHV0LWZvcm1hdH0gaXMgQHNhbXB7U30KLQotQGl0ZW0KLUlFRUUsIGlmIEB2YXJ7b3V0cHV0LWZvcm1hdH0gaXMgQHNhbXB7SUVFRX0KLQotQGl0ZW0KLUNPRkYgKHRoZSBAc2FtcHtjb2ZmLW02OGt9IHZhcmlhbnQgaW4gQkZEKSwgaWYgQHZhcntvdXRwdXQtZm9ybWF0fSBpcwotQHNhbXB7Q09GRn0KLUBlbmQgZW51bWVyYXRlCi0KLUBjaW5kZXggQGNvZGV7TElTVH0gKE1SSSkKLUBpdGVtIExJU1QgQHZhcnthbnl0aGluZ31AZG90c3t9Ci1QcmludCAodG8gdGhlIHN0YW5kYXJkIG91dHB1dCBmaWxlKSBhIGxpbmsgbWFwLCBhcyBwcm9kdWNlZCBieSB0aGUKLUBjb2Rle2xkfSBjb21tYW5kLWxpbmUgb3B0aW9uIEBzYW1wey1NfS4KLQotVGhlIGtleXdvcmQgQGNvZGV7TElTVH0gbWF5IGJlIGZvbGxvd2VkIGJ5IGFueXRoaW5nIG9uIHRoZQotc2FtZSBsaW5lLCB3aXRoIG5vIGNoYW5nZSBpbiBpdHMgZWZmZWN0LgotCi1AY2luZGV4IEBjb2Rle0xPQUR9IChNUkkpCi1AaXRlbSBMT0FEIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggTE9BRCBAdmFye2ZpbGVuYW1lfSwgQHZhcntmaWxlbmFtZX0sIEBkb3Rze30gQHZhcntmaWxlbmFtZX0KLUluY2x1ZGUgb25lIG9yIG1vcmUgb2JqZWN0IGZpbGUgQHZhcntmaWxlbmFtZX0gaW4gdGhlIGxpbms7IHRoaXMgaGFzIHRoZQotc2FtZSBlZmZlY3QgYXMgc3BlY2lmeWluZyBAdmFye2ZpbGVuYW1lfSBkaXJlY3RseSBvbiB0aGUgQGNvZGV7bGR9Ci1jb21tYW5kIGxpbmUuCi0KLUBjaW5kZXggQGNvZGV7TkFNRX0gKE1SSSkKLUBpdGVtIE5BTUUgQHZhcntvdXRwdXQtbmFtZX0KLUB2YXJ7b3V0cHV0LW5hbWV9IGlzIHRoZSBuYW1lIGZvciB0aGUgcHJvZ3JhbSBwcm9kdWNlZCBieSBAY29kZXtsZH07IHRoZQotTVJJLWNvbXBhdGlibGUgY29tbWFuZCBAY29kZXtOQU1FfSBpcyBlcXVpdmFsZW50IHRvIHRoZSBjb21tYW5kLWxpbmUKLW9wdGlvbiBAc2FtcHstb30gb3IgdGhlIGdlbmVyYWwgc2NyaXB0IGxhbmd1YWdlIGNvbW1hbmQgQGNvZGV7T1VUUFVUfS4KLQotQGNpbmRleCBAY29kZXtPUkRFUn0gKE1SSSkKLUBpdGVtIE9SREVSIEB2YXJ7c2VjbmFtZX0sIEB2YXJ7c2VjbmFtZX0sIEBkb3Rze30gQHZhcntzZWNuYW1lfQotQGl0ZW14IE9SREVSIEB2YXJ7c2VjbmFtZX0gQHZhcntzZWNuYW1lfSBAdmFye3NlY25hbWV9Ci1Ob3JtYWxseSwgQGNvZGV7bGR9IG9yZGVycyB0aGUgc2VjdGlvbnMgaW4gaXRzIG91dHB1dCBmaWxlIGluIHRoZQotb3JkZXIgaW4gd2hpY2ggdGhleSBmaXJzdCBhcHBlYXIgaW4gdGhlIGlucHV0IGZpbGVzLiAgSW4gYW4gTVJJLWNvbXBhdGlibGUKLXNjcmlwdCwgeW91IGNhbiBvdmVycmlkZSB0aGlzIG9yZGVyaW5nIHdpdGggdGhlIEBjb2Rle09SREVSfSBjb21tYW5kLiAgVGhlCi1zZWN0aW9ucyB5b3UgbGlzdCB3aXRoIEBjb2Rle09SREVSfSB3aWxsIGFwcGVhciBmaXJzdCBpbiB5b3VyIG91dHB1dAotZmlsZSwgaW4gdGhlIG9yZGVyIHNwZWNpZmllZC4KLQotQGNpbmRleCBAY29kZXtQVUJMSUN9IChNUkkpCi1AaXRlbSBQVUJMSUMgQHZhcntuYW1lfT1AdmFye2V4cHJlc3Npb259Ci1AaXRlbXggUFVCTElDIEB2YXJ7bmFtZX0sQHZhcntleHByZXNzaW9ufQotQGl0ZW14IFBVQkxJQyBAdmFye25hbWV9IEB2YXJ7ZXhwcmVzc2lvbn0KLVN1cHBseSBhIHZhbHVlIChAdmFye2V4cHJlc3Npb259KSBmb3IgZXh0ZXJuYWwgc3ltYm9sCi1AdmFye25hbWV9IHVzZWQgaW4gdGhlIGxpbmtlciBpbnB1dCBmaWxlcy4KLQotQGNpbmRleCBAY29kZXtTRUNUfSAoTVJJKQotQGl0ZW0gU0VDVCBAdmFye3NlY25hbWV9LCBAdmFye2V4cHJlc3Npb259Ci1AaXRlbXggU0VDVCBAdmFye3NlY25hbWV9PUB2YXJ7ZXhwcmVzc2lvbn0KLUBpdGVteCBTRUNUIEB2YXJ7c2VjbmFtZX0gQHZhcntleHByZXNzaW9ufQotWW91IGNhbiB1c2UgYW55IG9mIHRoZXNlIHRocmVlIGZvcm1zIG9mIHRoZSBAY29kZXtTRUNUfSBjb21tYW5kIHRvCi1zcGVjaWZ5IHRoZSBzdGFydCBhZGRyZXNzIChAdmFye2V4cHJlc3Npb259KSBmb3Igc2VjdGlvbiBAdmFye3NlY25hbWV9LgotSWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBAY29kZXtTRUNUfSBzdGF0ZW1lbnQgZm9yIHRoZSBzYW1lCi1AdmFye3NlY25hbWV9LCBvbmx5IHRoZSBAZW1waHtmaXJzdH0gc2V0cyB0aGUgc3RhcnQgYWRkcmVzcy4KLUBlbmQgdGFibGUKLQotQG5vZGUgSW5kZXgKLUB1bm51bWJlcmVkIEluZGV4Ci0KLUBwcmludGluZGV4IGNwCi0KLUB0ZXgKLSUgSSB0aGluayBzb21ldGhpbmcgbGlrZSBAY29sb3Bob24gc2hvdWxkIGJlIGluIHRleGluZm8uICBJbiB0aGUKLSUgbWVhbnRpbWU6Ci1cbG9uZ1xkZWZcY29sb3Bob257XGhib3ggdG8wcHR7fVx2ZmlsbAotXGNlbnRlcmxpbmV7VGhlIGJvZHkgb2YgdGhpcyBtYW51YWwgaXMgc2V0IGlufQotXGNlbnRlcmxpbmV7XGZvbnRuYW1lXHRlbnJtLH0KLVxjZW50ZXJsaW5le3dpdGggaGVhZGluZ3MgaW4ge1xiZlxmb250bmFtZVx0ZW5iZn19Ci1cY2VudGVybGluZXthbmQgZXhhbXBsZXMgaW4ge1x0dFxmb250bmFtZVx0ZW50dH0ufQotXGNlbnRlcmxpbmV7e1xpdFxmb250bmFtZVx0ZW5pdFwvfSBhbmR9Ci1cY2VudGVybGluZXt7XHNsXGZvbnRuYW1lXHRlbnNsXC99fQotXGNlbnRlcmxpbmV7YXJlIHVzZWQgZm9yIGVtcGhhc2lzLn1cdmZpbGx9Ci1ccGFnZVxjb2xvcGhvbgotJSBCbGFtZTogZG9jQGN5Z251cy5jb20sIDI4bWFyOTEuCi1AZW5kIHRleAotCi0KLUBjb250ZW50cwotQGJ5ZQotCi0KZGlmZiAtLWdpdCBhL2xkL2xkY3JlZi5jIGIvbGQvbGRjcmVmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZTBkMmQuLjAwMDAwMDAKLS0tIGEvbGQvbGRjcmVmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDkgKzAsMCBAQAotLyogbGRjcmVmLmMgLS0gb3V0cHV0IGEgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgcm91dGluZXMgdGhhdCBtYW5hZ2UgdGhlIGNyb3NzIHJlZmVyZW5jZSB0YWJsZS4KLSAgIFRoZSB0YWJsZSBpcyB1c2VkIHRvIGdlbmVyYXRlIGNyb3NzIHJlZmVyZW5jZSByZXBvcnRzLiAgSXQgaXMgYWxzbwotICAgdXNlZCB0byBpbXBsZW1lbnQgdGhlIE5PQ1JPU1NSRUZTIGNvbW1hbmQgaW4gdGhlIGxpbmtlciBzY3JpcHQuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotCi0vKiBXZSBrZWVwIGFuIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlIGZvciBlYWNoIHJlZmVyZW5jZSB0byBhCi0gICBzeW1ib2wgZnJvbSBhIGdpdmVuIG9iamVjdC4gICovCi0KLXN0cnVjdCBjcmVmX3JlZgotewotICAvKiBUaGUgbmV4dCByZWZlcmVuY2UuICAqLwotICBzdHJ1Y3QgY3JlZl9yZWYgKm5leHQ7Ci0gIC8qIFRoZSBvYmplY3QuICAqLwotICBiZmQgKmFiZmQ7Ci0gIC8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLiAgKi8KLSAgdW5zaWduZWQgaW50IGRlZiA6IDE7Ci0gIC8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyBjb21tb24uICAqLwotICB1bnNpZ25lZCBpbnQgY29tbW9uIDogMTsKLSAgLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4gICovCi0gIHVuc2lnbmVkIGludCB1bmRlZiA6IDE7Ci19OwotCi0vKiBXZSBrZWVwIGEgaGFzaCB0YWJsZSBvZiBzeW1ib2xzLiAgRWFjaCBlbnRyeSBsb29rcyBsaWtlIHRoaXMuICAqLwotCi1zdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICAvKiBUaGUgZGVtYW5nbGVkIG5hbWUuICAqLwotICBjaGFyICpkZW1hbmdsZWQ7Ci0gIC8qIFJlZmVyZW5jZXMgdG8gYW5kIGRlZmluaXRpb25zIG9mIHRoaXMgc3ltYm9sLiAgKi8KLSAgc3RydWN0IGNyZWZfcmVmICpyZWZzOwotfTsKLQotLyogVGhpcyBpcyB3aGF0IHRoZSBoYXNoIHRhYmxlIGxvb2tzIGxpa2UuICAqLwotCi1zdHJ1Y3QgY3JlZl9oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqY3JlZl9oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGNyZWZfZmlsbF9hcnJheSBQQVJBTVMgKChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGludCBjcmVmX3NvcnRfYXJyYXkgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIG91dHB1dF9vbmVfY3JlZiBQQVJBTVMgKChGSUxFICosIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gY2hlY2tfbm9jcm9zc3JlZiBQQVJBTVMgKChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIHZvaWQgY2hlY2tfcmVmcwotICBQQVJBTVMgKChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCi0JICAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKikpOwotc3RhdGljIHZvaWQgY2hlY2tfcmVsb2NfcmVmcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gdGhlIGNyZWYgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY3JlZl9oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpCQlcCi0gICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKQkJCQkJXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBUcmF2ZXJzZSB0aGUgY3JlZiBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjcmVmX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJCVwKLSAgKGJmZF9oYXNoX3RyYXZlcnNlCQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIFRoZSBjcmVmIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGNyZWZfaGFzaF90YWJsZSBjcmVmX3RhYmxlOwotCi0vKiBXaGV0aGVyIHRoZSBjcmVmIGhhc2ggdGFibGUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjcmVmX2luaXRpYWxpemVkOwotCi0vKiBUaGUgbnVtYmVyIG9mIHN5bWJvbHMgc2VlbiBzbyBmYXIuICAqLwotCi1zdGF0aWMgc2l6ZV90IGNyZWZfc3ltY291bnQ7Ci0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhIGNyZWYgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotY3JlZl9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBjcmVmX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5kZW1hbmdsZWQgPSBOVUxMOwotICAgICAgcmV0LT5yZWZzID0gTlVMTDsKLQotICAgICAgLyogS2VlcCBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgZW50cmllcyBjcmVhdGVkIGluIHRoZSBoYXNoCi0gICAgICAgICB0YWJsZS4gICovCi0gICAgICArK2NyZWZfc3ltY291bnQ7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQWRkIGEgc3ltYm9sIHRvIHRoZSBjcmVmIGhhc2ggdGFibGUuICBUaGlzIGlzIGNhbGxlZCBmb3IgZXZlcnkKLSAgIHN5bWJvbCB0aGF0IGlzIHNlZW4gZHVyaW5nIHRoZSBsaW5rLiAgKi8KLQotLypBUkdTVVNFRCovCi12b2lkCi1hZGRfY3JlZiAobmFtZSwgYWJmZCwgc2VjdGlvbiwgdmFsdWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBjcmVmX3JlZiAqcjsKLQotICBpZiAoISBjcmVmX2luaXRpYWxpemVkKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZjcmVmX3RhYmxlLnJvb3QsIGNyZWZfaGFzaF9uZXdmdW5jKSkKLQllaW5mbyAoXygiJVglUDogYmZkX2hhc2hfdGFibGVfaW5pdCBvZiBjcmVmIHRhYmxlIGZhaWxlZDogJUVcbiIpKTsKLSAgICAgIGNyZWZfaW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIH0KLQotICBoID0gY3JlZl9oYXNoX2xvb2t1cCAoJmNyZWZfdGFibGUsIG5hbWUsIHRydWUsIGZhbHNlKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICBlaW5mbyAoXygiJVglUDogY3JlZl9oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0KLSAgZm9yIChyID0gaC0+cmVmczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLSAgICBpZiAoci0+YWJmZCA9PSBhYmZkKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICByID0gKHN0cnVjdCBjcmVmX3JlZiAqKSB4bWFsbG9jIChzaXplb2YgKnIpOwotICAgICAgci0+bmV4dCA9IGgtPnJlZnM7Ci0gICAgICBoLT5yZWZzID0gcjsKLSAgICAgIHItPmFiZmQgPSBhYmZkOwotICAgICAgci0+ZGVmID0gZmFsc2U7Ci0gICAgICByLT5jb21tb24gPSBmYWxzZTsKLSAgICAgIHItPnVuZGVmID0gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQotICAgIHItPnVuZGVmID0gdHJ1ZTsKLSAgZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkKLSAgICByLT5jb21tb24gPSB0cnVlOwotICBlbHNlCi0gICAgci0+ZGVmID0gdHJ1ZTsKLX0KLQotLyogQ29weSB0aGUgYWRkcmVzc2VzIG9mIHRoZSBoYXNoIHRhYmxlIGVudHJpZXMgaW50byBhbiBhcnJheS4gIFRoaXMKLSAgIGlzIGNhbGxlZCB2aWEgY3JlZl9oYXNoX3RyYXZlcnNlLiAgV2UgYWxzbyBmaWxsIGluIHRoZSBkZW1hbmdsZWQKLSAgIG5hbWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY3JlZl9maWxsX2FycmF5IChoLCBkYXRhKQotICAgICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKipwcGggPSAoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKiopIGRhdGE7Ci0KLSAgQVNTRVJUIChoLT5kZW1hbmdsZWQgPT0gTlVMTCk7Ci0gIGgtPmRlbWFuZ2xlZCA9IGRlbWFuZ2xlIChoLT5yb290LnN0cmluZyk7Ci0KLSAgKipwcGggPSBoOwotCi0gICsrKnBwaDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU29ydCBhbiBhcnJheSBvZiBjcmVmIGhhc2ggdGFibGUgZW50cmllcyBieSBuYW1lLiAgKi8KLQotc3RhdGljIGludAotY3JlZl9zb3J0X2FycmF5IChhMSwgYTIpCi0gICAgIGNvbnN0IFBUUiBhMTsKLSAgICAgY29uc3QgUFRSIGEyOwotewotICBjb25zdCBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICoqcDEgPSAoY29uc3Qgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKikgYTE7Ci0gIGNvbnN0IHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKipwMiA9IChjb25zdCBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICoqKSBhMjsKLQotICByZXR1cm4gc3RyY21wICgoKnAxKS0+ZGVtYW5nbGVkLCAoKnAyKS0+ZGVtYW5nbGVkKTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBjcmVmIHRhYmxlLiAgKi8KLQotI2RlZmluZSBGSUxFQ09MICg1MCkKLQotdm9pZAotb3V0cHV0X2NyZWYgKGZwKQotICAgICBGSUxFICpmcDsKLXsKLSAgaW50IGxlbjsKLSAgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKmNzeW1zLCAqKmNzeW1fZmlsbCwgKipjc3ltLCAqKmNzeW1fZW5kOwotICBjb25zdCBjaGFyICptc2c7Ci0KLSAgZnByaW50ZiAoZnAsIF8oIlxuQ3Jvc3MgUmVmZXJlbmNlIFRhYmxlXG5cbiIpKTsKLSAgbXNnID0gXygiU3ltYm9sIik7Ci0gIGZwcmludGYgKGZwLCBtc2cpOwotICBsZW4gPSBzdHJsZW4gKG1zZyk7Ci0gIHdoaWxlIChsZW4gPCBGSUxFQ09MKQotICAgIHsKLSAgICAgIHB1dGMgKCcgJyAsIGZwKTsKLSAgICAgICsrbGVuOwotICAgIH0KLSAgZnByaW50ZiAoZnAsIF8oIkZpbGVcbiIpKTsKLQotICBpZiAoISBjcmVmX2luaXRpYWxpemVkKQotICAgIHsKLSAgICAgIGZwcmludGYgKGZwLCBfKCJObyBzeW1ib2xzXG4iKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGNzeW1zID0gKChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICoqKQotCSAgIHhtYWxsb2MgKGNyZWZfc3ltY291bnQgKiBzaXplb2YgKCpjc3ltcykpKTsKLQotICBjc3ltX2ZpbGwgPSBjc3ltczsKLSAgY3JlZl9oYXNoX3RyYXZlcnNlICgmY3JlZl90YWJsZSwgY3JlZl9maWxsX2FycmF5LCAmY3N5bV9maWxsKTsKLSAgQVNTRVJUICgoc2l6ZV90KSAoY3N5bV9maWxsIC0gY3N5bXMpID09IGNyZWZfc3ltY291bnQpOwotCi0gIHFzb3J0IChjc3ltcywgY3JlZl9zeW1jb3VudCwgc2l6ZW9mICgqY3N5bXMpLCBjcmVmX3NvcnRfYXJyYXkpOwotCi0gIGNzeW1fZW5kID0gY3N5bXMgKyBjcmVmX3N5bWNvdW50OwotICBmb3IgKGNzeW0gPSBjc3ltczsgY3N5bSA8IGNzeW1fZW5kOyBjc3ltKyspCi0gICAgb3V0cHV0X29uZV9jcmVmIChmcCwgKmNzeW0pOwotfQotCi0vKiBPdXRwdXQgb25lIGVudHJ5IGluIHRoZSBjcm9zcyByZWZlcmVuY2UgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotb3V0cHV0X29uZV9jcmVmIChmcCwgaCkKLSAgICAgRklMRSAqZnA7Ci0gICAgIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGludCBsZW47Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpobDsKLSAgc3RydWN0IGNyZWZfcmVmICpyOwotCi0gIGhsID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBoLT5yb290LnN0cmluZywgZmFsc2UsCi0JCQkgICAgIGZhbHNlLCB0cnVlKTsKLSAgaWYgKGhsID09IE5VTEwpCi0gICAgZWluZm8gKCIlUDogc3ltYm9sIGAlVCcgbWlzc2luZyBmcm9tIG1haW4gaGFzaCB0YWJsZVxuIiwKLQkgICBoLT5yb290LnN0cmluZyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIGEgZHluYW1pYyBvYmplY3QgYnV0IG5ldmVyCi0JIHJlZmVyZW5jZWQgYnkgYSBub3JtYWwgb2JqZWN0LCB0aGVuIGRvbid0IHByaW50IGl0LiAgKi8KLSAgICAgIGlmIChobC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JewotCSAgaWYgKGhsLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICByZXR1cm47Ci0JICBpZiAoaGwtPnUuZGVmLnNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICAgICAmJiAoaGwtPnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JICAgIHsKLQkgICAgICBmb3IgKHIgPSBoLT5yZWZzOyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQotCQlpZiAoKHItPmFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLQkJICBicmVhazsKLQkgICAgICBpZiAociA9PSBOVUxMKQotCQlyZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGZwcmludGYgKGZwLCAiJXMgIiwgaC0+ZGVtYW5nbGVkKTsKLSAgbGVuID0gc3RybGVuIChoLT5kZW1hbmdsZWQpICsgMTsKLQotICBmb3IgKHIgPSBoLT5yZWZzOyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChyLT5kZWYpCi0JewotCSAgd2hpbGUgKGxlbiA8IEZJTEVDT0wpCi0JICAgIHsKLQkgICAgICBwdXRjICgnICcsIGZwKTsKLQkgICAgICArK2xlbjsKLQkgICAgfQotCSAgbGZpbmZvIChmcCwgIiVCXG4iLCByLT5hYmZkKTsKLQkgIGxlbiA9IDA7Ci0JfQotICAgIH0KLQotICBmb3IgKHIgPSBoLT5yZWZzOyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIHItPmRlZikKLQl7Ci0JICB3aGlsZSAobGVuIDwgRklMRUNPTCkKLQkgICAgewotCSAgICAgIHB1dGMgKCcgJywgZnApOwotCSAgICAgICsrbGVuOwotCSAgICB9Ci0JICBsZmluZm8gKGZwLCAiJUJcbiIsIHItPmFiZmQpOwotCSAgbGVuID0gMDsKLQl9Ci0gICAgfQotCi0gIEFTU0VSVCAobGVuID09IDApOwotfQotCi0vKiBDaGVjayBmb3IgcHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2VzLiAgKi8KLQotdm9pZAotY2hlY2tfbm9jcm9zc3JlZnMgKCkKLXsKLSAgaWYgKCEgY3JlZl9pbml0aWFsaXplZCkKLSAgICByZXR1cm47Ci0KLSAgY3JlZl9oYXNoX3RyYXZlcnNlICgmY3JlZl90YWJsZSwgY2hlY2tfbm9jcm9zc3JlZiwgKFBUUikgTlVMTCk7Ci19Ci0KLS8qIENoZWNrIG9uZSBzeW1ib2wgdG8gc2VlIGlmIGl0IGlzIGEgcHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2UuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1jaGVja19ub2Nyb3NzcmVmIChoLCBpZ25vcmUpCi0gICAgIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpZ25vcmU7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpobDsKLSAgYXNlY3Rpb24gKmRlZnNlYzsKLSAgY29uc3QgY2hhciAqZGVmc2VjbmFtZTsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKm5jcnM7Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKm5jcjsKLQotICBobCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgaC0+cm9vdC5zdHJpbmcsIGZhbHNlLAotCQkJICAgICBmYWxzZSwgdHJ1ZSk7Ci0gIGlmIChobCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVpbmZvIChfKCIlUDogc3ltYm9sIGAlVCcgbWlzc2luZyBmcm9tIG1haW4gaGFzaCB0YWJsZVxuIiksCi0JICAgICBoLT5yb290LnN0cmluZyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGhsLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgaGwtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgIHJldHVybiB0cnVlOwotCi0gIGRlZnNlYyA9IGhsLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLSAgaWYgKGRlZnNlYyA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotICBkZWZzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGRlZnNlYy0+b3duZXIsIGRlZnNlYyk7Ci0KLSAgZm9yIChuY3JzID0gbm9jcm9zc3JlZl9saXN0OyBuY3JzICE9IE5VTEw7IG5jcnMgPSBuY3JzLT5uZXh0KQotICAgIGZvciAobmNyID0gbmNycy0+bGlzdDsgbmNyICE9IE5VTEw7IG5jciA9IG5jci0+bmV4dCkKLSAgICAgIGlmIChzdHJjbXAgKG5jci0+bmFtZSwgZGVmc2VjbmFtZSkgPT0gMCkKLQljaGVja19yZWZzIChoLCBobCwgbmNycyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoZSBzdHJ1Y3QgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIGZyb20gY2hlY2tfcmVmcyB0bwotICAgY2hlY2tfcmVsb2NfcmVmcyB0aHJvdWdoIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLXN0cnVjdCBjaGVja19yZWZzX2luZm8KLXsKLSAgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqaDsKLSAgYXNlY3Rpb24gKmRlZnNlYzsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKm5jcnM7Ci0gIGFzeW1ib2wgKiphc3ltYm9sczsKLSAgYm9vbGVhbiBzYW1lOwotfTsKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggc3ltYm9sIGRlZmluZWQgaW4gYSBzZWN0aW9uIHdoaWNoCi0gICBwcm9oaWJpdHMgY3Jvc3MgcmVmZXJlbmNlcy4gIFdlIG5lZWQgdG8gbG9vayB0aHJvdWdoIGFsbCByZWZlcmVuY2VzCi0gICB0byB0aGlzIHN5bWJvbCwgYW5kIGVuc3VyZSB0aGF0IHRoZSByZWZlcmVuY2VzIGFyZSBub3QgZnJvbQotICAgcHJvaGliaXRlZCBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1jaGVja19yZWZzIChoLCBobCwgbmNycykKLSAgICAgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmhsOwotICAgICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyAqbmNyczsKLXsKLSAgc3RydWN0IGNyZWZfcmVmICpyZWY7Ci0KLSAgZm9yIChyZWYgPSBoLT5yZWZzOyByZWYgIT0gTlVMTDsgcmVmID0gcmVmLT5uZXh0KQotICAgIHsKLSAgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmxpOwotICAgICAgYXN5bWJvbCAqKmFzeW1ib2xzOwotICAgICAgc3RydWN0IGNoZWNrX3JlZnNfaW5mbyBpbmZvOwotCi0gICAgICAvKiBXZSBuZWVkIHRvIGxvb2sgdGhyb3VnaCB0aGUgcmVsb2NhdGlvbnMgZm9yIHRoaXMgQkZELCB0byBzZWUKLSAgICAgICAgIGlmIGFueSBvZiB0aGUgcmVsb2NhdGlvbnMgd2hpY2ggcmVmZXIgdG8gdGhpcyBzeW1ib2wgYXJlIGZyb20KLSAgICAgICAgIGEgcHJvaGliaXRlZCBzZWN0aW9uLiAgTm90ZSB0aGF0IHdlIG5lZWQgdG8gZG8gdGhpcyBldmVuIGZvcgotICAgICAgICAgdGhlIEJGRCBpbiB3aGljaCB0aGUgc3ltYm9sIGlzIGRlZmluZWQsIHNpbmNlIGV2ZW4gYSBzaW5nbGUKLSAgICAgICAgIEJGRCBtaWdodCBjb250YWluIGEgcHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2U7IGZvciB0aGlzCi0gICAgICAgICBjYXNlLCB3ZSBzZXQgdGhlIFNBTUUgZmllbGQgaW4gSU5GTywgd2hpY2ggd2lsbCBjYXVzZQotICAgICAgICAgQ0hFQ0tfUkVMT0NTX1JFRlMgdG8gY2hlY2sgZm9yIHJlbG9jYXRpb25zIGFnYWluc3QgdGhlCi0gICAgICAgICBzZWN0aW9uIGFzIHdlbGwgYXMgYWdhaW5zdCB0aGUgc3ltYm9sLiAgKi8KLQotICAgICAgbGkgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSByZWYtPmFiZmQtPnVzcmRhdGE7Ci0gICAgICBpZiAobGkgIT0gTlVMTCAmJiBsaS0+YXN5bWJvbHMgIT0gTlVMTCkKLQlhc3ltYm9scyA9IGxpLT5hc3ltYm9sczsKLSAgICAgIGVsc2UKLQl7Ci0JICBsb25nIHN5bXNpemU7Ci0JICBsb25nIHN5bWJvbF9jb3VudDsKLQotCSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChyZWYtPmFiZmQpOwotCSAgaWYgKHN5bXNpemUgPCAwKQotCSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sczsgJUVcbiIpLCByZWYtPmFiZmQpOwotCSAgYXN5bWJvbHMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltc2l6ZSk7Ci0JICBzeW1ib2xfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAocmVmLT5hYmZkLCBhc3ltYm9scyk7Ci0JICBpZiAoc3ltYm9sX2NvdW50IDwgMCkKLQkgICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iKSwgcmVmLT5hYmZkKTsKLQkgIGlmIChsaSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgbGktPmFzeW1ib2xzID0gYXN5bWJvbHM7Ci0JICAgICAgbGktPnN5bWJvbF9jb3VudCA9IHN5bWJvbF9jb3VudDsKLQkgICAgfQotCX0KLQotICAgICAgaW5mby5oID0gaDsKLSAgICAgIGluZm8uZGVmc2VjID0gaGwtPnUuZGVmLnNlY3Rpb247Ci0gICAgICBpbmZvLm5jcnMgPSBuY3JzOwotICAgICAgaW5mby5hc3ltYm9scyA9IGFzeW1ib2xzOwotICAgICAgaWYgKHJlZi0+YWJmZCA9PSBobC0+dS5kZWYuc2VjdGlvbi0+b3duZXIpCi0JaW5mby5zYW1lID0gdHJ1ZTsKLSAgICAgIGVsc2UKLQlpbmZvLnNhbWUgPSBmYWxzZTsKLSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAocmVmLT5hYmZkLCBjaGVja19yZWxvY19yZWZzLCAoUFRSKSAmaW5mbyk7Ci0KLSAgICAgIGlmIChsaSA9PSBOVUxMKQotCWZyZWUgKGFzeW1ib2xzKTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHZpYSBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICBJTkZPLT5IIGlzIGEgc3ltYm9sCi0gICBkZWZpbmVkIGluIElORk8tPkRFRlNFQ05BTUUuICBJZiB0aGlzIHNlY3Rpb24gbWFwcyBpbnRvIGFueSBvZiB0aGUKLSAgIHNlY3Rpb25zIGxpc3RlZCBpbiBJTkZPLT5OQ1JTLCBvdGhlciB0aGFuIElORk8tPkRFRlNFQ05BTUUsIHRoZW4gd2UKLSAgIGxvb2sgdGhyb3VnaCB0aGUgcmVsb2NhdGlvbnMuICBJZiBhbnkgb2YgdGhlIHJlbG9jYXRpb25zIGFyZSB0bwotICAgSU5GTy0+SCwgdGhlbiB3ZSByZXBvcnQgYSBwcm9oaWJpdGVkIGNyb3NzIHJlZmVyZW5jZSBlcnJvci4gICovCi0KLXN0YXRpYyB2b2lkCi1jaGVja19yZWxvY19yZWZzIChhYmZkLCBzZWMsIGlhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGlhcmc7Ci17Ci0gIHN0cnVjdCBjaGVja19yZWZzX2luZm8gKmluZm8gPSAoc3RydWN0IGNoZWNrX3JlZnNfaW5mbyAqKSBpYXJnOwotICBhc2VjdGlvbiAqb3V0c2VjOwotICBjb25zdCBjaGFyICpvdXRzZWNuYW1lOwotICBhc2VjdGlvbiAqb3V0ZGVmc2VjOwotICBjb25zdCBjaGFyICpvdXRkZWZzZWNuYW1lOwotICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICpuY3I7Ci0gIGNvbnN0IGNoYXIgKnN5bW5hbWU7Ci0gIGxvbmcgcmVsc2l6ZTsKLSAgYXJlbGVudCAqKnJlbHBwOwotICBsb25nIHJlbGNvdW50OwotICBhcmVsZW50ICoqcCwgKipwZW5kOwotCi0gIG91dHNlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0gIG91dHNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0c2VjLT5vd25lciwgb3V0c2VjKTsKLQotICBvdXRkZWZzZWMgPSBpbmZvLT5kZWZzZWMtPm91dHB1dF9zZWN0aW9uOwotICBvdXRkZWZzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dGRlZnNlYy0+b3duZXIsIG91dGRlZnNlYyk7Ci0KLSAgLyogVGhlIHNlY3Rpb24gd2hlcmUgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGlzIHBlcm1pdHRlZC4gICovCi0gIGlmIChzdHJjbXAgKG91dHNlY25hbWUsIG91dGRlZnNlY25hbWUpID09IDApCi0gICAgcmV0dXJuOwotCi0gIGZvciAobmNyID0gaW5mby0+bmNycy0+bGlzdDsgbmNyICE9IE5VTEw7IG5jciA9IG5jci0+bmV4dCkKLSAgICBpZiAoc3RyY21wIChvdXRzZWNuYW1lLCBuY3ItPm5hbWUpID09IDApCi0gICAgICBicmVhazsKLQotICBpZiAobmNyID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIC8qIFRoaXMgc2VjdGlvbiBpcyBvbmUgZm9yIHdoaWNoIGNyb3NzIHJlZmVyZW5jZXMgYXJlIHByb2hpYml0ZWQuCi0gICAgIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NhdGlvbnMsIGFuZCBzZWUgaWYgYW55IG9mIHRoZW0gYXJlIHRvCi0gICAgIElORk8tPkguICAqLwotCi0gIHN5bW5hbWUgPSBpbmZvLT5oLT5yb290LnN0cmluZzsKLQotICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjKTsKLSAgaWYgKHJlbHNpemUgPCAwKQotICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCByZWxvY3M6ICVFXG4iKSwgYWJmZCk7Ci0gIGlmIChyZWxzaXplID09IDApCi0gICAgcmV0dXJuOwotCi0gIHJlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlYywgcmVscHAsIGluZm8tPmFzeW1ib2xzKTsKLSAgaWYgKHJlbGNvdW50IDwgMCkKLSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgcmVsb2NzOiAlRVxuIiksIGFiZmQpOwotCi0gIHAgPSByZWxwcDsKLSAgcGVuZCA9IHAgKyByZWxjb3VudDsKLSAgZm9yICg7IHAgPCBwZW5kICYmICpwICE9IE5VTEw7IHArKykKLSAgICB7Ci0gICAgICBhcmVsZW50ICpxID0gKnA7Ci0KLSAgICAgIGlmIChxLT5zeW1fcHRyX3B0ciAhPSBOVUxMCi0JICAmJiAqcS0+c3ltX3B0cl9wdHIgIT0gTlVMTAotCSAgJiYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoKnEtPnN5bV9wdHJfcHRyKSwgc3ltbmFtZSkgPT0gMAotCSAgICAgIHx8IChpbmZvLT5zYW1lCi0JCSAgJiYgYmZkX2dldF9zZWN0aW9uICgqcS0+c3ltX3B0cl9wdHIpID09IGluZm8tPmRlZnNlYykpKQotCXsKLQkgIC8qIFdlIGZvdW5kIGEgcmVsb2MgZm9yIHRoZSBzeW1ib2wuICBUaGUgc3ltYm9sIGlzIGRlZmluZWQKLSAgICAgICAgICAgICBpbiBPVVRTRUNOQU1FLiAgVGhpcyByZWxvYyBpcyBmcm9tIGEgc2VjdGlvbiB3aGljaCBpcwotICAgICAgICAgICAgIG1hcHBlZCBpbnRvIGEgc2VjdGlvbiBmcm9tIHdoaWNoIHJlZmVyZW5jZXMgdG8gT1VUU0VDTkFNRQotICAgICAgICAgICAgIGFyZSBwcm9oaWJpdGVkLiAgV2UgbXVzdCByZXBvcnQgYW4gZXJyb3IuICAqLwotCSAgZWluZm8gKF8oIiVYJUM6IHByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlIGZyb20gJXMgdG8gYCVUJyBpbiAlc1xuIiksCi0JCSBhYmZkLCBzZWMsIHEtPmFkZHJlc3MsIG91dHNlY25hbWUsCi0JCSBiZmRfYXN5bWJvbF9uYW1lICgqcS0+c3ltX3B0cl9wdHIpLCBvdXRkZWZzZWNuYW1lKTsKLQl9Ci0gICAgfQotCi0gIGZyZWUgKHJlbHBwKTsKLX0KZGlmZiAtLWdpdCBhL2xkL2xkY3Rvci5jIGIvbGQvbGRjdG9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNDM0YjguLjAwMDAwMDAKLS0tIGEvbGQvbGRjdG9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODMgKzAsMCBAQAotLyogbGRjdG9yLmMgLS0gY29uc3RydWN0b3Igc3VwcG9ydCByb3V0aW5lcwotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLSAgIAotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRjdG9yLmgiCi0KLXN0YXRpYyBpbnQgY3Rvcl9wcmlvIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBjdG9yX2NtcCBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi0vKiBUaGUgbGlzdCBvZiBzdGF0ZW1lbnRzIG5lZWRlZCB0byBoYW5kbGUgY29uc3RydWN0b3JzLiAgVGhlc2UgYXJlCi0gICBpbnZva2VkIGJ5IHRoZSBjb21tYW5kIENPTlNUUlVDVE9SUyBpbiB0aGUgbGlua2VyIHNjcmlwdC4gICovCi1sYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgY29uc3RydWN0b3JfbGlzdDsKLQotLyogV2hldGhlciB0aGUgY29uc3RydWN0b3JzIHNob3VsZCBiZSBzb3J0ZWQuICBOb3RlIHRoYXQgdGhpcyBpcwotICAgZ2xvYmFsIGZvciB0aGUgZW50aXJlIGxpbms7IHdlIGFzc3VtZSB0aGF0IHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUKLSAgIENPTlNUUlVDVE9SUyBjb21tYW5kIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLWJvb2xlYW4gY29uc3RydWN0b3JzX3NvcnRlZDsKLQotLyogVGhlIHNldHMgd2UgaGF2ZSBzZWVuLiAgKi8KLXN0cnVjdCBzZXRfaW5mbyAqc2V0czsKLQotLyogQWRkIGFuIGVudHJ5IHRvIGEgc2V0LiAgSCBpcyB0aGUgZW50cnkgaW4gdGhlIGxpbmtlciBoYXNoIHRhYmxlLgotICAgUkVMT0MgaXMgdGhlIHJlbG9jYXRpb24gdG8gdXNlIGZvciBhbiBlbnRyeSBpbiB0aGUgc2V0LiAgU0VDVElPTgotICAgYW5kIFZBTFVFIGFyZSB0aGUgdmFsdWUgdG8gYWRkLiAgVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHRoZSBmaXJzdAotICAgcGhhc2Ugb2YgdGhlIGxpbmssIHdoZW4gd2UgYXJlIHN0aWxsIGdhdGhlcmluZyBzeW1ib2xzIHRvZ2V0aGVyLgotICAgV2UganVzdCByZWNvcmQgdGhlIGluZm9ybWF0aW9uIG5vdy4gIFRoZSBsZGN0b3JfZmluZF9jb25zdHJ1Y3RvcnMKLSAgIGZ1bmN0aW9uIHdpbGwgY29uc3RydWN0IHRoZSBzZXRzLiAgKi8KLQotdm9pZAotbGRjdG9yX2FkZF9zZXRfZW50cnkgKGgsIHJlbG9jLCBuYW1lLCBzZWN0aW9uLCB2YWx1ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIHN0cnVjdCBzZXRfaW5mbyAqcDsKLSAgc3RydWN0IHNldF9lbGVtZW50ICplOwotICBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKiplcHA7Ci0KLSAgZm9yIChwID0gc2V0czsgcCAhPSAoc3RydWN0IHNldF9pbmZvICopIE5VTEw7IHAgPSBwLT5uZXh0KQotICAgIGlmIChwLT5oID09IGgpCi0gICAgICBicmVhazsKLQotICBpZiAocCA9PSAoc3RydWN0IHNldF9pbmZvICopIE5VTEwpCi0gICAgewotICAgICAgcCA9IChzdHJ1Y3Qgc2V0X2luZm8gKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc2V0X2luZm8pKTsKLSAgICAgIHAtPm5leHQgPSBzZXRzOwotICAgICAgc2V0cyA9IHA7Ci0gICAgICBwLT5oID0gaDsKLSAgICAgIHAtPnJlbG9jID0gcmVsb2M7Ci0gICAgICBwLT5jb3VudCA9IDA7Ci0gICAgICBwLT5lbGVtZW50cyA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHAtPnJlbG9jICE9IHJlbG9jKQotCXsKLQkgIGVpbmZvIChfKCIlUCVYOiBEaWZmZXJlbnQgcmVsb2NzIHVzZWQgaW4gc2V0ICVzXG4iKSwgaC0+cm9vdC5zdHJpbmcpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgLyogRG9uJ3QgcGVybWl0IGEgc2V0IHRvIGJlIGNvbnN0cnVjdGVkIGZyb20gZGlmZmVyZW50IG9iamVjdAotICAgICAgICAgZmlsZSBmb3JtYXRzLiAgVGhlIHNhbWUgcmVsb2MgbWF5IGhhdmUgZGlmZmVyZW50IHJlc3VsdHMuICBXZQotICAgICAgICAgYWN0dWFsbHkgY291bGQgc29tZXRpbWVzIGhhbmRsZSB0aGlzLCBidXQgdGhlIGNhc2UgaXMKLSAgICAgICAgIHVubGlrZWx5IHRvIGV2ZXIgYXJpc2UuICBTb21ldGltZXMgY29uc3RydWN0b3Igc3ltYm9scyBhcmUgaW4KLSAgICAgICAgIHVudXN1YWwgc2VjdGlvbnMsIHN1Y2ggYXMgdGhlIGFic29sdXRlIHNlY3Rpb24tLXRoaXMgYXBwZWFycwotICAgICAgICAgdG8gYmUgdGhlIGNhc2UgaW4gTGludXggYS5vdXQtLWFuZCBpbiBzdWNoIGNhc2VzIHdlIGp1c3QKLSAgICAgICAgIGFzc3VtZSBldmVyeXRoaW5nIGlzIE9LLiAgKi8KLSAgICAgIGlmIChwLT5lbGVtZW50cyAhPSBOVUxMCi0JICAmJiBzZWN0aW9uLT5vd25lciAhPSBOVUxMCi0JICAmJiBwLT5lbGVtZW50cy0+c2VjdGlvbi0+b3duZXIgIT0gTlVMTAotCSAgJiYgc3RyY21wIChiZmRfZ2V0X3RhcmdldCAoc2VjdGlvbi0+b3duZXIpLAotCQkgICAgIGJmZF9nZXRfdGFyZ2V0IChwLT5lbGVtZW50cy0+c2VjdGlvbi0+b3duZXIpKSAhPSAwKQotCXsKLQkgIGVpbmZvIChfKCIlUCVYOiBEaWZmZXJlbnQgb2JqZWN0IGZpbGUgZm9ybWF0cyBjb21wb3Npbmcgc2V0ICVzXG4iKSwKLQkJIGgtPnJvb3Quc3RyaW5nKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGUgPSAoc3RydWN0IHNldF9lbGVtZW50ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNldF9lbGVtZW50KSk7Ci0gIGUtPm5leHQgPSBOVUxMOwotICBlLT5uYW1lID0gbmFtZTsKLSAgZS0+c2VjdGlvbiA9IHNlY3Rpb247Ci0gIGUtPnZhbHVlID0gdmFsdWU7Ci0KLSAgZm9yIChlcHAgPSAmcC0+ZWxlbWVudHM7ICplcHAgIT0gTlVMTDsgZXBwID0gJigqZXBwKS0+bmV4dCkKLSAgICA7Ci0gICplcHAgPSBlOwotCi0gICsrcC0+Y291bnQ7Ci19Ci0KLS8qIEdldCB0aGUgcHJpb3JpdHkgb2YgYSBnKysgZ2xvYmFsIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgZnJvbSB0aGUKLSAgIHN5bWJvbCBuYW1lLiAgKi8KLQotc3RhdGljIGludAotY3Rvcl9wcmlvIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICAvKiBUaGUgbmFtZSB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgX0dMT0JBTF8kSSQ2NTUzNSR0ZXN0MDJfX0Z2LgotICAgICBUaGVyZSBtaWdodCBiZSBleHRyYSBsZWFkaW5nIHVuZGVyc2NvcmVzLCBhbmQgdGhlICQgY2hhcmFjdGVycwotICAgICBtaWdodCBiZSBzb21ldGhpbmcgZWxzZS4gIFRoZSBJIG1pZ2h0IGJlIGEgRC4gICovCi0KLSAgd2hpbGUgKCpuYW1lID09ICdfJykKLSAgICArK25hbWU7Ci0KLSAgaWYgKHN0cm5jbXAgKG5hbWUsICJHTE9CQUxfIiwgIHNpemVvZiAiR0xPQkFMXyIgLSAxKSAhPSAwKQotICAgIHJldHVybiAtMTsKLQotICBuYW1lICs9IHNpemVvZiAiR0xPQkFMXyIgLSAxOwotCi0gIGlmIChuYW1lWzBdICE9IG5hbWVbMl0pCi0gICAgcmV0dXJuIC0xOwotICBpZiAobmFtZVsxXSAhPSAnSScgJiYgbmFtZVsxXSAhPSAnRCcpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgbmFtZVszXSkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiBhdG9pIChuYW1lICsgMyk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzb3J0IGNvbnN0cnVjdG9yIGVsZW1lbnRzIGJ5IHByaW9yaXR5LiAgSXQKLSAgIGlzIGNhbGxlZCB2aWEgcXNvcnQuICAqLwotCi1zdGF0aWMgaW50Ci1jdG9yX2NtcCAocDEsIHAyKQotICAgICBjb25zdCBQVFIgcDE7Ci0gICAgIGNvbnN0IFBUUiBwMjsKLXsKLSAgY29uc3Qgc3RydWN0IHNldF9lbGVtZW50ICoqcGUxID0gKGNvbnN0IHN0cnVjdCBzZXRfZWxlbWVudCAqKikgcDE7Ci0gIGNvbnN0IHN0cnVjdCBzZXRfZWxlbWVudCAqKnBlMiA9IChjb25zdCBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKiopIHAyOwotICBjb25zdCBjaGFyICpuMTsKLSAgY29uc3QgY2hhciAqbjI7Ci0gIGludCBwcmlvMTsKLSAgaW50IHByaW8yOwotCi0gIG4xID0gKCpwZTEpLT5uYW1lOwotICBpZiAobjEgPT0gTlVMTCkKLSAgICBuMSA9ICIiOwotICBuMiA9ICgqcGUyKS0+bmFtZTsKLSAgaWYgKG4yID09IE5VTEwpCi0gICAgbjIgPSAiIjsKLQotICAvKiBXZSBuZWVkIHRvIHNvcnQgaW4gcmV2ZXJzZSBvcmRlciBieSBwcmlvcml0eS4gIFdoZW4gdHdvCi0gICAgIGNvbnN0cnVjdG9ycyBoYXZlIHRoZSBzYW1lIHByaW9yaXR5LCB3ZSBzaG91bGQgbWFpbnRhaW4gdGhlaXIKLSAgICAgY3VycmVudCByZWxhdGl2ZSBwb3NpdGlvbi4gICovCi0KLSAgcHJpbzEgPSBjdG9yX3ByaW8gKG4xKTsKLSAgcHJpbzIgPSBjdG9yX3ByaW8gKG4yKTsKLQotICAvKiBXZSBzb3J0IGluIHJldmVyc2Ugb3JkZXIgYmVjYXVzZSB0aGF0IGlzIHdoYXQgZysrIGV4cGVjdHMuICAqLwotICBpZiAocHJpbzEgPCBwcmlvMikKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAocHJpbzEgPiBwcmlvMikKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogRm9yY2UgYSBzdGFibGUgc29ydC4gICovCi0KLSAgaWYgKHBlMSA8IHBlMikKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKHBlMSA+IHBlMikKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgZmlyc3QgcGhhc2Ugb2YgdGhlIGxpbmsgYW5kCi0gICBiZWZvcmUgdGhlIHNlY29uZCBwaGFzZS4gIEF0IHRoaXMgcG9pbnQgYWxsIHNldCBpbmZvcm1hdGlvbiBoYXMKLSAgIGJlZW4gZ2F0aGVyZWQuICBXZSBub3cgcHV0IHRoZSBzdGF0ZW1lbnRzIHRvIGJ1aWxkIHRoZSBzZXRzCi0gICB0aGVtc2VsdmVzIGludG8gY29uc3RydWN0b3JfbGlzdC4gICovCi0KLXZvaWQKLWxkY3Rvcl9idWlsZF9zZXRzICgpCi17Ci0gIHN0YXRpYyBib29sZWFuIGNhbGxlZDsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpvbGQ7Ci0gIGJvb2xlYW4gaGVhZGVyX3ByaW50ZWQ7Ci0gIHN0cnVjdCBzZXRfaW5mbyAqcDsKLQotICAvKiBUaGUgZW11bGF0aW9uIGNvZGUgbWF5IGNhbGwgdXMgZGlyZWN0bHksIGJ1dCB3ZSBvbmx5IHdhbnQgdG8gZG8KLSAgICAgdGhpcyBvbmNlLiAgKi8KLSAgaWYgKGNhbGxlZCkKLSAgICByZXR1cm47Ci0gIGNhbGxlZCA9IHRydWU7Ci0KLSAgaWYgKGNvbnN0cnVjdG9yc19zb3J0ZWQpCi0gICAgewotICAgICAgZm9yIChwID0gc2V0czsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpbnQgYywgaTsKLQkgIHN0cnVjdCBzZXRfZWxlbWVudCAqZTsKLQkgIHN0cnVjdCBzZXRfZWxlbWVudCAqKmFycmF5OwotCi0JICBpZiAocC0+ZWxlbWVudHMgPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIGMgPSAwOwotCSAgZm9yIChlID0gcC0+ZWxlbWVudHM7IGUgIT0gTlVMTDsgZSA9IGUtPm5leHQpCi0JICAgICsrYzsKLQotCSAgYXJyYXkgPSAoc3RydWN0IHNldF9lbGVtZW50ICoqKSB4bWFsbG9jIChjICogc2l6ZW9mICphcnJheSk7Ci0KLQkgIGkgPSAwOwotCSAgZm9yIChlID0gcC0+ZWxlbWVudHM7IGUgIT0gTlVMTDsgZSA9IGUtPm5leHQpCi0JICAgIHsKLQkgICAgICBhcnJheVtpXSA9IGU7Ci0JICAgICAgKytpOwotCSAgICB9Ci0KLQkgIHFzb3J0IChhcnJheSwgYywgc2l6ZW9mICphcnJheSwgY3Rvcl9jbXApOwotCi0JICBlID0gYXJyYXlbMF07Ci0JICBwLT5lbGVtZW50cyA9IGU7Ci0JICBmb3IgKGkgPSAwOyBpIDwgYyAtIDE7IGkrKykKLQkgICAgYXJyYXlbaV0tPm5leHQgPSBhcnJheVtpICsgMV07Ci0JICBhcnJheVtpXS0+bmV4dCA9IE5VTEw7Ci0KLQkgIGZyZWUgKGFycmF5KTsKLQl9Ci0gICAgfQotCi0gIG9sZCA9IHN0YXRfcHRyOwotICBzdGF0X3B0ciA9ICZjb25zdHJ1Y3Rvcl9saXN0OwotCi0gIGxhbmdfbGlzdF9pbml0IChzdGF0X3B0cik7Ci0KLSAgaGVhZGVyX3ByaW50ZWQgPSBmYWxzZTsKLSAgZm9yIChwID0gc2V0czsgcCAhPSAoc3RydWN0IHNldF9pbmZvICopIE5VTEw7IHAgPSBwLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBzZXRfZWxlbWVudCAqZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgaW50IHJlbG9jX3NpemUsIHNpemU7Ci0KLSAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgd2UgbWF5IGhhdmUgYmVlbiBpbnZva2VkIGZyb20KLQkgY29sbGVjdCwgYW5kIHRoZSBzZXRzIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBidWlsdCwgc28gd2UgZG8KLQkgbm90IGRvIGFueXRoaW5nLiAgKi8KLSAgICAgIGlmIChwLT5oLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgcC0+aC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEZvciBlYWNoIHNldCB3ZSBidWlsZDoKLQkgICBzZXQ6Ci0JICAgICAubG9uZyBudW1iZXJfb2ZfZWxlbWVudHMKLQkgICAgIC5sb25nIGVsZW1lbnQwCi0JICAgICAuLi4KLQkgICAgIC5sb25nIGVsZW1lbnROCi0JICAgICAubG9uZyAwCi0JIGV4Y2VwdCB0aGF0IHdlIHVzZSB0aGUgcmlnaHQgc2l6ZSBpbnN0ZWFkIG9mIC5sb25nLiAgV2hlbgotCSBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIGdlbmVyYXRlIHJlbG9jcyBpbnN0ZWFkIG9mCi0JIGFkZHJlc3Nlcy4gICovCi0gICAgICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAob3V0cHV0X2JmZCwgcC0+cmVsb2MpOwotICAgICAgaWYgKGhvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCi0JewotCSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBlaW5mbyAoXygiJVAlWDogJXMgZG9lcyBub3Qgc3VwcG9ydCByZWxvYyAlcyBmb3Igc2V0ICVzXG4iKSwKLQkJICAgICBiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCksCi0JCSAgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKHAtPnJlbG9jKSwKLQkJICAgICBwLT5oLT5yb290LnN0cmluZyk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhpcyBpcyBub3QgYSByZWxvY2F0ZWFibGUgbGluaywgYWxsIHdlIG5lZWQgaXMgdGhlCi0JICAgICBzaXplLCB3aGljaCB3ZSBjYW4gZ2V0IGZyb20gdGhlIGlucHV0IEJGRC4gICovCi0JICBpZiAocC0+ZWxlbWVudHMtPnNlY3Rpb24tPm93bmVyICE9IE5VTEwpCi0JICAgIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChwLT5lbGVtZW50cy0+c2VjdGlvbi0+b3duZXIsCi0JCQkJCSAgIHAtPnJlbG9jKTsKLQkgIGlmIChob3d0byA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZWluZm8gKF8oIiVQJVg6ICVzIGRvZXMgbm90IHN1cHBvcnQgcmVsb2MgJXMgZm9yIHNldCAlc1xuIiksCi0JCSAgICAgYmZkX2dldF90YXJnZXQgKHAtPmVsZW1lbnRzLT5zZWN0aW9uLT5vd25lciksCi0JCSAgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKHAtPnJlbG9jKSwKLQkJICAgICBwLT5oLT5yb290LnN0cmluZyk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLSAgICAgIHN3aXRjaCAocmVsb2Nfc2l6ZSkKLQl7Ci0JY2FzZSAxOiBzaXplID0gQllURTsgYnJlYWs7Ci0JY2FzZSAyOiBzaXplID0gU0hPUlQ7IGJyZWFrOwotCWNhc2UgNDogc2l6ZSA9IExPTkc7IGJyZWFrOwotCWNhc2UgODoKLQkgIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgPT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkKQotCSAgICBzaXplID0gU1FVQUQ7Ci0JICBlbHNlCi0JICAgIHNpemUgPSBRVUFEOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGVpbmZvIChfKCIlUCVYOiBVbnN1cHBvcnRlZCBzaXplICVkIGZvciBzZXQgJXNcbiIpLAotCQkgYmZkX2dldF9yZWxvY19zaXplIChob3d0byksIHAtPmgtPnJvb3Quc3RyaW5nKTsKLQkgIHNpemUgPSBMT05HOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9JywgIi4iLAotCQkJCSAgICAgIGV4cF91bm9wIChBTElHTl9LLAotCQkJCQkJZXhwX2ludG9wIChyZWxvY19zaXplKSkpKTsKLSAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBwLT5oLT5yb290LnN0cmluZywKLQkJCQkgICAgICBleHBfbmFtZW9wIChOQU1FLCAiLiIpKSk7Ci0gICAgICBsYW5nX2FkZF9kYXRhIChzaXplLCBleHBfaW50b3AgKChiZmRfdm1hKSBwLT5jb3VudCkpOwotCi0gICAgICBmb3IgKGUgPSBwLT5lbGVtZW50czsgZSAhPSAoc3RydWN0IHNldF9lbGVtZW50ICopIE5VTEw7IGUgPSBlLT5uZXh0KQotCXsKLQkgIGlmIChjb25maWcubWFwX2ZpbGUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGludCBsZW47Ci0KLQkgICAgICBpZiAoISBoZWFkZXJfcHJpbnRlZCkKLQkJewotCQkgIG1pbmZvIChfKCJcblNldCAgICAgICAgICAgICAgICAgU3ltYm9sXG5cbiIpKTsKLQkJICBoZWFkZXJfcHJpbnRlZCA9IHRydWU7Ci0JCX0KLQotCSAgICAgIG1pbmZvICgiJXMiLCBwLT5oLT5yb290LnN0cmluZyk7Ci0JICAgICAgbGVuID0gc3RybGVuIChwLT5oLT5yb290LnN0cmluZyk7Ci0KLQkgICAgICBpZiAobGVuID49IDE5KQotCQl7Ci0JCSAgcHJpbnRfbmwgKCk7Ci0JCSAgbGVuID0gMDsKLQkJfQotCSAgICAgIHdoaWxlIChsZW4gPCAyMCkKLQkJewotCQkgIHByaW50X3NwYWNlICgpOwotCQkgICsrbGVuOwotCQl9Ci0KLQkgICAgICBpZiAoZS0+bmFtZSAhPSBOVUxMKQotCQltaW5mbyAoIiVUXG4iLCBlLT5uYW1lKTsKLQkgICAgICBlbHNlCi0JCW1pbmZvICgiJUdcbiIsIGUtPnNlY3Rpb24tPm93bmVyLCBlLT5zZWN0aW9uLCBlLT52YWx1ZSk7Ci0JICAgIH0KLQotICAgICAgICAgIC8qIE5lZWQgU0VDX0tFRVAgZm9yIC0tZ2Mtc2VjdGlvbnMgKi8KLQkgIGlmICghIGJmZF9pc19hYnNfc2VjdGlvbiAoZS0+c2VjdGlvbikpCi0JICAgIGUtPnNlY3Rpb24tPmZsYWdzIHw9IFNFQ19LRUVQOwotCi0JICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQkgICAgbGFuZ19hZGRfcmVsb2MgKHAtPnJlbG9jLCBob3d0bywgZS0+c2VjdGlvbiwgZS0+bmFtZSwKLQkJCSAgICBleHBfaW50b3AgKGUtPnZhbHVlKSk7Ci0JICBlbHNlCi0JICAgIGxhbmdfYWRkX2RhdGEgKHNpemUsIGV4cF9yZWxvcCAoZS0+c2VjdGlvbiwgZS0+dmFsdWUpKTsKLQl9Ci0KLSAgICAgIGxhbmdfYWRkX2RhdGEgKHNpemUsIGV4cF9pbnRvcCAoMCkpOwotICAgIH0KLQotICBzdGF0X3B0ciA9IG9sZDsKLX0KZGlmZiAtLWdpdCBhL2xkL2xkY3Rvci5oIGIvbGQvbGRjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NzNmNzcuLjAwMDAwMDAKLS0tIGEvbGQvbGRjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiBsZGN0b3IuaCAtIGxpbmtlciBjb25zdHJ1Y3RvciBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTERDVE9SX0gKLSNkZWZpbmUgTERDVE9SX0gKLQotLyogTGlzdCBvZiBzdGF0ZW1lbnRzIG5lZWRlZCB0byBoYW5kbGUgY29uc3RydWN0b3JzICovCi1leHRlcm4gbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGNvbnN0cnVjdG9yX2xpc3Q7Ci0KLS8qIFdoZXRoZXIgdGhlIGNvbnN0cnVjdG9ycyBzaG91bGQgYmUgc29ydGVkLiAgTm90ZSB0aGF0IHRoaXMgaXMKLSAgIGdsb2JhbCBmb3IgdGhlIGVudGlyZSBsaW5rOyB3ZSBhc3N1bWUgdGhhdCB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlCi0gICBDT05TVFJVQ1RPUlMgY29tbWFuZCBpbiB0aGUgbGlua2VyIHNjcmlwdC4gICovCi1leHRlcm4gYm9vbGVhbiBjb25zdHJ1Y3RvcnNfc29ydGVkOwotCi0vKiBXZSBrZWVwIGEgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGZvciBlYWNoIHNldCB3ZSBidWlsZC4gICovCi0KLXN0cnVjdCBzZXRfaW5mbwotewotICBzdHJ1Y3Qgc2V0X2luZm8gKm5leHQ7CQkvKiBOZXh0IHNldC4gICovCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwkvKiBIYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwkvKiBSZWxvYyB0byB1c2UgZm9yIGFuIGVudHJ5LiAgKi8KLSAgc2l6ZV90IGNvdW50OwkJCQkvKiBOdW1iZXIgb2YgZWxlbWVudHMuICAqLwotICBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKmVsZW1lbnRzOwkJLyogRWxlbWVudHMgaW4gc2V0LiAgKi8KLX07Ci0KLXN0cnVjdCBzZXRfZWxlbWVudAotewotICBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKm5leHQ7CQkvKiBOZXh0IGVsZW1lbnQuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwkJCS8qIE5hbWUgaW4gc2V0IChtYXkgYmUgTlVMTCkuICAqLwotICBhc2VjdGlvbiAqc2VjdGlvbjsJCQkvKiBTZWN0aW9uIG9mIHZhbHVlIGluIHNldC4gICovCi0gIGJmZF92bWEgdmFsdWU7CQkJLyogVmFsdWUgaW4gc2V0LiAgKi8KLX07Ci0KLS8qIFRoZSBzZXRzIHdlIGhhdmUgc2Vlbi4gICovCi0KLWV4dGVybiBzdHJ1Y3Qgc2V0X2luZm8gKnNldHM7Ci0KLWV4dGVybiB2b2lkIGxkY3Rvcl9hZGRfc2V0X2VudHJ5IFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCi0JCQkJCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLAotCQkJCQkgIGNvbnN0IGNoYXIgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotZXh0ZXJuIHZvaWQgbGRjdG9yX2J1aWxkX3NldHMgUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL2xkZW11bC5jIGIvbGQvbGRlbXVsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjA0MzIuLjAwMDAwMDAKLS0tIGEvbGQvbGRlbXVsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyogbGRlbXVsLmMgLS0gY2xlYXJpbmcgaG91c2UgZm9yIGxkIGVtdWxhdGlvbiBzdGF0ZXMKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwtbGlzdC5oIgotCi1sZF9lbXVsYXRpb25feGZlcl90eXBlICpsZF9lbXVsYXRpb247Ci0KLXZvaWQKLWxkZW11bF9obGwobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgbGRfZW11bGF0aW9uLT5obGwobmFtZSk7Ci19Ci0KLQotdm9pZCBsZGVtdWxfc3lzbGliKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGxkX2VtdWxhdGlvbi0+c3lzbGliKG5hbWUpOwotfQotCi12b2lkCi1sZGVtdWxfYWZ0ZXJfcGFyc2UoKQotewotICBsZF9lbXVsYXRpb24tPmFmdGVyX3BhcnNlKCk7Ci19Ci0KLXZvaWQKLWxkZW11bF9iZWZvcmVfcGFyc2UoKQotewotICBsZF9lbXVsYXRpb24tPmJlZm9yZV9wYXJzZSgpOwotfQotCi12b2lkCi1sZGVtdWxfYWZ0ZXJfb3BlbiAoKQotewotICBsZF9lbXVsYXRpb24tPmFmdGVyX29wZW4gKCk7Ci19Ci0KLXZvaWQgCi1sZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbigpCi17Ci0gIGxkX2VtdWxhdGlvbi0+YWZ0ZXJfYWxsb2NhdGlvbigpOwotfQotCi12b2lkIAotbGRlbXVsX2JlZm9yZV9hbGxvY2F0aW9uKCkKLXsKLSAgaWYgKGxkX2VtdWxhdGlvbi0+YmVmb3JlX2FsbG9jYXRpb24pCi0gICAgbGRfZW11bGF0aW9uLT5iZWZvcmVfYWxsb2NhdGlvbigpOwotfQotCi0KLXZvaWQKLWxkZW11bF9zZXRfb3V0cHV0X2FyY2goKQotewotICBsZF9lbXVsYXRpb24tPnNldF9vdXRwdXRfYXJjaCgpOwotfQotCi12b2lkCi1sZGVtdWxfZmluaXNoKCkKLXsKLSAgaWYgKGxkX2VtdWxhdGlvbi0+ZmluaXNoKQotICAgIGxkX2VtdWxhdGlvbi0+ZmluaXNoKCk7Ci19Ci0KLXZvaWQKLWxkZW11bF9zZXRfc3ltYm9scygpCi17Ci0gIGlmIChsZF9lbXVsYXRpb24tPnNldF9zeW1ib2xzKQotICAgIGxkX2VtdWxhdGlvbi0+c2V0X3N5bWJvbHMoKTsKLX0KLQotdm9pZAotbGRlbXVsX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKCkKLXsKLSAgaWYgKGxkX2VtdWxhdGlvbi0+Y3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpCi0gICAgbGRfZW11bGF0aW9uLT5jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cygpOwotfQotCi1jaGFyICoKLWxkZW11bF9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci17Ci0gIHJldHVybiBsZF9lbXVsYXRpb24tPmdldF9zY3JpcHQoaXNmaWxlKTsKLX0KLQotYm9vbGVhbgotbGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlIChhcmNoLCBzZWFyY2gsIGVudHJ5KQotICAgICBjb25zdCBjaGFyICphcmNoOwotICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBpZiAobGRfZW11bGF0aW9uLT5vcGVuX2R5bmFtaWNfYXJjaGl2ZSkKLSAgICByZXR1cm4gKCpsZF9lbXVsYXRpb24tPm9wZW5fZHluYW1pY19hcmNoaXZlKSAoYXJjaCwgc2VhcmNoLCBlbnRyeSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbGVhbgotbGRlbXVsX3BsYWNlX29ycGhhbiAoZmlsZSwgcykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGlmIChsZF9lbXVsYXRpb24tPnBsYWNlX29ycGhhbikKLSAgICByZXR1cm4gKCpsZF9lbXVsYXRpb24tPnBsYWNlX29ycGhhbikgKGZpbGUsIHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWludAotbGRlbXVsX3BhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgLyogVHJ5IGFuZCB1c2UgdGhlIGVtdWxhdGlvbiBwYXJzZXIgaWYgdGhlcmUgaXMgb25lLiAqLwotICBpZiAobGRfZW11bGF0aW9uLT5wYXJzZV9hcmdzKQotICAgIHsKLSAgICAgIHJldHVybiBsZF9lbXVsYXRpb24tPnBhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIExldCB0aGUgZW11bGF0aW9uIGNvZGUgaGFuZGxlIGFuIHVucmVjb2duaXplZCBmaWxlLiAgKi8KLQotYm9vbGVhbgotbGRlbXVsX3VucmVjb2duaXplZF9maWxlIChlbnRyeSkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGlmIChsZF9lbXVsYXRpb24tPnVucmVjb2duaXplZF9maWxlKQotICAgIHJldHVybiAoKmxkX2VtdWxhdGlvbi0+dW5yZWNvZ25pemVkX2ZpbGUpIChlbnRyeSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogTGV0IHRoZSBlbXVsYXRpb24gY29kZSBoYW5kbGUgYSByZWNvZ25pemVkIGZpbGUuICAqLwotCi1ib29sZWFuCi1sZGVtdWxfcmVjb2duaXplZF9maWxlIChlbnRyeSkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGlmIChsZF9lbXVsYXRpb24tPnJlY29nbml6ZWRfZmlsZSkKLSAgICByZXR1cm4gKCpsZF9lbXVsYXRpb24tPnJlY29nbml6ZWRfZmlsZSkgKGVudHJ5KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1jaGFyICoKLWxkZW11bF9jaG9vc2VfdGFyZ2V0KCkKLXsKLSAgcmV0dXJuIGxkX2VtdWxhdGlvbi0+Y2hvb3NlX3RhcmdldCgpOwotfQotCi0vKiBUaGUgZGVmYXVsdCBjaG9vc2VfdGFyZ2V0IGZ1bmN0aW9uLiAgKi8KLQotY2hhciAqCi1sZGVtdWxfZGVmYXVsdF90YXJnZXQoKQotewotICBjaGFyICpmcm9tX291dHNpZGUgPSBnZXRlbnYgKFRBUkdFVF9FTlZJUk9OKTsKLSAgaWYgKGZyb21fb3V0c2lkZSAhPSAoY2hhciAqKU5VTEwpCi0gICAgcmV0dXJuIGZyb21fb3V0c2lkZTsKLSAgcmV0dXJuIGxkX2VtdWxhdGlvbi0+dGFyZ2V0X25hbWU7Ci19Ci0KLXZvaWQgCi1hZnRlcl9wYXJzZV9kZWZhdWx0KCkKLXsKLQotfQotCi12b2lkCi1hZnRlcl9vcGVuX2RlZmF1bHQgKCkKLXsKLX0KLQotdm9pZAotYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0KCkKLXsKLQotfQotCi12b2lkCi1iZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0KCkKLXsKLQotfQotCi12b2lkCi1zZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCgpCi17Ci0gIC8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBpZiBwb3NzaWJsZSAqLwotICBiZmRfc2V0X2FyY2hfbWFjaChvdXRwdXRfYmZkLAotCSAgICAgICAgICAgIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlLCBsZGZpbGVfb3V0cHV0X21hY2hpbmUpOwotfQotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLXN5c2xpYl9kZWZhdWx0KGlnbm9yZSkKLSAgICAgY2hhciAgKmlnbm9yZTsKLXsKLSAgaW5mb19tc2cgKF8oIiVTIFNZU0xJQiBpZ25vcmVkXG4iKSk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotdm9pZAotaGxsX2RlZmF1bHQoaWdub3JlKQotICAgICBjaGFyICAqaWdub3JlOwotewotICBpbmZvX21zZyAoXygiJVMgSExMIGlnbm9yZWRcbiIpKTsKLX0KLQotbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqbGRfZW11bGF0aW9uc1tdID0geyBFTVVMQVRJT05fTElTVCB9OwotCi12b2lkCi1sZGVtdWxfY2hvb3NlX21vZGUodGFyZ2V0KQotICAgICBjaGFyICp0YXJnZXQ7Ci17Ci0gICAgbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqKmVwdHIgPSBsZF9lbXVsYXRpb25zOwotICAgIC8qIElnbm9yZSAiZ2xkIiBwcmVmaXguICovCi0gICAgaWYgKHRhcmdldFswXSA9PSAnZycgJiYgdGFyZ2V0WzFdID09ICdsJyAmJiB0YXJnZXRbMl0gPT0gJ2QnKQotCXRhcmdldCArPSAzOwotICAgIGZvciAoOyAqZXB0cjsgZXB0cisrKQotICAgICAgewotCWlmIChzdHJjbXAodGFyZ2V0LCAoKmVwdHIpLT5lbXVsYXRpb25fbmFtZSkgPT0gMCkKLQkgIHsKLQkgICAgbGRfZW11bGF0aW9uID0gKmVwdHI7Ci0JICAgIHJldHVybjsKLQkgIH0KLSAgICAgIH0KLSAgICBlaW5mbyAoXygiJVA6IHVucmVjb2duaXNlZCBlbXVsYXRpb24gbW9kZTogJXNcbiIpLCB0YXJnZXQpOwotICAgIGVpbmZvIChfKCJTdXBwb3J0ZWQgZW11bGF0aW9uczogIikpOwotICAgIGxkZW11bF9saXN0X2VtdWxhdGlvbnMgKHN0ZGVycik7Ci0gICAgZWluZm8gKCIlRlxuIik7Ci19Ci0KLXZvaWQKLWxkZW11bF9saXN0X2VtdWxhdGlvbnMgKGYpCi0gICAgIEZJTEUgKmY7Ci17Ci0gIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKiplcHRyID0gbGRfZW11bGF0aW9uczsKLSAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0KLSAgZm9yICg7ICplcHRyOyBlcHRyKyspCi0gICAgewotICAgICAgaWYgKGZpcnN0KQotCWZpcnN0ID0gZmFsc2U7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoZiwgIiAiKTsKLSAgICAgIGZwcmludGYgKGYsICIlcyIsICgqZXB0ciktPmVtdWxhdGlvbl9uYW1lKTsKLSAgICB9Ci19Ci0KLXZvaWQKLWxkZW11bF9saXN0X2VtdWxhdGlvbl9vcHRpb25zIChmKQotICAgICBGSUxFICogZjsKLXsKLSAgbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqKiBlcHRyOwotICBpbnQgb3B0aW9uc19mb3VuZCA9IDA7Ci0gIAotICBmb3IgKGVwdHIgPSBsZF9lbXVsYXRpb25zOyAqIGVwdHI7IGVwdHIgKyspCi0gICAgewotICAgICAgbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqIGVtdWwgPSAqIGVwdHI7Ci0gICAgICAKLSAgICAgIGlmIChlbXVsLT5saXN0X29wdGlvbnMpCi0JewotCSAgZnByaW50ZiAoZiwgIiVzOiBcbiIsIGVtdWwtPmVtdWxhdGlvbl9uYW1lKTsKLSAgICAgIAotCSAgZW11bC0+bGlzdF9vcHRpb25zIChmKTsKLQotCSAgb3B0aW9uc19mb3VuZCA9IDE7Ci0JfQotICAgIH0KLSAgCi0gIGlmICghIG9wdGlvbnNfZm91bmQpCi0gICAgZnByaW50ZiAoZiwgXygiICBubyBlbXVsYXRpb24gc3BlY2lmaWMgb3B0aW9ucy5cbiIpKTsKLX0KZGlmZiAtLWdpdCBhL2xkL2xkZW11bC5oIGIvbGQvbGRlbXVsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MGRlMDYuLjAwMDAwMDAKLS0tIGEvbGQvbGRlbXVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyogbGQtZW11bC5oIC0gTGlua2VyIGVtdWxhdGlvbiBoZWFkZXIgZmlsZQotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAqLwotCi0jaWZuZGVmIExERU1VTF9ICi0jZGVmaW5lIExERU1VTF9ICi0KLSNpZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3Q7Ci1zdHJ1Y3Qgc2VhcmNoX2RpcnM7Ci0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgbGRlbXVsX2hsbCBQQVJBTVMgKChjaGFyICopKTsKLWV4dGVybiB2b2lkIGxkZW11bF9zeXNsaWIgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfYWZ0ZXJfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX3NldF9vdXRwdXRfYXJjaCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gY2hhciAqbGRlbXVsX2Nob29zZV90YXJnZXQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2Nob29zZV9tb2RlIFBBUkFNUyAoKGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2xpc3RfZW11bGF0aW9ucyBQQVJBTVMgKChGSUxFICopKTsKLWV4dGVybiB2b2lkIGxkZW11bF9saXN0X2VtdWxhdGlvbl9vcHRpb25zIFBBUkFNUyAoKEZJTEUgKikpOwotZXh0ZXJuIGNoYXIgKmxkZW11bF9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfZmluaXNoIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkZW11bF9zZXRfc3ltYm9scyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIGJvb2xlYW4gbGRlbXVsX3BsYWNlX29ycGhhbgotICBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICosIGFzZWN0aW9uICopKTsKLWV4dGVybiBpbnQgbGRlbXVsX3BhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1leHRlcm4gYm9vbGVhbiBsZGVtdWxfdW5yZWNvZ25pemVkX2ZpbGUKLSAgUEFSQU1TICgoc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBsZGVtdWxfcmVjb2duaXplZF9maWxlCi0gIFBBUkFNUyAoKHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKikpOwotZXh0ZXJuIGJvb2xlYW4gbGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc3RydWN0IHNlYXJjaF9kaXJzICosCi0JICAgc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqKSk7Ci1leHRlcm4gY2hhciAqbGRlbXVsX2RlZmF1bHRfdGFyZ2V0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGFmdGVyX3BhcnNlX2RlZmF1bHQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgYWZ0ZXJfb3Blbl9kZWZhdWx0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHN5c2xpYl9kZWZhdWx0IFBBUkFNUyAoKGNoYXIqKSk7Ci1leHRlcm4gdm9pZCBobGxfZGVmYXVsdCBQQVJBTVMgKChjaGFyKikpOwotCi10eXBlZGVmIHN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QKLXsKLSAgLyogUnVuIGJlZm9yZSBwYXJzaW5nIHRoZSBjb21tYW5kIGxpbmUgYW5kIHNjcmlwdCBmaWxlLgotICAgICBTZXQgdGhlIGFyY2hpdGVjdHVyZSwgbWF5YmUgb3RoZXIgdGhpbmdzLiAgKi8KLSAgdm9pZCAgICgqYmVmb3JlX3BhcnNlKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogSGFuZGxlIHRoZSBTWVNMSUIgKGxvdyBsZXZlbCBsaWJyYXJ5KSBzY3JpcHQgY29tbWFuZC4gICovCi0gIHZvaWQgICAoKnN5c2xpYikgUEFSQU1TICgoY2hhciAqKSk7Ci0KLSAgLyogSGFuZGxlIHRoZSBITEwgKGhpZ2ggbGV2ZWwgbGlicmFyeSkgc2NyaXB0IGNvbW1hbmQuICAqLwotICB2b2lkICAgKCpobGwpIFBBUkFNUyAoKGNoYXIgKikpOwotCi0gIC8qIFJ1biBhZnRlciBwYXJzaW5nIHRoZSBjb21tYW5kIGxpbmUgYW5kIHNjcmlwdCBmaWxlLiAgKi8KLSAgdm9pZCAgICgqYWZ0ZXJfcGFyc2UpIFBBUkFNUyAoKHZvaWQpKTsKLQotICAvKiBSdW4gYWZ0ZXIgb3BlbmluZyBhbGwgaW5wdXQgZmlsZXMsIGFuZCBsb2FkaW5nIHRoZSBzeW1ib2xzLiAgKi8KLSAgdm9pZCAgICgqYWZ0ZXJfb3BlbikgUEFSQU1TICgodm9pZCkpOwotCi0gIC8qIFJ1biBhZnRlciBhbGxvY2F0aW5nIG91dHB1dCBzZWN0aW9ucy4gICovCi0gIHZvaWQgICAoKmFmdGVyX2FsbG9jYXRpb24pIFBBUkFNUyAoICh2b2lkKSk7Ci0KLSAgLyogU2V0IHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIGlmIHBvc3NpYmxlLiAgKi8KLSAgdm9pZCAgICgqc2V0X291dHB1dF9hcmNoKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogRGVjaWRlIHdoaWNoIHRhcmdldCBuYW1lIHRvIHVzZS4gICovCi0gIGNoYXIgKiAoKmNob29zZV90YXJnZXQpIFBBUkFNUyAoKHZvaWQpKTsKLQotICAvKiBSdW4gYmVmb3JlIGFsbG9jYXRpbmcgb3V0cHV0IHNlY3Rpb25zLiAgKi8KLSAgdm9pZCAgICgqYmVmb3JlX2FsbG9jYXRpb24pIFBBUkFNUyAoKHZvaWQpKTsKLQotICAvKiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGxpbmtlciBzY3JpcHQuICAqLwotICBjaGFyICogKCpnZXRfc2NyaXB0KSBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi0gIC8qIFRoZSBuYW1lIG9mIHRoaXMgZW11bGF0aW9uLiAgKi8KLSAgY2hhciAqZW11bGF0aW9uX25hbWU7Ci0KLSAgLyogVGhlIG91dHB1dCBmb3JtYXQuICAqLwotICBjaGFyICp0YXJnZXRfbmFtZTsKLQotICAvKiBSdW4gYWZ0ZXIgYXNzaWduaW5nIHZhbHVlcyBmcm9tIHRoZSBzY3JpcHQuICAqLwotICB2b2lkCSgqZmluaXNoKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogQ3JlYXRlIGFueSBvdXRwdXQgc2VjdGlvbnMgbmVlZGVkIGJ5IHRoZSB0YXJnZXQuICAqLwotICB2b2lkCSgqY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpIFBBUkFNUyAoKHZvaWQpKTsKLQotICAvKiBUcnkgdG8gb3BlbiBhIGR5bmFtaWMgbGlicmFyeS4gIEFSQ0ggaXMgYW4gYXJjaGl0ZWN0dXJlIG5hbWUsIGFuZAotICAgICBpcyBub3JtYWxseSB0aGUgZW1wdHkgc3RyaW5nLiAgRU5UUlkgaXMgdGhlIGxhbmdfaW5wdXRfc3RhdGVtZW50Ci0gICAgIHRoYXQgc2hvdWxkIGJlIG9wZW5lZC4gICovCi0gIGJvb2xlYW4gKCpvcGVuX2R5bmFtaWNfYXJjaGl2ZSkKLSAgICBQQVJBTVMgKChjb25zdCBjaGFyICphcmNoLCBzdHJ1Y3Qgc2VhcmNoX2RpcnMgKiwKLQkgICAgIHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKmVudHJ5KSk7Ci0KLSAgLyogUGxhY2UgYW4gb3JwaGFuIHNlY3Rpb24uICBSZXR1cm4gdHJ1ZSBpZiBpdCB3YXMgcGxhY2VkLCBmYWxzZSBpZgotICAgICB0aGUgZGVmYXVsdCBhY3Rpb24gc2hvdWxkIGJlIHRha2VuLiAgVGhpcyBmaWVsZCBtYXkgYmUgTlVMTCwgaW4KLSAgICAgd2hpY2ggY2FzZSB0aGUgZGVmYXVsdCBhY3Rpb24gd2lsbCBhbHdheXMgYmUgdGFrZW4uICAqLwotICBib29sZWFuICgqcGxhY2Vfb3JwaGFuKQotICAgIFBBUkFNUyAoKHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKiwgYXNlY3Rpb24gKikpOwotCi0gIC8qIFJ1biBhZnRlciBhc3NpZ25pbmcgcGFyc2luZyB3aXRoIHRoZSBhcmdzLCBidXQgYmVmb3JlIAotICAgICByZWFkaW5nIHRoZSBzY3JpcHQuICBVc2VkIHRvIGluaXRpYWxpemUgc3ltYm9scyB1c2VkIGluIHRoZSBzY3JpcHQuICovCi0gIHZvaWQJKCpzZXRfc3ltYm9scykgUEFSQU1TICgodm9pZCkpOwotCi0gIC8qIFJ1biB0byBwYXJzZSBhcmdzIHdoaWNoIHRoZSBiYXNlIGxpbmtlciBkb2Vzbid0Ci0gICAgIHVuZGVyc3RhbmQuIFJldHVybiBub24gemVybyBvbiBzdWNlc3MuICovCi0gIGludCAoKnBhcnNlX2FyZ3MpIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotCi0gIC8qIFJ1biB0byBoYW5kbGUgZmlsZXMgd2hpY2ggYXJlIG5vdCByZWNvZ25pemVkIGFzIG9iamVjdCBmaWxlcyBvcgotICAgICBhcmNoaXZlcy4gIFJldHVybiB0cnVlIGlmIHRoZSBmaWxlIHdhcyBoYW5kbGVkLiAgKi8KLSAgYm9vbGVhbiAoKnVucmVjb2duaXplZF9maWxlKQotICAgIFBBUkFNUyAoKHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKikpOwotCi0gIC8qIFJ1biB0byBsaXN0IHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyB3aGljaCBwYXJzZV9hcmdzIGhhbmRsZXMuICAqLwotICB2b2lkICgqIGxpc3Rfb3B0aW9ucykgUEFSQU1TICgoRklMRSAqKSk7Ci0KLSAgLyogUnVuIHRvIHNwZWNpYWxseSBoYW5kbGUgZmlsZXMgd2hpY2ggKmFyZSogcmVjb2duaXplZCBhcyBvYmplY3QKLSAgICAgZmlsZXMgb3IgYXJjaGl2ZXMuICBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSB3YXMgaGFuZGxlZC4gICovCi0gIGJvb2xlYW4gKCpyZWNvZ25pemVkX2ZpbGUpCi0gICAgUEFSQU1TICgoc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqKSk7Ci0KLX0gbGRfZW11bGF0aW9uX3hmZXJfdHlwZTsKLQotdHlwZWRlZiBlbnVtIAotewotICBpbnRlbF9pYzk2MF9sZF9tb2RlX2VudW0sCi0gIGRlZmF1bHRfbW9kZV9lbnVtICwKLSAgaW50ZWxfZ2xkOTYwX2xkX21vZGVfZW51bQotfSBsYW5nX2VtdWxhdGlvbl9tb2RlX2VudW1fdHlwZTsKLQotZXh0ZXJuIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKmxkX2VtdWxhdGlvbnNbXTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZGV4cC5jIGIvbGQvbGRleHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM5ZDcyNi4uMDAwMDAwMAotLS0gYS9sZC9sZGV4cC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTg1ICswLDAgQEAKLS8qIFRoaXMgbW9kdWxlIGhhbmRsZXMgZXhwcmVzc2lvbiB0cmVlcy4KLUNvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQgKHNhY0BjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVRoaXMgbW9kdWxlIGlzIGluIGNoYXJnZSBvZiB3b3JraW5nIG91dCB0aGUgY29udGVudHMgb2YgZXhwcmVzc2lvbnMuCi0KLUl0IGhhcyB0byBrZWVwIHRyYWNrIG9mIHRoZSByZWxhdGl2ZS9hYnNuZXNzIG9mIGEgc3ltYm9sIGV0Yy4gVGhpcyBpcwotZG9uZSBieSBrZWVwaW5nIGFsbCB2YWx1ZXMgaW4gYSBzdHJ1Y3QgKGFuIGV0cmVlX3ZhbHVlX3R5cGUpIHdoaWNoCi1jb250YWlucyBhIHZhbHVlLCBhIHNlY3Rpb24gdG8gd2hpY2ggaXQgaXMgcmVsYXRpdmUgYW5kIGEgdmFsaWQgYml0LgotCi0qLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0KLXN0YXRpYyB2b2lkIGV4cF9wcmludF90b2tlbiBQQVJBTVMgKCh0b2tlbl9jb2RlX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgbWFrZV9hYnMgUEFSQU1TICgoZXRyZWVfdmFsdWVfdHlwZSAqcHRyKSk7Ci1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSBuZXdfYWJzIFBBUkFNUyAoKGJmZF92bWEgdmFsdWUpKTsKLXN0YXRpYyB2b2lkIGNoZWNrIFBBUkFNUyAoKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zLAotCQkJICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqb3ApKTsKLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlIG5ld19yZWwKLSAgUEFSQU1TICgoYmZkX3ZtYSB2YWx1ZSwgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqc2VjdGlvbikpOwotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgbmV3X3JlbF9mcm9tX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkX3ZtYSB2YWx1ZSwgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqc2VjdGlvbikpOwotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgZm9sZF9iaW5hcnkKLSAgUEFSQU1TICgoZXRyZWVfdHlwZSAqdHJlZSwKLQkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpjdXJyZW50X3NlY3Rpb24sCi0JICAgbGFuZ19waGFzZV90eXBlIGFsbG9jYXRpb25fZG9uZSwKLQkgICBiZmRfdm1hIGRvdCwgYmZkX3ZtYSAqZG90cCkpOwotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgZm9sZF9uYW1lCi0gIFBBUkFNUyAoKGV0cmVlX3R5cGUgKnRyZWUsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uLAotCSAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmUsCi0JICAgYmZkX3ZtYSBkb3QpKTsKLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlIGV4cF9mb2xkX3RyZWVfbm9fZG90Ci0gIFBBUkFNUyAoKGV0cmVlX3R5cGUgKnRyZWUsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uLAotCSAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmUpKTsKLQotc3RhdGljIHZvaWQKLWV4cF9wcmludF90b2tlbiAoY29kZSkKLSAgICAgdG9rZW5fY29kZV90eXBlIGNvZGU7Ci17Ci0gIHN0YXRpYyBDT05TVCBzdHJ1Y3QKLSAgICB7Ci0gICAgICB0b2tlbl9jb2RlX3R5cGUgY29kZTsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgfSB0YWJsZVtdID0KLSAgICAgIHsKLQl7IElOVCwJImludCIgfSwKLQl7IFJFTCwgInJlbG9jYXRlYWJsZSIgfSwKLQl7IE5BTUUsIk5BTUUiIH0sCi0JeyBQTFVTRVEsIis9IiB9LAotCXsgTUlOVVNFUSwiLT0iIH0sCi0JeyBNVUxURVEsIio9IiB9LAotCXsgRElWRVEsIi89IiB9LAotCXsgTFNISUZURVEsIjw8PSIgfSwKLQl7IFJTSElGVEVRLCI+Pj0iIH0sCi0JeyBBTkRFUSwiJj0iIH0sCi0JeyBPUkVRLCJ8PSIgfSwKLQl7IE9ST1IsInx8IiB9LAotCXsgQU5EQU5ELCImJiIgfSwKLQl7IEVRLCI9PSIgfSwKLQl7IE5FLCIhPSIgfSwKLQl7IExFLCI8PSIgfSwKLQl7IEdFLCI+PSIgfSwKLQl7IExTSElGVCwiPDwiIH0sCi0JeyBSU0hJRlQsIj4+PSIgfSwKLQl7IEFMSUdOX0ssIkFMSUdOIiB9LAotCXsgQkxPQ0ssIkJMT0NLIiB9LAotCXsgU0VDVElPTlMsIlNFQ1RJT05TIiB9LAotCXsgU0laRU9GX0hFQURFUlMsIlNJWkVPRl9IRUFERVJTIiB9LAotCXsgTkVYVCwiTkVYVCIgfSwKLQl7IFNJWkVPRiwiU0laRU9GIiB9LAotCXsgQUREUiwiQUREUiIgfSwKLQl7IExPQURBRERSLCJMT0FEQUREUiIgfSwKLQl7IE1FTU9SWSwiTUVNT1JZIiB9LAotCXsgREVGSU5FRCwiREVGSU5FRCIgfSwKLQl7IFRBUkdFVF9LLCJUQVJHRVQiIH0sCi0JeyBTRUFSQ0hfRElSLCJTRUFSQ0hfRElSIiB9LAotCXsgTUFQLCJNQVAiIH0sCi0JeyBRVUFELCJRVUFEIiB9LAotCXsgU1FVQUQsIlNRVUFEIiB9LAotCXsgTE9ORywiTE9ORyIgfSwKLQl7IFNIT1JULCJTSE9SVCIgfSwKLQl7IEJZVEUsIkJZVEUiIH0sCi0JeyBFTlRSWSwiRU5UUlkiIH0sCi0JeyAwLChjaGFyICopTlVMTCB9Ci0gICAgICB9OwotICB1bnNpZ25lZCBpbnQgaWR4OwotCi0gIGZvciAoaWR4ID0gMDsgdGFibGVbaWR4XS5uYW1lICE9IChjaGFyKilOVUxMOyBpZHgrKykgewotICAgIGlmICh0YWJsZVtpZHhdLmNvZGUgPT0gY29kZSkgewotICAgICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsICIlcyIsIHRhYmxlW2lkeF0ubmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIC8qIE5vdCBpbiB0YWJsZSwganVzdCBwcmludCBpdCBhbG9uZSAqLwotICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwgIiVjIixjb2RlKTsKLX0KLQotc3RhdGljIHZvaWQgCi1tYWtlX2FicyAocHRyKQotICAgICBldHJlZV92YWx1ZV90eXBlICpwdHI7Ci17Ci0gICAgYXNlY3Rpb24gKnMgPSBwdHItPnNlY3Rpb24tPmJmZF9zZWN0aW9uOwotICAgIHB0ci0+dmFsdWUgKz0gcy0+dm1hOwotICAgIHB0ci0+c2VjdGlvbiA9IGFic19vdXRwdXRfc2VjdGlvbjsKLX0KLQotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUKLW5ld19hYnMgKHZhbHVlKQotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBldHJlZV92YWx1ZV90eXBlIG5ldzsKLSAgbmV3LnZhbGlkX3AgPSB0cnVlOwotICBuZXcuc2VjdGlvbiA9IGFic19vdXRwdXRfc2VjdGlvbjsKLSAgbmV3LnZhbHVlID0gdmFsdWU7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyB2b2lkIAotY2hlY2sgKG9zLCBuYW1lLCBvcCkKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm9wOwotewotICBpZiAob3MgPT0gTlVMTCkKLSAgICBlaW5mbyAoXygiJUYlUDogJXMgdXNlcyB1bmRlZmluZWQgc2VjdGlvbiAlc1xuIiksIG9wLCBuYW1lKTsKLSAgaWYgKCEgb3MtPnByb2Nlc3NlZCkKLSAgICBlaW5mbyAoXygiJUYlUDogJXMgZm9yd2FyZCByZWZlcmVuY2Ugb2Ygc2VjdGlvbiAlc1xuIiksIG9wLCBuYW1lKTsKLX0KLQotZXRyZWVfdHlwZSAqCi1leHBfaW50b3AgKHZhbHVlKQotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBldHJlZV90eXBlICpuZXcgPSAoZXRyZWVfdHlwZSAqKSBzdGF0X2FsbG9jKHNpemVvZihuZXctPnZhbHVlKSk7Ci0gIG5ldy0+dHlwZS5ub2RlX2NvZGUgPSBJTlQ7Ci0gIG5ldy0+dmFsdWUudmFsdWUgPSB2YWx1ZTsKLSAgbmV3LT50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV92YWx1ZTsKLSAgcmV0dXJuIG5ldzsKLQotfQotCi0vKiBCdWlsZCBhbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyBhbiB1bm5hbWVkIHJlbG9jYXRlYWJsZSB2YWx1ZS4gICovCi0KLWV0cmVlX3R5cGUgKgotZXhwX3JlbG9wIChzZWN0aW9uLCB2YWx1ZSkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGV0cmVlX3R5cGUgKm5ldyA9IChldHJlZV90eXBlICopIHN0YXRfYWxsb2MgKHNpemVvZiAobmV3LT5yZWwpKTsKLSAgbmV3LT50eXBlLm5vZGVfY29kZSA9IFJFTDsKLSAgbmV3LT50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV9yZWw7Ci0gIG5ldy0+cmVsLnNlY3Rpb24gPSBzZWN0aW9uOwotICBuZXctPnJlbC52YWx1ZSA9IHZhbHVlOwotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZQotbmV3X3JlbCAodmFsdWUsIHNlY3Rpb24pCi0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnNlY3Rpb247Ci17Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgbmV3OwotICBuZXcudmFsaWRfcCA9IHRydWU7Ci0gIG5ldy52YWx1ZSA9IHZhbHVlOwotICBuZXcuc2VjdGlvbiA9IHNlY3Rpb247Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlCi1uZXdfcmVsX2Zyb21fc2VjdGlvbiAodmFsdWUsIHNlY3Rpb24pCi0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnNlY3Rpb247Ci17Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgbmV3OwotICBuZXcudmFsaWRfcCA9IHRydWU7Ci0gIG5ldy52YWx1ZSA9IHZhbHVlOwotICBuZXcuc2VjdGlvbiA9IHNlY3Rpb247Ci0KLSAgICBuZXcudmFsdWUgLT0gc2VjdGlvbi0+YmZkX3NlY3Rpb24tPnZtYTsKLQotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSAKLWZvbGRfYmluYXJ5ICh0cmVlLCBjdXJyZW50X3NlY3Rpb24sIGFsbG9jYXRpb25fZG9uZSwgZG90LCBkb3RwKQotICAgICBldHJlZV90eXBlICp0cmVlOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpjdXJyZW50X3NlY3Rpb247Ci0gICAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmU7Ci0gICAgIGJmZF92bWEgZG90OwotICAgICBiZmRfdm1hICpkb3RwOwotewotICBldHJlZV92YWx1ZV90eXBlIHJlc3VsdDsKLQotICByZXN1bHQgPSBleHBfZm9sZF90cmVlICh0cmVlLT5iaW5hcnkubGhzLCBjdXJyZW50X3NlY3Rpb24sCi0JCQkgIGFsbG9jYXRpb25fZG9uZSwgZG90LCBkb3RwKTsKLSAgaWYgKHJlc3VsdC52YWxpZF9wKQotICAgIHsKLSAgICAgIGV0cmVlX3ZhbHVlX3R5cGUgb3RoZXI7Ci0KLSAgICAgIG90aGVyID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+YmluYXJ5LnJocywKLQkJCSAgICAgY3VycmVudF9zZWN0aW9uLAotCQkJICAgICBhbGxvY2F0aW9uX2RvbmUsIGRvdCxkb3RwKSA7Ci0gICAgICBpZiAob3RoZXIudmFsaWRfcCkKLQl7Ci0JICAvKiBJZiB0aGUgdmFsdWVzIGFyZSBmcm9tIGRpZmZlcmVudCBzZWN0aW9ucywgb3IgdGhpcyBpcyBhbgotCSAgICAgYWJzb2x1dGUgZXhwcmVzc2lvbiwgbWFrZSBib3RoIHRoZSBzb3VyY2UgYXJndW1lbnRzCi0JICAgICBhYnNvbHV0ZS4gIEhvd2V2ZXIsIGFkZGluZyBvciBzdWJ0cmFjdGluZyBhbiBhYnNvbHV0ZQotCSAgICAgdmFsdWUgZnJvbSBhIHJlbGF0aXZlIHZhbHVlIGlzIG1lYW5pbmdmdWwsIGFuZCBpcyBhbgotCSAgICAgZXhjZXB0aW9uLiAgKi8KLQkgIGlmIChjdXJyZW50X3NlY3Rpb24gIT0gYWJzX291dHB1dF9zZWN0aW9uCi0JICAgICAgJiYgKG90aGVyLnNlY3Rpb24gPT0gYWJzX291dHB1dF9zZWN0aW9uCi0JCSAgfHwgKHJlc3VsdC5zZWN0aW9uID09IGFic19vdXRwdXRfc2VjdGlvbgotCQkgICAgICAmJiB0cmVlLT50eXBlLm5vZGVfY29kZSA9PSAnKycpKQotCSAgICAgICYmICh0cmVlLT50eXBlLm5vZGVfY29kZSA9PSAnKycKLQkJICB8fCB0cmVlLT50eXBlLm5vZGVfY29kZSA9PSAnLScpKQotCSAgICB7Ci0JICAgICAgZXRyZWVfdmFsdWVfdHlwZSBob2xkOwotCi0JICAgICAgLyogSWYgdGhlcmUgaXMgb25seSBvbmUgYWJzb2x1dGUgdGVybSwgbWFrZSBzdXJlIGl0IGlzIHRoZQotCQkgc2Vjb25kIG9uZS4gICovCi0JICAgICAgaWYgKG90aGVyLnNlY3Rpb24gIT0gYWJzX291dHB1dF9zZWN0aW9uKQotCQl7Ci0JCSAgaG9sZCA9IHJlc3VsdDsKLQkJICByZXN1bHQgPSBvdGhlcjsKLQkJICBvdGhlciA9IGhvbGQ7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocmVzdWx0LnNlY3Rpb24gIT0gb3RoZXIuc2VjdGlvbgotCQkgICB8fCBjdXJyZW50X3NlY3Rpb24gPT0gYWJzX291dHB1dF9zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgbWFrZV9hYnMoJnJlc3VsdCk7Ci0JICAgICAgbWFrZV9hYnMoJm90aGVyKTsKLQkgICAgfQotCi0JICBzd2l0Y2ggKHRyZWUtPnR5cGUubm9kZV9jb2RlKSAKLQkgICAgewotCSAgICBjYXNlICclJzoKLQkgICAgICBpZiAob3RoZXIudmFsdWUgPT0gMCkKLQkJZWluZm8gKF8oIiVGJVMgJSUgYnkgemVyb1xuIikpOwotCSAgICAgIHJlc3VsdC52YWx1ZSA9ICgoYmZkX3NpZ25lZF92bWEpIHJlc3VsdC52YWx1ZQotCQkJICAgICAgJSAoYmZkX3NpZ25lZF92bWEpIG90aGVyLnZhbHVlKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcvJzoKLQkgICAgICBpZiAob3RoZXIudmFsdWUgPT0gMCkKLQkJZWluZm8gKF8oIiVGJVMgLyBieSB6ZXJvXG4iKSk7Ci0JICAgICAgcmVzdWx0LnZhbHVlID0gKChiZmRfc2lnbmVkX3ZtYSkgcmVzdWx0LnZhbHVlCi0JCQkgICAgICAvIChiZmRfc2lnbmVkX3ZtYSkgb3RoZXIudmFsdWUpOwotCSAgICAgIGJyZWFrOwotCi0jZGVmaW5lIEJPUCh4LHkpIGNhc2UgeCA6IHJlc3VsdC52YWx1ZSA9IHJlc3VsdC52YWx1ZSB5IG90aGVyLnZhbHVlOyBicmVhazsKLQkgICAgICBCT1AoJysnLCspOwotCSAgICAgIEJPUCgnKicsKik7Ci0JICAgICAgQk9QKCctJywtKTsKLQkgICAgICBCT1AoTFNISUZULDw8KTsKLQkgICAgICBCT1AoUlNISUZULD4+KTsKLQkgICAgICBCT1AoRVEsPT0pOwotCSAgICAgIEJPUChORSwhPSk7Ci0JICAgICAgQk9QKCc8Jyw8KTsKLQkgICAgICBCT1AoJz4nLD4pOwotCSAgICAgIEJPUChMRSw8PSk7Ci0JICAgICAgQk9QKEdFLD49KTsKLQkgICAgICBCT1AoJyYnLCYpOwotCSAgICAgIEJPUCgnXicsXik7Ci0JICAgICAgQk9QKCd8Jyx8KTsKLQkgICAgICBCT1AoQU5EQU5ELCYmKTsKLQkgICAgICBCT1AoT1JPUix8fCk7Ci0KLQkgICAgY2FzZSBNQVhfSzoKLQkgICAgICBpZiAocmVzdWx0LnZhbHVlIDwgb3RoZXIudmFsdWUpCi0JCXJlc3VsdCA9IG90aGVyOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTUlOX0s6Ci0JICAgICAgaWYgKHJlc3VsdC52YWx1ZSA+IG90aGVyLnZhbHVlKQotCQlyZXN1bHQgPSBvdGhlcjsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIEZBSUwoKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByZXN1bHQudmFsaWRfcCA9IGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotZXRyZWVfdmFsdWVfdHlwZSAKLWludmFsaWQgKCkKLXsKLSAgZXRyZWVfdmFsdWVfdHlwZSBuZXc7Ci0gIG5ldy52YWxpZF9wID0gZmFsc2U7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlIAotZm9sZF9uYW1lICh0cmVlLCBjdXJyZW50X3NlY3Rpb24sIGFsbG9jYXRpb25fZG9uZSwgZG90KQotICAgICBldHJlZV90eXBlICp0cmVlOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpjdXJyZW50X3NlY3Rpb247Ci0gICAgIGxhbmdfcGhhc2VfdHlwZSAgYWxsb2NhdGlvbl9kb25lOwotICAgICBiZmRfdm1hIGRvdDsKLXsKLSAgZXRyZWVfdmFsdWVfdHlwZSByZXN1bHQ7Ci0gIHN3aXRjaCAodHJlZS0+dHlwZS5ub2RlX2NvZGUpIAotICAgICAgewotICAgICAgY2FzZSBTSVpFT0ZfSEVBREVSUzoKLQlpZiAoYWxsb2NhdGlvbl9kb25lICE9IGxhbmdfZmlyc3RfcGhhc2VfZW51bSkgCi0JICB7Ci0JICAgIHJlc3VsdCA9IG5ld19hYnMgKChiZmRfdm1hKQotCQkJICAgICAgYmZkX3NpemVvZl9oZWFkZXJzIChvdXRwdXRfYmZkLAotCQkJCQkJICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKSk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICByZXN1bHQudmFsaWRfcCA9IGZhbHNlOwotCSAgfQotCWJyZWFrOwotICAgICAgY2FzZSBERUZJTkVEOgotCWlmIChhbGxvY2F0aW9uX2RvbmUgPT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQotCSAgcmVzdWx0LnZhbGlkX3AgPSBmYWxzZTsKLQllbHNlCi0JICB7Ci0JICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAgIGggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLAotCQkJCQkgICAgICB0cmVlLT5uYW1lLm5hbWUsCi0JCQkJCSAgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JICAgIHJlc3VsdC52YWx1ZSA9IChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JCQkgICAgJiYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkJfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJCQl8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKSk7Ci0JICAgIHJlc3VsdC5zZWN0aW9uID0gMDsKLQkgICAgcmVzdWx0LnZhbGlkX3AgPSB0cnVlOwotCSAgfQotCWJyZWFrOwotICAgICAgY2FzZSBOQU1FOgotCXJlc3VsdC52YWxpZF9wID0gZmFsc2U7Ci0JaWYgKHRyZWUtPm5hbWUubmFtZVswXSA9PSAnLicgJiYgdHJlZS0+bmFtZS5uYW1lWzFdID09IDApCi0JICB7Ci0JICAgIGlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQotCSAgICAgIHJlc3VsdCA9IG5ld19yZWxfZnJvbV9zZWN0aW9uKGRvdCwgY3VycmVudF9zZWN0aW9uKTsKLQkgICAgZWxzZQotCSAgICAgIHJlc3VsdCA9IGludmFsaWQoKTsKLQkgIH0KLQllbHNlIGlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQotCSAgewotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICBoID0gYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywKLQkJCQkJICAgICAgdHJlZS0+bmFtZS5uYW1lLAotCQkJCQkgICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCSAgICBpZiAoaCAhPSBOVUxMCi0JCSYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCSAgICAgIHsKLQkJaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+dS5kZWYuc2VjdGlvbikpCi0JCSAgcmVzdWx0ID0gbmV3X2FicyAoaC0+dS5kZWYudmFsdWUpOwotCQllbHNlIGlmIChhbGxvY2F0aW9uX2RvbmUgPT0gbGFuZ19maW5hbF9waGFzZV9lbnVtCi0JCQkgfHwgYWxsb2NhdGlvbl9kb25lID09IGxhbmdfYWxsb2NhdGluZ19waGFzZV9lbnVtKQotCQkgIHsKLQkJICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQotCQkgICAgb3V0cHV0X3NlY3Rpb24gPSBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQkJICAgIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCQkgICAgICBlaW5mbyAoXygiJVglUzogdW5yZXNvbHZhYmxlIHN5bWJvbCBgJXMnIHJlZmVyZW5jZWQgaW4gZXhwcmVzc2lvblxuIiksCi0JCQkgICAgIHRyZWUtPm5hbWUubmFtZSk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0JCQlvcyA9IChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAKLQkJCSAgICAgIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgb3V0cHV0X3NlY3Rpb24pKSk7Ci0KLQkJCS8qIEZJWE1FOiBJcyB0aGlzIGNvcnJlY3QgaWYgdGhpcyBzZWN0aW9uIGlzCi0JCQkgICBiZWluZyBsaW5rZWQgd2l0aCAtUj8gICovCi0JCQlyZXN1bHQgPSBuZXdfcmVsICgoaC0+dS5kZWYudmFsdWUKLQkJCQkJICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KSwKLQkJCQkJICBvcyk7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChhbGxvY2F0aW9uX2RvbmUgPT0gbGFuZ19maW5hbF9waGFzZV9lbnVtKQotCSAgICAgIGVpbmZvIChfKCIlRiVTOiB1bmRlZmluZWQgc3ltYm9sIGAlcycgcmVmZXJlbmNlZCBpbiBleHByZXNzaW9uXG4iKSwKLQkJICAgICB0cmVlLT5uYW1lLm5hbWUpOwotCSAgfQotCWJyZWFrOwotCi0gICAgICBjYXNlIEFERFI6Ci0JaWYgKGFsbG9jYXRpb25fZG9uZSAhPSBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pCi0JICB7Ci0JICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0JICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kICh0cmVlLT5uYW1lLm5hbWUpOwotCSAgICBjaGVjayAob3MsIHRyZWUtPm5hbWUubmFtZSwgIkFERFIiKTsKLQkgICAgcmVzdWx0ID0gbmV3X3JlbCAoMCwgb3MpOwotCSAgfQotCWVsc2UKLQkgIHJlc3VsdCA9IGludmFsaWQgKCk7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgTE9BREFERFI6Ci0JaWYgKGFsbG9jYXRpb25fZG9uZSAhPSBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pCi0JICB7Ci0JICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0JICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kICh0cmVlLT5uYW1lLm5hbWUpOwotCSAgICBjaGVjayAob3MsIHRyZWUtPm5hbWUubmFtZSwgIkxPQURBRERSIik7Ci0JICAgIGlmIChvcy0+bG9hZF9iYXNlID09IE5VTEwpCi0JICAgICAgcmVzdWx0ID0gbmV3X3JlbCAoMCwgb3MpOwotCSAgICBlbHNlCi0JICAgICAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZV9ub19kb3QgKG9zLT5sb2FkX2Jhc2UsCi0JCQkJCSAgICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJCQkgICAgIGFsbG9jYXRpb25fZG9uZSk7Ci0JICB9Ci0JZWxzZQotCSAgcmVzdWx0ID0gaW52YWxpZCAoKTsKLQlicmVhazsKLQotICAgICAgY2FzZSBTSVpFT0Y6Ci0JaWYgKGFsbG9jYXRpb25fZG9uZSAhPSBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pCi0JICB7Ci0JICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0JICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kICh0cmVlLT5uYW1lLm5hbWUpOwotCSAgICBjaGVjayAob3MsIHRyZWUtPm5hbWUubmFtZSwgIlNJWkVPRiIpOwotCSAgICByZXN1bHQgPSBuZXdfYWJzIChvcy0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JICB9Ci0JZWxzZQotCSAgcmVzdWx0ID0gaW52YWxpZCAoKTsKLQlicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQlGQUlMKCk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLWV0cmVlX3ZhbHVlX3R5cGUgCi1leHBfZm9sZF90cmVlICh0cmVlLCBjdXJyZW50X3NlY3Rpb24sIGFsbG9jYXRpb25fZG9uZSwgZG90LCBkb3RwKQotICAgICBldHJlZV90eXBlICp0cmVlOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpjdXJyZW50X3NlY3Rpb247Ci0gICAgIGxhbmdfcGhhc2VfdHlwZSAgYWxsb2NhdGlvbl9kb25lOwotICAgICBiZmRfdm1hIGRvdDsKLSAgICAgYmZkX3ZtYSAqZG90cDsKLXsKLSAgZXRyZWVfdmFsdWVfdHlwZSByZXN1bHQ7Ci0KLSAgaWYgKHRyZWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXN1bHQudmFsaWRfcCA9IGZhbHNlOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgc3dpdGNoICh0cmVlLT50eXBlLm5vZGVfY2xhc3MpIAotICAgIHsKLSAgICBjYXNlIGV0cmVlX3ZhbHVlOgotICAgICAgcmVzdWx0ID0gbmV3X3JlbCAodHJlZS0+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/PyIpOwotICAgIGJyZWFrOwotICBjYXNlIGV0cmVlX25hbWU6Ci0gICAgaWYgKHRyZWUtPnR5cGUubm9kZV9jb2RlID09IE5BTUUpIHsKLSAgICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCIlcyIsIHRyZWUtPm5hbWUubmFtZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgZXhwX3ByaW50X3Rva2VuKHRyZWUtPnR5cGUubm9kZV9jb2RlKTsKLSAgICAgIGlmICh0cmVlLT5uYW1lLm5hbWUpCi0gICAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiKCVzKSIsIHRyZWUtPm5hbWUubmFtZSk7Ci0gICAgfQotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEZBSUwoKTsKLSAgICBicmVhazsKLSAgfQotfQotCi1iZmRfdm1hCi1leHBfZ2V0X3ZtYSAodHJlZSwgZGVmLCBuYW1lLCBhbGxvY2F0aW9uX2RvbmUpCi0gICAgIGV0cmVlX3R5cGUgKnRyZWU7Ci0gICAgIGJmZF92bWEgZGVmOwotICAgICBjaGFyICpuYW1lOwotICAgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lOwotewotICBldHJlZV92YWx1ZV90eXBlIHI7Ci0KLSAgaWYgKHRyZWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICByID0gZXhwX2ZvbGRfdHJlZV9ub19kb3QgKHRyZWUsIGFic19vdXRwdXRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lKTsKLSAgICAgIGlmICghIHIudmFsaWRfcCAmJiBuYW1lICE9IE5VTEwpCi0JZWluZm8gKF8oIiVGJVMgbm9uY29uc3RhbnQgZXhwcmVzc2lvbiBmb3IgJXNcbiIpLCBuYW1lKTsKLSAgICAgIHJldHVybiByLnZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiBkZWY7Ci19Ci0KLWludCAKLWV4cF9nZXRfdmFsdWVfaW50ICh0cmVlLGRlZixuYW1lLCBhbGxvY2F0aW9uX2RvbmUpCi0gICAgIGV0cmVlX3R5cGUgKnRyZWU7Ci0gICAgIGludCBkZWY7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmU7Ci17Ci0gIHJldHVybiAoaW50KWV4cF9nZXRfdm1hKHRyZWUsKGJmZF92bWEpZGVmLG5hbWUsIGFsbG9jYXRpb25fZG9uZSk7Ci19Ci0KLQotYmZkX3ZtYQotZXhwX2dldF9hYnNfaW50ICh0cmVlLCBkZWYsIG5hbWUsIGFsbG9jYXRpb25fZG9uZSkKLSAgICAgZXRyZWVfdHlwZSAqdHJlZTsKLSAgICAgaW50IGRlZjsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgbGFuZ19waGFzZV90eXBlIGFsbG9jYXRpb25fZG9uZTsKLXsKLSAgZXRyZWVfdmFsdWVfdHlwZSByZXM7Ci0gIHJlcyA9IGV4cF9mb2xkX3RyZWVfbm9fZG90ICh0cmVlLCBhYnNfb3V0cHV0X3NlY3Rpb24sIGFsbG9jYXRpb25fZG9uZSk7Ci0KLSAgaWYgKHJlcy52YWxpZF9wKQotICAgIHsKLSAgICAgIHJlcy52YWx1ZSArPSByZXMuc2VjdGlvbi0+YmZkX3NlY3Rpb24tPnZtYTsKLSAgICB9Ci0gIGVsc2UgewotICAgIGVpbmZvIChfKCIlRiVTIG5vbiBjb25zdGFudCBleHByZXNzaW9uIGZvciAlc1xuIiksbmFtZSk7Ci0gIH0KLSAgcmV0dXJuIHJlcy52YWx1ZTsKLX0KZGlmZiAtLWdpdCBhL2xkL2xkZXhwLmggYi9sZC9sZGV4cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGU4ZGRmLi4wMDAwMDAwCi0tLSBhL2xkL2xkZXhwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyogbGRleHAuaCAtCi0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTERFWFBfSAotI2RlZmluZSBMREVYUF9ICi0KLS8qIFRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiB0cmVlICovCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3N0cnVjdCAqc2VjdGlvbjsKLSAgYm9vbGVhbiB2YWxpZF9wOwotfSBldHJlZV92YWx1ZV90eXBlOwotCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGludCBub2RlX2NvZGU7Ci0gIGVudW0geyBldHJlZV9iaW5hcnksCi0JICAgZXRyZWVfdHJpbmFyeSwKLQkgICBldHJlZV91bmFyeSwKLQkgICBldHJlZV9uYW1lLAotCSAgIGV0cmVlX2Fzc2lnbiwKLQkgICBldHJlZV9wcm92aWRlLAotCSAgIGV0cmVlX3VuZGVmLAotCSAgIGV0cmVlX3Vuc3BlYywKLQkgICBldHJlZV92YWx1ZSwKLQkgICBldHJlZV9hc3NlcnQsCi0JICAgZXRyZWVfcmVsIH0gbm9kZV9jbGFzczsKLX0gbm9kZV90eXBlOwotCi0KLQotdHlwZWRlZiB1bmlvbiBldHJlZV91bmlvbiAKLXsKLSAgbm9kZV90eXBlIHR5cGU7Ci0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICAgdW5pb24gZXRyZWVfdW5pb24gKmxoczsKLSAgICB1bmlvbiBldHJlZV91bmlvbiAqcmhzOwotICB9IGJpbmFyeTsKLSAgc3RydWN0IHsKLSAgICBub2RlX3R5cGUgdHlwZTsKLSAgICB1bmlvbiBldHJlZV91bmlvbiAqY29uZDsKLSAgICB1bmlvbiBldHJlZV91bmlvbiAqbGhzOwotICAgIHVuaW9uIGV0cmVlX3VuaW9uICpyaHM7Ci0gIH0gdHJpbmFyeTsKLSAgc3RydWN0IHsKLSAgICBub2RlX3R5cGUgdHlwZTsKLSAgICBDT05TVCBjaGFyICpkc3Q7Ci0gICAgdW5pb24gZXRyZWVfdW5pb24gKnNyYzsKLSAgfSBhc3NpZ247Ci0KLSAgc3RydWN0IHsKLSAgICBub2RlX3R5cGUgdHlwZTsKLSAgICB1bmlvbiAgIGV0cmVlX3VuaW9uICpjaGlsZDsKLSAgfSB1bmFyeTsKLSAgc3RydWN0IHsKLSAgICBub2RlX3R5cGUgdHlwZTsKLSAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gIH0gbmFtZTsKLSAgc3RydWN0IHsKLSAgICBub2RlX3R5cGUgdHlwZTsKLSAgICBiZmRfdm1hIHZhbHVlOwotICB9IHZhbHVlOwotICBzdHJ1Y3QgewotICAgIG5vZGVfdHlwZSB0eXBlOwotICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgIGJmZF92bWEgdmFsdWU7Ci0gIH0gcmVsOwotICBzdHJ1Y3QgewotICAgIG5vZGVfdHlwZSB0eXBlOwotICAgIHVuaW9uIGV0cmVlX3VuaW9uICpjaGlsZDsKLSAgICBjb25zdCBjaGFyICptZXNzYWdlOwotICB9IGFzc2VydF9zOwotfSBldHJlZV90eXBlOwotCi0KLWV0cmVlX3R5cGUgKmV4cF9pbnRvcCBQQVJBTVMgKChiZmRfdm1hKSk7Ci1ldHJlZV90eXBlICpleHBfcmVsb3AgUEFSQU1TICgoYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotZXRyZWVfdmFsdWVfdHlwZSBpbnZhbGlkIFBBUkFNUyAoKHZvaWQpKTsKLWV0cmVlX3ZhbHVlX3R5cGUgZXhwX2ZvbGRfdHJlZSBQQVJBTVMgKChldHJlZV90eXBlICosIHN0cnVjdAotCQkJCQlsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9zdHJ1Y3QgKiwKLQkJCQkJbGFuZ19waGFzZV90eXBlLAotCQkJCQliZmRfdm1hLCBiZmRfdm1hICopKTsKLWV0cmVlX3R5cGUgKmV4cF9iaW5vcCBQQVJBTVMgKChpbnQsIGV0cmVlX3R5cGUgKiwgZXRyZWVfdHlwZSAqKSk7Ci1ldHJlZV90eXBlICpleHBfdHJpbm9wIFBBUkFNUyAoKGludCxldHJlZV90eXBlICosIGV0cmVlX3R5cGUgKiwgZXRyZWVfdHlwZSAqKSk7Ci1ldHJlZV90eXBlICpleHBfdW5vcCBQQVJBTVMgKChpbnQsIGV0cmVlX3R5cGUgKikpOwotZXRyZWVfdHlwZSAqZXhwX25hbWVvcCBQQVJBTVMgKChpbnQsIENPTlNUIGNoYXIgKikpOwotZXRyZWVfdHlwZSAqZXhwX2Fzc29wIFBBUkFNUyAoKGludCwgQ09OU1QgY2hhciAqLCBldHJlZV90eXBlICopKTsKLWV0cmVlX3R5cGUgKmV4cF9wcm92aWRlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgZXRyZWVfdHlwZSAqKSk7Ci1ldHJlZV90eXBlICpleHBfYXNzZXJ0IFBBUkFNUyAoKGV0cmVlX3R5cGUgKiwgY29uc3QgY2hhciAqKSk7Ci12b2lkIGV4cF9wcmludF90cmVlIFBBUkFNUyAoKGV0cmVlX3R5cGUgKikpOwotYmZkX3ZtYSBleHBfZ2V0X3ZtYSBQQVJBTVMgKChldHJlZV90eXBlICosIGJmZF92bWEsIGNoYXIgKiwgbGFuZ19waGFzZV90eXBlKSk7Ci1pbnQgZXhwX2dldF92YWx1ZV9pbnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqLCBpbnQsIGNoYXIgKixsYW5nX3BoYXNlX3R5cGUpKTsKLWJmZF92bWEgZXhwX2dldF9hYnNfaW50IFBBUkFNUyAoKGV0cmVlX3R5cGUgKiwgaW50LCBjaGFyICosbGFuZ19waGFzZV90eXBlKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGRmaWxlLmMgYi9sZC9sZGZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmYTMxZi4uMDAwMDAwMAotLS0gYS9sZC9sZGZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSBsZGZpbGUuYwotCi0gbG9vayBhZnRlciBhbGwgdGhlIGZpbGUgc3R1ZmYKLQotICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1jb25zdCBjaGFyICpsZGZpbGVfaW5wdXRfZmlsZW5hbWU7Ci1ib29sZWFuIGxkZmlsZV9hc3N1bWVkX3NjcmlwdCA9IGZhbHNlOwotY29uc3QgY2hhciAqbGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWUgPSAiIjsKLXVuc2lnbmVkIGxvbmcgbGRmaWxlX291dHB1dF9tYWNoaW5lOwotZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlOwotc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoX2hlYWQ7Ci0KLSNpZm5kZWYgTVBXCi0jaWZkZWYgVk1TCi1jaGFyICpzbGFzaCA9ICIiOwotI2Vsc2UKLSNpZiBkZWZpbmVkIChfV0lOMzIpICYmICEgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotY2hhciAqc2xhc2ggPSAiXFwiOwotI2Vsc2UKLWNoYXIgKnNsYXNoID0gIi8iOwotI2VuZGlmCi0jZW5kaWYKLSNlbHNlIC8qIE1QVyAqLwotLyogVGhlIE1QVyBwYXRoIGNoYXIgaXMgYSBjb2xvbi4gKi8KLWNoYXIgKnNsYXNoID0gIjoiOwotI2VuZGlmIC8qIE1QVyAqLwotCi0vKiBMT0NBTCAqLwotCi1zdGF0aWMgc2VhcmNoX2RpcnNfdHlwZSAqKnNlYXJjaF90YWlsX3B0ciA9ICZzZWFyY2hfaGVhZDsKLQotdHlwZWRlZiBzdHJ1Y3Qgc2VhcmNoX2FyY2ggCi17Ci0gIGNoYXIgKm5hbWU7IAotICBzdHJ1Y3Qgc2VhcmNoX2FyY2ggKm5leHQ7Ci19IHNlYXJjaF9hcmNoX3R5cGU7Ci0KLXN0YXRpYyBzZWFyY2hfYXJjaF90eXBlICpzZWFyY2hfYXJjaF9oZWFkOwotc3RhdGljIHNlYXJjaF9hcmNoX3R5cGUgKipzZWFyY2hfYXJjaF90YWlsX3B0ciA9ICZzZWFyY2hfYXJjaF9oZWFkOwotIAotc3RhdGljIGJvb2xlYW4gbGRmaWxlX29wZW5fZmlsZV9zZWFyY2gKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqYXJjaCwgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLAotCSAgIGNvbnN0IGNoYXIgKmxpYiwgY29uc3QgY2hhciAqc3VmZml4KSk7Ci1zdGF0aWMgRklMRSAqdHJ5X29wZW4gUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZXh0ZW4pKTsKLQotdm9pZAotbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKG5hbWUsIGNtZGxpbmUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJvb2xlYW4gY21kbGluZTsKLXsKLSAgc2VhcmNoX2RpcnNfdHlwZSAqbmV3OwotCi0gIG5ldyA9IChzZWFyY2hfZGlyc190eXBlICopIHhtYWxsb2MgKHNpemVvZiAoc2VhcmNoX2RpcnNfdHlwZSkpOwotICBuZXctPm5leHQgPSBOVUxMOwotICBuZXctPm5hbWUgPSBuYW1lOwotICBuZXctPmNtZGxpbmUgPSBjbWRsaW5lOwotICAqc2VhcmNoX3RhaWxfcHRyID0gbmV3OwotICBzZWFyY2hfdGFpbF9wdHIgPSAmbmV3LT5uZXh0OwotfQotCi0vKiBUcnkgdG8gb3BlbiBhIEJGRCBmb3IgYSBsYW5nX2lucHV0X3N0YXRlbWVudC4gICovCi0KLWJvb2xlYW4KLWxkZmlsZV90cnlfb3Blbl9iZmQgKGF0dGVtcHQsIGVudHJ5KQotICAgICBjb25zdCBjaGFyICphdHRlbXB0OwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgZW50cnktPnRoZV9iZmQgPSBiZmRfb3BlbnIgKGF0dGVtcHQsIGVudHJ5LT50YXJnZXQpOwotCi0gIGlmICh0cmFjZV9maWxlX3RyaWVzKQotICAgIHsKLSAgICAgIGlmIChlbnRyeS0+dGhlX2JmZCA9PSBOVUxMKQotCWluZm9fbXNnIChfKCJhdHRlbXB0IHRvIG9wZW4gJXMgZmFpbGVkXG4iKSwgYXR0ZW1wdCk7Ci0gICAgICBlbHNlCi0JaW5mb19tc2cgKF8oImF0dGVtcHQgdG8gb3BlbiAlcyBzdWNjZWVkZWRcbiIpLCBhdHRlbXB0KTsKLSAgICB9Ci0KLSAgaWYgKGVudHJ5LT50aGVfYmZkICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpCi0JZWluZm8gKF8oIiVGJVA6IGludmFsaWQgQkZEIHRhcmdldCBgJXMnXG4iKSwgZW50cnktPnRhcmdldCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBTZWFyY2ggZm9yIGFuZCBvcGVuIHRoZSBmaWxlIHNwZWNpZmllZCBieSBFTlRSWS4gIElmIGl0IGlzIGFuCi0gICBhcmNoaXZlLCB1c2UgQVJDSCwgTElCIGFuZCBTVUZGSVggdG8gbW9kaWZ5IHRoZSBmaWxlIG5hbWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGRmaWxlX29wZW5fZmlsZV9zZWFyY2ggKGFyY2gsIGVudHJ5LCBsaWIsIHN1ZmZpeCkKLSAgICAgY29uc3QgY2hhciAqYXJjaDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci0gICAgIGNvbnN0IGNoYXIgKmxpYjsKLSAgICAgY29uc3QgY2hhciAqc3VmZml4OwotewotICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0KLSAgLyogSWYgdGhpcyBpcyBub3QgYW4gYXJjaGl2ZSwgdHJ5IHRvIG9wZW4gaXQgaW4gdGhlIGN1cnJlbnQKLSAgICAgZGlyZWN0b3J5IGZpcnN0LiAgKi8KLSAgaWYgKCEgZW50cnktPmlzX2FyY2hpdmUpCi0gICAgewotICAgICAgaWYgKGxkZmlsZV90cnlfb3Blbl9iZmQgKGVudHJ5LT5maWxlbmFtZSwgZW50cnkpKQotCXJldHVybiB0cnVlOwotICAgIH0KLQotICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOwotICAgICAgIHNlYXJjaCAhPSAoc2VhcmNoX2RpcnNfdHlwZSAqKU5VTEw7Ci0gICAgICAgc2VhcmNoID0gc2VhcmNoLT5uZXh0KSAKLSAgICB7Ci0gICAgICBjaGFyICpzdHJpbmc7Ci0KLSAgICAgIGlmIChlbnRyeS0+ZHluYW1pYyAmJiAhIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0JewotCSAgaWYgKGxkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZSAoYXJjaCwgc2VhcmNoLCBlbnRyeSkpCi0JICAgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgc3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpCi0JCQkJICsgc3RybGVuIChzbGFzaCkKLQkJCQkgKyBzdHJsZW4gKGxpYikKLQkJCQkgKyBzdHJsZW4gKGVudHJ5LT5maWxlbmFtZSkKLQkJCQkgKyBzdHJsZW4gKGFyY2gpCi0JCQkJICsgc3RybGVuIChzdWZmaXgpCi0JCQkJICsgMSk7Ci0KLSAgICAgIGlmIChlbnRyeS0+aXNfYXJjaGl2ZSkKLQlzcHJpbnRmIChzdHJpbmcsICIlcyVzJXMlcyVzJXMiLCBzZWFyY2gtPm5hbWUsIHNsYXNoLAotCQkgbGliLCBlbnRyeS0+ZmlsZW5hbWUsIGFyY2gsIHN1ZmZpeCk7Ci0gICAgICBlbHNlIGlmIChlbnRyeS0+ZmlsZW5hbWVbMF0gPT0gJy8nIHx8IGVudHJ5LT5maWxlbmFtZVswXSA9PSAnLicKLSNpZiBkZWZpbmVkIChfX01TRE9TX18pIHx8IGRlZmluZWQgKF9XSU4zMikKLQkgICAgICAgfHwgZW50cnktPmZpbGVuYW1lWzBdID09ICdcXCcgCi0JICAgICAgIHx8IChpc2FscGhhIChlbnRyeS0+ZmlsZW5hbWVbMF0pIAotCSAgICAgICAgICAgJiYgZW50cnktPmZpbGVuYW1lWzFdID09ICc6JykKLSNlbmRpZgotCSAgKQotCXN0cmNweSAoc3RyaW5nLCBlbnRyeS0+ZmlsZW5hbWUpOwotICAgICAgZWxzZQotCXNwcmludGYgKHN0cmluZywgIiVzJXMlcyIsIHNlYXJjaC0+bmFtZSwgc2xhc2gsIGVudHJ5LT5maWxlbmFtZSk7Ci0KLSAgICAgIGlmIChsZGZpbGVfdHJ5X29wZW5fYmZkIChzdHJpbmcsIGVudHJ5KSkKLQl7Ci0JICBlbnRyeS0+ZmlsZW5hbWUgPSBzdHJpbmc7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIGZyZWUgKHN0cmluZyk7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogT3BlbiB0aGUgaW5wdXQgZmlsZSBzcGVjaWZpZWQgYnkgRU5UUlkuICAqLwotCi12b2lkCi1sZGZpbGVfb3Blbl9maWxlIChlbnRyeSkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGlmIChlbnRyeS0+dGhlX2JmZCAhPSBOVUxMKQotICAgIHJldHVybjsKLQotICBpZiAoISBlbnRyeS0+c2VhcmNoX2RpcnNfZmxhZykKLSAgICB7Ci0gICAgICBpZiAobGRmaWxlX3RyeV9vcGVuX2JmZCAoZW50cnktPmZpbGVuYW1lLCBlbnRyeSkpCi0JcmV0dXJuOwotICAgICAgaWYgKHN0cmNtcCAoZW50cnktPmZpbGVuYW1lLCBlbnRyeS0+bG9jYWxfc3ltX25hbWUpICE9IDApCi0JZWluZm8gKF8oIiVGJVA6IGNhbm5vdCBvcGVuICVzIGZvciAlczogJUVcbiIpLAotCSAgICAgICBlbnRyeS0+ZmlsZW5hbWUsIGVudHJ5LT5sb2NhbF9zeW1fbmFtZSk7Ci0gICAgICBlbHNlCi0JZWluZm8oXygiJUYlUDogY2Fubm90IG9wZW4gJXM6ICVFXG4iKSwgZW50cnktPmxvY2FsX3N5bV9uYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzZWFyY2hfYXJjaF90eXBlICphcmNoOwotCi0gICAgICAvKiBUcnkgdG8gb3BlbiA8ZmlsZW5hbWU+PHN1ZmZpeD4gb3IgbGliPGZpbGVuYW1lPjxzdWZmaXg+LmEgKi8KLSAgICAgIGZvciAoYXJjaCA9IHNlYXJjaF9hcmNoX2hlYWQ7Ci0JICAgYXJjaCAhPSAoc2VhcmNoX2FyY2hfdHlwZSAqKSBOVUxMOwotCSAgIGFyY2ggPSBhcmNoLT5uZXh0KQotCXsKLQkgIGlmIChsZGZpbGVfb3Blbl9maWxlX3NlYXJjaCAoYXJjaC0+bmFtZSwgZW50cnksICJsaWIiLCAiLmEiKSkKLQkgICAgcmV0dXJuOwotI2lmZGVmIFZNUwotCSAgaWYgKGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoIChhcmNoLT5uYW1lLCBlbnRyeSwgIjpsaWIiLCAiLmEiKSkKLQkgICAgcmV0dXJuOwotI2VuZGlmCi0JfQotICAgICAgZWluZm8gKF8oIiVGJVA6IGNhbm5vdCBmaW5kICVzXG4iKSwgZW50cnktPmxvY2FsX3N5bV9uYW1lKTsKLSAgICB9Ci19Ci0KLS8qIFRyeSB0byBvcGVuIE5BTUU7IGlmIHRoYXQgZmFpbHMsIHRyeSBOQU1FIHdpdGggRVhURU4gYXBwZW5kZWQgdG8gaXQuICAqLwotCi1zdGF0aWMgRklMRSAqCi10cnlfb3BlbiAobmFtZSwgZXh0ZW4pCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmV4dGVuOwotewotICBGSUxFICpyZXN1bHQ7Ci0gIGNoYXIgYnVmZlsxMDAwXTsKLQotICByZXN1bHQgPSBmb3BlbiAobmFtZSwgInIiKTsKLSAgaWYgKHRyYWNlX2ZpbGVfdHJpZXMpCi0gICAgewotICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotCWluZm9fbXNnIChfKCJjYW5ub3QgZmluZCBzY3JpcHQgZmlsZSAlc1xuIiksIG5hbWUpOwotICAgICAgZWxzZQotCWluZm9fbXNnIChfKCJvcGVuZWQgc2NyaXB0IGZpbGUgJXNcbiIpLCBuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKHJlc3VsdCAhPSBOVUxMKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgaWYgKCpleHRlbikKLSAgICB7Ci0gICAgICBzcHJpbnRmIChidWZmLCAiJXMlcyIsIG5hbWUsIGV4dGVuKTsKLSAgICAgIHJlc3VsdCA9IGZvcGVuIChidWZmLCAiciIpOwotICAgICAgaWYgKHRyYWNlX2ZpbGVfdHJpZXMpCi0JewotCSAgaWYgKHJlc3VsdCA9PSBOVUxMKQotCSAgICBpbmZvX21zZyAoXygiY2Fubm90IGZpbmQgc2NyaXB0IGZpbGUgJXNcbiIpLCBidWZmKTsKLQkgIGVsc2UKLQkgICAgaW5mb19tc2cgKF8oIm9wZW5lZCBzY3JpcHQgZmlsZSAlc1xuIiksIGJ1ZmYpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogVHJ5IHRvIG9wZW4gTkFNRTsgaWYgdGhhdCBmYWlscywgbG9vayBmb3IgaXQgaW4gYW55IGRpcmVjdG9yaWVzCi0gICBzcGVjaWZpZWQgd2l0aCAtTCwgd2l0aG91dCBhbmQgd2l0aCBFWFRFTkQgYXBwcGVuZGVkLiAgKi8KLQotRklMRSAqCi1sZGZpbGVfZmluZF9jb21tYW5kX2ZpbGUgKG5hbWUsIGV4dGVuZCkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqZXh0ZW5kOwotewotICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0gIEZJTEUgKnJlc3VsdDsKLSAgY2hhciBidWZmZXJbMTAwMF07Ci0KLSAgLyogRmlyc3QgdHJ5IHJhdyBuYW1lICovCi0gIHJlc3VsdCA9IHRyeV9vcGVuKG5hbWUsIiIpOwotICBpZiAocmVzdWx0ID09IChGSUxFICopTlVMTCkgewotICAgIC8qIFRyeSBub3cgcHJlZml4ZXMgKi8KLSAgICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOwotCSBzZWFyY2ggIT0gKHNlYXJjaF9kaXJzX3R5cGUgKilOVUxMOwotCSBzZWFyY2ggPSBzZWFyY2gtPm5leHQpIHsKLSAgICAgIHNwcmludGYoYnVmZmVyLCIlcyVzJXMiLCBzZWFyY2gtPm5hbWUsIHNsYXNoLCBuYW1lKTsKLSAgICAgIHJlc3VsdCA9IHRyeV9vcGVuKGJ1ZmZlciwgZXh0ZW5kKTsKLSAgICAgIGlmIChyZXN1bHQpYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQKLWxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgRklMRSAqbGRsZXhfaW5wdXRfc3RhY2s7Ci0gIGxkbGV4X2lucHV0X3N0YWNrID0gbGRmaWxlX2ZpbmRfY29tbWFuZF9maWxlKG5hbWUsICIiKTsKLQotICBpZiAobGRsZXhfaW5wdXRfc3RhY2sgPT0gKEZJTEUgKilOVUxMKSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICBlaW5mbyhfKCIlUCVGOiBjYW5ub3Qgb3BlbiBsaW5rZXIgc2NyaXB0IGZpbGUgJXM6ICVFXG4iKSxuYW1lKTsKLSAgfQotICBsZXhfcHVzaF9maWxlKGxkbGV4X2lucHV0X3N0YWNrLCBuYW1lKTsKLSAgCi0gIGxkZmlsZV9pbnB1dF9maWxlbmFtZSA9IG5hbWU7Ci0gIGxpbmVubyA9IDE7Ci0gIGhhZF9zY3JpcHQgPSB0cnVlOwotfQotCi0KLQotCi0KLSNpZmRlZiBHTlU5NjAKLXN0YXRpYwotY2hhciAqCi1nbnU5NjBfbWFwX2FyY2huYW1lKCBuYW1lICkKLWNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCB0YWJlbnRyeSB7IGNoYXIgKmNtZF9zd2l0Y2g7IGNoYXIgKmFyY2g7IH07Ci0gIHN0YXRpYyBzdHJ1Y3QgdGFiZW50cnkgYXJjaF90YWJbXSA9IHsKLQkiIiwgICAiIiwKLQkiS0EiLCAia2EiLAotCSJLQiIsICJrYiIsCi0JIktDIiwgIm1jIiwJLyogU3lub255bSBmb3IgTUMgKi8KLQkiTUMiLCAibWMiLAotCSJDQSIsICJjYSIsCi0JIlNBIiwgImthIiwJLyogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gS0EgKi8KLQkiU0IiLCAia2IiLAkvKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBLQiAqLwotCU5VTEwsICIiCi0gIH07Ci0gIHN0cnVjdCB0YWJlbnRyeSAqdHA7Ci0gIAotCi0gIGZvciAoIHRwID0gYXJjaF90YWI7IHRwLT5jbWRfc3dpdGNoICE9IE5VTEw7IHRwKysgKXsKLSAgICBpZiAoICFzdHJjbXAobmFtZSx0cC0+Y21kX3N3aXRjaCkgKXsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGlmICggdHAtPmNtZF9zd2l0Y2ggPT0gTlVMTCApewotICAgIGVpbmZvKF8oIiVQJUY6IHVua25vd24gYXJjaGl0ZWN0dXJlOiAlc1xuIiksbmFtZSk7Ci0gIH0KLSAgcmV0dXJuIHRwLT5hcmNoOwotfQotCi0KLQotdm9pZAotbGRmaWxlX2FkZF9hcmNoKG5hbWUpCi1jaGFyICpuYW1lOwotewotICBzZWFyY2hfYXJjaF90eXBlICpuZXcgPQotICAgIChzZWFyY2hfYXJjaF90eXBlICopeG1hbGxvYygoYmZkX3NpemVfdHlwZSkoc2l6ZW9mKHNlYXJjaF9hcmNoX3R5cGUpKSk7Ci0KLQotICBpZiAoKm5hbWUgIT0gJ1wwJykgewotICAgIGlmIChsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZVswXSAhPSAnXDAnKSB7Ci0gICAgICBlaW5mbyhfKCIlUCVGOiB0YXJnZXQgYXJjaGl0ZWN0dXJlIHJlc3BlY2lmaWVkXG4iKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lID0gbmFtZTsKLSAgfQotCi0gIG5ldy0+bmV4dCA9IChzZWFyY2hfYXJjaF90eXBlKilOVUxMOwotICBuZXctPm5hbWUgPSBnbnU5NjBfbWFwX2FyY2huYW1lKCBuYW1lICk7Ci0gICpzZWFyY2hfYXJjaF90YWlsX3B0ciA9IG5ldzsKLSAgc2VhcmNoX2FyY2hfdGFpbF9wdHIgPSAmbmV3LT5uZXh0OwotCi19Ci0KLSNlbHNlCS8qIG5vdCBHTlU5NjAgKi8KLQotCi12b2lkCi1sZGZpbGVfYWRkX2FyY2ggKGluX25hbWUpCi0gICAgIENPTlNUIGNoYXIgKiBpbl9uYW1lOwotewotICBjaGFyICpuYW1lID0gYnV5c3RyaW5nKGluX25hbWUpOwotICBzZWFyY2hfYXJjaF90eXBlICpuZXcgPQotICAgIChzZWFyY2hfYXJjaF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAoc2VhcmNoX2FyY2hfdHlwZSkpOwotCi0gIGxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lID0gaW5fbmFtZTsKLQotICBuZXctPm5hbWUgPSBuYW1lOwotICBuZXctPm5leHQgPSAoc2VhcmNoX2FyY2hfdHlwZSopTlVMTDsKLSAgd2hpbGUgKCpuYW1lKQotICAgIHsKLSAgICAgIGlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgKm5hbWUpKQotCSpuYW1lID0gdG9sb3dlciAoKHVuc2lnbmVkIGNoYXIpICpuYW1lKTsKLSAgICAgIG5hbWUrKzsKLSAgICB9Ci0gICpzZWFyY2hfYXJjaF90YWlsX3B0ciA9IG5ldzsKLSAgc2VhcmNoX2FyY2hfdGFpbF9wdHIgPSAmbmV3LT5uZXh0OwotCi19Ci0jZW5kaWYKLQotLyogU2V0IHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlICovCi12b2lkCi1sZGZpbGVfc2V0X291dHB1dF9hcmNoIChzdHJpbmcpCi0gICAgIENPTlNUIGNoYXIgKnN0cmluZzsKLXsKLSAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmNoID0gYmZkX3NjYW5fYXJjaChzdHJpbmcpOwotCi0gIGlmIChhcmNoKSB7Ci0gICAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBhcmNoLT5hcmNoOwotICAgIGxkZmlsZV9vdXRwdXRfbWFjaGluZSA9IGFyY2gtPm1hY2g7Ci0gICAgbGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWUgPSBhcmNoLT5wcmludGFibGVfbmFtZTsKLSAgfQotICBlbHNlIHsKLSAgICBlaW5mbyhfKCIlUCVGOiBjYW5ub3QgcmVwcmVzZW50IG1hY2hpbmUgYCVzJ1xuIiksIHN0cmluZyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xkL2xkZmlsZS5oIGIvbGQvbGRmaWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzM2M5Y2UuLjAwMDAwMDAKLS0tIGEvbGQvbGRmaWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiBsZGZpbGUuaCAtCi0gICBDb3B5cmlnaHQgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqbGRmaWxlX2lucHV0X2ZpbGVuYW1lOwotZXh0ZXJuIGJvb2xlYW4gbGRmaWxlX2Fzc3VtZWRfc2NyaXB0OwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbGRmaWxlX291dHB1dF9tYWNoaW5lOwotZXh0ZXJuIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZTsKLWV4dGVybiBjb25zdCBjaGFyICpsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZTsKLQotLyogU3RydWN0dXJlIHVzZWQgdG8gaG9sZCB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yCi0gICBsaWJyYXJpZXMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBzZWFyY2hfZGlycyAKLXsKLSAgLyogTmV4dCBkaXJlY3Rvcnkgb24gbGlzdC4gICovCi0gIHN0cnVjdCBzZWFyY2hfZGlycyAqbmV4dDsKLSAgLyogTmFtZSBvZiBkaXJlY3RvcnkuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiB0cnVlIGlmIHRoaXMgaXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLSAgYm9vbGVhbiBjbWRsaW5lOwotfSBzZWFyY2hfZGlyc190eXBlOwotCi1leHRlcm4gc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoX2hlYWQ7Ci0KLSNpZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3Q7Ci0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgbGRmaWxlX2FkZF9hcmNoIFBBUkFNUyAoKENPTlNUIGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggUEFSQU1TICgoY29uc3QgY2hhciAqLCBib29sZWFuIGNtZGxpbmUpKTsKLWV4dGVybiB2b2lkIGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci1leHRlcm4gdm9pZCBsZGZpbGVfb3Blbl9maWxlIFBBUkFNUyAoKHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKikpOwotZXh0ZXJuIGJvb2xlYW4gbGRmaWxlX3RyeV9vcGVuX2JmZAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKikpOwotZXh0ZXJuIEZJTEUgKmxkZmlsZV9maW5kX2NvbW1hbmRfZmlsZQotICBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpleHRlbmQpKTsKLWV4dGVybiB2b2lkIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggUEFSQU1TICgoQ09OU1QgY2hhciAqKSk7CmRpZmYgLS1naXQgYS9sZC9sZGdyYW0ueSBiL2xkL2xkZ3JhbS55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWYzZWQ2Li4wMDAwMDAwCi0tLSBhL2xkL2xkZ3JhbS55CisrKyAvZGV2L251bGwKQEAgLTEsMTA5NCArMCwwIEBACi0vKiBBIFlBQ0MgZ3JhbW1lciB0byBwYXJzZSBhIHN1cGVyc2V0IG9mIHRoZSBBVCZUIGxpbmtlciBzY3JpcHRpbmcgbGFuZ3VhdWUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCAoc3RldmVAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBsZC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotJXsKLS8qCi0KLSAqLwotCi0jZGVmaW5lIERPTlRERUNMQVJFX01BTExPQwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxkLmgiICAgIAotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGR2ZXIuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJtcmkuaCIKLSNpbmNsdWRlICJsZGN0b3IuaCIKLSNpbmNsdWRlICJsZGxleC5oIgotCi0jaWZuZGVmIFlZREVCVUcKLSNkZWZpbmUgWVlERUJVRyAxCi0jZW5kaWYKLQotc3RhdGljIGVudW0gc2VjdGlvbl90eXBlIHNlY3R5cGU7Ci0KLWxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpyZWdpb247Ci0KLXN0cnVjdCB3aWxkY2FyZF9zcGVjIGN1cnJlbnRfZmlsZTsKLWJvb2xlYW4gbGRncmFtX3dhbnRfZmlsZW5hbWUgPSB0cnVlOwotYm9vbGVhbiBoYWRfc2NyaXB0ID0gZmFsc2U7Ci1ib29sZWFuIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9IGZhbHNlOwotCi1ib29sZWFuIGxkZ3JhbV9pbl9zY3JpcHQgPSBmYWxzZTsKLWJvb2xlYW4gbGRncmFtX2hhZF9lcXVhbHMgPSBmYWxzZTsKLWJvb2xlYW4gbGRncmFtX2hhZF9rZWVwID0gZmFsc2U7Ci1jaGFyICpsZGdyYW1fdmVyc19jdXJyZW50X2xhbmcgPSBOVUxMOwotCi0jZGVmaW5lIEVSUk9SX05BTUVfTUFYIDIwCi1zdGF0aWMgY2hhciAqZXJyb3JfbmFtZXNbRVJST1JfTkFNRV9NQVhdOwotc3RhdGljIGludCBlcnJvcl9pbmRleDsKLSNkZWZpbmUgUFVTSF9FUlJPUih4KSBpZiAoZXJyb3JfaW5kZXggPCBFUlJPUl9OQU1FX01BWCkgZXJyb3JfbmFtZXNbZXJyb3JfaW5kZXhdID0geDsgZXJyb3JfaW5kZXgrKzsKLSNkZWZpbmUgUE9QX0VSUk9SKCkgICBlcnJvcl9pbmRleC0tOwotJX0KLSV1bmlvbiB7Ci0gIGJmZF92bWEgaW50ZWdlcjsKLSAgY2hhciAqbmFtZTsKLSAgY29uc3QgY2hhciAqY25hbWU7Ci0gIHN0cnVjdCB3aWxkY2FyZF9zcGVjIHdpbGRjYXJkOwotICBpbnQgdG9rZW47Ci0gIHVuaW9uIGV0cmVlX3VuaW9uICpldHJlZTsKLSAgc3RydWN0IHBoZHJfaW5mbwotICAgIHsKLSAgICAgIGJvb2xlYW4gZmlsZWhkcjsKLSAgICAgIGJvb2xlYW4gcGhkcnM7Ci0gICAgICB1bmlvbiBldHJlZV91bmlvbiAqYXQ7Ci0gICAgICB1bmlvbiBldHJlZV91bmlvbiAqZmxhZ3M7Ci0gICAgfSBwaGRyOwotICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICpub2Nyb3NzcmVmOwotICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKnNlY3Rpb25fcGhkcjsKLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpkZWZsaXN0OwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKnZlcnN5bXM7Ci0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdmVyc25vZGU7Ci19Ci0KLSV0eXBlIDxldHJlZT4gZXhwIG9wdF9leHBfd2l0aF90eXBlIG11c3RiZV9leHAgb3B0X2F0IHBoZHJfdHlwZSBwaGRyX3ZhbAotJXR5cGUgPGV0cmVlPiBvcHRfZXhwX3dpdGhvdXRfdHlwZQotJXR5cGUgPGludGVnZXI+IGZpbGxfb3B0Ci0ldHlwZSA8bmFtZT4gbWVtc3BlY19vcHQgY2FzZXN5bWxpc3QKLSV0eXBlIDxjbmFtZT4gd2lsZGNhcmRfbmFtZQotJXR5cGUgPHdpbGRjYXJkPiB3aWxkY2FyZF9zcGVjCi0ldG9rZW4gPGludGVnZXI+IElOVCAgCi0ldG9rZW4gPG5hbWU+IE5BTUUgTE5BTUUKLSV0eXBlIDxpbnRlZ2VyPiBsZW5ndGgKLSV0eXBlIDxwaGRyPiBwaGRyX3F1YWxpZmllcnMKLSV0eXBlIDxub2Nyb3NzcmVmPiBub2Nyb3NzcmVmX2xpc3QKLSV0eXBlIDxzZWN0aW9uX3BoZHI+IHBoZHJfb3B0Ci0ldHlwZSA8aW50ZWdlcj4gb3B0X25vY3Jvc3NyZWZzCi0KLSVyaWdodCA8dG9rZW4+IFBMVVNFUSBNSU5VU0VRIE1VTFRFUSBESVZFUSAgJz0nIExTSElGVEVRIFJTSElGVEVRICAgQU5ERVEgT1JFUSAKLSVyaWdodCA8dG9rZW4+ICc/JyAnOicKLSVsZWZ0IDx0b2tlbj4gT1JPUgotJWxlZnQgPHRva2VuPiAgQU5EQU5ECi0lbGVmdCA8dG9rZW4+ICd8JwotJWxlZnQgPHRva2VuPiAgJ14nCi0lbGVmdCAgPHRva2VuPiAnJicKLSVsZWZ0IDx0b2tlbj4gIEVRIE5FCi0lbGVmdCAgPHRva2VuPiAnPCcgJz4nIExFIEdFCi0lbGVmdCAgPHRva2VuPiBMU0hJRlQgUlNISUZUCi0KLSVsZWZ0ICA8dG9rZW4+ICcrJyAnLScKLSVsZWZ0ICA8dG9rZW4+ICcqJyAnLycgJyUnCi0KLSVyaWdodCBVTkFSWQotJXRva2VuIEVORCAKLSVsZWZ0IDx0b2tlbj4gJygnCi0ldG9rZW4gPHRva2VuPiBBTElHTl9LIEJMT0NLIEJJTkQgUVVBRCBTUVVBRCBMT05HIFNIT1JUIEJZVEUKLSV0b2tlbiBTRUNUSU9OUyBQSERSUyBTT1JUCi0ldG9rZW4gJ3snICd9JwotJXRva2VuIFNJWkVPRl9IRUFERVJTIE9VVFBVVF9GT1JNQVQgRk9SQ0VfQ09NTU9OX0FMTE9DQVRJT04gT1VUUFVUX0FSQ0gKLSV0b2tlbiBTSVpFT0ZfSEVBREVSUwotJXRva2VuIElOQ0xVREUKLSV0b2tlbiBNRU1PUlkgREVGU1lNRU5ECi0ldG9rZW4gTk9MT0FEIERTRUNUIENPUFkgSU5GTyBPVkVSTEFZCi0ldG9rZW4gTkFNRSBMTkFNRSBERUZJTkVEIFRBUkdFVF9LIFNFQVJDSF9ESVIgTUFQIEVOVFJZCi0ldG9rZW4gPGludGVnZXI+IE5FWFQKLSV0b2tlbiBTSVpFT0YgQUREUiBMT0FEQUREUiBNQVhfSyBNSU5fSwotJXRva2VuIFNUQVJUVVAgSExMIFNZU0xJQiBGTE9BVCBOT0ZMT0FUIE5PQ1JPU1NSRUZTCi0ldG9rZW4gT1JJR0lOIEZJTEwKLSV0b2tlbiBMRU5HVEggQ1JFQVRFX09CSkVDVF9TWU1CT0xTIElOUFVUIEdST1VQIE9VVFBVVCBDT05TVFJVQ1RPUlMKLSV0b2tlbiBBTElHTk1PRCBBVCBQUk9WSURFCi0ldHlwZSA8dG9rZW4+IGFzc2lnbl9vcCBhdHlwZQotJXR5cGUgPG5hbWU+ICBmaWxlbmFtZQotJXRva2VuIENISVAgTElTVCBTRUNUIEFCU09MVVRFICBMT0FEIE5FV0xJTkUgRU5EV09SRCBPUkRFUiBOQU1FV09SRCBBU1NFUlRfSwotJXRva2VuIEZPUk1BVCBQVUJMSUMgREVGU1lNRU5EIEJBU0UgQUxJQVMgVFJVTkNBVEUgUkVMCi0ldG9rZW4gSU5QVVRfU0NSSVBUIElOUFVUX01SSV9TQ1JJUFQgSU5QVVRfREVGU1lNIENBU0UgRVhURVJOIFNUQVJUCi0ldG9rZW4gPG5hbWU+IFZFUlNfVEFHIFZFUlNfSURFTlRJRklFUgotJXRva2VuIEdMT0JBTCBMT0NBTCBWRVJTSU9OSyBJTlBVVF9WRVJTSU9OX1NDUklQVAotJXRva2VuIEtFRVAKLSV0b2tlbiBFWENMVURFX0ZJTEUKLSV0eXBlIDx2ZXJzeW1zPiB2ZXJzX2RlZm5zCi0ldHlwZSA8dmVyc25vZGU+IHZlcnNfdGFnCi0ldHlwZSA8ZGVmbGlzdD4gdmVyZGVwCi0KLSUlCi0KLWZpbGU6CQotCQlJTlBVVF9TQ1JJUFQgc2NyaXB0X2ZpbGUKLQl8CUlOUFVUX01SSV9TQ1JJUFQgbXJpX3NjcmlwdF9maWxlCi0JfAlJTlBVVF9WRVJTSU9OX1NDUklQVCB2ZXJzaW9uX3NjcmlwdF9maWxlCi0JfAlJTlBVVF9ERUZTWU0gZGVmc3ltX2V4cHIKLQk7Ci0KLQotZmlsZW5hbWU6ICBOQU1FOwotCi0KLWRlZnN5bV9leHByOgotCQl7IGxkbGV4X2RlZnN5bSgpOyB9Ci0JCU5BTUUgJz0nIGV4cAotCQl7Ci0JCSAgbGRsZXhfcG9wc3RhdGUoKTsKLQkJICBsYW5nX2FkZF9hc3NpZ25tZW50KGV4cF9hc3NvcCgkMywkMiwkNCkpOwotCQl9Ci0KLS8qIFNZTlRBWCBXSVRISU4gQU4gTVJJIFNDUklQVCBGSUxFICovICAKLW1yaV9zY3JpcHRfZmlsZToKLQkJewotCQkgIGxkbGV4X21yaV9zY3JpcHQgKCk7Ci0JCSAgUFVTSF9FUlJPUiAoXygiTVJJIHN0eWxlIHNjcmlwdCIpKTsKLQkJfQotCSAgICAgbXJpX3NjcmlwdF9saW5lcwotCQl7Ci0JCSAgbGRsZXhfcG9wc3RhdGUgKCk7Ci0JCSAgbXJpX2RyYXdfdHJlZSAoKTsKLQkJICBQT1BfRVJST1IgKCk7Ci0JCX0KLQk7Ci0KLW1yaV9zY3JpcHRfbGluZXM6Ci0JCW1yaV9zY3JpcHRfbGluZXMgbXJpX3NjcmlwdF9jb21tYW5kIE5FV0xJTkUKLSAgICAgICAgICB8Ci0JOwotCi1tcmlfc2NyaXB0X2NvbW1hbmQ6Ci0JCUNISVAgIGV4cCAKLQl8CUNISVAgIGV4cCAnLCcgZXhwCi0JfAlOQU1FIAl7Ci0JCQllaW5mbyhfKCIlUCVGOiB1bnJlY29nbmlzZWQga2V5d29yZCBpbiBNUkkgc3R5bGUgc2NyaXB0ICclcydcbiIpLCQxKTsKLQkJCX0KLQl8CUxJU1QgIAl7Ci0JCQljb25maWcubWFwX2ZpbGVuYW1lID0gIi0iOwotCQkJfQotICAgICAgICB8ICAgICAgIE9SREVSIG9yZGVybmFtZWxpc3QKLQl8ICAgICAgIEVORFdPUkQgCi0gICAgICAgIHwgICAgICAgUFVCTElDIE5BTUUgJz0nIGV4cAotIAkJCXsgbXJpX3B1YmxpYygkMiwgJDQpOyB9Ci0gICAgICAgIHwgICAgICAgUFVCTElDIE5BTUUgJywnIGV4cAotIAkJCXsgbXJpX3B1YmxpYygkMiwgJDQpOyB9Ci0gICAgICAgIHwgICAgICAgUFVCTElDIE5BTUUgIGV4cCAKLSAJCQl7IG1yaV9wdWJsaWMoJDIsICQzKTsgfQotCXwgCUZPUk1BVCBOQU1FCi0JCQl7IG1yaV9mb3JtYXQoJDIpOyB9Ci0JfAlTRUNUIE5BTUUgJywnIGV4cAotCQkJeyBtcmlfb3V0cHV0X3NlY3Rpb24oJDIsICQ0KTt9Ci0JfAlTRUNUIE5BTUUgIGV4cAotCQkJeyBtcmlfb3V0cHV0X3NlY3Rpb24oJDIsICQzKTt9Ci0JfAlTRUNUIE5BTUUgJz0nIGV4cAotCQkJeyBtcmlfb3V0cHV0X3NlY3Rpb24oJDIsICQ0KTt9Ci0JfAlBTElHTl9LIE5BTUUgJz0nIGV4cAotCQkJeyBtcmlfYWxpZ24oJDIsJDQpOyB9Ci0JfAlBTElHTl9LIE5BTUUgJywnIGV4cAotCQkJeyBtcmlfYWxpZ24oJDIsJDQpOyB9Ci0JfAlBTElHTk1PRCBOQU1FICc9JyBleHAKLQkJCXsgbXJpX2FsaWdubW9kKCQyLCQ0KTsgfQotCXwJQUxJR05NT0QgTkFNRSAnLCcgZXhwCi0JCQl7IG1yaV9hbGlnbm1vZCgkMiwkNCk7IH0KLQl8CUFCU09MVVRFIG1yaV9hYnNfbmFtZV9saXN0Ci0JfAlMT0FECSBtcmlfbG9hZF9uYW1lX2xpc3QKLQl8ICAgICAgIE5BTUVXT1JEIE5BTUUgCi0JCQl7IG1yaV9uYW1lKCQyKTsgfSAgIAotCXwJQUxJQVMgTkFNRSAnLCcgTkFNRQotCQkJeyBtcmlfYWxpYXMoJDIsJDQsMCk7fQotCXwJQUxJQVMgTkFNRSAnLCcgSU5UCi0JCQl7IG1yaV9hbGlhcygkMiwwLChpbnQpICQ0KTt9Ci0JfAlCQVNFICAgICBleHAKLQkJCXsgbXJpX2Jhc2UoJDIpOyB9Ci0gICAgICAgIHwgICAgICAgVFJVTkNBVEUgSU5UCi0JCXsgIG1yaV90cnVuY2F0ZSgodW5zaWduZWQgaW50KSAkMik7IH0KLQl8CUNBU0UgY2FzZXN5bWxpc3QKLQl8CUVYVEVSTiBleHRlcm5fbmFtZV9saXN0Ci0JfAlJTkNMVURFIGZpbGVuYW1lCi0JCXsgbGRmaWxlX29wZW5fY29tbWFuZF9maWxlICgkMik7IH0gbXJpX3NjcmlwdF9saW5lcyBFTkQKLQl8CVNUQVJUIE5BTUUKLQkJeyBsYW5nX2FkZF9lbnRyeSAoJDIsIGZhbHNlKTsgfQotICAgICAgICB8Ci0JOwotCi1vcmRlcm5hbWVsaXN0OgotCSAgICAgIG9yZGVybmFtZWxpc3QgJywnIE5BTUUgICAgICAgICB7IG1yaV9vcmRlcigkMyk7IH0KLQl8ICAgICBvcmRlcm5hbWVsaXN0ICBOQU1FICAgICAgICAgeyBtcmlfb3JkZXIoJDIpOyB9Ci0gICAgICAJfAotCTsKLQotbXJpX2xvYWRfbmFtZV9saXN0OgotCQlOQU1FCi0JCQl7IG1yaV9sb2FkKCQxKTsgfQotCXwJbXJpX2xvYWRfbmFtZV9saXN0ICcsJyBOQU1FIHsgbXJpX2xvYWQoJDMpOyB9Ci0JOwotCi1tcmlfYWJzX25hbWVfbGlzdDoKLSAJCU5BTUUKLSAJCQl7IG1yaV9vbmx5X2xvYWQoJDEpOyB9Ci0JfAltcmlfYWJzX25hbWVfbGlzdCAnLCcgIE5BTUUKLSAJCQl7IG1yaV9vbmx5X2xvYWQoJDMpOyB9Ci0JOwotCi1jYXNlc3ltbGlzdDoKLQkgIC8qIGVtcHR5ICovIHsgJCQgPSBOVUxMOyB9Ci0JfCBOQU1FCi0JfCBjYXNlc3ltbGlzdCAnLCcgTkFNRQotCTsKLQotZXh0ZXJuX25hbWVfbGlzdDoKLQkgIE5BTUUKLQkJCXsgbGRsYW5nX2FkZF91bmRlZiAoJDEpOyB9Ci0JfCBleHRlcm5fbmFtZV9saXN0IE5BTUUKLQkJCXsgbGRsYW5nX2FkZF91bmRlZiAoJDIpOyB9Ci0JfCBleHRlcm5fbmFtZV9saXN0ICcsJyBOQU1FCi0JCQl7IGxkbGFuZ19hZGRfdW5kZWYgKCQzKTsgfQotCTsKLQotc2NyaXB0X2ZpbGU6Ci0JewotCSBsZGxleF9ib3RoKCk7Ci0JfQotICAgICAgIGlmaWxlX2xpc3QKLQl7Ci0JbGRsZXhfcG9wc3RhdGUoKTsKLQl9Ci0gICAgICAgIDsKLQotCi1pZmlsZV9saXN0OgotICAgICAgIGlmaWxlX2xpc3QgaWZpbGVfcDEKLSAgICAgICAgfAotCTsKLQotCi0KLWlmaWxlX3AxOgotCQltZW1vcnkKLQl8CXNlY3Rpb25zCi0JfAlwaGRycwotCXwJc3RhcnR1cAotCXwJaGlnaF9sZXZlbF9saWJyYXJ5Ci0JfAlsb3dfbGV2ZWxfbGlicmFyeQotCXwJZmxvYXRpbmdfcG9pbnRfc3VwcG9ydAotCXwJc3RhdGVtZW50X2FueXdoZXJlCi0JfAl2ZXJzaW9uCi0gICAgICAgIHwJICc7JwotCXwJVEFSR0VUX0sgJygnIE5BTUUgJyknCi0JCXsgbGFuZ19hZGRfdGFyZ2V0KCQzKTsgfQotCXwJU0VBUkNIX0RJUiAnKCcgZmlsZW5hbWUgJyknCi0JCXsgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKCQzLCBmYWxzZSk7IH0KLQl8CU9VVFBVVCAnKCcgZmlsZW5hbWUgJyknCi0JCXsgbGFuZ19hZGRfb3V0cHV0KCQzLCAxKTsgfQotICAgICAgICB8CU9VVFBVVF9GT1JNQVQgJygnIE5BTUUgJyknCi0JCSAgeyBsYW5nX2FkZF9vdXRwdXRfZm9ybWF0ICgkMywgKGNoYXIgKikgTlVMTCwKLQkJCQkJICAgIChjaGFyICopIE5VTEwsIDEpOyB9Ci0JfAlPVVRQVVRfRk9STUFUICcoJyBOQU1FICcsJyBOQU1FICcsJyBOQU1FICcpJwotCQkgIHsgbGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCAoJDMsICQ1LCAkNywgMSk7IH0KLSAgICAgICAgfAlPVVRQVVRfQVJDSCAnKCcgTkFNRSAnKScKLQkJICB7IGxkZmlsZV9zZXRfb3V0cHV0X2FyY2goJDMpOyB9Ci0JfAlGT1JDRV9DT01NT05fQUxMT0NBVElPTgotCQl7IGNvbW1hbmRfbGluZS5mb3JjZV9jb21tb25fZGVmaW5pdGlvbiA9IHRydWUgOyB9Ci0JfAlJTlBVVCAnKCcgaW5wdXRfbGlzdCAnKScKLQl8CUdST1VQCi0JCSAgeyBsYW5nX2VudGVyX2dyb3VwICgpOyB9Ci0JCSAgICAnKCcgaW5wdXRfbGlzdCAnKScKLQkJICB7IGxhbmdfbGVhdmVfZ3JvdXAgKCk7IH0KLSAgICAgCXwJTUFQICcoJyBmaWxlbmFtZSAnKScKLQkJeyBsYW5nX2FkZF9tYXAoJDMpOyB9Ci0JfAlJTkNMVURFIGZpbGVuYW1lIAotCQl7IGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSgkMik7IH0gaWZpbGVfbGlzdCBFTkQKLQl8CU5PQ1JPU1NSRUZTICcoJyBub2Nyb3NzcmVmX2xpc3QgJyknCi0JCXsKLQkJICBsYW5nX2FkZF9ub2Nyb3NzcmVmICgkMyk7Ci0JCX0KLQl8CUVYVEVSTiAnKCcgZXh0ZXJuX25hbWVfbGlzdCAnKScKLQk7Ci0KLWlucHV0X2xpc3Q6Ci0JCU5BTUUKLQkJeyBsYW5nX2FkZF9pbnB1dF9maWxlKCQxLGxhbmdfaW5wdXRfZmlsZV9pc19zZWFyY2hfZmlsZV9lbnVtLAotCQkJCSAoY2hhciAqKU5VTEwpOyB9Ci0JfAlpbnB1dF9saXN0ICcsJyBOQU1FCi0JCXsgbGFuZ19hZGRfaW5wdXRfZmlsZSgkMyxsYW5nX2lucHV0X2ZpbGVfaXNfc2VhcmNoX2ZpbGVfZW51bSwKLQkJCQkgKGNoYXIgKilOVUxMKTsgfQotCXwJaW5wdXRfbGlzdCBOQU1FCi0JCXsgbGFuZ19hZGRfaW5wdXRfZmlsZSgkMixsYW5nX2lucHV0X2ZpbGVfaXNfc2VhcmNoX2ZpbGVfZW51bSwKLQkJCQkgKGNoYXIgKilOVUxMKTsgfQotCXwJTE5BTUUKLQkJeyBsYW5nX2FkZF9pbnB1dF9maWxlKCQxLGxhbmdfaW5wdXRfZmlsZV9pc19sX2VudW0sCi0JCQkJIChjaGFyICopTlVMTCk7IH0KLQl8CWlucHV0X2xpc3QgJywnIExOQU1FCi0JCXsgbGFuZ19hZGRfaW5wdXRfZmlsZSgkMyxsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtLAotCQkJCSAoY2hhciAqKU5VTEwpOyB9Ci0JfAlpbnB1dF9saXN0IExOQU1FCi0JCXsgbGFuZ19hZGRfaW5wdXRfZmlsZSgkMixsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtLAotCQkJCSAoY2hhciAqKU5VTEwpOyB9Ci0JOwotCi1zZWN0aW9uczoKLQkJU0VDVElPTlMgJ3snIHNlY19vcl9ncm91cF9wMSAnfScKLQk7Ci0KLXNlY19vcl9ncm91cF9wMToKLQkJc2VjX29yX2dyb3VwX3AxIHNlY3Rpb24KLQl8CXNlY19vcl9ncm91cF9wMSBzdGF0ZW1lbnRfYW55d2hlcmUKLQl8Ci0JOwotCi1zdGF0ZW1lbnRfYW55d2hlcmU6Ci0JCUVOVFJZICcoJyBOQU1FICcpJwotCQl7IGxhbmdfYWRkX2VudHJ5ICgkMywgZmFsc2UpOyB9Ci0JfAlhc3NpZ25tZW50IGVuZAotCTsKLQotLyogVGhlICcqJyBhbmQgJz8nIGNhc2VzIGFyZSB0aGVyZSBiZWNhdXNlIHRoZSBsZXhlciByZXR1cm5zIHRoZW0gYXMKLSAgIHNlcGFyYXRlIHRva2VucyByYXRoZXIgdGhhbiBhcyBOQU1FLiAgKi8KLXdpbGRjYXJkX25hbWU6Ci0JCU5BTUUKLQkJCXsKLQkJCSAgJCQgPSAkMTsKLQkJCX0KLQl8CScqJwotCQkJewotCQkJICAkJCA9ICIqIjsKLQkJCX0KLQl8CSc/JwotCQkJewotCQkJICAkJCA9ICI/IjsKLQkJCX0KLQk7Ci0KLXdpbGRjYXJkX3NwZWM6Ci0JCXdpbGRjYXJkX25hbWUKLQkJCXsKLQkJCSAgJCQubmFtZSA9ICQxOwotCQkJICAkJC5zb3J0ZWQgPSBmYWxzZTsKLQkJCSAgJCQuZXhjbHVkZV9uYW1lID0gTlVMTDsKLQkJCX0KLQl8IAlFWENMVURFX0ZJTEUgJygnIHdpbGRjYXJkX25hbWUgJyknIHdpbGRjYXJkX25hbWUKLQkJCXsKLQkJCSAgJCQubmFtZSA9ICQ1OwotCQkJICAkJC5zb3J0ZWQgPSBmYWxzZTsKLQkJCSAgJCQuZXhjbHVkZV9uYW1lID0gJDM7Ci0JCQl9Ci0JfAlTT1JUICcoJyB3aWxkY2FyZF9uYW1lICcpJwotCQkJewotCQkJICAkJC5uYW1lID0gJDM7Ci0JCQkgICQkLnNvcnRlZCA9IHRydWU7Ci0JCQkgICQkLmV4Y2x1ZGVfbmFtZSA9IE5VTEw7Ci0JCQl9Ci0JfAlTT1JUICcoJyBFWENMVURFX0ZJTEUgJygnIHdpbGRjYXJkX25hbWUgJyknIHdpbGRjYXJkX25hbWUgJyknCi0JCQl7Ci0JCQkgICQkLm5hbWUgPSAkNzsKLQkJCSAgJCQuc29ydGVkID0gdHJ1ZTsKLQkJCSAgJCQuZXhjbHVkZV9uYW1lID0gJDU7Ci0JCQl9Ci0JOwotCi0KLWZpbGVfTkFNRV9saXN0OgotCQl3aWxkY2FyZF9zcGVjCi0JCQl7Ci0JCQkgIGxhbmdfYWRkX3dpbGQgKCQxLm5hbWUsICQxLnNvcnRlZCwKLQkJCQkJIGN1cnJlbnRfZmlsZS5uYW1lLAotCQkJCQkgY3VycmVudF9maWxlLnNvcnRlZCwKLQkJCQkJIGxkZ3JhbV9oYWRfa2VlcCwgJDEuZXhjbHVkZV9uYW1lKTsKLQkJCX0KLQl8CWZpbGVfTkFNRV9saXN0IG9wdF9jb21tYSB3aWxkY2FyZF9zcGVjCi0JCQl7Ci0JCQkgIGxhbmdfYWRkX3dpbGQgKCQzLm5hbWUsICQzLnNvcnRlZCwKLQkJCQkJIGN1cnJlbnRfZmlsZS5uYW1lLAotCQkJCQkgY3VycmVudF9maWxlLnNvcnRlZCwKLQkJCQkJIGxkZ3JhbV9oYWRfa2VlcCwgJDMuZXhjbHVkZV9uYW1lKTsKLQkJCX0KLQk7Ci0KLWlucHV0X3NlY3Rpb25fc3BlY19ub19rZWVwOgotCQlOQU1FCi0JCQl7Ci0JCQkgIGxhbmdfYWRkX3dpbGQgKE5VTEwsIGZhbHNlLCAkMSwgZmFsc2UsCi0JCQkJCSBsZGdyYW1faGFkX2tlZXAsIE5VTEwpOwotCQkJfQotICAgICAgICB8CSdbJwotCQkJewotCQkJICBjdXJyZW50X2ZpbGUubmFtZSA9IE5VTEw7Ci0JCQkgIGN1cnJlbnRfZmlsZS5zb3J0ZWQgPSBmYWxzZTsKLQkJCX0KLQkJZmlsZV9OQU1FX2xpc3QgJ10nCi0JfAl3aWxkY2FyZF9zcGVjCi0JCQl7Ci0JCQkgIGN1cnJlbnRfZmlsZSA9ICQxOwotCQkJICAvKiAnKicgbWF0Y2hlcyBhbnkgZmlsZSBuYW1lLiAgKi8KLQkJCSAgaWYgKHN0cmNtcCAoY3VycmVudF9maWxlLm5hbWUsICIqIikgPT0gMCkKLQkJCSAgICBjdXJyZW50X2ZpbGUubmFtZSA9IE5VTEw7Ci0JCQl9Ci0JCScoJyBmaWxlX05BTUVfbGlzdCAnKScKLQk7Ci0KLWlucHV0X3NlY3Rpb25fc3BlYzoKLQkJaW5wdXRfc2VjdGlvbl9zcGVjX25vX2tlZXAKLQl8CUtFRVAgJygnCi0JCQl7IGxkZ3JhbV9oYWRfa2VlcCA9IHRydWU7IH0KLQkJaW5wdXRfc2VjdGlvbl9zcGVjX25vX2tlZXAgJyknCi0JCQl7IGxkZ3JhbV9oYWRfa2VlcCA9IGZhbHNlOyB9Ci0JOwotCi1zdGF0ZW1lbnQ6Ci0JICAJYXNzaWdubWVudCBlbmQKLQl8CUNSRUFURV9PQkpFQ1RfU1lNQk9MUwotCQl7Ci0gCQlsYW5nX2FkZF9hdHRyaWJ1dGUobGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bSk7IAotCSAgICAgIAl9Ci0gICAgICAgIHwJJzsnCi0gICAgICAgIHwJQ09OU1RSVUNUT1JTCi0JCXsKLSAJCQotCQkgIGxhbmdfYWRkX2F0dHJpYnV0ZShsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bSk7IAotCQl9Ci0JfCBTT1JUICcoJyBDT05TVFJVQ1RPUlMgJyknCi0JCXsKLQkJICBjb25zdHJ1Y3RvcnNfc29ydGVkID0gdHJ1ZTsKLQkJICBsYW5nX2FkZF9hdHRyaWJ1dGUgKGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtKTsKLQkJfQotCXwgaW5wdXRfc2VjdGlvbl9zcGVjCi0gICAgICAgIHwgbGVuZ3RoICcoJyBtdXN0YmVfZXhwICcpJwotICAgICAgICAJICAgICAgICB7Ci0JCQlsYW5nX2FkZF9kYXRhKChpbnQpICQxLCQzKTsKLQkJCX0KLSAgCi0JfCBGSUxMICcoJyBtdXN0YmVfZXhwICcpJwotCQkJewotCQkJICBsYW5nX2FkZF9maWxsCi0JCQkgICAgKGV4cF9nZXRfdmFsdWVfaW50KCQzLAotCQkJCQkgICAgICAgMCwKLQkJCQkJICAgICAgICJmaWxsIHZhbHVlIiwKLQkJCQkJICAgICAgIGxhbmdfZmlyc3RfcGhhc2VfZW51bSkpOwotCQkJfQotCTsKLQotc3RhdGVtZW50X2xpc3Q6Ci0JCXN0YXRlbWVudF9saXN0IHN0YXRlbWVudAotICAJfCAgCXN0YXRlbWVudAotCTsKLSAgCi1zdGF0ZW1lbnRfbGlzdF9vcHQ6Ci0JCS8qIGVtcHR5ICovCi0JfAlzdGF0ZW1lbnRfbGlzdAotCTsKLQotbGVuZ3RoOgotCQlRVUFECi0JCQl7ICQkID0gJDE7IH0KLQl8CVNRVUFECi0JCQl7ICQkID0gJDE7IH0KLQl8CUxPTkcKLQkJCXsgJCQgPSAkMTsgfQotCXwgCVNIT1JUCi0JCQl7ICQkID0gJDE7IH0KLQl8CUJZVEUKLQkJCXsgJCQgPSAkMTsgfQotCTsKLQotZmlsbF9vcHQ6Ci0gICAgICAgICAgJz0nIG11c3RiZV9leHAKLQkJewotCQkgICQkID0JIGV4cF9nZXRfdmFsdWVfaW50KCQyLAotCQkJCQkgICAwLAotCQkJCQkgICAiZmlsbCB2YWx1ZSIsCi0JCQkJCSAgIGxhbmdfZmlyc3RfcGhhc2VfZW51bSk7Ci0JCX0KLQl8IAl7ICQkID0gMDsgfQotCTsKLQotCQkKLQotYXNzaWduX29wOgotCQlQTFVTRVEKLQkJCXsgJCQgPSAnKyc7IH0KLQl8CU1JTlVTRVEKLQkJCXsgJCQgPSAnLSc7IH0KLQl8IAlNVUxURVEKLQkJCXsgJCQgPSAnKic7IH0KLQl8IAlESVZFUQotCQkJeyAkJCA9ICcvJzsgfQotCXwgCUxTSElGVEVRCi0JCQl7ICQkID0gTFNISUZUOyB9Ci0JfCAJUlNISUZURVEKLQkJCXsgJCQgPSBSU0hJRlQ7IH0KLQl8IAlBTkRFUQotCQkJeyAkJCA9ICcmJzsgfQotCXwgCU9SRVEKLQkJCXsgJCQgPSAnfCc7IH0KLQotCTsKLQotZW5kOgknOycgfCAnLCcKLQk7Ci0KLQotYXNzaWdubWVudDoKLQkJTkFNRSAnPScgbXVzdGJlX2V4cAotCQl7Ci0JCSAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgkMiwgJDEsICQzKSk7Ci0JCX0KLQl8CU5BTUUgYXNzaWduX29wIG11c3RiZV9leHAKLQkJewotCQkgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCAkMSwKLQkJCQkJCSAgZXhwX2Jpbm9wICgkMiwKLQkJCQkJCQkgICAgIGV4cF9uYW1lb3AgKE5BTUUsCi0JCQkJCQkJCQkgJDEpLAotCQkJCQkJCSAgICAgJDMpKSk7Ci0JCX0KLQl8CVBST1ZJREUgJygnIE5BTUUgJz0nIG11c3RiZV9leHAgJyknCi0JCXsKLQkJICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfcHJvdmlkZSAoJDMsICQ1KSk7Ci0JCX0KLQk7Ci0KLQotb3B0X2NvbW1hOgotCQknLCcJfAk7Ci0KLQotbWVtb3J5OgotCQlNRU1PUlkgJ3snIG1lbW9yeV9zcGVjIG1lbW9yeV9zcGVjX2xpc3QgJ30nCi0JOwotCi1tZW1vcnlfc3BlY19saXN0OgotCQltZW1vcnlfc3BlY19saXN0IG1lbW9yeV9zcGVjCi0JfAltZW1vcnlfc3BlY19saXN0ICcsJyBtZW1vcnlfc3BlYwotCXwKLQk7Ci0KLQotbWVtb3J5X3NwZWM6IAkJTkFNRQotCQkJeyByZWdpb24gPSBsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwKCQxKTsgfQotCQlhdHRyaWJ1dGVzX29wdCAnOicKLQkJb3JpZ2luX3NwZWMgb3B0X2NvbW1hIGxlbmd0aF9zcGVjCi0KLQk7IG9yaWdpbl9zcGVjOgotCU9SSUdJTiAnPScgbXVzdGJlX2V4cAotCQl7IHJlZ2lvbi0+Y3VycmVudCA9Ci0JCSByZWdpb24tPm9yaWdpbiA9Ci0JCSBleHBfZ2V0X3ZtYSgkMywgMEwsIm9yaWdpbiIsIGxhbmdfZmlyc3RfcGhhc2VfZW51bSk7Ci19Ci0JOwotCi1sZW5ndGhfc3BlYzoKLSAgICAgICAgICAgICBMRU5HVEggJz0nIG11c3RiZV9leHAKLSAgICAgICAgICAgICAgIHsgcmVnaW9uLT5sZW5ndGggPSBleHBfZ2V0X3ZtYSgkMywKLQkJCQkJICAgICAgIH4oKGJmZF92bWEpMCksCi0JCQkJCSAgICAgICAibGVuZ3RoIiwKLQkJCQkJICAgICAgIGxhbmdfZmlyc3RfcGhhc2VfZW51bSk7Ci0JCX0KLQkKLQotYXR0cmlidXRlc19vcHQ6Ci0JCSAgJygnIE5BTUUgJyknCi0JCQl7Ci0JCQlsYW5nX3NldF9mbGFncyhyZWdpb24sICQyKTsKLQkJCX0KLQl8Ci0gIAotCTsKLQotc3RhcnR1cDoKLQlTVEFSVFVQICcoJyBmaWxlbmFtZSAnKScKLQkJeyBsYW5nX3N0YXJ0dXAoJDMpOyB9Ci0JOwotCi1oaWdoX2xldmVsX2xpYnJhcnk6Ci0JCUhMTCAnKCcgaGlnaF9sZXZlbF9saWJyYXJ5X05BTUVfbGlzdCAnKScKLQl8CUhMTCAnKCcgJyknCi0JCQl7IGxkZW11bF9obGwoKGNoYXIgKilOVUxMKTsgfQotCTsKLQotaGlnaF9sZXZlbF9saWJyYXJ5X05BTUVfbGlzdDoKLQkJaGlnaF9sZXZlbF9saWJyYXJ5X05BTUVfbGlzdCBvcHRfY29tbWEgZmlsZW5hbWUKLQkJCXsgbGRlbXVsX2hsbCgkMyk7IH0KLQl8CWZpbGVuYW1lCi0JCQl7IGxkZW11bF9obGwoJDEpOyB9Ci0KLQk7Ci0KLWxvd19sZXZlbF9saWJyYXJ5OgotCVNZU0xJQiAnKCcgbG93X2xldmVsX2xpYnJhcnlfTkFNRV9saXN0ICcpJwotCTsgbG93X2xldmVsX2xpYnJhcnlfTkFNRV9saXN0OgotCQlsb3dfbGV2ZWxfbGlicmFyeV9OQU1FX2xpc3Qgb3B0X2NvbW1hIGZpbGVuYW1lCi0JCQl7IGxkZW11bF9zeXNsaWIoJDMpOyB9Ci0JfAotCTsKLQotZmxvYXRpbmdfcG9pbnRfc3VwcG9ydDoKLQkJRkxPQVQKLQkJCXsgbGFuZ19mbG9hdCh0cnVlKTsgfQotCXwJTk9GTE9BVAotCQkJeyBsYW5nX2Zsb2F0KGZhbHNlKTsgfQotCTsKLQkJCi1ub2Nyb3NzcmVmX2xpc3Q6Ci0JCS8qIGVtcHR5ICovCi0JCXsKLQkJICAkJCA9IE5VTEw7Ci0JCX0KLQl8CU5BTUUgbm9jcm9zc3JlZl9saXN0Ci0JCXsKLQkJICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICpuOwotCi0JCSAgbiA9IChzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0JCSAgbi0+bmFtZSA9ICQxOwotCQkgIG4tPm5leHQgPSAkMjsKLQkJICAkJCA9IG47Ci0JCX0KLQl8CU5BTUUgJywnIG5vY3Jvc3NyZWZfbGlzdAotCQl7Ci0JCSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbjsKLQotCQkgIG4gPSAoc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotCQkgIG4tPm5hbWUgPSAkMTsKLQkJICBuLT5uZXh0ID0gJDM7Ci0JCSAgJCQgPSBuOwotCQl9Ci0JOwotCi1tdXN0YmVfZXhwOgkJIHsgbGRsZXhfZXhwcmVzc2lvbigpOyB9Ci0JCWV4cAotCQkJIHsgbGRsZXhfcG9wc3RhdGUoKTsgJCQ9JDI7fQotCTsKLQotZXhwCToKLQkJJy0nIGV4cCAlcHJlYyBVTkFSWQotCQkJeyAkJCA9IGV4cF91bm9wKCctJywgJDIpOyB9Ci0JfAknKCcgZXhwICcpJwotCQkJeyAkJCA9ICQyOyB9Ci0JfAlORVhUICcoJyBleHAgJyknICVwcmVjIFVOQVJZCi0JCQl7ICQkID0gZXhwX3Vub3AoKGludCkgJDEsJDMpOyB9Ci0JfAknIScgZXhwICVwcmVjIFVOQVJZCi0JCQl7ICQkID0gZXhwX3Vub3AoJyEnLCAkMik7IH0KLQl8CScrJyBleHAgJXByZWMgVU5BUlkKLQkJCXsgJCQgPSAkMjsgfQotCXwJJ34nIGV4cCAlcHJlYyBVTkFSWQotCQkJeyAkJCA9IGV4cF91bm9wKCd+JywgJDIpO30KLQotCXwJZXhwICcqJyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJyonLCAkMSwgJDMpOyB9Ci0JfAlleHAgJy8nIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcCgnLycsICQxLCAkMyk7IH0KLQl8CWV4cCAnJScgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKCclJywgJDEsICQzKTsgfQotCXwJZXhwICcrJyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJysnLCAkMSwgJDMpOyB9Ci0JfAlleHAgJy0nIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcCgnLScgLCAkMSwgJDMpOyB9Ci0JfAlleHAgTFNISUZUIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcChMU0hJRlQgLCAkMSwgJDMpOyB9Ci0JfAlleHAgUlNISUZUIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcChSU0hJRlQgLCAkMSwgJDMpOyB9Ci0JfAlleHAgRVEgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKEVRICwgJDEsICQzKTsgfQotCXwJZXhwIE5FIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcChORSAsICQxLCAkMyk7IH0KLQl8CWV4cCBMRSBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoTEUgLCAkMSwgJDMpOyB9Ci0gIAl8CWV4cCBHRSBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoR0UgLCAkMSwgJDMpOyB9Ci0JfAlleHAgJzwnIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcCgnPCcgLCAkMSwgJDMpOyB9Ci0JfAlleHAgJz4nIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcCgnPicgLCAkMSwgJDMpOyB9Ci0JfAlleHAgJyYnIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcCgnJicgLCAkMSwgJDMpOyB9Ci0JfAlleHAgJ14nIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcCgnXicgLCAkMSwgJDMpOyB9Ci0JfAlleHAgJ3wnIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcCgnfCcgLCAkMSwgJDMpOyB9Ci0JfAlleHAgJz8nIGV4cCAnOicgZXhwCi0JCQl7ICQkID0gZXhwX3RyaW5vcCgnPycgLCAkMSwgJDMsICQ1KTsgfQotCXwJZXhwIEFOREFORCBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoQU5EQU5EICwgJDEsICQzKTsgfQotCXwJZXhwIE9ST1IgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKE9ST1IgLCAkMSwgJDMpOyB9Ci0JfAlERUZJTkVEICcoJyBOQU1FICcpJwotCQkJeyAkJCA9IGV4cF9uYW1lb3AoREVGSU5FRCwgJDMpOyB9Ci0JfAlJTlQKLQkJCXsgJCQgPSBleHBfaW50b3AoJDEpOyB9Ci0gICAgICAgIHwJU0laRU9GX0hFQURFUlMKLQkJCXsgJCQgPSBleHBfbmFtZW9wKFNJWkVPRl9IRUFERVJTLDApOyB9Ci0KLQl8CVNJWkVPRiAnKCcgTkFNRSAnKScKLQkJCXsgJCQgPSBleHBfbmFtZW9wKFNJWkVPRiwkMyk7IH0KLQl8CUFERFIgJygnIE5BTUUgJyknCi0JCQl7ICQkID0gZXhwX25hbWVvcChBRERSLCQzKTsgfQotCXwJTE9BREFERFIgJygnIE5BTUUgJyknCi0JCQl7ICQkID0gZXhwX25hbWVvcChMT0FEQUREUiwkMyk7IH0KLQl8CUFCU09MVVRFICcoJyBleHAgJyknCi0JCQl7ICQkID0gZXhwX3Vub3AoQUJTT0xVVEUsICQzKTsgfQotCXwJQUxJR05fSyAnKCcgZXhwICcpJwotCQkJeyAkJCA9IGV4cF91bm9wKEFMSUdOX0ssJDMpOyB9Ci0JfAlCTE9DSyAnKCcgZXhwICcpJwotCQkJeyAkJCA9IGV4cF91bm9wKEFMSUdOX0ssJDMpOyB9Ci0JfAlOQU1FCi0JCQl7ICQkID0gZXhwX25hbWVvcChOQU1FLCQxKTsgfQotCXwJTUFYX0sgJygnIGV4cCAnLCcgZXhwICcpJwotCQkJeyAkJCA9IGV4cF9iaW5vcCAoTUFYX0ssICQzLCAkNSApOyB9Ci0JfAlNSU5fSyAnKCcgZXhwICcsJyBleHAgJyknCi0JCQl7ICQkID0gZXhwX2Jpbm9wIChNSU5fSywgJDMsICQ1ICk7IH0KLQl8CUFTU0VSVF9LICcoJyBleHAgJywnIE5BTUUgJyknCi0JCQl7ICQkID0gZXhwX2Fzc2VydCAoJDMsICQ1KTsgfQotCTsKLQotCi1vcHRfYXQ6Ci0JCUFUICcoJyBleHAgJyknIHsgJCQgPSAkMzsgfQotCXwJeyAkJCA9IDA7IH0KLQk7Ci0KLXNlY3Rpb246CU5BTUUgCQl7IGxkbGV4X2V4cHJlc3Npb24oKTsgfQotCQlvcHRfZXhwX3dpdGhfdHlwZSAKLQkJb3B0X2F0ICAgCXsgbGRsZXhfcG9wc3RhdGUgKCk7IGxkbGV4X3NjcmlwdCAoKTsgfQotCQkneycKLQkJCXsKLQkJCSAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQoJDEsICQzLAotCQkJCQkJCSAgICAgIHNlY3R5cGUsCi0JCQkJCQkJICAgICAgMCwgMCwgMCwgJDQpOwotCQkJfQotCQlzdGF0ZW1lbnRfbGlzdF9vcHQgCQotIAkJJ30nIHsgbGRsZXhfcG9wc3RhdGUgKCk7IGxkbGV4X2V4cHJlc3Npb24gKCk7IH0KLQkJbWVtc3BlY19vcHQgcGhkcl9vcHQgZmlsbF9vcHQKLQkJewotCQkgIGxkbGV4X3BvcHN0YXRlICgpOwotCQkgIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50ICgkMTMsICQxMSwgJDEyKTsKLQkJfQotCQlvcHRfY29tbWEKLQl8CU9WRVJMQVkKLQkJCXsgbGRsZXhfZXhwcmVzc2lvbiAoKTsgfQotCQlvcHRfZXhwX3dpdGhvdXRfdHlwZSBvcHRfbm9jcm9zc3JlZnMgb3B0X2F0Ci0JCQl7IGxkbGV4X3BvcHN0YXRlICgpOyBsZGxleF9zY3JpcHQgKCk7IH0KLQkJJ3snIAotCQkJewotCQkJICBsYW5nX2VudGVyX292ZXJsYXkgKCQzLCAkNSwgKGludCkgJDQpOwotCQkJfQotCQlvdmVybGF5X3NlY3Rpb24KLQkJJ30nCi0JCQl7IGxkbGV4X3BvcHN0YXRlICgpOyBsZGxleF9leHByZXNzaW9uICgpOyB9Ci0JCW1lbXNwZWNfb3B0IHBoZHJfb3B0IGZpbGxfb3B0Ci0JCQl7Ci0JCQkgIGxkbGV4X3BvcHN0YXRlICgpOwotCQkJICBsYW5nX2xlYXZlX292ZXJsYXkgKCQxNCwgJDEyLCAkMTMpOwotCQkJfQotCQlvcHRfY29tbWEKLQl8CS8qIFRoZSBHUk9VUCBjYXNlIGlzIGp1c3QgZW5vdWdoIHRvIHN1cHBvcnQgdGhlIGdjYwotCQkgICBzdnIzLmlmaWxlIHNjcmlwdC4gIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBmdWxsCi0JCSAgIHN1cHBvcnQuICBJJ20gbm90IGV2ZW4gc3VyZSB3aGF0IEdST1VQIGlzIHN1cHBvc2VkCi0JCSAgIHRvIG1lYW4uICAqLwotCQlHUk9VUCB7IGxkbGV4X2V4cHJlc3Npb24gKCk7IH0KLQkJb3B0X2V4cF93aXRoX3R5cGUKLQkJewotCQkgIGxkbGV4X3BvcHN0YXRlICgpOwotCQkgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCAiLiIsICQzKSk7Ci0JCX0KLQkJJ3snIHNlY19vcl9ncm91cF9wMSAnfScKLQk7Ci0KLXR5cGU6Ci0JICAgTk9MT0FEICB7IHNlY3R5cGUgPSBub2xvYWRfc2VjdGlvbjsgfQotCXwgIERTRUNUICAgeyBzZWN0eXBlID0gZHNlY3Rfc2VjdGlvbjsgfQotCXwgIENPUFkgICAgeyBzZWN0eXBlID0gY29weV9zZWN0aW9uOyB9Ci0JfCAgSU5GTyAgICB7IHNlY3R5cGUgPSBpbmZvX3NlY3Rpb247IH0KLQl8ICBPVkVSTEFZIHsgc2VjdHlwZSA9IG92ZXJsYXlfc2VjdGlvbjsgfQotCTsKLQotYXR5cGU6Ci0JIAknKCcgdHlwZSAnKScKLSAgCXwgCS8qIEVNUFRZICovIHsgc2VjdHlwZSA9IG5vcm1hbF9zZWN0aW9uOyB9Ci0gIAl8IAknKCcgJyknIHsgc2VjdHlwZSA9IG5vcm1hbF9zZWN0aW9uOyB9Ci0JOwotCi1vcHRfZXhwX3dpdGhfdHlwZToKLQkJZXhwIGF0eXBlICc6JwkJeyAkJCA9ICQxOyB9Ci0JfAlhdHlwZSAnOicJCXsgJCQgPSAoZXRyZWVfdHlwZSAqKU5VTEw7ICB9Ci0JfAkvKiBUaGUgQklORCBjYXNlcyBhcmUgdG8gc3VwcG9ydCB0aGUgZ2NjIHN2cjMuaWZpbGUKLQkJICAgc2NyaXB0LiAgVGhleSBhcmVuJ3QgaW50ZW5kZWQgdG8gaW1wbGVtZW50IGZ1bGwKLQkJICAgc3VwcG9ydCBmb3IgdGhlIEJJTkQga2V5d29yZC4gIEknbSBub3QgZXZlbiBzdXJlCi0JCSAgIHdoYXQgQklORCBpcyBzdXBwb3NlZCB0byBtZWFuLiAgKi8KLQkJQklORCAnKCcgZXhwICcpJyBhdHlwZSAnOicgeyAkJCA9ICQzOyB9Ci0JfAlCSU5EICcoJyBleHAgJyknIEJMT0NLICcoJyBleHAgJyknIGF0eXBlICc6JwotCQl7ICQkID0gJDM7IH0KLQk7Ci0KLW9wdF9leHBfd2l0aG91dF90eXBlOgotCQlleHAgJzonCQl7ICQkID0gJDE7IH0KLQl8CSc6JwkJeyAkJCA9IChldHJlZV90eXBlICopIE5VTEw7ICB9Ci0JOwotCi1vcHRfbm9jcm9zc3JlZnM6Ci0JCS8qIGVtcHR5ICovCi0JCQl7ICQkID0gMDsgfQotCXwJTk9DUk9TU1JFRlMKLQkJCXsgJCQgPSAxOyB9Ci0JOwotCi1tZW1zcGVjX29wdDoKLQkJJz4nIE5BTUUKLQkJeyAkJCA9ICQyOyB9Ci0JfAl7ICQkID0gIipkZWZhdWx0KiI7IH0KLQk7Ci0KLXBoZHJfb3B0OgotCQkvKiBlbXB0eSAqLwotCQl7Ci0JCSAgJCQgPSBOVUxMOwotCQl9Ci0JfAlwaGRyX29wdCAnOicgTkFNRQotCQl7Ci0JCSAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpuOwotCi0JCSAgbiA9ICgoc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICopCi0JCSAgICAgICB4bWFsbG9jIChzaXplb2YgKm4pKTsKLQkJICBuLT5uYW1lID0gJDM7Ci0JCSAgbi0+dXNlZCA9IGZhbHNlOwotCQkgIG4tPm5leHQgPSAkMTsKLQkJICAkJCA9IG47Ci0JCX0KLQk7Ci0KLW92ZXJsYXlfc2VjdGlvbjoKLQkJLyogZW1wdHkgKi8KLQl8CW92ZXJsYXlfc2VjdGlvbgotCQlOQU1FCi0JCQl7Ci0JCQkgIGxkbGV4X3NjcmlwdCAoKTsKLQkJCSAgbGFuZ19lbnRlcl9vdmVybGF5X3NlY3Rpb24gKCQyKTsKLQkJCX0KLQkJJ3snIHN0YXRlbWVudF9saXN0X29wdCAnfScKLQkJCXsgbGRsZXhfcG9wc3RhdGUgKCk7IGxkbGV4X2V4cHJlc3Npb24gKCk7IH0KLQkJcGhkcl9vcHQgZmlsbF9vcHQKLQkJCXsKLQkJCSAgbGRsZXhfcG9wc3RhdGUgKCk7Ci0JCQkgIGxhbmdfbGVhdmVfb3ZlcmxheV9zZWN0aW9uICgkOSwgJDgpOwotCQkJfQotCQlvcHRfY29tbWEKLQk7Ci0KLXBoZHJzOgotCQlQSERSUyAneycgcGhkcl9saXN0ICd9JwotCTsKLQotcGhkcl9saXN0OgotCQkvKiBlbXB0eSAqLwotCXwJcGhkcl9saXN0IHBoZHIKLQk7Ci0KLXBoZHI6Ci0JCU5BTUUgeyBsZGxleF9leHByZXNzaW9uICgpOyB9Ci0JCSAgcGhkcl90eXBlIHBoZHJfcXVhbGlmaWVycyB7IGxkbGV4X3BvcHN0YXRlICgpOyB9Ci0JCSAgJzsnCi0JCXsKLQkJICBsYW5nX25ld19waGRyICgkMSwgJDMsICQ0LmZpbGVoZHIsICQ0LnBoZHJzLCAkNC5hdCwKLQkJCQkgJDQuZmxhZ3MpOwotCQl9Ci0JOwotCi1waGRyX3R5cGU6Ci0JCWV4cAotCQl7Ci0JCSAgJCQgPSAkMTsKLQotCQkgIGlmICgkMS0+dHlwZS5ub2RlX2NsYXNzID09IGV0cmVlX25hbWUKLQkJICAgICAgJiYgJDEtPnR5cGUubm9kZV9jb2RlID09IE5BTUUpCi0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKnM7Ci0JCSAgICAgIHVuc2lnbmVkIGludCBpOwotCQkgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBoZHJfdHlwZXNbXSA9Ci0JCQl7Ci0JCQkgICJQVF9OVUxMIiwgIlBUX0xPQUQiLCAiUFRfRFlOQU1JQyIsCi0JCQkgICJQVF9JTlRFUlAiLCAiUFRfTk9URSIsICJQVF9TSExJQiIsCi0JCQkgICJQVF9QSERSIgotCQkJfTsKLQotCQkgICAgICBzID0gJDEtPm5hbWUubmFtZTsKLQkJICAgICAgZm9yIChpID0gMDsKLQkJCSAgIGkgPCBzaXplb2YgcGhkcl90eXBlcyAvIHNpemVvZiBwaGRyX3R5cGVzWzBdOwotCQkJICAgaSsrKQotCQkJaWYgKHN0cmNtcCAocywgcGhkcl90eXBlc1tpXSkgPT0gMCkKLQkJCSAgewotCQkJICAgICQkID0gZXhwX2ludG9wIChpKTsKLQkJCSAgICBicmVhazsKLQkJCSAgfQotCQkgICAgfQotCQl9Ci0JOwotCi1waGRyX3F1YWxpZmllcnM6Ci0JCS8qIGVtcHR5ICovCi0JCXsKLQkJICBtZW1zZXQgKCYkJCwgMCwgc2l6ZW9mIChzdHJ1Y3QgcGhkcl9pbmZvKSk7Ci0JCX0KLQl8CU5BTUUgcGhkcl92YWwgcGhkcl9xdWFsaWZpZXJzCi0JCXsKLQkJICAkJCA9ICQzOwotCQkgIGlmIChzdHJjbXAgKCQxLCAiRklMRUhEUiIpID09IDAgJiYgJDIgPT0gTlVMTCkKLQkJICAgICQkLmZpbGVoZHIgPSB0cnVlOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAoJDEsICJQSERSUyIpID09IDAgJiYgJDIgPT0gTlVMTCkKLQkJICAgICQkLnBoZHJzID0gdHJ1ZTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKCQxLCAiRkxBR1MiKSA9PSAwICYmICQyICE9IE5VTEwpCi0JCSAgICAkJC5mbGFncyA9ICQyOwotCQkgIGVsc2UKLQkJICAgIGVpbmZvIChfKCIlWCVQOiVTOiBQSERSUyBzeW50YXggZXJyb3IgYXQgYCVzJ1xuIiksICQxKTsKLQkJfQotCXwJQVQgJygnIGV4cCAnKScgcGhkcl9xdWFsaWZpZXJzCi0JCXsKLQkJICAkJCA9ICQ1OwotCQkgICQkLmF0ID0gJDM7Ci0JCX0KLQk7Ci0KLXBoZHJfdmFsOgotCQkvKiBlbXB0eSAqLwotCQl7Ci0JCSAgJCQgPSBOVUxMOwotCQl9Ci0JfCAnKCcgZXhwICcpJwotCQl7Ci0JCSAgJCQgPSAkMjsKLQkJfQotCTsKLQotLyogVGhpcyBzeW50YXggaXMgdXNlZCB3aXRoaW4gYW4gZXh0ZXJuYWwgdmVyc2lvbiBzY3JpcHQgZmlsZS4gICovCi0KLXZlcnNpb25fc2NyaXB0X2ZpbGU6Ci0JCXsKLQkJICBsZGxleF92ZXJzaW9uX2ZpbGUgKCk7Ci0JCSAgUFVTSF9FUlJPUiAoXygiVkVSU0lPTiBzY3JpcHQiKSk7Ci0JCX0KLQkJdmVyc19ub2RlcwotCQl7Ci0JCSAgbGRsZXhfcG9wc3RhdGUgKCk7Ci0JCSAgUE9QX0VSUk9SICgpOwotCQl9Ci0JOwotCi0vKiBUaGlzIGlzIHVzZWQgd2l0aGluIGEgbm9ybWFsIGxpbmtlciBzY3JpcHQgZmlsZS4gICovCi0KLXZlcnNpb246Ci0JCXsKLQkJICBsZGxleF92ZXJzaW9uX3NjcmlwdCAoKTsKLQkJfQotCQlWRVJTSU9OSyAneycgdmVyc19ub2RlcyAnfScKLQkJewotCQkgIGxkbGV4X3BvcHN0YXRlICgpOwotCQl9Ci0JOwotCi12ZXJzX25vZGVzOgotCQl2ZXJzX25vZGUKLQl8CXZlcnNfbm9kZXMgdmVyc19ub2RlCi0JOwotCi12ZXJzX25vZGU6Ci0JCVZFUlNfVEFHICd7JyB2ZXJzX3RhZyAnfScgJzsnCi0JCXsKLQkJICBsYW5nX3JlZ2lzdGVyX3ZlcnNfbm9kZSAoJDEsICQzLCBOVUxMKTsKLQkJfQotCXwJVkVSU19UQUcgJ3snIHZlcnNfdGFnICd9JyB2ZXJkZXAgJzsnCi0JCXsKLQkJICBsYW5nX3JlZ2lzdGVyX3ZlcnNfbm9kZSAoJDEsICQzLCAkNSk7Ci0JCX0KLQk7Ci0KLXZlcmRlcDoKLQkJVkVSU19UQUcKLQkJewotCQkgICQkID0gbGFuZ19hZGRfdmVyc19kZXBlbmQgKE5VTEwsICQxKTsKLQkJfQotCXwJdmVyZGVwIFZFUlNfVEFHCi0JCXsKLQkJICAkJCA9IGxhbmdfYWRkX3ZlcnNfZGVwZW5kICgkMSwgJDIpOwotCQl9Ci0JOwotCi12ZXJzX3RhZzoKLQkJLyogZW1wdHkgKi8KLQkJewotCQkgICQkID0gbGFuZ19uZXdfdmVyc19ub2RlIChOVUxMLCBOVUxMKTsKLQkJfQotCXwJdmVyc19kZWZucyAnOycKLQkJewotCQkgICQkID0gbGFuZ19uZXdfdmVyc19ub2RlICgkMSwgTlVMTCk7Ci0JCX0KLQl8CUdMT0JBTCAnOicgdmVyc19kZWZucyAnOycKLQkJewotCQkgICQkID0gbGFuZ19uZXdfdmVyc19ub2RlICgkMywgTlVMTCk7Ci0JCX0KLQl8CUxPQ0FMICc6JyB2ZXJzX2RlZm5zICc7JwotCQl7Ci0JCSAgJCQgPSBsYW5nX25ld192ZXJzX25vZGUgKE5VTEwsICQzKTsKLQkJfQotCXwJR0xPQkFMICc6JyB2ZXJzX2RlZm5zICc7JyBMT0NBTCAnOicgdmVyc19kZWZucyAnOycKLQkJewotCQkgICQkID0gbGFuZ19uZXdfdmVyc19ub2RlICgkMywgJDcpOwotCQl9Ci0JOwotCi12ZXJzX2RlZm5zOgotCQlWRVJTX0lERU5USUZJRVIKLQkJewotCQkgICQkID0gbGFuZ19uZXdfdmVyc19yZWdleCAoTlVMTCwgJDEsIGxkZ3JhbV92ZXJzX2N1cnJlbnRfbGFuZyk7Ci0JCX0KLQl8CXZlcnNfZGVmbnMgJzsnIFZFUlNfSURFTlRJRklFUgotCQl7Ci0JCSAgJCQgPSBsYW5nX25ld192ZXJzX3JlZ2V4ICgkMSwgJDMsIGxkZ3JhbV92ZXJzX2N1cnJlbnRfbGFuZyk7Ci0JCX0KLQl8CUVYVEVSTiBOQU1FICd7JwotCQkJewotCQkJICAkPG5hbWU+JCA9IGxkZ3JhbV92ZXJzX2N1cnJlbnRfbGFuZzsKLQkJCSAgbGRncmFtX3ZlcnNfY3VycmVudF9sYW5nID0gJDI7Ci0JCQl9Ci0JCXZlcnNfZGVmbnMgJ30nCi0JCQl7Ci0JCQkgIGxkZ3JhbV92ZXJzX2N1cnJlbnRfbGFuZyA9ICQ8bmFtZT40OwotCQkJfQotCTsKLQotJSUKLXZvaWQKLXl5ZXJyb3IoYXJnKSAKLSAgICAgY29uc3QgY2hhciAqYXJnOwoteyAKLSAgaWYgKGxkZmlsZV9hc3N1bWVkX3NjcmlwdCkKLSAgICBlaW5mbyAoXygiJVA6JXM6IGZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkOyB0cmVhdGluZyBhcyBsaW5rZXIgc2NyaXB0XG4iKSwKLQkgICBsZGZpbGVfaW5wdXRfZmlsZW5hbWUpOwotICBpZiAoZXJyb3JfaW5kZXggPiAwICYmIGVycm9yX2luZGV4IDwgRVJST1JfTkFNRV9NQVgpCi0gICAgIGVpbmZvICgiJVAlRjolUzogJXMgaW4gJXNcbiIsIGFyZywgZXJyb3JfbmFtZXNbZXJyb3JfaW5kZXgtMV0pOwotICBlbHNlCi0gICAgIGVpbmZvICgiJVAlRjolUzogJXNcbiIsIGFyZyk7Ci19CmRpZmYgLS1naXQgYS9sZC9sZGludC50ZXhpbmZvIGIvbGQvbGRpbnQudGV4aW5mbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlYTc4OC4uMDAwMDAwMAotLS0gYS9sZC9sZGludC50ZXhpbmZvCisrKyAvZGV2L251bGwKQEAgLTEsNTY0ICswLDAgQEAKLVxpbnB1dCB0ZXhpbmZvCi1Ac2V0ZmlsZW5hbWUgbGRpbnQuaW5mbwotCi1AaWZpbmZvCi1AZm9ybWF0Ci1TVEFSVC1JTkZPLURJUi1FTlRSWQotKiBMZC1JbnRlcm5hbHM6IChsZGludCkuCVRoZSBHTlUgbGlua2VyIGludGVybmFscy4KLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi0KLUBpZmluZm8KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGludGVybmFscyBvZiB0aGUgR05VIGxpbmtlciBsZC4KLQotQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1Db250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZXggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgotCi1AZW5kIGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgb3IgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgKGZvciB3aGljaCBwdXJwb3NlIHRoaXMgdGV4dCBtYXkgYmUKLXJlZ2FyZGVkIGFzIGEgcHJvZ3JhbSBpbiB0aGUgbGFuZ3VhZ2UgVGVYKS4KLUBlbmQgaWZpbmZvCi0KLUBpZnRleAotQGZpbmFsb3V0Ci1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2ZmCi1Ac2V0dGl0bGUgR05VIExpbmtlciBJbnRlcm5hbHMKLUB0aXRsZXBhZ2UKLUB0aXRsZXtBIGd1aWRlIHRvIHRoZSBpbnRlcm5hbHMgb2YgdGhlIEdOVSBsaW5rZXJ9Ci1AYXV0aG9yIFBlciBCb3RobmVyLCBTdGV2ZSBDaGFtYmVybGFpbiwgSWFuIExhbmNlIFRheWxvciwgREogRGVsb3JpZQotQGF1dGhvciBDeWdudXMgU3VwcG9ydAotQHBhZ2UKLQotQHRleAotXGRlZlwkIzEke3sjMX19ICAlIEtsdWdlOiBjb2xsZWN0IFJDUyByZXZpc2lvbiBpbmZvIHdpdGhvdXQgJC4uLiQKLVx4ZGVmXG1hbnZlcnN7XCRSZXZpc2lvbiR9ICAlIEZvciB1c2UgaW4gaGVhZGVycywgZm9vdGVycyB0b28KLXtccGFyc2tpcD0wcHQKLVxoZmlsbCBDeWdudXMgU3VwcG9ydFxwYXIKLVxoZmlsbCBcbWFudmVyc1xwYXIKLVxoZmlsbCBcVGVYe31pbmZvIFx0ZXhpbmZvdmVyc2lvblxwYXIKLX0KLUBlbmQgdGV4Ci0KLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AZW5kIHRpdGxlcGFnZQotQGVuZCBpZnRleAotCi1Abm9kZSBUb3AKLUB0b3AKLQotVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgaW50ZXJuYWxzIG9mIHRoZSBHTlUgbGlua2VyIEBjb2Rle2xkfS4gIEl0IGlzIGEKLWNvbGxlY3Rpb24gb2YgbWlzY2VsbGFuZW91cyBpbmZvcm1hdGlvbiB3aXRoIGxpdHRsZSBmb3JtIGF0IHRoaXMgcG9pbnQuCi1Nb3N0bHksIGl0IGlzIGEgcmVwb3NpdG9yeSBpbnRvIHdoaWNoIHlvdSBjYW4gcHV0IGluZm9ybWF0aW9uIGFib3V0Ci1HTlUgQGNvZGV7bGR9IGFzIHlvdSBkaXNjb3ZlciBpdCAob3IgYXMgeW91IGRlc2lnbiBjaGFuZ2VzIHRvIEBjb2Rle2xkfSkuCi0KLUBtZW51Ci0qIFJFQURNRTo6CQkJVGhlIFJFQURNRSBGaWxlCi0qIEVtdWxhdGlvbnM6OgkJCUhvdyBsaW5rZXIgZW11bGF0aW9ucyBhcmUgZ2VuZXJhdGVkCi0qIEVtdWxhdGlvbiBXYWxrdGhyb3VnaDo6CUEgV2Fsa3Rocm91Z2ggb2YgYSBUeXBpY2FsIEVtdWxhdGlvbgotQGVuZCBtZW51Ci0KLUBub2RlIFJFQURNRQotQGNoYXB0ZXIgVGhlIEBmaWxle1JFQURNRX0gRmlsZQotCi1DaGVjayB0aGUgQGZpbGV7UkVBRE1FfSBmaWxlOyBpdCBvZnRlbiBoYXMgdXNlZnVsIGluZm9ybWF0aW9uIHRoYXQgZG9lcyBub3QKLWFwcGVhciBhbnl3aGVyZSBlbHNlIGluIHRoZSBkaXJlY3RvcnkuCi0KLUBub2RlIEVtdWxhdGlvbnMKLUBjaGFwdGVyIEhvdyBsaW5rZXIgZW11bGF0aW9ucyBhcmUgZ2VuZXJhdGVkCi0KLUVhY2ggbGlua2VyIHRhcmdldCBoYXMgYW4gQGRmbntlbXVsYXRpb259LiAgVGhlIGVtdWxhdGlvbiBpbmNsdWRlcyB0aGUKLWRlZmF1bHQgbGlua2VyIHNjcmlwdCwgYW5kIGNlcnRhaW4gZW11bGF0aW9ucyBhbHNvIG1vZGlmeSBjZXJ0YWluIHR5cGVzCi1vZiBsaW5rZXIgYmVoYXZpb3VyLgotCi1FbXVsYXRpb25zIGFyZSBjcmVhdGVkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2VzcyBieSB0aGUgc2hlbGwgc2NyaXB0Ci1AZmlsZXtnZW5zY3JpcHRzLnNofS4KLQotVGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCBzdGFydHMgYnkgcmVhZGluZyBhIGZpbGUgaW4gdGhlCi1AZmlsZXtlbXVscGFyYW1zfSBkaXJlY3RvcnkuICBUaGlzIGlzIGEgc2hlbGwgc2NyaXB0IHdoaWNoIHNldHMgdmFyaW91cwotc2hlbGwgdmFyaWFibGVzIHVzZWQgYnkgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gYW5kIHRoZSBvdGhlciBzaGVsbCBzY3JpcHRzCi1pdCBpbnZva2VzLgotCi1UaGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHdpbGwgaW52b2tlIGEgc2hlbGwgc2NyaXB0IGluIHRoZQotQGZpbGV7c2NyaXB0dGVtcGx9IGRpcmVjdG9yeSBpbiBvcmRlciB0byBjcmVhdGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0cwotd3JpdHRlbiBpbiB0aGUgbGlua2VyIGNvbW1hbmQgbGFuZ3VhZ2UuICBUaGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdAotd2lsbCBiZSBpbnZva2VkIDUgKG9yLCBpbiBzb21lIGNhc2VzLCA2KSB0aW1lcywgd2l0aCBkaWZmZXJlbnQKLWFzc2lnbm1lbnRzIHRvIHNoZWxsIHZhcmlhYmxlcywgdG8gY3JlYXRlIGRpZmZlcmVudCBkZWZhdWx0IHNjcmlwdHMuCi1UaGUgY2hvaWNlIG9mIHNjcmlwdCBpcyBtYWRlIGJhc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLQotQWZ0ZXIgY3JlYXRpbmcgdGhlIHNjcmlwdHMsIEBmaWxle2dlbnNjcmlwdHMuc2h9IHdpbGwgaW52b2tlIHlldCBhbm90aGVyCi1zaGVsbCBzY3JpcHQsIHRoaXMgdGltZSBpbiB0aGUgQGZpbGV7ZW11bHRlbXBsfSBkaXJlY3RvcnkuICBUaGF0IHNoZWxsCi1zY3JpcHQgd2lsbCBjcmVhdGUgdGhlIGVtdWxhdGlvbiBzb3VyY2UgZmlsZSwgd2hpY2ggY29udGFpbnMgQyBjb2RlLgotVGhpcyBDIGNvZGUgcGVybWl0cyB0aGUgbGlua2VyIGVtdWxhdGlvbiB0byBvdmVycmlkZSB2YXJpb3VzIGxpbmtlcgotYmVoYXZpb3Vycy4gIE1vc3QgdGFyZ2V0cyB1c2UgdGhlIGdlbmVyaWMgZW11bGF0aW9uIGNvZGUsIHdoaWNoIGlzIGluCi1AZmlsZXtlbXVsdGVtcGwvZ2VuZXJpYy5lbX0uCi0KLVRvIHN1bW1hcml6ZSwgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gcmVhZHMgdGhyZWUgc2hlbGwgc2NyaXB0czogYW4KLWVtdWxhdGlvbiBwYXJhbWV0ZXJzIHNjcmlwdCBpbiB0aGUgQGZpbGV7ZW11bHBhcmFtc30gZGlyZWN0b3J5LCBhIGxpbmtlcgotc2NyaXB0IGdlbmVyYXRpb24gc2NyaXB0IGluIHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gZGlyZWN0b3J5LCBhbmQgYW4KLWVtdWxhdGlvbiBzb3VyY2UgZmlsZSBnZW5lcmF0aW9uIHNjcmlwdCBpbiB0aGUgQGZpbGV7ZW11bHRlbXBsfQotZGlyZWN0b3J5LgotCi1Gb3IgZXhhbXBsZSwgdGhlIFN1biA0IGxpbmtlciBzZXRzIHVwIHZhcmlhYmxlcyBpbgotQGZpbGV7ZW11bHBhcmFtcy9zdW40LnNofSwgY3JlYXRlcyBsaW5rZXIgc2NyaXB0cyB1c2luZwotQGZpbGV7c2NyaXB0dGVtcGwvYW91dC5zY30sIGFuZCBjcmVhdGVzIHRoZSBlbXVsYXRpb24gY29kZSB1c2luZwotQGZpbGV7ZW11bHRlbXBsL3N1bm9zLmVtfS4KLQotTm90ZSB0aGF0IHRoZSBsaW5rZXIgY2FuIHN1cHBvcnQgc2V2ZXJhbCBlbXVsYXRpb25zIHNpbXVsdGFuZW91c2x5LAotZGVwZW5kaW5nIHVwb24gaG93IGl0IGlzIGNvbmZpZ3VyZWQuICBBbiBlbXVsYXRpb24gY2FuIGJlIHNlbGVjdGVkIHdpdGgKLXRoZSBAY29kZXstbX0gb3B0aW9uLiAgVGhlIEBjb2Rley1WfSBvcHRpb24gd2lsbCBsaXN0IGFsbCBzdXBwb3J0ZWQKLWVtdWxhdGlvbnMuCi0KLUBtZW51Ci0qIGVtdWxhdGlvbiBwYXJhbWV0ZXJzOjogICAgICAgIEBmaWxle2VtdWxwYXJhbXN9IHNjcmlwdHMKLSogbGlua2VyIHNjcmlwdHM6OiAgICAgICAgICAgICAgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdHMKLSogbGlua2VyIGVtdWxhdGlvbnM6OiAgICAgICAgICAgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHRzCi1AZW5kIG1lbnUKLQotQG5vZGUgZW11bGF0aW9uIHBhcmFtZXRlcnMKLUBzZWN0aW9uIEBmaWxle2VtdWxwYXJhbXN9IHNjcmlwdHMKLQotRWFjaCB0YXJnZXQgc2VsZWN0cyBhIHBhcnRpY3VsYXIgZmlsZSBpbiB0aGUgQGZpbGV7ZW11bHBhcmFtc30gZGlyZWN0b3J5Ci1ieSBzZXR0aW5nIHRoZSBzaGVsbCB2YXJpYWJsZSBAY29kZXt0YXJnX2VtdWx9IGluIEBmaWxle2NvbmZpZ3VyZS50Z3R9LgotVGhpcyBzaGVsbCB2YXJpYWJsZSBpcyB1c2VkIGJ5IHRoZSBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCB0byBjb250cm9sCi1idWlsZGluZyBhbiBlbXVsYXRpb24gc291cmNlIGZpbGUuCi0KLUNlcnRhaW4gY29udmVudGlvbnMgYXJlIGVuZm9yY2VkLiAgU3VwcG9zZSB0aGUgQGNvZGV7dGFyZ19lbXVsfSB2YXJpYWJsZQotaXMgc2V0IHRvIEB2YXJ7ZW11bH0gaW4gQGZpbGV7Y29uZmlndXJlLnRndH0uICBUaGUgbmFtZSBvZiB0aGUgZW11bGF0aW9uCi1zaGVsbCBzY3JpcHQgd2lsbCBiZSBAZmlsZXtlbXVscGFyYW1zL0B2YXJ7ZW11bH0uc2h9LiAgVGhlCi1AZmlsZXtNYWtlZmlsZX0gbXVzdCBoYXZlIGEgdGFyZ2V0IG5hbWVkIEBmaWxle2VAdmFye2VtdWx9LmN9OyB0aGlzCi10YXJnZXQgbXVzdCBkZXBlbmQgdXBvbiBAZmlsZXtlbXVscGFyYW1zL0B2YXJ7ZW11bH0uc2h9LCBhcyB3ZWxsIGFzIHRoZQotYXBwcm9wcmlhdGUgc2NyaXB0cyBpbiB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IGFuZCBAZmlsZXtlbXVsdGVtcGx9Ci1kaXJlY3Rvcmllcy4gIFRoZSBAZmlsZXtNYWtlZmlsZX0gdGFyZ2V0IG11c3QgaW52b2tlIEBjb2Rle0dFTlNDUklQVFN9Ci13aXRoIHR3byBhcmd1bWVudHM6IEB2YXJ7ZW11bH0sIGFuZCB0aGUgdmFsdWUgb2YgdGhlIG1ha2UgdmFyaWFibGUKLUBjb2Rle3RkaXJfQHZhcntlbXVsfX0uICBUaGUgdmFsdWUgb2YgdGhlIGxhdHRlciB2YXJpYWJsZSB3aWxsIGJlIHNldCBieQotdGhlIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0LCBhbmQgaXMgdXNlZCB0byBzZXQgdGhlIGRlZmF1bHQgdGFyZ2V0Ci1kaXJlY3RvcnkgdG8gc2VhcmNoLgotCi1CeSBjb252ZW50aW9uLCB0aGUgQGZpbGV7ZW11bHBhcmFtcy9AdmFye2VtdWx9LnNofSBzaGVsbCBzY3JpcHQgc2hvdWxkCi1vbmx5IHNldCBzaGVsbCB2YXJpYWJsZXMuICBJdCBtYXkgc2V0IHNoZWxsIHZhcmlhYmxlcyB3aGljaCBhcmUgdG8gYmUKLWludGVycHJldGVkIGJ5IHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gYW5kIHRoZSBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdHMuCi1DZXJ0YWluIHNoZWxsIHZhcmlhYmxlcyBhcmUgaW50ZXJwcmV0ZWQgZGlyZWN0bHkgYnkgdGhlCi1AZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQuCi0KLUhlcmUgaXMgYSBsaXN0IG9mIHNoZWxsIHZhcmlhYmxlcyBpbnRlcnByZXRlZCBieSBAZmlsZXtnZW5zY3JpcHRzLnNofSwKLWFzIHdlbGwgYXMgc29tZSBjb252ZW50aW9uYWwgc2hlbGwgdmFyaWFibGVzIGludGVycHJldGVkIGJ5IHRoZQotQGZpbGV7c2NyaXB0dGVtcGx9IGFuZCBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdHMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gU0NSSVBUX05BTUUKLVRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgdG8gdXNlLiAgSWYKLUBjb2Rle1NDUklQVF9OQU1FfSBpcyBzZXQgdG8gQHZhcntzY3JpcHR9LCBAZmlsZXtnZW5zY3JpcHRzLnNofSB3aWxsIHVzZQotdGhlIHNjcmlwdCBAZmlsZXtzY3JpcHR0ZW1sL0B2YXJ7c2NyaXB0fS5zY30uCi0KLUBpdGVtIFRFTVBMQVRFX05BTUUKLVRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIEBmaWxle2VtdWx0ZW1scH0gc2NyaXB0IHRvIHVzZS4gIElmCi1AY29kZXtURU1QTEFURV9OQU1FfSBpcyBzZXQgdG8gQHZhcnt0ZW1wbGF0ZX0sIEBmaWxle2dlbnNjcmlwdHMuc2h9IHdpbGwKLXVzZSB0aGUgc2NyaXB0IEBmaWxle2VtdWx0ZW1wbC9AdmFye3RlbXBsYXRlfS5lbX0uICBJZiB0aGlzIHZhcmlhYmxlIGlzCi1ub3Qgc2V0LCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBAc2FtcHtnZW5lcmljfS4KLQotQGl0ZW0gR0VORVJBVEVfU0hMSUJfU0NSSVBUCi1JZiB0aGlzIGlzIHNldCB0byBhIG5vbmVtcHR5IHN0cmluZywgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gd2lsbCBpbnZva2UKLXRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IGFuIGV4dHJhIHRpbWUgdG8gY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkKLXNjcmlwdC4gIEByZWZ7bGlua2VyIHNjcmlwdHN9LgotCi1AaXRlbSBPVVRQVVRfRk9STUFUCi1UaGlzIGlzIG5vcm1hbGx5IHNldCB0byBpbmRpY2F0ZSB0aGUgQkZEIG91dHB1dCBmb3JtYXQgdXNlIChlLmcuLAotQHNhbXB7ImEub3V0LXN1bm9zLWJpZyJ9LiAgVGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgd2lsbCBub3JtYWxseQotdXNlIGl0IGluIGFuIEBjb2Rle09VVFBVVF9GT1JNQVR9IGV4cHJlc3Npb24gaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0KLUBpdGVtIEFSQ0gKLVRoaXMgaXMgbm9ybWFsbHkgc2V0IHRvIGluZGljYXRlIHRoZSBhcmNoaXRlY3R1cmUgdG8gdXNlIChlLmcuLAotQHNhbXB7c3BhcmN9KS4gIFRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IHdpbGwgbm9ybWFsbHkgdXNlIGl0IGluIGFuCi1AY29kZXtPVVRQVVRfQVJDSH0gZXhwcmVzc2lvbiBpbiB0aGUgbGlua2VyIHNjcmlwdC4KLQotQGl0ZW0gRU5UUlkKLVNvbWUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdHMgdXNlIHRoaXMgdG8gc2V0IHRoZSBlbnRyeSBhZGRyZXNzLCBpbiBhbgotQGNvZGV7RU5UUll9IGV4cHJlc3Npb24gaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0KLUBpdGVtIFRFWFRfU1RBUlRfQUREUgotU29tZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0cyB1c2UgdGhpcyB0byBzZXQgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlCi1Ac2FtcHsudGV4dH0gc2VjdGlvbi4KLQotQGl0ZW0gTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSCi1JZiB0aGlzIGlzIGRlZmluZWQsIHRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgc2V0cwotQGNvZGV7VEVYVF9TVEFSVF9BRERSfSB0byBpdHMgdmFsdWUgYmVmb3JlIHJ1bm5pbmcgdGhlCi1AZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IGZvciB0aGUgQGNvZGV7LW59IGFuZCBAY29kZXstTn0gb3B0aW9ucwotKEBweHJlZntsaW5rZXIgc2NyaXB0c30pLgotCi1AaXRlbSBTRUdNRU5UX1NJWkUKLVRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgdXNlcyB0aGlzIHRvIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZgotQGNvZGV7REFUQV9BTElHTk1FTlR9IHdoZW4gcnVubmluZyB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdC4KLQotQGl0ZW0gVEFSR0VUX1BBR0VfU0laRQotSWYgQGNvZGV7U0VHTUVOVF9TSVpFfSBpcyBub3QgZGVmaW5lZCwgdGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdAotdXNlcyB0aGlzIHRvIGRlZmluZSBpdC4KLQotQGl0ZW0gQUxJR05NRU5UCi1Tb21lIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHRzIHNldCB0aGlzIHRvIGEgbnVtYmVyIHRvIHBhc3MgdG8KLUBjb2Rle0FMSUdOfSB0byBzZXQgdGhlIHJlcXVpcmVkIGFsaWdubWVudCBmb3IgdGhlIEBjb2Rle2VuZH0gc3ltYm9sLgotQGVuZCB0YWJsZQotCi1Abm9kZSBsaW5rZXIgc2NyaXB0cwotQHNlY3Rpb24gQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdHMKLQotRWFjaCBsaW5rZXIgdGFyZ2V0IHVzZXMgYSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IHRvIGdlbmVyYXRlIHRoZQotZGVmYXVsdCBsaW5rZXIgc2NyaXB0cy4gIFRoZSBuYW1lIG9mIHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IGlzCi1zZXQgYnkgdGhlIEBjb2Rle1NDUklQVF9OQU1FfSB2YXJpYWJsZSBpbiB0aGUgQGZpbGV7ZW11bHBhcmFtc30gc2NyaXB0LgotSWYgQGNvZGV7U0NSSVBUX05BTUV9IGlzIHNldCB0byBAdmFye3NjcmlwdH0sIEBjb2Rle2dlbnNjcmlwdHMuc2h9IHdpbGwKLWludm9rZSBAZmlsZXtzY3JpcHR0ZW1wbC9AdmFye3NjcmlwdH0uc2N9LgotCi1UaGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHdpbGwgaW52b2tlIHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0KLXNjcmlwdCA1IG9yIDYgdGltZXMuICBFYWNoIHRpbWUgaXQgd2lsbCBzZXQgdGhlIHNoZWxsIHZhcmlhYmxlCi1AY29kZXtMRF9GTEFHfSB0byBhIGRpZmZlcmVudCB2YWx1ZS4gIFdoZW4gdGhlIGxpbmtlciBpcyBydW4sIHRoZQotb3B0aW9ucyB1c2VkIHdpbGwgZGlyZWN0IGl0IHRvIHNlbGVjdCBhIHBhcnRpY3VsYXIgc2NyaXB0LiAgKFNjcmlwdAotc2VsZWN0aW9uIGlzIGNvbnRyb2xsZWQgYnkgdGhlIEBjb2Rle2dldF9zY3JpcHR9IGVtdWxhdGlvbiBlbnRyeSBwb2ludDsKLXRoaXMgZGVzY3JpYmVzIHRoZSBjb252ZW50aW9uYWwgYmVoYXZpb3VyKS4KLQotVGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgc2hvdWxkIGp1c3Qgd3JpdGUgYSBsaW5rZXIgc2NyaXB0LCB3cml0dGVuCi1pbiB0aGUgbGlua2VyIGNvbW1hbmQgbGFuZ3VhZ2UsIHRvIHN0YW5kYXJkIG91dHB1dC4gIElmIHRoZSBlbXVsYXRpb24KLW5hbWUtLXRoZSBuYW1lIG9mIHRoZSBAZmlsZXtlbXVscGFyYW1zfSBmaWxlIHdpdGhvdXQgdGhlIEBmaWxley5zY30KLWV4dGVuc2lvbi0taXMgQHZhcntlbXVsfSwgdGhlbiB0aGUgb3V0cHV0IHdpbGwgYmUgZGlyZWN0ZWQgdG8KLUBmaWxle2xkc2NyaXB0cy9AdmFye2VtdWx9LkB2YXJ7ZXh0ZW5zaW9ufX0gaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSwKLXdoZXJlIEB2YXJ7ZXh0ZW5zaW9ufSBjaGFuZ2VzIGVhY2ggdGltZSB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCBpcwotaW52b2tlZC4KLQotSGVyZSBpcyB0aGUgbGlzdCBvZiB2YWx1ZXMgYXNzaWduZWQgdG8gQGNvZGV7TERfRkxBR30uCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gKGVtcHR5KQotVGhlIHNjcmlwdCBnZW5lcmF0ZWQgaXMgdXNlZCBieSBkZWZhdWx0ICh3aGVuIG5vbmUgb2YgdGhlIGZvbGxvd2luZwotY2FzZXMgYXBwbHkpLiAgVGhlIG91dHB1dCBoYXMgYW4gZXh0ZW5zaW9uIG9mIEBmaWxley54fS4KLUBpdGVtIG4KLVRoZSBzY3JpcHQgZ2VuZXJhdGVkIGlzIHVzZWQgd2hlbiB0aGUgbGlua2VyIGlzIGludm9rZWQgd2l0aCB0aGUKLUBjb2Rley1ufSBvcHRpb24uICBUaGUgb3V0cHV0IGhhcyBhbiBleHRlbnNpb24gb2YgQGZpbGV7LnhufS4KLUBpdGVtIE4KLVRoZSBzY3JpcHQgZ2VuZXJhdGVkIGlzIHVzZWQgd2hlbiB0aGUgbGlua2VyIGlzIGludm9rZWQgd2l0aCB0aGUKLUBjb2Rley1OfSBvcHRpb24uICBUaGUgb3V0cHV0IGhhcyBhbiBleHRlbnNpb24gb2YgQGZpbGV7Lnhibn0uCi1AaXRlbSByCi1UaGUgc2NyaXB0IGdlbmVyYXRlZCBpcyB1c2VkIHdoZW4gdGhlIGxpbmtlciBpcyBpbnZva2VkIHdpdGggdGhlCi1AY29kZXstcn0gb3B0aW9uLiAgVGhlIG91dHB1dCBoYXMgYW4gZXh0ZW5zaW9uIG9mIEBmaWxley54cn0uCi1AaXRlbSB1Ci1UaGUgc2NyaXB0IGdlbmVyYXRlZCBpcyB1c2VkIHdoZW4gdGhlIGxpbmtlciBpcyBpbnZva2VkIHdpdGggdGhlCi1AY29kZXstVXJ9IG9wdGlvbi4gIFRoZSBvdXRwdXQgaGFzIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsueHV9LgotQGl0ZW0gc2hhcmVkCi1UaGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCBpcyBvbmx5IGludm9rZWQgd2l0aCBAY29kZXtMRF9GTEFHfSBzZXQgdG8KLXRoaXMgdmFsdWUgaWYgQGNvZGV7R0VORVJBVEVfU0hMSUJfU0NSSVBUfSBpcyBkZWZpbmVkIGluIHRoZQotQGZpbGV7ZW11bHBhcmFtc30gZmlsZS4gIFRoZSBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCBtdXN0IGFycmFuZ2UgdG8gdXNlCi10aGlzIHNjcmlwdCBhdCB0aGUgYXBwcm9wcmlhdGUgdGltZSwgbm9ybWFsbHkgd2hlbiB0aGUgbGlua2VyIGlzIGludm9rZWQKLXdpdGggdGhlIEBjb2Rley1zaGFyZWR9IG9wdGlvbi4gIFRoZSBvdXRwdXQgaGFzIGFuIGV4dGVuc2lvbiBvZgotQGZpbGV7LnhzfS4KLUBlbmQgdGFibGUKLQotQmVzaWRlcyB0aGUgc2hlbGwgdmFyaWFibGVzIHNldCBieSB0aGUgQGZpbGV7ZW11bHBhcmFtc30gc2NyaXB0LCBhbmQgdGhlCi1AY29kZXtMRF9GTEFHfSB2YXJpYWJsZSwgdGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCB3aWxsIHNldAotY2VydGFpbiB2YXJpYWJsZXMgZm9yIGVhY2ggcnVuIG9mIHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIFJFTE9DQVRJTkcKLVRoaXMgd2lsbCBiZSBzZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nIHdoZW4gdGhlIGxpbmtlciBpcyBkb2luZyBhIGZpbmFsCi1yZWxvY2F0aW9uIChlLmcuLCBhbGwgc2NyaXB0cyBvdGhlciB0aGFuIEBjb2Rley1yfSBhbmQgQGNvZGV7LVVyfSkuCi0KLUBpdGVtIENPTlNUUlVDVElORwotVGhpcyB3aWxsIGJlIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgd2hlbiB0aGUgbGlua2VyIGlzIGJ1aWxkaW5nCi1nbG9iYWwgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgdGFibGVzIChlLmcuLCBhbGwgc2NyaXB0cyBvdGhlciB0aGFuCi1AY29kZXstcn0pLgotCi1AaXRlbSBEQVRBX0FMSUdOTUVOVAotVGhpcyB3aWxsIGJlIHNldCB0byBhbiBAY29kZXtBTElHTn0gZXhwcmVzc2lvbiB3aGVuIHRoZSBvdXRwdXQgc2hvdWxkIGJlCi1wYWdlIGFsaWduZWQsIG9yIHRvIEBzYW1wey59IHdoZW4gZ2VuZXJhdGluZyB0aGUgQGNvZGV7LU59IHNjcmlwdC4KLQotQGl0ZW0gQ1JFQVRFX1NITElCCi1UaGlzIHdpbGwgYmUgc2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIGdlbmVyYXRpbmcgYSBAY29kZXstc2hhcmVkfQotc2NyaXB0LgotQGVuZCB0YWJsZQotCi1UaGUgY29udmVudGlvbmFsIHdheSB0byB3cml0ZSBhIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgaXMgdG8gZmlyc3QKLXNldCBhIGZldyBzaGVsbCB2YXJpYWJsZXMsIGFuZCB0aGVuIHdyaXRlIG91dCBhIGxpbmtlciBzY3JpcHQgdXNpbmcKLUBjb2Rle2NhdH0gd2l0aCBhIGhlcmUgZG9jdW1lbnQuICBUaGUgbGlua2VyIHNjcmlwdCB3aWxsIHVzZSB2YXJpYWJsZQotc3Vic3RpdHV0aW9ucywgYmFzZWQgb24gdGhlIGFib3ZlIHZhcmlhYmxlcyBhbmQgdGhvc2Ugc2V0IGluIHRoZQotQGZpbGV7ZW11bHBhcmFtc30gc2NyaXB0LCB0byBjb250cm9sIGl0cyBiZWhhdmlvdXIuCi0KLVdoZW4gdGhlcmUgYXJlIHBhcnRzIG9mIHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IHdoaWNoIHNob3VsZCBvbmx5Ci1iZSBydW4gd2hlbiBkb2luZyBhIGZpbmFsIHJlbG9jYXRpb24sIHRoZXkgc2hvdWxkIGJlIGVuY2xvc2VkIHdpdGhpbiBhCi12YXJpYWJsZSBzdWJzdGl0dXRpb24gYmFzZWQgb24gQGNvZGV7UkVMT0NBVElOR30uICBGb3IgZXhhbXBsZSwgb24gbWFueQotdGFyZ2V0cyBzcGVjaWFsIHN5bWJvbHMgc3VjaCBhcyBAY29kZXtfZW5kfSBzaG91bGQgYmUgZGVmaW5lZCB3aGVuIGRvaW5nCi1hIGZpbmFsIGxpbmsuICBOYXR1cmFsbHksIHRob3NlIHN5bWJvbHMgc2hvdWxkIG5vdCBiZSBkZWZpbmVkIHdoZW4gZG9pbmcKLWEgcmVsb2NhdGVhYmxlIGxpbmsgdXNpbmcgQGNvZGV7LXJ9LiAgVGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQKLWNvdWxkIHVzZSBhIGNvbnN0cnVjdCBsaWtlIHRoaXMgdG8gZGVmaW5lIHRob3NlIHN5bWJvbHM6Ci1Ac21hbGxleGFtcGxlCi0gICRAe1JFTE9DQVRJTkcrIF9lbmQgPSAuO0B9Ci1AZW5kIHNtYWxsZXhhbXBsZQotVGhpcyB3aWxsIGRvIHRoZSBzeW1ib2wgYXNzaWdubWVudCBvbmx5IGlmIHRoZSBAY29kZXtSRUxPQ0FUSU5HfQotdmFyaWFibGUgaXMgZGVmaW5lZC4KLQotVGhlIGJhc2ljIGpvYiBvZiB0aGUgbGlua2VyIHNjcmlwdCBpcyB0byBwdXQgdGhlIHNlY3Rpb25zIGluIHRoZSBjb3JyZWN0Ci1vcmRlciwgYW5kIGF0IHRoZSBjb3JyZWN0IG1lbW9yeSBhZGRyZXNzZXMuICBGb3Igc29tZSB0YXJnZXRzLCB0aGUKLWxpbmtlciBzY3JpcHQgbWF5IGhhdmUgdG8gZG8gc29tZSBvdGhlciBvcGVyYXRpb25zLgotCi1Gb3IgZXhhbXBsZSwgb24gbW9zdCBNSVBTIHBsYXRmb3JtcywgdGhlIGxpbmtlciBpcyByZXNwb25zaWJsZSBmb3IKLWRlZmluaW5nIHRoZSBzcGVjaWFsIHN5bWJvbCBAY29kZXtfZ3B9LCB1c2VkIHRvIGluaXRpYWxpemUgdGhlCi1AY29kZXskZ3B9IHJlZ2lzdGVyLiAgSXQgbXVzdCBiZSBzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzbWFsbCBkYXRhCi1zZWN0aW9uIHBsdXMgQGNvZGV7MHg4MDAwfS4gIE5hdHVyYWxseSwgaXQgc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCB3aGVuCi1kb2luZyBhIGZpbmFsIHJlbG9jYXRpb24uICBUaGlzIHdpbGwgdHlwaWNhbGx5IGJlIGRvbmUgbGlrZSB0aGlzOgotQHNtYWxsZXhhbXBsZQotICAkQHtSRUxPQ0FUSU5HKyBfZ3AgPSBBTElHTigxNikgKyAweDgwMDA7QH0KLUBlbmQgc21hbGxleGFtcGxlCi1UaGlzIGxpbmUgd291bGQgYXBwZWFyIGp1c3QgYmVmb3JlIHRoZSBzZWN0aW9ucyB3aGljaCBjb21wb3NlIHRoZSBzbWFsbAotZGF0YSBzZWN0aW9uIChAc2FtcHsuc2RhdGF9LCBAc2FtcHsuc2Jzc30pLiAgQWxsIHRob3NlIHNlY3Rpb25zIHdvdWxkIGJlCi1jb250aWd1b3VzIGluIG1lbW9yeS4KLQotTWFueSBDT0ZGIHN5c3RlbXMgYnVpbGQgY29uc3RydWN0b3IgdGFibGVzIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgVGhlCi1jb21waWxlciB3aWxsIGFycmFuZ2UgdG8gb3V0cHV0IHRoZSBhZGRyZXNzIG9mIGVhY2ggZ2xvYmFsIGNvbnN0cnVjdG9yCi1pbiBhIEBzYW1wey5jdG9yfSBzZWN0aW9uLCBhbmQgdGhlIGFkZHJlc3Mgb2YgZWFjaCBnbG9iYWwgZGVzdHJ1Y3RvciBpbgotYSBAc2FtcHsuZHRvcn0gc2VjdGlvbiAodGhpcyBpcyBkb25lIGJ5IGRlZmluaW5nCi1AY29kZXtBU01fT1VUUFVUX0NPTlNUUlVDVE9SfSBhbmQgQGNvZGV7QVNNX09VVFBVVF9ERVNUUlVDVE9SfSBpbiB0aGUKLUBjb2Rle2djY30gY29uZmlndXJhdGlvbiBmaWxlcykuICBUaGUgQGNvZGV7Z2NjfSBydW50aW1lIHN1cHBvcnQKLXJvdXRpbmVzIGV4cGVjdCB0aGUgY29uc3RydWN0b3IgdGFibGUgdG8gYmUgbmFtZWQgQGNvZGV7X19DVE9SX0xJU1RfX30uCi1UaGV5IGV4cGVjdCBpdCB0byBiZSBhIGxpc3Qgb2Ygd29yZHMsIHdpdGggdGhlIGZpcnN0IHdvcmQgYmVpbmcgdGhlCi1jb3VudCBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMuICBUaGVyZSBzaG91bGQgYmUgYSB0cmFpbGluZyB6ZXJvIHdvcmQuCi0oQWN0dWFsbHksIHRoZSBjb3VudCBtYXkgYmUgLTEgaWYgdGhlIHRyYWlsaW5nIHdvcmQgaXMgcHJlc2VudCwgYW5kIHRoZQotdHJhaWxpbmcgd29yZCBtYXkgYmUgb21pdHRlZCBpZiB0aGUgY291bnQgaXMgY29ycmVjdCwgYnV0LCBhcyB0aGUKLUBjb2Rle2djY30gYmVoYXZpb3VyIGhhcyBjaGFuZ2VkIHNsaWdodGx5IG92ZXIgdGhlIHllYXJzLCBpdCBpcyBzYWZlc3QKLXRvIHByb3ZpZGUgYm90aCkuICBIZXJlIGlzIGEgdHlwaWNhbCB3YXkgdGhhdCBtaWdodCBiZSBoYW5kbGVkIGluIGEKLUBmaWxle3NjcmlwdHRlbXBsfSBmaWxlLgotQHNtYWxsZXhhbXBsZQotICAgICRAe0NPTlNUUlVDVElORysgX19DVE9SX0xJU1RfXyA9IC47QH0KLSAgICAkQHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fQ1RPUl9FTkRfXyAtIF9fQ1RPUl9MSVNUX18pIC8gNCAtIDIpQH0KLSAgICAkQHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKUB9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyBMT05HKDApQH0KLSAgICAkQHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9FTkRfXyA9IC47QH0KLSAgICAkQHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9MSVNUX18gPSAuO0B9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyBMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKUB9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycylAfQotICAgICRAe0NPTlNUUlVDVElORysgTE9ORygwKUB9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyBfX0RUT1JfRU5EX18gPSAuO0B9Ci1AZW5kIHNtYWxsZXhhbXBsZQotVGhlIHVzZSBvZiBAY29kZXtDT05TVFJVQ1RJTkd9IGVuc3VyZXMgdGhhdCB0aGVzZSBsaW5rZXIgc2NyaXB0IGNvbW1hbmRzCi13aWxsIG9ubHkgYXBwZWFyIHdoZW4gdGhlIGxpbmtlciBpcyBzdXBwb3NlZCB0byBiZSBidWlsZGluZyB0aGUKLWNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIHRhYmxlcy4gIFRoaXMgZXhhbXBsZSBpcyB3cml0dGVuIGZvciBhIHRhcmdldAotd2hpY2ggdXNlcyA0IGJ5dGUgcG9pbnRlcnMuCi0KLUVtYmVkZGVkIHN5c3RlbXMgb2Z0ZW4gbmVlZCB0byBzZXQgYSBzdGFjayBhZGRyZXNzLiAgVGhpcyBpcyBub3JtYWxseQotYmVzdCBkb25lIGJ5IHVzaW5nIHRoZSBAY29kZXtQUk9WSURFfSBjb25zdHJ1Y3Qgd2l0aCBhIGRlZmF1bHQgc3RhY2sKLWFkZHJlc3MuICBUaGlzIHBlcm1pdHMgdGhlIHVzZXIgdG8gZWFzaWx5IG92ZXJyaWRlIHRoZSBzdGFjayBhZGRyZXNzCi11c2luZyB0aGUgQGNvZGV7LS1kZWZzeW19IG9wdGlvbi4gIEhlcmUgaXMgYW4gZXhhbXBsZToKLUBzbWFsbGV4YW1wbGUKLSAgJEB7UkVMT0NBVElORysgUFJPVklERSAoX19zdGFjayA9IDB4ODAwMDAwMDApO0B9Ci1AZW5kIHNtYWxsZXhhbXBsZQotVGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgQGNvZGV7X19zdGFja30gd291bGQgdGhlbiBiZSB1c2VkIGluIHRoZSBzdGFydHVwCi1jb2RlIHRvIGluaXRpYWxpemUgdGhlIHN0YWNrIHBvaW50ZXIuCi0KLUBub2RlIGxpbmtlciBlbXVsYXRpb25zCi1Ac2VjdGlvbiBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdHMKLQotRWFjaCBsaW5rZXIgdGFyZ2V0IHVzZXMgYW4gQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQgdG8gZ2VuZXJhdGUgdGhlCi1lbXVsYXRpb24gY29kZS4gIFRoZSBuYW1lIG9mIHRoZSBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCBpcyBzZXQgYnkgdGhlCi1AY29kZXtURU1QTEFURV9OQU1FfSB2YXJpYWJsZSBpbiB0aGUgQGZpbGV7ZW11bHBhcmFtc30gc2NyaXB0LiAgSWYgdGhlCi1AY29kZXtURU1QTEFURV9OQU1FfSB2YXJpYWJsZSBpcyBub3Qgc2V0LCB0aGUgZGVmYXVsdCBpcwotQHNhbXB7Z2VuZXJpY30uICBJZiB0aGUgdmFsdWUgb2YgQGNvZGV7VEVNUExBVEVfTkFNRX0gaXMgQHZhcnt0ZW1wbGF0ZX0sCi1AZmlsZXtnZW5zY3JpcHRzLnNofSB3aWxsIHVzZSBAZmlsZXtlbXVsdGVtcGwvQHZhcnt0ZW1wbGF0ZX0uZW19LgotCi1Nb3N0IHRhcmdldHMgdXNlIHRoZSBnZW5lcmljIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0LAotQGZpbGV7ZW11bHRlbXBsL2dlbmVyaWMuZW19LiAgQSBkaWZmZXJlbnQgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQgaXMKLW9ubHkgbmVlZGVkIGlmIHRoZSBsaW5rZXIgbXVzdCBzdXBwb3J0IHVudXN1YWwgYWN0aW9ucywgc3VjaCBhcyBsaW5raW5nCi1hZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuCi0KLVRoZSBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCBpcyBub3JtYWxseSB3cml0dGVuIGFzIGEgc2ltcGxlIGludm9jYXRpb24KLW9mIEBjb2Rle2NhdH0gd2l0aCBhIGhlcmUgZG9jdW1lbnQuICBUaGUgZG9jdW1lbnQgd2lsbCB1c2UgYSBmZXcKLXZhcmlhYmxlIHN1YnN0aXR1dGlvbnMuICBUeXBpY2FsbHkgZWFjaCBmdW5jdGlvbiBuYW1lcyB1c2VzIGEKLXN1YnN0aXR1dGlvbiBpbnZvbHZpbmcgQGNvZGV7RU1VTEFUSU9OX05BTUV9LCBmb3IgZWFzZSBvZiBkZWJ1Z2dpbmcgd2hlbgotdGhlIGxpbmtlciBzdXBwb3J0cyBtdWx0aXBsZSBlbXVsYXRpb25zLgotCi1FdmVyeSBmdW5jdGlvbiBhbmQgdmFyaWFibGUgaW4gdGhlIGVtaXR0ZWQgZmlsZSBzaG91bGQgYmUgc3RhdGljLiAgVGhlCi1vbmx5IGdsb2JhbGx5IHZpc2libGUgb2JqZWN0IG11c3QgYmUgbmFtZWQKLUBjb2Rle2xkX0B2YXJ7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbn0sIHdoZXJlIEB2YXJ7RU1VTEFUSU9OX05BTUV9IGlzCi10aGUgbmFtZSBvZiB0aGUgZW11bGF0aW9uIHNldCBpbiBAZmlsZXtjb25maWd1cmUudGd0fSAodGhpcyBpcyBhbHNvIHRoZQotbmFtZSBvZiB0aGUgQGZpbGV7ZW11bHBhcmFtc30gZmlsZSB3aXRob3V0IHRoZSBAZmlsZXsuc2h9IGV4dGVuc2lvbikuCi1UaGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHdpbGwgc2V0IHRoZSBzaGVsbCB2YXJpYWJsZQotQGNvZGV7RU1VTEFUSU9OX05BTUV9IGJlZm9yZSBpbnZva2luZyB0aGUgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQuCi0KLVRoZSBAY29kZXtsZF9AdmFye0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb259IHZhcmlhYmxlIG11c3QgYmUgYQotQGNvZGV7c3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdH0sIGFzIGRlZmluZWQgaW4gQGZpbGV7bGRlbXVsLmh9LgotSXQgZGVmaW5lcyBhIHNldCBvZiBmdW5jdGlvbiBwb2ludGVycyB3aGljaCBhcmUgaW52b2tlZCBieSB0aGUgbGlua2VyLAotYXMgd2VsbCBhcyBzdHJpbmdzIGZvciB0aGUgZW11bGF0aW9uIG5hbWUgKG5vcm1hbGx5IHNldCBmcm9tIHRoZSBzaGVsbAotdmFyaWFibGUgQGNvZGV7RU1VTEFUSU9OX05BTUV9IGFuZCB0aGUgZGVmYXVsdCBCRkQgdGFyZ2V0IG5hbWUgKG5vcm1hbGx5Ci1zZXQgZnJvbSB0aGUgc2hlbGwgdmFyaWFibGUgQGNvZGV7T1VUUFVUX0ZPUk1BVH0gd2hpY2ggaXMgbm9ybWFsbHkgc2V0Ci1ieSB0aGUgQGZpbGV7ZW11bHBhcmFtc30gZmlsZSkuCi0KLVRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgd2lsbCBzZXQgdGhlIHNoZWxsIHZhcmlhYmxlCi1AY29kZXtDT01QSUxFX0lOfSB3aGVuIGl0IGludm9rZXMgdGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IGZvciB0aGUKLWRlZmF1bHQgZW11bGF0aW9uLiAgSW4gdGhpcyBjYXNlLCB0aGUgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQgc2hvdWxkCi1pbmNsdWRlIHRoZSBsaW5rZXIgc2NyaXB0cyBkaXJlY3RseSwgYW5kIHJldHVybiB0aGVtIGZyb20gdGhlCi1AY29kZXtnZXRfc2NyaXB0c30gZW50cnkgcG9pbnQuICBXaGVuIHRoZSBlbXVsYXRpb24gaXMgbm90IHRoZSBkZWZhdWx0LAotdGhlIEBjb2Rle2dldF9zY3JpcHRzfSBlbnRyeSBwb2ludCBzaG91bGQganVzdCByZXR1cm4gYSBmaWxlIG5hbWUuICBTZWUKLUBmaWxle2VtdWx0ZW1wbC9nZW5lcmljLmVtfSBmb3IgYW4gZXhhbXBsZSBvZiBob3cgdGhpcyBpcyBkb25lLgotCi1BdCBzb21lIHBvaW50LCB0aGUgbGlua2VyIGVtdWxhdGlvbiBlbnRyeSBwb2ludHMgc2hvdWxkIGJlIGRvY3VtZW50ZWQuCi0KLUBub2RlIEVtdWxhdGlvbiBXYWxrdGhyb3VnaAotQGNoYXB0ZXIgQSBXYWxrdGhyb3VnaCBvZiBhIFR5cGljYWwgRW11bGF0aW9uCi0KLVRoaXMgY2hhcHRlciBpcyB0byBoZWxwIHBlb3BsZSB3aG8gYXJlIG5ldyB0byB0aGUgd2F5IGVtdWxhdGlvbnMKLWludGVyYWN0IHdpdGggdGhlIGxpbmtlciwgb3Igd2hvIGFyZSBzdWRkZW5seSB0aHJ1c3QgaW50byB0aGUgcG9zaXRpb24KLW9mIGhhdmluZyB0byB3b3JrIHdpdGggZXhpc3RpbmcgZW11bGF0aW9ucy4gIEl0IHdpbGwgZGlzY3VzcyB0aGUgZmlsZXMKLXlvdSBuZWVkIHRvIGJlIGF3YXJlIG9mLiAgSXQgd2lsbCB0ZWxsIHlvdSB3aGVuIHRoZSBnaXZlbiAiaG9va3MiIGluCi10aGUgZW11bGF0aW9uIHdpbGwgYmUgY2FsbGVkLiAgSXQgd2lsbCwgaG9wZWZ1bGx5LCBnaXZlIHlvdSBlbm91Z2gKLWluZm9ybWF0aW9uIGFib3V0IHdoZW4gYW5kIGhvdyB0aGluZ3MgaGFwcGVuIHRoYXQgeW91J2xsIGJlIGFibGUgdG8KLWdldCBieS4gIEFzIGFsd2F5cywgdGhlIHNvdXJjZSBpcyB0aGUgZGVmaW5pdGl2ZSByZWZlcmVuY2UgdG8gdGhpcy4KLQotVGhlIHN0YXJ0aW5nIHBvaW50IGZvciB0aGUgbGlua2VyIGlzIGluIEBmaWxle2xkbWFpbi5jfSB3aGVyZQotQGNvZGV7bWFpbn0gaXMgZGVmaW5lZC4gIFRoZSBidWxrIG9mIHRoZSBjb2RlIHRoYXQncyBlbXVsYXRpb24KLXNwZWNpZmljIHdpbGwgaW5pdGlhbGx5IGJlIGluIEBjb2Rle2VtdWx0ZW1wbC9AdmFye2VtdWxhdGlvbn0uZW19IGJ1dAotd2lsbCBlbmQgdXAgaW4gQGNvZGV7ZUB2YXJ7ZW11bGF0aW9ufS5jfSB3aGVuIHRoZSBidWlsZCBpcyBkb25lLgotTW9zdCBvZiB0aGUgd29yayB0byBzZWxlY3QgYW5kIGludGVyZmFjZSB3aXRoIGVtdWxhdGlvbnMgaXMgaW4KLUBjb2Rle2xkZW11bC5ofSBhbmQgQGNvZGV7bGRlbXVsLmN9LiAgU3BlY2lmaWNhbGx5LCBAY29kZXtsZGVtdWwuaH0KLWRlZmluZXMgdGhlIEBjb2Rle2xkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdH0gc3RydWN0dXJlIHlvdXIgZW11bGF0aW9uCi1leHBvcnRzLgotCi1Zb3VyIGVtdWxhdGlvbiBmaWxlIGV4cG9ydHMgYSBzeW1ib2wKLUBjb2Rle2xkX0B2YXJ7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbn0uICBJZiB5b3VyIGVtdWxhdGlvbiBpcwotc2VsZWN0ZWQgKGl0IHVzdWFsbHkgaXMsIHNpbmNlIHVzdWFsbHkgdGhlcmUncyBvbmx5IG9uZSksCi1AY29kZXtsZGVtdWwuY30gc2V0cyB0aGUgdmFyaWFibGUgQHZhcntsZF9lbXVsYXRpb259IHRvIHBvaW50IHRvIGl0LgotQGNvZGV7bGRlbXVsLmN9IGFsc28gZGVmaW5lcyBhIG51bWJlciBvZiBBUEkgZnVuY3Rpb25zIHRoYXQgaW50ZXJmYWNlCi10byB5b3VyIGVtdWxhdGlvbiwgbGlrZSBAY29kZXtsZGVtdWxfYWZ0ZXJfcGFyc2V9IHdoaWNoIHNpbXBseSBjYWxscwoteW91ciBAY29kZXtsZF9AdmFye0VNVUxBVElPTn1fZW11bGF0aW9uLmFmdGVyX3BhcnNlfSBmdW5jdGlvbi4gIEZvcgotdGhlIHJlc3Qgb2YgdGhpcyBzZWN0aW9uLCB0aGUgZnVuY3Rpb25zIHdpbGwgYmUgbWVudGlvbmVkLCBidXQgeW91Ci1zaG91bGQgYXNzdW1lIHRoZSBpbmRpcmVjdCByZWZlcmVuY2UgdG8geW91ciBlbXVsYXRpb24gYWxzby4KLQotV2Ugd2lsbCBhbHNvIHNraXAgb3IgZ2xvc3Mgb3ZlciBwYXJ0cyBvZiB0aGUgbGluayBwcm9jZXNzIHRoYXQgZG9uJ3QKLXJlbGF0ZSB0byBlbXVsYXRpb25zLCBsaWtlIHNldHRpbmcgdXAgaW50ZXJuYXRpb25hbGl6YXRpb24uCi0KLUFmdGVyIGluaXRpYWxpemF0aW9uLCBAY29kZXttYWlufSBzZWxlY3RzIGFuIGVtdWxhdGlvbiBieSBwcmUtc2Nhbm5pbmcKLXRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiAgSXQgY2FsbHMgQGNvZGV7bGRlbXVsX2Nob29zZV90YXJnZXR9IHRvCi1jaG9vc2UgYSB0YXJnZXQuICBJZiB5b3Ugc2V0IEBjb2Rle2Nob29zZV90YXJnZXR9IHRvCi1AY29kZXtsZGVtdWxfZGVmYXVsdF90YXJnZXR9LCBpdCBwaWNrcyB5b3VyIEBjb2Rle3RhcmdldF9uYW1lfSBieQotZGVmYXVsdC4KLQotQGNvZGV7bWFpbn0gY2FsbHMgQGNvZGV7bGRlbXVsX2JlZm9yZV9wYXJzZX0sIHRoZW4gQGNvZGV7cGFyc2VfYXJnc30uCi1AY29kZXtwYXJzZV9hcmdzfSBjYWxscyBAY29kZXtsZGVtdWxfcGFyc2VfYXJnc30gZm9yIGVhY2ggYXJnLCB3aGljaAotbXVzdCB1cGRhdGUgdGhlIEBjb2Rle2dldG9wdH0gZ2xvYmFscyBpZiBpdCByZWNvZ25pemVzIHRoZSBhcmd1bWVudC4KLUlmIHRoZSBlbXVsYXRpb24gZG9lc24ndCByZWNvZ25pemUgaXQsIHRoZW4gcGFyc2VfYXJncyBjaGVja3MgdG8gc2VlCi1pZiBpdCByZWNvZ25pemVzIGl0LgotCi1Ob3cgdGhhdCB0aGUgZW11bGF0aW9uIGhhcyBoYWQgYWNjZXNzIHRvIGFsbCBpdHMgY29tbWFuZC1saW5lIG9wdGlvbnMsCi1AY29kZXttYWlufSBjYWxscyBAY29kZXtsZGVtdWxfc2V0X3N5bWJvbHN9LiAgVGhpcyBjYW4gYmUgdXNlZCBmb3IgYW55Ci1pbml0aWFsaXphdGlvbiB0aGF0IG1heSBiZSBhZmZlY3RlZCBieSBvcHRpb25zLiAgSXQgaXMgYWxzbyBzdXBwb3NlZAotdG8gc2V0IHVwIGFueSB2YXJpYWJsZXMgbmVlZGVkIGJ5IHRoZSBlbXVsYXRpb24gc2NyaXB0LgotCi1AY29kZXttYWlufSBub3cgY2FsbHMgQGNvZGV7bGRlbXVsX2dldF9zY3JpcHR9IHRvIGdldCB0aGUgZW11bGF0aW9uCi1zY3JpcHQgdG8gdXNlIChiYXNlZCBvbiBhcmd1bWVudHMsIG5vIGRvdWJ0LCBAcHhyZWZ7RW11bGF0aW9uc30pIGFuZAotcnVucyBpdC4gIFdoaWxlIHBhcnNpbmcsIEBjb2Rle2xkZ3JhbS55fSBtYXkgY2FsbCBAY29kZXtsZGVtdWxfaGxsfSBvcgotQGNvZGV7bGRlbXVsX3N5c2xpYn0gdG8gaGFuZGxlIHRoZSBAY29kZXtITEx9IG9yIEBjb2Rle1NZU0xJQn0KLWNvbW1hbmRzLiAgSXQgbWF5IGNhbGwgQGNvZGV7bGRlbXVsX3VucmVjb2duaXplZF9maWxlfSBpZiB5b3UgYXNrZWQKLXRoZSBsaW5rZXIgdG8gbGluayBhIGZpbGUgaXQgZG9lc24ndCByZWNvZ25pemUuICBJdCB3aWxsIGNhbGwKLUBjb2Rle2xkZW11bF9yZWNvZ25pemVkX2ZpbGV9IGZvciBlYWNoIGZpbGUgaXQgZG9lcyByZWNvZ25pemUsIGluIGNhc2UKLXRoZSBlbXVsYXRpb24gd2FudHMgdG8gaGFuZGxlIHNvbWUgZmlsZXMgc3BlY2lhbGx5LiAgQWxsIHRoZSB3aGlsZSwKLWl0J3MgbG9hZGluZyB0aGUgZmlsZXMgKHBvc3NpYmx5IGNhbGxpbmcKLUBjb2Rle2xkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZX0pIGFuZCBzeW1ib2xzIGFuZCBzdHVmZi4gIEFmdGVyIGl0J3MKLWRvbmUgcmVhZGluZyB0aGUgc2NyaXB0LCBAY29kZXttYWlufSBjYWxscyBAY29kZXtsZGVtdWxfYWZ0ZXJfcGFyc2V9LgotVXNlIHRoZSBhZnRlci1wYXJzZSBob29rIHRvIHNldCB1cCBhbnl0aGluZyB0aGF0IGRlcGVuZHMgb24gc3R1ZmYgdGhlCi1zY3JpcHQgbWlnaHQgaGF2ZSBzZXQgdXAsIGxpa2UgdGhlIGVudHJ5IHBvaW50LgotCi1AY29kZXttYWlufSBuZXh0IGNhbGxzIEBjb2Rle2xhbmdfcHJvY2Vzc30gaW4gQGNvZGV7bGRsYW5nLmN9LiAgVGhpcwotYXBwZWFycyB0byBiZSB0aGUgbWFpbiBjb3JlIG9mIHRoZSBsaW5raW5nIGl0c2VsZiwgYXMgZmFyIGFzIGVtdWxhdGlvbgotaG9va3MgYXJlIGNvbmNlcm5lZCgqKS4gIEl0IGZpcnN0IG9wZW5zIHRoZSBvdXRwdXQgZmlsZSdzIEJGRCwgY2FsbGluZwotQGNvZGV7bGRlbXVsX3NldF9vdXRwdXRfYXJjaH0sIGFuZCBjYWxscwotQGNvZGV7bGRlbXVsX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzfSBpbiBjYXNlIHlvdSBuZWVkIHRvIHVzZQotb3RoZXIgbWVhbnMgdG8gZmluZCBvciBjcmVhdGUgb2JqZWN0IGZpbGVzIChpLmUuIHNoYXJlZCBsaWJyYXJpZXMKLWZvdW5kIG9uIGEgcGF0aCwgb3IgZmFrZSBzdHViIG9iamVjdHMpLiAgRGVzcGl0ZSB0aGUgbmFtZSwgbm9ib2R5Ci1jcmVhdGVzIG91dHB1dCBzZWN0aW9ucyBoZXJlLgotCi0oKikgSW4gbW9zdCBjYXNlcywgdGhlIEJGRCBsaWJyYXJ5IGRvZXMgdGhlIGJ1bGsgb2YgdGhlIGFjdHVhbAotbGlua2luZywgaGFuZGxpbmcgc3ltYm9sIHRhYmxlcywgc3ltYm9sIHJlc29sdXRpb24sIHJlbG9jYXRpb25zLCBhbmQKLWJ1aWxkaW5nIHRoZSBmaW5hbCBvdXRwdXQgZmlsZS4gIFNlZSB0aGUgQkZEIHJlZmVyZW5jZSBmb3IgYWxsIHRoZQotZGV0YWlscy4gIFlvdXIgZW11bGF0aW9uIGlzIHVzdWFsbHkgY29uY2VybmVkIG1vcmUgd2l0aCBtYW5hZ2luZwotdGhpbmdzIGF0IHRoZSBmaWxlIGFuZCBzZWN0aW9uIGxldmVsLCBsaWtlICJwdXQgdGhpcyBoZXJlLCBhZGQgdGhpcwotc2VjdGlvbiIsIGV0Yy4KLQotTmV4dCwgdGhlIG9iamVjdHMgdG8gYmUgbGlua2VkIGFyZSBvcGVuZWQgYW5kIEJGRHMgY3JlYXRlZCBmb3IgdGhlbSwKLWFuZCBAY29kZXtsZGVtdWxfYWZ0ZXJfb3Blbn0gaXMgY2FsbGVkLiAgQXQgdGhpcyBwb2ludCwgeW91IGhhdmUgYWxsCi10aGUgb2JqZWN0cyBhbmQgc3ltYm9scyBsb2FkZWQsIGJ1dCBub25lIG9mIHRoZSBkYXRhIGhhcyBiZWVuIHBsYWNlZAoteWV0LgotCi1OZXh0IGNvbWVzIHRoZSBCaWcgTGlua2luZyBUaGluZ3kgKGV4Y2VwdCBmb3IgdGhlIHBhcnRzIEJGRCBkb2VzKS4KLUFsbCBpbnB1dCBzZWN0aW9ucyBhcmUgbWFwcGVkIHRvIG91dHB1dCBzZWN0aW9ucyBhY2NvcmRpbmcgdG8gdGhlCi1zY3JpcHQuICBJZiBhIHNlY3Rpb24gZG9lc24ndCBnZXQgbWFwcGVkIGJ5IGRlZmF1bHQsCi1AY29kZXtsZGVtdWxfcGxhY2Vfb3JwaGFufSB3aWxsIGdldCBjYWxsZWQgdG8gZmlndXJlIG91dCB3aGVyZSBpdCBnb2VzLgotTmV4dCBpdCBmaWd1cmVzIG91dCB0aGUgb2Zmc2V0cyBmb3IgZWFjaCBzZWN0aW9uLCBjYWxsaW5nCi1AY29kZXtsZGVtdWxfYmVmb3JlX2FsbG9jYXRpb259IGJlZm9yZSBhbmQKLUBjb2Rle2xkZW11bF9hZnRlcl9hbGxvY2F0aW9ufSBhZnRlciBkZWNpZGluZyB3aGVyZSBlYWNoIGlucHV0IHNlY3Rpb24KLWVuZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9ucy4KLQotVGhlIGxhc3QgcGFydCBvZiBAY29kZXtsYW5nX3Byb2Nlc3N9IGlzIHRvIGZpZ3VyZSBvdXQgYWxsIHRoZSBzeW1ib2xzJwotdmFsdWVzLiAgQWZ0ZXIgYXNzaWduaW5nIGZpbmFsIHZhbHVlcyB0byB0aGUgc3ltYm9scywKLUBjb2Rle2xkZW11bF9maW5pc2h9IGlzIGNhbGxlZCwgYW5kIGFmdGVyIHRoYXQsIGFueSB1bmRlZmluZWQgc3ltYm9scwotYXJlIHR1cm5lZCBpbnRvIGZhdGFsIGVycm9ycy4KLQotT0ssIGJhY2sgdG8gQGNvZGV7bWFpbn0sIHdoaWNoIGNhbGxzIEBjb2Rle2xkd3JpdGV9IGluCi1AZmlsZXtsZHdyaXRlLmN9LiAgQGNvZGV7bGR3cml0ZX0gY2FsbHMgQkZEJ3MgZmluYWxfbGluaywgd2hpY2ggZG9lcwotYWxsIHRoZSByZWxvY2F0aW9uIGZpeHVwcyBhbmQgd3JpdGVzIHRoZSBvdXRwdXQgYmZkIHRvIGRpc2ssIGFuZCB3ZSdyZQotZG9uZS4KLQotSW4gc3VtbWFyeSwKLQotQGl0ZW1pemUgQGJ1bGxldAotCi1AaXRlbSBAY29kZXttYWluKCl9IGluIEBmaWxle2xkbWFpbi5jfQotQGl0ZW0gQGZpbGV7ZW11bHRlbXBsL0B2YXJ7RU1VTEFUSU9OfS5lbX0gaGFzIHlvdXIgY29kZQotQGl0ZW0gQGNvZGV7bGRlbXVsX2Nob29zZV90YXJnZXR9IChkZWZhdWx0cyB0byB5b3VyIEBjb2Rle3RhcmdldF9uYW1lfSkKLUBpdGVtIEBjb2Rle2xkZW11bF9iZWZvcmVfcGFyc2V9Ci1AaXRlbSBQYXJzZSBhcmd2LCBjYWxscyBAY29kZXtsZGVtdWxfcGFyc2VfYXJnc30gZm9yIGVhY2gKLUBpdGVtIEBjb2Rle2xkZW11bF9zZXRfc3ltYm9sc30KLUBpdGVtIEBjb2Rle2xkZW11bF9nZXRfc2NyaXB0fQotQGl0ZW0gcGFyc2Ugc2NyaXB0Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtIG1heSBjYWxsIEBjb2Rle2xkZW11bF9obGx9IG9yIEBjb2Rle2xkZW11bF9zeXNsaWJ9Ci1AaXRlbSBtYXkgY2FsbCBAY29kZXtsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmV9Ci1AZW5kIGl0ZW1pemUKLQotQGl0ZW0gQGNvZGV7bGRlbXVsX2FmdGVyX3BhcnNlfQotQGl0ZW0gQGNvZGV7bGFuZ19wcm9jZXNzKCl9IGluIEBmaWxle2xkbGFuZy5jfQotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbSBjcmVhdGUgQGNvZGV7b3V0cHV0X2JmZH0KLUBpdGVtIEBjb2Rle2xkZW11bF9zZXRfb3V0cHV0X2FyY2h9Ci1AaXRlbSBAY29kZXtsZGVtdWxfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHN9Ci1AaXRlbSByZWFkIG9iamVjdHMsIGNyZWF0ZSBpbnB1dCBiZmRzIC0gYWxsIHN5bWJvbHMgZXhpc3QsIGJ1dCBoYXZlIG5vIHZhbHVlcwotQGl0ZW0gbWF5IGNhbGwgQGNvZGV7bGRlbXVsX3VucmVjb2duaXplZF9maWxlfQotQGl0ZW0gd2lsbCBjYWxsIEBjb2Rle2xkZW11bF9yZWNvZ25pemVkX2ZpbGV9Ci1AaXRlbSBAY29kZXtsZGVtdWxfYWZ0ZXJfb3Blbn0KLUBpdGVtIG1hcCBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQgc2VjdGlvbnMKLUBpdGVtIG1heSBjYWxsIEBjb2Rle2xkZW11bF9wbGFjZV9vcnBoYW59IGZvciByZW1haW5pbmcgc2VjdGlvbnMKLUBpdGVtIEBjb2Rle2xkZW11bF9iZWZvcmVfYWxsb2NhdGlvbn0KLUBpdGVtIGdpdmVzIGlucHV0IHNlY3Rpb25zIG9mZnNldHMgaW50byBvdXRwdXQgc2VjdGlvbnMsIHBsYWNlcyBvdXRwdXQgc2VjdGlvbnMKLUBpdGVtIEBjb2Rle2xkZW11bF9hZnRlcl9hbGxvY2F0aW9ufSAtIHNlY3Rpb24gYWRkcmVzc2VzIHZhbGlkCi1AaXRlbSBhc3NpZ25zIHZhbHVlcyB0byBzeW1ib2xzCi1AaXRlbSBAY29kZXtsZGVtdWxfZmluaXNofSAtIHN5bWJvbCB2YWx1ZXMgdmFsaWQKLUBlbmQgaXRlbWl6ZQotCi1AaXRlbSBvdXRwdXQgYmZkIGlzIHdyaXR0ZW4gdG8gZGlzawotCi1AZW5kIGl0ZW1pemUKLQotQGNvbnRlbnRzCi1AYnllCmRpZmYgLS1naXQgYS9sZC9sZGxhbmcuYyBiL2xkL2xkbGFuZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmM1MzNkLi4wMDAwMDAwCi0tLSBhL2xkL2xkbGFuZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYyNCArMCwwIEBACi0vKiBMaW5rZXIgY29tbWFuZCBsYW5ndWFnZSBzdXBwb3J0LgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRjdG9yLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAiZm5tYXRjaC5oIgotI2luY2x1ZGUgImRlbWFuZ2xlLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0vKiBGT1JXQVJEUyAqLwotc3RhdGljIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKm5ld19zdGF0ZW1lbnQgUEFSQU1TICgoZW51bSBzdGF0ZW1lbnRfZW51bSwKLQkJCQkJCQkgc2l6ZV90LAotCQkJCQkJCSBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUqKSk7Ci0KLQotLyogTE9DQUxTICovCi1zdGF0aWMgc3RydWN0IG9ic3RhY2sgc3RhdF9vYnN0YWNrOwotCi0jZGVmaW5lIG9ic3RhY2tfY2h1bmtfYWxsb2MgeG1hbGxvYwotI2RlZmluZSBvYnN0YWNrX2NodW5rX2ZyZWUgZnJlZQotc3RhdGljIENPTlNUIGNoYXIgKnN0YXJ0dXBfZmlsZTsKLXN0YXRpYyBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgaW5wdXRfZmlsZV9jaGFpbjsKLXN0YXRpYyBib29sZWFuIHBsYWNlZF9jb21tb25zID0gZmFsc2U7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqZGVmYXVsdF9jb21tb25fc2VjdGlvbjsKLXN0YXRpYyBib29sZWFuIG1hcF9vcHRpb25fZjsKLXN0YXRpYyBiZmRfdm1hIHByaW50X2RvdDsKLXN0YXRpYyBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaXJzdF9maWxlOwotc3RhdGljIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLXN0YXRpYyBDT05TVCBjaGFyICpjdXJyZW50X3RhcmdldDsKLXN0YXRpYyBDT05TVCBjaGFyICpvdXRwdXRfdGFyZ2V0Owotc3RhdGljIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBzdGF0ZW1lbnRfbGlzdDsKLXN0YXRpYyBzdHJ1Y3QgbGFuZ19waGRyICpsYW5nX3BoZHJfbGlzdDsKLQotc3RhdGljIHZvaWQgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyCi0gIFBBUkFNUyAoKHZvaWQgKCpmdW5jKSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSwKLQkgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzKSk7Ci1zdGF0aWMgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqbmV3X2FmaWxlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGxhbmdfaW5wdXRfZmlsZV9lbnVtX3R5cGUgZmlsZV90eXBlLAotCSAgIGNvbnN0IGNoYXIgKnRhcmdldCwgYm9vbGVhbiBhZGRfdG9fbGlzdCkpOwotc3RhdGljIHZvaWQgaW5pdF9vcyBQQVJBTVMgKChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpzKSk7Ci1zdGF0aWMgdm9pZCBleHBfaW5pdF9vcyBQQVJBTVMgKChldHJlZV90eXBlICopKTsKLXN0YXRpYyB2b2lkIHNlY3Rpb25fYWxyZWFkeV9saW5rZWQgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gd2lsZGNhcmRwIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKndpbGRfc29ydAotICBQQVJBTVMgKChsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKiwgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLAotCSAgIGFzZWN0aW9uICopKTsKLXN0YXRpYyBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpsb29rdXBfbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci1zdGF0aWMgdm9pZCBsb2FkX3N5bWJvbHMgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnksCi0JCQkJICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKikpOwotc3RhdGljIHZvaWQgd2lsZCBQQVJBTVMgKChsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnMsCi0JCQkgIGNvbnN0IGNoYXIgKnNlY3Rpb24sIGNvbnN0IGNoYXIgKmZpbGUsCi0JCQkgIGNvbnN0IGNoYXIgKnRhcmdldCwKLQkJCSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0KSk7Ci1zdGF0aWMgYmZkICpvcGVuX291dHB1dCBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci1zdGF0aWMgdm9pZCBsZGxhbmdfb3Blbl9vdXRwdXQgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqc3RhdGVtZW50KSk7Ci1zdGF0aWMgdm9pZCBvcGVuX2lucHV0X2JmZHMKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqc3RhdGVtZW50LCBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX3JlYXNvbmFibGVfZGVmYXVsdHMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgbGFuZ19wbGFjZV91bmRlZmluZWRzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqcywKLQkgICBjb25zdCBjaGFyICp0YXJnZXQsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQKLSAgUEFSQU1TICgobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqYXNzaWdubWVudCwKLQkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvdXRwdXRfc2VjdGlvbikpOwotc3RhdGljIHZvaWQgcHJpbnRfaW5wdXRfc3RhdGVtZW50IFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnN0YXRtKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcmludF9vbmVfc3ltYm9sIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIHZvaWQgcHJpbnRfaW5wdXRfc2VjdGlvbiBQQVJBTVMgKChsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqaW4pKTsKLXN0YXRpYyB2b2lkIHByaW50X2ZpbGxfc3RhdGVtZW50IFBBUkFNUyAoKGxhbmdfZmlsbF9zdGF0ZW1lbnRfdHlwZSAqZmlsbCkpOwotc3RhdGljIHZvaWQgcHJpbnRfZGF0YV9zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19kYXRhX3N0YXRlbWVudF90eXBlICpkYXRhKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9hZGRyZXNzX3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgcHJpbnRfcmVsb2Nfc3RhdGVtZW50IFBBUkFNUyAoKGxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUgKnJlbG9jKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9wYWRkaW5nX3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX3BhZGRpbmdfc3RhdGVtZW50X3R5cGUgKnMpKTsKLXN0YXRpYyB2b2lkIHByaW50X3dpbGRfc3RhdGVtZW50Ci0gIFBBUkFNUyAoKGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqdywKLQkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvcykpOwotc3RhdGljIHZvaWQgcHJpbnRfZ3JvdXAKLSAgUEFSQU1TICgobGFuZ19ncm91cF9zdGF0ZW1lbnRfdHlwZSAqLCBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIHByaW50X3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzLAotCQkJCSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MpKTsKLXN0YXRpYyB2b2lkIHByaW50X3N0YXRlbWVudF9saXN0IFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnMsCi0JCQkJCSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MpKTsKLXN0YXRpYyB2b2lkIHByaW50X3N0YXRlbWVudHMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJmZF92bWEgaW5zZXJ0X3BhZCBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqdGhpc19wdHIsCi0JCQkJICAgZmlsbF90eXBlIGZpbGwsIHVuc2lnbmVkIGludCBwb3dlciwKLQkJCQkgICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCQkJCSAgIGJmZF92bWEgZG90KSk7Ci1zdGF0aWMgYmZkX3ZtYSBzaXplX2lucHV0X3NlY3Rpb24KLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnRoaXNfcHRyLAotCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkgICBmaWxsX3R5cGUgZmlsbCwgYmZkX3ZtYSBkb3QsIGJvb2xlYW4gcmVsYXgpKTsKLXN0YXRpYyB2b2lkIGxhbmdfZmluaXNoIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGlnbm9yZV9iZmRfZXJyb3JzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2NoZWNrIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGxhbmdfY29tbW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGxhbmdfb25lX2NvbW1vbiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGxhbmdfcGxhY2Vfb3JwaGFucyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHRvcG93ZXIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBsYW5nX3NldF9zdGFydG9mIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHJlc2V0X21lbW9yeV9yZWdpb25zIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGxhbmdfcmVjb3JkX3BoZHJzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGxhbmdfZ2Nfd2lsZAotICBQQVJBTVMgKChsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGxhbmdfZ2Nfc2VjdGlvbnNfMSBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyB2b2lkIGxhbmdfZ2Nfc2VjdGlvbnMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgbGFuZ19kb192ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2NoZWNrX3NlY3Rpb25fYWRkcmVzc2VzIFBBUkFNUyAoKHZvaWQpKTsKLQotdHlwZWRlZiB2b2lkICgqY2FsbGJhY2tfdCkgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosCi0JCQkJICAgIGFzZWN0aW9uICosIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwKLQkJCQkgICAgdm9pZCAqKSk7Ci1zdGF0aWMgdm9pZCB3YWxrX3dpbGRfc2VjdGlvbgotICBQQVJBTVMgKChsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKiwgY29uc3QgY2hhciAqLAotCSAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwgY2FsbGJhY2tfdCwgdm9pZCAqKSk7Ci1zdGF0aWMgdm9pZCB3YWxrX3dpbGRfZmlsZQotICBQQVJBTVMgKChsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKiwgY29uc3QgY2hhciAqLAotCSAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwgY2FsbGJhY2tfdCwgdm9pZCAqKSk7Ci0JCQkJCQotLyogRVhQT1JUUyAqLwotbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqYWJzX291dHB1dF9zZWN0aW9uOwotbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpzdGF0X3B0ciA9ICZzdGF0ZW1lbnRfbGlzdDsKLWxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBmaWxlX2NoYWluID0geyAwIH07Ci1jb25zdCBjaGFyICplbnRyeV9zeW1ib2wgPSBOVUxMOwotYm9vbGVhbiBlbnRyeV9mcm9tX2NtZGxpbmU7Ci1ib29sZWFuIGxhbmdfaGFzX2lucHV0X2ZpbGUgPSBmYWxzZTsKLWJvb2xlYW4gaGFkX291dHB1dF9maWxlbmFtZSA9IGZhbHNlOwotYm9vbGVhbiBsYW5nX2Zsb2F0X2ZsYWcgPSBmYWxzZTsKLWJvb2xlYW4gZGVsZXRlX291dHB1dF9maWxlX29uX2ZhaWx1cmUgPSBmYWxzZTsKLXN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICpub2Nyb3NzcmVmX2xpc3Q7Ci0KLWV0cmVlX3R5cGUgKmJhc2U7IC8qIFJlbG9jYXRpb24gYmFzZSAtIG9yIG51bGwgKi8KLQotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLSNkZWZpbmUgY2F0KGEsYikgYSMjYgotI2Vsc2UKLSNkZWZpbmUgY2F0KGEsYikgYS8qKi9iCi0jZW5kaWYKLQotI2RlZmluZSBuZXdfc3RhdCh4LHkpIChjYXQoeCxfdHlwZSkqKSBuZXdfc3RhdGVtZW50KGNhdCh4LF9lbnVtKSwgc2l6ZW9mKGNhdCh4LF90eXBlKSkseSkKLQotI2RlZmluZSBvdXRzaWRlX3NlY3Rpb25fYWRkcmVzcyhxKSAoIChxKS0+b3V0cHV0X29mZnNldCArIChxKS0+b3V0cHV0X3NlY3Rpb24tPnZtYSkKLQotI2RlZmluZSBvdXRzaWRlX3N5bWJvbF9hZGRyZXNzKHEpICgocSktPnZhbHVlICsgICBvdXRzaWRlX3NlY3Rpb25fYWRkcmVzcyhxLT5zZWN0aW9uKSkKLQotI2RlZmluZSBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCAoMTYpCi0KLVBUUgotc3RhdF9hbGxvYyAoc2l6ZSkKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIHJldHVybiBvYnN0YWNrX2FsbG9jICgmc3RhdF9vYnN0YWNrLCBzaXplKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIEdlbmVyaWMgdHJhdmVyc2FsIHJvdXRpbmVzIGZvciBmaW5kaW5nIG1hdGNoaW5nIHNlY3Rpb25zLgotKi8KLQotc3RhdGljIHZvaWQKLXdhbGtfd2lsZF9zZWN0aW9uIChwdHIsIHNlY3Rpb24sIGZpbGUsIGNhbGxiYWNrLCBkYXRhKQotICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnB0cjsKLSAgICAgY29uc3QgY2hhciAqc2VjdGlvbjsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgY2FsbGJhY2tfdCBjYWxsYmFjazsKLSAgICAgdm9pZCAqZGF0YTsKLXsKLSAgLyogRG9uJ3QgcHJvY2VzcyBzZWN0aW9ucyBmcm9tIGZpbGVzIHdoaWNoIHdlcmUgZXhjbHVkZWQuICovCi0gIGlmIChwdHItPmV4Y2x1ZGVfZmlsZW5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBib29sZWFuIG1hdGNoOwotCi0gICAgICBpZiAod2lsZGNhcmRwIChwdHItPmV4Y2x1ZGVfZmlsZW5hbWUpKQotICAgICAgICAgbWF0Y2ggPSBmbm1hdGNoIChwdHItPmV4Y2x1ZGVfZmlsZW5hbWUsIGZpbGUtPmZpbGVuYW1lLCAwKSA9PSAwID8gdHJ1ZSA6IGZhbHNlOwotICAgICAgZWxzZQotICAgICAgICAgbWF0Y2ggPSBzdHJjbXAgKHB0ci0+ZXhjbHVkZV9maWxlbmFtZSwgZmlsZS0+ZmlsZW5hbWUpID09IDAgPyB0cnVlIDogZmFsc2U7Ci0KLSAgICAgIGlmIChtYXRjaCkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZmlsZS0+anVzdF9zeW1zX2ZsYWcgPT0gZmFsc2UpCi0gICAgewotICAgICAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gICAgICBib29sZWFuIHdpbGRjYXJkOwotCi0gICAgICBpZiAoc2VjdGlvbiA9PSBOVUxMKQotCXdpbGRjYXJkID0gZmFsc2U7Ci0gICAgICBlbHNlCi0Jd2lsZGNhcmQgPSB3aWxkY2FyZHAgKHNlY3Rpb24pOwotCi0gICAgICBmb3IgKHMgPSBmaWxlLT50aGVfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBib29sZWFuIG1hdGNoOwotCi0JICBpZiAoc2VjdGlvbiA9PSBOVUxMKQotCSAgICBtYXRjaCA9IHRydWU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChmaWxlLT50aGVfYmZkLCBzKTsKLQkgICAgICBpZiAod2lsZGNhcmQpCi0JCW1hdGNoID0gZm5tYXRjaCAoc2VjdGlvbiwgbmFtZSwgMCkgPT0gMCA/IHRydWUgOiBmYWxzZTsKLQkgICAgICBlbHNlCi0JCW1hdGNoID0gc3RyY21wIChzZWN0aW9uLCBuYW1lKSA9PSAwID8gdHJ1ZSA6IGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChtYXRjaCkKLQkgICAgKCpjYWxsYmFjaykgKHB0ciwgcywgZmlsZSwgZGF0YSk7Ci0JfQotICAgIH0KLX0KLQotLyogSGFuZGxlIGEgd2lsZCBzdGF0ZW1lbnQgZm9yIGEgc2luZ2xlIGZpbGUgRi4gICovCi0KLXN0YXRpYyB2b2lkCi13YWxrX3dpbGRfZmlsZSAocywgc2VjdGlvbiwgZiwgY2FsbGJhY2ssIGRhdGEpCi0gICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqczsKLSAgICAgY29uc3QgY2hhciAqc2VjdGlvbjsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZjsKLSAgICAgY2FsbGJhY2tfdCBjYWxsYmFjazsKLSAgICAgdm9pZCAqZGF0YTsKLXsKLSAgaWYgKGYtPnRoZV9iZmQgPT0gTlVMTAotICAgICAgfHwgISBiZmRfY2hlY2tfZm9ybWF0IChmLT50aGVfYmZkLCBiZmRfYXJjaGl2ZSkpCi0gICAgd2Fsa193aWxkX3NlY3Rpb24gKHMsIHNlY3Rpb24sIGYsIGNhbGxiYWNrLCBkYXRhKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZCAqbWVtYmVyOwotCi0gICAgICAvKiBUaGlzIGlzIGFuIGFyY2hpdmUgZmlsZS4gIFdlIG11c3QgbWFwIGVhY2ggbWVtYmVyIG9mIHRoZQotCSBhcmNoaXZlIHNlcGFyYXRlbHkuICAqLwotICAgICAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZi0+dGhlX2JmZCwgKGJmZCAqKSBOVUxMKTsKLSAgICAgIHdoaWxlIChtZW1iZXIgIT0gTlVMTCkKLQl7Ci0JICAvKiBXaGVuIGxvb2t1cF9uYW1lIGlzIGNhbGxlZCwgaXQgd2lsbCBjYWxsIHRoZSBhZGRfc3ltYm9scwotCSAgICAgZW50cnkgcG9pbnQgZm9yIHRoZSBhcmNoaXZlLiAgRm9yIGVhY2ggZWxlbWVudCBvZiB0aGUKLQkgICAgIGFyY2hpdmUgd2hpY2ggaXMgaW5jbHVkZWQsIEJGRCB3aWxsIGNhbGwgbGRsYW5nX2FkZF9maWxlLAotCSAgICAgd2hpY2ggd2lsbCBzZXQgdGhlIHVzcmRhdGEgZmllbGQgb2YgdGhlIG1lbWJlciB0byB0aGUKLQkgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50LiAgKi8KLQkgIGlmIChtZW1iZXItPnVzcmRhdGEgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHdhbGtfd2lsZF9zZWN0aW9uIChzLCBzZWN0aW9uLAotCQkJCSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBtZW1iZXItPnVzcmRhdGEsCi0JCQkJIGNhbGxiYWNrLCBkYXRhKTsKLQkgICAgfQotCi0JICBtZW1iZXIgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChmLT50aGVfYmZkLCBtZW1iZXIpOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi13YWxrX3dpbGQgKHMsIHNlY3Rpb24sIGZpbGUsIGNhbGxiYWNrLCBkYXRhKQotICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnM7Ci0gICAgIGNvbnN0IGNoYXIgKnNlY3Rpb247Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci0gICAgIGNhbGxiYWNrX3QgY2FsbGJhY2s7Ci0gICAgIHZvaWQgKmRhdGE7Ci17Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmY7Ci0KLSAgaWYgKGZpbGUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBQZXJmb3JtIHRoZSBpdGVyYXRpb24gb3ZlciBhbGwgZmlsZXMgaW4gdGhlIGxpc3QuICAqLwotICAgICAgZm9yIChmID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZmlsZV9jaGFpbi5oZWFkOwotCSAgIGYgIT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgTlVMTDsKLQkgICBmID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZi0+bmV4dCkKLQl7Ci0JICB3YWxrX3dpbGRfZmlsZSAocywgc2VjdGlvbiwgZiwgY2FsbGJhY2ssIGRhdGEpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHdpbGRjYXJkcCAoZmlsZSkpCi0gICAgewotICAgICAgZm9yIChmID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZmlsZV9jaGFpbi5oZWFkOwotCSAgIGYgIT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgTlVMTDsKLQkgICBmID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZi0+bmV4dCkKLQl7Ci0JICBpZiAoZm5tYXRjaCAoZmlsZSwgZi0+ZmlsZW5hbWUsIEZOTV9GSUxFX05BTUUpID09IDApCi0JICAgIHdhbGtfd2lsZF9maWxlIChzLCBzZWN0aW9uLCBmLCBjYWxsYmFjaywgZGF0YSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFBlcmZvcm0gdGhlIGl0ZXJhdGlvbiBvdmVyIGEgc2luZ2xlIGZpbGUuICAqLwotICAgICAgZiA9IGxvb2t1cF9uYW1lIChmaWxlKTsKLSAgICAgIHdhbGtfd2lsZF9maWxlIChzLCBzZWN0aW9uLCBmLCBjYWxsYmFjaywgZGF0YSk7Ci0gICAgfQotfSAgCi0gICAgIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IHdhbGtzIHRoZSBwYXJzZSB0cmVlIGFuZCBjYWxscyB0aGUgcHJvdmlkZWQKLSAgZnVuY3Rpb24gZm9yIGVhY2ggbm9kZQotKi8KLQotc3RhdGljIHZvaWQKLWxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlciAoZnVuYywgcykKLSAgICAgdm9pZCAoKmZ1bmMpIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBmb3IgKDsgcyAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBmdW5jIChzKTsKLQotICAgICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLQl7Ci0JY2FzZSBsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlciAoZnVuYywgY29uc3RydWN0b3JfbGlzdC5oZWFkKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlcgotCSAgICAoZnVuYywKLQkgICAgIHMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotCSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyCi0JICAgIChmdW5jLAotCSAgICAgcy0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW06Ci0JICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIgKGZ1bmMsCi0JCQkJCSAgcy0+Z3JvdXBfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKLQljYXNlIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2ZpbGxfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgRkFJTCAoKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLXZvaWQKLWxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChmdW5jKQotICAgICB2b2lkICgqZnVuYykgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci17Ci0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlciAoZnVuYywKLQkJCQkgIHN0YXRlbWVudF9saXN0LmhlYWQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZAotbGFuZ19saXN0X2luaXQgKGxpc3QpCi0gICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqbGlzdDsKLXsKLSAgbGlzdC0+aGVhZCA9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7Ci0gIGxpc3QtPnRhaWwgPSAmbGlzdC0+aGVhZDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgYnVpbGQgYSBuZXcgc3RhdGVtZW50IG5vZGUgZm9yIHRoZSBwYXJzZSB0cmVlCi0KLSAqLwotCi1zdGF0aWMKLWxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKgotbmV3X3N0YXRlbWVudCAodHlwZSwgc2l6ZSwgbGlzdCkKLSAgICAgZW51bSBzdGF0ZW1lbnRfZW51bSB0eXBlOwotICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICogbGlzdDsKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqbmV3ID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikKLSAgc3RhdF9hbGxvYyAoc2l6ZSk7Ci0KLSAgbmV3LT5oZWFkZXIudHlwZSA9IHR5cGU7Ci0gIG5ldy0+aGVhZGVyLm5leHQgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOwotICBsYW5nX3N0YXRlbWVudF9hcHBlbmQgKGxpc3QsIG5ldywgJm5ldy0+aGVhZGVyLm5leHQpOwotICByZXR1cm4gbmV3OwotfQotCi0vKgotICBCdWlsZCBhIG5ldyBpbnB1dCBmaWxlIG5vZGUgZm9yIHRoZSBsYW5ndWFnZS4gVGhlcmUgYXJlIHNldmVyYWwgd2F5cwotICBpbiB3aGljaCB3ZSB0cmVhdCBhbiBpbnB1dCBmaWxlLCBlZywgd2Ugb25seSBsb29rIGF0IHN5bWJvbHMsIG9yCi0gIHByZWZpeCBpdCB3aXRoIGEgLWwgZXRjLgotCi0gIFdlIGNhbiBiZSBzdXBwbGllZCB3aXRoIHJlcXVlc3RzIGZvciBpbnB1dCBmaWxlcyBtb3JlIHRoYW4gb25jZTsKLSAgdGhleSBtYXksIGZvciBleGFtcGxlIGJlIHNwbGl0IG92ZXIgc2VydmVyYWwgbGluZXMgbGlrZSBmb28ubygudGV4dCkKLSAgZm9vLm8oLmRhdGEpIGV0Yywgc28gd2hlbiBhc2tlZCBmb3IgYSBmaWxlIHdlIGNoZWNrIHRoYXQgd2UgaGF2bid0Ci0gIGdvdCBpdCBhbHJlYWR5IHNvIHdlIGRvbid0IGR1cGxpY2F0ZSB0aGUgYmZkLgotCi0gKi8KLXN0YXRpYyBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICoKLW5ld19hZmlsZSAobmFtZSwgZmlsZV90eXBlLCB0YXJnZXQsIGFkZF90b19saXN0KQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBsYW5nX2lucHV0X2ZpbGVfZW51bV90eXBlIGZpbGVfdHlwZTsKLSAgICAgQ09OU1QgY2hhciAqdGFyZ2V0OwotICAgICBib29sZWFuIGFkZF90b19saXN0OwotewotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpwOwotCi0gIGlmIChhZGRfdG9fbGlzdCkKLSAgICBwID0gbmV3X3N0YXQgKGxhbmdfaW5wdXRfc3RhdGVtZW50LCBzdGF0X3B0cik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwID0gKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopCi0JICAgc3RhdF9hbGxvYyAoc2l6ZW9mIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlKSkpOwotICAgICAgcC0+aGVhZGVyLm5leHQgPSBOVUxMOwotICAgIH0KLQotICBsYW5nX2hhc19pbnB1dF9maWxlID0gdHJ1ZTsKLSAgcC0+dGFyZ2V0ID0gdGFyZ2V0OwotICBzd2l0Y2ggKGZpbGVfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBsYW5nX2lucHV0X2ZpbGVfaXNfc3ltYm9sc19vbmx5X2VudW06Ci0gICAgICBwLT5maWxlbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5pc19hcmNoaXZlID0gZmFsc2U7Ci0gICAgICBwLT5yZWFsID0gdHJ1ZTsKLSAgICAgIHAtPmxvY2FsX3N5bV9uYW1lID0gbmFtZTsKLSAgICAgIHAtPmp1c3Rfc3ltc19mbGFnID0gdHJ1ZTsKLSAgICAgIHAtPnNlYXJjaF9kaXJzX2ZsYWcgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19pbnB1dF9maWxlX2lzX2Zha2VfZW51bToKLSAgICAgIHAtPmZpbGVuYW1lID0gbmFtZTsKLSAgICAgIHAtPmlzX2FyY2hpdmUgPSBmYWxzZTsKLSAgICAgIHAtPnJlYWwgPSBmYWxzZTsKLSAgICAgIHAtPmxvY2FsX3N5bV9uYW1lID0gbmFtZTsKLSAgICAgIHAtPmp1c3Rfc3ltc19mbGFnID0gZmFsc2U7Ci0gICAgICBwLT5zZWFyY2hfZGlyc19mbGFnID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfaW5wdXRfZmlsZV9pc19sX2VudW06Ci0gICAgICBwLT5pc19hcmNoaXZlID0gdHJ1ZTsKLSAgICAgIHAtPmZpbGVuYW1lID0gbmFtZTsKLSAgICAgIHAtPnJlYWwgPSB0cnVlOwotICAgICAgcC0+bG9jYWxfc3ltX25hbWUgPSBjb25jYXQgKCItbCIsIG5hbWUsIChjb25zdCBjaGFyICopIE5VTEwpOwotICAgICAgcC0+anVzdF9zeW1zX2ZsYWcgPSBmYWxzZTsKLSAgICAgIHAtPnNlYXJjaF9kaXJzX2ZsYWcgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2lucHV0X2ZpbGVfaXNfbWFya2VyX2VudW06Ci0gICAgICBwLT5maWxlbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5pc19hcmNoaXZlID0gZmFsc2U7Ci0gICAgICBwLT5yZWFsID0gZmFsc2U7Ci0gICAgICBwLT5sb2NhbF9zeW1fbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5qdXN0X3N5bXNfZmxhZyA9IGZhbHNlOwotICAgICAgcC0+c2VhcmNoX2RpcnNfZmxhZyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfaW5wdXRfZmlsZV9pc19zZWFyY2hfZmlsZV9lbnVtOgotICAgICAgcC0+ZmlsZW5hbWUgPSBuYW1lOwotICAgICAgcC0+aXNfYXJjaGl2ZSA9IGZhbHNlOwotICAgICAgcC0+cmVhbCA9IHRydWU7Ci0gICAgICBwLT5sb2NhbF9zeW1fbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5qdXN0X3N5bXNfZmxhZyA9IGZhbHNlOwotICAgICAgcC0+c2VhcmNoX2RpcnNfZmxhZyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfaW5wdXRfZmlsZV9pc19maWxlX2VudW06Ci0gICAgICBwLT5maWxlbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5pc19hcmNoaXZlID0gZmFsc2U7Ci0gICAgICBwLT5yZWFsID0gdHJ1ZTsKLSAgICAgIHAtPmxvY2FsX3N5bV9uYW1lID0gbmFtZTsKLSAgICAgIHAtPmp1c3Rfc3ltc19mbGFnID0gZmFsc2U7Ci0gICAgICBwLT5zZWFyY2hfZGlyc19mbGFnID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRkFJTCAoKTsKLSAgICB9Ci0gIHAtPnRoZV9iZmQgPSAoYmZkICopIE5VTEw7Ci0gIHAtPmFzeW1ib2xzID0gKGFzeW1ib2wgKiopIE5VTEw7Ci0gIHAtPm5leHRfcmVhbF9maWxlID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsKLSAgcC0+bmV4dCA9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7Ci0gIHAtPnN5bWJvbF9jb3VudCA9IDA7Ci0gIHAtPmR5bmFtaWMgPSBjb25maWcuZHluYW1pY19saW5rOwotICBwLT53aG9sZV9hcmNoaXZlID0gd2hvbGVfYXJjaGl2ZTsKLSAgcC0+bG9hZGVkID0gZmFsc2U7Ci0gIGxhbmdfc3RhdGVtZW50X2FwcGVuZCAoJmlucHV0X2ZpbGVfY2hhaW4sCi0JCQkgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgcCwKLQkJCSAmcC0+bmV4dF9yZWFsX2ZpbGUpOwotICByZXR1cm4gcDsKLX0KLQotbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqCi1sYW5nX2FkZF9pbnB1dF9maWxlIChuYW1lLCBmaWxlX3R5cGUsIHRhcmdldCkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgbGFuZ19pbnB1dF9maWxlX2VudW1fdHlwZSBmaWxlX3R5cGU7Ci0gICAgIENPTlNUIGNoYXIgKnRhcmdldDsKLXsKLSAgbGFuZ19oYXNfaW5wdXRfZmlsZSA9IHRydWU7Ci0gIHJldHVybiBuZXdfYWZpbGUgKG5hbWUsIGZpbGVfdHlwZSwgdGFyZ2V0LCB0cnVlKTsKLX0KLQotLyogQnVpbGQgZW5vdWdoIHN0YXRlIHNvIHRoYXQgdGhlIHBhcnNlciBjYW4gYnVpbGQgaXRzIHRyZWUgKi8KLXZvaWQKLWxhbmdfaW5pdCAoKQotewotICBvYnN0YWNrX2JlZ2luICgmc3RhdF9vYnN0YWNrLCAxMDAwKTsKLQotICBzdGF0X3B0ciA9ICZzdGF0ZW1lbnRfbGlzdDsKLQotICBsYW5nX2xpc3RfaW5pdCAoc3RhdF9wdHIpOwotCi0gIGxhbmdfbGlzdF9pbml0ICgmaW5wdXRfZmlsZV9jaGFpbik7Ci0gIGxhbmdfbGlzdF9pbml0ICgmbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotICBsYW5nX2xpc3RfaW5pdCAoJmZpbGVfY2hhaW4pOwotICBmaXJzdF9maWxlID0gbGFuZ19hZGRfaW5wdXRfZmlsZSAoKGNoYXIgKikgTlVMTCwKLQkJCQkgICAgbGFuZ19pbnB1dF9maWxlX2lzX21hcmtlcl9lbnVtLAotCQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLSAgYWJzX291dHB1dF9zZWN0aW9uID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwIChCRkRfQUJTX1NFQ1RJT05fTkFNRSk7Ci0KLSAgYWJzX291dHB1dF9zZWN0aW9uLT5iZmRfc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gQSByZWdpb24gaXMgYW4gYXJlYSBvZiBtZW1vcnkgZGVjbGFyZWQgd2l0aCB0aGUKLSBNRU1PUlkgeyAgbmFtZTpvcmc9ZXhwLCBsZW49ZXhwIC4uLiB9Ci0gc3ludGF4LgotCi0gV2UgbWFpbnRhaW4gYSBsaXN0IG9mIGFsbCB0aGUgcmVnaW9ucyBoZXJlCi0KLSBJZiBubyByZWdpb25zIGFyZSBzcGVjaWZpZWQgaW4gdGhlIHNjcmlwdCwgdGhlbiB0aGUgZGVmYXVsdCBpcyB1c2VkCi0gd2hpY2ggaXMgY3JlYXRlZCB3aGVuIGxvb2tlZCB1cCB0byBiZSB0aGUgZW50aXJlIGRhdGEgc3BhY2UKLSovCi0KLXN0YXRpYyBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3Q7Ci1zdGF0aWMgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKipsYW5nX21lbW9yeV9yZWdpb25fbGlzdF90YWlsID0gJmxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0OwotCi1sYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqCi1sYW5nX21lbW9yeV9yZWdpb25fbG9va3VwIChuYW1lKQotICAgICBDT05TVCBjaGFyICpDT05TVCBuYW1lOwotewotICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqcDsKLQotICBmb3IgKHAgPSBsYW5nX21lbW9yeV9yZWdpb25fbGlzdDsKLSAgICAgICBwICE9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMOwotICAgICAgIHAgPSBwLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHAtPm5hbWUsIG5hbWUpID09IDApCi0JewotCSAgcmV0dXJuIHA7Ci0JfQotICAgIH0KLQotI2lmIDAKLSAgLyogVGhpcyBjb2RlIHVzZWQgdG8gYWx3YXlzIHVzZSB0aGUgZmlyc3QgcmVnaW9uIGluIHRoZSBsaXN0IGFzIHRoZQotICAgICBkZWZhdWx0IHJlZ2lvbi4gIEkgY2hhbmdlZCBpdCB0byBpbnN0ZWFkIHVzZSBhIHJlZ2lvbgotICAgICBlbmNvbXBhc3NpbmcgYWxsIG9mIG1lbW9yeSBhcyB0aGUgZGVmYXVsdCByZWdpb24uICBUaGlzIHBlcm1pdHMKLSAgICAgTk9MT0FEIHNlY3Rpb25zIHRvIHdvcmsgcmVhc29uYWJseSB3aXRob3V0IHJlcXVpcmluZyBhIHJlZ2lvbi4KLSAgICAgUGVvcGxlIHNob3VsZCBzcGVjaWZ5IHdoYXQgcmVnaW9uIHRoZXkgbWVhbiwgaWYgdGhleSByZWFsbHkgd2FudAotICAgICBhIHJlZ2lvbi4gICovCi0gIGlmIChzdHJjbXAgKG5hbWUsICIqZGVmYXVsdCoiKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChsYW5nX21lbW9yeV9yZWdpb25fbGlzdCAhPSAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKikgTlVMTCkKLQl7Ci0JICByZXR1cm4gbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3Q7Ci0JfQotICAgIH0KLSNlbmRpZgotCi0gIHsKLSAgICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqbmV3ID0KLSAgICAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSkpOwotCi0gICAgbmV3LT5uYW1lID0gYnV5c3RyaW5nIChuYW1lKTsKLSAgICBuZXctPm5leHQgPSAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKikgTlVMTDsKLQotICAgICpsYW5nX21lbW9yeV9yZWdpb25fbGlzdF90YWlsID0gbmV3OwotICAgIGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0X3RhaWwgPSAmbmV3LT5uZXh0OwotICAgIG5ldy0+b3JpZ2luID0gMDsKLSAgICBuZXctPmZsYWdzID0gMDsKLSAgICBuZXctPm5vdF9mbGFncyA9IDA7Ci0gICAgbmV3LT5sZW5ndGggPSB+KGJmZF9zaXplX3R5cGUpMDsKLSAgICBuZXctPmN1cnJlbnQgPSAwOwotICAgIG5ldy0+aGFkX2Z1bGxfbWVzc2FnZSA9IGZhbHNlOwotCi0gICAgcmV0dXJuIG5ldzsKLSAgfQotfQotCi0KLWxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICoKLWxhbmdfbWVtb3J5X2RlZmF1bHQgKHNlY3Rpb24pCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqcDsKLQotICBmbGFnd29yZCBzZWNfZmxhZ3MgPSBzZWN0aW9uLT5mbGFnczsKLQotICAvKiBPdmVycmlkZSBTRUNfREFUQSB0byBtZWFuIGEgd3JpdGFibGUgc2VjdGlvbi4gICovCi0gIGlmICgoc2VjX2ZsYWdzICYgKFNFQ19BTExPQyB8IFNFQ19SRUFET05MWSB8IFNFQ19DT0RFKSkgPT0gU0VDX0FMTE9DKQotICAgIHNlY19mbGFncyB8PSBTRUNfREFUQTsKLQotICBmb3IgKHAgPSBsYW5nX21lbW9yeV9yZWdpb25fbGlzdDsKLSAgICAgICBwICE9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMOwotICAgICAgIHAgPSBwLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgocC0+ZmxhZ3MgJiBzZWNfZmxhZ3MpICE9IDAKLQkgICYmIChwLT5ub3RfZmxhZ3MgJiBzZWNfZmxhZ3MpID09IDApCi0JewotCSAgcmV0dXJuIHA7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAgKCIqZGVmYXVsdCoiKTsKLX0KLQotbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqCi1sYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKkNPTlNUIG5hbWU7Ci17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnU7Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmxvb2t1cDsKLQotICBmb3IgKHUgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5oZWFkOwotICAgICAgIHUgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsKLSAgICAgICB1ID0gbG9va3VwLT5uZXh0KQotICAgIHsKLSAgICAgIGxvb2t1cCA9ICZ1LT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCBsb29rdXAtPm5hbWUpID09IDApCi0JewotCSAgcmV0dXJuIGxvb2t1cDsKLQl9Ci0gICAgfQotICByZXR1cm4gKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKikgTlVMTDsKLX0KLQotbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqCi1sYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKkNPTlNUIG5hbWU7Ci17Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmxvb2t1cDsKLQotICBsb29rdXAgPSBsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQgKG5hbWUpOwotICBpZiAobG9va3VwID09IChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICopIE5VTEwpCi0gICAgewotCi0gICAgICBsb29rdXAgPSAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKQotCW5ld19zdGF0IChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwgc3RhdF9wdHIpOwotICAgICAgbG9va3VwLT5yZWdpb24gPSAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKikgTlVMTDsKLSAgICAgIGxvb2t1cC0+ZmlsbCA9IDA7Ci0gICAgICBsb29rdXAtPmJsb2NrX3ZhbHVlID0gMTsKLSAgICAgIGxvb2t1cC0+bmFtZSA9IG5hbWU7Ci0KLSAgICAgIGxvb2t1cC0+bmV4dCA9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7Ci0gICAgICBsb29rdXAtPmJmZF9zZWN0aW9uID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gICAgICBsb29rdXAtPnByb2Nlc3NlZCA9IGZhbHNlOwotICAgICAgbG9va3VwLT5zZWN0eXBlID0gbm9ybWFsX3NlY3Rpb247Ci0gICAgICBsb29rdXAtPmFkZHJfdHJlZSA9IChldHJlZV90eXBlICopIE5VTEw7Ci0gICAgICBsYW5nX2xpc3RfaW5pdCAoJmxvb2t1cC0+Y2hpbGRyZW4pOwotCi0gICAgICBsb29rdXAtPm1lbXNwZWMgPSAoQ09OU1QgY2hhciAqKSBOVUxMOwotICAgICAgbG9va3VwLT5mbGFncyA9IDA7Ci0gICAgICBsb29rdXAtPnN1YnNlY3Rpb25fYWxpZ25tZW50ID0gLTE7Ci0gICAgICBsb29rdXAtPnNlY3Rpb25fYWxpZ25tZW50ID0gLTE7Ci0gICAgICBsb29rdXAtPmxvYWRfYmFzZSA9ICh1bmlvbiBldHJlZV91bmlvbiAqKSBOVUxMOwotICAgICAgbG9va3VwLT5waGRycyA9IE5VTEw7Ci0KLSAgICAgIGxhbmdfc3RhdGVtZW50X2FwcGVuZCAoJmxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCQkJICAgICAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBsb29rdXAsCi0JCQkgICAgICZsb29rdXAtPm5leHQpOwotICAgIH0KLSAgcmV0dXJuIGxvb2t1cDsKLX0KLQotc3RhdGljIHZvaWQKLWxhbmdfbWFwX2ZsYWdzIChmbGFnKQotICAgICBmbGFnd29yZCBmbGFnOwotewotICBpZiAoZmxhZyAmIFNFQ19BTExPQykKLSAgICBtaW5mbyAoImEiKTsKLQotICBpZiAoZmxhZyAmIFNFQ19DT0RFKQotICAgIG1pbmZvICgieCIpOwotCi0gIGlmIChmbGFnICYgU0VDX1JFQURPTkxZKQotICAgIG1pbmZvICgiciIpOwotCi0gIGlmIChmbGFnICYgU0VDX0RBVEEpCi0gICAgbWluZm8gKCJ3Iik7Ci0KLSAgaWYgKGZsYWcgJiBTRUNfTE9BRCkKLSAgICBtaW5mbyAoImwiKTsKLX0KLQotdm9pZAotbGFuZ19tYXAgKCkKLXsKLSAgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKm07Ci0KLSAgbWluZm8gKF8oIlxuTWVtb3J5IENvbmZpZ3VyYXRpb25cblxuIikpOwotICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICIlLTE2cyAlLTE4cyAlLTE4cyAlc1xuIiwKLQkgICBfKCJOYW1lIiksIF8oIk9yaWdpbiIpLCBfKCJMZW5ndGgiKSwgXygiQXR0cmlidXRlcyIpKTsKLQotICBmb3IgKG0gPSBsYW5nX21lbW9yeV9yZWdpb25fbGlzdDsKLSAgICAgICBtICE9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMOwotICAgICAgIG0gPSBtLT5uZXh0KQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzEwMF07Ci0gICAgICBpbnQgbGVuOwotCi0gICAgICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICIlLTE2cyAiLCBtLT5uYW1lKTsKLQotICAgICAgc3ByaW50Zl92bWEgKGJ1ZiwgbS0+b3JpZ2luKTsKLSAgICAgIG1pbmZvICgiMHglcyAiLCBidWYpOwotICAgICAgbGVuID0gc3RybGVuIChidWYpOwotICAgICAgd2hpbGUgKGxlbiA8IDE2KQotCXsKLQkgIHByaW50X3NwYWNlICgpOwotCSAgKytsZW47Ci0JfQotCi0gICAgICBtaW5mbyAoIjB4JVYiLCBtLT5sZW5ndGgpOwotICAgICAgaWYgKG0tPmZsYWdzIHx8IG0tPm5vdF9mbGFncykKLQl7Ci0jaWZuZGVmIEJGRDY0Ci0JICBtaW5mbyAoIiAgICAgICAgIik7Ci0jZW5kaWYKLQkgIGlmIChtLT5mbGFncykKLQkgICAgewotCSAgICAgIHByaW50X3NwYWNlICgpOwotCSAgICAgIGxhbmdfbWFwX2ZsYWdzIChtLT5mbGFncyk7Ci0JICAgIH0KLQotCSAgaWYgKG0tPm5vdF9mbGFncykKLQkgICAgewotCSAgICAgIG1pbmZvICgiICEiKTsKLQkgICAgICBsYW5nX21hcF9mbGFncyAobS0+bm90X2ZsYWdzKTsKLQkgICAgfQotCX0KLQotICAgICAgcHJpbnRfbmwgKCk7Ci0gICAgfQotCi0gIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgXygiXG5MaW5rZXIgc2NyaXB0IGFuZCBtZW1vcnkgbWFwXG5cbiIpKTsKLQotICBwcmludF9zdGF0ZW1lbnRzICgpOwotfQotCi0vKiBJbml0aWFsaXplIGFuIG91dHB1dCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWluaXRfb3MgKHMpCi0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIHNlY3Rpb25fdXNlcmRhdGFfdHlwZSAqbmV3OwotCi0gIGlmIChzLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHJldHVybjsKLQotICBpZiAoc3RyY21wIChzLT5uYW1lLCBESVNDQVJEX1NFQ1RJT05fTkFNRSkgPT0gMCkKLSAgICBlaW5mbyAoXygiJVAlRjogSWxsZWdhbCB1c2Ugb2YgYCVzJyBzZWN0aW9uIiksIERJU0NBUkRfU0VDVElPTl9OQU1FKTsKLQotICBuZXcgPSAoKHNlY3Rpb25fdXNlcmRhdGFfdHlwZSAqKQotCSBzdGF0X2FsbG9jIChzaXplb2YgKHNlY3Rpb25fdXNlcmRhdGFfdHlwZSkpKTsKLQotICBzLT5iZmRfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBzLT5uYW1lKTsKLSAgaWYgKHMtPmJmZF9zZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHMtPmJmZF9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0cHV0X2JmZCwgcy0+bmFtZSk7Ci0gIGlmIChzLT5iZmRfc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBlaW5mbyAoXygiJVAlRjogb3V0cHV0IGZvcm1hdCAlcyBjYW5ub3QgcmVwcmVzZW50IHNlY3Rpb24gY2FsbGVkICVzXG4iKSwKLQkgICAgIG91dHB1dF9iZmQtPnh2ZWMtPm5hbWUsIHMtPm5hbWUpOwotICAgIH0KLSAgcy0+YmZkX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uID0gcy0+YmZkX3NlY3Rpb247Ci0KLSAgLyogV2UgaW5pdGlhbGl6ZSBhbiBvdXRwdXQgc2VjdGlvbnMgb3V0cHV0IG9mZnNldCB0byBtaW51cyBpdHMgb3duICovCi0gIC8qIHZtYSB0byBhbGxvdyB1cyB0byBvdXRwdXQgYSBzZWN0aW9uIHRocm91Z2ggaXRzZWxmICovCi0gIHMtPmJmZF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ID0gMDsKLSAgZ2V0X3VzZXJkYXRhIChzLT5iZmRfc2VjdGlvbikgPSAoUFRSKSBuZXc7Ci0KLSAgLyogSWYgdGhlcmUgaXMgYSBiYXNlIGFkZHJlc3MsIG1ha2Ugc3VyZSB0aGF0IGFueSBzZWN0aW9ucyBpdCBtaWdodAotICAgICBtZW50aW9uIGFyZSBpbml0aWFsaXplZC4gICovCi0gIGlmIChzLT5hZGRyX3RyZWUgIT0gTlVMTCkKLSAgICBleHBfaW5pdF9vcyAocy0+YWRkcl90cmVlKTsKLX0KLQotLyogTWFrZSBzdXJlIHRoYXQgYWxsIG91dHB1dCBzZWN0aW9ucyBtZW50aW9uZWQgaW4gYW4gZXhwcmVzc2lvbiBhcmUKLSAgIGluaXRpYWxpemVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWV4cF9pbml0X29zIChleHApCi0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgc3dpdGNoIChleHAtPnR5cGUubm9kZV9jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBldHJlZV9hc3NpZ246Ci0gICAgICBleHBfaW5pdF9vcyAoZXhwLT5hc3NpZ24uc3JjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9iaW5hcnk6Ci0gICAgICBleHBfaW5pdF9vcyAoZXhwLT5iaW5hcnkubGhzKTsKLSAgICAgIGV4cF9pbml0X29zIChleHAtPmJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3RyaW5hcnk6Ci0gICAgICBleHBfaW5pdF9vcyAoZXhwLT50cmluYXJ5LmNvbmQpOwotICAgICAgZXhwX2luaXRfb3MgKGV4cC0+dHJpbmFyeS5saHMpOwotICAgICAgZXhwX2luaXRfb3MgKGV4cC0+dHJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3VuYXJ5OgotICAgICAgZXhwX2luaXRfb3MgKGV4cC0+dW5hcnkuY2hpbGQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX25hbWU6Ci0gICAgICBzd2l0Y2ggKGV4cC0+dHlwZS5ub2RlX2NvZGUpCi0JewotCWNhc2UgQUREUjoKLQljYXNlIExPQURBRERSOgotCWNhc2UgU0laRU9GOgotCSAgewotCSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotCSAgICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAoZXhwLT5uYW1lLm5hbWUpOwotCSAgICBpZiAob3MgIT0gTlVMTCAmJiBvcy0+YmZkX3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgICBpbml0X29zIChvcyk7Ci0JICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBTZWN0aW9ucyBtYXJrZWQgd2l0aCB0aGUgU0VDX0xJTktfT05DRSBmbGFnIHNob3VsZCBvbmx5IGJlIGxpbmtlZAotICAgb25jZSBpbnRvIHRoZSBvdXRwdXQuICBUaGlzIHJvdXRpbmUgY2hlY2tzIGVhY2ggc2VjdGlvbnMsIGFuZAotICAgYXJyYW5nZXMgdG8gZGlzY2FyZCBpdCBpZiBhIHNlY3Rpb24gb2YgdGhlIHNhbWUgbmFtZSBoYXMgYWxyZWFkeQotICAgYmVlbiBsaW5rZWQuICBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IGFsbCByZWxldmFudCBzZWN0aW9ucyBoYXZlIHRoZQotICAgU0VDX0xJTktfT05DRSBmbGFnIHNldDsgdGhhdCBpcywgaXQgZG9lcyBub3QgZGVwZW5kIHNvbGVseSB1cG9uIHRoZQotICAgc2VjdGlvbiBuYW1lLiAgVGhpcyBpcyBjYWxsZWQgdmlhIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLXNlY3Rpb25fYWxyZWFkeV9saW5rZWQgKGFiZmQsIHNlYywgZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnkgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBkYXRhOwotICBzdHJ1Y3Qgc2VjX2xpbmtfb25jZQotICAgIHsKLSAgICAgIHN0cnVjdCBzZWNfbGlua19vbmNlICpuZXh0OwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICB9OwotICBzdGF0aWMgc3RydWN0IHNlY19saW5rX29uY2UgKnNlY19saW5rX29uY2VfbGlzdDsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBzZWNfbGlua19vbmNlICpsOwotCi0gIC8qIElmIHdlIGFyZSBvbmx5IHJlYWRpbmcgc3ltYm9scyBmcm9tIHRoaXMgb2JqZWN0LCB0aGVuIHdlIHdhbnQgdG8KLSAgICAgZGlzY2FyZCBhbGwgc2VjdGlvbnMuICAqLwotICBpZiAoZW50cnktPmp1c3Rfc3ltc19mbGFnKQotICAgIHsKLSAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgc2VjLT5vdXRwdXRfb2Zmc2V0ID0gc2VjLT52bWE7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpOwotCi0gIGlmICgoZmxhZ3MgJiBTRUNfTElOS19PTkNFKSA9PSAwKQotICAgIHJldHVybjsKLQotICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0KLSAgZm9yIChsID0gc2VjX2xpbmtfb25jZV9saXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChsLT5zZWMtPm93bmVyLCBsLT5zZWMpKSA9PSAwKQotCXsKLQkgIC8qIFRoZSBzZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gbGlua2VkLiAgU2VlIGlmIHdlIHNob3VsZAotICAgICAgICAgICAgIGlzc3VlIGEgd2FybmluZy4gICovCi0JICBzd2l0Y2ggKGZsYWdzICYgU0VDX0xJTktfRFVQTElDQVRFUykKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIGNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19PTkVfT05MWToKLQkgICAgICBlaW5mbyAoXygiJVA6ICVCOiB3YXJuaW5nOiBpZ25vcmluZyBkdXBsaWNhdGUgc2VjdGlvbiBgJXMnXG4iKSwKLQkJICAgICBhYmZkLCBuYW1lKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUzoKLQkgICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIHJlYWxseSBkaWcgb3V0IHRoZSBjb250ZW50cyBvZiBib3RoCi0gICAgICAgICAgICAgICAgIHNlY3Rpb25zIGFuZCBtZW1jbXAgdGhlbS4gIFRoZSBDT0ZGL1BFIHNwZWMgc2F5cyB0aGF0Ci0gICAgICAgICAgICAgICAgIHRoZSBNaWNyb3NvZnQgbGlua2VyIGRvZXMgbm90IGltcGxlbWVudCB0aGlzCi0gICAgICAgICAgICAgICAgIGNvcnJlY3RseSwgc28gSSdtIG5vdCBnb2luZyB0byBib3RoZXIgZG9pbmcgaXQKLSAgICAgICAgICAgICAgICAgZWl0aGVyLiAgKi8KLQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICBjYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFOgotCSAgICAgIGlmIChiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpCi0JCSAgIT0gYmZkX3NlY3Rpb25fc2l6ZSAobC0+c2VjLT5vd25lciwgbC0+c2VjKSkKLQkJZWluZm8gKF8oIiVQOiAlQjogd2FybmluZzogZHVwbGljYXRlIHNlY3Rpb24gYCVzJyBoYXMgZGlmZmVyZW50IHNpemVcbiIpLAotCQkgICAgICAgYWJmZCwgbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogU2V0IHRoZSBvdXRwdXRfc2VjdGlvbiBmaWVsZCBzbyB0aGF0IHdpbGRfZG9pdCBkb2VzIG5vdAotCSAgICAgY3JlYXRlIGEgbGFuZ19pbnB1dF9zZWN0aW9uIHN0cnVjdHVyZSBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLQkgIHNlYy0+b3V0cHV0X3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCi0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBzZWN0aW9uIHdpdGggdGhpcyBuYW1lLiAgUmVjb3JkIGl0LiAgKi8KLQotICBsID0gKHN0cnVjdCBzZWNfbGlua19vbmNlICopIHhtYWxsb2MgKHNpemVvZiAqbCk7Ci0gIGwtPnNlYyA9IHNlYzsKLSAgbC0+bmV4dCA9IHNlY19saW5rX29uY2VfbGlzdDsKLSAgc2VjX2xpbmtfb25jZV9saXN0ID0gbDsKLX0KLQwKLS8qIFRoZSB3aWxkIHJvdXRpbmVzLgotCi0gICBUaGVzZSBleHBhbmQgc3RhdGVtZW50cyBsaWtlICooLnRleHQpIGFuZCBmb28ubyB0byBhIGxpc3Qgb2YKLSAgIGV4cGxpY2l0IGFjdGlvbnMsIGxpa2UgZm9vLm8oLnRleHQpLCBiYXIubygudGV4dCkgYW5kCi0gICBmb28ubygudGV4dCwgLmRhdGEpLiAgKi8KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIFBBVFRFUk4gYXJndW1lbnQgaXMgYSB3aWxkY2FyZCBwYXR0ZXJuLgotICAgQWx0aG91Z2ggYmFja3NsYXNoZXMgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5IGlmIGEgcGF0dGVybiBjb250YWlucwotICAgd2lsZGNhcmRzLCB3ZSBkbyBub3QgY29uc2lkZXIgdGhlIG1lcmUgcHJlc2VuY2Ugb2YgYSBiYWNrc2xhc2ggdG8KLSAgIGJlIGVub3VnaCB0byBjYXVzZSB0aGUgdGhlIHBhdHRlcm4gdG8gYmUgdHJlYXRlZCBhcyBhIHdpbGRjYXJkLgotICAgVGhhdCBsZXRzIHVzIGhhbmRsZSBET1MgZmlsZW5hbWVzIG1vcmUgbmF0dXJhbGx5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXdpbGRjYXJkcCAocGF0dGVybikKLSAgICAgY29uc3QgY2hhciAqcGF0dGVybjsKLXsKLSAgY29uc3QgY2hhciAqczsKLQotICBmb3IgKHMgPSBwYXR0ZXJuOyAqcyAhPSAnXDAnOyArK3MpCi0gICAgaWYgKCpzID09ICc/JwotCXx8ICpzID09ICcqJwotCXx8ICpzID09ICdbJykKLSAgICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEFkZCBTRUNUSU9OIHRvIHRoZSBvdXRwdXQgc2VjdGlvbiBPVVRQVVQuICBEbyB0aGlzIGJ5IGNyZWF0aW5nIGEKLSAgIGxhbmdfaW5wdXRfc2VjdGlvbiBzdGF0ZW1lbnQgd2hpY2ggaXMgcGxhY2VkIGF0IFBUUi4gIEZJTEUgaXMgdGhlCi0gICBpbnB1dCBmaWxlIHdoaWNoIGhvbGRzIFNFQ1RJT04uICAqLwotCi12b2lkCi13aWxkX2RvaXQgKHB0ciwgc2VjdGlvbiwgb3V0cHV0LCBmaWxlKQotICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKnB0cjsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGJvb2xlYW4gZGlzY2FyZDsKLQotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc2VjdGlvbi0+b3duZXIsIHNlY3Rpb24pOwotCi0gIGRpc2NhcmQgPSBmYWxzZTsKLQotICAvKiBJZiB3ZSBhcmUgZG9pbmcgYSBmaW5hbCBsaW5rLCBkaXNjYXJkIHNlY3Rpb25zIG1hcmtlZCB3aXRoCi0gICAgIFNFQ19FWENMVURFLiAgKi8KLSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZQotICAgICAgJiYgKGZsYWdzICYgU0VDX0VYQ0xVREUpICE9IDApCi0gICAgZGlzY2FyZCA9IHRydWU7Ci0KLSAgLyogRGlzY2FyZCBpbnB1dCBzZWN0aW9ucyB3aGljaCBhcmUgYXNzaWduZWQgdG8gYSBzZWN0aW9uIG5hbWVkCi0gICAgIERJU0NBUkRfU0VDVElPTl9OQU1FLiAgKi8KLSAgaWYgKHN0cmNtcCAob3V0cHV0LT5uYW1lLCBESVNDQVJEX1NFQ1RJT05fTkFNRSkgPT0gMCkKLSAgICBkaXNjYXJkID0gdHJ1ZTsKLQotICAvKiBEaXNjYXJkIGRlYnVnZ2luZyBzZWN0aW9ucyBpZiB3ZSBhcmUgc3RyaXBwaW5nIGRlYnVnZ2luZwotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIGlmICgobGlua19pbmZvLnN0cmlwID09IHN0cmlwX2RlYnVnZ2VyIHx8IGxpbmtfaW5mby5zdHJpcCA9PSBzdHJpcF9hbGwpCi0gICAgICAmJiAoZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotICAgIGRpc2NhcmQgPSB0cnVlOwotCi0gIGlmIChkaXNjYXJkKQotICAgIHsKLSAgICAgIGlmIChzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCXsKLQkgIC8qIFRoaXMgcHJldmVudHMgZnV0dXJlIGNhbGxzIGZyb20gYXNzaWduaW5nIHRoaXMgc2VjdGlvbi4gICovCi0JICBzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBib29sZWFuIGZpcnN0OwotICAgICAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKm5ldzsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0gICAgICBpZiAob3V0cHV0LT5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCXsKLQkgIGluaXRfb3MgKG91dHB1dCk7Ci0JICBmaXJzdCA9IHRydWU7Ci0JfQotICAgICAgZWxzZQotCWZpcnN0ID0gZmFsc2U7Ci0KLSAgICAgIC8qIEFkZCBhIHNlY3Rpb24gcmVmZXJlbmNlIHRvIHRoZSBsaXN0ICovCi0gICAgICBuZXcgPSBuZXdfc3RhdCAobGFuZ19pbnB1dF9zZWN0aW9uLCBwdHIpOwotCi0gICAgICBuZXctPnNlY3Rpb24gPSBzZWN0aW9uOwotICAgICAgbmV3LT5pZmlsZSA9IGZpbGU7Ci0gICAgICBzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9IG91dHB1dC0+YmZkX3NlY3Rpb247Ci0KLSAgICAgIGZsYWdzID0gc2VjdGlvbi0+ZmxhZ3M7Ci0KLSAgICAgIC8qIFdlIGRvbid0IGNvcHkgdGhlIFNFQ19ORVZFUl9MT0FEIGZsYWcgZnJvbSBhbiBpbnB1dCBzZWN0aW9uCi0JIHRvIGFuIG91dHB1dCBzZWN0aW9uLCBiZWNhdXNlIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBpbmNsdWRlIGEKLQkgU0VDX05FVkVSX0xPQUQgc2VjdGlvbiBpbiB0aGUgbWlkZGxlIG9mIGFuIG90aGVyd2lzZSBsb2FkZWQKLQkgc2VjdGlvbiAoSSBkb24ndCBrbm93IHdoeSB3ZSB3YW50IHRvIGRvIHRoaXMsIGJ1dCB3ZSBkbykuCi0JIGJ1aWxkX2xpbmtfb3JkZXIgaW4gbGR3cml0ZS5jIGhhbmRsZXMgdGhpcyBjYXNlIGJ5IHR1cm5pbmcKLQkgdGhlIGVtYmVkZGVkIFNFQ19ORVZFUl9MT0FEIHNlY3Rpb24gaW50byBhIGZpbGwuICAqLwotCi0gICAgICBmbGFncyAmPSB+IFNFQ19ORVZFUl9MT0FEOwotCi0gICAgICAvKiBJZiBmaW5hbCBsaW5rLCBkb24ndCBjb3B5IHRoZSBTRUNfTElOS19PTkNFIGZsYWdzLCB0aGV5J3ZlCi0JIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQuICBPbmUgcmVhc29uIHRvIGRvIHRoaXMgaXMgdGhhdCBvbiBwZQotCSBmb3JtYXQgdGFyZ2V0cywgLnRleHQkZm9vIHNlY3Rpb25zIGdvIGludG8gLnRleHQgYW5kIGl0J3Mgb2RkCi0JIHRvIHNlZSAudGV4dCB3aXRoIFNFQ19MSU5LX09OQ0Ugc2V0LiAgKi8KLQotICAgICAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQlmbGFncyAmPSB+IChTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBpbnB1dCBzZWN0aW9uLCBhbmQgdGhlIFNFQ19SRUFET05MWQotICAgICAgICAgZmxhZyBpcyBub3QgY3VycmVudGx5IHNldCwgdGhlbiBkb24ndCBzZXQgaXQganVzdCBiZWNhdXNlIHRoZQotICAgICAgICAgaW5wdXQgc2VjdGlvbiBoYXMgaXQgc2V0LiAgKi8KLQotICAgICAgaWYgKCEgZmlyc3QgJiYgKHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMCkKLQlmbGFncyAmPSB+IFNFQ19SRUFET05MWTsKLQotICAgICAgc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmZsYWdzIHw9IGZsYWdzOwotCi0gICAgICAvKiBJZiBTRUNfUkVBRE9OTFkgaXMgbm90IHNldCBpbiB0aGUgaW5wdXQgc2VjdGlvbiwgdGhlbiBjbGVhcgotICAgICAgICAgaXQgZnJvbSB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMCkKLQlzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgJj0gflNFQ19SRUFET05MWTsKLQotICAgICAgc3dpdGNoIChvdXRwdXQtPnNlY3R5cGUpCi0JewotCWNhc2Ugbm9ybWFsX3NlY3Rpb246Ci0JICBicmVhazsKLQljYXNlIGRzZWN0X3NlY3Rpb246Ci0JY2FzZSBjb3B5X3NlY3Rpb246Ci0JY2FzZSBpbmZvX3NlY3Rpb246Ci0JY2FzZSBvdmVybGF5X3NlY3Rpb246Ci0JICBvdXRwdXQtPmJmZF9zZWN0aW9uLT5mbGFncyAmPSB+U0VDX0FMTE9DOwotCSAgYnJlYWs7Ci0JY2FzZSBub2xvYWRfc2VjdGlvbjoKLQkgIG91dHB1dC0+YmZkX3NlY3Rpb24tPmZsYWdzICY9IH5TRUNfTE9BRDsKLQkgIG91dHB1dC0+YmZkX3NlY3Rpb24tPmZsYWdzIHw9IFNFQ19ORVZFUl9MT0FEOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID4gb3V0cHV0LT5iZmRfc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKQotCW91dHB1dC0+YmZkX3NlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHNlY3Rpb24tPmFsaWdubWVudF9wb3dlcjsKLQotICAgICAgLyogSWYgc3VwcGxpZWQgYW4gYWxpZ21lbnQsIHRoZW4gZm9yY2UgaXQuICAqLwotICAgICAgaWYgKG91dHB1dC0+c2VjdGlvbl9hbGlnbm1lbnQgIT0gLTEpCi0Jb3V0cHV0LT5iZmRfc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gb3V0cHV0LT5zZWN0aW9uX2FsaWdubWVudDsKLSAgICB9Ci19Ci0KLS8qIEhhbmRsZSB3aWxkY2FyZCBzb3J0aW5nLiAgVGhpcyByZXR1cm5zIHRoZSBsYW5nX2lucHV0X3NlY3Rpb24gd2hpY2gKLSAgIHNob3VsZCBmb2xsb3cgdGhlIG9uZSB3ZSBhcmUgZ29pbmcgdG8gY3JlYXRlIGZvciBTRUNUSU9OIGFuZCBGSUxFLAotICAgYmFzZWQgb24gdGhlIHNvcnRpbmcgcmVxdWlyZW1lbnRzIG9mIFdJTEQuICBJdCByZXR1cm5zIE5VTEwgaWYgdGhlCi0gICBuZXcgc2VjdGlvbiBzaG91bGQganVzdCBnbyBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGxpc3QuICAqLwotCi1zdGF0aWMgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqCi13aWxkX3NvcnQgKHdpbGQsIGZpbGUsIHNlY3Rpb24pCi0gICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqd2lsZDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqbDsKLQotICBpZiAoISB3aWxkLT5maWxlbmFtZXNfc29ydGVkICYmICEgd2lsZC0+c2VjdGlvbnNfc29ydGVkKQotICAgIHJldHVybiBOVUxMOwotCi0gIHNlY3Rpb25fbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChmaWxlLT50aGVfYmZkLCBzZWN0aW9uKTsKLSAgZm9yIChsID0gd2lsZC0+Y2hpbGRyZW4uaGVhZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqbHM7Ci0KLSAgICAgIGlmIChsLT5oZWFkZXIudHlwZSAhPSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bSkKLQljb250aW51ZTsKLSAgICAgIGxzID0gJmwtPmlucHV0X3NlY3Rpb247Ci0KLSAgICAgIC8qIFNvcnRpbmcgYnkgZmlsZW5hbWUgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHNvcnRpbmcgYnkgc2VjdGlvbgotICAgICAgICAgbmFtZS4gICovCi0KLSAgICAgIGlmICh3aWxkLT5maWxlbmFtZXNfc29ydGVkKQotCXsKLQkgIGNvbnN0IGNoYXIgKmZuLCAqbG47Ci0JICBib29sZWFuIGZhLCBsYTsKLQkgIGludCBpOwotCi0JICAvKiBUaGUgUEUgc3VwcG9ydCBmb3IgdGhlIC5pZGF0YSBzZWN0aW9uIGFzIGdlbmVyYXRlZCBieQotICAgICAgICAgICAgIGRsbHRvb2wgYXNzdW1lcyB0aGF0IGZpbGVzIHdpbGwgYmUgc29ydGVkIGJ5IHRoZSBuYW1lIG9mCi0gICAgICAgICAgICAgdGhlIGFyY2hpdmUgYW5kIHRoZW4gdGhlIG5hbWUgb2YgdGhlIGZpbGUgd2l0aGluIHRoZQotICAgICAgICAgICAgIGFyY2hpdmUuICAqLwotCi0JICBpZiAoZmlsZS0+dGhlX2JmZCAhPSBOVUxMCi0JICAgICAgJiYgYmZkX215X2FyY2hpdmUgKGZpbGUtPnRoZV9iZmQpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBmbiA9IGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChmaWxlLT50aGVfYmZkKSk7Ci0JICAgICAgZmEgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmbiA9IGZpbGUtPmZpbGVuYW1lOwotCSAgICAgIGZhID0gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKGxzLT5pZmlsZS0+dGhlX2JmZCAhPSBOVUxMCi0JICAgICAgJiYgYmZkX215X2FyY2hpdmUgKGxzLT5pZmlsZS0+dGhlX2JmZCkgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGxuID0gYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGxzLT5pZmlsZS0+dGhlX2JmZCkpOwotCSAgICAgIGxhID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbG4gPSBscy0+aWZpbGUtPmZpbGVuYW1lOwotCSAgICAgIGxhID0gZmFsc2U7Ci0JICAgIH0KLQotCSAgaSA9IHN0cmNtcCAoZm4sIGxuKTsKLQkgIGlmIChpID4gMCkKLQkgICAgY29udGludWU7Ci0JICBlbHNlIGlmIChpIDwgMCkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmIChmYSB8fCBsYSkKLQkgICAgewotCSAgICAgIGlmIChmYSkKLQkJZm4gPSBmaWxlLT5maWxlbmFtZTsKLQkgICAgICBpZiAobGEpCi0JCWxuID0gbHMtPmlmaWxlLT5maWxlbmFtZTsKLQotCSAgICAgIGkgPSBzdHJjbXAgKGZuLCBsbik7Ci0JICAgICAgaWYgKGkgPiAwKQotCQljb250aW51ZTsKLQkgICAgICBlbHNlIGlmIChpIDwgMCkKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEhlcmUgZWl0aGVyIHRoZSBmaWxlcyBhcmUgbm90IHNvcnRlZCBieSBuYW1lLCBvciB3ZSBhcmUKLSAgICAgICAgIGxvb2tpbmcgYXQgdGhlIHNlY3Rpb25zIGZvciB0aGlzIGZpbGUuICAqLwotCi0gICAgICBpZiAod2lsZC0+c2VjdGlvbnNfc29ydGVkKQotCXsKLQkgIGlmIChzdHJjbXAgKHNlY3Rpb25fbmFtZSwKLQkJICAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGxzLT5pZmlsZS0+dGhlX2JmZCwKLQkJCQkJICAgIGxzLT5zZWN0aW9uKSkKLQkgICAgICA8IDApCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGw7Ci19Ci0KLS8qIEV4cGFuZCBhIHdpbGQgc3RhdGVtZW50IGZvciBhIHBhcnRpY3VsYXIgRklMRS4gIFNFQ1RJT04gbWF5IGJlCi0gICBOVUxMLCBpbiB3aGljaCBjYXNlIGl0IGlzIGEgd2lsZCBjYXJkLiAgKi8KLQotc3RhdGljIHZvaWQKLW91dHB1dF9zZWN0aW9uX2NhbGxiYWNrIChwdHIsIHNlY3Rpb24sIGZpbGUsIG91dHB1dCkKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpwdHI7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICB2b2lkICpvdXRwdXQ7Ci17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKmJlZm9yZTsKLSAgCi0gIC8qIElmIHRoZSB3aWxkIHBhdHRlcm4gd2FzIG1hcmtlZCBLRUVQLCB0aGUgbWVtYmVyIHNlY3Rpb25zCi0gICAgIHNob3VsZCBiZSBhcyB3ZWxsLiAgKi8KLSAgaWYgKHB0ci0+a2VlcF9zZWN0aW9ucykKLSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfS0VFUDsKLSAgCi0gIGJlZm9yZSA9IHdpbGRfc29ydCAocHRyLCBmaWxlLCBzZWN0aW9uKTsKLSAgCi0gIC8qIEhlcmUgQkVGT1JFIHBvaW50cyB0byB0aGUgbGFuZ19pbnB1dF9zZWN0aW9uIHdoaWNoCi0gICAgIHNob3VsZCBmb2xsb3cgdGhlIG9uZSB3ZSBhcmUgYWJvdXQgdG8gYWRkLiAgSWYgQkVGT1JFCi0gICAgIGlzIE5VTEwsIHRoZW4gdGhlIHNlY3Rpb24gc2hvdWxkIGp1c3QgZ28gYXQgdGhlIGVuZAotICAgICBvZiB0aGUgY3VycmVudCBsaXN0LiAgKi8KLSAgCi0gIGlmIChiZWZvcmUgPT0gTlVMTCkKLSAgICB3aWxkX2RvaXQgKCZwdHItPmNoaWxkcmVuLCBzZWN0aW9uLCAKLQkgICAgICAgKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKikgb3V0cHV0LCAKLQkgICAgICAgZmlsZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgbGlzdDsKLSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwcDsKLSAgICAgIAotICAgICAgbGFuZ19saXN0X2luaXQgKCZsaXN0KTsKLSAgICAgIHdpbGRfZG9pdCAoJmxpc3QsIHNlY3Rpb24sIAotCQkgKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKikgb3V0cHV0LCAKLQkJIGZpbGUpOwotICAgICAgCi0gICAgICAvKiBJZiB3ZSBhcmUgZGlzY2FyZGluZyB0aGUgc2VjdGlvbiwgTElTVC5IRUFEIHdpbGwKLQkgYmUgTlVMTC4gICovCi0gICAgICBpZiAobGlzdC5oZWFkICE9IE5VTEwpCi0JewotCSAgQVNTRVJUIChsaXN0LmhlYWQtPm5leHQgPT0gTlVMTCk7Ci0JICAKLQkgIGZvciAocHAgPSAmcHRyLT5jaGlsZHJlbi5oZWFkOwotCSAgICAgICAqcHAgIT0gYmVmb3JlOwotCSAgICAgICBwcCA9ICYoKnBwKS0+bmV4dCkKLQkgICAgQVNTRVJUICgqcHAgIT0gTlVMTCk7Ci0JICAKLQkgIGxpc3QuaGVhZC0+bmV4dCA9ICpwcDsKLQkgICpwcCA9IGxpc3QuaGVhZDsKLQl9Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIHBhc3NlZCBhIGZpbGUgbmFtZSB3aGljaCBtdXN0IGhhdmUgYmVlbiBzZWVuIGFscmVhZHkgYW5kCi0gICBhZGRlZCB0byB0aGUgc3RhdGVtZW50IHRyZWUuICBXZSB3aWxsIHNlZSBpZiBpdCBoYXMgYmVlbiBvcGVuZWQKLSAgIGFscmVhZHkgYW5kIGhhZCBpdHMgc3ltYm9scyByZWFkLiAgSWYgbm90IHRoZW4gd2UnbGwgcmVhZCBpdC4gICovCi0KLXN0YXRpYyBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICoKLWxvb2t1cF9uYW1lIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzZWFyY2g7Ci0KLSAgZm9yIChzZWFyY2ggPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBpbnB1dF9maWxlX2NoYWluLmhlYWQ7Ci0gICAgICAgc2VhcmNoICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIE5VTEw7Ci0gICAgICAgc2VhcmNoID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgc2VhcmNoLT5uZXh0X3JlYWxfZmlsZSkKLSAgICB7Ci0gICAgICBpZiAoc2VhcmNoLT5maWxlbmFtZSA9PSAoY2hhciAqKSBOVUxMICYmIG5hbWUgPT0gKGNoYXIgKikgTlVMTCkKLQlyZXR1cm4gc2VhcmNoOwotICAgICAgaWYgKHNlYXJjaC0+ZmlsZW5hbWUgIT0gKGNoYXIgKikgTlVMTAotCSAgJiYgbmFtZSAhPSAoY2hhciAqKSBOVUxMCi0JICAmJiBzdHJjbXAgKHNlYXJjaC0+ZmlsZW5hbWUsIG5hbWUpID09IDApCi0JYnJlYWs7Ci0gICAgfQotCi0gIGlmIChzZWFyY2ggPT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgTlVMTCkKLSAgICBzZWFyY2ggPSBuZXdfYWZpbGUgKG5hbWUsIGxhbmdfaW5wdXRfZmlsZV9pc19maWxlX2VudW0sIGRlZmF1bHRfdGFyZ2V0LAotCQkJZmFsc2UpOwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBhZGRlZCB0aGlzIGZpbGUsIG9yIHRoaXMgZmlsZSBpcyBub3QgcmVhbAotICAgICAoRklYTUU6IGNhbiB0aGF0IGV2ZXIgYWN0dWFsbHkgaGFwcGVuPykgb3IgdGhlIG5hbWUgaXMgTlVMTAotICAgICAoRklYTUU6IGNhbiB0aGF0IGV2ZXIgYWN0dWFsbHkgaGFwcGVuPykgZG9uJ3QgYWRkIHRoaXMgZmlsZS4gICovCi0gIGlmIChzZWFyY2gtPmxvYWRlZAotICAgICAgfHwgISBzZWFyY2gtPnJlYWwKLSAgICAgIHx8IHNlYXJjaC0+ZmlsZW5hbWUgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLSAgICByZXR1cm4gc2VhcmNoOwotCi0gIGxvYWRfc3ltYm9scyAoc2VhcmNoLCAobGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICopIE5VTEwpOwotCi0gIHJldHVybiBzZWFyY2g7Ci19Ci0KLS8qIEdldCB0aGUgc3ltYm9scyBmb3IgYW4gaW5wdXQgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1sb2FkX3N5bWJvbHMgKGVudHJ5LCBwbGFjZSkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci0gICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqcGxhY2U7Ci17Ci0gIGNoYXIgKiptYXRjaGluZzsKLQotICBpZiAoZW50cnktPmxvYWRlZCkKLSAgICByZXR1cm47Ci0KLSAgbGRmaWxlX29wZW5fZmlsZSAoZW50cnkpOwotCi0gIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGVudHJ5LT50aGVfYmZkLCBiZmRfYXJjaGl2ZSkKLSAgICAgICYmICEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChlbnRyeS0+dGhlX2JmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfZXJyb3JfdHlwZSBlcnI7Ci0gICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKmhvbGQ7Ci0KLSAgICAgIGVyciA9IGJmZF9nZXRfZXJyb3IgKCk7Ci0gICAgICBpZiAoZXJyID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgY2hhciAqKnA7Ci0KLQkgIGVpbmZvIChfKCIlQjogZmlsZSBub3QgcmVjb2duaXplZDogJUVcbiIpLCBlbnRyeS0+dGhlX2JmZCk7Ci0JICBlaW5mbyAoXygiJUI6IG1hdGNoaW5nIGZvcm1hdHM6IiksIGVudHJ5LT50aGVfYmZkKTsKLQkgIGZvciAocCA9IG1hdGNoaW5nOyAqcCAhPSBOVUxMOyBwKyspCi0JICAgIGVpbmZvICgiICVzIiwgKnApOwotCSAgZWluZm8gKCIlRlxuIik7Ci0JfQotICAgICAgZWxzZSBpZiAoZXJyICE9IGJmZF9lcnJvcl9maWxlX25vdF9yZWNvZ25pemVkCi0JICAgICAgIHx8IHBsYWNlID09IE5VTEwpCi0JZWluZm8gKF8oIiVGJUI6IGZpbGUgbm90IHJlY29nbml6ZWQ6ICVFXG4iKSwgZW50cnktPnRoZV9iZmQpOwotCi0gICAgICBiZmRfY2xvc2UgKGVudHJ5LT50aGVfYmZkKTsKLSAgICAgIGVudHJ5LT50aGVfYmZkID0gTlVMTDsKLQotICAgICAgLyogU2VlIGlmIHRoZSBlbXVsYXRpb24gaGFzIHNvbWUgc3BlY2lhbCBrbm93bGVkZ2UuICAqLwotCi0gICAgICBpZiAobGRlbXVsX3VucmVjb2duaXplZF9maWxlIChlbnRyeSkpCi0JcmV0dXJuOwotCi0gICAgICAvKiBUcnkgdG8gaW50ZXJwcmV0IHRoZSBmaWxlIGFzIGEgbGlua2VyIHNjcmlwdC4gICovCi0KLSAgICAgIGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSAoZW50cnktPmZpbGVuYW1lKTsKLQotICAgICAgaG9sZCA9IHN0YXRfcHRyOwotICAgICAgc3RhdF9wdHIgPSBwbGFjZTsKLQotICAgICAgbGRmaWxlX2Fzc3VtZWRfc2NyaXB0ID0gdHJ1ZTsKLSAgICAgIHBhcnNlcl9pbnB1dCA9IGlucHV0X3NjcmlwdDsKLSAgICAgIHl5cGFyc2UgKCk7Ci0gICAgICBsZGZpbGVfYXNzdW1lZF9zY3JpcHQgPSBmYWxzZTsKLQotICAgICAgc3RhdF9wdHIgPSBob2xkOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChsZGVtdWxfcmVjb2duaXplZF9maWxlIChlbnRyeSkpCi0gICAgcmV0dXJuOwotCi0gIC8qIFdlIGRvbid0IGNhbGwgbGRsYW5nX2FkZF9maWxlIGZvciBhbiBhcmNoaXZlLiAgSW5zdGVhZCwgdGhlCi0gICAgIGFkZF9zeW1ib2xzIGVudHJ5IHBvaW50IHdpbGwgY2FsbCBsZGxhbmdfYWRkX2ZpbGUsIHZpYSB0aGUKLSAgICAgYWRkX2FyY2hpdmVfZWxlbWVudCBjYWxsYmFjaywgZm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgYXJjaGl2ZQotICAgICB3aGljaCBpcyB1c2VkLiAgKi8KLSAgc3dpdGNoIChiZmRfZ2V0X2Zvcm1hdCAoZW50cnktPnRoZV9iZmQpKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9vYmplY3Q6Ci0gICAgICBsZGxhbmdfYWRkX2ZpbGUgKGVudHJ5KTsKLSAgICAgIGlmICh0cmFjZV9maWxlcyB8fCB0cmFjZV9maWxlX3RyaWVzKQotCWluZm9fbXNnICgiJUlcbiIsIGVudHJ5KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaGl2ZToKLSAgICAgIGlmIChlbnRyeS0+d2hvbGVfYXJjaGl2ZSkKLQl7Ci0JICBiZmQgKm1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGVudHJ5LT50aGVfYmZkLAotCQkJCQkJICAgICAgKGJmZCAqKSBOVUxMKTsKLQkgIHdoaWxlIChtZW1iZXIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9jaGVja19mb3JtYXQgKG1lbWJlciwgYmZkX29iamVjdCkpCi0JCWVpbmZvIChfKCIlRiVCOiBvYmplY3QgJUIgaW4gYXJjaGl2ZSBpcyBub3Qgb2JqZWN0XG4iKSwKLQkJICAgICAgIGVudHJ5LT50aGVfYmZkLCBtZW1iZXIpOwotCSAgICAgIGlmICghICgoKmxpbmtfaW5mby5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpCi0JCSAgICAgKCZsaW5rX2luZm8sIG1lbWJlciwgIi0td2hvbGUtYXJjaGl2ZSIpKSkKLQkJYWJvcnQgKCk7Ci0JICAgICAgaWYgKCEgYmZkX2xpbmtfYWRkX3N5bWJvbHMgKG1lbWJlciwgJmxpbmtfaW5mbykpCi0JCWVpbmZvIChfKCIlRiVCOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiksIG1lbWJlcik7Ci0JICAgICAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZW50cnktPnRoZV9iZmQsCi0JCQkJCQkgICAgIG1lbWJlcik7Ci0JICAgIH0KLQotCSAgZW50cnktPmxvYWRlZCA9IHRydWU7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGlmICghIGJmZF9saW5rX2FkZF9zeW1ib2xzIChlbnRyeS0+dGhlX2JmZCwgJmxpbmtfaW5mbykpCi0gICAgZWluZm8gKF8oIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iKSwgZW50cnktPnRoZV9iZmQpOwotCi0gIGVudHJ5LT5sb2FkZWQgPSB0cnVlOwotfQotCi0gICAgIAotCi0vKiBIYW5kbGUgYSB3aWxkIHN0YXRlbWVudC4gIFNFQ1RJT04gb3IgRklMRSBvciBib3RoIG1heSBiZSBOVUxMLAotICAgaW5kaWNhdGluZyB0aGF0IGl0IGlzIGEgd2lsZGNhcmQuICBTZXBhcmF0ZSBsYW5nX2lucHV0X3NlY3Rpb24KLSAgIHN0YXRlbWVudHMgYXJlIGNyZWF0ZWQgZm9yIGVhY2ggcGFydCBvZiB0aGUgZXhwYW5zaW9uOyB0aGV5IGFyZQotICAgYWRkZWQgYWZ0ZXIgdGhlIHdpbGQgc3RhdGVtZW50IFMuICBPVVRQVVQgaXMgdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXdpbGQgKHMsIHNlY3Rpb24sIGZpbGUsIHRhcmdldCwgb3V0cHV0KQotICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnM7Ci0gICAgIGNvbnN0IGNoYXIgKnNlY3Rpb247Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci0gICAgIGNvbnN0IGNoYXIgKnRhcmdldDsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0OwotewotICB3YWxrX3dpbGQgKHMsIHNlY3Rpb24sIGZpbGUsIG91dHB1dF9zZWN0aW9uX2NhbGxiYWNrLCAodm9pZCAqKSBvdXRwdXQpOwotCi0gIGlmIChzZWN0aW9uICE9IChjaGFyICopIE5VTEwKLSAgICAgICYmIHN0cmNtcCAoc2VjdGlvbiwgIkNPTU1PTiIpID09IDAKLSAgICAgICYmIGRlZmF1bHRfY29tbW9uX3NlY3Rpb24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBSZW1lbWJlciB0aGUgc2VjdGlvbiB0aGF0IGNvbW1vbiBpcyBnb2luZyB0byBpbiBjYXNlIHdlIGxhdGVyCi0gICAgICAgICBnZXQgc29tZXRoaW5nIHdoaWNoIGRvZXNuJ3Qga25vdyB3aGVyZSB0byBwdXQgaXQuICAqLwotICAgICAgZGVmYXVsdF9jb21tb25fc2VjdGlvbiA9IG91dHB1dDsKLSAgICB9Ci19Ci0KLS8qIE9wZW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIGJmZCAqCi1vcGVuX291dHB1dCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgYmZkICpvdXRwdXQ7Ci0KLSAgaWYgKG91dHB1dF90YXJnZXQgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudF90YXJnZXQgIT0gKGNoYXIgKikgTlVMTCkKLQlvdXRwdXRfdGFyZ2V0ID0gY3VycmVudF90YXJnZXQ7Ci0gICAgICBlbHNlCi0Jb3V0cHV0X3RhcmdldCA9IGRlZmF1bHRfdGFyZ2V0OwotICAgIH0KLSAgb3V0cHV0ID0gYmZkX29wZW53IChuYW1lLCBvdXRwdXRfdGFyZ2V0KTsKLQotICBpZiAob3V0cHV0ID09IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpCi0JewotCSAgZWluZm8gKF8oIiVQJUY6IHRhcmdldCAlcyBub3QgZm91bmRcbiIpLCBvdXRwdXRfdGFyZ2V0KTsKLQl9Ci0gICAgICBlaW5mbyAoXygiJVAlRjogY2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXM6ICVFXG4iKSwgbmFtZSk7Ci0gICAgfQotCi0gIGRlbGV0ZV9vdXRwdXRfZmlsZV9vbl9mYWlsdXJlID0gdHJ1ZTsKLQotICAvKiAgb3V0cHV0LT5mbGFncyB8PSBEX1BBR0VEOyovCi0KLSAgaWYgKCEgYmZkX3NldF9mb3JtYXQgKG91dHB1dCwgYmZkX29iamVjdCkpCi0gICAgZWluZm8gKF8oIiVQJUY6JXM6IGNhbiBub3QgbWFrZSBvYmplY3QgZmlsZTogJUVcbiIpLCBuYW1lKTsKLSAgaWYgKCEgYmZkX3NldF9hcmNoX21hY2ggKG91dHB1dCwKLQkJCSAgIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlLAotCQkJICAgbGRmaWxlX291dHB1dF9tYWNoaW5lKSkKLSAgICBlaW5mbyAoXygiJVAlRjolczogY2FuIG5vdCBzZXQgYXJjaGl0ZWN0dXJlOiAlRVxuIiksIG5hbWUpOwotCi0gIGxpbmtfaW5mby5oYXNoID0gYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKG91dHB1dCk7Ci0gIGlmIChsaW5rX2luZm8uaGFzaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlRjogY2FuIG5vdCBjcmVhdGUgbGluayBoYXNoIHRhYmxlOiAlRVxuIikpOwotCi0gIGJmZF9zZXRfZ3Bfc2l6ZSAob3V0cHV0LCBnX3N3aXRjaF92YWx1ZSk7Ci0gIHJldHVybiBvdXRwdXQ7Ci19Ci0KLQotCi0KLXN0YXRpYyB2b2lkCi1sZGxhbmdfb3Blbl9vdXRwdXQgKHN0YXRlbWVudCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHN0YXRlbWVudDsKLXsKLSAgc3dpdGNoIChzdGF0ZW1lbnQtPmhlYWRlci50eXBlKQotICAgIHsKLSAgICBjYXNlIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtOgotICAgICAgQVNTRVJUIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCk7Ci0gICAgICBvdXRwdXRfYmZkID0gb3Blbl9vdXRwdXQgKHN0YXRlbWVudC0+b3V0cHV0X3N0YXRlbWVudC5uYW1lKTsKLSAgICAgIGxkZW11bF9zZXRfb3V0cHV0X2FyY2ggKCk7Ci0gICAgICBpZiAoY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCAmJiAhbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQlvdXRwdXRfYmZkLT5mbGFncyB8PSBEX1BBR0VEOwotICAgICAgZWxzZQotCW91dHB1dF9iZmQtPmZsYWdzICY9IH5EX1BBR0VEOwotICAgICAgaWYgKGNvbmZpZy50ZXh0X3JlYWRfb25seSkKLQlvdXRwdXRfYmZkLT5mbGFncyB8PSBXUF9URVhUOwotICAgICAgZWxzZQotCW91dHB1dF9iZmQtPmZsYWdzICY9IH5XUF9URVhUOwotICAgICAgaWYgKGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQpCi0Jb3V0cHV0X2JmZC0+ZmxhZ3MgfD0gQkZEX1RSQURJVElPTkFMX0ZPUk1BVDsKLSAgICAgIGVsc2UKLQlvdXRwdXRfYmZkLT5mbGFncyAmPSB+QkZEX1RSQURJVElPTkFMX0ZPUk1BVDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIGN1cnJlbnRfdGFyZ2V0ID0gc3RhdGVtZW50LT50YXJnZXRfc3RhdGVtZW50LnRhcmdldDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIE9wZW4gYWxsIHRoZSBpbnB1dCBmaWxlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1vcGVuX2lucHV0X2JmZHMgKHMsIGZvcmNlKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotICAgICBib29sZWFuIGZvcmNlOwotewotICBmb3IgKDsgcyAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotCXsKLQljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgotCSAgb3Blbl9pbnB1dF9iZmRzIChjb25zdHJ1Y3Rvcl9saXN0LmhlYWQsIGZvcmNlKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQkgIG9wZW5faW5wdXRfYmZkcyAocy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsIGZvcmNlKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotCSAgLyogTWF5YmUgd2Ugc2hvdWxkIGxvYWQgdGhlIGZpbGUncyBzeW1ib2xzICovCi0JICBpZiAocy0+d2lsZF9zdGF0ZW1lbnQuZmlsZW5hbWUKLQkgICAgICAmJiAhIHdpbGRjYXJkcCAocy0+d2lsZF9zdGF0ZW1lbnQuZmlsZW5hbWUpKQotCSAgICAodm9pZCkgbG9va3VwX25hbWUgKHMtPndpbGRfc3RhdGVtZW50LmZpbGVuYW1lKTsKLQkgIG9wZW5faW5wdXRfYmZkcyAocy0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwgZm9yY2UpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtOgotCSAgewotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqdW5kZWZzOwotCi0JICAgIC8qIFdlIG11c3QgY29udGludWFsbHkgc2VhcmNoIHRoZSBlbnRyaWVzIGluIHRoZSBncm91cAotICAgICAgICAgICAgICAgdW50aWwgbm8gbmV3IHN5bWJvbHMgYXJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHVuZGVmaW5lZAotICAgICAgICAgICAgICAgc3ltYm9scy4gICovCi0KLQkgICAgZG8KLQkgICAgICB7Ci0JCXVuZGVmcyA9IGxpbmtfaW5mby5oYXNoLT51bmRlZnNfdGFpbDsKLQkJb3Blbl9pbnB1dF9iZmRzIChzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwgdHJ1ZSk7Ci0JICAgICAgfQotCSAgICB3aGlsZSAodW5kZWZzICE9IGxpbmtfaW5mby5oYXNoLT51bmRlZnNfdGFpbCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtOgotCSAgY3VycmVudF90YXJnZXQgPSBzLT50YXJnZXRfc3RhdGVtZW50LnRhcmdldDsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKLQkgIGlmIChzLT5pbnB1dF9zdGF0ZW1lbnQucmVhbCA9PSB0cnVlKQotCSAgICB7Ci0JICAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGFkZDsKLQotCSAgICAgIHMtPmlucHV0X3N0YXRlbWVudC50YXJnZXQgPSBjdXJyZW50X3RhcmdldDsKLQotCSAgICAgIC8qIElmIHdlIGFyZSBiZWluZyBjYWxsZWQgZnJvbSB3aXRoaW4gYSBncm91cCwgYW5kIHRoaXMKLSAgICAgICAgICAgICAgICAgaXMgYW4gYXJjaGl2ZSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHNlYXJjaGVkLCB0aGVuCi0gICAgICAgICAgICAgICAgIGZvcmNlIGl0IHRvIGJlIHJlc2VhcmNoZWQuICAqLwotCSAgICAgIGlmIChmb3JjZQotCQkgICYmIHMtPmlucHV0X3N0YXRlbWVudC5sb2FkZWQKLQkJICAmJiBiZmRfY2hlY2tfZm9ybWF0IChzLT5pbnB1dF9zdGF0ZW1lbnQudGhlX2JmZCwKLQkJCQkgICAgICAgYmZkX2FyY2hpdmUpKQotCQlzLT5pbnB1dF9zdGF0ZW1lbnQubG9hZGVkID0gZmFsc2U7Ci0KLQkgICAgICBsYW5nX2xpc3RfaW5pdCAoJmFkZCk7Ci0KLQkgICAgICBsb2FkX3N5bWJvbHMgKCZzLT5pbnB1dF9zdGF0ZW1lbnQsICZhZGQpOwotCi0JICAgICAgaWYgKGFkZC5oZWFkICE9IE5VTEwpCi0JCXsKLQkJICAqYWRkLnRhaWwgPSBzLT5uZXh0OwotCQkgIHMtPm5leHQgPSBhZGQuaGVhZDsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotLyogSWYgdGhlcmUgYXJlIFtDT01NT05TXSBzdGF0ZW1lbnRzLCBwdXQgYSB3aWxkIG9uZSBpbnRvIHRoZSBic3Mgc2VjdGlvbiAqLwotCi1zdGF0aWMgdm9pZAotbGFuZ19yZWFzb25hYmxlX2RlZmF1bHRzICgpCi17Ci0jaWYgMAotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKCIudGV4dCIpOwotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKCIuZGF0YSIpOwotCi0gIGRlZmF1bHRfY29tbW9uX3NlY3Rpb24gPQotICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAoIi5ic3MiKTsKLQotCi0gIGlmIChwbGFjZWRfY29tbW9ucyA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKm5ldyA9Ci0gICAgICBuZXdfc3RhdCAobGFuZ193aWxkX3N0YXRlbWVudCwKLQkJJmRlZmF1bHRfY29tbW9uX3NlY3Rpb24tPmNoaWxkcmVuKTsKLQotICAgICAgbmV3LT5zZWN0aW9uX25hbWUgPSAiQ09NTU9OIjsKLSAgICAgIG5ldy0+ZmlsZW5hbWUgPSAoY2hhciAqKSBOVUxMOwotICAgICAgbGFuZ19saXN0X2luaXQgKCZuZXctPmNoaWxkcmVuKTsKLSAgICB9Ci0jZW5kaWYKLQotfQotCi0vKgotIEFkZCB0aGUgc3VwcGxpZWQgbmFtZSB0byB0aGUgc3ltYm9sIHRhYmxlIGFzIGFuIHVuZGVmaW5lZCByZWZlcmVuY2UuCi0gUmVtb3ZlIGl0ZW1zIGZyb20gdGhlIGNoYWluIGFzIHdlIG9wZW4gaW5wdXQgYmZkcwotICovCi10eXBlZGVmIHN0cnVjdCBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdAotewotICBzdHJ1Y3QgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3QgKm5leHQ7Ci0gIGNoYXIgKm5hbWU7Ci19ICAgICAgICAgICAgICAgICAgICAgICBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlOwotCi1zdGF0aWMgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZSAqbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfaGVhZDsKLQotdm9pZAotbGRsYW5nX2FkZF91bmRlZiAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqQ09OU1QgbmFtZTsKLXsKLSAgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZSAqbmV3ID0KLSAgICAoKGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X3R5cGUgKikKLSAgICAgc3RhdF9hbGxvYyAoc2l6ZW9mIChsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlKSkpOwotCi0gIG5ldy0+bmV4dCA9IGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X2hlYWQ7Ci0gIGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X2hlYWQgPSBuZXc7Ci0KLSAgbmV3LT5uYW1lID0gYnV5c3RyaW5nIChuYW1lKTsKLX0KLQotLyogUnVuIHRocm91Z2ggdGhlIGxpc3Qgb2YgdW5kZWZpbmVkcyBjcmVhdGVkIGFib3ZlIGFuZCBwbGFjZSB0aGVtCi0gICBpbnRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSBhcyB1bmRlZmluZWQgc3ltYm9scyBiZWxvbmdpbmcgdG8gdGhlCi0gICBzY3JpcHQgZmlsZS4KLSovCi1zdGF0aWMgdm9pZAotbGFuZ19wbGFjZV91bmRlZmluZWRzICgpCi17Ci0gIGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X3R5cGUgKnB0cjsKLQotICBmb3IgKHB0ciA9IGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X2hlYWQ7Ci0gICAgICAgcHRyICE9IChsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlICopIE5VTEw7Ci0gICAgICAgcHRyID0gcHRyLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBwdHItPm5hbWUsIHRydWUsIGZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCWVpbmZvIChfKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQl7Ci0JICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICBoLT51LnVuZGVmLmFiZmQgPSBOVUxMOwotCSAgYmZkX2xpbmtfYWRkX3VuZGVmIChsaW5rX2luZm8uaGFzaCwgaCk7Ci0JfQotICAgIH0KLX0KLQotLyogT3BlbiBpbnB1dCBmaWxlcyBhbmQgYXR0YXRjaCB0byBvdXRwdXQgc2VjdGlvbnMgKi8KLXN0YXRpYyB2b2lkCi1tYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zIChzLCB0YXJnZXQsIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHM7Ci0gICAgIENPTlNUIGNoYXIgKnRhcmdldDsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLXsKLSAgZm9yICg7IHMgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLQl7Ci0KLQotCWNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotCSAgd2lsZCAoJnMtPndpbGRfc3RhdGVtZW50LCBzLT53aWxkX3N0YXRlbWVudC5zZWN0aW9uX25hbWUsCi0JCXMtPndpbGRfc3RhdGVtZW50LmZpbGVuYW1lLCB0YXJnZXQsCi0JCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci0KLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW06Ci0JICBtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zIChjb25zdHJ1Y3Rvcl9saXN0LmhlYWQsCi0JCQkJCXRhcmdldCwKLQkJCQkJb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQkgIG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMgKHMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCQkJCQl0YXJnZXQsCi0JCQkJCSZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX291dHB1dF9zdGF0ZW1lbnRfZW51bToKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06Ci0JICB0YXJnZXQgPSBzLT50YXJnZXRfc3RhdGVtZW50LnRhcmdldDsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bToKLQkgIG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMgKHMtPmdyb3VwX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCQkJCQl0YXJnZXQsCi0JCQkJCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfZmlsbF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgotCWNhc2UgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfZGF0YV9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtOgotCSAgaWYgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAhPSBOVUxMCi0JICAgICAgJiYgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICBpbml0X29zIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW06Ci0JICBpZiAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50ICE9IE5VTEwKLQkgICAgICAmJiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uID09IE5VTEwpCi0JICAgIGluaXRfb3MgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGF0IGFueSBzZWN0aW9ucyBtZW50aW9uZWQgaW4gdGhlIGFzc2lnbm1lbnQKLSAgICAgICAgICAgICBhcmUgaW5pdGlhbGl6ZWQuICAqLwotCSAgZXhwX2luaXRfb3MgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfYWZpbGVfYXNlY3Rpb25fcGFpcl9zdGF0ZW1lbnRfZW51bToKLQkgIEZBSUwgKCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bToKLQkgIC8qIE1hcmsgdGhlIHNwZWNpZmllZCBzZWN0aW9uIHdpdGggdGhlIHN1cHBsaWVkIGFkZHJlc3MgKi8KLQkgIHsKLQkgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MgPQotCSAgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cAotCQkocy0+YWRkcmVzc19zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lKTsKLQotCSAgICBpZiAob3MtPmJmZF9zZWN0aW9uID09IE5VTEwpCi0JICAgICAgaW5pdF9vcyAob3MpOwotCSAgICBvcy0+YWRkcl90cmVlID0gcy0+YWRkcmVzc19zdGF0ZW1lbnQuYWRkcmVzczsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCkKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uOwotICBpbnQgbGVuOwotCi0gIGlmIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgIT0gYWJzX291dHB1dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIG1pbmZvICgiXG4lcyIsIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+bmFtZSk7Ci0KLSAgICAgIGlmIChzZWN0aW9uICE9IE5VTEwpCi0JewotCSAgcHJpbnRfZG90ID0gc2VjdGlvbi0+dm1hOwotCi0JICBsZW4gPSBzdHJsZW4gKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+bmFtZSk7Ci0JICBpZiAobGVuID49IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIIC0gMSkKLQkgICAgewotCSAgICAgIHByaW50X25sICgpOwotCSAgICAgIGxlbiA9IDA7Ci0JICAgIH0KLQkgIHdoaWxlIChsZW4gPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCkKLQkgICAgewotCSAgICAgIHByaW50X3NwYWNlICgpOwotCSAgICAgICsrbGVuOwotCSAgICB9Ci0KLQkgIG1pbmZvICgiMHglViAlVyIsIHNlY3Rpb24tPnZtYSwgc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotCSAgaWYgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+bG9hZF9iYXNlICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIGFkZHI7Ci0KLQkgICAgICBhZGRyID0gZXhwX2dldF9hYnNfaW50IChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmxvYWRfYmFzZSwgMCwKLQkJCQkgICAgICAibG9hZCBiYXNlIiwgbGFuZ19maW5hbF9waGFzZV9lbnVtKTsKLQkgICAgICBtaW5mbyAoXygiIGxvYWQgYWRkcmVzcyAweCVWIiksIGFkZHIpOwotCSAgICB9Ci0JfQotCi0gICAgICBwcmludF9ubCAoKTsKLSAgICB9Ci0KLSAgcHJpbnRfc3RhdGVtZW50X2xpc3QgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+Y2hpbGRyZW4uaGVhZCwKLQkJCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hc3NpZ25tZW50IChhc3NpZ25tZW50LCBvdXRwdXRfc2VjdGlvbikKLSAgICAgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF90eXBlICogYXNzaWdubWVudDsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uOwotewotICBpbnQgaTsKLSAgZXRyZWVfdmFsdWVfdHlwZSByZXN1bHQ7Ci0KLSAgZm9yIChpID0gMDsgaSA8IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIOyBpKyspCi0gICAgcHJpbnRfc3BhY2UgKCk7Ci0KLSAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAoYXNzaWdubWVudC0+ZXhwLT5hc3NpZ24uc3JjLCBvdXRwdXRfc2VjdGlvbiwKLQkJCSAgbGFuZ19maW5hbF9waGFzZV9lbnVtLCBwcmludF9kb3QsICZwcmludF9kb3QpOwotICBpZiAocmVzdWx0LnZhbGlkX3ApCi0gICAgbWluZm8gKCIweCVWIiwgcmVzdWx0LnZhbHVlICsgcmVzdWx0LnNlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWEpOwotICBlbHNlCi0gICAgewotICAgICAgbWluZm8gKCIqdW5kZWYqICAgIik7Ci0jaWZkZWYgQkZENjQKLSAgICAgIG1pbmZvICgiICAgICAgICAiKTsKLSNlbmRpZgotICAgIH0KLQotICBtaW5mbyAoIiAgICAgICAgICAgICAgICAiKTsKLQotICBleHBfcHJpbnRfdHJlZSAoYXNzaWdubWVudC0+ZXhwKTsKLQotICBwcmludF9ubCAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2lucHV0X3N0YXRlbWVudCAoc3RhdG0pCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiBzdGF0bTsKLXsKLSAgaWYgKHN0YXRtLT5maWxlbmFtZSAhPSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIkxPQUQgJXNcbiIsIHN0YXRtLT5maWxlbmFtZSk7Ci0gICAgfQotfQotCi0vKiBQcmludCBhbGwgc3ltYm9scyBkZWZpbmVkIGluIGEgcGFydGljdWxhciBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQKLSAgIHZpYSBiZmRfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi1wcmludF9vbmVfc3ltYm9sIChoYXNoX2VudHJ5LCBwdHIpCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoYXNoX2VudHJ5OwotICAgICBQVFIgcHRyOwotewotICBhc2VjdGlvbiAqc2VjID0gKGFzZWN0aW9uICopIHB0cjsKLQotICBpZiAoKGhhc2hfZW50cnktPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgfHwgaGFzaF9lbnRyeS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAmJiBzZWMgPT0gaGFzaF9lbnRyeS0+dS5kZWYuc2VjdGlvbikKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIOyBpKyspCi0JcHJpbnRfc3BhY2UgKCk7Ci0gICAgICBtaW5mbyAoIjB4JVYgICAiLAotCSAgICAgKGhhc2hfZW50cnktPnUuZGVmLnZhbHVlCi0JICAgICAgKyBoYXNoX2VudHJ5LT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JICAgICAgKyBoYXNoX2VudHJ5LT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKSk7Ci0KLSAgICAgIG1pbmZvICgiICAgICAgICAgICAgICVUXG4iLCBoYXNoX2VudHJ5LT5yb290LnN0cmluZyk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQcmludCBpbmZvcm1hdGlvbiBhYm91dCBhbiBpbnB1dCBzZWN0aW9uIHRvIHRoZSBtYXAgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pbnB1dF9zZWN0aW9uIChpbikKLSAgICAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKiBpbjsKLXsKLSAgYXNlY3Rpb24gKmkgPSBpbi0+c2VjdGlvbjsKLSAgYmZkX3NpemVfdHlwZSBzaXplID0gaS0+X2Nvb2tlZF9zaXplICE9IDAgPyBpLT5fY29va2VkX3NpemUgOiBpLT5fcmF3X3NpemU7Ci0KLSAgaWYgKHNpemUgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF9zcGFjZSAoKTsKLQotICAgICAgbWluZm8gKCIlcyIsIGktPm5hbWUpOwotCi0gICAgICBpZiAoaS0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQl7Ci0JICBpbnQgbGVuOwotCi0JICBsZW4gPSAxICsgc3RybGVuIChpLT5uYW1lKTsKLQkgIGlmIChsZW4gPj0gU0VDVElPTl9OQU1FX01BUF9MRU5HVEggLSAxKQotCSAgICB7Ci0JICAgICAgcHJpbnRfbmwgKCk7Ci0JICAgICAgbGVuID0gMDsKLQkgICAgfQotCSAgd2hpbGUgKGxlbiA8IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIKQotCSAgICB7Ci0JICAgICAgcHJpbnRfc3BhY2UgKCk7Ci0JICAgICAgKytsZW47Ci0JICAgIH0KLQotCSAgbWluZm8gKCIweCVWICVXICVCXG4iLAotCQkgaS0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGktPm91dHB1dF9vZmZzZXQsIHNpemUsCi0JCSBpLT5vd25lcik7Ci0KLQkgIGlmIChpLT5fY29va2VkX3NpemUgIT0gMCAmJiBpLT5fY29va2VkX3NpemUgIT0gaS0+X3Jhd19zaXplKQotCSAgICB7Ci0JICAgICAgbGVuID0gU0VDVElPTl9OQU1FX01BUF9MRU5HVEggKyAzOwotI2lmZGVmIEJGRDY0Ci0JICAgICAgbGVuICs9IDE2OwotI2Vsc2UKLQkgICAgICBsZW4gKz0gODsKLSNlbmRpZgotCSAgICAgIHdoaWxlIChsZW4gPiAwKQotCQl7Ci0JCSAgcHJpbnRfc3BhY2UgKCk7Ci0JCSAgLS1sZW47Ci0JCX0KLQotCSAgICAgIG1pbmZvIChfKCIlVyAoc2l6ZSBiZWZvcmUgcmVsYXhpbmcpXG4iKSwgaS0+X3Jhd19zaXplKTsKLQkgICAgfQotCi0JICBiZmRfbGlua19oYXNoX3RyYXZlcnNlIChsaW5rX2luZm8uaGFzaCwgcHJpbnRfb25lX3N5bWJvbCwgKFBUUikgaSk7Ci0KLQkgIHByaW50X2RvdCA9IGktPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpLT5vdXRwdXRfb2Zmc2V0ICsgc2l6ZTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZmlsbF9zdGF0ZW1lbnQgKGZpbGwpCi0gICAgIGxhbmdfZmlsbF9zdGF0ZW1lbnRfdHlwZSAqIGZpbGw7Ci17Ci0gIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIiBGSUxMIG1hc2sgMHgleFxuIiwgZmlsbC0+ZmlsbCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9kYXRhX3N0YXRlbWVudCAoZGF0YSkKLSAgICAgbGFuZ19kYXRhX3N0YXRlbWVudF90eXBlICogZGF0YTsKLXsKLSAgaW50IGk7Ci0gIGJmZF92bWEgYWRkcjsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGZvciAoaSA9IDA7IGkgPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSDsgaSsrKQotICAgIHByaW50X3NwYWNlICgpOwotCi0gIGFkZHIgPSBkYXRhLT5vdXRwdXRfdm1hOwotICBpZiAoZGF0YS0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICBhZGRyICs9IGRhdGEtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgc3dpdGNoIChkYXRhLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBCWVRFOgotICAgICAgc2l6ZSA9IEJZVEVfU0laRTsKLSAgICAgIG5hbWUgPSAiQllURSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIT1JUOgotICAgICAgc2l6ZSA9IFNIT1JUX1NJWkU7Ci0gICAgICBuYW1lID0gIlNIT1JUIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTE9ORzoKLSAgICAgIHNpemUgPSBMT05HX1NJWkU7Ci0gICAgICBuYW1lID0gIkxPTkciOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBRVUFEOgotICAgICAgc2l6ZSA9IFFVQURfU0laRTsKLSAgICAgIG5hbWUgPSAiUVVBRCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNRVUFEOgotICAgICAgc2l6ZSA9IFFVQURfU0laRTsKLSAgICAgIG5hbWUgPSAiU1FVQUQiOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIG1pbmZvICgiMHglViAlVyAlcyAweCV2IiwgYWRkciwgc2l6ZSwgbmFtZSwgZGF0YS0+dmFsdWUpOwotCi0gIGlmIChkYXRhLT5leHAtPnR5cGUubm9kZV9jbGFzcyAhPSBldHJlZV92YWx1ZSkKLSAgICB7Ci0gICAgICBwcmludF9zcGFjZSAoKTsKLSAgICAgIGV4cF9wcmludF90cmVlIChkYXRhLT5leHApOwotICAgIH0KLQotICBwcmludF9ubCAoKTsKLQotICBwcmludF9kb3QgPSBhZGRyICsgc2l6ZTsKLX0KLQotLyogUHJpbnQgYW4gYWRkcmVzcyBzdGF0ZW1lbnQuICBUaGVzZSBhcmUgZ2VuZXJhdGVkIGJ5IG9wdGlvbnMgbGlrZQotICAgLVR0ZXh0LiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FkZHJlc3Nfc3RhdGVtZW50IChhZGRyZXNzKQotICAgICBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X3R5cGUgKmFkZHJlc3M7Ci17Ci0gIG1pbmZvIChfKCJBZGRyZXNzIG9mIHNlY3Rpb24gJXMgc2V0IHRvICIpLCBhZGRyZXNzLT5zZWN0aW9uX25hbWUpOwotICBleHBfcHJpbnRfdHJlZSAoYWRkcmVzcy0+YWRkcmVzcyk7Ci0gIHByaW50X25sICgpOwotfQotCi0vKiBQcmludCBhIHJlbG9jIHN0YXRlbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9yZWxvY19zdGF0ZW1lbnQgKHJlbG9jKQotICAgICBsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlICpyZWxvYzsKLXsKLSAgaW50IGk7Ci0gIGJmZF92bWEgYWRkcjsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0gIGZvciAoaSA9IDA7IGkgPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSDsgaSsrKQotICAgIHByaW50X3NwYWNlICgpOwotCi0gIGFkZHIgPSByZWxvYy0+b3V0cHV0X3ZtYTsKLSAgaWYgKHJlbG9jLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotICAgIGFkZHIgKz0gcmVsb2MtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2MtPmhvd3RvKTsKLQotICBtaW5mbyAoIjB4JVYgJVcgUkVMT0MgJXMgIiwgYWRkciwgc2l6ZSwgcmVsb2MtPmhvd3RvLT5uYW1lKTsKLQotICBpZiAocmVsb2MtPm5hbWUgIT0gTlVMTCkKLSAgICBtaW5mbyAoIiVzKyIsIHJlbG9jLT5uYW1lKTsKLSAgZWxzZQotICAgIG1pbmZvICgiJXMrIiwgcmVsb2MtPnNlY3Rpb24tPm5hbWUpOwotCi0gIGV4cF9wcmludF90cmVlIChyZWxvYy0+YWRkZW5kX2V4cCk7Ci0KLSAgcHJpbnRfbmwgKCk7Ci0KLSAgcHJpbnRfZG90ID0gYWRkciArIHNpemU7Ci19ICAKLQotc3RhdGljIHZvaWQKLXByaW50X3BhZGRpbmdfc3RhdGVtZW50IChzKQotICAgICBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIGludCBsZW47Ci0gIGJmZF92bWEgYWRkcjsKLQotICBtaW5mbyAoIiAqZmlsbCoiKTsKLQotICBsZW4gPSBzaXplb2YgIiAqZmlsbCoiIC0gMTsKLSAgd2hpbGUgKGxlbiA8IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIKQotICAgIHsKLSAgICAgIHByaW50X3NwYWNlICgpOwotICAgICAgKytsZW47Ci0gICAgfQotCi0gIGFkZHIgPSBzLT5vdXRwdXRfb2Zmc2V0OwotICBpZiAocy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICBhZGRyICs9IHMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIG1pbmZvICgiMHglViAlVyIsIGFkZHIsIHMtPnNpemUpOwotCi0gIGlmIChzLT5maWxsICE9IDApCi0gICAgbWluZm8gKCIgJXUiLCBzLT5maWxsKTsKLQotICBwcmludF9ubCAoKTsKLQotICBwcmludF9kb3QgPSBhZGRyICsgcy0+c2l6ZTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3dpbGRfc3RhdGVtZW50ICh3LCBvcykKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICogdzsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG9zOwotewotICBwcmludF9zcGFjZSAoKTsKLQotICBpZiAody0+ZmlsZW5hbWVzX3NvcnRlZCkKLSAgICBtaW5mbyAoIlNPUlQoIik7Ci0gIGlmICh3LT5leGNsdWRlX2ZpbGVuYW1lICE9IE5VTEwpCi0gICAgbWluZm8gKCJFWENMVURFX0ZJTEUgKCAlcyApIiwgdy0+ZXhjbHVkZV9maWxlbmFtZSk7Ci0gIGlmICh3LT5maWxlbmFtZSAhPSBOVUxMKQotICAgIG1pbmZvICgiJXMiLCB3LT5maWxlbmFtZSk7Ci0gIGVsc2UKLSAgICBtaW5mbyAoIioiKTsKLSAgaWYgKHctPmZpbGVuYW1lc19zb3J0ZWQpCi0gICAgbWluZm8gKCIpIik7Ci0KLSAgbWluZm8gKCIoIik7Ci0gIGlmICh3LT5zZWN0aW9uc19zb3J0ZWQpCi0gICAgbWluZm8gKCJTT1JUKCIpOwotICBpZiAody0+c2VjdGlvbl9uYW1lICE9IE5VTEwpCi0gICAgbWluZm8gKCIlcyIsIHctPnNlY3Rpb25fbmFtZSk7Ci0gIGVsc2UKLSAgICBtaW5mbyAoIioiKTsKLSAgaWYgKHctPnNlY3Rpb25zX3NvcnRlZCkKLSAgICBtaW5mbyAoIikiKTsKLSAgbWluZm8gKCIpIik7Ci0KLSAgcHJpbnRfbmwgKCk7Ci0KLSAgcHJpbnRfc3RhdGVtZW50X2xpc3QgKHctPmNoaWxkcmVuLmhlYWQsIG9zKTsKLX0KLQotLyogUHJpbnQgYSBncm91cCBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfZ3JvdXAgKHMsIG9zKQotICAgICBsYW5nX2dyb3VwX3N0YXRlbWVudF90eXBlICpzOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLXsKLSAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiU1RBUlQgR1JPVVBcbiIpOwotICBwcmludF9zdGF0ZW1lbnRfbGlzdCAocy0+Y2hpbGRyZW4uaGVhZCwgb3MpOwotICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICJFTkQgR1JPVVBcbiIpOwotfQotCi0vKiBQcmludCB0aGUgbGlzdCBvZiBzdGF0ZW1lbnRzIGluIFMuCi0gICBUaGlzIGNhbiBiZSBjYWxsZWQgZm9yIGFueSBzdGF0ZW1lbnQgdHlwZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zdGF0ZW1lbnRfbGlzdCAocywgb3MpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotewotICB3aGlsZSAocyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50X3N0YXRlbWVudCAocywgb3MpOwotICAgICAgcyA9IHMtPm5leHQ7Ci0gICAgfQotfQotCi0vKiBQcmludCB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHN0YXRlbWVudCBsaXN0IFMuCi0gICBUaGlzIGNhbiBiZSBjYWxsZWQgZm9yIGFueSBzdGF0ZW1lbnQgdHlwZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zdGF0ZW1lbnQgKHMsIG9zKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLXsKLSAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgXygiRmFpbCB3aXRoICVkXG4iKSwgcy0+aGVhZGVyLnR5cGUpOwotICAgICAgRkFJTCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW06Ci0gICAgICBpZiAoY29uc3RydWN0b3JfbGlzdC5oZWFkICE9IE5VTEwpCi0JewotCSAgaWYgKGNvbnN0cnVjdG9yc19zb3J0ZWQpCi0JICAgIG1pbmZvICgiIFNPUlQgKENPTlNUUlVDVE9SUylcbiIpOwotCSAgZWxzZQotCSAgICBtaW5mbyAoIiBDT05TVFJVQ1RPUlNcbiIpOwotCSAgcHJpbnRfc3RhdGVtZW50X2xpc3QgKGNvbnN0cnVjdG9yX2xpc3QuaGVhZCwgb3MpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotICAgICAgcHJpbnRfd2lsZF9zdGF0ZW1lbnQgKCZzLT53aWxkX3N0YXRlbWVudCwgb3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9hZGRyZXNzX3N0YXRlbWVudCAoJnMtPmFkZHJlc3Nfc3RhdGVtZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bToKLSAgICAgIG1pbmZvICgiIENSRUFURV9PQkpFQ1RfU1lNQk9MU1xuIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfZmlsbF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X2ZpbGxfc3RhdGVtZW50ICgmcy0+ZmlsbF9zdGF0ZW1lbnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9kYXRhX3N0YXRlbWVudCAoJnMtPmRhdGFfc3RhdGVtZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X3JlbG9jX3N0YXRlbWVudCAoJnMtPnJlbG9jX3N0YXRlbWVudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgotICAgICAgcHJpbnRfaW5wdXRfc2VjdGlvbiAoJnMtPmlucHV0X3NlY3Rpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9wYWRkaW5nX3N0YXRlbWVudCAoJnMtPnBhZGRpbmdfc3RhdGVtZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAoJnMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X2Fzc2lnbm1lbnQgKCZzLT5hc3NpZ25tZW50X3N0YXRlbWVudCwgb3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIlRBUkdFVCglcylcbiIsIHMtPnRhcmdldF9zdGF0ZW1lbnQudGFyZ2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19vdXRwdXRfc3RhdGVtZW50X2VudW06Ci0gICAgICBtaW5mbyAoIk9VVFBVVCglcyIsIHMtPm91dHB1dF9zdGF0ZW1lbnQubmFtZSk7Ci0gICAgICBpZiAob3V0cHV0X3RhcmdldCAhPSBOVUxMKQotCW1pbmZvICgiICVzIiwgb3V0cHV0X3RhcmdldCk7Ci0gICAgICBtaW5mbyAoIilcbiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtOgotICAgICAgcHJpbnRfaW5wdXRfc3RhdGVtZW50ICgmcy0+aW5wdXRfc3RhdGVtZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X2dyb3VwICgmcy0+Z3JvdXBfc3RhdGVtZW50LCBvcyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfYWZpbGVfYXNlY3Rpb25fcGFpcl9zdGF0ZW1lbnRfZW51bToKLSAgICAgIEZBSUwgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zdGF0ZW1lbnRzICgpCi17Ci0gIHByaW50X3N0YXRlbWVudF9saXN0IChzdGF0ZW1lbnRfbGlzdC5oZWFkLCBhYnNfb3V0cHV0X3NlY3Rpb24pOwotfQotCi0vKiBQcmludCB0aGUgZmlyc3QgTiBzdGF0ZW1lbnRzIGluIHN0YXRlbWVudCBsaXN0IFMgdG8gU1RERVJSLgotICAgSWYgTiA9PSAwLCBub3RoaW5nIGlzIHByaW50ZWQuCi0gICBJZiBOIDwgMCwgdGhlIGVudGlyZSBsaXN0IGlzIHByaW50ZWQuCi0gICBJbnRlbmRlZCB0byBiZSBjYWxsZWQgZnJvbSBHREIuICAqLwotCi12b2lkCi1kcHJpbnRfc3RhdGVtZW50IChzLCBuKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICogczsKLSAgICAgaW50IG47Ci17Ci0gIEZJTEUgKm1hcF9zYXZlID0gY29uZmlnLm1hcF9maWxlOwotCi0gIGNvbmZpZy5tYXBfZmlsZSA9IHN0ZGVycjsKLQotICBpZiAobiA8IDApCi0gICAgcHJpbnRfc3RhdGVtZW50X2xpc3QgKHMsIGFic19vdXRwdXRfc2VjdGlvbik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAocyAmJiAtLW4gPj0gMCkKLQl7Ci0JICBwcmludF9zdGF0ZW1lbnQgKHMsIGFic19vdXRwdXRfc2VjdGlvbik7Ci0JICBzID0gcy0+bmV4dDsKLQl9Ci0gICAgfQotCi0gIGNvbmZpZy5tYXBfZmlsZSA9IG1hcF9zYXZlOwotfQotCi1zdGF0aWMgYmZkX3ZtYQotaW5zZXJ0X3BhZCAodGhpc19wdHIsIGZpbGwsIHBvd2VyLCBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsIGRvdCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKiB0aGlzX3B0cjsKLSAgICAgZmlsbF90eXBlIGZpbGw7Ci0gICAgIHVuc2lnbmVkIGludCBwb3dlcjsKLSAgICAgYXNlY3Rpb24gKiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0gICAgIGJmZF92bWEgZG90OwotewotICAvKiBBbGlnbiB0aGlzIHNlY3Rpb24gZmlyc3QgdG8gdGhlCi0gICAgIGlucHV0IHNlY3Rpb25zIHJlcXVpcmVtZW50LCB0aGVuCi0gICAgIHRvIHRoZSBvdXRwdXQgc2VjdGlvbidzIHJlcXVpcmVtZW50LgotICAgICBJZiB0aGlzIGFsaWdubWVudCBpcyA+IHRoYW4gYW55IHNlZW4gYmVmb3JlLAotICAgICB0aGVuIHJlY29yZCBpdCB0b28uIFBlcmZvcm0gdGhlIGFsaWdubWVudCBieQotICAgICBpbnNlcnRpbmcgYSBtYWdpYyAncGFkZGluZycgc3RhdGVtZW50LgotICAgICAqLwotCi0gIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfbmVlZGVkID0gYWxpZ25fcG93ZXIgKGRvdCwgcG93ZXIpIC0gZG90OwotCi0gIGlmIChhbGlnbm1lbnRfbmVlZGVkICE9IDApCi0gICAgewotICAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqbmV3ID0KLQkoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikKLQkgc3RhdF9hbGxvYyAoc2l6ZW9mIChsYW5nX3BhZGRpbmdfc3RhdGVtZW50X3R5cGUpKSk7Ci0KLSAgICAgIC8qIExpbmsgaW50byBleGlzdGluZyBjaGFpbiAqLwotICAgICAgbmV3LT5oZWFkZXIubmV4dCA9ICp0aGlzX3B0cjsKLSAgICAgICp0aGlzX3B0ciA9IG5ldzsKLSAgICAgIG5ldy0+aGVhZGVyLnR5cGUgPSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW07Ci0gICAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50Lm91dHB1dF9zZWN0aW9uID0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotICAgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfb2Zmc2V0ID0KLQlkb3QgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPnZtYTsKLSAgICAgIG5ldy0+cGFkZGluZ19zdGF0ZW1lbnQuZmlsbCA9IGZpbGw7Ci0gICAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50LnNpemUgPSBhbGlnbm1lbnRfbmVlZGVkOwotICAgIH0KLQotCi0gIC8qIFJlbWVtYmVyIHRoZSBtb3N0IHJlc3RyaWN0aXZlIGFsaWdubWVudCAqLwotICBpZiAocG93ZXIgPiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmFsaWdubWVudF9wb3dlcikKLSAgICB7Ci0gICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmFsaWdubWVudF9wb3dlciA9IHBvd2VyOwotICAgIH0KLSAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5fcmF3X3NpemUgKz0gYWxpZ25tZW50X25lZWRlZDsKLSAgcmV0dXJuIGFsaWdubWVudF9uZWVkZWQgKyBkb3Q7Ci0KLX0KLQotLyogV29yayBvdXQgaG93IG11Y2ggdGhpcyBzZWN0aW9uIHdpbGwgbW92ZSB0aGUgZG90IHBvaW50ICovCi1zdGF0aWMgYmZkX3ZtYQotc2l6ZV9pbnB1dF9zZWN0aW9uICh0aGlzX3B0ciwgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LCBmaWxsLCBkb3QsIHJlbGF4KQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqIHRoaXNfcHRyOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICogb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotICAgICBmaWxsX3R5cGUgZmlsbDsKLSAgICAgYmZkX3ZtYSBkb3Q7Ci0gICAgIGJvb2xlYW4gcmVsYXg7Ci17Ci0gIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICppcyA9ICYoKCp0aGlzX3B0ciktPmlucHV0X3NlY3Rpb24pOwotICBhc2VjdGlvbiAqaSA9IGlzLT5zZWN0aW9uOwotCi0gIGlmIChpcy0+aWZpbGUtPmp1c3Rfc3ltc19mbGFnID09IGZhbHNlKQotICAgIHsKLSAgICAgIGlmIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPnN1YnNlY3Rpb25fYWxpZ25tZW50ICE9IC0xKQotICAgICAgIGktPmFsaWdubWVudF9wb3dlciA9Ci0Jb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5zdWJzZWN0aW9uX2FsaWdubWVudDsKLQotICAgICAgZG90ID0gaW5zZXJ0X3BhZCAodGhpc19wdHIsIGZpbGwsIGktPmFsaWdubWVudF9wb3dlciwKLQkJCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24sIGRvdCk7Ci0KLSAgICAgIC8qIFJlbWVtYmVyIHdoZXJlIGluIHRoZSBvdXRwdXQgc2VjdGlvbiB0aGlzIGlucHV0IHNlY3Rpb24gZ29lcyAqLwotCi0gICAgICBpLT5vdXRwdXRfb2Zmc2V0ID0gZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+dm1hOwotCi0gICAgICAvKiBNYXJrIGhvdyBiaWcgdGhlIG91dHB1dCBzZWN0aW9uIG11c3QgYmUgdG8gY29udGFpbiB0aGlzIG5vdwotCSAqLwotICAgICAgaWYgKGktPl9jb29rZWRfc2l6ZSAhPSAwKQotCWRvdCArPSBpLT5fY29va2VkX3NpemU7Ci0gICAgICBlbHNlCi0JZG90ICs9IGktPl9yYXdfc2l6ZTsKLSAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSA9IGRvdCAtIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPnZtYTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpLT5vdXRwdXRfb2Zmc2V0ID0gaS0+dm1hIC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+dm1hOwotICAgIH0KLQotICByZXR1cm4gZG90OwotfQotCi0vKiBDaGVjayB0byBzZWUgaWYgYW55IGFsbG9jYXRlZCBzZWN0aW9ucyBvdmVybGFwIHdpdGggb3RoZXIgYWxsb2NhdGVkCi0gICBzZWN0aW9ucy4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSBsaW5rZXIgc2NyaXB0IHNwZWNpZmljYWxseSBzcGVjaWZpZXMKLSAgIHRoZSBvdXRwdXQgc2VjdGlvbiBhZGRyZXNzZXMgb2YgdGhlIHR3byBzZWN0aW9ucy4gICovCi1zdGF0aWMgdm9pZAotbGFuZ19jaGVja19zZWN0aW9uX2FkZHJlc3NlcyAoKQotewotICBhc2VjdGlvbiAqIHM7Ci0KLSAgLyogU2NhbiBhbGwgc2VjdGlvbnMgaW4gdGhlIG91dHB1dCBsaXN0LiAgKi8KLSAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgLyogSWdub3JlIHNlY3Rpb25zIHdoaWNoIGFyZSBub3QgbG9hZGVkIG9yIHdoaWNoIGhhdmUgbm8gY29udGVudHMuICAqLwotICAgIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChvdXRwdXRfYmZkLCBzKSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCkpCi0JJiYgYmZkX3NlY3Rpb25fc2l6ZSAob3V0cHV0X2JmZCwgcykgIT0gMCkKLSAgICAgIHsKLQlhc2VjdGlvbiAqIG9zOwotCi0JLyogT25jZSB3ZSByZWFjaCBzZWN0aW9uICdzJyBzdG9wIG91ciBzZWFjaC4gIFRoaXMgcHJldmVudHMgdHdvCi0JICAgd2FybmluZyBtZXNzYWdlcyBmcm9tIGJlaW5nIHByb2R1Y2VkLCBvbmUgZm9yICdzZWN0aW9uIEEgb3ZlcmxhcHMKLQkgICBzZWN0aW9uIEInIGFuZCBvbmUgZm9yICdzZWN0aW9uIEIgb3ZlcmxhcHMgc2VjdGlvbiBBJy4gICovCi0JZm9yIChvcyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBvcyAhPSBzOyBvcyA9IG9zLT5uZXh0KQotCSAgewotCSAgICBiZmRfdm1hIHNfc3RhcnQ7Ci0JICAgIGJmZF92bWEgc19lbmQ7Ci0JICAgIGJmZF92bWEgb3Nfc3RhcnQ7Ci0JICAgIGJmZF92bWEgb3NfZW5kOwotCi0JICAgIC8qIE9ubHkgY29uc2lkZXIgbG9hZGFibGUgc2VjdGlvbnMgd2l0aCByZWFsIGNvbnRlbnRzLiAgKi8KLQkgICAgaWYgKCgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChvdXRwdXRfYmZkLCBvcykKLQkJICAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCkpID09IDApCi0JCXx8IGJmZF9zZWN0aW9uX3NpemUgKG91dHB1dF9iZmQsIG9zKSA9PSAwKQotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIC8qIFdlIG11c3QgY2hlY2sgdGhlIHNlY3Rpb25zJyBMTUEgYWRkcmVzc2VzIG5vdCB0aGVpcgotCSAgICAgICBWTUEgYWRkcmVzc2VzIGJlY2F1c2Ugb3ZlcmxheSBzZWN0aW9ucyBjYW4gaGF2ZQotCSAgICAgICBvdmVybGFwcGluZyBWTUFzIGJ1dCB0aGV5IG11c3QgaGF2ZSBkaXN0aW5jdCBMTUFzLiAgKi8KLQkgICAgc19zdGFydCAgPSBiZmRfc2VjdGlvbl9sbWEgKG91dHB1dF9iZmQsIHMpOwotCSAgICBvc19zdGFydCA9IGJmZF9zZWN0aW9uX2xtYSAob3V0cHV0X2JmZCwgb3MpOwotCSAgICBzX2VuZCAgICA9IHNfc3RhcnQgICsgYmZkX3NlY3Rpb25fc2l6ZSAob3V0cHV0X2JmZCwgcykgLSAxOwotCSAgICBvc19lbmQgICA9IG9zX3N0YXJ0ICsgYmZkX3NlY3Rpb25fc2l6ZSAob3V0cHV0X2JmZCwgb3MpIC0gMTsKLQotCSAgICAvKiBMb29rIGZvciBhbiBvdmVybGFwLiAgKi8KLQkgICAgaWYgKChzX2VuZCA8IG9zX3N0YXJ0KSB8fCAoc19zdGFydCA+IG9zX2VuZCkpCi0JICAgICAgY29udGludWU7Ci0JICAgIAotCSAgICBlaW5mbyAoCi1fKCIlWCVQOiBzZWN0aW9uICVzIFslViAtPiAlVl0gb3ZlcmxhcHMgc2VjdGlvbiAlcyBbJVYgLT4gJVZdXG4iKSwKLQkJICAgcy0+bmFtZSwgc19zdGFydCwgc19lbmQsIG9zLT5uYW1lLCBvc19zdGFydCwgb3NfZW5kKTsKLQotCSAgICAvKiBPbmNlIHdlIGhhdmUgZm91bmQgb25lIG92ZXJsYXAgZm9yIHRoaXMgc2VjdGlvbiwKLQkgICAgICAgc3RvcCBsb29raW5nIGZvciBvdGhlcnMuICAqLwotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIH0KLX0KLQotLyogVGhpcyB2YXJpYWJsZSBpbmRpY2F0ZXMgd2hldGhlciBiZmRfcmVsYXhfc2VjdGlvbiBzaG91bGQgYmUgY2FsbGVkCi0gICBhZ2Fpbi4gICovCi0KLXN0YXRpYyBib29sZWFuIHJlbGF4X2FnYWluOwotCi0vKiBTZXQgdGhlIHNpemVzIGZvciBhbGwgdGhlIG91dHB1dCBzZWN0aW9ucy4gICovCi0KLWJmZF92bWEKLWxhbmdfc2l6ZV9zZWN0aW9ucyAocywgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LCBwcmV2LCBmaWxsLCBkb3QsIHJlbGF4KQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICogczsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKiBwcmV2OwotICAgICBmaWxsX3R5cGUgZmlsbDsKLSAgICAgYmZkX3ZtYSBkb3Q7Ci0gICAgIGJvb2xlYW4gcmVsYXg7Ci17Ci0gIC8qIFNpemUgdXAgdGhlIHNlY3Rpb25zIGZyb20gdGhlaXIgY29uc3RpdHVlbnQgcGFydHMuICAqLwotICBmb3IgKDsgcyAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotCXsKLQljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIGJmZF92bWEgYWZ0ZXI7Ci0JICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zID0gJnMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLQotCSAgICBpZiAob3MtPmJmZF9zZWN0aW9uID09IE5VTEwpCi0JICAgICAgLyogVGhpcyBzZWN0aW9uIHdhcyBuZXZlciBhY3R1YWxseSBjcmVhdGVkLiAgKi8KLQkgICAgICBicmVhazsKLQotCSAgICAvKiBJZiB0aGlzIGlzIGEgQ09GRiBzaGFyZWQgbGlicmFyeSBzZWN0aW9uLCB1c2UgdGhlIHNpemUgYW5kCi0JICAgICAgIGFkZHJlc3MgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbi4gIEZJWE1FOiBUaGlzIGlzIENPRkYKLQkgICAgICAgc3BlY2lmaWM7IGl0IHdvdWxkIGJlIGNsZWFuZXIgaWYgdGhlcmUgd2VyZSBzb21lIG90aGVyIHdheQotCSAgICAgICB0byBkbyB0aGlzLCBidXQgbm90aGluZyBzaW1wbGUgY29tZXMgdG8gbWluZC4gICovCi0JICAgIGlmICgob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZKSAhPSAwKQotCSAgICAgIHsKLQkJYXNlY3Rpb24gKiBpbnB1dDsKLQotCQlpZiAob3MtPmNoaWxkcmVuLmhlYWQgPT0gTlVMTAotCQkgICAgfHwgb3MtPmNoaWxkcmVuLmhlYWQtPm5leHQgIT0gTlVMTAotCQkgICAgfHwgb3MtPmNoaWxkcmVuLmhlYWQtPmhlYWRlci50eXBlICE9IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtKQotCQkgIGVpbmZvIChfKCIlUCVYOiBJbnRlcm5hbCBlcnJvciBvbiBDT0ZGIHNoYXJlZCBsaWJyYXJ5IHNlY3Rpb24gJXNcbiIpLAotCQkJIG9zLT5uYW1lKTsKLQotCQlpbnB1dCA9IG9zLT5jaGlsZHJlbi5oZWFkLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb247Ci0JCWJmZF9zZXRfc2VjdGlvbl92bWEgKG9zLT5iZmRfc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgICBvcy0+YmZkX3NlY3Rpb24sCi0JCQkJICAgICBiZmRfc2VjdGlvbl92bWEgKGlucHV0LT5vd25lciwgaW5wdXQpKTsKLQkJb3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgPSBpbnB1dC0+X3Jhd19zaXplOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAob3MtPmJmZF9zZWN0aW9uKSkKLQkgICAgICB7Ci0JCS8qIE5vIG1hdHRlciB3aGF0IGhhcHBlbnMsIGFuIGFicyBzZWN0aW9uIHN0YXJ0cyBhdCB6ZXJvLiAgKi8KLQkJQVNTRVJUIChvcy0+YmZkX3NlY3Rpb24tPnZtYSA9PSAwKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWlmIChvcy0+YWRkcl90cmVlID09IChldHJlZV90eXBlICopIE5VTEwpCi0JCSAgewotCQkgICAgLyogTm8gYWRkcmVzcyBzcGVjaWZpZWQgZm9yIHRoaXMgc2VjdGlvbiwgZ2V0IG9uZQotCQkgICAgICAgZnJvbSB0aGUgcmVnaW9uIHNwZWNpZmljYXRpb24uICAqLwotCQkgICAgaWYgKG9zLT5yZWdpb24gPT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEwKLQkJCXx8ICgoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob3V0cHV0X2JmZCwgb3MtPmJmZF9zZWN0aW9uKQotCQkJICAgICAgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpKSAhPSAwKQotCQkJICAgICYmIG9zLT5yZWdpb24tPm5hbWVbMF0gPT0gJyonCi0JCQkgICAgJiYgc3RyY21wIChvcy0+cmVnaW9uLT5uYW1lLCAiKmRlZmF1bHQqIikgPT0gMCkpCi0JCSAgICAgIHsKLQkJCW9zLT5yZWdpb24gPSBsYW5nX21lbW9yeV9kZWZhdWx0IChvcy0+YmZkX3NlY3Rpb24pOwotCQkgICAgICB9Ci0KLQkJICAgIC8qIElmIGEgbG9hZGFibGUgc2VjdGlvbiBpcyB1c2luZyB0aGUgZGVmYXVsdCBtZW1vcnkKLQkJICAgICAgIHJlZ2lvbiwgYW5kIHNvbWUgbm9uIGRlZmF1bHQgbWVtb3J5IHJlZ2lvbnMgd2VyZQotCQkgICAgICAgZGVmaW5lZCwgaXNzdWUgYSB3YXJuaW5nLiAgKi8KLQkJICAgIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChvdXRwdXRfYmZkLCBvcy0+YmZkX3NlY3Rpb24pCi0JCQkgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpKSAhPSAwCi0JCQkmJiAhIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLQkJCSYmIHN0cmNtcCAob3MtPnJlZ2lvbi0+bmFtZSwgIipkZWZhdWx0KiIpID09IDAKLQkJCSYmIGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0ICE9IE5VTEwKLQkJCSYmIChzdHJjbXAgKGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0LT5uYW1lLCAiKmRlZmF1bHQqIikgIT0gMAotCQkJICAgIHx8IGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0LT5uZXh0ICE9IE5VTEwpKQotCQkgICAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6IG5vIG1lbW9yeSByZWdpb24gc3BlY2lmaWVkIGZvciBzZWN0aW9uIGAlcydcbiIpLAotCQkJICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgb3MtPmJmZF9zZWN0aW9uKSk7Ci0KLQkJICAgIGRvdCA9IG9zLT5yZWdpb24tPmN1cnJlbnQ7Ci0gCi0JCSAgICBpZiAob3MtPnNlY3Rpb25fYWxpZ25tZW50ID09IC0xKQotCQkgICAgICB7Ci0JCQliZmRfdm1hIG9sZGRvdDsKLQotCQkJb2xkZG90ID0gZG90OwotCQkJZG90ID0gYWxpZ25fcG93ZXIgKGRvdCwgb3MtPmJmZF9zZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpOwotCi0JCQlpZiAoZG90ICE9IG9sZGRvdCAmJiBjb25maWcud2Fybl9zZWN0aW9uX2FsaWduKQotCQkJICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6IGNoYW5naW5nIHN0YXJ0IG9mIHNlY3Rpb24gJXMgYnkgJXUgYnl0ZXNcbiIpLAotCQkJCSBvcy0+bmFtZSwgKHVuc2lnbmVkIGludCkgKGRvdCAtIG9sZGRvdCkpOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgZXRyZWVfdmFsdWVfdHlwZSByOwotCi0JCSAgICByID0gZXhwX2ZvbGRfdHJlZSAob3MtPmFkZHJfdHJlZSwKLQkJCQkgICAgICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJCSAgICAgICBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bSwKLQkJCQkgICAgICAgZG90LCAmZG90KTsKLQkJICAgIGlmIChyLnZhbGlkX3AgPT0gZmFsc2UpCi0JCSAgICAgIHsKLQkJCWVpbmZvIChfKCIlRiVTOiBub24gY29uc3RhbnQgYWRkcmVzcyBleHByZXNzaW9uIGZvciBzZWN0aW9uICVzXG4iKSwKLQkJCSAgICAgICBvcy0+bmFtZSk7Ci0JCSAgICAgIH0KLQkJICAgIGRvdCA9IHIudmFsdWUgKyByLnNlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWE7Ci0JCSAgfQotCQkKLQkJLyogVGhlIHNlY3Rpb24gc3RhcnRzIGhlcmUuCi0JCSAgIEZpcnN0LCBhbGlnbiB0byB3aGF0IHRoZSBzZWN0aW9uIG5lZWRzLiAgKi8KLQotCQlpZiAob3MtPnNlY3Rpb25fYWxpZ25tZW50ICE9IC0xKQotCQkgIGRvdCA9IGFsaWduX3Bvd2VyIChkb3QsIG9zLT5zZWN0aW9uX2FsaWdubWVudCk7Ci0KLQkJYmZkX3NldF9zZWN0aW9uX3ZtYSAoMCwgb3MtPmJmZF9zZWN0aW9uLCBkb3QpOwotCQkKLQkJb3MtPmJmZF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ID0gMDsKLQkgICAgICB9Ci0KLQkgICAgKHZvaWQpIGxhbmdfc2l6ZV9zZWN0aW9ucyAob3MtPmNoaWxkcmVuLmhlYWQsIG9zLCAmb3MtPmNoaWxkcmVuLmhlYWQsCi0JCQkJICAgICAgIG9zLT5maWxsLCBkb3QsIHJlbGF4KTsKLQkgICAgCi0JICAgIC8qIElnbm9yZSB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc2VjdGlvbnMsIHVzZSB0aGUgdm1hIGFuZCBzaXplIHRvCi0JICAgICAgIGFsaWduIGFnYWluc3QuICAqLwotCi0JICAgIGFmdGVyID0gQUxJR05fTiAob3MtPmJmZF9zZWN0aW9uLT52bWEgKwotCQkJICAgICBvcy0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSwKLQkJCSAgICAgLyogVGhlIGNvZXJjaW9uIGhlcmUgaXMgaW1wb3J0YW50LCBzZWUgbGQuaC4gICovCi0JCQkgICAgIChiZmRfdm1hKSBvcy0+YmxvY2tfdmFsdWUpOwotCi0JICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKG9zLT5iZmRfc2VjdGlvbikpCi0JICAgICAgQVNTRVJUIChhZnRlciA9PSBvcy0+YmZkX3NlY3Rpb24tPnZtYSk7Ci0JICAgIGVsc2UKLQkgICAgICBvcy0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSA9IGFmdGVyIC0gb3MtPmJmZF9zZWN0aW9uLT52bWE7Ci0JICAgIGRvdCA9IG9zLT5iZmRfc2VjdGlvbi0+dm1hICsgb3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemU7Ci0JICAgIG9zLT5wcm9jZXNzZWQgPSB0cnVlOwotCi0JICAgIC8qIFVwZGF0ZSBkb3QgaW4gdGhlIHJlZ2lvbiA/Ci0JICAgICAgIFdlIG9ubHkgZG8gdGhpcyBpZiB0aGUgc2VjdGlvbiBpcyBnb2luZyB0byBiZSBhbGxvY2F0ZWQsCi0JICAgICAgIHNpbmNlIHVuYWxsb2NhdGVkIHNlY3Rpb25zIGRvIG5vdCBjb250cmlidXRlIHRvIHRoZSByZWdpb24ncwotCSAgICAgICBvdmVyYWxsIHNpemUgaW4gbWVtb3J5LiAgKi8KLQkgICAgaWYgKG9zLT5yZWdpb24gIT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEwKLQkJJiYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob3V0cHV0X2JmZCwgb3MtPmJmZF9zZWN0aW9uKQotCQkmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCkpKQotCSAgICAgIHsKLQkJb3MtPnJlZ2lvbi0+Y3VycmVudCA9IGRvdDsKLQkJCi0JCS8qIE1ha2Ugc3VyZSB0aGlzIGlzbid0IHNpbGx5LiAgKi8KLQkJaWYgKG9zLT5yZWdpb24tPmN1cnJlbnQgPCBvcy0+cmVnaW9uLT5vcmlnaW4KLQkJICAgIHx8IChvcy0+cmVnaW9uLT5jdXJyZW50IC0gb3MtPnJlZ2lvbi0+b3JpZ2luCi0JCQk+IG9zLT5yZWdpb24tPmxlbmd0aCkpCi0JCSAgewotCQkgICAgaWYgKG9zLT5hZGRyX3RyZWUgIT0gKGV0cmVlX3R5cGUgKikgTlVMTCkKLQkJICAgICAgewotCQkJZWluZm8gKF8oIiVYJVA6IGFkZHJlc3MgMHgldiBvZiAlQiBzZWN0aW9uICVzIGlzIG5vdCB3aXRoaW4gcmVnaW9uICVzXG4iKSwKLQkJCSAgICAgICBvcy0+cmVnaW9uLT5jdXJyZW50LAotCQkJICAgICAgIG9zLT5iZmRfc2VjdGlvbi0+b3duZXIsCi0JCQkgICAgICAgb3MtPmJmZF9zZWN0aW9uLT5uYW1lLAotCQkJICAgICAgIG9zLT5yZWdpb24tPm5hbWUpOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWVpbmZvIChfKCIlWCVQOiByZWdpb24gJXMgaXMgZnVsbCAoJUIgc2VjdGlvbiAlcylcbiIpLAotCQkJICAgICAgIG9zLT5yZWdpb24tPm5hbWUsCi0JCQkgICAgICAgb3MtPmJmZF9zZWN0aW9uLT5vd25lciwKLQkJCSAgICAgICBvcy0+YmZkX3NlY3Rpb24tPm5hbWUpOwotCQkgICAgICB9Ci0JCSAgICAvKiBSZXNldCB0aGUgcmVnaW9uIHBvaW50ZXIuICAqLwotCQkgICAgb3MtPnJlZ2lvbi0+Y3VycmVudCA9IG9zLT5yZWdpb24tPm9yaWdpbjsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgotCSAgZG90ID0gbGFuZ19zaXplX3NlY3Rpb25zIChjb25zdHJ1Y3Rvcl9saXN0LmhlYWQsCi0JCQkJICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCQkgICAgJnMtPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsCi0JCQkJICAgIGZpbGwsCi0JCQkJICAgIGRvdCwgcmVsYXgpOwotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfZGF0YV9zdGF0ZW1lbnRfZW51bToKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHNpemUgPSAwOwotCi0JICAgIHMtPmRhdGFfc3RhdGVtZW50Lm91dHB1dF92bWEgPSBkb3QgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT52bWE7Ci0JICAgIHMtPmRhdGFfc3RhdGVtZW50Lm91dHB1dF9zZWN0aW9uID0KLQkgICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uOwotCi0JICAgIHN3aXRjaCAocy0+ZGF0YV9zdGF0ZW1lbnQudHlwZSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSBRVUFEOgotCSAgICAgIGNhc2UgU1FVQUQ6Ci0JCXNpemUgPSBRVUFEX1NJWkU7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgTE9ORzoKLQkJc2l6ZSA9IExPTkdfU0laRTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBTSE9SVDoKLQkJc2l6ZSA9IFNIT1JUX1NJWkU7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgQllURToKLQkJc2l6ZSA9IEJZVEVfU0laRTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIGRvdCArPSBzaXplOwotCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgKz0gc2l6ZTsKLQkgICAgLyogVGhlIG91dHB1dCBzZWN0aW9uIGdldHMgY29udGVudHMsIGFuZCB0aGVuIHdlIGluc3BlY3QgZm9yCi0JICAgICAgIGFueSBmbGFncyBzZXQgaW4gdGhlIGlucHV0IHNjcmlwdCB3aGljaCBvdmVycmlkZSBhbnkgQUxMT0MuICAqLwotCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICBpZiAoIShvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmZsYWdzICYgU0VDX05FVkVSX0xPQUQpKSB7Ci0JICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtOgotCSAgewotCSAgICBpbnQgc2l6ZTsKLQotCSAgICBzLT5yZWxvY19zdGF0ZW1lbnQub3V0cHV0X3ZtYSA9Ci0JICAgICAgZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+dm1hOwotCSAgICBzLT5yZWxvY19zdGF0ZW1lbnQub3V0cHV0X3NlY3Rpb24gPQotCSAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb247Ci0JICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHMtPnJlbG9jX3N0YXRlbWVudC5ob3d0byk7Ci0JICAgIGRvdCArPSBzaXplOwotCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgKz0gc2l6ZTsKLQkgIH0KLQkgIGJyZWFrOwotICAgICAKLQljYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQotCSAgZG90ID0gbGFuZ19zaXplX3NlY3Rpb25zIChzLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCQkJCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkJICAgICZzLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCi0JCQkJICAgIGZpbGwsIGRvdCwgcmVsYXgpOwotCi0JICBicmVhazsKLQotCWNhc2UgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bToKLQkgIGxpbmtfaW5mby5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbiA9Ci0JICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb247Ci0JICBicmVhazsKLQljYXNlIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQljYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgotCSAgewotCSAgICBhc2VjdGlvbiAqaTsKLQotCSAgICBpID0gKCpwcmV2KS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uOwotCSAgICBpZiAoISByZWxheCkKLQkgICAgICB7Ci0JCWlmIChpLT5fY29va2VkX3NpemUgPT0gMCkKLQkJICBpLT5fY29va2VkX3NpemUgPSBpLT5fcmF3X3NpemU7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlib29sZWFuIGFnYWluOwotCi0JCWlmICghIGJmZF9yZWxheF9zZWN0aW9uIChpLT5vd25lciwgaSwgJmxpbmtfaW5mbywgJmFnYWluKSkKLQkJICBlaW5mbyAoXygiJVAlRjogY2FuJ3QgcmVsYXggc2VjdGlvbjogJUVcbiIpKTsKLQkJaWYgKGFnYWluKQotCQkgIHJlbGF4X2FnYWluID0gdHJ1ZTsKLQkgICAgICB9Ci0JICAgIGRvdCA9IHNpemVfaW5wdXRfc2VjdGlvbiAocHJldiwKLQkJCQkgICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkJICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5maWxsLAotCQkJCSAgICAgIGRvdCwgcmVsYXgpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtOgotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2ZpbGxfc3RhdGVtZW50X2VudW06Ci0JICBzLT5maWxsX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbiA9IG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb247Ci0KLQkgIGZpbGwgPSBzLT5maWxsX3N0YXRlbWVudC5maWxsOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIGJmZF92bWEgbmV3ZG90ID0gZG90OwotCi0JICAgIGV4cF9mb2xkX3RyZWUgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCwKLQkJCSAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCSAgIGxhbmdfYWxsb2NhdGluZ19waGFzZV9lbnVtLAotCQkJICAgZG90LAotCQkJICAgJm5ld2RvdCk7Ci0KLQkgICAgaWYgKG5ld2RvdCAhPSBkb3QpCi0JICAgICAgewotCQkvKiBUaGUgYXNzaWdubWVudCBjaGFuZ2VkIGRvdC4gIEluc2VydCBhIHBhZC4gICovCi0JCWlmIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgPT0gYWJzX291dHB1dF9zZWN0aW9uKQotCQkgIHsKLQkJICAgIC8qIElmIHdlIGRvbid0IGhhdmUgYW4gb3V0cHV0IHNlY3Rpb24sIHRoZW4ganVzdCBhZGp1c3QKLQkJICAgICAgIHRoZSBkZWZhdWx0IG1lbW9yeSBhZGRyZXNzLiAgKi8KLQkJICAgIGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAgKCIqZGVmYXVsdCoiKS0+Y3VycmVudCA9IG5ld2RvdDsKLQkJICB9Ci0JCWVsc2UgaWYgKCFyZWxheCkKLQkJICB7Ci0JCSAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpuZXcgPQotCQkgICAgICAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikKLQkJICAgICAgIHN0YXRfYWxsb2MgKHNpemVvZiAobGFuZ19wYWRkaW5nX3N0YXRlbWVudF90eXBlKSkpOwotCi0JCSAgICAvKiBMaW5rIGludG8gZXhpc3RpbmcgY2hhaW4uICAqLwotCQkgICAgbmV3LT5oZWFkZXIubmV4dCA9ICpwcmV2OwotCQkgICAgKnByZXYgPSBuZXc7Ci0JCSAgICBuZXctPmhlYWRlci50eXBlID0gbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOwotCQkgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbiA9Ci0JCSAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb247Ci0JCSAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50Lm91dHB1dF9vZmZzZXQgPQotCQkgICAgICBkb3QgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT52bWE7Ci0JCSAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50LmZpbGwgPSBmaWxsOwotCQkgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5zaXplID0gbmV3ZG90IC0gZG90OwotCQkgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplICs9Ci0JCSAgICAgIG5ldy0+cGFkZGluZ19zdGF0ZW1lbnQuc2l6ZTsKLQkJICB9Ci0KLQkJZG90ID0gbmV3ZG90OwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW06Ci0JICAvKiBJZiB3ZSBhcmUgcmVsYXhpbmcsIGFuZCB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgcGFzcywgc29tZQotCSAgICAgcGFkZGluZyBzdGF0ZW1lbnRzIG1heSBoYXZlIGJlZW4gaW5zZXJ0ZWQgZHVyaW5nIHByZXZpb3VzCi0JICAgICBwYXNzZXMuICBXZSBtYXkgaGF2ZSB0byBtb3ZlIHRoZSBwYWRkaW5nIHN0YXRlbWVudCB0byBhIG5ldwotCSAgICAgbG9jYXRpb24gaWYgZG90IGhhcyBhIGRpZmZlcmVudCB2YWx1ZSBhdCB0aGlzIHBvaW50IGluIHRoaXMKLQkgICAgIHBhc3MgdGhhbiBpdCBkaWQgYXQgdGhpcyBwb2ludCBpbiB0aGUgcHJldmlvdXMgcGFzcy4gICovCi0JICBzLT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfb2Zmc2V0ID0KLQkgICAgZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+dm1hOwotCSAgZG90ICs9IHMtPnBhZGRpbmdfc3RhdGVtZW50LnNpemU7Ci0JICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgKz0KLQkgICAgcy0+cGFkZGluZ19zdGF0ZW1lbnQuc2l6ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtOgotCSAgZG90ID0gbGFuZ19zaXplX3NlY3Rpb25zIChzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQkJCQkgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCQkJCSAgICAmcy0+Z3JvdXBfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsCi0JCQkJICAgIGZpbGwsIGRvdCwgcmVsYXgpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgRkFJTCAoKTsKLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIGNhbiBvbmx5IGdldCBoZXJlIHdoZW4gcmVsYXhpbmcgaXMgdHVybmVkIG9uLiAgKi8KLQotCWNhc2UgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF9lbnVtOgotCSAgYnJlYWs7Ci0JfQotICAgICAgcHJldiA9ICZzLT5oZWFkZXIubmV4dDsKLSAgICB9Ci0gIHJldHVybiBkb3Q7Ci19Ci0KLWJmZF92bWEKLWxhbmdfZG9fYXNzaWdubWVudHMgKHMsIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwgZmlsbCwgZG90KQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICogczsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLSAgICAgZmlsbF90eXBlIGZpbGw7Ci0gICAgIGJmZF92bWEgZG90OwotewotICBmb3IgKDsgcyAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotCXsKLQljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgotCSAgZG90ID0gbGFuZ19kb19hc3NpZ25tZW50cyAoY29uc3RydWN0b3JfbGlzdC5oZWFkLAotCQkJCSAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCQkJCSAgICAgZmlsbCwKLQkJCQkgICAgIGRvdCk7Ci0JICBicmVhazsKLQotCWNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQkgIHsKLQkgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MgPQotCSAgICAgICYocy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsKLQotCSAgICBpZiAob3MtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0JICAgICAgewotCQlkb3QgPSBvcy0+YmZkX3NlY3Rpb24tPnZtYTsKLQkJKHZvaWQpIGxhbmdfZG9fYXNzaWdubWVudHMgKG9zLT5jaGlsZHJlbi5oZWFkLCBvcywKLQkJCQkJICAgIG9zLT5maWxsLCBkb3QpOwotCQlkb3QgPSBvcy0+YmZkX3NlY3Rpb24tPnZtYSArIG9zLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplOwotCSAgICAgIH0KLQkgICAgaWYgKG9zLT5sb2FkX2Jhc2UpIAotCSAgICAgIHsKLQkJLyogSWYgbm90aGluZyBoYXMgYmVlbiBwbGFjZWQgaW50byB0aGUgb3V0cHV0IHNlY3Rpb24gdGhlbgotCQkgICBpdCB3b24ndCBoYXZlIGEgYmZkX3NlY3Rpb24uICovCi0JCWlmIChvcy0+YmZkX3NlY3Rpb24pIAotCQkgIHsKLQkJICAgIG9zLT5iZmRfc2VjdGlvbi0+bG1hIAotCQkgICAgICA9IGV4cF9nZXRfYWJzX2ludChvcy0+bG9hZF9iYXNlLCAwLCJsb2FkIGJhc2UiLCBsYW5nX2ZpbmFsX3BoYXNlX2VudW0pOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQotCSAgZG90ID0gbGFuZ19kb19hc3NpZ25tZW50cyAocy0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQkJCQkgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCQkgICAgIGZpbGwsIGRvdCk7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX29iamVjdF9zeW1ib2xzX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19vdXRwdXRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bToKLSNpZiAwCi0JY2FzZSBsYW5nX2NvbW1vbl9zdGF0ZW1lbnRfZW51bToKLSNlbmRpZgotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIGV0cmVlX3ZhbHVlX3R5cGUgdmFsdWU7Ci0KLQkgICAgdmFsdWUgPSBleHBfZm9sZF90cmVlIChzLT5kYXRhX3N0YXRlbWVudC5leHAsCi0JCQkJICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJCSAgIGxhbmdfZmluYWxfcGhhc2VfZW51bSwgZG90LCAmZG90KTsKLQkgICAgcy0+ZGF0YV9zdGF0ZW1lbnQudmFsdWUgPSB2YWx1ZS52YWx1ZTsKLQkgICAgaWYgKHZhbHVlLnZhbGlkX3AgPT0gZmFsc2UpCi0JICAgICAgZWluZm8gKF8oIiVGJVA6IGludmFsaWQgZGF0YSBzdGF0ZW1lbnRcbiIpKTsKLQkgIH0KLQkgIHN3aXRjaCAocy0+ZGF0YV9zdGF0ZW1lbnQudHlwZSkKLQkgICAgewotCSAgICBjYXNlIFFVQUQ6Ci0JICAgIGNhc2UgU1FVQUQ6Ci0JICAgICAgZG90ICs9IFFVQURfU0laRTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBMT05HOgotCSAgICAgIGRvdCArPSBMT05HX1NJWkU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU0hPUlQ6Ci0JICAgICAgZG90ICs9IFNIT1JUX1NJWkU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQllURToKLQkgICAgICBkb3QgKz0gQllURV9TSVpFOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bToKLQkgIHsKLQkgICAgZXRyZWVfdmFsdWVfdHlwZSB2YWx1ZTsKLQotCSAgICB2YWx1ZSA9IGV4cF9mb2xkX3RyZWUgKHMtPnJlbG9jX3N0YXRlbWVudC5hZGRlbmRfZXhwLAotCQkJCSAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCQkgICBsYW5nX2ZpbmFsX3BoYXNlX2VudW0sIGRvdCwgJmRvdCk7Ci0JICAgIHMtPnJlbG9jX3N0YXRlbWVudC5hZGRlbmRfdmFsdWUgPSB2YWx1ZS52YWx1ZTsKLQkgICAgaWYgKHZhbHVlLnZhbGlkX3AgPT0gZmFsc2UpCi0JICAgICAgZWluZm8gKF8oIiVGJVA6IGludmFsaWQgcmVsb2Mgc3RhdGVtZW50XG4iKSk7Ci0JICB9Ci0JICBkb3QgKz0gYmZkX2dldF9yZWxvY19zaXplIChzLT5yZWxvY19zdGF0ZW1lbnQuaG93dG8pOwotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgotCSAgewotCSAgICBhc2VjdGlvbiAqaW4gPSBzLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb247Ci0KLQkgICAgaWYgKGluLT5fY29va2VkX3NpemUgIT0gMCkKLQkgICAgICBkb3QgKz0gaW4tPl9jb29rZWRfc2l6ZTsKLQkgICAgZWxzZQotCSAgICAgIGRvdCArPSBpbi0+X3Jhd19zaXplOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQljYXNlIGxhbmdfZmlsbF9zdGF0ZW1lbnRfZW51bToKLQkgIGZpbGwgPSBzLT5maWxsX3N0YXRlbWVudC5maWxsOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIGV4cF9mb2xkX3RyZWUgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCwKLQkJCSAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCSAgIGxhbmdfZmluYWxfcGhhc2VfZW51bSwKLQkJCSAgIGRvdCwKLQkJCSAgICZkb3QpOwotCSAgfQotCi0JICBicmVhazsKLQljYXNlIGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfZW51bToKLQkgIGRvdCArPSBzLT5wYWRkaW5nX3N0YXRlbWVudC5zaXplOwotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW06Ci0JICBkb3QgPSBsYW5nX2RvX2Fzc2lnbm1lbnRzIChzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQkJCQkgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCQkgICAgIGZpbGwsIGRvdCk7Ci0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIEZBSUwgKCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bToKLQkgIGJyZWFrOwotCX0KLQotICAgIH0KLSAgcmV0dXJuIGRvdDsKLX0KLQotLyogRml4IGFueSAuc3RhcnRvZi4gb3IgLnNpemVvZi4gc3ltYm9scy4gIFdoZW4gdGhlIGFzc2VtYmxlcnMgc2VlIHRoZQotICAgb3BlcmF0b3IgLnN0YXJ0b2YuIChzZWN0aW9uX25hbWUpLCBpdCBwcm9kdWNlcyBhbiB1bmRlZmluZWQgc3ltYm9sCi0gICAuc3RhcnRvZi5zZWN0aW9uX25hbWUuICBTaW1pbGFybHksIHdoZW4gaXQgc2VlcwotICAgLnNpemVvZi4gKHNlY3Rpb25fbmFtZSksIGl0IHByb2R1Y2VzIGFuIHVuZGVmaW5lZCBzeW1ib2wKLSAgIC5zaXplb2Yuc2VjdGlvbl9uYW1lLiAgRm9yIGFsbCB0aGUgb3V0cHV0IHNlY3Rpb25zLCB3ZSBsb29rIGZvcgotICAgc3VjaCBzeW1ib2xzLCBhbmQgc2V0IHRoZW0gdG8gdGhlIGNvcnJlY3QgdmFsdWUuICAqLwotCi1zdGF0aWMgdm9pZAotbGFuZ19zZXRfc3RhcnRvZiAoKQotewotICBhc2VjdGlvbiAqczsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc2VjbmFtZTsKLSAgICAgIGNoYXIgKmJ1ZjsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIHMpOwotICAgICAgYnVmID0geG1hbGxvYyAoMTAgKyBzdHJsZW4gKHNlY25hbWUpKTsKLQotICAgICAgc3ByaW50ZiAoYnVmLCAiLnN0YXJ0b2YuJXMiLCBzZWNuYW1lKTsKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGJ1ZiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoICE9IE5VTEwgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQl7Ci0JICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCSAgaC0+dS5kZWYudmFsdWUgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLCBzKTsKLQkgIGgtPnUuZGVmLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCX0KLQotICAgICAgc3ByaW50ZiAoYnVmLCAiLnNpemVvZi4lcyIsIHNlY25hbWUpOwotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgYnVmLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gTlVMTCAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCXsKLQkgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JICAgIGgtPnUuZGVmLnZhbHVlID0gcy0+X2Nvb2tlZF9zaXplOwotCSAgZWxzZQotCSAgICBoLT51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQkgIGgtPnUuZGVmLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCX0KLQotICAgICAgZnJlZSAoYnVmKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1sYW5nX2ZpbmlzaCAoKQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgYm9vbGVhbiB3YXJuOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlIHx8IGxpbmtfaW5mby5zaGFyZWQpCi0gICAgd2FybiA9IGZhbHNlOwotICBlbHNlCi0gICAgd2FybiA9IHRydWU7Ci0KLSAgaWYgKGVudHJ5X3N5bWJvbCA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE5vIGVudHJ5IGhhcyBiZWVuIHNwZWNpZmllZC4gIExvb2sgZm9yIHN0YXJ0LCBidXQgZG9uJ3Qgd2FybgotCSBpZiB3ZSBkb24ndCBmaW5kIGl0LiAgKi8KLSAgICAgIGVudHJ5X3N5bWJvbCA9ICJzdGFydCI7Ci0gICAgICB3YXJuID0gZmFsc2U7Ci0gICAgfQotCi0gIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGVudHJ5X3N5bWJvbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLSAgICAgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAmJiBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF92bWEgdmFsOwotCi0gICAgICB2YWwgPSAoaC0+dS5kZWYudmFsdWUKLQkgICAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwKLQkJCQkgICAgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0JICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaWYgKCEgYmZkX3NldF9zdGFydF9hZGRyZXNzIChvdXRwdXRfYmZkLCB2YWwpKQotCWVpbmZvIChfKCIlUCVGOiVzOiBjYW4ndCBzZXQgc3RhcnQgYWRkcmVzc1xuIiksIGVudHJ5X3N5bWJvbCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICBDT05TVCBjaGFyICpzZW5kOwotCi0gICAgICAvKiBXZSBjb3VsZG4ndCBmaW5kIHRoZSBlbnRyeSBzeW1ib2wuICBUcnkgcGFyc2luZyBpdCBhcyBhCi0gICAgICAgICBudW1iZXIuICAqLwotICAgICAgdmFsID0gYmZkX3NjYW5fdm1hIChlbnRyeV9zeW1ib2wsICZzZW5kLCAwKTsKLSAgICAgIGlmICgqc2VuZCA9PSAnXDAnKQotCXsKLQkgIGlmICghIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAob3V0cHV0X2JmZCwgdmFsKSkKLQkgICAgZWluZm8gKF8oIiVQJUY6IGNhbid0IHNldCBzdGFydCBhZGRyZXNzXG4iKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzZWN0aW9uICp0czsKLQotCSAgLyogQ2FuJ3QgZmluZCB0aGUgZW50cnkgc3ltYm9sLCBhbmQgaXQncyBub3QgYSBudW1iZXIuICBVc2UKLQkgICAgIHRoZSBmaXJzdCBhZGRyZXNzIGluIHRoZSB0ZXh0IHNlY3Rpb24uICAqLwotCSAgdHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi50ZXh0Iik7Ci0JICBpZiAodHMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAod2FybikKLQkJZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2wgJXM7IGRlZmF1bHRpbmcgdG8gJVZcbiIpLAotCQkgICAgICAgZW50cnlfc3ltYm9sLCBiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLCB0cykpOwotCSAgICAgIGlmICghIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAob3V0cHV0X2JmZCwKLQkJCQkJICAgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwKLQkJCQkJCQkJdHMpKSkKLQkJZWluZm8gKF8oIiVQJUY6IGNhbid0IHNldCBzdGFydCBhZGRyZXNzXG4iKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICh3YXJuKQotCQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGNhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbCAlczsgbm90IHNldHRpbmcgc3RhcnQgYWRkcmVzc1xuIiksCi0JCSAgICAgICBlbnRyeV9zeW1ib2wpOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogVGhpcyBpcyBhIHNtYWxsIGZ1bmN0aW9uIHVzZWQgd2hlbiB3ZSB3YW50IHRvIGlnbm9yZSBlcnJvcnMgZnJvbQotICAgQkZELiAgKi8KLQotc3RhdGljIHZvaWQKLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLWlnbm9yZV9iZmRfZXJyb3JzIChjb25zdCBjaGFyICpzLCAuLi4pCi0jZWxzZQotaWdub3JlX2JmZF9lcnJvcnMgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci0jZW5kaWYKLXsKLSAgLyogRG9uJ3QgZG8gYW55dGhpbmcuICAqLwotfQotCi0vKiBDaGVjayB0aGF0IHRoZSBhcmNoaXRlY3R1cmUgb2YgYWxsIHRoZSBpbnB1dCBmaWxlcyBpcyBjb21wYXRpYmxlCi0gICB3aXRoIHRoZSBvdXRwdXQgZmlsZS4gIEFsc28gY2FsbCB0aGUgYmFja2VuZCB0byBsZXQgaXQgZG8gYW55Ci0gICBvdGhlciBjaGVja2luZyB0aGF0IGlzIG5lZWRlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1sYW5nX2NoZWNrICgpCi17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKmZpbGU7Ci0gIGJmZCAqaW5wdXRfYmZkOwotICBDT05TVCBiZmRfYXJjaF9pbmZvX3R5cGUgKmNvbXBhdGlibGU7Ci0KLSAgZm9yIChmaWxlID0gZmlsZV9jaGFpbi5oZWFkOwotICAgICAgIGZpbGUgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsKLSAgICAgICBmaWxlID0gZmlsZS0+aW5wdXRfc3RhdGVtZW50Lm5leHQpCi0gICAgewotICAgICAgaW5wdXRfYmZkID0gZmlsZS0+aW5wdXRfc3RhdGVtZW50LnRoZV9iZmQ7Ci0gICAgICBjb21wYXRpYmxlID0gYmZkX2FyY2hfZ2V0X2NvbXBhdGlibGUgKGlucHV0X2JmZCwKLQkJCQkJICAgIG91dHB1dF9iZmQpOwotICAgICAgaWYgKGNvbXBhdGlibGUgPT0gTlVMTCkKLQl7Ci0JICBpZiAoY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2gpCi0JICAgIGVpbmZvIChfKCIlUDogd2FybmluZzogJXMgYXJjaGl0ZWN0dXJlIG9mIGlucHV0IGZpbGUgYCVCJyBpcyBpbmNvbXBhdGlibGUgd2l0aCAlcyBvdXRwdXRcbiIpLAotCQkgICBiZmRfcHJpbnRhYmxlX25hbWUgKGlucHV0X2JmZCksIGlucHV0X2JmZCwKLQkJICAgYmZkX3ByaW50YWJsZV9uYW1lIChvdXRwdXRfYmZkKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgcGZuID0gTlVMTDsKLQotCSAgLyogSWYgd2UgYXJlbid0IHN1cHBvc2VkIHRvIHdhcm4gYWJvdXQgbWlzbWF0Y2hlZCBpbnB1dAotICAgICAgICAgICAgIGZpbGVzLCB0ZW1wb3JhcmlseSBzZXQgdGhlIEJGRCBlcnJvciBoYW5kbGVyIHRvIGEKLSAgICAgICAgICAgICBmdW5jdGlvbiB3aGljaCB3aWxsIGRvIG5vdGhpbmcuICBXZSBzdGlsbCB3YW50IHRvIGNhbGwKLSAgICAgICAgICAgICBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwgc2luY2UgaXQgbWF5IHNldCB1cAotICAgICAgICAgICAgIGluZm9ybWF0aW9uIHdoaWNoIGlzIG5lZWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgaWYgKCEgY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2gpCi0JICAgIHBmbiA9IGJmZF9zZXRfZXJyb3JfaGFuZGxlciAoaWdub3JlX2JmZF9lcnJvcnMpOwotCSAgaWYgKCEgYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGlucHV0X2JmZCwgb3V0cHV0X2JmZCkpCi0JICAgIHsKLQkgICAgICBpZiAoY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2gpCi0JCWVpbmZvIChfKCIlRSVYOiBmYWlsZWQgdG8gbWVyZ2UgdGFyZ2V0IHNwZWNpZmljIGRhdGEgb2YgZmlsZSAlQlxuIiksCi0JCSAgICAgICBpbnB1dF9iZmQpOwotCSAgICB9Ci0JICBpZiAoISBjb21tYW5kX2xpbmUud2Fybl9taXNtYXRjaCkKLQkgICAgYmZkX3NldF9lcnJvcl9oYW5kbGVyIChwZm4pOwotCX0KLSAgICB9Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIGdsb2JhbCBjb21tb24gc3ltYm9scyBhbmQgYXR0YWNoIHRoZW0gdG8gdGhlCi0gICBjb3JyZWN0IHNlY3Rpb24uICBUaGUgLXNvcnQtY29tbW9uIGNvbW1hbmQgbGluZSBzd2l0Y2ggbWF5IGJlIHVzZWQKLSAgIHRvIHJvdWdobHkgc29ydCB0aGUgZW50cmllcyBieSBzaXplLiAgKi8KLQotc3RhdGljIHZvaWQKLWxhbmdfY29tbW9uICgpCi17Ci0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlCi0gICAgICAmJiAhIGNvbW1hbmRfbGluZS5mb3JjZV9jb21tb25fZGVmaW5pdGlvbikKLSAgICByZXR1cm47Ci0KLSAgaWYgKCEgY29uZmlnLnNvcnRfY29tbW9uKQotICAgIGJmZF9saW5rX2hhc2hfdHJhdmVyc2UgKGxpbmtfaW5mby5oYXNoLCBsYW5nX29uZV9jb21tb24sIChQVFIpIE5VTEwpOwotICBlbHNlCi0gICAgewotICAgICAgaW50IHBvd2VyOwotCi0gICAgICBmb3IgKHBvd2VyID0gNDsgcG93ZXIgPj0gMDsgcG93ZXItLSkKLQliZmRfbGlua19oYXNoX3RyYXZlcnNlIChsaW5rX2luZm8uaGFzaCwgbGFuZ19vbmVfY29tbW9uLAotCQkJCShQVFIpICZwb3dlcik7Ci0gICAgfQotfQotCi0vKiBQbGFjZSBvbmUgY29tbW9uIHN5bWJvbCBpbiB0aGUgY29ycmVjdCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxhbmdfb25lX2NvbW1vbiAoaCwgaW5mbykKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpbmZvOwotewotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotICBiZmRfdm1hIHNpemU7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gIGlmIChoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNpemUgPSBoLT51LmMuc2l6ZTsKLSAgcG93ZXJfb2ZfdHdvID0gaC0+dS5jLnAtPmFsaWdubWVudF9wb3dlcjsKLQotICBpZiAoY29uZmlnLnNvcnRfY29tbW9uCi0gICAgICAmJiBwb3dlcl9vZl90d28gPCAodW5zaWduZWQgaW50KSAqKGludCAqKSBpbmZvKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNlY3Rpb24gPSBoLT51LmMucC0+c2VjdGlvbjsKLQotICAvKiBJbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCi0gIHNlY3Rpb24tPl9jb29rZWRfc2l6ZSA9IEFMSUdOX04gKHNlY3Rpb24tPl9jb29rZWRfc2l6ZSwKLQkJCQkgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0KLSAgLyogQWRqdXN0IHRoZSBhbGlnbm1lbnQgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKHBvd2VyX29mX3R3byA+IHNlY3Rpb24tPmFsaWdubWVudF9wb3dlcikKLSAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSBwb3dlcl9vZl90d287Ci0KLSAgLyogQ2hhbmdlIHRoZSBzeW1ib2wgZnJvbSBjb21tb24gdG8gZGVmaW5lZC4gICovCi0gIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0gIGgtPnUuZGVmLnNlY3Rpb24gPSBzZWN0aW9uOwotICBoLT51LmRlZi52YWx1ZSA9IHNlY3Rpb24tPl9jb29rZWRfc2l6ZTsKLQotICAvKiBJbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCi0gIHNlY3Rpb24tPl9jb29rZWRfc2l6ZSArPSBzaXplOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgc2VjdGlvbiBpcyBhbGxvY2F0ZWQgaW4gbWVtb3J5LCBhbmQgbWFrZSBzdXJlIHRoYXQKLSAgICAgaXQgaXMgbm8gbG9uZ2VyIGEgY29tbW9uIHNlY3Rpb24uICAqLwotICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfQUxMT0M7Ci0gIHNlY3Rpb24tPmZsYWdzICY9IH4gU0VDX0lTX0NPTU1PTjsKLQotICBpZiAoY29uZmlnLm1hcF9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgc3RhdGljIGJvb2xlYW4gaGVhZGVyX3ByaW50ZWQ7Ci0gICAgICBpbnQgbGVuOwotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIGNoYXIgYnVmWzUwXTsKLQotICAgICAgaWYgKCEgaGVhZGVyX3ByaW50ZWQpCi0JewotCSAgbWluZm8gKF8oIlxuQWxsb2NhdGluZyBjb21tb24gc3ltYm9sc1xuIikpOwotCSAgbWluZm8gKF8oIkNvbW1vbiBzeW1ib2wgICAgICAgc2l6ZSAgICAgICAgICAgICAgZmlsZVxuXG4iKSk7Ci0JICBoZWFkZXJfcHJpbnRlZCA9IHRydWU7Ci0JfQotCi0gICAgICBuYW1lID0gZGVtYW5nbGUgKGgtPnJvb3Quc3RyaW5nKTsKLSAgICAgIG1pbmZvICgiJXMiLCBuYW1lKTsKLSAgICAgIGxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gICAgICBmcmVlIChuYW1lKTsKLQotICAgICAgaWYgKGxlbiA+PSAxOSkKLQl7Ci0JICBwcmludF9ubCAoKTsKLQkgIGxlbiA9IDA7Ci0JfQotICAgICAgd2hpbGUgKGxlbiA8IDIwKQotCXsKLQkgIHByaW50X3NwYWNlICgpOwotCSAgKytsZW47Ci0JfQotCi0gICAgICBtaW5mbyAoIjB4Iik7Ci0gICAgICBpZiAoc2l6ZSA8PSAweGZmZmZmZmZmKQotCXNwcmludGYgKGJ1ZiwgIiVseCIsICh1bnNpZ25lZCBsb25nKSBzaXplKTsKLSAgICAgIGVsc2UKLQlzcHJpbnRmX3ZtYSAoYnVmLCBzaXplKTsKLSAgICAgIG1pbmZvICgiJXMiLCBidWYpOwotICAgICAgbGVuID0gc3RybGVuIChidWYpOwotCi0gICAgICB3aGlsZSAobGVuIDwgMTYpCi0JewotCSAgcHJpbnRfc3BhY2UgKCk7Ci0JICArK2xlbjsKLQl9Ci0KLSAgICAgIG1pbmZvICgiJUJcbiIsIHNlY3Rpb24tPm93bmVyKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1ydW4gdGhyb3VnaCB0aGUgaW5wdXQgZmlsZXMgYW5kIGVuc3VyZSB0aGF0IGV2ZXJ5IGlucHV0Ci1zZWN0aW9uIGhhcyBzb21ld2hlcmUgdG8gZ28uIElmIG9uZSBpcyBmb3VuZCB3aXRob3V0Ci1hIGRlc3RpbmF0aW9uIHRoZW4gY3JlYXRlIGFuIGlucHV0IHJlcXVlc3QgYW5kIHBsYWNlIGl0Ci1pbnRvIHRoZSBzdGF0ZW1lbnQgdHJlZS4KLSovCi0KLXN0YXRpYyB2b2lkCi1sYW5nX3BsYWNlX29ycGhhbnMgKCkKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLQotICBmb3IgKGZpbGUgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBmaWxlX2NoYWluLmhlYWQ7Ci0gICAgICAgZmlsZSAhPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMOwotICAgICAgIGZpbGUgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBmaWxlLT5uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBmb3IgKHMgPSBmaWxlLT50aGVfYmZkLT5zZWN0aW9uczsKLQkgICBzICE9IChhc2VjdGlvbiAqKSBOVUxMOwotCSAgIHMgPSBzLT5uZXh0KQotCXsKLQkgIGlmIChzLT5vdXRwdXRfc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc2VjdGlvbiBvZiB0aGUgZmlsZSBpcyBub3QgYXR0YXRjaGVkLCByb290Ci0JICAgICAgICAgYXJvdW5kIGZvciBhIHNlbnNpYmxlIHBsYWNlIGZvciBpdCB0byBnbyAqLwotCi0JICAgICAgaWYgKGZpbGUtPmp1c3Rfc3ltc19mbGFnKQotCQl7Ci0JCSAgLyogV2UgYXJlIG9ubHkgcmV0cmlldmluZyBzeW1ib2wgdmFsdWVzIGZyb20gdGhpcwotICAgICAgICAgICAgICAgICAgICAgZmlsZS4gIFdlIHdhbnQgdGhlIHN5bWJvbHMgdG8gYWN0IGFzIHRob3VnaCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBpbiB0aGUgZmlsZSBhcmUgYWJzb2x1dGUuICAqLwotCQkgIHMtPm91dHB1dF9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJICBzLT5vdXRwdXRfb2Zmc2V0ID0gcy0+dm1hOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChzLT5uYW1lLCAiQ09NTU9OIikgPT0gMCkKLQkJewotCQkgIC8qIFRoaXMgaXMgYSBsb25lbHkgY29tbW9uIHNlY3Rpb24gd2hpY2ggbXVzdCBoYXZlCi0JCSAgICAgY29tZSBmcm9tIGFuIGFyY2hpdmUuICBXZSBhdHRhY2ggdG8gdGhlIHNlY3Rpb24KLQkJICAgICB3aXRoIHRoZSB3aWxkY2FyZC4gICovCi0JCSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZQotCQkgICAgICB8fCBjb21tYW5kX2xpbmUuZm9yY2VfY29tbW9uX2RlZmluaXRpb24pCi0JCSAgICB7Ci0JCSAgICAgIGlmIChkZWZhdWx0X2NvbW1vbl9zZWN0aW9uID09IE5VTEwpCi0JCQl7Ci0jaWYgMAotCQkJICAvKiBUaGlzIG1lc3NhZ2UgaGFwcGVucyB3aGVuIHVzaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdnIzLmlmaWxlIGxpbmtlciBzY3JpcHQsIHNvIEkgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCBpdC4gICovCi0JCQkgIGluZm9fbXNnIChfKCIlUDogbm8gW0NPTU1PTl0gY29tbWFuZCwgZGVmYXVsdGluZyB0byAuYnNzXG4iKSk7Ci0jZW5kaWYKLQkJCSAgZGVmYXVsdF9jb21tb25fc2VjdGlvbiA9Ci0JCQkgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwICgiLmJzcyIpOwotCi0JCQl9Ci0JCSAgICAgIHdpbGRfZG9pdCAoJmRlZmF1bHRfY29tbW9uX3NlY3Rpb24tPmNoaWxkcmVuLCBzLAotCQkJCSBkZWZhdWx0X2NvbW1vbl9zZWN0aW9uLCBmaWxlKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGxkZW11bF9wbGFjZV9vcnBoYW4gKGZpbGUsIHMpKQotCQk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MgPQotCQkgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAocy0+bmFtZSk7Ci0KLQkJICB3aWxkX2RvaXQgKCZvcy0+Y2hpbGRyZW4sIHMsIG9zLCBmaWxlKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotCi12b2lkCi1sYW5nX3NldF9mbGFncyAocHRyLCBmbGFncykKLSAgICAgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKnB0cjsKLSAgICAgQ09OU1QgY2hhciAqZmxhZ3M7Ci17Ci0gIGZsYWd3b3JkICpwdHJfZmxhZ3MgPSAmcHRyLT5mbGFnczsKLQotICBwdHItPmZsYWdzID0gcHRyLT5ub3RfZmxhZ3MgPSAwOwotICB3aGlsZSAoKmZsYWdzKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKmZsYWdzKQotCXsKLQljYXNlICchJzoKLQkgIHB0cl9mbGFncyA9IChwdHJfZmxhZ3MgPT0gJnB0ci0+ZmxhZ3MpID8gJnB0ci0+bm90X2ZsYWdzIDogJnB0ci0+ZmxhZ3M7Ci0JICBicmVhazsKLQotCWNhc2UgJ0EnOiBjYXNlICdhJzoKLQkgICpwdHJfZmxhZ3MgfD0gU0VDX0FMTE9DOwotCSAgYnJlYWs7Ci0KLQljYXNlICdSJzogY2FzZSAncic6Ci0JICAqcHRyX2ZsYWdzIHw9IFNFQ19SRUFET05MWTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnVyc6IGNhc2UgJ3cnOgotCSAgKnB0cl9mbGFncyB8PSBTRUNfREFUQTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnWCc6IGNhc2UgJ3gnOgotCSAgKnB0cl9mbGFncyB8PSBTRUNfQ09ERTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnTCc6IGNhc2UgJ2wnOgotCWNhc2UgJ0knOiBjYXNlICdpJzoKLQkgICpwdHJfZmxhZ3MgfD0gU0VDX0xPQUQ7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBlaW5mbyAoXygiJVAlRjogaW52YWxpZCBzeW50YXggaW4gZmxhZ3NcbiIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGZsYWdzKys7Ci0gICAgfQotfQotCi0vKiBDYWxsIGEgZnVuY3Rpb24gb24gZWFjaCBpbnB1dCBmaWxlLiAgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAotICAgb24gYW4gYXJjaGl2ZSwgYnV0IG5vdCBvbiB0aGUgZWxlbWVudHMuICAqLwotCi12b2lkCi1sYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGZ1bmMpCi0gICAgIHZvaWQgKCpmdW5jKSBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZjsKLQotICBmb3IgKGYgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBpbnB1dF9maWxlX2NoYWluLmhlYWQ7Ci0gICAgICAgZiAhPSBOVUxMOwotICAgICAgIGYgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBmLT5uZXh0X3JlYWxfZmlsZSkKLSAgICBmdW5jIChmKTsKLX0KLQotLyogQ2FsbCBhIGZ1bmN0aW9uIG9uIGVhY2ggZmlsZS4gIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBvbiBhbGwKLSAgIHRoZSBlbGVtZW50cyBvZiBhbiBhcmNoaXZlIHdoaWNoIGFyZSBpbmNsdWRlZCBpbiB0aGUgbGluaywgYnV0IHdpbGwKLSAgIG5vdCBiZSBjYWxsZWQgb24gdGhlIGFyY2hpdmUgZmlsZSBpdHNlbGYuICAqLwotCi12b2lkCi1sYW5nX2Zvcl9lYWNoX2ZpbGUgKGZ1bmMpCi0gICAgIHZvaWQgKCpmdW5jKSBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZjsKLQotICBmb3IgKGYgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBmaWxlX2NoYWluLmhlYWQ7Ci0gICAgICAgZiAhPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMOwotICAgICAgIGYgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBmLT5uZXh0KQotICAgIHsKLSAgICAgIGZ1bmMgKGYpOwotICAgIH0KLX0KLQotI2lmIDAKLQotLyogTm90IHVzZWQuICAqLwotCi12b2lkCi1sYW5nX2Zvcl9lYWNoX2lucHV0X3NlY3Rpb24gKGZ1bmMpCi0gICAgIHZvaWQgKCpmdW5jKSBQQVJBTVMgKChiZmQgKiBhYiwgYXNlY3Rpb24gKiBhcykpOwotewotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmOwotCi0gIGZvciAoZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGZpbGVfY2hhaW4uaGVhZDsKLSAgICAgICBmICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIE5VTEw7Ci0gICAgICAgZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGYtPm5leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIGZvciAocyA9IGYtPnRoZV9iZmQtPnNlY3Rpb25zOwotCSAgIHMgIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0JICAgcyA9IHMtPm5leHQpCi0JewotCSAgZnVuYyAoZi0+dGhlX2JmZCwgcyk7Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmCi0KLXZvaWQKLWxkbGFuZ19hZGRfZmlsZSAoZW50cnkpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiBlbnRyeTsKLXsKLSAgYmZkICoqcHA7Ci0KLSAgbGFuZ19zdGF0ZW1lbnRfYXBwZW5kICgmZmlsZV9jaGFpbiwKLQkJCSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBlbnRyeSwKLQkJCSAmZW50cnktPm5leHQpOwotCi0gIC8qIFRoZSBCRkQgbGlua2VyIG5lZWRzIHRvIGhhdmUgYSBsaXN0IG9mIGFsbCBpbnB1dCBCRkRzIGludm9sdmVkIGluCi0gICAgIGEgbGluay4gICovCi0gIEFTU0VSVCAoZW50cnktPnRoZV9iZmQtPmxpbmtfbmV4dCA9PSAoYmZkICopIE5VTEwpOwotICBBU1NFUlQgKGVudHJ5LT50aGVfYmZkICE9IG91dHB1dF9iZmQpOwotICBmb3IgKHBwID0gJmxpbmtfaW5mby5pbnB1dF9iZmRzOwotICAgICAgICpwcCAhPSAoYmZkICopIE5VTEw7Ci0gICAgICAgcHAgPSAmKCpwcCktPmxpbmtfbmV4dCkKLSAgICA7Ci0gICpwcCA9IGVudHJ5LT50aGVfYmZkOwotICBlbnRyeS0+dGhlX2JmZC0+dXNyZGF0YSA9IChQVFIpIGVudHJ5OwotICBiZmRfc2V0X2dwX3NpemUgKGVudHJ5LT50aGVfYmZkLCBnX3N3aXRjaF92YWx1ZSk7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzZWN0aW9ucyBhbmQgY2hlY2sgZm9yIGFueSB3aGljaCBzaG91bGQgbm90IGJlCi0gICAgIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgV2UgbmVlZCB0byBkbyB0aGlzIG5vdywgc28gdGhhdCB3ZSBjYW4KLSAgICAgbm90aWNlIHdoZW4gdGhlIGJhY2tlbmQgbGlua2VyIHRyaWVzIHRvIHJlcG9ydCBtdWx0aXBsZQotICAgICBkZWZpbml0aW9uIGVycm9ycyBmb3Igc3ltYm9scyB3aGljaCBhcmUgaW4gc2VjdGlvbnMgd2UgYXJlbid0Ci0gICAgIGdvaW5nIHRvIGxpbmsuICBGSVhNRTogSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGVudGlyZWx5IGlnbm9yZQotICAgICBzeW1ib2xzIHdoaWNoIGFyZSBkZWZpbmVkIGluIHNlY3Rpb25zIHdoaWNoIGFyZSBnb2luZyB0byBiZQotICAgICBkaXNjYXJkZWQuICBUaGlzIHdvdWxkIHJlcXVpcmUgbW9kaWZ5aW5nIHRoZSBiYWNrZW5kIGxpbmtlciBmb3IKLSAgICAgZWFjaCBiYWNrZW5kIHdoaWNoIG1pZ2h0IHNldCB0aGUgU0VDX0xJTktfT05DRSBmbGFnLiAgSWYgd2UgZG8KLSAgICAgdGhpcywgd2Ugc2hvdWxkIHByb2JhYmx5IGhhbmRsZSBTRUNfRVhDTFVERSBpbiB0aGUgc2FtZSB3YXkuICAqLwotCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoZW50cnktPnRoZV9iZmQsIHNlY3Rpb25fYWxyZWFkeV9saW5rZWQsIChQVFIpIGVudHJ5KTsKLX0KLQotdm9pZAotbGFuZ19hZGRfb3V0cHV0IChuYW1lLCBmcm9tX3NjcmlwdCkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgaW50IGZyb21fc2NyaXB0OwotewotICAvKiBNYWtlIC1vIG9uIGNvbW1hbmQgbGluZSBvdmVycmlkZSBPVVRQVVQgaW4gc2NyaXB0LiAgKi8KLSAgaWYgKGhhZF9vdXRwdXRfZmlsZW5hbWUgPT0gZmFsc2UgfHwgIWZyb21fc2NyaXB0KQotICAgIHsKLSAgICAgIG91dHB1dF9maWxlbmFtZSA9IG5hbWU7Ci0gICAgICBoYWRfb3V0cHV0X2ZpbGVuYW1lID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmN1cnJlbnRfc2VjdGlvbjsKLQotc3RhdGljIGludAotdG9wb3dlciAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIHVuc2lnbmVkIGludCBpID0gMTsKLSAgaW50IGw7Ci0KLSAgaWYgKHggPCAwKQotICAgIHJldHVybiAtMTsKLQotICBmb3IgKGwgPSAwOyBsIDwgMzI7IGwrKykgCi0gICAgewotICAgICAgaWYgKGkgPj0gKHVuc2lnbmVkIGludCkgeCkKLQlyZXR1cm4gbDsKLSAgICAgIGkgPDw9IDE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi12b2lkCi1sYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X25hbWUsCi0JCQkJICAgICBhZGRyZXNzX2V4cCwgc2VjdHlwZSwgYmxvY2tfdmFsdWUsCi0JCQkJICAgICBhbGlnbiwgc3ViYWxpZ24sIGViYXNlKQotICAgICBjb25zdCBjaGFyICpvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbmFtZTsKLSAgICAgZXRyZWVfdHlwZSAqIGFkZHJlc3NfZXhwOwotICAgICBlbnVtIHNlY3Rpb25fdHlwZSBzZWN0eXBlOwotICAgICBiZmRfdm1hIGJsb2NrX3ZhbHVlOwotICAgICBldHJlZV90eXBlICphbGlnbjsKLSAgICAgZXRyZWVfdHlwZSAqc3ViYWxpZ247Ci0gICAgIGV0cmVlX3R5cGUgKmViYXNlOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBjdXJyZW50X3NlY3Rpb24gPQotICAgb3MgPQotICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X25hbWUpOwotCi0KLQotICAvKiBBZGQgdGhpcyBzdGF0ZW1lbnQgdG8gdHJlZSAqLwotICAvKiAgYWRkX3N0YXRlbWVudChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtLAotICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsqLwotICAvKiBNYWtlIG5leHQgdGhpbmdzIGNoYWluIGludG8gc3ViY2hhaW4gb2YgdGhpcyAqLwotCi0gIGlmIChvcy0+YWRkcl90cmVlID09Ci0gICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMKQotICB7Ci0gICAgb3MtPmFkZHJfdHJlZSA9Ci0gICAgIGFkZHJlc3NfZXhwOwotICB9Ci0gIG9zLT5zZWN0eXBlID0gc2VjdHlwZTsKLSAgaWYgKHNlY3R5cGUgIT0gbm9sb2FkX3NlY3Rpb24pCi0gICAgb3MtPmZsYWdzID0gU0VDX05PX0ZMQUdTOwotICBlbHNlCi0gICAgb3MtPmZsYWdzID0gU0VDX05FVkVSX0xPQUQ7Ci0gIG9zLT5ibG9ja192YWx1ZSA9IGJsb2NrX3ZhbHVlID8gYmxvY2tfdmFsdWUgOiAxOwotICBzdGF0X3B0ciA9ICZvcy0+Y2hpbGRyZW47Ci0KLSAgb3MtPnN1YnNlY3Rpb25fYWxpZ25tZW50ID0gdG9wb3dlcigKLSAgIGV4cF9nZXRfdmFsdWVfaW50KHN1YmFsaWduLCAtMSwKLQkJICAgICAic3Vic2VjdGlvbiBhbGlnbm1lbnQiLAotCQkgICAgIDApKTsKLSAgb3MtPnNlY3Rpb25fYWxpZ25tZW50ID0gdG9wb3dlcigKLSAgIGV4cF9nZXRfdmFsdWVfaW50KGFsaWduLCAtMSwKLQkJICAgICAic2VjdGlvbiBhbGlnbm1lbnQiLCAwKSk7Ci0KLSAgb3MtPmxvYWRfYmFzZSA9IGViYXNlOwotfQotCi0KLXZvaWQKLWxhbmdfZmluYWwgKCkKLXsKLSAgbGFuZ19vdXRwdXRfc3RhdGVtZW50X3R5cGUgKm5ldyA9Ci0gICAgbmV3X3N0YXQgKGxhbmdfb3V0cHV0X3N0YXRlbWVudCwgc3RhdF9wdHIpOwotCi0gIG5ldy0+bmFtZSA9IG91dHB1dF9maWxlbmFtZTsKLX0KLQotLyogUmVzZXQgdGhlIGN1cnJlbnQgY291bnRlcnMgaW4gdGhlIHJlZ2lvbnMgKi8KLXN0YXRpYyB2b2lkCi1yZXNldF9tZW1vcnlfcmVnaW9ucyAoKQotewotICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqcCA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0OwotCi0gIGZvciAocCA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0OwotICAgICAgIHAgIT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEw7Ci0gICAgICAgcCA9IHAtPm5leHQpCi0gICAgewotICAgICAgcC0+b2xkX2xlbmd0aCA9IChiZmRfc2l6ZV90eXBlKSAocC0+Y3VycmVudCAtIHAtPm9yaWdpbik7Ci0gICAgICBwLT5jdXJyZW50ID0gcC0+b3JpZ2luOwotICAgIH0KLX0KLQotLyogRXhwYW5kIGEgd2lsZCBzdGF0ZW1lbnQgZm9yIGEgcGFydGljdWxhciBGSUxFLCBtYXJraW5nIGl0cyBzZWN0aW9ucyBLRUVQCi0gICBhcyBuZWVkZWQuICBTRUNUSU9OIG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIGl0IGlzIGEgd2lsZCBjYXJkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdjX3NlY3Rpb25fY2FsbGJhY2sgKHB0ciwgc2VjdGlvbiwgZmlsZSwgZGF0YSkKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpwdHI7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICB2b2lkICpkYXRhOwotewotICAvKiBJZiB0aGUgd2lsZCBwYXR0ZXJuIHdhcyBtYXJrZWQgS0VFUCwgdGhlIG1lbWJlciBzZWN0aW9ucwotICAgICBzaG91bGQgYmUgYXMgd2VsbC4gICovCi0gIGlmIChwdHItPmtlZXBfc2VjdGlvbnMpCi0gICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0tFRVA7Ci19Ci0KLS8qIEhhbmRsZSBhIHdpbGQgc3RhdGVtZW50LCBtYXJraW5nIGl0IGFnYWluc3QgR0MuICBTRUNUSU9OIG9yIEZJTEUgb3IgYm90aAotICAgbWF5IGJlIE5VTEwsIGluZGljYXRpbmcgdGhhdCBpdCBpcyBhIHdpbGRjYXJkLiAgKi8KLQotc3RhdGljIHZvaWQKLWxhbmdfZ2Nfd2lsZCAocywgc2VjdGlvbiwgZmlsZSkKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpzOwotICAgICBjb25zdCBjaGFyICpzZWN0aW9uOwotICAgICBjb25zdCBjaGFyICpmaWxlOwotewotICB3YWxrX3dpbGQgKHMsIHNlY3Rpb24sIGZpbGUsIGdjX3NlY3Rpb25fY2FsbGJhY2ssIE5VTEwpOwotfQotCi0vKiBJdGVyYXRlIG92ZXIgc2VjdGlvbnMgbWFya2luZyB0aGVtIGFnYWluc3QgR0MuICAqLwotCi1zdGF0aWMgdm9pZAotbGFuZ19nY19zZWN0aW9uc18xIChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICogczsKLXsKLSAgZm9yICg7IHMgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLQl7Ci0JY2FzZSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW06Ci0JICBsYW5nX2djX3dpbGQgKCZzLT53aWxkX3N0YXRlbWVudCwKLQkJCXMtPndpbGRfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSwKLQkJCXMtPndpbGRfc3RhdGVtZW50LmZpbGVuYW1lKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW06Ci0JICBsYW5nX2djX3NlY3Rpb25zXzEgKGNvbnN0cnVjdG9yX2xpc3QuaGVhZCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0JICBsYW5nX2djX3NlY3Rpb25zXzEgKHMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZ2Nfc2VjdGlvbnNfMSAocy0+Z3JvdXBfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1sYW5nX2djX3NlY3Rpb25zICgpCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlICp1bGlzdCwgZmFrZV9saXN0X3N0YXJ0OwotCi0gIC8qIEtlZXAgYWxsIHNlY3Rpb25zIHNvIG1hcmtlZCBpbiB0aGUgbGluayBzY3JpcHQuICAqLwotCi0gIGxhbmdfZ2Nfc2VjdGlvbnNfMSAoc3RhdGVtZW50X2xpc3QuaGVhZCk7Ci0KLSAgLyogS2VlcCBhbGwgc2VjdGlvbnMgY29udGFpbmluZyBzeW1ib2xzIHVuZGVmaW5lZCBvbiB0aGUgY29tbWFuZC1saW5lLgotICAgICBIYW5kbGUgdGhlIGVudHJ5IHN5bWJvbCBhdCB0aGUgc2FtZSB0aW1lLiAgKi8KLQotICBmYWtlX2xpc3Rfc3RhcnQubmV4dCA9IGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X2hlYWQ7Ci0gIGlmIChlbnRyeV9zeW1ib2wgPT0gTlVMTCkKLSAgICBmYWtlX2xpc3Rfc3RhcnQubmFtZSA9ICJzdGFydCI7Ci0gIGVsc2UKLSAgICBmYWtlX2xpc3Rfc3RhcnQubmFtZSA9IChjaGFyICopIGVudHJ5X3N5bWJvbDsKLQotICBmb3IgKHVsaXN0ID0gJmZha2VfbGlzdF9zdGFydDsgdWxpc3Q7IHVsaXN0ID0gdWxpc3QtPm5leHQpCi0gICAgewotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgdWxpc3QtPm5hbWUsIAotCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gICAgICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotICAgICAgICAgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgICAgICAgICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChoLT51LmRlZi5zZWN0aW9uKSkKLQl7Ci0JICBoLT51LmRlZi5zZWN0aW9uLT5mbGFncyB8PSBTRUNfS0VFUDsKLQl9Ci0gICAgfQotCi0gIGJmZF9nY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci19Ci0KLXZvaWQKLWxhbmdfcHJvY2VzcyAoKQotewotICBsYW5nX3JlYXNvbmFibGVfZGVmYXVsdHMgKCk7Ci0gIGN1cnJlbnRfdGFyZ2V0ID0gZGVmYXVsdF90YXJnZXQ7Ci0KLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGxkbGFuZ19vcGVuX291dHB1dCk7CS8qIE9wZW4gdGhlIG91dHB1dCBmaWxlICovCi0KLSAgbGRlbXVsX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzICgpOwotCi0gIC8qIEFkZCB0byB0aGUgaGFzaCB0YWJsZSBhbGwgdW5kZWZpbmVkcyBvbiB0aGUgY29tbWFuZCBsaW5lICovCi0gIGxhbmdfcGxhY2VfdW5kZWZpbmVkcyAoKTsKLQotICAvKiBDcmVhdGUgYSBiZmQgZm9yIGVhY2ggaW5wdXQgZmlsZSAqLwotICBjdXJyZW50X3RhcmdldCA9IGRlZmF1bHRfdGFyZ2V0OwotICBvcGVuX2lucHV0X2JmZHMgKHN0YXRlbWVudF9saXN0LmhlYWQsIGZhbHNlKTsKLQotICBsZGVtdWxfYWZ0ZXJfb3BlbiAoKTsKLQotICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSdyZSBub3QgbWl4aW5nIGFyY2hpdGVjdHVyZXMuICBXZSBjYWxsIHRoaXMKLSAgICAgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLCBidXQgYmVmb3JlIHdlIGRvIGFueQotICAgICBvdGhlciBwcm9jZXNzaW5nLCBzbyB0aGF0IGFueSBvcGVyYXRpb25zIG1lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgICAgZG9lcyBvbiB0aGUgb3V0cHV0IGZpbGUgd2lsbCBiZSBrbm93biBkdXJpbmcgdGhlIHJlc3Qgb2YgdGhlCi0gICAgIGxpbmsuICAqLwotICBsYW5nX2NoZWNrICgpOwotCi0gIC8qIEhhbmRsZSAuZXhwb3J0cyBpbnN0ZWFkIG9mIGEgdmVyc2lvbiBzY3JpcHQgaWYgd2UncmUgdG9sZCB0byBkbyBzby4gICovCi0gIGlmIChjb21tYW5kX2xpbmUudmVyc2lvbl9leHBvcnRzX3NlY3Rpb24pCi0gICAgbGFuZ19kb192ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbiAoKTsKLQotICAvKiBCdWlsZCBhbGwgc2V0cyBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUgaW5wdXQKLSAgICAgZmlsZXMuICAqLwotICBsZGN0b3JfYnVpbGRfc2V0cyAoKTsKLQotICAvKiBSZW1vdmUgdW5yZWZlcmVuY2VkIHNlY3Rpb25zIGlmIGFza2VkIHRvLiAgKi8KLSAgaWYgKGNvbW1hbmRfbGluZS5nY19zZWN0aW9ucykKLSAgICBsYW5nX2djX3NlY3Rpb25zICgpOwotCi0gIC8qIFNpemUgdXAgdGhlIGNvbW1vbiBkYXRhICovCi0gIGxhbmdfY29tbW9uICgpOwotCi0gIC8qIFJ1biB0aHJvdWdoIHRoZSBjb250b3VycyBvZiB0aGUgc2NyaXB0IGFuZCBhdHRhY2ggaW5wdXQgc2VjdGlvbnMKLSAgICAgdG8gdGhlIGNvcnJlY3Qgb3V0cHV0IHNlY3Rpb25zCi0gICAgICovCi0gIG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMgKHN0YXRlbWVudF9saXN0LmhlYWQsIChjaGFyICopIE5VTEwsCi0JCQkJKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKikgTlVMTCk7Ci0KLQotICAvKiBGaW5kIGFueSBzZWN0aW9ucyBub3QgYXR0YWNoZWQgZXhwbGljaXRseSBhbmQgaGFuZGxlIHRoZW0gKi8KLSAgbGFuZ19wbGFjZV9vcnBoYW5zICgpOwotCi0gIGxkZW11bF9iZWZvcmVfYWxsb2NhdGlvbiAoKTsKLQotICAvKiBXZSBtdXN0IHJlY29yZCB0aGUgcHJvZ3JhbSBoZWFkZXJzIGJlZm9yZSB3ZSB0cnkgdG8gZml4IHRoZQotICAgICBzZWN0aW9uIHBvc2l0aW9ucywgc2luY2UgdGhleSB3aWxsIGFmZmVjdCBTSVpFT0ZfSEVBREVSUy4gICovCi0gIGxhbmdfcmVjb3JkX3BoZHJzICgpOwotCi0gIC8qIE5vdyBydW4gYXJvdW5kIGFuZCByZWxheCBpZiB3ZSBjYW4gKi8KLSAgaWYgKGNvbW1hbmRfbGluZS5yZWxheCkKLSAgICB7Ci0gICAgICAvKiBGaXJzdCB0aW1lIHJvdW5kIGlzIGEgdHJpYWwgcnVuIHRvIGdldCB0aGUgJ3dvcnN0IGNhc2UnCi0JIGFkZHJlc3NlcyBvZiB0aGUgb2JqZWN0cyBpZiB0aGVyZSB3YXMgbm8gcmVsYXhpbmcuICAqLwotICAgICAgbGFuZ19zaXplX3NlY3Rpb25zIChzdGF0ZW1lbnRfbGlzdC5oZWFkLAotCQkJICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICYoc3RhdGVtZW50X2xpc3QuaGVhZCksIDAsIChiZmRfdm1hKSAwLCBmYWxzZSk7Ci0KLSAgICAgIC8qIEtlZXAgcmVsYXhpbmcgdW50aWwgYmZkX3JlbGF4X3NlY3Rpb24gZ2l2ZXMgdXAuICAqLwotICAgICAgZG8KLQl7Ci0JICByZXNldF9tZW1vcnlfcmVnaW9ucyAoKTsKLQotCSAgcmVsYXhfYWdhaW4gPSBmYWxzZTsKLQotCSAgLyogTm90ZTogcGUtZGxsLmMgZG9lcyBzb21ldGhpbmcgbGlrZSB0aGlzIGFsc28uICBJZiB5b3UgZmluZAotCSAgICAgeW91IG5lZWQgdG8gY2hhbmdlIHRoaXMgY29kZSwgeW91IHByb2JhYmx5IG5lZWQgdG8gY2hhbmdlCi0JICAgICBwZS1kbGwuYyBhbHNvLiAgREogKi8KLQotCSAgLyogRG8gYWxsIHRoZSBhc3NpZ25tZW50cyB3aXRoIG91ciBjdXJyZW50IGd1ZXNzZXMgYXMgdG8KLQkgICAgIHNlY3Rpb24gc2l6ZXMuICAqLwotCSAgbGFuZ19kb19hc3NpZ25tZW50cyAoc3RhdGVtZW50X2xpc3QuaGVhZCwKLQkJCSAgICAgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICAgICAgKGZpbGxfdHlwZSkgMCwgKGJmZF92bWEpIDApOwotCi0JICAvKiBQZXJmb3JtIGFub3RoZXIgcmVsYXggcGFzcyAtIHRoaXMgdGltZSB3ZSBrbm93IHdoZXJlIHRoZQotCSAgICAgZ2xvYmFscyBhcmUsIHNvIGNhbiBtYWtlIGJldHRlciBndWVzcy4gICovCi0JICBsYW5nX3NpemVfc2VjdGlvbnMgKHN0YXRlbWVudF9saXN0LmhlYWQsCi0JCQkgICAgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICAgICAmKHN0YXRlbWVudF9saXN0LmhlYWQpLCAwLCAoYmZkX3ZtYSkgMCwgdHJ1ZSk7Ci0JfQotICAgICAgd2hpbGUgKHJlbGF4X2FnYWluKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBTaXplIHVwIHRoZSBzZWN0aW9ucy4gICovCi0gICAgICBsYW5nX3NpemVfc2VjdGlvbnMgKHN0YXRlbWVudF9saXN0LmhlYWQsCi0JCQkgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgJihzdGF0ZW1lbnRfbGlzdC5oZWFkKSwgMCwgKGJmZF92bWEpIDAsIGZhbHNlKTsKLSAgICB9Ci0KLSAgLyogU2VlIGlmIGFueXRoaW5nIHNwZWNpYWwgc2hvdWxkIGJlIGRvbmUgbm93IHdlIGtub3cgaG93IGJpZwotICAgICBldmVyeXRoaW5nIGlzLiAgKi8KLSAgbGRlbXVsX2FmdGVyX2FsbG9jYXRpb24gKCk7Ci0KLSAgLyogRml4IGFueSAuc3RhcnRvZi4gb3IgLnNpemVvZi4gc3ltYm9scy4gICovCi0gIGxhbmdfc2V0X3N0YXJ0b2YgKCk7Ci0KLSAgLyogRG8gYWxsIHRoZSBhc3NpZ25tZW50cywgbm93IHRoYXQgd2Uga25vdyB0aGUgZmluYWwgcmVzdGluZ3BsYWNlcwotICAgICBvZiBhbGwgdGhlIHN5bWJvbHMgKi8KLQotICBsYW5nX2RvX2Fzc2lnbm1lbnRzIChzdGF0ZW1lbnRfbGlzdC5oZWFkLAotCQkgICAgICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkgICAgICAgKGZpbGxfdHlwZSkgMCwgKGJmZF92bWEpIDApOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzZWN0aW9uIGFkZHJlc3NlcyBtYWtlIHNlbnNlLiAgKi8KLSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZQotICAgICAgJiYgY29tbWFuZF9saW5lLmNoZWNrX3NlY3Rpb25fYWRkcmVzc2VzKQotICAgIGxhbmdfY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMgKCk7Ci0gIAotICAvKiBGaW5hbCBzdHVmZnMgKi8KLQotICBsZGVtdWxfZmluaXNoICgpOwotICBsYW5nX2ZpbmlzaCAoKTsKLX0KLQotLyogRVhQT1JURUQgVE8gWUFDQyAqLwotCi12b2lkCi1sYW5nX2FkZF93aWxkIChzZWN0aW9uX25hbWUsIHNlY3Rpb25zX3NvcnRlZCwgZmlsZW5hbWUsIGZpbGVuYW1lc19zb3J0ZWQsCi0JICAgICAgIGtlZXBfc2VjdGlvbnMsIGV4Y2x1ZGVfZmlsZW5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmNvbnN0IHNlY3Rpb25fbmFtZTsKLSAgICAgYm9vbGVhbiBzZWN0aW9uc19zb3J0ZWQ7Ci0gICAgIGNvbnN0IGNoYXIgKmNvbnN0IGZpbGVuYW1lOwotICAgICBib29sZWFuIGZpbGVuYW1lc19zb3J0ZWQ7Ci0gICAgIGJvb2xlYW4ga2VlcF9zZWN0aW9uczsKLSAgICAgY29uc3QgY2hhciAqZXhjbHVkZV9maWxlbmFtZTsKLXsKLSAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpuZXcgPSBuZXdfc3RhdCAobGFuZ193aWxkX3N0YXRlbWVudCwKLQkJCQkJICAgIHN0YXRfcHRyKTsKLQotICBpZiAoc2VjdGlvbl9uYW1lICE9IChjaGFyICopIE5VTEwgJiYgc3RyY21wIChzZWN0aW9uX25hbWUsICJDT01NT04iKSA9PSAwKQotICAgIHsKLSAgICAgIHBsYWNlZF9jb21tb25zID0gdHJ1ZTsKLSAgICB9Ci0gIGlmIChmaWxlbmFtZSAhPSBOVUxMICYmICEgd2lsZGNhcmRwIChmaWxlbmFtZSkpCi0gICAgewotICAgICAgbGFuZ19oYXNfaW5wdXRfZmlsZSA9IHRydWU7Ci0gICAgfQotICBuZXctPnNlY3Rpb25fbmFtZSA9IHNlY3Rpb25fbmFtZTsKLSAgbmV3LT5zZWN0aW9uc19zb3J0ZWQgPSBzZWN0aW9uc19zb3J0ZWQ7Ci0gIG5ldy0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgbmV3LT5maWxlbmFtZXNfc29ydGVkID0gZmlsZW5hbWVzX3NvcnRlZDsKLSAgbmV3LT5rZWVwX3NlY3Rpb25zID0ga2VlcF9zZWN0aW9uczsKLSAgbmV3LT5leGNsdWRlX2ZpbGVuYW1lID0gZXhjbHVkZV9maWxlbmFtZTsKLSAgbGFuZ19saXN0X2luaXQgKCZuZXctPmNoaWxkcmVuKTsKLX0KLQotdm9pZAotbGFuZ19zZWN0aW9uX3N0YXJ0IChuYW1lLCBhZGRyZXNzKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBldHJlZV90eXBlICogYWRkcmVzczsKLXsKLSAgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF90eXBlICphZCA9IG5ld19zdGF0IChsYW5nX2FkZHJlc3Nfc3RhdGVtZW50LCBzdGF0X3B0cik7Ci0KLSAgYWQtPnNlY3Rpb25fbmFtZSA9IG5hbWU7Ci0gIGFkLT5hZGRyZXNzID0gYWRkcmVzczsKLX0KLQotLyogU2V0IHRoZSBzdGFydCBzeW1ib2wgdG8gTkFNRS4gIENNRExJTkUgaXMgbm9uemVybyBpZiB0aGlzIGlzIGNhbGxlZAotICAgYmVjYXVzZSBvZiBhIC1lIGFyZ3VtZW50IG9uIHRoZSBjb21tYW5kIGxpbmUsIG9yIHplcm8gaWYgdGhpcyBpcwotICAgY2FsbGVkIGJ5IEVOVFJZIGluIGEgbGlua2VyIHNjcmlwdC4gIENvbW1hbmQgbGluZSBhcmd1bWVudHMgdGFrZQotICAgcHJlY2VkZW5jZS4gICovCi0KLXZvaWQKLWxhbmdfYWRkX2VudHJ5IChuYW1lLCBjbWRsaW5lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBib29sZWFuIGNtZGxpbmU7Ci17Ci0gIGlmIChlbnRyeV9zeW1ib2wgPT0gTlVMTAotICAgICAgfHwgY21kbGluZQotICAgICAgfHwgISBlbnRyeV9mcm9tX2NtZGxpbmUpCi0gICAgewotICAgICAgZW50cnlfc3ltYm9sID0gbmFtZTsKLSAgICAgIGVudHJ5X2Zyb21fY21kbGluZSA9IGNtZGxpbmU7Ci0gICAgfQotfQotCi12b2lkCi1sYW5nX2FkZF90YXJnZXQgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF90eXBlICpuZXcgPSBuZXdfc3RhdCAobGFuZ190YXJnZXRfc3RhdGVtZW50LAotCQkJCQkgICAgICBzdGF0X3B0cik7Ci0KLSAgbmV3LT50YXJnZXQgPSBuYW1lOwotCi19Ci0KLXZvaWQKLWxhbmdfYWRkX21hcCAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgd2hpbGUgKCpuYW1lKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKm5hbWUpCi0JewotCSAgY2FzZSAnRic6Ci0JICBtYXBfb3B0aW9uX2YgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgICAgbmFtZSsrOwotICAgIH0KLX0KLQotdm9pZAotbGFuZ19hZGRfZmlsbCAoZXhwKQotICAgICBpbnQgZXhwOwotewotICBsYW5nX2ZpbGxfc3RhdGVtZW50X3R5cGUgKm5ldyA9IG5ld19zdGF0IChsYW5nX2ZpbGxfc3RhdGVtZW50LAotCQkJCQkgICAgc3RhdF9wdHIpOwotCi0gIG5ldy0+ZmlsbCA9IGV4cDsKLX0KLQotdm9pZAotbGFuZ19hZGRfZGF0YSAodHlwZSwgZXhwKQotICAgICBpbnQgdHlwZTsKLSAgICAgdW5pb24gZXRyZWVfdW5pb24gKmV4cDsKLXsKLQotICBsYW5nX2RhdGFfc3RhdGVtZW50X3R5cGUgKm5ldyA9IG5ld19zdGF0IChsYW5nX2RhdGFfc3RhdGVtZW50LAotCQkJCQkgICAgc3RhdF9wdHIpOwotCi0gIG5ldy0+ZXhwID0gZXhwOwotICBuZXctPnR5cGUgPSB0eXBlOwotCi19Ci0KLS8qIENyZWF0ZSBhIG5ldyByZWxvYyBzdGF0ZW1lbnQuICBSRUxPQyBpcyB0aGUgQkZEIHJlbG9jYXRpb24gdHlwZSB0bwotICAgZ2VuZXJhdGUuICBIT1dUTyBpcyB0aGUgY29ycmVzcG9uZGluZyBob3d0byBzdHJ1Y3R1cmUgKHdlIGNvdWxkCi0gICBsb29rIHRoaXMgdXAsIGJ1dCB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGRvbmUgc28pLiAgU0VDVElPTiBpcyB0aGUKLSAgIHNlY3Rpb24gdG8gZ2VuZXJhdGUgYSByZWxvYyBhZ2FpbnN0LCBvciBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZQotICAgc3ltYm9sIHRvIGdlbmVyYXRlIGEgcmVsb2MgYWdhaW5zdC4gIEV4YWN0bHkgb25lIG9mIFNFQ1RJT04gYW5kCi0gICBOQU1FIG11c3QgYmUgTlVMTC4gIEFEREVORCBpcyBhbiBleHByZXNzaW9uIGZvciB0aGUgYWRkZW5kLiAgKi8KLQotdm9pZAotbGFuZ19hZGRfcmVsb2MgKHJlbG9jLCBob3d0bywgc2VjdGlvbiwgbmFtZSwgYWRkZW5kKQotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgdW5pb24gZXRyZWVfdW5pb24gKmFkZGVuZDsKLXsKLSAgbGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSAqcCA9IG5ld19zdGF0IChsYW5nX3JlbG9jX3N0YXRlbWVudCwgc3RhdF9wdHIpOwotICAKLSAgcC0+cmVsb2MgPSByZWxvYzsKLSAgcC0+aG93dG8gPSBob3d0bzsKLSAgcC0+c2VjdGlvbiA9IHNlY3Rpb247Ci0gIHAtPm5hbWUgPSBuYW1lOwotICBwLT5hZGRlbmRfZXhwID0gYWRkZW5kOwotCi0gIHAtPmFkZGVuZF92YWx1ZSA9IDA7Ci0gIHAtPm91dHB1dF9zZWN0aW9uID0gTlVMTDsKLSAgcC0+b3V0cHV0X3ZtYSA9IDA7Ci19Ci0KLWxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqCi1sYW5nX2FkZF9hc3NpZ25tZW50IChleHApCi0gICAgIGV0cmVlX3R5cGUgKiBleHA7Ci17Ci0gIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqbmV3ID0gbmV3X3N0YXQgKGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnQsCi0JCQkJCQkgIHN0YXRfcHRyKTsKLQotICBuZXctPmV4cCA9IGV4cDsKLSAgcmV0dXJuIG5ldzsKLX0KLQotdm9pZAotbGFuZ19hZGRfYXR0cmlidXRlIChhdHRyaWJ1dGUpCi0gICAgIGVudW0gc3RhdGVtZW50X2VudW0gYXR0cmlidXRlOwotewotICBuZXdfc3RhdGVtZW50IChhdHRyaWJ1dGUsIHNpemVvZiAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSksIHN0YXRfcHRyKTsKLX0KLQotdm9pZAotbGFuZ19zdGFydHVwIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBpZiAoc3RhcnR1cF9maWxlICE9IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgZWluZm8gKF8oIiVQJUZtdWx0aXBsZSBTVEFSVFVQIGZpbGVzXG4iKSk7Ci0gICAgfQotICBmaXJzdF9maWxlLT5maWxlbmFtZSA9IG5hbWU7Ci0gIGZpcnN0X2ZpbGUtPmxvY2FsX3N5bV9uYW1lID0gbmFtZTsKLSAgZmlyc3RfZmlsZS0+cmVhbCA9IHRydWU7Ci0KLSAgc3RhcnR1cF9maWxlID0gbmFtZTsKLX0KLQotdm9pZAotbGFuZ19mbG9hdCAobWF5YmUpCi0gICAgIGJvb2xlYW4gbWF5YmU7Ci17Ci0gIGxhbmdfZmxvYXRfZmxhZyA9IG1heWJlOwotfQotCi12b2lkCi1sYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAoZmlsbCwgbWVtc3BlYywgcGhkcnMpCi0gICAgIGJmZF92bWEgZmlsbDsKLSAgICAgY29uc3QgY2hhciAqbWVtc3BlYzsKLSAgICAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpwaGRyczsKLXsKLSAgY3VycmVudF9zZWN0aW9uLT5maWxsID0gZmlsbDsKLSAgY3VycmVudF9zZWN0aW9uLT5yZWdpb24gPSBsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwIChtZW1zcGVjKTsKLSAgY3VycmVudF9zZWN0aW9uLT5waGRycyA9IHBoZHJzOwotICBzdGF0X3B0ciA9ICZzdGF0ZW1lbnRfbGlzdDsKLX0KLQotLyoKLSBDcmVhdGUgYW4gYWJzb2x1dGUgc3ltYm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgd2l0aCB0aGUgdmFsdWUgb2YgdGhlCi0gYWRkcmVzcyBvZiBmaXJzdCBieXRlIG9mIHRoZSBzZWN0aW9uIG5hbWVkLgotCi0gSWYgdGhlIHN5bWJvbCBhbHJlYWR5IGV4aXN0cywgdGhlbiBkbyBub3RoaW5nLgotKi8KLXZvaWQKLWxhbmdfYWJzX3N5bWJvbF9hdF9iZWdpbm5pbmdfb2YgKHNlY25hbWUsIG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKnNlY25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIG5hbWUsIHRydWUsIHRydWUsIHRydWUpOwotICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotCi0gIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3Ci0gICAgICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0KLSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBzZWNuYW1lKTsKLSAgICAgIGlmIChzZWMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JaC0+dS5kZWYudmFsdWUgPSAwOwotICAgICAgZWxzZQotCWgtPnUuZGVmLnZhbHVlID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwgc2VjKTsKLQotICAgICAgaC0+dS5kZWYuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgfQotfQotCi0vKgotIENyZWF0ZSBhbiBhYnNvbHV0ZSBzeW1ib2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUKLSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBieXRlIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24gbmFtZWQuCi0KLSBJZiB0aGUgc3ltYm9sIGFscmVhZHkgZXhpc3RzLCB0aGVuIGRvIG5vdGhpbmcuCi0qLwotdm9pZAotbGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZiAoc2VjbmFtZSwgbmFtZSkKLSAgICAgY29uc3QgY2hhciAqc2VjbmFtZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgbmFtZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0KLSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcKLSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIHNlY25hbWUpOwotICAgICAgaWYgKHNlYyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQloLT51LmRlZi52YWx1ZSA9IDA7Ci0gICAgICBlbHNlCi0JaC0+dS5kZWYudmFsdWUgPSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwgc2VjKQotCQkJICArIGJmZF9zZWN0aW9uX3NpemUgKG91dHB1dF9iZmQsIHNlYykpOwotCi0gICAgICBoLT51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICB9Ci19Ci0KLXZvaWQKLWxhbmdfc3RhdGVtZW50X2FwcGVuZCAobGlzdCwgZWxlbWVudCwgZmllbGQpCi0gICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqIGxpc3Q7Ci0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiBlbGVtZW50OwotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqIGZpZWxkOwotewotICAqKGxpc3QtPnRhaWwpID0gZWxlbWVudDsKLSAgbGlzdC0+dGFpbCA9IGZpZWxkOwotfQotCi0vKiBTZXQgdGhlIG91dHB1dCBmb3JtYXQgdHlwZS4gIC1vZm9ybWF0IG92ZXJyaWRlcyBzY3JpcHRzLiAgKi8KLQotdm9pZAotbGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCAoZm9ybWF0LCBiaWcsIGxpdHRsZSwgZnJvbV9zY3JpcHQpCi0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgY29uc3QgY2hhciAqYmlnOwotICAgICBjb25zdCBjaGFyICpsaXR0bGU7Ci0gICAgIGludCBmcm9tX3NjcmlwdDsKLXsKLSAgaWYgKG91dHB1dF90YXJnZXQgPT0gTlVMTCB8fCAhZnJvbV9zY3JpcHQpCi0gICAgewotICAgICAgaWYgKGNvbW1hbmRfbGluZS5lbmRpYW4gPT0gRU5ESUFOX0JJRwotCSAgJiYgYmlnICE9IE5VTEwpCi0JZm9ybWF0ID0gYmlnOwotICAgICAgZWxzZSBpZiAoY29tbWFuZF9saW5lLmVuZGlhbiA9PSBFTkRJQU5fTElUVExFCi0JICAgICAgICYmIGxpdHRsZSAhPSBOVUxMKQotCWZvcm1hdCA9IGxpdHRsZTsKLQotICAgICAgb3V0cHV0X3RhcmdldCA9IGZvcm1hdDsKLSAgICB9Ci19Ci0KLS8qIEVudGVyIGEgZ3JvdXAuICBUaGlzIGNyZWF0ZXMgYSBuZXcgbGFuZ19ncm91cF9zdGF0ZW1lbnQsIGFuZCBzZXRzCi0gICBzdGF0X3B0ciB0byBidWlsZCBuZXcgc3RhdGVtZW50cyB3aXRoaW4gdGhlIGdyb3VwLiAgKi8KLQotdm9pZAotbGFuZ19lbnRlcl9ncm91cCAoKQotewotICBsYW5nX2dyb3VwX3N0YXRlbWVudF90eXBlICpnOwotCi0gIGcgPSBuZXdfc3RhdCAobGFuZ19ncm91cF9zdGF0ZW1lbnQsIHN0YXRfcHRyKTsKLSAgbGFuZ19saXN0X2luaXQgKCZnLT5jaGlsZHJlbik7Ci0gIHN0YXRfcHRyID0gJmctPmNoaWxkcmVuOwotfQotCi0vKiBMZWF2ZSBhIGdyb3VwLiAgVGhpcyBqdXN0IHJlc2V0cyBzdGF0X3B0ciB0byBzdGFydCB3cml0aW5nIHRvIHRoZQotICAgcmVndWxhciBsaXN0IG9mIHN0YXRlbWVudHMgYWdhaW4uICBOb3RlIHRoYXQgdGhpcyB3aWxsIG5vdCB3b3JrIGlmCi0gICBncm91cHMgY2FuIG9jY3VyIGluc2lkZSBhbnl0aGluZyBlbHNlIHdoaWNoIGNhbiBhZGp1c3Qgc3RhdF9wdHIsCi0gICBidXQgY3VycmVudGx5IHRoZXkgY2FuJ3QuICAqLwotCi12b2lkCi1sYW5nX2xlYXZlX2dyb3VwICgpCi17Ci0gIHN0YXRfcHRyID0gJnN0YXRlbWVudF9saXN0OwotfQotCi0vKiBBZGQgYSBuZXcgcHJvZ3JhbSBoZWFkZXIuICBUaGlzIGlzIGNhbGxlZCBmb3IgZWFjaCBlbnRyeSBpbiBhIFBIRFJTCi0gICBjb21tYW5kIGluIGEgbGlua2VyIHNjcmlwdC4gICovCi0KLXZvaWQKLWxhbmdfbmV3X3BoZHIgKG5hbWUsIHR5cGUsIGZpbGVoZHIsIHBoZHJzLCBhdCwgZmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGV0cmVlX3R5cGUgKnR5cGU7Ci0gICAgIGJvb2xlYW4gZmlsZWhkcjsKLSAgICAgYm9vbGVhbiBwaGRyczsKLSAgICAgZXRyZWVfdHlwZSAqYXQ7Ci0gICAgIGV0cmVlX3R5cGUgKmZsYWdzOwotewotICBzdHJ1Y3QgbGFuZ19waGRyICpuLCAqKnBwOwotCi0gIG4gPSAoc3RydWN0IGxhbmdfcGhkciAqKSBzdGF0X2FsbG9jIChzaXplb2YgKHN0cnVjdCBsYW5nX3BoZHIpKTsKLSAgbi0+bmV4dCA9IE5VTEw7Ci0gIG4tPm5hbWUgPSBuYW1lOwotICBuLT50eXBlID0gZXhwX2dldF92YWx1ZV9pbnQgKHR5cGUsIDAsICJwcm9ncmFtIGhlYWRlciB0eXBlIiwKLQkJCSAgICAgICBsYW5nX2ZpbmFsX3BoYXNlX2VudW0pOwotICBuLT5maWxlaGRyID0gZmlsZWhkcjsKLSAgbi0+cGhkcnMgPSBwaGRyczsKLSAgbi0+YXQgPSBhdDsKLSAgbi0+ZmxhZ3MgPSBmbGFnczsKLQotICBmb3IgKHBwID0gJmxhbmdfcGhkcl9saXN0OyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0gICAgOwotICAqcHAgPSBuOwotfQotCi0vKiBSZWNvcmQgdGhlIHByb2dyYW0gaGVhZGVyIGluZm9ybWF0aW9uIGluIHRoZSBvdXRwdXQgQkZELiAgRklYTUU6IFdlCi0gICBzaG91bGQgbm90IGJlIGNhbGxpbmcgYW4gRUxGIHNwZWNpZmljIGZ1bmN0aW9uIGhlcmUuICAqLwotCi1zdGF0aWMgdm9pZAotbGFuZ19yZWNvcmRfcGhkcnMgKCkKLXsKLSAgdW5zaWduZWQgaW50IGFsYzsKLSAgYXNlY3Rpb24gKipzZWNzOwotICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKmxhc3Q7Ci0gIHN0cnVjdCBsYW5nX3BoZHIgKmw7Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnU7Ci0KLSAgYWxjID0gMTA7Ci0gIHNlY3MgPSAoYXNlY3Rpb24gKiopIHhtYWxsb2MgKGFsYyAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICBsYXN0ID0gTlVMTDsKLSAgZm9yIChsID0gbGFuZ19waGRyX2xpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGM7Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgIGJmZF92bWEgYXQ7Ci0KLSAgICAgIGMgPSAwOwotICAgICAgZm9yICh1ID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuaGVhZDsKLQkgICB1ICE9IE5VTEw7Ci0JICAgdSA9IHUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5uZXh0KQotCXsKLQkgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCSAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpwbDsKLQotCSAgb3MgPSAmdS0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotCi0JICBwbCA9IG9zLT5waGRyczsKLQkgIGlmIChwbCAhPSBOVUxMKQotCSAgICBsYXN0ID0gcGw7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAob3MtPnNlY3R5cGUgPT0gbm9sb2FkX3NlY3Rpb24KLQkJICB8fCBvcy0+YmZkX3NlY3Rpb24gPT0gTlVMTAotCQkgIHx8IChvcy0+YmZkX3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotCQljb250aW51ZTsKLQkgICAgICBwbCA9IGxhc3Q7Ci0JICAgIH0KLQotCSAgaWYgKG9zLT5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgZm9yICg7IHBsICE9IE5VTEw7IHBsID0gcGwtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY21wIChwbC0+bmFtZSwgbC0+bmFtZSkgPT0gMCkKLQkJewotCQkgIGlmIChjID49IGFsYykKLQkJICAgIHsKLQkJICAgICAgYWxjICo9IDI7Ci0JCSAgICAgIHNlY3MgPSAoKGFzZWN0aW9uICoqKQotCQkJICAgICAgeHJlYWxsb2MgKHNlY3MsIGFsYyAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLQkJICAgIH0KLQkJICBzZWNzW2NdID0gb3MtPmJmZF9zZWN0aW9uOwotCQkgICsrYzsKLQkJICBwbC0+dXNlZCA9IHRydWU7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKGwtPmZsYWdzID09IE5VTEwpCi0JZmxhZ3MgPSAwOwotICAgICAgZWxzZQotCWZsYWdzID0gZXhwX2dldF92bWEgKGwtPmZsYWdzLCAwLCAicGhkciBmbGFncyIsCi0JCQkgICAgIGxhbmdfZmluYWxfcGhhc2VfZW51bSk7Ci0KLSAgICAgIGlmIChsLT5hdCA9PSBOVUxMKQotCWF0ID0gMDsKLSAgICAgIGVsc2UKLQlhdCA9IGV4cF9nZXRfdm1hIChsLT5hdCwgMCwgInBoZHIgbG9hZCBhZGRyZXNzIiwKLQkJCSAgbGFuZ19maW5hbF9waGFzZV9lbnVtKTsKLQotICAgICAgaWYgKCEgYmZkX3JlY29yZF9waGRyIChvdXRwdXRfYmZkLCBsLT50eXBlLAotCQkJICAgICBsLT5mbGFncyA9PSBOVUxMID8gZmFsc2UgOiB0cnVlLAotCQkJICAgICBmbGFncywKLQkJCSAgICAgbC0+YXQgPT0gTlVMTCA/IGZhbHNlIDogdHJ1ZSwKLQkJCSAgICAgYXQsIGwtPmZpbGVoZHIsIGwtPnBoZHJzLCBjLCBzZWNzKSkKLQllaW5mbyAoXygiJUYlUDogYmZkX3JlY29yZF9waGRyIGZhaWxlZDogJUVcbiIpKTsKLSAgICB9Ci0KLSAgZnJlZSAoc2Vjcyk7Ci0KLSAgLyogTWFrZSBzdXJlIGFsbCB0aGUgcGhkciBhc3NpZ25tZW50cyBzdWNjZWVkZWQuICAqLwotICBmb3IgKHUgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5oZWFkOwotICAgICAgIHUgIT0gTlVMTDsKLSAgICAgICB1ID0gdS0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Lm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpwbDsKLQotICAgICAgaWYgKHUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBmb3IgKHBsID0gdS0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LnBoZHJzOwotCSAgIHBsICE9IE5VTEw7Ci0JICAgcGwgPSBwbC0+bmV4dCkKLQlpZiAoISBwbC0+dXNlZCAmJiBzdHJjbXAgKHBsLT5uYW1lLCAiTk9ORSIpICE9IDApCi0JICBlaW5mbyAoXygiJVglUDogc2VjdGlvbiBgJXMnIGFzc2lnbmVkIHRvIG5vbi1leGlzdGVudCBwaGRyIGAlcydcbiIpLAotCQkgdS0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Lm5hbWUsIHBsLT5uYW1lKTsKLSAgICB9Ci19Ci0KLS8qIFJlY29yZCBhIGxpc3Qgb2Ygc2VjdGlvbnMgd2hpY2ggbWF5IG5vdCBiZSBjcm9zcyByZWZlcmVuY2VkLiAgKi8KLQotdm9pZAotbGFuZ19hZGRfbm9jcm9zc3JlZiAobCkKLSAgICAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbDsKLXsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKm47Ci0KLSAgbiA9IChzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBuLT5uZXh0ID0gbm9jcm9zc3JlZl9saXN0OwotICBuLT5saXN0ID0gbDsKLSAgbm9jcm9zc3JlZl9saXN0ID0gbjsKLQotICAvKiBTZXQgbm90aWNlX2FsbCBzbyB0aGF0IHdlIGdldCBpbmZvcm1lZCBhYm91dCBhbGwgc3ltYm9scy4gICovCi0gIGxpbmtfaW5mby5ub3RpY2VfYWxsID0gdHJ1ZTsKLX0KLQwKLS8qIE92ZXJsYXkgaGFuZGxpbmcuICBXZSBoYW5kbGUgb3ZlcmxheXMgd2l0aCBzb21lIHN0YXRpYyB2YXJpYWJsZXMuICAqLwotCi0vKiBUaGUgb3ZlcmxheSB2aXJ0dWFsIGFkZHJlc3MuICAqLwotc3RhdGljIGV0cmVlX3R5cGUgKm92ZXJsYXlfdm1hOwotCi0vKiBUaGUgb3ZlcmxheSBsb2FkIGFkZHJlc3MuICAqLwotc3RhdGljIGV0cmVlX3R5cGUgKm92ZXJsYXlfbG1hOwotCi0vKiBXaGV0aGVyIG5vY3Jvc3NyZWZzIGlzIHNldCBmb3IgdGhpcyBvdmVybGF5LiAgKi8KLXN0YXRpYyBpbnQgb3ZlcmxheV9ub2Nyb3NzcmVmczsKLQotLyogQW4gZXhwcmVzc2lvbiBmb3IgdGhlIG1heGltdW0gc2VjdGlvbiBzaXplIHNlZW4gc28gZmFyLiAgKi8KLXN0YXRpYyBldHJlZV90eXBlICpvdmVybGF5X21heDsKLQotLyogQSBsaXN0IG9mIGFsbCB0aGUgc2VjdGlvbnMgaW4gdGhpcyBvdmVybGF5LiAgKi8KLQotc3RydWN0IG92ZXJsYXlfbGlzdAotewotICBzdHJ1Y3Qgb3ZlcmxheV9saXN0ICpuZXh0OwotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3ZlcmxheV9saXN0ICpvdmVybGF5X2xpc3Q7Ci0KLS8qIFN0YXJ0IGhhbmRsaW5nIGFuIG92ZXJsYXkuICAqLwotCi12b2lkCi1sYW5nX2VudGVyX292ZXJsYXkgKHZtYV9leHByLCBsbWFfZXhwciwgbm9jcm9zc3JlZnMpCi0gICAgIGV0cmVlX3R5cGUgKnZtYV9leHByOwotICAgICBldHJlZV90eXBlICpsbWFfZXhwcjsKLSAgICAgaW50IG5vY3Jvc3NyZWZzOwotewotICAvKiBUaGUgZ3JhbW1hciBzaG91bGQgcHJldmVudCBuZXN0ZWQgb3ZlcmxheXMgZnJvbSBvY2N1cnJpbmcuICAqLwotICBBU1NFUlQgKG92ZXJsYXlfdm1hID09IE5VTEwKLQkgICYmIG92ZXJsYXlfbG1hID09IE5VTEwKLQkgICYmIG92ZXJsYXlfbGlzdCA9PSBOVUxMCi0JICAmJiBvdmVybGF5X21heCA9PSBOVUxMKTsKLQotICBvdmVybGF5X3ZtYSA9IHZtYV9leHByOwotICBvdmVybGF5X2xtYSA9IGxtYV9leHByOwotICBvdmVybGF5X25vY3Jvc3NyZWZzID0gbm9jcm9zc3JlZnM7Ci19Ci0KLS8qIFN0YXJ0IGEgc2VjdGlvbiBpbiBhbiBvdmVybGF5LiAgV2UgaGFuZGxlIHRoaXMgYnkgY2FsbGluZwotICAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgd2l0aCB0aGUgY29ycmVjdCBWTUEgYW5kIExNQS4gICovCi0KLXZvaWQKLWxhbmdfZW50ZXJfb3ZlcmxheV9zZWN0aW9uIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3Qgb3ZlcmxheV9saXN0ICpuOwotICBldHJlZV90eXBlICpzaXplOwotCi0gIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChuYW1lLCBvdmVybGF5X3ZtYSwgbm9ybWFsX3NlY3Rpb24sCi0JCQkJICAgICAgIDAsIDAsIDAsIG92ZXJsYXlfbG1hKTsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzZWN0aW9uLCB0aGVuIGJhc2UgdGhlIFZNQSBhbmQgTE1BIG9mIGZ1dHVyZQotICAgICBzZWN0aW9ucyBvbiB0aGlzIG9uZS4gIFRoaXMgd2lsbCB3b3JrIGNvcnJlY3RseSBldmVuIGlmIGAuJyBpcwotICAgICB1c2VkIGluIHRoZSBhZGRyZXNzZXMuICAqLwotICBpZiAob3ZlcmxheV9saXN0ID09IE5VTEwpCi0gICAgewotICAgICAgb3ZlcmxheV92bWEgPSBleHBfbmFtZW9wIChBRERSLCBuYW1lKTsKLSAgICAgIG92ZXJsYXlfbG1hID0gZXhwX25hbWVvcCAoTE9BREFERFIsIG5hbWUpOwotICAgIH0KLQotICAvKiBSZW1lbWJlciB0aGUgc2VjdGlvbi4gICovCi0gIG4gPSAoc3RydWN0IG92ZXJsYXlfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBuLT5vcyA9IGN1cnJlbnRfc2VjdGlvbjsKLSAgbi0+bmV4dCA9IG92ZXJsYXlfbGlzdDsKLSAgb3ZlcmxheV9saXN0ID0gbjsKLQotICBzaXplID0gZXhwX25hbWVvcCAoU0laRU9GLCBuYW1lKTsKLQotICAvKiBBZGp1c3QgdGhlIExNQSBmb3IgdGhlIG5leHQgc2VjdGlvbi4gICovCi0gIG92ZXJsYXlfbG1hID0gZXhwX2Jpbm9wICgnKycsIG92ZXJsYXlfbG1hLCBzaXplKTsKLQotICAvKiBBcnJhbmdlIHRvIHdvcmsgb3V0IHRoZSBtYXhpbXVtIHNlY3Rpb24gZW5kIGFkZHJlc3MuICAqLwotICBpZiAob3ZlcmxheV9tYXggPT0gTlVMTCkKLSAgICBvdmVybGF5X21heCA9IHNpemU7Ci0gIGVsc2UKLSAgICBvdmVybGF5X21heCA9IGV4cF9iaW5vcCAoTUFYX0ssIG92ZXJsYXlfbWF4LCBzaXplKTsKLX0KLQotLyogRmluaXNoIGEgc2VjdGlvbiBpbiBhbiBvdmVybGF5LiAgVGhlcmUgaXNuJ3QgYW55IHNwZWNpYWwgdG8gZG8KLSAgIGhlcmUuICAqLwotCi12b2lkCi1sYW5nX2xlYXZlX292ZXJsYXlfc2VjdGlvbiAoZmlsbCwgcGhkcnMpCi0gICAgIGJmZF92bWEgZmlsbDsKLSAgICAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpwaGRyczsKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY2hhciAqY2xlYW4sICpzMjsKLSAgY29uc3QgY2hhciAqczE7Ci0gIGNoYXIgKmJ1ZjsKLQotICBuYW1lID0gY3VycmVudF9zZWN0aW9uLT5uYW1lOwotCi0gIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChmaWxsLCAiKmRlZmF1bHQqIiwgcGhkcnMpOwotCi0gIC8qIERlZmluZSB0aGUgbWFnaWMgc3ltYm9scy4gICovCi0KLSAgY2xlYW4gPSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0gIHMyID0gY2xlYW47Ci0gIGZvciAoczEgPSBuYW1lOyAqczEgIT0gJ1wwJzsgczErKykKLSAgICBpZiAoaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpzMSkgfHwgKnMxID09ICdfJykKLSAgICAgICpzMisrID0gKnMxOwotICAqczIgPSAnXDAnOwotCi0gIGJ1ZiA9IHhtYWxsb2MgKHN0cmxlbiAoY2xlYW4pICsgc2l6ZW9mICJfX2xvYWRfc3RhcnRfIik7Ci0gIHNwcmludGYgKGJ1ZiwgIl9fbG9hZF9zdGFydF8lcyIsIGNsZWFuKTsKLSAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIGJ1ZiwKLQkJCQkgIGV4cF9uYW1lb3AgKExPQURBRERSLCBuYW1lKSkpOwotCi0gIGJ1ZiA9IHhtYWxsb2MgKHN0cmxlbiAoY2xlYW4pICsgc2l6ZW9mICJfX2xvYWRfc3RvcF8iKTsKLSAgc3ByaW50ZiAoYnVmLCAiX19sb2FkX3N0b3BfJXMiLCBjbGVhbik7Ci0gIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBidWYsCi0JCQkJICBleHBfYmlub3AgKCcrJywKLQkJCQkJICAgICBleHBfbmFtZW9wIChMT0FEQUREUiwgbmFtZSksCi0JCQkJCSAgICAgZXhwX25hbWVvcCAoU0laRU9GLCBuYW1lKSkpKTsKLQotICBmcmVlIChjbGVhbik7Ci19Ci0KLS8qIEZpbmlzaCBhbiBvdmVybGF5LiAgSWYgdGhlcmUgYXJlIGFueSBvdmVybGF5IHdpZGUgc2V0dGluZ3MsIHRoaXMKLSAgIGxvb2tzIHRocm91Z2ggYWxsIHRoZSBzZWN0aW9ucyBpbiB0aGUgb3ZlcmxheSBhbmQgc2V0cyB0aGVtLiAgKi8KLQotdm9pZAotbGFuZ19sZWF2ZV9vdmVybGF5IChmaWxsLCBtZW1zcGVjLCBwaGRycykKLSAgICAgYmZkX3ZtYSBmaWxsOwotICAgICBjb25zdCBjaGFyICptZW1zcGVjOwotICAgICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKnBoZHJzOwotewotICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqcmVnaW9uOwotICBzdHJ1Y3Qgb3ZlcmxheV9saXN0ICpsOwotICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICpub2Nyb3NzcmVmOwotCi0gIGlmIChtZW1zcGVjID09IE5VTEwpCi0gICAgcmVnaW9uID0gTlVMTDsKLSAgZWxzZQotICAgIHJlZ2lvbiA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAgKG1lbXNwZWMpOwotCi0gIG5vY3Jvc3NyZWYgPSBOVUxMOwotCi0gIGwgPSBvdmVybGF5X2xpc3Q7Ci0gIHdoaWxlIChsICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG92ZXJsYXlfbGlzdCAqbmV4dDsKLQotICAgICAgaWYgKGZpbGwgIT0gMCAmJiBsLT5vcy0+ZmlsbCA9PSAwKQotCWwtPm9zLT5maWxsID0gZmlsbDsKLSAgICAgIGlmIChyZWdpb24gIT0gTlVMTCAmJiBsLT5vcy0+cmVnaW9uID09IE5VTEwpCi0JbC0+b3MtPnJlZ2lvbiA9IHJlZ2lvbjsKLSAgICAgIGlmIChwaGRycyAhPSBOVUxMICYmIGwtPm9zLT5waGRycyA9PSBOVUxMKQotCWwtPm9zLT5waGRycyA9IHBoZHJzOwotCi0gICAgICBpZiAob3ZlcmxheV9ub2Nyb3NzcmVmcykKLQl7Ci0JICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICpuYzsKLQotCSAgbmMgPSAoc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqKSB4bWFsbG9jIChzaXplb2YgKm5jKTsKLQkgIG5jLT5uYW1lID0gbC0+b3MtPm5hbWU7Ci0JICBuYy0+bmV4dCA9IG5vY3Jvc3NyZWY7Ci0JICBub2Nyb3NzcmVmID0gbmM7Ci0JfQotCi0gICAgICBuZXh0ID0gbC0+bmV4dDsKLSAgICAgIGZyZWUgKGwpOwotICAgICAgbCA9IG5leHQ7Ci0gICAgfQotCi0gIGlmIChub2Nyb3NzcmVmICE9IE5VTEwpCi0gICAgbGFuZ19hZGRfbm9jcm9zc3JlZiAobm9jcm9zc3JlZik7Ci0KLSAgLyogVXBkYXRlIC4gZm9yIHRoZSBlbmQgb2YgdGhlIG92ZXJsYXkuICAqLwotICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9JywgIi4iLAotCQkJCSAgZXhwX2Jpbm9wICgnKycsIG92ZXJsYXlfdm1hLCBvdmVybGF5X21heCkpKTsKLQotICBvdmVybGF5X3ZtYSA9IE5VTEw7Ci0gIG92ZXJsYXlfbG1hID0gTlVMTDsKLSAgb3ZlcmxheV9ub2Nyb3NzcmVmcyA9IDA7Ci0gIG92ZXJsYXlfbGlzdCA9IE5VTEw7Ci0gIG92ZXJsYXlfbWF4ID0gTlVMTDsKLX0KLQwKLS8qIFZlcnNpb24gaGFuZGxpbmcuICBUaGlzIGlzIG9ubHkgdXNlZnVsIGZvciBFTEYuICAqLwotCi0vKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBob2xkcyB0aGUgdmVyc2lvbiB0cmVlIHRoYXQgd2UgYnVpbGQuICAqLwotCi1zdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKmxhbmdfZWxmX3ZlcnNpb25faW5mbzsKLQotc3RhdGljIGludAotbGFuZ192ZXJzX21hdGNoX2xhbmdfYyAoZXhwciwgc3ltKQotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmV4cHI7Ci0gICAgIGNvbnN0IGNoYXIgKnN5bTsKLXsKLSAgaWYgKGV4cHItPnBhdHRlcm5bMF0gPT0gJyonICYmIGV4cHItPnBhdHRlcm5bMV0gPT0gJ1wwJykKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIGZubWF0Y2ggKGV4cHItPnBhdHRlcm4sIHN5bSwgMCkgPT0gMDsKLX0KLQotc3RhdGljIGludAotbGFuZ192ZXJzX21hdGNoX2xhbmdfY3BsdXNwbHVzIChleHByLCBzeW0pCi0gICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZXhwcjsKLSAgICAgY29uc3QgY2hhciAqc3ltOwotewotICBjaGFyICphbHRfc3ltOwotICBpbnQgcmVzdWx0OwotCi0gIGlmIChleHByLT5wYXR0ZXJuWzBdID09ICcqJyAmJiBleHByLT5wYXR0ZXJuWzFdID09ICdcMCcpCi0gICAgcmV0dXJuIDE7Ci0KLSAgYWx0X3N5bSA9IGNwbHVzX2RlbWFuZ2xlKHN5bSwgLyogRE1HTF9OT19UUEFSQU1TICovIDApOwotICBpZiAoIWFsdF9zeW0pCi0gICAgewotICAgICAgLyogY3BsdXNfZGVtYW5nbGUgKGFsc28pIHJldHVybnMgTlVMTCB3aGVuIGl0IGlzIG5vdCBhIEMrKyBzeW1ib2wuCi0JIFNob3VsZCB3ZSBlYXJseSBvdXQgZmFsc2UgaW4gdGhpcyBjYXNlPyAgKi8KLSAgICAgIHJlc3VsdCA9IGZubWF0Y2ggKGV4cHItPnBhdHRlcm4sIHN5bSwgMCkgPT0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBmbm1hdGNoIChleHByLT5wYXR0ZXJuLCBhbHRfc3ltLCAwKSA9PSAwOwotICAgICAgZnJlZSAoYWx0X3N5bSk7Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWxhbmdfdmVyc19tYXRjaF9sYW5nX2phdmEgKGV4cHIsIHN5bSkKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpleHByOwotICAgICBjb25zdCBjaGFyICpzeW07Ci17Ci0gIGNoYXIgKmFsdF9zeW07Ci0gIGludCByZXN1bHQ7Ci0KLSAgaWYgKGV4cHItPnBhdHRlcm5bMF0gPT0gJyonICYmIGV4cHItPnBhdHRlcm5bMV0gPT0gJ1wwJykKLSAgICByZXR1cm4gMTsKLQotICBhbHRfc3ltID0gY3BsdXNfZGVtYW5nbGUoc3ltLCBETUdMX0pBVkEpOwotICBpZiAoIWFsdF9zeW0pCi0gICAgewotICAgICAgLyogY3BsdXNfZGVtYW5nbGUgKGFsc28pIHJldHVybnMgTlVMTCB3aGVuIGl0IGlzIG5vdCBhIEphdmEgc3ltYm9sLgotCSBTaG91bGQgd2UgZWFybHkgb3V0IGZhbHNlIGluIHRoaXMgY2FzZT8gICovCi0gICAgICByZXN1bHQgPSBmbm1hdGNoIChleHByLT5wYXR0ZXJuLCBzeW0sIDApID09IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gZm5tYXRjaCAoZXhwci0+cGF0dGVybiwgYWx0X3N5bSwgMCkgPT0gMDsKLSAgICAgIGZyZWUgKGFsdF9zeW0pOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBmb3IgZWFjaCB2YXJpYWJsZSBuYW1lIG9yIG1hdGNoIGV4cHJlc3Npb24uICAqLwotCi1zdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKgotbGFuZ19uZXdfdmVyc19yZWdleCAob3JpZywgbmV3LCBsYW5nKQotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKm9yaWc7Ci0gICAgIGNvbnN0IGNoYXIgKm5ldzsKLSAgICAgY29uc3QgY2hhciAqbGFuZzsKLXsKLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpyZXQ7Ci0KLSAgcmV0ID0gKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqKSB4bWFsbG9jIChzaXplb2YgKnJldCk7Ci0gIHJldC0+bmV4dCA9IG9yaWc7Ci0gIHJldC0+cGF0dGVybiA9IG5ldzsKLQotICBpZiAobGFuZyA9PSBOVUxMIHx8IHN0cmNhc2VjbXAgKGxhbmcsICJDIikgPT0gMCkKLSAgICByZXQtPm1hdGNoID0gbGFuZ192ZXJzX21hdGNoX2xhbmdfYzsKLSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobGFuZywgIkMrKyIpID09IDApCi0gICAgcmV0LT5tYXRjaCA9IGxhbmdfdmVyc19tYXRjaF9sYW5nX2NwbHVzcGx1czsKLSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobGFuZywgIkphdmEiKSA9PSAwKQotICAgIHJldC0+bWF0Y2ggPSBsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19qYXZhOwotICBlbHNlCi0gICAgewotICAgICAgZWluZm8gKF8oIiVYJVA6IHVua25vd24gbGFuZ3VhZ2UgYCVzJyBpbiB2ZXJzaW9uIGluZm9ybWF0aW9uXG4iKSwKLQkgICAgIGxhbmcpOwotICAgICAgcmV0LT5tYXRjaCA9IGxhbmdfdmVyc19tYXRjaF9sYW5nX2M7Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGZvciBlYWNoIHNldCBvZiB2YXJpYWJsZSBuYW1lcyBhbmQgbWF0Y2gKLSAgIGV4cHJlc3Npb25zLiAgKi8KLQotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICoKLWxhbmdfbmV3X3ZlcnNfbm9kZSAoZ2xvYmFscywgbG9jYWxzKQotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmdsb2JhbHM7Ci0gICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqbG9jYWxzOwotewotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnJldDsKLQotICByZXQgPSAoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopIHhtYWxsb2MgKHNpemVvZiAqcmV0KTsKLSAgcmV0LT5uZXh0ID0gTlVMTDsKLSAgcmV0LT5uYW1lID0gTlVMTDsKLSAgcmV0LT52ZXJudW0gPSAwOwotICByZXQtPmdsb2JhbHMgPSBnbG9iYWxzOwotICByZXQtPmxvY2FscyA9IGxvY2FsczsKLSAgcmV0LT5kZXBzID0gTlVMTDsKLSAgcmV0LT5uYW1lX2luZHggPSAodW5zaWduZWQgaW50KSAtMTsKLSAgcmV0LT51c2VkID0gMDsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhpcyBzdGF0aWMgdmFyaWFibGUga2VlcHMgdHJhY2sgb2YgdmVyc2lvbiBpbmRpY2VzLiAgKi8KLQotc3RhdGljIGludCB2ZXJzaW9uX2luZGV4OwotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdlIGtub3cgdGhlIG5hbWUgYW5kIGRlcGVuZGVuY2llcyBvZiB0aGUKLSAgIHZlcnNpb24uICAqLwotCi12b2lkCi1sYW5nX3JlZ2lzdGVyX3ZlcnNfbm9kZSAobmFtZSwgdmVyc2lvbiwgZGVwcykKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp2ZXJzaW9uOwotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKmRlcHM7Ci17Ci0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdCwgKipwcDsKLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICplMTsKLQotICAvKiBNYWtlIHN1cmUgdGhpcyBub2RlIGhhcyBhIHVuaXF1ZSBuYW1lLiAgKi8KLSAgZm9yICh0ID0gbGFuZ19lbGZfdmVyc2lvbl9pbmZvOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQotICAgIGlmIChzdHJjbXAgKHQtPm5hbWUsIG5hbWUpID09IDApCi0gICAgICBlaW5mbyAoXygiJVglUDogZHVwbGljYXRlIHZlcnNpb24gdGFnIGAlcydcbiIpLCBuYW1lKTsKLQotICAvKiBDaGVjayB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBtYXRjaCBuYW1lcywgYW5kIG1ha2Ugc3VyZSB0aGVyZQotICAgICBhcmVuJ3QgYW55IGR1cGxpY2F0ZXMuICAqLwotCi0gIGZvciAoZTEgPSB2ZXJzaW9uLT5nbG9iYWxzOyBlMSAhPSBOVUxMOyBlMSA9IGUxLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAodCA9IGxhbmdfZWxmX3ZlcnNpb25faW5mbzsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQl7Ci0JICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmUyOwotCi0JICBmb3IgKGUyID0gdC0+bG9jYWxzOyBlMiAhPSBOVUxMOyBlMiA9IGUyLT5uZXh0KQotCSAgICBpZiAoc3RyY21wIChlMS0+cGF0dGVybiwgZTItPnBhdHRlcm4pID09IDApCi0JICAgICAgZWluZm8gKF8oIiVYJVA6IGR1cGxpY2F0ZSBleHByZXNzaW9uIGAlcycgaW4gdmVyc2lvbiBpbmZvcm1hdGlvblxuIiksCi0JCSAgICAgZTEtPnBhdHRlcm4pOwotCX0KLSAgICB9Ci0KLSAgZm9yIChlMSA9IHZlcnNpb24tPmxvY2FsczsgZTEgIT0gTlVMTDsgZTEgPSBlMS0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHQgPSBsYW5nX2VsZl92ZXJzaW9uX2luZm87IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JewotCSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICplMjsKLQotCSAgZm9yIChlMiA9IHQtPmdsb2JhbHM7IGUyICE9IE5VTEw7IGUyID0gZTItPm5leHQpCi0JICAgIGlmIChzdHJjbXAgKGUxLT5wYXR0ZXJuLCBlMi0+cGF0dGVybikgPT0gMCkKLQkgICAgICBlaW5mbyAoXygiJVglUDogZHVwbGljYXRlIGV4cHJlc3Npb24gYCVzJyBpbiB2ZXJzaW9uIGluZm9ybWF0aW9uXG4iKSwKLQkJICAgICBlMS0+cGF0dGVybik7Ci0JfQotICAgIH0KLQotICB2ZXJzaW9uLT5kZXBzID0gZGVwczsKLSAgdmVyc2lvbi0+bmFtZSA9IG5hbWU7Ci0gICsrdmVyc2lvbl9pbmRleDsKLSAgdmVyc2lvbi0+dmVybnVtID0gdmVyc2lvbl9pbmRleDsKLQotICBmb3IgKHBwID0gJmxhbmdfZWxmX3ZlcnNpb25faW5mbzsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotICAgIDsKLSAgKnBwID0gdmVyc2lvbjsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSBzZWUgYSB2ZXJzaW9uIGRlcGVuZGVuY3kuICAqLwotCi1zdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKgotbGFuZ19hZGRfdmVyc19kZXBlbmQgKGxpc3QsIG5hbWUpCi0gICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqbGlzdDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpyZXQ7Ci0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdDsKLQotICByZXQgPSAoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICopIHhtYWxsb2MgKHNpemVvZiAqcmV0KTsKLSAgcmV0LT5uZXh0ID0gbGlzdDsKLQotICBmb3IgKHQgPSBsYW5nX2VsZl92ZXJzaW9uX2luZm87IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAodC0+bmFtZSwgbmFtZSkgPT0gMCkKLQl7Ci0JICByZXQtPnZlcnNpb25fbmVlZGVkID0gdDsKLQkgIHJldHVybiByZXQ7Ci0JfQotICAgIH0KLQotICBlaW5mbyAoXygiJVglUDogdW5hYmxlIHRvIGZpbmQgdmVyc2lvbiBkZXBlbmRlbmN5IGAlcydcbiIpLCBuYW1lKTsKLQotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZAotbGFuZ19kb192ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbiAoKQotewotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmdyZWcgPSBOVUxMLCAqbHJlZzsKLQotICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpcy0+dGhlX2JmZCwgIi5leHBvcnRzIik7Ci0gICAgICBjaGFyICpjb250ZW50cywgKnA7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGxlbjsKLQotICAgICAgaWYgKHNlYyA9PSBOVUxMKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgbGVuID0gYmZkX3NlY3Rpb25fc2l6ZSAoaXMtPnRoZV9iZmQsIHNlYyk7Ci0gICAgICBjb250ZW50cyA9IHhtYWxsb2MgKGxlbik7Ci0gICAgICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaXMtPnRoZV9iZmQsIHNlYywgY29udGVudHMsIDAsIGxlbikpCi0JZWluZm8gKF8oIiVYJVA6IHVuYWJsZSB0byByZWFkIC5leHBvcnRzIHNlY3Rpb24gY29udGVudHMiKSwgc2VjKTsKLQotICAgICAgcCA9IGNvbnRlbnRzOwotICAgICAgd2hpbGUgKHAgPCBjb250ZW50cytsZW4pCi0JewotCSAgZ3JlZyA9IGxhbmdfbmV3X3ZlcnNfcmVnZXggKGdyZWcsIHAsIE5VTEwpOwotCSAgcCA9IHN0cmNociAocCwgJ1wwJykgKyAxOwotCX0KLQotICAgICAgLyogRG8gbm90IGZyZWUgdGhlIGNvbnRlbnRzLCBhcyB3ZSB1c2VkIHRoZW0gY3JlYXRpbmcgdGhlIHJlZ2V4LiAgKi8KLQotICAgICAgLyogRG8gbm90IGluY2x1ZGUgdGhpcyBzZWN0aW9uIGluIHRoZSBsaW5rLiAgKi8KLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoaXMtPnRoZV9iZmQsIHNlYywKLQliZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGlzLT50aGVfYmZkLCBzZWMpIHwgU0VDX0VYQ0xVREUpOwotICAgIH0KLQotICBscmVnID0gbGFuZ19uZXdfdmVyc19yZWdleCAoTlVMTCwgIioiLCBOVUxMKTsKLSAgbGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUgKGNvbW1hbmRfbGluZS52ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbiwKLQkJCSAgIGxhbmdfbmV3X3ZlcnNfbm9kZSAoZ3JlZywgbHJlZyksIE5VTEwpOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRsYW5nLmggYi9sZC9sZGxhbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkNzk3Mi4uMDAwMDAwMAotLS0gYS9sZC9sZGxhbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi0vKiBsZGxhbmcuaCAtIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlIHN1cHBvcnQKLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotICAgCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotICAgCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIExETEFOR19ICi0jZGVmaW5lIExETEFOR19ICi0KLXR5cGVkZWYgZW51bQotewotICBsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtLAotICBsYW5nX2lucHV0X2ZpbGVfaXNfc3ltYm9sc19vbmx5X2VudW0sCi0gIGxhbmdfaW5wdXRfZmlsZV9pc19tYXJrZXJfZW51bSwKLSAgbGFuZ19pbnB1dF9maWxlX2lzX2Zha2VfZW51bSwKLSAgbGFuZ19pbnB1dF9maWxlX2lzX3NlYXJjaF9maWxlX2VudW0sCi0gIGxhbmdfaW5wdXRfZmlsZV9pc19maWxlX2VudW0KLX0gbGFuZ19pbnB1dF9maWxlX2VudW1fdHlwZTsKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgZmlsbF90eXBlOwotdHlwZWRlZiBzdHJ1Y3Qgc3RhdGVtZW50X2xpc3QKLXsKLSAgdW5pb24gbGFuZ19zdGF0ZW1lbnRfdW5pb24gKmhlYWQ7Ci0gIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICoqdGFpbDsKLX0gbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0IG1lbW9yeV9yZWdpb25fc3RydWN0Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBtZW1vcnlfcmVnaW9uX3N0cnVjdCAqbmV4dDsKLSAgYmZkX3ZtYSBvcmlnaW47Ci0gIGJmZF9zaXplX3R5cGUgbGVuZ3RoOwotICBiZmRfdm1hIGN1cnJlbnQ7Ci0gIGJmZF9zaXplX3R5cGUgb2xkX2xlbmd0aDsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGZsYWd3b3JkIG5vdF9mbGFnczsKLSAgYm9vbGVhbiBoYWRfZnVsbF9tZXNzYWdlOwotfSBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSA7Ci0KLXR5cGVkZWYgc3RydWN0IGxhbmdfc3RhdGVtZW50X2hlYWRlcl9zdHJ1Y3QgCi17Ci0gIHVuaW9uICBsYW5nX3N0YXRlbWVudF91bmlvbiAgKm5leHQ7Ci0gIGVudW0gc3RhdGVtZW50X2VudW0KLSAgICB7Ci0gICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtLAotICAgICAgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfZmlsbF9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfZGF0YV9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bSwKLQotICAgICAgbGFuZ19hZmlsZV9hc2VjdGlvbl9wYWlyX3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW0KLSAgICB9IHR5cGU7Ci19IGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIHVuaW9uIGV0cmVlX3VuaW9uICpleHA7Ci19IGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgY29uc3QgY2hhciAqdGFyZ2V0OwotfSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCBsYW5nX291dHB1dF9zdGF0ZW1lbnRfc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX0gbGFuZ19vdXRwdXRfc3RhdGVtZW50X3R5cGU7Ci0KLS8qIFNlY3Rpb24gdHlwZXMgc3BlY2lmaWVkIGluIGEgbGlua2VyIHNjcmlwdC4gICovCi0KLWVudW0gc2VjdGlvbl90eXBlCi17Ci0gIG5vcm1hbF9zZWN0aW9uLAotICBkc2VjdF9zZWN0aW9uLAotICBjb3B5X3NlY3Rpb24sCi0gIG5vbG9hZF9zZWN0aW9uLAotICBpbmZvX3NlY3Rpb24sCi0gIG92ZXJsYXlfc2VjdGlvbgotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYSBsaXN0IG9mIHByb2dyYW0gaGVhZGVycyBkZXNjcmliaW5nIHNlZ21lbnRzCi0gICBpbiB3aGljaCB0aGlzIHNlY3Rpb24gc2hvdWxkIGJlIHBsYWNlZC4gICovCi0KLXN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdAotewotICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKm5leHQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGJvb2xlYW4gdXNlZDsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3N0cnVjdCAKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bmlvbiBldHJlZV91bmlvbiAqYWRkcl90cmVlOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgY2hpbGRyZW47Ci0gIGNvbnN0IGNoYXIgKm1lbXNwZWM7Ci0gIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICpuZXh0OwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGJvb2xlYW4gcHJvY2Vzc2VkOwotICAgIAotICBhc2VjdGlvbiAqYmZkX3NlY3Rpb247Ci0gIGZsYWd3b3JkIGZsYWdzOwkJLyogT3IgdG9nZXRoZXIgb2YgYWxsIGlucHV0IHNlY3Rpb25zICovCi0gIGVudW0gc2VjdGlvbl90eXBlIHNlY3R5cGU7Ci0gIHN0cnVjdCBtZW1vcnlfcmVnaW9uX3N0cnVjdCAqcmVnaW9uOwotICBzaXplX3QgYmxvY2tfdmFsdWU7Ci0gIGZpbGxfdHlwZSBmaWxsOwotCi0gIGludCBzdWJzZWN0aW9uX2FsaWdubWVudDsgIC8qIGFsaWdubWVudCBvZiBjb21wb25lbnRzICovCi0gIGludCBzZWN0aW9uX2FsaWdubWVudDsgIC8qIGFsaWdubWVudCBvZiBzdGFydCBvZiBzZWN0aW9uICovCi0KLSAgdW5pb24gZXRyZWVfdW5pb24gKmxvYWRfYmFzZTsKLQotICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKnBoZHJzOwotfSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLX0gbGFuZ19jb21tb25fc3RhdGVtZW50X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLX0gbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICBmaWxsX3R5cGUgZmlsbDsKLSAgaW50IHNpemU7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLX0gbGFuZ19maWxsX3N0YXRlbWVudF90eXBlOwotCi10eXBlZGVmIHN0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIHVuc2lnbmVkIGludCB0eXBlOwotICB1bmlvbiAgZXRyZWVfdW5pb24gKmV4cDsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICBiZmRfdm1hIG91dHB1dF92bWE7Ci19IGxhbmdfZGF0YV9zdGF0ZW1lbnRfdHlwZTsKLQotLyogR2VuZXJhdGUgYSByZWxvYyBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0KLSAgLyogUmVsb2MgdG8gZ2VuZXJhdGUuICAqLwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0KLSAgLyogUmVsb2MgaG93dG8gc3RydWN0dXJlLiAgKi8KLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgLyogU2VjdGlvbiB0byBnZW5lcmF0ZSByZWxvYyBhZ2FpbnN0LiAgRXhhY3RseSBvbmUgb2Ygc2VjdGlvbiBhbmQKLSAgICAgbmFtZSBtdXN0IGJlIE5VTEwuICAqLwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICAvKiBOYW1lIG9mIHN5bWJvbCB0byBnZW5lcmF0ZSByZWxvYyBhZ2FpbnN0LiAgRXhhY3RseSBvbmUgb2Ygc2VjdGlvbgotICAgICBhbmQgbmFtZSBtdXN0IGJlIE5VTEwuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIEV4cHJlc3Npb24gZm9yIGFkZGVuZC4gICovCi0gIHVuaW9uIGV0cmVlX3VuaW9uICphZGRlbmRfZXhwOwotCi0gIC8qIFJlc29sdmVkIGFkZGVuZC4gICovCi0gIGJmZF92bWEgYWRkZW5kX3ZhbHVlOwotCi0gIC8qIE91dHB1dCBzZWN0aW9uIHdoZXJlIHJlbG9jIHNob3VsZCBiZSBwZXJmb3JtZWQuICAqLwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0KLSAgLyogVk1BIHdpdGhpbiBvdXRwdXQgc2VjdGlvbi4gICovCi0gIGJmZF92bWEgb3V0cHV0X3ZtYTsKLX0gbGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgLyogTmFtZSBvZiB0aGlzIGZpbGUuICAqLwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgLyogTmFtZSB0byB1c2UgZm9yIHRoZSBzeW1ib2wgZ2l2aW5nIGFkZHJlc3Mgb2YgdGV4dCBzdGFydCAqLwotICAvKiBVc3VhbGx5IHRoZSBzYW1lIGFzIGZpbGVuYW1lLCBidXQgZm9yIGEgZmlsZSBzcGVjJ2Qgd2l0aCAtbAotICAgICB0aGlzIGlzIHRoZSAtbCBzd2l0Y2ggaXRzZWxmIHJhdGhlciB0aGFuIHRoZSBmaWxlbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKmxvY2FsX3N5bV9uYW1lOwotICAgIAotICBiZmQgKnRoZV9iZmQ7Ci0gICAgCi0gIGJvb2xlYW4gY2xvc2VkOwotICBmaWxlX3B0ciBwYXNzaXZlX3Bvc2l0aW9uOwotICAgIAotICAvKiBTeW1ib2wgdGFibGUgb2YgdGhlIGZpbGUuICAqLwotICBhc3ltYm9sICoqYXN5bWJvbHM7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQ7Ci0gICAgCi0gIC8qIFBvaW50IHRvIHRoZSBuZXh0IGZpbGUgLSB3aGF0ZXZlciBpdCBpcywgd2FuZGVycyB1cCBhbmQgZG93bgotICAgICBhcmNoaXZlcyAqLwotICAgIAotICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAgKm5leHQ7Ci0gIC8qIFBvaW50IHRvIHRoZSBuZXh0IGZpbGUsIGJ1dCBza2lwcyBhcmNoaXZlIGNvbnRlbnRzICovCi0gIHVuaW9uICBsYW5nX3N0YXRlbWVudF91bmlvbiAgKm5leHRfcmVhbF9maWxlOwotICAgIAotICBib29sZWFuIGlzX2FyY2hpdmU7Ci0gICAgCi0gIC8qIDEgbWVhbnMgc2VhcmNoIGEgc2V0IG9mIGRpcmVjdG9yaWVzIGZvciB0aGlzIGZpbGUuICAqLwotICBib29sZWFuIHNlYXJjaF9kaXJzX2ZsYWc7Ci0gICAgCi0gIC8qIDEgbWVhbnMgdGhpcyBpcyBiYXNlIGZpbGUgb2YgaW5jcmVtZW50YWwgbG9hZC4KLSAgICAgRG8gbm90IGxvYWQgdGhpcyBmaWxlJ3MgdGV4dCBvciBkYXRhLgotICAgICBBbHNvIGRlZmF1bHQgdGV4dF9zdGFydCB0byBhZnRlciB0aGlzIGZpbGUncyBic3MuICovCi0gICAgCi0gIGJvb2xlYW4ganVzdF9zeW1zX2ZsYWc7Ci0KLSAgLyogV2hldGhlciB0byBzZWFyY2ggZm9yIHRoaXMgZW50cnkgYXMgYSBkeW5hbWljIGFyY2hpdmUuICAqLwotICBib29sZWFuIGR5bmFtaWM7Ci0KLSAgLyogV2hldGhlciB0byBpbmNsdWRlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgYW4gYXJjaGl2ZS4gICovCi0gIGJvb2xlYW4gd2hvbGVfYXJjaGl2ZTsKLQotICBib29sZWFuIGxvYWRlZDsKLSAgICAKLSAgLyogICAgdW5zaWduZWQgaW50IGdsb2JhbHNfaW5fdGhpc19maWxlOyovCi0gIGNvbnN0IGNoYXIgKnRhcmdldDsKLSAgYm9vbGVhbiByZWFsOwotfSBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlOwotCi10eXBlZGVmIHN0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppZmlsZTsKLSAgCi19IGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICpmaWxlOwotfSBsYW5nX2FmaWxlX2FzZWN0aW9uX3BhaXJfc3RhdGVtZW50X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGxhbmdfd2lsZF9zdGF0ZW1lbnRfc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lOwotICBib29sZWFuIHNlY3Rpb25zX3NvcnRlZDsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGJvb2xlYW4gZmlsZW5hbWVzX3NvcnRlZDsKLSAgYm9vbGVhbiBrZWVwX3NlY3Rpb25zOwotICBjb25zdCBjaGFyICpleGNsdWRlX2ZpbGVuYW1lOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgY2hpbGRyZW47Ci19IGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF9zdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICBjb25zdCAgY2hhciAqc2VjdGlvbl9uYW1lOwotICB1bmlvbiAgZXRyZWVfdW5pb24gKmFkZHJlc3M7Ci19IGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICBiZmRfdm1hIG91dHB1dF9vZmZzZXQ7Ci0gIHNpemVfdCBzaXplOwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0gIGZpbGxfdHlwZSBmaWxsOwotfSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X3R5cGU7Ci0KLS8qIEEgZ3JvdXAgc3RhdGVtZW50IGNvbGxlY3RzIGEgc2V0IG9mIGxpYnJhcmllcyB0b2dldGhlci4gIFRoZQotICAgbGlicmFyaWVzIGFyZSBzZWFyY2hlZCBtdWx0aXBsZSB0aW1lcywgdW50aWwgbm8gbmV3IHVuZGVmaW5lZAotICAgc3ltYm9scyBhcmUgZm91bmQuICBUaGUgZWZmZWN0IGlzIHRvIHNlYXJjaCBhIGdyb3VwIG9mIGxpYnJhcmllcyBhcwotICAgdGhvdWdoIHRoZXkgd2VyZSBhIHNpbmdsZSBsaWJyYXJ5LiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgY2hpbGRyZW47Ci19IGxhbmdfZ3JvdXBfc3RhdGVtZW50X3R5cGU7Ci0KLXR5cGVkZWYgdW5pb24gbGFuZ19zdGF0ZW1lbnRfdW5pb24gCi17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgdW5pb24gbGFuZ19zdGF0ZW1lbnRfdW5pb24gKm5leHQ7Ci0gIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSB3aWxkX3N0YXRlbWVudDsKLSAgbGFuZ19kYXRhX3N0YXRlbWVudF90eXBlIGRhdGFfc3RhdGVtZW50OwotICBsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlIHJlbG9jX3N0YXRlbWVudDsKLSAgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF90eXBlIGFkZHJlc3Nfc3RhdGVtZW50OwotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLSAgbGFuZ19hZmlsZV9hc2VjdGlvbl9wYWlyX3N0YXRlbWVudF90eXBlIGFmaWxlX2FzZWN0aW9uX3BhaXJfc3RhdGVtZW50OwotICBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgYXNzaWdubWVudF9zdGF0ZW1lbnQ7Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgaW5wdXRfc3RhdGVtZW50OwotICBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfdHlwZSB0YXJnZXRfc3RhdGVtZW50OwotICBsYW5nX291dHB1dF9zdGF0ZW1lbnRfdHlwZSBvdXRwdXRfc3RhdGVtZW50OwotICBsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSBpbnB1dF9zZWN0aW9uOwotICBsYW5nX2NvbW1vbl9zdGF0ZW1lbnRfdHlwZSBjb21tb25fc3RhdGVtZW50OwotICBsYW5nX29iamVjdF9zeW1ib2xzX3N0YXRlbWVudF90eXBlIG9iamVjdF9zeW1ib2xzX3N0YXRlbWVudDsKLSAgbGFuZ19maWxsX3N0YXRlbWVudF90eXBlIGZpbGxfc3RhdGVtZW50OwotICBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X3R5cGUgcGFkZGluZ19zdGF0ZW1lbnQ7Ci0gIGxhbmdfZ3JvdXBfc3RhdGVtZW50X3R5cGUgZ3JvdXBfc3RhdGVtZW50OwotfSBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlOwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBhIHByb2dyYW0gaGVhZGVyLCBmcm9tIHRoZQotICAgUEhEUlMgY29tbWFuZCBpbiB0aGUgbGlua2VyIHNjcmlwdC4gICovCi0KLXN0cnVjdCBsYW5nX3BoZHIKLXsKLSAgc3RydWN0IGxhbmdfcGhkciAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyB0eXBlOwotICBib29sZWFuIGZpbGVoZHI7Ci0gIGJvb2xlYW4gcGhkcnM7Ci0gIGV0cmVlX3R5cGUgKmF0OwotICBldHJlZV90eXBlICpmbGFnczsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBhIGxpc3Qgb2Ygc2VjdGlvbnMgd2hpY2ggbWF5IG5vdAotICAgY3Jvc3MgcmVmZXJlbmNlIGVhY2ggb3RoZXIuICAqLwotCi1zdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmCi17Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKm5leHQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCi0vKiBUaGUgbGlzdCBvZiBub2Nyb3NzcmVmIGxpc3RzLiAgKi8KLQotc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMKLXsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKm5leHQ7Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKmxpc3Q7Ci19OwotCi1leHRlcm4gc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKm5vY3Jvc3NyZWZfbGlzdDsKLQotZXh0ZXJuIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmFic19vdXRwdXRfc2VjdGlvbjsKLWV4dGVybiBib29sZWFuIGxhbmdfaGFzX2lucHV0X2ZpbGU7Ci1leHRlcm4gZXRyZWVfdHlwZSAqYmFzZTsKLWV4dGVybiBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKnN0YXRfcHRyOwotZXh0ZXJuIGJvb2xlYW4gZGVsZXRlX291dHB1dF9maWxlX29uX2ZhaWx1cmU7Ci0KLWV4dGVybiBjb25zdCBjaGFyICplbnRyeV9zeW1ib2w7Ci1leHRlcm4gYm9vbGVhbiBlbnRyeV9mcm9tX2NtZGxpbmU7Ci0KLWV4dGVybiB2b2lkIGxhbmdfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gc3RydWN0IG1lbW9yeV9yZWdpb25fc3RydWN0ICpsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmNvbnN0KSk7Ci1leHRlcm4gc3RydWN0IG1lbW9yeV9yZWdpb25fc3RydWN0ICpsYW5nX21lbW9yeV9yZWdpb25fZGVmYXVsdAotICBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX21hcCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsYW5nX3NldF9mbGFncyBQQVJBTVMgKChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX291dHB1dCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCBmcm9tX3NjcmlwdCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X25hbWUsCi0JICAgZXRyZWVfdHlwZSAqIGFkZHJlc3NfZXhwLAotCSAgIGVudW0gc2VjdGlvbl90eXBlIHNlY3R5cGUsCi0JICAgYmZkX3ZtYSBibG9ja192YWx1ZSwKLQkgICBldHJlZV90eXBlICphbGlnbiwKLQkgICBldHJlZV90eXBlICpzdWJhbGlnbiwKLQkgICBldHJlZV90eXBlICopKTsKLWV4dGVybiB2b2lkIGxhbmdfZmluYWwgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19wcm9jZXNzIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxhbmdfc2VjdGlvbl9zdGFydCBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuaW9uIGV0cmVlX3VuaW9uICopKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX2VudHJ5IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfdGFyZ2V0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfd2lsZAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGJvb2xlYW4sIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9tYXAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9maWxsIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqIGxhbmdfYWRkX2Fzc2lnbm1lbnQgUEFSQU1TICgodW5pb24gZXRyZWVfdW5pb24gKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfYXR0cmlidXRlIFBBUkFNUyAoKGVudW0gc3RhdGVtZW50X2VudW0pKTsKLWV4dGVybiB2b2lkIGxhbmdfc3RhcnR1cCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxhbmdfZmxvYXQgUEFSQU1TICgoZW51bSBiZmRfYm9vbGVhbikpOwotZXh0ZXJuIHZvaWQgbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQKLSAgUEFSQU1TICgoYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZiBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hYnNfc3ltYm9sX2F0X2JlZ2lubmluZ19vZiBQQVJBTVMgKChjb25zdCBjaGFyICosCi0JCQkJCQkgICAgIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19zdGF0ZW1lbnRfYXBwZW5kIFBBUkFNUyAoKHN0cnVjdCBzdGF0ZW1lbnRfbGlzdCAqLAotCQkJCQkgICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAqLAotCQkJCQkgICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAqKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlCi0gIFBBUkFNUyAoKHZvaWQgKCpkb3RoaXMpIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2Zvcl9lYWNoX2ZpbGUKLSAgUEFSQU1TICgodm9pZCAoKmRvdGhpcykgKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpKTsKLWV4dGVybiBiZmRfdm1hIGxhbmdfZG9fYXNzaWdubWVudHMKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHMsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCSAgIGZpbGxfdHlwZSBmaWxsLAotCSAgIGJmZF92bWEgZG90KSk7Ci0KLSNkZWZpbmUgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQoc3RhdGVtZW50KQkJXAotICBleHRlcm4gbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGZpbGVfY2hhaW47CQkJXAotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzdGF0ZW1lbnQ7CQkJCVwKLSAgZm9yIChzdGF0ZW1lbnQgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKWZpbGVfY2hhaW4uaGVhZDtcCi0gICAgICAgc3RhdGVtZW50ICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopTlVMTDsJCVwKLSAgICAgICBzdGF0ZW1lbnQgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKXN0YXRlbWVudC0+bmV4dClcCi0gIAotZXh0ZXJuIHZvaWQgbGFuZ19wcm9jZXNzIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkbGFuZ19hZGRfZmlsZSBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLWV4dGVybiBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqIGNvbnN0KSk7Ci1leHRlcm4gbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqbGFuZ19hZGRfaW5wdXRfZmlsZQotICBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBsYW5nX2lucHV0X2ZpbGVfZW51bV90eXBlIGZpbGVfdHlwZSwKLQkgICBjb25zdCBjaGFyICp0YXJnZXQpKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX2tlZXBzeW1zX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLWV4dGVybiBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICoKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lKSk7Ci1leHRlcm4gdm9pZCBsZGxhbmdfYWRkX3VuZGVmIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmNvbnN0IG5hbWUpKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX291dHB1dF9mb3JtYXQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCi0JCQkJCSAgICBjb25zdCBjaGFyICosIGludCBmcm9tX3NjcmlwdCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19saXN0X2luaXQgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfZGF0YSBQQVJBTVMgKChpbnQgdHlwZSwgdW5pb24gZXRyZWVfdW5pb24gKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfcmVsb2MKLSAgUEFSQU1TICgoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jLCByZWxvY19ob3d0b190eXBlICpob3d0bywKLQkgICBhc2VjdGlvbiAqc2VjdGlvbiwgY29uc3QgY2hhciAqbmFtZSwgdW5pb24gZXRyZWVfdW5pb24gKmFkZGVuZCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQKLSAgUEFSQU1TICgodm9pZCAoKmZ1bmMpIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKSk7Ci1leHRlcm4gUFRSIHN0YXRfYWxsb2MgUEFSQU1TICgoc2l6ZV90IHNpemUpKTsKLWV4dGVybiB2b2lkIGRwcmludF9zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqLCBpbnQpKTsKLWV4dGVybiBiZmRfdm1hIGxhbmdfc2l6ZV9zZWN0aW9ucwotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzLAotCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcHJldiwgZmlsbF90eXBlIGZpbGwsCi0JICAgYmZkX3ZtYSBkb3QsIGJvb2xlYW4gcmVsYXgpKTsKLWV4dGVybiB2b2lkIGxhbmdfZW50ZXJfZ3JvdXAgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19sZWF2ZV9ncm91cCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCB3aWxkX2RvaXQKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpwdHIsIGFzZWN0aW9uICpzZWN0aW9uLAotCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dCwKLQkgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlKSk7Ci1leHRlcm4gdm9pZCBsYW5nX25ld19waGRyCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgZXRyZWVfdHlwZSAqLCBib29sZWFuLCBib29sZWFuLCBldHJlZV90eXBlICosCi0JICAgZXRyZWVfdHlwZSAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9ub2Nyb3NzcmVmIFBBUkFNUyAoKHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19lbnRlcl9vdmVybGF5IFBBUkFNUyAoKGV0cmVlX3R5cGUgKiwgZXRyZWVfdHlwZSAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIGxhbmdfZW50ZXJfb3ZlcmxheV9zZWN0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19sZWF2ZV9vdmVybGF5X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICopKTsKLWV4dGVybiB2b2lkIGxhbmdfbGVhdmVfb3ZlcmxheQotICBQQVJBTVMgKChiZmRfdm1hLCBjb25zdCBjaGFyICosIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqKSk7Ci0KLWV4dGVybiBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKmxhbmdfZWxmX3ZlcnNpb25faW5mbzsKLQotZXh0ZXJuIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqbGFuZ19uZXdfdmVyc19yZWdleAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKmxhbmdfbmV3X3ZlcnNfbm9kZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKiwgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICopKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKmxhbmdfYWRkX3ZlcnNfZGVwZW5kCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxhbmdfcmVnaXN0ZXJfdmVyc19ub2RlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICosCi0JICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICopKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZGxleC5oIGIvbGQvbGRsZXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0NDRjYS4uMDAwMDAwMAotLS0gYS9sZC9sZGxleC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyogbGRsZXguaCAtCi0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTERMRVhfSAotI2RlZmluZSBMRExFWF9ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vKiBUaGUgaW5pdGlhbCBwYXJzZXIgc3RhdGVzLiAgKi8KLXR5cGVkZWYgZW51bSBpbnB1dF9lbnVtIHsKLSAgaW5wdXRfc2VsZWN0ZWQsCQkvKiBXZSd2ZSBzZXQgdGhlIGluaXRpYWwgc3RhdGUuICAqLwotICBpbnB1dF9zY3JpcHQsCi0gIGlucHV0X21yaV9zY3JpcHQsCi0gIGlucHV0X3ZlcnNpb25fc2NyaXB0LAotICBpbnB1dF9kZWZzeW0KLX0gaW5wdXRfdHlwZTsKLQotZXh0ZXJuIGlucHV0X3R5cGUgcGFyc2VyX2lucHV0OwotCi1leHRlcm4gdW5zaWduZWQgaW50IGxpbmVubzsKLWV4dGVybiBjb25zdCBjaGFyICpsZXhfc3RyaW5nOwotCi0vKiBJbiBsZGxleC5sLiAgKi8KLWV4dGVybiBpbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGV4X3B1c2hfZmlsZSBQQVJBTVMgKChGSUxFICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGV4X3JlZGlyZWN0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGRsZXhfc2NyaXB0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkbGV4X21yaV9zY3JpcHQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRsZXhfdmVyc2lvbl9zY3JpcHQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRsZXhfdmVyc2lvbl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkbGV4X2RlZnN5bSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGxleF9leHByZXNzaW9uIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkbGV4X2JvdGggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRsZXhfY29tbWFuZCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGxleF9wb3BzdGF0ZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEluIGxleHN1cC5jLiAgKi8KLWV4dGVybiBpbnQgbGV4X2lucHV0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxleF91bnB1dCBQQVJBTVMgKChpbnQpKTsKLSNpZm5kZWYgeXl3cmFwCi1leHRlcm4gaW50IHl5d3JhcCBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLWV4dGVybiB2b2lkIHBhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGRsZXgubCBiL2xkL2xkbGV4LmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZWY4MGYuLjAwMDAwMDAKLS0tIGEvbGQvbGRsZXgubAorKysgL2Rldi9udWxsCkBAIC0xLDY2MiArMCwwIEBACi0lewotCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVRoaXMgd2FzIHdyaXR0ZW4gYnkgc3RldmUgY2hhbWJlcmxhaW4KLSAgICAgICAgICAgICAgICAgICAgc2FjQGN5Z251cy5jb20KLSovCi0KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaWZkZWYgTVBXCi0vKiBQcmV2ZW50IGVudW0gcmVkZWZpbml0aW9uIHByb2JsZW1zLiAqLwotI2RlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotI2VuZGlmIC8qIE1QVyAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0KLS8qIFRoZSB0eXBlIG9mIHRvcC1sZXZlbCBwYXJzZXIgaW5wdXQuCi0gICB5eWxleCBhbmQgeXlwYXJzZSAoaW5kaXJlY3RseSkgYm90aCBjaGVjayB0aGlzLiAgKi8KLWlucHV0X3R5cGUgcGFyc2VyX2lucHV0OwotCi0vKiBMaW5lIG51bWJlciBpbiB0aGUgY3VycmVudCBpbnB1dCBmaWxlLgotICAgKEZJWE1FIEFjdHVhbGx5LCBpdCBkb2Vzbid0IGFwcGVhciB0byBnZXQgcmVzZXQgZm9yIGVhY2ggZmlsZT8pICAqLwotdW5zaWduZWQgaW50IGxpbmVubyA9IDE7Ci0KLS8qIFRoZSBzdHJpbmcgd2UgYXJlIGN1cnJlbnRseSBsZXhpbmcsIG9yIE5VTEwgaWYgd2UgYXJlIHJlYWRpbmcgYQotICAgZmlsZS4gICovCi1jb25zdCBjaGFyICpsZXhfc3RyaW5nID0gTlVMTDsKLQotLyogU3VwcG9ydCBmb3IgZmxleCByZWFkaW5nIGZyb20gbW9yZSB0aGFuIG9uZSBpbnB1dCBmaWxlIChzdHJlYW0pLgotICAgYGluY2x1ZGVfc3RhY2snIGlzIGZsZXgncyBpbnB1dCBzdGF0ZSBmb3IgZWFjaCBvcGVuIGZpbGU7Ci0gICBgZmlsZV9uYW1lX3N0YWNrJyBpcyB0aGUgZmlsZSBuYW1lcy4gIGBsaW5lbm9fc3RhY2snIGlzIHRoZSBjdXJyZW50Ci0gICBsaW5lIG51bWJlcnMuCi0KLSAgIElmIGBpbmNsdWRlX3N0YWNrX3B0cicgaXMgMCwgd2UgaGF2ZW4ndCBzdGFydGVkIHJlYWRpbmcgYW55dGhpbmcgeWV0LgotICAgT3RoZXJ3aXNlLCBzdGFjayBlbGVtZW50cyAwIHRocm91Z2ggYGluY2x1ZGVfc3RhY2tfcHRyIC0gMScgYXJlIHZhbGlkLiAgKi8KLQotI3VuZGVmIFlZX0lOUFVUCi0jZGVmaW5lIFlZX0lOUFVUKGJ1ZixyZXN1bHQsbWF4X3NpemUpIHl5X2lucHV0KGJ1ZiwgJnJlc3VsdCwgbWF4X3NpemUpCi0KLSNkZWZpbmUgTUFYX0lOQ0xVREVfREVQVEggMTAKLXN0YXRpYyBZWV9CVUZGRVJfU1RBVEUgaW5jbHVkZV9zdGFja1tNQVhfSU5DTFVERV9ERVBUSF07Ci1zdGF0aWMgY29uc3QgY2hhciAqZmlsZV9uYW1lX3N0YWNrW01BWF9JTkNMVURFX0RFUFRIXTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbGluZW5vX3N0YWNrW01BWF9JTkNMVURFX0RFUFRIXTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaW5jbHVkZV9zdGFja19wdHIgPSAwOwotc3RhdGljIGludCB2ZXJzX25vZGVfbmVzdGluZyA9IDA7Ci0KLXN0YXRpYyBZWV9CVUZGRVJfU1RBVEUgeXlfY3JlYXRlX3N0cmluZ19idWZmZXIgUEFSQU1TICgoY29uc3QgY2hhciAqc3RyaW5nLAotCQkJCQkJCXNpemVfdCBzaXplKSk7Ci1zdGF0aWMgdm9pZCB5eV9pbnB1dCBQQVJBTVMgKChjaGFyICosIGludCAqcmVzdWx0LCBpbnQgbWF4X3NpemUpKTsKLQotc3RhdGljIHZvaWQgY29tbWVudCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBsZXhfd2Fybl9pbnZhbGlkIFBBUkFNUyAoKGNoYXIgKndoZXJlLCBjaGFyICp3aGF0KSk7Ci0KLS8qIFNUQVRFUyAKLQlFWFBSRVNTSU9OCWRlZmluaXRlbHkgaW4gYW4gZXhwcmVzc2lvbgotCVNDUklQVAkJZGVmaW5pdGVseSBpbiBhIHNjcmlwdAotCUJPVEgJCWVpdGhlciBFWFBSRVNTSU9OIG9yIFNDUklQVAotCURFRlNZTUVYUAlpbiBhbiBhcmd1bWVudCB0byAtZGVmc3ltCi0gICAgICAgIE1SSSAgICAgICAgICAgICBpbiBhbiBNUkkgc2NyaXB0Ci0JVkVSU19TVEFSVAlzdGFydGluZyBhIFN1biBzdHlsZSBtYXBmaWxlCi0JVkVSU19TQ1JJUFQJYSBTdW4gc3R5bGUgbWFwZmlsZQotCVZFUlNfTk9ERQlhIG5vZGUgd2l0aGluIGEgU3VuIHN0eWxlIG1hcGZpbGUKLSovCi0jZGVmaW5lIFJUT0tFTih4KSAgeyAgeXlsdmFsLnRva2VuID0geDsgcmV0dXJuIHg7IH0KLQotLyogU29tZSB2ZXJzaW9ucyBvZiBmbGV4IHdhbnQgdGhpcy4gICovCi0jaWZuZGVmIHl5d3JhcAotaW50IHl5d3JhcCAoKSB7IHJldHVybiAxOyB9Ci0jZW5kaWYKLSV9Ci0KLSVhIDQwMDAKLSVvIDUwMDAKLQotQ01ERklMRU5BTUVDSEFSICAgW19hLXpBLVowLTlcL1wuXFxfXCtcJFw6XFtcXVxcXCxcPVwmXCFcPFw+XC1cfl0KLUNNREZJTEVOQU1FQ0hBUjEgIFtfYS16QS1aMC05XC9cLlxcX1wrXCRcOlxbXF1cXFwsXD1cJlwhXDxcPlx+XQotRklMRU5BTUVDSEFSMQlbX2EtekEtWlwvXC5cXFwkXF9cfl0KLVNZTUJPTENIQVJOICAgICBbX2EtekEtWlwvXC5cXFwkXF9cfjAtOV0KLUZJTEVOQU1FQ0hBUglbX2EtekEtWjAtOVwvXC5cLVxfXCtcPVwkXDpcW1xdXFxcLFx+XQotV0lMRENIQVIJW19hLXpBLVowLTlcL1wuXC1cX1wrXD1cJFw6XFtcXVxcXCxcflw/XCpdCi1XSElURQkJWyBcdFxuXHJdKyAKLQotTk9DRklMRU5BTUVDSEFSCVtfYS16QS1aMC05XC9cLlwtXF9cK1wkXDpcW1xdXFxcfl0KLQotVl9UQUcgWy4kX2EtekEtWl1bLl9hLXpBLVowLTldKgotVl9JREVOVElGSUVSIFsqPy4kX2EtekEtWl1bKj8uJF9hLXpBLVowLTldKgotCi0lcyBTQ1JJUFQKLSVzIEVYUFJFU1NJT04KLSVzIEJPVEgKLSVzIERFRlNZTUVYUAotJXMgTVJJCi0lcyBWRVJTX1NUQVJUCi0lcyBWRVJTX1NDUklQVAotJXMgVkVSU19OT0RFCi0lJQotCi0gIGlmIChwYXJzZXJfaW5wdXQgIT0gaW5wdXRfc2VsZWN0ZWQpCi0gICAgewotICAgICAgLyogVGhlIGZpcnN0IHRva2VuIG9mIHRoZSBpbnB1dCBkZXRlcm1pbmVzIHRoZSBpbml0aWFsIHBhcnNlciBzdGF0ZS4gICovCi0gICAgICBpbnB1dF90eXBlIHQgPSBwYXJzZXJfaW5wdXQ7Ci0gICAgICBwYXJzZXJfaW5wdXQgPSBpbnB1dF9zZWxlY3RlZDsKLSAgICAgIHN3aXRjaCAodCkKLQl7Ci0JY2FzZSBpbnB1dF9zY3JpcHQ6IHJldHVybiBJTlBVVF9TQ1JJUFQ7IGJyZWFrOwotCWNhc2UgaW5wdXRfbXJpX3NjcmlwdDogcmV0dXJuIElOUFVUX01SSV9TQ1JJUFQ7IGJyZWFrOwotCWNhc2UgaW5wdXRfdmVyc2lvbl9zY3JpcHQ6IHJldHVybiBJTlBVVF9WRVJTSU9OX1NDUklQVDsgYnJlYWs7Ci0JY2FzZSBpbnB1dF9kZWZzeW06IHJldHVybiBJTlBVVF9ERUZTWU07IGJyZWFrOwotCWRlZmF1bHQ6IGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OPiIvKiIJeyBjb21tZW50KCk7IH0KLQotCi08REVGU1lNRVhQPiItIiAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKCctJyk7fQotPERFRlNZTUVYUD4iKyIgICAgICAgICAgICAgICAgICB7IFJUT0tFTignKycpO30KLTxERUZTWU1FWFA+e0ZJTEVOQU1FQ0hBUjF9e1NZTUJPTENIQVJOfSogICB7IHl5bHZhbC5uYW1lID0gYnV5c3RyaW5nKHl5dGV4dCk7IHJldHVybiBOQU1FOyB9Ci08REVGU1lNRVhQPiI9IiAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKCc9Jyk7IH0KLQotPE1SSSxFWFBSRVNTSU9OPiIkIihbMC05QS1GYS1mXSkrIHsKLSAgCQkJCXl5bHZhbC5pbnRlZ2VyID0gYmZkX3NjYW5fdm1hICh5eXRleHQrMSwgMCwxNik7Ci0JCQkJcmV0dXJuIElOVDsKLQkJCX0KLQotPE1SSSxFWFBSRVNTSU9OPihbMC05QS1GYS1mXSkrKEh8aHxYfHh8QnxifE98b3xEfGQpIHsKLQkJCQkgICBpbnQgaWJhc2UgOwotCQkJCSAgIHN3aXRjaCAoeXl0ZXh0W3l5bGVuZy0xXSkgewotCQkJCSAgICBjYXNlICdYJzogCi0JCQkJICAgIGNhc2UgJ3gnOgotCQkJCSAgICBjYXNlICdIJzoKLQkJCQkgICAgY2FzZSAnaCc6Ci0JCQkJICAgICBpYmFzZSA9IDE2OwotCQkJCSAgICAgYnJlYWs7Ci0JCQkJICAgIGNhc2UgJ08nOgotCQkJCSAgICBjYXNlICdvJzoKLQkJCQkgICAgIGliYXNlID0gODsKLQkJCQkgICAgIGJyZWFrOwotCQkJCSAgICBjYXNlICdCJzoKLQkJCQkgICAgY2FzZSAnYic6Ci0JCQkJICAgICBpYmFzZSA9IDI7Ci0JCQkJICAgICBicmVhazsKLQkJCQkgICAgZGVmYXVsdDoKLQkJCQkgICAgIGliYXNlID0gMTA7Ci0JCQkJICAgfQotCQkJCSAgIHl5bHZhbC5pbnRlZ2VyID0gYmZkX3NjYW5fdm1hICh5eXRleHQsIDAsCi0JCQkJCQkJCSAgaWJhc2UpOwotCQkJCSAgIHJldHVybiBJTlQ7Ci0JCQkJIH0KLTxTQ1JJUFQsREVGU1lNRVhQLE1SSSxCT1RILEVYUFJFU1NJT04+KCgoIiQifCIweCIpKFswLTlBLUZhLWZdKSspfCgoWzAtOV0pKykpKE18S3xtfGspPyB7Ci0JCQkJICBjaGFyICpzID0geXl0ZXh0OwotCi0JCQkJICBpZiAoKnMgPT0gJyQnKQotCQkJCSAgICArK3M7Ci0JCQkJICB5eWx2YWwuaW50ZWdlciA9IGJmZF9zY2FuX3ZtYSAocywgMCwgMCk7Ci0JCQkJICBpZiAoeXl0ZXh0W3l5bGVuZy0xXSA9PSAnTScKLQkJCQkgICAgICB8fCB5eXRleHRbeXlsZW5nLTFdID09ICdtJykKLQkJCQkgICAgeXlsdmFsLmludGVnZXIgKj0gMTAyNCAqIDEwMjQ7Ci0JCQkJICBpZiAoeXl0ZXh0W3l5bGVuZy0xXSA9PSAnSycgCi0JCQkJICAgICAgfHwgeXl0ZXh0W3l5bGVuZy0xXT09J2snKQotCQkJCSAgICB5eWx2YWwuaW50ZWdlciAqPSAxMDI0OwotCQkJCSAgcmV0dXJuIElOVDsKLQkJCQl9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Il0iCQl7IFJUT0tFTignXScpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iWyIJCXsgUlRPS0VOKCdbJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI8PD0iCXsgUlRPS0VOKExTSElGVEVRKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ij4+PSIJeyBSVE9LRU4oUlNISUZURVEpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4ifHwiCXsgUlRPS0VOKE9ST1IpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPT0iCXsgUlRPS0VOKEVRKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IiE9Igl7IFJUT0tFTihORSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI+PSIJeyBSVE9LRU4oR0UpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPD0iCXsgUlRPS0VOKExFKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ijw8Igl7IFJUT0tFTihMU0hJRlQpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPj4iCXsgUlRPS0VOKFJTSElGVCk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIrPSIJeyBSVE9LRU4oUExVU0VRKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ii09Igl7IFJUT0tFTihNSU5VU0VRKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Iio9Igl7IFJUT0tFTihNVUxURVEpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iLz0iCXsgUlRPS0VOKERJVkVRKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IiY9Igl7IFJUT0tFTihBTkRFUSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiJ8PSIJeyBSVE9LRU4oT1JFUSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiImJiIJeyBSVE9LRU4oQU5EQU5EKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ij4iCQl7IFJUT0tFTignPicpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iLCIJCXsgUlRPS0VOKCcsJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiImIgkJeyBSVE9LRU4oJyYnKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+InwiCQl7IFJUT0tFTignfCcpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4ifiIJCXsgUlRPS0VOKCd+Jyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIhIgkJeyBSVE9LRU4oJyEnKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ij8iCQl7IFJUT0tFTignPycpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iKiIJCXsgUlRPS0VOKCcqJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIrIgkJeyBSVE9LRU4oJysnKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ii0iCQl7IFJUT0tFTignLScpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iLyIJCXsgUlRPS0VOKCcvJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIlIgkJeyBSVE9LRU4oJyUnKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IjwiCQl7IFJUT0tFTignPCcpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPSIgICAgICAgICAgeyBSVE9LRU4oJz0nKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+In0iCQkJeyBSVE9LRU4oJ30nKSA7IH0KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4ieyIJCQl7IFJUT0tFTigneycpOyB9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IikiCQkJeyBSVE9LRU4oJyknKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IigiCQkJeyBSVE9LRU4oJygnKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IjoiCQl7IFJUT0tFTignOicpOyB9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IjsiCQl7IFJUT0tFTignOycpO30KLTxCT1RILFNDUklQVD4iTUVNT1JZIgkJeyBSVE9LRU4oTUVNT1JZKTt9Ci08Qk9USCxTQ1JJUFQ+Ik9SSUdJTiIJCXsgUlRPS0VOKE9SSUdJTik7fQotPEJPVEgsU0NSSVBUPiJWRVJTSU9OIgkJeyBSVE9LRU4oVkVSU0lPTkspO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJCTE9DSyIJCXsgUlRPS0VOKEJMT0NLKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iQklORCIJCXsgUlRPS0VOKEJJTkQpO30KLTxCT1RILFNDUklQVD4iTEVOR1RIIgkJeyBSVE9LRU4oTEVOR1RIKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iQUxJR04iCQkJeyBSVE9LRU4oQUxJR05fSyk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkFERFIiCQkJeyBSVE9LRU4oQUREUik7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkxPQURBRERSIgkJeyBSVE9LRU4oTE9BREFERFIpO30KLTxFWFBSRVNTSU9OLEJPVEg+Ik1BWCIJCQl7IFJUT0tFTihNQVhfSyk7IH0KLTxFWFBSRVNTSU9OLEJPVEg+Ik1JTiIJCQl7IFJUT0tFTihNSU5fSyk7IH0KLTxFWFBSRVNTSU9OLEJPVEg+IkFTU0VSVCIJCXsgUlRPS0VOKEFTU0VSVF9LKTsgfQotPEJPVEgsU0NSSVBUPiJFTlRSWSIJCQl7IFJUT0tFTihFTlRSWSk7fQotPEJPVEgsU0NSSVBULE1SST4iRVhURVJOIgkJeyBSVE9LRU4oRVhURVJOKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iTkVYVCIJCQl7IFJUT0tFTihORVhUKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4ic2l6ZW9mX2hlYWRlcnMiCXsgUlRPS0VOKFNJWkVPRl9IRUFERVJTKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iU0laRU9GX0hFQURFUlMiCXsgUlRPS0VOKFNJWkVPRl9IRUFERVJTKTt9Ci08Qk9USCxTQ1JJUFQ+Ik1BUCIJCQl7IFJUT0tFTihNQVApO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJTSVpFT0YiCQl7IFJUT0tFTihTSVpFT0YpO30KLTxCT1RILFNDUklQVD4iVEFSR0VUIgkJeyBSVE9LRU4oVEFSR0VUX0spO30KLTxCT1RILFNDUklQVD4iU0VBUkNIX0RJUiIJCXsgUlRPS0VOKFNFQVJDSF9ESVIpO30KLTxCT1RILFNDUklQVD4iT1VUUFVUIgkJeyBSVE9LRU4oT1VUUFVUKTt9Ci08Qk9USCxTQ1JJUFQ+IklOUFVUIgkJCXsgUlRPS0VOKElOUFVUKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iR1JPVVAiCQl7IFJUT0tFTihHUk9VUCk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkRFRklORUQiCQl7IFJUT0tFTihERUZJTkVEKTt9Ci08Qk9USCxTQ1JJUFQ+IkNSRUFURV9PQkpFQ1RfU1lNQk9MUyIJeyBSVE9LRU4oQ1JFQVRFX09CSkVDVF9TWU1CT0xTKTt9Ci08Qk9USCxTQ1JJUFQ+IkNPTlNUUlVDVE9SUyIJCXsgUlRPS0VOKCBDT05TVFJVQ1RPUlMpO30KLTxCT1RILFNDUklQVD4iRk9SQ0VfQ09NTU9OX0FMTE9DQVRJT04iIHsgUlRPS0VOKEZPUkNFX0NPTU1PTl9BTExPQ0FUSU9OKTt9Ci08Qk9USCxTQ1JJUFQ+IlNFQ1RJT05TIgkJeyBSVE9LRU4oU0VDVElPTlMpO30KLTxCT1RILFNDUklQVD4iRklMTCIJCQl7IFJUT0tFTihGSUxMKTt9Ci08Qk9USCxTQ1JJUFQ+IlNUQVJUVVAiCQl7IFJUT0tFTihTVEFSVFVQKTt9Ci08Qk9USCxTQ1JJUFQ+Ik9VVFBVVF9GT1JNQVQiCQl7IFJUT0tFTihPVVRQVVRfRk9STUFUKTt9Ci08Qk9USCxTQ1JJUFQ+Ik9VVFBVVF9BUkNIIgkJeyBSVE9LRU4oIE9VVFBVVF9BUkNIKTt9Ci08Qk9USCxTQ1JJUFQ+IkhMTCIJCQl7IFJUT0tFTihITEwpO30KLTxCT1RILFNDUklQVD4iU1lTTElCIgkJeyBSVE9LRU4oU1lTTElCKTt9Ci08Qk9USCxTQ1JJUFQ+IkZMT0FUIgkJCXsgUlRPS0VOKEZMT0FUKTt9Ci08Qk9USCxTQ1JJUFQ+IlFVQUQiCQkJeyBSVE9LRU4oIFFVQUQpO30KLTxCT1RILFNDUklQVD4iU1FVQUQiCQkJeyBSVE9LRU4oIFNRVUFEKTt9Ci08Qk9USCxTQ1JJUFQ+IkxPTkciCQkJeyBSVE9LRU4oIExPTkcpO30KLTxCT1RILFNDUklQVD4iU0hPUlQiCQkJeyBSVE9LRU4oIFNIT1JUKTt9Ci08Qk9USCxTQ1JJUFQ+IkJZVEUiCQkJeyBSVE9LRU4oIEJZVEUpO30KLTxCT1RILFNDUklQVD4iTk9GTE9BVCIJCXsgUlRPS0VOKE5PRkxPQVQpO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJOT0NST1NTUkVGUyIJeyBSVE9LRU4oTk9DUk9TU1JFRlMpO30KLTxCT1RILFNDUklQVD4iT1ZFUkxBWSIJCQl7IFJUT0tFTihPVkVSTEFZKTsgfQotPEJPVEgsU0NSSVBUPiJTT1JUIgkJCXsgUlRPS0VOKFNPUlQpOyB9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iTk9MT0FEIgl7IFJUT0tFTihOT0xPQUQpO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJEU0VDVCIJCXsgUlRPS0VOKERTRUNUKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iQ09QWSIJCXsgUlRPS0VOKENPUFkpO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJJTkZPIgkJeyBSVE9LRU4oSU5GTyk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+Ik9WRVJMQVkiCXsgUlRPS0VOKE9WRVJMQVkpO30KLTxCT1RILFNDUklQVD4ibyIJCQl7IFJUT0tFTihPUklHSU4pO30KLTxCT1RILFNDUklQVD4ib3JnIgkJCXsgUlRPS0VOKE9SSUdJTik7fQotPEJPVEgsU0NSSVBUPiJsIgkJCXsgUlRPS0VOKCBMRU5HVEgpO30KLTxCT1RILFNDUklQVD4ibGVuIgkJCXsgUlRPS0VOKCBMRU5HVEgpO30KLTxCT1RILFNDUklQVD4iSU5DTFVERSIJCQl7IFJUT0tFTihJTkNMVURFKTt9Ci08Qk9USCxTQ1JJUFQ+IlBIRFJTIgkJCXsgUlRPS0VOIChQSERSUyk7IH0KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJBVCIJCQl7IFJUT0tFTihBVCk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IlBST1ZJREUiCQl7IFJUT0tFTihQUk9WSURFKTsgfQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IktFRVAiCQl7IFJUT0tFTihLRUVQKTsgfQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkVYQ0xVREVfRklMRSIgICAgICAgIHsgUlRPS0VOKEVYQ0xVREVfRklMRSk7IH0KLTxNUkk+IiMiLipcbj8JCQl7ICsrIGxpbmVubzsgfQotPE1SST4iXG4iCSAgICAgICAgICAgICAgICB7ICsrIGxpbmVubzsgIFJUT0tFTihORVdMSU5FKTsgfQotPE1SST4iKiIuKgkJCXsgLyogTXJpIGNvbW1lbnQgbGluZSAqLyB9Ci08TVJJPiI7Ii4qCQkJeyAvKiBNcmkgY29tbWVudCBsaW5lICovIH0KLTxNUkk+IkVORCIgICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oRU5EV09SRCk7IH0KLTxNUkk+IkFMSUdOTU9EIgkJeyBSVE9LRU4oQUxJR05NT0QpO30KLTxNUkk+IkFMSUdOIgkJeyBSVE9LRU4oQUxJR05fSyk7fQotPE1SST4iQ0hJUCIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihDSElQKTsgfQotPE1SST4iQkFTRSIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihCQVNFKTsgfQotPE1SST4iQUxJQVMiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQUxJQVMpOyB9Ci08TVJJPiJUUlVOQ0FURSIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihUUlVOQ0FURSk7IH0KLTxNUkk+IkxPQUQiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oTE9BRCk7IH0KLTxNUkk+IlBVQkxJQyIgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oUFVCTElDKTsgfQotPE1SST4iT1JERVIiICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihPUkRFUik7IH0KLTxNUkk+Ik5BTUUiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oTkFNRVdPUkQpOyB9Ci08TVJJPiJGT1JNQVQiICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEZPUk1BVCk7IH0KLTxNUkk+IkNBU0UiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQ0FTRSk7IH0KLTxNUkk+IlNUQVJUIiAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oU1RBUlQpOyB9Ci08TVJJPiJMSVNUIi4qICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKExJU1QpOyAvKiBMSVNUIGFuZCBpZ25vcmUgdG8gZW5kIG9mIGxpbmUgKi8gfQotPE1SST4iU0VDVCIJCQl7IFJUT0tFTihTRUNUKTsgfQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQsTVJJPiJBQlNPTFVURSIJCQl7IFJUT0tFTihBQlNPTFVURSk7IH0KLTxNUkk+ImVuZCIgICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oRU5EV09SRCk7IH0KLTxNUkk+ImFsaWdubW9kIgkJeyBSVE9LRU4oQUxJR05NT0QpO30KLTxNUkk+ImFsaWduIgkJeyBSVE9LRU4oQUxJR05fSyk7fQotPE1SST4iY2hpcCIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihDSElQKTsgfQotPE1SST4iYmFzZSIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihCQVNFKTsgfQotPE1SST4iYWxpYXMiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQUxJQVMpOyB9Ci08TVJJPiJ0cnVuY2F0ZSIgICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihUUlVOQ0FURSk7IH0KLTxNUkk+ImxvYWQiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oTE9BRCk7IH0KLTxNUkk+InB1YmxpYyIgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oUFVCTElDKTsgfQotPE1SST4ib3JkZXIiICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihPUkRFUik7IH0KLTxNUkk+Im5hbWUiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oTkFNRVdPUkQpOyB9Ci08TVJJPiJmb3JtYXQiICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEZPUk1BVCk7IH0KLTxNUkk+ImNhc2UiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQ0FTRSk7IH0KLTxNUkk+ImV4dGVybiIgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oRVhURVJOKTsgfQotPE1SST4ic3RhcnQiICAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihTVEFSVCk7IH0KLTxNUkk+Imxpc3QiLiogICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oTElTVCk7IC8qIExJU1QgYW5kIGlnbm9yZSB0byBlbmQgb2YgbGluZSAqLyB9Ci08TVJJPiJzZWN0IgkJCXsgUlRPS0VOKFNFQ1QpOyB9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVCxNUkk+ImFic29sdXRlIgkJCXsgUlRPS0VOKEFCU09MVVRFKTsgfQotCi08TVJJPntGSUxFTkFNRUNIQVIxfXtOT0NGSUxFTkFNRUNIQVJ9Kgl7Ci0vKiBGaWxlbmFtZSB3aXRob3V0IGNvbW1hcywgbmVlZGVkIHRvIHBhcnNlIG1yaSBzdHVmZiAqLwotCQkJCSB5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyh5eXRleHQpOyAKLQkJCQkgIHJldHVybiBOQU1FOwotCQkJCX0KLQotCi08Qk9USCxFWFBSRVNTSU9OPntGSUxFTkFNRUNIQVIxfXtGSUxFTkFNRUNIQVJ9Kgl7Ci0JCQkJIHl5bHZhbC5uYW1lID0gYnV5c3RyaW5nKHl5dGV4dCk7IAotCQkJCSAgcmV0dXJuIE5BTUU7Ci0JCQkJfQotPEJPVEgsRVhQUkVTU0lPTj4iLWwie0ZJTEVOQU1FQ0hBUn0rIHsKLQkJCQkgIHl5bHZhbC5uYW1lID0gYnV5c3RyaW5nICh5eXRleHQgKyAyKTsKLQkJCQkgIHJldHVybiBMTkFNRTsKLQkJCQl9Ci08U0NSSVBUPntXSUxEQ0hBUn0qIHsKLQkJLyogQW5ub3lpbmdseSwgdGhpcyBwYXR0ZXJuIGNhbiBtYXRjaCBjb21tZW50cywgYW5kIHdlIGhhdmUKLQkJICAgbG9uZ2VzdCBtYXRjaCBpc3N1ZXMgdG8gY29uc2lkZXIuICBTbyBpZiB0aGUgZmlyc3QgdHdvCi0JCSAgIGNoYXJhY3RlcnMgYXJlIGEgY29tbWVudCBvcGVuaW5nLCBwdXQgdGhlIGlucHV0IGJhY2sgYW5kCi0JCSAgIHRyeSBhZ2Fpbi4gICovCi0JCWlmICh5eXRleHRbMF0gPT0gJy8nICYmIHl5dGV4dFsxXSA9PSAnKicpCi0JCSAgewotCQkgICAgeXlsZXNzKDIpOwotCQkgICAgY29tbWVudCAoKTsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICB5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyh5eXRleHQpOwotCQkgICAgcmV0dXJuIE5BTUU7Ci0JCSAgfQotCX0KLQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQsVkVSU19OT0RFPiJcIiJbXlwiXSoiXCIiIHsKLQkJCQkJLyogTm8gbWF0dGVyIHRoZSBzdGF0ZSwgcXVvdGVzCi0JCQkJCSAgIGdpdmUgd2hhdCdzIGluc2lkZSAqLwotCQkJCQl5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyh5eXRleHQrMSk7Ci0JCQkJCXl5bHZhbC5uYW1lW3l5bGVuZy0yXSA9IDA7Ci0JCQkJCXJldHVybiBOQU1FOwotCQkJCX0KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OPiJcbiIJCXsgbGluZW5vKys7fQotPE1SSSxCT1RILFNDUklQVCxFWFBSRVNTSU9OPlsgXHRccl0rCXsgfQotCi08VkVSU19OT0RFLFZFUlNfU0NSSVBUPls6LDtdCXsgcmV0dXJuICp5eXRleHQ7IH0KLQotPFZFUlNfTk9ERT5nbG9iYWwJCXsgUlRPS0VOKEdMT0JBTCk7IH0KLQotPFZFUlNfTk9ERT5sb2NhbAkJeyBSVE9LRU4oTE9DQUwpOyB9Ci0KLTxWRVJTX05PREU+ZXh0ZXJuCQl7IFJUT0tFTihFWFRFUk4pOyB9Ci0KLTxWRVJTX05PREU+e1ZfSURFTlRJRklFUn0JeyB5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyAoeXl0ZXh0KTsKLQkJCQkgIHJldHVybiBWRVJTX0lERU5USUZJRVI7IH0KLQotPFZFUlNfU0NSSVBUPntWX1RBR30JCXsgeXlsdmFsLm5hbWUgPSBidXlzdHJpbmcgKHl5dGV4dCk7Ci0JCQkJICByZXR1cm4gVkVSU19UQUc7IH0KLQotPFZFUlNfU1RBUlQ+InsiCQkJeyBCRUdJTihWRVJTX1NDUklQVCk7IHJldHVybiAqeXl0ZXh0OyB9Ci0KLTxWRVJTX1NDUklQVD4ieyIJCXsgQkVHSU4oVkVSU19OT0RFKTsgCi0JCQkJICB2ZXJzX25vZGVfbmVzdGluZyA9IDA7Ci0JCQkJICByZXR1cm4gKnl5dGV4dDsKLQkJCQl9Ci08VkVSU19TQ1JJUFQ+In0iCQl7IHJldHVybiAqeXl0ZXh0OyB9Ci08VkVSU19OT0RFPiJ7IgkJCXsgdmVyc19ub2RlX25lc3RpbmcrKzsgcmV0dXJuICp5eXRleHQ7IH0KLTxWRVJTX05PREU+In0iCQkJeyBpZiAoLS12ZXJzX25vZGVfbmVzdGluZyA8IDApCi0JCQkJICAgIEJFR0lOKFZFUlNfU0NSSVBUKTsKLQkJCQkgIHJldHVybiAqeXl0ZXh0OwotCQkJCX0KLQotPFZFUlNfU1RBUlQsVkVSU19OT0RFLFZFUlNfU0NSSVBUPltcbl0JCXsgbGluZW5vKys7IH0KLQotPFZFUlNfU1RBUlQsVkVSU19OT0RFLFZFUlNfU0NSSVBUPiMuKgkJeyAvKiBFYXQgdXAgY29tbWVudHMgKi8gfQotCi08VkVSU19TVEFSVCxWRVJTX05PREUsVkVSU19TQ1JJUFQ+WyBcdFxyXSsgICAJeyAvKiBFYXQgdXAgd2hpdGVzcGFjZSAqLyB9Ci0KLTw8RU9GPj4gewotICBpbmNsdWRlX3N0YWNrX3B0ci0tOwotICAgIAotICBpZiAoaW5jbHVkZV9zdGFja19wdHIgPT0gMCkgCi0gIHsKLSAgICB5eXRlcm1pbmF0ZSgpOwotICB9Ci0gIGVsc2UgCi0gIHsKLSAgICB5eV9zd2l0Y2hfdG9fYnVmZmVyKGluY2x1ZGVfc3RhY2tbaW5jbHVkZV9zdGFja19wdHJdKTsKLQotICB9Ci0gIEJFR0lOKFNDUklQVCk7Ci0gIGxkZmlsZV9pbnB1dF9maWxlbmFtZSA9IGZpbGVfbmFtZV9zdGFja1tpbmNsdWRlX3N0YWNrX3B0ciAtIDFdOwotICBsaW5lbm8gPSBsaW5lbm9fc3RhY2tbaW5jbHVkZV9zdGFja19wdHIgLSAxXTsKLQotICByZXR1cm4gRU5EOwotfQotCi08U0NSSVBULE1SSSxWRVJTX1NUQVJULFZFUlNfU0NSSVBULFZFUlNfTk9ERT4uCWxleF93YXJuX2ludmFsaWQoIiBpbiBzY3JpcHQiLCB5eXRleHQpOwotPEVYUFJFU1NJT04sREVGU1lNRVhQLEJPVEg+LglsZXhfd2Fybl9pbnZhbGlkKCIgaW4gZXhwcmVzc2lvbiIsIHl5dGV4dCk7Ci0gICAgCi0lJQotDAotCi0vKiBTd2l0Y2ggZmxleCB0byByZWFkaW5nIHNjcmlwdCBmaWxlIE5BTUUsIG9wZW4gb24gRklMRSwKLSAgIHNhdmluZyB0aGUgY3VycmVudCBpbnB1dCBpbmZvIG9uIHRoZSBpbmNsdWRlIHN0YWNrLiAgKi8KLQotdm9pZAotbGV4X3B1c2hfZmlsZSAoZmlsZSwgbmFtZSkKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKGluY2x1ZGVfc3RhY2tfcHRyID49IE1BWF9JTkNMVURFX0RFUFRIKSAKLSAgICB7Ci0gICAgICBlaW5mbygiJUY6aW5jbHVkZXMgbmVzdGVkIHRvbyBkZWVwbHlcbiIpOwotICAgIH0KLSAgZmlsZV9uYW1lX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyXSA9IG5hbWU7Ci0gIGxpbmVub19zdGFja1tpbmNsdWRlX3N0YWNrX3B0cl0gPSAxOwotICBpbmNsdWRlX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyXSA9IFlZX0NVUlJFTlRfQlVGRkVSOwotCi0gIGluY2x1ZGVfc3RhY2tfcHRyKys7Ci0gIHl5aW4gPSBmaWxlOwotICB5eV9zd2l0Y2hfdG9fYnVmZmVyKHl5X2NyZWF0ZV9idWZmZXIoeXlpbiwgWVlfQlVGX1NJWkUpKTsKLSAgQkVHSU4gKFNDUklQVCk7Ci19Ci0KLS8qIFJldHVybiBhIG5ld2x5IGNyZWF0ZWQgZmxleCBpbnB1dCBidWZmZXIgY29udGFpbmluZyBTVFJJTkcsCi0gICB3aGljaCBpcyBTSVpFIGJ5dGVzIGxvbmcuICAqLwotCi1zdGF0aWMgWVlfQlVGRkVSX1NUQVRFIAoteXlfY3JlYXRlX3N0cmluZ19idWZmZXIgKHN0cmluZywgc2l6ZSkKLSAgICAgQ09OU1QgY2hhciAqc3RyaW5nOwotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgWVlfQlVGRkVSX1NUQVRFIGI7Ci0KLSAgLyogQ2FsbHMgdG8gbS1hbGxvYyBnZXQgdHVybmVkIGJ5IHNlZCBpbnRvIHhtLWFsbG9jLiAgKi8KLSAgYiA9IChZWV9CVUZGRVJfU1RBVEUpIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKSk7Ci0gIGItPnl5X2lucHV0X2ZpbGUgPSAwOwotICBiLT55eV9idWZfc2l6ZSA9IHNpemU7Ci0KLSAgLyogeXlfY2hfYnVmIGhhcyB0byBiZSAyIGNoYXJhY3RlcnMgbG9uZ2VyIHRoYW4gdGhlIHNpemUgZ2l2ZW4gYmVjYXVzZQotICAgICB3ZSBuZWVkIHRvIHB1dCBpbiAyIGVuZC1vZi1idWZmZXIgY2hhcmFjdGVycy4gICovCi0gIGItPnl5X2NoX2J1ZiA9IChjaGFyICopIG1hbGxvYyAoKHVuc2lnbmVkKSAoYi0+eXlfYnVmX3NpemUgKyAzKSk7Ci0KLSAgYi0+eXlfY2hfYnVmWzBdID0gJ1xuJzsKLSAgc3RyY3B5IChiLT55eV9jaF9idWYrMSwgc3RyaW5nKTsKLSAgYi0+eXlfY2hfYnVmW3NpemUrMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7Ci0gIGItPnl5X2NoX2J1ZltzaXplKzJdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOwotICBiLT55eV9uX2NoYXJzID0gc2l6ZSsxOwotICBiLT55eV9idWZfcG9zID0gJmItPnl5X2NoX2J1ZlsxXTsKLQotICAvKiBmbGV4IDIuNC43IGNoYW5nZWQgdGhlIGludGVyZmFjZS4gIEZJWE1FOiBXZSBzaG91bGQgbm90IGJlIHVzaW5nCi0gICAgIGEgZmxleCBpbnRlcm5hbCBpbnRlcmZhY2UgaW4gdGhlIGZpcnN0IHBsYWNlISAgKi8KLSNpZmRlZiBZWV9CVUZGRVJfTkVXCi0gIGItPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTkVXOwotI2Vsc2UKLSAgYi0+eXlfZW9mX3N0YXR1cyA9IEVPRl9OT1RfU0VFTjsKLSNlbmRpZgotCi0gIHJldHVybiBiOwotfQotCi0vKiBTd2l0Y2ggZmxleCB0byByZWFkaW5nIGZyb20gU1RSSU5HLCBzYXZpbmcgdGhlIGN1cnJlbnQgaW5wdXQgaW5mbwotICAgb24gdGhlIGluY2x1ZGUgc3RhY2suICAqLwotCi12b2lkCi1sZXhfcmVkaXJlY3QgKHN0cmluZykKLSAgICAgQ09OU1QgY2hhciAqc3RyaW5nOwotewotICBZWV9CVUZGRVJfU1RBVEUgdG1wOwotCi0gIHl5X2luaXQgPSAwOwotICBpZiAoaW5jbHVkZV9zdGFja19wdHIgPj0gTUFYX0lOQ0xVREVfREVQVEgpIAotICAgIHsKLSAgICAgIGVpbmZvKCIlRjogbWFjcm9zIG5lc3RlZCB0b28gZGVlcGx5XG4iKTsKLSAgICB9Ci0gIGZpbGVfbmFtZV9zdGFja1tpbmNsdWRlX3N0YWNrX3B0cl0gPSAicmVkaXJlY3QiOwotICBsaW5lbm9fc3RhY2tbaW5jbHVkZV9zdGFja19wdHJdID0gMDsKLSAgaW5jbHVkZV9zdGFja1tpbmNsdWRlX3N0YWNrX3B0cl0gPSBZWV9DVVJSRU5UX0JVRkZFUjsKLSAgaW5jbHVkZV9zdGFja19wdHIrKzsKLSAgdG1wID0geXlfY3JlYXRlX3N0cmluZ19idWZmZXIgKHN0cmluZywgc3RybGVuIChzdHJpbmcpKTsKLSAgeXlfc3dpdGNoX3RvX2J1ZmZlciAodG1wKTsKLSAgQkVHSU4gKFNDUklQVCk7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgdG8gc3dpdGNoIHRvIGEgZGlmZmVyZW50IGZsZXggc3RhcnQgY29uZGl0aW9uLAotICAgc2F2aW5nIHRoZSBjdXJyZW50IHN0YXJ0IGNvbmRpdGlvbiBvbiBgc3RhdGVfc3RhY2snLiAgKi8KLQotc3RhdGljIGludCBzdGF0ZV9zdGFja1tNQVhfSU5DTFVERV9ERVBUSCAqIDJdOwotc3RhdGljIGludCAqc3RhdGVfc3RhY2tfcCA9IHN0YXRlX3N0YWNrOwotCi12b2lkCi1sZGxleF9zY3JpcHQgKCkKLXsKLSAgKihzdGF0ZV9zdGFja19wKSsrID0geXlfc3RhcnQ7Ci0gIEJFR0lOIChTQ1JJUFQpOwotfQotCi12b2lkCi1sZGxleF9tcmlfc2NyaXB0ICgpCi17Ci0gICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OwotICBCRUdJTiAoTVJJKTsKLX0KLQotdm9pZAotbGRsZXhfdmVyc2lvbl9zY3JpcHQgKCkKLXsKLSAgKihzdGF0ZV9zdGFja19wKSsrID0geXlfc3RhcnQ7Ci0gIEJFR0lOIChWRVJTX1NUQVJUKTsKLX0KLQotdm9pZAotbGRsZXhfdmVyc2lvbl9maWxlICgpCi17Ci0gICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OwotICBCRUdJTiAoVkVSU19TQ1JJUFQpOwotfQotCi12b2lkCi1sZGxleF9kZWZzeW0gKCkKLXsKLSAgKihzdGF0ZV9zdGFja19wKSsrID0geXlfc3RhcnQ7Ci0gIEJFR0lOIChERUZTWU1FWFApOwotfQotCSAgIAotdm9pZAotbGRsZXhfZXhwcmVzc2lvbiAoKQotewotICAqKHN0YXRlX3N0YWNrX3ApKysgPSB5eV9zdGFydDsKLSAgQkVHSU4gKEVYUFJFU1NJT04pOwotfQotCi12b2lkCi1sZGxleF9ib3RoICgpCi17Ci0gICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OwotICBCRUdJTiAoQk9USCk7Ci19Ci0KLXZvaWQKLWxkbGV4X3BvcHN0YXRlICgpCi17Ci0gIHl5X3N0YXJ0ID0gKigtLXN0YXRlX3N0YWNrX3ApOwotfQotDAotCi0vKiBQbGFjZSB1cCB0byBNQVhfU0laRSBjaGFyYWN0ZXJzIGluIEJVRiBhbmQgcmV0dXJuIGluICpSRVNVTFQKLSAgIGVpdGhlciB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCwgb3IgMCB0byBpbmRpY2F0ZSBFT0YuICAqLwotCi1zdGF0aWMgdm9pZAoteXlfaW5wdXQgKGJ1ZiwgcmVzdWx0LCBtYXhfc2l6ZSkKLSAgICAgY2hhciAqYnVmOwotICAgICBpbnQgKnJlc3VsdDsKLSAgICAgaW50IG1heF9zaXplOwotewotICAqcmVzdWx0ID0gMDsgCi0gIGlmICh5eV9jdXJyZW50X2J1ZmZlci0+eXlfaW5wdXRfZmlsZSkKLSAgICB7Ci0gICAgICBpZiAoeXlpbikKLQl7Ci0JICAqcmVzdWx0ID0gcmVhZCAoZmlsZW5vICh5eWluKSwgKGNoYXIgKikgYnVmLCBtYXhfc2l6ZSk7Ci0JICBpZiAoKnJlc3VsdCA8IDApIAotCSAgICBlaW5mbyAoIiVGJVA6IHJlYWQgaW4gZmxleCBzY2FubmVyIGZhaWxlZFxuIik7Ci0JfQotICAgIH0KLX0KLQotLyogRWF0IHRoZSByZXN0IG9mIGEgQy1zdHlsZSBjb21tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLWNvbW1lbnQgKCkKLXsKLSAgaW50IGM7Ci0KLSAgd2hpbGUgKDEpCi0gIHsKLSAgICBjID0gaW5wdXQoKTsKLSAgICB3aGlsZSAoYyAhPSAnKicgJiYgYyAhPSBFT0YpIAotICAgIHsKLSAgICAgIGlmIChjID09ICdcbicpCi0JbGluZW5vKys7Ci0gICAgICBjID0gaW5wdXQoKTsKLSAgICB9Ci0KLSAgICBpZiAoYyA9PSAnKicpCi0gICAgewotICAgICAgYyA9IGlucHV0KCk7Ci0gICAgICB3aGlsZSAoYyA9PSAnKicpCi0gICAgICAgYyA9IGlucHV0KCk7Ci0gICAgICBpZiAoYyA9PSAnLycpCi0gICAgICAgYnJlYWs7CQkJLyogZm91bmQgdGhlIGVuZCAqLwotICAgIH0KLQotICAgIGlmIChjID09ICdcbicpCi0gICAgICBsaW5lbm8rKzsKLQotICAgIGlmIChjID09IEVPRikKLSAgICB7Ci0gICAgICBlaW5mbyggIiVGJVA6IEVPRiBpbiBjb21tZW50XG4iKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0vKiBXYXJuIHRoZSB1c2VyIGFib3V0IGEgZ2FyYmFnZSBjaGFyYWN0ZXIgV0hBVCBpbiB0aGUgaW5wdXQKLSAgIGluIGNvbnRleHQgV0hFUkUuICAqLwotCi1zdGF0aWMgdm9pZAotbGV4X3dhcm5faW52YWxpZCAod2hlcmUsIHdoYXQpCi0gICAgIGNoYXIgKndoZXJlLCAqd2hhdDsKLXsKLSAgY2hhciBidWZbNV07Ci0KLSAgLyogSWYgd2UgaGF2ZSBmb3VuZCBhbiBpbnB1dCBmaWxlIHdob3NlIGZvcm1hdCB3ZSBkbyBub3QgcmVjb2duaXplLAotICAgICBhbmQgd2UgYXJlIHRoZXJlZm9yZSB0cmVhdGluZyBpdCBhcyBhIGxpbmtlciBzY3JpcHQsIGFuZCB3ZSBmaW5kCi0gICAgIGFuIGludmFsaWQgY2hhcmFjdGVyLCB0aGVuIG1vc3QgbGlrZWx5IHRoaXMgaXMgYSByZWFsIG9iamVjdCBmaWxlCi0gICAgIG9mIHNvbWUgZGlmZmVyZW50IGZvcm1hdC4gIFRyZWF0IGl0IGFzIHN1Y2guICAqLwotICBpZiAobGRmaWxlX2Fzc3VtZWRfc2NyaXB0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX25vdF9yZWNvZ25pemVkKTsKLSAgICAgIGVpbmZvICgiJUYlczogZmlsZSBub3QgcmVjb2duaXplZDogJUVcbiIsIGxkZmlsZV9pbnB1dF9maWxlbmFtZSk7Ci0gICAgfQotCi0gIGlmICghIGlzcHJpbnQgKCh1bnNpZ25lZCBjaGFyKSAqd2hhdCkpCi0gICAgewotICAgICAgc3ByaW50ZiAoYnVmLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgKndoYXQpOwotICAgICAgd2hhdCA9IGJ1ZjsKLSAgICB9Ci0KLSAgZWluZm8gKCIlUDolUzogaWdub3JpbmcgaW52YWxpZCBjaGFyYWN0ZXIgYCVzJyVzXG4iLCB3aGF0LCB3aGVyZSk7Ci19CmRpZmYgLS1naXQgYS9sZC9sZG1haW4uYyBiL2xkL2xkbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTcxMGRiLi4wMDAwMDAwCi0tLSBhL2xkL2xkbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMwMCArMCwwIEBACi0vKiBNYWluIHByb2dyYW0gb2YgR05VIGxpbmtlci4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAicHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkd3JpdGUuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRjdG9yLmgiCi0KLS8qIFNvbWV3aGVyZSBhYm92ZSwgc3lzL3N0YXQuaCBnb3QgaW5jbHVkZWQgLiAuIC4gLiAqLwotI2lmICFkZWZpbmVkKFNfSVNESVIpICYmIGRlZmluZWQoU19JRkRJUikKLSNkZWZpbmUJU19JU0RJUihtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRkRJUikKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpZmRlZiBIQVZFX1NCUksKLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLWV4dGVybiBQVFIgc2JyayAoKTsKLSNlbmRpZgotI2VuZGlmCi0KLXN0YXRpYyBjaGFyICpnZXRfZW11bGF0aW9uIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgc2V0X3NjcmlwdHNfZGlyIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogRVhQT1JUUyAqLwotCi1jaGFyICpkZWZhdWx0X3RhcmdldDsKLWNvbnN0IGNoYXIgKm91dHB1dF9maWxlbmFtZSA9ICJhLm91dCI7Ci0KLS8qIE5hbWUgdGhpcyBwcm9ncmFtIHdhcyBpbnZva2VkIGJ5LiAgKi8KLWNoYXIgKnByb2dyYW1fbmFtZTsKLQotLyogVGhlIGZpbGUgdGhhdCB3ZSdyZSBjcmVhdGluZyAqLwotYmZkICpvdXRwdXRfYmZkID0gMDsKLQotLyogU2V0IGJ5IC1HIGFyZ3VtZW50LCBmb3IgTUlQUyBFQ09GRiB0YXJnZXQuICAqLwotaW50IGdfc3dpdGNoX3ZhbHVlID0gODsKLQotLyogTm9uemVybyBtZWFucyBwcmludCBuYW1lcyBvZiBpbnB1dCBmaWxlcyBhcyBwcm9jZXNzZWQuICAqLwotYm9vbGVhbiB0cmFjZV9maWxlczsKLQotLyogTm9uemVybyBtZWFucyBzYW1lLCBidXQgbm90ZSBvcGVuIGZhaWx1cmVzLCB0b28uICAqLwotYm9vbGVhbiB0cmFjZV9maWxlX3RyaWVzOwotCi0vKiBOb256ZXJvIG1lYW5zIHZlcnNpb24gbnVtYmVyIHdhcyBwcmludGVkLCBzbyBleGl0IHN1Y2Nlc3NmdWxseQotICAgaW5zdGVhZCBvZiBjb21wbGFpbmluZyBpZiBubyBpbnB1dCBmaWxlcyBhcmUgZ2l2ZW4uICAqLwotYm9vbGVhbiB2ZXJzaW9uX3ByaW50ZWQ7Ci0KLS8qIE5vbnplcm8gbWVhbnMgbGluayBpbiBldmVyeSBtZW1iZXIgb2YgYW4gYXJjaGl2ZS4gICovCi1ib29sZWFuIHdob2xlX2FyY2hpdmU7Ci0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIGRlbWFuZ2xlIHN5bWJvbCBuYW1lcy4gICovCi1ib29sZWFuIGRlbWFuZ2xpbmc7Ci0KLWFyZ3NfdHlwZSBjb21tYW5kX2xpbmU7Ci0KLWxkX2NvbmZpZ190eXBlIGNvbmZpZzsKLQotc3RhdGljIHZvaWQgcmVtb3ZlX291dHB1dCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBjaGVja19mb3Jfc2NyaXB0c19kaXIgUEFSQU1TICgoY2hhciAqZGlyKSk7Ci1zdGF0aWMgYm9vbGVhbiBhZGRfYXJjaGl2ZV9lbGVtZW50IFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLAotCQkJCQkgICAgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtdWx0aXBsZV9kZWZpbml0aW9uIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgICBjb25zdCBjaGFyICosCi0JCQkJCSAgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwKLQkJCQkJICAgIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBtdWx0aXBsZV9jb21tb24gUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJY29uc3QgY2hhciAqLCBiZmQgKiwKLQkJCQkJZW51bSBiZmRfbGlua19oYXNoX3R5cGUsIGJmZF92bWEsCi0JCQkJCWJmZCAqLCBlbnVtIGJmZF9saW5rX2hhc2hfdHlwZSwKLQkJCQkJYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gYWRkX3RvX3NldCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCi0JCQkJICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLAotCQkJCSAgIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb25zdHJ1Y3Rvcl9jYWxsYmFjayBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgIGJvb2xlYW4gY29uc3RydWN0b3IsCi0JCQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJICAgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gd2FybmluZ19jYWxsYmFjayBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJmZCAqLAotCQkJCQkgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIHZvaWQgd2FybmluZ19maW5kX3JlbG9jIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHVuZGVmaW5lZF9zeW1ib2wgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJIGNvbnN0IGNoYXIgKiwgYmZkICosCi0JCQkJCSBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiByZWxvY19vdmVyZmxvdyBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSwKLQkJCQkgICAgICAgYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHJlbG9jX2Rhbmdlcm91cyBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosCi0JCQkJCWJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiB1bmF0dGFjaGVkX3JlbG9jIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSBjb25zdCBjaGFyICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gbm90aWNlIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwKLQkJCSAgICAgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcyBsaW5rX2NhbGxiYWNrcyA9Ci17Ci0gIGFkZF9hcmNoaXZlX2VsZW1lbnQsCi0gIG11bHRpcGxlX2RlZmluaXRpb24sCi0gIG11bHRpcGxlX2NvbW1vbiwKLSAgYWRkX3RvX3NldCwKLSAgY29uc3RydWN0b3JfY2FsbGJhY2ssCi0gIHdhcm5pbmdfY2FsbGJhY2ssCi0gIHVuZGVmaW5lZF9zeW1ib2wsCi0gIHJlbG9jX292ZXJmbG93LAotICByZWxvY19kYW5nZXJvdXMsCi0gIHVuYXR0YWNoZWRfcmVsb2MsCi0gIG5vdGljZQotfTsKLQotc3RydWN0IGJmZF9saW5rX2luZm8gbGlua19pbmZvOwotDAotc3RhdGljIHZvaWQKLXJlbW92ZV9vdXRwdXQgKCkKLXsKLSAgaWYgKG91dHB1dF9maWxlbmFtZSkgCi0gICAgewotICAgICAgaWYgKG91dHB1dF9iZmQgJiYgb3V0cHV0X2JmZC0+aW9zdHJlYW0pCi0JZmNsb3NlKChGSUxFICopKG91dHB1dF9iZmQtPmlvc3RyZWFtKSk7Ci0gICAgICBpZiAoZGVsZXRlX291dHB1dF9maWxlX29uX2ZhaWx1cmUpCi0JdW5saW5rIChvdXRwdXRfZmlsZW5hbWUpOwotICAgIH0KLX0KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGNoYXIgKmVtdWxhdGlvbjsKLSAgbG9uZyBzdGFydF90aW1lID0gZ2V0X3J1bl90aW1lICgpOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIFNUQVJUX1BST0dSRVNTIChwcm9ncmFtX25hbWUsIDApOwotCi0gIGJmZF9pbml0ICgpOwotCi0gIGJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIHhhdGV4aXQgKHJlbW92ZV9vdXRwdXQpOwotCi0gIC8qIFNldCB0aGUgZGVmYXVsdCBCRkQgdGFyZ2V0IGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIHRhcmdldC4gIERvaW5nCi0gICAgIHRoaXMgcGVybWl0cyB0aGUgbGlua2VyIHRvIGJlIGNvbmZpZ3VyZWQgZm9yIGEgcGFydGljdWxhciB0YXJnZXQsCi0gICAgIGFuZCBsaW5rZWQgYWdhaW5zdCBhIHNoYXJlZCBCRkQgbGlicmFyeSB3aGljaCB3YXMgY29uZmlndXJlZCBmb3IKLSAgICAgYSBkaWZmZXJlbnQgdGFyZ2V0LiAgVGhlIG1hY3JvIFRBUkdFVCBpcyBkZWZpbmVkIGJ5IE1ha2VmaWxlLiAgKi8KLSAgaWYgKCEgYmZkX3NldF9kZWZhdWx0X3RhcmdldCAoVEFSR0VUKSkKLSAgICB7Ci0gICAgICBlaW5mbyAoXygiJVglUDogY2FuJ3Qgc2V0IEJGRCBkZWZhdWx0IHRhcmdldCB0byBgJXMnOiAlRVxuIiksIFRBUkdFVCk7Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8qIEluaXRpYWxpemUgdGhlIGRhdGEgYWJvdXQgb3B0aW9ucy4gICovCi0gIHRyYWNlX2ZpbGVzID0gdHJhY2VfZmlsZV90cmllcyA9IHZlcnNpb25fcHJpbnRlZCA9IGZhbHNlOwotICB3aG9sZV9hcmNoaXZlID0gZmFsc2U7Ci0gIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPSB0cnVlOwotICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7Ci0gIGNvbmZpZy5oYXNfc2hhcmVkID0gZmFsc2U7Ci0gIGNvbW1hbmRfbGluZS5mb3JjZV9jb21tb25fZGVmaW5pdGlvbiA9IGZhbHNlOwotICBjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgPSBOVUxMOwotICBjb21tYW5kX2xpbmUucnBhdGggPSBOVUxMOwotICBjb21tYW5kX2xpbmUud2Fybl9taXNtYXRjaCA9IHRydWU7Ci0gIGNvbW1hbmRfbGluZS5jaGVja19zZWN0aW9uX2FkZHJlc3NlcyA9IHRydWU7Ci0KLSAgLyogV2UgaW5pdGlhbGl6ZSBERU1BTkdMSU5HIGJhc2VkIG9uIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotICAgICBDT0xMRUNUX05PX0RFTUFOR0xFLiAgVGhlIGdjYyBjb2xsZWN0MiBwcm9ncmFtIHdpbGwgZGVtYW5nbGUgdGhlCi0gICAgIG91dHB1dCBvZiB0aGUgbGlua2VyLCB1bmxlc3MgQ09MTEVDVF9OT19ERU1BTkdMRSBpcyBzZXQgaW4gdGhlCi0gICAgIGVudmlyb25tZW50LiAgQWN0aW5nIHRoZSBzYW1lIHdheSBoZXJlIGxldHMgdXMgcHJvdmlkZSB0aGUgc2FtZQotICAgICBpbnRlcmZhY2UgYnkgZGVmYXVsdC4gICovCi0gIGRlbWFuZ2xpbmcgPSBnZXRlbnYgKCJDT0xMRUNUX05PX0RFTUFOR0xFIikgPT0gTlVMTDsKLQotICBsaW5rX2luZm8uY2FsbGJhY2tzID0gJmxpbmtfY2FsbGJhY2tzOwotICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gZmFsc2U7Ci0gIGxpbmtfaW5mby5zaGFyZWQgPSBmYWxzZTsKLSAgbGlua19pbmZvLnN5bWJvbGljID0gZmFsc2U7Ci0gIGxpbmtfaW5mby5zdGF0aWNfbGluayA9IGZhbHNlOwotICBsaW5rX2luZm8udHJhZGl0aW9uYWxfZm9ybWF0ID0gZmFsc2U7Ci0gIGxpbmtfaW5mby5vcHRpbWl6ZSA9IGZhbHNlOwotICBsaW5rX2luZm8ubm9fdW5kZWZpbmVkID0gZmFsc2U7Ci0gIGxpbmtfaW5mby5zdHJpcCA9IHN0cmlwX25vbmU7Ci0gIGxpbmtfaW5mby5kaXNjYXJkID0gZGlzY2FyZF9ub25lOwotICBsaW5rX2luZm8ua2VlcF9tZW1vcnkgPSB0cnVlOwotICBsaW5rX2luZm8uaW5wdXRfYmZkcyA9IE5VTEw7Ci0gIGxpbmtfaW5mby5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbiA9IE5VTEw7Ci0gIGxpbmtfaW5mby5oYXNoID0gTlVMTDsKLSAgbGlua19pbmZvLmtlZXBfaGFzaCA9IE5VTEw7Ci0gIGxpbmtfaW5mby5ub3RpY2VfYWxsID0gZmFsc2U7Ci0gIGxpbmtfaW5mby5ub3RpY2VfaGFzaCA9IE5VTEw7Ci0gIGxpbmtfaW5mby53cmFwX2hhc2ggPSBOVUxMOwotICBsaW5rX2luZm8ubXBjODYwYzAgPSAwOwotICAKLSAgbGRmaWxlX2FkZF9hcmNoICgiIik7Ci0KLSAgY29uZmlnLm1ha2VfZXhlY3V0YWJsZSA9IHRydWU7Ci0gIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9IGZhbHNlOwotICBjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkID0gdHJ1ZTsKLSAgY29uZmlnLnRleHRfcmVhZF9vbmx5ID0gdHJ1ZTsKLSAgY29uZmlnLm1ha2VfZXhlY3V0YWJsZSA9IHRydWU7Ci0KLSAgZW11bGF0aW9uID0gZ2V0X2VtdWxhdGlvbiAoYXJnYywgYXJndik7Ci0gIGxkZW11bF9jaG9vc2VfbW9kZSAoZW11bGF0aW9uKTsKLSAgZGVmYXVsdF90YXJnZXQgPSBsZGVtdWxfY2hvb3NlX3RhcmdldCAoKTsKLSAgbGFuZ19pbml0ICgpOwotICBsZGVtdWxfYmVmb3JlX3BhcnNlICgpOwotICBsYW5nX2hhc19pbnB1dF9maWxlID0gZmFsc2U7Ci0gIHBhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpOwotCi0gIGxkZW11bF9zZXRfc3ltYm9scyAoKTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBpZiAoY29tbWFuZF9saW5lLmdjX3NlY3Rpb25zKQotCWVpbmZvICgiJVAlRjogLS1nYy1zZWN0aW9ucyBhbmQgLXIgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iKTsKLSAgICAgIGlmIChsaW5rX2luZm8ubXBjODYwYzApCi0JZWluZm8gKF8oIiVQJUY6IC1yIGFuZCAtLW1wYzg2MGMwIG1heSBub3QgYmUgdXNlZCB0b2dldGhlclxuIikpOwotICAgICAgZWxzZSBpZiAoY29tbWFuZF9saW5lLnJlbGF4KQotCWVpbmZvIChfKCIlUCVGOiAtLXJlbGF4IGFuZCAtciBtYXkgbm90IGJlIHVzZWQgdG9nZXRoZXJcbiIpKTsKLSAgICAgIGlmIChsaW5rX2luZm8uc2hhcmVkKQotCWVpbmZvIChfKCIlUCVGOiAtciBhbmQgLXNoYXJlZCBtYXkgbm90IGJlIHVzZWQgdG9nZXRoZXJcbiIpKTsKLSAgICB9Ci0KLSAgLyogVHJlYXQgbGQgLXIgLXMgYXMgbGQgLXIgLVMgLXggKGkuZS4sIHN0cmlwIGFsbCBsb2NhbCBzeW1ib2xzKS4gIEkKLSAgICAgZG9uJ3Qgc2VlIGhvdyBlbHNlIHRoaXMgY2FuIGJlIGhhbmRsZWQsIHNpbmNlIGluIHRoaXMgY2FzZSB3ZQotICAgICBtdXN0IHByZXNlcnZlIGFsbCBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scy4gICovCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlICYmIGxpbmtfaW5mby5zdHJpcCA9PSBzdHJpcF9hbGwpCi0gICAgewotICAgICAgbGlua19pbmZvLnN0cmlwID0gc3RyaXBfZGVidWdnZXI7Ci0gICAgICBpZiAobGlua19pbmZvLmRpc2NhcmQgPT0gZGlzY2FyZF9ub25lKQotCWxpbmtfaW5mby5kaXNjYXJkID0gZGlzY2FyZF9hbGw7Ci0gICAgfQotCi0gIC8qIFRoaXMgZXNzZW50aWFsbHkgYWRkcyBhbm90aGVyIC1MIGRpcmVjdG9yeSBzbyB0aGlzIG11c3QgYmUgZG9uZSBhZnRlcgotICAgICB0aGUgLUwncyBpbiBhcmd2IGhhdmUgYmVlbiBwcm9jZXNzZWQuICAqLwotICBzZXRfc2NyaXB0c19kaXIgKCk7Ci0KLSAgaWYgKGhhZF9zY3JpcHQgPT0gZmFsc2UpCi0gICAgewotICAgICAgLyogUmVhZCB0aGUgZW11bGF0aW9uJ3MgYXBwcm9wcmlhdGUgZGVmYXVsdCBzY3JpcHQuICAqLwotICAgICAgaW50IGlzZmlsZTsKLSAgICAgIGNoYXIgKnMgPSBsZGVtdWxfZ2V0X3NjcmlwdCAoJmlzZmlsZSk7Ci0KLSAgICAgIGlmIChpc2ZpbGUpCi0JbGRmaWxlX29wZW5fY29tbWFuZF9maWxlIChzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAodHJhY2VfZmlsZV90cmllcykKLQkgICAgewotCSAgICAgIGluZm9fbXNnIChfKCJ1c2luZyBpbnRlcm5hbCBsaW5rZXIgc2NyaXB0OlxuIikpOwotCSAgICAgIGluZm9fbXNnICgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwotCSAgICAgIGluZm9fbXNnIChzKTsKLQkgICAgICBpbmZvX21zZyAoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwotCSAgICB9Ci0JICBsZXhfc3RyaW5nID0gczsKLQkgIGxleF9yZWRpcmVjdCAocyk7Ci0JfQotICAgICAgcGFyc2VyX2lucHV0ID0gaW5wdXRfc2NyaXB0OwotICAgICAgeXlwYXJzZSAoKTsKLSAgICAgIGxleF9zdHJpbmcgPSBOVUxMOwotICAgIH0KLQotICBsYW5nX2ZpbmFsICgpOwotCi0gIGlmIChsYW5nX2hhc19pbnB1dF9maWxlID09IGZhbHNlKQotICAgIHsKLSAgICAgIGlmICh2ZXJzaW9uX3ByaW50ZWQpCi0JeGV4aXQgKDApOwotICAgICAgZWluZm8gKF8oIiVQJUY6IG5vIGlucHV0IGZpbGVzXG4iKSk7Ci0gICAgfQotCi0gIGlmICh0cmFjZV9maWxlcykKLSAgICB7Ci0gICAgICBpbmZvX21zZyAoXygiJVA6IG1vZGUgJXNcbiIpLCBlbXVsYXRpb24pOwotICAgIH0KLQotICBsZGVtdWxfYWZ0ZXJfcGFyc2UgKCk7Ci0KLQotICBpZiAoY29uZmlnLm1hcF9maWxlbmFtZSkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChjb25maWcubWFwX2ZpbGVuYW1lLCAiLSIpID09IDApCi0JewotCSAgY29uZmlnLm1hcF9maWxlID0gc3Rkb3V0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjb25maWcubWFwX2ZpbGUgPSBmb3BlbiAoY29uZmlnLm1hcF9maWxlbmFtZSwgRk9QRU5fV1QpOwotCSAgaWYgKGNvbmZpZy5tYXBfZmlsZSA9PSAoRklMRSAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQkgICAgICBlaW5mbyAoXygiJVAlRjogY2Fubm90IG9wZW4gbWFwIGZpbGUgJXM6ICVFXG4iKSwKLQkJICAgICBjb25maWcubWFwX2ZpbGVuYW1lKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLQotICBsYW5nX3Byb2Nlc3MgKCk7Ci0KLSAgLyogUHJpbnQgZXJyb3IgbWVzc2FnZXMgZm9yIGFueSBtaXNzaW5nIHN5bWJvbHMsIGZvciBhbnkgd2FybmluZwotICAgICBzeW1ib2xzLCBhbmQgcG9zc2libHkgbXVsdGlwbGUgZGVmaW5pdGlvbnMgKi8KLQotCi0gIGlmIChjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgewotICAgICAgLyogTG9vayBmb3IgYSB0ZXh0IHNlY3Rpb24gYW5kIG1hcmsgdGhlIHJlYWRvbmx5IGF0dHJpYnV0ZSBpbiBpdCAqLwotICAgICAgYXNlY3Rpb24gKmZvdW5kID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIudGV4dCIpOwotCi0gICAgICBpZiAoZm91bmQgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgZm91bmQtPmZsYWdzIHw9IFNFQ19SRUFET05MWTsKLQl9Ci0gICAgfQotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIG91dHB1dF9iZmQtPmZsYWdzICY9IH5FWEVDX1A7Ci0gIGVsc2UKLSAgICBvdXRwdXRfYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0KLSAgbGR3cml0ZSAoKTsKLQotICBpZiAoY29uZmlnLm1hcF9maWxlICE9IE5VTEwpCi0gICAgbGFuZ19tYXAgKCk7Ci0gIGlmIChjb21tYW5kX2xpbmUuY3JlZikKLSAgICBvdXRwdXRfY3JlZiAoY29uZmlnLm1hcF9maWxlICE9IE5VTEwgPyBjb25maWcubWFwX2ZpbGUgOiBzdGRvdXQpOwotICBpZiAobm9jcm9zc3JlZl9saXN0ICE9IE5VTEwpCi0gICAgY2hlY2tfbm9jcm9zc3JlZnMgKCk7Ci0KLSAgLyogRXZlbiBpZiB3ZSdyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgc29tZSBub24tZmF0YWwgZXJyb3JzIHNob3VsZAotICAgICBiZSByZXBvcnRlZCBpbiB0aGUgZXhpdCBzdGF0dXMuICAoV2hhdCBub24tZmF0YWwgZXJyb3JzLCBpZiBhbnksIGRvIHdlCi0gICAgIHdhbnQgdG8gaWdub3JlIGZvciByZWxvY2F0ZWFibGUgb3V0cHV0PykgICovCi0KLSAgaWYgKGNvbmZpZy5tYWtlX2V4ZWN1dGFibGUgPT0gZmFsc2UgJiYgZm9yY2VfbWFrZV9leGVjdXRhYmxlID09IGZhbHNlKQotICAgIHsKLSAgICAgIGlmICh0cmFjZV9maWxlcyA9PSB0cnVlKQotCXsKLQkgIGVpbmZvIChfKCIlUDogbGluayBlcnJvcnMgZm91bmQsIGRlbGV0aW5nIGV4ZWN1dGFibGUgYCVzJ1xuIiksCi0JCSBvdXRwdXRfZmlsZW5hbWUpOwotCX0KLQotICAgICAgLyogVGhlIGZpbGUgd2lsbCBiZSByZW1vdmVkIGJ5IHJlbW92ZV9vdXRwdXQuICAqLwotCi0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgYmZkX2Nsb3NlIChvdXRwdXRfYmZkKSkKLQllaW5mbyAoXygiJUYlQjogZmluYWwgY2xvc2UgZmFpbGVkOiAlRVxuIiksIG91dHB1dF9iZmQpOwotCi0gICAgICAvKiBJZiB0aGUgLS1mb3JjZS1leGUtc3VmZml4IGlzIGVuYWJsZWQsIGFuZCB3ZSdyZSBtYWtpbmcgYW4KLQkgZXhlY3V0YWJsZSBmaWxlIGFuZCBpdCBkb2Vzbid0IGVuZCBpbiAuZXhlLCBjb3B5IGl0IHRvIG9uZSB3aGljaCBkb2VzLiAqLwotCi0gICAgICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlICYmIGNvbW1hbmRfbGluZS5mb3JjZV9leGVfc3VmZml4KQotCXsKLQkgIGludCBsZW4gPSBzdHJsZW4gKG91dHB1dF9maWxlbmFtZSk7Ci0JICBpZiAobGVuIDwgNCAKLQkgICAgICB8fCAoc3RyY2FzZWNtcCAob3V0cHV0X2ZpbGVuYW1lICsgbGVuIC0gNCwgIi5leGUiKSAhPSAwCi0JCSAgJiYgc3RyY2FzZWNtcCAob3V0cHV0X2ZpbGVuYW1lICsgbGVuIC0gNCwgIi5kbGwiKSAhPSAwKSkKLQkgICAgewotCSAgICAgIEZJTEUgKnNyYzsKLQkgICAgICBGSUxFICpkc3Q7Ci0JICAgICAgY29uc3QgaW50IGJzaXplID0gNDA5NjsKLQkgICAgICBjaGFyICpidWYgPSB4bWFsbG9jIChic2l6ZSk7Ci0JICAgICAgaW50IGw7Ci0JICAgICAgY2hhciAqZHN0X25hbWUgPSB4bWFsbG9jIChsZW4gKyA1KTsKLQkgICAgICBzdHJjcHkgKGRzdF9uYW1lLCBvdXRwdXRfZmlsZW5hbWUpOwotCSAgICAgIHN0cmNhdCAoZHN0X25hbWUsICIuZXhlIik7Ci0JICAgICAgc3JjID0gZm9wZW4gKG91dHB1dF9maWxlbmFtZSwgRk9QRU5fUkIpOwotCSAgICAgIGRzdCA9IGZvcGVuIChkc3RfbmFtZSwgRk9QRU5fV0IpOwotCi0JICAgICAgaWYgKCFzcmMpCi0JCWVpbmZvIChfKCIlWCVQOiB1bmFibGUgdG8gb3BlbiBmb3Igc291cmNlIG9mIGNvcHkgYCVzJ1xuIiksIG91dHB1dF9maWxlbmFtZSk7Ci0JICAgICAgaWYgKCFkc3QpCi0JCWVpbmZvIChfKCIlWCVQOiB1bmFibGUgdG8gb3BlbiBmb3IgZGVzdGluYXRpb24gb2YgY29weSBgJXMnXG4iKSwgZHN0X25hbWUpOwotCSAgICAgIHdoaWxlICgobCA9IGZyZWFkIChidWYsIDEsIGJzaXplLCBzcmMpKSA+IDApCi0JCXsKLQkJICBpbnQgZG9uZSA9IGZ3cml0ZSAoYnVmLCAxLCBsLCBkc3QpOwotCQkgIGlmIChkb25lICE9IGwpCi0JCSAgICB7Ci0JCSAgICAgIGVpbmZvIChfKCIlUDogRXJyb3Igd3JpdGluZyBmaWxlIGAlcydcbiIpLCBkc3RfbmFtZSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBmY2xvc2UgKHNyYyk7Ci0JICAgICAgaWYgKGZjbG9zZSAoZHN0KSA9PSBFT0YpCi0JCXsKLQkJICBlaW5mbyAoXygiJVA6IEVycm9yIGNsb3NpbmcgZmlsZSBgJXMnXG4iKSwgZHN0X25hbWUpOwotCQl9Ci0JICAgICAgZnJlZSAoZHN0X25hbWUpOwotCSAgICAgIGZyZWUgKGJ1Zik7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIEVORF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lKTsKLQotICBpZiAoY29uZmlnLnN0YXRzKQotICAgIHsKLSNpZmRlZiBIQVZFX1NCUksKLSAgICAgIGNoYXIgKmxpbSA9IChjaGFyICopIHNicmsgKDApOwotI2VuZGlmCi0gICAgICBsb25nIHJ1bl90aW1lID0gZ2V0X3J1bl90aW1lICgpIC0gc3RhcnRfdGltZTsKLQotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdG90YWwgdGltZSBpbiBsaW5rOiAlbGQuJTA2bGRcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUsIHJ1bl90aW1lIC8gMTAwMDAwMCwgcnVuX3RpbWUgJSAxMDAwMDAwKTsKLSNpZmRlZiBIQVZFX1NCUksKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGRhdGEgc2l6ZSAlbGRcbiIpLCBwcm9ncmFtX25hbWUsCi0JICAgICAgIChsb25nKSAobGltIC0gKGNoYXIgKikgJmVudmlyb24pKTsKLSNlbmRpZgotICAgIH0KLQotICAvKiBQcmV2ZW50IHJlbW92ZV9vdXRwdXQgZnJvbSBkb2luZyBhbnl0aGluZywgYWZ0ZXIgYSBzdWNjZXNzZnVsIGxpbmsuICAqLwotICBvdXRwdXRfZmlsZW5hbWUgPSBOVUxMOwotCi0gIHhleGl0ICgwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFdlIG5lZWQgdG8gZmluZCBhbnkgZXhwbGljaXRseSBnaXZlbiBlbXVsYXRpb24gaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aGUKLSAgIHN0YXRlIHRoYXQncyBuZWVkZWQgYnkgdGhlIGxleCZ5YWNjIGFyZ3VtZW50IHBhcnNlciAocGFyc2VfYXJncykuICAqLwotCi1zdGF0aWMgY2hhciAqCi1nZXRfZW11bGF0aW9uIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGNoYXIgKmVtdWxhdGlvbjsKLSAgaW50IGk7Ci0KLSAgZW11bGF0aW9uID0gZ2V0ZW52IChFTVVMQVRJT05fRU5WSVJPTik7Ci0gIGlmIChlbXVsYXRpb24gPT0gTlVMTCkKLSAgICBlbXVsYXRpb24gPSBERUZBVUxUX0VNVUxBVElPTjsKLQotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIHsKLSAgICAgIGlmICghc3RybmNtcCAoYXJndltpXSwgIi1tIiwgMikpCi0JewotCSAgaWYgKGFyZ3ZbaV1bMl0gPT0gJ1wwJykKLQkgICAgewotCSAgICAgIC8qIC1tIEVNVUwgKi8KLQkgICAgICBpZiAoaSA8IGFyZ2MgLSAxKQotCQl7Ci0JCSAgZW11bGF0aW9uID0gYXJndltpICsgMV07Ci0JCSAgaSsrOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZWluZm8oXygiJVAlRjogbWlzc2luZyBhcmd1bWVudCB0byAtbVxuIikpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAoYXJndltpXSwgIi1taXBzMSIpID09IDAKLQkJICAgfHwgc3RyY21wIChhcmd2W2ldLCAiLW1pcHMyIikgPT0gMAotCQkgICB8fCBzdHJjbXAgKGFyZ3ZbaV0sICItbWlwczMiKSA9PSAwCi0JCSAgIHx8IHN0cmNtcCAoYXJndltpXSwgIi1taXBzNCIpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogVGhlIGFyZ3VtZW50cyAtbWlwczEsIC1taXBzMiBhbmQgLW1pcHMzIGFyZQotCQkgcGFzc2VkIHRvIHRoZSBsaW5rZXIgYnkgc29tZSBNSVBTIGNvbXBpbGVycy4gIFRoZXkKLQkJIGdlbmVyYWxseSB0ZWxsIHRoZSBsaW5rZXIgdG8gdXNlIGEgc2xpZ2h0bHkgZGlmZmVyZW50Ci0JCSBsaWJyYXJ5IHBhdGguICBQZXJoYXBzIHNvbWVkYXkgdGhlc2Ugc2hvdWxkIGJlCi0JCSBpbXBsZW1lbnRlZCBhcyBlbXVsYXRpb25zOyB1bnRpbCB0aGVuLCB3ZSBqdXN0IGlnbm9yZQotCQkgdGhlIGFyZ3VtZW50cyBhbmQgaG9wZSB0aGF0IG5vYm9keSBldmVyIGNyZWF0ZXMKLQkJIGVtdWxhdGlvbnMgbmFtZWQgaXBzMSwgaXBzMiBvciBpcHMzLiAgKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChhcmd2W2ldLCAiLW00ODYiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFRoZSBhcmd1bWVudCAtbTQ4NiBpcyBwYXNzZWQgdG8gdGhlIGxpbmtlciBvbgotCQkgc29tZSBMaW51eCBzeXN0ZW1zLiAgSG9wZSB0aGF0IG5vYm9keSBjcmVhdGVzIGFuCi0JCSBlbXVsYXRpb24gbmFtZWQgNDg2LiAgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogLW1FTVVMICovCi0JICAgICAgZW11bGF0aW9uID0gJmFyZ3ZbaV1bMl07Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiBlbXVsYXRpb247Ci19Ci0KLS8qIElmIGRpcmVjdG9yeSBESVIgY29udGFpbnMgYW4gImxkc2NyaXB0cyIgc3ViZGlyZWN0b3J5LAotICAgYWRkIERJUiB0byB0aGUgbGlicmFyeSBzZWFyY2ggcGF0aCBhbmQgcmV0dXJuIHRydWUsCi0gICBlbHNlIHJldHVybiBmYWxzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jaGVja19mb3Jfc2NyaXB0c19kaXIgKGRpcikKLSAgICAgY2hhciAqZGlyOwotewotICBzaXplX3QgZGlybGVuOwotICBjaGFyICpidWY7Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIGJvb2xlYW4gcmVzOwotCi0gIGRpcmxlbiA9IHN0cmxlbiAoZGlyKTsKLSAgLyogc2l6ZW9mIGNvdW50cyB0aGUgdGVybWluYXRpbmcgTlVMLiAgKi8KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoZGlybGVuICsgc2l6ZW9mKCIvbGRzY3JpcHRzIikpOwotICBzcHJpbnRmIChidWYsICIlcy9sZHNjcmlwdHMiLCBkaXIpOwotCi0gIHJlcyA9IHN0YXQgKGJ1ZiwgJnMpID09IDAgJiYgU19JU0RJUiAocy5zdF9tb2RlKTsKLSAgZnJlZSAoYnVmKTsKLSAgaWYgKHJlcykKLSAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAoZGlyLCBmYWxzZSk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLS8qIFNldCB0aGUgZGVmYXVsdCBkaXJlY3RvcnkgZm9yIGZpbmRpbmcgc2NyaXB0IGZpbGVzLgotICAgTGlicmFyaWVzIHdpbGwgYmUgc2VhcmNoZWQgZm9yIGhlcmUgdG9vLCBidXQgdGhhdCdzIG9rLgotICAgV2UgbG9vayBmb3IgdGhlICJsZHNjcmlwdHMiIGRpcmVjdG9yeSBpbjoKLQotICAgU0NSSVBURElSIChwYXNzZWQgZnJvbSBNYWtlZmlsZSkKLSAgIHRoZSBkaXIgd2hlcmUgdGhpcyBwcm9ncmFtIGlzIChmb3IgdXNpbmcgaXQgZnJvbSB0aGUgYnVpbGQgdHJlZSkKLSAgIHRoZSBkaXIgd2hlcmUgdGhpcyBwcm9ncmFtIGlzLy4uL2xpYiAoZm9yIGluc3RhbGxpbmcgdGhlIHRvb2wgc3VpdGUgZWxzZXdoZXJlKSAqLwotCi1zdGF0aWMgdm9pZAotc2V0X3NjcmlwdHNfZGlyICgpCi17Ci0gIGNoYXIgKmVuZCwgKmRpcjsKLSAgc2l6ZV90IGRpcmxlbjsKLQotICBpZiAoY2hlY2tfZm9yX3NjcmlwdHNfZGlyIChTQ1JJUFRESVIpKQotICAgIHJldHVybjsJCQkvKiBXZSd2ZSBiZWVuIGluc3RhbGxlZCBub3JtYWxseS4gICovCi0KLSAgLyogTG9vayBmb3IgImxkc2NyaXB0cyIgaW4gdGhlIGRpciB3aGVyZSBvdXIgYmluYXJ5IGlzLiAgKi8KLSAgZW5kID0gc3RycmNociAocHJvZ3JhbV9uYW1lLCAnLycpOwotCi0gIGlmIChlbmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBEb24ndCBsb29rIGZvciBsZHNjcmlwdHMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgVGhlcmUgaXMKLSAgICAgICAgIHRvbyBtdWNoIHBvdGVudGlhbCBmb3IgY29uZnVzaW9uLiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZGlybGVuID0gZW5kIC0gcHJvZ3JhbV9uYW1lOwotICAvKiBNYWtlIGEgY29weSBvZiBwcm9ncmFtX25hbWUgaW4gZGlyLgotICAgICBMZWF2ZSByb29tIGZvciBsYXRlciAiLy4uL2xpYiIuICAqLwotICBkaXIgPSAoY2hhciAqKSB4bWFsbG9jIChkaXJsZW4gKyA4KTsKLSAgc3RybmNweSAoZGlyLCBwcm9ncmFtX25hbWUsIGRpcmxlbik7Ci0gIGRpcltkaXJsZW5dID0gJ1wwJzsKLQotICBpZiAoY2hlY2tfZm9yX3NjcmlwdHNfZGlyIChkaXIpKQotICAgIHJldHVybjsJCQkvKiBEb24ndCBmcmVlIGRpci4gICovCi0KLSAgLyogTG9vayBmb3IgImxkc2NyaXB0cyIgaW4gPHRoZSBkaXIgd2hlcmUgb3VyIGJpbmFyeSBpcz4vLi4vbGliLiAgKi8KLSAgc3RyY3B5IChkaXIgKyBkaXJsZW4sICIvLi4vbGliIik7Ci0gIGlmIChjaGVja19mb3Jfc2NyaXB0c19kaXIgKGRpcikpCi0gICAgcmV0dXJuOwotCi0gIGZyZWUgKGRpcik7CQkJLyogV2VsbCwgd2UgdHJpZWQuICAqLwotfQotCi12b2lkCi1hZGRfeXN5bSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKGxpbmtfaW5mby5ub3RpY2VfaGFzaCA9PSAoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgewotICAgICAgbGlua19pbmZvLm5vdGljZV9oYXNoID0gKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikKLQkJCSAgICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF90YWJsZSkpKTsKLSAgICAgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXRfbiAobGlua19pbmZvLm5vdGljZV9oYXNoLAotCQkJCSAgIGJmZF9oYXNoX25ld2Z1bmMsCi0JCQkJICAgNjEpKQotCWVpbmZvIChfKCIlUCVGOiBiZmRfaGFzaF90YWJsZV9pbml0IGZhaWxlZDogJUVcbiIpKTsKLSAgICB9ICAgICAgCi0KLSAgaWYgKGJmZF9oYXNoX2xvb2t1cCAobGlua19pbmZvLm5vdGljZV9oYXNoLCBuYW1lLCB0cnVlLCB0cnVlKQotICAgICAgPT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotfQotCi0vKiBSZWNvcmQgYSBzeW1ib2wgdG8gYmUgd3JhcHBlZCwgZnJvbSB0aGUgLS13cmFwIG9wdGlvbi4gICovCi0KLXZvaWQKLWFkZF93cmFwIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAobGlua19pbmZvLndyYXBfaGFzaCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGxpbmtfaW5mby53cmFwX2hhc2ggPSAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKQotCQkJICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF90YWJsZSkpKTsKLSAgICAgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXRfbiAobGlua19pbmZvLndyYXBfaGFzaCwKLQkJCQkgICBiZmRfaGFzaF9uZXdmdW5jLAotCQkJCSAgIDYxKSkKLQllaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgfQotICBpZiAoYmZkX2hhc2hfbG9va3VwIChsaW5rX2luZm8ud3JhcF9oYXNoLCBuYW1lLCB0cnVlLCB0cnVlKSA9PSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotfQotCi0vKiBIYW5kbGUgdGhlIC1yZXRhaW4tc3ltYm9scy1maWxlIG9wdGlvbi4gICovCi0KLXZvaWQKLWFkZF9rZWVwc3ltc19maWxlIChmaWxlbmFtZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIEZJTEUgKmZpbGU7Ci0gIGNoYXIgKmJ1ZjsKLSAgc2l6ZV90IGJ1ZnNpemU7Ci0gIGludCBjOwotCi0gIGlmIChsaW5rX2luZm8uc3RyaXAgPT0gc3RyaXBfc29tZSkKLSAgICBlaW5mbyAoXygiJVglUDogZXJyb3I6IGR1cGxpY2F0ZSByZXRhaW4tc3ltYm9scy1maWxlXG4iKSk7Ci0KLSAgZmlsZSA9IGZvcGVuIChmaWxlbmFtZSwgInIiKTsKLSAgaWYgKGZpbGUgPT0gKEZJTEUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgZWluZm8gKCIlWCVQOiAlczogJUVcbiIsIGZpbGVuYW1lKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbGlua19pbmZvLmtlZXBfaGFzaCA9ICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopCi0JCQkgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUpKSk7Ci0gIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXQgKGxpbmtfaW5mby5rZWVwX2hhc2gsIGJmZF9oYXNoX25ld2Z1bmMpKQotICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfaGFzaF90YWJsZV9pbml0IGZhaWxlZDogJUVcbiIpKTsKLQotICBidWZzaXplID0gMTAwOwotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChidWZzaXplKTsKLQotICBjID0gZ2V0YyAoZmlsZSk7Ci0gIHdoaWxlIChjICE9IEVPRikKLSAgICB7Ci0gICAgICB3aGlsZSAoaXNzcGFjZSAoYykpCi0JYyA9IGdldGMgKGZpbGUpOwotCi0gICAgICBpZiAoYyAhPSBFT0YpCi0JewotCSAgc2l6ZV90IGxlbiA9IDA7Ci0KLQkgIHdoaWxlICghIGlzc3BhY2UgKGMpICYmIGMgIT0gRU9GKQotCSAgICB7Ci0JICAgICAgYnVmW2xlbl0gPSBjOwotCSAgICAgICsrbGVuOwotCSAgICAgIGlmIChsZW4gPj0gYnVmc2l6ZSkKLQkJewotCQkgIGJ1ZnNpemUgKj0gMjsKLQkJICBidWYgPSB4cmVhbGxvYyAoYnVmLCBidWZzaXplKTsKLQkJfQotCSAgICAgIGMgPSBnZXRjIChmaWxlKTsKLQkgICAgfQotCi0JICBidWZbbGVuXSA9ICdcMCc7Ci0KLQkgIGlmIChiZmRfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5rZWVwX2hhc2gsIGJ1ZiwgdHJ1ZSwgdHJ1ZSkKLQkgICAgICA9PSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfaGFzaF9sb29rdXAgZm9yIGluc2VydGlvbiBmYWlsZWQ6ICVFXG4iKSk7Ci0JfQotICAgIH0KLQotICBpZiAobGlua19pbmZvLnN0cmlwICE9IHN0cmlwX25vbmUpCi0gICAgZWluZm8gKF8oIiVQOiBgLXJldGFpbi1zeW1ib2xzLWZpbGUnIG92ZXJyaWRlcyBgLXMnIGFuZCBgLVMnXG4iKSk7Ci0KLSAgbGlua19pbmZvLnN0cmlwID0gc3RyaXBfc29tZTsKLX0KLQwKLS8qIENhbGxiYWNrcyBmcm9tIHRoZSBCRkQgbGlua2VyIHJvdXRpbmVzLiAgKi8KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBCRkQgaGFzIGRlY2lkZWQgdG8gaW5jbHVkZSBhbiBhcmNoaXZlIG1lbWJlciBpbgotICAgYSBsaW5rLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotYWRkX2FyY2hpdmVfZWxlbWVudCAoaW5mbywgYWJmZCwgbmFtZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqaW5wdXQ7Ci0KLSAgaW5wdXQgPSAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikKLQkgICB4bWFsbG9jIChzaXplb2YgKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUpKSk7Ci0gIGlucHV0LT5maWxlbmFtZSA9IGFiZmQtPmZpbGVuYW1lOwotICBpbnB1dC0+bG9jYWxfc3ltX25hbWUgPSBhYmZkLT5maWxlbmFtZTsKLSAgaW5wdXQtPnRoZV9iZmQgPSBhYmZkOwotICBpbnB1dC0+YXN5bWJvbHMgPSBOVUxMOwotICBpbnB1dC0+bmV4dCA9IE5VTEw7Ci0gIGlucHV0LT5qdXN0X3N5bXNfZmxhZyA9IGZhbHNlOwotICBpbnB1dC0+bG9hZGVkID0gZmFsc2U7Ci0gIGlucHV0LT5zZWFyY2hfZGlyc19mbGFnID0gZmFsc2U7Ci0KLSAgLyogRklYTUU6IFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBub3Qgc2V0OiBoZWFkZXIubmV4dCwKLSAgICAgaGVhZGVyLnR5cGUsIGNsb3NlZCwgcGFzc2l2ZV9wb3NpdGlvbiwgc3ltYm9sX2NvdW50LAotICAgICBuZXh0X3JlYWxfZmlsZSwgaXNfYXJjaGl2ZSwgdGFyZ2V0LCByZWFsLiAgVGhpcyBiaXQgb2YgY29kZSBpcwotICAgICBmcm9tIHRoZSBvbGQgZGVjb2RlX2xpYnJhcnlfc3ViZmlsZSBmdW5jdGlvbi4gIEkgZG9uJ3Qga25vdwotICAgICB3aGV0aGVyIGFueSBvZiB0aG9zZSBmaWVsZHMgbWF0dGVycy4gICovCi0KLSAgbGRsYW5nX2FkZF9maWxlIChpbnB1dCk7Ci0KLSAgaWYgKGNvbmZpZy5tYXBfZmlsZSAhPSAoRklMRSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHN0YXRpYyBib29sZWFuIGhlYWRlcl9wcmludGVkOwotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBiZmQgKmZyb207Ci0gICAgICBpbnQgbGVuOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCWZyb20gPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAoaC0+dHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGZyb20gPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICBmcm9tID0gaC0+dS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLQkgICAgICBmcm9tID0gaC0+dS51bmRlZi5hYmZkOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgZnJvbSA9IGgtPnUuYy5wLT5zZWN0aW9uLT5vd25lcjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgaGVhZGVyX3ByaW50ZWQpCi0JewotCSAgY2hhciBidWZbMTAwXTsKLQotCSAgc3ByaW50ZiAoYnVmLCAiJS0yOXMgJXNcblxuIiwgXygiQXJjaGl2ZSBtZW1iZXIgaW5jbHVkZWQiKSwKLQkJICAgXygiYmVjYXVzZSBvZiBmaWxlIChzeW1ib2wpIikpOwotCSAgbWluZm8gKCIlcyIsIGJ1Zik7Ci0JICBoZWFkZXJfcHJpbnRlZCA9IHRydWU7Ci0JfQotCi0gICAgICBpZiAoYmZkX215X2FyY2hpdmUgKGFiZmQpID09IE5VTEwpCi0JewotCSAgbWluZm8gKCIlcyIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIGxlbiA9IHN0cmxlbiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtaW5mbyAoIiVzKCVzKSIsIGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChhYmZkKSksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICBsZW4gPSAoc3RybGVuIChiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoYWJmZCkpKQotCQkgKyBzdHJsZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKQotCQkgKyAyKTsKLQl9Ci0KLSAgICAgIGlmIChsZW4gPj0gMjkpCi0JewotCSAgcHJpbnRfbmwgKCk7Ci0JICBsZW4gPSAwOwotCX0KLSAgICAgIHdoaWxlIChsZW4gPCAzMCkKLQl7Ci0JICBwcmludF9zcGFjZSAoKTsKLQkgICsrbGVuOwotCX0KLQotICAgICAgaWYgKGZyb20gIT0gTlVMTCkKLQltaW5mbyAoIiVCICIsIGZyb20pOwotICAgICAgaWYgKGggIT0gTlVMTCkKLQltaW5mbyAoIiglVClcbiIsIGgtPnJvb3Quc3RyaW5nKTsKLSAgICAgIGVsc2UKLQltaW5mbyAoIiglcylcbiIsIG5hbWUpOwotICAgIH0KLQotICBpZiAodHJhY2VfZmlsZXMgfHwgdHJhY2VfZmlsZV90cmllcykKLSAgICBpbmZvX21zZyAoIiVJXG4iLCBpbnB1dCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gQkZEIGhhcyBkaXNjb3ZlcmVkIGEgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQKLSAgIG11bHRpcGxlIHRpbWVzLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotbXVsdGlwbGVfZGVmaW5pdGlvbiAoaW5mbywgbmFtZSwgb2JmZCwgb3NlYywgb3ZhbCwgbmJmZCwgbnNlYywgbnZhbCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXNlY3Rpb24gKm9zZWM7Ci0gICAgIGJmZF92bWEgb3ZhbDsKLSAgICAgYmZkICpuYmZkOwotICAgICBhc2VjdGlvbiAqbnNlYzsKLSAgICAgYmZkX3ZtYSBudmFsOwotewotICAvKiBJZiBlaXRoZXIgc2VjdGlvbiBoYXMgdGhlIG91dHB1dF9zZWN0aW9uIGZpZWxkIHNldCB0bwotICAgICBiZmRfYWJzX3NlY3Rpb25fcHRyLCBpdCBtZWFucyB0aGF0IHRoZSBzZWN0aW9uIGlzIGJlaW5nCi0gICAgIGRpc2NhcmRlZCwgYW5kIHRoaXMgaXMgbm90IHJlYWxseSBhIG11bHRpcGxlIGRlZmluaXRpb24gYXQgYWxsLgotICAgICBGSVhNRTogSXQgd291bGQgYmUgY2xlYW5lciB0byBzb21laG93IGlnbm9yZSBzeW1ib2xzIGRlZmluZWQgaW4KLSAgICAgc2VjdGlvbnMgd2hpY2ggYXJlIGJlaW5nIGRpc2NhcmRlZC4gICovCi0gIGlmICgob3NlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTAotICAgICAgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChvc2VjKQotICAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAob3NlYy0+b3V0cHV0X3NlY3Rpb24pKQotICAgICAgfHwgKG5zZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKLQkgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChuc2VjKQotCSAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChuc2VjLT5vdXRwdXRfc2VjdGlvbikpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGVpbmZvIChfKCIlWCVDOiBtdWx0aXBsZSBkZWZpbml0aW9uIG9mIGAlVCdcbiIpLAotCSBuYmZkLCBuc2VjLCBudmFsLCBuYW1lKTsKLSAgaWYgKG9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlRDogZmlyc3QgZGVmaW5lZCBoZXJlXG4iKSwgb2JmZCwgb3NlYywgb3ZhbCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgZGVmaW5pdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wsIG9yCi0gICB3aGVuIGEgY29tbW9uIHN5bWJvbCBpcyBmb3VuZCBmb3IgYSBzeW1ib2wgdGhhdCBpcyBhbHJlYWR5IGRlZmluZWQsCi0gICBvciB3aGVuIHR3byBjb21tb24gc3ltYm9scyBhcmUgZm91bmQuICBXZSBvbmx5IGRvIHNvbWV0aGluZyBpZgotICAgLXdhcm4tY29tbW9uIHdhcyB1c2VkLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotbXVsdGlwbGVfY29tbW9uIChpbmZvLCBuYW1lLCBvYmZkLCBvdHlwZSwgb3NpemUsIG5iZmQsIG50eXBlLCBuc2l6ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgb3R5cGU7Ci0gICAgIGJmZF92bWEgb3NpemU7Ci0gICAgIGJmZCAqbmJmZDsKLSAgICAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgbnR5cGU7Ci0gICAgIGJmZF92bWEgbnNpemU7Ci17Ci0gIGlmICghIGNvbmZpZy53YXJuX2NvbW1vbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAobnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICB8fCBudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLSAgICAgIHx8IG50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0gICAgewotICAgICAgQVNTRVJUIChvdHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbik7Ci0gICAgICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IGRlZmluaXRpb24gb2YgYCVUJyBvdmVycmlkaW5nIGNvbW1vblxuIiksCi0JICAgICBuYmZkLCBuYW1lKTsKLSAgICAgIGlmIChvYmZkICE9IE5VTEwpCi0JZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBjb21tb24gaXMgaGVyZVxuIiksIG9iZmQpOwotICAgIH0KLSAgZWxzZSBpZiAob3R5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgb3R5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JICAgfHwgb3R5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKLSAgICB7Ci0gICAgICBBU1NFUlQgKG50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKTsKLSAgICAgIGVpbmZvIChfKCIlQjogd2FybmluZzogY29tbW9uIG9mIGAlVCcgb3ZlcnJpZGRlbiBieSBkZWZpbml0aW9uXG4iKSwKLQkgICAgIG5iZmQsIG5hbWUpOwotICAgICAgaWYgKG9iZmQgIT0gTlVMTCkKLQllaW5mbyAoXygiJUI6IHdhcm5pbmc6IGRlZmluZWQgaGVyZVxuIiksIG9iZmQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEFTU0VSVCAob3R5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24gJiYgbnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pOwotICAgICAgaWYgKG9zaXplID4gbnNpemUpCi0JewotCSAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBjb21tb24gb2YgYCVUJyBvdmVycmlkZGVuIGJ5IGxhcmdlciBjb21tb25cbiIpLAotCQkgbmJmZCwgbmFtZSk7Ci0JICBpZiAob2JmZCAhPSBOVUxMKQotCSAgICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IGxhcmdlciBjb21tb24gaXMgaGVyZVxuIiksIG9iZmQpOwotCX0KLSAgICAgIGVsc2UgaWYgKG5zaXplID4gb3NpemUpCi0JewotCSAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBjb21tb24gb2YgYCVUJyBvdmVycmlkaW5nIHNtYWxsZXIgY29tbW9uXG4iKSwKLQkJIG5iZmQsIG5hbWUpOwotCSAgaWYgKG9iZmQgIT0gTlVMTCkKLQkgICAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBzbWFsbGVyIGNvbW1vbiBpcyBoZXJlXG4iKSwgb2JmZCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGVpbmZvIChfKCIlQjogd2FybmluZzogbXVsdGlwbGUgY29tbW9uIG9mIGAlVCdcbiIpLCBuYmZkLCBuYW1lKTsKLQkgIGlmIChvYmZkICE9IE5VTEwpCi0JICAgIGVpbmZvIChfKCIlQjogd2FybmluZzogcHJldmlvdXMgY29tbW9uIGlzIGhlcmVcbiIpLCBvYmZkKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIEJGRCBoYXMgZGlzY292ZXJlZCBhIHNldCBlbGVtZW50LiAgSCBpcyB0aGUKLSAgIGVudHJ5IGluIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSBmb3IgdGhlIHNldC4gIFNFQ1RJT04gYW5kIFZBTFVFCi0gICByZXByZXNlbnQgYSB2YWx1ZSB3aGljaCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHNldC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWFkZF90b19zZXQgKGluZm8sIGgsIHJlbG9jLCBhYmZkLCBzZWN0aW9uLCB2YWx1ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGlmIChjb25maWcud2Fybl9jb25zdHJ1Y3RvcnMpCi0gICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBnbG9iYWwgY29uc3RydWN0b3IgJXMgdXNlZFxuIiksCi0JICAgaC0+cm9vdC5zdHJpbmcpOwotCi0gIGlmICghIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbGRjdG9yX2FkZF9zZXRfZW50cnkgKGgsIHJlbG9jLCAoY29uc3QgY2hhciAqKSBOVUxMLCBzZWN0aW9uLCB2YWx1ZSk7Ci0KLSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0gICAgewotICAgICAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotICAgICAgaC0+dS51bmRlZi5hYmZkID0gYWJmZDsKLSAgICAgIC8qIFdlIGRvbid0IGNhbGwgYmZkX2xpbmtfYWRkX3VuZGVmIHRvIGFkZCB0aGlzIHRvIHRoZSBsaXN0IG9mCi0JIHVuZGVmaW5lZCBzeW1ib2xzIGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIGRlZmluZSBpdAotCSBvdXJzZWx2ZXMuICAqLwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBCRkQgaGFzIGRpc2NvdmVyZWQgYSBjb25zdHJ1Y3Rvci4gIFRoaXMgaXMgb25seQotICAgY2FsbGVkIGZvciBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMtLXRob3NlIHdoaWNoIGRvIG5vdCBoYW5kbGUKLSAgIGNvbnN0cnVjdG9ycyBpbiBzb21lIG1vcmUgY2xldmVyIGZhc2hpb24uICBUaGlzIGlzIHNpbWlsYXIgdG8KLSAgIGFkZGluZyBhbiBlbGVtZW50IHRvIGEgc2V0LCBidXQgbGVzcyBnZW5lcmFsLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvbnN0cnVjdG9yX2NhbGxiYWNrIChpbmZvLCBjb25zdHJ1Y3RvciwgbmFtZSwgYWJmZCwgc2VjdGlvbiwgdmFsdWUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuIGNvbnN0cnVjdG9yOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBjaGFyICpzOwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgY2hhciBzZXRfbmFtZVsxICsgc2l6ZW9mICJfX0NUT1JfTElTVF9fIl07Ci0KLSAgaWYgKGNvbmZpZy53YXJuX2NvbnN0cnVjdG9ycykKLSAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6IGdsb2JhbCBjb25zdHJ1Y3RvciAlcyB1c2VkXG4iKSwgbmFtZSk7Ci0KLSAgaWYgKCEgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBFbnN1cmUgdGhhdCBCRkRfUkVMT0NfQ1RPUiBleGlzdHMgbm93LCBzbyB0aGF0IHdlIGNhbiBnaXZlIGEKLSAgICAgdXNlZnVsIGVycm9yIG1lc3NhZ2UuICAqLwotICBpZiAoYmZkX3JlbG9jX3R5cGVfbG9va3VwIChvdXRwdXRfYmZkLCBCRkRfUkVMT0NfQ1RPUikgPT0gTlVMTAotICAgICAgJiYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLQkgIHx8IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DX0NUT1IpID09IE5VTEwpKQotICAgIGVpbmZvIChfKCIlUCVGOiBCRkQgYmFja2VuZCBlcnJvcjogQkZEX1JFTE9DX0NUT1IgdW5zdXBwb3J0ZWRcbiIpKTsKLQotICBzID0gc2V0X25hbWU7Ci0gIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpICE9ICdcMCcpCi0gICAgKnMrKyA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCk7Ci0gIGlmIChjb25zdHJ1Y3RvcikKLSAgICBzdHJjcHkgKHMsICJfX0NUT1JfTElTVF9fIik7Ci0gIGVsc2UKLSAgICBzdHJjcHkgKHMsICJfX0RUT1JfTElTVF9fIik7Ci0KLSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBzZXRfbmFtZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0gIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotICAgIHsKLSAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLSAgICAgIGgtPnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0gICAgICAvKiBXZSBkb24ndCBjYWxsIGJmZF9saW5rX2FkZF91bmRlZiB0byBhZGQgdGhpcyB0byB0aGUgbGlzdCBvZgotCSB1bmRlZmluZWQgc3ltYm9scyBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBkZWZpbmUgaXQKLQkgb3Vyc2VsdmVzLiAgKi8KLSAgICB9Ci0KLSAgbGRjdG9yX2FkZF9zZXRfZW50cnkgKGgsIEJGRF9SRUxPQ19DVE9SLCBuYW1lLCBzZWN0aW9uLCB2YWx1ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBIHN0cnVjdHVyZSB1c2VkIGJ5IHdhcm5pbmdfY2FsbGJhY2sgdG8gcGFzcyBpbmZvcm1hdGlvbiB0aHJvdWdoCi0gICBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCi1zdHJ1Y3Qgd2FybmluZ19jYWxsYmFja19pbmZvCi17Ci0gIGJvb2xlYW4gZm91bmQ7Ci0gIGNvbnN0IGNoYXIgKndhcm5pbmc7Ci0gIGNvbnN0IGNoYXIgKnN5bWJvbDsKLSAgYXN5bWJvbCAqKmFzeW1ib2xzOwotfTsKLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIHJlZmVyZW5jZSB0byBhIHdhcm5pbmcgc3ltYm9sLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotd2FybmluZ19jYWxsYmFjayAoaW5mbywgd2FybmluZywgc3ltYm9sLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqd2FybmluZzsKLSAgICAgY29uc3QgY2hhciAqc3ltYm9sOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci17Ci0gIC8qIFRoaXMgaXMgYSBoYWNrIHRvIHN1cHBvcnQgd2Fybl9tdWx0aXBsZV9ncC4gIEZJWE1FOiBUaGlzIHNob3VsZAotICAgICBoYXZlIGEgY2xlYW5lciBpbnRlcmZhY2UsIGJ1dCB3aGF0PyAgKi8KLSAgaWYgKCEgY29uZmlnLndhcm5fbXVsdGlwbGVfZ3AKLSAgICAgICYmIHN0cmNtcCAod2FybmluZywgInVzaW5nIG11bHRpcGxlIGdwIHZhbHVlcyIpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKHNlY3Rpb24gIT0gTlVMTCkKLSAgICBlaW5mbyAoIiVDOiAlc1xuIiwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcywgd2FybmluZyk7Ci0gIGVsc2UgaWYgKGFiZmQgPT0gTlVMTCkKLSAgICBlaW5mbyAoIiVQOiAlc1xuIiwgd2FybmluZyk7Ci0gIGVsc2UgaWYgKHN5bWJvbCA9PSBOVUxMKQotICAgIGVpbmZvICgiJUI6ICVzXG4iLCBhYmZkLCB3YXJuaW5nKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotICAgICAgYXN5bWJvbCAqKmFzeW1ib2xzOwotICAgICAgc3RydWN0IHdhcm5pbmdfY2FsbGJhY2tfaW5mbyBpbmZvOwotCi0gICAgICAvKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyB0byBzZWUgaWYgd2UgY2FuIGZpbmQgYSBwbGF1c2libGUKLQkgYWRkcmVzcy4gICovCi0KLSAgICAgIGVudHJ5ID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgYWJmZC0+dXNyZGF0YTsKLSAgICAgIGlmIChlbnRyeSAhPSBOVUxMICYmIGVudHJ5LT5hc3ltYm9scyAhPSBOVUxMKQotCWFzeW1ib2xzID0gZW50cnktPmFzeW1ib2xzOwotICAgICAgZWxzZQotCXsKLQkgIGxvbmcgc3ltc2l6ZTsKLQkgIGxvbmcgc3ltYm9sX2NvdW50OwotCi0JICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotCSAgaWYgKHN5bXNpemUgPCAwKQotCSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIpLCBhYmZkKTsKLQkgIGFzeW1ib2xzID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotCSAgc3ltYm9sX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIGFzeW1ib2xzKTsKLQkgIGlmIChzeW1ib2xfY291bnQgPCAwKQotCSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIpLCBhYmZkKTsKLQkgIGlmIChlbnRyeSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZW50cnktPmFzeW1ib2xzID0gYXN5bWJvbHM7Ci0JICAgICAgZW50cnktPnN5bWJvbF9jb3VudCA9IHN5bWJvbF9jb3VudDsKLQkgICAgfQotCX0KLQotICAgICAgaW5mby5mb3VuZCA9IGZhbHNlOwotICAgICAgaW5mby53YXJuaW5nID0gd2FybmluZzsKLSAgICAgIGluZm8uc3ltYm9sID0gc3ltYm9sOwotICAgICAgaW5mby5hc3ltYm9scyA9IGFzeW1ib2xzOwotICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCB3YXJuaW5nX2ZpbmRfcmVsb2MsIChQVFIpICZpbmZvKTsKLQotICAgICAgaWYgKCEgaW5mby5mb3VuZCkKLQllaW5mbyAoIiVCOiAlc1xuIiwgYWJmZCwgd2FybmluZyk7Ci0KLSAgICAgIGlmIChlbnRyeSA9PSBOVUxMKQotCWZyZWUgKGFzeW1ib2xzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IHdhcm5pbmdfY2FsbGJhY2sgZm9yIGVhY2ggc2VjdGlvbi4gIEl0IGNoZWNrcyB0aGUKLSAgIHJlbG9jcyBvZiB0aGUgc2VjdGlvbiB0byBzZWUgaWYgaXQgY2FuIGZpbmQgYSByZWZlcmVuY2UgdG8gdGhlCi0gICBzeW1ib2wgd2hpY2ggdHJpZ2dlcmVkIHRoZSB3YXJuaW5nLiAgSWYgaXQgY2FuLCBpdCB1c2VzIHRoZSByZWxvYwotICAgdG8gZ2l2ZSBhbiBlcnJvciBtZXNzYWdlIHdpdGggYSBmaWxlIGFuZCBsaW5lIG51bWJlci4gICovCi0KLXN0YXRpYyB2b2lkCi13YXJuaW5nX2ZpbmRfcmVsb2MgKGFiZmQsIHNlYywgaWFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgaWFyZzsKLXsKLSAgc3RydWN0IHdhcm5pbmdfY2FsbGJhY2tfaW5mbyAqaW5mbyA9IChzdHJ1Y3Qgd2FybmluZ19jYWxsYmFja19pbmZvICopIGlhcmc7Ci0gIGxvbmcgcmVsc2l6ZTsKLSAgYXJlbGVudCAqKnJlbHBwOwotICBsb25nIHJlbGNvdW50OwotICBhcmVsZW50ICoqcCwgKipwZW5kOwotCi0gIGlmIChpbmZvLT5mb3VuZCkKLSAgICByZXR1cm47Ci0KLSAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYyk7Ci0gIGlmIChyZWxzaXplIDwgMCkKLSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgcmVsb2NzOiAlRVxuIiksIGFiZmQpOwotICBpZiAocmVsc2l6ZSA9PSAwKQotICAgIHJldHVybjsKLQotICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLSAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWMsIHJlbHBwLCBpbmZvLT5hc3ltYm9scyk7Ci0gIGlmIChyZWxjb3VudCA8IDApCi0gICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHJlbG9jczogJUVcbiIpLCBhYmZkKTsKLQotICBwID0gcmVscHA7Ci0gIHBlbmQgPSBwICsgcmVsY291bnQ7Ci0gIGZvciAoOyBwIDwgcGVuZCAmJiAqcCAhPSBOVUxMOyBwKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcSA9ICpwOwotCi0gICAgICBpZiAocS0+c3ltX3B0cl9wdHIgIT0gTlVMTAotCSAgJiYgKnEtPnN5bV9wdHJfcHRyICE9IE5VTEwKLQkgICYmIHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoKnEtPnN5bV9wdHJfcHRyKSwgaW5mby0+c3ltYm9sKSA9PSAwKQotCXsKLQkgIC8qIFdlIGZvdW5kIGEgcmVsb2MgZm9yIHRoZSBzeW1ib2wgd2UgYXJlIGxvb2tpbmcgZm9yLiAgKi8KLQkgIGVpbmZvICgiJUM6ICVzXG4iLCBhYmZkLCBzZWMsIHEtPmFkZHJlc3MsIGluZm8tPndhcm5pbmcpOwotCSAgaW5mby0+Zm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBmcmVlIChyZWxwcCk7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gdW5kZWZpbmVkIHN5bWJvbCBpcyBmb3VuZC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXVuZGVmaW5lZF9zeW1ib2wgKGluZm8sIG5hbWUsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci17Ci0gIHN0YXRpYyBjaGFyICplcnJvcl9uYW1lOwotICBzdGF0aWMgdW5zaWduZWQgaW50IGVycm9yX2NvdW50OwotCi0jZGVmaW5lIE1BWF9FUlJPUlNfSU5fQV9ST1cgNQotCi0gIGlmIChjb25maWcud2Fybl9vbmNlKQotICAgIHsKLSAgICAgIHN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKmhhc2g7Ci0KLSAgICAgIC8qIE9ubHkgd2FybiBvbmNlIGFib3V0IGEgcGFydGljdWxhciB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLQotICAgICAgaWYgKGhhc2ggPT0gTlVMTCkKLQl7Ci0JICBoYXNoID0gKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikKLQkJICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF90YWJsZSkpKTsKLQkgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXQgKGhhc2gsIGJmZF9oYXNoX25ld2Z1bmMpKQotCSAgICBlaW5mbyAoXygiJUYlUDogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iKSk7Ci0JfQotCi0gICAgICBpZiAoYmZkX2hhc2hfbG9va3VwIChoYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UpICE9IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGlmIChiZmRfaGFzaF9sb29rdXAgKGhhc2gsIG5hbWUsIHRydWUsIHRydWUpID09IE5VTEwpCi0JZWluZm8gKF8oIiVGJVA6IGJmZF9oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgfQotCi0gIC8qIFdlIG5ldmVyIHByaW50IG1vcmUgdGhhbiBhIHJlYXNvbmFibGUgbnVtYmVyIG9mIGVycm9ycyBpbiBhIHJvdwotICAgICBmb3IgYSBzaW5nbGUgc3ltYm9sLiAgKi8KLSAgaWYgKGVycm9yX25hbWUgIT0gKGNoYXIgKikgTlVMTAotICAgICAgJiYgc3RyY21wIChuYW1lLCBlcnJvcl9uYW1lKSA9PSAwKQotICAgICsrZXJyb3JfY291bnQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlcnJvcl9jb3VudCA9IDA7Ci0gICAgICBpZiAoZXJyb3JfbmFtZSAhPSAoY2hhciAqKSBOVUxMKQotCWZyZWUgKGVycm9yX25hbWUpOwotICAgICAgZXJyb3JfbmFtZSA9IGJ1eXN0cmluZyAobmFtZSk7Ci0gICAgfQotCi0gIGlmIChzZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGVycm9yX2NvdW50IDwgTUFYX0VSUk9SU19JTl9BX1JPVykKLQllaW5mbyAoXygiJVglQzogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgJVQnXG4iKSwKLQkgICAgICAgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcywgbmFtZSk7Ci0gICAgICBlbHNlIGlmIChlcnJvcl9jb3VudCA9PSBNQVhfRVJST1JTX0lOX0FfUk9XKQotCWVpbmZvIChfKCIlRDogbW9yZSB1bmRlZmluZWQgcmVmZXJlbmNlcyB0byBgJVQnIGZvbGxvd1xuIiksCi0JICAgICAgIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MsIG5hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChlcnJvcl9jb3VudCA8IE1BWF9FUlJPUlNfSU5fQV9ST1cpCi0JZWluZm8gKF8oIiVYJUI6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYCVUJ1xuIiksCi0JICAgICAgIGFiZmQsIG5hbWUpOwotICAgICAgZWxzZSBpZiAoZXJyb3JfY291bnQgPT0gTUFYX0VSUk9SU19JTl9BX1JPVykKLQllaW5mbyAoXygiJUI6IG1vcmUgdW5kZWZpbmVkIHJlZmVyZW5jZXMgdG8gYCVUJyBmb2xsb3dcbiIpLAotCSAgICAgICBhYmZkLCBuYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSByZWxvYyBvdmVyZmxvd3MuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1yZWxvY19vdmVyZmxvdyAoaW5mbywgbmFtZSwgcmVsb2NfbmFtZSwgYWRkZW5kLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcmVsb2NfbmFtZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLXsKLSAgaWYgKGFiZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVYOiBnZW5lcmF0ZWQiKSk7Ci0gIGVsc2UKLSAgICBlaW5mbyAoIiVYJUM6IiwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcyk7Ci0gIGVpbmZvIChfKCIgcmVsb2NhdGlvbiB0cnVuY2F0ZWQgdG8gZml0OiAlcyAlVCIpLCByZWxvY19uYW1lLCBuYW1lKTsKLSAgaWYgKGFkZGVuZCAhPSAwKQotICAgIGVpbmZvICgiKyV2IiwgYWRkZW5kKTsKLSAgZWluZm8gKCJcbiIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGRhbmdlcm91cyByZWxvY2F0aW9uIGlzIG1hZGUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1yZWxvY19kYW5nZXJvdXMgKGluZm8sIG1lc3NhZ2UsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICptZXNzYWdlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci17Ci0gIGlmIChhYmZkID09IChiZmQgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlWDogZ2VuZXJhdGVkIikpOwotICBlbHNlCi0gICAgZWluZm8gKCIlWCVDOiIsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MpOwotICBlaW5mbyAoXygiZGFuZ2Vyb3VzIHJlbG9jYXRpb246ICVzXG4iKSwgbWVzc2FnZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgcmVsb2MgaXMgYmVpbmcgZ2VuZXJhdGVkIGF0dGFjaGVkIHRvIGEgc3ltYm9sCi0gICB0aGF0IGlzIG5vdCBiZWluZyBvdXRwdXQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi11bmF0dGFjaGVkX3JlbG9jIChpbmZvLCBuYW1lLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBpZiAoYWJmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgZWluZm8gKF8oIiVQJVg6IGdlbmVyYXRlZCIpKTsKLSAgZWxzZQotICAgIGVpbmZvICgiJVglQzoiLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKTsKLSAgZWluZm8gKF8oIiByZWxvYyByZWZlcnMgdG8gc3ltYm9sIGAlVCcgd2hpY2ggaXMgbm90IGJlaW5nIG91dHB1dFxuIiksIG5hbWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgaWYgbGlua19pbmZvLm5vdGljZV9hbGwgaXMgc2V0LCBvciB3aGVuIGEgc3ltYm9sIGluCi0gICBsaW5rX2luZm8ubm90aWNlX2hhc2ggaXMgZm91bmQuICBTeW1ib2xzIGFyZSBwdXQgaW4gbm90aWNlX2hhc2gKLSAgIHVzaW5nIHRoZSAteSBvcHRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbm90aWNlIChpbmZvLCBuYW1lLCBhYmZkLCBzZWN0aW9uLCB2YWx1ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGlmICghIGluZm8tPm5vdGljZV9hbGwKLSAgICAgIHx8IChpbmZvLT5ub3RpY2VfaGFzaCAhPSBOVUxMCi0JICAmJiBiZmRfaGFzaF9sb29rdXAgKGluZm8tPm5vdGljZV9oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UpICE9IE5VTEwpKQotICAgIHsKLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQotCWVpbmZvICgiJUI6IHJlZmVyZW5jZSB0byAlc1xuIiwgYWJmZCwgbmFtZSk7Ci0gICAgICBlbHNlCi0JZWluZm8gKCIlQjogZGVmaW5pdGlvbiBvZiAlc1xuIiwgYWJmZCwgbmFtZSk7Ci0gICAgfQotCi0gIGlmIChjb21tYW5kX2xpbmUuY3JlZiB8fCBub2Nyb3NzcmVmX2xpc3QgIT0gTlVMTCkKLSAgICBhZGRfY3JlZiAobmFtZSwgYWJmZCwgc2VjdGlvbiwgdmFsdWUpOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRtYWluLmggYi9sZC9sZG1haW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxYmYzZC4uMDAwMDAwMAotLS0gYS9sZC9sZG1haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIGxkbWFpbi5oIC0KLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTERNQUlOX0gKLSNkZWZpbmUgTERNQUlOX0gKLQotZXh0ZXJuIGNoYXIgKnByb2dyYW1fbmFtZTsKLWV4dGVybiBiZmQgKm91dHB1dF9iZmQ7Ci1leHRlcm4gY2hhciAqZGVmYXVsdF90YXJnZXQ7Ci1leHRlcm4gYm9vbGVhbiB0cmFjZV9maWxlczsKLWV4dGVybiBib29sZWFuIHRyYWNlX2ZpbGVfdHJpZXM7Ci1leHRlcm4gYm9vbGVhbiB2ZXJzaW9uX3ByaW50ZWQ7Ci1leHRlcm4gYm9vbGVhbiB3aG9sZV9hcmNoaXZlOwotZXh0ZXJuIGJvb2xlYW4gZGVtYW5nbGluZzsKLWV4dGVybiBpbnQgZ19zd2l0Y2hfdmFsdWU7Ci1leHRlcm4gY29uc3QgY2hhciAqb3V0cHV0X2ZpbGVuYW1lOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19pbmZvIGxpbmtfaW5mbzsKLQotZXh0ZXJuIHZvaWQgYWRkX3lzeW0gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBhZGRfd3JhcCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGFkZF9rZWVwc3ltc19maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGRtaXNjLmMgYi9sZC9sZG1pc2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhYjIyOC4uMDAwMDAwMAotLS0gYS9sZC9sZG1pc2MuYworKysgL2Rldi9udWxsCkBAIC0xLDUzOCArMCwwIEBACi0vKiBsZG1pc2MuYwotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZGVtYW5nbGUuaCIKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2RlZmluZSBVU0VfU1REQVJHIDEKLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2RlZmluZSBVU0VfU1REQVJHIDAKLSNlbmRpZgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0KLXN0YXRpYyB2b2lkIHZmaW5mbyBQQVJBTVMgKChGSUxFICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOwotCi0vKgotICUlIGxpdGVyYWwgJQotICVGIGVycm9yIGlzIGZhdGFsCi0gJVAgcHJpbnQgcHJvZ3JhbSBuYW1lCi0gJVMgcHJpbnQgc2NyaXB0IGZpbGUgYW5kIGxpbmVudW1iZXIKLSAlRSBjdXJyZW50IGJmZCBlcnJvciBvciBlcnJubwotICVJIGZpbGVuYW1lIGZyb20gYSBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlCi0gJUIgZmlsZW5hbWUgZnJvbSBhIGJmZAotICVUIHN5bWJvbCBuYW1lCi0gJVggbm8gb2JqZWN0IG91dHB1dCwgZmFpbCByZXR1cm4KLSAlViBoZXggYmZkX3ZtYQotICV2IGhleCBiZmRfdm1hLCBubyBsZWFkaW5nIHplcm9zCi0gJVcgaGV4IGJmZF92bWEgd2l0aCAweCB3aXRoIG5vIGxlYWRpbmcgemVyb3MgdGFraW5nIHVwIDggc3BhY2VzCi0gJUMgY2xldmVyIGZpbGVuYW1lOmxpbmVudW1iZXIgd2l0aCBmdW5jdGlvbgotICVEIGxpa2UgJUMsIGJ1dCBubyBmdW5jdGlvbiBuYW1lCi0gJUcgbGlrZSAlRCwgYnV0IG9ubHkgZnVuY3Rpb24gbmFtZQotICVSIGluZm8gYWJvdXQgYSByZWxlbnQKLSAlcyBhcmJpdHJhcnkgc3RyaW5nLCBsaWtlIHByaW50ZgotICVkIGludGVnZXIsIGxpa2UgcHJpbnRmCi0gJXUgaW50ZWdlciwgbGlrZSBwcmludGYKLSovCi0KLWNoYXIgKgotZGVtYW5nbGUgKHN0cmluZykKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBjaGFyICpyZXM7Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTAotICAgICAgJiYgYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChvdXRwdXRfYmZkKSA9PSBzdHJpbmdbMF0pCi0gICAgKytzdHJpbmc7Ci0KLSAgLyogVGhpcyBpcyBhIGhhY2sgZm9yIGJldHRlciBlcnJvciByZXBvcnRpbmcgb24gWENPRkYsIG9yIHRoZSBNUyBQRSAgICovCi0gIC8qIGZvcm1hdC4gIFhjb2ZmIGhhcyBhIHNpbmdsZSAnLicsIHdoaWxlIHRoZSBOVCBQRSBmb3IgUFBDIGhhcyAnLi4nLiAqLwotICAvKiBTbyB3ZSByZW1vdmUgYWxsIG9mIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgd2hpbGUoc3RyaW5nWzBdID09ICcuJykKLSAgICArK3N0cmluZzsKLQotICByZXMgPSBjcGx1c19kZW1hbmdsZSAoc3RyaW5nLCBETUdMX0FOU0kgfCBETUdMX1BBUkFNUyk7Ci0gIHJldHVybiByZXMgPyByZXMgOiB4c3RyZHVwIChzdHJpbmcpOwotfQotCi1zdGF0aWMgdm9pZAotdmZpbmZvIChmcCwgZm10LCBhcmcpCi0gICAgIEZJTEUgKmZwOwotICAgICBjb25zdCBjaGFyICpmbXQ7Ci0gICAgIHZhX2xpc3QgYXJnOwotewotICBib29sZWFuIGZhdGFsID0gZmFsc2U7Ci0KLSAgd2hpbGUgKCpmbXQgIT0gJ1wwJykKLSAgICB7Ci0gICAgICB3aGlsZSAoKmZtdCAhPSAnJScgJiYgKmZtdCAhPSAnXDAnKSAKLQl7Ci0JICBwdXRjICgqZm10LCBmcCk7Ci0JICBmbXQrKzsKLQl9Ci0KLSAgICAgIGlmICgqZm10ID09ICclJykgCi0JewotCSAgZm10ICsrOwotCSAgc3dpdGNoICgqZm10KyspIAotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZnByaW50ZiAoZnAsIiUlJWMiLCBmbXRbLTFdKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICclJzoKLQkgICAgICAvKiBsaXRlcmFsICUgKi8KLQkgICAgICBwdXRjICgnJScsIGZwKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdYJzoKLQkgICAgICAvKiBubyBvYmplY3Qgb3V0cHV0LCBmYWlsIHJldHVybiAqLwotCSAgICAgIGNvbmZpZy5tYWtlX2V4ZWN1dGFibGUgPSBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdWJzoKLQkgICAgICAvKiBoZXggYmZkX3ZtYSAqLwotCSAgICAgIHsKLQkJYmZkX3ZtYSB2YWx1ZSA9IHZhX2FyZyAoYXJnLCBiZmRfdm1hKTsKLQkJZnByaW50Zl92bWEgKGZwLCB2YWx1ZSk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3YnOgotCSAgICAgIC8qIGhleCBiZmRfdm1hLCBubyBsZWFkaW5nIHplcm9zICovCi0JICAgICAgewotCQljaGFyIGJ1ZlsxMDBdOwotCQljaGFyICpwID0gYnVmOwotCQliZmRfdm1hIHZhbHVlID0gdmFfYXJnIChhcmcsIGJmZF92bWEpOwotCQlzcHJpbnRmX3ZtYSAocCwgdmFsdWUpOwotCQl3aGlsZSAoKnAgPT0gJzAnKQotCQkgIHArKzsKLQkJaWYgKCEqcCkKLQkJICBwLS07Ci0JCWZwdXRzIChwLCBmcCk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1cnOgotCSAgICAgIC8qIGhleCBiZmRfdm1hIHdpdGggMHggd2l0aCBubyBsZWFkaW5nIHplcm9lcyB0YWtpbmcgdXAKLSAgICAgICAgICAgICAgICAgOCBzcGFjZXMuICAqLwotCSAgICAgIHsKLQkJY2hhciBidWZbMTAwXTsKLQkJYmZkX3ZtYSB2YWx1ZTsKLQkJY2hhciAqcDsKLQkJaW50IGxlbjsKLQotCQl2YWx1ZSA9IHZhX2FyZyAoYXJnLCBiZmRfdm1hKTsKLQkJc3ByaW50Zl92bWEgKGJ1ZiwgdmFsdWUpOwotCQlmb3IgKHAgPSBidWY7ICpwID09ICcwJzsgKytwKQotCQkgIDsKLQkJaWYgKCpwID09ICdcMCcpCi0JCSAgLS1wOwotCQlsZW4gPSBzdHJsZW4gKHApOwotCQl3aGlsZSAobGVuIDwgOCkKLQkJICB7Ci0JCSAgICBwdXRjICgnICcsIGZwKTsKLQkJICAgICsrbGVuOwotCQkgIH0KLQkJZnByaW50ZiAoZnAsICIweCVzIiwgcCk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1QnOgotCSAgICAgIC8qIFN5bWJvbCBuYW1lLiAgKi8KLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWUgPSB2YV9hcmcgKGFyZywgY29uc3QgY2hhciAqKTsKLQotCQlpZiAobmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMIHx8ICpuYW1lID09IDApCi0JCSAgZnByaW50ZiAoZnAsIF8oIm5vIHN5bWJvbCIpKTsKLQkJZWxzZSBpZiAoISBkZW1hbmdsaW5nKQotCQkgIGZwcmludGYgKGZwLCAiJXMiLCBuYW1lKTsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGNoYXIgKmRlbWFuZ2xlZDsKLQotCQkgICAgZGVtYW5nbGVkID0gZGVtYW5nbGUgKG5hbWUpOwotCQkgICAgZnByaW50ZiAoZnAsICIlcyIsIGRlbWFuZ2xlZCk7Ci0JCSAgICBmcmVlIChkZW1hbmdsZWQpOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnQic6Ci0JICAgICAgLyogZmlsZW5hbWUgZnJvbSBhIGJmZCAqLwotCSAgICAgIHsgCi0JCWJmZCAqYWJmZCA9IHZhX2FyZyAoYXJnLCBiZmQgKik7Ci0JCWlmIChhYmZkLT5teV9hcmNoaXZlKQotCQkgIGZwcmludGYgKGZwLCAiJXMoJXMpIiwgYWJmZC0+bXlfYXJjaGl2ZS0+ZmlsZW5hbWUsCi0JCQkgICBhYmZkLT5maWxlbmFtZSk7Ci0JCWVsc2UKLQkJICBmcHJpbnRmIChmcCwgIiVzIiwgYWJmZC0+ZmlsZW5hbWUpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdGJzoKLQkgICAgICAvKiBlcnJvciBpcyBmYXRhbCAqLwotCSAgICAgIGZhdGFsID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdQJzoKLQkgICAgICAvKiBwcmludCBwcm9ncmFtIG5hbWUgKi8KLQkgICAgICBmcHJpbnRmIChmcCwgIiVzIiwgcHJvZ3JhbV9uYW1lKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdFJzoKLQkgICAgICAvKiBjdXJyZW50IGJmZCBlcnJvciBvciBlcnJubyAqLwotCSAgICAgIGZwcmludGYgKGZwLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnSSc6Ci0JICAgICAgLyogZmlsZW5hbWUgZnJvbSBhIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKi8KLQkgICAgICB7Ci0JCWxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmk7Ci0KLQkJaSA9IHZhX2FyZyAoYXJnLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopOwotCQlpZiAoYmZkX215X2FyY2hpdmUgKGktPnRoZV9iZmQpICE9IE5VTEwpCi0JCSAgZnByaW50ZiAoZnAsICIoJXMpIiwKLQkJCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChpLT50aGVfYmZkKSkpOwotCQlmcHJpbnRmIChmcCwgIiVzIiwgaS0+bG9jYWxfc3ltX25hbWUpOwotCQlpZiAoYmZkX215X2FyY2hpdmUgKGktPnRoZV9iZmQpID09IE5VTEwKLQkJICAgICYmIHN0cmNtcCAoaS0+bG9jYWxfc3ltX25hbWUsIGktPmZpbGVuYW1lKSAhPSAwKQotCQkgIGZwcmludGYgKGZwLCAiICglcykiLCBpLT5maWxlbmFtZSk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1MnOgotCSAgICAgIC8qIHByaW50IHNjcmlwdCBmaWxlIGFuZCBsaW5lbnVtYmVyICovCi0JICAgICAgaWYgKHBhcnNpbmdfZGVmc3ltKQotCQlmcHJpbnRmIChmcCwgIi0tZGVmc3ltICVzIiwgbGV4X3N0cmluZyk7Ci0JICAgICAgZWxzZSBpZiAobGRmaWxlX2lucHV0X2ZpbGVuYW1lICE9IE5VTEwpCi0JCWZwcmludGYgKGZwLCAiJXM6JXUiLCBsZGZpbGVfaW5wdXRfZmlsZW5hbWUsIGxpbmVubyk7Ci0JICAgICAgZWxzZQotCQlmcHJpbnRmIChmcCwgXygiYnVpbHQgaW4gbGlua2VyIHNjcmlwdDoldSIpLCBsaW5lbm8pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1InOgotCSAgICAgIC8qIFByaW50IGFsbCB0aGF0J3MgaW50ZXJlc3RpbmcgYWJvdXQgYSByZWxlbnQgKi8KLQkgICAgICB7Ci0JCWFyZWxlbnQgKnJlbGVudCA9IHZhX2FyZyAoYXJnLCBhcmVsZW50ICopOwotCQotCQlsZmluZm8gKGZwLCAiJXMrMHgldiAodHlwZSAlcykiLAotCQkJKCoocmVsZW50LT5zeW1fcHRyX3B0cikpLT5uYW1lLAotCQkJcmVsZW50LT5hZGRlbmQsCi0JCQlyZWxlbnQtPmhvd3RvLT5uYW1lKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JCi0JICAgIGNhc2UgJ0MnOgotCSAgICBjYXNlICdEJzoKLQkgICAgY2FzZSAnRyc6Ci0JICAgICAgLyogQ2xldmVyIGZpbGVuYW1lOmxpbmVudW1iZXIgd2l0aCBmdW5jdGlvbiBuYW1lIGlmIHBvc3NpYmxlLAotCQkgb3Igc2VjdGlvbiBuYW1lIGFzIGEgbGFzdCByZXNvcnQuICBUaGUgYXJndW1lbnRzIGFyZSBhIEJGRCwKLQkJIGEgc2VjdGlvbiwgYW5kIGFuIG9mZnNldC4gICovCi0JICAgICAgewotCQlzdGF0aWMgYmZkICpsYXN0X2JmZDsKLQkJc3RhdGljIGNoYXIgKmxhc3RfZmlsZSA9IE5VTEw7Ci0JCXN0YXRpYyBjaGFyICpsYXN0X2Z1bmN0aW9uID0gTlVMTDsKLQkJYmZkICphYmZkOwotCQlhc2VjdGlvbiAqc2VjdGlvbjsKLQkJYmZkX3ZtYSBvZmZzZXQ7Ci0JCWxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotCQlhc3ltYm9sICoqYXN5bWJvbHM7Ci0JCWNvbnN0IGNoYXIgKmZpbGVuYW1lOwotCQljb25zdCBjaGFyICpmdW5jdGlvbm5hbWU7Ci0JCXVuc2lnbmVkIGludCBsaW5lbnVtYmVyOwotCQlib29sZWFuIGRpc2NhcmRfbGFzdDsKLQotCQlhYmZkID0gdmFfYXJnIChhcmcsIGJmZCAqKTsKLQkJc2VjdGlvbiA9IHZhX2FyZyAoYXJnLCBhc2VjdGlvbiAqKTsKLQkJb2Zmc2V0ID0gdmFfYXJnIChhcmcsIGJmZF92bWEpOwotCi0JCWVudHJ5ID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgYWJmZC0+dXNyZGF0YTsKLQkJaWYgKGVudHJ5ICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIE5VTEwKLQkJICAgICYmIGVudHJ5LT5hc3ltYm9scyAhPSAoYXN5bWJvbCAqKikgTlVMTCkKLQkJICBhc3ltYm9scyA9IGVudHJ5LT5hc3ltYm9sczsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGxvbmcgc3ltc2l6ZTsKLQkJICAgIGxvbmcgc3ltYm9sX2NvdW50OwotCi0JCSAgICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotCQkgICAgaWYgKHN5bXNpemUgPCAwKQotCQkgICAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sc1xuIiksIGFiZmQpOwotCQkgICAgYXN5bWJvbHMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltc2l6ZSk7Ci0JCSAgICBzeW1ib2xfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgYXN5bWJvbHMpOwotCQkgICAgaWYgKHN5bWJvbF9jb3VudCA8IDApCi0JCSAgICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzXG4iKSwgYWJmZCk7Ci0JCSAgICBpZiAoZW50cnkgIT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgTlVMTCkKLQkJICAgICAgewotCQkJZW50cnktPmFzeW1ib2xzID0gYXN5bWJvbHM7Ci0JCQllbnRyeS0+c3ltYm9sX2NvdW50ID0gc3ltYm9sX2NvdW50OwotCQkgICAgICB9Ci0JCSAgfQotCi0JCWRpc2NhcmRfbGFzdCA9IHRydWU7Ci0JCWlmIChiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIGFzeW1ib2xzLCBvZmZzZXQsCi0JCQkJCSAgICZmaWxlbmFtZSwgJmZ1bmN0aW9ubmFtZSwKLQkJCQkJICAgJmxpbmVudW1iZXIpKQotCQkgIHsKLQkJICAgIGlmIChmdW5jdGlvbm5hbWUgIT0gTlVMTCAmJiBmbXRbLTFdID09ICdHJykKLQkJICAgICAgewotCQkJbGZpbmZvIChmcCwgIiVCOiIsIGFiZmQpOwotCQkJaWYgKGZpbGVuYW1lICE9IE5VTEwKLQkJCSAgICAmJiBzdHJjbXAgKGZpbGVuYW1lLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSkgIT0gMCkKLQkJCSAgZnByaW50ZiAoZnAsICIlczoiLCBmaWxlbmFtZSk7Ci0JCQlsZmluZm8gKGZwLCAiJVQiLCBmdW5jdGlvbm5hbWUpOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChmdW5jdGlvbm5hbWUgIT0gTlVMTCAmJiBmbXRbLTFdID09ICdDJykKLQkJICAgICAgewotCQkJaWYgKGZpbGVuYW1lID09IChjaGFyICopIE5VTEwpCi0JCQkgIGZpbGVuYW1lID0gYWJmZC0+ZmlsZW5hbWU7Ci0KLQkJCWlmIChsYXN0X2JmZCA9PSBOVUxMCi0JCQkgICAgfHwgbGFzdF9maWxlID09IE5VTEwKLQkJCSAgICB8fCBsYXN0X2Z1bmN0aW9uID09IE5VTEwKLQkJCSAgICB8fCBsYXN0X2JmZCAhPSBhYmZkCi0JCQkgICAgfHwgc3RyY21wIChsYXN0X2ZpbGUsIGZpbGVuYW1lKSAhPSAwCi0JCQkgICAgfHwgc3RyY21wIChsYXN0X2Z1bmN0aW9uLCBmdW5jdGlvbm5hbWUpICE9IDApCi0JCQkgIHsKLQkJCSAgICAvKiBXZSB1c2UgYWJmZC0+ZmlsZW5hbWUgaW4gdGhpcyBpbml0aWFsIGxpbmUsCi0JCQkgICAgICAgaW4gY2FzZSBmaWxlbmFtZSBpcyBhIC5oIGZpbGUgb3Igc29tZXRoaW5nCi0JCQkgICAgICAgc2ltaWxhcmx5IHVuaGVscGZ1bC4gICovCi0JCQkgICAgbGZpbmZvIChmcCwgXygiJUI6IEluIGZ1bmN0aW9uIGAlVCc6XG4iKSwKLQkJCQkgICAgYWJmZCwgZnVuY3Rpb25uYW1lKTsKLQotCQkJICAgIGxhc3RfYmZkID0gYWJmZDsKLQkJCSAgICBpZiAobGFzdF9maWxlICE9IE5VTEwpCi0JCQkgICAgICBmcmVlIChsYXN0X2ZpbGUpOwotCQkJICAgIGxhc3RfZmlsZSA9IGJ1eXN0cmluZyAoZmlsZW5hbWUpOwotCQkJICAgIGlmIChsYXN0X2Z1bmN0aW9uICE9IE5VTEwpCi0JCQkgICAgICBmcmVlIChsYXN0X2Z1bmN0aW9uKTsKLQkJCSAgICBsYXN0X2Z1bmN0aW9uID0gYnV5c3RyaW5nIChmdW5jdGlvbm5hbWUpOwotCQkJICB9Ci0JCQlkaXNjYXJkX2xhc3QgPSBmYWxzZTsKLQkJCWlmIChsaW5lbnVtYmVyICE9IDApCi0JCQkgIGZwcmludGYgKGZwLCAiJXM6JXUiLCBmaWxlbmFtZSwgbGluZW51bWJlcik7Ci0JCQllbHNlCi0JCQkgIGxmaW5mbyAoZnAsICIlcyglcysweCV2KSIsIGZpbGVuYW1lLCBzZWN0aW9uLT5uYW1lLAotCQkJCSAgb2Zmc2V0KTsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoZmlsZW5hbWUgPT0gTlVMTAotCQkJICAgICB8fCBzdHJjbXAgKGZpbGVuYW1lLCBhYmZkLT5maWxlbmFtZSkgPT0gMCkKLQkJICAgICAgewotCQkJbGZpbmZvIChmcCwgIiVCKCVzKzB4JXYpIiwgYWJmZCwgc2VjdGlvbi0+bmFtZSwKLQkJCQlvZmZzZXQpOwotCQkJaWYgKGxpbmVudW1iZXIgIT0gMCkKLQkJCSAgbGZpbmZvIChmcCwgIjoldSIsIGxpbmVudW1iZXIpOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChsaW5lbnVtYmVyICE9IDApIAotCQkgICAgICBsZmluZm8gKGZwLCAiJUI6JXM6JXUiLCBhYmZkLCBmaWxlbmFtZSwgbGluZW51bWJlcik7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGxmaW5mbyAoZnAsICIlQiglcysweCV2KTolcyIsIGFiZmQsIHNlY3Rpb24tPm5hbWUsCi0JCQkgICAgICBvZmZzZXQsIGZpbGVuYW1lKTsKLQkJICB9Ci0JCWVsc2UKLQkJICBsZmluZm8gKGZwLCAiJUIoJXMrMHgldikiLCBhYmZkLCBzZWN0aW9uLT5uYW1lLCBvZmZzZXQpOwotCi0JCWlmIChkaXNjYXJkX2xhc3QpCi0JCSAgewotCQkgICAgbGFzdF9iZmQgPSBOVUxMOwotCQkgICAgaWYgKGxhc3RfZmlsZSAhPSBOVUxMKQotCQkgICAgICB7Ci0JCQlmcmVlIChsYXN0X2ZpbGUpOwotCQkJbGFzdF9maWxlID0gTlVMTDsKLQkJICAgICAgfQotCQkgICAgaWYgKGxhc3RfZnVuY3Rpb24gIT0gTlVMTCkKLQkJICAgICAgewotCQkJZnJlZSAobGFzdF9mdW5jdGlvbik7Ci0JCQlsYXN0X2Z1bmN0aW9uID0gTlVMTDsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JCQotCSAgICBjYXNlICdzJzoKLQkgICAgICAvKiBhcmJpdHJhcnkgc3RyaW5nLCBsaWtlIHByaW50ZiAqLwotCSAgICAgIGZwcmludGYgKGZwLCAiJXMiLCB2YV9hcmcgKGFyZywgY2hhciAqKSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgLyogaW50ZWdlciwgbGlrZSBwcmludGYgKi8KLQkgICAgICBmcHJpbnRmIChmcCwgIiVkIiwgdmFfYXJnIChhcmcsIGludCkpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3UnOgotCSAgICAgIC8qIHVuc2lnbmVkIGludGVnZXIsIGxpa2UgcHJpbnRmICovCi0JICAgICAgZnByaW50ZiAoZnAsICIldSIsIHZhX2FyZyAoYXJnLCB1bnNpZ25lZCBpbnQpKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGZhdGFsID09IHRydWUpIAotICAgIHhleGl0KDEpOwotfQotCi0vKiBGb3JtYXQgaW5mbyBtZXNzYWdlIGFuZCBwcmludCBvbiBzdGRvdXQuICovCi0KLS8qIChZb3Ugd291bGQgdGhpbmsgdGhpcyBzaG91bGQgYmUgY2FsbGVkIGp1c3QgImluZm8iLCBidXQgdGhlbiB5b3UKLSAgIHdvdWxkIGhvc2VkIGJ5IEx5bnhPUywgd2hpY2ggZGVmaW5lcyB0aGF0IG5hbWUgaW4gaXRzIGxpYmMuKSAgKi8KLQotdm9pZAotI2lmIFVTRV9TVERBUkcKLWluZm9fbXNnIChjb25zdCBjaGFyICpmbXQsIC4uLikKLSNlbHNlCi1pbmZvX21zZyAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHZhX2xpc3QgYXJnOwotCi0jaWYgISBVU0VfU1REQVJHCi0gIGNvbnN0IGNoYXIgKmZtdDsKLQotICB2YV9zdGFydCAoYXJnKTsKLSAgZm10ID0gdmFfYXJnIChhcmcsIGNvbnN0IGNoYXIgKik7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJnLCBmbXQpOwotI2VuZGlmCi0KLSAgdmZpbmZvIChzdGRvdXQsIGZtdCwgYXJnKTsKLSAgdmFfZW5kIChhcmcpOwotfQotCi0vKiAoJ2UnIGZvciBlcnJvci4pIEZvcm1hdCBpbmZvIG1lc3NhZ2UgYW5kIHByaW50IG9uIHN0ZGVyci4gKi8KLQotdm9pZAotI2lmIFVTRV9TVERBUkcKLWVpbmZvIChjb25zdCBjaGFyICpmbXQsIC4uLikKLSNlbHNlCi1laW5mbyAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHZhX2xpc3QgYXJnOwotCi0jaWYgISBVU0VfU1REQVJHCi0gIGNvbnN0IGNoYXIgKmZtdDsKLQotICB2YV9zdGFydCAoYXJnKTsKLSAgZm10ID0gdmFfYXJnIChhcmcsIGNvbnN0IGNoYXIgKik7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJnLCBmbXQpOwotI2VuZGlmCi0KLSAgdmZpbmZvIChzdGRlcnIsIGZtdCwgYXJnKTsKLSAgdmFfZW5kIChhcmcpOwotfQotCi12b2lkIAotaW5mb19hc3NlcnQgKGZpbGUsIGxpbmUpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotewotICBlaW5mbyAoXygiJUYlUDogaW50ZXJuYWwgZXJyb3IgJXMgJWRcbiIpLCBmaWxlLCBsaW5lKTsKLX0KLQotY2hhciAqCi1idXlzdHJpbmcgKHgpCi0gICAgIENPTlNUIGNoYXIgKkNPTlNUIHg7Ci17Ci0gIHNpemVfdCBsID0gc3RybGVuKHgpKzE7Ci0gIGNoYXIgKnIgPSB4bWFsbG9jKGwpOwotICBtZW1jcHkociwgeCxsKTsKLSAgcmV0dXJuIHI7Ci19Ci0KLS8qICgnbScgZm9yIG1hcCkgRm9ybWF0IGluZm8gbWVzc2FnZSBhbmQgcHJpbnQgb24gbWFwLiAqLwotCi12b2lkCi0jaWYgVVNFX1NUREFSRwotbWluZm8gKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotI2Vsc2UKLW1pbmZvICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgdmFfbGlzdCBhcmc7Ci0KLSNpZiAhIFVTRV9TVERBUkcKLSAgY29uc3QgY2hhciAqZm10OwotICB2YV9zdGFydCAoYXJnKTsKLSAgZm10ID0gdmFfYXJnIChhcmcsIGNvbnN0IGNoYXIgKik7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJnLCBmbXQpOwotI2VuZGlmCi0KLSAgdmZpbmZvIChjb25maWcubWFwX2ZpbGUsIGZtdCwgYXJnKTsKLSAgdmFfZW5kIChhcmcpOwotfQotCi12b2lkCi0jaWYgVVNFX1NUREFSRwotbGZpbmZvIChGSUxFICpmaWxlLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSNlbHNlCi1sZmluZm8gKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZzsKLQotI2lmICEgVVNFX1NUREFSRwotICBGSUxFICpmaWxlOwotICBjb25zdCBjaGFyICpmbXQ7Ci0KLSAgdmFfc3RhcnQgKGFyZyk7Ci0gIGZpbGUgPSB2YV9hcmcgKGFyZywgRklMRSAqKTsKLSAgZm10ID0gdmFfYXJnIChhcmcsIGNvbnN0IGNoYXIgKik7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJnLCBmbXQpOwotI2VuZGlmCi0KLSAgdmZpbmZvIChmaWxlLCBmbXQsIGFyZyk7Ci0gIHZhX2VuZCAoYXJnKTsKLX0KLQwKLS8qIEZ1bmN0aW9ucyB0byBwcmludCB0aGUgbGluayBtYXAuICAqLwotCi12b2lkIAotcHJpbnRfc3BhY2UgKCkKLXsKLSAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiICIpOwotfQotCi12b2lkIAotcHJpbnRfbmwgKCkKLXsKLSAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiXG4iKTsKLX0KZGlmZiAtLWdpdCBhL2xkL2xkbWlzYy5oIGIvbGQvbGRtaXNjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YjNiNGYuLjAwMDAwMDAKLS0tIGEvbGQvbGRtaXNjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKiBsZG1pc2MuaCAtCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTERNSVNDX0gKLSNkZWZpbmUgTERNSVNDX0gKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotZXh0ZXJuIHZvaWQgZWluZm8gUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKTsKLWV4dGVybiB2b2lkIG1pbmZvIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci1leHRlcm4gdm9pZCBpbmZvX21zZyBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotZXh0ZXJuIHZvaWQgbGZpbmZvIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKLSNlbHNlCi0vKiBWQVJBUkdTKi8KLWV4dGVybiB2b2lkIGVpbmZvICgpOwotLyogVkFSQVJHUyovCi1leHRlcm4gdm9pZCBtaW5mbyAoKTsKLS8qIFZBUkFSR1MqLwotZXh0ZXJuIHZvaWQgaW5mb19tc2cgKCk7Ci0vKlZBUkFSR1MqLwotZXh0ZXJuIHZvaWQgbGZpbmZvICgpOwotI2VuZGlmCi0KLWV4dGVybiB2b2lkIGluZm9fYXNzZXJ0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50KSk7Ci1leHRlcm4gdm9pZCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIFBUUiB4bWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotZXh0ZXJuIFBUUiB4cmVhbGxvYyBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotZXh0ZXJuIHZvaWQgeGV4aXQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gY2hhciAqYnV5c3RyaW5nIFBBUkFNUyAoKENPTlNUIGNoYXIgKkNPTlNUKSk7Ci0KLSNkZWZpbmUgQVNTRVJUKHgpIFwKLWRvIHsgaWYgKCEoeCkpIGluZm9fYXNzZXJ0KF9fRklMRV9fLF9fTElORV9fKTsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBGQUlMKCkgXAotZG8geyBpbmZvX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0gd2hpbGUgKDApCi0KLWV4dGVybiB2b2lkIHByaW50X3NwYWNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHByaW50X25sIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBjaGFyICpkZW1hbmdsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZHZlci5jIGIvbGQvbGR2ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2MDBhMi4uMDAwMDAwMAotLS0gYS9sZC9sZHZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyogbGR2ZXIuYyAtLSBQcmludCBsaW5rZXIgdmVyc2lvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZHZlci5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotCi1jb25zdCBjaGFyICpsZF9wcm9ncmFtX3ZlcnNpb24gPSBWRVJTSU9OOwotCi12b2lkCi1sZHZlcnNpb24gKG5vaXN5KQotICAgICBpbnQgbm9pc3k7Ci17Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiR05VIGxkIHZlcnNpb24gJXMgKHdpdGggQkZEICVzKVxuIiksCi0JICAgbGRfcHJvZ3JhbV92ZXJzaW9uLCBCRkRfVkVSU0lPTik7Ci0KLSAgaWYgKG5vaXN5KSAKLSAgICB7Ci0gICAgICBsZF9lbXVsYXRpb25feGZlcl90eXBlICoqcHRyID0gbGRfZW11bGF0aW9uczsKLSAgICAKLSAgICAgIHByaW50ZiAoXygiICBTdXBwb3J0ZWQgZW11bGF0aW9uczpcbiIpKTsKLSAgICAgIHdoaWxlICgqcHRyKSAKLQl7Ci0JICBwcmludGYgKCIgICAlc1xuIiwgKCpwdHIpLT5lbXVsYXRpb25fbmFtZSk7Ci0JICBwdHIrKzsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvbGR2ZXIuaCBiL2xkL2xkdmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5N2I2YmMuLjAwMDAwMDAKLS0tIGEvbGQvbGR2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qIGxkdmVyLmggLS0gSGVhZGVyIGZpbGUgZm9yIGxkdmVyLmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpsZF9wcm9ncmFtX3ZlcnNpb247Ci0KLXZvaWQgbGR2ZXJzaW9uIFBBUkFNUyAoKGludCkpOwpkaWZmIC0tZ2l0IGEvbGQvbGR3cml0ZS5jIGIvbGQvbGR3cml0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTYxMTlhLi4wMDAwMDAwCi0tLSBhL2xkL2xkd3JpdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDUzMCArMCwwIEBACi0vKiBsZHdyaXRlLmMgLS0gd3JpdGUgb3V0IHRoZSBsaW5rZWQgZmlsZQotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc2FjQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZHdyaXRlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0KLXN0YXRpYyB2b2lkIGJ1aWxkX2xpbmtfb3JkZXIgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKmNsb25lX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGludCAqKSk7Ci1zdGF0aWMgdm9pZCBzcGxpdF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBCdWlsZCBsaW5rX29yZGVyIHN0cnVjdHVyZXMgZm9yIHRoZSBCRkQgbGlua2VyLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2xpbmtfb3JkZXIgKHN0YXRlbWVudCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqc3RhdGVtZW50OwotewotICBzd2l0Y2ggKHN0YXRlbWVudC0+aGVhZGVyLnR5cGUpCi0gICAgewotICAgIGNhc2UgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtOgotICAgICAgewotCWFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQlzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0JYmZkX3ZtYSB2YWx1ZTsKLQlib29sZWFuIGJpZ19lbmRpYW4gPSBmYWxzZTsKLQotCW91dHB1dF9zZWN0aW9uID0gc3RhdGVtZW50LT5kYXRhX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbjsKLQlBU1NFUlQgKG91dHB1dF9zZWN0aW9uLT5vd25lciA9PSBvdXRwdXRfYmZkKTsKLQotCWxpbmtfb3JkZXIgPSBiZmRfbmV3X2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uKTsKLQlpZiAobGlua19vcmRlciA9PSBOVUxMKQotCSAgZWluZm8gKF8oIiVQJUY6IGJmZF9uZXdfbGlua19vcmRlciBmYWlsZWRcbiIpKTsKLQotCWxpbmtfb3JkZXItPnR5cGUgPSBiZmRfZGF0YV9saW5rX29yZGVyOwotCWxpbmtfb3JkZXItPm9mZnNldCA9IHN0YXRlbWVudC0+ZGF0YV9zdGF0ZW1lbnQub3V0cHV0X3ZtYTsKLQlsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoUVVBRF9TSVpFKTsKLQotCXZhbHVlID0gc3RhdGVtZW50LT5kYXRhX3N0YXRlbWVudC52YWx1ZTsKLQotCS8qIElmIHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBvdXRwdXQgQkZEIGlzIG5vdCBrbm93biwgdGhlbiB3ZQotCSAgIGJhc2UgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIGRhdGEgb24gdGhlIGZpcnN0IGlucHV0IGZpbGUuCi0JICAgQnkgY29udmVudGlvbiwgdGhlIGJmZF9wdXQgcm91dGluZXMgZm9yIGFuIHVua25vd24KLQkgICBlbmRpYW5uZXNzIGFyZSBiaWcgZW5kaWFuLCBzbyB3ZSBtdXN0IHN3YXAgaGVyZSBpZiB0aGUKLQkgICBpbnB1dCBmaWxlIGlzIGxpdHRsZSBlbmRpYW4uICAqLwotCWlmIChiZmRfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkpCi0JICBiaWdfZW5kaWFuID0gdHJ1ZTsKLQllbHNlIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAob3V0cHV0X2JmZCkpCi0JICBiaWdfZW5kaWFuID0gZmFsc2U7Ci0JZWxzZQotCSAgewotCSAgICBib29sZWFuIHN3YXA7Ci0KLQkgICAgc3dhcCA9IGZhbHNlOwotCSAgICBpZiAoY29tbWFuZF9saW5lLmVuZGlhbiA9PSBFTkRJQU5fQklHKQotCSAgICAgIGJpZ19lbmRpYW4gPSB0cnVlOwotCSAgICBlbHNlIGlmIChjb21tYW5kX2xpbmUuZW5kaWFuID09IEVORElBTl9MSVRUTEUpCi0JICAgICAgewotCQliaWdfZW5kaWFuID0gZmFsc2U7Ci0JCXN3YXAgPSB0cnVlOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoY29tbWFuZF9saW5lLmVuZGlhbiA9PSBFTkRJQU5fVU5TRVQpCi0JICAgICAgewotCQliaWdfZW5kaWFuID0gdHJ1ZTsKLQkJewotCQkgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChzKQotCQkgICAgewotCQkgICAgICBpZiAocy0+dGhlX2JmZCAhPSBOVUxMKQotCQkJewotCQkJICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKHMtPnRoZV9iZmQpKQotCQkJICAgIHsKLQkJCSAgICAgIGJpZ19lbmRpYW4gPSBmYWxzZTsKLQkJCSAgICAgIHN3YXAgPSB0cnVlOwotCQkJICAgIH0KLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICB9Ci0KLQkgICAgaWYgKHN3YXApCi0JICAgICAgewotCQliZmRfYnl0ZSBidWZmZXJbOF07Ci0KLQkJc3dpdGNoIChzdGF0ZW1lbnQtPmRhdGFfc3RhdGVtZW50LnR5cGUpCi0JCSAgewotCQkgIGNhc2UgUVVBRDoKLQkJICBjYXNlIFNRVUFEOgotCQkgICAgaWYgKHNpemVvZiAoYmZkX3ZtYSkgPj0gUVVBRF9TSVpFKQotCQkgICAgICB7Ci0JCQliZmRfcHV0bDY0ICh2YWx1ZSwgYnVmZmVyKTsKLQkJCXZhbHVlID0gYmZkX2dldGI2NCAoYnVmZmVyKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCQkgIGNhc2UgTE9ORzoKLQkJICAgIGJmZF9wdXRsMzIgKHZhbHVlLCBidWZmZXIpOwotCQkgICAgdmFsdWUgPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBTSE9SVDoKLQkJICAgIGJmZF9wdXRsMTYgKHZhbHVlLCBidWZmZXIpOwotCQkgICAgdmFsdWUgPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBCWVRFOgotCQkgICAgYnJlYWs7Ci0JCSAgZGVmYXVsdDoKLQkJICAgIGFib3J0ICgpOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0KLQlBU1NFUlQgKG91dHB1dF9zZWN0aW9uLT5vd25lciA9PSBvdXRwdXRfYmZkKTsKLQlzd2l0Y2ggKHN0YXRlbWVudC0+ZGF0YV9zdGF0ZW1lbnQudHlwZSkKLQkgIHsKLQkgIGNhc2UgUVVBRDoKLQkgIGNhc2UgU1FVQUQ6Ci0JICAgIGlmIChzaXplb2YgKGJmZF92bWEpID49IFFVQURfU0laRSkKLQkgICAgICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCB2YWx1ZSwgbGlua19vcmRlci0+dS5kYXRhLmNvbnRlbnRzKTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYmZkX3ZtYSBoaWdoOwotCi0JCWlmIChzdGF0ZW1lbnQtPmRhdGFfc3RhdGVtZW50LnR5cGUgPT0gUVVBRCkKLQkJICBoaWdoID0gMDsKLQkJZWxzZSBpZiAoKHZhbHVlICYgMHg4MDAwMDAwMCkgPT0gMCkKLQkJICBoaWdoID0gMDsKLQkJZWxzZQotCQkgIGhpZ2ggPSAoYmZkX3ZtYSkgLTE7Ci0JCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGhpZ2gsCi0JCQkgICAgKGxpbmtfb3JkZXItPnUuZGF0YS5jb250ZW50cwotCQkJICAgICArIChiaWdfZW5kaWFuID8gMCA6IDQpKSk7Ci0JCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHZhbHVlLAotCQkJICAgIChsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMKLQkJCSAgICAgKyAoYmlnX2VuZGlhbiA/IDQgOiAwKSkpOwotCSAgICAgIH0KLQkgICAgbGlua19vcmRlci0+c2l6ZSA9IFFVQURfU0laRTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIExPTkc6Ci0JICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHZhbHVlLCBsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMpOwotCSAgICBsaW5rX29yZGVyLT5zaXplID0gTE9OR19TSVpFOwotCSAgICBicmVhazsKLQkgIGNhc2UgU0hPUlQ6Ci0JICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHZhbHVlLCBsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMpOwotCSAgICBsaW5rX29yZGVyLT5zaXplID0gU0hPUlRfU0laRTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIEJZVEU6Ci0JICAgIGJmZF9wdXRfOCAob3V0cHV0X2JmZCwgdmFsdWUsIGxpbmtfb3JkZXItPnUuZGF0YS5jb250ZW50cyk7Ci0JICAgIGxpbmtfb3JkZXItPnNpemUgPSBCWVRFX1NJWkU7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgYWJvcnQgKCk7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bToKLSAgICAgIHsKLQlsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlICpyczsKLQlhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0Jc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotCi0JcnMgPSAmc3RhdGVtZW50LT5yZWxvY19zdGF0ZW1lbnQ7Ci0KLQlvdXRwdXRfc2VjdGlvbiA9IHJzLT5vdXRwdXRfc2VjdGlvbjsKLQlBU1NFUlQgKG91dHB1dF9zZWN0aW9uLT5vd25lciA9PSBvdXRwdXRfYmZkKTsKLQotCWxpbmtfb3JkZXIgPSBiZmRfbmV3X2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uKTsKLQlpZiAobGlua19vcmRlciA9PSBOVUxMKQotCSAgZWluZm8gKF8oIiVQJUY6IGJmZF9uZXdfbGlua19vcmRlciBmYWlsZWRcbiIpKTsKLQotCWxpbmtfb3JkZXItPm9mZnNldCA9IHJzLT5vdXRwdXRfdm1hOwotCWxpbmtfb3JkZXItPnNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJzLT5ob3d0byk7Ci0KLQlsaW5rX29yZGVyLT51LnJlbG9jLnAgPQotCSAgKChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXJfcmVsb2MgKikKLQkgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfbGlua19vcmRlcl9yZWxvYykpKTsKLQotCWxpbmtfb3JkZXItPnUucmVsb2MucC0+cmVsb2MgPSBycy0+cmVsb2M7Ci0JbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQgPSBycy0+YWRkZW5kX3ZhbHVlOwotCi0JaWYgKHJzLT5uYW1lID09IE5VTEwpCi0JICB7Ci0JICAgIGxpbmtfb3JkZXItPnR5cGUgPSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyOwotCSAgICBpZiAocnMtPnNlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpCi0JICAgICAgbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb24gPSBycy0+c2VjdGlvbjsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb24gPSBycy0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JCWxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kICs9IHJzLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgICAgIH0KLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGxpbmtfb3JkZXItPnR5cGUgPSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXI7Ci0JICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lID0gcnMtPm5hbWU7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgbGFuZ19pbnB1dF9zZWN0aW9uX2VudW06Ci0gICAgICAvKiBDcmVhdGUgYSBuZXcgbGlua19vcmRlciBpbiB0aGUgb3V0cHV0IHNlY3Rpb24gd2l0aCB0aGlzCi0JIGF0dGFjaGVkICovCi0gICAgICBpZiAoc3RhdGVtZW50LT5pbnB1dF9zZWN0aW9uLmlmaWxlLT5qdXN0X3N5bXNfZmxhZyA9PSBmYWxzZSkKLQl7Ci0JICBhc2VjdGlvbiAqaSA9IHN0YXRlbWVudC0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uOwotCSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gaS0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgIEFTU0VSVCAob3V0cHV0X3NlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpOwotCi0JICBpZiAoKG91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0KLQkgICAgICBsaW5rX29yZGVyID0gYmZkX25ld19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBvdXRwdXRfc2VjdGlvbik7Ci0KLQkgICAgICBpZiAoaS0+ZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQkJewotCQkgIC8qIFdlJ3ZlIGdvdCBhIG5ldmVyIGxvYWQgc2VjdGlvbiBpbnNpZGUgb25lIHdoaWNoCi0JCSAgICAgaXMgZ29pbmcgdG8gYmUgb3V0cHV0LCB3ZSdsbCBjaGFuZ2UgaXQgaW50byBhCi0JCSAgICAgZmlsbCBsaW5rX29yZGVyICovCi0JCSAgbGlua19vcmRlci0+dHlwZSA9IGJmZF9maWxsX2xpbmtfb3JkZXI7Ci0JCSAgbGlua19vcmRlci0+dS5maWxsLnZhbHVlID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGxpbmtfb3JkZXItPnR5cGUgPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcjsKLQkJICBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24gPSBpOwotCQkgIEFTU0VSVCAoaS0+b3V0cHV0X3NlY3Rpb24gPT0gb3V0cHV0X3NlY3Rpb24pOwotCQl9Ci0JICAgICAgaWYgKGktPl9jb29rZWRfc2l6ZSkKLQkJbGlua19vcmRlci0+c2l6ZSA9IGktPl9jb29rZWRfc2l6ZTsKLQkgICAgICBlbHNlCi0JCWxpbmtfb3JkZXItPnNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGkpOwotCSAgICAgIGxpbmtfb3JkZXItPm9mZnNldCA9IGktPm91dHB1dF9vZmZzZXQ7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgotICAgICAgLyogTWFrZSBhIG5ldyBsaW5rX29yZGVyIHdpdGggdGhlIHJpZ2h0IGZpbGxlciAqLwotICAgICAgewotCWFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQlzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0KLQlvdXRwdXRfc2VjdGlvbiA9IHN0YXRlbWVudC0+cGFkZGluZ19zdGF0ZW1lbnQub3V0cHV0X3NlY3Rpb247Ci0JQVNTRVJUIChzdGF0ZW1lbnQtPnBhZGRpbmdfc3RhdGVtZW50Lm91dHB1dF9zZWN0aW9uLT5vd25lcgotCQk9PSBvdXRwdXRfYmZkKTsKLQlpZiAoKG91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JICB7Ci0JICAgIGxpbmtfb3JkZXIgPSBiZmRfbmV3X2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uKTsKLQkgICAgbGlua19vcmRlci0+dHlwZSA9IGJmZF9maWxsX2xpbmtfb3JkZXI7Ci0JICAgIGxpbmtfb3JkZXItPnNpemUgPSBzdGF0ZW1lbnQtPnBhZGRpbmdfc3RhdGVtZW50LnNpemU7Ci0JICAgIGxpbmtfb3JkZXItPm9mZnNldCA9IHN0YXRlbWVudC0+cGFkZGluZ19zdGF0ZW1lbnQub3V0cHV0X29mZnNldDsKLQkgICAgbGlua19vcmRlci0+dS5maWxsLnZhbHVlID0gc3RhdGVtZW50LT5wYWRkaW5nX3N0YXRlbWVudC5maWxsOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogQWxsIHRoZSBvdGhlciBvbmVzIGZhbGwgdGhyb3VnaCAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBDYWxsIEJGRCB0byB3cml0ZSBvdXQgdGhlIGxpbmtlZCBmaWxlLiAgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKiBXYW5kZXIgYXJvdW5kIHRoZSBpbnB1dCBzZWN0aW9ucywgbWFrZSBzdXJlIHRoYXQKLSAgIHdlJ2xsIG5ldmVyIHRyeSBhbmQgY3JlYXRlIGFuIG91dHB1dCBzZWN0aW9uIHdpdGggbW9yZSByZWxvY3MKLSAgIHRoYW4gd2lsbCBmaXQuLiBEbyB0aGlzIGJ5IGFsd2F5cyBhc3N1bWluZyB0aGUgd29yc3QgY2FzZSwgYW5kCi0gICBjcmVhdGluZyBuZXcgb3V0cHV0IHNlY3Rpb25zIHdpdGggYWxsIHRoZSByaWdodCBiaXRzICovCi0jZGVmaW5lIFRFU1RJVCAxCi1zdGF0aWMgYXNlY3Rpb24gKgotY2xvbmVfc2VjdGlvbiAoYWJmZCwgcywgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnM7Ci0gICAgIGludCAqY291bnQ7Ci17Ci0jZGVmaW5lIFNTSVpFIDgKLSAgY2hhciBzbmFtZVtTU0laRV07CQkvKiA/PyAgZmluZCB0aGUgbmFtZSBmb3IgdGhpcyBzaXplICovCi0gIGFzZWN0aW9uICpuOwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgLyogSW52ZW50IGEgc2VjdGlvbiBuYW1lIC0gdXNlIGZpcnN0IGZpdmUKLSAgICAgY2hhcnMgb2YgYmFzZSBzZWN0aW9uIG5hbWUgYW5kIGEgZGlnaXQgc3VmZml4ICovCi0gIGRvCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBjaGFyIGJbNl07Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChiKSAtIDEgJiYgcy0+bmFtZVtpXTsgaSsrKQotCWJbaV0gPSBzLT5uYW1lW2ldOwotICAgICAgYltpXSA9IDA7Ci0gICAgICBzcHJpbnRmIChzbmFtZSwgIiVzJWQiLCBiLCAoKmNvdW50KSsrKTsKLSAgICB9Ci0gIHdoaWxlIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc25hbWUpKTsKLQotICBuID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIHhzdHJkdXAgKHNuYW1lKSk7Ci0KLSAgLyogQ3JlYXRlIGEgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUgKi8KLQotICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLAotCQkJICAgIHNuYW1lLCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0gIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0gIGgtPnUuZGVmLnZhbHVlID0gMDsKLSAgaC0+dS5kZWYuc2VjdGlvbiA9IG4gICA7Ci0KLQotICBuLT5mbGFncyA9IHMtPmZsYWdzOwotICBuLT52bWEgPSBzLT52bWE7Ci0gIG4tPnVzZXJfc2V0X3ZtYSA9IHMtPnVzZXJfc2V0X3ZtYTsKLSAgbi0+bG1hID0gcy0+bG1hOwotICBuLT5fY29va2VkX3NpemUgPSAwOwotICBuLT5fcmF3X3NpemUgPSAwOwotICBuLT5vdXRwdXRfb2Zmc2V0ID0gcy0+b3V0cHV0X29mZnNldDsKLSAgbi0+b3V0cHV0X3NlY3Rpb24gPSBuOwotICBuLT5vcmVsb2NhdGlvbiA9IDA7Ci0gIG4tPnJlbG9jX2NvdW50ID0gMDsKLSAgbi0+YWxpZ25tZW50X3Bvd2VyID0gcy0+YWxpZ25tZW50X3Bvd2VyOwotICByZXR1cm4gbjsKLX0KLQotI2lmIFRFU1RJTkcKLXN0YXRpYyB2b2lkIAotZHMgKHMpCi0gICAgIGFzZWN0aW9uICpzOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmwgPSBzLT5saW5rX29yZGVyX2hlYWQ7Ci0gIHByaW50ZiAoInZtYSAleCBzaXplICV4XG4iLCBzLT52bWEsIHMtPl9yYXdfc2l6ZSk7Ci0gIHdoaWxlIChsKQotICAgIHsKLSAgICAgIGlmIChsLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCXsKLQkgIHByaW50ZiAoIiU4eCAlc1xuIiwgbC0+b2Zmc2V0LCBsLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyLT5maWxlbmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoXygiJTh4IHNvbWV0aGluZyBlbHNlXG4iKSwgbC0+b2Zmc2V0KTsKLQl9Ci0gICAgICBsID0gbC0+bmV4dDsKLSAgICB9Ci0gIHByaW50ZiAoIlxuIik7Ci19Ci1kdW1wIChzLCBhMSwgYTIpCi0gICAgIGNoYXIgKnM7Ci0gICAgIGFzZWN0aW9uICphMTsKLSAgICAgYXNlY3Rpb24gKmEyOwotewotICBwcmludGYgKCIlc1xuIiwgcyk7Ci0gIGRzIChhMSk7Ci0gIGRzIChhMik7Ci19Ci0KLXN0YXRpYyB2b2lkIAotc2FuaXR5X2NoZWNrIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICAgICAgYmZkX3ZtYSBwcmV2ID0gMDsKLSAgICAgIGZvciAocCA9IHMtPmxpbmtfb3JkZXJfaGVhZDsgcDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPm9mZnNldCA+IDEwMDAwMCkKLQkgICAgYWJvcnQgKCk7Ci0JICBpZiAocC0+b2Zmc2V0IDwgcHJldikKLQkgICAgYWJvcnQgKCk7Ci0JICBwcmV2ID0gcC0+b2Zmc2V0OwotCX0KLSAgICB9Ci19Ci0jZWxzZQotI2RlZmluZSBzYW5pdHlfY2hlY2soYSkKLSNkZWZpbmUgZHVtcChhLCBiLCBjKQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIAotc3BsaXRfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpvcmlnaW5hbF9zZWM7Ci0gIGludCBuc2VjcyA9IGFiZmQtPnNlY3Rpb25fY291bnQ7Ci0gIHNhbml0eV9jaGVjayAoYWJmZCk7Ci0gIC8qIGxvb2sgdGhyb3VnaCBhbGwgdGhlIG9yaWdpbmFsIHNlY3Rpb25zICovCi0gIGZvciAob3JpZ2luYWxfc2VjID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgb3JpZ2luYWxfc2VjICYmIG5zZWNzOwotICAgICAgIG9yaWdpbmFsX3NlYyA9IG9yaWdpbmFsX3NlYy0+bmV4dCwgbnNlY3MtLSkKLSAgICB7Ci0gICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICBpbnQgbGluZXMgPSAwOwotICAgICAgaW50IHJlbG9jcyA9IDA7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKipwcDsKLSAgICAgIGJmZF92bWEgdm1hID0gb3JpZ2luYWxfc2VjLT52bWE7Ci0gICAgICBiZmRfdm1hIHNoaWZ0X29mZnNldCA9IDA7Ci0gICAgICBhc2VjdGlvbiAqY3Vyc29yID0gb3JpZ2luYWxfc2VjOwotCi0gICAgICAvKiBjb3VudCB1cCB0aGUgcmVsb2NhdGlvbnMgYW5kIGxpbmUgZW50cmllcyB0byBzZWUgaWYKLQkgYW55dGhpbmcgd291bGQgYmUgdG9vIGJpZyB0byBmaXQgKi8KLSAgICAgIGZvciAocHAgPSAmKGN1cnNvci0+bGlua19vcmRlcl9oZWFkKTsgKnBwOyBwcCA9ICYoKCpwcCktPm5leHQpKQotCXsKLQkgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcCA9ICpwcDsKLQkgIGludCB0aGlzbGluZXMgPSAwOwotCSAgaW50IHRoaXNyZWxvY3MgPSAwOwotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0JICAgICAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX25vbmUKLQkJICB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lKQotCQl0aGlzbGluZXMgPSBzZWMtPmxpbmVub19jb3VudDsKLQotCSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JCXRoaXNyZWxvY3MgPSBzZWMtPnJlbG9jX2NvdW50OwotCi0JICAgIH0KLQkgIGVsc2UgaWYgKGluZm8tPnJlbG9jYXRlYWJsZQotCQkgICAmJiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgICAgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikpCi0JICAgIHRoaXNyZWxvY3MrKzsKLQotCSAgaWYgKCEgZmlyc3QKLQkgICAgICAmJiAodGhpc3JlbG9jcyArIHJlbG9jcyA+IGNvbmZpZy5zcGxpdF9ieV9yZWxvYwotCQkgIHx8IHRoaXNsaW5lcyArIGxpbmVzID4gY29uZmlnLnNwbGl0X2J5X3JlbG9jCi0JCSAgfHwgY29uZmlnLnNwbGl0X2J5X2ZpbGUpKQotCSAgICB7Ci0JICAgICAgLyogY3JlYXRlIGEgbmV3IHNlY3Rpb24gYW5kIHB1dCB0aGlzIGxpbmsgb3JkZXIgYW5kIHRoZQotCQkgZm9sbG93aW5nIGxpbmsgb3JkZXJzIGludG8gaXQgKi8KLQkgICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmwgPSBwOwotCSAgICAgIGFzZWN0aW9uICpuID0gY2xvbmVfc2VjdGlvbiAoYWJmZCwgY3Vyc29yLCAmY291bnQpOwotCSAgICAgICpwcCA9IE5VTEw7CS8qIFNuaXAgb2ZmIGxpbmsgb3JkZXJzIGZyb20gb2xkIHNlY3Rpb24gKi8KLQkgICAgICBuLT5saW5rX29yZGVyX2hlYWQgPSBsOwkvKiBhdHRhY2ggdG8gbmV3IHNlY3Rpb24gKi8KLQkgICAgICBwcCA9ICZuLT5saW5rX29yZGVyX2hlYWQ7Ci0KLQkgICAgICAvKiBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIG9yaWdpbmFsIHNlY3Rpb24gYW5kCi0JCSB1cGRhdGUgdGhlIHZtYSBvZiB0aGUgbmV3IG9uZSAqLwotCi0JICAgICAgZHVtcCAoImJlZm9yZSBzbmlwIiwgY3Vyc29yLCBuKTsKLQotCSAgICAgIG4tPl9yYXdfc2l6ZSA9IGN1cnNvci0+X3Jhd19zaXplIC0gbC0+b2Zmc2V0OwotCSAgICAgIGN1cnNvci0+X3Jhd19zaXplID0gbC0+b2Zmc2V0OwotCi0JICAgICAgdm1hICs9IGN1cnNvci0+X3Jhd19zaXplOwotCSAgICAgIG4tPmxtYSA9IG4tPnZtYSA9IHZtYTsKLQotCSAgICAgIHNoaWZ0X29mZnNldCA9IGwtPm9mZnNldDsKLQotCSAgICAgIC8qIHJ1biBkb3duIHRoZSBjaGFpbiBhbmQgY2hhbmdlIHRoZSBvdXRwdXQgc2VjdGlvbiB0bwotCQkgdGhlIHJpZ2h0IG9uZSwgdXBkYXRlIHRoZSBvZmZzZXRzIHRvbyAqLwotCi0JICAgICAgd2hpbGUgKGwpCi0JCXsKLQkJICBsLT5vZmZzZXQgLT0gc2hpZnRfb2Zmc2V0OwotCQkgIGlmIChsLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQkgICAgewotCQkgICAgICBsLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID0gbjsKLQkJICAgICAgbC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ID0gbC0+b2Zmc2V0OwotCQkgICAgfQotCQkgIGwgPSBsLT5uZXh0OwotCQl9Ci0JICAgICAgZHVtcCAoImFmdGVyIHNuaXAiLCBjdXJzb3IsIG4pOwotCSAgICAgIGN1cnNvciA9IG47Ci0JICAgICAgcmVsb2NzID0gdGhpc3JlbG9jczsKLQkgICAgICBsaW5lcyA9IHRoaXNsaW5lczsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVsb2NzICs9IHRoaXNyZWxvY3M7Ci0JICAgICAgbGluZXMgKz0gdGhpc2xpbmVzOwotCSAgICB9Ci0KLQkgIGZpcnN0ID0gZmFsc2U7Ci0JfQotICAgIH0KLSAgc2FuaXR5X2NoZWNrIChhYmZkKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotbGR3cml0ZSAoKQotewotICAvKiBSZXNldCBlcnJvciBpbmRpY2F0b3IsIHdoaWNoIGNhbiB0eXBpY2FsbHkgc29tZXRoaW5nIGxpa2UgaW52YWxpZAotICAgICBmb3JtYXQgZnJvbSBvcGVubmluZyB1cCB0aGUgLm8gZmlsZXMgKi8KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGJ1aWxkX2xpbmtfb3JkZXIpOwotCi0gIGlmIChjb25maWcuc3BsaXRfYnlfcmVsb2MgfHwgY29uZmlnLnNwbGl0X2J5X2ZpbGUpCi0gICAgc3BsaXRfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOwotICBpZiAoIWJmZF9maW5hbF9saW5rIChvdXRwdXRfYmZkLCAmbGlua19pbmZvKSkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVjb3JkZWQsIHByaW50IGl0IG91dC4gIE90aGVyd2lzZSBhc3N1bWUKLQkgYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSBsaWtlIHVua25vd24gc3ltYm9sIHdhcyBwcmludGVkCi0JIG91dC4gICovCi0KLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19lcnJvcikKLQllaW5mbyAoXygiJUYlUDogZmluYWwgbGluayBmYWlsZWQ6ICVFXG4iKSwgb3V0cHV0X2JmZCk7Ci0gICAgICBlbHNlCi0JeGV4aXQoMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvbGR3cml0ZS5oIGIvbGQvbGR3cml0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGQ4YjUyLi4wMDAwMDAwCi0tLSBhL2xkL2xkd3JpdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qIGxkd3JpdGUuaCAtCi0gICBDb3B5cmlnaHQgMTk5MSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi12b2lkIGxkd3JpdGUgUEFSQU1TICgodm9pZCkpOwpkaWZmIC0tZ2l0IGEvbGQvbGV4c3VwLmMgYi9sZC9sZXhzdXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlNTA4Ny4uMDAwMDAwMAotLS0gYS9sZC9sZXhzdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDExNDAgKzAsMCBAQAotLyogUGFyc2Ugb3B0aW9ucyBmb3IgdGhlIEdOVSBsaW5rZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGR2ZXIuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLQotI2lmbmRlZiBQQVRIX1NFUEFSQVRPUgotI2lmIGRlZmluZWQgKF9fTVNET1NfXykgfHwgKGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTjMyX18pKQotI2RlZmluZSBQQVRIX1NFUEFSQVRPUiAnOycKLSNlbHNlCi0jZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc6JwotI2VuZGlmCi0jZW5kaWYKLQotLyogU29tZXdoZXJlIGFib3ZlLCBzeXMvc3RhdC5oIGdvdCBpbmNsdWRlZCAuIC4gLiAuICovCi0jaWYgIWRlZmluZWQoU19JU0RJUikgJiYgZGVmaW5lZChTX0lGRElSKQotI2RlZmluZQlTX0lTRElSKG0pICgoKG0pICYgU19JRk1UKSA9PSBTX0lGRElSKQotI2VuZGlmCi0KLS8qIE9taXQgYXJncyB0byBhdm9pZCB0aGUgcG9zc2liaWxpdHkgb2YgY2xhc2hpbmcgd2l0aCBhIHN5c3RlbSBoZWFkZXIKLSAgIHRoYXQgbWlnaHQgZGlzYWdyZWUgYWJvdXQgY29uc3RzLiAgKi8KLXVuc2lnbmVkIGxvbmcgc3RydG91bCAoKTsKLQotc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfZGlybGlzdCBQQVJBTVMgKChjaGFyICpkaXJsaXN0X3B0cikpOwotc3RhdGljIHZvaWQgc2V0X3NlY3Rpb25fc3RhcnQgUEFSQU1TICgoY2hhciAqc2VjdCwgY2hhciAqdmFsc3RyKSk7Ci1zdGF0aWMgdm9pZCBoZWxwIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogTm9uLXplcm8gaWYgd2UgYXJlIHByb2Nlc3NpbmcgYSAtLWRlZnN5bSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuICAqLwotaW50IHBhcnNpbmdfZGVmc3ltID0gMDsKLQotLyogQ29kZXMgdXNlZCBmb3IgdGhlIGxvbmcgb3B0aW9ucyB3aXRoIG5vIHNob3J0IHN5bm9ueW1zLiAgMTUwIGlzbid0Ci0gICBzcGVjaWFsOyBpdCdzIGp1c3QgYW4gYXJiaXRyYXJ5IG5vbi1BU0NJSSBjaGFyIHZhbHVlLiAgKi8KLQotI2RlZmluZSBPUFRJT05fQVNTRVJUCQkJMTUwCi0jZGVmaW5lIE9QVElPTl9DQUxMX1NIQVJFRAkJKE9QVElPTl9BU1NFUlQgKyAxKQotI2RlZmluZSBPUFRJT05fQ1JFRgkJCShPUFRJT05fQ0FMTF9TSEFSRUQgKyAxKQotI2RlZmluZSBPUFRJT05fREVGU1lNCQkJKE9QVElPTl9DUkVGICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RFTUFOR0xFCQkJKE9QVElPTl9ERUZTWU0gKyAxKQotI2RlZmluZSBPUFRJT05fRFlOQU1JQ19MSU5LRVIJCShPUFRJT05fREVNQU5HTEUgKyAxKQotI2RlZmluZSBPUFRJT05fRUIJCQkoT1BUSU9OX0RZTkFNSUNfTElOS0VSICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VMCQkJKE9QVElPTl9FQiArIDEpCi0jZGVmaW5lIE9QVElPTl9FTUJFRERFRF9SRUxPQ1MJCShPUFRJT05fRUwgKyAxKQotI2RlZmluZSBPUFRJT05fRVhQT1JUX0RZTkFNSUMJCShPUFRJT05fRU1CRURERURfUkVMT0NTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0hFTFAJCQkoT1BUSU9OX0VYUE9SVF9EWU5BTUlDICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lHTk9SRQkJCShPUFRJT05fSEVMUCArIDEpCi0jZGVmaW5lIE9QVElPTl9NQVAJCQkoT1BUSU9OX0lHTk9SRSArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19ERU1BTkdMRQkJKE9QVElPTl9NQVAgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fS0VFUF9NRU1PUlkJCShPUFRJT05fTk9fREVNQU5HTEUgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fV0FSTl9NSVNNQVRDSAkJKE9QVElPTl9OT19LRUVQX01FTU9SWSArIDEpCi0jZGVmaW5lIE9QVElPTl9OT0lOSElCSVRfRVhFQwkJKE9QVElPTl9OT19XQVJOX01JU01BVENIICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PTl9TSEFSRUQJCShPUFRJT05fTk9JTkhJQklUX0VYRUMgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fV0hPTEVfQVJDSElWRQkJKE9QVElPTl9OT05fU0hBUkVEICsgMSkKLSNkZWZpbmUgT1BUSU9OX09GT1JNQVQJCQkoT1BUSU9OX05PX1dIT0xFX0FSQ0hJVkUgKyAxKQotI2RlZmluZSBPUFRJT05fUkVMQVgJCQkoT1BUSU9OX09GT1JNQVQgKyAxKQotI2RlZmluZSBPUFRJT05fUkVUQUlOX1NZTUJPTFNfRklMRQkoT1BUSU9OX1JFTEFYICsgMSkKLSNkZWZpbmUgT1BUSU9OX1JQQVRICQkJKE9QVElPTl9SRVRBSU5fU1lNQk9MU19GSUxFICsgMSkKLSNkZWZpbmUgT1BUSU9OX1JQQVRIX0xJTksJCShPUFRJT05fUlBBVEggKyAxKQotI2RlZmluZSBPUFRJT05fU0hBUkVECQkJKE9QVElPTl9SUEFUSF9MSU5LICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NPTkFNRQkJCShPUFRJT05fU0hBUkVEICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NPUlRfQ09NTU9OCQkoT1BUSU9OX1NPTkFNRSArIDEpCi0jZGVmaW5lIE9QVElPTl9TVEFUUwkJCShPUFRJT05fU09SVF9DT01NT04gKyAxKQotI2RlZmluZSBPUFRJT05fU1lNQk9MSUMJCQkoT1BUSU9OX1NUQVRTICsgMSkKLSNkZWZpbmUgT1BUSU9OX1RBU0tfTElOSwkJKE9QVElPTl9TWU1CT0xJQyArIDEpCi0jZGVmaW5lIE9QVElPTl9UQlNTCQkJKE9QVElPTl9UQVNLX0xJTksgKyAxKQotI2RlZmluZSBPUFRJT05fVERBVEEJCQkoT1BUSU9OX1RCU1MgKyAxKQotI2RlZmluZSBPUFRJT05fVFRFWFQJCQkoT1BUSU9OX1REQVRBICsgMSkKLSNkZWZpbmUgT1BUSU9OX1RSQURJVElPTkFMX0ZPUk1BVAkoT1BUSU9OX1RURVhUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1VSCQkJKE9QVElPTl9UUkFESVRJT05BTF9GT1JNQVQgKyAxKQotI2RlZmluZSBPUFRJT05fVkVSQk9TRQkJCShPUFRJT05fVVIgKyAxKQotI2RlZmluZSBPUFRJT05fVkVSU0lPTgkJCShPUFRJT05fVkVSQk9TRSArIDEpCi0jZGVmaW5lIE9QVElPTl9WRVJTSU9OX1NDUklQVAkJKE9QVElPTl9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX1ZFUlNJT05fRVhQT1JUU19TRUNUSU9OCShPUFRJT05fVkVSU0lPTl9TQ1JJUFQgKyAxKQotI2RlZmluZSBPUFRJT05fV0FSTl9DT01NT04JCShPUFRJT05fVkVSU0lPTl9FWFBPUlRTX1NFQ1RJT04gKyAxKQotI2RlZmluZSBPUFRJT05fV0FSTl9DT05TVFJVQ1RPUlMJKE9QVElPTl9XQVJOX0NPTU1PTiArIDEpCi0jZGVmaW5lIE9QVElPTl9XQVJOX01VTFRJUExFX0dQCQkoT1BUSU9OX1dBUk5fQ09OU1RSVUNUT1JTICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dBUk5fT05DRQkJKE9QVElPTl9XQVJOX01VTFRJUExFX0dQICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dBUk5fU0VDVElPTl9BTElHTgkoT1BUSU9OX1dBUk5fT05DRSArIDEpCi0jZGVmaW5lIE9QVElPTl9TUExJVF9CWV9SRUxPQwkJKE9QVElPTl9XQVJOX1NFQ1RJT05fQUxJR04gKyAxKQotI2RlZmluZSBPUFRJT05fU1BMSVRfQllfRklMRSAJICAgIAkoT1BUSU9OX1NQTElUX0JZX1JFTE9DICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dIT0xFX0FSQ0hJVkUJCShPUFRJT05fU1BMSVRfQllfRklMRSArIDEpCi0jZGVmaW5lIE9QVElPTl9XUkFQCQkJKE9QVElPTl9XSE9MRV9BUkNISVZFICsgMSkKLSNkZWZpbmUgT1BUSU9OX0ZPUkNFX0VYRV9TVUZGSVgJCShPUFRJT05fV1JBUCArIDEpCi0jZGVmaW5lIE9QVElPTl9HQ19TRUNUSU9OUwkJKE9QVElPTl9GT1JDRV9FWEVfU1VGRklYICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX0dDX1NFQ1RJT05TCQkoT1BUSU9OX0dDX1NFQ1RJT05TICsgMSkKLSNkZWZpbmUgT1BUSU9OX0NIRUNLX1NFQ1RJT05TCQkoT1BUSU9OX05PX0dDX1NFQ1RJT05TICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX0NIRUNLX1NFQ1RJT05TCShPUFRJT05fQ0hFQ0tfU0VDVElPTlMgKyAxKQotI2RlZmluZSBPUFRJT05fTVBDODYwQzAgICAgICAgICAgICAgICAgIChPUFRJT05fTk9fQ0hFQ0tfU0VDVElPTlMgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fVU5ERUZJTkVECQkoT1BUSU9OX01QQzg2MEMwICsgMSkKLQotLyogVGhlIGxvbmcgb3B0aW9ucy4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGJvdGggdGhlIG9wdGlvbgotICAgcGFyc2luZyBhbmQgdGhlIGhlbHAgdGV4dC4gICovCi0KLXN0cnVjdCBsZF9vcHRpb24KLXsKLSAgLyogVGhlIGxvbmcgb3B0aW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IG9wdGlvbiBvcHQ7Ci0gIC8qIFRoZSBzaG9ydCBvcHRpb24gd2l0aCB0aGUgc2FtZSBtZWFuaW5nICgnXDAnIGlmIG5vbmUpLiAgKi8KLSAgY2hhciBzaG9ydG9wdDsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IChOVUxMIGlmIG5vbmUpLiAgKi8KLSAgY29uc3QgY2hhciAqYXJnOwotICAvKiBUaGUgZG9jdW1lbnRhdGlvbiBzdHJpbmcuICBJZiB0aGlzIGlzIE5VTEwsIHRoaXMgaXMgYSBzeW5vbnltIGZvcgotICAgICB0aGUgcHJldmlvdXMgb3B0aW9uLiAgKi8KLSAgY29uc3QgY2hhciAqZG9jOwotICBlbnVtCi0gICAgewotICAgICAgLyogVXNlIG9uZSBkYXNoIGJlZm9yZSBsb25nIG9wdGlvbiBuYW1lLiAgKi8KLSAgICAgIE9ORV9EQVNILAotICAgICAgLyogVXNlIHR3byBkYXNoZXMgYmVmb3JlIGxvbmcgb3B0aW9uIG5hbWUuICAqLwotICAgICAgVFdPX0RBU0hFUywKLSAgICAgIC8qIERvbid0IG1lbnRpb24gdGhpcyBvcHRpb24gaW4gLS1oZWxwIG91dHB1dC4gICovCi0gICAgICBOT19IRUxQCi0gICAgfSBjb250cm9sOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBsZF9vcHRpb24gbGRfb3B0aW9uc1tdID0KLXsKLSAgeyB7TlVMTCwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdcMCd9LAotICAgICAgJ2EnLCBOXygiS0VZV09SRCIpLCBOXygiU2hhcmVkIGxpYnJhcnkgY29udHJvbCBmb3IgSFAvVVggY29tcGF0aWJpbGl0eSIpLAotICAgICAgT05FX0RBU0ggfSwKLSAgeyB7ImFyY2hpdGVjdHVyZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnQSd9LAotICAgICAgJ0EnLCBOXygiQVJDSCIpLCBOXygiU2V0IGFyY2hpdGVjdHVyZSIpICwgVFdPX0RBU0hFUyB9LAotICB7IHsiZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdiJ30sCi0gICAgICAnYicsIE5fKCJUQVJHRVQiKSwgTl8oIlNwZWNpZnkgdGFyZ2V0IGZvciBmb2xsb3dpbmcgaW5wdXQgZmlsZXMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibXJpLXNjcmlwdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnYyd9LAotICAgICAgJ2MnLCBOXygiRklMRSIpLCBOXygiUmVhZCBNUkkgZm9ybWF0IGxpbmtlciBzY3JpcHQiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiZGMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2QnfSwKLSAgICAgICdkJywgTlVMTCwgTl8oIkZvcmNlIGNvbW1vbiBzeW1ib2xzIHRvIGJlIGRlZmluZWQiKSwgT05FX0RBU0ggfSwKLSAgeyB7ImRwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdkJ30sCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLCBPTkVfREFTSCB9LAotICB7IHsiZW50cnkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2UnfSwKLSAgICAgICdlJywgTl8oIkFERFJFU1MiKSwgTl8oIlNldCBzdGFydCBhZGRyZXNzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImV4cG9ydC1keW5hbWljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlRfRFlOQU1JQ30sCi0gICAgICAnRScsIE5VTEwsIE5fKCJFeHBvcnQgYWxsIGR5bmFtaWMgc3ltYm9scyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJFQiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRUJ9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkxpbmsgYmlnLWVuZGlhbiBvYmplY3RzIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJFTCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRUx9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkxpbmsgbGl0dGxlLWVuZGlhbiBvYmplY3RzIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJhdXhpbGlhcnkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2YnfSwKLSAgICAgICdmJywgTl8oIlNITElCIiksIE5fKCJBdXhpbGlhcnkgZmlsdGVyIGZvciBzaGFyZWQgb2JqZWN0IHN5bWJvbCB0YWJsZSIpLAotICAgICAgVFdPX0RBU0hFUyB9LAotICB7IHsiZmlsdGVyIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdGJ30sCi0gICAgICAnRicsIE5fKCJTSExJQiIpLCBOXygiRmlsdGVyIGZvciBzaGFyZWQgb2JqZWN0IHN5bWJvbCB0YWJsZSIpLCBUV09fREFTSEVTIH0sCi0gIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdnJywgTlVMTCwgTl8oIklnbm9yZWQiKSwgT05FX0RBU0ggfSwKLSAgeyB7Imdwc2l6ZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnRyd9LAotICAgICAgJ0cnLCBOXygiU0laRSIpLCBOXygiU21hbGwgZGF0YSBzaXplIChpZiBubyBzaXplLCBzYW1lIGFzIC0tc2hhcmVkKSIpLAotICAgICAgVFdPX0RBU0hFUyB9LAotICB7IHsic29uYW1lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TT05BTUV9LAotICAgICAgJ2gnLCBOXygiRklMRU5BTUUiKSwgTl8oIlNldCBpbnRlcm5hbCBuYW1lIG9mIHNoYXJlZCBsaWJyYXJ5IiksIE9ORV9EQVNIIH0sCi0gIHsgeyJsaWJyYXJ5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdsJ30sCi0gICAgICAnbCcsIE5fKCJMSUJOQU1FIiksIE5fKCJTZWFyY2ggZm9yIGxpYnJhcnkgTElCTkFNRSIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJsaWJyYXJ5LXBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0wnfSwKLSAgICAgICdMJywgTl8oIkRJUkVDVE9SWSIpLCBOXygiQWRkIERJUkVDVE9SWSB0byBsaWJyYXJ5IHNlYXJjaCBwYXRoIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7TlVMTCwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdcMCd9LAotICAgICAgJ20nLCBOXygiRU1VTEFUSU9OIiksIE5fKCJTZXQgZW11bGF0aW9uIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJwcmludC1tYXAiLCBub19hcmd1bWVudCwgTlVMTCwgJ00nfSwKLSAgICAgICdNJywgTlVMTCwgTl8oIlByaW50IG1hcCBmaWxlIG9uIHN0YW5kYXJkIG91dHB1dCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJubWFnaWMiLCBub19hcmd1bWVudCwgTlVMTCwgJ24nfSwKLSAgICAgICduJywgTlVMTCwgTl8oIkRvIG5vdCBwYWdlIGFsaWduIGRhdGEiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsib21hZ2ljIiwgbm9fYXJndW1lbnQsIE5VTEwsICdOJ30sCi0gICAgICAnTicsIE5VTEwsIE5fKCJEbyBub3QgcGFnZSBhbGlnbiBkYXRhLCBkbyBub3QgbWFrZSB0ZXh0IHJlYWRvbmx5IiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJvdXRwdXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ28nfSwKLSAgICAgICdvJywgTl8oIkZJTEUiKSwgTl8oIlNldCBvdXRwdXQgZmlsZSBuYW1lIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7TlVMTCwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdcMCd9LAotICAgICAgJ08nLCBOVUxMLCBOXygiT3B0aW1pemUgb3V0cHV0IGZpbGUiKSwgT05FX0RBU0ggfSwKLSAgeyB7IlF5Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIklnbm9yZWQgZm9yIFNWUjQgY29tcGF0aWJpbGl0eSIpLCBPTkVfREFTSCB9LAotICB7IHsicmVsb2NhdGVhYmxlIiwgbm9fYXJndW1lbnQsIE5VTEwsICdyJ30sCi0gICAgICAncicsIE5VTEwsIE5fKCJHZW5lcmF0ZSByZWxvY2F0ZWFibGUgb3V0cHV0IiksIFRXT19EQVNIRVMgfSwKLSAgeyB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsICdcMCd9LAotICAgICAgJ2knLCBOVUxMLCBOVUxMLCBPTkVfREFTSCB9LAotICB7IHsianVzdC1zeW1ib2xzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdSJ30sCi0gICAgICAnUicsIE5fKCJGSUxFIiksIE5fKCJKdXN0IGxpbmsgc3ltYm9scyAoaWYgZGlyZWN0b3J5LCBzYW1lIGFzIC0tcnBhdGgpIiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJzdHJpcC1hbGwiLCBub19hcmd1bWVudCwgTlVMTCwgJ3MnfSwKLSAgICAgICdzJywgTlVMTCwgTl8oIlN0cmlwIGFsbCBzeW1ib2xzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InN0cmlwLWRlYnVnIiwgbm9fYXJndW1lbnQsIE5VTEwsICdTJ30sCi0gICAgICAnUycsIE5VTEwsIE5fKCJTdHJpcCBkZWJ1Z2dpbmcgc3ltYm9scyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ0cmFjZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndCd9LAotICAgICAgJ3QnLCBOVUxMLCBOXygiVHJhY2UgZmlsZSBvcGVucyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJzY3JpcHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1QnfSwKLSAgICAgICdUJywgTl8oIkZJTEUiKSwgTl8oIlJlYWQgbGlua2VyIHNjcmlwdCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ1bmRlZmluZWQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3UnfSwKLSAgICAgICd1JywgTl8oIlNZTUJPTCIpLCBOXygiU3RhcnQgd2l0aCB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIFNZTUJPTCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJVciIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVVJ9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkJ1aWxkIGdsb2JhbCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHRhYmxlcyIpLCBPTkVfREFTSCB9LAotICB7IHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVkVSU0lPTn0sCi0gICAgICAndicsIE5VTEwsIE5fKCJQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsICdcMCd9LAotICAgICAgJ1YnLCBOVUxMLCBOXygiUHJpbnQgdmVyc2lvbiBhbmQgZW11bGF0aW9uIGluZm9ybWF0aW9uIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJkaXNjYXJkLWFsbCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAneCd9LAotICAgICAgJ3gnLCBOVUxMLCBOXygiRGlzY2FyZCBhbGwgbG9jYWwgc3ltYm9scyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJkaXNjYXJkLWxvY2FscyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnWCd9LAotICAgICAgJ1gnLCBOVUxMLCBOXygiRGlzY2FyZCB0ZW1wb3JhcnkgbG9jYWwgc3ltYm9scyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ0cmFjZS1zeW1ib2wiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3knfSwKLSAgICAgICd5JywgTl8oIlNZTUJPTCIpLCBOXygiVHJhY2UgbWVudGlvbnMgb2YgU1lNQk9MIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7TlVMTCwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdcMCd9LAotICAgICAgJ1knLCBOXygiUEFUSCIpLCBOXygiRGVmYXVsdCBzZWFyY2ggcGF0aCBmb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5IiksIE9ORV9EQVNIIH0sCi0gIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICd6JywgTl8oIktFWVdPUkQiKSwgTl8oIklnbm9yZWQgZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eSIpLCBPTkVfREFTSCB9LAotICB7IHsic3RhcnQtZ3JvdXAiLCBub19hcmd1bWVudCwgTlVMTCwgJygnfSwKLSAgICAgICcoJywgTlVMTCwgTl8oIlN0YXJ0IGEgZ3JvdXAiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiZW5kLWdyb3VwIiwgbm9fYXJndW1lbnQsIE5VTEwsICcpJ30sCi0gICAgICAnKScsIE5VTEwsIE5fKCJFbmQgYSBncm91cCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJhc3NlcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FTU0VSVH0sCi0gICAgICAnXDAnLCBOXygiS0VZV09SRCIpLCBOXygiSWdub3JlZCBmb3IgU3VuT1MgY29tcGF0aWJpbGl0eSIpLCBPTkVfREFTSCB9LAotICB7IHsiQmR5bmFtaWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NBTExfU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJMaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcyIpLCBPTkVfREFTSCB9LAotICB7IHsiZHkiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NBTExfU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCi0gIHsgeyJjYWxsX3NoYXJlZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQ0FMTF9TSEFSRUR9LAotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKLSAgeyB7IkJzdGF0aWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PTl9TSEFSRUR9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkRvIG5vdCBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcyIpLCBPTkVfREFTSCB9LAotICB7IHsiZG4iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PTl9TSEFSRUR9LAotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKLSAgeyB7Im5vbl9zaGFyZWQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PTl9TSEFSRUR9LAotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKLSAgeyB7InN0YXRpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9OX1NIQVJFRH0sCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLCBPTkVfREFTSCB9LAotICB7IHsiQnN5bWJvbGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TWU1CT0xJQ30sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiQmluZCBnbG9iYWwgcmVmZXJlbmNlcyBsb2NhbGx5IiksIE9ORV9EQVNIIH0sCi0gIHsgeyJjaGVjay1zZWN0aW9ucyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQ0hFQ0tfU0VDVElPTlN9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzIGZvciBvdmVybGFwcyAoZGVmYXVsdCkiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibm8tY2hlY2stc2VjdGlvbnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0NIRUNLX1NFQ1RJT05TfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJEbyBub3QgY2hlY2sgc2VjdGlvbiBhZGRyZXNzZXMgZm9yIG92ZXJsYXBzIiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJjcmVmIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DUkVGfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJPdXRwdXQgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImRlZnN5bSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fREVGU1lNfSwKLSAgICAgICdcMCcsIE5fKCJTWU1CT0w9RVhQUkVTU0lPTiIpLCBOXygiRGVmaW5lIGEgc3ltYm9sIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImRlbWFuZ2xlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ERU1BTkdMRX0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiRGVtYW5nbGUgc3ltYm9sIG5hbWVzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImR5bmFtaWMtbGlua2VyIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9EWU5BTUlDX0xJTktFUn0sCi0gICAgICAnXDAnLCBOXygiUFJPR1JBTSIpLCBOXygiU2V0IHRoZSBkeW5hbWljIGxpbmtlciB0byB1c2UiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiZW1iZWRkZWQtcmVsb2NzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTUJFRERFRF9SRUxPQ1N9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkdlbmVyYXRlIGVtYmVkZGVkIHJlbG9jcyIpLCBUV09fREFTSEVTfSwKLSAgeyB7ImZvcmNlLWV4ZS1zdWZmaXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0ZPUkNFX0VYRV9TVUZGSVh9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkZvcmNlIGdlbmVyYXRpb24gb2YgZmlsZSB3aXRoIC5leGUgc3VmZml4IiksIFRXT19EQVNIRVN9LAotICB7IHsiZ2Mtc2VjdGlvbnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0dDX1NFQ1RJT05TfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJSZW1vdmUgdW51c2VkIHNlY3Rpb25zIChvbiBzb21lIHRhcmdldHMpIiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJuby1nYy1zZWN0aW9ucyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fR0NfU0VDVElPTlN9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkRvbid0IHJlbW92ZSB1bnVzZWQgc2VjdGlvbnMgKGRlZmF1bHQpIiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IRUxQfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJQcmludCBvcHRpb24gaGVscCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJNYXAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BUH0sCi0gICAgICAnXDAnLCBOXygiRklMRSIpLCBOXygiV3JpdGUgYSBtYXAgZmlsZSIpLCBPTkVfREFTSCB9LAotICB7IHsibm8tZGVtYW5nbGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0RFTUFOR0xFIH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiRG8gbm90IGRlbWFuZ2xlIHN5bWJvbCBuYW1lcyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJuby1rZWVwLW1lbW9yeSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fS0VFUF9NRU1PUll9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlVzZSBsZXNzIG1lbW9yeSBhbmQgbW9yZSBkaXNrIEkvTyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJuby11bmRlZmluZWQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX1VOREVGSU5FRH0sCi0gICAgICdcMCcsIE5VTEwsIE5fKCJBbGxvdyBubyB1bmRlZmluZWQgc3ltYm9scyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJuby13YXJuLW1pc21hdGNoIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19XQVJOX01JU01BVENIfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJEb24ndCB3YXJuIGFib3V0IG1pc21hdGNoZWQgaW5wdXQgZmlsZXMiKSwgVFdPX0RBU0hFU30sCi0gIHsgeyJuby13aG9sZS1hcmNoaXZlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19XSE9MRV9BUkNISVZFfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJUdXJuIG9mZiAtLXdob2xlLWFyY2hpdmUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibm9pbmhpYml0LWV4ZWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PSU5ISUJJVF9FWEVDfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJDcmVhdGUgYW4gb3V0cHV0IGZpbGUgZXZlbiBpZiBlcnJvcnMgb2NjdXIiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibm9pbmhpYml0X2V4ZWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PSU5ISUJJVF9FWEVDfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE5PX0hFTFAgfSwKLSAgeyB7Im9mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX09GT1JNQVR9LAotICAgICAgJ1wwJywgTl8oIlRBUkdFVCIpLCBOXygiU3BlY2lmeSB0YXJnZXQgb2Ygb3V0cHV0IGZpbGUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsicW1hZ2ljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIklnbm9yZWQgZm9yIExpbnV4IGNvbXBhdGliaWxpdHkiKSwgT05FX0RBU0ggfSwKLSAgeyB7InJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SRUxBWH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiUmVsYXggYnJhbmNoZXMgb24gY2VydGFpbiB0YXJnZXRzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InJldGFpbi1zeW1ib2xzLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwKLSAgICAgICBPUFRJT05fUkVUQUlOX1NZTUJPTFNfRklMRX0sCi0gICAgICAnXDAnLCBOXygiRklMRSIpLCBOXygiS2VlcCBvbmx5IHN5bWJvbHMgbGlzdGVkIGluIEZJTEUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsicnBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JQQVRIfSwKLSAgICAgICdcMCcsIE5fKCJQQVRIIiksIE5fKCJTZXQgcnVudGltZSBzaGFyZWQgbGlicmFyeSBzZWFyY2ggcGF0aCIpLCBPTkVfREFTSCB9LAotICB7IHsicnBhdGgtbGluayIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUlBBVEhfTElOS30sCi0gICAgICAnXDAnLCBOXygiUEFUSCIpLCBOXygiU2V0IGxpbmsgdGltZSBzaGFyZWQgbGlicmFyeSBzZWFyY2ggcGF0aCIpLCBPTkVfREFTSCB9LAotICB7IHsic2hhcmVkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TSEFSRUR9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IiksIE9ORV9EQVNIIH0sCi0gIHsgeyJCc2hhcmVhYmxlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TSEFSRUQgfSwgLyogRnJlZUJTRC4gICovCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLCBPTkVfREFTSCB9LAotICB7IHsic29ydC1jb21tb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NPUlRfQ09NTU9OfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJTb3J0IGNvbW1vbiBzeW1ib2xzIGJ5IHNpemUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsic29ydF9jb21tb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NPUlRfQ09NTU9OfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE5PX0hFTFAgfSwKLSAgeyB7InNwbGl0LWJ5LWZpbGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NQTElUX0JZX0ZJTEV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlNwbGl0IG91dHB1dCBzZWN0aW9ucyBmb3IgZWFjaCBmaWxlIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InNwbGl0LWJ5LXJlbG9jIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TUExJVF9CWV9SRUxPQ30sCi0gICAgICAnXDAnLCBOXygiQ09VTlQiKSwgTl8oIlNwbGl0IG91dHB1dCBzZWN0aW9ucyBldmVyeSBDT1VOVCByZWxvY3MiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsic3RhdHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NUQVRTfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJQcmludCBtZW1vcnkgdXNhZ2Ugc3RhdGlzdGljcyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ0YXNrLWxpbmsiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RBU0tfTElOS30sCi0gICAgICAnXDAnLCBOXygiU1lNQk9MIiksIE5fKCJEbyB0YXNrIGxldmVsIGxpbmtpbmciKSwgVFdPX0RBU0hFUyB9LAotICB7IHsidHJhZGl0aW9uYWwtZm9ybWF0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFESVRJT05BTF9GT1JNQVR9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlVzZSBzYW1lIGZvcm1hdCBhcyBuYXRpdmUgbGlua2VyIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7IlRic3MiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RCU1N9LAotICAgICAgJ1wwJywgTl8oIkFERFJFU1MiKSwgTl8oIlNldCBhZGRyZXNzIG9mIC5ic3Mgc2VjdGlvbiIpLCBPTkVfREFTSCB9LAotICB7IHsiVGRhdGEiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1REQVRBfSwKLSAgICAgICdcMCcsIE5fKCJBRERSRVNTIiksIE5fKCJTZXQgYWRkcmVzcyBvZiAuZGF0YSBzZWN0aW9uIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJUdGV4dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFRFWFR9LAotICAgICAgJ1wwJywgTl8oIkFERFJFU1MiKSwgTl8oIlNldCBhZGRyZXNzIG9mIC50ZXh0IHNlY3Rpb24iKSwgT05FX0RBU0ggfSwKLSAgeyB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUkJPU0V9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIk91dHB1dCBsb3RzIG9mIGluZm9ybWF0aW9uIGR1cmluZyBsaW5rIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImRsbC12ZXJib3NlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9WRVJCT1NFfSwgLyogTGludXguICAqLwotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgTk9fSEVMUCB9LAotICB7IHsidmVyc2lvbi1zY3JpcHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUlNJT05fU0NSSVBUIH0sCi0gICAgICAnXDAnLCBOXygiRklMRSIpLCBOXygiUmVhZCB2ZXJzaW9uIGluZm9ybWF0aW9uIHNjcmlwdCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ2ZXJzaW9uLWV4cG9ydHMtc2VjdGlvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLAotICAgICBPUFRJT05fVkVSU0lPTl9FWFBPUlRTX1NFQ1RJT04gfSwKLSAgICAnXDAnLCBOXygiU1lNQk9MIiksIE5fKCJUYWtlIGV4cG9ydCBzeW1ib2xzIGxpc3QgZnJvbSAuZXhwb3J0cywgdXNpbmcgU1lNQk9MIGFzIHRoZSB2ZXJzaW9uLiIpLAotICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7Indhcm4tY29tbW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX0NPTU1PTn0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiV2FybiBhYm91dCBkdXBsaWNhdGUgY29tbW9uIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsid2Fybi1jb25zdHJ1Y3RvcnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fQ09OU1RSVUNUT1JTfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJXYXJuIGlmIGdsb2JhbCBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMgYXJlIHNlZW4iKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7Indhcm4tbXVsdGlwbGUtZ3AiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fTVVMVElQTEVfR1B9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIldhcm4gaWYgdGhlIG11bHRpcGxlIEdQIHZhbHVlcyBhcmUgdXNlZCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ3YXJuLW9uY2UiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fT05DRX0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiV2FybiBvbmx5IG9uY2UgcGVyIHVuZGVmaW5lZCBzeW1ib2wiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsid2Fybi1zZWN0aW9uLWFsaWduIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX1NFQ1RJT05fQUxJR059LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIldhcm4gaWYgc3RhcnQgb2Ygc2VjdGlvbiBjaGFuZ2VzIGR1ZSB0byBhbGlnbm1lbnQiKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7Indob2xlLWFyY2hpdmUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dIT0xFX0FSQ0hJVkV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkluY2x1ZGUgYWxsIG9iamVjdHMgZnJvbSBmb2xsb3dpbmcgYXJjaGl2ZXMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsid3JhcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV1JBUH0sCi0gICAgICAnXDAnLCBOXygiU1lNQk9MIiksIE5fKCJVc2Ugd3JhcHBlciBmdW5jdGlvbnMgZm9yIFNZTUJPTCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJtcGM4NjBjMCIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTVBDODYwQzB9LAotICAgICAgJ1wwJywgTl8oIls9V09SRFNdIiksIE5fKCJNb2RpZnkgcHJvYmxlbWF0aWMgYnJhbmNoZXMgaW4gbGFzdCBXT1JEUyAoMS0xMCwgZGVmYXVsdCA1KSB3b3JkcyBvZiBhIHBhZ2UiKSwgVFdPX0RBU0hFUyB9Ci19OwotCi0jZGVmaW5lIE9QVElPTl9DT1VOVCAoKGludCkgKHNpemVvZiBsZF9vcHRpb25zIC8gc2l6ZW9mIGxkX29wdGlvbnNbMF0pKQotCi0vKiBUZXN0ICJzdHJpbmciIGZvciBjb250YWluaW5nIGEgc3RyaW5nIG9mIGRpZ2l0cyB0aGF0IGZvcm0gYSBudW1iZXIKLWJldHdlZW4gIm1pbiIgYW5kICJtYXgiLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9yICJlcnIiLiAqLwotc3RhdGljCi1pbnQgaXNfbnVtKCBjaGFyICpzdHJpbmcsIGludCBtaW4sIGludCBtYXgsIGludCBlcnIpCi17Ci0gIGludCByZXN1bHQgPSAwOwotCi0gIGZvciAoIDsgKnN0cmluZzsgKytzdHJpbmcpCi0gIHsKLSAgICBpZiAoIWlzZGlnaXQoKnN0cmluZykpCi0gICAgewotICAgICAgcmVzdWx0ID0gZXJyOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJlc3VsdCA9IHJlc3VsdCAqIDEwICsgKCpzdHJpbmcgLSAnMCcpOwotICB9Ci0gIGlmIChyZXN1bHQgPCBtaW4gfHwgcmVzdWx0ID4gbWF4KQotICAgIHJlc3VsdCA9IGVycjsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkCi1wYXJzZV9hcmdzIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBpLCBpcywgaWw7Ci0gIGludCBpbmdyb3VwID0gMDsKLSAgY2hhciAqZGVmYXVsdF9kaXJsaXN0ID0gTlVMTDsKLSAgY2hhciBzaG9ydG9wdHNbT1BUSU9OX0NPVU5UICogMyArIDJdOwotICBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW09QVElPTl9DT1VOVCArIDFdOwotICBpbnQgbGFzdF9vcHRpbmQ7Ci0KLSAgLyogU3RhcnRpbmcgdGhlIHNob3J0IG9wdGlvbiBzdHJpbmcgd2l0aCAnLScgaXMgZm9yIHByb2dyYW1zIHRoYXQKLSAgICAgZXhwZWN0IG9wdGlvbnMgYW5kIG90aGVyIEFSR1YtZWxlbWVudHMgaW4gYW55IG9yZGVyIGFuZCB0aGF0IGNhcmUgYWJvdXQKLSAgICAgdGhlIG9yZGVyaW5nIG9mIHRoZSB0d28uICBXZSBkZXNjcmliZSBlYWNoIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50Ci0gICAgIGFzIGlmIGl0IHdlcmUgdGhlIGFyZ3VtZW50IG9mIGFuIG9wdGlvbiB3aXRoIGNoYXJhY3RlciBjb2RlIDEuICAqLwotICBzaG9ydG9wdHNbMF0gPSAnLSc7Ci0gIGlzID0gMTsKLSAgaWwgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgT1BUSU9OX0NPVU5UOyBpKyspCi0gICAgewotICAgICAgaWYgKGxkX29wdGlvbnNbaV0uc2hvcnRvcHQgIT0gJ1wwJykKLQl7Ci0JICBzaG9ydG9wdHNbaXNdID0gbGRfb3B0aW9uc1tpXS5zaG9ydG9wdDsKLQkgICsraXM7Ci0JICBpZiAobGRfb3B0aW9uc1tpXS5vcHQuaGFzX2FyZyA9PSByZXF1aXJlZF9hcmd1bWVudAotCSAgICAgIHx8IGxkX29wdGlvbnNbaV0ub3B0Lmhhc19hcmcgPT0gb3B0aW9uYWxfYXJndW1lbnQpCi0JICAgIHsKLQkgICAgICBzaG9ydG9wdHNbaXNdID0gJzonOwotCSAgICAgICsraXM7Ci0JICAgICAgaWYgKGxkX29wdGlvbnNbaV0ub3B0Lmhhc19hcmcgPT0gb3B0aW9uYWxfYXJndW1lbnQpCi0JCXsKLQkJICBzaG9ydG9wdHNbaXNdID0gJzonOwotCQkgICsraXM7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGlmIChsZF9vcHRpb25zW2ldLm9wdC5uYW1lICE9IE5VTEwpCi0JewotCSAgbG9uZ29wdHNbaWxdID0gbGRfb3B0aW9uc1tpXS5vcHQ7Ci0JICArK2lsOwotCX0KLSAgICB9Ci0gIHNob3J0b3B0c1tpc10gPSAnXDAnOwotICBsb25nb3B0c1tpbF0ubmFtZSA9IE5VTEw7Ci0KLSAgLyogVGhlIC1HIG9wdGlvbiBpcyBhbWJpZ3VvdXMgb24gZGlmZmVyZW50IHBsYXRmb3Jtcy4gIFNvbWV0aW1lcyBpdAotICAgICBzcGVjaWZpZXMgdGhlIGxhcmdlc3QgZGF0YSBzaXplIHRvIHB1dCBpbnRvIHRoZSBzbWFsbCBkYXRhCi0gICAgIHNlY3Rpb24uICBTb21ldGltZXMgaXQgaXMgZXF1aXZhbGVudCB0byAtLXNoYXJlZC4gIFVuZm9ydHVuYXRlbHksCi0gICAgIHRoZSBmaXJzdCBmb3JtIHRha2VzIGFuIGFyZ3VtZW50LCB3aGlsZSB0aGUgc2Vjb25kIGRvZXMgbm90LgotCi0gICAgIFdlIG5lZWQgdG8gcGVybWl0IHRoZSAtLXNoYXJlZCBmb3JtIGJlY2F1c2Ugb24gc29tZSBwbGF0Zm9ybXMsCi0gICAgIHN1Y2ggYXMgU29sYXJpcywgZ2NjIC1zaGFyZWQgd2lsbCBwYXNzIC1HIHRvIHRoZSBsaW5rZXIuCi0KLSAgICAgVG8gcGVybWl0IGVpdGhlciB1c2FnZSwgd2UgbG9vayB0aHJvdWdoIHRoZSBhcmd1bWVudCBsaXN0LiAgSWYgd2UKLSAgICAgZmluZCAtRyBub3QgZm9sbG93ZWQgYnkgYSBudW1iZXIsIHdlIGNoYW5nZSBpdCBpbnRvIC0tc2hhcmVkLgotICAgICBUaGlzIHdpbGwgd29yayBmb3IgbW9zdCBub3JtYWwgY2FzZXMuICAqLwotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sICItRyIpID09IDAKLQkmJiAoaSArIDEgPj0gYXJnYwotCSAgICB8fCAhIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBhcmd2W2kgKyAxXVswXSkpKQotICAgICAgYXJndltpXSA9IChjaGFyICopICItLXNoYXJlZCI7Ci0KLSAgLyogQmVjYXVzZSB3ZSBwZXJtaXQgbG9uZyBvcHRpb25zIHRvIHN0YXJ0IHdpdGggYSBzaW5nbGUgZGFzaCwgYW5kCi0gICAgIHdlIGhhdmUgYSAtLWxpYnJhcnkgb3B0aW9uLCBhbmQgdGhlIC1sIG9wdGlvbiBpcyBjb252ZW50aW9uYWxseQotICAgICB1c2VkIHdpdGggYW4gaW1tZWRpYXRlbHkgZm9sbG93aW5nIGFyZ3VtZW50LCB3ZSBjYW4gaGF2ZSBiYWQKLSAgICAgcmVzdWx0cyBpZiBzb21lYm9keSB0cmllcyB0byB1c2UgLWwgd2l0aCBhIGxpYnJhcnkgd2hvc2UgbmFtZQotICAgICBoYXBwZW5zIHRvIHN0YXJ0IHdpdGggImlicmFyeSIsIGFzIGluIC1saS4gIFdlIGF2b2lkIHByb2JsZW1zIGJ5Ci0gICAgIHNpbXBseSB0dXJuaW5nIC1sIGludG8gLS1saWJyYXJ5LiAgVGhpcyBtZWFucyB0aGF0IHVzZXJzIHdpbGwKLSAgICAgaGF2ZSB0byB1c2UgdHdvIGRhc2hlcyBpbiBvcmRlciB0byB1c2UgLS1saWJyYXJ5LCB3aGljaCBpcyBPSwotICAgICBzaW5jZSB0aGF0J3MgaG93IGl0IGlzIGRvY3VtZW50ZWQuCi0KLSAgICAgRklYTUU6IEl0J3MgcG9zc2libGUgdGhhdCB0aGlzIHByb2JsZW0gY2FuIGFyaXNlIGZvciBvdGhlciBzaG9ydAotICAgICBvcHRpb25zIGFzIHdlbGwsIGFsdGhvdWdoIHRoZSB1c2VyIGRvZXMgYWx3YXlzIGhhdmUgdGhlIHJlY291cnNlCi0gICAgIG9mIGFkZGluZyBhIHNwYWNlIGJldHdlZW4gdGhlIG9wdGlvbiBhbmQgdGhlIGFyZ3VtZW50LiAgKi8KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoYXJndltpXVswXSA9PSAnLScKLQkgICYmIGFyZ3ZbaV1bMV0gPT0gJ2wnCi0JICAmJiBhcmd2W2ldWzJdICE9ICdcMCcpCi0JewotCSAgY2hhciAqbjsKLQotCSAgbiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoYXJndltpXSkgKyAyMCk7Ci0JICBzcHJpbnRmIChuLCAiLS1saWJyYXJ5PSVzIiwgYXJndltpXSArIDIpOwotCSAgYXJndltpXSA9IG47Ci0JfQotICAgIH0KLQotICBsYXN0X29wdGluZCA9IC0xOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpbnQgbG9uZ2luZDsKLSAgICAgIGludCBvcHRjOwotCi0gICAgICAvKiBVc2luZyBsYXN0X29wdGluZCBsZXRzIHVzIGF2b2lkIGNhbGxpbmcgbGRlbXVsX3BhcnNlX2FyZ3MKLQkgbXVsdGlwbGUgdGltZXMgb24gYSBzaW5nbGUgb3B0aW9uLCB3aGljaCB3b3VsZCBsZWFkIHRvCi0JIGNvbmZ1c2lvbiBpbiB0aGUgaW50ZXJuYWwgc3RhdGljIHZhcmlhYmxlcyBtYWludGFpbmVkIGJ5Ci0JIGdldG9wdC4gIFRoaXMgY291bGQgb3RoZXJ3aXNlIGhhcHBlbiBmb3IgYW4gYXJndW1lbnQgbGlrZQotCSAtbngsIGluIHdoaWNoIHRoZSAtbiBpcyBwYXJzZWQgYXMgYSBzaW5nbGUgb3B0aW9uLCBhbmQgd2UKLQkgbG9vcCBhcm91bmQgdG8gcGljayB1cCB0aGUgLXguICAqLwotICAgICAgaWYgKG9wdGluZCAhPSBsYXN0X29wdGluZCkKLQl7Ci0JICBpZiAobGRlbXVsX3BhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpKQotCSAgICBjb250aW51ZTsKLQkgIGxhc3Rfb3B0aW5kID0gb3B0aW5kOwotCX0KLQotICAgICAgLyogZ2V0b3B0X2xvbmdfb25seSBpcyBsaWtlIGdldG9wdF9sb25nLCBidXQgJy0nIGFzIHdlbGwgYXMgJy0tJwotCSBjYW4gaW5kaWNhdGUgYSBsb25nIG9wdGlvbi4gICovCi0gICAgICBvcHRjID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgc2hvcnRvcHRzLCBsb25nb3B0cywgJmxvbmdpbmQpOwotCi0gICAgICBpZiAob3B0YyA9PSAtMSkKLQlicmVhazsKLSAgICAgIHN3aXRjaCAob3B0YykKLQl7Ci0JZGVmYXVsdDoKLQkgIHhleGl0ICgxKTsKLQljYXNlIDE6CQkJLyogRmlsZSBuYW1lLiAgKi8KLQkgIGxhbmdfYWRkX2lucHV0X2ZpbGUgKG9wdGFyZywgbGFuZ19pbnB1dF9maWxlX2lzX2ZpbGVfZW51bSwKLQkJCSAgICAgICAoY2hhciAqKSBOVUxMKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fSUdOT1JFOgotCSAgYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JICAvKiBGb3IgSFAvVVggY29tcGF0aWJpbGl0eS4gIEFjdHVhbGx5IC1hIHNoYXJlZCBzaG91bGQgbWVhbgotICAgICAgICAgICAgIGBgdXNlIG9ubHkgc2hhcmVkIGxpYnJhcmllcycnIGJ1dCwgdGhlbiwgd2UgZG9uJ3QKLSAgICAgICAgICAgICBjdXJyZW50bHkgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIG9uIEhQL1VYIGFueWhvdy4gICovCi0JICBpZiAoc3RyY21wIChvcHRhcmcsICJhcmNoaXZlIikgPT0gMCkKLQkgICAgY29uZmlnLmR5bmFtaWNfbGluayA9IGZhbHNlOwotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJzaGFyZWQiKSA9PSAwCi0JCSAgIHx8IHN0cmNtcCAob3B0YXJnLCAiZGVmYXVsdCIpID09IDApCi0JICAgIGNvbmZpZy5keW5hbWljX2xpbmsgPSB0cnVlOwotCSAgZWxzZQotCSAgICBlaW5mbyAoXygiJVAlRjogdW5yZWNvZ25pemVkIC1hIG9wdGlvbiBgJXMnXG4iKSwgb3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0FTU0VSVDoKLQkgIC8qIEZJWE1FOiBXZSBqdXN0IGlnbm9yZSB0aGVzZSwgYnV0IHdlIHNob3VsZCBoYW5kbGUgdGhlbS4gICovCi0JICBpZiAoc3RyY21wIChvcHRhcmcsICJkZWZpbml0aW9ucyIpID09IDApCi0JICAgIDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAibm9kZWZpbml0aW9ucyIpID09IDApCi0JICAgIDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAibm9zeW1ib2xpYyIpID09IDApCi0JICAgIDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAicHVyZS10ZXh0IikgPT0gMCkKLQkgICAgOwotCSAgZWxzZQotCSAgICBlaW5mbyAoXygiJVAlRjogdW5yZWNvZ25pemVkIC1hc3NlcnQgb3B0aW9uIGAlcydcbiIpLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnQSc6Ci0JICBsZGZpbGVfYWRkX2FyY2ggKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICdiJzoKLQkgIGxhbmdfYWRkX3RhcmdldCAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2MnOgotCSAgbGRmaWxlX29wZW5fY29tbWFuZF9maWxlIChvcHRhcmcpOwotCSAgcGFyc2VyX2lucHV0ID0gaW5wdXRfbXJpX3NjcmlwdDsKLQkgIHl5cGFyc2UgKCk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9DQUxMX1NIQVJFRDoKLQkgIGNvbmZpZy5keW5hbWljX2xpbmsgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9OX1NIQVJFRDoKLQkgIGNvbmZpZy5keW5hbWljX2xpbmsgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0NSRUY6Ci0JICBjb21tYW5kX2xpbmUuY3JlZiA9IHRydWU7Ci0JICBsaW5rX2luZm8ubm90aWNlX2FsbCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGNvbW1hbmRfbGluZS5mb3JjZV9jb21tb25fZGVmaW5pdGlvbiA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9ERUZTWU06Ci0JICBsZXhfc3RyaW5nID0gb3B0YXJnOwotCSAgbGV4X3JlZGlyZWN0IChvcHRhcmcpOwotCSAgcGFyc2VyX2lucHV0ID0gaW5wdXRfZGVmc3ltOwotCSAgcGFyc2luZ19kZWZzeW0gPSAxOwotCSAgeXlwYXJzZSAoKTsKLQkgIHBhcnNpbmdfZGVmc3ltID0gMDsKLQkgIGxleF9zdHJpbmcgPSBOVUxMOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fREVNQU5HTEU6Ci0JICBkZW1hbmdsaW5nID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0RZTkFNSUNfTElOS0VSOgotCSAgY29tbWFuZF9saW5lLmludGVycHJldGVyID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRUI6Ci0JICBjb21tYW5kX2xpbmUuZW5kaWFuID0gRU5ESUFOX0JJRzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VMOgotCSAgY29tbWFuZF9saW5lLmVuZGlhbiA9IEVORElBTl9MSVRUTEU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9FTUJFRERFRF9SRUxPQ1M6Ci0JICBjb21tYW5kX2xpbmUuZW1iZWRkZWRfcmVsb2NzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VYUE9SVF9EWU5BTUlDOgotCWNhc2UgJ0UnOiAvKiBIUC9VWCBjb21wYXRpYmlsaXR5LiAgKi8KLQkgIGNvbW1hbmRfbGluZS5leHBvcnRfZHluYW1pYyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdlJzoKLQkgIGxhbmdfYWRkX2VudHJ5IChvcHRhcmcsIHRydWUpOwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICBpZiAoY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnMgPQotCQkoY2hhciAqKikgeG1hbGxvYyAoMiAqIHNpemVvZiAoY2hhciAqKSk7Ci0JICAgICAgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzWzBdID0gb3B0YXJnOwotCSAgICAgIGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVyc1sxXSA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBjOwotCSAgICAgIGNoYXIgKipwOwotCi0JICAgICAgYyA9IDA7Ci0JICAgICAgZm9yIChwID0gY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzOyAqcCAhPSBOVUxMOyBwKyspCi0JCSsrYzsKLQkgICAgICBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnMgPQotCQkoY2hhciAqKikgeHJlYWxsb2MgKGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVycywKLQkJCQkgICAgKGMgKyAyKSAqIHNpemVvZiAoY2hhciAqKSk7Ci0JICAgICAgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzW2NdID0gb3B0YXJnOwotCSAgICAgIGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVyc1tjICsgMV0gPSBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdGJzoKLQkgIGNvbW1hbmRfbGluZS5maWx0ZXJfc2hsaWIgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9GT1JDRV9FWEVfU1VGRklYOgotCSAgY29tbWFuZF9saW5lLmZvcmNlX2V4ZV9zdWZmaXggPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnRyc6Ci0JICB7Ci0JICAgIGNoYXIgKmVuZDsKLQkgICAgZ19zd2l0Y2hfdmFsdWUgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotCSAgICBpZiAoKmVuZCkKLQkgICAgICBlaW5mbyAoXygiJVAlRjogaW52YWxpZCBudW1iZXIgYCVzJ1xuIiksIG9wdGFyZyk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlICdnJzoKLQkgIC8qIElnbm9yZS4gICovCi0JICBicmVhazsKLQljYXNlIE9QVElPTl9HQ19TRUNUSU9OUzoKLQkgIGNvbW1hbmRfbGluZS5nY19zZWN0aW9ucyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9IRUxQOgotCSAgaGVscCAoKTsKLQkgIHhleGl0ICgwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0wnOgotCSAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKG9wdGFyZywgdHJ1ZSk7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIGxhbmdfYWRkX2lucHV0X2ZpbGUgKG9wdGFyZywgbGFuZ19pbnB1dF9maWxlX2lzX2xfZW51bSwKLQkJCSAgICAgICAoY2hhciAqKSBOVUxMKTsKLQkgIGJyZWFrOwotCWNhc2UgJ00nOgotCSAgY29uZmlnLm1hcF9maWxlbmFtZSA9ICItIjsKLQkgIGJyZWFrOwotCWNhc2UgJ20nOgotCSAgLyogSWdub3JlLiAgV2FzIGhhbmRsZWQgaW4gYSBwcmUtcGFyc2UuICAgKi8KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX01BUDoKLQkgIGNvbmZpZy5tYXBfZmlsZW5hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdOJzoKLQkgIGNvbmZpZy50ZXh0X3JlYWRfb25seSA9IGZhbHNlOwotCSAgY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCA9IGZhbHNlOwotCSAgY29uZmlnLmR5bmFtaWNfbGluayA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAnbic6Ci0JICBjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkID0gZmFsc2U7Ci0JICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19ERU1BTkdMRToKLQkgIGRlbWFuZ2xpbmcgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0dDX1NFQ1RJT05TOgotCSAgY29tbWFuZF9saW5lLmdjX3NlY3Rpb25zID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19LRUVQX01FTU9SWToKLQkgIGxpbmtfaW5mby5rZWVwX21lbW9yeSA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9fVU5ERUZJTkVEOgotCSAgbGlua19pbmZvLm5vX3VuZGVmaW5lZCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19XQVJOX01JU01BVENIOgotCSAgY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2ggPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PSU5ISUJJVF9FWEVDOgotCSAgZm9yY2VfbWFrZV9leGVjdXRhYmxlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX1dIT0xFX0FSQ0hJVkU6Ci0JICB3aG9sZV9hcmNoaXZlID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICdPJzoKLQkgIC8qIEZJWE1FICItTzxub24tZGlnaXRzPiA8dmFsdWU+IiB1c2VkIHRvIHNldCB0aGUgYWRkcmVzcyBvZgotCSAgICAgc2VjdGlvbiA8bm9uLWRpZ2l0cz4uICBXYXMgdGhpcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCi0JICAgICBzb21ldGhpbmcsIG9yIGNhbiB3ZSBjcmVhdGUgYSBuZXcgb3B0aW9uIHRvIGRvIHRoYXQKLQkgICAgICh3aXRoIGEgc3ludGF4IHNpbWlsYXIgdG8gLWRlZnN5bSk/Ci0JICAgICBnZXRvcHQgY2FuJ3QgaGFuZGxlIHR3byBhcmdzIHRvIGFuIG9wdGlvbiB3aXRob3V0IGtsdWRnZXMuICAqLwotCi0JICAvKiBFbmFibGUgb3B0aW1pemF0aW9ucyBvZiBvdXRwdXQgZmlsZXMuICAqLwotCSAgbGlua19pbmZvLm9wdGltaXplID0gc3RydG91bCAob3B0YXJnLCBOVUxMLCAwKSA/IHRydWUgOiBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgJ28nOgotCSAgbGFuZ19hZGRfb3V0cHV0IChvcHRhcmcsIDApOyAKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX09GT1JNQVQ6Ci0JICBsYW5nX2FkZF9vdXRwdXRfZm9ybWF0IChvcHRhcmcsIChjaGFyICopIE5VTEwsIChjaGFyICopIE5VTEwsIDApOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JY2FzZSAncic6Ci0JICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gdHJ1ZTsKLQkgIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPSBmYWxzZTsKLQkgIGNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQgPSBmYWxzZTsKLQkgIGNvbmZpZy50ZXh0X3JlYWRfb25seSA9IGZhbHNlOwotCSAgY29uZmlnLmR5bmFtaWNfbGluayA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAnUic6Ci0JICAvKiBUaGUgR05VIGxpbmtlciB0cmFkaXRpb25hbGx5IHVzZXMgLVIgdG8gbWVhbiB0byBpbmNsdWRlCi0JICAgICBvbmx5IHRoZSBzeW1ib2xzIGZyb20gYSBmaWxlLiAgVGhlIFNvbGFyaXMgbGlua2VyIHVzZXMgLVIKLQkgICAgIHRvIHNldCB0aGUgcGF0aCB1c2VkIGJ5IHRoZSBydW50aW1lIGxpbmtlciB0byBmaW5kCi0JICAgICBsaWJyYXJpZXMuICBUaGlzIGlzIHRoZSBHTlUgbGlua2VyIC1ycGF0aCBhcmd1bWVudC4gIFdlCi0JICAgICB0cnkgdG8gc3VwcG9ydCBib3RoIHNpbXVsdGFuZW91c2x5IGJ5IGNoZWNraW5nIHRoZSBmaWxlCi0JICAgICBuYW1lZC4gIElmIGl0IGlzIGEgZGlyZWN0b3J5LCByYXRoZXIgdGhhbiBhIHJlZ3VsYXIgZmlsZSwKLQkgICAgIHdlIGFzc3VtZSAtcnBhdGggd2FzIG1lYW50LiAgKi8KLQkgIHsKLQkgICAgc3RydWN0IHN0YXQgczsKLQotCSAgICBpZiAoc3RhdCAob3B0YXJnLCAmcykgPj0gMAotCQkmJiAhIFNfSVNESVIgKHMuc3RfbW9kZSkpCi0JICAgICAgewotCQlsYW5nX2FkZF9pbnB1dF9maWxlIChvcHRhcmcsCi0JCQkJICAgICBsYW5nX2lucHV0X2ZpbGVfaXNfc3ltYm9sc19vbmx5X2VudW0sCi0JCQkJICAgICAoY2hhciAqKSBOVUxMKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIE9QVElPTl9SUEFUSDoKLQkgIGlmIChjb21tYW5kX2xpbmUucnBhdGggPT0gTlVMTCkKLQkgICAgY29tbWFuZF9saW5lLnJwYXRoID0gYnV5c3RyaW5nIChvcHRhcmcpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2l6ZV90IHJwYXRoX2xlbiA9IHN0cmxlbiAoY29tbWFuZF9saW5lLnJwYXRoKTsKLQkgICAgICBzaXplX3Qgb3B0YXJnX2xlbiA9IHN0cmxlbiAob3B0YXJnKTsKLQkgICAgICBjaGFyICpidWY7Ci0JICAgICAgY2hhciAqY3AgPSBjb21tYW5kX2xpbmUucnBhdGg7Ci0KLQkgICAgICAvKiBGaXJzdCBzZWUgd2hldGhlciBPUFRBUkcgaXMgYWxyZWFkeSBpbiB0aGUgcGF0aC4gICovCi0JICAgICAgZG8KLQkJewotCQkgIHNpemVfdCBpZHggPSAwOwotCQkgIHdoaWxlIChvcHRhcmdbaWR4XSAhPSAnXDAnICYmIG9wdGFyZ1tpZHhdID09IGNwW2lkeF0pCi0JCSAgICArK2lkeDsKLQkJICBpZiAob3B0YXJnW2lkeF0gPT0gJ1wwJwotCQkgICAgICAmJiAoY3BbaWR4XSA9PSAnXDAnIHx8IGNwW2lkeF0gPT0gJzonKSkKLQkJICAgIC8qIFdlIGZvdW5kIGl0LiAgKi8KLQkJICAgIGJyZWFrOwotCi0JCSAgLyogTm90IHlldCBmb3VuZC4gICovCi0JCSAgY3AgPSBzdHJjaHIgKGNwLCAnOicpOwotCQkgIGlmIChjcCAhPSBOVUxMKQotCQkgICAgKytjcDsKLQkJfQotCSAgICAgIHdoaWxlIChjcCAhPSBOVUxMKTsKLQotCSAgICAgIGlmIChjcCA9PSBOVUxMKQotCQl7Ci0JCSAgYnVmID0geG1hbGxvYyAocnBhdGhfbGVuICsgb3B0YXJnX2xlbiArIDIpOwotCQkgIHNwcmludGYgKGJ1ZiwgIiVzOiVzIiwgY29tbWFuZF9saW5lLnJwYXRoLCBvcHRhcmcpOwotCQkgIGZyZWUgKGNvbW1hbmRfbGluZS5ycGF0aCk7Ci0JCSAgY29tbWFuZF9saW5lLnJwYXRoID0gYnVmOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1JQQVRIX0xJTks6Ci0JICBpZiAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmsgPT0gTlVMTCkKLQkgICAgY29tbWFuZF9saW5lLnJwYXRoX2xpbmsgPSBidXlzdHJpbmcgKG9wdGFyZyk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICpidWY7Ci0KLQkgICAgICBidWYgPSB4bWFsbG9jIChzdHJsZW4gKGNvbW1hbmRfbGluZS5ycGF0aF9saW5rKQotCQkJICAgICArIHN0cmxlbiAob3B0YXJnKQotCQkJICAgICArIDIpOwotCSAgICAgIHNwcmludGYgKGJ1ZiwgIiVzOiVzIiwgY29tbWFuZF9saW5lLnJwYXRoX2xpbmssIG9wdGFyZyk7Ci0JICAgICAgZnJlZSAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmspOwotCSAgICAgIGNvbW1hbmRfbGluZS5ycGF0aF9saW5rID0gYnVmOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9SRUxBWDoKLQkgIGNvbW1hbmRfbGluZS5yZWxheCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9SRVRBSU5fU1lNQk9MU19GSUxFOgotCSAgYWRkX2tlZXBzeW1zX2ZpbGUgKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQkgIGxpbmtfaW5mby5zdHJpcCA9IHN0cmlwX2RlYnVnZ2VyOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBsaW5rX2luZm8uc3RyaXAgPSBzdHJpcF9hbGw7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9TSEFSRUQ6Ci0JICBpZiAoY29uZmlnLmhhc19zaGFyZWQpCi0JICAgIGxpbmtfaW5mby5zaGFyZWQgPSB0cnVlOwotCSAgZWxzZQotCSAgICBlaW5mbyAoXygiJVAlRjogLXNoYXJlZCBub3Qgc3VwcG9ydGVkXG4iKSk7Ci0JICBicmVhazsKLQljYXNlICdoJzoJCS8qIFVzZWQgb24gU29sYXJpcy4gICovCi0JY2FzZSBPUFRJT05fU09OQU1FOgotCSAgY29tbWFuZF9saW5lLnNvbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NPUlRfQ09NTU9OOgotCSAgY29uZmlnLnNvcnRfY29tbW9uID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NUQVRTOgotCSAgY29uZmlnLnN0YXRzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NZTUJPTElDOgotCSAgbGlua19pbmZvLnN5bWJvbGljID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgdHJhY2VfZmlsZXMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnVCc6Ci0JICBsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgKG9wdGFyZyk7Ci0JICBwYXJzZXJfaW5wdXQgPSBpbnB1dF9zY3JpcHQ7Ci0JICB5eXBhcnNlICgpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVEJTUzoKLQkgIHNldF9zZWN0aW9uX3N0YXJ0ICgiLmJzcyIsIG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9UREFUQToKLQkgIHNldF9zZWN0aW9uX3N0YXJ0ICgiLmRhdGEiLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVFRFWFQ6Ci0JICBzZXRfc2VjdGlvbl9zdGFydCAoIi50ZXh0Iiwgb3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1RSQURJVElPTkFMX0ZPUk1BVDoKLQkgIGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVEFTS19MSU5LOgotCSAgbGlua19pbmZvLnRhc2tfbGluayA9IHRydWU7Ci0JICAvKiBGYWxsIHRocm91Z2ggLSBkbyBhbiBpbXBsaWVkIC1yIG9wdGlvbi4gICovCi0JY2FzZSBPUFRJT05fVVI6Ci0JICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gdHJ1ZTsKLQkgIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPSB0cnVlOwotCSAgY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCA9IGZhbHNlOwotCSAgY29uZmlnLnRleHRfcmVhZF9vbmx5ID0gZmFsc2U7Ci0JICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICd1JzoKLQkgIGxkbGFuZ19hZGRfdW5kZWYgKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9WRVJCT1NFOgotCSAgbGR2ZXJzaW9uICgxKTsKLQkgIHZlcnNpb25fcHJpbnRlZCA9IHRydWU7Ci0JICB0cmFjZV9maWxlX3RyaWVzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3YnOgotCSAgbGR2ZXJzaW9uICgwKTsKLQkgIHZlcnNpb25fcHJpbnRlZCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdWJzoKLQkgIGxkdmVyc2lvbiAoMSk7Ci0JICB2ZXJzaW9uX3ByaW50ZWQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVkVSU0lPTjoKLQkgIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0JICBwcmludGYgKCJHTlUgbGQgJXNcbiIsIGxkX3Byb2dyYW1fdmVyc2lvbik7Ci0JICBwcmludGYgKF8oIkNvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIikpOwotCSAgcHJpbnRmIChfKCJcCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG5cCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iKSk7Ci0JICB7Ci0JICAgIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKipwdHIgPSBsZF9lbXVsYXRpb25zOwotICAgIAotCSAgICBwcmludGYgKF8oIiAgU3VwcG9ydGVkIGVtdWxhdGlvbnM6XG4iKSk7Ci0JICAgIHdoaWxlICgqcHRyKSAKLQkgICAgICB7Ci0JCXByaW50ZiAoIiAgICVzXG4iLCAoKnB0ciktPmVtdWxhdGlvbl9uYW1lKTsKLQkJcHRyKys7Ci0JICAgICAgfQotCSAgfQotCSAgeGV4aXQgKDApOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVkVSU0lPTl9TQ1JJUFQ6Ci0JICAvKiBUaGlzIG9wdGlvbiBpbmRpY2F0ZXMgYSBzbWFsbCBzY3JpcHQgdGhhdCBvbmx5IHNwZWNpZmllcwotICAgICAgICAgICAgIHZlcnNpb24gaW5mb3JtYXRpb24uICBSZWFkIGl0LCBidXQgZG9uJ3QgYXNzdW1lIHRoYXQKLSAgICAgICAgICAgICB3ZSd2ZSBzZWVuIGEgbGlua2VyIHNjcmlwdC4gICovCi0JICB7Ci0JICAgIGJvb2xlYW4gaG9sZF9oYWRfc2NyaXB0OwotCi0JICAgIGhvbGRfaGFkX3NjcmlwdCA9IGhhZF9zY3JpcHQ7Ci0JICAgIGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSAob3B0YXJnKTsKLQkgICAgaGFkX3NjcmlwdCA9IGhvbGRfaGFkX3NjcmlwdDsKLQkgICAgcGFyc2VyX2lucHV0ID0gaW5wdXRfdmVyc2lvbl9zY3JpcHQ7Ci0JICAgIHl5cGFyc2UgKCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9WRVJTSU9OX0VYUE9SVFNfU0VDVElPTjoKLQkgIC8qIFRoaXMgb3B0aW9uIHJlY29yZHMgYSB2ZXJzaW9uIHN5bWJvbCB0byBiZSBhcHBsaWVkIHRvIHRoZQotCSAgICAgc3ltYm9scyBsaXN0ZWQgZm9yIGV4cG9ydCB0byBiZSBmb3VuZCBpbiB0aGUgb2JqZWN0IGZpbGVzCi0JICAgICAuZXhwb3J0cyBzZWN0aW9ucy4gICovCi0JICBjb21tYW5kX2xpbmUudmVyc2lvbl9leHBvcnRzX3NlY3Rpb24gPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9XQVJOX0NPTU1PTjoKLQkgIGNvbmZpZy53YXJuX2NvbW1vbiA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9XQVJOX0NPTlNUUlVDVE9SUzoKLQkgIGNvbmZpZy53YXJuX2NvbnN0cnVjdG9ycyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9XQVJOX01VTFRJUExFX0dQOgotCSAgY29uZmlnLndhcm5fbXVsdGlwbGVfZ3AgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fV0FSTl9PTkNFOgotCSAgY29uZmlnLndhcm5fb25jZSA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9XQVJOX1NFQ1RJT05fQUxJR046Ci0JICBjb25maWcud2Fybl9zZWN0aW9uX2FsaWduID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dIT0xFX0FSQ0hJVkU6Ci0JICB3aG9sZV9hcmNoaXZlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dSQVA6Ci0JICBhZGRfd3JhcCAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1gnOgotCSAgbGlua19pbmZvLmRpc2NhcmQgPSBkaXNjYXJkX2w7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIGxpbmtfaW5mby5kaXNjYXJkID0gZGlzY2FyZF9hbGw7Ci0JICBicmVhazsKLQljYXNlICdZJzoKLQkgIGlmIChzdHJuY21wIChvcHRhcmcsICJQLCIsIDIpID09IDApCi0JICAgIG9wdGFyZyArPSAyOwotCSAgZGVmYXVsdF9kaXJsaXN0ID0geHN0cmR1cCAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3knOgotCSAgYWRkX3lzeW0gKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICd6JzoKLQkgIC8qIFdlIGFjY2VwdCBhbmQgaWdub3JlIHRoaXMgb3B0aW9uIGZvciBTb2xhcmlzCi0gICAgICAgICAgICAgY29tcGF0aWJpbGl0eS4gIEFjdHVhbGx5LCBvbiBTb2xhcmlzLCBvcHRhcmcgaXMgbm90Ci0gICAgICAgICAgICAgaWdub3JlZC4gIFNvbWVkYXkgd2Ugc2hvdWxkIGhhbmRsZSBpdCBjb3JyZWN0bHkuICBGSVhNRS4gICovCi0JICBicmVhazsKLQljYXNlIE9QVElPTl9TUExJVF9CWV9SRUxPQzoKLQkgIGNvbmZpZy5zcGxpdF9ieV9yZWxvYyA9IGF0b2kgKG9wdGFyZyk7Ci0JICBicmVhazsgCi0JY2FzZSBPUFRJT05fU1BMSVRfQllfRklMRToKLQkgIGNvbmZpZy5zcGxpdF9ieV9maWxlID0gdHJ1ZTsKLQkgIGJyZWFrOyAKLQljYXNlIE9QVElPTl9DSEVDS19TRUNUSU9OUzoKLQkgIGNvbW1hbmRfbGluZS5jaGVja19zZWN0aW9uX2FkZHJlc3NlcyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19DSEVDS19TRUNUSU9OUzoKLQkgIGNvbW1hbmRfbGluZS5jaGVja19zZWN0aW9uX2FkZHJlc3NlcyA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAnKCc6Ci0JICBpZiAoaW5ncm91cCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgIF8oIiVzOiBtYXkgbm90IG5lc3QgZ3JvdXBzICgtLWhlbHAgZm9yIHVzYWdlKVxuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUpOwotCSAgICAgIHhleGl0ICgxKTsKLQkgICAgfQotCSAgbGFuZ19lbnRlcl9ncm91cCAoKTsKLQkgIGluZ3JvdXAgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnKSc6Ci0JICBpZiAoISBpbmdyb3VwKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6IGdyb3VwIGVuZGVkIGJlZm9yZSBpdCBiZWdhbiAoLS1oZWxwIGZvciB1c2FnZSlcbiIpLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lKTsKLQkgICAgICB4ZXhpdCAoMSk7Ci0JICAgIH0KLQkgIGxhbmdfbGVhdmVfZ3JvdXAgKCk7Ci0JICBpbmdyb3VwID0gMDsKLQkgIGJyZWFrOwotICAgICAgY2FzZSBPUFRJT05fTVBDODYwQzA6Ci0gICAgICAgICAgbGlua19pbmZvLm1wYzg2MGMwID0gMjA7ICAgICAgLyogZGVmYXVsdCB2YWx1ZSAoaW4gYnl0ZXMpICovCi0gICAgICAgICAgaWYgKG9wdGFyZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdW5zaWduZWQgd29yZHM7Ci0KLSAgICAgICAgICAgICAgd29yZHMgPSBpc19udW0gKG9wdGFyZywgMSwgMTAsIDApOwotICAgICAgICAgICAgICBpZiAod29yZHMgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIkludmFsaWQgYXJndW1lbnQgdG8gb3B0aW9uIFwibXBjODYwYzBcIlxuIikpOwotICAgICAgICAgICAgICAgICAgeGV4aXQgKDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbGlua19pbmZvLm1wYzg2MGMwID0gd29yZHMgKiA0OyAgIC8qIGNvbnZlcnQgd29yZHMgdG8gYnl0ZXMgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBjb21tYW5kX2xpbmUucmVsYXggPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGluZ3JvdXApCi0gICAgbGFuZ19sZWF2ZV9ncm91cCAoKTsKLQotICBpZiAoZGVmYXVsdF9kaXJsaXN0ICE9IE5VTEwpCi0gICAgc2V0X2RlZmF1bHRfZGlybGlzdCAoZGVmYXVsdF9kaXJsaXN0KTsKLQotfQotCi0vKiBBZGQgdGhlIChjb2xvbi1zZXBhcmF0ZWQpIGVsZW1lbnRzIG9mIERJUkxJU1RfUFRSIHRvIHRoZQotICAgbGlicmFyeSBzZWFyY2ggcGF0aC4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfZGVmYXVsdF9kaXJsaXN0IChkaXJsaXN0X3B0cikKLSAgICAgY2hhciAqZGlybGlzdF9wdHI7Ci17Ci0gIGNoYXIgKnA7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgcCA9IHN0cmNociAoZGlybGlzdF9wdHIsIFBBVEhfU0VQQVJBVE9SKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JKnAgPSAnXDAnOwotICAgICAgaWYgKCpkaXJsaXN0X3B0ciAhPSAnXDAnKQotCWxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChkaXJsaXN0X3B0ciwgdHJ1ZSk7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCWJyZWFrOwotICAgICAgZGlybGlzdF9wdHIgPSBwICsgMTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfc2VjdGlvbl9zdGFydCAoc2VjdCwgdmFsc3RyKQotICAgICBjaGFyICpzZWN0LCAqdmFsc3RyOwotewotICBjaGFyICplbmQ7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsID0gc3RydG91bCAodmFsc3RyLCAmZW5kLCAxNik7Ci0gIGlmICgqZW5kKQotICAgIGVpbmZvIChfKCIlUCVGOiBpbnZhbGlkIGhleCBudW1iZXIgYCVzJ1xuIiksIHZhbHN0cik7Ci0gIGxhbmdfc2VjdGlvbl9zdGFydCAoc2VjdCwgZXhwX2ludG9wICh2YWwpKTsKLX0KLQwKLS8qIFByaW50IGhlbHAgbWVzc2FnZXMgZm9yIHRoZSBvcHRpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLWhlbHAgKCkKLXsKLSAgaW50IGk7Ci0gIGNvbnN0IGNoYXIgKip0YXJnZXRzLCAqKnBwOwotCi0gIHByaW50ZiAoXygiVXNhZ2U6ICVzIFtvcHRpb25zXSBmaWxlLi4uXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLQotICBwcmludGYgKF8oIk9wdGlvbnM6XG4iKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBPUFRJT05fQ09VTlQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobGRfb3B0aW9uc1tpXS5kb2MgIT0gTlVMTCkKLQl7Ci0JICBib29sZWFuIGNvbW1hOwotCSAgaW50IGxlbjsKLQkgIGludCBqOwotCi0JICBwcmludGYgKCIgICIpOwotCi0JICBjb21tYSA9IGZhbHNlOwotCSAgbGVuID0gMjsKLQotCSAgaiA9IGk7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgaWYgKGxkX29wdGlvbnNbal0uc2hvcnRvcHQgIT0gJ1wwJwotCQkgICYmIGxkX29wdGlvbnNbal0uY29udHJvbCAhPSBOT19IRUxQKQotCQl7Ci0JCSAgcHJpbnRmICgiJXMtJWMiLCBjb21tYSA/ICIsICIgOiAiIiwgbGRfb3B0aW9uc1tqXS5zaG9ydG9wdCk7Ci0JCSAgbGVuICs9IChjb21tYSA/IDIgOiAwKSArIDI7Ci0JCSAgaWYgKGxkX29wdGlvbnNbal0uYXJnICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChsZF9vcHRpb25zW2pdLm9wdC5oYXNfYXJnICE9IG9wdGlvbmFsX2FyZ3VtZW50KQotCQkJewotCQkJICBwcmludGYgKCIgIik7Ci0JCQkgICsrbGVuOwotCQkJfQotCQkgICAgICBwcmludGYgKCIlcyIsIF8obGRfb3B0aW9uc1tqXS5hcmcpKTsKLQkJICAgICAgbGVuICs9IHN0cmxlbiAoXyhsZF9vcHRpb25zW2pdLmFyZykpOwotCQkgICAgfQotCQkgIGNvbW1hID0gdHJ1ZTsKLQkJfQotCSAgICAgICsrajsKLQkgICAgfQotCSAgd2hpbGUgKGogPCBPUFRJT05fQ09VTlQgJiYgbGRfb3B0aW9uc1tqXS5kb2MgPT0gTlVMTCk7Ci0KLQkgIGogPSBpOwotCSAgZG8KLQkgICAgewotCSAgICAgIGlmIChsZF9vcHRpb25zW2pdLm9wdC5uYW1lICE9IE5VTEwKLQkJICAmJiBsZF9vcHRpb25zW2pdLmNvbnRyb2wgIT0gTk9fSEVMUCkKLQkJewotCQkgIHByaW50ZiAoIiVzLSVzJXMiLAotCQkJICBjb21tYSA/ICIsICIgOiAiIiwKLQkJCSAgbGRfb3B0aW9uc1tqXS5jb250cm9sID09IFRXT19EQVNIRVMgPyAiLSIgOiAiIiwKLQkJCSAgbGRfb3B0aW9uc1tqXS5vcHQubmFtZSk7Ci0JCSAgbGVuICs9ICgoY29tbWEgPyAyIDogMCkKLQkJCSAgKyAxCi0JCQkgICsgKGxkX29wdGlvbnNbal0uY29udHJvbCA9PSBUV09fREFTSEVTID8gMSA6IDApCi0JCQkgICsgc3RybGVuIChsZF9vcHRpb25zW2pdLm9wdC5uYW1lKSk7Ci0JCSAgaWYgKGxkX29wdGlvbnNbal0uYXJnICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiAlcyIsIF8obGRfb3B0aW9uc1tqXS5hcmcpKTsKLQkJICAgICAgbGVuICs9IDEgKyBzdHJsZW4gKF8obGRfb3B0aW9uc1tqXS5hcmcpKTsKLQkJICAgIH0KLQkJICBjb21tYSA9IHRydWU7Ci0JCX0KLQkgICAgICArK2o7Ci0JICAgIH0KLQkgIHdoaWxlIChqIDwgT1BUSU9OX0NPVU5UICYmIGxkX29wdGlvbnNbal0uZG9jID09IE5VTEwpOwotCi0JICBpZiAobGVuID49IDMwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiXG4iKTsKLQkgICAgICBsZW4gPSAwOwotCSAgICB9Ci0KLQkgIGZvciAoOyBsZW4gPCAzMDsgbGVuKyspCi0JICAgIHB1dGNoYXIgKCcgJyk7Ci0KLQkgIHByaW50ZiAoIiVzXG4iLCBfKGxkX29wdGlvbnNbaV0uZG9jKSk7Ci0JfQotICAgIH0KLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBwcmludGYgKF8oIiVzOiBzdXBwb3J0ZWQgdGFyZ2V0czoiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgdGFyZ2V0cyA9IGJmZF90YXJnZXRfbGlzdCAoKTsKLSAgZm9yIChwcCA9IHRhcmdldHM7ICpwcCAhPSBOVUxMOyBwcCsrKQotICAgIHByaW50ZiAoIiAlcyIsICpwcCk7Ci0gIGZyZWUgKHRhcmdldHMpOwotICBwcmludGYgKCJcbiIpOwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIHByaW50ZiAoXygiJXM6IHN1cHBvcnRlZCBlbXVsYXRpb25zOiAiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgbGRlbXVsX2xpc3RfZW11bGF0aW9ucyAoc3Rkb3V0KTsKLSAgcHJpbnRmICgiXG4iKTsKLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBwcmludGYgKF8oIiVzOiBlbXVsYXRpb24gc3BlY2lmaWMgb3B0aW9uczpcbiIpLCBwcm9ncmFtX25hbWUpOwotICBsZGVtdWxfbGlzdF9lbXVsYXRpb25fb3B0aW9ucyAoc3Rkb3V0KTsKLSAgcHJpbnRmICgiXG4iKTsKLSAgCi0gIHByaW50ZiAoXygiXG5SZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLX0KZGlmZiAtLWdpdCBhL2xkL21hYy1sZC5yIGIvbGQvbWFjLWxkLnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMTZmYzUuLjAwMDAwMDAKLS0tIGEvbGQvbWFjLWxkLnIKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBSZXNvdXJjZXMgZm9yIEdOVSBMRC4gKi8KLQotI2luY2x1ZGUgIlN5c1R5cGVzLnIiCi0KLS8qIFZlcnNpb24gcmVzb3VyY2VzLiAqLwotCi1yZXNvdXJjZSAndmVycycgKDEpICB7Ci0JMCwKLQkwLAotCTAsCi0JMCwKLQl2ZXJVcywKLQlWRVJTSU9OX1NUUklORywKLQlWRVJTSU9OX1NUUklORyAgIiAoQykgMTk4Ni05NSBGU0YsIEluYy4iCi19OwotCi1yZXNvdXJjZSAndmVycycgKDIsIHB1cmdlYWJsZSkgIHsKLQkwLAotCTAsCi0JMCwKLQkwLAotCXZlclVzLAotCVZFUlNJT05fU1RSSU5HLAotCSJHTEQgIiBWRVJTSU9OX1NUUklORyAiIGZvciBNUFciCi19OwotCi0jaWZkZWYgV0FOVF9DRlJHCi0KLSNpbmNsdWRlICJDb2RlRnJhZ21lbnRUeXBlcy5yIgotCi1yZXNvdXJjZSAnY2ZyZycgKDApIHsKLQl7Ci0JCWtQb3dlclBDLAotCQlrRnVsbExpYiwKLQkJa05vVmVyc2lvbk51bSwga05vVmVyc2lvbk51bSwKLQkJMCwgMCwKLQkJa0lzQXBwLCBrT25EaXNrRmxhdCwga1plcm9PZmZzZXQsIGtXaG9sZUZvcmssCi0JCVBST0dfTkFNRQotCX0KLX07Ci0KLSNlbmRpZiAvKiBXQU5UX0NGUkcgKi8KZGlmZiAtLWdpdCBhL2xkL21wdy1jb25maWcuaW4gYi9sZC9tcHctY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjU0MmNjLi4wMDAwMDAwCi0tLSBhL2xkL21wdy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIENvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIExELgotCi1JZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbTY4ay1hcHBsZS1tYWNvcy8KLQlTZXQgZW11bG5hbWUgbTY4a2NvZmYKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9Im1wdy1lbTY4a2NvZmYuYyBlbTY4a2NvZmYuYwotCVNldCBlbXVsYXRpb25fb2ZpbGVzICJ7b30iZW02OGtjb2ZmLmMubwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+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+cmVsb2NfY291bnQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgcmVsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmVsLnNkYXRhIik7Ci0gICAgICBBU1NFUlQgKHJlbHNlYyAhPSBOVUxMKTsKLQotICAgICAgaWYgKCEgYmZkX21pcHNfZWNvZmZfY3JlYXRlX2VtYmVkZGVkX3JlbG9jcyAoYWJmZCwgJmxpbmtfaW5mbywKLQkJCQkJCSAgIGRhdGFzZWMsIHJlbHNlYywKLQkJCQkJCSAgICZlcnJtc2cpKQotCXsKLQkgIGlmIChlcnJtc2cgPT0gTlVMTCkKLQkgICAgZWluZm8gKF8oIiVCJVg6IGNhbiBub3QgY3JlYXRlIHJ1bnRpbWUgcmVsb2MgaW5mb3JtYXRpb246ICVFXG4iKSwKLQkJICAgYWJmZCk7Ci0JICBlbHNlCi0JICAgIGVpbmZvIChfKCIlWCVCOiBjYW4gbm90IGNyZWF0ZSBydW50aW1lIHJlbG9jIGluZm9ybWF0aW9uOiAlc1xuIiksCi0JCSAgIGFiZmQsIGVycm1zZyk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkbWlwc2lkdF9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1jb25jYXQoCi0iT1VUUFVUX0ZPUk1BVChcImVjb2ZmLWJpZ21pcHNcIiwgXCJlY29mZi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlY29mZi1saXR0bGVtaXBzXCIpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtaWR0LWVjb2ZmL2xpYik7XG5cCi1FTlRSWShzdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC50ZXh0IDoge1xuXAotICAgIDtcblwKLSAgICAqKC5pbml0KVxuXAotICAgIDtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnJlbC5zZGF0YSlcblwKLSAgICAqKC5maW5pKVxuXAotICAgIDtcblwKLSAgICA7XG5cCi0gIH1cblwKLSAiLCIgIC5yZGF0YSA6IHtcblwKLSAgICAqKC5yZGF0YSlcblwKLSAgfVxuXAotICAuZGF0YSA6IHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gIC5saXQ4IDoge1xuXAotICAgICooLmxpdDgpXG5cCi0gIH1cblwKLSAgLmxpdDQgOiB7XG5cCi0gICAgKigubGl0NClcblwKLSAgfVxuXAotICIsIiAgLnNkYXRhIDoge1xuXAotICAgICooLnNkYXRhKVxuXAotICB9XG5cCi0gIC5zYnNzIDoge1xuXAotICAgICooLnNic3MpXG5cCi0gICAgKiguc2NvbW1vbilcblwKLSAgfVxuXAotICAuYnNzIDoge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgfVxuXAotfVxuXG4iLCBOVUxMKQotICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuCi0iT1VUUFVUX0ZPUk1BVChcImVjb2ZmLWJpZ21pcHNcIiwgXCJlY29mZi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlY29mZi1saXR0bGVtaXBzXCIpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtaWR0LWVjb2ZmL2xpYik7XG5cCi1FTlRSWShzdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC50ZXh0IDoge1xuXAotICAgIDtcblwKLSAgICAqKC5pbml0KVxuXAotICAgIDtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnJlbC5zZGF0YSlcblwKLSAgICAqKC5maW5pKVxuXAotICAgIDtcblwKLSAgICA7XG5cCi0gIH1cblwKLSAgLnJkYXRhIDoge1xuXAotICAgICooLnJkYXRhKVxuXAotICB9XG5cCi0gIC5kYXRhIDoge1xuXAotICAgICooLmRhdGEpXG5cCi0gIH1cblwKLSAgLmxpdDggOiB7XG5cCi0gICAgKigubGl0OClcblwKLSAgfVxuXAotICAubGl0NCA6IHtcblwKLSAgICAqKC5saXQ0KVxuXAotICB9XG5cCi0gIC5zZGF0YSA6IHtcblwKLSAgICAqKC5zZGF0YSlcblwKLSAgfVxuXAotICAuc2JzcyA6IHtcblwKLSAgICAqKC5zYnNzKVxuXAotICAgICooLnNjb21tb24pXG5cCi0gIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gIH1cblwKLX1cblxuIgotICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybgotY29uY2F0KAotIk9VVFBVVF9GT1JNQVQoXCJlY29mZi1iaWdtaXBzXCIsIFwiZWNvZmYtYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWNvZmYtbGl0dGxlbWlwc1wiKVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWlkdC1lY29mZi9saWIpO1xuXAotRU5UUlkoc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAuID0gMHhhMDAxMjAwMDtcblwKLSAgLnRleHQgOiB7XG5cCi0gICAgIF9mdGV4dCA9IC4gO1xuXAotICAgICooLmluaXQpXG5cCi0gICAgIGVwcm9sICA9ICAuO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0YXJ0ID0gLik7XG5cCi0gICAgKigucmVsLnNkYXRhKVxuXAotICAgIFBST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdG9wID0gLik7XG5cCi0gICAgKiguZmluaSlcblwKLSAgICAgZXRleHQgID0gIC47XG5cCi0gICAgIF9ldGV4dCAgPSAgLjtcblwKLSIsIiAgfVxuXAotICAuID0gLjtcblwKLSAgLnJkYXRhIDoge1xuXAotICAgICooLnJkYXRhKVxuXAotICB9XG5cCi0gICBfZmRhdGEgPSBBTElHTigxNik7XG5cCi0gIC5kYXRhIDoge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gIH1cblwKLSAgIF9ncCA9IEFMSUdOKDE2KSArIDB4ODAwMDtcblwKLSAgLmxpdDggOiB7XG5cCi0gICAgKigubGl0OClcblwKLSAgfVxuXAotICAubGl0NCA6IHtcblwKLSAgICAqKC5saXQ0KVxuXAotICB9XG5cCi0gIC5zZGF0YSA6IHtcblwKLSAgICAqKC5zZGF0YSlcblwKLSAgfVxuXAotIiwiICAgZWRhdGEgID0gIC47XG5cCi0gICBfZWRhdGEgID0gIC47XG5cCi0gICBfZmJzcyA9IC47XG5cCi0gIC5zYnNzIDoge1xuXAotICAgICooLnNic3MpXG5cCi0gICAgKiguc2NvbW1vbilcblwKLSAgfVxuXAotICAuYnNzIDoge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgfVxuXAotICAgZW5kID0gLjtcblwKLSAgIF9lbmQgPSAuO1xuXAotfVxuXG4iCi0sIE5VTEwpCi0gIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybgotY29uY2F0ICgKLSJPVVRQVVRfRk9STUFUKFwiZWNvZmYtYmlnbWlwc1wiLCBcImVjb2ZmLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVjb2ZmLWxpdHRsZW1pcHNcIilcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1pZHQtZWNvZmYvbGliKTtcblwKLUVOVFJZKHN0YXJ0KVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLiA9IDB4YTAwMTIwMDA7XG5cCi0gIC50ZXh0IDoge1xuXAotICAgICBfZnRleHQgPSAuIDtcblwKLSAgICAqKC5pbml0KVxuXAotICAgICBlcHJvbCAgPSAgLjtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgIFBST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdGFydCA9IC4pO1xuXAotICAgICooLnJlbC5zZGF0YSlcblwKLSAgICBQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RvcCA9IC4pO1xuXAotICAgICooLmZpbmkpXG5cCi0gICAgIGV0ZXh0ICA9ICAuO1xuXAotICAgICBfZXRleHQgID0gIC47XG5cCi0gIiwiICB9XG5cCi0gIC4gPSAuO1xuXAotICAucmRhdGEgOiB7XG5cCi0gICAgKigucmRhdGEpXG5cCi0gIH1cblwKLSAgIF9mZGF0YSA9IEFMSUdOKDE2KTtcblwKLSAgLmRhdGEgOiB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgfVxuXAotICAgX2dwID0gQUxJR04oMTYpICsgMHg4MDAwO1xuXAotICAubGl0OCA6IHtcblwKLSAgICAqKC5saXQ4KVxuXAotICIsIiAgfVxuXAotICAubGl0NCA6IHtcblwKLSAgICAqKC5saXQ0KVxuXAotICB9XG5cCi0gIC5zZGF0YSA6IHtcblwKLSAgICAqKC5zZGF0YSlcblwKLSAgfVxuXAotICAgZWRhdGEgID0gIC47XG5cCi0gICBfZWRhdGEgID0gIC47XG5cCi0gICBfZmJzcyA9IC47XG5cCi0gIC5zYnNzIDoge1xuXAotICAgICooLnNic3MpXG5cCi0gICAgKiguc2NvbW1vbilcblwKLSAiLCIgIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gIH1cblwKLSAgIGVuZCA9IC47XG5cCi0gICBfZW5kID0gLjtcblwKLX1cblxuIgotLCBOVUxMKQotICA7IGVsc2UgcmV0dXJuCi1jb25jYXQgKAotIk9VVFBVVF9GT1JNQVQoXCJlY29mZi1iaWdtaXBzXCIsIFwiZWNvZmYtYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWNvZmYtbGl0dGxlbWlwc1wiKVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWlkdC1lY29mZi9saWIpO1xuXAotRU5UUlkoc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAuID0gMHhhMDAxMjAwMDtcblwKLSAgLnRleHQgOiB7XG5cCi0gICAgIF9mdGV4dCA9IC4gO1xuXAotICAgICooLmluaXQpXG5cCi0gICAgIGVwcm9sICA9ICAuO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0YXJ0ID0gLik7XG5cCi0gICAgKigucmVsLnNkYXRhKVxuXAotICAgIFBST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdG9wID0gLik7XG5cCi0gICAgKiguZmluaSlcblwKLSAgICAgZXRleHQgID0gIC47XG5cCi0gICAgIF9ldGV4dCAgPSAgLjtcblwKLSAiLCIgIH1cblwKLSAgLiA9IC47XG5cCi0gIC5yZGF0YSA6IHtcblwKLSAgICAqKC5yZGF0YSlcblwKLSAgfVxuXAotICAgX2ZkYXRhID0gQUxJR04oMTYpO1xuXAotICAuZGF0YSA6IHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gICBfZ3AgPSBBTElHTigxNikgKyAweDgwMDA7XG5cCi0gIC5saXQ4IDoge1xuXAotICAgICooLmxpdDgpXG5cCi0gIH1cblwKLSAgLmxpdDQgOiB7XG5cCi0gICAgKigubGl0NClcblwKLSAiLCIgIH1cblwKLSAgLnNkYXRhIDoge1xuXAotICAgICooLnNkYXRhKVxuXAotICB9XG5cCi0gICBlZGF0YSAgPSAgLjtcblwKLSAgIF9lZGF0YSAgPSAgLjtcblwKLSAgIF9mYnNzID0gLjtcblwKLSAgLnNic3MgOiB7XG5cCi0gICAgKiguc2JzcylcblwKLSAgICAqKC5zY29tbW9uKVxuXAotICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gICBlbmQgPSAuO1xuXAotICAgX2VuZCA9IC47XG5cCi19XG5cbiIKLSwgTlVMTCkKLTsgfQotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX21pcHNpZHRfZW11bGF0aW9uID0gCi17Ci0gIGdsZG1pcHNpZHRfYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZG1pcHNpZHRfYWZ0ZXJfb3BlbiwKLSAgZ2xkbWlwc2lkdF9hZnRlcl9hbGxvY2F0aW9uLAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGRtaXBzaWR0X2dldF9zY3JpcHQsCi0gICJtaXBzaWR0IiwKLSAgImVjb2ZmLWJpZ21pcHMiCi19OwpkaWZmIC0tZ2l0IGEvbGQvbXB3LW1ha2Uuc2VkIGIvbGQvbXB3LW1ha2Uuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTE5NzA4Li4wMDAwMDAwCi0tLSBhL2xkL21wdy1tYWtlLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLSMgU2VkIGNvbW1hbmRzIHRvIGZpbmlzaCB0cmFuc2xhdGluZyB0aGUgbGQgTWFrZWZpbGUuaW4gaW50byBNUFcgc3ludGF4LgotCi0vSERFRklORVMvcy9ASERFRklORVNALy8KLQotL150YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQC9zL14vIy8KLQotL15FTVVMID0gQEVNVUxAL3MvXi8jLwotCi0vXkVNVUxBVElPTl9PRklMRVMgPSBARU1VTEFUSU9OX09GSUxFU0Avcy9eLyMvCi0KLSMgRml4YWRkIHRvIHRoZSBpbmNsdWRlIHBhdGhzLgotL15JTkNMVURFUyA9IC4qJC9zLyQvIC1pICJ7SU5DRElSfSI6bXB3OiAtaSA6OmV4dHJhLWluY2x1ZGU6LwotL0JGRERJUi9zLy1pIHtCRkRESVJ9IC8taSAie0JGRERJUn0iOiAvCi0vSU5DRElSL3MvLWkge0lOQ0RJUn0gLy1pICJ7SU5DRElSfSI6IC8KLQotIyBVc2UgYnlhY2MgaW5zdGVhZCBvZiBiaXNvbiAoZm9yIG5vdyBhbnl3YXkpLgotL0JJU09OL3MvXkJJU09OID0uKiQvQklTT04gPSBieWFjYy8KLSMvQklTT05GTEFHUy9zL15CSVNPTkZMQUdTID0uKiQvQklTT05GTEFHUyA9IC8KLQotIyBTdXBwcmVzcyB0aGUgc3VwcHJlc3Npb24gb2Ygc21hcnQgbWFrZXMuCi0vXlwueVwuYy9kCi0KLSMgSGFjayB1cCBsZG1haW4gY29tcGlsZS4KLS9eIntvfSJsZG1haW4uYy5vIFxcT3B0aW9uLWYgLiogY29uZmlnLnN0YXR1cyQvLC9eJC9jXAotIntvfSJsZG1haW4uYy5vIFxcT3B0aW9uLWYgICJ7c30ibGRtYWluLmNcCi0Je0NDfSBAREFTSF9DX0ZMQUdAIC1kIERFRkFVTFRfRU1VTEFUSU9OPXtkcX17RU1VTH17ZHF9IC1kIFNDUklQVERJUj17ZHF9e3NjcmlwdGRpcn17ZHF9IHtBTExfQ0ZMQUdTfSAie3N9ImxkbWFpbi5jIC1vICJ7b30ibGRtYWluLmMub1wKLQotCi0jIFJlbW92ZSBsZGVtdWwtbGlzdC5oIGJ1aWxkLCByZWx5IG9uIGNvbmZpZ3VyZSB0byBtYWtlIG9uZS4KLS9ebGRlbXVsLWxpc3QuaCAvLC9SZW5hbWUgLXkgIntzfSJsZGVtdWwtdG1wLmggL2QKLQotIyBGaXggcGF0aG5hbWVzIHRvIGdlbmVyYXRlZCBmaWxlcy4KLS9jb25maWcuaC9zLyJ7c30iY29uZmlnXC5oLyJ7b30iY29uZmlnLmgvZwotL2NvbmZpZy5oL3MvXmNvbmZpZ1wuaC8ie299ImNvbmZpZy5oLwotCi0veS50YWIuYy9zLyJ7c30ieVwudGFiXC5jLyJ7b30ieS50YWIuYy9nCi0veS50YWIuYy9zL155XC50YWJcLmMvIntvfSJ5LnRhYi5jLwotL3kudGFiLmgvcy8ie3N9InlcLnRhYlwuaC8ie299InkudGFiLmgvZwotL3kudGFiLmgvcy9eeVwudGFiXC5oLyJ7b30ieS50YWIuaC8KLQotL2xkZ3JhbS5jL3MvIntzfSJsZGdyYW1cLmMvIntvfSJsZGdyYW0uYy9nCi0vbGRncmFtLmMvcy9ebGRncmFtXC5jLyJ7b30ibGRncmFtLmMvCi0KLS9sZGdyYW0uaC9zLyJ7c30ibGRncmFtXC5oLyJ7b30ibGRncmFtLmgvZwotL2xkZ3JhbS5oL3MvXmxkZ3JhbVwuaC8ie299ImxkZ3JhbS5oLwotCi0vbGRsZXguYy9zLyJ7c30ibGRsZXhcLmMvIntvfSJsZGxleC5jL2cKLS9sZGxleC5jL3MvXmxkbGV4XC5jLyJ7b30ibGRsZXguYy8KLQotL2xkbGV4LmMubmV3L3MvIntzfSJsZGxleFwuY1wubmV3LyJ7b30ibGRsZXguYy5uZXcvZwotCi0vbGV4Lnl5LmMvcy8ie3N9ImxleFwueXlcLmMvIntvfSJsZXgueXkuYy9nCi0KLS9sZGVtdWwtbGlzdC5oL3MvIntzfSJsZGVtdWwtbGlzdFwuaC8ie299ImxkZW11bC1saXN0LmgvZwotL2xkZW11bC1saXN0Lmgvcy9ebGRlbXVsLWxpc3RcLmgvIntvfSJsZGVtdWwtbGlzdC5oLwotCi0jIEVkaXQgcGF0aG5hbWVzIHRvIGVtdWxhdGlvbiBmaWxlcy4KLS8ie3N9ImUuKlwuYy9zLyJ7c30iZVwoWy1fYS16MC05XSpcKVwuYy8ie299ImVcMS5jL2cKLS9eZS4qXC5jL3MvXmVcKFstX2EtejAtOV0qXClcLmMvIntvfSJlXDEuYy8KLQotIyBXZSBjYW4ndCBydW4gZ2Vuc2NyaXB0cywgc28gZG9uJ3QgdHJ5LgotL3tHRU5TQ1JJUFRTfS9zL3tHRU5TQ1JJUFRTfS9udWxsLWNvbW1hbmQvCi0KLSMgQ29tbWVudCBvdXQgdGhlIFRESVJTIGJpdHMuCi0vXlRESVJTQC9zL14vIy8KLQotIyBQb2ludCBhdCB0aGUgQkZEIGxpYnJhcnkgZGlyZWN0bHkuCi0vQEJGRExJQkAvcy9AQkZETElCQC86OmJmZDpsaWJiZmQuby8KLQotIyBEb24ndCBuZWVkIHRoaXMuCi0vQEhMREZMQUdTQC9zL0BITERGTEFHU0AvLwotCi0jL3NlZC4qZnJlZS8sLz4gIntvfSJsZGxleC5jLm5ldy9jXAotIwlcCUNhdGVuYXRlICJ7b30ibGV4Lnl5LmMgPiJ7b30ibGRsZXguYy5uZXcKLQotIyBUaGUgcmVzb3VyY2UgZmlsZSBpcyBjYWxsZWQgbWFjLWxkLnIuCi0ve0xEX1BST0d9LnIvcy97TERfUFJPR31cLnIvbWFjLWxkLnIvCi0KLS9eaW5zdGFsbCBcXE9wdGlvbi1mIC8sL14kL2NcCi1pbnN0YWxsIFxcT3B0aW9uLWYgIGFsbCBpbnN0YWxsLW9ubHlcCi1cCi1pbnN0YWxsLW9ubHkgXFxPcHRpb24tZlwKLQlOZXdGb2xkZXJSZWN1cnNpdmUgIntiaW5kaXJ9IlwKLQlEdXBsaWNhdGUgLXkgOmxkLm5ldyAie2JpbmRpcn0ibGRcCi0KLQotIyBSZW1vdmUgZGVwZW5kZW5jeSByZWJ1aWxkaW5nIGNydWQuCi0vXi5kZXAgLywvIyAuUEhPTlkgL2QKLQotIyBSZW1vdmUgdGhlIGxpbnRsb2cgYWN0aW9uLCBwaXBlIHN5bWJvbHMgaW4gY29sdW1uIDEgbG9zZS4KLS9ebGludGxvZyBcXE9wdGlvbi1mLywvXiQvZAotCi0vXk1ha2VmaWxlIFxcT3B0aW9uLWYvLC9eJC9kCi0vXiJ7b30iY29uZmlnLmggXFxPcHRpb24tZi8sL14kL2QKLS9eY29uZmlnLnN0YXR1cyBcXE9wdGlvbi1mLywvXiQvZApkaWZmIC0tZ2l0IGEvbGQvbXJpLmMgYi9sZC9tcmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhYWVhMi4uMDAwMDAwMAotLS0gYS9sZC9tcmkuYworKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKiBtcmkuYyAtLSBoYW5kbGUgTVJJIHN0eWxlIGxpbmtlciBzY3JpcHRzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGlzIGJpdCBkb2VzIHRoZSB0cmVlIGRlY29yYXRpb24gd2hlbiBNUkkgc3R5bGUgbGluayBzY3JpcHRzIGFyZSBwYXJzZWQgKi8KLQotLyoKLSAgY29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgCQkgc2FjQGN5Z251cy5jb20KLQotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIiAKLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibXJpLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLXN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0IHsKLSAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKm5leHQ7Ci0gIENPTlNUIGNoYXIgKm5hbWU7Ci0gIENPTlNUIGNoYXIgKmFsaWFzOwotICBldHJlZV90eXBlICp2bWE7Ci0gIGV0cmVlX3R5cGUgKmFsaWduOwotICBldHJlZV90eXBlICpzdWJhbGlnbjsKLSAgaW50IG9rX3RvX2xvYWQ7Ci19IDsKLQotdW5zaWduZWQgaW50IHN5bWJvbF90cnVuY2F0ZSA9IDEwMDAwOwotc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKm9yZGVyOwotc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKm9ubHlfbG9hZDsKLXN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICphZGRyZXNzOwotc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKmFsaWFzOwotCi1zdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqYWxpZ25tZW50Owotc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKnN1YmFsaWdubWVudDsKLQotc3RhdGljIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqbG9va3VwCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqbGlzdCkpOwotc3RhdGljIHZvaWQgbXJpX2FkZF90b19saXN0IFBBUkFNUyAoKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqbGlzdCwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGV0cmVlX3R5cGUgKnZtYSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKnphbGlhcywgZXRyZWVfdHlwZSAqYWxpZ24sCi0JCQkJICAgICBldHJlZV90eXBlICpzdWJhbGlnbikpOwotCi1zdGF0aWMgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKioKLWxvb2t1cCAobmFtZSwgbGlzdCkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKipsaXN0OwotewotCi0gIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqcHRyID0gbGlzdDsKLSAgd2hpbGUgKCpwdHIpIAotICB7Ci0gICAgaWYgKHN0cmNtcChuYW1lLCAoKnB0ciktPm5hbWUpID09IDApIHsKLSAgICAgIC8qIElmIHRoaXMgaXMgYSBtYXRjaCwgZGVsZXRlIGl0LCB3ZSBvbmx5IGtlZXAgdGhlIGxhc3QgaW5zdGFuY2UKLQkgb2YgYW55IG5hbWUgKi8KLSAgICAgICpwdHIgPSAoKnB0ciktPm5leHQ7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcHRyID0gJigoKnB0ciktPm5leHQpOwotICAgIH0KLSAgfQotCi0gICpwdHIgPSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKil4bWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCkpOwotICByZXR1cm4gcHRyOwotfQotCi1zdGF0aWMgdm9pZAotbXJpX2FkZF90b19saXN0IChsaXN0LCBuYW1lLCB2bWEsIHphbGlhcywgYWxpZ24sIHN1YmFsaWduKQotICAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKmxpc3Q7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGV0cmVlX3R5cGUgKnZtYTsKLSAgICAgQ09OU1QgY2hhciAqemFsaWFzOwotICAgICBldHJlZV90eXBlICphbGlnbjsKLSAgICAgZXRyZWVfdHlwZSAqc3ViYWxpZ247Ci17Ci0gIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqcHRyID0gbG9va3VwKG5hbWUsbGlzdCk7Ci0gICgqcHRyKS0+bmFtZSA9IG5hbWU7Ci0gICgqcHRyKS0+dm1hID0gdm1hOwotICAoKnB0ciktPm5leHQgPSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKilOVUxMOwotICAoKnB0ciktPm9rX3RvX2xvYWQgPSAwOwotICAoKnB0ciktPmFsaWFzID0gemFsaWFzOwotICAoKnB0ciktPmFsaWduID0gYWxpZ247Ci0gICgqcHRyKS0+c3ViYWxpZ24gPSBzdWJhbGlnbjsKLX0KLQotCi12b2lkCi1tcmlfb3V0cHV0X3NlY3Rpb24gKG5hbWUsIHZtYSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZXRyZWVfdHlwZSAqdm1hOwotewotICBtcmlfYWRkX3RvX2xpc3QoJmFkZHJlc3MsIG5hbWUsIHZtYSwgMCwwLDApOwotfQotCi0vKiBpZiBhbnkgQUJTT0xVVEUgPG5hbWU+IGFyZSBpbiB0aGUgc2NyaXB0LCBvbmx5IGxvYWQgdGhvc2UgZmlsZXMKLW1hcmtlZCB0aHVzICovCi0KLXZvaWQKLW1yaV9vbmx5X2xvYWQgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIG1yaV9hZGRfdG9fbGlzdCgmb25seV9sb2FkLCBuYW1lLCAwLCAwLDAsMCk7Ci19Ci0KLQotdm9pZAotbXJpX2Jhc2UgKGV4cCkKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBiYXNlID0gZXhwOwotfQotCi1zdGF0aWMgaW50IGRvbmVfdHJlZSA9IDA7Ci0KLXZvaWQKLW1yaV9kcmF3X3RyZWUgKCkKLXsKLSAgaWYgKGRvbmVfdHJlZSkgcmV0dXJuOwotCi0gIC8qIFdlIGRvbid0IGJvdGhlciB3aXRoIG1lbW9yeSByZWdpb25zLiAgKi8KLSNpZiAwCi0gIC8qIENyZWF0ZSB0aGUgcmVnaW9ucyAqLwotIHsKLSAgIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpyOwotICAgciA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAoImxvbmciKTsKLSAgIHItPmN1cnJlbnQgPSByLT5vcmlnaW4gPSBleHBfZ2V0X3ZtYShiYXNlLCAoYmZkX3ZtYSkwLCAib3JpZ2luIiwKLQkJCQkJbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKLSAgIHItPmxlbmd0aCA9IChiZmRfc2l6ZV90eXBlKSBleHBfZ2V0X3ZtYSgwLCAoYmZkX3ZtYSkgfigoYmZkX3NpemVfdHlwZSkwKSwKLQkJCQkJICAgImxlbmd0aCIsIGxhbmdfZmlyc3RfcGhhc2VfZW51bSk7Ci0gfQotI2VuZGlmCi0gIAotICAvKiBOb3cgYnVpbGQgdGhlIHN0YXRlbWVudHMgZm9yIHRoZSBsZGxhbmcgbWFjaGluZSAqLwotCi0KLSAgLyogQXR0YXRjaCB0aGUgYWRkcmVzc2VzIG9mIGFueSB3aGljaCBoYXZlIGFkZHJlc3NlcywgYW5kIGFkZCB0aGUKLSAgICAgb25lcyBub3QgbWVudGlvbmVkICovCi0gIGlmIChhZGRyZXNzICE9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKU5VTEwpIHsKLSAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqYWxpc3Q7Ci0gICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKm9saXN0OwotICAgIGlmIChvcmRlciA9PSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKilOVUxMKSB7Ci0gICAgICBvcmRlciA9IGFkZHJlc3M7Ci0gICAgfQotCi0gICAgZm9yIChhbGlzdCA9IGFkZHJlc3M7Ci0JIGFsaXN0ICE9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCopTlVMTDsKLQkgYWxpc3QgPSBhbGlzdC0+bmV4dCkgCi0gICAgewotICAgICAgaW50IGRvbmUgPSAwOwotICAgICAgZm9yIChvbGlzdCA9IG9yZGVyOwotCSAgIGRvbmUgPT0gMCAmJgotCSAgIG9saXN0ICE9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKU5VTEw7Ci0JICAgb2xpc3QgPSBvbGlzdC0+bmV4dCkgCi0gICAgICB7Ci0JaWYgKHN0cmNtcChhbGlzdC0+bmFtZSwgb2xpc3QtPm5hbWUpID09IDApIAotCXsKLQkgIG9saXN0LT52bWEgPSBhbGlzdC0+dm1hOwotCSAgZG9uZSA9IDE7Ci0JfQotICAgICAgfQotICAgICAgaWYgKCFkb25lKSB7Ci0JLyogYWRkIHRoaXMgb250byBlbmQgb2Ygb3JkZXIgbGlzdCAqLwotCW1yaV9hZGRfdG9fbGlzdCgmb3JkZXIsIGFsaXN0LT5uYW1lLCBhbGlzdC0+dm1hLCAwLDAsMCk7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgfQotCi0gIC8qIElmIHdlJ3JlIG9ubHkgc3VwcG9zZWQgdG8gbG9hZCBhIHN1YnNldCBvZiB0aGVtIGluLCB0aGVuIHBydW5lCi0gICAgIHRoZSBsaXN0LiAgKi8KLQotICBpZiAob25seV9sb2FkICE9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKU5VTEwpIAotICB7Ci0gICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKnB0cjE7Ci0gICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKnB0cjI7Ci0gICAgaWYgKG9yZGVyID09IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCopTlVMTCkKLSAgICAgb3JkZXIgPSBvbmx5X2xvYWQ7Ci0gICAgCi0gICAgLyogU2VlIGlmIHRoaXMgbmFtZSBpcyBpbiB0aGUgbGlzdCwgaWYgaXQgaXMgdGhlbiB3ZSBjYW4gbG9hZCBpdAotICAgICAqLwotICAgIGZvciAocHRyMSA9IG9ubHlfbG9hZDsgcHRyMTsgcHRyMSA9IHB0cjEtPm5leHQpIAotICAgIHsKLSAgICAgIGZvciAocHRyMj0gb3JkZXI7IHB0cjI7IHB0cjI9cHRyMi0+bmV4dCkgCi0gICAgICB7Ci0JaWYgKHN0cmNtcChwdHIyLT5uYW1lLCBwdHIxLT5uYW1lKT09MCkgewotCSAgcHRyMi0+b2tfdG9fbG9hZCA9IDE7Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotICBlbHNlIAotICB7Ci0gICAgLyogTm8gb25seSBsb2FkIGxpc3QsIHNvIGV2ZXJ5dGhpbmcgaXMgb2sgdG8gbG9hZCAqLwotICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpwdHI7Ci0gICAgZm9yIChwdHIgPSBvcmRlcjsgcHRyOyBwdHI9cHRyLT5uZXh0KSB7Ci0gICAgICBwdHItPm9rX3RvX2xvYWQgPSAxOwotICAgIH0KLSAgfQotCi0KLQotICAvKiBDcmVhdGUgdGhlIG9yZGVyIG9mIHNlY3Rpb25zIHRvIGxvYWQgKi8KLSAgaWYgKG9yZGVyICE9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKU5VTEwpIAotICB7Ci0gICAgLyogQmVlbiB0b2xkIHRvIG91dHB1dCB0aGUgc2VjdGlvbnMgaW4gYSBjZXJ0YWluIG9yZGVyICovCi0gICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKnAgPSBvcmRlcjsKLSAgICB3aGlsZSAocCkgCi0gICAgewotICAgICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKmFwdHI7Ci0gICAgICBldHJlZV90eXBlICphbGlnbiA9IDA7Ci0gICAgICBldHJlZV90eXBlICpzdWJhbGlnbiA9IDA7Ci0gICAgICAvKiBTZWUgaWYgYW4gYWxpZ25tZW50IGhhcyBiZWVuIHNwZWNpZmllZCAqLwotCi0gICAgICBmb3IgKGFwdHIgPSBhbGlnbm1lbnQ7IGFwdHI7IGFwdHI9IGFwdHItPm5leHQpCi0gICAgICB7Ci0JaWYgKHN0cmNtcChhcHRyLT5uYW1lLCBwLT5uYW1lKT09MCkgewotCSAgYWxpZ24gPSAgYXB0ci0+YWxpZ247Ci0JfQotICAgICAgfQotCi0gICAgICBmb3IgKGFwdHIgPSBzdWJhbGlnbm1lbnQ7IGFwdHI7IGFwdHI9IGFwdHItPm5leHQpCi0gICAgICB7Ci0JaWYgKHN0cmNtcChhcHRyLT5uYW1lLCBwLT5uYW1lKT09MCkgewotCSAgc3ViYWxpZ24gPSAgYXB0ci0+c3ViYWxpZ247Ci0JfQotICAgICAgfQotCi0gICAgICBpZiAoYmFzZSA9PSAwKSB7Ci0JYmFzZSA9IHAtPnZtYSA/IHAtPnZtYSA6ZXhwX25hbWVvcChOQU1FLCAiLiIpOwotICAgICAgfQotICAgICAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKHAtPm5hbWUsIGJhc2UsCi0JCQkJCSAgIHAtPm9rX3RvX2xvYWQgPyAwIDogbm9sb2FkX3NlY3Rpb24sCi0JCQkJCSAgIDEsIGFsaWduLCBzdWJhbGlnbiwKLQkJCQkJICAgKGV0cmVlX3R5cGUgKikgTlVMTCk7Ci0gICAgICBiYXNlID0gMDsKLSAgICAgIGxhbmdfYWRkX3dpbGQgKHAtPm5hbWUsIGZhbHNlLCAoY2hhciAqKU5VTEwsIGZhbHNlLCBmYWxzZSwgTlVMTCk7Ci0gICAgICAvKiBJZiB0aGVyZSBpcyBhbiBhbGlhcyBmb3IgdGhpcyBzZWN0aW9uLCBhZGQgaXQgdG9vICovCi0gICAgICBmb3IgKGFwdHIgPSBhbGlhczsgYXB0cjsgYXB0ciA9IGFwdHItPm5leHQpIHsKLQotCWlmIChzdHJjbXAoYXB0ci0+YWxpYXMsIHAtPm5hbWUpPT0gMCkgewotCSAgbGFuZ19hZGRfd2lsZCAoYXB0ci0+bmFtZSwgZmFsc2UsIChjaGFyICopTlVMTCwgZmFsc2UsIGZhbHNlLCBOVUxMKTsKLQl9Ci0gICAgICB9Ci0KLSAgICAgIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Ci0JKDAsICIqZGVmYXVsdCoiLCAoc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICopIE5VTEwpOwotCi0gICAgICBwID0gcC0+bmV4dDsKLSAgICB9Ci0gIH0KLQotCi0gIGRvbmVfdHJlZSA9IDE7Ci0KLX0KLXZvaWQKLW1yaV9sb2FkIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBiYXNlID0gMDsKLSAgbGFuZ19hZGRfaW5wdXRfZmlsZShuYW1lLAotCQkgICAgICBsYW5nX2lucHV0X2ZpbGVfaXNfZmlsZV9lbnVtLCAoY2hhciAqKU5VTEwpOwotICAvKiAgbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQoMCwiKmRlZmF1bHQqIik7Ki8KLX0KLQotCi12b2lkCi1tcmlfb3JkZXIgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIG1yaV9hZGRfdG9fbGlzdCgmb3JkZXIsIG5hbWUsIDAsIDAsMCwwKTsKLX0KLQotdm9pZCAKLW1yaV9hbGlhcyAod2FudCwgaXMsIGlzbikKLSAgICAgQ09OU1QgY2hhciAqd2FudDsKLSAgICAgQ09OU1QgY2hhciAqaXM7Ci0gICAgIGludCBpc247Ci17Ci0gIGlmICghaXMpIHsKLSAgICAvKiBTb21lIHNlY3Rpb25zIGFyZSBkaWdpdHMgLSAqLwotICAgIGNoYXIgYnVmWzIwXTsKLSAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgaXNuKTsKLSAgICBpcyA9IHhzdHJkdXAgKGJ1Zik7Ci0gICAgaWYgKGlzID09IE5VTEwpCi0gICAgICBhYm9ydCAoKTsKLSAgfQotICBtcmlfYWRkX3RvX2xpc3QoJmFsaWFzLCBpcywgMCwgd2FudCwwLDApOwotCi19Ci0KLQotdm9pZCAKLW1yaV9uYW1lIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBsYW5nX2FkZF9vdXRwdXQobmFtZSwgMSk7Ci0KLX0KLQotCi12b2lkCi1tcmlfZm9ybWF0IChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBpZiAoc3RyY21wKG5hbWUsICJTIikgPT0gMCkKLSAgewotICAgIGxhbmdfYWRkX291dHB1dF9mb3JtYXQoInNyZWMiLCAoY2hhciAqKSBOVUxMLCAoY2hhciAqKSBOVUxMLCAxKTsKLSAgfQotICBlbHNlIGlmIChzdHJjbXAobmFtZSwgIklFRUUiKSA9PSAwKQotICB7Ci0gICAgbGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCgiaWVlZSIsIChjaGFyICopIE5VTEwsIChjaGFyICopIE5VTEwsIDEpOwotICB9Ci0gIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiQ09GRiIpID09IDApCi0gIHsKLSAgICBsYW5nX2FkZF9vdXRwdXRfZm9ybWF0KCJjb2ZmLW02OGsiLCAoY2hhciAqKSBOVUxMLCAoY2hhciAqKSBOVUxMLCAxKTsKLSAgfQotICBlbHNlIHsKLSAgICBlaW5mbyhfKCIlUCVGOiB1bmtub3duIGZvcm1hdCB0eXBlICVzXG4iKSwgbmFtZSk7Ci0gIH0KLX0KLQotCi12b2lkCi1tcmlfcHVibGljIChuYW1lLCBleHApCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgbGFuZ19hZGRfYXNzaWdubWVudChleHBfYXNzb3AoJz0nLCBuYW1lLCBleHApKTsKLX0KLQotdm9pZCAKLW1yaV9hbGlnbiAobmFtZSwgZXhwKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIG1yaV9hZGRfdG9fbGlzdCgmYWxpZ25tZW50LCBuYW1lLDAsMCxleHAsMCk7Ci19Ci0KLXZvaWQgCi1tcmlfYWxpZ25tb2QgKG5hbWUsIGV4cCkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBtcmlfYWRkX3RvX2xpc3QoJnN1YmFsaWdubWVudCwgbmFtZSwwLDAsMCxleHApOwotfQotCi0KLXZvaWQgCi1tcmlfdHJ1bmNhdGUgKGV4cCkKLSAgICAgdW5zaWduZWQgaW50IGV4cDsKLXsKLSAgc3ltYm9sX3RydW5jYXRlID0gZXhwOwotfQpkaWZmIC0tZ2l0IGEvbGQvbXJpLmggYi9sZC9tcmkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMzZjBmMy4uMDAwMDAwMAotLS0gYS9sZC9tcmkuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIG1yaS5oIC0tIGhlYWRlciBmaWxlIGZvciBNUkkgc2NyaXB0aW5nIGZ1bmN0aW9ucwotICAgQ29weXJpZ2h0IDE5OTMsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIE1SSV9ICi0jZGVmaW5lIE1SSV9ICi0KLWV4dGVybiB1bnNpZ25lZCBpbnQgc3ltYm9sX3RydW5jYXRlOwotCi1leHRlcm4gdm9pZCBtcmlfb3V0cHV0X3NlY3Rpb24gUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgZXRyZWVfdHlwZSAqdm1hKSk7Ci1leHRlcm4gdm9pZCBtcmlfb25seV9sb2FkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLWV4dGVybiB2b2lkIG1yaV9iYXNlIFBBUkFNUyAoKGV0cmVlX3R5cGUgKmV4cCkpOwotZXh0ZXJuIHZvaWQgbXJpX2xvYWQgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotZXh0ZXJuIHZvaWQgbXJpX29yZGVyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLWV4dGVybiB2b2lkIG1yaV9hbGlhcyBQQVJBTVMgKChjb25zdCBjaGFyICp3YW50LCBjb25zdCBjaGFyICppcywgaW50IGlzbikpOwotZXh0ZXJuIHZvaWQgbXJpX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotZXh0ZXJuIHZvaWQgbXJpX2Zvcm1hdCBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci1leHRlcm4gdm9pZCBtcmlfcHVibGljIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGV0cmVlX3R5cGUgKmV4cCkpOwotZXh0ZXJuIHZvaWQgbXJpX2FsaWduIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGV0cmVlX3R5cGUgKmV4cCkpOwotZXh0ZXJuIHZvaWQgbXJpX2FsaWdubW9kIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGV0cmVlX3R5cGUgKmV4cCkpOwotZXh0ZXJuIHZvaWQgbXJpX3RydW5jYXRlIFBBUkFNUyAoKHVuc2lnbmVkIGludCBleHApKTsKLWV4dGVybiB2b2lkIG1yaV9kcmF3X3RyZWUgUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL3BlLWRsbC5jIGIvbGQvcGUtZGxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NTJkNjYuLjAwMDAwMDAKLS0tIGEvbGQvcGUtZGxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzg2ICswLDAgQEAKLS8qIFJvdXRpbmVzIHRvIGhlbHAgYnVpbGQgUEVJLWZvcm1hdCBETExzIChXaW4zMiBldGMpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IERKIERlbG9yaWUgPGRqQGN5Z251cy5jb20+Ci0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZHdyaXRlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIi4uL2JmZC9saWJjb2ZmLmgiCi0jaW5jbHVkZSAiZGVmZmlsZS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBUaGlzIGZpbGUgdHVybnMgYSByZWd1bGFyIFdpbmRvd3MgUEUgaW1hZ2UgaW50byBhIERMTC4gIEJlY2F1c2Ugb2YKLSB0aGUgY29tcGxleGl0eSBvZiB0aGlzIG9wZXJhdGlvbiwgaXQgaGFzIGJlZW4gYnJva2VuIGRvd24gaW50byBhCi0gbnVtYmVyIG9mIHNlcGFyYXRlIG1vZHVsZXMgd2hpY2ggYXJlIGFsbCBjYWxsZWQgYnkgdGhlIG1haW4gZnVuY3Rpb24KLSBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlLWVudHJhbnQgYW5kIGlzCi0gbm9ybWFsbHkgb25seSBjYWxsZWQgb25jZSwgc28gc3RhdGljIHZhcmlhYmxlcyBhcmUgdXNlZCB0byByZWR1Y2UKLSB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYW5kIHJldHVybiB2YWx1ZXMgcmVxdWlyZWQuCi0KLSBTZWUgYWxzbzogbGQvZW11bHRlbXBsL3BlLmVtCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGZvciBlbXVsdGVtcGwvcGUuZW0gKi8KLQotZGVmX2ZpbGUgKnBlX2RlZl9maWxlID0gMDsKLWludCBwZV9kbGxfZXhwb3J0X2V2ZXJ5dGhpbmcgPSAwOwotaW50IHBlX2RsbF9kb19kZWZhdWx0X2V4Y2x1ZGVzID0gMTsKLWludCBwZV9kbGxfa2lsbF9hdHMgPSAwOwotaW50IHBlX2RsbF9zdGRjYWxsX2FsaWFzZXMgPSAwOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBzdGF0aWMgdmFyaWFibGVzIGFuZCB0eXBlcwotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYmZkX3ZtYSBpbWFnZV9iYXNlOwotCi1zdGF0aWMgYmZkICpmaWxsZXJfYmZkOwotc3RhdGljIHN0cnVjdCBzZWMgKmVkYXRhX3MsICpyZWxvY19zOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKmVkYXRhX2QsICpyZWxvY19kOwotc3RhdGljIGludCBlZGF0YV9zeiwgcmVsb2Nfc3o7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqdGFyZ2V0X25hbWU7Ci0gIGNoYXIgKm9iamVjdF90YXJnZXQ7Ci0gIGludCBpbWFnZWJhc2VfcmVsb2M7Ci0gIGludCBwZV9hcmNoOwotICBpbnQgYmZkX2FyY2g7Ci0gIGludCB1bmRlcnNjb3JlZDsKLX0gcGVfZGV0YWlsc190eXBlOwotCi0jZGVmaW5lIFBFX0FSQ0hfaTM4NgkxCi0KLXN0YXRpYyBwZV9kZXRhaWxzX3R5cGUgcGVfZGV0YWlsX2xpc3RbXSA9IHsKLSAgewotICAgICJwZWktaTM4NiIsCi0gICAgInBlLWkzODYiLAotICAgIDcgLyogUl9JTUFHRUJBU0UgKi8sCi0gICAgUEVfQVJDSF9pMzg2LAotICAgIGJmZF9hcmNoX2kzODYsCi0gICAgMQotICB9LAotICB7IDAgfQotfTsKLQotc3RhdGljIHBlX2RldGFpbHNfdHlwZSAqcGVfZGV0YWlsczsKLQotI2RlZmluZSBVKHN0cikgKHBlX2RldGFpbHMtPnVuZGVyc2NvcmVkID8gIl8iIHN0ciA6IHN0cikKLQotdm9pZAotcGVfZGxsX2lkX3RhcmdldCAodGFyZ2V0KQotICAgICBjaGFyICp0YXJnZXQ7Ci17Ci0gIGludCBpOwotICBmb3IgKGk9MDsgcGVfZGV0YWlsX2xpc3RbaV0udGFyZ2V0X25hbWU7IGkrKykKLSAgICBpZiAoc3RyY21wIChwZV9kZXRhaWxfbGlzdFtpXS50YXJnZXRfbmFtZSwgdGFyZ2V0KSA9PSAwKQotICAgICAgewotCXBlX2RldGFpbHMgPSBwZV9kZXRhaWxfbGlzdCtpOwotCXJldHVybjsKLSAgICAgIH0KLSAgZWluZm8gKF8oIiVYVW5zdXBwb3J0ZWQgUEVJIGFyY2hpdGVjdHVyZTogJXNcbiIpLCB0YXJnZXQpOwotICBleGl0ICgxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gSGVscGVyIGZ1bmN0aW9ucyBmb3IgcXNvcnQuICBSZWxvY3MgbXVzdCBiZSBzb3J0ZWQgc28gdGhhdCB3ZSBjYW4gd3JpdGUKLSB0aGVtIG91dCBieSBwYWdlcy4KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBiZmRfdm1hIHZtYTsKLSAgY2hhciB0eXBlOwotICBzaG9ydCBleHRyYTsKLX0gcmVsb2NfZGF0YV90eXBlOwotCi1zdGF0aWMgaW50Ci1yZWxvY19zb3J0ICh2YSwgdmIpCi0gICAgIGNvbnN0IHZvaWQgKnZhLCAqdmI7Ci17Ci0gIGJmZF92bWEgYSA9ICgocmVsb2NfZGF0YV90eXBlICopIHZhKS0+dm1hOwotICBiZmRfdm1hIGIgPSAoKHJlbG9jX2RhdGFfdHlwZSAqKSB2YiktPnZtYTsKLSAgcmV0dXJuIChhID4gYikgPyAxIDogKChhIDwgYikgPyAtMSA6IDApOwotfQotCi1zdGF0aWMgaW50Ci1wZV9leHBvcnRfc29ydCAodmEsIHZiKQotICAgICBjb25zdCB2b2lkICp2YSwgKnZiOwotewotICBkZWZfZmlsZV9leHBvcnQgKmEgPSAoZGVmX2ZpbGVfZXhwb3J0ICopIHZhOwotICBkZWZfZmlsZV9leHBvcnQgKmIgPSAoZGVmX2ZpbGVfZXhwb3J0ICopIHZiOwotICByZXR1cm4gc3RyY21wIChhLT5uYW1lLCBiLT5uYW1lKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gUmVhZCBhbmQgcHJvY2VzcyB0aGUgLkRFRiBmaWxlCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZXNlIGNvcnJlc3BvbmQgdG8gdGhlIGVudHJpZXMgaW4gcGVfZGVmX2ZpbGUtPmV4cG9ydHNbXS4gIEkgdXNlCi0gICBleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnNbaV0gdG8gdGFnIHdoZXRoZXIgb3Igbm90IHRoZSBzeW1ib2wgd2FzCi0gICBkZWZpbmVkLCBzaW5jZSB3ZSBjYW4ndCBleHBvcnQgc3ltYm9scyB3ZSBkb24ndCBoYXZlLiAqLwotCi1zdGF0aWMgYmZkX3ZtYSAqZXhwb3J0ZWRfc3ltYm9sX29mZnNldHM7Ci1zdGF0aWMgc3RydWN0IHNlYyAqKmV4cG9ydGVkX3N5bWJvbF9zZWN0aW9uczsKLQotc3RhdGljIGludCBleHBvcnRfdGFibGVfc2l6ZTsKLXN0YXRpYyBpbnQgY291bnRfZXhwb3J0ZWQ7Ci1zdGF0aWMgaW50IGNvdW50X2V4cG9ydGVkX2J5bmFtZTsKLXN0YXRpYyBpbnQgY291bnRfd2l0aF9vcmRpbmFsczsKLXN0YXRpYyBjb25zdCBjaGFyICpkbGxfbmFtZTsKLXN0YXRpYyBpbnQgbWluX29yZGluYWwsIG1heF9vcmRpbmFsOwotc3RhdGljIGludCAqZXhwb3J0ZWRfc3ltYm9sczsKLQotdHlwZWRlZiBzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdAotICB7Ci0gICAgY2hhciAqc3RyaW5nOwotICAgIHN0cnVjdCBleGNsdWRlX2xpc3Rfc3RydWN0ICpuZXh0OwotICB9Ci1leGNsdWRlX2xpc3Rfc3RydWN0Owotc3RhdGljIHN0cnVjdCBleGNsdWRlX2xpc3Rfc3RydWN0ICpleGNsdWRlcyA9IDA7Ci0KLXZvaWQKLXBlX2RsbF9hZGRfZXhjbHVkZXMgKG5ld19leGNsdWRlcykKLSAgICAgY29uc3QgY2hhciAqbmV3X2V4Y2x1ZGVzOwotewotICBjaGFyICpsb2NhbF9jb3B5OwotICBjaGFyICpleGNsdWRlX3N0cmluZzsKLQotICBsb2NhbF9jb3B5ID0geHN0cmR1cCAobmV3X2V4Y2x1ZGVzKTsKLQotICBleGNsdWRlX3N0cmluZyA9IHN0cnRvayAobG9jYWxfY29weSwgIiw6Iik7Ci0gIGZvciAoOyBleGNsdWRlX3N0cmluZzsgZXhjbHVkZV9zdHJpbmcgPSBzdHJ0b2sgKE5VTEwsICIsOiIpKQotICAgIHsKLSAgICAgIHN0cnVjdCBleGNsdWRlX2xpc3Rfc3RydWN0ICpuZXdfZXhjbHVkZTsKLQotICAgICAgbmV3X2V4Y2x1ZGUgPSAoKHN0cnVjdCBleGNsdWRlX2xpc3Rfc3RydWN0ICopCi0JCSAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCkpKTsKLSAgICAgIG5ld19leGNsdWRlLT5zdHJpbmcgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGV4Y2x1ZGVfc3RyaW5nKSArIDEpOwotICAgICAgc3RyY3B5IChuZXdfZXhjbHVkZS0+c3RyaW5nLCBleGNsdWRlX3N0cmluZyk7Ci0gICAgICBuZXdfZXhjbHVkZS0+bmV4dCA9IGV4Y2x1ZGVzOwotICAgICAgZXhjbHVkZXMgPSBuZXdfZXhjbHVkZTsKLSAgICB9Ci0KLSAgZnJlZSAobG9jYWxfY29weSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWF1dG9fZXhwb3J0IChkLCBuKQotICAgICBkZWZfZmlsZSAqZDsKLSAgICAgY29uc3QgY2hhciAqbjsKLXsKLSAgaW50IGk7Ci0gIHN0cnVjdCBleGNsdWRlX2xpc3Rfc3RydWN0ICpleDsKLSAgZm9yIChpID0gMDsgaSA8IGQtPm51bV9leHBvcnRzOyBpKyspCi0gICAgaWYgKHN0cmNtcCAoZC0+ZXhwb3J0c1tpXS5uYW1lLCBuKSA9PSAwKQotICAgICAgcmV0dXJuIDA7Ci0gIGlmIChwZV9kbGxfZG9fZGVmYXVsdF9leGNsdWRlcykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuLCAiRGxsTWFpbkAxMiIpID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBpZiAoc3RyY21wIChuLCAiRGxsRW50cnlQb2ludEAwIikgPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIGlmIChzdHJjbXAgKG4sICJpbXB1cmVfcHRyIikgPT0gMCkKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGZvciAoZXggPSBleGNsdWRlczsgZXg7IGV4ID0gZXgtPm5leHQpCi0gICAgaWYgKHN0cmNtcCAobiwgZXgtPnN0cmluZykgPT0gMCkKLSAgICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfZGVmX2ZpbGUgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGludCBpLCBqOwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqYmxoZTsKLSAgYmZkICpiOwotICBzdHJ1Y3Qgc2VjICpzOwotICBkZWZfZmlsZV9leHBvcnQgKmU9MDsKLQotICBpZiAoIXBlX2RlZl9maWxlKQotICAgIHBlX2RlZl9maWxlID0gZGVmX2ZpbGVfZW1wdHkgKCk7Ci0KLSAgLyogRmlyc3QsIHJ1biBhcm91bmQgdG8gYWxsIHRoZSBvYmplY3RzIGxvb2tpbmcgZm9yIHRoZSAuZHJlY3R2ZQotICAgICBzZWN0aW9ucywgYW5kIHB1c2ggdGhvc2UgaW50byB0aGUgZGVmIGZpbGUgdG9vICovCi0KLSAgZm9yIChiID0gaW5mby0+aW5wdXRfYmZkczsgYjsgYiA9IGItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGIsICIuZHJlY3R2ZSIpOwotICAgICAgaWYgKHMpCi0JewotCSAgaW50IHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHMpOwotCSAgY2hhciAqYnVmID0geG1hbGxvYyAoc2l6ZSk7Ci0JICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGIsIHMsIGJ1ZiwgMCwgc2l6ZSk7Ci0JICBkZWZfZmlsZV9hZGRfZGlyZWN0aXZlIChwZV9kZWZfZmlsZSwgYnVmLCBzaXplKTsKLQkgIGZyZWUgKGJ1Zik7Ci0JfQotICAgIH0KLQotICAvKiBOb3csIG1heWJlIGV4cG9ydCBldmVyeXRoaW5nIGVsc2UgdGhlIGRlZmF1bHQgd2F5ICovCi0KLSAgaWYgKHBlX2RsbF9leHBvcnRfZXZlcnl0aGluZyB8fCBwZV9kZWZfZmlsZS0+bnVtX2V4cG9ydHMgPT0gMCkKLSAgICB7Ci0gICAgICBmb3IgKGIgPSBpbmZvLT5pbnB1dF9iZmRzOyBiOyBiID0gYi0+bGlua19uZXh0KQotCXsKLQkgIGFzeW1ib2wgKipzeW1ib2xzOwotCSAgaW50IG5zeW1zLCBzeW1zaXplOwotCi0JICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGIpOwotCSAgc3ltYm9scyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1zaXplKTsKLQkgIG5zeW1zID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGIsIHN5bWJvbHMpOwotCi0JICBmb3IgKGogPSAwOyBqIDwgbnN5bXM7IGorKykKLQkgICAgewotCSAgICAgIGlmICgoc3ltYm9sc1tqXS0+ZmxhZ3MgJiAoQlNGX0ZVTkNUSU9OIHwgQlNGX0dMT0JBTCkpCi0JCSAgPT0gKEJTRl9GVU5DVElPTiB8IEJTRl9HTE9CQUwpKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqc24gPSBzeW1ib2xzW2pdLT5uYW1lOwotCQkgIGlmICgqc24gPT0gJ18nKQotCQkgICAgc24rKzsKLQkJICBpZiAoYXV0b19leHBvcnQgKHBlX2RlZl9maWxlLCBzbikpCi0JCSAgICBkZWZfZmlsZV9hZGRfZXhwb3J0IChwZV9kZWZfZmlsZSwgc24sIDAsIC0xKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotI3VuZGVmIE5FCi0jZGVmaW5lIE5FIHBlX2RlZl9maWxlLT5udW1fZXhwb3J0cwotCi0gIC8qIENhbm9uaWNhbGl6ZSB0aGUgZXhwb3J0IGxpc3QgKi8KLQotICBpZiAocGVfZGxsX2tpbGxfYXRzKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBORTsgaSsrKQotCXsKLQkgIGlmIChzdHJjaHIgKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm5hbWUsICdAJykpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHdpbGwgcHJlc2VydmUgaW50ZXJuYWxfbmFtZSwgd2hpY2ggbWF5IGhhdmUgYmVlbiBwb2ludGluZwotCSAgICAgICAgIHRvIHRoZSBzYW1lIG1lbW9yeSBhcyBuYW1lLCBvciBtaWdodCBub3QgaGF2ZSAqLwotCSAgICAgIGNoYXIgKnRtcCA9IHhzdHJkdXAgKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm5hbWUpOwotCSAgICAgICooc3RyY2hyICh0bXAsICdAJykpID0gMDsKLQkgICAgICBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5uYW1lID0gdG1wOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAocGVfZGxsX3N0ZGNhbGxfYWxpYXNlcykKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgTkU7IGkrKykKLQl7Ci0JICBpZiAoc3RyY2hyIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5uYW1lLCAnQCcpKQotCSAgICB7Ci0JICAgICAgY2hhciAqdG1wID0geHN0cmR1cCAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ubmFtZSk7Ci0JICAgICAgKihzdHJjaHIgKHRtcCwgJ0AnKSkgPSAwOwotCSAgICAgIGlmIChhdXRvX2V4cG9ydCAocGVfZGVmX2ZpbGUsIHRtcCkpCi0JCWRlZl9maWxlX2FkZF9leHBvcnQgKHBlX2RlZl9maWxlLCB0bXAsCi0JCQkJICAgICBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lLCAtMSk7Ci0JICAgICAgZWxzZQotCQlmcmVlICh0bXApOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBlID0gcGVfZGVmX2ZpbGUtPmV4cG9ydHM7IC8qIGNvbnZlbmllbmNlLCBidXQgd2F0Y2ggb3V0IGZvciBpdCBjaGFuZ2luZyAqLwotCi0gIGV4cG9ydGVkX3N5bWJvbF9vZmZzZXRzID0gKGJmZF92bWEgKikgeG1hbGxvYyAoTkUgKiBzaXplb2YgKGJmZF92bWEpKTsKLSAgZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zID0gKHN0cnVjdCBzZWMgKiopIHhtYWxsb2MgKE5FICogc2l6ZW9mIChzdHJ1Y3Qgc2VjICopKTsKLQotICBtZW1zZXQgKGV4cG9ydGVkX3N5bWJvbF9zZWN0aW9ucywgMCwgTkUgKiBzaXplb2YgKHN0cnVjdCBzZWMgKikpOwotICBtYXhfb3JkaW5hbCA9IDA7Ci0gIG1pbl9vcmRpbmFsID0gNjU1MzY7Ci0gIGNvdW50X2V4cG9ydGVkID0gMDsKLSAgY291bnRfZXhwb3J0ZWRfYnluYW1lID0gMDsKLSAgY291bnRfd2l0aF9vcmRpbmFscyA9IDA7Ci0KLSAgcXNvcnQgKHBlX2RlZl9maWxlLT5leHBvcnRzLCBORSwgc2l6ZW9mIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1swXSksIHBlX2V4cG9ydF9zb3J0KTsKLSAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBORTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpID4gMCAmJiBzdHJjbXAgKGVbaV0ubmFtZSwgZVtpIC0gMV0ubmFtZSkgPT0gMCkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgZHVwbGljYXRlICovCi0JICBpZiAoZVtqIC0gMV0ub3JkaW5hbCAhPSAtMQotCSAgICAgICYmIGVbaV0ub3JkaW5hbCAhPSAtMQotCSAgICAgICYmIGVbaiAtIDFdLm9yZGluYWwgIT0gZVtpXS5vcmRpbmFsKQotCSAgICB7Ci0JICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgICBlaW5mbyAoXygiJVhFcnJvciwgZHVwbGljYXRlIEVYUE9SVCB3aXRoIG9yaWRpbmFsczogJXMgKCVkIHZzICVkKVxuIiksCi0JCSAgICAgZVtqIC0gMV0ubmFtZSwgZVtqIC0gMV0ub3JkaW5hbCwgZVtpXS5vcmRpbmFsKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgICBlaW5mbyAoXygiV2FybmluZywgZHVwbGljYXRlIEVYUE9SVDogJXNcbiIpLAotCQkgICAgIGVbaiAtIDFdLm5hbWUpOwotCSAgICB9Ci0JICBpZiAoZVtpXS5vcmRpbmFsKQotCSAgICBlW2ogLSAxXS5vcmRpbmFsID0gZVtpXS5vcmRpbmFsOwotCSAgZVtqIC0gMV0uZmxhZ19wcml2YXRlIHw9IGVbaV0uZmxhZ19wcml2YXRlOwotCSAgZVtqIC0gMV0uZmxhZ19jb25zdGFudCB8PSBlW2ldLmZsYWdfY29uc3RhbnQ7Ci0JICBlW2ogLSAxXS5mbGFnX25vbmFtZSB8PSBlW2ldLmZsYWdfbm9uYW1lOwotCSAgZVtqIC0gMV0uZmxhZ19kYXRhIHw9IGVbaV0uZmxhZ19kYXRhOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaSAhPSBqKQotCSAgICBlW2pdID0gZVtpXTsKLQkgIGorKzsKLQl9Ci0gICAgfQotICBwZV9kZWZfZmlsZS0+bnVtX2V4cG9ydHMgPSBqOwkvKiA9PSBORSAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCBORTsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgKm5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpICsgMik7Ci0gICAgICBpZiAocGVfZGV0YWlscy0+dW5kZXJzY29yZWQpCi0JewotCSAgKm5hbWUgPSAnXyc7Ci0JICBzdHJjcHkgKG5hbWUgKyAxLCBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQl9Ci0gICAgICBlbHNlCi0Jc3RyY3B5IChuYW1lLCBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQotICAgICAgYmxoZSA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLAotCQkJCSAgIG5hbWUsCi0JCQkJICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICAgICAgaWYgKGJsaGUgJiYgKGJsaGUtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKSkKLQl7Ci0JICBjb3VudF9leHBvcnRlZCsrOwotCSAgaWYgKCFwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5mbGFnX25vbmFtZSkKLQkgICAgY291bnRfZXhwb3J0ZWRfYnluYW1lKys7Ci0JICBleHBvcnRlZF9zeW1ib2xfb2Zmc2V0c1tpXSA9IGJsaGUtPnUuZGVmLnZhbHVlOwotCSAgZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zW2ldID0gYmxoZS0+dS5kZWYuc2VjdGlvbjsKLQkgIGlmIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsICE9IC0xKQotCSAgICB7Ci0JICAgICAgaWYgKG1heF9vcmRpbmFsIDwgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCkKLQkJbWF4X29yZGluYWwgPSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsOwotCSAgICAgIGlmIChtaW5fb3JkaW5hbCA+IHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwpCi0JCW1pbl9vcmRpbmFsID0gcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbDsKLQkgICAgICBjb3VudF93aXRoX29yZGluYWxzKys7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChibGhlICYmIGJsaGUtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGVpbmZvIChfKCIlWENhbm5vdCBleHBvcnQgJXM6IHN5bWJvbCBub3QgZGVmaW5lZFxuIiksCi0JCSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQl9Ci0gICAgICBlbHNlIGlmIChibGhlKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBlaW5mbyAoXygiJVhDYW5ub3QgZXhwb3J0ICVzOiBzeW1ib2wgd3JvbmcgdHlwZSAoJWQgdnMgJWQpXG4iKSwKLQkJIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUsCi0JCSBibGhlLT50eXBlLCBiZmRfbGlua19oYXNoX2RlZmluZWQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgZWluZm8gKF8oIiVYQ2Fubm90IGV4cG9ydCAlczogc3ltYm9sIG5vdCBmb3VuZFxuIiksCi0JCSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQl9Ci0gICAgICBmcmVlIChuYW1lKTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIEJ1aWxkIHRoZSBiZmQgdGhhdCB3aWxsIGNvbnRhaW4gLmVkYXRhIGFuZCAucmVsb2Mgc2VjdGlvbnMKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2ZpbGxlcl9iZmQgKGluY2x1ZGVfZWRhdGEpCi0gICAgIGludCBpbmNsdWRlX2VkYXRhOwotewotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxsZXJfZmlsZTsKLSAgZmlsbGVyX2ZpbGUgPSBsYW5nX2FkZF9pbnB1dF9maWxlICgiZGxsIHN0dWZmIiwKLQkJCQkgICAgIGxhbmdfaW5wdXRfZmlsZV9pc19mYWtlX2VudW0sCi0JCQkJICAgICBOVUxMKTsKLSAgZmlsbGVyX2ZpbGUtPnRoZV9iZmQgPSBmaWxsZXJfYmZkID0gYmZkX2NyZWF0ZSAoImRsbCBzdHVmZiIsIG91dHB1dF9iZmQpOwotICBpZiAoZmlsbGVyX2JmZCA9PSBOVUxMCi0gICAgICB8fCAhYmZkX3NldF9hcmNoX21hY2ggKGZpbGxlcl9iZmQsCi0JCQkgICAgIGJmZF9nZXRfYXJjaCAob3V0cHV0X2JmZCksCi0JCQkgICAgIGJmZF9nZXRfbWFjaCAob3V0cHV0X2JmZCkpKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVglUDogY2FuIG5vdCBjcmVhdGUgQkZEICVFXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGluY2x1ZGVfZWRhdGEpCi0gICAgewotICAgICAgZWRhdGFfcyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoZmlsbGVyX2JmZCwgIi5lZGF0YSIpOwotICAgICAgaWYgKGVkYXRhX3MgPT0gTlVMTAotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZmlsbGVyX2JmZCwgZWRhdGFfcywKLQkJCQkgICAgIChTRUNfSEFTX0NPTlRFTlRTCi0JCQkJICAgICAgfCBTRUNfQUxMT0MKLQkJCQkgICAgICB8IFNFQ19MT0FECi0JCQkJICAgICAgfCBTRUNfS0VFUAotCQkJCSAgICAgIHwgU0VDX0lOX01FTU9SWSkpKQotCXsKLQkgIGVpbmZvICgiJVglUDogY2FuIG5vdCBjcmVhdGUgLmVkYXRhIHNlY3Rpb246ICVFXG4iKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoZmlsbGVyX2JmZCwgZWRhdGFfcywgZWRhdGFfc3opOwotICAgIH0KLQotICByZWxvY19zID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChmaWxsZXJfYmZkLCAiLnJlbG9jIik7Ci0gIGlmIChyZWxvY19zID09IE5VTEwKLSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGZpbGxlcl9iZmQsIHJlbG9jX3MsCi0JCQkJIChTRUNfSEFTX0NPTlRFTlRTCi0JCQkJICB8IFNFQ19BTExPQwotCQkJCSAgfCBTRUNfTE9BRAotCQkJCSAgfCBTRUNfS0VFUAotCQkJCSAgfCBTRUNfSU5fTUVNT1JZKSkpCi0gICAgewotICAgICAgZWluZm8gKCIlWCVQOiBjYW4gbm90IGNyZWF0ZSAucmVsb2Mgc2VjdGlvbjogJUVcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGZpbGxlcl9iZmQsIHJlbG9jX3MsIDApOwotCi0gIGxkbGFuZ19hZGRfZmlsZSAoZmlsbGVyX2ZpbGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBHYXRoZXIgYWxsIHRoZSBleHBvcnRlZCBzeW1ib2xzIGFuZCBidWlsZCB0aGUgLmVkYXRhIHNlY3Rpb24KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWdlbmVyYXRlX2VkYXRhIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpbnQgaSwgbmV4dF9vcmRpbmFsOwotICBpbnQgbmFtZV90YWJsZV9zaXplID0gMDsKLSAgY29uc3QgY2hhciAqZGxucDsKLQotICAvKiBGaXJzdCwgd2UgbmVlZCB0byBrbm93IGhvdyBtYW55IGV4cG9ydGVkIHN5bWJvbHMgdGhlcmUgYXJlLAotICAgICBhbmQgd2hhdCB0aGUgcmFuZ2Ugb2Ygb3JkaW5hbHMgaXMuICovCi0KLSAgaWYgKHBlX2RlZl9maWxlLT5uYW1lKQotICAgIHsKLSAgICAgIGRsbF9uYW1lID0gcGVfZGVmX2ZpbGUtPm5hbWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZGxsX25hbWUgPSBhYmZkLT5maWxlbmFtZTsKLSAgICAgIGZvciAoZGxucCA9IGRsbF9uYW1lOyAqZGxucDsgZGxucCsrKQotCXsKLQkgIGlmICgqZGxucCA9PSAnXFwnIHx8ICpkbG5wID09ICcvJyB8fCAqZGxucCA9PSAnOicpCi0JICAgIGRsbF9uYW1lID0gZGxucCArIDE7Ci0JfQotICAgIH0KLQotICBpZiAoY291bnRfd2l0aF9vcmRpbmFscyAmJiBtYXhfb3JkaW5hbCA+IGNvdW50X2V4cG9ydGVkKQotICAgIHsKLSAgICAgIGlmIChtaW5fb3JkaW5hbCA+IG1heF9vcmRpbmFsIC0gY291bnRfZXhwb3J0ZWQgKyAxKQotCW1pbl9vcmRpbmFsID0gbWF4X29yZGluYWwgLSBjb3VudF9leHBvcnRlZCArIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWluX29yZGluYWwgPSAxOwotICAgICAgbWF4X29yZGluYWwgPSBjb3VudF9leHBvcnRlZDsKLSAgICB9Ci0gIGV4cG9ydF90YWJsZV9zaXplID0gbWF4X29yZGluYWwgLSBtaW5fb3JkaW5hbCArIDE7Ci0KLSAgZXhwb3J0ZWRfc3ltYm9scyA9IChpbnQgKikgeG1hbGxvYyAoZXhwb3J0X3RhYmxlX3NpemUgKiBzaXplb2YgKGludCkpOwotICBmb3IgKGkgPSAwOyBpIDwgZXhwb3J0X3RhYmxlX3NpemU7IGkrKykKLSAgICBleHBvcnRlZF9zeW1ib2xzW2ldID0gLTE7Ci0KLSAgLyogTm93IHdlIG5lZWQgdG8gYXNzaWduIG9yZGluYWxzIHRvIHRob3NlIHRoYXQgZG9uJ3QgaGF2ZSB0aGVtICovCi0gIGZvciAoaSA9IDA7IGkgPCBORTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnNbaV0pCi0JewotCSAgaWYgKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwgIT0gLTEpCi0JICAgIHsKLQkgICAgICBpbnQgZWkgPSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsIC0gbWluX29yZGluYWw7Ci0JICAgICAgaW50IHBpID0gZXhwb3J0ZWRfc3ltYm9sc1tlaV07Ci0JICAgICAgaWYgKHBpICE9IC0xKQotCQl7Ci0JCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJICBlaW5mbyAoXygiJVhFcnJvciwgb3JpZGluYWwgdXNlZCB0d2ljZTogJWQgKCVzIHZzICVzKVxuIiksCi0JCQkgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCwKLQkJCSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5uYW1lLAotCQkJIHBlX2RlZl9maWxlLT5leHBvcnRzW3BpXS5uYW1lKTsKLQkJfQotCSAgICAgIGV4cG9ydGVkX3N5bWJvbHNbZWldID0gaTsKLQkgICAgfQotCSAgbmFtZV90YWJsZV9zaXplICs9IHN0cmxlbiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ubmFtZSkgKyAxOwotCX0KLSAgICB9Ci0KLSAgbmV4dF9vcmRpbmFsID0gbWluX29yZGluYWw7Ci0gIGZvciAoaSA9IDA7IGkgPCBORTsgaSsrKQotICAgIGlmIChleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnNbaV0pCi0gICAgICBpZiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCA9PSAtMSkKLQl7Ci0JICB3aGlsZSAoZXhwb3J0ZWRfc3ltYm9sc1tuZXh0X29yZGluYWwgLSBtaW5fb3JkaW5hbF0gIT0gLTEpCi0JICAgIG5leHRfb3JkaW5hbCsrOwotCSAgZXhwb3J0ZWRfc3ltYm9sc1tuZXh0X29yZGluYWwgLSBtaW5fb3JkaW5hbF0gPSBpOwotCSAgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCA9IG5leHRfb3JkaW5hbDsKLQl9Ci0KLSAgLyogT0ssIG5vdyB3ZSBjYW4gYWxsb2NhdGUgc29tZSBtZW1vcnkgKi8KLQotICBlZGF0YV9zeiA9ICg0MAkJLyogZGlyZWN0b3J5ICovCi0JICAgICAgKyA0ICogZXhwb3J0X3RhYmxlX3NpemUJLyogYWRkcmVzc2VzICovCi0JICAgICAgKyA0ICogY291bnRfZXhwb3J0ZWRfYnluYW1lCS8qIG5hbWUgcHRycyAqLwotCSAgICAgICsgMiAqIGNvdW50X2V4cG9ydGVkX2J5bmFtZQkvKiBvcmRpbmFscyAqLwotCSAgICAgICsgbmFtZV90YWJsZV9zaXplICsgc3RybGVuIChkbGxfbmFtZSkgKyAxKTsKLX0KLQotc3RhdGljIHZvaWQKLWZpbGxfZWRhdGEgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGludCBpLCBoaW50OwotICB1bnNpZ25lZCBjaGFyICplZGlyZWN0b3J5OwotICB1bnNpZ25lZCBsb25nICplYWRkcmVzc2VzOwotICB1bnNpZ25lZCBsb25nICplbmFtZXB0cnM7Ci0gIHVuc2lnbmVkIHNob3J0ICplb3JkaW5hbHM7Ci0gIHVuc2lnbmVkIGNoYXIgKmVuYW1lc3RyOwotICB0aW1lX3Qgbm93OwotCi0gIHRpbWUgKCZub3cpOwotCi0gIGVkYXRhX2QgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jIChlZGF0YV9zeik7Ci0KLSAgLyogTm90ZSB1c2Ugb2YgYXJyYXkgcG9pbnRlciBtYXRoIGhlcmUgKi8KLSAgZWRpcmVjdG9yeSA9IGVkYXRhX2Q7Ci0gIGVhZGRyZXNzZXMgPSAodW5zaWduZWQgbG9uZyAqKSAoZWRhdGFfZCArIDQwKTsKLSAgZW5hbWVwdHJzID0gZWFkZHJlc3NlcyArIGV4cG9ydF90YWJsZV9zaXplOwotICBlb3JkaW5hbHMgPSAodW5zaWduZWQgc2hvcnQgKikgKGVuYW1lcHRycyArIGNvdW50X2V4cG9ydGVkX2J5bmFtZSk7Ci0gIGVuYW1lc3RyID0gKGNoYXIgKikgKGVvcmRpbmFscyArIGNvdW50X2V4cG9ydGVkX2J5bmFtZSk7Ci0KLSNkZWZpbmUgRVJWQShwdHIpICgoKHVuc2lnbmVkIGNoYXIgKikocHRyKSAtIGVkYXRhX2QpICsgZWRhdGFfcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSAtIGltYWdlX2Jhc2UpCi0KLSAgbWVtc2V0IChlZGF0YV9kLCAwLCA0MCk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIG5vdywgZWRhdGFfZCArIDQpOwotICBpZiAocGVfZGVmX2ZpbGUtPnZlcnNpb25fbWFqb3IgIT0gLTEpCi0gICAgewotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgcGVfZGVmX2ZpbGUtPnZlcnNpb25fbWFqb3IsIGVkYXRhX2QgKyA4KTsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHBlX2RlZl9maWxlLT52ZXJzaW9uX21pbm9yLCBlZGF0YV9kICsgMTApOwotICAgIH0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgRVJWQSAoZW5hbWVzdHIpLCBlZGF0YV9kICsgMTIpOwotICBzdHJjcHkgKGVuYW1lc3RyLCBkbGxfbmFtZSk7Ci0gIGVuYW1lc3RyICs9IHN0cmxlbiAoZW5hbWVzdHIpICsgMTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgbWluX29yZGluYWwsIGVkYXRhX2QgKyAxNik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGV4cG9ydF90YWJsZV9zaXplLCBlZGF0YV9kICsgMjApOwotICBiZmRfcHV0XzMyIChhYmZkLCBjb3VudF9leHBvcnRlZF9ieW5hbWUsIGVkYXRhX2QgKyAyNCk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIEVSVkEgKGVhZGRyZXNzZXMpLCBlZGF0YV9kICsgMjgpOwotICBiZmRfcHV0XzMyIChhYmZkLCBFUlZBIChlbmFtZXB0cnMpLCBlZGF0YV9kICsgMzIpOwotICBiZmRfcHV0XzMyIChhYmZkLCBFUlZBIChlb3JkaW5hbHMpLCBlZGF0YV9kICsgMzYpOwotCi0gIC8qIE9rLCBub3cgZm9yIHRoZSBmaWxsaW5nIGluIHBhcnQgKi8KLSAgaGludCA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBleHBvcnRfdGFibGVfc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIGludCBzID0gZXhwb3J0ZWRfc3ltYm9sc1tpXTsKLSAgICAgIGlmIChzICE9IC0xKQotCXsKLQkgIHN0cnVjdCBzZWMgKnNzZWMgPSBleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnNbc107Ci0JICB1bnNpZ25lZCBsb25nIHNydmEgPSAoZXhwb3J0ZWRfc3ltYm9sX29mZnNldHNbc10KLQkJCQkrIHNzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIHNzZWMtPm91dHB1dF9vZmZzZXQpOwotCi0JICBiZmRfcHV0XzMyIChhYmZkLCBzcnZhIC0gaW1hZ2VfYmFzZSwgKHZvaWQgKikgKGVhZGRyZXNzZXMgKyBpKSk7Ci0JICBpZiAoIXBlX2RlZl9maWxlLT5leHBvcnRzW3NdLmZsYWdfbm9uYW1lKQotCSAgICB7Ci0JICAgICAgY2hhciAqZW5hbWUgPSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tzXS5uYW1lOwotCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIEVSVkEgKGVuYW1lc3RyKSwgKHZvaWQgKikgZW5hbWVwdHJzKTsKLQkgICAgICBzdHJjcHkgKGVuYW1lc3RyLCBlbmFtZSk7Ci0JICAgICAgZW5hbWVzdHIgKz0gc3RybGVuIChlbmFtZXN0cikgKyAxOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGksICh2b2lkICopIGVvcmRpbmFscyk7Ci0JICAgICAgZW5hbWVwdHJzKys7Ci0JICAgICAgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbc10uaGludCA9IGhpbnQrKzsKLQkgICAgfQotCSAgZW9yZGluYWxzKys7Ci0JfQotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gR2F0aGVyIGFsbCB0aGUgcmVsb2NhdGlvbnMgYW5kIGJ1aWxkIHRoZSAucmVsb2Mgc2VjdGlvbgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotZ2VuZXJhdGVfcmVsb2MgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0KLSAgLyogZm9yIC5yZWxvYyBzdHVmZiAqLwotICByZWxvY19kYXRhX3R5cGUgKnJlbG9jX2RhdGE7Ci0gIGludCB0b3RhbF9yZWxvY3MgPSAwOwotICBpbnQgaTsKLSAgdW5zaWduZWQgbG9uZyBzZWNfcGFnZSA9ICh1bnNpZ25lZCBsb25nKSAoLTEpOwotICB1bnNpZ25lZCBsb25nIHBhZ2VfcHRyLCBwYWdlX2NvdW50OwotICBpbnQgYmk7Ci0gIGJmZCAqYjsKLSAgc3RydWN0IHNlYyAqczsKLQotICB0b3RhbF9yZWxvY3MgPSAwOwotICBmb3IgKGIgPSBpbmZvLT5pbnB1dF9iZmRzOyBiOyBiID0gYi0+bGlua19uZXh0KQotICAgIGZvciAocyA9IGItPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKLSAgICAgIHRvdGFsX3JlbG9jcyArPSBzLT5yZWxvY19jb3VudDsKLQotICByZWxvY19kYXRhID0gKHJlbG9jX2RhdGFfdHlwZSAqKSB4bWFsbG9jICh0b3RhbF9yZWxvY3MgKiBzaXplb2YgKHJlbG9jX2RhdGFfdHlwZSkpOwotCi0gIHRvdGFsX3JlbG9jcyA9IDA7Ci0gIGJpID0gMDsKLSAgZm9yIChiaSA9IDAsIGIgPSBpbmZvLT5pbnB1dF9iZmRzOyBiOyBiaSsrLCBiID0gYi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipyZWxvY3M7Ci0gICAgICBpbnQgcmVsc2l6ZSwgbnJlbG9jcywgaTsKLQotICAgICAgZm9yIChzID0gYi0+c2VjdGlvbnM7IHM7IHMgPSBzLT5uZXh0KQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgc2VjX3ZtYSA9IHMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0OwotCSAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0JICBpbnQgbnN5bXMsIHN5bXNpemU7Ci0KLQkgIC8qIGlmIGl0J3Mgbm90IGxvYWRlZCwgd2UgZG9uJ3QgbmVlZCB0byByZWxvY2F0ZSBpdCB0aGlzIHdheSAqLwotCSAgaWYgKCEocy0+b3V0cHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogSSBkb24ndCBrbm93IHdoeSB0aGVyZSB3b3VsZCBiZSBhIHJlbG9jIGZvciB0aGVzZSwgYnV0IEkndmUKLQkgICAgIHNlZW4gaXQgaGFwcGVuIC0gREogKi8KLQkgIGlmIChzLT5vdXRwdXRfc2VjdGlvbiA9PSAmYmZkX2Fic19zZWN0aW9uKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKHMtPm91dHB1dF9zZWN0aW9uLT52bWEgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEh1aD8gIFNob3VsZG4ndCBoYXBwZW4sIGJ1dCBwdW50IGlmIGl0IGRvZXMgKi8KLQkgICAgICBlaW5mbyAoIkRKOiB6ZXJvIHZtYSBzZWN0aW9uIHJlbG9jIGRldGVjdGVkOiBgJXMnICMlZCBmPSVkXG4iLAotCQkgICAgIHMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLCBzLT5vdXRwdXRfc2VjdGlvbi0+aW5kZXgsCi0JCSAgICAgcy0+b3V0cHV0X3NlY3Rpb24tPmZsYWdzKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGIpOwotCSAgc3ltYm9scyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1zaXplKTsKLQkgIG5zeW1zID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGIsIHN5bWJvbHMpOwotCi0JICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYiwgcyk7Ci0JICByZWxvY3MgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAoKHNpemVfdCkgcmVsc2l6ZSk7Ci0JICBucmVsb2NzID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYiwgcywgcmVsb2NzLCBzeW1ib2xzKTsKLQotCSAgZm9yIChpID0gMDsgaSA8IG5yZWxvY3M7IGkrKykKLQkgICAgewotCSAgICAgIGlmICghcmVsb2NzW2ldLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkJICAmJiByZWxvY3NbaV0tPmhvd3RvLT50eXBlICE9IHBlX2RldGFpbHMtPmltYWdlYmFzZV9yZWxvYykKLQkJewotCQkgIGJmZF92bWEgc3ltX3ZtYTsKLQkJICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW0gPSAqcmVsb2NzW2ldLT5zeW1fcHRyX3B0cjsKLQkJICBzeW1fdm1hID0gKHJlbG9jc1tpXS0+YWRkZW5kCi0JCQkgICAgICsgc3ltLT52YWx1ZQotCQkJICAgICArIHN5bS0+c2VjdGlvbi0+dm1hCi0JCQkgICAgICsgc3ltLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgICsgc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQkJICByZWxvY19kYXRhW3RvdGFsX3JlbG9jc10udm1hID0gc2VjX3ZtYSArIHJlbG9jc1tpXS0+YWRkcmVzczsKLQkJICBzd2l0Y2ggKHJlbG9jc1tpXS0+aG93dG8tPmJpdHNpemUqMTAwMAotCQkJICArIHJlbG9jc1tpXS0+aG93dG8tPnJpZ2h0c2hpZnQpCi0JCSAgICB7Ci0JCSAgICBjYXNlIDMyMDAwOgotCQkgICAgICByZWxvY19kYXRhW3RvdGFsX3JlbG9jc10udHlwZSA9IDM7Ci0JCSAgICAgIHRvdGFsX3JlbG9jcysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCSAgICAgIGVpbmZvIChfKCIlWEVycm9yOiAlZC1iaXQgcmVsb2MgaW4gZGxsXG4iKSwKLQkJCSAgICAgcmVsb2NzW2ldLT5ob3d0by0+Yml0c2l6ZSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGZyZWUgKHJlbG9jcyk7Ci0JICAvKiBXYXJuaW5nOiB0aGUgYWxsb2NhdGVkIHN5bWJvbHMgYXJlIHJlbWVtYmVyZWQgaW4gQkZEIGFuZCByZXVzZWQKLQkgICAgIGxhdGVyLCBzbyBkb24ndCBmcmVlIHRoZW0hICovCi0JICAvKiBmcmVlIChzeW1ib2xzKTsgKi8KLQl9Ci0gICAgfQotCi0gIC8qIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgdG90YWxfcmVsb2NzIHJlbG9jYXRpb24gYWRkcmVzc2VzIGluCi0gICAgIHJlbG9jX2FkZHJlc3Nlcywgd2hpY2ggYXJlIGFsbCBzdWl0YWJsZSBmb3IgdGhlIC5yZWxvYyBzZWN0aW9uLgotICAgICBXZSBtdXN0IG5vdyBjcmVhdGUgdGhlIG5ldyBzZWN0aW9ucy4gKi8KLQotICBxc29ydCAocmVsb2NfZGF0YSwgdG90YWxfcmVsb2NzLCBzaXplb2YgKCpyZWxvY19kYXRhKSwgcmVsb2Nfc29ydCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHRvdGFsX3JlbG9jczsgaSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdGhpc19wYWdlID0gKHJlbG9jX2RhdGFbaV0udm1hID4+IDEyKTsKLSAgICAgIGlmICh0aGlzX3BhZ2UgIT0gc2VjX3BhZ2UpCi0JewotCSAgcmVsb2Nfc3ogPSAocmVsb2Nfc3ogKyAzKSAmIH4zOwkvKiA0LWJ5dGUgYWxpZ24gKi8KLQkgIHJlbG9jX3N6ICs9IDg7Ci0JICBzZWNfcGFnZSA9IHRoaXNfcGFnZTsKLQl9Ci0gICAgICByZWxvY19zeiArPSAyOwotICAgIH0KLSAgcmVsb2Nfc3ogPSAocmVsb2Nfc3ogKyAzKSAmIH4zOwkvKiA0LWJ5dGUgYWxpZ24gKi8KLQotICByZWxvY19kID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAocmVsb2Nfc3opOwotCi0gIHNlY19wYWdlID0gKHVuc2lnbmVkIGxvbmcpICgtMSk7Ci0gIHJlbG9jX3N6ID0gMDsKLSAgcGFnZV9wdHIgPSAodW5zaWduZWQgbG9uZykgKC0xKTsKLSAgcGFnZV9jb3VudCA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9yZWxvY3M7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJ2YSA9IHJlbG9jX2RhdGFbaV0udm1hIC0gaW1hZ2VfYmFzZTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdGhpc19wYWdlID0gKHJ2YSAmIH4weGZmZik7Ci0gICAgICBpZiAodGhpc19wYWdlICE9IHNlY19wYWdlKQotCXsKLQkgIHdoaWxlIChyZWxvY19zeiAmIDMpCi0JICAgIHJlbG9jX2RbcmVsb2Nfc3orK10gPSAwOwotCSAgaWYgKHBhZ2VfcHRyICE9ICh1bnNpZ25lZCBsb25nKSAoLTEpKQotCSAgICBiZmRfcHV0XzMyIChhYmZkLCByZWxvY19zeiAtIHBhZ2VfcHRyLCByZWxvY19kICsgcGFnZV9wdHIgKyA0KTsKLQkgIGJmZF9wdXRfMzIgKGFiZmQsIHRoaXNfcGFnZSwgcmVsb2NfZCArIHJlbG9jX3N6KTsKLQkgIHBhZ2VfcHRyID0gcmVsb2Nfc3o7Ci0JICByZWxvY19zeiArPSA4OwotCSAgc2VjX3BhZ2UgPSB0aGlzX3BhZ2U7Ci0JICBwYWdlX2NvdW50ID0gMDsKLQl9Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCAocnZhICYgMHhmZmYpICsgKHJlbG9jX2RhdGFbaV0udHlwZTw8MTIpLAotCQkgIHJlbG9jX2QgKyByZWxvY19zeik7Ci0gICAgICByZWxvY19zeiArPSAyOwotICAgICAgaWYgKHJlbG9jX2RhdGFbaV0udHlwZSA9PSA0KQotCXsKLQkgIGJmZF9wdXRfMTYgKGFiZmQsIHJlbG9jX2RhdGFbaV0uZXh0cmEsIHJlbG9jX2QgKyByZWxvY19zeik7Ci0JICByZWxvY19zeiArPSAyOwotCX0KLSAgICAgIHBhZ2VfY291bnQrKzsKLSAgICB9Ci0gIHdoaWxlIChyZWxvY19zeiAmIDMpCi0gICAgcmVsb2NfZFtyZWxvY19zeisrXSA9IDA7Ci0gIGlmIChwYWdlX3B0ciAhPSAodW5zaWduZWQgbG9uZykgKC0xKSkKLSAgICBiZmRfcHV0XzMyIChhYmZkLCByZWxvY19zeiAtIHBhZ2VfcHRyLCByZWxvY19kICsgcGFnZV9wdHIgKyA0KTsKLSAgd2hpbGUgKHJlbG9jX3N6IDwgcmVsb2Nfcy0+X3Jhd19zaXplKQotICAgIHJlbG9jX2RbcmVsb2Nfc3orK10gPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBHaXZlbiB0aGUgZXhpdGluZyBkZWZfZmlsZSBzdHJ1Y3R1cmUsIHByaW50IG91dCBhIC5ERUYgZmlsZSB0aGF0Ci0gY29ycmVzcG9uZHMgdG8gaXQuCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1xdW90ZXB1dCAocywgZiwgbmVlZHNfcXVvdGVzKQotICAgICBjaGFyICpzOwotICAgICBGSUxFICogZjsKLSAgICAgaW50IG5lZWRzX3F1b3RlczsKLXsKLSAgY2hhciAqY3A7Ci0gIGZvciAoY3AgPSBzOyAqY3A7IGNwKyspCi0gICAgaWYgKCpjcCA9PSAnXCcnCi0JfHwgKmNwID09ICciJwotCXx8ICpjcCA9PSAnXFwnCi0JfHwgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpjcCkKLQl8fCAqY3AgPT0gJywnCi0JfHwgKmNwID09ICc7JykKLSAgICAgIG5lZWRzX3F1b3RlcyA9IDE7Ci0gIGlmIChuZWVkc19xdW90ZXMpCi0gICAgewotICAgICAgcHV0YyAoJyInLCBmKTsKLSAgICAgIHdoaWxlICgqcykKLQl7Ci0JICBpZiAoKnMgPT0gJyInIHx8ICpzID09ICdcXCcpCi0JICAgIHB1dGMgKCdcXCcsIGYpOwotCSAgcHV0YyAoKnMsIGYpOwotCSAgcysrOwotCX0KLSAgICAgIHB1dGMgKCciJywgZik7Ci0gICAgfQotICBlbHNlCi0gICAgZnB1dHMgKHMsIGYpOwotfQotCi12b2lkCi1wZV9kbGxfZ2VuZXJhdGVfZGVmX2ZpbGUgKHBlX291dF9kZWZfZmlsZW5hbWUpCi0gICAgIGNoYXIgKnBlX291dF9kZWZfZmlsZW5hbWU7Ci17Ci0gIGludCBpOwotICBGSUxFICpvdXQgPSBmb3BlbiAocGVfb3V0X2RlZl9maWxlbmFtZSwgInciKTsKLSAgaWYgKG91dCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBlaW5mbyAoXygiJXM6IENhbid0IG9wZW4gb3V0cHV0IGRlZiBmaWxlICVzXG4iKSwKLQkgICAgIHByb2dyYW1fbmFtZSwgcGVfb3V0X2RlZl9maWxlbmFtZSk7Ci0gICAgfQotCi0gIGlmIChwZV9kZWZfZmlsZSkKLSAgICB7Ci0gICAgICBpZiAocGVfZGVmX2ZpbGUtPm5hbWUpCi0JewotCSAgaWYgKHBlX2RlZl9maWxlLT5pc19kbGwpCi0JICAgIGZwcmludGYgKG91dCwgIkxJQlJBUlkgIik7Ci0JICBlbHNlCi0JICAgIGZwcmludGYgKG91dCwgIk5BTUUgIik7Ci0JICBxdW90ZXB1dCAocGVfZGVmX2ZpbGUtPm5hbWUsIG91dCwgMSk7Ci0JICBpZiAocGVfZGF0YSAob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2UpCi0JICAgIGZwcmludGYgKG91dCwgIiBCQVNFPTB4JWx4IiwKLQkJICAgICAodW5zaWduZWQgbG9uZykgcGVfZGF0YSAob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2UpOwotCSAgZnByaW50ZiAob3V0LCAiXG4iKTsKLQl9Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+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/IChhZGQgdW5kZXJzY29yZSwga2lsbCBhdCkKLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBqbXBfaXg4Nl9ieXRlc1tdID0gewotICAweGZmLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweDkwCi19OwotCi0KLXN0YXRpYyBiZmQgKgotbWFrZV9vbmUgKGV4cCwgcGFyZW50KQotICAgICBkZWZfZmlsZV9leHBvcnQgKmV4cDsKLSAgICAgYmZkICpwYXJlbnQ7Ci17Ci0gIGFzZWN0aW9uICp0eCwgKmlkNywgKmlkNSwgKmlkNCwgKmlkNjsKLSAgdW5zaWduZWQgY2hhciAqdGQsICpkNywgKmQ1LCAqZDQsICpkNjsKLSAgaW50IGxlbjsKLSAgY2hhciAqb25hbWU7Ci0gIGJmZCAqYWJmZDsKLSAgdW5zaWduZWQgY2hhciAqam1wX2J5dGVzOwotICBpbnQgam1wX2J5dGVfY291bnQ7Ci0KLSAgc3dpdGNoIChwZV9kZXRhaWxzLT5wZV9hcmNoKQotICAgIHsKLSAgICBjYXNlIFBFX0FSQ0hfaTM4NjoKLSAgICAgIGptcF9ieXRlcyA9IGptcF9peDg2X2J5dGVzOwotICAgICAgam1wX2J5dGVfY291bnQgPSBzaXplb2YgKGptcF9peDg2X2J5dGVzKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBvbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKDIwKTsKLSAgc3ByaW50ZiAob25hbWUsICJkJTA2ZC5vIiwgdG1wX3NlcSk7Ci0gIHRtcF9zZXErKzsKLQotICBhYmZkID0gYmZkX2NyZWF0ZSAob25hbWUsIHBhcmVudCk7Ci0gIGJmZF9maW5kX3RhcmdldCAocGVfZGV0YWlscy0+b2JqZWN0X3RhcmdldCwgYWJmZCk7Ci0gIGJmZF9tYWtlX3dyaXRhYmxlIChhYmZkKTsKLQotICBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCk7Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBwZV9kZXRhaWxzLT5iZmRfYXJjaCwgMCk7Ci0KLSAgc3ltcHRyID0gMDsKLSAgc3ltdGFiID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKDEwICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgdHggID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi50ZXh0IiwgICAgU0VDX0NPREV8U0VDX0hBU19DT05URU5UUywgMik7Ci0gIGlkNyA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNyIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBpZDUgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDUiLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgaWQ0ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ0IiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIGlkNiA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNiIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBxdWlja19zeW1ib2wgKGFiZmQsIFUoIiIpLCBleHAtPmludGVybmFsX25hbWUsICIiLCB0eCwgQlNGX0dMT0JBTCwgMCk7Ci0gIHF1aWNrX3N5bWJvbCAoYWJmZCwgVSgiX2hlYWRfIiksIGRsbF9zeW1uYW1lLCAiIiwgVU5EU0VDLCBCU0ZfR0xPQkFMLCAwKTsKLSAgcXVpY2tfc3ltYm9sIChhYmZkLCBVKCJfX2ltcF8iKSwgZXhwLT5pbnRlcm5hbF9uYW1lLCAiIiwgaWQ1LCBCU0ZfR0xPQkFMLCAwKTsKLSAgcXVpY2tfc3ltYm9sIChhYmZkLCBVKCJfaW1wX18iKSwgZXhwLT5pbnRlcm5hbF9uYW1lLCAiIiwgaWQ1LCBCU0ZfR0xPQkFMLCAwKTsKLQotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgdHgsIGptcF9ieXRlX2NvdW50KTsKLSAgdGQgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jIChqbXBfYnl0ZV9jb3VudCk7Ci0gIHR4LT5jb250ZW50cyA9IHRkOwotICBtZW1jcHkgKHRkLCBqbXBfYnl0ZXMsIGptcF9ieXRlX2NvdW50KTsKLSAgc3dpdGNoIChwZV9kZXRhaWxzLT5wZV9hcmNoKQotICAgIHsKLSAgICBjYXNlIFBFX0FSQ0hfaTM4NjoKLSAgICAgIHF1aWNrX3JlbG9jIChhYmZkLCAyLCBCRkRfUkVMT0NfMzIsIDIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBzYXZlX3JlbG9jcyAodHgpOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDcsIDQpOwotICBkNyA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOwotICBpZDctPmNvbnRlbnRzID0gZDc7Ci0gIG1lbXNldCAoZDcsIDAsIDQpOwotICBxdWlja19yZWxvYyAoYWJmZCwgMCwgQkZEX1JFTE9DX1JWQSwgNik7Ci0gIHNhdmVfcmVsb2NzIChpZDcpOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDUsIDQpOwotICBkNSA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOwotICBpZDUtPmNvbnRlbnRzID0gZDU7Ci0gIG1lbXNldCAoZDUsIDAsIDQpOwotICBpZiAoZXhwLT5mbGFnX25vbmFtZSkKLSAgICB7Ci0gICAgICBkNVswXSA9IGV4cC0+b3JkaW5hbDsKLSAgICAgIGQ1WzFdID0gZXhwLT5vcmRpbmFsID4+IDg7Ci0gICAgICBkNVszXSA9IDB4ODA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcXVpY2tfcmVsb2MgKGFiZmQsIDAsIEJGRF9SRUxPQ19SVkEsIDQpOwotICAgICAgc2F2ZV9yZWxvY3MgKGlkNSk7Ci0gICAgfQotCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDQsIDQpOwotICBkNCA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOwotICBpZDQtPmNvbnRlbnRzID0gZDQ7Ci0gIG1lbXNldCAoZDQsIDAsIDQpOwotICBpZiAoZXhwLT5mbGFnX25vbmFtZSkKLSAgICB7Ci0gICAgICBkNVswXSA9IGV4cC0+b3JkaW5hbDsKLSAgICAgIGQ1WzFdID0gZXhwLT5vcmRpbmFsID4+IDg7Ci0gICAgICBkNVszXSA9IDB4ODA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcXVpY2tfcmVsb2MgKGFiZmQsIDAsIEJGRF9SRUxPQ19SVkEsIDQpOwotICAgICAgc2F2ZV9yZWxvY3MgKGlkNCk7Ci0gICAgfQotCi0gIGlmIChleHAtPmZsYWdfbm9uYW1lKQotICAgIHsKLSAgICAgIGxlbiA9IDA7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQ2LCAwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsZW4gPSBzdHJsZW4gKGV4cC0+bmFtZSkgKyAzOwotICAgICAgaWYgKGxlbiAmIDEpCi0JbGVuKys7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQ2LCBsZW4pOwotICAgICAgZDYgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jIChsZW4pOwotICAgICAgaWQ2LT5jb250ZW50cyA9IGQ2OwotICAgICAgbWVtc2V0IChkNiwgMCwgbGVuKTsKLSAgICAgIGQ2WzBdID0gZXhwLT5oaW50ICYgMHhmZjsKLSAgICAgIGQ2WzFdID0gZXhwLT5oaW50ID4+IDg7Ci0gICAgICBzdHJjcHkgKGQ2KzIsIGV4cC0+bmFtZSk7Ci0gICAgfQotCi0gIGJmZF9zZXRfc3ltdGFiIChhYmZkLCBzeW10YWIsIHN5bXB0cik7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCB0eCwgdGQsIDAsIGptcF9ieXRlX2NvdW50KTsKLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDcsIGQ3LCAwLCA0KTsKLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDUsIGQ1LCAwLCA0KTsKLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDQsIGQ0LCAwLCA0KTsKLSAgaWYgKCFleHAtPmZsYWdfbm9uYW1lKQotICAgIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQ2LCBkNiwgMCwgbGVuKTsKLQotICBiZmRfbWFrZV9yZWFkYWJsZSAoYWJmZCk7Ci0gIHJldHVybiBhYmZkOwotfQotCi12b2lkCi1wZV9kbGxfZ2VuZXJhdGVfaW1wbGliIChkZWYsIGltcGZpbGVuYW1lKQotICAgICBkZWZfZmlsZSAqZGVmOwotICAgICBjaGFyICppbXBmaWxlbmFtZTsKLXsKLSAgaW50IGk7Ci0gIGJmZCAqYXJfaGVhZDsKLSAgYmZkICphcl90YWlsOwotICBiZmQgKm91dGFyY2g7Ci0gIGJmZCAqaGVhZCA9IDA7Ci0KLSAgZGxsX2ZpbGVuYW1lID0gZGVmLT5uYW1lOwotICBpZiAoZGxsX2ZpbGVuYW1lID09IDApCi0gICAgewotICAgICAgZGxsX2ZpbGVuYW1lID0gZGxsX25hbWU7Ci0gICAgICBmb3IgKGk9MDsgaW1wZmlsZW5hbWVbaV07IGkrKykKLQlpZiAoaW1wZmlsZW5hbWVbaV0gPT0gJy8nIHx8IGltcGZpbGVuYW1lW2ldID09ICdcXCcpCi0JICBkbGxfZmlsZW5hbWUgPSBpbXBmaWxlbmFtZSsxOwotICAgIH0KLSAgZGxsX3N5bW5hbWUgPSB4c3RyZHVwIChkbGxfZmlsZW5hbWUpOwotICBmb3IgKGk9MDsgZGxsX3N5bW5hbWVbaV07IGkrKykKLSAgICBpZiAoIWlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBkbGxfc3ltbmFtZVtpXSkpCi0gICAgICBkbGxfc3ltbmFtZVtpXSA9ICdfJzsKLQotICB1bmxpbmsgKGltcGZpbGVuYW1lKTsKLQotICBvdXRhcmNoID0gYmZkX29wZW53IChpbXBmaWxlbmFtZSwgMCk7Ci0KLSAgaWYgKCFvdXRhcmNoKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBlaW5mbyAoXygiJVhDYW4ndCBvcGVuIC5saWIgZmlsZTogJXNcbiIpLCBpbXBmaWxlbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGVpbmZvIChfKCJDcmVhdGluZyBsaWJyYXJ5IGZpbGU6ICVzXG4iKSwgaW1wZmlsZW5hbWUpOwotICAKLSAgYmZkX3NldF9mb3JtYXQgKG91dGFyY2gsIGJmZF9hcmNoaXZlKTsKLSAgb3V0YXJjaC0+aGFzX2FybWFwID0gMTsKLQotICAvKiBXb3JrIG91dCBhIHJlYXNvbmFibGUgc2l6ZSBvZiB0aGluZ3MgdG8gcHV0IG9udG8gb25lIGxpbmUuICovCi0KLSAgYXJfaGVhZCA9IG1ha2VfaGVhZCAob3V0YXJjaCk7Ci0KLSAgZm9yIChpID0gMDsgaTxkZWYtPm51bV9leHBvcnRzOyBpKyspCi0gICAgewotICAgICAgLyogVGhlIGltcG9ydCBsaWJyYXJ5IGRvZXNuJ3Qga25vdyBhYm91dCB0aGUgaW50ZXJuYWwgbmFtZSAqLwotICAgICAgY2hhciAqaW50ZXJuYWwgPSBkZWYtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZTsKLSAgICAgIGJmZCAqbjsKLSAgICAgIGRlZi0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lID0gZGVmLT5leHBvcnRzW2ldLm5hbWU7Ci0gICAgICBuID0gbWFrZV9vbmUgKGRlZi0+ZXhwb3J0cytpLCBvdXRhcmNoKTsKLSAgICAgIG4tPm5leHQgPSBoZWFkOwotICAgICAgaGVhZCA9IG47Ci0gICAgICBkZWYtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSA9IGludGVybmFsOwotICAgIH0KLQotICBhcl90YWlsID0gbWFrZV90YWlsIChvdXRhcmNoKTsKLQotICBpZiAoYXJfaGVhZCA9PSBOVUxMIHx8IGFyX3RhaWwgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogTm93IHN0aWNrIHRoZW0gYWxsIGludG8gdGhlIGFyY2hpdmUgKi8KLQotICBhcl9oZWFkLT5uZXh0ID0gaGVhZDsKLSAgYXJfdGFpbC0+bmV4dCA9IGFyX2hlYWQ7Ci0gIGhlYWQgPSBhcl90YWlsOwotCi0gIGlmICghIGJmZF9zZXRfYXJjaGl2ZV9oZWFkIChvdXRhcmNoLCBoZWFkKSkKLSAgICBlaW5mbyAoIiVYYmZkX3NldF9hcmNoaXZlX2hlYWQ6ICVzXG4iLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gIAotICBpZiAoISBiZmRfY2xvc2UgKG91dGFyY2gpKQotICAgIGVpbmZvICgiJVhiZmRfY2xvc2UgJXM6ICVzXG4iLCBpbXBmaWxlbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCi0gIHdoaWxlIChoZWFkICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkICpuID0gaGVhZC0+bmV4dDsKLSAgICAgIGJmZF9jbG9zZSAoaGVhZCk7Ci0gICAgICBoZWFkID0gbjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGRfYmZkX3RvX2xpbmsgKGFiZmQsIG5hbWUsIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotewotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmYWtlX2ZpbGU7Ci0gIGZha2VfZmlsZSA9IGxhbmdfYWRkX2lucHV0X2ZpbGUgKG5hbWUsCi0JCQkJICAgbGFuZ19pbnB1dF9maWxlX2lzX2Zha2VfZW51bSwKLQkJCQkgICBOVUxMKTsKLSAgZmFrZV9maWxlLT50aGVfYmZkID0gYWJmZDsKLSAgbGRsYW5nX2FkZF9maWxlIChmYWtlX2ZpbGUpOwotICBpZiAoIWJmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBsaW5rX2luZm8pKQotICAgIGVpbmZvICgiJVhhZGRzeW0gJXM6ICVzXG4iLCBuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci19Ci0KLXZvaWQKLXBlX3Byb2Nlc3NfaW1wb3J0X2RlZnMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotewotICBkZWZfZmlsZV9tb2R1bGUgKm1vZHVsZTsKLSAgcGVfZGxsX2lkX3RhcmdldChiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCkpOwotCi0gIGlmICghcGVfZGVmX2ZpbGUpCi0gICAgcmV0dXJuOwotCi0gIGZvciAobW9kdWxlID0gcGVfZGVmX2ZpbGUtPm1vZHVsZXM7IG1vZHVsZTsgbW9kdWxlID0gbW9kdWxlLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBpLCBkb190aGlzX2RsbDsKLQotICAgICAgZGxsX2ZpbGVuYW1lID0gbW9kdWxlLT5uYW1lOwotICAgICAgZGxsX3N5bW5hbWUgPSB4c3RyZHVwIChtb2R1bGUtPm5hbWUpOwotICAgICAgZm9yIChpPTA7IGRsbF9zeW1uYW1lW2ldOyBpKyspCi0JaWYgKCFpc2FsbnVtIChkbGxfc3ltbmFtZVtpXSkpCi0JICBkbGxfc3ltbmFtZVtpXSA9ICdfJzsKLQotICAgICAgZG9fdGhpc19kbGwgPSAwOwotCi0gICAgICBmb3IgKGk9MDsgaTxwZV9kZWZfZmlsZS0+bnVtX2ltcG9ydHM7IGkrKykKLQlpZiAocGVfZGVmX2ZpbGUtPmltcG9ydHNbaV0ubW9kdWxlID09IG1vZHVsZSkKLQkgIHsKLQkgICAgZGVmX2ZpbGVfZXhwb3J0IGV4cDsKLQkgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmJsaGU7Ci0KLQkgICAgLyogc2VlIGlmIHdlIG5lZWQgdGhpcyBpbXBvcnQgKi8KLQkgICAgY2hhciAqbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocGVfZGVmX2ZpbGUtPmltcG9ydHNbaV0uaW50ZXJuYWxfbmFtZSkgKyAyKTsKLQkgICAgc3ByaW50ZiAobmFtZSwgIiVzJXMiLCBVKCIiKSwgcGVfZGVmX2ZpbGUtPmltcG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7Ci0JICAgIGJsaGUgPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLT5oYXNoLCBuYW1lLAotCQkJCQkgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JICAgIGZyZWUgKG5hbWUpOwotCSAgICBpZiAoYmxoZSAmJiBibGhlLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCSAgICAgIHsKLQkJYmZkICpvbmU7Ci0JCS8qIHdlIGRvICovCi0JCWlmICghZG9fdGhpc19kbGwpCi0JCSAgewotCQkgICAgYmZkICphcl9oZWFkID0gbWFrZV9oZWFkIChvdXRwdXRfYmZkKTsKLQkJICAgIGFkZF9iZmRfdG9fbGluayAoYXJfaGVhZCwgYXJfaGVhZC0+ZmlsZW5hbWUsIGxpbmtfaW5mbyk7Ci0JCSAgICBkb190aGlzX2RsbCA9IDE7Ci0JCSAgfQotCQlleHAuaW50ZXJuYWxfbmFtZSA9IHBlX2RlZl9maWxlLT5pbXBvcnRzW2ldLmludGVybmFsX25hbWU7Ci0JCWV4cC5uYW1lID0gcGVfZGVmX2ZpbGUtPmltcG9ydHNbaV0ubmFtZTsKLQkJZXhwLm9yZGluYWwgPSBwZV9kZWZfZmlsZS0+aW1wb3J0c1tpXS5vcmRpbmFsOwotCQlleHAuaGludCA9IGV4cC5vcmRpbmFsID49IDAgPyBleHAub3JkaW5hbCA6IDA7Ci0JCWV4cC5mbGFnX3ByaXZhdGUgPSAwOwotCQlleHAuZmxhZ19jb25zdGFudCA9IDA7Ci0JCWV4cC5mbGFnX2RhdGEgPSAwOwotCQlleHAuZmxhZ19ub25hbWUgPSBleHAubmFtZSA/IDAgOiAxOwotCQlvbmUgPSBtYWtlX29uZSAoJmV4cCwgb3V0cHV0X2JmZCk7Ci0JCWFkZF9iZmRfdG9fbGluayAob25lLCBvbmUtPmZpbGVuYW1lLCBsaW5rX2luZm8pOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIGlmIChkb190aGlzX2RsbCkKLQl7Ci0JICBiZmQgKmFyX3RhaWwgPSBtYWtlX3RhaWwgKG91dHB1dF9iZmQpOwotCSAgYWRkX2JmZF90b19saW5rIChhcl90YWlsLCBhcl90YWlsLT5maWxlbmFtZSwgbGlua19pbmZvKTsKLQl9Ci0KLSAgICAgIGZyZWUgKGRsbF9zeW1uYW1lKTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIFdlIHdlcmUgaGFuZGVkIGEgKi5ETEwgZmlsZS4gIFBhcnNlIGl0IGFuZCB0dXJuIGl0IGludG8gYSBzZXQgb2YKLSBJTVBPUlRTIGRpcmVjdGl2ZXMgaW4gdGhlIGRlZiBmaWxlLiAgUmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgd2FzCi0gaGFuZGxlZCwgZmFsc2UgaWYgbm90LgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wZV9nZXQxNiAoYWJmZCwgd2hlcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHdoZXJlOwotewotICB1bnNpZ25lZCBjaGFyIGJbMl07Ci0gIGJmZF9zZWVrIChhYmZkLCB3aGVyZSwgU0VFS19TRVQpOwotICBiZmRfcmVhZCAoYiwgMSwgMiwgYWJmZCk7Ci0gIHJldHVybiBiWzBdICsgKGJbMV08PDgpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wZV9nZXQzMiAoYWJmZCwgd2hlcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHdoZXJlOwotewotICB1bnNpZ25lZCBjaGFyIGJbNF07Ci0gIGJmZF9zZWVrIChhYmZkLCB3aGVyZSwgU0VFS19TRVQpOwotICBiZmRfcmVhZCAoYiwgMSwgNCwgYWJmZCk7Ci0gIHJldHVybiBiWzBdICsgKGJbMV08PDgpICsgKGJbMl08PDE2KSArIChiWzNdPDwyNCk7Ci19Ci0KLSNpZiAwIC8qIFRoaXMgaXMgbm90IGN1cnJlbnRseSB1c2VkLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotcGVfYXMxNiAocHRyKQotICAgICB2b2lkICpwdHI7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmIgPSBwdHI7Ci0gIHJldHVybiBiWzBdICsgKGJbMV08PDgpOwotfQotCi0jZW5kaWYKLQotc3RhdGljIHVuc2lnbmVkIGludAotcGVfYXMzMiAocHRyKQotICAgICB2b2lkICpwdHI7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmIgPSBwdHI7Ci0gIHJldHVybiBiWzBdICsgKGJbMV08PDgpICsgKGJbMl08PDE2KSArIChiWzNdPDwyNCk7Ci19Ci0KLWJvb2xlYW4KLXBlX2ltcGxpZWRfaW1wb3J0X2RsbCAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBiZmQgKmRsbDsKLSAgdW5zaWduZWQgbG9uZyBwZV9oZWFkZXJfb2Zmc2V0LCBvcHRoZHJfb2ZzLCBudW1fZW50cmllcywgaTsKLSAgdW5zaWduZWQgbG9uZyBleHBvcnRfcnZhLCBleHBvcnRfc2l6ZSwgbnNlY3Rpb25zLCBzZWNwdHIsIGV4cHB0cjsKLSAgdW5zaWduZWQgY2hhciAqZXhwZGF0YSwgKmVydmE7Ci0gIHVuc2lnbmVkIGxvbmcgbmFtZV9ydmFzLCBvcmRpbmFscywgbmV4cCwgb3JkYmFzZTsKLSAgY2hhciAqZGxsX25hbWU7Ci0KLSAgLyogTm8sIEkgY2FuJ3QgdXNlIGJmZCBoZXJlLiAga2VybmVsMzIuZGxsIHB1dHMgaXRzIGV4cG9ydCB0YWJsZSBpbgotICAgICB0aGUgbWlkZGxlIG9mIHRoZSAucmRhdGEgc2VjdGlvbi4gKi8KLQotICBkbGwgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCBwZV9kZXRhaWxzLT50YXJnZXRfbmFtZSk7Ci0gIGlmICghZGxsKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVhvcGVuICVzOiAlc1xuIiwgZmlsZW5hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIC8qIFBFSSBkbGxzIHNlZW0gdG8gYmUgYmZkX29iamVjdHMgKi8KLSAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0IChkbGwsIGJmZF9vYmplY3QpKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVglczogdGhpcyBkb2Vzbid0IGFwcGVhciB0byBiZSBhIERMTFxuIiwgZmlsZW5hbWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBkbGxfbmFtZSA9IGZpbGVuYW1lOwotICBmb3IgKGk9MDsgZmlsZW5hbWVbaV07IGkrKykKLSAgICBpZiAoZmlsZW5hbWVbaV0gPT0gJy8nIHx8IGZpbGVuYW1lW2ldID09ICdcXCcgfHwgZmlsZW5hbWVbaV0gPT0gJzonKQotICAgICAgZGxsX25hbWUgPSBmaWxlbmFtZSArIGkgKyAxOwotCi0gIHBlX2hlYWRlcl9vZmZzZXQgPSBwZV9nZXQzMiAoZGxsLCAweDNjKTsKLSAgb3B0aGRyX29mcyA9IHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsgMjA7Ci0gIG51bV9lbnRyaWVzID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDkyKTsKLSAgaWYgKG51bV9lbnRyaWVzIDwgMSkgLyogbm8gZXhwb3J0cyAqLwotICAgIHJldHVybiBmYWxzZTsKLSAgZXhwb3J0X3J2YSA9IHBlX2dldDMyIChkbGwsIG9wdGhkcl9vZnMgKyA5Nik7Ci0gIGV4cG9ydF9zaXplID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDEwMCk7Ci0gIG5zZWN0aW9ucyA9IHBlX2dldDE2IChkbGwsIHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsgMik7Ci0gIHNlY3B0ciA9IChwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIwICsKLQkgICAgcGVfZ2V0MTYgKGRsbCwgcGVfaGVhZGVyX29mZnNldCArIDQgKyAxNikpOwotICBleHBwdHIgPSAwOwotICBmb3IgKGk9MDsgaTxuc2VjdGlvbnM7IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIHNuYW1lWzhdOwotICAgICAgdW5zaWduZWQgbG9uZyBzZWNwdHIxID0gc2VjcHRyICsgNDAgKiBpOwotICAgICAgdW5zaWduZWQgbG9uZyB2YWRkciA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxMik7Ci0gICAgICB1bnNpZ25lZCBsb25nIHZzaXplID0gcGVfZ2V0MzIgKGRsbCwgc2VjcHRyMSArIDE2KTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZnB0ciA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAyMCk7Ci0gICAgICBiZmRfc2VlayhkbGwsIHNlY3B0cjEsIFNFRUtfU0VUKTsKLSAgICAgIGJmZF9yZWFkKHNuYW1lLCAxLCA4LCBkbGwpOwotICAgICAgaWYgKHZhZGRyIDw9IGV4cG9ydF9ydmEgJiYgdmFkZHIrdnNpemUgPiBleHBvcnRfcnZhKQotCXsKLQkgIGV4cHB0ciA9IGZwdHIgKyAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKLQkgIGlmIChleHBvcnRfcnZhICsgZXhwb3J0X3NpemUgPiB2YWRkciArIHZzaXplKQotCSAgICBleHBvcnRfc2l6ZSA9IHZzaXplIC0gKGV4cG9ydF9ydmEgLSB2YWRkcik7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGV4cGRhdGEgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jIChleHBvcnRfc2l6ZSk7Ci0gIGJmZF9zZWVrIChkbGwsIGV4cHB0ciwgU0VFS19TRVQpOwotICBiZmRfcmVhZCAoZXhwZGF0YSwgMSwgZXhwb3J0X3NpemUsIGRsbCk7Ci0gIGVydmEgPSBleHBkYXRhIC0gZXhwb3J0X3J2YTsKLQotICBpZiAocGVfZGVmX2ZpbGUgPT0gMCkKLSAgICBwZV9kZWZfZmlsZSA9IGRlZl9maWxlX2VtcHR5KCk7Ci0KLSAgbmV4cCA9IHBlX2FzMzIgKGV4cGRhdGErMjQpOwotICBuYW1lX3J2YXMgPSBwZV9hczMyIChleHBkYXRhKzMyKTsKLSAgb3JkaW5hbHMgPSBwZV9hczMyIChleHBkYXRhKzM2KTsKLSAgb3JkYmFzZSA9IHBlX2FzMzIgKGV4cGRhdGErMTYpOwotICBmb3IgKGk9MDsgaTxuZXhwOyBpKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBuYW1lX3J2YSA9IHBlX2FzMzIgKGVydmErbmFtZV9ydmFzK2kqNCk7Ci0gICAgICBkZWZfZmlsZV9pbXBvcnQgKmltcDsKLSAgICAgIGltcCA9IGRlZl9maWxlX2FkZF9pbXBvcnQgKHBlX2RlZl9maWxlLCBlcnZhK25hbWVfcnZhLCBkbGxfbmFtZSwKLQkJCQkgaSwgMCk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBUaGVzZSBhcmUgdGhlIG1haW4gZnVuY3Rpb25zLCBjYWxsZWQgZnJvbSB0aGUgZW11bGF0aW9uLiAgVGhlIGZpcnN0Ci0gaXMgY2FsbGVkIGFmdGVyIHRoZSBiZmRzIGFyZSByZWFkLCBzbyB3ZSBjYW4gZ3Vlc3MgYXQgaG93IG11Y2ggc3BhY2UKLSB3ZSBuZWVkLiAgVGhlIHNlY29uZCBpcyBjYWxsZWQgYWZ0ZXIgZXZlcnl0aGluZyBpcyBwbGFjZWQsIHNvIHdlCi0gY2FuIHB1dCB0aGUgcmlnaHQgdmFsdWVzIGluIHBsYWNlLgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1wZV9kbGxfYnVpbGRfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHBlX2RsbF9pZF90YXJnZXQgKGJmZF9nZXRfdGFyZ2V0IChhYmZkKSk7Ci0gIHByb2Nlc3NfZGVmX2ZpbGUgKGFiZmQsIGluZm8pOwotCi0gIGdlbmVyYXRlX2VkYXRhIChhYmZkLCBpbmZvKTsKLSAgYnVpbGRfZmlsbGVyX2JmZCAoMSk7Ci19Ci0KLXZvaWQKLXBlX2V4ZV9idWlsZF9zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcGVfZGxsX2lkX3RhcmdldCAoYmZkX2dldF90YXJnZXQgKGFiZmQpKTsKLSAgYnVpbGRfZmlsbGVyX2JmZCAoMCk7Ci19Ci0KLXZvaWQKLXBlX2RsbF9maWxsX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBwZV9kbGxfaWRfdGFyZ2V0IChiZmRfZ2V0X3RhcmdldCAoYWJmZCkpOwotICBpbWFnZV9iYXNlID0gcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0KLSAgZ2VuZXJhdGVfcmVsb2MgKGFiZmQsIGluZm8pOwotICBpZiAocmVsb2Nfc3ogPiAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChmaWxsZXJfYmZkLCByZWxvY19zLCByZWxvY19zeik7Ci0KLSAgICAgIC8qIFJlc2l6ZSB0aGUgc2VjdGlvbnMuICAqLwotICAgICAgbGFuZ19zaXplX3NlY3Rpb25zIChzdGF0X3B0ci0+aGVhZCwgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAmc3RhdF9wdHItPmhlYWQsIDAsIChiZmRfdm1hKSAwLCBmYWxzZSk7Ci0KLSAgICAgIC8qIFJlZG8gc3BlY2lhbCBzdHVmZi4gICovCi0gICAgICBsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbiAoKTsKLQotICAgICAgLyogRG8gdGhlIGFzc2lnbm1lbnRzIGFnYWluLiAgKi8KLSAgICAgIGxhbmdfZG9fYXNzaWdubWVudHMgKHN0YXRfcHRyLT5oZWFkLAotCQkJICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAgKGZpbGxfdHlwZSkgMCwgKGJmZF92bWEpIDApOwotICAgIH0KLQotICBmaWxsX2VkYXRhIChhYmZkLCBpbmZvKTsKLQotICBwZV9kYXRhIChhYmZkKS0+ZGxsID0gMTsKLQotICBlZGF0YV9zLT5jb250ZW50cyA9IGVkYXRhX2Q7Ci0gIHJlbG9jX3MtPmNvbnRlbnRzID0gcmVsb2NfZDsKLX0KLQotdm9pZAotcGVfZXhlX2ZpbGxfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHBlX2RsbF9pZF90YXJnZXQgKGJmZF9nZXRfdGFyZ2V0IChhYmZkKSk7Ci0gIGltYWdlX2Jhc2UgPSBwZV9kYXRhIChhYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQotICBnZW5lcmF0ZV9yZWxvYyAoYWJmZCwgaW5mbyk7Ci0gIGlmIChyZWxvY19zeiA+IDApCi0gICAgewotICAgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGZpbGxlcl9iZmQsIHJlbG9jX3MsIHJlbG9jX3N6KTsKLQotICAgICAgLyogUmVzaXplIHRoZSBzZWN0aW9ucy4gICovCi0gICAgICBsYW5nX3NpemVfc2VjdGlvbnMgKHN0YXRfcHRyLT5oZWFkLCBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICZzdGF0X3B0ci0+aGVhZCwgMCwgKGJmZF92bWEpIDAsIGZhbHNlKTsKLQotICAgICAgLyogUmVkbyBzcGVjaWFsIHN0dWZmLiAgKi8KLSAgICAgIGxkZW11bF9hZnRlcl9hbGxvY2F0aW9uICgpOwotCi0gICAgICAvKiBEbyB0aGUgYXNzaWdubWVudHMgYWdhaW4uICAqLwotICAgICAgbGFuZ19kb19hc3NpZ25tZW50cyAoc3RhdF9wdHItPmhlYWQsCi0JCQkgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICAoZmlsbF90eXBlKSAwLCAoYmZkX3ZtYSkgMCk7Ci0gICAgfQotICByZWxvY19zLT5jb250ZW50cyA9IHJlbG9jX2Q7Ci19CmRpZmYgLS1naXQgYS9sZC9wby9NYWtlLWluIGIvbGQvcG8vTWFrZS1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5MTA5MC4uMDAwMDAwMAotLS0gYS9sZC9wby9NYWtlLWluCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHByb2dyYW0gc291cmNlIGRpcmVjdG9yeSBpbiBHTlUgTkxTIHV0aWxpdGllcyBwYWNrYWdlLgotIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+Ci0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi1AU0VUX01BS0VACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSAkKHByZWZpeCkvc2hhcmUvZ2V0dGV4dC9wbwotc3ViZGlyID0gcG8KLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLQotQ0MgPSBAQ0NACi1HRU5DQVQgPSBAR0VOQ0FUQAotR01TR0ZNVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAR01TR0ZNVEAKLU1TR0ZNVCA9IEBNU0dGTVRACi1YR0VUVEVYVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAWEdFVFRFWFRACi1NU0dNRVJHRSA9IFBBVEg9Li4vc3JjOiQkUEFUSCBtc2dtZXJnZQotCi1ERUZTID0gQERFRlNACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi0KLUlOQ0xVREVTID0gLUkuLiAtSSQodG9wX3NyY2RpcikvaW50bAotCi1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotCi1TT1VSQ0VTID0gY2F0LWlkLXRibC5jCi1QT0ZJTEVTID0gQFBPRklMRVNACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLURJU1RGSUxFUyA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbi5pbiBQT1RGSUxFUy5pbiAkKFBBQ0tBR0UpLnBvdCBcCi1zdGFtcC1jYXQtaWQgJChQT0ZJTEVTKSAkKEdNT0ZJTEVTKSAkKFNPVVJDRVMpCi0KLVBPVEZJTEVTID0gXAotCi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLnBvIC5wb3ggLmdtbyAubW8gLm1zZyAuY2F0Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotCi0ucG8ucG94OgotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQkkKE1TR01FUkdFKSAkPCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgLW8gJCoucG94Ci0KLS5wby5tbzoKLQkkKE1TR0ZNVCkgLW8gJEAgJDwKLQotLnBvLmdtbzoKLQlmaWxlPSQoc3JjZGlyKS9gZWNobyAkKiB8IHNlZCAncywuKi8sLCdgLmdtbyBcCi0JICAmJiBybSAtZiAkJGZpbGUgJiYgJChHTVNHRk1UKSAtbyAkJGZpbGUgJDwKLQotLnBvLmNhdDoKLQlzZWQgLWYgLi4vaW50bC9wbzJtc2cuc2VkIDwgJDwgPiAkKi5tc2cgXAotCSAgJiYgcm0gLWYgJEAgJiYgJChHRU5DQVQpICRAICQqLm1zZwotCi0KLWFsbDogYWxsLUBVU0VfTkxTQAotCi1hbGwteWVzOiAkKENBVEFMT0dTKSBATUFJTlRAICQoUEFDS0FHRSkucG90Ci1hbGwtbm86Ci0KLSQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdDogJChQT1RGSUxFUykKLQkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoUEFDS0FHRSkgLS1kaXJlY3Rvcnk9JCh0b3Bfc3JjZGlyKSBcCi0JICAtLWFkZC1jb21tZW50cyAtQyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gXAotCSAgLS1maWxlcy1mcm9tPSQoc3JjZGlyKS9QT1RGSUxFUy5pbgotCXJtIC1mICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCW12ICQoUEFDS0FHRSkucG8gJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0KLSQoc3JjZGlyKS9jYXQtaWQtdGJsLmM6IHN0YW1wLWNhdC1pZDsgQDoKLSQoc3JjZGlyKS9zdGFtcC1jYXQtaWQ6ICQoUEFDS0FHRSkucG90Ci0Jcm0gLWYgY2F0LWlkLXRibC50bXAKLQlzZWQgLWYgLi4vaW50bC9wbzJ0Ymwuc2VkICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCBcCi0JCXwgc2VkIC1lICJzL0BQQUNLQUdFIE5BTUVALyQoUEFDS0FHRSkvIiA+IGNhdC1pZC10YmwudG1wCi0JaWYgY21wIC1zIGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IHRoZW4gXAotCSAgcm0gY2F0LWlkLXRibC50bXA7IFwKLQllbHNlIFwKLQkgIGVjaG8gY2F0LWlkLXRibC5jIGNoYW5nZWQ7IFwKLQkgIHJtIC1mICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQkgIG12IGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQlmaQotCWNkICQoc3JjZGlyKSAmJiBybSAtZiBzdGFtcC1jYXQtaWQgJiYgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1jYXQtaWQKLQotCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6Ci1pbnN0YWxsLWluZm86Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKLWluc3RhbGwtZGF0YS1ubzogYWxsCi1pbnN0YWxsLWRhdGEteWVzOiBhbGwKLQlpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgJChNS0lOU1RBTExESVJTKSAkKGRhdGFkaXIpOyBcCi0JZWxzZSBcCi0JICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChkYXRhZGlyKTsgXAotCWZpCi0JQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBjYXNlICIkJGNhdCIgaW4gXAotCSAgICAqLmdtbykgZGVzdGRpcj0kKGdudWxvY2FsZWRpcik7OyBcCi0JICAgICopICAgICBkZXN0ZGlyPSQobG9jYWxlZGlyKTs7IFwKLQkgIGVzYWM7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgZGlyPSQkZGVzdGRpci8kJGxhbmcvTENfTUVTU0FHRVM7IFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJCRkaXI7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJCRkaXI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0OyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQgYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBlbHNlIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQubTsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdC5tICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdC5tIGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICBlbHNlIFwKLQkgICAgaWYgdGVzdCAtciAkKHNyY2RpcikvJCRjYXQubSA7IHRoZW4gXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQubSBcCi0JCSQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgICAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlkb25lCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL01ha2VmaWxlLmluLmluIFwKLQkJCSAgJChnZXR0ZXh0c3JjZGlyKS9NYWtlZmlsZS5pbi5pbjsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi1pbnN0YWxsY2hlY2s6Ci0KLXVuaW5zdGFsbDoKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCWRvbmUKLQlybSAtZiAkKGdldHRleHRzcmNkaXIpL3BvLU1ha2VmaWxlLmluLmluCi0KLWNoZWNrOiBhbGwKLQotY2F0LWlkLXRibC5vOiAuLi9pbnRsL2xpYmdldHRleHQuaAotCi1kdmkgaW5mbyB0YWdzIFRBR1MgSUQ6Ci0KLW1vc3RseWNsZWFuOgotCXJtIC1mIGNvcmUgY29yZS4qICoucG94ICQoUEFDS0FHRSkucG8gKi5vbGQucG8gY2F0LWlkLXRibC50bXAKLQlybSAtZnIgKi5vCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgTWFrZWZpbGUuaW4gUE9URklMRVMgKi5tbyAqLm1zZyAqLmNhdCAqLmNhdC5tCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCXJtIC1mICQoR01PRklMRVMpCi0KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IHVwZGF0ZS1wbyAkKERJU1RGSUxFUykKLQlkaXN0cz0iJChESVNURklMRVMpIjsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIGxuICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKLQlkb25lCi0KLXVwZGF0ZS1wbzogTWFrZWZpbGUKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JUEFUSD1gcHdkYC8uLi9zcmM6JCRQQVRIOyBcCi0JY2QgJChzcmNkaXIpOyBcCi0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgbXYgJCRsYW5nLnBvICQkbGFuZy5vbGQucG87IFwKLQkgIGVjaG8gIiQkbGFuZzoiOyBcCi0JICBpZiAkKE1TR01FUkdFKSAkJGxhbmcub2xkLnBvICQoUEFDS0FHRSkucG90IC1vICQkbGFuZy5wbzsgdGhlbiBcCi0JICAgIHJtIC1mICQkbGFuZy5vbGQucG87IFwKLQkgIGVsc2UgXAotCSAgICBlY2hvICJtc2dtZXJnZSBmb3IgJCRjYXQgZmFpbGVkISI7IFwKLQkgICAgcm0gLWYgJCRsYW5nLnBvOyBcCi0JICAgIG12ICQkbGFuZy5vbGQucG8gJCRsYW5nLnBvOyBcCi0JICBmaTsgXAotCWRvbmUKLQotUE9URklMRVM6IFBPVEZJTEVTLmluCi0JKCBpZiB0ZXN0ICd4JChzcmNkaXIpJyAhPSAneC4nOyB0aGVuIFwKLQkgICAgcG9zcmNwcmVmaXg9JyQodG9wX3NyY2RpcikvJzsgXAotCSAgZWxzZSBcCi0JICAgIHBvc3JjcHJlZml4PSIuLi8iOyBcCi0JICBmaTsgXAotCSAgcm0gLWYgJEAtdCAkQCBcCi0JICAgICYmIChzZWQgLWUgJy9eIy9kJyAtZSAnL15bIAldKiQkL2QnIFwKLQkJICAgIC1lICJzQC4qQAkkJHBvc3JjcHJlZml4JiBcXFxcQCIgPCAkKHNyY2RpcikvJEAuaW4gXAotCQl8IHNlZCAtZSAnJCRzL1xcJCQvLycpID4gJEAtdCBcCi0JICAgICYmIGNobW9kIGEtdyAkQC10IFwKLQkgICAgJiYgbXYgJEAtdCAkQCApCi0KLVBPVEZJTEVTLmluOiBATUFJTlRAIC4uL01ha2VmaWxlCi0JY2QgLi4gJiYgJChNQUtFKSBwby9QT1RGSUxFUy5pbgotCi1NYWtlZmlsZTogTWFrZS1pbiAuLi9jb25maWcuc3RhdHVzIFBPVEZJTEVTCi0JY2QgLi4gXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS9NYWtlZmlsZS5pbjokKHN1YmRpcikvTWFrZS1pbiBcCi0JICAgICBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2xkL3BvL1BPVEZJTEVTLmluIGIvbGQvcG8vUE9URklMRVMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OGE4YTYuLjAwMDAwMDAKLS0tIGEvbGQvcG8vUE9URklMRVMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi1kZWZmaWxlLmgKLWxkLmgKLWxkY3JlZi5jCi1sZGN0b3IuYwotbGRjdG9yLmgKLWxkZW11bC5jCi1sZGVtdWwuaAotbGRleHAuYwotbGRleHAuaAotbGRmaWxlLmMKLWxkZmlsZS5oCi1sZGxhbmcuYwotbGRsYW5nLmgKLWxkbGV4LmgKLWxkbWFpbi5jCi1sZG1haW4uaAotbGRtaXNjLmMKLWxkbWlzYy5oCi1sZHZlci5jCi1sZHZlci5oCi1sZHdyaXRlLmMKLWxkd3JpdGUuaAotbGV4c3VwLmMKLW1wdy1lbGZtaXBzLmMKLW1wdy1lcHBjbWFjLmMKLW1wdy1lc2guYwotbXB3LWlkdG1pcHMuYwotbXJpLmMKLW1yaS5oCi1wZS1kbGwuYwotc3lzZGVwLmgKLXRlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWZvby5oCi10ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5jCi10ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuYwotdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2LmMKLXRlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEuYwotdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIuYwotdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMuYwotdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczQuYwotdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczUuYwotdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuYwotdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcuYwotdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLmMKLXRlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM4LmMKLXRlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmMKLXRlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDEuYwotdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4Mi5jCi10ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgzLmMKLXRlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDQuYwotdGVzdHN1aXRlL2xkLWVtcGljL3J1bi5jCi10ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDEuYwotdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3QyLmMKLXRlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMS5jCi10ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczIuYwotdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MzLmMKLXRlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMS5jCi10ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzIuYwotdGVzdHN1aXRlL2xkLXNoL3NoMi5jCi10ZXN0c3VpdGUvbGQtc2hhcmVkL21haW4uYwotdGVzdHN1aXRlL2xkLXNoYXJlZC9zaDEuYwotdGVzdHN1aXRlL2xkLXNoYXJlZC9zaDIuYwotdGVzdHN1aXRlL2xkLXNyZWMvc3IxLmMKLXRlc3RzdWl0ZS9sZC1zcmVjL3NyMi5jCi10ZXN0c3VpdGUvbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5jCmRpZmYgLS1naXQgYS9sZC9wby9sZC5wb3QgYi9sZC9wby9sZC5wb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYWFlYjAuLjAwMDAwMDAKLS0tIGEvbGQvcG8vbGQucG90CisrKyAvZGV2L251bGwKQEAgLTEsMTM3MiArMCwwIEBACi0jIFNPTUUgREVTQ1JJUFRJVkUgVElUTEUuCi0jIENvcHlyaWdodCAoQykgWUVBUiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgRklSU1QgQVVUSE9SIDxFTUFJTEBBRERSRVNTPiwgWUVBUi4KLSMKLSMsIGZ1enp5Ci1tc2dpZCAiIgotbXNnc3RyICIiCi0iUHJvamVjdC1JZC1WZXJzaW9uOiBQQUNLQUdFIFZFUlNJT05cbiIKLSJQT1QtQ3JlYXRpb24tRGF0ZTogMTk5OS0wMi0xMSAyMTowMCswMDAwXG4iCi0iUE8tUmV2aXNpb24tRGF0ZTogWUVBUi1NTy1EQSBITzpNSStaT05FXG4iCi0iTGFzdC1UcmFuc2xhdG9yOiBGVUxMIE5BTUUgPEVNQUlMQEFERFJFU1M+XG4iCi0iTGFuZ3VhZ2UtVGVhbTogTEFOR1VBR0UgPExMQGxpLm9yZz5cbiIKLSJNSU1FLVZlcnNpb246IDEuMFxuIgotIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1DSEFSU0VUXG4iCi0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogRU5DT0RJTkdcbiIKLQotIzogZW11bHRlbXBsL2FybWNvZmYuZW06NjUKLW1zZ2lkICIgIC0tc3VwcG9ydC1vbGQtY29kZSAgIFN1cHBvcnQgaW50ZXJ3b3JraW5nIHdpdGggb2xkIGNvZGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvYXJtY29mZi5lbToxMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MTkwCi1tc2dpZCAiIgotIiAgLS1iYXNlX2ZpbGUgPGJhc2VmaWxlPiAgICAgICAgICAgICBHZW5lcmF0ZSBhIGJhc2UgZmlsZSBmb3IgcmVsb2NhdGFibGUgIgotIkRMTHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MTkxCi1tc2dpZCAiIgotIiAgLS1kbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgaW1hZ2UgYmFzZSB0byB0aGUgZGVmYXVsdCBmb3IgRExMc1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToxOTIKLW1zZ2lkICIgIC0tZmlsZS1hbGlnbm1lbnQgPHNpemU+ICAgICAgICAgICAgU2V0IGZpbGUgYWxpZ25tZW50XG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjE5MwotbXNnaWQgIiAgLS1oZWFwIDxzaXplPiAgICAgICAgICAgICAgICAgICAgICBTZXQgaW5pdGlhbCBzaXplIG9mIHRoZSBoZWFwXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjE5NAotbXNnaWQgIiIKLSIgIC0taW1hZ2UtYmFzZSA8YWRkcmVzcz4gICAgICAgICAgICAgU2V0IHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MTk1Ci1tc2dpZCAiIgotIiAgLS1tYWpvci1pbWFnZS12ZXJzaW9uIDxudW1iZXI+ICAgICBTZXQgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MTk2Ci1tc2dpZCAiICAtLW1ham9yLW9zLXZlcnNpb24gPG51bWJlcj4gICAgICAgIFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHZlcnNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MTk3Ci1tc2dpZCAiIgotIiAgLS1tYWpvci1zdWJzeXN0ZW0tdmVyc2lvbiA8bnVtYmVyPiBTZXQgbWluaW11bSByZXF1aXJlZCBPUyBzdWJzeXN0ZW0gIgotInZlcnNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MTk4Ci1tc2dpZCAiIgotIiAgLS1taW5vci1pbWFnZS12ZXJzaW9uIDxudW1iZXI+ICAgICBTZXQgcmV2aXNpb24gbnVtYmVyIG9mIHRoZSBleGVjdXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjE5OQotbXNnaWQgIiAgLS1taW5vci1vcy12ZXJzaW9uIDxudW1iZXI+ICAgICAgICBTZXQgbWluaW11bSByZXF1aXJlZCBPUyByZXZpc2lvblxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMDAKLW1zZ2lkICIiCi0iICAtLW1pbm9yLXN1YnN5c3RlbS12ZXJzaW9uIDxudW1iZXI+IFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHN1YnN5c3RlbSAiCi0icmV2aXNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjAxCi1tc2dpZCAiICAtLXNlY3Rpb24tYWxpZ25tZW50IDxzaXplPiAgICAgICAgIFNldCBzZWN0aW9uIGFsaWdubWVudFxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMDIKLW1zZ2lkICIgIC0tc3RhY2sgPHNpemU+ICAgICAgICAgICAgICAgICAgICAgU2V0IHNpemUgb2YgdGhlIGluaXRpYWwgc3RhY2tcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjAzCi1tc2dpZCAiIgotIiAgLS1zdWJzeXN0ZW0gPG5hbWU+Wzo8dmVyc2lvbj5dICAgICBTZXQgcmVxdWlyZWQgT1Mgc3Vic3lzdGVtIFsmIHZlcnNpb25dXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIwNAotbXNnaWQgIiIKLSIgIC0tc3VwcG9ydC1vbGQtY29kZSAgICAgICAgICAgICAgICAgU3VwcG9ydCBpbnRlcndvcmtpbmcgd2l0aCBvbGQgY29kZVxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMDYKLW1zZ2lkICIiCi0iICAtLWFkZC1zdGRjYWxsLWFsaWFzICAgICAgICAgICAgICAgIEV4cG9ydCBzeW1ib2xzIHdpdGggYW5kIHdpdGhvdXQgQG5uXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIwNwotbXNnaWQgIiAgLS1kaXNhYmxlLXN0ZGNhbGwtZml4dXAgICAgICAgICAgICBEb24ndCBsaW5rIF9zeW0gdG8gX3N5bUBublxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMDgKLW1zZ2lkICIiCi0iICAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwICAgICAgICAgICAgIExpbmsgX3N5bSB0byBfc3ltQG5uIHdpdGhvdXQgd2FybmluZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjA5Ci1tc2dpZCAiIgotIiAgLS1leGNsdWRlLXN5bWJvbHMgc3ltLHN5bSwuLi4gICAgICBFeGNsdWRlIHN5bWJvbHMgZnJvbSBhdXRvbWF0aWMgZXhwb3J0XG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIxMAotbXNnaWQgIiIKLSIgIC0tZXhwb3J0LWFsbC1zeW1ib2xzICAgICAgICAgICAgICAgQXV0b21hdGljYWxseSBleHBvcnQgYWxsIGdsb2JhbHMgdG8gIgotIkRMTFxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMTEKLW1zZ2lkICIgIC0ta2lsbC1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIEBubiBmcm9tIGV4cG9ydGVkIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjEyCi1tc2dpZCAiICAtLW91dC1pbXBsaWIgPGZpbGU+ICAgICAgICAgICAgICAgIEdlbmVyYXRlIGltcG9ydCBsaWJyYXJ5XG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIxMwotbXNnaWQgIiIKLSIgIC0tb3V0cHV0LWRlZiA8ZmlsZT4gICAgICAgICAgICAgICAgR2VuZXJhdGUgYSAuREVGIGZpbGUgZm9yIHRoZSBidWlsdCBETExcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06Mjc2Ci1tc2dpZCAiJVA6IHdhcm5pbmc6IGJhZCB2ZXJzaW9uIG51bWJlciBpbiAtc3Vic3lzdGVtIG9wdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyOTIKLW1zZ2lkICIlUCVGOiBpbnZhbGlkIHN1YnN5c3RlbSB0eXBlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjMwNwotbXNnaWQgIiVQJUY6IGludmFsaWQgaGV4IG51bWJlciBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MzI1Ci1tc2dpZCAiJVAlRjogc3RyYW5nZSBoZXggaW5mbyBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MzY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBDYW4ndCBvcGVuIGJhc2UgZmlsZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbTo0OTcKLW1zZ2lkICIlUDogd2FybmluZywgZmlsZSBhbGlnbm1lbnQgPiBzZWN0aW9uIGFsaWdubWVudC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06NTY3IGVtdWx0ZW1wbC9wZS5lbTo1OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogcmVzb2x2aW5nICVzIGJ5IGxpbmtpbmcgdG8gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06NTcyIGVtdWx0ZW1wbC9wZS5lbTo1OTgKLW1zZ2lkICJVc2UgLS1lbmFibGUtc3RkY2FsbC1maXh1cCB0byBkaXNhYmxlIHRoZXNlIHdhcm5pbmdzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjU3MyBlbXVsdGVtcGwvcGUuZW06NTk5Ci1tc2dpZCAiVXNlIC0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwIHRvIGRpc2FibGUgdGhlc2UgZml4dXBzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjYxNQotbXNnaWQgIiVGJVA6IFBFIG9wZXJhdGlvbnMgb24gbm9uIFBFIGZpbGUuXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjY1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjY3NQotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIGZvciBpbnRlcndvcmtpbmciCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjczMCBsZGxhbmcuYzoxNjIzIGxkbGFuZy5jOjM5OTAgbGRsYW5nLmM6NDAyNCBsZG1haW4uYzo5NzgKLW1zZ2lkICIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6MTYyCi1tc2dpZCAiJVglUDogYmZkX2hhc2hfdGFibGVfaW5pdCBvZiBjcmVmIHRhYmxlIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzoxNjgKLW1zZ2lkICIlWCVQOiBjcmVmX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzoyMzkKLW1zZ2lkICIiCi0iXG4iCi0iQ3Jvc3MgUmVmZXJlbmNlIFRhYmxlXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6MjQwCi1tc2dpZCAiU3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjI0OAotbXNnaWQgIkZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzoyNTIKLW1zZ2lkICJObyBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6MzY5Ci1tc2dpZCAiJVA6IHN5bWJvbCBgJVQnIG1pc3NpbmcgZnJvbSBtYWluIGhhc2ggdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzo0NDEKLW1zZ2lkICIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOyAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjQ0NSBsZG1haW4uYzoxMDQ2IGxkbWFpbi5jOjEwNTAKLW1zZ2lkICIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjUxNyBsZGNyZWYuYzo1MjQgbGRtYWluLmM6MTA5NiBsZG1haW4uYzoxMTAzCi1tc2dpZCAiJUIlRjogY291bGQgbm90IHJlYWQgcmVsb2NzOiAlRVxuIgotbXNnc3RyICIiCi0KLSMuIFdlIGZvdW5kIGEgcmVsb2MgZm9yIHRoZSBzeW1ib2wuICBUaGUgc3ltYm9sIGlzIGRlZmluZWQKLSMuIGluIE9VVFNFQ05BTUUuICBUaGlzIHJlbG9jIGlzIGZyb20gYSBzZWN0aW9uIHdoaWNoIGlzCi0jLiBtYXBwZWQgaW50byBhIHNlY3Rpb24gZnJvbSB3aGljaCByZWZlcmVuY2VzIHRvIE9VVFNFQ05BTUUKLSMuIGFyZSBwcm9oaWJpdGVkLiAgV2UgbXVzdCByZXBvcnQgYW4gZXJyb3IuCi0jOiBsZGNyZWYuYzo1NDIKLW1zZ2lkICIlWCVDOiBwcm9oaWJpdGVkIGNyb3NzIHJlZmVyZW5jZSBmcm9tICVzIHRvIGAlVCcgaW4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGN0b3IuYzo4OQotbXNnaWQgIiVQJVg6IERpZmZlcmVudCByZWxvY3MgdXNlZCBpbiBzZXQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGN0b3IuYzoxMDYKLW1zZ2lkICIlUCVYOiBEaWZmZXJlbnQgb2JqZWN0IGZpbGUgZm9ybWF0cyBjb21wb3Npbmcgc2V0ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjdG9yLmM6Mjg4IGxkY3Rvci5jOjMwMgotbXNnaWQgIiVQJVg6ICVzIGRvZXMgbm90IHN1cHBvcnQgcmVsb2MgJXMgZm9yIHNldCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkY3Rvci5jOjMyMwotbXNnaWQgIiVQJVg6IFVuc3VwcG9ydGVkIHNpemUgJWQgZm9yIHNldCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkY3Rvci5jOjM0NAotbXNnaWQgIiIKLSJcbiIKLSJTZXQgICAgICAgICAgICAgICAgIFN5bWJvbFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGxkZW11bC5jOjIyMwotbXNnaWQgIiVTIFNZU0xJQiBpZ25vcmVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRlbXVsLmM6MjMxCi1tc2dpZCAiJVMgSExMIGlnbm9yZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGVtdWwuYzoyNTIKLW1zZ2lkICIlUDogdW5yZWNvZ25pc2VkIGVtdWxhdGlvbiBtb2RlOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZW11bC5jOjI1MwotbXNnaWQgIlN1cHBvcnRlZCBlbXVsYXRpb25zOiAiCi1tc2dzdHIgIiIKLQotIzogbGRlbXVsLmM6Mjk3Ci1tc2dpZCAiICBubyBlbXVsYXRpb24gc3BlY2lmaWMgb3B0aW9ucy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjE1NgotbXNnaWQgIiVGJVA6ICVzIHVzZXMgdW5kZWZpbmVkIHNlY3Rpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjE1OAotbXNnaWQgIiVGJVA6ICVzIGZvcndhcmQgcmVmZXJlbmNlIG9mIHNlY3Rpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjI3MAotbXNnaWQgIiVGJVMgJSUgYnkgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6Mjc3Ci1tc2dpZCAiJUYlUyAvIGJ5IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjQwMAotbXNnaWQgIiVYJVM6IHVucmVzb2x2YWJsZSBzeW1ib2wgYCVzJyByZWZlcmVuY2VkIGluIGV4cHJlc3Npb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjQxOQotbXNnaWQgIiVGJVM6IHVuZGVmaW5lZCBzeW1ib2wgYCVzJyByZWZlcmVuY2VkIGluIGV4cHJlc3Npb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjYwMAotbXNnaWQgIiVGJVMgY2FuIG5vdCBQUk9WSURFIGFzc2lnbm1lbnQgdG8gbG9jYXRpb24gY291bnRlclxuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6NjEwCi1tc2dpZCAiJUYlUyBpbnZhbGlkIGFzc2lnbm1lbnQgdG8gbG9jYXRpb24gY291bnRlclxuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6NjE0Ci1tc2dpZCAiJUYlUyBhc3NpZ25tZW50IHRvIGxvY2F0aW9uIGNvdW50ZXIgaW52YWxpZCBvdXRzaWRlIG9mIFNFQ1RJT05cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjYyNAotbXNnaWQgIiVGJVMgY2Fubm90IG1vdmUgbG9jYXRpb24gY291bnRlciBiYWNrd2FyZHMgKGZyb20gJVYgdG8gJVYpXG4iCi1tc2dzdHIgIiIKLQotIzogbGRleHAuYzo2NTIKLW1zZ2lkICIlUCVGOiVzOiBoYXNoIGNyZWF0aW9uIGZhaWxlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6OTQ5Ci1tc2dpZCAiJUYlUyBub25jb25zdGFudCBleHByZXNzaW9uIGZvciAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6OTgyCi1tc2dpZCAiJUYlUyBub24gY29uc3RhbnQgZXhwcmVzc2lvbiBmb3IgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoxMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXR0ZW1wdCB0byBvcGVuICVzIGZhaWxlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjExMQotIywgYy1mb3JtYXQKLW1zZ2lkICJhdHRlbXB0IHRvIG9wZW4gJXMgc3VjY2VlZGVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MTE5Ci1tc2dpZCAiJUYlUDogaW52YWxpZCBCRkQgdGFyZ2V0IGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoyMjIKLW1zZ2lkICIlRiVQOiBjYW5ub3Qgb3BlbiAlczogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoyMzkgbGRmaWxlLmM6MjU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBmaW5kIHNjcmlwdCBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MjQxIGxkZmlsZS5jOjI1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVuZWQgc2NyaXB0IGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoyOTkKLW1zZ2lkICIlUCVGOiBjYW5ub3Qgb3BlbiBsaW5rZXIgc2NyaXB0IGZpbGUgJXM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MzQwCi1tc2dpZCAiJVAlRjogdW5rbm93biBhcmNoaXRlY3R1cmU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MzU3Ci1tc2dpZCAiJVAlRjogdGFyZ2V0IGFyY2hpdGVjdHVyZSByZXNwZWNpZmllZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjQxMAotbXNnaWQgIiVQJUY6IGNhbm5vdCByZXByZXNlbnQgbWFjaGluZSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NTkwCi1tc2dpZCAiIgotIlxuIgotIk1lbW9yeSBDb25maWd1cmF0aW9uXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NTkyCi1tc2dpZCAiTmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo1OTIKLW1zZ2lkICJPcmlnaW4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NTkyCi1tc2dpZCAiTGVuZ3RoIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjU5MgotbXNnaWQgIkF0dHJpYnV0ZXMiCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NjM0Ci1tc2dpZCAiIgotIlxuIgotIkxpbmtlciBzY3JpcHQgYW5kIG1lbW9yeSBtYXBcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo2NTEKLW1zZ2lkICIlUCVGOiBJbGxlZ2FsIHVzZSBvZiBgJXMnIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NjYxCi1tc2dpZCAiJVAlRjogb3V0cHV0IGZvcm1hdCAlcyBjYW5ub3QgcmVwcmVzZW50IHNlY3Rpb24gY2FsbGVkICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NzgyCi1tc2dpZCAiJVA6ICVCOiB3YXJuaW5nOiBpZ25vcmluZyBkdXBsaWNhdGUgc2VjdGlvbiBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6Nzk2Ci1tc2dpZCAiJVA6ICVCOiB3YXJuaW5nOiBkdXBsaWNhdGUgc2VjdGlvbiBgJXMnIGhhcyBkaWZmZXJlbnQgc2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjEyMjMKLW1zZ2lkICIlQjogZmlsZSBub3QgcmVjb2duaXplZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxMjI0Ci1tc2dpZCAiJUI6IG1hdGNoaW5nIGZvcm1hdHM6IgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjEyMzEKLW1zZ2lkICIlRiVCOiBmaWxlIG5vdCByZWNvZ25pemVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjEyODQKLW1zZ2lkICIlRiVCOiBvYmplY3QgJUIgaW4gYXJjaGl2ZSBpcyBub3Qgb2JqZWN0XG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTI5MCBsZGxhbmcuYzoxMzAyCi1tc2dpZCAiJUYlQjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxNDE4Ci1tc2dpZCAiJVAlRjogdGFyZ2V0ICVzIG5vdCBmb3VuZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjE0MjAKLW1zZ2lkICIlUCVGOiBjYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlczogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxNDI4Ci1tc2dpZCAiJVAlRjolczogY2FuIG5vdCBtYWtlIG9iamVjdCBmaWxlOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjE0MzIKLW1zZ2lkICIlUCVGOiVzOiBjYW4gbm90IHNldCBhcmNoaXRlY3R1cmU6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTQzNgotbXNnaWQgIiVQJUY6IGNhbiBub3QgY3JlYXRlIGxpbmsgaGFzaCB0YWJsZTogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxNzQ2Ci1tc2dpZCAiIGxvYWQgYWRkcmVzcyAweCVWIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjE4NzUKLW1zZ2lkICIlVyAoc2l6ZSBiZWZvcmUgcmVsYXhpbmcpXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTk1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJBZGRyZXNzIG9mIHNlY3Rpb24gJXMgc2V0IHRvICIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyMDkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkZhaWwgd2l0aCAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjIzMjAKLW1zZ2lkICIlWCVQOiBzZWN0aW9uICVzIFslViAtPiAlVl0gb3ZlcmxhcHMgc2VjdGlvbiAlcyBbJVYgLT4gJVZdXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjM3MgotbXNnaWQgIiVQJVg6IEludGVybmFsIGVycm9yIG9uIENPRkYgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI0MTMKLW1zZ2lkICIlUDogd2FybmluZzogbm8gbWVtb3J5IHJlZ2lvbiBzcGVjaWZpZWQgZm9yIHNlY3Rpb24gYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI0MjYKLW1zZ2lkICIlUDogd2FybmluZzogY2hhbmdpbmcgc3RhcnQgb2Ygc2VjdGlvbiAlcyBieSAldSBieXRlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI0NDAKLW1zZ2lkICIlRiVTOiBub24gY29uc3RhbnQgYWRkcmVzcyBleHByZXNzaW9uIGZvciBzZWN0aW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjQ5MgotbXNnaWQgIiVYJVA6IGFkZHJlc3MgMHgldiBvZiAlQiBzZWN0aW9uICVzIGlzIG5vdCB3aXRoaW4gcmVnaW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjUwMAotbXNnaWQgIiVYJVA6IHJlZ2lvbiAlcyBpcyBmdWxsICglQiBzZWN0aW9uICVzKVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI2MDIKLW1zZ2lkICIlUCVGOiBjYW4ndCByZWxheCBzZWN0aW9uOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI3NjMKLW1zZ2lkICIlRiVQOiBpbnZhbGlkIGRhdGEgc3RhdGVtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6Mjc5MgotbXNnaWQgIiVGJVA6IGludmFsaWQgcmVsb2Mgc3RhdGVtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjkyNgotbXNnaWQgIiVQJUY6JXM6IGNhbid0IHNldCBzdGFydCBhZGRyZXNzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjkzOSBsZGxhbmcuYzoyOTU2Ci1tc2dpZCAiJVAlRjogY2FuJ3Qgc2V0IHN0YXJ0IGFkZHJlc3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyOTUxCi1tc2dpZCAiJVA6IHdhcm5pbmc6IGNhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbCAlczsgZGVmYXVsdGluZyB0byAlVlxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI5NjEKLW1zZ2lkICIlUDogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sICVzOyBub3Qgc2V0dGluZyBzdGFydCBhZGRyZXNzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MzAwMwotbXNnaWQgIiIKLSIlUDogd2FybmluZzogJXMgYXJjaGl0ZWN0dXJlIG9mIGlucHV0IGZpbGUgYCVCJyBpcyBpbmNvbXBhdGlibGUgd2l0aCAlcyAiCi0ib3V0cHV0XG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MzAyMQotbXNnaWQgIiVFJVg6IGZhaWxlZCB0byBtZXJnZSB0YXJnZXQgc3BlY2lmaWMgZGF0YSBvZiBmaWxlICVCXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MzEwNgotbXNnaWQgIiIKLSJcbiIKLSJBbGxvY2F0aW5nIGNvbW1vbiBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MzEwNwotbXNnaWQgIiIKLSJDb21tb24gc3ltYm9sICAgICAgIHNpemUgICAgICAgICAgICAgIGZpbGVcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jLiBUaGlzIG1lc3NhZ2UgaGFwcGVucyB3aGVuIHVzaW5nIHRoZQotIy4gc3ZyMy5pZmlsZSBsaW5rZXIgc2NyaXB0LCBzbyBJIGhhdmUKLSMuIGRpc2FibGVkIGl0LgotIzogbGRsYW5nLmM6MzE5NgotbXNnaWQgIiVQOiBubyBbQ09NTU9OXSBjb21tYW5kLCBkZWZhdWx0aW5nIHRvIC5ic3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzozMjU5Ci1tc2dpZCAiJVAlRjogaW52YWxpZCBzeW50YXggaW4gZmxhZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzozOTQ3Ci1tc2dpZCAiJVAlRm11bHRpcGxlIFNUQVJUVVAgZmlsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0MjA5Ci1tc2dpZCAiJUYlUDogYmZkX3JlY29yZF9waGRyIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0MjI4Ci1tc2dpZCAiJVglUDogc2VjdGlvbiBgJXMnIGFzc2lnbmVkIHRvIG5vbi1leGlzdGVudCBwaGRyIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0NDk3Ci1tc2dpZCAiJVglUDogZHVwbGljYXRlIHZlcnNpb24gdGFnIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0NTEwIGxkbGFuZy5jOjQ1MjMKLW1zZ2lkICIlWCVQOiBkdXBsaWNhdGUgZXhwcmVzc2lvbiBgJXMnIGluIHZlcnNpb24gaW5mb3JtYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0NTYwCi1tc2dpZCAiJVglUDogdW5hYmxlIHRvIGZpbmQgdmVyc2lvbiBkZXBlbmRlbmN5IGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo0NTgyCi1tc2dpZCAiJVglUDogdW5hYmxlIHRvIHJlYWQgLmV4cG9ydHMgc2VjdGlvbiBjb250ZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxODgKLW1zZ2lkICIlWCVQOiBjYW4ndCBzZXQgQkZEIGRlZmF1bHQgdGFyZ2V0IHRvIGAlcyc6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MjQ1Ci1tc2dpZCAiJVAlRjogLS1yZWxheCBhbmQgLXIgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MjQ3Ci1tc2dpZCAiJVAlRjogLXIgYW5kIC1zaGFyZWQgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6Mjc2Ci1tc2dpZCAidXNpbmcgaW50ZXJuYWwgbGlua2VyIHNjcmlwdDpcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoyOTUKLW1zZ2lkICIlUCVGOiBubyBpbnB1dCBmaWxlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjMwMAotbXNnaWQgIiVQOiBtb2RlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MzE4Ci1tc2dpZCAiJVAlRjogY2Fubm90IG9wZW4gbWFwIGZpbGUgJXM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MzY0Ci1tc2dpZCAiJVA6IGxpbmsgZXJyb3JzIGZvdW5kLCBkZWxldGluZyBleGVjdXRhYmxlIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzozNzUKLW1zZ2lkICIlRiVCOiBmaW5hbCBjbG9zZSBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6Mzk5Ci1tc2dpZCAiJVglUDogdW5hYmxlIHRvIG9wZW4gZm9yIHNvdXJjZSBvZiBjb3B5IGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo0MDEKLW1zZ2lkICIlWCVQOiB1bmFibGUgdG8gb3BlbiBmb3IgZGVzdGluYXRpb24gb2YgY29weSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NDA3Ci1tc2dpZCAiJVA6IEVycm9yIHdyaXRpbmcgZmlsZSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NDEzIHBlLWRsbC5jOjg5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlUDogRXJyb3IgY2xvc2luZyBmaWxlIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo0MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHRvdGFsIHRpbWUgaW4gbGluazogJWxkLiUwNmxkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkYXRhIHNpemUgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NDc1Ci1tc2dpZCAiJVAlRjogbWlzc2luZyBhcmd1bWVudCB0byAtbVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjU4OSBsZG1haW4uYzo2MTAgbGRtYWluLmM6NjQxCi1tc2dpZCAiJVAlRjogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NTk0IGxkbWFpbi5jOjYxMwotbXNnaWQgIiVQJUY6IGJmZF9oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NjI4Ci1tc2dpZCAiJVglUDogZXJyb3I6IGR1cGxpY2F0ZSByZXRhaW4tc3ltYm9scy1maWxlXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NjcyCi1tc2dpZCAiJVAlRjogYmZkX2hhc2hfbG9va3VwIGZvciBpbnNlcnRpb24gZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjY3NwotbXNnaWQgIiVQOiBgLXJldGFpbi1zeW1ib2xzLWZpbGUnIG92ZXJyaWRlcyBgLXMnIGFuZCBgLVMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NzU0Ci1tc2dpZCAiQXJjaGl2ZSBtZW1iZXIgaW5jbHVkZWQiCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NzU1Ci1tc2dpZCAiYmVjYXVzZSBvZiBmaWxlIChzeW1ib2wpIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjgyNwotbXNnaWQgIiVYJUM6IG11bHRpcGxlIGRlZmluaXRpb24gb2YgYCVUJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjgzMAotbXNnaWQgIiVEOiBmaXJzdCBkZWZpbmVkIGhlcmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo4NTkKLW1zZ2lkICIlQjogd2FybmluZzogZGVmaW5pdGlvbiBvZiBgJVQnIG92ZXJyaWRpbmcgY29tbW9uXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODYyCi1tc2dpZCAiJUI6IHdhcm5pbmc6IGNvbW1vbiBpcyBoZXJlXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODY5Ci1tc2dpZCAiJUI6IHdhcm5pbmc6IGNvbW1vbiBvZiBgJVQnIG92ZXJyaWRkZW4gYnkgZGVmaW5pdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjg3MgotbXNnaWQgIiVCOiB3YXJuaW5nOiBkZWZpbmVkIGhlcmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo4NzkKLW1zZ2lkICIlQjogd2FybmluZzogY29tbW9uIG9mIGAlVCcgb3ZlcnJpZGRlbiBieSBsYXJnZXIgY29tbW9uXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODgyCi1tc2dpZCAiJUI6IHdhcm5pbmc6IGxhcmdlciBjb21tb24gaXMgaGVyZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjg4NgotbXNnaWQgIiVCOiB3YXJuaW5nOiBjb21tb24gb2YgYCVUJyBvdmVycmlkaW5nIHNtYWxsZXIgY29tbW9uXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODg5Ci1tc2dpZCAiJUI6IHdhcm5pbmc6IHNtYWxsZXIgY29tbW9uIGlzIGhlcmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo4OTMKLW1zZ2lkICIlQjogd2FybmluZzogbXVsdGlwbGUgY29tbW9uIG9mIGAlVCdcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo4OTUKLW1zZ2lkICIlQjogd2FybmluZzogcHJldmlvdXMgY29tbW9uIGlzIGhlcmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo5MTcgbGRtYWluLmM6OTU2Ci1tc2dpZCAiJVA6IHdhcm5pbmc6IGdsb2JhbCBjb25zdHJ1Y3RvciAlcyB1c2VkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6OTY2Ci1tc2dpZCAiJVAlRjogQkZEIGJhY2tlbmQgZXJyb3I6IEJGRF9SRUxPQ19DVE9SIHVuc3VwcG9ydGVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTE1MgotbXNnaWQgIiVGJVA6IGJmZF9oYXNoX3RhYmxlX2luaXQgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjExNTkKLW1zZ2lkICIlRiVQOiBiZmRfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjExNzgKLW1zZ2lkICIlWCVDOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGAlVCdcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMTgxCi1tc2dpZCAiJUQ6IG1vcmUgdW5kZWZpbmVkIHJlZmVyZW5jZXMgdG8gYCVUJyBmb2xsb3dcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMTg3Ci1tc2dpZCAiJVglQjogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgJVQnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTE5MAotbXNnaWQgIiVCOiBtb3JlIHVuZGVmaW5lZCByZWZlcmVuY2VzIHRvIGAlVCcgZm9sbG93XG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTIxMSBsZG1haW4uYzoxMjMzIGxkbWFpbi5jOjEyNTMKLW1zZ2lkICIlUCVYOiBnZW5lcmF0ZWQiCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTIxNAotbXNnaWQgIiByZWxvY2F0aW9uIHRydW5jYXRlZCB0byBmaXQ6ICVzICVUIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjEyMzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGFuZ2Vyb3VzIHJlbG9jYXRpb246ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTI1NgotbXNnaWQgIiByZWxvYyByZWZlcnMgdG8gc3ltYm9sIGAlVCcgd2hpY2ggaXMgbm90IGJlaW5nIG91dHB1dFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWlzYy5jOjE3NwotbXNnaWQgIm5vIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBsZG1pc2MuYzoyMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYnVpbHQgaW4gbGlua2VyIHNjcmlwdDoldSIKLW1zZ3N0ciAiIgotCi0jOiBsZG1pc2MuYzoyODkgbGRtaXNjLmM6MjkzCi1tc2dpZCAiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSMuIFdlIHVzZSBhYmZkLT5maWxlbmFtZSBpbiB0aGlzIGluaXRpYWwgbGluZSwKLSMuIGluIGNhc2UgZmlsZW5hbWUgaXMgYSAuaCBmaWxlIG9yIHNvbWV0aGluZwotIy4gc2ltaWxhcmx5IHVuaGVscGZ1bC4KLSM6IGxkbWlzYy5jOjMyOQotbXNnaWQgIiVCOiBJbiBmdW5jdGlvbiBgJVQnOlxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWlzYy5jOjQ2MQotbXNnaWQgIiVGJVA6IGludGVybmFsIGVycm9yICVzICVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGR2ZXIuYzozNQotIywgYy1mb3JtYXQKLW1zZ2lkICJHTlUgbGQgdmVyc2lvbiAlcyAod2l0aCBCRkQgJXMpXG4iCi1tc2dzdHIgIiIKLQotIzogbGR2ZXIuYzo0MiBsZXhzdXAuYzo4MjkKLW1zZ2lkICIgIFN1cHBvcnRlZCBlbXVsYXRpb25zOlxuIgotbXNnc3RyICIiCi0KLSM6IGxkd3JpdGUuYzo1OSBsZHdyaXRlLmM6MTk1Ci1tc2dpZCAiJVAlRjogYmZkX25ld19saW5rX29yZGVyIGZhaWxlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkd3JpdGUuYzozNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTh4IHNvbWV0aGluZyBlbHNlXG4iCi1tc2dzdHIgIiIKLQotIzogbGR3cml0ZS5jOjUyNgotbXNnaWQgIiVGJVA6IGZpbmFsIGxpbmsgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE0OCBsZXhzdXAuYzoyMzEgbGV4c3VwLmM6MjM3Ci1tc2dpZCAiS0VZV09SRCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNDgKLW1zZ2lkICJTaGFyZWQgbGlicmFyeSBjb250cm9sIGZvciBIUC9VWCBjb21wYXRpYmlsaXR5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE1MQotbXNnaWQgIkFSQ0giCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTUxCi1tc2dpZCAiU2V0IGFyY2hpdGVjdHVyZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNTMgbGV4c3VwLmM6MjkwCi1tc2dpZCAiVEFSR0VUIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE1MwotbXNnaWQgIlNwZWNpZnkgdGFyZ2V0IGZvciBmb2xsb3dpbmcgaW5wdXQgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTU1IGxleHN1cC5jOjE5NCBsZXhzdXAuYzoyMDQgbGV4c3VwLmM6MjEzIGxleHN1cC5jOjI3OAotIzogbGV4c3VwLmM6Mjk3IGxleHN1cC5jOjMzMQotbXNnaWQgIkZJTEUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTU1Ci1tc2dpZCAiUmVhZCBNUkkgZm9ybWF0IGxpbmtlciBzY3JpcHQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTU3Ci1tc2dpZCAiRm9yY2UgY29tbW9uIHN5bWJvbHMgdG8gYmUgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNjEgbGV4c3VwLmM6MzIxIGxleHN1cC5jOjMyMyBsZXhzdXAuYzozMjUKLW1zZ2lkICJBRERSRVNTIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE2MQotbXNnaWQgIlNldCBzdGFydCBhZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE2MwotbXNnaWQgIkV4cG9ydCBhbGwgZHluYW1pYyBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE2NQotbXNnaWQgIkxpbmsgYmlnLWVuZGlhbiBvYmplY3RzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE2NwotbXNnaWQgIkxpbmsgbGl0dGxlLWVuZGlhbiBvYmplY3RzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE2OSBsZXhzdXAuYzoxNzIKLW1zZ2lkICJTSExJQiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNjkKLW1zZ2lkICJBdXhpbGlhcnkgZmlsdGVyIGZvciBzaGFyZWQgb2JqZWN0IHN5bWJvbCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNzIKLW1zZ2lkICJGaWx0ZXIgZm9yIHNoYXJlZCBvYmplY3Qgc3ltYm9sIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE3NAotbXNnaWQgIklnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTc2Ci1tc2dpZCAiU0laRSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNzYKLW1zZ2lkICJTbWFsbCBkYXRhIHNpemUgKGlmIG5vIHNpemUsIHNhbWUgYXMgLS1zaGFyZWQpIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE3OQotbXNnaWQgIkZJTEVOQU1FIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE3OQotbXNnaWQgIlNldCBpbnRlcm5hbCBuYW1lIG9mIHNoYXJlZCBsaWJyYXJ5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4MQotbXNnaWQgIkxJQk5BTUUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTgxCi1tc2dpZCAiU2VhcmNoIGZvciBsaWJyYXJ5IExJQk5BTUUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTgzCi1tc2dpZCAiRElSRUNUT1JZIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4MwotbXNnaWQgIkFkZCBESVJFQ1RPUlkgdG8gbGlicmFyeSBzZWFyY2ggcGF0aCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxODUKLW1zZ2lkICJFTVVMQVRJT04iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTg1Ci1tc2dpZCAiU2V0IGVtdWxhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxODcKLW1zZ2lkICJQcmludCBtYXAgZmlsZSBvbiBzdGFuZGFyZCBvdXRwdXQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTg5Ci1tc2dpZCAiRG8gbm90IHBhZ2UgYWxpZ24gZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxOTEKLW1zZ2lkICJEbyBub3QgcGFnZSBhbGlnbiBkYXRhLCBkbyBub3QgbWFrZSB0ZXh0IHJlYWRvbmx5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE5NAotbXNnaWQgIlNldCBvdXRwdXQgZmlsZSBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE5NgotbXNnaWQgIk9wdGltaXplIG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE5OAotbXNnaWQgIklnbm9yZWQgZm9yIFNWUjQgY29tcGF0aWJpbGl0eSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMDAKLW1zZ2lkICJHZW5lcmF0ZSByZWxvY2F0ZWFibGUgb3V0cHV0IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIwNAotbXNnaWQgIkp1c3QgbGluayBzeW1ib2xzIChpZiBkaXJlY3RvcnksIHNhbWUgYXMgLS1ycGF0aCkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjA3Ci1tc2dpZCAiU3RyaXAgYWxsIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjA5Ci1tc2dpZCAiU3RyaXAgZGVidWdnaW5nIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjExCi1tc2dpZCAiVHJhY2UgZmlsZSBvcGVucyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMTMKLW1zZ2lkICJSZWFkIGxpbmtlciBzY3JpcHQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjE1IGxleHN1cC5jOjIyNyBsZXhzdXAuYzozMTcgbGV4c3VwLmM6MzM0IGxleHN1cC5jOjM1MQotbXNnaWQgIlNZTUJPTCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMTUKLW1zZ2lkICJTdGFydCB3aXRoIHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gU1lNQk9MIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIxNwotbXNnaWQgIkJ1aWxkIGdsb2JhbCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHRhYmxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMTkKLW1zZ2lkICJQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIyMQotbXNnaWQgIlByaW50IHZlcnNpb24gYW5kIGVtdWxhdGlvbiBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMjMKLW1zZ2lkICJEaXNjYXJkIGFsbCBsb2NhbCBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIyNQotbXNnaWQgIkRpc2NhcmQgdGVtcG9yYXJ5IGxvY2FsIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjI3Ci1tc2dpZCAiVHJhY2UgbWVudGlvbnMgb2YgU1lNQk9MIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIyOSBsZXhzdXAuYzoyOTkgbGV4c3VwLmM6MzAxCi1tc2dpZCAiUEFUSCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMjkKLW1zZ2lkICJEZWZhdWx0IHNlYXJjaCBwYXRoIGZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjMxCi1tc2dpZCAiSWdub3JlZCBmb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIzMwotbXNnaWQgIlN0YXJ0IGEgZ3JvdXAiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjM1Ci1tc2dpZCAiRW5kIGEgZ3JvdXAiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjM3Ci1tc2dpZCAiSWdub3JlZCBmb3IgU3VuT1MgY29tcGF0aWJpbGl0eSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMzkKLW1zZ2lkICJMaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNDUKLW1zZ2lkICJEbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjUzCi1tc2dpZCAiQmluZCBnbG9iYWwgcmVmZXJlbmNlcyBsb2NhbGx5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI1NQotbXNnaWQgIkNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzIGZvciBvdmVybGFwcyAoZGVmYXVsdCkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjU3Ci1tc2dpZCAiRG8gbm90IGNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzIGZvciBvdmVybGFwcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNjAKLW1zZ2lkICJPdXRwdXQgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI2MgotbXNnaWQgIlNZTUJPTD1FWFBSRVNTSU9OIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI2MgotbXNnaWQgIkRlZmluZSBhIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNjQKLW1zZ2lkICJQUk9HUkFNIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI2NAotbXNnaWQgIlNldCB0aGUgZHluYW1pYyBsaW5rZXIgdG8gdXNlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI2NgotbXNnaWQgIkdlbmVyYXRlIGVtYmVkZGVkIHJlbG9jcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNjgKLW1zZ2lkICJGb3JjZSBnZW5lcmF0aW9uIG9mIGZpbGUgd2l0aCAuZXhlIHN1ZmZpeCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNzAKLW1zZ2lkICJSZW1vdmUgdW51c2VkIHNlY3Rpb25zIChvbiBzb21lIHRhcmdldHMpIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI3MwotbXNnaWQgIkRvbid0IHJlbW92ZSB1bnVzZWQgc2VjdGlvbnMgKGRlZmF1bHQpIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI3NgotbXNnaWQgIlByaW50IG9wdGlvbiBoZWxwIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI3OAotbXNnaWQgIldyaXRlIGEgbWFwIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjgwCi1tc2dpZCAiVXNlIGxlc3MgbWVtb3J5IGFuZCBtb3JlIGRpc2sgSS9PIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI4MgotbXNnaWQgIkRvbid0IHdhcm4gYWJvdXQgbWlzbWF0Y2hlZCBpbnB1dCBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyODQKLW1zZ2lkICJUdXJuIG9mZiAtLXdob2xlLWFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6Mjg2Ci1tc2dpZCAiQ3JlYXRlIGFuIG91dHB1dCBmaWxlIGV2ZW4gaWYgZXJyb3JzIG9jY3VyIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI5MAotbXNnaWQgIlNwZWNpZnkgdGFyZ2V0IG9mIG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI5MgotbXNnaWQgIklnbm9yZWQgZm9yIExpbnV4IGNvbXBhdGliaWxpdHkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6Mjk0Ci1tc2dpZCAiUmVsYXggYnJhbmNoZXMgb24gY2VydGFpbiB0YXJnZXRzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI5NwotbXNnaWQgIktlZXAgb25seSBzeW1ib2xzIGxpc3RlZCBpbiBGSUxFIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI5OQotbXNnaWQgIlNldCBydW50aW1lIHNoYXJlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMwMQotbXNnaWQgIlNldCBsaW5rIHRpbWUgc2hhcmVkIGxpYnJhcnkgc2VhcmNoIHBhdGgiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzAzCi1tc2dpZCAiQ3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzA3Ci1tc2dpZCAiU29ydCBjb21tb24gc3ltYm9scyBieSBzaXplIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMxMQotbXNnaWQgIlNwbGl0IG91dHB1dCBzZWN0aW9ucyBmb3IgZWFjaCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMxMwotbXNnaWQgIkNPVU5UIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMxMwotbXNnaWQgIlNwbGl0IG91dHB1dCBzZWN0aW9ucyBldmVyeSBDT1VOVCByZWxvY3MiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzE1Ci1tc2dpZCAiUHJpbnQgbWVtb3J5IHVzYWdlIHN0YXRpc3RpY3MiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzE3Ci1tc2dpZCAiRG8gdGFzayBsZXZlbCBsaW5raW5nIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMxOQotbXNnaWQgIlVzZSBzYW1lIGZvcm1hdCBhcyBuYXRpdmUgbGlua2VyIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMyMQotbXNnaWQgIlNldCBhZGRyZXNzIG9mIC5ic3Mgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMjMKLW1zZ2lkICJTZXQgYWRkcmVzcyBvZiAuZGF0YSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMyNQotbXNnaWQgIlNldCBhZGRyZXNzIG9mIC50ZXh0IHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzI3Ci1tc2dpZCAiT3V0cHV0IGxvdHMgb2YgaW5mb3JtYXRpb24gZHVyaW5nIGxpbmsiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzMxCi1tc2dpZCAiUmVhZCB2ZXJzaW9uIGluZm9ybWF0aW9uIHNjcmlwdCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMzQKLW1zZ2lkICJUYWtlIGV4cG9ydCBzeW1ib2xzIGxpc3QgZnJvbSAuZXhwb3J0cywgdXNpbmcgU1lNQk9MIGFzIHRoZSB2ZXJzaW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMzcKLW1zZ2lkICJXYXJuIGFib3V0IGR1cGxpY2F0ZSBjb21tb24gc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMzkKLW1zZ2lkICJXYXJuIGlmIGdsb2JhbCBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMgYXJlIHNlZW4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzQyCi1tc2dpZCAiV2FybiBpZiB0aGUgbXVsdGlwbGUgR1AgdmFsdWVzIGFyZSB1c2VkIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM0NAotbXNnaWQgIldhcm4gb25seSBvbmNlIHBlciB1bmRlZmluZWQgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM0NgotbXNnaWQgIldhcm4gaWYgc3RhcnQgb2Ygc2VjdGlvbiBjaGFuZ2VzIGR1ZSB0byBhbGlnbm1lbnQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzQ5Ci1tc2dpZCAiSW5jbHVkZSBhbGwgb2JqZWN0cyBmcm9tIGZvbGxvd2luZyBhcmNoaXZlcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNTEKLW1zZ2lkICJVc2Ugd3JhcHBlciBmdW5jdGlvbnMgZm9yIFNZTUJPTCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo0OTEKLW1zZ2lkICIlUCVGOiB1bnJlY29nbml6ZWQgLWEgb3B0aW9uIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo1MDQKLW1zZ2lkICIlUCVGOiB1bnJlY29nbml6ZWQgLWFzc2VydCBvcHRpb24gYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjU5MgotbXNnaWQgIiVQJUY6IGludmFsaWQgbnVtYmVyIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo3NTgKLW1zZ2lkICIlUCVGOiAtc2hhcmVkIG5vdCBzdXBwb3J0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo4MjIKLW1zZ2lkICJDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo4MjMKLW1zZ2lkICIiCi0iVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuIgotInRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo5MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG1heSBub3QgbmVzdCBncm91cHMgKC0taGVscCBmb3IgdXNhZ2UpXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6OTI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBncm91cCBlbmRlZCBiZWZvcmUgaXQgYmVnYW4gKC0taGVscCBmb3IgdXNhZ2UpXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6OTczCi1tc2dpZCAiJVAlRjogaW52YWxpZCBoZXggbnVtYmVyIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo5ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVXNhZ2U6ICVzIFtvcHRpb25zXSBmaWxlLi4uXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6OTg3Ci1tc2dpZCAiT3B0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxMDY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzdXBwb3J0ZWQgdGFyZ2V0czoiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTA3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3VwcG9ydGVkIGVtdWxhdGlvbnM6ICIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxMDc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlbXVsYXRpb24gc3BlY2lmaWMgb3B0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxMDgxCi1tc2dpZCAiIgotIlxuIgotIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIgotbXNnc3RyICIiCi0KLSM6IG1yaS5jOjM0MgotbXNnaWQgIiVQJUY6IHVua25vd24gZm9ybWF0IHR5cGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzoyOTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhFcnJvciwgZHVwbGljYXRlIEVYUE9SVCB3aXRoIG9yaWRpbmFsczogJXMgKCVkIHZzICVkKVxuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjMwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nLCBkdXBsaWNhdGUgRVhQT1JUOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjM0OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlWENhbm5vdCBleHBvcnQgJXM6IHN5bWJvbCBub3QgZGVmaW5lZFxuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjM1NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlWENhbm5vdCBleHBvcnQgJXM6IHN5bWJvbCB3cm9uZyB0eXBlICglZCB2cyAlZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzozNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhDYW5ub3QgZXhwb3J0ICVzOiBzeW1ib2wgbm90IGZvdW5kXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6NDgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVYRXJyb3IsIG9yaWRpbmFsIHVzZWQgdHdpY2U6ICVkICglcyB2cyAlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzo2NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhFcnJvcjogJWQtYml0IHJlbG9jIGluIGRsbFxuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjc3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3Qgb3BlbiBvdXRwdXQgZGVmIGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzo4OTQKLW1zZ2lkICI7IG5vIGNvbnRlbnRzIGF2YWlsYWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjEzMjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhDYW4ndCBvcGVuIC5saWIgZmlsZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzoxMzMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNyZWF0aW5nIGxpYnJhcnkgZmlsZTogJXNcbiIKLW1zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvUkVBRE1FIGIvbGQvc2NyaXB0dGVtcGwvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmFkMmU5Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFyZSBsaW5rZXIgc2NyaXB0IHRlbXBsYXRlcy4KLWdlbnNjcmlwdHMuc2ggc2V0cyBzb21lIHNoZWxsIHZhcmlhYmxlcywgdGhlbiBzb3VyY2VzCi1FTVVMQVRJT04uc2MsIHRvIGdlbmVyYXRlIEVNVUxBVElPTi57eCx4cix4dSx4bix4Ym59IC0tIHRoZSBzY3JpcHQKLWZpbGVzIGZvciBkZWZhdWx0LCAtciwgLVVyLCAtbiwgLU4uCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9hMjlrLnNjIGIvbGQvc2NyaXB0dGVtcGwvYTI5ay5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyNWIxZS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9hMjlrLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1TRUNUSU9OUwotewotICAudGV4dCA6IHsKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgX19ldGV4dCAgPSAgLn07Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19DVE9SX0VORF9fIC0gX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19EVE9SX0VORF9fIC0gX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0VORF9fID0gLjt9Ci0gICAgKigubGl0KQotICAgICooLnNoZGF0YSkKLSAgfQotICAuc2hic3MgU0laRU9GKC50ZXh0KSArIEFERFIoLnRleHQpIDoJewotICAgICooLnNoYnNzKQotICB9IAotICAuZGF0YSAgOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIF9fZWRhdGEgID0gIC59OwotICB9Ci0gIC5ic3MgICBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSkgOgotICB7IAkJCQkJCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgICAgJHtSRUxPQ0FUSU5HKyBfX2VuZCA9IEFMSUdOKDB4OCl9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2FpeC5zYyBiL2xkL3NjcmlwdHRlbXBsL2FpeC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y0YjYxNy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9haXguc2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jIEFJWCBsaW5rZXIgc2NyaXB0LgotIyBBSVggYWx3YXlzIHVzZXMgc2hhcmVkIGxpYnJhcmllcy4gIFRoZSBzZWN0aW9uIFZNQSBhcHBlYXJzIHRvIGJlCi0jIHVuaW1wb3J0YW50LiAgVGhlIG5hdGl2ZSBsaW5rZXIgYWxpZ25zIHRoZSBzZWN0aW9ucyBvbiBib3VuZGFyaWVzCi0jIHNwZWNpZmllZCBieSB0aGUgLUggb3B0aW9uLgotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotRU5UUlkoX19zdGFydCkKLVNFQ1RJT05TCi17Ci0gIC5wYWQgMCA6IHsgKigucGFkKSB9Ci0gIC50ZXh0ICR7UkVMT0NBVElORy0wfSA6IHsKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX3RleHQgPSAuKTt9Ci0gICAgKigudGV4dCkKLSAgICAqKC5wcikKLSAgICAqKC5ybykKLSAgICAqKC5kYikKLSAgICAqKC5nbCkKLSAgICAqKC54bykKLSAgICAqKC50aSkKLSAgICAqKC50YikKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX2V0ZXh0ID0gLik7fQotICB9Ci0gIC5kYXRhIDAgOiB7Ci0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9kYXRhID0gLik7fQotICAgICooLmRhdGEpCi0gICAgKigucncpCi0gICAgKiguc3YpCi0gICAgKigudWEpCi0gICAgLiA9IEFMSUdOKDQpOwotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICAqKC5kcykKLSAgICAqKC50YzApCi0gICAgKigudGMpCi0gICAgKigudGQpCi0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9lZGF0YSA9IC4pO30KLSAgfQotICAuYnNzIDogewotICAgICooLnRvY2JzcykKLSAgICAqKC5ic3MpCi0gICAgKiguYnMpCi0gICAgKigudWMpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9lbmQgPSAuKTt9Ci0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KLSAgfQotICAubG9hZGVyIDAgOiB7Ci0gICAgKigubG9hZGVyKQotICB9Ci0gIC5kZWJ1ZyAwIDogewotICAgICooLmRlYnVnKQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2FscGhhLnNjIGIvbGQvc2NyaXB0dGVtcGwvYWxwaGEuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YTEwYzQuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvYWxwaGEuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIEFscGhhIHN5c3RlbXMuCi0jIElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLSMgVGhlc2UgdmFyaWFibGVzIG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBlbXVsYXRpb24gZmlsZS4gIFRoZQotIyBkZWZhdWx0cyBhcmUgYXBwcm9wcmlhdGUgZm9yIGFuIEFscGhhIHJ1bm5pbmcgT1NGLzEuCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9fc3RhcnQKLXRlc3QgLXogIiRURVhUX1NUQVJUX0FERFIiICYmIFRFWFRfU1RBUlRfQUREUj0iMHgxMjAwMDAwMDAgKyBTSVpFT0ZfSEVBREVSUyIKLWlmIHRlc3QgIngkTERfRkxBRyIgPSAieG4iIC1vICJ4JExEX0ZMQUciID0gInhOIjsgdGhlbgotICBEQVRBX0FERFI9LgotZWxzZQotICB0ZXN0IC16ICIkREFUQV9BRERSIiAmJiBEQVRBX0FERFI9MHgxNDAwMDAwMDAKLWZpCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9TVEFSVF9BRERSfTt9Ci0gIC50ZXh0IDogewotICAgICR7UkVMT0NBVElORysgX2Z0ZXh0ID0gLiB9OwotICAgICR7UkVMT0NBVElORysgX19pc3RhcnQgPSAuIH07Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5pbml0KSB9Ci0gICAgJHtSRUxPQ0FUSU5HKyBMT05HICgweDZiZmE4MDAxKX0KLSAgICAke1JFTE9DQVRJTkcrIGVwcm9sICA9ICAufTsKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgX19mc3RhcnQgPSAuIH07Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5maW5pKX0KLSAgICAke1JFTE9DQVRJTkcrIExPTkcgKDB4NmJmYTgwMDEpfQotICAgICR7UkVMT0NBVElORysgX2V0ZXh0ICA9ICAufTsKLSAgfQotICAucmRhdGEgOiB7Ci0gICAgKigucmRhdGEpCi0gIH0KLSAgLnJjb25zdCA6IHsKLSAgICAqKC5yY29uc3QpCi0gIH0KLSAgLnBkYXRhIDogewotICAgICR7UkVMT0NBVElORysgX2ZwZGF0YSA9IC47fQotICAgICooLnBkYXRhKQotICB9Ci0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFJ9O30KLSAgLmRhdGEgOiB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZmRhdGEgPSAuO30KLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgfQotICAueGRhdGEgOiB7Ci0gICAgKigueGRhdGEpCi0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBfZ3AgPSBBTElHTiAoMTYpICsgMHg4MDAwO30KLSAgLmxpdDggOiB7Ci0gICAgKigubGl0OCkKLSAgfQotICAubGl0YSA6IHsKLSAgICAqKC5saXRhKQotICB9Ci0gIC5zZGF0YSA6IHsKLSAgICAqKC5zZGF0YSkKLSAgfQotICAke1JFTE9DQVRJTkcrIF9FREFUQSAgPSAgLjt9Ci0gICR7UkVMT0NBVElORysgX0ZCU1MgPSAuO30KLSAgLnNic3MgOiB7Ci0gICAgKiguc2JzcykKLSAgICAqKC5zY29tbW9uKQotICB9Ci0gIC5ic3MgOiB7Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICB9Ci0gICR7UkVMT0NBVElORysgX2VuZCA9IC47fQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9hb3V0LnNjIGIvbGQvc2NyaXB0dGVtcGwvYW91dC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBkYmIzNy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9hb3V0LnNjCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotdGVzdCAteiAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iICYmIEJJR19PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLXRlc3QgLXogIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IiAmJiBMSVRUTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0IC16ICIke0FMSUdOTUVOVH0iICYmIEFMSUdOTUVOVD0iNCIKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7U1RBQ0taRVJPKyR7UkVMT0NBVElORyske1NUQUNLWkVST319fQotJHtTSExJQl9QQVRIKyR7UkVMT0NBVElORyske1NITElCX1BBVEh9fX0KLSR7UkVMT0NBVElORyske0VYRUNVVEFCTEVfU1lNQk9MU319Ci0ke1JFTE9DQVRJTkcrUFJPVklERSAoX19zdGFjayA9IDApO30KLVNFQ1RJT05TCi17Ci0gICR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9O30KLSAgLnRleHQgOgotICB7Ci0gICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0gICAgKigudGV4dCkKLSAgICAvKiBUaGUgbmV4dCBzaXggc2VjdGlvbnMgYXJlIGZvciBTdW5PUyBkeW5hbWljIGxpbmtpbmcuICBUaGUgb3JkZXIKLSAgICAgICBpcyBpbXBvcnRhbnQuICAqLwotICAgICooLmR5bnJlbCkKLSAgICAqKC5oYXNoKQotICAgICooLmR5bnN5bSkKLSAgICAqKC5keW5zdHIpCi0gICAgKigucnVsZXMpCi0gICAgKigubmVlZCkKLSAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZXRleHQgPSAuO30KLSAgICAke1BBRF9URVhUKyR7UkVMT0NBVElORysuID0gJHtEQVRBX0FMSUdOTUVOVH07fX0KLSAgfQotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BTElHTk1FTlR9O30KLSAgLmRhdGEgOgotICB7Ci0gICAgLyogVGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIGFyZSBmb3IgU3VuT1MgZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgICAqKC5keW5hbWljKQotICAgICooLmdvdCkKLSAgICAqKC5wbHQpCi0gICAgKiguZGF0YSkKLSAgICAqKC5saW51eC1keW5hbWljKSAvKiBGb3IgTGludXggZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZWRhdGEgID0gIC47fQotICB9Ci0gIC5ic3MgOgotICB7Ci0gICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0ID0gLn07Ci0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgICR7UkVMT0NBVElORysuID0gQUxJR04oJHtBTElHTk1FTlR9KTt9Ci0gICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gfTsKLSAgICR7UkVMT0NBVElORytfX2VuZCA9IC4gfTsKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjIGIvbGQvc2NyaXB0dGVtcGwvYXJtYW91dC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkyNzZhOC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0ke1NUQUNLWkVSTyske1JFTE9DQVRJTkcrJHtTVEFDS1pFUk99fX0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICAgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9BRERSfX0gOgotICB7Ci0gICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0gICAgJHtSRUxPQ0FUSU5HK19fc3RleHRfID0gLjt9Ci0gICAgKigudGV4dCkKLSAgICAke1BBRF9URVhUKyR7UkVMT0NBVElORysuID0gJHtEQVRBX0FMSUdOTUVOVH07fX0KLSAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICAgICR7UkVMT0NBVElORytfX2V0ZXh0ID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORyske0RBVEFfQUxJR05NRU5UfX0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fc2RhdGFfID0gLjt9Ci0gICAgKiguZGF0YSkKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZWRhdGEgID0gIC47fQotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiAoLmRhdGEpfSA6Ci0gIHsKLSAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnQgPSAufTsKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgJHtSRUxPQ0FUSU5HK19lbmQgPSBBTElHTig0KSB9OwotICAgJHtSRUxPQ0FUSU5HK19fZW5kID0gQUxJR04oNCkgfTsKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvYXJtY29mZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwNzE2OS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBBUk0gQ09GRi4KLSMgQmFzZWQgb24gaTM4NmNvZmYuc2MgYnkgSWFuIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLWlmIHRlc3QgLXogIiR7REFUQV9BRERSfSI7IHRoZW4KLSAgaWYgdGVzdCAiJExEX0ZMQUciID0gIk4iIHx8IHRlc3QgIiRMRF9GTEFHIiA9ICJuIjsgdGhlbgotICAgIERBVEFfQUREUj0uCi0gIGZpCi1maQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLyogV2Ugc3RhcnQgYXQgMHg4MDAwIGJlY2F1c2UgZ2RiIGFzc3VtZXMgaXQgKHNlZSBGUkFNRV9DSEFJTikuCi0gICAgIFRoaXMgaXMgYW4gYXJ0aWZhY3Qgb2YgdGhlIEFSTSBEZW1vbiBtb25pdG9yIHVzaW5nIHRoZSBib3R0b20gMzJrCi0gICAgIGFzIHdvcmtzcGFjZSAoc2hhcmVkIHdpdGggdGhlIEZQIGluc3RydWN0aW9uIGVtdWxhdG9yIGlmCi0gICAgIHByZXNlbnQpOiAqLwotICAudGV4dCAke1JFTE9DQVRJTkcrIDB4ODAwMH0gOiB7Ci0gICAgKiguaW5pdCkKLSAgICAqKC50ZXh0KQotICAgICooLmdsdWVfN3QpCi0gICAgKiguZ2x1ZV83KQotICAgICooLnJkYXRhKQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47IF9fQ1RPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmN0b3JzKTsgKiguY3Rvcik7IExPTkcgKDApOyB9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjsgX19EVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguZHRvcnMpOyAqKC5kdG9yKTsgIExPTkcgKDApOyB9Ci0gICAgKiguZmluaSkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuO30KLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkcrJHtEQVRBX0FERFItMHg0MDAwMCArICguICYgMHhmZmZjMGZmZil9fSA6IHsKLSAgICAke1JFTE9DQVRJTkcrICBfX2RhdGFfc3RhcnRfXyA9IC4gO30KLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgX19kYXRhX2VuZF9fID0gLiA7fQotICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC47fQotICAgICR7UkVMT0NBVElORysgX2VkYXRhICA9ICAuO30KLSAgfQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsgCQkJCQkKLSAgICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgX19ic3NfZW5kX18gPSAuIDt9Ci0gIH0KLQotICAke1JFTE9DQVRJTkcrIGVuZCA9IC47fQotICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HKyBfX2VuZF9fID0gLjt9Ci0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9kZWx0YTY4LnNjIGIvbGQvc2NyaXB0dGVtcGwvZGVsdGE2OC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5NjMwNS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9kZWx0YTY4LnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi1FTlRSWShfc3RhcnQpCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIDB4MjAwMCArIFNJWkVPRl9IRUFERVJTfSA6Ci0gICAgewotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy50ZXh0LnN0YXJ0ID0gLn07Ci0gICAgICAqKC50ZXh0KQotICAgICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gICAgICAke1JFTE9DQVRJTkcrIF9ldGV4dCAgPSAgLjt9Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLnRleHQuZW5kID0gLn07Ci0gICAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0xJU1RfXyA9IC47fQotICAgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fQ1RPUl9FTkRfXyAtIF9fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9FTkRfXyA9IC47fQotICAgICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9MSVNUX18gPSAuO30KLSAgICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0gICAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfRU5EX18gPSAuO30KLSAgICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORysgU0laRU9GKC50ZXh0KSArIEFERFIoLnRleHQpICsgMHg0MDAwMDB9IDoKLSAgICB7Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLmRhdGEuc3RhcnQgPSAufTsKLSAgICAgICooLmRhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKLSAgICAgICR7UkVMT0NBVElORysgX2VkYXRhICA9ICAufTsKLSAgICAgICR7UkVMT0NBVElORysgX18uZGF0YS5lbmQgPSAufTsKLSAgICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgICB7IAkJCQkJCi0gICAgICAke1JFTE9DQVRJTkcrIF9fLmJzcy5zdGFydCA9IC59OwotICAgICAgKiguYnNzKQotICAgICAgKihDT01NT04pCi0gICAgICAke1JFTE9DQVRJTkcrIF9fLmJzcy5lbmQgPSAufTsKLSAgICAgICR7UkVMT0NBVElORysgZW5kID0gQUxJR04oMHg4KX07Ci0gICAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSBBTElHTigweDgpfTsKLSAgICB9Ci0gIC5jb21tZW50ICR7UkVMT0NBVElORysgMH0gOgotICAgIHsKLSAgICAgICooLmNvbW1lbnQpCi0gICAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9lYm1vbjI5ay5zYyBiL2xkL3NjcmlwdHRlbXBsL2VibW9uMjlrLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjA1MGVlLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2VibW9uMjlrLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLUVOVFJZKHN0YXJ0KQotCi1TRUNUSU9OUyB7Ci0gIC50ZXh0ICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfQUREUn19IDogCi0gICAgewotCSooLnRleHQpOwotCSR7UkVMT0NBVElORytfZXRleHQgPSAufTsKLSAgICB9Ci0gIGRhdGEgJHtSRUxPQ0FUSU5HKzB4ODAwMDIwMDB9IDoKLSAgICB7Ci0JKiguZGF0YSk7Ci0JKigubXN0YWNrKTsgCi0JKiguc2hic3MpOwotCSooLnJzdGFjayk7Ci0JKigubXN0YWNrKTsKLQkke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgfQotICAuYnNzICAuIDoKLSAgICB7IAotCSooQ09NTU9OKSAJCi0JKiguYnNzKTsKLQkke1JFTE9DQVRJTkcrX2VuZCA9IC59OwotICAgIH0gCi19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2VsZi5zYyBiL2xkL3NjcmlwdHRlbXBsL2VsZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmZWE5Ny4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9lbGYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotIwotIyBVbnVzdWFsIHZhcmlhYmxlcyBjaGVja2VkIGJ5IHRoaXMgY29kZToKLSMJTk9QIC0gdHdvIGJ5dGUgb3Bjb2RlIGZvciBuby1vcCAoZGVmYXVsdHMgdG8gMCkKLSMJREFUQV9BRERSIC0gaWYgZW5kLW9mLXRleHQtcGx1cy1vbmUtcGFnZSBpc24ndCByaWdodCBmb3IgZGF0YSBzdGFydAotIwlJTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TIC0gYXQgc3RhcnQgb2YgdGV4dCBzZWdtZW50Ci0jCU9USEVSX1JFQURPTkxZX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAudGV4dCAuaW5pdCAucm9kYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MubWlsbGkpCi0jCU9USEVSX1RFWFRfU0VDVElPTlMgLSB0aGVzZSBnZXQgcHV0IGluIC50ZXh0IHdoZW4gcmVsb2NhdGluZwotIwlPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMgLSBvdGhlciB0aGFuIC5kYXRhIC5ic3MgLmN0b3JzIC5zZGF0YSAuLi4KLSMJCShlLmcuLCAuUEFSSVNDLmdsb2JhbCkKLSMJT1RIRVJfU0VDVElPTlMgLSBhdCB0aGUgZW5kCi0jCUVYRUNVVEFCTEVfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBtdXN0IGJlIGRlZmluZWQgZm9yIGFuCi0jCQlleGVjdXRhYmxlIChlLmcuLCBfRFlOQU1JQ19MSU5LKQotIwlURVhUX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS50ZXh0IHNlY3Rpb24uCi0jCURBVEFfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmRhdGEgc2VjdGlvbi4KLSMJT1RIRVJfR09UX1NZTUJPTFMgLSBzeW1ib2xzIGRlZmluZWQganVzdCBiZWZvcmUgLmdvdC4KLSMJT1RIRVJfR09UX1NFQ1RJT05TIC0gc2VjdGlvbnMganVzdCBhZnRlciAuZ290IGFuZCAuc2RhdGEuCi0jCU9USEVSX0JTU19TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkuYnNzIHNlY3Rpb24gYmVzaWRlcyBfX2Jzc19zdGFydC4KLSMJREFUQV9QTFQgLSAucGx0IHNob3VsZCBiZSBpbiBkYXRhIHNlZ21lbnQsIG5vdCB0ZXh0IHNlZ21lbnQuCi0jCVRFWFRfRFlOQU1JQyAtIC5keW5hbWljIGluIHRleHQgc2VnbWVudCwgbm90IGRhdGEgc2VnbWVudC4KLSMJRU1CRURERUQgLSB3aGV0aGVyIHRoaXMgaXMgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbS4gCi0jCVNITElCX1RFWFRfU1RBUlRfQUREUiAtIGlmIHNldCwgYWRkIHRvIFNJWkVPRl9IRUFERVJTIHRvIHNldAotIwkJc3RhcnQgYWRkcmVzcyBvZiBzaGFyZWQgbGlicmFyeS4KLSMJSU5QVVRfRklMRVMgLSBJTlBVVCBjb21tYW5kIG9mIGZpbGVzIHRvIGFsd2F5cyBpbmNsdWRlCi0jCi0jIFdoZW4gYWRkaW5nIHNlY3Rpb25zLCBkbyBub3RlIHRoYXQgdGhlIG5hbWVzIG9mIHNvbWUgc2VjdGlvbnMgYXJlIHVzZWQKLSMgd2hlbiBzcGVjaWZ5aW5nIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBuZXh0LgotIwotCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotdGVzdCAteiAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iICYmIEJJR19PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLXRlc3QgLXogIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IiAmJiBMSVRUTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci1pZiBbIC16ICIkTUFDSElORSIgXTsgdGhlbiBPVVRQVVRfQVJDSD0ke0FSQ0h9OyBlbHNlIE9VVFBVVF9BUkNIPSR7QVJDSH06JHtNQUNISU5FfTsgZmkKLXRlc3QgLXogIiR7RUxGU0laRX0iICYmIEVMRlNJWkU9MzIKLXRlc3QgLXogIiR7QUxJR05NRU5UfSIgJiYgQUxJR05NRU5UPSIke0VMRlNJWkV9IC8gOCIKLXRlc3QgIiRMRF9GTEFHIiA9ICJOIiAmJiBEQVRBX0FERFI9LgotSU5URVJQPSIuaW50ZXJwICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbnRlcnApIAl9IgotUExUPSIucGx0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucGx0KQl9IgotRFlOQU1JQz0iLmR5bmFtaWMgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluYW1pYykgfSIKLQotQ1RPUj0iLmN0b3JzICR7Q09OU1RSVUNUSU5HLTB9IDogCi0gIHsKLSAgICAke0NPTlNUUlVDVElORyske0NUT1JfU1RBUlR9fQotICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKLSAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKLSAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90Ci0gICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQotICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQotICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCi0gICAgICAgaXMgaW4uICAqLwotCi0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKLQotICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCi0gICAgICAgZnJvbSB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgotICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQotICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLwotCi0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmN0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKLSAgICBLRUVQICgqKC5jdG9ycykpCi0gICAgJHtDT05TVFJVQ1RJTkcrJHtDVE9SX0VORH19Ci0gIH0iCi0KLURUT1I9IiAuZHRvcnMgICAgICAgJHtDT05TVFJVQ1RJTkctMH0gOgotICB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrJHtEVE9SX1NUQVJUfX0KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5kdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguZHRvcnMpKQotICAgICR7Q09OU1RSVUNUSU5HKyR7RFRPUl9FTkR9fQotICB9IgotCi0jIGlmIHRoaXMgaXMgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbSwgZG9uJ3QgYWRkIFNJWkVPRl9IRUFERVJTLgotaWYgWyAteiAiJEVNQkVEREVEIiBdOyB0aGVuCi0gICB0ZXN0IC16ICIke1RFWFRfQkFTRV9BRERSRVNTfSIgJiYgVEVYVF9CQVNFX0FERFJFU1M9IiR7VEVYVF9TVEFSVF9BRERSfSArIFNJWkVPRl9IRUFERVJTIgotZWxzZQotICAgdGVzdCAteiAiJHtURVhUX0JBU0VfQUREUkVTU30iICYmIFRFWFRfQkFTRV9BRERSRVNTPSIke1RFWFRfU1RBUlRfQUREUn0iCi1maQotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke09VVFBVVF9BUkNIfSkKLUVOVFJZKCR7RU5UUll9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotJHtSRUxPQ0FUSU5HKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAke1NUQUNLWkVSTyske1NUQUNLWkVST319ICR7U0hMSUJfUEFUSCske1NITElCX1BBVEh9fSAgKi99Ci0ke1JFTE9DQVRJTkcrJHtFWEVDVVRBQkxFX1NZTUJPTFN9fQotJHtSRUxPQ0FUSU5HKyR7SU5QVVRfRklMRVN9fQotJHtSRUxPQ0FUSU5HLSAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXMKLSAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmcKLSAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGQKLSAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqL30KLQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gICR7Q1JFQVRFX1NITElCLSR7UkVMT0NBVElORysuID0gJHtURVhUX0JBU0VfQUREUkVTU307fX0KLSAgJHtDUkVBVEVfU0hMSUIrJHtSRUxPQ0FUSU5HKy4gPSAke1NITElCX1RFWFRfU1RBUlRfQUREUjotMH0gKyBTSVpFT0ZfSEVBREVSUzt9fQotICAke0NSRUFURV9TSExJQi0ke0lOVEVSUH19Ci0gICR7SU5JVElBTF9SRUFET05MWV9TRUNUSU9OU30KLSAgJHtURVhUX0RZTkFNSUMrJHtEWU5BTUlDfX0KLSAgLmhhc2ggICAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zdHIpCQl9Ci0gIC5nbnUudmVyc2lvbiAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uKQl9Ci0gIC5nbnUudmVyc2lvbl9kICR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb25fZCkJfQotICAuZ251LnZlcnNpb25fciAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX3IpCX0KLSAgLnJlbC50ZXh0ICAgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsLnRleHQpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLnRleHQuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLmdudS5saW5rb25jZS50Kil9Ci0gICAgfQotICAucmVsYS50ZXh0ICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLnRleHQpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS50ZXh0LiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuZ251LmxpbmtvbmNlLnQqKX0KLSAgICB9Ci0gIC5yZWwuZGF0YSAgICAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbC5kYXRhKQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC5kYXRhLiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC5nbnUubGlua29uY2UuZCopfQotICAgIH0KLSAgLnJlbGEuZGF0YSAgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsYS5kYXRhKQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS5kKil9Ci0gICAgfQotICAucmVsLnJvZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWwucm9kYXRhKQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC5yb2RhdGEuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLmdudS5saW5rb25jZS5yKil9Ci0gICAgfQotICAucmVsYS5yb2RhdGEgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLnJvZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLnJvZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS5yKil9Ci0gICAgfQotICAucmVsLmdvdCAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5pbml0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmluaXQpCX0KLSAgLnJlbGEuaW5pdCAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5pbml0KQl9Ci0gIC5yZWwuZmluaSAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5maW5pKQl9Ci0gIC5yZWxhLmZpbmkgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZmluaSkJfQotICAucmVsLmJzcyAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAke1JFTE9DQVRJTkctMH0gOiB7IEtFRVAgKCooLmluaXQpKQl9ID0ke05PUC0wfQotICAke0RBVEFfUExULSR7UExUfX0KLSAgLnRleHQgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfU1lNQk9MU319Ci0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrKigudGV4dC4qKX0KLSAgICAqKC5zdHViKQotICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLwotICAgICooLmdudS53YXJuaW5nKQotICAgICR7UkVMT0NBVElORysqKC5nbnUubGlua29uY2UudCopfQotICAgICR7UkVMT0NBVElORyske09USEVSX1RFWFRfU0VDVElPTlN9fQotICB9ID0ke05PUC0wfQotICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChldGV4dCA9IC4pO30KLSAgLmZpbmkgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyBLRUVQICgqKC5maW5pKSkJCX0gPSR7Tk9QLTB9Ci0gIC5yb2RhdGEgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAqKC5yb2RhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyooLnJvZGF0YS4qKX0KLSAgICAke1JFTE9DQVRJTkcrKiguZ251LmxpbmtvbmNlLnIqKX0KLSAgfQotICAucm9kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJvZGF0YTEpIH0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRE9OTFlfU0VDVElPTlN9fQotCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLwotICAke0NSRUFURV9TSExJQi0ke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSLUFMSUdOKCR7TUFYUEFHRVNJWkV9KSArICguICYgKCR7TUFYUEFHRVNJWkV9IC0gMSkpfTt9fQotICAke0NSRUFURV9TSExJQiske1JFTE9DQVRJTkcrLiA9ICR7U0hMSUJfREFUQV9BRERSLUFMSUdOKCR7TUFYUEFHRVNJWkV9KSArICguICYgKCR7TUFYUEFHRVNJWkV9IC0gMSkpfTt9fQotCi0gIC5kYXRhICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyR7REFUQV9TVEFSVF9TWU1CT0xTfX0KLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysqKC5kYXRhLiopfQotICAgICR7UkVMT0NBVElORysqKC5nbnUubGlua29uY2UuZCopfQotICAgICR7Q09OU1RSVUNUSU5HK1NPUlQoQ09OU1RSVUNUT1JTKX0KLSAgfQotICAuZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5kYXRhMSkgfQotICAuZWhfZnJhbWUgOiB7ICooLmVoX2ZyYW1lKSB9Ci0gIC5nY2NfZXhjZXB0X3RhYmxlIDogeyAqKC5nY2NfZXhjZXB0X3RhYmxlKSB9Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURXUklURV9TRUNUSU9OU319Ci0gICR7UkVMT0NBVElORyske0NUT1J9fQotICAke1JFTE9DQVRJTkcrJHtEVE9SfX0KLSAgJHtEQVRBX1BMVCske1BMVH19Ci0gICR7UkVMT0NBVElORyske09USEVSX0dPVF9TWU1CT0xTfX0KLSAgLmdvdCAgICAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290LnBsdCkgKiguZ290KSB9Ci0gICR7VEVYVF9EWU5BTUlDLSR7RFlOQU1JQ319Ci0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc28KLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi8KLSAgLnNkYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zZGF0YSkgKiguc2RhdGEuKikgfQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9HT1RfU0VDVElPTlN9fQotICAke1JFTE9DQVRJTkcrX2VkYXRhICA9ICAuO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVkYXRhID0gLik7fQotICAke1JFTE9DQVRJTkcrX19ic3Nfc3RhcnQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfQlNTX1NZTUJPTFN9fQotICAuc2JzcyAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnNic3MpICooLnNjb21tb24pIH0KLSAgLmJzcyAgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KLSAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQotICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLwotICAgJHtSRUxPQ0FUSU5HKy4gPSBBTElHTigke0FMSUdOTUVOVH0pO30KLSAgfQotICAke1JFTE9DQVRJTkcrLiA9IEFMSUdOKCR7QUxJR05NRU5UfSk7fQotICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gO30KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfQlNTX0VORF9TWU1CT0xTfX0KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KLQotICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLwotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH0KLSAgLnN0YWIuZXhjbCAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KLSAgLnN0YWIuZXhjbHN0ciAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KLSAgLnN0YWIuaW5kZXggMCA6IHsgKiguc3RhYi5pbmRleCkgfQotICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9Ci0KLSAgLmNvbW1lbnQgMCA6IHsgKiguY29tbWVudCkgfQotCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgotICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KLQotICAvKiBEV0FSRiAxICovCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQotICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQotCi0gIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLQotICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMiAqLwotICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQotICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9Ci0gIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9Ci0gIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9Ci0gIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KLSAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLQotICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KLSAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KLSAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KLSAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQotCi0gICR7UkVMT0NBVElORyske09USEVSX1JFTE9DQVRJTkdfU0VDVElPTlN9fQotCi0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgJHtSRUxPQ0FUSU5HfS4gICovCi0gICR7T1RIRVJfU0VDVElPTlN9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2VsZmQxMHYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9lbGZkMTB2LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjJlZWY0Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2VsZmQxMHYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotIwotIyBVbnVzdWFsIHZhcmlhYmxlcyBjaGVja2VkIGJ5IHRoaXMgY29kZToKLSMJTk9QIC0gdHdvIGJ5dGUgb3Bjb2RlIGZvciBuby1vcCAoZGVmYXVsdHMgdG8gMCkKLSMJREFUQV9BRERSIC0gaWYgZW5kLW9mLXRleHQtcGx1cy1vbmUtcGFnZSBpc24ndCByaWdodCBmb3IgZGF0YSBzdGFydAotIwlPVEhFUl9SRUFET05MWV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLnRleHQgLmluaXQgLnJvZGF0YSAuLi4KLSMJCShlLmcuLCAuUEFSSVNDLm1pbGxpKQotIwlPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMgLSBvdGhlciB0aGFuIC5kYXRhIC5ic3MgLmN0b3JzIC5zZGF0YSAuLi4KLSMJCShlLmcuLCAuUEFSSVNDLmdsb2JhbCkKLSMJT1RIRVJfU0VDVElPTlMgLSBhdCB0aGUgZW5kCi0jCUVYRUNVVEFCTEVfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBtdXN0IGJlIGRlZmluZWQgZm9yIGFuCi0jCQlleGVjdXRhYmxlIChlLmcuLCBfRFlOQU1JQ19MSU5LKQotIwlURVhUX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS50ZXh0IHNlY3Rpb24uCi0jCURBVEFfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmRhdGEgc2VjdGlvbi4KLSMJT1RIRVJfQlNTX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS5ic3Mgc2VjdGlvbiBiZXNpZGVzIF9fYnNzX3N0YXJ0LgotIwlEQVRBX1BMVCAtIC5wbHQgc2hvdWxkIGJlIGluIGRhdGEgc2VnbWVudCwgbm90IHRleHQgc2VnbWVudC4KLSMJRU1CRURERUQgLSB3aGV0aGVyIHRoaXMgaXMgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbS4gCi0jCi0jIFdoZW4gYWRkaW5nIHNlY3Rpb25zLCBkbyBub3RlIHRoYXQgdGhlIG5hbWVzIG9mIHNvbWUgc2VjdGlvbnMgYXJlIHVzZWQKLSMgd2hlbiBzcGVjaWZ5aW5nIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBuZXh0LgotIwotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLXRlc3QgLXogIiR7QklHX09VVFBVVF9GT1JNQVR9IiAmJiBCSUdfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0IC16ICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIgJiYgTElUVExFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotaWYgWyAteiAiJE1BQ0hJTkUiIF07IHRoZW4gT1VUUFVUX0FSQ0g9JHtBUkNIfTsgZWxzZSBPVVRQVVRfQVJDSD0ke0FSQ0h9OiR7TUFDSElORX07IGZpCi10ZXN0ICIkTERfRkxBRyIgPSAiTiIgJiYgREFUQV9BRERSPS4KLUlOVEVSUD0iLmludGVycCAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaW50ZXJwKSAJfSIKLVBMVD0iLnBsdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnBsdCkJfSIKLQotCi1DVE9SPSIuY3RvcnMgJHtDT05TVFJVQ1RJTkctMH0gOiAKLSAgewotICAgICR7Q09OU1RSVUNUSU5HKyR7Q1RPUl9TVEFSVH19Ci0gICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgotICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcwotICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKLSAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCi0gICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCi0gICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KLSAgICAgICBpcyBpbi4gICovCi0KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQotCi0gICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KLSAgICAgICBmcm9tIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCi0gICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCi0gICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCi0KLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuY3RvcnMpKQotICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQotICAgIEtFRVAgKCooLmN0b3JzKSkKLSAgICAke0NPTlNUUlVDVElORyske0NUT1JfRU5EfX0KLSAgfSIKLQotRFRPUj0iIC5kdG9ycyAgICAgICAke0NPTlNUUlVDVElORy0wfSA6Ci0gIHsKLSAgICAke0NPTlNUUlVDVElORyske0RUT1JfU1RBUlR9fQotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCi0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmR0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKLSAgICBLRUVQICgqKC5kdG9ycykpCi0gICAgJHtDT05TVFJVQ1RJTkcrJHtEVE9SX0VORH19Ci0gIH0iCi0KLQotIyBpZiB0aGlzIGlzIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0sIGRvbid0IGFkZCBTSVpFT0ZfSEVBREVSUy4KLWlmIFsgLXogIiRFTUJFRERFRCIgXTsgdGhlbgotICAgdGVzdCAteiAiJHtSRUFET05MWV9CQVNFX0FERFJFU1N9IiAmJiBSRUFET05MWV9CQVNFX0FERFJFU1M9IiR7UkVBRE9OTFlfU1RBUlRfQUREUn0gKyBTSVpFT0ZfSEVBREVSUyIKLWVsc2UKLSAgIHRlc3QgLXogIiR7UkVBRE9OTFlfQkFTRV9BRERSRVNTfSIgJiYgUkVBRE9OTFlfQkFTRV9BRERSRVNTPSIke1JFQURPTkxZX1NUQVJUX0FERFJ9IgotZmkKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtPVVRQVVRfQVJDSH0pCi1FTlRSWSgke0VOVFJZfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7UkVMT0NBVElORysvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgJHtTVEFDS1pFUk8rJHtTVEFDS1pFUk99fSAke1NITElCX1BBVEgrJHtTSExJQl9QQVRIfX0gICovfQotJHtSRUxPQ0FUSU5HKyR7RVhFQ1VUQUJMRV9TWU1CT0xTfX0KLSR7UkVMT0NBVElORy0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCi0gIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCi0gIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCi0gIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi99Ci1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgJHtDUkVBVEVfU0hMSUItJHtSRUxPQ0FUSU5HKy4gPSAke1JFQURPTkxZX0JBU0VfQUREUkVTU307fX0KLSAgJHtDUkVBVEVfU0hMSUIrJHtSRUxPQ0FUSU5HKy4gPSBTSVpFT0ZfSEVBREVSUzt9fQotICAke0NSRUFURV9TSExJQi0ke0lOVEVSUH19Ci0gIC5oYXNoICAgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuaW5pdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5pbml0KQl9Ci0gIC5yZWxhLmluaXQgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuaW5pdCkJfQotICAucmVsLmZpbmkgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZmluaSkJfQotICAucmVsYS5maW5pICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmZpbmkpCX0KLSAgLnJlbC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucGx0KQkJfQotICAke0RBVEFfUExULSR7UExUfX0KLSAgLnJvZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGEpICooLmdudS5saW5rb25jZS5yKikgfQotICAucm9kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJvZGF0YTEpIH0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRE9OTFlfU0VDVElPTlN9fQotCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gICovCi0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFItQUxJR04oNCk7fX0KLQotICAuZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORyske0RBVEFfU1RBUlRfU1lNQk9MU319Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhLiopCi0gICAgKiguZ251LmxpbmtvbmNlLmQqKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgfQotICAuZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5kYXRhMSkgfQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlN9fQotICAke1JFTE9DQVRJTkcrJHtDVE9SfX0KLSAgJHtSRUxPQ0FUSU5HKyR7RFRPUn19Ci0gIC5nb3QgICAgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdvdC5wbHQpICooLmdvdCkgfQotICAuZHluYW1pYyAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5hbWljKSB9Ci0gICR7REFUQV9QTFQrJHtQTFR9fQotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cwotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCi0gIC5zZGF0YSAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2RhdGEpIH0KLSAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlZGF0YSA9IC4pO30KLSAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0ID0gLjt9Ci0gICR7UkVMT0NBVElORyske09USEVSX0JTU19TWU1CT0xTfX0KLSAgLnNic3MgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9Ci0gIC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gICR7UkVMT0NBVElORytfZW5kID0gLiA7fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZW5kID0gLik7fQotCi0gIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH0KLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfQotICAuc3RhYi5leGNsIDAgOiB7ICooLnN0YWIuZXhjbCkgfQotICAuc3RhYi5leGNsc3RyIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQotICAuc3RhYi5pbmRleCAwIDogeyAqKC5zdGFiLmluZGV4KSB9Ci0gIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KLQotICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9Ci0KLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCi0gICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZwotICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLwotCi0gIC8qIERXQVJGIDEgKi8KLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9Ci0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9Ci0KLSAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQotICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQotCi0gIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLwotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KLQotICAvKiBEV0FSRiAyICovCi0gIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9Ci0gIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KLSAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KLSAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9Ci0gIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KLSAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQotICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQotCi0gIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQotICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQotICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQotICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9Ci0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVMT0NBVElOR19TRUNUSU9OU319Ci0KLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAke1JFTE9DQVRJTkd9LiAgKi8KLSAgJHtPVEhFUl9TRUNUSU9OU30KLQotCi0gIC8qIEhtbW0sIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheS4gIFRoaXMgc2V0cyB0aGUgc3RhY2sgdG8gdGhlCi0gICAgIHRvcCBvZiB0aGUgc2ltdWxhdG9yIG1lbW9yeSAoaS5lLiB0b3Agb2YgNjRLIGRhdGEgc3BhY2UpLiAqLwotICAuc3RhY2sgMHgwMDAwN0ZGRSA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0KLQotICAudGV4dCAgICAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX0FERFJ9fSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX1NZTUJPTFN9fQotICAgIEtFRVAgKCooLmluaXQpKQotICAgIEtFRVAgKCooLmZpbmkpKQotICAgICooLnRleHQpCi0gICAgKigudGV4dC4qKQotICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLwotICAgICooLmdudS53YXJuaW5nKQotICAgICooLmdudS5saW5rb25jZS50KikKLSAgfSA9JHtOT1AtMH0KLSAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZXRleHQgPSAuKTt9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmY5MjgzLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotCi1DVE9SPSIuY3RvcnMgJHtDT05TVFJVQ1RJTkctMH0gOiAKLSAgewotICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfTElTVF9fID0gLjsgfQotICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKLSAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKLSAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90Ci0gICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQotICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQotICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCi0gICAgICAgaXMgaW4uICAqLwotCi0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKLQotICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCi0gICAgICAgZnJvbSB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgotICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQotICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLwotCi0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmN0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKLSAgICBLRUVQICgqKC5jdG9ycykpCi0gICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9FTkRfXyA9IC47IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gJHtEQVRBX01FTU9SWX19IgotCi1EVE9SPSIgIC5kdG9ycwkke0NPTlNUUlVDVElORy0wfSA6Ci0gIHsKLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0xJU1RfXyA9IC47IH0KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5kdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguZHRvcnMpKQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfRU5EX18gPSAuOyB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+ICR7REFUQV9NRU1PUll9fSIKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLU1FTU9SWQotewotICB0ZXh0ICR7VEVYVF9ERUZfU0VDVElPTn0gOiBPUklHSU4gPSAke1RFWFRfU1RBUlRfQUREUn0sIExFTkdUSCA9ICR7VEVYVF9TSVpFfQotICBkYXRhICR7REFUQV9ERUZfU0VDVElPTn0gOiBPUklHSU4gPSAke0RBVEFfU1RBUlRfQUREUn0sIExFTkdUSCA9ICR7REFUQV9TSVpFfQotICBlbWVtICR7RU1FTV9ERUZfU0VDVElPTn0gOiBPUklHSU4gPSAke0VNRU1fU1RBUlRfQUREUn0sIExFTkdUSCA9ICR7RU1FTV9TSVpFfQotICBlaXQJCQkgICA6IE9SSUdJTiA9ICR7RUlUX1NUQVJUX0FERFJ9LCAgTEVOR1RIID0gJHtFSVRfU0laRX0KLX0KLQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gICR7VEVYVF9EWU5BTUlDKyR7RFlOQU1JQ319Ci0gIC5oYXNoCQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5oYXNoKSB9Ci0gIC5keW5zeW0JCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3ltKSB9Ci0gIC5keW5zdHIJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3RyKSB9Ci0gIC5nbnUudmVyc2lvbgkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbikgfQotICAuZ251LnZlcnNpb25fZAkke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KLSAgLmdudS52ZXJzaW9uX3IJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbl9yKSB9Ci0KLSAgLnJlbGEudGV4dAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnRleHQpICooLnJlbGEuZ251LmxpbmtvbmNlLnQqKSB9Ci0gIC5yZWxhLmRhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kYXRhKSAqKC5yZWxhLmdudS5saW5rb25jZS5kKikgfQotICAucmVsYS5yb2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5yb2RhdGEpICooLnJlbGEuZ251LmxpbmtvbmNlLnIqKSB9Ci0gIC5yZWxhLnN0ZXh0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc3Rlc3QpIH0KLSAgLnJlbGEuZXRleHQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ldGVzdCkgfQotICAucmVsYS5zZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNkYXRhKSB9Ci0gIC5yZWxhLmVkYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZWRhdGEpIH0KLSAgLnJlbGEuZWl0X3YJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5laXRfdikgfQotICAucmVsYS5zYnNzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc2JzcykgfQotICAucmVsYS5lYnNzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZWJzcykgfQotICAucmVsYS5zcm9kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc3JvZGF0YSkgfQotICAucmVsYS5lcm9kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZXJvZGF0YSkgfQotICAucmVsYS5nb3QJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QpIH0KLSAgLnJlbGEuY3RvcnMJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5jdG9ycykgfQotICAucmVsYS5kdG9ycwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmR0b3JzKSB9Ci0gIC5yZWxhLmluaXQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5pbml0KSB9Ci0gIC5yZWxhLmZpbmkJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5maW5pKSB9Ci0gIC5yZWxhLmJzcwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmJzcykgfQotICAucmVsYS5wbHQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5wbHQpIH0KLQotICAucmVsLmRhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmRhdGEpICooLnJlbC5nbnUubGlua29uY2UuZCopIH0KLSAgLnJlbC5yb2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnJvZGF0YSkgKigucmVsLmdudS5saW5rb25jZS5yKikgfQotICAucmVsLnN0ZXh0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5zdGVzdCkgfQotICAucmVsLmV0ZXh0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5ldGVzdCkgfQotICAucmVsLnNkYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5zZGF0YSkgfQotICAucmVsLmVkYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5lZGF0YSkgfQotICAucmVsLnNic3MJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnNic3MpIH0KLSAgLnJlbC5lYnNzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5lYnNzKSB9Ci0gIC5yZWwuZWl0X3YJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmVpdF92KSB9Ci0gIC5yZWwuc3JvZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuc3JvZGF0YSkgfQotICAucmVsLmVyb2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmVyb2RhdGEpIH0KLSAgLnJlbC5nb3QJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmdvdCkgfQotICAucmVsLmN0b3JzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5jdG9ycykgfQotICAucmVsLmR0b3JzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5kdG9ycykgfQotICAucmVsLmluaXQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmluaXQpIH0KLSAgLnJlbC5maW5pCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5maW5pKSB9Ci0gIC5yZWwuYnNzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5ic3MpIH0KLSAgLnJlbC5wbHQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnBsdCkgfQotCi0gIC5pbml0CQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbml0KSB9ID0ke05PUC0wfQotICAke0RBVEFfUExULSR7UExUfX0KLQotICAvKiBJbnRlcm5hbCB0ZXh0IHNwYWNlICovCi0gIC5zdGV4dAkke1JFTE9DQVRJTkctMH0gOiB7ICooLnN0ZXh0KSB9CQkke1JFTE9DQVRJTkcrID4gdGV4dH0KLQotICAvKiBJbnRlcm5hbCB0ZXh0IHNwYWNlIG9yIGV4dGVybmFsIG1lbW9yeSAqLwotICAudGV4dCA6Ci0gIHsKLSAgICAqKC50ZXh0KQotICAgICooLmdudS5saW5rb25jZS50KikKLSAgICAqKC5pbml0KQotICAgICooLmZpbmkpCi0gICAgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotICB9ICR7UkVMT0NBVElORysgPiAke1RFWFRfTUVNT1JZfX0KLQotICAvKiBJbnRlcm5hbCBkYXRhIHNwYWNlICovCi0gIC5zcm9kYXRhCSR7UkVMT0NBVElORy0wfSA6IHsgKiguc3JvZGF0YSkgfQkke1JFTE9DQVRJTkcrID4gZGF0YX0KLSAgLnNkYXRhCSR7UkVMT0NBVElORy0wfSA6IHsgKiguc2RhdGEpIH0JCSR7UkVMT0NBVElORysgPiBkYXRhfQotCi0gIC8qIEludGVybmFsIGRhdGEgc3BhY2Ugb3IgZXh0ZXJuYWwgbWVtb3J5ICovCi0gIC5yb2RhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGEpIH0JJHtSRUxPQ0FUSU5HKyA+ICR7REFUQV9NRU1PUll9fQotCi0gIC8qIEMrKyBleGNlcHRpb24gc3VwcG9ydC4gICovCi0gIC5laF9mcmFtZQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmVoX2ZyYW1lKSB9CSR7UkVMT0NBVElORysgPiAke0RBVEFfTUVNT1JZfX0KLQotICAke1JFTE9DQVRJTkcrJHtDVE9SfX0KLSAgJHtSRUxPQ0FUSU5HKyR7RFRPUn19Ci0KLSAgLmRhdGEJCSR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmdudS5saW5rb25jZS5kKikKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotICB9ICR7UkVMT0NBVElORysgPiAke0RBVEFfTUVNT1JZfX0KLQotICAvKiBFeHRlcm5hbCBtZW1vcnkgKi8KLSAgLmV0ZXh0CSR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fZXRleHRfc3RhcnQgPSAuKSA7IH0KLSAgICAqKC5ldGV4dCkKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fZXRleHRfZW5kID0gLikgOyB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+IGVtZW19Ci0KLSAgLmVyb2RhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5lcm9kYXRhKSB9CSR7UkVMT0NBVElORysgPiBlbWVtfQotICAuZWRhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5lZGF0YSkgfQkJJHtSRUxPQ0FUSU5HKyA+IGVtZW19Ci0KLSAgLnNic3MJCSR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fc2Jzc19zdGFydCA9IC4pIDsgfQotICAgICooLnNic3MpCi0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX3Nic3NfZW5kID0gLikgOyAgfQotICB9ICR7UkVMT0NBVElORysgPiBkYXRhfQotCi0gIC5lYnNzCQkke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2Vic3Nfc3RhcnQgPSAuKSA7IH0KLSAgICAqKC5lYnNzKQotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19lYnNzX2VuZCA9IC4pIDsgIH0KLSAgfSAke1JFTE9DQVRJTkcrID4gZGF0YX0KLQotICAuYnNzCQkke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2Jzc19zdGFydCA9IC4pIDsgfQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fYnNzX2VuZCA9IC4pIDsgfQotICAgICR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotICB9ICR7UkVMT0NBVElORysgPiAke0RBVEFfTUVNT1JZfX0KLQotICAuZWl0X3YJJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19laXRfc3RhcnQgPSAuKSA7IH0KLSAgICAqKC5laXRfdikKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fZWl0X2VuZCA9IC4pIDsgfQotICB9ICR7UkVMT0NBVElORysgPiBlaXR9Ci0KLSAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KLSAgLnN0YWIJCSAwIDogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyCSAwIDogeyAqKC5zdGFic3RyKSB9Ci0gIC5zdGFiLmV4Y2wJIDAgOiB7ICooLnN0YWIuZXhjbCkgfQotICAuc3RhYi5leGNsc3RyCSAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KLSAgLnN0YWIuaW5kZXgJIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KLSAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQotCi0gIC5jb21tZW50CSAwIDogeyAqKC5jb21tZW50KSB9Ci0KLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCi0gICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZwotICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLwotCi0gIC8qIERXQVJGIDEgKi8KLSAgLmRlYnVnCSAwIDogeyAqKC5kZWJ1ZykgfQotICAubGluZQkJIDAgOiB7ICooLmxpbmUpIH0KLQotICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCi0gIC5kZWJ1Z19zcmNpbmZvIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQotCi0gIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLwotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KLQotICAvKiBEV0FSRiAyICovCi0gIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9Ci0gIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KLSAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KLSAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9Ci0gIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KLSAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQotICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQotCi0gIFBST1ZJREUgKF9fc3RhY2sgPSAke1NUQUNLX1NUQVJUX0FERFJ9KTsKLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9lbGZwcGMuc2MgYi9sZC9zY3JpcHR0ZW1wbC9lbGZwcGMuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYWI4ZjguLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvZWxmcHBjLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLSMKLSMgVW51c3VhbCB2YXJpYWJsZXMgY2hlY2tlZCBieSB0aGlzIGNvZGU6Ci0jCU5PUCAtIHR3byBieXRlIG9wY29kZSBmb3Igbm8tb3AgKGRlZmF1bHRzIHRvIDApCi0jCURBVEFfQUREUiAtIGlmIGVuZC1vZi10ZXh0LXBsdXMtb25lLXBhZ2UgaXNuJ3QgcmlnaHQgZm9yIGRhdGEgc3RhcnQKLSMJT1RIRVJfUkVBRE9OTFlfU0VDVElPTlMgLSBvdGhlciB0aGFuIC50ZXh0IC5pbml0IC5yb2RhdGEgLi4uCi0jCQkoZS5nLiwgLlBBUklTQy5taWxsaSkKLSMJT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAuZGF0YSAuYnNzIC5jdG9ycyAuc2RhdGEgLi4uCi0jCQkoZS5nLiwgLlBBUklTQy5nbG9iYWwpCi0jCU9USEVSX1NFQ1RJT05TIC0gYXQgdGhlIGVuZAotIwlFWEVDVVRBQkxFX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgbXVzdCBiZSBkZWZpbmVkIGZvciBhbgotIwkJZXhlY3V0YWJsZSAoZS5nLiwgX0RZTkFNSUNfTElOSykKLSMJVEVYVF9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkudGV4dCBzZWN0aW9uLgotIwlEQVRBX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS5kYXRhIHNlY3Rpb24uCi0jCU9USEVSX0JTU19TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkuYnNzIHNlY3Rpb24gYmVzaWRlcyBfX2Jzc19zdGFydC4KLSMKLSMgV2hlbiBhZGRpbmcgc2VjdGlvbnMsIGRvIG5vdGUgdGhhdCB0aGUgbmFtZXMgb2Ygc29tZSBzZWN0aW9ucyBhcmUgdXNlZAotIyB3aGVuIHNwZWNpZnlpbmcgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG5leHQuCi0jCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotdGVzdCAteiAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iICYmIEJJR19PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLXRlc3QgLXogIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IiAmJiBMSVRUTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0ICIkTERfRkxBRyIgPSAiTiIgJiYgREFUQV9BRERSPS4KLVNCU1MyPSIuc2JzczIgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zYnNzMikgfSIKLVNEQVRBMj0iLnNkYXRhMiAke1JFTE9DQVRJTkctMH0gOiB7ICooLnNkYXRhMikgfSIKLUlOVEVSUD0iLmludGVycCAke1JFTE9DQVRJTkctMH0gOiB7ICooLmludGVycCkgfSIKLVBMVD0iLnBsdCAke1JFTE9DQVRJTkctMH0gOiB7ICooLnBsdCkgfSIKLUNUT1I9Ii5jdG9ycyAke0NPTlNUUlVDVElORy0wfSA6IAotICB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrJHtDVE9SX1NUQVJUfX0KLSAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCi0gICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCi0gICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKLSAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAotICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKLSAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKLSAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKLSAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubwotICAgICAgIGlzIGluLiAgKi8KLQotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCi0KLSAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQotICAgICAgIGZyb20gdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KLSAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKLSAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KLQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5jdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguY3RvcnMpKQotICAgICR7Q09OU1RSVUNUSU5HKyR7Q1RPUl9FTkR9fQotICB9IgotCi1EVE9SPSIgLmR0b3JzICAgICAgICR7Q09OU1RSVUNUSU5HLTB9IDoKLSAgewotICAgICR7Q09OU1RSVUNUSU5HKyR7RFRPUl9TVEFSVH19Ci0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuZHRvcnMpKQotICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQotICAgIEtFRVAgKCooLmR0b3JzKSkKLSAgICAke0NPTlNUUlVDVElORyske0RUT1JfRU5EfX0KLSAgfSIKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLUVOVFJZKCR7RU5UUll9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotJHtSRUxPQ0FUSU5HKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAke1NUQUNLWkVSTyske1NUQUNLWkVST319ICR7U0hMSUJfUEFUSCske1NITElCX1BBVEh9fSAgKi99Ci0ke1JFTE9DQVRJTkcrJHtFWEVDVVRBQkxFX1NZTUJPTFN9fQotJHtSRUxPQ0FUSU5HLSAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXMKLSAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmcKLSAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGQKLSAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqL30KLQotJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fc3RhY2sgPSAwKTt9Ci0ke1JFTE9DQVRJTkcrUFJPVklERSAoX19fc3RhY2sgPSAwKTt9Ci1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgJHtDUkVBVEVfU0hMSUItJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn0gKyBTSVpFT0ZfSEVBREVSUzt9fQotICAke0NSRUFURV9TSExJQiske1JFTE9DQVRJTkcrLiA9IFNJWkVPRl9IRUFERVJTO319Ci0gICR7Q1JFQVRFX1NITElCLSR7SU5URVJQfX0KLSAgLmhhc2gJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0cgkke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN0cikJCX0KLSAgLmdudS52ZXJzaW9uICR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb24pICAgICAgfQotICAuZ251LnZlcnNpb25fZCAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX2QpICB9Ci0gIC5nbnUudmVyc2lvbl9yICR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb25fcikgIH0KLSAgLnJlbGEudGV4dCAgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsYS50ZXh0KQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEudGV4dC4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS50Kil9Ci0gICAgfQotICAucmVsYS5kYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLmRhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5kYXRhLiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuZ251LmxpbmtvbmNlLmQqKX0KLSAgICB9Ci0gIC5yZWxhLnJvZGF0YSAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbGEucm9kYXRhKQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEucm9kYXRhLiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuZ251LmxpbmtvbmNlLnIqKX0KLSAgICB9Ci0gIC5yZWxhLmdvdAkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZ290KQl9Ci0gIC5yZWxhLmdvdDEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdDEpCX0KLSAgLnJlbGEuZ290Mgkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZ290MikJfQotICAucmVsYS5jdG9ycwkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbGEuZHRvcnMJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWxhLmluaXQJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmluaXQpCX0KLSAgLnJlbGEuZmluaQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZmluaSkJfQotICAucmVsYS5ic3MJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsYS5wbHQJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnBsdCkJfQotICAucmVsYS5zZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc2RhdGEpCX0KLSAgLnJlbGEuc2Jzcwkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc2JzcykJfQotICAucmVsYS5zZGF0YTIJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNkYXRhMikJfQotICAucmVsYS5zYnNzMgkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc2JzczIpCX0KLSAgLnRleHQgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfU1lNQk9MU319Ci0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrKigudGV4dC4qKX0KLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KLSAgICAqKC5nbnUud2FybmluZykKLSAgICAke1JFTE9DQVRJTkcrKiguZ251LmxpbmtvbmNlLnQqKX0KLSAgfSA9JHtOT1AtMH0KLSAgLmluaXQJCSR7UkVMT0NBVElORy0wfSA6IHsgS0VFUCAoKiguaW5pdCkpCX0gPSR7Tk9QLTB9Ci0gIC5maW5pCQkke1JFTE9DQVRJTkctMH0gOiB7IEtFRVAgKCooLmZpbmkpKQl9ID0ke05PUC0wfQotICAucm9kYXRhICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgKigucm9kYXRhKQotICAgICR7UkVMT0NBVElORysqKC5yb2RhdGEuKil9Ci0gICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS5yKil9Ci0gIH0KLSAgLnJvZGF0YTEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGExKSB9Ci0gICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGV0ZXh0ID0gLik7fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19ldGV4dCA9IC4pO30KLSAgJHtDUkVBVEVfU0hMSUItJHtTREFUQTJ9fQotICAke0NSRUFURV9TSExJQi0ke1NCU1MyfX0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRE9OTFlfU0VDVElPTlN9fQotCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICBJdCB3b3VsZAotICAgICBiZSBtb3JlIGNvcnJlY3QgdG8gZG8gdGhpczoKLSAgICAgICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSLUFMSUdOKCR7TUFYUEFHRVNJWkV9KSArIChBTElHTig4KSAmICgke01BWFBBR0VTSVpFfSAtIDEpKX07fQotICAgICBUaGUgY3VycmVudCBleHByZXNzaW9uIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgdGhlIGNhc2Ugb2YgYQotICAgICB0ZXh0IHNlZ21lbnQgZW5kaW5nIHByZWNpc2VseSBhdCB0aGUgZW5kIG9mIGEgcGFnZTsgaXQgY2F1c2VzIHRoZQotICAgICBkYXRhIHNlZ21lbnQgdG8gc2tpcCBhIHBhZ2UuICBUaGUgYWJvdmUgZXhwcmVzc2lvbiBkb2VzIG5vdCBoYXZlCi0gICAgIHRoaXMgcHJvYmxlbSwgYnV0IGl0IHdpbGwgY3VycmVudGx5ICgyLzk1KSBjYXVzZSBCRkQgdG8gYWxsb2NhdGUKLSAgICAgYSBzaW5nbGUgc2VnbWVudCwgY29tYmluaW5nIGJvdGggdGV4dCBhbmQgZGF0YSwgZm9yIHRoaXMgY2FzZS4KLSAgICAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIHRleHQgc2VnbWVudCBmcm9tIGJlaW5nIHNoYXJlZCBhbW9uZwotICAgICBtdWx0aXBsZSBleGVjdXRpb25zIG9mIHRoZSBwcm9ncmFtOyBJIHRoaW5rIHRoYXQgaXMgbW9yZQotICAgICBpbXBvcnRhbnQgdGhhbiBsb3NpbmcgYSBwYWdlIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKG5vdGUKLSAgICAgdGhhdCBubyBhY3R1YWwgbWVtb3J5IGlzIGxvc3Q7IHRoZSBwYWdlIHdoaWNoIGlzIHNraXBwZWQgY2FuIG5vdAotICAgICBiZSByZWZlcmVuY2VkKS4gICovCi0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFItIEFMSUdOKDgpICsgJHtNQVhQQUdFU0laRX19O30KLQotICAuZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORyske0RBVEFfU1RBUlRfU1lNQk9MU319Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrKiguZGF0YS4qKX0KLSAgICAke1JFTE9DQVRJTkcrKiguZ251LmxpbmtvbmNlLmQqKX0KLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gIH0KLSAgLmRhdGExICR7UkVMT0NBVElORy0wfSA6IHsgKiguZGF0YTEpIH0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TfX0KLQotICAuZ290MQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nb3QxKSB9Ci0gIC5keW5hbWljCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluYW1pYykgfQotCi0gIC8qIFB1dCAuY3RvcnMgYW5kIC5kdG9ycyBuZXh0IHRvIHRoZSAuZ290MiBzZWN0aW9uLCBzbyB0aGF0IHRoZSBwb2ludGVycwotICAgICBnZXQgcmVsb2NhdGVkIHdpdGggLW1yZWxvY2F0YWJsZS4gQWxzbyBwdXQgaW4gdGhlIC5maXh1cCBwb2ludGVycy4KLSAgICAgVGhlIGN1cnJlbnQgY29tcGlsZXIgbm8gbG9uZ2VyIG5lZWRzIHRoaXMsIGJ1dCBrZWVwIGl0IGFyb3VuZCBmb3IgMi43LjIgICovCi0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9HT1QyX1NUQVJUXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fR09UMl9TVEFSVF8gPSAuKTt9Ci0gIC5nb3QyCQkke1JFTE9DQVRJTkctMH0gOiAgeyAqKC5nb3QyKSB9Ci0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fQ1RPUl9MSVNUX18gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX19DVE9SX0xJU1RfXyA9IC4pO30KLSAgICAgICAgICAgICAgICAke1JFTE9DQVRJTkcrJHtDVE9SfX0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fQ1RPUl9FTkRfXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fX0NUT1JfRU5EX18gPSAuKTt9Ci0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fRFRPUl9MSVNUX18gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX19EVE9SX0xJU1RfXyA9IC4pO30KLSAgICAgICAgICAgICAgICAke1JFTE9DQVRJTkcrJHtEVE9SfX0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fRFRPUl9FTkRfXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fX0RUT1JfRU5EX18gPSAuKTt9Ci0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9GSVhVUF9TVEFSVF8gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0ZJWFVQX1NUQVJUXyA9IC4pO30KLSAgLmZpeHVwCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZml4dXApIH0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9GSVhVUF9FTkRfID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19GSVhVUF9FTkRfID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX0dPVDJfRU5EXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fR09UMl9FTkRfID0gLik7fQotCi0JCSR7UkVMT0NBVElORytQUk9WSURFIChfR09UX1NUQVJUXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fR09UX1NUQVJUXyA9IC4pO30KLSAgLmdvdAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nb3QpIH0KLSAgLmdvdC5wbHQJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nb3QucGx0KSB9Ci0gICR7Q1JFQVRFX1NITElCKyR7U0RBVEEyfX0KLSAgJHtDUkVBVEVfU0hMSUIrJHtTQlNTMn19Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfR09UX0VORF8gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0dPVF9FTkRfID0gLik7fQotCi0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc28KLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi8KLSAgLnNkYXRhCSR7UkVMT0NBVElORy0wfSA6IHsgKiguc2RhdGEpIH0KLSAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlZGF0YSA9IC4pO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fZWRhdGEgPSAuKTt9Ci0gIC5zYnNzICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19zYnNzX3N0YXJ0ID0gLik7fQotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfX19zYnNzX3N0YXJ0ID0gLik7fQotICAgICooLnNic3MpCi0gICAgKiguc2NvbW1vbikKLSAgICAqKC5keW5zYnNzKQotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfX3Nic3NfZW5kID0gLik7fQotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfX19zYnNzX2VuZCA9IC4pO30KLSAgfQotICAke1BMVH0KLSAgLmJzcyAgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfQlNTX1NZTUJPTFN9fQotICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fYnNzX3N0YXJ0ID0gLik7fQotICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fX2Jzc19zdGFydCA9IC4pO30KLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gICR7UkVMT0NBVElORytfZW5kID0gLiA7fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZW5kID0gLik7fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19lbmQgPSAuKTt9Ci0KLSAgLyogVGhlc2UgYXJlIG5lZWRlZCBmb3IgRUxGIGJhY2tlbmRzIHdoaWNoIGhhdmUgbm90IHlldCBiZWVuCi0gICAgIGNvbnZlcnRlZCB0byB0aGUgbmV3IHN0eWxlIGxpbmtlci4gICovCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH0KLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfQotCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgotICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KLQotICAvKiBEV0FSRiAxICovCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQotICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQotCi0gIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLQotICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMiAqLwotICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQotICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9Ci0gIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9Ci0gIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9Ci0gIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KLSAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLQotICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KLSAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KLSAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KLSAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQotCi0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgJHtSRUxPQ0FUSU5HfS4gICovCi0gICR7T1RIRVJfU0VDVElPTlN9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2dvMzJjb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvZ28zMmNvZmYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZjYwNzYuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvZ28zMmNvZmYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIDM4NiBnbzMyCi0jIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1zdGFydAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyAweDEwMDArU0laRU9GX0hFQURFUlN9IDogewotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLiA7IF9ldGV4dCA9IC59OwotICAgICR7UkVMT0NBVElORysgLiA9IEFMSUdOKDB4MjAwKTt9Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAke0RBVEFfQUxJR05NRU5UfX0gOiB7Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5jdG9yKX0KLSAgICAke1JFTE9DQVRJTkcrICooLmR0b3IpfQotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLiA7IF9lZGF0YSA9IC59OwotICAgICR7UkVMT0NBVElORysgLiA9IEFMSUdOKDB4MjAwKTt9Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICB7IAkJCQkJCi0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgZW5kID0gLiA7IF9lbmQgPSAufTsKLSAgICAke1JFTE9DQVRJTkcrIC4gPSBBTElHTigweDIwMCk7fQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2g4MzAwLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDgzMDAuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZjg3NmUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaDgzMDAuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLUVOVFJZKCJfc3RhcnQiKQotCi1NRU1PUlkKLXsKLQkvKiAweGM0IGlzIGEgbWFnaWMgZW50cnkuICBXZSBzaG91bGQgaGF2ZSB0aGUgbGlua2VyIGp1c3QKLQkgICBza2lwIG92ZXIgaXQgb25lIGRheS4uLiAqLwotCXZlY3RvcnMgOiBvID0gMHgwMDAwLCBsID0gMHhjNAotCW1hZ2ljdmVjdG9ycyA6IG8gPSAweGM0LCBsID0gMHgzYwotCXJhbSAgICA6IG8gPSAweDAxMDAsIGwgPSAweGZkZmMKLQkvKiBUaGUgc3RhY2sgc3RhcnRzIGF0IHRoZSB0b3Agb2YgbWFpbiByYW0uICAqLwotCXRvcHJhbSA6IG8gPSAweGZlZmMsIGwgPSAweDQKLQkvKiBBdCB0aGUgdmVyeSB0byBvZiB0aGUgYWRkcmVzcyBzcGFjZSBpcyB0aGUgOC1iaXQgYXJlYS4gICovCi0JZWlnaHQgOiBvID0gMHhmZjAwLCBsID0gMHgxMDAKLX0KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnZlY3RvcnMgOiB7Ci0JLyogVXNlIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8gcGxhY2UgYSBzcGVjaWZpYyBmdW5jdGlvbidzIGFkZHJlc3MKLQkgICBpbnRvIHRoZSB2ZWN0b3IgdGFibGUuIAotCi0JU0hPUlQoQUJTT0xVVEUoX2Zvb2JhcikpICovCi0KLQkqKC52ZWN0b3JzKQotICAgICAgICB9ICR7UkVMT0NBVElORysgPiB2ZWN0b3JzfQotCi0udGV4dCA6CXsgCQkJCQkKLQkqKC5yb2RhdGEpIAkJCQkKLQkqKC50ZXh0KSAJCQkJCi0JKiguc3RyaW5ncykKLSAgIAkke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLnRvcnMgOiB7Ci0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLS5kYXRhIDogewotCSooLmRhdGEpCi0JKigudGlueSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmJzcyA6IHsKLQkke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAuIDt9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0gJHtSRUxPQ0FUSU5HKyA+cmFtfQotLnN0YWNrIDogewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9ICR7UkVMT0NBVElORysgPiB0b3ByYW19Ci0uZWlnaHQgOiB7Ci0JKiguZWlnaHQpCi0JfSAke1JFTE9DQVRJTkcrID4gZWlnaHR9Ci0uc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7Ci0JWyAuc3RhYiBdCi0JfQotLnN0YWJzdHIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogewotCVsgLnN0YWJzdHIgXQotCX0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDgzMDBoLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDgzMDBoLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWNmZDg2Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2g4MzAwaC5zYworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSChoODMwMGgpCi1FTlRSWSgiX3N0YXJ0IikKLQotLyogVGhlIG1lbW9yeSBzaXplIGlzIDI1NktCIHRvIGNvaW5jaWRlIHdpdGggdGhlIHNpbXVsYXRvci4KLSAgIERvbid0IGNoYW5nZSBlaXRoZXIgd2l0aG91dCBjb25zaWRlcmluZyB0aGUgb3RoZXIuICAqLwotCi1NRU1PUlkKLXsKLSAgICAgICAgLyogMHhjNCBpcyBhIG1hZ2ljIGVudHJ5LiAgV2Ugc2hvdWxkIGhhdmUgdGhlIGxpbmtlciBqdXN0Ci0gICAgICAgICAgIHNraXAgb3ZlciBpdCBvbmUgZGF5Li4uICovCi0gICAgICAgIHZlY3RvcnMgOiBvID0gMHgwMDAwLCBsID0gMHhjNAotICAgICAgICBtYWdpY3ZlY3RvcnMgOiBvID0gMHhjNCwgbCA9IDB4M2MKLQkvKiBXZSBzdGlsbCBvbmx5IHVzZSAyNTZrIGFzIHRoZSBtYWluIHJhbSBzaXplLiAgKi8KLQlyYW0gICAgOiBvID0gMHgwMTAwLCBsID0gMHgzZmVmYwotCS8qIFRoZSBzdGFjayBzdGFydHMgYXQgdGhlIHRvcCBvZiBtYWluIHJhbS4gICovCi0JdG9wcmFtIDogbyA9IDB4M2ZmZmMsIGwgPSAweDQKLQkvKiBUaGlzIGhvbGRzIHZhcmlhYmxlcyBpbiB0aGUgInRpbnkiIHNlY3Rpb25zLiAgKi8KLQl0aW55ICAgOiBvID0gMHhmZjgwMDAsIGwgPSAweDdmMDAKLQkvKiBBdCB0aGUgdmVyeSB0b3Agb2YgdGhlIGFkZHJlc3Mgc3BhY2UgaXMgdGhlIDgtYml0IGFyZWEuICAqLwotCWVpZ2h0ICA6IG8gPSAweGZmZmYwMCwgbCA9IDB4MTAwCi19Ci0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS52ZWN0b3JzIDogewotCS8qIFVzZSBzb21ldGhpbmcgbGlrZSB0aGlzIHRvIHBsYWNlIGEgc3BlY2lmaWMgZnVuY3Rpb24ncyBhZGRyZXNzCi0JICAgaW50byB0aGUgdmVjdG9yIHRhYmxlLgotCi0JTE9ORyhBQlNPTFVURShfZm9vYmFyKSkgKi8KLQotCSooLnZlY3RvcnMpCi0JfSAke1JFTE9DQVRJTkcrID4gdmVjdG9yc30KLS50ZXh0IDoJeyAJCQkJCQotCSooLnJvZGF0YSkgCQkJCQotCSooLnRleHQpIAkJCQkKLQkqKC5zdHJpbmdzKQotICAgCSR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0udG9ycyA6IHsKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmRhdGEgOiB7Ci0JKiguZGF0YSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmJzcyA6IHsKLQkke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAuIDt9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0gJHtSRUxPQ0FUSU5HKyA+cmFtfQotLnN0YWNrIDogewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9ICR7UkVMT0NBVElORysgPiB0b3ByYW19Ci0udGlueSA6IHsKLQkqKC50aW55KQotCX0gJHtSRUxPQ0FUSU5HKyA+IHRpbnl9Ci0uZWlnaHQgOiB7Ci0JKiguZWlnaHQpCi0JfSAke1JFTE9DQVRJTkcrID4gZWlnaHR9Ci0uc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7Ci0JWyAuc3RhYiBdCi0JfQotLnN0YWJzdHIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogewotCVsgLnN0YWJzdHIgXQotCX0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDgzMDBzLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDgzMDBzLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTQ3NGZjLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2g4MzAwcy5zYworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSChoODMwMHMpCi1FTlRSWSgiX3N0YXJ0IikKLQotLyogVGhlIG1lbW9yeSBzaXplIGlzIDI1NktCIHRvIGNvaW5jaWRlIHdpdGggdGhlIHNpbXVsYXRvci4KLSAgIERvbid0IGNoYW5nZSBlaXRoZXIgd2l0aG91dCBjb25zaWRlcmluZyB0aGUgb3RoZXIuICAqLwotCi1NRU1PUlkKLXsKLSAgICAgICAgLyogMHhjNCBpcyBhIG1hZ2ljIGVudHJ5LiAgV2Ugc2hvdWxkIGhhdmUgdGhlIGxpbmtlciBqdXN0Ci0gICAgICAgICAgIHNraXAgb3ZlciBpdCBvbmUgZGF5Li4uICovCi0gICAgICAgIHZlY3RvcnMgOiBvID0gMHgwMDAwLCBsID0gMHhjNAotICAgICAgICBtYWdpY3ZlY3RvcnMgOiBvID0gMHhjNCwgbCA9IDB4M2MKLQkvKiBXZSBzdGlsbCBvbmx5IHVzZSAyNTZrIGFzIHRoZSBtYWluIHJhbSBzaXplLiAgKi8KLQlyYW0gICAgOiBvID0gMHgwMTAwLCBsID0gMHgzZmVmYwotCS8qIFRoZSBzdGFjayBzdGFydHMgYXQgdGhlIHRvcCBvZiBtYWluIHJhbS4gICovCi0JdG9wcmFtIDogbyA9IDB4M2ZmZmMsIGwgPSAweDQKLQkvKiBUaGlzIGhvbGRzIHZhcmlhYmxlcyBpbiB0aGUgInRpbnkiIHNlY3Rpb25zLiAgKi8KLQl0aW55ICAgOiBvID0gMHhmZjgwMDAsIGwgPSAweDdmMDAKLQkvKiBBdCB0aGUgdmVyeSB0b3Agb2YgdGhlIGFkZHJlc3Mgc3BhY2UgaXMgdGhlIDgtYml0IGFyZWEuICAqLwotCWVpZ2h0ICA6IG8gPSAweGZmZmYwMCwgbCA9IDB4MTAwCi19Ci0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS52ZWN0b3JzIDogewotCS8qIFVzZSBzb21ldGhpbmcgbGlrZSB0aGlzIHRvIHBsYWNlIGEgc3BlY2lmaWMgZnVuY3Rpb24ncyBhZGRyZXNzCi0JICAgaW50byB0aGUgdmVjdG9yIHRhYmxlLgotCi0JTE9ORyhBQlNPTFVURShfZm9vYmFyKSkgKi8KLQotCSooLnZlY3RvcnMpCi0JfSAke1JFTE9DQVRJTkcrID4gdmVjdG9yc30KLS50ZXh0IDoJeyAJCQkJCQotCSooLnJvZGF0YSkgCQkJCQotCSooLnRleHQpIAkJCQkKLQkqKC5zdHJpbmdzKQotICAgCSR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0udG9ycyA6IHsKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmRhdGEgOiB7Ci0JKiguZGF0YSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmJzcyA6IHsKLQkke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAuIDt9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0gJHtSRUxPQ0FUSU5HKyA+cmFtfQotLnN0YWNrIDogewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9ICR7UkVMT0NBVElORysgPiB0b3ByYW19Ci0udGlueSA6IHsKLQkqKC50aW55KQotCX0gJHtSRUxPQ0FUSU5HKyA+IHRpbnl9Ci0uZWlnaHQgOiB7Ci0JKiguZWlnaHQpCi0JfSAke1JFTE9DQVRJTkcrID4gZWlnaHR9Ci0uc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7Ci0JWyAuc3RhYiBdCi0JfQotLnN0YWJzdHIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogewotCVsgLnN0YWJzdHIgXQotCX0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDg1MDAuc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODUwMC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhMzllZS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9oODUwMC5zYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0vKiBDb2RlIGFuZCBkYXRhIDY0ayB0b3RhbCAqLwotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udGV4dCAke1JFTE9DQVRJTkcrIDB4MDAwMCB9IDoKLQl7IAkJCQkJCi0JICAqKC50ZXh0KSAJCQkJCi0KLSAgIAkgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0KLQotCi0uZGF0YSAgJHtSRUxPQ0FUSU5HKyAuIH0gOgotCXsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9IAotCi0ucmRhdGEgICR7UkVMT0NBVElORysgLiB9IDoKLQl7Ci0JKigucmRhdGEpOyAKLQkgICooLnN0cmluZ3MpCi0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotfSAKLQotLmJzcyAgJHtSRUxPQ0FUSU5HKyAuIH0gOgotCXsKLQkke1JFTE9DQVRJTkcrIF9fc3RhcnRfYnNzID0gLiA7IH0KLQkqKC5ic3MpCi0JKihDT01NT04pCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0JfQotCi0uc3RhY2sgICR7UkVMT0NBVElORysgMHhmZmYwfSA6Ci0JewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9IAotCi0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9oODUwMGIuc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODUwMGIuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNWZhMmMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBiLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLS8qIENvZGUgYW5kIGRhdGEsIGJvdGggbGFyZ2VyIHRoYW4gNjRrICovCi0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS50ZXh0ICR7UkVMT0NBVElORysgMHgxMDAwMH0gOgotCXsgCQkJCQkKLQkgICooLnRleHQpIAkJCQkKLQotICAgCSAke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0JfQotCi0KLS5kYXRhICAke1JFTE9DQVRJTkcrIDB4MjAwMDB9IDoKLQl7Ci0JKiguZGF0YSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAKLQotLnJkYXRhICAke1JFTE9DQVRJTkcrIDB4MzAwMDB9IDoKLQl7Ci0JKigucmRhdGEpOyAKLQkgICooLnN0cmluZ3MpCi0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotfSAKLQotLmJzcyAgJHtSRUxPQ0FUSU5HKyAweDQwMDAwfSA6Ci0JewotCSR7UkVMT0NBVElORysgX19zdGFydF9ic3MgPSAuIDsgfQotCSooLmJzcykKLQkqKENPTU1PTikKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLQl9Ci0KLS5zdGFjayAgJHtSRUxPQ0FUSU5HKyAweDUwMDAwfSA6Ci0JewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9IAotCi0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9oODUwMGMuc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODUwMGMuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzODgwZTMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBjLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLS8qIENvbXBhY3QgbW9kZWwgLSBjb2RlIDwgNjRrLCBkYXRhID4gNjRrICovCi0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS50ZXh0IDB4MTAwMDAgOgotCXsgCQkJCQkKLQkgICooLnRleHQpIAkJCQkKLQkgICooLnN0cmluZ3MpCi0gICAJICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0KLQotLmRhdGEgMHgyMDAwMCA6Ci0JewotCSooLmRhdGEpCi0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLQotLnJkYXRhIDB4MzAwMDAgIDogewotCSooLnJkYXRhKTsgCi0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotfSAgJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLQotLmJzcyAgMHg0MDAwMCA6Ci0JewotCSR7UkVMT0NBVElORysgX19zdGFydF9ic3MgPSAuIDsgfQotCSooLmJzcykKLQkqKENPTU1PTikKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLQl9ICR7UkVMT0NBVElORysgPnJhbX0KLS5zdGFjayAweDVmZmYwIDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gJHtSRUxPQ0FUSU5HKyA+IHRvcHJhbX0KLQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBtLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDg1MDBtLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDBhNGE3Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwbS5zYworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0vKiBDb2RlIGFuZCBkYXRhLCBib3RoIGxhcmdlciB0aGFuIDY0ayAqLwotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udGV4dCAke1JFTE9DQVRJTkcrIDB4MTAwMDB9IDoKLQl7IAkJCQkJCi0JICAqKC50ZXh0KSAJCQkJCi0gICAJICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9Ci0KLQotLmRhdGEgICR7UkVMT0NBVElORysgMHgyMDAwMH0gOgotCXsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9IAotCi0ucmRhdGEgICR7UkVMT0NBVElORysgLiB9IDoKLQl7Ci0JKigucmRhdGEpOyAKLQkgICooLnN0cmluZ3MpCi0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotCX0gCi0KLS5ic3MgICR7UkVMT0NBVElORysgLiB9IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfX3N0YXJ0X2JzcyA9IC4gOyB9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0KLQotLnN0YWNrICAke1JFTE9DQVRJTkcrIDB4MmZmZjB9IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gCi0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwcy5zYyBiL2xkL3NjcmlwdHRlbXBsL2g4NTAwcy5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2MTVkOC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9oODUwMHMuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotLyogQ29kZSBhbmQgZGF0YSwgYm90aCA2NGsgKi8KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnRleHQgJHtSRUxPQ0FUSU5HKyAweDEwMDAwIH0gOgotCXsgCQkJCQkKLQkqKC50ZXh0KSAJCQkJCi0gICAJJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0KLQotLnJkYXRhICAke1JFTE9DQVRJTkcrIDB4MjAwMDAgfSA6Ci0JewotCSooLnJkYXRhKTsgCi0JKiguc3RyaW5ncykKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci0JfQotCi0uZGF0YSAgJHtSRUxPQ0FUSU5HKyAuIH0gOgotCXsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9IAotCi0uYnNzICAke1JFTE9DQVRJTkcrIC59IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfX3N0YXJ0X2JzcyA9IC4gOyB9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0KLQotLnN0YWNrICAke1JFTE9DQVRJTkcrIDB4MmZmZjB9IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gCi0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2hwcGFlbGYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9ocHBhZWxmLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDFjZTA4Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2hwcGFlbGYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1EQVRBX0FERFI9MHg0MDAwMDAwMAotdGVzdCAiJExEX0ZMQUciID0gIk4iICYmIERBVEFfQUREUj0uCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLUVOVFJZKCJcJFNUQVJUXCQiKQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0IDB4MTAwMCAke1JFTE9DQVRJTkcrKyR7VEVYVF9TVEFSVF9BRERSfX06Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrX190ZXh0X3N0YXJ0ID0gLn07Ci0gICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0gICAgKiguUEFSSVNDLnN0dWJzKQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HK2V0ZXh0ID0gLn07Ci0gICAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC59OwotICB9Ci0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFJ9O30KLSAgLmRhdGEgOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyAuID0gLiArIDB4MTAwMCB9OwotICAgICR7UkVMT0NBVElORytfX2RhdGFfc3RhcnQgPSAufTsKLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICAke1JFTE9DQVRJTkcrZWRhdGEgPSAufTsKLSAgICAke1JFTE9DQVRJTkcrX2VkYXRhID0gLn07Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUn0gKyBTSVpFT0YoLmRhdGEpO30KLSAgLmJzcyA6Ci0gIHsKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgJHtSRUxPQ0FUSU5HK2VuZCA9IC4gfTsKLSAgICR7UkVMT0NBVElORytfZW5kID0gLiB9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2kzODZiZW9zLnNjIGIvbGQvc2NyaXB0dGVtcGwvaTM4NmJlb3Muc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZmZkZTEuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaTM4NmJlb3Muc2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBQRS4KLQotaWYgdGVzdCAteiAiJHtSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVH0iOyB0aGVuCi0gIFJFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLWZpCi0KLSMgV2UgY2FuJ3QgZWFzaWx5IGFuZCBwb3J0YWJseSBnZXQgYW4gdW5xdW90ZWQgJCBpbiBhIHNoZWxsCi0jIHN1YnN0aXR1dGlvbiwgc28gd2UgZG8gdGhpcyBpbnN0ZWFkLgotaWYgdGVzdCAiJHtSRUxPQ0FUSU5HfSI7IHRoZW4KLSAgUl9URVhUPScqKC50ZXh0JCopJwotICBSX0RBVEE9JyooLmRhdGEkKiknCi0gIFJfUkRBVEE9JyooLnJkYXRhJCopJwotICBSX0lEQVRBPScKLSAgICAqKC5pZGF0YSQyKQotICAgICooLmlkYXRhJDMpCi0gICAgLyogVGhlc2UgemVyb2VzIG1hcmsgdGhlIGVuZCBvZiB0aGUgaW1wb3J0IGxpc3QuICAqLwotICAgIExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsKLSAgICAqKC5pZGF0YSQ0KQotICAgICooLmlkYXRhJDUpCi0gICAgKiguaWRhdGEkNikKLSAgICAqKC5pZGF0YSQ3KScKLSAgUl9DUlQ9JyooLkNSVCQqKScKLSAgUl9SU1JDPScqKC5yc3JjJCopJwotICBSX0VYQz0nKiguZXhjJCopJwotZWxzZQotICBSX1RFWFQ9Ci0gIFJfREFUQT0KLSAgUl9SREFUQT0KLSAgUl9JREFUQT0KLSAgUl9DUlQ9Ci0gIFJfUlNSQz0KLSAgUl9FWEM9Ci1maQotCi1jYXQgPDxFT0YKLSR7UkVMT0NBVElORytPVVRQVVRfRk9STUFUKCR7T1VUUFVUX0ZPUk1BVH0pfQotJHtSRUxPQ0FUSU5HLU9VVFBVVF9GT1JNQVQoJHtSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVH0pfQotCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoX19zdGFydCkKLSR7UkVMT0NBVElORytoZWFkZXIgPSAuO30KLSR7UkVMT0NBVElORytfX2ZsdHVzZWQgPSAuOyAvKiBzZXQgdXAgZmxvYXRpbmcgcHQgZm9yIE1TIC5vYmpcJ3MgKi99Ci0ke1JFTE9DQVRJTkcrX19sZHVzZWQgPSAuO30KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgX19pbWFnZV9iYXNlX18gKyBfX3NlY3Rpb25fYWxpZ25tZW50X18gfSA6IAotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfX3RleHRfc3RhcnRfXyA9IC4gO30KLSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQotICAgICooLnRleHQpCi0gICAgJHtSX1RFWFR9Ci0gICAgKiguZ2x1ZV83dCkKLSAgICAqKC5nbHVlXzcpCi0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjsgX19DVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguY3RvcnMpOyAqKC5jdG9yKTsgTE9ORyAoMCk7IH0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuOyBfX0RUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5kdG9ycyk7ICooLmR0b3IpOyAgTE9ORyAoMCk7IH0KLSAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpfQotICAgIC8qID8/PyBXaHkgaXMgLmdjY19leGMgaGVyZT8gICovCi0gICAgJHtSRUxPQ0FUSU5HKyAqKC5nY2NfZXhjKX0KLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfX3RleHRfZW5kX18gPSAuO30KLSAgICAqKC5nY2NfZXhjZXB0X3RhYmxlKQotICB9Ci0KLSAgLyogVGhlIEN5Z3dpbjMyIGxpYnJhcnkgdXNlcyBhIHNlY3Rpb24gdG8gYXZvaWQgY29weWluZyBjZXJ0YWluIGRhdGEKLSAgICAgb24gZm9yay4gIFRoaXMgdXNlZCB0byBiZSBuYW1lZCAiLmRhdGEkbm9jb3B5Ii4gIFRoZSBsaW5rZXIgdXNlZAotICAgICB0byBpbmNsdWRlIHRoaXMgYmV0d2VlbiBfX2RhdGFfc3RhcnRfXyBhbmQgX19kYXRhX2VuZF9fLCBidXQgdGhhdAotICAgICBicmVha3MgYnVpbGRpbmcgdGhlIGN5Z3dpbjMyIGRsbC4gIEluc3RlYWQsIHdlIG5hbWUgdGhlIHNlY3Rpb24KLSAgICAgIi5kYXRhX2N5Z3dpbl9ub2NvcHkiIGFuZCBleHBsaWN0bHkgaW5jbHVkZSBpdCBhZnRlciBfX2RhdGFfZW5kX18uICovCi0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMikKLSAgICAke1JfREFUQX0KLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX2VuZF9fID0gLiA7fQotICAgICR7UkVMT0NBVElORysqKC5kYXRhX2N5Z3dpbl9ub2NvcHkpfQotICB9Ci0KLSAgLmJzcyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgIC8qIGxpbmsuZXhlIGFwcGFyZW50bHkgcHVsbHMgaW4gLm9iaidzIGJlY2F1c2Ugb2YgVU5ERUYgY29tbW9uCi0Jc3ltYm9scywgd2hpY2ggaXMgbm90IHRoZSBjb2ZmIHdheSwgYnV0IHRoYXQncyBNUyBmb3IgeW91LiAqLwotICAgICooLkNSVFwkWENBKQotICAgICooLkNSVFwkWENaKQotICAgICooLkNSVFwkWElBKQotICAgICooLkNSVFwkWElaKQotICAgICR7UkVMT0NBVElORytfX2Jzc19lbmRfXyA9IC4gO30KLSAgfQotCi0gIC5yZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgKigucmRhdGEpCi0gICAgJHtSX1JEQVRBfQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0KLSAgLmVkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAqKC5lZGF0YSkKLSAgfQotCi0gIC9ESVNDQVJELyA6Ci0gIHsKLSAgICAqKC5kZWJ1Z1wkUykKLSAgICAqKC5kZWJ1Z1wkVCkKLSAgICAqKC5kZWJ1Z1wkRikKLSAgICAqKC5kcmVjdHZlKQotICAgICooLmRlYnVnKikKLSAgfQotCi0gIC5pZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgLyogVGhpcyBjYW5ub3QgY3VycmVudGx5IGJlIGhhbmRsZWQgd2l0aCBncm91cGVkIHNlY3Rpb25zLgotCVNlZSBwZS5lbTpzb3J0X3NlY3Rpb25zLiAgKi8KLSAgICAke1JfSURBVEF9Ci0gIH0KLSAgLkNSVCAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgJHtSX0NSVH0KLSAgfQotCi0gIC5lbmRqdW5rICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAvKiBlbmQgaXMgZGVwcmVjYXRlZCwgZG9uJ3QgdXNlIGl0ICovCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9fZW5kX18gPSAuO30KLSAgfQotCi0gIC5yZWxvYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKigucmVsb2MpCi0gIH0KLQotICAucnNyYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKigucnNyYykKLSAgICAke1JfUlNSQ30KLSAgfQotCi0gIC5leGMgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICooLmV4YykKLSAgICAke1JfRVhDfQotICB9Ci0KLSAgLnN0YWIgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9ICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLQotICAuc3RhYnN0ciAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KLSAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCi0KLSAgLyogRFdBUkYgMSAqLwotICAuZGVidWcgICAgICAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1ZykgfQotICAubGluZSAgICAgICAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5saW5lKSB9Ci0KLSAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfc3JjaW5mbyAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9Ci0gIC5kZWJ1Z19zZm5hbWVzICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLQotICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KLSAgLmRlYnVnX2FyYW5nZXMgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfYXJhbmdlcykgfQotICAuZGVidWdfcHVibmFtZXMgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQotCi0gIC8qIERXQVJGIDIgKi8KLSAgLmRlYnVnX2luZm8gICAgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfaW5mbykgfQotICAuZGVidWdfYWJicmV2ICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KLSAgLmRlYnVnX2xpbmUgICAgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfbGluZSkgfQotICAuZGVidWdfZnJhbWUgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19zdHIpIH0KLSAgLmRlYnVnX2xvYyAgICAgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfbG9jKSB9Ci0gIC5kZWJ1Z19tYWNpbmZvICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLQotICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3dlYWtuYW1lcyAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQotICAuZGVidWdfZnVuY25hbWVzIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9Ci0gIC5kZWJ1Z190eXBlbmFtZXMgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KLSAgLmRlYnVnX3Zhcm5hbWVzICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2kzODZjb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYjFiNzkuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIDM4NiBDT0ZGLiAgVGhpcyB3b3JrcyBvbiBTVlIzLjIgYW5kIFNDTyBVbml4IDMuMi4yLgotIyBJYW4gVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotIyBUaGVzZSBhcmUgc3Vic3RpdHV0ZWQgaW4gYXMgdmFyaWFibGVzIGluIG9yZGVyIHRvIGdldCAnfScgaW4gYSBzaGVsbAotIyBjb25kaXRpb25hbCBleHBhbnNpb24uCi1JTklUPScuaW5pdCA6IHsgKiguaW5pdCkgfScKLUZJTkk9Jy5maW5pIDogeyAqKC5maW5pKSB9JwotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBTSVpFT0ZfSEVBREVSU30gOiB7Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5pbml0KX0KLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgKiguZmluaSl9Ci0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLn07Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAweDQwMDAwMCArICguICYgMHhmZmMwMGZmZil9IDogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLn07Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICB7IAkJCQkJCi0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgZW5kID0gLn07Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HLSAke0lOSVR9fQotICAke1JFTE9DQVRJTkctICR7RklOSX19Ci0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2MgYi9sZC9zY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkM2QwOS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgaTM4NiBnbzMyIChESkdQUCkKLQotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1zdGFydAotRVhFPSR7Q09OU1RSVUNUSU5HKyR7UkVMT0NBVElORystZXhlfX0KLQotIyBUaGVzZSBhcmUgc3Vic3RpdHV0ZWQgaW4gYXMgdmFyaWFibGVzIGluIG9yZGVyIHRvIGdldCAnfScgaW4gYSBzaGVsbAotIyBjb25kaXRpb25hbCBleHBhbnNpb24uCi1DVE9SPScuY3RvciA6IHsgKiguY3RvcikgfScKLURUT1I9Jy5kdG9yIDogeyAqKC5kdG9yKSB9JwotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0ke0VYRX0iKQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyAke1RBUkdFVF9QQUdFX1NJWkV9K1NJWkVPRl9IRUFERVJTfSA6IHsKLSAgICAqKC50ZXh0KQotICAgICooLmNvbnN0KikKLSAgICAqKC5ybyopCi0gICAgJHtSRUxPQ0FUSU5HK2V0ZXh0ICA9ICAuIDsgX2V0ZXh0ID0gLn07Ci0gICAgJHtSRUxPQ0FUSU5HKy4gPSBBTElHTigke1NFR01FTlRfU0laRX0pO30KLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkcrICR7REFUQV9BTElHTk1FTlR9fSA6IHsKLSAgICAke1JFTE9DQVRJTkcrZGpncHBfZmlyc3RfY3RvciA9IC4gOwotICAgICooLmN0b3IpCi0gICAgZGpncHBfbGFzdF9jdG9yID0gLiA7fQotICAgICR7UkVMT0NBVElORytkamdwcF9maXJzdF9kdG9yID0gLiA7Ci0gICAgKiguZHRvcikKLSAgICBkamdwcF9sYXN0X2R0b3IgPSAuIDt9Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAuIDsgX2VkYXRhID0gLn07Ci0gICAgJHtSRUxPQ0FUSU5HKyAuID0gQUxJR04oJHtTRUdNRU5UX1NJWkV9KTt9Ci0gIH0KLSAgJHtDT05TVFJVQ1RJTkcrJHtSRUxPQ0FUSU5HLSRDVE9SfX0KLSAgJHtDT05TVFJVQ1RJTkcrJHtSRUxPQ0FUSU5HLSREVE9SfX0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICB7IAkJCQkJCi0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgZW5kID0gLiA7IF9lbmQgPSAufTsKLSAgICAke1JFTE9DQVRJTkcrIC4gPSBBTElHTigke1NFR01FTlRfU0laRX0pO30KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9pMzg2bHlueC5zYyBiL2xkL3NjcmlwdHRlbXBsL2kzODZseW54LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmI3MmE0Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2kzODZseW54LnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgU0laRU9GX0hFQURFUlN9IDogewotICAgICooLmluaXQpCi0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfRU5EX18gPSAuO30KLSAgICAqKC5maW5pKQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC59OwotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORysgMHg0MDAwMDAgKyAoLiAmIDB4ZmZjMDBmZmYpfSA6IHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC59OwotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgeyAJCQkJCQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC59OwotICB9Ci0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaTM4Nm1zZG9zLnNjIGIvbGQvc2NyaXB0dGVtcGwvaTM4Nm1zZG9zLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDMxMmU3Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2kzODZtc2Rvcy5zYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotJHtTVEFDS1pFUk8rJHtSRUxPQ0FUSU5HKyR7U1RBQ0taRVJPfX19Ci1TRUNUSU9OUwotewotICAke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9TVEFSVF9BRERSfTt9Ci0gIC50ZXh0IDoKLSAgewotICAgIENSRUFURV9PQkpFQ1RfU1lNQk9MUwotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HK2V0ZXh0ID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC47fQotICAgICR7UkVMT0NBVElORytfX2V0ZXh0ID0gLjt9Ci0gIH0KLSAgLmRhdGEgOgotICB7Ci0gICAgKigucm9kYXRhKQotICAgICooLmRhdGEpCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICAgICR7UkVMT0NBVElORytlZGF0YSAgPSAgLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZWRhdGEgID0gIC47fQotICB9Ci0gIC5ic3MgOgotICB7Ci0gICAke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAufTsKLSAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnQgPSAufTsKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgJHtSRUxPQ0FUSU5HK2VuZCA9IEFMSUdOKDQpIH07Ci0gICAke1JFTE9DQVRJTkcrX2VuZCA9IEFMSUdOKDQpIH07Ci0gICAke1JFTE9DQVRJTkcrX19lbmQgPSBBTElHTig0KSB9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2k5NjAuc2MgYi9sZC9zY3JpcHR0ZW1wbC9pOTYwLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzMzNTU1Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2k5NjAuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1jYXQgPDxFT0YKLVNFQ1RJT05TCi17IAotICAgIC50ZXh0IDogCi0gICAgeyAKLQkke0dMRF9TVFlMRSsgQ1JFQVRFX09CSkVDVF9TWU1CT0xTfQotCSooLnRleHQpIAotCSR7UkVMT0NBVElORysgX2V0ZXh0ID0gLn07Ci0JJHtDT05TVFJVQ1RJTkcrJHtDT0ZGX0NUT1JTfX0KLSAgICB9ICAKLSAgICAuZGF0YSA6Ci0gICAgeyAKLSAJKiguZGF0YSkgCi0JJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLn07Ci0gICAgfSAgCi0gICAgLmJzcyA6Ci0gICAgeyAKLQkke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAufTsKLQkqKC5ic3MpCSAKLQkqKENPTU1PTikgCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLn07Ci0gICAgfSAKLX0gCi1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL202OGthdXguc2MgYi9sZC9zY3JpcHR0ZW1wbC9tNjhrYXV4LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQyODBlLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL202OGthdXguc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIEEvVVguCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotSU5JVD0nLmluaXQgOiB7ICooLmluaXQpIH0nCi1GSU5JPScuZmluaSA6IHsgKiguZmluaSkgfScKLUNUT1JTPScuY3RvcnMgOiB7ICooLmN0b3JzKSB9JwotRFRPUlM9Jy5kdG9ycyA6IHsgKiguZHRvcnMpIH0nCi0KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgJFRFWFRfU1RBUlRfQUREUn0gOiB7Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5pbml0KX0KLSAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpfQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyAuID0gQUxJR04oNCk7fQotICAgICR7UkVMT0NBVElORysgKiguY3RvcnMpfQotICAgICR7UkVMT0NBVElORysgKiguZHRvcnMpfQotICAgICR7UkVMT0NBVElORysgZXRleHQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC47fQotICB9ID0weDRFNzE0RTcxCi0gIC5kYXRhICR7UkVMT0NBVElORysgJERBVEFfQUxJR05NRU5UfSA6IHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgZWRhdGEgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC47fQotICB9Ci0gIC5ic3MgOiB7Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgZW5kID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLjt9Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HLSAke0lOSVR9fQotICAke1JFTE9DQVRJTkctICR7RklOSX19Ci0gICR7UkVMT0NBVElORy0gJHtDVE9SU319Ci0gICR7UkVMT0NBVElORy0gJHtEVE9SU319Ci0KLSAgLmNvbW1lbnQgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyBbIC5jb21tZW50IF0gWyAuaWRlbnQgXSB9Ci0gIC5zdGFiIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgWyAuc3RhYiBdIH0KLSAgLnN0YWJzdHIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyBbIC5zdGFic3RyIF0gfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9tNjhrY29mZi5zYyBiL2xkL3NjcmlwdHRlbXBsL202OGtjb2ZmLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjY4YzZmLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL202OGtjb2ZmLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotUFJPVklERSAoX19zdGFjayA9IDApOyAKLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgMHgxMDAwMDAwfSA6IHsKLSAgICAqKC50ZXh0KQotICAgICR7Q09OU1RSVUNUSU5HKyAuID0gQUxJR04oNCk7fQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fQ1RPUl9FTkRfXyAtIF9fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fRFRPUl9FTkRfXyAtIF9fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9FTkRfXyA9IC47fQotICB9Ci0gIC5kYXRhIDogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLn07Ci0gIH0KLSAgLmJzcyA6IHsgCQkJCQkKLSAgICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0ID0gLn07Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICAke1JFTE9DQVRJTkcrIGVuZCA9IEFMSUdOKDB4OCl9OwotICAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSBBTElHTigweDgpfTsKLSAgfQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL202OGtseW54LnNjIGIvbGQvc2NyaXB0dGVtcGwvbTY4a2x5bnguc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZDIyNDUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbTY4a2x5bnguc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBTSVpFT0ZfSEVBREVSU30gOiB7Ci0gICAgKiguaW5pdCkKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19DVE9SX0VORF9fIC0gX19fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fRFRPUl9FTkRfXyAtIF9fX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0VORF9fID0gLjt9Ci0gICAgKiguZmluaSkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAufTsKLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkcrIDB4NDAwMDAwICsgKC4gJiAweGZmYzAwZmZmKX0gOiB7Ci0gICAgKiguZGF0YSAuZGF0YTIpCi0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLn07Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICB7IAkJCQkJCi0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgZW5kID0gLn07Ci0gIH0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9tODhrYmNzLnNjIGIvbGQvc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUyYjE0ZC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9tODhrYmNzLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIyBUaGVzZSBhcmUgc3Vic3RpdHV0ZWQgaW4gYXMgdmFyaWFibGVzIGluIG9yZGVyIHRvIGdldCAnfScgaW4gYSBzaGVsbAotIyBjb25kaXRpb25hbCBleHBhbnNpb24uCi1JTklUPScuaW5pdCA6IHsgKiguaW5pdCkgfScKLUZJTkk9Jy5maW5pIDogeyAqKC5maW5pKSB9JwotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi1FTlRSWShfX3N0YXJ0KQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotICAudGV4dCAke1JFTE9DQVRJTkcrICgweDIwMDA3ICsgU0laRU9GX0hFQURFUlMpICZ+IDd9IDoKLSAgICB7Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLnRleHQuc3RhcnQgPSAufTsKLSAgICAgICR7UkVMT0NBVElORysgX18uaW5pdC5zdGFydCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyAqKC5pbml0KX0KLSAgICAgICR7UkVMT0NBVElORysgX18uaW5pdC5lbmQgPSAufTsKLSAgICAgICooLnRleHQpIAkJCQkKLSAgICAgICR7UkVMT0NBVElORysgX18udGRlc2Nfc3RhcnQgPSAufTsKLSAgICAgICR7UkVMT0NBVElORysgKigudGRlc2MpfQotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy50ZXh0X2VuZCA9IC59CTsKLSAgICAgICR7UkVMT0NBVElORysgX18uaW5pdHAuc3RhcnQgPSAufTsKLSAgICAgICR7UkVMT0NBVElORysgX18uaW5pdHAuZW5kID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLmZpbmlfc3RhcnQgPSAufTsKLSAgICAgICR7UkVMT0NBVElORysgKiguZmluaSkgfQotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5maW5pX2VuZCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC59OwotICAgIH0gIAkJCQkJCi0gIC5kYXRhICR7UkVMT0NBVElORysgTkVYVCAoMHg0MDAwMDApICsgKChTSVpFT0YoLnRleHQpICsgQUREUigudGV4dCkpICUgMHgyMDAwKX0gOgotICAgIHsgCQkJCQkKLSAgICAgICooLmRhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrX2VkYXRhICA9ICAufTsKLSAgICB9ICAJCQkJCQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gICAgeyAJCQotICAgICAgKiguYnNzKQkKLSAgICAgICooQ09NTU9OKSAJCi0gICAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAufTsKLSAgICAgICR7UkVMT0NBVElORysgX19lbmQgPSAufTsKLSAgICB9Ci0gICR7UkVMT0NBVElORy0gJHtJTklUfX0KLSAgJHtSRUxPQ0FUSU5HLSAke0ZJTkl9fQotICAuY29tbWVudCAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICAqKC5jb21tZW50KQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL21jb3JlcGUuc2MgYi9sZC9zY3JpcHR0ZW1wbC9tY29yZXBlLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTcxMzM4Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL21jb3JlcGUuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBNQ29yZSBQRS4KLQotaWYgdGVzdCAteiAiJHtSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVH0iOyB0aGVuCi0gIFJFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLWZpCi0KLSMgV2UgY2FuJ3QgZWFzaWx5IGFuZCBwb3J0YWJseSBnZXQgYW4gdW5xdW90ZWQgJCBpbiBhIHNoZWxsCi0jIHN1YnN0aXR1dGlvbiwgc28gd2UgZG8gdGhpcyBpbnN0ZWFkLgotIyBTb3J0aW5nIG9mIHRoZSAuZm9vJCogc2VjdGlvbnMgaXMgcmVxdWlyZWQgYnkgdGhlIGRlZmluaXRpb24gb2YKLSMgZ3JvdXBlZCBzZWN0aW9ucyBpbiBQRS4KLSMgU29ydGluZyBvZiB0aGUgZmlsZSBuYW1lcyBpbiBSX0lEQVRBIGlzIHJlcXVpcmVkIGJ5IHRoZQotIyBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIGRsbHRvb2wgKHRoaXMgY291bGQgcHJvYmFibHkgYmUgY2hhbmdlZCB0bwotIyB1c2UgZ3JvdXBlZCBzZWN0aW9ucyBpbnN0ZWFkKS4KLWlmIHRlc3QgIiR7UkVMT0NBVElOR30iOyB0aGVuCi0gIFJfVEVYVD0nKihTT1JUKC50ZXh0JCopKScKLSAgUl9EQVRBPScqKFNPUlQoLmRhdGEkKikpJwotICBSX1JEQVRBPScqKFNPUlQoLnJkYXRhJCopKScKLSAgUl9JREFUQT0nCi0gICAgU09SVCgqKSguaWRhdGEkMikKLSAgICBTT1JUKCopKC5pZGF0YSQzKQotICAgIC8qIFRoZXNlIHplcm9lcyBtYXJrIHRoZSBlbmQgb2YgdGhlIGltcG9ydCBsaXN0LiAgKi8KLSAgICBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7Ci0gICAgU09SVCgqKSguaWRhdGEkNCkKLSAgICBTT1JUKCopKC5pZGF0YSQ1KQotICAgIFNPUlQoKikoLmlkYXRhJDYpCi0gICAgU09SVCgqKSguaWRhdGEkNyknCi0gIFJfQ1JUPScqKFNPUlQoLkNSVCQqKSknCi0gIFJfUlNSQz0nKihTT1JUKC5yc3JjJCopKScKLWVsc2UKLSAgUl9URVhUPQotICBSX0RBVEE9Ci0gIFJfUkRBVEE9Ci0gIFJfSURBVEE9Ci0gIFJfQ1JUPQotICBSX1JTUkM9Ci1maQotCi1jYXQgPDxFT0YKLSR7UkVMT0NBVElORytPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgIAkgICAgICAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpfQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKF9tYWluQ1JUU3RhcnR1cCkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBfX2ltYWdlX2Jhc2VfXyArIF9fc2VjdGlvbl9hbGlnbm1lbnRfXyB9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQotICAgICooLnRleHQpCi0gICAgJHtSX1RFWFR9Ci0gICAgKiguZ2x1ZV83dCkKLSAgICAqKC5nbHVlXzcpCi0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjsgX19DVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguY3RvcnMpOyAqKC5jdG9yKTsgTE9ORyAoMCk7IH0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuOyBfX0RUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5kdG9ycyk7ICooLmR0b3IpOyAgTE9ORyAoMCk7IH0KLSAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpfQotICAgIC8qID8/PyBXaHkgaXMgLmdjY19leGMgaGVyZT8gICovCi0gICAgJHtSRUxPQ0FUSU5HKyAqKC5nY2NfZXhjKX0KLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ID0gLjt9Ci0gICAgKiguZ2NjX2V4Y2VwdF90YWJsZSkKLSAgfQotCi0gIC8qIFRoZSBDeWd3aW4zMiBsaWJyYXJ5IHVzZXMgYSBzZWN0aW9uIHRvIGF2b2lkIGNvcHlpbmcgY2VydGFpbiBkYXRhCi0gICAgIG9uIGZvcmsuICBUaGlzIHVzZWQgdG8gYmUgbmFtZWQgIi5kYXRhJG5vY29weSIuICBUaGUgbGlua2VyIHVzZWQKLSAgICAgdG8gaW5jbHVkZSB0aGlzIGJldHdlZW4gX19kYXRhX3N0YXJ0X18gYW5kIF9fZGF0YV9lbmRfXywgYnV0IHRoYXQKLSAgICAgYnJlYWtzIGJ1aWxkaW5nIHRoZSBjeWd3aW4zMiBkbGwuICBJbnN0ZWFkLCB3ZSBuYW1lIHRoZSBzZWN0aW9uCi0gICAgICIuZGF0YV9jeWd3aW5fbm9jb3B5IiBhbmQgZXhwbGljdGx5IGluY2x1ZGUgaXQgYWZ0ZXIgX19kYXRhX2VuZF9fLiAqLwotCi0gIC5kYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6IAotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9zdGFydF9fID0gLiA7fQotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTIpCi0gICAgJHtSX0RBVEF9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9lbmRfXyA9IC4gO30KLSAgICAke1JFTE9DQVRJTkcrKiguZGF0YV9jeWd3aW5fbm9jb3B5KX0KLSAgfQotCi0gIC5ic3MgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICR7UkVMT0NBVElORytfX2Jzc19zdGFydF9fID0gLiA7fQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrX19ic3NfZW5kX18gPSAuIDt9Ci0gIH0KLQotICAucmRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICooLnJkYXRhKQotICAgICR7Ul9SREFUQX0KLSAgICAqKC5laF9mcmFtZSkKLSAgfQotCi0gIC5lZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgKiguZWRhdGEpCi0gIH0KLQotICAvRElTQ0FSRC8gOgotICB7Ci0gICAgKiguZGVidWdcJFMpCi0gICAgKiguZGVidWdcJFQpCi0gICAgKiguZGVidWdcJEYpCi0gICAgKiguZHJlY3R2ZSkKLSAgfQotCi0gIC5pZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgLyogVGhpcyBjYW5ub3QgY3VycmVudGx5IGJlIGhhbmRsZWQgd2l0aCBncm91cGVkIHNlY3Rpb25zLgotCVNlZSBwZS5lbTpzb3J0X3NlY3Rpb25zLiAgKi8KLSAgICAke1JfSURBVEF9Ci0gIH0KLSAgLkNSVCAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgJHtSX0NSVH0KLSAgfQotCi0gIC5lbmRqdW5rICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAvKiBlbmQgaXMgZGVwcmVjYXRlZCwgZG9uJ3QgdXNlIGl0ICovCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9fZW5kX18gPSAuO30KLSAgfQotCi0gIC5yZWxvYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKigucmVsb2MpCi0gIH0KLQotICAucnNyYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKigucnNyYykKLSAgICAke1JfUlNSQ30KLSAgfQotCi0gIC5zdGFiICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0KLSAgLnN0YWJzdHIgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9ICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLQotICAuc3RhY2sgMHg4MDAwMCA6Ci0gIHsKLSAgICBfc3RhY2sgPSAuOwotICAgICooLnN0YWNrKQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL21pcHMuc2MgYi9sZC9zY3JpcHR0ZW1wbC9taXBzLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjBhZWVkLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL21pcHMuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIE1JUFMgc3lzdGVtcy4KLSMgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotIyBUaGVzZSB2YXJpYWJsZXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIGVtdWxhdGlvbiBmaWxlLiAgVGhlCi0jIGRlZmF1bHRzIGFyZSBhcHByb3ByaWF0ZSBmb3IgYSBERUNzdGF0aW9uIHJ1bm5pbmcgVWx0cml4LgotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fX3N0YXJ0Ci0KLWlmIFsgLXogIiRFTUJFRERFRCIgXTsgdGhlbgotICB0ZXN0IC16ICIkVEVYVF9TVEFSVF9BRERSIiAmJiBURVhUX1NUQVJUX0FERFI9IjB4NDAwMDAwICsgU0laRU9GX0hFQURFUlMiCi1lbHNlCi0gIHRlc3QgLXogIiRURVhUX1NUQVJUX0FERFIiICYmIFRFWFRfU1RBUlRfQUREUj0iMHg0MDAwMDAiCi1maQotaWYgdGVzdCAieCRMRF9GTEFHIiA9ICJ4biIgLW8gIngkTERfRkxBRyIgPSAieE4iOyB0aGVuCi0gIERBVEFfQUREUj0uCi1lbHNlCi0gIHRlc3QgLXogIiREQVRBX0FERFIiICYmIERBVEFfQUREUj0weDEwMDAwMDAwCi1maQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9TVEFSVF9BRERSfTt9Ci0gIC50ZXh0IDogewotICAgICR7UkVMT0NBVElORysgX2Z0ZXh0ID0gLiB9OwotICAgICooLmluaXQpCi0gICAgJHtSRUxPQ0FUSU5HKyBlcHJvbCAgPSAgLn07Ci0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0YXJ0ID0gLik7fQotICAgICooLnJlbC5zZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0b3AgPSAuKTt9Ci0gICAgKiguZmluaSkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAufTsKLSAgICAke1JFTE9DQVRJTkcrIF9ldGV4dCAgPSAgLn07Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUn07fQotICAucmRhdGEgOiB7Ci0gICAgKigucmRhdGEpCi0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBfZmRhdGEgPSBBTElHTigxNik7fQotICAuZGF0YSA6IHsKLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgfQotICAke1JFTE9DQVRJTkcrIF9ncCA9IEFMSUdOKDE2KSArIDB4ODAwMDt9Ci0gIC5saXQ4IDogewotICAgICooLmxpdDgpCi0gIH0KLSAgLmxpdDQgOiB7Ci0gICAgKigubGl0NCkKLSAgfQotICAuc2RhdGEgOiB7Ci0gICAgKiguc2RhdGEpCi0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLjt9Ci0gICR7UkVMT0NBVElORysgX2VkYXRhICA9ICAuO30KLSAgJHtSRUxPQ0FUSU5HKyBfZmJzcyA9IC47fQotICAuc2JzcyA6IHsKLSAgICAqKC5zYnNzKQotICAgICooLnNjb21tb24pCi0gIH0KLSAgLmJzcyA6IHsKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLjt9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL21pcHNic2Quc2MgYi9sZC9zY3JpcHR0ZW1wbC9taXBzYnNkLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjIyYjMzLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL21pcHNic2Quc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotU0VDVElPTlMKLXsKLSAgJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn07fQotICAudGV4dCA6Ci0gIHsKLSAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORytldGV4dCA9ICR7REFUQV9BTElHTk1FTlR9O30KLSAgfQotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BTElHTk1FTlR9O30KLSAgLmRhdGEgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HK2VkYXRhICA9ICAuO30KLSAgfQotICAuYnNzIDoKLSAgewotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAke1JFTE9DQVRJTkcrZW5kID0gLiB9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL253LnNjIGIvbGQvc2NyaXB0dGVtcGwvbncuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNTUyMmMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbncuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotIwotIyBVbnVzdWFsIHZhcmlhYmxlcyBjaGVja2VkIGJ5IHRoaXMgY29kZToKLSMJTk9QIC0gdHdvIGJ5dGUgb3Bjb2RlIGZvciBuby1vcCAoZGVmYXVsdHMgdG8gMCkKLSMJREFUQV9BRERSIC0gaWYgZW5kLW9mLXRleHQtcGx1cy1vbmUtcGFnZSBpc24ndCByaWdodCBmb3IgZGF0YSBzdGFydAotIwlPVEhFUl9SRUFET05MWV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLnRleHQgLmluaXQgLmN0b3JzIC5yb2RhdGEgLi4uCi0jCQkoZS5nLiwgLlBBUklTQy5taWxsaSkKLSMJT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAuZGF0YSAuYnNzIC5zZGF0YSAuLi4KLSMJCShlLmcuLCAuUEFSSVNDLmdsb2JhbCkKLSMJT1RIRVJfU0VDVElPTlMgLSBhdCB0aGUgZW5kCi0jCUVYRUNVVEFCTEVfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBtdXN0IGJlIGRlZmluZWQgZm9yIGFuCi0jCQlleGVjdXRhYmxlIChlLmcuLCBfRFlOQU1JQ19MSU5LKQotIwlURVhUX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS50ZXh0IHNlY3Rpb24uCi0jCURBVEFfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmRhdGEgc2VjdGlvbi4KLSMJT1RIRVJfQlNTX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS5ic3Mgc2VjdGlvbiBiZXNpZGVzIF9fYnNzX3N0YXJ0LgotIwlEQVRBX1BMVCAtIC5wbHQgc2hvdWxkIGJlIGluIGRhdGEgc2VnbWVudCwgbm90IHRleHQgc2VnbWVudC4KLSMKLSMgV2hlbiBhZGRpbmcgc2VjdGlvbnMsIGRvIG5vdGUgdGhhdCB0aGUgbmFtZXMgb2Ygc29tZSBzZWN0aW9ucyBhcmUgdXNlZAotIyB3aGVuIHNwZWNpZnlpbmcgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG5leHQuCi0jCi10ZXN0IC16ICIke0JJR19PVVRQVVRfRk9STUFUfSIgJiYgQklHX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotdGVzdCAteiAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iICYmIExJVFRMRV9PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLXRlc3QgIiRMRF9GTEFHIiA9ICJOIiAmJiBEQVRBX0FERFI9LgotSU5URVJQPSIuaW50ZXJwICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbnRlcnApIAl9IgotUExUPSIucGx0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucGx0KQl9IgotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7UkVMT0NBVElORysvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgJHtTVEFDS1pFUk8rJHtTVEFDS1pFUk99fSAke1NITElCX1BBVEgrJHtTSExJQl9QQVRIfX0gICovfQotJHtSRUxPQ0FUSU5HKyR7RVhFQ1VUQUJMRV9TWU1CT0xTfX0KLSR7UkVMT0NBVElORy0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCi0gIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCi0gIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCi0gIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi99Ci1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgJHtDUkVBVEVfU0hMSUItJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn0gKyBTSVpFT0ZfSEVBREVSUzt9fQotICAke0NSRUFURV9TSExJQiske1JFTE9DQVRJTkcrLiA9IFNJWkVPRl9IRUFERVJTO319Ci0gICR7Q1JFQVRFX1NITElCLSR7SU5URVJQfX0KLSAgLmhhc2ggICAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbml0KQl9ID0ke05PUC0wfQotICAke0RBVEFfUExULSR7UExUfX0KLSAgLnRleHQgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfU1lNQk9MU319Ci0gICAgKigudGV4dCkKLSAgICAke0NPTlNUUlVDVElORysJX19DVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKwlMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysJKiguY3RvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKwlMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKwlfX0NUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysJX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKwlMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysJKiguZHRvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKwlMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKwlfX0RUT1JfRU5EX18gPSAuO30KLSAgfQotICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChldGV4dCA9IC4pO30KLSAgLmZpbmkgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5maW5pKSAgICB9ID0ke05PUC0wfQotICAuY3RvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5kdG9ycykgICB9Ci0gIC5yb2RhdGEgICR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhKSAgfQotICAucm9kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJvZGF0YTEpIH0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRE9OTFlfU0VDVElPTlN9fQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSLSBBTElHTig4KSArICR7TUFYUEFHRVNJWkV9fTt9Ci0gIC5kYXRhICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyR7REFUQV9TVEFSVF9TWU1CT0xTfX0KLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgfQotICAuZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5kYXRhMSkgfQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlN9fQotICAuZ290ICAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nb3QucGx0KSAqKC5nb3QpIH0KLSAgLmR5bmFtaWMgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluYW1pYykgfQotICAke0RBVEFfUExUKyR7UExUfX0KLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHMKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzbwotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqLwotICAuc2RhdGEgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnNkYXRhKSB9Ci0gICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZWRhdGEgPSAuKTt9Ci0gICR7UkVMT0NBVElORytfX2Jzc19zdGFydCA9IC47fQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9CU1NfU1lNQk9MU319Ci0gIC5zYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfQotICAuYnNzICAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KLQotICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW4KLSAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi8KLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9Ci0KLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAke1JFTE9DQVRJTkd9LiAgKi8KLSAgJHtPVEhFUl9TRUNUSU9OU30KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvcGUuc2MgYi9sZC9zY3JpcHR0ZW1wbC9wZS5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxMmQ0Mi4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9wZS5zYworKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIFBFLgotCi1pZiB0ZXN0IC16ICIke1JFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUfSI7IHRoZW4KLSAgUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotZmkKLQotIyBXZSBjYW4ndCBlYXNpbHkgYW5kIHBvcnRhYmx5IGdldCBhbiB1bnF1b3RlZCAkIGluIGEgc2hlbGwKLSMgc3Vic3RpdHV0aW9uLCBzbyB3ZSBkbyB0aGlzIGluc3RlYWQuCi0jIFNvcnRpbmcgb2YgdGhlIC5mb28kKiBzZWN0aW9ucyBpcyByZXF1aXJlZCBieSB0aGUgZGVmaW5pdGlvbiBvZgotIyBncm91cGVkIHNlY3Rpb25zIGluIFBFLgotIyBTb3J0aW5nIG9mIHRoZSBmaWxlIG5hbWVzIGluIFJfSURBVEEgaXMgcmVxdWlyZWQgYnkgdGhlCi0jIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZGxsdG9vbCAodGhpcyBjb3VsZCBwcm9iYWJseSBiZSBjaGFuZ2VkIHRvCi0jIHVzZSBncm91cGVkIHNlY3Rpb25zIGluc3RlYWQpLgotaWYgdGVzdCAiJHtSRUxPQ0FUSU5HfSI7IHRoZW4KLSAgUl9URVhUPScqKFNPUlQoLnRleHQkKikpJwotICBSX0RBVEE9JyooU09SVCguZGF0YSQqKSknCi0gIFJfUkRBVEE9JyooU09SVCgucmRhdGEkKikpJwotICBSX0lEQVRBPScKLSAgICBTT1JUKCopKC5pZGF0YSQyKQotICAgIFNPUlQoKikoLmlkYXRhJDMpCi0gICAgLyogVGhlc2UgemVyb2VzIG1hcmsgdGhlIGVuZCBvZiB0aGUgaW1wb3J0IGxpc3QuICAqLwotICAgIExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsKLSAgICBTT1JUKCopKC5pZGF0YSQ0KQotICAgIFNPUlQoKikoLmlkYXRhJDUpCi0gICAgU09SVCgqKSguaWRhdGEkNikKLSAgICBTT1JUKCopKC5pZGF0YSQ3KScKLSAgUl9DUlQ9JyooU09SVCguQ1JUJCopKScKLSAgUl9SU1JDPScqKFNPUlQoLnJzcmMkKikpJwotZWxzZQotICBSX1RFWFQ9Ci0gIFJfREFUQT0KLSAgUl9SREFUQT0KLSAgUl9JREFUQT0KLSAgUl9DUlQ9Ci0gIFJfUlNSQz0KLWZpCi0KLWNhdCA8PEVPRgotJHtSRUxPQ0FUSU5HK09VVFBVVF9GT1JNQVQoJHtPVVRQVVRfRk9STUFUfSl9Ci0ke1JFTE9DQVRJTkctT1VUUFVUX0ZPUk1BVCgke1JFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUfSl9Ci0ke09VVFBVVF9BUkNIK09VVFBVVF9BUkNIKCR7T1VUUFVUX0FSQ0h9KX0KLQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKF9tYWluQ1JUU3RhcnR1cCkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBfX2ltYWdlX2Jhc2VfXyArIF9fc2VjdGlvbl9hbGlnbm1lbnRfXyB9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQotICAgICooLnRleHQpCi0gICAgJHtSX1RFWFR9Ci0gICAgKiguZ2x1ZV83dCkKLSAgICAqKC5nbHVlXzcpCi0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjsgX19DVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguY3RvcnMpOyAqKC5jdG9yKTsgTE9ORyAoMCk7IH0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuOyBfX0RUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5kdG9ycyk7ICooLmR0b3IpOyAgTE9ORyAoMCk7IH0KLSAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpfQotICAgIC8qID8/PyBXaHkgaXMgLmdjY19leGMgaGVyZT8gICovCi0gICAgJHtSRUxPQ0FUSU5HKyAqKC5nY2NfZXhjKX0KLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ID0gLjt9Ci0gICAgKiguZ2NjX2V4Y2VwdF90YWJsZSkKLSAgfQotCi0gIC8qIFRoZSBDeWd3aW4zMiBsaWJyYXJ5IHVzZXMgYSBzZWN0aW9uIHRvIGF2b2lkIGNvcHlpbmcgY2VydGFpbiBkYXRhCi0gICAgIG9uIGZvcmsuICBUaGlzIHVzZWQgdG8gYmUgbmFtZWQgIi5kYXRhJG5vY29weSIuICBUaGUgbGlua2VyIHVzZWQKLSAgICAgdG8gaW5jbHVkZSB0aGlzIGJldHdlZW4gX19kYXRhX3N0YXJ0X18gYW5kIF9fZGF0YV9lbmRfXywgYnV0IHRoYXQKLSAgICAgYnJlYWtzIGJ1aWxkaW5nIHRoZSBjeWd3aW4zMiBkbGwuICBJbnN0ZWFkLCB3ZSBuYW1lIHRoZSBzZWN0aW9uCi0gICAgICIuZGF0YV9jeWd3aW5fbm9jb3B5IiBhbmQgZXhwbGljdGx5IGluY2x1ZGUgaXQgYWZ0ZXIgX19kYXRhX2VuZF9fLiAqLwotCi0gIC5kYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6IAotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9zdGFydF9fID0gLiA7fQotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTIpCi0gICAgJHtSX0RBVEF9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9lbmRfXyA9IC4gO30KLSAgICAke1JFTE9DQVRJTkcrKiguZGF0YV9jeWd3aW5fbm9jb3B5KX0KLSAgfQotCi0gIC5ic3MgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICR7UkVMT0NBVElORytfX2Jzc19zdGFydF9fID0gLiA7fQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrX19ic3NfZW5kX18gPSAuIDt9Ci0gIH0KLQotICAucmRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICooLnJkYXRhKQotICAgICR7Ul9SREFUQX0KLSAgICAqKC5laF9mcmFtZSkKLSAgfQotCi0gIC5lZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgKiguZWRhdGEpCi0gIH0KLQotICAvRElTQ0FSRC8gOgotICB7Ci0gICAgKiguZGVidWdcJFMpCi0gICAgKiguZGVidWdcJFQpCi0gICAgKiguZGVidWdcJEYpCi0gICAgKiguZHJlY3R2ZSkKLSAgfQotCi0gIC5pZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgLyogVGhpcyBjYW5ub3QgY3VycmVudGx5IGJlIGhhbmRsZWQgd2l0aCBncm91cGVkIHNlY3Rpb25zLgotCVNlZSBwZS5lbTpzb3J0X3NlY3Rpb25zLiAgKi8KLSAgICAke1JfSURBVEF9Ci0gIH0KLSAgLkNSVCAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgJHtSX0NSVH0KLSAgfQotCi0gIC5lbmRqdW5rICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAvKiBlbmQgaXMgZGVwcmVjYXRlZCwgZG9uJ3QgdXNlIGl0ICovCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9fZW5kX18gPSAuO30KLSAgfQotCi0gIC5yZWxvYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKigucmVsb2MpCi0gIH0KLQotICAucnNyYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKigucnNyYykKLSAgICAke1JfUlNSQ30KLSAgfQotCi0gIC5zdGFiICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0KLSAgLnN0YWJzdHIgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9ICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9wcGNwZS5zYyBiL2xkL3NjcmlwdHRlbXBsL3BwY3BlLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGZiZTMzLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3BwY3BlLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLSMgQSBQRSBsaW5rZXIgc2NyaXB0IGZvciBQb3dlclBDLgotIyBMb29zZWx5IGJhc2VkIG9uIFN0ZXZlIENoYW1iZXJsYWluJ3MgcGUuc2MuCi0jIEFsbCBuZXcgbWlzdGFrZXMgc2hvdWxkIGJlIGNyZWRpdGVkIHRvIEtpbSBLbnV0dGlsYSAoa3JrQGN5Z251cy5jb20pCi0jCi0jIFRoZXNlIGFyZSBzdWJzdGl0dXRlZCBpbiBhcyB2YXJpYWJsZXMgaW4gb3JkZXIgdG8gZ2V0ICd9JyBpbiBhIHNoZWxsCi0jIGNvbmRpdGlvbmFsIGV4cGFuc2lvbi4KLUlOSVQ9Jy5pbml0IDogeyAqKC5pbml0KSB9JwotRklOST0nLmZpbmkgOiB7ICooLmZpbmkpIH0nCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoJHtPVVRQVVRfRk9STUFUfSkKLSR7TElCX1NFQVJDSF9ESVJTfQotCi0vKiBNdWNoIG9mIHRoaXMgbGF5b3V0IHdhcyBkZXRlcm1pbmVkIGJ5IGRlbHZpbmcgaW50byAuZXhlIGZpbGVzIGZvcgotICAgdGhlIGJveCBnZW5lcmF0ZWQgYnkgb3RoZXIgY29tcGlsZXJzL2xpbmtlcnMvZXRjLiBUaGlzIG1lYW5zIHRoYXQKLSAgIGlmIGEgcGFydGljdWxhciBmZWF0dXJlIGRpZCBub3QgaGFwcGVuIHRvIGFwcGVhciBpbiBvbmUgb2YgdGhlIAotICAgc3ViamVjdCBmaWxlcywgdGhlbiBpdCBtYXkgbm90IGJlIHlldCBzdXBwb3J0ZWQuCi0qLwotCi0vKiBJdCdzICJtYWluQ1JUU3RhcnR1cCIsIG5vdCAiX21haW5DUlRTdGFydHVwIiwgYW5kIGl0J3MgbG9jYXRlZCBpbgotICAgb25lIG9mIHRoZSB0d28gLmxpYiBmaWxlcyAobGliYy5saWIgYW5kIGtlcm5lbDMyLmxpYikgdGhhdCBjdXJyZW50bHkKLSAgIG11c3QgYmUgcHJlc2VudCBvbiB0aGUgbGluayBsaW5lLiBUaGlzIG1lYW5zIHRoYXQgeW91IG11c3QgdXNlIAotICAgIi11IG1haW5DUlRTdGFydHVwIiB0byBtYWtlIHN1cmUgaXQgZ2V0cyBpbmNsdWRlZCBpbiB0aGUgbGluay4KLSovCi0KLUVOVFJZKG1haW5DUlRTdGFydHVwKQotCi1TRUNUSU9OUwotewotCi0gIC8qIHRleHQgLSB0aGUgdXN1YWwgbWVhbmluZyAqLwotICAudGV4dCAke1JFTE9DQVRJTkcrIF9faW1hZ2VfYmFzZV9fICsgX19zZWN0aW9uX2FsaWdubWVudF9fIH0gOiAKLQl7Ci0JICAgICR7UkVMT0NBVElORysgKiguaW5pdCk7fQotCSAgICAqKC50ZXh0KQotCSAgICAqKC5nY2NfZXhjZXB0X3RhYmxlKQotCSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuOyBfX0NUT1JfTElTVF9fID0gLiA7IAotCQkgICAgICAgIExPTkcgKC0xKTsgKiguY3RvcnMpOyAqKC5jdG9yKTsgTE9ORyAoMCk7IH0KLSAgICAgICAgICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47IF9fRFRPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmR0b3JzKTsgKiguZHRvcik7ICBMT05HICgwKTsgfQotCSAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpO30KLQkgICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLn07Ci0JfQotCi0gIC8qIHJkYXRhIC0gUmVhZCBPbmx5IFJ1bnRpbWUgRGF0YQotICAgICBDVFIgc2VjdGlvbnM6IEFsbCBvZiB0aGUgQ1JUIChyZWFkIG9ubHkgQyBydW50aW1lIGRhdGEpIHNlY3Rpb25zIAotCWFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlIC5yZGF0YSAocmVhZCBvbmx5IHJ1bnRpbWUgZGF0YSkgCi0Jc2VjdGlvbiwgaW4gdGhlIGZvbGxvd2luZyBvcmRlci4gRG9uJ3Qga25vdyBpZiBpdCBtYXR0ZXJzIG9yIG5vdC4KLQlOb3QgYWxsIHNlY3Rpb25zIGFyZSBhbHdheXMgcHJlc2VudCBlaXRoZXIuCi0gICAgIC5yZGF0YTogY29tcGlsZXIgZ2VuZXJhdGVkIHJlYWQgb25seSBkYXRhCi0gICAgIC54ZGF0YTogY29tcGlsZXIgZ2VuZXJhdGVkIGV4Y2VwdGlvbiBoYW5kbGluZyB0YWJsZS4gKE1vc3QgZG9jcwotCXNlZW0gdG8gc3VnZ2VzdCB0aGF0IHRoaXMgc2VjdGlvbiBpcyBub3cgZGVwcmVjYXRlZCBpbmZhdm9yCi0Jb2YgdGhlIHlkYXRhIHNlY3Rpb24pCi0gICAgIC5lZGF0YTogVGhlIGV4cG9ydGVkIG5hbWVzIHRhYmxlLgotICAqLwotICAucmRhdGEgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6Ci0JewotCSAgICAqKC5DUlRcJFhDQSk7Ci0JICAgICooLkNSVFwkWENDKTsKLQkgICAgKiguQ1JUXCRYQ1opOwotCSAgICAqKC5DUlRcJFhJQSk7Ci0JICAgICooLkNSVFwkWElDKTsKLQkgICAgKiguQ1JUXCRYSVopOwotCSAgICAqKC5DUlRcJFhMQSk7Ci0JICAgICooLkNSVFwkWExaKTsKLQkgICAgKiguQ1JUXCRYUEEpOwotCSAgICAqKC5DUlRcJFhQWCk7Ci0JICAgICooLkNSVFwkWFBaKTsKLQkgICAgKiguQ1JUXCRYVEEpOwotCSAgICAqKC5DUlRcJFhUWik7Ci0JICAgICooLnJkYXRhKTsKLQkgICAgKigueGRhdGEpOwotCX0KLQotICAuZWRhdGEgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6Ci0JewotICAgIAkgICAgKiguZWRhdGEpOwotCX0KLQotICAvKiBkYXRhIC0gaW5pdGlhbGl6ZWQgZGF0YQotICAgICAueWRhdGE6IGV4Y2VwdGlvbiBoYW5kbGluZyBpbmZvcm1hdGlvbi4KLSAgICAgLmRhdGE6IHRoZSB1c3VhbCBtZWFuaW5nLgotICAgICAuZGF0YTI6IG1vcmUgb2YgdGhlIHNhbWUuCi0gICAgIC5ic3M6IEZvciBzb21lIHJlYXNvbiwgYnNzIGFwcGVhcnMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGRhdGEKLQlzZWN0aW9uLCBhcyBvcHBvc2VkIHRvIGJlaW5nIGdpdmVuIGEgc2VjdGlvbiBvZiBpdCdzIG93bi4KLSAgICAgQ09NTU9OOgotICAqLwotICAuZGF0YSBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDogCi0JewotCSAgICBfX2RhdGFfc3RhcnRfXyA9IC4gOyAKLQkgICAgKigueWRhdGEpOwotCSAgICAqKC5kYXRhKTsKLQkgICAgKiguZGF0YTIpOwotCSAgICBfX2Jzc19zdGFydF9fID0gLiA7Ci0JICAgICooLmJzcykgOwotCSAgICAqKENPTU1PTik7Ci0JICAgIF9fYnNzX2VuZF9fID0gLiA7Ci0JICAgICR7UkVMT0NBVElORysgZW5kID0gIC59OwotIAkgICAgX19kYXRhX2VuZF9fID0gLiA7IAotCX0KLQotICAvKiBUaGUgZXhjZXB0aW9uIGhhbmRsaW5nIHRhYmxlLiBBIHNlcXVlbmNlIG9mIDUgd29yZCBlbnRyaWVzLiBTZWN0aW9uCi0gICAgIGFkZHJlc3MgYW5kIGV4dGVudCBhcmUgcGxhY2VkIGluIHRoZSBEYXRhRGlyZWN0b3J5LgotICAqLwotICAucGRhdGEgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6Ci0JeyAJCQkJCQotCSAgICAqKC5wZGF0YSkKLSAJICAgIDsKLQl9Ci0KLSAgLyogVGhlIGlkYXRhIHNlY3Rpb24gaXMgY2hvY2sgZnVsbCBvZiBtYWdpYyBiaXRzLiAKLQkxLiBCb3VuZGFyaWVzIGFyb3VuZCB2YXJpb3VzIGlkYXRhIHBhcnRzIGFyZSB1c2VkIHRvIGluaXRpYWxpemUKLQkgICBzb21lIG9mIHRoZSBmaWVsZHMgb2YgdGhlIERhdGFEaXJlY3RvcnkuIEluIHBhcnRpY3VsYXIsIHRoZQotCSAgIG1hZ2ljIGZvciAyLCA0IGFuZCA1IGFyZSBrbm93biB0byBiZSB1c2VkLiBTb21lIGNvbXBpbGVycwotCSAgIGFwcGVhciB0byBnZW5lcmF0ZSBtYWdpYyBzZWN0aW9uIHN5bWJvbHMgZm9yIHRoaXMgcHVycG9zZS4KLQkgICBXaGVyZSB3ZSBjYW4sIHdlIGNhdGNoIHN1Y2ggc3ltYm9scyBhbmQgdXNlIG91ciBvd24uIFRoaXMgb2YKLQkgICBjb3Vyc2UgaXMgc29tZXRoaW5nIGxlc3MgdGhhbiBhIHBlcmZlY3Qgc3RyYXRlZ3kuCi0JMi4gVGhlIHRhYmxlIG9mIGNvbnRlbnRzIGlzIHBsYWNlZCBpbW1lZGlhdGVseSBhZnRlciBpZGF0YTQuCi0JICAgVGhlICIucHJpdmF0ZS50b2MiIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIHBwYyBiZmQuIFRoZQotCSAgIC50b2MgdmFyaWFibGUgaXMgZ2VuZXJhdGVkIGJ5IGdhcywgYW5kIHJlc29sdmVkIGhlcmUuIEl0IGlzCi0JICAgdXNlZCB0byBpbml0aWFsaXplZCBmdW5jdGlvbiBkZXNjcmlwdG9ycyAoYW5kIGFueW9uZSBlbHNlIHdobwotCSAgIG5lZWRzIHRoZSBhZGRyZXNzIG9mIHRoZSBtb2R1bGUncyB0b2MpLiBUaGUgb25seSB0aGluZyAKLQkgICBpbnRlcmVzdGluZyBhYm91dCBpdCBhdCBhbGw/IE1vc3QgcHBjIGluc3RydWN0aW9ucyB1c2luZyBpdAotCSAgIGhhdmUgYSAxNmJpdCBkaXNwbGFjZW1lbnQgZmllbGQuIFRoZSBjb252ZW50aW9uIGZvciBhZGRyZXNzaW5nCi0JICAgaXMgdG8gaW5pdGlhbGl6ZSB0aGUgLnRvYyB2YWx1ZSB0byAzMksgcGFzdCB0aGUgc3RhcnQgb2YgdGhlCi0JICAgYWN0dWFsIHRvYywgYW5kIHN1YnRyYWN0IDMySyBmcm9tIGFsbCByZWZlcmVuY2VzLCB0aHVzIHVzaW5nCi0JICAgdGhlIGVudGlyZSA2NEsgcmFuZ2UuIE5hdHVyYWxseSwgdGhlIHJlbG9jIGNvZGUgbXVzdCBhZ3JlZQotCSAgIG9uIHRoaXMgbnVtYmVyIG9yIHlvdSBnZXQgcHJldHR5IHN0dXBpZCByZXN1bHRzLgotICAqLwotICAuaWRhdGEgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6Ci0JeyAJCQkJCQotCSAgICBfX2lkYXRhMl9tYWdpY19fID0gLjsKLQkgICAgKiguaWRhdGFcJDIpOwotCSAgICBfX2lkYXRhM19tYWdpY19fID0gLjsKLQkgICAgKiguaWRhdGFcJDMpOwotCSAgICBfX2lkYXRhNF9tYWdpY19fID0gLjsKLQkgICAgKiguaWRhdGFcJDQpOwotCSAgICAuID0gQUxJR04oNCk7Ci0JICAgIC50b2MgPSAuICsgMzI3Njg7Ci0JICAgICooLnByaXZhdGUudG9jKTsKLQkgICAgX19pZGF0YTVfbWFnaWNfXyA9IC47Ci0JICAgICooLmlkYXRhXCQ1KTsKLQkgICAgX19pZGF0YTZfbWFnaWNfXyA9IC47Ci0JICAgICooLmlkYXRhXCQ2KTsKLQkgICAgX19pZGF0YTdfbWFnaWNfXyA9IC47Ci0JICAgICooLmlkYXRhXCQ3KTsKLQkgICAgOwotCX0KLQotICAvKiByZWxkYXRhIC0tIGRhdGEgdGhhdCByZXF1aXJlcyByZWxvY2F0aW9uCi0gICovCi0gIC5yZWxkYXRhIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOgotCXsgCQkJCQkKLQkgICAgKigucmVsZGF0YSkKLSAJICAgIDsKLQl9Ci0KLQotICAvKiBSZXNvdXJjZXMgKi8KLSAgLnJzcmMgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6Ci0JeyAJCQkJCQotCSAgICAqKC5yc3JjXCQwMSkKLQkgICAgKigucnNyY1wkMDIpCi0JICAgIDsKLQl9Ci0KLSAgLnN0YWIgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLQotICAuc3RhYnN0ciBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLQotICAvKiBUaGUgLnJlbG9jIHNlY3Rpb24gaXMgY3VycmVudGx5IGdlbmVyYXRlZCBieSB0aGUgZGxsdG9vbCBmcm9tIFN0ZXZlIAotICAgICBDaGFtYmVybGFpbiBpbiBhIHNlY29uZCBwYXNzIG9mIGxpbmtpbmcuIFNlY3Rpb24gYWRkcmVzcyBhbmQgZXh0ZW50Ci0gICAgIGFyZSBwbGFjZWQgaW4gdGhlIERhdGFEaXJlY3RvcnkuCi0gICovCi0gIC5yZWxvYyBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKLQl7IAkJCQkJCi0JICAgICooLnJlbG9jKQotCSAgICA7Ci0JfQotCi0gIC8qIFdlIGRvbid0IGRvIGFueXRoaW5nIHVzZWZ1bCB3aXRoIGNvZGV2aWV3IGRlYnVnZ2VyIHN1cHBvcnQgb3IgdGhlCi0gICAgIGRpcmVjdGl2ZSBzZWN0aW9uICh5ZXQpLiBIb3BlZnVsbHksIHdlIGp1bmsgdGhlbSBjb3JyZWN0bHkuIAotICAqLwotICAvRElTQ0FSRC8gQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6IAotCXsKLSAgICAJICAgICooLmRlYnVnXCRTKQotICAgIAkgICAgKiguZGVidWdcJFQpCi0gICAgCSAgICAqKC5kZWJ1Z1wkRikKLSAgICAJICAgICooLmRyZWN0dmUpCi0gICAgCSAgICA7Ci0gICAJfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9wc29zLnNjIGIvbGQvc2NyaXB0dGVtcGwvcHNvcy5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI4YzZjNy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9wc29zLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCR7T1VUUFVUX0ZPUk1BVH0pCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HOi0wfSAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX0FERFJ9fSA6IHsKLSAgICAke1JFTE9DQVRJTkcrIHN0YXJ0ID0gREVGSU5FRChfU1RBUlQpID8gX1NUQVJUIDogREVGSU5FRChfc3RhcnQpID8gX3N0YXJ0IDogLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9fdGV4dCA9IC4pO30KLSAgICAqKC50ZXh0KTsKLSAgICAqKGNvZGUpOwotICAgICooY29uc3QpOwotICAgICooc3RyaW5ncyk7Ci0gICAgKihwU09TKTsKLSAgICAqKHBST0JFKTsKLSAgICAqKHBOQSk7Ci0gICAgKihwSElMRSk7Ci0gICAgKihwUkVQQyk7Ci0gICAgKihwUlBDKTsKLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fQ1RPUl9FTkRfXyAtIF9fX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApO30KLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19EVE9SX0VORF9fIC0gX19fRFRPUl9MSVNUX18pIC8gNCAtIDIpO30KLSAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKTt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfRU5EX18gPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX19ldGV4dCA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX2V0ZXh0ID0gLik7fQotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORzotMH0gOiAke1JFTE9DQVRJTkcrIEFUKEFERFIoLnRleHQpICsgU0laRU9GKC50ZXh0KSl9IHsKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX19kYXRhID0gLik7fQotICAgICooLmRhdGEpOwotICAgICoodmFycyk7Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9fZWRhdGEgPSAuKTt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9lZGF0YSA9IC4pO30KLSAgfQotICAuYnNzICR7UkVMT0NBVElORzotMH0gOgotICB7IAkJCQkJCi0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9fYnNzID0gLik7fQotICAgICooLmJzcyk7Ci0gICAgKih6ZXJvdmFycyk7Ci0gICAgKihDT01NT04pOwotICAgICR7UkVMT0NBVElORysgUFJPVklERShfX2Vic3MgPSAuKTt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9fZW5kID0gLik7fQotICAgICR7UkVMT0NBVElORysgUFJPVklERShfZW5kID0gLik7fQotICAgICR7UkVMT0NBVElORysgUFJPVklERShfRnJlZU1lbVN0YXJ0ID0gLik7fQotICB9Ci0gIC5zdGFiIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgKiguc3RhYik7Ci0gIH0KLSAgLnN0YWJzdHIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgICooLnN0YWJzdHIpOwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3Jpc2NpeC5zYyBiL2xkL3NjcmlwdHRlbXBsL3Jpc2NpeC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgwMWEwYy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9yaXNjaXguc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7UkVMT0NBVElORytfX0RZTkFNSUMgID0gIDA7fQotJHtTVEFDS1pFUk8rJHtSRUxPQ0FUSU5HKyR7U1RBQ0taRVJPfX19Ci0ke1NITElCX1BBVEgrJHtSRUxPQ0FUSU5HKyR7U0hMSUJfUEFUSH19fQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9BRERSfX06Ci0gIHsKLSAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKLSAgICAqKC50ZXh0KQotICAgICR7UEFEX1RFWFQrJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUxJR05NRU5UfTt9fQotICAgICR7UkVMT0NBVElORytfZXRleHQgPSAke0RBVEFfQUxJR05NRU5UfTt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZXRleHQgPSAke0RBVEFfQUxJR05NRU5UfTt9Ci0gIH0KLSAgLmRhdGEgICR7UkVMT0NBVElORyske0RBVEFfQUxJR05NRU5UfX0gOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZWRhdGEgPSAgLjt9Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsKLSAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnQgPSAufTsKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgJHtSRUxPQ0FUSU5HK19lbmQgPSBBTElHTig0KSB9OwotICAgJHtSRUxPQ0FUSU5HK19fZW5kID0gQUxJR04oNCkgfTsKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9zYTI5MjAwLnNjIGIvbGQvc2NyaXB0dGVtcGwvc2EyOTIwMC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmMjY3ZS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9zYTI5MjAwLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLUVOVFJZKHN0YXJ0KQotCi1TRUNUSU9OUyB7Ci0gIC50ZXh0ICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfQUREUn19IDogCi0gICAgewotCSooLnRleHQpOwotCSooLnRleHQxKTsKLQkqKC50ZXh0Mik7Ci0JJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC59OwotICAgIH0KLSAgLmxpdCBBTElHTig0KSA6Ci0gICB7Ci0JKigubGl0KTsKLQkke1JFTE9DQVRJTkcrX2VsaXQgPSAufTsKLSAgIH0KLSAgLmRhdGEgQUxJR04oNCkgOgotICAgIHsKLQkqKC5kYXRhKTsKLQkqKC5kYXRhMSk7Ci0JKiguZGF0YTIpOwotCSR7UkVMT0NBVElORytfZWRhdGEgPSAufTsKLQkke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0JJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjt9Ci0JJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0NUT1JfRU5EX18gLSBfX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0JJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLQkke0NPTlNUUlVDVElORysgTE9ORygwKX0KLQkke0NPTlNUUlVDVElORysgX19fQ1RPUl9FTkRfXyA9IC47fQotCSR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47fQotCSR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19EVE9SX0VORF9fIC0gX19fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotCSR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0JJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0JJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfRU5EX18gPSAuO30KLSAgICB9Ci0KLSAgLmJzcyAgQUxJR04oNCkgOgotICAgIHsgCi0JKihDT01NT04pIAkKLQkqKC5ic3MpCi0JJHtSRUxPQ0FUSU5HK19lbmQgPSAufTsKLSAgICB9IAotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9zaC5zYyBiL2xkL3NjcmlwdHRlbXBsL3NoLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzZkZDIxLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3NoLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotVE9SUz0iLnRvcnMgOgotICB7Ci0gICAgX19fY3RvcnMgPSAuIDsKLSAgICAqKC5jdG9ycykKLSAgICBfX19jdG9yc19lbmQgPSAuIDsKLSAgICBfX19kdG9ycyA9IC4gOwotICAgICooLmR0b3JzKQotICAgIF9fX2R0b3JzX2VuZCA9IC4gOwotICB9ID4gcmFtIgotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotTUVNT1JZCi17Ci0gIHJhbSA6IG8gPSAweDEwMDAsIGwgPSA1MTJrCi19Ci0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0IDoKLSAgewotICAgICooLnRleHQpCi0gICAgKiguc3RyaW5ncykKLSAgICAke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLSAgJHtDT05TVFJVQ1RJTkcrJHtUT1JTfX0KLSAgLmRhdGEgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLSAgLmJzcyA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAuIDsgfQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLSAgfSAke1JFTE9DQVRJTkcrID4gcmFtfQotICAuc3RhY2sgJHtSRUxPQ0FUSU5HKyAweDMwMDAwIH0gIDoKLSAgewotICAgICR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLSAgICAqKC5zdGFjaykKLSAgfSAke1JFTE9DQVRJTkcrID4gcmFtfQotICAuc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgKiguc3RhYikKLSAgfQotICAuc3RhYnN0ciAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgKiguc3RhYnN0cikKLSAgfQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3NwYXJjY29mZi5zYyBiL2xkL3NjcmlwdHRlbXBsL3NwYXJjY29mZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiYjdhZC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIFNwYXJjIENPRkYuCi0jIEJhc2VkIG9uIGkzODZjb2ZmLnNjIGJ5IElhbiBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIFNJWkVPRl9IRUFERVJTfSA6IHsKLSAgICAqKC5pbml0KQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0NUT1JfRU5EX18gLSBfX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19EVE9SX0VORF9fIC0gX19fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfRU5EX18gPSAuO30KLSAgICAqKC5maW5pKQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC59OwotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORysgMHg0MDAwMDAgKyAoLiAmIDB4ZmZjMDBmZmYpfSA6IHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC59OwotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgeyAJCQkJCQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC59OwotICB9Ci0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjIGIvbGQvc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmIxZTFkLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3NwYXJjbHlueC5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgU3BhcmMgTHlueE9TLgotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgU0laRU9GX0hFQURFUlN9IDogewotICAgICooLmluaXQpCi0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fQ1RPUl9FTkRfXyAtIF9fX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0RUT1JfRU5EX18gLSBfX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9FTkRfXyA9IC47fQotICAgICooLmZpbmkpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLn07Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAweDQwMDAwMCArICguICYgMHhmZmMwMGZmZil9IDogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLn07Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICB7IAkJCQkJCi0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgZW5kID0gLn07Ci0gIH0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9zdDIwMDAuc2MgYi9sZC9zY3JpcHR0ZW1wbC9zdDIwMDAuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZTEzMmEuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvc3QyMDAwLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnRleHQgOgotCXsgCQkJCQkKLQkgICooLnRleHQpIAkJCQkKLQkgICooLnN0cmluZ3MpCi0gICAJICBfZXRleHQgPSAuOwotCSooLmRhdGEpCi0JX2VkYXRhID0gLjsKLQkqKC5ic3MpCi0JKihDT01NT04pCi0JIF9lbmQgPSAuOwotCi19Ci0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC90aWMzMGFvdXQuc2MgYi9sZC9zY3JpcHR0ZW1wbC90aWMzMGFvdXQuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YmFlZDMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvdGljMzBhb3V0LnNjCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLSR7U1RBQ0taRVJPKyR7UkVMT0NBVElORyske1NUQUNLWkVST319fQotJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fc3RhY2sgPSAwKTt9Ci1TRUNUSU9OUwotewotICAke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9TVEFSVF9BRERSfTt9Ci0gIC50ZXh0IDoKLSAgewotICAgIENSRUFURV9PQkpFQ1RfU1lNQk9MUwotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC47fQotICAgICR7UkVMT0NBVElORytfX2V0ZXh0ID0gLjt9Ci0gICAgJHtQQURfVEVYVCske1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BTElHTk1FTlR9O319Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUxJR05NRU5UfTt9Ci0gIC5kYXRhIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZWRhdGEgID0gIC47fQotICB9Ci0gIC5ic3MgOgotICB7Ci0gICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0ID0gLn07Ci0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgICR7UkVMT0NBVElORytfZW5kID0gQUxJR04oNCkgfTsKLSAgICR7UkVMT0NBVElORytfX2VuZCA9IEFMSUdOKDQpIH07Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvdGljMzBjb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvdGljMzBjb2ZmLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjJkNGY3Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3RpYzMwY29mZi5zYworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgiJHtPVVRQVVRfQVJDSH0iKQotCi1NRU1PUlkKLXsKLQlyb20gOiBPUklHSU4gPSAweDAwMDAwMzAwLCBMRU5HVEggPSAxNmsKLQlyYW0gOiBPUklHSU4gPSAweDAwMDAwMzAwICsgMTZrLCBMRU5HVEggPSAxNmsKLQlyYW1ibGswIDogT1JJR0lOID0gMHgwMjAyNjAwMCwgTEVOR1RIID0gMHgxMDAwCi0JcmFtYmxrMSA6IE9SSUdJTiA9IDB4MDIwMjcwMDAsIExFTkdUSCA9IDB4MTAwMAotfQotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udmVjdG9ycyAweDAwMDAwMDAwIDoKLXsKLQkqKHZlY3RvcnMpCi19Ci0KLS50ZXh0IDogCi17Ci0JKigudGV4dCkKLX0gPiByb20KLQotLmNvbnN0IDoKLXsKLQkqKC5jb25zdCkKLQlfX2V0ZXh0ID0gLiA7Ci19ID4gcm9tCi0KLS5tZGF0YSA6IEFUKCBBRERSKC5jb25zdCkgKyBTSVpFT0YoLmNvbnN0KSApCi17Ci0JX19kYXRhID0gLiA7Ci0JKiguZGF0YSk7Ci0JX19lZGF0YSA9IC4gOwotfSA+IHJhbQotCi0uYnNzIDoKLXsKLQlfX2JzcyA9IC4gOwotCSooLmJzcyk7Ci0JKihDT01NT04pOwotCV9fZWJzcyA9IC4gOwotfSA+IHJhbQotCi0ucmFtMCA6Ci17Ci0JKihyYW0wKQotfSA+IHJhbWJsazAKLQotLnJhbTEgOgotewotCSoocmFtMSkKLX0gPiByYW1ibGsxCi0KLX0KLQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2MgYi9sZC9zY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNmY2NTMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBUSSBUTVMzMjBDODAgKHRpYzgwKSBDT0ZGLgotIwotIyBCZXNpZGVzIHRoZSBzaGVsbCB2YXJpYWJsZXMgc2V0IGJ5IHRoZSBlbXVscGFyYW1zIHNjcmlwdCwgYW5kIHRoZSBMRF9GTEFHCi0jIHZhcmlhYmxlLCB0aGUgZ2Vuc2NyaXB0cy5zaCBzY3JpcHQgd2lsbCBzZXQgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgZm9yIGVhY2gKLSMgdGltZSB0aGlzIHNjcmlwdCBpcyBydW4gdG8gZ2VuZXJhdGUgb25lIG9mIHRoZSBsaW5rZXIgc2NyaXB0cyBmb3IgbGRzY3JpcHRzOgotIwotIyBSRUxPQ0FUSU5HOiBTZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nIHdoZW4gdGhlIGxpbmtlciBpcyBnb2luZyB0byBiZSBkb2luZwotIyBhIGZpbmFsIHJlbG9jYXRpb24uCi0jCi0jIENPTlNUUlVDVElORzogU2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIHRoZSBsaW5rZXIgaXMgZ29pbmcgdG8gYmUKLSMgYnVpbGRpbmcgZ2xvYmFsIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIHRhYmxlcy4KLSMKLSMgREFUQV9BTElHTk1FTlQ6IFNldCB0byBhbiBBTElHTiBleHByZXNzaW9uIHdoZW4gdGhlIG91dHB1dCBzaG91bGQgYmUgcGFnZQotIyBhbGlnbmVkLCBvciB0byAiLiIgd2hlbiBnZW5lcmF0aW5nIHRoZSAtTiBzY3JpcHQuCi0jCi0jIENSRUFURV9TSExJQjogU2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIGdlbmVyYXRpbmcgYSBzY3JpcHQgZm9yCi0jIHRoZSAtc2hhcmVkIGxpbmtlciBhcmcuCi0KLXRlc3QgLXogIiRURVhUX1NUQVJUX0FERFIiICYmIFRFWFRfU1RBUlRfQUREUj0iMHg4MDAwMCArIFNJWkVPRl9IRUFERVJTIgotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fX3N0YXJ0Ci0KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgJFRFWFRfU1RBUlRfQUREUn0gOiB7Ci0gICAgKiguaW5pdCkKLSAgICAqKC5maW5pKQotICAgICooLnRleHQpCi0gIH0KLSAgLmNvbnN0IEFMSUdOKDQpIDogewotICAgICooLmNvbnN0KQotICB9Ci0gIC5jdG9ycyBBTElHTig0KSA6IHsKLSAgICAke0NPTlNUUlVDVElORysgLiA9IEFMSUdOKDQpO30KLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygtMSl9Ci0gICAgKiguY3RvcnMpCi0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgfQotICAuZHRvcnMgQUxJR04oNCkgOiB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoLTEpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgfQotICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuO30KLSAgLmRhdGEgOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIF9fZWRhdGEgID0gIC59OwotICB9Ci0gIC5ic3MgOiB7IAkJCQkJCi0gICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydCA9IC59OwotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gQUxJR04oMHg4KX07Ci0gICAgICR7UkVMT0NBVElORysgX19lbmQgPSBBTElHTigweDgpfTsKLSAgfQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3Y4NTAuc2MgYi9sZC9zY3JpcHR0ZW1wbC92ODUwLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjJmN2U1Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3Y4NTAuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotY2F0IDw8IEVPRgotT1VUUFVUX0ZPUk1BVCgiZWxmMzItdjg1MCIsICJlbGYzMi12ODUwIiwKLQkgICAgICAiZWxmMzItdjg1MCIpCi1PVVRQVVRfQVJDSCh2ODUwKQotRU5UUlkoX3N0YXJ0KQotU0VBUkNIX0RJUiguKTsKLS8qL2NyaXR0ZXJzL3NsdWcvZ3Jvc3NtYW4vaW5zdGFsbC9zdW40L3Y4NTAtZWxmL2xpYiovCi1TRUNUSU9OUwotewotICAvKiBUaGlzIHNhdmVzIGEgbGl0dGxlIHNwYWNlIGluIHRoZSBFTEYgZmlsZSwgc2luY2UgdGhlIHpkYSBzdGFydHMKLSAgICAgYXQgYSBoaWdoZXIgbG9jYXRpb24gdGhhdCB0aGUgRUxGIGhlYWRlcnMgdGFrZSB1cC4gICovCi0KLSAgLnpkYXRhICR7WkRBVEFfU1RBUlRfQUREUn0gOiB7Ci0JKiguemRhdGEpCi0JKiguemJzcykKLQkqKHJlc3pkYXRhKQotCSooLnpjb21tb24pCi0gIH0KLQotICAvKiBUaGlzIGlzIHRoZSByZWFkIG9ubHkgcGFydCBvZiB0aGUgemVybyBkYXRhIGFyZWEuCi0gICAgIEhhdmluZyBpdCBhcyBhIHNlcGVyYXRlIHNlY3Rpb24gcHJldmVudHMgaXRzCi0gICAgIGF0dHJpYnV0ZXMgZnJvbSBiZWluZyBpbmhlcml0ZWQgYnkgdGhlIHpkYXRhCi0gICAgIHNlY3Rpb24uICBTcGVjaWZpY2FsbHkgaXQgcHJldmVudHMgdGhlIHpkYXRhCi0gICAgIHNlY3Rpb24gZnJvbSBiZWluZyBtYXJrZWQgUkVBRE9OTFkuICAqLwotCi0gIC5yb3pkYXRhICR7Uk9aREFUQV9TVEFSVF9BRERSfSA6IHsKLQkqKC5yb3pkYXRhKQotCSoocm9temRhdGEpCi0JKihyb216YnNzKQotICB9Ci0KLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSAke1RFWFRfU1RBUlRfQUREUn07Ci0gIC5pbnRlcnAJOiB7ICooLmludGVycCkgfQotICAuaGFzaAkJOiB7ICooLmhhc2gpIH0KLSAgLmR5bnN5bQk6IHsgKiguZHluc3ltKSB9Ci0gIC5keW5zdHIJOiB7ICooLmR5bnN0cikgfQotICAucmVsLnRleHQJOiB7ICooLnJlbC50ZXh0KSB9Ci0gIC5yZWxhLnRleHQJOiB7ICooLnJlbGEudGV4dCkgfQotICAucmVsLmRhdGEJOiB7ICooLnJlbC5kYXRhKSB9Ci0gIC5yZWxhLmRhdGEJOiB7ICooLnJlbGEuZGF0YSkgfQotICAucmVsLnJvZGF0YQk6IHsgKigucmVsLnJvZGF0YSkgfQotICAucmVsYS5yb2RhdGEJOiB7ICooLnJlbGEucm9kYXRhKSB9Ci0gIC5yZWwuZ290CTogeyAqKC5yZWwuZ290KSB9Ci0gIC5yZWxhLmdvdAk6IHsgKigucmVsYS5nb3QpIH0KLSAgLnJlbC5jdG9ycwk6IHsgKigucmVsLmN0b3JzKSB9Ci0gIC5yZWxhLmN0b3JzCTogeyAqKC5yZWxhLmN0b3JzKSB9Ci0gIC5yZWwuZHRvcnMJOiB7ICooLnJlbC5kdG9ycykgfQotICAucmVsYS5kdG9ycwk6IHsgKigucmVsYS5kdG9ycykgfQotICAucmVsLmluaXQJOiB7ICooLnJlbC5pbml0KSB9Ci0gIC5yZWxhLmluaXQJOiB7ICooLnJlbGEuaW5pdCkgfQotICAucmVsLmZpbmkJOiB7ICooLnJlbC5maW5pKSB9Ci0gIC5yZWxhLmZpbmkJOiB7ICooLnJlbGEuZmluaSkgfQotICAucmVsLmJzcwk6IHsgKigucmVsLmJzcykgfQotICAucmVsYS5ic3MJOiB7ICooLnJlbGEuYnNzKSB9Ci0gIC5yZWwucGx0CTogeyAqKC5yZWwucGx0KSB9Ci0gIC5yZWxhLnBsdAk6IHsgKigucmVsYS5wbHQpIH0KLSAgLmluaXQJCTogeyBLRUVQICgqKC5pbml0KSkgfSA9MAotICAucGx0CQk6IHsgKigucGx0KSB9Ci0KLSAgLnRleHQJCTogewotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyooLnRleHQuKil9Ci0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCi0gICAgKiguZ251Lndhcm5pbmcpCi0gICAgKiguZ251LmxpbmtvbmNlLnQqKQotICB9ID0wCi0KLSAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZXRleHQgPSAuKTt9Ci0KLSAgIC8qIFRoaXMgaXMgc3BlY2lhbCBjb2RlIGFyZWEgYXQgdGhlIGVuZCBvZiB0aGUgbm9ybWFsIHRleHQgc2VjdGlvbi4KLSAgICAgIEl0IGNvbnRhaW5zIGEgc21hbGwgbG9va3VwIHRhYmxlIGF0IHRoZSBzdGFydCBmb2xsb3dlZCBieSB0aGUKLSAgICAgIGNvZGUgcG9pbnRlZCB0byBieSBlbnRyaWVzIGluIHRoZSBsb29rdXAgdGFibGUuICAqLwotCi0gIC5jYWxsX3RhYmxlX2RhdGEgJHtDQUxMX1RBQkxFX1NUQVJUX0FERFJ9IDogewotICAgICR7UkVMT0NBVElORytQUk9WSURFKF9fY3RicCA9IC4pO30KLSAgICAqKC5jYWxsX3RhYmxlX2RhdGEpCi0gIH0gPSAweGZmICAgLyogZmlsbCBnYXBzIHdpdGggMHhmZiAqLwotICAuY2FsbF90YWJsZV90ZXh0IDogewotICAgICooLmNhbGxfdGFibGVfdGV4dCkKLSAgfQotCi0gIC5maW5pCQk6IHsgS0VFUCAoKiguZmluaSkpICAgIH0gPTAKLSAgLnJvZGF0YQk6IHsgKigucm9kYXRhKSAke1JFTE9DQVRJTkcrKigucm9kYXRhLiopfSAqKC5nbnUubGlua29uY2UuciopIH0KLSAgLnJvZGF0YTEJOiB7ICooLnJvZGF0YTEpIH0KLQotICAuZGF0YQkJOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrKiguZGF0YS4qKX0KLSAgICAqKC5nbnUubGlua29uY2UuZCopCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgLmRhdGExCTogeyAqKC5kYXRhMSkgfQotICAuY3RvcnMJOiB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fX2N0b3JzID0gLjt9Ci0gICAgS0VFUCAoKiguY3RvcnMpKQotICAgICR7UkVMT0NBVElORytfX19jdG9yc19lbmQgPSAuO30KLSAgfQotCi0gIC5kdG9ycwk6IHsKLSAgICAke1JFTE9DQVRJTkcrX19fZHRvcnMgPSAuO30KLSAgICBLRUVQICgqKC5kdG9ycykpCi0gICAgJHtSRUxPQ0FUSU5HK19fX2R0b3JzX2VuZCA9IC47fQotICB9Ci0KLSAgLmdvdAkJOiB7ICooLmdvdC5wbHQpICooLmdvdCkgfQotICAuZHluYW1pYwk6IHsgKiguZHluYW1pYykgfQotCi0gIC50ZGF0YSAke1REQVRBX1NUQVJUX0FERFJ9IDogewotCSR7UkVMT0NBVElORytQUk9WSURFIChfX2VwID0gLik7fQotCSooLnRieXRlKQotCSooLnRjb21tb25fYnl0ZSkKLQkqKC50ZGF0YSkKLQkqKC50YnNzKQotCSooLnRjb21tb24pCi0gIH0KLQotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cwotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCi0gIC5zZGF0YSAke1NEQVRBX1NUQVJUX0FERFJ9IDogewotCSR7UkVMT0NBVElORytQUk9WSURFIChfX2dwID0gLiArIDB4ODAwMCk7fQotCSooLnNkYXRhKQotICAgfQotCi0gIC8qIFNlZSBjb21tZW50IGFib3V0IC5yb3pkYXRhLiAqLwotICAucm9zZGF0YSAke1JPU0RBVEFfU1RBUlRfQUREUn0gOiB7Ci0JKigucm9zZGF0YSkKLSAgfQotCi0gIC8qIFdlIHBsYWNlIHRoZSAuc2JzcyBkYXRhIHNlY3Rpb24gQUZURVIgdGhlIC5yb3NkYXRhIHNlY3Rpb24sIHNvIHRoYXQKLSAgICAgaXQgY2FuIGRpcmVjdGx5IHByZWNlZWQgdGhlIC5ic3Mgc2VjdGlvbi4gIFRoaXMgYWxsb3dzIHJ1bnRpbWUgc3RhcnR1cAotICAgICBjb2RlIHRvIGluaXRpYWxpc2UgYWxsIHRoZSB6ZXJvLWRhdGEgc2VjdGlvbnMgYnkgc2ltcGx5IHRha2luZyB0aGUKLSAgICAgdmFsdWUgb2YgJ19lZGF0YScgYW5kIHplcm9pbmcgdW50aWwgaXQgcmVhY2hlcyAnX2VuZCcgICovCi0gIC5zYnNzIDogewotCSR7UkVMT0NBVElORytfX3Nic3Nfc3RhcnQgPSAuO30KLQkqKC5zYnNzKQotCSooLnNjb21tb24pCi0gIH0KLQotICAke1JFTE9DQVRJTkcrX2VkYXRhICA9IERFRklORUQgKF9fc2Jzc19zdGFydCkgPyBfX3Nic3Nfc3RhcnQgOiAuIDt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlZGF0YSA9IF9lZGF0YSk7fQotCi0gIC5ic3MgICAgICAgOgotICB7Ci0JJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0ID0gREVGSU5FRCAoX19zYnNzX3N0YXJ0KSA/IF9fc2Jzc19zdGFydCA6IC4gO30KLQkke1JFTE9DQVRJTkcrX19yZWFsX2Jzc19zdGFydCA9IC4gO30KLQkqKC5keW5ic3MpCi0JKiguYnNzKQotCSooQ09NTU9OKQotICB9Ci0KLSAgJHtSRUxPQ0FUSU5HK19lbmQgPSAuIDt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlbmQgPSAuKTt9Ci0KLSAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KLSAgLnN0YWIgMAkJOiB7ICooLnN0YWIpIH0KLSAgLnN0YWJzdHIgMAkJOiB7ICooLnN0YWJzdHIpIH0KLSAgLnN0YWIuZXhjbCAwCQk6IHsgKiguc3RhYi5leGNsKSB9Ci0gIC5zdGFiLmV4Y2xzdHIgMAk6IHsgKiguc3RhYi5leGNsc3RyKSB9Ci0gIC5zdGFiLmluZGV4IDAJCTogeyAqKC5zdGFiLmluZGV4KSB9Ci0gIC5zdGFiLmluZGV4c3RyIDAJOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KLSAgLmNvbW1lbnQgMAkJOiB7ICooLmNvbW1lbnQpIH0KLQotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KLSAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCi0KLSAgLyogRFdBUkYgMSAqLwotICAuZGVidWcgICAgICAgICAgMAk6IHsgKiguZGVidWcpIH0KLSAgLmxpbmUgICAgICAgICAgIDAJOiB7ICooLmxpbmUpIH0KLQotICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCi0gIC5kZWJ1Z19zcmNpbmZvICAwCTogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9Ci0gIC5kZWJ1Z19zZm5hbWVzICAwCTogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCi0gIC5kZWJ1Z19hcmFuZ2VzICAwCTogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9Ci0gIC5kZWJ1Z19wdWJuYW1lcyAwCTogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQotCi0gIC8qIERXQVJGIDIgKi8KLSAgLmRlYnVnX2luZm8gICAgIDAJOiB7ICooLmRlYnVnX2luZm8pIH0KLSAgLmRlYnVnX2FiYnJldiAgIDAJOiB7ICooLmRlYnVnX2FiYnJldikgfQotICAuZGVidWdfbGluZSAgICAgMAk6IHsgKiguZGVidWdfbGluZSkgfQotICAuZGVidWdfZnJhbWUgICAgMAk6IHsgKiguZGVidWdfZnJhbWUpIH0KLSAgLmRlYnVnX3N0ciAgICAgIDAJOiB7ICooLmRlYnVnX3N0cikgfQotICAuZGVidWdfbG9jICAgICAgMAk6IHsgKiguZGVidWdfbG9jKSB9Ci0gIC5kZWJ1Z19tYWNpbmZvICAwCTogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9Ci0KLSAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCi0gIC5kZWJ1Z193ZWFrbmFtZXMgMAk6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9Ci0gIC5kZWJ1Z19mdW5jbmFtZXMgMAk6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9Ci0gIC5kZWJ1Z190eXBlbmFtZXMgMAk6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9Ci0gIC5kZWJ1Z192YXJuYW1lcyAgMAk6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KLQotICAvKiBVc2VyIHN0YWNrICovCi0gIC5zdGFjayAweDIwMDAwMAk6IHsKLQkke1JFTE9DQVRJTkcrX19zdGFjayA9IC47fQotCSooLnN0YWNrKQotICB9Ci0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovCi19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3ZhbmlsbGEuc2MgYi9sZC9zY3JpcHR0ZW1wbC92YW5pbGxhLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzk4NDgwLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3ZhbmlsbGEuc2MKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIE5vdGhpbmcgdG8gZG8uCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC93NjUuc2MgYi9sZC9zY3JpcHR0ZW1wbC93NjUuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MDQ0OTUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvdzY1LnNjCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLU1FTU9SWSB7Ci0JcmFtICAgOiBvID0gMHgxMDAwLCBsID0gNTEyawotCX0KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnRleHQgOgotCXsgCQkJCQkKLQkgICooLnRleHQpIAkJCQkKLQkgICooLnN0cmluZ3MpCi0gICAJICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0KLQotLnRvcnMgICA6IHsKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci19ICAke1JFTE9DQVRJTkcrID4gcmFtfQotCi0uZGF0YSAgOgotCXsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0uYnNzICA6Ci0JewotCSR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC4gOyB9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0gJHtSRUxPQ0FUSU5HKyA+cmFtfQotLnN0YWNrICR7UkVMT0NBVElORysgMHgzMDAwMCB9ICA6IAotCXsKLQkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0JKiguc3RhY2spCi0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotICAuc3RhYiAgLiAoTk9MT0FEKSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIC4gKE5PTE9BRCkgOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC96ODAwMC5zYyBiL2xkL3NjcmlwdHRlbXBsL3o4MDAwLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjg3OTMwLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3o4MDAwLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCIke09VVFBVVF9BUkNIfSIpCi1FTlRSWShfc3RhcnQpCi0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS50ZXh0ICR7QklHKyAke1JFTE9DQVRJTkcrIDB4MDAwMDAwMH19IDogeyAJCQkJCQotCSAgKigudGV4dCkgCQkJCQotCSAgKiguc3RyaW5ncykKLQkgICooLnJkYXRhKQotCX0KLQotLmN0b3JzICR7QklHKyAke1JFTE9DQVRJTkcrIDB4MjAwMDAwMH19ICA6IAotCXsKLQkgICR7UkVMT0NBVElORysgX19fY3RvcnMgPSAuIDsgIH0KLQkgICooLmN0b3JzKTsKLQkgICR7UkVMT0NBVElORysgX19fY3RvcnNfZW5kID0gLiA7IH0KLQkgIF9fX2R0b3JzID0gLiA7Ci0JICAqKC5kdG9ycyk7Ci0JICAke1JFTE9DQVRJTkcrIF9fX2R0b3JzX2VuZCA9IC4gOyB9Ci0JfSAKLQotLmRhdGEgJHtCSUcrICR7UkVMT0NBVElORysgMHgzMDAwMDAwfX0gOiB7Ci0JKiguZGF0YSkKLQl9Ci0KLS5ic3MgJHtCSUcrICR7UkVMT0NBVElORysgMHg0MDAwMDAwfX0gOiAKLSAgewotICAgICR7UkVMT0NBVElORysgX19zdGFydF9ic3MgPSAuIDsgfQotICAgICooLmJzcyk7Ci0gICAgKihDT01NT04pOwotICAgICR7UkVMT0NBVElORysgX19lbmRfYnNzID0gLiA7IH0KLSAgfQotCi0uaGVhcCAke0JJRysgJHtSRUxPQ0FUSU5HKyAweDUwMDAwMDB9fSA6IHsKLQkke1JFTE9DQVRJTkcrIF9fc3RhcnRfaGVhcCA9IC4gOyB9Ci0JJHtSRUxPQ0FUSU5HKyAuID0gLiArIDIwayAgOyB9Ci0JJHtSRUxPQ0FUSU5HKyBfX2VuZF9oZWFwID0gLiA7IH0KLQl9IAotCi0uc3RhY2sgJHtSRUxPQ0FUSU5HKyAweGYwMDAgfSAgOiAKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCSR7UkVMT0NBVElORysgX19zdGFja190b3AgPSAuIDsgfQotCX0gCi0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zdGFtcC1oLmluIGIvbGQvc3RhbXAtaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4OGY3MC4uMDAwMDAwMAotLS0gYS9sZC9zdGFtcC1oLmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGltZXN0YW1wCmRpZmYgLS1naXQgYS9sZC9zeXNkZXAuaCBiL2xkL3N5c2RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2NjMTIyLi4wMDAwMDAwCi0tLSBhL2xkL3N5c2RlcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyogc3lzZGVwLmggLS0gaGFuZGxlIGhvc3QgZGVwZW5kZW5jaWVzIGZvciB0aGUgR05VIGxpbmtlcgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBMRF9TWVNERVBfSAotI2RlZmluZSBMRF9TWVNERVBfSAotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbHNlCi1leHRlcm4gY2hhciAqc3RyY2hyICgpOwotZXh0ZXJuIGNoYXIgKnN0cnJjaHIgKCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9CSU5BUllfRk9QRU4KLSNpbmNsdWRlICJmb3Blbi1iaW4uaCIKLSNlbHNlCi0jaW5jbHVkZSAiZm9wZW4tc2FtZS5oIgotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotZXh0ZXJuIGNoYXIgKnN0cnN0ciAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi1leHRlcm4gdm9pZCBmcmVlICgpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVgotZXh0ZXJuIGNoYXIgKmdldGVudiAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OCi1leHRlcm4gY2hhciAqKmVudmlyb247Ci0jZW5kaWYKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoTERfU1lTREVQX0gpICovCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvQ2hhbmdlTG9nIGIvbGQvdGVzdHN1aXRlL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4OTFkNC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNzM5ICswLDAgQEAKLTE5OTktMDUtMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBBZGQgeGZhaWwgZm9yIG1jb3JlLWVsZi4KLQotMTk5OS0wNS0xMSAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IERvIG5vdCBydW4gdGVzdHMgZm9yIFBFIGJhc2VkIHBvcnRzLgotCi0xOTk5LTAzLTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC1zZWxlY3RpdmUvc2VsZWN0aXZlLmV4cDogRG8gbm90IHJ1biB0ZXN0cyBmb3IgQ09GRiBvciBQRQotCWJhc2VkIHBvcnRzLgotCi0xOTk5LTAyLTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogQWRkIGV4cGVjdGVkIGZhaWx1cmVzIGZvciBTdHJvbmdBUk0KLQl0YXJnZXRzLgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgZXhwZWN0ZWQgZmFpbHVyZXMgZm9yIFN0cm9uZ0FSTSB0YXJnZXRzLgotCi0JKiBsZC1zZWxlY3RpdmUvc2VsZWN0aXZlLmV4cDogQWRkIGV4cGVjdGVkIGZhaWx1cmUgZm9yIEFSTS1DT0ZGCi0JdGFyZ2V0cy4gCi0KLTE5OTktMDItMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLWNoZWNrcy9hc20uczogVXNlIC5sb25nIGluc3RlYWQgb2YgLndvcmQuCi0JUmVwbGFjZSBjdXN0b20gc2VjdGlvbiBuYW1lcyB3aXRoIC50ZXh0LCAuZGF0YSBhbmQgLmJzcy4KLQkqIGxkLWNoZWNrcy9zY3JpcHQ6IFJlcGxhY2UgY3VzdG9tIHNlY3Rpb24gbmFtZXMgd2l0aCAudGV4dCwgLmRhdGEKLQlhbmQgLmJzcy4gCi0JKiBsZC1jaGVja3MvY2hlY2tzLmV4cDogUmVwbGFjZSBjdXN0b20gc2VjdGlvbiBuYW1lcyB3aXRoIC50ZXh0LAotCS5kYXRhIGFuZCAuYnNzLiAKLQotMTk5OS0wMi0xMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtY2hlY2tzOiBOZXcgZGlyZWN0b3J5OiAgVGVzdHMgZm9yIHRoZSBsaW5rZXIncwotCS0tY2hlY2stc2VjdGlvbnMgb3B0aW9uLgotCSogbGQtY2hlY2tzL2NoZWNrcy5leHA6IE5ldyBmaWxlLgotCSogbGQtY2hlY2tzL3NjcmlwdDogQm9ndXMgbGlua2VyIHNjcmlwdC4KLQkqIGxkLWNoZWNrcy9hc20uczogU2ltcGxlIHRlc3QgYXNzZW1ibGVyIGZpbGUuCi0KLVR1ZSBGZWIgIDIgMTk6MTU6MDIgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBsZC1zZWxlY3RpdmUvc2VsZWN0aXZlLmV4cDogIERpc2FibGUgdGVzdCBmb3IgdW5zdXBwb3J0ZWQKLSAgICAgICAgdGFyZ2V0cy4gIENoYW5nZSB0ZXN0cyB0byBjaGVjayBmb3IgYWJzZW5jZSBvZiBzeW1ib2xzIGluc3RlYWQKLSAgICAgICAgb2YgYWRkcmVzcyB6ZXJvLgotCi1Nb24gSmFuIDE4IDAzOjQ0OjUyIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwIChnZXRfbGlua19maWxlcyk6IFF1b3RlIHRhcmdldF90cmlwbGV0IGFuZCBDQwotCXdoZW4gaW52b2tpbmcgc2hlbGwuCi0JKGdldF90YXJnZXRfZW11bCk6IExpa2V3aXNlLgotCi0xOTk5LTAxLTAzICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwIChnZXRfbGlua19maWxlcywgZ2V0X3RhcmdldF9lbXVsKTogTmV3IHByb2NzOwotCXJ1biBzaGVsbCBjb21tYW5kcyB0byBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gY29uZmlndXJlLmhvc3QgYW5kCi0JY29uZmlndXJlLnRndCBpbiB0aGUgc291cmNlIHRyZWUuCi0JKHRvcCBsZXZlbCk6IFVzZSB0aGVtIHRvIGdldCBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gcnVuIHRlc3RzLCBpZgotCW5vdCBvdGhlcndpc2UgcHJvdmlkZWQuCi0KLQkqIGxkLXNoYXJlZC9lbGYtb2Zmc2V0LmxkOiBOZXcgZmlsZS4gIEJ1aWxkcyBhIHNoYXJlZCBsaWJyYXJ5LCBidXQKLQlnaXZlcyBub24temVybyBhZGRyZXNzZXMgZm9yIG1lbW9yeSByZWdpb24uCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogUnVuIHRoZSBub24tUElDIG5vbi1BSVggdGVzdCBhZ2FpbiB1c2luZwotCXRoZSBuZXcgbGlua2VyIHNjcmlwdC4KLQotVHVlIERlYyAgOCAyMjo1NjowNSAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBEZWxldGUgeGZhaWxzIGZvciBQUEMgTGludXggdGFyZ2V0cywKLQluZXdlciBnbGliYyBsZXRzIGxpbmsgc3VjY2VlZC4KLQotU3VuIERlYyAgNiAxMjo1OTozNyAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGxkLWVsZnZlcnMvdmVyczEuYzogQWRkIG1pc3NpbmcgcmV0dXJuIHR5cGVzIGFuZCB2YWx1ZXMuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMyLmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzMy5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczQuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnM1LmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzNi5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczcuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnM5LmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzMTUuYzogTGlrZXdpc2UuCi0KLUZyaSBPY3QgMjMgMTY6Mjg6MjkgMTk5OCBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICogbGQtc2VsZWN0aXZlOiAgTmV3IGRpcmVjdG9yeSB3aXRoIG5ldyBmaWxlcyB0byB0ZXN0Ci0gICAgICAgc2VsZWN0aXZlIGxpbmtpbmcuCi0KLSAgICAgICAqIGxpYi9sZC1saWIuZXhwIChsZF9ubSk6ICBTdHJpcCBsZWFkaW5nIHVuZGVyc2NvcmUgZnJvbSAkbmFtZS4KLSAgICAgCi1TdW4gT2N0ICA0IDIyOjE3OjA1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtZWxmdmVycy92ZXJzMTYuZHN5bTogV29yayBjb3JyZWN0bHkgb24gYSBzeXN0ZW0gd2l0aG91dAotCXZlcnNpb25lZCBzeXN0ZW0gbGlicmFyaWVzLgotCi1Nb24gU2VwIDI4IDIxOjMxOjEyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxkLWVsZnZlcnMvdmVycy5leHA6IFJ1biB0ZXN0cyBvbiBhbHBoYS1saW51eC4KLQkqIGxkLWVsZnZlcnMvKi5zeW0sIGxkLWVsZnZlcnMvKi5kc3ltOiBBZGp1c3QgcGF0dGVycyB0byBtYXRjaAotCUFscGhhJ3MgdXNlIG9mIHN0X290aGVyLgotCi0xOTk4LTA5LTI3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbGQtZWxmdmVycy92ZXJzLmV4cCAodmVyczE2LCB2ZXJzMTZhKTogTmV3IHRlc3RzLgotCSogbGQtZWxmdmVycy97dmVyczE2LiosIHZlcnMxNmEuKn06IE5ldyBmaWxlcy4KLQotVGh1IFNlcCAxNyAxNzoxODoxOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogTWFrZSB1bmRlZmluZWQgbGluZSB0ZXN0IGJlIGFuIHhmYWlsCi0JZm9yIGFybS90aHVuYiBlbGYgdG9vbGNoYWlucy4KLQotV2VkIFNlcCAgOSAxNDoxMDoxNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogY2hhbmdlIHRlc3QgZm9yIGVsZi9kd2FyZjIgdGFyZ2V0cy4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQXJtLWVsZiBub3cgcGFzc2VzIHRoaXMgdGVzdC4KLQotV2VkIEF1ZyAxOSAxMTo1OToxOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgYXJtL3RodW1iLWVsZiBleHBlY3RlZCBmYWlsdXJlcy4KLQkKLVRodSBBdWcgMTMgMTI6NDE6NTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogRG9uJ3QgcnVuIHRoZSAtLXN0YXRpYyBib290c3RyYXAKLQl0ZXN0IGlmIHdlIGRvbid0IGhhdmUgYSBzdGF0aWMgbGliYmZkLmEuCi0KLVdlZCBBdWcgMTIgMTU6MTk6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBILkouIEx1IDxoamxAZ251Lm9yZz46Ci0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgeGZhaWxzIGZvciBBbHBoYSBFTEYgdGFyZ2V0cy4KLQotTW9uIEF1ZyAxMCAxNTo0MjoyMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL3dlYWsudCAoLnRleHQsIC5kYXRhKTogRm9jdXMgZGF0YSB0byBiZSB1c2VkLgotCSgvRElTQ0FSRC8pOiBBbGwgdGhlIHJlc3QuCi0JKiBsZC1zY3JpcHRzL3dlYWsxLnMsIGxkLXNjcmlwdHMvd2VhazIuczogUHV0IHN0dWZmIGluIC5kYXRhLgotCi1GcmkgSnVsIDI0IDE4OjM3OjE3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBDcmVhdGUgdG1wZGlyL2dhcyBzdWJkaXJlY3RvcnksIGFkZCBhCi0Jc3ltbGluayB0byBhcy1uZXcsIGFuZCBzZXQgZ2NjX2dhc19mbGFnIHZhcmlhYmxlLgotCSogbGliL2xkLWxpYi5leHAgKGRlZmF1bHRfbGRfY29tcGlsZSk6IElmIHRoZSBjb21waWxlciBhcHBlYXJzIHRvCi0JYmUgZ2NjLCB1c2UgZ2NjX2dhc19mbGFnIHdoZW4gY29tcGlsaW5nLgotCi1UaHUgSnVsIDIzIDEyOjIzOjI5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtZWxmdmVycy92ZXJzLmV4cDogSnVzdCBjaGVjayBmb3IgaT84NiByYXRoZXIgdGhhbiBjaGVja2luZwotCWZvciBpMzg2LCBpNDg2LCBhbmQgaTU4Ni4KLQkob2JqZHVtcF92ZXJzaW9uc3R1ZmYpOiBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBsaW5lLCBkdW1wIHRoZSBmaWxlLgotCi1GcmkgSnVsICAzIDAwOjI3OjQxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9waGRycy5leHA6IFJ1biB0ZXN0IG9uICotKi1lYWJpKi4KLQkqIGxkLXNjcmlwdHMvd2Vhay5leHA6IExpa2V3aXNlLgotCi1XZWQgSnVsICAxIDEwOjUxOjQ2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCB4ZmFpbCBmb3Igdjg1MC4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IGFybSBhbmQgdGh1bWIgUEUgdG9vbGNoYWlucyBub3cgcGFzcwotCXRoZXNlIHRlc3RzLgotCi1GcmkgSnVuIDE5IDE3OjEyOjUyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy93ZWFrLmV4cDogTmV3IHRlc3QuCi0JKiBsZC1zY3JpcHRzL3dlYWsudDogTmV3IGZpbGUuCi0JKiBsZC1zY3JpcHRzL3dlYWsxLnM6IE5ldyBmaWxlLgotCSogbGQtc2NyaXB0cy93ZWFrMi5zOiBOZXcgZmlsZS4KLQotVHVlIEp1biAxNiAxMjo0MDozOCAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwOiBSdW4gdGVzdHMgb24gcG93ZXJwYyBFTEYgdGFyZ2V0cy4KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczEuZHN5bTogQWxsb3cgZm9yIC5zZGF0YS4KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBzZXR1cF94ZmFpbHMgZm9yIFBvd2VyUEMgTGludXguCi0KLUZyaSBNYXkgMjkgMTU6MDI6NTAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgeGZhaWxzIGZvciBwb3dlcnBjKi0qLWVhYmkuCi0gCShydW5fc3JlY190ZXN0KTogT24gbW4xMDIwMCwgZGVmaW5lIF9fdHJ1bmNzaXBzaTJfZG9fZDIuCi0JKiBsZC1zcmVjL3NyMS5jIChfX21haW4pOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gdm9pZC4KLQkqIGxkLXNyZWMvc3IzLmNjIChfX21haW4pOiBMaWtld2lzZS4KLQkoX19idWlsdGluX2RlbGV0ZSwgX19idWlsdGluX25ldyk6IExpa2V3aXNlLgotCShfX2dldF9keW5hbWljX2hhbmRsZXJfY2hhaW4pOiBSZXR1cm4gMC4KLQkoX19nZXRfZWhfY29udGV4dCk6IExpa2V3aXNlLgotCi1UaHUgTWF5IDIxIDE1OjIxOjMzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBBZGQgc3VwcG9ydCBmb3IgdGh1bWItcGUgdGFyZ2V0LgotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHN1cHBvcnQgZm9yIGFybS1wZSBhbmQgdGh1bWItcGUgdGFyZ2V0cy4KLQotTW9uIE1heSAgNCAxNzo1NDoyMCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IFJlbW92ZSBzZXR1cF94ZmFpbHMgZm9yIG02OGstbGludXguCi0KLU1vbiBNYXkgIDQgMTc6MTI6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zaGFyZWQvbWFpbi5jIChzaGxpYl9vdmVycmlkZGVuY2FsbDIpOiBOZXcgZnVuY3Rpb24uCi0JKG1haW4pOiBDYWxsIHNobGliX3NobGliY2FsbDIuCi0JKiBsZC1zaGFyZWQvc2gxLmMgKHNobGliX3NobGliY2FsbDIpOiBOZXcgZnVuY3Rpb24uCi0JKHNobGliX292ZXJyaWRkZW5jYWxsMik6IE5ldyBmdW5jdGlvbi4KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZGF0OiBBZGQgb3V0cHV0IGxpbmUgZm9yIG5ldyB0ZXN0LgotCSogbGQtc2hhcmVkL3N1bjQuZGF0OiBMaWtld2lzZS4KLQotCSogbGQtc3JlYy9zcjMuY2MgKF9fZ2V0X2VoX2NvbnRleHQpOiBOZXcgZnVuY3Rpb24uCi0KLVR1ZSBBcHIgIDcgMTI6NTA6MTcgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBsZC1jZHRlc3QvY2R0ZXN0LWZvby5oIChjbGFzcyBGb28pOiBEZWNsYXJlIGxlbiB0byBiZSBzdGF0aWMgdG8KLQlhdm9pZCBjb21waWxlciB3YXJuaW5nLgotCSogbGQtc3JlYy9zcjMuY2MgKGNsYXNzIEZvbyk6IExpa2V3aXNlLgotCi1UdWUgRmViIDEwIDE2OjQyOjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcjMuY2MgKF9fZ2V0X2R5bmFtaWNfaGFuZGxlcl9jaGFpbik6IE5ldyBmdW5jdGlvbi4KLQotTW9uIEZlYiAgMiAxNDoxNzo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvcGhkcnMuZXhwOiBBZGp1c3QgcGhkcnNfcmVnZXhwIGZvciBhIDY0IGJpdCB0YXJnZXQuCi0KLVRodSBEZWMgMTggMTE6MTM6MjggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogRHVwbGljYXRlZCBBcm0gcGF0Y2ggZm9yIFRodW1iIHRhcmdldHMuCi0KLVR1ZSBEZWMgIDIgMDk6NTA6MTkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQXBwbGllZCBwYXRjaCBmcm9tIFRvbnkuVGhvbXBzb25AYXJtLmNvbSB3aGljaAotCWZpeGVzIEFSTSB0ZXN0cy4KLQotTW9uIERlYyAgMSAxNjoxMjowNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgZXhwZWN0ZWQgZmFpbHVyZXMgb2YgdGVzdHMgMSBhbmQgMiBmb3IgQVJNCi0JY29mZiB0YXJnZXRzLgotCi1XZWQgTm92IDEyIDE0OjE4OjMxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtY2R0ZXN0L2NkdGVzdC1mb28uaCAoY2xhc3MgRm9vKTogRGVjbGFyZSBsZW4gdG8gYmUgaW50IHRvCi0JYXZvaWQgY29tcGlsZXIgd2FybmluZy4KLQkqIGxkLXNyZWMvc3IzLmNjIChjbGFzcyBGb28pOiBMaWtld2lzZS4KLQotTW9uIE5vdiAxMCAxNDoyNTo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi9sZC1saWIuZXhwIChkZWZhdWx0X2xkX3NpbXBsZV9saW5rKTogUGVybWl0IHRoZSBsaW5rZXIgdG8KLQloYXZlIGFueSBuYW1lIHdoZW4gbG9va2luZyBmb3IgZW50cnkgc3ltYm9sIHdhcm5pbmdzLgotCi0JKiBsZC1zcmVjL3NyMy5jYyAoX19laF9wYyk6IERlZmluZS4KLQotTW9uIE9jdCAyMCAxNDozNjozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3IzLmNjOiBBZGQgZGVmaW5pdGlvbnMgZm9yIHRlcm1pbmF0ZSwgX190ZXJtaW5hdGUsIGFuZAotIAlfX3Rocm93LCBzaW5jZSB0aGUgY3VycmVudCBnKysgZXhwZWN0cyB0aGVtIHRvIGJlIGRlZmluZWQuCi0KLUZyaSBPY3QgIDMgMTI6MjQ6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwIChvYmpkdW1wX2VtcHR5dmVyc3R1ZmYpOiBBY2NlcHQgdGhlIG91dHB1dAotCWZpbGUgaWYgdGhlIHN0cmluZyBsaWJjIGFwcGVhcnMgaW4gaXQuCi0JKG9iamR1bXBfdmVyc2lvbnN0dWZmKTogQWNjZXB0IHVuZXhwZWN0ZWQgbGluZXMgaW4gdGhlIG91dHB1dAotCWZpbGUuICBDb21wYXJlIGxpbmVzIHVzaW5nIHN0cmluZyBtYXRjaC4KLQkqIGxkLWVsZnZlcnMvdmVyczYudmVyOiBQZXJtaXQgYW55IHZhbHVlIGluIHRoZSB2bmFfb3RoZXIgZmllbGQuCi0KLVR1ZSBBdWcgMTIgMTY6MDE6MjIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL2Nyb3NzcmVmLmV4cDogQ29ycmVjdCBzdHJpbmcgcXVvdGluZy4KLQotU2F0IEF1ZyAgOSAwMDo1NjowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogQ2hhbmdlIGxkLCBhcywgbm0gYW5kIHN0cmlwIGZyb20gLm5ldyB0bwotCS1uZXcuICBMb2FkIGxkLWxpYi5leHAgcmF0aGVyIHRoYW4gbGQuZXhwLgotCSogbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IFVzZSBsZC1uZXcgcmF0aGVyIHRoYW4gbGQubmV3LgotCSogbGliL2xkLWxpYi5leHA6IFJlbmFtZSBmcm9tIGxpYi9sZC5leHAsIGZvciB0aGUgYmVuZWZpdCBvZgotCURlamFHbnUgY2hhbmdlcy4KLQotVGh1IEp1biAyNiAxMjowNzowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWVsZnZlcnMvdmVycy5leHA6IFVzZSBlZ3JlcCByYXRoZXIgdGhhbiBncmVwIHdoZW4gbG9va2luZyBmb3IKLQlhbiBhbHRlcm5hdGlvbi4gIEZyb20gR3JlZyBNYXJnbyA8Z21hcmdvQGRsLmNvbT4uCi0KLVdlZCBKdW4gMjUgMTI6NDc6MjIgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIG02OGstbGludXggb24gdGVzdHMKLQl3aXRoIG5vbiBQSUMgc2hhcmVkIGxpYnJhcmllcy4KLQotRnJpIEp1biAgNiAxNzozNTo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWVsZnZlcnMvdmVyczYudmVyOiBVcGRhdGUgZm9yIHJlY2VudCBlbGZsaW5rLmggcGF0Y2ggdG8KLQl2ZXJzaW9uIGhhbmRsaW5nLgotCi1XZWQgSnVuICA0IDEyOjA2OjQ4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogRGVmaW5lIF9fX2dldF9keW5hbWljX2hhbmRsZXJfY2hhaW4gYXMgd2VsbC4KLQotRnJpIE1heSAzMCAxMjoyMTozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IERlZmluZSBfX2dldF9keW5hbWljX2hhbmRsZXJfY2hhaW4gd2hlbgotCWxpbmtpbmcuCi0KLU1vbiBNYXkgMTIgMTE6MTc6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFVzZSAkYmFzZV9kaXIgcmF0aGVyIHRoYW4gJG9iamRpciB3aGVuCi0Jc2V0dGluZyBsZC4gIEZyb20gSm9obiBEYXZpZCBBbmdsaW4gPGRhdmVAaGlhdWx5MS5oaWEubnJjLmNhPi4KLQotRnJpIEFwciAyNSAwOTowNzowMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IERlZmluZSB2YXJpb3VzIG91dCBvZiBsaW5lIHByb2xvZ3VlL2VwaWxvZ3VlCi0JZnVuY3Rpb25zIGZvciB0aGUgbW4xMDIwMCB0byBhdm9pZCBuZWVkaW5nIGxpYmdjYy5hLgotCi1XZWQgTWFyIDI2IDEzOjU2OjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogRG9uJ3QgZXhwZWN0IGZhaWx1cmVzIG9uIG1pcHMqLSotZWxmKi4KLQotTW9uIE1hciAxNyAxOToyNzoxMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWVsZnZlcnMvdmVycy5leHA6IERvbid0IHJ1biBvbiBTdW5PUyBvciBBSVguCi0KLVdlZCBNYXIgMTIgMjE6NDQ6MTkgMTk5NyAgRXJpYyBZb3VuZ2RhbGUgIDxlcmljQGFuZGFudGUuamljLmNvbT4KLQotCSogbGQtZWxmdmVycy92ZXJzLmV4cCwgKjogTmV3IHRlc3RzIGZvciBzeW1ib2wgdmVyc2lvbmluZy4KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogU2V0IGFyIGFuZCBzdHJpcC4KLQotRnJpIEZlYiAgNyAxNjo0NzowMiAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IFVzZSBwcnVuZV93YXJuaW5ncyBpbnN0ZWFkIG9mCi0JcHJ1bmVfc3lzdGVtX2NydWQuCi0JKiBsZC1jZHRlc3QvY2R0ZXN0LmV4cDogRGl0dG8uCi0JKiBsZC1zY3JpcHRzL2Nyb3NzcmVmLmV4cDogRGl0dG8uCi0JKiBsZC1zaC9zaC5leHA6IERpdHRvLgotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IERpdHRvLgotCSogbGQtc3JlYy9zcmVjLmV4cDogRGl0dG8uCi0JKiBsaWIvbGQuZXhwOiBEaXR0by4KLQotV2VkIEphbiAyOSAwMDo0NzoyOSAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogbGQtY2R0ZXN0L2NkdGVzdC5leHA6IFB1dCBhIHNsYXNoIGJldHdlZW4gJHNyY2Rpci8kc3ViZGlyLgotCSogbGQtc2NyaXB0cy9zY3JpcHQuZXhwOiBEaXR0by4KLQkqIGxkLXNoL3NoLmV4cDogRGl0dG8uCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogRGl0dG8uCi0JKiBsZC12ZXJzYWRvcy92ZXJzYWRvcy5leHA6IERpdHRvLgotCSogbGliL2xkLmV4cDogRGl0dG8uCi0KLU1vbiBEZWMgMzAgMTc6MDg6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL2Nyb3NzcmVmLmV4cDogRml4IHF1b3RpbmcgZm9yIC0tZGVmc3ltICRnbG9iYWwkLgotCi1UdWUgT2N0ICAxIDE1OjUyOjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliL2xkLmV4cCAoZGVmYXVsdF9sZF92ZXJzaW9uKTogRml4IGZvciBjdXJyZW50IHZlcnNpb24KLQlwcmludGluZy4KLQotRnJpIFNlcCAxMyAxNTo1MTo0NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwOiBEZWZpbmUgJGdsb2JhbCQgZm9yIGhwcGEtZWxmLgotCi1UaHUgQXVnICA4IDE0OjI5OjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9jcm9zczIudDogTWFwIFhDT0ZGIHNlY3Rpb25zIHRvIC50ZXh0IG9yIC5kYXRhLgotCi0JKiBsaWIvbGQuZXhwOiBVc2UgdmVyYm9zZSAtbG9nIGluc3RlYWQgb2YgY2FsbGluZyBib3RoIHZlcmJvc2UgYW5kCi0Jc2VuZF9sb2cuCi0KLVdlZCBBdWcgIDcgMTg6MDA6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL3BoZHJzLmV4cDogTmV3IHRlc3QuCi0JKiBsZC1zY3JpcHRzL3BoZHJzLnMsIGxkLXNjcmlwdHMvcGhkcnMudDogTmV3IGZpbGVzLgotCi1TdW4gQXVnICA0IDIxOjU4OjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9jcm9zc3JlZi5leHA6IE9uIGEyOWsgdGFyZ2V0cywgdXNlIC0tZGVmc3ltIHRvIGRlZmluZQotCVZfU1BJTEwgYW5kIFZfRklMTC4KLQotVGh1IEF1ZyAgMSAxNDoxMDoyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwOiBOZXcgdGVzdC4KLQkqIGxkLXNjcmlwdHMve2Nyb3NzMS5jLCBjcm9zczIuYywgY3Jvc3MzLmN9OiBOZXcgZmlsZXMuCi0JKiBsZC1zY3JpcHRzL3tjcm9zczEudCwgY3Jvc3MyLnR9OiBOZXcgZmlsZXMuCi0KLVNhdCBKdW4gMjkgMTM6NDA6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zaC9zaC5leHA6IEZpeCBkZWJ1Z2dpbmcgbWVzc2FnZXMuCi0JKiBsZC1zaC9zaDEuczogVXNlIC5hbGlnbiA0LgotCi1XZWQgTWF5ICAxIDE2OjQ1OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2gvc2guZXhwOiBVc2UgLU8gd2hlbiBjb21waWxpbmcgd2l0aCAtbXJlbGF4LgotCi1Nb24gQXByIDI5IDEwOjMzOjEwIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogUnVuIHRoZSBzaGFyZWQgbGlicmFyeSB0ZXN0cyBvbgotIAlMaW51eC9tNjhrLgotCi1GcmkgQXByICA1IDE2OjIwOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IFJ1biB0aGUgc2hhcmVkIGxpYnJhcnkgdGVzdHMgb24gTGludXguCi0KLU1vbiBGZWIgMjYgMTI6NDU6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogRG9uJ3QgdXNlIC1mcGljIG9uIE1JUFMgdGFyZ2V0cy4KLQotV2VkIEphbiAzMSAxNTowOTo1NyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCB4ZmFpbHMgZm9yIGhwcGEqLSotKmVsZiouCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogTGlrZXdpc2UuCi0KLUZyaSBKYW4gMjYgMTg6NDM6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogRUxGIHRhcmdldHMgc2hvdWxkIG5vdyBwYXNzIHRoZQotCXVuZGVmaW5lZCBsaW5lIHRlc3QuCi0KLVRodSBKYW4gMjUgMTU6MzY6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1lbXBpYy9lbXBpYy5leHA6IFVwZGF0ZSBmb3IgY2hhbmdlIHRvIE1JUFMgZGlzYXNzZW1ibGVyLgotCi1Nb24gSmFuIDE1IDE1OjA1OjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IEV4cGVjdCBmYWlsdXJlIGZvciBtaXBzKi0qLWlyaXg1KgotCXdoZW4gZG9pbmcgdGhlIC0tc3RhdGljIHRlc3QuCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogUnVuIHRlc3RzIG9uIG1pcHMqLSotaXJpeDUqLgotCi1GcmkgRGVjIDI5IDEyOjMzOjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IE9uIEFJWCwgZG9uJ3QgcGFzcyB0aGUgLWJJIG9wdGlvbgotCXdoZW4gY3JlYXRpbmcgbGQtcGFydGlhbC5vLgotCi1UdWUgRGVjIDI2IDE3OjM3OjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogSWYgcG93ZXJwYyotKi1lYWJpKiwgdXNlIC0tZGVmc3ltIHRvIGRlZmluZQotCV9fZWFiaS4KLQotVHVlIERlYyAxOSAxODowMTowMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBzZXR1cF94ZmFpbHMgZm9yIFhDT0ZGIHRhcmdldHMuCi0KLUZyaSBEZWMgMTUgMTY6MzY6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBPbiBhMjlrIHRhcmdldHMsIHVzZSAtLWRlZnN5bSB0byBkZWZpbmUKLQlWX1NQSUxMIGFuZCBWX0ZJTEwuCi0JKiBsZC1zcmVjL3NyMS5jIChWX1NQSUxMLCBWX0ZJTEwpOiBSZW1vdmUgZGVmaW5pdGlvbnMuCi0JKiBsZC1zcmVjL3NyMy5jYzogTGlrZXdpc2UuCi0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IFJlbW92ZSBpOTYwIENPRkYgc2V0dXBfeGZhaWwuCi0KLVNhdCBEZWMgIDIgMDE6MjA6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBEb24ndCB1c2UgW10gaW4gc2V0dXBfeGZhaWwgZXhwcmVzc2lvbnMuCi0KLUZyaSBEZWMgIDEgMTM6MTg6MTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgc2V0dXBfeGZhaWxzIGZvciBNSVBTIEVMRiB0YXJnZXRzLgotCi1XZWQgTm92IDI5IDEzOjAxOjEwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBpOTYwIENPRkYgdGFyZ2V0cy4KLQotTW9uIE5vdiAyNyAxNDozNjoxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBzZXR1cF94ZmFpbCBjYWxscyBmb3IgaVszNDVdODYtKi1hb3V0Ki4KLQotCSogbGQtc3JlYy9zcjEuYyAoVl9TUElMTCwgVl9GSUxMKTogRGVmaW5lLgotCSogbGQtc3JlYy9zcjMuY2M6IExpa2V3aXNlLgotCi1UdWUgTm92IDIxIDE2OjA1OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtZW1waWMvZW1waWMuZXhwOiBVcGRhdGUgZm9yIGNoYW5nZXMgaW4gb2JqZHVtcCBvdXRwdXQuCi0KLVdlZCBOb3YgMTUgMTc6NDI6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBOZXcgdGVzdHMuCi0JKiBsZC1zcmVjL3NyMS5jLCBsZC1zcmVjL3NyMi5jLCBsZC1zcmVjL3NyMy5jYzogTmV3IGZpbGVzLgotCSogbGliL2xkLmV4cCAobGRfc2ltcGxlX2xpbmspOiBEaXNjYXJkIHdhcm5pbmdzIGFib3V0IG5vdCBiZWluZwotCWFibGUgdG8gZmluZCB0aGUgZW50cnkgc3ltYm9sLgotCi1UdWUgTm92IDE0IDIwOjAzOjU0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2gvc2gyLmMgKF9fbWFpbik6IERlZmluZS4KLQotTW9uIE5vdiAgNiAxNDozOToxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWVtcGljL2VtcGljLmV4cDogQWNjZXB0IGEgLiBpbiB0aGUgYWRkcmVzcyBzeW1ib2wuCi0KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBSdW4gdGVzdHMgb24gcnM2MDAwKi0qLWFpeCogYW5kCi0JcG93ZXJwYyotKi1haXgqLiAgQWRkIGNvZGUgdG8gY3JlYXRlIGFwcHJvcHJpYXRlIGV4cG9ydHMgZmlsZXMsCi0JYW5kIHBhc3MgYXBwcm9wcmlhdGUgY29tcGlsYXRpb24gZmxhZ3MsIGFuZCB0ZXN0IGFnYWluc3QKLQlhcHByb3ByaWF0ZSBleHBlY3RlZCBvdXRwdXQuCi0JKiBsZC1zaGFyZWQveGNvZmYuZGF0OiBOZXcgZmlsZS4KLQkqIGxkLXNoYXJlZC9tYWluLmM6IFB1dCAjaWZuZGVmIFhDT0ZGX1RFU1QgYXJvdW5kIHRlc3RzIHRoYXQgY2FuCi0Jbm90IGJlIGxpbmtlZCB1c2luZyBYQ09GRi4gIFVzZSBzaGxpYl9zaGxpYnZhcjEgYXMgYSBzYW1wbGUKLQlmdW5jdGlvbiBwb2ludGVyLCByYXRoZXIgdGhhbiBzaGxpYl9tYWludmFyLgotCSogbGQtc2hhcmVkL3NoMS5jOiBMaWtld2lzZS4KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZGF0OiBVcGRhdGUgZm9yIGNoYW5nZSBmcm9tIHVzaW5nIHNobGliX21haW52YXIKLQl0byB1c2luZyBzaGxpYl9zaGxpYnZhcjEuCi0JKiBsZC1zaGFyZWQvc3VuNC5kYXQ6IExpa2V3aXNlLgotCi1TYXQgT2N0IDI4IDAxOjU0OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9zY3JpcHQudDogUHV0IC5wciBpbiAudGV4dCwgYW5kIC5ydyBpbiAuZGF0YSwgZm9yCi0JY29udmVuaWVuY2Ugd2hlbiB0ZXN0aW5nIFhDT0ZGLgotCi1UaHUgT2N0IDI2IDIyOjUzOjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IE9uIEFJWCwgcGFzcyAtYkkvbGliL3N5c2NhbGxzLmV4cAotCWFsb25nIHdpdGggLS1zdGF0aWMuCi0KLQkqIGxkLXNjcmlwdHMvc2NyaXB0LnM6IE1ha2Ugc3ltYm9scyBnbG9iYWwuCi0KLUZyaSBPY3QgMjAgMTI6MjI6MTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogQWRkIHNldHVwX3hmYWlscyBmb3IgYXJtKi0qLXBlKi4KLQotRnJpIFNlcCAyOSAxMTowNjoxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBVc2UgLWUgd2hlbiBpbnZva2luZyB0aGUgbGlua2VyLCB0bwotCXByZXZlbnQgdGhlIFN1bk9TIGxpbmtlciBmcm9tIHRyeWluZyB0byBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeS4KLQotVGh1IFNlcCAyOCAxMjozNzoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBSdW4gdGhlIHRlc3RzIG9uIHNwYXJjKi0qLXN1bm9zNCouICBBZGQKLQlhcHByb3ByaWF0ZSBtb2RpZmljYXRpb25zIGFuZCBzZXR1cF94ZmFpbHMuCi0JKiBsZC1zaGFyZWQvc3VuNC5kYXQ6IE5ldyBmaWxlLgotCi1Nb24gU2VwIDE4IDE0OjEyOjU2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliL2xkLmV4cCAoZGVmYXVsdF9sZF92ZXJzaW9uKTogQ2FsbCBwcnVuZV9zeXN0ZW1fY3J1ZC4KLQkoZGVmYXVsdF9sZF9yZWxvY2F0ZSwgZGVmYXVsdF9sZF9saW5rKTogTGlrZXdpc2UuCi0JKGRlZmF1bHRfbGRfc2ltcGxlX2xpbmssIGRlZmF1bHRfbGRfY29tcGlsZSk6IExpa2V3aXNlLgotCShkZWZhdWx0X2xkX2Fzc2VtYmxlLCBkZWZhdWx0X2xkX25tKTogTGlrZXdpc2UuCi0KLUZyaSBTZXAgIDggMTc6MTU6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1jZHRlc3QvY2R0ZXN0LmV4cDogSWYgdGhlIGNvbXBpbGVyIGRvZXMgbm90IGV4aXN0LCBtYXJrIHRoZQotCXRlc3RzIGFzIHVudGVzdGVkIHJhdGhlciB0aGFuIHVucmVzb2x2ZWQuCi0KLVdlZCBBdWcgMjMgMTA6NDY6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZC1zaC9zaC5leHA6IENhbGwgcHJ1bmVfc3lzdGVtX2NydWQgb24gdGhlIG91dHB1dCBvZiBjbXAuCi0KLVR1ZSBBdWcgMTUgMTc6MzU6MzUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL3NjcmlwdC5leHA6IFNwbGl0IHNjcmlwdCB2ZXJpZmljYXRpb24gaW50byBhIHByb2MuCi0JQWRkIHNpbXBsZSB0ZXN0IG9mIE1SSSBzY3JpcHQuCi0JKiBsZC1zY3JpcHRzL3NjcmlwdG0udDogTmV3IGZpbGUuCi0KLVdlZCBKdWwgMjYgMTE6Mzg6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zaC9zaC5leHA6IE1hcmsgYFNIIGNvbmZpcm0gcmVsYXhpbmcnIHRlc3QgdW5yZXNvbHZlZCB3aGVuCi0JYXBwcm9wcmlhdGUuCi0KLU1vbiBKdWwgMjQgMTU6MzQ6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IERlZmluZSBvYmpjb3B5IGlmIGl0IGlzIG5vdCBkZWZpbmVkLgotCSogbGQtc2gvKjogTmV3IHRlc3RzIGZvciBTSCByZWxheGluZy4KLQotCSogbGQtZW1waWMvZW1waWMuZXhwOiBJZiAkQ0MgZG9lcyBub3QgZXhpc3QsIGNhbGwgdW50ZXN0ZWQgcmF0aGVyCi0JdGhhbiB1bnJlc29sdmVkLgotCi1UaHUgSnVsIDIwIDE1OjA5OjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IElmICRDQyBkb2VzIG5vdCBleGlzdCwgbWFyayB0aGUKLQl0ZXN0cyBhcyB1bnRlc3RlZCByYXRoZXIgdGhhbiB1bnJlc29sdmVkLiAgQ2xlYXIgRUxGIHhmYWlscyBmb3IKLQltaXBzKiwgbm90IGp1c3QgbWlwcy4KLQotVHVlIEp1bCAxOCAxMjowMDo0MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIHNoLSotKiBmb3IKLQl1bmRlZmluZWQgbGluZSB0ZXN0LgotCi1GcmkgSnVsIDE0IDEzOjA3OjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IE5ldyB0ZXN0LCB0byBjaGVjayByZXBvcnRpbmcgb2YKLQl1bmRlZmluZWQgc3ltYm9scy4KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuYzogTmV3IGZpbGUuCi0KLU1vbiBKdWwgMTAgMTE6MTM6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC12ZXJzYWRvcy92ZXJzYWRvcy5leHA6IElmIGEgdGVzdCBmYWlscywgcmVwb3J0IGl0IGNvcnJlY3RseToKLQlkb24ndCB0cnkgdG8gcnVuIHRoZSBuZXh0IHRlc3QsIGFuZCBkb24ndCByZXBvcnQgYSBwYXNzIGFzIHdlbGwgYXMKLQlhIGZhaWwuCi0KLU1vbiBKdWwgIDMgMTQ6MjY6MzcgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGQvdGVzdHN1aXRlL3ZlcnNhZG9zLyh0MSx0MikubGQ6IEVuZCBpbiBuZXdsaW5lcy4KLQotTW9uIE1heSAyMiAyMDoxOTozOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsaWIvbGQuZXhwIChkZWZhdWx0X2xkX2NvbXBpbGUpOiBJZiBjYyBhcmd1bWVudCBpcyBtdWx0aXBsZQotCXdvcmRzLCB1c2Ugb25seSB0aGUgZmlyc3Qgd2hlbiB0cnlpbmcgdG8gdmVyaWZ5IHRoZSBhdmFpbGFiaWxpdHkKLQlvZiB0aGUgY29tcGlsZXIuCi0KLU1vbiBGZWIgIDYgMTE6NDY6NDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL2RlZmluZWQudDogTWVudGlvbiAuZGF0YSBhbmQgLmJzcyBleHBsaWNpdGx5LgotCi1UdWUgSmFuIDI0IDE0OjUxOjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IElmIG5vdCBpbiB0aGUgbGQgYnVpbGQgZGlyZWN0b3J5LAotCWNhbGwgdW50ZXN0ZWQgZm9yIGVhY2ggdGVzdCwgcmF0aGVyIHRoYW4gaWdub3JpbmcgaXQuICBJZiBvbmUgdGVzdAotCWZhaWxzLCBnbyBvbiB0byB0aGUgbmV4dCBvbmUgaW5zdGVhZCBvZiByZXR1cm5pbmcuCi0JKiBsZC1jZHRlc3QvY2R0ZXN0LmV4cDogSWYgY29tcGlsYXRpb25zIGZhaWwsIG1hcmsgdGVzdHMgYXMKLQl1bnJlc29sdmVkLgotCSogbGQtZW1waWMvZW1waWMuZXhwOiBMaWtld2lzZS4gIEFsc28sIGFsd2F5cyBwYXNzIHRoZSBzYW1lIHRlc3QKLQluYW1lIHRvIHBhc3Mgb3IgZmFpbC4KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBMaWtld2lzZS4gIEFsc28sIGFsd2F5cyBydW4gYWxsIHRlc3RzLgotCSogbGQtc2NyaXB0cy9kZWZpbmVkLmV4cDogSWYgYXMgb3Igbm0gZmFpbCwgbWFyayB0ZXN0IGFzCi0JdW5yZXNvbHZlZC4gIEFsd2F5cyBwYXNzIHRoZSBzYW1lIHRlc3QgbmFtZSB0byBwYXNzIG9yIGZhaWwuCi0JKiBsZC1zY3JpcHRzL3NjcmlwdC5leHA6IExpa2V3aXNlLgotCSogbGQtc2NyaXB0cy9zaXplb2YuZXhwOiBMaWtld2lzZS4KLQotV2VkIEphbiAxMSAxMTo0ODozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvc2l6ZW9mLmV4cDogTmV3IHRlc3QsIGJhc2VkIG9uIGJ1ZyByZXBvcnQgZnJvbQotCWFuZGVycy5ibG9tZGVsbEBjb250cm9sLmx0aC5zZS4KLQkqIGxkLXNjcmlwdHMvc2l6ZW9mLnM6IE5ldyBmaWxlLgotCSogbGQtc2NyaXB0cy9zaXplb2YudDogTmV3IGZpbGUuCi0KLVdlZCBKYW4gIDQgMTg6NTY6MjcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsaWIvbGQuZXhwOiBVc2UgW3doaWNoICRsZF0gcmF0aGVyIHRoYW4gW2ZpbGUgZXhpc3RzICRsZF0gdG8gc2VlCi0JaWYgdGhlIGxpbmtlciBleGlzdHMuCi0KLVdlZCBEZWMgMTQgMTY6Mzk6MDMgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGliL2xkLmV4cCAocHJ1bmVfc3lzdGVtX2NydWQpOiBEZWZpbmUgaWYgbm90IGFscmVhZHkgZGVmaW5lZCwKLQlpbiBjYXNlIHRoZSB1c2VyIGlzbid0IHVzaW5nIHRoZSBuZXdlc3QgRGVqYUdudSB2ZXJzaW9uIHRoYXQgd2UKLQloYXZlbid0IHJlbGVhc2VkIHRvIHRoZSBuZXQgeWV0LgotCi1GcmkgRGVjICAyIDE0OjE3OjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogRGVmaW5lIG9iamR1bXAgaWYgaXQgaXMgbm90IGRlZmluZWQuCi0JKiBsZC1lbXBpYy8qOiBOZXcgdGVzdHMgdG8gdGVzdCAtbWVtYmVkZGVkLXBpYyBjb2RlLgotCi1Nb24gTm92IDI4IDExOjI0OjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IFBhc3MgY21wIG91dHB1dCB0aHJvdWdoCi0JcHJ1bmVfc3lzdGVtX2NydWQuCi0JKiBsZC1jZHRlc3QvY2R0ZXN0LmV4cDogUGFzcyBkaWZmIG91dHB1dCB0aHJvdWdoCi0JcHJ1bmVfc3lzdGVtX2NydWQuCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogUmVtb3ZlIHVudXNlZCBhbmQgdXNlbGVzcyBwcm9jIGxkX2xvYWQuCi0KLVN1biBPY3QgMzAgMTM6MDI6MzQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsaWIvbGQuZXhwIChkZWZhdWx0X2xkX2NvbXBpbGUpOiBSZW1vdmUgdGhlIG91dHB1dCBmaWxlIGJlZm9yZQotCWNvbXBpbGluZy4KLQotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IE1vdmUgY29tbW9uIHRlc3QgY29kZSBpbnRvIGEgcHJvY2VkdXJlLgotCUFkZCB0ZXN0cyBmb3IgY29tcGlsaW5nIHRoZSBub24gc2hhcmVkIGNvZGUgUElDLgotCSogbGQtc2hhcmVkL21haW4uYyAobWFpbik6IENhbGwgbWFpbl9jYWxsZWQsIGFuZCBwcmludCB0aGUgcmVzdWx0LgotCSogbGQtc2hhcmVkL3NoYXJlZC5kYXQ6IEFkanVzdCBhY2NvcmRpbmdseS4KLQotVGh1IE9jdCAyNyAxNzozMDoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkLXNoYXJlZDogTmV3IGRpcmVjdG9yeSwgd2l0aCBuZXcgZmlsZXMgdG8gdGVzdCBnZW5lcmF0aW5nIEVMRgotCXNoYXJlZCBsaWJyYXJpZXMuCi0KLQkqIGxpYi9sZC5leHAgKGRlZmF1bHRfbGRfY29tcGlsZSk6IElmIHRoZSBjb21waWxhdGlvbiB3b3JrZWQsIGJ1dAotCW5vIG9iamVjdCBmaWxlIHdhcyBjcmVhdGVkLCBjaGVjayB0byBzZWUgaWYgdGhlIGNvbXBpbGVyIGZvb2xpc2hseQotCWlnbm9yZWQgdGhlIC1vIHN3aXRjaCB3aGVuIGNvbXBpbGluZywgYW5kIG1vdmUgdGhlIHJlc3VsdGluZwotCW9iamVjdCBpZiBpdCBkaWQuCi0KLVRodSBTZXAgMjkgMTI6MzY6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBWTVMgZG9lcyBub3QgcGVybWl0cyBgLicgaW4gZGlyZWN0b3J5IG5hbWVzLiAgUmVuYW1lZAotCWxkLmJvb3RzdHJhcCB0byBsZC1ib290c3RyYXAsIGxkLmNkdGVzdCB0byBsZC1jZHRlc3QsIGFuZAotCWxkLnNjcmlwdHMgdG8gbGQtc2NyaXB0cy4KLQotV2VkIFNlcCAyOCAxMjoxODo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogU2V0IHZhcmlhYmxlcyBhcyBhbmQgbm0uICBDcmVhdGUgdG1wZGlyIGlmCi0JaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KLQkqIGxkLmJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBEb24ndCBjcmVhdGUgdG1wZGlyIGhlcmUuCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LmV4cDogTGlrZXdpc2UuCi0JKiBsZC5zY3JpcHRzL2RlZmluZWQuZXhwOiBMaWtld2lzZS4gIEFsc28sIGRvbid0IHNldCBhcyBhbmQgbm0KLQloZXJlLiAgQ2hhbmdlIHBlcnJvciBmb3Igbm8gdmFyaWFibGVzIGZvdW5kIHRvIGZhaWwuCi0JKiBsZC5zY3JpcHRzL3NjcmlwdC5leHA6IE5ldyB0ZXN0LgotCSogbGQuc2NyaXB0cy9zY3JpcHQudCwgbGQuc2NyaXB0cy9zY3JpcHQuczogTmV3IGZpbGVzLgotCi1UdWUgU2VwIDI3IDE0OjU5OjUxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGQuc2NyaXB0czogTmV3IGRpcmVjdG9yeS4KLQkqIGxkLnNjcmlwdHMvZGVmaW5lZC5leHAsIGxkLnNjcmlwdHMvZGVmaW5lZC5zOiBOZXcgZmlsZXMuCi0JKiBsZC5zY3JpcHRzL2RlZmluZWQudDogTmV3IGZpbGUuCi0JKiBsaWIvbGQuZXhwIChkZWZhdWx0X2xkX3NpbXBsZV9saW5rKTogTmV3IGZ1bmN0aW9uLgotCShkZWZhdWx0X2xkX2Fzc2VtYmxlLCBkZWZhdWx0X2xkX25tKTogTmV3IGZ1bmN0aW9ucy4KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogUmVuYW1lIGZyb20gdW5peC1sZC5leHAuCi0JKGxkX3NpbXBsZV9saW5rLCBsZF9hc3NlbWJsZSwgbGRfbm0pOiBOZXcgZnVuY3Rpb25zLgotCi0JKiBjb25maWcvdW5peC1sZC5leHA6IFNldCBsZCB1c2luZyBmaW5kZmlsZS4KLQkqIGxpYi9sZC5leHAgKGRlZmF1bHRfbGRfcmVsb2NhdGUpOiBSZXR1cm4gYSB2YWx1ZS4gIENoYW5nZSBmb3JtYXQKLQlvZiBsb2cgbWVzc2FnZXMuCi0JKGRlZmF1bHRfbGRfY29tcGlsZSk6IExpa2V3aXNlLgotCShkZWZhdWx0X2xkX2xpbmspOiBMaWtld2lzZS4gIEFsc28sIGRvbid0IGluY2x1ZGUgJEJGRExJQiBhbmQKLQkkTElCSUJFUlRZIGluIGxpbmsuCi0JKiBsZC5ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogUmV3cml0ZS4KLQkqIGxkLmNkdGVzdC9jZHRlc3QuZXhwOiBSZXdyaXRlLgotCSogbGQuY2R0ZXN0L2NkdGVzdC1mb28uY2M6IFVwZGF0ZSBmcm9tIHRvcCBsZXZlbCBsZCBkaXJlY3RvcnkuCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LWZvby5oOiBMaWtld2lzZS4KLQkqIGxkLmNkdGVzdC9jZHRlc3QtbWFpbi5jYzogTGlrZXdpc2UuCi0KLUZyaSBNYXkgMjcgMDk6MzU6MDQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGxkLmNkdGVzdC9jZHRlc3QuZXhwOiBEb24ndCBsb29rIGZvciAkcmVzdWx0IGJlZm9yZSBpdCdzCi0JZGVmaW5lZC4KLQotVHVlIE1heSAxNyAxNTowNjo0OSAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkLmJvb3RzdHJhcC9ib290c3RyYXAuZXhwLCBsaWIvbGQuZXhwOiBSZXBsYWNlIGVycm9yIHByb2MKLQkgIGNhbGxzIHdpdGggcGVycm9yIGNhbGxzLgotCi1XZWQgTWF5IDExIDE2OjQ3OjQ2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogbGQuY2R0ZXN0L2NkdGVzdC1iYXIuY2M6IFJlbmFtZWQgZnJvbSBjZHRlc3QtZnVuYy5jYy4KLQkqIGxkLmNkdGVzdC9jZHRlc3QuZXhwOiBBZGp1c3RlZC4KLQotRnJpIEphbiAyOCAxMzoyNTo0MSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsaWIvbGQuZXhwIChzaW1wbGVfZGlmZik6IEluZGljYXRlIGZhaWx1cmUgaWYgZmlsZXMgaGF2ZQotCWRpZmZlcmVudCBudW1iZXJzIG9mIGxpbmVzLiAgRG9uJ3QgbXVjayB3aXRoICRkaWZmZXJlbmNlcyB0byBhdm9pZAotCWluZGljYXRpbmcgYSBwYXNzLCBqdXN0IHJldHVybi4KLQotCSogdGVzdHN1aXRlL2xkLmNkdGVzdC97Y2R0ZXN0LWZvby5oLGNkdGVzdC1mb28uY2MsY2R0ZXN0LW1haW4uY2N9OgotCUZpeCB0ZXN0IGNhc2UgdG8gYmUgdmFsaWQgQU5TSSBDKysuICBEb24ndCByZXF1aXJlIHVzZSBvZiBoZWFkZXIKLQlmaWxlcywgc28gIi4uL2djYy94Z2NjIC1CLi4vZ2NjLyIgY2FuIGJlIHVzZWQgZm9yIENYWC4KLQkqIHRlc3RzdWl0ZS9sZC5jZHRlc3QvY2R0ZXN0LmV4cDogQ29tYmluZSAicm0iIGxpbmVzLiAgQWRkIHNvbWUKLQljb21tZW50YXJ5IG9uIHRoaW5ncyB0aGF0IGFyZSBzdGlsbCBicm9rZW4gd2l0aCB0aGlzIHRlc3QgY2FzZS4KLQotRnJpIFNlcCAxMCAwOTo1ODoyMyAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiB0ZXN0c3VpdGUvbGQuY2R0ZXN0L2NkdGVzdC5leHA6IEFkZGVkIENYWEZMQUdTIHRvIGNvbXBpbGUgc3RhZ2UuCi0KLVRodSBBdWcgMTIgMTY6MDU6MzcgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogdGVzdHN1aXRlL2xpYi9sZC5leHA6IGFkZCBjb21waWxlciBhbmQgbGlua2VyIHN1cHBvcnQKLQkqIHRlc3RzdWl0ZS9jb25maWcvdW5peC1sZC5leHA6IGFkZCBjb21waWxlciBhbmQgbGlua2VyIHN1cHBvcnQKLQkqIHRlc3RzdWl0ZS9sZC5ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogZml4ZWQgdG8gZG8gcGFydGlhbCBsaW5rcwotCSogdGVzdHN1aXRlL2xkLmNkdGVzdC9jZHRlc3QuZXhwOiBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHRlc3RzY2FzZQotCi1XZWQgQXVnICA0IDIxOjAwOjE4IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIHRlc3RzdWl0ZS9saWIvbGQuZXhwOiBuZXcgZmlsZQotCSogdGVzdHN1aXRlL2NvbmZpZy91bml4LWxkLmV4cDogbmV3IGZpbGUKLQkqIHRlc3RzdWl0ZS9sZC5ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogbmV3IGZpbGUKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAgYi9sZC90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTBmZGVhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotIyBCYXNpYyBleHBlY3Qgc2NyaXB0IGZvciBMRCBSZWdyZXNzaW9uIFRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IEplZmZyZXkgV2hlYXQgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLSMKLQotaWYgIVtpbmZvIGV4aXN0cyBsZF0gdGhlbiB7Ci0gICAgc2V0IGxkIFtmaW5kZmlsZSAkYmFzZV9kaXIvbGQtbmV3ICRiYXNlX2Rpci9sZC1uZXcgW3RyYW5zZm9ybSBsZF1dCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgYXNdIHRoZW4gewotICAgIHNldCBhcyBbZmluZGZpbGUgJGJhc2VfZGlyLy4uL2dhcy9hcy1uZXcgJGJhc2VfZGlyLy4uL2dhcy9hcy1uZXcgW3RyYW5zZm9ybSBhc11dCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgbm1dIHRoZW4gewotICAgIHNldCBubSBbZmluZGZpbGUgJGJhc2VfZGlyLy4uL2JpbnV0aWxzL25tLW5ldyAkYmFzZV9kaXIvLi4vYmludXRpbHMvbm0tbmV3IFt0cmFuc2Zvcm0gbm1dXQotfQotCi1pZiAhW2luZm8gZXhpc3RzIG9iamR1bXBdIHRoZW4gewotICAgIHNldCBvYmpkdW1wIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vYmludXRpbHMvb2JqZHVtcF0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBvYmpjb3B5XSB0aGVuIHsKLSAgICBzZXQgb2JqY29weSBbZmluZGZpbGUgJGJhc2VfZGlyLy4uL2JpbnV0aWxzL29iamNvcHldCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgYXJdIHRoZW4gewotICAgIHNldCBhciBbZmluZGZpbGUgJGJhc2VfZGlyLy4uL2JpbnV0aWxzL2FyXQotfQotCi1pZiAhW2luZm8gZXhpc3RzIHN0cmlwXSB0aGVuIHsKLSAgICBzZXQgc3RyaXAgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9iaW51dGlscy9zdHJpcC1uZXcgJGJhc2VfZGlyLy4uL2JpbnV0aWxzL3N0cmlwLW5ldyBbdHJhbnNmb3JtIHN0cmlwXV0KLX0KLQotaWYgeyFbZmlsZSBpc2RpcmVjdG9yeSB0bXBkaXJdfSB0aGVuIHsKLSAgICBjYXRjaCAiZXhlYyBta2RpciB0bXBkaXIiIHN0YXR1cwotfQotCi0jIE1ha2UgYSBzeW1saW5rIGZyb20gdG1wZGlyL2FzIHRvIHRoZSBhc3NlbWJsZXIgaW4gdGhlIGJ1aWxkIHRyZWUsIHNvCi0jIHRoYXQgd2UgY2FuIHVzZSBhIC1CIG9wdGlvbiB0byBnY2MgdG8gZm9yY2UgaXQgdG8gdXNlIHRoZSBuZXdseQotIyBidWlsdCBhc3NlbWJsZXIuCi1pZiB7IVtmaWxlIGlzZGlyZWN0b3J5IHRtcGRpci9nYXNdfSB0aGVuIHsKLSAgICBjYXRjaCAiZXhlYyBta2RpciB0bXBkaXIvZ2FzIiBzdGF0dXMKLSAgICBjYXRjaCAiZXhlYyBsbiAtcyAuLi8uLi8uLi9nYXMvYXMtbmV3IHRtcGRpci9nYXMvYXMiIHN0YXR1cwotfQotc2V0IGdjY19nYXNfZmxhZyAiLUJbcHdkXS90bXBkaXIvZ2FzLyIKLQotIyBsb2FkIHRoZSB1dGlsaXR5IHByb2NlZHVyZXMKLWxvYWRfbGliIGxkLWxpYi5leHAKLQotcHJvYyBnZXRfbGlua19maWxlcyB7dmFybmFtZX0gewotICAgIGdsb2JhbCAkdmFybmFtZQotICAgIGdsb2JhbCB0YXJnZXRfdHJpcGxldAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgQ0MKLSAgICBpZiAhW2luZm8gZXhpc3RzICR2YXJuYW1lXSB7Ci0Jc2V0IHN0YXR1cyBbY2F0Y2ggImV4ZWMgc2ggLWMgXCJob3N0PSckdGFyZ2V0X3RyaXBsZXQnICYmIENDPSckQ0MnICYmIC4gJHNyY2Rpci8uLi9jb25maWd1cmUuaG9zdCAmJiBldmFsIGVjaG8gXFwkJHZhcm5hbWVcIiIgcmVzdWx0XQotCWlmICRzdGF0dXMgeyBlcnJvciAiRXJyb3IgZ2V0dGluZyBuYXRpdmUgbGluayBmaWxlczogJHJlc3VsdCIgfQotCXNldCAkdmFybmFtZSAkcmVzdWx0Ci0gICAgfQotfQotCi1wcm9jIGdldF90YXJnZXRfZW11bCB7fSB7Ci0gICAgZ2xvYmFsIHRhcmdldF90cmlwbGV0Ci0gICAgZ2xvYmFsIHNyY2RpcgotICAgIHNldCBzdGF0dXMgW2NhdGNoICJleGVjIHNoIC1jIFwidGFyZz0nJHRhcmdldF90cmlwbGV0JyAmJiAuICRzcmNkaXIvLi4vY29uZmlndXJlLnRndCAmJiBlY2hvIFxcXCR0YXJnX2VtdWxcIiIgcmVzdWx0XQotICAgIGlmICRzdGF0dXMgeyBlcnJvciAiRXJyb3IgZ2V0dGluZyBlbXVsYXRpb24gbmFtZTogJHJlc3VsdCIgfQotICAgIHJldHVybiAkcmVzdWx0Ci19Ci0KLWlmIFtpc25hdGl2ZV0gewotICAgIGZvcmVhY2ggeCB7SE9TVElOR19DUlQwIEhPU1RJTkdfTElCU30gewotCWdldF9saW5rX2ZpbGVzICR4Ci0gICAgfQotfSBlbHNlIHsKLSAgICBmb3JlYWNoIHgge0hPU1RJTkdfQ1JUMCBIT1NUSU5HX0xJQlN9IHsgc2V0ICR4ICIiIH0KLX0KLWlmICFbaW5mbyBleGlzdHMgSE9TVElOR19FTVVdIHsgc2V0IEhPU1RJTkdfRU1VICItbSBbZ2V0X3RhcmdldF9lbXVsXSIgfQotCi0jCi0jIGxkX3ZlcnNpb24gLS0gZXh0cmFjdCBhbmQgcHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGxkIGNvbXBpbGVyIChHQ0MpCi0jCi1wcm9jIGxkX3ZlcnNpb24ge30gewotICAgIGdsb2JhbCBsZAotICAgIGRlZmF1bHRfbGRfdmVyc2lvbiAkbGQKLX0KLQotIwotIyBsZF9leGl0IC0tIGp1c3QgYSBzdHViIGZvciBsZAotIwotcHJvYyBsZF9leGl0IHt9IHsKLX0KLQotIwotIyBsZF9zdGFydCAKLSMJcmVsaW5rIHRoZSBsaW5rZXIKLSMKLXByb2MgbGRfc3RhcnQgeyBsZCB0YXJnZXQgfSB7Ci0JIwotfQotCi0jCi0jIGxkX3JlbG9jYXRlIAotIwlsaW5rIGFuIG9iamVjdCB1c2luZyByZWxvY2F0aW9uCi0jCi1wcm9jIGxkX3JlbG9jYXRlIHsgbGQgdGFyZ2V0IG9iamVjdHMgfSB7Ci0JZGVmYXVsdF9sZF9yZWxvY2F0ZSAkbGQgJHRhcmdldCAkb2JqZWN0cwotfQotCi0jCi0jIGxkX2xpbmsgCi0jCWxpbmsgYSBwcm9ncmFtIHVzaW5nIGxkCi0jCi1wcm9jIGxkX2xpbmsgeyBsZCB0YXJnZXQgb2JqZWN0cyB9IHsKLQlkZWZhdWx0X2xkX2xpbmsgJGxkICR0YXJnZXQgJG9iamVjdHMKLX0KLQotIwotIyBsZF9zaW1wbGVfbGluayAKLSMJbGluayBhIHByb2dyYW0gdXNpbmcgbGQsIHdpdGhvdXQgaW5jbHVkaW5nIGFueSBsaWJyYXJpZXMKLSMKLXByb2MgbGRfc2ltcGxlX2xpbmsgeyBsZCB0YXJnZXQgb2JqZWN0cyB9IHsKLQlkZWZhdWx0X2xkX3NpbXBsZV9saW5rICRsZCAkdGFyZ2V0ICRvYmplY3RzCi19Ci0KLSMKLSMgbGRfY29tcGlsZSAKLSMJY29tcGlsZSBhbiBvYmplY3QgdXNpbmcgJGNjCi0jCi1wcm9jIGxkX2NvbXBpbGUgeyBjYyBzb3VyY2Ugb2JqZWN0IH0gewotCWRlZmF1bHRfbGRfY29tcGlsZSAkY2MgJHNvdXJjZSAkb2JqZWN0IAotfQotCi0jCi0jIGxkX2Fzc2VtYmxlCi0jCWFzc2VtYmxlIGEgZmlsZQotIwotcHJvYyBsZF9hc3NlbWJsZSB7IGFzIHNvdXJjZSBvYmplY3QgfSB7Ci0JZGVmYXVsdF9sZF9hc3NlbWJsZSAkYXMgJHNvdXJjZSAkb2JqZWN0IAotfQotCi0jCi0jIGxkX25tCi0jCXJ1biBubSBvbiBhIGZpbGUKLSMKLXByb2MgbGRfbm0geyBubSBvYmplY3QgfSB7Ci0JZGVmYXVsdF9sZF9ubSAkbm0gJG9iamVjdAotfQotCi0jCi0jIGxkX2V4ZWMKLSMJZXhlY3V0ZSBpdGhlIHRhcmdldAotIwotcHJvYyBsZF9leGVjIHsgdGFyZ2V0IG91dHB1dCB9IHsKLQlkZWZhdWx0X2xkX2V4ZWMgJHRhcmdldCAkb3V0cHV0Ci19Ci0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU0YjgyMC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBMRCBCb290c3RyYXAgVGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBKZWZmcmV5IFdoZWF0IChjYXNzaWR5QGN5Z251cy5jb20pCi0jIFJld3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIChpYW5AY3lnbnVzLmNvbSkKLSMKLQotIyBNYWtlIHN1cmUgdGhhdCBsZCBjYW4gYm9vdHN0cmFwIGl0c2VsZi4KLQotIyBUaGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIGlmIGxkIGdlbmVyYXRlcyBuYXRpdmUgZXhlY3V0YWJsZXMuCi1pZiAhW2lzbmF0aXZlXSB7Ci0gICAgcmV0dXJuCi19Ci0KLSMgQm9vdHN0cmFwIGxkLiAgRmlyc3QgbGluayB0aGUgb2JqZWN0IGZpbGVzIHRvZ2V0aGVyIHVzaW5nIC1yLCBpbgotIyBvcmRlciB0byB0ZXN0IC1yLiAgVGhlbiBsaW5rIHRoZSByZXN1bHQgaW50byBhbiBleGVjdXRhYmxlLCBsZDEsIHRvCi0jIHJlYWxseSB0ZXN0IC1yLiAgVXNlIGxkMSB0byBsaW5rIGEgZnJlc2ggbGQsIGxkMi4gIFVzZSBsZDIgdG8gbGluayBhCi0jIG5ldyBsZCwgbGQzLiAgbGQyIGFuZCBsZDMgc2hvdWxkIGJlIGlkZW50aWNhbC4KLQotZm9yZWFjaCBmbGFncyB7IiIgIi0tc3RhdGljIiAiLS10cmFkaXRpb25hbC1mb3JtYXQiICItLW5vLWtlZXAtbWVtb3J5In0gewotICAgIGlmIHsiJGZsYWdzIiAhPSAiIn0geyAKLQlzZXQgdGVzdG5hbWUgImJvb3RzdHJhcCB3aXRoICRmbGFncyIKLSAgICB9IGVsc2UgewotCXNldCB0ZXN0bmFtZSAiYm9vdHN0cmFwIgotICAgIH0KLQotICAgICMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBpZiB3ZSBoYXZlIHRoZSBsZCBidWlsZCBkaXJlY3RvcnksCi0gICAgIyBzaW5jZSB3ZSBuZWVkIHRoZSBvYmplY3QgZmlsZXMuCi0gICAgaWYgeyRsZCAhPSAiJG9iamRpci9sZC1uZXcifSB7Ci0JdW50ZXN0ZWQgJHRlc3RuYW1lCi0JY29udGludWUKLSAgICB9Ci0KLSAgICAjIElmIHdlIG9ubHkgaGF2ZSBhIHNoYXJlZCBsaWJiZmQsIHdlIHByb2JhYmx5IGNhbid0IHJ1biB0aGUKLSAgICAjIC0tc3RhdGljIHRlc3QuCi0gICAgaWYgeyAkZmxhZ3MgPT0gIi0tc3RhdGljIiAmJiAhIFtzdHJpbmcgbWF0Y2ggIipsaWJiZmQuYSoiICRCRkRMSUJdIH0gdGhlbiB7Ci0JdW50ZXN0ZWQgJHRlc3RuYW1lCi0JY29udGludWUKLSAgICB9Ci0KLSAgICBpZiAhW2xkX3JlbG9jYXRlICRsZCB0bXBkaXIvbGQtcGFydGlhbC5vICIkZmxhZ3MgJE9GSUxFUyJdIHsKLQlmYWlsICR0ZXN0bmFtZQotCWNvbnRpbnVlCi0gICAgfQotCi0gICAgIyBPbiBBSVgsIHlvdSBuZWVkIHRvIHNwZWNpZnkgYW4gaW1wb3J0IGxpc3Qgd2hlbiB1c2luZyAtLXN0YXRpYy4KLSAgICAjIFlvdSBvbmx5IHdhbnQgdGhlIGltcG9ydCBsaXN0IHdoZW4gY3JlYXRpbmcgdGhlIGZpbmFsCi0gICAgIyBleGVjdXRhYmxlLgotICAgIGlmIFtpc3RhcmdldCAiKi0qLWFpeCoiXSB7Ci0JaWYgeyIkZmxhZ3MiID09ICItLXN0YXRpYyJ9IHsKLQkgICAgc2V0IGZsYWdzICItLXN0YXRpYyAtYkk6L2xpYi9zeXNjYWxscy5leHAiCi0JfQotICAgIH0KLQotICAgICMgT24gSXJpeCA1LCBsaW5raW5nIHdpdGggLS1zdGF0aWMgb25seSB3b3JrcyBpZiBhbGwgdGhlIGZpbGVzIGFyZQotICAgICMgY29tcGlsZWQgdXNpbmcgLW5vbl9zaGFyZWQuCi0gICAgaWYgeyIkZmxhZ3MiID09ICItLXN0YXRpYyJ9IHsKLQlzZXR1cF94ZmFpbCAibWlwcyotKi1pcml4NSoiCi0gICAgfQotCi0gICAgaWYgIVtsZF9saW5rICRsZCB0bXBkaXIvbGQxICIkZmxhZ3MgdG1wZGlyL2xkLXBhcnRpYWwubyAkQkZETElCICRMSUJJQkVSVFkiXSB7Ci0JZmFpbCAkdGVzdG5hbWUKLQljb250aW51ZQotICAgIH0KLQotICAgIGlmICFbbGRfbGluayB0bXBkaXIvbGQxIHRtcGRpci9sZDIgIiRmbGFncyAkT0ZJTEVTICRCRkRMSUIgJExJQklCRVJUWSJdIHsKLQlmYWlsICR0ZXN0bmFtZQotCWNvbnRpbnVlCi0gICAgfQotCi0gICAgaWYgIVtsZF9saW5rIHRtcGRpci9sZDIgdG1wZGlyL2xkMyAiJGZsYWdzICRPRklMRVMgJEJGRExJQiAkTElCSUJFUlRZIl0gewotCWZhaWwgJHRlc3RuYW1lCi0JY29udGludWUKLSAgICB9Ci0KLSAgICBzZW5kX2xvZyAiY21wIHRtcGRpci9sZDIgdG1wZGlyL2xkM1xuIgotICAgIHZlcmJvc2UgImNtcCB0bXBkaXIvbGQyIHRtcGRpci9sZDMiCi0gICAgY2F0Y2ggImV4ZWMgY21wIHRtcGRpci9sZDIgdG1wZGlyL2xkMyIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlwYXNzICR0ZXN0bmFtZQotICAgIH0gZWxzZSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIgMQotCi0JZmFpbCAkdGVzdG5hbWUKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1iYXIuY2MgYi9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1iYXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MDAwZTMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtYmFyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8gdGVzdCBwcm9ncmFtIGZvciBDbGFzcyBGb28KLQotI2luY2x1ZGUgImNkdGVzdC1mb28uaCIKLQotc3RhdGljIEZvbyBzdGF0aWNfZm9vKCAic3RhdGljX2ZvbyIpOyAKLQotRm9vIGYoKQotewotICAgIEZvbyB4OwotICAgIHJldHVybiB4OwotfQotCi12b2lkIGcoKQotewotICAgIEZvbyBvdGhlcl9mb28xID0gRm9vKCAib3RoZXJfZm9vMSIpLCBvdGhlcl9mb28yID0gRm9vKCAib3RoZXJfZm9vMiIpOwotICAgIG90aGVyX2ZvbzIgPSBvdGhlcl9mb28xOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtZm9vLmNjIGIvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtZm9vLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTVlMzNjLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWZvby5jYworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vIENsYXNzIEZvbwotI3ByYWdtYSBpbXBsZW1lbnRhdGlvbgotCi0KLS8vIFdlIGRvbid0IHVzZSBoZWFkZXIgZmlsZXMsIHNpbmNlIHdlIG9ubHkgd2FudCB0byBzZWUsIHdoZXRoZXIgdGhlCi0vLyBjb21waWxlciBpcyBpbnN0YWxsZWQgcHJvcGVybHkuCi0vLwotI2lmIChfX0dOVUdfXyA9PSAyKQotdHlwZWRlZiBfX1NJWkVfVFlQRV9fIHNpemVfdDsKLSNlbHNlCi10eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3Q7Ci0jZW5kaWYKLQotZXh0ZXJuICJDIiB7Ci0gICAgY2hhciAqc3RybmNweSAoY2hhciogZGVzdCwgY29uc3QgY2hhciogZGVzdCwgc2l6ZV90IGxlbik7Ci0gICAgaW50IHByaW50ZiAoY29uc3QgY2hhciosIC4uLik7Ci19OwotCi0jaW5jbHVkZSAiY2R0ZXN0LWZvby5oIgotCi1pbnQgRm9vOjpmb29zID0gMDsKLQotdm9pZCBGb286OmluaXRfZm9vICgpCi17Ci0gICAgcHJpbnRmICgiQlJPS0VOTFkgY2FsbGluZyBGb286OmluaXRfZm9vIGZyb20gX19pbml0X3N0YXJ0OyBzaXplX29mKEZvbykgPSAlZFxuIiwgc2l6ZW9mKEZvbykpOwotICAgIGZvb3MgPSBGT09MSVNIX05VTUJFUjsKLX0KLQotCi1Gb286OkZvbyAoKQotewotICAgIGkgPSArK2Zvb3M7Ci0gICAgc3RybmNweSAobWVzc2FnZSwgImRlZmF1bHQtZm9vIiwgbGVuKTsKLSNpZmRlZiBXSVRIX0FERFIKLSAgICBwcmludGYgKCJDb25zdHJ1Y3RpbmcgRm9vKCVkKSBcImRlZmF1bHQtZm9vXCIgYXQgJTA4eFxuIiwgaSwgdGhpcyk7Ci0jZWxzZQotICAgIHByaW50ZiAoIkNvbnN0cnVjdGluZyBGb28oJWQpIFwiZGVmYXVsdC1mb29cIlxuIiwgaSk7Ci0jZW5kaWYKLX0KLQotRm9vOjpGb28gKGNoYXIqIG1zZykKLXsKLSAgICBpID0gKytmb29zOwotICAgIHN0cm5jcHkoIG1lc3NhZ2UsIG1zZywgbGVuKTsKLSNpZmRlZiBXSVRIX0FERFIKLSAgICBwcmludGYgKCAiQ29uc3RydWN0aW5nIEZvbyglZCkgXCIlc1wiIGF0ICUwOHhcbiIsIGksIG1lc3NhZ2UsIHRoaXMpOwotI2Vsc2UKLSAgICBwcmludGYgKCAiQ29uc3RydWN0aW5nIEZvbyglZCkgXCIlc1wiXG4iLCBpLCBtZXNzYWdlKTsKLSNlbmRpZgotfQotCi0KLUZvbzo6Rm9vIChjb25zdCBGb28mIGZvbykKLXsKLSAgICBpID0gKytmb29zOwotI2lmZGVmIFdJVEhfQUREUgotICAgIHByaW50ZiAoIkluaXRpYWxpemluZyBGb28oJWQpIFwiJXNcIiBhdCAlMDh4IHdpdGggRm9vKCVkKSAlMDh4XG4iLCAKLQkgICAgaSwgZm9vLm1lc3NhZ2UsIHRoaXMsIGZvby5pLCAmZm9vKTsKLSNlbHNlCi0gICBwcmludGYgKCJJbml0aWFsaXppbmcgRm9vKCVkKSBcIiVzXCIgd2l0aCBGb28oJWQpXG4iLGksIGZvby5tZXNzYWdlLCBmb28uaSk7Ci0jZW5kaWYKLSAgICBmb3IgKCBpbnQgayA9IDA7IGsgPCBGT09fTVNHX0xFTjsgaysrKSBtZXNzYWdlW2tdID0gZm9vLm1lc3NhZ2Vba107Ci19Ci0KLQotRm9vJiBGb286Om9wZXJhdG9yPSAoY29uc3QgRm9vJiBmb28pCi17Ci0jaWZkZWYgV0lUSF9BRERSCi0gICAgcHJpbnRmICgiQ29weWluZyBGb28oJWQpIFwiJXNcIiBhdCAlMDh4IHRvIEZvbyglZCkgJTA4eFxuIiwgCi0JICAgIGZvby5pLCBmb28ubWVzc2FnZSwgJmZvbywgaSwgdGhpcyk7Ci0jZWxzZQotICAgcHJpbnRmICgiQ29weWluZyBGb28oJWQpIFwiJXNcIiB0byBGb28oJWQpXG4iLCBmb28uaSwgZm9vLm1lc3NhZ2UsIGkpOwotI2VuZGlmCi0gICAgZm9yICggaW50IGsgPSAwOyBrIDwgRk9PX01TR19MRU47IGsrKykgbWVzc2FnZVtrXSA9IGZvby5tZXNzYWdlW2tdOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotCi1Gb286On5Gb28gKCkKLXsKLSAgICBmb29zLS07Ci0jaWZkZWYgV0lUSF9BRERSCi0gICAgcHJpbnRmICgiRGVzdHJ1Y3RpbmcgRm9vKCVkKSBcIiVzXCIgYXQgJTA4eCAocmVtYWluaW5nIGZvb3M6ICVkKVxuIiwKLQkgICAgaSwgbWVzc2FnZSwgdGhpcywgZm9vcyk7Ci0jZWxzZQotICAgIHByaW50ZiAoIkRlc3RydWN0aW5nIEZvbyglZCkgXCIlc1wiIChyZW1haW5pbmcgZm9vczogJWQpXG4iLAotCSAgICBpLCBtZXNzYWdlLCBmb29zKTsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtZm9vLmggYi9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1mb28uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFmZTUyYS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1mb28uaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vIENsYXNzIEZvbwotCi0jcHJhZ21hIGludGVyZmFjZQotCi0jZGVmaW5lIEZPT0xJU0hfTlVNQkVSIC00NzExCi0KLSNpZm5kZWYgRk9PX01TR19MRU4KLSNkZWZpbmUgRk9PX01TR19MRU4gODAKLSNlbmRpZgotIAotY2xhc3MgRm9vIHsKLSAgICBzdGF0aWMgaW50IGZvb3M7Ci0gICAgaW50IGk7Ci0gICAgc3RhdGljIGNvbnN0IGludCBsZW4gPSBGT09fTVNHX0xFTjsKLSAgICBjaGFyIG1lc3NhZ2VbbGVuXTsKLXB1YmxpYzogCi0gICAgc3RhdGljIHZvaWQgaW5pdF9mb28gKCk7Ci0gICAgc3RhdGljIGludCBuYl9mb29zKCkgeyByZXR1cm4gZm9vczsgfQotICAgIEZvbygpOwotICAgIEZvbyggY2hhciogbWVzc2FnZSk7Ci0gICAgRm9vKGNvbnN0IEZvbyYpOwotICAgIEZvbyAmIG9wZXJhdG9yPSAoY29uc3QgRm9vJik7Ci0gICAgfkZvbyAoKTsKLX07IApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtbWFpbi5jYyBiL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LW1haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOTliNWMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vIG1haW4gcHJvZ3JhbSBmb3IgQ2xhc3MgRm9vCi0KLWV4dGVybiAiQyIgewotLy8gU29tZSA8YXNzZXJ0Lmg+IGltcGxlbWVudGF0aW9ucyAoZS5nLiBTVU5PUyA0LjEpIGFyZSBicm9rZW4sCi0vLyBpbiB0aGF0IHRoZXkgcmVxdWlyZSA8c3RkaW8uaD4uICBCdXQsIGlmIGdjYy9nKysgaXMgaW5zdGFsbGVkCi0vLyBjb3JyZWN0bHksIHlvdSBzaG91bGQgZ2V0IGdjYydzIGFzc2VydC5oLgotLy8gSWYgdGhlIGNvbXBpbGUgZmFpbHMsIGl0IG1lYW5zIHRoZSB3cm9uZyBpbmNsdWRlIGZpbGVzIGFyZSBpbiB1c2UhCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci19OwotI2luY2x1ZGUgImNkdGVzdC1mb28uaCIKLQotZXh0ZXJuICJDIiB2b2lkIF9faW5pdF9zdGFydCgpOwotCi1leHRlcm4gRm9vIGYodm9pZCk7Ci1leHRlcm4gdm9pZCBnKHZvaWQpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCAqbm90KiBiZSBjYWxsZWQgYnkgdGhlIGVudmlyb25tZW50LiAgVGhlcmUgaXMKLSAgIG5vIHdheSBpbiBDKysgdG8gYGBydW4gc29tZXRoaW5nIGFmdGVyIHRoZSBpbml0aWFsaXplcnMgYnV0IGJlZm9yZSBtYWluKCknJy4KLSAgIFRoZSBsaWJyYXJ5IHRoYXQgZGVwZW5kcyBvbiB0aGlzIChOSUhDTCkgaXMgYnJva2VuLiAgLS0gSm9obiBHaWxtb3JlIAotICAgV2UgbGVhdmUgdGhpcyBoZXJlIHRvIHRlc3QgdGhhdCBmdXR1cmUgY2hhbmdlcyB0byB0aGUgY29tcGlsZXIKLSAgIGRvIG5vdCByZS1pbnRyb2R1Y2UgdGhpcyBsb3NpbmcgYGBmZWF0dXJlJycuICAqLwotdm9pZCAKLV9faW5pdF9zdGFydCgpCi17Ci0gICAgRm9vOjppbml0X2ZvbygpOwotfQotCi1zdGF0aWMgRm9vIHN0YXRpY19mb28oICJzdGF0aWNfZm9vIik7IAotCi1tYWluKCkgCi17IAotICAgIGFzc2VydCAoRm9vOjpuYl9mb29zKCkgPT0gMik7Ci0gICAgRm9vIGF1dG9tYXRpY19mb28oICJhdXRvbWF0aWNfZm9vIik7Ci0gICAgRm9vIGJsYV9mb28gPSBmKCk7Ci0gICAgYXNzZXJ0IChGb286Om5iX2Zvb3MoKSA9PSA0KTsKLSAgICBnKCk7Ci0gICAgYXNzZXJ0IChGb286Om5iX2Zvb3MoKSA9PSA0KTsKLSAgICAvLyBgYXV0b21hdGljX2ZvbycgYW5kIGBibGFfZm9vJyBhcmUgZGVzdHJ1Y3RlZCBoZXJlIAotfSAKLSAKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LmRhdCBiL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LmRhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzliZTBkYi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC5kYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1Db25zdHJ1Y3RpbmcgRm9vKDEpICJzdGF0aWNfZm9vIgotQ29uc3RydWN0aW5nIEZvbygyKSAic3RhdGljX2ZvbyIKLUNvbnN0cnVjdGluZyBGb28oMykgImF1dG9tYXRpY19mb28iCi1Db25zdHJ1Y3RpbmcgRm9vKDQpICJkZWZhdWx0LWZvbyIKLUluaXRpYWxpemluZyBGb28oNSkgImRlZmF1bHQtZm9vIiB3aXRoIEZvbyg0KQotRGVzdHJ1Y3RpbmcgRm9vKDQpICJkZWZhdWx0LWZvbyIgKHJlbWFpbmluZyBmb29zOiA0KQotQ29uc3RydWN0aW5nIEZvbyg1KSAib3RoZXJfZm9vMSIKLUNvbnN0cnVjdGluZyBGb28oNikgIm90aGVyX2ZvbzIiCi1Db3B5aW5nIEZvbyg1KSAib3RoZXJfZm9vMSIgdG8gRm9vKDYpCi1EZXN0cnVjdGluZyBGb28oNikgIm90aGVyX2ZvbzEiIChyZW1haW5pbmcgZm9vczogNSkKLURlc3RydWN0aW5nIEZvbyg1KSAib3RoZXJfZm9vMSIgKHJlbWFpbmluZyBmb29zOiA0KQotRGVzdHJ1Y3RpbmcgRm9vKDUpICJkZWZhdWx0LWZvbyIgKHJlbWFpbmluZyBmb29zOiAzKQotRGVzdHJ1Y3RpbmcgRm9vKDMpICJhdXRvbWF0aWNfZm9vIiAocmVtYWluaW5nIGZvb3M6IDIpCi1EZXN0cnVjdGluZyBGb28oMikgInN0YXRpY19mb28iIChyZW1haW5pbmcgZm9vczogMSkKLURlc3RydWN0aW5nIEZvbygxKSAic3RhdGljX2ZvbyIgKHJlbWFpbmluZyBmb29zOiAwKQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2JlMzVlLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0jIEV4cGVjdCBzY3JpcHQgZm9yIExEIGNkdGVzdCBUZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5MywxOTk0LDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBKZWZmcmV5IFdoZWF0IChjYXNzaWR5QGN5Z251cy5jb20pCi0jIFJld3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIChpYW5AY3lnbnVzLmNvbSkKLSMKLQotIyBNYWtlIHN1cmUgdGhhdCBjb25zdHJ1Y3RvcnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LgotCi1zZXQgdGVzdDEgImNkdGVzdCIKLXNldCB0ZXN0MiAiY2R0ZXN0IHdpdGggLVVyIgotCi0jIFRoaXMgdGVzdCByZXF1aXJlcyBydW5uaW5nIHRoZSBleGVjdXRhYmxlIGdlbmVyYXRlZCBieSBsZC4KLWlmICFbaXNuYXRpdmVdIHsKLSAgICByZXR1cm4KLX0KLQotaWYgeyBbd2hpY2ggJENYWF0gPT0gMCB9IHsKLSAgICB1bnRlc3RlZCAkdGVzdDEKLSAgICB1bnRlc3RlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotaWYgeyAhW2xkX2NvbXBpbGUgIiRDWFggJENYWEZMQUdTIC1mZ251LWxpbmtlciIgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC1mb28uY2MgdG1wZGlyL2NkdGVzdC1mb28ub10KLSAgICAgfHwgIVtsZF9jb21waWxlICIkQ1hYICRDWFhGTEFHUyAtZmdudS1saW5rZXIiICRzcmNkaXIvJHN1YmRpci9jZHRlc3QtYmFyLmNjIHRtcGRpci9jZHRlc3QtYmFyLm9dCi0gICAgIHx8ICFbbGRfY29tcGlsZSAiJENYWCAkQ1hYRkxBR1MgLWZnbnUtbGlua2VyIiAkc3JjZGlyLyRzdWJkaXIvY2R0ZXN0LW1haW4uY2MgdG1wZGlyL2NkdGVzdC1tYWluLm9dIH0gewotICAgIHVucmVzb2x2ZWQgJHRlc3QxCi0gICAgdW5yZXNvbHZlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9saW5rICRsZCB0bXBkaXIvY2R0ZXN0IHt0bXBkaXIvY2R0ZXN0LWZvby5vIHRtcGRpci9jZHRlc3QtYmFyLm8gdG1wZGlyL2NkdGVzdC1tYWluLm99XSB7Ci0gICAgZmFpbCAkdGVzdDEKLX0gZWxzZSB7Ci0gICAgc2VuZF9sb2cgInRtcGRpci9jZHRlc3QgPnRtcGRpci9jZHRlc3Qub3V0XG4iCi0gICAgdmVyYm9zZSAidG1wZGlyL2NkdGVzdCA+dG1wZGlyL2NkdGVzdC5vdXQiCi0gICAgY2F0Y2ggImV4ZWMgdG1wZGlyL2NkdGVzdCA+dG1wZGlyL2NkdGVzdC5vdXQiIGV4ZWNfb3V0cHV0Ci0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IiAxCi0JZmFpbCAkdGVzdDEKLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICJkaWZmIHRtcGRpci9jZHRlc3Qub3V0ICRzcmNkaXIvJHN1YmRpci9jZHRlc3QuZGF0XG4iCi0JdmVyYm9zZSAiZGlmZiB0bXBkaXIvY2R0ZXN0Lm91dCAkc3JjZGlyLyRzdWJkaXIvY2R0ZXN0LmRhdCIKLQljYXRjaCAiZXhlYyBkaWZmIHRtcGRpci9jZHRlc3Qub3V0ICRzcmNkaXIvJHN1YmRpci9jZHRlc3QuZGF0IiBleGVjX291dHB1dAotCXNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi0JaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCSAgICBwYXNzICR0ZXN0MQotCX0gZWxzZSB7Ci0JICAgIHNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQkgICAgdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IiAxCi0JICAgIGZhaWwgJHRlc3QxCi0JfQotICAgIH0KLX0KLQotaWYgIVtsZF9yZWxvY2F0ZSAkbGQgdG1wZGlyL2NkdGVzdC5vIHstVXIgdG1wZGlyL2NkdGVzdC1mb28ubyB0bXBkaXIvY2R0ZXN0LWJhci5vIHRtcGRpci9jZHRlc3QtbWFpbi5vfV0gewotICAgIGZhaWwgJHRlc3QyCi19IGVsc2UgewotICAgIGlmICFbbGRfbGluayAkbGQgdG1wZGlyL2NkdGVzdCB0bXBkaXIvY2R0ZXN0Lm9dIHsKLQlmYWlsICR0ZXN0MgotICAgIH0gZWxzZSB7Ci0Jc2VuZF9sb2cgInRtcGRpci9jZHRlc3QgPnRtcGRpci9jZHRlc3Qub3V0XG4iCi0JdmVyYm9zZSAidG1wZGlyL2NkdGVzdCA+dG1wZGlyL2NkdGVzdC5vdXQiCi0JY2F0Y2ggImV4ZWMgdG1wZGlyL2NkdGVzdCA+dG1wZGlyL2NkdGVzdC5vdXQiIGV4ZWNfb3V0cHV0Ci0JaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQkgICAgc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCSAgICB2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQkgICAgZmFpbCAkdGVzdDIKLQl9IGVsc2UgewotCSAgICBzZW5kX2xvZyAiZGlmZiB0bXBkaXIvY2R0ZXN0Lm91dCAkc3JjZGlyLyRzdWJkaXIvY2R0ZXN0LmRhdFxuIgotCSAgICB2ZXJib3NlICJkaWZmIHRtcGRpci9jZHRlc3Qub3V0ICRzcmNkaXIvJHN1YmRpci9jZHRlc3QuZGF0IgotCSAgICBjYXRjaCAiZXhlYyBkaWZmIHRtcGRpci9jZHRlc3Qub3V0ICRzcmNkaXIvJHN1YmRpci9jZHRlc3QuZGF0IiBleGVjX291dHB1dAotCSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQotCSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JCXBhc3MgJHRlc3QyCi0JICAgIH0gZWxzZSB7Ci0JCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQkJdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IiAxCi0JCWZhaWwgJHRlc3QyCi0JICAgIH0KLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9hc20ucyBiL2xkL3Rlc3RzdWl0ZS9sZC1jaGVja3MvYXNtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZTBjMzMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9hc20ucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS50ZXh0Ci0JLmdsb2JhbCBmb28KLWZvbzoKLQkubG9uZyAweDEyMzQ1Njc4Ci0KLS5kYXRhCi0JLmdsb2JhbCBiYXIKLWJhcjoKLQkubG9uZyAweDg3NjU0MzIxCi0KLQkubGNvbW0gMHgxMgotCi0KLQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtY2hlY2tzL2NoZWNrcy5leHAgYi9sZC90ZXN0c3VpdGUvbGQtY2hlY2tzL2NoZWNrcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmM2VmN2QuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9jaGVja3MuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBMRCBzZWN0aW9uIGNoZWNrcyB0ZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IE5pY2sgQ2xpZnRvbiAobmlja2NAY3lnbnVzLmNvbSkKLQotcHJvYyBzZWN0aW9uX2NoZWNrIHt9IHsKLSAgICBnbG9iYWwgbGRfZmxhZ3MKLSAgICBnbG9iYWwgYXMKLSAgICBnbG9iYWwgbGQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIAotICAgIHNldCB0ZXN0ICJjaGVjayBzZWN0aW9ucyIKLSAgICAKLSAgICBzZXQgbGRmbGFncyAiLS1jaGVjay1zZWN0aW9ucyIKLQotICAgIGlmIHsgIVtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL2FzbS5zIHRtcGRpci9hc20ub119IHsKLQl1bnJlc29sdmVkICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL2FzbS54ICIkbGRmbGFncyB0bXBkaXIvYXNtLm8iXSB7Ci0JZmFpbCAiJHRlc3QgOiB1c2luZyBkZWZhdWx0IGxpbmtlciBzY3JpcHQiCi0gICAgfSBlbHNlIHsKLQlwYXNzICR0ZXN0Ci0gICAgfQotCi0gICAgIyBDaGFuZ2UgdGhlIGxpbmtlciBmbGFncyBzbyB0aGF0IG91ciAiYnVnZ3kiIGxpbmtlcgotICAgICMgc2NyaXB0IGlzIHVzZWQuCi0gICAgc2V0IGxkZmxhZ3MgIi0tY2hlY2stc2VjdGlvbnMgLVQgJHNyY2Rpci8kc3ViZGlyL3NjcmlwdCAtZSBmb28iCi0KLSAgICAjIFBlcmZvcm0gdGhlIGVxdWl2YWxlbnQgb2YgaW52b2tpbmcgbGRfc2ltcGxlX2xpbmsKLSAgICAjIGV4Y2VwdCB0aGF0IHdlIG5lZWQgdG8gbWFzc2FnZSB0aGUgb3V0cHV0IGZ1dGhlci4KLSAgICAKLSAgICBjYXRjaCAiZXhlYyAkbGQgLW8gdG1wZGlyL2FzbS54ICRsZGZsYWdzIHRtcGRpci9hc20ubyIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQotICAgICMgTWFrZSBzdXJlIHRoYXQgd2UgZ290IHNvbWUgb3V0cHV0IGZyb20gdGhlIGxpbmtlcgotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlmYWlsICIkdGVzdCAtIGVycm9yIG1lc3NhZ2UgZXhwZWN0ZWQgYnV0IG5vdCBmb3VuZCIKLSAgICB9IAotCi0gICAgIyBOb3cgcmVtb3ZlIG91ciBleHBlY3RlZCBlcnJvciBtZXNzYWdlCi0gICAgcmVnc3ViIC1hbGwgIi4qOiBzZWN0aW9uIC5kYXRhIC4qIG92ZXJsYXBzIHNlY3Rpb24gLnRleHQgLioiICRleGVjX291dHB1dCAiIiBleGVjX291dHB1dAotCi0gICAgIyBBbmQgY2hlY2sgdG8gc2VlIGlmIGFueXRoaW5nIGVsc2UsICh1bmV4cGVjdGVkKSB3YXMgbGVmdAotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlwYXNzICR0ZXN0Ci0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIlVuZXhwZWN0ZWQgbGlua2VyIG1lc3NhZ2Uocyk6ICRleGVjX291dHB1dCIKLQkKLQlmYWlsICIkdGVzdCAtIHVzaW5nIGVycm9uZW91cyBsaW5rZXIgc2NyaXB0IgotICAgIH0KLX0KLQotc2VjdGlvbl9jaGVjawotCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jaGVja3Mvc2NyaXB0IGIvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9zY3JpcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YzZhMDguLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9zY3JpcHQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNFQ1RJT05TIHsKLSAgICAgICAgLnRleHQgMHgxMDAgOiAgICAgICAgICAgICB7ICooLnRleHQpIH0KLQkuZGF0YSAweDEwMCA6IEFUICgweDEwMCkgIHsgKiguZGF0YSkgfQotCS5ic3MgIDB4MTAwIDogQVQgKDB4NDAwMCkgeyAqKC5ic3MpICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVycy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZmFhOTMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVycy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MDggKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBsZC12ZXJzaW9uIHRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgRXJpYyBZb3VuZ2RhbGUgKGVyaWNAYW5kYW50ZS5qaWMuY29tKQotCi0jCi0KLSMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBpZiBsZCBnZW5lcmF0ZXMgbmF0aXZlIGV4ZWN1dGFibGVzLgotaWYgIVtpc25hdGl2ZV0gdGhlbiB7cmV0dXJufQotCi0jIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gb24gYSBjb3VwbGUgb2YgRUxGIHBsYXRmb3Jtcy4KLSMgU3F1YXJlIGJyYWNrZXQgZXhwcmVzc2lvbnMgc2VlbSB0byBjb25mdXNlIGlzdGFyZ2V0LgotIyBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHRlc3QgdGhhdCBpcyB1c2VkIGluIGxkLXNoYXJlZCwgQlRXLgotaWYgeyAhW2lzdGFyZ2V0IGk/ODYtKi1zeXN2NCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpPzg2LSotdW5peHdhcmVdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpPzg2LSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk/ODYtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBtNjhrLSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgbWlwcyotKi1pcml4NSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotZWxmXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotc29sYXJpczIqXQotICAgICAmJiAhW2lzdGFyZ2V0IGFscGhhKi0qLWxpbnV4Kl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIHsgW2lzdGFyZ2V0IGk/ODYtKi1saW51eGFvdXQqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBpPzg2LSotbGludXhvbGRsZCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IG02OGstKi1saW51eGFvdXQqXSB9IHsKLSAgICByZXR1cm4KLX0KLQotaWYgeyBbaXN0YXJnZXQgcnM2MDAwKi0qLWFpeCpdIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWFpeCpdIH0gewotICAgIHJldHVybgotfQotCi1zZXQgZGlmZiBkaWZmCi1zZXQgdG1wZGlyIHRtcGRpcgotc2V0IFZPQkpEVU1QX0ZMQUdTIC0tcHJpdmF0ZS1oZWFkZXJzCi1zZXQgRE9CSkRVTVBfRkxBR1MgLS1keW5hbWljLXN5bXMKLXNldCBTT0JKRFVNUF9GTEFHUyAtLXN5bXMKLXNldCBzaGFyZWQgLS1zaGFyZWQKLXNldCBzY3JpcHQgLS12ZXJzaW9uLXNjcmlwdAotCi1wcm9jIHRlc3RfYXIgeyB0ZXN0IGxpYiBvYmplY3QgZXhwZWN0IH0gewotICAgIGdsb2JhbCBhcgotICAgIGdsb2JhbCBubQotICAgIGdsb2JhbCB0bXBkaXIKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBkaWZmCi0KLSAgICB2ZXJib3NlIC1sb2cgIiRhciAtY3IgJHRtcGRpci8kbGliICR0bXBkaXIvJG9iamVjdCIKLSAgICBjYXRjaCAiZXhlYyAkYXIgLWNyICR0bXBkaXIvJGxpYiAkdG1wZGlyLyRvYmplY3QiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotICAgIAotICAgIHZlcmJvc2UgLWxvZyAiJG5tIC0tcHJpbnQtYXJtYXAgJHRtcGRpci8kbGliIHwgZ3JlcCBcIiBpbiBcIiB8IGVncmVwIFwiVkVSU1xcfGJhclxcfGZvb1wiIHwgc29ydCA+ICR0bXBkaXIvbm0ub3V0IgotCi0gICAgY2F0Y2ggImV4ZWMgJG5tIC0tcHJpbnQtYXJtYXAgJHRtcGRpci8kbGliIHwgZ3JlcCBcXFwgaW5cXFwgIHwgZWdyZXAgVkVSU1xcXHxiYXJcXFx8Zm9vIHwgc29ydCA+ICR0bXBkaXIvbm0ub3V0IiBleGVjX291dHB1dAotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQljYXRjaCAiZXhlYyAkZGlmZiAtcSAkdG1wZGlyL25tLm91dCAkc3JjZGlyLyRzdWJkaXIvJGV4cGVjdCIgZXhlY19vdXRwdXQKLQlzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQlpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JICAgIHBhc3MgJHRlc3QKLQkgICAgcmV0dXJuCi0JfSBlbHNlIHsKLQkgICAgdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlmYWlsICIkdGVzdCIKLSAgICB9Ci19Ci0KLSMKLSMgb2JqZHVtcF9lbXB0eXN5bXN0dWZmCi0jCUNoZWNrIG5vbi1keW5hbWljIHN5bWJvbHMgYW5kIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm9uZSB3aXRoICdAJy4KLSMKLXByb2Mgb2JqZHVtcF9lbXB0eXN5bXN0dWZmIHsgb2JqZHVtcCBvYmplY3QgfSB7Ci0gICAgZ2xvYmFsIFNPQkpEVU1QX0ZMQUdTCi0gICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0Ci0gICAgZ2xvYmFsIGRpZmYKLQotICAgIGlmICFbaW5mbyBleGlzdHMgU09CSkRVTVBfRkxBR1NdIHsgc2V0IFNPQkpEVU1QX0ZMQUdTICIiIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgJFNPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1xAL3AiCi0KLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAkU09CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvXEAvcCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0jIFdlIHNob3VsZG4ndCBnZXQgYW55dGhpbmcgaGVyZS4KLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0jIGl0IGlzIG5vdCBub3JtYWwgdG8gY29tZSBoZXJlIC0gd2UgaGF2ZSBubyBvdXRwdXQgdG8gY29tcGFyZS4KLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQl2ZXJib3NlIC1sb2cgIm9iamR1bXBfZW1wdHlzeW1zdHVmZjogZGlkIG5vdCBleHBlY3QgYW55IG91dHB1dCBmcm9tIG9iamR1bXAiCi0JcmV0dXJuIDAKLSAgICB9Ci0KLX0KLQotIwotIyBvYmpkdW1wX2VtcHR5ZHluc3ltc3R1ZmYKLSMJQ2hlY2sgZHluYW1pYyBzeW1ib2xzIGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vbmUgd2l0aCAnQCcuCi0jCi1wcm9jIG9iamR1bXBfZW1wdHlkeW5zeW1zdHVmZiB7IG9iamR1bXAgb2JqZWN0IH0gewotICAgIGdsb2JhbCBET0JKRFVNUF9GTEFHUwotICAgIGdsb2JhbCB2ZXJzaW9uX291dHB1dAotICAgIGdsb2JhbCBkaWZmCi0KLSAgICBpZiAhW2luZm8gZXhpc3RzIFZPQkpEVU1QX0ZMQUdTXSB7IHNldCBWT0JKRFVNUF9GTEFHUyAiIiB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wICRET0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WRVJTL3BcXFw7L3Nob3cvcCIKLQotICAgIGNhdGNoICJleGVjICRvYmpkdW1wICRET0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WRVJTL3BcXFw7L3Nob3cvcCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0jIFdlIHNob3VsZG4ndCBnZXQgYW55dGhpbmcgaGVyZS4KLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7IGlmIFtzdHJpbmcgbWF0Y2ggIipvYmpkdW1wOiAqOiBub3QgYSBkeW5hbWljIG9iamVjdCIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0jIGl0IGlzIG5vdCBub3JtYWwgdG8gY29tZSBoZXJlIC0gd2UgaGF2ZSBubyBvdXRwdXQgdG8gY29tcGFyZS4KLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQl2ZXJib3NlIC1sb2cgIm9iamR1bXBfZW1wdHlkeW5zeW1zdHVmZjogZGlkIG5vdCBleHBlY3QgYW55IG91dHB1dCBmcm9tIG9iamR1bXAiCi0JcmV0dXJuIDAKLSAgICB9IH0KLX0KLQotIwotIyBvYmpkdW1wX2VtcHR5dmVyc3R1ZmYKLSMJTWFrZSBzdXJlIHRoZXJlIGlzIG5vIHZlcnNpb24gaW5mb3JtYXRpb24KLSMKLXByb2Mgb2JqZHVtcF9lbXB0eXZlcnN0dWZmIHsgb2JqZHVtcCBvYmplY3QgfSB7Ci0gICAgZ2xvYmFsIFZPQkpEVU1QX0ZMQUdTCi0gICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0Ci0gICAgZ2xvYmFsIGRpZmYKLSAgICBnbG9iYWwgdG1wZGlyCi0KLSAgICBpZiB7W3doaWNoICRvYmpkdW1wXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRvYmpkdW1wIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBWT0JKRFVNUF9GTEFHU10geyBzZXQgVk9CSkRVTVBfRkxBR1MgIiIgfQotCi0gICAgdmVyYm9zZSAtbG9nICIkb2JqZHVtcCAkVk9CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvVmVyc2lvbi8sXFxcJHAgPiAkdG1wZGlyL29iamR1bXAub3V0IgotCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgJFZPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZlcnNpb24vLFxcXCRwIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLSMgaXQgaXMgbm9ybWFsIHRvIGZhaWwgaGVyZSAtIHdlIGhhdmUgbm8gb3V0cHV0IHRvIGNvbXBhcmUuCi0JcmV0dXJuIDEKLSAgICB9IGVsc2UgeyBpZiB7IFtzdHJpbmcgbWF0Y2ggIipsaWJjKiIgJGV4ZWNfb3V0cHV0XSB9IHRoZW4gewotIyB0aGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlcmUgaXMgdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiBsaWJjLCBzbyB3ZQotIyBjYW4ndCByZWFsbHkgcGVyZm9ybSB0aGlzIHRlc3QuCi0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXZlcmJvc2UgLWxvZyAib2JqZHVtcF9lbXB0eXZlcnN0dWZmOiBkaWQgbm90IGV4cGVjdCBhbnkgb3V0cHV0IGZyb20gb2JqZHVtcCIKLQlyZXR1cm4gMAotICAgIH0gfQotCi19Ci0KLSMKLSMgb2JqZHVtcF9zeW1zdHVmZgotIwlEdW1wIG5vbi1keW5hbWljIHN5bWJvbCBzdHVmZiBhbmQgbWFrZSBzdXJlIHRoYXQgaXQgaXMgc2FuZS4KLSMKLXByb2Mgb2JqZHVtcF9zeW1zdHVmZiB7IG9iamR1bXAgb2JqZWN0IGV4cGVjdGZpbGUgfSB7Ci0gICAgZ2xvYmFsIFNPQkpEVU1QX0ZMQUdTCi0gICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0Ci0gICAgZ2xvYmFsIGRpZmYKLSAgICBnbG9iYWwgdG1wZGlyCi0KLSAgICBpZiAhW2luZm8gZXhpc3RzIFNPQkpEVU1QX0ZMQUdTXSB7IHNldCBTT0JKRFVNUF9GTEFHUyAiIiB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wICRTT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgZ3JlcCBcQCB8IHNvcnQgID4gJHRtcGRpci9vYmpkdW1wLm91dCIKLQotICAgIGNhdGNoICJleGVjICRvYmpkdW1wICRTT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgZ3JlcCBcQCB8IHNvcnQgID4gJHRtcGRpci9vYmpkdW1wLm91dCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0KLSMgTm93IGRvIGEgbGluZS1ieS1saW5lIGNvbXBhcmlzb24gdG8gZWZmZWN0aXZlbHkgZGlmZiB0aGUgZGFybmVkIHRoaW5ncwotIyBUaGUgc3R1ZmYgY29taW5nIGZyb20gdGhlIGV4cGVjdGZpbGUgaXMgYWN0dWFsbHkgYSByZWdleCwgc28gd2UgY2FuCi0jIHNraXAgb3ZlciB0aGUgYWN0dWFsIGFkZHJlc3NlcyBhbmQgc28gZm9ydGguICBUaGlzIGlzIGN1cnJlbnRseSB2ZXJ5Ci0jIHNpbXBsZW1pbmRlZCAtIGl0IGV4cGVjdHMgYSBvbmUtdG8tb25lIGNvcnJlc3BvbmRlbmNlIGluIHRlcm1zIG9mIGxpbmUKLSMgbnVtYmVycy4KLQotCWlmIFtmaWxlIGV4aXN0cyAkZXhwZWN0ZmlsZV0gdGhlbiB7Ci0JICAgIHNldCBmaWxlX2EgW29wZW4gJGV4cGVjdGZpbGUgcl0KLQl9IGVsc2UgewotCSAgICBwZXJyb3IgIiRleHBlY3RmaWxlIGRvZXNuJ3QgZXhpc3QiCi0JICAgIHJldHVybiAwCi0JfQotCQotCWlmIFtmaWxlIGV4aXN0cyAkdG1wZGlyL29iamR1bXAub3V0XSB0aGVuIHsKLQkgICAgc2V0IGZpbGVfYiBbb3BlbiAkdG1wZGlyL29iamR1bXAub3V0IHJdCi0JfSBlbHNlIHsKLQkgICAgcGVycm9yICIkdG1wZGlyL29iamR1bXAub3V0IGRvZXNuJ3QgZXhpc3QiCi0JICAgIHJldHVybiAwCi0JfQotCi0JdmVyYm9zZSAiIyBEaWZmJ2luZzogJGV4cGVjdGZpbGUgJHRtcGRpci9vYmpkdW1wLm91dCIgMgotCi0Jc2V0IGVvZiAtMQotCXNldCBkaWZmZXJlbmNlcyAwCi0KLQl3aGlsZSB7IFtnZXRzICRmaWxlX2EgbGluZV0gIT0gJGVvZiB9IHsKLQkgICAgaWYgW3JlZ2V4cCAiXiMuKiQiICRsaW5lXSB0aGVuIHsKLQkJY29udGludWUKLQkgICAgfSBlbHNlIHsKLQkJbGFwcGVuZCBsaXN0X2EgJGxpbmUKLQkgICAgfQotCX0KLQljbG9zZSAkZmlsZV9hCi0KLQl3aGlsZSB7IFtnZXRzICRmaWxlX2IgbGluZV0gIT0gJGVvZiB9IHsKLQkgICAgaWYgW3JlZ2V4cCAiXiMuKiQiICRsaW5lXSB0aGVuIHsKLQkJY29udGludWUKLQkgICAgfSBlbHNlIHsKLQkJbGFwcGVuZCBsaXN0X2IgJGxpbmUKLQkgICAgfQotCX0KLQljbG9zZSAkZmlsZV9iCi0JCi0JZm9yIHsgc2V0IGkgMCB9IHsgJGkgPCBbbGxlbmd0aCAkbGlzdF9hXSB9IHsgaW5jciBpIH0gewotCSAgICBzZXQgbGluZV9hIFtsaW5kZXggJGxpc3RfYSAkaV0KLQkgICAgc2V0IGxpbmVfYiBbbGluZGV4ICRsaXN0X2IgJGldCi0JICAgIAotCi0JICAgIHZlcmJvc2UgIlx0JGV4cGVjdGZpbGU6ICRpOiAkbGluZV9hIiAzCi0JICAgIHZlcmJvc2UgIlx0L3RtcC9vYmpkdW1wLm91dDogJGk6ICRsaW5lX2IiIDMKLQkgICAgaWYgW3JlZ2V4cCAkbGluZV9hICRsaW5lX2JdIHRoZW4gewotCQljb250aW51ZQotCSAgICB9IGVsc2UgewotCQl2ZXJib3NlIC1sb2cgIlx0JGV4cGVjdGZpbGU6ICRpOiAkbGluZV9hIgotCQl2ZXJib3NlIC1sb2cgIlx0JHRtcGRpci9vYmpkdW1wLm91dDogJGk6ICRsaW5lX2IiCi0JCQotCQlyZXR1cm4gMAotCSAgICB9Ci0JfQotCQotCWlmIHsgW2xsZW5ndGggJGxpc3RfYV0gIT0gW2xsZW5ndGggJGxpc3RfYl0gfSB7Ci0JICAgIHZlcmJvc2UgLWxvZyAiTGluZSBjb3VudCIKLQkgICAgcmV0dXJuIDAKLQl9Ci0JCi0JaWYgJGRpZmZlcmVuY2VzPDEgdGhlbiB7Ci0JICAgIHJldHVybiAxCi0JfQotCQotCXJldHVybiAwCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlyZXR1cm4gMAotICAgIH0KLQotfQotCi0jCi0jIG9iamR1bXBfZHltc3ltc3R1ZmYKLSMJRHVtcCBkeW5hbWljIHN5bWJvbCBzdHVmZiBhbmQgbWFrZSBzdXJlIHRoYXQgaXQgaXMgc2FuZS4KLSMKLXByb2Mgb2JqZHVtcF9keW5zeW1zdHVmZiB7IG9iamR1bXAgb2JqZWN0IGV4cGVjdGZpbGUgfSB7Ci0gICAgZ2xvYmFsIERPQkpEVU1QX0ZMQUdTCi0gICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0Ci0gICAgZ2xvYmFsIGRpZmYKLSAgICBnbG9iYWwgdG1wZGlyCi0KLSAgICBpZiAhW2luZm8gZXhpc3RzIERPQkpEVU1QX0ZMQUdTXSB7IHNldCBET0JKRFVNUF9GTEFHUyAiIiB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wICRET0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WRVJTL3BcXFw7L3Nob3cvcCB8IHNvcnQgfCB1bmlxICA+ICR0bXBkaXIvb2JqZHVtcC5vdXQiCi0KLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAkRE9CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvVkVSUy9wXFxcOy9zaG93L3AgfCBzb3J0IHwgdW5pcSAgPiAkdG1wZGlyL29iamR1bXAub3V0IiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQotIyBOb3cgZG8gYSBsaW5lLWJ5LWxpbmUgY29tcGFyaXNvbiB0byBlZmZlY3RpdmVseSBkaWZmIHRoZSBkYXJuZWQgdGhpbmdzCi0jIFRoZSBzdHVmZiBjb21pbmcgZnJvbSB0aGUgZXhwZWN0ZmlsZSBpcyBhY3R1YWxseSBhIHJlZ2V4LCBzbyB3ZSBjYW4KLSMgc2tpcCBvdmVyIHRoZSBhY3R1YWwgYWRkcmVzc2VzIGFuZCBzbyBmb3J0aC4gIFRoaXMgaXMgY3VycmVudGx5IHZlcnkKLSMgc2ltcGxlbWluZGVkIC0gaXQgZXhwZWN0cyBhIG9uZS10by1vbmUgY29ycmVzcG9uZGVuY2UgaW4gdGVybXMgb2YgbGluZQotIyBudW1iZXJzLgotCi0JaWYgW2ZpbGUgZXhpc3RzICRleHBlY3RmaWxlXSB0aGVuIHsKLQkgICAgc2V0IGZpbGVfYSBbb3BlbiAkZXhwZWN0ZmlsZSByXQotCX0gZWxzZSB7Ci0JICAgIHdhcm5pbmcgIiRleHBlY3RmaWxlIGRvZXNuJ3QgZXhpc3QiCi0JICAgIHJldHVybiAwCi0JfQotCQotCWlmIFtmaWxlIGV4aXN0cyAkdG1wZGlyL29iamR1bXAub3V0XSB0aGVuIHsKLQkgICAgc2V0IGZpbGVfYiBbb3BlbiAkdG1wZGlyL29iamR1bXAub3V0IHJdCi0JfSBlbHNlIHsKLQkgICAgZmFpbCAiJHRtcGRpci9vYmpkdW1wLm91dCBkb2Vzbid0IGV4aXN0IgotCSAgICByZXR1cm4gMAotCX0KLQotCXZlcmJvc2UgIiMgRGlmZidpbmc6ICRleHBlY3RmaWxlICR0bXBkaXIvb2JqZHVtcC5vdXQiIDIKLQotCXNldCBlb2YgLTEKLQlzZXQgZGlmZmVyZW5jZXMgMAotCi0Jd2hpbGUgeyBbZ2V0cyAkZmlsZV9hIGxpbmVdICE9ICRlb2YgfSB7Ci0JICAgIGlmIFtyZWdleHAgIl4jLiokIiAkbGluZV0gdGhlbiB7Ci0JCWNvbnRpbnVlCi0JICAgIH0gZWxzZSB7Ci0JCWxhcHBlbmQgbGlzdF9hICRsaW5lCi0JICAgIH0KLQl9Ci0JY2xvc2UgJGZpbGVfYQotCi0Jd2hpbGUgeyBbZ2V0cyAkZmlsZV9iIGxpbmVdICE9ICRlb2YgfSB7Ci0JICAgIGlmIFtyZWdleHAgIl4jLiokIiAkbGluZV0gdGhlbiB7Ci0JCWNvbnRpbnVlCi0JICAgIH0gZWxzZSB7Ci0JCWxhcHBlbmQgbGlzdF9iICRsaW5lCi0JICAgIH0KLQl9Ci0JY2xvc2UgJGZpbGVfYgotCQotCWZvciB7IHNldCBpIDAgfSB7ICRpIDwgW2xsZW5ndGggJGxpc3RfYl0gfSB7IGluY3IgaSB9IHsKLQkgICAgc2V0IGxpbmVfYiBbbGluZGV4ICRsaXN0X2IgJGldCi0JICAgIAotIyBUaGUgdGVzdHMgYXJlIHJpZ2dlZCBzbyB0aGF0IHdlIHNob3VsZCBuZXZlciBleHBvcnQgYSBzeW1ib2wgd2l0aCB0aGUKLSMgd29yZCAnaGlkZScgaW4gaXQuICBUaHVzIHdlIGp1c3Qgc2VhcmNoIGZvciBpdCwgYW5kIGJhaWwgaWYgd2UgZmluZCBpdC4KLQkgICAgaWYgW3JlZ2V4cCAiaGlkZSIgJGxpbmVfYl0gdGhlbiB7Ci0JCXZlcmJvc2UgLWxvZyAiXHQkdG1wZGlyL29iamR1bXAub3V0OiAkaTogJGxpbmVfYiIKLQkJCi0JCXJldHVybiAwCi0JICAgIH0KLQotCSAgICB2ZXJib3NlICJcdCRleHBlY3RmaWxlOiAkaTogJGxpbmVfYiIgMwotCi0JICAgICMgV2UgY2FuJ3QgYXNzdW1lIHRoYXQgdGhlIHNvcnQgaXMgY29uc2lzdGVudCBhY3Jvc3MKLQkgICAgIyBzeXN0ZW1zLCBzbyB3ZSBtdXN0IGNoZWNrIGVhY2ggcmVnZXhwLiAgV2hlbiB3ZSBmaW5kIGEKLQkgICAgIyByZWdleHAsIHdlIG51bGwgaXQgb3V0LCBzbyB3ZSBkb24ndCBtYXRjaCBpdCB0d2ljZS4KLQkgICAgZm9yIHsgc2V0IGogMCB9IHsgJGogPCBbbGxlbmd0aCAkbGlzdF9hXSB9IHsgaW5jciBqIH0gewotCQlzZXQgbGluZV9hIFtsaW5kZXggJGxpc3RfYSAkal0KLQotCQlpZiBbcmVnZXhwICRsaW5lX2EgJGxpbmVfYl0gdGhlbiB7Ci0JCSAgICBscmVwbGFjZSAkbGlzdF9hICRqICRqICJDQU4gTk9UIE1BVENIIgotCQkgICAgYnJlYWsKLQkJfQotCSAgICB9Ci0KLQkgICAgaWYgeyAkaiA+PSBbbGxlbmd0aCAkbGlzdF9hXSB9IHsKLQkJdmVyYm9zZSAtbG9nICJcdCR0bXBkaXIvb2JqZHVtcC5vdXQ6ICRpOiAkbGluZV9iIgotCQkKLQkJcmV0dXJuIDAKLQkgICAgfQotCX0KLQkKLQlpZiB7IFtsbGVuZ3RoICRsaXN0X2FdICE9IFtsbGVuZ3RoICRsaXN0X2JdIH0gewotCSAgICB2ZXJib3NlIC1sb2cgIkxpbmUgY291bnQiCi0JICAgIHJldHVybiAwCi0JfQotCQotCWlmICRkaWZmZXJlbmNlczwxIHRoZW4gewotCSAgICByZXR1cm4gMQotCX0KLQkKLQlyZXR1cm4gMAotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcmV0dXJuIDAKLSAgICB9Ci0KLX0KLQotIwotIyBvYmpkdW1wX3ZlcnNpb25zdHVmZgotIwlEdW1wIHZlcnNpb24gZGVmaW5pdGlvbnMvcmVmZXJlbmNlcyBhbmQgbWFrZSBzdXJlIHRoYXQgaXQgaXMgc2FuZS4KLSMKLXByb2Mgb2JqZHVtcF92ZXJzaW9uc3R1ZmYgeyBvYmpkdW1wIG9iamVjdCBleHBlY3RmaWxlIH0gewotICAgIGdsb2JhbCBWT0JKRFVNUF9GTEFHUwotICAgIGdsb2JhbCB2ZXJzaW9uX291dHB1dAotICAgIGdsb2JhbCBkaWZmCi0gICAgZ2xvYmFsIHRtcGRpcgotCi0gICAgaWYge1t3aGljaCAkb2JqZHVtcF0gPT0gMH0gdGhlbiB7Ci0JcGVycm9yICIkb2JqZHVtcCBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIGlmICFbaW5mbyBleGlzdHMgVk9CSkRVTVBfRkxBR1NdIHsgc2V0IFZPQkpEVU1QX0ZMQUdTICIiIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgJFZPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZlcnNpb24vLFxcXCRwID4gJHRtcGRpci9vYmpkdW1wLm91dCIKLQotICAgIGNhdGNoICJleGVjICRvYmpkdW1wICRWT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WZXJzaW9uLyxcXFwkcCA+ICR0bXBkaXIvb2JqZHVtcC5vdXQiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCi0JIyBJdCdzIE9LIGlmIHRoZXJlIGFyZSBleHRyYSBsaW5lcyBpbiB0aGUgYWN0dWFsIG91dHB1dDsgdGhleQotCSMgbWF5IGNvbWUgZnJvbSB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIGxpYmMuICBXZSByZXF1aXJlIHRoYXQKLQkjIGV2ZXJ5IGxpbmUgaW4gRVhQRUNURklMRSBhcHBlYXIgaW4gdGhlIG91dHB1dCBpbiBvcmRlci4KLQotCXNldCBmMSBbb3BlbiAkdG1wZGlyL29iamR1bXAub3V0IHJdCi0Jc2V0IGYyIFtvcGVuICRleHBlY3RmaWxlIHJdCi0JZ2V0cyAkZjIgbDIKLQl3aGlsZSB7IFtnZXRzICRmMSBsMV0gIT0gLTEgfSB7Ci0JICAgIGlmIHsgW3N0cmluZyBtYXRjaCAkbDIgJGwxXSB9IHRoZW4gewotCQlpZiB7IFtnZXRzICRmMiBsMl0gPT0gLTEgfSB0aGVuIHsKLQkJICAgIGNsb3NlICRmMQotCQkgICAgY2xvc2UgJGYyCi0JCSAgICByZXR1cm4gMQotCQl9Ci0JICAgIH0KLQl9Ci0KLQkjIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgb3V0cHV0IHdpdGhvdXQgc2VlaW5nIHRoZSBsaW5lIHdlCi0JIyBleHBlY3RlZC4gIFRoaXMgaXMgYSB0ZXN0IGZhaWx1cmUuCi0KLQljbG9zZSAkZjEKLQljbG9zZSAkZjIKLQotCXZlcmJvc2UgLWxvZyAiRGlkIG5vdCBmaW5kIFwiJGwyXCIiCi0Jc2V0IGYxIFtvcGVuICR0bXBkaXIvb2JqZHVtcC5vdXQgcl0KLQl3aGlsZSB7IFtnZXRzICRmMSBsMV0gIT0gLTEgfSB7Ci0JICAgIHZlcmJvc2UgLWxvZyAkbDEKLQl9Ci0KLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlyZXR1cm4gMAotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLXByb2MgYnVpbGRfdmVyc19saWIgeyB0ZXN0IHNvdXJjZSBsaWJuYW1lIG90aGVyIG1hcGZpbGUgdmVyZXhwIHZlcnN5bWV4cCBzeW1leHAgfSB7Ci0gICAgZ2xvYmFsIGxkCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgZXhlY19vdXRwdXQKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgZ2xvYmFsIHRtcGRpcgotICAgIGdsb2JhbCBhcwotICAgIGdsb2JhbCBvYmpkdW1wCi0gICAgZ2xvYmFsIENDCi0gICAgZ2xvYmFsIENGTEFHUwotICAgIGdsb2JhbCBzaGFyZWQKLSAgICBnbG9iYWwgc2NyaXB0Ci0KLSAgICBpZiAhW2xkX2NvbXBpbGUgIiRDQyAtUyAkQ0ZMQUdTIiAkc3JjZGlyLyRzdWJkaXIvJHNvdXJjZSAkdG1wZGlyLyRsaWJuYW1lLnNdICAgICB7Ci0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHRtcGRpci8kbGlibmFtZS5zICR0bXBkaXIvJGxpYm5hbWUubyBdICAgICB7Ci0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkb3RoZXJdIHRoZW4gewotCXNldCBvdGhlcl9saWIgIiIKLSAgICB9IGVsc2UgewotCXNldCBvdGhlcl9saWIgJHRtcGRpci8kb3RoZXIKLSAgICB9Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRtYXBmaWxlXSB0aGVuIHsKLQlzZXQgc2NyaXB0X2FyZyAiIgotICAgIH0gZWxzZSB7Ci0Jc2V0IHNjcmlwdF9hcmcgIiRzY3JpcHQgJHNyY2Rpci8kc3ViZGlyLyRtYXBmaWxlIgotICAgIH0KLQotICAgIGlmIHshW2xkX3NpbXBsZV9saW5rICRsZCAkdG1wZGlyLyRsaWJuYW1lLnNvICIkc2hhcmVkICR0bXBkaXIvJGxpYm5hbWUubyAkb3RoZXJfbGliICRzY3JpcHRfYXJnIl19ICAgICB7Ci0JZmFpbCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgeyFbb2JqZHVtcF92ZXJzaW9uc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kbGlibmFtZS5zbyAkc3JjZGlyLyRzdWJkaXIvJHZlcmV4cCBdfSAgICAgewotCWZhaWwgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmIHshW29iamR1bXBfZHluc3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kbGlibmFtZS5zbyAkc3JjZGlyLyRzdWJkaXIvJHZlcnN5bWV4cCBdfSAgICAgewotCWZhaWwgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJHN5bWV4cF0gdGhlbiB7Ci0JaWYgeyFbb2JqZHVtcF9lbXB0eXN5bXN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGxpYm5hbWUubyBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0gZWxzZSB7Ci0JaWYgeyFbb2JqZHVtcF9zeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRsaWJuYW1lLm8gJHNyY2Rpci8kc3ViZGlyLyRzeW1leHAgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0KLSAgICBwYXNzICR0ZXN0Ci0gICAgCi19Ci0KLXByb2MgdGVzdF9sZGZhaWwgeyB0ZXN0IGZsYWcgc291cmNlIGV4ZWNuYW1lIG90aGVyIG1hcGZpbGUgd2h5ZmFpbCB9IHsKLSAgICBnbG9iYWwgbGQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBleGVjX291dHB1dAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLSAgICBnbG9iYWwgdG1wZGlyCi0gICAgZ2xvYmFsIGFzCi0gICAgZ2xvYmFsIG9iamR1bXAKLSAgICBnbG9iYWwgQ0MKLSAgICBnbG9iYWwgQ0ZMQUdTCi0gICAgZ2xvYmFsIHNjcmlwdAotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkb3RoZXJdIHRoZW4gewotCXNldCBvdGhlcl9saWIgIiIKLSAgICB9IGVsc2UgewotCXNldCBvdGhlcl9saWIgJHRtcGRpci8kb3RoZXIKLSAgICB9Ci0KLSAgICBpZiAhW2xkX2NvbXBpbGUgIiRDQyAtUyAkZmxhZyAkQ0ZMQUdTIiAkc3JjZGlyLyRzdWJkaXIvJHNvdXJjZSAkdG1wZGlyLyRleGVjbmFtZS5zXSAgICAgewotCXVucmVzb2x2ZWQgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmICFbbGRfYXNzZW1ibGUgJGFzICR0bXBkaXIvJGV4ZWNuYW1lLnMgJHRtcGRpci8kZXhlY25hbWUubyBdICAgICB7Ci0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgdmVyYm9zZSAtbG9nICJUaGlzIGxpbmsgc2hvdWxkIGZhaWwgYmVjYXVzZSBvZiAkd2h5ZmFpbCIKLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJG1hcGZpbGVdIHRoZW4gewotCXNldCBzY3JpcHRfYXJnICIiCi0gICAgfSBlbHNlIHsKLQlzZXQgc2NyaXB0X2FyZyAiJHNjcmlwdCAkc3JjZGlyLyRzdWJkaXIvJG1hcGZpbGUiCi0gICAgfQotCi0gICAgaWYgeyFbbGRfbGluayAkbGQgJHRtcGRpci8kZXhlY25hbWUgIiR0bXBkaXIvJGV4ZWNuYW1lLm8gJG90aGVyX2xpYiAkc2NyaXB0X2FyZyJdfSAgICAgewotCXBhc3MgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLSAgICBmYWlsICIkdGVzdCIKLX0KLQotcHJvYyB0ZXN0X2FzZmFpbCB7IHRlc3QgZmxhZyBzb3VyY2UgZXhlY25hbWUgd2h5ZmFpbCB9IHsKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCB0bXBkaXIKLSAgICBnbG9iYWwgYXMKLSAgICBnbG9iYWwgQ0MKLSAgICBnbG9iYWwgQ0ZMQUdTCi0KLSAgICBpZiAhW2xkX2NvbXBpbGUgIiRDQyAtUyAkZmxhZyAkQ0ZMQUdTIiAkc3JjZGlyLyRzdWJkaXIvJHNvdXJjZSAkdG1wZGlyLyRleGVjbmFtZS5zXSAgICAgewotCXVucmVzb2x2ZWQgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiVGhpcyBhc3NlbWJsZSBzaG91bGQgZmFpbCBiZWNhdXNlIG9mICR3aHlmYWlsIgotICAgIGNhdGNoICJleGVjICRhcyAtbyAkdG1wZGlyLyRleGVjbmFtZS5vICR0bXBkaXIvJGV4ZWNuYW1lLnMiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCWZhaWwgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLSAgICB2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLSAgICBwYXNzICIkdGVzdCIKLX0KLQotcHJvYyB0ZXN0X3N0cmlwX3ZlcnNfbGliIHsgdGVzdCBzcmNsaWIgbGlibmFtZSB2ZXJleHAgdmVyc3ltZXhwIH0gewotICAgIGdsb2JhbCBzdHJpcAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIGV4ZWNfb3V0cHV0Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIGdsb2JhbCB0bXBkaXIKLSAgICBnbG9iYWwgb2JqZHVtcAotCi0gICAgdmVyYm9zZSAtbG9nICJjcCAkdG1wZGlyLyRzcmNsaWIgJHRtcGRpci8kbGlibmFtZS5zbyIKLSAgICBleGVjIGNwICR0bXBkaXIvJHNyY2xpYiAkdG1wZGlyLyRsaWJuYW1lLnNvCi0KLSAgICB2ZXJib3NlIC1sb2cgIiRzdHJpcCAkdG1wZGlyLyRsaWJuYW1lLnNvIgotICAgIGNhdGNoICJleGVjICRzdHJpcCAkdG1wZGlyLyRsaWJuYW1lLnNvIiBleGVjX291dHB1dAotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQotIyBJZiBzdHJpcCB3ZW50IE9LLCB0aGVuIHJ1biB0aGUgdXN1YWwgdGVzdHMgb24gdGhlIHRoaW5nIHRvIG1ha2Ugc3VyZSB0aGF0Ci0jIGl0IGlzIHNhbmUuCi0JaWYgeyFbb2JqZHVtcF92ZXJzaW9uc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kbGlibmFtZS5zbyAkc3JjZGlyLyRzdWJkaXIvJHZlcmV4cCBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotCQotCWlmIHshW29iamR1bXBfZHluc3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kbGlibmFtZS5zbyAkc3JjZGlyLyRzdWJkaXIvJHZlcnN5bWV4cCBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotCQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JZmFpbCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotICAgIHBhc3MgJHRlc3QKLX0KLQotCi1wcm9jIGJ1aWxkX2V4ZWMgeyB0ZXN0IHNvdXJjZSBleGVjbmFtZSBmbGFncyBzb2xpYm5hbWUgdmVyZXhwIHZlcnN5bWV4cCBzeW1leHAgfSB7Ci0gICAgZ2xvYmFsIGxkCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgZXhlY19vdXRwdXQKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgZ2xvYmFsIHRtcGRpcgotICAgIGdsb2JhbCBhcwotICAgIGdsb2JhbCBvYmpkdW1wCi0gICAgZ2xvYmFsIENDCi0gICAgZ2xvYmFsIENGTEFHUwotCi0gICAgc2V0IHNoYXJlZCAtLXNoYXJlZAotICAgIHNldCBzY3JpcHQgLS12ZXJzaW9uLXNjcmlwdAotICAgIGlmICFbbGRfY29tcGlsZSAiJENDIC1TICRDRkxBR1MiICRzcmNkaXIvJHN1YmRpci8kc291cmNlICR0bXBkaXIvJGV4ZWNuYW1lLnNdICAgICB7Ci0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHRtcGRpci8kZXhlY25hbWUucyAkdG1wZGlyLyRleGVjbmFtZS5vIF0gICAgIHsKLQl1bnJlc29sdmVkICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRzb2xpYm5hbWVdIHRoZW4gewotCXNldCBzb2xpYm5hbWVfbGliICIiCi0gICAgfSBlbHNlIHsKLQlzZXQgc29saWJuYW1lX2xpYiAkdG1wZGlyLyRzb2xpYm5hbWUKLSAgICB9Ci0KLSAgICBpZiB7IVtsZF9saW5rICRsZCAkdG1wZGlyLyRleGVjbmFtZSAiJGZsYWdzICR0bXBkaXIvJGV4ZWNuYW1lLm8gJHNvbGlibmFtZV9saWIiXX0gICAgIHsKLQlmYWlsICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICR2ZXJleHBdIHRoZW4gewotIwotIyBNYWtlIHN1cmUgd2UgZ2V0IG5vdGhpbmcgYmFjay4KLSMKLQlpZiB7IVtvYmpkdW1wX2VtcHR5dmVyc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kZXhlY25hbWUgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9IGVsc2UgewotCWlmIHshW29iamR1bXBfdmVyc2lvbnN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGV4ZWNuYW1lICRzcmNkaXIvJHN1YmRpci8kdmVyZXhwIF19ICAgICB7Ci0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkdmVyc3ltZXhwXSB0aGVuIHsKLQlpZiB7IVtvYmpkdW1wX2VtcHR5ZHluc3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kZXhlY25hbWUgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9IGVsc2UgewotCWlmIHshW29iamR1bXBfZHluc3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kZXhlY25hbWUgJHNyY2Rpci8kc3ViZGlyLyR2ZXJzeW1leHAgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRzeW1leHBdIHRoZW4gewotCWlmIHshW29iamR1bXBfZW1wdHlzeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRleGVjbmFtZS5vIF19ICAgICB7Ci0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfSBlbHNlIHsKLQlpZiB7IVtvYmpkdW1wX3N5bXN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGV4ZWNuYW1lLm8gJHNyY2Rpci8kc3ViZGlyLyRzeW1leHAgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0KLSAgICBwYXNzICR0ZXN0Ci19Ci0KLQotIwotIyBCYXNpYyB0ZXN0IC0gYnVpbGQgYSBsaWJyYXJ5IHdpdGggdmVyc2lvbmVkIHN5bWJvbHMuCi0jCi1idWlsZF92ZXJzX2xpYiAidmVyczEiIHZlcnMxLmMgdmVyczEgIiIgdmVyczEubWFwIHZlcnMxLnZlciB2ZXJzMS5kc3ltIHZlcnMxLnN5bQotCi0KLSMKLSMgVGVzdCAjMiAtIGJ1aWxkIGEgbGlicmFyeSwgYW5kIGxpbmsgaXQgYWdhaW5zdCB0aGUgbGlicmFyeSB3ZSBidWlsdCBpbiBzdGVwCi0jIDEuCi0jCi1idWlsZF92ZXJzX2xpYiAidmVyczIiIHZlcnMyLmMgdmVyczIgdmVyczEuc28gdmVyczIubWFwIHZlcnMyLnZlciB2ZXJzMi5kc3ltICIiCi0KLSMKLSMgVGVzdCAjMyAtIGJ1aWxkIGFuIGV4ZWN1dGFibGUsIGFuZCBsaW5rIGl0IGFnYWluc3QgdmVyczEuc28uCi0jCi1idWlsZF9leGVjICJ2ZXJzMyIgdmVyczMuYyB2ZXJzMyAiIiB2ZXJzMS5zbyB2ZXJzMy52ZXIgdmVyczMuZHN5bSAiIgotCi0jCi0jIFRlc3QgIzQgLSBNYWtlIHN1cmUgYSB2ZXJzaW9uIGltcGxpY2l0bHkgZGVmaW5lZCBpbiBhbiBleGVjdXRhYmxlCi0jIGNhdXNlcyBhIHZlcnNpb24gbm9kZSB0byBiZSBjcmVhdGVkLiAgVmVyaWZ5IHRoaXMgYm90aCB3aXRoIGFuZCB3aXRob3V0Ci0jIC0tZXhwb3J0LWR5bmFtaWMuCi0jCi0KLSMgVGhpcyB0ZXN0IGZhaWxzIG9uIE1JUFMuICBPbiB0aGUgTUlQUyB3ZSBtdXN0IHB1dCBmb28gaW4gdGhlIGR5bmFtaWMKLSMgc3ltYm9sIHRhYmxlLCB3aGljaCB0aGUgdGVzdCBkb2VzIG5vdCBleHBlY3QuCi1zZXR1cF94ZmFpbCAibWlwcyotKi0qIgotYnVpbGRfZXhlYyAidmVyczQiIHZlcnM0LmMgdmVyczQgIiIgIiIgIiIgIiIgdmVyczQuc3ltCi0KLWJ1aWxkX2V4ZWMgInZlcnM0YSIgdmVyczQuYyB2ZXJzNGEgIi1leHBvcnQtZHluYW1pYyIgIiIgdmVyczRhLnZlciB2ZXJzNGEuZHN5bSB2ZXJzNGEuc3ltCi0KLQotIwotIyBUcnkgbXVsdGlwbGUgZGVmaW5pdGlvbnMgZm9vQEJBUiBhbmQgZm9vQEBCQVIgYW5kIG1ha2Ugc3VyZSB0aGUgbGlua2VyCi0jIGNvbXBsYWlucy4KLSMKLXRlc3RfbGRmYWlsICJ2ZXJzNSIgIiIgdmVyczUuYyB2ZXJzNSAiIiAiIiAibXVsdGlwbGUgZGVmaW5pdGlvbiBvZiBmb29AVkVSU18xLjIiCi0KLSMKLSMKLSMgTm93IGJ1aWxkIGEgdGVzdCB0aGF0IHNob3VsZCByZWZlcmVuY2UgYSBidW5jaCBvZiB2ZXJzaW9uZWQgc3ltYm9scy4KLSMgQWxsIG9mIHRoZW0gc2hvdWxkIGJlIGNvcnJlY3RseSByZWZlcmVuY2VkLgotIwotYnVpbGRfZXhlYyAidmVyczYiIHZlcnM2LmMgdmVyczYgIiIgdmVyczEuc28gdmVyczYudmVyIHZlcnM2LmRzeW0gdmVyczYuc3ltCi0KLSMKLSMgQW5vdGhlciB0ZXN0IHRvIHZlcmlmeSB0aGF0IHNvbWV0aGluZyBtYWRlIGxvY2FsIHZpYSAnbG9jYWwnIGlzIHRydWx5IG5vdAotIyBhY2Nlc3NpYmxlLgotIwotYnVpbGRfdmVyc19saWIgInZlcnM3YSIgdmVyczdhLmMgdmVyczdhICIiIHZlcnM3Lm1hcCB2ZXJzN2EudmVyIHZlcnM3YS5kc3ltIHZlcnM3YS5zeW0KLQotdGVzdF9sZGZhaWwgInZlcnM3IiAiIiB2ZXJzNy5jIHZlcnM3IHZlcnM3YS5zbyAiIiAidW5kZWZpbmVkIHJlZmVyZW5jZSB0byBoaWRlX2EiCi0KLQotIwotIyBUaGlzIHRlc3QgaXMgZGVzaWduZWQgdG8gdmVyaWZ5IHRoYXQgd2UgY2FuIHBhc3MgYSBsaW5rZXIgc2NyaXB0IG9uIHRoZQotIyBjb21tYW5kIGxpbmUgYXMgaWYgaXQgd2VyZSBhIG5vcm1hbCAubyBmaWxlLgotIwotY2F0Y2ggImV4ZWMgY3AgJHNyY2Rpci8kc3ViZGlyL3ZlcnM4Lm1hcCAkdG1wZGlyLyIgaWdub3JlX291dHB1dAotYnVpbGRfdmVyc19saWIgInZlcnM4IiB2ZXJzMS5jIHZlcnM4IHZlcnM4Lm1hcCAiIiB2ZXJzOC52ZXIgdmVyczEuZHN5bSB2ZXJzMS5zeW0KLQotIwotIyBUaGlzIHRlc3QgdHJpZXMgdG8gbWFrZSBzdXJlIHRoYXQgdmVyc2lvbiByZWZlcmVuY2VzIHRvIHZlcnNpb25lZCBzeW1ib2xzCi0jIGRvbid0IGNvbGxpZGUgd2l0aCBkZWZhdWx0IGRlZmluaXRpb25zIHdpdGggdGhlIHNhbWUgc3ltYm9sLgotIwotYnVpbGRfZXhlYyAidmVyczkiIHZlcnM5LmMgdmVyczkgIi1leHBvcnQtZHluYW1pYyIgIiIgdmVyczkudmVyIHZlcnM5LmRzeW0gdmVyczkuc3ltCi0KLQotIwotIyBUcnkgYW5kIHVzZSBhIG5vbi1leGlzdGFudCB2ZXJzaW9uIG5vZGUuICBUaGUgbGlua2VyIHNob3VsZCBmYWlsIHdpdGgKLSMgYW4gZXJyb3IgbWVzc2FnZS4KLSMKLXRlc3RfbGRmYWlsICJ2ZXJzMTAiICItRERPX1RFU1QxMCIgdmVyczEuYyB2ZXJzMTAgIiIgInZlcnMxLm1hcCAtLXNoYXJlZCIgImludmFsaWQgdmVyc2lvbiIKLQotIwotIyBUcnkgYW5kIHNvbWUgdGhpbmdzIHRoZSBhc3NlbWJsZXIgc2hvdWxkIGNvbXBsYWluIGFib3V0LgotIwotdGVzdF9hc2ZhaWwgInZlcnMxMSIgIi1ERE9fVEVTVDExIiB2ZXJzMS5jIHZlcnMxMSAibm8gQCBpbiBzeW12ZXIiCi0KLXRlc3RfYXNmYWlsICJ2ZXJzMTIiICItRERPX1RFU1QxMiIgdmVyczEuYyB2ZXJzMTIgImV4dGVybiB2ZXJzaW9uIGRlZmluaXRpb24iCi0KLSMKLSMgUHV0IGEgc2hhcmVkIGxpYnJhcnkgaW4gYW4gYXJjaGl2ZSBsaWJyYXJ5LCBhbmQgbWFrZSBzdXJlIHRoZSBnbG9iYWwKLSMgYXJjaGl2ZSBzeW1ib2wgdGFibGUgaXMgc2FuZS4KLSMKLXRlc3RfYXIgImFyIHdpdGggdmVyc2lvbmVkIHNvbGliIiB2ZXJzMTMuYSB2ZXJzMS5zbyB2ZXJzMTMuYXN5bQotCi0jCi0jIFN0cmlwIGEgc2hhcmVkIGxpYnJhcnksIGFuZCBtYWtlIHN1cmUgd2UgZGlkbid0IHNjcmV3IHNvbWV0aGluZyB1cCBpbiB0aGVyZS4KLSMKLXRlc3Rfc3RyaXBfdmVyc19saWIgInZlcnMxNCIgdmVyczEuc28gdmVyczE0IHZlcnMxLnZlciB2ZXJzMS5kc3ltIAotCi0KLSMKLSMgQnVpbGQgYW5vdGhlciB0ZXN0IHdpdGggc29tZSB2ZXJzaW9uZWQgc3ltYm9scy4gIEhlcmUgd2UgYXJlIGdvaW5nIHRvIAotIyB0cnkgYW5kIG92ZXJyaWRlIHNvbWV0aGluZyBmcm9tIHRoZSBsaWJyYXJ5LCBhbmQgd2Ugc2hvdWxkbid0IGdldAotIyBhbnkgZXJyb3JzLgotIwotYnVpbGRfZXhlYyAidmVyczE1IiB2ZXJzMTUuYyB2ZXJzMTUgIiIgdmVyczEuc28gdmVyczE1LnZlciB2ZXJzMTUuZHN5bSB2ZXJzMTUuc3ltCi0KLSMKLSMgVGVzdCB0aGF0IHdoZW4gd2Ugb3ZlcnJpZGUgYSB2ZXJzaW9uZWQgc3ltYm9sIGZyb20gdGhlIGxpYnJhcnkgdGhpcwotIyBzeW1ib2wgYXBwZWFycyBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgb2YgdGhlIGV4ZWN1dGFibGUuCi0jCi1idWlsZF92ZXJzX2xpYiAidmVyczE2YSIgdmVyczE2YS5jIHZlcnMxNmEgIiIgdmVyczE2Lm1hcCB2ZXJzMTZhLnZlciB2ZXJzMTZhLmRzeW0gIiIKLWJ1aWxkX2V4ZWMgInZlcnMxNiIgdmVyczE2LmMgdmVyczE2ICIiIHZlcnMxNmEuc28gIiIgdmVyczE2LmRzeW0gIiIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDQxZmQ5Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQmFzaWMgdGVzdCBvZiB2ZXJzaW9uaW5nLiAgVGhlIGlkZWEgd2l0aCB0aGlzIGlzIHRoYXQgd2UgZGVmaW5lCi0gKiBhIGJ1bmNoIG9mIGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIHN5bWJvbCwgYW5kIHdlIGNhbiB0aGVvcmV0aWNhbGx5Ci0gKiB0aGVuIGxpbmsgYXBwbGljYXRpb25zIGFnYWluc3QgdmFyeWluZyBzZXRzIG9mIHRoZXNlLgotICovCi1jb25zdCBjaGFyICogc2hvd19iYXIxID0gImFzZGYiOwotY29uc3QgY2hhciAqIHNob3dfYmFyMiA9ICJhc2RmIjsKLQotaW50Ci1iYXIoKQotewotCXJldHVybiAzOwotfQotCi0vKgotICogVGhlICdoaWRlJyBwcmVmaXggaXMgc29tZXRoaW5nIHNvIHRoYXQgd2UgY2FuIGF1dG9tYXRpY2FsbHkgc2VhcmNoIHRoZQotICogc3ltYm9sIHRhYmxlIGFuZCB2ZXJpZnkgdGhhdCBub25lIG9mIHRoZXNlIHN5bWJvbHMgd2VyZSBhY3R1YWxseSBleHBvcnRlZC4KLSAqLwotaW50Ci1oaWRlX29yaWdpbmFsX2ZvbygpCi17Ci0JcmV0dXJuIDErYmFyKCk7Ci0KLX0KLQotaW50Ci1oaWRlX29sZF9mb28oKQotewotCXJldHVybiAxMCtiYXIoKTsKLQotfQotCi1pbnQKLWhpZGVfb2xkX2ZvbzEoKQotewotCXJldHVybiAxMDArYmFyKCk7Ci0KLX0KLQotaW50Ci1oaWRlX25ld19mb28oKQotewotCXJldHVybiAxMDAwK2JhcigpOwotCi19Ci0KLV9fYXNtX18oIi5zeW12ZXIgaGlkZV9vcmlnaW5hbF9mb28sc2hvd19mb29AIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGhpZGVfb2xkX2ZvbyxzaG93X2Zvb0BWRVJTXzEuMSIpOwotX19hc21fXygiLnN5bXZlciBoaWRlX29sZF9mb28xLHNob3dfZm9vQFZFUlNfMS4yIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGhpZGVfbmV3X2ZvbyxzaG93X2Zvb0BAVkVSU18yLjAiKTsKLQotCi0KLSNpZmRlZiBET19URVNUMTAKLS8qIEluIHRlc3QgMTAsIHdlIHRyeSBhbmQgZGVmaW5lIGEgbm9uLWV4aXN0YW50IHZlcnNpb24gbm9kZS4gIFRoZSBsaW5rZXIKLSAqIHNob3VsZCBjYXRjaCB0aGlzIGFuZCBjb21wbGFpbi4gKi8KLWludAotaGlkZV9uZXdfYm9ndXNfZm9vKCkKLXsKLQlyZXR1cm4gMTAwMCtiYXIoKTsKLQotfQotX19hc21fXygiLnN5bXZlciBoaWRlX25ld19ib2d1c19mb28sc2hvd19mb29AVkVSU18yLjIiKTsKLSNlbmRpZgotCi0KLQotCi0jaWZkZWYgRE9fVEVTVDExCi0vKgotICogVGhpcyB0ZXN0IGlzIGRlc2lnbmVkIHRvIGNhdGNoIGEgY291cGxlIG9mIHN5bnRhY3RpYyBlcnJvcnMuICBUaGUgYXNzZW1ibGVyCi0gKiBzaG91bGQgY29tcGxhaW4gYWJvdXQgYm90aCBvZiB0aGUgZGlyZWN0aXZlcyBiZWxvdy4KLSAqLwotaW50Ci14eXp6eigpCi17Ci0gIG5ldzJfZm9vKCk7Ci0gIGJhcjMzKCk7Ci19Ci0KLV9fYXNtX18oIi5zeW12ZXIgbmV3Ml9mb28sZm9vVkVSU18yLjAiKTsKLV9fYXNtX18oIi5zeW12ZXIgYmFyMzMsYmFyQEBWRVJTXzIuMCIpOwotI2VuZGlmCi0KLSNpZmRlZiBET19URVNUMTIKLS8qCi0gKiBUaGlzIHRlc3QgaXMgZGVzaWduZWQgdG8gY2F0Y2ggYSBjb3VwbGUgb2Ygc3ludGFjdGljIGVycm9ycy4gIFRoZSBhc3NlbWJsZXIKLSAqIHNob3VsZCBjb21wbGFpbiBhYm91dCBib3RoIG9mIHRoZSBkaXJlY3RpdmVzIGJlbG93LgotICovCi1pbnQKLXh5enp6KCkKLXsKLSAgbmV3Ml9mb28oKTsKLSAgYmFyMzMoKTsKLX0KLQotX19hc21fXygiLnN5bXZlciBiYXIzMyxiYXJAQFZFUlNfMi4wIik7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzQ0MzRiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4xICAgIFZFUlNfMS4xCi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEuMiAgICBWRVJTXzEuMgotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18yLjAgICAgVkVSU18yLjAKLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogXChCYXNlXCkgICAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qIFwoVkVSU18xLjFcKSAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKFZFUlNfMS4yXCkgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qIGcgICAgRE8gKC5zP2RhdGF8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzIuMCAgICBzaG93X2JhcjEKLVswLTlhLWZdKiBnICAgIERPICgucz9kYXRhfFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18yLjAgICAgc2hvd19iYXIyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5tYXAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzM3YmMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEubWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotVkVSU18xLjEgewotCSBnbG9iYWw6Ci0JCSBmb28xOwotCSBsb2NhbDoKLQkJIGhpZGVfb2xkKjsgCi0JCSBoaWRlX29yaWdpbmFsKjsgCi0JCSBoaWRlX25ldyo7IAotfTsKLQotVkVSU18xLjIgewotCQkgZm9vMjsKLX0gVkVSU18xLjE7Ci0KLVZFUlNfMi4wIHsKLQkJIHNob3dfYmFyMTsgc2hvd19iYXIyOwotfSBWRVJTXzEuMjsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBmZjg1NS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29ACi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQFZFUlNfMS4xCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQFZFUlNfMS4yCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQEBWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTczMTJiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDBhMjY4ODFmIHRtcGRpci92ZXJzMS5zbwotMiAweDAwIDB4MGE3OTI3YjEgVkVSU18xLjEKLTMgMHgwMCAweDBhNzkyN2IyIFZFUlNfMS4yCi0JVkVSU18xLjEgCi00IDB4MDAgMHgwYTc5MjJiMCBWRVJTXzIuMAotCVZFUlNfMS4yIAotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTMuYXN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxMy5hc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQ2MTQ0Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxMy5hc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotVkVSU18xLjEgaW4gdmVyczEuc28KLVZFUlNfMS4yIGluIHZlcnMxLnNvCi1WRVJTXzIuMCBpbiB2ZXJzMS5zbwotYmFyIGluIHZlcnMxLnNvCi1zaG93X2JhcjEgaW4gdmVyczEuc28KLXNob3dfYmFyMiBpbiB2ZXJzMS5zbwotc2hvd19mb29AIGluIHZlcnMxLnNvCi1zaG93X2Zvb0BAVkVSU18yLjAgaW4gdmVyczEuc28KLXNob3dfZm9vQFZFUlNfMS4xIGluIHZlcnMxLnNvCi1zaG93X2Zvb0BWRVJTXzEuMiBpbiB2ZXJzMS5zbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyYmUzZi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBUZXN0Y2FzZSB0byBtYWtlIHN1cmUgdGhhdCBpZiB3ZSBleHRlcm5hbGx5IHJlZmVyZW5jZSBhIHZlcnNpb25lZCBzeW1ib2wKLSAqIHRoYXQgd2UgYWx3YXlzIGdldCB0aGUgcmlnaHQgb25lLgotICovCi0KLWludAotZm9vXzEoKQotewotICByZXR1cm4gMTAzNDsKLX0KLQotaW50Ci1mb29fMigpCi17Ci0gIHJldHVybiAxMzQzOwotfQotCi1pbnQKLWZvb18zKCkKLXsKLSAgcmV0dXJuIDEzMzQ7Ci19Ci0KLWludAotbWFpbigpCi17Ci0gIHByaW50ZigiRXhwZWN0IDQsICAgIGdldCAlZFxuIiwgZm9vXzEoKSk7Ci0gIHByaW50ZigiRXhwZWN0IDEzLCAgIGdldCAlZFxuIiwgZm9vXzIoKSk7Ci0gIHByaW50ZigiRXhwZWN0IDEwMywgIGdldCAlZFxuIiwgZm9vXzMoKSk7Ci0gIHJldHVybiAwOwotfQotCi1fX2FzbV9fKCIuc3ltdmVyIGZvb18xLHNob3dfZm9vQCIpOwotX19hc21fXygiLnN5bXZlciBmb29fMixzaG93X2Zvb0BWRVJTXzEuMSIpOwotX19hc21fXygiLnN5bXZlciBmb29fMyxzaG93X2Zvb0BAVkVSU18xLjIiKTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNWUxNWMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4xICAgIFZFUlNfMS4xCi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEuMiAgICBWRVJTXzEuMgotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKEJhc2VcKSAgICAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogXChWRVJTXzEuMVwpICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzEuMiAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2JhYjYyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29ACi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQFZFUlNfMS4xCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQEBWRVJTXzEuMgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMmVjNTguLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDBkOGEyNjA1IHRtcGRpci92ZXJzMTUKLTIgMHgwMCAweDBhNzkyN2IyIFZFUlNfMS4yCi0zIDB4MDAgMHgwYTc5MjdiMSBWRVJTXzEuMQotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjY4YmM2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotaW50IHNob3dfYmFyICgpCi17Ci0gIHJldHVybiAwOwotfQotZXh0ZXJuIGludCBzaG93X2ZvbyAoKTsKLQotaW50IG1haW4gKCkKLXsKLSAgcmV0dXJuIHNob3dfZm9vICgpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2LmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM0MjRjMy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotWzAtOWEtZl0qIGcgICAgREYgKFwudGV4dHxcKkFCU1wqKQlbMC05YS1mXSooICBCYXNlICAgICAgICk/ICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2JhcgotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSooICAgICAgICAgICAgICk/ICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2Lm1hcCBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NjMzMmYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2Lm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotVkVSU18xLjEgewotICBnbG9iYWw6IHNob3dfYmFyOwotfTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUzYjFmZC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWludCBzaG93X2JhciAoKQotewotICByZXR1cm4gMTsKLX0KLWludCBzaG93X2ZvbyAoKQotewotICByZXR1cm4gc2hvd19iYXIgKCk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OGRmNDcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1bMC05YS1mXSogZyAgICBETyAoXC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18xXC4xICAgIFZFUlNfMVwuMQotWzAtOWEtZl0qIGcgICAgREYgKFwudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMVwuMSAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19iYXIKLVswLTlhLWZdKiBnICAgIERGIChcLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBCYXNlICAgICAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjY2YxZGYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwNjAxY2ZiZiB0bXBkaXIvdmVyczE2YS5zbwotMiAweDAwIDB4MGE3OTI3YjEgVkVSU18xLjEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmE1MzdlLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vKgotICogVGVzdCBmdW5jdGlvbi4gIFRoaXMgaXMgYnVpbHQgaW50byBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgcmVmZXJlbmNlcyBhCi0gKiB2ZXJzaW9uZWQgc3ltYm9sIGZvbyB0aGF0IGlzIGluIHRlc3Quc28uCi0gKi8KLQotdm9pZAotc2hvd194eXp6eSgpCi17Ci0gIHByaW50ZigiJWQiLCBzaG93X2ZvbygpKTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTk4NWMyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVswLTlhLWZdKiAgICAgIERGIFwqVU5EXCoJWzAtOWEtZl0qICBWRVJTXzIuMCAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfWFhYXzEuMSBWRVJTX1hYWF8xLjEKLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfWFhYXzEuMSAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd194eXp6eQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIubWFwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDU3ZDdlLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCi1WRVJTX1hYWF8xLjEgewotCQkgc2hvd194eXp6eTsKLX07CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjYzNDMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIudmVyCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1WZXJzaW9uIGRlZmluaXRpb25zOgotMSAweDAxIDB4MGEyNjE4MWYgdG1wZGlyL3ZlcnMyLnNvCi0yIDB4MDAgMHgwODc4NWI1MSBWRVJTX1hYWF8xLjEKLQotVmVyc2lvbiBSZWZlcmVuY2VzOgotICByZXF1aXJlZCBmcm9tIHRtcGRpci92ZXJzMS5zbzoKLSAgICAweDBhNzkyMmIwIDB4MDAgMDMgVkVSU18yLjAKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMDZkNzcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMuYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8qCi0gKiBNYWluIHByb2dyYW0gZm9yIHRlc3QxLCB0ZXN0Mi4KLSAqLwotCi1pbnQKLW1haW4oKQotewotICBwcmludGYoIiVkXG4iLCBzaG93X2ZvbygpKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzljMjY0Mi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTIzMGVlLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVmVyc2lvbiBSZWZlcmVuY2VzOgotICByZXF1aXJlZCBmcm9tIHRtcGRpci92ZXJzMS5zbzoKLSAgICAweDBhNzkyMmIwIDB4MDAgMDIgVkVSU18yLjAKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczQuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDk3Y2EuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczQuYworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBUZXN0Y2FzZSB0byBtYWtlIHN1cmUgdGhhdCBhIHZlcnNpb25lZCBzeW1ib2wgZGVmaW5pdGlvbiBpbiBhbgotICogYXBwbGljYXRpb24gY29ycmVjdGx5IGRlZmluZXMgdGhlIHZlcnNpb24gbm9kZSwgaWYgYW5kIG9ubHkgaWYKLSAqIHRoZSBhY3R1YWwgc3ltYm9sIGlzIGV4cG9ydGVkLiAgVGhpcyBpcyBidWlsdCBib3RoIHdpdGggYW5kIHdpdGhvdXQKLSAqIC1leHBvcnQtZHluYW1pYy4KLSAqLwotaW50Ci1iYXIoKQotewotCXJldHVybiAzOwotfQotCi1pbnQKLW5ld19mb28oKQotewotCXJldHVybiAxMDAwK2JhcigpOwotCi19Ci0KLV9fYXNtX18oIi5zeW12ZXIgbmV3X2Zvbyxmb29AQFZFUlNfMi4wIik7Ci0KLWludAotbWFpbigpCi17Ci0gIHByaW50ZigiJWRcbiIsIGZvbygpKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNC5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNC5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDk0NDYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczQuc3ltCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb29AQFZFUlNfMi4wCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNGEuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2Y5ZmRhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzIuMCAgICBWRVJTXzIuMAotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18yLjAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDk0NDYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnN5bQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vQEBWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NmNlZGMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDBkOGEyNmUxIHRtcGRpci92ZXJzNGEKLTIgMHgwMCAweDBhNzkyMmIwIFZFUlNfMi4wCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM1LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzZlYTQwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogVGVzdGNhc2UgdG8gdmVyaWZ5IHRoYXQgZm9vQEJBUiBhbmQgZm9vQEBCQVIgYXJlIGNvcnJlY3RseSBkZXRlY3RlZAotICogYXMgYSBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbC4KLSAqLwotY29uc3QgY2hhciAqIGJhcjEgPSAiYXNkZiI7Ci1jb25zdCBjaGFyICogYmFyMiA9ICJhc2RmIjsKLQotaW50Ci1iYXIoKQotewotCXJldHVybiAzOwotfQotCi1pbnQKLW9yaWdpbmFsX2ZvbygpCi17Ci0JcmV0dXJuIDErYmFyKCk7Ci0KLX0KLQotaW50Ci1vbGRfZm9vKCkKLXsKLQlyZXR1cm4gMTArYmFyKCk7Ci0KLX0KLQotaW50Ci1vbGRfZm9vMSgpCi17Ci0JcmV0dXJuIDEwMCtiYXIoKTsKLQotfQotCi1pbnQKLW5ld19mb28oKQotewotCXJldHVybiAxMDAwK2JhcigpOwotCi19Ci0KLV9fYXNtX18oIi5zeW12ZXIgb3JpZ2luYWxfZm9vLGZvb0AiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2Zvbyxmb29AVkVSU18xLjEiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2ZvbzEsZm9vQFZFUlNfMS4yIik7Ci1fX2FzbV9fKCIuc3ltdmVyIG5ld19mb28sZm9vQEBWRVJTXzEuMiIpOwotCi1pbnQKLW1haW4gKCkKLXsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU4NjhiZi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIFRlc3RjYXNlIHRvIG1ha2Ugc3VyZSB0aGF0IGlmIHdlIGV4dGVybmFsbHkgcmVmZXJlbmNlIGEgdmVyc2lvbmVkIHN5bWJvbAotICogdGhhdCB3ZSBhbHdheXMgZ2V0IHRoZSByaWdodCBvbmUuCi0gKi8KLQotaW50Ci1tYWluKCkKLXsKLSAgcHJpbnRmKCJFeHBlY3QgNCwgICAgZ2V0ICVkXG4iLCBmb29fMSgpKTsKLSAgcHJpbnRmKCJFeHBlY3QgMTMsICAgZ2V0ICVkXG4iLCBmb29fMigpKTsKLSAgcHJpbnRmKCJFeHBlY3QgMTAzLCAgZ2V0ICVkXG4iLCBmb29fMygpKTsKLSAgcHJpbnRmKCJFeHBlY3QgMTAwMywgZ2V0ICVkXG4iLCBmb29fNCgpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLV9fYXNtX18oIi5zeW12ZXIgZm9vXzEsc2hvd19mb29AIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGZvb18yLHNob3dfZm9vQFZFUlNfMS4xIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGZvb18zLHNob3dfZm9vQFZFUlNfMS4yIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGZvb180LHNob3dfZm9vQFZFUlNfMi4wIik7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U4NTFkNC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1bMC05YS1mXSogICAgICBERiBcKlVORFwqCVswLTlhLWZdKiAgICAgICAgICAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogICAgICBERiBcKlVORFwqCVswLTlhLWZdKiAgVkVSU18yLjAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogICAgICBERiBcKlVORFwqCVswLTlhLWZdKiAgVkVSU18xLjIgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogICAgICBERiBcKlVORFwqCVswLTlhLWZdKiAgVkVSU18xLjEgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YjVjYzcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuc3ltCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1bMF0qICpGPyAqXCpVTkRcKglbMF0qIHNob3dfZm9vQAotWzBdKiAqRj8gKlwqVU5EXCoJWzBdKiBzaG93X2Zvb0BWRVJTXzEuMQotWzBdKiAqRj8gKlwqVU5EXCoJWzBdKiBzaG93X2Zvb0BWRVJTXzEuMgotWzBdKiAqRj8gKlwqVU5EXCoJWzBdKiBzaG93X2Zvb0BWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGEyYjQ2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotVmVyc2lvbiBSZWZlcmVuY2VzOgotICByZXF1aXJlZCBmcm9tIHRtcGRpci92ZXJzMS5zbzoKLSAgICAweDBhNzkyN2IxIDB4MDAgPz8gVkVSU18xLjEKLSAgICAweDBhNzkyN2IyIDB4MDAgPz8gVkVSU18xLjIKLSAgICAweDBhNzkyMmIwIDB4MDAgPz8gVkVSU18yLjAKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNWI3ZTAuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcuYworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qCi0gKiBUZXN0IHByb2dyYW0gdGhhdCBnb2VzIHdpdGggdGVzdDcuc28KLSAqLwotCi0KLWludAotbWFpbigpCi17Ci0gIHJldHVybiBoaWRlX2EoMSkgKyBzaG93X2IoMSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcubWFwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWZkNTAxLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3Lm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotVkVSU18xIHsKLQlnbG9iYWw6Ci0JCXNob3dfYiA7Ci0JbG9jYWw6Ci0JCWhpZGVfYTsKLX07CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2EuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmVlOGM3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIFRlc3Qgc3VwcGxpZWQgYnkgVWxyaWNoLiAgVmVyaWZ5IHRoYXQgd2UgY2FuIGNvcnJlY3RseSBmb3JjZSAnYScKLSAqIHRvIGxvY2FsIHNjb3BlLgotICovCi1pbnQKLV9fYV9pbnRlcm5hbCAoaW50IGUpCi17Ci0gIHJldHVybiBlICsgMTA7Ci19Ci0KLWludAotX19iX2ludGVybmFsIChpbnQgZSkKLXsKLSAgcmV0dXJuIGUgKyA0MjsKLX0KLQotYXNtICgiLnN5bXZlciBfX2FfaW50ZXJuYWwsaGlkZV9hQEBWRVJTXzEiKTsKLWFzbSAoIi5zeW12ZXIgX19iX2ludGVybmFsLHNob3dfYkBAVkVSU18xIik7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2EuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjY5NmM3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEgICAgICBWRVJTXzEKLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMSAgICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2IKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2Euc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTliZDYxLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/aGlkZV9hQEBWRVJTXzEKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19iQEBWRVJTXzEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2EudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2VmOGE4Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwMjY5ZmQzZiB0bXBkaXIvdmVyczdhLnNvCi0yIDB4MDAgMHgwNWFhNzkyMSBWRVJTXzEKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczguYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDU4NmMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczguYworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaW50Ci1tYWluKCkKLXsKLSAgcmV0dXJuIGEoMSkgKyBiKDEpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczgubWFwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczgubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjM1OTU1Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM4Lm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLVZFUlNJT04gewotCVZFUlNfMS4xIHsKLQkJIGdsb2JhbDoKLQkJCSBmb28xOwotCQkgbG9jYWw6Ci0JCQkgaGlkZV9vbGQqOyAKLQkJCSBoaWRlX29yaWdpbmFsKjsgCi0JCQkgaGlkZV9uZXcqOyAKLQl9OwotCQotCVZFUlNfMS4yIHsKLQkJCSBmb28yOwotCX0gVkVSU18xLjE7Ci0JCi0JVkVSU18yLjAgewotCQkJIHNob3dfYmFyMTsgc2hvd19iYXIyOwotCX0gVkVSU18xLjI7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTkwMjMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczgudmVyCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1WZXJzaW9uIGRlZmluaXRpb25zOgotMSAweDAxIDB4MGEyNmY4MWYgdG1wZGlyL3ZlcnM4LnNvCi0yIDB4MDAgMHgwYTc5MjdiMSBWRVJTXzEuMQotMyAweDAwIDB4MGE3OTI3YjIgVkVSU18xLjIKLQlWRVJTXzEuMSAKLTQgMHgwMCAweDBhNzkyMmIwIFZFUlNfMi4wCi0JVkVSU18xLjIgCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzJmZGRiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogVGVzdGNhc2UgdG8gdmVyaWZ5IHRoYXQgcmVmZXJlbmNlIHRvIGZvb0BCQVIgYW5kIGEgZGVmaW5pdGlvbiBvZiBmb29AQEJBUgotICogYXJlIG5vdCB0cmVhdGVkIGFzIGEgbXVsdGlwbGUgZGVmLgotICovCi1jb25zdCBjaGFyICogYmFyMSA9ICJhc2RmIjsKLWNvbnN0IGNoYXIgKiBiYXIyID0gImFzZGYiOwotCi1pbnQKLWJhcigpCi17Ci0JcmV0dXJuIDM7Ci19Ci0KLWludAotb3JpZ2luYWxfZm9vKCkKLXsKLQlyZXR1cm4gMStiYXIoKTsKLQotfQotCi1pbnQKLW9sZF9mb28oKQotewotCXJldHVybiAxMCtiYXIoKTsKLQotfQotCi1pbnQKLW5ld19mb28oKQotewotCXJldHVybiAxMDAwK2JhcigpOwotCi19Ci0KLWludAotbWFpbigpCi17Ci0gIG9sZF9mb28xKCk7Ci0gIHJldHVybiAwOwotfQotCi1fX2FzbV9fKCIuc3ltdmVyIG9yaWdpbmFsX2Zvbyxmb29AIik7Ci1fX2FzbV9fKCIuc3ltdmVyIG9sZF9mb28sZm9vQFZFUlNfMS4xIik7Ci1fX2FzbV9fKCIuc3ltdmVyIG9sZF9mb28xLGZvb0BWRVJTXzEuMiIpOwotX19hc21fXygiLnN5bXZlciBuZXdfZm9vLGZvb0BAVkVSU18xLjIiKTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzkzMDAyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4xICAgIFZFUlNfMS4xCi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEuMiAgICBWRVJTXzEuMgotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKFZFUlNfMS4xXCkgICAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzEuMiAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMzE1MTYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuc3ltCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1bMF0qICpGPyAqXCpVTkRcKglbMF0qIGZvb0BWRVJTXzEuMgotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb29ACi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP2Zvb0BWRVJTXzEuMQotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb29AQFZFUlNfMS4yCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3M2JhNzIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkudmVyCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1WZXJzaW9uIGRlZmluaXRpb25zOgotMSAweDAxIDB4MDRkOGEyNjkgdG1wZGlyL3ZlcnM5Ci0yIDB4MDAgMHgwYTc5MjdiMSBWRVJTXzEuMQotMyAweDAwIDB4MGE3OTI3YjIgVkVSU18xLjIKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL2VtcGljLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9lbXBpYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNTI4YmUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL2VtcGljLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0jIEV4cGVjdCBzY3JpcHQgZm9yIGxkLWVtcGljIHRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTk0LDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIChpYW5AY3lnbnVzLmNvbSkKLSMKLQotIyBUZXN0IHRoZSBoYW5kbGluZyBvZiBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLiAgVGhpcyB0ZXN0IGVzc2VudGlhbGx5Ci0jIHRlc3RzIHRoZSBjb21waWxlciBhbmQgYXNzZW1ibGVyIGFzIHdlbGwgYXMgdGhlIGxpbmtlciwgc2luY2UgTUlQUwotIyBlbWJlZGRlZCBQSUMgaXMgYSBHTlUgZW5oYW5jZW1lbnQgdG8gc3RhbmRhcmQgTUlQUyB0b29scy4KLQotIyBFbWJlZGRlZCBQSUMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIE1JUFMgRUNPRkYgdGFyZ2V0cy4KLWlmICFbaXN0YXJnZXQgbWlwcyotKi1lY29mZipdIHsKLSAgICByZXR1cm4KLX0KLQotc2V0IHRlc3RuYW1lIHJlbGF4Ci0KLWlmIHsgW3doaWNoICRDQ10gPT0gMCB9IHsKLSAgICB1bnRlc3RlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotIyBUZXN0IHRoYXQgcmVsYXhhdGlvbiB3b3JrcyBjb3JyZWN0bHkuICBUaGlzIHRlc3RzdWl0ZSB3YXMgY29tcG9zZWQKLSMgKGJ5IGV4cGVyaW1lbnRhdGlvbikgdG8gZm9yY2UgdGhlIGxpbmtlciB0byByZWxheCB0d2ljZS0tdGhhdCBpcywKLSMgdGhlIGZpcnN0IHJlbGF4YXRpb24gcGFzcyB3aWxsIGZvcmNlIGFub3RoZXIgY2FsbCB0byBiZSBvdXQgb2YKLSMgcmFuZ2UsIHJlcXVpcmluZyBhIHNlY29uZCByZWxheGF0aW9uIHBhc3MuCi1pZiB7ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9yZWxheDEuYyB0bXBkaXIvcmVsYXgxLm9dCi0gICAgIHx8ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9yZWxheDIuYyB0bXBkaXIvcmVsYXgyLm9dCi0gICAgIHx8ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9yZWxheDMuYyB0bXBkaXIvcmVsYXgzLm9dCi0gICAgIHx8ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9yZWxheDQuYyB0bXBkaXIvcmVsYXg0Lm9dIH0gewotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9yZWxheCAiLS1yZWxheCAtVCAkc3JjZGlyLyRzdWJkaXIvcmVsYXgudCB0bXBkaXIvcmVsYXgxLm8gdG1wZGlyL3JlbGF4Mi5vIHRtcGRpci9yZWxheDMubyB0bXBkaXIvcmVsYXg0Lm8iXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLX0gZWxzZSB7Ci0gICAgIyBDaGVjayB0aGF0IHRoZSByZWxheGF0aW9uIHByb2R1Y2VkIHRoZSBjb3JyZWN0IHJlc3VsdC4gIENoZWNrCi0gICAgIyBlYWNoIGJhbCBpbnN0cnVjdGlvbi4gIFNvbWUgd2lsbCBnbyBkaXJlY3RseSB0byB0aGUgc3RhcnQgb2YgYQotICAgICMgZnVuY3Rpb24sIHdoaWNoIGlzIE9LLiAgU29tZSB3aWxsIGZvcm0gcGFydCBvZiB0aGUgZml2ZQotICAgICMgaW5zdHJ1Y3Rpb24gZXhwYW5kZWQgY2FsbCBzZXF1ZW5jZSwgaW4gd2hpY2ggY2FzZSB3ZSBjb21wdXRlIHRoZQotICAgICMgcmVhbCBkZXN0aW5hdGlvbiBhbmQgbWFrZSBzdXJlIGl0IGlzIHRoZSBzdGFydCBvZiBhIGZ1bmN0aW9uLgotICAgICMgU29tZSBiYWwgaW5zdHJ1Y3Rpb25zIGFyZSB1c2VkIHRvIGxvY2F0ZSB0aGUgc3RhcnQgb2YgdGhlCi0gICAgIyBmdW5jdGlvbiBpbiBvcmRlciB0byBkbyBwb3NpdGlvbiBpbmRlcGVuZGVudCBhZGRyZXNzaW5nIGludG8gdGhlCi0gICAgIyB0ZXh0IHNlY3Rpb24sIGluIHdoaWNoIGNhc2Ugd2UganVzdCBjaGVjayB0aGF0IGl0IGNvcnJlY3RseQotICAgICMgY29tcHV0ZXMgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4KLQotICAgICMgR2V0IHRoZSBzeW1ib2wgdGFibGUuCi0gICAgaWYgIVtsZF9ubSAkbm0gdG1wZGlyL3JlbGF4XSB7Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICAjIEdldCBhIGRpc2Fzc2VtYmx5LgotICAgIHNlbmRfbG9nICIkb2JqZHVtcCAtZCB0bXBkaXIvcmVsYXggPnRtcGRpci9yZWxheC5kaXNcbiIKLSAgICB2ZXJib3NlICIkb2JqZHVtcCAtZCB0bXBkaXIvcmVsYXggPnRtcGRpci9yZWxheC5kaXMiCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgLWQgdG1wZGlyL3JlbGF4ID50bXBkaXIvcmVsYXguZGlzIiBleGVjX291dHB1dAotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICRleGVjX291dHB1dAotCXVucmVzb2x2ZWQgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGJhbGNudCAwCi0gICAgc2V0IGZpbGUgW29wZW4gdG1wZGlyL3JlbGF4LmRpcyByXQotICAgIHdoaWxlIHsgW2dldHMgJGZpbGUgbGluZV0gIT0gLTEgfSB7Ci0JdmVyYm9zZSAiJGxpbmUiIDIKLQotCWlmICFbc3RyaW5nIG1hdGNoICIqYmFsKiIgJGxpbmVdIHsKLQkgICAgY29udGludWUKLQl9Ci0KLQl2ZXJib3NlICIkbGluZSIKLQotCWluY3IgYmFsY250Ci0KLQlpZiAhW3JlZ2V4cCAiXihcWzAtOWEtZkEtRlxdKykgKDxcW2EteiswLTlBLVouXF0rPik/IGJhbCAoXFswLTlhLWZBLUZcXSspIiAkbGluZSB3aG9sZSBhZGRyIGxhYmVsIGRlc3RdIHsKLQkgICAgcGVycm9yICJ1bnJlY29nbml6ZWQgZm9ybWF0IGZvciAkbGluZSIKLQkgICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQkgICAgcmV0dXJuCi0JfQotCi0JaWYgIjB4JGFkZHIgKyA4ICE9IDB4JGRlc3QiIHsKLQkgICAgIyBUaGlzIGlzIGEgc3RyYWlnaHQgZnVuY3Rpb24gY2FsbC4gIEFsbCBmdW5jdGlvbiBjYWxscyBpbgotCSAgICAjIHRoaXMgZXhhbXBsZSBhcmUgdG8gZWl0aGVyIGZvbyBvciBiYXIuCi0JICAgIGlmICIweCRkZXN0ICE9ICRubV9vdXRwdXQoZm9vKSAmJiAweCRkZXN0ICE9ICRubV9vdXRwdXQoYmFyKSIgewotCQlzZW5kX2xvZyAiZmFpbCAxXG4iCi0JCXNlbmRfbG9nICIkbGluZVxuIgotCQlmYWlsICR0ZXN0bmFtZQotCQlyZXR1cm4KLQkgICAgfQotCX0gZWxzZSB7Ci0JICAgICMgUGljayB1cCB0aGUgbmV4dCBsaW5lLiAgSWYgaXQgaXMgc2xsLCB0aGlzIGlzIGEgc3dpdGNoCi0JICAgICMgcHJvbG9ndWUsIGFuZCB0aGVyZSBpcyBub3QgbXVjaCB3ZSBjYW4gZG8gdG8gdGVzdCBpdC4KLQkgICAgIyBPdGhlcndpc2UsIGl0IHNob3VsZCBiZSBsdWksIGFuZCB0aGUgbmV4dCBpbnN0cnVjdGlvbgotCSAgICAjIHNob3VsZCBiZSBhbiBhZGRpdSwgZm9sbG93ZWQgYnkgYW4gYWRkdSB0byAkMzEuCi0JICAgIGlmIHsgW2dldHMgJGZpbGUgbF0gPT0gLTEgfSB7Ci0JCXNlbmRfbG9nICJmYWlsIDJcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCWZhaWwgJHRlc3RuYW1lCi0JCXJldHVybgotCSAgICB9Ci0JICAgIHZlcmJvc2UgJGwKLQotCSAgICBpZiBbc3RyaW5nIG1hdGNoICIqc2xsKiIgJGxdIHsKLQkJY29udGludWUKLQkgICAgfQotCSAgICBpZiAhW3JlZ2V4cCAibHVpIChcW1wkYS16MC05XF0rKSwoXFswLTlhLWZBLUZ4XF0rKSIgJGwgd2hvbGUgcmVnIHVwcGVyXSB7Ci0JCXNlbmRfbG9nICJmYWlsIDNcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCXNlbmRfbG9nICIkbFxuIgotCQlmYWlsICR0ZXN0bmFtZQotCQlyZXR1cm4KLQkgICAgfQotCi0JICAgIGlmIHsgW2dldHMgJGZpbGUgbF0gPT0gLTEgfSB7Ci0JCXNlbmRfbG9nICJmYWlsIDRcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCWZhaWwgJHRlc3RuYW1lCi0JCXJldHVybgotCSAgICB9Ci0JICAgIHZlcmJvc2UgIiRsIgotCSAgICBpZiAhW3JlZ2V4cCAiYWRkaXUgXFwkcmVnLFxcJHJlZywoXFstMC05XF0rKSIgJGwgd2hvbGUgbG93ZXJdIHsKLQkJc2VuZF9sb2cgImZhaWwgNVxuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJc2VuZF9sb2cgIiRsXG4iCi0JCXNlbmRfbG9nICJhZGRpdSBcXCRyZWcsXFwkcmVnLChcWy0wLTlcXSspXG4iCi0JCWZhaWwgJHRlc3RuYW1lCi0JCXJldHVybgotCSAgICB9Ci0KLQkgICAgaWYgeyBbZ2V0cyAkZmlsZSBsXSA9PSAtMSB9IHsKLQkJc2VuZF9sb2cgImZhaWwgNlxuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJZmFpbCAkdGVzdG5hbWUKLQkJcmV0dXJuCi0JICAgIH0KLQkgICAgdmVyYm9zZSAiJGwiCi0JICAgIGlmICFbcmVnZXhwICJhZGR1IFxcJHJlZyxcXCRyZWcsXFxcJHJhIiAkbF0gewotCQlzZW5kX2xvZyAiZmFpbCA3XG4iCi0JCXNlbmRfbG9nICIkbGluZVxuIgotCQlzZW5kX2xvZyAiJGxcbiIKLQkJZmFpbCAkdGVzdG5hbWUKLQkJcmV0dXJuCi0JICAgIH0KLQotCSAgICAjIFRoZSBuZXh0IGxpbmUgd2lsbCBiZSBqYWxyIGluIHRoZSBjYXNlIG9mIGFuIGV4cGFuZGVkCi0JICAgICMgY2FsbC4gIE90aGVyd2lzZSwgdGhlIGNvZGUgaXMgZ2V0dGluZyB0aGUgc3RhcnQgb2YgdGhlCi0JICAgICMgZnVuY3Rpb24sIGFuZCB0aGUgbmV4dCBsaW5lIGNhbiBiZSBhbnl0aGluZy4KLQotCSAgICBpZiB7IFtnZXRzICRmaWxlIGxdID09IC0xIH0gewotCQlzZW5kX2xvZyAiZmFpbCA4XG4iCi0JCXNlbmRfbG9nICIkbGluZVxuIgotCQlmYWlsICR0ZXN0bmFtZQotCQlyZXR1cm4KLQkgICAgfQotCSAgICB2ZXJib3NlICIkbCIJCi0JICAgIGlmIFtzdHJpbmcgbWF0Y2ggIipqYWxyKiIgJGxdIHsKLQkJc2V0IGRlc3QgW2V4cHIgMHgkYWRkciArIDggKyAoJHVwcGVyIDw8IDE2KSArICRsb3dlcl0KLQkJaWYgeyAkZGVzdCAhPSAkbm1fb3V0cHV0KGZvbykgJiYgJGRlc3QgIT0gJG5tX291dHB1dChiYXIpIH0gewotCQkgICAgc2VuZF9sb2cgImZhaWwgOVxuIgotCQkgICAgc2VuZF9sb2cgIiRsaW5lXG4iCi0JCSAgICBmYWlsICR0ZXN0bmFtZQotCQkgICAgcmV0dXJuCi0JCX0KLQkgICAgfSBlbHNlIHsKLQkJc2V0IGRlc3QgW2V4cHIgKCR1cHBlciA8PCAxNikgKyAkbG93ZXJdCi0JCWlmICFbcmVnZXhwICI8KFxbLmEtelxdKylcXCsoXFswLTlhLWZBLUZcXSspPiIgJGxhYmVsIHdob2xlIGJhc2Ugb2Zmc2V0XSB7Ci0JCSAgICBzZW5kX2xvZyAiZmFpbCAxMFxuIgotCQkgICAgc2VuZF9sb2cgIiRsaW5lXG4iCi0JCSAgICBmYWlsICR0ZXN0bmFtZQotCQkgICAgcmV0dXJuCi0JCX0KLQkJc2V0IG9mZnNldCAweCRvZmZzZXQKLQkJaWYgeyAkYmFzZSA9PSAiLmZvbyIgfSB7Ci0JCSAgICBzZXQgb2Zmc2V0IFtleHByICRvZmZzZXQgLSAoJG5tX291dHB1dChmb28pIC0gMHgzMCldCi0JCX0KLQkJaWYgeyAkb2Zmc2V0ICsgOCAhPSAtICRkZXN0IH0gewotCQkgICAgc2VuZF9sb2cgImZhaWwgMTFcbiIKLQkJICAgIHNlbmRfbG9nICIkbGluZVxuIgotCQkgICAgZmFpbCAkdGVzdG5hbWUKLQkJICAgIHJldHVybgotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgY2xvc2UgJGZpbGUKLQotICAgIGlmIHskYmFsY250IDwgMTB9IHsKLQlzZW5kX2xvZyAiZmFpbCAxMlxuIgotCWZhaWwgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlICIkYmFsY250IGJhbCBpbnN0cnVjdGlvbnMiCi0JcGFzcyAkdGVzdG5hbWUKLSAgICB9Ci19Ci0KLSMgV2Ugbm93IHRlc3QgYWN0dWFsbHkgcnVubmluZyBlbWJlZGRlZCBNSVBTIFBJQyBjb2RlLiAgVGhpcyBjYW4gb25seQotIyBiZSBkb25lIG9uIGEgTUlQUyBob3N0IHdpdGggdGhlIHNhbWUgZW5kaWFubmVzcyBhcyBvdXIgdGFyZ2V0LgotaWYgW2lzdGFyZ2V0IG1pcHNlbC0qLSpdIHsKLSAgICBpZiAhW2lzaG9zdCBtaXBzKi0qLXVsdHJpeCpdIHsKLQlyZXR1cm4KLSAgICB9Ci19IGVsc2UgewotICAgIGlmICFbaXNob3N0IG1pcHMqLSotaXJpeCpdIHsKLQlyZXR1cm4KLSAgICB9Ci19Ci0KLXNldCB0ZXN0bmFtZSAicnVuIGVtYmVkZGVkIFBJQyBjb2RlIgotCi0jIENvbXBpbGUgdGhlIHByb2dyYW0gd2hpY2ggd2lsbCBydW4gdGhlIHRlc3QuICBUaGlzIGNvZGUgbXVzdCBiZQotIyBjb21waWxlZCBmb3IgdGhlIGhvc3QsIG5vdCB0aGUgdGFyZ2V0Lgotc2VuZF9sb2cgIiRDQ19GT1JfSE9TVCAkQ0ZMQUdTX0ZPUl9IT1NUIC1vIHRtcGRpci9ydW4gJHNyY2Rpci8kc3ViZGlyL3J1bi5jXG4iCi12ZXJib3NlICIkQ0NfRk9SX0hPU1QgJENGTEFHU19GT1JfSE9TVCAtbyB0bXBkaXIvcnVuICRzcmNkaXIvJHN1YmRpci9ydW4uYyIKLWNhdGNoICJleGVjICRDQ19GT1JfSE9TVCAkQ0ZMQUdTX0ZPUl9IT1NUIC1vIHRtcGRpci9ydW4gJHNyY2Rpci8kc3ViZGlyL3J1bi5jIiBleGVjX291dHB1dAotaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0gICAgc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotICAgIHZlcmJvc2UgIiRleGVjX291dHB1dCIKLSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi0jIENvbXBpbGUgYW5kIGxpbmsgdGhlIHRlc3QuCi1pZiB7ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9ydW50ZXN0aS5zIHRtcGRpci9ydW50ZXN0aS5vXQotICAgICB8fCAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTIC1tZW1iZWRkZWQtcGljIiAkc3JjZGlyLyRzdWJkaXIvcnVudGVzdDEuYyB0bXBkaXIvcnVudGVzdDEub10KLSAgICAgfHwgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3J1bnRlc3QyLmMgdG1wZGlyL3J1bnRlc3QyLm9dIH0gewotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvcnVudGVzdCAiLS1lbWJlZGRlZC1yZWxvY3MgdG1wZGlyL3J1bnRlc3RpLm8gdG1wZGlyL3J1bnRlc3QxLm8gdG1wZGlyL3J1bnRlc3QyLm8iXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLX0gZWxzZSB7Ci0gICAgIyBOb3cgcnVuIHRoZSB0ZXN0LgotICAgIHNlbmRfbG9nICJ0bXBkaXIvcnVuIHRtcGRpci9ydW50ZXN0XG4iCi0gICAgdmVyYm9zZSAidG1wZGlyL3J1biB0bXBkaXIvcnVudGVzdCIKLSAgICBjYXRjaCAiZXhlYyB0bXBkaXIvcnVuIHRtcGRpci9ydW50ZXN0IiBleGVjX291dHB1dAotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIipyYW4gYW5kIHJldHVybmVkIDAqIiAkZXhlY19vdXRwdXRdIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCXBhc3MgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCWZhaWwgJHRlc3RuYW1lCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4LnQgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMxOGI2OS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgudAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLU9VVFBVVF9GT1JNQVQoImVjb2ZmLWJpZ21pcHMiKQotU0VDVElPTlMKLXsKLSAgLmZvbyAweDMwIDogewotICAgIHRtcGRpci9yZWxheDMubygudGV4dCkKLSAgICB0bXBkaXIvcmVsYXgxLm8oLnRleHQpCi0gIH0KLSAgLnRleHQgIDB4MjAwMDAgOiB7Ci0gICAgIF9mdGV4dCA9IC4gOwotICAgICooLmluaXQpCi0gICAgIGVwcm9sICA9ICAuOwotICAgIHRtcGRpci9yZWxheDQubygudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpbmkpCi0gICAgIGV0ZXh0ICA9ICAuOwotICAgICBfZXRleHQgID0gIC47Ci0gIH0KLSAgLnJkYXRhICAuIDogewotICAgICooLnJkYXRhKQotICB9Ci0gICBfZmRhdGEgPSAuOwotICAuZGF0YSAgLiA6IHsKLSAgICAqKC5kYXRhKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gICBfZ3AgPSAuICsgMHg4MDAwOwotICAubGl0OCAgLiA6IHsKLSAgICAqKC5saXQ4KQotICB9Ci0gIC5saXQ0ICAuIDogewotICAgICooLmxpdDQpCi0gIH0KLSAgLnNkYXRhICAuIDogewotICAgICooLnNkYXRhKQotICB9Ci0gICBlZGF0YSAgPSAgLjsKLSAgIF9lZGF0YSAgPSAgLjsKLSAgIF9mYnNzID0gLjsKLSAgLnNic3MgIC4gOiB7Ci0gICAgKiguc2JzcykKLSAgICAqKC5zY29tbW9uKQotICB9Ci0gIC5ic3MgIC4gOiB7Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICB9Ci0gICBlbmQgPSAuOwotICAgX2VuZCA9IC47Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgxLmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZWMzOWUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4MS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogRmlyc3Qgc291cmNlIGZpbGUgaW4gcmVsYXhhdGlvbiB0ZXN0LiAgKi8KLQotZXh0ZXJuIGludCBiYXIgKCk7Ci1zdGF0aWMgaW50IGZvbzIgKCk7Ci0KLWludCBmb28gKGludCBpKQotewotICBzd2l0Y2ggKGkpCi0gICAgewotICAgIGNhc2UgMDogYmFyICgwKTsgYnJlYWs7Ci0gICAgY2FzZSAxOiBiYXIgKDEpOyBicmVhazsKLSAgICBjYXNlIDI6IGJhciAoMik7IGJyZWFrOwotICAgIGNhc2UgMzogYmFyICgzKTsgYnJlYWs7Ci0gICAgY2FzZSA0OiBiYXIgKGZvbzIpOyBicmVhazsKLSAgICBjYXNlIDU6IGJhciAoYmFyKTsgYnJlYWs7Ci0gICAgfQotICB3aGlsZSAoMSkKLSAgICBpZiAoaSkKLSAgICAgIHJldHVybiBiYXIgKCk7Ci19Ci0KLXN0YXRpYyBpbnQgZm9vMiAoKSB7IH0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg4NTRhMC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKiBTZWNvbmQgc291cmNlIGZpbGUgaW4gcmVsYXhhdGlvbiB0ZXN0LiAgKi8KLQotaW50IGJhcjIgKCkKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKQotICAgIGZvbyAoKTsKLSAgcmV0dXJuIGZvbyAoKSArIGZvbyAoKSArIGZvbyAoKSArIGZvbyAoKTsKLX0KLQotaW50IGJhciAoaW50IGkpCi17Ci0gIHdoaWxlICgxKQotICAgIGlmIChpKQotICAgICAgcmV0dXJuIGZvbyAoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZm9vICgpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4My5jIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4My5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWFhNTMyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDMuYworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotLyogVGhpcmQgc291cmNlIGZpbGUgaW4gcmVsYXhhdGlvbiB0ZXN0LiAgKi8KLQotaW50IHF1dXggKCkgeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4NC5jIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWNmYjA1Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDQuYworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotLyogRm91cnRoIHNvdXJjZSBmaWxlIGluIHJlbGF4YXRpb24gdGVzdC4gICovCi0KLWludCB4eXp6eSAoKSB7IHJldHVybiAwOyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVuLmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMDM3N2UuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qIExvYWQgYW5kIHJ1biBhIE1JUFMgcG9zaXRpb24gaW5kZXBlbmRlbnQgRUNPRkYgZmlsZS4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0gICBQdWJsaWMgZG9tYWluLiAgKi8KLQotLyogVGhpcyBwcm9ncmFtIHdpbGwgbG9hZCBhbiBFQ09GRiBmaWxlIGludG8gbWVtb3J5IGFuZCBleGVjdXRlIGl0LgotICAgVGhlIGZpbGUgbXVzdCBoYXZlIGJlZW4gY29tcGlsZWQgdXNpbmcgdGhlIEdOVSAtbWVtYmVkZGVkLXBpYwotICAgc3dpdGNoIHRvIHByb2R1Y2UgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZS4gIFRoaXMgd2lsbCBvbmx5IHdvcmsKLSAgIGlmIHRoaXMgcHJvZ3JhbSBpcyBydW4gb24gYSBNSVBTIHN5c3RlbSB3aXRoIHRoZSBzYW1lIGVuZGlhbm5lc3MgYXMKLSAgIHRoZSBFQ09GRiBmaWxlLiAgVGhlIEVDT0ZGIGZpbGUgbXVzdCBiZSBjb21wbGV0ZS4gIFN5c3RlbSBjYWxscyBtYXkKLSAgIG5vdCB3b3JrIGNvcnJlY3RseS4KLQotICAgVGhlcmUgYXJlIGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSBmaWxlICh0aGV5IGNvdWxkIGJlIHJlbW92ZWQKLSAgIGJ5IGRvaW5nIHNvbWUgYWRkaXRpb25hbCBwcm9ncmFtbWluZykuICBUaGUgZmlsZSBtdXN0IGJlIGFsaWduZWQKLSAgIHN1Y2ggdGhhdCBpdCBkb2VzIG5vdCByZXF1aXJlIGFueSBnYXBzIGludHJvZHVjZWQgaW4gdGhlIGRhdGEKLSAgIHNlZ21lbnQ7IHRoZSBHTlUgbGlua2VyIHByb2R1Y2VzIHN1Y2ggZmlsZXMgYnkgZGVmYXVsdC4gIEhvd2V2ZXIsCi0gICB0aGUgZmlsZSBtdXN0IG5vdCBhc3N1bWUgdGhhdCB0aGUgdGV4dCBvciBkYXRhIHNlZ21lbnQgaXMgYWxpZ25lZAotICAgb24gYSBwYWdlIGJvdW5kYXJ5LiAgVGhlIHN0YXJ0IGFkZHJlc3MgbXVzdCBiZSBhdCB0aGUgc3RhcnQgb2YgdGhlCi0gICB0ZXh0IHNlZ21lbnQuCi0KLSAgIFRoZSBFQ09GRiBmaWxlIGlzIHJ1biBieSBjYWxsaW5nIGl0IGFzIHRob3VnaCBpdCB3ZXJlIGEgZnVuY3Rpb24uCi0gICBUaGUgYWRkcmVzcyBvZiB0aGUgZGF0YSBzZWdtZW50IGlzIHBhc3NlZCBhcyB0aGUgb25seSBhcmd1bWVudC4KLSAgIFRoZSBmaWxlIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhbiBpbnRlZ2VyIHZhbHVlLCB3aGljaCB3aWxsIGJlCi0gICBwcmludGVkLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotLyogU3RydWN0dXJlcyB1c2VkIGluIEVDT0ZGIGZpbGVzLiAgV2UgYXNzdW1lIHRoYXQgYSBzaG9ydCBpcyB0d28KLSAgIGJ5dGVzIGFuZCBhbiBpbnQgaXMgZm91ciBieXRlcy4gIFRoaXMgaXMgbm90IG11Y2ggb2YgYW4gYXNzdW1wdGlvbiwKLSAgIHNpbmNlIHdlIGFscmVhZHkgYXNzdW1lIHRoYXQgd2UgYXJlIHJ1bm5pbmcgb24gYSBNSVBTIGhvc3Qgd2l0aCB0aGUKLSAgIHNhbWUgZW5kaWFubmVzcyBhcyB0aGUgZmlsZSB3ZSBhcmUgZXhhbWluaW5nLiAgKi8KLQotc3RydWN0IGVjb2ZmX2ZpbGVoZHIgewotICB1bnNpZ25lZCBzaG9ydCBmX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIHNob3J0IGZfbnNjbnM7CS8qIG51bWJlciBvZiBzZWN0aW9ucyAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGZfdGltZGF0OwkvKiB0aW1lICYgZGF0ZSBzdGFtcCAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBmX3N5bXB0cjsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYiAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgZl9uc3ltczsJCS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcyAgICAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9vcHRoZHI7CS8qIHNpemVvZihvcHRpb25hbCBoZHIpICAgICAgICAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9mbGFnczsJLyogZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAqLwotfTsKLQotc3RydWN0IGVjb2ZmX2FvdXRoZHIKLXsKLSAgdW5zaWduZWQgc2hvcnQgbWFnaWM7CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgdW5zaWduZWQgc2hvcnQgdnN0YW1wOwkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgdW5zaWduZWQgaW50IHRzaXplOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIHVuc2lnbmVkIGludCBkc2l6ZTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgdW5zaWduZWQgaW50IGJzaXplOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICB1bnNpZ25lZCBpbnQgZW50cnk7CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgdW5zaWduZWQgaW50IHRleHRfc3RhcnQ7CS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgaW50IGRhdGFfc3RhcnQ7CS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgaW50IGJzc19zdGFydDsJLyogYmFzZSBvZiBic3MgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGludCBncHJtYXNrOwkJLyogPz8gKi8KLSAgdW5zaWduZWQgaW50IGNwcm1hc2tbNF07CS8qID8/ICovCi0gIHVuc2lnbmVkIGludCBncF92YWx1ZTsJLyogdmFsdWUgZm9yIGdwIHJlZ2lzdGVyICovCi19OwotCi0jZGVmaW5lIEVDT0ZGX1NDTkhEUl9TSVpFICg0MCkKLQotc3RhdGljIHZvaWQKLWRpZSAocykKLSAgICAgY2hhciAqczsKLXsKLSAgcGVycm9yIChzKTsKLSAgZXhpdCAoMSk7Ci19Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBGSUxFICpmOwotICBzdHJ1Y3Qgc3RhdCBzOwotICBjaGFyICp6OwotICBzdHJ1Y3QgZWNvZmZfZmlsZWhkciAqZmg7Ci0gIHN0cnVjdCBlY29mZl9hb3V0aGRyICphaDsKLSAgdW5zaWduZWQgaW50IHRvZmY7Ci0gIGNoYXIgKnQsICpkOwotICBpbnQgKCpwZm4pICgpOwotICBpbnQgcmV0OwotCi0gIGlmIChhcmdjICE9IDIpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6ICVzIGZpbGVcbiIsIGFyZ3ZbMF0pOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGYgPSBmb3BlbiAoYXJndlsxXSwgInIiKTsKLSAgaWYgKGYgPT0gTlVMTCkKLSAgICBkaWUgKGFyZ3ZbMV0pOwotCi0gIGlmIChzdGF0IChhcmd2WzFdLCAmcykgPCAwKQotICAgIGRpZSAoInN0YXQiKTsKLQotICB6ID0gKGNoYXIgKikgbWFsbG9jIChzLnN0X3NpemUpOwotICBpZiAoeiA9PSBOVUxMKQotICAgIGRpZSAoIm1hbGxvYyIpOwotCi0gIGlmIChmcmVhZCAoeiwgMSwgcy5zdF9zaXplLCBmKSAhPSBzLnN0X3NpemUpCi0gICAgZGllICgiZnJlYWQiKTsKLQotICAvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQsIHdoaWNoIGlzIHRoZQotICAgICBsb2NhdGlvbiB3ZSBhcmUgZ29pbmcgdG8gY2FsbCwgYW5kIHRoZSBzdGFydCBvZiB0aGUgZGF0YSBzZWdtZW50LAotICAgICB3aGljaCB3ZSBhcmUgZ29pbmcgdG8gcGFzcyBhcyBhbiBhcmd1bWVudC4gIFdlIGFsc28gbmVlZCB0aGUgc2l6ZQotICAgICBhbmQgc3RhcnQgYWRkcmVzcyBvZiB0aGUgYnNzIHNlZ21lbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIGFsbCBpbgotICAgICB0aGUgRUNPRkYgYS5vdXQgaGVhZGVyLiAgKi8KLQotICBmaCA9IChzdHJ1Y3QgZWNvZmZfZmlsZWhkciAqKSB6OwotICBpZiAoZmgtPmZfb3B0aGRyICE9IHNpemVvZiAoc3RydWN0IGVjb2ZmX2FvdXRoZHIpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB1bmV4cGVjdGVkIG9wdGhkciBzaXplOiBpcyAldSwgd2FudCAldVxuIiwKLQkgICAgICAgYXJndlsxXSwgKHVuc2lnbmVkIGludCkgZmgtPmZfb3B0aGRyLAotCSAgICAgICAodW5zaWduZWQgaW50KSBzaXplb2YgKHN0cnVjdCBlY29mZl9hb3V0aGRyKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgYWggPSAoc3RydWN0IGVjb2ZmX2FvdXRoZHIgKikgKHogKyBzaXplb2YgKHN0cnVjdCBlY29mZl9maWxlaGRyKSk7Ci0gIGlmIChhaC0+bWFnaWMgIT0gMDQxMykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogYmFkIGFvdXRoZHIgbWFnaWMgbnVtYmVyIDAlbyAod2FudCAwNDEzKVxuIiwKLQkgICAgICAgYXJndlsxXSwgKHVuc2lnbmVkIGludCkgYWgtPm1hZ2ljKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBXZSBzaG91bGQgY2xlYXIgdGhlIGJzcyBzZWdtZW50IGF0IHRoaXMgcG9pbnQuICBUaGlzIGlzIHRoZQotICAgICBhaC0+YnNpemUgYnl0ZXMgc3RhcnRpbmcgYXQgYWgtPmJzc19zdGFydCwgVG8gZG8gdGhpcyBjb3JyZWN0bHksCi0gICAgIHdlIHdvdWxkIGhhdmUgdG8gbWFrZSBzdXJlIG91ciBtZW1vcnkgYmxvY2sgaXMgbGFyZ2UgZW5vdWdoLiAgSXQKLSAgICAgc28gaGFwcGVucyB0aGF0IG91ciB0ZXN0IGNhc2UgZG9lcyBub3QgaGF2ZSBhbnkgYWRkaXRpb25hbCBwYWdlcwotICAgICBmb3IgdGhlIGJzcyBzZWdtZW50LS1pdCBpcyBjb250YWluZWQgd2l0aGluIHRoZSBkYXRhIHNlZ21lbnQuCi0gICAgIFNvLCB3ZSBkb24ndCBib3RoZXIuICAqLwotICBpZiAoYWgtPmJzaXplICE9IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICAiJXM6IGJzcyBzZWdtZW50IGlzICV1IGJ5dGVzOyBub24temVybyBzaXplcyBub3Qgc3VwcG9ydGVkXG4iLAotCSAgICAgICBhcmd2WzFdLCBhaC0+YnNpemUpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8qIFRoZSB0ZXh0IHNlY3Rpb24gc3RhcnRzIGp1c3QgYWZ0ZXIgYWxsIHRoZSBoZWFkZXJzLCByb3VuZGVkIHRvIGEKLSAgICAgMTYgYnl0ZSBib3VuZGFyeS4gICovCi0gIHRvZmYgPSAoc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfZmlsZWhkcikgKyBzaXplb2YgKHN0cnVjdCBlY29mZl9hb3V0aGRyKQotCSAgKyBmaC0+Zl9uc2NucyAqIEVDT0ZGX1NDTkhEUl9TSVpFKTsKLSAgdG9mZiArPSAxNTsKLSAgdG9mZiAmPX4gMTU7Ci0gIHQgPSB6ICsgdG9mZjsKLQotICAvKiBUaGUgdHNpemUgZmllbGQgZ2l2ZXMgdXMgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQuICAqLwotICBkID0geiArIGFoLT50c2l6ZTsKLQotICAvKiBDYWxsIHRoZSBjb2RlIGFzIGEgZnVuY3Rpb24uICAqLwotICBwZm4gPSAoaW50ICgqKSAoKSkgdDsKLSAgcmV0ID0gKCpwZm4pIChkKTsKLQotICBwcmludGYgKCIlcyByYW4gYW5kIHJldHVybmVkICVkXG4iLCBhcmd2WzFdLCByZXQpOwotCi0gIGV4aXQgKDApOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3QxLmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhYjZlYi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDEuYworKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKiBGaXJzdCBDIHNvdXJjZSBmaWxlIGZvciBhY3R1YWwgZXhlY3V0aW9uIHRlc3QuICAqLwotCi0vKiBUaGUgbWFpbiBwb2ludCBvZiB0aGlzIHRlc3QgaXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvZGUgYW5kIGRhdGEKLSAgIGFyZSB0cnVseSBwb3NpdGlvbiBpbmRlcGVuZGVudC4gIFdlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZSBzZXZlcmFsCi0gICBnbG9iYWwgdmFyaWFibGVzLCBhbmQgbWFrZSBzdXJlIHRoYXQgdGhleSBhcmUgY29ycmVjdGx5IGFkanVzdGVkIGF0Ci0gICBydW50aW1lLiAgKi8KLQotaW50IGkgPSAxOwotaW50IGogPSAwOwotZXh0ZXJuIGludCBrOwotaW50IGw7Ci1jaGFyIHNtYWxsX2J1ZltdID0gImFhYWEiOwotY2hhciAqc21hbGxfcG9pbnRlciA9IHNtYWxsX2J1ZjsKLWNoYXIgYmlnX2J1ZltdID0gImFhYWFhYWFhYWFhYWFhYWEiOwotY2hhciAqYmlnX3BvaW50ZXIgPSBiaWdfYnVmOwotCi1leHRlcm4gaW50IGJhciAoKTsKLWludCAoKnBiYXIpICgpID0gYmFyOwotCi1zdGF0aWMgaW50Ci1mb28yIChhcmcpCi0gICAgIGludCBhcmc7Ci17Ci0gIGwgPSBhcmc7Ci0gIHJldHVybiBpICsgajsKLX0KLQotaW50ICgqcGZvbzIpICgpID0gZm9vMjsKLQotaW50Ci1jaGtzdHIgKHosIGMpCi0gICAgIGNoYXIgKno7Ci0gICAgIGludCBjOwotewotICAvKiBTd2l0Y2ggc3RhdGVtZW50cyBuZWVkIGV4dHJhIGVmZm9ydCB0byBiZSBwb3NpdGlvbiBpbmRlcGVuZGVudCwKLSAgICAgc28gd2UgcnVuIG9uZSBoZXJlLCBldmVuIHRob3VnaCBtb3N0IG9mIHRoZSBjYXNlcyB3aWxsIG5ldmVyIGJlCi0gICAgIHRha2VuLiAgKi8KLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAyOgotICAgIGNhc2UgMzoKLSAgICAgIHJldHVybiBpIC0gMTsKLSAgICBjYXNlIDQ6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDU6Ci0gICAgY2FzZSA2OgotICAgIGNhc2UgNzoKLSAgICBjYXNlIDg6Ci0gICAgY2FzZSA5OgotICAgICAgcmV0dXJuIGkgKiBqOwotICAgIGNhc2UgMTA6Ci0gICAgY2FzZSAxMToKLSAgICBjYXNlIDEyOgotICAgIGNhc2UgMTM6Ci0gICAgY2FzZSAxNDoKLSAgICBjYXNlIDE1OgotICAgICAgcmV0dXJuIGo7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgd2hpbGUgKGMtLSAhPSAwKQotICAgIGlmICgqeisrICE9ICdhJykKLSAgICAgIHJldHVybiAwOwotCi0gIHJldHVybiAqeiA9PSAnXDAnOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYXNzZW1ibGVyIHN0YXJ0dXAgcm91dGluZS4gIEl0IHRyaWVzCi0gICB0byB0ZXN0IHRoYXQgZXZlcnl0aGluZyB3YXMgY29ycmVjdGx5IGluaXRpYWxpemVkLiAgSXQgcmV0dXJucyAwIG9uCi0gICBzdWNjZXNzLCBzb21ldGhpbmcgZWxzZSBvbiBmYWlsdXJlLiAgKi8KLQotaW50Ci1mb28gKCkKLXsKLSAgaWYgKGkgIT0gMSkKLSAgICByZXR1cm4gMTsKLSAgaWYgKGogIT0gMCkKLSAgICByZXR1cm4gMjsKLSAgaWYgKCEgY2hrc3RyIChzbWFsbF9idWYsIDQpKQotICAgIHJldHVybiAzOwotICBpZiAoISBjaGtzdHIgKHNtYWxsX3BvaW50ZXIsIDQpKQotICAgIHJldHVybiA0OwotICBpZiAoISBjaGtzdHIgKGJpZ19idWYsIDE2KSkKLSAgICByZXR1cm4gNTsKLSAgaWYgKCEgY2hrc3RyIChiaWdfcG9pbnRlciwgMTYpKQotICAgIHJldHVybiA2OwotCi0gIGlmIChsICE9IDApCi0gICAgcmV0dXJuIDc7Ci0gIGlmIChmb28yICgxKSAhPSAxKQotICAgIHJldHVybiA4OwotICBpZiAobCAhPSAxKQotICAgIHJldHVybiA5OwotICBpZiAoKCpwZm9vMikgKDIpICE9IDEpCi0gICAgcmV0dXJuIDEwOwotICBpZiAobCAhPSAyKQotICAgIHJldHVybiAxMTsKLQotICBpZiAoYmFyICgxKSAhPSAwKQotICAgIHJldHVybiAxMjsKLSAgaWYgKGJhciAoLTEpICE9IDEpCi0gICAgcmV0dXJuIDEzOwotICBpZiAoKCpwYmFyKSAoMHhhNWE1YTVhNSkgIT0gLTEpCi0gICAgcmV0dXJuIDE0OwotICBpZiAoayAhPSAweGE1YTVhNWE1KQotICAgIHJldHVybiAxNTsKLSAgaWYgKCgqcGJhcikgKDApICE9IDB4YTVhNWE1YTUpCi0gICAgcmV0dXJuIDE2OwotICBpZiAoayAhPSAwKQotICAgIHJldHVybiAxNzsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0Mi5jIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3QyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDUyNWYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3QyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKiBTZWNvbmQgQyBzb3VyY2UgZmlsZSBmb3IgYWN0dWFsIGV4ZWN1dGlvbiB0ZXN0LiAgKi8KLQotaW50IGs7Ci1leHRlcm4gaW50IGk7Ci1leHRlcm4gaW50IGo7Ci1leHRlcm4gY2hhciBzbWFsbF9idWZbXTsKLWV4dGVybiBjaGFyICpzbWFsbF9wb2ludGVyOwotCi1leHRlcm4gaW50IGNoa3N0ciAoKTsKLQotaW50Ci1iYXIgKG4pCi0gICAgIGludCBuOwotewotICBpbnQgcjsKLQotICBpZiAoaSAhPSAxCi0gICAgICB8fCBqICE9IDAKLSAgICAgIHx8ICEgY2hrc3RyIChzbWFsbF9idWYsIDQpCi0gICAgICB8fCAhIGNoa3N0ciAoc21hbGxfcG9pbnRlciwgNCkpCi0gICAgcmV0dXJuIGsgKyAxOwotCi0gIHIgPSBrOwotICBrID0gbjsKLSAgcmV0dXJuIHI7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdGkucyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0aS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmExOTUzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0aS5zCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotIyBBc3NlbWJsZXIgaW5pdGlhbGl6YXRpb24gY29kZSBmb3IgYWN0dWFsIGV4ZWN1dGlvbiB0ZXN0LgotCQotIyBUaGlzIGNvZGUgYmVjb21lcyB0aGUgc3RhcnQgb2YgdGhlIGV4ZWN1dGlvbiB0ZXN0IHByb2dyYW0uICBJdCBpcwotIyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nIHRoZSBzdGF0aWMgZGF0YSwgaW52b2tpbmcgdGhlIEMgY29kZSwKLSMgYW5kIHJldHVybmluZyB0aGUgcmVzdWx0LiAgSXQgaXMgY2FsbGVkIGFzIHRob3VnaCBpdCB3ZXJlIGEgQwotIyBmdW5jdGlvbiB3aXRoIGFuIGFyZ3VtZW50IG9mIHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHNlZ21lbnQuCi0KLSMgV2UgbmVlZCB0byBrbm93IHRoZSB2YWx1ZSBvZiBfZnRleHQgYW5kIF9mZGF0YSBhdCBsaW5rIHRpbWUsIGJ1dCB3ZQotIyBoYXZlIG5vIHdheSB0byBhY3R1YWxseSBnZXQgdGhhdCBhdCBydW50aW1lLiAgVGhpcyBpcyBiZWNhdXNlIHdoZW4KLSMgdGhpcyBjb2RlIGlzIGNvbXBpbGVkIHdpdGggLW1lbWJlZGRlZC1waWMsIHRoZSBsYSBpbnN0cnVjdGlvbiB3aWxsCi0jIGJlIHR1cm5lZCBpbnRvIGFuIGFkZGl1ICRncCBpbnN0cnVjdGlvbi4gIFdlIHdvcmsgYXJvdW5kIHRoaXMgYnkKLSMgc3RvcmluZyB0aGUgaW5mb3JtYXRpb24gaW4gd29yZHMgaW4gdGhlIC5kYXRhIHNlY3Rpb24uICBXZSB0aGVuIGxvYWQKLSMgdGhlIHZhbHVlcyBvZiB0aGVzZSB3b3JkcyAqYmVmb3JlKiBkb2luZyB0aGUgcnVudGltZSByZWxvY2F0aW9uLgotCS5zZGF0YQotdGV4dF9zdGFydDoKLQkud29yZAlfZnRleHQKLWRhdGFfc3RhcnQ6Ci0JLndvcmQJX2ZkYXRhCi0KLQkuZ2xvYmwJc3RhcnQKLQkudGV4dAotc3RhcnQ6Ci0JIyBHcmFiIHNvbWUgc3BhY2Ugb24gdGhlIHN0YWNrLCBqdXN0IGFzIHRob3VnaCB3ZSB3ZXJlIGEgcmVhbAotCSMgZnVuY3Rpb24uCi0JYWRkaXUJJHNwLCRzcCwtOAotCXN3CSQzMSwwKCRzcCkKLQotCSMgU2F2ZSB0aGUgJGdwIHJlZ2lzdGVyLCBhbmQgc2V0IGl0IHVwIGZvciBvdXIgZGF0YSBzZWN0aW9uLgotCXN3CSRncCw0KCRzcCkKLQotCWFkZHUJJGdwLCQ0LDB4ODAwMAkJIyBtYWNybwotCi0JIyBUaGUgc3RhcnQgb2YgdGhlIGRhdGEgc2VnbWVudCBpcyBpbiAkNC4KLQotCSMgR2V0IHRoZSBhZGRyZXNzIG9mIHN0YXJ0IGludG8gJDUgaW4gYSBwb3NpdGlvbiBpbmRlcGVuZGVudAotCSMgZmFzaGlvbi4KLQkuc2V0CW5vcmVvcmRlcgotCSRMRjEgPSAuICsgOAotCWJhbAkkTEYxCi0JbGEJJDUsc3RhcnQtJExGMQkJIyBtYWNybwotCS5zZXQJcmVvcmRlcgotCWFkZHUJJDUsJDUsJDMxCi0KLQkjIE5vdyBnZXQgdGhlIGFkZHJlc3Mgb2YgX2Z0ZXh0IGludG8gJDYuCi0JbGEJJDYsX2Z0ZXh0LXN0YXJ0CQkjIG1hY3JvCi0JYWRkdQkkNiwkNiwkNQotCi0JIyBHZXQgdGhlIHZhbHVlIG9mIF9mdGV4dCB1c2VkIHRvIGxpbmsgaW50byAkNy4KLQlsdwkkNyx0ZXh0X3N0YXJ0CQkjIG1hY3JvCi0KLQkjIEdldCB0aGUgdmFsdWUgb2YgX2ZkYXRhIHVzZWQgdG8gbGluayBpbnRvICQ4LgotCWx3CSQ4LGRhdGFfc3RhcnQJCSMgbWFjcm8KLQotCSMgR2V0IHRoZSBhZGRyZXNzIG9mIF9fcnVudGltZV9yZWxvY19zdGFydCBpbnRvICQ5LgotCWxhCSQ5LF9fcnVudGltZV9yZWxvY19zdGFydC1zdGFydAkjIG1hY3JvCi0JYWRkdQkkOSwkOSwkNQotCi0JIyBHZXQgdGhlIGFkZHJlc3Mgb2YgX19ydW50aW1lX3JlbG9jX3N0b3AgaW50byAkMTAuCi0JbGEJJDEwLF9fcnVudGltZV9yZWxvY19zdG9wLXN0YXJ0CSMgbWFjcm8KLQlhZGR1CSQxMCwkMTAsJDUKLQotCSMgVGhlIHdvcmRzIGJldHdlZW4gJDkgYW5kICQxMCBhcmUgdGhlIHJ1bnRpbWUgaW5pdGlhbGl6YXRpb24KLQkjIGluc3RydWN0aW9ucy4gIFN0ZXAgdGhyb3VnaCBhbmQgcmVsb2NhdGUgdGhlbS4gIEZpcnN0IHNldAotCSMgJDExIGFuZCAkMTIgdG8gdGhlIHZhbHVlcyB0byBhZGQgdG8gdGV4dCBhbmQgZGF0YSBzZWN0aW9ucywKLQkjIHJlc3BlY3RpdmVseS4KLQlzdWJ1CSQxMSwkNiwkNwotCXN1YnUJJDEyLCQ0LCQ4Ci0KLTE6CQotCWJnZQkkOSwkMTAsM2YJCSMgbWFjcm8KLQlsdwkkMTMsMCgkOSkKLQlhbmQJJDE0LCQxMywweGZmZmZmZmZlCSMgbWFjcm8KLQltb3ZlCSQxNSwkMTEKLQliZXEJJDEzLCQxNCwyZgotCW1vdmUJJDE1LCQxMgotMjoJCi0JYWRkdQkkMTQsJDE0LCQ0Ci0JbHcJJDI0LDAoJDE0KQotCWFkZHUJJDI0LCQyNCwkMTUKLQlzdwkkMjQsMCgkMTQpCi0JYWRkaXUJJDksJDksNAotCWIJMWIKLTM6CQotCi0JIyBOb3cgdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgZGF0YSBoYXMgYmVlbiByZWxvY2F0ZWQKLQkjIGNvcnJlY3RseSwgYW5kIHdlIGNhbiBjYWxsIHRoZSBDIGNvZGUgd2hpY2ggZG9lcyB0aGUgYWN0dWFsCi0JIyB0ZXN0aW5nLgotCWJhbAlmb28KLQotCSMgV2UgcmV0dXJuIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgQyBjb2RlLgotCWx3CSQzMSwwKCRzcCkKLQlsdwkkZ3AsNCgkc3ApCi0JYWRkdQkkc3AsJHNwLDgKLQlqCSQzMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MxLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3ODk0NS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczEuYworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotZXh0ZXJuIGludCBmb28gKCk7Ci1pbnQKLWZ1bmMgKCkKLXsKLSAgcmV0dXJuIGZvbyAoKTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMS50IGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MxLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOTQ4YzkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MxLnQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLU5PQ1JPU1NSRUZTICggLnRleHQgLmRhdGEgKQotU0VDVElPTlMKLXsKLSAgLnRleHQgOiB7IHRtcGRpci9jcm9zczEubyB9Ci0gIC5kYXRhIDogeyB0bXBkaXIvY3Jvc3MyLm8gfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MyLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE0MzE3Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczIuYworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaW50Ci1mb28gKCkKLXsKLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczIudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMi50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjA0NmY2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMi50CisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1OT0NST1NTUkVGUyAoIC50ZXh0IC5kYXRhICkKLVNFQ1RJT05TCi17Ci0gIC50ZXh0IDogeyAqKC50ZXh0KSAqKC5wcikgfQotICAuZGF0YSA6IHsgKiguZGF0YSkgKiguc2RhdGEpICooLnJ3KSAqKC50YzApICooLnRjKSB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczMuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODQ4YzMyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMy5jCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1pbnQgaSA9IDQ7Ci0KLWludAotZm9vICgpCi17Ci0gIHJldHVybiBpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWU5NzU5Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzcmVmLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSMgVGVzdCBOT0NST1NTUkVGUyBpbiBhIGxpbmtlciBzY3JpcHQuCi0jIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1zZXQgdGVzdDEgIk5PQ1JPU1NSRUZTIDEiCi1zZXQgdGVzdDIgIk5PQ1JPU1NSRUZTIDIiCi0KLWlmIHsgW3doaWNoICRDQ10gPT0gMCB9IHsKLSAgICB1bnRlc3RlZCAkdGVzdDEKLSAgICB1bnRlc3RlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotaWYgeyAhW2xkX2NvbXBpbGUgJENDICIkc3JjZGlyLyRzdWJkaXIvY3Jvc3MxLmMiIHRtcGRpci9jcm9zczEub10gXAotICAgICB8fCAhW2xkX2NvbXBpbGUgJENDICIkc3JjZGlyLyRzdWJkaXIvY3Jvc3MyLmMiIHRtcGRpci9jcm9zczIub10gfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDEKLSAgICB1bnJlc29sdmVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1zZXQgZmxhZ3MgIiIKLQotIyBUaGUgYTI5ayBjb21waWxlZCBjb2RlIGNhbGxzIFZfU1BJTEwgYW5kIFZfRklMTC4gIFNpbmNlIHdlIGRvbid0Ci0jIG5lZWQgdG8gcnVuIHRoaXMgY29kZSwgYnV0IHdlIGRvbid0IGhhdmUgZGVmaW5pdGlvbnMgZm9yIHRob3NlCi0jIGZ1bmN0aW9ucywgd2UganVzdCBkZWZpbmUgdGhlbSBvdXQuCi1pZiBbaXN0YXJnZXQgYTI5ayotKi0qXSB7Ci0gICAgc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gVl9TUElMTD0wIC0tZGVmc3ltIFZfRklMTD0wIgotfQotCi0jIGhwcGEtZWxmIG5lZWRzIGEgZGVmaW5pdGlvbiBmb3IgJGdsb2JhbCQuCi1pZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB7Ci0gICAgc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gJ1wkZ2xvYmFsXCQnPTAiCi19Ci0KLXZlcmJvc2UgLWxvZyAiJGxkICRmbGFncyAtbyB0bXBkaXIvY3Jvc3MxIC1UICRzcmNkaXIvJHN1YmRpci9jcm9zczEudCB0bXBkaXIvY3Jvc3MxLm8gdG1wZGlyL2Nyb3NzMi5vIgotCi1jYXRjaCAiZXhlYyAkbGQgJGZsYWdzIC1vIHRtcGRpci9jcm9zczEgLVQgJHNyY2Rpci8kc3ViZGlyL2Nyb3NzMS50IHRtcGRpci9jcm9zczEubyB0bXBkaXIvY3Jvc3MyLm8iIGV4ZWNfb3V0cHV0Ci0KLXNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi1yZWdzdWIgLWFsbCAiKF58XG4pKCRsZDogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sXFteXG5cXSpcbj8pIiAkZXhlY19vdXRwdXQgIlxcMSIgZXhlY19vdXRwdXQKLQotaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotICAgIGZhaWwgJHRlc3QxCi19IGVsc2UgewotICAgIHZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotICAgIGlmIFtyZWdleHAgInByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlIGZyb20gLiogdG8gYGZvbycgaW4iICRleGVjX291dHB1dF0gewotCXBhc3MgJHRlc3QxCi0gICAgfSBlbHNlIHsKLQlmYWlsICR0ZXN0MQotICAgIH0KLX0KLQotIyBDaGVjayBjcm9zcyByZWZlcmVuY2VzIHdpdGhpbiBhIHNpbmdsZSBvYmplY3QuCi0KLWlmIHsgIVtsZF9jb21waWxlICRDQyAiJHNyY2Rpci8kc3ViZGlyL2Nyb3NzMy5jIiB0bXBkaXIvY3Jvc3MzLm9dIH0gewotICAgIHVucmVzb2x2ZWQgJHRlc3QyCi0gICAgcmV0dXJuCi19Ci0KLXZlcmJvc2UgLWxvZyAiJGxkICRmbGFncyAtbyB0bXBkaXIvY3Jvc3MyIC1UICRzcmNkaXIvJHN1YmRpci9jcm9zczIudCB0bXBkaXIvY3Jvc3MzLm8iCi0KLWNhdGNoICJleGVjICRsZCAkZmxhZ3MgLW8gdG1wZGlyL2Nyb3NzMiAtVCAkc3JjZGlyLyRzdWJkaXIvY3Jvc3MyLnQgdG1wZGlyL2Nyb3NzMy5vIiBleGVjX291dHB1dAotCi1zZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQotcmVnc3ViIC1hbGwgIihefFxuKSgkbGQ6IHdhcm5pbmc6IGNhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbFxbXlxuXF0qXG4/KSIgJGV4ZWNfb3V0cHV0ICJcXDEiIGV4ZWNfb3V0cHV0Ci0KLWlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLSAgICBmYWlsICR0ZXN0MgotfSBlbHNlIHsKLSAgICB2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLSAgICBpZiBbcmVnZXhwICJwcm9oaWJpdGVkIGNyb3NzIHJlZmVyZW5jZSBmcm9tIC4qIHRvIGAuKicgaW4iICRleGVjX291dHB1dF0gewotCXBhc3MgJHRlc3QyCi0gICAgfSBlbHNlIHsKLQlmYWlsICR0ZXN0MgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYTI2YmMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jIFRlc3QgREVGSU5FRCBpbiBhIGxpbmtlciBzY3JpcHQuCi0jIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1zZXQgdGVzdG5hbWUgIkRFRklORUQiCi1zZXQgcHJtc19pZCA1Njk5Ci0KLWlmICFbbGRfYXNzZW1ibGUgJGFzICRzcmNkaXIvJHN1YmRpci9kZWZpbmVkLnMgdG1wZGlyL2RlZi5vXSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL2RlZiAiLVQgJHNyY2Rpci8kc3ViZGlyL2RlZmluZWQudCB0bXBkaXIvZGVmLm8iXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLX0gZWxzZSB7Ci0gICAgaWYgIVtsZF9ubSAkbm0gdG1wZGlyL2RlZl0gewotCXVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlpZiB7IVtpbmZvIGV4aXN0cyBubV9vdXRwdXQodmFsdWUxKV0gXAotCSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQodmFsdWUyKV19IHsKLQkgICAgc2VuZF9sb2cgImJhZCBvdXRwdXQgZnJvbSBubVxuIgotCSAgICB2ZXJib3NlICJiYWQgb3V0cHV0IGZyb20gbm0iCi0JICAgIGZhaWwgJHRlc3RuYW1lCi0JfSBlbHNlIHsKLQkgICAgaWYgeyRubV9vdXRwdXQodmFsdWUxKSAhPSAxfSB7Ci0JCXNlbmRfbG9nICJ2YWx1ZTEgPT0gJG5tX291dHB1dCh2YWx1ZTEpXG4iCi0JCXZlcmJvc2UgInZhbHVlMSA9PSAkbm1fb3V0cHV0KHZhbHVlMSkiCi0JCWZhaWwgJHRlc3RuYW1lCi0JICAgIH0gZWxzZSB7Ci0JCWlmIHskbm1fb3V0cHV0KHZhbHVlMikgIT0gMn0gewotCQkgICAgc2VuZF9sb2cgInZhbHVlMiA9PSAkbm1fb3V0cHV0KHZhbHVlMilcbiIKLQkJICAgIHZlcmJvc2UgInZhbHVlMiA9PSAkbm1fb3V0cHV0KHZhbHVlMikiCi0JCSAgICBmYWlsICR0ZXN0bmFtZQotCQl9IGVsc2UgewotCQkgICAgcGFzcyAkdGVzdG5hbWUKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQucyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2NGJiYi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQkuZ2xvYmwJZGVmaW5lZAotCWRlZmluZWQJPQkxCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLnQgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZWYxYjYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC50CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TRUNUSU9OUyB7Ci0JLnRleHQgOiB7ICooLnRleHQpIH0KLQkuZGF0YSA6IHsgKiguZGF0YSkgfQotCS5ic3MgOiB7ICooLmJzcykgKihDT01NT04pIH0KLX0KLXZhbHVlMSA9IERFRklORUQgKGRlZmluZWQpID8gMSA6IDI7Ci12YWx1ZTIgPSBERUZJTkVEICh1bmRlZmluZWQpID8gMSA6IDI7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZWUwMGYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIyBUZXN0IFBIRFJTIGluIGEgbGlua2VyIHNjcmlwdC4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSMgUEhEUlMgaXMgb25seSBtZWFuaW5nZnVsIGZvciBFTEYuCi1pZiB7ICFbaXN0YXJnZXQgKi0qLXN5c3Y0Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi11bml4d2FyZSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1lYWJpKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotaXJpeDUqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWlyaXg2Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1zb2xhcmlzMipdIH0gewotICAgIHJldHVybgotfQotCi1pZiB7IFtpc3RhcmdldCAqLSotbGludXhhb3V0Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgKi0qLWxpbnV4b2xkbGQqXSB9IHsKLSAgICByZXR1cm4KLX0KLQotIyBUaGlzIGlzIGEgdmVyeSBzaW1wbGlzdGljIHRlc3QuCi0KLXNldCB0ZXN0bmFtZSAiUEhEUlMiCi0KLWlmICFbbGRfYXNzZW1ibGUgJGFzICRzcmNkaXIvJHN1YmRpci9waGRycy5zIHRtcGRpci9waGRycy5vXSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotc2V0IHBoZHJzX3JlZ2V4cCBcCi0iLipQcm9ncmFtIEhlYWRlcjouKlBIRFIgKm9mZiAqMHgwMCozNCAqdmFkZHIgKjB4MDAqODAwMzQgKnBhZGRyICoweDAwKjgwMDM0LipmaWxlc3ogKjB4MFxbMC05YS1mXF0qICptZW1zeiAqMHgwXFswLTlhLWZcXSogZmxhZ3Mgci0tLipMT0FEICpvZmYgKjB4MDAqICp2YWRkciAqMHgwMCo4MDAwMCAqcGFkZHIgKjB4MDAqODAwMDAuKmZpbGVzeiAqMHgwMCpcWzAtOWEtZlxdKiAqbWVtc3ogKjB4MFxbMC05YS1mXF0qICpmbGFncyByLXguKkxPQUQgKm9mZiAqMHgwXFswLTlhLWZcXSogKnZhZGRyICoweDAwKjgwKlxbMC05YS1mXF0qICpwYWRkciAqMHgwMCo4MCpcWzAtOWEtZlxdKi4qZmlsZXN6ICoweDBcWzAtOWEtZlxdKiAqbWVtc3ogKjB4MFxbMC05YS1mXF0qICpmbGFncyAqcnctLioiCi0KLSMgT24gYSA2NCBiaXQgRUxGIGZvcm1hdCwgd2UgbmVlZCBkaWZmZXJlbnQgbnVtYmVycy4KLWlmIHsgW2lzdGFyZ2V0IGFscGhhKi0qLSpdIH0gdGhlbiB7Ci0gIHNldCBwaGRyc19yZWdleHAgXAotIi4qUHJvZ3JhbSBIZWFkZXI6LipQSERSICpvZmYgKjB4MDAqNDAgKnZhZGRyICoweDAwKjgwMDQwICpwYWRkciAqMHgwMCo4MDA0MC4qZmlsZXN6ICoweDBcWzAtOWEtZlxdKiAqbWVtc3ogKjB4MFxbMC05YS1mXF0qIGZsYWdzIHItLS4qTE9BRCAqb2ZmICoweDAwKiAqdmFkZHIgKjB4MDAqODAwMDAgKnBhZGRyICoweDAwKjgwMDAwLipmaWxlc3ogKjB4MDAqXFswLTlhLWZcXSogKm1lbXN6ICoweDBcWzAtOWEtZlxdKiAqZmxhZ3Mgci14LipMT0FEICpvZmYgKjB4MFxbMC05YS1mXF0qICp2YWRkciAqMHgwMCo4MCpcWzAtOWEtZlxdKiAqcGFkZHIgKjB4MDAqODAqXFswLTlhLWZcXSouKmZpbGVzeiAqMHgwXFswLTlhLWZcXSogKm1lbXN6ICoweDBcWzAtOWEtZlxdKiAqZmxhZ3MgKnJ3LS4qIgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvcGhkcnMgIi1UICRzcmNkaXIvJHN1YmRpci9waGRycy50IHRtcGRpci9waGRycy5vIl0gewotICAgIGZhaWwgJHRlc3RuYW1lCi19IGVsc2UgewotICAgIGlmIHtbd2hpY2ggJG9iamR1bXBdID09IDB9IHsKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgLS1wcml2YXRlIHRtcGRpci9waGRycyIKLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAtLXByaXZhdGUgdG1wZGlyL3BoZHJzIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIHZlcmJvc2UgLWxvZyAkZXhlY19vdXRwdXQKLQotICAgIGlmIFtyZWdleHAgJHBoZHJzX3JlZ2V4cCAkZXhlY19vdXRwdXRdIHsKLQlwYXNzICR0ZXN0bmFtZQotICAgIH0gZWxzZSB7Ci0JZmFpbCAkdGVzdG5hbWUKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy5zIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxZjBkMS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLnRleHQKLQotCS5sb25nCTEKLQotCS5kYXRhCi0KLQkubG9uZwkyCi0JCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy50IGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3MTBlMi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy50CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotUEhEUlMKLXsKLSAgaGVhZGVyIFBUX1BIRFIgUEhEUlMgOwotICB0ZXh0IFBUX0xPQUQgRklMRUhEUiBQSERSUyA7Ci0gIGRhdGEgUFRfTE9BRCA7Ci19Ci0KLVNFQ1RJT05TCi17Ci0gIC4gPSAweDgwMDAwICsgU0laRU9GX0hFQURFUlM7Ci0gIC50ZXh0IDogeyAqKC50ZXh0KSB9IDp0ZXh0Ci0gIC5kYXRhIDogeyAqKC5kYXRhKSB9IDpkYXRhCi0gIC9ESVNDQVJELyA6IHsgKigucmVnaW5mbykgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMGEwNDEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLSMgVGVzdCBiYXNpYyBsaW5rZXIgc2NyaXB0IGZ1bmN0aW9uYWxpdHkKLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotc2V0IHRlc3RuYW1lICJzY3JpcHQiCi0KLWlmICFbbGRfYXNzZW1ibGUgJGFzICRzcmNkaXIvJHN1YmRpci9zY3JpcHQucyB0bXBkaXIvc2NyaXB0Lm9dIHsgCi0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotcHJvYyBjaGVja19zY3JpcHQgeyB9IHsKLSAgICBnbG9iYWwgbm0KLSAgICBnbG9iYWwgdGVzdG5hbWUKLSAgICBnbG9iYWwgbm1fb3V0cHV0Ci0KLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvc2NyaXB0XSB7Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCWlmIHshW2luZm8gZXhpc3RzIG5tX291dHB1dCh0ZXh0X3N0YXJ0KV0gXAotCSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQodGV4dF9lbmQpXSBcCi0JICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dChkYXRhX3N0YXJ0KV0gXAotCSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoZGF0YV9lbmQpXX0gewotCSAgICBzZW5kX2xvZyAiYmFkIG91dHB1dCBmcm9tIG5tXG4iCi0JICAgIHZlcmJvc2UgImJhZCBvdXRwdXQgZnJvbSBubSIKLQkgICAgZmFpbCAkdGVzdG5hbWUKLQl9IGVsc2UgewotCSAgICBpZiB7JG5tX291dHB1dCh0ZXh0X3N0YXJ0KSAhPSAweDEwMH0gewotCQlzZW5kX2xvZyAidGV4dF9zdGFydCA9PSAkbm1fb3V0cHV0KHRleHRfc3RhcnQpXG4iCi0JCXZlcmJvc2UgInRleHRfc3RhcnQgPT0gJG5tX291dHB1dCh0ZXh0X3N0YXJ0KSIKLQkJZmFpbCAkdGVzdG5hbWUKLQkgICAgfSBlbHNlIHsgaWYgeyRubV9vdXRwdXQodGV4dF9lbmQpIDwgMHgxMDQgXAotCQkJICB8fCAkbm1fb3V0cHV0KHRleHRfZW5kKSA+IDB4MTEwfSB7Ci0JCXNlbmRfbG9nICJ0ZXh0X2VuZCA9PSAkbm1fb3V0cHV0KHRleHRfZW5kKVxuIgotCQl2ZXJib3NlICJ0ZXh0X2VuZCA9PSAkbm1fb3V0cHV0KHRleHRfZW5kKSIKLQkJZmFpbCAkdGVzdG5hbWUKLQkgICAgfSBlbHNlIHsgaWYgeyRubV9vdXRwdXQoZGF0YV9zdGFydCkgIT0gMHgxMDAwfSB7Ci0JCXNlbmRfbG9nICJkYXRhX3N0YXJ0ID09ICRubV9vdXRwdXQoZGF0YV9zdGFydClcbiIKLQkJdmVyYm9zZSAiZGF0YV9zdGFydCA9PSAkbm1fb3V0cHV0KGRhdGFfc3RhcnQpIgotCQlmYWlsICR0ZXN0bmFtZQotCSAgICB9IGVsc2UgeyBpZiB7JG5tX291dHB1dChkYXRhX2VuZCkgPCAweDEwMDQgXAotCQkJIHx8ICRubV9vdXRwdXQoZGF0YV9lbmQpID4gMHgxMDEwfSB7Ci0JCXNlbmRfbG9nICJkYXRhX2VuZCA9PSAkbm1fb3V0cHV0KGRhdGFfZW5kKVxuIgotCQl2ZXJib3NlICJkYXRhX2VuZCA9PSAkbm1fb3V0cHV0KGRhdGFfZW5kKSIKLQkJZmFpbCAkdGVzdG5hbWUKLQkgICAgfSBlbHNlIHsKLQkJcGFzcyAkdGVzdG5hbWUKLQkgICAgfSB9IH0gfQotCX0KLSAgICB9Ci19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zY3JpcHQgIi1UICRzcmNkaXIvJHN1YmRpci9zY3JpcHQudCB0bXBkaXIvc2NyaXB0Lm8iXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLX0gZWxzZSB7Ci0gICAgY2hlY2tfc2NyaXB0Ci19Ci0KLXNldCB0ZXN0bmFtZSAiTVJJIHNjcmlwdCIKLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NjcmlwdCAiLWMgJHNyY2Rpci8kc3ViZGlyL3NjcmlwdG0udCJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICBjaGVja19zY3JpcHQKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5zIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YjY1YjAuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkudGV4dAotCS5nbG9ibCB0ZXh0X3N5bWJvbAotdGV4dF9zeW1ib2w6CQotCS5sb25nCTEKLQkuZGF0YQotCS5nbG9ibCBkYXRhX3N5bWJvbAotZGF0YV9zeW1ib2w6CQotCS5sb25nCTIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC50IGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlN2E0OGEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LnQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1TRUNUSU9OUwotewotICAudGV4dCAweDEwMCA6IHsgCi0gICAgdGV4dF9zdGFydCA9IC47Ci0gICAgKigudGV4dCkKLSAgICAqKC5wcikKLSAgICB0ZXh0X2VuZCA9IC47Ci0gIH0KLSAgLiA9IDB4MTAwMDsKLSAgLmRhdGEgOiB7Ci0gICAgZGF0YV9zdGFydCA9IC47Ci0gICAgKiguZGF0YSkKLSAgICAqKC5ydykKLSAgICBkYXRhX2VuZCA9IC47Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdG0udCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdG0udApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjY2FlMS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHRtLnQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0qIE1SSSBzY3JpcHQKLXNlY3QgLnRleHQgPSAkMTAwCTsgLnRleHQgc3RhcnQgYWRkcmVzcwotc2VjdCAuZGF0YSA9IDEwMDBoCTsgLmRhdGEgc3RhcnQgYWRkcmVzcwotcHVibGljIHRleHRfc3RhcnQgPSAkMTAwCi1wdWJsaWMgdGV4dF9lbmQgPSAjIGNvbnRpbnVhdGlvbiBsaW5lCi0gIHRleHRfc3RhcnQgKyA0Ci1wdWJsaWMgZGF0YV9zdGFydCA9IDEwMDBoCi1wdWJsaWMgZGF0YV9lbmQgPSBkYXRhX3N0YXJ0ICsgNAotCi1sb2FkIHRtcGRpci9zY3JpcHQubwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZGVmZDQuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMgVGVzdCBTSVpFT0YgaW4gYSBsaW5rZXIgc2NyaXB0LgotIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotIyBCYXNlZCBvbiBhIGJ1ZyByZXBvcnQgZnJvbSBhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2UuCi0KLXNldCB0ZXN0bmFtZSAiU0laRU9GIgotCi1pZiAhW2xkX2Fzc2VtYmxlICRhcyAkc3JjZGlyLyRzdWJkaXIvc2l6ZW9mLnMgdG1wZGlyL3NpemVvZi5vXSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NpemVvZiAiLVQgJHNyY2Rpci8kc3ViZGlyL3NpemVvZi50IHRtcGRpci9zaXplb2YubyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1pZiAhW2xkX25tICRubSB0bXBkaXIvc2l6ZW9mXSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotaWYgeyFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KHRleHRfc3RhcnQpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KHRleHRfZW5kKV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dChkYXRhX3N0YXJ0KV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dChkYXRhX2VuZCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoc2l6ZW9mX3RleHQpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KHNpemVvZl9kYXRhKV19IHsKLSAgICBzZW5kX2xvZyAiYmFkIG91dHB1dCBmcm9tIG5tXG4iCi0gICAgdmVyYm9zZSAiYmFkIG91dHB1dCBmcm9tIG5tIgotICAgIGZhaWwgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLWlmIHskbm1fb3V0cHV0KHRleHRfZW5kKSAtICRubV9vdXRwdXQodGV4dF9zdGFydCkgIT0gJG5tX291dHB1dChzaXplb2ZfdGV4dCl9IHsKLSAgICBzZW5kX2xvZyAidGV4dF9lbmQgLSB0ZXh0X3N0YXJ0ICE9IHNpemVvZl90ZXh0XG4iCi0gICAgdmVyYm9zZSAidGV4dF9lbmQgLSB0ZXh0X3N0YXJ0ICE9IHNpemVvZl90ZXh0IgotICAgIGZhaWwgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLWlmIHskbm1fb3V0cHV0KGRhdGFfZW5kKSAtICRubV9vdXRwdXQoZGF0YV9zdGFydCkgIT0gJG5tX291dHB1dChzaXplb2ZfZGF0YSl9IHsKLSAgICBzZW5kX2xvZyAiZGF0YV9lbmQgLSBkYXRhX3N0YXJ0ICE9IHNpemVvZl9kYXRhXG4iCi0gICAgdmVyYm9zZSAiZGF0YV9lbmQgLSBkYXRhX3N0YXJ0ICE9IHNpemVvZl9kYXRhIgotICAgIGZhaWwgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLWlmIHskbm1fb3V0cHV0KHNpemVvZl90ZXh0KSAhPSAkbm1fb3V0cHV0KHNpemVvZl9kYXRhKX0gewotICAgIHNlbmRfbG9nICJzaXplb2ZfdGV4dCAhPSBzaXplb2ZfZGF0YVxuIgotICAgIHZlcmJvc2UgInNpemVvZl90ZXh0ICE9IHNpemVvZl9kYXRhIgotICAgIGZhaWwgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLXBhc3MgJHRlc3RuYW1lCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YucyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjIxY2EzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi5zCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotCS5zcGFjZQkxNgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLnQgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI0NGEzNy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YudAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLVNFQ1RJT05TIHsKLQkudGV4dCA6Ci0JICB7Ci0JICAgIHRleHRfc3RhcnQgPSAuOwotCSAgICB0bXBkaXIvc2l6ZW9mLm8gCi0JICAgIHRleHRfZW5kID0gLjsKLQkgIH0KLQkuZGF0YSA6IAotCSAgeyAKLQkgICAgZGF0YV9zdGFydCA9IC47Ci0JICAgIC4gPSAuICsgU0laRU9GKC50ZXh0KTsKLQkgICAgZGF0YV9lbmQgPSAuOwotCSAgfQotfQkKLQotc2l6ZW9mX3RleHQgPSBTSVpFT0YoLnRleHQpOwotc2l6ZW9mX2RhdGEgPSBTSVpFT0YoLmRhdGEpOwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2Vhay5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY5ZGI1Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMgVGVzdCB3ZWFrIHN5bWJvbHMuCi0jIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTb2x1dGlvbnMuCi0KLXNldCB0ZXN0bmFtZSAid2VhayBzeW1ib2xzIgotCi0jIFRoaXMgdGVzdCBvbmx5IHdvcmtzIGZvciBFTEYgdGFyZ2V0cy4gIEl0IG91Z2h0IHRvIHdvcmsgZm9yIHNvbWUKLSMgYS5vdXQgdGFyZ2V0cywgYnV0IGl0IGRvZXNuJ3QuCi0KLWlmIHsgIVtpc3RhcmdldCAqLSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLXVuaXh3YXJlKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1lbGYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWVhYmkqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1pcml4NSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotaXJpeDYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLXNvbGFyaXMyKl0gfSB0aGVuIHsKLSAgICByZXR1cm4KLX0KLQotaWYgeyBbaXN0YXJnZXQgKi0qLWxpbnV4YW91dCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0ICotKi1saW51eG9sZGxkKl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIHshIFtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL3dlYWsxLnMgdG1wZGlyL3dlYWsxLm9dCi0gICAgfHwgISBbbGRfYXNzZW1ibGUgJGFzICRzcmNkaXIvJHN1YmRpci93ZWFrMi5zIHRtcGRpci93ZWFrMi5vXX0gdGhlbiB7Ci0gICAgIyBJdCdzIE9LIGlmIC53ZWFrIGRvZXNuJ3Qgd29yayBvbiB0aGlzIHRhcmdldC4KLSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1zZXQgd2Vha19yZWdleHBfYmlnIFwKLSIuKkNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6LioxMDAwIDAwMDAxMDA4IDAwMDAyMDBjIDEyMTIxMjEyIDM0MzQzNDM0LipDb250ZW50cyBvZiBzZWN0aW9uIC5kYXRhOi4qMjAwMCAwMDAwMTAwOCAwMDAwMjAwYyA1NjU2NTY1NiA3ODc4Nzg3OC4qIgotCi1zZXQgd2Vha19yZWdleHBfbGl0dGxlIFwKLSIuKkNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6LioxMDAwIDA4MTAwMDAwIDBjMjAwMDAwIDEyMTIxMjEyIDM0MzQzNDM0LipDb250ZW50cyBvZiBzZWN0aW9uIC5kYXRhOi4qMjAwMCAwODEwMDAwMCAwYzIwMDAwMCA1NjU2NTY1NiA3ODc4Nzg3OC4qIgotCi1pZiB7ISBbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci93ZWFrICItVCAkc3JjZGlyLyRzdWJkaXIvd2Vhay50IHRtcGRpci93ZWFrMS5vIHRtcGRpci93ZWFrMi5vIl0gfSB0aGVuIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICBpZiB7W3doaWNoICRvYmpkdW1wXSA9PSAwfSB0aGVuIHsKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgLXMgdG1wZGlyL3dlYWsiCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgLXMgdG1wZGlyL3dlYWsiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgdmVyYm9zZSAtbG9nICRleGVjX291dHB1dAotCi0gICAgaWYge1tyZWdleHAgJHdlYWtfcmVnZXhwX2JpZyAkZXhlY19vdXRwdXRdIFwKLQl8fCBbcmVnZXhwICR3ZWFrX3JlZ2V4cF9saXR0bGUgJGV4ZWNfb3V0cHV0XSB9IHRoZW4gewotCXBhc3MgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlmYWlsICR0ZXN0bmFtZQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkMDEzZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrLnQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1TRUNUSU9OUwotewotICAudGV4dCAweDEwMDAgOiB7Ci0gICAgdG1wZGlyL3dlYWsxLm8oLmRhdGEpCi0gIH0KLSAgLmRhdGEgMHgyMDAwIDogewotICAgIHRtcGRpci93ZWFrMi5vKC5kYXRhKQotICB9Ci0gIC9ESVNDQVJELyA6IHsKLSAgICAqKCopCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsxLnMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDZmYmUxLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0uZGF0YQotCS5nbG9iYWwJZm9vMQotCS5nbG9iYWwJc3ltMQotCS53ZWFrCXN5bTIKLWZvbzE6Ci0JLmxvbmcJc3ltMQotCS5sb25nCXN5bTIKLXN5bTE6Ci0JLmxvbmcJMHgxMjEyMTIxMgotc3ltMjoKLQkubG9uZwkweDM0MzQzNDM0CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMi5zIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2VhazIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlZGZmNS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLmRhdGEKLQkuZ2xvYmFsCWZvbzIKLQkud2VhawlzeW0xCi0JLmdsb2JhbAlzeW0yCi1mb28yOgotCS5sb25nCXN5bTEKLQkubG9uZwlzeW0yCi1zeW0xOgotCS5sb25nCTB4NTY1NjU2NTYKLXN5bTI6Ci0JLmxvbmcJMHg3ODc4Nzg3OApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8xLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwMjM2Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzEuYworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qIF9zdGFydCBzaG91bGQgYmUgdGhlIG9ubHkgdGhpbmcgbGVmdCBhZnRlciBHQy4gICovCi0KLXZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7Ci12b2lkIF9zdGFydCgpCi17Ci19Ci0KLXZvaWQgZHJvcG1lMSgpCi17Ci19Ci0KLWludCBkcm9wbWUyWzEwMl0gPSB7IDAgfTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMi5jIGIvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOTU4ODcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKiBOb3JtYWxseSB3ZSBzaG91bGQgbG9vc2UgZm9vIGFuZCBrZWVwIF9zdGFydCBhbmQgX2luaXQuIAotICAgV2l0aCAtdSBmb28sIHdlIHNob3VsZCBrZWVwIHRoYXQgYXMgd2VsbC4gICovCi0KLXZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7Ci12b2lkIF9zdGFydCgpCi17Ci19Ci0KLXZvaWQgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLmluaXQiKSkpCi1faW5pdCgpCi17Ci19Ci0KLWludCBmb28oKSBfX2FzbV9fKCJmb28iKTsKLWludCBmb28oKQotewotICBzdGF0aWMgaW50IHggPSAxOwotICByZXR1cm4geCsrOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8zLmNjIGIvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8zLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTJiYzVkLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMy5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXN0cnVjdCBBCi17Ci0gIHZpcnR1YWwgdm9pZCBmb28oKTsKLSAgdmlydHVhbCB2b2lkIGJhcigpOwotfTsKLQotdm9pZCBBOjpmb28oKSB7IH0JCQkvLyBrZWVwCi12b2lkIEE6OmJhcigpIHsgfQkJCS8vIGxvb3NlCi0KLXN0cnVjdCBCIDogcHVibGljIEEKLXsKLSAgdmlydHVhbCB2b2lkIGZvbygpOwotfTsKLQotdm9pZCBCOjpmb28oKSB7IH0JCQkvLyBrZWVwCi0KLXZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7CS8vIGtlZXAKLQotQSBhOwkJCQkJLy8ga2VlcAotQiBiOwotQSAqZ2V0bWUoKSB7IHJldHVybiAmYTsgfQkJLy8ga2VlcAotCi12b2lkIF9zdGFydCgpCi17Ci0gIGdldG1lKCktPmZvbygpOwotfQotCi0vLyBJbiBhZGRpdGlvbiwga2VlcCBBJ3MgdmlydHVhbCB0YWJsZS4KLQotLy8gV2UnbGwgd2luZCB1cCBrZWVwaW5nIGBiJyBhbmQgdGh1cyBCJ3MgdmlydHVhbCB0YWJsZSBiZWNhdXNlCi0vLyBgYScgYW5kIGBiJyBhcmUgYm90aCByZWZlcmVuY2VkIGZyb20gdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgotCi1leHRlcm4gIkMiIHZvaWQgX19tYWluKCkgeyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzQuY2MgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZjI2YWMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS80LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotc3RydWN0IEEKLXsKLSAgdmlydHVhbCB2b2lkIGZvbygpOwotICB2aXJ0dWFsIHZvaWQgYmFyKCk7Ci19OwotCi12b2lkIEE6OmZvbygpIHsgfQkJCS8vIGxvb3NlCi12b2lkIEE6OmJhcigpIHsgfQkJCS8vIGtlZXAKLQotc3RydWN0IEIgOiBwdWJsaWMgQQotewotICB2aXJ0dWFsIHZvaWQgZm9vKCk7Ci19OwotCi12b2lkIEI6OmZvbygpIHsgfQkJCS8vIGxvb3NlCi0KLXZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7CS8vIGtlZXAKLQotQSBhOwkJCQkJLy8ga2VlcAotQiBiOwotQSAqZ2V0bWUoKSB7IHJldHVybiAmYTsgfQkJLy8ga2VlcAotCi12b2lkIF9zdGFydCgpCi17Ci0gIGdldG1lKCktPmJhcigpOwotfQotCi1leHRlcm4gIkMiIHZvaWQgX19tYWluKCkgeyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzUuY2MgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNzlkOTEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS81LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8gVGhpcyB0ZXN0IGN1cnJlbnRseSBmYWlscyBiZWNhdXNlIHRoZSBDKysgZnJvbnQgZW5kIGVtaXRzIGBBJyBhcwotLy8gdGhlIGJhc2UgY2xhc3MgY2FsbGVkIHJhdGhlciB0aGFuIGBCJyBhcyBpdCBvdWdodC4gIEF0IGxlYXN0IGl0Ci0vLyBpcyBlcnJvcmluZyBvbiB0aGUgc2FmZSBzaWRlLi4uCi0KLXN0cnVjdCBBCi17Ci0gIHZpcnR1YWwgdm9pZCBmb28oKTsKLSAgdmlydHVhbCB2b2lkIGJhcigpOwotfTsKLQotdm9pZCBBOjpmb28oKSB7IH0JCQkvLyBsb29zZQotdm9pZCBBOjpiYXIoKSB7IH0JCQkvLyBsb29zZQotCi1zdHJ1Y3QgQiA6IHB1YmxpYyBBCi17Ci0gIHZpcnR1YWwgdm9pZCBmb28oKTsKLX07Ci0KLXZvaWQgQjo6Zm9vKCkgeyB9CQkJLy8ga2VlcAotCi12b2lkIF9zdGFydCgpIF9fYXNtX18oIl9zdGFydCIpOwkvLyBrZWVwCi0KLUEgYTsKLUIgYjsJCQkJCS8vIGtlZXAKLUIgKmdldG1lKCkgeyByZXR1cm4gJmI7IH0JCS8vIGtlZXAKLQotdm9pZCBfc3RhcnQoKQotewotICBnZXRtZSgpLT5mb28oKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIF9fbWFpbigpIHsgfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS9zZWxlY3RpdmUuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS9zZWxlY3RpdmUuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmE5ZDk3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvc2VsZWN0aXZlLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0jIEV4cGVjdCBzY3JpcHQgZm9yIExEIHNlbGVjdGl2ZSBsaW5raW5nIHRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgQ2F0aGVyaW5lIE1vb3JlIChjbG1AY3lnbnVzLmNvbSkKLSMgTWFrZSBzdXJlIHRoYXQgY29uc3RydWN0b3JzIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQotCi0jIENPRkYgYmFzZWQgcG9ydHMgZG8gbm90IHN1cHBvcnQgc2VsZWN0aXZlIGxpbmtpbmcKLWlmIHtbaXN0YXJnZXQgIiotKi1jb2ZmIiAiKi0qLXBlIl19IHsKLSAgcmV0dXJuCi19Ci0KLXNldCB0ZXN0MSAic2VsZWN0aXZlMSIKLXNldCB0ZXN0MiAic2VsZWN0aXZlMiIKLXNldCB0ZXN0MyAic2VsZWN0aXZlMyIKLXNldCB0ZXN0NCAic2VsZWN0aXZlNCIKLXNldCB0ZXN0NSAic2VsZWN0aXZlNSIKLXNldCB0ZXN0NiAic2VsZWN0aXZlNiIKLQotc2V0IGNmbGFncyAiLXcgLU8yIC1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zIiAKLXNldCBjeHhmbGFncyAiLWZ2dGFibGUtZ2MgLWZuby1leGNlcHRpb25zIC1mbm8tcnR0aSIKLXNldCBsZGZsYWdzICItLWdjLXNlY3Rpb25zIC1Cc3RhdGljIgotCi1pZiB7IFt3aGljaCAkQ1hYXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0MQotICAgIHVudGVzdGVkICR0ZXN0MgotICAgIHVudGVzdGVkICR0ZXN0MwotICAgIHVudGVzdGVkICR0ZXN0NAotICAgIHVudGVzdGVkICR0ZXN0NQotICAgIHVudGVzdGVkICR0ZXN0NgotICAgIHJldHVybgotfQotCi1pZiB7ICFbbGRfY29tcGlsZSAiJENDICRjZmxhZ3MiICRzcmNkaXIvJHN1YmRpci8xLmMgdG1wZGlyLzEub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0MQotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvMS54ICIkbGRmbGFncyB0bXBkaXIvMS5vIl0gewotICAgIGZhaWwgJHRlc3QxCi19IGVsc2UgewotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci8xLnhdIHsKLQl1bnJlc29sdmVkICR0ZXN0MQotICAgIH0gZWxzZSB7Ci0JaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZHJvcG1lMSldfSB7Ci0JCXNlbmRfbG9nICJkcm9wbWUxID09ICRubV9vdXRwdXQoZHJvcG1lMSlcbiIKLQkJdmVyYm9zZSAiZHJvcG1lMSA9PSAkbm1fb3V0cHV0KGRyb3BtZTEpIgotCQlmYWlsICR0ZXN0MQotCSAgICB9IGVsc2UgewotCQlpZiB7W2luZm8gZXhpc3RzIG5tX291dHB1dChkcm9wbWUyKV19IHsKLQkJICAgIHNlbmRfbG9nICJkcm9wbWUyID09ICRubV9vdXRwdXQoZHJvcG1lMilcbiIKLQkJICAgIHZlcmJvc2UgImRyb3BtZTIgPT0gJG5tX291dHB1dChkcm9wbWUyKSIKLQkJICAgIGZhaWwgJHRlc3QxCi0JCX0gZWxzZSB7Ci0JCSAgICBwYXNzICR0ZXN0MQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi1pZiB7ICFbbGRfY29tcGlsZSAiJENDICRjZmxhZ3MiICRzcmNkaXIvJHN1YmRpci8yLmMgdG1wZGlyLzIub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvMi54ICIkbGRmbGFncyB0bXBkaXIvMi5vIl0gewotICAgIGZhaWwgJHRlc3QyCi19IGVsc2UgewotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci8yLnhdIHsKLQl1bnJlc29sdmVkICR0ZXN0MgotICAgIH0gZWxzZSB7Ci0JaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZm9vKV0gfSB7Ci0gICAgICAgICAgICBzZW5kX2xvZyAiZm9vID09ICRubV9vdXRwdXQoZm9vKVxuIgotICAgICAgICAgICAgdmVyYm9zZSAiZm9vPT0gJG5tX291dHB1dChmb28pIgotICAgICAgICAgICAgZmFpbCAkdGVzdDIKLQl9IGVsc2UgewotICAgICAgICAgICAgcGFzcyAkdGVzdDIKLQkgICAgfSAKLQkgfQotICAgICB9Ci0KLWlmIHsgIVtsZF9jb21waWxlICIkQ0MgJGNmbGFncyIgJHNyY2Rpci8kc3ViZGlyLzIuYyB0bXBkaXIvMi5vXX0gewotICAgIHVucmVzb2x2ZWQgJHRlc3QzCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci8yLnggIiRsZGZsYWdzIC11IGZvbyB0bXBkaXIvMi5vIl0gewotICAgIGZhaWwgJHRlc3QzCi19IGVsc2UgewotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci8yLnhdIHsKLQl1bnJlc29sdmVkICR0ZXN0MwotICAgIH0gZWxzZSB7Ci0JaWYgeyFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvbyldIH0gewotCSAgICBzZW5kX2xvZyAiYmFkIG91dHB1dCBmcm9tIG5tXG4iCi0JICAgIHZlcmJvc2UgImJhZCBvdXRwdXQgZnJvbSBubSIKLQkgICAgZmFpbCAkdGVzdDMKLQl9IGVsc2UgewotCSAgICBpZiB7JG5tX291dHB1dChmb28pID09IDB9IHsKLQkJc2VuZF9sb2cgImZvbyA9PSAkbm1fb3V0cHV0KGZvbylcbiIKLQkJdmVyYm9zZSAiZm9vPT0gJG5tX291dHB1dChmb28pIgotCQlmYWlsICR0ZXN0MwotCSAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBhc3MgJHRlc3QzCi0JCX0KLQkgfQotICAgICB9Ci19Ci0KLXNldHVwX3hmYWlsICJ2ODUwKi0qLWVsZiIKLQotaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkY2ZsYWdzICRjeHhmbGFncyIgJHNyY2Rpci8kc3ViZGlyLzMuY2MgdG1wZGlyLzMub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0NAotICAgIHJldHVybgotfQotCi1zZXR1cF94ZmFpbCAidjg1MCotKi1lbGYiCi0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci8zLnggIiRsZGZsYWdzIHRtcGRpci8zLm8iXSB7Ci0gICBmYWlsICR0ZXN0NAotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvMy54XSB7Ci0gICAgICAgdW5yZXNvbHZlZCAkdGVzdDQKLSAgICB9IGVsc2UgewotICAgICAgIGlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvb19fMUIpXX0gewotICAgICAgICAgIHNlbmRfbG9nICJmb29fXzFCID09ICRubV9vdXRwdXQoZm9vX18xQilcbiIKLSAgICAgICAgICB2ZXJib3NlICJmb29fXzFCID09ICRubV9vdXRwdXQoZm9vX18xQikiCi0gICAgICAgICAgZmFpbCAkdGVzdDQKLSAgICAgICB9IGVsc2UgewotICAgICAgICAgICBpZiB7WyBpbmZvIGV4aXN0cyBubV9vdXRwdXQoYmFyX18xQSldfSB7Ci0gICAgICAgICAgICAgIHNlbmRfbG9nICJiYXJfXzFBPT0gJG5tX291dHB1dChfYmFyX18xQSlcbiIKLSAgICAgICAgICAgICAgdmVyYm9zZSAiYmFyX18xQSA9PSAkbm1fb3V0cHV0KF9iYXJfXzFBKSIKLSAgICAgICAgICAgICAgZmFpbCAkdGVzdDQKLSAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIHBhc3MgJHRlc3Q0Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgIH0KLX0KLQotaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkY2ZsYWdzICRjeHhmbGFncyIgJHNyY2Rpci8kc3ViZGlyLzQuY2MgdG1wZGlyLzQub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0NQotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvNC54ICIkbGRmbGFncyB0bXBkaXIvNC5vIl0gewotICAgIGZhaWwgJHRlc3Q1Ci19IGVsc2UgewotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci80LnhdIHsKLQl1bnJlc29sdmVkICR0ZXN0NQotICAgIH0gZWxzZSB7Ci0JaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZm9vX18xQildfSB7IAotICAgICAgICAgICAgc2VuZF9sb2cgImZvb19fMUIgPT0gJG5tX291dHB1dChmb29fXzFCKVxuIgotICAgICAgICAgICAgdmVyYm9zZSAiZm9vX18xQiA9PSAkbm1fb3V0cHV0KGZvb19fMUIpIgotCSAgICBmYWlsICR0ZXN0NQotCX0gZWxzZSB7Ci0gICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZm9vX18xQSldfSB7Ci0JICAgICAgICBzZW5kX2xvZyAiZm9vX18xQT09ICRubV9vdXRwdXQoZm9vX18xQSlcbiIKLQkJdmVyYm9zZSAiZm9vX18xQSA9PSAkbm1fb3V0cHV0KGZvb19fMUEpIgotCQlmYWlsICR0ZXN0NQotICAgICAgICAgIH0gZWxzZSB7Ci0JICAgICAgcGFzcyAkdGVzdDUKLSAgICAgICAgICAgICB9Ci0JfQotICAgIH0KLX0KLQotc2V0dXBfeGZhaWwgInY4NTAqLSotZWxmIgotCi1pZiB7ICFbbGRfY29tcGlsZSAiJENDICRjZmxhZ3MgJGN4eGZsYWdzIiAkc3JjZGlyLyRzdWJkaXIvNS5jYyB0bXBkaXIvNS5vXX0gewotICAgIHVucmVzb2x2ZWQgJHRlc3Q2Ci0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci81LnggIiRsZGZsYWdzIHRtcGRpci81Lm8iXSB7Ci0gICAgZmFpbCAkdGVzdDYKLX0gZWxzZSB7Ci0gICAgaWYgIVtsZF9ubSAkbm0gdG1wZGlyLzUueF0gewotCXVucmVzb2x2ZWQgJHRlc3Q2Ci0gICAgfSBlbHNlIHsKLQlpZiB7W2luZm8gZXhpc3RzIG5tX291dHB1dChmb29fXzFCKV0gfSB7Ci0gICAgICAgICAgICBzZW5kX2xvZyAiZm9vX18xQiA9PSAkbm1fb3V0cHV0KGZvb19fMUIpXG4iCi0gICAgICAgICAgICB2ZXJib3NlICJmb29fXzFCID09ICRubV9vdXRwdXQoZm9vX18xQikiCi0JICAgIGZhaWwgJHRlc3Q2Ci0JfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIHsgW2luZm8gZXhpc3RzIG5tX291dHB1dChmb29fXzFBKV19IHsKLQkJICBzZW5kX2xvZyAiZm9vX18xQT09ICRubV9vdXRwdXQoZm9vX18xQSlcbiIKLQkJICB2ZXJib3NlICJmb29fXzFBID09ICRubV9vdXRwdXQoZm9vX18xQSkiCi0JCSAgZmFpbCAkdGVzdDYKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0JICAgICAgIHBhc3MgJHRlc3Q2Ci0JICAgIH0KLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoL3NoLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NDZkMjYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoL3NoLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0jIEV4cGVjdCBzY3JpcHQgZm9yIGxkLXNoIHRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciAoaWFuQGN5Z251cy5jb20pCi0jCi0KLSMgVGVzdCBTSCByZWxheGluZy4gIFRoaXMgdGVzdHMgdGhlIGNvbXBpbGVyIGFuZCBhc3NlbWJsZXIgYXMgd2VsbCBhcwotIyB0aGUgbGlua2VyLgotCi1pZiAhW2lzdGFyZ2V0IHNoKi0qLSpdIHsKLSAgICByZXR1cm4KLX0KLQotc2V0IHRlc3RzaW1wbGUgIlNIIHNpbXBsZSByZWxheGluZyIKLQotaWYgIVtsZF9hc3NlbWJsZSAkYXMgIi1yZWxheCAkc3JjZGlyLyRzdWJkaXIvc2gxLnMiIHRtcGRpci9zaDEub10gewotICAgIHVucmVzb2x2ZWQgJHRlc3RzaW1wbGUKLX0gZWxzZSB7IGlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zaDEgIi1yZWxheCB0bXBkaXIvc2gxLm8iXSB7Ci0gICAgZmFpbCAkdGVzdHNpbXBsZQotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvc2gxXSB7Ci0JdW5yZXNvbHZlZCAkdGVzdHNpbXBsZQotICAgIH0gZWxzZSB7Ci0JaWYgeyFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGJhcildIFwKLQkgICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvbyldfSB7Ci0JICAgIHNlbmRfbG9nICJiYWQgb3V0cHV0IGZyb20gbm1cbiIKLQkgICAgdmVyYm9zZSAiYmFkIG91dHB1dCBmcm9tIG5tIgotCSAgICBmYWlsICR0ZXN0c2ltcGxlCi0JfSBlbHNlIHsKLQkgICAgaWYgeyRubV9vdXRwdXQoYmFyKSAhPSAkbm1fb3V0cHV0KGZvbykgKyA0fSB7Ci0JCXNlbmRfbG9nICJmb28gPT0gJG5tX291dHB1dChmb28pXG4iCi0JCXZlcmJvc2UgImZvbyA9PSAkbm1fb3V0cHV0KGZvbykiCi0JCXNlbmRfbG9nICJiYXIgPT0gJG5tX291dHB1dChiYXIpXG4iCi0JCXZlcmJvc2UgImJhciA9PSAkbm1fb3V0cHV0KGJhcikiCi0JCWZhaWwgJHRlc3RzaW1wbGUKLQkgICAgfSBlbHNlIHsKLQkJcGFzcyAkdGVzdHNpbXBsZQotCSAgICB9Ci0JfQotICAgIH0KLX0gfQotCi1zZXQgdGVzdHNyZWMgIlNIIHJlbGF4aW5nIHRvIFMtcmVjb3JkcyIKLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NoMS5zMSAiLXJlbGF4IC1vZm9ybWF0IHNyZWMgdG1wZGlyL3NoMS5vIl0gewotICAgIGZhaWwgJHRlc3RzcmVjCi19IGVsc2UgewotICAgICMgVGhlIGZpbGUgbmFtZSBpcyBlbWJlZGRlZCBpbiB0aGUgUy1yZWNvcmRzLCBzbyBjcmVhdGUgYm90aAotICAgICMgZmlsZXMgd2l0aCB0aGUgc2FtZSBuYW1lLgotICAgIGNhdGNoICJleGVjIHJtIC1mIHRtcGRpci9zaDEuczIiIGV4ZWNfb3V0cHV0Ci0gICAgc2VuZF9sb2cgIm12IHRtcGRpci9zaDEuczEgdG1wZGlyL3NoMS5zMlxuIgotICAgIHZlcmJvc2UgIm12IHRtcGRpci9zaDEuczEgdG1wZGlyL3NoMS5zMiIKLSAgICBjYXRjaCAiZXhlYyBtdiB0bXBkaXIvc2gxLnMxIHRtcGRpci9zaDEuczIiIGV4ZWNfb3V0cHV0Ci0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQl1bnJlc29sdmVkICR0ZXN0c3JlYwotICAgIH0gZWxzZSB7Ci0Jc2VuZF9sb2cgIiRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NoMSB0bXBkaXIvc2gxLnMxIgotCXZlcmJvc2UgIiRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NoMSB0bXBkaXIvc2gxLnMxIgotCWNhdGNoICJleGVjICRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NoMSB0bXBkaXIvc2gxLnMxIiBleGVjX291dHB1dAotCWlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCSAgICBzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JICAgIHZlcmJvc2UgIiRleGVjX291dHB1dCIKLQkgICAgdW5yZXNvbHZlZCAkdGVzdHNyZWMKLQl9IGVsc2UgewotCSAgICBzZW5kX2xvZyAiY21wIHRtcGRpci9zaDEuczEgdG1wZGlyL3NoMS5zMlxuIgotCSAgICB2ZXJib3NlICJjbXAgdG1wZGlyL3NoMS5zMSB0bXBkaXIvc2gxLnMyIgotCSAgICBjYXRjaCAiZXhlYyBjbXAgdG1wZGlyL3NoMS5zMSB0bXBkaXIvc2gxLnMyIiBleGVjX291dHB1dAotCSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQkgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQkJdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCQlmYWlsICR0ZXN0c3JlYwotCSAgICB9IGVsc2UgewotCQlwYXNzICR0ZXN0c3JlYwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotc2V0IHRlc3RsaW5rICJTSCByZWxheGluZyIKLXNldCB0ZXN0anNyICJTSCBjb25maXJtIHJlbGF4aW5nIgotc2V0IHRlc3RydW4gIlNIIHJlbGF4aW5nIGV4ZWN1dGlvbiIKLQotaWYgeyBbd2hpY2ggJENDXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0bGluawotICAgIHVudGVzdGVkICR0ZXN0anNyCi0gICAgdW50ZXN0ZWQgJHRlc3RydW4KLSAgICByZXR1cm4KLX0KLQotaWYgeyFbbGRfYXNzZW1ibGUgJGFzICItcmVsYXggJHNyY2Rpci8kc3ViZGlyL3N0YXJ0LnMiIHRtcGRpci9zdGFydC5vXSBcCi0gICAgIHx8ICFbbGRfY29tcGlsZSAkQ0MgIi1PIC1tcmVsYXggJHNyY2Rpci8kc3ViZGlyL3NoMi5jIiB0bXBkaXIvc2gyLm9dfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdGxpbmsKLSAgICB1bnJlc29sdmVkICR0ZXN0anNyCi0gICAgdW5yZXNvbHZlZCAkdGVzdHJ1bgotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc2gyICItcmVsYXggdG1wZGlyL3N0YXJ0Lm8gdG1wZGlyL3NoMi5vIl0gewotICAgIGZhaWwgJHRlc3RsaW5rCi0gICAgdW5yZXNvbHZlZCAkdGVzdGpzcgotICAgIHVucmVzb2x2ZWQgJHRlc3RydW4KLSAgICByZXR1cm4KLX0KLQotcGFzcyAkdGVzdGxpbmsKLQotc2VuZF9sb2cgIiRvYmpkdW1wIC1kIHRtcGRpci9zaDJcbiIKLXZlcmJvc2UgIiRvYmpkdW1wIC1kIHRtcGRpci9zaDIiCi1jYXRjaCAiZXhlYyAkb2JqZHVtcCAtZCB0bXBkaXIvc2gyIiBleGVjX291dHB1dAotaWYgW3N0cmluZyBtYXRjaCAiKmpzcioiICRleGVjX291dHB1dF0gewotICAgIGZhaWwgJHRlc3Rqc3IKLX0gZWxzZSB7Ci0gICAgcGFzcyAkdGVzdGpzcgotfQotCi1pZiB7ICFbaW5mbyBleGlzdHMgU0lNXSB8fCBbd2hpY2ggJFNJTV0gPT0gMCB9IHsKLSAgICB1bnRlc3RlZCAkdGVzdHJ1bgotICAgIHJldHVybgotfQotCi1zZXQgc3RhdHVzIFtjYXRjaCAiZXhlYyAkU0lNIHRtcGRpci9zaDIiIGV4ZWNfb3V0cHV0XQotaWYgeyAkc3RhdHVzID09IDAgfSB7Ci0gICAgcGFzcyAkdGVzdHJ1bgotfSBlbHNlIHsKLSAgICBmYWlsICR0ZXN0cnVuCi19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2gvc2gxLnMgYi9sZC90ZXN0c3VpdGUvbGQtc2gvc2gxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOGU0MzkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoL3NoMS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCS50ZXh0Ci1mb286Ci1MMToJCi0JbW92LmwJTDIscjAKLQkudXNlcwlMMQotCWpzcglAcjAKLQlydHMKLQkuYWxpZ24JMgotTDI6Ci0JLmxvbmcJYmFyCi1iYXI6Ci0JcnRzCi0JLmFsaWduCTQKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaDIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI3ZmU4OC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2gvc2gyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotaW50IGdsb2JhbDsKLQotZXh0ZXJuIHZvaWQgdHJhcCAoaW50LCBpbnQpOwotc3RhdGljIHZvaWQgcXVpdCAoaW50KTsKLXN0YXRpYyBpbnQgZm9vIChpbnQpOwotCi1pbnQKLW1haW4gKCkKLXsKLSAgaWYgKGZvbyAoMCkgIT0gMCB8fCBnbG9iYWwgIT0gMCkKLSAgICBxdWl0ICgxKTsKLSAgaWYgKGZvbyAoMSkgIT0gMSB8fCBnbG9iYWwgIT0gMSkKLSAgICBxdWl0ICgxKTsKLSAgaWYgKGZvbyAoMikgIT0gMiB8fCBnbG9iYWwgIT0gMikKLSAgICBxdWl0ICgxKTsKLSAgaWYgKGZvbyAoMykgIT0gMyB8fCBnbG9iYWwgIT0gMykKLSAgICBxdWl0ICgxKTsKLSAgaWYgKGZvbyAoNCkgIT0gNCB8fCBnbG9iYWwgIT0gNCkKLSAgICBxdWl0ICgxKTsKLSAgaWYgKGZvbyAoNSkgIT0gNSB8fCBnbG9iYWwgIT0gNSkKLSAgICBxdWl0ICgxKTsKLSAgaWYgKGZvbyAoNikgIT0gNiB8fCBnbG9iYWwgIT0gNikKLSAgICBxdWl0ICgxKTsKLSAgaWYgKGZvbyAoNykgIT0gNyB8fCBnbG9iYWwgIT0gNykKLSAgICBxdWl0ICgxKTsKLSAgaWYgKGZvbyAoOCkgIT0gOCB8fCBnbG9iYWwgIT0gOCkKLSAgICBxdWl0ICgxKTsKLSAgcXVpdCAoMCk7Ci19Ci0KLXZvaWQKLV9fbWFpbiAoKQotewotfQotCi1zdGF0aWMgdm9pZAotcXVpdCAoaW50IHN0YXR1cykKLXsKLSAgdHJhcCAoMSwgc3RhdHVzKTsKLX0KLQotaW50Ci1iYXIgKGludCBpKQotewotICBnbG9iYWwgPSBpOwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1iYXIwIChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gMDsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotYmFyMSAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IDE7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWJhcjIgKGludCBpKQotewotICBnbG9iYWwgPSAyOwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1iYXIzIChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gMzsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotYmFyNCAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IDQ7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWJhcjUgKGludCBpKQotewotICBnbG9iYWwgPSA1OwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1iYXI2IChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gNjsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotYmFyNyAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IDc7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWZvbyAoaW50IGkpCi17Ci0gIHN3aXRjaCAoaSkKLSAgICB7Ci0gICAgY2FzZSAwOiBiYXIwICgwKTsgcmV0dXJuIDA7Ci0gICAgY2FzZSAxOiBiYXIxICgxKTsgcmV0dXJuIDE7Ci0gICAgY2FzZSAyOiBiYXIyICgyKTsgcmV0dXJuIDI7Ci0gICAgY2FzZSAzOiBiYXIzICgzKTsgcmV0dXJuIDM7Ci0gICAgY2FzZSA0OiBiYXI0ICg0KTsgcmV0dXJuIDQ7Ci0gICAgY2FzZSA1OiBiYXI1ICg1KTsgcmV0dXJuIDU7Ci0gICAgY2FzZSA2OiBiYXI2ICg2KTsgcmV0dXJuIDY7Ci0gICAgY2FzZSA3OiBiYXI3ICg3KTsgcmV0dXJuIDc7Ci0gICAgZGVmYXVsdDogcmV0dXJuIGJhciAoaSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoL3N0YXJ0LnMgYi9sZC90ZXN0c3VpdGUvbGQtc2gvc3RhcnQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFmNGM3OS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2gvc3RhcnQucworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLQkuc2VjdGlvbiAudGV4dAotCS5nbG9iYWwJc3RhcnQKLXN0YXJ0OgotCi0JbW92LmwJc3RhY2tfayxyMTUKLQotCSEgY2FsbCB0aGUgbWFpbmxpbmUJCi1MMToJCi0JbW92LmwJbWFpbl9rLHIwCi0JLnVzZXMJTDEKLQlqc3IJQHIwCi0Jbm9wCi0KLQkuYWxpZ24gMgotc3RhY2tfazoKLQkubG9uZwlfc3RhY2sJCi1tYWluX2s6Ci0JLmxvbmcJX21haW4KLQotCS5nbG9iYWwgX3RyYXAKLV90cmFwOgkKLQl0cmFwYSAjMwotCXJ0cwotCW5vcAotCi0JLnNlY3Rpb24gLnN0YWNrCi1fc3RhY2s6CS5sb25nCTB4ZGVhZGRlYWQKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvZWxmLW9mZnNldC5sZCBiL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvZWxmLW9mZnNldC5sZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlNDI5My4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL2VsZi1vZmZzZXQubGQKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSAweDEwMDAwMDsKLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5nbnUudmVyc2lvbiAgIDogeyAqKC5nbnUudmVyc2lvbikJfQotICAuZ251LnZlcnNpb25fZCAgIDogeyAqKC5nbnUudmVyc2lvbl9kKQl9Ci0gIC5nbnUudmVyc2lvbl9yICAgOiB7ICooLmdudS52ZXJzaW9uX3IpCX0KLSAgLnJlbC50ZXh0ICAgICAgOgotICAgIHsKLSAgICAgICooLnJlbC50ZXh0KQotICAgICAgKigucmVsLnRleHQuKikKLSAgICAgICooLnJlbC5nbnUubGlua29uY2UudCopCi0gICAgfQotICAucmVsYS50ZXh0ICAgICA6Ci0gICAgewotICAgICAgKigucmVsYS50ZXh0KQotICAgICAgKigucmVsYS50ZXh0LiopCi0gICAgICAqKC5yZWxhLmdudS5saW5rb25jZS50KikKLSAgICB9Ci0gIC5yZWwuZGF0YSAgICAgIDoKLSAgICB7Ci0gICAgICAqKC5yZWwuZGF0YSkKLSAgICAgICooLnJlbC5kYXRhLiopCi0gICAgICAqKC5yZWwuZ251LmxpbmtvbmNlLmQqKQotICAgIH0KLSAgLnJlbGEuZGF0YSAgICAgOgotICAgIHsKLSAgICAgICooLnJlbGEuZGF0YSkKLSAgICAgICooLnJlbGEuZGF0YS4qKQotICAgICAgKigucmVsYS5nbnUubGlua29uY2UuZCopCi0gICAgfQotICAucmVsLnJvZGF0YSAgICA6Ci0gICAgewotICAgICAgKigucmVsLnJvZGF0YSkKLSAgICAgICooLnJlbC5yb2RhdGEuKikKLSAgICAgICooLnJlbC5nbnUubGlua29uY2UuciopCi0gICAgfQotICAucmVsYS5yb2RhdGEgICA6Ci0gICAgewotICAgICAgKigucmVsYS5yb2RhdGEpCi0gICAgICAqKC5yZWxhLnJvZGF0YS4qKQotICAgICAgKigucmVsYS5nbnUubGlua29uY2UuciopCi0gICAgfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5pbml0ICAgICAgOiB7ICooLnJlbC5pbml0KQl9Ci0gIC5yZWxhLmluaXQgICAgIDogeyAqKC5yZWxhLmluaXQpCX0KLSAgLnJlbC5maW5pICAgICAgOiB7ICooLnJlbC5maW5pKQl9Ci0gIC5yZWxhLmZpbmkgICAgIDogeyAqKC5yZWxhLmZpbmkpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7IEtFRVAgKCooLmluaXQpKQl9Ci0gIC5wbHQgICAgICA6IHsgKigucGx0KQl9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgKigudGV4dCkKLSAgICAqKC50ZXh0LiopCi0gICAgKiguc3R1YikKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KLSAgICAqKC5nbnUud2FybmluZykKLSAgICAqKC5nbnUubGlua29uY2UudCopCi0gIH0KLSAgX2V0ZXh0ID0gLjsKLSAgUFJPVklERSAoZXRleHQgPSAuKTsKLSAgLmZpbmkgICAgICA6IHsgS0VFUCAoKiguZmluaSkpCQl9ID0weDkwOTAKLSAgLnJvZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhLiopCi0gICAgKiguZ251LmxpbmtvbmNlLnIqKQotICB9Ci0gIC5yb2RhdGExICAgOiB7ICooLnJvZGF0YTEpIH0KLSAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG8KLSAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gICovCi0gIC4gPSBBTElHTigweDEwMDApICsgKC4gJiAoMHgxMDAwIC0gMSkpOwotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGEuKikKLSAgICAqKC5nbnUubGlua29uY2UuZCopCi0gICAgU09SVChDT05TVFJVQ1RPUlMpCi0gIH0KLSAgLmRhdGExICAgOiB7ICooLmRhdGExKSB9Ci0gIC5jdG9ycyAgICAgICAgIDoKLSAgewotICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YgdGhlIGNvbnN0cnVjdG9ycywgc28KLSAgICAgICB3ZSBtYWtlIHN1cmUgaXQgaXMgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKLSAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdCBhY3R1YWxseSBsaW5rIGFnYWluc3QKLSAgICAgICBjcnRiZWdpbi5vOyB0aGUgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCi0gICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoCi0gICAgICAgZGlyZWN0b3J5IGNydGJlZ2luLm8gaXMgaW4uICAqLwotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguY3RvcnMpKQotICB9Ci0gIC5kdG9ycyAgICAgICAgIDoKLSAgewotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguZHRvcnMpKQotICB9Ci0gIC5nb3QgICAgICAgICAgIDogeyAqKC5nb3QucGx0KSAqKC5nb3QpIH0KLSAgLmR5bmFtaWMgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHMKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzbwotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqLwotICAuc2RhdGEgICAgIDogeyAqKC5zZGF0YSkgKiguc2RhdGEuKikgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLnNic3MgICAgICA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfQotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KLSAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQotICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLwotICAgLiA9IEFMSUdOKDMyIC8gOCk7Ci0gIH0KLSAgLiA9IEFMSUdOKDMyIC8gOCk7Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci0gIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH0KLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfQotICAuc3RhYi5leGNsIDAgOiB7ICooLnN0YWIuZXhjbCkgfQotICAuc3RhYi5leGNsc3RyIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQotICAuc3RhYi5pbmRleCAwIDogeyAqKC5zdGFiLmluZGV4KSB9Ci0gIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KLSAgLmNvbW1lbnQgMCA6IHsgKiguY29tbWVudCkgfQotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KLSAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCi0gIC8qIERXQVJGIDEgKi8KLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9Ci0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9Ci0gIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLSAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9Ci0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQotICAvKiBEV0FSRiAyICovCi0gIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9Ci0gIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KLSAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KLSAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9Ci0gIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KLSAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQotICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQotICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KLSAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KLSAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KLSAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICAuICAqLwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9tYWluLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjZmRhYS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qIFRoaXMgaXMgdGhlIG1haW4gcHJvZ3JhbSBmb3IgdGhlIHNoYXJlZCBsaWJyYXJ5IHRlc3QuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50IG1haW52YXIgPSAxOwotaW50IG92ZXJyaWRkZW52YXIgPSAyOwotZXh0ZXJuIGludCBzaGxpYnZhcjE7Ci0KLWV4dGVybiBpbnQgc2hsaWJfbWFpbnZhciAoKTsKLWV4dGVybiBpbnQgc2hsaWJfb3ZlcnJpZGRlbnZhciAoKTsKLWV4dGVybiBpbnQgc2hsaWJfc2hsaWJ2YXIxICgpOwotZXh0ZXJuIGludCBzaGxpYl9zaGxpYnZhcjIgKCk7Ci1leHRlcm4gaW50IHNobGliX3NobGliY2FsbCAoKTsKLWV4dGVybiBpbnQgc2hsaWJfbWFpbmNhbGwgKCk7Ci1leHRlcm4gaW50IHNobGliX2NoZWNrZnVucHRyMSAoKTsKLWV4dGVybiBpbnQgc2hsaWJfY2hlY2tmdW5wdHIyICgpOwotZXh0ZXJuIGludCAoKnNobGliX2dldGZ1bnB0cjEgKCkpICgpOwotZXh0ZXJuIGludCAoKnNobGliX2dldGZ1bnB0cjIgKCkpICgpOwotZXh0ZXJuIGludCBzaGxpYl9jaGVjayAoKTsKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotaW50Ci1tYWluX2NhbGxlZCAoKQotewotICByZXR1cm4gNjsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgYSBmdW5jdGlvbiBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCi1pbnQKLXNobGliX292ZXJyaWRkZW5jYWxsMiAoKQotewotICByZXR1cm4gODsKLX0KLQotaW50Ci1tYWluICgpCi17Ci0gIGludCAoKnApICgpOwotCi0gIHByaW50ZiAoIm1haW52YXIgPT0gJWRcbiIsIG1haW52YXIpOwotICBwcmludGYgKCJvdmVycmlkZGVudmFyID09ICVkXG4iLCBvdmVycmlkZGVudmFyKTsKLSAgcHJpbnRmICgic2hsaWJ2YXIxID09ICVkXG4iLCBzaGxpYnZhcjEpOwotI2lmbmRlZiBYQ09GRl9URVNUCi0gIHByaW50ZiAoInNobGliX21haW52YXIgKCkgPT0gJWRcbiIsIHNobGliX21haW52YXIgKCkpOwotICBwcmludGYgKCJzaGxpYl9vdmVycmlkZGVudmFyICgpID09ICVkXG4iLCBzaGxpYl9vdmVycmlkZGVudmFyICgpKTsKLSNlbmRpZgotICBwcmludGYgKCJzaGxpYl9zaGxpYnZhcjEgKCkgPT0gJWRcbiIsIHNobGliX3NobGlidmFyMSAoKSk7Ci0gIHByaW50ZiAoInNobGliX3NobGlidmFyMiAoKSA9PSAlZFxuIiwgc2hsaWJfc2hsaWJ2YXIyICgpKTsKLSAgcHJpbnRmICgic2hsaWJfc2hsaWJjYWxsICgpID09ICVkXG4iLCBzaGxpYl9zaGxpYmNhbGwgKCkpOwotI2lmbmRlZiBYQ09GRl9URVNUCi0gIHByaW50ZiAoInNobGliX3NobGliY2FsbDIgKCkgPT0gJWRcbiIsIHNobGliX3NobGliY2FsbDIgKCkpOwotICBwcmludGYgKCJzaGxpYl9tYWluY2FsbCAoKSA9PSAlZFxuIiwgc2hsaWJfbWFpbmNhbGwgKCkpOwotI2VuZGlmCi0gIHByaW50ZiAoIm1haW5fY2FsbGVkICgpID09ICVkXG4iLCBtYWluX2NhbGxlZCAoKSk7Ci0gIHByaW50ZiAoInNobGliX2NoZWNrZnVucHRyMSAoc2hsaWJfc2hsaWJ2YXIxKSA9PSAlZFxuIiwKLQkgIHNobGliX2NoZWNrZnVucHRyMSAoc2hsaWJfc2hsaWJ2YXIxKSk7Ci0jaWZuZGVmIFhDT0ZGX1RFU1QKLSAgcHJpbnRmICgic2hsaWJfY2hlY2tmdW5wdHIyIChtYWluX2NhbGxlZCkgPT0gJWRcbiIsCi0JICBzaGxpYl9jaGVja2Z1bnB0cjIgKG1haW5fY2FsbGVkKSk7Ci0jZW5kaWYKLSAgcCA9IHNobGliX2dldGZ1bnB0cjEgKCk7Ci0gIHByaW50ZiAoInNobGliX2dldGZ1bnB0cjEgKCkgIik7Ci0gIGlmIChwID09IHNobGliX3NobGlidmFyMSkKLSAgICBwcmludGYgKCI9PSIpOwotICBlbHNlCi0gICAgcHJpbnRmICgiIT0iKTsKLSAgcHJpbnRmICgiIHNobGliX3NobGlidmFyMVxuIik7Ci0jaWZuZGVmIFhDT0ZGX1RFU1QKLSAgcCA9IHNobGliX2dldGZ1bnB0cjIgKCk7Ci0gIHByaW50ZiAoInNobGliX2dldGZ1bnB0cjIgKCkgIik7Ci0gIGlmIChwID09IG1haW5fY2FsbGVkKQotICAgIHByaW50ZiAoIj09Iik7Ci0gIGVsc2UKLSAgICBwcmludGYgKCIhPSIpOwotICBwcmludGYgKCIgbWFpbl9jYWxsZWRcbiIpOwotI2VuZGlmCi0gIHByaW50ZiAoInNobGliX2NoZWNrICgpID09ICVkXG4iLCBzaGxpYl9jaGVjayAoKSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaDEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2gxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMWUwNmEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaDEuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKiBUaGlzIGlzIHBhcnQgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IGxkIHRlc3QuICBUaGlzIGZpbGUgYmVjb21lcyBwYXJ0Ci0gICBvZiBhIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotLyogVGhpcyB2YXJpYWJsZSBpcyBzdXBwbGllZCBieSB0aGUgbWFpbiBwcm9ncmFtLiAgKi8KLSNpZm5kZWYgWENPRkZfVEVTVAotZXh0ZXJuIGludCBtYWludmFyOwotI2VuZGlmCi0KLS8qIFRoaXMgdmFyaWFibGUgaXMgZGVmaW5lZCBpbiB0aGUgc2hhcmVkIGxpYnJhcnksIGFuZCBvdmVycmlkZGVuIGJ5Ci0gICB0aGUgbWFpbiBwcm9ncmFtLiAgKi8KLSNpZm5kZWYgWENPRkZfVEVTVAotaW50IG92ZXJyaWRkZW52YXIgPSAtMTsKLSNlbmRpZgotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIGRlZmluZWQgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLWludCBzaGxpYnZhcjEgPSAzOwotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIGRlZmluZWQgYnkgYW5vdGhlciBvYmplY3QgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLWV4dGVybiBpbnQgc2hsaWJ2YXIyOwotCi0vKiBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSB2YWx1ZXMgb2YgdGhlIGFib3ZlIHZhcmlhYmxlcyBhcyBzZWVuIGluCi0gICB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLWludAotc2hsaWJfbWFpbnZhciAoKQotewotICByZXR1cm4gbWFpbnZhcjsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLWludAotc2hsaWJfb3ZlcnJpZGRlbnZhciAoKQotewotICByZXR1cm4gb3ZlcnJpZGRlbnZhcjsKLX0KLSNlbmRpZgotCi1pbnQKLXNobGliX3NobGlidmFyMSAoKQotewotICByZXR1cm4gc2hsaWJ2YXIxOwotfQotCi1pbnQKLXNobGliX3NobGlidmFyMiAoKQotewotICByZXR1cm4gc2hsaWJ2YXIyOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhbm90aGVyIG9iamVjdCBpbiB0aGUKLSAgIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotZXh0ZXJuIGludCBzaGxpYl9zaGxpYmNhbGxlZCAoKTsKLQotaW50Ci1zaGxpYl9zaGxpYmNhbGwgKCkKLXsKLSAgcmV0dXJuIHNobGliX3NobGliY2FsbGVkICgpOwotfQotCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLS8qIFRoaXMgZnVuY3Rpb24gY2FsbHMgYSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoaXMgb2JqZWN0IGluIHRoZSBzaGFyZWQKLSAgIGxpYnJhcnkuICBUaGUgbWFpbiBwcm9ncmFtIHdpbGwgb3ZlcnJpZGUgdGhlIGNhbGxlZCBmdW5jdGlvbi4gICovCi0KLWV4dGVybiBpbnQgc2hsaWJfb3ZlcmlkZGVuY2FsbDIgKCk7Ci0KLWludAotc2hsaWJfc2hsaWJjYWxsMiAoKQotewotICByZXR1cm4gc2hsaWJfb3ZlcnJpZGRlbmNhbGwyICgpOwotfQotCi1pbnQKLXNobGliX292ZXJyaWRkZW5jYWxsMiAoKQotewotICByZXR1cm4gNzsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIGEgZnVuY3Rpb24gZGVmaW5lZCBieSB0aGUgbWFpbiBwcm9ncmFtLiAgKi8KLQotI2lmbmRlZiBYQ09GRl9URVNUCi1leHRlcm4gaW50IG1haW5fY2FsbGVkICgpOwotCi1pbnQKLXNobGliX21haW5jYWxsICgpCi17Ci0gIHJldHVybiBtYWluX2NhbGxlZCAoKTsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCBhIGZ1bmN0aW9uIHBvaW50ZXIgdG8gc2hsaWJfbWFpbnZhci4gIEl0Ci0gICBjb25maXJtcyB0aGF0IHRoZSBwb2ludGVyIGNvbXBhcmVzIGVxdWFsbHkuICAqLwotCi1pbnQgCi1zaGxpYl9jaGVja2Z1bnB0cjEgKHApCi0gICAgIGludCAoKnApICgpOwotewotICByZXR1cm4gcCA9PSBzaGxpYl9zaGxpYnZhcjE7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIGEgZnVuY3Rpb24gcG9pbnRlciB0byBtYWluX2NhbGxlZC4gIEl0Ci0gICBjb25maXJtcyB0aGF0IHRoZSBwb2ludGVyIGNvbXBhcmVzIGVxdWFsbHkuICAqLwotCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLWludAotc2hsaWJfY2hlY2tmdW5wdHIyIChwKQotICAgICBpbnQgKCpwKSAoKTsKLXsKLSAgcmV0dXJuIHAgPT0gbWFpbl9jYWxsZWQ7Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBzaGxpYl9tYWludmFyLiAgKi8KLQotaW50Ci0oKnNobGliX2dldGZ1bnB0cjEgKCkpICgpCi17Ci0gIHJldHVybiBzaGxpYl9zaGxpYnZhcjE7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gbWFpbl9jYWxsZWQuICAqLwotCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLWludAotKCpzaGxpYl9nZXRmdW5wdHIyICgpKSAoKQotewotICByZXR1cm4gbWFpbl9jYWxsZWQ7Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoYXQgY29uc3RhbnQgZGF0YSBhbmQgbG9jYWwgZnVuY3Rpb25zCi0gICB3b3JrLiAgKi8KLQotI2lmbmRlZiBfX1NURENfXwotI2RlZmluZSBjb25zdAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgaSA9IDY7Ci1zdGF0aWMgY29uc3QgY2hhciAqc3RyID0gIkhlbGxvLCB3b3JsZFxuIjsKLQotaW50Ci1zaGxpYl9jaGVjayAoKQotewotICBjb25zdCBjaGFyICpzMSwgKnMyOwotCi0gIGlmIChpICE9IDYpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogVG8gaXNvbGF0ZSB0aGUgdGVzdCwgZG9uJ3QgcmVseSBvbiBhbnkgZXh0ZXJuYWwgZnVuY3Rpb25zLCBzdWNoCi0gICAgIGFzIHN0cmNtcC4gICovCi0gIHMxID0gIkhlbGxvLCB3b3JsZFxuIjsKLSAgczIgPSBzdHI7Ci0gIHdoaWxlICgqczEgIT0gJ1wwJykKLSAgICBpZiAoKnMxKysgIT0gKnMyKyspCi0gICAgICByZXR1cm4gMDsKLSAgaWYgKCpzMiAhPSAnXDAnKQotICAgIHJldHVybiAwOwotCi0gIGlmIChzaGxpYl9zaGxpYnZhcjEgKCkgIT0gMykKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2gyLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTNhNGUwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2gyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKiBUaGlzIGlzIHBhcnQgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IGxkIHRlc3QuICBUaGlzIGZpbGUgYmVjb21lcyBwYXJ0Ci0gICBvZiBhIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotLyogVGhpcyB2YXJpYWJsZSBpcyBkZWZpbmVkIGhlcmUsIGFuZCByZWZlcmVuY2VkIGJ5IGFub3RoZXIgZmlsZSBpbgotICAgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLWludCBzaGxpYnZhcjIgPSA0OwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhbm90aGVyIGZpbGUgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotaW50Ci1zaGxpYl9zaGxpYmNhbGxlZCAoKQotewotICByZXR1cm4gNTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2hhcmVkLmRhdCBiL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2hhcmVkLmRhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlZTM3Zi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoYXJlZC5kYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1tYWludmFyID09IDEKLW92ZXJyaWRkZW52YXIgPT0gMgotc2hsaWJ2YXIxID09IDMKLXNobGliX21haW52YXIgKCkgPT0gMQotc2hsaWJfb3ZlcnJpZGRlbnZhciAoKSA9PSAyCi1zaGxpYl9zaGxpYnZhcjEgKCkgPT0gMwotc2hsaWJfc2hsaWJ2YXIyICgpID09IDQKLXNobGliX3NobGliY2FsbCAoKSA9PSA1Ci1zaGxpYl9zaGxpYmNhbGwyICgpID09IDgKLXNobGliX21haW5jYWxsICgpID09IDYKLW1haW5fY2FsbGVkICgpID09IDYKLXNobGliX2NoZWNrZnVucHRyMSAoc2hsaWJfc2hsaWJ2YXIxKSA9PSAxCi1zaGxpYl9jaGVja2Z1bnB0cjIgKG1haW5fY2FsbGVkKSA9PSAxCi1zaGxpYl9nZXRmdW5wdHIxICgpID09IHNobGliX3NobGlidmFyMQotc2hsaWJfZ2V0ZnVucHRyMiAoKSA9PSBtYWluX2NhbGxlZAotc2hsaWJfY2hlY2sgKCkgPT0gMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaGFyZWQuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaGFyZWQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTM5YzNkLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2hhcmVkLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0jIEV4cGVjdCBzY3JpcHQgZm9yIGxkLXNoYXJlZCB0ZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgKGlhbkBjeWdudXMuY29tKQotIwotCi0jIE1ha2Ugc3VyZSB0aGF0IGxkIGNhbiBnZW5lcmF0ZSBFTEYgc2hhcmVkIGxpYnJhcmllcy4KLSMgTm90ZSB0aGF0IGxpbmtpbmcgYWdhaW5zdCBFTEYgc2hhcmVkIGxpYnJhcmllcyBpcyB0ZXN0ZWQgYnkgdGhlCi0jIGJvb3RzdHJhcCB0ZXN0LgotCi0jIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gaWYgbGQgZ2VuZXJhdGVzIG5hdGl2ZSBleGVjdXRhYmxlcy4KLWlmICFbaXNuYXRpdmVdIHRoZW4ge3JldHVybn0KLQotIyBUaGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIG9uIGEgY291cGxlIG9mIEVMRiBwbGF0Zm9ybXMuCi0jIFNxdWFyZSBicmFja2V0IGV4cHJlc3Npb25zIHNlZW0gdG8gY29uZnVzZSBpc3RhcmdldC4KLWlmIHsgIVtpc3RhcmdldCBpMzg2LSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTQ4Ni0qLXN5c3Y0Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk1ODYtKi1zeXN2NCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpMzg2LSotdW5peHdhcmVdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpNDg2LSotdW5peHdhcmVdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpNTg2LSotdW5peHdhcmVdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpMzg2LSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk0ODYtKi1lbGYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTU4Ni0qLWVsZipdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpMzg2LSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTQ4Ni0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk1ODYtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBtNjhrLSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgbWlwcyotKi1pcml4NSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotZWxmXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotc29sYXJpczIqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotc3Vub3M0Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKLSAgICByZXR1cm4KLX0KLQotaWYgeyBbaXN0YXJnZXQgaTM4Ni0qLWxpbnV4YW91dCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGk0ODYtKi1saW51eGFvdXQqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBpNTg2LSotbGludXhhb3V0Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgaTM4Ni0qLWxpbnV4b2xkbGQqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBpNDg2LSotbGludXhvbGRsZCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGk1ODYtKi1saW51eG9sZGxkKl0gXAotICAgICB8fCBbaXN0YXJnZXQgbTY4ay0qLWxpbnV4YW91dCpdIH0gewotICAgIHJldHVybgotfQotCi1zZXQgdG1wZGlyIHRtcGRpcgotc2V0IFNIQ0ZMQUcgIiIKLQotaWYgeyBbaXN0YXJnZXQgcnM2MDAwKi0qLWFpeCpdIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWFpeCpdIH0gewotCi0gICAgIyBBSVggc2hhcmVkIGxpYnJhcmllcyBkbyBub3Qgc2VlbSB0byBzdXBwb3J0IHVzZWZ1bCBmZWF0dXJlcywKLSAgICAjIGxpa2Ugb3ZlcnJpZGluZyB0aGUgc2hhcmVkIGxpYnJhcnkgZnVuY3Rpb24gb3IgbGV0dGluZyB0aGUKLSAgICAjIHNoYXJlZCBsaWJyYXJ5IHJlZmVyIHRvIG9iamVjdHMgZGVmaW5lZCBpbiB0aGUgbWFpbiBwcm9ncmFtLiAgV2UKLSAgICAjIGF2b2lkIHRlc3RpbmcgdGhvc2UgZmVhdHVyZXMuCi0gICAgc2V0IFNIQ0ZMQUcgIi1EWENPRkZfVEVTVCIKLQotICAgICMgVGhlIEFJWCAzLjIuNSBsb2FkZXIgYXBwZWFycyB0byByYW5kb21seSBmYWlsIHdoZW4gbG9hZGluZwotICAgICMgc2hhcmVkIGxpYnJhcmllcyBmcm9tIE5TRiBtb3VudGVkIHBhcnRpdGlvbnMsIHNvIHdlIGF2b2lkIGFueQotICAgICMgcG90ZW50aWFsIHByb2JsZW1zIGJ5IHVzaW5nIGEgbG9jYWwgZGlyZWN0b3J5LgotICAgIGNhdGNoIHtleGVjIC9iaW4vc2ggLWMgImVjaG8gJCQifSBwaWQKLSAgICBzZXQgdG1wZGlyIC91c3IvdG1wL2xkLiRwaWQKLSAgICBjYXRjaCAiZXhlYyBta2RpciAkdG1wZGlyIiBleGVjX3N0YXR1cwotCi0gICAgIyBPbiBBSVgsIHdlIG5lZWQgdG8gZXhwbGljaXRseSBleHBvcnQgdGhlIHN5bWJvbHMgdGhlIHNoYXJlZAotICAgICMgbGlicmFyeSBpcyBnb2luZyB0byBwcm92aWRlLCBhbmQgbmVlZC4KLSAgICBzZXQgZmlsZSBbb3BlbiAkdG1wZGlyL3hjb2ZmLmV4cCB3XQotICAgIHB1dHMgJGZpbGUgc2hsaWJ2YXIxCi0gICAgcHV0cyAkZmlsZSBzaGxpYnZhcjIKLSAgICBwdXRzICRmaWxlIHNobGliX3NobGlidmFyMQotICAgIHB1dHMgJGZpbGUgc2hsaWJfc2hsaWJ2YXIyCi0gICAgcHV0cyAkZmlsZSBzaGxpYl9zaGxpYmNhbGwKLSAgICBwdXRzICRmaWxlIHNobGliX3NobGliY2FsbGVkCi0gICAgcHV0cyAkZmlsZSBzaGxpYl9jaGVja2Z1bnB0cjEKLSAgICBwdXRzICRmaWxlIHNobGliX2dldGZ1bnB0cjEKLSAgICBwdXRzICRmaWxlIHNobGliX2NoZWNrCi0gICAgY2xvc2UgJGZpbGUKLX0KLQotIyBUaGUgdGVzdCBwcm9jZWR1cmUuCi1wcm9jIHNoYXJlZF90ZXN0IHsgcHJvZ25hbWUgdGVzdG5hbWUgbWFpbiBzaDEgc2gyIGRhdCBhcmdzIH0gewotICAgIGdsb2JhbCBsZAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIGV4ZWNfb3V0cHV0Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIGdsb2JhbCB0bXBkaXIKLQotICAgIGlmIFtsbGVuZ3RoICRhcmdzXSB7IHNldCBzaGxkZmxhZ3MgW2xpbmRleCAkYXJncyAwXSB9IGVsc2UgeyBzZXQgc2hsZGZsYWdzICIiIH0KLQotICAgICMgQnVpbGQgdGhlIHNoYXJlZCBsaWJyYXJ5LgotICAgICMgT24gQUlYLCB3ZSBuZWVkIHRvIHVzZSBhbiBleHBvcnQgZmlsZS4KLSAgICBzZXQgc2hhcmVkIC1zaGFyZWQKLSAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0Jc2V0IHNoYXJlZCAiLWJNOlNSRSAtYkU6JHRtcGRpci94Y29mZi5leHAiCi0gICAgfQotICAgIGlmIHshW2xkX3NpbXBsZV9saW5rICRsZCAkdG1wZGlyLyRwcm9nbmFtZS5zbyAiJHNoYXJlZCAkc2hsZGZsYWdzICR0bXBkaXIvJHNoMSAkdG1wZGlyLyRzaDIiXX0gewotICAgICAgICBmYWlsICIkdGVzdG5hbWUiCi0gICAgCXJldHVybgotICAgIH0KLQotICAgICMgTGluayBhZ2FpbnN0IHRoZSBzaGFyZWQgbGlicmFyeS4gIFVzZSAtcnBhdGggc28gdGhhdCB0aGUKLSAgICAjIGR5bmFtaWMgbGlua2VyIGNhbiBsb2NhdGUgdGhlIHNoYXJlZCBsaWJyYXJ5IGF0IHJ1bnRpbWUuCi0gICAgIyBPbiBBSVgsIHdlIG11c3QgaW5jbHVkZSAvbGliIGluIC1ycGF0aCwgYXMgb3RoZXJ3aXNlIHRoZSBsb2FkZXIKLSAgICAjIGNhbiBub3QgZmluZCAtbGMuCi0gICAgc2V0IHJwYXRoICR0bXBkaXIKLSAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0Jc2V0IHJwYXRoIC9saWI6JHRtcGRpcgotICAgIH0KLSAgICBpZiAhW2xkX2xpbmsgJGxkICR0bXBkaXIvJHByb2duYW1lICItcnBhdGggJHJwYXRoICR0bXBkaXIvJG1haW4gJHRtcGRpci8kcHJvZ25hbWUuc28iXSB7Ci0gICAgCWZhaWwgIiR0ZXN0bmFtZSIKLSAgICAJcmV0dXJuCi0gICAgfQotCi0gICAgIyBSdW4gdGhlIHJlc3VsdGluZyBwcm9ncmFtCi0gICAgc2VuZF9sb2cgIiR0bXBkaXIvJHByb2duYW1lID4kdG1wZGlyLyRwcm9nbmFtZS5vdXRcbiIKLSAgICB2ZXJib3NlICIkdG1wZGlyLyRwcm9nbmFtZSA+JHRtcGRpci8kcHJvZ25hbWUub3V0IgotICAgIGNhdGNoICJleGVjICR0bXBkaXIvJHByb2duYW1lID4kdG1wZGlyLyRwcm9nbmFtZS5vdXQiIGV4ZWNfb3V0cHV0Ci0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCWZhaWwgIiR0ZXN0bmFtZSIKLSAgICAJcmV0dXJuCi0gICAgfQotCi0gICAgc2VuZF9sb2cgImRpZmYgJHRtcGRpci8kcHJvZ25hbWUub3V0ICRzcmNkaXIvJHN1YmRpci8kZGF0LmRhdFxuIgotICAgIHZlcmJvc2UgImRpZmYgJHRtcGRpci8kcHJvZ25hbWUub3V0ICRzcmNkaXIvJHN1YmRpci8kZGF0LmRhdCIKLSAgICBjYXRjaCAiZXhlYyBkaWZmICR0bXBkaXIvJHByb2duYW1lLm91dCAkc3JjZGlyLyRzdWJkaXIvJGRhdC5kYXQiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLSAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XX0gdGhlbiB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQlmYWlsICIkdGVzdG5hbWUiCi0gICAgICAgIHJldHVybgotICAgIH0KLQotICAgIHBhc3MgIiR0ZXN0bmFtZSIKLX0KLQotaWYgW2lzdGFyZ2V0IG1pcHMqLSotKl0gewotICAgIHNldCBwaWNmbGFnICIiCi19IGVsc2UgewotICAgICMgVW5mb3J0dW5hdGVseSwgdGhlIGdjYyBhcmd1bWVudCBpcyAtZnBpYyBhbmQgdGhlIGNjIGFyZ3VtZW50IGlzCi0gICAgIyAtS1BJQy4gIFdlIGhhdmUgdG8gdHJ5IGJvdGguCi0gICAgc2V0IHBpY2ZsYWcgIi1mcGljIgotICAgIHNlbmRfbG9nICIkQ0MgJHBpY2ZsYWdcbiIKLSAgICB2ZXJib3NlICIkQ0MgJHBpY2ZsYWciCi0gICAgY2F0Y2ggImV4ZWMgJENDICRwaWNmbGFnIiBleGVjX291dHB1dAotICAgIHNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLSAgICB2ZXJib3NlICItLSIgIiRleGVjX291dHB1dCIKLSAgICBpZiB7IFtzdHJpbmcgbWF0Y2ggIippbGxlZ2FsIG9wdGlvbioiICRleGVjX291dHB1dF0gXAotCSB8fCBbc3RyaW5nIG1hdGNoICIqb3B0aW9uIGlnbm9yZWQqIiAkZXhlY19vdXRwdXRdIFwKLQkgfHwgW3N0cmluZyBtYXRjaCAiKnVucmVjb2duaXplZCBvcHRpb24qIiAkZXhlY19vdXRwdXRdIFwKLQkgfHwgW3N0cmluZyBtYXRjaCAiKnBhc3NlZCB0byBsZCoiICRleGVjX291dHB1dF0gfSB7Ci0JaWYgW2lzdGFyZ2V0ICotKi1zdW5vczQqXSB7Ci0JICAgIHNldCBwaWNmbGFnICItcGljIgotCX0gZWxzZSB7Ci0JICAgIHNldCBwaWNmbGFnICItS1BJQyIKLQl9Ci0gICAgfQotfQotdmVyYm9zZSAiVXNpbmcgJHBpY2ZsYWcgdG8gY29tcGlsZSBQSUMgY29kZSIKLQotIyBDb21waWxlIHRoZSBtYWluIHByb2dyYW0uCi1pZiAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHIiAkc3JjZGlyLyRzdWJkaXIvbWFpbi5jICR0bXBkaXIvbWFpbm5wLm9dIHsKLSAgICB1bnJlc29sdmVkICJzaGFyZWQgKG5vbiBQSUMpIgotICAgIHVucmVzb2x2ZWQgInNoYXJlZCIKLX0gZWxzZSB7Ci0gICAgIyBUaGUgc2hhcmVkIGxpYnJhcnkgaXMgY29tcG9zZWQgb2YgdHdvIGZpbGVzLiAgRmlyc3QgY29tcGlsZSB0aGVtCi0gICAgIyB3aXRob3V0IHVzaW5nIC1mcGljLiAgVGhhdCBzaG91bGQgd29yayBvbiBhbiBFTEYgc3lzdGVtLAotICAgICMgYWx0aG91Z2ggaXQgd2lsbCBiZSBsZXNzIGVmZmljaWVudCBiZWNhdXNlIHRoZSBkeW5hbWljIGxpbmtlcgotICAgICMgd2lsbCBuZWVkIHRvIGRvIG1vcmUgcmVsb2NhdGlvbiB3b3JrLiAgSG93ZXZlciwgbm90ZSB0aGF0IG5vdAotICAgICMgdXNpbmcgLWZwaWMgd2lsbCBjYXVzZSBzb21lIG9mIHRoZSB0ZXN0cyB0byByZXR1cm4gZGlmZmVyZW50Ci0gICAgIyByZXN1bHRzLgotICAgIGlmIHsgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAkU0hDRkxBRyIgJHNyY2Rpci8kc3ViZGlyL3NoMS5jICR0bXBkaXIvc2gxbnAub10KLQkgfHwgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAkU0hDRkxBRyIgJHNyY2Rpci8kc3ViZGlyL3NoMi5jICR0bXBkaXIvc2gybnAub10gfSB7Ci0JdW5yZXNvbHZlZCAic2hhcmVkIChub24gUElDKSIKLSAgICB9IGVsc2UgeyBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0Jc2hhcmVkX3Rlc3Qgc2hucCAic2hhcmVkIChub25QSUMpIiBtYWlubnAubyBzaDFucC5vIHNoMm5wLm8geGNvZmYKLSAgICB9IGVsc2UgewotCSMgU3VuT1Mgbm9uIFBJQyBzaGFyZWQgbGlicmFyaWVzIGRvbid0IHBlcm1pdCBzb21lIGNhc2VzIG9mCi0JIyBvdmVycmlkaW5nLgotCXNldHVwX3hmYWlsICIqLSotc3Vub3M0KiIKLQlzaGFyZWRfdGVzdCBzaG5wICJzaGFyZWQgKG5vbiBQSUMpIiBtYWlubnAubyBzaDFucC5vIHNoMm5wLm8gc2hhcmVkCi0KLQkjIFRlc3QgRUxGIHNoYXJlZCBsaWJyYXJ5IHJlbG9jYXRpb25zIHdpdGggYSBub24temVybyBsb2FkCi0JIyBhZGRyZXNzIGZvciB0aGUgbGlicmFyeS4gIE5lYXIgYXMgSSBjYW4gdGVsbCwgdGhlIFJfKl9SRUxBVElWRQotCSMgcmVsb2NhdGlvbnMgZm9yIHZhcmlvdXMgdGFyZ2V0cyBhcmUgYnJva2VuIGluIHRoZSBjYXNlIHdoZXJlCi0JIyB0aGUgbG9hZCBhZGRyZXNzIGlzIG5vdCB6ZXJvICh3aGljaCBpcyB0aGUgZGVmYXVsdCkuCi0Jc2V0dXBfeGZhaWwgIiotKi1zdW5vczQqIgotCXNoYXJlZF90ZXN0IHNobnAgInNoYXJlZCAobm9uIFBJQywgbG9hZCBvZmZzZXQpIiBcCi0JCW1haW5ucC5vIHNoMW5wLm8gc2gybnAubyBzaGFyZWQgXAotCQkiLVQgJHNyY2Rpci8kc3ViZGlyL2VsZi1vZmZzZXQubGQiCi0gICAgfSB9Ci0KLSAgICAjIE5vdyBjb21waWxlIHRoZSBjb2RlIHVzaW5nIC1mcGljLgotCi0gICAgaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHICRwaWNmbGFnIiAkc3JjZGlyLyRzdWJkaXIvc2gxLmMgJHRtcGRpci9zaDFwLm9dIAotCSB8fCAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHICRwaWNmbGFnIiAkc3JjZGlyLyRzdWJkaXIvc2gyLmMgJHRtcGRpci9zaDJwLm9dIH0gewotCXVucmVzb2x2ZWQgInNoYXJlZCIKLSAgICB9IGVsc2UgewotCSMgU3VuT1MgY2FuIG5vdCBjb21wYXJlIGZ1bmN0aW9uIHBvaW50ZXJzIGNvcnJlY3RseQotCWlmIFtpc3RhcmdldCAiKi0qLXN1bm9zNCoiXSB7Ci0JICAgIHNoYXJlZF90ZXN0IHNocCAic2hhcmVkIiBtYWlubnAubyBzaDFwLm8gc2gycC5vIHN1bjQKLQl9IGVsc2UgeyBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0JICAgIHNoYXJlZF90ZXN0IHNocCAic2hhcmVkIiBtYWlubnAubyBzaDFwLm8gc2gycC5vIHhjb2ZmCi0JfSBlbHNlIHsKLQkgICAgc2hhcmVkX3Rlc3Qgc2hwICJzaGFyZWQiIG1haW5ucC5vIHNoMXAubyBzaDJwLm8gc2hhcmVkCi0JfSB9Ci0gICAgfQotfQotCi0jIE5vdyBkbyB0aGUgc2FtZSB0ZXN0cyBhZ2FpbiwgYnV0IHRoaXMgdGltZSBjb21waWxlIG1haW4uYyBQSUMuCi1pZiAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHICRwaWNmbGFnIiAkc3JjZGlyLyRzdWJkaXIvbWFpbi5jICR0bXBkaXIvbWFpbnAub10gewotICAgIHVucmVzb2x2ZWQgInNoYXJlZCAoUElDIG1haW4sIG5vbiBQSUMgc28pIgotICAgIHVucmVzb2x2ZWQgInNoYXJlZCAoUElDIG1haW4pIgotfSBlbHNlIHsKLSAgICBpZiB7IFtmaWxlIGV4aXN0cyAkdG1wZGlyL3NoMW5wLm8gXSAmJiBbIGZpbGUgZXhpc3RzICR0bXBkaXIvc2gybnAubyBdIH0gewotICAgICAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0JICAgIHNoYXJlZF90ZXN0IHNobXBucCAic2hhcmVkIChQSUMgbWFpbiwgbm9uIFBJQyBzbykiIG1haW5wLm8gc2gxbnAubyBzaDJucC5vIHhjb2ZmCi0JfSBlbHNlIHsKLQkgICAgIyBTdW5PUyBub24gUElDIHNoYXJlZCBsaWJyYXJpZXMgZG9uJ3QgcGVybWl0IHNvbWUgY2FzZXMgb2YKLQkgICAgIyBvdmVycmlkaW5nLgotCSAgICBzZXR1cF94ZmFpbCAiKi0qLXN1bm9zNCoiCi0JICAgIHNoYXJlZF90ZXN0IHNobXBucCAic2hhcmVkIChQSUMgbWFpbiwgbm9uIFBJQyBzbykiIG1haW5wLm8gc2gxbnAubyBzaDJucC5vIHNoYXJlZAotCX0KLSAgICB9IGVsc2UgewotCXVucmVzb2x2ZWQgInNoYXJlZCAoUElDIG1haW4sIG5vbiBQSUMgc28pIgotICAgIH0KLQotICAgIGlmIHsgW2ZpbGUgZXhpc3RzICR0bXBkaXIvc2gxcC5vIF0gJiYgWyBmaWxlIGV4aXN0cyAkdG1wZGlyL3NoMnAubyBdIH0gewotICAgICAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0JICAgIHNoYXJlZF90ZXN0IHNobXBwICJzaGFyZWQgKFBJQyBtYWluKSIgbWFpbnAubyBzaDFwLm8gc2gycC5vIHhjb2ZmCi0JfSBlbHNlIHsKLQkgICAgc2hhcmVkX3Rlc3Qgc2htcHAgInNoYXJlZCAoUElDIG1haW4pIiBtYWlucC5vIHNoMXAubyBzaDJwLm8gc2hhcmVkCi0JfQotICAgIH0gZWxzZSB7Ci0JdW5yZXNvbHZlZCAic2hhcmVkIChQSUMgbWFpbikiCi0gICAgfQotfQotCi1pZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0gICAgIyBSZW1vdmUgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkuCi0gICAgY2F0Y2ggImV4ZWMgcm0gLXJmICR0bXBkaXIiIGV4ZWNfc3RhdHVzCi19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3N1bjQuZGF0IGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zdW40LmRhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUwZDg3ZC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3N1bjQuZGF0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotbWFpbnZhciA9PSAxCi1vdmVycmlkZGVudmFyID09IDIKLXNobGlidmFyMSA9PSAzCi1zaGxpYl9tYWludmFyICgpID09IDEKLXNobGliX292ZXJyaWRkZW52YXIgKCkgPT0gMgotc2hsaWJfc2hsaWJ2YXIxICgpID09IDMKLXNobGliX3NobGlidmFyMiAoKSA9PSA0Ci1zaGxpYl9zaGxpYmNhbGwgKCkgPT0gNQotc2hsaWJfc2hsaWJjYWxsMiAoKSA9PSA4Ci1zaGxpYl9tYWluY2FsbCAoKSA9PSA2Ci1tYWluX2NhbGxlZCAoKSA9PSA2Ci1zaGxpYl9jaGVja2Z1bnB0cjEgKHNobGliX3NobGlidmFyMSkgPT0gMAotc2hsaWJfY2hlY2tmdW5wdHIyIChtYWluX2NhbGxlZCkgPT0gMQotc2hsaWJfZ2V0ZnVucHRyMSAoKSAhPSBzaGxpYl9zaGxpYnZhcjEKLXNobGliX2dldGZ1bnB0cjIgKCkgPT0gbWFpbl9jYWxsZWQKLXNobGliX2NoZWNrICgpID09IDEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQveGNvZmYuZGF0IGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC94Y29mZi5kYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MDlkOTYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC94Y29mZi5kYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1tYWludmFyID09IDEKLW92ZXJyaWRkZW52YXIgPT0gMgotc2hsaWJ2YXIxID09IDMKLXNobGliX3NobGlidmFyMSAoKSA9PSAzCi1zaGxpYl9zaGxpYnZhcjIgKCkgPT0gNAotc2hsaWJfc2hsaWJjYWxsICgpID09IDUKLW1haW5fY2FsbGVkICgpID09IDYKLXNobGliX2NoZWNrZnVucHRyMSAoc2hsaWJfc2hsaWJ2YXIxKSA9PSAxCi1zaGxpYl9nZXRmdW5wdHIxICgpID09IHNobGliX3NobGlidmFyMQotc2hsaWJfY2hlY2sgKCkgPT0gMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3IxLmMgYi9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkZTk3Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjEuYworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBjb21waWxlZCBhbmQgbGlua2VkIGludG8gdGhlIFMtcmVjb3JkIGZvcm1hdC4gICovCi0KLWV4dGVybiBpbnQgZTE7Ci1leHRlcm4gaW50IGUyOwotaW50IGk7Ci1pbnQgaiA9IDE7Ci1zdGF0aWMgaW50IGs7Ci1zdGF0aWMgaW50IGwgPSAxOwotc3RhdGljIGNoYXIgYWJbXSA9ICJUaGlzIGlzIGEgc3RyaW5nIGNvbnN0YW50IjsKLQotZXh0ZXJuIGludCBmbjEgKCk7Ci1leHRlcm4gaW50IGZuMiAoKTsKLQotaW50Ci1tYWluICgpCi17Ci0gIGZuMSAoYWIpOwotICBmbjIgKCJzdGF0aWMgc3RyaW5nIGNvbnN0YW50Iik7Ci0gIHJldHVybiBlMSArIGUyICsgaSArIGogKyBrICsgbDsKLX0KLQotdm9pZAotX19tYWluICgpCi17Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM2Y2ZhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW50byB0aGUgUy1yZWNvcmQgZm9ybWF0LiAgKi8KLQotaW50IGUxOwotaW50IGUyID0gMTsKLQotaW50Ci1mbjEgKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIHJldHVybiBzW2UxXTsKLX0KLQotaW50Ci1mbjIgKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIHJldHVybiBzW2UyXTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMy5jYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcxN2MyNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLy8gVGhpcyBmaWxlIGlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW50byB0aGUgUy1yZWNvcmQgZm9ybWF0LgotCi0jZGVmaW5lIEZPT19NU0dfTEVOIDgwCi0KLWNsYXNzIEZvbyB7Ci0gICAgc3RhdGljIGludCBmb29zOwotICAgIGludCBpOwotICAgIHN0YXRpYyBjb25zdCBpbnQgbGVuID0gRk9PX01TR19MRU47Ci0gICAgY2hhciBtZXNzYWdlW2xlbl07Ci1wdWJsaWM6Ci0gICAgc3RhdGljIHZvaWQgaW5pdF9mb28gKCk7Ci0gICAgc3RhdGljIGludCBuYl9mb29zKCkgeyByZXR1cm4gZm9vczsgfQotICAgIEZvbygpOwotICAgIEZvbyggY2hhciogbWVzc2FnZSk7Ci0gICAgRm9vKGNvbnN0IEZvbyYpOwotICAgIEZvbyAmIG9wZXJhdG9yPSAoY29uc3QgRm9vJik7Ci0gICAgfkZvbyAoKTsKLX07Ci0KLXN0YXRpYyBGb28gc3RhdGljX2ZvbyggInN0YXRpY19mb28iKTsKLQotaW50Ci1tYWluICgpCi17Ci0gIEZvbyBhdXRvbWF0aWNfZm9vKCAiYXV0b21hdGljX2ZvbyIpOwotICByZXR1cm4gMDsKLX0KLQotdm9pZAotdGVybWluYXRlKHZvaWQpCi17Ci0gIC8qIFRoaXMgcmVjdXJzaXZlIGNhbGwgcHJldmVudHMgYSBjb21waWxlciB3YXJuaW5nIHRoYXQgdGhlIG5vcmV0dXJuCi0gICAgIGZ1bmN0aW9uIHRlcm1pbmF0ZSBhY3R1YWxseSBkb2VzIHJldHVybi4gICovCi0gIHRlcm1pbmF0ZSAoKTsKLX0KLQotZXh0ZXJuICJDIiB7Ci12b2lkCi1fX21haW4gKCkKLXsKLX0KLQotdm9pZAotX19idWlsdGluX2RlbGV0ZSAoKQotewotfQotCi12b2lkCi1fX2J1aWx0aW5fbmV3ICgpCi17Ci19Ci0KLXZvaWQKLV9fdGhyb3cgKCkKLXsKLX0KLQotdm9pZAotX190ZXJtaW5hdGUgKCkKLXsKLX0KLQotdm9pZCAqX19laF9wYzsKLQotdm9pZCAqKioKLV9fZ2V0X2R5bmFtaWNfaGFuZGxlcl9jaGFpbiAoKQotewotICByZXR1cm4gMDsKLX0KLQotdm9pZCAqCi1fX2dldF9laF9jb250ZXh0ICgpCi17Ci0gIHJldHVybiAwOwotfQotCi19Ci0KLWludCBGb286OmZvb3MgPSAwOwotCi12b2lkIEZvbzo6aW5pdF9mb28gKCkKLXsKLSAgZm9vcyA9IDgwOwotfQotCi1Gb286OkZvbyAoKQotewotICBpID0gKytmb29zOwotfQotCi1Gb286OkZvbyAoY2hhciogbXNnKQotewotICBpID0gKytmb29zOwotfQotCi1Gb286OkZvbyAoY29uc3QgRm9vJiBmb28pCi17Ci0gIGkgPSArK2Zvb3M7Ci0gIGZvciAoaW50IGsgPSAwOyBrIDwgRk9PX01TR19MRU47IGsrKykKLSAgICBtZXNzYWdlW2tdID0gZm9vLm1lc3NhZ2Vba107Ci19Ci0KLUZvbyYgRm9vOjpvcGVyYXRvcj0gKGNvbnN0IEZvbyYgZm9vKQotewotICBmb3IgKGludCBrID0gMDsgayA8IEZPT19NU0dfTEVOOyBrKyspCi0gICAgbWVzc2FnZVtrXSA9IGZvby5tZXNzYWdlW2tdOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLUZvbzo6fkZvbyAoKQotewotICBmb29zLS07Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcmVjLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyZWMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTUxZDM2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyZWMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLSMgVGVzdCBsaW5raW5nIGRpcmVjdGx5IHRvIFMtcmVjb3Jkcy4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0jIFB1YmxpYyBkb21haW4uCi0KLSMgR2V0IHRoZSBvZmZzZXQgZnJvbSBhbiBTLXJlY29yZCBsaW5lIHRvIHRoZSBzdGFydCBvZiB0aGUgZGF0YS4KLQotcHJvYyBzcmVjX29mZiB7IGwgfSB7Ci0gICAgaWYgW3N0cmluZyBtYXRjaCAiUzEqIiAkbF0gewotCXJldHVybiA4Ci0gICAgfSBlbHNlIHsgaWYgW3N0cmluZyBtYXRjaCAiUzIqIiAkbF0gewotCXJldHVybiAxMAotICAgIH0gZWxzZSB7IGlmIFtzdHJpbmcgbWF0Y2ggIlMzKiIgJGxdIHsKLQlyZXR1cm4gMTIKLSAgICB9IGVsc2UgewotCXJldHVybiAtMQotICAgIH0gfSB9Ci19Ci0KLSMgU2VlIGlmIGFuIFMtcmVjb3JkIGxpbmUgY29udGFpbnMgb25seSB6ZXJvIGRhdGEuCi0KLXByb2Mgc3JlY196ZXJvIHsgbCB9IHsKLSAgICBpZiBbc3RyaW5nIG1hdGNoICJTXFswNzg5XF0qIiAkbF0gewotCXJldHVybiAxCi0gICAgfQotCi0gICAgIyBTdHJpcCB0aGUgYWRkcmVzcyBhbmQgY2hlY2tzdW0uCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiU1xbMTIzXF0qIiAkbF0gewotCXNldCBsIFtzdHJpbmcgcmFuZ2UgJGwgW3NyZWNfb2ZmICRsXSBbZXhwciBbc3RyaW5nIGxlbmd0aCAkbF0gLSAzXV0KLSAgICB9IGVsc2UgewotCXJldHVybiAwCi0gICAgfQotCi0gICAgIyBUaGUgcmVzdCBtdXN0IGJlIHplcm8uCi0gICAgcmV0dXJuIFtzdHJpbmcgbWF0Y2ggIiIgW3N0cmluZyB0cmltICRsICIwIl1dCi19Ci0KLSMgR2V0IHRoZSBhZGRyZXNzIG9mIGFuIFMtcmVjb3JkIGxpbmUuCi0KLXByb2Mgc3JlY19hZGRyIHsgbCB9IHsKLSAgICBpZiBbc3RyaW5nIG1hdGNoICJTXFsxMjNcXSoiICRsXSB7Ci0Jc2V0IGFkZHIgW3N0cmluZyByYW5nZSAkbCA0IFtleHByIFtzcmVjX29mZiAkbF0gLSAxXV0KLSAgICB9IGVsc2UgewotCXJldHVybiAtMQotICAgIH0KLQotICAgIHJldHVybiAiMHgkYWRkciIKLX0KLQotIyBHZXQgdGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIGluIGFuIFMtcmVjb3JkIGxpbmUuCi0KLXByb2Mgc3JlY19sZW4geyBsIH0gewotICAgIGlmICFbc3RyaW5nIG1hdGNoICJTXFsxMjNcXSoiICRsXSB7Ci0JcmV0dXJuIDAKLSAgICB9Ci0KLSAgICByZXR1cm4gW2V4cHIgIjB4W3N0cmluZyByYW5nZSAkbCAyIDNdIiAtIChbc3JlY19vZmYgJGxdIC0gNCkgLyAyIC0gMV0KLX0KLQotIyBFeHRyYWN0IGJ5dGVzIGZyb20gYW4gUy1yZWNvcmQgbGluZS4KLQotcHJvYyBzcmVjX2V4dHJhY3QgeyBsIHN0YXJ0IGxlbiB9IHsKLSAgICBzZXQgb2ZmIFtzcmVjX29mZiAkbF0KLSAgICBzZXQgcmxlbiBbc3JlY19sZW4gJGxdCi0gICAgc2V0IHN0b3AgW2V4cHIgJHN0YXJ0ICsgJGxlbl0KLSAgICBpZiB7ICRzdG9wID4gJHJsZW4gfSB7Ci0Jc2V0IHN0b3AgW2V4cHIgJHJsZW5dCi0gICAgfQotICAgIHNldCBzdGFydCBbZXhwciAkc3RhcnQgKiAyICsgJG9mZl0KLSAgICBzZXQgc3RvcCBbZXhwciAkc3RvcCAqIDIgKyAkb2ZmIC0gMV0KLSAgICByZXR1cm4gW3N0cmluZyByYW5nZSAkbCAkc3RhcnQgJHN0b3BdCi19Ci0KLSMgU2VlIGlmIGEgcmFuZ2Ugb2YgYnl0ZXMgaW4gYW4gUy1yZWNvcmQgbGluZSBpcyBhbGwgemVyb2VzLgotCi1wcm9jIHNyZWNfemVyb19yYW5nZSB7IGwgc3RhcnQgbGVuIH0gewotICAgIHJldHVybiBbc3RyaW5nIG1hdGNoICIiIFtzdHJpbmcgdHJpbSBbc3JlY19leHRyYWN0ICRsICRzdGFydCAkbGVuXSAiMCJdXQotfQotCi0jIFRyaW0gYW4gUy1yZWNvcmQgbGluZSBzdWNoIHRoYXQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgcmVtYWluCi0jIGF0IHRoZSBlbmQuCi0KLXByb2Mgc3JlY190cmltIHsgbCBsZWF2ZSB9IHsKLSAgICBzZXQgb2ZmIFtzcmVjX29mZiAkbF0KLSAgICBzZXQgYWRkciBbc3JlY19hZGRyICRsXQotICAgIHNldCBsZW4gW3NyZWNfbGVuICRsXQotCi0gICAgaWYgeyAkbGVhdmUgPj0gJGxlbiB9IHsKLQlyZXR1cm4gJGwKLSAgICB9Ci0KLSAgICBzZXQgczEgW3N0cmluZyByYW5nZSAkbCAwIDFdCi0gICAgc2V0IHMyIFtmb3JtYXQgIiUwMngiIFtleHByICgkb2ZmIC0gNCkgLyAyICsgJGxlYXZlICsgMV1dCi0gICAgc2V0IHMzIFtmb3JtYXQgIiUwW2V4cHIgJG9mZiAtIDRdeCIgW2V4cHIgJGFkZHIgKyAkbGVuIC0gJGxlYXZlXV0KLSAgICBzZXQgczQgW3N0cmluZyByYW5nZSAkbCBbZXhwciBbc3RyaW5nIGxlbmd0aCAkbF0gLSAoJGxlYXZlICogMikgLSAyXSBlbmRdCi0gICAgc2V0IHMgIiR7czF9JHtzMn0ke3MzfSR7czR9IgotCi0gICAgdmVyYm9zZSAic3JlY190cmltIHsgJyRsJyAkbGVhdmUgfSByZXR1cm5pbmcgJyRzJyIgMgotCi0gICAgcmV0dXJuICRzCi19Ci0KLSMgUmVwb3J0IGZhaWx1cmUgd2hlbiBjb21wYXJpbmcgUy1yZWNvcmQgbGluZXMKLQotcHJvYyBzcmVjX2NvbXBhcmVfZmFpbCB7IHdoaWNoIGwxIGwyIH0gewotICAgIHNlbmRfbG9nICJjb21wYXJpc29uIGZhaWx1cmUgJHdoaWNoOlxuJGwxXG4kbDJcbiIKLSAgICB2ZXJib3NlICJjb21wYXJpc29uIGZhaWx1cmUgJHdoaWNoOlxuJGwxXG4kbDIiCi19Ci0KLSMgQ29tcGFyZSBTLXJlY29yZCBmaWxlcy4gIFdlIGRvbid0IHdhbnQgdG8gZnVzcyBhYm91dCB0aGluZ3MgbGlrZQotIyBleHRyYSB6ZXJvZXMuICBOb3RlIHRoYXQgQkZEIGFsd2F5cyBzb3J0cyBTLXJlY29yZHMgYnkgYWRkcmVzcy4KLQotcHJvYyBzcmVjX2NvbXBhcmUgeyBmMSBmMiB9IHsKLSAgICBzZXQgZTEgW2dldHMgJGYxIGwxXQotICAgIHNldCBlMiBbZ2V0cyAkZjIgbDJdCi0KLSAgICB3aGlsZSB7ICRlMSAhPSAtMSB9IHsKLQlzZXQgbDEgW3N0cmluZyB0cmltcmlnaHQgJGwxICJcclxuIl0KLQlzZXQgbDIgW3N0cmluZyB0cmltcmlnaHQgJGwyICJcclxuIl0KLQlpZiB7ICRlMiA9PSAtMSB9IHsKLQkgICAgIyBJZiBsMSBjb250YWlucyBkYXRhLCBpdCBtdXN0IGJlIHplcm8uCi0JICAgIGlmICFbc3JlY196ZXJvICRsMV0gewotCQlzZW5kX2xvZyAiZGF0YSBhZnRlciBFT0Y6ICRsMVxuIgotCQl2ZXJib3NlICJkYXRhIGFmdGVyIEVPRjogJGwxIgotCQlyZXR1cm4gMAotCSAgICB9Ci0JfSBlbHNlIHsgaWYgeyBbc3RyaW5nIGNvbXBhcmUgJGwxICRsMl0gPT0gMCB9IHsKLQkgICAgc2V0IGUxIFtnZXRzICRmMSBsMV0KLQkgICAgc2V0IGUyIFtnZXRzICRmMiBsMl0KLQl9IGVsc2UgeyBpZiB7IFtzcmVjX3plcm8gJGwxXSB9IHsKLQkgICAgc2V0IGUxIFtnZXRzICRmMSBsMV0KLQl9IGVsc2UgeyBpZiB7IFtzcmVjX3plcm8gJGwyXSB9IHsKLQkgICAgc2V0IGUyIFtnZXRzICRmMiBsMl0KLQl9IGVsc2UgewotCSAgICAjIFRoZSBzdHJpbmdzIGFyZSBub3QgdGhlIHNhbWUsIGFuZCBuZWl0aGVyIGlzIGFsbCB6ZXJvZXMuCi0JICAgIHNldCBhMSBbc3JlY19hZGRyICRsMV0KLQkgICAgc2V0IG4xIFtzcmVjX2xlbiAkbDFdCi0JICAgIHNldCBhMiBbc3JlY19hZGRyICRsMl0KLQkgICAgc2V0IG4yIFtzcmVjX2xlbiAkbDJdCi0KLQkgICAgaWYgeyAkYTEgPCAkYTIgJiYgIVtzcmVjX3plcm9fcmFuZ2UgJGwxIDAgW2V4cHIgJGEyIC0gJGExXV0gfSB7Ci0JCXZlcmJvc2UgIiRhMSAkYTIgW3NyZWNfZXh0cmFjdCAkbDEgMCBbZXhwciAkYTIgLSAkYTFdXSIgMgotCQlzcmVjX2NvbXBhcmVfZmFpbCAxICRsMSAkbDIKLQkJcmV0dXJuIDAKLQkgICAgfQotCSAgICBpZiB7ICRhMiA8ICRhMSAmJiAhW3NyZWNfemVyb19yYW5nZSAkbDIgMCBbZXhwciAkYTEgLSAkYTJdXSB9IHsKLQkJc3JlY19jb21wYXJlX2ZhaWwgMiAkbDEgJGwyCi0JCXJldHVybiAwCi0JICAgIH0KLQotCSAgICAjIEhlcmUgd2Uga25vdyB0aGF0IGFueSBpbml0aWFsIGRhdGEgaW4gYm90aCBsaW5lcyBpcwotCSAgICAjIHplcm8uICBOb3cgbWFrZSBzdXJlIHRoYXQgYW55IG92ZXJsYXBwaW5nIGRhdGEgbWF0Y2hlcy4KLQkgICAgaWYgeyAkYTEgPCAkYTIgfSB7Ci0JCXNldCBvczEgW2V4cHIgJGEyIC0gJGExXQotCQlzZXQgb3MyIDAKLQkgICAgfSBlbHNlIHsKLQkJc2V0IG9zMSAwCi0JCXNldCBvczIgW2V4cHIgJGExIC0gJGEyXQotCSAgICB9Ci0JICAgIGlmIHsgJGExICsgJG4xIDwgJGEyICsgJG4yIH0gewotCQlzZXQgb2wgW2V4cHIgJG4xIC0gJG9zMV0KLQkgICAgfSBlbHNlIHsKLQkJc2V0IG9sIFtleHByICRuMiAtICRvczJdCi0JICAgIH0KLQotCSAgICBzZXQgeDEgW3NyZWNfZXh0cmFjdCAkbDEgJG9zMSAkb2xdCi0JICAgIHNldCB4MiBbc3JlY19leHRyYWN0ICRsMiAkb3MyICRvbF0KLQkgICAgaWYgeyBbc3RyaW5nIGNvbXBhcmUgJHgxICR4Ml0gIT0gMCB9IHsKLQkJdmVyYm9zZSAiJG9zMSAkb2wgJHgxIiAyCi0JCXZlcmJvc2UgIiRvczIgJG9sICR4MiIgMgotCQlzcmVjX2NvbXBhcmVfZmFpbCAzICRsMSAkbDIKLQkJcmV0dXJuIDAKLQkgICAgfQotCi0JICAgICMgVGhlc2Ugc3RyaW5ncyBtYXRjaC4gIFRyaW0gdGhlIGRhdGEgZnJvbSB0aGUgbGFyZ2VyCi0JICAgICMgc3RyaW5nLCByZWFkIGEgbmV3IGNvcHkgb2YgdGhlIHNtYWxsZXIgc3RyaW5nLCBhbmQKLQkgICAgIyBjb250aW51ZS4KLQkgICAgaWYgeyAkYTEgKyAkbjEgPCAkYTIgKyAkbjIgfSB7Ci0JCXNldCBsMiBbc3JlY190cmltICRsMiBbZXhwciAoJGEyICsgJG4yKSAtICgkYTEgKyAkbjEpXV0KLQkJc2V0IGUxIFtnZXRzICRmMSBsMV0KLQkgICAgfSBlbHNlIHsgaWYgeyAkYTEgKyAkbjEgPiAkYTIgKyAkbjIgfSB7Ci0JCXNldCBsMSBbc3JlY190cmltICRsMSBbZXhwciAoJGExICsgJG4xKSAtICgkYTIgKyAkbjIpXV0KLQkJc2V0IGUyIFtnZXRzICRmMiBsMl0KLQkgICAgfSBlbHNlIHsKLQkJc2V0IGUxIFtnZXRzICRmMSBsMV0KLQkJc2V0IGUyIFtnZXRzICRmMiBsMl0KLQkgICAgfSB9Ci0JfSB9IH0gfQotICAgIH0KLQotICAgICMgV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBmaWxlLiAgVGhlIHJlbWFpbmRlciBvZiB0aGUKLSAgICAjIHNlY29uZCBmaWxlIG11c3QgY29udGFpbiBvbmx5IHplcm9lcy4KLSAgICB3aGlsZSB7ICRlMiAhPSAtMSB9IHsKLQlzZXQgbDIgW3N0cmluZyB0cmltcmlnaHQgJGwyICJcclxuIl0KLQlpZiAhW3NyZWNfemVybyAkbDJdIHsKLQkgICAgc2VuZF9sb2cgImRhdGEgYWZ0ZXIgRU9GOiAkbDJcbiIKLQkgICAgdmVyYm9zZSAiZGF0YSBhZnRlciBFT0Y6ICRsMiIKLQkgICAgcmV0dXJuIDAKLQl9Ci0Jc2V0IGUyIFtnZXRzICRmMiBsMl0KLSAgICB9Ci0KLSAgICByZXR1cm4gMQotfQotCi0jIExpbmsgdHdpY2UsIG9iamNvcHksIGFuZCBjb21wYXJlCi0KLXByb2MgcnVuX3NyZWNfdGVzdCB7IHRlc3Qgb2JqcyB9IHsKLSAgICBnbG9iYWwgbGQKLSAgICBnbG9iYWwgb2JqY29weQotICAgIGdsb2JhbCBzaXplb2ZfaGVhZGVycwotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIHNldCBmbGFncyAiIgotCi0gICAgIyBJZiB0aGUgbGlua2VyIHNjcmlwdCB1c2VzIFNJWkVPRl9IRUFERVJTLCB1c2UgYSAtVHRleHQgYXJndW1lbnQKLSAgICAjIHRvIGZvcmNlIGJvdGggdGhlIG5vcm1hbCBsaW5rIGFuZCB0aGUgUy1yZWNvcmQgbGluayB0byBiZSBwdXQgaW4KLSAgICAjIHRoZSBzYW1lIHBsYWNlLiAgV2UgZG9uJ3QgYWx3YXlzIHVzZSAtVHRleHQgYmVjYXVzZSBpdCBpbnRlcmFjdHMKLSAgICAjIHBvb3JseSB3aXRoIGEub3V0LgotCi0gICAgaWYgeyAkc2l6ZW9mX2hlYWRlcnMgfSB7Ci0Jc2V0IGZsYWdzICIkZmxhZ3MgLVR0ZXh0IDB4MTAwMCIKLSAgICB9Ci0KLSAgICAjIFRoZSBhMjlrIGNvbXBpbGVkIGNvZGUgY2FsbHMgVl9TUElMTCBhbmQgVl9GSUxMLiAgU2luY2Ugd2UgZG9uJ3QKLSAgICAjIG5lZWQgdG8gcnVuIHRoaXMgY29kZSwgYnV0IHdlIGRvbid0IGhhdmUgZGVmaW5pdGlvbnMgZm9yIHRob3NlCi0gICAgIyBmdW5jdGlvbnMsIHdlIGp1c3QgZGVmaW5lIHRoZW0gb3V0LgotICAgIGlmIFtpc3RhcmdldCBhMjlrKi0qLSpdIHsKLQlzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSBWX1NQSUxMPTAgLS1kZWZzeW0gVl9GSUxMPTAiCi0gICAgfQotCi0gICAgIyBBUk0gdGFyZ2V0cyBjYWxsIF9fZ2NjbWFpbgotICAgIGlmIFtpc3RhcmdldCBhcm0tKi0qXSB7Ci0Jc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gX19fZ2NjbWFpbj0wIgotICAgIH0KLSAgICAKLSAgICBpZiBbaXN0YXJnZXQgc3Ryb25nYXJtLSotKl0gewotCXNldCBmbGFncyAiJGZsYWdzIC0tZGVmc3ltIF9fZ2NjbWFpbj0wIgotICAgIH0KLSAgICAKLSAgICAjIFRodW1iIHRhcmdldHMgY2FsbCBfX2djY21haW4KLSAgICBpZiBbaXN0YXJnZXQgdGh1bWItKi0qXSB7Ci0Jc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gX19fZ2NjbWFpbj0wIgotICAgIH0KLQotICAgICMgUG93ZXJQQyBFQUJJIGNvZGUgY2FsbHMgX19lYWJpLgotICAgIGlmIFtpc3RhcmdldCBwb3dlcnBjKi0qLWVhYmkqXSB7Ci0Jc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gX19lYWJpPTAiCi0gICAgfQotCi0gICAgIyBtbjEwMjAwIGNvZGUgY2FsbHMgX190cnVuY3NpcHNpMl9kMF9kMi4KLSAgICBpZiB7W2lzdGFyZ2V0IG1uMTAyMDAqLSotKl19IHRoZW4gewotCXNldCBmbGFncyAiJGZsYWdzIC0tZGVmc3ltIF9fdHJ1bmNzaXBzaTJfZDBfZDI9MCIKLSAgICB9Ci0KLSAgICAjIFY4NTAgdGFyZ2V0cyBuZWVkIGxpYmdjYy5hCi0gICAgaWYgW2lzdGFyZ2V0IHY4NTAqLSotZWxmXSB7Ci0Jc2V0IG9ianMgIiRvYmpzIC1MIC4uL2djYyAtbGdjYyIKLSAgICB9Ci0gICAgCi0gICAgaWYgeyAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc3IxICIkZmxhZ3MgJG9ianMiXSBcCi0JIHx8ICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zcjIuc3IgIiRmbGFncyAtb2Zvcm1hdCBzcmVjICRvYmpzIl0gfSB7Ci0Jc2V0dXBfeGZhaWwgImhwcGEqLSotKmVsZioiCi0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIHNlbmRfbG9nICIkb2JqY29weSAtTyBzcmVjIHRtcGRpci9zcjEgdG1wZGlyL3NyMS5zclxuIgotICAgIHZlcmJvc2UgIiRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NyMSB0bXBkaXIvc3IxLnNyIgotICAgIGNhdGNoICJleGVjICRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NyMSB0bXBkaXIvc3IxLnNyIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JdW5yZXNvbHZlZCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIHNldCBmMSBbb3BlbiB0bXBkaXIvc3IxLnNyIHJdCi0gICAgc2V0IGYyIFtvcGVuIHRtcGRpci9zcjIuc3Igcl0KLSAgICBpZiBbc3JlY19jb21wYXJlICRmMSAkZjJdIHsKLQlwYXNzICR0ZXN0Ci0gICAgfSBlbHNlIHsKLQlmYWlsICR0ZXN0Ci0gICAgfQotICAgIGNsb3NlICRmMQotICAgIGNsb3NlICRmMgotfQotCi1zZXQgdGVzdDEgIlMtcmVjb3JkcyIKLXNldCB0ZXN0MiAiUy1yZWNvcmRzIHdpdGggY29uc3RydWN0b3JzIgotCi0jIFNlZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQgdXNlcyBTSVpFT0ZfSEVBREVSUy4KLWNhdGNoICJleGVjICRsZCAtLXZlcmJvc2UiIGV4ZWNfb3V0cHV0Ci1zZXQgc2l6ZW9mX2hlYWRlcnMgW3N0cmluZyBtYXRjaCAiKlNJWkVPRl9IRUFERVJTKiIgJGV4ZWNfb3V0cHV0XQotCi0jIEZpcnN0IHRlc3QgbGlua2luZyBhIEMgcHJvZ3JhbS4gIFdlIGRvbid0IHJlcXVpcmUgYW55IGxpYnJhcmllcy4gIFdlCi0jIGxpbmsgaXQgbm9ybWFsbHksIGFuZCBvYmpjb3B5IHRvIHRoZSBTLXJlY29yZCBmb3JtYXQsIGFuZCB0aGVuIGxpbmsKLSMgZGlyZWN0bHkgdG8gdGhlIFMtcmVjb3JkIGZvcm1hdCwgYW5kIHJlcXVpcmUgdGhhdCB0aGUgdHdvIGZpbGVzCi0jIGNvbnRhaW4gdGhlIHNhbWUgZGF0YS4KLQotaWYgeyBbd2hpY2ggJENDXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0MQotICAgIHVudGVzdGVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiB7ICFbbGRfY29tcGlsZSAkQ0MgJHNyY2Rpci8kc3ViZGlyL3NyMS5jIHRtcGRpci9zcjEub10gXAotICAgICB8fCAhW2xkX2NvbXBpbGUgJENDICRzcmNkaXIvJHN1YmRpci9zcjIuYyB0bXBkaXIvc3IyLm9dIH0gewotICAgIHVucmVzb2x2ZWQgJHRlc3QxCi0gICAgdW5yZXNvbHZlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotIyBUaGUgaTM4Ni1hb3V0IHRhcmdldCBpcyBjb25mdXNlZDogdGhlIGxpbmtlciBkb2VzIG5vdCBwdXQgdGhlCi0jIHNlY3Rpb25zIHdoZXJlIG9iamR1bXAgZmluZHMgdGhlbS4gIEkgZG9uJ3Qga25vdyB3aGljaCBpcyB3cm9uZy4KLXNldHVwX3hmYWlsICJpKjg2LSotYW91dCoiCi0KLSMgVGhlc2UgdGVzdHMgZmFpbCBvbiB0aGUgbmF0aXZlIE1JUFMgRUxGIHRhcmdldHMgYmVjYXVzZSB0aGUgR1AgdmFsdWUKLSMgaW4gdGhlIC5yZWdpbmZvIHNlY3Rpb24gaXMgbm90IHVwZGF0ZWQgd2hlbiB0aGUgUy1yZWNvcmQgdmVyc2lvbiBpcwotIyB3cml0dGVuIG91dC4gIFRoZSBtaXBzLWVsZiB0YXJnZXQgaXRzZWxmIGRvZXMgbm90IHVzZSBhIC5yZWdpbmZvIHNlY3Rpb24uCi1zZXR1cF94ZmFpbCAibWlwcyotKi1pcml4NSoiICJtaXBzKi0qLWlyaXg2KiIKLQotIyBUaGUgUy1yZWNvcmQgbGlua2VyIGRvZXNuJ3QgZG8gdGhlIG1hZ2ljIFRPQyBoYW5kbGluZyB0aGF0IFhDT0ZGCi0jIGxpbmtlcnMgZG8uCi1zZXR1cF94ZmFpbCAiKi0qLWFpeCoiICIqLSoteGNvZmYqIgotCi0jIFRoZSBTLXJlY29yZCBsaW5rZXIgZG9lc24ndCBidWlsZCBBUk0vVGh1bWIgc3R1YnMuCi1zZXR1cF94ZmFpbCAiYXJtLSotY29mZiIKLXNldHVwX3hmYWlsICJzdHJvbmdhcm0tKi0qIgotc2V0dXBfeGZhaWwgImFybS0qLXBlKiIKLSMgc2V0dXBfeGZhaWwgImFybS0qZWxmKiIKLXNldHVwX3hmYWlsICJ0aHVtYi0qLWNvZmYqIgotc2V0dXBfeGZhaWwgInRodW1iLSotcGUqIgotc2V0dXBfeGZhaWwgInRodW1iLSotZWxmKiIKLQotIyBUaGUgUy1yZWNvcmQgbGlua2VyIGRvZXNuJ3QgYnVpbGQgc3BlY2lhbCBFQUJJIHNlY3Rpb25zLgotc2V0dXBfeGZhaWwgInBvd2VycGMqLSotZWFiaSoiCi0KLSMgVGhlIFMtcmVjb3JkIGxpbmtlciBkb2Vzbid0IGluY2x1ZGUgdGhlIC57emRhfSBzZWN0aW9ucy4KLXNldHVwX3hmYWlsICJ2ODUwKi0qLWVsZiIKLQotIyBUaGUgUy1yZWNvcmQgbGlua2VyIGRvZXNuJ3QgaGFuZGxlIEFscGhhIEVsZiByZWxheGF0aW9uLgotc2V0dXBfeGZhaWwgImFscGhhKi0qLWVsZioiICJhbHBoYSotKi1saW51eC1nbnUqIiAiYWxwaGEqLSotZ251KiIKLXNldHVwX3hmYWlsICJhbHBoYSotKi1uZXRic2QqIgotCi0jIFRoZSBTLXJlY29yZCBsaW5rZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBzcGVjaWFsIFBFIGhlYWRlcnMgLSB0aGUgUEUKLSMgZW11bGF0aW9uIHRyaWVzIHRvIHdyaXRlIHBlLXNwZWNpZmljIGluZm9ybWF0aW9uIHRvIHRoZSBQRSBoZWFkZXJzCi0jIGluIHRoZSBvdXRwdXQgYmZkLCBidXQgaXQncyBub3QgYSBQRSBiZmQgKGl0J3MgYW4gc3JlYyBiZmQpCi1zZXR1cF94ZmFpbCAiKi0qLWN5Z3dpbioiICIqLSotbWluZ3cqIiAiKi0qLXBlKiIgIiotKi13aW5udCoiCi0KLXJ1bl9zcmVjX3Rlc3QgJHRlc3QxICJ0bXBkaXIvc3IxLm8gdG1wZGlyL3NyMi5vIgotCi0jIE5vdyB0cnkgbGlua2luZyBhIEMrKyBwcm9ncmFtIHdpdGggZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQKLSMgZGVzdHJ1Y3RvcnMuICBOb3RlIHRoYXQgc2luY2Ugd2UgYXJlIG5vdCBsaW5raW5nIGFnYWluc3QgYW55Ci0jIGxpYnJhcmllcywgdGhpcyBwcm9ncmFtIHdvbid0IGFjdHVhbGx5IHdvcmsgb3IgYW55dGhpbmcuCi0KLWlmIHsgW3doaWNoICRDWFhdID09IDAgfSB7Ci0gICAgdW50ZXN0ZWQgJHRlc3QyCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfY29tcGlsZSAiJENYWCAkQ1hYRkxBR1MgLWZnbnUtbGlua2VyIiAkc3JjZGlyLyRzdWJkaXIvc3IzLmNjIHRtcGRpci9zcjMub10gewotICAgIHVucmVzb2x2ZWQgJHRlc3QyCi0gICAgcmV0dXJuCi19Ci0KLSMgU2VlIGFib3ZlLgotc2V0dXBfeGZhaWwgImkqODYtKi1hb3V0KiIKLXNldHVwX3hmYWlsICJtaXBzKi0qLWlyaXg1KiIgIm1pcHMqLSotaXJpeDYqIgotc2V0dXBfeGZhaWwgIiotKi1haXgqIiAiKi0qLXhjb2ZmKiIKLXNldHVwX3hmYWlsICJhcm0tKi0qIgotc2V0dXBfeGZhaWwgInN0cm9uZ2FybS0qLSoiCi1zZXR1cF94ZmFpbCAidGh1bWItKi0qIgotc2V0dXBfeGZhaWwgInBvd2VycGMqLSotZWFiaSoiCi1zZXR1cF94ZmFpbCAidjg1MCotKi1lbGYiCi1zZXR1cF94ZmFpbCAiYWxwaGEqLSotZWxmKiIgImFscGhhKi0qLWxpbnV4LWdudSoiICJhbHBoYSotKi1nbnUqIgotc2V0dXBfeGZhaWwgImFscGhhKi0qLW5ldGJzZCoiCi1zZXR1cF94ZmFpbCAiKi0qLWN5Z3dpbioiICIqLSotbWluZ3cqIiAiKi0qLXBlKiIgIiotKi13aW5udCoiCi0KLXJ1bl9zcmVjX3Rlc3QgJHRlc3QyICJ0bXBkaXIvc3IzLm8iCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5jIGIvbGQvdGVzdHN1aXRlL2xkLXVuZGVmaW5lZC91bmRlZmluZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWVjNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gdGVzdCB0aGUgbGlua2VyJ3MgcmVwb3J0aW5nIG9mIHVuZGVmaW5lZAotICAgc3ltYm9scy4gICovCi0KLWV4dGVybiBpbnQgdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCAoKTsKLQotaW50Ci1mdW5jdGlvbiAoKQotewotICByZXR1cm4gdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCAoKTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyNWUwMi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotIyBUZXN0IHRoYXQgdGhlIGxpbmtlciByZXBvcnRzIHVuZGVmaW5lZCBzeW1ib2wgZXJyb3JzIGNvcnJlY3RseS4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLSMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotc2V0IHRlc3R1bmQgInVuZGVmaW5lZCIKLXNldCB0ZXN0Zm4gInVuZGVmaW5lZCBmdW5jdGlvbiIKLXNldCB0ZXN0bGluZSAidW5kZWZpbmVkIGxpbmUiCi0KLWlmIHsgW3doaWNoICRDQ10gPT0gMCB9IHsKLSAgICB2ZXJib3NlICJDb3VsZCBub3QgZmluZCBDIGNvbXBpbGVyISIgMQotICAgIHVudGVzdGVkICR0ZXN0dW5kCi0gICAgdW50ZXN0ZWQgJHRlc3RmbgotICAgIHVudGVzdGVkICR0ZXN0bGluZQotICAgIHJldHVybgotfQotCi1pZiAhW2xkX2NvbXBpbGUgIiRDQyAtZyIgJHNyY2Rpci8kc3ViZGlyL3VuZGVmaW5lZC5jIHRtcGRpci91bmRlZmluZWQub10gewotICAgIHZlcmJvc2UgIlVuYWJsZSB0byBjb21waWxlIHRlc3QgZmlsZSEiIDEKLSAgICB1bnJlc29sdmVkICR0ZXN0dW5kCi0gICAgdW5yZXNvbHZlZCAkdGVzdGZuCi0gICAgdW5yZXNvbHZlZCAkdGVzdGxpbmUKLSAgICByZXR1cm4KLX0KLQotY2F0Y2ggImV4ZWMgcm0gLWYgdG1wZGlyL3VuZGVmaW5lZCIgZXhlY19vdXRwdXQKLQotIyBVc2luZyAtZSBzdGFydCBwcmV2ZW50cyB0aGUgU3VuT1MgbGlua2VyIGZyb20gdHJ5aW5nIHRvIGJ1aWxkIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1zZW5kX2xvZyAiJGxkIC1lIHN0YXJ0IC1vIHRtcGRpci91bmRlZmluZWQgdG1wZGlyL3VuZGVmaW5lZC5vXG4iCi12ZXJib3NlICIkbGQgLWUgc3RhcnQgLW8gdG1wZGlyL3VuZGVmaW5lZCB0bXBkaXIvdW5kZWZpbmVkLm8iCi0KLWNhdGNoICJleGVjICRsZCAtZSBzdGFydCAtbyB0bXBkaXIvdW5kZWZpbmVkIHRtcGRpci91bmRlZmluZWQubyIgZXhlY19vdXRwdXQKLXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQotcHJvYyBjaGVja3VuZCB7IHN0cmluZyB0ZXN0bmFtZSB9IHsKLSAgICBnbG9iYWwgZXhlY19vdXRwdXQKLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiokc3RyaW5nKiIgJGV4ZWNfb3V0cHV0XSB7Ci0JcGFzcyAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCWZhaWwgJHRlc3RuYW1lCi0gICAgfQotfQotCi1zZXQgbXUgInVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYHRoaXNfZnVuY3Rpb25faXNfbm90X2RlZmluZWQnIgotY2hlY2t1bmQgJG11ICR0ZXN0dW5kCi0KLSMgQVJNIFBFIGRlZmF1bHRzIHRvIHVzaW5nIHN0YWJzIGRlYnVnZ2luZywgd2hpY2ggd2UgY2FuJ3QgaGFuZGxlIGZvcgotIyBhIENPRkYgZmlsZS4KLSNzZXR1cF94ZmFpbCAiYXJtKi0qLXBlKiIKLSNzZXR1cF94ZmFpbCAidGh1bWIqLSotcGUqIgotCi0jIEp1c3QgZG9lc24ndCB3b3JrIGZvciBQQSBFTEYuICBObyBjbHVlIHdoeS4KLXNldHVwX3hmYWlsICJocHBhKi0qLSplbGYqIgotCi1zZXQgbWYgInRtcGRpci91bmRlZmluZWQubzogSW4gZnVuY3Rpb24gYGZ1bmN0aW9uJzoiCi1jaGVja3VuZCAkbWYgJHRlc3RmbgotCi0jIENPRkYgU0ggZ2V0cyB0aGlzIHRlc3Qgd3JvbmctLWl0IHJlcG9ydHMgbGluZSAxMCwgYmVjYXVzZSBhbHRob3VnaAotIyB0aGUganVtcCBpcyBhdCBsaW5lIDksIHRoZSBmdW5jdGlvbiBhZGRyZXNzLCBhbmQgdGhlIHJlbG9jLCBpcwotIyBzdG9yZWQgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCi1zZXR1cF94ZmFpbCAic2gtKi0qIgotCi0jIEFSTSBQRSBkZWZhdWx0cyB0byB1c2luZyBzdGFicyBkZWJ1Z2dpbmcsIHdoaWNoIHdlIGNhbid0IGhhbmRsZSBmb3IKLSMgYSBDT0ZGIGZpbGUuCi0jc2V0dXBfeGZhaWwgImFybSotKi1wZSoiCi0jc2V0dXBfeGZhaWwgInRodW1iKi0qLXBlKiIKLQotIyBKdXN0IGRvZXNuJ3Qgd29yayBmb3IgUEEgRUxGLiAgTm8gY2x1ZSB3aHkuCi1zZXR1cF94ZmFpbCAiaHBwYSotKi0qZWxmKiIKLQotc2V0IG1sICJ1bmRlZmluZWQuYzo5OiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGB0aGlzX2Z1bmN0aW9uX2lzX25vdF9kZWZpbmVkJyIKLSMgV2l0aCB0YXJnZXRzIHRoYXQgdXNlIGVsZi9kd2FyZjIsIHN1Y2ggYXMgdGhlIGFybS1lbGYgYW5kIHRodW1iLWVsZgotIyB0b29sY2hhaW5zLCB0aGUgY29kZSBpbiBiZmQvZWxmLmM6X2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUoKSBpcyBjYWxsZWQKLSMgaW4gb3JkZXIgdG8gbG9jYXRlIHRoZSBmaWxlIG5hbWUvbGluZSBudW1iZXIgd2hlcmUgdGhlIHVuZGVmaW5lZAotIyByZWZlcmVuY2Ugb2NjdXJzLiAgVW5mb3J0dW5hdGVseSB0aGlzIHRyaWVzIHRvIHVzZSB0aGUgZHdhcmYyIGRlYnVnCi0jIGluZm9ybWF0aW9uIGhlbGQgaW4gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24uICBUaGlzIHNlY3Rpb24gY29udGFpbnMgYSBzZXJpZXMKLSMgb2YgY29tcF91bml0IHN0cnVjdHVyZXMsIGVhY2ggb2Ygd2hpY2ggaGFzIGEgbG93L2hpZ2ggYWRkcmVzcyByYW5nZQotIyByZXByZXNlbnRpbmcgdGhlIHNwYW4gb2YgbWVtb3J5IGxvY2F0aW9ucyBjb3ZlcmVkIGJ5IHRoYXQgc3RydWN0dXJlLiAgVGhlCi0jIHN0cnVjdHVyZXMgYWxzbyBpbmRleCBpbnRvIG90aGVyIHN0cnVjdHVyZXMgaGVsZCBpbiB0aGUgLmRlYnVnX2xpbmUgc2VjdGlvbgotIyBhbmQgdG9nZXRoZXIgdGhleSBjYW4gdHJhbnNsYXRlIG1lbW9yeSBsb2NhdGlvbnMgYmFjayBpbnRvIGZpbGUvZnVuY3Rpb24vbGluZQotIyBudW1iZXIgYWRkcmVzc2VzIGluIHRoZSBzb3VyY2UgY29kZS4gIFNpbmNlIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVtb3J5Ci0jIHJlZ2lvbiBjb3ZlcmVkIGJ5IGEgY29tcF91bml0IGlzIG9ubHkgZGV0ZXJtaW5lZCBhdCBsaW5rIHRpbWUsIHRoZSBsb3cvaGlnaAotIyBhZGRyZXNzZXMgaW4gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24gYW5kIHRoZSBsaW5lIGFkZHJlc3NlcyBpbiB0aGUgLmRlYnVnX2xpbmUKLSMgc2VjdGlvbiBhcmUgY29tcHV0ZWQgYnkgZ2VuZXJhdGluZyByZWxvY3MgYWdhaW5zdCBrbm93biBzeW1ib2xzIGluIHRoZSBvYmplY3QKLSMgY29kZS4KLSMKLSMgV2hlbiB0aGUgdW5kZWZpbmVkIHJlZmVyZW5jZSBpcyBkZXRlY3RlZCwgdGhlIHJlbG9jcyBpbiB0aGUgZHdhcmYyCi0jIGRlYnVnIHNlY3Rpb25zIGhhdmUgbm90IHlldCBiZWVuIHJlc29sdmVkLCBzbyB0aGUgbG93L2hpZ2ggYWRkcmVzc2VzIGFuZCB0aGUKLSMgbGluZSBudW1iZXIgYWRkcmVzcyBhcmUgYWxsIHNldCBhdCB6ZXJvLiAgVGh1cyB3aGVuIF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKCkKLSMgY2FsbHMgX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUoKSBubyBjb21wX3VuaXQgY2FuIGJlIGZvdW5kIHdoaWNoCi0jIGFjdHVhbGx5IGNvdmVycyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgcmVmZXJlbmNlIG9jY3VyZWQsIGFuZCBzbwotIyBfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSgpIGZhaWxzLgotIwotIyBUaGUgdXBzaG90IG9mIGFsbCBvZiB0aGlzLCBpcyB0aGF0IHRoZSBlcnJvciBtZXNzYWdlIHJlcG9ydGVkIGJ5IHRoZQotIyBsaW5rZXIsIGluc3RlYWQgb2YgaGF2aW5nIGEgc291cmNlIGZpbGUgbmFtZSAmIGxpbmUgbnVtYmVyIGFzIGluOgotIwotIyAgIHVuZGVmaW5lZC5jOjk6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYHRoaXNfZnVuY3Rpb25faXNfbm90X2RlZmluZWQnCi0jCi0jIGhhcyBhbiBvYmplY3QgZmlsZSAmIHNlY3Rpb24gYWRkcmVzcyBpbnN0ZWFkOgotIwotIyAgIHVuZGVmaW5lZC4wKC50ZXh0KzB4Yyk6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYHRoaXNfZnVuY3Rpb25faXNfbm90X2RlZmluZWQnCi0jCi0jIGhlbmNlIHRoZSB4ZmFpbHMgYmVsb3cuCi0KLXNldHVwX3hmYWlsIGFybS0qLWVsZgotc2V0dXBfeGZhaWwgc3Ryb25nYXJtLSotZWxmCi1zZXR1cF94ZmFpbCB0aHVtYi0qLWVsZgotc2V0dXBfeGZhaWwgbWNvcmUtKi1lbGYKLQotY2hlY2t1bmQgJG1sICR0ZXN0bGluZQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLTEucm8gYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEtMS5ybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3MGQ4MC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEtMS5ybworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS0yLnJvIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLTIucm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNGRjNTkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLTIucm8KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEubGQgYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEubGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNWM0ZTMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLmxkCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLU9VVFBVVF9GT1JNQVQoInNyZWMiKQotU0VDVElPTlMKLXsKLQotCi0udGV4dCAwIDogeyAqKCI5IikgKigiMTAiKSAqKCIxMSIpICooIjEyIikgKigiMTMiKSAqKCIxNCIpICooIjE1IikKLQkJKigiNyIpICooIjgiKSAqKCIwIikgKigiMSIpICooIjIiKSAqKCIzIikgKigiNCIpIH0KLS5ic3MgKE5PTE9BRCkgIDogeyAgKigiNSIpICooIjYiKSB9Ci0KLS5QQUZJICAgID0weDAwMDAwMDUwIDsKLS5QQ0hJTyAgID0weDAwMDAwMEQwIDsKLS5QQ0xPICAgID0weDAwMDAwMDU0IDsKLS5QQ1ZCU1YgID0weDAwMDAwMDBFIDsKLS5QQ1ZUU1UgID0weDAwMDAwMDEyIDsKLS5QQ1ZUU1YgID0weDAwMDAwMDE2IDsKLS5QQ1ZUU1ZMID0weDAwMDAwMDFBIDsKLS5QQ1ZUVVMgID0weDAwMDAwMDFFIDsKLS5QRElTICAgID0weDAwMDAwMDIyIDsKLS5QRElTTCAgID0weDAwMDAwMDI2IDsKLS5QRFZKICAgID0weDAwMDAwMDJBIDsKLS5QRUlPICAgID0weDAwMDAwMENDIDsKLS5QRU9GICAgID0weDAwMDAwMDU4IDsKLS5QRU9MICAgID0weDAwMDAwMDVDIDsKLS5QRVFVUyAgID0weDAwMDAwMDJFIDsKLS5QRVFVViAgID0weDAwMDAwMDMyIDsKLS5QRVFVVkwgID0weDAwMDAwMDM2IDsKLS5QRVFVVyAgID0weDAwMDAwMERFIDsKLS5QR0NNICAgID0weDAwMDAwMDY0IDsKLS5QR0VRUyAgID0weDAwMDAwMDNBIDsKLS5QR0VRViAgID0weDAwMDAwMDNFIDsKLS5QR0VRVkwgID0weDAwMDAwMDQyIDsKLS5QR0VUICAgID0weDAwMDAwMDYwIDsKLS5QR1JUUyAgID0weDAwMDAwMDQ2IDsKLS5QR1JUViAgID0weDAwMDAwMDRBIDsKLS5QR1JUVkwgID0weDAwMDAwMDRFIDsKLS5QSUFDVCAgID0weDAwMDAwMDZDIDsKLS5QSUZEICAgID0weDAwMDAwMDY4IDsKLS5QSU5EUyAgID0weDAwMDAwMDUyIDsKLS5QSU5EViAgID0weDAwMDAwMDU2IDsKLS5QSU5EVkwgID0weDAwMDAwMDVBIDsKLS5QSU5EVyAgID0weDAwMDAwMEQ2IDsKLS5QTERDUyAgID0weDAwMDAwMDVFIDsKLS5QTERDViAgID0weDAwMDAwMDYyIDsKLS5QTEVRUyAgID0weDAwMDAwMDY2IDsKLS5QTEVRViAgID0weDAwMDAwMDZBIDsKLS5QTEVRVkwgID0weDAwMDAwMDZFIDsKLS5QTEVTUyAgID0weDAwMDAwMDcyIDsKLS5QTEVTViAgID0weDAwMDAwMDc2IDsKLS5QTEVTVkwgID0weDAwMDAwMDdBIDsKLS5QTE9EUyAgID0weDAwMDAwMDdFIDsKLS5QTE9EViAgID0weDAwMDAwMDgyIDsKLS5QTE9EVkwgID0weDAwMDAwMDg2IDsKLS5QTU9ESiAgID0weDAwMDAwMDhBIDsKLS5QTU9WICAgID0weDAwMDAwMEUyIDsKLS5QTVBKICAgID0weDAwMDAwMDhFIDsKLS5QTkVRUyAgID0weDAwMDAwMDkyIDsKLS5QTkVRViAgID0weDAwMDAwMDk2IDsKLS5QTkVRVkwgID0weDAwMDAwMDlBIDsKLS5QTkVRVyAgID0weDAwMDAwMERBIDsKLS5QUEFHRSAgID0weDAwMDAwMEQ0IDsKLS5QUEVFICAgID0weDAwMDAwMDcwIDsKLS5QUFVUICAgID0weDAwMDAwMDc0IDsKLS5QUkRCICAgID0weDAwMDAwMDc4IDsKLS5QUkRDICAgID0weDAwMDAwMDdDIDsKLS5QUkRIICAgID0weDAwMDAwMDgwIDsKLS5QUkRJICAgID0weDAwMDAwMDg0IDsKLS5QUkRKICAgID0weDAwMDAwMDg4IDsKLS5QUkRSUyAgID0weDAwMDAwMEM4IDsKLS5QUkRTICAgID0weDAwMDAwMDhDIDsKLS5QUkRWICAgID0weDAwMDAwMDkwIDsKLS5QUkxOICAgID0weDAwMDAwMDk0IDsKLS5QUlJBTiAgID0weDAwMDAwMDk4IDsKLS5QUlNUICAgID0weDAwMDAwMDlDIDsKLS5QUldUICAgID0weDAwMDAwMEEwIDsKLS5QU0NPTiAgID0weDAwMDAwMDlFIDsKLS5QU0NPUCAgID0weDAwMDAwMEEyIDsKLS5QU0RFTCAgID0weDAwMDAwMEE2IDsKLS5QU0lOUyAgID0weDAwMDAwMEFBIDsKLS5QU0xFTiAgID0weDAwMDAwMEFFIDsKLS5QU1BPUyAgID0weDAwMDAwMEIyIDsKLS5QU1RDViAgID0weDAwMDAwMEI2IDsKLS5QU1RDVkwgID0weDAwMDAwMEJBIDsKLS5QU1RPUyAgID0weDAwMDAwMEJFIDsKLS5QU1RPViAgID0weDAwMDAwMEMyIDsKLS5QU1RPVkwgID0weDAwMDAwMEM2IDsKLS5QU1RSUyAgID0weDAwMDAwMENBIDsKLS5QU1RSViAgID0weDAwMDAwMENFIDsKLS5QU1RSVkwgID0weDAwMDAwMEQyIDsKLS5QV0xOICAgID0weDAwMDAwMEE0IDsKLS5QV1JBTiAgID0weDAwMDAwMEE4IDsKLS5QV1JCICAgID0weDAwMDAwMEFDIDsKLS5QV1JDICAgID0weDAwMDAwMEIwIDsKLS5QV1JIICAgID0weDAwMDAwMEI0IDsKLS5QV1JJICAgID0weDAwMDAwMEI4IDsKLS5QV1JKICAgID0weDAwMDAwMEJDIDsKLS5QV1JTICAgID0weDAwMDAwMEMwIDsKLS5QV1JWICAgID0weDAwMDAwMEM0IDsKLQotLyoKLS5QQUZJPTB4ICAgPSAweDAwOwotLlBDSElPICAgPTB4IDB4MDAwMDAwOwotLlBDTE8gICAgPTB4IDY0IDsKLS5QQzsKLS5QQ1ZUU1UgID0weCAweDAwMDAwMDsKLS5QQ1ZUU1YgID0weCAweDAwMDAwMDsKLS5QQ1ZUU1ZMID0weCAweDAwMDAwMDsKLS5QQ1ZUVVMgID0weCAxNTggOwotLlA7Ci0uUERJU0wgICA9MHggMHgwMDAwMDA7Ci0uUERWSiAgICA9MHggMHgwMDAwMDA7Ci0uUEVJTyAgICA9MHggMHgwMDAwMDA7Ci0uUEVPRiAgICA9MHggMHgwMDAwMDA7Ci0uUEVPTCAgICA9MHggMHgwMDAwMDA7Ci0uUEVRVVMgICA9MHggMHgwMDAwMDA7Ci0uUEVRVVYgICA9MHggMHgwMDAwMDA7Ci0uUEVRVVZMICA9MHggMHgwMDAwMDA7Ci0uUEVRVVcgICA9MHggMHgwMDAwMDA7Ci0uUEdDTSAgICA9MHggMHgwMDAwMDA7Ci0uUEdFUVMgICA9MHggMHgwMDAwMDA7Ci0uUEdFUVYgICA9MHggMHgwMDAwMDA7Ci0uUEdFUVZMICA9MHggMHgwMDAwMDA7Ci0uUEdFVCAgICA9MHggMHgwMDAwMDA7Ci0uUEdSVFMgICA9MHggMHgwMDAwMDA7Ci0uUEdSVFYgICA9MHggMHgwMDAwMDA7Ci0uUEdSVFZMICA9MHggMHgwMDAwMDA7Ci0uUElBQ1QgICA9MHggMHgwMDAwMDA7Ci0uUElGRCAgICA9MHggMTI2IDsKLS5QOwotLlBJTkRWICAgPTB4IDB4MDAwMDAwOwotLlBJTkRWTCAgPTB4IDB4MDAwMDAwOwotLlBJTkRXICAgPTB4IDB4MDAwMDAwOwotLlBMRENTICAgPTB4IDB4MDAwMDAwOwotLlBMRENWICAgPTB4IDB4MDAwMDAwOwotLlBMRVFTICAgPTB4IDB4MDAwMDAwOwotLlBMRVFWICAgPTB4IDB4MDAwMDAwOwotLlBMRVFWTCAgPTB4IDB4MDAwMDAwOwotLlBMRVNTICAgPTB4IDB4MDAwMDAwOwotLlBMRVNWICAgPTB4IDB4MDAwMDAwOwotLlBMRVNWTCAgPTB4IDB4MDAwMDAwOwotLlBMT0RTICAgPTB4IDB4MDAwMDAwOwotLlBMT0RWICAgPTB4IDB4MDAwMDAwOwotLlBMT0RWTCAgPTB4IDB4MDAwMDAwOwotLlBNT0RKICAgPTB4IDB4MDAwMDAwOwotLlBNT1YgICAgPTB4IDB4MDAwMDAwOwotLlBNUEogICAgPTB4IDB4MDAwMDAwOwotLlBORVFTICAgPTB4IDB4MDAwMDAwOwotLlBORVFWICAgPTB4IDB4MDAwMDAwOwotLlBORVFWTCAgPTB4IDB4MDAwMDAwOwotLlBORVFXICAgPTB4IDB4MDAwMDAwOwotLlBQQUdFICAgPTB4IDB4MDAwMDAwOwotLlBQRUUgICAgPTB4IDB4MDAwMDAwOwotLlBQVVQgICAgPTB4IDB4MDAwMDAwOwotLlBSREIgICAgPTB4IDB4MDAwMDAwOwotLlBSREMgICAgPTB4IDB4MDAwMDAwOwotLlBSREggICAgPTB4IDB4MDAwMDAwOwotLlBSREkgICAgPTB4IDB4MDAwMDAwOwotLlBSREogICAgPTB4IDB4MDAwMDAwOwotLlBSRFJTICAgPTB4IDB4MDAwMDAwOwotLlBSRFMgICAgPTB4IDB4MDAwMDAwOwotLlBSRFYgICAgPTB4IDB4MDAwMDAwOwotLlBSTE4gICAgPTB4IDB4MDAwMDAwOwotLlBSUkFOICAgPTB4IDB4MDAwMDAwOwotLlBSU1QgICAgPTB4IDB4MDAwMDAwOwotLlBSV1QgICAgPTB4IDB4MDAwMDAwOwotLlBTQ09OICAgPTB4IDB4MDAwMDAwOwotLlBTQ09QICAgPTB4IDB4MDAwMDAwOwotLlBTREVMICAgPTB4IDB4MDAwMDAwOwotLlBTSU5TICAgPTB4IDB4MDAwMDAwOwotLlBTTEVOICAgPTB4IDB4MDAwMDAwOwotLlBTUE9TICAgPTB4IDB4MDAwMDAwOwotLlBTVENWICAgPTB4IDB4MDAwMDAwOwotLlBTVENWTCAgPTB4IDB4MDAwMDAwOwotLlBTVE9TICAgPTB4IDB4MDAwMDAwOwotLlBTVE9WICAgPTB4IDB4MDAwMDAwOwotLlBTVE9WTCAgPTB4IDB4MDAwMDAwOwotLlBTVFJTICAgPTB4IDB4MDAwMDAwOwotLlBTVFJWICAgPTB4IDB4MDAwMDAwOwotLlBTVFJWTCAgPTB4IDB4MDAwMDAwOwotLlBXTE4gICAgPTB4IDB4MDAwMDAwOwotLlBXUkFOICAgPTB4IDB4MDAwMDAwOwotLlBXUkIgICAgPTB4IDB4MDAwMDAwOwotLlBXUkMgICAgPTB4IDB4MDAwMDAwOwotLlBXUkggICAgPTB4IDB4MDAwMDAwOwotLlBXUkkgICAgPTB4IDB4MDAwMDAwOwotLlBXUkogICAgPTB4IDB4MDAwMDAwOwotLlBXUlMgICAgPTB4IDB4MDAwMDAwOwotLlBXUlYgICAgPTB4IDB4MDAwMDAwOwotCi0qLwotLyoKLS5QPTB4ICAgICAgPSAwOwotLlBDSElPICAgPTB4IDB4ZmVlZGZhOwotLlBDTE8gICAgPTB4IDB4ZmVlZGZhOwotLlBDVkJTViAgPTB4IDB4ZmVlZGZhOwotLlBDVlRTVSAgPTB4IDB4ZmVlZGZhOwotLlBDVlRTViAgPTB4IDB4ZmVlZGZhOwotLlBDVlRTVkwgPTB4IDB4ZmVlZGZhOwotLlBDVlRVUyAgPTB4IDB4ZmVlZGZhOwotLlBESVMgICAgPTB4IDB4ZmVlZGZhOwotLlBESVNMICAgPTB4IDB4ZmVlZGZhOwotLlBEVkogICAgPTB4IDB4ZmVlZGZhOwotLlBFSU8gICAgPTB4IDB4ZmVlZGZhOwotLlBFT0YgICAgPTB4IDB4ZmVlZGZhOwotLlBFT0wgICAgPTB4IDB4ZmVlZGZhOwotLlBFUVVTICAgPTB4IDB4ZmVlZGZhOwotLlBFUVVWICAgPTB4IDB4ZmVlZGZhOwotLlBFUVVWTCAgPTB4IDB4ZmVlZGZhOwotLlBFUVVXICAgPTB4IDB4ZmVlZGZhOwotLlBHQ00gICAgPTB4IDB4ZmVlZGZhOwotLlBHRVFTICAgPTB4IDB4ZmVlZGZhOwotLlBHRVFWICAgPTB4IDB4ZmVlZGZhOwotLlBHRVFWTCAgPTB4IDB4ZmVlZGZhOwotLlBHRVQgICAgPTB4IDB4ZmVlZGZhOwotLlBHUlRTICAgPTB4IDB4ZmVlZGZhOwotLlBHUlRWICAgPTB4IDB4ZmVlZGZhOwotLlBHUlRWTCAgPTB4IDB4ZmVlZGZhOwotLlBJQUNUICAgPTB4IDB4ZmVlZGZhOwotLlBJRkQgICAgPTB4IDB4ZmVlZGZhOwotLlBJTkRTICAgPTB4IDB4ZmVlZGZhOwotLlBJTkRWICAgPTB4IDB4ZmVlZGZhOwotLlBJTkRWTCAgPTB4IDB4ZmVlZGZhOwotLlBJTkRXICAgPTB4IDB4ZmVlZGZhOwotLlBMRENTICAgPTB4IDB4ZmVlZGZhOwotLlBMRENWICAgPTB4IDB4ZmVlZGZhOwotLlBMRVFTICAgPTB4IDB4ZmVlZGZhOwotLlBMRVFWICAgPTB4IDB4ZmVlZGZhOwotLlBMRVFWTCAgPTB4IDB4ZmVlZGZhOwotLlBMRVNTICAgPTB4IDB4ZmVlZGZhOwotLlBMRVNWICAgPTB4IDB4ZmVlZGZhOwotLlBMRVNWTCAgPTB4IDB4ZmVlZGZhOwotLlBMT0RTICAgPTB4IDB4ZmVlZGZhOwotLlBMT0RWICAgPTB4IDB4ZmVlZGZhOwotLlBMT0RWTCAgPTB4IDB4ZmVlZGZhOwotLlBNT0RKICAgPTB4IDB4ZmVlZGZhOwotLlBNT1YgICAgPTB4IDB4ZmVlZGZhOwotLlBNUEogICAgPTB4IDB4ZmVlZGZhOwotLlBORVFTICAgPTB4IDB4ZmVlZGZhOwotLlBORVFWICAgPTB4IDB4ZmVlZGZhOwotLlBORVFWTCAgICA9IDB4ZmVlZGZhY2U7Ci0uUE5FUVcgICAgID0gMHhmZWVkZmFjZTsKLS5QUEFHRSAgICAgPSAweGZlZWRmYWNlOwotLlBQRUUgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFBVVCAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRCICAgICAgPSAweGZlZWRmYWNlOwotLlBSREMgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJESCAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRJICAgICAgPSAweGZlZWRmYWNlOwotLlBSREogICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEUlMgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRTICAgICAgPSAweGZlZWRmYWNlOwotLlBSRFYgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJMTiAgICAgID0gMHhmZWVkZmFjZTsKLS5QUlJBTiAgICAgPSAweGZlZWRmYWNlOwotLlBSU1QgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJXVCAgICAgID0gMHhmZWVkZmFjZTsKLS5QU0NPTiAgICAgPSAweGZlZWRmYWNlOwotLlBTQ09QICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNERUwgICAgID0gMHhmZWVkZmFjZTsKLS5QU0lOUyAgICAgPSAweGZlZWRmYWNlOwotLlBTTEVOICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNQT1MgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RDViAgICAgPSAweGZlZWRmYWNlOwotLlBTVENWTCAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUT1MgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RPViAgICAgPSAweGZlZWRmYWNlOwotLlBTVE9WTCAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUUlMgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RSViAgICAgPSAweGZlZWRmYWNlOwotLlBTVFJWTCAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdMTiAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JBTiAgICAgPSAweGZlZWRmYWNlOwotLlBXUkIgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSQyAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JIICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkkgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSSiAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JTICAgICAgPSAweGZlZWRmYWNlOwotLlBXUlYgICAgICA9IDB4ZmVlZGZhY2U7Ci0qLwotCi19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEub29rIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLm9vawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4NGI5NC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEub29rCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLVMwMEMwMDAwNzQzMTJFNkY3NTc0MkU2RjZCQzANCi1TMTE4MDAwMDAwMDAwQTIwNTM0MTQ2NDU1MzU0NEY1MjQ1MjA0MTIwMjAyMDIwMjA1MkJFDQotUzExODAwMTUzMTMzMkUzMzIwMjAyMDIwMjAyMDIwNTIzMTMzMkUzMjIwMjAyMDIwMjA3Nw0KLVMxMTgwMDJBMjAyMDAwQjVFODY2MDBCNUU5QjExREExNUI5OTAwMDAxRjAwMDAwMDBBNTANCi1TMTE4MDAzRjY0MDAwMDAwM0UwMDAwMDA1QzAwQTgwMEJBMDBGMDAwMDQwMDAxMDAwMjUxDQotUzExODAwNTQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYwMDQwMzFDRjUyNTQ0QzQ5NDJEMA0KLVMxMTgwMDY5NDM0RjRFMDAwNEU1RUM1MjU0NEM0OTQyNDM0RjRFMDAwNEU1RUQ1MjU0RjANCi1TMTE4MDA3RTRDNDk0MjQzNEY0RTAwNDAzMUQyNTI1NDRDNDk0MjQzNEY0RTAwMDAwQTA4DQotUzExODAwOTM3RDUyNTQ0QzQ5NDI1MzU0NTIwMDEwQTRBODUyNTQ0QzQ5NDI0NjQ5NENBRA0KLVMxMTgwMEE4MDAwMjAwQjVFODZEMDAwMDAxNjAwMEI1RTg3MzAwMDAwMjU0MDAwMjAwNkENCi1TMTE4MDBCREI1RTkzNzUzNDE0NjQ1NTA1MjQ5NEU1NDIwMDAwMDA2MDAwMjAwMDgwMDc5DQotUzExODAwRDIwMDAwMDM0MjAwQjVFODZFNDk0RTQ5NTQ1MzQxNDY0NTUzNTQwMDAwMDJDOQ0KLVMxMTgwMEU3MTgwMDAwMEUwMDAwMDAwOTAyMDAzMDAwMDAwMDAwNEU1NkZGRDhCQThGREINCi1TMTE4MDBGQzYzMDYyRTRFNjEwMDAwMTY0MUZBMDAzMjQzRUVGRkQ4NzAyNjEyRDg1MTQ5DQotUzExODAxMTFDOEZGRkM0RTVFNEU3NTJCNTdGRkYyMkYzQzAwMDAwMDBBNjAwMDAwMDI1OQ0KLVMxMTgwMTI2M0I2RjAwMDJGRkY2MkYyRDAwMzgyRjJEMDAzNDRFNEM0RTRBNDM0RjUwRTcNCi1TMTE4MDEzQjU5NTI0OTQ3NDg1NDIwNTQ2NTZDNjU2NjZGNkUyMDQxNDIyMDRDMjA0RDZCDQotUzExODAxNTAyMDQ1NzI2OTYzNzM3MzZGNkUyQzIwMzEzOTM5MzMwMDRFNTZGRkZDQkFCNQ0KLVMxMTgwMTY1OEY2MzA0MkU0RTYxQUMyMDJFMDAwQzA2ODAwMDAwMDAwQzRFNzY1NjgwN0MNCi1TMTE4MDE3QTRFNzYwMjgwRkZGRkZGRkM0QUQ1NjYwNDYxMDAwMEIwMkQ0MEZGRkMyMDBCDQotUzExODAxOEY2QzAwM0EyMjA4MjQyQzAwMzY5NDgxNEU3NjA0ODIwMDAwMDAwQzRFNzZEMg0KLVMxMTgwMUE0NEFENTY2MDQ2MTAwMDA4RUIwODI2RTBDMENBRTAwMDAwMDAxMDAwQzZDRUINCi1TMTE4MDFCOTAwMDAwQzIwN0MwMDAwMDAwMDYxMDAwMDYwMjA2QzAwM0EyMDA4NjYwNDZDDQotUzExODAxQ0U2MTAwMDA3NjIyMDhEMkFFRkZGQzY4MDQ2MTAwMDA1QzIwODEyMTZFMDA0Mw0KLVMxMTgwMUUzMTAwMDA0MjE2RTAwMEMwMDA4MjIwODA2ODEwMDAwMDAwQzY4MDQ2MTAwQzINCi1TMTE4MDFGODAwNDAyRDQxMDAxNDI5NTAwMDNBMjA2QzAwM0EyNDA4NjYwNDYxMDAwMEJDDQotUzExODAyMEQzQTQyOTA0MkE4MDAwNDQyQTgwMDA4NEU1RTIyNUYyODVGNTA4RjRFRTkyMg0KLVMxMTgwMjIyMDAwMjJCNUZGRkYyNEU1RUQxREYyODVGMkYwODJCNDhGRkYyRDBEMDRFREENCi1TMTE4MDIzN0QwMkI1N0ZGRjIyRjNDMDAwMDAwMEU2MDAwRkVFMjJCNTdGRkYyMkYzQ0Q0DQotUzExODAyNEMwMDAwMDAxMDYwMDBGRUQ0NEU1NkZGRkNCQThGNjMwNjJFNEU2MTAwRkUyQg0KLVMxMTgwMjYxQjgyRDZDMDAzMkZGRkM2MDAwMDAxMjJCNUZGRkYyNEZFRUZGRkM0MkFFRjENCi1TMTE4MDI3NkZGRkM2MDAwMDA4MjRBQUVGRkZDNjcwMDAwN0EyMDZFRkZGQzIwMDg2NkE3DQotUzExODAyOEIwMDAwMDQ2MUI2MjIyODAwMDRCMkFFMDAxMDY3MDAwMDYyMjIwODAyODEwQg0KLVMxMTgwMkEwMDAwMDAwMDM0QTgxNjY0MDIyMDgyMjZDMDAzQTI0MDlCMjgyNkUzNDI2QjYNCi1TMTE4MDJCNTEwMjgwODA2ODQwMDAwMDAwQzY4MDQ2MTAwRkY3NkI2ODQ2RDIwMjYxMDFCDQotUzExODAyQ0EyODA4OTY4NDRFNzYwNDgzMDAwMDAwMEM0RTc2NEFENTY2MDQ2MTAwRkZDRA0KLVMxMTgwMkRGNUFCNkE4MDAwODZDMDAwMDA0NjE4MjIwNkVGRkZDMjAwODY2MDQ2MTAwNzcNCi1TMTE4MDJGNEZGNTIyRDUwRkZGQzYwODA0QUFFRkZGQzY3MDAwMDJDMjA2RUZGRkMyMDE5DQotUzExODAzMDkwODY2MDQ2MTAwRkYzODIyNkUwMDBDMjJBODAwMDgyMjA4MDY4MTAwMDBCMg0KLVMxMTgwMzFFMDAwQzY4MDQ2MTAwRkYxNDJENDEwMDE0NjAwMDAwMEMyMDZFMDAwQzQyMTANCi1TMTE4MDMzMzkwNDJBRTAwMTQ0RTVFMjA1RjI4NUY1MDhGNEVEMDRGRURGRjAwNzA3RjQ0DQotUzExODAzNDgyMDRGNDI1ODUxQzhGRkZDNDg2REZGMDgxRjNDMDAwNDNGM0MwMDAxOUY0OQ0KLVMxMTgwMzVERkMwMDAwMDAwQzIyNEY0NUZBMDRGRTIyREEyMkRBMjJEQTI2NkMwMDI4MUYNCi1TMTE4MDM3MjJGMEMyODZDMDAyQzRFQUIwMDY4NDg2REZGQjg0ODZERkZCNDJGMEMyMEU3DQotUzExODAzODc2QzAwMDAyODZDMDAwNDRFOTA5RkZDMDAwMDAwNTIyRjJERkZDNjJGMEMzMg0KLVMxMTgwMzlDMjA2QzAwMDgyODZDMDAwQzRFOTA3MDUyMjY2QzAwMjA0RUFCMDAxRTQxNkENCi1TMTE4MDNCMUZBMDRCRTI2NkMwMDIwNEVBQjAwN0UyNjZDMDAyMDRFQUIwMDlFNDFFREQ3DQotUzExODAzQzZGRkJBMjY2QzAwMjA0RUFCMDA3RTI2NkMwMDIwNEVBQjAwOUUxRjNDMDA5OA0KLVMxMTgwM0RCMjgzRjNDMDAwMTI2NkMwMDIwNEVBQjAwOUU5RkZDMDAwMDAwNTIzMDJERDINCi1TMTE4MDNGMEZGQ0E0OEMwMkYwMDJGMEMyMDZDMDAwODI4NkMwMDBDNEU5MDcwNTIyNkJGDQotUzExODA0MDU2QzAwMjA0RUFCMDAxRTI2NkMwMDIwNEVBQjAwOUU0MUZBMDQ1RTI2NkNDMw0KLVMxMTgwNDFBMDAyMDRFQUIwMDdFMjY2QzAwMjA0RUFCMDA5RTQxRURGRjlFNzAxNjI2NzINCi1TMTE4MDQyRjZDMDAyMDRFQUIwMENBNjAwMDAwMTYyQjVGRkZGMjRGRURGRjAwMkI3QzkyDQotUzExODA0NDQwMDAwMDAwMUZGQjQ2MDAwMDNFNDQ4NkRGRjA4OUZGQzAwMDAwMDUyMjBEQg0KLVMxMTgwNDU5NEY0M0VERkY5RTMwMTk3MjUwOTI0MDZGMDI0MjQxRDA0MTMwQzA2RjBBMjMNCi1TMTE4MDQ2RTUzNDBFMjQwMzBEOTUxQzhGRkZDOUZGQzAwMDAwMDUyMjI0RjQ1RkEwMzAzDQotUzExODA0ODNGNjMyREEyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMDUwRkZBQTQ4NkQwMg0KLVMxMTgwNDk4RkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQTBGRjk2NDJBREZGNzMNCi1TMTE4MDRBRDAwMkI2QzAwMzJGRjA0NDg3QTAzQzQzRjNDRkZGRjQ4NkRGRjA4MjY2QzFBDQotUzExODA0QzIwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQzBGRjcwNDg2REZGMDgyNjZDMDA4OA0KLVMxMTgwNEQ3MjgyRjBDMjg2QzAwMkM0RUFCMDBBNEZGNUM2MDAwMDA3ODJCNUZGRkYyOUUNCi1TMTE4MDRFQzRGRURGRjAwNDg3QTAzQkEzRjNDRkZGRjQ4NkRGRjA4MjY2QzAwMjgyRjFGDQotUzExODA1MDEwQzI4NkMwMDJDNEVBQjAwQzBGRjM0OUZGQzAwMDAwMDUyMjA2REZGMDRBQw0KLVMxMTgwNTE2MjAwODJGMDAyRjBDMjA2QzAwMTAyODZDMDAxNDRFOTAyRjBGM0YzQ0ZGNjANCi1TMTE4MDUyQkZGNDg2REZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMEMwRkYwMDhGDQotUzExODA1NDBERkZDMDAwMDAwNTI0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVCNg0KLVMxMTgwNTU1QUIwMEE0RkVFNjYwMDAwMUYwMjA2REZGMDQyMDA4NjYwMjYxODA0QTkwMkUNCi1TMTE4MDU2QTY3MDAwMTZBMjIxMDAyODEwMDAwMDAwMzRBODE2NjRBMjIxMDI0MkMwMEYxDQotUzExODA1N0YzNjA0ODIwMDAwMDAwQzY4MDQ2MTAwRkNBRUIyODI2RTM0MjIxMDI0MDhGMA0KLVMxMTgwNTk0MDY4MjAwMDAwMDBDNjgwNDYxMDBGQzlBQjI4MjZEMjAyMjEwMjQwODkyQTYNCi1TMTE4MDVBOTgyNEU3NjA0ODEwMDAwMDAwQzRFNzY0QUQ1NjYwNDYxMDBGQzdFQjJBOEUwDQotUzExODA1QkUwMDA4NkMwMDAwMDY2MTAwRkYyMjIwNkRGRjA0MjAwODY2MDQ2MTAwRkZBNg0KLVMxMTgwNUQzMTYyMjI4MDAwOEQyQURGRjAwNjgwNDYxMDBGQzU4MkI0MUZGMDA5RkZDMDINCi1TMTE4MDVFODAwMDAwMDUyMjQwODJGMDIyRjBDMjA2QzAwMTAyODZDMDAxNDRFOTAyRkJGDQotUzExODA1RkQwRjNGM0MwMDBDNDg2REZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzRFQUJFNQ0KLVMxMTgwNjEyMDBDMEZFMkFERkZDMDAwMDAwNTIyMDZERkYwNDIwMDg2NjA0NjEwMEZFMzkNCi1TMTE4MDYyN0MyMkYyODAwMDQzRjNDMDAwQzQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2Q0QxDQotUzExODA2M0MwMDJDNEVBQjAwQkNGREZDMjA2REZGMDQyMDA4NjYwNDYxMDBGRTlBMkY4MQ0KLVMxMTgwNjUxMjgwMDA4M0YzQzAwMEM0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNjgNCi1TMTE4MDY2NjRFQUIwMEJDRkRENDlGRkMwMDAwMDA1MjIwNkRGRjA0MjAwODY2MDQ2MTg1DQotUzExODA2N0IwMEZFNkMyMjEwMkYwMTJGMEMyMDZDMDAxMDI4NkMwMDE0NEU5MDJGMEZGRg0KLVMxMTgwNjkwM0YzQzAwMEM0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwNjANCi1TMTE4MDZBNUMwRkQ5OERGRkMwMDAwMDA1MjQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2Qzc1DQotUzExODA2QkEwMDJDNEVBQjAwQTRGRDdFMjA2REZGMDQyMDA4NjYwNDYxMDBGRTFDMkIxQg0KLVMxMTgwNkNGNTBGRjA0NjAwMEZFOEEyMDZDMDAzQUIxRURGRjA0NjcwMDAwNkM0ODdBREINCi1TMTE4MDZFNDAxRTgzRjNDRkZGRjQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RURDDQotUzExODA2RjlBQjAwQzBGRDQyOUZGQzAwMDAwMDUyMjA2REZGMDQyMDA4MkYwMDJGMEMyRg0KLVMxMTgwNzBFMjA2QzAwMTAyODZDMDAxNDRFOTAyRjBGM0YzQ0ZGRkY0ODZERkYwODI2MTcNCi1TMTE4MDcyMzZDMDAyODJGMEMyODZDMDAyQzRFQUIwMEMwRkQwRURGRkMwMDAwMDA1MjNEDQotUzExODA3Mzg0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQTRGQ0Y0NDg2Mg0KLVMxMTgwNzREN0EwMTk4M0YzQ0ZGRkY0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDOTYNCi1TMTE4MDc2MjRFQUIwMEMwRkNEODQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RTMyDQotUzExODA3NzdBQjAwQTRGQ0M0NDg3QTAxNkEzRjNDRkZGRjQ4NkRGRjA4MjY2QzAwMjgzRQ0KLVMxMTgwNzhDMkYwQzI4NkMwMDJDNEVBQjAwQzBGQ0E4NDg2REZGMDgyNjZDMDAyODJGNTcNCi1TMTE4MDdBMTBDMjg2QzAwMkM0RUFCMDBBNEZDOTQyMDZERkYwNDIwMDgwNjgwMDAwMDA4DQotUzExODA3QjYwMDE4NEU3NjIyMkMwMDM2OTI4MDRFNzYwMjgxRkZGRkZGRkM0QUQ1NjZGMw0KLVMxMTgwN0NCMDQ2MTAwRkE2QTJGMDEzRjNDMDAwQzQ4NkRGRjA4MjY2QzAwMjgyRjBDRTQNCi1TMTE4MDdFMDI4NkMwMDJDNEVBQjAwQkNGQzU2MkYyREZGMDAzRjNDMDAwQzQ4NkRGRkEzDQotUzExODA3RjUwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQkNGQzNBNDg2REZGMDg4Nw0KLVMxMTgwODBBMjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDBBNEZDMjY0ODZERkYwODFGODYNCi1TMTE4MDgxRjNDMDAwMTI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwNTQ0ODZERkZCODE1DQotUzExODA4MzQ0ODZERkZCNDJGMEMyMDZDMDAxODI4NkMwMDFDNEU5MDQ4NkRGRjA4NDJEOA0KLVMxMTgwODQ5MjcyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMDU0NDJBNzJGMkQwMDM4RjANCi1TMTE4MDg1RTJGMkQwMDM0NEU0QTAwMEE0NjMxMjAyMDIwMjAyMDIwMjAyMDAwMDIzQTlDDQotUzExODA4NzMzQTAwMDIyOTNBMDAwMDAwMzAyMDIwMjAyMDIwNDE2NDY0NzI2NTczNzMzNw0KLVMxMTgwODg4MjAyMDIwMjA0OTY0NjU2RTc0Njk3NDc5MjAyMDIwMjAyMDIwMjAyMDUzM0ENCi1TMTE4MDg5RDY5N0E2NTIwMjAyMDIwMjAyMDIwMjA0RTY1Nzg3NDAwMUQ0OTZFNzY2MUIwDQotUzExODA4QjI2QzY5NjQyMDczNjU2NzZENjU2RTc0MjA3Mzc0NjE3Mjc0Njk2RTY3MjAzNQ0KLVMxMTgwOEM3NjE3NDNBMjAyMDAwMTg1MzY1Njc2RDY1NkU3NDIwNkM2OTczNzQyMDYzN0YNCi1TMTE4MDhEQzZGNzI3Mjc1NzA3NDY1NjQzQTIwMDAwMDAwMTgyMDIwMjA0MTc2NjE2OTNCDQotUzExODA4RjE2QzYxNjI2QzY1MjAyMDIwMjAyMDIwMjAyMDU1NzM2NTY0NEZFREZGRjIzMA0KLVMxMTgwOTA2OUZGQzAwMDAwMDBBNjEwMDAxNTY0MUVDMDAzMDIwREYyMERGMzBERjIwRjENCi1TMTE4MDkxQjJDMDAzMjU2ODA0RTc2MDI4MEZGRkZGRkZDNEFENTY2MDQ2MTAwRjkwQTYzDQotUzExODA5MzAyOTQwMDAzMjI5NDAwMDNBNjAwMDAwM0UyQjVGRkZGMjRGRURGRkYyMjAwQQ0KLVMxMTgwOTQ1MkMwMDMyNTY4MDRFNzYwMjgwRkZGRkZGRkM0QUQ1NjYwNDYxMDBGOEUwNjQNCi1TMTE4MDk1QTI5NDAwMDNBMjA2QzAwM0EyMjA4NjYwNDYxMDBGOERFNDI5MDQyQTgwMDk0DQotUzExODA5NkYwNDQyQTgwMDA4NjAwMDAwOUU0QTJDMDAzMDY3MDAwMDFBMjA2QzAwM0E4RQ0KLVMxMTgwOTg0MjAwODY2MDI2MUIyNDI5MDQyQTgwMDA0NDJBODAwMDg2MDAwMDA3RTIwMDcNCi1TMTE4MDk5OTZDMDAzQTIwMDg2NjAyNjE5QTRBOTA2NzAwMDA2RTIyMTAwMjgxMDAwMEIwDQotUzExODA5QUUwMDAzNEE4MTY2NEEyMjEwMjQyQzAwMzYwNDgyMDAwMDAwMEM2ODA0NjE5Qg0KLVMxMTgwOUMzMDBGODc0QjI4MjZFMzQyMjEwMjQwODA2ODIwMDAwMDAwQzY4MDQ2MTAwMUENCi1TMTE4MDlEOEY4NjBCMjgyNkQyMDIyMTAyNDA4OTI4MjRFNzYwNDgxMDAwMDAwMEM0RUQ4DQotUzExODA5RUQ3NjRBRDU2NjA0NjEwMEY4NDRCMkE4MDAwODZDMDAwMDA2NjEwMEZGM0NFNQ0KLVMxMTgwQTAyMjA2QzAwM0EyMDA4NjYwNDYxMDBGRjMwMjk1MDAwM0E2MDg0NDJBNzJGNDQNCi1TMTE4MEExNzJEMDAzODJGMkQwMDM0NEU0QTRFNTYwMDAwNTE4RjQyQTcxRjNDMDAwRTYzDQotUzExODBBMkM0MjY3NDg3QTAwMTI0MjY3NDIyNzJGM0MwMEI1RTg2RTRFNDkwMDBFNTBCNw0KLVMxMTgwQTQxOEY0RTVFMjA1RjI4NUY0RUU4MDAwMjIwN0MwMDAwMDAwMDYwMDQyQjVGOTkNCi1TMTE4MEE1NkZGRjI0RTVFRDFERjI4NUYyRjA4RDBEMDRFRDA0M0ZBMDAwNEQzRkMwMEFFDQotUzExODBBNkIwMjcwNEUyRjQ5MDAwQTQzRkEwMDA0RDNGQzAwMDAwMDQwMkY0OTAwMDY2Mg0KLVMxMTgwQTgwNDFGQTAwMDREMUZDRkZGRkY1N0EyMDI4MDA1NjY2MDAwMDIyMjIwOTkyMDENCi1TMTE4MEE5NTg4MjE0MTAwNTY0MjgxMjQ0OEQyNUFCNUM5NkRGQTQ0NDFEMzY4MDA1QUFFDQotUzExMTBBQUExRjdDMDAwMTAwMDQ0RTc1NDIyRjAwMDQ0RTc1OUYNCi1TOTAzMDAwMEZDDQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTEucm8gYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMS5ybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzYTdjYy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMS5ybworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0yLnJvIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTIucm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNGE3OWQuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTIucm8KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMy5ybyBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0zLnJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTU5MzQyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0zLnJvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLmxkIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLmxkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTFlNDEzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi5sZAorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi1PVVRQVVRfRk9STUFUKCJzcmVjIikKLVNFQ1RJT05TCi17Ci0KLQotLnRleHQgMCA6IHsgKigiOSIpICooIjEwIikgKigiMTEiKSAqKCIxMiIpICooIjEzIikgKigiMTQiKSAqKCIxNSIpCi0JCSooIjciKSAqKCI4IikgKigiMCIpICooIjEiKSAqKCIyIikgKigiMyIpICooIjQiKSB9Ci0uYnNzICAgOiB7ICAqKCI1IikgKigiNiIpIH0KLQotLlBBRkkgICAgPTB4MDAwMDAwNTAgOwotLlBDSElPICAgPTB4MDAwMDAwRDAgOwotLlBDTE8gICAgPTB4MDAwMDAwNTQgOwotLlBDVkJTViAgPTB4MDAwMDAwMEUgOwotLlBDVlRTVSAgPTB4MDAwMDAwMTIgOwotLlBDVlRTViAgPTB4MDAwMDAwMTYgOwotLlBDVlRTVkwgPTB4MDAwMDAwMUEgOwotLlBDVlRVUyAgPTB4MDAwMDAwMUUgOwotLlBESVMgICAgPTB4MDAwMDAwMjIgOwotLlBESVNMICAgPTB4MDAwMDAwMjYgOwotLlBEVkogICAgPTB4MDAwMDAwMkEgOwotLlBFSU8gICAgPTB4MDAwMDAwQ0MgOwotLlBFT0YgICAgPTB4MDAwMDAwNTggOwotLlBFT0wgICAgPTB4MDAwMDAwNUMgOwotLlBFUVVTICAgPTB4MDAwMDAwMkUgOwotLlBFUVVWICAgPTB4MDAwMDAwMzIgOwotLlBFUVVWTCAgPTB4MDAwMDAwMzYgOwotLlBFUVVXICAgPTB4MDAwMDAwREUgOwotLlBHQ00gICAgPTB4MDAwMDAwNjQgOwotLlBHRVFTICAgPTB4MDAwMDAwM0EgOwotLlBHRVFWICAgPTB4MDAwMDAwM0UgOwotLlBHRVFWTCAgPTB4MDAwMDAwNDIgOwotLlBHRVQgICAgPTB4MDAwMDAwNjAgOwotLlBHUlRTICAgPTB4MDAwMDAwNDYgOwotLlBHUlRWICAgPTB4MDAwMDAwNEEgOwotLlBHUlRWTCAgPTB4MDAwMDAwNEUgOwotLlBJQUNUICAgPTB4MDAwMDAwNkMgOwotLlBJRkQgICAgPTB4MDAwMDAwNjggOwotLlBJTkRTICAgPTB4MDAwMDAwNTIgOwotLlBJTkRWICAgPTB4MDAwMDAwNTYgOwotLlBJTkRWTCAgPTB4MDAwMDAwNUEgOwotLlBJTkRXICAgPTB4MDAwMDAwRDYgOwotLlBMRENTICAgPTB4MDAwMDAwNUUgOwotLlBMRENWICAgPTB4MDAwMDAwNjIgOwotLlBMRVFTICAgPTB4MDAwMDAwNjYgOwotLlBMRVFWICAgPTB4MDAwMDAwNkEgOwotLlBMRVFWTCAgPTB4MDAwMDAwNkUgOwotLlBMRVNTICAgPTB4MDAwMDAwNzIgOwotLlBMRVNWICAgPTB4MDAwMDAwNzYgOwotLlBMRVNWTCAgPTB4MDAwMDAwN0EgOwotLlBMT0RTICAgPTB4MDAwMDAwN0UgOwotLlBMT0RWICAgPTB4MDAwMDAwODIgOwotLlBMT0RWTCAgPTB4MDAwMDAwODYgOwotLlBNT0RKICAgPTB4MDAwMDAwOEEgOwotLlBNT1YgICAgPTB4MDAwMDAwRTIgOwotLlBNUEogICAgPTB4MDAwMDAwOEUgOwotLlBORVFTICAgPTB4MDAwMDAwOTIgOwotLlBORVFWICAgPTB4MDAwMDAwOTYgOwotLlBORVFWTCAgPTB4MDAwMDAwOUEgOwotLlBORVFXICAgPTB4MDAwMDAwREEgOwotLlBQQUdFICAgPTB4MDAwMDAwRDQgOwotLlBQRUUgICAgPTB4MDAwMDAwNzAgOwotLlBQVVQgICAgPTB4MDAwMDAwNzQgOwotLlBSREIgICAgPTB4MDAwMDAwNzggOwotLlBSREMgICAgPTB4MDAwMDAwN0MgOwotLlBSREggICAgPTB4MDAwMDAwODAgOwotLlBSREkgICAgPTB4MDAwMDAwODQgOwotLlBSREogICAgPTB4MDAwMDAwODggOwotLlBSRFJTICAgPTB4MDAwMDAwQzggOwotLlBSRFMgICAgPTB4MDAwMDAwOEMgOwotLlBSRFYgICAgPTB4MDAwMDAwOTAgOwotLlBSTE4gICAgPTB4MDAwMDAwOTQgOwotLlBSUkFOICAgPTB4MDAwMDAwOTggOwotLlBSU1QgICAgPTB4MDAwMDAwOUMgOwotLlBSV1QgICAgPTB4MDAwMDAwQTAgOwotLlBTQ09OICAgPTB4MDAwMDAwOUUgOwotLlBTQ09QICAgPTB4MDAwMDAwQTIgOwotLlBTREVMICAgPTB4MDAwMDAwQTYgOwotLlBTSU5TICAgPTB4MDAwMDAwQUEgOwotLlBTTEVOICAgPTB4MDAwMDAwQUUgOwotLlBTUE9TICAgPTB4MDAwMDAwQjIgOwotLlBTVENWICAgPTB4MDAwMDAwQjYgOwotLlBTVENWTCAgPTB4MDAwMDAwQkEgOwotLlBTVE9TICAgPTB4MDAwMDAwQkUgOwotLlBTVE9WICAgPTB4MDAwMDAwQzIgOwotLlBTVE9WTCAgPTB4MDAwMDAwQzYgOwotLlBTVFJTICAgPTB4MDAwMDAwQ0EgOwotLlBTVFJWICAgPTB4MDAwMDAwQ0UgOwotLlBTVFJWTCAgPTB4MDAwMDAwRDIgOwotLlBXTE4gICAgPTB4MDAwMDAwQTQgOwotLlBXUkFOICAgPTB4MDAwMDAwQTggOwotLlBXUkIgICAgPTB4MDAwMDAwQUMgOwotLlBXUkMgICAgPTB4MDAwMDAwQjAgOwotLlBXUkggICAgPTB4MDAwMDAwQjQgOwotLlBXUkkgICAgPTB4MDAwMDAwQjggOwotLlBXUkogICAgPTB4MDAwMDAwQkMgOwotLlBXUlMgICAgPTB4MDAwMDAwQzAgOwotLlBXUlYgICAgPTB4MDAwMDAwQzQgOwotCi0vKgotLlBBRkk9MHggICA9IDB4MDA7Ci0uUENISU8gICA9MHggMHgwMDAwMDA7Ci0uUENMTyAgICA9MHggNjQgOwotLlBDOwotLlBDVlRTVSAgPTB4IDB4MDAwMDAwOwotLlBDVlRTViAgPTB4IDB4MDAwMDAwOwotLlBDVlRTVkwgPTB4IDB4MDAwMDAwOwotLlBDVlRVUyAgPTB4IDE1OCA7Ci0uUDsKLS5QRElTTCAgID0weCAweDAwMDAwMDsKLS5QRFZKICAgID0weCAweDAwMDAwMDsKLS5QRUlPICAgID0weCAweDAwMDAwMDsKLS5QRU9GICAgID0weCAweDAwMDAwMDsKLS5QRU9MICAgID0weCAweDAwMDAwMDsKLS5QRVFVUyAgID0weCAweDAwMDAwMDsKLS5QRVFVViAgID0weCAweDAwMDAwMDsKLS5QRVFVVkwgID0weCAweDAwMDAwMDsKLS5QRVFVVyAgID0weCAweDAwMDAwMDsKLS5QR0NNICAgID0weCAweDAwMDAwMDsKLS5QR0VRUyAgID0weCAweDAwMDAwMDsKLS5QR0VRViAgID0weCAweDAwMDAwMDsKLS5QR0VRVkwgID0weCAweDAwMDAwMDsKLS5QR0VUICAgID0weCAweDAwMDAwMDsKLS5QR1JUUyAgID0weCAweDAwMDAwMDsKLS5QR1JUViAgID0weCAweDAwMDAwMDsKLS5QR1JUVkwgID0weCAweDAwMDAwMDsKLS5QSUFDVCAgID0weCAweDAwMDAwMDsKLS5QSUZEICAgID0weCAxMjYgOwotLlA7Ci0uUElORFYgICA9MHggMHgwMDAwMDA7Ci0uUElORFZMICA9MHggMHgwMDAwMDA7Ci0uUElORFcgICA9MHggMHgwMDAwMDA7Ci0uUExEQ1MgICA9MHggMHgwMDAwMDA7Ci0uUExEQ1YgICA9MHggMHgwMDAwMDA7Ci0uUExFUVMgICA9MHggMHgwMDAwMDA7Ci0uUExFUVYgICA9MHggMHgwMDAwMDA7Ci0uUExFUVZMICA9MHggMHgwMDAwMDA7Ci0uUExFU1MgICA9MHggMHgwMDAwMDA7Ci0uUExFU1YgICA9MHggMHgwMDAwMDA7Ci0uUExFU1ZMICA9MHggMHgwMDAwMDA7Ci0uUExPRFMgICA9MHggMHgwMDAwMDA7Ci0uUExPRFYgICA9MHggMHgwMDAwMDA7Ci0uUExPRFZMICA9MHggMHgwMDAwMDA7Ci0uUE1PREogICA9MHggMHgwMDAwMDA7Ci0uUE1PViAgICA9MHggMHgwMDAwMDA7Ci0uUE1QSiAgICA9MHggMHgwMDAwMDA7Ci0uUE5FUVMgICA9MHggMHgwMDAwMDA7Ci0uUE5FUVYgICA9MHggMHgwMDAwMDA7Ci0uUE5FUVZMICA9MHggMHgwMDAwMDA7Ci0uUE5FUVcgICA9MHggMHgwMDAwMDA7Ci0uUFBBR0UgICA9MHggMHgwMDAwMDA7Ci0uUFBFRSAgICA9MHggMHgwMDAwMDA7Ci0uUFBVVCAgICA9MHggMHgwMDAwMDA7Ci0uUFJEQiAgICA9MHggMHgwMDAwMDA7Ci0uUFJEQyAgICA9MHggMHgwMDAwMDA7Ci0uUFJESCAgICA9MHggMHgwMDAwMDA7Ci0uUFJESSAgICA9MHggMHgwMDAwMDA7Ci0uUFJESiAgICA9MHggMHgwMDAwMDA7Ci0uUFJEUlMgICA9MHggMHgwMDAwMDA7Ci0uUFJEUyAgICA9MHggMHgwMDAwMDA7Ci0uUFJEViAgICA9MHggMHgwMDAwMDA7Ci0uUFJMTiAgICA9MHggMHgwMDAwMDA7Ci0uUFJSQU4gICA9MHggMHgwMDAwMDA7Ci0uUFJTVCAgICA9MHggMHgwMDAwMDA7Ci0uUFJXVCAgICA9MHggMHgwMDAwMDA7Ci0uUFNDT04gICA9MHggMHgwMDAwMDA7Ci0uUFNDT1AgICA9MHggMHgwMDAwMDA7Ci0uUFNERUwgICA9MHggMHgwMDAwMDA7Ci0uUFNJTlMgICA9MHggMHgwMDAwMDA7Ci0uUFNMRU4gICA9MHggMHgwMDAwMDA7Ci0uUFNQT1MgICA9MHggMHgwMDAwMDA7Ci0uUFNUQ1YgICA9MHggMHgwMDAwMDA7Ci0uUFNUQ1ZMICA9MHggMHgwMDAwMDA7Ci0uUFNUT1MgICA9MHggMHgwMDAwMDA7Ci0uUFNUT1YgICA9MHggMHgwMDAwMDA7Ci0uUFNUT1ZMICA9MHggMHgwMDAwMDA7Ci0uUFNUUlMgICA9MHggMHgwMDAwMDA7Ci0uUFNUUlYgICA9MHggMHgwMDAwMDA7Ci0uUFNUUlZMICA9MHggMHgwMDAwMDA7Ci0uUFdMTiAgICA9MHggMHgwMDAwMDA7Ci0uUFdSQU4gICA9MHggMHgwMDAwMDA7Ci0uUFdSQiAgICA9MHggMHgwMDAwMDA7Ci0uUFdSQyAgICA9MHggMHgwMDAwMDA7Ci0uUFdSSCAgICA9MHggMHgwMDAwMDA7Ci0uUFdSSSAgICA9MHggMHgwMDAwMDA7Ci0uUFdSSiAgICA9MHggMHgwMDAwMDA7Ci0uUFdSUyAgICA9MHggMHgwMDAwMDA7Ci0uUFdSViAgICA9MHggMHgwMDAwMDA7Ci0KLSovCi0vKgotLlA9MHggICAgICA9IDA7Ci0uUENISU8gICA9MHggMHhmZWVkZmE7Ci0uUENMTyAgICA9MHggMHhmZWVkZmE7Ci0uUENWQlNWICA9MHggMHhmZWVkZmE7Ci0uUENWVFNVICA9MHggMHhmZWVkZmE7Ci0uUENWVFNWICA9MHggMHhmZWVkZmE7Ci0uUENWVFNWTCA9MHggMHhmZWVkZmE7Ci0uUENWVFVTICA9MHggMHhmZWVkZmE7Ci0uUERJUyAgICA9MHggMHhmZWVkZmE7Ci0uUERJU0wgICA9MHggMHhmZWVkZmE7Ci0uUERWSiAgICA9MHggMHhmZWVkZmE7Ci0uUEVJTyAgICA9MHggMHhmZWVkZmE7Ci0uUEVPRiAgICA9MHggMHhmZWVkZmE7Ci0uUEVPTCAgICA9MHggMHhmZWVkZmE7Ci0uUEVRVVMgICA9MHggMHhmZWVkZmE7Ci0uUEVRVVYgICA9MHggMHhmZWVkZmE7Ci0uUEVRVVZMICA9MHggMHhmZWVkZmE7Ci0uUEVRVVcgICA9MHggMHhmZWVkZmE7Ci0uUEdDTSAgICA9MHggMHhmZWVkZmE7Ci0uUEdFUVMgICA9MHggMHhmZWVkZmE7Ci0uUEdFUVYgICA9MHggMHhmZWVkZmE7Ci0uUEdFUVZMICA9MHggMHhmZWVkZmE7Ci0uUEdFVCAgICA9MHggMHhmZWVkZmE7Ci0uUEdSVFMgICA9MHggMHhmZWVkZmE7Ci0uUEdSVFYgICA9MHggMHhmZWVkZmE7Ci0uUEdSVFZMICA9MHggMHhmZWVkZmE7Ci0uUElBQ1QgICA9MHggMHhmZWVkZmE7Ci0uUElGRCAgICA9MHggMHhmZWVkZmE7Ci0uUElORFMgICA9MHggMHhmZWVkZmE7Ci0uUElORFYgICA9MHggMHhmZWVkZmE7Ci0uUElORFZMICA9MHggMHhmZWVkZmE7Ci0uUElORFcgICA9MHggMHhmZWVkZmE7Ci0uUExEQ1MgICA9MHggMHhmZWVkZmE7Ci0uUExEQ1YgICA9MHggMHhmZWVkZmE7Ci0uUExFUVMgICA9MHggMHhmZWVkZmE7Ci0uUExFUVYgICA9MHggMHhmZWVkZmE7Ci0uUExFUVZMICA9MHggMHhmZWVkZmE7Ci0uUExFU1MgICA9MHggMHhmZWVkZmE7Ci0uUExFU1YgICA9MHggMHhmZWVkZmE7Ci0uUExFU1ZMICA9MHggMHhmZWVkZmE7Ci0uUExPRFMgICA9MHggMHhmZWVkZmE7Ci0uUExPRFYgICA9MHggMHhmZWVkZmE7Ci0uUExPRFZMICA9MHggMHhmZWVkZmE7Ci0uUE1PREogICA9MHggMHhmZWVkZmE7Ci0uUE1PViAgICA9MHggMHhmZWVkZmE7Ci0uUE1QSiAgICA9MHggMHhmZWVkZmE7Ci0uUE5FUVMgICA9MHggMHhmZWVkZmE7Ci0uUE5FUVYgICA9MHggMHhmZWVkZmE7Ci0uUE5FUVZMICAgID0gMHhmZWVkZmFjZTsKLS5QTkVRVyAgICAgPSAweGZlZWRmYWNlOwotLlBQQUdFICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFBFRSAgICAgID0gMHhmZWVkZmFjZTsKLS5QUFVUICAgICAgPSAweGZlZWRmYWNlOwotLlBSREIgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEQyAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRIICAgICAgPSAweGZlZWRmYWNlOwotLlBSREkgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJESiAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRSUyAgICAgPSAweGZlZWRmYWNlOwotLlBSRFMgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEViAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkxOICAgICAgPSAweGZlZWRmYWNlOwotLlBSUkFOICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJTVCAgICAgID0gMHhmZWVkZmFjZTsKLS5QUldUICAgICAgPSAweGZlZWRmYWNlOwotLlBTQ09OICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNDT1AgICAgID0gMHhmZWVkZmFjZTsKLS5QU0RFTCAgICAgPSAweGZlZWRmYWNlOwotLlBTSU5TICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNMRU4gICAgID0gMHhmZWVkZmFjZTsKLS5QU1BPUyAgICAgPSAweGZlZWRmYWNlOwotLlBTVENWICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUQ1ZMICAgID0gMHhmZWVkZmFjZTsKLS5QU1RPUyAgICAgPSAweGZlZWRmYWNlOwotLlBTVE9WICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUT1ZMICAgID0gMHhmZWVkZmFjZTsKLS5QU1RSUyAgICAgPSAweGZlZWRmYWNlOwotLlBTVFJWICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUUlZMICAgID0gMHhmZWVkZmFjZTsKLS5QV0xOICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkFOICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSQiAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JDICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkggICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSSSAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JKICAgICAgPSAweGZlZWRmYWNlOwotLlBXUlMgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSViAgICAgID0gMHhmZWVkZmFjZTsKLSovCi0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi5vb2sgYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDIub29rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2YyNGE1Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi5vb2sKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi1TMDEyMDAwMDY5NkU2OTc0NzQ2NTczNzQ1RjY1NzA2MzJFNzM3MkNGDQotUzExODAwMDAwMDAwMDAwMDQ5NEU0OTU0NTQ0NTUzNTQyMDIwNTA0MTMwMzUyMDIwNTJBQg0KLVMxMTgwMDE1MzEzMzJFMzMyMDIwMjAyMDIwMjAyMDUyMzEzMzJFMzIyMDIwMjAyMDIwNzcNCi1TMTE4MDAyQTIwMjAwMDkzNEI1QjAwQjVFNkMxMUIwODlERDYwMDAwNTQwMDAwMDAwNUY5DQotUzExODAwM0Y1QTAwMDAwMDQ4MDA1QzAwQTYwMDAwMDEwQTAxMjYwMDA0MDAwMTAwMDJDQg0KLVMxMTgwMDU0MDA5MDAwMDAwMDAwMDAwMDAwMDAwMDAyMDA0MDIwMjAwMDAwNDk0RjVGOEENCi1TMTE4MDA2OTUyNDU1MzQ1NTI1NjQxNTI1NDRDNDk0MjQzNEY0RTAwNDA0ODQ1MDEwMDNCDQotUzExODAwN0U1MDVGNDE0QzRDMjAyMDIwMjAyMDUyNTQ0QzQ5NDI0MzRGNEUwMTAwMDBFMw0KLVMxMTgwMDkzMDAwMDlDMDEwMDAwMDAwMDAwMDAwODUzNDU1MDQxNTI0MTU0NDUwMDA4NTINCi1TMTE4MDBBODAwMDgwMDQwMzFDRjUyNTQ0QzQ5NDI0MzRGNEUwMDA0RTVFQzUyNTQ0Q0QzDQotUzExODAwQkQ0OTQyNDM0RjRFMDBCNUU4NkQ1MzQxNDY0NTUzNTQ0RjUyMDAwMDRGMjhENw0KLVMxMTgwMEQyNTM1OTUzNTQ0NTRENDk0RDAwQjVFODczNTM0MTQ2NDU1MzU0NEY1MjAwMjMNCi1TMTE4MDBFNzQwMzFEMjUyNTQ0QzQ5NDI0MzRGNEUwMDAwMEE3RDUyNTQ0QzQ5NDI1MzA5DQotUzExODAwRkM1NDUyMDAxMEE0QTg1MjU0NEM0OTQyNDY0OTRDMDAwMTAwQjVFNkMwNDlFQw0KLVMxMTgwMTExNEU0OTU0NTQ0NTUzNTQyMDIwMDAwMDA2MTYwMjAwMDgwMDAwMDAwMjMyMTANCi1TMTE4MDEyNjAwNDgwMDAwMDAwMDRFNTZGRkYwQkE4RjYzMDYyRTRFNjEwMDAwQkM0MTU5DQotUzExODAxM0JGQTAwRjQ0M0VFRkZGMDMyRDgyRDdDMDAwMDAwMDFGRkZDMjA2RTAwMDg1OA0KLVMxMTgwMTUwMjAwODY2MDQ2MTAwMDBCQTIyMkVGRkZDNTM4MTRBODE2QzA0NjEwMDAwMkUNCi1TMTE4MDE2NTlFMjI0OEQzRTlGRkZDNDFGMDE4MDBCM0M4NjNFRTRBMTA2NjAwMDAwNkU3DQotUzExODAxN0E2MDAwMDA2MjQxRUVGRkYwMjY2QzAwMzg0RUFCMDA3RTIwNkUwMDA4MjA5NQ0KLVMxMTgwMThGMDg2NjA0NjEwMDAwN0MyMjJFRkZGQzUzODE0QTgxNkMwNDYxMDAwMDYwRUQNCi1TMTE4MDFBNDIyNDhEM0U5RkZGQzQxRjAxODAwQjNDODYzRUUxRjEwM0YzQzAwMDEyNjNCDQotUzExODAxQjk2QzAwMzg0RUFCMDA5RTQxRUVGRkYwNzAwQzI2NkMwMDM4NEVBQjAwQ0FDQg0KLVMxMTgwMUNFNTJBRUZGRkMwQ0FFMDAwMDAwMEFGRkZDNkYwMEZGNzA0MUVFRkZGMDQzMUYNCi1TMTE4MDFFM0VFMDAwQzIyRDgyMkQ4MjJEODRFNUUyMDVGNTg4RjRFRDAyQjU3RkZGMjc4DQotUzExODAxRjgyRjNDMDAwMDAwMEE2MDAwMDAxRTJCNTdGRkYyMkYzQzAwMDAwMDBGNjBBRQ0KLVMxMTgwMjBEMDAwMDEwMkI1N0ZGRjIyRjNDMDAwMDAwMTA2MDAwMDAwMjNCNkYwMDAyQ0MNCi1TMTE4MDIyMkZGRjYyRjJEMDAzODJGMkQwMDM0NEU0QzRFNEEwMDAwNEZFREZFRUEyMDM0DQotUzExODAyMzczQzAwMDAwMDhBMjA0RjQyNTg1MUM4RkZGQzQ4NkRGRUVBMUYzQzAwMDRDRg0KLVMxMTgwMjRDM0YzQzAwMDE5RkZDMDAwMDAwMEMyMjRGNDVGQTAyRDQyMkRBMjJEQTIyRDYNCi1TMTE4MDI2MURBMjY2QzAwNDAyRjBDMjg2QzAwNDQ0RUFCMDA2ODQ4NkRGRkI4NDg2RDQzDQotUzExODAyNzZGRkI0MkYwQzIwNkMwMDA4Mjg2QzAwMEM0RTkwOUZGQzAwMDAwMDUyMkY1Mw0KLVMxMTgwMjhCMkRGRkM2MkYwQzIwNkMwMDEwMjg2QzAwMTQ0RTkwNzA1MjI2NkMwMDM4N0YNCi1TMTE4MDJBMDRFQUIwMDFFNDFGQTAyOTQyNjZDMDAzODRFQUIwMDdFMjY2QzAwMzg0RTA0DQotUzExODAyQjVBQjAwOUU0MUVERkZCQTI2NkMwMDM4NEVBQjAwN0UyNjZDMDAzODRFQUJGQw0KLVMxMTgwMkNBMDA5RTFGM0MwMDI4M0YzQzAwMDEyNjZDMDAzODRFQUIwMDlFOUZGQzAwODINCi1TMTE4MDJERjAwMDA1MjMwMkRGRkNBNDhDMDJGMDAyRjBDMjA2QzAwMTAyODZDMDAxNEQ4DQotUzExODAyRjQ0RTkwNzA1MjI2NkMwMDM4NEVBQjAwMUUyNjZDMDAzODRFQUIwMDlFNDFDRQ0KLVMxMTgwMzA5RkEwMjM0MjY2QzAwMzg0RUFCMDA3RTI2NkMwMDM4NEVBQjAwOUU0MUVEREINCi1TMTE4MDMxRUZGODA3MDE2MjY2QzAwMzg0RUFCMDBDQTlGRkMwMDAwMDAwRTYxMDAwMjI4DQotUzExODAzMzMyODQxRURGRjlFMjBERjIwREYyMERGMzBERjRBMkRGRjlFNjcwMDAwM0FGRA0KLVMxMTgwMzQ4NTk4RjJGMkRGRkEwMkYyREZGQTgyRjBDMjA2QzAwMTgyODZDMDAxQzRFRDkNCi1TMTE4MDM1RDkwMDFCODJCNUZGRjlBMkYyREZGOUEyRjJERkZBNDJGMkRGRkE4MkYwQ0U5DQotUzExODAzNzIyMDZDMDAyMDI4NkMwMDI0NEU5MDYwMDAwMDM0NTk4RjJGMkRGRkEwNDg3MQ0KLVMxMTgwMzg3NkRGRkE4MkYwQzIwNkMwMDI4Mjg2QzAwMkM0RTkwMkI1RkZGOTYyRjJENDENCi1TMTE4MDM5Q0ZGQTQyRjJERkY5NjJGMkRGRkE4MkYwQzIwNkMwMDIwMjg2QzAwMjQ0RUM0DQotUzExODAzQjE5MDQ4NkRGRUVBOUZGQzAwMDAwMDUyMjA0RjQzRURGRjgwMzAxOTcyNTBGMA0KLVMxMTgwM0M2OTI0MDZGMDI0MjQxRDA0MTMwQzA2RjBBNTM0MEUyNDAzMEQ5NTFDOEZGMDgNCi1TMTE4MDNEQkZDOUZGQzAwMDAwMDUyMjI0RjQ1RkEwMTVDMzJEQTI2NkMwMDQwMkYwQ0ZBDQotUzExODAzRjAyODZDMDA0NDRFQUIwMDUwMDEyQzQ4NkRGRUVBMjY2QzAwNDAyRjBDMjhENA0KLVMxMTgwNDA1NkMwMDQ0NEVBQjAwQTAwMTE4NDg3QTAxMzQzRjNDRkZGRjQ4NkRGRUVBNkYNCi1TMTE4MDQxQTI2NkMwMDQwMkYwQzI4NkMwMDQ0NEVBQjAwQzAwMEZDNDg2REZFRUEyNjZDDQotUzExODA0MkY2QzAwNDAyRjBDMjg2QzAwNDQ0RUFCMDBBNDAwRTg0MkFERkZCMDJCN0MyQg0KLVMxMTgwNDQ0MDAwMDAwMDFGRkFDNTk4RjJGMkRGRkFDNjEwMDAxN0UyQjVGRkZCMDJCQzANCi1TMTE4MDQ1OTQwRkZCMDJGMkRGRkFDM0YzQzAwMEE0ODZERkVFQTI2NkMwMDQwMkYwQzY1DQotUzExODA0NkUyODZDMDA0NDRFQUIwMEJDMDBBRTlGRkMwMDAwMDAwQzJGMkRGRkIwNjEyNw0KLVMxMTgwNDgzMDBGQ0E4MkYwRjNGM0MwMDBBNDg2REZFRUEyNjZDMDA0MDJGMEMyODZDQkINCi1TMTE4MDQ5ODAwNDQ0RUFCMDBDMDAwODZERkZDMDAwMDAwMEM0ODZERkVFQTI2NkMwMEIyDQotUzExODA0QUQ0MDJGMEMyODZDMDA0NDRFQUIwMEE0MDA2QzUyQURGRkFDMENBRDAwMDA3Nw0KLVMxMTgwNEMyMDAwQUZGQUM2RjgyNDg2REZFRUExRjNDMDAwMTI2NkMwMDQwMkYwQzI4NEQNCi1TMTE4MDRENzZDMDA0NDRFQUIwMDU0NDg2REZGQjg0ODZERkZCNDJGMEMyMDZDMDAzMDQ0DQotUzExODA0RUMyODZDMDAzNDRFOTA0ODZERkVFQTQyMjcyNjZDMDA0MDJGMEMyODZDMDBBQQ0KLVMxMTgwNTAxNDQ0RUFCMDA1NDQyQTcyRjJEMDAzODJGMkQwMDM0NEU0QTJCNTdGRkYyMzgNCi1TMTE4MDUxNjJGM0MwMDAwMDAwQzYwMDBGRDAwMkI1N0ZGRjIyRjNDMDAwMDAwNjQ2MDU2DQotUzExODA1MkIwMEZDRjIwMDBBNDYzMTIwMjAyMDIwMjAyMDIwMjAwMDAyM0EzQTAwMDJEMA0KLVMxMTgwNTQwMjkzQTAwMDAwMDE0MjAyMDIwMjAyMDIwNDM2MTczNjUyMDIwMjAyMDUyMUQNCi1TMTE4MDU1NTY1NzM3NTZDNzQ0MUZBMDAwNEQxRkNGRkZGRkFBMDIwMjgwMDNDNDNGQUZCDQotUzExODA1NkEwMDA0RDNGQzAwMDAwMUQ2NDVGQTAwMDRENUZDMDAwMDAyNUUyNjBBNThEMg0KLVMxMTgwNTdGOEFEMDg4NTU4MDIyMjgwMDU2NjYwMDAwMkUyNDA4MjY1QUQ1QjBCODAwOEYNCi1TMTE4MDU5NEI1QzA2REY2MjIwOTkyODgyMTQxMDA1NjQyODEyNjQ4RDI1QkI3Qzk2RDJFDQotUzExODA1QTlGQTQ0NDFEMzY4MDA1QTEyM0MwMDAxNjAwMDAwMDQ0MjQxMUY0MTAwMDQ4Qg0KLVMxMTgwNUJFMkY2ODAwMzQwMDA2MkY0OTAwMEE5Njg5MkY0MzAwMEU0RTc1NEU1NkZGQ0MNCi1TMTE4MDVEM0YwMjAyRTAwMDg0N0ZBMDAwNEQ3RkMwMDAwMDFBNjIyMEI0MUZBMDAwNDlFDQotUzExODA1RThEMUZDMDAwMDAxQjYyRDU4RkZGMDJENThGRkY0MkQ1OEZGRjgyRDUwRkY5Mg0KLVMxMTgwNUZERkM1MzgwNzQwOEI0ODA2NTAwMDEyQzQxRkEwMDA0RDFGQzAwMDAwMDBFQkENCi1TMTE4MDYxMkQwODAzMDMwMDgwMDRFRkIwMDAyMDAxMjAwMjIwMDMyMDA0MjAwNDgwMERDDQotUzExODA2Mjc1ODAwNkMwMEEwMDBEQzQxRkEwMDA0RDFGQzAwMDAwMTE4MjAxMDYwMDBDNQ0KLVMxMTgwNjNDMDEwMjQ3RkEwMDA0RDdGQzAwMDAwMTBDMjAwQjYwMDAwMEYyNDFGQTAwQzUNCi1TMTE4MDY1MTA0RDFGQzAwMDAwMTEwMjAxMDYwMDAwMEUyMjAwMTYwMDAwMERDNDdGQTlFDQotUzExODA2NjYwMDA0RDdGQzAwMDAwMTIwMjAwQjYwMDAwMENDNDNGQTAwMDREM0ZDMDAxQw0KLVMxMTgwNjdCMDAwMEZBNDFFOTAwMEMyMDEwNjAwMDAwQjgyNDJFRkZGNDQ3RkEwMDA0NjQNCi1TMTE4MDY5MEQ3RkMwMDAwMDBGRUI0OEI2NjAwMDAxMjQ3RkEwMDA0RDdGQzAwMDAwMUIwDQotUzExODA2QTUxNDIwMEI2MDAwMDA5NDQ3RkEwMDA0RDdGQzAwMDAwMTBBMjAwQjYwMDA1Qg0KLVMxMTgwNkJBMDA4NDQxRkEwMDA0RDFGQzAwMDAwMDhBMjA1MDQ3RkEwMDA0RDdGQzAwODUNCi1TMTE4MDZDRjAwMDA4MkIxQ0I2NjAwMDAxMjQ3RkEwMDA0RDdGQzAwMDAwMEUwMjAwQjc5DQotUzExODA2RTQ2MDAwMDA1ODQ3RkEwMDA0RDdGQzAwMDAwMEQyMjAwQjYwMDAwMDQ4NDE0Nw0KLVMxMTgwNkY5RkEwMDA0RDFGQzAwMDAwMDRFNDNGQTAwMDREM0ZDMDAwMDAwM0VCM0QwRkUNCi1TMTE4MDcwRTY2MDAwMDEyNDdGQTAwMDREN0ZDMDAwMDAwQUUyMDBCNjAwMDAwMUU0N0E0DQotUzExODA3MjNGQTAwMDREN0ZDMDAwMDAwQTYyMDBCNjAwMDAwMEU0N0ZBMDAwNEQ3RkM5NQ0KLVMxMTgwNzM4MDAwMDAwOTgyMDBCNEU1RTRFNzQwMDA0MDAwMDUzNzU2RTY1MDAwMDAwRDgNCi1TMTE4MDc0RDAwMDc0NjRGNzQ3NDZGMDAwMDAwMDAwMDBBMDAwMDAwMEM1MDY1NkM2Q0ZEDQotUzExODA3NjI2NTAwMDAwMDA3NUU1Mzc0Njk2RTYxMDA0QjYxNzI2OTZFMDAwMDAwMDBDMA0KLVMxMTgwNzc3MDUwMDAwMDc2ODAwMDAwMDAzMDAwMDA3NkU1MDc1NzQ3NDY1MDA0QjYxQkYNCi1TMTE4MDc4QzZDNkM2NTAwNTM3NDY5NkU2MTMxMDAwMDRCNjE3MjY5NkUzMTAwMDAwMEMxDQotUzExODA3QTEwMDAwMzMwMDAwMDc5MDAwMDAwMDFGMDAwMDA3OTg3ODc5N0E3QTAwMDBEMg0KLVMxMTgwN0I2NEY2QzZDNjUwMDAwMzcwMDM4MDA1MDY1NzQ2NTcyMDA1Mzc2NzU2QzZDMTkNCi1TMTE4MDdDQjZGMDAwMDM5MDA1MzZDNzU3NDAwMDAwMDAwMDAwMDAwMDAwNzRDMDAwMDcyDQotUzExNTA3RTAwNzY0MDAwMDA3NzgwMDAwMDc4MDAwMDAwN0E0MDAwMDA3QUMzNA0KLVM5MDMwMDAwRkMNCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdmVyc2Fkb3MuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3ZlcnNhZG9zLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQyYzA2Ni4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdmVyc2Fkb3MuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBsZC12ZXJzYWRvcyB0ZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIChzYWNAY3lnbnVzLmNvbSkKLSMKLQotIyBNYWtlIHN1cmUgdGhhdCBsZCBjYW4gcmVhZCB2ZXJzYWRvcyBpbWFnZXMgYW5kCi0jIGdlbmVyYXRlIGJpbmFyaWVzIHdoaWNoIGFyZSBpZGVudGljYWwgdG8gdGhlIGN1c3RvbWVyJ3MKLSMgb2xkIG1ldGhvZC4KLQotIyBUaGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIGlmIGxkIGdlbmVyYXRlcyBuYXRpdmUgZXhlY3V0YWJsZXMuCi0KLSMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBvbiA2OGsgY29mZiB0YXJnZXRzCi0jIFNxdWFyZSBicmFja2V0IGV4cHJlc3Npb25zIHNlZW0gdG8gY29uZnVzZSBpc3RhcmdldC4KLWlmIHsgIVtpc3RhcmdldCBtNjhrLSotY29mZipdIH0gdGhlbiB7Ci0gICAgcmV0dXJuCi19Ci0KLXNldCB0ZXN0bmFtZSAiTEQgVkVSU0FET1MiCi0KLQotcHJvYyBpbnNwZWN0IHsgd2hpY2hvbmUgfSB7Ci0gICAgZ2xvYmFsIG9iamR1bXAKLSAgICBnbG9iYWwgZXhlY19vdXRwdXQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCB0ZXN0bmFtZQotCi0gICAgc2VuZF9sb2cgIiRvYmpkdW1wIC1zIHRtcGRpci8kd2hpY2hvbmUub3V0ID50bXBkaXIvJHdoaWNob25lLmR1bXBcbiIKLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAtcyB0bXBkaXIvJHdoaWNob25lLm91dCB8IGdyZXAgLXYgc3JlYyA+dG1wZGlyLyR3aGljaG9uZS5kdW1wIiBleGVjX291dHB1dAotCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgJGV4ZWNfb3V0cHV0Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIHNlbmRfbG9nICIkb2JqZHVtcCAtcyAkc3JjZGlyLyRzdWJkaXIvJHdoaWNob25lLm9vayA+dG1wZGlyLyR3aGljaG9uZS5kb2tcbiIKLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAtcyAkc3JjZGlyLyRzdWJkaXIvJHdoaWNob25lLm9vayB8IGdyZXAgLXYgc3JlYyA+dG1wZGlyLyR3aGljaG9uZS5kb2siIGV4ZWNfb3V0cHV0Ci0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAkZXhlY19vdXRwdXQKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotCXJldHVybiAwCi0gICAgfQotCi0gICAgIyBjb21wYXJlIGl0IHdpdGggdGhlIGNvcnJlY3Qgb3V0cHV0Ci0gICAgY2F0Y2ggImV4ZWMgZGlmZiB0bXBkaXIvJHdoaWNob25lLmR1bXAgdG1wZGlyLyR3aGljaG9uZS5kb2siIGV4ZWNfb3V0cHV0Ci0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgJGV4ZWNfb3V0cHV0Ci0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIHJldHVybiAxCi19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci90MS5vdXQgXAotCSIgLVQgJHNyY2Rpci8kc3ViZGlyL3QxLmxkICRzcmNkaXIvJHN1YmRpci90MS0xLnJvICAkc3JjZGlyLyRzdWJkaXIvdDEtMi5ybyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfSBlbHNlIHsKLSAgICAjIEdldCBhIGR1bXAgb2Ygd2hhdCB3ZSd2ZSBnb3QsIGFuZCB3aGF0IHdlIHNob3VsZCBoYXZlCi0gICAgaWYgIVtpbnNwZWN0IHQxXSB7Ci0JcmV0dXJuCi0gICAgfQotfQotCi0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkICB0bXBkaXIvdDIub3V0IFwKLQkiIC1UICRzcmNkaXIvJHN1YmRpci90Mi5sZCAkc3JjZGlyLyRzdWJkaXIvdDItMi5ybyBcCi0JJHNyY2Rpci8kc3ViZGlyL3QyLTEucm8gICRzcmNkaXIvJHN1YmRpci90Mi0zLnJvIl0gewotICAgIGZhaWwgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19IGVsc2UgewotICAgICMgR2V0IGEgZHVtcCBvZiB3aGF0IHdlJ3ZlIGdvdCwgYW5kIHdoYXQgd2Ugc2hvdWxkIGhhdmUKLSAgICBpZiAhW2luc3BlY3QgdDJdIHsKLQlyZXR1cm4KLSAgICB9Ci19Ci0KLXBhc3MgJHRlc3RuYW1lCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGliL2xkLWxpYi5leHAgYi9sZC90ZXN0c3VpdGUvbGliL2xkLWxpYi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YTQxMzEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xpYi9sZC1saWIuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLSMKLSMgZGVmYXVsdF9sZF92ZXJzaW9uIAotIwlleHRyYWN0IGFuZCBwcmludCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgbGQKLSMKLXByb2MgZGVmYXVsdF9sZF92ZXJzaW9uIHsgbGQgfSB7Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgaWYgeyBbd2hpY2ggJGxkXSA9PSAwIH0gdGhlbiB7Ci0JcGVycm9yICIkbGQgZG9lcyBub3QgZXhpc3QiCi0JZXhpdCAxCi0gICAgfQotICAgIAotICAgIGNhdGNoICJleGVjICRsZCAtLXZlcnNpb24iIHRtcAotICAgIHNldCB0bXAgW3BydW5lX3dhcm5pbmdzICR0bXBdCi0gICAgcmVnZXhwICJcW15cblxdKiAoY3lnbnVzLXwpKFxbLTAtOS5hLXpBLVotXF0rKVxbXHJcblxdLioiICR0bXAgdmVyc2lvbiBjeWcgbnVtYmVyCi0gICAgaWYgW2luZm8gZXhpc3RzIG51bWJlcl0gdGhlbiB7Ci0JY2xvbmVfb3V0cHV0ICIkbGQgJG51bWJlclxuIgotICAgIH0KLX0KLQotIwotIyBkZWZhdWx0X2xkX3JlbG9jYXRlIAotIwlsaW5rIGFuIG9iamVjdCB1c2luZyByZWxvY2F0aW9uCi0jCi1wcm9jIGRlZmF1bHRfbGRfcmVsb2NhdGUgeyBsZCB0YXJnZXQgb2JqZWN0cyB9IHsKLSAgICBnbG9iYWwgSE9TVElOR19FTVUKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgCi0gICAgaWYgeyBbd2hpY2ggJGxkXSA9PSAwIH0gdGhlbiB7Ci0JcGVycm9yICIkbGQgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuIDAKLSAgICB9Ci0gICAgCi0gICAgdmVyYm9zZSAtbG9nICIkbGQgJEhPU1RJTkdfRU1VIC1vICR0YXJnZXQgLXIgJG9iamVjdHMiCi0gICAgCi0gICAgY2F0Y2ggImV4ZWMgJGxkICRIT1NUSU5HX0VNVSAtbyAkdGFyZ2V0IC1yICRvYmplY3RzIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLQotIwotIyBkZWZhdWx0X2xkX2xpbmsgCi0jCWxpbmsgYSBwcm9ncmFtIHVzaW5nIGxkCi0jCi1wcm9jIGRlZmF1bHRfbGRfbGluayB7IGxkIHRhcmdldCBvYmplY3RzIH0gewotICAgIGdsb2JhbCBIT1NUSU5HX0VNVQotICAgIGdsb2JhbCBIT1NUSU5HX0NSVDAKLSAgICBnbG9iYWwgSE9TVElOR19MSUJTCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIAotICAgIHNldCBvYmpzICIkSE9TVElOR19DUlQwICRvYmplY3RzIgotICAgIHNldCBsaWJzICIkSE9TVElOR19MSUJTIgotICAgIAotICAgIGlmIHsgW3doaWNoICRsZF0gPT0gMCB9IHRoZW4gewotCXBlcnJvciAiJGxkIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotICAgIAotICAgIHZlcmJvc2UgLWxvZyAiJGxkICRIT1NUSU5HX0VNVSAtbyAkdGFyZ2V0ICRvYmpzICRsaWJzIgotICAgIAotICAgIGNhdGNoICJleGVjICRsZCAkSE9TVElOR19FTVUgLW8gJHRhcmdldCAkb2JqcyAkbGlicyIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXJldHVybiAwCi0gICAgfQotfQotCi0jCi0jIGRlZmF1bHRfbGRfc2ltcGxlX2xpbmsgCi0jCWxpbmsgYSBwcm9ncmFtIHVzaW5nIGxkLCB3aXRob3V0IGluY2x1ZGluZyBhbnkgbGlicmFyaWVzCi0jCi1wcm9jIGRlZmF1bHRfbGRfc2ltcGxlX2xpbmsgeyBsZCB0YXJnZXQgb2JqZWN0cyB9IHsKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgCi0gICAgaWYgeyBbd2hpY2ggJGxkXSA9PSAwIH0gdGhlbiB7Ci0JcGVycm9yICIkbGQgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuIDAKLSAgICB9Ci0gICAgCi0gICAgdmVyYm9zZSAtbG9nICIkbGQgLW8gJHRhcmdldCAkb2JqZWN0cyIKLSAgICAKLSAgICBjYXRjaCAiZXhlYyAkbGQgLW8gJHRhcmdldCAkb2JqZWN0cyIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQotICAgICMgV2UgZG9uJ3QgY2FyZSBpZiB3ZSBnZXQgYSB3YXJuaW5nIGFib3V0IGEgbm9uLWV4aXN0ZW50IHN0YXJ0Ci0gICAgIyBzeW1ib2wsIHNpbmNlIHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQgbWlnaHQgdXNlIEVOVFJZLgotICAgIHJlZ3N1YiAtYWxsICIoXnxcbikoXFteXG5cXSo6IHdhcm5pbmc6IGNhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbFxbXlxuXF0qXG4/KSIgJGV4ZWNfb3V0cHV0ICJcXDEiIGV4ZWNfb3V0cHV0Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXJldHVybiAwCi0gICAgfQotfQotCi0jCi0jIGRlZmF1bHRfbGRfY29tcGlsZSAKLSMJY29tcGlsZSBhbiBvYmplY3QgdXNpbmcgY2MKLSMKLXByb2MgZGVmYXVsdF9sZF9jb21waWxlIHsgY2Mgc291cmNlIG9iamVjdCB9IHsKLSAgICBnbG9iYWwgQ0ZMQUdTCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgZ2xvYmFsIGdjY19nYXNfZmxhZwotCi0gICAgc2V0IGNjX3Byb2cgJGNjCi0gICAgaWYge1tsbGVuZ3RoICRjY19wcm9nXSA+IDF9IHRoZW4gewotCXNldCBjY19wcm9nIFtsaW5kZXggJGNjX3Byb2cgMF0KLSAgICB9Ci0gICAgaWYge1t3aGljaCAkY2NfcHJvZ10gPT0gMH0gdGhlbiB7Ci0JcGVycm9yICIkY2NfcHJvZyBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIGNhdGNoICJleGVjIHJtIC1mICRvYmplY3QiIGV4ZWNfb3V0cHV0Ci0KLSAgICBzZXQgZmxhZ3MgIi1JJHNyY2Rpci8kc3ViZGlyICRDRkxBR1MiCi0KLSAgICAjIElmIHdlIGFyZSBjb21waWxpbmcgd2l0aCBnY2MsIHdlIHdhbnQgdG8gYWRkIGdjY19nYXNfZmxhZyB0bwotICAgICMgZmxhZ3MuICBSYXRoZXIgdGhhbiBkZXRlcm1pbmUgdGhpcyBpbiBzb21lIGNvbXBsZXggd2F5LCB3ZSBndWVzcwotICAgICMgYmFzZWQgb24gdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVyLgotICAgIGlmIHtbc3RyaW5nIG1hdGNoICIqZ2NjKiIgJGNjXSB8fCBbc3RyaW5nIG1hdGNoICIqKysqIiAkY2NdfSB0aGVuIHsKLQlzZXQgZmxhZ3MgIiRnY2NfZ2FzX2ZsYWcgJGZsYWdzIgotICAgIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJGNjICRmbGFncyAtYyAkc291cmNlIC1vICRvYmplY3QiCi0KLSAgICBjYXRjaCAiZXhlYyAkY2MgJGZsYWdzIC1jICRzb3VyY2UgLW8gJG9iamVjdCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JaWYgeyFbZmlsZSBleGlzdHMgJG9iamVjdF19IHRoZW4gewotCSAgICByZWdleHAgIi4qLyhcW14vXF0qKSQiICRzb3VyY2UgYWxsIGRvYmoKLQkgICAgcmVnc3ViICJcXC5jIiAkZG9iaiAiLm8iIHJlYWxvYmoKLQkgICAgdmVyYm9zZSAibG9va2luZyBmb3IgJHJlYWxvYmoiCi0JICAgIGlmIHtbZmlsZSBleGlzdHMgJHJlYWxvYmpdfSB0aGVuIHsKLQkJdmVyYm9zZSAtbG9nICJtdiAkcmVhbG9iaiAkb2JqZWN0IgotCQljYXRjaCAiZXhlYyBtdiAkcmVhbG9iaiAkb2JqZWN0IiBleGVjX291dHB1dAotCQlzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQkJaWYgeyFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF19IHRoZW4gewotCQkgICAgdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JCSAgICBwZXJyb3IgImNvdWxkIG5vdCBtb3ZlICRyZWFsb2JqIHRvICRvYmplY3QiCi0JCSAgICByZXR1cm4gMAotCQl9Ci0JICAgIH0gZWxzZSB7Ci0JCXBlcnJvciAiJG9iamVjdCBub3QgZm91bmQgYWZ0ZXIgY29tcGlsYXRpb24iCi0JCXJldHVybiAwCi0JICAgIH0KLQl9Ci0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXBlcnJvciAiJHNvdXJjZTogY29tcGlsYXRpb24gZmFpbGVkIgotCXJldHVybiAwCi0gICAgfQotfQotCi0jCi0jIGRlZmF1bHRfbGRfYXNzZW1ibGUKLSMJYXNzZW1ibGUgYSBmaWxlCi0jCi1wcm9jIGRlZmF1bHRfbGRfYXNzZW1ibGUgeyBhcyBzb3VyY2Ugb2JqZWN0IH0gewotICAgIGdsb2JhbCBBU0ZMQUdTCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIAotICAgIGlmIHtbd2hpY2ggJGFzXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRhcyBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIGlmICFbaW5mbyBleGlzdHMgQVNGTEFHU10geyBzZXQgQVNGTEFHUyAiIiB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRhcyAkQVNGTEFHUyAtbyAkb2JqZWN0ICRzb3VyY2UiCi0KLSAgICBjYXRjaCAiZXhlYyAkYXMgJEFTRkxBR1MgLW8gJG9iamVjdCAkc291cmNlIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcGVycm9yICIkc291cmNlOiBhc3NlbWJseSBmYWlsZWQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLSMKLSMgZGVmYXVsdF9sZF9ubQotIwlydW4gbm0gb24gYSBmaWxlLCBwdXR0aW5nIHRoZSByZXN1bHQgaW4gdGhlIGFycmF5IG5tX291dHB1dAotIwotcHJvYyBkZWZhdWx0X2xkX25tIHsgbm0gb2JqZWN0IH0gewotICAgIGdsb2JhbCBOTUZMQUdTCi0gICAgZ2xvYmFsIG5tX291dHB1dAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIGlmIHtbd2hpY2ggJG5tXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRubSBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIGlmICFbaW5mbyBleGlzdHMgTk1GTEFHU10geyBzZXQgTk1GTEFHUyAiIiB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRubSAkTk1GTEFHUyAkb2JqZWN0ID50bXBkaXIvbm0ub3V0IgotCi0gICAgY2F0Y2ggImV4ZWMgJG5tICROTUZMQUdTICRvYmplY3QgPnRtcGRpci9ubS5vdXQiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXNldCBmaWxlIFtvcGVuIHRtcGRpci9ubS5vdXQgcl0KLQl3aGlsZSB7IFtnZXRzICRmaWxlIGxpbmVdICE9IC0xIH0gewotCSAgICB2ZXJib3NlICIkbGluZSIgMgotCSAgICBpZiBbcmVnZXhwICJeKFxbMC05YS1mQS1GXF0rKSBcW2EtekEtWjAtOVxdICguKykkIiAkbGluZSB3aG9sZSB2YWx1ZSBuYW1lXSB7Ci0gICAgICAgICAgICAgICAgc2V0IG5hbWUgW3N0cmluZyB0cmltbGVmdCAkbmFtZSAiXyJdCi0JCXZlcmJvc2UgIlNldHRpbmcgbm1fb3V0cHV0KCRuYW1lKSB0byAweCR2YWx1ZSIgMgotCQlzZXQgbm1fb3V0cHV0KCRuYW1lKSAweCR2YWx1ZQotCSAgICB9Ci0JfQotCWNsb3NlICRmaWxlCi0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXBlcnJvciAiJG9iamVjdDogbm0gZmFpbGVkIgotCXJldHVybiAwCi0gICAgfQotfQotCi0jCi0jIHNpbXBsZV9kaWZmCi0jCWNvbXBhcmVzIHR3byBmaWxlcyBsaW5lLWJ5LWxpbmUKLSMJcmV0dXJucyBkaWZmZXJlbmNlcyBpZiBleGlzdAotIwlyZXR1cm5zIG51bGwgaWYgZmlsZShzKSBjYW5ub3QgYmUgb3BlbmVkCi0jCi1wcm9jIHNpbXBsZV9kaWZmIHsgZmlsZV8xIGZpbGVfMiB9IHsKLSAgICBnbG9iYWwgdGFyZ2V0Ci0JCi0gICAgc2V0IGVvZiAtMQotICAgIHNldCBkaWZmZXJlbmNlcyAwCi0gICAgCi0gICAgaWYgW2ZpbGUgZXhpc3RzICRmaWxlXzFdIHRoZW4gewotCXNldCBmaWxlX2EgW29wZW4gJGZpbGVfMSByXQotICAgIH0gZWxzZSB7Ci0Jd2FybmluZyAiJGZpbGVfMSBkb2Vzbid0IGV4aXN0IgotCXJldHVybgotICAgIH0KLSAgICAKLSAgICBpZiBbZmlsZSBleGlzdHMgJGZpbGVfMl0gdGhlbiB7Ci0Jc2V0IGZpbGVfYiBbb3BlbiAkZmlsZV8yIHJdCi0gICAgfSBlbHNlIHsKLQlmYWlsICIkZmlsZV8yIGRvZXNuJ3QgZXhpc3QiCi0JcmV0dXJuCi0gICAgfQotICAgIAotICAgIHZlcmJvc2UgIiMgRGlmZidpbmc6ICRmaWxlXzEgJGZpbGVfMlxuIiAyCi0gICAgCi0gICAgd2hpbGUgeyBbZ2V0cyAkZmlsZV9hIGxpbmVdICE9ICRlb2YgfSB7Ci0JaWYgW3JlZ2V4cCAiXiMuKiQiICRsaW5lXSB0aGVuIHsKLQkgICAgY29udGludWUKLQl9IGVsc2UgewotCSAgICBsYXBwZW5kIGxpc3RfYSAkbGluZQotCX0KLSAgICB9Ci0gICAgY2xvc2UgJGZpbGVfYQotICAgIAotICAgIHdoaWxlIHsgW2dldHMgJGZpbGVfYiBsaW5lXSAhPSAkZW9mIH0gewotCWlmIFtyZWdleHAgIl4jLiokIiAkbGluZV0gdGhlbiB7Ci0JICAgIGNvbnRpbnVlCi0JfSBlbHNlIHsKLQkgICAgbGFwcGVuZCBsaXN0X2IgJGxpbmUKLQl9Ci0gICAgfQotICAgIGNsb3NlICRmaWxlX2IKLQotICAgIGZvciB7IHNldCBpIDAgfSB7ICRpIDwgW2xsZW5ndGggJGxpc3RfYV0gfSB7IGluY3IgaSB9IHsKLQlzZXQgbGluZV9hIFtsaW5kZXggJGxpc3RfYSAkaV0KLQlzZXQgbGluZV9iIFtsaW5kZXggJGxpc3RfYiAkaV0KLQotCXZlcmJvc2UgIlx0JGZpbGVfMTogJGk6ICRsaW5lX2FcbiIgMwotCXZlcmJvc2UgIlx0JGZpbGVfMjogJGk6ICRsaW5lX2JcbiIgMwotCWlmIFtzdHJpbmcgY29tcGFyZSAkbGluZV9hICRsaW5lX2JdIHRoZW4gewotCSAgICB2ZXJib3NlIC1sb2cgIlx0JGZpbGVfMTogJGk6ICRsaW5lX2FcbiIKLQkgICAgdmVyYm9zZSAtbG9nICJcdCRmaWxlXzI6ICRpOiAkbGluZV9iXG4iCi0KLQkgICAgZmFpbCAiVGVzdDogJHRhcmdldCIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLSAgICAKLSAgICBpZiB7IFtsbGVuZ3RoICRsaXN0X2FdICE9IFtsbGVuZ3RoICRsaXN0X2JdIH0gewotCWZhaWwgIlRlc3Q6ICR0YXJnZXQiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgJGRpZmZlcmVuY2VzPDEgdGhlbiB7Ci0JcGFzcyAiVGVzdDogJHRhcmdldCIKLSAgICB9Ci19Ci0KLSMgVGhpcyBkZWZpbml0aW9uIGlzIHRha2VuIGZyb20gYW4gdW5yZWxlYXNlZCB2ZXJzaW9uIG9mIERlamFHbnUuICBPbmNlCi0jIHRoYXQgdmVyc2lvbiBnZXRzIHJlbGVhc2VkLCBhbmQgaGFzIGJlZW4gb3V0IGluIHRoZSB3b3JsZCBmb3IgYSBmZXcKLSMgbW9udGhzIGF0IGxlYXN0LCBpdCBtYXkgYmUgc2FmZSB0byBkZWxldGUgdGhpcyBjb3B5LgotaWYgIVtzdHJpbmcgbGVuZ3RoIFtpbmZvIHByb2MgcHJ1bmVfd2FybmluZ3NdXSB7Ci0gICAgIwotICAgICMgcHJ1bmVfd2FybmluZ3MgLS0gZGVsZXRlIHZhcmlvdXMgc3lzdGVtIHZlcmJvc2l0aWVzIGZyb20gVEVYVAotICAgICMKLSAgICAjIEFuIGV4YW1wbGUgaXM6Ci0gICAgIyBsZC5zbzogd2FybmluZzogL3Vzci9saWIvbGliYy5zby4xLjguMSBoYXMgb2xkZXIgcmV2aXNpb24gdGhhbiBleHBlY3RlZCA5Ci0gICAgIwotICAgICMgU2l0ZXMgd2l0aCBwYXJ0aWN1bGFyIHZlcmJvc2Ugb3MncyBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIGluIHNpdGUuZXhwLgotICAgICMKLSAgICBwcm9jIHBydW5lX3dhcm5pbmdzIHsgdGV4dCB9IHsKLQkjIFRoaXMgaXMgZnJvbSBzdW40J3MuICBEbyBpdCBmb3IgYWxsIG1hY2hpbmVzIGZvciBub3cuCi0JIyBUaGUgIlxcMSIgaXMgdG8gdHJ5IHRvIHByZXNlcnZlIGEgIlxuIiBidXQgb25seSBpZiBuZWNlc3NhcnkuCi0JcmVnc3ViIC1hbGwgIihefFxuKShsZC5zbzogd2FybmluZzpcW15cblxdKlxuPykrIiAkdGV4dCAiXFwxIiB0ZXh0Ci0KLQkjIEl0IG1pZ2h0IGJlIHRlbXB0aW5nIHRvIGdldCBjYXJyaWVkIGF3YXkgYW5kIGRlbGV0ZSBibGFuayBsaW5lcywgZXRjLgotCSMgSnVzdCBkZWxldGUgKmV4YWN0bHkqIHdoYXQgd2UncmUgYXNrIHRvLCBhbmQgdGhhdCdzIGl0LgotCXJldHVybiAkdGV4dAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9DT1BZSU5HLkxJQiBiL2xpYmliZXJ0eS9DT1BZSU5HLkxJQgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxYTNkMS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvQ09QWUlORy5MSUIKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1bVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBHUEwuICBJdCBpcwotIG51bWJlcmVkIDIgYmVjYXVzZSBpdCBnb2VzIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBvcmRpbmFyeSBHUEwuXQotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQotZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgotCi0gIFRoaXMgbGljZW5zZSwgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCi1zcGVjaWFsbHkgZGVzaWduYXRlZCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUsIGFuZCB0byBhbnkKLW90aGVyIGxpYnJhcmllcyB3aG9zZSBhdXRob3JzIGRlY2lkZSB0byB1c2UgaXQuICBZb3UgY2FuIHVzZSBpdCBmb3IKLXlvdXIgbGlicmFyaWVzLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYKLXlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcwotb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoteW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQotY29kZS4gIElmIHlvdSBsaW5rIGEgcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCi1jb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQotd2l0aCB0aGUgbGlicmFyeSwgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCi1pdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotICBPdXIgbWV0aG9kIG9mIHByb3RlY3RpbmcgeW91ciByaWdodHMgaGFzIHR3byBzdGVwczogKDEpIGNvcHlyaWdodAotdGhlIGxpYnJhcnksIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwKLXBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgotCi0gIEFsc28sIGZvciBlYWNoIGRpc3RyaWJ1dG9yJ3MgcHJvdGVjdGlvbiwgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1saWJyYXJ5LiAgSWYgdGhlIGxpYnJhcnkgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsCi12ZXJzaW9uLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uCi10aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0MCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgY29tcGFuaWVzIGRpc3RyaWJ1dGluZyBmcmVlCi1zb2Z0d2FyZSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCB0aHVzIGluIGVmZmVjdAotdHJhbnNmb3JtaW5nIHRoZSBwcm9ncmFtIGludG8gcHJvcHJpZXRhcnkgc29mdHdhcmUuICBUbyBwcmV2ZW50IHRoaXMsCi13ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MKLWZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aGljaCB3YXMgZGVzaWduZWQgZm9yIHV0aWxpdHkgcHJvZ3JhbXMuICBUaGlzCi1saWNlbnNlLCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluCi1kZXNpZ25hdGVkIGxpYnJhcmllcy4gIFRoaXMgbGljZW5zZSBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkKLW9uZTsgYmUgc3VyZSB0byByZWFkIGl0IGluIGZ1bGwsIGFuZCBkb24ndCBhc3N1bWUgdGhhdCBhbnl0aGluZyBpbiBpdCBpcwotdGhlIHNhbWUgYXMgaW4gdGhlIG9yZGluYXJ5IGxpY2Vuc2UuCi0KLSAgVGhlIHJlYXNvbiB3ZSBoYXZlIGEgc2VwYXJhdGUgcHVibGljIGxpY2Vuc2UgZm9yIHNvbWUgbGlicmFyaWVzIGlzIHRoYXQKLXRoZXkgYmx1ciB0aGUgZGlzdGluY3Rpb24gd2UgdXN1YWxseSBtYWtlIGJldHdlZW4gbW9kaWZ5aW5nIG9yIGFkZGluZyB0byBhCi1wcm9ncmFtIGFuZCBzaW1wbHkgdXNpbmcgaXQuICBMaW5raW5nIGEgcHJvZ3JhbSB3aXRoIGEgbGlicmFyeSwgd2l0aG91dAotY2hhbmdpbmcgdGhlIGxpYnJhcnksIGlzIGluIHNvbWUgc2Vuc2Ugc2ltcGx5IHVzaW5nIHRoZSBsaWJyYXJ5LCBhbmQgaXMKLWFuYWxvZ291cyB0byBydW5uaW5nIGEgdXRpbGl0eSBwcm9ncmFtIG9yIGFwcGxpY2F0aW9uIHByb2dyYW0uICBIb3dldmVyLCBpbgotYSB0ZXh0dWFsIGFuZCBsZWdhbCBzZW5zZSwgdGhlIGxpbmtlZCBleGVjdXRhYmxlIGlzIGEgY29tYmluZWQgd29yaywgYQotZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeSwgYW5kIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi10cmVhdHMgaXQgYXMgc3VjaC4KLQotICBCZWNhdXNlIG9mIHRoaXMgYmx1cnJlZCBkaXN0aW5jdGlvbiwgdXNpbmcgdGhlIG9yZGluYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGZvciBsaWJyYXJpZXMgZGlkIG5vdCBlZmZlY3RpdmVseSBwcm9tb3RlIHNvZnR3YXJlCi1zaGFyaW5nLCBiZWNhdXNlIG1vc3QgZGV2ZWxvcGVycyBkaWQgbm90IHVzZSB0aGUgbGlicmFyaWVzLiAgV2UKLWNvbmNsdWRlZCB0aGF0IHdlYWtlciBjb25kaXRpb25zIG1pZ2h0IHByb21vdGUgc2hhcmluZyBiZXR0ZXIuCi0KLSAgSG93ZXZlciwgdW5yZXN0cmljdGVkIGxpbmtpbmcgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgd291bGQgZGVwcml2ZSB0aGUKLXVzZXJzIG9mIHRob3NlIHByb2dyYW1zIG9mIGFsbCBiZW5lZml0IGZyb20gdGhlIGZyZWUgc3RhdHVzIG9mIHRoZQotbGlicmFyaWVzIHRoZW1zZWx2ZXMuICBUaGlzIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0bwotcGVybWl0IGRldmVsb3BlcnMgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgdG8gdXNlIGZyZWUgbGlicmFyaWVzLCB3aGlsZQotcHJlc2VydmluZyB5b3VyIGZyZWVkb20gYXMgYSB1c2VyIG9mIHN1Y2ggcHJvZ3JhbXMgdG8gY2hhbmdlIHRoZSBmcmVlCi1saWJyYXJpZXMgdGhhdCBhcmUgaW5jb3Jwb3JhdGVkIGluIHRoZW0uICAoV2UgaGF2ZSBub3Qgc2VlbiBob3cgdG8gYWNoaWV2ZQotdGhpcyBhcyByZWdhcmRzIGNoYW5nZXMgaW4gaGVhZGVyIGZpbGVzLCBidXQgd2UgaGF2ZSBhY2hpZXZlZCBpdCBhcyByZWdhcmRzCi1jaGFuZ2VzIGluIHRoZSBhY3R1YWwgZnVuY3Rpb25zIG9mIHRoZSBMaWJyYXJ5LikgIFRoZSBob3BlIGlzIHRoYXQgdGhpcwotd2lsbCBsZWFkIHRvIGZhc3RlciBkZXZlbG9wbWVudCBvZiBmcmVlIGxpYnJhcmllcy4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCi0id29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQotZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGlsZSB0aGUgbGF0dGVyIG9ubHkKLXdvcmtzIHRvZ2V0aGVyIHdpdGggdGhlIGxpYnJhcnkuCi0KLSAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIGxpYnJhcnkgdG8gYmUgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmF0aGVyIHRoYW4gYnkgdGhpcyBzcGVjaWFsIG9uZS4KLQwKLQkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgd2hpY2gKLWNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvciBvdGhlciBhdXRob3JpemVkCi1wYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpYnJhcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4gIEVhY2ggbGljZW5zZWUgaXMKLWFkZHJlc3NlZCBhcyAieW91Ii4KLQotICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCi1wcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKLSh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCi0KLSAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKLXdoaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCi1jb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQotcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAotc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcwotaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKLQotICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucwotYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKLWludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgotYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQotICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQotc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgotd3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcwotYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCi0gIAotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKLWNvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Ci15b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgotYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKLWFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Ci13YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQotTGlicmFyeS4KLQotICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAotYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQotZmVlLgotDAotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCi0gICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKLSAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCi0gICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQotICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAotICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgotICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCi0gICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgotCi0gICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKLSAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCi0gICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKLSAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAotICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCi0gICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKLQotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQotaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKLXdpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KLXRoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KLXRoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKLWluc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKLW9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKLXRoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KLXRoZXNlIG5vdGljZXMuCi0MCi0gIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKLXRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCi1zdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgotCi0gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgotdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgotCi0gIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCi1kZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQotdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Ci1pdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCi1tdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KLQotICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKLXNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQotTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgotbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKLXdvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKLXRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQotY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Ci1jb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQotbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi1TZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KLQotICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQotdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCi1kZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KLVdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCi1saW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQotdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KLQotICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQotc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCi1mdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCi13b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQotTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKLQotICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQotZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCi1BbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKLXdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KLQwKLSAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbXBpbGUgb3IKLWxpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCi13b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawotdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAotbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCi1lbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KLQotICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKLUxpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQotdGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yawotZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKLWNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKLWRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKLW9mIHRoZXNlIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCi0gICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCi0gICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKLSAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAotICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAotICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCi0gICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKLSAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAotICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQotICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCi0KLSAgICBiKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAotICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscwotICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKLSAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCi0KLSAgICBjKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQotICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KLQotICAgIGQpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQotICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgotCi0gIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQotTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKLXJlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAotdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseQotZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCi1jb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCi13aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCi10aGUgZXhlY3V0YWJsZS4KLQotICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQotcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQotYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAotdXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQotZGlzdHJpYnV0ZS4KLQwKLSAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKLWZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKLWxpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgotdGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCi1wZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKLSAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5Ci0gICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gICAgU2VjdGlvbnMgYWJvdmUuCi0KLSAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAotICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCi0gICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgotCi0gIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCi10aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQotYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKLXJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKLW9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKLXRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQotc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQwKLSAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCi1hbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKLWFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAotc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCi1leGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgotd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgotU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAotYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5Ci1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKLSJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKLWxpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotDAotICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCi13cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcwotY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKLWRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKLW9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCi1hbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KLVdBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCi1FWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgotT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKLUtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKLUxJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCi1USEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KLVdSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCi1BTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQotRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKLUxJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKLVJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCi1GQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCi1TVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi1EQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0gICAgIEFwcGVuZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0Ci1ldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKLXJlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCi0KLSAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcwotc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQotImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAotICAgIE1BIDAyMTExLTEzMDcsIFVTQQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKLSAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9DaGFuZ2VMb2cgYi9saWJpYmVydHkvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmQzMjI5Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQ1ICswLDAgQEAKLTE5OTktMDUtMTEgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKG1haW4pOiBVc2UgdGFibGUgbG9va3VwIHRvIGRpc3Rpbmd1aXNoIGlkZW50aWZpZXIKLQljaGFyYWN0ZXJzIGZyb20gbm9uLWlkZW50aWZpZXIgY2hhcmFjdGVycy4KLQkoc3RhbmRhcmRfc3ltYm9sX2FscGhhYmV0LCBocF9zeW1ib2xfYWxwaGFiZXQpOiBOZXcgZnVuY3Rpb25zLgotCi1UaHUgTWF5ICA2IDIwOjM0OjQyIDE5OTkgIEZyZWQgRmlzaCAgPGZuZkBiZS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc3lzL3Jlc291cmNlLmgpOiBBZGQgdG8gQUNfQ0hFQ0tfSEVBREVSUyBsaXN0LgotCSogZ2V0cnVudGltZS5jOiBPbmx5IGF0dGVtcHQgdG8gaW5jbHVkZSBzeXMvcmVzb3VyY2UuaCBhbmQKLQl1c2UgZ2V0cnVzYWdlIGlmIGJvdGggSEFWRV9HRVRSVVNBR0UgYW5kIEhBVkVfU1lTX1JFU09VUkNFX0gKLQlhcmUgZGVmaW5lZC4KLQotMTk5OS0wNC0yMCAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JRml4IGZyb20gRGFsZSBIYXdraW5zOgotCSogY3BsdXMtZGVtLmMgKG1vcF91cCk6IFNldCB0eXBldmVjX3NpemUgdG8gemVybywgc28gaXQnbGwgYmUgCi0JcmVhbGxvY2F0ZWQgcHJvcGVybHkgaWYgd2UgdXNlIGl0IGFnYWluLgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuZF90eXBlKTogQ2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVuLiAgQmUKLQlzdHJpY3RlciBhYm91dCBzeW50YXguICBBbHdheXMgbnVsbC10ZXJtaW5hdGUgc3RyaW5nLgotCi0JRml4IGZyb20gTWFyY3VzIERhbmllbHM6Ci0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuZF90eXBlKTogRG9uJ3QgcnVuIG9mZiB0aGUgZW5kIG9mIHRoZQotCWlkZW50aWZpZXIgbG9va2luZyBmb3IgYW5vdGhlciB1bmRlcnNjb3JlLgotCi0xOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbGxvY2EtY29uZi5oIChhbGxvY2EpIFtDX0FMTE9DQV06IERvbid0IHVzZSBHY2MgYnVpbHRpbgotCW9yIDxhbGxvY2EuaD4uCi0JKiBjbG9jay5jIChHTlVfSFopOiBOZXcgZGVmaW5pdGlvbi4KLQkoY2xvY2spOiBVc2UgaXQuCi0JKiBnZXRydW50aW1lLmM6IExpa2V3aXNlLgotCi0JKiBjb25maWcudGFibGU6IFVzZSBtaC1iZW9zLgotCSogY29uZmlnL21oLWJlb3M6IE5ldyBmaWxlLgotCi0xOTk5LTA0LTAxICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBBdHRlbXB0IHRvIGhhbmRsZSBvdmVyZmxvd3MgaW4gY291bnRzIHdpdGggc29tZQotCXNlbWJsYW5jZSBvZiBncmFjZS4KLQkoY29uc3VtZV9jb3VudCk6IERldGVjdCBvdmVyZmxvd3MuICBSZXR1cm4gLTEgdG8gaW5kaWNhdGUgZXJyb3JzLAotCWluc3RlYWQgb2YgemVyby4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSwgZGVtYW5nbGVfdGVtcGxhdGUpOiBIYW5kbGUgY2hhbmdlCi0JdG8gY29uc3VtZV9jb3VudCdzIHJldHVybiBjb252ZW50aW9uLgotCi1UaHUgQXByICA4IDE0OjQzOjI4IDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogeG1hbGxvYy5jLCBwZXhlY3V0ZS5jOiBEZWZpbmUgX19DWUdXSU5fXyB3aGVuIGJlaW5nIGNvbXBpbGVkCi0gCXdpdGggb2xkIF9fQ1lHV0lOMzJfXyBjb21waWxlci4KLQotMTk5OS0wNC0wMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogc3BsYXktdHJlZS5oIChzcGxheV90cmVlX2NvbXBhcmVfcG9pbnRlcnMpOiBEZWZpbmUuCi0KLTE5OTktMDMtMzAgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuYyAoc3BsYXlfdHJlZV9jb21wYXJlX2ludHMpOiBEZWZpbmUuCi0KLTE5OTktMDMtMzAgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGNvbnN1bWVfY291bnQpOiBJZiBgY291bnQnIHdyYXBzLCByZXR1cm4gMCBhbmQKLQlkb24ndCBhZHZhbmNlIGlucHV0IHBvaW50ZXIuCi0JKGRlbWFuZ2xlX2NsYXNzX25hbWUpOiBJZiBjb25zdW1lX2NvdW50IGRpZG4ndCBmaW5kIGEgY291bnQsIGRvCi0Jbm90aGluZy4gIERvbid0IGJvdGhlciB3aXRoIGBzdHJsZW4nIHNhbml0eSBjaGVjazsgY29uc3VtZV9jb3VudAotCWRvZXMgaXQgZm9yIHVzLgotCi0xOTk5LTAzLTE2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQlGcm9tIEFydCBIYWFzICA8YWhhYXNAbmVvc29mdC5jb20+OgotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCk6IERvbid0IGdyYWIgYWxsIHRoZSAnX18nIHN0cmluZ3MKLQl3aGVuIGRvaW5nIGFybSBvciBocCBzdHlsZS4KLQkoZGVtYW5nbGVfbmVzdGVkX2FyZ3MpOiBEZWNyIGZvcmdldHRpbmdfdHlwZXMgZmllbGQgd2hlbiBkb25lLgotCQotVGh1IE1hciAxMSAwMToyMjo1OCAxOTk5ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogcGV4ZWN1dGUuYyAoX19DWUdXSU4zMl9fKTogUmVuYW1lIHRvCi0JKF9fQ1lHV0lOX18pOiB0aGlzLgotCSogeG1hbGxvYy5jOiBMaWtld2lzZS4KLQotCUNoYW5nZXMgdG8gc3VwcG9ydCBpMzg2LXBjLXV3aW4uCi0JKiBjb25maWd1cmUuaW4gKCotKi11d2luKik6IFdvcmthcm91bmQgZm9yIHZmb3JrIGJ1Zy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIHBleGVjdXRlLmMgKHBleGVjdXRlKTogQmUgbGlrZSBzdGFuZGFyZCBVbml4LgotCShwd2FpdCk6IExpa2V3aXNlLgotCSogeG1hbGxvYy5jIChmaXJzdF9icmVhayk6IERlZmluZS4KLQkoeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lKTogVXNlLgotCSh4bWFsbG9jKTogVXNlLgotCi1UaHUgTWFyIDExIDAxOjA3OjU1IDE5OTkgIEZyYW56IFNpcmwgPEZyYW56LlNpcmwta2VybmVsQGxhdXRlcmJhY2guY29tPgotCi0JKiBjb25maWcudGFibGU6IENsZWFudXAgYW5kIGFkZCBtaC0qcGljIGhhbmRsaW5nIGZvciBhbHBoYSwgYXJtLCBwb3dlcnBjCi0KLVN1biBGZWIgMjggMjI6MzA6NDQgMTk5OSAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlOiBDaGVjayBjeWd3aW4qLCBub3QgY3lnd2luMzIqLgotCi1UdWUgRmViICA5IDE2OjM5OjAxIDE5OTkgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBta3N0ZW1wIC0+IG1rc3RlbXBzLgotCi1UdWUgRmViICA5IDAxOjEyOjI3IDE5OTkgIE1hcmMgRXNwaWUgPE1hcmMuRXNwaWVAbGlhZmEuanVzc2lldS5mcj4KLQotCSogTWFrZWZpbGUuaW4gKFJFUVVJUkVEX09GSUxFUyk6IHJlbW92ZSBta3N0ZW1wLm8KLQkqIGNvbmZpZ3VyZS5pbiAoZnVuY3MpOiBDaGVjayBmb3IgYW5kIGNvbmRpdGlvbmFsbHkgYWRkIG1rc3RlbXBzIHRvCi0JdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIGxpYmliZXJ0eSB3aWxsIHByb3ZpZGUuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0JCi1XZWQgRmViICAzIDAwOjAxOjE1IDE5OTkgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjbG9jay5jIChIWik6IERlZmluZSBpbiB0ZXJtcyBvZiAoSVNPIEMpIENMT0NLU19QRVJfU0VDIG9uIAotCXBsYXRmb3JtcyB0aGF0IGRvbid0IGhhdmUgSFouCi0JKiBnZXRydW50aW1lLmMgKEhaKTogTGlrZXdpc2UuCi0KLVNhdCBKYW4gMzAgMTM6Mjg6MDQgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHhzdHJkdXAubyk6IERlcGVuZCBvbiBjb25maWcuaC4KLQotV2VkIEphbiAxMyAwNzoyNjo0NCAxOTk5ICBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIGNwbHVzLWRlbS5jIChtb3BfdXApOiBTZXQgd29yay0+cHJldmlvdXNfYXJndW1lbnQgdG8gTlVMTCBhZnRlcgotCWZyZWVpbmcgaXQuCi0KLVdlZCBKYW4gMTMgMTQ6MTY6MzYgMTk5OSAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiB4c3RyZHVwLmMgKHhzdHJkdXApOiBTd2l0Y2ggZnJvbSBzdHJjcHkgdG8gbWVtY3B5IGZvciBzcGVlZC4KLQotVHVlIEphbiAgNSAxNTo1ODoyOSAxOTk5ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBmaXggdHlwbywgc3BsYXktdHJlZS5jIGluc3RlYWQgb2YKLQlzcGxheS10cmVlLm8uCi0KLTE5OTktMDEtMDQgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZXF1aXJlIGF1dG9jb25mIDIuMTIuMSBvciBoaWdoZXIuCi0KLTE5OTgtMTItMzAgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiByYW5kb20uYyAoTlVMTCk6IERvbid0IHJlZGVmaW5lIE5VTEwgaWYgaXQgaXMgYWxyZWFkeSBkZWZpbmVkLgotCi1UdWUgRGVjIDIyIDA5OjQzOjM1IDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogYXJndi5jIChidWlsZGFyZ3YpOiBDYXN0IHRoZSByZXN1bHQgb2YgYWxsb2NhIGluIGFzc2lnbm1lbnQuCi0KLQkqIGNob29zZS10ZW1wLmM6IEluY2x1ZGUgc3RkbGliLmguCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9hcm1fcHQpOiBSZW1vdmUgdW51c2VkIHByb3RvdHlwZS4KLSAgCShzbmFyZl9udW1lcmljX2xpdGVyYWwpOiBDb25zdGlmeSBmaXJzdCBwYXJhbWV0ZXIuCi0gIAkoY29kZV9mb3JfcXVhbGlmaWVyKTogQXZvaWQgYSBnY2MgZXh0ZW5zaW9uLCBtYWtlIHRoZSBwYXJhbWV0ZXIgYW4KLSAJaW50LCBub3QgYSBjaGFyLgotCShkZW1hbmdsZV9xdWFsaWZpZXIpOiBMaWtld2lzZS4KLQkoZGVtYW5nbGVfc2lnbmF0dXJlKTogQ2FzdCB0aGUgYXJndW1lbnQgb2YgYSBjdHlwZSBmdW5jdGlvbiB0bwotCXVuc2lnbmVkIGNoYXIuCi0JKGFybV9wdCk6IEFkZCBwYXJlbnMgYXJvdW5kIGFzc2lnbm1lbnQgdXNlZCBhcyB0cnV0aCB2YWx1ZS4KLQkoZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlKTogQ29uc3RpZnkgdmFyaWFibGUgYGFyZ3MnLgotCShkb19ocGFjY190ZW1wbGF0ZV9jb25zdF92YWx1ZSk6IENhc3QgdGhlIGFyZ3VtZW50IG9mIGEgY3R5cGUKLQlmdW5jdGlvbiB0byB1bnNpZ25lZCBjaGFyLgotCShkb19ocGFjY190ZW1wbGF0ZV9saXRlcmFsKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBgaScuCi0JKHNuYXJmX251bWVyaWNfbGl0ZXJhbCk6IENvbnN0aWZ5IHBhcmFtZXRlciBgYXJncycuCi0JQ2FzdCB0aGUgYXJndW1lbnQgb2YgYSBjdHlwZSBmdW5jdGlvbiB0byB1bnNpZ25lZCBjaGFyLgotCi0JKiBmbG9hdGZvcm1hdC5jIChmbG9hdGZvcm1hdF90b19kb3VibGUpOiBBZGQgZXhwbGljaXQgYnJhY2VzIHRvCi0gCWF2b2lkIGFtYmlndW91cyBgZWxzZScuCi0KLQkqIGZubWF0Y2guYyAoZm5tYXRjaCk6IENoYW5nZSB0eXBlIG9mIHZhcmlhYmxlcyBgYycsIGBjMScsCi0gCWBjc3RhcnQnIGFuZCBgY2VuZCcgdG8gdW5zaWduZWQgY2hhci4gIENhc3QgdGhlIGFyZ3VtZW50IG9mIG1hY3JvCi0gCWBGT0xEJywgd2hpY2ggdXNlcyBjdHlwZSBmdW5jdGlvbnMsIHRvIHVuc2lnbmVkIGNoYXIuCi0KLQkqIG9iamFsbG9jLmMgKGZyZWUpOiBBZGQgcHJvdG90eXBlLgotCi1TdW4gRGVjIDIwIDE2OjAzOjQ2IDE5OTggIEhhbnMtUGV0ZXIgTmlsc3NvbiAgPGhwQGF4aXMuc2U+Ci0KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBGaXggdHlwbzogc3BsYXktdHJlZS5jLCBub3Qgc3BsYXktdHJlZS5vCi0KLUZyaSBEZWMgMTggMTc6NTA6MTggMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9hcm1fcHQpOiByZW1vdmUgZGVjbGFyYXRpb24gLS0gZnVuY3Rpb24KLSAJZG9lc24ndCBleGlzdC4KLQkoZG9faHBhY2NfdGVtcGxhdGVfbGl0ZXJhbCk6IHJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYGknLgotCQotRnJpIERlYyAxOCAxNjoxMTo0MyBFU1QgMTk5OCAgQW5kcmV3IE1hY0xlb2QgIDxhbWFjbGVvZEBjeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuZF90eXBlKTogUHJvY2VzcyBDViBhbmQgdSBjb2RlcyBiZWZvcmUKLQlidW1waW5nIHRoZSBwb2ludGVyIHdlIHJlYWQgZnJvbS4gQWxzbyBwcmVwZW5kIHRoZXNlIGNvZGVzLAotCWFzIHdlIGRvIGluIG90aGVyIHBsYWNlcy4KLQotMTk5OC0xMi0xOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSk6IE1ha2UgdmFyaWFibGUgJ2FyZ3MnIGJlCi0JJ2NvbnN0IGNoYXIgKicgaW4gb3JkZXIgdG8gbWF0Y2ggaXRzIHVzYWdlIHdoZW4gY2FsbGluZyBzaWJsaW5ncy4KLQkoc25hcmZfbnVtZXJpY19saXRlcmFsKTogTWFrZSBmaXJzdCBhcmcgJ2NvbnN0IGNoYXIgKionIGluIG9yZGVyCi0JdG8gbWF0Y2ggdXNhZ2UuCi0KLU1vbiBEZWMgMTQgMDk6NTU6NTAgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjaG9vc2UtdGVtcC5jOiBEb24ndCBjaGVjayBJTl9HQ0MgYW55bW9yZS4KLQotCSogZmxvYXRmb3JtYXQuYyAoZmxvYXRmb3JtYXRfZnJvbV9kb3VibGUpOiBVc2UgYGNvbnN0Jywgbm90IGBDT05TVCcuCi0JKiBtZW1jaHIuYyAobWVtY2hyKTogTGlrZXdpc2UuCi0JKiBtZW1jcHkuYyAobWVtY3B5KTogTGlrZXdpc2UuCi0JKiBtZW1tb3ZlLmMgKG1lbW1vdmUpOiBMaWtld2lzZS4KLQotCSogbWtzdGVtcC5jOiBEb24ndCBjaGVjayBJTl9HQ0MgYW55bW9yZS4KLQkqIHBleGVjdXRlLmM6IExpa2V3aXNlLgotCSogc3BsYXktdHJlZS5jOiBMaWtld2lzZS4KLQotCSogc3RyY2hyLmMgKHN0cmNocik6IFVzZSBgY29uc3QnLCBub3QgYENPTlNUJy4KLQkqIHN0cnJjaHIuYyAoc3RycmNocik6IExpa2V3aXNlLgotCSogc3RydG9sLmMgKHN0cnRvbCk6IExpa2V3aXNlLgotCSogc3RydG91bC5jIChzdHJ0b3VsKTogTGlrZXdpc2UuCi0KLUZyaSBEZWMgIDQgMTM6NTE6MDQgMTk5OCAgRGF2aWQgVGF5bG9yICAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCQkJICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAY3lnbnVzLmNvbT4KLQkJCSAgU3RhbiBTaGVicyAgICAgPHNoZWJzQGN5Z251cy5jb20+Ci0JCQkgIEVkaXRoIEVwc3RlaW4gIDxlZXBzdGVpbkBjeWdudXMuY29tPgotCQkJICBBbmRyZXMgTWFjTGVvZCA8YW1hY2xlb2RAY3lnbnVzLmNvbT4KLQkJCSAgU2F0aXNoIFBhaQkgPHBhaUBhcG9sbG8uaHAuY29tPgotCi0JKiBIUCBhQ0MgZGVtYW5nbGluZyBzdXBwb3J0LgotCSogY3BsdXMtZGVtLmMKLQkobWFpbik6IFJlbW92ZSBkZWZhdWx0IHRvIEhQIHN0eWxlIGRlbWFuZ2xpbmcsIHNldCB0byBFREcKLSAJZGVtYW5nbGluZyBjb3JyZWN0bHkgd2hlbiAtZWRnIHNwZWNpZmllZDsgc2V0IHRoZSBkZW1hbmdsaW5nIHN0eWxlCi0gCXdoZW4gdXNlciBzcGVjaWZpZXMgJ2VkZycuIFNldCBzdHJpcF91bmRlcnNjb3JlIHRvCi0gCXByZXBlbmRzX3VuZGVyc2NvcmUsIGlmIG5vdCBIUFVYSFBQQS4gIFNldAotIAljdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgdG8gaHBfZGVtYW5nbGluZyBpZiBIUFVYSFBQQS4gIFNldAotIAljdXJyZW50IGRlbWFuZ2xpbmcgc3R5bGUgY29ycmVjdGx5IGlmIHRoZSBzd2l0Y2ggaXMgaHAuICBSZWFkCi0gCWxhYmVsIGNvcnJlY3RseSBhbHNvIGluIHRoZSBIUCBzdHlsZSBjYXNlLgotCSh3b3JrX3N0dWZmKTogYWRkIHRlbXBfc3RhcnQgZmllbGQ7IGFkZCBmaWVsZCBmb3Igdm9sYXRpbGUgbWVtYmVyCi0gCWZ1bmN0aW9uLgotCShhcm1fcHQpOiBoYW5kbGUgQVJNX0RFTUFOR0xJTkcgYW5kIEVER19ERU1BTkdMSU5HIHN0eWxlczsgSFAKLSAJc3R5bGUgZm9yIHRoaXMgY2FzZSBpcyB0aGUgc2FtZSBhcyBBUk0uCi0JKGRlbWFuZ2xlX2FyZ3MpOiBoYW5kbGUgRURHX0RFTUFOR0xJTkcgc3R5bGU7IHN1cHBvcnQgSFAgc3R5bGUuCi0JKGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSk6IG5ldyBmdW5jdGlvbi4gKEl0IHdhcwotIAlkZW1hbmdsZV9hcm1fcHQuKTsgY2hlY2sgYW5kIHNldCB2YWx1ZSBvZiB0ZW1wX3N0YXJ0IGZpZWxkIGluCi0gCW11bHRpcGxlIHBsYWNlcy4gQWxzbywgd2hlbiBjZWNoaW5nIGZvciBlbmQgb2YgdGVtcGxhdGUgYXJncywKLSAJY2hlY2sgdG8gc2VlIGlmIGF0IGVuZCBvZiBzdGF0aWMgbWVtYmVyIG9mIHRlbXBsYXRlIGNsYXNzLgotCShkZW1hbmdsZV9jbGFzcyk6IG5ldyBsb2NhbCB2YXJpYWJsZSA6IHNhdmVfY2xhc3NfbmFtZV9lbmQgRG9uJ3QKLSAJaW5jbHVkZSB0ZW1wbGF0ZSBhcmdzIGluIHN0cmluZyBkZWZpbmluZyBjbGFzcy4KLQkoZGVtYW5nbGVfY2xhc3NfbmFtZSk6IHVzZSBkZW1hbmdlbF9hcm1faHBfdGVtcGxhdGUuCi0JKGRlbWFuZ2xlX2Z1bmN0aW9uX25hbWUpOiBoYW5kbGUgY2FzZSB3aGVyZSBkZW1hbmdsaW5nIHN0eWxlIGlzCi0gCUhQX0RFTUFOR0xJTkcgYW5kIGN1cnJlbnRseSBwb2ludCBhdCBhbiAnWCcgaW4gdGhlIG1hbmdsZWQgbmFtZS4KLSAgCUhhbmRsZSBFREdfREVNQU5HTElORyBzdHlsZS4gIEhhbmRsZSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcgotIAlvcHMgZm9yIEhQIHN0eWxlLgotCShkZW1hbmdsZV9wcmVmaXgpOiBoYW5kbGUgRURHX0RFTUFOR0xJTkcgYW5kIEFSTV9ERU1BTkdMSU5HCi0gCXN0eWxlcy4gIGdsb2JhbCBkZXN0cnVjdG9yIGFuZCBjb25zdHJ1Y3RvciBmb3IgSFAgc3R5bGUgYXJlIHNhbWUKLSAJYXMgZm9yIEFSTSBzdHlsZS4gU2FtZSBmb3IgbG9jYWwgdmFyaWFibGVzLgotCShkZW1hbmdsZV9xdWFsaWZpZWQpOiBoYW5kbGUgRURHX0RFTUFOR0xJTkcgc3R5bGUuCi0JKGRlbWFuZ2xlX3NpZ25hdHVyZSk6IGFkZCBjYXNlIGZvciB2b2xhdGlsZSBtZW1iZXIgZnVuY3Rpb24uICBGb3IKLSAJY2FzZXMgJzEnIC0gJzknIDogaW5pdGlhbGl6ZSB0aGUgdGVtcF9zdGFydCBmaWVsZCB0byAtMSBhbmQgaGFuZGxlCi0gCXRoZSBFREdfREVNQU5HTElORyBzdHlsZS4gIGZvciBjYXNlICdGJyA6IGhhbmRsZSBFREdfREVNQU5HTElORwotIAlhbmQgQVVUT19ERU1BTkdMSU5HIHN0eWxlcy4gIElmIGV4cGVjdGluZyBhIGZ1bmN0aW9uIGFuZCBtYW5hZ2VkCi0gCXRvIGRlbWFuZ2xlIHRoZSBmdW5jdCBhcmdzLCB0aGVuIGhhbmRsZSB0aGUgTFVDSURfREVNQU5HTElORywKLSAJQVJNX0RFTUFOR0xJTkcsIGFuZCBFREdfREVNQU5HTElORyBzdHlsZXMuICBBZGQgY2FzZSBmb3IgbG9jYWwKLSAJY2xhc3MgbmFtZSBhZnRlciAiTG5ubl8gaW4gSFAgc3R5bGUgY2FzZS4gSFAgc3R5bGUgdG9vIG5lZWRzIHRvCi0gCWZvcmdldCB0eXBlcy4gIF9ubm4gaXMgT0sgZm9yIEhQIHN0eWxlLCBzbyBkb24ndCByZXBvcnQgZmFpbHVyZS4KLQkoZG9faHBhY2NfdGVtcGxhdGVfY29uc3RfdmFsdWUpOiBuZXcgZnVuY3Rpb24uIEhhbmRsZSB0ZW1wbGF0ZSdzCi0gCXZhbHVlIHBhcmFtIGZvciBIUC9hQ0MuCi0JKGRvX2hwYWNjX3RlbXBsYXRlX2xpdGVyYWwpOiBuZXcgZnVuY3Rpb24uICBIYW5kbGUgYSB0ZW1wbGF0ZSdzCi0gCWxpdGVyYWwgcGFyYW1ldGVyIGZvciBIUCBhQ0MuCi0JKHJlY3Vyc2l2ZWx5X2RlbWFuZ2xlKTogbmV3IGZ1bmN0aW9uCi0JKHNuYXJmX251bWVyaWNfbGl0ZXJhbCk6IG5ldyBmdW5jdGlvbi4KLQkodXNhZ2UpOiBhZGQgJ2VkZycgdG8gdGhlIGxpc3Qgb2YgZGVtYW5nbGluZyBzdHlsZXM7IGFkZCBocCBzd2l0Y2gKLSAJdG8gbWVzc2FnZS4KLQotU2F0IE5vdiAyOCAxNzoyNToyMiAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBwZXhlY3V0ZS5jOiBSZW1vdmUgb2Jzb2xldGUgaWZkZWZlZCBjeWd3aW4gY29kZS4KLQotRnJpIE5vdiAyNyAxMzoyNjowNiAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNob29zZS10ZW1wLmM6IEFsd2F5cyBpbmNsdWRlIGxpYmliZXJ0eS5oLiAgQXZvaWQgcmVkdW5kYW5jaWVzLgotCSogY3BsdXMtZGVtLmM6IExpa2V3aXNlLiAgQ29uZm9ybSB0byBsaWJpYmVydHkuaC4KLQkqIHBleGVjdXRlLmM6IExpa2V3aXNlLgotCSogc3BsYXktdHJlZS5jOiBMaWtld2lzZS4KLQotMTk5OC0xMS0yNSAgTWlrZSBTdHVtcCAgPG1yc0B3cnMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoc3BsYXktdHJlZS5vKTogQWRkIGNvbmZpZy5oIGRlcGVuZGVuY3kuCi0KLU1vbiBOb3YgMjMgMTY6NTk6NDkgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiAgY29uZmlndXJlLmluOiBVc2UgQUNfUFJFUkVRKDIuMTIuMSkuCi0KLTE5OTgtMTEtMTYgIEJlbmphbWluIEtvc25payAgPGJrb3pAaGFpZ2h0LmNvbnN0YW50LmNvbT4KLQotICAgICAgICAqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9mdW5kX3R5cGUpOiBBZGQgZGVtYW5nbGluZyBmb3IgQzl4IHR5cGVzLgotCi1UaHUgTm92IDE5IDIyOjE1OjUwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbXB3LmMgKG1wd19hY2Nlc3MpOiBBZGQgbWlzc2luZyBwYXJlbnMuCi0KLVRodSBOb3YgMTkgMTI6NTk6MjEgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfSEVBREVSX1NZU19XQUlULgotCi0JKiBwZXhlY3V0ZS5jOiBJbmNsdWRlIHN5cy93YWl0Lmggd2hlbiAhSU5fR0NDLgotCi1UaHUgTm92IDE5IDE0OjM4OjIwIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIHBleGVjdXRlLmM6IHJldmVydCBiYWNrIHRvIGNoZWNraW5nIG9sZCBDeWd3aW4KLQlwcmVwcm9jZXNzb3Igc3ltYm9sIHVudGlsIHNvbWUgdGltZSBoYXMgcGFzc2VkLgotCi1XZWQgTm92IDE4IDA4OjUyOjI2IDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIHBleGVjdXRlLmM6IFJlb3JnYW5pemUgV0lOMzIgY2FzZSB0byBhY2NvbW9kYXRlIEN5Z3dpbgotCXNpbmNlIGl0IHdpbGwgbm93IHN1cHBvcnQgc2ltaWxhciBjb25zdHJ1Y3RzLgotCi1GcmkgTm92IDEzIDE5OjE4OjA1IDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgY2FsbG9jLgotCi0JKiBjYWxsb2MuYzogTmV3CWZpbGUuCi0KLQkqIHhtYWxsb2MuYyAoeGNhbGxvYyk6IE5ldyBmdW5jdGlvbi4KLQotRnJpIE5vdiAxMyAwODo1MTo0NiBFU1QgMTk5OCAgQW5kcmV3IE1hY0xlb2QgIDxhbWFjbGVvZEBjeWdudXMuY29tPgotCi0JKmNwbHVzLWRlbS5jIChkZW1hbmdsZV9wcmVmaXgpOiBVc2UgdGhlIGxhc3QgIl9fIgotCWluIHRoZSBtYW5nbGVkIG5hbWUgd2hlbiBsb29raW5nIGZvciB0aGUgc2lnbmF0dXJlLiBUaGlzIGFsbG93cwotCXRlbXBsYXRlIG5hbWVzIHRvIGJlZ2luIHdpdGggIl9fIi4KLQotMTk5OC0xMS0wOCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKHR5cGVfa2luZF90KTogQWRkIHRrX3JlZmVyZW5jZS4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSk6IEhhbmRsZSBpdC4KLQkoZG9fdHlwZSk6IFVzZSBpdCBmb3IgcmVmZXJlbmNlcywgaW5zdGVhZCBvZiB0a19wb2ludGVyLgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSk6IFVzZSBjcGx1c19kZW1hbmdsZSwKLQlub3QgaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUuCi0KLVNhdCBOb3YgIDcgMTY6MDI6MTAgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjaG9vc2UtdGVtcC5jOiBEb24ndCBpbmNsdWRlIGdhbnNpZGVjbC5oLgotCSogbWtzdGVtcC5jOiBMaWtld2lzZS4KLQkqIHBleGVjdXRlLmM6IExpa2V3aXNlLgotCi1Nb24gTm92ICAyIDE1OjA1OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IGRldGVjdCBjeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqCi0gICAgICAgICogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLU1vbiBOb3YgIDIgMTA6MjI6MDEgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBwZXhlY3V0ZS5jOiBDaGVjayBIQVZFX0NPTkZJR19ILCBub3QgSU5fR0NDLCB3aGVuIGRldGVybWluaW5nCi0gCXdoZXRoZXIgdG8gaW5jbHVkZSBjb25maWcuaC4gIFBvc3NpYmx5IGluY2x1ZGUgdW5pc3RkLmggaW4gdGhlCi0gCSFJTl9HQ0MgY2FzZS4gIERlZmluZSBWRk9SS19TVFJJTkcgYXMgYSBwcmludGFibGUgZnVuY3Rpb24gY2FsbAotIAlmb3IgZXJyb3IgbWVzc2FnZXMgKGVpdGhlciAidmZvcmsiIG9yICJmb3JrIi4pICBJZiBIQVZFX1ZGT1JLX0ggaXMKLSAJZGVmaW5lZCwgaW5jbHVkZSB2Zm9yay5oLiAgSWYgVk1TIGlzIGRlZmluZWQsIGRlZmluZSB2Zm9yaygpCi0gCWFwcHJvcHJpYXRlbHkuICBSZW1vdmUgdmZvcmsgY2hlY2sgb24gVVNHLCB3ZSdyZSB1c2luZyBhdXRvY29uZi4KLSAgCShwZXhlY3V0ZSk6IFNldCBgZXJybXNnX2ZtdCcgdG8gVkZPUktfU1RSSU5HIGluc3RlYWQgb2YgY2hlY2tpbmcKLSAJbG9jYWxseSB3aGF0IHN0cmluZyB0byB1c2UuCi0KLTE5OTgtMTAtMjYgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuYzogVHdlYWsgaW5jbHVkZSBkaXJlY3RpdmVzIHRvIG1ha2Ugc3VyZSBkZWNsYXJhdGlvbnMgb2YKLQl4bWFsbG9jIGFuZCBmcmVlIGFyZSBhdmFpbGFibGUuCi0KLTE5OTgtMTAtMjUgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChnbnVfc3BlY2lhbCk6IEZpeCBoYW5kbGluZyBvZiB2aXJ0dWFsIHRhYmxlcyBpbgotCWFub255bW91cyBuYW1lc3BhY2VzLgotCi0xOTk4LTEwLTIzICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAod29ya19zdHVmZik6IFJlcGxhY2UgY29uc3RfdHlwZSBhbmQgdm9sYXRpbGVfdHlwZQotCXdpdGggdHlwZV9xdWFscy4KLQkoVFlQRV9VTlFVQUxJRklFRCk6IE5ldyBtYWNyby4KLQkoVFlQRV9RVUFMX0NPTlNUKTogTGlrZXdpc2UuCi0JKFRZUEVfUVVBTF9WT0xBVElMRSk6IExpa2V3aXNlLgotCShUWVBFX1FVQUxfUkVTVFJJQ1QpOiBMaWtld2lzZS4KLQkoY29kZV9mb3JfcXVhbGlmaWVyKTogTmV3IGZ1bmN0aW9uLgotCShxdWFsaWZpZXJfc3RyaW5nKTogTGlrZXdpc2UuCi0JKGRlbWFuZ2xlX3F1YWxpZmllcik6IExpa2V3aXNlLgotCShpbnRlcm5hbF9jcGx1c19kZW1hbmdsZSk6IFVzZSB0aGVtLgotCShkZW1hbmdsZV9zaWduYXR1cmUpOiBMaWtld2lzZS4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSk6IExpa2V3aXNlLgotCShkb190eXBlKTogTGlrZXdpc2UuCi0JKGRlbWFuZ2xlX2Z1bmRfdHlwZSkpOiBMaWtld2lzZS4KLQotVGh1IE9jdCAyMiAxOTo1ODo0MyAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIHNwbGF5LXRyZWUuYyAoc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlcik6IE1ha2UgZGVmaW5pdGlvbiBzdGF0aWMKLQl0byBtYXRjaCBwcm90b3R5cGUuCi0KLTE5OTgtMTAtMjEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIGl0LgotCShSRVFVSVJFRF9PRklMRVMpOiBMaWtld2lzZS4KLQkoc3BsYXktdHJlZS5vKTogQWRkIGRlcGVuZGVuY2llcy4KLQotVHVlIE9jdCAyMCAxMjoyOTowMiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9xdWFsaWZpZWQpOiBGaXggb2ZmLWJ5LW9uZSB3aGVuIGNoZWNraW5nCi0JcmFuZ2Ugb2YgJ0snIGluZGV4LgotCi1UaHUgT2N0IDE1IDE4OjUxOjEyIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY2hvb3NlLXRlbXAuYzogUHJvdG90eXBlIG1rc3RlbXBzKCkgd2hlbiBJTl9HQ0MuCi0KLQkqIGNwbHVzLWRlbS5jIChjb25zdW1lX2NvdW50KTogQ2FzdCBhcmd1bWVudCBvZiBjdHlwZSBtYWNybyB0bwotCWB1bnNpZ25lZCBjaGFyJy4KLQkoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogQ2FzdCB0aGUgcmVzdWx0IG9mIGBzdHJsZW4nIHRvIChpbnQpIHdoZW4KLQljb21wYXJpbmcgYWdhaW5zdCBvbmUuCi0JKGNwbHVzX21hbmdsZV9vcG5hbWUpOiBMaWtld2lzZS4KLQkoZGVtYW5nbGVfaW50ZWdyYWxfdmFsdWUpOiBDYXN0IGFyZ3VtZW50IG9mIGN0eXBlIG1hY3JvIHRvCi0JYHVuc2lnbmVkIGNoYXInLgotCShkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtKTogTGlrZXdpc2UuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlKTogSW5pdGlhbGl6ZSB2YXJpYWJsZSBgYmluZGV4Jy4gIENhc3QgdGhlCi0JcmVzdWx0IG9mIGBzdHJsZW4nIHRvIChpbnQpIHdoZW4gY29tcGFyaW5nIGFnYWluc3Qgb25lLiAgUmVtb3ZlCi0JdW51c2VkIHZhcmlhYmxlIGBzdGFydF9vZl92YWx1ZV9wYXJtJy4KLQkoZGVtYW5nbGVfY2xhc3NfbmFtZSk6IENhc3QgdGhlIHJlc3VsdCBvZiBgc3RybGVuJyB0byAoaW50KSB3aGVuCi0JY29tcGFyaW5nIGFnYWluc3Qgb25lLgotCShkZW1hbmdsZV9wcmVmaXgpOiBDYXN0IGFyZ3VtZW50IG9mIGN0eXBlIG1hY3JvIHRvIGB1bnNpZ25lZCBjaGFyJy4KLQkoZ251X3NwZWNpYWwpOiBMaWtld2lzZS4gIENhc3QgdGhlIHJlc3VsdCBvZiBgc3RybGVuJyB0byAoaW50KQotCXdoZW4gY29tcGFyaW5nIGFnYWluc3Qgb25lLgotCShkZW1hbmdsZV9xdWFsaWZpZWQpOiBDYXN0IGFyZ3VtZW50IG9mIGN0eXBlIG1hY3JvIHRvIGB1bnNpZ25lZCBjaGFyJy4KLQkoZ2V0X2NvdW50KTogTGlrZXdpc2UuCi0JKGRvX3R5cGUpOiBMaWtld2lzZS4gIENhc3QgdGhlIHJlc3VsdCBvZiBgc3RybGVuJyB0byAoaW50KSB3aGVuCi0JY29tcGFyaW5nIGFnYWluc3Qgb25lLgotCShkZW1hbmdsZV9mdW5kX3R5cGUpOiBDYXN0IGFyZ3VtZW50IG9mIGN0eXBlIG1hY3JvIHRvIGB1bnNpZ25lZCBjaGFyJy4KLQkoZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSk6IENhc3QgdGhlIHJlc3VsdCBvZiBgc3RybGVuJyB0byAoaW50KQotCXdoZW4gY29tcGFyaW5nIGFnYWluc3Qgb25lLgotCi0JKiBta3N0ZW1wLmMgKG1rc3RlbXBzKTogQ2FzdCB2YXJpYWJsZSBgbGVuJyB0byAoaW50KSB3aGVuCi0JY29tcGFyaW5nIGFnYWluc3Qgb25lLgotCi1UdWUgT2N0IDEzIDIzOjUxOjUxIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIG1rc3RlbXAuYzogQ2hlY2sgSEFWRV9TWVNfVElNRV9IIGJlZm9yZSBpbmNsdWRpbmcgc3lzL3RpbWUuaAotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoQUNfQ0hFQ0tfSEVBREVSUyk6IENoZWNrIGZvciBzeXMvdGltZS5oIHRvby4KLSAgICAgICAgKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotCSogZ2V0b3B0LmM6IENoZWNrIEhBVkVfU1RSSU5HU19IIGJlZm9yZSBpbmNsdWRpbmcgc3RyaW5ncy5oLgotCSogY29uZmlndXJlLmluIChBQ19DSEVDS19IRUFERVJTKTogQ2hlY2sgZm9yIHN0cmluZ3MuaCB0b28uCi0JKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotTW9uIE9jdCAxMiAxOToxNTo1OSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBpbiBjb21tZW50LCBjYWxsIEFDX0VYRUVYVCBpbnN0ZWFkIG9mIEFNX0VYRUVYVAotCi1TdW4gT2N0IDExIDE3OjM2OjA2IDE5OTggIE1pY2hhZWwgVGllbWFubiAgPHRpZW1hbm5AaG9sb2RlY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNwbHVzLWRlbS5vLCBvYnN0YWNrLm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaC4KLQotVGh1IE9jdCAgOCAyMzo0MjowOCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1lcmdlIGVnY3MgJiBkZXZvIGxpYmliZXJ0eS4KLQotMTk5OC0wOS0wOCAgTWFydGluIHZvbiBM9ndpcyAgPGxvZXdpc0BpbmZvcm1hdGlrLmh1LWJlcmxpbi5kZT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2FybV9wdCk6IERlbWFuZ2xlIGFub255bW91cyBuYW1lc3BhY2VzLgotCi1Nb24gU2VwICA3IDIzOjI5OjAxIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogbWtzdGVtcC5jOiBJbmNsdWRlIGNvbmZpZy5oIGV2ZW4gd2hlbiBub3QgSU5fR0NDLiAgV3JhcCBoZWFkZXIKLSAJaW5jbHVzaW9ucyBpbnNpZGUgSEFWRV8qX0ggbWFjcm9zLiAgSW5jbHVkZSBhbnNpZGVjbC5oIHdoZW4gbm90Ci0gCUlOX0dDQy4KLQotCSogdmFzcHJpbnRmLmM6IEluY2x1ZGUgc3RkYXJnLmgvdmFyYXJncy5oIGZpcnN0LgotCi0JKiB2cHJpbnRmLmM6IExpa2V3aXNlLgotCi1TYXQgU2VwICA1IDAzOjI0OjQ5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcGV4ZWN1dGUuYzogVXBkYXRlcyBmcm9tIGdjYy4gIENvcHkgaW4gZ2NjIGhhcyBiZWVuIHJlbW92ZWQuICBUaGlzCi0JaXMgdGhlIGNhbm9uaWNhbCBjb3B5LiAgRGVmaW5lIElTU1BBQ0UgaWYgIUlOX0dDQy4KLQkqIGFsbG9jYS5jLCB2ZnByaW50Zi5jLCBjaG9vc2UtdGVtcC5jLCBta3N0ZW1wLmMsIGdldG9wdC5jOiBTaW1pbGFybHkuCi0JKiBnZXRvcHQxLmMsIG9ic3RhY2suYzogU2ltaWxhcmx5LgotCSogTWFrZWZpbGUuaW46IEJ1aWxkIG1rc3RlbXAubwotCi1UdWUgU2VwICAxIDIzOjEyOjQ3IDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogSW5jbHVkZSBhc3ByaW50ZiBpbiBsaXN0IG9mIGZ1bmN0aW9ucyBrbm93biBub3QKLQl0byBiZSBpbiBuZXdsaWIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBBdWcgMTkgMTQ6MDU6MDEgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNwbHVzLWRlbS5jICh3b3JrX3N0dWZmKTogQWRkIGRsbGltcG9ydGVkLgotCShkZW1hbmdsZWRfcHJlZml4KTogTWFyayBzeW1ib2xzIGltcG9ydGVkIGZyb20gUEUgRExMLgotCShpbnRlcm5hbF9jcGx1c19kZW1hbmdsZWQpOiBIYW5kbGUuCi0KLTE5OTgtMDgtMTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRvX3R5cGUpOiBGaXggc2ltcGxlIGFycmF5IGhhbmRsaW5nLiAgSWYgd2UgZmFpbCwKLQlzdGF5IGZhaWxlZC4KLQotTW9uIEF1ZyAxNyAxMDo0MDozNCAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNwbHVzLWRlbS5jOiBJbmNsdWRlIGNvbmZpZy5oIGlmIGl0IGV4aXN0cy4gIEFsc28sIG9ubHkKLQlwcm90b3R5cGUgbWFsbG9jL3JlYWxsb2MgaWYgd2UgY2FuJ3QgZ2V0IHN0ZGxpYi5oLgotCi1TYXQgQXVnIDE1IDE2OjE1OjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTd2l0Y2ggYmFjayB0byBjaGVja2luZyAtLXdpdGgtdGFyZ2V0LXN1YmRpciB3aGVuCi0JZGVjaWRpbmcgd2hldGhlciB0byBjaGVjayBmb3IgbmV3bGliLCB1bmRvaW5nIHBhcnQgb2YgSnVseSAxNQotCWNoYW5nZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IEF1ZyAxMyAxNjo0NzozOCAxOTk4ICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAodHlwZV9raW5kX3QpOiBOZXcgdHlwZS4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSk6IEFkZCB0eXBlX2tpbmRfdCBwYXJhbWV0ZXIuICBSZWx5Ci0Jb24gdGhpcyBwYXJhbXRlciwgcmF0aGVyIHRoYW4gZGVtYW5nbGluZyB0aGUgdHlwZSBhZ2Fpbi4KLQkoZGVtYW5nbGVfaW50ZWdyYWxfdmFsdWUpOiBQYXNzIHRrX2ludGVncmFsLgotCShkZW1hbmdsZV90ZW1wbGF0ZV86IFBhc3MgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gZG9fdHlwZS4KLQkoZG9fdHlwZSk6IFJldHVybiBhIHR5cGVfa2luZF90LiAgUGFzcyB0a19pbnRlZ3JhbCB0bwotCWRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gZm9yIGFycmF5IGJvdW5kcy4KLQkoZGVtYW5nbGVfZnVuZF90eXBlKTogTGlrZXdpc2UuCi0KLQlBbHNvIGluY29ycG9yYXRlIGZyb20gR0NDIHZlcnNpb246Ci0KLQlUdWUgSnVsIDIxIDEzOjI4OjE5IDE5OTggIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRvX3R5cGUpOiBVc2UgZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSBmb3IgYXJyYXlzLgotCi1UaHUgQXVnIDEzIDE2OjQ3OjM4IDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX25lc3RlZF9hcmdzKTogTWFrZSBmdW5jdGlvbiBkZWZpbml0aW9uCi0Jc3RhdGljIHRvIG1hdGNoIHRoZSBwcm90b3R5cGUuCi0KLVR1ZSBKdWwgMjggMTE6MzM6MDkgMTk5OCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKHR5cGVfa2luZF90KTogTmV3IHR5cGUuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0pOiBBZGQgdHlwZV9raW5kX3QgcGFyYW1ldGVyLiAgUmVseQotCW9uIHRoaXMgcGFyYW10ZXIsIHJhdGhlciB0aGFuIGRlbWFuZ2xpbmcgdGhlIHR5cGUgYWdhaW4uCi0JKGRlbWFuZ2xlX2ludGVncmFsX3ZhbHVlKTogUGFzcyB0a19pbnRlZ3JhbC4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfOiBQYXNzIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGRvX3R5cGUuCi0JKGRvX3R5cGUpOiBSZXR1cm4gYSB0eXBlX2tpbmRfdC4gIFBhc3MgdGtfaW50ZWdyYWwgdG8KLQlkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtIGZvciBhcnJheSBib3VuZHMuCi0JKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IExpa2V3aXNlLgotCi0JQWxzbyBpbmNvcnBvcmF0ZSBmcm9tIEdDQyB2ZXJzaW9uOgotCi0JVHVlIEp1bCAyMSAxMzoyODoxOSAxOTk4ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogVXNlIGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gZm9yIGFycmF5cy4KLQotTW9uIEp1bCAyNyAxMjoxNjowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExPQ0EpOiBOZXcgdmFyaWFibGUuCi0JKCQoVEFSR0VUTElCKSk6IEFkZCAkKEFMTE9DQSkgdG8gbGlicmFyeS4KLQkobmVlZGVkLWxpc3QpOiBBZGQgJChBTExPQ0EpLgotCSgkKEFMTE9DQSkpOiBEZXBlbmQgdXBvbiBzdGFtcC1waWNkaXIuCi0KLVN1biBKdWwgMTkgMDg6MjM6MTcgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfbmVzdGVkX2FyZ3MpOiBNYWtlIGZ1bmN0aW9uIGRlZmluaXRpb24KLQlzdGF0aWMgdG8gbWF0Y2ggdGhlIHByb3RvdHlwZS4KLQotV2VkIEp1bCAxNSAwMDoxMjo1OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgLS13aXRoLWNyb3NzLWhvc3QgcmF0aGVyIHRoYW4KLQktLXdpdGgtdGFyZ2V0LXN1YmRpciB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgYnVpbGQgdXNlcyBhIGNyb3NzCi0JY29tcGlsZXIsIGFuZCB3aGVuIGRlY2lkaW5nIHdoZXJlIHRvIGluc3RhbGwgdGhlIGxpYnJhcnkuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVN1biBKdWwgMTIgMDE6Mjc6MDUgMTk5OCAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfbmVzdGVkX2FyZ3MpOiBSZXR1cm4gYSB2YWx1ZS4KLQotU2F0IEp1bCAxMSAxNjoxOTo0OCAxOTk4ICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoc3RyaW5nKTogTW92ZSBkZWZpbml0aW9uIGJlZm9yZSB3b3JrX3N0dWZmLgotCSh3b3JrX3N0dWZmKTogQWRkIHZvbGF0aWxlX3R5cGUsIGZvcmdldHRpbmdfdHlwZXMsCi0JcHJldmlvdXNfYXJndW1lbnQsIGFuZCBucmVwZWF0cyBmaWVsZHMuCi0JKFNDT1BFX1NUUklORyk6IE5ldyBtYWNyby4KLQkoZGVtYW5nbGVfdGVtcGxhdGUpOiBBZGQgYHJlbWVtYmVyJyBwYXJhbWV0ZXIuICBBZGQgY29tbWVudC4KLQlSZWdpc3RlciB0aGUgYEInIGNvZGUgdHlwZSBoZXJlLCBpZiByZW1lbWJlcmluZy4gIFRpZHkuICBGaXggY3Jhc2gKLQlvbiBOVUxMIHRtcGxfYXJndmVjLiAgQmUgY29uc2lzdGVudCB3aXRoIHVzZSBvZiB0bmFtZS90cmF3bmFtZS4KLQkoZGVtYW5nbGVfbmVzdGVkX2FyZ3MpOiBOZXcgZnVuY3Rpb24uCi0JKGludGVybmFsX2NwbHVzX2RlbWFuZ2xlKTogSGFuZGxlIHZvbGF0aWxlLXF1YWxpZmllZCBtZW1iZXIKLQlmdW5jdGlvbnMuCi0JKG1vcF91cCk6IERlbGV0ZSB0aGUgcHJldmlvdXNfYXJndW1lbnQgc3RyaW5nIGlmIHByZXNlbnQuCi0JKGRlbWFuZ2xlX3NpZ25hdHVyZSk6IFRpZHkuICBIYW5kbGUgdm9sYXRpbGUtcXVhbGlmaWVkIG1lbWJlcgotCWZ1bmN0aW9ucy4gIEhhbmRsZSBiYWNrLXJlZmVyZW5jZXMgdXNpbmcgdGhlIGBCJyBjb2RlLiAgVXNlIGV4dHJhCi0JcGFyYW1ldGVyIHRvIGRlbWFuZ2xlX3RlbXBsYXRlIGFuZCBTQ09QRV9TVFJJTkcgd2hlcmUgYXBwcm9wcmlhdGUuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0pOiBGaXggdGhpbmtvOyAnQicgaXMgbm90IGFuIGludGVncmFsCi0JY29kZS4KLQkoZGVtYW5nbGVfY2xhc3MpOiBVc2UgU0NPUEVfU1RSSU5HLgotCShnbnVfc3BlY2lhbCk6IFBhc3MgYWRkaXRpb25hbCBhcmd1bWVudCB0byBkZW1hbmdsZV90ZW1wbGF0ZS4KLQlVc2UgU0NPUEVfU1RSSU5HLgotCShkZW1hbmdsZV9xdWFsaWZpZWQpOiBTYXZlIHF1YWxpZmllZCB0eXBlcyBmb3IgbGF0ZXIKLQliYWNrLXJlZmVyZW5jZXMuICBIYW5kbGUgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBmb3IgdGVtcGxhdGUKLQl0eXBlcyBjb3JyZWN0bHkuCi0JKGRvX3R5cGUpOiBUaWR5LiAgVXNlIFNDT1BFX1NUUklORy4gIFBhc3MgZXh0cmEgYXJndW1lbnQgdG8KLQlkZW1hbmdsZV90ZW1wbGF0ZS4gIFVzZSBkZW1hbmdsZWRfbmVzdGVkX2FyZ3MuICBEb24ndCByZW1lbWJlcgotCXF1YWxpZmllZCB0eXBlcyBoZXJlOyB0aGF0J3Mgbm93IGRvbmUgaW4gZGVtYW5nbGVfcXVhbGlmaWVkLgotCVNpbWlsYXJseSBmb3IgdGVtcGxhdGVzLgotCShkb19hcmcpOiBJbXByb3ZlIGNvbW1tZW50LiAgSGFuZGxlICduJyByZXBlYXQgY29kZS4KLQkocmVtZW1iZXJfdHlwZSk6IENoZWNrIGZvcmdldHRpbmdfdHlwZXMuCi0JKGRlbWFuZ2xlX2FyZ3MpOiBEZWFsIHdpdGggJ24nIHJlcGVhdCBjb2Rlcy4gIFRpZHkuCi0KLVRodSBKdWwgIDIgMTY6MjY6MjQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcudGFibGU6IE9ubHkgdXNlIG1oLWZic2QyMSBvbiAqLSotZnJlZWJzZDIuMi5bMDEyXSwgbm90IG9uCi0JKi0qLWZyZWVic2QyLjIuKi4gIEZyb20gRG1pdHJpaiBUZWpibHVtIDx0ZWpibHVtQGFyYy5ocS5jdGkucnU+LgotCi1Nb24gSnVuIDE1IDE2OjI5OjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzZXRvYmpzKTogQ29ycmVjdCBxdW90aW5nIGVycm9yIGluIGN5Z3dpbjMyIGNhc2UuCi0JRnJvbSBDaHJpcyBGYXlsb3IgPGNnZkBjeWdudXMuY29tPi4KLQotTW9uIEp1biAgMSAxMzo0Nzo1NSAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jOiBVcGRhdGUgdG8gbGF0ZXN0IEZTRiB2ZXJzaW9uLgotCi1Nb24gSnVuICAxIDE0OjE3OjM2IDE5OTggIE1pa2UgU3R1bXAgIDxtcnNAd3JzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBhIGRlcGVuZGVuY3kgb24gc3RhbXAtcGljZGlyIGZvciB0aGUKLQlvYmplY3RzLCBzbyB0aGF0IHdlIGNhbiBkbyBhIHBhcmFsbGVsIGJ1aWxkLgotCi1TYXQgTWF5IDMwIDIyOjE3OjEzIDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjb25maWd1cmUuaW4gKGNoZWNrZnVuY3MpOiBBZGQgbWlzc2luZyAiJyIuCi0KLUZyaSBNYXkgMjkgMTI6NDA6NDEgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYyAoX29ic3RhY2tfbWVtb3J5X3VzZWQpOiAgRWxpZGUgdGhpcyBmdW5jdGlvbiBpZiB3ZSdyZQotCW9uIGEgc3lzdGVtIHdpdGggR05VIGxpYmMuCi0KLVR1ZSBNYXkgMjYgMTg6Mjg6NDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5sb2cuCi0KLVR1ZSBNYXkgMjYgMTU6MDE6NTIgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEb24ndCByZW1vdmUgYWxsb2NhLWNvbmYuaC4KLQotRnJpIE1heSAyMiAwMTozODowNyAxOTk4ICBIYW5zLVBldGVyIE5pbHNzb24gIDxocEBheGlzLnNlPgotCi0JKiBjcGx1cy1kZW0uYyAoTUJVRl9TSVpFKTogQnVtcGVkIGZyb20gNTEyIHRvIDMyNzY3LgotCi0xOTk4LTA1LTIxICBNYXJrIE1pdGNoZWxsICA8bW1pdGNoZWxsQHVzYS5uZXQ+Ci0KLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogSGFuZGxlIHZvbGF0aWxlIHF1YWxpZmljYXRpb24uCi0KLTE5OTgtMDUtMjEgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgdW5pc3RkLmggYXMgd2VsbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIGdldHBhZ2VzaXplLmMgKEdOVV9PVVJfUEFHRVNJWkUpOiBVc2Ugc3lzY29uZiBvbmx5IGlmIF9TQ19QQUdFU0laRQotCWlzIGRlZmluZWQgaW4gdW5pc3RkLmguIFJlZm9ybWF0IGNvbmRpdGlvbmFsIGJsb2NrIGZvciBlYXNpZXIgcmVhZGluZy4KLQotCSogY29uZmlnLnRhYmxlIChzaGFyZWQpOiBEZWZhdWx0IHRvIG5vIGlmICR7ZW5hYmxlX3NoYXJlZH0KLQlpcyB1bnNldCBvciBlbXB0eTsgdGhpcyBsb2dpYyBpcyB1c2VkIGJ5IHRoZSB0b3BsZXZlbAotCWNvbmZpZ3VyZSBzY3JpcHRzLCB0b28uCi0KLVNhdCBNYXkgMTYgMTQ6MDE6MjYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcudGFibGU6IEFkZCBsaW5lIHRvIHNldCBlbmFibGVfc2hhcmVkIGluIHRoZSBNYWtlZmlsZQotCWFzIG5lZWRlZC4KLQotV2VkIE1heSAxMyAxNDoyNDozOCAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNwbHVzLWRlbS5jIChzcXVhbmdsZV9tb3BfdXApOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gdm9pZC4KLQkoaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUpOiBSZW1vdmUgdW51c2VkIHBhcmFtZXRlciBgb3B0aW9ucycuCi0JQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogUmVtb3ZlIGZ1bmN0aW9uIHdpZGUgdmFyaWFibGUgYGludCBpJyBhbmQKLQlyZXBsYWNlIHdpdGggYHNpemVfdCBpJyBhdCBlYWNoIGxvY2F0aW9uIHdoZXJlIGl0IGlzIHVzZWQuCi0JKGNwbHVzX21hbmdsZV9vcG5hbWUpOiBjaGFuZ2UgdHlwZSBvZiBgaScgZnJvbSBpbnQgdG8gc2l6ZV90LgotCi1XZWQgTWF5IDEzIDEzOjM5OjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWxsb2NhLWNvbmYuaDogSW5jbHVkZSBjb25maWcuaC4gIENoZWNrIEhBVkVfQUxMT0NBX0ggcmF0aGVyCi0JdGhhbiBzcGFyYyBvciBzdW4uCi0JKiBNYWtlZmlsZS5pbiAoYXJndi5vKTogRGVwZW5kIHVwb24gY29uZmlnLmggYW5kIGFsbG9jYS1jb25mLmguCi0KLUZyaSBNYXkgIDggMDA6MjM6NTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBsaWJpYmVydHlfdG9wZGlyIGNvcnJlY3RseSB3aGVuIHNyY2RpciBpcwotCSIuIiBhbmQgd2l0aF90YXJnZXRfc3ViZGlyIGlzIG5vdCBzZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBNYXkgIDcgMTM6MDE6NDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCAqLSotbWluZ3czMiogY2FzZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIE1heSAgNiAxMTozMzo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogTmV2ZXIgdXNlIGEgUElDIGZpbGUgZm9yICotKi1jeWd3aW4zMiouCi0KLQkqIE1ha2VmaWxlLmluIChjb25maWcuc3RhdHVzKTogRGVwZW5kIHVwb24gY29uZmlnLnRhYmxlLgotCi0JKiBjb25maWd1cmUuaW46IE9uIGEgY3lnd2luMzIgaG9zdCwgYWx3YXlzIGNvbXBpbGUgcmFuZG9tLCBhbmQKLQlkb24ndCB0ZXN0IGZvciBzeXNfc2lnbGlzdCwgc3Ryc2lnbmFsLCBvciBwc2lnbmFsLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjbG9jay5jOiBDaGVjayBIQVZFX1NZU19QQVJBTV9IIHJhdGhlciB0aGFuIE5PX1NZU19QQVJBTV9ILgotCSogZ2V0Y3dkLmM6IExpa2V3aXNlLgotCSogZ2V0cGFnZXNpemUuYzogTGlrZXdpc2UuCi0JKiBnZXRydW50aW1lLmM6IExpa2V3aXNlLgotCi1UdWUgTWF5ICA1IDE4OjA4OjMyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVVzZSBhdXRvY29uZiB0ZXN0cyByYXRoZXIgdGhhbiB0aGUgb2xkIGR1bW15LmMgdGVzdDoKLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0FSR19XSVRIIGNhbGxzIGZvciAtLXdpdGgtdGFyZ2V0LXN1YmRpciBhbmQKLQktLXdpdGgtbmV3bGliLiAgQWRkIEFDX0NPTkZJR19IRUFERVIuICBVc2UgQUNfUkVQTEFDRV9GVU5DUyBmb3IKLQltb3N0IGZ1bmN0aW9ucy4gIEFkZCBzcGVjaWFsIGNhc2VzIHRvIGhhbmRsZSBuZXdsaWIgYW5kIFZ4V29ya3MuCi0JUmVtb3ZlIHRhcmdldF9tYWtlZmlsZV9mcmFnLiAgQ3JlYXRlIHN0YW1wLWggaW4gQUNfT1VUUFVUIGlmCi0JQ09ORklHX0hFQURFUlMgaXMgc2V0LiAgT25seSBjYWxsIGNvbmZpZy1tbC5pbiBpbiBBQ19PVVRQVVQgaWYKLQlDT05GSUdfRklMRVMgaXMgc2V0OyBzZXQgYWNfZmlsZSBiZWZvcmUgY2FsbGluZyBpdC4KLQkqIGNvbmZpZy50YWJsZSAoYXJtLSotcmlzY2l4KiwgKi0qLWN5Z3dpbjMyKTogUmVtb3ZlLgotCSgqLSotaHB1eCosICotKi1oaXV4KiwgKi0qLWlyaXg0KiwgKi0qLXNvbGFyaXMyKik6IFJlbW92ZS4KLQkoKi0qLXN5c3Y0KiwgKi0qLWdvMzIsICotKi12eHdvcmtzNSosICotKi12eHdvcmtzKTogUmVtb3ZlCi0JKGlbMzQ1Nl0tKi1taW5ndzMyKik6IFJlbW92ZS4KLQkqIE1ha2VmaWxlLmluIChFUlJPUlNfQ0MsIENPTkZJR19ILCBORUVERURfTElTVCk6IFJlbW92ZS4KLQkoTElCT0JKUyk6IE5ldyB2YXJpYWJsZS4KLQkoSE9TVF9PRklMRVMsIERPX0FMU08sIFNUQUdFU1RVRkYpOiBSZW1vdmUuCi0JKGFsbCk6IERlcGVuZCB1cG9uIG5lZWRlZC1saXN0LiAgRG9uJ3QgY2hlY2sgUlVMRTEuCi0JKEB0YXJnZXRfbWFrZWZpbGVfZnJhZ0ApOiBSZW1vdmUuCi0JKENPTVBJTEUuYyk6IEluY2x1ZGUgQERFRlNALgotCShIRklMRVMpOiBBZGQgYWxsb2NhLWNvbmYuaC4KLQkoUkVRVUlSRURfT0ZJTEVTKTogUmVtb3ZlIGJhc2VuYW1lLm8uCi0JKCQoVEFSR0VUTElCKSk6IE5ldyB0YXJnZXQuCi0JKHN0YW1wLW5lZWRlZCwgbG5lZWRlZC1saXN0LCBuZWVkZWQuYXdrLCBzdGFtcC1jb25maWcpOiBSZW1vdmUuCi0JKGxjb25maWcuaCwgbmVlZGVkMi5hd2ssIGR1bW15Lm8sIGVycm9ycyk6IFJlbW92ZS4KLQkobmVlZGVkLWxpc3QsIGNvbmZpZy5oKTogUmV3cml0ZS4KLQkoUlVMRTEsICQoUlVMRTEpLCBSVUxFMiwgJChSVUxFMikpOiBSZW1vdmUuCi0JKC5hbHdheXMuKTogUmVtb3ZlLgotCShNYWtlZmlsZSk6IFNldCBDT05GSUdfRklMRVMgYW5kIENPTkZJR19IRUFERVJTLgotCShzdGFtcC1oKTogTmV3IHRhcmdldC4KLQkoYXRleGl0Lm8sIGNsb2NrLm8sIGdldGN3ZC5vLCBnZXRwYWdlc2l6ZS5vKTogTmV3IHRhcmdldHMuCi0JKGJhc2VuYW1lLm8pOiBEb24ndCBkZXBlbmQgdXBvbiBjb25maWcuaC4KLQkoZ2V0cnVudGltZS5vKTogRGVwZW5kIHVwb24gY29uZmlnLmguCi0JKiBhdGV4aXQuYzogSW5jbHVkZSBjb25maWcuaC4gIENoZWNrIEhBVkVfT05fRVhJVCByYXRoZXIgdGhhbgotCU5FRURfb25fZXhpdC4KLQkqIGJhc2VuYW1lLmM6IERvbid0IGluY2x1ZGUgY29uZmlnLmguICBEb24ndCBjaGVjayBORUVEX2Jhc2VuYW1lLgotCSogY2xvY2suYzogSW5jbHVkZSBjb25maWcuaC4KLQkqIGdldGN3ZC5jOiBMaWtld2lzZS4KLQkqIGdldHBhZ2VzaXplLmM6IExpa2V3aXNlLgotCSogZ2V0cnVudGltZS5jOiBMaWtld2lzZS4gIEZpeCBjaGVja3Mgd2hpY2ggc2V0IEhBVkVfR0VUUlVTQUdFIGFuZAotCUhBVkVfVElNRVMuCi0JKiBzdHJlcnJvci5jOiBDaGFuZ2UgdXNlcyBvZiBORUVEX3N5c19lcnJsaXN0IHRvCi0JSEFWRV9TWVNfRVJSTElTVC4gIExpa2V3aXNlIGZvciBORUVEX3N0cmVycm9yIGFuZCBIQVZFX1NUUkVSUk9SLgotCSogc3Ryc2lnbmFsLmM6IExpa2V3aXNlIGZvciBORUVEX3N5c19zaWdsaXN0IGFuZCBIQVZFX1NZU19TSUdMSVNULAotCWFuZCBmb3IgTkVFRF9zdHJzaWduYWwgYW5kIEhBVkVfU1RSU0lHTkFMIGFuZCBmb3IgTkVFRF9wc2lnbmFsIGFuZAotCUhBVkVfUFNJR05BTC4KLQkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgotCSogZHVtbXkuYzogUmVtb3ZlLgotCSogZnVuY3Rpb25zLmRlZjogUmVtb3ZlLgotCSogY29uZmlnL21oLWN4dXg3IChIREVGSU5FUyk6IFJlbW92ZSAtREhBVkVfU1lTQ09ORi4KLQkqIGNvbmZpZy9taC13aW5kb3dzIChIREVGSU5FUyk6IFJlbW92ZS4KLQkqIGNvbmZpZy9taC1jeWd3aW4zMjogUmVtb3ZlLgotCSogY29uZmlnL21oLWdvMzI6IFJlbW92ZS4KLQkqIGNvbmZpZy9taC1pcml4NDogUmVtb3ZlLgotCSogY29uZmlnL21oLXJpc2NpeDogUmVtb3ZlLgotCSogY29uZmlnL21oLXN5c3Y0OiBSZW1vdmUuCi0JKiBjb25maWcvbXQtbWluZ3czMjogUmVtb3ZlLgotCSogY29uZmlnL210LXZ4d29ya3M1OiBSZW1vdmUuCi0JKiBjb25maWcuaW46IE5ldyBmaWxlLCBnZW5lcmF0ZWQgdXNpbmcgYXV0b2hlYWRlci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIE1heSAgNCAxMzowMDoyOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmV3cml0ZSB0byB1c2UgYXV0b2NvbmYuCi0JKiBjb25maWd1cmU6IEdlbmVyYXRlIHVzaW5nIGF1dG9jb25mLgotCSogY29uZmlnL21oLWE2OGJzZDogUmVtb3ZlLgotCSogY29uZmlnL21oLWFwb2xsbzY4OiBSZW1vdmUuCi0JKiBjb25maWcvbWgtaHBic2Q6IFJlbW92ZS4KLQkqIGNvbmZpZy9taC1uY3IzMDAwOiBSZW1vdmUuCi0JKiBjb25maWcvbWgtc3lzdjogUmVtb3ZlLgotCSogY29uZmlnL21oLWFpeCAoUkFOTElCLCBJTlNUQUxMKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL21oLWN4dXg3IChSQU5MSUIsIElOU1RBTEwpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvbWgtaXJpeDQgKENDLCBSQU5MSUIsIElOU1RBTEwpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvbWgtc3lzdjQgKFJBTkxJQiwgSU5TVEFMTCk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy50YWJsZTogQ2hhbmdlIGNvbmZpZ19zaGVsbCB0byBDT05GSUdfU0hFTEwsIGFuZCB1c2UKLQlsaWJpYmVydHlfdG9wZGlyIHRvIGZpbmQgbW92ZS1pZi1jaGFuZ2UuCi0gCShtNjhrLWFwb2xsby1ic2QqLCBtNjhrLWFwb2xsby1zeXN2Kik6IFJlbW92ZS4KLQkoaVszNDU2XTg2LW5jci1zeXN2NCosICotKi1kZ3V4KiwgaHBwYSotaHAtYnNkKik6IFJlbW92ZS4KLQkoKi0qLWlyaXgqLCAqLSotbTg4a2JjcyosICotKi1zeXN2Kik6IFJlbW92ZS4KLQkqIE1ha2VmaWxlLmluIChzcmNkaXIpOiBTZXQgdG8gQHNyY2RpckAuCi0JKFZQQVRIKTogTGlrZXdpc2UuCi0JKHByZWZpeCwgZXhlY19wcmVmaXgsIGJpbmRpciwgbGliZGlyKTogU2V0IHRvIGF1dG9jb25mIHZhcmlhYmxlcy4KLQkoU0hFTEwsIElOU1RBTEwsIElOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogTGlrZXdpc2UuCi0JKENDLCBDRkxBR1MsIFJBTkxJQikpOiBMaWtld2lzZS4KLQkoZGF0YWRpciwgbWFuKmRpciwgaW5mb2RpciwgaW5jbHVkZWRpciwgTUFLRUlORk8pOiBSZW1vdmUuCi0JKHRhcmdldF9tYWtlZmlsZV9mcmFnLCBob3N0X21ha2VmaWxlX2ZyYWcpOiBBZGQgc3Vic3RpdHV0aW9ucy4KLQkoSU5TVEFMTF9ERVNUKTogU2V0IHRvIEBJTlNUQUxMX0RFU1RALgotCShNYWtlZmlsZSk6IERlcGVuZCB1cG9uIGNvbmZpZy5zdGF0dXMuICBEb24ndCBkZXBlbmQgdXBvbgotCSQoaG9zdF9tYWtlZmlsZV9mcmFnKSBvciAkKHRhcmdldF9tYWtlZmlsZV9mcmFnKS4KLQkoY29uZmlnLnN0YXR1cyk6IE5ldyB0YXJnZXQuCi0KLVN1biBNYXkgIDMgMTc6NTg6NDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbXQtc3Vub3M0OiBSZW1vdmUuICBTaG91bGQgYmUgaGFuZGxlZCBieSAtLXdpdGgtaGVhZGVycwotCWFuZCAtLXdpdGgtbGlicmFyaWVzIG9wdGlvbnMgYXQgdG9wIGxldmVsLgotCSogY29uZmlnLnRhYmxlOiBOZXZlciB1c2UgbXQtc3Vub3M0LgotCi0JKiBhbGxvY2EtY29uZi5oOiBOZXcgZmlsZSwgY29tYmluaW5nIGFsbG9jYS1ub3JtLmggYW5kCi0JYWxsb2NhLWJvdGNoLmguCi0JKiBhbGxvY2Etbm9ybS5oOiBSZW1vdmUuCi0JKiBhbGxvY2EtYm90Y2guaDogUmVtb3ZlLgotCSogY29uZmlndXJlLmluOiBTZXQgc2hlbGwgdmFyaWFibGVzIGZpbGVzIGFuZCBsaW5rcyB0byBlbXB0eS4KLQkqIGNvbmZpZy50YWJsZTogRG9uJ3Qgc2V0IHNoZWxsIHZhcmlhYmxlIGZpbGVzLgotCSogY29uZmlndXJlLmJhdDogRG9uJ3QgY3JlYXRlIGFsbG9jYS1jb25mLmguCi0JKiBtYWtlZmlsZS52bXM6IExpa2V3aXNlLgotCSogbXB3LWNvbmZpZy5pbjogTGlrZXdpc2UuCi0JKiB2bXNidWlsZC5jb206IExpa2V3aXNlLgotCi1GcmkgTWF5ICAxIDExOjQxOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoSE9TVF9PRklMRVMpICQoUkVRVUlSRURfT0ZJTEVTKSk6IFJlbW92ZSBvbGQKLQl0YXJnZXQgZGVwZW5kaW5nIHVwb24gY29uZmlnLmguCi0JKGFsbG9jYS5vKTogQWRkIHRhcmdldCBkZXBlbmRpbmcgdXBvbiBjb25maWcuaAotCShiYXNlbmFtZS5vLCBjaG9vc2UtdGVtcC5vLCBmbm1hdGNoLm8pOiBMaWtld2lzZS4KLQkoZ2V0b3B0Lm8sIGdldG9wdDEubywgcGV4ZWN1dGUubywgc3RyZXJyb3Iubyk6IExpa2V3aXNlLgotCShzdHJzaWduYWwubywgeHN0cmVycm9yLm8pOiBMaWtld2lzZS4KLQotRnJpIE1heSAgMSAwNDoyNjoyNSAxOTk4ICBQZXRlciBTY2hhdWVyIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4KLQotCSogY3BsdXMtZGVtLmMgKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6ICBJbml0aWFsaXplIHdvcmsuCi0KLU1vbiBBcHIgMjcgMTU6NTM6MzAgRURUIDE5OTggQW5kcmV3IE1hY0xlb2QgPGFtYWNsZW9kQGN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9xdWFsaWZpZWQpOiBSZXBsYWNlIG1pc3NpbmcgZWxzZS4KLQotU3VuIEFwciAyNiAxNTozODo1MCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY3BsdXMtZGVtLmMgKGdudV9zcGVjaWFsKTogRml4IG9mZi1ieS1vbmUgYnVnIHdoZW4gY2hlY2tpbmcgdGhlCi0JbGVuZ3RoIGluIHRoZSBuYW1lIG9mIGEgdmlydHVhbCB0YWJsZS4KLQotV2VkIEFwciAyMiAxMDo1Mzo0OSBFRFQgMTk5OCBBbmRyZXcgTWFjTGVvZCAgPGFtYWNsZW9kQGN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChzdHJ1Y3Qgd29yayBzdHVmZik6IEFkZCBmaWVsZCBmb3IgQiBhbmQgSyBtYW5nbGUgY29kZXMuCi0JKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6IENhbGwgbW9wX3VwX3NxdWFuZ2xlLgotCShjcGx1c19kZW1hbmdsZSk6IEluaXRpYWxpemUgc3F1YW5nbGUgaW5mbywgdGhlbiBjYWxsCi0JaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUuIChNb3N0IGNvZGUgbW92ZWQgdGhlcmUgYXMgd2VsbCkKLQkoaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUpOiBOZXcgZnVuY3Rpb24sIHBlcmZvcm1zIG1vc3Qgb2Ygd2hhdCB1c2UKLQl0byBiZSBkb25lIGluIGNwbHVzX2RlbWFuZ2xlLCBidXQgaXMgb25seSBjYWxsZWQgd2l0aCB0aGlzIGZpbGUuCi0JKHNxdWFuZ2xlX21vcF91cCk6IE5ldyBmdW5jdGlvbiB0byBjbGVhbiB1cCBCIGFuZCBLIGNvZGUgZGF0YS4KLQkobW9wX3VwKTogc2V0IHBvaW50ZXJzIHRvIE5VTEwgYWZ0ZXIgZnJlZWluZy4KLQkoZGVtYW5nbGVfc2lnbmF0dXJlLCBkZW1hbmdsZV90ZW1wbGF0ZSwgZGVtYW5nbGVfY2xhc3MpOiBBZGQKLQlzd2l0Y2ggZWxlbWVudHMgdG8gaGFuZGxlIEsgYW5kIEIgY29kZXMuCi0JKGRlbWFuZ2xlX3ByZWZpeCwgZ251X3NwZWNpYWwsIGRlbWFuZ2xlX3F1YWxpZmllZCk6IEFkZAotCWNvZGUgdG8gaGFuZGxlIEsgYW5kIEIgY29kZXMuCi0JKGRvX3R5cGUsIGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IEhhbmRsZSBCIGFuZCBLIGNvZGVzLgotCShyZW1lbWJlcl9LdHlwZSk6IE5ldyBmdW5jdGlvbiB0byBzdG9yZSBLIGluZm8uCi0JKHJlZ2lzdGVyX0J0eXBlLCByZW1lbWJlcl9CdHlwZSk6IE5ldyBmdW5jdGlvbnMgZm9yIEIgY29kZXMuCi0JKGZvcmdldF9CX2FuZF9LX3R5cGVzKTogTmV3IGZ1bmN0aW9uIHRvIGRlc3Ryb3kgQiBhbmQgSyBpbmZvLgotCi1GcmkgQXByIDEwIDAxOjQ5OjEwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogQ09QWUlORy5MSUIsIGNob29zZS10ZW1wLmMsIGNwbHVzLWRlbS5jOiBTeW5jIHdpdGggZWdjcyAmIGdjYy4KLQotVGh1IE1hciAgNSAwOToyMzoyOCAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZy50YWJsZTogTWFrZSBsb2NhdGluZyBmcmFnIGZpbGVzIGZhaWxzYWZlIGV2ZW4gZm9yIHRoZQotCXNwZWNpYWwgY2FzZSBpZiBjb25maWd1cmluZyBhbmQgYnVpbGRpbmcgaW4gc3JjZGlyLgotCi1Nb24gRmViIDIzIDE0OjMzOjE1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY2hvb3NlLXRlbXAuYzogRml4IGhhbmRsaW5nIG9mIHN5cy9maWxlLmggdG8gd29yayBpbiBsaWJpYmVydHkuCi0KLVN1biBGZWIgMjIgMTg6MDM6MjMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjaG9vc2UtdGVtcC5jOiBTeW5jIHdpdGggY29weSBpbiBnY2MuCi0KLVRodSBGZWIgMTIgMTY6Mjk6NDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnZXRvcHQuYzogVXBkYXRlIHRvIGxhdGVzdCBGU0YgdmVyc2lvbi4KLQkqIGdldG9wdDEuYzogTGlrZXdpc2UuCi0KLVR1ZSBGZWIgMTAgMTY6NTg6MzMgMTk5OCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZ251X3NwZWNpYWwpOiBEb24ndCBnZXQgY29uZnVzZWQgYnkgLjxkaWdpdHM+Ci0Jc3RyaW5ncyB0aGF0IGFyZSBub3QgYWN0dWFsbHkgbGVuZ3Rocy4KLQotRnJpIEZlYiAgNiAwMTozNToxNyAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogRG9uJ3QgcGFzcyBQSUNGTEFHLgotCSguYy5vKTogQ2hlY2sgdmFsdWUgb2YgZW5hYmxlX3NoYXJlZCwgbm90IFBJQ0ZMQUcuCi0JKHN0YW1wLXBpY2Rpcik6IERpdG8uCi0KLVRodSBGZWIgIDUgMTg6NDg6NTYgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy9taC1jeWd3aW4zMjogcmVtb3ZlIHZhc3ByaW50Zi5vIGZyb20gRVhUUkFfT0ZJTEVTCi0gICAgICAgIHNpbmNlIGl0IGdldHMgYnVpbHQgYXV0b21hdGljYWxseQotCi1TdW4gRmViICAxIDAyOjUyOjMyIDE5OTggIE1pa2UgU3R1bXAgIDxtcnNAd3JzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlICh2eHdvcmtzIGNvbmZpZ3MpOiBEZWZhdWx0IHRvIFZ4V29ya3MgNS54LCBhcyB0aGF0IGlzCi0JdGhlIGN1cnJlbnRseSBzaGlwcGluZyBPUy4KLQotVHVlIEphbiAyNyAxNjowODoyMCAxOTk4ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogdm1zYnVpbGQuY29tIFtSRVFVSVJFX09GSUxFU106IFN5bmNocm9uaXplZCB3aXRoIE1ha2VmaWxlLmluOgotCUFkZCBmbm1hdGNoLm8gYW5kIG9iamFsbG9jLm87IHJlbW92ZSB2YXNwcmludGYuby4KLQlbY29uZmlnLmhdOiBEZWZpbmUgTkVFRF9zdHJzaWduYWwuCi0KLU1vbiBKYW4gMTkgMTI6MjA6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmdW5jdGlvbnMuZGVmOiBDb3JyZWN0IGFyZ3VtZW50IHR5cGVzIGZvciBzdHJlcnJvciBhbmQKLQlzdHJzaWduYWwuICBSZXBvcnRlZCBieSBBbGV4IEd1dG1hbiA8YWd1dG1hbkBlbWMuY29tPi4KLQotU3VuIEphbiAxOCAxNTo1NzoyOCAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgotCi0JKiB2YXNwcmludGYuYyAoaW50X3Zhc3ByaW50Zik6IEluY3JlYXNlIGJ1ZmZlciBzaXplIGZvciBmbG9hdC9kb3VibGUKLQl2YWx1ZXMuCi0KLVNhdCBKYW4gMTcgMjI6Mjg6MzggMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0JCQkgIEouSi4gVmFuZGVySGVpamRlbiA8Si5KLnZhbmRlckhlaWpkZW5Ac3R1ZGVudC51dHdlbnRlLm5sPgotCi0JQWRkIG1pbmd3MzIgc3VwcG9ydC4KLQkqIHBleGVjdXRlLmMgKHBleGVjdXRlKTogTmV3IGZ1bmN0aW9uIGZvciBtaW5ndzMyLiBTdXBwb3J0cyBwaXBlcy4KLQkocHdhaXQpOiBOZXcgZnVuY3Rpb24gZm9yIG1pbmd3MzIuCi0KLQkqIGNvbmZpZy50YWJsZSAoaVszNDU2XTg2LSotbWluZ3czMiopOiBTdXBwb3J0IGZvciBpMzg2LW1pbmd3MzIuCi0JKiBjb25maWcvbXQtbWluZ3czMjogTmV3IGZpbGUuCi0JKiB4bWFsbG9jLmMgKGZpcnN0X2JyZWFrKTogTm90IHVzZWQgZm9yIG1pbmd3MzIuCi0JKHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSk6IERvbid0IHVzZSBzYnJrIG9uIG1pbmd3MzIuCi0JKHhtYWxsb2MpOiBMaWtld2lzZS4KLQkoeHJlYWxsb2MpOiBMaWtld2lzZS4KLQotU2F0IEphbiAxNyAyMjoyODowNSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNob29zZS10ZW1wLmM6IFN5bmMgd2l0aCBnY2MgdmVyc2lvbi4KLQotVHVlIEphbiAxMyAxODozNDozOSAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsX3RvX2xpYmRpciwgaW5zdGFsbF90b190b29sZGlyKTogQWRkIE1VTFRJU1VCRElSCi0JdG8gYWxsIGZpbGVuYW1lcyBpbiBsaWJkaXIgYW5kIHRvb2xkaXIuCi0JKGRpc3RjbGVhbik6IERvIE1VTFRJQ0xFQU4gYmVmb3JlIGRlbGV0aW5nIE1ha2VmaWxlLgotCShzdGFtcC1uZWVkZWQsIHN0YW1wLWNvbmZpZyk6IEFkZCBNVUxUSVNSQ1RPUCB0bwotCXBhdGhuYW1lIGZvciBtb3ZlLWlmLWNoYW5nZS4KLQotVGh1IERlYyAgNCAxNzoyNToxOSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHN0cnNpZ25hbC5jIChzeXNfbnNpZyk6IFRyeSBOU0lHIGFuZCBfTlNJRy4KLQotV2VkIE5vdiAxOSAxMzozNzowNiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogYWxsb2NhLW5vcm0uaCAoYWxsb2NhLCBHQ0MgY2FzZSk6IERvbid0IHJlZGVmaW5lIGFsbG9jYSBpZiBpdAotCXdhcyBhbHJlYWR5IGRlZmluZWQgcHJldmlvdXNseS4KLQotTW9uIE5vdiAxMCAxMjo0ODowMyAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQG1hY3FlbC5iZT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBVc2UgLi4vaW5zdGFsbC1zaCwgbm90IGluc3RhbGwuCi0KLVR1ZSBPY3QgMjggMjM6NDE6MTUgMTk5NyAgSnVkeSBHb2xkYmVyZyAgPGpvZHlnQGlkdC5uZXQ+Ci0KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgcGV4ZWN1dGUuYy4KLQotV2VkIE9jdCAxNSAxOToxMzo0OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzcHJpbnRmLmM6IENvbnNpc3RlbnRseSB1c2UgZWl0aGVyIHN0ZGFyZyBvciB2YXJhcmdzLgotCi1UdWUgT2N0IDE0IDEyOjAxOjAwIDE5OTcgIE1hcmsgTWl0Y2hlbGwgIDxtbWl0Y2hlbGxAdXNhLm5ldD4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3NpZ25hdHVyZSk6IERvbid0IGxvb2sgZm9yIHJldHVybiB0eXBlcyBvbgotCWNvbnN0cnVjdG9ycy4gIEhhbmRsZSBtZW1iZXIgdGVtcGxhdGUgY29uc3RydWN0b3JzLgotCi1GcmkgT2N0ICAzIDE3OjUzOjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogUkVBRE1FOiBGaXggY29uZmlndXJhdGlvbiBpbnN0cnVjdGlvbnMuCi0KLU1vbiBTZXAgMjkgMTI6Mjg6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZXhlY3V0ZS5jOiBVcGRhdGUgdG8gY3VycmVudCB2ZXJzaW9uIGZyb20gL2dkL2dudS9saWI6Ci0KLQlNb24gU2VwIDI5IDEyOjI3OjU5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHBleGVjdXRlLmM6IFVzZSBzcGF3biBpZiBfX0NZR1dJTjMyX18uCi0KLQkxOTk3LTA4LTA4ICBQYXVsIEVnZ2VydCAgPGVnZ2VydEB0d2luc3VuLmNvbT4KLQotICAgICAgICAqIHBleGVjdXRlLmM6IEluY2x1ZGUgImNvbmZpZy5oIiBmaXJzdCwgYXMgcGVyIGF1dG9jb25mIG1hbnVhbC4KLQotCUZyaSBKdW4gMjcgMTU6MjA6MjkgMTk5NyAgU2NvdHQgQ2hyaXN0bGV5IDxzY290dGNAbmV0LWNvbW11bml0eS5jb20+Ci0KLSAgICAgICAgKiBwZXhlY3V0ZS5jIChmaXhfYXJndik6IE5ldyBmdW5jdGlvbi4KLSAgICAgICAgKHBleGVjdXRlKTogV2luMzIgYnV0IG5vdCBDeWd3aW4zMiBuZWVkcyBpdHMgYXJndW1lbnRzIGZpeGVkLgotICAgICAgICBBZGQgdW5kZXJzY29yZSB0byBjd2FpdCBmdW5jdGlvbiBjYWxsLgotCi1TdW4gU2VwIDI4IDEyOjAwOjUyIDE5OTcgIE1hcmsgTWl0Y2hlbGwgIDxtbWl0Y2hlbGxAdXNhLm5ldD4KLQotICAgICAgICAqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6IEFkZCBuZXcgcGFyYW1ldGVyLiAgSGFuZGxlIG5ldwotICAgICAgICB0ZW1wbGF0ZS1mdW5jdGlvbiBtYW5nbGluZy4KLSAgICAgICAgKGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3Jlcyk6IE5ldyBmdW5jdGlvbi4KLSAgICAgICAgKGRlbWFuZ2xlX3NpZ25hdHVyZSk6IEhhbmRsZSBuZXcgbmFtZS1tYW5nbGluZyBzY2hlbWUuCi0KLVdlZCBTZXAgMjQgMDA6MzE6NTkgMTk5NyAgRmVsaXggTGVlICA8ZmxlZUB5aW4uY3lnbnVzLmNvbT4KLQotCSogYXNwcmludGYuYzogc3RkYXJnLmggd2hlbiBBTE1PU1RfU1REQwotCSogY29uZmlnL21oLXdpbmRvd3MgKEVYVFJBX09GSUxFUyk6IGFkZCBhc3ByaW50Zi5vIGFuZAotIAlzdHJuY2FzZWNtcC5vLgotCi1UaHUgQXVnIDI4IDE0OjI3OjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogdmFzcHJpbnRmLmMgKHZhc3ByaW50Zik6IEFsbG93IGZvciBfQlNEX1ZBX0xJU1RfLgotCi0JKiBjb25maWcudGFibGU6IEFkZCBjYXNlIGZvciBGcmVlQlNEIDIuMSBhbmQgMi4yLCBuZWVkcyBtaC1mYnNkMjEuCi0KLQkqIGNvbmZpZy9taC1mYnNkMjEgKEVYVFJBX09GSUxFUyk6IEZvcmNlIHZhc3ByaW50Zi5vCi0KLVdlZCBTZXAgMTAgMTI6NDM6MTAgMTk5NyAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuZF90eXBlKTogQ2hhbmdlICJjb21wbGV4IiB0byAiX19jb21wbGV4Ii4KLQotRnJpIFNlcCAgNSAxNjozNDo0MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFzcHJpbnRmLmMgKGFzcHJpbnRmKTogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIGFzcHJpbnRmLmMKLQkqIGZ1bmN0aW9ucy5kZWY6IERpdHRvLgotCi1UaHUgQXVnIDI4IDE4OjUzOjM0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogYXJndi5jIChkdXBhcmd2KTogTmV3IGZ1bmN0aW9uLCBkdXBsaWNhdGUgYW4gYXJndW1lbnQgdmVjdG9yLgotCi1UdWUgQXVnIDE5IDIwOjI4OjQ1IDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9taC1jeWd3aW4zMjogYWxzbyBidWlsZCByYW5kb20ubwotCi1UdWUgQXVnIDE5IDE3OjEwOjU2IDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IEFkZCAnZXh0ZXJuJyB0byBwcmVwZW5kc191bmRlcnNjb3JlLgotCi1XZWQgSnVsIDMwIDExOjQyOjE5IDE5OTcgIFBlciBCb3RobmVyICA8Ym90aG5lckBjeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYzogVmFyaW91cyBjaGFuZ2VzIHRvIHByb2R1Y2UgSmF2YSBvdXRwdXQgd2hlbiBwYXNzZWQKLQlETUdMX0pBVkEuICBUaHVzICI6OiIgYmVjb21lcyAiLiIgYW5kICJKQXJyYXk8Rm9vPiIgYmVjb21lcyAiRm9vW10iLgotCShtYWluKTogU3VwcG9ydCAtLWphdmEgYW5kIC1qIGZsYWdzIHRvIHNldCBETUdMX0pBVkEuCi0KLVR1ZSBKdWwgMjIgMTk6MDU6MjMgMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBjb25maWcvbWgtZ28zMiAoQ0MsIEFSLCBSQU5MSUIpOiBEb24ndCBkZWZpbmUuCi0KLVR1ZSBKdWwgMjIgMTc6NDk6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoUkVRVUlSRURfT0ZJTEVTKTogQWRkIHBleGVjdXRlLm8uCi0JKHBleGVjdXRlLm8pOiBOZXcgdGFyZ2V0LgotCi0JKiBNYWtlZmlsZS5pbiAoc3RhbXAtbmVlZGVkKTogTmV3IHRhcmdldCwgcmVwbGFjaW5nIG5lZWRlZC1saXN0LgotCShuZWVkZWQtbGlzdCk6IEp1c3QgZGVwZW5kIHVwb24gc3RhbXAtbmVlZGVkLgotCShzdGFtcC1jb25maWcpOiBOZXcgdGFyZ2V0LCByZXBsYWNpbmcgY29uZmlnLmguCi0JKGNvbmZpZy5oKTogSnVzdCBkZXBlbmQgdXBvbiBzdGFtcC1jb25maWcuCi0JKG1vc3RseWNsZWFuKTogUmVtb3ZlIHN0YW1wLSouCi0KLVRodSBKdW4gMTIgMTE6MDA6MTggMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogcGFzcyBJTlNUQUxMLCBJTlNUQUxMX1BST0dSQU0gYW5kCi0JSU5TVEFMTF9EQVRBIGZvciBtdWx0aWxpYmJlZCBpbnN0YWxscwotCi1UdWUgSnVuICAzIDEzOjIxOjA1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQlUdWUgRGVjIDEwIDA5OjQ0OjU3IDE5OTYgIFBhdWwgRWdnZXJ0ICA8ZWdnZXJ0QHR3aW5zdW4uY29tPgotCi0JKiBjaG9vc2UtdGVtcC5jIChjaG9vc2VfdGVtcF9iYXNlKTogRG9uJ3QgZHVtcCBjb3JlIGlmIFRNUERJUiBpcyBlbXB0eS4KLQotCSogY2hvb3NlLXRlbXAuYyAodHJ5KTogSW5zaXN0IHRoYXQgdGVtcCBkaXIgYmUgc2VhcmNoYWJsZS4KLQotCVdlZCBPY3QgMjMgMTc6MzY6MzkgMTk5NiAgRG91ZyBSdXBwICAocnVwcEBnbmF0LmNvbSkKLQotCSogY2hvb3NlLXRlbXAuYyAoY2hvb3NlX3RlbXBfYmFzZSk6IE9uIFZNUywgdXNlIHByb3BlciBzeW50YXgKLQlmb3IgY3VycmVudCBkaXJlY3RvcnkuCi0KLQlTYXQgRmViIDE1IDE5OjAzOjQ4IDE5OTcgIEdlb2ZmcmV5IE5vZXIgIChub2VyQGN5Z251cy5jb20pCi0KLQkqIHBleGVjdXRlLmM6IFJlbW92ZSBzcGVjaWFsIGNhc2VzIGZvciBjeWd3aW4zMi4KLQkocHdhaXQpOiBSZW1vdmUgbG9jYWwgZGVmaW5pdGlvbiBvZiBgcGlkJy4KLQotCVR1ZSBOb3YgMTIgMTg6MjY6MTUgMTk5NiAgRG91ZyBSdXBwICAocnVwcEBnbmF0LmNvbSkKLQotCSogcGV4ZWN1dGUuYyAodmZvcmspOiBTdXBwbHkgbmV3IGRlZmluaXRpb24gZm9yIFZNUy4KLQkocHdhaXQpOiBVc2Ugd2FpdHBpZCBpbnN0ZWFkIG9mIHdhaXQgZm9yIFZNUy4KLQotVHVlIE1heSAyMCAxNDowMjoyMCAxOTk3ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogSGFuZGxlIGBKJy4KLQkoZGVtYW5nbGVfZnVuZF90eXBlKTogUHJpbnQgImNvbXBsZXgiIGZvciBpdC4KLQotV2VkIEFwciAzMCAxMjoxNTo0NSAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdHVybiBvbiBtdWx0aWxpYiBoZXJlLgotCi1Nb24gQXByIDI4IDE5OjA0OjMxIDE5OTcgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+Ci0KLQkqIG9ic3RhY2suYzogbW92ZSBfb2JzdGFja19tZW1vcnlfdXNlZCBvdXRzaWRlIG9mIGlmZGVmLiAgQ2Fubm90IGJlCi0JZWxpZGVkOyBuZWVkZWQgYnkgZ2RiIGFuZCBub3QgcHJlc2VudCBpbiBsaWJjLgotCi1UaHUgQXByIDI0IDE5OjMzOjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogUmVtb3ZlIHRtcG11bHRpLm91dC4KLQotVHVlIEFwciAyMiAxMDoyNToxNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZmxvYXRmb3JtYXQuYyAoZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlYnl0ZV9iaWd3b3JkKToKLQlBZGQgbmV3IGZsb2F0Zm9ybWF0LCBtYWlubHkgZm9yIEFSTSBkb3VibGVzLgotCi1Nb24gQXByIDE0IDEyOjExOjE2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlOiBVc2UgJHtjb25maWdfc2hlbGx9IHdpdGggJHttb3ZlaWZjaGFuZ2V9LiAgRnJvbQotCVRob21hcyBHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT4uCi0KLUZyaSBBcHIgIDQgMDM6MDk6MjQgMTk5NyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRW5hYmxlIG11bHRpbGliaW5nIGJ5IGRlZmF1bHQuCi0JVXBkYXRlIG11bHRpbGliIHRlbXBsYXRlIHRvIHJlYWQgY29uZmlnLW1sLmluLgotCi1UdWUgQXByICAxIDE2OjI2OjM5IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IEFkZCBvYmphbGxvYy4KLQotTW9uIE1hciAzMSAyMzo1Nzo1MSAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfaXQpOiBBZGQgcHJvdG90eXBlIGRlY2xhcmF0aW9uLgotCSh1c2FnZSwgZmF0YWwpOiBMaWtld2lzZS4KLQotCSogeGV4aXQuYyAoX3hleGl0X2NsZWFudXApOiBBZGQgcHJvdG90eXBlLgotCi0JKiBzdHJlcnJvci5jIChpbml0X2Vycm9yX3RhYmxlcyk6IERlY2xhcmUuCi0KLUZyaSBNYXIgMjggMTE6NDM6MjAgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIGZ1bmN0aW9ucy5kZWY6IEFkZCBERUYgb2YgdmFzcHJpbnRmLCBhbmQgREVGRlVOQyBvZiBzdHJzaWduYWwuCi0JKiBzdHJzaWduYWwuYzogT25seSBkZWZpbmUgc3Ryc2lnbmFsIGlmIE5FRURfc3Ryc2lnbmFsLgotCSogTWFrZWZpbGUuaW4gKFJFUVVJUkVEX09GSUxFUyk6IFJlbW92ZSB2YXNwcmludGYuby4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIE5FRURfc3Ryc2lnbmFsIHRvIHhjb25maWcuaC4gIEFkZCB2YXNwcmludGYubwotCXRvIHhuZWVkZWQtbGlzdC4KLQkqIGNvbmZpZy9taC1jeWd3aW4zMiAoSERFRklORVMpOiBBZGQgLURORUVEX3N0cnNpZ25hbC4KLQkoRVhUUkFfT0ZJTEVTKTogRGVmaW5lIHRvIHZhc3ByaW50Zi5vLgotCSogY29uZmlnL21oLXdpbmRvd3MgKEhERUZJTkVTKTogQWRkIC1ETkVFRF9zdHJzaWduYWwuCi0JKEVYVFJBX09GSUxFUyk6IEFkZCB2YXNwcmludGYuby4KLQkqIGNvbmZpZy9tdC12eHdvcmtzNSAodnhjb25maWcuaCk6IERlZmluZSBORUVEX3N0cnNpZ25hbC4KLQkodnhuZWVkZWQtbGlzdCk6IEFkZCB2YXNwcmludGYuby4KLQotVGh1IE1hciAyMCAxNzowMjowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamFsbG9jLmM6IEluY2x1ZGUgPHN0ZGlvLmg+LgotCi1Nb24gTWFyIDE3IDE5OjIzOjExIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqYWxsb2MuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIG9iamFsbG9jLmMKLQkoUkVRVUlSRURfT0ZJTEVTKTogQWRkIG9iamFsbG9jLm8uCi0JKG9iamFsbG9jLm8pOiBOZXcgdGFyZ2V0LgotCi1TYXQgTWFyIDE1IDE4OjQ5OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JzdGFjay5jOiBVcGRhdGUgdG8gY3VycmVudCBGU0YgdmVyc2lvbi4KLQotRnJpIE1hciAxNCAxNDoxODo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBBZGQgcHJvdG90eXBlcyBmb3IgYWxsIHN0YXRpYyBmdW5jdGlvbnMuCi0JKG15c3Ryc3RyKTogTWFrZSBzdGF0aWMuICBNYWtlIGFyZ3VtZW50cyBhbmQgcmVzdWx0IGNvbnN0LgotCShjcGx1c19tYXRjaCk6IFJlbW92ZTsgbm90IHVzZWQuCi0KLVR1ZSBNYXIgMTEgMTQ6MjA6MzEgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZ251X3NwZWNpYWwpOiBDYWxsIGRlbWFuZ2xlZF9mdW5kX3R5cGUgZm9yIG90aGVyCi0JX190KiBzeW1ib2xzLgotCi1UdWUgTWFyIDExIDE1OjQxOjIxIDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBzcGFjZXMuYzogRGVjbGFyZSBtYWxsb2MgYW5kIGZyZWUgcHJvcGVybHkuCi0JKiBzdHJzaWduYWwuYyAoaW5pdF9zaWduYWxfdGFibGVzKTogQWRkIHByb3RvdHlwZS4KLQkqIHhhdGV4aXQuYyAoX3hleGl0X2NsZWFudXApOiBBZGQgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucy4KLQotV2VkIEZlYiAxOSAxNTo0MzoyNCAxOTk3ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChsbmVlZGVkLWxpc3QpOiBJZiBhbGxvY2EubyBpcyBuZWVkZWQsIHhleGl0Lm8gaXMKLQlhbHNvIHJlcXVpcmVkIGJlY2F1c2Ugb2YgeG1hbGxvYy5vLgotCi1GcmkgRmViIDE0IDEzOjQzOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Ryc2lnbmFsLmM6IFVuY29uZGl0aW9uYWxseSByZWRlZmluZSBzeXNfc2lnbGlzdCBhcm91bmQgdGhlCi0JaW5jbHVzaW9uIG9mIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzLgotCi1UaHUgRmViIDEzIDIyOjAxOjA0IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFJlbW92ZSA4IGJpdCBjaGFyYWN0ZXJzLiAgVXBkYXRlIHRvIGxhdGVzdAotCWdjYyByZWxlYXNlLgotCi1UdWUgRmViICA0IDExOjUyOjE5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Ryc2lnbmFsLmM6IFVzZSBORUVEX3N5c19zaWdsaXN0IGluc3RlYWQgb2YKLQlMT1NJTkdfU1lTX1NJR0xJU1QuCi0JKiBjb25maWcudGFibGU6IERvbid0IHVzZSBtaC1seW54b3MuCi0JKiBjb25maWcvbWgtbHlueG9zOiBSZW1vdmUuCi0KLVRodSBKYW4gMTYgMTQ6NTE6MDMgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBGaXggaW5kZW50aW5nOyBtYWtlIGlkZW50aWNhbCB0byB0aGUgY29weQotCWluIEdDQy4KLQkoZG9fdHlwZSwgY2FzZSAnTScpOiBDaGVjayBmb3IgYSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGEgY2xhc3MuCi0KLVRodSBEZWMgMTkgMTM6NTE6MzMgMTk5NiAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvbXQtdnh3b3JrczUgKHZ4bmVlZGVkLWxpc3QpOiBSZW1vdmUgc2lnc2V0bWFzay5vLCBzaW5jZQotCXZ4d29ya3MgNS5bMC0zXSBhbGwgaGF2ZSBzaWdzZXRtYXNrIGluIHRoZW07IHRoZSBvbmUgcHJvdmlkZWQgYnkKLQlsaWJpYmVydHkgaXMgaW5jb3JyZWN0LCBhcyB3ZWxsLgotCi1Nb24gRGVjICAyIDE1OjAzOjQyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogYWxsb2NhLmMgKGFsbG9jYSk6IFdoZW4gY29tcGlsZWQgd2l0aCBhbiBBTlNJL0lTTyBjb21waWxlciwKLQlhbGxvY2EgdGFrZXMgYSBzaXplX3QgYXJndW1lbnQsIG5vdCBqdXN0IHVuc2lnbmVkLgotCi1Nb24gTm92IDE4IDE1OjQyOjA4IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IE5vdGUgdGhhdCB0aGlzIGZpbGUgYWxzbyBsaXZlcyBpbiBHQ0MuCi0KLU1vbiBOb3YgMTggMTU6MTk6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBhbGxvY2EuYzogUmVtb3ZlIGluY2x1ZGUgb2YgbGliaWJlcnR5LmggZm9yIGhwdXguCi0JKiBhcmd2LmM6ICBSZXBsYWNlIGRlZnMgZnJvbSBsaWJpYmVydHkuaC4KLQkqIHNwYWNlcy5jOiBQdXQgYmFjayBleHRlcm5zIGZyb20gcmVtb3ZlZCBmcm9tIGxpYmliZXJ0eS5oLgotCSogdmFzcHJpbnRmLmM6IFJlbW92ZSBpbmNsdWRlIG9mIGxpYmliZXJ0eS5oIGZvciBocHV4LgotCi1Nb24gTm92IDE4IDE0OjA4OjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3JpdHRlcnMuY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IENoZWNraW5nIGluIGFnYWluOyBsYXN0IGNoZWNraW4gZmlsZWQgZHVlIHRvIHN0aWNreSB0YWcuCi0KLVdlZCBOb3YgMTMgMDg6MjI6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYzogUmV2ZXJ0IGxhc3QgdHdvIGNvbW1pdHMgZHVlIHRvIGNvbmZsaWN0cyB3aXRoCi0JaHB1eCBzeXN0ZW0gaGVhZGVycy4KLQotV2VkIE5vdiAxMyAwODoyMjowMCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIGFsbG9jYS5jLCBhcmd2LmMsIHNwYWNlcy5jLCBzdHJjYXNlY21wLmMsIHZhc3ByaW50Zi5jLCB2cHJpbnRmLmM6Ci0JUmV2ZXJ0IGxhc3QgY29tbWl0IGR1ZSB0byBjb25mbGljdHMgd2l0aCBocHV4IHN5c3RlbSBoZWFkZXJzLgotCi1XZWQgTm92IDEzIDEwOjM2OjUwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKHh7bSxyZX1hbGxvYyk6IE1ha2UgZGVjbGFyYXRpb25zIGNvbXBhdGliaWxlIHdpdGgKLQlsaWJpYmVydHkuaCB3aGVuIGNvbXBpbGVkIHdpdGggYSBzdGFuZGFyZCBjb21waWxlci4KLQotVHVlIE5vdiAxMiAxNjozMTowMCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIGFsbG9jYS5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oIGZvciBkZWZpbml0aW9uIG9mIHhtYWxsb2MuCi0JRG9uJ3QgcmVkZWZpbmUgTlVMTC4KLQkqIGFyZ3YuYzogTW92ZSBwcm90b3R5cGVzIHRvIGxpYmliZXJ0eS5oLgotCSogY3BsdXMtZGVtLmM6IEluY2x1ZGUgbGliaWJlcnR5LmggZm9yIGRlZmluaXRpb24gb2YgeG1hbGxvYy4KLQlEb24ndCByZWRlZmluZSBOVUxMLgotCVVzZSBjYXN0cyB0byBlbGltaW5hdGUgY29tcGlsZXIgd2FybmluZ3MuCi0JKiBzcGFjZXMuYzogUmVtb3ZlIHByb3RvdHlwZXMgZm9yIG1hbGxvYyBhbmQgZnJlZSB3aGljaCBhcmUKLQlhbHJlYWR5IGluIGxpYmlicnR5LmguCi0JKiBzdHJjYXNlY21wLmM6IFVzZSBjYXN0cyB0byBlbGltaW5hdGUgY29tcGlsZXIgd2FybmluZ3MuCi0JKiB2YXNwcmludGYuYzogSW5jbHVkZSBsaWJpYmVydHkuaCBmb3IgZGVmaW5pdGlvbiBvZiBtYWxsb2MuCi0JRG9uJ3QgcmVkZWZpbmUgTlVMTC4KLQkqIHZwcmludGYuYzogSW5jbHVkZSBzdGRhcmcuaCBpZiBfX1NURENfXy4KLQotRnJpIE9jdCAxMSAxNTo0MjoxMiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtd2luZG93czogIEFkZCBzdHJjYXNlY21wLm8gdG8gRVhUUkFfT0ZJTEVTLgotCi1GcmkgT2N0IDExIDExOjE2OjMxIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LmMgKG1wd2lmeV9maWxlbmFtZSk6IFJld3JpdGUgdG8gc2ltcGxpZnksIGFuZCB0byBoYW5kbGUKLQl1cHdhcmQgY29tcG9uZW50cyBjb3JyZWN0bHkuCi0KLVR1ZSBPY3QgIDggMDg6NTU6MzQgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnRhYmxlLCBjb25maWcvbWgtd2luZG93czogIEFkZCBzdXBwb3J0IGZvciBidWlsZGluZyB1bmRlcgotCU1TVkMgKHRoZSBNaWNyb3NvZnQgYnVpbGQgZW52aXJvbm1lbnQpLgotCi1Nb24gT2N0ICA3IDEwOjUwOjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZm5tYXRjaC5jOiBVbmRlZiBjb25zdCBpZiBub3QgX19TVERDX18uCi0KLVRodSBPY3QgIDMgMTM6NDY6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmbm1hdGNoLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBmbm1hdGNoLmMuCi0JKFJFUVVJUkVEX09GSUxFUyk6IEFkZCBmbm1hdGNoLm8uCi0JKGZubWF0Y2gubyk6IE5ldyB0YXJnZXQuCi0KLVdlZCBTZXAgMTggMTQ6NDk6MTMgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBGaXggaGFuZGxpbmcgb2YgYWRkcmVzcyBhcmdzLgotCShnbnVfc3BlY2lhbCk6IEhhbmRsZSB0eXBlX2luZm8gc3R1ZmYuCi0KLUZyaSBTZXAgMTMgMTc6NTI6NTUgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHcuYyAoRGVidWdQSSk6IE1ha2Ugc2V0dGFibGUgZnJvbSB0aGUgZW52IHZhciBERUJVR19QQVRITkFNRVMuCi0JKG1wd2lmeV9maWxlbmFtZSk6IEhhbmRsZSAiOjovIiBjYXNlLgotCi1UaHUgU2VwIDEyIDEzOjMwOjQwIDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9taC1jeWd3aW4zMjogbmV3IGZpbGUgKG5lZWQgLURORUVEX2Jhc2VuYW1lIGFuZAotCQktRE5FRURfc3lzX3NpZ2xpc3QgZm9yIG5hdGl2ZSBOVCByZWJ1aWxkaW5nKQotCSogY29uZmlnLnRhYmxlICgqLSotY3lnd2luMzIpOiBuZXcgZW50cnkKLQkqIGNob29zZS10ZW1wLmM6IGJyaW5nIGluIHN5bmMgd2l0aCBnY2MgKHJldmVydCBBdWcgMTcgY2hhbmdlKQotCi1UaHUgQXVnIDI5IDE2OjQ4OjQ1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlIChpWzM0NV04Ni0qLSopOiBSZWNvZ25pemUgaTY4NiBmb3IgcGVudGl1bSBwcm8uCi0KLVR1ZSBBdWcgMjcgMTM6NDc6NTggMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBwZXhlY3V0ZS5jIChwZXhlY3V0ZSkgW01QV106IFJlbW92ZSBvbGQgYm9ndXMgY29kZSB0aGF0Ci0JbWVzc2VkIHdpdGggYXJndW1lbnRzIHRoYXQgaW5jbHVkZWQgYSAnLycsIGFkZCBlc2NhcGUgY2hhcnMKLQl0byBkb3VibGUgcXVvdGVzLCByZW1vdmUgY29uc3QgZGVjbCBmcm9tIGFyZyB0aGF0IE1hYwotCWNvbXBpbGVycyBkb24ndCBzZWVtIHRvIGxpa2UuCi0KLVNhdCBBdWcgMTcgMDQ6NDQ6MjcgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogcGV4ZWN1dGUuYzogVXBkYXRlIHRlc3QgZm9yIHdpbjMyICgmJiAhIGN5Z3dpbjMyKS4KLQkqIGNob29zZS10ZW1wLmM6IGZpeCBXSU4zMiBwcmVwcm9jZXNzb3IgZGVmaW5lcwotCi1UaHUgQXVnIDE1IDEyOjI2OjQ4IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBBZGQgQERBU0hfQ19GTEFHQCBhbmQgQFNFR01FTlRfRkxBRyh7RGVmYXVsdH0pQAotCXRvIGVkaXRpbmcgb2YgZGVmYXVsdCBtYWtlZmlsZSBydWxlLgotCi1TdW4gQXVnIDExIDIxOjAzOjI3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGFsbG9jYS1ub3JtLmg6ICBJbmNsdWRlIDxtYWxsb2MuaD4gaWYgX1dJTjMyLgotCSogYXJndi5jOiAgSW5jbHVkZSBub24tcHJvdG90eXBlZCBkZWNscyBmb3IgbWFsbG9jIGFuZCBzdHJpbmcKLQlmdW5jdGlvbnMgaWYgISBfV0lOMzIgb3IgaWYgX19HTlVDX18uCi0KLVRodSBBdWcgIDggMTI6NDI6NDAgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZy5oLXZtczogTmV3IGZpbGUuCi0JKiBtYWtlZmlsZS52bXM6IFVzZSBpdC4KLQotV2VkIEF1ZyAgNyAxNzoxNjoxMiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYyAoX2dldG9wdF9pbnRlcm5hbCk6ICBJZiBhcmdjIGlzIDAsIGp1c3QgcmV0dXJuIChiZWZvcmUKLQl3ZSByZWZlcmVuY2UgKmFyZ3YgYW5kIHNlZ2ZhdWx0KS4KLQotTW9uIEF1ZyAgNSAwMToyOTowOCAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBBZGQgbXVsdGlsaWIub3V0LgotCi1UaHUgSnVsIDE4IDE3OjQwOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWxsb2NhLW5vcm0uaDogQ2hhbmdlICNpZmRlZiBzcGFyYyB0byAjaWYgZGVmaW5lZCAoc3BhcmMpICYmCi0JZGVmaW5lZCAoc3VuKS4gIEZyb20gQW5kcmV3IEdpZXJ0aCA8QU5EUkVXR0BtaWNyb2xpc2UuY28udWs+LgotCi1Nb24gSnVsICAxIDEzOjQwOjQ0IDE5OTYgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JVHVlIE1heSAyOCAxNToyOTowMyAxOTk2ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogdm1zYnVpbGQuY29tIChSRVFVSVJEX09GSUxFUyk6IEFkZCBjaG9vc2UtdGVtcC5vIGFuZCB4c3RyZHVwLm8uCi0KLQlUaHUgSmFuIDI1IDE4OjIwOjA0IDE5OTYgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiB2bXNidWlsZC5jb206IENoYW5nZXMgdG8gaGFuZGxlIERFRkZVTkMob25fZXhpdCkuCi0JKGRvX29maWxlcyk6IEFsbG93IG5vbmV4aXN0ZW50IHNvdXJjZSBmaWxlIGluIHBhc3MgMy4KLQkoY2hrX2RlZmZ1bmMpOiBOZXcgcm91dGluZS4KLQotVHVlIEp1biAyNSAxOToyNDo0MyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBwZXhlY3V0ZS5jIChQRVhFQ1VURV9WRVJCT1NFKTogRGVmaW5lLgotCShNUFcgcGV4ZWN1dGUpOiBDaGVjayBmbGFncyAmIFBFWEVDVVRFX1ZFUkJPU0UgaW5zdGVhZCBvZiB2ZXJib3NlX2ZsYWcuCi0KLVR1ZSBKdW4gMjUgMjM6MTE6NDggMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGRvY2Rpcik6IFJlbW92ZWQuCi0KLVR1ZSBKdW4gMjUgMjM6MDE6MDcgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKG9sZGluY2x1ZGVkaXIpOiBSZW1vdmVkLgotCi1UdWUgSnVuIDI1IDIyOjUwOjA3IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLSAgICAgICAgKiBNYWtlZmlsZS5pbiAoZGF0YWRpcik6IFNldCB0byAkKHByZWZpeCkvc2hhcmUuCi0KLVRodSBKdW4gMjAgMjE6MTc6NTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfYXJtX3B0KTogUmVpbmRlbnQuICBBdm9pZCBlbmRsZXNzIGxvb3AgYnkKLQljaGVja2luZyBmb3IgZXJyb3JzIGZyb20gZG9fdHlwZS4KLQotVHVlIEp1biAxOCAxNDozNjoxOSAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBOZXcgZmlsZS4KLQkqIHhtYWxsb2MuYzogSWYgVk1TLCBpbmNsdWRlIDxzdGRsaWIuaD4gYW5kIDx1bml4bGliLmg+IHJhdGhlcgotCXRoYW4gZGVjbGFyaW5nIG1hbGxvYywgcmVhbGxvYywgYW5kIHNicmsuCi0KLU1vbiBKdW4gMTAgMTM6MTc6MTcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogcGV4ZWN1dGUuYzogTmV3IGZpbGUuCi0KLVdlZCBKdW4gIDUgMTY6NTc6NDUgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIHhtYWxsb2MuYzogRGVjbGFyZSBzYnJrLgotCi1TYXQgTWF5ICA0IDA1OjA4OjQ1IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogYWxsb2NhLW5vcm0uaDogIEFkZCBTUEFSQ3dvcmtzIGNjIGNvbXBhdGlibGUgX19idWlsdGluX2FsbG9jYQotCWRlY2xhcmF0aW9uLgotCi1Nb24gQXByIDIyIDE4OjQxOjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeHN0cmVycm9yLmM6IEluY2x1ZGUgPHN0ZGlvLmg+LgotCi1TdW4gQXByIDIxIDExOjU1OjEyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgYXRleGl0LmMuCi0KLVN1biBBcHIgMjEgMDk6NTA6MDkgMTk5NiAgU3RlcGhlbiBMIE1vc2hpZXIgIChtb3NoaWVyQHdvcmxkLnN0ZC5jb20pCi0KLQkqIGNob29zZS10ZW1wLmM6IEluY2x1ZGUgc3lzL3R5cGVzLmggYmVmb3JlIHN5cy9maWxlLmggZm9yIHNjbzMuMnY1LgotCi1XZWQgQXByIDE3IDExOjE3OjU1IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNob29zZS10ZW1wLmM6IERvbid0ICNpbmNsdWRlIHN5cy9maWxlLmggaWZkZWYgTk9fU1lTX0ZJTEVfSC4KLQkjaW5jbHVkZSA8c3RkaW8uaD4KLQkqIGNvbmZpZy9tdC12eHdvcmtzNSAoSERFRklORVMpOiBEZWZpbmUgTk9fU1lTX0ZJTEVfSC4KLQotVHVlIEFwciAxNiAxMToyNzoxNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBNYWtlZmlsZS5pbiAobG5lZWRlZC1saXN0KTogSWYgYWxsb2NhLm8gaXMgbmVlZGVkLCBzbyBpcyB4bWFsbG9jLm8uCi0JUmV2ZXJ0cyBGZWIgOCwgMTk5NSBjaGFuZ2UuCi0KLU1vbiBBcHIgMTUgMTI6NTM6MjYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2hvb3NlLXRlbXAuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIGNob29zZS10ZW1wLmMuCi0JKFJFUVVJUkVEX09GSUxFUyk6IEFkZCBjaG9vc2UtdGVtcC5vLgotCi1TYXQgQXByIDEzIDE0OjE5OjMwIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSk6ICBEb24ndCBiaWFzIGV4cG9uZW50IHdoZW4KLQloYW5kbGluZyB6ZXJvJ3MsIGRlbm9ybXMgb3IgTmFOcy4KLQotVGh1IEFwciAxMSAxMzozNjo1NiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBmbG9hdGZvcm1hdC5jIChmbG9hdGZvcm1hdF90b19kb3VibGUpOiAgRml4IGJ1Z3Mgd2l0aCBoYW5kbGluZwotCW51bWJlcnMgd2l0aCBmcmFjdGlvbnMgPCAzMiBiaXRzLgotCi1Nb24gQXByICA4IDE0OjQ4OjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCi0JZGlyZWN0b3JpZXMuCi0KLVR1ZSBNYXIgMTkgMjI6MDI6MDcgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBGaXggZm9yIG5vbi1tYW5nbGVkIHBvaW50ZXIKLQlhcmd1bWVudHMuCi0KLUZyaSBNYXIgIDggMTc6MjQ6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IElmIHNyY2RpciBpcyBgLicgYW5kIHdpdGhfdGFyZ2V0X3N1YmRpciBpcyBub3QKLQlgLicsIHRoZW4gc2V0IE1VTFRJU1JDVE9QIGJlZm9yZSBjYWxsaW5nIGNvbmZpZy1tbC5pbi4KLQotVGh1IE1hciAgNyAxMzozNzoxMCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5jIChtcHdfb3Blbik6IEFkZCBkZWJ1Z2dpbmcgb3V0cHV0IG9wdGlvbi4KLQotV2VkIE1hciAgNiAxNzozNjowMyAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6IEZpeCBmb3IgYWRkcmVzcy1vZi1leHRlcm4gYXJndW1lbnRzLgotCi1UdWUgRmViIDI3IDEyOjAwOjUwIDE5OTYgIFJheW1vbmQgSm91ICA8cmpvdUBtZXhpY2FuLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5jIChtcHdpZnlfZmlsZW5hbWUpOiBDaGFuZ2UgNiB0byA1IGluCi0Jc3RybmNtcCAodW5peG5hbWUsICIvdG1wLyIsIDUpLgotCi1UdWUgRmViIDIwIDEwOjU1OjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogSW5pdGlhbGl6ZSBpc19ib29sLiAgQ29ycmVjdGx5Ci0JaGFuZGxlIDAgYXMgYSBwb2ludGVyIHZhbHVlIHBhcmFtZXRlci4KLQotTW9uIEZlYiAgNSAxNjo0MTo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwpOiBEZXBlbmQgdXBvbiByZXF1aXJlZC1saXN0LgotCShyZXF1aXJlZC1saXN0KTogTmV3IHRhcmdldC4KLQkoY2xlYW4pOiBSZW1vdmUgcmVxdWlyZWQtbGlzdC4KLQotV2VkIEphbiAzMSAxMDoxOTo0MSAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB3aW4zMi5jOiBEZWxldGVkLgotCSogY29uZmlnLnRhYmxlIChpMzg2LSotd2luMzIpOiBEZWxldGVkLgotCSogY29uZmlnL21oLWkzODZ3aW4zMjogRGVsZXRlZC4KLQotVGh1IEphbiAxOCAxMTozNDoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChjcGx1c19kZW1hbmdsZV9vcG5hbWUpOiBDaGFuZ2Ugb3BuYW1lIHBhcmFtZXRlciB0bwotCWNvbnN0IGNoYXIgKi4KLQkoY3BsdXNfbWFuZ2xlX29wbmFtZSk6IENoYW5nZSByZXR1cm4gdHlwZSBhbmQgb3BuYW1lIHBhcmFtZXRlciB0bwotCWNvbnN0IGNoYXIgKi4gIERvbid0IGNhc3QgcmV0dXJuIHZhbHVlLgotCi1UdWUgSmFuIDE2IDEyOjEzOjExIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LmM6IEluY2x1ZGUgVGltZXIuaCwgaW4gb3JkZXIgdG8gZ2V0IG02OGsgTWljcm9zZWNvbmRzIHRyYXAKLQlkZWZpbml0aW9uLgotCi1XZWQgSmFuICAzIDEzOjE1OjA0IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBvYnN0YWNrLmM6IFVwZGF0ZSBjb3B5cmlnaHQgdG8gMTk5Ni4KLQkoX29ic3RhY2tfbWVtb3J5X3VzZWQpOiBEZWZpbmUgbmV3IGZ1bmN0aW9uLiAgQ2FsbGVkIHZpYQotCW9ic3RhY2tfbWVtb3J5X3VzZWQgbWFjcm8uCi0KLVRodSBEZWMgMjggMTE6Mzk6NDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4c3RyZHVwLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCB4c3RyZHVwLmMuCi0JKFJFUVVJUkVEX09GSUxFUyk6IEFkZCB4c3RyZHVwLm8uCi0JKHhzdHJkdXAubyk6IE5ldyB0YXJnZXQuCi0KLU1vbiBEZWMgMTEgMTg6MTg6NTIgMTk5NSAgTWlrZSBTdHVtcCAgPG1yc0BjeWdudXMuY29tPgotCi0JKiBhdGV4aXQuYzogTmV3IHN0dWIgdG8gcHJvdmlkZSBhdGV4aXQgb24gc3lzdGVtcyB0aGF0IGhhdmUKLQlvbl9leGl0LCBsaWtlIFN1bk9TIDQuMS54IHN5c3RlbXMuCi0JKiBmdW5jdGlvbnMuZGVmIChvbl9leGl0LCBhdGV4aXQpOiBEaXR0by4KLQotTW9uIERlYyAxMSAxNTo0MjoxNCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5jIChtcHdfYWJvcnQpOiBSZW1vdmUgZGVjbC4KLQkobXB3X2FjY2Vzcyk6IE1vdmUgZGVidWdnaW5nIHByaW50Zi4KLQotU2F0IERlYyAgMiAwMToyNToyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogQ29uc2lzdGVudGx5IHVzZSAke2hvc3R9IHJhdGhlciB0aGFuICR7eGhvc3R9IG9yCi0JJHt0YXJnZXR9LgotCSogY29uZmlndXJlLmluOiBEb24ndCBib3RoZXIgdG8gc2V0ICR7eGhvc3R9IGJlZm9yZSBjYWxsaW5nCi0JY29uZmlnLnRhYmxlLgotCi1UdWUgTm92IDI4IDE0OjE2OjU3IDE5OTUgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKC5jLm8pOiBVc2UgdGVzdCBpbnN0ZWFkIG9mIHRoZSBsZWZ0IGJyYWNrZXQsIHRvCi0JYXZvaWQgcHJvYmxlbXMgd2l0aCBzb21lIHZlcnNpb25zIG9mIG1ha2UuCi0KLVR1ZSBOb3YgMjggMTE6NDU6MTcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEZpeCBJTkNESVIgZWRpdCB0byB3b3JrIHdpdGggTm92IDE0IGNoYW5nZS4KLQotVHVlIE5vdiAyMSAxMToyNjozNCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9taC1ocHV4OiBSZW1vdmUuICBJdCB3YXMgb25seSB1c2VkIHRvIGRlZmluZSBFWFRSQV9PRklMRVMsCi0Jd2hpY2ggd2FzIHNldCB0byBqdXN0IGFsbG9jYS5vLCB3aGljaCBpcyBub3cgYXV0b21hdGljYWxseSBtYXJrZWQKLQlhcyBuZWVkZWQgYnkgdGhlIGF1dG9jb25maWd1cmF0aW9uIHByb2Nlc3MuCi0KLVR1ZSBOb3YgMjEgMTQ6MTU6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcudGFibGU6IENoZWNrICR7d2l0aF9jcm9zc19ob3N0fSByYXRoZXIgdGhhbiBjb21wYXJpbmcKLQkke2hvc3R9IGFuZCAke3RhcmdldH0uCi0KLVRodSBOb3YgMTYgMTQ6MzQ6NDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IElmIHdpdGhfdGFyZ2V0X3N1YmRpciBpcyBlbXB0eSwgc2V0IHhob3N0IHRvCi0JJHtob3N0fSByYXRoZXIgdGhhbiAke3RhcmdldH0gYmVmb3JlIGNhbGxpbmcgY29uZmlnLnRhYmxlLgotCi1UdWUgTm92IDE0IDAxOjM4OjMwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChNVUxUSVRPUCk6IERlbGV0ZWQuCi0JKE1VTFRJU1JDVE9QLCBNVUxUSUJVSUxEVE9QKTogTmV3LgotCShGTEFHU19UT19QQVNTKTogRGVsZXRlIElOQ0RJUi4KLQkoSU5DRElSKTogQWRkICQoTVVMVElTUkNUT1ApLgotCShpbnN0YWxsX3RvX2xpYmRpcik6IEFkZCAkKE1VTFRJU1VCRElSKS4gIENhbGwgJChNVUxUSURPKS4KLQkqIGNvbmZpZ3VyZS5pbjogRGVsZXRlIGNhbGwgdG8gY2ZnLW1sLWNvbS5pbi4gIENhbGwgY29uZmlnLW1sLmluCi0JaW5zdGVhZCBvZiBjZmctbWwtcG9zLmluLgotCShjcm9zcy1jb21waWxlIGNoZWNrKTogQ2hhbmdlIHRvIHRlc3QgZm9yIHdpdGhfdGFyZ2V0X3N1YmRpci4KLQkoRVhUUkFfTElOS1MpOiBEZWxldGUuCi0KLVN1biBOb3YgMTIgMTI6MTM6MDQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEFkZCBnZXRwYWdlc2l6ZS5jLm8gdG8gbmVlZGVkLWxpc3QuCi0JKiBtcHcuYyBbVVNFX01XX0hFQURFUlNdOiBDb25kaXRpb25hbGl6ZSBjb21waWxpbmcgb2YKLQlmdW5jdGlvbnMgdGhhdCBhcmUgc3VwcGxpZWQgYnkgTWV0cm93ZXJrcyBsaWJyYXJpZXMuCi0JKGZzdGF0KTogQ2xlYW4gdXAgZGVzY3JpcHRvci0+cG9pbnRlciBjb252ZXJzaW9uIGNvZGUuCi0JKEluc3RhbGxDb25zb2xlLCBldGMpOiBFbXB0eSBkZWZpbml0aW9ucywgZm9yIHdoZW4gbGlua2luZwotCXdpdGggU0lPVVguCi0KLVN1biBOb3YgIDUgMTk6MjU6MjcgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogIEFsc28gcGFzcyBQSUNGTEFHUy4KLQkoLmMubyk6ICBTdHlsaXN0aWMgY2hhbmdlLgotCi1UaHUgTm92ICAyIDEyOjA2OjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RydG9sLmMsIHN0cnRvdWwuYzogRG9uJ3QgaW5jbHVkZSA8c3RkbGliLmg+LiAgRnJvbQotCXBoZG1AaW5mby51Y2wuYWMuYmUgKFBoaWxpcHBlIERlIE11eXRlcikuCi0KLVdlZCBOb3YgIDEgMTE6NTk6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENvcnJlY3Qgc2VkIGNhbGwuCi0KLU1vbiBPY3QgMzAgMTM6MDM6NDUgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogIENsZWFuIHVwIC8gc2ltcGxpZnkgZm9yIG5hdGl2ZS4KLQotCSogY29uZmlndXJlLmluOiAgTWVyZ2UgaW4gc3R1ZmYgZnJvbSAuLi94aWJlcnR5L2NvbmZpZ3VyZS5pbi4KLQkqIE1ha2VmaWxlLmluIChDQyk6ICBBZGQgZGVmaW5pdGlvbiAoc28gaXQgY2FuIGJlIG92ZXJycmlkZGVuCi0JYnkgLi4vY29uZmlndXJlKS4KLQotVHVlIE9jdCAyNCAxNzo1NzoyNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogTGVhdmUgc3RyZXJyb3IuYy5vIGluIHN0YW5kYXJkIGxpc3Qgb2YgZnVuY3Rpb25zLgotCSogbXB3LmMgKFJfT0ssIEVOT0VOVCwgRUFDQ0VTUywgRU5PU1lTKTogUmVtb3ZlLgotCShsaW5rKTogUmVtb3ZlIHVzZWxlc3MgZGVmaW5pdGlvbiB3aXRoIGVycm9yIHJldHVybi4KLQkobGFzdF9taWNyb3NlY29uZHMsIHdhcm5faWZfc3Bpbl9kZWxheSwgcmVjb3JkX2Zvcl9zcGluX2RlbGF5KToKLQlVc2UgVW5zaWduZWRXaWRlIHR5cGUgZm9yIG1pY3Jvc2Vjb25kIGNvdW50cy4KLQotVGh1IE9jdCAxOSAxMDo1MjowNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgotCi0JKiBtZW1jbXAuYyAobWVtY21wKTogQXJndW1lbnQgdHlwZXMgYXJlIGNvbnN0IHZvaWQgKiwgbm90IHZvaWQKLQkqY29uc3QuCi0KLQkqIHN0cm5jYXNlY21wLmMgKHN0cm5jYXNlY21wKTogSW5jbHVkZSBhbnNpZGVjbC5oL3N0ZGFyZy5oLCBub3QKLQlzeXMvdHlwZXMuaC4KLQkqIHN0cmNhc2VjbXAuYyAoc3RyY2FzZWNtcCk6IERpdHRvLgotCi1UdWUgT2N0IDEwIDExOjAzOjI0IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQklTT04pOiAgUmVtb3ZlIG1hY3JvLgotCi1UdWUgU2VwIDI2IDE1OjA2OjQ2IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEhGSUxFUyk6IEFkZCBkZWZhdWx0IGVtcHR5IGRlZmluaXRpb24uCi0JKiBtcHctY29uZmlnLmluIChjb25maWcuaCk6IE9ubHkgdXBkYXRlIGlmIGNoYW5nZWQuCi0JKiBtcHctbWFrZS5pbjogUmVtb3ZlLgotCSogbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgZWRpdHMgTWFrZWZpbGUuaW4gaW50byBNUFcgbWFrZWZpbGUuCi0JKiBtcHcuYzogUmVtb3ZlIHNlbWktY2xvbmUgb2Ygc3RyZXJyb3IgY29kZS4KLQkoc3lzX25lcnIsIHN5c19lcnJsaXN0KTogRGVmaW5lIGhlcmUuCi0JKE1pY3Jvc2Vjb25kcyk6IE9ubHkgZGVmaW5lIGFzIEEtbGluZSB0cmFwIGlmIG02OGsgTWFjLgotCi1XZWQgU2VwIDIwIDEyOjUzOjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgc3lub255bSBmb3IgZGlzdGNsZWFuLgotCi1Nb24gQXVnIDI4IDE5OjQ3OjUyIDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjb25maWcudGFibGU6ICBGb3IgaG9zdCwgZ2VuZXJhbGl6ZSByczYwMDAtaWJtLWFpeCoKLQl0byAqLWlibS1haXgqIHNvIHdlIGFsc28gaW5jbHVkZSBwb3dlcnBjLgotCi1UdWUgQXVnIDIyIDAzOjE4OjA1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCUZyaSBKdW4gMTYgMTg6MzU6NDAgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIHhzdHJlcnJvci5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluLCB2bXNidWlsZC5jb206IENvbXBpbGUgaXQuCi0KLU1vbiBKdWwgMzEgMTI6MTY6MzIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlIChpMzg2LSotd2luMzIpOiBOZXcuCi0KLUZyaSBKdWwgMjEgMTE6MzU6NTIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1VTFRJVE9QKTogTmV3IHZhcmlhYmxlLgotCShNVUxUSURJUlMsIE1VTFRJU1VCRElSLCBNVUxUSURPLCBNVUxUSUNMRUFOKTogTGlrZXdpc2UuCi0JKGFsbCk6IEFkZCBtdWx0aWxpYiBzdXBwb3J0LgotCShpbnN0YWxsX3RvX3Rvb2xkaXIsICpjbGVhbik6IExpa2V3aXNlLgotCi1Nb24gSnVsIDEwIDExOjQ3OjI3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBtYWtlZmlsZS5kb3MgKE9CSlMpOiBBZGQgaGV4Lm8uICBGcm9tIERKIERlbG9yaWUuCi0KLUZyaSBKdW4gMzAgMTc6Mjg6NTkgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIHZtc2J1aWxkLmNvbTogIGNyZWF0ZSAibmV3LWxpYi5vbGIiLCBidWlsZCBsaWJpYmVydHkgdW5kZXIgdGhhdAotCW5hbWUsIGFuZCB0aGVuIG1ha2UgaXQgYmVjb21lICJsaWJlcnR5Lm9sYiIgd2hlbiBkb25lLCBzbyB0aGF0IGFuCi0JaW5jb21wbGV0ZSBidWlsZCBhdHRlbXB0IG5ldmVyIGxlYXZlcyBiZWhpbmQgc29tZXRoaW5nIHdoaWNoIGxvb2tzCi0JbGlrZSBhIGNvbXBsZXRlIGxpYnJhcnkuCi0KLVRodSBKdW4gMjkgMDA6MjI6MDIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL21oLWkzODZwZTogTmV3IGZpbGUgZm9yIFBFIGhvc3RzLgotCSogY29uZmlnLnRhYmxlOiBVbmRlcnN0YW5kIFBFIGhvc3RzLgotCi1XZWQgSnVuIDI4IDE5OjEzOjIzIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYzogVXBkYXRlIGZyb20gZ2NjLgotCi0JKiBhcmd2LmMsIGR1bW15LmM6IElmIF9fU1REQ19fLCAjaW5jbHVkZSAiYWxsb2NhLWNvbmYuaCIgYWZ0ZXIKLSAgICAgICAgPHN0ZGRlZi5oPi4KLQkqIGFsbG9jYS1ub3JtLmg6IElmIF9fU1REQ19fLCBkZWNsYXJlIGFsbG9jYSB3aXRoIGl0cyBwYXJhbWV0ZXIuCi0KLVRodSBKdW4gMjIgMTg6NTc6NDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5pbiAoQUxMX0NGTEFHUyk6IERlZmluZSBORUVEX2Jhc2VuYW1lLgotCSogbXB3LmM6IE9ubHkgdGVzdCBEZWJ1Z1BJIG9uY2Ugd2hlbmV2ZXIgcHJpbnRpbmcgZGVidWcgaW5mby4KLQkobXB3aWZ5X2ZpbGVuYW1lKTogSWYgZmlsZW5hbWUgaXMgL3RtcC9mb28sIGNoYW5nZSBpdCBpbnRvIDpfZm9vLAotCWFsc28gZml4IHRvIG5vdCB3cml0ZSBvbiBpbnB1dCBmaWxlbmFtZSBidWZmZXIuCi0JKG1wd19hY2Nlc3MpOiBVc2Ugc3RhdCgpIGluc3RlYWQgb2Ygb3BlbigpLCB3b3JrcyBmb3IgZGlyZWN0b3JpZXMKLQlhcyB3ZWxsIGFzIGZpbGVzLgotCi1Nb24gSnVuIDE5IDAwOjMzOjIyIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogTWFzc2FnZSBicm9rZW4gc2hlbGxzIHRoYXQgcmVxdWlyZSAnZWxzZSB0cnVlJy4KLQotU2F0IEp1biAxNyAyMzoyMTo1OCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogYWxsb2NhLW5vcm0uaDogRGVjbGFyZSBhbGxvY2EgYXMgdHlwZSAiUFRSIiB0byBtYXRjaCBmdW5jdGlvbnMuZGVmLgotCURlY2xhcmUgX19idWlsdGluX2FsbG9jYSBpbiB0aGUgc3BhcmMgY2FzZSwgYXMgYXJndi5jIGRpZC4KLQkqIGFyZ3YuYzogUmVwbGFjZSBpbmxpbmUgdmVyc2lvbiBvZiBhbGxvY2Etbm9ybS5oIGF0IHN0YXJ0IG9mIGZpbGUgd2l0aAotCWEgI2luY2x1ZGUgb2YgYWxsb2NhLWNvbmYuaC4gIFByZWNlZGUgaXQgd2l0aCBhbiBpbmNsdWRlIG9mIGFuc2lkZWNsLmgKLQliZWNhdXNlIGFsbG9jYS1ub3JtLmggbmVlZHMgdG8gZGVjbGFyZSBhbGxvY2EgYXMgIlBUUiIuCi0KLU1vbiBKdW4gMTIgMTQ6MjQ6MjYgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogd2luMzIuYzogTmV3IGZpbGUuCi0KLUZyaSBKdW4gIDkgMTU6MTY6MTQgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGR1bW15LmM6ICNpbmNsdWRlICJhbGxvY2EtY29uZi5oIi4KLQotV2VkIEp1biAgNyAxMTo0NjoyMyAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogUmVtb3ZlIHN0YW1wLXBpY2Rpci4KLQkoY2xlYW4pOiBEb24ndC4KLQotTW9uIEp1biAgNSAxODo0NjowNiAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlIChmcmFncyk6IFVzZSB0b3BsZXZlbCBwaWMgZnJhZ3MuCi0KLQkqIE1ha2VmaWxlLmluIChQSUNGTEFHKTogTmV3IG1hY3JvLgotCShhbGwpOiBEZXBlbmQgb24gc3RhbXAtcGljZGlyLgotCShuZWVkZWQtbGlzdCk6IERpdHRvLgotCSguYy5vKTogQWxzbyBidWlsZCBwaWMgb2JqZWN0LgotCShzdGFtcC1waWNkaXIpOiBOZXcgcnVsZS4KLQkobW9zdGx5Y2xlYW4pOiBSZW1vdmUgcGljLgotCShjbGVhbik6IFJlbW92ZSBzdGFtcC1waWNkaXIuCi0KLUZyaSBNYXIgMjQgMTY6NTU6NDggMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIHZtc2J1aWxkLmNvbSAoY29uZmlnLmgpOiBBZGQgYCNkZWZpbmUgTkVFRF9iYXNlbmFtZScuCi0KLVR1ZSBNYXkgMjMgMTA6MTI6NDYgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNsb2NrLmMsIGdldG9wdC5jLCBzdHJ0b2QuYywgdnNwcmludGYuYzogIENoYW5nZSBmcm9tIHVzaW5nIExHUEwKLQl0byBsaWJpby1zdHlsZSBjb3B5cmlnaHQuCi0JKiBnZXRwYWdlc2l6ZS5jOiAgUmVtb3ZlIEZTRiBjb3B5cmlnaHQuCi0KLVNhdCBNYXkgMjAgMTI6MzA6MjMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JQWRkZWQgaW1wcm92ZWQgVk1TIHN1cHBvcnQgZnJvbSBQYXQgUmFua2luOgotCi0JRnJpIE1hciAxNyAxODo0MDozNiAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogdm1zYnVpbGQuY29tOiAgbmV3IGZpbGUuCi0KLQkqIGdldHBhZ2VzaXplLmMgKGdldHBhZ2VzaXplKTogIGltcGxlbWVudCBmb3IgVk1TOwotCSogc3RyZXJyb3IuYyAoc3RyZXJyb3IsIHN0cmVycm5vLCBzdHJ0b2Vycm5vKTogIGFkZCBydWRpbWVudGFyeQotCXN1cHBvcnQgZm9yIEVWTVNFUlIuCi0KLVRodSBNYXkgMTggMTc6MDE6NDIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JV2VkIE1heSAxMCAxNDoyODoxNiAxOTk1IFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogZmxvYXRmb3JtYXQuYyAoZmxvYXRmb3JtYXRfYXJtX2V4dCk6IERlZmluZS4KLQotVHVlIE1heSAxNiAxMzozMDo1OSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogYmFzZW5hbWUuYywgYmNtcC5jLCBnZXRjd2QuYywgaW5zcXVlLmMsIHJlbmFtZS5jLCBzaWdzZXRtYXNrLmMsCi0Jc3RyZXJyb3IuYywgc3Ryc2lnbmFsLmM6ICBSZW1vdmUgRlNGIGNvcHlyaWdodC4KLQkqIHNpZ3NldG1hc2suYzogI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAtIHNlZW1zIHRvIGJlIG5lZWRlZCBieSBJU0MuCi0KLU1vbiBNYXkgMTUgMTk6NTM6MTcgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGJjb3B5LmMsIGJ6ZXJvLmMsIG1lbWNtcC5jLCBtZW1jcHkuYywgbWVtc2V0LmMsIHN0cmNoci5jLAotCXN0cnJjaHIuYywgc3Ryc3RyLmMsIHZmb3JrLmM6ICBSZW1vdmUgRlNGIENvcHlyaWdodCwgYmVjYXVzZSB0aGlzCi0JbWlnaHQgY29udGFtaW5hdGUgbGlic3RkYysrIHdpdGggdGhlIExHUEwuICAoT0snZCBieSBSTVMgMTEgT2N0IDk0LikKLQkqIHN0cmNoci5jLCBzdHJyY2hyLmM6ICBBZGQgY2FzdCB0byBzdXBwcmVzcyBjb25zdCB3YXJuaW5nLgotCi1UaHUgTWF5ICA0IDE0OjM2OjQyIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYzogVXNlIGNvbnN0IGluc3RlYWQgb2YgQ09OU1QuICBEb24ndCBpbmNsdWRlCi0gICAgICAgIGFuc2lkZWNsLmggZGlyZWN0bHkuCi0KLVdlZCBBcHIgMTkgMDE6MzA6MjcgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBEb24ndCBpbmNsdWRlIGxpYmliZXJ0eS5oLiAgRG8gZGVjbGFyZSB4bWFsbG9jIGFuZAotICAgICAgICB4cmVhbGxvYy4KLQkoLURNQUlOKTogRG9uJ3QgcmVseSBvbiBhbiBleHRlcm5hbGx5LWRlZmluZWQgdmVyc2lvbiBudW1iZXI7Ci0gICAgICAgIGluc3RlYWQsIHJlcXVpcmUgdGhlIHZlcnNpb24gbnVtYmVyIHRvIGJlIGRlZmluZWQgYXMgYQotICAgICAgICBwcmVwcm9jZXNzb3IgbWFjcm8uICBIYW5kbGUgdGhlIFJTLzYwMDAgbGVhZGluZyBkb3QuICBEZWZpbmUKLSAgICAgICAgeG1hbGxvYywgeHJlYWxsb2MgYW5kIGZhdGFsLiAgRG9uJ3Qgc3RyaXAgYSBsZWFkaW5nIHVuZGVyc2NvcmUKLSAgICAgICAgaWYgd2UgY291bGRuJ3QgZGVtYW5nbGUgdGhlIHdvcmQuCi0KLVR1ZSBBcHIgIDQgMTM6MDM6NTEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKE9sZCBtcHcuYyBjaGFuZ2UgZGVzY3JpcHRpb25zIHJldGFpbmVkIGZvciBpbmZvcm1hdGlvbmFsIHZhbHVlLikKLQkqIG1wdy5jICh3YXJuaW5nX3RocmVzaG9sZCk6IERlZmF1bHQgdG8gLjQgc2VjLgotCShvdmVyZmxvd19jb3VudCwgY3VycmVudF9wcm9ncmVzcyk6IE5ldyBnbG9iYWxzLgotCSh3YXJuX2lmX3NwaW5fZGVsYXkpOiBJbmNsdWRlIGN1cnJlbnQgcHJvZ3Jlc3MgdHlwZSwKLQlzdWNoIGFzIHByb2dyYW0gbmFtZSwgaW4gbWVzc2FnZS4KLQkobXB3X3N0YXJ0X3Byb2dyZXNzKTogU2V0IGN1cnJlbnRfcHJvZ3Jlc3MgdmFyaWFibGUgZnJvbSBhcmcuCi0JKG1wd19lbmRfcHJvZ3Jlc3MpOiBSZXBvcnQgc3BpbiBkZWxheXMgYnkgcG93ZXItb2YtdHdvLXNpemUKLQlidWNrZXRzIGluc3RlYWQgb2YgY29uc3RhbnQtc2l6ZSBidWNrZXRzLgotCi0JKiBtcHcuYzogQ2xlYW4gdXAgZm9ybWF0dGluZywgdHlwZXMsIHJldHVybnMsIGV0Yy4KLQkoRU5PU1lTKTogRGVmaW5lLgotCShtcHdfZnJlYWQsIG1wd19md3JpdGUpOiBEZWZpbmUuCi0JKHNsZWVwKTogRGVmaW5lIGNvcnJlY3RseS4KLQotCSogbXB3LmM6IE5ldyBjb2RlIHRvIGltcGxlbWVudCBjdXJzb3Igc3Bpbm5pbmcgc3VwcG9ydC4KLQkodW1hc2spOiBOZXcgZnVuY3Rpb24uCi0JKG1wd19mb3BlbiwgbXB3X2ZzZWVrLCBzdGF0LCBmc3RhdCk6IENhbGwgUFJPR1JFU1MuCi0KLQkqIG1wdy5jIChtcHdfYmFzZW5hbWUsIG1wd19taXhlZF9iYXNlbmFtZSk6IE5ldyBmdW5jdGlvbnMsIGZpbmQKLQliYXNlbmFtZXMgZm9yIE1QVyBhbmQgTVBXL1VuaXggZmlsZW5hbWVzLgotCShtcHdfc3BlY2lhbF9pbml0KTogTmV3IGZ1bmN0aW9uLCBjYWxscyBNYWNzYnVnIGlmIGRlc2lyZWQuCi0KLQkqIG1wdy5jOiBBZGQgR1BMIG5vdGljZS4KLQkobXB3aWZ5X2ZpbGVuYW1lKTogQWRkIG1vcmUgdHJhbnNmb3JtYXRpb25zLgotCShtcHdfZm9wZW4pOiBDYWxsIG1wd2lmeV9maWxlbmFtZSBvbiBmaWxlIG5hbWVzLgotCShyZW5hbWUpOiBSZW1vdmUuCi0JKGNoZGlyLCBnZXRjd2QpOiBBZGQgc2ltcGxlIGRlZmluaXRpb25zLgotCi0JKiBtcHcuYzogUmFuZG9tIGNsZWFudXBzLCByZW1vdmUgdW51c2VkIGNvZGUgYml0cy4KLQlBZGRlZCBjb3B5IG9mIHN0cmVycm9yLmMgZm9yIGdjYydzIHVzZS4KLQkoc3RhdCwgZnN0YXQsIF9zdGF0KTogTmV3IHZlcnNpb25zIGJhc2VkIG9uIEd1aWRvIHZhbiBSb3NzdW0gY29kZS4KLQotCSogbXB3LmMgKG1wd19mc2Vlayk6IE1ha2UgaXQgd29yayBjb3JyZWN0bHkgd2hlbiBkb2luZyBTRUVLX0NVUi4KLQotCSogbXB3LmMgKHN0YXQpOiBSZW1vdmUgaGFjayBkZWZpbml0aW9uLCBnZXQgZnJvbSBzeXMvc3RhdC5oLgotCShmb3JrLCB2Zm9yaywgZXRjKTogUHJpbnQgZXJyb3IgbWVzc2FnZXMgaWYgY2FsbGVkLgotCShnZXRydXNhZ2UsIHNicmssIGVudmlyb24sIGlzYXR0eSwgbGluaywgdXRpbWUsIG1rZGlyLCBybWRpciwKLQlyZW5hbWUsIGNob3duKTogRGVmaW5lLgotCi0JKiBtcHctY29uZmlnLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgY29uZmlndXJlLmluLgotCSogbXB3LW1ha2UuaW46IE5ldyBmaWxlLCBNUFcgdmVyc2lvbiBvZiBNYWtlZmlsZS5pbi4KLQkqIG1wdy5jOiBOZXcgZmlsZSwgTVBXIGNvbXBhdGliaWxpdHkgcm91dGluZXMuCi0KLUZyaSBNYXIgMjQgMTQ6MTA6MzAgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGJhc2VuYW1lLmM6IEluY2x1ZGUgY29uZmlnLmggYmVmb3JlIGNoZWNraW5nIGZvciBORUVEX2Jhc2VuYW1lLgotCi1UaHUgTWFyIDIzIDE5OjA5OjU0IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBmdW5jdGlvbnMuZGVmOiBBZGQgREVGRlVOQyBmb3IgYmFzZW5hbWUuCi0KLQkqIGJhc2VuYW1lLmM6IE9ubHkgZGVmaW5lIGJhc2VuYW1lIGlmIE5FRURfYmFzZW5hbWUuCi0KLVRodSBNYXIgMTYgMTM6MzY6MDUgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogRml4IC0tZW5hYmxlLXNoYXJlZCBsb2dpYyBmb3IgbmF0aXZlIGJ1aWxkcy4KLQotTW9uIE1hciAxMyAxMTowNToxMSAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogRGVtYW5nbGUgYm9vbCBsaXRlcmFscyBwcm9wZXJseS4KLQotTW9uIE1hciAgNiAyMzo1NzoyOCAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBzdHJ0b2wuYyBzdHJ0b3VsLmM6ICBSZXBsYWNlIHRoZXNlIHdpdGggbGVzcyBidWdneSB2ZXJzaW9ucyBmcm9tCi0JTmV0QlNELiAgKHN0cnRvdWwgaW4gcGFydGljdWxhciBjb3VsZG4ndCBoYW5kbGUgYmFzZSAxNi4pCi0KLVdlZCBNYXIgIDEgMTU6NTk6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbXQtdnh3b3JrczUgKEhERUZJTkVTKTogRGVmaW5lIE5PX1NZU19QQVJBTV9ILgotCi0JKiBjbG9jay5jOiBJZiBOT19TWVNfUEFSQU1fSCBpcyBkZWZpbmVkLCBkb24ndCBpbmNsdWRlCi0JPHN5cy9wYXJhbS5oPi4KLQkqIGdldGN3ZC5jLCBnZXRwYWdlc2l6ZS5jLCBnZXRydW50aW1lLmM6IExpa2V3aXNlLgotCi1GcmkgRmViIDE3IDE1OjQwOjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2V0cnVudGltZS5jIChnZXRfcnVuX3RpbWUpOiBEb24ndCBhc3N1bWUgdGhhdCBDTE9DS1NfUEVSX1NFQyBpcwotCWEgbnVtYmVyOyBBTlNJIGFwcGVhcnMgdG8gcGVybWl0IGFueSBleHByZXNzaW9uLCBpbmNsdWRpbmcgYQotCWZ1bmN0aW9uIGNhbGwuCi0KLQkqIGNvbmZpZy50YWJsZSAoKi0qLXZ4d29ya3M1Kik6IFVzZSBtdC12eHdvcmtzNSB3aGVuIGNvbmZpZ3VyaW5nCi0JeGliZXJ0eS4KLQkqIGNvbmZpZy9tdC12eHdvcmtzNTogTmV3IGZpbGUuCi0KLVRodSBGZWIgIDkgMTQ6MTk6NDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiYXNlbmFtZS5jIChiYXNlbmFtZSk6IENoYW5nZSBhcmd1bWVudCB0byBiZSBjb25zdC4KLQotV2VkIEZlYiAgOCAxODowNjo1MiAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGxuZWVkZWQtbGlzdCk6IERvbid0IHdvcnJ5IGFib3V0IHhtYWxsb2MuCi0KLVN1biBKYW4gMTUgMDA6NDA6MzYgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEZWxldGUgeGhvc3QtbWtmcmFnLgotCi1UaHUgSmFuIDEyIDE2OjU0OjE4IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobG5lZWRlZC1saXN0KTogSWYgYWxsb2NhLm8gaXMgbmVlZGVkLCBzbyBpcyB4bWFsbG9jLm8uCi0KLVdlZCBKYW4gMTEgMjI6Mzk6NTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogaGV4LmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKFJFUVVJUkVEX09GSUxFUywgQ0ZJTEVTKTogTGlzdCBpdC4KLQkoaGV4Lm8pOiBBZGQgZGVwZW5kZW5jaWVzLgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcHJlZml4KTogRm9yIEdOVSBzdHlsZSBjb25zdHJ1Y3RvciBhbmQKLQlkZXN0cnVjdG9yIG5hbWVzLCB0cnkgZGVtYW5nbGluZyB0aGUgcmVtYWluZGVyIG9mIHRoZSBzdHJpbmcuCi0KLVdlZCBEZWMgMjggMDA6NDk6MTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tPgotCi0JKiB2YXNwcmludGYuYyAoaW50X3Zhc3ByaW50Zik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHZhc3ByaW50Zik6IFVzZSBpbnRfdmFzcHJpbnRmLiAgUmVtb3ZlcyBhc3N1bXB0aW9uIHRoYXQgdmFfbGlzdAotCWlzIGFzc2lnbm1lbnQgY29tcGF0aWJsZS4KLQotU2F0IE5vdiAgNSAxOToyOToxMiAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKExJQkNGTEFHUyk6IE5ldyB2YXJpYWJsZS4KLQkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgaXQuCi0JKC5jLm8pOiBVc2UgaXQuCi0KLVRodSBOb3YgIDMgMTk6MDk6NDcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2V0b3B0LmMsIGdldG9wdDEuYzogRG8gY29tcGlsZSB0aGVzZSBmdW5jdGlvbnMgdW5kZXIgTGludXgsCi0Jc2luY2UgbWFueSBuYXRpdmUgdmVyc2lvbnMgYXJlIGJhc2VkIG9uIGdsaWJjIGJ1dCBhcmUgYnVnZ3kuCi0KLU1vbiBPY3QgMjQgMTU6MTY6NDYgMTk5NCAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIHZhc3ByaW50Zi5jOiAgTWFrZSAnZm9ybWF0JyBhcmcgYmUgY29uc3QsIHRvIGF2b2lkIGEgbWlzbWF0Y2gKLQl3aXRoIHByb3RvdHlwZSBpbiBHTlUgbGliYy4gIFN1cHBvcnQgc3RkYXJnLmggYXMgd2VsbCBhcyB2YXJhcmdzLmguCi0KLVR1ZSBPY3QgMTEgMTc6NDg6MjcgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChSRVFVSVJFRF9PRklMRVMpOiBBZGQgdmFzcHJpbnRmLm8uCi0JKiBmdW5jdGlvbnMuZGVmOiBSZW1vdmUgdmFzcHJpbnRmLgotCi1XZWQgU2VwIDE0IDE3OjA0OjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogeG1hbGxvYy5jIChmaXJzdF9icmVhayk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSk6IFJlY29yZCBzYnJrICgwKSBpbiBmaXJzdF9icmVhay4KLQkoeG1hbGxvYyk6IElmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLCB0cnkgdG8gcmVwb3J0IGhvdyBtdWNoCi0JbWVtb3J5IHdhcyBhbGxvY2F0ZWQgYnkgdGhlIHByb2dyYW0gdXAgdG8gdGhpcyBwb2ludC4KLQkoeHJlYWxsb2MpOiBMaWtld2lzZS4KLQotU3VuIFNlcCAwNCAxNzo1ODoxMCAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi0JKiBNYWtlZmlsZS5pbiAoRVJST1JTX0NDKTogTmV3IHZhcmlhYmxlLCBkZWZhdWx0ZWQgdG8gJChDQykuICBVc2UgaXQKLQl3aGVuIGxpbmtpbmcgZHVtbXkuCi0JKiBjb25maWcudGFibGU6IEFkZCBob3N0IFJJU0NpWCBNYWtlZmlsZSBmcmFnLgotCSogY29uZmlnL21oLXJpc2NpeDogTmV3IGZpbGUuCi0KLVRodSBBdWcgMjUgMTc6Mjk6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6IERlZmluZS4KLQkoJChSVUxFMSkpOiBVc2UgJChGTEFHU19UT19QQVNTKS4KLQotV2VkIEF1ZyAyNCAxNzowODo0NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHZhc3ByaW50Zi5jOiBJbmNsdWRlIDxzdHJpbmcuaD4uCi0JKHZhc3ByaW50Zik6IEFkZCBjYXN0cyB0byB2b2lkIGZvciB2YV9hcmcgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzLgotCSogeGF0ZXhpdC5jOiBEZWNsYXJlIG1hbGxvYy4KLQotRnJpIEF1ZyAxOSAxNToyOToxMiAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfYXJncyk6IEZpeCBhIGJ1ZyBpbiBwcmV2aW91cyBwYXRjaCAodGhlCi0Jb25lIGJlbG93KS4KLQotVGh1IEF1ZyAxOCAxNDozNzoxNCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGUgYXJncyk6IEhhbmRsZSBBUk0gcmVwZWF0IGVuY29kaW5nIHdoZXJlCi0gICAgICAgIHRoZSB0eXBlIGluZGV4IGlzIGdyZWF0ZXIgdGhhbiA5LgotCi1XZWQgQXVnIDE3IDE2OjEzOjQ5IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9xdWFsaWZpZWQpOiBhY2NlcHQgb3B0aW9uYWwgJ18nIGJldHdlZW4KLQlxdWFsaWZpZWQgbmFtZS4gVGhpcyBpcyBiYWVjYXVzZSB0aGUgdGVtcGxhdGUgbmFtZSBtYXkgZW5kIHdpdGgKLQludW1lcmljIGFuZCBjYW4gbWl4ZWQgdXAgd2l0aCB0aGUgbGVuZ3RoIG9mIG5leHQgcXVhbGlmaWVkIG5hbWUuCi0KLVdlZCBBdWcgIDMgMDU6NTI6MTQgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbXQtc3Vub3M0OiBVc2Ugb3VyIHN0YW5kYXJkIGxvY2F0aW9uIGZvciBjcm9zcy1pbmNsdWRlcwotCWFuZCBjcm9zcy1saWJzIHdoZW4gdGhlIHRhcmdldCBpcyBhbHNvIGEgImhvc3QiIGVudmlyb25tZW50IChpZSBubwotCW5ld2xpYjsgaW5jbHVkZXMgYW5kIHN1Y2ggZG9uJ3QgYmVsb25nIHRvIHVzKS4gIFRoaXMgaXMgc3BlY2lmaWMKLQl0byB0aGUgQ3lnbnVzIFN1cHBvcnQgZW52aXJvbm1lbnQuCi0KLVR1ZSBBdWcgIDIgMTU6MjU6MTIgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogZGVtYW5nbGUgYXMgeHh4PCdRJz4gbm90Ci0JeHh4PGNoPTgxPi4KLQotTW9uIEF1ZyAgMSAxNzowMjo0OCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAobWFpbik6IGZsdXNoIHN0ZG91dCB0byBtYWtlIHBpcGUgd29yay4KLQotU2F0IEp1bCAxNiAxMjo1NjozMiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZSAoKi0qLWN4dXg3Kik6ICBSZWNvZ25pemUuCi0JKiBmbG9hdGZvcm1hdC5jIChmbG9hdGZvcm1hdF9tODgxMTBfZXh0KSBbSEFSUklTX0ZMT0FUX0ZPUk1BVF06Ci0JSGFycmlzLXNwZWNpZmljIGZsb2F0IGZvcm1hdC4KLQkqIGNvbmZpZy9taC1jeHV4NzogTmV3IGZpbGUuCi0KLVdlZCBKdW4gMjkgMDA6MjY6MTcgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiAgTWFrZSBzdXJlIHRoYXQgdGhlIHJlc3VsdCBvZgotCWNvbnN1bWVfY291bnQgZG9lc24ndCBpbmRleCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgotCi1Nb24gSnVuIDIwIDIzOjU0OjM3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY3BsdXMtZGVtLmMgKGdudV9zcGVjaWFsKTogIEhhbmRsZSB2dGFibGUgbWFuZ2xpbmcgb2YgZ2NjLTIuNC41IGFuZAotCWVhcmxpZXIuIEltcHJvdmUgdGVzdCBmb3IgbmV3IHZ0YWJsZSBtYW5nbGluZy4gQ2hhbmdlIG91dHB1dCBiYWNrCi0JdG8gYHZpcnR1YWwgdGFibGUnLgotCi1Nb24gSnVuIDIwIDExOjM3OjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jOiBBbHdheXMgY29tcGlsZSB0aGlzIGNvZGUsIGV2ZW4gaWYgdXNpbmcgdGhlIEdOVQotCWxpYnJhcnkuICBBdm9pZHMgcHJvYmxlbXMgd2l0aCByZWxhdGl2ZWx5IHJlY2VudCBiaW5hcnkKLQlpbmNvbXBhdGliaWxpdHkuCi0KLVRodSBKdW4gMTYgMTc6NTQ6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoeG1hbGxvYywgeHJlYWxsb2MsIGZyZWUpOiBEb24ndCBkZWNsYXJlLgotCShzdHJzdHIpOiBEb24ndCBkZWNsYXJlIHBhcmFtZXRlcnMuCi0JKHhtYWxsb2MsIHhyZWFsbG9jKTogRG9uJ3QgZGVmaW5lLgotCShsb25nX29wdGlvbnMpOiBBZGQgbm8tc3RyaXAtdW5kZXJzY29yZXMuCi0JKG1haW4pOiBDYWxsIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZS4gIFBhc3MgbiBpbiBzaG9ydCBvcHRpb25zIHRvCi0JZ2V0b3B0X2xvbmcuICBIYW5kbGUgb3B0aW9uICduJyB0byBub3Qgc3RyaXAgdW5kZXJzY29yZXMuCi0JKHVzYWdlKTogTWVudGlvbiAtbiBhbmQgLS1uby1zdHJpcC11bmRlcnNjb3Jlcy4KLQotU3VuIEp1biAxMiAwMTozNzowOSAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogU2VwYXJhdGUgY29uc2VjdXRpdmUgPidzIHdpdGggYQotICAgICAgICBzcGFjZS4KLQkoZ251X3NwZWNpYWwpOiBEZW1hbmdsZSB0ZW1wbGF0ZSBhbmQgcXVhbGlmaWVkIG5hbWVzIGluIGEgdnRhYmxlIG5hbWUuCi0KLUZyaSBNYXkgMjcgMTI6Mjc6NTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCUZyb20gZ2FzLTIuMyBhbmQgYmludXRpbHMtMi40IG5ldCByZWxlYXNlczoKLQotCVdlZCBNYXkgMTEgMjI6MzI6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi0JKiBtYWtlZmlsZS5kb3M6IFtuZXddIE1ha2VmaWxlIGZvciBkb3MvZ28zMgotCSogY29uZmlndXJlLmJhdDogdXBkYXRlIGZvciBsYXRlc3QgZmlsZXMKLQkqIG1zZG9zLmM6IHJlbW92ZSBzb21lIGZ1bmN0aW9ucyBub3cgaW4gbGliYy5hCi0KLUZyaSBNYXkgMjAgMTg6NTM6MzIgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChnbnVfc3BlY2lhbCk6ICBSZWNvZ25pemUgdGh1bmtzLCBhcyB3ZWxsIGFzCi0JdGhlIG5ldyBuYW1pbmcgc3R5bGUgZm9yIHZ0YWJsZXMgKHdoZW4gLWZ2dGFibGUtdGh1bmtzKS4KLQotV2VkIE1heSAxOCAxMzozNDowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChYVFJBRkxBR1MpOiBEb24ndCBkZWZpbmUuCi0JKC5jLm8sIGR1bW15Lm8pOiBEb24ndCB1c2UgWFRSQUZMQUdTLgotCSgkKFJVTEUxKSk6IERvbid0IHBhc3MgWFRSQUZMQUdTIGRvd24gaW4gcmVjdXJzaXZlIGNhbGwuCi0KLUZyaSBNYXkgMTMgMTY6MDI6MTIgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHZhc3ByaW50Zi5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluLCBmdW5jdGlvbnMuZGVmOiBBZGQgaXQuCi0KLUZyaSBNYXkgMTMgMTY6MjA6MjggMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9mdW5kX3R5cGUpOiBHcm9rIGJvb2wuCi0KLUZyaSBNYXkgIDYgMTQ6NDQ6MjEgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnRhYmxlOiBBZGQgZ28zMgotCSogY29uZmlnL21oLWdvMzI6IE5ldyB0ZW1wbGF0ZS4KLQotRnJpIE1heSAgNiAxMTowMTo1OSAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcudGFibGUsIGNvbmZpZy9tdC1zdW5vczQ6IGNvbmZpZyBmb3Igd2hlbiBzdW40IGlzIGNyb3NzIHRhcmdldC4KLQotTW9uIEFwciAxMSAwMDo1NDozMyAxOTk0ICBSaWNoYXJkIFN0YWxsbWFuICAocm1zQG1vbGUuZ251LmFpLm1pdC5lZHUpCi0KLSAgICAgICAgKiBnZXRvcHQuYyBbbm90IF9fR05VX0xJQlJBUllfX10gW19fR0NDX19dIFtub3QgX19TVERDX19dOgotICAgICAgICBEZWNsYXJlIHN0cmxlbiB0byByZXR1cm4gaW50LiAgRG9uJ3QgaW5jbHVkZSBzdGRkZWYuaC4KLQotRnJpIEFwciAgMSAwMDozODoxNyAxOTk0ICBKaW0gV2lsc29uICAod2lsc29uQG1vbGUuZ251LmFpLm1pdC5lZHUpCi0KLSAgICAgICAgKiBnZXRvcHQuYzogRGVsZXRlIHVzZSBvZiBJTl9HQ0MgdG8gY29udHJvbCB3aGV0aGVyCi0gICAgICAgIHN0ZGRlZi5oIG9yIGdzdGRkZWYuaCBpcyBpbmNsdWRlZC4KLQotVGh1IEFwciAxNCAxNDowMDo1NiAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfc2lnbmF0dXJlKTogRml4IGEgYnVnIGluIHRlbXBsYXRlIGZ1bmN0aW9uCi0JdHlwZSBudW1iZXJpbmcuCi0KLVdlZCBBcHIgMTMgMTc6MjM6MDMgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3NpZ25hdHVyZSk6IEZpeCB0ZW1wbGF0ZSBmdW5jdGlvbiB3aXRoIGFybQotCXN0eWxlIGFyZ3VtZW50IHR5cGUgbnVtYmVyLCBUbi4KLQotV2VkIEFwciAxMyAxNzoxMToxNSAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKG9wdGFibGUpOiBBZGQgbmV3W10gYW5kIGRlbGV0ZVtdLgotCi1GcmkgQXByICA4IDExOjIxOjQyIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBhcmd2LmMgKGJ1aWxkYXJndik6IERvbid0IHByb2R1Y2UgZW1wdHkgYXJndW1lbnQganVzdCBiZWNhdXNlCi0JdGhlcmUgaXMgdHJhaWxpbmcgd2hpdGVzcGFjZS4KLQotV2VkIEFwciAgNiAxMTo0MjoxNCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBmaXggJ1EnIHF1YWxpZmllZCBuYW1lIGJ1Zy4KLQlIYW5kbGUgJ3AnIHNhbWUgYXMgJ1AnLgotCSogY3BsdXMtZGVtLmMgKGRvX3R5cGUpOiBIYW5kbGUgJ3AnIHNhbWUgYXMgJ1AnLgotCi1TYXQgTWFyIDI2IDEyOjAwOjEzIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZmxvYXRmb3JtYXQuYyAoZ2V0X2ZpZWxkLCBwdXRfZmllbGQpOiAgRml4IG9mZiBieSBvbmUgZXJyb3IgaW4KLQlsaXR0bGUgZW5kaWFuIGNhc2UuCi0KLVRodSBNYXIgMjQgMTA6NDA6MTkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X2Zyb21fZG91YmxlKTogUGFzcyB1bnNpZ25lZCBjaGFyICosCi0Jbm90IGNoYXIgKiwgdG8gcHV0X2ZpZWxkLgotCi1GcmkgTWFyIDE4IDEyOjM0OjMzIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBtZW1tb3ZlLmM6ICBSZS13cm90ZTsgIHBsYWNlZCBpbiBwdWJsaWMgZG9tYWluLgotCi1XZWQgTWFyIDE2IDEwOjMzOjA3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcHJlZml4KTogSWYgQVJNIGRlbWFuZ2xpbmcsIGRvbid0IHRyZWF0Ci0JX19RKiBhcyBhIGNvbnN0cnVjdG9yLgotCi1Nb24gTWFyIDE0IDEyOjI2OjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaWVlZS1mbG9hdC5jOiBSZW1vdmVkOyBubyBsb25nZXIgdXNlZC4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2VkIGFjY29yZGluZ2x5LgotCi1Nb24gTWFyICA3IDEyOjI4OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZmxvYXRmb3JtYXQuYyAoZ2V0X2ZpZWxkKTogUmVtb3ZlZCB1bnVzZWQgbG9jYWwgdmFyaWFibGUgaS4KLQkocHV0X2ZpZWxkKTogUmVtb3ZlZCB1bnVzZWQgbG9jYWwgdmFyaWFibGUgaS4KLQotU3VuIEZlYiAyNyAyMTo1MDoxMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogZmxvYXRmb3JtYXQuYzogTmV3IGZpbGUsIGludGVuZGVkIHRvIHJlcGxhY2UgaWVlZS1mbG9hdC5jLgotCSogTWFrZWZpbGUuaW46IENoYW5nZSBhY2NvcmRpbmdseS4KLQotVGh1IEZlYiAyNCAxMTo1MToxMiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jOiBSZW1vdmUgI2lmZGVmIEdFVE9QVF9DT01QQVQgYW5kICNpZiAwIGNvZGUuCi0JIChfZ2V0b3B0X2luaXRpYWxpemUpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YgX2dldG9wdF9pbnRlcm5hbC4KLQkgKF9nZXRvcHRfaW50ZXJuYWwpOgotCSBJZiBsb25nX29ubHkgYW5kIHRoZSBBUkdWLWVsZW1lbnQgaGFzIHRoZSBmb3JtICItZiIsIHdoZXJlIGYgaXMKLQkgYSB2YWxpZCBzaG9ydCBvcHRpb24sIGRvbid0IGNvbnNpZGVyIGl0IGFuIGFiYnJldmlhdGVkIGZvcm0gb2YKLQkgYSBsb25nIG9wdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIGYuICBPdGhlcndpc2UgdGhlcmUgd291bGQgYmUgbm8KLQkgd2F5IHRvIGdpdmUgdGhlIC1mIHNob3J0IG9wdGlvbi4KLQotVGh1IEZlYiAxMCAxNDo0NDoxNiAxOTk0ICBSaWNoYXJkIFN0YWxsbWFuICAocm1zQG1vbGUuZ251LmFpLm1pdC5lZHUpCi0KLSAgICAgICAgKiBnZXRvcHQuYyBbbm90IF9fR05VX0xJQlJBUllfX10gW19fR05VQ19fXSBbbm90IElOX0dDQ106Ci0gICAgICAgIFRlc3QganVzdCBfX1NURENfXywgbm90IGVtYWNzLgotCi1XZWQgRmViICA5IDAwOjE0OjAwIDE5OTQgIFJpY2hhcmQgU3RhbGxtYW4gIChybXNAbW9sZS5nbnUuYWkubWl0LmVkdSkKLQotICAgICAgICAqIGdldG9wdC5jIFtub3QgX19HTlVfTElCUkFSWV9fXSBbX19HTlVDX19dIFtub3QgSU5fR0NDXQotICAgICAgICBbZW1hY3NdIFtub3QgX19TVERDX19dOiBEb24ndCBpbmNsdWRlIHN0ZGRlZi5oLiAgRG9uJ3QgZGVjbGFyZSBzdHJsZW4uCi0KLUZyaSBEZWMgMjQgMTk6NDM6MDAgMTk5MyAgTm9haCBGcmllZG1hbiAgKGZyaWVkbWFuQG51dHJpbWF0LmdudS5haS5taXQuZWR1KQotCi0gICAgICAgICogZ2V0b3B0LmMgKF9OT19QUk9UTyk6IERlZmluZSBiZWZvcmUgY29uZmlnLmggaXMgaW5jbHVkZWQuCi0KLU1vbiBTZXAgMjAgMTU6NTk6MDMgMTk5MyAgUm9sYW5kIE1jR3JhdGggIChyb2xhbmRAY2h1cmNoeS5nbnUuYWkubWl0LmVkdSkKLQotICAgICAgICAqIGdldG9wdC5jLCBnZXRvcHQxLmMgW2VtYWNzIHx8IENPTkZJR19CUk9LRVRTXTogSW5jbHVkZQotCTxjb25maWcuaD4gb25seSB1bmRlciB0aGVzZSwgZWxzZSAiY29uZmlnLmgiLgotCi1UaHUgQXVnIDEyIDE4OjE2OjQ5IDE5OTMgIFJvbGFuZCBNY0dyYXRoICAocm9sYW5kQGNodXJjaHkuZ251LmFpLm1pdC5lZHUpCi0KLSAgICAgICAgKiBnZXRvcHQuYywgZ2V0b3B0MS5jIFtIQVZFX0NPTkZJR19IXTogSW5jbHVkZQotICAgICAgICA8Y29uZmlnLmg+IGluc3RlYWQgb2YgImNvbmZpZy5oIi4KLQotU3VuIEZlYiAyMCAxNzoxNzowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogY29uY2F0LmM6IENoZWNrIEFOU0lfUFJPVE9UWVBFUyByYXRoZXIgdGhhbiBfX1NURENfXyB0byBkZWNpZGUKLQl3aGV0aGVyIHRvIHVzZSBwcm90b3R5cGVzIG9yIG5vdC4KLQkqIHN0cmVycm9yLmMgKGNvbnN0KTogTmV2ZXIgdW5kZWZpbmU7IGxldCBhbnNpZGVjbC5oIGhhbmRsZSBpdC4KLQkqIHN0cnNpZ25hbC5jIChjb25zdCk6IExpa2V3aXNlLgotCi1UaHUgRmViIDE3IDEzOjI3OjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogeGF0ZXhpdC5jIChfeGV4aXRfY2xlYW51cCk6IERlY2xhcmUgYXMgZXh0ZXJuOyBkb24ndCBpbml0aWFsaXplLgotCU1lcmdpbmcgY29tbW9uIGFuZCBpbml0aWFsaXplZCB2YXJpYWJsZXMgbmVlZCBub3QgYmUgc3VwcG9ydGVkIGJ5Ci0JQU5TSSBDIGNvbXBpbGVycy4KLQkoeGF0ZXhpdCk6IEluaXRpYWxpemUgX3hleGl0X2NsZWFudXAgaWYgbm90IGFscmVhZHkgc2V0LgotCSogeGV4aXQuYzogQ29tbWVudCBmaXguCi0KLVdlZCBGZWIgMTYgMDE6MTU6MzYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB4bWFsbG9jLmM6IERvbid0IGRlY2xhcmUgeGV4aXQ7IGl0J3MgZGVjbGFyZWQgaW4gbGliaWJlcnR5LmguCi0JKHhyZWFsbG9jKTogSWYgb2xkbWVtIGlzIE5VTEwsIGFsbG9jYXRlIHdpdGggbWFsbG9jLCByYXRoZXIgdGhhbgotCWFzc3VtaW5nIHRoYXQgcmVhbGxvYyB3b3JrcyBjb3JyZWN0bHkuCi0KLVR1ZSBGZWIgMTUgMDk6MjY6MTYgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25jYXQuYywgaWVlZS1mbG9hdC5jOiAgUmVwbGFjZSBpbmNsdXNpb24gb2YgPHN0cmluZy5oPgotCXdpdGggZXhwbGljaXQgZnVuY3Rpb24gZGVjbGFyYXRpb25zLCBhcyByZWNvbW1lbmRlZCBieSBJYW4gVGF5bG9yLgotCi1TYXQgRmViIDEyIDEwOjMxOjExIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogeG1hbGxvYy5jICh4bWFsbG9jLCB4cmVhbGxvYyk6IFVzZSBQVFIgYW5kIHNpemVfdCB0aHJvdWdob3V0LgotCShtYWxsb2MsIHJlYWxsb2MpOiBEZWNsYXJlLgotCi1UaHUgRmViIDEwIDE3OjA4OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXJndi5jLCBiYXNlbmFtZS5jOiBJbmNsdWRlIGFuc2lkZWNsLmggYW5kIGxpYmliZXJ0eS5oLgotCSogY29uY2F0LmMsIGZkbWF0Y2guYywgZ2V0cnVudGltZS5jLCBzcGFjZXMuYzogTGlrZXdpc2UuCi0JKiBzdHJlcnJvci5jLCBzdHJzaWduYWwuYywgeGF0ZXhpdC5jLCB4ZXhpdC5jOiBMaWtld2lzZS4KLQkqIHhtYWxsb2MuYzogTGlrZXdpc2UuCi0JKiBjb25jYXQuYzogRG9uJ3QgZGVjbGFyZSB4bWFsbG9jLiAgSWYgX19TVERDX18sIHVzZSA8c3RkYXJnLmg+Ci0JbWFjcm9zLCBub3QgPHZhcmFyZ3MuaD4gbWFjcm9zLgotCSogc3BhY2VzLmMgKHNwYWNlcyk6IE1ha2UgcmV0dXJuIHR5cGUgY29uc3QuICBEb24ndCBjcmFzaCBpZgotCW1hbGxvYyByZXR1cm5zIE5VTEwuCi0JKiBzdHJlcnJvci5jIChzdHJ1Y3QgZXJyb3JfaW5mbyk6IE1ha2UgbmFtZSBhbmQgbXNnIGZpZWxkcyBjb25zdC4KLQkoZXJyb3JfbmFtZXMpOiBNYWtlIGNvbnN0LgotCShzdHJlcnJubyk6IE1ha2UgY29uc3QuCi0JKHN0cnRvZXJybm8pOiBNYWtlIGFyZ3VtZW50IGNvbnN0LgotCSogc3Ryc2lnbmFsLmMgKHN0cnVjdCBzaWduYWxfaW5mbyk6IE1ha2UgbmFtZSBhbmQgbXNnIGZpZWxkcwotCWNvbnN0LgotCShzaWduYWxfbmFtZXMsIHN5c19zaWdsaXN0KTogTWFrZSBjb25zdC4KLQkoc3Ryc2lnbmFsLCBzdHJzaWdubyk6IE1ha2UgY29uc3QuCi0JKHN0cnRvc2lnbm8pOiBNYWtlIGFyZ3VtZW50IGNvbnN0LgotCSogeGF0ZXhpdC5jOiBEZWNsYXJlIHBhcmFtZXRlciB0eXBlcy4KLQkqIHhtYWxsb2MuYyAobmFtZSk6IE1ha2UgY29uc3QuCi0JKHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSk6IE1ha2UgYXJndW1lbnQgY29uc3QuCi0JKiBNYWtlZmlsZS5pbiAoSU5DRElSKTogRGVmaW5lLgotCSguYy5vKTogVXNlICQoSU5DRElSKS4KLQkoZHVtbXkubyk6IExpa2V3aXNlLgotCShhcmd2Lm8sIGJhc2VuYW1lLm8pOiBOZXcgdGFyZ2V0czsgZGVwZW5kIG9uIGxpYmliZXJ0eS5oLgotCShjb25jYXQubywgZmRtYXRjaC5vLCBnZXRydW50aW1lLm8sIHNwYWNlcy5vKTogTGlrZXdpc2UuCi0JKHN0cmVycm9yLm8sIHN0cnNpZ25hbC5vLCB4YXRleGl0Lm8sIHhleGl0Lm8pOiBMaWtld2lzZS4KLQkoeG1hbGxvYy5vKTogTGlrZXdpc2UuCi0JKGNwbHVzLWRlbS5vKTogTmV3IHRhcmdldDsgZGVwZW5kIG9uIGRlbWFuZ2xlLmguCi0JKGdldG9wdC5vLCBnZXRvcHQxLm8pOiBOZXcgdGFyZ2V0czsgZGVwZW5kIG9uIGdldG9wdC5oLgotCShpZWVlLWZsb2F0Lm8pOiBOZXcgdGFyZ2V0OyBkZXBlbmQgb24gaWVlZS1mbG9hdC5oLgotCShvYnN0YWNrLm8pOiBOZXcgdGFyZ2V0OyBkZXBlbmQgb24gb2JzdGFjay5oLgotCi1UdWUgRmViICA4IDA1OjI5OjA4IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCUhhbmRsZSBvYnN0YWNrX2NodW5rX2FsbG9jIHJldHVybmluZyBOVUxMLiAgVGhpcyBhbGxvd3MKLQlvYnN0YWNrcyB0byBiZSB1c2VkIGJ5IGxpYnJhcmllcywgd2l0aG91dCBmb3JjaW5nIHRoZW0KLQl0byBjYWxsIGV4aXQgb3IgbG9uZ2ptcC4KLQkqIG9ic3RhY2suYyAoX29ic3RhY2tfYmVnaW4sIF9vYnN0YWNrX2JlZ2luXzEsIF9vYnN0YWNrX25ld2NodW5rKToKLQlJZiBDQUxMX0NIVU5LRlVOIHJldHVybnMgTlVMTCwgc2V0IGFsbG9jX2ZhaWxlZCwgZWxzZSBjbGVhciBpdC4KLQkoX29ic3RhY2tfYmVnaW4sIF9vYnN0YWNrX2JlZ2luXzEpOiBSZXR1cm4gMSBpZiBzdWNjZXNzZnVsLCAwIGlmIG5vdC4KLQotVHVlIEZlYiAgOCAwMDozMjoyOCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmNhdC5jLCBpZWVlLWZsb2F0LmM6ICBJbmNsdWRlIDxzdHJpbmcuaD4uCi0KLVN1biBGZWIgIDYgMjE6Mjg6NDYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiB4bWFsbG9jLmMgKHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoeG1hbGxvYywgeHJlYWxsb2MpOiBJbmNsdWRlIHRoZSBuYW1lIGluIHRoZSBlcnJvciBtZXNzYWdlLCBpZiBzZXQuCi0KLQkqIFJlcGxhY2UgYXRleGl0LmMgd2l0aCB4YXRleGl0LmMuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKSwgZnVuY3Rpb25zLmRlZjogQ2hhbmdlIHJlZmVyZW5jZXMuCi0KLVNhdCBGZWIgIDUgMTQ6MDI6MzIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBnZXRydW50aW1lLmMgKGdldF9ydW5fdGltZSk6IFVzZSBnZXRydXNhZ2Ugb3IgdGltZXMgaWYKLQlIQVZFX0dFVFJVU0FHRSBvciBIQVZFX1RJTUVTIGFyZSBkZWZpbmVkLgotCi1GcmkgRmViICA0IDE1OjQ5OjM4IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXRleGl0LmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyksIGZ1bmN0aW9ucy5kZWY6IEFkZCBpdC4KLQkqIHhleGl0LmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUywgUkVRVUlSRURfT0ZJTEVTKTogQWRkIGl0LgotCSogeG1hbGxvYy5jICh4bWFsbG9jLCB4cmVhbGxvYyk6IENhbGwgeGV4aXQgaW5zdGVhZCBvZiBleGl0LgotCUNoYW5nZSByZXF1ZXN0IGZvciAwIGJ5dGVzIGludG8gcmVxdWVzdCBmb3IgMSBieXRlLgotCi1XZWQgRmViICAyIDExOjM2OjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogeG1hbGxvYy5jICh4bWFsbG9jLCB4cmVhbGxvYyk6IFByaW50IHNpemUgdXNpbmcgJWx1LCBhbmQgY2FzdCB0bwotCXVuc2lnbmVkIGxvbmcsIHRvIGF2b2lkIHdhcm5pbmdzLgotCi1GcmkgSmFuIDI4IDE3OjQ5OjA2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGR1bW15LmM6IERvbid0IGluY2x1ZGUgdGltZS5oIGV2ZXI7IGFsd2F5cyBkZWZpbmUgY2xvY2tfdCBhcwotCSJ1bnNpZ25lZCBsb25nIi4gIFVudGlsIGdjYy9maXhpbmNsdWRlcyBlbnN1cmVzIHRoYXQgY2xvY2tfdAotCWV4aXN0cywgX19TVERDX18gaXNuJ3QgYSBzdWZmaWNpZW50IHRlc3QuICBBbmQgaWYgY2xvY2soKSBkb2Vzbid0Ci0JZXhpc3QsIGNsb2NrX3QgcHJvYmFibHkgZG9lc24ndCBlaXRoZXIuCi0KLU1vbiBKYW4gMjQgMTE6NTI6MzEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjbG9jay5jLCBnZXRydW50aW1lLmM6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluOiBBZGQgdG8gZmlsZSBsaXN0cy4KLQkqIGZ1bmN0aW9ucy5kZWYgKGNsb2NrKTogQWRkIHRvIGxpc3QuCi0JKiBkdW1teS5jICh0aW1lLmgpOiBBZGQgaWYgX19TVERDX18uCi0JKGNsb2NrX3QpOiAjZGVmaW5lIGFzICJ1bnNpZ25lZCBsb25nIiBpZiBub3QgX19TVERDX18uCi0KLVR1ZSBKYW4gMTEgMTE6Mjc6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzdHJ0b2QuYzogRGVjbGFyZSBhdG9mLiAgRnJvbSBlZGxlckBqYW4udWx0cmEubnl1LmVkdSAoSmFuCi0JRWRsZXIpLgotCi1UdWUgRGVjIDI4IDE0OjE3OjMwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGVycm9ycyk6IFVzZSBDRkxBR1MgYXMgd2VsbCBhcyBMREZMQUdTIHdoZW4KLQlsaW5raW5nLgotCi1GcmkgRGVjIDE3IDEyOjI2OjA3IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2FybV9wdCk6IE5ldyBmdW5jdGlvbi4gIENvbW1vbiBjb2RlCi0JZm9yIEFSTSB0ZW1wbGF0ZSBkZW1hbmdsaW5nLgotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2NsYXNzX25hbWUpOiBVc2UgZGVtYW5nbGVfYXJtX3B0LgotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCk6IExpa2V3aXNlLgotCi1UdWUgTm92IDMwIDE1OjQ3OjQ4IDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogQWRkIENPTlNUIHRvIHBsZWFzZSBnY2MuCi0KLVNhdCBOb3YgMjcgMTE6MDU6NTAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQlNZXJnZSBjaGFuZ2VzIGZyb20gdG9tQGJhc2lsLmljY2UucnVnLm5sIChUb20gUi5IYWdlbWFuKQotCSogc3RyZXJyb3IuYywgc3Ryc2lnbmFsLmM6ICBBcyBhIHNtYWxsIHNwYWNlIG9wdGltaXphdGlvbiwgZG9uJ3QKLQlpbmNsdWRlIG1lc3NhZ2VzIHdoZW4gdGhleSBhcmVuJ3QgYWN0dWFsbHkgdXNlZC4KLQotCU1lcmdlIGNoYW5nZXMgZnJvbSB0YWtlZml2ZS5jby5hdCFqb2UgKEpvc2VmIExlaGVyYmF1ZXIpCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcHJlZml4LCBkZW1hbmdsZV9mdW5jdGlvbl9uYW1lLAotCWNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6ICBGaXhlcyBmb3Igc3lzdGVtcyB3aGVyZSBjcGx1c19tYXJrZXIKLQlpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiAnJCcuCi0KLUZyaSBOb3YgMjYgMTM6NTE6MTEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIHdhaXRwaWQuYzogIFNpbXBsZS1taW5kZWQgYXBwcm9jaW1hdGlvbiB0byB3YWl0cGlkCi0JdXNpbmcgdmFuaWxsYSB3YWl0LgotCSogZnVuY3Rpb25zLmRlZiwgTWFrZWZpbGUuaW46ICBVcGRhdGUgYWNjb3JkaW5nbHksCi0KLVRodSBOb3YgMTggMTg6MDE6MTUgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyhkZW1hbmdsZV90ZW1wbGF0ZSk6IGZpeCBidWcgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgotCXdpdGggdmFsdWUgb2YgdXNlciBkZWZpbmVkIHR5cGUuCi0KLVdlZCBOb3YgMTcgMTg6MzA6MjEgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyhjcGx1c19kZW1hbmdsZV9vcG5hbWUpOiBhZGQgdGhlIHN1YmplY3QgbmV3IGZ1bmN0aW9uCi0JdG8gc3VwcG9ydCB1bmlmaWVkIHNlYXJjaCBvZiBvcGVyYXRvciBpbiBjbGFzcy4KLQotV2VkIE5vdiAxMCAwOTo0NzoyMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCWdjYyAtV2FsbCBsaW50OgotCSogc3RydG91bC5jIChzdHJ0b3VsKTogdXNlICIoZGlnaXQgPSAqcykgIT0gJ1wwJyIgbm90IGp1c3QKLQkiZGlnaXQgPSAqcyIgYXMgY29uZGl0aW9uIGluIHdoaWxlIGxvb3AuCi0KLVR1ZSBOb3YgIDkgMTU6NTI6MjIgMTk5MyAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHBhc3MgU0hFTEwgdG8gcmVjdXJzaXZlIG1ha2UKLQotVGh1IE5vdiAgNCAxMjowOToyNiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogdmZwcmludGYuYywgdnByaW50Zi5jLCB2c3ByaW50Zi5jOiAgTWFrZSBmb3JtYXQgYXJnCi0JYmUgKGNvbnN0IGNoYXIqKSwgZm9yIEFOU0kgKGFuZCBnY2Mgdy9maXhwcm90bykgY29uc2lzdGVuY3kuCi0KLVRodSBOb3YgIDQgMDg6Mjk6MDQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZTogTWFrZSAqLSotaGl1eCogdXNlIG1oLWhwdXguCi0KLUZyaSBPY3QgMjIgMDc6NTM6MTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZTogQWRkICogdG8gZW5kIG9mIGFsbCBPUyBuYW1lcy4KLQotVHVlIE9jdCAxOSAxNzoxMjowMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChsbmVlZGVkLWxpc3QpOiBlbnN1cmUgdGhhdCBvYmplY3QgZmlsZSBuYW1lcyBhcmUKLQkgIG5vdCBkdXBsaWNhdGVkLCBhcyBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgb2JqZWN0IGZpbGUgaW4KLQkgIGEgbGlicmFyeSBjYXVzZXMgcHJvYmxlbXMgb24gc29tZSBtYWNoaW5lcwotCi1Nb24gT2N0IDE4IDIxOjU5OjI4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzdHJjYXNlY21wLmMsIHN0cm5jYXNlY21wLmM6IENoYW5nZSB1X2NoYXIgdG8gdW5zaWduZWQgY2hhci4KLQotRnJpIE9jdCAxNSAyMjoxNzoxMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIHN0cm5jYXNlY21wLmM6IG5ldyBmaWxlLCBpbXBsZW1lbnRzIHN0cm5jYXNlY21wCi0JKiBzdHJjYXNlY21wLmM6IG5ldyBmaWxlLCBpbXBsZW1lbnQgc3RyY2FzZWNtcAotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogbGlzdCB0aGVzZSB0d28gbmV3IHNvdXJjZSBmaWxlcwotCi0JKiBmdW5jdGlvbnMuZGVmOiBhZGQgc3RyY2FzZWNtcCBhbmQgc3RybmNhc2VjbXAgZW50cmllcwotCi1GcmkgT2N0IDE1IDE0OjUzOjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc3RydG91bC5jIChzdHJ0b3VsKSwgc3RydG9sLmMgKHN0cnRvbCk6IEhhbmRsZSBvdmVyZmxvdwotCWFjY29yZGluZyB0byBBTlNJIEMuCi0KLVRodSBPY3QgMTQgMTY6MzQ6MTkgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogYWRkIHN1cHBvcnQgb2YgQVJNIGdsb2JhbCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yLAotCWFuZCAnRycgZm9yIHBhc3NpbmcgcmVjb3JkIG9yIHVuaW9uIGluIHBhcmFtZXRlci4KLQotV2VkIE9jdCAxMyAxMzozNjoxOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEZpeCBjb21tZW50IHRvIGNsYXJpZnkgdGhhdCBzdHVmZiBpbiBSRVFVSVJFRF9PRklMRVMKLQlzaG91bGQgbm90IGJlIGluIGZ1bmN0aW9ucy5kZWYuCi0KLVdlZCBPY3QgMTMgMTM6MTM6MzggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBmdW5jdGlvbnMuZGVmOiBSZW1vdmVkIHhtYWxsb2MuICBTdHVmZiBpbiBSRVFVSVJFRF9PRklMRVMgc2hvdWxkCi0Jbm90IGJlIGluIGZ1bmN0aW9ucy5kZWYuCi0KLU1vbiBPY3QgIDQgMTg6MjY6MzkgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogY2hhbmdlIGdsb2JsIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgdG8gcHJvcGVyIG5hbWUKLQotVHVlIFNlcCAyOCAxODoxMTowNyAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiBmaXggYnVnIGluIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IKLQotVHVlIFNlcCAyOCAxNjoyMDo0OSAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiBzdXBwb3J0IGJvdGggb2xkIGFuZCBuZXcgX3Z0JC4uLiB2dGJsIG1hbmdsZWQgbmFtZXMKLQotRnJpIFNlcCAyNCAxOTowNzoxNiAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IEZpeCBkZW1hbmdsZV90ZW1wbGF0ZSBwcm90b3R5cGUKLQotRnJpIFNlcCAyNCAxNzozMjo1NSAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiBmaXggdGVtcGxhdGUgZGVtYW5nbGluZwotCSogY3BsdXMtZGVtLmM6IGZpeCBjb25zdCB0eXBlIGRlbWFuZ2xpbmcKLQkqIGNwbHVzLWRlbS5jOiBmaXggY29uc3RydWN0b3IvZGVzdHJ1Y3RvciwgdmlydHVhbCB0YWJsZSwKLQlxdWFsaWZpZXIsIGdsb2JhbCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGRlbWFuZ2xpbmcKLQotV2VkIFNlcCAgMSAyMzoxMzoxMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3Ryc2lnbmFsLmMsIHN0cmVycm9yLmM6IFVzZSBmdWxseS1icmFja2V0ZWQgaW5pdGlhbGl6ZXIgdG8KLQlrZWVwIGdjYyAtV2FsbCBoYXBweS4KLQotRnJpIEF1ZyAyNyAxMDozMDowOSAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRvX3R5cGUpOiBBZGQgQ09OU1RTIHRvIG1ha2UgZ2NjIGhhcHB5IHdpdGggbGFzdAotCXBhdGNoLgotCi1GcmkgQXVnIDI3IDExOjI0OjU0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JUGF0Y2ggZnJvbSBQYXVsIEZsaW5kZXJzOgotCSogY3BsdXMtZGVtLmMgKGRvX3R5cGUpOiBEZWFsIHdpdGggYXJyYXlzLgotCi1UdWUgQXVnIDI0IDE0OjIzOjUwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcXVhbGlmaWVkOiBEZWFsIHdpdGggR05VIGZvcm1hdCBmb3IgbW9yZQotCXRoYW4gOSBjbGFzc2VzLgotCi1XZWQgQXVnIDE4IDE5OjUwOjI5IDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZHVtbXkubyk6IFJlZGlyZWN0IHRvIC9kZXYvbnVsbCB0byBhdm9pZCAidmFyaWFibGUKLQlub3QgaW5pdGlhbGl6ZWQiIHdhcm5pbmdzIHVuZGVyIEhQL1VYCi0KLVN1biBBdWcgMTUgMjA6NDI6NDAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHN0cmVycm9yLmM6IE1vdmUgaW5jbHVkZSBvZiBzdGRpby5oIGFmdGVyIHN5c19lcnJsaXN0ICNkZWZpbmUuCi0JQWxzbyByZW1vdmUgTlVMTCBkZWZpbml0aW9uIChzdGRpby5oIGFsd2F5cyBkZWZpbmVzIE5VTEwsIHNvIGl0Ci0JbmV2ZXIgZGlkIGFueXRoaW5nIGJ1dCBjbHV0dGVyIHVwIHRoZSBjb2RlKS4KLQotU2F0IEF1ZyAxNCAxNDoyMTo0OSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBmdW5jdGlvbnMuZGVmOiBoYW5kbGUgeG1hbGxvYy5jCi0KLQkqIHhtYWxsb2MuYzogcHJvdmlkZSB4bWFsbG9jIGFuZCB4cmVhbGxvYyBmdW5jdGlvbnMKLQotVGh1IEF1ZyAxMiAxNzozODo1NyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiBGaXggYSBjb21tZW50LgotCi1TYXQgQXVnICA3IDEzOjU2OjM1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0MS5jOiBEZWNsYXJlIGNvbnN0IHRoZSB3YXkgZ2V0b3B0LmMgZG9lcy4KLQotRnJpIEF1ZyAgNiAxNzowMzoxMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYywgYWxsb2NhLmM6IFVwZGF0ZSBmcm9tIEZTRi4KLQkqIGdldG9wdC5jLCBnZXRvcHQxLmM6IFVwZGF0ZSB0byBjdXJyZW50IEZTRiB2ZXJzaW9uLCB3aGljaAotCWRvZXNuJ3QgdXNlIGFsbG9jYS4KLQotVHVlIEp1bCAyNyAxNDowMzo1NyAxOTkzICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkZW1hbmdsZSk6IEFkZCB0aGUgdGFyZ2V0IHdpdGggYSBtZXNzYWdlIHNheWluZwotCXdoZXJlIGRlbWFuZ2xlIHdlbnQuCi0KLU1vbiBKdWwgMjYgMTU6NDk6NTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgb2Jzb2xldGUgYGRlbWFuZ2xlJyB0YXJnZXQuCi0KLVRodSBKdWwgMjIgMDg6MzE6MDEgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChhcm1fc3BlY2lhbCk6ICBBcHBseSBwYXRjaCBmcm9tIGFyZ0BsdWNpZC5jb20gdG8KLQlhdm9pZCBpbmZpbml0ZSBsb29wIG9uIHZ0Ymwgc3ltYm9scyB3aXRoIGRpc2FtYmlndWF0aW5nICJqdW5rIgotCXRhY2tlZCBvbiB0aGUgZW5kLgotCi1Nb24gSnVsIDE5IDE0OjEwOjM3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogc3Ryc2lnbmFsLmM6IHdvcmsgYXJvdW5kIHNvbWUgc3lzdGVtcyBsb3NpbmcgZGVmaW5pdGlvbnMgb2YKLQlzeXNfc2lnbGlzdAotCi0JKiBjb25maWcvbWgtbHlueG9zOiB0aGlzIHN5c3RlbSBoYXMgYSBsb3NpbmcgZGVmaW5pdGlvbiBvZgotCXN5c19zaWdsaXN0Ci0KLQkqIGNvbmZpZy50YWJsZTogdXNlIG1oLWx5bnhvcyBmb3IgKi0qLWx5bnhvcwotCi1Nb24gSnVsIDE5IDE3OjA4OjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnRhYmxlOiBBZGQgc3VwcG9ydCBmb3IgSFBQQSBCU0QgaG9zdHMuCi0KLQkqIGNvbmZpZy9taC1ocGJzZDogTmV3IGZpbGUuCi0KLU1vbiBKdWwgMTIgMTg6MDA6NDAgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQUdTKTogbWFrZSB3b3JrIHdoZW4gc3JjZGlyICE9IG9iamRpci4KLQotU3VuIEp1biAyNyAxNTozNTozMSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChtYWluKTogQWRkIGxvbmcgb3B0aW9ucywgaW5jbHVkaW5nIC0taGVscCBhbmQKLQktLXZlcnNpb24uCi0JKHVzYWdlKTogTmV3IGZ1bmN0aW9uIGZyb20gY29kZSBpbiBtYWluLgotCi1UdWUgSnVuIDIyIDExOjM3OjM4IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcudGFibGU6ICBOZXcgc2hlbGwgc2NpcHQsIHNvdXJjZWQgYnkgYm90aCAuL2NvbmZpZ3VyZSxpbgotCWFuZCAuLi94aWJlcnR5L2NvbmZpZ3VyZS5pbiwgdG8gYXZvaWQgbWFpbnRhaW5hbmNlIGxvc3NhZ2VzLgotCSogY29uZmlndXJlLmluIGFuZCAuLi94aWJlcnR5L2NvbmZpZ3VyZS5pbjogIFVzZSBjb25maWcudGFibGUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdXNlIG1oLWFpeCBmb3IgQUlYIDMuMiwgb25seSBmb3IgMy4xLgotCSogY29uZmlndXJlLmluOiBNYXAgKi0qLWlyaXgqIChleGNlcHQgaXJpeDQpIHRvIG1oLXN5c3YuCi0JKiAuLi94aWJlcnR5L2NvbmZpZ3VyZS5pbjogIFVwZGF0ZSBmcm9tIC4vY29uZmlndXJlLmluLgotCi1UdWUgSnVuIDE1IDE3OjA1OjMxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBwYXJlbnRkaXIgc3VwcG9ydAotCi1XZWQgTWF5IDI2IDEyOjU5OjA5IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY3BsdXMtZGVtLmMgKHhyZWFsbG9jKTogIE1hdGNoIGRlZmluaXRpb24gd2l0aCBwcm90b3R5cGUuCi0KLVR1ZSBNYXkgMjUgMTQ6Mjc6NTEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcHJlZml4KTogIERlbWFuZ2xlIGNmcm9udAotCWxvY2FsIHZhcmlhYmxlcyBhcyBhbiBleHRlbnNpb24gdG8gQVJNIGRlbWFuZ2xpbmcuCi0KLUZyaSBNYXkgMjEgMDk6NTM6NTcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGllZWUtZmxvYXQuYzogRG9uJ3QgcmVxdWlyZSBwb2ludGVycyB0byBkb3VibGUgdG8gYmUgYWxpZ25lZC4KLQotVHVlIE1heSAxOCAxNzoxMjoxMCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotICAgICAgICAobWVyZ2UgY2hhbmdlcyBmcm9tIGRsb25nQGNzZS51Y3NjLmVkdSkKLQkqIGNwbHVzLWRlbS5jIChjb25zdW1lX2NvdW50KTogIFNpbXBsaWZ5LgotCSogY3BsdXMtZGVtLmMgKGFybV9wdCwgZGVtYW5nbGVfY2xhc3NfbmFtZSk6ICBOZXcgZnVuY3Rpb25zLgotCSogY3BsdXMtZGVtLmMgKHZhcmlvdXMpOiAgQ2FsbHMgdG8gYXJtX3B0LCBkZW1hbmdsZV9jbGFzc19uYW1lLgotCi0JKiBjcGx1cy1kZW0uYyAoeG1hbGxvYywgeHJlYWxsb2MsIHN0cnN0cik6ICBNYWtlIGV4dGVybiBkZWNscyBpbnRvCi0JZnVsbCBwcm90b3R5cGVzLgotCSogY3BsdXMtZGVtLmMgKGZyZWUpOiAgQWRkIHByb3RvdHlwZS4KLQkqIGNwbHVzLWRlbS5jIChvcHRhYmxlKTogIEZ1bGx5IGJyYWNrZXRpemUgaW5pdGlhbGl6ZXIuCi0KLUZyaSBNYXkgMTQgMTc6MTM6MDUgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiAgV2hldGhlciBpbml0aWFsIHVuZGVyc2NvcmVzIGFyZSBzdHJpcHBlZAotCWRlcGVuZHMgb24gdGhlIGV4dGVybmFsIHZhcmlhYmxlIHByZXBlbmRzX3VuZGVyc2NvcmUKLQkod2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IHRoZSBiaW51dGlscyBNYWtlZmlsZSkuCi0KLUZyaSBNYXkgMTQgMDc6MzI6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChtb3BfdXAsIGFybV9zcGVjaWFsKTogUmVtb3ZlIHNvbWUgdW51c2VkIHZhcmlhYmxlcy4KLQotVHVlIE1heSAgNCAyMDozMTo1OSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGNvbnN1bWVfY291bnQpOiAgUmV0dXJuIHplcm8gaWYgYXJnIGRvZXMgbm90Ci0Jc3RhcnQgd2l0aCBkaWdpdCwgYW5kIGRvbid0IGNvbnN1bWUgYW55IGlucHV0LgotCi1UdWUgTWF5ICA0IDA4OjEwOjI4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGVtYW5nbGUpOiBVc2UgJHtzcmNkaXJ9IG5vdCAkXi4KLQotCSogc3RydG9kLmM6IE5ldyBmaWxlLCBuZWVkZWQgYXQgbGVhc3QgZm9yIEJTRCA0LjMuCi0KLVN1biBNYXkgIDIgMTE6MzA6NDIgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHN0cnNpZ25hbC5jIChzeXNfc2lnbGlzdCk6ICBGb3IgQU5TSSBjb21waWxhdGlvbnMsIHR5cGUgaXMKLQkiY29uc3QgY2hhciAqY29uc3QiLiAgQWxzbyByZW1vdmUgY29uZGl0aW9uYWxpemF0aW9uIG9uIF9fU1REQ19fCi0Jc2luY2UgY29uc3QgaXMgZGVmaW5lZCBhd2F5IGZvciBub24tQU5TSS4KLQotV2VkIEFwciAyOCAxOToyOTo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgKi0qLWhwdXguCi0JKiBjb25maWcvbWgtaHB1eDogTmV3IGZpbGUuCi0KLVR1ZSBBcHIgMjcgMTU6MjI6MTkgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIHRtcG5hbS5jOiAgQWRkZWQgQU5TSSB0bXBuYW0oKSBmdW5jdGlvbi4KLQkqIGZ1bmN0aW9ucy5kZWYsIE1ha2VmaWxlLmluOiAgVXBkYXRlIGFjY29yZGluZ2x5LgotCi1UdWUgQXByIDI3IDEzOjM4OjM4IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmN0aW9uX25hbWUpOiBHZXQgdGhlIGRlbWFuZ2xpbmcgb2YKLQlzdG9wX18xQSByaWdodC4KLQotRnJpIEFwciAxNiAyMzo0ODoyNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgY2FsdmluKQotCi0JKiBjcGx1cy1kZW0uYzogRGVjbGFyZSBzdHJzdHIgcmV0dXJuIHR5cGUuCi0KLUZyaSBNYXIgMjYgMTI6MDE6MjYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIHN0cnNpZ25hbC5jOiBBZGQgc29tZSBBSVggc2lnbmFscy4KLQotVGh1IE1hciAyNSAxNToxNzoyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNQUtFT1ZFUlJJREVTKTogRGVmaW5lIHRvIGJlIGVtcHR5LgotCi1XZWQgTWFyIDI0IDAxOjU5OjI1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGluc3RhbGxjaGVjayAmIGR2aSB0YXJnZXRzCi0KLVRodSBNYXIgMTggMTQ6MDU6NDQgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpZWVlLWZsb2F0LmM6ICBOZXcgZmlsZSwgbW92ZWQgZnJvbSAuLi9nZGIgKHNpbmNlIGl0IGlzCi0JbmVlZGVkIGJ5IC4uL29wY29kZS9tNjhrLWRpcy5jKS4KLQotVHVlIE1hciAgMiAxNzo0NzozMSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6ICBSZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIGNmcm9udCB3aXRoIEFSTS4KLQotRnJpIEZlYiAyNiAwMDoxNzowNyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiAgRml4IG1haW4gcHJvZ3JhbSAod2hlbiBjb21waWxlZCB3aXRoIC1ETUFJTikKLQl0byBiZSBtb3JlIHVzZWZ1bCBhcyBhIGZpbHRlci4KLQotU2F0IEZlYiAyMCAyMTo0MTozOSAxOTkzICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsX3RvX2xpYmRpciwgaW5zdGFsbF90b190b29sZGlyKTogR28gaW50byB0aGUKLQlkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYmVmb3JlIHJ1bm5pbmcgJChSQU5MSUIpLCBpbiBjYXNlIHRoYXQKLQlwcm9ncmFtIHRyaWVzIHRvIGNyZWF0ZSBhIGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFzIHBhcnQgb2YKLQlpdHMgd29yay4KLQotVGh1IEZlYiAxOCAyMzowMDoxOSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogc3Ryc2lnbmFsLmMgKHN5c19zaWdsaXN0KTogIFJlbW92ZSB5ZXQgYW5vdGhlciAqJV4mJSYkIyAiY29uc3QiCi0JYmVjYXVzZSBCU0QgNC40IGxhY2tzIG9uZS4gIElzbid0IHRoaXMgZnVuPwotCi1UaHUgRmViIDE4IDExOjI0OjI1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfc2lnbmF0dXJlKTogIFNldCBmdW5jX2RvbmUgYWZ0ZXIKLQlkZW1hbmdsaW5nIGEgdGVtcGxhdGUuCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiAgRml4IHNldmVyYWwgc21hbGwgYnVncwotCWluIGRlbWFuZ2xpbmcgR05VIHN0eWxlIHRlbXBsYXRlcy4KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9wcmVmaXgpOiAgRml4IGZvciB0ZW1wbGF0ZXMgaW4gR05VCi0Jc3R5bGUgY29uc3RydWN0b3JzLgotCSogY3BsdXMtZGVtLmMgKGdudV9zcGVjaWFsKTogIEZpeCBmb3IgdGVtcGxhdGVzIGluIEdOVSBzdHlsZQotCXN0YXRpYyBkYXRhIG1lbWJlcnMuCi0KLVR1ZSBGZWIgMTYgMTc6Mjg6MzUgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9zaWduYXR1cmUpOiAgTW9kaWZ5IHRvIGluY2x1ZGUgdHlwZQotCW1vZGlmaWVycyBsaWtlIHN0YXRpYyBhbmQgY29uc3QgaW4gcmVtZW1iZXJlZCB0eXBlcy4KLQotVGh1IEZlYiAxMSAyMjoyMDo0NyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlZF9xdWFsaWZpZWQpOiAgQWRkIG5ldyBwYXJhbWV0ZXIgdGhhdCB0ZWxscwotCXdoZXRoZXIgdG8gcHJlcGVuZCBvciBhcHBlbmQgdGhlIHF1YWxpZmllcnMuCi0JKiBjcGx1cy1kZW0uYyAoc3RyaW5nX3ByZXBlbmRzKTogIFVzZWQgbm93LCByZW1vdmUgI2lmIDAuCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfc2lnbmF0dXJlKTogIENhbGwgZGVtYW5nbGVfcXVhbGlmaWVkCi0Jd2l0aCBwcmVwZW5kaW5nLgotCSogY3BsdXNfZGVtLmMgKGdudV9zcGVjaWFsKTogIFJlY29nbml6ZSBzdGF0aWMgZGF0YSBtZW1iZXJzIHRoYXQKLQl1c2UgcXVhbGlmaWVkIG5hbWVzLgotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3F1YWxpZmllZCk6ICBBY2N1bXVsYXRlIHF1YWxpZmllcnMgaW4gYQotCXRlbXBvcmFyeSBidWZmZXIgYW5kIHRoZSBwcmVwZW5kIG9yIGFwcGVuZCB0aGVtIHRvIHRoZSByZXN1bHQsCi0JYXMgc3BlY2lmaWVkIGJ5IHRoZSBuZXcgImFwcGVuZCIgZmxhZy4KLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogIENhbGwgZGVtYW5nbGVkX3F1YWxpZmllZCB3aXRoCi0JYXBwZW5kaW5nLgotCi1Nb24gRGVjIDI4IDEwOjQ3OjE5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBzdHJzaWduYWwuYyAoc2lnbmFsX3RhYmxlKTogTm93IGNvbnN0LgotCShpbml0X3NpZ25hbF90YWJsZXMpOiBWYXJpYWJsZSBlaXAgbm93IHBvaW50cyB0byBjb25zdC4KLQotCSogc3RyZXJyb3IuYyAoZXJyb3JfdGFibGUpOiBOb3cgY29uc3QuCi0JKGluaXRfZXJyb3JfdGFibGVzKTogVmFyaWFibGUgZWlwIG5vdyBwb2ludHMgdG8gY29uc3QuCi0KLVR1ZSBEZWMgMTUgMTU6MzY6NTAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIG1lbWNoci5jIChtZW1jaHIpOiAgTmV3IChBTlNJIHN0YW5kYXJkKSBmdW5jdGlvbi4KLQkqIE1ha2VmaWxlLmluLCBmdW5jdGlvbnMuZGVmOiAgQWRkZWQgbWVtY2hyLgotCSogTWFrZWZpbGUuaW4gKEFSX0ZMQUdTKTogVXNlIHJjIGluc3RhZCBvZiBub24tc3RhbmRhcmQgY3EuCi0KLVdlZCBEZWMgIDIgMjI6NDk6MTAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYzogcmVtb3ZlIHVzZSBvZiBVU0cgYXJvdW5kIDxhbGxvY2EuaD4sIHdoaWNoIG5ldmVyIG1lYW50Ci0JYW55dGhpbmcgYW55d2F5Ci0KLQkqIGNvbmZpZy9taC17YWl4LGFwb2xsbzY4LG5jcjMwMDAsc3lzdixzeXN2NH06IHJlbW92ZWQgZGVmaW5pdGlvbnMKLQlvZiBVU0cgYW5kIFVTR3I0Ci0KLVRodSBOb3YgMTkgMDM6MDk6MzMgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuZF90eXBlKTogUmVjb2duaXplIGB3JywgYSB3aWRlIGNoYXJhY3RlcjsKLQlpdCdzIG5vdyBhIHR5cGUgYWNjb3JkaW5nIHRvIHRoZSBBTlNJIFgzSjE2IHdvcmtpbmcgcGFwZXI7IG91dHB1dAotCSJ3Y2hhcl90IiBmb3IgaXQuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlKTogQWNjZXB0IGB3JyBhcyBhbiBpbnRlZ3JhbCB0eXBlLgotCSh4bWFsbG9jLCB4cmVhbGxvYyk6IFVzZSBgY2hhciAqJywgbm90IGBQVFInLiAgQ2FzdCBjYWxscyB0byB0aGVpcgotCWNvdW50ZXJwYXJ0cyBtYWxsb2MgYW5kIHJlYWxsb2MgdG8gYGNoYXIgKicuCi0JKG1haW4pOiBFeGl0IHdpdGggYSAwIHN0YXR1cy4KLQkqIE1ha2VmaWxlLmluIChkZW1hbmdsZSk6IERvbid0IGV4cGVjdCB0aGUgdXNlciB0byBkZWZpbmUKLQlERU1BTkdMRSwgaW5zdGVhZCBmb3JjZSB0byBiZSBjcGx1cy1kZW0uYy4gIExvb2sgaW4gJChzcmNkaXIpLy4uL2luY2x1ZGUKLQlmb3IgZGVtYW5nbGUuaC4gIFBhc3MgaXQgYW55IEhERUZJTkVTIG9yIFhUUkFGTEFHUy4KLQotV2VkIE5vdiAxOCAxODo1NjoyMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFSX0ZMQUdTKTogIEF2b2lkIHZlcmJvc2l0eS4KLQkqIGNvbmZpZy9taC1zeXN2NDogIFJlbW92ZSBBUl9GTEFHUyBvdmVycmlkZSwgdXNlIElOU1RBTEw9Y3AsCi0JcmVwbGFjZSBVU0dyNCB3aXRoIEhBVkVfU1lTQ09ORi4KLQkqIGNvbmZpZy9taC1zb2xhcmlzOiAgUmVtb3ZlOyBtaC1zeXN2NCB3b3JrcyBub3cuCi0JKiBnZXRwYWdlc2l6ZS5jOiAgUmVwbGFjZSBVU0dyNCB3aXRoIEhBVkVfU1lTQ09ORi4KLQkqIGNvbmZpZ3VyZS5pbjogIFNpbXBsaWZ5IGhvc3QgbWF0Y2hpbmcgdGFibGUsIHJlbW92ZSBzZXBhcmF0ZQotCXNvbGFyaXMgY29uZmlnIGZpbGUuCi0KLVN1biBOb3YgMTUgMDk6MzU6MTYgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXNvbGFyaXMyKik6ICBBZGQsIHVzZSBtaC1zeXN2NC4KLQotVHVlIE5vdiAgMyAyMToyNzowMyAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoeG1hbGxvYywgeHJlYWxsb2MpOiBBZGQgZGVjbHMuCi0JKHJlbWVtYmVyX3R5cGUpOiBEb24ndCBjYXN0IHhtYWxsb2MuCi0JKHN0cmluZ19uZWVkKTogTGlrZXdpc2U7IGRvbid0IGNhc3QgeHJlYWxsb2MgZWl0aGVyLgotCi1GcmkgT2N0IDIzIDA4OjUyOjAxIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGZ1bmN0aW9ucy5kZWZzLCByZW5hbWUuYzogYWRkZWQgc2ltcGxlCi0JaW1wbGVtZW50YXRpb24gb2YgcmVuYW1lLCBzaW5jZSBzb21lIGJpbnV0aWxzIHByb2dyYW1zIHVzZSBpdC4KLQotVGh1IE9jdCAxNSAxNToxODoyMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogc3Ryc2lnbmFsLmM6ICBBZGQgYXBwcm9wcmlhdGUgJ2NvbnN0JyB0byBzeXNfc2lnbGlzdAotCWV4dGVybiBkZWNsYXJhdGlvbiAoaWYgX19TVERDX18pLiAgKE5lZWRlZCBmb3IgTGludXguKQotCSogc3Ryc2lnbmFsLmMgKHN0cnNpZ25hbCk6IEFkZCBjYXN0IHRvIHJlbW92ZSBjb25zdC1uZXNzLgotCi1GcmkgT2N0ICA5IDAzOjIyOjU1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobmVlZGVkLmF3aywgbmVlZGVkMi5hd2spOiAgUmVtb3ZlIGVycm9uZW91cyBcJ3MKLQliZWZvcmUgIidzLCBkaWFnbm9zZWQgYnkgQlNEIDQuNCBhd2suCi0KLVRodSBPY3QgIDggMTU6MjU6MTIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY3JlYXRlIGNvbmZpZy5oIGFuZCBuZWVkZWQtbGlzdCB0aHJvdWdoICQoQ09ORklHX0gpCi0JYW5kICQoTkVFREVEX0xJU1QpLCB0byBnaXZlIHNvbWUgaG9va3MgZm9yIHhpYmVydHkuCi0KLVRodSBPY3QgIDEgMjM6MzE6NDIgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSBjcHUtdmVuZG9yLXRyaXBsZSBpbnN0ZWFkIG9mIG5lc3RlZCBjYXNlcwotCi1XZWQgU2VwIDMwIDExOjI2OjU5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGFyZ3YuYywgYmFzZW5hbWUuYywgYmNtcC5jLCBiY29weS5jLCBiemVyby5jLAotCWNvbmNhdC5jLCBjcGx1cy1kZW0uYywgZmRtYXRjaC5jLCBnZXRjd2QuYywgZ2V0b3B0LmMsIGdldG9wdDEuYywKLQlnZXRwYWdlc2l6ZS5jLCBpbnNxdWUuYywgbWVtY21wLmMsIG1lbWNweS5jLCBtZW1tb3ZlLmMsIG1lbXNldC5jLAotCW9ic3RhY2suYywgc2lnc2V0bWFzay5jLCBzcGFjZXMuYywgc3RyY2hyLmMsIHN0cmVycm9yLmMsCi0Jc3RycmNoci5jLCBzdHJzaWduYWwuYywgc3Ryc3RyLmMsIHZmb3JrLmMsIHZzcHJpbnRmLmM6Ci0JQ29udmVydCBmcm9tIHVzaW5nIEdQTCB0byBMR1BMLgotCi1TYXQgU2VwIDI2IDA0OjAxOjMwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZXJyb3JzKTogIExlYXZlIGR1bW15Lm8gYW5kIGR1bW15IGFyb3VuZCBzbyB0aGF0Ci0Jd2UgY2FuIHNlZSBob3cgdGhlIG5lZWRlZCBsaXN0IHdhcyBnZW5lcmF0ZWQgKGl0J3Mgc29tZXRpbWVzIHdyb25nKS4KLQkobW9zdGx5Y2xlYW4pOiAgUmVtb3ZlIHRoZW0uCi0KLU1vbiBTZXAgMjEgMTQ6NTA6NDIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBnZXRjd2QuYzogc3VwcGx5IGEgZGVmYXVsdCBpZiBNQVhQQVRITEVOIGlzIG5vdCBkZWZpbmVkLgotCi0JKiBjb25maWcvbWgtaXJpeDQ6IHNldCBFWFRSQV9PRklMRVMgdG8gYWxsb2NhLm8sIGZyb20gV1JTLgotCi1XZWQgU2VwICA5IDEyOjQxOjQ4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFVzZSBYVFJBRkxBR1Mgd2hlbiBjb21waWxpbmcsIHNvIHRoYXQgeGliZXJ0eSB3b3JrcwotCXdoZW4gY3Jvc3MtY29tcGlsaW5nLgotCi1UaHUgU2VwICAzIDEzOjI5OjM5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IChkZW1hbmdsZV9wcmVmaXgpOiByZWR1Y3Rpb24gaW4gc3RyZW5ndGggb2Ygc3Ryc3RyCi0JICBhcyBhIHRpbWUgb3B0aW1pemF0aW9uLgotCi0JKiBjcGx1cy1kZW0uYyAoY3BsdXNfZGVtYW5nbGUpOiByZW1vdmUgc3RycGJyayB0ZXN0LiAgQXBwZWFycyB0bwotCSAgYmUgbW9yZSBleHBlbnNpdmUgdGhhbiBzaW1wbHkgZGVtYW5nbGluZy4KLQotCSogY3BsdXMtZGVtLmMgKGNwbHVzX21hdGNoKTogbmV3IGZ1bmN0aW9uLgotCi1UdWUgU2VwICAxIDE1OjI0OjA0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6ICAjaW5jbHVkZSA8c3RkaW8uaD4sIHRvIGRlZmluZSBOVUxMLgotCURlZmluZSBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUuCi0KLVN1biBBdWcgMzAgMTc6NTg6MTkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogIE5ldyBmaWxlLCBtb3ZlZCBmcm9tIC4uL2dkYi4KLQkqIGNwbHVzLWRlbS5jIChzZXRfY3BsdXNfbWFya2VyX2Zvcl9kZW1hbmdsaW5nKTogIE5ldyBleHBvcnRlZAotCWZ1bmN0aW9uLCB0byBhdm9pZCBjb21waWxpbmcgaW4gdGFyZ2V0LWRlcGVuZGVuY3kgZm9yIENQTFVTX01BUktFUi4KLQkqIGNwbHVzLWRlbS5jIChjcGx1c19kZW1hbmdsZSk6ICBBbGxvdyBkZW1hbmdsaW5nIHN0eWxlIG9wdGlvbgotCXRvIGJlIHBhc3NlZCBhcyBhIHBhcmFtZXRlciwgYnV0IHVzaW5nIHRoZSBnbG9iYWwgdmFyaWFibGUKLQljdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgYXMgYSBkZWZhdWx0LgotCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgZm9yIGNwbHVzLWRlbS5jCi0KLVNhdCBBdWcgMjkgMTA6NDQ6MDkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYzogIE1lcmdlIGluIGNvbW1lbnQgY2hhbmdlcyBmcm9tIEZTRiB2ZXJzaW9uLiAgTm93Ci0JbWF0Y2hlcyB0aGUgRlNGIHZlcnNpb24gZXhhY3RseS4KLQotRnJpIEF1ZyAyOCAxODozOTowOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jIChDQUxMX0ZSRUVGVU4pOiAgQ2FuJ3QgdXNlID86IHdpdGggdm9pZCB2YWx1ZXMgKGF0Ci0JbGVhc3Qgb24gbG9zaW5nIERFQ3N0YXRpb25zISk7IHVzZSBpZi10aGVuLWVsc2UgaW5zdGVhZC4KLQotV2VkIEF1ZyAxOSAxNDo0MDozNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KLQotTW9uIEF1ZyAxMCAxNzozMzo0MCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLSAgICAgICAqIE1ha2VmaWxlLmluOiBjbGVhbiB1cCBkZWZpbml0aW9uIG9mIENGSUxFUywgbW9yZSBjb21tZW50cwotCi1TYXQgQXVnICA4IDIzOjEwOjU5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYyAobXlfaW5kZXgpOiAgTWFrZSBmaXJzdCBhcmcgY29uc3QgdG8gbWF0Y2ggc3RyY2hyLAotCXdoaWNoIGl0IHNvbWV0aW1lcyBpcyByZW1hcHBlZCB0by4KLQotU2F0IEF1ZyAgMSAxMzo0ODo1MCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jIChERUZBVUxUX0FMSUdOTUVOVCk6ICBVcGRhdGUgdG8gbWF0Y2ggRlNGIHZlcnNpb24uCi0JKiBvYnN0YWNrLmMgKF9vYnN0YWNrX2JlZ2luKTogIEluaXRpYWxpemUgdXNlX2V4dHJhX2FyZy4KLQkqIG9ic3RhY2suYyAoX29ic3RhY2tfYmVnaW5fMSk6ICBOZXcsIGZyb20gRlNGIHZlcnNpb24uCi0KLU1vbiBKdWwgMjAgMjE6MDc6NTggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYyAoQ0FMTF9DSEVDS0ZVTiwgQ0FMTF9GUkVFRlVOKTogIFVzZSB1c2VfZXh0cmFfYXJnIGFuZAotCWV4dHJhX2FyZy4KLQkqIG9ic3RhY2suYyAoX29ic3RhY2tfYmVnaW4pOiAgUmVtb3ZlIGFyZWFfaWQgYW5kIGZsYWdzIGFyZ3VtZW50cwotCShwcmV2aW91c2x5IGFkZGVkIGZvciBtbWFsbG9jIHN1cHBvcnQsIGludGVyZmFjZSBoYXMgY2hhbmdlZCkuCi0JQWxzbyBjb252ZXJ0IGZsYWdzIHVzYWdlIHRvIHVzZSB1c2VfZXh0cmFfYXJnIGFuZCBtYXliZV9lbXB0eV9vYmplY3QuCi0KLUZyaSBKdWwgMTAgMDA6NDE6NTMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGFyZ3YuYzogIE1vdmUgZXhwYW5kYXJndiBpbmxpbmUgYW5kIGVsaW1pbmF0ZSBzdGF0aWMgdmFyaWFibGVzLgotCVJld3JpdGUgdG8gYWx3YXlzIGFsbG9jYXRlIGluIHBvd2VycyBvZiB0d28uICBGaXggdG8gcmV0dXJuIGFuCi0JYXJndiB3aXRoIGEgc2luZ2xlIG51bGwgc3RyaW5nIGFyZyBpZiBwYXNzZWQgYSBudWxsIHN0cmluZy4KLQotRnJpIEp1bCAgMyAyMDoyNzoyOSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogcmFuZG9tLmMsIHNpZ3NldG1hc2suYywgc3RyZXJyb3IuYywgc3Ryc2lnbmFsLmM6ICBSZW1vdmUKLQkiKHZvaWQpIiBjYXN0cyBmcm9tIGZ1bmN0aW9uIGNhbGxzIHdoZXJlIHRoZSByZXR1cm4gdmFsdWUgaXMKLQlpZ25vcmVkLCBpbiBhY2NvcmRhbmNlIHdpdGggR05VIGNvZGluZyBzdGFuZGFyZHMuCi0KLU1vbiBKdW4gMjkgMTA6NTQ6MTkgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGJjb3B5LmMsIHN0cmVycm9yLmMsIHN0cnNpZ25hbC5jOiAgTGludC4KLQotVGh1IEp1biAyNSAwOToxODo0MSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jOiBtZXJnZSBjaGFuZ2VzIGZyb20gbWFrZS4KLQotVGh1IEp1biAyNSAwNDo0MzoyMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYWxsb2NhLmM6ICBJbmNvcnBvcmF0ZSBmaXhlcyBmcm9tIGdkYi9hbGxvY2EuYy4KLQlGSVhNRTogIEV2ZW50dWFsbHkgbW92ZSBnZGIncyBhbGxvY2EgY29uZmlndXJhdGlvbiBmaWxlcyBoZXJlLAotCWFuZCByZW1vdmUgZ2RiL2FsbG9jYS5jIGFuZCBpdHMgTWFrZWZpbGUuaW4gc3VwcG9ydC4KLQotVHVlIEp1biAyMyAyMTo1NjozMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZHVtbXkuYzogIERlZmluZSBOT1RISU5HIHRvIC8qbm90aGluZyovLCBjaGFuZ2UgcmV0dXJuIHR5cGUKLQlvZiBtYWluIHRvIGludCBhbmQgcmV0dXJuIHplcm8uCi0JKiBmdW5jdGlvbnMuZGVmOiAgU3VwcGx5IE5PVEhJTkcgYXMgdGhlIGZvdXJ0aCBhcmcgdG8gbWFjcm9zCi0JdGhhdCBkb24ndCBoYXZlIGFuIGV4cGxpY2l0IGFyZywgdG8gc2F0aXNmeSBwaWNreSBwcmVwcm9jZXNzb3JzLgotCi1XZWQgSnVuIDE3IDE4OjEzOjU4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBDbGVhbiB1cCAqY2xlYW4gcnVsZXMsIGFzIHBlciBzdGFuZGFyZHMudGV4aS4KLQotVHVlIEp1biAxNiAxNjoxMTo1OSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jLCBnZXRvcHQxLmM6IG1lcmdlZCBsYXJnZWx5IGdyYXR1aXRvdXMsIG1vc3RseQotCSAgd2hpdGVzcGFjZSBkaWZmcyBmcm9tIG90aGVyIHByZXAgZGlzdHJpYnV0aW9ucy4KLQotTW9uIEp1biAxNSAxMjoyNTo0NiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLW5jcjMwMDAgKElOU1RBTEwpOiAgRG9uJ3QgdXNlIC91c3IvdWNiL2luc3RhbGwsCi0JaXQgaXMgYnJva2VuIG9uIG5jciAzMDAwJ3MuCi0KLU1vbiBKdW4gMTUgMDE6MDM6MjYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHNpZ3NldG1hc2suYzogIFJld3JpdGUuICBPbGQgb25lIHdhcyB2ZXJ5IGNvbmZ1c2VkIGFib3V0IGl0cwotCWFyZ3VtZW50cyBhbmQgcmVzdWx0LiAgTmV3IG9uZSBjYW4ndCBkbyBtdWNoLCBidXQgYXQgbGVhc3Qga25vd3MKLQl3aGF0IGl0IGNhbid0IGRvLCBhbmQgaXQncyBnb29kIGVub3VnaCBmb3IgR0RCJ3MgdXNlLgotCi1TdW4gSnVuIDE0IDE1OjE3OjQwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGZ1bmN0aW9ucy5kZWY6ICBVc2UgcHJvcGVyIHByb3RvdHlwZSBmb3Igc3RydG91bC4KLQotRnJpIEp1biAxMiAxOToyMjo0MCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGQgcmFuZG9tLmMuCi0JKiBjb25maWcvbWgtKjogIFVzZSAidHJ1ZSIgcmF0aGVyIHRoYW4gImVjaG8gPi9kZXYvbnVsbCIgZm9yIHJhbmxpYi4KLQkqIGNvbmZpZ3VyZS5pbjogIHVwZGF0ZSBzb2xhcmlzMiBjb25maWcuCi0KLVdlZCBKdW4gMTAgMTY6MzE6MjkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHJhbmRvbS5jOiAgQWRkIGZvciByYW5kb20oKSBhbmQgc3JhbmRvbSgpLgotCSogZnVuY3Rpb25zLmRlZjogIEFkZCByYW5kb20KLQotVHVlIEp1biAgOSAxNzoyNzoxOCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3ttaC1uY3IzMDAwLCBtaC1zeXN2NH06ICBBZGQgZGVmaW5pdGlvbiBmb3IgSU5TVEFMTAotCXVzaW5nIC91c3IvdWNiL2luc3RhbGwuCi0KLU1vbiBKdW4gIDEgMTM6MjA6MTcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzdHJlcnJvci5jOiAgS2x1ZGdlIHRvIGd1YXJkIGFnYWluc3QgYSBjb25mbGljdCB3aXRoCi0JcG9zc2libGUgZGVjbGFyYXRpb24gb2Ygc3lzX2Vycmxpc3QgaW4gZXJybm8uaC4KLQotU3VuIE1heSAzMSAxNTowNzo0NyAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy9taC1zb2xhcmlzOiBhZGQgc29sYXJpczIgY29uZmlnIHN1cHBvcnQuCi0KLUZyaSBNYXkgMjkgMTc6MjM6MjMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzaWdzZXRtYXNrLmM6ICAjaWZkZWYgb3V0IHNpZ3NldG1hc2sgaWYgU0lHX1NFVE1BU0sKLQlpcyBub3QgZGVmaW5lZCAoc2hvdWxkIGJlIGRlZmluZWQgaW4gc2lnbmFsLmgsIHNheXMgUG9zaXguKS4KLQotTW9uIE1heSAxOCAxNzozNTowNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmM6IG1lcmdlZCBjaGFuZ2VzIGZyb20gbWFrZS0zLjYyLjExLgotCi1GcmkgTWF5ICA4IDE0OjUzOjA3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYzogbWVyZ2VkIGNoYW5nZXMgZnJvbSBiaXNvbi0xLjE4LgotCi1UdWUgTWF5ICA1IDExOjUxOjQwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBEb24ndCBoYXZlICQoRVhUUkFfT0ZJTEVTKSBkZXBlbmQgb24gY29uZmlnLmgsCi0Jc2luY2UgdGhhdCBpbnRyb2R1Y2VzIGEgY2lyY3VsYXIgZGVwZW5kZW5jeS4KLQkoJChFWFRSQV9PRklMRVMpIGFyZSB1c2VkIHRvIGJ1aWxkIGNvbmZpZy5oLikKLQotCSogc3RydG91bC5jOiAgRml4ZXMgdG8gaGFuZGxlIG5vbi1kZWNpbWFsIGJhc2VzIGJldHRlci4KLQotV2VkIEFwciAyMiAwOToyNzo1MSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLW5jcjMwMDA6ICBSZXBsYWNlIE1JTlVTX0cgd2l0aCBDRkxBR1MuCi0JKiBNYWtlZmlsZS5kb3M6ICBGaW5pc2ggTUlOVVNfRyBlcmFkaWNhdGlvbi4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiAgQWRkIHN0cnNpZ25hbC5jLgotCSogTWFrZWZpbGUuaW4gKFJFUVVJUkVEX09GSUxFUyk6ICBBZGQgc3RyZXJyb3IubyBzdHJzaWduYWwubwotCSogTWFrZWZpbGUuaW4gKG5lZWRlZC1saXN0KTogIFNwbGl0IGNyZWF0aW9uIG9mIGVycm9ycyBmaWxlIHRvCi0Jc2VwYXJhdGUgbWFrZSB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLmgsIG5lZWRlZDIuYXdrLCBlcnJvcnMpOiAgTmV3IHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiAgU3BsaXQgdG8gbXVsdGlwbGUgbGluZXMsIGFkZCBuZWVkZWQyLmF3awotCWFuZCBjb25maWcuaC4KLQkqIGR1bW15LmMgKERFRkZVTkMsIERFRlZBUik6ICBBZGQgZGVmaW5lcyBhbmQgdW5kZWZzLgotCSogZnVuY3Rpb25zLmRlZiAoc3RyZXJyb3IpOiAgUmVtb3ZlIGZyb20gb3B0aW9uYWwgbGlzdC4KLQkqIGZ1bmN0aW9ucy5kZWYgKHN5c19uZXJyLCBzeXNfZXJybGlzdCwgc3lzX3NpZ2xpc3QpOiAgREVGVkFSJ3MKLQkqIGZ1bmN0aW9ucy5kZWYgKHN0cmVycm9yLCBwc2lnbmFsKTogIERFRkZVTkMncwotCSogc3RyZXJyb3IuYzogIFJld3JpdGUgZnJvbSBzY3JhdGNoIHRvIHVzZSBzeXNfZXJybGlzdCBvbmx5IGlmCi0JYXZhaWxhYmxlLCBhZGQgZXJybm9fbWF4KCksIGFkZCBzdHJlcnJubygpLCBhZGQgc3RydG9lcnJubygpLAotCWFkZCB0ZXN0IGRyaXZlci4KLQkqIHN0cnNpZ25hbC5jOiAgTmV3IGZpbGUsIHNpZ25hbCBlcXVpdmFsZW50IHRvIHN0cmVycm9yLmMuCi0JVXNlcyBzeXNfc2lnbGlzdCBpZiBhdmFpbGFibGUsIGRlZmluZXMgc2lnbm9fbWF4KCksIHN0cnNpZ25hbCgpLAotCXN0cnNpZ25vKCksIHN0cnRvc2lnbm8oKSwgcHNpZ25hbCgpLCBhbmQgdGVzdCBkcml2ZXIuCi0KLU1vbiBBcHIgMjAgMjA6NDk6MzIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkbyBub3QgcHJpbnQgcmVjdXJzaW9uIGxpbmUuCi0KLQkqIE1ha2VmaWxlLmluOiBhbGxvdyBDRkxBR1MgdG8gYmUgcGFzc2VkIGluIGZyb20gY29tbWFuZCBsaW5lLgotCSAgUmVtb3ZlZCBNSU5VU19HLiAgRGVmYXVsdCBDRkxBR1MgdG8gLWcuCi0KLU1vbiBBcHIgMjAgMTI6NTc6NDYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtYWl4OiAgTmV3LiAgRVhUUkFfT0ZJTEVTIGxpc3RzIGNvcHlzaWduLm8sCi0Jc28gbGliZysrIHVzZXJzIGRvbid0IGhhdmUgdG8gYmUgaW5jb252ZW5pZW5jZWQgYnkgYQotCWxpYmMuYSBidWcgKGxpYmMuYSBuZWVkcyBjb3B5c2lnbiwgYnV0IGRvZXNuJ3QgZGVmaW5lIGl0ISkuCi0JKiBjb25maWd1cmUuaW46ICBVc2UgY29uZmlnL21oLWFpeC4KLQkqIHN0cnRvdWwuYzogIEhhbmRsZSAnLScgYXMgcmVxdWlyZWQgYnkgQU5TSS4KLQlDbGVhbiB1cCByYWRpeCBoYW5kbGluZy4KLQkqIHN0cnN0ci5jOiAgRml4IGJ1Z2d5IGFsZ29yaXRobS4KLQkqIE1ha2VmaWxlLmluOiAgQ2hhbmdlIHNvIHRoYXQgJHtFWFRSQV9PRklMRVN9IGlzCi0JYXBwZW5kZWQgdG8gbmVlZGVkLWxpc3QgKHdoaWNoIGlzIHVzZWQgYnkgbGliZysrKS4KLQotRnJpIEFwciAxMCAyMjo1MTo0MSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIG5ldyBuY3IzMDAwIGNvbmZpZy4KLQkqIGNvbmZpZy9taC1uY3IzMDAwOiAgTmV3IGNvbmZpZyBmaWxlLgotCi1XZWQgQXByICAxIDIzOjMxOjQzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhcmd2LmMsIGR1bW15LmM6ICBMaW50LgotCi1UdWUgTWFyIDMxIDE4OjQ2OjQ0IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc3lzdjQ6ICBOZXcgY29uZmlnIGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfbWFrZWZpbGVfZnJhZyk6ICBTZXQgdG8gY29uZmlnL21oLXN5c3Y0IGZvcgotCWhvc3Rfb3MgPT0gc3lzdjQuCi0JKiBnZXRwYWdlc2l6ZS5jOiAgRm9yIFNWUjQsIHVzZSBzeXNjb25mKF9TQ19QQUdFU0laRSkgdG8gZ2V0Ci0JcGFnZXNpemUuCi0KLVN1biBNYXIgMjkgMTI6MjY6NDIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jOiAgTGludC4KLQotRnJpIE1hciAyNyAwODozMjo1NSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZnVuY3Rpb25zLmRlZiAoYWxsb2NhKTogIEZpeCByZXR1cm4gdHlwZSBhbmQgYXJncyB0byBhdm9pZAotCXR5cGUgY2xhc2ggd2l0aCBnY2MncyBidWlsdGluIGFsbG9jYS4KLQotVHVlIE1hciAyNCAyMzozMzo0MiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWcvbWgtaXJpeDQ6IGlyaXg0IHN1cHBvcnQuCi0KLQkqIE1ha2VmaWxlLmluLCBmdW5jdGlvbnMuZGVmLCBhbGxvY2EuYzogYWRkZWQgYWxsb2NhLgotCi1UdWUgTWFyIDI0IDE3OjM0OjQ2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYyAoQ0FMTF9GUkVFRlVOKTogIE1ha2UgaXQgY29tcGlsZSBvbiBERUNzdGF0aW9ucy4KLQotVGh1IE1hciAxOSAxMzo1Nzo0MiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYXJndi5jOiAgRml4IHZhcmlvdXMgZXh0ZXJuYWwgZnVuY3Rpb24gZGVmaW5pdGlvbnMgdG8gYmUKLQljb3JyZWN0IGluIGFuIEFOU0kgY29tcGlsYXRpb24gZW52aXJvbm1lbnQuCi0KLVNhdCBNYXIgMTQgMTc6Mjg6MTcgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYzogIENoYW5nZXMgdG8gc3VwcG9ydCBjYWxsaW5nIG1tYWxsb2MgZnVuY3Rpb25zLAotCXdoaWNoIHRha2UgYW4gYWRkaXRpb25hbCBhcmd1bWVudCBvdmVyIG1hbGxvYyBmdW5jdGlvbnMuCi0KLUZyaSBNYXIgIDYgMjI6MDE6MTAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGFkZGVkIGNoZWNrIHRhcmdldC4KLQotVGh1IEZlYiAyNyAyMjoxOTozOSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYXJndi5jOiAgI2luY2x1ZGUgYWxsb2NhLWNvbmYuaCAobmVlZGVkIGJ5IEFJWCkuCi0KLVdlZCBGZWIgMjYgMTg6MDQ6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi1TYXQgRmViIDIyIDAxOjA5OjIxIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyZ3YuYzogIENoZWNrIGluIEZyZWQncyB2ZXJzaW9uIHdoaWNoIGZpeGVzIHByb2JsZW1zIHdpdGgKLQlhbGxvY2EoKS4KLQotRnJpIEZlYiAgNyAyMTo0NjowOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBtYWtlZmlsZS5kb3M6ICBSZW1vdmUgTlVMIHRvIGtlZXAgcGF0Y2ggZnJvbSBmYWlsaW5nLgotCi1UaHUgSmFuIDMwIDIyOjQ4OjQxIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jIChfZ2V0b3B0X2ludGVybmFsKTogIEZpeCB1c2FnZSBvZiBlbnVtIGhhc19hcmcuCi0KLU1vbiBKYW4gMjAgMTg6NTM6MjMgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotIAkqIGdldG9wdC5jLCBnZXRvcHQxLmMsIC4uL2luY2x1ZGUvZ2V0b3B0Lmg6ICBHZXQgbGF0ZXN0IHZlcnNpb25zLgotCi1TYXQgSmFuIDE4IDE2OjUzOjAxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBhcmd2LmM6ICBOZXcgZmlsZSB0byBidWlsZCBhbmQgZGVzdHJveSBzdGFuZGFyZCBhcmd1bWVudAotCXZlY3RvcnMgZnJvbSBhIGNvbW1hbmQgc3RyaW5nLgotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBhcmd2LmMgYW5kIGFyZ3YubyB0byBhcHByb3ByaWF0ZSBtYWNyb3MuCi0KLUZyaSBEZWMgMjAgMTI6MTI6NTcgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIENoYW5nZSBzdnI0IHJlZmVyZW5jZXMgdG8gc3lzdjQuCi0KLQkqIHJpbmRleC5jOiAgRGVjbGFyZSByZXR1cm4gdHlwZSBvZiBleHRlcm5hbGx5IHVzZWQgZnVuY3Rpb24KLQlzdHJyY2hyKCkuCi0KLVRodSBEZWMgMTkgMTg6MzU6MDMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlICIqKioiIGluIG5vcm1hbCBvdXRwdXQsIHNpbmNlIE1ha2UgcHJvZHVjZXMKLQl0aGlzIG9uIGVycm9ycywgYW5kIGl0J3MgY29udmVuaWVudCB0byBzZWFyY2ggZm9yLgotCi1UdWUgRGVjIDE3IDIzOjIxOjMwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBtZW1jbXAuYywgbWVtY3B5LmMsIG1lbW1vdmUuYywgbWVtc2V0LmMsIHN0cmNoci5jLCBzdHJyY2hyLmM6Ci0JTmV3IEFOU0kgZnVuY3Rpb25zLiAgVGhlIG9sZCBub24tQU5TSSBmdW5jdGlvbnMgKHN1Y2ggYXMgYmNvcHkpCi0Jc2hvdWxkIGJlIGF2b2lkZWQuCi0JKiBiY29weS5jOiAgRml4IHRvIGNvcnJlY3RseSBoYW5kbGUgb3ZlcmxhcHBpbmcgcmVnaW9ucy4KLQkqIGluZGV4LmMsIHJpbmRleC5jOiAgUmUtd3JpdGUgaW4gdGVybXMgb2Ygc3RyY2hyKCkgYW5kIHN0cnJjaHIoKS4KLQkqIGZ1bmN0aW9ucy5kZWY6ICBBZGQgdGhlIG5ldyBmdW5jdGlvbnMuCi0JKiBmdW5jdGlvbnMuZGVmOiAgQWRkIDR0aCBwYXJhbWV0ZXIgdG8gREVGIG1hY3JvLAotCWFuIGFuc2lkZWNsLmgtc3R5bGUgcHJvdG90eXBlLgotCSogZHVtbXkuYzogIFVzZSBleHBhbmRlZCBERUYgbWFjcm8gdG8gY3JlYXRlIGEgZHVtbXkgZnVuY3Rpb24KLQljYWxsLCB3aXRoIGNvcnJlY3QgcGFyYW1ldGVyIHR5cGVzLiAgKFRoaXMgYXZvaWRzIHNvbWUKLQljb21wbGFpbnRzIGZyb20gZ2NjIGFib3V0IHByZWRlZmluZWQgYnVpbHRpbnMuKQotCi0JTW92ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjb25maWcvbWgtZGVmYXVsdCBpbnRvIE1ha2VmaWxlLmluLgotCVRoaXMgYXZvaWQgZHVwbGljYXRpb24sIGFuZCBzaW1wbGlmaWVzIHRoaW5ncyBzbGlnaHRseS4KLQkqIE1ha2VmaWxlLmluOiAgVHdlYWsgc28gd2UgZG9uJ3QgbmVlZCBjb25maWcvbWgtZGVmYXVsdC4KLQkqIFJFQURNRTogIFVwZGF0ZS4KLQkqIGNvbmZpZ3VyZS5pbjogIE5vIGxvbmdlciBuZWVkIGNvbmZpZy9taC1kZWZhdWx0LgotCSogY29uZmlnL21oLWRlZmF1bHQ6ICBEZWxldGVkLgotCSogY29uZmlnL21oLXN5c3Y6ICBSZW1vdmUgbGluZXMgY29waWVkIGZyb20gb2xkIG1oLWRlZmF1bHQuCi0KLVR1ZSBEZWMgMTcgMDU6NDY6NDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGZkbWF0Y2guYyAoZmRtYXRjaCk6ICBEb24ndCBjb21wYXJlIHN0X3JkZXYsIHdoaWNoIGlzIGZvcgotCSdta25vZCcgZGV2aWNlIG51bWJlcnMuCi0KLU1vbiBEZWMgMTYgMTI6MjU6MzQgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGZkbWF0Y2guYywgTWFrZWZpbGUuaW46ICBBZGQgbmV3IGZ1bmN0aW9uIHRoYXQgdGFrZXMgdHdvCi0Jb3BlbiBmaWxlIGRlc2NyaXB0b3JzIGFuZCByZXR1cm5zIG5vbnplcm8gaWYgdGhleSByZWZlciB0bwotCXRoZSBzYW1lIGZpbGUsIHplcm8gb3RoZXJ3aXNlLiAgKHVzZWQgaW4gZ2RiKQotCi1XZWQgRGVjIDExIDE3OjQwOjM5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCUZyb20gREo6Ci0JKiBtc2Rvcy5jOiBzdHViIGZ1bmN0aW9ucyBmb3IgZG9zLgotCSogbWFrZWZpbGUuZG9zLCBjb25maWdkai5iYXQ6IG5ldy4KLQkqIGdldG9wdC5jOiBEb24ndCBpbmNsdWRlIGFsbG9jYS1jb25mLmggaW4gYSBHTzMyIHdvcmxkLgotCi0KLVR1ZSBEZWMgMTAgMDQ6MTQ6NDkgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0KLUZyaSBEZWMgIDYgMjM6MjY6NDUgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIHNwYWNlcyBmb2xsb3dpbmcgaHlwaGVucyBiZWNhdXNlIGJzZCBtYWtlCi0JICBjYW4ndCBjb3BlLiAgYWRkZWQgc3RhbmRhcmRzLnRleHQgc3VwcG9ydC4gIGluc3RhbGwgdXNpbmcKLQkgIElOU1RBTExfREFUQS4KLQotCSogY29uZmlndXJlLmluOiByZW1vdmUgY29tbW9udGFyZ2V0cyBhcyBpdCBpcyBubyBsb25nZXIgYQotCSAgcmVjb2duaXplZCBob29rLgotCi1UaHUgRGVjICA1IDIyOjQ2OjQ2IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cwotCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgotCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KLQotRnJpIE5vdiAyMiAxOToxNToyOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBmaW5kLW5lZWRlZC5hd2sgZG9lcyBub3QgZml0IGluIDE0IGNoYXJzLgotCi0JKiBNYWtlZmlsZS5pbjogIFN1cHByZXNzIGVycm9yIGNoZWNraW5nIHdoZW4gY29tcGlsaW5nIHRoZSB0ZXN0Ci0JcHJvZ3JhbSwgYmVjYXVzZSBVbHRyaXggbWFrZS9zaCBhYm9ydHMgdGhlcmUgZHVlIHRvIGEgYnVnLgotCi1GcmkgTm92IDIyIDEyOjIzOjE3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFJlLWRpZCBob3cgRVhUUkFfT0ZJTEVTIGlzIHVzZWQgdG8gYmUgbW9yZSB1c2VmdWwuCi0JKiBSRUFETUU6ICBFeHBsYWluZWQgaG93IHRoZSBhdXRvLWNvbmZpZ3VyYXRpb24gd29ya3MsCi0JYW5kIGhvdyB0byBhZGQgbmV3IGZpbGVzIGFuZC9vciBjb25maWd1cmF0aW9ucy4KLQotRnJpIE5vdiAyMiAwOTo0NToyMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RydG91bC5jOiAgQXZvaWQgZGVmaW5pbmcgVUxPTkdfTUFYIGlmIGFscmVhZHkgZGVmaW5lZDsKLQljYXN0IGEgY29uc3QgY2hhciAqIHRvIGNoYXIgKiBmb3IgcGVkYW50cy4KLQotCSogZ2V0b3B0LmM6ICBPbmx5IGRlZmluZSAiY29uc3QiIGFmdGVyIGxvY2FsIGluY2x1ZGUgZmlsZXMgZ2V0IHRvLAotCWFuZCBvbmx5IGlmIHRoZXkgaGF2ZW4ndCBkZWZpbmVkIGl0LgotCi1UaHUgTm92IDIxIDE2OjU4OjUzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBnZXRjd2QuYyAocmVtb3ZlIGdldHdkLmMpOiBHTlUgY29kZSBzaG91bGQgY2FsbCBnZXRjd2QoKS4gIFdlCi0JZW11bGF0ZSBpdCB3aXRoIGdldHdkKCkgaWYgYXZhaWxhYmxlLiAgVGhpcyBhdm9pZHMgY2FsbGVycyBoYXZpbmcKLQl0byBmaW5kIGEgTUFYUEFUSExFTiBvciBQQVRIX01BWCB2YWx1ZSBmcm9tIHNvbWV3aGVyZS4KLQkqIE1ha2VmaWxlLmluLCBmdW5jdGlvbnMuZGVmOiAgZ2V0d2QtPmdldGN3ZC4KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBnZW5lcmljIGNhc2UgZm9yIGV2ZXJ5IHN5c3RlbS4KLQkqIGNvbmZpZy9taC17ZGVsdGE4OCxtYWNoLHJzNjAwMCxzdnI0fTogIFJlbW92ZS4KLQkqIGNvbmZpZy9taC1zeXN2OiAgVXNlIGRlZmF1bHQgaGFuZGxpbmcsIGp1c3QgYWRkIC1EVVNHLgotCi1UaHUgTm92IDE0IDEwOjU4OjA1IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnL21oLWRlZmF1bHQ6IFJlLWRvIG1ha2UgbWFnaWMKLQlzbyB0aGF0IGZvciB0aGUgZGVmYXVsdCAoImF1dG9tYXRpYyIpIG1vZGUgd2Ugb25seQotCWNvbXBpbGUgdGhlIGZpbGVzIHdlIGFjdHVhbGx5IG5lZWQuICBEbyB0aGlzIHVzaW5nCi0JYSByZWN1cnNpdmUgbWFrZTogIFRoZSB0b3AtbGV2ZWwgZ2VuZXJhdGVzIHRoZSBsaXN0Ci0Jb2YgbmVlZGVkIGZpbGVzIChsb29zZWx5LCB0aGUgb25lcyBtaXNzaW5nIGluIGxpYmMpLAotCWFuZCB0aGVuIHBhc3NlcyB0aGF0IGxpc3QgdG8gdGhlIHJlY3Vyc2l2ZSBtYWtlLgotCSogY29uZmlnL21oLW1hY2g6ICBSZW1vdmUgb2Jzb2xldGUgU1RSRVJST1Ite0MsT30gbWFjcm9zLgotCi1UdWUgTm92IDEyIDE5OjEwOjU3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JUlMvNjAwMCBob3N0IHN1cHBvcnQgKGdydW1ibGUpLgotCi0JKiBjb25maWd1cmUuaW46ICBCdWlsZCBhbGxvY2EtY29uZi5oIGZpbGUgZnJvbSBhbGxvY2Etbm9ybS5oCi0JKGV2ZXJ5dGhpbmcgZWxzZSkgb3IgYWxsb2NhLWJvdGNoLmggKHJzLzYwMDApLgotCSogTWFrZWZpbGUuaW46ICBJbmNsdWRlIC4gb24gdGhlIGluY2x1ZGUgcGF0aC4KLQkqIGdldG9wdC5jOiAgVXNlIGFsbG9jYS1jb25mLmguCi0JKiBhbGxvY2Etbm9ybS5oOiAgSG93IHRvIGRlY2xhcmUgYWxsb2NhIG9uIHJlYXNvbmFibGUgbWFjaGluZXMuCi0JKiBhbGxvY2EtYm90Y2guaDogSG93IHRvIGRlY2xhcmUgYWxsb2NhIG9uIGJyYWluZGVhZCBtYWNoaW5lcy4KLQotVHVlIE5vdiAxMiAwOToyMTo0OCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uY2F0LmMgOiAgTmV3IGZpbGUsIGxpa2UgY29uY2F0KCkgaW4gZ2RiIGJ1dCBjYW4gdGFrZSBhCi0JdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyByYXRoZXIgdGhhbiBmaXhlZCBhdCAzIGFyZ3MuICBGb3IKLQlub3csIGNsaWVudCBhcHBsaWNhdGlvbnMgbXVzdCBzdXBwbHkgYW4geG1hbGxvYygpLCB3aGljaCBpcyBhCi0JZnJvbnQgZW5kIGZ1bmN0aW9uIHRvIG1hbGxvYygpIHRoYXQgZGVhbHMgd2l0aCBvdXQtb2YtbWVtb3J5Ci0JY29uZGl0aW9ucy4KLQotCSogTWFrZWZpbGUuaW46ICBBZGQgY29uY2F0LmMgYW5kIGNvbmNhdC5vIHRvIGFwcHJvcHJpYXRlIG1hY3Jvcy4KLQotU2F0IE5vdiAgOSAxMzoyOTo1OSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXN2cjQ6ICBBZGQgc2lnc2V0bWFzayB0byBsaXN0IG9mIHJlcXVpcmVkIGZ1bmN0aW9ucy4KLQotU3VuIE5vdiAgMyAxMTo1Nzo1NiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogdnNwcmludGYuYzogIE5ldyBmaWxlLgotCSogZnVuY3Rpb25zLmRlZiwgTWFrZWZpbGUuaW46ICBBZGQgdnNwcmludGYuCi0KLVN1biBPY3QgMjcgMTY6MzE6MjIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL21oLXJzNjAwMDogIEFkZCBycy82MDAwIGhvc3Qgc3VwcG9ydC4KLQkqIE1ha2VmaWxlLmluOiAgQ29tcGlsZSB3aXRoIGRlYnVnIGluZm8uCi0KLUZyaSBPY3QgMjUgMTc6MDE6MTIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW4sIGFuZCBuZXcgZmlsZXM6IGR1bW15LmMsIGZ1bmN0aW9ucy5kZWYsCi0JY29uZmlnL21mLWRlZmF1bHQ6ICBBZGRlZCBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiBtb2RlLAotCXdoaWNoIGluY2x1ZGVzIGludG8gbGliaWJlcnR5LmEgZnVuY3Rpb25zIHRoYXQgYXJlICJtaXNzaW5nIiBpbiBsaWJjLgotCSogc3RyZHVwLmMsIHZwcmludGYuYywgdmZwcmludGYuYzogTmV3IGZpbGVzLgotCi1UaHUgT2N0IDI0IDAyOjI5OjI2IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvaG1ha2Utc3ZyNDogTmV3IGZpbGUuCi0KLQkqIGNvbmZpZy9obWFrZS1zeXN2OiBBZGQgSE9TVF9DRklMRVMgYW5kIEhPU1RfT0ZJTEVTLgotCi0JKiBiYXNlbmFtZS5jLCBiY21wLmMsIGJjb3B5LmMsIGJ6ZXJvLmMsIGdldHBhZ2VzaXplLmMgZ2V0d2QuYywKLQlpbmRleC5jLCBpbnNxdWUuYywgcmluZGV4LmMsIHNwYWNlcy5jLCBzdHJzdHIuYywgdmZvcmsuYzogTmV3Ci0JZmlsZXMgY29udGFpbmluZyBlaXRoZXIgcG9ydGFibGUgQyB2ZXJzaW9ucyBvciBlbXVsYXRpb25zIHVzaW5nCi0JbmF0aXZlIGxpYnJhcnkgY2FsbHMuCi0KLQkqIHN0cmVycm9yLmM6ICBBZGQgY29weXJpZ2h0LCBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLCBldGMuCi0KLQkqIHN0cnRvbC5jOiAgUmVwbGFjZSBoYXJkd2lyZWQgaGV4IGNvbnN0YW50cyB3aXRoIHNvbWUgbW9yZQotCXBvcnRhYmxlIG1hY3Jvcy4gIFJlbW92ZSBpbGxlZ2FsIChhY2NvcmRpbmcgdG8gZ2NjKSBjYXN0LgotCi0JKiBzdHJ0b3VsLmM6IFJlcGxhY2UgaGFyZHdpcmVkIGhleCBjb25zdGFudCB3aXRoIG1vcmUgcG9ydGFibGUKLQltYWNyby4KLQotCSogTWFrZWZpbGUuaW46IE1vdmUgVEFSR0VUTElCIGFuZCBDRkxBR1Mgd2hlcmUgbWFrZWZpbGUgZnJhZ21lbnRzCi0JY2FuIG92ZXJyaWRlIHRoZW0uICBBZGQgbmV3IHNvdXJjZSBhbmQgb2JqZWN0IGZpbGUgbmFtZXMgdG8gQ0ZJTEVTCi0JYW5kIE9GSUxFUyByZXNwZWN0aXZlbHkuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIFNWUjQgbWFrZWZpbGUgZnJhZ21lbnRzLgotCi1UdWUgT2N0IDIyIDE5OjAwOjIzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IE1vdmUgUkFOTElCLCBBUiBhbmQgQVJfRkxBR1MgdG8gd2hlcmUgdGhleSBjYW4gYmUKLQlvdmVyLXJpZGRlbiBieSBjb25maWcvaG1ha2UtKgotCSogY29uZmlndXJlLmluOiBhZGRlZCBtODhrY3ZzIHRvIHN5c3YgbGlzdAotCi1GcmkgT2N0ICA0IDAxOjI5OjA4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIE1vc3QgaG9zdHMgbmVlZCBzdHJlcnJvciwgYnV0IG9uZSBvciB0d28gZG9uJ3QsCi0JYW5kIHRoZXkgb3ZlcnJpZGUgdGhlc2UgZGVmaW5pdGlvbnMgaW4gdGhlIGhvc3QtZGVwZW5kZW50IG1ha2VmaWxlCi0JZnJhZ21lbnQuCi0JKiBjb25maWcvaG1ha2UtbWFjaDogIFRoZSBvZGQgbWFuIG91dCBvbiBzdHJlcnJvciAtLSBpdCdzIHN1cHBsaWVkLgotCSogc3RyZXJyb3IuYzogIE5ldyBmaWxlLgotCi0JKiBzdHJ0b2wuYywgc3RydG91bC5jOiAgQWRkIHN0cnRvbCB0byBsaWJpYmVydHksIHNpbmNlIE1hY2ggbGFja3MKLQlpdCBhbmQgYmZkIHVzZXMgaXQuCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluLCBjb25maWcvaG1ha2UtbWFjaDogIE9ubHkgY29uZmlndXJlCi0Jc3RydG9sICYgc3Ryb3RvdWwgaW4gb24gTWFjaC4KLQotVHVlIFNlcCAgMyAwNjozNjoyMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYzogIE1lcmdlIHdpdGggbGF0ZXN0IEZTRiB2ZXJzaW9uLgotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9saWJpYmVydHkvTWFrZWZpbGUuaW4gYi9saWJpYmVydHkvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNjg5YmEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0jICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLSMgTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSMgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBMaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0jIExpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLSMgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotIyBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLQotIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgSy4gUmljaGFyZCBQaXhsZXkgPHJpY2hAY3lnbnVzLmNvbT4uCi0KLSMKLSMgTWFrZWZpbGUgZm9yIGxpYmliZXJ0eSBkaXJlY3RvcnkKLSMKLQotc3JjZGlyID0gQHNyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotcHJlZml4ID0gQHByZWZpeEAKLQotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1iaW5kaXIgPSBAYmluZGlyQAotbGliZGlyID0gQGxpYmRpckAKLQotU0hFTEwgPSBAU0hFTExACi0KLSMgTXVsdGlsaWIgc3VwcG9ydCB2YXJpYWJsZXMuCi1NVUxUSVNSQ1RPUCA9Ci1NVUxUSUJVSUxEVE9QID0KLU1VTFRJRElSUyA9Ci1NVUxUSVNVQkRJUiA9Ci1NVUxUSURPID0gdHJ1ZQotTVVMVElDTEVBTiA9IHRydWUKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi0KLUFSID0gQEFSQAotQVJfRkxBR1MgPSByYwotCi1DQyA9IEBDQ0AKLUNGTEFHUyA9IEBDRkxBR1NACi1MSUJDRkxBR1MgPSAkKENGTEFHUykKLVJBTkxJQiA9IEBSQU5MSUJACi0KLVBJQ0ZMQUcgPQotCi1NQUtFT1ZFUlJJREVTID0KLQotVEFSR0VUTElCID0gbGliaWJlcnR5LmEKLQotTElCT0JKUyA9IEBMSUJPQkpTQAotQUxMT0NBID0gQEFMTE9DQUAKLQotIyBBIGNvbmZpZ3VyYXRpb24gY2FuIHNwZWNpZnkgZXh0cmEgLm8gZmlsZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQsCi0jIGV2ZW4gaWYgdGhleSBhcmUgaW4gbGliYy4gKFBlcmhhcHMgdGhlIGxpYmMgdmVyc2lvbiBpcyBidWdneS4pCi1FWFRSQV9PRklMRVMgPSAKLQotIyBGbGFncyB0byBwYXNzIHRvIGEgcmVjdXJzaXZlIG1ha2UuCi1GTEFHU19UT19QQVNTID0gXAotCSJBUj0kKEFSKSIgXAotCSJBUl9GTEFHUz0kKEFSX0ZMQUdTKSIgXAotCSJDQz0kKENDKSIgXAotCSJDRkxBR1M9JChDRkxBR1MpIiBcCi0JIkxJQkNGTEFHUz0kKExJQkNGTEFHUykiIFwKLQkiRVhUUkFfT0ZJTEVTPSQoRVhUUkFfT0ZJTEVTKSIgXAotCSJIREVGSU5FUz0kKEhERUZJTkVTKSIgXAotCSJJTlNUQUxMPSQoSU5TVEFMTCkiIFwKLQkiSU5TVEFMTF9EQVRBPSQoSU5TVEFMTF9EQVRBKSIgXAotCSJJTlNUQUxMX1BST0dSQU09JChJTlNUQUxMX1BST0dSQU0pIiBcCi0JIkxERkxBR1M9JChMREZMQUdTKSIgXAotCSJMT0FETElCRVM9JChMT0FETElCRVMpIiBcCi0JIlJBTkxJQj0kKFJBTkxJQikiIFwKLQkiU0hFTEw9JChTSEVMTCkiCi0KLWFsbDogc3RhbXAtcGljZGlyICQoVEFSR0VUTElCKSBuZWVkZWQtbGlzdCByZXF1aXJlZC1saXN0Ci0JQCQoTVVMVElETykgJChGTEFHU19UT19QQVNTKSBtdWx0aS1kbyBETz1hbGwKLQotLlBIT05ZOiBjaGVjayBpbnN0YWxsY2hlY2sKLWNoZWNrIGluc3RhbGxjaGVjazoKLQotQGhvc3RfbWFrZWZpbGVfZnJhZ0AKLQotSU5DRElSPSQoc3JjZGlyKS8kKE1VTFRJU1JDVE9QKS4uL2luY2x1ZGUKLQotQ09NUElMRS5jID0gJChDQykgLWMgQERFRlNAICQoTElCQ0ZMQUdTKSAtSS4gLUkkKElOQ0RJUikgJChIREVGSU5FUykKLS5jLm86Ci0JdGVzdCB4IiQoZW5hYmxlX3NoYXJlZCkiICE9IHh5ZXMgfHwgXAotCSAgJChDT01QSUxFLmMpICQoUElDRkxBRykgJDwgLW8gcGljLyRACi0JJChDT01QSUxFLmMpICQ8Ci0KLWluZm8gaW5zdGFsbC1pbmZvIGNsZWFuLWluZm8gZHZpOgotCi0jIEluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgaW4gdGhpcyBkaXJlY3RvcnkuCi1IRklMRVMgPSBhbGxvY2EtY29uZi5oCi0KLSMgTk9URTogSWYgeW91IGFkZCBuZXcgZmlsZXMgdG8gdGhlIGxpYnJhcnksIGFkZCB0aGVtIHRvIHRoaXMgbGlzdAotIyAoYWxwaGFiZXRpY2FsKSwgYW5kIGFkZCB0aGVtIHRvIFJFUVVJUkVEX09GSUxFUyBvciBmdW5jcyBpbgotIyBjb25maWd1cmUuaW4uCi1DRklMRVMgPSBhc3ByaW50Zi5jIGFsbG9jYS5jIGFyZ3YuYyBhdGV4aXQuYyBiYXNlbmFtZS5jIGJjbXAuYyBiY29weS5jIFwKLQliemVyby5jIGNob29zZS10ZW1wLmMgY2xvY2suYyBjb25jYXQuYyBjcGx1cy1kZW0uYyBmZG1hdGNoLmMgXAotCWZubWF0Y2guYyBnZXRjd2QuYyBnZXRvcHQuYyBnZXRvcHQxLmMgZ2V0cGFnZXNpemUuYyBcCi0JZ2V0cnVudGltZS5jIGZsb2F0Zm9ybWF0LmMgaGV4LmMgaW5kZXguYyBpbnNxdWUuYyBtZW1jaHIuYyBcCi0JbWVtY21wLmMgbWVtY3B5LmMgbWVtbW92ZS5jIG1lbXNldC5jIG1rc3RlbXBzLmMgb2JqYWxsb2MuYyBvYnN0YWNrLmMgXAotCXBleGVjdXRlLmMgcmFuZG9tLmMgcmVuYW1lLmMgcmluZGV4LmMgc2lnc2V0bWFzay5jIHNwYWNlcy5jIFwKLQlzcGxheS10cmVlLmMgc3RyY2FzZWNtcC5jIHN0cm5jYXNlY21wLmMgc3RyY2hyLmMgc3RyZHVwLmMgc3RyZXJyb3IuYyBcCi0Jc3RycmNoci5jIHN0cnNpZ25hbC5jIHN0cnN0ci5jIHN0cnRvZC5jIHN0cnRvbC5jIHN0cnRvdWwuYyBcCi0JdG1wbmFtLmMgdmFzcHJpbnRmLmMgdmZvcmsuYyB2ZnByaW50Zi5jIHZwcmludGYuYyB2c3ByaW50Zi5jIFwKLQl3YWl0cGlkLmMgeGF0ZXhpdC5jIHhleGl0LmMgeG1hbGxvYy5jIHhzdHJkdXAuYyB4c3RyZXJyb3IuYwotCi0jIFRoZXNlIGFyZSBhbHdheXMgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkuCi1SRVFVSVJFRF9PRklMRVMgPSBhcmd2Lm8gY2hvb3NlLXRlbXAubyBjb25jYXQubyBjcGx1cy1kZW0ubyBcCi0gIGZkbWF0Y2gubyBmbm1hdGNoLm8gZ2V0b3B0Lm8gZ2V0b3B0MS5vIGdldHJ1bnRpbWUubyBoZXgubyBcCi0gIGZsb2F0Zm9ybWF0Lm8gb2JqYWxsb2MubyBvYnN0YWNrLm8gcGV4ZWN1dGUubyBzcGFjZXMubyBcCi0gIHNwbGF5LXRyZWUubyBzdHJlcnJvci5vIHN0cnNpZ25hbC5vIHhhdGV4aXQubyB4ZXhpdC5vIHhtYWxsb2MubyBcCi0gIHhzdHJkdXAubyB4c3RyZXJyb3IubwotCi0kKFRBUkdFVExJQik6ICQoUkVRVUlSRURfT0ZJTEVTKSAkKEVYVFJBX09GSUxFUykgJChMSUJPQkpTKSAkKEFMTE9DQSkKLQlybSAtZiAkKFRBUkdFVExJQikKLQkkKEFSKSAkKEFSX0ZMQUdTKSAkKFRBUkdFVExJQikgXAotCSAgJChSRVFVSVJFRF9PRklMRVMpICQoRVhUUkFfT0ZJTEVTKSAkKExJQk9CSlMpICQoQUxMT0NBKQotCSQoUkFOTElCKSAkKFRBUkdFVExJQikKLQotSU5TVEFMTF9ERVNUID0gQElOU1RBTExfREVTVEAKLWluc3RhbGw6IGluc3RhbGxfdG9fJChJTlNUQUxMX0RFU1QpCi0KLWluc3RhbGxfdG9fbGliZGlyOiBhbGwKLQkkKElOU1RBTExfREFUQSkgJChUQVJHRVRMSUIpICQobGliZGlyKSQoTVVMVElTVUJESVIpLyQoVEFSR0VUTElCKS5uCi0JKCBjZCAkKGxpYmRpcikkKE1VTFRJU1VCRElSKSA7ICQoUkFOTElCKSAkKFRBUkdFVExJQikubiApCi0JbXYgLWYgJChsaWJkaXIpJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpLm4gJChsaWJkaXIpJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpCi0JQCQoTVVMVElETykgJChGTEFHU19UT19QQVNTKSBtdWx0aS1kbyBETz1pbnN0YWxsCi0KLWluc3RhbGxfdG9fdG9vbGRpcjogYWxsCi0JJChJTlNUQUxMX0RBVEEpICQoVEFSR0VUTElCKSAkKHRvb2xkaXIpL2xpYiQoTVVMVElTVUJESVIpLyQoVEFSR0VUTElCKS5uCi0JKCBjZCAkKHRvb2xkaXIpL2xpYiQoTVVMVElTVUJESVIpIDsgJChSQU5MSUIpICQoVEFSR0VUTElCKS5uICkKLQltdiAtZiAkKHRvb2xkaXIpL2xpYiQoTVVMVElTVUJESVIpLyQoVEFSR0VUTElCKS5uICQodG9vbGRpcikvbGliJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpCi0JQCQoTVVMVElETykgJChGTEFHU19UT19QQVNTKSBtdWx0aS1kbyBETz1pbnN0YWxsCi0KLSMgbmVlZGVkLWxpc3QgaXMgdXNlZCBieSBsaWJzdGRjKysuCi1uZWVkZWQtbGlzdDogTWFrZWZpbGUKLQlmPSIkKExJQk9CSlMpICQoQUxMT0NBKSAkKEVYVFJBX09GSUxFUykiOyBcCi0JY2FzZSAkJGYgaW4gXAotCSAgKmFsbG9jYS5vKikgZj0iJCRmIHhtYWxsb2MubyB4ZXhpdC5vIiA7OyBcCi0JZXNhYzsgXAotCWVjaG8gJCRmID4gbmVlZGVkLWxpc3QKLQotIyByZXF1aXJlZC1saXN0IHdhcyB1c2VkIHdoZW4gYnVpbGRpbmcgYSBzaGFyZWQgYmZkL29wY29kZXMvbGliaWJlcnR5Ci0jIGxpYnJhcnkuICBJIGRvbid0IGtub3cgaWYgaXQgdXNlZCBieSBhbnl0aGluZyBjdXJyZW50bHkuCi1yZXF1aXJlZC1saXN0OiBNYWtlZmlsZQotCWVjaG8gJChSRVFVSVJFRF9PRklMRVMpID4gcmVxdWlyZWQtbGlzdAotCi1zdGFtcC1waWNkaXI6Ci0JaWYgWyB4IiQoZW5hYmxlX3NoYXJlZCkiID0geHllcyBdICYmIFsgISAtZCBwaWMgXTsgdGhlbiBcCi0JICBta2RpciBwaWM7IFwKLQllbHNlIHRydWU7IGZpCi0JdG91Y2ggc3RhbXAtcGljZGlyCi0KLS5QSE9OWTogYWxsIGV0YWdzIHRhZ3MgbHMgY2xlYW4gc3RhZ2UxIHN0YWdlMgotCi1ldGFncyB0YWdzOiBUQUdTCi0KLVRBR1M6ICQoQ0ZJTEVTKSAkKEhGSUxFUykKLQlldGFncyBgZm9yIGkgaW4gJChIRklMRVMpICQoQ0ZJTEVTKTsgZG8gZWNobyAkKHNyY2RpcikvJCRpIDsgZG9uZWAKLQotIyBUaGUgc3RhbmRhbG9uZSBkZW1hbmdsZXIgKGMrK2ZpbHQpIGhhcyBiZWVuIG1vdmVkIHRvIGJpbnV0aWxzLgotZGVtYW5nbGU6Ci0JQGVjaG8gIlRoZSBzdGFuZGFsb25lIGRlbWFuZ2xlciwgbm93IG5hbWVkIGMrK2ZpbHQsIGlzIG5vdyIKLQlAZWNobyAiYSBwYXJ0IG9mIGJpbnV0aWxzLiIKLQlAZmFsc2UKLQotbHM6Ci0JQGVjaG8gTWFrZWZpbGUgJChIRklMRVMpICQoQ0ZJTEVTKQotCi0jIE5lZWQgdG8gZGVhbCB3aXRoIHByb2ZpbGVkIGxpYnJhcmllcywgdG9vLgotCi1tb3N0bHljbGVhbjoKLQlybSAtcmYgKi5vIHBpYyBjb3JlIGVycnMgXCMqICouRSBhLm91dAotCXJtIC1mIG5lZWRlZC5hd2sgbmVlZGVkMi5hd2sgZXJyb3JzIGR1bW15IG5lZWRlZC1saXN0IGNvbmZpZy5oIHN0YW1wLSoKLQlybSAtZiAkKENPTkZJR19IKSAkKE5FRURFRF9MSVNUKSBzdGFtcC1waWNkaXIKLQlAJChNVUxUSUNMRUFOKSBtdWx0aS1jbGVhbiBETz1tb3N0bHljbGVhbgotY2xlYW46IG1vc3RseWNsZWFuCi0Jcm0gLWYgKi5hIHJlcXVpcmVkLWxpc3QgdG1wbXVsdGkub3V0Ci0JQCQoTVVMVElDTEVBTikgbXVsdGktY2xlYW4gRE89Y2xlYW4KLWRpc3RjbGVhbjogY2xlYW4KLQlAJChNVUxUSUNMRUFOKSBtdWx0aS1jbGVhbiBETz1kaXN0Y2xlYW4KLQlybSAtZiAqfiBNYWtlZmlsZSBjb25maWcuc3RhdHVzIHhob3N0LW1rZnJhZyBUQUdTIG11bHRpbGliLm91dAotCXJtIC1mIGNvbmZpZy5sb2cKLW1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuOiBkaXN0Y2xlYW4KLQotZm9yY2U6Ci0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cwotCUNPTkZJR19GSUxFUz1NYWtlZmlsZSBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLWNvbmZpZy5oOiBzdGFtcC1oIDsgQHRydWUKLXN0YW1wLWg6IGNvbmZpZy5pbiBjb25maWcuc3RhdHVzCi0JQ09ORklHX0ZJTEVTPSBDT05GSUdfSEVBREVSUz1jb25maWcuaDpjb25maWcuaW4gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpL2NvbmZpZy50YWJsZQotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotJChSRVFVSVJFRF9PRklMRVMpICQoRVhUUkFfT0ZJTEVTKSAkKExJQk9CSlMpICQoQUxMT0NBKTogc3RhbXAtcGljZGlyCi0KLWFsbG9jYS5vOiBjb25maWcuaAotYXRleGl0Lm86IGNvbmZpZy5oCi1hcmd2Lm86IGNvbmZpZy5oIGFsbG9jYS1jb25mLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1iYXNlbmFtZS5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWNob29zZS10ZW1wLm86IGNvbmZpZy5oCi1jbG9jay5vOiBjb25maWcuaAotY29uY2F0Lm86ICQoSU5DRElSKS9saWJpYmVydHkuaAotY3BsdXMtZGVtLm86IGNvbmZpZy5oICQoSU5DRElSKS9kZW1hbmdsZS5oCi1mZG1hdGNoLm86ICQoSU5DRElSKS9saWJpYmVydHkuaAotZm5tYXRjaC5vOiBjb25maWcuaCAkKElOQ0RJUikvZm5tYXRjaC5oCi1nZXRjd2QubzogY29uZmlnLmgKLWdldG9wdC5vOiBjb25maWcuaCAkKElOQ0RJUikvZ2V0b3B0LmgKLWdldG9wdDEubzogY29uZmlnLmggJChJTkNESVIpL2dldG9wdC5oCi1nZXRwYWdlc2l6ZS5vOiBjb25maWcuaAotZ2V0cnVudGltZS5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWhleC5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWZsb2F0Zm9ybWF0Lm86ICQoSU5DRElSKS9mbG9hdGZvcm1hdC5oCi1ta3N0ZW1wcy5vOiBjb25maWcuaAotb2JqYWxsb2MubzogJChJTkNESVIpL29iamFsbG9jLmgKLW9ic3RhY2subzogY29uZmlnLmggJChJTkNESVIpL29ic3RhY2suaAotcGV4ZWN1dGUubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zcGFjZXMubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zcGxheS10cmVlLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvc3BsYXktdHJlZS5oICQoSU5DRElSKS9hbnNpZGVjbC5oCi1zdHJlcnJvci5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXN0cnNpZ25hbC5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXhhdGV4aXQubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCi14ZXhpdC5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXhtYWxsb2MubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCi14c3RyZHVwLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaAoteHN0cmVycm9yLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaApkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L1JFQURNRSBiL2xpYmliZXJ0eS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNTIyNmEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLVRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSAtbGliZXJ0eSBsaWJyYXJ5IG9mIGZyZWUgc29mdHdhcmUuCi1JdCBpcyBhIGNvbGxlY3Rpb24gb2Ygc3Vicm91dGluZXMgdXNlZCBieSB2YXJpb3VzIEdOVSBwcm9ncmFtcy4KLUN1cnJlbnQgbWVtYmVycyBpbmNsdWRlOgotCi0JZ2V0b3B0IC0tIGdldCBvcHRpb25zIGZyb20gY29tbWFuZCBsaW5lCi0Jb2JzdGFjayAtLSBzdGFja3Mgb2YgYXJiaXRyYXJpbHktc2l6ZWQgb2JqZWN0cwotCXN0cmVycm9yIC0tIGVycm9yIG1lc3NhZ2Ugc3RyaW5ncyBjb3JyZXNwb25kaW5nIHRvIGVycm5vCi0Jc3RydG9sIC0tIHN0cmluZy10by1sb25nIGNvbnZlcnNpb24KLQlzdHJ0b3VsIC0tIHN0cmluZy10by11bnNpZ25lZC1sb25nIGNvbnZlcnNpb24KLQotV2UgZXhwZWN0IG1hbnkgb2YgdGhlIEdOVSBzdWJyb3V0aW5lcyB0aGF0IGFyZSBmbG9hdGluZyBhcm91bmQgdG8KLWV2ZW50dWFsbHkgYXJyaXZlIGhlcmUuCi0KLVRoZSBsaWJyYXJ5IG11c3QgYmUgY29uZmlndXJlZCBmcm9tIHRoZSB0b3Agc291cmNlIGRpcmVjdG9yeS4gIERvbid0Ci10cnkgdG8gcnVuIGNvbmZpZ3VyZSBpbiB0aGlzIGRpcmVjdG9yeS4gIEZvbGxvdyB0aGUgY29uZmlndXJhdGlvbgotaW5zdHJ1Y3Rpb25zIGluIC4uL1JFQURNRS4KLQotUGxlYXNlIHJlcG9ydCBidWdzIGFuZCBmaXhlcyB0byAiYnVnLWdudS11dGlsc0BwcmVwLmFpLm1pdC5lZHUiLiAgVGhhbmsgeW91LgotCi1BRERJTkcgQSBORVcgRklMRQotPT09PT09PT09PT09PT09PT0KLQotVGhlcmUgYXJlIHR3byBzZXRzIG9mIGZpbGVzOiAgVGhvc2UgdGhhdCBhcmUgInJlcXVpcmVkIiB3aWxsIGJlCi1pbmNsdWRlZCBpbiB0aGUgbGlicmFyeSBmb3IgYWxsIGNvbmZpZ3VyYXRpb25zLCB3aGlsZSB0aG9zZQotdGhhdCBhcmUgIm9wdGlvbmFsIiB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5IG9ubHkgaWYgIm5lZWRlZC4iCi0KLVRvIGFkZCBhIG5ldyByZXF1aXJlZCBmaWxlLCBlZGl0IE1ha2VmaWxlIHRvIGFkZCB0aGUgc291cmNlIGZpbGUKLW5hbWUgdG8gQ0ZJTEVTIGFuZCB0aGUgb2JqZWN0IGZpbGUgdG8gUkVRVUlSRURfT0ZJTEVTLgotCi1UbyBhZGQgYSBuZXcgb3B0aW9uYWwgZmlsZSwgaXQgbXVzdCBwcm92aWRlIGEgc2luZ2xlIGZ1bmN0aW9uLCBhbmQgdGhlCi1uYW1lIG9mIHRoZSBmdW5jdGlvbiBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotCi0gICAgKiBBZGQgdGhlIHNvdXJjZSBmaWxlIG5hbWUgdG8gQ0ZJTEVTLgotCi0gICAgKiBBZGQgdGhlIGZ1bmN0aW9uIHRvIG5hbWUgdG8gdGhlIGZ1bmNzIHNoZWxsIHZhcmlhYmxlIGluCi0gICAgICBjb25maWd1cmUuaW4uCi0KLSAgICAqIEFkZCB0aGUgZnVuY3Rpb24gdG8gdGhlIEFDX0NIRUNLX0ZVTkNTIGxpc3RzIGp1c3QgYWZ0ZXIgdGhlCi0gICAgICBzZXR0aW5nIG9mIHRoZSBmdW5jcyBzaGVsbCB2YXJpYWJsZS4gIFRoZXNlIEFDX0NIRUNLX0ZVTkNTIGNhbGxzCi0gICAgICBhcmUgbmV2ZXIgZXhlY3V0ZWQ7IHRoZXkgYXJlIHRoZXJlIHRvIG1ha2UgYXV0b2hlYWRlciB3b3JrCi0gICAgICBiZXR0ZXIuCi0KLSAgICAqIENvbnNpZGVyIHRoZSBzcGVjaWFsIGNhc2VzIG9mIGJ1aWxkaW5nIGxpYmliZXJ0eTsgYXMgb2YgdGhpcwotICAgICAgd3JpdGluZywgdGhlIHNwZWNpYWwgY2FzZXMgYXJlIG5ld2xpYiBhbmQgVnhXb3Jrcy4gIElmIGEKLSAgICAgIHBhcnRpY3VsYXIgc3BlY2lhbCBjYXNlIHByb3ZpZGVzIHRoZSBmdW5jdGlvbiwgeW91IGRvIG5vdCBuZWVkCi0gICAgICB0byBkbyBhbnl0aGluZy4gIElmIGl0IGRvZXMgbm90IHByb3ZpZGUgdGhlIGZ1bmN0aW9uLCBhZGQgdGhlCi0gICAgICBvYmplY3QgZmlsZSB0byBMSUJPQkpTLCBhbmQgYWRkIHRoZSBmdW5jdGlvbiBuYW1lIHRvIHRoZSBjYXNlCi0gICAgICBjb250cm9sbGluZyB3aGV0aGVyIHRvIGRlZmluZSBIQVZFX2Z1bmMuCi0KLVRoZSBvcHRpb25hbCBmaWxlIHlvdSd2ZSBhZGRlZCAoZS5nLiBnZXRjd2QuYykgc2hvdWxkIGNvbXBpbGUgYW5kIHdvcmsKLW9uIGFsbCBob3N0cyB3aGVyZSBpdCBpcyBuZWVkZWQuICBJdCBkb2VzIG5vdCBoYXZlIHRvIHdvcmsgb3IgZXZlbgotY29tcGlsZSBvbiBob3N0cyB3aGVyZSBpdCBpcyBub3QgbmVlZGVkLgotCi1BRERJTkcgQSBORVcgQ09ORklHVVJBVElPTgotPT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotT24gbW9zdCBob3N0cyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoZSBzY2hlbWUgZm9yIGF1dG9tYXRpY2FsbHkKLWZpZ3VyaW5nIG91dCB3aGljaCBmaWxlcyBhcmUgbmVlZGVkLiAgSW4gdGhhdCBjYXNlLCB5b3UgcHJvYmFibHkKLWRvbid0IG5lZWQgYSBzcGVjaWFsIE1ha2VmaWxlIHN0dWIgZm9yIHRoYXQgY29uZmlndXJhdGlvbi4KLQotSWYgdGhlIGZ1bGx5IGF1dG9tYXRpYyBzY2hlbWUgZG9lc24ndCB3b3JrLCB5b3UgbWF5IGJlIGFibGUgdG8gZ2V0Ci1ieSB3aXRoIGRlZmluaW5nIEVYVFJBX09GSUxFUyBpbiB5b3VyIE1ha2VmaWxlIHN0dWIuICBUaGlzIGlzCi1hIGxpc3Qgb2Ygb2JqZWN0IGZpbGUgbmFtZXMgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyByZXF1aXJlZAotZm9yIHRoaXMgY29uZmlndXJhdGlvbiAtIHRoZXkgd2lsbCBiZSBpbmNsdWRlZCBpbiBsaWJpYmVydHkuYSwKLXJlZ2FyZGxlc3Mgb2Ygd2hhdGV2ZXIgbWlnaHQgYmUgaW4gdGhlIEMgbGlicmFyeS4KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hY2NvbmZpZy5oIGIvbGliaWJlcnR5L2FjY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YzU5OWQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2FjY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c19lcnJsaXN0IHZhcmlhYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19FUlJMSVNUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzX25lcnIgdmFyaWFibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX05FUlIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNfc2lnbGlzdCB2YXJpYWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfU0lHTElTVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmVycm9yIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkVSUk9SCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYWxsb2NhLWNvbmYuaCBiL2xpYmliZXJ0eS9hbGxvY2EtY29uZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzNlZWEzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9hbGxvY2EtY29uZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoQ19BTExPQ0EpCi0jIGlmbmRlZiBhbGxvY2EKLSMgIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotIyBlbmRpZgotI2Vsc2UgLyogISBkZWZpbmVkIChfX0dOVUNfXykgKi8KLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgZWxzZQotIyAgaWYgZGVmaW5lZChIQVZFX0FMTE9DQV9IKSAmJiAhZGVmaW5lZChDX0FMTE9DQSkKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UgLyogISBkZWZpbmVkIChIQVZFX0FMTE9DQV9IKSAqLwotIyAgIGlmZGVmIF9fU1REQ19fCi1leHRlcm4gUFRSIGFsbG9jYSAoc2l6ZV90KTsKLSMgICBlbHNlIC8qICEgZGVmaW5lZCAoX19TVERDX18pICovCi1leHRlcm4gUFRSIGFsbG9jYSAoKTsKLSMgICBlbmRpZiAvKiAhIGRlZmluZWQgKF9fU1REQ19fKSAqLwotIyAgZW5kaWYgLyogISBkZWZpbmVkIChIQVZFX0FMTE9DQV9IKSAqLwotIyAgaWZkZWYgX1dJTjMyCi0jICAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBlbmRpZgotIyBlbmRpZiAvKiAhIGRlZmluZWQgKF9BSVgpICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChfX0dOVUNfXykgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hbGxvY2EuYyBiL2xpYmliZXJ0eS9hbGxvY2EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4YTIxNS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYWxsb2NhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDUgKzAsMCBAQAotLyogYWxsb2NhLmMgLS0gYWxsb2NhdGUgYXV0b21hdGljYWxseSByZWNsYWltZWQgbWVtb3J5Ci0gICAoTW9zdGx5KSBwb3J0YWJsZSBwdWJsaWMtZG9tYWluIGltcGxlbWVudGF0aW9uIC0tIEQgQSBHd3luCi0KLSAgIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFBXQiBsaWJyYXJ5IGFsbG9jYSBmdW5jdGlvbiwKLSAgIHdoaWNoIGlzIHVzZWQgdG8gYWxsb2NhdGUgc3BhY2Ugb2ZmIHRoZSBydW4tdGltZSBzdGFjayBzbwotICAgdGhhdCBpdCBpcyBhdXRvbWF0aWNhbGx5IHJlY2xhaW1lZCB1cG9uIHByb2NlZHVyZSBleGl0LAotICAgd2FzIGluc3BpcmVkIGJ5IGRpc2N1c3Npb25zIHdpdGggSi4gUS4gSm9obnNvbiBvZiBDb3JuZWxsLgotICAgSi5PdHRvIFRlbm5hbnQgPGpvdEBjcmF5LmNvbT4gY29udHJpYnV0ZWQgdGhlIENyYXkgc3VwcG9ydC4KLQotICAgVGhlcmUgYXJlIHNvbWUgcHJlcHJvY2Vzc29yIGNvbnN0YW50cyB0aGF0IGNhbgotICAgYmUgZGVmaW5lZCB3aGVuIGNvbXBpbGluZyBmb3IgeW91ciBzcGVjaWZpYyBzeXN0ZW0sIGZvcgotICAgaW1wcm92ZWQgZWZmaWNpZW5jeTsgaG93ZXZlciwgdGhlIGRlZmF1bHRzIHNob3VsZCBiZSBva2F5LgotCi0gICBUaGUgZ2VuZXJhbCBjb25jZXB0IG9mIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdG8ga2VlcAotICAgdHJhY2sgb2YgYWxsIGFsbG9jYS1hbGxvY2F0ZWQgYmxvY2tzLCBhbmQgcmVjbGFpbSBhbnkKLSAgIHRoYXQgYXJlIGZvdW5kIHRvIGJlIGRlZXBlciBpbiB0aGUgc3RhY2sgdGhhbiB0aGUgY3VycmVudAotICAgaW52b2NhdGlvbi4gIFRoaXMgaGV1cmlzdGljIGRvZXMgbm90IHJlY2xhaW0gc3RvcmFnZSBhcwotICAgc29vbiBhcyBpdCBiZWNvbWVzIGludmFsaWQsIGJ1dCBpdCB3aWxsIGRvIHNvIGV2ZW50dWFsbHkuCi0KLSAgIEFzIGEgc3BlY2lhbCBjYXNlLCBhbGxvY2EoMCkgcmVjbGFpbXMgc3RvcmFnZSB3aXRob3V0Ci0gICBhbGxvY2F0aW5nIGFueS4gIEl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZSBhbGxvY2EoMCkgaW4KLSAgIHlvdXIgbWFpbiBjb250cm9sIGxvb3AsIGV0Yy4gdG8gZm9yY2UgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBlbWFjcwotI2luY2x1ZGUgImJsb2NraW5wdXQuaCIKLSNlbmRpZgotCi0vKiBJZiBjb21waWxpbmcgd2l0aCBHQ0MgMiwgdGhpcyBmaWxlJ3Mgbm90IG5lZWRlZC4gIEV4Y2VwdCBvZiBjb3Vyc2UgaWYKLSAgIHRoZSBDIGFsbG9jYSBpcyBleHBsaWNpdGx5IHJlcXVlc3RlZC4gICovCi0jaWYgZGVmaW5lZCAoVVNFX0NfQUxMT0NBKSB8fCAhZGVmaW5lZCAoX19HTlVDX18pIHx8IF9fR05VQ19fIDwgMgotCi0vKiBJZiBzb21lb25lIGhhcyBkZWZpbmVkIGFsbG9jYSBhcyBhIG1hY3JvLAotICAgdGhlcmUgbXVzdCBiZSBzb21lIG90aGVyIHdheSBhbGxvY2EgaXMgc3VwcG9zZWQgdG8gd29yay4gICovCi0jaWZuZGVmIGFsbG9jYQotCi0jaWZkZWYgZW1hY3MKLSNpZmRlZiBzdGF0aWMKLS8qIGFjdHVhbGx5LCBvbmx5IHdhbnQgdGhpcyBpZiBzdGF0aWMgaXMgZGVmaW5lZCBhcyAiIgotICAgLS0gdGhpcyBpcyBmb3IgdXNnLCBpbiB3aGljaCBlbWFjcyBtdXN0IHVuZGVmaW5lIHN0YXRpYwotICAgaW4gb3JkZXIgdG8gbWFrZSB1bmV4ZWMgd29ya2FibGUKLSAgICovCi0jaWZuZGVmIFNUQUNLX0RJUkVDVElPTgoteW91Ci1sb3NlCi0tLSBtdXN0IGtub3cgU1RBQ0tfRElSRUNUSU9OIGF0IGNvbXBpbGUtdGltZQotI2VuZGlmIC8qIFNUQUNLX0RJUkVDVElPTiB1bmRlZmluZWQgKi8KLSNlbmRpZiAvKiBzdGF0aWMgKi8KLSNlbmRpZiAvKiBlbWFjcyAqLwotCi0vKiBJZiB5b3VyIHN0YWNrIGlzIGEgbGlua2VkIGxpc3Qgb2YgZnJhbWVzLCB5b3UgaGF2ZSB0bwotICAgcHJvdmlkZSBhbiAiYWRkcmVzcyBtZXRyaWMiIEFERFJFU1NfRlVOQ1RJT04gbWFjcm8uICAqLwotCi0jaWYgZGVmaW5lZCAoQ1JBWSkgJiYgZGVmaW5lZCAoQ1JBWV9TVEFDS1NFR19FTkQpCi1sb25nIGkwMGFmdW5jICgpOwotI2RlZmluZSBBRERSRVNTX0ZVTkNUSU9OKGFyZykgKGNoYXIgKikgaTAwYWZ1bmMgKCYoYXJnKSkKLSNlbHNlCi0jZGVmaW5lIEFERFJFU1NfRlVOQ1RJT04oYXJnKSAmKGFyZykKLSNlbmRpZgotCi0jaWYgX19TVERDX18KLXR5cGVkZWYgdm9pZCAqcG9pbnRlcjsKLSNlbHNlCi10eXBlZGVmIGNoYXIgKnBvaW50ZXI7Ci0jZW5kaWYKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lCU5VTEwJMAotI2VuZGlmCi0KLS8qIERpZmZlcmVudCBwb3J0aW9ucyBvZiBFbWFjcyBuZWVkIHRvIGNhbGwgZGlmZmVyZW50IHZlcnNpb25zIG9mCi0gICBtYWxsb2MuICBUaGUgRW1hY3MgZXhlY3V0YWJsZSBuZWVkcyBhbGxvY2EgdG8gY2FsbCB4bWFsbG9jLCBiZWNhdXNlCi0gICBvcmRpbmFyeSBtYWxsb2MgaXNuJ3QgcHJvdGVjdGVkIGZyb20gaW5wdXQgc2lnbmFscy4gIE9uIHRoZSBvdGhlcgotICAgaGFuZCwgdGhlIHV0aWxpdGllcyBpbiBsaWItc3JjIG5lZWQgYWxsb2NhIHRvIGNhbGwgbWFsbG9jOyBzb21lIG9mCi0gICB0aGVtIGFyZSB2ZXJ5IHNpbXBsZSwgYW5kIGRvbid0IGhhdmUgYW4geG1hbGxvYyByb3V0aW5lLgotCi0gICBOb24tRW1hY3MgcHJvZ3JhbXMgZXhwZWN0IHRoaXMgdG8gY2FsbCB1c2UgeG1hbGxvYy4KLQotICAgQ2FsbGVycyBiZWxvdyBzaG91bGQgdXNlIG1hbGxvYy4gICovCi0KLSNpZm5kZWYgZW1hY3MKLSNkZWZpbmUgbWFsbG9jIHhtYWxsb2MKLSNlbmRpZgotZXh0ZXJuIHBvaW50ZXIgbWFsbG9jICgpOwotCi0vKiBEZWZpbmUgU1RBQ0tfRElSRUNUSU9OIGlmIHlvdSBrbm93IHRoZSBkaXJlY3Rpb24gb2Ygc3RhY2sKLSAgIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKLSAgIGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0KLSAgIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSAgIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotICAgU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24gICovCi0KLSNpZm5kZWYgU1RBQ0tfRElSRUNUSU9OCi0jZGVmaW5lCVNUQUNLX0RJUkVDVElPTgkwCS8qIERpcmVjdGlvbiB1bmtub3duLiAgKi8KLSNlbmRpZgotCi0jaWYgU1RBQ0tfRElSRUNUSU9OICE9IDAKLQotI2RlZmluZQlTVEFDS19ESVIJU1RBQ0tfRElSRUNUSU9OCS8qIEtub3duIGF0IGNvbXBpbGUtdGltZS4gICovCi0KLSNlbHNlIC8qIFNUQUNLX0RJUkVDVElPTiA9PSAwOyBuZWVkIHJ1bi10aW1lIGNvZGUuICAqLwotCi1zdGF0aWMgaW50IHN0YWNrX2RpcjsJCS8qIDEgb3IgLTEgb25jZSBrbm93bi4gICovCi0jZGVmaW5lCVNUQUNLX0RJUglzdGFja19kaXIKLQotc3RhdGljIHZvaWQKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gTlVMTDsJLyogQWRkcmVzcyBvZiBmaXJzdCBgZHVtbXknLCBvbmNlIGtub3duLiAgKi8KLSAgYXV0byBjaGFyIGR1bW15OwkJLyogVG8gZ2V0IHN0YWNrIGFkZHJlc3MuICAqLwotCi0gIGlmIChhZGRyID09IE5VTEwpCi0gICAgewkJCQkvKiBJbml0aWFsIGVudHJ5LiAgKi8KLSAgICAgIGFkZHIgPSBBRERSRVNTX0ZVTkNUSU9OIChkdW1teSk7Ci0KLSAgICAgIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwkvKiBSZWN1cnNlIG9uY2UuICAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFNlY29uZCBlbnRyeS4gICovCi0gICAgICBpZiAoQUREUkVTU19GVU5DVElPTiAoZHVtbXkpID4gYWRkcikKLQlzdGFja19kaXIgPSAxOwkJLyogU3RhY2sgZ3JldyB1cHdhcmQuICAqLwotICAgICAgZWxzZQotCXN0YWNrX2RpciA9IC0xOwkJLyogU3RhY2sgZ3JldyBkb3dud2FyZC4gICovCi0gICAgfQotfQotCi0jZW5kaWYgLyogU1RBQ0tfRElSRUNUSU9OID09IDAgKi8KLQotLyogQW4gImFsbG9jYSBoZWFkZXIiIGlzIHVzZWQgdG86Ci0gICAoYSkgY2hhaW4gdG9nZXRoZXIgYWxsIGFsbG9jYSdlZCBibG9ja3M7Ci0gICAoYikga2VlcCB0cmFjayBvZiBzdGFjayBkZXB0aC4KLQotICAgSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCBzaXplb2YoaGVhZGVyKSBhZ3JlZSB3aXRoIG1hbGxvYwotICAgYWxpZ25tZW50IGNodW5rIHNpemUuICBUaGUgZm9sbG93aW5nIGRlZmF1bHQgc2hvdWxkIHdvcmsgb2theS4gICovCi0KLSNpZm5kZWYJQUxJR05fU0laRQotI2RlZmluZQlBTElHTl9TSVpFCXNpemVvZihkb3VibGUpCi0jZW5kaWYKLQotdHlwZWRlZiB1bmlvbiBoZHIKLXsKLSAgY2hhciBhbGlnbltBTElHTl9TSVpFXTsJLyogVG8gZm9yY2Ugc2l6ZW9mKGhlYWRlcikuICAqLwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bmlvbiBoZHIgKm5leHQ7CQkvKiBGb3IgY2hhaW5pbmcgaGVhZGVycy4gICovCi0gICAgICBjaGFyICpkZWVwOwkJLyogRm9yIHN0YWNrIGRlcHRoIG1lYXN1cmUuICAqLwotICAgIH0gaDsKLX0gaGVhZGVyOwotCi1zdGF0aWMgaGVhZGVyICpsYXN0X2FsbG9jYV9oZWFkZXIgPSBOVUxMOwkvKiAtPiBsYXN0IGFsbG9jYSBoZWFkZXIuICAqLwotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIGF0IGxlYXN0IFNJWkUgYnl0ZXMgb2Ygc3RvcmFnZSwKLSAgIHdoaWNoIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWNsYWltZWQgdXBvbiBleGl0IGZyb20KLSAgIHRoZSBwcm9jZWR1cmUgdGhhdCBjYWxsZWQgYWxsb2NhLiAgT3JpZ2luYWxseSwgdGhpcyBzcGFjZQotICAgd2FzIHN1cHBvc2VkIHRvIGJlIHRha2VuIGZyb20gdGhlIGN1cnJlbnQgc3RhY2sgZnJhbWUgb2YgdGhlCi0gICBjYWxsZXIsIGJ1dCB0aGF0IG1ldGhvZCBjYW5ub3QgYmUgbWFkZSB0byB3b3JrIGZvciBzb21lCi0gICBpbXBsZW1lbnRhdGlvbnMgb2YgQywgZm9yIGV4YW1wbGUgdW5kZXIgR291bGQncyBVVFgvMzIuICAqLwotCi1wb2ludGVyCi1hbGxvY2EgKHNpemUpCi0gICAgIHVuc2lnbmVkIHNpemU7Ci17Ci0gIGF1dG8gY2hhciBwcm9iZTsJCS8qIFByb2JlcyBzdGFjayBkZXB0aDogKi8KLSAgcmVnaXN0ZXIgY2hhciAqZGVwdGggPSBBRERSRVNTX0ZVTkNUSU9OIChwcm9iZSk7Ci0KLSNpZiBTVEFDS19ESVJFQ1RJT04gPT0gMAotICBpZiAoU1RBQ0tfRElSID09IDApCQkvKiBVbmtub3duIGdyb3d0aCBkaXJlY3Rpb24uICAqLwotICAgIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotI2VuZGlmCi0KLSAgLyogUmVjbGFpbSBnYXJiYWdlLCBkZWZpbmVkIGFzIGFsbCBhbGxvY2EnZCBzdG9yYWdlIHRoYXQKLSAgICAgd2FzIGFsbG9jYXRlZCBmcm9tIGRlZXBlciBpbiB0aGUgc3RhY2sgdGhhbiBjdXJyZW50bHkuICAqLwotCi0gIHsKLSAgICByZWdpc3RlciBoZWFkZXIgKmhwOwkvKiBUcmF2ZXJzZXMgbGlua2VkIGxpc3QuICAqLwotCi0jaWZkZWYgZW1hY3MKLSAgICBCTE9DS19JTlBVVDsKLSNlbmRpZgotCi0gICAgZm9yIChocCA9IGxhc3RfYWxsb2NhX2hlYWRlcjsgaHAgIT0gTlVMTDspCi0gICAgICBpZiAoKFNUQUNLX0RJUiA+IDAgJiYgaHAtPmguZGVlcCA+IGRlcHRoKQotCSAgfHwgKFNUQUNLX0RJUiA8IDAgJiYgaHAtPmguZGVlcCA8IGRlcHRoKSkKLQl7Ci0JICByZWdpc3RlciBoZWFkZXIgKm5wID0gaHAtPmgubmV4dDsKLQotCSAgZnJlZSAoKHBvaW50ZXIpIGhwKTsJLyogQ29sbGVjdCBnYXJiYWdlLiAgKi8KLQotCSAgaHAgPSBucDsJCS8qIC0+IG5leHQgaGVhZGVyLiAgKi8KLQl9Ci0gICAgICBlbHNlCi0JYnJlYWs7CQkJLyogUmVzdCBhcmUgbm90IGRlZXBlci4gICovCi0KLSAgICBsYXN0X2FsbG9jYV9oZWFkZXIgPSBocDsJLyogLT4gbGFzdCB2YWxpZCBzdG9yYWdlLiAgKi8KLQotI2lmZGVmIGVtYWNzCi0gICAgVU5CTE9DS19JTlBVVDsKLSNlbmRpZgotICB9Ci0KLSAgaWYgKHNpemUgPT0gMCkKLSAgICByZXR1cm4gTlVMTDsJCS8qIE5vIGFsbG9jYXRpb24gcmVxdWlyZWQuICAqLwotCi0gIC8qIEFsbG9jYXRlIGNvbWJpbmVkIGhlYWRlciArIHVzZXIgZGF0YSBzdG9yYWdlLiAgKi8KLQotICB7Ci0gICAgcmVnaXN0ZXIgcG9pbnRlciBuZXcgPSBtYWxsb2MgKHNpemVvZiAoaGVhZGVyKSArIHNpemUpOwotICAgIC8qIEFkZHJlc3Mgb2YgaGVhZGVyLiAgKi8KLQotICAgIGlmIChuZXcgPT0gMCkKLSAgICAgIGFib3J0KCk7Ci0KLSAgICAoKGhlYWRlciAqKSBuZXcpLT5oLm5leHQgPSBsYXN0X2FsbG9jYV9oZWFkZXI7Ci0gICAgKChoZWFkZXIgKikgbmV3KS0+aC5kZWVwID0gZGVwdGg7Ci0KLSAgICBsYXN0X2FsbG9jYV9oZWFkZXIgPSAoaGVhZGVyICopIG5ldzsKLQotICAgIC8qIFVzZXIgc3RvcmFnZSBiZWdpbnMganVzdCBhZnRlciBoZWFkZXIuICAqLwotCi0gICAgcmV0dXJuIChwb2ludGVyKSAoKGNoYXIgKikgbmV3ICsgc2l6ZW9mIChoZWFkZXIpKTsKLSAgfQotfQotCi0jaWYgZGVmaW5lZCAoQ1JBWSkgJiYgZGVmaW5lZCAoQ1JBWV9TVEFDS1NFR19FTkQpCi0KLSNpZmRlZiBERUJVR19JMDBBRlVOQwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBDUkFZX1NUQUNLCi0jZGVmaW5lIENSQVlfU1RBQ0sKLSNpZm5kZWYgQ1JBWTIKLS8qIFN0YWNrIHN0cnVjdHVyZXMgZm9yIENSQVktMSwgQ1JBWSBYLU1QLCBhbmQgQ1JBWSBZLU1QICovCi1zdHJ1Y3Qgc3RhY2tfY29udHJvbF9oZWFkZXIKLSAgewotICAgIGxvbmcgc2hncm93OjMyOwkJLyogTnVtYmVyIG9mIHRpbWVzIHN0YWNrIGhhcyBncm93bi4gICovCi0gICAgbG9uZyBzaGFzZWc6MzI7CQkvKiBTaXplIG9mIGluY3JlbWVudHMgdG8gc3RhY2suICAqLwotICAgIGxvbmcgc2hod206MzI7CQkvKiBIaWdoIHdhdGVyIG1hcmsgb2Ygc3RhY2suICAqLwotICAgIGxvbmcgc2hzaXplOjMyOwkJLyogQ3VycmVudCBzaXplIG9mIHN0YWNrIChhbGwgc2VnbWVudHMpLiAgKi8KLSAgfTsKLQotLyogVGhlIHN0YWNrIHNlZ21lbnQgbGlua2FnZSBjb250cm9sIGluZm9ybWF0aW9uIG9jY3VycyBhdAotICAgdGhlIGhpZ2gtYWRkcmVzcyBlbmQgb2YgYSBzdGFjayBzZWdtZW50LiAgKFRoZSBzdGFjawotICAgZ3Jvd3MgZnJvbSBsb3cgYWRkcmVzc2VzIHRvIGhpZ2ggYWRkcmVzc2VzLikgIFRoZSBpbml0aWFsCi0gICBwYXJ0IG9mIHRoZSBzdGFjayBzZWdtZW50IGxpbmthZ2UgY29udHJvbCBpbmZvcm1hdGlvbiBpcwotICAgMDIwMCAob2N0YWwpIHdvcmRzLiAgVGhpcyBwcm92aWRlcyBmb3IgcmVnaXN0ZXIgc3RvcmFnZQotICAgZm9yIHRoZSByb3V0aW5lIHdoaWNoIG92ZXJmbG93cyB0aGUgc3RhY2suICAqLwotCi1zdHJ1Y3Qgc3RhY2tfc2VnbWVudF9saW5rYWdlCi0gIHsKLSAgICBsb25nIHNzWzAyMDBdOwkJLyogMDIwMCBvdmVyZmxvdyB3b3Jkcy4gICovCi0gICAgbG9uZyBzc3NpemU6MzI7CQkvKiBOdW1iZXIgb2Ygd29yZHMgaW4gdGhpcyBzZWdtZW50LiAgKi8KLSAgICBsb25nIHNzYmFzZTozMjsJCS8qIE9mZnNldCB0byBzdGFjayBiYXNlLiAgKi8KLSAgICBsb25nOjMyOwotICAgIGxvbmcgc3Nwc2VnOjMyOwkJLyogT2Zmc2V0IHRvIGxpbmthZ2UgY29udHJvbCBvZiBwcmV2aW91cwotCQkJCSAgIHNlZ21lbnQgb2Ygc3RhY2suICAqLwotICAgIGxvbmc6MzI7Ci0gICAgbG9uZyBzc3RjcHQ6MzI7CQkvKiBQb2ludGVyIHRvIHRhc2sgY29tbW9uIGFkZHJlc3MgYmxvY2suICAqLwotICAgIGxvbmcgc3Njc25tOwkJLyogUHJpdmF0ZSBjb250cm9sIHN0cnVjdHVyZSBudW1iZXIgZm9yCi0JCQkJICAgbWljcm90YXNraW5nLiAgKi8KLSAgICBsb25nIHNzdXNyMTsJCS8qIFJlc2VydmVkIGZvciB1c2VyLiAgKi8KLSAgICBsb25nIHNzdXNyMjsJCS8qIFJlc2VydmVkIGZvciB1c2VyLiAgKi8KLSAgICBsb25nIHNzdHBpZDsJCS8qIFByb2Nlc3MgSUQgZm9yIHBpZCBiYXNlZCBtdWx0aS10YXNraW5nLiAgKi8KLSAgICBsb25nIHNzZ3Z1cDsJCS8qIFBvaW50ZXIgdG8gbXVsdGl0YXNraW5nIHRocmVhZCBnaXZldXAuICAqLwotICAgIGxvbmcgc3NjcmF5WzddOwkJLyogUmVzZXJ2ZWQgZm9yIENyYXkgUmVzZWFyY2guICAqLwotICAgIGxvbmcgc3NhMDsKLSAgICBsb25nIHNzYTE7Ci0gICAgbG9uZyBzc2EyOwotICAgIGxvbmcgc3NhMzsKLSAgICBsb25nIHNzYTQ7Ci0gICAgbG9uZyBzc2E1OwotICAgIGxvbmcgc3NhNjsKLSAgICBsb25nIHNzYTc7Ci0gICAgbG9uZyBzc3MwOwotICAgIGxvbmcgc3NzMTsKLSAgICBsb25nIHNzczI7Ci0gICAgbG9uZyBzc3MzOwotICAgIGxvbmcgc3NzNDsKLSAgICBsb25nIHNzczU7Ci0gICAgbG9uZyBzc3M2OwotICAgIGxvbmcgc3NzNzsKLSAgfTsKLQotI2Vsc2UgLyogQ1JBWTIgKi8KLS8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGRlZmluZXMgdGhlIHZlY3RvciBvZiB3b3JkcwotICAgcmV0dXJuZWQgYnkgdGhlIFNUS1NUQVQgbGlicmFyeSByb3V0aW5lLiAgKi8KLXN0cnVjdCBzdGtfc3RhdAotICB7Ci0gICAgbG9uZyBub3c7CQkJLyogQ3VycmVudCB0b3RhbCBzdGFjayBzaXplLiAgKi8KLSAgICBsb25nIG1heGM7CQkJLyogQW1vdW50IG9mIGNvbnRpZ3VvdXMgc3BhY2Ugd2hpY2ggd291bGQKLQkJCQkgICBiZSByZXF1aXJlZCB0byBzYXRpc2Z5IHRoZSBtYXhpbXVtCi0JCQkJICAgc3RhY2sgZGVtYW5kIHRvIGRhdGUuICAqLwotICAgIGxvbmcgaGlnaF93YXRlcjsJCS8qIFN0YWNrIGhpZ2gtd2F0ZXIgbWFyay4gICovCi0gICAgbG9uZyBvdmVyZmxvd3M7CQkvKiBOdW1iZXIgb2Ygc3RhY2sgb3ZlcmZsb3cgKCRTVEtPRkVOKSBjYWxscy4gICovCi0gICAgbG9uZyBoaXRzOwkJCS8qIE51bWJlciBvZiBpbnRlcm5hbCBidWZmZXIgaGl0cy4gICovCi0gICAgbG9uZyBleHRlbmRzOwkJLyogTnVtYmVyIG9mIGJsb2NrIGV4dGVuc2lvbnMuICAqLwotICAgIGxvbmcgc3Rrb19tYWxsb2NzOwkJLyogQmxvY2sgYWxsb2NhdGlvbnMgYnkgJFNUS09GRU4uICAqLwotICAgIGxvbmcgdW5kZXJmbG93czsJCS8qIE51bWJlciBvZiBzdGFjayB1bmRlcmZsb3cgY2FsbHMgKCRTVEtSRVROKS4gICovCi0gICAgbG9uZyBzdGtvX2ZyZWU7CQkvKiBOdW1iZXIgb2YgZGVhbGxvY2F0aW9ucyBieSAkU1RLUkVUTi4gICovCi0gICAgbG9uZyBzdGttX2ZyZWU7CQkvKiBOdW1iZXIgb2YgZGVhbGxvY2F0aW9ucyBieSAkU1RLTVJFVC4gICovCi0gICAgbG9uZyBzZWdtZW50czsJCS8qIEN1cnJlbnQgbnVtYmVyIG9mIHN0YWNrIHNlZ21lbnRzLiAgKi8KLSAgICBsb25nIG1heHM7CQkJLyogTWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgc2VnbWVudHMgc28gZmFyLiAgKi8KLSAgICBsb25nIHBhZF9zaXplOwkJLyogU3RhY2sgcGFkIHNpemUuICAqLwotICAgIGxvbmcgY3VycmVudF9hZGRyZXNzOwkvKiBDdXJyZW50IHN0YWNrIHNlZ21lbnQgYWRkcmVzcy4gICovCi0gICAgbG9uZyBjdXJyZW50X3NpemU7CQkvKiBDdXJyZW50IHN0YWNrIHNlZ21lbnQgc2l6ZS4gIFRoaXMKLQkJCQkgICBudW1iZXIgaXMgYWN0dWFsbHkgY29ycnVwdGVkIGJ5IFNUS1NUQVQgdG8KLQkJCQkgICBpbmNsdWRlIHRoZSBmaWZ0ZWVuIHdvcmQgdHJhaWxlciBhcmVhLiAgKi8KLSAgICBsb25nIGluaXRpYWxfYWRkcmVzczsJLyogQWRkcmVzcyBvZiBpbml0aWFsIHNlZ21lbnQuICAqLwotICAgIGxvbmcgaW5pdGlhbF9zaXplOwkJLyogU2l6ZSBvZiBpbml0aWFsIHNlZ21lbnQuICAqLwotICB9OwotCi0vKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGRhdGEgc3RydWN0dXJlIHdoaWNoIHRyYWlscwotICAgYW55IHN0YWNrIHNlZ21lbnQuICBJIHRoaW5rIHRoYXQgdGhlIGRlc2NyaXB0aW9uIGluICdhc2RlZicgaXMKLSAgIG91dCBvZiBkYXRlLiAgSSBvbmx5IGRlc2NyaWJlIHRoZSBwYXJ0cyB0aGF0IEkgYW0gc3VyZSBhYm91dC4gICovCi0KLXN0cnVjdCBzdGtfdHJhaWxlcgotICB7Ci0gICAgbG9uZyB0aGlzX2FkZHJlc3M7CQkvKiBBZGRyZXNzIG9mIHRoaXMgYmxvY2suICAqLwotICAgIGxvbmcgdGhpc19zaXplOwkJLyogU2l6ZSBvZiB0aGlzIGJsb2NrIChkb2VzIG5vdCBpbmNsdWRlCi0JCQkJICAgdGhpcyB0cmFpbGVyKS4gICovCi0gICAgbG9uZyB1bmtub3duMjsKLSAgICBsb25nIHVua25vd24zOwotICAgIGxvbmcgbGluazsJCQkvKiBBZGRyZXNzIG9mIHRyYWlsZXIgYmxvY2sgb2YgcHJldmlvdXMKLQkJCQkgICBzZWdtZW50LiAgKi8KLSAgICBsb25nIHVua25vd241OwotICAgIGxvbmcgdW5rbm93bjY7Ci0gICAgbG9uZyB1bmtub3duNzsKLSAgICBsb25nIHVua25vd244OwotICAgIGxvbmcgdW5rbm93bjk7Ci0gICAgbG9uZyB1bmtub3duMTA7Ci0gICAgbG9uZyB1bmtub3duMTE7Ci0gICAgbG9uZyB1bmtub3duMTI7Ci0gICAgbG9uZyB1bmtub3duMTM7Ci0gICAgbG9uZyB1bmtub3duMTQ7Ci0gIH07Ci0KLSNlbmRpZiAvKiBDUkFZMiAqLwotI2VuZGlmIC8qIG5vdCBDUkFZX1NUQUNLICovCi0KLSNpZmRlZiBDUkFZMgotLyogRGV0ZXJtaW5lIGEgInN0YWNrIG1lYXN1cmUiIGZvciBhbiBhcmJpdHJhcnkgQUREUkVTUy4KLSAgIEkgZG91YnQgdGhhdCAibGludCIgd2lsbCBsaWtlIHRoaXMgbXVjaC4gICovCi0KLXN0YXRpYyBsb25nCi1pMDBhZnVuYyAobG9uZyAqYWRkcmVzcykKLXsKLSAgc3RydWN0IHN0a19zdGF0IHN0YXR1czsKLSAgc3RydWN0IHN0a190cmFpbGVyICp0cmFpbGVyOwotICBsb25nICpibG9jaywgc2l6ZTsKLSAgbG9uZyByZXN1bHQgPSAwOwotCi0gIC8qIFdlIHdhbnQgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgc2VnbWVudHMuICBUaGUgZmlyc3QKLSAgICAgc3RlcCBpcyB0byBnZXQgdGhlIHN0YWNrIHN0YXR1cyBzdHJ1Y3R1cmUuICBXZSBjb3VsZCBkbyB0aGlzCi0gICAgIG1vcmUgcXVpY2tseSBhbmQgbW9yZSBkaXJlY3RseSwgcGVyaGFwcywgYnkgcmVmZXJlbmNpbmcgdGhlCi0gICAgICRMTTAwIGNvbW1vbiBibG9jaywgYnV0IEkga25vdyB0aGF0IHRoaXMgd29ya3MuICAqLwotCi0gIFNUS1NUQVQgKCZzdGF0dXMpOwotCi0gIC8qIFNldCB1cCB0aGUgaXRlcmF0aW9uLiAgKi8KLQotICB0cmFpbGVyID0gKHN0cnVjdCBzdGtfdHJhaWxlciAqKSAoc3RhdHVzLmN1cnJlbnRfYWRkcmVzcwotCQkJCSAgICArIHN0YXR1cy5jdXJyZW50X3NpemUKLQkJCQkgICAgLSAxNSk7Ci0KLSAgLyogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgc3RhY2sgc2VnbWVudC4gIFRoZXJlZm9yZSBpdCBpcwotICAgICBhIGZhdGFsIGVycm9yIGlmICJ0cmFpbGVyIiBpcyBudWxsLiAgKi8KLQotICBpZiAodHJhaWxlciA9PSAwKQotICAgIGFib3J0ICgpOwotCi0gIC8qIERpc2NhcmQgc2VnbWVudHMgdGhhdCBkbyBub3QgY29udGFpbiBvdXIgYXJndW1lbnQgYWRkcmVzcy4gICovCi0KLSAgd2hpbGUgKHRyYWlsZXIgIT0gMCkKLSAgICB7Ci0gICAgICBibG9jayA9IChsb25nICopIHRyYWlsZXItPnRoaXNfYWRkcmVzczsKLSAgICAgIHNpemUgPSB0cmFpbGVyLT50aGlzX3NpemU7Ci0gICAgICBpZiAoYmxvY2sgPT0gMCB8fCBzaXplID09IDApCi0JYWJvcnQgKCk7Ci0gICAgICB0cmFpbGVyID0gKHN0cnVjdCBzdGtfdHJhaWxlciAqKSB0cmFpbGVyLT5saW5rOwotICAgICAgaWYgKChibG9jayA8PSBhZGRyZXNzKSAmJiAoYWRkcmVzcyA8IChibG9jayArIHNpemUpKSkKLQlicmVhazsKLSAgICB9Ci0KLSAgLyogU2V0IHRoZSByZXN1bHQgdG8gdGhlIG9mZnNldCBpbiB0aGlzIHNlZ21lbnQgYW5kIGFkZCB0aGUgc2l6ZXMKLSAgICAgb2YgYWxsIHByZWRlY2Vzc29yIHNlZ21lbnRzLiAgKi8KLQotICByZXN1bHQgPSBhZGRyZXNzIC0gYmxvY2s7Ci0KLSAgaWYgKHRyYWlsZXIgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICBkbwotICAgIHsKLSAgICAgIGlmICh0cmFpbGVyLT50aGlzX3NpemUgPD0gMCkKLQlhYm9ydCAoKTsKLSAgICAgIHJlc3VsdCArPSB0cmFpbGVyLT50aGlzX3NpemU7Ci0gICAgICB0cmFpbGVyID0gKHN0cnVjdCBzdGtfdHJhaWxlciAqKSB0cmFpbGVyLT5saW5rOwotICAgIH0KLSAgd2hpbGUgKHRyYWlsZXIgIT0gMCk7Ci0KLSAgLyogV2UgYXJlIGRvbmUuICBOb3RlIHRoYXQgaWYgeW91IHByZXNlbnQgYSBib2d1cyBhZGRyZXNzIChvbmUKLSAgICAgbm90IGluIGFueSBzZWdtZW50KSwgeW91IHdpbGwgZ2V0IGEgZGlmZmVyZW50IG51bWJlciBiYWNrLCBmb3JtZWQKLSAgICAgZnJvbSBzdWJ0cmFjdGluZyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgYmxvY2suICBUaGlzIGlzIHByb2JhYmx5Ci0gICAgIG5vdCB3aGF0IHlvdSB3YW50LiAgKi8KLQotICByZXR1cm4gKHJlc3VsdCk7Ci19Ci0KLSNlbHNlIC8qIG5vdCBDUkFZMiAqLwotLyogU3RhY2sgYWRkcmVzcyBmdW5jdGlvbiBmb3IgYSBDUkFZLTEsIENSQVkgWC1NUCwgb3IgQ1JBWSBZLU1QLgotICAgRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgdGhlIGNlbGwgd2l0aGluIHRoZSBzdGFjaywKLSAgIGdpdmVuIHRoZSBhZGRyZXNzIG9mIHRoZSBjZWxsLiAgVGhlIHB1cnBvc2Ugb2YgdGhpcwotICAgcm91dGluZSBpcyB0byBsaW5lYXJpemUsIGluIHNvbWUgc2Vuc2UsIHN0YWNrIGFkZHJlc3NlcwotICAgZm9yIGFsbG9jYS4gICovCi0KLXN0YXRpYyBsb25nCi1pMDBhZnVuYyAobG9uZyBhZGRyZXNzKQotewotICBsb25nIHN0a2wgPSAwOwotCi0gIGxvbmcgc2l6ZSwgcHNlZywgdGhpc19zZWdtZW50LCBzdGFjazsKLSAgbG9uZyByZXN1bHQgPSAwOwotCi0gIHN0cnVjdCBzdGFja19zZWdtZW50X2xpbmthZ2UgKnNzcHRyOwotCi0gIC8qIFJlZ2lzdGVyIEI2NyBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZQotICAgICBjdXJyZW50IHN0YWNrIHNlZ21lbnQuICBJZiB5b3UgKGFzIGEgc3VicHJvZ3JhbSkgc3RvcmUKLSAgICAgeW91ciByZWdpc3RlcnMgb24gdGhlIHN0YWNrIGFuZCBmaW5kIHRoYXQgeW91IGFyZSBwYXN0Ci0gICAgIHRoZSBjb250ZW50cyBvZiBCNjcsIHlvdSBoYXZlIG92ZXJmbG93ZWQgdGhlIHNlZ21lbnQuCi0KLSAgICAgQjY3IGFsc28gcG9pbnRzIHRvIHRoZSBzdGFjayBzZWdtZW50IGxpbmthZ2UgY29udHJvbAotICAgICBhcmVhLCB3aGljaCBpcyB3aGF0IHdlIGFyZSByZWFsbHkgaW50ZXJlc3RlZCBpbi4gICovCi0KLSAgc3RrbCA9IENSQVlfU1RBQ0tTRUdfRU5EICgpOwotICBzc3B0ciA9IChzdHJ1Y3Qgc3RhY2tfc2VnbWVudF9saW5rYWdlICopIHN0a2w7Ci0KLSAgLyogSWYgb25lIHN1YnRyYWN0cyAnc2l6ZScgZnJvbSB0aGUgZW5kIG9mIHRoZSBzZWdtZW50LAotICAgICBvbmUgaGFzIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBzZWdtZW50LgotCi0gICAgIElmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBzZWdtZW50LCAncHNlZycgd2lsbCBiZQotICAgICBub256ZXJvLiAgKi8KLQotICBwc2VnID0gc3NwdHItPnNzcHNlZzsKLSAgc2l6ZSA9IHNzcHRyLT5zc3NpemU7Ci0KLSAgdGhpc19zZWdtZW50ID0gc3RrbCAtIHNpemU7Ci0KLSAgLyogSXQgaXMgcG9zc2libGUgdGhhdCBjYWxsaW5nIHRoaXMgcm91dGluZSBpdHNlbGYgY2F1c2VkCi0gICAgIGEgc3RhY2sgb3ZlcmZsb3cuICBEaXNjYXJkIHN0YWNrIHNlZ21lbnRzIHdoaWNoIGRvIG5vdAotICAgICBjb250YWluIHRoZSB0YXJnZXQgYWRkcmVzcy4gICovCi0KLSAgd2hpbGUgKCEodGhpc19zZWdtZW50IDw9IGFkZHJlc3MgJiYgYWRkcmVzcyA8PSBzdGtsKSkKLSAgICB7Ci0jaWZkZWYgREVCVUdfSTAwQUZVTkMKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiUwMTFvICUwMTFvICUwMTFvXG4iLCB0aGlzX3NlZ21lbnQsIGFkZHJlc3MsIHN0a2wpOwotI2VuZGlmCi0gICAgICBpZiAocHNlZyA9PSAwKQotCWJyZWFrOwotICAgICAgc3RrbCA9IHN0a2wgLSBwc2VnOwotICAgICAgc3NwdHIgPSAoc3RydWN0IHN0YWNrX3NlZ21lbnRfbGlua2FnZSAqKSBzdGtsOwotICAgICAgc2l6ZSA9IHNzcHRyLT5zc3NpemU7Ci0gICAgICBwc2VnID0gc3NwdHItPnNzcHNlZzsKLSAgICAgIHRoaXNfc2VnbWVudCA9IHN0a2wgLSBzaXplOwotICAgIH0KLQotICByZXN1bHQgPSBhZGRyZXNzIC0gdGhpc19zZWdtZW50OwotCi0gIC8qIElmIHlvdSBzdWJ0cmFjdCBwc2VnIGZyb20gdGhlIGN1cnJlbnQgZW5kIG9mIHRoZSBzdGFjaywKLSAgICAgeW91IGdldCB0aGUgYWRkcmVzcyBvZiB0aGUgcHJldmlvdXMgc3RhY2sgc2VnbWVudCdzIGVuZC4KLSAgICAgVGhpcyBzZWVtcyBhIGxpdHRsZSBjb252b2x1dGVkIHRvIG1lLCBidXQgSSdsbCBiZXQgeW91IHNhdmUKLSAgICAgYSBjeWNsZSBzb21ld2hlcmUuICAqLwotCi0gIHdoaWxlIChwc2VnICE9IDApCi0gICAgewotI2lmZGVmIERFQlVHX0kwMEFGVU5DCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlMDExbyAlMDExb1xuIiwgcHNlZywgc2l6ZSk7Ci0jZW5kaWYKLSAgICAgIHN0a2wgPSBzdGtsIC0gcHNlZzsKLSAgICAgIHNzcHRyID0gKHN0cnVjdCBzdGFja19zZWdtZW50X2xpbmthZ2UgKikgc3RrbDsKLSAgICAgIHNpemUgPSBzc3B0ci0+c3NzaXplOwotICAgICAgcHNlZyA9IHNzcHRyLT5zc3BzZWc7Ci0gICAgICByZXN1bHQgKz0gc2l6ZTsKLSAgICB9Ci0gIHJldHVybiAocmVzdWx0KTsKLX0KLQotI2VuZGlmIC8qIG5vdCBDUkFZMiAqLwotI2VuZGlmIC8qIENSQVkgKi8KLQotI2VuZGlmIC8qIG5vIGFsbG9jYSAqLwotI2VuZGlmIC8qIG5vdCBHQ0MgdmVyc2lvbiAyICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYXJndi5jIGIvbGliaWJlcnR5L2FyZ3YuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVjMTdlOS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYXJndi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkwICswLDAgQEAKLS8qIENyZWF0ZSBhbmQgZGVzdHJveSBhcmd1bWVudCB2ZWN0b3JzIChhcmd2J3MpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qICBDcmVhdGUgYW5kIGRlc3Ryb3kgYXJndW1lbnQgdmVjdG9ycy4gIEFuIGFyZ3VtZW50IHZlY3RvciBpcyBzaW1wbHkgYW4KLSAgICBhcnJheSBvZiBzdHJpbmcgcG9pbnRlcnMsIHRlcm1pbmF0ZWQgYnkgYSBOVUxMIHBvaW50ZXIuICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWZkZWYgaXNzcGFjZQotI3VuZGVmIGlzc3BhY2UKLSNlbmRpZgotI2RlZmluZSBpc3NwYWNlKGNoKSAoKGNoKSA9PSAnICcgfHwgKGNoKSA9PSAnXHQnKQotCi0vKiAgUm91dGluZXMgaW1wb3J0ZWQgZnJvbSBzdGFuZGFyZCBDIHJ1bnRpbWUgbGlicmFyaWVzLiAqLwotCi0jaWZkZWYgX19TVERDX18KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotZXh0ZXJuIHZvaWQgKm1lbWNweSAodm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBzaXplX3Qgbik7CS8qIDQuMTEuMi4xICovCi1leHRlcm4gc2l6ZV90IHN0cmxlbiAoY29uc3QgY2hhciAqcyk7CQkJCS8qIDQuMTEuNi4zICovCi1leHRlcm4gdm9pZCAqbWFsbG9jIChzaXplX3Qgc2l6ZSk7CQkJCS8qIDQuMTAuMy4zICovCi1leHRlcm4gdm9pZCAqcmVhbGxvYyAodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CQkJLyogNC4xMC4zLjQgKi8KLWV4dGVybiB2b2lkIGZyZWUgKHZvaWQgKnB0cik7CQkJCQkvKiA0LjEwLjMuMiAqLwotZXh0ZXJuIGNoYXIgKnN0cmR1cCAoY29uc3QgY2hhciAqcyk7CQkJCS8qIE5vbi1BTlNJICovCi0KLSNlbHNlCS8qICFfX1NURENfXyAqLwotCi0jaWYgIWRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19HTlVDX18KLWV4dGVybiBjaGFyICptZW1jcHkgKCk7CQkvKiBDb3B5IG1lbW9yeSByZWdpb24gKi8KLWV4dGVybiBpbnQgc3RybGVuICgpOwkJLyogQ291bnQgbGVuZ3RoIG9mIHN0cmluZyAqLwotZXh0ZXJuIGNoYXIgKm1hbGxvYyAoKTsJCS8qIFN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0ZXIgKi8KLWV4dGVybiBjaGFyICpyZWFsbG9jICgpOwkvKiBTdGFuZGFyZCBtZW1vcnkgcmVhbGxvY2F0b3IgKi8KLWV4dGVybiB2b2lkIGZyZWUgKCk7CQkvKiBGcmVlIG1hbGxvYydkIG1lbW9yeSAqLwotZXh0ZXJuIGNoYXIgKnN0cmR1cCAoKTsJCS8qIER1cGxpY2F0ZSBhIHN0cmluZyAqLwotI2VuZGlmCi0KLSNlbmRpZgkvKiBfX1NURENfXyAqLwotCi0jaW5jbHVkZSAiYWxsb2NhLWNvbmYuaCIKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgMAotI2VuZGlmCi0KLSNpZm5kZWYgRU9TCi0jZGVmaW5lIEVPUyAnXDAnCi0jZW5kaWYKLQotI2RlZmluZSBJTklUSUFMX01BWEFSR0MgOAkvKiBOdW1iZXIgb2YgYXJncyArIE5VTEwgaW4gaW5pdGlhbCBhcmd2ICovCi0KLQotLyoKLQotTkFNRQotCi0JZHVwYXJndiAtLSBkdXBsaWNhdGUgYW4gYXJndW1lbnQgdmVjdG9yCi0KLVNZTk9QU0lTCi0KLQljaGFyICoqZHVwYXJndiAodmVjdG9yKQotCWNoYXIgKip2ZWN0b3I7Ci0KLURFU0NSSVBUSU9OCi0KLQlEdXBsaWNhdGUgYW4gYXJndW1lbnQgdmVjdG9yLiAgU2ltcGx5IHNjYW5zIHRocm91Z2ggdGhlCi0JdmVjdG9yLCBkdXBsaWNhdGluZyBlYWNoIGFyZ3VtZW50IHVudGlsIHRoZQotCXRlcm1pbmF0aW5nIE5VTEwgaXMgZm91bmQuCi0KLVJFVFVSTlMKLQotCVJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhcmd1bWVudCB2ZWN0b3IgaWYKLQlzdWNjZXNzZnVsLiBSZXR1cm5zIE5VTEwgaWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0bwotCWNvbXBsZXRlIGJ1aWxkaW5nIHRoZSBhcmd1bWVudCB2ZWN0b3IuCi0KLSovCi0KLWNoYXIgKioKLWR1cGFyZ3YgKGFyZ3YpCi0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgYXJnYzsKLSAgY2hhciAqKmNvcHk7Ci0gIAotICBpZiAoYXJndiA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICAKLSAgLyogdGhlIHZlY3RvciAqLwotICBmb3IgKGFyZ2MgPSAwOyBhcmd2W2FyZ2NdICE9IE5VTEw7IGFyZ2MrKyk7Ci0gIGNvcHkgPSAoY2hhciAqKikgbWFsbG9jICgoYXJnYyArIDEpICogc2l6ZW9mIChjaGFyICopKTsKLSAgaWYgKGNvcHkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgCi0gIC8qIHRoZSBzdHJpbmdzICovCi0gIGZvciAoYXJnYyA9IDA7IGFyZ3ZbYXJnY10gIT0gTlVMTDsgYXJnYysrKQotICAgIHsKLSAgICAgIGludCBsZW4gPSBzdHJsZW4gKGFyZ3ZbYXJnY10pOwotICAgICAgY29weVthcmdjXSA9IG1hbGxvYyAoc2l6ZW9mIChjaGFyICopICogKGxlbiArIDEpKTsKLSAgICAgIGlmIChjb3B5W2FyZ2NdID09IE5VTEwpCi0JewotCSAgZnJlZWFyZ3YgKGNvcHkpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgc3RyY3B5IChjb3B5W2FyZ2NdLCBhcmd2W2FyZ2NdKTsKLSAgICB9Ci0gIGNvcHlbYXJnY10gPSBOVUxMOwotICByZXR1cm4gY29weTsKLX0KLQotLyoKLQotTkFNRQotCi0JZnJlZWFyZ3YgLS0gZnJlZSBhbiBhcmd1bWVudCB2ZWN0b3IKLQotU1lOT1BTSVMKLQotCXZvaWQgZnJlZWFyZ3YgKHZlY3RvcikKLQljaGFyICoqdmVjdG9yOwotCi1ERVNDUklQVElPTgotCi0JRnJlZSBhbiBhcmd1bWVudCB2ZWN0b3IgdGhhdCB3YXMgYnVpbHQgdXNpbmcgYnVpbGRhcmd2LiAgU2ltcGx5IHNjYW5zCi0JdGhyb3VnaCB0aGUgdmVjdG9yLCBmcmVlaW5nIHRoZSBtZW1vcnkgZm9yIGVhY2ggYXJndW1lbnQgdW50aWwgdGhlCi0JdGVybWluYXRpbmcgTlVMTCBpcyBmb3VuZCwgYW5kIHRoZW4gZnJlZXMgdGhlIHZlY3RvciBpdHNlbGYuCi0KLVJFVFVSTlMKLQotCU5vIHZhbHVlLgotCi0qLwotCi12b2lkIGZyZWVhcmd2ICh2ZWN0b3IpCi1jaGFyICoqdmVjdG9yOwotewotICByZWdpc3RlciBjaGFyICoqc2NhbjsKLQotICBpZiAodmVjdG9yICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChzY2FuID0gdmVjdG9yOyAqc2NhbiAhPSBOVUxMOyBzY2FuKyspCi0JewotCSAgZnJlZSAoKnNjYW4pOwotCX0KLSAgICAgIGZyZWUgKHZlY3Rvcik7Ci0gICAgfQotfQotCi0vKgotCi1OQU1FCi0KLQlidWlsZGFyZ3YgLS0gYnVpbGQgYW4gYXJndW1lbnQgdmVjdG9yIGZyb20gYSBzdHJpbmcKLQotU1lOT1BTSVMKLQotCWNoYXIgKipidWlsZGFyZ3YgKHNwKQotCWNoYXIgKnNwOwotCi1ERVNDUklQVElPTgotCi0JR2l2ZW4gYSBwb2ludGVyIHRvIGEgc3RyaW5nLCBwYXJzZSB0aGUgc3RyaW5nIGV4dHJhY3RpbmcgZmllbGRzCi0Jc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgYW5kIG9wdGlvbmFsbHkgZW5jbG9zZWQgd2l0aGluIGVpdGhlciBzaW5nbGUKLQlvciBkb3VibGUgcXVvdGVzICh3aGljaCBhcmUgc3RyaXBwZWQgb2ZmKSwgYW5kIGJ1aWxkIGEgdmVjdG9yIG9mCi0JcG9pbnRlcnMgdG8gY29waWVzIG9mIHRoZSBzdHJpbmcgZm9yIGVhY2ggZmllbGQuICBUaGUgaW5wdXQgc3RyaW5nCi0JcmVtYWlucyB1bmNoYW5nZWQuCi0KLQlBbGwgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHBvaW50ZXIgYXJyYXkgYW5kIGNvcGllcyBvZiB0aGUgc3RyaW5nCi0JaXMgb2J0YWluZWQgZnJvbSBtYWxsb2MuICBBbGwgb2YgdGhlIG1lbW9yeSBjYW4gYmUgcmV0dXJuZWQgdG8gdGhlCi0Jc3lzdGVtIHdpdGggdGhlIHNpbmdsZSBmdW5jdGlvbiBjYWxsIGZyZWVhcmd2LCB3aGljaCB0YWtlcyB0aGUKLQlyZXR1cm5lZCByZXN1bHQgb2YgYnVpbGRhcmd2LCBhcyBpdCdzIGFyZ3VtZW50LgotCi0JVGhlIG1lbW9yeSBmb3IgdGhlIGFyZ3YgYXJyYXkgaXMgZHluYW1pY2FsbHkgZXhwYW5kZWQgYXMgbmVjZXNzYXJ5LgotCi1SRVRVUk5TCi0KLQlSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYXJndW1lbnQgdmVjdG9yIGlmIHN1Y2Nlc3NmdWwuIFJldHVybnMgTlVMTAotCWlmIHRoZSBpbnB1dCBzdHJpbmcgcG9pbnRlciBpcyBOVUxMIG9yIGlmIHRoZXJlIGlzIGluc3VmZmljaWVudAotCW1lbW9yeSB0byBjb21wbGV0ZSBidWlsZGluZyB0aGUgYXJndW1lbnQgdmVjdG9yLgotCi1OT1RFUwotCi0JSW4gb3JkZXIgdG8gcHJvdmlkZSBhIHdvcmtpbmcgYnVmZmVyIGZvciBleHRyYWN0aW5nIGFyZ3VtZW50cyBpbnRvLAotCXdpdGggYXBwcm9wcmlhdGUgc3RyaXBwaW5nIG9mIHF1b3RlcyBhbmQgdHJhbnNsYXRpb24gb2YgYmFja3NsYXNoCi0Jc2VxdWVuY2VzLCB3ZSBhbGxvY2F0ZSBhIHdvcmtpbmcgYnVmZmVyIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlIGlucHV0Ci0Jc3RyaW5nLiAgVGhpcyBlbnN1cmVzIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIHNwYWNlIGluIHdoaWNoIHRvCi0Jd29yaywgc2luY2UgdGhlIGV4dHJhY3RlZCBhcmcgaXMgbmV2ZXIgbGFyZ2VyIHRoYW4gdGhlIGlucHV0IHN0cmluZy4KLQotCUlmIHRoZSBpbnB1dCBpcyBhIG51bGwgc3RyaW5nIChhcyBvcHBvc2VkIHRvIGEgTlVMTCBwb2ludGVyKSwgdGhlbgotCWJ1aWxkYXJnIHJldHVybnMgYW4gYXJndiB0aGF0IGhhcyBvbmUgYXJnLCBhIG51bGwgc3RyaW5nLgotCi0JQXJndiBpcyBhbHdheXMga2VwdCB0ZXJtaW5hdGVkIHdpdGggYSBOVUxMIGFyZyBwb2ludGVyLCBzbyBpdCBjYW4KLQliZSBwYXNzZWQgdG8gZnJlZWFyZ3YgYXQgYW55IHRpbWUsIG9yIHJldHVybmVkLCBhcyBhcHByb3ByaWF0ZS4KLSovCi0KLWNoYXIgKipidWlsZGFyZ3YgKGlucHV0KQotY2hhciAqaW5wdXQ7Ci17Ci0gIGNoYXIgKmFyZzsKLSAgY2hhciAqY29weWJ1ZjsKLSAgaW50IHNxdW90ZSA9IDA7Ci0gIGludCBkcXVvdGUgPSAwOwotICBpbnQgYnNxdW90ZSA9IDA7Ci0gIGludCBhcmdjID0gMDsKLSAgaW50IG1heGFyZ2MgPSAwOwotICBjaGFyICoqYXJndiA9IE5VTEw7Ci0gIGNoYXIgKipuYXJndjsKLQotICBpZiAoaW5wdXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb3B5YnVmID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGlucHV0KSArIDEpOwotICAgICAgLyogSXMgYSBkb3t9d2hpbGUgdG8gYWx3YXlzIGV4ZWN1dGUgdGhlIGxvb3Agb25jZS4gIEFsd2F5cyByZXR1cm4gYW4KLQkgYXJndiwgZXZlbiBmb3IgbnVsbCBzdHJpbmdzLiAgU2VlIE5PVEVTIGFib3ZlLCB0ZXN0IGNhc2UgYmVsb3cuICovCi0gICAgICBkbwotCXsKLQkgIC8qIFBpY2sgb2ZmIGFyZ3ZbYXJnY10gKi8KLQkgIHdoaWxlIChpc3NwYWNlICgqaW5wdXQpKQotCSAgICB7Ci0JICAgICAgaW5wdXQrKzsKLQkgICAgfQotCSAgaWYgKChtYXhhcmdjID09IDApIHx8IChhcmdjID49IChtYXhhcmdjIC0gMSkpKQotCSAgICB7Ci0JICAgICAgLyogYXJndiBuZWVkcyBpbml0aWFsaXphdGlvbiwgb3IgZXhwYW5zaW9uICovCi0JICAgICAgaWYgKGFyZ3YgPT0gTlVMTCkKLQkJewotCQkgIG1heGFyZ2MgPSBJTklUSUFMX01BWEFSR0M7Ci0JCSAgbmFyZ3YgPSAoY2hhciAqKikgbWFsbG9jIChtYXhhcmdjICogc2l6ZW9mIChjaGFyICopKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIG1heGFyZ2MgKj0gMjsKLQkJICBuYXJndiA9IChjaGFyICoqKSByZWFsbG9jIChhcmd2LCBtYXhhcmdjICogc2l6ZW9mIChjaGFyICopKTsKLQkJfQotCSAgICAgIGlmIChuYXJndiA9PSBOVUxMKQotCQl7Ci0JCSAgaWYgKGFyZ3YgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZnJlZWFyZ3YgKGFyZ3YpOwotCQkgICAgICBhcmd2ID0gTlVMTDsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGFyZ3YgPSBuYXJndjsKLQkgICAgICBhcmd2W2FyZ2NdID0gTlVMTDsKLQkgICAgfQotCSAgLyogQmVnaW4gc2Nhbm5pbmcgYXJnICovCi0JICBhcmcgPSBjb3B5YnVmOwotCSAgd2hpbGUgKCppbnB1dCAhPSBFT1MpCi0JICAgIHsKLQkgICAgICBpZiAoaXNzcGFjZSAoKmlucHV0KSAmJiAhc3F1b3RlICYmICFkcXVvdGUgJiYgIWJzcXVvdGUpCi0JCXsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChic3F1b3RlKQotCQkgICAgewotCQkgICAgICBic3F1b3RlID0gMDsKLQkJICAgICAgKmFyZysrID0gKmlucHV0OwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCppbnB1dCA9PSAnXFwnKQotCQkgICAgewotCQkgICAgICBic3F1b3RlID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzcXVvdGUpCi0JCSAgICB7Ci0JCSAgICAgIGlmICgqaW5wdXQgPT0gJ1wnJykKLQkJCXsKLQkJCSAgc3F1b3RlID0gMDsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICAqYXJnKysgPSAqaW5wdXQ7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoZHF1b3RlKQotCQkgICAgewotCQkgICAgICBpZiAoKmlucHV0ID09ICciJykKLQkJCXsKLQkJCSAgZHF1b3RlID0gMDsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICAqYXJnKysgPSAqaW5wdXQ7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoKmlucHV0ID09ICdcJycpCi0JCQl7Ci0JCQkgIHNxdW90ZSA9IDE7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKCppbnB1dCA9PSAnIicpCi0JCQl7Ci0JCQkgIGRxdW90ZSA9IDE7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgKmFyZysrID0gKmlucHV0OwotCQkJfQotCQkgICAgfQotCQkgIGlucHV0Kys7Ci0JCX0KLQkgICAgfQotCSAgKmFyZyA9IEVPUzsKLQkgIGFyZ3ZbYXJnY10gPSBzdHJkdXAgKGNvcHlidWYpOwotCSAgaWYgKGFyZ3ZbYXJnY10gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZyZWVhcmd2IChhcmd2KTsKLQkgICAgICBhcmd2ID0gTlVMTDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgYXJnYysrOwotCSAgYXJndlthcmdjXSA9IE5VTEw7Ci0KLQkgIHdoaWxlIChpc3NwYWNlICgqaW5wdXQpKQotCSAgICB7Ci0JICAgICAgaW5wdXQrKzsKLQkgICAgfQotCX0KLSAgICAgIHdoaWxlICgqaW5wdXQgIT0gRU9TKTsKLSAgICB9Ci0gIHJldHVybiAoYXJndik7Ci19Ci0KLSNpZmRlZiBNQUlOCi0KLS8qIFNpbXBsZSBsaXR0bGUgdGVzdCBkcml2ZXIuICovCi0KLXN0YXRpYyBjaGFyICp0ZXN0c1tdID0KLXsKLSAgImEgc2ltcGxlIGNvbW1hbmQgbGluZSIsCi0gICJhcmcgJ2ZvbycgaXMgc2luZ2xlIHF1b3RlZCIsCi0gICJhcmcgXCJiYXJcIiBpcyBkb3VibGUgcXVvdGVkIiwKLSAgImFyZyBcImZvbyBiYXJcIiBoYXMgZW1iZWRkZWQgd2hpdGVzcGFjZSIsCi0gICJhcmcgJ0phY2sgc2FpZCBcXCdoaVxcJycgaGFzIHNpbmdsZSBxdW90ZXMiLAotICAiYXJnICdKYWNrIHNhaWQgXFxcImhpXFxcIicgaGFzIGRvdWJsZSBxdW90ZXMiLAotICAiYSBiIGMgZCBlIGYgZyBoIGkgaiBrIGwgbSBuIG8gcCBxIHIgcyB0IHUgdiB3IHggeSB6IDEgMiAzIDQgNSA2IDcgOCA5IiwKLSAgCi0gIC8qIFRoaXMgc2hvdWxkIGJlIGV4cGFuZGVkIGludG8gb25seSBvbmUgYXJndW1lbnQuICAqLwotICAidHJhaWxpbmctd2hpdGVzcGFjZSAiLAotCi0gICIiLAotICBOVUxMCi19OwotCi1tYWluICgpCi17Ci0gIGNoYXIgKiphcmd2OwotICBjaGFyICoqdGVzdDsKLSAgY2hhciAqKnRhcmdzOwotCi0gIGZvciAodGVzdCA9IHRlc3RzOyAqdGVzdCAhPSBOVUxMOyB0ZXN0KyspCi0gICAgewotICAgICAgcHJpbnRmICgiYnVpbGRhcmd2KFwiJXNcIilcbiIsICp0ZXN0KTsKLSAgICAgIGlmICgoYXJndiA9IGJ1aWxkYXJndiAoKnRlc3QpKSA9PSBOVUxMKQotCXsKLQkgIHByaW50ZiAoImZhaWxlZCFcblxuIik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZvciAodGFyZ3MgPSBhcmd2OyAqdGFyZ3MgIT0gTlVMTDsgdGFyZ3MrKykKLQkgICAgewotCSAgICAgIHByaW50ZiAoIlx0XCIlc1wiXG4iLCAqdGFyZ3MpOwotCSAgICB9Ci0JICBwcmludGYgKCJcbiIpOwotCX0KLSAgICAgIGZyZWVhcmd2IChhcmd2KTsKLSAgICB9Ci0KLX0KLQotI2VuZGlmCS8qIE1BSU4gKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hc3ByaW50Zi5jIGIvbGliaWJlcnR5L2FzcHJpbnRmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYWYzMjAuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2FzcHJpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKiBMaWtlIHNwcmludGYgYnV0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBtYWxsb2MnZCBzdG9yYWdlLCB3aGljaCBtdXN0Ci0gICBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgotICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWYgZGVmaW5lZCAoQU5TSV9QUk9UT1RZUEVTKSB8fCBkZWZpbmVkIChBTE1PU1RfU1REQykKLSNkZWZpbmUgVVNFX1NUREFSRwotI2VuZGlmCi0KLSNpZmRlZiBVU0VfU1REQVJHCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi0vKiBWQVJBUkdTICovCi0jaWZkZWYgVVNFX1NUREFSRwotaW50Ci1hc3ByaW50ZiAoY2hhciAqKmJ1ZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0jZWxzZQotaW50Ci1hc3ByaW50ZiAoYnVmLCBmbXQsIHZhX2FsaXN0KQotICAgICBjaGFyICoqYnVmOwotICAgICBjb25zdCBjaGFyICpmbXQ7Ci0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIGludCBzdGF0dXM7Ci0gIHZhX2xpc3QgYXA7Ci0jaWZkZWYgVVNFX1NUREFSRwotICB2YV9zdGFydCAoYXAsIGZtdCk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXApOwotI2VuZGlmCi0gIHN0YXR1cyA9IHZhc3ByaW50ZiAoYnVmLCBmbXQsIGFwKTsKLSAgdmFfZW5kIChhcCk7Ci0gIHJldHVybiBzdGF0dXM7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvYXRleGl0LmMgYi9saWJpYmVydHkvYXRleGl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzN2Q5ODUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2F0ZXhpdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogV3JhcHBlciB0byBpbXBsZW1lbnQgQU5TSSBDJ3MgYXRleGl0IHVzaW5nIFN1bk9TJ3Mgb25fZXhpdC4gKi8KLS8qIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAtLU1pa2UgU3R1bXAuICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIEhBVkVfT05fRVhJVAotCi1pbnQKLWF0ZXhpdChmKQotICAgICB2b2lkICgqZikoKTsKLXsKLSAgLyogSWYgdGhlIHN5c3RlbSBkb2Vzbid0IHByb3ZpZGUgYSBkZWZpbml0aW9uIGZvciBhdGV4aXQsIHVzZSBvbl9leGl0Ci0gICAgIGlmIHRoZSBzeXN0ZW0gcHJvdmlkZXMgdGhhdC4gICovCi0gIG9uX2V4aXQgKGYsIDApOwotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYmFzZW5hbWUuYyBiL2xpYmliZXJ0eS9iYXNlbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTQ0Yzg1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9iYXNlbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyogUmV0dXJuIHRoZSBiYXNlbmFtZSBvZiBhIHBhdGhuYW1lLgotICAgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAqLwotCi0vKgotTkFNRQotCWJhc2VuYW1lIC0tIHJldHVybiBwb2ludGVyIHRvIGxhc3QgY29tcG9uZW50IG9mIGEgcGF0aG5hbWUKLQotU1lOT1BTSVMKLQljaGFyICpiYXNlbmFtZSAoY29uc3QgY2hhciAqbmFtZSkKLQotREVTQ1JJUFRJT04KLQlHaXZlbiBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyBhIHR5cGljYWwgcGF0aG5hbWUKLQkoL3Vzci9zcmMvY21kL2xzL2xzLmMgZm9yIGV4YW1wbGUpLCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUKLQlsYXN0IGNvbXBvbmVudCBvZiB0aGUgcGF0aG5hbWUgKCJscy5jIiBpbiB0aGlzIGNhc2UpLgotCi1CVUdTCi0JUHJlc3VtZXMgYSBVTklYIHN0eWxlIHBhdGggd2l0aCBVTklYIHN0eWxlIHNlcGFyYXRvcnMuCi0qLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotY2hhciAqCi1iYXNlbmFtZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqYmFzZSA9IG5hbWU7Ci0KLSAgd2hpbGUgKCpuYW1lKQotICAgIHsKLSAgICAgIGlmICgqbmFtZSsrID09ICcvJykKLQl7Ci0JICBiYXNlID0gbmFtZTsKLQl9Ci0gICAgfQotICByZXR1cm4gKGNoYXIgKikgYmFzZTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9iY21wLmMgYi9saWJpYmVydHkvYmNtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWU0NDE3Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9iY21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBiY21wCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotLyoKLQotTkFNRQotCi0JYmNtcCAtLSBjb21wYXJlIHR3byBtZW1vcnkgcmVnaW9ucwotCi1TWU5PUFNJUwotCi0JaW50IGJjbXAgKGNoYXIgKmZyb20sIGNoYXIgKnRvLCBpbnQgY291bnQpCi0KLURFU0NSSVBUSU9OCi0KLQlDb21wYXJlIHR3byBtZW1vcnkgcmVnaW9ucyBhbmQgcmV0dXJuIHplcm8gaWYgdGhleSBhcmUgaWRlbnRpY2FsLAotCW5vbi16ZXJvIG90aGVyd2lzZS4gIElmIGNvdW50IGlzIHplcm8sIHJldHVybiB6ZXJvLgotCi1OT1RFUwotCi0JTm8gZ3VhcmFudGVlIGlzIG1hZGUgYWJvdXQgdGhlIG5vbi16ZXJvIHJldHVybmVkIHZhbHVlLiAgSW4KLQlwYXJ0aWN1bGFyLCB0aGUgcmVzdWx0cyBtYXkgYmUgc2lnbmZpY2FudGx5IGRpZmZlcmVudCB0aGFuCi0Jc3RyY21wKCksIHdoZXJlIHRoZSByZXR1cm4gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSBsZXNzIHRoYW4sCi0JZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvLCBhY2NvcmRpbmcgdG8gbGV4aWNvZ3JhcGhpY2FsCi0Jc29ydGluZyBvZiB0aGUgY29tcGFyZWQgcmVnaW9ucy4KLQotQlVHUwotCi0qLwotCi0KLWludAotYmNtcCAoZnJvbSwgdG8sIGNvdW50KQotICBjaGFyICpmcm9tLCAqdG87Ci0gIGludCBjb3VudDsKLXsKLSAgaW50IHJ0bnZhbCA9IDA7Ci0KLSAgd2hpbGUgKGNvdW50LS0gPiAwKQotICAgIHsKLSAgICAgIGlmICgqZnJvbSsrICE9ICp0bysrKQotCXsKLQkgIHJ0bnZhbCA9IDE7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gKHJ0bnZhbCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9iY29weS5jIGIvbGliaWJlcnR5L2Jjb3B5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NTUzNjMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2Jjb3B5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiBiY29weSAtLSBjb3B5IG1lbW9yeSByZWdpb25zIG9mIGFyYml0YXJ5IGxlbmd0aAotCi1OQU1FCi0JYmNvcHkgLS0gY29weSBtZW1vcnkgcmVnaW9ucyBvZiBhcmJpdHJhcnkgbGVuZ3RoCi0KLVNZTk9QU0lTCi0Jdm9pZCBiY29weSAoY2hhciAqaW4sIGNoYXIgKm91dCwgaW50IGxlbmd0aCkKLQotREVTQ1JJUFRJT04KLQlDb3B5IExFTkdUSCBieXRlcyBmcm9tIG1lbW9yeSByZWdpb24gcG9pbnRlZCB0byBieSBJTiB0byBtZW1vcnkKLQlyZWdpb24gcG9pbnRlZCB0byBieSBPVVQuCi0KLUJVR1MKLQlTaWduaWZpY2FudCBzcGVlZCBpbXByb3ZlbWVudHMgY2FuIGJlIG1hZGUgaW4gc29tZSBjYXNlcyBieQotCWltcGxlbWVudGluZyBjb3BpZXMgb2YgbXVsdGlwbGUgYnl0ZXMgc2ltdWx0YW5lb3VzbHksIG9yIHVucm9sbGluZwotCXRoZSBjb3B5IGxvb3AuCi0KLSovCi0KLXZvaWQKLWJjb3B5IChzcmMsIGRlc3QsIGxlbikKLSAgcmVnaXN0ZXIgY2hhciAqc3JjLCAqZGVzdDsKLSAgaW50IGxlbjsKLXsKLSAgaWYgKGRlc3QgPCBzcmMpCi0gICAgd2hpbGUgKGxlbi0tKQotICAgICAgKmRlc3QrKyA9ICpzcmMrKzsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKmxhc3RzID0gc3JjICsgKGxlbi0xKTsKLSAgICAgIGNoYXIgKmxhc3RkID0gZGVzdCArIChsZW4tMSk7Ci0gICAgICB3aGlsZSAobGVuLS0pCi0gICAgICAgICooY2hhciAqKWxhc3RkLS0gPSAqKGNoYXIgKilsYXN0cy0tOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9iemVyby5jIGIvbGliaWJlcnR5L2J6ZXJvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMTY0NGIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2J6ZXJvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBQb3J0YWJsZSB2ZXJzaW9uIG9mIGJ6ZXJvIGZvciBzeXN0ZW1zIHdpdGhvdXQgaXQuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotLyoKLU5BTUUKLQliemVybyAtLSB6ZXJvIHRoZSBjb250ZW50cyBvZiBhIHNwZWNpZmllZCBtZW1vcnkgcmVnaW9uCi0KLVNZTk9QU0lTCi0Jdm9pZCBiemVybyAoY2hhciAqdG8sIGludCBjb3VudCkKLQotREVTQ1JJUFRJT04KLQlaZXJvIENPVU5UIGJ5dGVzIG9mIG1lbW9yeSBwb2ludGVkIHRvIGJ5IFRPLgotCi1CVUdTCi0JU2lnbmlmaWNhbnQgc3BlZWQgZW5oYW5jZW1lbnRzIG1heSBiZSBtYWRlIGluIHNvbWUgZW52aXJvbm1lbnRzCi0JYnkgemVyb2luZyBtb3JlIHRoYW4gYSBzaW5nbGUgYnl0ZSBhdCBhIHRpbWUsIG9yIGJ5IHVucm9sbGluZyB0aGUKLQlsb29wLgotCi0qLwotCi0KLXZvaWQKLWJ6ZXJvICh0bywgY291bnQpCi0gIGNoYXIgKnRvOwotICBpbnQgY291bnQ7Ci17Ci0gIHdoaWxlIChjb3VudC0tID4gMCkKLSAgICB7Ci0gICAgICAqdG8rKyA9IDA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NhbGxvYy5jIGIvbGliaWJlcnR5L2NhbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGMwYTc4Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jYWxsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotIAotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi0vKiBGb3Igc3lzdGVtcyB3aXRoIGxhcmdlciBwb2ludGVycyB0aGFuIGludHMsIHRoaXMgbXVzdCBiZSBkZWNsYXJlZC4gICovCi1QVFIgbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotCi1QVFIKLWNhbGxvYyAobmVsZW0sIGVsc2l6ZSkKLSAgc2l6ZV90IG5lbGVtLCBlbHNpemU7Ci17Ci0gIHJlZ2lzdGVyIFBUUiBwdHI7ICAKLQotICBpZiAobmVsZW0gPT0gMCB8fCBlbHNpemUgPT0gMCkKLSAgICBuZWxlbSA9IGVsc2l6ZSA9IDE7Ci0gIAotICBwdHIgPSBtYWxsb2MgKG5lbGVtICogZWxzaXplKTsKLSAgaWYgKHB0cikgYnplcm8gKHB0ciwgbmVsZW0gKiBlbHNpemUpOwotICAKLSAgcmV0dXJuIHB0cjsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jaG9vc2UtdGVtcC5jIGIvbGliaWJlcnR5L2Nob29zZS10ZW1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YzczODYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2Nob29zZS10ZW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyogVXRpbGl0eSB0byBwaWNrIGEgdGVtcG9yYXJ5IGZpbGVuYW1lIHByZWZpeC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCi13cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBleHBvcnRzIHR3byBmdW5jdGlvbnM6IGNob29zZV90ZW1wX2Jhc2UgYW5kIG1ha2VfdGVtcF9maWxlLiAgKi8KLQotLyogVGhpcyBmaWxlIGxpdmVzIGluIGF0IGxlYXN0IHR3byBwbGFjZXM6IGxpYmliZXJ0eSBhbmQgZ2NjLgotICAgRG9uJ3QgY2hhbmdlIG9uZSB3aXRob3V0IHRoZSBvdGhlci4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+CS8qIE1heSBnZXQgUF90bXBkaXIuICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX0ZJTEVfSAotI2luY2x1ZGUgPHN5cy9maWxlLmg+ICAgLyogTWF5IGdldCBSX09LLCBldGMuIG9uIHNvbWUgc3lzdGVtcy4gICovCi0jZW5kaWYKLQotI2lmbmRlZiBSX09LCi0jZGVmaW5lIFJfT0sgNAotI2RlZmluZSBXX09LIDIKLSNkZWZpbmUgWF9PSyAxCi0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotZXh0ZXJuIGludCBta3N0ZW1wcyAoKTsKLQotI2lmbmRlZiBJTl9HQ0MKLSNpZiBkZWZpbmVkIChfX01TRE9TX18pIHx8IGRlZmluZWQgKF9XSU4zMikKLSNkZWZpbmUgRElSX1NFUEFSQVRPUiAnXFwnCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIERJUl9TRVBBUkFUT1IKLSNkZWZpbmUgRElSX1NFUEFSQVRPUiAnLycKLSNlbmRpZgotCi0vKiBPbiBNU0RPUywgd3JpdGUgdGVtcCBmaWxlcyBpbiBjdXJyZW50IGRpcgotICAgYmVjYXVzZSB0aGVyZSdzIG5vIHBsYWNlIGVsc2Ugd2UgY2FuIGV4cGVjdCB0byB1c2UuICAqLwotLyogPz8/IEFsdGhvdWdoIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyB0cmllZCBhcyBhIGxhc3QgcmVzb3J0LAotICAgdGhpcyBpcyBsZWZ0IGluIHNvIHRoYXQgb24gTVNET1MgaXQgaXMgcHJlZmVycmVkIHRvIC90bXAgb24gdGhlCi0gICBvZmYgY2hhbmNlIHRoYXQgc29tZW9uZSByZXF1aXJlcyB0aGlzLCBzaW5jZSB0aGF0IHdhcyB0aGUgcHJldmlvdXMKLSAgIGJlaGF2aW91ci4gICovCi0jaWZkZWYgX19NU0RPU19fCi0jaWZuZGVmIFBfdG1wZGlyCi0jZGVmaW5lIFBfdG1wZGlyICIuIgotI2VuZGlmCi0jZW5kaWYKLQotLyogTmFtZSBvZiB0ZW1wb3JhcnkgZmlsZS4KLSAgIG1rdGVtcCByZXF1aXJlcyA2IHRyYWlsaW5nIFgncy4gICovCi0jZGVmaW5lIFRFTVBfRklMRSAiY2NYWFhYWFgiCi0KLS8qIFN1YnJvdXRpbmUgb2YgY2hvb3NlX3RlbXBfYmFzZS4KLSAgIElmIEJBU0UgaXMgbm9uLU5VTEwsIHJldHVybiBpdC4KLSAgIE90aGVyd2lzZSBpdCBjaGVja3MgaWYgRElSIGlzIGEgdXNhYmxlIGRpcmVjdG9yeS4KLSAgIElmIHN1Y2Nlc3MsIERJUiBpcyByZXR1cm5lZC4KLSAgIE90aGVyd2lzZSBOVUxMIGlzIHJldHVybmVkLiAgKi8KLQotc3RhdGljIGNoYXIgKgotdHJ5IChkaXIsIGJhc2UpCi0gICAgIGNoYXIgKmRpciwgKmJhc2U7Ci17Ci0gIGlmIChiYXNlICE9IDApCi0gICAgcmV0dXJuIGJhc2U7Ci0gIGlmIChkaXIgIT0gMAotICAgICAgJiYgYWNjZXNzIChkaXIsIFJfT0sgfCBXX09LIHwgWF9PSykgPT0gMCkKLSAgICByZXR1cm4gZGlyOwotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIGEgcHJlZml4IGZvciB0ZW1wb3JhcnkgZmlsZSBuYW1lcyBvciBOVUxMIGlmIHVuYWJsZSB0byBmaW5kIG9uZS4KLSAgIFRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBjaG9zZW4gaWYgYWxsIGVsc2UgZmFpbHMgc28gdGhlIHByb2dyYW0gaXMKLSAgIGV4aXRlZCBpZiBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgY2FuJ3QgYmUgZm91bmQgKG1rdGVtcCBmYWlscykuCi0gICBUaGUgYnVmZmVyIGZvciB0aGUgcmVzdWx0IGlzIG9idGFpbmVkIHdpdGggeG1hbGxvYy4gCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5IG9ubHkuICBJdCB1c2UKLSAgIGlzIG5vdCByZWNvbW1lbmRlZC4gICovCi0KLWNoYXIgKgotY2hvb3NlX3RlbXBfYmFzZSAoKQotewotICBjaGFyICpiYXNlID0gMDsKLSAgY2hhciAqdGVtcF9maWxlbmFtZTsKLSAgaW50IGxlbjsKLSAgc3RhdGljIGNoYXIgdG1wW10gPSB7IERJUl9TRVBBUkFUT1IsICd0JywgJ20nLCAncCcsIDAgfTsKLSAgc3RhdGljIGNoYXIgdXNydG1wW10gPSB7IERJUl9TRVBBUkFUT1IsICd1JywgJ3MnLCAncicsIERJUl9TRVBBUkFUT1IsICd0JywgJ20nLCAncCcsIDAgfTsKLQotICBiYXNlID0gdHJ5IChnZXRlbnYgKCJUTVBESVIiKSwgYmFzZSk7Ci0gIGJhc2UgPSB0cnkgKGdldGVudiAoIlRNUCIpLCBiYXNlKTsKLSAgYmFzZSA9IHRyeSAoZ2V0ZW52ICgiVEVNUCIpLCBiYXNlKTsKLQotI2lmZGVmIFBfdG1wZGlyCi0gIGJhc2UgPSB0cnkgKFBfdG1wZGlyLCBiYXNlKTsKLSNlbmRpZgotCi0gIC8qIFRyeSAvdXNyL3RtcCwgdGhlbiAvdG1wLiAgKi8KLSAgYmFzZSA9IHRyeSAodXNydG1wLCBiYXNlKTsKLSAgYmFzZSA9IHRyeSAodG1wLCBiYXNlKTsKLSAKLSAgLyogSWYgYWxsIGVsc2UgZmFpbHMsIHVzZSB0aGUgY3VycmVudCBkaXJlY3RvcnkhICAqLwotICBpZiAoYmFzZSA9PSAwKQotICAgIGJhc2UgPSAiLiI7Ci0KLSAgbGVuID0gc3RybGVuIChiYXNlKTsKLSAgdGVtcF9maWxlbmFtZSA9IHhtYWxsb2MgKGxlbiArIDEgLypESVJfU0VQQVJBVE9SKi8KLQkJCSAgICsgc3RybGVuIChURU1QX0ZJTEUpICsgMSk7Ci0gIHN0cmNweSAodGVtcF9maWxlbmFtZSwgYmFzZSk7Ci0KLSAgaWYgKGxlbiAhPSAwCi0gICAgICAmJiB0ZW1wX2ZpbGVuYW1lW2xlbi0xXSAhPSAnLycKLSAgICAgICYmIHRlbXBfZmlsZW5hbWVbbGVuLTFdICE9IERJUl9TRVBBUkFUT1IpCi0gICAgdGVtcF9maWxlbmFtZVtsZW4rK10gPSBESVJfU0VQQVJBVE9SOwotICBzdHJjcHkgKHRlbXBfZmlsZW5hbWUgKyBsZW4sIFRFTVBfRklMRSk7Ci0KLSAgbWt0ZW1wICh0ZW1wX2ZpbGVuYW1lKTsKLSAgaWYgKHN0cmxlbiAodGVtcF9maWxlbmFtZSkgPT0gMCkKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIHRlbXBfZmlsZW5hbWU7Ci19Ci0vKiBSZXR1cm4gYSB0ZW1wb3JhcnkgZmlsZSBuYW1lIChhcyBhIHN0cmluZykgb3IgTlVMTCBpZiB1bmFibGUgdG8gY3JlYXRlCi0gICBvbmUuICAqLwotCi1jaGFyICoKLW1ha2VfdGVtcF9maWxlIChzdWZmaXgpCi0gICAgIGNoYXIgKnN1ZmZpeDsKLXsKLSAgY2hhciAqYmFzZSA9IDA7Ci0gIGNoYXIgKnRlbXBfZmlsZW5hbWU7Ci0gIGludCBiYXNlX2xlbiwgc3VmZml4X2xlbjsKLSAgaW50IGZkOwotICBzdGF0aWMgY2hhciB0bXBbXSA9IHsgRElSX1NFUEFSQVRPUiwgJ3QnLCAnbScsICdwJywgMCB9OwotICBzdGF0aWMgY2hhciB1c3J0bXBbXSA9IHsgRElSX1NFUEFSQVRPUiwgJ3UnLCAncycsICdyJywgRElSX1NFUEFSQVRPUiwgJ3QnLCAnbScsICdwJywgMCB9OwotCi0gIGJhc2UgPSB0cnkgKGdldGVudiAoIlRNUERJUiIpLCBiYXNlKTsKLSAgYmFzZSA9IHRyeSAoZ2V0ZW52ICgiVE1QIiksIGJhc2UpOwotICBiYXNlID0gdHJ5IChnZXRlbnYgKCJURU1QIiksIGJhc2UpOwotCi0jaWZkZWYgUF90bXBkaXIKLSAgYmFzZSA9IHRyeSAoUF90bXBkaXIsIGJhc2UpOwotI2VuZGlmCi0KLSAgLyogVHJ5IC91c3IvdG1wLCB0aGVuIC90bXAuICAqLwotICBiYXNlID0gdHJ5ICh1c3J0bXAsIGJhc2UpOwotICBiYXNlID0gdHJ5ICh0bXAsIGJhc2UpOwotIAotICAvKiBJZiBhbGwgZWxzZSBmYWlscywgdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSEgICovCi0gIGlmIChiYXNlID09IDApCi0gICAgYmFzZSA9ICIuIjsKLQotICBiYXNlX2xlbiA9IHN0cmxlbiAoYmFzZSk7Ci0KLSAgaWYgKHN1ZmZpeCkKLSAgICBzdWZmaXhfbGVuID0gc3RybGVuIChzdWZmaXgpOwotICBlbHNlCi0gICAgc3VmZml4X2xlbiA9IDA7Ci0KLSAgdGVtcF9maWxlbmFtZSA9IHhtYWxsb2MgKGJhc2VfbGVuICsgMSAvKkRJUl9TRVBBUkFUT1IqLwotCQkJICAgKyBzdHJsZW4gKFRFTVBfRklMRSkKLQkJCSAgICsgc3VmZml4X2xlbiArIDEpOwotICBzdHJjcHkgKHRlbXBfZmlsZW5hbWUsIGJhc2UpOwotCi0gIGlmIChiYXNlX2xlbiAhPSAwCi0gICAgICAmJiB0ZW1wX2ZpbGVuYW1lW2Jhc2VfbGVuLTFdICE9ICcvJwotICAgICAgJiYgdGVtcF9maWxlbmFtZVtiYXNlX2xlbi0xXSAhPSBESVJfU0VQQVJBVE9SKQotICAgIHRlbXBfZmlsZW5hbWVbYmFzZV9sZW4rK10gPSBESVJfU0VQQVJBVE9SOwotICBzdHJjcHkgKHRlbXBfZmlsZW5hbWUgKyBiYXNlX2xlbiwgVEVNUF9GSUxFKTsKLQotICBpZiAoc3VmZml4KQotICAgIHN0cmNhdCAodGVtcF9maWxlbmFtZSwgc3VmZml4KTsKLQotICBmZCA9IG1rc3RlbXBzICh0ZW1wX2ZpbGVuYW1lLCBzdWZmaXhfbGVuKTsKLSAgLyogSWYgbWtzdGVtcHMgZmFpbGVkLCB0aGVuIHNvbWV0aGluZyBiYWQgaXMgaGFwcGVuaW5nLiAgTWF5YmUgd2Ugc2hvdWxkCi0gICAgIGlzc3VlIGEgbWVzc2FnZSBhYm91dCBhIHBvc3NpYmxlIHNlY3VyaXR5IGF0dGFjayBpbiBwcm9ncmVzcz8gICovCi0gIGlmIChmZCA9PSAtMSkKLSAgICBhYm9ydCAoKTsKLSAgLyogU2ltaWxhcmx5IGlmIHdlIGNhbiBub3QgY2xvc2UgdGhlIGZpbGUuICAqLwotICBpZiAoY2xvc2UgKGZkKSkKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIHRlbXBfZmlsZW5hbWU7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvY2xvY2suYyBiL2xpYmliZXJ0eS9jbG9jay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjI1MDljLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jbG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyogQU5TSS1jb21wYXRpYmxlIGNsb2NrIGZ1bmN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQotc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCi10ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLUFzIGEgc3BlY2lhbCBleGNlcHRpb24sIGlmIHlvdSBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIGZpbGVzCi1jb21waWxlZCB3aXRoIGEgR05VIGNvbXBpbGVyIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcyBkb2VzIG5vdCBjYXVzZQotdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeQotdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWZkZWYgSEFWRV9HRVRSVVNBR0UKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1RJTUVTCi0jaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3RpbWVzLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWZkZWYgX1NDX0NMS19UQ0sKLSNkZWZpbmUgR05VX0haICBzeXNjb25mKF9TQ19DTEtfVENLKQotI2Vsc2UKLSNpZmRlZiBIWgotI2RlZmluZSBHTlVfSFogIEhaCi0jZWxzZQotI2lmZGVmIENMT0NLU19QRVJfU0VDCi0jZGVmaW5lIEdOVV9IWiAgQ0xPQ0tTX1BFUl9TRUMKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotLyogRklYTUU6IHNob3VsZCBiZSBhYmxlIHRvIGRlY2xhcmUgYXMgY2xvY2tfdC4gKi8KLQotbG9uZwotY2xvY2sgKCkKLXsKLSNpZmRlZiBIQVZFX0dFVFJVU0FHRQotICBzdHJ1Y3QgcnVzYWdlIHJ1c2FnZTsKLQotICBnZXRydXNhZ2UgKDAsICZydXNhZ2UpOwotICByZXR1cm4gKHJ1c2FnZS5ydV91dGltZS50dl9zZWMgKiAxMDAwMDAwICsgcnVzYWdlLnJ1X3V0aW1lLnR2X3VzZWMKLQkgICsgcnVzYWdlLnJ1X3N0aW1lLnR2X3NlYyAqIDEwMDAwMDAgKyBydXNhZ2UucnVfc3RpbWUudHZfdXNlYyk7Ci0jZWxzZQotI2lmZGVmIEhBVkVfVElNRVMKLSAgc3RydWN0IHRtcyB0bXM7Ci0KLSAgdGltZXMgKCZ0bXMpOwotICByZXR1cm4gKHRtcy50bXNfdXRpbWUgKyB0bXMudG1zX3N0aW1lKSAqICgxMDAwMDAwIC8gR05VX0haKTsKLSNlbHNlCi0jaWZkZWYgVk1TCi0gIHN0cnVjdAotICAgIHsKLSAgICAgIGludCBwcm9jX3VzZXJfdGltZTsKLSAgICAgIGludCBwcm9jX3N5c3RlbV90aW1lOwotICAgICAgaW50IGNoaWxkX3VzZXJfdGltZTsKLSAgICAgIGludCBjaGlsZF9zeXN0ZW1fdGltZTsKLSAgICB9IHZtc190aW1lczsKLQotICB0aW1lcyAoJnZtc190aW1lcyk7Ci0gIHJldHVybiAodm1zX3RpbWVzLnByb2NfdXNlcl90aW1lICsgdm1zX3RpbWVzLnByb2Nfc3lzdGVtX3RpbWUpICogMTAwMDA7Ci0jZWxzZQotICAvKiBBIGZhbGxiYWNrLCBpZiBub3RoaW5nIGVsc2UgYXZhaWxhYmxlLiAqLwotICByZXR1cm4gMDsKLSNlbmRpZiAvKiBWTVMgKi8KLSNlbmRpZiAvKiBIQVZFX1RJTUVTICovCi0jZW5kaWYgLyogSEFWRV9HRVRSVVNBR0UgKi8KLX0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmNhdC5jIGIvbGliaWJlcnR5L2NvbmNhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjEzMmM4Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25jYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKiBDb25jYXRlbmF0ZSB2YXJpYWJsZSBudW1iZXIgb2Ygc3RyaW5ncy4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyoKLQotTkFNRQotCi0JY29uY2F0IC0tIGNvbmNhdGVuYXRlIGEgdmFyaWFibGUgbnVtYmVyIG9mIHN0cmluZ3MKLQotU1lOT1BTSVMKLQotCSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0KLQljaGFyICpjb25jYXQgKHMxLCBzMiwgczMsIC4uLiwgTlVMTCkKLQotREVTQ1JJUFRJT04KLQotCUNvbmNhdGVuYXRlIGEgdmFyaWFibGUgbnVtYmVyIG9mIHN0cmluZ3MgYW5kIHJldHVybiB0aGUgcmVzdWx0Ci0JaW4gZnJlc2hseSBtYWxsb2MnZCBtZW1vcnkuCi0KLQlSZXR1cm5zIE5VTEwgaWYgaW5zdWZmaWNpZW50IG1lbW9yeSBpcyBhdmFpbGFibGUuICBUaGUgYXJndW1lbnQKLQlsaXN0IGlzIHRlcm1pbmF0ZWQgYnkgdGhlIGZpcnN0IE5VTEwgcG9pbnRlciBlbmNvdW50ZXJlZC4gIFBvaW50ZXJzCi0JdG8gZW1wdHkgc3RyaW5ncyBhcmUgaWdub3JlZC4KLQotTk9URVMKLQotCVRoaXMgZnVuY3Rpb24gdXNlcyB4bWFsbG9jKCkgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYmUgYSBmcm9udCBlbmQKLQlmdW5jdGlvbiB0byBtYWxsb2MoKSB0aGF0IGRlYWxzIHdpdGggbG93IG1lbW9yeSBzaXR1YXRpb25zLiAgSW4KLQl0eXBpY2FsIHVzZSwgaWYgbWFsbG9jKCkgcmV0dXJucyBOVUxMIHRoZW4geG1hbGxvYygpIGRpdmVydHMgdG8gYW4KLQllcnJvciBoYW5kbGVyIHJvdXRpbmUgd2hpY2ggbmV2ZXIgcmV0dXJucywgYW5kIHRodXMgeG1hbGxvYyB3aWxsCi0JbmV2ZXIgcmV0dXJuIGEgTlVMTCBwb2ludGVyLiAgSWYgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiB3aXNoZXMgdG8KLQlkZWFsIHdpdGggbG93IG1lbW9yeSBzaXR1YXRpb25zIGl0c2VsZiwgaXQgc2hvdWxkIHN1cHBseSBhbiB4bWFsbG9jCi0JdGhhdCBqdXN0IGRpcmVjdGx5IGludm9rZXMgbWFsbG9jIGFuZCBibGluZGx5IHJldHVybnMgd2hhdGV2ZXIKLQltYWxsb2MgcmV0dXJucy4KLSovCi0KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotZXh0ZXJuIHNpemVfdCBzdHJsZW4gKGNvbnN0IGNoYXIgKnMpOwotI2Vsc2UKLWV4dGVybiBpbnQgc3RybGVuICgpOwotI2VuZGlmCi0KLSNkZWZpbmUgTlVMTFAgKGNoYXIgKikwCi0KLS8qIFZBUkFSR1MgKi8KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLWNoYXIgKgotY29uY2F0IChjb25zdCBjaGFyICpmaXJzdCwgLi4uKQotI2Vsc2UKLWNoYXIgKgotY29uY2F0ICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgcmVnaXN0ZXIgaW50IGxlbmd0aDsKLSAgcmVnaXN0ZXIgY2hhciAqbmV3c3RyOwotICByZWdpc3RlciBjaGFyICplbmQ7Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmFyZzsKLSAgdmFfbGlzdCBhcmdzOwotI2lmbmRlZiBBTlNJX1BST1RPVFlQRVMKLSAgY29uc3QgY2hhciAqZmlyc3Q7Ci0jZW5kaWYKLQotICAvKiBGaXJzdCBjb21wdXRlIHRoZSBzaXplIG9mIHRoZSByZXN1bHQgYW5kIGdldCBzdWZmaWNpZW50IG1lbW9yeS4gKi8KLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotICB2YV9zdGFydCAoYXJncywgZmlyc3QpOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBmaXJzdCA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKTsKLSNlbmRpZgotCi0gIGlmIChmaXJzdCA9PSBOVUxMUCkKLSAgICBsZW5ndGggPSAwOwotICBlbHNlCi0gICAgewotICAgICAgbGVuZ3RoID0gc3RybGVuIChmaXJzdCk7Ci0gICAgICB3aGlsZSAoKGFyZyA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKSkgIT0gTlVMTFApCi0JewotCSAgbGVuZ3RoICs9IHN0cmxlbiAoYXJnKTsKLQl9Ci0gICAgfQotICBuZXdzdHIgPSAoY2hhciAqKSB4bWFsbG9jIChsZW5ndGggKyAxKTsKLSAgdmFfZW5kIChhcmdzKTsKLQotICAvKiBOb3cgY29weSB0aGUgaW5kaXZpZHVhbCBwaWVjZXMgdG8gdGhlIHJlc3VsdCBzdHJpbmcuICovCi0KLSAgaWYgKG5ld3N0ciAhPSBOVUxMUCkKLSAgICB7Ci0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0gICAgICB2YV9zdGFydCAoYXJncywgZmlyc3QpOwotI2Vsc2UKLSAgICAgIHZhX3N0YXJ0IChhcmdzKTsKLSAgICAgIGZpcnN0ID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopOwotI2VuZGlmCi0gICAgICBlbmQgPSBuZXdzdHI7Ci0gICAgICBpZiAoZmlyc3QgIT0gTlVMTFApCi0JewotCSAgYXJnID0gZmlyc3Q7Ci0JICB3aGlsZSAoKmFyZykKLQkgICAgewotCSAgICAgICplbmQrKyA9ICphcmcrKzsKLQkgICAgfQotCSAgd2hpbGUgKChhcmcgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIgKikpICE9IE5VTExQKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKCphcmcpCi0JCXsKLQkJICAqZW5kKysgPSAqYXJnKys7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgICplbmQgPSAnXDAwMCc7Ci0gICAgICB2YV9lbmQgKGFyZ3MpOwotICAgIH0KLQotICByZXR1cm4gKG5ld3N0cik7Ci19Ci0KLSNpZmRlZiBNQUlOCi0KLS8qIFNpbXBsZSBsaXR0bGUgdGVzdCBkcml2ZXIuICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQKLW1haW4gKCkKLXsKLSAgcHJpbnRmICgiXCJcIiA9IFwiJXNcIlxuIiwgY29uY2F0IChOVUxMUCkpOwotICBwcmludGYgKCJcImFcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYSIsIE5VTExQKSk7Ci0gIHByaW50ZiAoIlwiYWJcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYSIsICJiIiwgTlVMTFApKTsKLSAgcHJpbnRmICgiXCJhYmNcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYSIsICJiIiwgImMiLCBOVUxMUCkpOwotICBwcmludGYgKCJcImFiY2RcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYWIiLCAiY2QiLCBOVUxMUCkpOwotICBwcmludGYgKCJcImFiY2RlXCIgPSBcIiVzXCJcbiIsIGNvbmNhdCAoImFiIiwgImMiLCAiZGUiLCBOVUxMUCkpOwotICBwcmludGYgKCJcImFiY2RlZlwiID0gXCIlc1wiXG4iLCBjb25jYXQgKCIiLCAiYSIsICIiLCAiYmNkIiwgImVmIiwgTlVMTFApKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy5oLXZtcyBiL2xpYmliZXJ0eS9jb25maWcuaC12bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYWM2YTIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy5oLXZtcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSNpZm5kZWYgTkVFRF9zdHJlcnJvcgotI2RlZmluZSBORUVEX3N0cmVycm9yCi0jZW5kaWYKLSNpZm5kZWYgTkVFRF9iYXNlbmFtZQotI2RlZmluZSBORUVEX2Jhc2VuYW1lCi0jZW5kaWYKLSNpZm5kZWYgTkVFRF9wc2lnbmFsCi0jZGVmaW5lIE5FRURfcHNpZ25hbAotI2VuZGlmCi0jaWZuZGVmIE5FRURfb25fZXhpdAotI2RlZmluZSBORUVEX29uX2V4aXQKLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnLmluIGIvbGliaWJlcnR5L2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3MmQ4Ni4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPHN5cy93YWl0Lmg+IHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19XQUlUX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDx2Zm9yay5oPi4gICovCi0jdW5kZWYgSEFWRV9WRk9SS19ICi0KLS8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBwaWRfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIHZmb3JrIGFzIGZvcmsgaWYgdmZvcmsgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgdmZvcmsKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNfZXJybGlzdCB2YXJpYWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfRVJSTElTVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c19uZXJyIHZhcmlhYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19ORVJSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzX3NpZ2xpc3QgdmFyaWFibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1NJR0xJU1QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJlcnJvciBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJFUlJPUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGFzcHJpbnRmIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0FTUFJJTlRGCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYXRleGl0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0FURVhJVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGJhc2VuYW1lIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0JBU0VOQU1FCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYmNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9CQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYmNvcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQkNPUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBiemVybyBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9CWkVSTwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGNhbGxvYyBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9DQUxMT0MKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBjbG9jayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9DTE9DSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHJ1c2FnZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRSVVNBR0UKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpbmRleCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9JTkRFWAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGluc3F1ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9JTlNRVUUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1jaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTUVNQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01FTUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1lbWNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NRU1DUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1tb3ZlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01FTU1PVkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1zZXQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTUVNU0VUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgb25fZXhpdCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9PTl9FWElUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHNpZ25hbCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QU0lHTkFMCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcmFuZG9tIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1JBTkRPTQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJlbmFtZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9SRU5BTUUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByaW5kZXggZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUklOREVYCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lnc2V0bWFzayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TSUdTRVRNQVNLCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmR1cCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJEVVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJlcnJvciBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJFUlJPUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cm5jYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUk5DQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RycmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3Ryc2lnbmFsIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUlNJR05BTAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnN0ciBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJTVFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJ0b2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSVE9ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RydG9sIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUlRPTAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnRvdWwgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSVE9VTAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c2NvbmYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1lTQ09ORgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRpbWVzIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUVTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdG1wbmFtIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1RNUE5BTQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHZhc3ByaW50ZiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9WQVNQUklOVEYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB2ZnByaW50ZiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9WRlBSSU5URgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHZwcmludGYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVlBSSU5URgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHZzcHJpbnRmIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1ZTUFJJTlRGCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgd2FpdHBpZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9XQUlUUElECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0ZJTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcudGFibGUgYi9saWJpYmVydHkvY29uZmlnLnRhYmxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTEzYjIzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWcudGFibGUKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1jYXNlICIke2hvc3R9IiBpbgotICByczYwMDAtaWJtLWFpeDMuMSB8IHJzNjAwMC1pYm0tYWl4KQotICAgICAgICAgICAgICAgICAgICAgICAgZnJhZz1taC1haXggOzsKLSAgKi0qLWN4dXg3KikJCWZyYWc9bWgtY3h1eDcgOzsKLSAgKi0qLWZyZWVic2QyLjEuKikJZnJhZz1taC1mYnNkMjEgOzsKLSAgKi0qLWZyZWVic2QyLjIuWzAxMl0pCWZyYWc9bWgtZmJzZDIxIDs7Ci0gIGlbMzQ1XTg2LSotd2luZG93cyopCWZyYWc9bWgtd2luZG93cyA7OwotICAqLSotYmVvcyopCQlmcmFnPW1oLWJlb3MgOzsKLWVzYWMKLQotZnJhZ3M9JGZyYWcKLQotIyBJZiB0aGV5IGRpZG4ndCBzcGVjaWZ5IC0tZW5hYmxlLXNoYXJlZCwgZG9uJ3QgZ2VuZXJhdGUgc2hhcmVkIGxpYnMuCi1jYXNlICIke2VuYWJsZV9zaGFyZWR9IiBpbgotICB5ZXMpIHNoYXJlZD15ZXMgOzsKLSAgbm8pIHNoYXJlZD1ubyA7OwotICAiIikgc2hhcmVkPW5vIDs7Ci0gICopIHNoYXJlZD15ZXMgOzsKLWVzYWMKLWlmIFsgIiR7c2hhcmVkfSIgPSAieWVzIiBdOyB0aGVuCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0gICAgKi0qLWN5Z3dpbiopCTs7Ci0gICAgYWxwaGEqLSotbGludXgqKQlmcmFncz0iJHtmcmFnc30gLi4vLi4vY29uZmlnL21oLWVsZmFscGhhcGljIiA7OwotICAgIGFybSotKi0qKQkJZnJhZ3M9IiR7ZnJhZ3N9IC4uLy4uL2NvbmZpZy9taC1hcm1waWMiIDs7Ci0gICAgaHBwYSotKi0qKQkJZnJhZ3M9IiR7ZnJhZ3N9IC4uLy4uL2NvbmZpZy9taC1wYXBpYyIgOzsKLSAgICBpWzM0NTZdODYtKi0qKQlmcmFncz0iJHtmcmFnc30gLi4vLi4vY29uZmlnL21oLXg4NnBpYyIgOzsKLSAgICBwb3dlcnBjKi0qLWFpeCopCTs7Ci0gICAgcG93ZXJwYyotKi0qKQlmcmFncz0iJHtmcmFnc30gLi4vLi4vY29uZmlnL21oLXBwY3BpYyIgOzsKLSAgICAqLSotKikJCWZyYWdzPSIke2ZyYWdzfSAuLi8uLi9jb25maWcvbWgtJHtob3N0X2NwdX1waWMiIDs7Ci0gIGVzYWMKLWZpCi0KLWVjaG8gIiMgV2FybmluZzogdGhpcyBmcmFnbWVudCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCIgPiB0ZW1wLWZyYWcKLQotZm9yIGZyYWcgaW4gJHtmcmFnc307IGRvCi0gIGNhc2UgJHtmcmFnfSBpbgotICAgIC4uLyogKQotICAgICAgaWYgWyAke3NyY2Rpcn0gPSAuIF07IHRoZW4KLQlbIC1uICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iIF0gJiYgZnJhZz0uLi8ke2ZyYWd9Ci0JWyAtbiAiJHt3aXRoX211bHRpc3JjdG9wfSIgXSAmJiBmcmFnPSR7d2l0aF9tdWx0aXNyY3RvcH0ke2ZyYWd9Ci0gICAgICBmaQotICAgICAgOzsKLSAgZXNhYwotICBmcmFnPSR7c3JjZGlyfS8ke3hzcmNkaXJ9Y29uZmlnLyRmcmFnCi0gIGlmIFsgLWYgJHtmcmFnfSBdOyB0aGVuCi0gICAgZWNobyAiQXBwZW5kaW5nICR7ZnJhZ30gdG8geGhvc3QtbWtmcmFnIgotICAgIGVjaG8gIiMgRm9sbG93aW5nIGZyYWdtZW50IGNvcGllZCBmcm9tICR7ZnJhZ30iID4+IHRlbXAtZnJhZwotICAgIGNhdCAke2ZyYWd9ID4+IHRlbXAtZnJhZwotICBmaQotZG9uZQotCi0jIHJlY29yZCBpZiB3ZSB3YW50IHRvIGJ1aWxkIHNoYXJlZCBsaWJzLgotaWYgWyAiJHtzaGFyZWR9IiA9ICJ5ZXMiIF07IHRoZW4KLSAgZWNobyBlbmFibGVfc2hhcmVkID0geWVzID4+IHRlbXAtZnJhZwotZWxzZQotICBlY2hvIGVuYWJsZV9zaGFyZWQgPSBubyA+PiB0ZW1wLWZyYWcKLWZpCi0KLWZyYWc9eGhvc3QtbWtmcmFnCi0ke0NPTkZJR19TSEVMTH0gJHtsaWJpYmVydHlfdG9wZGlyfS9tb3ZlLWlmLWNoYW5nZSB0ZW1wLWZyYWcgeGhvc3QtbWtmcmFnCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnL21oLWFpeCBiL2xpYmliZXJ0eS9jb25maWcvbWgtYWl4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjY0NTA1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWcvbWgtYWl4CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jIFRoaXMgZmlsZSBpcyBvbmx5IG5lZWRlZCBieSBBSVggMy4xLgotSERFRklORVMgPSAtRF9fSUVFRV9CSUdfRU5ESUFOCi0KLSMgTW9zdCByZWxlYXNlcyBvZiBBSVggMy4xIGluY2x1ZGUgYW4gaW5jb3JyZWN0IGludGVybmFsIHZlcnNpb24gb2YgY29weXNpZ24KLSMgaW4gbGliYy5hIGZvciB1c2UgYnkgc29tZSBsaWJjIHB1YmxpYyBmdW5jdGlvbnMgaW5jbHVkaW5nIG1vZGYuICBUaGUgcHVibGljCi0jIHZlcnNpb24gb2YgY29weXNpZ24gaW4gbGlibS5hIGlzIHVzYWJsZS4gIEZvciB0aGUgc2FrZSBvZiBsaWJnKysgKHdoaWNoCi0jIHVzZXMgbW9kZiksIHdlIGFkZCBjb3B5c2lnbiBoZXJlLiAgU3VwcG9zZWRseSwgdGhpcyBwcm9ibGVtIGlzIGZpeGVkIGluIEFJWAotIyAzLjEuOCBhbmQgYWJvdmUsIGluY2x1ZGluZyBhbGwgcmVsZWFzZXMgb2YgQUlYIDMuMi4KLUVYVFJBX09GSUxFUyA9IGNvcHlzaWduLm8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcvbWgtYmVvcyBiL2xpYmliZXJ0eS9jb25maWcvbWgtYmVvcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3NWU3ZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnL21oLWJlb3MKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgSG9zdCBtYWtlZmlsZSBmcmFnbWVudCBmb3IgQmVPUwotCi0jIFRoaXMgaXMgYSB0ZW1wb3JhcnkgaGFjayB1bnRpbCB0aGUgd2ltcHkgZGVmYXVsdCA2NGsgc3RhY2sKLSMgbGltaXQgaW4gQmVPUyBpcyBlaXRoZXIgaW5jcmVhc2VkIG9yIG1hZGUgdXNlciBzZXR0YWJsZSBzb21laG93LgotIyBUaGlzIHByb2JhYmx5IHdvbid0IGhhcHBlbiB1bnRpbCBhZnRlciB0aGUgRFI5IHJlbGVhc2UuCi0KLUVYVFJBX09GSUxFUyA9IGFsbG9jYS5vCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnL21oLWN4dXg3IGIvbGliaWJlcnR5L2NvbmZpZy9taC1jeHV4NwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkyNGIwOC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnL21oLWN4dXg3CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotSERFRklORVMgPSAtREhBUlJJU19GTE9BVF9GT1JNQVQKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcvbWgtZmJzZDIxIGIvbGliaWJlcnR5L2NvbmZpZy9taC1mYnNkMjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNzVhNzguLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy9taC1mYnNkMjEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FWFRSQV9PRklMRVM9dmFzcHJpbnRmLm8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcvbWgtd2luZG93cyBiL2xpYmliZXJ0eS9jb25maWcvbWgtd2luZG93cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmNWY3OS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnL21oLXdpbmRvd3MKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FWFRSQV9PRklMRVM9YXNwcmludGYubyBzdHJjYXNlY21wLm8gc3RybmNhc2VjbXAubyB2YXNwcmludGYubwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZ3VyZSBiL2xpYmliZXJ0eS9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3NTU1MTAuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDI4NTAgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC10YXJnZXQtc3ViZGlyPVNVQkRJUiAgICAgIENvbmZpZ3VyaW5nIGluIGEgc3ViZGlyZWN0b3J5IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWNyb3NzLWhvc3Q9SE9TVCAgICAgICAgICAgQ29uZmlndXJpbmcgd2l0aCBhIGNyb3NzIGNvbXBpbGVyIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLW5ld2xpYiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJpbmcgd2l0aCBuZXdsaWIiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPXBleGVjdXRlLmMKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGVsc2UKLSAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGZpCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdGFyZ2V0LXN1YmRpciBvciAtLXdpdGhvdXQtdGFyZ2V0LXN1YmRpciB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfdGFyZ2V0X3N1YmRpcitzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF90YXJnZXRfc3ViZGlyIgotICA6Ci1maQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWNyb3NzLWhvc3Qgb3IgLS13aXRob3V0LWNyb3NzLWhvc3Qgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2Nyb3NzX2hvc3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfY3Jvc3NfaG9zdCIKLSAgOgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1uZXdsaWIgb3IgLS13aXRob3V0LW5ld2xpYiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfbmV3bGliK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX25ld2xpYiIKLSAgOgotZmkKLQotCi1pZiB0ZXN0ICIke3NyY2Rpcn0iID0gIi4iOyB0aGVuCi0gIGlmIHRlc3QgLXogIiR7d2l0aF90YXJnZXRfc3ViZGlyfSI7IHRoZW4KLSAgICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vLi4iCi0gIGVsc2UKLSAgICBpZiB0ZXN0ICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iICE9ICIuIjsgdGhlbgotICAgICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9LyR7d2l0aF9tdWx0aXNyY3RvcH0uLi8uLiIKLSAgICBlbHNlCi0gICAgICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vJHt3aXRoX211bHRpc3JjdG9wfS4uIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8uLiIKLWZpCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkbGliaWJlcnR5X3RvcGRpciAkc3JjZGlyLyRsaWJpYmVydHlfdG9wZGlyOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJGxpYmliZXJ0eV90b3BkaXIgJHNyY2Rpci8kbGliaWJlcnR5X3RvcGRpciIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1OTE6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjE0OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLWlmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFyOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FSJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgotICBhY19jdl9wcm9nX0FSPSIkQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUiIgJiYgYWNfY3ZfcHJvZ19BUj0iYXIiCi1maQotZmkKLUFSPSIkYWNfY3ZfcHJvZ19BUiIKLWlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NzI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcwNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgUkFOTElCPSI6IgotZmkKLWZpCi0KLQotIyBGSVhNRTogV2UgdGVtcG9yYXJpbHkgZGVmaW5lIG91ciBvd24gdmVyc2lvbiBvZiBBQ19QUk9HX0NDLiAgVGhpcyBpcwotIyBjb3BpZWQgZnJvbSBhdXRvY29uZiAyLjEyLCBidXQgZG9lcyBub3QgY2FsbCBBQ19QUk9HX0NDX1dPUktTLiAgV2UKLSMgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIsIHdoaWNoIHdpbGwgbm90IGJlIGFibGUgdG8gZnVsbHkKLSMgbGluayBhbiBleGVjdXRhYmxlLiAgVGhpcyBzaG91bGQgcmVhbGx5IGJlIGZpeGVkIGluIGF1dG9jb25mCi0jIGl0c2VsZi4KLQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc3OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgyODogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODM3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi0gIGFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPQotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg1MjogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotICBpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0gIGVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1PMiIKLSAgZmkKLWVsc2UKLSAgR0NDPQotICB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldCB8fCBDRkxBR1M9Ii1nIgotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODgxOiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLQotCi0KLQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTE5OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLS4gJHtzcmNkaXJ9L2NvbmZpZy50YWJsZQotaG9zdF9tYWtlZmlsZV9mcmFnPSR7ZnJhZ30KLQotCi0jIEl0J3MgT0sgdG8gY2hlY2sgZm9yIGhlYWRlciBmaWxlcy4gIEFsdGhvdWdoIHRoZSBjb21waWxlciBtYXkgbm90IGJlCi0jIGFibGUgdG8gbGluayBhbnl0aGluZywgaXQgaGFkIGJldHRlciBiZSBhYmxlIHRvIGF0IGxlYXN0IGNvbXBpbGUKLSMgc29tZXRoaW5nLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk4MDogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5OTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEwMDE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwMTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEwMTg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwMjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEwMzU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZm9yIGFjX2hkciBpbiBzeXMvZmlsZS5oIHN5cy9wYXJhbS5oIHN0ZGxpYi5oIHN0cmluZy5oIHVuaXN0ZC5oIHN0cmluZ3MuaCBzeXMvdGltZS5oIHN5cy9yZXNvdXJjZS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA2MzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwNjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEwNzM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEwMDogY2hlY2tpbmcgZm9yIHN5cy93YWl0LmggdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zeXNfd2FpdF9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTEwNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpZm5kZWYgV0VYSVRTVEFUVVMKLSNkZWZpbmUgV0VYSVRTVEFUVVMoc3RhdF92YWwpICgodW5zaWduZWQpKHN0YXRfdmFsKSA+PiA4KQotI2VuZGlmCi0jaWZuZGVmIFdJRkVYSVRFRAotI2RlZmluZSBXSUZFWElURUQoc3RhdF92YWwpICgoKHN0YXRfdmFsKSAmIDI1NSkgPT0gMCkKLSNlbmRpZgotaW50IG1haW4oKSB7Ci1pbnQgczsKLXdhaXQgKCZzKTsKLXMgPSBXSUZFWElURUQgKHMpID8gV0VYSVRTVEFUVVMgKHMpIDogMTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTIxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N5c193YWl0X2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfV0FJVF9IIDEKLUVPRgotCi1maQotCi0KLSMgVGhpcyBpcyB0aGUgbGlzdCBvZiBmdW5jdGlvbnMgd2hpY2ggbGliaWJlcnR5IHdpbGwgcHJvdmlkZSBpZiB0aGV5Ci0jIGFyZSBub3QgYXZhaWxhYmxlIG9uIHRoZSBob3N0LgotCi1mdW5jcz0iYXNwcmludGYiCi1mdW5jcz0iJGZ1bmNzIGF0ZXhpdCIKLWZ1bmNzPSIkZnVuY3MgYmFzZW5hbWUiCi1mdW5jcz0iJGZ1bmNzIGJjbXAiCi1mdW5jcz0iJGZ1bmNzIGJjb3B5IgotZnVuY3M9IiRmdW5jcyBiemVybyIKLWZ1bmNzPSIkZnVuY3MgY2FsbG9jIgotZnVuY3M9IiRmdW5jcyBjbG9jayIKLWZ1bmNzPSIkZnVuY3MgZ2V0Y3dkIgotZnVuY3M9IiRmdW5jcyBnZXRwYWdlc2l6ZSIKLWZ1bmNzPSIkZnVuY3MgaW5kZXgiCi1mdW5jcz0iJGZ1bmNzIGluc3F1ZSIKLWZ1bmNzPSIkZnVuY3MgbWVtY2hyIgotZnVuY3M9IiRmdW5jcyBtZW1jbXAiCi1mdW5jcz0iJGZ1bmNzIG1lbWNweSIKLWZ1bmNzPSIkZnVuY3MgbWVtbW92ZSIKLWZ1bmNzPSIkZnVuY3MgbWVtc2V0IgotZnVuY3M9IiRmdW5jcyBta3N0ZW1wcyIKLWZ1bmNzPSIkZnVuY3MgcmFuZG9tIgotZnVuY3M9IiRmdW5jcyByZW5hbWUiCi1mdW5jcz0iJGZ1bmNzIHJpbmRleCIKLWZ1bmNzPSIkZnVuY3Mgc2lnc2V0bWFzayIKLWZ1bmNzPSIkZnVuY3Mgc3RyY2FzZWNtcCIKLWZ1bmNzPSIkZnVuY3Mgc3RyY2hyIgotZnVuY3M9IiRmdW5jcyBzdHJkdXAiCi1mdW5jcz0iJGZ1bmNzIHN0cm5jYXNlY21wIgotZnVuY3M9IiRmdW5jcyBzdHJyY2hyIgotZnVuY3M9IiRmdW5jcyBzdHJzdHIiCi1mdW5jcz0iJGZ1bmNzIHN0cnRvZCIKLWZ1bmNzPSIkZnVuY3Mgc3RydG9sIgotZnVuY3M9IiRmdW5jcyBzdHJ0b3VsIgotZnVuY3M9IiRmdW5jcyB0bXBuYW0iCi1mdW5jcz0iJGZ1bmNzIHZhc3ByaW50ZiIKLWZ1bmNzPSIkZnVuY3MgdmZwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHZwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHZzcHJpbnRmIgotZnVuY3M9IiRmdW5jcyB3YWl0cGlkIgotCi0jIEFsc28gaW4gdGhlIG9sZCBmdW5jdGlvbi5kZWYgZmlsZTogYWxsb2NhLCB2Zm9yaywgZ2V0b3B0LgotCi12YXJzPSJzeXNfZXJybGlzdCBzeXNfbmVyciBzeXNfc2lnbGlzdCIKLQotY2hlY2tmdW5jcz0iZ2V0cnVzYWdlIG9uX2V4aXQgcHNpZ25hbCBzdHJlcnJvciBzdHJzaWduYWwgc3lzY29uZiB0aW1lcyIKLQotIyBUaGVzZSBhcmUgbmVpdGhlciBleGVjdXRlZCBub3IgcmVxdWlyZWQsIGJ1dCB0aGV5IGhlbHAga2VlcAotIyBhdXRvaGVhZGVyIGhhcHB5IHdpdGhvdXQgYWRkaW5nIGEgYnVuY2ggb2YgdGV4dCB0byBhY2NvbmZpZy5oLgotaWYgdGVzdCAieCIgPSAieSI7IHRoZW4KLSAgZm9yIGFjX2Z1bmMgaW4gYXNwcmludGYgYXRleGl0IGJhc2VuYW1lIGJjbXAgYmNvcHkgYnplcm8gY2FsbG9jIGNsb2NrIGdldGN3ZAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE5NTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIwMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjIzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gIGZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplIGluZGV4IGluc3F1ZSBta3N0ZW1wcyBtZW1jaHIgbWVtY21wIG1lbWNweSBtZW1tb3ZlCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjUwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjU1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgZm9yIGFjX2Z1bmMgaW4gbWVtc2V0IHJhbmRvbSByZW5hbWUgcmluZGV4IHNpZ3NldG1hc2sgc3RyY2FzZWNtcAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMwNTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTMxMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzMzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gIGZvciBhY19mdW5jIGluIHN0cmNociBzdHJkdXAgc3RybmNhc2VjbXAgc3RycmNociBzdHJzdHIgc3RydG9kIHN0cnRvbAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM2MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM2NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzg4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gIGZvciBhY19mdW5jIGluIHN0cnRvdWwgdG1wbmFtIHZhc3ByaW50ZiB2ZnByaW50ZiB2cHJpbnRmIHZzcHJpbnRmIHdhaXRwaWQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0MTU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0MjAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfRVJSTElTVCAxCi1FT0YKLQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfTkVSUiAxCi1FT0YKLQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfU0lHTElTVCAxCi1FT0YKLQotICBmb3IgYWNfZnVuYyBpbiBnZXRydXNhZ2Ugb25fZXhpdCBwc2lnbmFsIHN0cmVycm9yIHN0cnNpZ25hbCBzeXNjb25mIHRpbWVzCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDgyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDg3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZpCi0KLSMgRm9yIGVhY2ggb2YgdGhlc2UgZnVuY3Rpb25zLCBpZiB0aGUgaG9zdCBkb2VzIG5vdCBwcm92aWRlIHRoZQotIyBmdW5jdGlvbiB3ZSB3YW50IHRvIHB1dCBGTi5vIGluIExJQk9CSlMsIGFuZCBpZiB0aGUgaG9zdCBkb2VzCi0jIHByb3ZpZGUgdGhlIGZ1bmN0aW9uLCB3ZSB3YW50IHRvIGRlZmluZSBIQVZFX0ZOIGluIGNvbmZpZy5oLiAgQWxzbywKLSMgaWYgdGhlIGhvc3QgZG9lcyBub3QgcHJvdmlkZSBhbGxvY2EsIHdlIHNldCBBTExPQ0EgdG8gYWxsb2NhLm8KLQotc2V0b2Jqcz0KLWlmIHRlc3QgLW4gIiR7d2l0aF90YXJnZXRfc3ViZGlyfSI7IHRoZW4KLQotICAjIFdlIGFyZSBiZWluZyBjb25maWd1cmVkIGFzIGEgdGFyZ2V0IGxpYnJhcnkuICBBQ19SRVBMQUNFX0ZVTkNTCi0gICMgbWF5IG5vdCB3b3JrIGNvcnJlY3RseSwgYmVjYXVzZSB0aGUgY29tcGlsZXIgbWF5IG5vdCBiZSBhYmxlIHRvCi0gICMgbGluayBleGVjdXRhYmxlcy4gIE5vdGUgdGhhdCB3ZSBtYXkgc3RpbGwgYmUgYmVpbmcgY29uZmlndXJlZAotICAjIG5hdGl2ZS4KLQotICAjIElmIHdlIGFyZSBiZWluZyBjb25maWd1cmVkIGZvciBuZXdsaWIsIHdlIGtub3cgd2hpY2ggZnVuY3Rpb25zCi0gICMgbmV3bGliIHByb3ZpZGUgYW5kIHdoaWNoIG9uZXMgd2Ugd2lsbCBiZSBleHBlY3RlZCB0byBwcm92aWRlLgotCi0gIGlmIHRlc3QgIngke3dpdGhfbmV3bGlifSIgPSAieHllcyI7IHRoZW4KLSAgICBBTExPQ0E9ImFsbG9jYS5vIgotICAgIExJQk9CSlM9ImFzcHJpbnRmLm8gYmFzZW5hbWUubyBpbnNxdWUubyByYW5kb20ubyBzdHJkdXAubyB2YXNwcmludGYubyIKLQotICAgIGZvciBmIGluICRmdW5jczsgZG8KLSAgICAgIGNhc2UgIiRmIiBpbgotCWFzcHJpbnRmIHwgYmFzZW5hbWUgfCBpbnNxdWUgfCByYW5kb20gfCBzdHJkdXAgfCB2YXNwcmludGYpCi0JICA7OwotCSopCi0JICBuPUhBVkVfYGVjaG8gJGYgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0JICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkbiAxCi1FT0YKLQotCSAgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICAjIG5ld2xpYiBkb2VzbnQgcHJvdmlkZSBhbnkgb2YgdGhlIHZhcmlhYmxlcyBpbiAkdmFycywgc28gd2UKLSAgICAjIGRvbnQgaGF2ZSB0byBjaGVjayB0aGVtIGhlcmUuCi0KLSAgICAjIE9mIHRoZSBmdW5jdGlvbnMgaW4gJGNoZWNrZnVuY3MsIG5ld2xpYiBvbmx5IGhhcyBzdHJlcnJvci4KLSAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFJFUlJPUiAxCi1FT0YKLQotCi0gICAgc2V0b2Jqcz15ZXMKLQotICBmaQotZmkKLQotaWYgdGVzdCAteiAiJHtzZXRvYmpzfSI7IHRoZW4KLSAgY2FzZSAiJHtob3N0fSIgaW4KLQotICAqLSotdnh3b3JrcyopCi0gICAgIyBIYW5kbGUgVnhXb3JrcyBjb25maWd1cmF0aW9uIHNwZWNpYWxseSwgc2luY2Ugb24gVnhXb3JrcyB0aGUKLSAgICAjIGxpYnJhcmllcyBhcmUgYWN0dWFsbHkgb24gdGhlIHRhcmdldCBib2FyZCwgbm90IGluIHRoZSBmaWxlCi0gICAgIyBzeXN0ZW0uCi0gICAgTElCT0JKUz0iYmFzZW5hbWUubyBnZXRwYWdlc2l6ZS5vIGluc3F1ZS5vIHJhbmRvbS5vIHN0cmNhc2VjbXAubyIKLSAgICBMSUJPQkpTPSIkTElCT0JKUyBzdHJuY2FzZWNtcC5vIHN0cmR1cC5vIHZmb3JrLm8gd2FpdHBpZC5vIHZhc3ByaW50Zi5vIgotICAgIGZvciBmIGluICRmdW5jczsgZG8KLSAgICAgIGNhc2UgIiRmIiBpbgotCWJhc2VuYW1lIHwgZ2V0cGFnZXNpemUgfCBpbnNxdWUgfCByYW5kb20gfCBzdHJjYXNlY21wKQotCSAgOzsKLQlzdHJuY2FzZWNtcCB8IHN0cmR1cCB8IHZmb3JrIHwgd2FpdHBpZCB8IHZhc3ByaW50ZikKLQkgIDs7Ci0JKikKLQkgIG49SEFWRV9gZWNobyAkZiB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLQkgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRuIDEKLUVPRgotCi0JICA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgICMgVnhXb3JrcyBkb2Vzbid0IHByb3ZpZGUgYW55IG9mIHRoZSB2YXJpYWJsZXMgaW4gJHZhcnMsIHNvIHdlCi0gICAgIyBkb24ndCBoYXZlIHRvIGNoZWNrIHRoZW0gaGVyZS4KLQotICAgICMgT2YgdGhlIGZ1bmN0aW9ucyBpbiAkY2hlY2tmdW5jcywgVnhXb3JrcyBvbmx5IGhhcyBzdHJlcnJvci4KLSAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFJFUlJPUiAxCi1FT0YKLQotCi0gICAgc2V0b2Jqcz15ZXMKLSAgICA7OwotCi0gIGVzYWMKLWZpCi0KLWlmIHRlc3QgLXogIiR7c2V0b2Jqc30iOyB0aGVuCi0KLSAgY2FzZSAiJHtob3N0fSIgaW4KLQotICAqLSotY3lnd2luKikKLSAgICAjIFRoZSBDeWd3aW4gbGlicmFyeSBhY3R1YWxseSB1c2VzIGEgY291cGxlIG9mIGZpbGVzIGZyb20KLSAgICAjIGxpYmliZXJ0eSB3aGVuIGl0IGlzIGJ1aWx0LiAgSWYgd2UgYXJlIGJ1aWxkaW5nIGEgbmF0aXZlCi0gICAgIyBDeWd3aW4sIGFuZCB3ZSBydW4gdGhlIHRlc3RzLCB3ZSB3aWxsIGFwcGVhciB0byBoYXZlIHRoZXNlCi0gICAgIyBmaWxlcy4gIEhvd2V2ZXIsIHdoZW4gd2UgZ28gb24gdG8gYnVpbGQgd2luc3VwLCB3ZSB3aWxsIHdpbmQgdXAKLSAgICAjIHdpdGggYSBsaWJyYXJ5IHdoaWNoIGRvZXMgbm90IGhhdmUgdGhlIGZpbGVzLCBzaW5jZSB0aGV5IHNob3VsZAotICAgICMgaGF2ZSBjb21lIGZyb20gbGliaWJlcnR5LgotCi0gICAgIyBXZSBoYW5kbGUgdGhpcyBieSByZW1vdmluZyB0aGUgZnVuY3Rpb25zIHRoZSB3aW5zdXAgbGlicmFyeQotICAgICMgcHJvdmlkZXMgZnJvbSBvdXIgc2hlbGwgdmFyaWFibGVzLCBzbyB0aGF0IHRoZXkgYXBwZWFyIHRvIGJlCi0gICAgIyBtaXNzaW5nLgotCi0gICAgZnVuY3M9ImBlY2hvICRmdW5jcyB8IHNlZCAtZSAncy9yYW5kb20vLydgIgotICAgIExJQk9CSlM9IiRMSUJPQkpTIHJhbmRvbS5vIgotICAgIHZhcnM9ImBlY2hvICR2YXJzIHwgc2VkIC1lICdzL3N5c19zaWdsaXN0Ly8nYCIKLSAgICBjaGVja2Z1bmNzPSJgZWNobyAkY2hlY2tmdW5jcyB8IHNlZCAtZSAncy9zdHJzaWduYWwvLycgLWUgJ3MvcHNpZ25hbC8vJ2AiCi0gICAgOzsKLQotICAqLSotbWluZ3czMiopCi0gICAgIyBVbmRlciBtaW5ndzMyLCBzeXNfbmVyciBhbmQgc3lzX2Vycmxpc3QgZXhpc3QsIGJ1dCB0aGV5IGFyZQotICAgICMgbWFjcm9zLCBzbyB0aGUgdGVzdCBiZWxvdyB3b24ndCBmaW5kIHRoZW0uCi0gICAgdmFycz0iYGVjaG8gJHZhcnMgfCBzZWQgLWUgJ3Mvc3lzX25lcnIvLycgLWUgJ3Mvc3lzX2Vycmxpc3QvLydgIgotICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NZU19ORVJSIDEKLUVPRgotCi0gICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1lTX0VSUkxJU1QgMQotRU9GCi0KLSAgICA7OwotCi0gICotKi11d2luKikKLSAgICAjIFVuZGVyIHNvbWUgdmVyc2lvbnMgb2YgdXdpbiwgdmZvcmsgaXMgbm90b3Jpb3VzbHkgYnVnZ3kgYW5kIHRoZSB0ZXN0IAotICAgICMgY2FuIGhhbmcgY29uZmlndXJlOyBvbiBvdGhlciB2ZXJzaW9ucywgdmZvcmsgZXhpc3RzIGp1c3QgYXMgYSBzdHViLgotICAgICMgRklYTUU6IFRoaXMgc2hvdWxkIGJlIHJlbW92ZWQgb25jZSB2Zm9yayBpbiB1d2luJ3MgcnVudGltZSBpcyBmaXhlZC4KLSAgICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPW5vCi0gICAgOzsKLQotICBlc2FjCi0KLSAgIyBXZSBoYXZlbid0IHNldCB0aGUgbGlzdCBvZiBvYmplY3RzIHlldC4gIFVzZSB0aGUgc3RhbmRhcmQgYXV0b2NvbmYKLSAgIyB0ZXN0cy4gIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIGNvbXBpbGVyIHdvcmtzLgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NzI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDE2ODMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjg4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MTQ6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLSAgZm9yIGFjX2Z1bmMgaW4gJGZ1bmNzCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzIxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNzI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3NDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLUxJQk9CSlM9IiRMSUJPQkpTICR7YWNfZnVuY30uJHthY19vYmpleHR9IgotZmkKLWRvbmUKLQotCi0gICMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3Nzg6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNzgzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3OTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODExOiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE4MTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg0NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4NzY6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODgxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTkwNjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTkxMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NjE6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTY5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5ODg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDEwOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDE1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDIzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwNDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjA1OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDc5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi1pZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOwotZXhpdCAoMCk7IH0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwOTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgcGlkX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMTQ6IGNoZWNraW5nIGZvciBwaWRfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9waWRfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pcGlkX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3BpZF90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfcGlkX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9waWRfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9waWRfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBwaWRfdCBpbnQKLUVPRgotCi1maQotCi1hY19zYWZlPWBlY2hvICJ2Zm9yay5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB2Zm9yay5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTQ4OiBjaGVja2luZyBmb3IgdmZvcmsuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE1MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8dmZvcmsuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE1ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1ZGT1JLX0ggMQotRU9GCi0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyB2Zm9yayIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE4MzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZvcmsiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfdmZvcmtfd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdmZvcmsiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxODk6IGNoZWNraW5nIGZvciB2Zm9yayIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY192Zm9yaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxOTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgdmZvcmsoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciB2Zm9yaygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViX3Zmb3JrKSB8fCBkZWZpbmVkIChfX3N0dWJfX192Zm9yaykKLWNob2tlIG1lCi0jZWxzZQotdmZvcmsoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIxNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY192Zm9yaz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfdmZvcms9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyd2Zm9ya2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotYWNfY3ZfZnVuY192Zm9ya193b3Jrcz0kYWNfY3ZfZnVuY192Zm9yawotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjM5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFRoYW5rcyB0byBQYXVsIEVnZ2VydCBmb3IgdGhpcyB0ZXN0LiAgKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9WRk9SS19ICi0jaW5jbHVkZSA8dmZvcmsuaD4KLSNlbmRpZgotLyogT24gc29tZSBzcGFyYyBzeXN0ZW1zLCBjaGFuZ2VzIGJ5IHRoZSBjaGlsZCB0byBsb2NhbCBhbmQgaW5jb21pbmcKLSAgIGFyZ3VtZW50IHJlZ2lzdGVycyBhcmUgcHJvcGFnYXRlZCBiYWNrIHRvIHRoZSBwYXJlbnQuCi0gICBUaGUgY29tcGlsZXIgaXMgdG9sZCBhYm91dCB0aGlzIHdpdGggI2luY2x1ZGUgPHZmb3JrLmg+LAotICAgYnV0IHNvbWUgY29tcGlsZXJzIChlLmcuIGdjYyAtTykgZG9uJ3QgZ3JvayA8dmZvcmsuaD4uCi0gICBUZXN0IGZvciB0aGlzIGJ5IHVzaW5nIGEgc3RhdGljIHZhcmlhYmxlIHdob3NlIGFkZHJlc3MKLSAgIGlzIHB1dCBpbnRvIGEgcmVnaXN0ZXIgdGhhdCBpcyBjbG9iYmVyZWQgYnkgdGhlIHZmb3JrLiAgKi8KLXN0YXRpYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1zcGFyY19hZGRyZXNzX3Rlc3QgKGludCBhcmcpCi0jZWxzZQotc3BhcmNfYWRkcmVzc190ZXN0IChhcmcpIGludCBhcmc7Ci0jZW5kaWYKLXsKLSAgc3RhdGljIHBpZF90IGNoaWxkOwotICBpZiAoIWNoaWxkKSB7Ci0gICAgY2hpbGQgPSB2Zm9yayAoKTsKLSAgICBpZiAoY2hpbGQgPCAwKSB7Ci0gICAgICBwZXJyb3IgKCJ2Zm9yayIpOwotICAgICAgX2V4aXQoMik7Ci0gICAgfQotICAgIGlmICghY2hpbGQpIHsKLSAgICAgIGFyZyA9IGdldHBpZCgpOwotICAgICAgd3JpdGUoLTEsICIiLCAwKTsKLSAgICAgIF9leGl0IChhcmcpOwotICAgIH0KLSAgfQotfQotbWFpbigpIHsKLSAgcGlkX3QgcGFyZW50ID0gZ2V0cGlkICgpOwotICBwaWRfdCBjaGlsZDsKLQotICBzcGFyY19hZGRyZXNzX3Rlc3QgKCk7Ci0KLSAgY2hpbGQgPSB2Zm9yayAoKTsKLQotICBpZiAoY2hpbGQgPT0gMCkgewotICAgIC8qIEhlcmUgaXMgYW5vdGhlciB0ZXN0IGZvciBzcGFyYyB2Zm9yayByZWdpc3RlciBwcm9ibGVtcy4KLSAgICAgICBUaGlzIHRlc3QgdXNlcyBsb3RzIG9mIGxvY2FsIHZhcmlhYmxlcywgYXQgbGVhc3QKLSAgICAgICBhcyBtYW55IGxvY2FsIHZhcmlhYmxlcyBhcyBtYWluIGhhcyBhbGxvY2F0ZWQgc28gZmFyCi0gICAgICAgaW5jbHVkaW5nIGNvbXBpbGVyIHRlbXBvcmFyaWVzLiAgNCBsb2NhbHMgYXJlIGVub3VnaCBmb3IKLSAgICAgICBnY2MgMS40MC4zIG9uIGEgU29sYXJpcyA0LjEuMyBzcGFyYywgYnV0IHdlIHVzZSA4IHRvIGJlIHNhZmUuCi0gICAgICAgQSBidWdneSBjb21waWxlciBzaG91bGQgcmV1c2UgdGhlIHJlZ2lzdGVyIG9mIHBhcmVudAotICAgICAgIGZvciBvbmUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlcywgc2luY2UgaXQgd2lsbCB0aGluayB0aGF0Ci0gICAgICAgcGFyZW50IGNhbid0IHBvc3NpYmx5IGJlIHVzZWQgYW55IG1vcmUgaW4gdGhpcyByb3V0aW5lLgotICAgICAgIEFzc2lnbmluZyB0byB0aGUgbG9jYWwgdmFyaWFibGUgd2lsbCB0aHVzIG11bmdlIHBhcmVudAotICAgICAgIGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4gICovCi0gICAgcGlkX3QKLSAgICAgIHAgPSBnZXRwaWQoKSwgcDEgPSBnZXRwaWQoKSwgcDIgPSBnZXRwaWQoKSwgcDMgPSBnZXRwaWQoKSwKLSAgICAgIHA0ID0gZ2V0cGlkKCksIHA1ID0gZ2V0cGlkKCksIHA2ID0gZ2V0cGlkKCksIHA3ID0gZ2V0cGlkKCk7Ci0gICAgLyogQ29udmluY2UgdGhlIGNvbXBpbGVyIHRoYXQgcC4ucDcgYXJlIGxpdmU7IG90aGVyd2lzZSwgaXQgbWlnaHQKLSAgICAgICB1c2UgdGhlIHNhbWUgaGFyZHdhcmUgcmVnaXN0ZXIgZm9yIGFsbCA4IGxvY2FsIHZhcmlhYmxlcy4gICovCi0gICAgaWYgKHAgIT0gcDEgfHwgcCAhPSBwMiB8fCBwICE9IHAzIHx8IHAgIT0gcDQKLQl8fCBwICE9IHA1IHx8IHAgIT0gcDYgfHwgcCAhPSBwNykKLSAgICAgIF9leGl0KDEpOwotCi0gICAgLyogT24gc29tZSBzeXN0ZW1zIChlLmcuIElSSVggMy4zKSwKLSAgICAgICB2Zm9yayBkb2Vzbid0IHNlcGFyYXRlIHBhcmVudCBmcm9tIGNoaWxkIGZpbGUgZGVzY3JpcHRvcnMuCi0gICAgICAgSWYgdGhlIGNoaWxkIGNsb3NlcyBhIGRlc2NyaXB0b3IgYmVmb3JlIGl0IGV4ZWNzIG9yIGV4aXRzLAotICAgICAgIHRoaXMgbXVuZ2VzIHRoZSBwYXJlbnQncyBkZXNjcmlwdG9yIGFzIHdlbGwuCi0gICAgICAgVGVzdCBmb3IgdGhpcyBieSBjbG9zaW5nIHN0ZG91dCBpbiB0aGUgY2hpbGQuICAqLwotICAgIF9leGl0KGNsb3NlKGZpbGVubyhzdGRvdXQpKSAhPSAwKTsKLSAgfSBlbHNlIHsKLSAgICBpbnQgc3RhdHVzOwotICAgIHN0cnVjdCBzdGF0IHN0OwotCi0gICAgd2hpbGUgKHdhaXQoJnN0YXR1cykgIT0gY2hpbGQpCi0gICAgICA7Ci0gICAgZXhpdCgKLQkgLyogV2FzIHRoZXJlIHNvbWUgcHJvYmxlbSB3aXRoIHZmb3JraW5nPyAgKi8KLQkgY2hpbGQgPCAwCi0KLQkgLyogRGlkIHRoZSBjaGlsZCBmYWlsPyAgKFRoaXMgc2hvdWxkbid0IGhhcHBlbi4pICAqLwotCSB8fCBzdGF0dXMKLQotCSAvKiBEaWQgdGhlIHZmb3JrL2NvbXBpbGVyIGJ1ZyBvY2N1cj8gICovCi0JIHx8IHBhcmVudCAhPSBnZXRwaWQoKQotCi0JIC8qIERpZCB0aGUgZmlsZSBkZXNjcmlwdG9yIGJ1ZyBvY2N1cj8gICovCi0JIHx8IGZzdGF0KGZpbGVubyhzdGRvdXQpLCAmc3QpICE9IDAKLQkgKTsKLSAgfQotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY192Zm9ya193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY192Zm9ya193b3JrcyA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSB2Zm9yayBmb3JrCi1FT0YKLQotZmkKLQotICBpZiB0ZXN0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzID0gbm87IHRoZW4KLSAgICBMSUJPQkpTPSIkTElCT0JKUyB2Zm9yay5vIgotICBmaQotICBmb3IgdiBpbiAkdmFyczsgZG8KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJHYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNjE6IGNoZWNraW5nIGZvciAkdiIgPiY1Ci0gICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2xpYmliZXJ0eV9jdl92YXJfJHYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzY2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWludCAqcDsKLWludCBtYWluKCkgewotZXh0ZXJuIGludCAkdjsgcCA9ICYkdjsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzczOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJsaWJpYmVydHlfY3ZfdmFyXyR2PXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAibGliaWJlcnR5X2N2X3Zhcl8kdj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSAgICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRsaWJpYmVydHlfY3ZfdmFyXyckdmBcIiA9IHllcyI7IHRoZW4KLSAgICAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICAgIG49SEFWRV9gZWNobyAkdiB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRuIDEKLUVPRgotCi0gICAgZWxzZQotICAgICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gICAgZmkKLSAgZG9uZQotICBmb3IgYWNfZnVuYyBpbiAkY2hlY2tmdW5jcwotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM5OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQwNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDI3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1maQotCi0jIEluc3RhbGwgYSBsaWJyYXJ5IGJ1aWx0IHdpdGggYSBjcm9zcyBjb21waWxlciBpbiAkKHRvb2xkaXIpIHJhdGhlcgotIyB0aGFuICQobGliZGlyKS4KLWlmIHRlc3QgLXogIiR7d2l0aF9jcm9zc19ob3N0fSI7IHRoZW4KLSAgSU5TVEFMTF9ERVNUPWxpYmRpcgotZWxzZQotICBJTlNUQUxMX0RFU1Q9dG9vbGRpcgotZmkKLQotCi0jIFdlIG5lZWQgbXVsdGlsaWIgc3VwcG9ydCwgYnV0IG9ubHkgaWYgY29uZmlndXJpbmcgZm9yIHRoZSB0YXJnZXQuCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBBUkAlJEFSJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBDQ0AlJENDJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi0vQGhvc3RfbWFrZWZpbGVfZnJhZ0AvciAkaG9zdF9tYWtlZmlsZV9mcmFnCi1zJUBob3N0X21ha2VmaWxlX2ZyYWdAJSVnCi1zJUBDUFBAJSRDUFAlZwotcyVATElCT0JKU0AlJExJQk9CSlMlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQElOU1RBTExfREVTVEAlJElOU1RBTExfREVTVCVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLXNyY2Rpcj0ke3NyY2Rpcn0KLWhvc3Q9JHtob3N0fQotdGFyZ2V0PSR7dGFyZ2V0fQotd2l0aF90YXJnZXRfc3ViZGlyPSR7d2l0aF90YXJnZXRfc3ViZGlyfQotd2l0aF9tdWx0aXN1YmRpcj0ke3dpdGhfbXVsdGlzdWJkaXJ9Ci1hY19jb25maWd1cmVfYXJncz0iLS1lbmFibGUtbXVsdGlsaWIgJHthY19jb25maWd1cmVfYXJnc30iCi1DT05GSUdfU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLWxpYmliZXJ0eV90b3BkaXI9JHtsaWJpYmVydHlfdG9wZGlyfQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi1pZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgotICBpZiB0ZXN0IC1uICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iOyB0aGVuCi0gICAgIyBGSVhNRTogV2Ugc2hvdWxkbid0IG5lZWQgdG8gc2V0IGFjX2ZpbGUKLSAgICBhY19maWxlPU1ha2VmaWxlCi0gICAgLiAke2xpYmliZXJ0eV90b3BkaXJ9L2NvbmZpZy1tbC5pbgotICBmaQotZmkKLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlndXJlLmJhdCBiL2xpYmliZXJ0eS9jb25maWd1cmUuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODg4MWFjLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWd1cmUuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotQGVjaG8gb2ZmDQotaWYgIiUxIiA9PSAiaDgvMzAwIiBnb3RvIGg4MzAwDQotDQotZWNobyBDb25maWd1cmluZyBsaWJpYmVydHkgZm9yIGdvMzINCi1jb3B5IE1ha2VmaWxlLmRvcyBNYWtlZmlsZQ0KLWVjaG8gI2RlZmluZSBORUVEX3N5c19zaWdsaXN0IDEgPj4gY29uZmlnLmgNCi1lY2hvICNkZWZpbmUgTkVFRF9wc2lnbmFsIDEgPj4gY29uZmlnLmgNCi1nb3RvIGV4aXQNCi0NCi06aDgzMDANCi1lY2hvIENvbmZpZ3VyaW5nIGxpYmliZXJ0eSBmb3IgSDgvMzAwDQotY29weSBNYWtlZmlsZS5kb3MgTWFrZWZpbGUNCi0NCi06ZXhpdA0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWd1cmUuaW4gYi9saWJpYmVydHkvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzFjYjBiLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQKLQotQUNfUFJFUkVRKDIuMTIuMSkKLUFDX0lOSVQocGV4ZWN1dGUuYykKLQotZG5sIFdlIHVzZSB0aGVzZSBvcHRpb25zIHRvIGRlY2lkZSB3aGljaCBmdW5jdGlvbnMgdG8gaW5jbHVkZS4KLUFDX0FSR19XSVRIKHRhcmdldC1zdWJkaXIsCi1bICAtLXdpdGgtdGFyZ2V0LXN1YmRpcj1TVUJESVIgICAgICBDb25maWd1cmluZyBpbiBhIHN1YmRpcmVjdG9yeV0pCi1BQ19BUkdfV0lUSChjcm9zcy1ob3N0LAotWyAgLS13aXRoLWNyb3NzLWhvc3Q9SE9TVCAgICAgICAgICAgQ29uZmlndXJpbmcgd2l0aCBhIGNyb3NzIGNvbXBpbGVyXSkKLUFDX0FSR19XSVRIKG5ld2xpYiwKLVsgIC0td2l0aC1uZXdsaWIgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyaW5nIHdpdGggbmV3bGliXSkKLQotaWYgdGVzdCAiJHtzcmNkaXJ9IiA9ICIuIjsgdGhlbgotICBpZiB0ZXN0IC16ICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iOyB0aGVuCi0gICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9Ly4uIgotICBlbHNlCi0gICAgaWYgdGVzdCAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiAhPSAiLiI7IHRoZW4KLSAgICAgIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8ke3dpdGhfbXVsdGlzcmN0b3B9Li4vLi4iCi0gICAgZWxzZQotICAgICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9LyR7d2l0aF9tdWx0aXNyY3RvcH0uLiIKLSAgICBmaQotICBmaQotZWxzZQotICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vLi4iCi1maQotQUNfQ09ORklHX0FVWF9ESVIoJGxpYmliZXJ0eV90b3BkaXIpCi0KLUFDX0NBTk9OSUNBTF9IT1NUCi0KLWRubCBXaGVuIHdlIHN0YXJ0IHVzaW5nIGF1dG9tYWtlOgotZG5sIEFNX0lOSVRfQVVUT01BS0UobGliaWJlcnR5LCAxLjApCi0KLWRubCBUaGVzZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLCBiZWNhdXNlIGl0IG1heSB3YW50Ci1kbmwgdG8gY2FsbCBBQ19DSEVDS19QUk9HLgotQUNfQ0hFQ0tfVE9PTChBUiwgYXIpCi1BQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQotCi0jIEZJWE1FOiBXZSB0ZW1wb3JhcmlseSBkZWZpbmUgb3VyIG93biB2ZXJzaW9uIG9mIEFDX1BST0dfQ0MuICBUaGlzIGlzCi0jIGNvcGllZCBmcm9tIGF1dG9jb25mIDIuMTIsIGJ1dCBkb2VzIG5vdCBjYWxsIEFDX1BST0dfQ0NfV09SS1MuICBXZQotIyBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlciwgd2hpY2ggd2lsbCBub3QgYmUgYWJsZSB0byBmdWxseQotIyBsaW5rIGFuIGV4ZWN1dGFibGUuICBUaGlzIHNob3VsZCByZWFsbHkgYmUgZml4ZWQgaW4gYXV0b2NvbmYKLSMgaXRzZWxmLgotCi1BQ19ERUZVTihMSUJfQUNfUFJPR19DQywKLVtBQ19CRUZPUkUoWyQwXSwgW0FDX1BST0dfQ1BQXSlkbmwKLUFDX1BST1ZJREUoW0FDX1BST0dfQ0NdKQotQUNfQ0hFQ0tfUFJPRyhDQywgZ2NjLCBnY2MpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gIEFDX0NIRUNLX1BST0coQ0MsIGNjLCBjYywgLCAsIC91c3IvdWNiL2NjKQotICB0ZXN0IC16ICIkQ0MiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEhdKQotZmkKLQotQUNfUFJPR19DQ19HTlUKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZG5sIENoZWNrIHdoZXRoZXIgLWcgd29ya3MsIGV2ZW4gaWYgQ0ZMQUdTIGlzIHNldCwgaW4gY2FzZSB0aGUgcGFja2FnZQotZG5sIHBsYXlzIGFyb3VuZCB3aXRoIENGTEFHUyAoc3VjaCBhcyB0byBidWlsZCBib3RoIGRlYnVnZ2luZyBhbmQKLWRubCBub3JtYWwgdmVyc2lvbnMgb2YgYSBsaWJyYXJ5KSwgdGFzdGVsZXNzIGFzIHRoYXQgaWRlYSBpcy4KLSAgYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi0gIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9Ci0gIEFDX1BST0dfQ0NfRwotICBpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0gIGVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1PMiIKLSAgZmkKLWVsc2UKLSAgR0NDPQotICB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldCB8fCBDRkxBR1M9Ii1nIgotZmkKLV0pCi0KLUxJQl9BQ19QUk9HX0NDCi0KLUFDX0lTQ19QT1NJWAotCi1kbmwgV2hlbiB3ZSBzdGFydCB1c2luZyBsaWJ0b29sOgotZG5sIERlZmF1bHQgdG8gYSBub24gc2hhcmVkIGxpYnJhcnkuICBUaGlzIG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZQotZG5sIGNvbmZpZ3VyZSBvcHRpb24gLS1lbmFibGUtc2hhcmVkLgotZG5sIEFNX0RJU0FCTEVfU0hBUkVECi0KLWRubCBXaGVuIHdlIHN0YXJ0IHVzaW5nIGxpYnRvb2w6Ci1kbmwgQU1fUFJPR19MSUJUT09MCi0KLWRubCBXaGVuIHdlIHN0YXJ0IHVzaW5nIGF1dG9tYWtlOgotZG5sIEFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotQUNfQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi0KLWRubCBXaGVuIHdlIHN0YXJ0IHVzaW5nIGF1dG9tYWtlOgotZG5sIEFNX01BSU5UQUlORVJfTU9ERQotZG5sIEFDX0VYRUVYVAotCi1kbmwgV2hlbiB3ZSBzdGFydCB1c2luZyBhdXRvbWFrZToKLWRubCBBTV9QUk9HX0lOU1RBTEwKLUFDX1BST0dfSU5TVEFMTAotCi0uICR7c3JjZGlyfS9jb25maWcudGFibGUKLWhvc3RfbWFrZWZpbGVfZnJhZz0ke2ZyYWd9Ci1BQ19TVUJTVF9GSUxFKGhvc3RfbWFrZWZpbGVfZnJhZykKLQotIyBJdCdzIE9LIHRvIGNoZWNrIGZvciBoZWFkZXIgZmlsZXMuICBBbHRob3VnaCB0aGUgY29tcGlsZXIgbWF5IG5vdCBiZQotIyBhYmxlIHRvIGxpbmsgYW55dGhpbmcsIGl0IGhhZCBiZXR0ZXIgYmUgYWJsZSB0byBhdCBsZWFzdCBjb21waWxlCi0jIHNvbWV0aGluZy4KLUFDX0NIRUNLX0hFQURFUlMoc3lzL2ZpbGUuaCBzeXMvcGFyYW0uaCBzdGRsaWIuaCBzdHJpbmcuaCB1bmlzdGQuaCBzdHJpbmdzLmggc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaCkKLUFDX0hFQURFUl9TWVNfV0FJVAotCi0jIFRoaXMgaXMgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIHdoaWNoIGxpYmliZXJ0eSB3aWxsIHByb3ZpZGUgaWYgdGhleQotIyBhcmUgbm90IGF2YWlsYWJsZSBvbiB0aGUgaG9zdC4KLQotZnVuY3M9ImFzcHJpbnRmIgotZnVuY3M9IiRmdW5jcyBhdGV4aXQiCi1mdW5jcz0iJGZ1bmNzIGJhc2VuYW1lIgotZnVuY3M9IiRmdW5jcyBiY21wIgotZnVuY3M9IiRmdW5jcyBiY29weSIKLWZ1bmNzPSIkZnVuY3MgYnplcm8iCi1mdW5jcz0iJGZ1bmNzIGNhbGxvYyIKLWZ1bmNzPSIkZnVuY3MgY2xvY2siCi1mdW5jcz0iJGZ1bmNzIGdldGN3ZCIKLWZ1bmNzPSIkZnVuY3MgZ2V0cGFnZXNpemUiCi1mdW5jcz0iJGZ1bmNzIGluZGV4IgotZnVuY3M9IiRmdW5jcyBpbnNxdWUiCi1mdW5jcz0iJGZ1bmNzIG1lbWNociIKLWZ1bmNzPSIkZnVuY3MgbWVtY21wIgotZnVuY3M9IiRmdW5jcyBtZW1jcHkiCi1mdW5jcz0iJGZ1bmNzIG1lbW1vdmUiCi1mdW5jcz0iJGZ1bmNzIG1lbXNldCIKLWZ1bmNzPSIkZnVuY3MgbWtzdGVtcHMiCi1mdW5jcz0iJGZ1bmNzIHJhbmRvbSIKLWZ1bmNzPSIkZnVuY3MgcmVuYW1lIgotZnVuY3M9IiRmdW5jcyByaW5kZXgiCi1mdW5jcz0iJGZ1bmNzIHNpZ3NldG1hc2siCi1mdW5jcz0iJGZ1bmNzIHN0cmNhc2VjbXAiCi1mdW5jcz0iJGZ1bmNzIHN0cmNociIKLWZ1bmNzPSIkZnVuY3Mgc3RyZHVwIgotZnVuY3M9IiRmdW5jcyBzdHJuY2FzZWNtcCIKLWZ1bmNzPSIkZnVuY3Mgc3RycmNociIKLWZ1bmNzPSIkZnVuY3Mgc3Ryc3RyIgotZnVuY3M9IiRmdW5jcyBzdHJ0b2QiCi1mdW5jcz0iJGZ1bmNzIHN0cnRvbCIKLWZ1bmNzPSIkZnVuY3Mgc3RydG91bCIKLWZ1bmNzPSIkZnVuY3MgdG1wbmFtIgotZnVuY3M9IiRmdW5jcyB2YXNwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHZmcHJpbnRmIgotZnVuY3M9IiRmdW5jcyB2cHJpbnRmIgotZnVuY3M9IiRmdW5jcyB2c3ByaW50ZiIKLWZ1bmNzPSIkZnVuY3Mgd2FpdHBpZCIKLQotIyBBbHNvIGluIHRoZSBvbGQgZnVuY3Rpb24uZGVmIGZpbGU6IGFsbG9jYSwgdmZvcmssIGdldG9wdC4KLQotdmFycz0ic3lzX2Vycmxpc3Qgc3lzX25lcnIgc3lzX3NpZ2xpc3QiCi0KLWNoZWNrZnVuY3M9ImdldHJ1c2FnZSBvbl9leGl0IHBzaWduYWwgc3RyZXJyb3Igc3Ryc2lnbmFsIHN5c2NvbmYgdGltZXMiCi0KLSMgVGhlc2UgYXJlIG5laXRoZXIgZXhlY3V0ZWQgbm9yIHJlcXVpcmVkLCBidXQgdGhleSBoZWxwIGtlZXAKLSMgYXV0b2hlYWRlciBoYXBweSB3aXRob3V0IGFkZGluZyBhIGJ1bmNoIG9mIHRleHQgdG8gYWNjb25maWcuaC4KLWlmIHRlc3QgIngiID0gInkiOyB0aGVuCi0gIEFDX0NIRUNLX0ZVTkNTKGFzcHJpbnRmIGF0ZXhpdCBiYXNlbmFtZSBiY21wIGJjb3B5IGJ6ZXJvIGNhbGxvYyBjbG9jayBnZXRjd2QpCi0gIEFDX0NIRUNLX0ZVTkNTKGdldHBhZ2VzaXplIGluZGV4IGluc3F1ZSBta3N0ZW1wcyBtZW1jaHIgbWVtY21wIG1lbWNweSBtZW1tb3ZlKQotICBBQ19DSEVDS19GVU5DUyhtZW1zZXQgcmFuZG9tIHJlbmFtZSByaW5kZXggc2lnc2V0bWFzayBzdHJjYXNlY21wKQotICBBQ19DSEVDS19GVU5DUyhzdHJjaHIgc3RyZHVwIHN0cm5jYXNlY21wIHN0cnJjaHIgc3Ryc3RyIHN0cnRvZCBzdHJ0b2wpCi0gIEFDX0NIRUNLX0ZVTkNTKHN0cnRvdWwgdG1wbmFtIHZhc3ByaW50ZiB2ZnByaW50ZiB2cHJpbnRmIHZzcHJpbnRmIHdhaXRwaWQpCi0gIEFDX0RFRklORShIQVZFX1NZU19FUlJMSVNUKQotICBBQ19ERUZJTkUoSEFWRV9TWVNfTkVSUikKLSAgQUNfREVGSU5FKEhBVkVfU1lTX1NJR0xJU1QpCi0gIEFDX0NIRUNLX0ZVTkNTKGdldHJ1c2FnZSBvbl9leGl0IHBzaWduYWwgc3RyZXJyb3Igc3Ryc2lnbmFsIHN5c2NvbmYgdGltZXMpCi1maQotCi0jIEZvciBlYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucywgaWYgdGhlIGhvc3QgZG9lcyBub3QgcHJvdmlkZSB0aGUKLSMgZnVuY3Rpb24gd2Ugd2FudCB0byBwdXQgRk4ubyBpbiBMSUJPQkpTLCBhbmQgaWYgdGhlIGhvc3QgZG9lcwotIyBwcm92aWRlIHRoZSBmdW5jdGlvbiwgd2Ugd2FudCB0byBkZWZpbmUgSEFWRV9GTiBpbiBjb25maWcuaC4gIEFsc28sCi0jIGlmIHRoZSBob3N0IGRvZXMgbm90IHByb3ZpZGUgYWxsb2NhLCB3ZSBzZXQgQUxMT0NBIHRvIGFsbG9jYS5vCi0KLXNldG9ianM9Ci1pZiB0ZXN0IC1uICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iOyB0aGVuCi0KLSAgIyBXZSBhcmUgYmVpbmcgY29uZmlndXJlZCBhcyBhIHRhcmdldCBsaWJyYXJ5LiAgQUNfUkVQTEFDRV9GVU5DUwotICAjIG1heSBub3Qgd29yayBjb3JyZWN0bHksIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG1heSBub3QgYmUgYWJsZSB0bwotICAjIGxpbmsgZXhlY3V0YWJsZXMuICBOb3RlIHRoYXQgd2UgbWF5IHN0aWxsIGJlIGJlaW5nIGNvbmZpZ3VyZWQKLSAgIyBuYXRpdmUuCi0KLSAgIyBJZiB3ZSBhcmUgYmVpbmcgY29uZmlndXJlZCBmb3IgbmV3bGliLCB3ZSBrbm93IHdoaWNoIGZ1bmN0aW9ucwotICAjIG5ld2xpYiBwcm92aWRlIGFuZCB3aGljaCBvbmVzIHdlIHdpbGwgYmUgZXhwZWN0ZWQgdG8gcHJvdmlkZS4KLQotICBpZiB0ZXN0ICJ4JHt3aXRoX25ld2xpYn0iID0gInh5ZXMiOyB0aGVuCi0gICAgQUxMT0NBPSJhbGxvY2EubyIKLSAgICBMSUJPQkpTPSJhc3ByaW50Zi5vIGJhc2VuYW1lLm8gaW5zcXVlLm8gcmFuZG9tLm8gc3RyZHVwLm8gdmFzcHJpbnRmLm8iCi0KLSAgICBmb3IgZiBpbiAkZnVuY3M7IGRvCi0gICAgICBjYXNlICIkZiIgaW4KLQlhc3ByaW50ZiB8IGJhc2VuYW1lIHwgaW5zcXVlIHwgcmFuZG9tIHwgc3RyZHVwIHwgdmFzcHJpbnRmKQotCSAgOzsKLQkqKQotCSAgbj1IQVZFX2BlY2hvICRmIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotCSAgQUNfREVGSU5FX1VOUVVPVEVEKCRuKQotCSAgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICAjIG5ld2xpYiBkb2VzbnQgcHJvdmlkZSBhbnkgb2YgdGhlIHZhcmlhYmxlcyBpbiAkdmFycywgc28gd2UKLSAgICAjIGRvbnQgaGF2ZSB0byBjaGVjayB0aGVtIGhlcmUuCi0KLSAgICAjIE9mIHRoZSBmdW5jdGlvbnMgaW4gJGNoZWNrZnVuY3MsIG5ld2xpYiBvbmx5IGhhcyBzdHJlcnJvci4KLSAgICBBQ19ERUZJTkUoSEFWRV9TVFJFUlJPUikKLQotICAgIHNldG9ianM9eWVzCi0KLSAgZmkKLWZpCi0KLWlmIHRlc3QgLXogIiR7c2V0b2Jqc30iOyB0aGVuCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0KLSAgKi0qLXZ4d29ya3MqKQotICAgICMgSGFuZGxlIFZ4V29ya3MgY29uZmlndXJhdGlvbiBzcGVjaWFsbHksIHNpbmNlIG9uIFZ4V29ya3MgdGhlCi0gICAgIyBsaWJyYXJpZXMgYXJlIGFjdHVhbGx5IG9uIHRoZSB0YXJnZXQgYm9hcmQsIG5vdCBpbiB0aGUgZmlsZQotICAgICMgc3lzdGVtLgotICAgIExJQk9CSlM9ImJhc2VuYW1lLm8gZ2V0cGFnZXNpemUubyBpbnNxdWUubyByYW5kb20ubyBzdHJjYXNlY21wLm8iCi0gICAgTElCT0JKUz0iJExJQk9CSlMgc3RybmNhc2VjbXAubyBzdHJkdXAubyB2Zm9yay5vIHdhaXRwaWQubyB2YXNwcmludGYubyIKLSAgICBmb3IgZiBpbiAkZnVuY3M7IGRvCi0gICAgICBjYXNlICIkZiIgaW4KLQliYXNlbmFtZSB8IGdldHBhZ2VzaXplIHwgaW5zcXVlIHwgcmFuZG9tIHwgc3RyY2FzZWNtcCkKLQkgIDs7Ci0Jc3RybmNhc2VjbXAgfCBzdHJkdXAgfCB2Zm9yayB8IHdhaXRwaWQgfCB2YXNwcmludGYpCi0JICA7OwotCSopCi0JICBuPUhBVkVfYGVjaG8gJGYgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0JICBBQ19ERUZJTkVfVU5RVU9URUQoJG4pCi0JICA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgICMgVnhXb3JrcyBkb2Vzbid0IHByb3ZpZGUgYW55IG9mIHRoZSB2YXJpYWJsZXMgaW4gJHZhcnMsIHNvIHdlCi0gICAgIyBkb24ndCBoYXZlIHRvIGNoZWNrIHRoZW0gaGVyZS4KLQotICAgICMgT2YgdGhlIGZ1bmN0aW9ucyBpbiAkY2hlY2tmdW5jcywgVnhXb3JrcyBvbmx5IGhhcyBzdHJlcnJvci4KLSAgICBBQ19ERUZJTkUoSEFWRV9TVFJFUlJPUikKLQotICAgIHNldG9ianM9eWVzCi0gICAgOzsKLQotICBlc2FjCi1maQotCi1pZiB0ZXN0IC16ICIke3NldG9ianN9IjsgdGhlbgotCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0KLSAgKi0qLWN5Z3dpbiopCi0gICAgIyBUaGUgQ3lnd2luIGxpYnJhcnkgYWN0dWFsbHkgdXNlcyBhIGNvdXBsZSBvZiBmaWxlcyBmcm9tCi0gICAgIyBsaWJpYmVydHkgd2hlbiBpdCBpcyBidWlsdC4gIElmIHdlIGFyZSBidWlsZGluZyBhIG5hdGl2ZQotICAgICMgQ3lnd2luLCBhbmQgd2UgcnVuIHRoZSB0ZXN0cywgd2Ugd2lsbCBhcHBlYXIgdG8gaGF2ZSB0aGVzZQotICAgICMgZmlsZXMuICBIb3dldmVyLCB3aGVuIHdlIGdvIG9uIHRvIGJ1aWxkIHdpbnN1cCwgd2Ugd2lsbCB3aW5kIHVwCi0gICAgIyB3aXRoIGEgbGlicmFyeSB3aGljaCBkb2VzIG5vdCBoYXZlIHRoZSBmaWxlcywgc2luY2UgdGhleSBzaG91bGQKLSAgICAjIGhhdmUgY29tZSBmcm9tIGxpYmliZXJ0eS4KLQotICAgICMgV2UgaGFuZGxlIHRoaXMgYnkgcmVtb3ZpbmcgdGhlIGZ1bmN0aW9ucyB0aGUgd2luc3VwIGxpYnJhcnkKLSAgICAjIHByb3ZpZGVzIGZyb20gb3VyIHNoZWxsIHZhcmlhYmxlcywgc28gdGhhdCB0aGV5IGFwcGVhciB0byBiZQotICAgICMgbWlzc2luZy4KLQotICAgIGZ1bmNzPSJgZWNobyAkZnVuY3MgfCBzZWQgLWUgJ3MvcmFuZG9tLy8nYCIKLSAgICBMSUJPQkpTPSIkTElCT0JKUyByYW5kb20ubyIKLSAgICB2YXJzPSJgZWNobyAkdmFycyB8IHNlZCAtZSAncy9zeXNfc2lnbGlzdC8vJ2AiCi0gICAgY2hlY2tmdW5jcz0iYGVjaG8gJGNoZWNrZnVuY3MgfCBzZWQgLWUgJ3Mvc3Ryc2lnbmFsLy8nIC1lICdzL3BzaWduYWwvLydgIgotICAgIDs7Ci0KLSAgKi0qLW1pbmd3MzIqKQotICAgICMgVW5kZXIgbWluZ3czMiwgc3lzX25lcnIgYW5kIHN5c19lcnJsaXN0IGV4aXN0LCBidXQgdGhleSBhcmUKLSAgICAjIG1hY3Jvcywgc28gdGhlIHRlc3QgYmVsb3cgd29uJ3QgZmluZCB0aGVtLgotICAgIHZhcnM9ImBlY2hvICR2YXJzIHwgc2VkIC1lICdzL3N5c19uZXJyLy8nIC1lICdzL3N5c19lcnJsaXN0Ly8nYCIKLSAgICBBQ19ERUZJTkUoSEFWRV9TWVNfTkVSUikKLSAgICBBQ19ERUZJTkUoSEFWRV9TWVNfRVJSTElTVCkKLSAgICA7OwotCi0gICotKi11d2luKikKLSAgICAjIFVuZGVyIHNvbWUgdmVyc2lvbnMgb2YgdXdpbiwgdmZvcmsgaXMgbm90b3Jpb3VzbHkgYnVnZ3kgYW5kIHRoZSB0ZXN0IAotICAgICMgY2FuIGhhbmcgY29uZmlndXJlOyBvbiBvdGhlciB2ZXJzaW9ucywgdmZvcmsgZXhpc3RzIGp1c3QgYXMgYSBzdHViLgotICAgICMgRklYTUU6IFRoaXMgc2hvdWxkIGJlIHJlbW92ZWQgb25jZSB2Zm9yayBpbiB1d2luJ3MgcnVudGltZSBpcyBmaXhlZC4KLSAgICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPW5vCi0gICAgOzsKLQotICBlc2FjCi0KLSAgIyBXZSBoYXZlbid0IHNldCB0aGUgbGlzdCBvZiBvYmplY3RzIHlldC4gIFVzZSB0aGUgc3RhbmRhcmQgYXV0b2NvbmYKLSAgIyB0ZXN0cy4gIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIGNvbXBpbGVyIHdvcmtzLgotICBBQ19QUk9HX0NDX1dPUktTCi0gIEFDX1JFUExBQ0VfRlVOQ1MoJGZ1bmNzKQotICBBQ19GVU5DX0FMTE9DQQotICBBQ19GVU5DX1ZGT1JLCi0gIGlmIHRlc3QgJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MgPSBubzsgdGhlbgotICAgIExJQk9CSlM9IiRMSUJPQkpTIHZmb3JrLm8iCi0gIGZpCi0gIGZvciB2IGluICR2YXJzOyBkbwotICAgIEFDX01TR19DSEVDS0lORyhbZm9yICR2XSkKLSAgICBBQ19DQUNIRV9WQUwobGliaWJlcnR5X2N2X3Zhcl8kdiwKLSAgICAgIFtBQ19UUllfTElOSyhbaW50ICpwO10sIFtleHRlcm4gaW50ICR2OyBwID0gJiR2O10sCi0JCSAgIFtldmFsICJsaWJpYmVydHlfY3ZfdmFyXyR2PXllcyJdLAotCQkgICBbZXZhbCAibGliaWJlcnR5X2N2X3Zhcl8kdj1ubyJdKV0pCi0gICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckbGliaWJlcnR5X2N2X3Zhcl8nJHZgXCIgPSB5ZXMiOyB0aGVuCi0gICAgICBBQ19NU0dfUkVTVUxUKHllcykKLSAgICAgIG49SEFWRV9gZWNobyAkdiB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgICAgIEFDX0RFRklORV9VTlFVT1RFRCgkbikKLSAgICBlbHNlCi0gICAgICBBQ19NU0dfUkVTVUxUKG5vKQotICAgIGZpCi0gIGRvbmUKLSAgQUNfQ0hFQ0tfRlVOQ1MoJGNoZWNrZnVuY3MpCi1maQotCi0jIEluc3RhbGwgYSBsaWJyYXJ5IGJ1aWx0IHdpdGggYSBjcm9zcyBjb21waWxlciBpbiAkKHRvb2xkaXIpIHJhdGhlcgotIyB0aGFuICQobGliZGlyKS4KLWlmIHRlc3QgLXogIiR7d2l0aF9jcm9zc19ob3N0fSI7IHRoZW4KLSAgSU5TVEFMTF9ERVNUPWxpYmRpcgotZWxzZQotICBJTlNUQUxMX0RFU1Q9dG9vbGRpcgotZmkKLUFDX1NVQlNUKElOU1RBTExfREVTVCkKLQotIyBXZSBuZWVkIG11bHRpbGliIHN1cHBvcnQsIGJ1dCBvbmx5IGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgdGFyZ2V0LgotQUNfT1VUUFVUKE1ha2VmaWxlLAotW3Rlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi1pZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgotICBpZiB0ZXN0IC1uICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iOyB0aGVuCi0gICAgIyBGSVhNRTogV2Ugc2hvdWxkbid0IG5lZWQgdG8gc2V0IGFjX2ZpbGUKLSAgICBhY19maWxlPU1ha2VmaWxlCi0gICAgLiAke2xpYmliZXJ0eV90b3BkaXJ9L2NvbmZpZy1tbC5pbgotICBmaQotZmldLAotc3JjZGlyPSR7c3JjZGlyfQotaG9zdD0ke2hvc3R9Ci10YXJnZXQ9JHt0YXJnZXR9Ci13aXRoX3RhcmdldF9zdWJkaXI9JHt3aXRoX3RhcmdldF9zdWJkaXJ9Ci13aXRoX211bHRpc3ViZGlyPSR7d2l0aF9tdWx0aXN1YmRpcn0KLWFjX2NvbmZpZ3VyZV9hcmdzPSItLWVuYWJsZS1tdWx0aWxpYiAke2FjX2NvbmZpZ3VyZV9hcmdzfSIKLUNPTkZJR19TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotbGliaWJlcnR5X3RvcGRpcj0ke2xpYmliZXJ0eV90b3BkaXJ9Ci0pCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29weXNpZ24uYyBiL2xpYmliZXJ0eS9jb3B5c2lnbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjVmOGMzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb3B5c2lnbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0jaWZkZWYgX19JRUVFX0JJR19FTkRJQU4KLQotdHlwZWRlZiB1bmlvbiAKLXsKLSAgZG91YmxlIHZhbHVlOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbiA6IDE7Ci0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50OiAxMTsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24wOjQ7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMToxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24yOjE2OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjM6MTY7Ci0gICAgCi0gIH0gbnVtYmVyOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbiA6IDE7Ci0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50OiAxMTsKLSAgICB1bnNpZ25lZCBpbnQgcXVpZXQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24wOjM7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMToxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24yOjE2OwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjM6MTY7Ci0gIH0gbmFuOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBsb25nIG1zdzsKLSAgICB1bnNpZ25lZCBsb25nIGxzdzsKLSAgfSBwYXJ0czsKLSAgICBsb25nIGFzbG9uZ1syXTsKLX0gX19pZWVlX2RvdWJsZV9zaGFwZV90eXBlOwotCi0jZW5kaWYKLQotI2lmZGVmIF9fSUVFRV9MSVRUTEVfRU5ESUFOCi0KLXR5cGVkZWYgdW5pb24gCi17Ci0gIGRvdWJsZSB2YWx1ZTsKLSAgc3RydWN0IAotICB7Ci0jaWZkZWYgX19TTUFMTF9CSVRGSUVMRFMKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24zOjE2OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjI6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMToxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24wOiA0OwotI2Vsc2UKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24xOjMyOwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjA6MjA7Ci0jZW5kaWYKLSAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQgOjExOwotICAgIHVuc2lnbmVkIGludCBzaWduICAgICA6IDE7Ci0gIH0gbnVtYmVyOwotICBzdHJ1Y3QgCi0gIHsKLSNpZmRlZiBfX1NNQUxMX0JJVEZJRUxEUwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjM6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMjoxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24xOjE2OwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjA6MzsKLSNlbHNlCi0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMTozMjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24wOjE5OwotI2VuZGlmCi0gICAgdW5zaWduZWQgaW50IHF1aWV0OjE7Ci0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50OiAxMTsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbiA6IDE7Ci0gIH0gbmFuOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBsb25nIGxzdzsKLSAgICB1bnNpZ25lZCBsb25nIG1zdzsKLSAgfSBwYXJ0czsKLQotICBsb25nIGFzbG9uZ1syXTsKLQotfSBfX2llZWVfZG91YmxlX3NoYXBlX3R5cGU7Ci0KLSNlbmRpZgotCi0jaWZkZWYgX19JRUVFX0JJR19FTkRJQU4KLXR5cGVkZWYgdW5pb24KLXsKLSAgZmxvYXQgdmFsdWU7Ci0gIHN0cnVjdCAKLSAgewotICAgIHVuc2lnbmVkIGludCBzaWduIDogMTsKLSAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6IDg7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMDogNzsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24xOiAxNjsKLSAgfSBudW1iZXI7Ci0gIHN0cnVjdCAKLSAgewotICAgIHVuc2lnbmVkIGludCBzaWduOjE7Ci0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50Ojg7Ci0gICAgdW5zaWduZWQgaW50IHF1aWV0OjE7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMDo2OwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjE6MTY7Ci0gIH0gbmFuOwotICBsb25nIHAxOwotICAKLX0gX19pZWVlX2Zsb2F0X3NoYXBlX3R5cGU7Ci0jZW5kaWYKLQotI2lmZGVmIF9fSUVFRV9MSVRUTEVfRU5ESUFOCi10eXBlZGVmIHVuaW9uCi17Ci0gIGZsb2F0IHZhbHVlOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24wOiA3OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjE6IDE2OwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDogODsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbiA6IDE7Ci0gIH0gbnVtYmVyOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24xOjE2OwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjA6NjsKLSAgICB1bnNpZ25lZCBpbnQgcXVpZXQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6ODsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbjoxOwotICB9IG5hbjsKLSAgbG9uZyBwMTsKLSAgCi19IF9faWVlZV9mbG9hdF9zaGFwZV90eXBlOwotI2VuZGlmCi0KLQotZG91YmxlIERFRlVOKGNvcHlzaWduLCAoeCwgeSksIGRvdWJsZSB4IEFORCBkb3VibGUgeSkKLXsKLSAgX19pZWVlX2RvdWJsZV9zaGFwZV90eXBlIGEsYjsKLSAgYi52YWx1ZSA9IHk7ICAKLSAgYS52YWx1ZSA9IHg7Ci0gIGEubnVtYmVyLnNpZ24gPWIubnVtYmVyLnNpZ247Ci0gIHJldHVybiBhLnZhbHVlOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NwbHVzLWRlbS5jIGIvbGliaWJlcnR5L2NwbHVzLWRlbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGVmNTZhLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jcGx1cy1kZW0uYworKysgL2Rldi9udWxsCkBAIC0xLDQ2MTAgKzAsMCBAQAotLyogRGVtYW5nbGVyIGZvciBHTlUgQysrCi0gICBDb3B5cmlnaHQgMTk4OSwgOTEsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSmFtZXMgQ2xhcmsgKGpqY0BqY2xhcmsudXVjcCkKLSAgIFJld3JpdHRlbiBieSBGcmVkIEZpc2ggKGZuZkBjeWdudXMuY29tKSBmb3IgQVJNIGFuZCBMdWNpZCBkZW1hbmdsaW5nCi0gICBNb2RpZmllZCBieSBTYXRpc2ggUGFpIChwYWlAYXBvbGxvLmhwLmNvbSkgZm9yIEhQIGRlbWFuZ2xpbmcKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBleHBvcnRzIHR3byBmdW5jdGlvbnM7IGNwbHVzX21hbmdsZV9vcG5hbWUgYW5kIGNwbHVzX2RlbWFuZ2xlLgotCi0gICBUaGlzIGZpbGUgaW1wb3J0cyB4bWFsbG9jIGFuZCB4cmVhbGxvYywgd2hpY2ggYXJlIGxpa2UgbWFsbG9jIGFuZAotICAgcmVhbGxvYyBleGNlcHQgdGhhdCB0aGV5IGdlbmVyYXRlIGEgZmF0YWwgZXJyb3IgaWYgdGhlcmUgaXMgbm8KLSAgIGF2YWlsYWJsZSBtZW1vcnkuICAqLwotCi0vKiBUaGlzIGZpbGUgbGl2ZXMgaW4gYm90aCBHQ0MgYW5kIGxpYmliZXJ0eS4gIFdoZW4gbWFraW5nIGNoYW5nZXMsIHBsZWFzZQotICAgdHJ5IG5vdCB0byBicmVhayBlaXRoZXIuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotY2hhciAqIG1hbGxvYyAoKTsKLWNoYXIgKiByZWFsbG9jICgpOwotI2VuZGlmCi0KLSNpbmNsdWRlIDxkZW1hbmdsZS5oPgotI3VuZGVmIENVUlJFTlRfREVNQU5HTElOR19TVFlMRQotI2RlZmluZSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUgd29yay0+b3B0aW9ucwotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICpteXN0cnN0ciBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1teXN0cnN0ciAoczEsIHMyKQotICAgICBjb25zdCBjaGFyICpzMSwgKnMyOwotewotICByZWdpc3RlciBjb25zdCBjaGFyICpwID0gczE7Ci0gIHJlZ2lzdGVyIGludCBsZW4gPSBzdHJsZW4gKHMyKTsKLQotICBmb3IgKDsgKHAgPSBzdHJjaHIgKHAsICpzMikpICE9IDA7IHArKykKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAocCwgczIsIGxlbikgPT0gMCkKLQl7Ci0JICByZXR1cm4gKHApOwotCX0KLSAgICB9Ci0gIHJldHVybiAoMCk7Ci19Ci0KLS8qIEluIG9yZGVyIHRvIGFsbG93IGEgc2luZ2xlIGRlbWFuZ2xlciBleGVjdXRhYmxlIHRvIGRlbWFuZ2xlIHN0cmluZ3MKLSAgIHVzaW5nIHZhcmlvdXMgY29tbW9uIHZhbHVlcyBvZiBDUExVU19NQVJLRVIsIGFzIHdlbGwgYXMgYW55IHNwZWNpZmljCi0gICBvbmUgc2V0IGF0IGNvbXBpbGUgdGltZSwgd2UgbWFpbnRhaW4gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgdGhlCi0gICBjb21tb25seSB1c2VkIG9uZXMsIGFuZCBjaGVjayB0byBzZWUgaWYgdGhlIG1hcmtlciB3ZSBhcmUgbG9va2luZyBmb3IKLSAgIGlzIGluIHRoYXQgc3RyaW5nLiAgQ1BMVVNfTUFSS0VSIGlzIHVzdWFsbHkgJyQnIG9uIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBhc3NlbWJsZXIgY2FuIGRlYWwgd2l0aCB0aGF0LiAgV2hlcmUgdGhlIGFzc2VtYmxlciBjYW4ndCwgaXQncyB1c3VhbGx5Ci0gICAnLicgKGJ1dCBvbiBtYW55IHN5c3RlbXMgJy4nIGlzIHVzZWQgZm9yIG90aGVyIHRoaW5ncykuICBXZSBwdXQgdGhlCi0gICBjdXJyZW50IGRlZmluZWQgQ1BMVVNfTUFSS0VSIGZpcnN0ICh3aGljaCBkZWZhdWx0cyB0byAnJCcpLCBmb2xsb3dlZAotICAgYnkgdGhlIG5leHQgbW9zdCBjb21tb24gdmFsdWUsIGZvbGxvd2VkIGJ5IGFuIGV4cGxpY2l0ICckJyBpbiBjYXNlCi0gICB0aGUgdmFsdWUgb2YgQ1BMVVNfTUFSS0VSIGlzIG5vdCAnJCcuCi0KLSAgIFdlIGNvdWxkIGF2b2lkIHRoaXMgaWYgd2UgY291bGQganVzdCBnZXQgZysrIHRvIHRlbGwgdXMgd2hhdCB0aGUgYWN0dWFsCi0gICBjcGx1cyBtYXJrZXIgY2hhcmFjdGVyIGlzIGFzIHBhcnQgb2YgdGhlIGRlYnVnIGluZm9ybWF0aW9uLCBwZXJoYXBzIGJ5Ci0gICBlbnN1cmluZyB0aGF0IGl0IGlzIHRoZSBjaGFyYWN0ZXIgdGhhdCB0ZXJtaW5hdGVzIHRoZSBnY2M8bj5fY29tcGlsZWQKLSAgIG1hcmtlciBzeW1ib2wgKEZJWE1FKS4gICovCi0KLSNpZiAhZGVmaW5lZCAoQ1BMVVNfTUFSS0VSKQotI2RlZmluZSBDUExVU19NQVJLRVIgJyQnCi0jZW5kaWYKLQotZW51bSBkZW1hbmdsaW5nX3N0eWxlcyBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgPSBnbnVfZGVtYW5nbGluZzsKLQotc3RhdGljIGNoYXIgY3BsdXNfbWFya2Vyc1tdID0geyBDUExVU19NQVJLRVIsICcuJywgJyQnLCAnXDAnIH07Ci0KLXN0YXRpYyBjaGFyIGNoYXJfc3RyWzJdID0geyAnXDAwMCcsICdcMDAwJyB9OwotCi12b2lkCi1zZXRfY3BsdXNfbWFya2VyX2Zvcl9kZW1hbmdsaW5nIChjaCkKLSAgICAgaW50IGNoOwotewotICBjcGx1c19tYXJrZXJzWzBdID0gY2g7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHN0cmluZwkJLyogQmV3YXJlOiB0aGVzZSBhcmVuJ3QgcmVxdWlyZWQgdG8gYmUgKi8KLXsJCQkJLyogICdcMCcgdGVybWluYXRlZC4gICovCi0gIGNoYXIgKmI7CQkJLyogcG9pbnRlciB0byBzdGFydCBvZiBzdHJpbmcgKi8KLSAgY2hhciAqcDsJCQkvKiBwb2ludGVyIGFmdGVyIGxhc3QgY2hhcmFjdGVyICovCi0gIGNoYXIgKmU7CQkJLyogcG9pbnRlciBhZnRlciBlbmQgb2YgYWxsb2NhdGVkIHNwYWNlICovCi19IHN0cmluZzsKLQotLyogU3R1ZmYgdGhhdCBpcyBzaGFyZWQgYmV0d2VlbiBzdWItcm91dGluZXMuCi0gICBVc2luZyBhIHNoYXJlZCBzdHJ1Y3R1cmUgYWxsb3dzIGNwbHVzX2RlbWFuZ2xlIHRvIGJlIHJlZW50cmFudC4gICovCi0KLXN0cnVjdCB3b3JrX3N0dWZmCi17Ci0gIGludCBvcHRpb25zOwotICBjaGFyICoqdHlwZXZlYzsKLSAgY2hhciAqKmt0eXBldmVjOwotICBjaGFyICoqYnR5cGV2ZWM7Ci0gIGludCBudW1rOwotICBpbnQgbnVtYjsKLSAgaW50IGtzaXplOwotICBpbnQgYnNpemU7Ci0gIGludCBudHlwZXM7Ci0gIGludCB0eXBldmVjX3NpemU7Ci0gIGludCBjb25zdHJ1Y3RvcjsKLSAgaW50IGRlc3RydWN0b3I7Ci0gIGludCBzdGF0aWNfdHlwZTsJLyogQSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uICovCi0gIGludCB0ZW1wX3N0YXJ0OyAgICAgICAvKiBpbmRleCBpbiBkZW1hbmdsZWQgdG8gc3RhcnQgb2YgdGVtcGxhdGUgYXJncyAqLwotICBpbnQgdHlwZV9xdWFsczsgICAgICAgLyogVGhlIHR5cGUgcXVhbGlmaWVycy4gICovCi0gIGludCBkbGxpbXBvcnRlZDsJLyogU3ltYm9sIGltcG9ydGVkIGZyb20gYSBQRSBETEwgKi8KLSAgY2hhciAqKnRtcGxfYXJndmVjOyAgIC8qIFRlbXBsYXRlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gKi8KLSAgaW50IG50bXBsX2FyZ3M7ICAgICAgIC8qIFRoZSBudW1iZXIgb2YgdGVtcGxhdGUgZnVuY3Rpb24gYXJndW1lbnRzLiAqLwotICBpbnQgZm9yZ2V0dGluZ190eXBlczsgLyogTm9uemVybyBpZiB3ZSBhcmUgbm90IHJlbWVtYmVyaW5nIHRoZSB0eXBlcwotCQkJICAgd2Ugc2VlLiAgKi8KLSAgc3RyaW5nKiBwcmV2aW91c19hcmd1bWVudDsgLyogVGhlIGxhc3QgZnVuY3Rpb24gYXJndW1lbnQgZGVtYW5nbGVkLiAgKi8KLSAgaW50IG5yZXBlYXRzOyAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBwcmV2aW91cwotCQkJICAgYXJndW1lbnQuICAqLwotfTsKLQotI2RlZmluZSBQUklOVF9BTlNJX1FVQUxJRklFUlMgKHdvcmsgLT4gb3B0aW9ucyAmIERNR0xfQU5TSSkKLSNkZWZpbmUgUFJJTlRfQVJHX1RZUEVTICAgICAgICh3b3JrIC0+IG9wdGlvbnMgJiBETUdMX1BBUkFNUykKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRhYmxlCi17Ci0gIGNvbnN0IGNoYXIgKmluOwotICBjb25zdCBjaGFyICpvdXQ7Ci0gIGludCBmbGFnczsKLX0gb3B0YWJsZVtdID0gewotICB7Im53IiwJICAiIG5ldyIsCURNR0xfQU5TSX0sCS8qIG5ldyAoMS45MiwJIGFuc2kpICovCi0gIHsiZGwiLAkgICIgZGVsZXRlIiwJRE1HTF9BTlNJfSwJLyogbmV3ICgxLjkyLAkgYW5zaSkgKi8KLSAgeyJuZXciLAkgICIgbmV3IiwJMH0sCQkvKiBvbGQgKDEuOTEsCSBhbmQgMS54KSAqLwotICB7ImRlbGV0ZSIsCSAgIiBkZWxldGUiLAkwfSwJCS8qIG9sZCAoMS45MSwJIGFuZCAxLngpICovCi0gIHsidm4iLAkgICIgbmV3IFtdIiwJRE1HTF9BTlNJfSwJLyogR05VLCBwZW5kaW5nIGFuc2kgKi8KLSAgeyJ2ZCIsCSAgIiBkZWxldGUgW10iLAlETUdMX0FOU0l9LAkvKiBHTlUsIHBlbmRpbmcgYW5zaSAqLwotICB7ImFzIiwJICAiPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsibmUiLAkgICIhPSIsCQlETUdMX0FOU0l9LAkvKiBvbGQsIGFuc2kgKi8KLSAgeyJlcSIsCSAgIj09IiwJCURNR0xfQU5TSX0sCS8qIG9sZCwJYW5zaSAqLwotICB7ImdlIiwJICAiPj0iLAkJRE1HTF9BTlNJfSwJLyogb2xkLAlhbnNpICovCi0gIHsiZ3QiLAkgICI+IiwJCURNR0xfQU5TSX0sCS8qIG9sZCwJYW5zaSAqLwotICB7ImxlIiwJICAiPD0iLAkJRE1HTF9BTlNJfSwJLyogb2xkLAlhbnNpICovCi0gIHsibHQiLAkgICI8IiwJCURNR0xfQU5TSX0sCS8qIG9sZCwJYW5zaSAqLwotICB7InBsdXMiLAkgICIrIiwJCTB9LAkJLyogb2xkICovCi0gIHsicGwiLAkgICIrIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhcGwiLAkgICIrPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsibWludXMiLAkgICItIiwJCTB9LAkJLyogb2xkICovCi0gIHsibWkiLAkgICItIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhbWkiLAkgICItPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsibXVsdCIsCSAgIioiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJtbCIsCSAgIioiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFtdSIsCSAgIio9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKEFSTS9MdWNpZCkgKi8KLSAgeyJhbWwiLAkgICIqPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpIChHTlUvZysrKSAqLwotICB7ImNvbnZlcnQiLAkgICIrIiwJCTB9LAkJLyogb2xkICh1bmFyeSArKSAqLwotICB7Im5lZ2F0ZSIsCSAgIi0iLAkJMH0sCQkvKiBvbGQgKHVuYXJ5IC0pICovCi0gIHsidHJ1bmNfbW9kIiwJICAiJSIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im1kIiwJICAiJSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYW1kIiwJICAiJT0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7InRydW5jX2RpdiIsCSAgIi8iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJkdiIsCSAgIi8iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFkdiIsCSAgIi89IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJ0cnV0aF9hbmRpZiIsICImJiIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImFhIiwJICAiJiYiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7InRydXRoX29yaWYiLCAgInx8IiwJCTB9LAkJLyogb2xkICovCi0gIHsib28iLAkgICJ8fCIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsidHJ1dGhfbm90IiwJICAiISIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im50IiwJICAiISIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsicG9zdGluY3JlbWVudCIsIisrIiwJMH0sCQkvKiBvbGQgKi8KLSAgeyJwcCIsCSAgIisrIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJwb3N0ZGVjcmVtZW50IiwiLS0iLAkwfSwJCS8qIG9sZCAqLwotICB7Im1tIiwJICAiLS0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImJpdF9pb3IiLAkgICJ8IiwJCTB9LAkJLyogb2xkICovCi0gIHsib3IiLAkgICJ8IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhb3IiLAkgICJ8PSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYml0X3hvciIsCSAgIl4iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJlciIsCSAgIl4iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFlciIsCSAgIl49IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJiaXRfYW5kIiwJICAiJiIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImFkIiwJICAiJiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYWFkIiwJICAiJj0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImJpdF9ub3QiLAkgICJ+IiwJCTB9LAkJLyogb2xkICovCi0gIHsiY28iLAkgICJ+IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJjYWxsIiwJICAiKCkiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJjbCIsCSAgIigpIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhbHNoaWZ0IiwJICAiPDwiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJscyIsCSAgIjw8IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhbHMiLAkgICI8PD0iLAlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYXJzaGlmdCIsCSAgIj4+IiwJCTB9LAkJLyogb2xkICovCi0gIHsicnMiLAkgICI+PiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYXJzIiwJICAiPj49IiwJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImNvbXBvbmVudCIsCSAgIi0+IiwJCTB9LAkJLyogb2xkICovCi0gIHsicHQiLAkgICItPiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpOyBMdWNpZCBDKysgZm9ybSAqLwotICB7InJmIiwJICAiLT4iLAkJRE1HTF9BTlNJfSwJLyogYW5zaTsgQVJNL0dOVSBmb3JtICovCi0gIHsiaW5kaXJlY3QiLAkgICIqIiwJCTB9LAkJLyogb2xkICovCi0gIHsibWV0aG9kX2NhbGwiLCAgIi0+KCkiLAkwfSwJCS8qIG9sZCAqLwotICB7ImFkZHIiLAkgICImIiwJCTB9LAkJLyogb2xkICh1bmFyeSAmKSAqLwotICB7ImFycmF5IiwJICAiW10iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJ2YyIsCSAgIltdIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJjb21wb3VuZCIsCSAgIiwgIiwJCTB9LAkJLyogb2xkICovCi0gIHsiY20iLAkgICIsICIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiY29uZCIsCSAgIj86IiwJCTB9LAkJLyogb2xkICovCi0gIHsiY24iLAkgICI/OiIsCQlETUdMX0FOU0l9LAkvKiBwc2V1ZG8tYW5zaSAqLwotICB7Im1heCIsCSAgIj4/IiwJCTB9LAkJLyogb2xkICovCi0gIHsibXgiLAkgICI+PyIsCQlETUdMX0FOU0l9LAkvKiBwc2V1ZG8tYW5zaSAqLwotICB7Im1pbiIsCSAgIjw/IiwJCTB9LAkJLyogb2xkICovCi0gIHsibW4iLAkgICI8PyIsCQlETUdMX0FOU0l9LAkvKiBwc2V1ZG8tYW5zaSAqLwotICB7Im5vcCIsCSAgIiIsCQkwfSwJCS8qIG9sZCAoZm9yIG9wZXJhdG9yPSkgKi8KLSAgeyJybSIsCSAgIi0+KiIsCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJzeiIsICAgICAgICAgICJzaXplb2YgIiwgICAgRE1HTF9BTlNJfSAgICAgIC8qIHBzZXVkby1hbnNpICovCi19OwotCi0vKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHZhcmlvdXMgdHlwZSB2YXJpZXRpZXMuCi0gICBUaGV5IGFyZSBhbGwgbm9uLXplcm8gc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGFzIGBzdWNjZXNzJwotICAgdmFsdWVzLiAgKi8KLXR5cGVkZWYgZW51bSB0eXBlX2tpbmRfdAotewotICB0a19ub25lLAotICB0a19wb2ludGVyLAotICB0a19yZWZlcmVuY2UsCi0gIHRrX2ludGVncmFsLAotICB0a19ib29sLAotICB0a19jaGFyLAotICB0a19yZWFsCi19IHR5cGVfa2luZF90OwotCi0jZGVmaW5lIFNUUklOR19FTVBUWShzdHIpCSgoc3RyKSAtPiBiID09IChzdHIpIC0+IHApCi0jZGVmaW5lIFBSRVBFTkRfQkxBTksoc3RyKQl7aWYgKCFTVFJJTkdfRU1QVFkoc3RyKSkgXAotICAgIHN0cmluZ19wcmVwZW5kKHN0ciwgIiAiKTt9Ci0jZGVmaW5lIEFQUEVORF9CTEFOSyhzdHIpCXtpZiAoIVNUUklOR19FTVBUWShzdHIpKSBcCi0gICAgc3RyaW5nX2FwcGVuZChzdHIsICIgIik7fQotI2RlZmluZSBMRU5fU1RSSU5HKHN0cikgICAgICAgICAoIChTVFJJTkdfRU1QVFkoc3RyKSk/MDooKHN0ciktPnAgLSAoc3RyKS0+YikpCi0KLS8qIFRoZSBzY29wZSBzZXBhcmF0b3IgYXBwcm9wcmlhdGUgZm9yIHRoZSBsYW5ndWFnZSBiZWluZyBkZW1hbmdsZWQuICAqLwotCi0jZGVmaW5lIFNDT1BFX1NUUklORyh3b3JrKSAoKHdvcmstPm9wdGlvbnMgJiBETUdMX0pBVkEpID8gIi4iIDogIjo6IikKLQotI2RlZmluZSBBUk1fVlRBQkxFX1NUUklORyAiX192dGJsX18iCS8qIEx1Y2lkL0FSTSB2aXJ0dWFsIHRhYmxlIHByZWZpeCAqLwotI2RlZmluZSBBUk1fVlRBQkxFX1NUUkxFTiA4CQkvKiBzdHJsZW4gKEFSTV9WVEFCTEVfU1RSSU5HKSAqLwotCi0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGNoYXIgKgotbW9wX3VwIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIHN0cmluZyAqLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLXNxdWFuZ2xlX21vcF91cCBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqKSk7Ci0KLSNpZiAwCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9tZXRob2RfYXJncyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotI2VuZGlmCi0KLXN0YXRpYyBjaGFyICoKLWludGVybmFsX2NwbHVzX2RlbWFuZ2xlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV90ZW1wbGF0ZV90ZW1wbGF0ZV9wYXJtIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrLAotCQkJCQkgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfdGVtcGxhdGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKndvcmssIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqLAotCQkJICAgc3RyaW5nICosIGludCwgaW50KSk7Ci0KLXN0YXRpYyBpbnQKLWFybV9wdCBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKiwKLQkJY29uc3QgY2hhciAqKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9jbGFzc19uYW1lIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3F1YWxpZmllZCBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKiwKLQkJCSAgICBpbnQsIGludCkpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9jbGFzcyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9mdW5kX3R5cGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfc2lnbmF0dXJlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3ByZWZpeCBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1nbnVfc3BlY2lhbCBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1hcm1fc3BlY2lhbCBQQVJBTVMgKChjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX25lZWQgUEFSQU1TICgoc3RyaW5nICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2RlbGV0ZSBQQVJBTVMgKChzdHJpbmcgKikpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2luaXQgUEFSQU1TICgoc3RyaW5nICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19jbGVhciBQQVJBTVMgKChzdHJpbmcgKikpOwotCi0jaWYgMAotc3RhdGljIGludAotc3RyaW5nX2VtcHR5IFBBUkFNUyAoKHN0cmluZyAqKSk7Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQKLXN0cmluZ19hcHBlbmQgUEFSQU1TICgoc3RyaW5nICosIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2FwcGVuZHMgUEFSQU1TICgoc3RyaW5nICosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfYXBwZW5kbiBQQVJBTVMgKChzdHJpbmcgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19wcmVwZW5kIFBBUkFNUyAoKHN0cmluZyAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19wcmVwZW5kbiBQQVJBTVMgKChzdHJpbmcgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLQotc3RhdGljIGludAotZ2V0X2NvdW50IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiosIGludCAqKSk7Ci0KLXN0YXRpYyBpbnQKLWNvbnN1bWVfY291bnQgUEFSQU1TICgoY29uc3QgY2hhciAqKikpOwotCi1zdGF0aWMgaW50Ci1jb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgUEFSQU1TICgoY29uc3QgY2hhcioqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2FyZ3MgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfbmVzdGVkX2FyZ3MgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYqLCBjb25zdCBjaGFyKiosIHN0cmluZyopKTsKLQotc3RhdGljIGludAotZG9fdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kb19hcmcgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIHZvaWQKLWRlbWFuZ2xlX2Z1bmN0aW9uX25hbWUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICosCi0JCQkJY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZW1lbWJlcl90eXBlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1yZW1lbWJlcl9CdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICosIGludCwgaW50KSk7Ci0KLXN0YXRpYyBpbnQKLXJlZ2lzdGVyX0J0eXBlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICopKTsKLQotc3RhdGljIHZvaWQKLXJlbWVtYmVyX0t0eXBlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1mb3JnZXRfdHlwZXMgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKikpOwotCi1zdGF0aWMgdm9pZAotZm9yZ2V0X0JfYW5kX0tfdHlwZXMgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKikpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX3ByZXBlbmRzIFBBUkFNUyAoKHN0cmluZyAqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmKiwgY29uc3QgY2hhcioqLAotCQkJCSAgICAgIHN0cmluZyosIHR5cGVfa2luZF90KSk7Ci0KLXN0YXRpYyBpbnQKLWRvX2hwYWNjX3RlbXBsYXRlX2NvbnN0X3ZhbHVlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRvX2hwYWNjX3RlbXBsYXRlX2xpdGVyYWwgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotc25hcmZfbnVtZXJpY19saXRlcmFsIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLS8qIFRoZXJlIGlzIGEgVFlQRV9RVUFMIHZhbHVlIGZvciBlYWNoIHR5cGUgcXVhbGlmaWVyLiAgVGhleSBjYW4gYmUKLSAgIGNvbWJpbmVkIGJ5IGJpdHdpc2Utb3IgdG8gZm9ybSB0aGUgY29tcGxldGUgc2V0IG9mIHF1YWxpZmllcnMgZm9yIGEKLSAgIHR5cGUuICAqLwotCi0jZGVmaW5lIFRZUEVfVU5RVUFMSUZJRUQgICAweDAKLSNkZWZpbmUgVFlQRV9RVUFMX0NPTlNUICAgIDB4MQotI2RlZmluZSBUWVBFX1FVQUxfVk9MQVRJTEUgMHgyCi0jZGVmaW5lIFRZUEVfUVVBTF9SRVNUUklDVCAweDQKLQotc3RhdGljIGludAotY29kZV9mb3JfcXVhbGlmaWVyIFBBUkFNUyAoKGludCkpOwotCi1zdGF0aWMgY29uc3QgY2hhcioKLXF1YWxpZmllcl9zdHJpbmcgUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotZGVtYW5nbGVfcXVhbGlmaWVyIFBBUkFNUyAoKGludCkpOwotCi0vKiBUcmFuc2xhdGUgY291bnQgdG8gaW50ZWdlciwgY29uc3VtaW5nIHRva2VucyBpbiB0aGUgcHJvY2Vzcy4KLSAgIENvbnZlcnNpb24gdGVybWluYXRlcyBvbiB0aGUgZmlyc3Qgbm9uLWRpZ2l0IGNoYXJhY3Rlci4KLQotICAgVHJ5aW5nIHRvIGNvbnN1bWUgc29tZXRoaW5nIHRoYXQgaXNuJ3QgYSBjb3VudCByZXN1bHRzIGluIG5vCi0gICBjb25zdW1wdGlvbiBvZiBpbnB1dCBhbmQgYSByZXR1cm4gb2YgLTEuCi0KLSAgIE92ZXJmbG93IGNvbnN1bWVzIHRoZSByZXN0IG9mIHRoZSBkaWdpdHMsIGFuZCByZXR1cm5zIC0xLiAgKi8KLQotc3RhdGljIGludAotY29uc3VtZV9jb3VudCAodHlwZSkKLSAgICAgY29uc3QgY2hhciAqKnR5cGU7Ci17Ci0gIGludCBjb3VudCA9IDA7Ci0KLSAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKip0eXBlKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqdHlwZSkpCi0gICAgewotICAgICAgY291bnQgKj0gMTA7Ci0KLSAgICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdy4KLQkgV2UgYXNzdW1lIHRoYXQgY291bnQgaXMgcmVwcmVzZW50ZWQgdXNpbmcgdHdvJ3MtY29tcGxlbWVudDsKLQkgbm8gcG93ZXIgb2YgdHdvIGlzIGRpdmlzaWJsZSBieSB0ZW4sIHNvIGlmIGFuIG92ZXJmbG93IG9jY3VycwotCSB3aGVuIG11bHRpcGx5aW5nIGJ5IHRlbiwgdGhlIHJlc3VsdCB3aWxsIG5vdCBiZSBhIG11bHRpcGxlIG9mCi0JIHRlbi4gICovCi0gICAgICBpZiAoKGNvdW50ICUgMTApICE9IDApCi0JewotCSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnR5cGUpKQotCSAgICAoKnR5cGUpKys7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICBjb3VudCArPSAqKnR5cGUgLSAnMCc7Ci0gICAgICAoKnR5cGUpKys7Ci0gICAgfQotCi0gIHJldHVybiAoY291bnQpOwotfQotCi0KLS8qIExpa2UgY29uc3VtZV9jb3VudCwgYnV0IGZvciBjb3VudHMgdGhhdCBhcmUgcHJlY2VkZWQgYW5kIGZvbGxvd2VkCi0gICBieSAnXycgaWYgdGhleSBhcmUgZ3JlYXRlciB0aGFuIDEwLiAgQWxzbywgLTEgaXMgcmV0dXJuZWQgZm9yCi0gICBmYWlsdXJlLCBzaW5jZSAwIGNhbiBiZSBhIHZhbGlkIHZhbHVlLiAgKi8KLQotc3RhdGljIGludAotY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKQotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLXsKLSAgaW50IGlkeDsKLQotICBpZiAoKiptYW5nbGVkID09ICdfJykKLSAgICB7Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0JcmV0dXJuIC0xOwotCi0gICAgICBpZHggPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLSAgICAgIGlmICgqKm1hbmdsZWQgIT0gJ18nKQotCS8qIFRoZSB0cmFpbGluZyB1bmRlcnNjb3JlIHdhcyBtaXNzaW5nLiAqLwotCXJldHVybiAtMTsKLQotICAgICAgKCptYW5nbGVkKSsrOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICgqKm1hbmdsZWQgPCAnMCcgfHwgKiptYW5nbGVkID4gJzknKQotCXJldHVybiAtMTsKLQotICAgICAgaWR4ID0gKiptYW5nbGVkIC0gJzAnOwotICAgICAgKCptYW5nbGVkKSsrOwotICAgIH0KLQotICByZXR1cm4gaWR4OwotfQotCi0vKiBDIGlzIHRoZSBjb2RlIGZvciBhIHR5cGUtcXVhbGlmaWVyLiAgUmV0dXJuIHRoZSBUWVBFX1FVQUwKLSAgIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBxdWFsaWZpZXIuICAqLwotCi1zdGF0aWMgaW50Ci1jb2RlX2Zvcl9xdWFsaWZpZXIgKGMpCi0gIGludCBjOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ0MnOgotICAgICAgcmV0dXJuIFRZUEVfUVVBTF9DT05TVDsKLQotICAgIGNhc2UgJ1YnOgotICAgICAgcmV0dXJuIFRZUEVfUVVBTF9WT0xBVElMRTsKLQotICAgIGNhc2UgJ3UnOgotICAgICAgcmV0dXJuIFRZUEVfUVVBTF9SRVNUUklDVDsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogQyB3YXMgYW4gaW52YWxpZCBxdWFsaWZpZXIuICAqLwotICBhYm9ydCAoKTsKLX0KLQotLyogUmV0dXJuIHRoZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgcXVhbGlmaWVycyBnaXZlbiBieQotICAgVFlQRV9RVUFMUy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyKgotcXVhbGlmaWVyX3N0cmluZyAodHlwZV9xdWFscykKLSAgICAgaW50IHR5cGVfcXVhbHM7Ci17Ci0gIHN3aXRjaCAodHlwZV9xdWFscykKLSAgICB7Ci0gICAgY2FzZSBUWVBFX1VOUVVBTElGSUVEOgotICAgICAgcmV0dXJuICIiOwotCi0gICAgY2FzZSBUWVBFX1FVQUxfQ09OU1Q6Ci0gICAgICByZXR1cm4gImNvbnN0IjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX1ZPTEFUSUxFOgotICAgICAgcmV0dXJuICJ2b2xhdGlsZSI7Ci0KLSAgICBjYXNlIFRZUEVfUVVBTF9SRVNUUklDVDoKLSAgICAgIHJldHVybiAiX19yZXN0cmljdCI7Ci0KLSAgICBjYXNlIFRZUEVfUVVBTF9DT05TVCB8IFRZUEVfUVVBTF9WT0xBVElMRToKLSAgICAgIHJldHVybiAiY29uc3Qgdm9sYXRpbGUiOwotCi0gICAgY2FzZSBUWVBFX1FVQUxfQ09OU1QgfCBUWVBFX1FVQUxfUkVTVFJJQ1Q6Ci0gICAgICByZXR1cm4gImNvbnN0IF9fcmVzdHJpY3QiOwotCi0gICAgY2FzZSBUWVBFX1FVQUxfVk9MQVRJTEUgfCBUWVBFX1FVQUxfUkVTVFJJQ1Q6Ci0gICAgICByZXR1cm4gInZvbGF0aWxlIF9fcmVzdHJpY3QiOwotCi0gICAgY2FzZSBUWVBFX1FVQUxfQ09OU1QgfCBUWVBFX1FVQUxfVk9MQVRJTEUgfCBUWVBFX1FVQUxfUkVTVFJJQ1Q6Ci0gICAgICByZXR1cm4gImNvbnN0IHZvbGF0aWxlIF9fcmVzdHJpY3QiOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBUWVBFX1FVQUxTIHdhcyBhbiBpbnZhbGlkIHF1YWxpZmllciBzZXQuICAqLwotICBhYm9ydCAoKTsKLX0KLQotLyogQyBpcyB0aGUgY29kZSBmb3IgYSB0eXBlLXF1YWxpZmllci4gIFJldHVybiB0aGUgc3RyaW5nCi0gICBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcXVhbGlmaWVyLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZQotICAgY2FsbGVkIHdpdGggYSB2YWxpZCBxdWFsaWZpZXIgY29kZS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyKgotZGVtYW5nbGVfcXVhbGlmaWVyIChjKQotICBpbnQgYzsKLXsKLSAgcmV0dXJuIHF1YWxpZmllcl9zdHJpbmcgKGNvZGVfZm9yX3F1YWxpZmllciAoYykpOwotfQotCi1pbnQKLWNwbHVzX2RlbWFuZ2xlX29wbmFtZSAob3BuYW1lLCByZXN1bHQsIG9wdGlvbnMpCi0gICAgIGNvbnN0IGNoYXIgKm9wbmFtZTsKLSAgICAgY2hhciAqcmVzdWx0OwotICAgICBpbnQgb3B0aW9uczsKLXsKLSAgaW50IGxlbiwgbGVuMSwgcmV0OwotICBzdHJpbmcgdHlwZTsKLSAgc3RydWN0IHdvcmtfc3R1ZmYgd29ya1sxXTsKLSAgY29uc3QgY2hhciAqdGVtOwotCi0gIGxlbiA9IHN0cmxlbihvcG5hbWUpOwotICByZXN1bHRbMF0gPSAnXDAnOwotICByZXQgPSAwOwotICBtZW1zZXQgKChjaGFyICopIHdvcmssIDAsIHNpemVvZiAod29yaykpOwotICB3b3JrLT5vcHRpb25zID0gb3B0aW9uczsKLQotICBpZiAob3BuYW1lWzBdID09ICdfJyAmJiBvcG5hbWVbMV0gPT0gJ18nCi0gICAgICAmJiBvcG5hbWVbMl0gPT0gJ28nICYmIG9wbmFtZVszXSA9PSAncCcpCi0gICAgewotICAgICAgLyogQU5TSS4gICovCi0gICAgICAvKiB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IuICAqLwotICAgICAgdGVtID0gb3BuYW1lICsgNDsKLSAgICAgIGlmIChkb190eXBlICh3b3JrLCAmdGVtLCAmdHlwZSkpCi0JewotCSAgc3RyY2F0IChyZXN1bHQsICJvcGVyYXRvciAiKTsKLQkgIHN0cm5jYXQgKHJlc3VsdCwgdHlwZS5iLCB0eXBlLnAgLSB0eXBlLmIpOwotCSAgc3RyaW5nX2RlbGV0ZSAoJnR5cGUpOwotCSAgcmV0ID0gMTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChvcG5hbWVbMF0gPT0gJ18nICYmIG9wbmFtZVsxXSA9PSAnXycKLQkgICAmJiBvcG5hbWVbMl0gPj0gJ2EnICYmIG9wbmFtZVsyXSA8PSAneicKLQkgICAmJiBvcG5hbWVbM10gPj0gJ2EnICYmIG9wbmFtZVszXSA8PSAneicpCi0gICAgewotICAgICAgaWYgKG9wbmFtZVs0XSA9PSAnXDAnKQotCXsKLQkgIC8qIE9wZXJhdG9yLiAgKi8KLQkgIHNpemVfdCBpOwotCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSAyCi0JCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBvcG5hbWUgKyAyLCAyKSA9PSAwKQotCQl7Ci0JCSAgc3RyY2F0IChyZXN1bHQsICJvcGVyYXRvciIpOwotCQkgIHN0cmNhdCAocmVzdWx0LCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgcmV0ID0gMTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChvcG5hbWVbMl0gPT0gJ2EnICYmIG9wbmFtZVs1XSA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgLyogQXNzaWdubWVudC4gICovCi0JICAgICAgc2l6ZV90IGk7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JCXsKLQkJICBpZiAoc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSAzCi0JCSAgICAgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgb3BuYW1lICsgMiwgMykgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgc3RyY2F0IChyZXN1bHQsICJvcGVyYXRvciIpOwotCQkgICAgICBzdHJjYXQgKHJlc3VsdCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgICAgICByZXQgPSAxOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAobGVuID49IDMKLQkgICAmJiBvcG5hbWVbMF0gPT0gJ28nCi0JICAgJiYgb3BuYW1lWzFdID09ICdwJwotCSAgICYmIHN0cmNociAoY3BsdXNfbWFya2Vycywgb3BuYW1lWzJdKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIHNlZSBpZiBpdCdzIGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiAqLwotICAgICAgaWYgKGxlbiA+PSAxMCAvKiBvcCRhc3NpZ25fICovCi0JICAmJiBtZW1jbXAgKG9wbmFtZSArIDMsICJhc3NpZ25fIiwgNykgPT0gMCkKLQl7Ci0JICBzaXplX3QgaTsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCSAgICB7Ci0JICAgICAgbGVuMSA9IGxlbiAtIDEwOwotCSAgICAgIGlmICgoaW50KSBzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IGxlbjEKLQkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIG9wbmFtZSArIDEwLCBsZW4xKSA9PSAwKQotCQl7Ci0JCSAgc3RyY2F0IChyZXN1bHQsICJvcGVyYXRvciIpOwotCQkgIHN0cmNhdCAocmVzdWx0LCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgc3RyY2F0IChyZXN1bHQsICI9Iik7Ci0JCSAgcmV0ID0gMTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNpemVfdCBpOwotCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JICAgIHsKLQkgICAgICBsZW4xID0gbGVuIC0gMzsKLQkgICAgICBpZiAoKGludCkgc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSBsZW4xCi0JCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBvcG5hbWUgKyAzLCBsZW4xKSA9PSAwKQotCQl7Ci0JCSAgc3RyY2F0IChyZXN1bHQsICJvcGVyYXRvciIpOwotCQkgIHN0cmNhdCAocmVzdWx0LCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgcmV0ID0gMTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAobGVuID49IDUgJiYgbWVtY21wIChvcG5hbWUsICJ0eXBlIiwgNCkgPT0gMAotCSAgICYmIHN0cmNociAoY3BsdXNfbWFya2Vycywgb3BuYW1lWzRdKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciAqLwotICAgICAgdGVtID0gb3BuYW1lICsgNTsKLSAgICAgIGlmIChkb190eXBlICh3b3JrLCAmdGVtLCAmdHlwZSkpCi0JewotCSAgc3RyY2F0IChyZXN1bHQsICJvcGVyYXRvciAiKTsKLQkgIHN0cm5jYXQgKHJlc3VsdCwgdHlwZS5iLCB0eXBlLnAgLSB0eXBlLmIpOwotCSAgc3RyaW5nX2RlbGV0ZSAoJnR5cGUpOwotCSAgcmV0ID0gMTsKLQl9Ci0gICAgfQotICBzcXVhbmdsZV9tb3BfdXAgKHdvcmspOwotICByZXR1cm4gcmV0OwotCi19Ci0vKiBUYWtlcyBvcGVyYXRvciBuYW1lIGFzIGUuZy4gIisrIiBhbmQgcmV0dXJucyBtYW5nbGVkCi0gICBvcGVyYXRvciBuYW1lIChlLmcuICJwb3N0aW5jcmVtZW50X2V4cHIiKSwgb3IgTlVMTCBpZiBub3QgZm91bmQuCi0KLSAgIElmIE9QVElPTlMgJiBETUdMX0FOU0kgPT0gMSwgcmV0dXJuIHRoZSBBTlNJIG5hbWU7Ci0gICBpZiBPUFRJT05TICYgRE1HTF9BTlNJID09IDAsIHJldHVybiB0aGUgb2xkIEdOVSBuYW1lLiAgKi8KLQotY29uc3QgY2hhciAqCi1jcGx1c19tYW5nbGVfb3BuYW1lIChvcG5hbWUsIG9wdGlvbnMpCi0gICAgIGNvbnN0IGNoYXIgKm9wbmFtZTsKLSAgICAgaW50IG9wdGlvbnM7Ci17Ci0gIHNpemVfdCBpOwotICBpbnQgbGVuOwotCi0gIGxlbiA9IHN0cmxlbiAob3BuYW1lKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0gICAgewotICAgICAgaWYgKChpbnQpIHN0cmxlbiAob3B0YWJsZVtpXS5vdXQpID09IGxlbgotCSAgJiYgKG9wdGlvbnMgJiBETUdMX0FOU0kpID09IChvcHRhYmxlW2ldLmZsYWdzICYgRE1HTF9BTlNJKQotCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLm91dCwgb3BuYW1lLCBsZW4pID09IDApCi0JcmV0dXJuIG9wdGFibGVbaV0uaW47Ci0gICAgfQotICByZXR1cm4gKDApOwotfQotCi0vKiBjaGFyICpjcGx1c19kZW1hbmdsZSAoY29uc3QgY2hhciAqbWFuZ2xlZCwgaW50IG9wdGlvbnMpCi0KLSAgIElmIE1BTkdMRUQgaXMgYSBtYW5nbGVkIGZ1bmN0aW9uIG5hbWUgcHJvZHVjZWQgYnkgR05VIEMrKywgdGhlbgotICAgYSBwb2ludGVyIHRvIGEgbWFsbG9jZWQgc3RyaW5nIGdpdmluZyBhIEMrKyByZXByZXNlbnRhdGlvbgotICAgb2YgdGhlIG5hbWUgd2lsbCBiZSByZXR1cm5lZDsgb3RoZXJ3aXNlIE5VTEwgd2lsbCBiZSByZXR1cm5lZC4KLSAgIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBmcmVlIHRoZSBzdHJpbmcgd2hpY2gKLSAgIGlzIHJldHVybmVkLgotCi0gICBUaGUgT1BUSU9OUyBhcmcgbWF5IGNvbnRhaW4gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBiaXRzOgotCi0gICAJRE1HTF9BTlNJCUFOU0kgcXVhbGlmaWVycyBzdWNoIGFzIGBjb25zdCcgYW5kIGB2b2lkJyBhcmUKLQkJCWluY2x1ZGVkLgotCURNR0xfUEFSQU1TCUZ1bmN0aW9uIHBhcmFtZXRlcnMgYXJlIGluY2x1ZGVkLgotCi0gICBGb3IgZXhhbXBsZSwKLQotICAgY3BsdXNfZGVtYW5nbGUgKCJmb29fXzFBaSIsIERNR0xfUEFSQU1TKQkJPT4gIkE6OmZvbyhpbnQpIgotICAgY3BsdXNfZGVtYW5nbGUgKCJmb29fXzFBaSIsIERNR0xfUEFSQU1TIHwgRE1HTF9BTlNJKQk9PiAiQTo6Zm9vKGludCkiCi0gICBjcGx1c19kZW1hbmdsZSAoImZvb19fMUFpIiwgMCkJCQk9PiAiQTo6Zm9vIgotCi0gICBjcGx1c19kZW1hbmdsZSAoImZvb19fMUFmZSIsIERNR0xfUEFSQU1TKQkJPT4gIkE6OmZvbyhmbG9hdCwuLi4pIgotICAgY3BsdXNfZGVtYW5nbGUgKCJmb29fXzFBZmUiLCBETUdMX1BBUkFNUyB8IERNR0xfQU5TSSk9PiAiQTo6Zm9vKGZsb2F0LC4uLikiCi0gICBjcGx1c19kZW1hbmdsZSAoImZvb19fMUFmZSIsIDApCQkJPT4gIkE6OmZvbyIKLQotICAgTm90ZSB0aGF0IGFueSBsZWFkaW5nIHVuZGVyc2NvcmVzLCBvciBvdGhlciBzdWNoIGNoYXJhY3RlcnMgcHJlcGVuZGVkIGJ5Ci0gICB0aGUgY29tcGlsYXRpb24gc3lzdGVtLCBhcmUgcHJlc3VtZWQgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gc3RyaXBwZWQgZnJvbQotICAgTUFOR0xFRC4gICovCi0KLWNoYXIgKgotY3BsdXNfZGVtYW5nbGUgKG1hbmdsZWQsIG9wdGlvbnMpCi0gICAgIGNvbnN0IGNoYXIgKm1hbmdsZWQ7Ci0gICAgIGludCBvcHRpb25zOwotewotICBjaGFyICpyZXQ7Ci0gIHN0cnVjdCB3b3JrX3N0dWZmIHdvcmtbMV07Ci0gIG1lbXNldCAoKGNoYXIgKikgd29yaywgMCwgc2l6ZW9mICh3b3JrKSk7Ci0gIHdvcmsgLT4gb3B0aW9ucyA9IG9wdGlvbnM7Ci0gIGlmICgod29yayAtPiBvcHRpb25zICYgRE1HTF9TVFlMRV9NQVNLKSA9PSAwKQotICAgIHdvcmsgLT4gb3B0aW9ucyB8PSAoaW50KSBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgJiBETUdMX1NUWUxFX01BU0s7Ci0KLSAgcmV0ID0gaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUgKHdvcmssIG1hbmdsZWQpOwotICBzcXVhbmdsZV9tb3BfdXAgKHdvcmspOwotICByZXR1cm4gKHJldCk7Ci19Ci0KLQotLyogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBtb3N0IG9mIHdoYXQgY3BsdXNfZGVtYW5nbGUgdXNlIHRvIGRvLCBidXQKLSAgIHRvIGJlIGFibGUgdG8gZGVtYW5nbGUgYSBuYW1lIHdpdGggYSBCLCBLIG9yIG4gY29kZSwgd2UgbmVlZCB0bwotICAgaGF2ZSBhIGxvbmdlciB0ZXJtIG1lbW9yeSBvZiB3aGF0IHR5cGVzIGhhdmUgYmVlbiBzZWVuLiBUaGUgb3JpZ2luYWwKLSAgIG5vdyBpbnRpYWxpemVzIGFuZCBjbGVhbnMgdXAgdGhlIHNxdWFuZ2xlIGNvZGUgaW5mbywgd2hpbGUgaW50ZXJuYWwKLSAgIGNhbGxzIGdvIGRpcmVjdGx5IHRvIHRoaXMgcm91dGluZSB0byBhdm9pZCByZXNldHRpbmcgdGhhdCBpbmZvLiAqLwotCi1zdGF0aWMgY2hhciAqCi1pbnRlcm5hbF9jcGx1c19kZW1hbmdsZSAod29yaywgbWFuZ2xlZCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKm1hbmdsZWQ7Ci17Ci0KLSAgc3RyaW5nIGRlY2w7Ci0gIGludCBzdWNjZXNzID0gMDsKLSAgY2hhciAqZGVtYW5nbGVkID0gTlVMTDsKLSAgaW50IHMxLHMyLHMzLHM0OwotICBzMSA9IHdvcmstPmNvbnN0cnVjdG9yOwotICBzMiA9IHdvcmstPmRlc3RydWN0b3I7Ci0gIHMzID0gd29yay0+c3RhdGljX3R5cGU7Ci0gIHM0ID0gd29yay0+dHlwZV9xdWFsczsKLSAgd29yay0+Y29uc3RydWN0b3IgPSB3b3JrLT5kZXN0cnVjdG9yID0gMDsKLSAgd29yay0+dHlwZV9xdWFscyA9IFRZUEVfVU5RVUFMSUZJRUQ7Ci0gIHdvcmstPmRsbGltcG9ydGVkID0gMDsKLQotICBpZiAoKG1hbmdsZWQgIT0gTlVMTCkgJiYgKCptYW5nbGVkICE9ICdcMCcpKQotICAgIHsKLSAgICAgIHN0cmluZ19pbml0ICgmZGVjbCk7Ci0KLSAgICAgIC8qIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiBnbnUgc3R5bGUgZGVtYW5nbGluZyBpcyBhY3RpdmUgYW5kIGlmIHRoZQotCSBzdHJpbmcgdG8gYmUgZGVtYW5nbGVkIGNvbnRhaW5zIGEgQ1BMVVNfTUFSS0VSLiAgSWYgc28sIGF0dGVtcHQgdG8KLQkgcmVjb2duaXplIG9uZSBvZiB0aGUgZ251IHNwZWNpYWwgZm9ybXMgcmF0aGVyIHRoYW4gbG9va2luZyBmb3IgYQotCSBzdGFuZGFyZCBwcmVmaXguICBJbiBwYXJ0aWN1bGFyLCBkb24ndCB3b3JyeSBhYm91dCB3aGV0aGVyIHRoZXJlCi0JIGlzIGEgIl9fIiBzdHJpbmcgaW4gdGhlIG1hbmdsZWQgc3RyaW5nLiAgQ29uc2lkZXIgIl8kXzVfX2ZvbyIgZm9yCi0JIGV4YW1wbGUuICAqLwotCi0gICAgICBpZiAoKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORykpCi0JewotCSAgc3VjY2VzcyA9IGdudV9zcGVjaWFsICh3b3JrLCAmbWFuZ2xlZCwgJmRlY2wpOwotCX0KLSAgICAgIGlmICghc3VjY2VzcykKLQl7Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfcHJlZml4ICh3b3JrLCAmbWFuZ2xlZCwgJmRlY2wpOwotCX0KLSAgICAgIGlmIChzdWNjZXNzICYmICgqbWFuZ2xlZCAhPSAnXDAnKSkKLQl7Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfc2lnbmF0dXJlICh3b3JrLCAmbWFuZ2xlZCwgJmRlY2wpOwotCX0KLSAgICAgIGlmICh3b3JrLT5jb25zdHJ1Y3RvciA9PSAyKQotICAgICAgICB7Ci0gICAgICAgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiZ2xvYmFsIGNvbnN0cnVjdG9ycyBrZXllZCB0byAiKTsKLSAgICAgICAgICB3b3JrLT5jb25zdHJ1Y3RvciA9IDA7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHdvcmstPmRlc3RydWN0b3IgPT0gMikKLSAgICAgICAgewotICAgICAgICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgImdsb2JhbCBkZXN0cnVjdG9ycyBrZXllZCB0byAiKTsKLSAgICAgICAgICB3b3JrLT5kZXN0cnVjdG9yID0gMDsKLSAgICAgICAgfQotICAgICAgZWxzZSBpZiAod29yay0+ZGxsaW1wb3J0ZWQgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgImltcG9ydCBzdHViIGZvciAiKTsKLSAgICAgICAgICB3b3JrLT5kbGxpbXBvcnRlZCA9IDA7Ci0gICAgICAgIH0KLSAgICAgIGRlbWFuZ2xlZCA9IG1vcF91cCAod29yaywgJmRlY2wsIHN1Y2Nlc3MpOwotICAgIH0KLSAgd29yay0+Y29uc3RydWN0b3IgPSBzMTsKLSAgd29yay0+ZGVzdHJ1Y3RvciA9IHMyOwotICB3b3JrLT5zdGF0aWNfdHlwZSA9IHMzOwotICB3b3JrLT50eXBlX3F1YWxzID0gczQ7Ci0gIHJldHVybiAoZGVtYW5nbGVkKTsKLX0KLQotCi0vKiBDbGVhciBvdXQgYW5kIHNxdWFuZ2xpbmcgcmVsYXRlZCBzdG9yYWdlICovCi1zdGF0aWMgdm9pZAotc3F1YW5nbGVfbW9wX3VwICh3b3JrKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLXsKLSAgLyogY2xlYW4gdXAgdGhlIEIgYW5kIEsgdHlwZSBtYW5nbGluZyB0eXBlcy4gKi8KLSAgZm9yZ2V0X0JfYW5kX0tfdHlwZXMgKHdvcmspOwotICBpZiAod29yayAtPiBidHlwZXZlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKChjaGFyICopIHdvcmsgLT4gYnR5cGV2ZWMpOwotICAgIH0KLSAgaWYgKHdvcmsgLT4ga3R5cGV2ZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlICgoY2hhciAqKSB3b3JrIC0+IGt0eXBldmVjKTsKLSAgICB9Ci19Ci0KLS8qIENsZWFyIG91dCBhbnkgbWFuZ2xlZCBzdG9yYWdlICovCi0KLXN0YXRpYyBjaGFyICoKLW1vcF91cCAod29yaywgZGVjbHAsIHN1Y2Nlc3MpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBzdHJpbmcgKmRlY2xwOwotICAgICBpbnQgc3VjY2VzczsKLXsKLSAgY2hhciAqZGVtYW5nbGVkID0gTlVMTDsKLQotICAvKiBEaXNjYXJkIHRoZSByZW1lbWJlcmVkIHR5cGVzLCBpZiBhbnkuICAqLwotCi0gIGZvcmdldF90eXBlcyAod29yayk7Ci0gIGlmICh3b3JrIC0+IHR5cGV2ZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlICgoY2hhciAqKSB3b3JrIC0+IHR5cGV2ZWMpOwotICAgICAgd29yayAtPiB0eXBldmVjID0gTlVMTDsKLSAgICAgIHdvcmsgLT4gdHlwZXZlY19zaXplID0gMDsKLSAgICB9Ci0gIGlmICh3b3JrLT50bXBsX2FyZ3ZlYykKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IHdvcmstPm50bXBsX2FyZ3M7IGkrKykKLQlpZiAod29yay0+dG1wbF9hcmd2ZWNbaV0pCi0JICBmcmVlICgoY2hhciopIHdvcmstPnRtcGxfYXJndmVjW2ldKTsKLQotICAgICAgZnJlZSAoKGNoYXIqKSB3b3JrLT50bXBsX2FyZ3ZlYyk7Ci0gICAgICB3b3JrLT50bXBsX2FyZ3ZlYyA9IE5VTEw7Ci0gICAgfQotICBpZiAod29yay0+cHJldmlvdXNfYXJndW1lbnQpCi0gICAgewotICAgICAgc3RyaW5nX2RlbGV0ZSAod29yay0+cHJldmlvdXNfYXJndW1lbnQpOwotICAgICAgZnJlZSAoKGNoYXIqKSB3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7Ci0gICAgICB3b3JrLT5wcmV2aW91c19hcmd1bWVudCA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIGRlbWFuZ2xpbmcgd2FzIHN1Y2Nlc3NmdWwsIGVuc3VyZSB0aGF0IHRoZSBkZW1hbmdsZWQgc3RyaW5nIGlzIG51bGwKLSAgICAgdGVybWluYXRlZCBhbmQgcmV0dXJuIGl0LiAgT3RoZXJ3aXNlLCBmcmVlIHRoZSBkZW1hbmdsaW5nIGRlY2wuICAqLwotCi0gIGlmICghc3VjY2VzcykKLSAgICB7Ci0gICAgICBzdHJpbmdfZGVsZXRlIChkZWNscCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAiIiwgMSk7Ci0gICAgICBkZW1hbmdsZWQgPSBkZWNscCAtPiBiOwotICAgIH0KLSAgcmV0dXJuIChkZW1hbmdsZWQpOwotfQotCi0vKgotCi1MT0NBTCBGVU5DVElPTgotCi0JZGVtYW5nbGVfc2lnbmF0dXJlIC0tIGRlbWFuZ2xlIHRoZSBzaWduYXR1cmUgcGFydCBvZiBhIG1hbmdsZWQgbmFtZQotCi1TWU5PUFNJUwotCi0Jc3RhdGljIGludAotCWRlbWFuZ2xlX3NpZ25hdHVyZSAoc3RydWN0IHdvcmtfc3R1ZmYgKndvcmssIGNvbnN0IGNoYXIgKiptYW5nbGVkLAotCQkJICAgIHN0cmluZyAqZGVjbHApOwotCi1ERVNDUklQVElPTgotCi0JQ29uc3VtZSBhbmQgZGVtYW5nbGUgdGhlIHNpZ25hdHVyZSBwb3J0aW9uIG9mIHRoZSBtYW5nbGVkIG5hbWUuCi0KLQlERUNMUCBpcyB0aGUgc3RyaW5nIHdoZXJlIGRlbWFuZ2xlZCBvdXRwdXQgaXMgYmVpbmcgYnVpbHQuICBBdAotCWVudHJ5IGl0IGNvbnRhaW5zIHRoZSBkZW1hbmdsZWQgcm9vdCBuYW1lIGZyb20gdGhlIG1hbmdsZWQgbmFtZQotCXByZWZpeC4gIEkuRS4gZWl0aGVyIGEgZGVtYW5nbGVkIG9wZXJhdG9yIG5hbWUgb3IgdGhlIHJvb3QgZnVuY3Rpb24KLQluYW1lLiAgSW4gc29tZSBzcGVjaWFsIGNhc2VzLCBpdCBtYXkgY29udGFpbiBub3RoaW5nLgotCi0JKk1BTkdMRUQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IHVuY29uc3VtZWQgbG9jYXRpb24gaW4gdGhlIG1hbmdsZWQKLQluYW1lLiAgQXMgdG9rZW5zIGFyZSBjb25zdW1lZCBhbmQgZGVtYW5nbGluZyBpcyBwZXJmb3JtZWQsIHRoZQotCXBvaW50ZXIgaXMgdXBkYXRlZCB0byBjb250aW51b3VzbHkgcG9pbnQgYXQgdGhlIG5leHQgdG9rZW4gdG8KLQliZSBjb25zdW1lZC4KLQotCURlbWFuZ2xpbmcgR05VIHN0eWxlIG1hbmdsZWQgbmFtZXMgaXMgbmFzdHkgYmVjYXVzZSB0aGVyZSBpcyBubwotCWV4cGxpY2l0IHRva2VuIHRoYXQgbWFya3MgdGhlIHN0YXJ0IG9mIHRoZSBvdXRlcm1vc3QgZnVuY3Rpb24KLQlhcmd1bWVudCBsaXN0LiAgKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfc2lnbmF0dXJlICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgc3VjY2VzcyA9IDE7Ci0gIGludCBmdW5jX2RvbmUgPSAwOwotICBpbnQgZXhwZWN0X2Z1bmMgPSAwOwotICBpbnQgZXhwZWN0X3JldHVybl90eXBlID0gMDsKLSAgY29uc3QgY2hhciAqb2xkbWFuZ2xlZCA9IE5VTEw7Ci0gIHN0cmluZyB0cmF3bmFtZTsKLSAgc3RyaW5nIHRuYW1lOwotCi0gIHdoaWxlIChzdWNjZXNzICYmICgqKm1hbmdsZWQgIT0gJ1wwJykpCi0gICAgewotICAgICAgc3dpdGNoICgqKm1hbmdsZWQpCi0JewotCWNhc2UgJ1EnOgotCSAgb2xkbWFuZ2xlZCA9ICptYW5nbGVkOwotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3F1YWxpZmllZCAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDEsIDApOwotCSAgaWYgKHN1Y2Nlc3MpCi0JICAgIHJlbWVtYmVyX3R5cGUgKHdvcmssIG9sZG1hbmdsZWQsICptYW5nbGVkIC0gb2xkbWFuZ2xlZCk7Ci0JICBpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HKQotCSAgICBleHBlY3RfZnVuYyA9IDE7Ci0JICBvbGRtYW5nbGVkID0gTlVMTDsKLQkgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ0snOgotCSAgb2xkbWFuZ2xlZCA9ICptYW5nbGVkOwotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3F1YWxpZmllZCAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDEsIDApOwotCSAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORykKLQkgICAgewotCSAgICAgIGV4cGVjdF9mdW5jID0gMTsKLQkgICAgfQotCSAgb2xkbWFuZ2xlZCA9IE5VTEw7Ci0JICBicmVhazsKLQotCWNhc2UgJ1MnOgotCSAgLyogU3RhdGljIG1lbWJlciBmdW5jdGlvbiAqLwotCSAgaWYgKG9sZG1hbmdsZWQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIG9sZG1hbmdsZWQgPSAqbWFuZ2xlZDsKLQkgICAgfQotCSAgKCptYW5nbGVkKSsrOwotCSAgd29yayAtPiBzdGF0aWNfdHlwZSA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgJ0MnOgotCWNhc2UgJ1YnOgotCWNhc2UgJ3UnOgotCSAgd29yay0+dHlwZV9xdWFscyB8PSBjb2RlX2Zvcl9xdWFsaWZpZXIgKCoqbWFuZ2xlZCk7Ci0KLQkgIC8qIGEgcXVhbGlmaWVkIG1lbWJlciBmdW5jdGlvbiAqLwotCSAgaWYgKG9sZG1hbmdsZWQgPT0gTlVMTCkKLQkgICAgb2xkbWFuZ2xlZCA9ICptYW5nbGVkOwotCSAgKCptYW5nbGVkKSsrOwotCSAgYnJlYWs7Ci0KLQljYXNlICdMJzoKLQkgIC8qIExvY2FsIGNsYXNzIG5hbWUgZm9sbG93cyBhZnRlciAiTG5ubl8iICovCi0JICBpZiAoSFBfREVNQU5HTElORykKLQkgICAgewotCSAgICAgIHdoaWxlICgqKm1hbmdsZWQgJiYgKCoqbWFuZ2xlZCAhPSAnXycpKQotCQkoKm1hbmdsZWQpKys7Ci0JICAgICAgaWYgKCEqKm1hbmdsZWQpCi0JCXN1Y2Nlc3MgPSAwOwotCSAgICAgIGVsc2UKLQkJKCptYW5nbGVkKSsrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHN1Y2Nlc3MgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6Ci0JY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotCSAgaWYgKG9sZG1hbmdsZWQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIG9sZG1hbmdsZWQgPSAqbWFuZ2xlZDsKLQkgICAgfQotICAgICAgICAgIHdvcmstPnRlbXBfc3RhcnQgPSAtMTsgLyogdXBwZXJtb3N0IGNhbGwgdG8gZGVtYW5nbGVfY2xhc3MgKi8KLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9jbGFzcyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCSAgaWYgKHN1Y2Nlc3MpCi0JICAgIHsKLQkgICAgICByZW1lbWJlcl90eXBlICh3b3JrLCBvbGRtYW5nbGVkLCAqbWFuZ2xlZCAtIG9sZG1hbmdsZWQpOwotCSAgICB9Ci0JICBpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQotCSAgICB7Ci0gICAgICAgICAgICAgIC8qIEVERyBhbmQgb3RoZXJzIHdpbGwgaGF2ZSB0aGUgIkYiLCBzbyB3ZSBsZXQgdGhlIGxvb3AgY3ljbGUKLSAgICAgICAgICAgICAgICAgaWYgd2UgYXJlIGxvb2tpbmcgYXQgb25lLiAqLwotICAgICAgICAgICAgICBpZiAoKiptYW5nbGVkICE9ICdGJykKLSAgICAgICAgICAgICAgICAgZXhwZWN0X2Z1bmMgPSAxOwotCSAgICB9Ci0JICBvbGRtYW5nbGVkID0gTlVMTDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnQic6Ci0JICB7Ci0JICAgIHN0cmluZyBzOwotCSAgICBzdWNjZXNzID0gZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJnMpOwotCSAgICBpZiAoc3VjY2VzcykKLQkgICAgICB7Ci0JCXN0cmluZ19hcHBlbmQgKCZzLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLQkJc3RyaW5nX3ByZXBlbmRzIChkZWNscCwgJnMpOwotCSAgICAgIH0KLQkgICAgb2xkbWFuZ2xlZCA9IE5VTEw7Ci0JICAgIGV4cGVjdF9mdW5jID0gMTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnRic6Ci0JICAvKiBGdW5jdGlvbiAqLwotCSAgLyogQVJNL0hQIHN0eWxlIGRlbWFuZ2xpbmcgaW5jbHVkZXMgYSBzcGVjaWZpYyAnRicgY2hhcmFjdGVyIGFmdGVyCi0JICAgICB0aGUgY2xhc3MgbmFtZS4gIEZvciBHTlUgc3R5bGUsIGl0IGlzIGp1c3QgaW1wbGllZC4gIFNvIHdlIGNhbgotCSAgICAgc2FmZWx5IGp1c3QgY29uc3VtZSBhbnkgJ0YnIGF0IHRoaXMgcG9pbnQgYW5kIGJlIGNvbXBhdGlibGUKLQkgICAgIHdpdGggZWl0aGVyIHN0eWxlLiAgKi8KLQotCSAgb2xkbWFuZ2xlZCA9IE5VTEw7Ci0JICBmdW5jX2RvbmUgPSAxOwotCSAgKCptYW5nbGVkKSsrOwotCi0JICAvKiBGb3IgbHVjaWQvQVJNL0hQIHN0eWxlIHdlIGhhdmUgdG8gZm9yZ2V0IGFueSB0eXBlcyB3ZSBtaWdodAotCSAgICAgaGF2ZSByZW1lbWJlcmVkIHVwIHRvIHRoaXMgcG9pbnQsIHNpbmNlIHRoZXkgd2VyZSBub3QgYXJndW1lbnQKLQkgICAgIHR5cGVzLiAgR05VIHN0eWxlIGNvbnNpZGVycyBhbGwgdHlwZXMgc2VlbiBhcyBhdmFpbGFibGUgZm9yCi0JICAgICBiYWNrIHJlZmVyZW5jZXMuICBTZWUgY29tbWVudCBpbiBkZW1hbmdsZV9hcmdzKCkgKi8KLQotCSAgaWYgKExVQ0lEX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLQkgICAgewotCSAgICAgIGZvcmdldF90eXBlcyAod29yayk7Ci0JICAgIH0KLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0JICAvKiBBZnRlciBwaWNraW5nIG9mZiB0aGUgZnVuY3Rpb24gYXJncywgd2UgZXhwZWN0IHRvIGVpdGhlcgotCSAgICAgZmluZCB0aGUgZnVuY3Rpb24gcmV0dXJuIHR5cGUgKHByZWNlZGVkIGJ5IGFuICdfJykgb3IgdGhlCi0JICAgICBlbmQgb2YgdGhlIHN0cmluZy4gKi8KLQkgIGlmIChzdWNjZXNzICYmIChBVVRPX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpICYmICoqbWFuZ2xlZCA9PSAnXycpCi0JICAgIHsKLQkgICAgICArKygqbWFuZ2xlZCk7Ci0gICAgICAgICAgICAgIC8qIEF0IHRoaXMgbGV2ZWwsIHdlIGRvIG5vdCBjYXJlIGFib3V0IHRoZSByZXR1cm4gdHlwZS4gKi8KLSAgICAgICAgICAgICAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZ0bmFtZSk7Ci0gICAgICAgICAgICAgIHN0cmluZ19kZWxldGUgKCZ0bmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSAndCc6Ci0JICAvKiBHKysgVGVtcGxhdGUgKi8KLQkgIHN0cmluZ19pbml0KCZ0cmF3bmFtZSk7Ci0JICBzdHJpbmdfaW5pdCgmdG5hbWUpOwotCSAgaWYgKG9sZG1hbmdsZWQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIG9sZG1hbmdsZWQgPSAqbWFuZ2xlZDsKLQkgICAgfQotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCAmdG5hbWUsCi0JCQkJICAgICAgICZ0cmF3bmFtZSwgMSwgMSk7Ci0JICBpZiAoc3VjY2VzcykKLQkgICAgewotCSAgICAgIHJlbWVtYmVyX3R5cGUgKHdvcmssIG9sZG1hbmdsZWQsICptYW5nbGVkIC0gb2xkbWFuZ2xlZCk7Ci0JICAgIH0KLQkgIHN0cmluZ19hcHBlbmQgKCZ0bmFtZSwgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0KLQkgIHN0cmluZ19wcmVwZW5kcyhkZWNscCwgJnRuYW1lKTsKLQkgIGlmICh3b3JrIC0+IGRlc3RydWN0b3IgJiAxKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX3ByZXBlbmQgKCZ0cmF3bmFtZSwgIn4iKTsKLQkgICAgICBzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZ0cmF3bmFtZSk7Ci0JICAgICAgd29yay0+ZGVzdHJ1Y3RvciAtPSAxOwotCSAgICB9Ci0JICBpZiAoKHdvcmstPmNvbnN0cnVjdG9yICYgMSkgfHwgKHdvcmstPmRlc3RydWN0b3IgJiAxKSkKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJnRyYXduYW1lKTsKLQkgICAgICB3b3JrLT5jb25zdHJ1Y3RvciAtPSAxOwotCSAgICB9Ci0JICBzdHJpbmdfZGVsZXRlKCZ0cmF3bmFtZSk7Ci0JICBzdHJpbmdfZGVsZXRlKCZ0bmFtZSk7Ci0JICBvbGRtYW5nbGVkID0gTlVMTDsKLQkgIGV4cGVjdF9mdW5jID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnXyc6Ci0JICBpZiAoR05VX0RFTUFOR0xJTkcgJiYgZXhwZWN0X3JldHVybl90eXBlKQotCSAgICB7Ci0JICAgICAgLyogUmVhZCB0aGUgcmV0dXJuIHR5cGUuICovCi0JICAgICAgc3RyaW5nIHJldHVybl90eXBlOwotCSAgICAgIHN0cmluZ19pbml0ICgmcmV0dXJuX3R5cGUpOwotCi0JICAgICAgKCptYW5nbGVkKSsrOwotCSAgICAgIHN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmcmV0dXJuX3R5cGUpOwotCSAgICAgIEFQUEVORF9CTEFOSyAoJnJldHVybl90eXBlKTsKLQotCSAgICAgIHN0cmluZ19wcmVwZW5kcyAoZGVjbHAsICZyZXR1cm5fdHlwZSk7Ci0JICAgICAgc3RyaW5nX2RlbGV0ZSAoJnJldHVybl90eXBlKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgZWxzZQotCSAgICAvKiBBdCB0aGUgb3V0ZXJtb3N0IGxldmVsLCB3ZSBjYW5ub3QgaGF2ZSBhIHJldHVybiB0eXBlIHNwZWNpZmllZCwKLQkgICAgICAgc28gaWYgd2UgcnVuIGludG8gYW5vdGhlciAnXycgYXQgdGhpcyBwb2ludCB3ZSBhcmUgZGVhbGluZyB3aXRoCi0JICAgICAgIGEgbWFuZ2xlZCBuYW1lIHRoYXQgaXMgZWl0aGVyIGJvZ3VzLCBvciBoYXMgYmVlbiBtYW5nbGVkIGJ5Ci0JICAgICAgIHNvbWUgYWxnb3JpdGhtIHdlIGRvbid0IGtub3cgaG93IHRvIGRlYWwgd2l0aC4gIFNvIGp1c3QKLQkgICAgICAgcmVqZWN0IHRoZSBlbnRpcmUgZGVtYW5nbGluZy4gICovCi0gICAgICAgICAgICAvKiBIb3dldmVyLCAiX25ubiIgaXMgYW4gZXhwZWN0ZWQgc3VmZml4IGZvciBhbHRlcm5hdGUgZW50cnkgcG9pbnQKLSAgICAgICAgICAgICAgIG51bWJlcmVkIG5ubiBmb3IgYSBmdW5jdGlvbiwgd2l0aCBIUCBhQ0MsIHNvIHNraXAgb3ZlciB0aGF0Ci0gICAgICAgICAgICAgICB3aXRob3V0IHJlcG9ydGluZyBmYWlsdXJlLiBwYWkvMTk5Ny0wOS0wNCAqLwotICAgICAgICAgICAgaWYgKEhQX0RFTUFOR0xJTkcpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCoqbWFuZ2xlZCAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotICAgICAgICAgICAgICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICBicmVhazsKLQotCWNhc2UgJ0gnOgotCSAgaWYgKEdOVV9ERU1BTkdMSU5HKQotCSAgICB7Ci0JICAgICAgLyogQSBHKysgdGVtcGxhdGUgZnVuY3Rpb24uICBSZWFkIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMuICovCi0JICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMCwKLQkJCQkJICAgMCk7Ci0JICAgICAgaWYgKCEod29yay0+Y29uc3RydWN0b3IgJiAxKSkKLQkJZXhwZWN0X3JldHVybl90eXBlID0gMTsKLQkgICAgICAoKm1hbmdsZWQpKys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgLyogZmFsbCB0aHJvdWdoICovCi0JICAgIHs7fQotCi0JZGVmYXVsdDoKLQkgIGlmIChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcpCi0JICAgIHsKLQkgICAgICAvKiBBc3N1bWUgd2UgaGF2ZSBzdHVtYmxlZCBvbnRvIHRoZSBmaXJzdCBvdXRlcm1vc3QgZnVuY3Rpb24KLQkJIGFyZ3VtZW50IHRva2VuLCBhbmQgc3RhcnQgcHJvY2Vzc2luZyBhcmdzLiAgKi8KLQkgICAgICBmdW5jX2RvbmUgPSAxOwotCSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIE5vbi1HTlUgZGVtYW5nbGVycyB1c2UgYSBzcGVjaWZpYyB0b2tlbiB0byBtYXJrIHRoZSBzdGFydAotCQkgb2YgdGhlIG91dGVybW9zdCBmdW5jdGlvbiBhcmd1bWVudCB0b2tlbnMuICBUeXBpY2FsbHkgJ0YnLAotCQkgZm9yIEFSTS9IUC1kZW1hbmdsaW5nLCBmb3IgZXhhbXBsZS4gIFNvIGlmIHdlIGZpbmQgc29tZXRoaW5nCi0JCSB3ZSBhcmUgbm90IHByZXBhcmVkIGZvciwgaXQgbXVzdCBiZSBhbiBlcnJvci4gICovCi0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIC8qCi0JaWYgKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORykKLQkqLwotICAgICAgewotCWlmIChzdWNjZXNzICYmIGV4cGVjdF9mdW5jKQotCSAgewotCSAgICBmdW5jX2RvbmUgPSAxOwotICAgICAgICAgICAgICBpZiAoTFVDSURfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBmb3JnZXRfdHlwZXMgKHdvcmspOwotICAgICAgICAgICAgICAgIH0KLQkgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLQkgICAgLyogU2luY2UgdGVtcGxhdGUgaW5jbHVkZSB0aGUgbWFuZ2xpbmcgb2YgdGhlaXIgcmV0dXJuIHR5cGVzLAotCSAgICAgICB3ZSBtdXN0IHNldCBleHBlY3RfZnVuYyB0byAwIHNvIHRoYXQgd2UgZG9uJ3QgdHJ5IGRvCi0JICAgICAgIGRlbWFuZ2xlIG1vcmUgYXJndW1lbnRzIHRoZSBuZXh0IHRpbWUgd2UgZ2V0IGhlcmUuICAqLwotCSAgICBleHBlY3RfZnVuYyA9IDA7Ci0JICB9Ci0gICAgICB9Ci0gICAgfQotICBpZiAoc3VjY2VzcyAmJiAhZnVuY19kb25lKQotICAgIHsKLSAgICAgIGlmIChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcpCi0JewotCSAgLyogV2l0aCBHTlUgc3R5bGUgZGVtYW5nbGluZywgYmFyX18zZm9vIGlzICdmb286OmJhcih2b2lkKScsIGFuZAotCSAgICAgYmFyX18zZm9vaSBpcyAnZm9vOjpiYXIoaW50KScuICBXZSBnZXQgaGVyZSB3aGVuIHdlIGZpbmQgdGhlCi0JICAgICBmaXJzdCBjYXNlLCBhbmQgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgJyh2b2lkKScgZ2V0cyBhZGRlZCB0bwotCSAgICAgdGhlIGN1cnJlbnQgZGVjbHAuICBOb3RlIHRoYXQgd2l0aCBBUk0vSFAsIHRoZSBmaXJzdCBjYXNlCi0JICAgICByZXByZXNlbnRzIHRoZSBuYW1lIG9mIGEgc3RhdGljIGRhdGEgbWVtYmVyICdmb286OmJhcicsCi0JICAgICB3aGljaCBpcyBpbiB0aGUgY3VycmVudCBkZWNscCwgc28gd2UgbGVhdmUgaXQgYWxvbmUuICAqLwotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLQl9Ci0gICAgfQotICBpZiAoc3VjY2VzcyAmJiBQUklOVF9BUkdfVFlQRVMpCi0gICAgewotICAgICAgaWYgKHdvcmstPnN0YXRpY190eXBlKQotCXN0cmluZ19hcHBlbmQgKGRlY2xwLCAiIHN0YXRpYyIpOwotICAgICAgaWYgKHdvcmstPnR5cGVfcXVhbHMgIT0gVFlQRV9VTlFVQUxJRklFRCkKLQl7Ci0JICBBUFBFTkRfQkxBTksgKGRlY2xwKTsKLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBxdWFsaWZpZXJfc3RyaW5nICh3b3JrLT50eXBlX3F1YWxzKSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi0jaWYgMAotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9tZXRob2RfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgaW50IHN1Y2Nlc3MgPSAwOwotCi0gIGlmICh3b3JrIC0+IHN0YXRpY190eXBlKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAqbWFuZ2xlZCArIDEpOwotICAgICAgKm1hbmdsZWQgKz0gc3RybGVuICgqbWFuZ2xlZCk7Ci0gICAgICBzdWNjZXNzID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotICAgIH0KLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3RlbXBsYXRlX3RlbXBsYXRlX3Bhcm0gKHdvcmssIG1hbmdsZWQsIHRuYW1lKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqdG5hbWU7Ci17Ci0gIGludCBpOwotICBpbnQgcjsKLSAgaW50IG5lZWRfY29tbWEgPSAwOwotICBpbnQgc3VjY2VzcyA9IDE7Ci0gIHN0cmluZyB0ZW1wOwotCi0gIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAidGVtcGxhdGUgPCIpOwotICAvKiBnZXQgc2l6ZSBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdCAqLwotICBpZiAoZ2V0X2NvdW50IChtYW5nbGVkLCAmcikpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IHI7IGkrKykKLQl7Ci0JICBpZiAobmVlZF9jb21tYSkKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiLCAiKTsKLQkgICAgfQotCi0JICAgIC8qIFogZm9yIHR5cGUgcGFyYW1ldGVycyAqLwotCSAgICBpZiAoKiptYW5nbGVkID09ICdaJykKLQkgICAgICB7Ci0JCSgqbWFuZ2xlZCkrKzsKLQkJc3RyaW5nX2FwcGVuZCAodG5hbWUsICJjbGFzcyIpOwotCSAgICAgIH0KLQkgICAgICAvKiB6IGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzICovCi0JICAgIGVsc2UgaWYgKCoqbWFuZ2xlZCA9PSAneicpCi0JICAgICAgewotCQkoKm1hbmdsZWQpKys7Ci0JCXN1Y2Nlc3MgPQotCQkgIGRlbWFuZ2xlX3RlbXBsYXRlX3RlbXBsYXRlX3Bhcm0gKHdvcmssIG1hbmdsZWQsIHRuYW1lKTsKLQkJaWYgKCFzdWNjZXNzKQotCQkgIHsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCS8qIHRlbXAgaXMgaW5pdGlhbGl6ZWQgaW4gZG9fdHlwZSAqLwotCQlzdWNjZXNzID0gZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJnRlbXApOwotCQlpZiAoc3VjY2VzcykKLQkJICB7Ci0JCSAgICBzdHJpbmdfYXBwZW5kcyAodG5hbWUsICZ0ZW1wKTsKLQkJICB9Ci0JCXN0cmluZ19kZWxldGUoJnRlbXApOwotCQlpZiAoIXN1Y2Nlc3MpCi0JCSAgewotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQkgIG5lZWRfY29tbWEgPSAxOwotCX0KLQotICAgIH0KLSAgaWYgKHRuYW1lLT5wWy0xXSA9PSAnPicpCi0gICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICIgIik7Ci0gIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiPiBjbGFzcyIpOwotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9pbnRlZ3JhbF92YWx1ZSAod29yaywgbWFuZ2xlZCwgcykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIqKiBtYW5nbGVkOwotICAgICBzdHJpbmcqIHM7Ci17Ci0gIGludCBzdWNjZXNzOwotCi0gIGlmICgqKm1hbmdsZWQgPT0gJ0UnKQotICAgIHsKLSAgICAgIGludCBuZWVkX29wZXJhdG9yID0gMDsKLQotICAgICAgc3VjY2VzcyA9IDE7Ci0gICAgICBzdHJpbmdfYXBwZW5kbiAocywgIigiLCAxKTsKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIHdoaWxlIChzdWNjZXNzICYmICoqbWFuZ2xlZCAhPSAnVycgJiYgKiptYW5nbGVkICE9ICdcMCcpCi0JewotCSAgaWYgKG5lZWRfb3BlcmF0b3IpCi0JICAgIHsKLQkgICAgICBzaXplX3QgaTsKLQkgICAgICBzaXplX3QgbGVuOwotCi0JICAgICAgc3VjY2VzcyA9IDA7Ci0KLQkgICAgICBsZW4gPSBzdHJsZW4gKCptYW5nbGVkKTsKLQotCSAgICAgIGZvciAoaSA9IDA7Ci0JCSAgIGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlIFswXSk7Ci0JCSAgICsraSkKLQkJewotCQkgIHNpemVfdCBsID0gc3RybGVuIChvcHRhYmxlW2ldLmluKTsKLQotCQkgIGlmIChsIDw9IGxlbgotCQkgICAgICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sICptYW5nbGVkLCBsKSA9PSAwKQotCQkgICAgewotCQkgICAgICBzdHJpbmdfYXBwZW5kbiAocywgIiAiLCAxKTsKLQkJICAgICAgc3RyaW5nX2FwcGVuZCAocywgb3B0YWJsZVtpXS5vdXQpOwotCQkgICAgICBzdHJpbmdfYXBwZW5kbiAocywgIiAiLCAxKTsKLQkJICAgICAgc3VjY2VzcyA9IDE7Ci0JCSAgICAgICgqbWFuZ2xlZCkgKz0gbDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGlmICghc3VjY2VzcykKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgbmVlZF9vcGVyYXRvciA9IDE7Ci0KLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtICh3b3JrLCBtYW5nbGVkLCBzLAotCQkJCQkJICB0a19pbnRlZ3JhbCk7Ci0JfQotCi0gICAgICBpZiAoKiptYW5nbGVkICE9ICdXJykKLQkgIHN1Y2Nlc3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAiKSIsIDEpOwotCSAgKCptYW5nbGVkKSsrOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKCoqbWFuZ2xlZCA9PSAnUScgfHwgKiptYW5nbGVkID09ICdLJykKLSAgICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCBzLCAwLCAxKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN1Y2Nlc3MgPSAwOwotCi0gICAgICBpZiAoKiptYW5nbGVkID09ICdtJykKLQl7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgIi0iLCAxKTsKLQkgICgqbWFuZ2xlZCkrKzsKLQl9Ci0gICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLQl7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgKm1hbmdsZWQsIDEpOwotCSAgKCptYW5nbGVkKSsrOwotCSAgc3VjY2VzcyA9IDE7Ci0JfQotICAgIH0KLQotICByZXR1cm4gc3VjY2VzczsKLX0KLQotc3RhdGljIGludAotZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSAod29yaywgbWFuZ2xlZCwgcywgdGspCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nKiBzOwotICAgICB0eXBlX2tpbmRfdCB0azsKLXsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotCi0gIGlmICgqKm1hbmdsZWQgPT0gJ1knKQotICAgIHsKLSAgICAgIC8qIFRoZSBuZXh0IGFyZ3VtZW50IGlzIGEgdGVtcGxhdGUgcGFyYW1ldGVyLiAqLwotICAgICAgaW50IGlkeDsKLQotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgaWR4ID0gY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKTsKLSAgICAgIGlmIChpZHggPT0gLTEKLQkgIHx8ICh3b3JrLT50bXBsX2FyZ3ZlYyAmJiBpZHggPj0gd29yay0+bnRtcGxfYXJncykKLQkgIHx8IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCkgPT0gLTEpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKHdvcmstPnRtcGxfYXJndmVjKQotCXN0cmluZ19hcHBlbmQgKHMsIHdvcmstPnRtcGxfYXJndmVjW2lkeF0pOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgYnVmWzEwXTsKLQkgIHNwcmludGYoYnVmLCAiVCVkIiwgaWR4KTsKLQkgIHN0cmluZ19hcHBlbmQgKHMsIGJ1Zik7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAodGsgPT0gdGtfaW50ZWdyYWwpCi0gICAgc3VjY2VzcyA9IGRlbWFuZ2xlX2ludGVncmFsX3ZhbHVlICh3b3JrLCBtYW5nbGVkLCBzKTsKLSAgZWxzZSBpZiAodGsgPT0gdGtfY2hhcikKLSAgICB7Ci0gICAgICBjaGFyIHRtcFsyXTsKLSAgICAgIGludCB2YWw7Ci0gICAgICBpZiAoKiptYW5nbGVkID09ICdtJykKLQl7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgIi0iLCAxKTsKLQkgICgqbWFuZ2xlZCkrKzsKLQl9Ci0gICAgICBzdHJpbmdfYXBwZW5kbiAocywgIiciLCAxKTsKLSAgICAgIHZhbCA9IGNvbnN1bWVfY291bnQobWFuZ2xlZCk7Ci0gICAgICBpZiAodmFsIDw9IDApCi0Jc3VjY2VzcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgdG1wWzBdID0gKGNoYXIpdmFsOwotCSAgdG1wWzFdID0gJ1wwJzsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAmdG1wWzBdLCAxKTsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAiJyIsIDEpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHRrID09IHRrX2Jvb2wpCi0gICAgewotICAgICAgaW50IHZhbCA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotICAgICAgaWYgKHZhbCA9PSAwKQotCXN0cmluZ19hcHBlbmRuIChzLCAiZmFsc2UiLCA1KTsKLSAgICAgIGVsc2UgaWYgKHZhbCA9PSAxKQotCXN0cmluZ19hcHBlbmRuIChzLCAidHJ1ZSIsIDQpOwotICAgICAgZWxzZQotCXN1Y2Nlc3MgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAodGsgPT0gdGtfcmVhbCkKLSAgICB7Ci0gICAgICBpZiAoKiptYW5nbGVkID09ICdtJykKLQl7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgIi0iLCAxKTsKLQkgICgqbWFuZ2xlZCkrKzsKLQl9Ci0gICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLQl7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgKm1hbmdsZWQsIDEpOwotCSAgKCptYW5nbGVkKSsrOwotCX0KLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJy4nKSAvKiBmcmFjdGlvbiAqLwotCXsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAiLiIsIDEpOwotCSAgKCptYW5nbGVkKSsrOwotCSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kbiAocywgKm1hbmdsZWQsIDEpOwotCSAgICAgICgqbWFuZ2xlZCkrKzsKLQkgICAgfQotCX0KLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ2UnKSAvKiBleHBvbmVudCAqLwotCXsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAiZSIsIDEpOwotCSAgKCptYW5nbGVkKSsrOwotCSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kbiAocywgKm1hbmdsZWQsIDEpOwotCSAgICAgICgqbWFuZ2xlZCkrKzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHRrID09IHRrX3BvaW50ZXIgfHwgdGsgPT0gdGtfcmVmZXJlbmNlKQotICAgIHsKLSAgICAgIGludCBzeW1ib2xfbGVuID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0gICAgICBpZiAoc3ltYm9sX2xlbiA9PSAtMSkKLQlyZXR1cm4gLTE7Ci0gICAgICBpZiAoc3ltYm9sX2xlbiA9PSAwKQotCXN0cmluZ19hcHBlbmRuIChzLCAiMCIsIDEpOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKnAgPSB4bWFsbG9jIChzeW1ib2xfbGVuICsgMSksICpxOwotCSAgc3RybmNweSAocCwgKm1hbmdsZWQsIHN5bWJvbF9sZW4pOwotCSAgcCBbc3ltYm9sX2xlbl0gPSAnXDAnOwotCSAgLyogV2UgdXNlIGNwbHVzX2RlbWFuZ2xlIGhlcmUsIHJhdGhlciB0aGFuCi0JICAgICBpbnRlcm5hbF9jcGx1c19kZW1hbmdsZSwgYmVjYXVzZSB0aGUgbmFtZSBvZiB0aGUgZW50aXR5Ci0JICAgICBtYW5nbGVkIGhlcmUgZG9lcyBub3QgbWFrZSB1c2Ugb2YgYW55IG9mIHRoZSBzcXVhbmdsaW5nCi0JICAgICBvciB0eXBlLWNvZGUgaW5mb3JtYXRpb24gd2UgaGF2ZSBidWlsdCB1cCB0aHVzIGZhcjsgaXQgaXMKLQkgICAgIG1hbmdsZWQgaW5kZXBlbmRlbnRseS4gICovCi0JICBxID0gY3BsdXNfZGVtYW5nbGUgKHAsIHdvcmstPm9wdGlvbnMpOwotCSAgaWYgKHRrID09IHRrX3BvaW50ZXIpCi0JICAgIHN0cmluZ19hcHBlbmRuIChzLCAiJiIsIDEpOwotCSAgLyogRklYTUU6IFBvaW50ZXItdG8tbWVtYmVyIGNvbnN0YW50cyBzaG91bGQgZ2V0IGEKLQkgICAgICAgICAgICBxdWFsaWZ5aW5nIGNsYXNzIG5hbWUgaGVyZS4gICovCi0JICBpZiAocSkKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmQgKHMsIHEpOwotCSAgICAgIGZyZWUgKHEpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHN0cmluZ19hcHBlbmQgKHMsIHApOwotCSAgZnJlZSAocCk7Ci0JfQotICAgICAgKm1hbmdsZWQgKz0gc3ltYm9sX2xlbjsKLSAgICB9Ci0KLSAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLS8qIERlbWFuZ2xlIHRoZSB0ZW1wbGF0ZSBuYW1lIGluIE1BTkdMRUQuICBUaGUgZnVsbCBuYW1lIG9mIHRoZQotICAgdGVtcGxhdGUgKGUuZy4sIFM8aW50PikgaXMgcGxhY2VkIGluIFROQU1FLiAgVGhlIG5hbWUgd2l0aG91dCB0aGUKLSAgIHRlbXBsYXRlIHBhcmFtZXRlcnMgKGUuZy4gUykgaXMgcGxhY2VkIGluIFRSQVdOQU1FIGlmIFRSQVdOQU1FIGlzCi0gICBub24tTlVMTC4gIElmIElTX1RZUEUgaXMgbm9uemVybywgdGhpcyB0ZW1wbGF0ZSBpcyBhIHR5cGUgdGVtcGxhdGUsCi0gICBub3QgYSBmdW5jdGlvbiB0ZW1wbGF0ZS4gIElmIGJvdGggSVNfVFlQRSBhbmQgUkVNRU1CRVIgYXJlIG5vbnplcm8sCi0gICB0aGUgdG1lcGxhdGUgaXMgcmVtZW1iZXJlZCBpbiB0aGUgbGlzdCBvZiBiYWNrLXJlZmVyZW5jZWFibGUKLSAgIHR5cGVzLiAgKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIHRuYW1lLCB0cmF3bmFtZSwgaXNfdHlwZSwgcmVtZW1iZXIpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICp0bmFtZTsKLSAgICAgc3RyaW5nICp0cmF3bmFtZTsKLSAgICAgaW50IGlzX3R5cGU7Ci0gICAgIGludCByZW1lbWJlcjsKLXsKLSAgaW50IGk7Ci0gIGludCByOwotICBpbnQgbmVlZF9jb21tYSA9IDA7Ci0gIGludCBzdWNjZXNzID0gMDsKLSAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gIGludCBpc19qYXZhX2FycmF5ID0gMDsKLSAgc3RyaW5nIHRlbXA7Ci0gIGludCBiaW5kZXggPSAwOwotCi0gICgqbWFuZ2xlZCkrKzsKLSAgaWYgKGlzX3R5cGUpCi0gICAgewotICAgICAgaWYgKHJlbWVtYmVyKQotCWJpbmRleCA9IHJlZ2lzdGVyX0J0eXBlICh3b3JrKTsKLSAgICAgIHN0YXJ0ID0gKm1hbmdsZWQ7Ci0gICAgICAvKiBnZXQgdGVtcGxhdGUgbmFtZSAqLwotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAneicpCi0JewotCSAgaW50IGlkeDsKLQkgICgqbWFuZ2xlZCkrKzsKLQkgICgqbWFuZ2xlZCkrKzsKLQotCSAgaWR4ID0gY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKTsKLQkgIGlmIChpZHggPT0gLTEKLQkgICAgICB8fCAod29yay0+dG1wbF9hcmd2ZWMgJiYgaWR4ID49IHdvcmstPm50bXBsX2FyZ3MpCi0JICAgICAgfHwgY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKSA9PSAtMSkKLQkgICAgcmV0dXJuICgwKTsKLQotCSAgaWYgKHdvcmstPnRtcGxfYXJndmVjKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsIHdvcmstPnRtcGxfYXJndmVjW2lkeF0pOwotCSAgICAgIGlmICh0cmF3bmFtZSkKLQkJc3RyaW5nX2FwcGVuZCAodHJhd25hbWUsIHdvcmstPnRtcGxfYXJndmVjW2lkeF0pOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyIGJ1ZlsxMF07Ci0JICAgICAgc3ByaW50ZihidWYsICJUJWQiLCBpZHgpOwotCSAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCBidWYpOwotCSAgICAgIGlmICh0cmF3bmFtZSkKLQkJc3RyaW5nX2FwcGVuZCAodHJhd25hbWUsIGJ1Zik7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKChyID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCkpIDw9IDAKLQkgICAgICB8fCAoaW50KSBzdHJsZW4gKCptYW5nbGVkKSA8IHIpCi0JICAgIHsKLQkgICAgICByZXR1cm4gKDApOwotCSAgICB9Ci0JICBpc19qYXZhX2FycmF5ID0gKHdvcmsgLT4gb3B0aW9ucyAmIERNR0xfSkFWQSkKLQkgICAgJiYgc3RybmNtcCAoKm1hbmdsZWQsICJKQXJyYXkxWiIsIDgpID09IDA7Ci0JICBpZiAoISBpc19qYXZhX2FycmF5KQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZG4gKHRuYW1lLCAqbWFuZ2xlZCwgcik7Ci0JICAgIH0KLQkgIGlmICh0cmF3bmFtZSkKLQkgICAgc3RyaW5nX2FwcGVuZG4gKHRyYXduYW1lLCAqbWFuZ2xlZCwgcik7Ci0JICAqbWFuZ2xlZCArPSByOwotCX0KLSAgICB9Ci0gIGlmICghaXNfamF2YV9hcnJheSkKLSAgICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgIjwiKTsKLSAgLyogZ2V0IHNpemUgb2YgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3QgKi8KLSAgaWYgKCFnZXRfY291bnQgKG1hbmdsZWQsICZyKSkKLSAgICB7Ci0gICAgICByZXR1cm4gKDApOwotICAgIH0KLSAgaWYgKCFpc190eXBlKQotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBhbiBhcnJheSBmb3Igc2F2aW5nIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCB2YWx1ZXMuICovCi0gICAgICB3b3JrLT50bXBsX2FyZ3ZlYyA9IChjaGFyKiopIHhtYWxsb2MgKHIgKiBzaXplb2YgKGNoYXIgKikpOwotICAgICAgd29yay0+bnRtcGxfYXJncyA9IHI7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcjsgaSsrKQotCXdvcmstPnRtcGxfYXJndmVjW2ldID0gMDsKLSAgICB9Ci0gIGZvciAoaSA9IDA7IGkgPCByOyBpKyspCi0gICAgewotICAgICAgaWYgKG5lZWRfY29tbWEpCi0JewotCSAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICIsICIpOwotCX0KLSAgICAgIC8qIFogZm9yIHR5cGUgcGFyYW1ldGVycyAqLwotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnWicpCi0JewotCSAgKCptYW5nbGVkKSsrOwotCSAgLyogdGVtcCBpcyBpbml0aWFsaXplZCBpbiBkb190eXBlICovCi0JICBzdWNjZXNzID0gZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJnRlbXApOwotCSAgaWYgKHN1Y2Nlc3MpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kcyAodG5hbWUsICZ0ZW1wKTsKLQotCSAgICAgIGlmICghaXNfdHlwZSkKLQkJewotCQkgIC8qIFNhdmUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50LiAqLwotCQkgIGludCBsZW4gPSB0ZW1wLnAgLSB0ZW1wLmI7Ci0JCSAgd29yay0+dG1wbF9hcmd2ZWNbaV0gPSB4bWFsbG9jIChsZW4gKyAxKTsKLQkJICBtZW1jcHkgKHdvcmstPnRtcGxfYXJndmVjW2ldLCB0ZW1wLmIsIGxlbik7Ci0JCSAgd29yay0+dG1wbF9hcmd2ZWNbaV1bbGVuXSA9ICdcMCc7Ci0JCX0KLQkgICAgfQotCSAgc3RyaW5nX2RlbGV0ZSgmdGVtcCk7Ci0JICBpZiAoIXN1Y2Nlc3MpCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIC8qIHogZm9yIHRlbXBsYXRlIHBhcmFtZXRlcnMgKi8KLSAgICAgIGVsc2UgaWYgKCoqbWFuZ2xlZCA9PSAneicpCi0JewotCSAgaW50IHIyOwotCSAgKCptYW5nbGVkKSsrOwotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlX3RlbXBsYXRlX3Bhcm0gKHdvcmssIG1hbmdsZWQsIHRuYW1lKTsKLQotCSAgaWYgKHN1Y2Nlc3MKLQkgICAgICAmJiAocjIgPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKSkgPiAwCi0JICAgICAgJiYgKGludCkgc3RybGVuICgqbWFuZ2xlZCkgPj0gcjIpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgIiAiKTsKLQkgICAgICBzdHJpbmdfYXBwZW5kbiAodG5hbWUsICptYW5nbGVkLCByMik7Ci0JICAgICAgaWYgKCFpc190eXBlKQotCQl7Ci0JCSAgLyogU2F2ZSB0aGUgdGVtcGxhdGUgYXJndW1lbnQuICovCi0JCSAgaW50IGxlbiA9IHIyOwotCQkgIHdvcmstPnRtcGxfYXJndmVjW2ldID0geG1hbGxvYyAobGVuICsgMSk7Ci0JCSAgbWVtY3B5ICh3b3JrLT50bXBsX2FyZ3ZlY1tpXSwgKm1hbmdsZWQsIGxlbik7Ci0JCSAgd29yay0+dG1wbF9hcmd2ZWNbaV1bbGVuXSA9ICdcMCc7Ci0JCX0KLQkgICAgICAqbWFuZ2xlZCArPSByMjsKLQkgICAgfQotCSAgaWYgKCFzdWNjZXNzKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RyaW5nICBwYXJhbTsKLQkgIHN0cmluZyogczsKLQotCSAgLyogb3RoZXJ3aXNlLCB2YWx1ZSBwYXJhbWV0ZXIgKi8KLQotCSAgLyogdGVtcCBpcyBpbml0aWFsaXplZCBpbiBkb190eXBlICovCi0JICBzdWNjZXNzID0gZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJnRlbXApOwotCSAgc3RyaW5nX2RlbGV0ZSgmdGVtcCk7Ci0JICBpZiAoIXN1Y2Nlc3MpCi0JICAgIGJyZWFrOwotCi0JICBpZiAoIWlzX3R5cGUpCi0JICAgIHsKLQkgICAgICBzID0gJnBhcmFtOwotCSAgICAgIHN0cmluZ19pbml0IChzKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBzID0gdG5hbWU7Ci0KLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtICh3b3JrLCBtYW5nbGVkLCBzLAotCQkJCQkJICAodHlwZV9raW5kX3QpIHN1Y2Nlc3MpOwotCi0JICBpZiAoIXN1Y2Nlc3MpCi0JICAgIHsKLQkgICAgICBpZiAoIWlzX3R5cGUpCi0JCXN0cmluZ19kZWxldGUgKHMpOwotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmICghaXNfdHlwZSkKLQkgICAgewotCSAgICAgIGludCBsZW4gPSBzLT5wIC0gcy0+YjsKLQkgICAgICB3b3JrLT50bXBsX2FyZ3ZlY1tpXSA9IHhtYWxsb2MgKGxlbiArIDEpOwotCSAgICAgIG1lbWNweSAod29yay0+dG1wbF9hcmd2ZWNbaV0sIHMtPmIsIGxlbik7Ci0JICAgICAgd29yay0+dG1wbF9hcmd2ZWNbaV1bbGVuXSA9ICdcMCc7Ci0KLQkgICAgICBzdHJpbmdfYXBwZW5kcyAodG5hbWUsIHMpOwotCSAgICAgIHN0cmluZ19kZWxldGUgKHMpOwotCSAgICB9Ci0JfQotICAgICAgbmVlZF9jb21tYSA9IDE7Ci0gICAgfQotICBpZiAoaXNfamF2YV9hcnJheSkKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgIltdIik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHRuYW1lLT5wWy0xXSA9PSAnPicpCi0Jc3RyaW5nX2FwcGVuZCAodG5hbWUsICIgIik7Ci0gICAgICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgIj4iKTsKLSAgICB9Ci0KLSAgaWYgKGlzX3R5cGUgJiYgcmVtZW1iZXIpCi0gICAgcmVtZW1iZXJfQnR5cGUgKHdvcmssIHRuYW1lLT5iLCBMRU5fU1RSSU5HICh0bmFtZSksIGJpbmRleCk7Ci0KLSAgLyoKLSAgICBpZiAod29yayAtPiBzdGF0aWNfdHlwZSkKLSAgICB7Ci0gICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICptYW5nbGVkICsgMSk7Ci0gICAgKm1hbmdsZWQgKz0gc3RybGVuICgqbWFuZ2xlZCk7Ci0gICAgc3VjY2VzcyA9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgc3VjY2VzcyA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLSAgICB9Ci0gICAgfQotICAgICovCi0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWFybV9wdCAod29yaywgbWFuZ2xlZCwgbiwgYW5jaG9yLCBhcmdzKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqbWFuZ2xlZDsKLSAgICAgaW50IG47Ci0gICAgIGNvbnN0IGNoYXIgKiphbmNob3IsICoqYXJnczsKLXsKLSAgLyogQ2hlY2sgaWYgQVJNIHRlbXBsYXRlIHdpdGggIl9fcHRfXyIgaW4gaXQgKCJwYXJhbWV0ZXJpemVkIHR5cGUiKSAqLwotICAvKiBBbGxvdyBIUCBhbHNvIGhlcmUsIGJlY2F1c2UgSFAncyBjZnJvbnQgY29tcGlsZXIgZm9sbG93cyBBUk0gdG8gc29tZSBleHRlbnQgKi8KLSAgaWYgKChBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HKSAmJiAoKmFuY2hvciA9IG15c3Ryc3RyIChtYW5nbGVkLCAiX19wdF9fIikpKQotICAgIHsKLSAgICAgIGludCBsZW47Ci0gICAgICAqYXJncyA9ICphbmNob3IgKyA2OwotICAgICAgbGVuID0gY29uc3VtZV9jb3VudCAoYXJncyk7Ci0gICAgICBpZiAobGVuID09IC0xKQotCXJldHVybiAwOwotICAgICAgaWYgKCphcmdzICsgbGVuID09IG1hbmdsZWQgKyBuICYmICoqYXJncyA9PSAnXycpCi0JewotCSAgKysqYXJnczsKLQkgIHJldHVybiAxOwotCX0KLSAgICB9Ci0gIGlmIChBVVRPX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpCi0gICAgewotICAgICAgaWYgKCgqYW5jaG9yID0gbXlzdHJzdHIgKG1hbmdsZWQsICJfX3RtX18iKSkKLSAgICAgICAgICB8fCAoKmFuY2hvciA9IG15c3Ryc3RyIChtYW5nbGVkLCAiX19wc19fIikpCi0gICAgICAgICAgfHwgKCphbmNob3IgPSBteXN0cnN0ciAobWFuZ2xlZCwgIl9fcHRfXyIpKSkKLSAgICAgICAgewotICAgICAgICAgIGludCBsZW47Ci0gICAgICAgICAgKmFyZ3MgPSAqYW5jaG9yICsgNjsKLSAgICAgICAgICBsZW4gPSBjb25zdW1lX2NvdW50IChhcmdzKTsKLQkgIGlmIChsZW4gPT0gLTEpCi0JICAgIHJldHVybiAwOwotICAgICAgICAgIGlmICgqYXJncyArIGxlbiA9PSBtYW5nbGVkICsgbiAmJiAqKmFyZ3MgPT0gJ18nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICArKyphcmdzOwotICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgZWxzZSBpZiAoKCphbmNob3IgPSBteXN0cnN0ciAobWFuZ2xlZCwgIl9fUyIpKSkKLSAgICAgICAgewotIAkgIGludCBsZW47Ci0gCSAgKmFyZ3MgPSAqYW5jaG9yICsgMzsKLSAJICBsZW4gPSBjb25zdW1lX2NvdW50IChhcmdzKTsKLQkgIGlmIChsZW4gPT0gLTEpCi0JICAgIHJldHVybiAwOwotIAkgIGlmICgqYXJncyArIGxlbiA9PSBtYW5nbGVkICsgbiAmJiAqKmFyZ3MgPT0gJ18nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICArKyphcmdzOwotIAkgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLWRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgbiwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgaW50IG47Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIGNvbnN0IGNoYXIgKmUgPSAqbWFuZ2xlZCArIG47Ci0gIHN0cmluZyBhcmc7Ci0KLSAgLyogQ2hlY2sgZm9yIEhQIGFDQyB0ZW1wbGF0ZSBzcGVjOiBjbGFzc1h0MXQyIHdoZXJlIHQxLCB0MiBhcmUKLSAgICAgdGVtcGxhdGUgYXJncyAqLwotICBpZiAoSFBfREVNQU5HTElORyAmJiAoKCptYW5nbGVkKVtuXSA9PSAnWCcpKQotICAgIHsKLSAgICAgIGNoYXIgKnN0YXJ0X3NwZWNfYXJncyA9IE5VTEw7Ci0KLSAgICAgIC8qIEZpcnN0IGNoZWNrIGZvciBhbmQgb21pdCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBwc2V1ZG8tYXJndW1lbnRzLAotICAgICAgICAgc3VjaCBhcyBpbiAiU3BlYzwjMSwjMS4qPiIgKi8KLSAgICAgIHN0YXJ0X3NwZWNfYXJncyA9IHN0cmNociAoKm1hbmdsZWQsICc8Jyk7Ci0gICAgICBpZiAoc3RhcnRfc3BlY19hcmdzICYmIChzdGFydF9zcGVjX2FyZ3MgLSAqbWFuZ2xlZCA8IG4pKQotICAgICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBzdGFydF9zcGVjX2FyZ3MgLSAqbWFuZ2xlZCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIG4pOwotICAgICAgKCptYW5nbGVkKSArPSBuICsgMTsKLSAgICAgIHN0cmluZ19pbml0ICgmYXJnKTsKLSAgICAgIGlmICh3b3JrLT50ZW1wX3N0YXJ0ID09IC0xKSAvKiBub24tcmVjdXJzaXZlIGNhbGwgKi8KLSAgICAgICAgd29yay0+dGVtcF9zdGFydCA9IGRlY2xwLT5wIC0gZGVjbHAtPmI7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIjwiKTsKLSAgICAgIHdoaWxlICgxKQotICAgICAgICB7Ci0gICAgICAgICAgc3RyaW5nX2NsZWFyICgmYXJnKTsKLSAgICAgICAgICBzd2l0Y2ggKCoqbWFuZ2xlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSAnVCc6Ci0gICAgICAgICAgICAgICAgLyogJ1QnIHNpZ25hbHMgYSB0eXBlIHBhcmFtZXRlciAqLwotICAgICAgICAgICAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgICAgICAgICAgICBpZiAoIWRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZhcmcpKQotICAgICAgICAgICAgICAgICAgZ290byBocGFjY190ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSAnVSc6Ci0gICAgICAgICAgICAgIGNhc2UgJ1MnOgotICAgICAgICAgICAgICAgIC8qICdVJyBvciAnUycgc2lnbmFscyBhbiBpbnRlZ3JhbCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgIGlmICghZG9faHBhY2NfdGVtcGxhdGVfY29uc3RfdmFsdWUgKHdvcmssIG1hbmdsZWQsICZhcmcpKQotICAgICAgICAgICAgICAgICAgZ290byBocGFjY190ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgICAgICAgICAgLyogJ0EnIHNpZ25hbHMgYSBuYW1lZCBjb25zdGFudCBleHByZXNzaW9uIChsaXRlcmFsKSAqLwotICAgICAgICAgICAgICAgIGlmICghZG9faHBhY2NfdGVtcGxhdGVfbGl0ZXJhbCAod29yaywgbWFuZ2xlZCwgJmFyZykpCi0gICAgICAgICAgICAgICAgICBnb3RvIGhwYWNjX3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8qIFRvZGF5LCAxOTk3LTA5LTAzLCB3ZSBoYXZlIG9ubHkgdGhlIGFib3ZlIHR5cGVzCi0gICAgICAgICAgICAgICAgICAgb2YgdGVtcGxhdGUgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBtYXliZSB0aGlzIHNob3VsZCBmYWlsIGFuZCByZXR1cm4gbnVsbCAqLwotICAgICAgICAgICAgICAgIGdvdG8gaHBhY2NfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgfQotICAgICAgICAgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJmFyZyk7Ci0gICAgICAgICAvKiBDaGVjayBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRlbXBsYXRlIGFyZ3MuCi0gICAgICAgICAgICAgMCBpZiBhdCBlbmQgb2Ygc3RhdGljIG1lbWJlciBvZiB0ZW1wbGF0ZSBjbGFzcywKLSAgICAgICAgICAgICBfIGlmIGRvbmUgd2l0aCB0ZW1wbGF0ZSBhcmdzIGZvciBhIGZ1bmN0aW9uICovCi0gICAgICAgICAgaWYgKCgqKm1hbmdsZWQgPT0gJ1wwMDAnKSB8fCAoKiptYW5nbGVkID09ICdfJykpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIiwiKTsKLSAgICAgICAgfQotICAgIGhwYWNjX3RlbXBsYXRlX2FyZ3NfZG9uZToKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiPiIpOwotICAgICAgc3RyaW5nX2RlbGV0ZSAoJmFyZyk7Ci0gICAgICBpZiAoKiptYW5nbGVkID09ICdfJykKLSAgICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgLyogQVJNIHRlbXBsYXRlPyAoQWxzbyBoYW5kbGVzIEhQIGNmcm9udCBleHRlbnNpb25zKSAqLwotICBlbHNlIGlmIChhcm1fcHQgKHdvcmssICptYW5nbGVkLCBuLCAmcCwgJmFyZ3MpKQotICAgIHsKLSAgICAgIHN0cmluZyB0eXBlX3N0cjsKLQotICAgICAgc3RyaW5nX2luaXQgKCZhcmcpOwotICAgICAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAqbWFuZ2xlZCwgcCAtICptYW5nbGVkKTsKLSAgICAgIGlmICh3b3JrLT50ZW1wX3N0YXJ0ID09IC0xKSAgLyogbm9uLXJlY3Vyc2l2ZSBjYWxsICovCi0Jd29yay0+dGVtcF9zdGFydCA9IGRlY2xwLT5wIC0gZGVjbHAtPmI7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIjwiKTsKLSAgICAgIC8qIHNob3VsZCBkbyBlcnJvciBjaGVja2luZyBoZXJlICovCi0gICAgICB3aGlsZSAoYXJncyA8IGUpIHsKLQlzdHJpbmdfY2xlYXIgKCZhcmcpOwotCi0JLyogQ2hlY2sgZm9yIHR5cGUgb3IgbGl0ZXJhbCBoZXJlICovCi0Jc3dpdGNoICgqYXJncykKLQkgIHsKLQkgICAgLyogSFAgY2Zyb250IGV4dGVuc2lvbnMgdG8gQVJNIGZvciB0ZW1wbGF0ZSBhcmdzICovCi0JICAgIC8qIHNwZWM6IFh0MUx2MSB3aGVyZSB0MSBpcyBhIHR5cGUsIHYxIGlzIGEgbGl0ZXJhbCB2YWx1ZSAqLwotCSAgICAvKiBGSVhNRTogV2UgaGFuZGxlIG9ubHkgbnVtZXJpYyBsaXRlcmFscyBmb3IgSFAgY2Zyb250ICovCi0gICAgICAgICAgY2FzZSAnWCc6Ci0gICAgICAgICAgICAvKiBBIHR5cGVkIGNvbnN0YW50IHZhbHVlIGZvbGxvd3MgKi8KLSAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICAgIGlmICghZG9fdHlwZSAod29yaywgJmFyZ3MsICZ0eXBlX3N0cikpCi0JICAgICAgZ290byBjZnJvbnRfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCAoJmFyZywgIigiKTsKLSAgICAgICAgICAgIHN0cmluZ19hcHBlbmRzICgmYXJnLCAmdHlwZV9zdHIpOwotICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCAoJmFyZywgIikiKTsKLSAgICAgICAgICAgIGlmICgqYXJncyAhPSAnTCcpCi0gICAgICAgICAgICAgIGdvdG8gY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICAgIC8qIE5vdyBzbmFyZiBhIGxpdGVyYWwgdmFsdWUgZm9sbG93aW5nICdMJyAqLwotICAgICAgICAgICAgaWYgKCFzbmFyZl9udW1lcmljX2xpdGVyYWwgKCZhcmdzLCAmYXJnKSkKLQkgICAgICBnb3RvIGNmcm9udF90ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ0wnOgotICAgICAgICAgICAgLyogU25hcmYgYSBsaXRlcmFsIGZvbGxvd2luZyAnTCcgKi8KLSAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICAgIGlmICghc25hcmZfbnVtZXJpY19saXRlcmFsICgmYXJncywgJmFyZykpCi0JICAgICAgZ290byBjZnJvbnRfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8qIE5vdCBoYW5kbGluZyBvdGhlciBIUCBjZnJvbnQgc3R1ZmYgKi8KLSAgICAgICAgICAgIGlmICghZG9fdHlwZSAod29yaywgJmFyZ3MsICZhcmcpKQotICAgICAgICAgICAgICBnb3RvIGNmcm9udF90ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0JICB9Ci0Jc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmYXJnKTsKLQlzdHJpbmdfYXBwZW5kIChkZWNscCwgIiwiKTsKLSAgICAgIH0KLSAgICBjZnJvbnRfdGVtcGxhdGVfYXJnc19kb25lOgotICAgICAgc3RyaW5nX2RlbGV0ZSAoJmFyZyk7Ci0gICAgICBpZiAoYXJncyA+PSBlKQotCS0tZGVjbHAtPnA7IC8qIHJlbW92ZSBleHRyYSBjb21tYSAqLwotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICI+Iik7Ci0gICAgfQotICBlbHNlIGlmIChuPjEwICYmIHN0cm5jbXAgKCptYW5nbGVkLCAiX0dMT0JBTF8iLCA4KSA9PSAwCi0JICAgJiYgKCptYW5nbGVkKVs5XSA9PSAnTicKLQkgICAmJiAoKm1hbmdsZWQpWzhdID09ICgqbWFuZ2xlZClbMTBdCi0JICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCAoKm1hbmdsZWQpWzhdKSkKLSAgICB7Ci0gICAgICAvKiBBIG1lbWJlciBvZiB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZS4gICovCi0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgInthbm9ueW1vdXN9Iik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHdvcmstPnRlbXBfc3RhcnQgPT0gLTEpIC8qIG5vbi1yZWN1cnNpdmUgY2FsbCBvbmx5ICovCi0Jd29yay0+dGVtcF9zdGFydCA9IDA7ICAgICAvKiBkaXNhYmxlIGluIHJlY3Vyc2l2ZSBjYWxscyAqLwotICAgICAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAqbWFuZ2xlZCwgbik7Ci0gICAgfQotICAqbWFuZ2xlZCArPSBuOwotfQotCi0vKiBFeHRyYWN0IGEgY2xhc3MgbmFtZSwgcG9zc2libHkgYSB0ZW1wbGF0ZSB3aXRoIGFyZ3VtZW50cywgZnJvbSB0aGUKLSAgIG1hbmdsZWQgc3RyaW5nOyBxdWFsaWZpZXJzLCBsb2NhbCBjbGFzcyBpbmRpY2F0b3JzLCBldGMuIGhhdmUKLSAgIGFscmVhZHkgYmVlbiBkZWFsdCB3aXRoICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2NsYXNzX25hbWUgKHdvcmssIG1hbmdsZWQsIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIGludCBuOwotICBpbnQgc3VjY2VzcyA9IDA7Ci0KLSAgbiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotICBpZiAobiA9PSAtMSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKChpbnQpIHN0cmxlbiAoKm1hbmdsZWQpID49IG4pCi0gICAgewotICAgICAgZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBuLCBkZWNscCk7Ci0gICAgICBzdWNjZXNzID0gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWRlbWFuZ2xlX2NsYXNzIC0tIGRlbWFuZ2xlIGEgbWFuZ2xlZCBjbGFzcyBzZXF1ZW5jZQotCi1TWU5PUFNJUwotCi0Jc3RhdGljIGludAotCWRlbWFuZ2xlX2NsYXNzIChzdHJ1Y3Qgd29ya19zdHVmZiAqd29yaywgY29uc3QgY2hhciAqKm1hbmdsZWQsCi0JCQlzdHJpbnQgKmRlY2xwKQotCi1ERVNDUklQVElPTgotCi0JREVDTFAgcG9pbnRzIHRvIHRoZSBidWZmZXIgaW50byB3aGljaCBkZW1hbmdsaW5nIGlzIGJlaW5nIGRvbmUuCi0KLQkqTUFOR0xFRCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgdG9rZW4gdG8gYmUgZGVtYW5nbGVkLiAgT24gaW5wdXQsCi0JaXQgcG9pbnRzIHRvIGEgbWFuZ2xlZCBjbGFzcyAoSS5FLiAiM2ZvbyIsICIxM3Zlcnlsb25nY2xhc3MiLCBldGMuKQotCU9uIGV4aXQsIGl0IHBvaW50cyB0byB0aGUgbmV4dCB0b2tlbiBhZnRlciB0aGUgbWFuZ2xlZCBjbGFzcyBvbgotCXN1Y2Nlc3MsIG9yIHRoZSBmaXJzdCB1bmNvbnN1bWVkIHRva2VuIG9uIGZhaWx1cmUuCi0KLQlJZiB0aGUgQ09OU1RSVUNUT1Igb3IgREVTVFJVQ1RPUiBmbGFncyBhcmUgc2V0IGluIFdPUkssIHRoZW4KLQl3ZSBhcmUgZGVtYW5nbGluZyBhIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IuICBJbiB0aGlzIGNhc2UKLQl3ZSBwcmVwZW5kICJjbGFzczo6Y2xhc3MiIG9yICJjbGFzczo6fmNsYXNzIiB0byBERUNMUC4KLQotCU90aGVyd2lzZSwgd2UgcHJlcGVuZCAiY2xhc3M6OiIgdG8gdGhlIGN1cnJlbnQgREVDTFAuCi0KLQlSZXNldCB0aGUgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBmbGFncyBvbmNlIHRoZXkgaGF2ZSBiZWVuCi0JImNvbnN1bWVkIi4gIFRoaXMgYWxsb3dzIGRlbWFuZ2xlX2NsYXNzIHRvIGJlIGNhbGxlZCBsYXRlciBkdXJpbmcKLQl0aGUgc2FtZSBkZW1hbmdsaW5nLCB0byBkbyBub3JtYWwgY2xhc3MgZGVtYW5nbGluZy4KLQotCVJldHVybnMgMSBpZiBkZW1hbmdsaW5nIGlzIHN1Y2Nlc3NmdWwsIDAgb3RoZXJ3aXNlLgotCi0qLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9jbGFzcyAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgaW50IHN1Y2Nlc3MgPSAwOwotICBpbnQgYnR5cGU7Ci0gIHN0cmluZyBjbGFzc19uYW1lOwotICBjaGFyICpzYXZlX2NsYXNzX25hbWVfZW5kID0gMDsKLQotICBzdHJpbmdfaW5pdCAoJmNsYXNzX25hbWUpOwotICBidHlwZSA9IHJlZ2lzdGVyX0J0eXBlICh3b3JrKTsKLSAgaWYgKGRlbWFuZ2xlX2NsYXNzX25hbWUgKHdvcmssIG1hbmdsZWQsICZjbGFzc19uYW1lKSkKLSAgICB7Ci0gICAgICBzYXZlX2NsYXNzX25hbWVfZW5kID0gY2xhc3NfbmFtZS5wOwotICAgICAgaWYgKCh3b3JrLT5jb25zdHJ1Y3RvciAmIDEpIHx8ICh3b3JrLT5kZXN0cnVjdG9yICYgMSkpCi0JewotICAgICAgICAgIC8qIGFkanVzdCBzbyB3ZSBkb24ndCBpbmNsdWRlIHRlbXBsYXRlIGFyZ3MgKi8KLSAgICAgICAgICBpZiAod29yay0+dGVtcF9zdGFydCAmJiAod29yay0+dGVtcF9zdGFydCAhPSAtMSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNsYXNzX25hbWUucCA9IGNsYXNzX25hbWUuYiArIHdvcmstPnRlbXBfc3RhcnQ7Ci0gICAgICAgICAgICB9Ci0JICBzdHJpbmdfcHJlcGVuZHMgKGRlY2xwLCAmY2xhc3NfbmFtZSk7Ci0JICBpZiAod29yayAtPiBkZXN0cnVjdG9yICYgMSkKLQkgICAgewotCSAgICAgIHN0cmluZ19wcmVwZW5kIChkZWNscCwgIn4iKTsKLSAgICAgICAgICAgICAgd29yayAtPiBkZXN0cnVjdG9yIC09IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHdvcmsgLT4gY29uc3RydWN0b3IgLT0gMTsKLQkgICAgfQotCX0KLSAgICAgIGNsYXNzX25hbWUucCA9IHNhdmVfY2xhc3NfbmFtZV9lbmQ7Ci0gICAgICByZW1lbWJlcl9LdHlwZSAod29yaywgY2xhc3NfbmFtZS5iLCBMRU5fU1RSSU5HKCZjbGFzc19uYW1lKSk7Ci0gICAgICByZW1lbWJlcl9CdHlwZSAod29yaywgY2xhc3NfbmFtZS5iLCBMRU5fU1RSSU5HKCZjbGFzc19uYW1lKSwgYnR5cGUpOwotICAgICAgc3RyaW5nX3ByZXBlbmQgKGRlY2xwLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLSAgICAgIHN0cmluZ19wcmVwZW5kcyAoZGVjbHAsICZjbGFzc19uYW1lKTsKLSAgICAgIHN1Y2Nlc3MgPSAxOwotICAgIH0KLSAgc3RyaW5nX2RlbGV0ZSAoJmNsYXNzX25hbWUpOwotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi0vKgotCi1MT0NBTCBGVU5DVElPTgotCi0JZGVtYW5nbGVfcHJlZml4IC0tIGNvbnN1bWUgdGhlIG1hbmdsZWQgbmFtZSBwcmVmaXggYW5kIGZpbmQgc2lnbmF0dXJlCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgaW50Ci0JZGVtYW5nbGVfcHJlZml4IChzdHJ1Y3Qgd29ya19zdHVmZiAqd29yaywgY29uc3QgY2hhciAqKm1hbmdsZWQsCi0JCQkgc3RyaW5nICpkZWNscCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlDb25zdW1lIGFuZCBkZW1hbmdsZSB0aGUgcHJlZml4IG9mIHRoZSBtYW5nbGVkIG5hbWUuCi0KLQlERUNMUCBwb2ludHMgdG8gdGhlIHN0cmluZyBidWZmZXIgaW50byB3aGljaCBkZW1hbmdsZWQgb3V0cHV0IGlzCi0JcGxhY2VkLiAgT24gZW50cnksIHRoZSBidWZmZXIgaXMgZW1wdHkuICBPbiBleGl0IGl0IGNvbnRhaW5zCi0JdGhlIHJvb3QgZnVuY3Rpb24gbmFtZSwgdGhlIGRlbWFuZ2xlZCBvcGVyYXRvciBuYW1lLCBvciBpbiBzb21lCi0Jc3BlY2lhbCBjYXNlcyBlaXRoZXIgbm90aGluZyBvciB0aGUgY29tcGxldGVseSBkZW1hbmdsZWQgcmVzdWx0LgotCi0JTUFOR0xFRCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgcG9pbnRlciBpbnRvIHRoZSBtYW5nbGVkIG5hbWUuICBBcyBlYWNoCi0JdG9rZW4gb2YgdGhlIG1hbmdsZWQgbmFtZSBpcyBjb25zdW1lZCwgaXQgaXMgdXBkYXRlZC4gIFVwb24gZW50cnkKLQl0aGUgY3VycmVudCBtYW5nbGVkIG5hbWUgcG9pbnRlciBwb2ludHMgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZgotCXRoZSBtYW5nbGVkIG5hbWUuICBVcG9uIGV4aXQsIGl0IHNob3VsZCBwb2ludCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyCi0Jb2YgdGhlIHNpZ25hdHVyZSBpZiBkZW1hbmdsaW5nIHdhcyBzdWNjZXNzZnVsLCBvciB0byB0aGUgZmlyc3QKLQl1bmNvbnN1bWVkIGNoYXJhY3RlciBpZiBkZW1hbmdsaW5nIG9mIHRoZSBwcmVmaXggd2FzIHVuc3VjY2Vzc2Z1bC4KLQotCVJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG90aGVyd2lzZS4KLSAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9wcmVmaXggKHdvcmssIG1hbmdsZWQsIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIGludCBzdWNjZXNzID0gMTsKLSAgY29uc3QgY2hhciAqc2NhbjsKLSAgaW50IGk7Ci0KLSAgaWYgKHN0cmxlbigqbWFuZ2xlZCkgPiA2Ci0gICAgICAmJiAoc3RybmNtcCgqbWFuZ2xlZCwgIl9pbXBfXyIsIDYpID09IDAKLSAgICAgICAgICB8fCBzdHJuY21wKCptYW5nbGVkLCAiX19pbXBfIiwgNikgPT0gMCkpCi0gICAgewotICAgICAgLyogaXQncyBhIHN5bWJvbCBpbXBvcnRlZCBmcm9tIGEgUEUgZHluYW1pYyBsaWJyYXJ5LiBDaGVjayBmb3IgYm90aAotICAgICAgICAgbmV3IHN0eWxlIHByZWZpeCBfaW1wX18gYW5kIGxlZ2FjeSBfX2ltcF8gdXNlZCBieSBvbGRlciB2ZXJzaW9ucwotCSBvZiBkbGx0b29sLiAqLwotICAgICAgKCptYW5nbGVkKSArPSA2OwotICAgICAgd29yay0+ZGxsaW1wb3J0ZWQgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybGVuKCptYW5nbGVkKSA+PSAxMSAmJiBzdHJuY21wKCptYW5nbGVkLCAiX0dMT0JBTF8iLCA4KSA9PSAwKQotICAgIHsKLSAgICAgIGNoYXIgKm1hcmtlciA9IHN0cmNociAoY3BsdXNfbWFya2VycywgKCptYW5nbGVkKVs4XSk7Ci0gICAgICBpZiAobWFya2VyICE9IE5VTEwgJiYgKm1hcmtlciA9PSAoKm1hbmdsZWQpWzEwXSkKLQl7Ci0JICBpZiAoKCptYW5nbGVkKVs5XSA9PSAnRCcpCi0JICAgIHsKLQkgICAgICAvKiBpdCdzIGEgR05VIGdsb2JhbCBkZXN0cnVjdG9yIHRvIGJlIGV4ZWN1dGVkIGF0IHByb2dyYW0gZXhpdCAqLwotCSAgICAgICgqbWFuZ2xlZCkgKz0gMTE7Ci0JICAgICAgd29yay0+ZGVzdHJ1Y3RvciA9IDI7Ci0JICAgICAgaWYgKGdudV9zcGVjaWFsICh3b3JrLCBtYW5nbGVkLCBkZWNscCkpCi0JCXJldHVybiBzdWNjZXNzOwotCSAgICB9Ci0JICBlbHNlIGlmICgoKm1hbmdsZWQpWzldID09ICdJJykKLQkgICAgewotCSAgICAgIC8qIGl0J3MgYSBHTlUgZ2xvYmFsIGNvbnN0cnVjdG9yIHRvIGJlIGV4ZWN1dGVkIGF0IHByb2dyYW0gaW5pdCAqLwotCSAgICAgICgqbWFuZ2xlZCkgKz0gMTE7Ci0JICAgICAgd29yay0+Y29uc3RydWN0b3IgPSAyOwotCSAgICAgIGlmIChnbnVfc3BlY2lhbCAod29yaywgbWFuZ2xlZCwgZGVjbHApKQotCQlyZXR1cm4gc3VjY2VzczsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKChBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKSAmJiBzdHJuY21wKCptYW5nbGVkLCAiX19zdGRfXyIsIDcpID09IDApCi0gICAgewotICAgICAgLyogaXQncyBhIEFSTSBnbG9iYWwgZGVzdHJ1Y3RvciB0byBiZSBleGVjdXRlZCBhdCBwcm9ncmFtIGV4aXQgKi8KLSAgICAgICgqbWFuZ2xlZCkgKz0gNzsKLSAgICAgIHdvcmstPmRlc3RydWN0b3IgPSAyOwotICAgIH0KLSAgZWxzZSBpZiAoKEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpICYmIHN0cm5jbXAoKm1hbmdsZWQsICJfX3N0aV9fIiwgNykgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBpdCdzIGEgQVJNIGdsb2JhbCBjb25zdHJ1Y3RvciB0byBiZSBleGVjdXRlZCBhdCBwcm9ncmFtIGluaXRpYWwgKi8KLSAgICAgICgqbWFuZ2xlZCkgKz0gNzsKLSAgICAgIHdvcmstPmNvbnN0cnVjdG9yID0gMjsKLSAgICB9Ci0KLSAgLyogIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBhIHJlZHVjdGlvbiBpbiBzdHJlbmd0aCB0aW1lIG9wdGltaXphdGlvbgotICAgICAgb2Y6Ci0gICAgICBzY2FuID0gbXlzdHJzdHIgKCptYW5nbGVkLCAiX18iKTsgKi8KLQotICB7Ci0gICAgc2NhbiA9ICptYW5nbGVkOwotCi0gICAgZG8gewotICAgICAgc2NhbiA9IHN0cmNociAoc2NhbiwgJ18nKTsKLSAgICB9IHdoaWxlIChzY2FuICE9IE5VTEwgJiYgKisrc2NhbiAhPSAnXycpOwotCi0gICAgaWYgKHNjYW4gIT0gTlVMTCkgLS1zY2FuOwotICB9Ci0KLSAgaWYgKHNjYW4gIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBmb3VuZCBhIHNlcXVlbmNlIG9mIHR3byBvciBtb3JlICdfJywgZW5zdXJlIHRoYXQgd2Ugc3RhcnQgYXQKLQkgdGhlIGxhc3QgcGFpciBpbiB0aGUgc2VxdWVuY2UuICAqLwotICAgICAgaSA9IHN0cnNwbiAoc2NhbiwgIl8iKTsKLSAgICAgIGlmIChpID4gMikKLQl7Ci0JICBzY2FuICs9IChpIC0gMik7Ci0JfQotICAgIH0KLQotICBpZiAoc2NhbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN1Y2Nlc3MgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAod29yayAtPiBzdGF0aWNfdHlwZSkKLSAgICB7Ci0gICAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKXNjYW5bMF0pICYmIChzY2FuWzBdICE9ICd0JykpCi0JewotCSAgc3VjY2VzcyA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoKHNjYW4gPT0gKm1hbmdsZWQpCi0JICAgJiYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKXNjYW5bMl0pIHx8IChzY2FuWzJdID09ICdRJykKLQkgICAgICAgfHwgKHNjYW5bMl0gPT0gJ3QnKSB8fCAoc2NhblsyXSA9PSAnSycpIHx8IChzY2FuWzJdID09ICdIJykpKQotICAgIHsKLSAgICAgIC8qIFRoZSBBUk0gc2F5cyBub3RoaW5nIGFib3V0IHRoZSBtYW5nbGluZyBvZiBsb2NhbCB2YXJpYWJsZXMuCi0JIEJ1dCBjZnJvbnQgbWFuZ2xlcyBsb2NhbCB2YXJpYWJsZXMgYnkgcHJlcGVuZGluZyBfXzxuZXN0aW5nX2xldmVsPgotCSB0byB0aGVtLiBBcyBhbiBleHRlbnNpb24gdG8gQVJNIGRlbWFuZ2xpbmcgd2UgaGFuZGxlIHRoaXMgY2FzZS4gICovCi0gICAgICBpZiAoKExVQ0lEX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORykKLQkgICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKXNjYW5bMl0pKQotCXsKLQkgICptYW5nbGVkID0gc2NhbiArIDI7Ci0JICBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAqbWFuZ2xlZCk7Ci0JICAqbWFuZ2xlZCArPSBzdHJsZW4gKCptYW5nbGVkKTsKLQkgIHN1Y2Nlc3MgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBBIEdOVSBzdHlsZSBjb25zdHJ1Y3RvciBzdGFydHMgd2l0aCBfX1swLTlRdF0uICBCdXQgY2Zyb250IHVzZXMKLQkgICAgIG5hbWVzIGxpa2UgX19RMl8zZm9vM2JhciBmb3IgbmVzdGVkIHR5cGUgbmFtZXMuICBTbyBkb24ndCBhY2NlcHQKLQkgICAgIHRoaXMgc3R5bGUgb2YgY29uc3RydWN0b3IgZm9yIGNmcm9udCBkZW1hbmdsaW5nLiAgQSBHTlUKLQkgICAgIHN0eWxlIG1lbWJlci10ZW1wbGF0ZSBjb25zdHJ1Y3RvciBzdGFydHMgd2l0aCAnSCcuICovCi0JICBpZiAoIShMVUNJRF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpKQotCSAgICB3b3JrIC0+IGNvbnN0cnVjdG9yICs9IDE7Ci0JICAqbWFuZ2xlZCA9IHNjYW4gKyAyOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKEFSTV9ERU1BTkdMSU5HICYmIHNjYW5bMl0gPT0gJ3AnICYmIHNjYW5bM10gPT0gJ3QnKQotICAgIHsKLSAgICAgIC8qIENmcm9udC1zdHlsZSBwYXJhbWV0ZXJpemVkIHR5cGUuICBIYW5kbGVkIGxhdGVyIGFzIGEgc2lnbmF0dXJlLiAqLwotICAgICAgc3VjY2VzcyA9IDE7Ci0KLSAgICAgIC8qIEFSTSB0ZW1wbGF0ZT8gKi8KLSAgICAgIGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgc3RybGVuICgqbWFuZ2xlZCksIGRlY2xwKTsKLSAgICB9Ci0gIGVsc2UgaWYgKEVER19ERU1BTkdMSU5HICYmICgoc2NhblsyXSA9PSAndCcgJiYgc2NhblszXSA9PSAnbScpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc2NhblsyXSA9PSAncCcgJiYgc2NhblszXSA9PSAncycpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc2NhblsyXSA9PSAncCcgJiYgc2NhblszXSA9PSAndCcpKSkKLSAgICB7Ci0gICAgICAvKiBFREctc3R5bGUgcGFyYW1ldGVyaXplZCB0eXBlLiAgSGFuZGxlZCBsYXRlciBhcyBhIHNpZ25hdHVyZS4gKi8KLSAgICAgIHN1Y2Nlc3MgPSAxOwotCi0gICAgICAvKiBFREcgdGVtcGxhdGU/ICovCi0gICAgICBkZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIHN0cmxlbiAoKm1hbmdsZWQpLCBkZWNscCk7Ci0gICAgfQotICBlbHNlIGlmICgoc2NhbiA9PSAqbWFuZ2xlZCkgJiYgIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKXNjYW5bMl0pCi0JICAgJiYgKHNjYW5bMl0gIT0gJ3QnKSkKLSAgICB7Ci0gICAgICAvKiBNYW5nbGVkIG5hbWUgc3RhcnRzIHdpdGggIl9fIi4gIFNraXAgb3ZlciBhbnkgbGVhZGluZyAnXycgY2hhcmFjdGVycywKLQkgdGhlbiBmaW5kIHRoZSBuZXh0ICJfXyIgdGhhdCBzZXBhcmF0ZXMgdGhlIHByZWZpeCBmcm9tIHRoZSBzaWduYXR1cmUuCi0JICovCi0gICAgICBpZiAoIShBUk1fREVNQU5HTElORyB8fCBMVUNJRF9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpCi0JICB8fCAoYXJtX3NwZWNpYWwgKG1hbmdsZWQsIGRlY2xwKSA9PSAwKSkKLQl7Ci0JICB3aGlsZSAoKnNjYW4gPT0gJ18nKQotCSAgICB7Ci0JICAgICAgc2NhbisrOwotCSAgICB9Ci0JICBpZiAoKHNjYW4gPSBteXN0cnN0ciAoc2NhbiwgIl9fIikpID09IE5VTEwgfHwgKCooc2NhbiArIDIpID09ICdcMCcpKQotCSAgICB7Ci0JICAgICAgLyogTm8gc2VwYXJhdG9yIChJLkUuICJfX25vdF9tYW5nbGVkIiksIG9yIGVtcHR5IHNpZ25hdHVyZQotCQkgKEkuRS4gIl9fbm90X21hbmdsZWRfZWl0aGVyX18iKSAqLwotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICp0bXA7Ci0KLSAgICAgICAgICAgICAgLyogTG9vayBmb3IgdGhlIExBU1Qgb2NjdXJyZW5jZSBvZiBfXywgYWxsb3dpbmcgbmFtZXMgdG8KLSAgICAgICAgICAgICAgICAgaGF2ZSB0aGUgJ19fJyBzZXF1ZW5jZSBlbWJlZGRlZCBpbiB0aGVtLiAqLwotCSAgICAgIGlmICghKEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcpKQotCQl7Ci0JCSAgd2hpbGUgKCh0bXAgPSBteXN0cnN0ciAoc2NhbiArIDIsICJfXyIpKSAhPSBOVUxMKQotCQkgICAgc2NhbiA9IHRtcDsKLQkJfQotCSAgICAgIGlmICgqKHNjYW4gKyAyKSA9PSAnXDAnKQotCQlzdWNjZXNzID0gMDsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGRlbWFuZ2xlX2Z1bmN0aW9uX25hbWUgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCBzY2FuKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKCooc2NhbiArIDIpICE9ICdcMCcpCi0gICAgewotICAgICAgLyogTWFuZ2xlZCBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggIl9fIiBidXQgZG9lcyBoYXZlIG9uZSBzb21ld2hlcmUKLQkgaW4gdGhlcmUgd2l0aCBub24gZW1wdHkgc3R1ZmYgYWZ0ZXIgaXQuICBMb29rcyBsaWtlIGEgZ2xvYmFsCi0JIGZ1bmN0aW9uIG5hbWUuICAqLwotICAgICAgZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIHNjYW4pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIERvZXNuJ3QgbG9vayBsaWtlIGEgbWFuZ2xlZCBuYW1lICovCi0gICAgICBzdWNjZXNzID0gMDsKLSAgICB9Ci0KLSAgaWYgKCFzdWNjZXNzICYmICh3b3JrLT5jb25zdHJ1Y3RvciA9PSAyIHx8IHdvcmstPmRlc3RydWN0b3IgPT0gMikpCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICptYW5nbGVkKTsKLSAgICAgICptYW5nbGVkICs9IHN0cmxlbiAoKm1hbmdsZWQpOwotICAgICAgc3VjY2VzcyA9IDE7Ci0gICAgfQotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi0vKgotCi1MT0NBTCBGVU5DVElPTgotCi0JZ251X3NwZWNpYWwgLS0gc3BlY2lhbCBoYW5kbGluZyBvZiBnbnUgbWFuZ2xlZCBzdHJpbmdzCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgaW50Ci0JZ251X3NwZWNpYWwgKHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrLCBjb25zdCBjaGFyICoqbWFuZ2xlZCwKLQkJICAgICBzdHJpbmcgKmRlY2xwKTsKLQotCi1ERVNDUklQVElPTgotCi0JUHJvY2VzcyBzb21lIHNwZWNpYWwgR05VIHN0eWxlIG1hbmdsaW5nIGZvcm1zIHRoYXQgZG9uJ3QgZml0Ci0JdGhlIG5vcm1hbCBwYXR0ZXJuLiAgRm9yIGV4YW1wbGU6Ci0KLQkJXyRfM2ZvbwkJKGRlc3RydWN0b3IgZm9yIGNsYXNzIGZvbykKLQkJX3Z0JGZvbwkJKGZvbyB2aXJ0dWFsIHRhYmxlKQotCQlfdnQkZm9vJGJhcgkoZm9vOjpiYXIgdmlydHVhbCB0YWJsZSkKLQkJX192dF9mb28JKGZvbyB2aXJ0dWFsIHRhYmxlLCBuZXcgc3R5bGUgd2l0aCB0aHVua3MpCi0JCV8zZm9vJHZhcm5hbWUJKHN0YXRpYyBkYXRhIG1lbWJlcikKLQkJX1EyMnJzMnR1JHZ3CShzdGF0aWMgZGF0YSBtZW1iZXIpCi0JCV9fdDZ2ZWN0b3IxWmlpCShjb25zdHJ1Y3RvciB3aXRoIHRlbXBsYXRlKQotCQlfX3RodW5rXzRfXyRfN29zdHJlYW0gKHZpcnR1YWwgZnVuY3Rpb24gdGh1bmspCi0gKi8KLQotc3RhdGljIGludAotZ251X3NwZWNpYWwgKHdvcmssIG1hbmdsZWQsIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIGludCBuOwotICBpbnQgc3VjY2VzcyA9IDE7Ci0gIGNvbnN0IGNoYXIgKnA7Ci0KLSAgaWYgKCgqbWFuZ2xlZClbMF0gPT0gJ18nCi0gICAgICAmJiBzdHJjaHIgKGNwbHVzX21hcmtlcnMsICgqbWFuZ2xlZClbMV0pICE9IE5VTEwKLSAgICAgICYmICgqbWFuZ2xlZClbMl0gPT0gJ18nKQotICAgIHsKLSAgICAgIC8qIEZvdW5kIGEgR05VIHN0eWxlIGRlc3RydWN0b3IsIGdldCBwYXN0ICJfPENQTFVTX01BUktFUj5fIiAqLwotICAgICAgKCptYW5nbGVkKSArPSAzOwotICAgICAgd29yayAtPiBkZXN0cnVjdG9yICs9IDE7Ci0gICAgfQotICBlbHNlIGlmICgoKm1hbmdsZWQpWzBdID09ICdfJwotCSAgICYmICgoKCptYW5nbGVkKVsxXSA9PSAnXycKLQkJJiYgKCptYW5nbGVkKVsyXSA9PSAndicKLQkJJiYgKCptYW5nbGVkKVszXSA9PSAndCcKLQkJJiYgKCptYW5nbGVkKVs0XSA9PSAnXycpCi0JICAgICAgIHx8ICgoKm1hbmdsZWQpWzFdID09ICd2JwotCQkgICAmJiAoKm1hbmdsZWQpWzJdID09ICd0JwotCQkgICAmJiBzdHJjaHIgKGNwbHVzX21hcmtlcnMsICgqbWFuZ2xlZClbM10pICE9IE5VTEwpKSkKLSAgICB7Ci0gICAgICAvKiBGb3VuZCBhIEdOVSBzdHlsZSB2aXJ0dWFsIHRhYmxlLCBnZXQgcGFzdCAiX3Z0PENQTFVTX01BUktFUj4iCi0gICAgICAgICBhbmQgY3JlYXRlIHRoZSBkZWNsLiAgTm90ZSB0aGF0IHdlIGNvbnN1bWUgdGhlIGVudGlyZSBtYW5nbGVkCi0JIGlucHV0IHN0cmluZywgd2hpY2ggbWVhbnMgdGhhdCBkZW1hbmdsZV9zaWduYXR1cmUgaGFzIG5vIHdvcmsKLQkgdG8gZG8uICAqLwotICAgICAgaWYgKCgqbWFuZ2xlZClbMl0gPT0gJ3YnKQotCSgqbWFuZ2xlZCkgKz0gNTsgLyogTmV3IHN0eWxlLCB3aXRoIHRodW5rczogIl9fdnRfIiAqLwotICAgICAgZWxzZQotCSgqbWFuZ2xlZCkgKz0gNDsgLyogT2xkIHN0eWxlLCBubyB0aHVua3M6ICJfdnQ8Q1BMVVNfTUFSS0VSPiIgKi8KLSAgICAgIHdoaWxlICgqKm1hbmdsZWQgIT0gJ1wwJykKLQl7Ci0JICBzd2l0Y2ggKCoqbWFuZ2xlZCkKLQkgICAgewotCSAgICBjYXNlICdRJzoKLQkgICAgY2FzZSAnSyc6Ci0JICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX3F1YWxpZmllZCAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDAsIDEpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICd0JzoKLQkgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAxLAotCQkJCQkgICAxKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBpZiAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikqbWFuZ2xlZFswXSkpCi0JCXsKLQkJICBuID0gY29uc3VtZV9jb3VudChtYW5nbGVkKTsKLQkJICAvKiBXZSBtYXkgYmUgc2VlaW5nIGEgdG9vLWxhcmdlIHNpemUsIG9yIGVsc2UgYQotCQkgICAgICIuPGRpZ2l0cz4iIGluZGljYXRpbmcgYSBzdGF0aWMgbG9jYWwgc3ltYm9sLiAgSW4KLQkJICAgICBhbnkgY2FzZSwgZGVjbGFyZSB2aWN0b3J5IGFuZCBtb3ZlIG9uOyAqZG9uJ3QqIHRyeQotCQkgICAgIHRvIHVzZSBuIHRvIGFsbG9jYXRlLiAgKi8KLQkJICBpZiAobiA+IChpbnQpIHN0cmxlbiAoKm1hbmdsZWQpKQotCQkgICAgewotCQkgICAgICBzdWNjZXNzID0gMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBuID0gc3RyY3NwbiAoKm1hbmdsZWQsIGNwbHVzX21hcmtlcnMpOwotCQl9Ci0JICAgICAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAqbWFuZ2xlZCwgbik7Ci0JICAgICAgKCptYW5nbGVkKSArPSBuOwotCSAgICB9Ci0KLQkgIHAgPSBzdHJwYnJrICgqbWFuZ2xlZCwgY3BsdXNfbWFya2Vycyk7Ci0JICBpZiAoc3VjY2VzcyAmJiAoKHAgPT0gTlVMTCkgfHwgKHAgPT0gKm1hbmdsZWQpKSkKLQkgICAgewotCSAgICAgIGlmIChwICE9IE5VTEwpCi0JCXsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0JCSAgKCptYW5nbGVkKSsrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKHN1Y2Nlc3MpCi0Jc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIgdmlydHVhbCB0YWJsZSIpOwotICAgIH0KLSAgZWxzZSBpZiAoKCptYW5nbGVkKVswXSA9PSAnXycKLQkgICAmJiAoc3RyY2hyKCIwMTIzNDU2Nzg5UXQiLCAoKm1hbmdsZWQpWzFdKSAhPSBOVUxMKQotCSAgICYmIChwID0gc3RycGJyayAoKm1hbmdsZWQsIGNwbHVzX21hcmtlcnMpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIHN0YXRpYyBkYXRhIG1lbWJlciwgIl8zZm9vJHZhcm5hbWUiIGZvciBleGFtcGxlICovCi0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBzd2l0Y2ggKCoqbWFuZ2xlZCkKLQl7Ci0JY2FzZSAnUSc6Ci0JY2FzZSAnSyc6Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSk7Ci0JICBicmVhazsKLQljYXNlICd0JzoKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDAsIDEsIDEpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIG4gPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLQkgIGlmIChuIDwgMCB8fCBuID4gc3RybGVuICgqbWFuZ2xlZCkpCi0JICAgIHsKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAqbWFuZ2xlZCwgbik7Ci0JICAoKm1hbmdsZWQpICs9IG47Ci0JfQotICAgICAgaWYgKHN1Y2Nlc3MgJiYgKHAgPT0gKm1hbmdsZWQpKQotCXsKLQkgIC8qIENvbnN1bWVkIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGNwbHVzX21hcmtlciwgYXBwZW5kIHRoZQotCSAgICAgdmFyaWFibGUgbmFtZS4gICovCi0JICAoKm1hbmdsZWQpKys7Ci0JICBzdHJpbmdfYXBwZW5kIChkZWNscCwgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0JICBuID0gc3RybGVuICgqbWFuZ2xlZCk7Ci0JICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKLQkgICgqbWFuZ2xlZCkgKz0gbjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3VjY2VzcyA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoKm1hbmdsZWQsICJfX3RodW5rXyIsIDgpID09IDApCi0gICAgewotICAgICAgaW50IGRlbHRhOwotCi0gICAgICAoKm1hbmdsZWQpICs9IDg7Ci0gICAgICBkZWx0YSA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotICAgICAgaWYgKGRlbHRhID09IC0xKQotCXN1Y2Nlc3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKm1ldGhvZCA9IGludGVybmFsX2NwbHVzX2RlbWFuZ2xlICh3b3JrLCArKyptYW5nbGVkKTsKLQotCSAgaWYgKG1ldGhvZCkKLQkgICAgewotCSAgICAgIGNoYXIgYnVmWzUwXTsKLQkgICAgICBzcHJpbnRmIChidWYsICJ2aXJ0dWFsIGZ1bmN0aW9uIHRodW5rIChkZWx0YTolZCkgZm9yICIsIC1kZWx0YSk7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIGJ1Zik7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIG1ldGhvZCk7Ci0JICAgICAgZnJlZSAobWV0aG9kKTsKLQkgICAgICBuID0gc3RybGVuICgqbWFuZ2xlZCk7Ci0JICAgICAgKCptYW5nbGVkKSArPSBuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKCptYW5nbGVkLCAiX190IiwgMykgPT0gMAotCSAgICYmICgoKm1hbmdsZWQpWzNdID09ICdpJyB8fCAoKm1hbmdsZWQpWzNdID09ICdmJykpCi0gICAgewotICAgICAgcCA9ICgqbWFuZ2xlZClbM10gPT0gJ2knID8gIiB0eXBlX2luZm8gbm9kZSIgOiAiIHR5cGVfaW5mbyBmdW5jdGlvbiI7Ci0gICAgICAoKm1hbmdsZWQpICs9IDQ7Ci0gICAgICBzd2l0Y2ggKCoqbWFuZ2xlZCkKLQl7Ci0JY2FzZSAnUSc6Ci0JY2FzZSAnSyc6Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSk7Ci0JICBicmVhazsKLQljYXNlICd0JzoKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDAsIDEsIDEpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9mdW5kX3R5cGUgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmIChzdWNjZXNzICYmICoqbWFuZ2xlZCAhPSAnXDAnKQotCXN1Y2Nlc3MgPSAwOwotICAgICAgaWYgKHN1Y2Nlc3MpCi0Jc3RyaW5nX2FwcGVuZCAoZGVjbHAsIHApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN1Y2Nlc3MgPSAwOwotICAgIH0KLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotc3RhdGljIHZvaWQKLXJlY3Vyc2l2ZWx5X2RlbWFuZ2xlKHdvcmssIG1hbmdsZWQsIHJlc3VsdCwgbmFtZWxlbmd0aCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnJlc3VsdDsKLSAgICAgaW50IG5hbWVsZW5ndGg7Ci17Ci0gIGNoYXIgKiByZWN1cnNlID0gKGNoYXIgKilOVUxMOwotICBjaGFyICogcmVjdXJzZV9kZW0gPSAoY2hhciAqKU5VTEw7Ci0KLSAgcmVjdXJzZSA9IChjaGFyICopIHhtYWxsb2MgKG5hbWVsZW5ndGggKyAxKTsKLSAgbWVtY3B5IChyZWN1cnNlLCAqbWFuZ2xlZCwgbmFtZWxlbmd0aCk7Ci0gIHJlY3Vyc2VbbmFtZWxlbmd0aF0gPSAnXDAwMCc7Ci0KLSAgcmVjdXJzZV9kZW0gPSBjcGx1c19kZW1hbmdsZSAocmVjdXJzZSwgd29yay0+b3B0aW9ucyk7Ci0KLSAgaWYgKHJlY3Vyc2VfZGVtKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgcmVjdXJzZV9kZW0pOwotICAgICAgZnJlZSAocmVjdXJzZV9kZW0pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmRuIChyZXN1bHQsICptYW5nbGVkLCBuYW1lbGVuZ3RoKTsKLSAgICB9Ci0gIGZyZWUgKHJlY3Vyc2UpOwotICAqbWFuZ2xlZCArPSBuYW1lbGVuZ3RoOwotfQotCi0vKgotCi1MT0NBTCBGVU5DVElPTgotCi0JYXJtX3NwZWNpYWwgLS0gc3BlY2lhbCBoYW5kbGluZyBvZiBBUk0vbHVjaWQgbWFuZ2xlZCBzdHJpbmdzCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgaW50Ci0JYXJtX3NwZWNpYWwgKGNvbnN0IGNoYXIgKiptYW5nbGVkLAotCQkgICAgIHN0cmluZyAqZGVjbHApOwotCi0KLURFU0NSSVBUSU9OCi0KLQlQcm9jZXNzIHNvbWUgc3BlY2lhbCBBUk0gc3R5bGUgbWFuZ2xpbmcgZm9ybXMgdGhhdCBkb24ndCBmaXQKLQl0aGUgbm9ybWFsIHBhdHRlcm4uICBGb3IgZXhhbXBsZToKLQotCQlfX3Z0YmxfXzNmb28JCShmb28gdmlydHVhbCB0YWJsZSkKLQkJX192dGJsX18zZm9vX18zYmFyCShiYXI6OmZvbyB2aXJ0dWFsIHRhYmxlKQotCi0gKi8KLQotc3RhdGljIGludAotYXJtX3NwZWNpYWwgKG1hbmdsZWQsIGRlY2xwKQotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgaW50IG47Ci0gIGludCBzdWNjZXNzID0gMTsKLSAgY29uc3QgY2hhciAqc2NhbjsKLQotICBpZiAoc3RybmNtcCAoKm1hbmdsZWQsIEFSTV9WVEFCTEVfU1RSSU5HLCBBUk1fVlRBQkxFX1NUUkxFTikgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBGb3VuZCBhIEFSTSBzdHlsZSB2aXJ0dWFsIHRhYmxlLCBnZXQgcGFzdCBBUk1fVlRBQkxFX1NUUklORwotICAgICAgICAgYW5kIGNyZWF0ZSB0aGUgZGVjbC4gIE5vdGUgdGhhdCB3ZSBjb25zdW1lIHRoZSBlbnRpcmUgbWFuZ2xlZAotCSBpbnB1dCBzdHJpbmcsIHdoaWNoIG1lYW5zIHRoYXQgZGVtYW5nbGVfc2lnbmF0dXJlIGhhcyBubyB3b3JrCi0JIHRvIGRvLiAgKi8KLSAgICAgIHNjYW4gPSAqbWFuZ2xlZCArIEFSTV9WVEFCTEVfU1RSTEVOOwotICAgICAgd2hpbGUgKCpzY2FuICE9ICdcMCcpICAgICAgICAvKiBmaXJzdCBjaGVjayBpdCBjYW4gYmUgZGVtYW5nbGVkICovCi0gICAgICAgIHsKLSAgICAgICAgICBuID0gY29uc3VtZV9jb3VudCAoJnNjYW4pOwotICAgICAgICAgIGlmIChuID09IC0xKQotCSAgICB7Ci0JICAgICAgcmV0dXJuICgwKTsgICAgICAgICAgIC8qIG5vIGdvb2QgKi8KLQkgICAgfQotICAgICAgICAgIHNjYW4gKz0gbjsKLSAgICAgICAgICBpZiAoc2NhblswXSA9PSAnXycgJiYgc2NhblsxXSA9PSAnXycpCi0JICAgIHsKLQkgICAgICBzY2FuICs9IDI7Ci0JICAgIH0KLSAgICAgICAgfQotICAgICAgKCptYW5nbGVkKSArPSBBUk1fVlRBQkxFX1NUUkxFTjsKLSAgICAgIHdoaWxlICgqKm1hbmdsZWQgIT0gJ1wwJykKLQl7Ci0JICBuID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0gICAgICAgICAgaWYgKG4gPT0gLTEKLQkgICAgICB8fCBuID4gc3RybGVuICgqbWFuZ2xlZCkpCi0JICAgIHJldHVybiAwOwotCSAgc3RyaW5nX3ByZXBlbmRuIChkZWNscCwgKm1hbmdsZWQsIG4pOwotCSAgKCptYW5nbGVkKSArPSBuOwotCSAgaWYgKCgqbWFuZ2xlZClbMF0gPT0gJ18nICYmICgqbWFuZ2xlZClbMV0gPT0gJ18nKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX3ByZXBlbmQgKGRlY2xwLCAiOjoiKTsKLQkgICAgICAoKm1hbmdsZWQpICs9IDI7Ci0JICAgIH0KLQl9Ci0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIiB2aXJ0dWFsIHRhYmxlIik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgfQotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi0vKgotCi1MT0NBTCBGVU5DVElPTgotCi0JZGVtYW5nbGVfcXVhbGlmaWVkIC0tIGRlbWFuZ2xlICdRJyBxdWFsaWZpZWQgbmFtZSBzdHJpbmdzCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgaW50Ci0JZGVtYW5nbGVfcXVhbGlmaWVkIChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICptYW5nbGVkLAotCQkJICAgIHN0cmluZyAqcmVzdWx0LCBpbnQgaXNmdW5jbmFtZSwgaW50IGFwcGVuZCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlEZW1hbmdsZSBhIHF1YWxpZmllZCBuYW1lLCBzdWNoIGFzICJRMjVPdXRlcjVJbm5lciIgd2hpY2ggaXMKLQl0aGUgbWFuZ2xlZCBmb3JtIG9mICJPdXRlcjo6SW5uZXIiLiAgVGhlIGRlbWFuZ2xlZCBvdXRwdXQgaXMKLQlwcmVwZW5kZWQgb3IgYXBwZW5kZWQgdG8gdGhlIHJlc3VsdCBzdHJpbmcgYWNjb3JkaW5nIHRvIHRoZQotCXN0YXRlIG9mIHRoZSBhcHBlbmQgZmxhZy4KLQotCUlmIGlzZnVuY25hbWUgaXMgbm9uemVybywgdGhlbiB0aGUgcXVhbGlmaWVkIG5hbWUgd2UgYXJlIGJ1aWxkaW5nCi0JaXMgZ29pbmcgdG8gYmUgdXNlZCBhcyBhIG1lbWJlciBmdW5jdGlvbiBuYW1lLCBzbyBpZiBpdCBpcyBhCi0JY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBmdW5jdGlvbiwgYXBwZW5kIGFuIGFwcHJvcHJpYXRlCi0JY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBuYW1lLiAgSS5FLiBmb3IgdGhlIGFib3ZlIGV4YW1wbGUsCi0JdGhlIHJlc3VsdCBmb3IgdXNlIGFzIGEgY29uc3RydWN0b3IgaXMgIk91dGVyOjpJbm5lcjo6SW5uZXIiCi0JYW5kIHRoZSByZXN1bHQgZm9yIHVzZSBhcyBhIGRlc3RydWN0b3IgaXMgIk91dGVyOjpJbm5lcjo6fklubmVyIi4KLQotQlVHUwotCi0JTnVtZXJpYyBjb252ZXJzaW9uIGlzIEFTQ0lJIGRlcGVuZGVudCAoRklYTUUpLgotCi0gKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCByZXN1bHQsIGlzZnVuY25hbWUsIGFwcGVuZCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnJlc3VsdDsKLSAgICAgaW50IGlzZnVuY25hbWU7Ci0gICAgIGludCBhcHBlbmQ7Ci17Ci0gIGludCBxdWFsaWZpZXJzID0gMDsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBjb25zdCBjaGFyICpwOwotICBjaGFyIG51bVsyXTsKLSAgc3RyaW5nIHRlbXA7Ci0gIHN0cmluZyBsYXN0X25hbWU7Ci0gIGludCBiaW5kZXggPSByZWdpc3Rlcl9CdHlwZSAod29yayk7Ci0KLSAgLyogV2Ugb25seSBtYWtlIHVzZSBvZiBJU0ZVTkNOQU1FIGlmIHRoZSBlbnRpdHkgaXMgYSBjb25zdHJ1Y3RvciBvcgotICAgICBkZXN0cnVjdG9yLiAgKi8KLSAgaXNmdW5jbmFtZSA9IChpc2Z1bmNuYW1lCi0JCSYmICgod29yay0+Y29uc3RydWN0b3IgJiAxKSB8fCAod29yay0+ZGVzdHJ1Y3RvciAmIDEpKSk7Ci0KLSAgc3RyaW5nX2luaXQgKCZ0ZW1wKTsKLSAgc3RyaW5nX2luaXQgKCZsYXN0X25hbWUpOwotCi0gIGlmICgoKm1hbmdsZWQpWzBdID09ICdLJykKLSAgICB7Ci0gICAgLyogU3F1YW5nbGluZyBxdWFsaWZpZWQgbmFtZSByZXVzZSAqLwotICAgICAgaW50IGlkeDsKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIGlkeCA9IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCk7Ci0gICAgICBpZiAoaWR4ID09IC0xIHx8IGlkeCA+PSB3b3JrIC0+IG51bWspCi0gICAgICAgIHN1Y2Nlc3MgPSAwOwotICAgICAgZWxzZQotICAgICAgICBzdHJpbmdfYXBwZW5kICgmdGVtcCwgd29yayAtPiBrdHlwZXZlY1tpZHhdKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBzd2l0Y2ggKCgqbWFuZ2xlZClbMV0pCi0gICAgewotICAgIGNhc2UgJ18nOgotICAgICAgLyogR05VIG1hbmdsZWQgbmFtZSB3aXRoIG1vcmUgdGhhbiA5IGNsYXNzZXMuICBUaGUgY291bnQgaXMgcHJlY2VkZWQKLQkgYnkgYW4gdW5kZXJzY29yZSAodG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSB0aGUgPD0gOSBjYXNlKSBhbmQgZm9sbG93ZWQKLQkgYnkgYW4gdW5kZXJzY29yZS4gICovCi0gICAgICBwID0gKm1hbmdsZWQgKyAyOwotICAgICAgcXVhbGlmaWVycyA9IGF0b2kgKHApOwotICAgICAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqcCkgfHwgKnAgPT0gJzAnKQotCXN1Y2Nlc3MgPSAwOwotCi0gICAgICAvKiBTa2lwIHRoZSBkaWdpdHMuICAqLwotICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSpwKSkKLQkrK3A7Ci0KLSAgICAgIGlmICgqcCAhPSAnXycpCi0Jc3VjY2VzcyA9IDA7Ci0KLSAgICAgICptYW5nbGVkID0gcCArIDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzEnOgotICAgIGNhc2UgJzInOgotICAgIGNhc2UgJzMnOgotICAgIGNhc2UgJzQnOgotICAgIGNhc2UgJzUnOgotICAgIGNhc2UgJzYnOgotICAgIGNhc2UgJzcnOgotICAgIGNhc2UgJzgnOgotICAgIGNhc2UgJzknOgotICAgICAgLyogVGhlIGNvdW50IGlzIGluIGEgc2luZ2xlIGRpZ2l0LiAgKi8KLSAgICAgIG51bVswXSA9ICgqbWFuZ2xlZClbMV07Ci0gICAgICBudW1bMV0gPSAnXDAnOwotICAgICAgcXVhbGlmaWVycyA9IGF0b2kgKG51bSk7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGlzIGFuIHVuZGVyc2NvcmUgYWZ0ZXIgdGhlIGRpZ2l0LCBza2lwIGl0LiAgVGhpcyBpcwotCSBzYWlkIHRvIGJlIGZvciBBUk0tcXVhbGlmaWVkIG5hbWVzLCBidXQgdGhlIEFSTSBtYWtlcyBubwotCSBtZW50aW9uIG9mIHN1Y2ggYW4gdW5kZXJzY29yZS4gIFBlcmhhcHMgY2Zyb250IHVzZXMgb25lLiAgKi8KLSAgICAgIGlmICgoKm1hbmdsZWQpWzJdID09ICdfJykKLQl7Ci0JICAoKm1hbmdsZWQpKys7Ci0JfQotICAgICAgKCptYW5nbGVkKSArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcwJzoKLSAgICBkZWZhdWx0OgotICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgfQotCi0gIGlmICghc3VjY2VzcykKLSAgICByZXR1cm4gc3VjY2VzczsKLQotICAvKiBQaWNrIG9mZiB0aGUgbmFtZXMgYW5kIGNvbGxlY3QgdGhlbSBpbiB0aGUgdGVtcCBidWZmZXIgaW4gdGhlIG9yZGVyCi0gICAgIGluIHdoaWNoIHRoZXkgYXJlIGZvdW5kLCBzZXBhcmF0ZWQgYnkgJzo6Jy4gICovCi0KLSAgd2hpbGUgKHF1YWxpZmllcnMtLSA+IDApCi0gICAgewotICAgICAgaW50IHJlbWVtYmVyX0sgPSAxOwotICAgICAgc3RyaW5nX2NsZWFyICgmbGFzdF9uYW1lKTsKLQotICAgICAgaWYgKCptYW5nbGVkWzBdID09ICdfJykKLQkoKm1hbmdsZWQpKys7Ci0KLSAgICAgIGlmICgqbWFuZ2xlZFswXSA9PSAndCcpCi0JewotCSAgLyogSGVyZSB3ZSBhbHdheXMgYXBwZW5kIHRvIFRFTVAgc2luY2Ugd2Ugd2lsbCB3YW50IHRvIHVzZQotCSAgICAgdGhlIHRlbXBsYXRlIG5hbWUgd2l0aG91dCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcyBhCi0JICAgICBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIG5hbWUuICBUaGUgYXBwcm9wcmlhdGUKLQkgICAgIChwYXJhbWV0ZXItbGVzcykgdmFsdWUgaXMgcmV0dXJuZWQgYnkgZGVtYW5nbGVfdGVtcGxhdGUKLQkgICAgIGluIExBU1RfTkFNRS4gIFdlIGRvIG5vdCByZW1lbWJlciB0aGUgdGVtcGxhdGUgdHlwZSBoZXJlLAotCSAgICAgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIEcrKyBtYW5nbGluZyBhbGdvcml0aG0uICAqLwotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlKHdvcmssIG1hbmdsZWQsICZ0ZW1wLAotCQkJCSAgICAgICZsYXN0X25hbWUsIDEsIDApOwotCSAgaWYgKCFzdWNjZXNzKQotCSAgICBicmVhazsKLQl9Ci0gICAgICBlbHNlIGlmICgqbWFuZ2xlZFswXSA9PSAnSycpCi0JewotICAgICAgICAgIGludCBpZHg7Ci0gICAgICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgICAgIGlkeCA9IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCk7Ci0gICAgICAgICAgaWYgKGlkeCA9PSAtMSB8fCBpZHggPj0gd29yay0+bnVtaykKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSAwOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0cmluZ19hcHBlbmQgKCZ0ZW1wLCB3b3JrLT5rdHlwZXZlY1tpZHhdKTsKLSAgICAgICAgICByZW1lbWJlcl9LID0gMDsKLQotCSAgaWYgKCFzdWNjZXNzKSBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKEVER19ERU1BTkdMSU5HKQotICAgICAgICAgICAgewotCSAgICAgIGludCBuYW1lbGVuZ3RoOwotIAkgICAgICAvKiBOb3cgcmVjdXJzaXZlbHkgZGVtYW5nbGUgdGhlIHF1YWxpZmllcgotIAkgICAgICAgKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBkZWFsIHdpdGggdGVtcGxhdGVzIGluCi0gCSAgICAgICAqIG1hbmdsaW5nIHN0eWxlcyBsaWtlIEVERyAqLwotCSAgICAgIG5hbWVsZW5ndGggPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLQkgICAgICBpZiAobmFtZWxlbmd0aCA9PSAtMSkKLQkJewotCQkgIHN1Y2Nlc3MgPSAwOwotCQkgIGJyZWFrOwotCQl9Ci0gCSAgICAgIHJlY3Vyc2l2ZWx5X2RlbWFuZ2xlKHdvcmssIG1hbmdsZWQsICZ0ZW1wLCBuYW1lbGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmbGFzdF9uYW1lKTsKLSAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBzdHJpbmdfYXBwZW5kcyAoJnRlbXAsICZsYXN0X25hbWUpOwotICAgICAgICAgICAgfQotCX0KLQotICAgICAgaWYgKHJlbWVtYmVyX0spCi0JcmVtZW1iZXJfS3R5cGUgKHdvcmssIHRlbXAuYiwgTEVOX1NUUklORyAoJnRlbXApKTsKLQotICAgICAgaWYgKHF1YWxpZmllcnMgPiAwKQotCXN0cmluZ19hcHBlbmQgKCZ0ZW1wLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLSAgICB9Ci0KLSAgcmVtZW1iZXJfQnR5cGUgKHdvcmssIHRlbXAuYiwgTEVOX1NUUklORyAoJnRlbXApLCBiaW5kZXgpOwotCi0gIC8qIElmIHdlIGFyZSB1c2luZyB0aGUgcmVzdWx0IGFzIGEgZnVuY3Rpb24gbmFtZSwgd2UgbmVlZCB0byBhcHBlbmQKLSAgICAgdGhlIGFwcHJvcHJpYXRlICc6Oicgc2VwYXJhdGVkIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgbmFtZS4KLSAgICAgV2UgZG8gdGhpcyBoZXJlIGJlY2F1c2UgdGhpcyBpcyB0aGUgbW9zdCBjb252ZW5pZW50IHBsYWNlLCB3aGVyZQotICAgICB3ZSBhbHJlYWR5IGhhdmUgYSBwb2ludGVyIHRvIHRoZSBuYW1lIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBuYW1lLiAgKi8KLQotICBpZiAoaXNmdW5jbmFtZSkKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kICgmdGVtcCwgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0gICAgICBpZiAod29yayAtPiBkZXN0cnVjdG9yICYgMSkKLQlzdHJpbmdfYXBwZW5kICgmdGVtcCwgIn4iKTsKLSAgICAgIHN0cmluZ19hcHBlbmRzICgmdGVtcCwgJmxhc3RfbmFtZSk7Ci0gICAgfQotCi0gIC8qIE5vdyBlaXRoZXIgcHJlcGVuZCB0aGUgdGVtcCBidWZmZXIgdG8gdGhlIHJlc3VsdCwgb3IgYXBwZW5kIGl0LAotICAgICBkZXBlbmRpbmcgdXBvbiB0aGUgc3RhdGUgb2YgdGhlIGFwcGVuZCBmbGFnLiAgKi8KLQotICBpZiAoYXBwZW5kKQotICAgIHN0cmluZ19hcHBlbmRzIChyZXN1bHQsICZ0ZW1wKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghU1RSSU5HX0VNUFRZIChyZXN1bHQpKQotCXN0cmluZ19hcHBlbmQgKCZ0ZW1wLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLSAgICAgIHN0cmluZ19wcmVwZW5kcyAocmVzdWx0LCAmdGVtcCk7Ci0gICAgfQotCi0gIHN0cmluZ19kZWxldGUgKCZsYXN0X25hbWUpOwotICBzdHJpbmdfZGVsZXRlICgmdGVtcCk7Ci0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLS8qCi0KLUxPQ0FMIEZVTkNUSU9OCi0KLQlnZXRfY291bnQgLS0gY29udmVydCBhbiBhc2NpaSBjb3VudCB0byBpbnRlZ2VyLCBjb25zdW1pbmcgdG9rZW5zCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgaW50Ci0JZ2V0X2NvdW50IChjb25zdCBjaGFyICoqdHlwZSwgaW50ICpjb3VudCkKLQotREVTQ1JJUFRJT04KLQotCUFzc3VtZSB0aGF0ICp0eXBlIHBvaW50cyBhdCBhIGNvdW50IGluIGEgbWFuZ2xlZCBuYW1lOyBzZXQKLQkqY291bnQgdG8gaXRzIHZhbHVlLCBhbmQgc2V0ICp0eXBlIHRvIHRoZSBuZXh0IGNoYXJhY3RlciBhZnRlcgotCXRoZSBjb3VudC4gIFRoZXJlIGFyZSBzb21lIHdlaXJkIHJ1bGVzIGluIGVmZmVjdCBoZXJlLgotCi0JSWYgKnR5cGUgZG9lcyBub3QgcG9pbnQgYXQgYSBzdHJpbmcgb2YgZGlnaXRzLCByZXR1cm4gemVyby4KLQotCUlmICp0eXBlIHBvaW50cyBhdCBhIHN0cmluZyBvZiBkaWdpdHMgZm9sbG93ZWQgYnkgYW4KLQl1bmRlcnNjb3JlLCBzZXQgKmNvdW50IHRvIHRoZWlyIHZhbHVlIGFzIGFuIGludGVnZXIsIGFkdmFuY2UKLQkqdHlwZSB0byBwb2ludCAqYWZ0ZXIgdGhlIHVuZGVyc2NvcmUsIGFuZCByZXR1cm4gMS4KLQotCUlmICp0eXBlIHBvaW50cyBhdCBhIHN0cmluZyBvZiBkaWdpdHMgbm90IGZvbGxvd2VkIGJ5IGFuCi0JdW5kZXJzY29yZSwgY29uc3VtZSBvbmx5IHRoZSBmaXJzdCBkaWdpdC4gIFNldCAqY291bnQgdG8gaXRzCi0JdmFsdWUgYXMgYW4gaW50ZWdlciwgbGVhdmUgKnR5cGUgcG9pbnRpbmcgYWZ0ZXIgdGhhdCBkaWdpdCwKLQlhbmQgcmV0dXJuIDEuCi0KLSAgICAgICAgVGhlIGV4Y3VzZSBmb3IgdGhpcyBvZGQgYmVoYXZpb3I6IGluIHRoZSBBUk0gYW5kIEhQIGRlbWFuZ2xpbmcKLSAgICAgICAgc3R5bGVzLCBhIHR5cGUgY2FuIGJlIGZvbGxvd2VkIGJ5IGEgcmVwZWF0IGNvdW50IG9mIHRoZSBmb3JtCi0gICAgICAgIGBOeHknLCB3aGVyZToKLQotICAgICAgICBgeCcgaXMgYSBzaW5nbGUgZGlnaXQgc3BlY2lmeWluZyBob3cgbWFueSBhZGRpdGlvbmFsIGNvcGllcwotICAgICAgICAgICAgb2YgdGhlIHR5cGUgdG8gYXBwZW5kIHRvIHRoZSBhcmd1bWVudCBsaXN0LCBhbmQKLQotICAgICAgICBgeScgaXMgb25lIG9yIG1vcmUgZGlnaXRzLCBzcGVjaWZ5aW5nIHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mCi0gICAgICAgICAgICB0aGUgZmlyc3QgcmVwZWF0ZWQgYXJndW1lbnQgaW4gdGhlIGxpc3QuICBZZXMsIGFzIHlvdSdyZQotICAgICAgICAgICAgdW5tYW5nbGluZyB0aGUgbmFtZSB5b3UgY2FuIGZpZ3VyZSB0aGlzIG91dCB5b3Vyc2VsZiwgYnV0Ci0gICAgICAgICAgICBpdCdzIHRoZXJlIGFueXdheS4KLQotICAgICAgICBTbywgZm9yIGV4YW1wbGUsIGluIGBiYXJfXzNmb29GUGlONTEnLCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYQotICAgICAgICBwb2ludGVyIHRvIGFuIGludGVnZXIgKGBQaScpLCBhbmQgdGhlbiB0aGUgbmV4dCBmaXZlIGFyZ3VtZW50cwotICAgICAgICBhcmUgdGhlIHNhbWUgKGBONScpLCBhbmQgdGhlIGZpcnN0IHJlcGVhdCBpcyB0aGUgZnVuY3Rpb24ncwotICAgICAgICBzZWNvbmQgYXJndW1lbnQgKGAxJykuCi0qLwotCi1zdGF0aWMgaW50Ci1nZXRfY291bnQgKHR5cGUsIGNvdW50KQotICAgICBjb25zdCBjaGFyICoqdHlwZTsKLSAgICAgaW50ICpjb3VudDsKLXsKLSAgY29uc3QgY2hhciAqcDsKLSAgaW50IG47Ci0KLSAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKnR5cGUpKQotICAgIHsKLSAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKmNvdW50ID0gKip0eXBlIC0gJzAnOwotICAgICAgKCp0eXBlKSsrOwotICAgICAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqdHlwZSkpCi0JewotCSAgcCA9ICp0eXBlOwotCSAgbiA9ICpjb3VudDsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBuICo9IDEwOwotCSAgICAgIG4gKz0gKnAgLSAnMCc7Ci0JICAgICAgcCsrOwotCSAgICB9Ci0JICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKnApKTsKLQkgIGlmICgqcCA9PSAnXycpCi0JICAgIHsKLQkgICAgICAqdHlwZSA9IHAgKyAxOwotCSAgICAgICpjb3VudCA9IG47Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gKDEpOwotfQotCi0vKiBSRVNVTFQgd2lsbCBiZSBpbml0aWFsaXNlZCBoZXJlOyBpdCB3aWxsIGJlIGZyZWVkIG9uIGZhaWx1cmUuICBUaGUKLSAgIHZhbHVlIHJldHVybmVkIGlzIHJlYWxseSBhIHR5cGVfa2luZF90LiAgKi8KLQotc3RhdGljIGludAotZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgcmVzdWx0KQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqcmVzdWx0OwotewotICBpbnQgbjsKLSAgaW50IGRvbmU7Ci0gIGludCBzdWNjZXNzOwotICBzdHJpbmcgZGVjbDsKLSAgY29uc3QgY2hhciAqcmVtZW1iZXJlZF90eXBlOwotICBpbnQgdHlwZV9xdWFsczsKLSAgc3RyaW5nIGJ0eXBlOwotICB0eXBlX2tpbmRfdCB0ayA9IHRrX25vbmU7Ci0KLSAgc3RyaW5nX2luaXQgKCZidHlwZSk7Ci0gIHN0cmluZ19pbml0ICgmZGVjbCk7Ci0gIHN0cmluZ19pbml0IChyZXN1bHQpOwotCi0gIGRvbmUgPSAwOwotICBzdWNjZXNzID0gMTsKLSAgd2hpbGUgKHN1Y2Nlc3MgJiYgIWRvbmUpCi0gICAgewotICAgICAgaW50IG1lbWJlcjsKLSAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQotCXsKLQotCSAgLyogQSBwb2ludGVyIHR5cGUgKi8KLQljYXNlICdQJzoKLQljYXNlICdwJzoKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIGlmICghICh3b3JrIC0+IG9wdGlvbnMgJiBETUdMX0pBVkEpKQotCSAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICIqIik7Ci0JICBpZiAodGsgPT0gdGtfbm9uZSkKLQkgICAgdGsgPSB0a19wb2ludGVyOwotCSAgYnJlYWs7Ci0KLQkgIC8qIEEgcmVmZXJlbmNlIHR5cGUgKi8KLQljYXNlICdSJzoKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgIiYiKTsKLQkgIGlmICh0ayA9PSB0a19ub25lKQotCSAgICB0ayA9IHRrX3JlZmVyZW5jZTsKLQkgIGJyZWFrOwotCi0JICAvKiBBbiBhcnJheSAqLwotCWNhc2UgJ0EnOgotCSAgewotCSAgICArKygqbWFuZ2xlZCk7Ci0JICAgIGlmICghU1RSSU5HX0VNUFRZICgmZGVjbCkKLQkJJiYgKGRlY2wuYlswXSA9PSAnKicgfHwgZGVjbC5iWzBdID09ICcmJykpCi0JICAgICAgewotCQlzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICIoIik7Ci0JCXN0cmluZ19hcHBlbmQgKCZkZWNsLCAiKSIpOwotCSAgICAgIH0KLQkgICAgc3RyaW5nX2FwcGVuZCAoJmRlY2wsICJbIik7Ci0JICAgIGlmICgqKm1hbmdsZWQgIT0gJ18nKQotCSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtICh3b3JrLCBtYW5nbGVkLCAmZGVjbCwKLQkJCQkJCSAgICAgIHRrX2ludGVncmFsKTsKLQkgICAgaWYgKCoqbWFuZ2xlZCA9PSAnXycpCi0JICAgICAgKysoKm1hbmdsZWQpOwotCSAgICBzdHJpbmdfYXBwZW5kICgmZGVjbCwgIl0iKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQkvKiBBIGJhY2sgcmVmZXJlbmNlIHRvIGEgcHJldmlvdXNseSBzZWVuIHR5cGUgKi8KLQljYXNlICdUJzoKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIGlmICghZ2V0X2NvdW50IChtYW5nbGVkLCAmbikgfHwgbiA+PSB3b3JrIC0+IG50eXBlcykKLQkgICAgewotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZW1lbWJlcmVkX3R5cGUgPSB3b3JrIC0+IHR5cGV2ZWNbbl07Ci0JICAgICAgbWFuZ2xlZCA9ICZyZW1lbWJlcmVkX3R5cGU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JICAvKiBBIGZ1bmN0aW9uICovCi0JY2FzZSAnRic6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICAgIGlmICghU1RSSU5HX0VNUFRZICgmZGVjbCkKLQkJJiYgKGRlY2wuYlswXSA9PSAnKicgfHwgZGVjbC5iWzBdID09ICcmJykpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICIoIik7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAoJmRlY2wsICIpIik7Ci0JICAgIH0KLQkgIC8qIEFmdGVyIHBpY2tpbmcgb2ZmIHRoZSBmdW5jdGlvbiBhcmdzLCB3ZSBleHBlY3QgdG8gZWl0aGVyIGZpbmQgdGhlCi0JICAgICBmdW5jdGlvbiByZXR1cm4gdHlwZSAocHJlY2VkZWQgYnkgYW4gJ18nKSBvciB0aGUgZW5kIG9mIHRoZQotCSAgICAgc3RyaW5nLiAgKi8KLQkgIGlmICghZGVtYW5nbGVfbmVzdGVkX2FyZ3MgKHdvcmssIG1hbmdsZWQsICZkZWNsKQotCSAgICAgIHx8ICgqKm1hbmdsZWQgIT0gJ18nICYmICoqbWFuZ2xlZCAhPSAnXDAnKSkKLQkgICAgewotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAoc3VjY2VzcyAmJiAoKiptYW5nbGVkID09ICdfJykpCi0JICAgICgqbWFuZ2xlZCkrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnTSc6Ci0JY2FzZSAnTyc6Ci0JICB7Ci0JICAgIHR5cGVfcXVhbHMgPSBUWVBFX1VOUVVBTElGSUVEOwotCi0JICAgIG1lbWJlciA9ICoqbWFuZ2xlZCA9PSAnTSc7Ci0JICAgICgqbWFuZ2xlZCkrKzsKLQkgICAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpICYmICoqbWFuZ2xlZCAhPSAndCcpCi0JICAgICAgewotCQlzdWNjZXNzID0gMDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIHN0cmluZ19hcHBlbmQgKCZkZWNsLCAiKSIpOwotCSAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsIFNDT1BFX1NUUklORyAod29yaykpOwotCSAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLQkgICAgICB7Ci0JCW4gPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLQkJaWYgKG4gPT0gLTEKLQkJICAgIHx8IChpbnQpIHN0cmxlbiAoKm1hbmdsZWQpIDwgbikKLQkJICB7Ci0JCSAgICBzdWNjZXNzID0gMDsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJc3RyaW5nX3ByZXBlbmRuICgmZGVjbCwgKm1hbmdsZWQsIG4pOwotCQkqbWFuZ2xlZCArPSBuOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc3RyaW5nIHRlbXA7Ci0JCXN0cmluZ19pbml0ICgmdGVtcCk7Ci0JCXN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgJnRlbXAsCi0JCQkJCSAgICAgTlVMTCwgMSwgMSk7Ci0JCWlmIChzdWNjZXNzKQotCQkgIHsKLQkJICAgIHN0cmluZ19wcmVwZW5kbiAoJmRlY2wsIHRlbXAuYiwgdGVtcC5wIC0gdGVtcC5iKTsKLQkJICAgIHN0cmluZ19jbGVhciAoJnRlbXApOwotCQkgIH0KLQkJZWxzZQotCQkgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiKCIpOwotCSAgICBpZiAobWVtYmVyKQotCSAgICAgIHsKLQkJc3dpdGNoICgqKm1hbmdsZWQpCi0JCSAgewotCQkgIGNhc2UgJ0MnOgotCQkgIGNhc2UgJ1YnOgotCQkgIGNhc2UgJ3UnOgotCQkgICAgdHlwZV9xdWFscyB8PSBjb2RlX2Zvcl9xdWFsaWZpZXIgKCoqbWFuZ2xlZCk7Ci0JCSAgICAoKm1hbmdsZWQpKys7Ci0JCSAgICBicmVhazsKLQotCQkgIGRlZmF1bHQ6Ci0JCSAgICBicmVhazsKLQkJICB9Ci0KLQkJaWYgKCooKm1hbmdsZWQpKysgIT0gJ0YnKQotCQkgIHsKLQkJICAgIHN1Y2Nlc3MgPSAwOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgaWYgKChtZW1iZXIgJiYgIWRlbWFuZ2xlX25lc3RlZF9hcmdzICh3b3JrLCBtYW5nbGVkLCAmZGVjbCkpCi0JCXx8ICoqbWFuZ2xlZCAhPSAnXycpCi0JICAgICAgewotCQlzdWNjZXNzID0gMDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICAoKm1hbmdsZWQpKys7Ci0JICAgIGlmICghIFBSSU5UX0FOU0lfUVVBTElGSUVSUykKLQkgICAgICB7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgaWYgKHR5cGVfcXVhbHMgIT0gVFlQRV9VTlFVQUxJRklFRCkKLQkgICAgICB7Ci0JCUFQUEVORF9CTEFOSyAoJmRlY2wpOwotCQlzdHJpbmdfYXBwZW5kICgmZGVjbCwgcXVhbGlmaWVyX3N0cmluZyAodHlwZV9xdWFscykpOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgICAgIGNhc2UgJ0cnOgotCSAgKCptYW5nbGVkKSsrOwotCSAgYnJlYWs7Ci0KLQljYXNlICdDJzoKLQljYXNlICdWJzoKLQljYXNlICd1JzoKLQkgIGlmIChQUklOVF9BTlNJX1FVQUxJRklFUlMpCi0JICAgIHsKLQkgICAgICBpZiAoIVNUUklOR19FTVBUWSAoJmRlY2wpKQotCQlzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICIgIik7Ci0KLQkgICAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsIGRlbWFuZ2xlX3F1YWxpZmllciAoKiptYW5nbGVkKSk7Ci0JICAgIH0KLQkgICgqbWFuZ2xlZCkrKzsKLQkgIGJyZWFrOwotCSAgLyoKLQkgICAgfQotCSAgICAqLwotCi0JICAvKiBmYWxsIHRocm91Z2ggKi8KLQlkZWZhdWx0OgotCSAgZG9uZSA9IDE7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChzdWNjZXNzKSBzd2l0Y2ggKCoqbWFuZ2xlZCkKLSAgICB7Ci0gICAgICAvKiBBIHF1YWxpZmllZCBuYW1lLCBzdWNoIGFzICJPdXRlcjo6SW5uZXIiLiAgKi8KLSAgICBjYXNlICdRJzoKLSAgICBjYXNlICdLJzoKLSAgICAgIHsKLSAgICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX3F1YWxpZmllZCAod29yaywgbWFuZ2xlZCwgcmVzdWx0LCAwLCAxKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAvKiBBIGJhY2sgcmVmZXJlbmNlIHRvIGEgcHJldmlvdXNseSBzZWVuIHNxdWFuZ2xlZCB0eXBlICovCi0gICAgY2FzZSAnQic6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBpZiAoIWdldF9jb3VudCAobWFuZ2xlZCwgJm4pIHx8IG4gPj0gd29yayAtPiBudW1iKQotCXN1Y2Nlc3MgPSAwOwotICAgICAgZWxzZQotCXN0cmluZ19hcHBlbmQgKHJlc3VsdCwgd29yay0+YnR5cGV2ZWNbbl0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdYJzoKLSAgICBjYXNlICdZJzoKLSAgICAgIC8qIEEgdGVtcGxhdGUgcGFybS4gIFdlIHN1YnN0aXR1dGUgdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQuICovCi0gICAgICB7Ci0JaW50IGlkeDsKLQotCSgqbWFuZ2xlZCkrKzsKLQlpZHggPSBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpOwotCi0JaWYgKGlkeCA9PSAtMQotCSAgICB8fCAod29yay0+dG1wbF9hcmd2ZWMgJiYgaWR4ID49IHdvcmstPm50bXBsX2FyZ3MpCi0JICAgIHx8IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCkgPT0gLTEpCi0JICB7Ci0JICAgIHN1Y2Nlc3MgPSAwOwotCSAgICBicmVhazsKLQkgIH0KLQotCWlmICh3b3JrLT50bXBsX2FyZ3ZlYykKLQkgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgd29yay0+dG1wbF9hcmd2ZWNbaWR4XSk7Ci0JZWxzZQotCSAgewotCSAgICBjaGFyIGJ1ZlsxMF07Ci0JICAgIHNwcmludGYoYnVmLCAiVCVkIiwgaWR4KTsKLQkgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCBidWYpOwotCSAgfQotCi0Jc3VjY2VzcyA9IDE7Ci0gICAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX2Z1bmRfdHlwZSAod29yaywgbWFuZ2xlZCwgcmVzdWx0KTsKLSAgICAgIGlmICh0ayA9PSB0a19ub25lKQotCXRrID0gKHR5cGVfa2luZF90KSBzdWNjZXNzOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChzdWNjZXNzKQotICAgIHsKLSAgICAgIGlmICghU1RSSU5HX0VNUFRZICgmZGVjbCkpCi0JewotCSAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiICIpOwotCSAgc3RyaW5nX2FwcGVuZHMgKHJlc3VsdCwgJmRlY2wpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBzdHJpbmdfZGVsZXRlIChyZXN1bHQpOwotICBzdHJpbmdfZGVsZXRlICgmZGVjbCk7Ci0KLSAgaWYgKHN1Y2Nlc3MpCi0gICAgLyogQXNzdW1lIGFuIGludGVncmFsIHR5cGUsIGlmIHdlJ3JlIG5vdCBzdXJlLiAgKi8KLSAgICByZXR1cm4gKGludCkgKCh0ayA9PSB0a19ub25lKSA/IHRrX2ludGVncmFsIDogdGspOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEdpdmVuIGEgcG9pbnRlciB0byBhIHR5cGUgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhIGZ1bmRhbWVudGFsIHR5cGUKLSAgIGFyZ3VtZW50IChpbnQsIGxvbmcsIHVuc2lnbmVkIGludCwgZXRjKSBpbiBUWVBFLCBhIHBvaW50ZXIgdG8gdGhlCi0gICBzdHJpbmcgaW4gd2hpY2ggdGhlIGRlbWFuZ2xlZCBvdXRwdXQgaXMgYmVpbmcgYnVpbHQgaW4gUkVTVUxULCBhbmQKLSAgIHRoZSBXT1JLIHN0cnVjdHVyZSwgZGVjb2RlIHRoZSB0eXBlcyBhbmQgYWRkIHRoZW0gdG8gdGhlIHJlc3VsdC4KLQotICAgRm9yIGV4YW1wbGU6Ci0KLSAgIAkiQ2kiCT0+CSJjb25zdCBpbnQiCi0JIlNsIgk9Pgkic2lnbmVkIGxvbmciCi0JIkNVcyIJPT4JImNvbnN0IHVuc2lnbmVkIHNob3J0IgotCi0gICBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgcmVhbGx5IGEgdHlwZV9raW5kX3QuICAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9mdW5kX3R5cGUgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnJlc3VsdDsKLXsKLSAgaW50IGRvbmUgPSAwOwotICBpbnQgc3VjY2VzcyA9IDE7Ci0gIGNoYXIgYnVmWzEwXTsKLSAgaW50IGRlYyA9IDA7Ci0gIHN0cmluZyBidHlwZTsKLSAgdHlwZV9raW5kX3QgdGsgPSB0a19pbnRlZ3JhbDsKLQotICBzdHJpbmdfaW5pdCAoJmJ0eXBlKTsKLQotICAvKiBGaXJzdCBwaWNrIG9mZiBhbnkgdHlwZSBxdWFsaWZpZXJzLiAgVGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUuICAqLwotCi0gIHdoaWxlICghZG9uZSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCoqbWFuZ2xlZCkKLQl7Ci0JY2FzZSAnQyc6Ci0JY2FzZSAnVic6Ci0JY2FzZSAndSc6Ci0JICBpZiAoUFJJTlRfQU5TSV9RVUFMSUZJRVJTKQotCSAgICB7Ci0gICAgICAgICAgICAgIGlmICghU1RSSU5HX0VNUFRZIChyZXN1bHQpKQotICAgICAgICAgICAgICAgIHN0cmluZ19wcmVwZW5kIChyZXN1bHQsICIgIik7Ci0JICAgICAgc3RyaW5nX3ByZXBlbmQgKHJlc3VsdCwgZGVtYW5nbGVfcXVhbGlmaWVyICgqKm1hbmdsZWQpKTsKLQkgICAgfQotCSAgKCptYW5nbGVkKSsrOwotCSAgYnJlYWs7Ci0JY2FzZSAnVSc6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0JICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJ1bnNpZ25lZCIpOwotCSAgYnJlYWs7Ci0JY2FzZSAnUyc6IC8qIHNpZ25lZCBjaGFyIG9ubHkgKi8KLQkgICgqbWFuZ2xlZCkrKzsKLQkgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLQkgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgInNpZ25lZCIpOwotCSAgYnJlYWs7Ci0JY2FzZSAnSic6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0JICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJfX2NvbXBsZXgiKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBkb25lID0gMTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IHBpY2sgb2ZmIHRoZSBmdW5kYW1lbnRhbCB0eXBlLiAgVGhlcmUgY2FuIGJlIG9ubHkgb25lLiAgKi8KLQotICBzd2l0Y2ggKCoqbWFuZ2xlZCkKLSAgICB7Ci0gICAgY2FzZSAnXDAnOgotICAgIGNhc2UgJ18nOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndic6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJ2b2lkIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICd4JzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImxvbmcgbG9uZyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnbCc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJsb25nIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdpJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImludCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncyc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJzaG9ydCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYic6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJib29sIik7Ci0gICAgICB0ayA9IHRrX2Jvb2w7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdjJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImNoYXIiKTsKLSAgICAgIHRrID0gdGtfY2hhcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3cnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAid2NoYXJfdCIpOwotICAgICAgdGsgPSB0a19jaGFyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncic6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJsb25nIGRvdWJsZSIpOwotICAgICAgdGsgPSB0a19yZWFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJkb3VibGUiKTsKLSAgICAgIHRrID0gdGtfcmVhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2YnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiZmxvYXQiKTsKLSAgICAgIHRrID0gdGtfcmVhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0cnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCXsKLQkgIHN1Y2Nlc3MgPSAwOwotCSAgYnJlYWs7Ci0JfQotICAgIGNhc2UgJ0knOgotICAgICAgKysoKm1hbmdsZWQpOwotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnXycpCi0JewotCSAgaW50IGk7Ci0JICArKygqbWFuZ2xlZCk7Ci0JICBmb3IgKGkgPSAwOwotCSAgICAgICAoaSA8IHNpemVvZiAoYnVmKSAtIDEgJiYgKiptYW5nbGVkICYmICoqbWFuZ2xlZCAhPSAnXycpOwotCSAgICAgICArKygqbWFuZ2xlZCksICsraSkKLQkgICAgYnVmW2ldID0gKiptYW5nbGVkOwotCSAgaWYgKCoqbWFuZ2xlZCAhPSAnXycpCi0JICAgIHsKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgYnVmW2ldID0gJ1wwJzsKLQkgICsrKCptYW5nbGVkKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RybmNweSAoYnVmLCAqbWFuZ2xlZCwgMik7Ci0JICBidWZbMl0gPSAnXDAnOwotCSAgKm1hbmdsZWQgKz0gMjsKLQl9Ci0gICAgICBzc2NhbmYgKGJ1ZiwgIiV4IiwgJmRlYyk7Ci0gICAgICBzcHJpbnRmIChidWYsICJpbnQlaV90IiwgZGVjKTsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgYnVmKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIC8qIEFuIGV4cGxpY2l0IHR5cGUsIHN1Y2ggYXMgIjZteXR5cGUiIG9yICI3aW50ZWdlciIgKi8KLSAgICBjYXNlICcwJzoKLSAgICBjYXNlICcxJzoKLSAgICBjYXNlICcyJzoKLSAgICBjYXNlICczJzoKLSAgICBjYXNlICc0JzoKLSAgICBjYXNlICc1JzoKLSAgICBjYXNlICc2JzoKLSAgICBjYXNlICc3JzoKLSAgICBjYXNlICc4JzoKLSAgICBjYXNlICc5JzoKLSAgICAgIHsKLSAgICAgICAgaW50IGJpbmRleCA9IHJlZ2lzdGVyX0J0eXBlICh3b3JrKTsKLSAgICAgICAgc3RyaW5nIGJ0eXBlOwotICAgICAgICBzdHJpbmdfaW5pdCAoJmJ0eXBlKTsKLSAgICAgICAgaWYgKGRlbWFuZ2xlX2NsYXNzX25hbWUgKHdvcmssIG1hbmdsZWQsICZidHlwZSkpIHsKLSAgICAgICAgICByZW1lbWJlcl9CdHlwZSAod29yaywgYnR5cGUuYiwgTEVOX1NUUklORyAoJmJ0eXBlKSwgYmluZGV4KTsKLSAgICAgICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICAgICAgc3RyaW5nX2FwcGVuZHMgKHJlc3VsdCwgJmJ0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgICAgIHN0cmluZ19kZWxldGUgKCZidHlwZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIGNhc2UgJ3QnOgotICAgICAgewotICAgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsICZidHlwZSwgMCwgMSwgMSk7Ci0gICAgICAgIHN0cmluZ19hcHBlbmRzIChyZXN1bHQsICZidHlwZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBzdWNjZXNzID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gc3VjY2VzcyA/ICgoaW50KSB0aykgOiAwOwotfQotCi0KLS8qIEhhbmRsZSBhIHRlbXBsYXRlJ3MgdmFsdWUgcGFyYW1ldGVyIGZvciBIUCBhQ0MgKGV4dGVuc2lvbiBmcm9tIEFSTSkKLSAgICoqbWFuZ2xlZCBwb2ludHMgdG8gJ1MnIG9yICdVJyAqLwotCi1zdGF0aWMgaW50Ci1kb19ocGFjY190ZW1wbGF0ZV9jb25zdF92YWx1ZSAod29yaywgbWFuZ2xlZCwgcmVzdWx0KQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqcmVzdWx0OwotewotICBpbnQgdW5zaWduZWRfY29uc3Q7Ci0KLSAgaWYgKCoqbWFuZ2xlZCAhPSAnVScgJiYgKiptYW5nbGVkICE9ICdTJykKLSAgICByZXR1cm4gMDsKLQotICB1bnNpZ25lZF9jb25zdCA9ICgqKm1hbmdsZWQgPT0gJ1UnKTsKLQotICAoKm1hbmdsZWQpKys7Ci0KLSAgc3dpdGNoICgqKm1hbmdsZWQpCi0gICAgewotICAgICAgY2FzZSAnTic6Ci0gICAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIi0iKTsKLSAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlICdQJzoKLSAgICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ00nOgotICAgICAgICAvKiBzcGVjaWFsIGNhc2UgZm9yIC0yXjMxICovCi0gICAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIi0yMTQ3NDgzNjQ4Iik7Ci0gICAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogV2UgaGF2ZSB0byBiZSBsb29raW5nIGF0IGFuIGludGVnZXIgbm93ICovCi0gIGlmICghKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpKQotICAgIHJldHVybiAwOwotCi0gIC8qIFdlIG9ubHkgZGVhbCB3aXRoIGludGVncmFsIHZhbHVlcyBmb3IgdGVtcGxhdGUKLSAgICAgcGFyYW1ldGVycyAtLSBzbyBpdCdzIE9LIHRvIGxvb2sgb25seSBmb3IgZGlnaXRzICovCi0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotICAgIHsKLSAgICAgIGNoYXJfc3RyWzBdID0gKiptYW5nbGVkOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCBjaGFyX3N0cik7Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgfQotCi0gIGlmICh1bnNpZ25lZF9jb25zdCkKLSAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJVIik7Ci0KLSAgLyogRklYTUU/IFNvbWUgZGF5IHdlIG1heSBoYXZlIDY0LWJpdCAob3IgbGFyZ2VyIDotKSApIGNvbnN0YW50cwotICAgICB3aXRoIEwgb3IgTEwgc3VmZml4ZXMuIHBhaS8xOTk3LTA5LTAzICovCi0KLSAgcmV0dXJuIDE7IC8qIHN1Y2Nlc3MgKi8KLX0KLQotLyogSGFuZGxlIGEgdGVtcGxhdGUncyBsaXRlcmFsIHBhcmFtZXRlciBmb3IgSFAgYUNDIChleHRlbnNpb24gZnJvbSBBUk0pCi0gICAqKm1hbmdsZWQgaXMgcG9pbnRpbmcgdG8gdGhlICdBJyAqLwotCi1zdGF0aWMgaW50Ci1kb19ocGFjY190ZW1wbGF0ZV9saXRlcmFsICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpyZXN1bHQ7Ci17Ci0gIGludCBsaXRlcmFsX2xlbiA9IDA7Ci0gIGNoYXIgKiByZWN1cnNlOwotICBjaGFyICogcmVjdXJzZV9kZW07Ci0KLSAgaWYgKCoqbWFuZ2xlZCAhPSAnQScpCi0gICAgcmV0dXJuIDA7Ci0KLSAgKCptYW5nbGVkKSsrOwotCi0gIGxpdGVyYWxfbGVuID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0KLSAgaWYgKGxpdGVyYWxfbGVuIDw9IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogTGl0ZXJhbCBwYXJhbWV0ZXJzIGFyZSBuYW1lcyBvZiBhcnJheXMsIGZ1bmN0aW9ucywgZXRjLiAgYW5kIHRoZQotICAgICBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gdXNlcyB0aGUgYWRkcmVzcyBvcGVyYXRvciAqLwotICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICImIik7Ci0KLSAgLyogTm93IHJlY3Vyc2l2ZWx5IGRlbWFuZ2xlIHRoZSBsaXRlcmFsIG5hbWUgKi8KLSAgcmVjdXJzZSA9IChjaGFyICopIHhtYWxsb2MgKGxpdGVyYWxfbGVuICsgMSk7Ci0gIG1lbWNweSAocmVjdXJzZSwgKm1hbmdsZWQsIGxpdGVyYWxfbGVuKTsKLSAgcmVjdXJzZVtsaXRlcmFsX2xlbl0gPSAnXDAwMCc7Ci0KLSAgcmVjdXJzZV9kZW0gPSBjcGx1c19kZW1hbmdsZSAocmVjdXJzZSwgd29yay0+b3B0aW9ucyk7Ci0KLSAgaWYgKHJlY3Vyc2VfZGVtKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgcmVjdXJzZV9kZW0pOwotICAgICAgZnJlZSAocmVjdXJzZV9kZW0pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmRuIChyZXN1bHQsICptYW5nbGVkLCBsaXRlcmFsX2xlbik7Ci0gICAgfQotICAoKm1hbmdsZWQpICs9IGxpdGVyYWxfbGVuOwotICBmcmVlIChyZWN1cnNlKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotc25hcmZfbnVtZXJpY19saXRlcmFsIChhcmdzLCBhcmcpCi0gICAgIGNvbnN0IGNoYXIgKiogYXJnczsKLSAgICAgc3RyaW5nICogYXJnOwotewotICBpZiAoKiphcmdzID09ICctJykKLSAgICB7Ci0gICAgICBjaGFyX3N0clswXSA9ICctJzsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGFyZywgY2hhcl9zdHIpOwotICAgICAgKCphcmdzKSsrOwotICAgIH0KLSAgZWxzZSBpZiAoKiphcmdzID09ICcrJykKLSAgICAoKmFyZ3MpKys7Ci0KLSAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKmFyZ3MpKQotICAgIHJldHVybiAwOwotCi0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKmFyZ3MpKQotICAgIHsKLSAgICAgIGNoYXJfc3RyWzBdID0gKiphcmdzOwotICAgICAgc3RyaW5nX2FwcGVuZCAoYXJnLCBjaGFyX3N0cik7Ci0gICAgICAoKmFyZ3MpKys7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBEZW1hbmdsZSB0aGUgbmV4dCBhcmd1bWVudCwgZ2l2ZW4gYnkgTUFOR0xFRCBpbnRvIFJFU1VMVCwgd2hpY2gKLSAgICpzaG91bGQgYmUgYW4gdW5pbml0aWFsaXplZCogc3RyaW5nLiAgSXQgd2lsbCBiZSBpbml0aWFsaXplZCBoZXJlLAotICAgYW5kIGZyZWUnZCBzaG91bGQgYW55dGhpbmcgZ28gd3JvbmcuICAqLwotCi1zdGF0aWMgaW50Ci1kb19hcmcgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnJlc3VsdDsKLXsKLSAgLyogUmVtZW1iZXIgd2hlcmUgd2Ugc3RhcnRlZCBzbyB0aGF0IHdlIGNhbiByZWNvcmQgdGhlIHR5cGUsIGZvcgotICAgICBub24tc3F1YW5nbGluZyB0eXBlIHJlbWVtYmVyaW5nLiAgKi8KLSAgY29uc3QgY2hhciAqc3RhcnQgPSAqbWFuZ2xlZDsKLQotICBzdHJpbmdfaW5pdCAocmVzdWx0KTsKLQotICBpZiAod29yay0+bnJlcGVhdHMgPiAwKQotICAgIHsKLSAgICAgIC0td29yay0+bnJlcGVhdHM7Ci0KLSAgICAgIGlmICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCA9PSAwKQotCXJldHVybiAwOwotCi0gICAgICAvKiBXZSB3YW50IHRvIHJlaXNzdWUgdGhlIHByZXZpb3VzIHR5cGUgaW4gdGhpcyBhcmd1bWVudCBsaXN0LiAgKi8KLSAgICAgIHN0cmluZ19hcHBlbmRzIChyZXN1bHQsIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAoKiptYW5nbGVkID09ICduJykKLSAgICB7Ci0gICAgICAvKiBBIHNxdWFuZ2xpbmctc3R5bGUgcmVwZWF0LiAgKi8KLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIHdvcmstPm5yZXBlYXRzID0gY29uc3VtZV9jb3VudChtYW5nbGVkKTsKLQotICAgICAgaWYgKHdvcmstPm5yZXBlYXRzIDw9IDApCi0JLyogVGhpcyB3YXMgbm90IGEgcmVwZWF0IGNvdW50IGFmdGVyIGFsbC4gICovCi0JcmV0dXJuIDA7Ci0KLSAgICAgIGlmICh3b3JrLT5ucmVwZWF0cyA+IDkpCi0JewotCSAgaWYgKCoqbWFuZ2xlZCAhPSAnXycpCi0JICAgIC8qIFRoZSByZXBlYXQgY291bnQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFuICdfJyBpbiB0aGlzCi0JICAgICAgIGNhc2UuICAqLwotCSAgICByZXR1cm4gMDsKLQkgIGVsc2UKLQkgICAgKCptYW5nbGVkKSsrOwotCX0KLQotICAgICAgLyogTm93LCB0aGUgcmVwZWF0IGlzIGFsbCBzZXQgdXAuICAqLwotICAgICAgcmV0dXJuIGRvX2FyZyAod29yaywgbWFuZ2xlZCwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgLyogU2F2ZSB0aGUgcmVzdWx0IGluIFdPUkstPnByZXZpb3VzX2FyZ3VtZW50IHNvIHRoYXQgd2UgY2FuIGZpbmQgaXQKLSAgICAgaWYgaXQncyByZXBlYXRlZC4gIE5vdGUgdGhhdCBzYXZpbmcgU1RBUlQgaXMgbm90IGdvb2QgZW5vdWdoOiB3ZQotICAgICBkbyBub3Qgd2FudCB0byBhZGQgYWRkaXRpb25hbCB0eXBlcyB0byB0aGUgYmFjay1yZWZlcmVuY2VhYmxlCi0gICAgIHR5cGUgdmVjdG9yIHdoZW4gcHJvY2Vzc2luZyBhIHJlcGVhdGVkIHR5cGUuICAqLwotICBpZiAod29yay0+cHJldmlvdXNfYXJndW1lbnQpCi0gICAgc3RyaW5nX2NsZWFyICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3b3JrLT5wcmV2aW91c19hcmd1bWVudCA9IChzdHJpbmcqKSB4bWFsbG9jIChzaXplb2YgKHN0cmluZykpOwotICAgICAgc3RyaW5nX2luaXQgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKLSAgICB9Ci0KLSAgaWYgKCFkb190eXBlICh3b3JrLCBtYW5nbGVkLCB3b3JrLT5wcmV2aW91c19hcmd1bWVudCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgc3RyaW5nX2FwcGVuZHMgKHJlc3VsdCwgd29yay0+cHJldmlvdXNfYXJndW1lbnQpOwotCi0gIHJlbWVtYmVyX3R5cGUgKHdvcmssIHN0YXJ0LCAqbWFuZ2xlZCAtIHN0YXJ0KTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZW1lbWJlcl90eXBlICh3b3JrLCBzdGFydCwgbGVuKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gICAgIGludCBsZW47Ci17Ci0gIGNoYXIgKnRlbTsKLQotICBpZiAod29yay0+Zm9yZ2V0dGluZ190eXBlcykKLSAgICByZXR1cm47Ci0KLSAgaWYgKHdvcmsgLT4gbnR5cGVzID49IHdvcmsgLT4gdHlwZXZlY19zaXplKQotICAgIHsKLSAgICAgIGlmICh3b3JrIC0+IHR5cGV2ZWNfc2l6ZSA9PSAwKQotCXsKLQkgIHdvcmsgLT4gdHlwZXZlY19zaXplID0gMzsKLQkgIHdvcmsgLT4gdHlwZXZlYwotCSAgICA9IChjaGFyICoqKSB4bWFsbG9jIChzaXplb2YgKGNoYXIgKikgKiB3b3JrIC0+IHR5cGV2ZWNfc2l6ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHdvcmsgLT4gdHlwZXZlY19zaXplICo9IDI7Ci0JICB3b3JrIC0+IHR5cGV2ZWMKLQkgICAgPSAoY2hhciAqKikgeHJlYWxsb2MgKChjaGFyICopd29yayAtPiB0eXBldmVjLAotCQkJCSAgc2l6ZW9mIChjaGFyICopICogd29yayAtPiB0eXBldmVjX3NpemUpOwotCX0KLSAgICB9Ci0gIHRlbSA9IHhtYWxsb2MgKGxlbiArIDEpOwotICBtZW1jcHkgKHRlbSwgc3RhcnQsIGxlbik7Ci0gIHRlbVtsZW5dID0gJ1wwJzsKLSAgd29yayAtPiB0eXBldmVjW3dvcmsgLT4gbnR5cGVzKytdID0gdGVtOwotfQotCi0KLS8qIFJlbWVtYmVyIGEgSyB0eXBlIGNsYXNzIHF1YWxpZmllci4gKi8KLXN0YXRpYyB2b2lkCi1yZW1lbWJlcl9LdHlwZSAod29yaywgc3RhcnQsIGxlbikKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YXJ0OwotICAgICBpbnQgbGVuOwotewotICBjaGFyICp0ZW07Ci0KLSAgaWYgKHdvcmsgLT4gbnVtayA+PSB3b3JrIC0+IGtzaXplKQotICAgIHsKLSAgICAgIGlmICh3b3JrIC0+IGtzaXplID09IDApCi0JewotCSAgd29yayAtPiBrc2l6ZSA9IDU7Ci0JICB3b3JrIC0+IGt0eXBldmVjCi0JICAgID0gKGNoYXIgKiopIHhtYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqIHdvcmsgLT4ga3NpemUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB3b3JrIC0+IGtzaXplICo9IDI7Ci0JICB3b3JrIC0+IGt0eXBldmVjCi0JICAgID0gKGNoYXIgKiopIHhyZWFsbG9jICgoY2hhciAqKXdvcmsgLT4ga3R5cGV2ZWMsCi0JCQkJICBzaXplb2YgKGNoYXIgKikgKiB3b3JrIC0+IGtzaXplKTsKLQl9Ci0gICAgfQotICB0ZW0gPSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgbWVtY3B5ICh0ZW0sIHN0YXJ0LCBsZW4pOwotICB0ZW1bbGVuXSA9ICdcMCc7Ci0gIHdvcmsgLT4ga3R5cGV2ZWNbd29yayAtPiBudW1rKytdID0gdGVtOwotfQotCi0vKiBSZWdpc3RlciBhIEIgY29kZSwgYW5kIGdldCBhbiBpbmRleCBmb3IgaXQuIEIgY29kZXMgYXJlIHJlZ2lzdGVyZWQKLSAgIGFzIHRoZXkgYXJlIHNlZW4sIHJhdGhlciB0aGFuIGFzIHRoZXkgYXJlIGNvbXBsZXRlZCwgc28gbWFwPHRlbXA8Y2hhcj4gPgotICAgcmVnaXN0ZXJzIG1hcDx0ZW1wPGNoYXI+ID4gYXMgQjAsIGFuZCB0ZW1wPGNoYXI+IGFzIEIxICovCi0KLXN0YXRpYyBpbnQKLXJlZ2lzdGVyX0J0eXBlICh3b3JrKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLXsKLSAgaW50IHJldDsKLQotICBpZiAod29yayAtPiBudW1iID49IHdvcmsgLT4gYnNpemUpCi0gICAgewotICAgICAgaWYgKHdvcmsgLT4gYnNpemUgPT0gMCkKLQl7Ci0JICB3b3JrIC0+IGJzaXplID0gNTsKLQkgIHdvcmsgLT4gYnR5cGV2ZWMKLQkgICAgPSAoY2hhciAqKikgeG1hbGxvYyAoc2l6ZW9mIChjaGFyICopICogd29yayAtPiBic2l6ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHdvcmsgLT4gYnNpemUgKj0gMjsKLQkgIHdvcmsgLT4gYnR5cGV2ZWMKLQkgICAgPSAoY2hhciAqKikgeHJlYWxsb2MgKChjaGFyICopd29yayAtPiBidHlwZXZlYywKLQkJCQkgIHNpemVvZiAoY2hhciAqKSAqIHdvcmsgLT4gYnNpemUpOwotCX0KLSAgICB9Ci0gIHJldCA9IHdvcmsgLT4gbnVtYisrOwotICB3b3JrIC0+IGJ0eXBldmVjW3JldF0gPSBOVUxMOwotICByZXR1cm4ocmV0KTsKLX0KLQotLyogU3RvcmUgYSB2YWx1ZSBpbnRvIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIEIgY29kZSB0eXBlLiAqLwotCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfQnR5cGUgKHdvcmssIHN0YXJ0LCBsZW4sIGluZGV4KQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gICAgIGludCBsZW4sIGluZGV4OwotewotICBjaGFyICp0ZW07Ci0KLSAgdGVtID0geG1hbGxvYyAobGVuICsgMSk7Ci0gIG1lbWNweSAodGVtLCBzdGFydCwgbGVuKTsKLSAgdGVtW2xlbl0gPSAnXDAnOwotICB3b3JrIC0+IGJ0eXBldmVjW2luZGV4XSA9IHRlbTsKLX0KLQotLyogTG9zZSBhbGwgdGhlIGluZm8gcmVsYXRlZCB0byBCIGFuZCBLIHR5cGUgY29kZXMuICovCi1zdGF0aWMgdm9pZAotZm9yZ2V0X0JfYW5kX0tfdHlwZXMgKHdvcmspCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotewotICBpbnQgaTsKLQotICB3aGlsZSAod29yayAtPiBudW1rID4gMCkKLSAgICB7Ci0gICAgICBpID0gLS0od29yayAtPiBudW1rKTsKLSAgICAgIGlmICh3b3JrIC0+IGt0eXBldmVjW2ldICE9IE5VTEwpCi0JewotCSAgZnJlZSAod29yayAtPiBrdHlwZXZlY1tpXSk7Ci0JICB3b3JrIC0+IGt0eXBldmVjW2ldID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIHdoaWxlICh3b3JrIC0+IG51bWIgPiAwKQotICAgIHsKLSAgICAgIGkgPSAtLSh3b3JrIC0+IG51bWIpOwotICAgICAgaWYgKHdvcmsgLT4gYnR5cGV2ZWNbaV0gIT0gTlVMTCkKLQl7Ci0JICBmcmVlICh3b3JrIC0+IGJ0eXBldmVjW2ldKTsKLQkgIHdvcmsgLT4gYnR5cGV2ZWNbaV0gPSBOVUxMOwotCX0KLSAgICB9Ci19Ci0vKiBGb3JnZXQgdGhlIHJlbWVtYmVyZWQgdHlwZXMsIGJ1dCBub3QgdGhlIHR5cGUgdmVjdG9yIGl0c2VsZi4gICovCi0KLXN0YXRpYyB2b2lkCi1mb3JnZXRfdHlwZXMgKHdvcmspCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotewotICBpbnQgaTsKLQotICB3aGlsZSAod29yayAtPiBudHlwZXMgPiAwKQotICAgIHsKLSAgICAgIGkgPSAtLSh3b3JrIC0+IG50eXBlcyk7Ci0gICAgICBpZiAod29yayAtPiB0eXBldmVjW2ldICE9IE5VTEwpCi0JewotCSAgZnJlZSAod29yayAtPiB0eXBldmVjW2ldKTsKLQkgIHdvcmsgLT4gdHlwZXZlY1tpXSA9IE5VTEw7Ci0JfQotICAgIH0KLX0KLQotLyogUHJvY2VzcyB0aGUgYXJndW1lbnQgbGlzdCBwYXJ0IG9mIHRoZSBzaWduYXR1cmUsIGFmdGVyIGFueSBjbGFzcyBzcGVjCi0gICBoYXMgYmVlbiBjb25zdW1lZCwgYXMgd2VsbCBhcyB0aGUgZmlyc3QgJ0YnIGNoYXJhY3RlciAoaWYgYW55KS4gIEZvcgotICAgZXhhbXBsZToKLQotICAgIl9fYWxzX18zZm9vUlQwIgkJPT4JcHJvY2VzcyAiUlQwIgotICAgImNvbXBsZXhmdW5jNV9fRlBGUGNfUEZsX2kiCT0+CXByb2Nlc3MgIlBGUGNfUEZsX2kiCi0KLSAgIERFQ0xQIG11c3QgYmUgYWxyZWFkeSBpbml0aWFsaXNlZCwgdXN1YWxseSBub24tZW1wdHkuICBJdCB3b24ndCBiZSBmcmVlZAotICAgb24gZmFpbHVyZS4KLQotICAgTm90ZSB0aGF0IGcrKyBkaWZmZXJzIHNpZ25pZmljYW50bHkgZnJvbSBBUk0gYW5kIGx1Y2lkIHN0eWxlIG1hbmdsaW5nCi0gICB3aXRoIHJlZ2FyZHMgdG8gcmVmZXJlbmNlcyB0byBwcmV2aW91c2x5IHNlZW4gdHlwZXMuICBGb3IgZXhhbXBsZSwgZ2l2ZW4KLSAgIHRoZSBzb3VyY2UgZnJhZ21lbnQ6Ci0KLSAgICAgY2xhc3MgZm9vIHsKLSAgICAgICBwdWJsaWM6Ci0gICAgICAgZm9vOjpmb28gKGludCwgZm9vICZpYSwgaW50LCBmb28gJmliLCBpbnQsIGZvbyAmaWMpOwotICAgICB9OwotCi0gICAgIGZvbzo6Zm9vIChpbnQsIGZvbyAmaWEsIGludCwgZm9vICZpYiwgaW50LCBmb28gJmljKSB7IGlhID0gaWIgPSBpYzsgfQotICAgICB2b2lkIGZvbyAoaW50LCBmb28gJmlhLCBpbnQsIGZvbyAmaWIsIGludCwgZm9vICZpYykgeyBpYSA9IGliID0gaWM7IH0KLQotICAgZysrIHByb2R1Y2VzIHRoZSBuYW1lczoKLQotICAgICBfXzNmb29pUlQwaVQyaVQyCi0gICAgIGZvb19fRmlSM2Zvb2lUMWlUMQotCi0gICB3aGlsZSBsY2MgKGFuZCBwcmVzdW1hYmx5IG90aGVyIEFSTSBzdHlsZSBjb21waWxlcnMgYXMgd2VsbCkgcHJvZHVjZXM6Ci0KLSAgICAgZm9vX19GaVIzZm9vVDFUMlQxVDIKLSAgICAgX19jdF9fM2Zvb0ZpUjNmb29UMVQyVDFUMgotCi0gICBOb3RlIHRoYXQgZysrIGJhc2VzIGl0cyB0eXBlIG51bWJlcnMgc3RhcnRpbmcgYXQgemVybyBhbmQgY291bnRzIGFsbAotICAgcHJldmlvdXNseSBzZWVuIHR5cGVzLCB3aGlsZSBsdWNpZC9BUk0gYmFzZXMgaXRzIHR5cGUgbnVtYmVycyBzdGFydGluZwotICAgYXQgb25lIGFuZCBvbmx5IGNvbnNpZGVycyB0eXBlcyBhZnRlciBpdCBoYXMgc2VlbiB0aGUgJ0YnIGNoYXJhY3RlcgotICAgaW5kaWNhdGluZyB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uIGFyZ3MuICBGb3IgbHVjaWQvQVJNIHN0eWxlLCB3ZQotICAgYWNjb3VudCBmb3IgdGhpcyBkaWZmZXJlbmNlIGJ5IGRpc2NhcmRpbmcgYW55IHByZXZpb3VzbHkgc2VlbiB0eXBlcyB3aGVuCi0gICB3ZSBzZWUgdGhlICdGJyBjaGFyYWN0ZXIsIGFuZCBzdWJ0cmFjdGluZyBvbmUgZnJvbSB0aGUgdHlwZSBudW1iZXIKLSAgIHJlZmVyZW5jZS4KLQotICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIHN0cmluZyBhcmc7Ci0gIGludCBuZWVkX2NvbW1hID0gMDsKLSAgaW50IHI7Ci0gIGludCB0OwotICBjb25zdCBjaGFyICp0ZW07Ci0gIGNoYXIgdGVtcHR5cGU7Ci0KLSAgaWYgKFBSSU5UX0FSR19UWVBFUykKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIigiKTsKLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ1wwJykKLQl7Ci0JICBzdHJpbmdfYXBwZW5kIChkZWNscCwgInZvaWQiKTsKLQl9Ci0gICAgfQotCi0gIHdoaWxlICgoKiptYW5nbGVkICE9ICdfJyAmJiAqKm1hbmdsZWQgIT0gJ1wwJyAmJiAqKm1hbmdsZWQgIT0gJ2UnKQotCSB8fCB3b3JrLT5ucmVwZWF0cyA+IDApCi0gICAgewotICAgICAgaWYgKCgqKm1hbmdsZWQgPT0gJ04nKSB8fCAoKiptYW5nbGVkID09ICdUJykpCi0JewotCSAgdGVtcHR5cGUgPSAqKCptYW5nbGVkKSsrOwotCi0JICBpZiAodGVtcHR5cGUgPT0gJ04nKQotCSAgICB7Ci0JICAgICAgaWYgKCFnZXRfY291bnQgKG1hbmdsZWQsICZyKSkKLQkJewotCQkgIHJldHVybiAoMCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgciA9IDE7Ci0JICAgIH0KLSAgICAgICAgICBpZiAoKEhQX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpICYmIHdvcmsgLT4gbnR5cGVzID49IDEwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIDEwIG9yIG1vcmUgdHlwZXMgd2UgbWlnaHQgaGF2ZSBtb3JlIHRoYW4gYSAxIGRpZ2l0Ci0gICAgICAgICAgICAgICAgIGluZGV4IHNvIHdlJ2xsIGhhdmUgdG8gY29uc3VtZSB0aGUgd2hvbGUgY291bnQgaGVyZS4gVGhpcwotICAgICAgICAgICAgICAgICB3aWxsIGxvc2UgaWYgdGhlIG5leHQgdGhpbmcgaXMgYSB0eXBlIG5hbWUgcHJlY2VkZWQgYnkgYQotICAgICAgICAgICAgICAgICBjb3VudCBidXQgaXQncyBpbXBvc3NpYmxlIHRvIGRlbWFuZ2xlIHRoYXQgY2FzZSBwcm9wZXJseQotICAgICAgICAgICAgICAgICBhbnl3YXkuIEVnIGlmIHdlIGFscmVhZHkgaGF2ZSAxMiB0eXBlcyBpcyBUMTJQYyAiKC4uLiwgdHlwZTEsCi0gICAgICAgICAgICAgICAgIFBjLCAuLi4pIiAgb3IgIiguLi4sIHR5cGUxMiwgY2hhciAqLCAuLi4pIiAqLwotICAgICAgICAgICAgICBpZiAoKHQgPSBjb25zdW1lX2NvdW50KG1hbmdsZWQpKSA8PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghZ2V0X2NvdW50IChtYW5nbGVkLCAmdCkpCi0JICAgIAl7Ci0JICAgICAgICAgIHJldHVybiAoMCk7Ci0JICAgIAl9Ci0JICAgIH0KLQkgIGlmIChMVUNJRF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpCi0JICAgIHsKLQkgICAgICB0LS07Ci0JICAgIH0KLQkgIC8qIFZhbGlkYXRlIHRoZSB0eXBlIGluZGV4LiAgUHJvdGVjdCBhZ2FpbnN0IGlsbGVnYWwgaW5kaWNlcyBmcm9tCi0JICAgICBtYWxmb3JtZWQgdHlwZSBzdHJpbmdzLiAgKi8KLQkgIGlmICgodCA8IDApIHx8ICh0ID49IHdvcmsgLT4gbnR5cGVzKSkKLQkgICAgewotCSAgICAgIHJldHVybiAoMCk7Ci0JICAgIH0KLQkgIHdoaWxlICh3b3JrLT5ucmVwZWF0cyA+IDAgfHwgLS1yID49IDApCi0JICAgIHsKLQkgICAgICB0ZW0gPSB3b3JrIC0+IHR5cGV2ZWNbdF07Ci0JICAgICAgaWYgKG5lZWRfY29tbWEgJiYgUFJJTlRfQVJHX1RZUEVTKQotCQl7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIsICIpOwotCQl9Ci0JICAgICAgaWYgKCFkb19hcmcgKHdvcmssICZ0ZW0sICZhcmcpKQotCQl7Ci0JCSAgcmV0dXJuICgwKTsKLQkJfQotCSAgICAgIGlmIChQUklOVF9BUkdfVFlQRVMpCi0JCXsKLQkJICBzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZhcmcpOwotCQl9Ci0JICAgICAgc3RyaW5nX2RlbGV0ZSAoJmFyZyk7Ci0JICAgICAgbmVlZF9jb21tYSA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG5lZWRfY29tbWEgJiYgUFJJTlRfQVJHX1RZUEVTKQotCSAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIiwgIik7Ci0JICBpZiAoIWRvX2FyZyAod29yaywgbWFuZ2xlZCwgJmFyZykpCi0JICAgIHJldHVybiAoMCk7Ci0JICBpZiAoUFJJTlRfQVJHX1RZUEVTKQotCSAgICBzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZhcmcpOwotCSAgc3RyaW5nX2RlbGV0ZSAoJmFyZyk7Ci0JICBuZWVkX2NvbW1hID0gMTsKLQl9Ci0gICAgfQotCi0gIGlmICgqKm1hbmdsZWQgPT0gJ2UnKQotICAgIHsKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIGlmIChQUklOVF9BUkdfVFlQRVMpCi0JewotCSAgaWYgKG5lZWRfY29tbWEpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIiwiKTsKLQkgICAgfQotCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIuLi4iKTsKLQl9Ci0gICAgfQotCi0gIGlmIChQUklOVF9BUkdfVFlQRVMpCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIpIik7Ci0gICAgfQotICByZXR1cm4gKDEpOwotfQotCi0vKiBMaWtlIGRlbWFuZ2xlX2FyZ3MsIGJ1dCBmb3IgZGVtYW5nbGluZyB0aGUgYXJndW1lbnQgbGlzdHMgb2YgZnVuY3Rpb24KLSAgIGFuZCBtZXRob2QgcG9pbnRlcnMgb3IgcmVmZXJlbmNlcywgbm90IHRvcC1sZXZlbCBkZWNsYXJhdGlvbnMuICAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9uZXN0ZWRfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgc3RyaW5nKiBzYXZlZF9wcmV2aW91c19hcmd1bWVudDsKLSAgaW50IHJlc3VsdDsKLSAgaW50IHNhdmVkX25yZXBlYXRzOwotCi0gIC8qIFRoZSBHKysgbmFtZS1tYW5nbGluZyBhbGdvcml0aG0gZG9lcyBub3QgcmVtZW1iZXIgdHlwZXMgb24gbmVzdGVkCi0gICAgIGFyZ3VtZW50IGxpc3RzLCB1bmxlc3MgLWZzcXVhbmdsaW5nIGlzIHVzZWQsIGFuZCBpbiB0aGF0IGNhc2UgdGhlCi0gICAgIHR5cGUgdmVjdG9yIHVwZGF0ZWQgYnkgcmVtZW1iZXJfdHlwZSBpcyBub3QgdXNlZC4gIFNvLCB3ZSB0dXJuCi0gICAgIG9mZiByZW1lbWJlcmluZyBvZiB0eXBlcyBoZXJlLiAgKi8KLSAgKyt3b3JrLT5mb3JnZXR0aW5nX3R5cGVzOwotCi0gIC8qIEZvciB0aGUgcmVwZWF0IGNvZGVzIHVzZWQgd2l0aCAtZnNxdWFuZ2xpbmcsIHdlIG11c3Qga2VlcCB0cmFjayBvZgotICAgICB0aGUgbGFzdCBhcmd1bWVudC4gICovCi0gIHNhdmVkX3ByZXZpb3VzX2FyZ3VtZW50ID0gd29yay0+cHJldmlvdXNfYXJndW1lbnQ7Ci0gIHNhdmVkX25yZXBlYXRzID0gd29yay0+bnJlcGVhdHM7Ci0gIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50ID0gMDsKLSAgd29yay0+bnJlcGVhdHMgPSAwOwotCi0gIC8qIEFjdHVhbGx5IGRlbWFuZ2xlIHRoZSBhcmd1bWVudHMuICAqLwotICByZXN1bHQgPSBkZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0KLSAgLyogUmVzdG9yZSB0aGUgcHJldmlvdXNfYXJndW1lbnQgZmllbGQuICAqLwotICBpZiAod29yay0+cHJldmlvdXNfYXJndW1lbnQpCi0gICAgc3RyaW5nX2RlbGV0ZSAod29yay0+cHJldmlvdXNfYXJndW1lbnQpOwotICB3b3JrLT5wcmV2aW91c19hcmd1bWVudCA9IHNhdmVkX3ByZXZpb3VzX2FyZ3VtZW50OwotICAtLXdvcmstPmZvcmdldHRpbmdfdHlwZXM7Ci0gIHdvcmstPm5yZXBlYXRzID0gc2F2ZWRfbnJlcGVhdHM7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQKLWRlbWFuZ2xlX2Z1bmN0aW9uX25hbWUgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCBzY2FuKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci0gICAgIGNvbnN0IGNoYXIgKnNjYW47Ci17Ci0gIHNpemVfdCBpOwotICBzdHJpbmcgdHlwZTsKLSAgY29uc3QgY2hhciAqdGVtOwotCi0gIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKCptYW5nbGVkKSwgc2NhbiAtICgqbWFuZ2xlZCkpOwotICBzdHJpbmdfbmVlZCAoZGVjbHAsIDEpOwotICAqKGRlY2xwIC0+IHApID0gJ1wwJzsKLQotICAvKiBDb25zdW1lIHRoZSBmdW5jdGlvbiBuYW1lLCBpbmNsdWRpbmcgdGhlICJfXyIgc2VwYXJhdGluZyB0aGUgbmFtZQotICAgICBmcm9tIHRoZSBzaWduYXR1cmUuICBXZSBhcmUgZ3VhcmFudGVlZCB0aGF0IFNDQU4gcG9pbnRzIHRvIHRoZQotICAgICBzZXBhcmF0b3IuICAqLwotCi0gICgqbWFuZ2xlZCkgPSBzY2FuICsgMjsKLSAgLyogV2UgbWF5IGJlIGxvb2tpbmcgYXQgYW4gaW5zdGFudGlhdGlvbiBvZiBhIHRlbXBsYXRlIGZ1bmN0aW9uOgotICAgICBmb29fX1h0MXQyX0Z0M3Q0LCB3aGVyZSB0MSwgdDIsIC4uLiBhcmUgdGVtcGxhdGUgYXJndW1lbnRzIGFuZCBhCi0gICAgIGZvbGxvd2luZyBfRiBtYXJrcyB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gIEhhbmRsZQotICAgICB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGZpcnN0LiAqLwotCi0gIGlmIChIUF9ERU1BTkdMSU5HICYmICgqKm1hbmdsZWQgPT0gJ1gnKSkKLSAgICB7Ci0gICAgICBkZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIDAsIGRlY2xwKTsKLSAgICAgIC8qIFRoaXMgbGVhdmVzIE1BTkdMRUQgcG9pbnRpbmcgdG8gdGhlICdGJyBtYXJraW5nIGZ1bmMgYXJncyAqLwotICAgIH0KLQotICBpZiAoTFVDSURfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQotICAgIHsKLQotICAgICAgLyogU2VlIGlmIHdlIGhhdmUgYW4gQVJNIHN0eWxlIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3Igb3BlcmF0b3IuCi0JIElmIHNvLCB0aGVuIGp1c3QgcmVjb3JkIGl0LCBjbGVhciB0aGUgZGVjbCwgYW5kIHJldHVybi4KLQkgV2UgY2FuJ3QgYnVpbGQgdGhlIGFjdHVhbCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGRlY2wgdW50aWwgbGF0ZXIsCi0JIHdoZW4gd2UgcmVjb3ZlciB0aGUgY2xhc3MgbmFtZSBmcm9tIHRoZSBzaWduYXR1cmUuICAqLwotCi0gICAgICBpZiAoc3RyY21wIChkZWNscCAtPiBiLCAiX19jdCIpID09IDApCi0JewotCSAgd29yayAtPiBjb25zdHJ1Y3RvciArPSAxOwotCSAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChkZWNscCAtPiBiLCAiX19kdCIpID09IDApCi0JewotCSAgd29yayAtPiBkZXN0cnVjdG9yICs9IDE7Ci0JICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGlmIChkZWNscC0+cCAtIGRlY2xwLT5iID49IDMKLSAgICAgICYmIGRlY2xwLT5iWzBdID09ICdvJwotICAgICAgJiYgZGVjbHAtPmJbMV0gPT0gJ3AnCi0gICAgICAmJiBzdHJjaHIgKGNwbHVzX21hcmtlcnMsIGRlY2xwLT5iWzJdKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIHNlZSBpZiBpdCdzIGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiAqLwotICAgICAgaWYgKGRlY2xwLT5wIC0gZGVjbHAtPmIgPj0gMTAgLyogb3AkYXNzaWduXyAqLwotCSAgJiYgbWVtY21wIChkZWNscC0+YiArIDMsICJhc3NpZ25fIiwgNykgPT0gMCkKLQl7Ci0JICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLQkgICAgewotCSAgICAgIGludCBsZW4gPSBkZWNscC0+cCAtIGRlY2xwLT5iIC0gMTA7Ci0JICAgICAgaWYgKChpbnQpIHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gbGVuCi0JCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBkZWNscC0+YiArIDEwLCBsZW4pID09IDApCi0JCXsKLQkJICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIm9wZXJhdG9yIik7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIG9wdGFibGVbaV0ub3V0KTsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIj0iKTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCSAgICB7Ci0JICAgICAgaW50IGxlbiA9IGRlY2xwLT5wIC0gZGVjbHAtPmIgLSAzOwotCSAgICAgIGlmICgoaW50KSBzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IGxlbgotCQkgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgZGVjbHAtPmIgKyAzLCBsZW4pID09IDApCi0JCXsKLQkJICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIm9wZXJhdG9yIik7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIG9wdGFibGVbaV0ub3V0KTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZGVjbHAtPnAgLSBkZWNscC0+YiA+PSA1ICYmIG1lbWNtcCAoZGVjbHAtPmIsICJ0eXBlIiwgNCkgPT0gMAotCSAgICYmIHN0cmNociAoY3BsdXNfbWFya2VycywgZGVjbHAtPmJbNF0pICE9IE5VTEwpCi0gICAgewotICAgICAgLyogdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yICovCi0gICAgICB0ZW0gPSBkZWNscC0+YiArIDU7Ci0gICAgICBpZiAoZG9fdHlwZSAod29yaywgJnRlbSwgJnR5cGUpKQotCXsKLQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJvcGVyYXRvciAiKTsKLQkgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJnR5cGUpOwotCSAgc3RyaW5nX2RlbGV0ZSAoJnR5cGUpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGRlY2xwLT5iWzBdID09ICdfJyAmJiBkZWNscC0+YlsxXSA9PSAnXycKLQkgICAmJiBkZWNscC0+YlsyXSA9PSAnbycgJiYgZGVjbHAtPmJbM10gPT0gJ3AnKQotICAgIHsKLSAgICAgIC8qIEFOU0kuICAqLwotICAgICAgLyogdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yLiAgKi8KLSAgICAgIHRlbSA9IGRlY2xwLT5iICsgNDsKLSAgICAgIGlmIChkb190eXBlICh3b3JrLCAmdGVtLCAmdHlwZSkpCi0JewotCSAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIm9wZXJhdG9yICIpOwotCSAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmdHlwZSk7Ci0JICBzdHJpbmdfZGVsZXRlICgmdHlwZSk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZGVjbHAtPmJbMF0gPT0gJ18nICYmIGRlY2xwLT5iWzFdID09ICdfJwotCSAgICYmIGRlY2xwLT5iWzJdID49ICdhJyAmJiBkZWNscC0+YlsyXSA8PSAneicKLQkgICAmJiBkZWNscC0+YlszXSA+PSAnYScgJiYgZGVjbHAtPmJbM10gPD0gJ3onKQotICAgIHsKLSAgICAgIGlmIChkZWNscC0+Yls0XSA9PSAnXDAnKQotCXsKLQkgIC8qIE9wZXJhdG9yLiAgKi8KLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gMgotCQkgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgZGVjbHAtPmIgKyAyLCAyKSA9PSAwKQotCQl7Ci0JCSAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJvcGVyYXRvciIpOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZGVjbHAtPmJbMl0gPT0gJ2EnICYmIGRlY2xwLT5iWzVdID09ICdcMCcpCi0JICAgIHsKLQkgICAgICAvKiBBc3NpZ25tZW50LiAgKi8KLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLQkJewotCQkgIGlmIChzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IDMKLQkJICAgICAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBkZWNscC0+YiArIDIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCQkgICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIm9wZXJhdG9yIik7Ci0JCSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBhIG1pbmkgc3RyaW5nLWhhbmRsaW5nIHBhY2thZ2UgKi8KLQotc3RhdGljIHZvaWQKLXN0cmluZ19uZWVkIChzLCBuKQotICAgICBzdHJpbmcgKnM7Ci0gICAgIGludCBuOwotewotICBpbnQgdGVtOwotCi0gIGlmIChzLT5iID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKG4gPCAzMikKLQl7Ci0JICBuID0gMzI7Ci0JfQotICAgICAgcy0+cCA9IHMtPmIgPSB4bWFsbG9jIChuKTsKLSAgICAgIHMtPmUgPSBzLT5iICsgbjsKLSAgICB9Ci0gIGVsc2UgaWYgKHMtPmUgLSBzLT5wIDwgbikKLSAgICB7Ci0gICAgICB0ZW0gPSBzLT5wIC0gcy0+YjsKLSAgICAgIG4gKz0gdGVtOwotICAgICAgbiAqPSAyOwotICAgICAgcy0+YiA9IHhyZWFsbG9jIChzLT5iLCBuKTsKLSAgICAgIHMtPnAgPSBzLT5iICsgdGVtOwotICAgICAgcy0+ZSA9IHMtPmIgKyBuOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXN0cmluZ19kZWxldGUgKHMpCi0gICAgIHN0cmluZyAqczsKLXsKLSAgaWYgKHMtPmIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChzLT5iKTsKLSAgICAgIHMtPmIgPSBzLT5lID0gcy0+cCA9IE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2luaXQgKHMpCi0gICAgIHN0cmluZyAqczsKLXsKLSAgcy0+YiA9IHMtPnAgPSBzLT5lID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLXN0cmluZ19jbGVhciAocykKLSAgICAgc3RyaW5nICpzOwotewotICBzLT5wID0gcy0+YjsKLX0KLQotI2lmIDAKLQotc3RhdGljIGludAotc3RyaW5nX2VtcHR5IChzKQotICAgICBzdHJpbmcgKnM7Ci17Ci0gIHJldHVybiAocy0+YiA9PSBzLT5wKTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfYXBwZW5kIChwLCBzKQotICAgICBzdHJpbmcgKnA7Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGludCBuOwotICBpZiAocyA9PSBOVUxMIHx8ICpzID09ICdcMCcpCi0gICAgcmV0dXJuOwotICBuID0gc3RybGVuIChzKTsKLSAgc3RyaW5nX25lZWQgKHAsIG4pOwotICBtZW1jcHkgKHAtPnAsIHMsIG4pOwotICBwLT5wICs9IG47Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfYXBwZW5kcyAocCwgcykKLSAgICAgc3RyaW5nICpwLCAqczsKLXsKLSAgaW50IG47Ci0KLSAgaWYgKHMtPmIgIT0gcy0+cCkKLSAgICB7Ci0gICAgICBuID0gcy0+cCAtIHMtPmI7Ci0gICAgICBzdHJpbmdfbmVlZCAocCwgbik7Ci0gICAgICBtZW1jcHkgKHAtPnAsIHMtPmIsIG4pOwotICAgICAgcC0+cCArPSBuOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXN0cmluZ19hcHBlbmRuIChwLCBzLCBuKQotICAgICBzdHJpbmcgKnA7Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgIGludCBuOwotewotICBpZiAobiAhPSAwKQotICAgIHsKLSAgICAgIHN0cmluZ19uZWVkIChwLCBuKTsKLSAgICAgIG1lbWNweSAocC0+cCwgcywgbik7Ci0gICAgICBwLT5wICs9IG47Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX3ByZXBlbmQgKHAsIHMpCi0gICAgIHN0cmluZyAqcDsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgaWYgKHMgIT0gTlVMTCAmJiAqcyAhPSAnXDAnKQotICAgIHsKLSAgICAgIHN0cmluZ19wcmVwZW5kbiAocCwgcywgc3RybGVuIChzKSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX3ByZXBlbmRzIChwLCBzKQotICAgICBzdHJpbmcgKnAsICpzOwotewotICBpZiAocy0+YiAhPSBzLT5wKQotICAgIHsKLSAgICAgIHN0cmluZ19wcmVwZW5kbiAocCwgcy0+Yiwgcy0+cCAtIHMtPmIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXN0cmluZ19wcmVwZW5kbiAocCwgcywgbikKLSAgICAgc3RyaW5nICpwOwotICAgICBjb25zdCBjaGFyICpzOwotICAgICBpbnQgbjsKLXsKLSAgY2hhciAqcTsKLQotICBpZiAobiAhPSAwKQotICAgIHsKLSAgICAgIHN0cmluZ19uZWVkIChwLCBuKTsKLSAgICAgIGZvciAocSA9IHAtPnAgLSAxOyBxID49IHAtPmI7IHEtLSkKLQl7Ci0JICBxW25dID0gcVswXTsKLQl9Ci0gICAgICBtZW1jcHkgKHAtPmIsIHMsIG4pOwotICAgICAgcC0+cCArPSBuOwotICAgIH0KLX0KLQotLyogVG8gZ2VuZXJhdGUgYSBzdGFuZGFsb25lIGRlbWFuZ2xlciBwcm9ncmFtIGZvciB0ZXN0aW5nIHB1cnBvc2VzLAotICAganVzdCBjb21waWxlIGFuZCBsaW5rIHRoaXMgZmlsZSB3aXRoIC1ETUFJTiBhbmQgbGliaWJlcnR5LmEuICBXaGVuCi0gICBydW4sIGl0IGRlbWFuZ2xlcyBlYWNoIGNvbW1hbmQgbGluZSBhcmcsIG9yIGVhY2ggc3RkaW4gc3RyaW5nLCBhbmQKLSAgIHByaW50cyB0aGUgcmVzdWx0IG9uIHN0ZG91dC4gICovCi0KLSNpZmRlZiBNQUlOCi0KLSNpbmNsdWRlICJnZXRvcHQuaCIKLQotc3RhdGljIGNoYXIgKnByb2dyYW1fbmFtZTsKLXN0YXRpYyBjaGFyICpwcm9ncmFtX3ZlcnNpb24gPSBWRVJTSU9OOwotc3RhdGljIGludCBmbGFncyA9IERNR0xfUEFSQU1TIHwgRE1HTF9BTlNJOwotCi1zdGF0aWMgdm9pZCBkZW1hbmdsZV9pdCBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIHVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBmYXRhbCBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLWRlbWFuZ2xlX2l0IChtYW5nbGVkX25hbWUpCi0gICAgIGNoYXIgKm1hbmdsZWRfbmFtZTsKLXsKLSAgY2hhciAqcmVzdWx0OwotCi0gIHJlc3VsdCA9IGNwbHVzX2RlbWFuZ2xlIChtYW5nbGVkX25hbWUsIGZsYWdzKTsKLSAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiVzXG4iLCBtYW5nbGVkX25hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIiVzXG4iLCByZXN1bHQpOwotICAgICAgZnJlZSAocmVzdWx0KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSAoc3RyZWFtLCBzdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCAiXAotVXNhZ2U6ICVzIFstX10gWy1uXSBbLXMge2dudSxsdWNpZCxhcm0saHAsZWRnfV0gWy0tc3RyaXAtdW5kZXJzY29yZXNdXG5cCi0gICAgICAgWy0tbm8tc3RyaXAtdW5kZXJzY29yZXNdIFstLWZvcm1hdD17Z251LGx1Y2lkLGFybSxocCxlZGd9XVxuXAotICAgICAgWy0taGVscF0gWy0tdmVyc2lvbl0gW2FyZy4uLl1cbiIsCi0JICAgcHJvZ3JhbV9uYW1lKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotI2RlZmluZSBNQlVGX1NJWkUgMzI3NjcKLWNoYXIgbWJ1ZmZlcltNQlVGX1NJWkVdOwotCi0vKiBEZWZpbmVkIGluIHRoZSBhdXRvbWF0aWNhbGx5LWdlbmVyYXRlZCB1bmRlcnNjb3JlLmMuICAqLwotZXh0ZXJuIGludCBwcmVwZW5kc191bmRlcnNjb3JlOwotCi1pbnQgc3RyaXBfdW5kZXJzY29yZSA9IDA7Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0gewotICB7InN0cmlwLXVuZGVyc2NvcmVzIiwgbm9fYXJndW1lbnQsIDAsICdfJ30sCi0gIHsiZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdzJ30sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICB7ImphdmEiLCBub19hcmd1bWVudCwgMCwgJ2onfSwKLSAgeyJuby1zdHJpcC11bmRlcnNjb3JlcyIsIG5vX2FyZ3VtZW50LCAwLCAnbid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ3YnfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQotLyogTW9yZSAnZnJpZW5kbHknIGFib3J0IHRoYXQgcHJpbnRzIHRoZSBsaW5lIGFuZCBmaWxlLgotICAgY29uZmlnLmggY2FuICNkZWZpbmUgYWJvcnQgZmFuY3lfYWJvcnQgaWYgeW91IGxpa2UgdGhhdCBzb3J0IG9mIHRoaW5nLiAgKi8KLQotdm9pZAotZmFuY3lfYWJvcnQgKCkKLXsKLSAgZmF0YWwgKCJJbnRlcm5hbCBnY2MgYWJvcnQuIik7Ci19Ci0KLQotLyogRmlsbCBpbiBUQUJMRSBzbyB0aGF0IFRBQkxFW0NdIGlzIHRydWUgaWZmIEMgKGFzIGFuIHVuc2lnbmVkIGNoYXIpCi0gICBpcyBhIHZhbGlkIHN5bWJvbCBjb21wb25lbnQsIGluIHRoZSBzdGFuZGFyZCBhc3NlbWJsZXIgc3ltYm9sCi0gICBzeW50YXguICAqLwotdm9pZAotc3RhbmRhcmRfc3ltYm9sX2FscGhhYmV0IChjaGFyICp0YWJsZSkKLXsKLSAgaW50IGM7Ci0KLSAgZm9yIChjID0gMDsgYyA8IDI1NjsgYysrKQotICAgIHRhYmxlW2NdID0gaXNhbG51bShjKTsKLQotICB0YWJsZVsnXyddID0gMTsKLSAgdGFibGVbJyQnXSA9IDE7Ci0gIHRhYmxlWycuJ10gPSAxOwotfQotCi0KLS8qIEZpbGwgaW4gVEFCTEUgc28gdGhhdCBUQUJMRVtDXSBpcyB0cnVlIGlmZiBDIChhcyBhbiB1bnNpZ25lZCBjaGFyKQotICAgaXMgYSB2YWxpZCBzeW1ib2wgbmFtZSBjb21wb25lbnQgaW4gYW4gSFAgb2JqZWN0IGZpbGUuCi0KLSAgIE5vdGUgdGhhdCwgc2luY2UgSFAncyBjb21waWxlciBnZW5lcmF0ZXMgb2JqZWN0IGNvZGUgc3RyYWlnaHQgZnJvbQotICAgQysrIHNvdXJjZSwgd2l0aG91dCBnb2luZyB0aHJvdWdoIGFuIGFzc2VtYmxlciwgaXRzIG1hbmdsZWQKLSAgIGlkZW50aWZpZXJzIGNhbiB1c2UgYWxsIHNvcnRzIG9mIGNoYXJhY3RlcnMgdGhhdCBubyBhc3NlbWJsZXIgd291bGQKLSAgIHRvbGVyYXRlLCBzbyB0aGUgYWxwaGFiZXQgdGhpcyBmdW5jdGlvbiBjcmVhdGVzIGlzIGEgbGl0dGxlIG9kZC4KLSAgIEhlcmUgYXJlIHNvbWUgc2FtcGxlIG1hbmdsZWQgaWRlbnRpZmllcnMgb2ZmZXJlZCBieSBIUDoKLQotCXR5cGVpZCpfX1hUMjRBZGRyZXNzSW5kRXhwQ2xhc3NNZW1iZXJfCi0JW1ZmdHB0cl1rZXk6X19kdF9fMzJPcmRpbmFyeUNvbXBhcmVJbmRFeHBDbGFzc01lbWJlckZ2Ci0JX19jdF9fUTJfOUVsZjY0X0R5bjE4e3VubmFtZWQudW5pb24uIzF9RnYKLQotICAgVGhpcyBzdGlsbCBzZWVtcyByZWFsbHkgd2VpcmQgdG8gbWUsIHNpbmNlIG5vd2hlcmUgZWxzZSBpbiB0aGlzCi0gICBmaWxlIGlzIHRoZXJlIGFueXRoaW5nIHRvIHJlY29nbml6ZSBjdXJseSBicmFja2V0cywgcGFyZW5zLCBldGMuCi0gICBJJ3ZlIHRhbGtlZCB3aXRoIFNyaWthbnRoIDxzcmlrYW50aEBjdXAuaHAuY29tPiwgYW5kIGhlIGFzc3VyZXMgbWUKLSAgIHRoaXMgaXMgcmlnaHQsIGJ1dCBJIHN0aWxsIHN0cm9uZ2x5IHN1c3BlY3QgdGhhdCB0aGVyZSdzIGEKLSAgIG1pc3VuZGVyc3RhbmRpbmcgaGVyZS4KLQotICAgSWYgd2UgZGVjaWRlIGl0J3MgYmV0dGVyIGZvciBjKytmaWx0IHRvIHVzZSBIUCdzIGFzc2VtYmxlciBzeW50YXgKLSAgIHRvIHNjcmFwZSBpZGVudGlmaWVycyBvdXQgb2YgaXRzIGlucHV0LCBoZXJlJ3MgdGhlIGRlZmluaXRpb24gb2YKLSAgIHRoZSBzeW1ib2wgbmFtZSBzeW50YXggZnJvbSB0aGUgSFAgYXNzZW1ibGVyIG1hbnVhbDoKLQotICAgICAgIFN5bWJvbHMgYXJlIGNvbXBvc2VkIG9mIHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlIGxldHRlcnMsIGRlY2ltYWwKLSAgICAgICBkaWdpdHMsIGRvbGxhciBzeW1ib2wsIHBlcmlvZCAoLiksIGFtcGVyc2FuZCAoJiksIHBvdW5kIHNpZ24oIykgYW5kCi0gICAgICAgdW5kZXJzY29yZSAoXykuIEEgc3ltYm9sIGNhbiBiZWdpbiB3aXRoIGEgbGV0dGVyLCBkaWdpdCB1bmRlcnNjb3JlIG9yCi0gICAgICAgZG9sbGFyIHNpZ24uIElmIGEgc3ltYm9sIGJlZ2lucyB3aXRoIGEgZGlnaXQsIGl0IG11c3QgY29udGFpbiBhCi0gICAgICAgbm9uLWRpZ2l0IGNoYXJhY3Rlci4KLQotICAgU28gaGF2ZSBmdW4uICAqLwotdm9pZAotaHBfc3ltYm9sX2FscGhhYmV0IChjaGFyICp0YWJsZSkKLXsKLSAgY2hhciAqYzsKLQotICBzdGFuZGFyZF9zeW1ib2xfYWxwaGFiZXQgKHRhYmxlKTsKLQotICBmb3IgKGMgPSAiPD4jLComW106KCl7fSI7ICpjOyBjKyspCi0gICAgdGFibGVbKHVuc2lnbmVkIGNoYXIpICpjXSA9IDE7Ci19Ci0KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGNoYXIgKnJlc3VsdDsKLSAgaW50IGM7Ci0gIGNoYXIgc3ltYm9sX2FscGhhYmV0WzI1Nl07Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKLQotICBzdHJpcF91bmRlcnNjb3JlID0gcHJlcGVuZHNfdW5kZXJzY29yZTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgIl9uczpqIiwgbG9uZ19vcHRpb25zLCAoaW50ICopIDApKSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICc/JzoKLQkgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQljYXNlICduJzoKLQkgIHN0cmlwX3VuZGVyc2NvcmUgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICBwcmludGYgKCJHTlUgJXMgKEMrKyBkZW1hbmdsZXIpLCB2ZXJzaW9uICVzXG4iLCBwcm9ncmFtX25hbWUsIHByb2dyYW1fdmVyc2lvbik7Ci0JICBleGl0ICgwKTsKLQljYXNlICdfJzoKLQkgIHN0cmlwX3VuZGVyc2NvcmUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnaic6Ci0JICBmbGFncyB8PSBETUdMX0pBVkE7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGlmIChzdHJjbXAgKG9wdGFyZywgImdudSIpID09IDApCi0JICAgIHsKLQkgICAgICBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgPSBnbnVfZGVtYW5nbGluZzsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJsdWNpZCIpID09IDApCi0JICAgIHsKLQkgICAgICBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgPSBsdWNpZF9kZW1hbmdsaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgImFybSIpID09IDApCi0JICAgIHsKLQkgICAgICBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgPSBhcm1fZGVtYW5nbGluZzsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJocCIpID09IDApCi0JICAgIHsKLQkgICAgICBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgPSBocF9kZW1hbmdsaW5nOwotCSAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJlZGciKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgPSBlZGdfZGVtYW5nbGluZzsKLSAgICAgICAgICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB1bmtub3duIGRlbWFuZ2xpbmcgc3R5bGUgYCVzJ1xuIiwKLQkJICAgICAgIHByb2dyYW1fbmFtZSwgb3B0YXJnKTsKLQkgICAgICBleGl0ICgxKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAob3B0aW5kIDwgYXJnYykKLSAgICB7Ci0gICAgICBmb3IgKCA7IG9wdGluZCA8IGFyZ2M7IG9wdGluZCsrKQotCXsKLQkgIGRlbWFuZ2xlX2l0IChhcmd2W29wdGluZF0pOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSkKLQl7Ci0JY2FzZSBnbnVfZGVtYW5nbGluZzoKLQljYXNlIGx1Y2lkX2RlbWFuZ2xpbmc6Ci0JY2FzZSBhcm1fZGVtYW5nbGluZzoKLQljYXNlIGVkZ19kZW1hbmdsaW5nOgotCSAgc3RhbmRhcmRfc3ltYm9sX2FscGhhYmV0IChzeW1ib2xfYWxwaGFiZXQpOwotCSAgYnJlYWs7Ci0JY2FzZSBocF9kZW1hbmdsaW5nOgotCSAgaHBfc3ltYm9sX2FscGhhYmV0IChzeW1ib2xfYWxwaGFiZXQpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIC8qIEZvbGtzIHNob3VsZCBleHBsaWNpdGx5IGluZGljYXRlIHRoZSBhcHByb3ByaWF0ZSBhbHBoYWJldCBmb3IKLQkgICAgIGVhY2ggZGVtYW5nbGluZy4gIFByb3ZpZGluZyBhIGRlZmF1bHQgd291bGQgYWxsb3cgdGhlCi0JICAgICBxdWVzdGlvbiB0byBnbyB1bmNvbnNpZGVyZWQuICAqLwotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBmb3IgKDs7KQotCXsKLQkgIGludCBpID0gMDsKLQkgIGMgPSBnZXRjaGFyICgpOwotCSAgLyogVHJ5IHRvIHJlYWQgYSBsYWJlbC4gICovCi0JICB3aGlsZSAoYyAhPSBFT0YgJiYgc3ltYm9sX2FscGhhYmV0W2NdKQotCSAgICB7Ci0JICAgICAgaWYgKGkgPj0gTUJVRl9TSVpFLTEpCi0JCWJyZWFrOwotCSAgICAgIG1idWZmZXJbaSsrXSA9IGM7Ci0JICAgICAgYyA9IGdldGNoYXIgKCk7Ci0JICAgIH0KLQkgIGlmIChpID4gMCkKLQkgICAgewotCSAgICAgIGludCBza2lwX2ZpcnN0ID0gMDsKLQotCSAgICAgIGlmIChtYnVmZmVyWzBdID09ICcuJykKLQkJKytza2lwX2ZpcnN0OwotCSAgICAgIGlmIChzdHJpcF91bmRlcnNjb3JlICYmIG1idWZmZXJbc2tpcF9maXJzdF0gPT0gJ18nKQotCQkrK3NraXBfZmlyc3Q7Ci0KLQkgICAgICBpZiAoc2tpcF9maXJzdCA+IGkpCi0JCXNraXBfZmlyc3QgPSBpOwotCi0JICAgICAgbWJ1ZmZlcltpXSA9IDA7Ci0KLQkgICAgICByZXN1bHQgPSBjcGx1c19kZW1hbmdsZSAobWJ1ZmZlciArIHNraXBfZmlyc3QsIGZsYWdzKTsKLQkgICAgICBpZiAocmVzdWx0KQotCQl7Ci0JCSAgaWYgKG1idWZmZXJbMF0gPT0gJy4nKQotCQkgICAgcHV0YyAoJy4nLCBzdGRvdXQpOwotCQkgIGZwdXRzIChyZXN1bHQsIHN0ZG91dCk7Ci0JCSAgZnJlZSAocmVzdWx0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJZnB1dHMgKG1idWZmZXIsIHN0ZG91dCk7Ci0KLQkgICAgICBmZmx1c2ggKHN0ZG91dCk7Ci0JICAgIH0KLQkgIGlmIChjID09IEVPRikKLQkgICAgYnJlYWs7Ci0JICBwdXRjaGFyIChjKTsKLQl9Ci0gICAgfQotCi0gIGV4aXQgKDApOwotfQotCi1zdGF0aWMgdm9pZAotZmF0YWwgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBmcHJpbnRmIChzdGRlcnIsICIlczogJXNcbiIsIHByb2dyYW1fbmFtZSwgc3RyKTsKLSAgZXhpdCAoMSk7Ci19Ci0KLVBUUgoteG1hbGxvYyAoc2l6ZSkKLSAgc2l6ZV90IHNpemU7Ci17Ci0gIHJlZ2lzdGVyIFBUUiB2YWx1ZSA9IChQVFIpIG1hbGxvYyAoc2l6ZSk7Ci0gIGlmICh2YWx1ZSA9PSAwKQotICAgIGZhdGFsICgidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIik7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotUFRSCi14cmVhbGxvYyAocHRyLCBzaXplKQotICBQVFIgcHRyOwotICBzaXplX3Qgc2l6ZTsKLXsKLSAgcmVnaXN0ZXIgUFRSIHZhbHVlID0gKFBUUikgcmVhbGxvYyAocHRyLCBzaXplKTsKLSAgaWYgKHZhbHVlID09IDApCi0gICAgZmF0YWwgKCJ2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotI2VuZGlmCS8qIG1haW4gKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9mZG1hdGNoLmMgYi9saWJpYmVydHkvZmRtYXRjaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWYwMzlmLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9mZG1hdGNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiBDb21wYXJlIHR3byBvcGVuIGZpbGUgZGVzY3JpcHRvcnMgdG8gc2VlIGlmIHRoZXkgcmVmZXIgdG8gdGhlIHNhbWUgZmlsZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyoKLQotTkFNRQotCi0JZmRtYXRjaCAtLSBzZWUgaWYgdHdvIGZpbGUgZGVzY3JpcHRvcnMgcmVmZXIgdG8gc2FtZSBmaWxlCi0KLVNZTk9QU0lTCi0KLQlpbnQgZmRtYXRjaCAoaW50IGZkMSwgaW50IGZkMikKLQotREVTQ1JJUFRJT04KLQotCUNoZWNrIHRvIHNlZSBpZiB0d28gb3BlbiBmaWxlIGRlc2NyaXB0b3JzIHJlZmVyIHRvIHRoZSBzYW1lIGZpbGUuCi0JVGhpcyBpcyB1c2VmdWwsIGZvciBleGFtcGxlLCB3aGVuIHdlIGhhdmUgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IKLQlmb3IgYW4gdW5uYW1lZCBmaWxlLCBhbmQgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQgd2UgYmVsaWV2ZSB0byAKLQljb3JyZXNwb25kIHRvIHRoYXQgZmQuICBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhcmUgZXhlYydkIHdpdGgKLQlhbiBhbHJlYWR5IG9wZW4gZmlsZSAoc3Rkb3V0IGZvciBleGFtcGxlKSBvciBmcm9tIHRoZSBTVlI0IC9wcm9jCi0JY2FsbHMgdGhhdCByZXR1cm4gb3BlbiBmaWxlIGRlc2NyaXB0b3JzIGZvciBtYXBwZWQgYWRkcmVzcyBzcGFjZXMuCi0JQWxsIHdlIGhhdmUgdG8gZG8gaXMgb3BlbiB0aGUgZmlsZSBieSBuYW1lIGFuZCBjaGVjayB0aGUgdHdvIGZpbGUKLQlkZXNjcmlwdG9ycyBmb3IgYSBtYXRjaCwgd2hpY2ggaXMgZG9uZSBieSBjb21wYXJpbmcgbWFqb3ImbWlub3IKLQlkZXZpY2UgbnVtYmVycyBhbmQgaW5vZGUgbnVtYmVycy4KLQotQlVHUwotCi0JKEZJWE1FOiBkb2VzIHRoaXMgd29yayBmb3IgbmV0d29ya3M/KQotCUl0IHdvcmtzIGZvciBORlMsIHdoaWNoIGFzc2lnbnMgYSBkZXZpY2UgbnVtYmVyIHRvIGVhY2ggbW91bnQuCi0KLSovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLWludCBmZG1hdGNoIChmZDEsIGZkMikKLQlpbnQgZmQxOwotCWludCBmZDI7Ci17Ci0gIHN0cnVjdCBzdGF0IHNidWYxOwotICBzdHJ1Y3Qgc3RhdCBzYnVmMjsKLQotICBpZiAoKGZzdGF0IChmZDEsICZzYnVmMSkgPT0gMCkgJiYKLSAgICAgIChmc3RhdCAoZmQyLCAmc2J1ZjIpID09IDApICYmCi0gICAgICAoc2J1ZjEuc3RfZGV2ID09IHNidWYyLnN0X2RldikgJiYKLSAgICAgIChzYnVmMS5zdF9pbm8gPT0gc2J1ZjIuc3RfaW5vKSkKLSAgICB7Ci0gICAgICByZXR1cm4gKDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2Zsb2F0Zm9ybWF0LmMgYi9saWJpYmVydHkvZmxvYXRmb3JtYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmMjFlNC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvZmxvYXRmb3JtYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQwMyArMCwwIEBACi0vKiBJRUVFIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgcm91dGluZXMsIGZvciBHREIsIHRoZSBHTlUgRGVidWdnZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImZsb2F0Zm9ybWF0LmgiCi0jaW5jbHVkZSA8bWF0aC5oPgkJLyogbGRleHAgKi8KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotZXh0ZXJuIHZvaWQgKm1lbWNweSAodm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBzaXplX3Qgbik7Ci1leHRlcm4gdm9pZCAqbWVtc2V0ICh2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pOwotI2Vsc2UKLWV4dGVybiBjaGFyICptZW1jcHkgKCk7Ci1leHRlcm4gY2hhciAqbWVtc2V0ICgpOwotI2VuZGlmCi0KLS8qIFRoZSBvZGRzIHRoYXQgQ0hBUl9CSVQgd2lsbCBiZSBhbnl0aGluZyBidXQgOCBhcmUgbG93IGVub3VnaCB0aGF0IEknbSBub3QKLSAgIGdvaW5nIHRvIGJvdGhlciB3aXRoIHRyeWluZyB0byBtdWNrIGFyb3VuZCB3aXRoIHdoZXRoZXIgaXQgaXMgZGVmaW5lZCBpbgotICAgYSBzeXN0ZW0gaGVhZGVyLCB3aGF0IHdlIGRvIGlmIG5vdCwgZXRjLiAgKi8KLSNkZWZpbmUgRkxPQVRGT1JNQVRfQ0hBUl9CSVQgOAotCi0vKiBmbG9hdGZvcm1hdHMgZm9yIElFRUUgc2luZ2xlIGFuZCBkb3VibGUsIGJpZyBhbmQgbGl0dGxlIGVuZGlhbi4gICovCi1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfYmlnID0KLXsKLSAgZmxvYXRmb3JtYXRfYmlnLCAzMiwgMCwgMSwgOCwgMTI3LCAyNTUsIDksIDIzLCBmbG9hdGZvcm1hdF9pbnRiaXRfbm8KLX07Ci1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfbGl0dGxlID0KLXsKLSAgZmxvYXRmb3JtYXRfbGl0dGxlLCAzMiwgMCwgMSwgOCwgMTI3LCAyNTUsIDksIDIzLCBmbG9hdGZvcm1hdF9pbnRiaXRfbm8KLX07Ci1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfYmlnID0KLXsKLSAgZmxvYXRmb3JtYXRfYmlnLCA2NCwgMCwgMSwgMTEsIDEwMjMsIDIwNDcsIDEyLCA1MiwgZmxvYXRmb3JtYXRfaW50Yml0X25vCi19OwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZSA9Ci17Ci0gIGZsb2F0Zm9ybWF0X2xpdHRsZSwgNjQsIDAsIDEsIDExLCAxMDIzLCAyMDQ3LCAxMiwgNTIsIGZsb2F0Zm9ybWF0X2ludGJpdF9ubwotfTsKLQotLyogZmxvYXRmb3JtYXQgZm9yIElFRUUgZG91YmxlLCBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIsIHdpdGggYmlnIGVuZGlhbiB3b3JkCi0gICBvcmRlcmluZywgYXMgb24gdGhlIEFSTS4gICovCi0KLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9saXR0bGVieXRlX2JpZ3dvcmQgPQotewotICBmbG9hdGZvcm1hdF9saXR0bGVieXRlX2JpZ3dvcmQsIDY0LCAwLCAxLCAxMSwgMTAyMywgMjA0NywgMTIsIDUyLCBmbG9hdGZvcm1hdF9pbnRiaXRfbm8KLX07Ci0KLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pMzg3X2V4dCA9Ci17Ci0gIGZsb2F0Zm9ybWF0X2xpdHRsZSwgODAsIDAsIDEsIDE1LCAweDNmZmYsIDB4N2ZmZiwgMTYsIDY0LAotICBmbG9hdGZvcm1hdF9pbnRiaXRfeWVzCi19OwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X202ODg4MV9leHQgPQotewotICAvKiBOb3RlIHRoYXQgdGhlIGJpdHMgZnJvbSAxNiB0byAzMSBhcmUgdW51c2VkLiAgKi8KLSAgZmxvYXRmb3JtYXRfYmlnLCA5NiwgMCwgMSwgMTUsIDB4M2ZmZiwgMHg3ZmZmLCAzMiwgNjQsIGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMKLX07Ci1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaTk2MF9leHQgPQotewotICAvKiBOb3RlIHRoYXQgdGhlIGJpdHMgZnJvbSAwIHRvIDE1IGFyZSB1bnVzZWQuICAqLwotICBmbG9hdGZvcm1hdF9saXR0bGUsIDk2LCAxNiwgMTcsIDE1LCAweDNmZmYsIDB4N2ZmZiwgMzIsIDY0LAotICBmbG9hdGZvcm1hdF9pbnRiaXRfeWVzCi19OwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X204ODExMF9leHQgPQotewotI2lmZGVmIEhBUlJJU19GTE9BVF9GT1JNQVQKLSAgLyogSGFycmlzIHVzZXMgcmF3IGZvcm1hdCAxMjggYnl0ZXMgbG9uZywgYnV0IHRoZSBudW1iZXIgaXMganVzdCBhbiBpZWVlCi0gICAgIGRvdWJsZSwgYW5kIHRoZSBsYXN0IDY0IGJpdHMgYXJlIHdhc3RlZC4gKi8KLSAgZmxvYXRmb3JtYXRfYmlnLDEyOCwgMCwgMSwgMTEsICAweDNmZiwgIDB4N2ZmLCAxMiwgNTIsCi0gIGZsb2F0Zm9ybWF0X2ludGJpdF9ubwotI2Vsc2UKLSAgZmxvYXRmb3JtYXRfYmlnLCA4MCwgMCwgMSwgMTUsIDB4M2ZmZiwgMHg3ZmZmLCAxNiwgNjQsCi0gIGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMKLSNlbmRpZiAvKiBIQVJSSVNfRkxPQVRfRk9STUFUICovCi19OwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2FybV9leHQgPQotewotICAvKiBCaXRzIDEgdG8gMTYgYXJlIHVudXNlZC4gICovCi0gIGZsb2F0Zm9ybWF0X2JpZywgOTYsIDAsIDE3LCAxNSwgMHgzZmZmLCAweDdmZmYsIDMyLCA2NCwKLSAgZmxvYXRmb3JtYXRfaW50Yml0X3llcwotfTsKLQwKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9maWVsZCBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosCi0JCQkJCWVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycywKLQkJCQkJdW5zaWduZWQgaW50LAotCQkJCQl1bnNpZ25lZCBpbnQsCi0JCQkJCXVuc2lnbmVkIGludCkpOwotCi0vKiBFeHRyYWN0IGEgZmllbGQgd2hpY2ggc3RhcnRzIGF0IFNUQVJUIGFuZCBpcyBMRU4gYnl0ZXMgbG9uZy4gIERBVEEgYW5kCi0gICBUT1RBTF9MRU4gYXJlIHRoZSB0aGluZyB3ZSBhcmUgZXh0cmFjdGluZyBpdCBmcm9tLCBpbiBieXRlb3JkZXIgT1JERVIuICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWdldF9maWVsZCAoZGF0YSwgb3JkZXIsIHRvdGFsX2xlbiwgc3RhcnQsIGxlbikKLSAgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgZW51bSBmbG9hdGZvcm1hdF9ieXRlb3JkZXJzIG9yZGVyOwotICAgICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuOwotICAgICB1bnNpZ25lZCBpbnQgc3RhcnQ7Ci0gICAgIHVuc2lnbmVkIGludCBsZW47Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcmVzdWx0OwotICB1bnNpZ25lZCBpbnQgY3VyX2J5dGU7Ci0gIGludCBjdXJfYml0c2hpZnQ7Ci0KLSAgLyogU3RhcnQgYXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IHBhcnQgb2YgdGhlIGZpZWxkLiAgKi8KLSAgY3VyX2J5dGUgPSAoc3RhcnQgKyBsZW4pIC8gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUpCi0gICAgY3VyX2J5dGUgPSAodG90YWxfbGVuIC8gRkxPQVRGT1JNQVRfQ0hBUl9CSVQpIC0gY3VyX2J5dGUgLSAxOwotICBjdXJfYml0c2hpZnQgPQotICAgICgoc3RhcnQgKyBsZW4pICUgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpIC0gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gIHJlc3VsdCA9ICooZGF0YSArIGN1cl9ieXRlKSA+PiAoLWN1cl9iaXRzaGlmdCk7Ci0gIGN1cl9iaXRzaGlmdCArPSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgaWYgKG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZSkKLSAgICArK2N1cl9ieXRlOwotICBlbHNlCi0gICAgLS1jdXJfYnl0ZTsKLQotICAvKiBNb3ZlIHRvd2FyZHMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgcGFydCBvZiB0aGUgZmllbGQuICAqLwotICB3aGlsZSAoY3VyX2JpdHNoaWZ0IDwgbGVuKQotICAgIHsKLSAgICAgIGlmIChsZW4gLSBjdXJfYml0c2hpZnQgPCBGTE9BVEZPUk1BVF9DSEFSX0JJVCkKLQkvKiBUaGlzIGlzIHRoZSBsYXN0IGJ5dGU7IHplcm8gb3V0IHRoZSBiaXRzIHdoaWNoIGFyZSBub3QgcGFydCBvZgotCSAgIHRoaXMgZmllbGQuICAqLwotCXJlc3VsdCB8PQotCSAgKCooZGF0YSArIGN1cl9ieXRlKSAmICgoMSA8PCAobGVuIC0gY3VyX2JpdHNoaWZ0KSkgLSAxKSkKLQkgICAgPDwgY3VyX2JpdHNoaWZ0OwotICAgICAgZWxzZQotCXJlc3VsdCB8PSAqKGRhdGEgKyBjdXJfYnl0ZSkgPDwgY3VyX2JpdHNoaWZ0OwotICAgICAgY3VyX2JpdHNoaWZ0ICs9IEZMT0FURk9STUFUX0NIQVJfQklUOwotICAgICAgaWYgKG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZSkKLQkrK2N1cl9ieXRlOwotICAgICAgZWxzZQotCS0tY3VyX2J5dGU7Ci0gICAgfQotICByZXR1cm4gcmVzdWx0OwotfQotICAKLSNpZm5kZWYgbWluCi0jZGVmaW5lIG1pbihhLCBiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotI2VuZGlmCi0KLS8qIENvbnZlcnQgZnJvbSBGTVQgdG8gYSBkb3VibGUuCi0gICBGUk9NIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBleHRlbmRlZCBmbG9hdC4KLSAgIFN0b3JlIHRoZSBkb3VibGUgaW4gKlRPLiAgKi8KLQotdm9pZAotZmxvYXRmb3JtYXRfdG9fZG91YmxlIChmbXQsIGZyb20sIHRvKQotICAgICBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKmZtdDsKLSAgICAgY2hhciAqZnJvbTsKLSAgICAgZG91YmxlICp0bzsKLXsKLSAgdW5zaWduZWQgY2hhciAqdWZyb20gPSAodW5zaWduZWQgY2hhciAqKWZyb207Ci0gIGRvdWJsZSBkdG87Ci0gIGxvbmcgZXhwb25lbnQ7Ci0gIHVuc2lnbmVkIGxvbmcgbWFudDsKLSAgdW5zaWduZWQgaW50IG1hbnRfYml0cywgbWFudF9vZmY7Ci0gIGludCBtYW50X2JpdHNfbGVmdDsKLSAgaW50IHNwZWNpYWxfZXhwb25lbnQ7CQkvKiBJdCdzIGEgTmFOLCBkZW5vcm0gb3IgemVybyAqLwotCi0gIGV4cG9uZW50ID0gZ2V0X2ZpZWxkICh1ZnJvbSwgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLAotCQkJZm10LT5leHBfc3RhcnQsIGZtdC0+ZXhwX2xlbik7Ci0gIC8qIE5vdGUgdGhhdCBpZiBleHBvbmVudCBpbmRpY2F0ZXMgYSBOYU4sIHdlIGNhbid0IHJlYWxseSBkbyBhbnl0aGluZyB1c2VmdWwKLSAgICAgKG5vdCBrbm93aW5nIGlmIHRoZSBob3N0IGhhcyBOYU4ncywgb3IgaG93IHRvIGJ1aWxkIG9uZSkuICBTbyBpdCB3aWxsCi0gICAgIGVuZCB1cCBhcyBhbiBpbmZpbml0eSBvciBzb21ldGhpbmcgY2xvc2U7IHRoYXQgaXMgT0suICAqLwotCi0gIG1hbnRfYml0c19sZWZ0ID0gZm10LT5tYW5fbGVuOwotICBtYW50X29mZiA9IGZtdC0+bWFuX3N0YXJ0OwotICBkdG8gPSAwLjA7Ci0KLSAgc3BlY2lhbF9leHBvbmVudCA9IGV4cG9uZW50ID09IDAgfHwgZXhwb25lbnQgPT0gZm10LT5leHBfbmFuOwotCi0gIC8qIERvbid0IGJpYXMgemVybydzLCBkZW5vcm1zIG9yIE5hTnMuICAqLwotICBpZiAoIXNwZWNpYWxfZXhwb25lbnQpCi0gICAgZXhwb25lbnQgLT0gZm10LT5leHBfYmlhczsKLQotICAvKiBCdWlsZCB0aGUgcmVzdWx0IGFsZ2VicmFpY2FsbHkuICBNaWdodCBnbyBpbmZpbml0ZSwgdW5kZXJmbG93LCBldGM7Ci0gICAgIHdobyBjYXJlcy4gKi8KLQotICAvKiBJZiB0aGlzIGZvcm1hdCB1c2VzIGEgaGlkZGVuIGJpdCwgZXhwbGljaXRseSBhZGQgaXQgaW4gbm93LiAgT3RoZXJ3aXNlLAotICAgICBpbmNyZW1lbnQgdGhlIGV4cG9uZW50IGJ5IG9uZSB0byBhY2NvdW50IGZvciB0aGUgaW50ZWdlciBiaXQuICAqLwotCi0gIGlmICghc3BlY2lhbF9leHBvbmVudCkKLSAgICB7Ci0gICAgICBpZiAoZm10LT5pbnRiaXQgPT0gZmxvYXRmb3JtYXRfaW50Yml0X25vKQotCWR0byA9IGxkZXhwICgxLjAsIGV4cG9uZW50KTsKLSAgICAgIGVsc2UKLQlleHBvbmVudCsrOwotICAgIH0KLQotICB3aGlsZSAobWFudF9iaXRzX2xlZnQgPiAwKQotICAgIHsKLSAgICAgIG1hbnRfYml0cyA9IG1pbiAobWFudF9iaXRzX2xlZnQsIDMyKTsKLQotICAgICAgbWFudCA9IGdldF9maWVsZCAodWZyb20sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwKLQkJCSBtYW50X29mZiwgbWFudF9iaXRzKTsKLQotICAgICAgZHRvICs9IGxkZXhwICgoZG91YmxlKW1hbnQsIGV4cG9uZW50IC0gbWFudF9iaXRzKTsKLSAgICAgIGV4cG9uZW50IC09IG1hbnRfYml0czsKLSAgICAgIG1hbnRfb2ZmICs9IG1hbnRfYml0czsKLSAgICAgIG1hbnRfYml0c19sZWZ0IC09IG1hbnRfYml0czsKLSAgICB9Ci0KLSAgLyogTmVnYXRlIGl0IGlmIG5lZ2F0aXZlLiAgKi8KLSAgaWYgKGdldF9maWVsZCAodWZyb20sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwgZm10LT5zaWduX3N0YXJ0LCAxKSkKLSAgICBkdG8gPSAtZHRvOwotICAqdG8gPSBkdG87Ci19Ci0MCi1zdGF0aWMgdm9pZCBwdXRfZmllbGQgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBlbnVtIGZsb2F0Zm9ybWF0X2J5dGVvcmRlcnMsCi0JCQkgICAgICAgdW5zaWduZWQgaW50LAotCQkJICAgICAgIHVuc2lnbmVkIGludCwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZykpOwotCi0vKiBTZXQgYSBmaWVsZCB3aGljaCBzdGFydHMgYXQgU1RBUlQgYW5kIGlzIExFTiBieXRlcyBsb25nLiAgREFUQSBhbmQKLSAgIFRPVEFMX0xFTiBhcmUgdGhlIHRoaW5nIHdlIGFyZSBleHRyYWN0aW5nIGl0IGZyb20sIGluIGJ5dGVvcmRlciBPUkRFUi4gICovCi1zdGF0aWMgdm9pZAotcHV0X2ZpZWxkIChkYXRhLCBvcmRlciwgdG90YWxfbGVuLCBzdGFydCwgbGVuLCBzdHVmZl90b19wdXQpCi0gICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIGVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyBvcmRlcjsKLSAgICAgdW5zaWduZWQgaW50IHRvdGFsX2xlbjsKLSAgICAgdW5zaWduZWQgaW50IHN0YXJ0OwotICAgICB1bnNpZ25lZCBpbnQgbGVuOwotICAgICB1bnNpZ25lZCBsb25nIHN0dWZmX3RvX3B1dDsKLXsKLSAgdW5zaWduZWQgaW50IGN1cl9ieXRlOwotICBpbnQgY3VyX2JpdHNoaWZ0OwotCi0gIC8qIFN0YXJ0IGF0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSBmaWVsZC4gICovCi0gIGN1cl9ieXRlID0gKHN0YXJ0ICsgbGVuKSAvIEZMT0FURk9STUFUX0NIQVJfQklUOwotICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlKQotICAgIGN1cl9ieXRlID0gKHRvdGFsX2xlbiAvIEZMT0FURk9STUFUX0NIQVJfQklUKSAtIGN1cl9ieXRlIC0gMTsKLSAgY3VyX2JpdHNoaWZ0ID0KLSAgICAoKHN0YXJ0ICsgbGVuKSAlIEZMT0FURk9STUFUX0NIQVJfQklUKSAtIEZMT0FURk9STUFUX0NIQVJfQklUOwotICAqKGRhdGEgKyBjdXJfYnl0ZSkgJj0KLSAgICB+KCgoMSA8PCAoKHN0YXJ0ICsgbGVuKSAlIEZMT0FURk9STUFUX0NIQVJfQklUKSkgLSAxKSA8PCAoLWN1cl9iaXRzaGlmdCkpOwotICAqKGRhdGEgKyBjdXJfYnl0ZSkgfD0KLSAgICAoc3R1ZmZfdG9fcHV0ICYgKCgxIDw8IEZMT0FURk9STUFUX0NIQVJfQklUKSAtIDEpKSA8PCAoLWN1cl9iaXRzaGlmdCk7Ci0gIGN1cl9iaXRzaGlmdCArPSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgaWYgKG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZSkKLSAgICArK2N1cl9ieXRlOwotICBlbHNlCi0gICAgLS1jdXJfYnl0ZTsKLQotICAvKiBNb3ZlIHRvd2FyZHMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgcGFydCBvZiB0aGUgZmllbGQuICAqLwotICB3aGlsZSAoY3VyX2JpdHNoaWZ0IDwgbGVuKQotICAgIHsKLSAgICAgIGlmIChsZW4gLSBjdXJfYml0c2hpZnQgPCBGTE9BVEZPUk1BVF9DSEFSX0JJVCkKLQl7Ci0JICAvKiBUaGlzIGlzIHRoZSBsYXN0IGJ5dGUuICAqLwotCSAgKihkYXRhICsgY3VyX2J5dGUpICY9Ci0JICAgIH4oKDEgPDwgKGxlbiAtIGN1cl9iaXRzaGlmdCkpIC0gMSk7Ci0JICAqKGRhdGEgKyBjdXJfYnl0ZSkgfD0gKHN0dWZmX3RvX3B1dCA+PiBjdXJfYml0c2hpZnQpOwotCX0KLSAgICAgIGVsc2UKLQkqKGRhdGEgKyBjdXJfYnl0ZSkgPSAoKHN0dWZmX3RvX3B1dCA+PiBjdXJfYml0c2hpZnQpCi0JCQkgICAgICAmICgoMSA8PCBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSAxKSk7Ci0gICAgICBjdXJfYml0c2hpZnQgKz0gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gICAgICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlKQotCSsrY3VyX2J5dGU7Ci0gICAgICBlbHNlCi0JLS1jdXJfYnl0ZTsKLSAgICB9Ci19Ci0KLS8qIFRoZSBjb252ZXJzZTogY29udmVydCB0aGUgZG91YmxlICpGUk9NIHRvIGFuIGV4dGVuZGVkIGZsb2F0Ci0gICBhbmQgc3RvcmUgd2hlcmUgVE8gcG9pbnRzLiAgTmVpdGhlciBGUk9NIG5vciBUTyBoYXZlIGFueSBhbGlnbm1lbnQKLSAgIHJlc3RyaWN0aW9ucy4gICovCi0KLXZvaWQKLWZsb2F0Zm9ybWF0X2Zyb21fZG91YmxlIChmbXQsIGZyb20sIHRvKQotICAgICBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKmZtdDsKLSAgICAgZG91YmxlICpmcm9tOwotICAgICBjaGFyICp0bzsKLXsKLSAgZG91YmxlIGRmcm9tOwotICBpbnQgZXhwb25lbnQ7Ci0gIGRvdWJsZSBtYW50OwotICB1bnNpZ25lZCBpbnQgbWFudF9iaXRzLCBtYW50X29mZjsKLSAgaW50IG1hbnRfYml0c19sZWZ0OwotICB1bnNpZ25lZCBjaGFyICp1dG8gPSAodW5zaWduZWQgY2hhciAqKXRvOwotCi0gIG1lbWNweSAoJmRmcm9tLCBmcm9tLCBzaXplb2YgKGRmcm9tKSk7Ci0gIG1lbXNldCAodXRvLCAwLCBmbXQtPnRvdGFsc2l6ZSAvIEZMT0FURk9STUFUX0NIQVJfQklUKTsKLSAgaWYgKGRmcm9tID09IDApCi0gICAgcmV0dXJuOwkJCS8qIFJlc3VsdCBpcyB6ZXJvICovCi0gIGlmIChkZnJvbSAhPSBkZnJvbSkKLSAgICB7Ci0gICAgICAvKiBGcm9tIGlzIE5hTiAqLwotICAgICAgcHV0X2ZpZWxkICh1dG8sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwgZm10LT5leHBfc3RhcnQsCi0JCSBmbXQtPmV4cF9sZW4sIGZtdC0+ZXhwX25hbik7Ci0gICAgICAvKiBCZSBzdXJlIGl0J3Mgbm90IGluZmluaXR5LCBidXQgTmFOIHZhbHVlIGlzIGlycmVsICovCi0gICAgICBwdXRfZmllbGQgKHV0bywgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLCBmbXQtPm1hbl9zdGFydCwKLQkJIDMyLCAxKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSWYgbmVnYXRpdmUsIHNldCB0aGUgc2lnbiBiaXQuICAqLwotICBpZiAoZGZyb20gPCAwKQotICAgIHsKLSAgICAgIHB1dF9maWVsZCAodXRvLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsIGZtdC0+c2lnbl9zdGFydCwgMSwgMSk7Ci0gICAgICBkZnJvbSA9IC1kZnJvbTsKLSAgICB9Ci0KLSAgLyogSG93IHRvIHRlbGwgYW4gaW5maW5pdHkgZnJvbSBhbiBvcmRpbmFyeSBudW1iZXI/ICBGSVhNRS1zb21lZGF5ICovCi0KLSAgbWFudCA9IGZyZXhwIChkZnJvbSwgJmV4cG9uZW50KTsKLSAgcHV0X2ZpZWxkICh1dG8sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwgZm10LT5leHBfc3RhcnQsIGZtdC0+ZXhwX2xlbiwKLQkgICAgIGV4cG9uZW50ICsgZm10LT5leHBfYmlhcyAtIDEpOwotCi0gIG1hbnRfYml0c19sZWZ0ID0gZm10LT5tYW5fbGVuOwotICBtYW50X29mZiA9IGZtdC0+bWFuX3N0YXJ0OwotICB3aGlsZSAobWFudF9iaXRzX2xlZnQgPiAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbWFudF9sb25nOwotICAgICAgbWFudF9iaXRzID0gbWFudF9iaXRzX2xlZnQgPCAzMiA/IG1hbnRfYml0c19sZWZ0IDogMzI7Ci0KLSAgICAgIG1hbnQgKj0gNDI5NDk2NzI5Ni4wOwotICAgICAgbWFudF9sb25nID0gKHVuc2lnbmVkIGxvbmcpbWFudDsKLSAgICAgIG1hbnQgLT0gbWFudF9sb25nOwotCi0gICAgICAvKiBJZiB0aGUgaW50ZWdlciBiaXQgaXMgaW1wbGljaXQsIHRoZW4gd2UgbmVlZCB0byBkaXNjYXJkIGl0LgotCSBJZiB3ZSBhcmUgZGlzY2FyZGluZyBhIHplcm8sIHdlIHNob3VsZCBiZSAoYnV0IGFyZSBub3QpIGNyZWF0aW5nCi0JIGEgZGVub3JtYWxpemVkCW51bWJlciB3aGljaCBtZWFucyBhZGp1c3RpbmcgdGhlIGV4cG9uZW50Ci0JIChJIHRoaW5rKS4gICovCi0gICAgICBpZiAobWFudF9iaXRzX2xlZnQgPT0gZm10LT5tYW5fbGVuCi0JICAmJiBmbXQtPmludGJpdCA9PSBmbG9hdGZvcm1hdF9pbnRiaXRfbm8pCi0JewotCSAgbWFudF9sb25nICY9IDB4N2ZmZmZmZmY7Ci0JICBtYW50X2JpdHMgLT0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChtYW50X2JpdHMgPCAzMikKLQl7Ci0JICAvKiBUaGUgYml0cyB3ZSB3YW50IGFyZSBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBNQU5UX0JJVFMgYml0cyBvZgotCSAgICAgbWFudF9sb25nLiAgTW92ZSB0aGVtIHRvIHRoZSBsZWFzdCBzaWduaWZpY2FudC4gICovCi0JICBtYW50X2xvbmcgPj49IDMyIC0gbWFudF9iaXRzOwotCX0KLQotICAgICAgcHV0X2ZpZWxkICh1dG8sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwKLQkJIG1hbnRfb2ZmLCBtYW50X2JpdHMsIG1hbnRfbG9uZyk7Ci0gICAgICBtYW50X29mZiArPSBtYW50X2JpdHM7Ci0gICAgICBtYW50X2JpdHNfbGVmdCAtPSBtYW50X2JpdHM7Ci0gICAgfQotfQotCi0KLSNpZmRlZiBJRUVFX0RFQlVHCi0KLS8qIFRoaXMgaXMgdG8gYmUgcnVuIG9uIGEgaG9zdCB3aGljaCB1c2VzIElFRUUgZmxvYXRpbmcgcG9pbnQuICAqLwotCi12b2lkCi1pZWVlX3Rlc3QgKG4pCi0gICAgIGRvdWJsZSBuOwotewotICBkb3VibGUgcmVzdWx0OwotICBjaGFyIGV4dGVuWzE2XTsKLQotICBmbG9hdGZvcm1hdF90b19kb3VibGUgKCZmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9iaWcsICZuLCAmcmVzdWx0KTsKLSAgaWYgKG4gIT0gcmVzdWx0KQotICAgIHByaW50ZiAoIkRpZmZlcih0byk6ICUuMjBnIC0+ICUuMjBnXG4iLCBuLCByZXN1bHQpOwotICBmbG9hdGZvcm1hdF9mcm9tX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2JpZywgJm4sICZyZXN1bHQpOwotICBpZiAobiAhPSByZXN1bHQpCi0gICAgcHJpbnRmICgiRGlmZmVyKGZyb20pOiAlLjIwZyAtPiAlLjIwZ1xuIiwgbiwgcmVzdWx0KTsKLQotICBmbG9hdGZvcm1hdF9mcm9tX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X202ODg4MV9leHQsICZuLCBleHRlbik7Ci0gIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X202ODg4MV9leHQsIGV4dGVuLCAmcmVzdWx0KTsKLSAgaWYgKG4gIT0gcmVzdWx0KQotICAgIHByaW50ZiAoIkRpZmZlcih0bytmcm9tKTogJS4yMGcgLT4gJS4yMGdcbiIsIG4sIHJlc3VsdCk7Ci0KLSNpZiBJRUVFX0RFQlVHID4gMQotICAvKiBUaGlzIGlzIHRvIGJlIHJ1biBvbiBhIGhvc3Qgd2hpY2ggdXNlcyA2ODg4MSBmb3JtYXQuICAqLwotICB7Ci0gICAgbG9uZyBkb3VibGUgZXggPSAqKGxvbmcgZG91YmxlICopZXh0ZW47Ci0gICAgaWYgKGV4ICE9IG4pCi0gICAgICBwcmludGYgKCJEaWZmZXIoZnJvbSB2cy4gZXh0ZW5kZWQpOiAlLjIwZ1xuIiwgbik7Ci0gIH0KLSNlbmRpZgotfQotCi1pbnQKLW1haW4gKCkKLXsKLSAgaWVlZV90ZXN0ICgwLjUpOwotICBpZWVlX3Rlc3QgKDI1Ni4wKTsKLSAgaWVlZV90ZXN0ICgwLjEyMzQ1KTsKLSAgaWVlZV90ZXN0ICgyMzQyMzUuNzg5MDcyMzQpOwotICBpZWVlX3Rlc3QgKC01MTIuMCk7Ci0gIGllZWVfdGVzdCAoLTAuMDA0MzIxKTsKLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9mbm1hdGNoLmMgYi9saWJpYmVydHkvZm5tYXRjaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTliZmU2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9mbm1hdGNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1OT1RFOiBUaGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0aGlzIGZpbGUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5LgotQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQHByZXAuYWkubWl0LmVkdS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaWYgZGVmaW5lZCAoQ09ORklHX0JST0tFVFMpCi0vKiBXZSB1c2UgPGNvbmZpZy5oPiBpbnN0ZWFkIG9mICJjb25maWcuaCIgc28gdGhhdCBhIGNvbXBpbGF0aW9uCi0gICB1c2luZyAtSS4gLUkkc3JjZGlyIHdpbGwgdXNlIC4vY29uZmlnLmggcmF0aGVyIHRoYW4gJHNyY2Rpci9jb25maWcuaAotICAgKHdoaWNoIGl0IHdvdWxkIGRvIGJlY2F1c2UgaXQgZm91bmQgdGhpcyBmaWxlIGluICRzcmNkaXIpLiAgKi8KLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbHNlCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLSNlbmRpZgotCi0KLSNpZm5kZWYgX0dOVV9TT1VSQ0UKLSNkZWZpbmUgX0dOVV9TT1VSQ0UKLSNlbmRpZgotCi0vKiBUaGlzIGNvZGUgdG8gdW5kZWYgY29uc3QgYWRkZWQgaW4gbGliaWJlcnR5LiAgKi8KLSNpZm5kZWYgX19TVERDX18KLS8qIFRoaXMgaXMgYSBzZXBhcmF0ZSBjb25kaXRpb25hbCBzaW5jZSBzb21lIHN0ZGMgc3lzdGVtcwotICAgcmVqZWN0IGBkZWZpbmVkIChjb25zdCknLiAgKi8KLSNpZm5kZWYgY29uc3QKLSNkZWZpbmUgY29uc3QKLSNlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZubWF0Y2guaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0KLS8qIENvbW1lbnQgb3V0IGFsbCB0aGlzIGNvZGUgaWYgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBMaWJyYXJ5LCBhbmQgYXJlIG5vdAotICAgYWN0dWFsbHkgY29tcGlsaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZi4gIFRoaXMgY29kZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQwotICAgTGlicmFyeSwgYnV0IGFsc28gaW5jbHVkZWQgaW4gbWFueSBvdGhlciBHTlUgZGlzdHJpYnV0aW9ucy4gIENvbXBpbGluZwotICAgYW5kIGxpbmtpbmcgaW4gdGhpcyBjb2RlIGlzIGEgd2FzdGUgd2hlbiB1c2luZyB0aGUgR05VIEMgbGlicmFyeQotICAgKGVzcGVjaWFsbHkgaWYgaXQgaXMgYSBzaGFyZWQgbGlicmFyeSkuICBSYXRoZXIgdGhhbiBoYXZpbmcgZXZlcnkgR05VCi0gICBwcm9ncmFtIHVuZGVyc3RhbmQgYGNvbmZpZ3VyZSAtLXdpdGgtZ251LWxpYmMnIGFuZCBvbWl0IHRoZSBvYmplY3QgZmlsZXMsCi0gICBpdCBpcyBzaW1wbGVyIHRvIGp1c3QgZG8gdGhpcyBpbiB0aGUgc291cmNlIGZvciBlYWNoIHN1Y2ggZmlsZS4gICovCi0KLSNpZiBkZWZpbmVkIChfTElCQykgfHwgIWRlZmluZWQgKF9fR05VX0xJQlJBUllfXykKLQotCi0jaWYgIWRlZmluZWQoX19HTlVfTElCUkFSWV9fKSAmJiAhZGVmaW5lZChTVERDX0hFQURFUlMpCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0KLS8qIE1hdGNoIFNUUklORyBhZ2FpbnN0IHRoZSBmaWxlbmFtZSBwYXR0ZXJuIFBBVFRFUk4sIHJldHVybmluZyB6ZXJvIGlmCi0gICBpdCBtYXRjaGVzLCBub256ZXJvIGlmIG5vdC4gICovCi1pbnQKLWZubWF0Y2ggKHBhdHRlcm4sIHN0cmluZywgZmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKnBhdHRlcm47Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgaW50IGZsYWdzOwotewotICByZWdpc3RlciBjb25zdCBjaGFyICpwID0gcGF0dGVybiwgKm4gPSBzdHJpbmc7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgYzsKLQotLyogTm90ZSB0aGF0IHRoaXMgZXZhbHV0ZXMgQyBtYW55IHRpbWVzLiAgKi8KLSNkZWZpbmUgRk9MRChjKQkoKGZsYWdzICYgRk5NX0NBU0VGT0xEKSAmJiBpc3VwcGVyIChjKSA/IHRvbG93ZXIgKGMpIDogKGMpKQotCi0gIHdoaWxlICgoYyA9ICpwKyspICE9ICdcMCcpCi0gICAgewotICAgICAgYyA9IEZPTEQgKGMpOwotCi0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJz8nOgotCSAgaWYgKCpuID09ICdcMCcpCi0JICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQkgIGVsc2UgaWYgKChmbGFncyAmIEZOTV9GSUxFX05BTUUpICYmICpuID09ICcvJykKLQkgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCSAgZWxzZSBpZiAoKGZsYWdzICYgRk5NX1BFUklPRCkgJiYgKm4gPT0gJy4nICYmCi0JCSAgIChuID09IHN0cmluZyB8fCAoKGZsYWdzICYgRk5NX0ZJTEVfTkFNRSkgJiYgblstMV0gPT0gJy8nKSkpCi0JICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnXFwnOgotCSAgaWYgKCEoZmxhZ3MgJiBGTk1fTk9FU0NBUEUpKQotCSAgICB7Ci0JICAgICAgYyA9ICpwKys7Ci0JICAgICAgYyA9IEZPTEQgKGMpOwotCSAgICB9Ci0JICBpZiAoRk9MRCAoKHVuc2lnbmVkIGNoYXIpKm4pICE9IGMpCi0JICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnKic6Ci0JICBpZiAoKGZsYWdzICYgRk5NX1BFUklPRCkgJiYgKm4gPT0gJy4nICYmCi0JICAgICAgKG4gPT0gc3RyaW5nIHx8ICgoZmxhZ3MgJiBGTk1fRklMRV9OQU1FKSAmJiBuWy0xXSA9PSAnLycpKSkKLQkgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCi0JICBmb3IgKGMgPSAqcCsrOyBjID09ICc/JyB8fCBjID09ICcqJzsgYyA9ICpwKyssICsrbikKLQkgICAgaWYgKCgoZmxhZ3MgJiBGTk1fRklMRV9OQU1FKSAmJiAqbiA9PSAnLycpIHx8Ci0JCShjID09ICc/JyAmJiAqbiA9PSAnXDAnKSkKLQkgICAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0KLQkgIGlmIChjID09ICdcMCcpCi0JICAgIHJldHVybiAwOwotCi0JICB7Ci0JICAgIHVuc2lnbmVkIGNoYXIgYzEgPSAoIShmbGFncyAmIEZOTV9OT0VTQ0FQRSkgJiYgYyA9PSAnXFwnKSA/ICpwIDogYzsKLQkgICAgYzEgPSBGT0xEIChjMSk7Ci0JICAgIGZvciAoLS1wOyAqbiAhPSAnXDAnOyArK24pCi0JICAgICAgaWYgKChjID09ICdbJyB8fCBGT0xEICgodW5zaWduZWQgY2hhcikqbikgPT0gYzEpICYmCi0JCSAgZm5tYXRjaCAocCwgbiwgZmxhZ3MgJiB+Rk5NX1BFUklPRCkgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQkgIH0KLQotCWNhc2UgJ1snOgotCSAgewotCSAgICAvKiBOb256ZXJvIGlmIHRoZSBzZW5zZSBvZiB0aGUgY2hhcmFjdGVyIGNsYXNzIGlzIGludmVydGVkLiAgKi8KLQkgICAgcmVnaXN0ZXIgaW50IG5vdDsKLQotCSAgICBpZiAoKm4gPT0gJ1wwJykKLQkgICAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0KLQkgICAgaWYgKChmbGFncyAmIEZOTV9QRVJJT0QpICYmICpuID09ICcuJyAmJgotCQkobiA9PSBzdHJpbmcgfHwgKChmbGFncyAmIEZOTV9GSUxFX05BTUUpICYmIG5bLTFdID09ICcvJykpKQotCSAgICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQotCSAgICBub3QgPSAoKnAgPT0gJyEnIHx8ICpwID09ICdeJyk7Ci0JICAgIGlmIChub3QpCi0JICAgICAgKytwOwotCi0JICAgIGMgPSAqcCsrOwotCSAgICBmb3IgKDs7KQotCSAgICAgIHsKLQkJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBjc3RhcnQgPSBjLCBjZW5kID0gYzsKLQotCQlpZiAoIShmbGFncyAmIEZOTV9OT0VTQ0FQRSkgJiYgYyA9PSAnXFwnKQotCQkgIGNzdGFydCA9IGNlbmQgPSAqcCsrOwotCi0JCWNzdGFydCA9IGNlbmQgPSBGT0xEIChjc3RhcnQpOwotCi0JCWlmIChjID09ICdcMCcpCi0JCSAgLyogWyAodW50ZXJtaW5hdGVkKSBsb3Nlcy4gICovCi0JCSAgcmV0dXJuIEZOTV9OT01BVENIOwotCi0JCWMgPSAqcCsrOwotCQljID0gRk9MRCAoYyk7Ci0KLQkJaWYgKChmbGFncyAmIEZOTV9GSUxFX05BTUUpICYmIGMgPT0gJy8nKQotCQkgIC8qIFsvXSBjYW4gbmV2ZXIgbWF0Y2guICAqLwotCQkgIHJldHVybiBGTk1fTk9NQVRDSDsKLQotCQlpZiAoYyA9PSAnLScgJiYgKnAgIT0gJ10nKQotCQkgIHsKLQkJICAgIGNlbmQgPSAqcCsrOwotCQkgICAgaWYgKCEoZmxhZ3MgJiBGTk1fTk9FU0NBUEUpICYmIGNlbmQgPT0gJ1xcJykKLQkJICAgICAgY2VuZCA9ICpwKys7Ci0JCSAgICBpZiAoY2VuZCA9PSAnXDAnKQotCQkgICAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0JCSAgICBjZW5kID0gRk9MRCAoY2VuZCk7Ci0KLQkJICAgIGMgPSAqcCsrOwotCQkgIH0KLQotCQlpZiAoRk9MRCAoKHVuc2lnbmVkIGNoYXIpKm4pID49IGNzdGFydAotCQkgICAgJiYgRk9MRCAoKHVuc2lnbmVkIGNoYXIpKm4pIDw9IGNlbmQpCi0JCSAgZ290byBtYXRjaGVkOwotCi0JCWlmIChjID09ICddJykKLQkJICBicmVhazsKLQkgICAgICB9Ci0JICAgIGlmICghbm90KQotCSAgICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQkgICAgYnJlYWs7Ci0KLQkgIG1hdGNoZWQ6OwotCSAgICAvKiBTa2lwIHRoZSByZXN0IG9mIHRoZSBbLi4uXSB0aGF0IGFscmVhZHkgbWF0Y2hlZC4gICovCi0JICAgIHdoaWxlIChjICE9ICddJykKLQkgICAgICB7Ci0JCWlmIChjID09ICdcMCcpCi0JCSAgLyogWy4uLiAodW50ZXJtaW5hdGVkKSBsb3Nlcy4gICovCi0JCSAgcmV0dXJuIEZOTV9OT01BVENIOwotCi0JCWMgPSAqcCsrOwotCQlpZiAoIShmbGFncyAmIEZOTV9OT0VTQ0FQRSkgJiYgYyA9PSAnXFwnKQotCQkgIC8qIFhYWCAxMDAzLjJkMTEgaXMgdW5jbGVhciBpZiB0aGlzIGlzIHJpZ2h0LiAgKi8KLQkJICArK3A7Ci0JICAgICAgfQotCSAgICBpZiAobm90KQotCSAgICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQkgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGlmIChjICE9IEZPTEQgKCh1bnNpZ25lZCBjaGFyKSpuKSkKLQkgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCX0KLQotICAgICAgKytuOwotICAgIH0KLQotICBpZiAoKm4gPT0gJ1wwJykKLSAgICByZXR1cm4gMDsKLQotICBpZiAoKGZsYWdzICYgRk5NX0xFQURJTkdfRElSKSAmJiAqbiA9PSAnLycpCi0gICAgLyogVGhlIEZOTV9MRUFESU5HX0RJUiBmbGFnIHNheXMgdGhhdCAiZm9vKiIgbWF0Y2hlcyAiZm9vYmFyL2Zyb2JvenoiLiAgKi8KLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gRk5NX05PTUFUQ0g7Ci19Ci0KLSNlbmRpZgkvKiBfTElCQyBvciBub3QgX19HTlVfTElCUkFSWV9fLiAgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9nZXRjd2QuYyBiL2xpYmliZXJ0eS9nZXRjd2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkNTVjMC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvZ2V0Y3dkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBFbXVsYXRlIGdldGN3ZCB1c2luZyBnZXR3ZC4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICovCi0KLS8qCi1OQU1FCi0JZ2V0Y3dkIC0tIGdldCBhYnNvbHV0ZSBwYXRobmFtZSBmb3IgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQotCi1TWU5PUFNJUwotCWNoYXIgKmdldGN3ZCAoY2hhciBwYXRobmFtZVtsZW5dLCBsZW4pCi0KLURFU0NSSVBUSU9OCi0JQ29weSB0aGUgYWJzb2x1dGUgcGF0aG5hbWUgZm9yIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGludG8KLQl0aGUgc3VwcGxpZWQgYnVmZmVyIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBidWZmZXIuICBJZiB0aGUgCi0JY3VycmVudCBkaXJlY3RvcnkncyBwYXRoIGRvZXNuJ3QgZml0IGluIExFTiBjaGFyYWN0ZXJzLCB0aGUgcmVzdWx0Ci0JaXMgTlVMTCBhbmQgZXJybm8gaXMgc2V0LgotCi1CVUdTCi0JRW11bGF0ZWQgdmlhIHRoZSBnZXR3ZCgpIGNhbGwsIHdoaWNoIGlzIHJlYXNvbmFibGUgZm9yIG1vc3QKLQlzeXN0ZW1zIHRoYXQgZG8gbm90IGhhdmUgZ2V0Y3dkKCkuCi0KLSovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNlbmRpZgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLWV4dGVybiBjaGFyICpnZXR3ZCAoKTsKLWV4dGVybiBpbnQgZXJybm87Ci0KLSNpZm5kZWYgTUFYUEFUSExFTgotI2RlZmluZSBNQVhQQVRITEVOIDEwMjQKLSNlbmRpZgotCi1jaGFyICoKLWdldGN3ZCAoYnVmLCBsZW4pCi0gIGNoYXIgKmJ1ZjsKLSAgaW50IGxlbjsKLXsKLSAgY2hhciBvdXJidWZbTUFYUEFUSExFTl07Ci0gIGNoYXIgKnJlc3VsdDsKLQotICByZXN1bHQgPSBnZXR3ZCAob3VyYnVmKTsKLSAgaWYgKHJlc3VsdCkgewotICAgIGlmIChzdHJsZW4gKG91cmJ1ZikgPj0gbGVuKSB7Ci0gICAgICBlcnJubyA9IEVSQU5HRTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBzdHJjcHkgKGJ1Ziwgb3VyYnVmKTsKLSAgfQotICByZXR1cm4gYnVmOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2dldG9wdC5jIGIvbGliaWJlcnR5L2dldG9wdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE1MzFlLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9nZXRvcHQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNTYgKzAsMCBAQAotLyogR2V0b3B0IGZvciBHTlUuCi0gICBOT1RFOiBnZXRvcHQgaXMgbm93IHBhcnQgb2YgdGhlIEMgbGlicmFyeSwgc28gaWYgeW91IGRvbid0IGtub3cgd2hhdAotICAgIktlZXAgdGhpcyBmaWxlIG5hbWUtc3BhY2UgY2xlYW4iIG1lYW5zLCB0YWxrIHRvIGRyZXBwZXJAZ251Lm9yZwotICAgYmVmb3JlIGNoYW5naW5nIGl0IQotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OAotICAgCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBOT1RFOiBUaGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0aGlzIGZpbGUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5LgotICAgQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQGdudS5vcmcuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLSAgIGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotDAotLyogVGhpcyB0ZWxscyBBbHBoYSBPU0YvMSBub3QgdG8gZGVmaW5lIGEgZ2V0b3B0IHByb3RvdHlwZSBpbiA8c3RkaW8uaD4uCi0gICBEaXR0byBmb3IgQUlYIDMuMiBhbmQgPHN0ZGxpYi5oPi4gICovCi0jaWZuZGVmIF9OT19QUk9UTwotIyBkZWZpbmUgX05PX1BST1RPCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkIF9fU1REQ19fIHx8ICFfX1NURENfXwotLyogVGhpcyBpcyBhIHNlcGFyYXRlIGNvbmRpdGlvbmFsIHNpbmNlIHNvbWUgc3RkYyBzeXN0ZW1zCi0gICByZWplY3QgYGRlZmluZWQgKGNvbnN0KScuICAqLwotIyBpZm5kZWYgY29uc3QKLSMgIGRlZmluZSBjb25zdAotIyBlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vKiBDb21tZW50IG91dCBhbGwgdGhpcyBjb2RlIGlmIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgTGlicmFyeSwgYW5kIGFyZSBub3QKLSAgIGFjdHVhbGx5IGNvbXBpbGluZyB0aGUgbGlicmFyeSBpdHNlbGYuICBUaGlzIGNvZGUgaXMgcGFydCBvZiB0aGUgR05VIEMKLSAgIExpYnJhcnksIGJ1dCBhbHNvIGluY2x1ZGVkIGluIG1hbnkgb3RoZXIgR05VIGRpc3RyaWJ1dGlvbnMuICBDb21waWxpbmcKLSAgIGFuZCBsaW5raW5nIGluIHRoaXMgY29kZSBpcyBhIHdhc3RlIHdoZW4gdXNpbmcgdGhlIEdOVSBDIGxpYnJhcnkKLSAgIChlc3BlY2lhbGx5IGlmIGl0IGlzIGEgc2hhcmVkIGxpYnJhcnkpLiAgUmF0aGVyIHRoYW4gaGF2aW5nIGV2ZXJ5IEdOVQotICAgcHJvZ3JhbSB1bmRlcnN0YW5kIGBjb25maWd1cmUgLS13aXRoLWdudS1saWJjJyBhbmQgb21pdCB0aGUgb2JqZWN0IGZpbGVzLAotICAgaXQgaXMgc2ltcGxlciB0byBqdXN0IGRvIHRoaXMgaW4gdGhlIHNvdXJjZSBmb3IgZWFjaCBzdWNoIGZpbGUuICAqLwotCi0jZGVmaW5lIEdFVE9QVF9JTlRFUkZBQ0VfVkVSU0lPTiAyCi0jaWYgIWRlZmluZWQgX0xJQkMgJiYgZGVmaW5lZCBfX0dMSUJDX18gJiYgX19HTElCQ19fID49IDIKLSMgaW5jbHVkZSA8Z251LXZlcnNpb25zLmg+Ci0jIGlmIF9HTlVfR0VUT1BUX0lOVEVSRkFDRV9WRVJTSU9OID09IEdFVE9QVF9JTlRFUkZBQ0VfVkVSU0lPTgotIyAgZGVmaW5lIEVMSURFX0NPREUKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEVMSURFX0NPREUKLQotCi0vKiBUaGlzIG5lZWRzIHRvIGNvbWUgYWZ0ZXIgc29tZSBsaWJyYXJ5ICNpbmNsdWRlCi0gICB0byBnZXQgX19HTlVfTElCUkFSWV9fIGRlZmluZWQuICAqLwotI2lmZGVmCV9fR05VX0xJQlJBUllfXwotLyogRG9uJ3QgaW5jbHVkZSBzdGRsaWIuaCBmb3Igbm9uLUdOVSBDIGxpYnJhcmllcyBiZWNhdXNlIHNvbWUgb2YgdGhlbQotICAgY29udGFpbiBjb25mbGljdGluZyBwcm90b3R5cGVzIGZvciBnZXRvcHQuICAqLwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYJLyogR05VIEMgbGlicmFyeS4gICovCi0KLSNpZmRlZiBWTVMKLSMgaW5jbHVkZSA8dW5peGxpYi5oPgotIyBpZiBIQVZFX1NUUklOR19IIC0gMAotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBfCi0vKiBUaGlzIGlzIGZvciBvdGhlciBHTlUgZGlzdHJpYnV0aW9ucyB3aXRoIGludGVybmF0aW9uYWxpemVkIG1lc3NhZ2VzLgotICAgV2hlbiBjb21waWxpbmcgbGliYywgdGhlIF8gbWFjcm8gaXMgcHJlZGVmaW5lZC4gICovCi0jIGlmZGVmIEhBVkVfTElCSU5UTF9ICi0jICBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jICBkZWZpbmUgXyhtc2dpZCkJZ2V0dGV4dCAobXNnaWQpCi0jIGVsc2UKLSMgIGRlZmluZSBfKG1zZ2lkKQkobXNnaWQpCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogVGhpcyB2ZXJzaW9uIG9mIGBnZXRvcHQnIGFwcGVhcnMgdG8gdGhlIGNhbGxlciBsaWtlIHN0YW5kYXJkIFVuaXggYGdldG9wdCcKLSAgIGJ1dCBpdCBiZWhhdmVzIGRpZmZlcmVudGx5IGZvciB0aGUgdXNlciwgc2luY2UgaXQgYWxsb3dzIHRoZSB1c2VyCi0gICB0byBpbnRlcnNwZXJzZSB0aGUgb3B0aW9ucyB3aXRoIHRoZSBvdGhlciBhcmd1bWVudHMuCi0KLSAgIEFzIGBnZXRvcHQnIHdvcmtzLCBpdCBwZXJtdXRlcyB0aGUgZWxlbWVudHMgb2YgQVJHViBzbyB0aGF0LAotICAgd2hlbiBpdCBpcyBkb25lLCBhbGwgdGhlIG9wdGlvbnMgcHJlY2VkZSBldmVyeXRoaW5nIGVsc2UuICBUaHVzCi0gICBhbGwgYXBwbGljYXRpb24gcHJvZ3JhbXMgYXJlIGV4dGVuZGVkIHRvIGhhbmRsZSBmbGV4aWJsZSBhcmd1bWVudCBvcmRlci4KLQotICAgU2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgUE9TSVhMWV9DT1JSRUNUIGRpc2FibGVzIHBlcm11dGF0aW9uLgotICAgVGhlbiB0aGUgYmVoYXZpb3IgaXMgY29tcGxldGVseSBzdGFuZGFyZC4KLQotICAgR05VIGFwcGxpY2F0aW9uIHByb2dyYW1zIGNhbiB1c2UgYSB0aGlyZCBhbHRlcm5hdGl2ZSBtb2RlIGluIHdoaWNoCi0gICB0aGV5IGNhbiBkaXN0aW5ndWlzaCB0aGUgcmVsYXRpdmUgb3JkZXIgb2Ygb3B0aW9ucyBhbmQgb3RoZXIgYXJndW1lbnRzLiAgKi8KLQotI2luY2x1ZGUgImdldG9wdC5oIgotCi0vKiBGb3IgY29tbXVuaWNhdGlvbiBmcm9tIGBnZXRvcHQnIHRvIHRoZSBjYWxsZXIuCi0gICBXaGVuIGBnZXRvcHQnIGZpbmRzIGFuIG9wdGlvbiB0aGF0IHRha2VzIGFuIGFyZ3VtZW50LAotICAgdGhlIGFyZ3VtZW50IHZhbHVlIGlzIHJldHVybmVkIGhlcmUuCi0gICBBbHNvLCB3aGVuIGBvcmRlcmluZycgaXMgUkVUVVJOX0lOX09SREVSLAotICAgZWFjaCBub24tb3B0aW9uIEFSR1YtZWxlbWVudCBpcyByZXR1cm5lZCBoZXJlLiAgKi8KLQotY2hhciAqb3B0YXJnID0gTlVMTDsKLQotLyogSW5kZXggaW4gQVJHViBvZiB0aGUgbmV4dCBlbGVtZW50IHRvIGJlIHNjYW5uZWQuCi0gICBUaGlzIGlzIHVzZWQgZm9yIGNvbW11bmljYXRpb24gdG8gYW5kIGZyb20gdGhlIGNhbGxlcgotICAgYW5kIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gc3VjY2Vzc2l2ZSBjYWxscyB0byBgZ2V0b3B0Jy4KLQotICAgT24gZW50cnkgdG8gYGdldG9wdCcsIHplcm8gbWVhbnMgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbDsgaW5pdGlhbGl6ZS4KLQotICAgV2hlbiBgZ2V0b3B0JyByZXR1cm5zIC0xLCB0aGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2YgdGhlCi0gICBub24tb3B0aW9uIGVsZW1lbnRzIHRoYXQgdGhlIGNhbGxlciBzaG91bGQgaXRzZWxmIHNjYW4uCi0KLSAgIE90aGVyd2lzZSwgYG9wdGluZCcgY29tbXVuaWNhdGVzIGZyb20gb25lIGNhbGwgdG8gdGhlIG5leHQKLSAgIGhvdyBtdWNoIG9mIEFSR1YgaGFzIGJlZW4gc2Nhbm5lZCBzbyBmYXIuICAqLwotCi0vKiAxMDAzLjIgc2F5cyB0aGlzIG11c3QgYmUgMSBiZWZvcmUgYW55IGNhbGwuICAqLwotaW50IG9wdGluZCA9IDE7Ci0KLS8qIEZvcm1lcmx5LCBpbml0aWFsaXphdGlvbiBvZiBnZXRvcHQgZGVwZW5kZWQgb24gb3B0aW5kPT0wLCB3aGljaAotICAgY2F1c2VzIHByb2JsZW1zIHdpdGggcmUtY2FsbGluZyBnZXRvcHQgYXMgcHJvZ3JhbXMgZ2VuZXJhbGx5IGRvbid0Ci0gICBrbm93IHRoYXQuICovCi0KLWludCBfX2dldG9wdF9pbml0aWFsaXplZCA9IDA7Ci0KLS8qIFRoZSBuZXh0IGNoYXIgdG8gYmUgc2Nhbm5lZCBpbiB0aGUgb3B0aW9uLWVsZW1lbnQKLSAgIGluIHdoaWNoIHRoZSBsYXN0IG9wdGlvbiBjaGFyYWN0ZXIgd2UgcmV0dXJuZWQgd2FzIGZvdW5kLgotICAgVGhpcyBhbGxvd3MgdXMgdG8gcGljayB1cCB0aGUgc2NhbiB3aGVyZSB3ZSBsZWZ0IG9mZi4KLQotICAgSWYgdGhpcyBpcyB6ZXJvLCBvciBhIG51bGwgc3RyaW5nLCBpdCBtZWFucyByZXN1bWUgdGhlIHNjYW4KLSAgIGJ5IGFkdmFuY2luZyB0byB0aGUgbmV4dCBBUkdWLWVsZW1lbnQuICAqLwotCi1zdGF0aWMgY2hhciAqbmV4dGNoYXI7Ci0KLS8qIENhbGxlcnMgc3RvcmUgemVybyBoZXJlIHRvIGluaGliaXQgdGhlIGVycm9yIG1lc3NhZ2UKLSAgIGZvciB1bnJlY29nbml6ZWQgb3B0aW9ucy4gICovCi0KLWludCBvcHRlcnIgPSAxOwotCi0vKiBTZXQgdG8gYW4gb3B0aW9uIGNoYXJhY3RlciB3aGljaCB3YXMgdW5yZWNvZ25pemVkLgotICAgVGhpcyBtdXN0IGJlIGluaXRpYWxpemVkIG9uIHNvbWUgc3lzdGVtcyB0byBhdm9pZCBsaW5raW5nIGluIHRoZQotICAgc3lzdGVtJ3Mgb3duIGdldG9wdCBpbXBsZW1lbnRhdGlvbi4gICovCi0KLWludCBvcHRvcHQgPSAnPyc7Ci0KLS8qIERlc2NyaWJlIGhvdyB0byBkZWFsIHdpdGggb3B0aW9ucyB0aGF0IGZvbGxvdyBub24tb3B0aW9uIEFSR1YtZWxlbWVudHMuCi0KLSAgIElmIHRoZSBjYWxsZXIgZGlkIG5vdCBzcGVjaWZ5IGFueXRoaW5nLAotICAgdGhlIGRlZmF1bHQgaXMgUkVRVUlSRV9PUkRFUiBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgIFBPU0lYTFlfQ09SUkVDVCBpcyBkZWZpbmVkLCBQRVJNVVRFIG90aGVyd2lzZS4KLQotICAgUkVRVUlSRV9PUkRFUiBtZWFucyBkb24ndCByZWNvZ25pemUgdGhlbSBhcyBvcHRpb25zOwotICAgc3RvcCBvcHRpb24gcHJvY2Vzc2luZyB3aGVuIHRoZSBmaXJzdCBub24tb3B0aW9uIGlzIHNlZW4uCi0gICBUaGlzIGlzIHdoYXQgVW5peCBkb2VzLgotICAgVGhpcyBtb2RlIG9mIG9wZXJhdGlvbiBpcyBzZWxlY3RlZCBieSBlaXRoZXIgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQKLSAgIHZhcmlhYmxlIFBPU0lYTFlfQ09SUkVDVCwgb3IgdXNpbmcgYCsnIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgIG9mIHRoZSBsaXN0IG9mIG9wdGlvbiBjaGFyYWN0ZXJzLgotCi0gICBQRVJNVVRFIGlzIHRoZSBkZWZhdWx0LiAgV2UgcGVybXV0ZSB0aGUgY29udGVudHMgb2YgQVJHViBhcyB3ZSBzY2FuLAotICAgc28gdGhhdCBldmVudHVhbGx5IGFsbCB0aGUgbm9uLW9wdGlvbnMgYXJlIGF0IHRoZSBlbmQuICBUaGlzIGFsbG93cyBvcHRpb25zCi0gICB0byBiZSBnaXZlbiBpbiBhbnkgb3JkZXIsIGV2ZW4gd2l0aCBwcm9ncmFtcyB0aGF0IHdlcmUgbm90IHdyaXR0ZW4gdG8KLSAgIGV4cGVjdCB0aGlzLgotCi0gICBSRVRVUk5fSU5fT1JERVIgaXMgYW4gb3B0aW9uIGF2YWlsYWJsZSB0byBwcm9ncmFtcyB0aGF0IHdlcmUgd3JpdHRlbgotICAgdG8gZXhwZWN0IG9wdGlvbnMgYW5kIG90aGVyIEFSR1YtZWxlbWVudHMgaW4gYW55IG9yZGVyIGFuZCB0aGF0IGNhcmUgYWJvdXQKLSAgIHRoZSBvcmRlcmluZyBvZiB0aGUgdHdvLiAgV2UgZGVzY3JpYmUgZWFjaCBub24tb3B0aW9uIEFSR1YtZWxlbWVudAotICAgYXMgaWYgaXQgd2VyZSB0aGUgYXJndW1lbnQgb2YgYW4gb3B0aW9uIHdpdGggY2hhcmFjdGVyIGNvZGUgMS4KLSAgIFVzaW5nIGAtJyBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBsaXN0IG9mIG9wdGlvbiBjaGFyYWN0ZXJzCi0gICBzZWxlY3RzIHRoaXMgbW9kZSBvZiBvcGVyYXRpb24uCi0KLSAgIFRoZSBzcGVjaWFsIGFyZ3VtZW50IGAtLScgZm9yY2VzIGFuIGVuZCBvZiBvcHRpb24tc2Nhbm5pbmcgcmVnYXJkbGVzcwotICAgb2YgdGhlIHZhbHVlIG9mIGBvcmRlcmluZycuICBJbiB0aGUgY2FzZSBvZiBSRVRVUk5fSU5fT1JERVIsIG9ubHkKLSAgIGAtLScgY2FuIGNhdXNlIGBnZXRvcHQnIHRvIHJldHVybiAtMSB3aXRoIGBvcHRpbmQnICE9IEFSR0MuICAqLwotCi1zdGF0aWMgZW51bQotewotICBSRVFVSVJFX09SREVSLCBQRVJNVVRFLCBSRVRVUk5fSU5fT1JERVIKLX0gb3JkZXJpbmc7Ci0KLS8qIFZhbHVlIG9mIFBPU0lYTFlfQ09SUkVDVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gICovCi1zdGF0aWMgY2hhciAqcG9zaXhseV9jb3JyZWN0OwotDAotI2lmZGVmCV9fR05VX0xJQlJBUllfXwotLyogV2Ugd2FudCB0byBhdm9pZCBpbmNsdXNpb24gb2Ygc3RyaW5nLmggd2l0aCBub24tR05VIGxpYnJhcmllcwotICAgYmVjYXVzZSB0aGVyZSBhcmUgbWFueSB3YXlzIGl0IGNhbiBjYXVzZSB0cm91YmxlLgotICAgT24gc29tZSBzeXN0ZW1zLCBpdCBjb250YWlucyBzcGVjaWFsIG1hZ2ljIG1hY3JvcyB0aGF0IGRvbid0IHdvcmsKLSAgIGluIEdDQy4gICovCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotIyBkZWZpbmUgbXlfaW5kZXgJc3RyY2hyCi0jZWxzZQotCi0jIGlmIEhBVkVfU1RSSU5HX0gKLSMgIGluY2x1ZGUgPHN0cmluZy5oPgotIyBlbHNlCi0jICBpZiBIQVZFX1NUUklOR1NfSAotIyAgIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSMgIGVuZGlmCi0jIGVuZGlmCi0KLS8qIEF2b2lkIGRlcGVuZGluZyBvbiBsaWJyYXJ5IGZ1bmN0aW9ucyBvciBmaWxlcwotICAgd2hvc2UgbmFtZXMgYXJlIGluY29uc2lzdGVudC4gICovCi0KLSNpZm5kZWYgZ2V0ZW52Ci1leHRlcm4gY2hhciAqZ2V0ZW52ICgpOwotI2VuZGlmCi0KLXN0YXRpYyBjaGFyICoKLW15X2luZGV4IChzdHIsIGNocikKLSAgICAgY29uc3QgY2hhciAqc3RyOwotICAgICBpbnQgY2hyOwotewotICB3aGlsZSAoKnN0cikKLSAgICB7Ci0gICAgICBpZiAoKnN0ciA9PSBjaHIpCi0JcmV0dXJuIChjaGFyICopIHN0cjsKLSAgICAgIHN0cisrOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIElmIHVzaW5nIEdDQywgd2UgY2FuIHNhZmVseSBkZWNsYXJlIHN0cmxlbiB0aGlzIHdheS4KLSAgIElmIG5vdCB1c2luZyBHQ0MsIGl0IGlzIG9rIG5vdCB0byBkZWNsYXJlIGl0LiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotLyogTm90ZSB0aGF0IE1vdG9yb2xhIERlbHRhIDY4ayBSM1Y3IGNvbWVzIHdpdGggR0NDIGJ1dCBub3Qgc3RkZGVmLmguCi0gICBUaGF0IHdhcyByZWxldmFudCB0byBjb2RlIHRoYXQgd2FzIGhlcmUgYmVmb3JlLiAgKi8KLSMgaWYgKCFkZWZpbmVkIF9fU1REQ19fIHx8ICFfX1NURENfXykgJiYgIWRlZmluZWQgc3RybGVuCi0vKiBnY2Mgd2l0aCAtdHJhZGl0aW9uYWwgZGVjbGFyZXMgdGhlIGJ1aWx0LWluIHN0cmxlbiB0byByZXR1cm4gaW50LAotICAgYW5kIGhhcyBkb25lIHNvIGF0IGxlYXN0IHNpbmNlIHZlcnNpb24gMi40LjUuIC0tIHJtcy4gICovCi1leHRlcm4gaW50IHN0cmxlbiAoY29uc3QgY2hhciAqKTsKLSMgZW5kaWYgLyogbm90IF9fU1REQ19fICovCi0jZW5kaWYgLyogX19HTlVDX18gKi8KLQotI2VuZGlmIC8qIG5vdCBfX0dOVV9MSUJSQVJZX18gKi8KLQwKLS8qIEhhbmRsZSBwZXJtdXRhdGlvbiBvZiBhcmd1bWVudHMuICAqLwotCi0vKiBEZXNjcmliZSB0aGUgcGFydCBvZiBBUkdWIHRoYXQgY29udGFpbnMgbm9uLW9wdGlvbnMgdGhhdCBoYXZlCi0gICBiZWVuIHNraXBwZWQuICBgZmlyc3Rfbm9ub3B0JyBpcyB0aGUgaW5kZXggaW4gQVJHViBvZiB0aGUgZmlyc3Qgb2YgdGhlbTsKLSAgIGBsYXN0X25vbm9wdCcgaXMgdGhlIGluZGV4IGFmdGVyIHRoZSBsYXN0IG9mIHRoZW0uICAqLwotCi1zdGF0aWMgaW50IGZpcnN0X25vbm9wdDsKLXN0YXRpYyBpbnQgbGFzdF9ub25vcHQ7Ci0KLSNpZmRlZiBfTElCQwotLyogQmFzaCAyLjAgZ2l2ZXMgdXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgY29udGFpbmluZyBmbGFncwotICAgaW5kaWNhdGluZyBBUkdWIGVsZW1lbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGFyZ3VtZW50cy4gICovCi0KLS8qIERlZmluZWQgaW4gZ2V0b3B0X2luaXQuYyAgKi8KLWV4dGVybiBjaGFyICpfX2dldG9wdF9ub25vcHRpb25fZmxhZ3M7Ci0KLXN0YXRpYyBpbnQgbm9ub3B0aW9uX2ZsYWdzX21heF9sZW47Ci1zdGF0aWMgaW50IG5vbm9wdGlvbl9mbGFnc19sZW47Ci0KLXN0YXRpYyBpbnQgb3JpZ2luYWxfYXJnYzsKLXN0YXRpYyBjaGFyICpjb25zdCAqb3JpZ2luYWxfYXJndjsKLQotLyogTWFrZSBzdXJlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBiYXNoIDIuMCBwdXRzIGluIHRoZSBlbnZpcm9ubWVudAotICAgaXMgdmFsaWQgZm9yIHRoZSBnZXRvcHQgY2FsbCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBBUkdWIHBhc3NlZAotICAgdG8gZ2V0b3B0IGlzIHRoYXQgb25lIHBhc3NlZCB0byB0aGUgcHJvY2Vzcy4gICovCi1zdGF0aWMgdm9pZAotX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCi1zdG9yZV9hcmdzX2FuZF9lbnYgKGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndikKLXsKLSAgLyogWFhYIFRoaXMgaXMgbm8gZ29vZCBzb2x1dGlvbi4gIFdlIHNob3VsZCByYXRoZXIgY29weSB0aGUgYXJncyBzbwotICAgICB0aGF0IHdlIGNhbiBjb21wYXJlIHRoZW0gbGF0ZXIuICBCdXQgd2UgbXVzdCBub3QgdXNlIG1hbGxvYygzKS4gICovCi0gIG9yaWdpbmFsX2FyZ2MgPSBhcmdjOwotICBvcmlnaW5hbF9hcmd2ID0gYXJndjsKLX0KLSMgaWZkZWYgdGV4dF9zZXRfZWxlbWVudAotdGV4dF9zZXRfZWxlbWVudCAoX19saWJjX3N1YmluaXQsIHN0b3JlX2FyZ3NfYW5kX2Vudik7Ci0jIGVuZGlmIC8qIHRleHRfc2V0X2VsZW1lbnQgKi8KLQotIyBkZWZpbmUgU1dBUF9GTEFHUyhjaDEsIGNoMikgXAotICBpZiAobm9ub3B0aW9uX2ZsYWdzX2xlbiA+IDApCQkJCQkJICAgICAgXAotICAgIHsJCQkJCQkJCQkgICAgICBcCi0gICAgICBjaGFyIF9fdG1wID0gX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzW2NoMV07CQkJICAgICAgXAotICAgICAgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzW2NoMV0gPSBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3NbY2gyXTsJICAgICAgXAotICAgICAgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzW2NoMl0gPSBfX3RtcDsJCQkJICAgICAgXAotICAgIH0KLSNlbHNlCS8qICFfTElCQyAqLwotIyBkZWZpbmUgU1dBUF9GTEFHUyhjaDEsIGNoMikKLSNlbmRpZgkvKiBfTElCQyAqLwotCi0vKiBFeGNoYW5nZSB0d28gYWRqYWNlbnQgc3Vic2VxdWVuY2VzIG9mIEFSR1YuCi0gICBPbmUgc3Vic2VxdWVuY2UgaXMgZWxlbWVudHMgW2ZpcnN0X25vbm9wdCxsYXN0X25vbm9wdCkKLSAgIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgbm9uLW9wdGlvbnMgdGhhdCBoYXZlIGJlZW4gc2tpcHBlZCBzbyBmYXIuCi0gICBUaGUgb3RoZXIgaXMgZWxlbWVudHMgW2xhc3Rfbm9ub3B0LG9wdGluZCksIHdoaWNoIGNvbnRhaW5zIGFsbAotICAgdGhlIG9wdGlvbnMgcHJvY2Vzc2VkIHNpbmNlIHRob3NlIG5vbi1vcHRpb25zIHdlcmUgc2tpcHBlZC4KLQotICAgYGZpcnN0X25vbm9wdCcgYW5kIGBsYXN0X25vbm9wdCcgYXJlIHJlbG9jYXRlZCBzbyB0aGF0IHRoZXkgZGVzY3JpYmUKLSAgIHRoZSBuZXcgaW5kaWNlcyBvZiB0aGUgbm9uLW9wdGlvbnMgaW4gQVJHViBhZnRlciB0aGV5IGFyZSBtb3ZlZC4gICovCi0KLSNpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi1zdGF0aWMgdm9pZCBleGNoYW5nZSAoY2hhciAqKik7Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQKLWV4Y2hhbmdlIChhcmd2KQotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGJvdHRvbSA9IGZpcnN0X25vbm9wdDsKLSAgaW50IG1pZGRsZSA9IGxhc3Rfbm9ub3B0OwotICBpbnQgdG9wID0gb3B0aW5kOwotICBjaGFyICp0ZW07Ci0KLSAgLyogRXhjaGFuZ2UgdGhlIHNob3J0ZXIgc2VnbWVudCB3aXRoIHRoZSBmYXIgZW5kIG9mIHRoZSBsb25nZXIgc2VnbWVudC4KLSAgICAgVGhhdCBwdXRzIHRoZSBzaG9ydGVyIHNlZ21lbnQgaW50byB0aGUgcmlnaHQgcGxhY2UuCi0gICAgIEl0IGxlYXZlcyB0aGUgbG9uZ2VyIHNlZ21lbnQgaW4gdGhlIHJpZ2h0IHBsYWNlIG92ZXJhbGwsCi0gICAgIGJ1dCBpdCBjb25zaXN0cyBvZiB0d28gcGFydHMgdGhhdCBuZWVkIHRvIGJlIHN3YXBwZWQgbmV4dC4gICovCi0KLSNpZmRlZiBfTElCQwotICAvKiBGaXJzdCBtYWtlIHN1cmUgdGhlIGhhbmRsaW5nIG9mIHRoZSBgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzJwotICAgICBzdHJpbmcgY2FuIHdvcmsgbm9ybWFsbHkuICBPdXIgdG9wIGFyZ3VtZW50IG11c3QgYmUgaW4gdGhlIHJhbmdlCi0gICAgIG9mIHRoZSBzdHJpbmcuICAqLwotICBpZiAobm9ub3B0aW9uX2ZsYWdzX2xlbiA+IDAgJiYgdG9wID49IG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuKQotICAgIHsKLSAgICAgIC8qIFdlIG11c3QgZXh0ZW5kIHRoZSBhcnJheS4gIFRoZSB1c2VyIHBsYXlzIGdhbWVzIHdpdGggdXMgYW5kCi0JIHByZXNlbnRzIG5ldyBhcmd1bWVudHMuICAqLwotICAgICAgY2hhciAqbmV3X3N0ciA9IG1hbGxvYyAodG9wICsgMSk7Ci0gICAgICBpZiAobmV3X3N0ciA9PSBOVUxMKQotCW5vbm9wdGlvbl9mbGFnc19sZW4gPSBub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgbWVtc2V0IChfX21lbXBjcHkgKG5ld19zdHIsIF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncywKLQkJCSAgICAgbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4pLAotCQkgICdcMCcsIHRvcCArIDEgLSBub25vcHRpb25fZmxhZ3NfbWF4X2xlbik7Ci0JICBub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9IHRvcCArIDE7Ci0JICBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3MgPSBuZXdfc3RyOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICB3aGlsZSAodG9wID4gbWlkZGxlICYmIG1pZGRsZSA+IGJvdHRvbSkKLSAgICB7Ci0gICAgICBpZiAodG9wIC0gbWlkZGxlID4gbWlkZGxlIC0gYm90dG9tKQotCXsKLQkgIC8qIEJvdHRvbSBzZWdtZW50IGlzIHRoZSBzaG9ydCBvbmUuICAqLwotCSAgaW50IGxlbiA9IG1pZGRsZSAtIGJvdHRvbTsKLQkgIHJlZ2lzdGVyIGludCBpOwotCi0JICAvKiBTd2FwIGl0IHdpdGggdGhlIHRvcCBwYXJ0IG9mIHRoZSB0b3Agc2VnbWVudC4gICovCi0JICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JICAgIHsKLQkgICAgICB0ZW0gPSBhcmd2W2JvdHRvbSArIGldOwotCSAgICAgIGFyZ3ZbYm90dG9tICsgaV0gPSBhcmd2W3RvcCAtIChtaWRkbGUgLSBib3R0b20pICsgaV07Ci0JICAgICAgYXJndlt0b3AgLSAobWlkZGxlIC0gYm90dG9tKSArIGldID0gdGVtOwotCSAgICAgIFNXQVBfRkxBR1MgKGJvdHRvbSArIGksIHRvcCAtIChtaWRkbGUgLSBib3R0b20pICsgaSk7Ci0JICAgIH0KLQkgIC8qIEV4Y2x1ZGUgdGhlIG1vdmVkIGJvdHRvbSBzZWdtZW50IGZyb20gZnVydGhlciBzd2FwcGluZy4gICovCi0JICB0b3AgLT0gbGVuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUb3Agc2VnbWVudCBpcyB0aGUgc2hvcnQgb25lLiAgKi8KLQkgIGludCBsZW4gPSB0b3AgLSBtaWRkbGU7Ci0JICByZWdpc3RlciBpbnQgaTsKLQotCSAgLyogU3dhcCBpdCB3aXRoIHRoZSBib3R0b20gcGFydCBvZiB0aGUgYm90dG9tIHNlZ21lbnQuICAqLwotCSAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCSAgICB7Ci0JICAgICAgdGVtID0gYXJndltib3R0b20gKyBpXTsKLQkgICAgICBhcmd2W2JvdHRvbSArIGldID0gYXJndlttaWRkbGUgKyBpXTsKLQkgICAgICBhcmd2W21pZGRsZSArIGldID0gdGVtOwotCSAgICAgIFNXQVBfRkxBR1MgKGJvdHRvbSArIGksIG1pZGRsZSArIGkpOwotCSAgICB9Ci0JICAvKiBFeGNsdWRlIHRoZSBtb3ZlZCB0b3Agc2VnbWVudCBmcm9tIGZ1cnRoZXIgc3dhcHBpbmcuICAqLwotCSAgYm90dG9tICs9IGxlbjsKLQl9Ci0gICAgfQotCi0gIC8qIFVwZGF0ZSByZWNvcmRzIGZvciB0aGUgc2xvdHMgdGhlIG5vbi1vcHRpb25zIG5vdyBvY2N1cHkuICAqLwotCi0gIGZpcnN0X25vbm9wdCArPSAob3B0aW5kIC0gbGFzdF9ub25vcHQpOwotICBsYXN0X25vbm9wdCA9IG9wdGluZDsKLX0KLQotLyogSW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgZGF0YSB3aGVuIHRoZSBmaXJzdCBjYWxsIGlzIG1hZGUuICAqLwotCi0jaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotc3RhdGljIGNvbnN0IGNoYXIgKl9nZXRvcHRfaW5pdGlhbGl6ZSAoaW50LCBjaGFyICpjb25zdCAqLCBjb25zdCBjaGFyICopOwotI2VuZGlmCi1zdGF0aWMgY29uc3QgY2hhciAqCi1fZ2V0b3B0X2luaXRpYWxpemUgKGFyZ2MsIGFyZ3YsIG9wdHN0cmluZykKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICpvcHRzdHJpbmc7Ci17Ci0gIC8qIFN0YXJ0IHByb2Nlc3Npbmcgb3B0aW9ucyB3aXRoIEFSR1YtZWxlbWVudCAxIChzaW5jZSBBUkdWLWVsZW1lbnQgMAotICAgICBpcyB0aGUgcHJvZ3JhbSBuYW1lKTsgdGhlIHNlcXVlbmNlIG9mIHByZXZpb3VzbHkgc2tpcHBlZAotICAgICBub24tb3B0aW9uIEFSR1YtZWxlbWVudHMgaXMgZW1wdHkuICAqLwotCi0gIGZpcnN0X25vbm9wdCA9IGxhc3Rfbm9ub3B0ID0gb3B0aW5kOwotCi0gIG5leHRjaGFyID0gTlVMTDsKLQotICBwb3NpeGx5X2NvcnJlY3QgPSBnZXRlbnYgKCJQT1NJWExZX0NPUlJFQ1QiKTsKLQotICAvKiBEZXRlcm1pbmUgaG93IHRvIGhhbmRsZSB0aGUgb3JkZXJpbmcgb2Ygb3B0aW9ucyBhbmQgbm9ub3B0aW9ucy4gICovCi0KLSAgaWYgKG9wdHN0cmluZ1swXSA9PSAnLScpCi0gICAgewotICAgICAgb3JkZXJpbmcgPSBSRVRVUk5fSU5fT1JERVI7Ci0gICAgICArK29wdHN0cmluZzsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wdHN0cmluZ1swXSA9PSAnKycpCi0gICAgewotICAgICAgb3JkZXJpbmcgPSBSRVFVSVJFX09SREVSOwotICAgICAgKytvcHRzdHJpbmc7Ci0gICAgfQotICBlbHNlIGlmIChwb3NpeGx5X2NvcnJlY3QgIT0gTlVMTCkKLSAgICBvcmRlcmluZyA9IFJFUVVJUkVfT1JERVI7Ci0gIGVsc2UKLSAgICBvcmRlcmluZyA9IFBFUk1VVEU7Ci0KLSNpZmRlZiBfTElCQwotICBpZiAocG9zaXhseV9jb3JyZWN0ID09IE5VTEwKLSAgICAgICYmIGFyZ2MgPT0gb3JpZ2luYWxfYXJnYyAmJiBhcmd2ID09IG9yaWdpbmFsX2FyZ3YpCi0gICAgewotICAgICAgaWYgKG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuID09IDApCi0JewotCSAgaWYgKF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncyA9PSBOVUxMCi0JICAgICAgfHwgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzWzBdID09ICdcMCcpCi0JICAgIG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuID0gLTE7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpvcmlnX3N0ciA9IF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFnczsKLQkgICAgICBpbnQgbGVuID0gbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPSBzdHJsZW4gKG9yaWdfc3RyKTsKLQkgICAgICBpZiAobm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPCBhcmdjKQotCQlub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9IGFyZ2M7Ci0JICAgICAgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzID0KLQkJKGNoYXIgKikgbWFsbG9jIChub25vcHRpb25fZmxhZ3NfbWF4X2xlbik7Ci0JICAgICAgaWYgKF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncyA9PSBOVUxMKQotCQlub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9IC0xOwotCSAgICAgIGVsc2UKLQkJbWVtc2V0IChfX21lbXBjcHkgKF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncywgb3JpZ19zdHIsIGxlbiksCi0JCQknXDAnLCBub25vcHRpb25fZmxhZ3NfbWF4X2xlbiAtIGxlbik7Ci0JICAgIH0KLQl9Ci0gICAgICBub25vcHRpb25fZmxhZ3NfbGVuID0gbm9ub3B0aW9uX2ZsYWdzX21heF9sZW47Ci0gICAgfQotICBlbHNlCi0gICAgbm9ub3B0aW9uX2ZsYWdzX2xlbiA9IDA7Ci0jZW5kaWYKLQotICByZXR1cm4gb3B0c3RyaW5nOwotfQotDAotLyogU2NhbiBlbGVtZW50cyBvZiBBUkdWICh3aG9zZSBsZW5ndGggaXMgQVJHQykgZm9yIG9wdGlvbiBjaGFyYWN0ZXJzCi0gICBnaXZlbiBpbiBPUFRTVFJJTkcuCi0KLSAgIElmIGFuIGVsZW1lbnQgb2YgQVJHViBzdGFydHMgd2l0aCAnLScsIGFuZCBpcyBub3QgZXhhY3RseSAiLSIgb3IgIi0tIiwKLSAgIHRoZW4gaXQgaXMgYW4gb3B0aW9uIGVsZW1lbnQuICBUaGUgY2hhcmFjdGVycyBvZiB0aGlzIGVsZW1lbnQKLSAgIChhc2lkZSBmcm9tIHRoZSBpbml0aWFsICctJykgYXJlIG9wdGlvbiBjaGFyYWN0ZXJzLiAgSWYgYGdldG9wdCcKLSAgIGlzIGNhbGxlZCByZXBlYXRlZGx5LCBpdCByZXR1cm5zIHN1Y2Nlc3NpdmVseSBlYWNoIG9mIHRoZSBvcHRpb24gY2hhcmFjdGVycwotICAgZnJvbSBlYWNoIG9mIHRoZSBvcHRpb24gZWxlbWVudHMuCi0KLSAgIElmIGBnZXRvcHQnIGZpbmRzIGFub3RoZXIgb3B0aW9uIGNoYXJhY3RlciwgaXQgcmV0dXJucyB0aGF0IGNoYXJhY3RlciwKLSAgIHVwZGF0aW5nIGBvcHRpbmQnIGFuZCBgbmV4dGNoYXInIHNvIHRoYXQgdGhlIG5leHQgY2FsbCB0byBgZ2V0b3B0JyBjYW4KLSAgIHJlc3VtZSB0aGUgc2NhbiB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uIGNoYXJhY3RlciBvciBBUkdWLWVsZW1lbnQuCi0KLSAgIElmIHRoZXJlIGFyZSBubyBtb3JlIG9wdGlvbiBjaGFyYWN0ZXJzLCBgZ2V0b3B0JyByZXR1cm5zIC0xLgotICAgVGhlbiBgb3B0aW5kJyBpcyB0aGUgaW5kZXggaW4gQVJHViBvZiB0aGUgZmlyc3QgQVJHVi1lbGVtZW50Ci0gICB0aGF0IGlzIG5vdCBhbiBvcHRpb24uICAoVGhlIEFSR1YtZWxlbWVudHMgaGF2ZSBiZWVuIHBlcm11dGVkCi0gICBzbyB0aGF0IHRob3NlIHRoYXQgYXJlIG5vdCBvcHRpb25zIG5vdyBjb21lIGxhc3QuKQotCi0gICBPUFRTVFJJTkcgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbGVnaXRpbWF0ZSBvcHRpb24gY2hhcmFjdGVycy4KLSAgIElmIGFuIG9wdGlvbiBjaGFyYWN0ZXIgaXMgc2VlbiB0aGF0IGlzIG5vdCBsaXN0ZWQgaW4gT1BUU1RSSU5HLAotICAgcmV0dXJuICc/JyBhZnRlciBwcmludGluZyBhbiBlcnJvciBtZXNzYWdlLiAgSWYgeW91IHNldCBgb3B0ZXJyJyB0bwotICAgemVybywgdGhlIGVycm9yIG1lc3NhZ2UgaXMgc3VwcHJlc3NlZCBidXQgd2Ugc3RpbGwgcmV0dXJuICc/Jy4KLQotICAgSWYgYSBjaGFyIGluIE9QVFNUUklORyBpcyBmb2xsb3dlZCBieSBhIGNvbG9uLCB0aGF0IG1lYW5zIGl0IHdhbnRzIGFuIGFyZywKLSAgIHNvIHRoZSBmb2xsb3dpbmcgdGV4dCBpbiB0aGUgc2FtZSBBUkdWLWVsZW1lbnQsIG9yIHRoZSB0ZXh0IG9mIHRoZSBmb2xsb3dpbmcKLSAgIEFSR1YtZWxlbWVudCwgaXMgcmV0dXJuZWQgaW4gYG9wdGFyZycuICBUd28gY29sb25zIG1lYW4gYW4gb3B0aW9uIHRoYXQKLSAgIHdhbnRzIGFuIG9wdGlvbmFsIGFyZzsgaWYgdGhlcmUgaXMgdGV4dCBpbiB0aGUgY3VycmVudCBBUkdWLWVsZW1lbnQsCi0gICBpdCBpcyByZXR1cm5lZCBpbiBgb3B0YXJnJywgb3RoZXJ3aXNlIGBvcHRhcmcnIGlzIHNldCB0byB6ZXJvLgotCi0gICBJZiBPUFRTVFJJTkcgc3RhcnRzIHdpdGggYC0nIG9yIGArJywgaXQgcmVxdWVzdHMgZGlmZmVyZW50IG1ldGhvZHMgb2YKLSAgIGhhbmRsaW5nIHRoZSBub24tb3B0aW9uIEFSR1YtZWxlbWVudHMuCi0gICBTZWUgdGhlIGNvbW1lbnRzIGFib3V0IFJFVFVSTl9JTl9PUkRFUiBhbmQgUkVRVUlSRV9PUkRFUiwgYWJvdmUuCi0KLSAgIExvbmctbmFtZWQgb3B0aW9ucyBiZWdpbiB3aXRoIGAtLScgaW5zdGVhZCBvZiBgLScuCi0gICBUaGVpciBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQgYXMgbG9uZyBhcyB0aGUgYWJicmV2aWF0aW9uIGlzIHVuaXF1ZQotICAgb3IgaXMgYW4gZXhhY3QgbWF0Y2ggZm9yIHNvbWUgZGVmaW5lZCBvcHRpb24uICBJZiB0aGV5IGhhdmUgYW4KLSAgIGFyZ3VtZW50LCBpdCBmb2xsb3dzIHRoZSBvcHRpb24gbmFtZSBpbiB0aGUgc2FtZSBBUkdWLWVsZW1lbnQsIHNlcGFyYXRlZAotICAgZnJvbSB0aGUgb3B0aW9uIG5hbWUgYnkgYSBgPScsIG9yIGVsc2UgdGhlIGluIG5leHQgQVJHVi1lbGVtZW50LgotICAgV2hlbiBgZ2V0b3B0JyBmaW5kcyBhIGxvbmctbmFtZWQgb3B0aW9uLCBpdCByZXR1cm5zIDAgaWYgdGhhdCBvcHRpb24ncwotICAgYGZsYWcnIGZpZWxkIGlzIG5vbnplcm8sIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uJ3MgYHZhbCcgZmllbGQKLSAgIGlmIHRoZSBgZmxhZycgZmllbGQgaXMgemVyby4KLQotICAgVGhlIGVsZW1lbnRzIG9mIEFSR1YgYXJlbid0IHJlYWxseSBjb25zdCwgYmVjYXVzZSB3ZSBwZXJtdXRlIHRoZW0uCi0gICBCdXQgd2UgcHJldGVuZCB0aGV5J3JlIGNvbnN0IGluIHRoZSBwcm90b3R5cGUgdG8gYmUgY29tcGF0aWJsZQotICAgd2l0aCBvdGhlciBzeXN0ZW1zLgotCi0gICBMT05HT1BUUyBpcyBhIHZlY3RvciBvZiBgc3RydWN0IG9wdGlvbicgdGVybWluYXRlZCBieSBhbgotICAgZWxlbWVudCBjb250YWluaW5nIGEgbmFtZSB3aGljaCBpcyB6ZXJvLgotCi0gICBMT05HSU5EIHJldHVybnMgdGhlIGluZGV4IGluIExPTkdPUFQgb2YgdGhlIGxvbmctbmFtZWQgb3B0aW9uIGZvdW5kLgotICAgSXQgaXMgb25seSB2YWxpZCB3aGVuIGEgbG9uZy1uYW1lZCBvcHRpb24gaGFzIGJlZW4gZm91bmQgYnkgdGhlIG1vc3QKLSAgIHJlY2VudCBjYWxsLgotCi0gICBJZiBMT05HX09OTFkgaXMgbm9uemVybywgJy0nIGFzIHdlbGwgYXMgJy0tJyBjYW4gaW50cm9kdWNlCi0gICBsb25nLW5hbWVkIG9wdGlvbnMuICAqLwotCi1pbnQKLV9nZXRvcHRfaW50ZXJuYWwgKGFyZ2MsIGFyZ3YsIG9wdHN0cmluZywgbG9uZ29wdHMsIGxvbmdpbmQsIGxvbmdfb25seSkKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICpvcHRzdHJpbmc7Ci0gICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKmxvbmdvcHRzOwotICAgICBpbnQgKmxvbmdpbmQ7Ci0gICAgIGludCBsb25nX29ubHk7Ci17Ci0gIG9wdGFyZyA9IE5VTEw7Ci0KLSAgaWYgKG9wdGluZCA9PSAwIHx8ICFfX2dldG9wdF9pbml0aWFsaXplZCkKLSAgICB7Ci0gICAgICBpZiAob3B0aW5kID09IDApCi0Jb3B0aW5kID0gMTsJLyogRG9uJ3Qgc2NhbiBBUkdWWzBdLCB0aGUgcHJvZ3JhbSBuYW1lLiAgKi8KLSAgICAgIG9wdHN0cmluZyA9IF9nZXRvcHRfaW5pdGlhbGl6ZSAoYXJnYywgYXJndiwgb3B0c3RyaW5nKTsKLSAgICAgIF9fZ2V0b3B0X2luaXRpYWxpemVkID0gMTsKLSAgICB9Ci0KLSAgLyogVGVzdCB3aGV0aGVyIEFSR1Zbb3B0aW5kXSBwb2ludHMgdG8gYSBub24tb3B0aW9uIGFyZ3VtZW50LgotICAgICBFaXRoZXIgaXQgZG9lcyBub3QgaGF2ZSBvcHRpb24gc3ludGF4LCBvciB0aGVyZSBpcyBhbiBlbnZpcm9ubWVudCBmbGFnCi0gICAgIGZyb20gdGhlIHNoZWxsIGluZGljYXRpbmcgaXQgaXMgbm90IGFuIG9wdGlvbi4gIFRoZSBsYXRlciBpbmZvcm1hdGlvbgotICAgICBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgdXNlZCBpbiB0aGUgR05VIGxpYmMuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBOT05PUFRJT05fUCAoYXJndltvcHRpbmRdWzBdICE9ICctJyB8fCBhcmd2W29wdGluZF1bMV0gPT0gJ1wwJwkgICAgICBcCi0JCSAgICAgIHx8IChvcHRpbmQgPCBub25vcHRpb25fZmxhZ3NfbGVuCQkJICAgICAgXAotCQkJICAmJiBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3Nbb3B0aW5kXSA9PSAnMScpKQotI2Vsc2UKLSMgZGVmaW5lIE5PTk9QVElPTl9QIChhcmd2W29wdGluZF1bMF0gIT0gJy0nIHx8IGFyZ3Zbb3B0aW5kXVsxXSA9PSAnXDAnKQotI2VuZGlmCi0KLSAgaWYgKG5leHRjaGFyID09IE5VTEwgfHwgKm5leHRjaGFyID09ICdcMCcpCi0gICAgewotICAgICAgLyogQWR2YW5jZSB0byB0aGUgbmV4dCBBUkdWLWVsZW1lbnQuICAqLwotCi0gICAgICAvKiBHaXZlIEZJUlNUX05PTk9QVCAmIExBU1RfTk9OT1BUIHJhdGlvbmFsIHZhbHVlcyBpZiBPUFRJTkQgaGFzIGJlZW4KLQkgbW92ZWQgYmFjayBieSB0aGUgdXNlciAod2hvIG1heSBhbHNvIGhhdmUgY2hhbmdlZCB0aGUgYXJndW1lbnRzKS4gICovCi0gICAgICBpZiAobGFzdF9ub25vcHQgPiBvcHRpbmQpCi0JbGFzdF9ub25vcHQgPSBvcHRpbmQ7Ci0gICAgICBpZiAoZmlyc3Rfbm9ub3B0ID4gb3B0aW5kKQotCWZpcnN0X25vbm9wdCA9IG9wdGluZDsKLQotICAgICAgaWYgKG9yZGVyaW5nID09IFBFUk1VVEUpCi0JewotCSAgLyogSWYgd2UgaGF2ZSBqdXN0IHByb2Nlc3NlZCBzb21lIG9wdGlvbnMgZm9sbG93aW5nIHNvbWUgbm9uLW9wdGlvbnMsCi0JICAgICBleGNoYW5nZSB0aGVtIHNvIHRoYXQgdGhlIG9wdGlvbnMgY29tZSBmaXJzdC4gICovCi0KLQkgIGlmIChmaXJzdF9ub25vcHQgIT0gbGFzdF9ub25vcHQgJiYgbGFzdF9ub25vcHQgIT0gb3B0aW5kKQotCSAgICBleGNoYW5nZSAoKGNoYXIgKiopIGFyZ3YpOwotCSAgZWxzZSBpZiAobGFzdF9ub25vcHQgIT0gb3B0aW5kKQotCSAgICBmaXJzdF9ub25vcHQgPSBvcHRpbmQ7Ci0KLQkgIC8qIFNraXAgYW55IGFkZGl0aW9uYWwgbm9uLW9wdGlvbnMKLQkgICAgIGFuZCBleHRlbmQgdGhlIHJhbmdlIG9mIG5vbi1vcHRpb25zIHByZXZpb3VzbHkgc2tpcHBlZC4gICovCi0KLQkgIHdoaWxlIChvcHRpbmQgPCBhcmdjICYmIE5PTk9QVElPTl9QKQotCSAgICBvcHRpbmQrKzsKLQkgIGxhc3Rfbm9ub3B0ID0gb3B0aW5kOwotCX0KLQotICAgICAgLyogVGhlIHNwZWNpYWwgQVJHVi1lbGVtZW50IGAtLScgbWVhbnMgcHJlbWF0dXJlIGVuZCBvZiBvcHRpb25zLgotCSBTa2lwIGl0IGxpa2UgYSBudWxsIG9wdGlvbiwKLQkgdGhlbiBleGNoYW5nZSB3aXRoIHByZXZpb3VzIG5vbi1vcHRpb25zIGFzIGlmIGl0IHdlcmUgYW4gb3B0aW9uLAotCSB0aGVuIHNraXAgZXZlcnl0aGluZyBlbHNlIGxpa2UgYSBub24tb3B0aW9uLiAgKi8KLQotICAgICAgaWYgKG9wdGluZCAhPSBhcmdjICYmICFzdHJjbXAgKGFyZ3Zbb3B0aW5kXSwgIi0tIikpCi0JewotCSAgb3B0aW5kKys7Ci0KLQkgIGlmIChmaXJzdF9ub25vcHQgIT0gbGFzdF9ub25vcHQgJiYgbGFzdF9ub25vcHQgIT0gb3B0aW5kKQotCSAgICBleGNoYW5nZSAoKGNoYXIgKiopIGFyZ3YpOwotCSAgZWxzZSBpZiAoZmlyc3Rfbm9ub3B0ID09IGxhc3Rfbm9ub3B0KQotCSAgICBmaXJzdF9ub25vcHQgPSBvcHRpbmQ7Ci0JICBsYXN0X25vbm9wdCA9IGFyZ2M7Ci0KLQkgIG9wdGluZCA9IGFyZ2M7Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBoYXZlIGRvbmUgYWxsIHRoZSBBUkdWLWVsZW1lbnRzLCBzdG9wIHRoZSBzY2FuCi0JIGFuZCBiYWNrIG92ZXIgYW55IG5vbi1vcHRpb25zIHRoYXQgd2Ugc2tpcHBlZCBhbmQgcGVybXV0ZWQuICAqLwotCi0gICAgICBpZiAob3B0aW5kID09IGFyZ2MpCi0JewotCSAgLyogU2V0IHRoZSBuZXh0LWFyZy1pbmRleCB0byBwb2ludCBhdCB0aGUgbm9uLW9wdGlvbnMKLQkgICAgIHRoYXQgd2UgcHJldmlvdXNseSBza2lwcGVkLCBzbyB0aGUgY2FsbGVyIHdpbGwgZGlnZXN0IHRoZW0uICAqLwotCSAgaWYgKGZpcnN0X25vbm9wdCAhPSBsYXN0X25vbm9wdCkKLQkgICAgb3B0aW5kID0gZmlyc3Rfbm9ub3B0OwotCSAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgLyogSWYgd2UgaGF2ZSBjb21lIHRvIGEgbm9uLW9wdGlvbiBhbmQgZGlkIG5vdCBwZXJtdXRlIGl0LAotCSBlaXRoZXIgc3RvcCB0aGUgc2NhbiBvciBkZXNjcmliZSBpdCB0byB0aGUgY2FsbGVyIGFuZCBwYXNzIGl0IGJ5LiAgKi8KLQotICAgICAgaWYgKE5PTk9QVElPTl9QKQotCXsKLQkgIGlmIChvcmRlcmluZyA9PSBSRVFVSVJFX09SREVSKQotCSAgICByZXR1cm4gLTE7Ci0JICBvcHRhcmcgPSBhcmd2W29wdGluZCsrXTsKLQkgIHJldHVybiAxOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBmb3VuZCBhbm90aGVyIG9wdGlvbi1BUkdWLWVsZW1lbnQuCi0JIFNraXAgdGhlIGluaXRpYWwgcHVuY3R1YXRpb24uICAqLwotCi0gICAgICBuZXh0Y2hhciA9IChhcmd2W29wdGluZF0gKyAxCi0JCSAgKyAobG9uZ29wdHMgIT0gTlVMTCAmJiBhcmd2W29wdGluZF1bMV0gPT0gJy0nKSk7Ci0gICAgfQotCi0gIC8qIERlY29kZSB0aGUgY3VycmVudCBvcHRpb24tQVJHVi1lbGVtZW50LiAgKi8KLQotICAvKiBDaGVjayB3aGV0aGVyIHRoZSBBUkdWLWVsZW1lbnQgaXMgYSBsb25nIG9wdGlvbi4KLQotICAgICBJZiBsb25nX29ubHkgYW5kIHRoZSBBUkdWLWVsZW1lbnQgaGFzIHRoZSBmb3JtICItZiIsIHdoZXJlIGYgaXMKLSAgICAgYSB2YWxpZCBzaG9ydCBvcHRpb24sIGRvbid0IGNvbnNpZGVyIGl0IGFuIGFiYnJldmlhdGVkIGZvcm0gb2YKLSAgICAgYSBsb25nIG9wdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIGYuICBPdGhlcndpc2UgdGhlcmUgd291bGQgYmUgbm8KLSAgICAgd2F5IHRvIGdpdmUgdGhlIC1mIHNob3J0IG9wdGlvbi4KLQotICAgICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlcmUncyBhIGxvbmcgb3B0aW9uICJmdWJhciIgYW5kCi0gICAgIHRoZSBBUkdWLWVsZW1lbnQgaXMgIi1mdSIsIGRvIGNvbnNpZGVyIHRoYXQgYW4gYWJicmV2aWF0aW9uIG9mCi0gICAgIHRoZSBsb25nIG9wdGlvbiwganVzdCBsaWtlICItLWZ1IiwgYW5kIG5vdCAiLWYiIHdpdGggYXJnICJ1Ii4KLQotICAgICBUaGlzIGRpc3RpbmN0aW9uIHNlZW1zIHRvIGJlIHRoZSBtb3N0IHVzZWZ1bCBhcHByb2FjaC4gICovCi0KLSAgaWYgKGxvbmdvcHRzICE9IE5VTEwKLSAgICAgICYmIChhcmd2W29wdGluZF1bMV0gPT0gJy0nCi0JICB8fCAobG9uZ19vbmx5ICYmIChhcmd2W29wdGluZF1bMl0gfHwgIW15X2luZGV4IChvcHRzdHJpbmcsIGFyZ3Zbb3B0aW5kXVsxXSkpKSkpCi0gICAgewotICAgICAgY2hhciAqbmFtZWVuZDsKLSAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKnA7Ci0gICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpwZm91bmQgPSBOVUxMOwotICAgICAgaW50IGV4YWN0ID0gMDsKLSAgICAgIGludCBhbWJpZyA9IDA7Ci0gICAgICBpbnQgaW5kZm91bmQgPSAtMTsKLSAgICAgIGludCBvcHRpb25faW5kZXg7Ci0KLSAgICAgIGZvciAobmFtZWVuZCA9IG5leHRjaGFyOyAqbmFtZWVuZCAmJiAqbmFtZWVuZCAhPSAnPSc7IG5hbWVlbmQrKykKLQkvKiBEbyBub3RoaW5nLiAgKi8gOwotCi0gICAgICAvKiBUZXN0IGFsbCBsb25nIG9wdGlvbnMgZm9yIGVpdGhlciBleGFjdCBtYXRjaAotCSBvciBhYmJyZXZpYXRlZCBtYXRjaGVzLiAgKi8KLSAgICAgIGZvciAocCA9IGxvbmdvcHRzLCBvcHRpb25faW5kZXggPSAwOyBwLT5uYW1lOyBwKyssIG9wdGlvbl9pbmRleCsrKQotCWlmICghc3RybmNtcCAocC0+bmFtZSwgbmV4dGNoYXIsIG5hbWVlbmQgLSBuZXh0Y2hhcikpCi0JICB7Ci0JICAgIGlmICgodW5zaWduZWQgaW50KSAobmFtZWVuZCAtIG5leHRjaGFyKQotCQk9PSAodW5zaWduZWQgaW50KSBzdHJsZW4gKHAtPm5hbWUpKQotCSAgICAgIHsKLQkJLyogRXhhY3QgbWF0Y2ggZm91bmQuICAqLwotCQlwZm91bmQgPSBwOwotCQlpbmRmb3VuZCA9IG9wdGlvbl9pbmRleDsKLQkJZXhhY3QgPSAxOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHBmb3VuZCA9PSBOVUxMKQotCSAgICAgIHsKLQkJLyogRmlyc3Qgbm9uZXhhY3QgbWF0Y2ggZm91bmQuICAqLwotCQlwZm91bmQgPSBwOwotCQlpbmRmb3VuZCA9IG9wdGlvbl9pbmRleDsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICAvKiBTZWNvbmQgb3IgbGF0ZXIgbm9uZXhhY3QgbWF0Y2ggZm91bmQuICAqLwotCSAgICAgIGFtYmlnID0gMTsKLQkgIH0KLQotICAgICAgaWYgKGFtYmlnICYmICFleGFjdCkKLQl7Ci0JICBpZiAob3B0ZXJyKQotCSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBvcHRpb24gYCVzJyBpcyBhbWJpZ3VvdXNcbiIpLAotCQkgICAgIGFyZ3ZbMF0sIGFyZ3Zbb3B0aW5kXSk7Ci0JICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKLQkgIG9wdGluZCsrOwotCSAgb3B0b3B0ID0gMDsKLQkgIHJldHVybiAnPyc7Ci0JfQotCi0gICAgICBpZiAocGZvdW5kICE9IE5VTEwpCi0JewotCSAgb3B0aW9uX2luZGV4ID0gaW5kZm91bmQ7Ci0JICBvcHRpbmQrKzsKLQkgIGlmICgqbmFtZWVuZCkKLQkgICAgewotCSAgICAgIC8qIERvbid0IHRlc3QgaGFzX2FyZyB3aXRoID4sIGJlY2F1c2Ugc29tZSBDIGNvbXBpbGVycyBkb24ndAotCQkgYWxsb3cgaXQgdG8gYmUgdXNlZCBvbiBlbnVtcy4gICovCi0JICAgICAgaWYgKHBmb3VuZC0+aGFzX2FyZykKLQkJb3B0YXJnID0gbmFtZWVuZCArIDE7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKG9wdGVycikKLQkJICAgIHsKLQkJICAgICAgaWYgKGFyZ3Zbb3B0aW5kIC0gMV1bMV0gPT0gJy0nKQotCQkJLyogLS1vcHRpb24gKi8KLQkJCWZwcmludGYgKHN0ZGVyciwKLQkJCQkgXygiJXM6IG9wdGlvbiBgLS0lcycgZG9lc24ndCBhbGxvdyBhbiBhcmd1bWVudFxuIiksCi0JCQkJIGFyZ3ZbMF0sIHBmb3VuZC0+bmFtZSk7Ci0JCSAgICAgIGVsc2UKLQkJCS8qICtvcHRpb24gb3IgLW9wdGlvbiAqLwotCQkJZnByaW50ZiAoc3RkZXJyLAotCQkJCSBfKCIlczogb3B0aW9uIGAlYyVzJyBkb2Vzbid0IGFsbG93IGFuIGFyZ3VtZW50XG4iKSwKLQkJCQkgYXJndlswXSwgYXJndltvcHRpbmQgLSAxXVswXSwgcGZvdW5kLT5uYW1lKTsKLQotCQkgICAgICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKLQotCQkgICAgICBvcHRvcHQgPSBwZm91bmQtPnZhbDsKLQkJICAgICAgcmV0dXJuICc/JzsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChwZm91bmQtPmhhc19hcmcgPT0gMSkKLQkgICAgewotCSAgICAgIGlmIChvcHRpbmQgPCBhcmdjKQotCQlvcHRhcmcgPSBhcmd2W29wdGluZCsrXTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAob3B0ZXJyKQotCQkgICAgZnByaW50ZiAoc3RkZXJyLAotCQkJICAgXygiJXM6IG9wdGlvbiBgJXMnIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKSwKLQkJCSAgIGFyZ3ZbMF0sIGFyZ3Zbb3B0aW5kIC0gMV0pOwotCQkgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOwotCQkgIG9wdG9wdCA9IHBmb3VuZC0+dmFsOwotCQkgIHJldHVybiBvcHRzdHJpbmdbMF0gPT0gJzonID8gJzonIDogJz8nOwotCQl9Ci0JICAgIH0KLQkgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOwotCSAgaWYgKGxvbmdpbmQgIT0gTlVMTCkKLQkgICAgKmxvbmdpbmQgPSBvcHRpb25faW5kZXg7Ci0JICBpZiAocGZvdW5kLT5mbGFnKQotCSAgICB7Ci0JICAgICAgKihwZm91bmQtPmZsYWcpID0gcGZvdW5kLT52YWw7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQkgIHJldHVybiBwZm91bmQtPnZhbDsKLQl9Ci0KLSAgICAgIC8qIENhbid0IGZpbmQgaXQgYXMgYSBsb25nIG9wdGlvbi4gIElmIHRoaXMgaXMgbm90IGdldG9wdF9sb25nX29ubHksCi0JIG9yIHRoZSBvcHRpb24gc3RhcnRzIHdpdGggJy0tJyBvciBpcyBub3QgYSB2YWxpZCBzaG9ydAotCSBvcHRpb24sIHRoZW4gaXQncyBhbiBlcnJvci4KLQkgT3RoZXJ3aXNlIGludGVycHJldCBpdCBhcyBhIHNob3J0IG9wdGlvbi4gICovCi0gICAgICBpZiAoIWxvbmdfb25seSB8fCBhcmd2W29wdGluZF1bMV0gPT0gJy0nCi0JICB8fCBteV9pbmRleCAob3B0c3RyaW5nLCAqbmV4dGNoYXIpID09IE5VTEwpCi0JewotCSAgaWYgKG9wdGVycikKLQkgICAgewotCSAgICAgIGlmIChhcmd2W29wdGluZF1bMV0gPT0gJy0nKQotCQkvKiAtLW9wdGlvbiAqLwotCQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bnJlY29nbml6ZWQgb3B0aW9uIGAtLSVzJ1xuIiksCi0JCQkgYXJndlswXSwgbmV4dGNoYXIpOwotCSAgICAgIGVsc2UKLQkJLyogK29wdGlvbiBvciAtb3B0aW9uICovCi0JCWZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVucmVjb2duaXplZCBvcHRpb24gYCVjJXMnXG4iKSwKLQkJCSBhcmd2WzBdLCBhcmd2W29wdGluZF1bMF0sIG5leHRjaGFyKTsKLQkgICAgfQotCSAgbmV4dGNoYXIgPSAoY2hhciAqKSAiIjsKLQkgIG9wdGluZCsrOwotCSAgb3B0b3B0ID0gMDsKLQkgIHJldHVybiAnPyc7Ci0JfQotICAgIH0KLQotICAvKiBMb29rIGF0IGFuZCBoYW5kbGUgdGhlIG5leHQgc2hvcnQgb3B0aW9uLWNoYXJhY3Rlci4gICovCi0KLSAgewotICAgIGNoYXIgYyA9ICpuZXh0Y2hhcisrOwotICAgIGNoYXIgKnRlbXAgPSBteV9pbmRleCAob3B0c3RyaW5nLCBjKTsKLQotICAgIC8qIEluY3JlbWVudCBgb3B0aW5kJyB3aGVuIHdlIHN0YXJ0IHRvIHByb2Nlc3MgaXRzIGxhc3QgY2hhcmFjdGVyLiAgKi8KLSAgICBpZiAoKm5leHRjaGFyID09ICdcMCcpCi0gICAgICArK29wdGluZDsKLQotICAgIGlmICh0ZW1wID09IE5VTEwgfHwgYyA9PSAnOicpCi0gICAgICB7Ci0JaWYgKG9wdGVycikKLQkgIHsKLQkgICAgaWYgKHBvc2l4bHlfY29ycmVjdCkKLQkgICAgICAvKiAxMDAzLjIgc3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhpcyBtZXNzYWdlLiAgKi8KLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBpbGxlZ2FsIG9wdGlvbiAtLSAlY1xuIiksCi0JCSAgICAgICBhcmd2WzBdLCBjKTsKLQkgICAgZWxzZQotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGludmFsaWQgb3B0aW9uIC0tICVjXG4iKSwKLQkJICAgICAgIGFyZ3ZbMF0sIGMpOwotCSAgfQotCW9wdG9wdCA9IGM7Ci0JcmV0dXJuICc/JzsKLSAgICAgIH0KLSAgICAvKiBDb252ZW5pZW5jZS4gVHJlYXQgUE9TSVggLVcgZm9vIHNhbWUgYXMgbG9uZyBvcHRpb24gLS1mb28gKi8KLSAgICBpZiAodGVtcFswXSA9PSAnVycgJiYgdGVtcFsxXSA9PSAnOycpCi0gICAgICB7Ci0JY2hhciAqbmFtZWVuZDsKLQljb25zdCBzdHJ1Y3Qgb3B0aW9uICpwOwotCWNvbnN0IHN0cnVjdCBvcHRpb24gKnBmb3VuZCA9IE5VTEw7Ci0JaW50IGV4YWN0ID0gMDsKLQlpbnQgYW1iaWcgPSAwOwotCWludCBpbmRmb3VuZCA9IDA7Ci0JaW50IG9wdGlvbl9pbmRleDsKLQotCS8qIFRoaXMgaXMgYW4gb3B0aW9uIHRoYXQgcmVxdWlyZXMgYW4gYXJndW1lbnQuICAqLwotCWlmICgqbmV4dGNoYXIgIT0gJ1wwJykKLQkgIHsKLQkgICAgb3B0YXJnID0gbmV4dGNoYXI7Ci0JICAgIC8qIElmIHdlIGVuZCB0aGlzIEFSR1YtZWxlbWVudCBieSB0YWtpbmcgdGhlIHJlc3QgYXMgYW4gYXJnLAotCSAgICAgICB3ZSBtdXN0IGFkdmFuY2UgdG8gdGhlIG5leHQgZWxlbWVudCBub3cuICAqLwotCSAgICBvcHRpbmQrKzsKLQkgIH0KLQllbHNlIGlmIChvcHRpbmQgPT0gYXJnYykKLQkgIHsKLQkgICAgaWYgKG9wdGVycikKLQkgICAgICB7Ci0JCS8qIDEwMDMuMiBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGlzIG1lc3NhZ2UuICAqLwotCQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQgLS0gJWNcbiIpLAotCQkJIGFyZ3ZbMF0sIGMpOwotCSAgICAgIH0KLQkgICAgb3B0b3B0ID0gYzsKLQkgICAgaWYgKG9wdHN0cmluZ1swXSA9PSAnOicpCi0JICAgICAgYyA9ICc6JzsKLQkgICAgZWxzZQotCSAgICAgIGMgPSAnPyc7Ci0JICAgIHJldHVybiBjOwotCSAgfQotCWVsc2UKLQkgIC8qIFdlIGFscmVhZHkgaW5jcmVtZW50ZWQgYG9wdGluZCcgb25jZTsKLQkgICAgIGluY3JlbWVudCBpdCBhZ2FpbiB3aGVuIHRha2luZyBuZXh0IEFSR1YtZWx0IGFzIGFyZ3VtZW50LiAgKi8KLQkgIG9wdGFyZyA9IGFyZ3Zbb3B0aW5kKytdOwotCi0JLyogb3B0YXJnIGlzIG5vdyB0aGUgYXJndW1lbnQsIHNlZSBpZiBpdCdzIGluIHRoZQotCSAgIHRhYmxlIG9mIGxvbmdvcHRzLiAgKi8KLQotCWZvciAobmV4dGNoYXIgPSBuYW1lZW5kID0gb3B0YXJnOyAqbmFtZWVuZCAmJiAqbmFtZWVuZCAhPSAnPSc7IG5hbWVlbmQrKykKLQkgIC8qIERvIG5vdGhpbmcuICAqLyA7Ci0KLQkvKiBUZXN0IGFsbCBsb25nIG9wdGlvbnMgZm9yIGVpdGhlciBleGFjdCBtYXRjaAotCSAgIG9yIGFiYnJldmlhdGVkIG1hdGNoZXMuICAqLwotCWZvciAocCA9IGxvbmdvcHRzLCBvcHRpb25faW5kZXggPSAwOyBwLT5uYW1lOyBwKyssIG9wdGlvbl9pbmRleCsrKQotCSAgaWYgKCFzdHJuY21wIChwLT5uYW1lLCBuZXh0Y2hhciwgbmFtZWVuZCAtIG5leHRjaGFyKSkKLQkgICAgewotCSAgICAgIGlmICgodW5zaWduZWQgaW50KSAobmFtZWVuZCAtIG5leHRjaGFyKSA9PSBzdHJsZW4gKHAtPm5hbWUpKQotCQl7Ci0JCSAgLyogRXhhY3QgbWF0Y2ggZm91bmQuICAqLwotCQkgIHBmb3VuZCA9IHA7Ci0JCSAgaW5kZm91bmQgPSBvcHRpb25faW5kZXg7Ci0JCSAgZXhhY3QgPSAxOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgZWxzZSBpZiAocGZvdW5kID09IE5VTEwpCi0JCXsKLQkJICAvKiBGaXJzdCBub25leGFjdCBtYXRjaCBmb3VuZC4gICovCi0JCSAgcGZvdW5kID0gcDsKLQkJICBpbmRmb3VuZCA9IG9wdGlvbl9pbmRleDsKLQkJfQotCSAgICAgIGVsc2UKLQkJLyogU2Vjb25kIG9yIGxhdGVyIG5vbmV4YWN0IG1hdGNoIGZvdW5kLiAgKi8KLQkJYW1iaWcgPSAxOwotCSAgICB9Ci0JaWYgKGFtYmlnICYmICFleGFjdCkKLQkgIHsKLQkgICAgaWYgKG9wdGVycikKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBvcHRpb24gYC1XICVzJyBpcyBhbWJpZ3VvdXNcbiIpLAotCQkgICAgICAgYXJndlswXSwgYXJndltvcHRpbmRdKTsKLQkgICAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7Ci0JICAgIG9wdGluZCsrOwotCSAgICByZXR1cm4gJz8nOwotCSAgfQotCWlmIChwZm91bmQgIT0gTlVMTCkKLQkgIHsKLQkgICAgb3B0aW9uX2luZGV4ID0gaW5kZm91bmQ7Ci0JICAgIGlmICgqbmFtZWVuZCkKLQkgICAgICB7Ci0JCS8qIERvbid0IHRlc3QgaGFzX2FyZyB3aXRoID4sIGJlY2F1c2Ugc29tZSBDIGNvbXBpbGVycyBkb24ndAotCQkgICBhbGxvdyBpdCB0byBiZSB1c2VkIG9uIGVudW1zLiAgKi8KLQkJaWYgKHBmb3VuZC0+aGFzX2FyZykKLQkJICBvcHRhcmcgPSBuYW1lZW5kICsgMTsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGlmIChvcHRlcnIpCi0JCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiXAotJXM6IG9wdGlvbiBgLVcgJXMnIGRvZXNuJ3QgYWxsb3cgYW4gYXJndW1lbnRcbiIpLAotCQkJICAgICAgIGFyZ3ZbMF0sIHBmb3VuZC0+bmFtZSk7Ci0KLQkJICAgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOwotCQkgICAgcmV0dXJuICc/JzsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChwZm91bmQtPmhhc19hcmcgPT0gMSkKLQkgICAgICB7Ci0JCWlmIChvcHRpbmQgPCBhcmdjKQotCQkgIG9wdGFyZyA9IGFyZ3Zbb3B0aW5kKytdOwotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKG9wdGVycikKLQkJICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkJICAgICAgIF8oIiVzOiBvcHRpb24gYCVzJyByZXF1aXJlcyBhbiBhcmd1bWVudFxuIiksCi0JCQkgICAgICAgYXJndlswXSwgYXJndltvcHRpbmQgLSAxXSk7Ci0JCSAgICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKLQkJICAgIHJldHVybiBvcHRzdHJpbmdbMF0gPT0gJzonID8gJzonIDogJz8nOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOwotCSAgICBpZiAobG9uZ2luZCAhPSBOVUxMKQotCSAgICAgICpsb25naW5kID0gb3B0aW9uX2luZGV4OwotCSAgICBpZiAocGZvdW5kLT5mbGFnKQotCSAgICAgIHsKLQkJKihwZm91bmQtPmZsYWcpID0gcGZvdW5kLT52YWw7Ci0JCXJldHVybiAwOwotCSAgICAgIH0KLQkgICAgcmV0dXJuIHBmb3VuZC0+dmFsOwotCSAgfQotCSAgbmV4dGNoYXIgPSBOVUxMOwotCSAgcmV0dXJuICdXJzsJLyogTGV0IHRoZSBhcHBsaWNhdGlvbiBoYW5kbGUgaXQuICAgKi8KLSAgICAgIH0KLSAgICBpZiAodGVtcFsxXSA9PSAnOicpCi0gICAgICB7Ci0JaWYgKHRlbXBbMl0gPT0gJzonKQotCSAgewotCSAgICAvKiBUaGlzIGlzIGFuIG9wdGlvbiB0aGF0IGFjY2VwdHMgYW4gYXJndW1lbnQgb3B0aW9uYWxseS4gICovCi0JICAgIGlmICgqbmV4dGNoYXIgIT0gJ1wwJykKLQkgICAgICB7Ci0JCW9wdGFyZyA9IG5leHRjaGFyOwotCQlvcHRpbmQrKzsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICBvcHRhcmcgPSBOVUxMOwotCSAgICBuZXh0Y2hhciA9IE5VTEw7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAvKiBUaGlzIGlzIGFuIG9wdGlvbiB0aGF0IHJlcXVpcmVzIGFuIGFyZ3VtZW50LiAgKi8KLQkgICAgaWYgKCpuZXh0Y2hhciAhPSAnXDAnKQotCSAgICAgIHsKLQkJb3B0YXJnID0gbmV4dGNoYXI7Ci0JCS8qIElmIHdlIGVuZCB0aGlzIEFSR1YtZWxlbWVudCBieSB0YWtpbmcgdGhlIHJlc3QgYXMgYW4gYXJnLAotCQkgICB3ZSBtdXN0IGFkdmFuY2UgdG8gdGhlIG5leHQgZWxlbWVudCBub3cuICAqLwotCQlvcHRpbmQrKzsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKG9wdGluZCA9PSBhcmdjKQotCSAgICAgIHsKLQkJaWYgKG9wdGVycikKLQkJICB7Ci0JCSAgICAvKiAxMDAzLjIgc3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhpcyBtZXNzYWdlLiAgKi8KLQkJICAgIGZwcmludGYgKHN0ZGVyciwKLQkJCSAgIF8oIiVzOiBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQgLS0gJWNcbiIpLAotCQkJICAgYXJndlswXSwgYyk7Ci0JCSAgfQotCQlvcHRvcHQgPSBjOwotCQlpZiAob3B0c3RyaW5nWzBdID09ICc6JykKLQkJICBjID0gJzonOwotCQllbHNlCi0JCSAgYyA9ICc/JzsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICAvKiBXZSBhbHJlYWR5IGluY3JlbWVudGVkIGBvcHRpbmQnIG9uY2U7Ci0JCSBpbmNyZW1lbnQgaXQgYWdhaW4gd2hlbiB0YWtpbmcgbmV4dCBBUkdWLWVsdCBhcyBhcmd1bWVudC4gICovCi0JICAgICAgb3B0YXJnID0gYXJndltvcHRpbmQrK107Ci0JICAgIG5leHRjaGFyID0gTlVMTDsKLQkgIH0KLSAgICAgIH0KLSAgICByZXR1cm4gYzsKLSAgfQotfQotCi1pbnQKLWdldG9wdCAoYXJnYywgYXJndiwgb3B0c3RyaW5nKQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKm9wdHN0cmluZzsKLXsKLSAgcmV0dXJuIF9nZXRvcHRfaW50ZXJuYWwgKGFyZ2MsIGFyZ3YsIG9wdHN0cmluZywKLQkJCSAgIChjb25zdCBzdHJ1Y3Qgb3B0aW9uICopIDAsCi0JCQkgICAoaW50ICopIDAsCi0JCQkgICAwKTsKLX0KLQotI2VuZGlmCS8qIE5vdCBFTElERV9DT0RFLiAgKi8KLQwKLSNpZmRlZiBURVNUCi0KLS8qIENvbXBpbGUgd2l0aCAtRFRFU1QgdG8gbWFrZSBhbiBleGVjdXRhYmxlIGZvciB1c2UgaW4gdGVzdGluZwotICAgdGhlIGFib3ZlIGRlZmluaXRpb24gb2YgYGdldG9wdCcuICAqLwotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGM7Ci0gIGludCBkaWdpdF9vcHRpbmQgPSAwOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCB0aGlzX29wdGlvbl9vcHRpbmQgPSBvcHRpbmQgPyBvcHRpbmQgOiAxOwotCi0gICAgICBjID0gZ2V0b3B0IChhcmdjLCBhcmd2LCAiYWJjOmQ6MDEyMzQ1Njc4OSIpOwotICAgICAgaWYgKGMgPT0gLTEpCi0JYnJlYWs7Ci0KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnMCc6Ci0JY2FzZSAnMSc6Ci0JY2FzZSAnMic6Ci0JY2FzZSAnMyc6Ci0JY2FzZSAnNCc6Ci0JY2FzZSAnNSc6Ci0JY2FzZSAnNic6Ci0JY2FzZSAnNyc6Ci0JY2FzZSAnOCc6Ci0JY2FzZSAnOSc6Ci0JICBpZiAoZGlnaXRfb3B0aW5kICE9IDAgJiYgZGlnaXRfb3B0aW5kICE9IHRoaXNfb3B0aW9uX29wdGluZCkKLQkgICAgcHJpbnRmICgiZGlnaXRzIG9jY3VyIGluIHR3byBkaWZmZXJlbnQgYXJndi1lbGVtZW50cy5cbiIpOwotCSAgZGlnaXRfb3B0aW5kID0gdGhpc19vcHRpb25fb3B0aW5kOwotCSAgcHJpbnRmICgib3B0aW9uICVjXG4iLCBjKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYSc6Ci0JICBwcmludGYgKCJvcHRpb24gYVxuIik7Ci0JICBicmVhazsKLQotCWNhc2UgJ2InOgotCSAgcHJpbnRmICgib3B0aW9uIGJcbiIpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdjJzoKLQkgIHByaW50ZiAoIm9wdGlvbiBjIHdpdGggdmFsdWUgYCVzJ1xuIiwgb3B0YXJnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnPyc6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBwcmludGYgKCI/PyBnZXRvcHQgcmV0dXJuZWQgY2hhcmFjdGVyIGNvZGUgMCVvID8/XG4iLCBjKTsKLQl9Ci0gICAgfQotCi0gIGlmIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIHByaW50ZiAoIm5vbi1vcHRpb24gQVJHVi1lbGVtZW50czogIik7Ci0gICAgICB3aGlsZSAob3B0aW5kIDwgYXJnYykKLQlwcmludGYgKCIlcyAiLCBhcmd2W29wdGluZCsrXSk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLQotICBleGl0ICgwKTsKLX0KLQotI2VuZGlmIC8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9nZXRvcHQxLmMgYi9saWJpYmVydHkvZ2V0b3B0MS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjI1NzM3Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9nZXRvcHQxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyogZ2V0b3B0X2xvbmcgYW5kIGdldG9wdF9sb25nX29ubHkgZW50cnkgcG9pbnRzIGZvciBHTlUgZ2V0b3B0LgotICAgQ29weXJpZ2h0IChDKSAxOTg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk2LDk3LDk4Ci0gICAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBOT1RFOiBUaGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0aGlzIGZpbGUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5LgotICAgQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQGdudS5vcmcuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLSAgIGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotDAotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0KLSNpZiAhZGVmaW5lZCBfX1NURENfXyB8fCAhX19TVERDX18KLS8qIFRoaXMgaXMgYSBzZXBhcmF0ZSBjb25kaXRpb25hbCBzaW5jZSBzb21lIHN0ZGMgc3lzdGVtcwotICAgcmVqZWN0IGBkZWZpbmVkIChjb25zdCknLiAgKi8KLSNpZm5kZWYgY29uc3QKLSNkZWZpbmUgY29uc3QKLSNlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vKiBDb21tZW50IG91dCBhbGwgdGhpcyBjb2RlIGlmIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgTGlicmFyeSwgYW5kIGFyZSBub3QKLSAgIGFjdHVhbGx5IGNvbXBpbGluZyB0aGUgbGlicmFyeSBpdHNlbGYuICBUaGlzIGNvZGUgaXMgcGFydCBvZiB0aGUgR05VIEMKLSAgIExpYnJhcnksIGJ1dCBhbHNvIGluY2x1ZGVkIGluIG1hbnkgb3RoZXIgR05VIGRpc3RyaWJ1dGlvbnMuICBDb21waWxpbmcKLSAgIGFuZCBsaW5raW5nIGluIHRoaXMgY29kZSBpcyBhIHdhc3RlIHdoZW4gdXNpbmcgdGhlIEdOVSBDIGxpYnJhcnkKLSAgIChlc3BlY2lhbGx5IGlmIGl0IGlzIGEgc2hhcmVkIGxpYnJhcnkpLiAgUmF0aGVyIHRoYW4gaGF2aW5nIGV2ZXJ5IEdOVQotICAgcHJvZ3JhbSB1bmRlcnN0YW5kIGBjb25maWd1cmUgLS13aXRoLWdudS1saWJjJyBhbmQgb21pdCB0aGUgb2JqZWN0IGZpbGVzLAotICAgaXQgaXMgc2ltcGxlciB0byBqdXN0IGRvIHRoaXMgaW4gdGhlIHNvdXJjZSBmb3IgZWFjaCBzdWNoIGZpbGUuICAqLwotCi0jZGVmaW5lIEdFVE9QVF9JTlRFUkZBQ0VfVkVSU0lPTiAyCi0jaWYgIWRlZmluZWQgX0xJQkMgJiYgZGVmaW5lZCBfX0dMSUJDX18gJiYgX19HTElCQ19fID49IDIKLSNpbmNsdWRlIDxnbnUtdmVyc2lvbnMuaD4KLSNpZiBfR05VX0dFVE9QVF9JTlRFUkZBQ0VfVkVSU0lPTiA9PSBHRVRPUFRfSU5URVJGQUNFX1ZFUlNJT04KLSNkZWZpbmUgRUxJREVfQ09ERQotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBFTElERV9DT0RFCi0KLQotLyogVGhpcyBuZWVkcyB0byBjb21lIGFmdGVyIHNvbWUgbGlicmFyeSAjaW5jbHVkZQotICAgdG8gZ2V0IF9fR05VX0xJQlJBUllfXyBkZWZpbmVkLiAgKi8KLSNpZmRlZiBfX0dOVV9MSUJSQVJZX18KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZuZGVmCU5VTEwKLSNkZWZpbmUgTlVMTCAwCi0jZW5kaWYKLQotaW50Ci1nZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgb3B0aW9ucywgbG9uZ19vcHRpb25zLCBvcHRfaW5kZXgpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICpjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqb3B0aW9uczsKLSAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ19vcHRpb25zOwotICAgICBpbnQgKm9wdF9pbmRleDsKLXsKLSAgcmV0dXJuIF9nZXRvcHRfaW50ZXJuYWwgKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIGxvbmdfb3B0aW9ucywgb3B0X2luZGV4LCAwKTsKLX0KLQotLyogTGlrZSBnZXRvcHRfbG9uZywgYnV0ICctJyBhcyB3ZWxsIGFzICctLScgY2FuIGluZGljYXRlIGEgbG9uZyBvcHRpb24uCi0gICBJZiBhbiBvcHRpb24gdGhhdCBzdGFydHMgd2l0aCAnLScgKG5vdCAnLS0nKSBkb2Vzbid0IG1hdGNoIGEgbG9uZyBvcHRpb24sCi0gICBidXQgZG9lcyBtYXRjaCBhIHNob3J0IG9wdGlvbiwgaXQgaXMgcGFyc2VkIGFzIGEgc2hvcnQgb3B0aW9uCi0gICBpbnN0ZWFkLiAgKi8KLQotaW50Ci1nZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCBvcHRpb25zLCBsb25nX29wdGlvbnMsIG9wdF9pbmRleCkKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICpvcHRpb25zOwotICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nX29wdGlvbnM7Ci0gICAgIGludCAqb3B0X2luZGV4OwotewotICByZXR1cm4gX2dldG9wdF9pbnRlcm5hbCAoYXJnYywgYXJndiwgb3B0aW9ucywgbG9uZ19vcHRpb25zLCBvcHRfaW5kZXgsIDEpOwotfQotCi0KLSNlbmRpZgkvKiBOb3QgRUxJREVfQ09ERS4gICovCi0MCi0jaWZkZWYgVEVTVAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBjOwotICBpbnQgZGlnaXRfb3B0aW5kID0gMDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpbnQgdGhpc19vcHRpb25fb3B0aW5kID0gb3B0aW5kID8gb3B0aW5kIDogMTsKLSAgICAgIGludCBvcHRpb25faW5kZXggPSAwOwotICAgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotICAgICAgewotCXsiYWRkIiwgMSwgMCwgMH0sCi0JeyJhcHBlbmQiLCAwLCAwLCAwfSwKLQl7ImRlbGV0ZSIsIDEsIDAsIDB9LAotCXsidmVyYm9zZSIsIDAsIDAsIDB9LAotCXsiY3JlYXRlIiwgMCwgMCwgMH0sCi0JeyJmaWxlIiwgMSwgMCwgMH0sCi0JezAsIDAsIDAsIDB9Ci0gICAgICB9OwotCi0gICAgICBjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJhYmM6ZDowMTIzNDU2Nzg5IiwKLQkJICAgICAgIGxvbmdfb3B0aW9ucywgJm9wdGlvbl9pbmRleCk7Ci0gICAgICBpZiAoYyA9PSAtMSkKLQlicmVhazsKLQotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlIDA6Ci0JICBwcmludGYgKCJvcHRpb24gJXMiLCBsb25nX29wdGlvbnNbb3B0aW9uX2luZGV4XS5uYW1lKTsKLQkgIGlmIChvcHRhcmcpCi0JICAgIHByaW50ZiAoIiB3aXRoIGFyZyAlcyIsIG9wdGFyZyk7Ci0JICBwcmludGYgKCJcbiIpOwotCSAgYnJlYWs7Ci0KLQljYXNlICcwJzoKLQljYXNlICcxJzoKLQljYXNlICcyJzoKLQljYXNlICczJzoKLQljYXNlICc0JzoKLQljYXNlICc1JzoKLQljYXNlICc2JzoKLQljYXNlICc3JzoKLQljYXNlICc4JzoKLQljYXNlICc5JzoKLQkgIGlmIChkaWdpdF9vcHRpbmQgIT0gMCAmJiBkaWdpdF9vcHRpbmQgIT0gdGhpc19vcHRpb25fb3B0aW5kKQotCSAgICBwcmludGYgKCJkaWdpdHMgb2NjdXIgaW4gdHdvIGRpZmZlcmVudCBhcmd2LWVsZW1lbnRzLlxuIik7Ci0JICBkaWdpdF9vcHRpbmQgPSB0aGlzX29wdGlvbl9vcHRpbmQ7Ci0JICBwcmludGYgKCJvcHRpb24gJWNcbiIsIGMpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdhJzoKLQkgIHByaW50ZiAoIm9wdGlvbiBhXG4iKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYic6Ci0JICBwcmludGYgKCJvcHRpb24gYlxuIik7Ci0JICBicmVhazsKLQotCWNhc2UgJ2MnOgotCSAgcHJpbnRmICgib3B0aW9uIGMgd2l0aCB2YWx1ZSBgJXMnXG4iLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdkJzoKLQkgIHByaW50ZiAoIm9wdGlvbiBkIHdpdGggdmFsdWUgYCVzJ1xuIiwgb3B0YXJnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnPyc6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBwcmludGYgKCI/PyBnZXRvcHQgcmV0dXJuZWQgY2hhcmFjdGVyIGNvZGUgMCVvID8/XG4iLCBjKTsKLQl9Ci0gICAgfQotCi0gIGlmIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIHByaW50ZiAoIm5vbi1vcHRpb24gQVJHVi1lbGVtZW50czogIik7Ci0gICAgICB3aGlsZSAob3B0aW5kIDwgYXJnYykKLQlwcmludGYgKCIlcyAiLCBhcmd2W29wdGluZCsrXSk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLQotICBleGl0ICgwKTsKLX0KLQotI2VuZGlmIC8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9nZXRwYWdlc2l6ZS5jIGIvbGliaWJlcnR5L2dldHBhZ2VzaXplLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NGQ2YzAuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2dldHBhZ2VzaXplLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKiBFbXVsYXRpb24gb2YgZ2V0cGFnZXNpemUoKSBmb3Igc3lzdGVtcyB0aGF0IG5lZWQgaXQuICovCi0KLS8qCi0KLU5BTUUKLQotCWdldHBhZ2VzaXplIC0tIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHBhZ2Ugb2YgbWVtb3J5Ci0KLVNZTk9QU0lTCi0KLQlpbnQgZ2V0cGFnZXNpemUgKHZvaWQpCi0KLURFU0NSSVBUSU9OCi0KLQlSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBwYWdlIG9mIG1lbW9yeS4gIFRoaXMgaXMgdGhlCi0JZ3JhbnVsYXJpdHkgb2YgbWFueSBvZiB0aGUgc3lzdGVtIG1lbW9yeSBtYW5hZ2VtZW50IHJvdXRpbmVzLgotCU5vIGd1YXJhbnRlZSBpcyBtYWRlIGFzIHRvIHdoZXRoZXIgb3Igbm90IGl0IGlzIHRoZSBzYW1lIGFzIHRoZQotCWJhc2ljIG1lbW9yeSBtYW5hZ2VtZW50IGhhcmR3YXJlIHBhZ2Ugc2l6ZS4KLQotQlVHUwotCi0JSXMgaW50ZW5kZWQgYXMgYSByZWFzb25hYmxlIHJlcGxhY2VtZW50IGZvciBzeXN0ZW1zIHdoZXJlIHRoaXMKLQlpcyBub3QgcHJvdmlkZWQgYXMgYSBzeXN0ZW0gY2FsbC4gIFRoZSB2YWx1ZSBvZiA0MDk2IG1heSBvciBtYXkKLQlub3QgYmUgY29ycmVjdCBmb3IgdGhlIHN5c3RlbXMgd2hlcmUgaXQgaXMgcmV0dXJuZWQgYXMgdGhlIGRlZmF1bHQKLQl2YWx1ZS4KLQotKi8KLQotI2lmbmRlZiBWTVMKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2VuZGlmCi0KLSN1bmRlZiBHTlVfT1VSX1BBR0VTSVpFCi0jaWYgZGVmaW5lZCAoSEFWRV9TWVNDT05GKSAmJiBkZWZpbmVkIChIQVZFX1VOSVNURF9IKQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2lmZGVmIF9TQ19QQUdFU0laRQotI2RlZmluZSBHTlVfT1VSX1BBR0VTSVpFIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBHTlVfT1VSX1BBR0VTSVpFCi0jIGlmZGVmCVBBR0VTSVpFCi0jICBkZWZpbmUJR05VX09VUl9QQUdFU0laRSBQQUdFU0laRQotIyBlbHNlCS8qIG5vIFBBR0VTSVpFICovCi0jICBpZmRlZglFWEVDX1BBR0VTSVpFCi0jICAgZGVmaW5lCUdOVV9PVVJfUEFHRVNJWkUgRVhFQ19QQUdFU0laRQotIyAgZWxzZQkvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgaWZkZWYJTkJQRwotIyAgICBkZWZpbmUJR05VX09VUl9QQUdFU0laRSAoTkJQRyAqIENMU0laRSkKLSMgICAgaWZuZGVmCUNMU0laRQotIyAgICAgZGVmaW5lCUNMU0laRSAxCi0jICAgIGVuZGlmCS8qIENMU0laRSAqLwotIyAgIGVsc2UJLyogbm8gTkJQRyAqLwotIyAgICBpZmRlZglOQlBDCi0jICAgICBkZWZpbmUJR05VX09VUl9QQUdFU0laRSBOQlBDCi0jICAgIGVsc2UJLyogbm8gTkJQQyAqLwotIyAgICAgZGVmaW5lCUdOVV9PVVJfUEFHRVNJWkUgNDA5NgkvKiBKdXN0IHB1bnQgYW5kIHVzZSByZWFzb25hYmxlIHZhbHVlICovCi0jICAgIGVuZGlmIC8qIE5CUEMgKi8KLSMgICBlbmRpZiAvKiBOQlBHICovCi0jICBlbmRpZiAvKiBFWEVDX1BBR0VTSVpFICovCi0jIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jZW5kaWYgLyogR05VX09VUl9QQUdFU0laRSAqLwotCi1pbnQKLWdldHBhZ2VzaXplICgpCi17Ci0gIHJldHVybiAoR05VX09VUl9QQUdFU0laRSk7Ci19Ci0KLSNlbHNlIC8qIFZNUyAqLwotCi0jaWYgMAkvKiBvbGRlciBkaXN0cmlidXRpb25zIG9mIGdjYy12bXMgYXJlIG1pc3NpbmcgPHN5aWRlZi5oPiAqLwotI2luY2x1ZGUgPHN5aWRlZi5oPgotI2VuZGlmCi0jaWZuZGVmIFNZSSRfUEFHRV9TSVpFCS8qIFZNUyBWNS40IGFuZCBlYXJsaWVyIGRpZG4ndCBoYXZlIHRoaXMgeWV0ICovCi0jZGVmaW5lIFNZSSRfUEFHRV9TSVpFIDQ0NTIKLSNlbmRpZgotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbGliJGdldHN5aShjb25zdCB1bnNpZ25lZCBzaG9ydCAqLC4uLik7Ci0KLWludCBnZXRwYWdlc2l6ZSAoKQotewotICBsb25nIHBhZ3NpeiA9IDBMOwotICB1bnNpZ25lZCBzaG9ydCBpdG1jb2QgPSBTWUkkX1BBR0VfU0laRTsKLQotICAodm9pZCkgbGliJGdldHN5aSAoJml0bWNvZCwgKHZvaWQgKikgJnBhZ3Npeik7Ci0gIGlmIChwYWdzaXogPT0gMEwpCi0gICAgcGFnc2l6ID0gNTEyTDsJLyogVkFYIGRlZmF1bHQgKi8KLSAgcmV0dXJuIChpbnQpIHBhZ3NpejsKLX0KLQotI2VuZGlmIC8qIFZNUyAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2dldHJ1bnRpbWUuYyBiL2xpYmliZXJ0eS9nZXRydW50aW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NTVlYTYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2dldHJ1bnRpbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qIFJldHVybiB0aW1lIHVzZWQgc28gZmFyLCBpbiBtaWNyb3NlY29uZHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0vKiBUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIGdldCBlbGFwc2VkIGV4ZWN1dGlvbiB0aW1lOyB1bmZvcnR1bmF0ZWx5IG5vCi0gICBzaW5nbGUgd2F5IGlzIGF2YWlsYWJsZSBmb3IgYWxsIGhvc3Qgc3lzdGVtcywgbm9yIGFyZSB0aGVyZSByZWxpYWJsZQotICAgd2F5cyB0byBmaW5kIG91dCB3aGljaCB3YXkgaXMgY29ycmVjdCBmb3IgYSBnaXZlbiBob3N0LiAqLwotCi0jaW5jbHVkZSA8dGltZS5oPgotCi0jaWYgZGVmaW5lZCAoSEFWRV9HRVRSVVNBR0UpICYmIGRlZmluZWQgKEhBVkVfU1lTX1JFU09VUkNFX0gpCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9USU1FUwotI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN5cy90aW1lcy5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotLyogVGhpcyBpcyBhIGZhbGxiYWNrOyBpZiB3cm9uZywgaXQgd2lsbCBsaWtlbHkgbWFrZSBvYnZpb3VzbHkgd3JvbmcKLSAgIHJlc3VsdHMuICovCi0KLSNpZm5kZWYgQ0xPQ0tTX1BFUl9TRUMKLSNkZWZpbmUgQ0xPQ0tTX1BFUl9TRUMgMQotI2VuZGlmCi0KLSNpZmRlZiBfU0NfQ0xLX1RDSwotI2RlZmluZSBHTlVfSFogIHN5c2NvbmYoX1NDX0NMS19UQ0spCi0jZWxzZQotI2lmZGVmIEhaCi0jZGVmaW5lIEdOVV9IWiAgSFoKLSNlbHNlCi0jaWZkZWYgQ0xPQ0tTX1BFUl9TRUMKLSNkZWZpbmUgR05VX0haICBDTE9DS1NfUEVSX1NFQwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi1sb25nCi1nZXRfcnVuX3RpbWUgKCkKLXsKLSNpZiBkZWZpbmVkIChIQVZFX0dFVFJVU0FHRSkgJiYgZGVmaW5lZCAoSEFWRV9TWVNfUkVTT1VSQ0VfSCkKLSAgc3RydWN0IHJ1c2FnZSBydXNhZ2U7Ci0KLSAgZ2V0cnVzYWdlICgwLCAmcnVzYWdlKTsKLSAgcmV0dXJuIChydXNhZ2UucnVfdXRpbWUudHZfc2VjICogMTAwMDAwMCArIHJ1c2FnZS5ydV91dGltZS50dl91c2VjCi0JICArIHJ1c2FnZS5ydV9zdGltZS50dl9zZWMgKiAxMDAwMDAwICsgcnVzYWdlLnJ1X3N0aW1lLnR2X3VzZWMpOwotI2Vsc2UgLyogISBIQVZFX0dFVFJVU0FHRSAqLwotI2lmZGVmIEhBVkVfVElNRVMKLSAgc3RydWN0IHRtcyB0bXM7Ci0KLSAgdGltZXMgKCZ0bXMpOwotICByZXR1cm4gKHRtcy50bXNfdXRpbWUgKyB0bXMudG1zX3N0aW1lKSAqICgxMDAwMDAwIC8gR05VX0haKTsKLSNlbHNlIC8qICEgSEFWRV9USU1FUyAqLwotICAvKiBGYWxsIGJhY2sgb24gY2xvY2sgYW5kIGhvcGUgaXQncyBjb3JyZWN0bHkgaW1wbGVtZW50ZWQuICovCi0gIGNvbnN0IGxvbmcgY2xvY2tzX3Blcl9zZWMgPSBDTE9DS1NfUEVSX1NFQzsKLSAgaWYgKGNsb2Nrc19wZXJfc2VjIDw9IDEwMDAwMDApCi0gICAgcmV0dXJuIGNsb2NrICgpICogKDEwMDAwMDAgLyBjbG9ja3NfcGVyX3NlYyk7Ci0gIGVsc2UKLSAgICByZXR1cm4gY2xvY2sgKCkgLyBjbG9ja3NfcGVyX3NlYzsKLSNlbmRpZiAgLyogSEFWRV9USU1FUyAqLwotI2VuZGlmICAvKiBIQVZFX0dFVFJVU0FHRSAqLwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2hleC5jIGIvbGliaWJlcnR5L2hleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTJlZWYwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9oZXguYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIEhleCBjaGFyYWN0ZXIgbWFuaXB1bGF0aW9uIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLWNoYXIgX2hleF92YWx1ZVtfaGV4X2FycmF5X3NpemVdOwotCi12b2lkIGhleF9pbml0ICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgX2hleF9hcnJheV9zaXplOyBpKyspCi0gICAgX2hleF92YWx1ZVtpXSA9IF9oZXhfYmFkOwotICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKLSAgICBfaGV4X3ZhbHVlWycwJyArIGldID0gaTsKLSAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLSAgICBfaGV4X3ZhbHVlWydhJyArIGldID0gX2hleF92YWx1ZVsnQScgKyBpXSA9IDEwICsgaTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9pbmRleC5jIGIvbGliaWJlcnR5L2luZGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YTAwZjUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2luZGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKiBTdHViIGltcGxlbWVudGF0aW9uIG9mIChvYnNvbGV0ZSkgaW5kZXgoKS4gKi8KLQotZXh0ZXJuIGNoYXIgKiBzdHJjaHIoKTsKLQotY2hhciAqCi1pbmRleCAocywgYykKLSAgY2hhciAqczsKLSAgaW50IGM7Ci17Ci0gIHJldHVybiBzdHJjaHIgKHMsIGMpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2luc3F1ZS5jIGIvbGliaWJlcnR5L2luc3F1ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzUwMTlmLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9pbnNxdWUuYworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qIGluc3F1ZSgzQykgcm91dGluZXMKLSAgIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLS8qCi1OQU1FCi0JaW5zcXVlLCByZW1xdWUgLS0gaW5zZXJ0LCByZW1vdmUgYW4gZWxlbWVudCBmcm9tIGEgcXVldWUKLQotU1lOT1BTSVMKLQlzdHJ1Y3QgcWVsZW0gewotCSAgc3RydWN0IHFlbGVtICpxX2Zvcnc7Ci0JICBzdHJ1Y3QgcWVsZW0gKnFfYmFjazsKLQkgIGNoYXIgcV9kYXRhW107Ci0JfTsKLQotCXZvaWQgaW5zcXVlIChzdHJ1Y3QgcWVsZW0gKmVsZW0sIHN0cnVjdCBxZWxlbSAqcHJlZCkKLQotCXZvaWQgcmVtcXVlIChzdHJ1Y3QgcWVsZW0gKmVsZW0pCi0KLURFU0NSSVBUSU9OCi0JUm91dGluZXMgdG8gbWFuaXB1bGF0ZSBxdWV1ZXMgYnVpbHQgZnJvbSBkb3VibHkgbGlua2VkIGxpc3RzLgotCVRoZSBpbnNxdWUgcm91dGluZSBpbnNlcnRzIEVMRU0gaW4gdGhlIHF1ZXVlIGltbWVkaWF0ZWx5IGFmdGVyCi0JUFJFRC4gIFRoZSByZW1xdWUgcm91dGluZSByZW1vdmVzIEVMRU0gZnJvbSBpdHMgY29udGFpbmluZyBxdWV1ZS4KLSovCi0KLQotc3RydWN0IHFlbGVtIHsKLSAgc3RydWN0IHFlbGVtICpxX2Zvcnc7Ci0gIHN0cnVjdCBxZWxlbSAqcV9iYWNrOwotfTsKLQotCi12b2lkCi1pbnNxdWUgKGVsZW0sIHByZWQpCi0gIHN0cnVjdCBxZWxlbSAqZWxlbTsKLSAgc3RydWN0IHFlbGVtICpwcmVkOwotewotICBlbGVtIC0+IHFfZm9ydyA9IHByZWQgLT4gcV9mb3J3OwotICBwcmVkIC0+IHFfZm9ydyAtPiBxX2JhY2sgPSBlbGVtOwotICBlbGVtIC0+IHFfYmFjayA9IHByZWQ7Ci0gIHByZWQgLT4gcV9mb3J3ID0gZWxlbTsKLX0KLQotCi12b2lkCi1yZW1xdWUgKGVsZW0pCi0gIHN0cnVjdCBxZWxlbSAqZWxlbTsKLXsKLSAgZWxlbSAtPiBxX2ZvcncgLT4gcV9iYWNrID0gZWxlbSAtPiBxX2JhY2s7Ci0gIGVsZW0gLT4gcV9iYWNrIC0+IHFfZm9ydyA9IGVsZW0gLT4gcV9mb3J3OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21ha2VmaWxlLmRvcyBiL2xpYmliZXJ0eS9tYWtlZmlsZS5kb3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYmE2MmMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21ha2VmaWxlLmRvcworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLUNGTEFHUz0tTzIKLQotT0JKUyA9IFwKLQlhcmd2Lm8gXAotCWJhc2VuYW1lLm8gXAotCWNvbmNhdC5vIFwKLQljcGx1cy1kZW0ubyBcCi0JZmRtYXRjaC5vIFwKLQlmbG9hdGZvcm1hdC5vIFwKLQlnZXRvcHQubyBcCi0JZ2V0b3B0MS5vIFwKLQlnZXRydW50aW1lLm8gXAotCWhleC5vIFwKLQltc2Rvcy5vIFwKLQlvYnN0YWNrLm8gXAotCXNwYWNlcy5vIFwKLQlzdHJlcnJvci5vIFwKLQlzdHJzaWduYWwubyBcCi0JeGF0ZXhpdC5vIFwKLQl4ZXhpdC5vIFwKLQl4bWFsbG9jLm8gXAotCSRFCi0KLS5jLm86Ci0JZ2NjIC1JLi4vaW5jbHVkZSAkKENGTEFHUykgLWMgJDwKLQotbGliaWJlcnR5LmEgOiAkKE9CSlMpCi0JLXJtIGxpYmliZXJ0eS5hCi0JYXIgcnZzIGxpYmliZXJ0eS5hICQoT0JKUykKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tYWtlZmlsZS52bXMgYi9saWJpYmVydHkvbWFrZWZpbGUudm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjFiNTEyLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tYWtlZmlsZS52bXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciBsaWJpYmVydHkgdW5kZXIgb3BlblZNUy9BbHBoYQotIwotIyBGb3IgdXNlIHdpdGggZ251LW1ha2UgZm9yIHZtcwotIwotIyBDcmVhdGVkIGJ5IEtsYXVzIEsiYW1wZiwga2thZW1wZkBwcm9naXMuZGUKLSMKLSMKLQotT0JKUz1iY29weS5vYmosYmNtcC5vYmosZ2V0b3B0Lm9iaixvYnN0YWNrLm9iaix4ZXhpdC5vYmoseG1hbGxvYy5vYmosaGV4Lm9iaixcCi0gICBnZXRvcHQxLm9iaixjcGx1cy1kZW0ub2JqLHN0cm5jYXNlY21wLm9iaixzdHJjYXNlY21wLm9iaixzdHJkdXAub2JqLFwKLSAgIGNvbmNhdC5vYmosZ2V0cnVudGltZS5vYmosZ2V0cGFnZXNpemUub2JqLGFsbG9jYS5vYmoseHN0cmVycm9yLm9iaixcCi0gICB4c3RyZHVwLm9iaix4YXRleGl0Lm9iaixjaG9vc2UtdGVtcC5vYmosZm5tYXRjaC5vYmosb2JqYWxsb2Mub2JqCi0KLWlmZXEgKCQoQ0MpLGdjYykKLUNGTEFHUz0vaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0pCi1lbHNlCi0jIGFzc3VtZSBkZWMgYwotQ0ZMQUdTPS9ub29wdC9kZWJ1Zy9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSkvZGVmaW5lPSgiY29uc3Q9Iikvd2FybmluZ3M9ZGlzYWJsZT0obWlzc2luZ3JldHVybixpbXBsaWNpdGZ1bmMpCi1lbmRpZgotCi1saWJpYmVydHkub2xiOiBjb25maWcuaCBhbGxvY2EtY29uZi5oICQoT0JKUykKLQlwdXJnZQotCWxpYi9jcmVhdGUgbGliaWJlcnR5ICoub2JqCi0KLWNvbmZpZy5oOiBjb25maWcuaC12bXMKLQkkKENQKSAkPCAkQAotCi1jbGVhbjoKLQkkJCBwdXJnZQotCSQoUk0pIGNvbmZpZy5oOwotCSQoUk0pICoub2JqOwotCSQoUk0pIGxpYmliZXJ0eS5vbGI7CmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWVtY2hyLmMgYi9saWJpYmVydHkvbWVtY2hyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZTMwMDMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21lbWNoci5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLUZVTkNUSU9OCi0JPDxtZW1jaHI+Pi0tLWZpbmQgY2hhcmFjdGVyIGluIG1lbW9yeQotCi1JTkRFWAotCW1lbWNocgotCi1BTlNJX1NZTk9QU0lTCi0JI2luY2x1ZGUgPHN0cmluZy5oPgotCXZvaWQgKm1lbWNocihjb25zdCB2b2lkICo8W3NyY10+LCBpbnQgPFtjXT4sIHNpemVfdCA8W2xlbmd0aF0+KTsKLQotVFJBRF9TWU5PUFNJUwotCSNpbmNsdWRlIDxzdHJpbmcuaD4KLQl2b2lkICptZW1jaHIoPFtzcmNdPiwgPFtjXT4sIDxbbGVuZ3RoXT4pCi0Jdm9pZCAqPFtzcmNdPjsKLQl2b2lkICo8W2NdPjsKLQlzaXplX3QgPFtsZW5ndGhdPjsKLQotREVTQ1JJUFRJT04KLQlUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIG1lbW9yeSBzdGFydGluZyBhdCA8PCo8W3NyY10+Pj4gZm9yIHRoZQotCWNoYXJhY3RlciA8W2NdPi4gIFRoZSBzZWFyY2ggb25seSBlbmRzIHdpdGggdGhlIGZpcnN0Ci0Jb2NjdXJyZW5jZSBvZiA8W2NdPiwgb3IgYWZ0ZXIgPFtsZW5ndGhdPiBjaGFyYWN0ZXJzOyBpbgotCXBhcnRpY3VsYXIsIDw8TlVMTD4+IGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUgc2VhcmNoLgotCi1SRVRVUk5TCi0JSWYgdGhlIGNoYXJhY3RlciA8W2NdPiBpcyBmb3VuZCB3aXRoaW4gPFtsZW5ndGhdPiBjaGFyYWN0ZXJzCi0Jb2YgPDwqPFtzcmNdPj4+LCBhIHBvaW50ZXIgdG8gdGhlIGNoYXJhY3RlciBpcyByZXR1cm5lZC4gSWYKLQk8W2NdPiBpcyBub3QgZm91bmQsIHRoZW4gPDxOVUxMPj4gaXMgcmV0dXJuZWQuIAkKLQotUE9SVEFCSUxJVFkKLTw8bWVtY2hyPj4gIHJlcXVpcmVzIG5vIHN1cHBvcnRpbmcgT1Mgc3Vicm91dGluZXMuCi0KLVFVSUNLUkVGCi0JbWVtY2hyIGFuc2kgcHVyZQotCi0qLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi1QVFIKLW1lbWNociAoc3JjX3ZvaWQsIGMsIGxlbmd0aCkKLSAgICAgcmVnaXN0ZXIgY29uc3QgUFRSIHNyY192b2lkOwotICAgICBpbnQgYzsKLSAgICAgc2l6ZV90IGxlbmd0aDsKLXsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzcmNfdm9pZDsKLSAgCi0gIHdoaWxlICgtLWxlbmd0aCA+PSAwKQotICB7Ci0gICAgaWYgKCpzcmMgPT0gYykKLSAgICAgcmV0dXJuIChQVFIpc3JjOwotICAgIHNyYysrOwotICB9Ci0gIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21lbWNtcC5jIGIvbGliaWJlcnR5L21lbWNtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjdhZTBjLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tZW1jbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIG1lbWNtcCAtLSBjb21wYXJlIHR3byBtZW1vcnkgcmVnaW9ucy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0vKgotTkFNRQotCW1lbWNtcCAtLSBjb21wYXJlIHR3byBtZW1vcnkgcmVnaW9ucwotCi1TWU5PUFNJUwotCWludCBtZW1jbXAgKGNvbnN0IHZvaWQgKmZyb20sIGNvbnN0IHZvaWQgKnRvLCBzaXplX3QgY291bnQpCi0KLURFU0NSSVBUSU9OCi0JQ29tcGFyZSB0d28gbWVtb3J5IHJlZ2lvbnMgYW5kIHJldHVybiBsZXNzIHRoYW4sCi0JZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvLCBhY2NvcmRpbmcgdG8gbGV4aWNvZ3JhcGhpY2FsCi0Jb3JkZXJpbmcgb2YgdGhlIGNvbXBhcmVkIHJlZ2lvbnMuCi0qLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi1pbnQKLURFRlVOKG1lbWNtcCwgKHN0cjEsIHN0cjIsIGNvdW50KSwKLSAgICAgIGNvbnN0IFBUUiBzdHIxIEFORCBjb25zdCBQVFIgc3RyMiBBTkQgc2l6ZV90IGNvdW50KQotewotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpzMSA9ICh1bnNpZ25lZCBjaGFyKilzdHIxOwotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpzMiA9ICh1bnNpZ25lZCBjaGFyKilzdHIyOwotCi0gIHdoaWxlIChjb3VudC0tID4gMCkKLSAgICB7Ci0gICAgICBpZiAoKnMxKysgIT0gKnMyKyspCi0JICByZXR1cm4gczFbLTFdIDwgczJbLTFdID8gLTEgOiAxOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tZW1jcHkuYyBiL2xpYmliZXJ0eS9tZW1jcHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA3YTlmNS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWVtY3B5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKiBtZW1jcHkgKHRoZSBzdGFuZGFyZCBDIGZ1bmN0aW9uKQotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLS8qCi1OQU1FCi0JbWVtY3B5IC0tIGNvcHkgbWVtb3J5IHJlZ2lvbnMgb2YgYXJiaXRhcnkgbGVuZ3RoCi0KLVNZTk9QU0lTCi0Jdm9pZCogbWVtY3B5ICh2b2lkICpvdXQsIGNvbnN0IHZvaWQgKmluLCBzaXplX3Qgbik7Ci0KLURFU0NSSVBUSU9OCi0JQ29weSBMRU5HVEggYnl0ZXMgZnJvbSBtZW1vcnkgcmVnaW9uIHBvaW50ZWQgdG8gYnkgSU4gdG8gbWVtb3J5Ci0JcmVnaW9uIHBvaW50ZWQgdG8gYnkgT1VULgotKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotUFRSCi1ERUZVTihtZW1jcHksIChvdXQsIGluLCBsZW5ndGgpLCBQVFIgb3V0IEFORCBjb25zdCBQVFIgaW4gQU5EIHNpemVfdCBsZW5ndGgpCi17Ci0gICAgYmNvcHkoaW4sIG91dCwgbGVuZ3RoKTsKLSAgICByZXR1cm4gb3V0OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21lbW1vdmUuYyBiL2xpYmliZXJ0eS9tZW1tb3ZlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NmMzMjYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21lbW1vdmUuYworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qIFdyYXBwZXIgdG8gaW1wbGVtZW50IEFOU0kgQydzIG1lbW1vdmUgdXNpbmcgQlNEJ3MgYmNvcHkuICovCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgLS1QZXIgQm90aG5lci4gKi8KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLVBUUgotbWVtbW92ZSAoczEsIHMyLCBuKQotICAgICBQVFIgczE7Ci0gICAgIGNvbnN0IFBUUiBzMjsKLSAgICAgc2l6ZV90IG47Ci17Ci0gIGJjb3B5IChzMiwgczEsIG4pOwotICByZXR1cm4gczE7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWVtc2V0LmMgYi9saWJpYmVydHkvbWVtc2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNTQ4MzEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21lbXNldC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyogbWVtc2V0Ci0gICBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotUFRSCi1ERUZVTihtZW1zZXQsIChkZXN0LCB2YWwsIGxlbiksCi0gICAgICBQVFIgZGVzdCBBTkQgcmVnaXN0ZXIgaW50IHZhbCBBTkQgcmVnaXN0ZXIgc2l6ZV90IGxlbikKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIqKWRlc3Q7Ci0gIHdoaWxlIChsZW4tLSA+IDApCi0gICAgKnB0cisrID0gdmFsOwotICByZXR1cm4gZGVzdDsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9ta3N0ZW1wcy5jIGIvbGliaWJlcnR5L21rc3RlbXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YzE2YTIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21rc3RlbXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBta3N0ZW1wLmMgZnJvbSB0aGUgR05VIEMgTGlicmFyeS4KLQotICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKLSAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCi0gICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0vKiBXZSBuZWVkIHRvIHByb3ZpZGUgYSB0eXBlIGZvciBnY2NfdWludDY0X3QuICAqLwotI2lmZGVmIF9fR05VQ19fCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBnY2NfdWludDY0X3Q7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGdjY191aW50NjRfdDsKLSNlbmRpZgotCi0jaWZuZGVmIFRNUF9NQVgKLSNkZWZpbmUgVE1QX01BWCAxNjM4NAotI2VuZGlmCi0KLS8qIEdlbmVyYXRlIGEgdW5pcXVlIHRlbXBvcmFyeSBmaWxlIG5hbWUgZnJvbSBURU1QTEFURS4KLQotICAgVEVNUExBVEUgaGFzIHRoZSBmb3JtOgotCi0gICA8cGF0aD4vY2NYWFhYWFg8c3VmZml4PgotCi0gICBTVUZGSVhfTEVOIHRlbGxzIHVzIGhvdyBsb25nIDxzdWZmaXg+IGlzIChpdCBjYW4gYmUgemVybyBsZW5ndGgpLgotCi0gICBUaGUgbGFzdCBzaXggY2hhcmFjdGVycyBvZiBURU1QTEFURSBiZWZvcmUgPHN1ZmZpeD4gbXVzdCBiZSAiWFhYWFhYIjsKLSAgIHRoZXkgYXJlIHJlcGxhY2VkIHdpdGggYSBzdHJpbmcgdGhhdCBtYWtlcyB0aGUgZmlsZW5hbWUgdW5pcXVlLgotCi0gICBSZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIG9wZW4gb24gdGhlIGZpbGUgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuICAqLwotaW50Ci1ta3N0ZW1wcyAodGVtcGxhdGUsIHN1ZmZpeF9sZW4pCi0gICAgIGNoYXIgKnRlbXBsYXRlOwotICAgICBpbnQgc3VmZml4X2xlbjsKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgbGV0dGVyc1tdCi0gICAgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkiOwotICBzdGF0aWMgZ2NjX3VpbnQ2NF90IHZhbHVlOwotI2lmZGVmIEhBVkVfR0VUVElNRU9GREFZCi0gIHN0cnVjdCB0aW1ldmFsIHR2OwotI2VuZGlmCi0gIGNoYXIgKlhYWFhYWDsKLSAgc2l6ZV90IGxlbjsKLSAgaW50IGNvdW50OwotCi0gIGxlbiA9IHN0cmxlbiAodGVtcGxhdGUpOwotCi0gIGlmICgoaW50KSBsZW4gPCA2ICsgc3VmZml4X2xlbgotICAgICAgfHwgc3RybmNtcCAoJnRlbXBsYXRlW2xlbiAtIDYgLSBzdWZmaXhfbGVuXSwgIlhYWFhYWCIsIDYpKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgWFhYWFhYID0gJnRlbXBsYXRlW2xlbiAtIDYgLSBzdWZmaXhfbGVuXTsKLQotI2lmZGVmIEhBVkVfR0VUVElNRU9GREFZCi0gIC8qIEdldCBzb21lIG1vcmUgb3IgbGVzcyByYW5kb20gZGF0YS4gICovCi0gIGdldHRpbWVvZmRheSAoJnR2LCBOVUxMKTsKLSAgdmFsdWUgKz0gKChnY2NfdWludDY0X3QpIHR2LnR2X3VzZWMgPDwgMTYpIF4gdHYudHZfc2VjIF4gZ2V0cGlkICgpOwotI2Vsc2UKLSAgdmFsdWUgKz0gZ2V0cGlkICgpOwotI2VuZGlmCi0KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgVE1QX01BWDsgKytjb3VudCkKLSAgICB7Ci0gICAgICBnY2NfdWludDY0X3QgdiA9IHZhbHVlOwotICAgICAgaW50IGZkOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSByYW5kb20gYml0cy4gICovCi0gICAgICBYWFhYWFhbMF0gPSBsZXR0ZXJzW3YgJSA2Ml07Ci0gICAgICB2IC89IDYyOwotICAgICAgWFhYWFhYWzFdID0gbGV0dGVyc1t2ICUgNjJdOwotICAgICAgdiAvPSA2MjsKLSAgICAgIFhYWFhYWFsyXSA9IGxldHRlcnNbdiAlIDYyXTsKLSAgICAgIHYgLz0gNjI7Ci0gICAgICBYWFhYWFhbM10gPSBsZXR0ZXJzW3YgJSA2Ml07Ci0gICAgICB2IC89IDYyOwotICAgICAgWFhYWFhYWzRdID0gbGV0dGVyc1t2ICUgNjJdOwotICAgICAgdiAvPSA2MjsKLSAgICAgIFhYWFhYWFs1XSA9IGxldHRlcnNbdiAlIDYyXTsKLQotICAgICAgZmQgPSBvcGVuICh0ZW1wbGF0ZSwgT19SRFdSfE9fQ1JFQVR8T19FWENMLCAwNjAwKTsKLSAgICAgIGlmIChmZCA+PSAwKQotCS8qIFRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LiAgKi8KLQlyZXR1cm4gZmQ7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSByYW5kb20gdmFsdWUuICBJdCBpcyBvbmx5IG5lY2Vzc2FyeSB0aGF0IHRoZSBuZXh0Ci0JIFRNUF9NQVggdmFsdWVzIGdlbmVyYXRlZCBieSBhZGRpbmcgNzc3NyB0byBWQUxVRSBhcmUgZGlmZmVyZW50Ci0JIHdpdGggKG1vZHVsZSAyXjMyKS4gICovCi0gICAgICB2YWx1ZSArPSA3Nzc3OwotICAgIH0KLQotICAvKiBXZSByZXR1cm4gdGhlIG51bGwgc3RyaW5nIGlmIHdlIGNhbid0IGZpbmQgYSB1bmlxdWUgZmlsZSBuYW1lLiAgKi8KLSAgdGVtcGxhdGVbMF0gPSAnXDAnOwotICByZXR1cm4gLTE7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvbXB3LWNvbmZpZy5pbiBiL2xpYmliZXJ0eS9tcHctY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTIxODAyLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tcHctY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIE1QVyBjb25maWd1cmF0aW9uIGZyYWdtZW50IGZvciBsaWJpYmVydHkuCi0KLUVjaG8gJy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IG1wdy1jb25maWd1cmUuICAqLycJID4gIntvfSJjb25maWcubmV3Ci0KLU1vdmVJZkNoYW5nZSAie299ImNvbmZpZy5uZXcgIntvfSJjb25maWcuaAotCi0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tcHctbWFrZS5zZWQgYi9saWJpYmVydHkvbXB3LW1ha2Uuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjJhNWU3Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tcHctbWFrZS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jIFNlZCBjb21tYW5kcyB0byBmaW5pc2ggdHJhbnNsYXRpbmcgbGliaWJlcnR5J3MgVW5peCBtYWtlZmlsZSB0byBNUFcgc3ludGF4LgotCi0jIENvbW1lbnQgb3V0IGEgdXNlbGVzcyB0aGluZy4KLS9eXC5hbHdheXNcLi9zL14vIy8KLQotIyBSZXBsYWNlIHRoZSBhdXRvLWdlbmVyYXRlZCBsaXN0IHdpdGggdGhlIGxpc3Qgb2Ygd2hhdCB3ZSBrbm93IHdlIG5lZWQuCi1zL2BjYXQgbmVlZGVkLWxpc3RgLyJ7b30iYWxsb2NhLmMubyAie299ImJjb3B5LmMubyAie299ImdldHBhZ2VzaXplLmMubyAie299Imluc3F1ZS5jLm8gIntvfSJtcHcuYy5vICJ7b30ic3RyY2FzZWNtcC5jLm8gIntvfSJzdHJkdXAuYy5vICJ7b30ic3RybmNhc2VjbXAuYy5vLwotCi0jIFBhc3RlIGluIHNvbWUgZGVzaXJhYmxlIGRlZmluaXRpb25zLgotIyBUaGUgZGVmYXVsdCBydWxlIGhlcmUgY29tcGxldGVseSByZXBsYWNlcyB0aGUgdHJpY2t5IHN0dWZmIGluIHRoZSBVbml4Ci0jIE1ha2VmaWxlLmluLgotL14jIyMkL2FcCi1cCi1IREVGSU5FUyA9IC1kIE5FRURfc3lzX3NpZ2xpc3QgLWQgTkVFRF9zeXNfZXJybGlzdCAtZCBORUVEX2Jhc2VuYW1lIC1kIE5FRURfc3RyY2FzZWNtcCAtZCBORUVEX3N0cm5jYXNlY21wXAotSU5DTFVERVMgPSAtaSA6IC1pIHtJTkNESVJ9OiAtaSB7SU5DRElSfTptcHc6IC1pIDo6ZXh0cmEtaW5jbHVkZTogLWkgIntzfSJcCi1cCi0uYy5vIFxcT3B0aW9uLWYgLmNcCi0Je0NDfSBAREFTSF9DX0ZMQUdAIHtEZXBEaXJ9e0RlZmF1bHR9LmMge0xJQkNGTEFHU30ge0lOQ0xVREVTfSB7SERFRklORVN9IEBTRUdNRU5UX0ZMQUcoe0RlZmF1bHR9KUAgLW8ge1RhcmdEaXJ9e0RlZmF1bHR9LmMub1wKLQotIyBSZW1vdmUgZGVwZW5kZW5jeSBvbiBuZWVkZWQtbGlzdCwgd2hpY2ggd2UgZG9uJ3QgdXNlLgotL0RPX0FMU08gPS9zL25lZWRlZC1saXN0Ly8KLQotL0lOQ0RJUj0vcy8ie3NyY2Rpcn0ie01VTFRJU1JDVE9QfTo6LyJ7dG9wc3JjZGlyfSIvCi0KLSMgV2hhY2sgb3V0IHRoZSBDT01QSUxFLmMgdHJpY2tpbmVzcy4KLS9eQ09NUElMRS5jIC8sL14kL2QKLQotIyBSZW1vdmUgdGhlIG11bHRpZG8gdHJpY2tpbmVzcyBmcm9tIHRoZSAiYWxsIiB0YXJnZXQuCi0vXmFsbCBcXE9wdGlvbi1mLywvXiQvY1wKLWFsbCBcXE9wdGlvbi1mIHtUQVJHRVRMSUJ9XAotCi0KLSMgUmVtb3ZlIHRoZSBSVUxFMS9SVUxFMiBjcnVkLgotL2lmIFxbLywvZmkvZAotL15SVUxFMSA9LywvUlVMRTIgPS9kCi0vUlVMRTIvcy9SVUxFMi9UQVJHRVRMSUIvCi0KLSMgRG9uJ3Qgd2FudCBmZG1hdGNoIGV2ZXIuCi1zLyAie299ImZkbWF0Y2guYy5vLy8KLQotIyBGaXggcGF0aHMgdG8gZ2VuZXJhdGVkIGZpbGVzLgotL2NvbmZpZy5oL3MvIntzfSJjb25maWcuaC8ie299ImNvbmZpZy5oLwotCi0jIFdoYWNrIG91dCBjb25maWcgcmVidWlsZCBydWxlcy4KLS9eIntvfSJjb25maWcuaCBcXE9wdGlvbi1mLywvXiQvZAotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21wdy5jIGIvbGliaWJlcnR5L21wdy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTNhZTQxLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tcHcuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMTAgKzAsMCBAQAotLyogTVBXLVVuaXggY29tcGF0aWJpbGl0eSBsaWJyYXJ5LgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBzaG91bGQgb25seSBiZSBjb21waWxlZCBhbmQgbGlua2VkIHVuZGVyIE1QVy4gKi8KLQotI2luY2x1ZGUgIm1wdy5oIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpZm5kZWYgVVNFX01XX0hFQURFUlMKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxUeXBlcy5oPgotI2luY2x1ZGUgPEZpbGVzLmg+Ci0KLSNpbmNsdWRlIDxUaW1lci5oPgotCi0vKiBJbml0aWFsaXplIHRvIDAgYXQgZmlyc3QsIHRoZW4gc2V0IHRvIGVycm5vX21heCgpIGxhdGVyLiAgKi8KLQotaW50IHN5c19uZXJyID0gMDsKLQotLyogRGVidWcgZmxhZyBmb3IgcGF0aG5hbWUgaGFja2luZy4gIFNldCB0aGlzIHRvIG9uZSBhbmQgcmVidWlsZC4gKi8KLQotaW50IERlYnVnUEkgPSAtMTsKLQotdm9pZAotbXB3aWZ5X2ZpbGVuYW1lKGNoYXIgKnVuaXhuYW1lLCBjaGFyICptYWNuYW1lKQotewotICBpbnQgaSwgajsKLQotICAvKiAoc2hvdWxkIHRydW5jYXRlIDI1NSBjaGFycyBmcm9tIGVuZCBvZiBuYW1lLCBub3QgYmVnaW5uaW5nKSAqLwotICBpZiAoc3RybGVuICh1bml4bmFtZSkgPiAyNTUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUGF0aG5hbWUgXCIlc1wiIGlzIHRvbyBsb25nIGZvciBNYWNzLCB0cnVuY2F0aW5nXG4iLAotCSAgICAgICB1bml4bmFtZSk7Ci0gICAgfQotICBqID0gMDsKLSAgLyogSWYgeW91J3JlIGdvaW5nIHRvIGVuZCB1cCB3aXRoIG9uZSBvciBtb3JlIGNvbG9ucyBpbiB0aGUgbWlkZGxlIG9mIGEKLSAgICAgcGF0aCBhZnRlciBhbiBhbGwtVW5peCByZWxhdGl2ZSBwYXRoIGlzIHRyYW5zbGF0ZWQsIHlvdSBtdXN0IGFkZCBhCi0gICAgIGNvbG9uIG9uIHRoZSBmcm9udCwgc28gdGhhdCB0aGUgZmlyc3QgY29tcG9uZW50IGlzIG5vdCB0aG91Z2h0IHRvIGJlCi0gICAgIGEgZGlzayBuYW1lLiAgKi8KLSAgaWYgKHVuaXhuYW1lWzBdICE9ICcvJyAmJiAhIHN0cmNociAodW5peG5hbWUsICc6JykgJiYgc3RyY2hyICh1bml4bmFtZSwgJy8nKSkKLSAgICB7Ci0gICAgICBtYWNuYW1lW2orK10gPSAnOic7Ci0gICAgfQotICBmb3IgKGkgPSAwOyB1bml4bmFtZVtpXSAhPSAnXDAnICYmIGkgPCAyNTU7ICsraSkKLSAgICB7Ci0gICAgICBpZiAoaSA9PSAwICYmIHVuaXhuYW1lW2ldID09ICcvJykKLQl7Ci0JICBpZiAoc3RybmNtcCAodW5peG5hbWUsICIvdG1wLyIsIDUpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBBIHRlbXBvcmFyeSBuYW1lLCBtYWtlIGEgbW9yZSBNYWMtZmxhdm9yZWQgdG1wbmFtZS4gKi8KLQkgICAgICAvKiBBIGJldHRlciBjaG9pY2Ugd291bGQgYmUge0Jvb3R9VHJhc2g6Zm9vLCBidXQKLQkJIHRoYXQgd291bGQgcmVxdWlyZSBiZWluZyBhYmxlIHRvIGlkZW50aWZ5IHRoZQotCQkgYm9vdCBkaXNrJ3MgYW5kIHRyYXNoY2FuJ3MgbmFtZS4gIEFub3RoZXIgb3B0aW9uCi0JCSB3b3VsZCBiZSB0byBoYXZlIGFuIGVudiB2YXIsIHNvIHVzZXIgY2FuIHBvaW50IGl0Ci0JCSBhdCBhIHJhbWRpc2suICovCi0JICAgICAgbWFjbmFtZVtqKytdID0gJzonOwotCSAgICAgIG1hY25hbWVbaisrXSA9ICd0JzsKLQkgICAgICBtYWNuYW1lW2orK10gPSAnbSc7Ci0JICAgICAgbWFjbmFtZVtqKytdID0gJ3AnOwotCSAgICAgIG1hY25hbWVbaisrXSA9ICdfJzsKLQkgICAgICBpICs9IDQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIERvbid0IGNvcHkgdGhlIGxlYWRpbmcgc2xhc2guICovCi0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICh1bml4bmFtZVtpXSA9PSAnOicgJiYgdW5peG5hbWVbaSsxXSA9PSAnLycpCi0JewotCSAgbWFjbmFtZVtqKytdID0gJzonOwotCSAgaSArPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHVuaXhuYW1lW2ldID09ICcuJyAmJiB1bml4bmFtZVtpKzFdID09ICcvJykKLQl7Ci0JICBtYWNuYW1lW2orK10gPSAnOic7Ci0JICBpICs9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAodW5peG5hbWVbaV0gPT0gJy4nICYmIHVuaXhuYW1lW2krMV0gPT0gJy4nICYmIHVuaXhuYW1lW2krMl0gPT0gJy8nKQotCXsKLQkgIG1hY25hbWVbaisrXSA9ICc6JzsKLQkgIG1hY25hbWVbaisrXSA9ICc6JzsKLQkgIGkgKz0gMjsKLQl9Ci0gICAgICBlbHNlIGlmICh1bml4bmFtZVtpXSA9PSAnLycpCi0JewotCSAgbWFjbmFtZVtqKytdID0gJzonOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtYWNuYW1lW2orK10gPSB1bml4bmFtZVtpXTsKLQl9Ci0gICAgfQotICBtYWNuYW1lW2pdID0gJ1wwJzsKLSAgLyogQWxsb3cgZm9yIGdldHRpbmcgdGhlIGRlYnVnIGZsYWcgZnJvbSBhbiBlbnYgdmFyOyBxdWl0ZSB1c2VmdWwuICovCi0gIGlmIChEZWJ1Z1BJIDwgMCkKLSAgICBEZWJ1Z1BJID0gKCooZ2V0ZW52ICgiREVCVUdfUEFUSE5BTUVTIikpID09ICcxJyA/IDEgOiAwKTsKLSAgaWYgKERlYnVnUEkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIyBNYWRlIFwiJXNcIlxuIiwgdW5peG5hbWUpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIyBpbnRvIFwiJXNcIlxuIiwgbWFjbmFtZSk7Ci0gICAgfQotfQotCi0vKiBNUFctZmxhdm9yZWQgYmFzZW5hbWUgZmluZGVyLiAqLwotCi1jaGFyICoKLW1wd19iYXNlbmFtZSAobmFtZSkKLSAgY2hhciAqbmFtZTsKLXsKLSAgY2hhciAqYmFzZSA9IG5hbWU7Ci0KLSAgd2hpbGUgKCpuYW1lKQotICAgIHsKLSAgICAgIGlmICgqbmFtZSsrID09ICc6JykKLQl7Ci0JICBiYXNlID0gbmFtZTsKLQl9Ci0gICAgfQotICByZXR1cm4gYmFzZTsKLX0KLQotLyogTWl4ZWQgTVBXL1VuaXggYmFzZW5hbWUgZmluZGVyLiAgVGhpcyBjYW4gYmUgbGVkIGFzdHJheSBieQotICAgZmlsZW5hbWVzIHdpdGggc2xhc2hlcyBpbiB0aGVtIGFuZCBjb21lIHVwIHdpdGggYSBiYXNlbmFtZSB0aGF0Ci0gICBlaXRoZXIgY29ycmVzcG9uZHMgdG8gbm8gZmlsZSBvciAod29yc2UpIHRvIHNvbWUgb3RoZXIgZmlsZSwgc28KLSAgIHNob3VsZCBvbmx5IGJlIHRyaWVkIGlmIG90aGVyIG1ldGhvZHMgb2YgZmluZGluZyBhIGZpbGUgdmlhIGEKLSAgIGJhc2VuYW1lIGhhdmUgZmFpbGVkLiAgKi8KLQotY2hhciAqCi1tcHdfbWl4ZWRfYmFzZW5hbWUgKG5hbWUpCi0gIGNoYXIgKm5hbWU7Ci17Ci0gIGNoYXIgKmJhc2UgPSBuYW1lOwotCi0gIHdoaWxlICgqbmFtZSkKLSAgICB7Ci0gICAgICBpZiAoKm5hbWUgPT0gJy8nIHx8ICpuYW1lID09ICc6JykKLQl7Ci0JICBiYXNlID0gbmFtZSArIDE7Ci0JfQotICAgICAgKytuYW1lOwotICAgIH0KLSAgcmV0dXJuIGJhc2U7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgZm9wZW4oKSBtb2RpZmllZCB0byBjcmVhdGUgZmlsZXMgdGhhdCBhcmUgdHlwZSBURVhUCi0gICBvciAnQklOICcsIGFuZCBhbHdheXMgb2YgdHlwZSAnTVBTICcuICAqLwotCi1GSUxFICoKLW1wd19mb3BlbiAoY2hhciAqbmFtZSwgY2hhciAqbW9kZSkKLXsKLSN1bmRlZiBmb3BlbgotICBpbnQgZXJybnVtOwotICBGSUxFICpmcDsKLSAgY2hhciB0bXBuYW1lWzI1Nl07Ci0KLSAgbXB3aWZ5X2ZpbGVuYW1lIChuYW1lLCB0bXBuYW1lKTsKLSAgUFJPR1JFU1MgKDEpOwotICBmcCA9IGZvcGVuICh0bXBuYW1lLCBtb2RlKTsKLSAgZXJybnVtID0gZXJybm87Ci0KLSAgLyogSWYgd3JpdGluZywgbmVlZCB0byBzZXQgdHlwZSBhbmQgY3JlYXRvciB1c2VmdWxseS4gKi8KLSAgaWYgKHN0cmNociAobW9kZSwgJ3cnKSkKLSAgICB7Ci0gICAgICBjaGFyICpwbmFtZSA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuICh0bXBuYW1lKSArIDIpOwotICAgICAgT1NFcnIgZTsKLSAgICAgIHN0cnVjdCBGSW5mbyBmaTsKLQotICAgICAgcG5hbWVbMF0gPSBzdHJsZW4gKHRtcG5hbWUpOwotICAgICAgc3RyY3B5IChwbmFtZSsxLCB0bXBuYW1lKTsKLQkKLSAgICAgIGUgPSBHZXRGSW5mbyAoKENvbnN0U3RyMjU1UGFyYW0pIHBuYW1lLCAwLCAmZmkpOwotICAgICAgLyogc2hvdWxkIGRvIHNwaWZmaWVyIGVycm9yIGhhbmRsaW5nICovCi0gICAgICBpZiAoZSAhPSAwKQotCWZwcmludGYoc3RkZXJyLCAiR2V0RkluZm8gcmV0dXJucyAlZFxuIiwgZSk7Ci0gICAgICBpZiAoc3RyY2hyIChtb2RlLCAnYicpKQotCXsKLQkgIGZpLmZkVHlwZSA9IChPU1R5cGUpICdCSU4gJzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZmkuZmRUeXBlID0gKE9TVHlwZSkgJ1RFWFQnOwotCX0KLSAgICAgIGZpLmZkQ3JlYXRvciA9IChPU1R5cGUpICdNUFMgJzsKLSAgICAgIGUgPSBTZXRGSW5mbyAoKENvbnN0U3RyMjU1UGFyYW0pIHBuYW1lLCAwLCAmZmkpOwotICAgICAgaWYgKGUgIT0gMCkKLQlmcHJpbnRmKHN0ZGVyciwgIlNldEZJbmZvIHJldHVybnMgJWRcbiIsIGUpOwotICAgICAgZnJlZSAocG5hbWUpOwotICAgIH0KLSAgaWYgKGZwID09IE5VTEwpCi0gICAgZXJybm8gPSBlcnJudW07Ci0gIHJldHVybiBmcDsKLX0KLQotLyogVGhpcyBpcyBhIHZlcnNpb24gb2YgZnNlZWsoKSBtb2RpZmllZCB0byBmaWxsIHRoZSBmaWxlIHdpdGggemVyb3MKLSAgIGlmIHNlZWtpbmcgcGFzdCB0aGUgZW5kIG9mIGl0LiAgKi8KLQotI2RlZmluZSBaRVJPQkxLU0laRSA0MDk2Ci0KLWNoYXIgemVyb3NbWkVST0JMS1NJWkVdOwotCi1pbnQKLW1wd19mc2VlayAoRklMRSAqZnAsIGludCBvZmZzZXQsIGludCB3aGVuY2UpCi17Ci0jdW5kZWYgZnNlZWsKLSAgaW50IGN1cnNpemUsIG51bWxlZnQ7Ci0KLSAgUFJPR1JFU1MgKDEpOwotICBpZiAod2hlbmNlID09IFNFRUtfU0VUKQotICAgIHsKLSAgICAgIGZzZWVrIChmcCwgMCwgU0VFS19FTkQpOwotICAgICAgY3Vyc2l6ZSA9IGZ0ZWxsIChmcCk7Ci0gICAgICBpZiAob2Zmc2V0ID4gY3Vyc2l6ZSkKLQl7Ci0JICBudW1sZWZ0ID0gb2Zmc2V0IC0gY3Vyc2l6ZTsKLQkgIHdoaWxlIChudW1sZWZ0ID4gWkVST0JMS1NJWkUpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIG1pZ2h0IGZhaWwsIHNob3VsZCBjaGVjayBmb3IgdGhhdC4gKi8KLQkgICAgICBQUk9HUkVTUyAoMSk7Ci0JICAgICAgZndyaXRlICh6ZXJvcywgMSwgWkVST0JMS1NJWkUsIGZwKTsKLQkgICAgICBudW1sZWZ0IC09IFpFUk9CTEtTSVpFOwotCSAgICB9Ci0JICBQUk9HUkVTUyAoMSk7Ci0JICBmd3JpdGUgKHplcm9zLCAxLCBudW1sZWZ0LCBmcCk7Ci0JICBmZmx1c2ggKGZwKTsKLQl9Ci0gICAgfQotICByZXR1cm4gZnNlZWsgKGZwLCBvZmZzZXQsIHdoZW5jZSk7Ci19Ci0KLWludAotbXB3X2ZyZWFkIChjaGFyICpwdHIsIGludCBzaXplLCBpbnQgbml0ZW1zLCBGSUxFICpzdHJlYW0pCi17Ci0jdW5kZWYgZnJlYWQKLSAgaW50IHJzbHQ7Ci0KLSAgUFJPR1JFU1MgKDEpOwotICByc2x0ID0gZnJlYWQgKHB0ciwgc2l6ZSwgbml0ZW1zLCBzdHJlYW0pOwotICBQUk9HUkVTUyAoMSk7Ci0gIHJldHVybiByc2x0OwotfQotCi1pbnQKLW1wd19md3JpdGUgKGNoYXIgKnB0ciwgaW50IHNpemUsIGludCBuaXRlbXMsIEZJTEUgKnN0cmVhbSkKLXsKLSN1bmRlZiBmd3JpdGUKLSAgaW50IHJzbHQ7Ci0KLSAgUFJPR1JFU1MgKDEpOwotICByc2x0ID0gZndyaXRlIChwdHIsIHNpemUsIG5pdGVtcywgc3RyZWFtKTsKLSAgUFJPR1JFU1MgKDEpOwotICByZXR1cm4gcnNsdDsKLX0KLQotaW50Ci1saW5rICgpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgImxpbmsgbm90IGF2YWlsYWJsZSFcbiIpOwotICBtcHdfYWJvcnQgKCk7Ci19Ci0KLWludAotZm9yayAoKQotewotICBmcHJpbnRmIChzdGRlcnIsICJmb3JrIG5vdCBhdmFpbGFibGUhXG4iKTsKLSAgbXB3X2Fib3J0ICgpOwotfQotCi1pbnQKLXZmb3JrICgpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgInZmb3JrIG5vdCBhdmFpbGFibGUhXG4iKTsKLSAgbXB3X2Fib3J0ICgpOwotICByZXR1cm4gKC0xKTsKLX0KLQotaW50Ci1waXBlIChpbnQgKmZkKQotewotICBmcHJpbnRmIChzdGRlcnIsICJwaXBlIG5vdCBhdmFpbGFibGUhXG4iKTsKLSAgbXB3X2Fib3J0ICgpOwotICByZXR1cm4gKC0xKTsKLX0KLQotI2lmbmRlZiBVU0VfTVdfSEVBREVSUwotaW50Ci1leGVjdnAgKGNoYXIgKmZpbGUsIGNoYXIgKiphcmd2KQotewotICBmcHJpbnRmIChzdGRlcnIsICJleGVjdnAgbm90IGF2YWlsYWJsZSFcbiIpOwotICBtcHdfYWJvcnQgKCk7Ci0gIHJldHVybiAoLTEpOwotfQotCi1pbnQKLWV4ZWN2IChjaGFyICpwYXRoLCBjaGFyICoqYXJndikKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZXhlY3Ygbm90IGF2YWlsYWJsZSFcbiIpOwotICBtcHdfYWJvcnQgKCk7Ci0gIHJldHVybiAoLTEpOwotfQotI2VuZGlmCi0KLWludAota2lsbCAoaW50IHBpZCwgaW50IHNpZykKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAia2lsbCBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLWludAotd2FpdCAoaW50ICpzdGF0dXMpCi17Ci0gICpzdGF0dXMgPSAwOwotICByZXR1cm4gMDsKLX0KLQotI2lmbmRlZiBVU0VfTVdfSEVBREVSUwotaW50Ci1zbGVlcCAoaW50IHNlY29uZHMpCi17Ci0gIHVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZSwgbm93OwotCi0gIHRpbWUgKCZzdGFydF90aW1lKTsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBQUk9HUkVTUyAoMSk7Ci0gICAgICB0aW1lICgmbm93KTsKLSAgICAgIGlmIChub3cgPiBzdGFydF90aW1lICsgc2Vjb25kcykKLQlyZXR1cm4gMDsKLSAgICB9Ci19Ci0jZW5kaWYKLQotdm9pZAotcHV0ZW52IChjaGFyICpzdHIpCi17Ci0gIC8qIFRoZSBHQ0MgZHJpdmVyIGNhbGxzIHRoaXMgdG8gZG8gdGhpbmdzIGZvciBjb2xsZWN0MiwgYnV0IHdlCi0gICAgIGRvbid0IGNhcmUgYWJvdXQgY29sbGVjdDIuICovCi19Ci0KLWludAotY2htb2QgKGNoYXIgKnBhdGgsIGludCBtb2RlKQotewotICAvKiBQcmV0ZW5kIGl0IHdhcyBhbGwgT0suICovCi0gIHJldHVybiAwOwotfQotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi1pbnQKLWdldHVpZCAoKQotewotICAvKiBPbmUgdmFsdWUgaXMgYXMgZ29vZCBhcyBhbm90aGVyLi4uICovCi0gIHJldHVybiAwOwotfQotCi1pbnQKLWdldGdpZCAoKQotewotICAvKiBPbmUgdmFsdWUgaXMgYXMgZ29vZCBhcyBhbm90aGVyLi4uICovCi0gIHJldHVybiAwOwotfQotI2VuZGlmCi0KLS8qIEluc3RlYWQgb2YgY29yZWR1bXBpbmcsIHdoaWNoIGlzIG5vdCBhIG5vcm1hbCBNYWMgZmFjaWxpdHksIHdlCi0gICBkcm9wIGludG8gTWFjc2J1Zy4gIElmIHdlIHRoZW4gImciIGZyb20gTWFjc2J1ZywgdGhlIHByb2dyYW0gd2lsbAotICAgZXhpdCBjbGVhbmx5LiAqLwotCi12b2lkCi1tcHdfYWJvcnQgKCkKLXsKLSAgLyogTWFrZSBzdXJlIG5vIG91dHB1dCBzdGlsbCBidWZmZXJlZCB1cCwgdGhlbiB6YXAgaW50byBNYWNzQnVnLiAqLwotICBmZmx1c2goc3Rkb3V0KTsKLSAgZmZsdXNoKHN0ZGVycik7Ci0gIHByaW50ZigiIyMgQWJvcnQhICMjXG4iKTsKLSNpZmRlZiBNUFdfU0FERQotICBTeXNFcnJvcig4MDA1KTsKLSNlbHNlIAotICBEZWJ1Z2dlcigpOwotI2VuZGlmCi0gIC8qICJnIiBpbiBNYWNzQnVnIHdpbGwgdGhlbiBjYXVzZSBhIHJlZ3VsYXIgZXJyb3IgZXhpdC4gKi8KLSAgZXhpdCAoMSk7Ci19Ci0KLS8qIEltaXRhdGlvbiBnZXRydXNhZ2UgYmFzZWQgb24gdGhlIEFOU0kgY2xvY2soKSBmdW5jdGlvbi4gKi8KLQotaW50Ci1nZXRydXNhZ2UgKGludCB3aG8sIHN0cnVjdCBydXNhZ2UgKnJ1c2FnZSkKLXsKLSAgaW50IGNsayA9IGNsb2NrICgpOwotCi0jaWYgMAotICBydXNhZ2UtPnJ1X3V0aW1lLnR2X3NlYyA9IGNsayAvIENMT0NLU19QRVJfU0VDOwotICBydXNhZ2UtPnJ1X3V0aW1lLnR2X3VzZWMgPSAoKGNsayAqIDEwMDApIC8gQ0xPQ0tTX1BFUl9TRUMpICogMTAwMDsKLSAgcnVzYWdlLT5ydV9zdGltZS50dl9zZWMgPSAwOwotICBydXNhZ2UtPnJ1X3N0aW1lLnR2X3VzZWMgPSAwOwotI2VuZGlmCi19Ci0KLWludAotc2JyayAoKQotewotICByZXR1cm4gMDsKLX0KLQotI2lmbmRlZiBVU0VfTVdfSEVBREVSUwotaW50Ci1pc2F0dHkgKGludCBmZCkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgaXMgaW5oZXJpdGVkIGZyb20gVGltb3RoeSBNdXJyYXkncyBQb3NpeCBsaWJyYXJ5LiAqLwotCi0jaW5jbHVkZSAidXRpbWUuaCIKLQotaW50Ci11dGltZSAoY2hhciAqZmlsZW5hbWUsIHN0cnVjdCB1dGltYnVmICp0aW1lcykKLXsKLSAgQ0luZm9QQlJlYyBjaXBicjsKLSAgSEZpbGVJbmZvICpmcGIgPSAoSEZpbGVJbmZvICopICZjaXBicjsKLSAgRGlySW5mbyAqZHBiID0gKERpckluZm8gKikgJmNpcGJyOwotICB1bnNpZ25lZCBjaGFyIHBuYW1lWzI1Nl07Ci0gIHNob3J0IGVycjsKLSAgCi0gIHN0cmNweSAoKGNoYXIgKikgcG5hbWUsIGZpbGVuYW1lKTsKLSAgYzJwc3RyIChwbmFtZSk7Ci0KLSAgZHBiLT5pb0RyRGlySUQgPSAwTDsKLSAgZnBiLT5pb05hbWVQdHIgPSBwbmFtZTsKLSAgZnBiLT5pb1ZSZWZOdW0gPSAwOwotICBmcGItPmlvRkRpckluZGV4ID0gMDsKLSAgZnBiLT5pb0ZWZXJzTnVtID0gMDsKLSAgZXJyID0gUEJHZXRDYXRJbmZvICgmY2lwYnIsIDApOwotICBpZiAoZXJyICE9IG5vRXJyKSB7Ci0gICAgZXJybm8gPSBFTk9FTlQ7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGRwYi0+aW9EckRpcklEID0gMEw7Ci0gIGZwYi0+aW9GbE1kRGF0ID0gdGltZXMtPm1vZHRpbWU7Ci0gIGZwYi0+aW9GbENyRGF0ID0gdGltZXMtPmFjdGltZTsKLSAgZXJyID0gUEJTZXRDYXRJbmZvICgmY2lwYnIsIDApOwotICBpZiAoZXJyICE9IG5vRXJyKSB7Ci0gICAgZXJybm8gPSBFQUNDRVM7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQKLW1rZGlyIChjaGFyICpwYXRoLCBpbnQgbW9kZSkKLXsKLSAgZXJybm8gPSBFTk9TWVM7Ci0gIHJldHVybiAtMTsKLX0KLQotaW50Ci1ybWRpciAoKQotewotICBlcnJubyA9IEVOT1NZUzsKLSAgcmV0dXJuIC0xOwotfQotI2VuZGlmCi0KLWNob3duICgpCi17Ci0gIGVycm5vID0gRU5PU1lTOwotICByZXR1cm4gLTE7Ci19Ci0KLWNoYXIgKm15ZW52aXJvbltdID0ge05VTEx9OwotCi1jaGFyICoqZW52aXJvbiA9IG15ZW52aXJvbjsKLQotI2lmbmRlZiBVU0VfTVdfSEVBREVSUwotCi0vKiBNaW5pbWFsICdzdGF0JyBlbXVsYXRpb246IHRlbGxzIGRpcmVjdG9yaWVzIGZyb20gZmlsZXMgYW5kCi0gICBnaXZlcyBsZW5ndGggYW5kIG10aW1lLgotCi0gICBEZXJpdmVkIGZyb20gY29kZSB3cml0dGVuIGJ5IEd1aWRvIHZhbiBSb3NzdW0sIENXSSwgQW1zdGVyZGFtCi0gICBhbmQgcGxhY2VkIGJ5IGhpbSBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLWV4dGVybiBpbnQgX191aWQsIF9fZ2lkOwotCi1pbnQgX191aWQgPSAwOwotaW50IF9fZ2lkID0gMDsKLQotLyogQml0cyBpbiBpb0ZsQXR0cmliOiAqLwotI2RlZmluZSBMT0NLQklUCSgxPDwwKQkJLyogRmlsZSBsb2NrZWQgKi8KLSNkZWZpbmUgRElSQklUCSgxPDw0KQkJLyogSXQncyBhIGRpcmVjdG9yeSAqLwotCi0vKiBNYWNpZmllZCAic3RhdCIgaW4gd2hpY2ggZmlsZW5hbWUgaXMgZ2l2ZW4gcmVsYXRpdmUgdG8gYSBkaXJlY3RvcnksCi0gICBzcGVjaWZpZWQgYnkgbG9uZyBEaXJJRC4gICovCi0KLXN0YXRpYyBpbnQKLV9zdGF0IChjaGFyICpuYW1lLCBsb25nIGRpcmlkLCBzdHJ1Y3Qgc3RhdCAqYnVmKQotewotICBDSW5mb1BCUmVjIGNpcGJyOwotICBIRmlsZUluZm8gKmZwYiA9IChIRmlsZUluZm8qKSAmY2lwYnI7Ci0gIERpckluZm8gKmRwYiA9IChEaXJJbmZvKikgJmNpcGJyOwotICBTdHIyNTUgcG5hbWU7Ci0gIHNob3J0IGVycjsKLQotICAvKiBNYWtlIGEgdGVtcCBjb3B5IG9mIHRoZSBuYW1lIGFuZCBwYXNjYWxpemUuICovCi0gIHN0cmNweSAoKGNoYXIgKikgcG5hbWUsIG5hbWUpOwotICBjMnBzdHIgKHBuYW1lKTsKLSAgCi0gIGNpcGJyLmRpckluZm8uaW9EckRpcklEID0gZGlyaWQ7Ci0gIGNpcGJyLmhGaWxlSW5mby5pb05hbWVQdHIgPSBwbmFtZTsKLSAgY2lwYnIuaEZpbGVJbmZvLmlvVlJlZk51bSA9IDA7Ci0gIGNpcGJyLmhGaWxlSW5mby5pb0ZEaXJJbmRleCA9IDA7Ci0gIGNpcGJyLmhGaWxlSW5mby5pb0ZWZXJzTnVtID0gMDsKLSAgZXJyID0gUEJHZXRDYXRJbmZvICgmY2lwYnIsIDApOwotICBpZiAoZXJyICE9IG5vRXJyKQotICAgIHsKLSAgICAgIGVycm5vID0gRU5PRU5UOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgLyogTWFjIGZpbGVzIGFyZSByZWFkYWJsZSBpZiB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBhdCBhbGwuICovCi0gIGJ1Zi0+c3RfbW9kZSA9IDA0NDQ7Ci0gIC8qIE1hcmsgdW5sb2NrZWQgZmlsZXMgYXMgd3JpdGVhYmxlLiAqLwotICBpZiAoIShmcGItPmlvRmxBdHRyaWIgJiBMT0NLQklUKSkKLSAgICBidWYtPnN0X21vZGUgfD0gMDIyMjsKLSAgaWYgKGZwYi0+aW9GbEF0dHJpYiAmIERJUkJJVCkKLSAgICB7Ci0gICAgICAvKiBNYXJrIGRpcmVjdG9yaWVzIGFzICJleGVjdXRhYmxlIi4gKi8KLSAgICAgIGJ1Zi0+c3RfbW9kZSB8PSAwMTExIHwgU19JRkRJUjsKLSAgICAgIGJ1Zi0+c3Rfc2l6ZSA9IGRwYi0+aW9Eck5tRmxzOwotICAgICAgYnVmLT5zdF9yc2l6ZSA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYnVmLT5zdF9tb2RlIHw9IFNfSUZSRUc7Ci0gICAgICAvKiBNYXJrIGFwcHMgYXMgImV4ZWN1dGFibGUiLiAqLwotICAgICAgaWYgKGZwYi0+aW9GbEZuZHJJbmZvLmZkVHlwZSA9PSAnQVBQTCcpCi0JYnVmLT5zdF9tb2RlIHw9IDAxMTE7Ci0gICAgICAvKiBGaWxsIGluIHRoZSBzaXplcyBvZiBkYXRhIGFuZCByZXNvdXJjZSBmb3Jrcy4gKi8KLSAgICAgIGJ1Zi0+c3Rfc2l6ZSA9IGZwYi0+aW9GbExnTGVuOwotICAgICAgYnVmLT5zdF9yc2l6ZSA9IGZwYi0+aW9GbFJMZ0xlbjsKLSAgICB9Ci0gIC8qIEZpbGwgaW4gdmFyaW91cyB0aW1lcy4gKi8KLSAgYnVmLT5zdF9hdGltZSA9IGZwYi0+aW9GbENyRGF0OwotICBidWYtPnN0X210aW1lID0gZnBiLT5pb0ZsTWREYXQ7Ci0gIGJ1Zi0+c3RfY3RpbWUgPSBmcGItPmlvRmxDckRhdDsKLSAgLyogU2V0IHVwIGFuIGltaXRhdGlvbiBpbm9kZSBudW1iZXIuICovCi0gIGJ1Zi0+c3RfaW5vID0gKHVuc2lnbmVkIHNob3J0KSBmcGItPmlvRGlySUQ7Ci0gIC8qIFNldCB1cCBhbiBpbWl0YXRpb24gZGV2aWNlLiAqLwotICBHZXRWUmVmTnVtIChidWYtPnN0X2lubywgJmJ1Zi0+c3RfZGV2KTsKLSAgYnVmLT5zdF91aWQgPSBfX3VpZDsKLSAgYnVmLT5zdF9naWQgPSBfX2dpZDsKLS8qICBidWYtPnN0X0ZsRm5kckluZm8gPSBmcGItPmlvRmxGbmRySW5mbzsgICovCi0gIHJldHVybiAwOwotfQotCi0vKiBzdGF0KCkgc2V0cyB1cCBhbiBlbXB0eSBkaXJpZC4gKi8KLQotaW50Ci1zdGF0IChjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhdCAqYnVmKQotewotICBsb25nIHJzbHQsIGVycm51bTsKLSAgY2hhciB0bXBuYW1lWzI1Nl07Ci0KLSAgbXB3aWZ5X2ZpbGVuYW1lIChwYXRoLCB0bXBuYW1lKTsKLSAgaWYgKERlYnVnUEkpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIyBzdGF0ICglcywgJXgpIiwgdG1wbmFtZSwgYnVmKTsKLSAgUFJPR1JFU1MgKDEpOwotICByc2x0ID0gX3N0YXQgKHRtcG5hbWUsIDBMLCBidWYpOwotICBlcnJudW0gPSBlcnJubzsKLSAgaWYgKERlYnVnUEkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIC0+ICVkIiwgcnNsdCk7Ci0gICAgICBpZiAocnNsdCAhPSAwKQotCWZwcmludGYgKHN0ZGVyciwgIiAoZXJybm8gaXMgJWQpIiwgZXJybnVtKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgICBmZmx1c2ggKHN0ZGVycik7Ci0gICAgfQotICBpZiAocnNsdCAhPSAwKQotICAgIGVycm5vID0gZXJybnVtOwotICByZXR1cm4gcnNsdDsKLX0KLQotaW50Ci1mc3RhdCAoaW50IGZkLCBzdHJ1Y3Qgc3RhdCAqYnVmKQotewotICBGQ0JQQlJlYyBmY2I7Ci0gIEZJTEUgKmZwOwotICBTdHIyNTUgcGF0aG5hbWU7Ci0gIGxvbmcgZGlyaWQgPSAwTCwgdGVtcDsKLSAgbG9uZyByc2x0LCBlcnJudW07Ci0gIHNob3J0IGVycjsKLQotICBpZiAoRGVidWdQSSA8IDApCi0gICAgRGVidWdQSSA9ICgqKGdldGVudiAoIkRFQlVHX1BBVEhOQU1FUyIpKSA9PSAnMScgPyAxIDogMCk7Ci0gIGlmIChEZWJ1Z1BJKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiMgZnN0YXQgKCVkLCAleCkiLCBmZCwgYnVmKTsKLSAgUFJPR1JFU1MgKDEpOwotICBwYXRobmFtZVswXSA9IDA7Ci0jaWZkZWYgRklPRk5BTUUKLSAgLyogVXNlIGFuIE1QVy1zcGVjaWZpYyBpb2N0bCB0byBnZXQgdGhlIHBhdGhuYW1lIGFzc29jaWF0ZWQgd2l0aAotICAgICB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KLSAgaW9jdGwgKGZkLCBGSU9GTkFNRSwgKGxvbmcgKikgcGF0aG5hbWUpOyAKLSNlbHNlCi0gIHlvdSBsb3NlCi0jZW5kaWYKLSAgaWYgKERlYnVnUEkpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIChuYW1lIGlzICVzKSIsIHBhdGhuYW1lKTsKLSAgZGlyaWQgPSAwTCAvKiBmY2IuaW9GQ0JQYXJJRCAqLyA7Ci0gIHJzbHQgPSBfc3RhdCAoKGNoYXIgKikgcGF0aG5hbWUsIGRpcmlkLCBidWYpOwotICBlcnJudW0gPSBlcnJubzsKLSAgaWYgKERlYnVnUEkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIC0+ICVkIiwgcnNsdCk7Ci0gICAgICBpZiAocnNsdCAhPSAwKQotCWZwcmludGYgKHN0ZGVyciwgIiAoZXJybm8gaXMgJWQpIiwgZXJybnVtKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgICBmZmx1c2ggKHN0ZGVycik7Ci0gICAgfQotICBpZiAocnNsdCAhPSAwKQotICAgIGVycm5vID0gZXJybnVtOwotICByZXR1cm4gcnNsdDsKLX0KLQotI2VuZGlmIC8qIG4gVVNFX01XX0hFQURFUlMgKi8KLQotY2hkaXIgKCkKLXsKLSAgZXJybm8gPSBFTk9TWVM7Ci0gIHJldHVybiAoLTEpOwotfQotCi1jaGFyICoKLWdldGN3ZCAoY2hhciAqYnVmLCBpbnQgc2l6ZSkKLXsKLSAgaWYgKGJ1ZiA9PSBOVUxMKQotICAgIGJ1ZiA9IChjaGFyICopIG1hbGxvYyAoc2l6ZSk7Ci0gIHN0cmNweShidWYsICI6Iik7Ci0gIHJldHVybiBidWY7Ci19Ci0KLS8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIG1vcmUgZWxhYm9yYXRlIGZvciBNUFcuICovCi0KLWNoYXIgKgotZ2V0cHdkICgpCi17Ci0gIHJldHVybiAiOiI7Ci19Ci0KLWludAotbXB3X29wZW4gKGNoYXIgKmZpbGVuYW1lLCBpbnQgYXJnMiwgaW50IGFyZzMpCi17Ci0jdW5kZWYgb3BlbgotICBpbnQgZmQsIGVycm51bSA9IDA7Ci0gIGNoYXIgdG1wbmFtZVsyNTZdOwotCi0gIG1wd2lmeV9maWxlbmFtZSAoZmlsZW5hbWUsIHRtcG5hbWUpOwotICBmZCA9IG9wZW4gKHRtcG5hbWUsIGFyZzIpOwotICBlcnJudW0gPSBlcnJubzsKLQotICBpZiAoRGVidWdQSSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIjIG9wZW4gKCVzLCAlZCwgJWQpIiwgdG1wbmFtZSwgYXJnMiwgYXJnMyk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJWQiLCBmZCk7Ci0gICAgICBpZiAoZmQgPT0gLTEpCi0JZnByaW50ZiAoc3RkZXJyLCAiIChlcnJubyBpcyAlZCkiLCBlcnJudW0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICB9Ci0gIGlmIChmZCA9PSAtMSkKLSAgICBlcnJubyA9IGVycm51bTsKLSAgcmV0dXJuIGZkOwotfQotCi1pbnQKLW1wd19hY2Nlc3MgKGNoYXIgKmZpbGVuYW1lLCB1bnNpZ25lZCBpbnQgY21kKQotewotI3VuZGVmIGFjY2VzcwotCi0gIGludCByc2x0LCBlcnJudW0gPSAwOwotICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgY2hhciB0bXBuYW1lWzI1Nl07Ci0KLSAgbXB3aWZ5X2ZpbGVuYW1lIChmaWxlbmFtZSwgdG1wbmFtZSk7Ci0gIGlmIChjbWQgJiBSX09LIHx8IGNtZCAmIFhfT0spCi0gICAgewotICAgICAgcnNsdCA9IHN0YXQgKHRtcG5hbWUsICZzdCk7Ci0gICAgICBlcnJudW0gPSBlcnJubzsKLSAgICAgIGlmIChyc2x0ID49IDApCi0JewotCSAgaWYgKCgoKHN0LnN0X21vZGUgJiAwMDQpID09IDApICYmIChjbWQgJiBSX09LKSkKLQkgICAgICB8fCAoKChzdC5zdF9tb2RlICYgMDAyKSA9PSAwKSAmJiAoY21kICYgV19PSykpCi0JICAgICAgfHwgKCgoc3Quc3RfbW9kZSAmIDAwMSkgPT0gMCkgJiYgKGNtZCAmIFhfT0spKSkKLQkgICAgewotCSAgICAgIHJzbHQgPSAtMTsKLQkgICAgICBlcnJudW0gPSBFQUNDRVM7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAoRGVidWdQSSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIjIG1wd19hY2Nlc3MgKCVzLCAlZCkiLCB0bXBuYW1lLCBjbWQpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIC0+ICVkIiwgcnNsdCk7Ci0gICAgICBpZiAocnNsdCAhPSAwKQotCWZwcmludGYgKHN0ZGVyciwgIiAoZXJybm8gaXMgJWQpIiwgZXJybnVtKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotICBpZiAocnNsdCAhPSAwKQotICAgIGVycm5vID0gZXJybnVtOwotICByZXR1cm4gcnNsdDsKLX0KLQotLyogVGhlIE1QVyBsaWJyYXJ5IGNyZWF0KCkgaGFzIG5vIG1vZGUgYXJndW1lbnQuICovCi0KLWludAotbXB3X2NyZWF0IChjaGFyICpwYXRoLCAvKiBtb2RlX3QgKi8gaW50IG1vZGUpCi17Ci0jdW5kZWYgY3JlYXQKLQotI2lmZGVmIFVTRV9NV19IRUFERVJTCi0gIHJldHVybiBjcmVhdCAocGF0aCwgbW9kZSk7Ci0jZWxzZQotICByZXR1cm4gY3JlYXQgKHBhdGgpOwotI2VuZGlmCi19Ci0KLS8qIFRoaXMgaXMgYSBoYWNrIHRvIGdldCBjb250cm9sIGluIGFuIE1QVyB0b29sIGJlZm9yZSBpdCBjcmFzaGVzIHRoZQotICAgbWFjaGluZS4gICovCi0KLW1wd19zcGVjaWFsX2luaXQgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChzdHJzdHIgKG5hbWUsICJERUJVRyIpKQotICAgIERlYnVnU3RyKCJccGF0IGJlZ2lubmluZyBvZiBwcm9ncmFtIik7Ci19Ci0KLXN0YXRpYyBpbnQgY3VycmVudF91bWFzazsKLQotaW50Ci11bWFzayhpbnQgbWFzaykKLXsKLSAgaW50IG9sZG1hc2sgPSBjdXJyZW50X3VtYXNrOwotCi0gIGN1cnJlbnRfdW1hc2sgPSBtYXNrOwotICByZXR1cm4gb2xkbWFzazsKLX0KLQotLyogQ3Vyc29yLXNwaW5uaW5nIHN0dWZmIHRoYXQgaW5jbHVkZXMgbWV0ZXJpbmcgb2Ygc3BpbiByYXRlIGFuZCBkZWxheXMuICAqLwotCi0vKiBOb256ZXJvIHdoZW4gY3Vyc29yIHNwaW5uaW5nIGhhcyBiZWVuIHNldCB1cCBwcm9wZXJseS4gICovCi0KLWludCBjdXJzb3JfaW5pdGVkOwotCi0vKiBOb256ZXJvIGlmIHNwaW4gc2hvdWxkIGJlIG1lYXN1cmVkIGFuZCBleGNlc3NpdmUgZGVsYXlzIHJlcG9ydGVkLiAgKi8KLQotaW50IG1lYXN1cmVfc3BpbjsKLQotLyogTm9uemVybyBpZiBzcGluIGhpc3RvZ3JhbSBhbmQgcmF0ZSBkYXRhIHNob3VsZCBiZSB3cml0dGVuIG91dC4gICovCi0KLWludCBkdW1wX3NwaW5fZGF0YTsKLQotbG9uZyB3YXJuaW5nX3RocmVzaG9sZCA9IDQwMDAwMDsKLQotbG9uZyBidWNrZXRfc2l6ZSA9IDEwMjQ7Ci0KLWxvbmcgYnVja2V0X3Bvd2VyID0gMTA7Ci0KLWxvbmcgbnVtYnVja2V0cyA9IDMwMDsKLQotaW50ICpkZWxheV9jb3VudHM7Ci0KLWludCBvdmVyZmxvd19jb3VudDsKLQotY2hhciAqY3VycmVudF9wcm9ncmVzczsKLQotc3RhdGljIFVuc2lnbmVkV2lkZSBsYXN0X21pY3Jvc2Vjb25kczsKLQotc3RhdGljIGNoYXIgKmxhc3Rfc3Bpbl9maWxlID0gIiI7Ci0KLXN0YXRpYyBpbnQgbGFzdF9zcGluX2xpbmU7Ci0KLXZvaWQKLXdhcm5faWZfc3Bpbl9kZWxheSAoY2hhciAqZmlsZSwgaW50IGxpbmUpCi17Ci0gIGxvbmcgZGlmZiwgaXg7Ci0gIFVuc2lnbmVkV2lkZSBub3c7Ci0KLSAgTWljcm9zZWNvbmRzKCZub3cpOwotCi0gIGRpZmYgPSBub3cubG8gLSBsYXN0X21pY3Jvc2Vjb25kcy5sbzsKLQotICBpZiAoZGlmZiA+IHdhcm5pbmdfdGhyZXNob2xkKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiMgJXM6ICVsZC4lMDZsZCBzZWMgZGVsYXkgZ2V0dGluZyBmcm9tICVzOiVkIHRvICVzOiVkXG4iLAotCSAgICAgKGN1cnJlbnRfcHJvZ3Jlc3MgPyBjdXJyZW50X3Byb2dyZXNzIDogIiIpLAotCSAgICAgZGlmZiAvIDEwMDAwMDAsIGRpZmYgJSAxMDAwMDAwLAotCSAgICAgbGFzdF9zcGluX2ZpbGUsIGxhc3Rfc3Bpbl9saW5lLCBmaWxlLCBsaW5lKTsKLSAgaWYgKGR1bXBfc3Bpbl9kYXRhKQotICAgIHsKLSAgICAgIGlmIChkaWZmID49IDApCi0JewotCSAgaXggPSBkaWZmID4+IGJ1Y2tldF9wb3dlcjsKLQkgIGlmIChpeCA+PSAwICYmIGl4IDwgbnVtYnVja2V0cyAmJiBkZWxheV9jb3VudHMgIT0gTlVMTCkKLQkgICAgKytkZWxheV9jb3VudHNbaXhdOwotCSAgZWxzZQotCSAgICArK292ZXJmbG93X2NvdW50OwotCX0KLSAgICAgIGVsc2UKLQlmcHJpbnRmIChzdGRlcnIsICJyYXcgZGlmZiBpcyAlbGQgKD8pXG4iLCBkaWZmKTsKLSAgICB9Ci19Ci0KLXZvaWQKLXJlY29yZF9mb3Jfc3Bpbl9kZWxheSAoY2hhciAqZmlsZSwgaW50IGxpbmUpCi17Ci0gIE1pY3Jvc2Vjb25kcyAoJmxhc3RfbWljcm9zZWNvbmRzKTsKLSAgbGFzdF9zcGluX2ZpbGUgPSBmaWxlOwotICBsYXN0X3NwaW5fbGluZSA9IGxpbmU7Ci19Ci0KLXZvaWQKLW1wd19zdGFydF9wcm9ncmVzcyAoY2hhciAqc3RyLCBpbnQgbiwgY2hhciAqZmlsZSwgaW50IGxpbmUpCi17Ci0gIGludCBpOwotICBjaGFyICptZWFzdXJlLCAqdGhyZXNob2xkOwotCi0gIGlmICghY3Vyc29yX2luaXRlZCkKLSAgICB7Ci0gICAgICBJbml0Q3Vyc29yQ3RsIChuaWwpOwotICAgICAgY3Vyc29yX2luaXRlZCA9IDE7Ci0gICAgICByZWNvcmRfZm9yX3NwaW5fZGVsYXkgKGZpbGUsIGxpbmUpOwotICAgICAgbWVhc3VyZSA9IGdldGVudiAoIk1FQVNVUkVfU1BJTiIpOwotICAgICAgaWYgKG1lYXN1cmUgIT0gTlVMTCAmJiBtZWFzdXJlWzBdICE9ICdcMCcpCi0JewotCSAgbWVhc3VyZV9zcGluID0gMTsKLQkgIGlmIChzdHJjbXAgKG1lYXN1cmUsICJhbGwiKSA9PSAwKQotCSAgICBkdW1wX3NwaW5fZGF0YSA9IDE7Ci0JfQotICAgICAgdGhyZXNob2xkID0gZ2V0ZW52ICgiU1BJTl9XQVJOX1RIUkVTSE9MRCIpOwotICAgICAgaWYgKHRocmVzaG9sZCAhPSBOVUxMICYmIHRocmVzaG9sZFswXSAhPSAnXDAnKQotCXdhcm5pbmdfdGhyZXNob2xkID0gYXRvbCAodGhyZXNob2xkKTsKLSAgICAgIGlmIChkdW1wX3NwaW5fZGF0YSkKLQl7Ci0JICBpZiAoZGVsYXlfY291bnRzID09IE5VTEwpCi0JICAgIGRlbGF5X2NvdW50cyA9IChpbnQgKikgbWFsbG9jIChudW1idWNrZXRzICogc2l6ZW9mIChpbnQpKTsKLQkgIGZvciAoaSA9IDA7IGkgPCBudW1idWNrZXRzOyArK2kpCi0JICAgIGRlbGF5X2NvdW50c1tpXSA9IDA7Ci0JICBvdmVyZmxvd19jb3VudCA9IDA7Ci0JfQotICAgIH0KLSAgY3VycmVudF9wcm9ncmVzcyA9IHN0cjsKLQotICBzeXNfbmVyciA9IGVycm5vX21heCAoKTsKLQotICBtcHdfc3BlY2lhbF9pbml0IChzdHIpOwotfQotCi12b2lkCi1tcHdfcHJvZ3Jlc3MgKGludCBuKQotewotICBTcGluQ3Vyc29yICgzMik7Ci19Ci0KLXZvaWQKLW1wd19wcm9ncmVzc19tZWFzdXJlZCAoaW50IG4sIGNoYXIgKmZpbGUsIGludCBsaW5lKQotewotICBpZiAobWVhc3VyZV9zcGluKQotICAgIHdhcm5faWZfc3Bpbl9kZWxheSAoZmlsZSwgbGluZSk7Ci0gIFNwaW5DdXJzb3IgKDMyKTsKLSAgaWYgKG1lYXN1cmVfc3BpbikKLSAgICByZWNvcmRfZm9yX3NwaW5fZGVsYXkgKGZpbGUsIGxpbmUpOwotfQotCi12b2lkCi1tcHdfZW5kX3Byb2dyZXNzIChjaGFyICpzdHIsIGNoYXIgKmZpbGUsIGludCBsaW5lKQotewotICBsb25nIGksIGRlbGF5LCBjb3VudCA9IDAsIHN1bSA9IDAsIGF2Z2RlbGF5LCBzcGlucmF0ZTsKLSAgbG9uZyBjdXJwb3dlciA9IDAsIGN1cmdyb3VwID0gMDsKLQotICAvKiBXYXJuIGlmIGl0J3MgYmVlbiBhIHdoaWxlIHNpbmNlIHRoZSBsYXN0IHNwaW4uICAqLwotICBpZiAobWVhc3VyZV9zcGluKQotICAgIHdhcm5faWZfc3Bpbl9kZWxheSAoZmlsZSwgbGluZSk7Ci0KLSAgLyogRHVtcCBhbGwgdGhlIG5vbnplcm8gZGVsYXkgY291bnRzIGFuZCBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSBkZWxheS4gICovCi0gIGlmIChkdW1wX3NwaW5fZGF0YSAmJiBkZWxheV9jb3VudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtYnVja2V0czsgKytpKQotCXsKLQkgIGRlbGF5ID0gKGkgKyAxKSAqIGJ1Y2tldF9zaXplOwotCSAgc3VtICs9IGRlbGF5X2NvdW50c1tpXSAqIChpICsgMSk7Ci0JICBjb3VudCArPSBkZWxheV9jb3VudHNbaV07Ci0JICBpZiAoZGVsYXkgPD0gKDEgPDwgY3VycG93ZXIpKQotCSAgICB7Ci0JICAgICAgY3VyZ3JvdXAgKz0gZGVsYXlfY291bnRzW2ldOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoY3VyZ3JvdXAgPiAwKQotCQlmcHJpbnRmIChzdGRlcnIsCi0JCQkgIiMgJXM6ICVkIGRlbGF5cyBiZXR3ZWVuICVsZC4lMDZsZCBhbmQgJWxkLiUwNmxkIHNlY1xuIiwKLQkJCSAoc3RyID8gc3RyIDogIiIpLAotCQkJIGN1cmdyb3VwLAotCQkJICgxIDw8IGN1cnBvd2VyKSAvIDEwMDAwMDAsCi0JCQkgKDEgPDwgY3VycG93ZXIpICUgMTAwMDAwMCwKLQkJCSAoMSA8PCAoY3VycG93ZXIgKyAxKSkgLyAxMDAwMDAwLAotCQkJICgxIDw8IChjdXJwb3dlciArIDEpKSAlIDEwMDAwMDApOwotCSAgICAgICsrY3VycG93ZXI7Ci0JICAgICAgY3VyZ3JvdXAgPSAwOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGNvdW50ID4gMCkKLQl7Ci0JICBhdmdkZWxheSA9IChzdW0gKiBidWNrZXRfc2l6ZSkgLyBjb3VudDsKLQkgIHNwaW5yYXRlID0gMTAwMDAwMCAvIGF2Z2RlbGF5OwotCSAgZnByaW50ZiAoc3RkZXJyLCAiIyAlczogQXZlcmFnZSBzcGluIHJhdGUgaXMgJWQgdGltZXMvc2VjXG4iLAotCQkgICAoc3RyID8gc3RyIDogIiIpLCBzcGlucmF0ZSk7Ci0JfQotICAgIH0KLX0KLQotI2lmZGVmIFBST0dSRVNTX1RFU1QKLQotLyogVGVzdCBwcm9ncmFtLiAgKi8KLQotbWFpbiAoKQotewotICBpbnQgaSwgajsKLSAgZG91YmxlIHggPSAxLjAsIHkgPSAyLjQ7Ci0gIGxvbmcgc3RhcnQgPSBNaWNyb3NlY29uZHMgKCksIHRtOyAgRklYTUUKLQotICBTVEFSVF9QUk9HUkVTUyAoImhpIiwgMCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDEwMDA7ICsraSkKLSAgICB7Ci0gICAgICBQUk9HUkVTUyAoMSk7Ci0KLSAgICAgIGZvciAoaiA9IDA7IGogPCAoaSAqIDEwMCk7ICsraikKLQl7Ci0JICB4ICs9ICh4ICogeSkgLyBqOwotCX0KLSAgICB9Ci0gIAotICBFTkRfUFJPR1JFU1MgKCJoaSIpOwotICAKLSAgdG0gPSBNaWNyb3NlY29uZHMgKCkgLSBzdGFydDsKLQotICBwcmludGYgKCJUb3RhbCB0aW1lIGlzICVkLiVkIHNlY3NcbiIsIHRtIC8gMTAwMDAwMCwgdG0gJSAxMDAwMDAwKTsKLX0KLQotI2VuZGlmCi0KLSNpZmRlZiBVU0VfTVdfSEVBREVSUwotLyogRW1wdHkgZGVmaW5pdGlvbnMgZm9yIE1ldHJvd2Vya3MnIFNJT1VYIGNvbnNvbGUgbGlicmFyeS4gKi8KLQotI2lmbmRlZiBfX0NPTlNPTEVfXwotI2luY2x1ZGUgPGNvbnNvbGUuaD4KLSNlbmRpZgotCi1zaG9ydAotSW5zdGFsbENvbnNvbGUoc2hvcnQgZmQpCi17Ci0jcHJhZ21hIHVudXNlZCAoZmQpCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLVJlbW92ZUNvbnNvbGUodm9pZCkKLXsKLX0KLQotbG9uZwotV3JpdGVDaGFyc1RvQ29uc29sZShjaGFyICpidWYsIGxvbmcgbikKLXsKLSNwcmFnbWEgdW51c2VkIChidWYsIG4pCi0JcmV0dXJuIDA7Ci19Ci0KLWxvbmcgUmVhZENoYXJzRnJvbUNvbnNvbGUoY2hhciAqYnVmLCBsb25nIG4pCi17Ci0jcHJhZ21hIHVudXNlZCAoYnVmLCBuKQotCXJldHVybiAwOwotfQotCi1leHRlcm4gY2hhciAqCi1fX3R0eW5hbWUobG9uZyBmZCkKLXsKLQlzdGF0aWMgY2hhciAqX19kZXZpY2VuYW1lID0gIm51bGwgZGV2aWNlIjsKLQotCWlmIChmZCA+PSAwICYmIGZkIDw9IDIpCi0JICByZXR1cm4gKF9fZGV2aWNlbmFtZSk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21zZG9zLmMgYi9saWJpYmVydHkvbXNkb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzZTY0ZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbXNkb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWNoYXIgbXNnW10gPSAiTm8gdmZvcmsgYXZhaWxhYmxlIC0gYWJvcnRpbmdcbiI7Ci12Zm9yaygpCi17Ci0gIHdyaXRlKDEsIG1zZywgc2l6ZW9mKG1zZykpOwotfQotCi1zaWdzZXRtYXNrKCkKLXsKLSAgLyogbm8gc2lnbmFscyBzdXBwb3J0IGluIGdvMzIgKHlldCkgKi8KLX0KLQotd2FpdHBpZCgpCi17Ci0gIHJldHVybiAtMTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9vYmphbGxvYy5jIGIvbGliaWJlcnR5L29iamFsbG9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NzU0YTguLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L29iamFsbG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyogb2JqYWxsb2MuYyAtLSByb3V0aW5lcyB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG9iamVjdHMKLSAgIENvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci1sYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib2JqYWxsb2MuaCIKLQotLyogR2V0IGEgZGVmaW5pdGlvbiBmb3IgTlVMTC4gICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmIFZNUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXhsaWIuaD4KLSNlbHNlCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLS8qIEdldCBhIGRlZmluaXRpb24gZm9yIHNpemVfdC4gICovCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLQotLyogRm9yIHN5c3RlbXMgd2l0aCBsYXJnZXIgcG9pbnRlcnMgdGhhbiBpbnRzLCB0aGlzIG11c3QgYmUgZGVjbGFyZWQuICAqLwotZXh0ZXJuIFBUUiBtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci1leHRlcm4gdm9pZCBmcmVlIFBBUkFNUyAoKFBUUikpOwotI2VuZGlmCi0KLS8qIFRoZXNlIHJvdXRpbmVzIGFsbG9jYXRlIHNwYWNlIGZvciBhbiBvYmplY3QuICBGcmVlaW5nIGFsbG9jYXRlZAotICAgc3BhY2UgbWF5IG9yIG1heSBub3QgZnJlZSBhbGwgbW9yZSByZWNlbnRseSBhbGxvY2F0ZWQgc3BhY2UuCi0KLSAgIFdlIGhhbmRsZSBsYXJnZSBhbmQgc21hbGwgYWxsb2NhdGlvbiByZXF1ZXN0cyBkaWZmZXJlbnRseS4gIElmIHdlCi0gICBkb24ndCBoYXZlIGVub3VnaCBzcGFjZSBpbiB0aGUgY3VycmVudCBibG9jaywgYW5kIHRoZSBhbGxvY2F0aW9uCi0gICByZXF1ZXN0IGlzIGZvciBtb3JlIHRoYW4gNTEyIGJ5dGVzLCB3ZSBzaW1wbHkgcGFzcyBpdCB0aHJvdWdoIHRvCi0gICBtYWxsb2MuICAqLwotCi0vKiBUaGUgb2JqYWxsb2Mgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gb2JqYWxsb2MuaC4gICovCi0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggY2h1bmsuICAqLwotCi1zdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsKLXsKLSAgLyogTmV4dCBjaHVuay4gICovCi0gIHN0cnVjdCBvYmphbGxvY19jaHVuayAqbmV4dDsKLSAgLyogSWYgdGhpcyBjaHVuayBjb250YWlucyBsYXJnZSBvYmplY3RzLCB0aGlzIGlzIHRoZSB2YWx1ZSBvZgotICAgICBjdXJyZW50X3B0ciB3aGVuIHRoaXMgY2h1bmsgd2FzIGFsbG9jYXRlZC4gIElmIHRoaXMgY2h1bmsKLSAgICAgY29udGFpbnMgc21hbGwgb2JqZWN0cywgdGhpcyBpcyBOVUxMLiAgKi8KLSAgY2hhciAqY3VycmVudF9wdHI7Ci19OwotCi0vKiBUaGUgYWxpZ25lZCBzaXplIG9mIG9iamFsbG9jX2NodW5rLiAgKi8KLQotI2RlZmluZSBDSFVOS19IRUFERVJfU0laRQkJCQkJXAotICAoKHNpemVvZiAoc3RydWN0IG9iamFsbG9jX2NodW5rKSArIE9CSkFMTE9DX0FMSUdOIC0gMSkJXAotICAgJn4gKE9CSkFMTE9DX0FMSUdOIC0gMSkpCi0KLS8qIFdlIGFzayBmb3IgdGhpcyBtdWNoIG1lbW9yeSBlYWNoIHRpbWUgd2UgY3JlYXRlIGEgY2h1bmsgd2hpY2ggaXMgdG8KLSAgIGhvbGQgc21hbGwgb2JqZWN0cy4gICovCi0KLSNkZWZpbmUgQ0hVTktfU0laRSAoNDA5NiAtIDMyKQotCi0vKiBBIHJlcXVlc3QgZm9yIHRoaXMgYW1vdW50IG9yIG1vcmUgaXMganVzdCBwYXNzZWQgdGhyb3VnaCB0byBtYWxsb2MuICAqLwotCi0jZGVmaW5lIEJJR19SRVFVRVNUICg1MTIpCi0KLS8qIENyZWF0ZSBhbiBvYmphbGxvYyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3Qgb2JqYWxsb2MgKgotb2JqYWxsb2NfY3JlYXRlICgpCi17Ci0gIHN0cnVjdCBvYmphbGxvYyAqcmV0OwotICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKmNodW5rOwotCi0gIHJldCA9IChzdHJ1Y3Qgb2JqYWxsb2MgKikgbWFsbG9jIChzaXplb2YgKnJldCk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXQtPmNodW5rcyA9IChQVFIpIG1hbGxvYyAoQ0hVTktfU0laRSk7Ci0gIGlmIChyZXQtPmNodW5rcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgY2h1bmsgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIHJldC0+Y2h1bmtzOwotICBjaHVuay0+bmV4dCA9IE5VTEw7Ci0gIGNodW5rLT5jdXJyZW50X3B0ciA9IE5VTEw7Ci0KLSAgcmV0LT5jdXJyZW50X3B0ciA9IChjaGFyICopIGNodW5rICsgQ0hVTktfSEVBREVSX1NJWkU7Ci0gIHJldC0+Y3VycmVudF9zcGFjZSA9IENIVU5LX1NJWkUgLSBDSFVOS19IRUFERVJfU0laRTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBBbGxvY2F0ZSBzcGFjZSBmcm9tIGFuIG9iamFsbG9jIHN0cnVjdHVyZS4gICovCi0KLVBUUgotX29iamFsbG9jX2FsbG9jIChvLCBsZW4pCi0gICAgIHN0cnVjdCBvYmphbGxvYyAqbzsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW47Ci17Ci0gIC8qIFdlIGF2b2lkIGNvbmZ1c2lvbiBmcm9tIHplcm8gc2l6ZWQgb2JqZWN0cyBieSBhbHdheXMgYWxsb2NhdGluZwotICAgICBhdCBsZWFzdCAxIGJ5dGUuICAqLwotICBpZiAobGVuID09IDApCi0gICAgbGVuID0gMTsKLQotICBsZW4gPSAobGVuICsgT0JKQUxMT0NfQUxJR04gLSAxKSAmfiAoT0JKQUxMT0NfQUxJR04gLSAxKTsKLQotICBpZiAobGVuIDw9IG8tPmN1cnJlbnRfc3BhY2UpCi0gICAgewotICAgICAgby0+Y3VycmVudF9wdHIgKz0gbGVuOwotICAgICAgby0+Y3VycmVudF9zcGFjZSAtPSBsZW47Ci0gICAgICByZXR1cm4gKFBUUikgKG8tPmN1cnJlbnRfcHRyIC0gbGVuKTsKLSAgICB9Ci0KLSAgaWYgKGxlbiA+PSBCSUdfUkVRVUVTVCkKLSAgICB7Ci0gICAgICBjaGFyICpyZXQ7Ci0gICAgICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKmNodW5rOwotCi0gICAgICByZXQgPSAoY2hhciAqKSBtYWxsb2MgKENIVU5LX0hFQURFUl9TSVpFICsgbGVuKTsKLSAgICAgIGlmIChyZXQgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgY2h1bmsgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIHJldDsKLSAgICAgIGNodW5rLT5uZXh0ID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSBvLT5jaHVua3M7Ci0gICAgICBjaHVuay0+Y3VycmVudF9wdHIgPSBvLT5jdXJyZW50X3B0cjsKLQotICAgICAgby0+Y2h1bmtzID0gKFBUUikgY2h1bms7Ci0KLSAgICAgIHJldHVybiAoUFRSKSAocmV0ICsgQ0hVTktfSEVBREVSX1NJWkUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqY2h1bms7Ci0KLSAgICAgIGNodW5rID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSBtYWxsb2MgKENIVU5LX1NJWkUpOwotICAgICAgaWYgKGNodW5rID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBjaHVuay0+bmV4dCA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgby0+Y2h1bmtzOwotICAgICAgY2h1bmstPmN1cnJlbnRfcHRyID0gTlVMTDsKLQotICAgICAgby0+Y3VycmVudF9wdHIgPSAoY2hhciAqKSBjaHVuayArIENIVU5LX0hFQURFUl9TSVpFOwotICAgICAgby0+Y3VycmVudF9zcGFjZSA9IENIVU5LX1NJWkUgLSBDSFVOS19IRUFERVJfU0laRTsKLQotICAgICAgby0+Y2h1bmtzID0gKFBUUikgY2h1bms7Ci0KLSAgICAgIHJldHVybiBvYmphbGxvY19hbGxvYyAobywgbGVuKTsKLSAgICB9Ci19Ci0KLS8qIEZyZWUgYW4gZW50aXJlIG9iamFsbG9jIHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLW9iamFsbG9jX2ZyZWUgKG8pCi0gICAgIHN0cnVjdCBvYmphbGxvYyAqbzsKLXsKLSAgc3RydWN0IG9iamFsbG9jX2NodW5rICpsOwotCi0gIGwgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG8tPmNodW5rczsKLSAgd2hpbGUgKGwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKm5leHQ7Ci0KLSAgICAgIG5leHQgPSBsLT5uZXh0OwotICAgICAgZnJlZSAobCk7Ci0gICAgICBsID0gbmV4dDsKLSAgICB9Ci0KLSAgZnJlZSAobyk7Ci19Ci0KLS8qIEZyZWUgYSBibG9jayBmcm9tIGFuIG9iamFsbG9jIHN0cnVjdHVyZS4gIFRoaXMgYWxzbyBmcmVlcyBhbGwgbW9yZQotICAgcmVjZW50bHkgYWxsb2NhdGVkIGJsb2Nrcy4gICovCi0KLXZvaWQKLW9iamFsbG9jX2ZyZWVfYmxvY2sgKG8sIGJsb2NrKQotICAgICBzdHJ1Y3Qgb2JqYWxsb2MgKm87Ci0gICAgIFBUUiBibG9jazsKLXsKLSAgc3RydWN0IG9iamFsbG9jX2NodW5rICpwLCAqc21hbGw7Ci0gIGNoYXIgKmIgPSAoY2hhciAqKSBibG9jazsKLQotICAvKiBGaXJzdCBzZXQgUCB0byB0aGUgY2h1bmsgd2hpY2ggY29udGFpbnMgdGhlIGJsb2NrIHdlIGFyZSBmcmVlaW5nLAotICAgICBhbmQgc2V0IFEgdG8gdGhlIGxhc3Qgc21hbGwgb2JqZWN0IGNodW5rIHdlIHNlZSBiZWZvcmUgUC4gICovCi0gIHNtYWxsID0gTlVMTDsKLSAgZm9yIChwID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSBvLT5jaHVua3M7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgewotICAgICAgaWYgKHAtPmN1cnJlbnRfcHRyID09IE5VTEwpCi0JewotCSAgaWYgKGIgPiAoY2hhciAqKSBwICYmIGIgPCAoY2hhciAqKSBwICsgQ0hVTktfU0laRSkKLQkgICAgYnJlYWs7Ci0JICBzbWFsbCA9IHA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChiID09IChjaGFyICopIHAgKyBDSFVOS19IRUFERVJfU0laRSkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBjaHVuaywgdGhlIGNhbGxlciBoYXMgbWFkZSBhIG1pc3Rha2UuICAqLwotICBpZiAocCA9PSBOVUxMKQotICAgIGFib3J0ICgpOwotCi0gIGlmIChwLT5jdXJyZW50X3B0ciA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqcTsKLSAgICAgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqZmlyc3Q7Ci0KLSAgICAgIC8qIFRoZSBibG9jayBpcyBpbiBhIGNodW5rIGNvbnRhaW5pbmcgc21hbGwgb2JqZWN0cy4gIFdlIGNhbgotCSBmcmVlIGV2ZXJ5IGNodW5rIHRocm91Z2ggU01BTEwsIGJlY2F1c2UgdGhleSBoYXZlIGNlcnRhaW5seQotCSBiZWVuIGFsbG9jYXRlZCBtb3JlIHJlY2VudGx5LiAgQWZ0ZXIgU01BTEwsIHdlIHdpbGwgbm90IHNlZQotCSBhbnkgY2h1bmtzIGNvbnRhaW5pbmcgc21hbGwgb2JqZWN0czsgd2UgY2FuIGZyZWUgYW55IGJpZwotCSBjaHVuayBpZiB0aGUgY3VycmVudF9wdHIgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIEIuICBXZQotCSBjYW4gdGhlbiByZXNldCB0aGUgbmV3IGN1cnJlbnRfcHRyIHRvIEIuICAqLwotCi0gICAgICBmaXJzdCA9IE5VTEw7Ci0gICAgICBxID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSBvLT5jaHVua3M7Ci0gICAgICB3aGlsZSAocSAhPSBwKQotCXsKLQkgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqbmV4dDsKLQotCSAgbmV4dCA9IHEtPm5leHQ7Ci0JICBpZiAoc21hbGwgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChzbWFsbCA9PSBxKQotCQlzbWFsbCA9IE5VTEw7Ci0JICAgICAgZnJlZSAocSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHEtPmN1cnJlbnRfcHRyID4gYikKLQkgICAgZnJlZSAocSk7Ci0JICBlbHNlIGlmIChmaXJzdCA9PSBOVUxMKQotCSAgICBmaXJzdCA9IHE7Ci0KLQkgIHEgPSBuZXh0OwotCX0KLQotICAgICAgaWYgKGZpcnN0ID09IE5VTEwpCi0JZmlyc3QgPSBwOwotICAgICAgby0+Y2h1bmtzID0gKFBUUikgZmlyc3Q7Ci0KLSAgICAgIC8qIE5vdyBzdGFydCBhbGxvY2F0aW5nIGZyb20gdGhpcyBzbWFsbCBibG9jayBhZ2Fpbi4gICovCi0gICAgICBvLT5jdXJyZW50X3B0ciA9IGI7Ci0gICAgICBvLT5jdXJyZW50X3NwYWNlID0gKChjaGFyICopIHAgKyBDSFVOS19TSVpFKSAtIGI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IG9iamFsbG9jX2NodW5rICpxOwotICAgICAgY2hhciAqY3VycmVudF9wdHI7Ci0KLSAgICAgIC8qIFRoaXMgYmxvY2sgaXMgaW4gYSBsYXJnZSBjaHVuayBieSBpdHNlbGYuICBXZSBjYW4gZnJlZQotICAgICAgICAgZXZlcnl0aGluZyBvbiB0aGUgbGlzdCB1cCB0byBhbmQgaW5jbHVkaW5nIHRoaXMgYmxvY2suICBXZQotICAgICAgICAgdGhlbiBzdGFydCBhbGxvY2F0aW5nIGZyb20gdGhlIG5leHQgY2h1bmsgY29udGFpbmluZyBzbWFsbAotICAgICAgICAgb2JqZWN0cywgc2V0dGluZyBjdXJyZW50X3B0ciBmcm9tIHRoZSB2YWx1ZSBzdG9yZWQgd2l0aCB0aGUKLSAgICAgICAgIGxhcmdlIGNodW5rIHdlIGFyZSBmcmVlaW5nLiAgKi8KLQotICAgICAgY3VycmVudF9wdHIgPSBwLT5jdXJyZW50X3B0cjsKLSAgICAgIHAgPSBwLT5uZXh0OwotCi0gICAgICBxID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSBvLT5jaHVua3M7Ci0gICAgICB3aGlsZSAocSAhPSBwKQotCXsKLQkgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqbmV4dDsKLQotCSAgbmV4dCA9IHEtPm5leHQ7Ci0JICBmcmVlIChxKTsKLQkgIHEgPSBuZXh0OwotCX0KLQotICAgICAgby0+Y2h1bmtzID0gKFBUUikgcDsKLQotICAgICAgd2hpbGUgKHAtPmN1cnJlbnRfcHRyICE9IE5VTEwpCi0JcCA9IHAtPm5leHQ7Ci0KLSAgICAgIG8tPmN1cnJlbnRfcHRyID0gY3VycmVudF9wdHI7Ci0gICAgICBvLT5jdXJyZW50X3NwYWNlID0gKChjaGFyICopIHAgKyBDSFVOS19TSVpFKSAtIGN1cnJlbnRfcHRyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9vYnN0YWNrLmMgYi9saWJpYmVydHkvb2JzdGFjay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzMxOGIzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9vYnN0YWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTMgKzAsMCBAQAotLyogb2JzdGFjay5jIC0gc3Vicm91dGluZXMgdXNlZCBpbXBsaWNpdGx5IGJ5IG9iamVjdCBzdGFjayBtYWNyb3MKLSAgIENvcHlyaWdodCAoQykgMTk4OCw4OSw5MCw5MSw5Miw5Myw5NCw5Niw5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotCi0gICBOT1RFOiBUaGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0aGlzIGZpbGUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5LgotICAgQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQGdudS5vcmcuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLSAgIGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLS8qIE5PVEUgQkVGT1JFIE1PRElGWUlORyBUSElTIEZJTEU6IFRoaXMgdmVyc2lvbiBudW1iZXIgbXVzdCBiZQotICAgaW5jcmVtZW50ZWQgd2hlbmV2ZXIgY2FsbGVycyBjb21waWxlZCB1c2luZyBhbiBvbGQgb2JzdGFjay5oIGNhbiBubwotICAgbG9uZ2VyIHByb3Blcmx5IGNhbGwgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG9ic3RhY2suYy4gICovCi0jZGVmaW5lIE9CU1RBQ0tfSU5URVJGQUNFX1ZFUlNJT04gMQotCi0vKiBDb21tZW50IG91dCBhbGwgdGhpcyBjb2RlIGlmIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgTGlicmFyeSwgYW5kIGFyZSBub3QKLSAgIGFjdHVhbGx5IGNvbXBpbGluZyB0aGUgbGlicmFyeSBpdHNlbGYsIGFuZCB0aGUgaW5zdGFsbGVkIGxpYnJhcnkKLSAgIHN1cHBvcnRzIHRoZSBzYW1lIGxpYnJhcnkgaW50ZXJmYWNlIHdlIGRvLiAgVGhpcyBjb2RlIGlzIHBhcnQgb2YgdGhlIEdOVQotICAgQyBMaWJyYXJ5LCBidXQgYWxzbyBpbmNsdWRlZCBpbiBtYW55IG90aGVyIEdOVSBkaXN0cmlidXRpb25zLiAgQ29tcGlsaW5nCi0gICBhbmQgbGlua2luZyBpbiB0aGlzIGNvZGUgaXMgYSB3YXN0ZSB3aGVuIHVzaW5nIHRoZSBHTlUgQyBsaWJyYXJ5Ci0gICAoZXNwZWNpYWxseSBpZiBpdCBpcyBhIHNoYXJlZCBsaWJyYXJ5KS4gIFJhdGhlciB0aGFuIGhhdmluZyBldmVyeSBHTlUKLSAgIHByb2dyYW0gdW5kZXJzdGFuZCBgY29uZmlndXJlIC0td2l0aC1nbnUtbGliYycgYW5kIG9taXQgdGhlIG9iamVjdAotICAgZmlsZXMsIGl0IGlzIHNpbXBsZXIgdG8ganVzdCBkbyB0aGlzIGluIHRoZSBzb3VyY2UgZm9yIGVhY2ggc3VjaCBmaWxlLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+CQkvKiBSYW5kb20gdGhpbmcgdG8gZ2V0IF9fR05VX0xJQlJBUllfXy4gICovCi0jaWYgIWRlZmluZWQgKF9MSUJDKSAmJiBkZWZpbmVkIChfX0dOVV9MSUJSQVJZX18pICYmIF9fR05VX0xJQlJBUllfXyA+IDEKLSNpbmNsdWRlIDxnbnUtdmVyc2lvbnMuaD4KLSNpZiBfR05VX09CU1RBQ0tfSU5URVJGQUNFX1ZFUlNJT04gPT0gT0JTVEFDS19JTlRFUkZBQ0VfVkVSU0lPTgotI2RlZmluZSBFTElERV9DT0RFCi0jZW5kaWYKLSNlbmRpZgotCi0KLSNpZm5kZWYgRUxJREVfQ09ERQotCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSNkZWZpbmUgUE9JTlRFUiB2b2lkICoKLSNlbHNlCi0jZGVmaW5lIFBPSU5URVIgY2hhciAqCi0jZW5kaWYKLQotLyogRGV0ZXJtaW5lIGRlZmF1bHQgYWxpZ25tZW50LiAgKi8KLXN0cnVjdCBmb29hbGlnbiB7Y2hhciB4OyBkb3VibGUgZDt9OwotI2RlZmluZSBERUZBVUxUX0FMSUdOTUVOVCAgXAotICAoKFBUUl9JTlRfVFlQRSkgKChjaGFyICopICYoKHN0cnVjdCBmb29hbGlnbiAqKSAwKS0+ZCAtIChjaGFyICopIDApKQotLyogSWYgbWFsbG9jIHdlcmUgcmVhbGx5IHNtYXJ0LCBpdCB3b3VsZCByb3VuZCBhZGRyZXNzZXMgdG8gREVGQVVMVF9BTElHTk1FTlQuCi0gICBCdXQgaW4gZmFjdCBpdCBtaWdodCBiZSBsZXNzIHNtYXJ0IGFuZCByb3VuZCBhZGRyZXNzZXMgdG8gYXMgbXVjaCBhcwotICAgREVGQVVMVF9ST1VORElORy4gIFNvIHdlIHByZXBhcmUgZm9yIGl0IHRvIGRvIHRoYXQuICAqLwotdW5pb24gZm9vcm91bmQge2xvbmcgeDsgZG91YmxlIGQ7fTsKLSNkZWZpbmUgREVGQVVMVF9ST1VORElORyAoc2l6ZW9mICh1bmlvbiBmb29yb3VuZCkpCi0KLS8qIFdoZW4gd2UgY29weSBhIGxvbmcgYmxvY2sgb2YgZGF0YSwgdGhpcyBpcyB0aGUgdW5pdCB0byBkbyBpdCB3aXRoLgotICAgT24gc29tZSBtYWNoaW5lcywgY29weWluZyBzdWNjZXNzaXZlIGludHMgZG9lcyBub3Qgd29yazsKLSAgIGluIHN1Y2ggYSBjYXNlLCByZWRlZmluZSBDT1BZSU5HX1VOSVQgdG8gYGxvbmcnIChpZiB0aGF0IHdvcmtzKQotICAgb3IgYGNoYXInIGFzIGEgbGFzdCByZXNvcnQuICAqLwotI2lmbmRlZiBDT1BZSU5HX1VOSVQKLSNkZWZpbmUgQ09QWUlOR19VTklUIGludAotI2VuZGlmCi0KLQotLyogVGhlIGZ1bmN0aW9ucyBhbGxvY2F0aW5nIG1vcmUgcm9vbSBieSBjYWxsaW5nIGBvYnN0YWNrX2NodW5rX2FsbG9jJwotICAganVtcCB0byB0aGUgaGFuZGxlciBwb2ludGVkIHRvIGJ5IGBvYnN0YWNrX2FsbG9jX2ZhaWxlZF9oYW5kbGVyJy4KLSAgIFRoaXMgdmFyaWFibGUgYnkgZGVmYXVsdCBwb2ludHMgdG8gdGhlIGludGVybmFsIGZ1bmN0aW9uCi0gICBgcHJpbnRfYW5kX2Fib3J0Jy4gICovCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi1zdGF0aWMgdm9pZCBwcmludF9hbmRfYWJvcnQgKHZvaWQpOwotdm9pZCAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICh2b2lkKSA9IHByaW50X2FuZF9hYm9ydDsKLSNlbHNlCi1zdGF0aWMgdm9pZCBwcmludF9hbmRfYWJvcnQgKCk7Ci12b2lkICgqb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcikgKCkgPSBwcmludF9hbmRfYWJvcnQ7Ci0jZW5kaWYKLQotLyogRXhpdCB2YWx1ZSB1c2VkIHdoZW4gYHByaW50X2FuZF9hYm9ydCcgaXMgdXNlZC4gICovCi0jaWYgZGVmaW5lZCBfX0dOVV9MSUJSQVJZX18gfHwgZGVmaW5lZCBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZm5kZWYgRVhJVF9GQUlMVVJFCi0jZGVmaW5lIEVYSVRfRkFJTFVSRSAxCi0jZW5kaWYKLWludCBvYnN0YWNrX2V4aXRfZmFpbHVyZSA9IEVYSVRfRkFJTFVSRTsKLQotLyogVGhlIG5vbi1HTlUtQyBtYWNyb3MgY29weSB0aGUgb2JzdGFjayBpbnRvIHRoaXMgZ2xvYmFsIHZhcmlhYmxlCi0gICB0byBhdm9pZCBtdWx0aXBsZSBldmFsdWF0aW9uLiAgKi8KLQotc3RydWN0IG9ic3RhY2sgKl9vYnN0YWNrOwotCi0vKiBEZWZpbmUgYSBtYWNybyB0aGF0IGVpdGhlciBjYWxscyBmdW5jdGlvbnMgd2l0aCB0aGUgdHJhZGl0aW9uYWwgbWFsbG9jL2ZyZWUKLSAgIGNhbGxpbmcgaW50ZXJmYWNlLCBvciBjYWxscyBmdW5jdGlvbnMgd2l0aCB0aGUgbW1hbGxvYy9tZnJlZSBpbnRlcmZhY2UKLSAgICh0aGF0IGFkZHMgYW4gZXh0cmEgZmlyc3QgYXJndW1lbnQpLCBiYXNlZCBvbiB0aGUgc3RhdGUgb2YgdXNlX2V4dHJhX2FyZy4KLSAgIEZvciBmcmVlLCBkbyBub3QgdXNlID86LCBzaW5jZSBzb21lIGNvbXBpbGVycywgbGlrZSB0aGUgTUlQUyBjb21waWxlcnMsCi0gICBkbyBub3QgYWxsb3cgKGV4cHIpID8gdm9pZCA6IHZvaWQuICAqLwotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jZGVmaW5lIENBTExfQ0hVTktGVU4oaCwgc2l6ZSkgXAotICAoKChoKSAtPiB1c2VfZXh0cmFfYXJnKSBcCi0gICA/ICgqKGgpLT5jaHVua2Z1bikgKChoKS0+ZXh0cmFfYXJnLCAoc2l6ZSkpIFwKLSAgIDogKCooc3RydWN0IF9vYnN0YWNrX2NodW5rICooKikgKGxvbmcpKSAoaCktPmNodW5rZnVuKSAoKHNpemUpKSkKLQotI2RlZmluZSBDQUxMX0ZSRUVGVU4oaCwgb2xkX2NodW5rKSBcCi0gIGRvIHsgXAotICAgIGlmICgoaCkgLT4gdXNlX2V4dHJhX2FyZykgXAotICAgICAgKCooaCktPmZyZWVmdW4pICgoaCktPmV4dHJhX2FyZywgKG9sZF9jaHVuaykpOyBcCi0gICAgZWxzZSBcCi0gICAgICAoKih2b2lkICgqKSAodm9pZCAqKSkgKGgpLT5mcmVlZnVuKSAoKG9sZF9jaHVuaykpOyBcCi0gIH0gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBDQUxMX0NIVU5LRlVOKGgsIHNpemUpIFwKLSAgKCgoaCkgLT4gdXNlX2V4dHJhX2FyZykgXAotICAgPyAoKihoKS0+Y2h1bmtmdW4pICgoaCktPmV4dHJhX2FyZywgKHNpemUpKSBcCi0gICA6ICgqKHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCopICgpKSAoaCktPmNodW5rZnVuKSAoKHNpemUpKSkKLQotI2RlZmluZSBDQUxMX0ZSRUVGVU4oaCwgb2xkX2NodW5rKSBcCi0gIGRvIHsgXAotICAgIGlmICgoaCkgLT4gdXNlX2V4dHJhX2FyZykgXAotICAgICAgKCooaCktPmZyZWVmdW4pICgoaCktPmV4dHJhX2FyZywgKG9sZF9jaHVuaykpOyBcCi0gICAgZWxzZSBcCi0gICAgICAoKih2b2lkICgqKSAoKSkgKGgpLT5mcmVlZnVuKSAoKG9sZF9jaHVuaykpOyBcCi0gIH0gd2hpbGUgKDApCi0jZW5kaWYKLQotDAotLyogSW5pdGlhbGl6ZSBhbiBvYnN0YWNrIEggZm9yIHVzZS4gIFNwZWNpZnkgY2h1bmsgc2l6ZSBTSVpFICgwIG1lYW5zIGRlZmF1bHQpLgotICAgT2JqZWN0cyBzdGFydCBvbiBtdWx0aXBsZXMgb2YgQUxJR05NRU5UICgwIG1lYW5zIHVzZSBkZWZhdWx0KS4KLSAgIENIVU5LRlVOIGlzIHRoZSBmdW5jdGlvbiB0byB1c2UgdG8gYWxsb2NhdGUgY2h1bmtzLAotICAgYW5kIEZSRUVGVU4gdGhlIGZ1bmN0aW9uIHRvIGZyZWUgdGhlbS4KLQotICAgUmV0dXJuIG5vbnplcm8gaWYgc3VjY2Vzc2Z1bCwgemVybyBpZiBvdXQgb2YgbWVtb3J5LgotICAgVG8gcmVjb3ZlciBmcm9tIGFuIG91dCBvZiBtZW1vcnkgZXJyb3IsCi0gICBmcmVlIHVwIHNvbWUgbWVtb3J5LCB0aGVuIGNhbGwgdGhpcyBhZ2Fpbi4gICovCi0KLWludAotX29ic3RhY2tfYmVnaW4gKGgsIHNpemUsIGFsaWdubWVudCwgY2h1bmtmdW4sIGZyZWVmdW4pCi0gICAgIHN0cnVjdCBvYnN0YWNrICpoOwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IGFsaWdubWVudDsKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSAgICAgUE9JTlRFUiAoKmNodW5rZnVuKSAobG9uZyk7Ci0gICAgIHZvaWQgKCpmcmVlZnVuKSAodm9pZCAqKTsKLSNlbHNlCi0gICAgIFBPSU5URVIgKCpjaHVua2Z1bikgKCk7Ci0gICAgIHZvaWQgKCpmcmVlZnVuKSAoKTsKLSNlbmRpZgotewotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmNodW5rOyAvKiBwb2ludHMgdG8gbmV3IGNodW5rICovCi0KLSAgaWYgKGFsaWdubWVudCA9PSAwKQotICAgIGFsaWdubWVudCA9IChpbnQpIERFRkFVTFRfQUxJR05NRU5UOwotICBpZiAoc2l6ZSA9PSAwKQotICAgIC8qIERlZmF1bHQgc2l6ZSBpcyB3aGF0IEdOVSBtYWxsb2MgY2FuIGZpdCBpbiBhIDQwOTYtYnl0ZSBibG9jay4gICovCi0gICAgewotICAgICAgLyogMTIgaXMgc2l6ZW9mIChtaGVhZCkgYW5kIDQgaXMgRVhUUkEgZnJvbSBHTlUgbWFsbG9jLgotCSBVc2UgdGhlIHZhbHVlcyBmb3IgcmFuZ2UgY2hlY2tpbmcsIGJlY2F1c2UgaWYgcmFuZ2UgY2hlY2tpbmcgaXMgb2ZmLAotCSB0aGUgZXh0cmEgYnl0ZXMgd29uJ3QgYmUgbWlzc2VkIHRlcnJpYmx5LCBidXQgaWYgcmFuZ2UgY2hlY2tpbmcgaXMgb24KLQkgYW5kIHdlIHVzZWQgYSBsYXJnZXIgcmVxdWVzdCwgYSB3aG9sZSBleHRyYSA0MDk2IGJ5dGVzIHdvdWxkIGJlCi0JIGFsbG9jYXRlZC4KLQotCSBUaGVzZSBudW1iZXIgYXJlIGlycmVsZXZhbnQgdG8gdGhlIG5ldyBHTlUgbWFsbG9jLiAgSSBzdXNwZWN0IGl0IGlzCi0JIGxlc3Mgc2Vuc2l0aXZlIHRvIHRoZSBzaXplIG9mIHRoZSByZXF1ZXN0LiAgKi8KLSAgICAgIGludCBleHRyYSA9ICgoKCgxMiArIERFRkFVTFRfUk9VTkRJTkcgLSAxKSAmIH4oREVGQVVMVF9ST1VORElORyAtIDEpKQotCQkgICAgKyA0ICsgREVGQVVMVF9ST1VORElORyAtIDEpCi0JCSAgICYgfihERUZBVUxUX1JPVU5ESU5HIC0gMSkpOwotICAgICAgc2l6ZSA9IDQwOTYgLSBleHRyYTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSAgaC0+Y2h1bmtmdW4gPSAoc3RydWN0IF9vYnN0YWNrX2NodW5rICogKCopKHZvaWQgKiwgbG9uZykpIGNodW5rZnVuOwotICBoLT5mcmVlZnVuID0gKHZvaWQgKCopICh2b2lkICosIHN0cnVjdCBfb2JzdGFja19jaHVuayAqKSkgZnJlZWZ1bjsKLSNlbHNlCi0gIGgtPmNodW5rZnVuID0gKHN0cnVjdCBfb2JzdGFja19jaHVuayAqICgqKSgpKSBjaHVua2Z1bjsKLSAgaC0+ZnJlZWZ1biA9IGZyZWVmdW47Ci0jZW5kaWYKLSAgaC0+Y2h1bmtfc2l6ZSA9IHNpemU7Ci0gIGgtPmFsaWdubWVudF9tYXNrID0gYWxpZ25tZW50IC0gMTsKLSAgaC0+dXNlX2V4dHJhX2FyZyA9IDA7Ci0KLSAgY2h1bmsgPSBoLT5jaHVuayA9IENBTExfQ0hVTktGVU4gKGgsIGggLT4gY2h1bmtfc2l6ZSk7Ci0gIGlmICghY2h1bmspCi0gICAgKCpvYnN0YWNrX2FsbG9jX2ZhaWxlZF9oYW5kbGVyKSAoKTsKLSAgaC0+bmV4dF9mcmVlID0gaC0+b2JqZWN0X2Jhc2UgPSBjaHVuay0+Y29udGVudHM7Ci0gIGgtPmNodW5rX2xpbWl0ID0gY2h1bmstPmxpbWl0Ci0gICAgPSAoY2hhciAqKSBjaHVuayArIGgtPmNodW5rX3NpemU7Ci0gIGNodW5rLT5wcmV2ID0gMDsKLSAgLyogVGhlIGluaXRpYWwgY2h1bmsgbm93IGNvbnRhaW5zIG5vIGVtcHR5IG9iamVjdC4gICovCi0gIGgtPm1heWJlX2VtcHR5X29iamVjdCA9IDA7Ci0gIGgtPmFsbG9jX2ZhaWxlZCA9IDA7Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLV9vYnN0YWNrX2JlZ2luXzEgKGgsIHNpemUsIGFsaWdubWVudCwgY2h1bmtmdW4sIGZyZWVmdW4sIGFyZykKLSAgICAgc3RydWN0IG9ic3RhY2sgKmg7Ci0gICAgIGludCBzaXplOwotICAgICBpbnQgYWxpZ25tZW50OwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotICAgICBQT0lOVEVSICgqY2h1bmtmdW4pIChQT0lOVEVSLCBsb25nKTsKLSAgICAgdm9pZCAoKmZyZWVmdW4pIChQT0lOVEVSLCBQT0lOVEVSKTsKLSNlbHNlCi0gICAgIFBPSU5URVIgKCpjaHVua2Z1bikgKCk7Ci0gICAgIHZvaWQgKCpmcmVlZnVuKSAoKTsKLSNlbmRpZgotICAgICBQT0lOVEVSIGFyZzsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpjaHVuazsgLyogcG9pbnRzIHRvIG5ldyBjaHVuayAqLwotCi0gIGlmIChhbGlnbm1lbnQgPT0gMCkKLSAgICBhbGlnbm1lbnQgPSAoaW50KSBERUZBVUxUX0FMSUdOTUVOVDsKLSAgaWYgKHNpemUgPT0gMCkKLSAgICAvKiBEZWZhdWx0IHNpemUgaXMgd2hhdCBHTlUgbWFsbG9jIGNhbiBmaXQgaW4gYSA0MDk2LWJ5dGUgYmxvY2suICAqLwotICAgIHsKLSAgICAgIC8qIDEyIGlzIHNpemVvZiAobWhlYWQpIGFuZCA0IGlzIEVYVFJBIGZyb20gR05VIG1hbGxvYy4KLQkgVXNlIHRoZSB2YWx1ZXMgZm9yIHJhbmdlIGNoZWNraW5nLCBiZWNhdXNlIGlmIHJhbmdlIGNoZWNraW5nIGlzIG9mZiwKLQkgdGhlIGV4dHJhIGJ5dGVzIHdvbid0IGJlIG1pc3NlZCB0ZXJyaWJseSwgYnV0IGlmIHJhbmdlIGNoZWNraW5nIGlzIG9uCi0JIGFuZCB3ZSB1c2VkIGEgbGFyZ2VyIHJlcXVlc3QsIGEgd2hvbGUgZXh0cmEgNDA5NiBieXRlcyB3b3VsZCBiZQotCSBhbGxvY2F0ZWQuCi0KLQkgVGhlc2UgbnVtYmVyIGFyZSBpcnJlbGV2YW50IHRvIHRoZSBuZXcgR05VIG1hbGxvYy4gIEkgc3VzcGVjdCBpdCBpcwotCSBsZXNzIHNlbnNpdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGUgcmVxdWVzdC4gICovCi0gICAgICBpbnQgZXh0cmEgPSAoKCgoMTIgKyBERUZBVUxUX1JPVU5ESU5HIC0gMSkgJiB+KERFRkFVTFRfUk9VTkRJTkcgLSAxKSkKLQkJICAgICsgNCArIERFRkFVTFRfUk9VTkRJTkcgLSAxKQotCQkgICAmIH4oREVGQVVMVF9ST1VORElORyAtIDEpKTsKLSAgICAgIHNpemUgPSA0MDk2IC0gZXh0cmE7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChfX1NURENfXykgJiYgX19TVERDX18KLSAgaC0+Y2h1bmtmdW4gPSAoc3RydWN0IF9vYnN0YWNrX2NodW5rICogKCopKHZvaWQgKixsb25nKSkgY2h1bmtmdW47Ci0gIGgtPmZyZWVmdW4gPSAodm9pZCAoKikgKHZvaWQgKiwgc3RydWN0IF9vYnN0YWNrX2NodW5rICopKSBmcmVlZnVuOwotI2Vsc2UKLSAgaC0+Y2h1bmtmdW4gPSAoc3RydWN0IF9vYnN0YWNrX2NodW5rICogKCopKCkpIGNodW5rZnVuOwotICBoLT5mcmVlZnVuID0gZnJlZWZ1bjsKLSNlbmRpZgotICBoLT5jaHVua19zaXplID0gc2l6ZTsKLSAgaC0+YWxpZ25tZW50X21hc2sgPSBhbGlnbm1lbnQgLSAxOwotICBoLT5leHRyYV9hcmcgPSBhcmc7Ci0gIGgtPnVzZV9leHRyYV9hcmcgPSAxOwotCi0gIGNodW5rID0gaC0+Y2h1bmsgPSBDQUxMX0NIVU5LRlVOIChoLCBoIC0+IGNodW5rX3NpemUpOwotICBpZiAoIWNodW5rKQotICAgICgqb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcikgKCk7Ci0gIGgtPm5leHRfZnJlZSA9IGgtPm9iamVjdF9iYXNlID0gY2h1bmstPmNvbnRlbnRzOwotICBoLT5jaHVua19saW1pdCA9IGNodW5rLT5saW1pdAotICAgID0gKGNoYXIgKikgY2h1bmsgKyBoLT5jaHVua19zaXplOwotICBjaHVuay0+cHJldiA9IDA7Ci0gIC8qIFRoZSBpbml0aWFsIGNodW5rIG5vdyBjb250YWlucyBubyBlbXB0eSBvYmplY3QuICAqLwotICBoLT5tYXliZV9lbXB0eV9vYmplY3QgPSAwOwotICBoLT5hbGxvY19mYWlsZWQgPSAwOwotICByZXR1cm4gMTsKLX0KLQotLyogQWxsb2NhdGUgYSBuZXcgY3VycmVudCBjaHVuayBmb3IgdGhlIG9ic3RhY2sgKkgKLSAgIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgTEVOR1RIIGJ5dGVzIG5lZWQgdG8gYmUgYWRkZWQKLSAgIHRvIHRoZSBjdXJyZW50IG9iamVjdCwgb3IgYSBuZXcgb2JqZWN0IG9mIGxlbmd0aCBMRU5HVEggYWxsb2NhdGVkLgotICAgQ29waWVzIGFueSBwYXJ0aWFsIG9iamVjdCBmcm9tIHRoZSBlbmQgb2YgdGhlIG9sZCBjaHVuawotICAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV3IG9uZS4gICovCi0KLXZvaWQKLV9vYnN0YWNrX25ld2NodW5rIChoLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpoOwotICAgICBpbnQgbGVuZ3RoOwotewotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKm9sZF9jaHVuayA9IGgtPmNodW5rOwotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKm5ld19jaHVuazsKLSAgcmVnaXN0ZXIgbG9uZwluZXdfc2l6ZTsKLSAgcmVnaXN0ZXIgbG9uZyBvYmpfc2l6ZSA9IGgtPm5leHRfZnJlZSAtIGgtPm9iamVjdF9iYXNlOwotICByZWdpc3RlciBsb25nIGk7Ci0gIGxvbmcgYWxyZWFkeTsKLQotICAvKiBDb21wdXRlIHNpemUgZm9yIG5ldyBjaHVuay4gICovCi0gIG5ld19zaXplID0gKG9ial9zaXplICsgbGVuZ3RoKSArIChvYmpfc2l6ZSA+PiAzKSArIDEwMDsKLSAgaWYgKG5ld19zaXplIDwgaC0+Y2h1bmtfc2l6ZSkKLSAgICBuZXdfc2l6ZSA9IGgtPmNodW5rX3NpemU7Ci0KLSAgLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIG5ldyBjaHVuay4gICovCi0gIG5ld19jaHVuayA9IENBTExfQ0hVTktGVU4gKGgsIG5ld19zaXplKTsKLSAgaWYgKCFuZXdfY2h1bmspCi0gICAgKCpvYnN0YWNrX2FsbG9jX2ZhaWxlZF9oYW5kbGVyKSAoKTsKLSAgaC0+Y2h1bmsgPSBuZXdfY2h1bms7Ci0gIG5ld19jaHVuay0+cHJldiA9IG9sZF9jaHVuazsKLSAgbmV3X2NodW5rLT5saW1pdCA9IGgtPmNodW5rX2xpbWl0ID0gKGNoYXIgKikgbmV3X2NodW5rICsgbmV3X3NpemU7Ci0KLSAgLyogTW92ZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IHRvIHRoZSBuZXcgY2h1bmsuCi0gICAgIFdvcmQgYXQgYSB0aW1lIGlzIGZhc3QgYW5kIGlzIHNhZmUgaWYgdGhlIG9iamVjdAotICAgICBpcyBzdWZmaWNpZW50bHkgYWxpZ25lZC4gICovCi0gIGlmIChoLT5hbGlnbm1lbnRfbWFzayArIDEgPj0gREVGQVVMVF9BTElHTk1FTlQpCi0gICAgewotICAgICAgZm9yIChpID0gb2JqX3NpemUgLyBzaXplb2YgKENPUFlJTkdfVU5JVCkgLSAxOwotCSAgIGkgPj0gMDsgaS0tKQotCSgoQ09QWUlOR19VTklUICopbmV3X2NodW5rLT5jb250ZW50cylbaV0KLQkgID0gKChDT1BZSU5HX1VOSVQgKiloLT5vYmplY3RfYmFzZSlbaV07Ci0gICAgICAvKiBXZSB1c2VkIHRvIGNvcHkgdGhlIG9kZCBmZXcgcmVtYWluaW5nIGJ5dGVzIGFzIG9uZSBleHRyYSBDT1BZSU5HX1VOSVQsCi0JIGJ1dCB0aGF0IGNhbiBjcm9zcyBhIHBhZ2UgYm91bmRhcnkgb24gYSBtYWNoaW5lCi0JIHdoaWNoIGRvZXMgbm90IGRvIHN0cmljdCBhbGlnbm1lbnQgZm9yIENPUFlJTkdfVU5JVFMuICAqLwotICAgICAgYWxyZWFkeSA9IG9ial9zaXplIC8gc2l6ZW9mIChDT1BZSU5HX1VOSVQpICogc2l6ZW9mIChDT1BZSU5HX1VOSVQpOwotICAgIH0KLSAgZWxzZQotICAgIGFscmVhZHkgPSAwOwotICAvKiBDb3B5IHJlbWFpbmluZyBieXRlcyBvbmUgYnkgb25lLiAgKi8KLSAgZm9yIChpID0gYWxyZWFkeTsgaSA8IG9ial9zaXplOyBpKyspCi0gICAgbmV3X2NodW5rLT5jb250ZW50c1tpXSA9IGgtPm9iamVjdF9iYXNlW2ldOwotCi0gIC8qIElmIHRoZSBvYmplY3QganVzdCBjb3BpZWQgd2FzIHRoZSBvbmx5IGRhdGEgaW4gT0xEX0NIVU5LLAotICAgICBmcmVlIHRoYXQgY2h1bmsgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBjaGFpbi4KLSAgICAgQnV0IG5vdCBpZiB0aGF0IGNodW5rIG1pZ2h0IGNvbnRhaW4gYW4gZW1wdHkgb2JqZWN0LiAgKi8KLSAgaWYgKGgtPm9iamVjdF9iYXNlID09IG9sZF9jaHVuay0+Y29udGVudHMgJiYgISBoLT5tYXliZV9lbXB0eV9vYmplY3QpCi0gICAgewotICAgICAgbmV3X2NodW5rLT5wcmV2ID0gb2xkX2NodW5rLT5wcmV2OwotICAgICAgQ0FMTF9GUkVFRlVOIChoLCBvbGRfY2h1bmspOwotICAgIH0KLQotICBoLT5vYmplY3RfYmFzZSA9IG5ld19jaHVuay0+Y29udGVudHM7Ci0gIGgtPm5leHRfZnJlZSA9IGgtPm9iamVjdF9iYXNlICsgb2JqX3NpemU7Ci0gIC8qIFRoZSBuZXcgY2h1bmsgY2VydGFpbmx5IGNvbnRhaW5zIG5vIGVtcHR5IG9iamVjdCB5ZXQuICAqLwotICBoLT5tYXliZV9lbXB0eV9vYmplY3QgPSAwOwotfQotCi0vKiBSZXR1cm4gbm9uemVybyBpZiBvYmplY3QgT0JKIGhhcyBiZWVuIGFsbG9jYXRlZCBmcm9tIG9ic3RhY2sgSC4KLSAgIFRoaXMgaXMgaGVyZSBmb3IgZGVidWdnaW5nLgotICAgSWYgeW91IHVzZSBpdCBpbiBhIHByb2dyYW0sIHlvdSBhcmUgcHJvYmFibHkgbG9zaW5nLiAgKi8KLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotLyogU3VwcHJlc3MgLVdtaXNzaW5nLXByb3RvdHlwZXMgd2FybmluZy4gIFdlIGRvbid0IHdhbnQgdG8gZGVjbGFyZSB0aGlzIGluCi0gICBvYnN0YWNrLmggYmVjYXVzZSBpdCBpcyBqdXN0IGZvciBkZWJ1Z2dpbmcuICAqLwotaW50IF9vYnN0YWNrX2FsbG9jYXRlZF9wIChzdHJ1Y3Qgb2JzdGFjayAqaCwgUE9JTlRFUiBvYmopOwotI2VuZGlmCi0KLWludAotX29ic3RhY2tfYWxsb2NhdGVkX3AgKGgsIG9iaikKLSAgICAgc3RydWN0IG9ic3RhY2sgKmg7Ci0gICAgIFBPSU5URVIgb2JqOwotewotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmxwOwkvKiBiZWxvdyBhZGRyIG9mIGFueSBvYmplY3RzIGluIHRoaXMgY2h1bmsgKi8KLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpwbHA7CS8qIHBvaW50IHRvIHByZXZpb3VzIGNodW5rIGlmIGFueSAqLwotCi0gIGxwID0gKGgpLT5jaHVuazsKLSAgLyogV2UgdXNlID49IHJhdGhlciB0aGFuID4gc2luY2UgdGhlIG9iamVjdCBjYW5ub3QgYmUgZXhhY3RseSBhdAotICAgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjaHVuayBidXQgbWlnaHQgYmUgYW4gZW1wdHkgb2JqZWN0IGV4YWN0bHkKLSAgICAgYXQgdGhlIGVuZCBvZiBhbiBhZGphY2VudCBjaHVuay4gICovCi0gIHdoaWxlIChscCAhPSAwICYmICgoUE9JTlRFUikgbHAgPj0gb2JqIHx8IChQT0lOVEVSKSAobHApLT5saW1pdCA8IG9iaikpCi0gICAgewotICAgICAgcGxwID0gbHAtPnByZXY7Ci0gICAgICBscCA9IHBscDsKLSAgICB9Ci0gIHJldHVybiBscCAhPSAwOwotfQotDAotLyogRnJlZSBvYmplY3RzIGluIG9ic3RhY2sgSCwgaW5jbHVkaW5nIE9CSiBhbmQgZXZlcnl0aGluZyBhbGxvY2F0ZQotICAgbW9yZSByZWNlbnRseSB0aGFuIE9CSi4gIElmIE9CSiBpcyB6ZXJvLCBmcmVlIGV2ZXJ5dGhpbmcgaW4gSC4gICovCi0KLSN1bmRlZiBvYnN0YWNrX2ZyZWUKLQotLyogVGhpcyBmdW5jdGlvbiBoYXMgdHdvIG5hbWVzIHdpdGggaWRlbnRpY2FsIGRlZmluaXRpb25zLgotICAgVGhpcyBpcyB0aGUgZmlyc3Qgb25lLCBjYWxsZWQgZnJvbSBub24tQU5TSSBjb2RlLiAgKi8KLQotdm9pZAotX29ic3RhY2tfZnJlZSAoaCwgb2JqKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLSAgICAgUE9JTlRFUiBvYmo7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqbHA7CS8qIGJlbG93IGFkZHIgb2YgYW55IG9iamVjdHMgaW4gdGhpcyBjaHVuayAqLwotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKnBscDsJLyogcG9pbnQgdG8gcHJldmlvdXMgY2h1bmsgaWYgYW55ICovCi0KLSAgbHAgPSBoLT5jaHVuazsKLSAgLyogV2UgdXNlID49IGJlY2F1c2UgdGhlcmUgY2Fubm90IGJlIGFuIG9iamVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgY2h1bmsuCi0gICAgIEJ1dCB0aGVyZSBjYW4gYmUgYW4gZW1wdHkgb2JqZWN0IGF0IHRoYXQgYWRkcmVzcwotICAgICBhdCB0aGUgZW5kIG9mIGFub3RoZXIgY2h1bmsuICAqLwotICB3aGlsZSAobHAgIT0gMCAmJiAoKFBPSU5URVIpIGxwID49IG9iaiB8fCAoUE9JTlRFUikgKGxwKS0+bGltaXQgPCBvYmopKQotICAgIHsKLSAgICAgIHBscCA9IGxwLT5wcmV2OwotICAgICAgQ0FMTF9GUkVFRlVOIChoLCBscCk7Ci0gICAgICBscCA9IHBscDsKLSAgICAgIC8qIElmIHdlIHN3aXRjaCBjaHVua3MsIHdlIGNhbid0IHRlbGwgd2hldGhlciB0aGUgbmV3IGN1cnJlbnQKLQkgY2h1bmsgY29udGFpbnMgYW4gZW1wdHkgb2JqZWN0LCBzbyBhc3N1bWUgdGhhdCBpdCBtYXkuICAqLwotICAgICAgaC0+bWF5YmVfZW1wdHlfb2JqZWN0ID0gMTsKLSAgICB9Ci0gIGlmIChscCkKLSAgICB7Ci0gICAgICBoLT5vYmplY3RfYmFzZSA9IGgtPm5leHRfZnJlZSA9IChjaGFyICopIChvYmopOwotICAgICAgaC0+Y2h1bmtfbGltaXQgPSBscC0+bGltaXQ7Ci0gICAgICBoLT5jaHVuayA9IGxwOwotICAgIH0KLSAgZWxzZSBpZiAob2JqICE9IDApCi0gICAgLyogb2JqIGlzIG5vdCBpbiBhbnkgb2YgdGhlIGNodW5rcyEgKi8KLSAgICBhYm9ydCAoKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZyb20gQU5TSSBjb2RlLiAgKi8KLQotdm9pZAotb2JzdGFja19mcmVlIChoLCBvYmopCi0gICAgIHN0cnVjdCBvYnN0YWNrICpoOwotICAgICBQT0lOVEVSIG9iajsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpscDsJLyogYmVsb3cgYWRkciBvZiBhbnkgb2JqZWN0cyBpbiB0aGlzIGNodW5rICovCi0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqcGxwOwkvKiBwb2ludCB0byBwcmV2aW91cyBjaHVuayBpZiBhbnkgKi8KLQotICBscCA9IGgtPmNodW5rOwotICAvKiBXZSB1c2UgPj0gYmVjYXVzZSB0aGVyZSBjYW5ub3QgYmUgYW4gb2JqZWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjaHVuay4KLSAgICAgQnV0IHRoZXJlIGNhbiBiZSBhbiBlbXB0eSBvYmplY3QgYXQgdGhhdCBhZGRyZXNzCi0gICAgIGF0IHRoZSBlbmQgb2YgYW5vdGhlciBjaHVuay4gICovCi0gIHdoaWxlIChscCAhPSAwICYmICgoUE9JTlRFUikgbHAgPj0gb2JqIHx8IChQT0lOVEVSKSAobHApLT5saW1pdCA8IG9iaikpCi0gICAgewotICAgICAgcGxwID0gbHAtPnByZXY7Ci0gICAgICBDQUxMX0ZSRUVGVU4gKGgsIGxwKTsKLSAgICAgIGxwID0gcGxwOwotICAgICAgLyogSWYgd2Ugc3dpdGNoIGNodW5rcywgd2UgY2FuJ3QgdGVsbCB3aGV0aGVyIHRoZSBuZXcgY3VycmVudAotCSBjaHVuayBjb250YWlucyBhbiBlbXB0eSBvYmplY3QsIHNvIGFzc3VtZSB0aGF0IGl0IG1heS4gICovCi0gICAgICBoLT5tYXliZV9lbXB0eV9vYmplY3QgPSAxOwotICAgIH0KLSAgaWYgKGxwKQotICAgIHsKLSAgICAgIGgtPm9iamVjdF9iYXNlID0gaC0+bmV4dF9mcmVlID0gKGNoYXIgKikgKG9iaik7Ci0gICAgICBoLT5jaHVua19saW1pdCA9IGxwLT5saW1pdDsKLSAgICAgIGgtPmNodW5rID0gbHA7Ci0gICAgfQotICBlbHNlIGlmIChvYmogIT0gMCkKLSAgICAvKiBvYmogaXMgbm90IGluIGFueSBvZiB0aGUgY2h1bmtzISAqLwotICAgIGFib3J0ICgpOwotfQotDAotaW50Ci1fb2JzdGFja19tZW1vcnlfdXNlZCAoaCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKmg7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayogbHA7Ci0gIHJlZ2lzdGVyIGludCBuYnl0ZXMgPSAwOwotCi0gIGZvciAobHAgPSBoLT5jaHVuazsgbHAgIT0gMDsgbHAgPSBscC0+cHJldikKLSAgICB7Ci0gICAgICBuYnl0ZXMgKz0gbHAtPmxpbWl0IC0gKGNoYXIgKikgbHA7Ci0gICAgfQotICByZXR1cm4gbmJ5dGVzOwotfQotDAotLyogRGVmaW5lIHRoZSBlcnJvciBoYW5kbGVyLiAgKi8KLSNpZm5kZWYgXwotIyBpZmRlZiBIQVZFX0xJQklOVExfSAotIyAgaW5jbHVkZSA8bGliaW50bC5oPgotIyAgaWZuZGVmIF8KLSMgICBkZWZpbmUgXyhTdHIpIGdldHRleHQgKFN0cikKLSMgIGVuZGlmCi0jIGVsc2UKLSMgIGRlZmluZSBfKFN0cikgKFN0cikKLSMgZW5kaWYKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotcHJpbnRfYW5kX2Fib3J0ICgpCi17Ci0gIGZwdXRzIChfKCJtZW1vcnkgZXhoYXVzdGVkXG4iKSwgc3RkZXJyKTsKLSAgZXhpdCAob2JzdGFja19leGl0X2ZhaWx1cmUpOwotfQotDAotI2lmIDAKLS8qIFRoZXNlIGFyZSBub3cgdHVybmVkIG9mZiBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbnMgZG8gbm90IHVzZSBpdAotICAgYW5kIGl0IHVzZXMgYmNvcHkgdmlhIG9ic3RhY2tfZ3Jvdywgd2hpY2ggY2F1c2VzIHRyb3VibGUgb24gc3lzVi4gICovCi0KLS8qIE5vdyBkZWZpbmUgdGhlIGZ1bmN0aW9uYWwgdmVyc2lvbnMgb2YgdGhlIG9ic3RhY2sgbWFjcm9zLgotICAgRGVmaW5lIHRoZW0gdG8gc2ltcGx5IHVzZSB0aGUgY29ycmVzcG9uZGluZyBtYWNyb3MgdG8gZG8gdGhlIGpvYi4gICovCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLS8qIFRoZXNlIGZ1bmN0aW9uIGRlZmluaXRpb25zIGRvIG5vdCB3b3JrIHdpdGggbm9uLUFOU0kgcHJlcHJvY2Vzc29yczsKLSAgIHRoZXkgd29uJ3QgcGFzcyB0aHJvdWdoIHRoZSBtYWNybyBuYW1lcyBpbiBwYXJlbnRoZXNlcy4gICovCi0KLS8qIFRoZSBmdW5jdGlvbiBuYW1lcyBhcHBlYXIgaW4gcGFyZW50aGVzZXMgaW4gb3JkZXIgdG8gcHJldmVudAotICAgdGhlIG1hY3JvLWRlZmluaXRpb25zIG9mIHRoZSBuYW1lcyBmcm9tIGJlaW5nIGV4cGFuZGVkIHRoZXJlLiAgKi8KLQotUE9JTlRFUiAob2JzdGFja19iYXNlKSAob2JzdGFjaykKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci17Ci0gIHJldHVybiBvYnN0YWNrX2Jhc2UgKG9ic3RhY2spOwotfQotCi1QT0lOVEVSIChvYnN0YWNrX25leHRfZnJlZSkgKG9ic3RhY2spCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotewotICByZXR1cm4gb2JzdGFja19uZXh0X2ZyZWUgKG9ic3RhY2spOwotfQotCi1pbnQgKG9ic3RhY2tfb2JqZWN0X3NpemUpIChvYnN0YWNrKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfb2JqZWN0X3NpemUgKG9ic3RhY2spOwotfQotCi1pbnQgKG9ic3RhY2tfcm9vbSkgKG9ic3RhY2spCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotewotICByZXR1cm4gb2JzdGFja19yb29tIChvYnN0YWNrKTsKLX0KLQotaW50IChvYnN0YWNrX21ha2Vfcm9vbSkgKG9ic3RhY2ssIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHJldHVybiBvYnN0YWNrX21ha2Vfcm9vbSAob2JzdGFjaywgbGVuZ3RoKTsKLX0KLQotdm9pZCAob2JzdGFja19ncm93KSAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgUE9JTlRFUiBwb2ludGVyOwotICAgICBpbnQgbGVuZ3RoOwotewotICBvYnN0YWNrX2dyb3cgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgKG9ic3RhY2tfZ3JvdzApIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBQT0lOVEVSIHBvaW50ZXI7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIG9ic3RhY2tfZ3JvdzAgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgKG9ic3RhY2tfMWdyb3cpIChvYnN0YWNrLCBjaGFyYWN0ZXIpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBpbnQgY2hhcmFjdGVyOwotewotICBvYnN0YWNrXzFncm93IChvYnN0YWNrLCBjaGFyYWN0ZXIpOwotfQotCi12b2lkIChvYnN0YWNrX2JsYW5rKSAob2JzdGFjaywgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgb2JzdGFja19ibGFuayAob2JzdGFjaywgbGVuZ3RoKTsKLX0KLQotdm9pZCAob2JzdGFja18xZ3Jvd19mYXN0KSAob2JzdGFjaywgY2hhcmFjdGVyKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgaW50IGNoYXJhY3RlcjsKLXsKLSAgb2JzdGFja18xZ3Jvd19mYXN0IChvYnN0YWNrLCBjaGFyYWN0ZXIpOwotfQotCi12b2lkIChvYnN0YWNrX2JsYW5rX2Zhc3QpIChvYnN0YWNrLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBpbnQgbGVuZ3RoOwotewotICBvYnN0YWNrX2JsYW5rX2Zhc3QgKG9ic3RhY2ssIGxlbmd0aCk7Ci19Ci0KLVBPSU5URVIgKG9ic3RhY2tfZmluaXNoKSAob2JzdGFjaykKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci17Ci0gIHJldHVybiBvYnN0YWNrX2ZpbmlzaCAob2JzdGFjayk7Ci19Ci0KLVBPSU5URVIgKG9ic3RhY2tfYWxsb2MpIChvYnN0YWNrLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBpbnQgbGVuZ3RoOwotewotICByZXR1cm4gb2JzdGFja19hbGxvYyAob2JzdGFjaywgbGVuZ3RoKTsKLX0KLQotUE9JTlRFUiAob2JzdGFja19jb3B5KSAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgUE9JTlRFUiBwb2ludGVyOwotICAgICBpbnQgbGVuZ3RoOwotewotICByZXR1cm4gb2JzdGFja19jb3B5IChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpOwotfQotCi1QT0lOVEVSIChvYnN0YWNrX2NvcHkwKSAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgUE9JTlRFUiBwb2ludGVyOwotICAgICBpbnQgbGVuZ3RoOwotewotICByZXR1cm4gb2JzdGFja19jb3B5MCAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKTsKLX0KLQotI2VuZGlmIC8qIF9fU1REQ19fICovCi0KLSNlbmRpZiAvKiAwICovCi0KLSNlbmRpZgkvKiAhRUxJREVfQ09ERSAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3BleGVjdXRlLmMgYi9saWJpYmVydHkvcGV4ZWN1dGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRhOTdkZS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvcGV4ZWN1dGUuYworKysgL2Rldi9udWxsCkBAIC0xLDczOCArMCwwIEBACi0vKiBVdGlsaXRpZXMgdG8gZXhlY3V0ZSBhIHByb2dyYW0gaW4gYSBzdWJwcm9jZXNzIChwb3NzaWJseSBsaW5rZWQgYnkgcGlwZXMKLSAgIHdpdGggb3RoZXIgc3VicHJvY2Vzc2VzKSwgYW5kIHdhaXQgZm9yIGl0LgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLXdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGV4cG9ydHMgdHdvIGZ1bmN0aW9uczogcGV4ZWN1dGUgYW5kIHB3YWl0LiAgKi8KLQotLyogVGhpcyBmaWxlIGxpdmVzIGluIGF0IGxlYXN0IHR3byBwbGFjZXM6IGxpYmliZXJ0eSBhbmQgZ2NjLgotICAgRG9uJ3QgY2hhbmdlIG9uZSB3aXRob3V0IHRoZSBvdGhlci4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNkZWZpbmUgSVNTUEFDRSAoeCkgaXNzcGFjZSh4KQotI2lmZGVmIEhBVkVfU1lTX1dBSVRfSAotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jZW5kaWYKLQotI2lmZGVmIHZmb3JrIC8qIEF1dG9jb25mIG1heSBkZWZpbmUgdGhpcyB0byBmb3JrIGZvciB1cy4gKi8KLSMgZGVmaW5lIFZGT1JLX1NUUklORyAiZm9yayIKLSNlbHNlCi0jIGRlZmluZSBWRk9SS19TVFJJTkcgInZmb3JrIgotI2VuZGlmCi0jaWZkZWYgSEFWRV9WRk9SS19ICi0jaW5jbHVkZSA8dmZvcmsuaD4KLSNlbmRpZgotI2lmZGVmIFZNUwotI2RlZmluZSB2Zm9yaygpIChkZWNjJCRhbGxvY192Zm9ya19ibG9ja3MoKSA+PSAwID8gXAotICAgICAgICAgICAgICAgbGliJGdldF9jdXJyZW50X2ludm9fY29udGV4dChkZWNjJCRnZXRfdmZvcmtfam1wYnVmKCkpIDogLTEpCi0jZW5kaWYgLyogVk1TICovCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2lmICFkZWZpbmVkIChfX0NZR1dJTl9fKSAmJiBkZWZpbmVkIChfX0NZR1dJTjMyX18pCi0jZGVmaW5lIF9fQ1lHV0lOX18gMQotI2VuZGlmCi0KLS8qIHN0ZGluIGZpbGUgbnVtYmVyLiAgKi8KLSNkZWZpbmUgU1RESU5fRklMRV9OTyAwCi0KLS8qIHN0ZG91dCBmaWxlIG51bWJlci4gICovCi0jZGVmaW5lIFNURE9VVF9GSUxFX05PIDEKLQotLyogdmFsdWUgb2YgYHBpcGUnOiBwb3J0IGluZGV4IGZvciByZWFkaW5nLiAgKi8KLSNkZWZpbmUgUkVBRF9QT1JUIDAKLQotLyogdmFsdWUgb2YgYHBpcGUnOiBwb3J0IGluZGV4IGZvciB3cml0aW5nLiAgKi8KLSNkZWZpbmUgV1JJVEVfUE9SVCAxCi0KLXN0YXRpYyBjaGFyICppbnN0YWxsX2Vycm9yX21zZyA9ICJpbnN0YWxsYXRpb24gcHJvYmxlbSwgY2Fubm90IGV4ZWMgYCVzJyI7Ci0KLS8qIHBleGVjdXRlOiBleGVjdXRlIGEgcHJvZ3JhbS4KLQotICAgUFJPR1JBTSBhbmQgQVJHViBhcmUgdGhlIGFyZ3VtZW50cyB0byBleGVjdi9leGVjdnAuCi0KLSAgIFRISVNfUE5BTUUgaXMgbmFtZSBvZiB0aGUgY2FsbGluZyBwcm9ncmFtIChpLmUuIGFyZ3ZbMF0pLgotCi0gICBURU1QX0JBU0UgaXMgdGhlIHBhdGggbmFtZSwgc2FucyBzdWZmaXgsIG9mIGEgdGVtcG9yYXJ5IGZpbGUgdG8gdXNlCi0gICBpZiBuZWVkZWQuICBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IG5lZWRlZCBmb3IgTVNET1MgcG9ydHMgdGhhdCBkb24ndCB1c2UKLSAgIEdPMzIgKGRvIGFueSBzdGlsbCBleGlzdD8pLiAgUG9ydHMgdGhhdCBkb24ndCBuZWVkIGl0IGNhbiBwYXNzIE5VTEwuCi0KLSAgIChGTEFHUyAmIFBFWEVDVVRFX1NFQVJDSCkgaXMgbm9uLXplcm8gaWYgJFBBVEggc2hvdWxkIGJlIHNlYXJjaGVkCi0gICAoPz8/IEl0J3Mgbm90IGNsZWFyIHRoYXQgR0NDIHBhc3NlcyB0aGlzIGZsYWcgY29ycmVjdGx5KS4KLSAgIChGTEFHUyAmIFBFWEVDVVRFX0ZJUlNUKSBpcyBub256ZXJvIGZvciB0aGUgZmlyc3QgcHJvY2VzcyBpbiBjaGFpbi4KLSAgIChGTEFHUyAmIFBFWEVDVVRFX0ZJUlNUKSBpcyBub256ZXJvIGZvciB0aGUgbGFzdCBwcm9jZXNzIGluIGNoYWluLgotICAgRklSU1RfTEFTVCBjb3VsZCBiZSBzaW1wbGlmaWVkIHRvIG9ubHkgbWFyayB0aGUgbGFzdCBvZiBhIGNoYWluIG9mIHByb2Nlc3NlcwotICAgYnV0IHRoYXQgcmVxdWlyZXMgdGhlIGNhbGxlciB0byBhbHdheXMgbWFyayB0aGUgbGFzdCBvbmUgKGFuZCBub3QgZ2l2ZSB1cAotICAgZWFybHkgaWYgc29tZSBlcnJvciBvY2N1cnMpLiAgSXQncyBtb3JlIHJvYnVzdCB0byByZXF1aXJlIHRoZSBjYWxsZXIgdG8KLSAgIG1hcmsgYm90aCBlbmRzIG9mIHRoZSBjaGFpbi4KLQotICAgVGhlIHJlc3VsdCBpcyB0aGUgcGlkIG9uIHN5c3RlbXMgbGlrZSBVbml4IHdoZXJlIHdlIGZvcmsvZXhlYyBhbmQgb24gc3lzdGVtcwotICAgbGlrZSBXSU4zMiBhbmQgT1MyIHdoZXJlIHdlIHVzZSBzcGF3bi4gIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gd2FpdCBmb3IKLSAgIHRoZSBjaGlsZC4KLQotICAgVGhlIHJlc3VsdCBpcyB0aGUgV0VYSVRTVEFUVVMgb24gc3lzdGVtcyBsaWtlIE1TRE9TIHdoZXJlIHdlIHNwYXduIGFuZCB3YWl0Ci0gICBmb3IgdGhlIGNoaWxkIGhlcmUuCi0KLSAgIFVwb24gZmFpbHVyZSwgRVJSTVNHX0ZNVCBhbmQgRVJSTVNHX0FSRyBhcmUgc2V0IHRvIHRoZSB0ZXh0IG9mIHRoZSBlcnJvcgotICAgbWVzc2FnZSB3aXRoIGFuIG9wdGlvbmFsIGFyZ3VtZW50IChpZiBub3QgbmVlZGVkLCBFUlJNU0dfQVJHIGlzIHNldCB0bwotICAgTlVMTCksIGFuZCAtMSBpcyByZXR1cm5lZC4gIGBlcnJubycgaXMgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIgdG8gdXNlLgotCi0gICBwd2FpdDogY292ZXIgZnVuY3Rpb24gZm9yIHdhaXQuCi0KLSAgIFBJRCBpcyB0aGUgcHJvY2VzcyBpZCBvZiB0aGUgdGFzayB0byB3YWl0IGZvci4KLSAgIFNUQVRVUyBpcyB0aGUgYHN0YXR1cycgYXJndW1lbnQgdG8gd2FpdC4KLSAgIEZMQUdTIGlzIGN1cnJlbnRseSB1bnVzZWQgKGFsbG93cyBmdXR1cmUgZW5oYW5jZW1lbnQgd2l0aG91dCBicmVha2luZwotICAgdXB3YXJkIGNvbXBhdGliaWxpdHkpLiAgUGFzcyAwIGZvciBub3cuCi0KLSAgIFRoZSByZXN1bHQgaXMgdGhlIHBpZCBvZiB0aGUgY2hpbGQgcmVhcGVkLAotICAgb3IgLTEgZm9yIGZhaWx1cmUgKGVycm5vIHNheXMgd2h5KS4KLQotICAgT24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgd2FpdGluZyBmb3IgYSBwYXJ0aWN1bGFyIGNoaWxkLCBQSUQgaXMKLSAgIGlnbm9yZWQuICBPbiBzeXN0ZW1zIGxpa2UgTVNET1MgdGhhdCBkb24ndCByZWFsbHkgbXVsdGl0YXNrIHB3YWl0Ci0gICBpcyBqdXN0IGEgbWVjaGFuaXNtIHRvIHByb3ZpZGUgYSBjb25zaXN0ZW50IGludGVyZmFjZSBmb3IgdGhlIGNhbGxlci4KLQotICAgcGZpbmlzaDogZmluaXNoIGdlbmVyYXRpb24gb2Ygc2NyaXB0Ci0KLSAgIHBmaW5pc2ggaXMgbmVjZXNzYXJ5IGZvciBzeXN0ZW1zIGxpa2UgTVBXIHdoZXJlIGEgc2NyaXB0IGlzIGdlbmVyYXRlZCB0aGF0Ci0gICBydW5zIHRoZSByZXF1ZXN0ZWQgcHJvZ3JhbXMuCi0qLwotCi0jaWZkZWYgX19NU0RPU19fCi0KLS8qIE1TRE9TIGRvZXNuJ3QgbXVsdGl0YXNrLCBidXQgZm9yIHRoZSBzYWtlIG9mIGEgY29uc2lzdGVudCBpbnRlcmZhY2UKLSAgIHRoZSBjb2RlIGJlaGF2ZXMgbGlrZSBpdCBkb2VzLiAgcGV4ZWN1dGUgcnVucyB0aGUgcHJvZ3JhbSwgdHVja3MgdGhlCi0gICBleGl0IGNvZGUgYXdheSwgYW5kIHJldHVybnMgYSAicGlkIi4gIHB3YWl0IG11c3QgYmUgY2FsbGVkIHRvIGZldGNoIHRoZQotICAgZXhpdCBjb2RlLiAgKi8KLQotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLQotLyogRm9yIGNvbW11bmljYXRpbmcgaW5mb3JtYXRpb24gZnJvbSBwZXhlY3V0ZSB0byBwd2FpdC4gICovCi1zdGF0aWMgaW50IGxhc3RfcGlkID0gMDsKLXN0YXRpYyBpbnQgbGFzdF9zdGF0dXMgPSAwOwotc3RhdGljIGludCBsYXN0X3JlYXBlZCA9IDA7Ci0KLWludAotcGV4ZWN1dGUgKHByb2dyYW0sIGFyZ3YsIHRoaXNfcG5hbWUsIHRlbXBfYmFzZSwgZXJybXNnX2ZtdCwgZXJybXNnX2FyZywgZmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKnByb2dyYW07Ci0gICAgIGNoYXIgKiBjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqdGhpc19wbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGVtcF9iYXNlOwotICAgICBjaGFyICoqZXJybXNnX2ZtdCwgKiplcnJtc2dfYXJnOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGludCByYzsKLQotICBsYXN0X3BpZCsrOwotICBpZiAobGFzdF9waWQgPCAwKQotICAgIGxhc3RfcGlkID0gMTsKLQotICBpZiAoKGZsYWdzICYgUEVYRUNVVEVfT05FKSAhPSBQRVhFQ1VURV9PTkUpCi0gICAgYWJvcnQgKCk7Ci0KLSNpZmRlZiBfX0dPMzJfXwotICAvKiA/Pz8gV2hhdCBhcmUgdGhlIHBvc3NpYmxlIHJldHVybiB2YWx1ZXMgZnJvbSBzcGF3bnY/ICAqLwotICByYyA9IChmbGFncyAmIFBFWEVDVVRFX1NFQVJDSCA/IHNwYXdudnAgOiBzcGF3bnYpICgxLCBwcm9ncmFtLCBhcmd2KTsKLSNlbHNlCi0gIGNoYXIgKnNjbWQsICpyZjsKLSAgRklMRSAqYXJnZmlsZTsKLSAgaW50IGksIGVsID0gZmxhZ3MgJiBQRVhFQ1VURV9TRUFSQ0ggPyA0IDogMDsKLQotICBzY21kID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChwcm9ncmFtKSArIHN0cmxlbiAodGVtcF9iYXNlKSArIDYgKyBlbCk7Ci0gIHJmID0gc2NtZCArIHN0cmxlbihwcm9ncmFtKSArIDIgKyBlbDsKLSAgc3ByaW50ZiAoc2NtZCwgIiVzJXMgQCVzLmdwIiwgcHJvZ3JhbSwKLQkgICAoZmxhZ3MgJiBQRVhFQ1VURV9TRUFSQ0ggPyAiLmV4ZSIgOiAiIiksIHRlbXBfYmFzZSk7Ci0gIGFyZ2ZpbGUgPSBmb3BlbiAocmYsICJ3Iik7Ci0gIGlmIChhcmdmaWxlID09IDApCi0gICAgewotICAgICAgaW50IGVycm5vX3NhdmUgPSBlcnJubzsKLSAgICAgIGZyZWUgKHNjbWQpOwotICAgICAgZXJybm8gPSBlcnJub19zYXZlOwotICAgICAgKmVycm1zZ19mbXQgPSAiY2Fubm90IG9wZW4gYCVzLmdwJyI7Ci0gICAgICAqZXJybXNnX2FyZyA9IHRlbXBfYmFzZTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgZm9yIChpPTE7IGFyZ3ZbaV07IGkrKykKLSAgICB7Ci0gICAgICBjaGFyICpjcDsKLSAgICAgIGZvciAoY3AgPSBhcmd2W2ldOyAqY3A7IGNwKyspCi0JewotCSAgaWYgKCpjcCA9PSAnIicgfHwgKmNwID09ICdcJycgfHwgKmNwID09ICdcXCcgfHwgSVNTUEFDRSAoKmNwKSkKLQkgICAgZnB1dGMgKCdcXCcsIGFyZ2ZpbGUpOwotCSAgZnB1dGMgKCpjcCwgYXJnZmlsZSk7Ci0JfQotICAgICAgZnB1dGMgKCdcbicsIGFyZ2ZpbGUpOwotICAgIH0KLSAgZmNsb3NlIChhcmdmaWxlKTsKLQotICByYyA9IHN5c3RlbSAoc2NtZCk7Ci0KLSAgewotICAgIGludCBlcnJub19zYXZlID0gZXJybm87Ci0gICAgcmVtb3ZlIChyZik7Ci0gICAgZnJlZSAoc2NtZCk7Ci0gICAgZXJybm8gPSBlcnJub19zYXZlOwotICB9Ci0jZW5kaWYKLQotICBpZiAocmMgPT0gLTEpCi0gICAgewotICAgICAgKmVycm1zZ19mbXQgPSBpbnN0YWxsX2Vycm9yX21zZzsKLSAgICAgICplcnJtc2dfYXJnID0gcHJvZ3JhbTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogVHVjayB0aGUgc3RhdHVzIGF3YXkgZm9yIHB3YWl0LCBhbmQgcmV0dXJuIGEgInBpZCIuICAqLwotICBsYXN0X3N0YXR1cyA9IHJjIDw8IDg7Ci0gIHJldHVybiBsYXN0X3BpZDsKLX0KLQotaW50Ci1wd2FpdCAocGlkLCBzdGF0dXMsIGZsYWdzKQotICAgICBpbnQgcGlkOwotICAgICBpbnQgKnN0YXR1czsKLSAgICAgaW50IGZsYWdzOwotewotICAvKiBPbiBNU0RPUyBlYWNoIHBleGVjdXRlIG11c3QgYmUgZm9sbG93ZWQgYnkgaXQncyBhc3NvY2lhdGVkIHB3YWl0LiAgKi8KLSAgaWYgKHBpZCAhPSBsYXN0X3BpZAotICAgICAgLyogQ2FsbGVkIHR3aWNlIGZvciB0aGUgc2FtZSBjaGlsZD8gICovCi0gICAgICB8fCBwaWQgPT0gbGFzdF9yZWFwZWQpCi0gICAgewotICAgICAgLyogPz8/IEVDSElMRCB3b3VsZCBiZSBhIGJldHRlciBjaG9pY2UuICBDYW4gd2UgdXNlIGl0IGhlcmU/ICAqLwotICAgICAgZXJybm8gPSBFSU5WQUw7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAvKiA/Pz8gSGVyZSdzIGFuIG9wcG9ydHVuaXR5IHRvIGNhbm9uaWNhbGl6ZSB0aGUgdmFsdWVzIGluIFNUQVRVUy4KLSAgICAgTmVlZGVkPyAgKi8KLSAgKnN0YXR1cyA9IGxhc3Rfc3RhdHVzOwotICBsYXN0X3JlYXBlZCA9IGxhc3RfcGlkOwotICByZXR1cm4gbGFzdF9waWQ7Ci19Ci0KLSNlbmRpZiAvKiBNU0RPUyAqLwotCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fVVdJTl9fKQotCi0jaW5jbHVkZSA8cHJvY2Vzcy5oPgotCi0jaWZkZWYgX19DWUdXSU5fXwotCi0jZGVmaW5lIGZpeF9hcmd2KGFyZ3ZlYykgKGFyZ3ZlYykKLQotZXh0ZXJuIGludCBfc3Bhd252ICgpOwotZXh0ZXJuIGludCBfc3Bhd252cCAoKTsKLQotI2Vsc2UgLyogISBfX0NZR1dJTl9fICovCi0KLS8qIFRoaXMgaXMgYSBrbHVkZ2UgdG8gZ2V0IGFyb3VuZCB0aGUgTWljcm9zb2Z0IEMgc3Bhd24gZnVuY3Rpb25zJyBwcm9wZW5zaXR5Ci0gICB0byByZW1vdmUgdGhlIG91dGVybW9zdCBzZXQgb2YgZG91YmxlIHF1b3RlcyBmcm9tIGFsbCBhcmd1bWVudHMuICAqLwotCi1jb25zdCBjaGFyICogY29uc3QgKgotZml4X2FyZ3YgKGFyZ3ZlYykKLSAgICAgY2hhciAqKmFyZ3ZlYzsKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMTsgYXJndmVjW2ldICE9IDA7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgbGVuLCBqOwotICAgICAgY2hhciAqdGVtcCwgKm5ld3RlbXA7Ci0KLSAgICAgIHRlbXAgPSBhcmd2ZWNbaV07Ci0gICAgICBsZW4gPSBzdHJsZW4gKHRlbXApOwotICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHRlbXBbal0gPT0gJyInKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBuZXd0ZW1wID0geG1hbGxvYyAobGVuICsgMik7Ci0gICAgICAgICAgICAgIHN0cm5jcHkgKG5ld3RlbXAsIHRlbXAsIGopOwotICAgICAgICAgICAgICBuZXd0ZW1wIFtqXSA9ICdcXCc7Ci0gICAgICAgICAgICAgIHN0cm5jcHkgKCZuZXd0ZW1wIFtqKzFdLCAmdGVtcCBbal0sIGxlbi1qKTsKLSAgICAgICAgICAgICAgbmV3dGVtcCBbbGVuKzFdID0gMDsKLSAgICAgICAgICAgICAgdGVtcCA9IG5ld3RlbXA7Ci0gICAgICAgICAgICAgIGxlbisrOwotICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhcmd2ZWNbaV0gPSB0ZW1wOwotICAgICAgfQotCi0gIHJldHVybiAoY29uc3QgY2hhciAqIGNvbnN0ICopIGFyZ3ZlYzsKLX0KLSNlbmRpZiAvKiBfX0NZR1dJTl9fICovCi0KLSNpbmNsdWRlIDxpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLS8qIG1pbmd3MzIgaGVhZGVycyBtYXkgbm90IGRlZmluZSB0aGUgZm9sbG93aW5nLiAgKi8KLQotI2lmbmRlZiBfUF9XQUlUCi0jICBkZWZpbmUgX1BfV0FJVAkwCi0jICBkZWZpbmUgX1BfTk9XQUlUCTEKLSMgIGRlZmluZSBfUF9PVkVSTEFZCTIKLSMgIGRlZmluZSBfUF9OT1dBSVRPCTMKLSMgIGRlZmluZSBfUF9ERVRBQ0gJNAotCi0jICBkZWZpbmUgV0FJVF9DSElMRAkwCi0jICBkZWZpbmUgV0FJVF9HUkFORENISUxECTEKLSNlbmRpZgotCi0vKiBXaW4zMiBzdXBwb3J0cyBwaXBlcyAqLwotaW50Ci1wZXhlY3V0ZSAocHJvZ3JhbSwgYXJndiwgdGhpc19wbmFtZSwgdGVtcF9iYXNlLCBlcnJtc2dfZm10LCBlcnJtc2dfYXJnLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqcHJvZ3JhbTsKLSAgICAgY2hhciAqIGNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICp0aGlzX3BuYW1lOwotICAgICBjb25zdCBjaGFyICp0ZW1wX2Jhc2U7Ci0gICAgIGNoYXIgKiplcnJtc2dfZm10LCAqKmVycm1zZ19hcmc7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgaW50IHBpZDsKLSAgaW50IHBkZXNbMl0sIG9yZ19zdGRpbiwgb3JnX3N0ZG91dDsKLSAgaW50IGlucHV0X2Rlc2MsIG91dHB1dF9kZXNjOwotICBpbnQgcmV0cmllcywgc2xlZXBfaW50ZXJ2YWw7Ci0KLSAgLyogUGlwZSB3YWl0aW5nIGZyb20gbGFzdCBwcm9jZXNzLCB0byBiZSB1c2VkIGFzIGlucHV0IGZvciB0aGUgbmV4dCBvbmUuCi0gICAgIFZhbHVlIGlzIFNURElOX0ZJTEVfTk8gaWYgbm8gcGlwZSBpcyB3YWl0aW5nCi0gICAgIChpLmUuIHRoZSBuZXh0IGNvbW1hbmQgaXMgdGhlIGZpcnN0IG9mIGEgZ3JvdXApLiAgKi8KLSAgc3RhdGljIGludCBsYXN0X3BpcGVfaW5wdXQ7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgcHJvY2VzcywgaW5pdGlhbGl6ZS4gICovCi0gIGlmIChmbGFncyAmIFBFWEVDVVRFX0ZJUlNUKQotICAgIGxhc3RfcGlwZV9pbnB1dCA9IFNURElOX0ZJTEVfTk87Ci0KLSAgaW5wdXRfZGVzYyA9IGxhc3RfcGlwZV9pbnB1dDsKLQotICAvKiBJZiB0aGlzIGlzbid0IHRoZSBsYXN0IHByb2Nlc3MsIG1ha2UgYSBwaXBlIGZvciBpdHMgb3V0cHV0LAotICAgICBhbmQgcmVjb3JkIGl0IGFzIHdhaXRpbmcgdG8gYmUgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHByb2Nlc3MuICAqLwotICBpZiAoISAoZmxhZ3MgJiBQRVhFQ1VURV9MQVNUKSkKLSAgICB7Ci0gICAgICBpZiAoX3BpcGUgKHBkZXMsIDI1NiwgT19CSU5BUlkpIDwgMCkKLQl7Ci0JICAqZXJybXNnX2ZtdCA9ICJwaXBlIjsKLQkgICplcnJtc2dfYXJnID0gTlVMTDsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBvdXRwdXRfZGVzYyA9IHBkZXNbV1JJVEVfUE9SVF07Ci0gICAgICBsYXN0X3BpcGVfaW5wdXQgPSBwZGVzW1JFQURfUE9SVF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTGFzdCBwcm9jZXNzLiAgKi8KLSAgICAgIG91dHB1dF9kZXNjID0gU1RET1VUX0ZJTEVfTk87Ci0gICAgICBsYXN0X3BpcGVfaW5wdXQgPSBTVERJTl9GSUxFX05POwotICAgIH0KLQotICBpZiAoaW5wdXRfZGVzYyAhPSBTVERJTl9GSUxFX05PKQotICAgIHsKLSAgICAgIG9yZ19zdGRpbiA9IGR1cCAoU1RESU5fRklMRV9OTyk7Ci0gICAgICBkdXAyIChpbnB1dF9kZXNjLCBTVERJTl9GSUxFX05PKTsKLSAgICAgIGNsb3NlIChpbnB1dF9kZXNjKTsgCi0gICAgfQotCi0gIGlmIChvdXRwdXRfZGVzYyAhPSBTVERPVVRfRklMRV9OTykKLSAgICB7Ci0gICAgICBvcmdfc3Rkb3V0ID0gZHVwIChTVERPVVRfRklMRV9OTyk7Ci0gICAgICBkdXAyIChvdXRwdXRfZGVzYywgU1RET1VUX0ZJTEVfTk8pOwotICAgICAgY2xvc2UgKG91dHB1dF9kZXNjKTsKLSAgICB9Ci0KLSAgcGlkID0gKGZsYWdzICYgUEVYRUNVVEVfU0VBUkNIID8gX3NwYXdudnAgOiBfc3Bhd252KQotICAgIChfUF9OT1dBSVQsIHByb2dyYW0sIGZpeF9hcmd2KGFyZ3YpKTsKLQotICBpZiAoaW5wdXRfZGVzYyAhPSBTVERJTl9GSUxFX05PKQotICAgIHsKLSAgICAgIGR1cDIgKG9yZ19zdGRpbiwgU1RESU5fRklMRV9OTyk7Ci0gICAgICBjbG9zZSAob3JnX3N0ZGluKTsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9kZXNjICE9IFNURE9VVF9GSUxFX05PKQotICAgIHsKLSAgICAgIGR1cDIgKG9yZ19zdGRvdXQsIFNURE9VVF9GSUxFX05PKTsKLSAgICAgIGNsb3NlIChvcmdfc3Rkb3V0KTsKLSAgICB9Ci0KLSAgaWYgKHBpZCA9PSAtMSkKLSAgICB7Ci0gICAgICAqZXJybXNnX2ZtdCA9IGluc3RhbGxfZXJyb3JfbXNnOwotICAgICAgKmVycm1zZ19hcmcgPSBwcm9ncmFtOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gcGlkOwotfQotCi0vKiBNUyBDUlRETEwgZG9lc24ndCByZXR1cm4gZW5vdWdoIGluZm9ybWF0aW9uIGluIHN0YXR1cyB0byBkZWNpZGUgaWYgdGhlCi0gICBjaGlsZCBleGl0ZWQgZHVlIHRvIGEgc2lnbmFsIG9yIG5vdCwgcmF0aGVyIGl0IHNpbXBseSByZXR1cm5zIGFuCi0gICBpbnRlZ2VyIHdpdGggdGhlIGV4aXQgY29kZSBvZiB0aGUgY2hpbGQ7IGVnLiwgaWYgdGhlIGNoaWxkIGV4aXRlZCB3aXRoIAotICAgYW4gYWJvcnQoKSBjYWxsIGFuZCBkaWRuJ3QgaGF2ZSBhIGhhbmRsZXIgZm9yIFNJR0FCUlQsIGl0IHNpbXBseSByZXR1cm5zCi0gICB3aXRoIHN0YXR1cyA9IDMuIFdlIGZpeCB0aGUgc3RhdHVzIGNvZGUgdG8gY29uZm9ybSB0byB0aGUgdXN1YWwgV0lGKgotICAgbWFjcm9zLiBOb3RlIHRoYXQgV0lGU0lHTkFMRUQgd2lsbCBuZXZlciBiZSB0cnVlIHVuZGVyIENSVERMTC4gKi8KLQotaW50Ci1wd2FpdCAocGlkLCBzdGF0dXMsIGZsYWdzKQotICAgICBpbnQgcGlkOwotICAgICBpbnQgKnN0YXR1czsKLSAgICAgaW50IGZsYWdzOwotewotI2lmZGVmIF9fQ1lHV0lOX18KLSAgcmV0dXJuIHdhaXQgKHN0YXR1cyk7Ci0jZWxzZQotICBpbnQgdGVybXN0YXQ7Ci0KLSAgcGlkID0gX2N3YWl0ICgmdGVybXN0YXQsIHBpZCwgV0FJVF9DSElMRCk7Ci0KLSAgLyogPz8/IEhlcmUncyBhbiBvcHBvcnR1bml0eSB0byBjYW5vbmljYWxpemUgdGhlIHZhbHVlcyBpbiBTVEFUVVMuCi0gICAgIE5lZWRlZD8gICovCi0KLSAgLyogY3dhaXQgcmV0dXJucyB0aGUgY2hpbGQgcHJvY2VzcyBleGl0IGNvZGUgaW4gdGVybXN0YXQuCi0gICAgIEEgdmFsdWUgb2YgMyBpbmRpY2F0ZXMgdGhhdCB0aGUgY2hpbGQgY2F1Z2h0IGEgc2lnbmFsLCBidXQgbm90Ci0gICAgIHdoaWNoIG9uZS4gIFNpbmNlIG9ubHkgU0lHQUJSVCwgU0lHRlBFIGFuZCBTSUdJTlQgZG8gYW55dGhpbmcsIHdlCi0gICAgIHJlcG9ydCBTSUdBQlJULiAgKi8KLSAgaWYgKHRlcm1zdGF0ID09IDMpCi0gICAgKnN0YXR1cyA9IFNJR0FCUlQ7Ci0gIGVsc2UKLSAgICAqc3RhdHVzID0gKCgodGVybXN0YXQpICYgMHhmZikgPDwgOCk7Ci0KLSAgcmV0dXJuIHBpZDsKLSNlbmRpZiAvKiBfX0NZR1dJTl9fICovCi19Ci0KLSNlbmRpZiAvKiBfV0lOMzIgJiYgISBfX1VXSU5fXyAqLwotCi0jaWZkZWYgT1MyCi0KLS8qID8/PyBEb2VzIE9TMiBoYXZlIHByb2Nlc3MuaD8gICovCi1leHRlcm4gaW50IHNwYXdudiAoKTsKLWV4dGVybiBpbnQgc3Bhd252cCAoKTsKLQotaW50Ci1wZXhlY3V0ZSAocHJvZ3JhbSwgYXJndiwgdGhpc19wbmFtZSwgdGVtcF9iYXNlLCBlcnJtc2dfZm10LCBlcnJtc2dfYXJnLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqcHJvZ3JhbTsKLSAgICAgY2hhciAqIGNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICp0aGlzX3BuYW1lOwotICAgICBjb25zdCBjaGFyICp0ZW1wX2Jhc2U7Ci0gICAgIGNoYXIgKiplcnJtc2dfZm10LCAqKmVycm1zZ19hcmc7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgaW50IHBpZDsKLQotICBpZiAoKGZsYWdzICYgUEVYRUNVVEVfT05FKSAhPSBQRVhFQ1VURV9PTkUpCi0gICAgYWJvcnQgKCk7Ci0gIC8qID8/PyBQcmVzdW1hYmx5IDEgPT0gX1BfTk9XQUlULiAgKi8KLSAgcGlkID0gKGZsYWdzICYgUEVYRUNVVEVfU0VBUkNIID8gc3Bhd252cCA6IHNwYXdudikgKDEsIHByb2dyYW0sIGFyZ3YpOwotICBpZiAocGlkID09IC0xKQotICAgIHsKLSAgICAgICplcnJtc2dfZm10ID0gaW5zdGFsbF9lcnJvcl9tc2c7Ci0gICAgICAqZXJybXNnX2FyZyA9IHByb2dyYW07Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICByZXR1cm4gcGlkOwotfQotCi1pbnQKLXB3YWl0IChwaWQsIHN0YXR1cywgZmxhZ3MpCi0gICAgIGludCBwaWQ7Ci0gICAgIGludCAqc3RhdHVzOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIC8qID8/PyBIZXJlJ3MgYW4gb3Bwb3J0dW5pdHkgdG8gY2Fub25pY2FsaXplIHRoZSB2YWx1ZXMgaW4gU1RBVFVTLgotICAgICBOZWVkZWQ/ICAqLwotICBpbnQgcGlkID0gd2FpdCAoc3RhdHVzKTsKLSAgcmV0dXJuIHBpZDsKLX0KLQotI2VuZGlmIC8qIE9TMiAqLwotCi0jaWZkZWYgTVBXCi0KLS8qIE1QVyBwZXhlY3V0ZSBkb2Vzbid0IGFjdHVhbGx5IHJ1biBhbnl0aGluZzsgaW5zdGVhZCwgaXQgd3JpdGVzIG91dAotICAgc2NyaXB0IGNvbW1hbmRzIHRoYXQsIHdoZW4gcnVuLCB3aWxsIGRvIHRoZSBhY3R1YWwgZXhlY3V0aW5nLgotCi0gICBGb3IgZXhhbXBsZSwgaW4gR0NDJ3MgY2FzZSwgR0NDIHdpbGwgd3JpdGUgb3V0IHNldmVyYWwgc2NyaXB0IGNvbW1hbmRzOgotCi0gICBjcHAgLi4uCi0gICBjYzEgLi4uCi0gICBhcyAuLi4KLSAgIGxkIC4uLgotCi0gICBhbmQgdGhlbiBleGl0LiAgTm9uZSBvZiB0aGUgYWJvdmUgcHJvZ3JhbXMgd2lsbCBoYXZlIHJ1biB5ZXQuICBUaGUgdGFzawotICAgdGhhdCBjYWxsZWQgR0NDIHdpbGwgdGhlbiBleGVjdXRlIHRoZSBzY3JpcHQgYW5kIGNhdXNlIGNwcCxldGMuIHRvIHJ1bi4KLSAgIFRoZSBjYWxsZXIgbXVzdCBpbnZva2UgcGZpbmlzaCBiZWZvcmUgY2FsbGluZyBleGl0LiAgVGhpcyBhZGRzCi0gICB0aGUgZmluaXNoaW5nIHRvdWNoZXMgdG8gdGhlIGdlbmVyYXRlZCBzY3JpcHQuICAqLwotCi1zdGF0aWMgaW50IGZpcnN0X3RpbWUgPSAxOwotCi1pbnQKLXBleGVjdXRlIChwcm9ncmFtLCBhcmd2LCB0aGlzX3BuYW1lLCB0ZW1wX2Jhc2UsIGVycm1zZ19mbXQsIGVycm1zZ19hcmcsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpwcm9ncmFtOwotICAgICBjaGFyICogY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKnRoaXNfcG5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRlbXBfYmFzZTsKLSAgICAgY2hhciAqKmVycm1zZ19mbXQsICoqZXJybXNnX2FyZzsKLSAgICAgaW50IGZsYWdzOwotewotICBjaGFyIHRtcHByb2dyYW1bMjU1XTsKLSAgY2hhciAqY3AsICp0bXBuYW1lOwotICBpbnQgaTsKLQotICBtcHdpZnlfZmlsZW5hbWUgKHByb2dyYW0sIHRtcHByb2dyYW0pOwotICBpZiAoZmlyc3RfdGltZSkKLSAgICB7Ci0gICAgICBwcmludGYgKCJTZXQgRmFpbGVkIDBcbiIpOwotICAgICAgZmlyc3RfdGltZSA9IDA7Ci0gICAgfQotCi0gIGZwdXRzICgiSWYge0ZhaWxlZH0gPT0gMFxuIiwgc3Rkb3V0KTsKLSAgLyogSWYgYmVpbmcgdmVyYm9zZSwgb3V0cHV0IGEgY29weSBvZiB0aGUgY29tbWFuZC4gIEl0IHNob3VsZCBiZQotICAgICBhY2N1cmF0ZSBlbm91Z2ggYW5kIGVzY2FwZWQgZW5vdWdoIHRvIGJlICJjbGlja2FibGUiLiAgKi8KLSAgaWYgKGZsYWdzICYgUEVYRUNVVEVfVkVSQk9TRSkKLSAgICB7Ci0gICAgICBmcHV0cyAoIlx0RWNobyAiLCBzdGRvdXQpOwotICAgICAgZnB1dGMgKCdcJycsIHN0ZG91dCk7Ci0gICAgICBmcHV0cyAodG1wcHJvZ3JhbSwgc3Rkb3V0KTsKLSAgICAgIGZwdXRjICgnXCcnLCBzdGRvdXQpOwotICAgICAgZnB1dGMgKCcgJywgc3Rkb3V0KTsKLSAgICAgIGZvciAoaT0xOyBhcmd2W2ldOyBpKyspCi0JewotCSAgZnB1dGMgKCdcJycsIHN0ZG91dCk7Ci0JICAvKiBTZWUgaWYgd2UgaGF2ZSBhbiBhcmd1bWVudCB0aGF0IG5lZWRzIGZpeGluZy4gICovCi0JICBpZiAoc3RyY2hyKGFyZ3ZbaV0sICcvJykpCi0JICAgIHsKLQkgICAgICB0bXBuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoMjU2KTsKLQkgICAgICBtcHdpZnlfZmlsZW5hbWUgKGFyZ3ZbaV0sIHRtcG5hbWUpOwotCSAgICAgIGFyZ3ZbaV0gPSB0bXBuYW1lOwotCSAgICB9Ci0JICBmb3IgKGNwID0gYXJndltpXTsgKmNwOyBjcCsrKQotCSAgICB7Ci0JICAgICAgLyogV3JpdGUgYW4gT3B0aW9uLWQgZXNjYXBlIGNoYXIgaW4gZnJvbnQgb2Ygc3BlY2lhbCBjaGFycy4gICovCi0JICAgICAgaWYgKHN0cmNocigiJysiLCAqY3ApKQotCQlmcHV0YyAoJ1wyNjYnLCBzdGRvdXQpOwotCSAgICAgIGZwdXRjICgqY3AsIHN0ZG91dCk7Ci0JICAgIH0KLQkgIGZwdXRjICgnXCcnLCBzdGRvdXQpOwotCSAgZnB1dGMgKCcgJywgc3Rkb3V0KTsKLQl9Ci0gICAgICBmcHV0cyAoIlxuIiwgc3Rkb3V0KTsKLSAgICB9Ci0gIGZwdXRzICgiXHQiLCBzdGRvdXQpOwotICBmcHV0cyAodG1wcHJvZ3JhbSwgc3Rkb3V0KTsKLSAgZnB1dGMgKCcgJywgc3Rkb3V0KTsKLQotICBmb3IgKGk9MTsgYXJndltpXTsgaSsrKQotICAgIHsKLSAgICAgIC8qIFNlZSBpZiB3ZSBoYXZlIGFuIGFyZ3VtZW50IHRoYXQgbmVlZHMgZml4aW5nLiAgKi8KLSAgICAgIGlmIChzdHJjaHIoYXJndltpXSwgJy8nKSkKLQl7Ci0JICB0bXBuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoMjU2KTsKLQkgIG1wd2lmeV9maWxlbmFtZSAoYXJndltpXSwgdG1wbmFtZSk7Ci0JICBhcmd2W2ldID0gdG1wbmFtZTsKLQl9Ci0gICAgICBpZiAoc3RyY2hyIChhcmd2W2ldLCAnICcpKQotCWZwdXRjICgnXCcnLCBzdGRvdXQpOwotICAgICAgZm9yIChjcCA9IGFyZ3ZbaV07ICpjcDsgY3ArKykKLQl7Ci0JICAvKiBXcml0ZSBhbiBPcHRpb24tZCBlc2NhcGUgY2hhciBpbiBmcm9udCBvZiBzcGVjaWFsIGNoYXJzLiAgKi8KLQkgIGlmIChzdHJjaHIoIicrIiwgKmNwKSkKLQkgICAgZnB1dGMgKCdcMjY2Jywgc3Rkb3V0KTsKLQkgIGZwdXRjICgqY3AsIHN0ZG91dCk7Ci0JfQotICAgICAgaWYgKHN0cmNociAoYXJndltpXSwgJyAnKSkKLQlmcHV0YyAoJ1wnJywgc3Rkb3V0KTsKLSAgICAgIGZwdXRjICgnICcsIHN0ZG91dCk7Ci0gICAgfQotCi0gIGZwdXRzICgiXG4iLCBzdGRvdXQpOwotCi0gIC8qIE91dHB1dCBjb21tYW5kcyB0aGF0IGFycmFuZ2UgdG8gY2xlYW4gdXAgYW5kIGV4aXQgaWYgYSBmYWlsdXJlIG9jY3Vycy4KLSAgICAgV2UgaGF2ZSB0byBiZSBjYXJlZnVsIHRvIGNvbGxlY3QgdGhlIHN0YXR1cyBmcm9tIHRoZSBwcm9ncmFtIHRoYXQgd2FzCi0gICAgIHJ1biwgcmF0aGVyIHRoYW4gc29tZSBvdGhlciBzY3JpcHQgY29tbWFuZC4gIEFsc28sIHdlIGRvbid0IGV4aXQKLSAgICAgaW1tZWRpYXRlbHksIHNpbmNlIG5lY2Vzc2FyeSBjbGVhbnVwcyBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgc2NyaXB0LiAgKi8KLSAgZnB1dHMgKCJcdFNldCBUbXBTdGF0dXMge1N0YXR1c31cbiIsIHN0ZG91dCk7Ci0gIGZwdXRzICgiXHRJZiB7VG1wU3RhdHVzfSAhPSAwXG4iLCBzdGRvdXQpOwotICBmcHV0cyAoIlx0XHRTZXQgRmFpbGVkIHtUbXBTdGF0dXN9XG4iLCBzdGRvdXQpOwotICBmcHV0cyAoIlx0RW5kXG4iLCBzdGRvdXQpOwotICBmcHV0cyAoIkVuZFxuIiwgc3Rkb3V0KTsKLQotICAvKiBXZSdyZSBqdXN0IGNvbXBvc2luZyBhIHNjcmlwdCwgY2FuJ3QgZmFpbCBoZXJlLiAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotcHdhaXQgKHBpZCwgc3RhdHVzLCBmbGFncykKLSAgICAgaW50IHBpZDsKLSAgICAgaW50ICpzdGF0dXM7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgKnN0YXR1cyA9IDA7Ci0gIHJldHVybiAwOwotfQotCi0vKiBXcml0ZSBvdXQgY29tbWFuZHMgdGhhdCB3aWxsIGV4aXQgd2l0aCB0aGUgY29ycmVjdCBlcnJvciBjb2RlCi0gICBpZiBzb21ldGhpbmcgaW4gdGhlIHNjcmlwdCBmYWlsZWQuICAqLwotCi12b2lkCi1wZmluaXNoICgpCi17Ci0gIHByaW50ZiAoIlx0RXhpdCBcIntGYWlsZWR9XCJcbiIpOwotfQotCi0jZW5kaWYgLyogTVBXICovCi0KLS8qIGluY2x1ZGUgZm9yIFVuaXgtbGlrZSBlbnZpcm9ubWVudHMgYnV0IG5vdCBmb3IgRG9zLWxpa2UgZW52aXJvbm1lbnRzICovCi0jaWYgISBkZWZpbmVkIChfX01TRE9TX18pICYmICEgZGVmaW5lZCAoT1MyKSAmJiAhIGRlZmluZWQgKE1QVykgXAotICAgICYmICEgKGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX1VXSU5fXykpCi0KLWV4dGVybiBpbnQgZXhlY3YgKCk7Ci1leHRlcm4gaW50IGV4ZWN2cCAoKTsKLQotaW50Ci1wZXhlY3V0ZSAocHJvZ3JhbSwgYXJndiwgdGhpc19wbmFtZSwgdGVtcF9iYXNlLCBlcnJtc2dfZm10LCBlcnJtc2dfYXJnLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqcHJvZ3JhbTsKLSAgICAgY2hhciAqIGNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICp0aGlzX3BuYW1lOwotICAgICBjb25zdCBjaGFyICp0ZW1wX2Jhc2U7Ci0gICAgIGNoYXIgKiplcnJtc2dfZm10LCAqKmVycm1zZ19hcmc7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgaW50ICgqZnVuYykoKSA9IChmbGFncyAmIFBFWEVDVVRFX1NFQVJDSCA/IGV4ZWN2cCA6IGV4ZWN2KTsKLSAgaW50IHBpZDsKLSAgaW50IHBkZXNbMl07Ci0gIGludCBpbnB1dF9kZXNjLCBvdXRwdXRfZGVzYzsKLSAgaW50IHJldHJpZXMsIHNsZWVwX2ludGVydmFsOwotICAvKiBQaXBlIHdhaXRpbmcgZnJvbSBsYXN0IHByb2Nlc3MsIHRvIGJlIHVzZWQgYXMgaW5wdXQgZm9yIHRoZSBuZXh0IG9uZS4KLSAgICAgVmFsdWUgaXMgU1RESU5fRklMRV9OTyBpZiBubyBwaXBlIGlzIHdhaXRpbmcKLSAgICAgKGkuZS4gdGhlIG5leHQgY29tbWFuZCBpcyB0aGUgZmlyc3Qgb2YgYSBncm91cCkuICAqLwotICBzdGF0aWMgaW50IGxhc3RfcGlwZV9pbnB1dDsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBwcm9jZXNzLCBpbml0aWFsaXplLiAgKi8KLSAgaWYgKGZsYWdzICYgUEVYRUNVVEVfRklSU1QpCi0gICAgbGFzdF9waXBlX2lucHV0ID0gU1RESU5fRklMRV9OTzsKLQotICBpbnB1dF9kZXNjID0gbGFzdF9waXBlX2lucHV0OwotCi0gIC8qIElmIHRoaXMgaXNuJ3QgdGhlIGxhc3QgcHJvY2VzcywgbWFrZSBhIHBpcGUgZm9yIGl0cyBvdXRwdXQsCi0gICAgIGFuZCByZWNvcmQgaXQgYXMgd2FpdGluZyB0byBiZSB0aGUgaW5wdXQgdG8gdGhlIG5leHQgcHJvY2Vzcy4gICovCi0gIGlmICghIChmbGFncyAmIFBFWEVDVVRFX0xBU1QpKQotICAgIHsKLSAgICAgIGlmIChwaXBlIChwZGVzKSA8IDApCi0JewotCSAgKmVycm1zZ19mbXQgPSAicGlwZSI7Ci0JICAqZXJybXNnX2FyZyA9IE5VTEw7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgb3V0cHV0X2Rlc2MgPSBwZGVzW1dSSVRFX1BPUlRdOwotICAgICAgbGFzdF9waXBlX2lucHV0ID0gcGRlc1tSRUFEX1BPUlRdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIExhc3QgcHJvY2Vzcy4gICovCi0gICAgICBvdXRwdXRfZGVzYyA9IFNURE9VVF9GSUxFX05POwotICAgICAgbGFzdF9waXBlX2lucHV0ID0gU1RESU5fRklMRV9OTzsKLSAgICB9Ci0KLSAgLyogRm9yayBhIHN1YnByb2Nlc3M7IHdhaXQgYW5kIHJldHJ5IGlmIGl0IGZhaWxzLiAgKi8KLSAgc2xlZXBfaW50ZXJ2YWwgPSAxOwotICBmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgNDsgcmV0cmllcysrKQotICAgIHsKLSAgICAgIHBpZCA9IHZmb3JrICgpOwotICAgICAgaWYgKHBpZCA+PSAwKQotCWJyZWFrOwotICAgICAgc2xlZXAgKHNsZWVwX2ludGVydmFsKTsKLSAgICAgIHNsZWVwX2ludGVydmFsICo9IDI7Ci0gICAgfQotCi0gIHN3aXRjaCAocGlkKQotICAgIHsKLSAgICBjYXNlIC0xOgotICAgICAgewotCSplcnJtc2dfZm10ID0gVkZPUktfU1RSSU5HOwotCSplcnJtc2dfYXJnID0gTlVMTDsKLQlyZXR1cm4gLTE7Ci0gICAgICB9Ci0KLSAgICBjYXNlIDA6IC8qIGNoaWxkICovCi0gICAgICAvKiBNb3ZlIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHBpcGVzIGludG8gcGxhY2UsIGlmIG5lY2Vzc2FyeS4gICovCi0gICAgICBpZiAoaW5wdXRfZGVzYyAhPSBTVERJTl9GSUxFX05PKQotCXsKLQkgIGNsb3NlIChTVERJTl9GSUxFX05PKTsKLQkgIGR1cCAoaW5wdXRfZGVzYyk7Ci0JICBjbG9zZSAoaW5wdXRfZGVzYyk7Ci0JfQotICAgICAgaWYgKG91dHB1dF9kZXNjICE9IFNURE9VVF9GSUxFX05PKQotCXsKLQkgIGNsb3NlIChTVERPVVRfRklMRV9OTyk7Ci0JICBkdXAgKG91dHB1dF9kZXNjKTsKLQkgIGNsb3NlIChvdXRwdXRfZGVzYyk7Ci0JfQotCi0gICAgICAvKiBDbG9zZSB0aGUgcGFyZW50J3MgZGVzY3MgdGhhdCBhcmVuJ3Qgd2FudGVkIGhlcmUuICAqLwotICAgICAgaWYgKGxhc3RfcGlwZV9pbnB1dCAhPSBTVERJTl9GSUxFX05PKQotCWNsb3NlIChsYXN0X3BpcGVfaW5wdXQpOwotCi0gICAgICAvKiBFeGVjIHRoZSBwcm9ncmFtLiAgKi8KLSAgICAgICgqZnVuYykgKHByb2dyYW0sIGFyZ3YpOwotCi0gICAgICAvKiBOb3RlOiBDYWxsaW5nIGZwcmludGYgYW5kIGV4aXQgaGVyZSBkb2Vzbid0IHNlZW0gcmlnaHQgZm9yIHZmb3JrLiAgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCB0aGlzX3BuYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgaW5zdGFsbF9lcnJvcl9tc2csIHByb2dyYW0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiOiAlc1xuIiwgeHN0cmVycm9yIChlcnJubykpOwotICAgICAgZXhpdCAoLTEpOwotICAgICAgLyogTk9UUkVBQ0hFRCAqLwotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogSW4gdGhlIHBhcmVudCwgYWZ0ZXIgZm9ya2luZy4KLQkgQ2xvc2UgdGhlIGRlc2NyaXB0b3JzIHRoYXQgd2UgbWFkZSBmb3IgdGhpcyBjaGlsZC4gICovCi0gICAgICBpZiAoaW5wdXRfZGVzYyAhPSBTVERJTl9GSUxFX05PKQotCWNsb3NlIChpbnB1dF9kZXNjKTsKLSAgICAgIGlmIChvdXRwdXRfZGVzYyAhPSBTVERPVVRfRklMRV9OTykKLQljbG9zZSAob3V0cHV0X2Rlc2MpOwotCi0gICAgICAvKiBSZXR1cm4gY2hpbGQncyBwcm9jZXNzIG51bWJlci4gICovCi0gICAgICByZXR1cm4gcGlkOwotICAgIH0KLX0KLQotaW50Ci1wd2FpdCAocGlkLCBzdGF0dXMsIGZsYWdzKQotICAgICBpbnQgcGlkOwotICAgICBpbnQgKnN0YXR1czsKLSAgICAgaW50IGZsYWdzOwotewotICAvKiA/Pz8gSGVyZSdzIGFuIG9wcG9ydHVuaXR5IHRvIGNhbm9uaWNhbGl6ZSB0aGUgdmFsdWVzIGluIFNUQVRVUy4KLSAgICAgTmVlZGVkPyAgKi8KLSNpZmRlZiBWTVMKLSAgcGlkID0gd2FpdHBpZCAoLTEsIHN0YXR1cywgMCk7Ci0jZWxzZQotICBwaWQgPSB3YWl0IChzdGF0dXMpOwotI2VuZGlmCi0gIHJldHVybiBwaWQ7Ci19Ci0KLSNlbmRpZiAvKiAhIF9fTVNET1NfXyAmJiAhIE9TMiAmJiAhIE1QVyAmJiAhIChfV0lOMzIgJiYgISBfX1VXSU5fXykgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9yYW5kb20uYyBiL2xpYmliZXJ0eS9yYW5kb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5NTA3MC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvcmFuZG9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCi0gKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAotICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAotICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAotICogYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkuICBUaGUgbmFtZSBvZiB0aGUKLSAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0vKgotICogVGhpcyBpcyBkZXJpdmVkIGZyb20gdGhlIEJlcmtlbGV5IHNvdXJjZToKLSAqCUAoIylyYW5kb20uYwk1LjUgKEJlcmtlbGV5KSA3LzYvODgKLSAqIEl0IHdhcyByZXdvcmtlZCBmb3IgdGhlIEdOVSBDIExpYnJhcnkgYnkgUm9sYW5kIE1jR3JhdGguCi0gKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpZiAwCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jZWxzZQotCi0jZGVmaW5lCVVMT05HX01BWCAgKCh1bnNpZ25lZCBsb25nKSh+MEwpKSAgICAgLyogMHhGRkZGRkZGRiBmb3IgMzItYml0cyAqLwotI2RlZmluZQlMT05HX01BWCAgICgobG9uZykoVUxPTkdfTUFYID4+IDEpKSAgIC8qIDB4N0ZGRkZGRkYgZm9yIDMyLWJpdHMqLwotCi0jaWZkZWYgX19TVERDX18KLSMgIGRlZmluZSBQVFIgdm9pZCAqCi0jICBpZm5kZWYgTlVMTAotIyAgICBkZWZpbmUgTlVMTCAodm9pZCAqKSAwCi0jICBlbmRpZgotI2Vsc2UKLSMgIGRlZmluZSBQVFIgY2hhciAqCi0jICBpZm5kZWYgTlVMTAotIyAgICBkZWZpbmUgTlVMTCAodm9pZCAqKSAwCi0jICBlbmRpZgotI2VuZGlmCi0KLSNlbmRpZgotCi1sb25nIGludCByYW5kb20gKCk7Ci0KLS8qIEFuIGltcHJvdmVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiBwYWNrYWdlLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkCi0gICByYW5kKCkvc3JhbmQoKSBsaWtlIGludGVyZmFjZSwgdGhpcyBwYWNrYWdlIGFsc28gaGFzIGEgc3BlY2lhbCBzdGF0ZSBpbmZvCi0gICBpbnRlcmZhY2UuICBUaGUgaW5pdHN0YXRlKCkgcm91dGluZSBpcyBjYWxsZWQgd2l0aCBhIHNlZWQsIGFuIGFycmF5IG9mCi0gICBieXRlcywgYW5kIGEgY291bnQgb2YgaG93IG1hbnkgYnl0ZXMgYXJlIGJlaW5nIHBhc3NlZCBpbjsgdGhpcyBhcnJheSBpcwotICAgdGhlbiBpbml0aWFsaXplZCB0byBjb250YWluIGluZm9ybWF0aW9uIGZvciByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gd2l0aAotICAgdGhhdCBtdWNoIHN0YXRlIGluZm9ybWF0aW9uLiAgR29vZCBzaXplcyBmb3IgdGhlIGFtb3VudCBvZiBzdGF0ZQotICAgaW5mb3JtYXRpb24gYXJlIDMyLCA2NCwgMTI4LCBhbmQgMjU2IGJ5dGVzLiAgVGhlIHN0YXRlIGNhbiBiZSBzd2l0Y2hlZCBieQotICAgY2FsbGluZyB0aGUgc2V0c3RhdGUoKSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIGFycmF5IGFzIHdhcyBpbml0aWFsbGl6ZWQKLSAgIHdpdGggaW5pdHN0YXRlKCkuICBCeSBkZWZhdWx0LCB0aGUgcGFja2FnZSBydW5zIHdpdGggMTI4IGJ5dGVzIG9mIHN0YXRlCi0gICBpbmZvcm1hdGlvbiBhbmQgZ2VuZXJhdGVzIGZhciBiZXR0ZXIgcmFuZG9tIG51bWJlcnMgdGhhbiBhIGxpbmVhcgotICAgY29uZ3J1ZW50aWFsIGdlbmVyYXRvci4gIElmIHRoZSBhbW91bnQgb2Ygc3RhdGUgaW5mb3JtYXRpb24gaXMgbGVzcyB0aGFuCi0gICAzMiBieXRlcywgYSBzaW1wbGUgbGluZWFyIGNvbmdydWVudGlhbCBSLk4uRy4gaXMgdXNlZC4gIEludGVybmFsbHksIHRoZQotICAgc3RhdGUgaW5mb3JtYXRpb24gaXMgdHJlYXRlZCBhcyBhbiBhcnJheSBvZiBsb25nczsgdGhlIHplcm9ldGggZWxlbWVudCBvZgotICAgdGhlIGFycmF5IGlzIHRoZSB0eXBlIG9mIFIuTi5HLiBiZWluZyB1c2VkIChzbWFsbCBpbnRlZ2VyKTsgdGhlIHJlbWFpbmRlcgotICAgb2YgdGhlIGFycmF5IGlzIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgdGhlIFIuTi5HLiAgVGh1cywgMzIgYnl0ZXMgb2YKLSAgIHN0YXRlIGluZm9ybWF0aW9uIHdpbGwgZ2l2ZSA3IGxvbmdzIHdvcnRoIG9mIHN0YXRlIGluZm9ybWF0aW9uLCB3aGljaCB3aWxsCi0gICBhbGxvdyBhIGRlZ3JlZSBzZXZlbiBwb2x5bm9taWFsLiAgKE5vdGU6IFRoZSB6ZXJvZXRoIHdvcmQgb2Ygc3RhdGUKLSAgIGluZm9ybWF0aW9uIGFsc28gaGFzIHNvbWUgb3RoZXIgaW5mb3JtYXRpb24gc3RvcmVkIGluIGl0OyBzZWUgc2V0c3RhdGUKLSAgIGZvciBkZXRhaWxzKS4gIFRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gdGVjaG5pcXVlIGlzIGEgbGluZWFyIGZlZWRiYWNrCi0gICBzaGlmdCByZWdpc3RlciBhcHByb2FjaCwgZW1wbG95aW5nIHRyaW5vbWlhbHMgKHNpbmNlIHRoZXJlIGFyZSBmZXdlciB0ZXJtcwotICAgdG8gc3VtIHVwIHRoYXQgd2F5KS4gIEluIHRoaXMgYXBwcm9hY2gsIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgYWxsCi0gICB0aGUgbnVtYmVycyBpbiB0aGUgc3RhdGUgdGFibGUgd2lsbCBhY3QgYXMgYSBsaW5lYXIgZmVlZGJhY2sgc2hpZnQgcmVnaXN0ZXIsCi0gICBhbmQgd2lsbCBoYXZlIHBlcmlvZCAyXmRlZyAtIDEgKHdoZXJlIGRlZyBpcyB0aGUgZGVncmVlIG9mIHRoZSBwb2x5bm9taWFsCi0gICBiZWluZyB1c2VkLCBhc3N1bWluZyB0aGF0IHRoZSBwb2x5bm9taWFsIGlzIGlycmVkdWNpYmxlIGFuZCBwcmltaXRpdmUpLgotICAgVGhlIGhpZ2hlciBvcmRlciBiaXRzIHdpbGwgaGF2ZSBsb25nZXIgcGVyaW9kcywgc2luY2UgdGhlaXIgdmFsdWVzIGFyZQotICAgYWxzbyBpbmZsdWVuY2VkIGJ5IHBzZXVkby1yYW5kb20gY2FycmllcyBvdXQgb2YgdGhlIGxvd2VyIGJpdHMuICBUaGUKLSAgIHRvdGFsIHBlcmlvZCBvZiB0aGUgZ2VuZXJhdG9yIGlzIGFwcHJveGltYXRlbHkgZGVnKigyKipkZWcgLSAxKTsgdGh1cwotICAgZG91YmxpbmcgdGhlIGFtb3VudCBvZiBzdGF0ZSBpbmZvcm1hdGlvbiBoYXMgYSB2YXN0IGluZmx1ZW5jZSBvbiB0aGUKLSAgIHBlcmlvZCBvZiB0aGUgZ2VuZXJhdG9yLiAgTm90ZTogVGhlIGRlZyooMioqZGVnIC0gMSkgaXMgYW4gYXBwcm94aW1hdGlvbgotICAgb25seSBnb29kIGZvciBsYXJnZSBkZWcsIHdoZW4gdGhlIHBlcmlvZCBvZiB0aGUgc2hpZnQgcmVnaXN0ZXIgaXMgdGhlCi0gICBkb21pbmFudCBmYWN0b3IuICBXaXRoIGRlZyBlcXVhbCB0byBzZXZlbiwgdGhlIHBlcmlvZCBpcyBhY3R1YWxseSBtdWNoCi0gICBsb25nZXIgdGhhbiB0aGUgNyooMioqNyAtIDEpIHByZWRpY3RlZCBieSB0aGlzIGZvcm11bGEuICAqLwotCi0KLQotLyogRm9yIGVhY2ggb2YgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzLCB3ZSBoYXZlIGEKLSAgIGJyZWFrIHZhbHVlIG9uIHRoZSBhbW91bnQgb2Ygc3RhdGUgaW5mb3JtYXRpb24gKHlvdSBuZWVkIGF0IGxlYXN0IHRoaQotICAgYnl0ZXMgb2Ygc3RhdGUgaW5mbyB0byBzdXBwb3J0IHRoaXMgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IpLCBhIGRlZ3JlZSBmb3IKLSAgIHRoZSBwb2x5bm9taWFsIChhY3R1YWxseSBhIHRyaW5vbWlhbCkgdGhhdCB0aGUgUi5OLkcuIGlzIGJhc2VkIG9uLCBhbmQKLSAgIHNlcGFyYXRpb24gYmV0d2VlbiB0aGUgdHdvIGxvd2VyIG9yZGVyIGNvZWZmaWNpZW50cyBvZiB0aGUgdHJpbm9taWFsLiAgKi8KLQotLyogTGluZWFyIGNvbmdydWVudGlhbC4gICovCi0jZGVmaW5lCVRZUEVfMAkJMAotI2RlZmluZQlCUkVBS18wCQk4Ci0jZGVmaW5lCURFR18wCQkwCi0jZGVmaW5lCVNFUF8wCQkwCi0KLS8qIHgqKjcgKyB4KiozICsgMS4gICovCi0jZGVmaW5lCVRZUEVfMQkJMQotI2RlZmluZQlCUkVBS18xCQkzMgotI2RlZmluZQlERUdfMQkJNwotI2RlZmluZQlTRVBfMQkJMwotCi0vKiB4KioxNSArIHggKyAxLiAgKi8KLSNkZWZpbmUJVFlQRV8yCQkyCi0jZGVmaW5lCUJSRUFLXzIJCTY0Ci0jZGVmaW5lCURFR18yCQkxNQotI2RlZmluZQlTRVBfMgkJMQotCi0vKiB4KiozMSArIHgqKjMgKyAxLiAgKi8KLSNkZWZpbmUJVFlQRV8zCQkzCi0jZGVmaW5lCUJSRUFLXzMJCTEyOAotI2RlZmluZQlERUdfMwkJMzEKLSNkZWZpbmUJU0VQXzMJCTMKLQotLyogeCoqNjMgKyB4ICsgMS4gICovCi0jZGVmaW5lCVRZUEVfNAkJNAotI2RlZmluZQlCUkVBS180CQkyNTYKLSNkZWZpbmUJREVHXzQJCTYzCi0jZGVmaW5lCVNFUF80CQkxCi0KLQotLyogQXJyYXkgdmVyc2lvbnMgb2YgdGhlIGFib3ZlIGluZm9ybWF0aW9uIHRvIG1ha2UgY29kZSBydW4gZmFzdGVyLgotICAgUmVsaWVzIG9uIGZhY3QgdGhhdCBUWVBFX2kgPT0gaS4gICovCi0KLSNkZWZpbmUJTUFYX1RZUEVTCTUJLyogTWF4IG51bWJlciBvZiB0eXBlcyBhYm92ZS4gICovCi0KLXN0YXRpYyBpbnQgZGVncmVlc1tNQVhfVFlQRVNdID0geyBERUdfMCwgREVHXzEsIERFR18yLCBERUdfMywgREVHXzQgfTsKLXN0YXRpYyBpbnQgc2Vwc1tNQVhfVFlQRVNdID0geyBTRVBfMCwgU0VQXzEsIFNFUF8yLCBTRVBfMywgU0VQXzQgfTsKLQotCi0KLS8qIEluaXRpYWxseSwgZXZlcnl0aGluZyBpcyBzZXQgdXAgYXMgaWYgZnJvbToKLQlpbml0c3RhdGUoMSwgcmFuZHRibCwgMTI4KTsKLSAgIE5vdGUgdGhhdCB0aGlzIGluaXRpYWxpemF0aW9uIHRha2VzIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IHNyYW5kb20KLSAgIGFkdmFuY2VzIHRoZSBmcm9udCBhbmQgcmVhciBwb2ludGVycyAxMCpyYW5kX2RlZyB0aW1lcywgYW5kIGhlbmNlIHRoZQotICAgcmVhciBwb2ludGVyIHdoaWNoIHN0YXJ0cyBhdCAwIHdpbGwgYWxzbyBlbmQgdXAgYXQgemVybzsgdGh1cyB0aGUgemVyb2V0aAotICAgZWxlbWVudCBvZiB0aGUgc3RhdGUgaW5mb3JtYXRpb24sIHdoaWNoIGNvbnRhaW5zIGluZm8gYWJvdXQgdGhlIGN1cnJlbnQKLSAgIHBvc2l0aW9uIG9mIHRoZSByZWFyIHBvaW50ZXIgaXMganVzdAotCShNQVhfVFlQRVMgKiAocnB0ciAtIHN0YXRlKSkgKyBUWVBFXzMgPT0gVFlQRV8zLiAgKi8KLQotc3RhdGljIGxvbmcgaW50IHJhbmR0YmxbREVHXzMgKyAxXSA9Ci0gIHsgVFlQRV8zLAotICAgICAgMHg5YTMxOTAzOSwgMHgzMmQ5YzAyNCwgMHg5YjY2MzE4MiwgMHg1ZGExZjM0MiwgCi0gICAgICAweGRlM2I4MWUwLCAweGRmMGE2ZmI1LCAweGYxMDNiYzAyLCAweDQ4ZjM0MGZiLCAKLSAgICAgIDB4NzQ0OWU1NmIsIDB4YmViMWRiYjAsIDB4YWI1YzU5MTgsIDB4OTQ2NTU0ZmQsIAotICAgICAgMHg4YzJlNjgwZiwgMHhlYjNkNzk5ZiwgMHhiMTFlZTBiNywgMHgyZDQzNmI4NiwgCi0gICAgICAweGRhNjcyZTJhLCAweDE1ODhjYTg4LCAweGUzNjk3MzVkLCAweDkwNGYzNWY3LCAKLSAgICAgIDB4ZDcxNThmZDYsIDB4NmZhNmYwNTEsIDB4NjE2ZTZiOTYsIDB4YWM5NGVmZGMsIAotICAgICAgMHgzNjQxM2Y5MywgMHhjNjIyYzI5OCwgMHhmNWE0MmFiOCwgMHg4YTg4ZDc3YiwgCi0gICAgICAweGY1YWQ5ZDBlLCAweDg5OTkyMjBiLCAweDI3ZmI0N2I5Ci0gICAgfTsKLQotLyogRlBUUiBhbmQgUlBUUiBhcmUgdHdvIHBvaW50ZXJzIGludG8gdGhlIHN0YXRlIGluZm8sIGEgZnJvbnQgYW5kIGEgcmVhcgotICAgcG9pbnRlci4gIFRoZXNlIHR3byBwb2ludGVycyBhcmUgYWx3YXlzIHJhbmRfc2VwIHBsYWNlcyBhcGFydHMsIGFzIHRoZXkKLSAgIGN5Y2xlIHRocm91Z2ggdGhlIHN0YXRlIGluZm9ybWF0aW9uLiAgKFllcywgdGhpcyBkb2VzIG1lYW4gd2UgY291bGQgZ2V0Ci0gICBhd2F5IHdpdGgganVzdCBvbmUgcG9pbnRlciwgYnV0IHRoZSBjb2RlIGZvciByYW5kb20gaXMgbW9yZSBlZmZpY2llbnQKLSAgIHRoaXMgd2F5KS4gIFRoZSBwb2ludGVycyBhcmUgbGVmdCBwb3NpdGlvbmVkIGFzIHRoZXkgd291bGQgYmUgZnJvbSB0aGUgY2FsbDoKLQlpbml0c3RhdGUoMSwgcmFuZHRibCwgMTI4KTsKLSAgIChUaGUgcG9zaXRpb24gb2YgdGhlIHJlYXIgcG9pbnRlciwgcnB0ciwgaXMgcmVhbGx5IDAgKGFzIGV4cGxhaW5lZCBhYm92ZQotICAgaW4gdGhlIGluaXRpYWxpemF0aW9uIG9mIHJhbmR0YmwpIGJlY2F1c2UgdGhlIHN0YXRlIHRhYmxlIHBvaW50ZXIgaXMgc2V0Ci0gICB0byBwb2ludCB0byByYW5kdGJsWzFdIChhcyBleHBsYWluZWQgYmVsb3cpLikgICovCi0KLXN0YXRpYyBsb25nIGludCAqZnB0ciA9ICZyYW5kdGJsW1NFUF8zICsgMV07Ci1zdGF0aWMgbG9uZyBpbnQgKnJwdHIgPSAmcmFuZHRibFsxXTsKLQotCi0KLS8qIFRoZSBmb2xsb3dpbmcgdGhpbmdzIGFyZSB0aGUgcG9pbnRlciB0byB0aGUgc3RhdGUgaW5mb3JtYXRpb24gdGFibGUsCi0gICB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBnZW5lcmF0b3IsIHRoZSBkZWdyZWUgb2YgdGhlIGN1cnJlbnQgcG9seW5vbWlhbAotICAgYmVpbmcgdXNlZCwgYW5kIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gdGhlIHR3byBwb2ludGVycy4KLSAgIE5vdGUgdGhhdCBmb3IgZWZmaWNpZW5jeSBvZiByYW5kb20sIHdlIHJlbWVtYmVyIHRoZSBmaXJzdCBsb2NhdGlvbiBvZgotICAgdGhlIHN0YXRlIGluZm9ybWF0aW9uLCBub3QgdGhlIHplcm9ldGguICBIZW5jZSBpdCBpcyB2YWxpZCB0byBhY2Nlc3MKLSAgIHN0YXRlWy0xXSwgd2hpY2ggaXMgdXNlZCB0byBzdG9yZSB0aGUgdHlwZSBvZiB0aGUgUi5OLkcuCi0gICBBbHNvLCB3ZSByZW1lbWJlciB0aGUgbGFzdCBsb2NhdGlvbiwgc2luY2UgdGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuCi0gICBpbmRleGluZyBldmVyeSB0aW1lIHRvIGZpbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3QgZWxlbWVudCB0byBzZWUgaWYKLSAgIHRoZSBmcm9udCBhbmQgcmVhciBwb2ludGVycyBoYXZlIHdyYXBwZWQuICAqLwotCi1zdGF0aWMgbG9uZyBpbnQgKnN0YXRlID0gJnJhbmR0YmxbMV07Ci0KLXN0YXRpYyBpbnQgcmFuZF90eXBlID0gVFlQRV8zOwotc3RhdGljIGludCByYW5kX2RlZyA9IERFR18zOwotc3RhdGljIGludCByYW5kX3NlcCA9IFNFUF8zOwotCi1zdGF0aWMgbG9uZyBpbnQgKmVuZF9wdHIgPSAmcmFuZHRibFtzaXplb2YocmFuZHRibCkgLyBzaXplb2YocmFuZHRibFswXSldOwotDAotLyogSW5pdGlhbGl6ZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgYmFzZWQgb24gdGhlIGdpdmVuIHNlZWQuICBJZiB0aGUKLSAgIHR5cGUgaXMgdGhlIHRyaXZpYWwgbm8tc3RhdGUtaW5mb3JtYXRpb24gdHlwZSwganVzdCByZW1lbWJlciB0aGUgc2VlZC4KLSAgIE90aGVyd2lzZSwgaW5pdGlhbGl6ZXMgc3RhdGVbXSBiYXNlZCBvbiB0aGUgZ2l2ZW4gInNlZWQiIHZpYSBhIGxpbmVhcgotICAgY29uZ3J1ZW50aWFsIGdlbmVyYXRvci4gIFRoZW4sIHRoZSBwb2ludGVycyBhcmUgc2V0IHRvIGtub3duIGxvY2F0aW9ucwotICAgdGhhdCBhcmUgZXhhY3RseSByYW5kX3NlcCBwbGFjZXMgYXBhcnQuICBMYXN0bHksIGl0IGN5Y2xlcyB0aGUgc3RhdGUKLSAgIGluZm9ybWF0aW9uIGEgZ2l2ZW4gbnVtYmVyIG9mIHRpbWVzIHRvIGdldCByaWQgb2YgYW55IGluaXRpYWwgZGVwZW5kZW5jaWVzCi0gICBpbnRyb2R1Y2VkIGJ5IHRoZSBMLkMuUi5OLkcuICBOb3RlIHRoYXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHJhbmR0YmxbXQotICAgZm9yIGRlZmF1bHQgdXNhZ2UgcmVsaWVzIG9uIHZhbHVlcyBwcm9kdWNlZCBieSB0aGlzIHJvdXRpbmUuICAqLwotdm9pZAotc3JhbmRvbSAoeCkKLSAgdW5zaWduZWQgaW50IHg7Ci17Ci0gIHN0YXRlWzBdID0geDsKLSAgaWYgKHJhbmRfdHlwZSAhPSBUWVBFXzApCi0gICAgewotICAgICAgcmVnaXN0ZXIgbG9uZyBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDE7IGkgPCByYW5kX2RlZzsgKytpKQotCXN0YXRlW2ldID0gKDExMDM1MTUxNDUgKiBzdGF0ZVtpIC0gMV0pICsgMTIzNDU7Ci0gICAgICBmcHRyID0gJnN0YXRlW3JhbmRfc2VwXTsKLSAgICAgIHJwdHIgPSAmc3RhdGVbMF07Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgMTAgKiByYW5kX2RlZzsgKytpKQotCXJhbmRvbSgpOwotICAgIH0KLX0KLQwKLS8qIEluaXRpYWxpemUgdGhlIHN0YXRlIGluZm9ybWF0aW9uIGluIHRoZSBnaXZlbiBhcnJheSBvZiBOIGJ5dGVzIGZvcgotICAgZnV0dXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbi4gIEJhc2VkIG9uIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UKLSAgIGFyZSBnaXZlbiwgYW5kIHRoZSBicmVhayB2YWx1ZXMgZm9yIHRoZSBkaWZmZXJlbnQgUi5OLkcuJ3MsIHdlIGNob29zZQotICAgdGhlIGJlc3QgKGxhcmdlc3QpIG9uZSB3ZSBjYW4gYW5kIHNldCB0aGluZ3MgdXAgZm9yIGl0LiAgc3JhbmRvbSBpcwotICAgdGhlbiBjYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgc3RhdGUgaW5mb3JtYXRpb24uICBOb3RlIHRoYXQgb24gcmV0dXJuCi0gICBmcm9tIHNyYW5kb20sIHdlIHNldCBzdGF0ZVstMV0gdG8gYmUgdGhlIHR5cGUgbXVsdGlwbGV4ZWQgd2l0aCB0aGUgY3VycmVudAotICAgdmFsdWUgb2YgdGhlIHJlYXIgcG9pbnRlcjsgdGhpcyBpcyBzbyBzdWNjZXNzaXZlIGNhbGxzIHRvIGluaXRzdGF0ZSB3b24ndAotICAgbG9zZSB0aGlzIGluZm9ybWF0aW9uIGFuZCB3aWxsIGJlIGFibGUgdG8gcmVzdGFydCB3aXRoIHNldHN0YXRlLgotICAgTm90ZTogVGhlIGZpcnN0IHRoaW5nIHdlIGRvIGlzIHNhdmUgdGhlIGN1cnJlbnQgc3RhdGUsIGlmIGFueSwganVzdCBsaWtlCi0gICBzZXRzdGF0ZSBzbyB0aGF0IGl0IGRvZXNuJ3QgbWF0dGVyIHdoZW4gaW5pdHN0YXRlIGlzIGNhbGxlZC4KLSAgIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBvbGQgc3RhdGUuICAqLwotUFRSCi1pbml0c3RhdGUgKHNlZWQsIGFyZ19zdGF0ZSwgbikKLSAgdW5zaWduZWQgaW50IHNlZWQ7Ci0gIFBUUiBhcmdfc3RhdGU7Ci0gIHVuc2lnbmVkIGxvbmcgbjsKLXsKLSAgUFRSIG9zdGF0ZSA9IChQVFIpICZzdGF0ZVstMV07Ci0KLSAgaWYgKHJhbmRfdHlwZSA9PSBUWVBFXzApCi0gICAgc3RhdGVbLTFdID0gcmFuZF90eXBlOwotICBlbHNlCi0gICAgc3RhdGVbLTFdID0gKE1BWF9UWVBFUyAqIChycHRyIC0gc3RhdGUpKSArIHJhbmRfdHlwZTsKLSAgaWYgKG4gPCBCUkVBS18xKQotICAgIHsKLSAgICAgIGlmIChuIDwgQlJFQUtfMCkKLQl7Ci0JICBlcnJubyA9IEVJTlZBTDsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIHJhbmRfdHlwZSA9IFRZUEVfMDsKLSAgICAgIHJhbmRfZGVnID0gREVHXzA7Ci0gICAgICByYW5kX3NlcCA9IFNFUF8wOwotICAgIH0KLSAgZWxzZSBpZiAobiA8IEJSRUFLXzIpCi0gICAgewotICAgICAgcmFuZF90eXBlID0gVFlQRV8xOwotICAgICAgcmFuZF9kZWcgPSBERUdfMTsKLSAgICAgIHJhbmRfc2VwID0gU0VQXzE7Ci0gICAgfQotICBlbHNlIGlmIChuIDwgQlJFQUtfMykKLSAgICB7Ci0gICAgICByYW5kX3R5cGUgPSBUWVBFXzI7Ci0gICAgICByYW5kX2RlZyA9IERFR18yOwotICAgICAgcmFuZF9zZXAgPSBTRVBfMjsKLSAgICB9Ci0gIGVsc2UgaWYgKG4gPCBCUkVBS180KQotICAgIHsKLSAgICAgIHJhbmRfdHlwZSA9IFRZUEVfMzsKLSAgICAgIHJhbmRfZGVnID0gREVHXzM7Ci0gICAgICByYW5kX3NlcCA9IFNFUF8zOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJhbmRfdHlwZSA9IFRZUEVfNDsKLSAgICAgIHJhbmRfZGVnID0gREVHXzQ7Ci0gICAgICByYW5kX3NlcCA9IFNFUF80OwotICAgIH0KLQotICBzdGF0ZSA9ICYoKGxvbmcgaW50ICopIGFyZ19zdGF0ZSlbMV07CS8qIEZpcnN0IGxvY2F0aW9uLiAgKi8KLSAgLyogTXVzdCBzZXQgRU5EX1BUUiBiZWZvcmUgc3JhbmRvbS4gICovCi0gIGVuZF9wdHIgPSAmc3RhdGVbcmFuZF9kZWddOwotICBzcmFuZG9tKHNlZWQpOwotICBpZiAocmFuZF90eXBlID09IFRZUEVfMCkKLSAgICBzdGF0ZVstMV0gPSByYW5kX3R5cGU7Ci0gIGVsc2UKLSAgICBzdGF0ZVstMV0gPSAoTUFYX1RZUEVTICogKHJwdHIgLSBzdGF0ZSkpICsgcmFuZF90eXBlOwotCi0gIHJldHVybiBvc3RhdGU7Ci19Ci0MCi0vKiBSZXN0b3JlIHRoZSBzdGF0ZSBmcm9tIHRoZSBnaXZlbiBzdGF0ZSBhcnJheS4KLSAgIE5vdGU6IEl0IGlzIGltcG9ydGFudCB0aGF0IHdlIGFsc28gcmVtZW1iZXIgdGhlIGxvY2F0aW9ucyBvZiB0aGUgcG9pbnRlcnMKLSAgIGluIHRoZSBjdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uLCBhbmQgcmVzdG9yZSB0aGUgbG9jYXRpb25zIG9mIHRoZSBwb2ludGVycwotICAgZnJvbSB0aGUgb2xkIHN0YXRlIGluZm9ybWF0aW9uLiAgVGhpcyBpcyBkb25lIGJ5IG11bHRpcGxleGluZyB0aGUgcG9pbnRlcgotICAgbG9jYXRpb24gaW50byB0aGUgemVyb2V0aCB3b3JkIG9mIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbi4gTm90ZSB0aGF0IGR1ZQotICAgdG8gdGhlIG9yZGVyIGluIHdoaWNoIHRoaW5ncyBhcmUgZG9uZSwgaXQgaXMgT0sgdG8gY2FsbCBzZXRzdGF0ZSB3aXRoIHRoZQotICAgc2FtZSBzdGF0ZSBhcyB0aGUgY3VycmVudCBzdGF0ZQotICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG9sZCBzdGF0ZSBpbmZvcm1hdGlvbi4gICovCi0KLVBUUgotc2V0c3RhdGUgKGFyZ19zdGF0ZSkKLSAgUFRSIGFyZ19zdGF0ZTsKLXsKLSAgcmVnaXN0ZXIgbG9uZyBpbnQgKm5ld19zdGF0ZSA9IChsb25nIGludCAqKSBhcmdfc3RhdGU7Ci0gIHJlZ2lzdGVyIGludCB0eXBlID0gbmV3X3N0YXRlWzBdICUgTUFYX1RZUEVTOwotICByZWdpc3RlciBpbnQgcmVhciA9IG5ld19zdGF0ZVswXSAvIE1BWF9UWVBFUzsKLSAgUFRSIG9zdGF0ZSA9IChQVFIpICZzdGF0ZVstMV07Ci0KLSAgaWYgKHJhbmRfdHlwZSA9PSBUWVBFXzApCi0gICAgc3RhdGVbLTFdID0gcmFuZF90eXBlOwotICBlbHNlCi0gICAgc3RhdGVbLTFdID0gKE1BWF9UWVBFUyAqIChycHRyIC0gc3RhdGUpKSArIHJhbmRfdHlwZTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgVFlQRV8wOgotICAgIGNhc2UgVFlQRV8xOgotICAgIGNhc2UgVFlQRV8yOgotICAgIGNhc2UgVFlQRV8zOgotICAgIGNhc2UgVFlQRV80OgotICAgICAgcmFuZF90eXBlID0gdHlwZTsKLSAgICAgIHJhbmRfZGVnID0gZGVncmVlc1t0eXBlXTsKLSAgICAgIHJhbmRfc2VwID0gc2Vwc1t0eXBlXTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBTdGF0ZSBpbmZvIG11bmdlZC4gICovCi0gICAgICBlcnJubyA9IEVJTlZBTDsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBzdGF0ZSA9ICZuZXdfc3RhdGVbMV07Ci0gIGlmIChyYW5kX3R5cGUgIT0gVFlQRV8wKQotICAgIHsKLSAgICAgIHJwdHIgPSAmc3RhdGVbcmVhcl07Ci0gICAgICBmcHRyID0gJnN0YXRlWyhyZWFyICsgcmFuZF9zZXApICUgcmFuZF9kZWddOwotICAgIH0KLSAgLyogU2V0IGVuZF9wdHIgdG9vLiAgKi8KLSAgZW5kX3B0ciA9ICZzdGF0ZVtyYW5kX2RlZ107Ci0KLSAgcmV0dXJuIG9zdGF0ZTsKLX0KLQwKLS8qIElmIHdlIGFyZSB1c2luZyB0aGUgdHJpdmlhbCBUWVBFXzAgUi5OLkcuLCBqdXN0IGRvIHRoZSBvbGQgbGluZWFyCi0gICBjb25ncnVlbnRpYWwgYml0LiAgT3RoZXJ3aXNlLCB3ZSBkbyBvdXIgZmFuY3kgdHJpbm9taWFsIHN0dWZmLCB3aGljaCBpcyB0aGUKLSAgIHNhbWUgaW4gYWxsIHRoZXIgb3RoZXIgY2FzZXMgZHVlIHRvIGFsbCB0aGUgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0IGhhdmUgYmVlbgotICAgc2V0IHVwLiAgVGhlIGJhc2ljIG9wZXJhdGlvbiBpcyB0byBhZGQgdGhlIG51bWJlciBhdCB0aGUgcmVhciBwb2ludGVyIGludG8KLSAgIHRoZSBvbmUgYXQgdGhlIGZyb250IHBvaW50ZXIuICBUaGVuIGJvdGggcG9pbnRlcnMgYXJlIGFkdmFuY2VkIHRvIHRoZSBuZXh0Ci0gICBsb2NhdGlvbiBjeWNsaWNhbGx5IGluIHRoZSB0YWJsZS4gIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgc3VtIGdlbmVyYXRlZCwKLSAgIHJlZHVjZWQgdG8gMzEgYml0cyBieSB0aHJvd2luZyBhd2F5IHRoZSAibGVhc3QgcmFuZG9tIiBsb3cgYml0LgotICAgTm90ZTogVGhlIGNvZGUgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgYm90aCB0aGUgZnJvbnQgYW5kCi0gICByZWFyIHBvaW50ZXJzIGNhbid0IHdyYXAgb24gdGhlIHNhbWUgY2FsbCBieSBub3QgdGVzdGluZyB0aGUgcmVhcgotICAgcG9pbnRlciBpZiB0aGUgZnJvbnQgb25lIGhhcyB3cmFwcGVkLiAgUmV0dXJucyBhIDMxLWJpdCByYW5kb20gbnVtYmVyLiAgKi8KLQotbG9uZyBpbnQKLXJhbmRvbSAoKQotewotICBpZiAocmFuZF90eXBlID09IFRZUEVfMCkKLSAgICB7Ci0gICAgICBzdGF0ZVswXSA9ICgoc3RhdGVbMF0gKiAxMTAzNTE1MjQ1KSArIDEyMzQ1KSAmIExPTkdfTUFYOwotICAgICAgcmV0dXJuIHN0YXRlWzBdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgaW50IGk7Ci0gICAgICAqZnB0ciArPSAqcnB0cjsKLSAgICAgIC8qIENodWNraW5nIGxlYXN0IHJhbmRvbSBiaXQuICAqLwotICAgICAgaSA9ICgqZnB0ciA+PiAxKSAmIExPTkdfTUFYOwotICAgICAgKytmcHRyOwotICAgICAgaWYgKGZwdHIgPj0gZW5kX3B0cikKLQl7Ci0JICBmcHRyID0gc3RhdGU7Ci0JICArK3JwdHI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICsrcnB0cjsKLQkgIGlmIChycHRyID49IGVuZF9wdHIpCi0JICAgIHJwdHIgPSBzdGF0ZTsKLQl9Ci0gICAgICByZXR1cm4gaTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvcmVuYW1lLmMgYi9saWJpYmVydHkvcmVuYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMjZlMmQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3JlbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogcmVuYW1lIC0tIHJlbmFtZSBhIGZpbGUKLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICovCi0KLS8qIFJlbmFtZSBhIGZpbGUuICAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLQotaW50Ci1yZW5hbWUgKHpmcm9tLCB6dG8pCi0gICAgIGNoYXIgKnpmcm9tOwotICAgICBjaGFyICp6dG87Ci17Ci0gIGlmIChsaW5rICh6ZnJvbSwgenRvKSA8IDApCi0gICAgewotICAgICAgaWYgKGVycm5vICE9IEVFWElTVCkKLQlyZXR1cm4gLTE7Ci0gICAgICBpZiAodW5saW5rICh6dG8pIDwgMAotCSAgfHwgbGluayAoemZyb20sIHp0bykgPCAwKQotCXJldHVybiAtMTsKLSAgICB9Ci0gIHJldHVybiB1bmxpbmsgKHpmcm9tKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9yaW5kZXguYyBiL2xpYmliZXJ0eS9yaW5kZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxZDEyNi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvcmluZGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKiBTdHViIGltcGxlbWVudGF0aW9uIG9mIChvYnNvbGV0ZSkgcmluZGV4KCkuICovCi0KLWV4dGVybiBjaGFyICpzdHJyY2hyICgpOwotCi1jaGFyICoKLXJpbmRleCAocywgYykKLSAgY2hhciAqczsKLSAgaW50IGM7Ci17Ci0gIHJldHVybiBzdHJyY2hyIChzLCBjKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zaWdzZXRtYXNrLmMgYi9saWJpYmVydHkvc2lnc2V0bWFzay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTA5ZTZhLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zaWdzZXRtYXNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiBWZXJzaW9uIG9mIHNpZ3NldG1hc2suYwotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiAoc2FjQGN5Z251cy5jb20pLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb2FtaW4uICovCi0KLS8qIFNldCB0aGUgY3VycmVudCBzaWduYWwgbWFzayB0byB0aGUgc2V0IHByb3ZpZGVkLCBhbmQgcmV0dXJuIHRoZSAKLSAgIHByZXZpb3VzIHZhbHVlICovCi0KLSNkZWZpbmUgX1BPU0lYX1NPVVJDRQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0vKiBJbmNsdWRpbmcgPHN5cy90eXBlcy5oPiBzZWVtcyB0byBiZSBuZWVkZWQgYnkgSVNDLiAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0jaWZkZWYgU0lHX1NFVE1BU0sKLWludAotREVGVU4oc2lnc2V0bWFzaywoc2V0KSwKLSAgICAgIGludCBzZXQpCi17Ci0gICAgc2lnc2V0X3QgbmV3OwotICAgIHNpZ3NldF90IG9sZDsKLSAgICAKLSAgICBzaWdlbXB0eXNldCAoJm5ldyk7Ci0gICAgaWYgKHNldCAhPSAwKSB7Ci0gICAgICBhYm9ydCgpOwkvKiBGSVhNRSwgd2UgZG9uJ3Qga25vdyBob3cgdG8gdHJhbnNsYXRlIG9sZCBtYXNrIHRvIG5ldyAqLwotICAgIH0KLSAgICBzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm5ldywgJm9sZCk7Ci0gICAgcmV0dXJuIDE7CS8qIEZJWE1FLCB3ZSBhbHdheXMgcmV0dXJuIDEgYXMgb2xkIHZhbHVlLiAgKi8KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3NwYWNlcy5jIGIvbGliaWJlcnR5L3NwYWNlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTkyNTcxLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zcGFjZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qIEFsbG9jYXRlIG1lbW9yeSByZWdpb24gZmlsbGVkIHdpdGggc3BhY2VzLgotICAgQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLQotTkFNRQotCi0Jc3BhY2VzIC0tIHJldHVybiBhIHBvaW50ZXIgdG8gYSBidWZmZXIgZnVsbCBvZiBzcGFjZXMKLQotU1lOT1BTSVMKLQotCWNoYXIgKnNwYWNlcyAoaW50IGNvdW50KQotCi1ERVNDUklQVElPTgotCi0JUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBtZW1vcnkgcmVnaW9uIGZpbGxlZCB3aXRoIHRoZSBzcGVjaWZpZWQKLQludW1iZXIgb2Ygc3BhY2VzIGFuZCBudWxsIHRlcm1pbmF0ZWQuICBUaGUgcmV0dXJuZWQgcG9pbnRlciBpcwotCXZhbGlkIHVudGlsIGF0IGxlYXN0IHRoZSBuZXh0IGNhbGwuCi0JCi1CVUdTCi0KLSovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWYgVk1TCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2Vsc2UKLS8qIEZvciBzeXN0ZW1zIHdpdGggbGFyZ2VyIHBvaW50ZXJzIHRoYW4gaW50cywgdGhlc2UgbXVzdCBiZSBkZWNsYXJlZC4gICovCi1leHRlcm4gUFRSIG1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLWV4dGVybiB2b2lkIGZyZWUgUEFSQU1TICgoUFRSKSk7Ci0jZW5kaWYKLQotY29uc3QgY2hhciAqCi1zcGFjZXMgKGNvdW50KQotICBpbnQgY291bnQ7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnQ7Ci0gIHN0YXRpYyBjaGFyICpidWY7Ci0gIHN0YXRpYyBpbnQgbWF4c2l6ZTsKLQotICBpZiAoY291bnQgPiBtYXhzaXplKQotICAgIHsKLSAgICAgIGlmIChidWYpCi0JewotCSAgZnJlZSAoYnVmKTsKLQl9Ci0gICAgICBidWYgPSBtYWxsb2MgKGNvdW50ICsgMSk7Ci0gICAgICBpZiAoYnVmID09IChjaGFyICopIDApCi0JcmV0dXJuIDA7Ci0gICAgICBmb3IgKHQgPSBidWYgKyBjb3VudCA7IHQgIT0gYnVmIDsgKQotCXsKLQkgICotLXQgPSAnICc7Ci0JfQotICAgICAgbWF4c2l6ZSA9IGNvdW50OwotICAgICAgYnVmW2NvdW50XSA9ICdcMCc7Ci0gICAgfQotICByZXR1cm4gKGNvbnN0IGNoYXIgKikgKGJ1ZiArIG1heHNpemUgLSBjb3VudCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zcGxheS10cmVlLmMgYi9saWJpYmVydHkvc3BsYXktdHJlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmJiNWE2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zcGxheS10cmVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyogQSBzcGxheS10cmVlIGRhdGF0eXBlLiAgCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJrIE1pdGNoZWxsIChtYXJrQG1hcmttaXRjaGVsbC5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0gICAKLUdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEZvciBhbiBlYXNpbHkgcmVhZGFibGUgZGVzY3JpcHRpb24gb2Ygc3BsYXktdHJlZXMsIHNlZToKLQotICAgICBMZXdpcywgSGFycnkgUi4gYW5kIERlbmVuYmVyZywgTGFycnkuICBEYXRhIFN0cnVjdHVyZXMgYW5kIFRoZWlyCi0gICAgIEFsZ29yaXRobXMuICBIYXJwZXItQ29sbGlucywgSW5jLiAgMTk5MS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAic3BsYXktdHJlZS5oIgotCi1zdGF0aWMgdm9pZCBzcGxheV90cmVlX2RlbGV0ZV9oZWxwZXIgICAgUEFSQU1TKChzcGxheV90cmVlLCAKLQkJCQkJCXNwbGF5X3RyZWVfbm9kZSkpOwotc3RhdGljIHZvaWQgc3BsYXlfdHJlZV9zcGxheSAgICAgICAgICAgIFBBUkFNUygoc3BsYXlfdHJlZSwKLQkJCQkJCXNwbGF5X3RyZWVfa2V5KSk7Ci1zdGF0aWMgc3BsYXlfdHJlZV9ub2RlIHNwbGF5X3RyZWVfc3BsYXlfaGVscGVyICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUsCi0JCQkJCQlzcGxheV90cmVlX2tleSwKLQkJCQkJCXNwbGF5X3RyZWVfbm9kZSosCi0JCQkJCQlzcGxheV90cmVlX25vZGUqLAotCQkJCQkJc3BsYXlfdHJlZV9ub2RlKikpOwotc3RhdGljIGludCBzcGxheV90cmVlX2ZvcmVhY2hfaGVscGVyICAgIFBBUkFNUygoc3BsYXlfdHJlZSwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX25vZGUsCi0JCQkJCQlzcGxheV90cmVlX2ZvcmVhY2hfZm4sCi0JCQkJCQl2b2lkKikpOwotCi0vKiBEZWFsbG9jYXRlIE5PREUgKGEgbWVtYmVyIG9mIFNQKSwgYW5kIGFsbCBpdHMgc3ViLXRyZWVzLiAgKi8KLQotc3RhdGljIHZvaWQgCi1zcGxheV90cmVlX2RlbGV0ZV9oZWxwZXIgKHNwLCBub2RlKQotICAgICBzcGxheV90cmVlIHNwOwotICAgICBzcGxheV90cmVlX25vZGUgbm9kZTsKLXsKLSAgaWYgKCFub2RlKQotICAgIHJldHVybjsKLQotICBzcGxheV90cmVlX2RlbGV0ZV9oZWxwZXIgKHNwLCBub2RlLT5sZWZ0KTsKLSAgc3BsYXlfdHJlZV9kZWxldGVfaGVscGVyIChzcCwgbm9kZS0+cmlnaHQpOwotCi0gIGlmIChzcC0+ZGVsZXRlX2tleSkKLSAgICAoKnNwLT5kZWxldGVfa2V5KShub2RlLT5rZXkpOwotICBpZiAoc3AtPmRlbGV0ZV92YWx1ZSkKLSAgICAoKnNwLT5kZWxldGVfdmFsdWUpKG5vZGUtPnZhbHVlKTsKLQotICBmcmVlICgoY2hhciopIG5vZGUpOwotfQotCi0vKiBIZWxwIHNwbGF5IFNQIGFyb3VuZCBLRVkuICBQQVJFTlQgYW5kIEdSQU5EUEFSRU5UIGFyZSB0aGUgcGFyZW50Ci0gICBhbmQgZ3JhbmRwYXJlbnQsIHJlc3BlY3RpdmVseSwgb2YgTk9ERS4gICovCi0KLXN0YXRpYyBzcGxheV90cmVlX25vZGUKLXNwbGF5X3RyZWVfc3BsYXlfaGVscGVyIChzcCwga2V5LCBub2RlLCBwYXJlbnQsIGdyYW5kcGFyZW50KQotICAgICBzcGxheV90cmVlIHNwOwotICAgICBzcGxheV90cmVlX2tleSBrZXk7Ci0gICAgIHNwbGF5X3RyZWVfbm9kZSAqbm9kZTsKLSAgICAgc3BsYXlfdHJlZV9ub2RlICpwYXJlbnQ7Ci0gICAgIHNwbGF5X3RyZWVfbm9kZSAqZ3JhbmRwYXJlbnQ7Ci17Ci0gIHNwbGF5X3RyZWVfbm9kZSAqbmV4dDsKLSAgc3BsYXlfdHJlZV9ub2RlIG47Ci0gIGludCBjb21wYXJpc29uOwotICAKLSAgbiA9ICpub2RlOwotCi0gIGlmICghbikKLSAgICByZXR1cm4gKnBhcmVudDsKLQotICBjb21wYXJpc29uID0gKCpzcC0+Y29tcCkgKGtleSwgbi0+a2V5KTsKLQotICBpZiAoY29tcGFyaXNvbiA9PSAwKQotICAgIC8qIFdlJ3ZlIGZvdW5kIHRoZSB0YXJnZXQuICAqLwotICAgIG5leHQgPSAwOwotICBlbHNlIGlmIChjb21wYXJpc29uIDwgMCkKLSAgICAvKiBUaGUgdGFyZ2V0IGlzIHRvIHRoZSBsZWZ0LiAgKi8KLSAgICBuZXh0ID0gJm4tPmxlZnQ7Ci0gIGVsc2UgCi0gICAgLyogVGhlIHRhcmdldCBpcyB0byB0aGUgcmlnaHQuICAqLwotICAgIG5leHQgPSAmbi0+cmlnaHQ7Ci0KLSAgaWYgKG5leHQpCi0gICAgewotICAgICAgLyogQ29udGludWUgZG93biB0aGUgdHJlZS4gICovCi0gICAgICBuID0gc3BsYXlfdHJlZV9zcGxheV9oZWxwZXIgKHNwLCBrZXksIG5leHQsIG5vZGUsIHBhcmVudCk7Ci0KLSAgICAgIC8qIFRoZSByZWN1cnNpdmUgY2FsbCB3aWxsIGNoYW5nZSB0aGUgcGxhY2UgdG8gd2hpY2ggTk9ERQotCSBwb2ludHMuICAqLwotICAgICAgaWYgKCpub2RlICE9IG4pCi0JcmV0dXJuIG47Ci0gICAgfQotCi0gIGlmICghcGFyZW50KQotICAgIC8qIE5PREUgaXMgdGhlIHJvb3QuICBXZSBhcmUgZG9uZS4gICovCi0gICAgcmV0dXJuIG47Ci0KLSAgLyogRmlyc3QsIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBubyBncmFuZHBhcmVudCAoaS5lLiwKLSAgICAgKlBBUkVOVCBpcyB0aGUgcm9vdCBvZiB0aGUgdHJlZS4pICAqLwotICBpZiAoIWdyYW5kcGFyZW50KSAKLSAgICB7Ci0gICAgICBpZiAobiA9PSAoKnBhcmVudCktPmxlZnQpCi0JewotCSAgKm5vZGUgPSBuLT5yaWdodDsKLQkgIG4tPnJpZ2h0ID0gKnBhcmVudDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKm5vZGUgPSBuLT5sZWZ0OwotCSAgbi0+bGVmdCA9ICpwYXJlbnQ7Ci0JfQotICAgICAgKnBhcmVudCA9IG47Ci0gICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgLyogTmV4dCBoYW5kbGUgdGhlIGNhc2VzIHdoZXJlIGJvdGggTiBhbmQgKlBBUkVOVCBhcmUgbGVmdCBjaGlsZHJlbiwKLSAgICAgb3Igd2hlcmUgYm90aCBhcmUgcmlnaHQgY2hpbGRyZW4uICAqLwotICBpZiAobiA9PSAoKnBhcmVudCktPmxlZnQgJiYgKnBhcmVudCA9PSAoKmdyYW5kcGFyZW50KS0+bGVmdCkKLSAgICB7Ci0gICAgICBzcGxheV90cmVlX25vZGUgcCA9ICpwYXJlbnQ7Ci0KLSAgICAgICgqZ3JhbmRwYXJlbnQpLT5sZWZ0ID0gcC0+cmlnaHQ7Ci0gICAgICBwLT5yaWdodCA9ICpncmFuZHBhcmVudDsKLSAgICAgIHAtPmxlZnQgPSBuLT5yaWdodDsKLSAgICAgIG4tPnJpZ2h0ID0gcDsKLSAgICAgICpncmFuZHBhcmVudCA9IG47Ci0gICAgICByZXR1cm4gbjsgCi0gICAgfQotICBlbHNlIGlmICAobiA9PSAoKnBhcmVudCktPnJpZ2h0ICYmICpwYXJlbnQgPT0gKCpncmFuZHBhcmVudCktPnJpZ2h0KQotICAgIHsKLSAgICAgIHNwbGF5X3RyZWVfbm9kZSBwID0gKnBhcmVudDsKLQotICAgICAgKCpncmFuZHBhcmVudCktPnJpZ2h0ID0gcC0+bGVmdDsKLSAgICAgIHAtPmxlZnQgPSAqZ3JhbmRwYXJlbnQ7Ci0gICAgICBwLT5yaWdodCA9IG4tPmxlZnQ7Ci0gICAgICBuLT5sZWZ0ID0gcDsKLSAgICAgICpncmFuZHBhcmVudCA9IG47Ci0gICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgLyogRmluYWxseSwgZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJlIE4gaXMgYSBsZWZ0IGNoaWxkLCBidXQgKlBBUkVOVAotICAgICBpcyBhIHJpZ2h0IGNoaWxkLCBvciB2aWNlIHZlcnNhLiAgKi8KLSAgaWYgKG4gPT0gKCpwYXJlbnQpLT5sZWZ0KSAKLSAgICB7Ci0gICAgICAoKnBhcmVudCktPmxlZnQgPSBuLT5yaWdodDsKLSAgICAgIG4tPnJpZ2h0ID0gKnBhcmVudDsKLSAgICAgICgqZ3JhbmRwYXJlbnQpLT5yaWdodCA9IG4tPmxlZnQ7Ci0gICAgICBuLT5sZWZ0ID0gKmdyYW5kcGFyZW50OwotICAgICAgKmdyYW5kcGFyZW50ID0gbjsKLSAgICAgIHJldHVybiBuOwotICAgIH0gCi0gIGVsc2UKLSAgICB7Ci0gICAgICAoKnBhcmVudCktPnJpZ2h0ID0gbi0+bGVmdDsKLSAgICAgIG4tPmxlZnQgPSAqcGFyZW50OwotICAgICAgKCpncmFuZHBhcmVudCktPmxlZnQgPSBuLT5yaWdodDsKLSAgICAgIG4tPnJpZ2h0ID0gKmdyYW5kcGFyZW50OwotICAgICAgKmdyYW5kcGFyZW50ID0gbjsKLSAgICAgIHJldHVybiBuOwotICAgIH0KLX0KLQotLyogU3BsYXkgU1AgYXJvdW5kIEtFWS4gICovCi0KLXN0YXRpYyB2b2lkCi1zcGxheV90cmVlX3NwbGF5IChzcCwga2V5KQotICAgICBzcGxheV90cmVlIHNwOwotICAgICBzcGxheV90cmVlX2tleSBrZXk7Ci17Ci0gIGlmIChzcC0+cm9vdCA9PSAwKQotICAgIHJldHVybjsKLQotICBzcGxheV90cmVlX3NwbGF5X2hlbHBlciAoc3AsIGtleSwgJnNwLT5yb290LCAKLQkJCSAgIC8qZ3JhbmRwYXJlbnQ9Ki8wLCAvKnBhcmVudD0qLzApOyAKLX0KLQotLyogQ2FsbCBGTiwgcGFzc2luZyBpdCB0aGUgREFUQSwgZm9yIGV2ZXJ5IG5vZGUgYmVsb3cgTk9ERSwgYWxsIG9mCi0gICB3aGljaCBhcmUgZnJvbSBTUCwgZm9sbG93aW5nIGFuIGluLW9yZGVyIHRyYXZlcnNhbC4gIElmIEZOIGV2ZXJ5Ci0gICByZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUsIHRoZSBpdGVyYXRpb24gY2Vhc2VzIGltbWVkaWF0ZWx5LCBhbmQgdGhlCi0gICB2YWx1ZSBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIDAuICAqLwotCi1zdGF0aWMgaW50Ci1zcGxheV90cmVlX2ZvcmVhY2hfaGVscGVyIChzcCwgbm9kZSwgZm4sIGRhdGEpCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci0gICAgIHNwbGF5X3RyZWVfbm9kZSBub2RlOwotICAgICBzcGxheV90cmVlX2ZvcmVhY2hfZm4gZm47Ci0gICAgIHZvaWQqIGRhdGE7Ci17Ci0gIGludCB2YWw7Ci0KLSAgaWYgKCFub2RlKQotICAgIHJldHVybiAwOwotCi0gIHZhbCA9IHNwbGF5X3RyZWVfZm9yZWFjaF9oZWxwZXIgKHNwLCBub2RlLT5sZWZ0LCBmbiwgZGF0YSk7Ci0gIGlmICh2YWwpCi0gICAgcmV0dXJuIHZhbDsKLQotICB2YWwgPSAoKmZuKShub2RlLCBkYXRhKTsKLSAgaWYgKHZhbCkKLSAgICByZXR1cm4gdmFsOwotCi0gIHJldHVybiBzcGxheV90cmVlX2ZvcmVhY2hfaGVscGVyIChzcCwgbm9kZS0+cmlnaHQsIGZuLCBkYXRhKTsKLX0KLQotLyogQWxsb2NhdGUgYSBuZXcgc3BsYXkgdHJlZSwgdXNpbmcgQ09NUEFSRV9GTiB0byBjb21wYXJlIG5vZGVzLAotICAgREVMRVRFX0tFWV9GTiB0byBkZWFsbG9jYXRlIGtleXMsIGFuZCBERUxFVEVfVkFMVUVfRk4gdG8gZGVhbGxvY2F0ZQotICAgdmFsdWVzLiAgKi8KLQotc3BsYXlfdHJlZSAKLXNwbGF5X3RyZWVfbmV3IChjb21wYXJlX2ZuLCBkZWxldGVfa2V5X2ZuLCBkZWxldGVfdmFsdWVfZm4pCi0gICAgIHNwbGF5X3RyZWVfY29tcGFyZV9mbiBjb21wYXJlX2ZuOwotICAgICBzcGxheV90cmVlX2RlbGV0ZV9rZXlfZm4gZGVsZXRlX2tleV9mbjsKLSAgICAgc3BsYXlfdHJlZV9kZWxldGVfdmFsdWVfZm4gZGVsZXRlX3ZhbHVlX2ZuOwotewotICBzcGxheV90cmVlIHNwID0gKHNwbGF5X3RyZWUpIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNwbGF5X3RyZWUpKTsKLSAgc3AtPnJvb3QgPSAwOwotICBzcC0+Y29tcCA9IGNvbXBhcmVfZm47Ci0gIHNwLT5kZWxldGVfa2V5ID0gZGVsZXRlX2tleV9mbjsKLSAgc3AtPmRlbGV0ZV92YWx1ZSA9IGRlbGV0ZV92YWx1ZV9mbjsKLQotICByZXR1cm4gc3A7Ci19Ci0KLS8qIERlYWxsb2NhdGUgU1AuICAqLwotCi12b2lkIAotc3BsYXlfdHJlZV9kZWxldGUgKHNwKQotICAgICBzcGxheV90cmVlIHNwOwotewotICBzcGxheV90cmVlX2RlbGV0ZV9oZWxwZXIgKHNwLCBzcC0+cm9vdCk7Ci0gIGZyZWUgKChjaGFyKikgc3ApOwotfQotCi0vKiBJbnNlcnQgYSBuZXcgbm9kZSAoYXNzb2NpYXRpbmcgS0VZIHdpdGggREFUQSkgaW50byBTUC4gIElmIGEKLSAgIHByZXZpb3VzIG5vZGUgd2l0aCB0aGUgaW5kaWNhdGVkIEtFWSBleGlzdHMsIGl0cyBkYXRhIGlzIHJlcGxhY2VkCi0gICB3aXRoIHRoZSBuZXcgdmFsdWUuICAqLwotCi12b2lkIAotc3BsYXlfdHJlZV9pbnNlcnQgKHNwLCBrZXksIHZhbHVlKQotICAgICBzcGxheV90cmVlIHNwOwotICAgICBzcGxheV90cmVlX2tleSBrZXk7Ci0gICAgIHNwbGF5X3RyZWVfdmFsdWUgdmFsdWU7Ci17Ci0gIGludCBjb21wYXJpc29uOwotCi0gIHNwbGF5X3RyZWVfc3BsYXkgKHNwLCBrZXkpOwotCi0gIGlmIChzcC0+cm9vdCkKLSAgICBjb21wYXJpc29uID0gKCpzcC0+Y29tcCkoc3AtPnJvb3QtPmtleSwga2V5KTsKLQotICBpZiAoc3AtPnJvb3QgJiYgY29tcGFyaXNvbiA9PSAwKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSByb290IG9mIHRoZSB0cmVlIGFscmVhZHkgaGFzIHRoZSBpbmRpY2F0ZWQgS0VZLCBqdXN0Ci0JIHJlcGxhY2UgdGhlIHZhbHVlIHdpdGggVkFMVUUuICAqLwotICAgICAgaWYgKHNwLT5kZWxldGVfdmFsdWUpCi0JKCpzcC0+ZGVsZXRlX3ZhbHVlKShzcC0+cm9vdC0+dmFsdWUpOwotICAgICAgc3AtPnJvb3QtPnZhbHVlID0gdmFsdWU7Ci0gICAgfSAKLSAgZWxzZSAKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSwgYW5kIGluc2VydCBpdCBhdCB0aGUgcm9vdC4gICovCi0gICAgICBzcGxheV90cmVlX25vZGUgbm9kZTsKLSAgICAgIAotICAgICAgbm9kZSA9IChzcGxheV90cmVlX25vZGUpIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNwbGF5X3RyZWVfbm9kZSkpOwotICAgICAgbm9kZS0+a2V5ID0ga2V5OwotICAgICAgbm9kZS0+dmFsdWUgPSB2YWx1ZTsKLSAgICAgIAotICAgICAgaWYgKCFzcC0+cm9vdCkKLQlub2RlLT5sZWZ0ID0gbm9kZS0+cmlnaHQgPSAwOwotICAgICAgZWxzZSBpZiAoY29tcGFyaXNvbiA8IDApCi0JewotCSAgbm9kZS0+bGVmdCA9IHNwLT5yb290OwotCSAgbm9kZS0+cmlnaHQgPSBub2RlLT5sZWZ0LT5yaWdodDsKLQkgIG5vZGUtPmxlZnQtPnJpZ2h0ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbm9kZS0+cmlnaHQgPSBzcC0+cm9vdDsKLQkgIG5vZGUtPmxlZnQgPSBub2RlLT5yaWdodC0+bGVmdDsKLQkgIG5vZGUtPnJpZ2h0LT5sZWZ0ID0gMDsKLQl9Ci0KLSAgICBzcC0+cm9vdCA9IG5vZGU7Ci0gIH0KLX0KLQotLyogTG9va3VwIEtFWSBpbiBTUCwgcmV0dXJuaW5nIFZBTFVFIGlmIHByZXNlbnQsIGFuZCBOVUxMIAotICAgb3RoZXJ3aXNlLiAgKi8KLQotc3BsYXlfdHJlZV9ub2RlCi1zcGxheV90cmVlX2xvb2t1cCAoc3AsIGtleSkKLSAgICAgc3BsYXlfdHJlZSBzcDsKLSAgICAgc3BsYXlfdHJlZV9rZXkga2V5OwotewotICBzcGxheV90cmVlX3NwbGF5IChzcCwga2V5KTsKLQotICBpZiAoc3AtPnJvb3QgJiYgKCpzcC0+Y29tcCkoc3AtPnJvb3QtPmtleSwga2V5KSA9PSAwKQotICAgIHJldHVybiBzcC0+cm9vdDsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBDYWxsIEZOLCBwYXNzaW5nIGl0IHRoZSBEQVRBLCBmb3IgZXZlcnkgbm9kZSBpbiBTUCwgZm9sbG93aW5nIGFuCi0gICBpbi1vcmRlciB0cmF2ZXJzYWwuICBJZiBGTiBldmVyeSByZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUsIHRoZQotICAgaXRlcmF0aW9uIGNlYXNlcyBpbW1lZGlhdGVseSwgYW5kIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC4KLSAgIE90aGVyd2lzZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIDAuICAqLwotCi1pbnQKLXNwbGF5X3RyZWVfZm9yZWFjaCAoc3AsIGZuLCBkYXRhKQotICAgICBzcGxheV90cmVlIHNwOwotICAgICBzcGxheV90cmVlX2ZvcmVhY2hfZm4gZm47Ci0gICAgIHZvaWQgKmRhdGE7Ci17Ci0gIHJldHVybiBzcGxheV90cmVlX2ZvcmVhY2hfaGVscGVyIChzcCwgc3AtPnJvb3QsIGZuLCBkYXRhKTsKLX0KLQotLyogU3BsYXktdHJlZSBjb21wYXJpc29uIGZ1bmN0aW9uLCB0cmVhdGluZyB0aGUga2V5cyBhcyBpbnRzLiAgKi8KLQotaW50Ci1zcGxheV90cmVlX2NvbXBhcmVfaW50cyAoazEsIGsyKQotICAgICBzcGxheV90cmVlX2tleSBrMTsKLSAgICAgc3BsYXlfdHJlZV9rZXkgazI7Ci17Ci0gIGlmICgoaW50KSBrMSA8IChpbnQpIGsyKQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoKGludCkgazEgPiAoaW50KSBrMikKLSAgICByZXR1cm4gMTsKLSAgZWxzZSAKLSAgICByZXR1cm4gMDsKLX0KLQotLyogU3BsYXktdHJlZSBjb21wYXJpc29uIGZ1bmN0aW9uLCB0cmVhdGluZyB0aGUga2V5cyBhcyBwb2ludGVycy4gICovCi0KLWludAotc3BsYXlfdHJlZV9jb21wYXJlX3BvaW50ZXJzIChrMSwgazIpCi0gICAgIHNwbGF5X3RyZWVfa2V5IGsxOwotICAgICBzcGxheV90cmVlX2tleSBrMjsKLXsKLSAgaWYgKChjaGFyKikgazEgPCAoY2hhciopIGsyKQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoKGNoYXIqKSBrMSA+IChjaGFyKikgazIpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RyY2FzZWNtcC5jIGIvbGliaWJlcnR5L3N0cmNhc2VjbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FhOTMwYi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RyY2FzZWNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4NyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQgYW5kIHRoYXQgZHVlIGNyZWRpdCBpcyBnaXZlbgotICogdG8gdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleS4gVGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkKLSAqIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaGlzIHNvZnR3YXJlCi0gKiBpcyBwcm92aWRlZCBgYGFzIGlzJycgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKi8KLQotI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQotc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKXN0cmNhc2VjbXAuYwk1LjUgKEJlcmtlbGV5KSAxMS8yNC84NyI7Ci0jZW5kaWYgLyogTElCQ19TQ0NTIGFuZCBub3QgbGludCAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi0vKgotICogVGhpcyBhcnJheSBpcyBkZXNpZ25lZCBmb3IgbWFwcGluZyB1cHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXIKLSAqIHRvZ2V0aGVyIGZvciBhIGNhc2UgaW5kZXBlbmRlbnQgY29tcGFyaXNvbi4gIFRoZSBtYXBwaW5ncyBhcmUKLSAqIGJhc2VkIHVwb24gYXNjaWkgY2hhcmFjdGVyIHNlcXVlbmNlcy4KLSAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVjOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcm1hcFtdID0gewotCSh1YyknXDAwMCcsKHVjKSdcMDAxJywodWMpJ1wwMDInLCh1YyknXDAwMycsKHVjKSdcMDA0JywodWMpJ1wwMDUnLCh1YyknXDAwNicsKHVjKSdcMDA3JywKLQkodWMpJ1wwMTAnLCh1YyknXDAxMScsKHVjKSdcMDEyJywodWMpJ1wwMTMnLCh1YyknXDAxNCcsKHVjKSdcMDE1JywodWMpJ1wwMTYnLCh1YyknXDAxNycsCi0JKHVjKSdcMDIwJywodWMpJ1wwMjEnLCh1YyknXDAyMicsKHVjKSdcMDIzJywodWMpJ1wwMjQnLCh1YyknXDAyNScsKHVjKSdcMDI2JywodWMpJ1wwMjcnLAotCSh1YyknXDAzMCcsKHVjKSdcMDMxJywodWMpJ1wwMzInLCh1YyknXDAzMycsKHVjKSdcMDM0JywodWMpJ1wwMzUnLCh1YyknXDAzNicsKHVjKSdcMDM3JywKLQkodWMpJ1wwNDAnLCh1YyknXDA0MScsKHVjKSdcMDQyJywodWMpJ1wwNDMnLCh1YyknXDA0NCcsKHVjKSdcMDQ1JywodWMpJ1wwNDYnLCh1YyknXDA0NycsCi0JKHVjKSdcMDUwJywodWMpJ1wwNTEnLCh1YyknXDA1MicsKHVjKSdcMDUzJywodWMpJ1wwNTQnLCh1YyknXDA1NScsKHVjKSdcMDU2JywodWMpJ1wwNTcnLAotCSh1YyknXDA2MCcsKHVjKSdcMDYxJywodWMpJ1wwNjInLCh1YyknXDA2MycsKHVjKSdcMDY0JywodWMpJ1wwNjUnLCh1YyknXDA2NicsKHVjKSdcMDY3JywKLQkodWMpJ1wwNzAnLCh1YyknXDA3MScsKHVjKSdcMDcyJywodWMpJ1wwNzMnLCh1YyknXDA3NCcsKHVjKSdcMDc1JywodWMpJ1wwNzYnLCh1YyknXDA3NycsCi0JKHVjKSdcMTAwJywodWMpJ1wxNDEnLCh1YyknXDE0MicsKHVjKSdcMTQzJywodWMpJ1wxNDQnLCh1YyknXDE0NScsKHVjKSdcMTQ2JywodWMpJ1wxNDcnLAotCSh1YyknXDE1MCcsKHVjKSdcMTUxJywodWMpJ1wxNTInLCh1YyknXDE1MycsKHVjKSdcMTU0JywodWMpJ1wxNTUnLCh1YyknXDE1NicsKHVjKSdcMTU3JywKLQkodWMpJ1wxNjAnLCh1YyknXDE2MScsKHVjKSdcMTYyJywodWMpJ1wxNjMnLCh1YyknXDE2NCcsKHVjKSdcMTY1JywodWMpJ1wxNjYnLCh1YyknXDE2NycsCi0JKHVjKSdcMTcwJywodWMpJ1wxNzEnLCh1YyknXDE3MicsKHVjKSdcMTMzJywodWMpJ1wxMzQnLCh1YyknXDEzNScsKHVjKSdcMTM2JywodWMpJ1wxMzcnLAotCSh1YyknXDE0MCcsKHVjKSdcMTQxJywodWMpJ1wxNDInLCh1YyknXDE0MycsKHVjKSdcMTQ0JywodWMpJ1wxNDUnLCh1YyknXDE0NicsKHVjKSdcMTQ3JywKLQkodWMpJ1wxNTAnLCh1YyknXDE1MScsKHVjKSdcMTUyJywodWMpJ1wxNTMnLCh1YyknXDE1NCcsKHVjKSdcMTU1JywodWMpJ1wxNTYnLCh1YyknXDE1NycsCi0JKHVjKSdcMTYwJywodWMpJ1wxNjEnLCh1YyknXDE2MicsKHVjKSdcMTYzJywodWMpJ1wxNjQnLCh1YyknXDE2NScsKHVjKSdcMTY2JywodWMpJ1wxNjcnLAotCSh1YyknXDE3MCcsKHVjKSdcMTcxJywodWMpJ1wxNzInLCh1YyknXDE3MycsKHVjKSdcMTc0JywodWMpJ1wxNzUnLCh1YyknXDE3NicsKHVjKSdcMTc3JywKLQkodWMpJ1wyMDAnLCh1YyknXDIwMScsKHVjKSdcMjAyJywodWMpJ1wyMDMnLCh1YyknXDIwNCcsKHVjKSdcMjA1JywodWMpJ1wyMDYnLCh1YyknXDIwNycsCi0JKHVjKSdcMjEwJywodWMpJ1wyMTEnLCh1YyknXDIxMicsKHVjKSdcMjEzJywodWMpJ1wyMTQnLCh1YyknXDIxNScsKHVjKSdcMjE2JywodWMpJ1wyMTcnLAotCSh1YyknXDIyMCcsKHVjKSdcMjIxJywodWMpJ1wyMjInLCh1YyknXDIyMycsKHVjKSdcMjI0JywodWMpJ1wyMjUnLCh1YyknXDIyNicsKHVjKSdcMjI3JywKLQkodWMpJ1wyMzAnLCh1YyknXDIzMScsKHVjKSdcMjMyJywodWMpJ1wyMzMnLCh1YyknXDIzNCcsKHVjKSdcMjM1JywodWMpJ1wyMzYnLCh1YyknXDIzNycsCi0JKHVjKSdcMjQwJywodWMpJ1wyNDEnLCh1YyknXDI0MicsKHVjKSdcMjQzJywodWMpJ1wyNDQnLCh1YyknXDI0NScsKHVjKSdcMjQ2JywodWMpJ1wyNDcnLAotCSh1YyknXDI1MCcsKHVjKSdcMjUxJywodWMpJ1wyNTInLCh1YyknXDI1MycsKHVjKSdcMjU0JywodWMpJ1wyNTUnLCh1YyknXDI1NicsKHVjKSdcMjU3JywKLQkodWMpJ1wyNjAnLCh1YyknXDI2MScsKHVjKSdcMjYyJywodWMpJ1wyNjMnLCh1YyknXDI2NCcsKHVjKSdcMjY1JywodWMpJ1wyNjYnLCh1YyknXDI2NycsCi0JKHVjKSdcMjcwJywodWMpJ1wyNzEnLCh1YyknXDI3MicsKHVjKSdcMjczJywodWMpJ1wyNzQnLCh1YyknXDI3NScsKHVjKSdcMjc2JywodWMpJ1wyNzcnLAotCSh1YyknXDMwMCcsKHVjKSdcMzQxJywodWMpJ1wzNDInLCh1YyknXDM0MycsKHVjKSdcMzQ0JywodWMpJ1wzNDUnLCh1YyknXDM0NicsKHVjKSdcMzQ3JywKLQkodWMpJ1wzNTAnLCh1YyknXDM1MScsKHVjKSdcMzUyJywodWMpJ1wzNTMnLCh1YyknXDM1NCcsKHVjKSdcMzU1JywodWMpJ1wzNTYnLCh1YyknXDM1NycsCi0JKHVjKSdcMzYwJywodWMpJ1wzNjEnLCh1YyknXDM2MicsKHVjKSdcMzYzJywodWMpJ1wzNjQnLCh1YyknXDM2NScsKHVjKSdcMzY2JywodWMpJ1wzNjcnLAotCSh1YyknXDM3MCcsKHVjKSdcMzcxJywodWMpJ1wzNzInLCh1YyknXDMzMycsKHVjKSdcMzM0JywodWMpJ1wzMzUnLCh1YyknXDMzNicsKHVjKSdcMzM3JywKLQkodWMpJ1wzNDAnLCh1YyknXDM0MScsKHVjKSdcMzQyJywodWMpJ1wzNDMnLCh1YyknXDM0NCcsKHVjKSdcMzQ1JywodWMpJ1wzNDYnLCh1YyknXDM0NycsCi0JKHVjKSdcMzUwJywodWMpJ1wzNTEnLCh1YyknXDM1MicsKHVjKSdcMzUzJywodWMpJ1wzNTQnLCh1YyknXDM1NScsKHVjKSdcMzU2JywodWMpJ1wzNTcnLAotCSh1YyknXDM2MCcsKHVjKSdcMzYxJywodWMpJ1wzNjInLCh1YyknXDM2MycsKHVjKSdcMzY0JywodWMpJ1wzNjUnLCh1YyknXDM2NicsKHVjKSdcMzY3JywKLQkodWMpJ1wzNzAnLCh1YyknXDM3MScsKHVjKSdcMzcyJywodWMpJ1wzNzMnLCh1YyknXDM3NCcsKHVjKSdcMzc1JywodWMpJ1wzNzYnLCh1YyknXDM3NycsCi19OwotCi1pbnQKLXN0cmNhc2VjbXAoczEsIHMyKQotICAgIGNvbnN0IGNoYXIgKnMxLCAqczI7Ci17Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciB1MSwgdTI7Ci0KLSAgICBmb3IgKDs7KSB7Ci0JdTEgPSAodW5zaWduZWQgY2hhcikgKnMxKys7Ci0JdTIgPSAodW5zaWduZWQgY2hhcikgKnMyKys7Ci0JaWYgKGNoYXJtYXBbdTFdICE9IGNoYXJtYXBbdTJdKSB7Ci0JICAgIHJldHVybiBjaGFybWFwW3UxXSAtIGNoYXJtYXBbdTJdOwotCX0KLQlpZiAodTEgPT0gJ1wwJykgewotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RyY2hyLmMgYi9saWJpYmVydHkvc3RyY2hyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MDQ4MGYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cmNoci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogUG9ydGFibGUgdmVyc2lvbiBvZiBzdHJjaHIoKQotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLS8qCi1OQU1FCi0Jc3RyY2hyIC0tIHJldHVybiBwb2ludGVyIHRvIGZpcnN0IG9jY3VyYW5jZSBvZiBhIGNoYXJhY3RlcgotCi1TWU5PUFNJUwotCWNoYXIgKnN0cmNociAoY29uc3QgY2hhciAqcywgaW50IGMpCi0KLURFU0NSSVBUSU9OCi0JUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG9jY3VyYW5jZSBvZiBjaGFyYWN0ZXIgQyBpbgotCXN0cmluZyBTLCBvciBhIE5VTEwgcG9pbnRlciBpZiBubyBvY2N1cmFuY2UgaXMgZm91bmQuCi0JCi1CVUdTCi0JQmVoYXZpb3Igd2hlbiBjaGFyYWN0ZXIgaXMgdGhlIG51bGwgY2hhcmFjdGVyIGlzIGltcGxlbWVudGF0aW9uCi0JZGVwZW5kZW50LgotKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLWNoYXIgKgotc3RyY2hyIChzLCBjKQotICByZWdpc3RlciBjb25zdCBjaGFyICpzOwotICBpbnQgYzsKLXsKLSAgZG8gewotICAgIGlmICgqcyA9PSBjKQotICAgICAgewotCXJldHVybiAoY2hhciopczsKLSAgICAgIH0KLSAgfSB3aGlsZSAoKnMrKyk7Ci0gIHJldHVybiAoMCk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RyZHVwLmMgYi9saWJpYmVydHkvc3RyZHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ODViMzQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cmR1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotY2hhciAqCi1zdHJkdXAocykKLSAgICAgY2hhciAqczsKLXsKLSAgICBjaGFyICpyZXN1bHQgPSAoY2hhciopbWFsbG9jKHN0cmxlbihzKSArIDEpOwotICAgIGlmIChyZXN1bHQgPT0gKGNoYXIqKTApCi0JcmV0dXJuIChjaGFyKikwOwotICAgIHN0cmNweShyZXN1bHQsIHMpOwotICAgIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RyZXJyb3IuYyBiL2xpYmliZXJ0eS9zdHJlcnJvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDRjYzc1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJlcnJvci5jCisrKyAvZGV2L251bGwKQEAgLTEsODMxICswLDAgQEAKLS8qIEV4dGVuZGVkIHN1cHBvcnQgZm9yIHVzaW5nIGVycm5vIHZhbHVlcy4KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAgZm5mQGN5Z251cy5jb20KLSAgIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gIC0tUGVyIEJvdGhuZXIuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWZkZWYgSEFWRV9TWVNfRVJSTElTVAotLyogTm90ZSB0aGF0IGVycm5vLmggKG5vdCBzdXJlIHdoYXQgT1MpIG9yIHN0ZGlvLmggKEJTRCA0LjQsIGF0IGxlYXN0KQotICAgbWlnaHQgZGVjbGFyZSBzeXNfZXJybGlzdCBpbiBhIHdheSB0aGF0IHRoZSBjb21waWxlciBtaWdodCBjb25zaWRlcgotICAgaW5jb21wYXRpYmxlIHdpdGggb3VyIGxhdGVyIGRlY2xhcmF0aW9uLCBwZXJoYXBzIGJ5IHVzaW5nIGNvbnN0Ci0gICBhdHRyaWJ1dGVzLiAgU28gd2UgaGlkZSB0aGUgZGVjbGFyYXRpb24gaW4gZXJybm8uaCAoaWYgYW55KSB1c2luZyBhCi0gICBtYWNyby4gKi8KLSNkZWZpbmUgc3lzX2Vycmxpc3Qgc3lzX2Vycmxpc3RfXwotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpZmRlZiBIQVZFX1NZU19FUlJMSVNUCi0jdW5kZWYgc3lzX2Vycmxpc3QKLSNlbmRpZgotCi0vKiAgUm91dGluZXMgaW1wb3J0ZWQgZnJvbSBzdGFuZGFyZCBDIHJ1bnRpbWUgbGlicmFyaWVzLiAqLwotCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLWV4dGVybiB2b2lkICptYWxsb2MgKHNpemVfdCBzaXplKTsJCQkJLyogNC4xMC4zLjMgKi8KLWV4dGVybiB2b2lkICptZW1zZXQgKHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7CQkJLyogNC4xMS42LjEgKi8KLSNlbHNlCS8qICFfX1NURENfXyAqLwotZXh0ZXJuIGNoYXIgKm1hbGxvYyAoKTsJCS8qIFN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0ZXIgKi8KLWV4dGVybiBjaGFyICptZW1zZXQgKCk7Ci0jZW5kaWYJLyogX19TVERDX18gKi8KLQotI2lmbmRlZiBNQVgKLSMgIGRlZmluZSBNQVgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGluaXRfZXJyb3JfdGFibGVzIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVHJhbnNsYXRpb24gdGFibGUgZm9yIGVycm5vIHZhbHVlcy4gIFNlZSBpbnRybygyKSBpbiBtb3N0IFVOSVggc3lzdGVtcwotICAgUHJvZ3JhbW1lcnMgUmVmZXJlbmNlIE1hbnVhbHMuCi0KLSAgIE5vdGUgdGhhdCB0aGlzIHRhYmxlIGlzIGdlbmVyYWxseSBvbmx5IGFjY2Vzc2VkIHdoZW4gaXQgaXMgdXNlZCBhdCBydW50aW1lCi0gICB0byBpbml0aWFsaXplIGVycm5vIG5hbWUgYW5kIG1lc3NhZ2UgdGFibGVzIHRoYXQgYXJlIGluZGV4ZWQgYnkgZXJybm8KLSAgIHZhbHVlLgotCi0gICBOb3QgYWxsIG9mIHRoZXNlIGVycm5vcyB3aWxsIGV4aXN0IG9uIGFsbCBzeXN0ZW1zLiAgVGhpcyB0YWJsZSBpcyB0aGUgb25seQotICAgdGhpbmcgdGhhdCBzaG91bGQgaGF2ZSB0byBiZSB1cGRhdGVkIGFzIG5ldyBlcnJvciBudW1iZXJzIGFyZSBpbnRyb2R1Y2VkLgotICAgSXQncyBzb3J0IG9mIHVnbHksIGJ1dCBhdCBsZWFzdCBpdHMgcG9ydGFibGUuICovCi0KLXN0cnVjdCBlcnJvcl9pbmZvCi17Ci0gIGludCB2YWx1ZTsJCS8qIFRoZSBudW1lcmljIHZhbHVlIGZyb20gPGVycm5vLmg+ICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7CS8qIFRoZSBlcXVpdmFsZW50IHN5bWJvbGljIHZhbHVlICovCi0jaWZuZGVmIEhBVkVfU1lTX0VSUkxJU1QKLSAgY29uc3QgY2hhciAqbXNnOwkvKiBTaG9ydCBtZXNzYWdlIGFib3V0IHRoaXMgdmFsdWUgKi8KLSNlbmRpZgotfTsKLQotI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCi0jICAgZGVmaW5lIEVOVFJZKHZhbHVlLCBuYW1lLCBtc2cpCXt2YWx1ZSwgbmFtZSwgbXNnfQotI2Vsc2UKLSMgICBkZWZpbmUgRU5UUlkodmFsdWUsIG5hbWUsIG1zZykJe3ZhbHVlLCBuYW1lfQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZXJyb3JfaW5mbyBlcnJvcl90YWJsZVtdID0KLXsKLSNpZiBkZWZpbmVkIChFUEVSTSkKLSAgRU5UUlkoRVBFUk0sICJFUEVSTSIsICJOb3Qgb3duZXIiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0VOVCkKLSAgRU5UUlkoRU5PRU5ULCAiRU5PRU5UIiwgIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVTUkNIKQotICBFTlRSWShFU1JDSCwgIkVTUkNIIiwgIk5vIHN1Y2ggcHJvY2VzcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlOVFIpCi0gIEVOVFJZKEVJTlRSLCAiRUlOVFIiLCAiSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJTykKLSAgRU5UUlkoRUlPLCAiRUlPIiwgIkkvTyBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5YSU8pCi0gIEVOVFJZKEVOWElPLCAiRU5YSU8iLCAiTm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRTJCSUcpCi0gIEVOVFJZKEUyQklHLCAiRTJCSUciLCAiQXJnIGxpc3QgdG9vIGxvbmciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0VYRUMpCi0gIEVOVFJZKEVOT0VYRUMsICJFTk9FWEVDIiwgIkV4ZWMgZm9ybWF0IGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFERikKLSAgRU5UUlkoRUJBREYsICJFQkFERiIsICJCYWQgZmlsZSBudW1iZXIiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVDSElMRCkKLSAgRU5UUlkoRUNISUxELCAiRUNISUxEIiwgIk5vIGNoaWxkIHByb2Nlc3NlcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVdPVUxEQkxPQ0spCS8qIFB1dCBiZWZvcmUgRUFHQUlOLCBzb21ldGltZXMgYWxpYXNlZCAqLwotICBFTlRSWShFV09VTERCTE9DSywgIkVXT1VMREJMT0NLIiwgIk9wZXJhdGlvbiB3b3VsZCBibG9jayIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFHQUlOKQotICBFTlRSWShFQUdBSU4sICJFQUdBSU4iLCAiTm8gbW9yZSBwcm9jZXNzZXMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT01FTSkKLSAgRU5UUlkoRU5PTUVNLCAiRU5PTUVNIiwgIk5vdCBlbm91Z2ggc3BhY2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVBQ0NFUykKLSAgRU5UUlkoRUFDQ0VTLCAiRUFDQ0VTIiwgIlBlcm1pc3Npb24gZGVuaWVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFRkFVTFQpCi0gIEVOVFJZKEVGQVVMVCwgIkVGQVVMVCIsICJCYWQgYWRkcmVzcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PVEJMSykKLSAgRU5UUlkoRU5PVEJMSywgIkVOT1RCTEsiLCAiQmxvY2sgZGV2aWNlIHJlcXVpcmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQlVTWSkKLSAgRU5UUlkoRUJVU1ksICJFQlVTWSIsICJEZXZpY2UgYnVzeSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUVYSVNUKQotICBFTlRSWShFRVhJU1QsICJFRVhJU1QiLCAiRmlsZSBleGlzdHMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVYREVWKQotICBFTlRSWShFWERFViwgIkVYREVWIiwgIkNyb3NzLWRldmljZSBsaW5rIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9ERVYpCi0gIEVOVFJZKEVOT0RFViwgIkVOT0RFViIsICJObyBzdWNoIGRldmljZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PVERJUikKLSAgRU5UUlkoRU5PVERJUiwgIkVOT1RESVIiLCAiTm90IGEgZGlyZWN0b3J5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSVNESVIpCi0gIEVOVFJZKEVJU0RJUiwgIkVJU0RJUiIsICJJcyBhIGRpcmVjdG9yeSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlOVkFMKQotICBFTlRSWShFSU5WQUwsICJFSU5WQUwiLCAiSW52YWxpZCBhcmd1bWVudCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5GSUxFKQotICBFTlRSWShFTkZJTEUsICJFTkZJTEUiLCAiRmlsZSB0YWJsZSBvdmVyZmxvdyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU1GSUxFKQotICBFTlRSWShFTUZJTEUsICJFTUZJTEUiLCAiVG9vIG1hbnkgb3BlbiBmaWxlcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PVFRZKQotICBFTlRSWShFTk9UVFksICJFTk9UVFkiLCAiTm90IGEgdHlwZXdyaXRlciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVRYVEJTWSkKLSAgRU5UUlkoRVRYVEJTWSwgIkVUWFRCU1kiLCAiVGV4dCBmaWxlIGJ1c3kiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVGQklHKQotICBFTlRSWShFRkJJRywgIkVGQklHIiwgIkZpbGUgdG9vIGxhcmdlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9TUEMpCi0gIEVOVFJZKEVOT1NQQywgIkVOT1NQQyIsICJObyBzcGFjZSBsZWZ0IG9uIGRldmljZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVNQSVBFKQotICBFTlRSWShFU1BJUEUsICJFU1BJUEUiLCAiSWxsZWdhbCBzZWVrIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUk9GUykKLSAgRU5UUlkoRVJPRlMsICJFUk9GUyIsICJSZWFkLW9ubHkgZmlsZSBzeXN0ZW0iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVNTElOSykKLSAgRU5UUlkoRU1MSU5LLCAiRU1MSU5LIiwgIlRvbyBtYW55IGxpbmtzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUElQRSkKLSAgRU5UUlkoRVBJUEUsICJFUElQRSIsICJCcm9rZW4gcGlwZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRURPTSkKLSAgRU5UUlkoRURPTSwgIkVET00iLCAiTWF0aCBhcmd1bWVudCBvdXQgb2YgZG9tYWluIG9mIGZ1bmMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVSQU5HRSkKLSAgRU5UUlkoRVJBTkdFLCAiRVJBTkdFIiwgIk1hdGggcmVzdWx0IG5vdCByZXByZXNlbnRhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9NU0cpCi0gIEVOVFJZKEVOT01TRywgIkVOT01TRyIsICJObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlEUk0pCi0gIEVOVFJZKEVJRFJNLCAiRUlEUk0iLCAiSWRlbnRpZmllciByZW1vdmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQ0hSTkcpCi0gIEVOVFJZKEVDSFJORywgIkVDSFJORyIsICJDaGFubmVsIG51bWJlciBvdXQgb2YgcmFuZ2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMMk5TWU5DKQotICBFTlRSWShFTDJOU1lOQywgIkVMMk5TWU5DIiwgIkxldmVsIDIgbm90IHN5bmNocm9uaXplZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUwzSExUKQotICBFTlRSWShFTDNITFQsICJFTDNITFQiLCAiTGV2ZWwgMyBoYWx0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMM1JTVCkKLSAgRU5UUlkoRUwzUlNULCAiRUwzUlNUIiwgIkxldmVsIDMgcmVzZXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMTlJORykKLSAgRU5UUlkoRUxOUk5HLCAiRUxOUk5HIiwgIkxpbmsgbnVtYmVyIG91dCBvZiByYW5nZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVVOQVRDSCkKLSAgRU5UUlkoRVVOQVRDSCwgIkVVTkFUQ0giLCAiUHJvdG9jb2wgZHJpdmVyIG5vdCBhdHRhY2hlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PQ1NJKQotICBFTlRSWShFTk9DU0ksICJFTk9DU0kiLCAiTm8gQ1NJIHN0cnVjdHVyZSBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMMkhMVCkKLSAgRU5UUlkoRUwySExULCAiRUwySExUIiwgIkxldmVsIDIgaGFsdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFREVBRExLKQotICBFTlRSWShFREVBRExLLCAiRURFQURMSyIsICJEZWFkbG9jayBjb25kaXRpb24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0xDSykKLSAgRU5UUlkoRU5PTENLLCAiRU5PTENLIiwgIk5vIHJlY29yZCBsb2NrcyBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVCQURFKQotICBFTlRSWShFQkFERSwgIkVCQURFIiwgIkludmFsaWQgZXhjaGFuZ2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVCQURSKQotICBFTlRSWShFQkFEUiwgIkVCQURSIiwgIkludmFsaWQgcmVxdWVzdCBkZXNjcmlwdG9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFWEZVTEwpCi0gIEVOVFJZKEVYRlVMTCwgIkVYRlVMTCIsICJFeGNoYW5nZSBmdWxsIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9BTk8pCi0gIEVOVFJZKEVOT0FOTywgIkVOT0FOTyIsICJObyBhbm9kZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJBRFJRQykKLSAgRU5UUlkoRUJBRFJRQywgIkVCQURSUUMiLCAiSW52YWxpZCByZXF1ZXN0IGNvZGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVCQURTTFQpCi0gIEVOVFJZKEVCQURTTFQsICJFQkFEU0xUIiwgIkludmFsaWQgc2xvdCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRURFQURMT0NLKQotICBFTlRSWShFREVBRExPQ0ssICJFREVBRExPQ0siLCAiRmlsZSBsb2NraW5nIGRlYWRsb2NrIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkZPTlQpCi0gIEVOVFJZKEVCRk9OVCwgIkVCRk9OVCIsICJCYWQgZm9udCBmaWxlIGZvcm1hdCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PU1RSKQotICBFTlRSWShFTk9TVFIsICJFTk9TVFIiLCAiRGV2aWNlIG5vdCBhIHN0cmVhbSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PREFUQSkKLSAgRU5UUlkoRU5PREFUQSwgIkVOT0RBVEEiLCAiTm8gZGF0YSBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVUSU1FKQotICBFTlRSWShFVElNRSwgIkVUSU1FIiwgIlRpbWVyIGV4cGlyZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1NSKQotICBFTlRSWShFTk9TUiwgIkVOT1NSIiwgIk91dCBvZiBzdHJlYW1zIHJlc291cmNlcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PTkVUKQotICBFTlRSWShFTk9ORVQsICJFTk9ORVQiLCAiTWFjaGluZSBpcyBub3Qgb24gdGhlIG5ldHdvcmsiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1BLRykKLSAgRU5UUlkoRU5PUEtHLCAiRU5PUEtHIiwgIlBhY2thZ2Ugbm90IGluc3RhbGxlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVJFTU9URSkKLSAgRU5UUlkoRVJFTU9URSwgIkVSRU1PVEUiLCAiT2JqZWN0IGlzIHJlbW90ZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PTElOSykKLSAgRU5UUlkoRU5PTElOSywgIkVOT0xJTksiLCAiTGluayBoYXMgYmVlbiBzZXZlcmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQURWKQotICBFTlRSWShFQURWLCAiRUFEViIsICJBZHZlcnRpc2UgZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVTUk1OVCkKLSAgRU5UUlkoRVNSTU5ULCAiRVNSTU5UIiwgIlNybW91bnQgZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVDT01NKQotICBFTlRSWShFQ09NTSwgIkVDT01NIiwgIkNvbW11bmljYXRpb24gZXJyb3Igb24gc2VuZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVBST1RPKQotICBFTlRSWShFUFJPVE8sICJFUFJPVE8iLCAiUHJvdG9jb2wgZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVNVUxUSUhPUCkKLSAgRU5UUlkoRU1VTFRJSE9QLCAiRU1VTFRJSE9QIiwgIk11bHRpaG9wIGF0dGVtcHRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRURPVERPVCkKLSAgRU5UUlkoRURPVERPVCwgIkVET1RET1QiLCAiUkZTIHNwZWNpZmljIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFETVNHKQotICBFTlRSWShFQkFETVNHLCAiRUJBRE1TRyIsICJOb3QgYSBkYXRhIG1lc3NhZ2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOQU1FVE9PTE9ORykKLSAgRU5UUlkoRU5BTUVUT09MT05HLCAiRU5BTUVUT09MT05HIiwgIkZpbGUgbmFtZSB0b28gbG9uZyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU9WRVJGTE9XKQotICBFTlRSWShFT1ZFUkZMT1csICJFT1ZFUkZMT1ciLCAiVmFsdWUgdG9vIGxhcmdlIGZvciBkZWZpbmVkIGRhdGEgdHlwZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PVFVOSVEpCi0gIEVOVFJZKEVOT1RVTklRLCAiRU5PVFVOSVEiLCAiTmFtZSBub3QgdW5pcXVlIG9uIG5ldHdvcmsiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVCQURGRCkKLSAgRU5UUlkoRUJBREZELCAiRUJBREZEIiwgIkZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVSRU1DSEcpCi0gIEVOVFJZKEVSRU1DSEcsICJFUkVNQ0hHIiwgIlJlbW90ZSBhZGRyZXNzIGNoYW5nZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMSUJBQ0MpCi0gIEVOVFJZKEVMSUJBQ0MsICJFTElCQUNDIiwgIkNhbiBub3QgYWNjZXNzIGEgbmVlZGVkIHNoYXJlZCBsaWJyYXJ5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTElCQkFEKQotICBFTlRSWShFTElCQkFELCAiRUxJQkJBRCIsICJBY2Nlc3NpbmcgYSBjb3JydXB0ZWQgc2hhcmVkIGxpYnJhcnkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMSUJTQ04pCi0gIEVOVFJZKEVMSUJTQ04sICJFTElCU0NOIiwgIi5saWIgc2VjdGlvbiBpbiBhLm91dCBjb3JydXB0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMSUJNQVgpCi0gIEVOVFJZKEVMSUJNQVgsICJFTElCTUFYIiwgIkF0dGVtcHRpbmcgdG8gbGluayBpbiB0b28gbWFueSBzaGFyZWQgbGlicmFyaWVzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTElCRVhFQykKLSAgRU5UUlkoRUxJQkVYRUMsICJFTElCRVhFQyIsICJDYW5ub3QgZXhlYyBhIHNoYXJlZCBsaWJyYXJ5IGRpcmVjdGx5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSUxTRVEpCi0gIEVOVFJZKEVJTFNFUSwgIkVJTFNFUSIsICJJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1NZUykKLSAgRU5UUlkoRU5PU1lTLCAiRU5PU1lTIiwgIk9wZXJhdGlvbiBub3QgYXBwbGljYWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUxPT1ApCi0gIEVOVFJZKEVMT09QLCAiRUxPT1AiLCAiVG9vIG1hbnkgc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVSRVNUQVJUKQotICBFTlRSWShFUkVTVEFSVCwgIkVSRVNUQVJUIiwgIkludGVycnVwdGVkIHN5c3RlbSBjYWxsIHNob3VsZCBiZSByZXN0YXJ0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVTVFJQSVBFKQotICBFTlRSWShFU1RSUElQRSwgIkVTVFJQSVBFIiwgIlN0cmVhbXMgcGlwZSBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PVEVNUFRZKQotICBFTlRSWShFTk9URU1QVFksICJFTk9URU1QVFkiLCAiRGlyZWN0b3J5IG5vdCBlbXB0eSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVVTRVJTKQotICBFTlRSWShFVVNFUlMsICJFVVNFUlMiLCAiVG9vIG1hbnkgdXNlcnMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RTT0NLKQotICBFTlRSWShFTk9UU09DSywgIkVOT1RTT0NLIiwgIlNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRURFU1RBRERSUkVRKQotICBFTlRSWShFREVTVEFERFJSRVEsICJFREVTVEFERFJSRVEiLCAiRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU1TR1NJWkUpCi0gIEVOVFJZKEVNU0dTSVpFLCAiRU1TR1NJWkUiLCAiTWVzc2FnZSB0b28gbG9uZyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVBST1RPVFlQRSkKLSAgRU5UUlkoRVBST1RPVFlQRSwgIkVQUk9UT1RZUEUiLCAiUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9QUk9UT09QVCkKLSAgRU5UUlkoRU5PUFJPVE9PUFQsICJFTk9QUk9UT09QVCIsICJQcm90b2NvbCBub3QgYXZhaWxhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUFJPVE9OT1NVUFBPUlQpCi0gIEVOVFJZKEVQUk9UT05PU1VQUE9SVCwgIkVQUk9UT05PU1VQUE9SVCIsICJQcm90b2NvbCBub3Qgc3VwcG9ydGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU09DS1ROT1NVUFBPUlQpCi0gIEVOVFJZKEVTT0NLVE5PU1VQUE9SVCwgIkVTT0NLVE5PU1VQUE9SVCIsICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFT1BOT1RTVVBQKQotICBFTlRSWShFT1BOT1RTVVBQLCAiRU9QTk9UU1VQUCIsICJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiB0cmFuc3BvcnQgZW5kcG9pbnQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVQRk5PU1VQUE9SVCkKLSAgRU5UUlkoRVBGTk9TVVBQT1JULCAiRVBGTk9TVVBQT1JUIiwgIlByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQUZOT1NVUFBPUlQpCi0gIEVOVFJZKEVBRk5PU1VQUE9SVCwgIkVBRk5PU1VQUE9SVCIsICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQUREUklOVVNFKQotICBFTlRSWShFQUREUklOVVNFLCAiRUFERFJJTlVTRSIsICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQUREUk5PVEFWQUlMKQotICBFTlRSWShFQUREUk5PVEFWQUlMLCAiRUFERFJOT1RBVkFJTCIsIkNhbm5vdCBhc3NpZ24gcmVxdWVzdGVkIGFkZHJlc3MiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVORVRET1dOKQotICBFTlRSWShFTkVURE9XTiwgIkVORVRET1dOIiwgIk5ldHdvcmsgaXMgZG93biIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5FVFVOUkVBQ0gpCi0gIEVOVFJZKEVORVRVTlJFQUNILCAiRU5FVFVOUkVBQ0giLCAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5FVFJFU0VUKQotICBFTlRSWShFTkVUUkVTRVQsICJFTkVUUkVTRVQiLCAiTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gYmVjYXVzZSBvZiByZXNldCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUNPTk5BQk9SVEVEKQotICBFTlRSWShFQ09OTkFCT1JURUQsICJFQ09OTkFCT1JURUQiLCAiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVDT05OUkVTRVQpCi0gIEVOVFJZKEVDT05OUkVTRVQsICJFQ09OTlJFU0VUIiwgIkNvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PQlVGUykKLSAgRU5UUlkoRU5PQlVGUywgIkVOT0JVRlMiLCAiTm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlTQ09OTikKLSAgRU5UUlkoRUlTQ09OTiwgIkVJU0NPTk4iLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIGFscmVhZHkgY29ubmVjdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9UQ09OTikKLSAgRU5UUlkoRU5PVENPTk4sICJFTk9UQ09OTiIsICJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgbm90IGNvbm5lY3RlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVNIVVRET1dOKQotICBFTlRSWShFU0hVVERPV04sICJFU0hVVERPV04iLCAiQ2Fubm90IHNlbmQgYWZ0ZXIgdHJhbnNwb3J0IGVuZHBvaW50IHNodXRkb3duIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFVE9PTUFOWVJFRlMpCi0gIEVOVFJZKEVUT09NQU5ZUkVGUywgIkVUT09NQU5ZUkVGUyIsICJUb28gbWFueSByZWZlcmVuY2VzOiBjYW5ub3Qgc3BsaWNlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFVElNRURPVVQpCi0gIEVOVFJZKEVUSU1FRE9VVCwgIkVUSU1FRE9VVCIsICJDb25uZWN0aW9uIHRpbWVkIG91dCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUNPTk5SRUZVU0VEKQotICBFTlRSWShFQ09OTlJFRlVTRUQsICJFQ09OTlJFRlVTRUQiLCAiQ29ubmVjdGlvbiByZWZ1c2VkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSE9TVERPV04pCi0gIEVOVFJZKEVIT1NURE9XTiwgIkVIT1NURE9XTiIsICJIb3N0IGlzIGRvd24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVIT1NUVU5SRUFDSCkKLSAgRU5UUlkoRUhPU1RVTlJFQUNILCAiRUhPU1RVTlJFQUNIIiwgIk5vIHJvdXRlIHRvIGhvc3QiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVBTFJFQURZKQotICBFTlRSWShFQUxSRUFEWSwgIkVBTFJFQURZIiwgIk9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSU5QUk9HUkVTUykKLSAgRU5UUlkoRUlOUFJPR1JFU1MsICJFSU5QUk9HUkVTUyIsICJPcGVyYXRpb24gbm93IGluIHByb2dyZXNzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU1RBTEUpCi0gIEVOVFJZKEVTVEFMRSwgIkVTVEFMRSIsICJTdGFsZSBORlMgZmlsZSBoYW5kbGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVVQ0xFQU4pCi0gIEVOVFJZKEVVQ0xFQU4sICJFVUNMRUFOIiwgIlN0cnVjdHVyZSBuZWVkcyBjbGVhbmluZyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PVE5BTSkKLSAgRU5UUlkoRU5PVE5BTSwgIkVOT1ROQU0iLCAiTm90IGEgWEVOSVggbmFtZWQgdHlwZSBmaWxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTkFWQUlMKQotICBFTlRSWShFTkFWQUlMLCAiRU5BVkFJTCIsICJObyBYRU5JWCBzZW1hcGhvcmVzIGF2YWlsYWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlTTkFNKQotICBFTlRSWShFSVNOQU0sICJFSVNOQU0iLCAiSXMgYSBuYW1lZCB0eXBlIGZpbGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVSRU1PVEVJTykKLSAgRU5UUlkoRVJFTU9URUlPLCAiRVJFTU9URUlPIiwgIlJlbW90ZSBJL08gZXJyb3IiKSwKLSNlbmRpZgotICBFTlRSWSgwLCBOVUxMLCBOVUxMKQotfTsKLQotI2lmZGVmIEVWTVNFUlIKLS8qIFRoaXMgaXMgbm90IGluIHRoZSB0YWJsZSwgYmVjYXVzZSB0aGUgbnVtZXJpYyB2YWx1ZSBvZiBFVk1TRVJSICgzMjc2NykKLSAgIGxpZXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2Ygc3lzX2Vycmxpc3RbXS4gICovCi1zdGF0aWMgc3RydWN0IHsgaW50IHZhbHVlOyBjb25zdCBjaGFyICpuYW1lLCAqbXNnOyB9Ci0gIGV2bXNlcnIgPSB7IEVWTVNFUlIsICJFVk1TRVJSIiwgIlZNUy1zcGVjaWZpYyBlcnJvciIgfTsKLSNlbmRpZgotCi0vKiBUcmFuc2xhdGlvbiB0YWJsZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGF0IHJ1bnRpbWUuICBJbmRleGVkIGJ5IHRoZQotICAgZXJybm8gdmFsdWUgdG8gZmluZCB0aGUgZXF1aXZhbGVudCBzeW1ib2xpYyB2YWx1ZS4gKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiplcnJvcl9uYW1lczsKLXN0YXRpYyBpbnQgbnVtX2Vycm9yX25hbWVzID0gMDsKLQotLyogVHJhbnNsYXRpb24gdGFibGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBhdCBydW50aW1lLCBpZiBpdCBkb2VzIG5vdAotICAgYWxyZWFkeSBleGlzdCBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudC4gIEluZGV4ZWQgYnkgdGhlIGVycm5vIHZhbHVlIHRvIGZpbmQKLSAgIHRoZSBkZXNjcmlwdGl2ZSBzdHJpbmcuCi0KLSAgIFdlIGRvbid0IGV4cG9ydCBpdCBmb3IgdXNlIGluIG90aGVyIG1vZHVsZXMgYmVjYXVzZSBldmVuIHRob3VnaCBpdCBoYXMgdGhlCi0gICBzYW1lIG5hbWUsIGl0IGRpZmZlcnMgZnJvbSBvdGhlciBpbXBsZW1lbnRhdGlvbnMgaW4gdGhhdCBpdCBpcyBkeW5hbWljYWxseQotICAgaW5pdGlhbGl6ZWQgcmF0aGVyIHRoYW4gc3RhdGljYWxseSBpbml0aWFsaXplZC4gKi8KLQotI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCi0KLXN0YXRpYyBpbnQgc3lzX25lcnI7Ci1zdGF0aWMgY29uc3QgY2hhciAqKnN5c19lcnJsaXN0OwotCi0jZWxzZQotCi1leHRlcm4gaW50IHN5c19uZXJyOwotZXh0ZXJuIGNoYXIgKnN5c19lcnJsaXN0W107Ci0KLSNlbmRpZgotCi0KLS8qCi0KLU5BTUUKLQotCWluaXRfZXJyb3JfdGFibGVzIC0tIGluaXRpYWxpemUgdGhlIG5hbWUgYW5kIG1lc3NhZ2UgdGFibGVzCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgdm9pZCBpbml0X2Vycm9yX3RhYmxlcyAoKTsKLQotREVTQ1JJUFRJT04KLQotCVVzaW5nIHRoZSBlcnJvcl90YWJsZSwgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgYXQgY29tcGlsZSB0aW1lLCBnZW5lcmF0ZQotCXRoZSBlcnJvcl9uYW1lcyBhbmQgdGhlIHN5c19lcnJsaXN0IChpZiBuZWVkZWQpIHRhYmxlcywgd2hpY2ggYXJlCi0JaW5kZXhlZCBhdCBydW50aW1lIGJ5IGEgc3BlY2lmaWMgZXJybm8gdmFsdWUuCi0KLUJVR1MKLQotCVRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdGFibGVzIG1heSBmYWlsIHVuZGVyIGxvdyBtZW1vcnkgY29uZGl0aW9ucywKLQlpbiB3aGljaCBjYXNlIHdlIGRvbid0IGRvIGFueXRoaW5nIHBhcnRpY3VsYXJseSB1c2VmdWwsIGJ1dCB3ZSBkb24ndAotCWJvbWIgZWl0aGVyLiAgV2hvIGtub3dzLCBpdCBtaWdodCBzdWNjZWVkIGF0IGEgbGF0ZXIgcG9pbnQgaWYgd2UgZnJlZQotCXNvbWUgbWVtb3J5IGluIHRoZSBtZWFudGltZS4gIEluIGFueSBjYXNlLCB0aGUgb3RoZXIgcm91dGluZXMga25vdwotCWhvdyB0byBkZWFsIHdpdGggbGFjayBvZiBhIHRhYmxlIGFmdGVyIHRyeWluZyB0byBpbml0aWFsaXplIGl0LiAgVGhpcwotCW1heSBvciBtYXkgbm90IGJlIGNvbnNpZGVyZWQgdG8gYmUgYSBidWcsIHRoYXQgd2UgZG9uJ3Qgc3BlY2lmaWNhbGx5Ci0Jd2FybiBhYm91dCB0aGlzIHBhcnRpY3VsYXIgZmFpbHVyZSBtb2RlLgotCi0qLwotCi1zdGF0aWMgdm9pZAotaW5pdF9lcnJvcl90YWJsZXMgKCkKLXsKLSAgY29uc3Qgc3RydWN0IGVycm9yX2luZm8gKmVpcDsKLSAgaW50IG5ieXRlczsKLQotICAvKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgc2Nhbm5lZCB0aGUgZXJyb3JfdGFibGUgb25jZSB0byBmaW5kIHRoZSBtYXhpbXVtCi0gICAgIGVycm5vIHZhbHVlLCB0aGVuIGdvIGZpbmQgaXQgbm93LiAqLwotCi0gIGlmIChudW1fZXJyb3JfbmFtZXMgPT0gMCkKLSAgICB7Ci0gICAgICBmb3IgKGVpcCA9IGVycm9yX3RhYmxlOyBlaXAgLT4gbmFtZSAhPSBOVUxMOyBlaXArKykKLQl7Ci0JICBpZiAoZWlwIC0+IHZhbHVlID49IG51bV9lcnJvcl9uYW1lcykKLQkgICAgewotCSAgICAgIG51bV9lcnJvcl9uYW1lcyA9IGVpcCAtPiB2YWx1ZSArIDE7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhdHRlbXB0IHRvIGFsbG9jYXRlIHRoZSBlcnJvcl9uYW1lcyB0YWJsZSwgemVybyBpdCBvdXQsIGFuZCB0aGVuCi0gICAgIGluaXRpYWxpemUgaXQgZnJvbSB0aGUgc3RhdGljYWxseSBpbml0aWFsaXplZCBlcnJvcl90YWJsZS4gKi8KLQotICBpZiAoZXJyb3JfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBuYnl0ZXMgPSBudW1fZXJyb3JfbmFtZXMgKiBzaXplb2YgKGNoYXIgKik7Ci0gICAgICBpZiAoKGVycm9yX25hbWVzID0gKGNvbnN0IGNoYXIgKiopIG1hbGxvYyAobmJ5dGVzKSkgIT0gTlVMTCkKLQl7Ci0JICBtZW1zZXQgKGVycm9yX25hbWVzLCAwLCBuYnl0ZXMpOwotCSAgZm9yIChlaXAgPSBlcnJvcl90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JICAgIHsKLQkgICAgICBlcnJvcl9uYW1lc1tlaXAgLT4gdmFsdWVdID0gZWlwIC0+IG5hbWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jaWZuZGVmIEhBVkVfU1lTX0VSUkxJU1QKLQotICAvKiBOb3cgYXR0ZW1wdCB0byBhbGxvY2F0ZSB0aGUgc3lzX2Vycmxpc3QgdGFibGUsIHplcm8gaXQgb3V0LCBhbmQgdGhlbgotICAgICBpbml0aWFsaXplIGl0IGZyb20gdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgZXJyb3JfdGFibGUuICovCi0KLSAgaWYgKHN5c19lcnJsaXN0ID09IE5VTEwpCi0gICAgewotICAgICAgbmJ5dGVzID0gbnVtX2Vycm9yX25hbWVzICogc2l6ZW9mIChjaGFyICopOwotICAgICAgaWYgKChzeXNfZXJybGlzdCA9IChjb25zdCBjaGFyICoqKSBtYWxsb2MgKG5ieXRlcykpICE9IE5VTEwpCi0JewotCSAgbWVtc2V0IChzeXNfZXJybGlzdCwgMCwgbmJ5dGVzKTsKLQkgIHN5c19uZXJyID0gbnVtX2Vycm9yX25hbWVzOwotCSAgZm9yIChlaXAgPSBlcnJvcl90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JICAgIHsKLQkgICAgICBzeXNfZXJybGlzdFtlaXAgLT4gdmFsdWVdID0gZWlwIC0+IG1zZzsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNlbmRpZgotCi19Ci0KLS8qCi0KLU5BTUUKLQotCWVycm5vX21heCAtLSByZXR1cm4gdGhlIG1heCBlcnJubyB2YWx1ZQotCi1TWU5PUFNJUwotCi0JaW50IGVycm5vX21heCAoKTsKLQotREVTQ1JJUFRJT04KLQotCVJldHVybnMgdGhlIG1heGltdW0gZXJybm8gdmFsdWUgZm9yIHdoaWNoIGEgY29ycmVzcG9uZGluZyBzeW1ib2xpYwotCW5hbWUgb3IgbWVzc2FnZSBpcyBhdmFpbGFibGUuICBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugd2hlcmUKLQl3ZSB1c2UgdGhlIHN5c19lcnJsaXN0IHN1cHBsaWVkIGJ5IHRoZSBzeXN0ZW0sIGl0IGlzIHBvc3NpYmxlIGZvcgotCXRoZXJlIHRvIGJlIG1vcmUgc3ltYm9saWMgbmFtZXMgdGhhbiBtZXNzYWdlcywgb3IgdmljZSB2ZXJzYS4KLQlJbiBmYWN0LCB0aGUgbWFudWFsIHBhZ2UgZm9yIHBlcnJvcigzQykgZXhwbGljaXRseSB3YXJucyB0aGF0IG9uZQotCXNob3VsZCBjaGVjayB0aGUgc2l6ZSBvZiB0aGUgdGFibGUgKHN5c19uZXJyKSBiZWZvcmUgaW5kZXhpbmcgaXQsCi0Jc2luY2UgbmV3IGVycm9yIGNvZGVzIG1heSBiZSBhZGRlZCB0byB0aGUgc3lzdGVtIGJlZm9yZSB0aGV5IGFyZQotCWFkZGVkIHRvIHRoZSB0YWJsZS4gIFRodXMgc3lzX25lcnIgbWlnaHQgYmUgc21hbGxlciB0aGFuIHZhbHVlCi0JaW1wbGllZCBieSB0aGUgbGFyZ2VzdCBlcnJubyB2YWx1ZSBkZWZpbmVkIGluIDxlcnJuby5oPi4KLQotCVdlIHJldHVybiB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIG9idGFpbiBhIG1lYW5pbmdmdWwKLQlzeW1ib2xpYyBuYW1lIG9yIG1lc3NhZ2UuCi0KLSovCi0KLWludAotZXJybm9fbWF4ICgpCi17Ci0gIGludCBtYXhzaXplOwotCi0gIGlmIChlcnJvcl9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluaXRfZXJyb3JfdGFibGVzICgpOwotICAgIH0KLSAgbWF4c2l6ZSA9IE1BWCAoc3lzX25lcnIsIG51bV9lcnJvcl9uYW1lcyk7Ci0gIHJldHVybiAobWF4c2l6ZSAtIDEpOwotfQotCi0jaWZuZGVmIEhBVkVfU1RSRVJST1IKLQotLyoKLQotTkFNRQotCi0Jc3RyZXJyb3IgLS0gbWFwIGFuIGVycm9yIG51bWJlciB0byBhbiBlcnJvciBtZXNzYWdlIHN0cmluZwotCi1TWU5PUFNJUwotCi0JY2hhciAqc3RyZXJyb3IgKGludCBlcnJub3ZhbCkKLQotREVTQ1JJUFRJT04KLQotCU1hcHMgYW4gZXJybm8gbnVtYmVyIHRvIGFuIGVycm9yIG1lc3NhZ2Ugc3RyaW5nLCB0aGUgY29udGVudHMgb2YKLQl3aGljaCBhcmUgaW1wbGVtZW50YXRpb24gZGVmaW5lZC4gIE9uIHN5c3RlbXMgd2hpY2ggaGF2ZSB0aGUgZXh0ZXJuYWwKLQl2YXJpYWJsZXMgc3lzX25lcnIgYW5kIHN5c19lcnJsaXN0LCB0aGVzZSBzdHJpbmdzIHdpbGwgYmUgdGhlIHNhbWUKLQlhcyB0aGUgb25lcyB1c2VkIGJ5IHBlcnJvcigpLgotCi0JSWYgdGhlIHN1cHBsaWVkIGVycm9yIG51bWJlciBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGluZGljZXMKLQlmb3IgdGhlIHN5c19lcnJsaXN0LCBidXQgbm8gbWVzc2FnZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBwYXJ0aWN1bGFyCi0JZXJyb3IgbnVtYmVyLCB0aGVuIHJldHVybnMgdGhlIHN0cmluZyAiRXJyb3IgTlVNIiwgd2hlcmUgTlVNIGlzIHRoZQotCWVycm9yIG51bWJlci4KLQotCUlmIHRoZSBzdXBwbGllZCBlcnJvciBudW1iZXIgaXMgbm90IGEgdmFsaWQgaW5kZXggaW50byBzeXNfZXJybGlzdCwKLQlyZXR1cm5zIE5VTEwuCi0KLQlUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSB2YWxpZCBvbmx5IHVudGlsIHRoZQotCW5leHQgY2FsbCB0byBzdHJlcnJvci4KLQotKi8KLQotY2hhciAqCi1zdHJlcnJvciAoZXJybm92YWwpCi0gIGludCBlcnJub3ZhbDsKLXsKLSAgY2hhciAqbXNnOwotICBzdGF0aWMgY2hhciBidWZbMzJdOwotCi0jaWZuZGVmIEhBVkVfU1lTX0VSUkxJU1QKLQotICBpZiAoZXJyb3JfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X2Vycm9yX3RhYmxlcyAoKTsKLSAgICB9Ci0KLSNlbmRpZgotCi0gIGlmICgoZXJybm92YWwgPCAwKSB8fCAoZXJybm92YWwgPj0gc3lzX25lcnIpKQotICAgIHsKLSNpZmRlZiBFVk1TRVJSCi0gICAgICBpZiAoZXJybm92YWwgPT0gZXZtc2Vyci52YWx1ZSkKLQltc2cgPSBldm1zZXJyLm1zZzsKLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgLyogT3V0IG9mIHJhbmdlLCBqdXN0IHJldHVybiBOVUxMICovCi0gICAgICBtc2cgPSBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoKHN5c19lcnJsaXN0ID09IE5VTEwpIHx8IChzeXNfZXJybGlzdFtlcnJub3ZhbF0gPT0gTlVMTCkpCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGJ1dCBubyBzeXNfZXJybGlzdCBvciBubyBlbnRyeSBhdCB0aGlzIGluZGV4LiAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiRXJyb3IgJWQiLCBlcnJub3ZhbCk7Ci0gICAgICBtc2cgPSBidWY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGFuZCBhIHZhbGlkIG1lc3NhZ2UuICBKdXN0IHJldHVybiB0aGUgbWVzc2FnZS4gKi8KLSAgICAgIG1zZyA9IChjaGFyICopIHN5c19lcnJsaXN0W2Vycm5vdmFsXTsKLSAgICB9Ci0gIAotICByZXR1cm4gKG1zZyk7Ci19Ci0KLSNlbmRpZgkvKiAhIEhBVkVfU1RSRVJST1IgKi8KLQotCi0vKgotCi1OQU1FCi0KLQlzdHJlcnJubyAtLSBtYXAgYW4gZXJyb3IgbnVtYmVyIHRvIGEgc3ltYm9saWMgbmFtZSBzdHJpbmcKLQotU1lOT1BTSVMKLQotCWNvbnN0IGNoYXIgKnN0cmVycm5vIChpbnQgZXJybm92YWwpCi0KLURFU0NSSVBUSU9OCi0KLQlHaXZlbiBhbiBlcnJvciBudW1iZXIgcmV0dXJuZWQgZnJvbSBhIHN5c3RlbSBjYWxsICh0eXBpY2FsbHkKLQlyZXR1cm5lZCBpbiBlcnJubyksIHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlCi0Jc3ltYm9saWMgbmFtZSBvZiB0aGF0IGVycm9yIG51bWJlciwgYXMgZm91bmQgaW4gPGVycm5vLmg+LgotCi0JSWYgdGhlIHN1cHBsaWVkIGVycm9yIG51bWJlciBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGluZGljZXMKLQlmb3Igc3ltYm9saWMgbmFtZXMsIGJ1dCBubyBuYW1lIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHBhcnRpY3VsYXIKLQllcnJvciBudW1iZXIsIHRoZW4gcmV0dXJucyB0aGUgc3RyaW5nICJFcnJvciBOVU0iLCB3aGVyZSBOVU0gaXMKLQl0aGUgZXJyb3IgbnVtYmVyLgotCi0JSWYgdGhlIHN1cHBsaWVkIGVycm9yIG51bWJlciBpcyBub3Qgd2l0aGluIHRoZSByYW5nZSBvZiB2YWxpZAotCWluZGljZXMsIHRoZW4gcmV0dXJucyBOVUxMLgotCi1CVUdTCi0KLQlUaGUgY29udGVudHMgb2YgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYXJlIG9ubHkgZ3VhcmFudGVlZCB0byBiZQotCXZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gc3RyZXJybm8uCi0KLSovCi0KLWNvbnN0IGNoYXIgKgotc3RyZXJybm8gKGVycm5vdmFsKQotICBpbnQgZXJybm92YWw7Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHN0YXRpYyBjaGFyIGJ1ZlszMl07Ci0KLSAgaWYgKGVycm9yX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgaW5pdF9lcnJvcl90YWJsZXMgKCk7Ci0gICAgfQotCi0gIGlmICgoZXJybm92YWwgPCAwKSB8fCAoZXJybm92YWwgPj0gbnVtX2Vycm9yX25hbWVzKSkKLSAgICB7Ci0jaWZkZWYgRVZNU0VSUgotICAgICAgaWYgKGVycm5vdmFsID09IGV2bXNlcnIudmFsdWUpCi0JbmFtZSA9IGV2bXNlcnIubmFtZTsKLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgLyogT3V0IG9mIHJhbmdlLCBqdXN0IHJldHVybiBOVUxMICovCi0gICAgICBuYW1lID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKChlcnJvcl9uYW1lcyA9PSBOVUxMKSB8fCAoZXJyb3JfbmFtZXNbZXJybm92YWxdID09IE5VTEwpKQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBidXQgbm8gZXJyb3JfbmFtZXMgb3Igbm8gZW50cnkgYXQgdGhpcyBpbmRleC4gKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIkVycm9yICVkIiwgZXJybm92YWwpOwotICAgICAgbmFtZSA9IChjb25zdCBjaGFyICopIGJ1ZjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJbiByYW5nZSwgYW5kIGEgdmFsaWQgbmFtZS4gIEp1c3QgcmV0dXJuIHRoZSBuYW1lLiAqLwotICAgICAgbmFtZSA9IGVycm9yX25hbWVzW2Vycm5vdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIChuYW1lKTsKLX0KLQotLyoKLQotTkFNRQotCi0Jc3RydG9lcnJubyAtLSBtYXAgYSBzeW1ib2xpYyBlcnJubyBuYW1lIHRvIGEgbnVtZXJpYyB2YWx1ZQotCi1TWU5PUFNJUwotCi0JaW50IHN0cnRvZXJybm8gKGNoYXIgKm5hbWUpCi0KLURFU0NSSVBUSU9OCi0KLQlHaXZlbiB0aGUgc3ltYm9saWMgbmFtZSBvZiBhIGVycm9yIG51bWJlciwgbWFwIGl0IHRvIGFuIGVycm5vIHZhbHVlLgotCUlmIG5vIHRyYW5zbGF0aW9uIGlzIGZvdW5kLCByZXR1cm5zIDAuCi0KLSovCi0KLWludAotc3RydG9lcnJubyAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaW50IGVycm5vdmFsID0gMDsKLQotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChlcnJvcl9uYW1lcyA9PSBOVUxMKQotCXsKLQkgIGluaXRfZXJyb3JfdGFibGVzICgpOwotCX0KLSAgICAgIGZvciAoZXJybm92YWwgPSAwOyBlcnJub3ZhbCA8IG51bV9lcnJvcl9uYW1lczsgZXJybm92YWwrKykKLQl7Ci0JICBpZiAoKGVycm9yX25hbWVzW2Vycm5vdmFsXSAhPSBOVUxMKSAmJgotCSAgICAgIChzdHJjbXAgKG5hbWUsIGVycm9yX25hbWVzW2Vycm5vdmFsXSkgPT0gMCkpCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGlmIChlcnJub3ZhbCA9PSBudW1fZXJyb3JfbmFtZXMpCi0JewotI2lmZGVmIEVWTVNFUlIKLQkgIGlmIChzdHJjbXAgKG5hbWUsIGV2bXNlcnIubmFtZSkgPT0gMCkKLQkgICAgZXJybm92YWwgPSBldm1zZXJyLnZhbHVlOwotCSAgZWxzZQotI2VuZGlmCi0JICBlcnJub3ZhbCA9IDA7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChlcnJub3ZhbCk7Ci19Ci0KLQotLyogQSBzaW1wbGUgbGl0dGxlIG1haW4gdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHByaW50IGFsbCB0aGUgZXJybm8gdHJhbnNsYXRpb25zCi0gICBpZiBNQUlOIGlzIGRlZmluZWQgYW5kIHRoaXMgZmlsZSBpcyBjb21waWxlZCBhbmQgbGlua2VkLiAqLwotCi0jaWZkZWYgTUFJTgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50Ci1tYWluICgpCi17Ci0gIGludCBlcnJuOwotICBpbnQgZXJybm1heDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY2hhciAqbXNnOwotICBjaGFyICpzdHJlcnJvciAoKTsKLQotICBlcnJubWF4ID0gZXJybm9fbWF4ICgpOwotICBwcmludGYgKCIlZCBlbnRyaWVzIGluIG5hbWVzIHRhYmxlLlxuIiwgbnVtX2Vycm9yX25hbWVzKTsKLSAgcHJpbnRmICgiJWQgZW50cmllcyBpbiBtZXNzYWdlcyB0YWJsZS5cbiIsIHN5c19uZXJyKTsKLSAgcHJpbnRmICgiJWQgaXMgbWF4IHVzZWZ1bCBpbmRleC5cbiIsIGVycm5tYXgpOwotCi0gIC8qIEtlZXAgcHJpbnRpbmcgdmFsdWVzIHVudGlsIHdlIGdldCB0byB0aGUgZW5kIG9mICpib3RoKiB0YWJsZXMsIG5vdAotICAgICAqZWl0aGVyKiB0YWJsZS4gIE5vdGUgdGhhdCBrbm93aW5nIHRoZSBtYXhpbXVtIHVzZWZ1bCBpbmRleCBkb2VzICpub3QqCi0gICAgIHJlbGlldmUgdXMgb2YgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRlc3RpbmcgdGhlIHJldHVybiBwb2ludGVyIGZvcgotICAgICBOVUxMLiAqLwotCi0gIGZvciAoZXJybiA9IDA7IGVycm4gPD0gZXJybm1heDsgZXJybisrKQotICAgIHsKLSAgICAgIG5hbWUgPSBzdHJlcnJubyAoZXJybik7Ci0gICAgICBuYW1lID0gKG5hbWUgPT0gTlVMTCkgPyAiPE5VTEw+IiA6IG5hbWU7Ci0gICAgICBtc2cgPSBzdHJlcnJvciAoZXJybik7Ci0gICAgICBtc2cgPSAobXNnID09IE5VTEwpID8gIjxOVUxMPiIgOiBtc2c7Ci0gICAgICBwcmludGYgKCIlLTRkJS0xOHMlc1xuIiwgZXJybiwgbmFtZSwgbXNnKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cm5jYXNlY21wLmMgYi9saWJpYmVydHkvc3RybmNhc2VjbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4NWNhYy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RybmNhc2VjbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODcgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkIGFuZCB0aGF0IGR1ZSBjcmVkaXQgaXMgZ2l2ZW4KLSAqIHRvIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYXQgQmVya2VsZXkuIFRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5Ci0gKiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gVGhpcyBzb2Z0d2FyZQotICogaXMgcHJvdmlkZWQgYGBhcyBpcycnIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICovCi0KLSNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKLXN0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylzdHJjYXNlY21wLmMJNS41IChCZXJrZWxleSkgMTEvMjQvODciOwotI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotLyoKLSAqIFRoaXMgYXJyYXkgaXMgZGVzaWduZWQgZm9yIG1hcHBpbmcgdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVyCi0gKiB0b2dldGhlciBmb3IgYSBjYXNlIGluZGVwZW5kZW50IGNvbXBhcmlzb24uICBUaGUgbWFwcGluZ3MgYXJlCi0gKiBiYXNlZCB1cG9uIGFzY2lpIGNoYXJhY3RlciBzZXF1ZW5jZXMuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJtYXBbXSA9IHsKLQknXDAwMCcsICdcMDAxJywgJ1wwMDInLCAnXDAwMycsICdcMDA0JywgJ1wwMDUnLCAnXDAwNicsICdcMDA3JywKLQknXDAxMCcsICdcMDExJywgJ1wwMTInLCAnXDAxMycsICdcMDE0JywgJ1wwMTUnLCAnXDAxNicsICdcMDE3JywKLQknXDAyMCcsICdcMDIxJywgJ1wwMjInLCAnXDAyMycsICdcMDI0JywgJ1wwMjUnLCAnXDAyNicsICdcMDI3JywKLQknXDAzMCcsICdcMDMxJywgJ1wwMzInLCAnXDAzMycsICdcMDM0JywgJ1wwMzUnLCAnXDAzNicsICdcMDM3JywKLQknXDA0MCcsICdcMDQxJywgJ1wwNDInLCAnXDA0MycsICdcMDQ0JywgJ1wwNDUnLCAnXDA0NicsICdcMDQ3JywKLQknXDA1MCcsICdcMDUxJywgJ1wwNTInLCAnXDA1MycsICdcMDU0JywgJ1wwNTUnLCAnXDA1NicsICdcMDU3JywKLQknXDA2MCcsICdcMDYxJywgJ1wwNjInLCAnXDA2MycsICdcMDY0JywgJ1wwNjUnLCAnXDA2NicsICdcMDY3JywKLQknXDA3MCcsICdcMDcxJywgJ1wwNzInLCAnXDA3MycsICdcMDc0JywgJ1wwNzUnLCAnXDA3NicsICdcMDc3JywKLQknXDEwMCcsICdcMTQxJywgJ1wxNDInLCAnXDE0MycsICdcMTQ0JywgJ1wxNDUnLCAnXDE0NicsICdcMTQ3JywKLQknXDE1MCcsICdcMTUxJywgJ1wxNTInLCAnXDE1MycsICdcMTU0JywgJ1wxNTUnLCAnXDE1NicsICdcMTU3JywKLQknXDE2MCcsICdcMTYxJywgJ1wxNjInLCAnXDE2MycsICdcMTY0JywgJ1wxNjUnLCAnXDE2NicsICdcMTY3JywKLQknXDE3MCcsICdcMTcxJywgJ1wxNzInLCAnXDEzMycsICdcMTM0JywgJ1wxMzUnLCAnXDEzNicsICdcMTM3JywKLQknXDE0MCcsICdcMTQxJywgJ1wxNDInLCAnXDE0MycsICdcMTQ0JywgJ1wxNDUnLCAnXDE0NicsICdcMTQ3JywKLQknXDE1MCcsICdcMTUxJywgJ1wxNTInLCAnXDE1MycsICdcMTU0JywgJ1wxNTUnLCAnXDE1NicsICdcMTU3JywKLQknXDE2MCcsICdcMTYxJywgJ1wxNjInLCAnXDE2MycsICdcMTY0JywgJ1wxNjUnLCAnXDE2NicsICdcMTY3JywKLQknXDE3MCcsICdcMTcxJywgJ1wxNzInLCAnXDE3MycsICdcMTc0JywgJ1wxNzUnLCAnXDE3NicsICdcMTc3JywKLQknXDIwMCcsICdcMjAxJywgJ1wyMDInLCAnXDIwMycsICdcMjA0JywgJ1wyMDUnLCAnXDIwNicsICdcMjA3JywKLQknXDIxMCcsICdcMjExJywgJ1wyMTInLCAnXDIxMycsICdcMjE0JywgJ1wyMTUnLCAnXDIxNicsICdcMjE3JywKLQknXDIyMCcsICdcMjIxJywgJ1wyMjInLCAnXDIyMycsICdcMjI0JywgJ1wyMjUnLCAnXDIyNicsICdcMjI3JywKLQknXDIzMCcsICdcMjMxJywgJ1wyMzInLCAnXDIzMycsICdcMjM0JywgJ1wyMzUnLCAnXDIzNicsICdcMjM3JywKLQknXDI0MCcsICdcMjQxJywgJ1wyNDInLCAnXDI0MycsICdcMjQ0JywgJ1wyNDUnLCAnXDI0NicsICdcMjQ3JywKLQknXDI1MCcsICdcMjUxJywgJ1wyNTInLCAnXDI1MycsICdcMjU0JywgJ1wyNTUnLCAnXDI1NicsICdcMjU3JywKLQknXDI2MCcsICdcMjYxJywgJ1wyNjInLCAnXDI2MycsICdcMjY0JywgJ1wyNjUnLCAnXDI2NicsICdcMjY3JywKLQknXDI3MCcsICdcMjcxJywgJ1wyNzInLCAnXDI3MycsICdcMjc0JywgJ1wyNzUnLCAnXDI3NicsICdcMjc3JywKLQknXDMwMCcsICdcMzQxJywgJ1wzNDInLCAnXDM0MycsICdcMzQ0JywgJ1wzNDUnLCAnXDM0NicsICdcMzQ3JywKLQknXDM1MCcsICdcMzUxJywgJ1wzNTInLCAnXDM1MycsICdcMzU0JywgJ1wzNTUnLCAnXDM1NicsICdcMzU3JywKLQknXDM2MCcsICdcMzYxJywgJ1wzNjInLCAnXDM2MycsICdcMzY0JywgJ1wzNjUnLCAnXDM2NicsICdcMzY3JywKLQknXDM3MCcsICdcMzcxJywgJ1wzNzInLCAnXDMzMycsICdcMzM0JywgJ1wzMzUnLCAnXDMzNicsICdcMzM3JywKLQknXDM0MCcsICdcMzQxJywgJ1wzNDInLCAnXDM0MycsICdcMzQ0JywgJ1wzNDUnLCAnXDM0NicsICdcMzQ3JywKLQknXDM1MCcsICdcMzUxJywgJ1wzNTInLCAnXDM1MycsICdcMzU0JywgJ1wzNTUnLCAnXDM1NicsICdcMzU3JywKLQknXDM2MCcsICdcMzYxJywgJ1wzNjInLCAnXDM2MycsICdcMzY0JywgJ1wzNjUnLCAnXDM2NicsICdcMzY3JywKLQknXDM3MCcsICdcMzcxJywgJ1wzNzInLCAnXDM3MycsICdcMzc0JywgJ1wzNzUnLCAnXDM3NicsICdcMzc3JywKLX07Ci0KLWludAotc3RybmNhc2VjbXAoczEsIHMyLCBuKQotCWNvbnN0IGNoYXIgKnMxLCAqczI7Ci0JcmVnaXN0ZXIgc2l6ZV90IG47Ci17Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciB1MSwgdTI7Ci0KLSAgICBmb3IgKDsgbiAhPSAwOyAtLW4pIHsKLQl1MSA9ICh1bnNpZ25lZCBjaGFyKSAqczErKzsKLQl1MiA9ICh1bnNpZ25lZCBjaGFyKSAqczIrKzsKLQlpZiAoY2hhcm1hcFt1MV0gIT0gY2hhcm1hcFt1Ml0pIHsKLQkgICAgcmV0dXJuIGNoYXJtYXBbdTFdIC0gY2hhcm1hcFt1Ml07Ci0JfQotCWlmICh1MSA9PSAnXDAnKSB7Ci0JICAgIHJldHVybiAwOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RycmNoci5jIGIvbGliaWJlcnR5L3N0cnJjaHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwNWJjYi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RycmNoci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogUG9ydGFibGUgdmVyc2lvbiBvZiBzdHJyY2hyKCkuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAqLwotCi0vKgotTkFNRQotCXN0cnJjaHIgLS0gcmV0dXJuIHBvaW50ZXIgdG8gbGFzdCBvY2N1cmFuY2Ugb2YgYSBjaGFyYWN0ZXIKLQotU1lOT1BTSVMKLQljaGFyICpzdHJyY2hyIChjb25zdCBjaGFyICpzLCBpbnQgYykKLQotREVTQ1JJUFRJT04KLQlSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbGFzdCBvY2N1cmFuY2Ugb2YgY2hhcmFjdGVyIEMgaW4KLQlzdHJpbmcgUywgb3IgYSBOVUxMIHBvaW50ZXIgaWYgbm8gb2NjdXJhbmNlIGlzIGZvdW5kLgotCQotQlVHUwotCUJlaGF2aW9yIHdoZW4gY2hhcmFjdGVyIGlzIHRoZSBudWxsIGNoYXJhY3RlciBpcyBpbXBsZW1lbnRhdGlvbgotCWRlcGVuZGVudC4KLSovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi1jaGFyICoKLXN0cnJjaHIgKHMsIGMpCi0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7Ci0gIGludCBjOwotewotICBjaGFyICpydG52YWwgPSAwOwotCi0gIGRvIHsKLSAgICBpZiAoKnMgPT0gYykKLSAgICAgIHJ0bnZhbCA9IChjaGFyKikgczsKLSAgfSB3aGlsZSAoKnMrKyk7Ci0gIHJldHVybiAocnRudmFsKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJzaWduYWwuYyBiL2xpYmliZXJ0eS9zdHJzaWduYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdiYjEwYy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3Ryc2lnbmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDQgKzAsMCBAQAotLyogRXh0ZW5kZWQgc3VwcG9ydCBmb3IgdXNpbmcgc2lnbmFsIHZhbHVlcy4KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAgZm5mQGN5Z251cy5jb20KLSAgIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLS8qIFdlIG5lZWQgdG8gZGVjbGFyZSBzeXNfc2lnbGlzdCwgYmVjYXVzZSBldmVuIGlmIHRoZSBzeXN0ZW0gcHJvdmlkZXMKLSAgIGl0IHdlIGNhbid0IGFzc3VtZSB0aGF0IGl0IGlzIGRlY2xhcmVkIGluIDxzaWduYWwuaD4gKGZvciBleGFtcGxlLAotICAgU3VuT1MgcHJvdmlkZXMgc3lzX3NpZ2xpc3QsIGJ1dCBpdCBkb2VzIG5vdCBkZWNsYXJlIGl0IGluIGFueQotICAgaGVhZGVyIGZpbGUpLiAgZkhvd2V2ZXIsIHdlIGNhbid0IGRlY2xhcmUgc3lzX3NpZ2xpc3QgcG9ydGFibHksCi0gICBiZWNhdXNlIG9uIHNvbWUgc3lzdGVtcyBpdCBpcyBkZWNsYXJlZCB3aXRoIGNvbnN0IGFuZCBvbiBzb21lCi0gICBzeXN0ZW1zIGl0IGlzIGRlY2xhcmVkIHdpdGhvdXQgY29uc3QuICBJZiB3ZSB3ZXJlIHVzaW5nIGF1dG9jb25mLAotICAgd2UgY291bGQgd29yayBvdXQgdGhlIHJpZ2h0IGRlY2xhcmF0aW9uLiAgVW50aWwsIHRoZW4gd2UganVzdAotICAgaWdub3JlIGFueSBkZWNsYXJhdGlvbiBpbiB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcywgYW5kIGFsd2F5cwotICAgZGVjbGFyZSBpdCBvdXJzZWx2ZXMuICBXaXRoIGx1Y2ssIHRoaXMgd2lsbCBhbHdheXMgd29yay4gICovCi0jZGVmaW5lIHN5c19zaWdsaXN0IG5vX3N1Y2hfc3ltYm9sCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0vKiAgUm91dGluZXMgaW1wb3J0ZWQgZnJvbSBzdGFuZGFyZCBDIHJ1bnRpbWUgbGlicmFyaWVzLiAqLwotCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLWV4dGVybiB2b2lkICptYWxsb2MgKHNpemVfdCBzaXplKTsJCQkJLyogNC4xMC4zLjMgKi8KLWV4dGVybiB2b2lkICptZW1zZXQgKHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7CQkJLyogNC4xMS42LjEgKi8KLSNlbHNlCS8qICFfX1NURENfXyAqLwotZXh0ZXJuIGNoYXIgKm1hbGxvYyAoKTsJCS8qIFN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0ZXIgKi8KLWV4dGVybiBjaGFyICptZW1zZXQgKCk7Ci0jZW5kaWYJLyogX19TVERDX18gKi8KLQotLyogVW5kZWZpbmUgdGhlIG1hY3JvIHdlIHVzZWQgdG8gaGlkZSB0aGUgZGVmaW5pdGlvbiBvZiBzeXNfc2lnbGlzdAotICAgZm91bmQgaW4gdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIHN5c19zaWdsaXN0Ci0KLSNpZm5kZWYgTlVMTAotIyAgaWZkZWYgX19TVERDX18KLSMgICAgZGVmaW5lIE5VTEwgKHZvaWQgKikgMAotIyAgZWxzZQotIyAgICBkZWZpbmUgTlVMTCAwCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgTUFYCi0jICBkZWZpbmUgTUFYKGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBpbml0X3NpZ25hbF90YWJsZXMgUEFSQU1TICgodm9pZCkpOwotCi0vKiBUcmFuc2xhdGlvbiB0YWJsZSBmb3Igc2lnbmFsIHZhbHVlcy4KLQotICAgTm90ZSB0aGF0IHRoaXMgdGFibGUgaXMgZ2VuZXJhbGx5IG9ubHkgYWNjZXNzZWQgd2hlbiBpdCBpcyB1c2VkIGF0IHJ1bnRpbWUKLSAgIHRvIGluaXRpYWxpemUgc2lnbmFsIG5hbWUgYW5kIG1lc3NhZ2UgdGFibGVzIHRoYXQgYXJlIGluZGV4ZWQgYnkgc2lnbmFsCi0gICB2YWx1ZS4KLQotICAgTm90IGFsbCBvZiB0aGVzZSBzaWduYWxzIHdpbGwgZXhpc3Qgb24gYWxsIHN5c3RlbXMuICBUaGlzIHRhYmxlIGlzIHRoZSBvbmx5Ci0gICB0aGluZyB0aGF0IHNob3VsZCBoYXZlIHRvIGJlIHVwZGF0ZWQgYXMgbmV3IHNpZ25hbCBudW1iZXJzIGFyZSBpbnRyb2R1Y2VkLgotICAgSXQncyBzb3J0IG9mIHVnbHksIGJ1dCBhdCBsZWFzdCBpdHMgcG9ydGFibGUuICovCi0KLXN0cnVjdCBzaWduYWxfaW5mbwotewotICBpbnQgdmFsdWU7CQkvKiBUaGUgbnVtZXJpYyB2YWx1ZSBmcm9tIDxzaWduYWwuaD4gKi8KLSAgY29uc3QgY2hhciAqbmFtZTsJLyogVGhlIGVxdWl2YWxlbnQgc3ltYm9saWMgdmFsdWUgKi8KLSNpZm5kZWYgSEFWRV9TWVNfU0lHTElTVAotICBjb25zdCBjaGFyICptc2c7CS8qIFNob3J0IG1lc3NhZ2UgYWJvdXQgdGhpcyB2YWx1ZSAqLwotI2VuZGlmCi19OwotCi0jaWZuZGVmIEhBVkVfU1lTX1NJR0xJU1QKLSMgICBkZWZpbmUgRU5UUlkodmFsdWUsIG5hbWUsIG1zZykJe3ZhbHVlLCBuYW1lLCBtc2d9Ci0jZWxzZQotIyAgIGRlZmluZSBFTlRSWSh2YWx1ZSwgbmFtZSwgbXNnKQl7dmFsdWUsIG5hbWV9Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaWduYWxfaW5mbyBzaWduYWxfdGFibGVbXSA9Ci17Ci0jaWYgZGVmaW5lZCAoU0lHSFVQKQotICBFTlRSWShTSUdIVVAsICJTSUdIVVAiLCAiSGFuZ3VwIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdJTlQpCi0gIEVOVFJZKFNJR0lOVCwgIlNJR0lOVCIsICJJbnRlcnJ1cHQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1FVSVQpCi0gIEVOVFJZKFNJR1FVSVQsICJTSUdRVUlUIiwgIlF1aXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0lMTCkKLSAgRU5UUlkoU0lHSUxMLCAiU0lHSUxMIiwgIklsbGVnYWwgaW5zdHJ1Y3Rpb24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1RSQVApCi0gIEVOVFJZKFNJR1RSQVAsICJTSUdUUkFQIiwgIlRyYWNlL2JyZWFrcG9pbnQgdHJhcCIpLAotI2VuZGlmCi0vKiBQdXQgU0lHSU9UIGJlZm9yZSBTSUdBQlJULCBzbyB0aGF0IGlmIFNJR0lPVD09U0lHQUJSVCB0aGVuIFNJR0FCUlQKLSAgIG92ZXJyaWRlcyBTSUdJT1QuICBTSUdBQlJUIGlzIGluIEFOU0kgYW5kIFBPU0lYLjEsIGFuZCBTSUdJT1QgaXNuJ3QuICovCi0jaWYgZGVmaW5lZCAoU0lHSU9UKQotICBFTlRSWShTSUdJT1QsICJTSUdJT1QiLCAiSU9UIHRyYXAiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0FCUlQpCi0gIEVOVFJZKFNJR0FCUlQsICJTSUdBQlJUIiwgIkFib3J0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0VNVCkKLSAgRU5UUlkoU0lHRU1ULCAiU0lHRU1UIiwgIkVtdWxhdGlvbiB0cmFwIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdGUEUpCi0gIEVOVFJZKFNJR0ZQRSwgIlNJR0ZQRSIsICJBcml0aG1ldGljIGV4Y2VwdGlvbiIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHS0lMTCkKLSAgRU5UUlkoU0lHS0lMTCwgIlNJR0tJTEwiLCAiS2lsbGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdCVVMpCi0gIEVOVFJZKFNJR0JVUywgIlNJR0JVUyIsICJCdXMgZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1NFR1YpCi0gIEVOVFJZKFNJR1NFR1YsICJTSUdTRUdWIiwgIlNlZ21lbnRhdGlvbiBmYXVsdCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHU1lTKQotICBFTlRSWShTSUdTWVMsICJTSUdTWVMiLCAiQmFkIHN5c3RlbSBjYWxsIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdQSVBFKQotICBFTlRSWShTSUdQSVBFLCAiU0lHUElQRSIsICJCcm9rZW4gcGlwZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHQUxSTSkKLSAgRU5UUlkoU0lHQUxSTSwgIlNJR0FMUk0iLCAiQWxhcm0gY2xvY2siKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1RFUk0pCi0gIEVOVFJZKFNJR1RFUk0sICJTSUdURVJNIiwgIlRlcm1pbmF0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1VTUjEpCi0gIEVOVFJZKFNJR1VTUjEsICJTSUdVU1IxIiwgIlVzZXIgZGVmaW5lZCBzaWduYWwgMSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVVNSMikKLSAgRU5UUlkoU0lHVVNSMiwgIlNJR1VTUjIiLCAiVXNlciBkZWZpbmVkIHNpZ25hbCAyIiksCi0jZW5kaWYKLS8qIFB1dCBTSUdDTEQgYmVmb3JlIFNJR0NITEQsIHNvIHRoYXQgaWYgU0lHQ0xEPT1TSUdDSExEIHRoZW4gU0lHQ0hMRAotICAgb3ZlcnJpZGVzIFNJR0NMRC4gIFNJR0NITEQgaXMgaW4gUE9YSVguMSAqLwotI2lmIGRlZmluZWQgKFNJR0NMRCkKLSAgRU5UUlkoU0lHQ0xELCAiU0lHQ0xEIiwgIkNoaWxkIHN0YXR1cyBjaGFuZ2VkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdDSExEKQotICBFTlRSWShTSUdDSExELCAiU0lHQ0hMRCIsICJDaGlsZCBzdGF0dXMgY2hhbmdlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHUFdSKQotICBFTlRSWShTSUdQV1IsICJTSUdQV1IiLCAiUG93ZXIgZmFpbC9yZXN0YXJ0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdXSU5DSCkKLSAgRU5UUlkoU0lHV0lOQ0gsICJTSUdXSU5DSCIsICJXaW5kb3cgc2l6ZSBjaGFuZ2VkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdVUkcpCi0gIEVOVFJZKFNJR1VSRywgIlNJR1VSRyIsICJVcmdlbnQgSS9PIGNvbmRpdGlvbiIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHSU8pCi0gIC8qICJJL08gcGVuZGluZyIgaGFzIGFsc28gYmVlbiBzdWdnZXN0ZWQsIGJ1dCBpcyBtaXNsZWFkaW5nIHNpbmNlIHRoZQotICAgICBzaWduYWwgb25seSBoYXBwZW5zIHdoZW4gdGhlIHByb2Nlc3MgaGFzIGFza2VkIGZvciBpdCwgbm90IGV2ZXJ5dGltZQotICAgICBJL08gaXMgcGVuZGluZy4gKi8KLSAgRU5UUlkoU0lHSU8sICJTSUdJTyIsICJJL08gcG9zc2libGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1BPTEwpCi0gIEVOVFJZKFNJR1BPTEwsICJTSUdQT0xMIiwgIlBvbGxhYmxlIGV2ZW50IG9jY3VycmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdTVE9QKQotICBFTlRSWShTSUdTVE9QLCAiU0lHU1RPUCIsICJTdG9wcGVkIChzaWduYWwpIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdUU1RQKQotICBFTlRSWShTSUdUU1RQLCAiU0lHVFNUUCIsICJTdG9wcGVkICh1c2VyKSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHQ09OVCkKLSAgRU5UUlkoU0lHQ09OVCwgIlNJR0NPTlQiLCAiQ29udGludWVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdUVElOKQotICBFTlRSWShTSUdUVElOLCAiU0lHVFRJTiIsICJTdG9wcGVkICh0dHkgaW5wdXQpIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdUVE9VKQotICBFTlRSWShTSUdUVE9VLCAiU0lHVFRPVSIsICJTdG9wcGVkICh0dHkgb3V0cHV0KSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVlRBTFJNKQotICBFTlRSWShTSUdWVEFMUk0sICJTSUdWVEFMUk0iLCAiVmlydHVhbCB0aW1lciBleHBpcmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdQUk9GKQotICBFTlRSWShTSUdQUk9GLCAiU0lHUFJPRiIsICJQcm9maWxpbmcgdGltZXIgZXhwaXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHWENQVSkKLSAgRU5UUlkoU0lHWENQVSwgIlNJR1hDUFUiLCAiQ1BVIHRpbWUgbGltaXQgZXhjZWVkZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1hGU1opCi0gIEVOVFJZKFNJR1hGU1osICJTSUdYRlNaIiwgIkZpbGUgc2l6ZSBsaW1pdCBleGNlZWRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHV0lORCkKLSAgRU5UUlkoU0lHV0lORCwgIlNJR1dJTkQiLCAiU0lHV0lORCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHUEhPTkUpCi0gIEVOVFJZKFNJR1BIT05FLCAiU0lHUEhPTkUiLCAiU0lHUEhPTkUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0xPU1QpCi0gIEVOVFJZKFNJR0xPU1QsICJTSUdMT1NUIiwgIlJlc291cmNlIGxvc3QiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1dBSVRJTkcpCi0gIEVOVFJZKFNJR1dBSVRJTkcsICJTSUdXQUlUSU5HIiwgIlByb2Nlc3MncyBMV1BzIGFyZSBibG9ja2VkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdMV1ApCi0gIEVOVFJZKFNJR0xXUCwgIlNJR0xXUCIsICJTaWduYWwgTFdQIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdEQU5HRVIpCi0gIEVOVFJZKFNJR0RBTkdFUiwgIlNJR0RBTkdFUiIsICJTd2FwIHNwYWNlIGRhbmdlcm91c2x5IGxvdyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHR1JBTlQpCi0gIEVOVFJZKFNJR0dSQU5ULCAiU0lHR1JBTlQiLCAiTW9uaXRvciBtb2RlIGdyYW50ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1JFVFJBQ1QpCi0gIEVOVFJZKFNJR1JFVFJBQ1QsICJTSUdSRVRSQUNUIiwgIk5lZWQgdG8gcmVsaW5ndWlzaCBtb25pdG9yIG1vZGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR01TRykKLSAgRU5UUlkoU0lHTVNHLCAiU0lHTVNHIiwgIk1vbml0b3IgbW9kZSBkYXRhIGF2YWlsYWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHU09VTkQpCi0gIEVOVFJZKFNJR1NPVU5ELCAiU0lHU09VTkQiLCAiU291bmQgY29tcGxldGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdTQUspCi0gIEVOVFJZKFNJR1NBSywgIlNJR1NBSyIsICJTZWN1cmUgYXR0ZW50aW9uIiksCi0jZW5kaWYKLSAgRU5UUlkoMCwgTlVMTCwgTlVMTCkKLX07Ci0KLS8qIFRyYW5zbGF0aW9uIHRhYmxlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYXQgcnVudGltZS4gIEluZGV4ZWQgYnkgdGhlCi0gICBzaWduYWwgdmFsdWUgdG8gZmluZCB0aGUgZXF1aXZhbGVudCBzeW1ib2xpYyB2YWx1ZS4gKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKipzaWduYWxfbmFtZXM7Ci1zdGF0aWMgaW50IG51bV9zaWduYWxfbmFtZXMgPSAwOwotCi0vKiBUcmFuc2xhdGlvbiB0YWJsZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGF0IHJ1bnRpbWUsIGlmIGl0IGRvZXMgbm90Ci0gICBhbHJlYWR5IGV4aXN0IGluIHRoZSBob3N0IGVudmlyb25tZW50LiAgSW5kZXhlZCBieSB0aGUgc2lnbmFsIHZhbHVlIHRvIGZpbmQKLSAgIHRoZSBkZXNjcmlwdGl2ZSBzdHJpbmcuCi0KLSAgIFdlIGRvbid0IGV4cG9ydCBpdCBmb3IgdXNlIGluIG90aGVyIG1vZHVsZXMgYmVjYXVzZSBldmVuIHRob3VnaCBpdCBoYXMgdGhlCi0gICBzYW1lIG5hbWUsIGl0IGRpZmZlcnMgZnJvbSBvdGhlciBpbXBsZW1lbnRhdGlvbnMgaW4gdGhhdCBpdCBpcyBkeW5hbWljYWxseQotICAgaW5pdGlhbGl6ZWQgcmF0aGVyIHRoYW4gc3RhdGljYWxseSBpbml0aWFsaXplZC4gKi8KLQotI2lmbmRlZiBIQVZFX1NZU19TSUdMSVNUCi0KLXN0YXRpYyBpbnQgc3lzX25zaWc7Ci1zdGF0aWMgY29uc3QgY2hhciAqKnN5c19zaWdsaXN0OwotCi0jZWxzZQotCi0jaWZkZWYgTlNJRwotc3RhdGljIGludCBzeXNfbnNpZyA9IE5TSUc7Ci0jZWxzZQotI2lmZGVmIF9OU0lHCi1zdGF0aWMgaW50IHN5c19uc2lnID0gX05TSUc7Ci0jZW5kaWYKLSNlbmRpZgotZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBzeXNfc2lnbGlzdFtdOwotCi0jZW5kaWYKLQotCi0vKgotCi1OQU1FCi0KLQlpbml0X3NpZ25hbF90YWJsZXMgLS0gaW5pdGlhbGl6ZSB0aGUgbmFtZSBhbmQgbWVzc2FnZSB0YWJsZXMKLQotU1lOT1BTSVMKLQotCXN0YXRpYyB2b2lkIGluaXRfc2lnbmFsX3RhYmxlcyAoKTsKLQotREVTQ1JJUFRJT04KLQotCVVzaW5nIHRoZSBzaWduYWxfdGFibGUsIHdoaWNoIGlzIGluaXRpYWxpemVkIGF0IGNvbXBpbGUgdGltZSwgZ2VuZXJhdGUKLQl0aGUgc2lnbmFsX25hbWVzIGFuZCB0aGUgc3lzX3NpZ2xpc3QgKGlmIG5lZWRlZCkgdGFibGVzLCB3aGljaCBhcmUKLQlpbmRleGVkIGF0IHJ1bnRpbWUgYnkgYSBzcGVjaWZpYyBzaWduYWwgdmFsdWUuCi0KLUJVR1MKLQotCVRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdGFibGVzIG1heSBmYWlsIHVuZGVyIGxvdyBtZW1vcnkgY29uZGl0aW9ucywKLQlpbiB3aGljaCBjYXNlIHdlIGRvbid0IGRvIGFueXRoaW5nIHBhcnRpY3VsYXJseSB1c2VmdWwsIGJ1dCB3ZSBkb24ndAotCWJvbWIgZWl0aGVyLiAgV2hvIGtub3dzLCBpdCBtaWdodCBzdWNjZWVkIGF0IGEgbGF0ZXIgcG9pbnQgaWYgd2UgZnJlZQotCXNvbWUgbWVtb3J5IGluIHRoZSBtZWFudGltZS4gIEluIGFueSBjYXNlLCB0aGUgb3RoZXIgcm91dGluZXMga25vdwotCWhvdyB0byBkZWFsIHdpdGggbGFjayBvZiBhIHRhYmxlIGFmdGVyIHRyeWluZyB0byBpbml0aWFsaXplIGl0LiAgVGhpcwotCW1heSBvciBtYXkgbm90IGJlIGNvbnNpZGVyZWQgdG8gYmUgYSBidWcsIHRoYXQgd2UgZG9uJ3Qgc3BlY2lmaWNhbGx5Ci0Jd2FybiBhYm91dCB0aGlzIHBhcnRpY3VsYXIgZmFpbHVyZSBtb2RlLgotCi0qLwotCi1zdGF0aWMgdm9pZAotaW5pdF9zaWduYWxfdGFibGVzICgpCi17Ci0gIGNvbnN0IHN0cnVjdCBzaWduYWxfaW5mbyAqZWlwOwotICBpbnQgbmJ5dGVzOwotCi0gIC8qIElmIHdlIGhhdmVuJ3QgYWxyZWFkeSBzY2FubmVkIHRoZSBzaWduYWxfdGFibGUgb25jZSB0byBmaW5kIHRoZSBtYXhpbXVtCi0gICAgIHNpZ25hbCB2YWx1ZSwgdGhlbiBnbyBmaW5kIGl0IG5vdy4gKi8KLQotICBpZiAobnVtX3NpZ25hbF9uYW1lcyA9PSAwKQotICAgIHsKLSAgICAgIGZvciAoZWlwID0gc2lnbmFsX3RhYmxlOyBlaXAgLT4gbmFtZSAhPSBOVUxMOyBlaXArKykKLQl7Ci0JICBpZiAoZWlwIC0+IHZhbHVlID49IG51bV9zaWduYWxfbmFtZXMpCi0JICAgIHsKLQkgICAgICBudW1fc2lnbmFsX25hbWVzID0gZWlwIC0+IHZhbHVlICsgMTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogTm93IGF0dGVtcHQgdG8gYWxsb2NhdGUgdGhlIHNpZ25hbF9uYW1lcyB0YWJsZSwgemVybyBpdCBvdXQsIGFuZCB0aGVuCi0gICAgIGluaXRpYWxpemUgaXQgZnJvbSB0aGUgc3RhdGljYWxseSBpbml0aWFsaXplZCBzaWduYWxfdGFibGUuICovCi0KLSAgaWYgKHNpZ25hbF9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG5ieXRlcyA9IG51bV9zaWduYWxfbmFtZXMgKiBzaXplb2YgKGNoYXIgKik7Ci0gICAgICBpZiAoKHNpZ25hbF9uYW1lcyA9IChjb25zdCBjaGFyICoqKSBtYWxsb2MgKG5ieXRlcykpICE9IE5VTEwpCi0JewotCSAgbWVtc2V0IChzaWduYWxfbmFtZXMsIDAsIG5ieXRlcyk7Ci0JICBmb3IgKGVpcCA9IHNpZ25hbF90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JICAgIHsKLQkgICAgICBzaWduYWxfbmFtZXNbZWlwIC0+IHZhbHVlXSA9IGVpcCAtPiBuYW1lOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmbmRlZiBIQVZFX1NZU19TSUdMSVNUCi0KLSAgLyogTm93IGF0dGVtcHQgdG8gYWxsb2NhdGUgdGhlIHN5c19zaWdsaXN0IHRhYmxlLCB6ZXJvIGl0IG91dCwgYW5kIHRoZW4KLSAgICAgaW5pdGlhbGl6ZSBpdCBmcm9tIHRoZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkIHNpZ25hbF90YWJsZS4gKi8KLQotICBpZiAoc3lzX3NpZ2xpc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBuYnl0ZXMgPSBudW1fc2lnbmFsX25hbWVzICogc2l6ZW9mIChjaGFyICopOwotICAgICAgaWYgKChzeXNfc2lnbGlzdCA9IChjb25zdCBjaGFyICoqKSBtYWxsb2MgKG5ieXRlcykpICE9IE5VTEwpCi0JewotCSAgbWVtc2V0IChzeXNfc2lnbGlzdCwgMCwgbmJ5dGVzKTsKLQkgIHN5c19uc2lnID0gbnVtX3NpZ25hbF9uYW1lczsKLQkgIGZvciAoZWlwID0gc2lnbmFsX3RhYmxlOyBlaXAgLT4gbmFtZSAhPSBOVUxMOyBlaXArKykKLQkgICAgewotCSAgICAgIHN5c19zaWdsaXN0W2VpcCAtPiB2YWx1ZV0gPSBlaXAgLT4gbXNnOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2VuZGlmCi0KLX0KLQotCi0vKgotCi1OQU1FCi0KLQlzaWdub19tYXggLS0gcmV0dXJuIHRoZSBtYXggc2lnbm8gdmFsdWUKLQotU1lOT1BTSVMKLQotCWludCBzaWdub19tYXggKCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlSZXR1cm5zIHRoZSBtYXhpbXVtIHNpZ25vIHZhbHVlIGZvciB3aGljaCBhIGNvcnJlc3BvbmRpbmcgc3ltYm9saWMKLQluYW1lIG9yIG1lc3NhZ2UgaXMgYXZhaWxhYmxlLiAgTm90ZSB0aGF0IGluIHRoZSBjYXNlIHdoZXJlCi0Jd2UgdXNlIHRoZSBzeXNfc2lnbGlzdCBzdXBwbGllZCBieSB0aGUgc3lzdGVtLCBpdCBpcyBwb3NzaWJsZSBmb3IKLQl0aGVyZSB0byBiZSBtb3JlIHN5bWJvbGljIG5hbWVzIHRoYW4gbWVzc2FnZXMsIG9yIHZpY2UgdmVyc2EuCi0JSW4gZmFjdCwgdGhlIG1hbnVhbCBwYWdlIGZvciBwc2lnbmFsKDNiKSBleHBsaWNpdGx5IHdhcm5zIHRoYXQgb25lCi0Jc2hvdWxkIGNoZWNrIHRoZSBzaXplIG9mIHRoZSB0YWJsZSAoTlNJRykgYmVmb3JlIGluZGV4aW5nIGl0LAotCXNpbmNlIG5ldyBzaWduYWwgY29kZXMgbWF5IGJlIGFkZGVkIHRvIHRoZSBzeXN0ZW0gYmVmb3JlIHRoZXkgYXJlCi0JYWRkZWQgdG8gdGhlIHRhYmxlLiAgVGh1cyBOU0lHIG1pZ2h0IGJlIHNtYWxsZXIgdGhhbiB2YWx1ZQotCWltcGxpZWQgYnkgdGhlIGxhcmdlc3Qgc2lnbm8gdmFsdWUgZGVmaW5lZCBpbiA8c2lnbmFsLmg+LgotCi0JV2UgcmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgdG8gb2J0YWluIGEgbWVhbmluZ2Z1bAotCXN5bWJvbGljIG5hbWUgb3IgbWVzc2FnZS4KLQotKi8KLQotaW50Ci1zaWdub19tYXggKCkKLXsKLSAgaW50IG1heHNpemU7Ci0KLSAgaWYgKHNpZ25hbF9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluaXRfc2lnbmFsX3RhYmxlcyAoKTsKLSAgICB9Ci0gIG1heHNpemUgPSBNQVggKHN5c19uc2lnLCBudW1fc2lnbmFsX25hbWVzKTsKLSAgcmV0dXJuIChtYXhzaXplIC0gMSk7Ci19Ci0KLQotLyoKLQotTkFNRQotCi0Jc3Ryc2lnbmFsIC0tIG1hcCBhIHNpZ25hbCBudW1iZXIgdG8gYSBzaWduYWwgbWVzc2FnZSBzdHJpbmcKLQotU1lOT1BTSVMKLQotCWNvbnN0IGNoYXIgKnN0cnNpZ25hbCAoaW50IHNpZ25vKQotCi1ERVNDUklQVElPTgotCi0JTWFwcyBhbiBzaWduYWwgbnVtYmVyIHRvIGFuIHNpZ25hbCBtZXNzYWdlIHN0cmluZywgdGhlIGNvbnRlbnRzIG9mCi0Jd2hpY2ggYXJlIGltcGxlbWVudGF0aW9uIGRlZmluZWQuICBPbiBzeXN0ZW1zIHdoaWNoIGhhdmUgdGhlIGV4dGVybmFsCi0JdmFyaWFibGUgc3lzX3NpZ2xpc3QsIHRoZXNlIHN0cmluZ3Mgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgb25lcyB1c2VkCi0JYnkgcHNpZ25hbCgpLgotCi0JSWYgdGhlIHN1cHBsaWVkIHNpZ25hbCBudW1iZXIgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZSBvZiBpbmRpY2VzCi0JZm9yIHRoZSBzeXNfc2lnbGlzdCwgYnV0IG5vIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIGZvciB0aGUgcGFydGljdWxhcgotCXNpZ25hbCBudW1iZXIsIHRoZW4gcmV0dXJucyB0aGUgc3RyaW5nICJTaWduYWwgTlVNIiwgd2hlcmUgTlVNIGlzIHRoZQotCXNpZ25hbCBudW1iZXIuCi0KLQlJZiB0aGUgc3VwcGxpZWQgc2lnbmFsIG51bWJlciBpcyBub3QgYSB2YWxpZCBpbmRleCBpbnRvIHN5c19zaWdsaXN0LAotCXJldHVybnMgTlVMTC4KLQotCVRoZSByZXR1cm5lZCBzdHJpbmcgaXMgb25seSBndWFyYW50ZWVkIHRvIGJlIHZhbGlkIG9ubHkgdW50aWwgdGhlCi0JbmV4dCBjYWxsIHRvIHN0cnNpZ25hbC4KLQotKi8KLQotI2lmbmRlZiBIQVZFX1NUUlNJR05BTAotCi1jb25zdCBjaGFyICoKLXN0cnNpZ25hbCAoc2lnbm8pCi0gIGludCBzaWdubzsKLXsKLSAgY29uc3QgY2hhciAqbXNnOwotICBzdGF0aWMgY2hhciBidWZbMzJdOwotCi0jaWZuZGVmIEhBVkVfU1lTX1NJR0xJU1QKLQotICBpZiAoc2lnbmFsX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgaW5pdF9zaWduYWxfdGFibGVzICgpOwotICAgIH0KLQotI2VuZGlmCi0KLSAgaWYgKChzaWdubyA8IDApIHx8IChzaWdubyA+PSBzeXNfbnNpZykpCi0gICAgewotICAgICAgLyogT3V0IG9mIHJhbmdlLCBqdXN0IHJldHVybiBOVUxMICovCi0gICAgICBtc2cgPSBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoKHN5c19zaWdsaXN0ID09IE5VTEwpIHx8IChzeXNfc2lnbGlzdFtzaWdub10gPT0gTlVMTCkpCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGJ1dCBubyBzeXNfc2lnbGlzdCBvciBubyBlbnRyeSBhdCB0aGlzIGluZGV4LiAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiU2lnbmFsICVkIiwgc2lnbm8pOwotICAgICAgbXNnID0gKGNvbnN0IGNoYXIgKikgYnVmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBhbmQgYSB2YWxpZCBtZXNzYWdlLiAgSnVzdCByZXR1cm4gdGhlIG1lc3NhZ2UuICovCi0gICAgICBtc2cgPSAoY29uc3QgY2hhciAqKSBzeXNfc2lnbGlzdFtzaWdub107Ci0gICAgfQotICAKLSAgcmV0dXJuIChtc2cpOwotfQotCi0jZW5kaWYgLyogISBIQVZFX1NUUlNJR05BTCAqLwotCi0vKgotCi1OQU1FCi0KLQlzdHJzaWdubyAtLSBtYXAgYW4gc2lnbmFsIG51bWJlciB0byBhIHN5bWJvbGljIG5hbWUgc3RyaW5nCi0KLVNZTk9QU0lTCi0KLQljb25zdCBjaGFyICpzdHJzaWdubyAoaW50IHNpZ25vKQotCi1ERVNDUklQVElPTgotCi0JR2l2ZW4gYW4gc2lnbmFsIG51bWJlciwgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZwotCXRoZSBzeW1ib2xpYyBuYW1lIG9mIHRoYXQgc2lnbmFsIG51bWJlciwgYXMgZm91bmQgaW4gPHNpZ25hbC5oPi4KLQotCUlmIHRoZSBzdXBwbGllZCBzaWduYWwgbnVtYmVyIGlzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgaW5kaWNlcwotCWZvciBzeW1ib2xpYyBuYW1lcywgYnV0IG5vIG5hbWUgaXMgYXZhaWxhYmxlIGZvciB0aGUgcGFydGljdWxhcgotCXNpZ25hbCBudW1iZXIsIHRoZW4gcmV0dXJucyB0aGUgc3RyaW5nICJTaWduYWwgTlVNIiwgd2hlcmUgTlVNIGlzCi0JdGhlIHNpZ25hbCBudW1iZXIuCi0KLQlJZiB0aGUgc3VwcGxpZWQgc2lnbmFsIG51bWJlciBpcyBub3Qgd2l0aGluIHRoZSByYW5nZSBvZiB2YWxpZAotCWluZGljZXMsIHRoZW4gcmV0dXJucyBOVUxMLgotCi1CVUdTCi0KLQlUaGUgY29udGVudHMgb2YgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYXJlIG9ubHkgZ3VhcmFudGVlZCB0byBiZQotCXZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gc3Ryc2lnbm8uCi0KLSovCi0KLWNvbnN0IGNoYXIgKgotc3Ryc2lnbm8gKHNpZ25vKQotICBpbnQgc2lnbm87Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHN0YXRpYyBjaGFyIGJ1ZlszMl07Ci0KLSAgaWYgKHNpZ25hbF9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluaXRfc2lnbmFsX3RhYmxlcyAoKTsKLSAgICB9Ci0KLSAgaWYgKChzaWdubyA8IDApIHx8IChzaWdubyA+PSBudW1fc2lnbmFsX25hbWVzKSkKLSAgICB7Ci0gICAgICAvKiBPdXQgb2YgcmFuZ2UsIGp1c3QgcmV0dXJuIE5VTEwgKi8KLSAgICAgIG5hbWUgPSBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoKHNpZ25hbF9uYW1lcyA9PSBOVUxMKSB8fCAoc2lnbmFsX25hbWVzW3NpZ25vXSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICAvKiBJbiByYW5nZSwgYnV0IG5vIHNpZ25hbF9uYW1lcyBvciBubyBlbnRyeSBhdCB0aGlzIGluZGV4LiAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiU2lnbmFsICVkIiwgc2lnbm8pOwotICAgICAgbmFtZSA9IChjb25zdCBjaGFyICopIGJ1ZjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJbiByYW5nZSwgYW5kIGEgdmFsaWQgbmFtZS4gIEp1c3QgcmV0dXJuIHRoZSBuYW1lLiAqLwotICAgICAgbmFtZSA9IHNpZ25hbF9uYW1lc1tzaWdub107Ci0gICAgfQotCi0gIHJldHVybiAobmFtZSk7Ci19Ci0KLQotLyoKLQotTkFNRQotCi0Jc3RydG9zaWdubyAtLSBtYXAgYSBzeW1ib2xpYyBzaWduYWwgbmFtZSB0byBhIG51bWVyaWMgdmFsdWUKLQotU1lOT1BTSVMKLQotCWludCBzdHJ0b3NpZ25vIChjaGFyICpuYW1lKQotCi1ERVNDUklQVElPTgotCi0JR2l2ZW4gdGhlIHN5bWJvbGljIG5hbWUgb2YgYSBzaWduYWwsIG1hcCBpdCB0byBhIHNpZ25hbCBudW1iZXIuCi0JSWYgbm8gdHJhbnNsYXRpb24gaXMgZm91bmQsIHJldHVybnMgMC4KLQotKi8KLQotaW50Ci1zdHJ0b3NpZ25vIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgc2lnbm8gPSAwOwotCi0gIGlmIChuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHNpZ25hbF9uYW1lcyA9PSBOVUxMKQotCXsKLQkgIGluaXRfc2lnbmFsX3RhYmxlcyAoKTsKLQl9Ci0gICAgICBmb3IgKHNpZ25vID0gMDsgc2lnbm8gPCBudW1fc2lnbmFsX25hbWVzOyBzaWdubysrKQotCXsKLQkgIGlmICgoc2lnbmFsX25hbWVzW3NpZ25vXSAhPSBOVUxMKSAmJgotCSAgICAgIChzdHJjbXAgKG5hbWUsIHNpZ25hbF9uYW1lc1tzaWdub10pID09IDApKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc2lnbm8gPT0gbnVtX3NpZ25hbF9uYW1lcykKLQl7Ci0JICBzaWdubyA9IDA7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChzaWdubyk7Ci19Ci0KLQotLyoKLQotTkFNRQotCi0JcHNpZ25hbCAtLSBwcmludCBtZXNzYWdlIGFib3V0IHNpZ25hbCB0byBzdGRlcnIKLQotU1lOT1BTSVMKLQotCXZvaWQgcHNpZ25hbCAodW5zaWduZWQgc2lnbm8sIGNoYXIgKm1lc3NhZ2UpOwotCi1ERVNDUklQVElPTgotCi0JUHJpbnQgdG8gdGhlIHN0YW5kYXJkIGVycm9yIHRoZSBtZXNzYWdlLCBmb2xsb3dlZCBieSBhIGNvbG9uLAotCWZvbGxvd2VkIGJ5IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2lnbmFsIHNwZWNpZmllZCBieSBzaWdubywKLQlmb2xsb3dlZCBieSBhIG5ld2xpbmUuCi0qLwotCi0jaWZuZGVmIEhBVkVfUFNJR05BTAotCi12b2lkCi1wc2lnbmFsIChzaWdubywgbWVzc2FnZSkKLSAgdW5zaWduZWQgc2lnbm87Ci0gIGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0gICAgfQotICBpZiAoKHNpZ25vIDw9IDApIHx8IChzaWdubyA+PSBzeXNfbnNpZykpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IHVua25vd24gc2lnbmFsXG4iLCBtZXNzYWdlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXNcbiIsIG1lc3NhZ2UsIHN5c19zaWdsaXN0W3NpZ25vXSk7Ci0gICAgfQotfQotCi0jZW5kaWYJLyogISBIQVZFX1BTSUdOQUwgKi8KLQotCi0vKiBBIHNpbXBsZSBsaXR0bGUgbWFpbiB0aGF0IGRvZXMgbm90aGluZyBidXQgcHJpbnQgYWxsIHRoZSBzaWduYWwgdHJhbnNsYXRpb25zCi0gICBpZiBNQUlOIGlzIGRlZmluZWQgYW5kIHRoaXMgZmlsZSBpcyBjb21waWxlZCBhbmQgbGlua2VkLiAqLwotCi0jaWZkZWYgTUFJTgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50Ci1tYWluICgpCi17Ci0gIGludCBzaWdubzsKLSAgaW50IG1heHNpZ25vOwotICBjb25zdCBjaGFyICpuYW1lOwotICBjb25zdCBjaGFyICptc2c7Ci0KLSAgbWF4c2lnbm8gPSBzaWdub19tYXggKCk7Ci0gIHByaW50ZiAoIiVkIGVudHJpZXMgaW4gbmFtZXMgdGFibGUuXG4iLCBudW1fc2lnbmFsX25hbWVzKTsKLSAgcHJpbnRmICgiJWQgZW50cmllcyBpbiBtZXNzYWdlcyB0YWJsZS5cbiIsIHN5c19uc2lnKTsKLSAgcHJpbnRmICgiJWQgaXMgbWF4IHVzZWZ1bCBpbmRleC5cbiIsIG1heHNpZ25vKTsKLQotICAvKiBLZWVwIHByaW50aW5nIHZhbHVlcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIGVuZCBvZiAqYm90aCogdGFibGVzLCBub3QKLSAgICAgKmVpdGhlciogdGFibGUuICBOb3RlIHRoYXQga25vd2luZyB0aGUgbWF4aW11bSB1c2VmdWwgaW5kZXggZG9lcyAqbm90KgotICAgICByZWxpZXZlIHVzIG9mIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0ZXN0aW5nIHRoZSByZXR1cm4gcG9pbnRlciBmb3IKLSAgICAgTlVMTC4gKi8KLQotICBmb3IgKHNpZ25vID0gMDsgc2lnbm8gPD0gbWF4c2lnbm87IHNpZ25vKyspCi0gICAgewotICAgICAgbmFtZSA9IHN0cnNpZ25vIChzaWdubyk7Ci0gICAgICBuYW1lID0gKG5hbWUgPT0gTlVMTCkgPyAiPE5VTEw+IiA6IG5hbWU7Ci0gICAgICBtc2cgPSBzdHJzaWduYWwgKHNpZ25vKTsKLSAgICAgIG1zZyA9IChtc2cgPT0gTlVMTCkgPyAiPE5VTEw+IiA6IG1zZzsKLSAgICAgIHByaW50ZiAoIiUtNGQlLTE4cyVzXG4iLCBzaWdubywgbmFtZSwgbXNnKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnN0ci5jIGIvbGliaWJlcnR5L3N0cnN0ci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWIzNmUzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJzdHIuYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBzdHJzdHIgZm9yIHN5c3RlbXMgd2l0aG91dCBpdC4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0vKgotCi1OQU1FCi0KLQlzdHJzdHIgLS0gbG9jYXRlIGZpcnN0IG9jY3VyYW5jZSBvZiBhIHN1YnN0cmluZwotCi1TWU5PUFNJUwotCi0JI2luY2x1ZGUgPHN0cmluZy5oPgotCi0JY2hhciAqc3Ryc3RyIChjaGFyICpzMSwgY2hhciAqczIpCi0KLURFU0NSSVBUSU9OCi0KLQlMb2NhdGVzIHRoZSBmaXJzdCBvY2N1cmFuY2UgaW4gdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IFMxIG9mCi0JdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IFMyLiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN1YnN0cmluZwotCWZvdW5kLCBvciBhIE5VTEwgcG9pbnRlciBpZiBub3QgZm91bmQuICBJZiBTMiBwb2ludHMgdG8gYSBzdHJpbmcKLQl3aXRoIHplcm8gbGVuZ3RoLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBTMS4KLQkKLUJVR1MKLQotKi8KLQotCi0vKiBGSVhNRTogIFRoZSBhYm92ZSBkZXNjcmlwdGlvbiBpcyBBTlNJIGNvbXBpbGlhbnQuICBUaGlzIHJvdXRpbmUgaGFzIG5vdAotICAgYmVlbiB2YWxpZGF0ZWQgdG8gY29tcGx5IHdpdGggaXQuICAtZm5mICovCi0KLWNoYXIgKgotc3Ryc3RyIChzMSwgczIpCi0gIGNoYXIgKnMxLCAqczI7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnAgPSBzMTsKLSAgZXh0ZXJuIGNoYXIgKnN0cmNociAoKTsKLSAgZXh0ZXJuIGludCBzdHJuY21wICgpOwotI2lmIF9fR05VQ19fPT0yCi0gIGV4dGVybiBfX1NJWkVfVFlQRV9fIHN0cmxlbiAoKTsKLSNlbmRpZgotICByZWdpc3RlciBpbnQgbGVuID0gc3RybGVuIChzMik7Ci0KLSAgZm9yICg7IChwID0gc3RyY2hyIChwLCAqczIpKSAhPSAwOyBwKyspCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKHAsIHMyLCBsZW4pID09IDApCi0JewotCSAgcmV0dXJuIChwKTsKLQl9Ci0gICAgfQotICByZXR1cm4gKDApOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnRvZC5jIGIvbGliaWJlcnR5L3N0cnRvZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODZjNzNkLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJ0b2QuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiBzdHJ0b2QgZm9yIHN5c3RlbXMgd2l0aCBhdG9mLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQotc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCi10ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLUFzIGEgc3BlY2lhbCBleGNlcHRpb24sIGlmIHlvdSBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIGZpbGVzCi1jb21waWxlZCB3aXRoIGEgR05VIGNvbXBpbGVyIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcyBkb2VzIG5vdCBjYXVzZQotdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeQotdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLWV4dGVybiBkb3VibGUgYXRvZiAoKTsKLQotLyogRGlzY2xhaW1lcjogdGhpcyBpcyBjdXJyZW50bHkganVzdCB1c2VkIGJ5IENISUxMIGluIEdEQiBhbmQgdGhlcmVmb3JlCi0gICBoYXMgbm90IGJlZW4gdGVzdGVkIHdlbGwuICBJdCBtYXkgaGF2ZSBiZWVuIHRlc3RlZCBmb3Igbm90aGluZyBleGNlcHQKLSAgIHRoYXQgaXQgY29tcGlsZXMuICAqLwotCi1kb3VibGUKLXN0cnRvZCAoc3RyLCBwdHIpCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgY2hhciAqKnB0cjsKLXsKLSAgY2hhciAqcDsKLQotICBpZiAocHRyID09IChjaGFyICoqKTApCi0gICAgcmV0dXJuIGF0b2YgKHN0cik7Ci0gIAotICBwID0gc3RyOwotICAKLSAgd2hpbGUgKGlzc3BhY2UgKCpwKSkKLSAgICArK3A7Ci0gIAotICBpZiAoKnAgPT0gJysnIHx8ICpwID09ICctJykKLSAgICArK3A7Ci0KLSAgLyogSU5GIG9yIElORklOSVRZLiAgKi8KLSAgaWYgKChwWzBdID09ICdpJyB8fCBwWzBdID09ICdJJykKLSAgICAgICYmIChwWzFdID09ICduJyB8fCBwWzFdID09ICdOJykKLSAgICAgICYmIChwWzJdID09ICdmJyB8fCBwWzJdID09ICdGJykpCi0gICAgewotICAgICAgaWYgKChwWzNdID09ICdpJyB8fCBwWzNdID09ICdJJykKLQkgICYmIChwWzRdID09ICduJyB8fCBwWzRdID09ICdOJykKLQkgICYmIChwWzVdID09ICdpJyB8fCBwWzVdID09ICdJJykKLQkgICYmIChwWzZdID09ICd0JyB8fCBwWzZdID09ICdUJykKLQkgICYmIChwWzddID09ICd5JyB8fCBwWzddID09ICdZJykpCi0JewotCSAgKnB0ciA9IHAgKyA3OwotCSAgcmV0dXJuIGF0b2YgKHN0cik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICpwdHIgPSBwICsgMzsKLQkgIHJldHVybiBhdG9mIChzdHIpOwotCX0KLSAgICB9Ci0KLSAgLyogTkFOIG9yIE5BTihmb28pLiAgKi8KLSAgaWYgKChwWzBdID09ICduJyB8fCBwWzBdID09ICdOJykKLSAgICAgICYmIChwWzFdID09ICdhJyB8fCBwWzFdID09ICdBJykKLSAgICAgICYmIChwWzJdID09ICduJyB8fCBwWzJdID09ICdOJykpCi0gICAgewotICAgICAgcCArPSAzOwotICAgICAgaWYgKCpwID09ICcoJykKLQl7Ci0JICArK3A7Ci0JICB3aGlsZSAoKnAgIT0gJ1wwJyAmJiAqcCAhPSAnKScpCi0JICAgICsrcDsKLQkgIGlmICgqcCA9PSAnKScpCi0JICAgICsrcDsKLQl9Ci0gICAgICAqcHRyID0gcDsKLSAgICAgIHJldHVybiBhdG9mIChzdHIpOwotICAgIH0KLQotICAvKiBkaWdpdHMsIHdpdGggMCBvciAxIHBlcmlvZHMgaW4gaXQuICAqLwotICBpZiAoaXNkaWdpdCAoKnApIHx8ICpwID09ICcuJykKLSAgICB7Ci0gICAgICBpbnQgZ290X2RvdCA9IDA7Ci0gICAgICB3aGlsZSAoaXNkaWdpdCAoKnApIHx8ICghZ290X2RvdCAmJiAqcCA9PSAnLicpKQotCXsKLQkgIGlmICgqcCA9PSAnLicpCi0JICAgIGdvdF9kb3QgPSAxOwotCSAgKytwOwotCX0KLQotICAgICAgLyogRXhwb25lbnQuICAqLwotICAgICAgaWYgKCpwID09ICdlJyB8fCAqcCA9PSAnRScpCi0JewotCSAgaW50IGk7Ci0JICBpID0gMTsKLQkgIGlmIChwW2ldID09ICcrJyB8fCBwW2ldID09ICctJykKLQkgICAgKytpOwotCSAgaWYgKGlzZGlnaXQgKHBbaV0pKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKGlzZGlnaXQgKHBbaV0pKQotCQkrK2k7Ci0JICAgICAgKnB0ciA9IHAgKyBpOwotCSAgICAgIHJldHVybiBhdG9mIChzdHIpOwotCSAgICB9Ci0JfQotICAgICAgKnB0ciA9IHA7Ci0gICAgICByZXR1cm4gYXRvZiAoc3RyKTsKLSAgICB9Ci0gIC8qIERpZG4ndCBmaW5kIGFueSBkaWdpdHMuICBEb2Vzbid0IGxvb2sgbGlrZSBhIG51bWJlci4gICovCi0gICpwdHIgPSBzdHI7Ci0gIHJldHVybiAwLjA7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RydG9sLmMgYi9saWJpYmVydHkvc3RydG9sLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZDE3MDYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cnRvbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qLQotICogQ29weXJpZ2h0IChjKSAxOTkwIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCi0gKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZiAwCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0vKiBGSVhNRTogSXQnZCBiZSBuaWNlIHRvIGNvbmZpZ3VyZSBhcm91bmQgdGhlc2UsIGJ1dCB0aGUgaW5jbHVkZSBmaWxlcyBhcmUgdG9vCi0gICBwYWluZnVsLiAgVGhlc2UgbWFjcm9zIHNob3VsZCBhdCBsZWFzdCBiZSBtb3JlIHBvcnRhYmxlIHRoYW4gaGFyZHdpcmVkIGhleAotICAgY29uc3RhbnRzLiAqLwotCi0jaWZuZGVmIFVMT05HX01BWAotI2RlZmluZQlVTE9OR19NQVgJKCh1bnNpZ25lZCBsb25nKSh+MEwpKQkJLyogMHhGRkZGRkZGRiAqLwotI2VuZGlmCi0KLSNpZm5kZWYgTE9OR19NQVgKLSNkZWZpbmUJTE9OR19NQVgJKChsb25nKShVTE9OR19NQVggPj4gMSkpCS8qIDB4N0ZGRkZGRkYgKi8KLSNlbmRpZgotCi0jaWZuZGVmIExPTkdfTUlOCi0jZGVmaW5lCUxPTkdfTUlOCSgobG9uZykofkxPTkdfTUFYKSkJCS8qIDB4ODAwMDAwMDAgKi8KLSNlbmRpZgotCi0vKgotICogQ29udmVydCBhIHN0cmluZyB0byBhIGxvbmcgaW50ZWdlci4KLSAqCi0gKiBJZ25vcmVzIGBsb2NhbGUnIHN0dWZmLiAgQXNzdW1lcyB0aGF0IHRoZSB1cHBlciBhbmQgbG93ZXIgY2FzZQotICogYWxwaGFiZXRzIGFuZCBkaWdpdHMgYXJlIGVhY2ggY29udGlndW91cy4KLSAqLwotbG9uZwotc3RydG9sKG5wdHIsIGVuZHB0ciwgYmFzZSkKLQljb25zdCBjaGFyICpucHRyOwotCWNoYXIgKiplbmRwdHI7Ci0JcmVnaXN0ZXIgaW50IGJhc2U7Ci17Ci0JcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IG5wdHI7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBhY2M7Ci0JcmVnaXN0ZXIgaW50IGM7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBjdXRvZmY7Ci0JcmVnaXN0ZXIgaW50IG5lZyA9IDAsIGFueSwgY3V0bGltOwotCi0JLyoKLQkgKiBTa2lwIHdoaXRlIHNwYWNlIGFuZCBwaWNrIHVwIGxlYWRpbmcgKy8tIHNpZ24gaWYgYW55LgotCSAqIElmIGJhc2UgaXMgMCwgYWxsb3cgMHggZm9yIGhleCBhbmQgMCBmb3Igb2N0YWwsIGVsc2UKLQkgKiBhc3N1bWUgZGVjaW1hbDsgaWYgYmFzZSBpcyBhbHJlYWR5IDE2LCBhbGxvdyAweC4KLQkgKi8KLQlkbyB7Ci0JCWMgPSAqcysrOwotCX0gd2hpbGUgKGlzc3BhY2UoYykpOwotCWlmIChjID09ICctJykgewotCQluZWcgPSAxOwotCQljID0gKnMrKzsKLQl9IGVsc2UgaWYgKGMgPT0gJysnKQotCQljID0gKnMrKzsKLQlpZiAoKGJhc2UgPT0gMCB8fCBiYXNlID09IDE2KSAmJgotCSAgICBjID09ICcwJyAmJiAoKnMgPT0gJ3gnIHx8ICpzID09ICdYJykpIHsKLQkJYyA9IHNbMV07Ci0JCXMgKz0gMjsKLQkJYmFzZSA9IDE2OwotCX0KLQlpZiAoYmFzZSA9PSAwKQotCQliYXNlID0gYyA9PSAnMCcgPyA4IDogMTA7Ci0KLQkvKgotCSAqIENvbXB1dGUgdGhlIGN1dG9mZiB2YWx1ZSBiZXR3ZWVuIGxlZ2FsIG51bWJlcnMgYW5kIGlsbGVnYWwKLQkgKiBudW1iZXJzLiAgVGhhdCBpcyB0aGUgbGFyZ2VzdCBsZWdhbCB2YWx1ZSwgZGl2aWRlZCBieSB0aGUKLQkgKiBiYXNlLiAgQW4gaW5wdXQgbnVtYmVyIHRoYXQgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdmFsdWUsIGlmCi0JICogZm9sbG93ZWQgYnkgYSBsZWdhbCBpbnB1dCBjaGFyYWN0ZXIsIGlzIHRvbyBiaWcuICBPbmUgdGhhdAotCSAqIGlzIGVxdWFsIHRvIHRoaXMgdmFsdWUgbWF5IGJlIHZhbGlkIG9yIG5vdDsgdGhlIGxpbWl0Ci0JICogYmV0d2VlbiB2YWxpZCBhbmQgaW52YWxpZCBudW1iZXJzIGlzIHRoZW4gYmFzZWQgb24gdGhlIGxhc3QKLQkgKiBkaWdpdC4gIEZvciBpbnN0YW5jZSwgaWYgdGhlIHJhbmdlIGZvciBsb25ncyBpcwotCSAqIFstMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0N10gYW5kIHRoZSBpbnB1dCBiYXNlIGlzIDEwLAotCSAqIGN1dG9mZiB3aWxsIGJlIHNldCB0byAyMTQ3NDgzNjQgYW5kIGN1dGxpbSB0byBlaXRoZXIKLQkgKiA3IChuZWc9PTApIG9yIDggKG5lZz09MSksIG1lYW5pbmcgdGhhdCBpZiB3ZSBoYXZlIGFjY3VtdWxhdGVkCi0JICogYSB2YWx1ZSA+IDIxNDc0ODM2NCwgb3IgZXF1YWwgYnV0IHRoZSBuZXh0IGRpZ2l0IGlzID4gNyAob3IgOCksCi0JICogdGhlIG51bWJlciBpcyB0b28gYmlnLCBhbmQgd2Ugd2lsbCByZXR1cm4gYSByYW5nZSBlcnJvci4KLQkgKgotCSAqIFNldCBhbnkgaWYgYW55IGBkaWdpdHMnIGNvbnN1bWVkOyBtYWtlIGl0IG5lZ2F0aXZlIHRvIGluZGljYXRlCi0JICogb3ZlcmZsb3cuCi0JICovCi0JY3V0b2ZmID0gbmVnID8gLSh1bnNpZ25lZCBsb25nKUxPTkdfTUlOIDogTE9OR19NQVg7Ci0JY3V0bGltID0gY3V0b2ZmICUgKHVuc2lnbmVkIGxvbmcpYmFzZTsKLQljdXRvZmYgLz0gKHVuc2lnbmVkIGxvbmcpYmFzZTsKLQlmb3IgKGFjYyA9IDAsIGFueSA9IDA7OyBjID0gKnMrKykgewotCQlpZiAoaXNkaWdpdChjKSkKLQkJCWMgLT0gJzAnOwotCQllbHNlIGlmIChpc2FscGhhKGMpKQotCQkJYyAtPSBpc3VwcGVyKGMpID8gJ0EnIC0gMTAgOiAnYScgLSAxMDsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JCWlmIChjID49IGJhc2UpCi0JCQlicmVhazsKLQkJaWYgKGFueSA8IDAgfHwgYWNjID4gY3V0b2ZmIHx8IGFjYyA9PSBjdXRvZmYgJiYgYyA+IGN1dGxpbSkKLQkJCWFueSA9IC0xOwotCQllbHNlIHsKLQkJCWFueSA9IDE7Ci0JCQlhY2MgKj0gYmFzZTsKLQkJCWFjYyArPSBjOwotCQl9Ci0JfQotCWlmIChhbnkgPCAwKSB7Ci0JCWFjYyA9IG5lZyA/IExPTkdfTUlOIDogTE9OR19NQVg7Ci0JCWVycm5vID0gRVJBTkdFOwotCX0gZWxzZSBpZiAobmVnKQotCQlhY2MgPSAtYWNjOwotCWlmIChlbmRwdHIgIT0gMCkKLQkJKmVuZHB0ciA9IChjaGFyICopIChhbnkgPyBzIC0gMSA6IG5wdHIpOwotCXJldHVybiAoYWNjKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJ0b3VsLmMgYi9saWJpYmVydHkvc3RydG91bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjZmMmQ2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJ0b3VsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5MCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCi0gKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZiAwCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0jaWZuZGVmIFVMT05HX01BWAotI2RlZmluZQlVTE9OR19NQVgJKCh1bnNpZ25lZCBsb25nKSh+MEwpKQkJLyogMHhGRkZGRkZGRiAqLwotI2VuZGlmCi0KLS8qCi0gKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGxvbmcgaW50ZWdlci4KLSAqCi0gKiBJZ25vcmVzIGBsb2NhbGUnIHN0dWZmLiAgQXNzdW1lcyB0aGF0IHRoZSB1cHBlciBhbmQgbG93ZXIgY2FzZQotICogYWxwaGFiZXRzIGFuZCBkaWdpdHMgYXJlIGVhY2ggY29udGlndW91cy4KLSAqLwotdW5zaWduZWQgbG9uZwotc3RydG91bChucHRyLCBlbmRwdHIsIGJhc2UpCi0JY29uc3QgY2hhciAqbnB0cjsKLQljaGFyICoqZW5kcHRyOwotCXJlZ2lzdGVyIGludCBiYXNlOwotewotCXJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSBucHRyOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgYWNjOwotCXJlZ2lzdGVyIGludCBjOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgY3V0b2ZmOwotCXJlZ2lzdGVyIGludCBuZWcgPSAwLCBhbnksIGN1dGxpbTsKLQotCS8qCi0JICogU2VlIHN0cnRvbCBmb3IgY29tbWVudHMgYXMgdG8gdGhlIGxvZ2ljIHVzZWQuCi0JICovCi0JZG8gewotCQljID0gKnMrKzsKLQl9IHdoaWxlIChpc3NwYWNlKGMpKTsKLQlpZiAoYyA9PSAnLScpIHsKLQkJbmVnID0gMTsKLQkJYyA9ICpzKys7Ci0JfSBlbHNlIGlmIChjID09ICcrJykKLQkJYyA9ICpzKys7Ci0JaWYgKChiYXNlID09IDAgfHwgYmFzZSA9PSAxNikgJiYKLQkgICAgYyA9PSAnMCcgJiYgKCpzID09ICd4JyB8fCAqcyA9PSAnWCcpKSB7Ci0JCWMgPSBzWzFdOwotCQlzICs9IDI7Ci0JCWJhc2UgPSAxNjsKLQl9Ci0JaWYgKGJhc2UgPT0gMCkKLQkJYmFzZSA9IGMgPT0gJzAnID8gOCA6IDEwOwotCWN1dG9mZiA9ICh1bnNpZ25lZCBsb25nKVVMT05HX01BWCAvICh1bnNpZ25lZCBsb25nKWJhc2U7Ci0JY3V0bGltID0gKHVuc2lnbmVkIGxvbmcpVUxPTkdfTUFYICUgKHVuc2lnbmVkIGxvbmcpYmFzZTsKLQlmb3IgKGFjYyA9IDAsIGFueSA9IDA7OyBjID0gKnMrKykgewotCQlpZiAoaXNkaWdpdChjKSkKLQkJCWMgLT0gJzAnOwotCQllbHNlIGlmIChpc2FscGhhKGMpKQotCQkJYyAtPSBpc3VwcGVyKGMpID8gJ0EnIC0gMTAgOiAnYScgLSAxMDsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JCWlmIChjID49IGJhc2UpCi0JCQlicmVhazsKLQkJaWYgKGFueSA8IDAgfHwgYWNjID4gY3V0b2ZmIHx8IGFjYyA9PSBjdXRvZmYgJiYgYyA+IGN1dGxpbSkKLQkJCWFueSA9IC0xOwotCQllbHNlIHsKLQkJCWFueSA9IDE7Ci0JCQlhY2MgKj0gYmFzZTsKLQkJCWFjYyArPSBjOwotCQl9Ci0JfQotCWlmIChhbnkgPCAwKSB7Ci0JCWFjYyA9IFVMT05HX01BWDsKLQkJZXJybm8gPSBFUkFOR0U7Ci0JfSBlbHNlIGlmIChuZWcpCi0JCWFjYyA9IC1hY2M7Ci0JaWYgKGVuZHB0ciAhPSAwKQotCQkqZW5kcHRyID0gKGNoYXIgKikgKGFueSA/IHMgLSAxIDogbnB0cik7Ci0JcmV0dXJuIChhY2MpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3RtcG5hbS5jIGIvbGliaWJlcnR5L3RtcG5hbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDYxNDY3Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS90bXBuYW0uYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZuZGVmIExfdG1wbmFtCi0jZGVmaW5lIExfdG1wbmFtZSAxMDAKLSNlbmRpZgotI2lmbmRlZiBQX3RtcGRpcgotI2RlZmluZSBQX3RtcGRpciAiL3Vzci90bXAiCi0jZW5kaWYKLQotc3RhdGljIGNoYXIgdG1wbmFtX2J1ZmZlcltMX3RtcG5hbV07Ci1zdGF0aWMgaW50IHRtcG5hbV9jb3VudGVyOwotCi1leHRlcm4gaW50IGdldHBpZCAoKTsKLQotY2hhciAqCi10bXBuYW0gKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIGludCBwaWQgPSBnZXRwaWQgKCk7Ci0KLSAgaWYgKHMgPT0gTlVMTCkKLSAgICBzID0gdG1wbmFtX2J1ZmZlcjsKLQotICAvKiAgR2VuZXJhdGUgdGhlIGZpbGVuYW1lIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpc24ndCBvbmUgY2FsbGVkCi0gICAgICBpdCBhbHJlYWR5LiAgKi8KLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBGSUxFICpmOwotICAgICAgc3ByaW50ZiAocywgIiVzLyVzJXguJXgiLCBQX3RtcGRpciwgInQiLCBwaWQsIHRtcG5hbV9jb3VudGVyKTsKLSAgICAgIGYgPSBmb3BlbiAocywgInIiKTsKLSAgICAgIGlmIChmID09IE5VTEwpCi0JYnJlYWs7Ci0gICAgICB0bXBuYW1fY291bnRlcisrOwotICAgICAgZmNsb3NlIChmKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHM7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdmFzcHJpbnRmLmMgYi9saWJpYmVydHkvdmFzcHJpbnRmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYjgwZTYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3Zhc3ByaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qIExpa2UgdnNwcmludGYgYnV0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBtYWxsb2MnZCBzdG9yYWdlLCB3aGljaCBtdXN0Ci0gICBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgotICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotI2lmZGVmIFRFU1QKLWludCBnbG9iYWxfdG90YWxfd2lkdGg7Ci0jZW5kaWYKLQotdW5zaWduZWQgbG9uZyBzdHJ0b3VsICgpOwotY2hhciAqbWFsbG9jICgpOwotCi1zdGF0aWMgaW50Ci1pbnRfdmFzcHJpbnRmIChyZXN1bHQsIGZvcm1hdCwgYXJncykKLSAgICAgY2hhciAqKnJlc3VsdDsKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICB2YV9saXN0ICphcmdzOwotewotICBjb25zdCBjaGFyICpwID0gZm9ybWF0OwotICAvKiBBZGQgb25lIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG5ldmVyIHplcm8sIHdoaWNoIG1pZ2h0IGNhdXNlIG1hbGxvYwotICAgICB0byByZXR1cm4gTlVMTC4gICovCi0gIGludCB0b3RhbF93aWR0aCA9IHN0cmxlbiAoZm9ybWF0KSArIDE7Ci0gIHZhX2xpc3QgYXA7Ci0KLSAgbWVtY3B5ICgoUFRSKSAmYXAsIChQVFIpIGFyZ3MsIHNpemVvZiAodmFfbGlzdCkpOwotCi0gIHdoaWxlICgqcCAhPSAnXDAnKQotICAgIHsKLSAgICAgIGlmICgqcCsrID09ICclJykKLQl7Ci0JICB3aGlsZSAoc3RyY2hyICgiLSsgIzAiLCAqcCkpCi0JICAgICsrcDsKLQkgIGlmICgqcCA9PSAnKicpCi0JICAgIHsKLQkgICAgICArK3A7Ci0JICAgICAgdG90YWxfd2lkdGggKz0gYWJzICh2YV9hcmcgKGFwLCBpbnQpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB0b3RhbF93aWR0aCArPSBzdHJ0b3VsIChwLCAmcCwgMTApOwotCSAgaWYgKCpwID09ICcuJykKLQkgICAgewotCSAgICAgICsrcDsKLQkgICAgICBpZiAoKnAgPT0gJyonKQotCQl7Ci0JCSAgKytwOwotCQkgIHRvdGFsX3dpZHRoICs9IGFicyAodmFfYXJnIChhcCwgaW50KSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JICAgICAgdG90YWxfd2lkdGggKz0gc3RydG91bCAocCwgJnAsIDEwKTsKLQkgICAgfQotCSAgd2hpbGUgKHN0cmNociAoImhsTCIsICpwKSkKLQkgICAgKytwOwotCSAgLyogU2hvdWxkIGJlIGJpZyBlbm91Z2ggZm9yIGFueSBmb3JtYXQgc3BlY2lmaWVyIGV4Y2VwdCAlcyBhbmQgZmxvYXRzLiAgKi8KLQkgIHRvdGFsX3dpZHRoICs9IDMwOwotCSAgc3dpdGNoICgqcCkKLQkgICAgewotCSAgICBjYXNlICdkJzoKLQkgICAgY2FzZSAnaSc6Ci0JICAgIGNhc2UgJ28nOgotCSAgICBjYXNlICd1JzoKLQkgICAgY2FzZSAneCc6Ci0JICAgIGNhc2UgJ1gnOgotCSAgICBjYXNlICdjJzoKLQkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgaW50KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnZic6Ci0JICAgIGNhc2UgJ2UnOgotCSAgICBjYXNlICdFJzoKLQkgICAgY2FzZSAnZyc6Ci0JICAgIGNhc2UgJ0cnOgotCSAgICAgICh2b2lkKSB2YV9hcmcgKGFwLCBkb3VibGUpOwotCSAgICAgIC8qIFNpbmNlIGFuIGllZWUgZG91YmxlIGNhbiBoYXZlIGFuIGV4cG9uZW50IG9mIDMwNywgd2UnbGwKLQkJIG1ha2UgdGhlIGJ1ZmZlciB3aWRlIGVub3VnaCB0byBjb3ZlciB0aGUgZ3Jvc3MgY2FzZS4gKi8KLQkgICAgICB0b3RhbF93aWR0aCArPSAzMDc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3MnOgotCSAgICAgIHRvdGFsX3dpZHRoICs9IHN0cmxlbiAodmFfYXJnIChhcCwgY2hhciAqKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3AnOgotCSAgICBjYXNlICduJzoKLQkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgY2hhciAqKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0jaWZkZWYgVEVTVAotICBnbG9iYWxfdG90YWxfd2lkdGggPSB0b3RhbF93aWR0aDsKLSNlbmRpZgotICAqcmVzdWx0ID0gbWFsbG9jICh0b3RhbF93aWR0aCk7Ci0gIGlmICgqcmVzdWx0ICE9IE5VTEwpCi0gICAgcmV0dXJuIHZzcHJpbnRmICgqcmVzdWx0LCBmb3JtYXQsICphcmdzKTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi1pbnQKLXZhc3ByaW50ZiAocmVzdWx0LCBmb3JtYXQsIGFyZ3MpCi0gICAgIGNoYXIgKipyZXN1bHQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSNpZiBkZWZpbmVkIChfQlNEX1ZBX0xJU1RfKSAmJiBkZWZpbmVkIChfX0ZyZWVCU0RfXykKLSAgICAgX0JTRF9WQV9MSVNUXyBhcmdzOwotI2Vsc2UKLSAgICAgdmFfbGlzdCBhcmdzOwotI2VuZGlmCi17Ci0gIHJldHVybiBpbnRfdmFzcHJpbnRmIChyZXN1bHQsIGZvcm1hdCwgJmFyZ3MpOwotfQotCi0jaWZkZWYgVEVTVAotdm9pZAotY2hlY2tpdAotI2lmZGVmIF9fU1REQ19fCi0gICAgIChjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikKLSNlbHNlCi0gICAgICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyICpyZXN1bHQ7Ci0KLSNpZmRlZiBfX1NURENfXwotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSNlbHNlCi0gIGNoYXIgKmZvcm1hdDsKLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBmb3JtYXQgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7Ci0jZW5kaWYKLSAgdmFzcHJpbnRmICgmcmVzdWx0LCBmb3JtYXQsIGFyZ3MpOwotICBpZiAoc3RybGVuIChyZXN1bHQpIDwgZ2xvYmFsX3RvdGFsX3dpZHRoKQotICAgIHByaW50ZiAoIlBBU1M6ICIpOwotICBlbHNlCi0gICAgcHJpbnRmICgiRkFJTDogIik7Ci0gIHByaW50ZiAoIiVkICVzXG4iLCBnbG9iYWxfdG90YWxfd2lkdGgsIHJlc3VsdCk7Ci19Ci0KLWludAotbWFpbiAoKQotewotICBjaGVja2l0ICgiJWQiLCAweDEyMzQ1Njc4KTsKLSAgY2hlY2tpdCAoIiUyMDBkIiwgNSk7Ci0gIGNoZWNraXQgKCIlLjMwMGQiLCA2KTsKLSAgY2hlY2tpdCAoIiUxMDAuMTUwZCIsIDcpOwotICBjaGVja2l0ICgiJXMiLCAiampqampqampqaWlpaWlpaWlpaWlpaWlpb29vb29vb29vb29vb29vb29wcHBwcHBwcHBwcHBhYVxuXAotNzc3Nzc3Nzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzY2NjY2NjY2NjY2NjIyMjIyMjIyMjIyNzc3Nzc3Nzc3Nzc3NzMzMzMzIik7Ci0gIGNoZWNraXQgKCIlZiVzJWQlcyIsIDEuMCwgImZvbyIsIDc3LCAiYXNkamZmZmZmZmZmZmZmZmZmaWlpaWlpaWlpaWl4eHh4eCIpOwotfQotI2VuZGlmIC8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS92Zm9yay5jIGIvbGliaWJlcnR5L3Zmb3JrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YzQ1OTEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3Zmb3JrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLS8qIEVtdWxhdGUgdmZvcmsgdXNpbmcganVzdCBwbGFpbiBmb3JrLCBmb3Igc3lzdGVtcyB3aXRob3V0IGEgcmVhbCB2Zm9yay4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICovCi0KLWludAotdmZvcmsgKCkKLXsKLSAgcmV0dXJuIChmb3JrICgpKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS92ZnByaW50Zi5jIGIvbGliaWJlcnR5L3ZmcHJpbnRmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiN2IyZmYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3ZmcHJpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKiBQcm92aWRlIGEgdmVyc2lvbiB2ZnByaW50ZiBpbiB0ZXJtcyBvZiBfZG9wcm50LgotICAgQnkgS2F2ZWggR2hhemkgIChnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1KSAgMy8yOS85OAotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICovCi0KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdGRpby5oPgotI3VuZGVmIHZmcHJpbnRmCi0KLWludAotdmZwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcCkKLSAgRklMRSAqIHN0cmVhbTsKLSAgY29uc3QgY2hhciAqIGZvcm1hdDsKLSAgdmFfbGlzdCBhcDsKLXsKLSAgcmV0dXJuIF9kb3BybnQgKGZvcm1hdCwgYXAsIHN0cmVhbSk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdm1zYnVpbGQuY29tIGIvbGliaWJlcnR5L3Ztc2J1aWxkLmNvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZlZGUzOC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvdm1zYnVpbGQuY29tCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLSQhIGxpYmliZXJ0eS92bXNidWlsZC5jb20gLS0gYnVpbGQgbGliZXJ0eS5vbGIgZm9yIFZNUyBob3N0LCBWTVMgdGFyZ2V0Ci0kIQotJCBDQwk9ICJnY2MgL25vVmVyYm9zZS9EZWJ1Zy9JbmNsPShbXSxbLS5pbmNsdWRlXSkiCi0kIExJQlIJPSAibGlicmFyeSAvT2JqIgotJCBMSU5LCT0gImxpbmsiCi0kIERFTEVURT0gImRlbGV0ZSAvbm9Db25maXJtIgotJCBTRUFSQ0g9ICJzZWFyY2ggL0V4YWN0IgotJCBFQ0hPCT0gIndyaXRlIHN5cyRvdXRwdXQiCi0kIEFCT1JUCT0gImV4aXQgJXgwMDJDIgotJCEKLSQgTElCX05BTUUgPSAibGliZXJ0eS5vbGIiCSF0aGlzIGlzIHdoYXQgd2UncmUgZ29pbmcgdG8gY29uc3RydWN0Ci0kIFdPUktfTElCID0gIm5ldy1saWIub2xiIgkhdXNlZCB0byBndWFyZCBhZ2FpbnN0IGFuIGluY29tcGxldGUgYnVpbGQKLSQKLSQhIG1hbnVhbGx5IGNvcGllZCBmcm9tIE1ha2VmaWxlLmluCi0kIFJFUVVJUkVEX09GSUxFUyA9ICJhcmd2Lm8gYmFzZW5hbWUubyBjaG9vc2UtdGVtcC5vIGNvbmNhdC5vIGNwbHVzLWRlbS5vICItCi0JKyAiZmRtYXRjaC5vIGZubWF0Y2gubyBnZXRvcHQubyBnZXRvcHQxLm8gZ2V0cnVudGltZS5vIGhleC5vICItCi0JKyAiZmxvYXRmb3JtYXQubyBvYmphbGxvYy5vIG9ic3RhY2subyBzcGFjZXMubyBzdHJlcnJvci5vIHN0cnNpZ25hbC5vICItCi0JKyAieGF0ZXhpdC5vIHhleGl0Lm8geG1hbGxvYy5vIHhzdHJkdXAubyB4c3RyZXJyb3IubyIKLSQhIGFueXRoaW5nIG5vdCBjYXVnaHQgYnkgbGluaytzZWFyY2ggb2YgZHVtbXkuKiBzaG91bGQgYmUgYWRkZWQgaGVyZQotJCBFWFRSQV9PRklMRVMgPSAiIgotJCEKLSQhIG1vdmUgdG8gdGhlIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyB0aGlzIGNvbW1hbmQgcHJvY2VkdXJlCi0kIG9sZF9kaXIgPSBmJGVudmlyb24oIkRFRkFVTFQiKQotJCBuZXdfZGlyID0gZiRwYXJzZSgiXy5fOyIsZiRlbnZpcm9uKCJQUk9DRURVUkUiKSkgLSAiXy5fOyIKLSQgc2V0IGRlZmF1bHQgJ25ld19kaXInCi0kCi0kIEVDSE8gIlN0YXJ0aW5nIGxpYmliZXJ0eSBidWlsZC4uLiIKLSQgY3JlYXRlIGNvbmZpZy5oCi0vKiBsaWJpYmVydHkgY29uZmlnLmggZm9yIFZNUyAqLwotI2RlZmluZSBORUVEX3N5c19zaWdsaXN0Ci0jZGVmaW5lIE5FRURfc3Ryc2lnbmFsCi0jZGVmaW5lIE5FRURfcHNpZ25hbAotI2RlZmluZSBORUVEX2Jhc2VuYW1lCi0kIExJQlIgJ1dPUktfTElCJyAvQ3JlYXRlCi0kCi0kISBmaXJzdCBwYXNzOiBjb21waWxlICJyZXF1aXJlZCIgbW9kdWxlcwotJCBvZmlsZXMgPSBSRVFVSVJFRF9PRklMRVMgKyAiICIgKyBFWFRSQV9PRklMRVMKLSQgcGFzcyA9IDEKLSQgZ29zdWIgZG9fb2ZpbGVzCi0kCi0kISBzZWNvbmQgcGFzczogcHJvY2VzcyBkdW1teS5jLCB1c2luZyB0aGUgZmlyc3QgcGFzcycgcmVzdWx0cwotJCBFQ0hPICIgbm93IGNoZWNraW5nIHJ1bi10aW1lIGxpYnJhcnkgZm9yIG1pc3NpbmcgZnVuY3Rpb25hbGl0eSIKLSQgaWYgZiRzZWFyY2goImR1bW15Lm9iaiIpLm5lcy4iIiB0aGVuICBERUxFVEUgZHVtbXkub2JqOyoKLSQgZGVmaW5lL25vTG9nIHN5cyRlcnJvciBfTkw6CSFjYW4ndCB1c2UgL1VzZXJfTW9kZSBoZXJlIGR1ZSB0byBnY2MKLSQgZGVmaW5lL25vTG9nIHN5cyRvdXRwdXQgX05MOgkhIGRyaXZlcidzIHVzZSBvZiBtdWx0aXBsZSBpbWFnZSBhY3RpdmF0aW9uCi0kIG9uIGVycm9yIHRoZW4gY29udGludWUKLSQgJ0NDJyBkdW1teS5jCi0kIGRlYXNzaWduIHN5cyRlcnJvciAgICFyZXN0b3JlLCBtb3JlIG9yIGxlc3MKLSQgZGVhc3NpZ24gc3lzJG91dHB1dAotJCBpZiBmJHNlYXJjaCgiZHVtbXkub2JqIikuZXFzLiIiIHRoZW4gIGdvdG8gcGFzczJfZmFpbHVyZTEKLSQhIGxpbmsgZHVtbXkub2JqLCBjYXB0dXJpbmcgZnVsbCBsaW5rZXIgZmVlZGJhY2sgaW4gZHVtbXkubWFwCi0kIG9sZG1zZyA9IGYkZW52aXJvbigiTUVTU0FHRSIpCi0kIHNldCBtZXNzYWdlIC9GYWNpbGl0eS9TZXZlcml0eS9JZGVudGlmaWNhdGlvbi9UZXh0Ci0kIGRlZmluZS9Vc2VyIHN5cyRvdXRwdXQgX05MOgotJCBkZWZpbmUvVXNlciBzeXMkZXJyb3IgX05MOgotJCBMSU5LL01hcD1kdW1teS5tYXAvbm9FeGUgZHVtbXkub2JqLCdXT1JLX0xJQicvTGliciwtCi0JZ251X2NjOlswMDAwMDBdZ2NjbGliLm9sYi9MaWJyLHN5cyRsaWJyYXJ5OnZheGNydGwub2xiL0xpYnIKLSQgc2V0IG1lc3NhZ2UgJ29sZG1zZycKLSQgaWYgZiRzZWFyY2goImR1bW15Lm1hcCIpLmVxcy4iIiB0aGVuICBnb3RvIHBhc3MyX2ZhaWx1cmUyCi0kIERFTEVURSBkdW1teS5vYmo7KgotJCBTRUFSQ0ggZHVtbXkubWFwICIlTElOSy1JLVVERlNZTSIgL091dHB1dD1kdW1teS5saXN0Ci0kIERFTEVURSBkdW1teS5tYXA7KgotJCBFQ0hPICIgY2hlY2sgY29tcGxldGVkIgotJCEgd2Ugbm93IGhhdmUgYSBmaWxlIHdpdGggb25lIGVudHJ5IHBlciBsaW5lIG9mIHVucmVzb2x2YWJsZSBzeW1ib2xzCi0kIG9maWxlcyA9ICIiCi0kIGlmIGYkdHJubG5tKCJJRklMRSQiKS5uZXMuIiIgdGhlbiAgY2xvc2Uvbm9Mb2cgaWZpbGUkCi0kCW9wZW4vUmVhZCBpZmlsZSQgZHVtbXkubGlzdAotJGlsb29wOiByZWFkL0VuZD1pZG9uZSBpZmlsZSQgaWxpbmUKLSQJaWxpbmUgPSBmJGVkaXQoaWxpbmUsIkNPTVBSRVNTLFRSSU0sTE9XRVJDQVNFIikKLSQJb2ZpbGVzID0gb2ZpbGVzICsgIiAiICsgZiRlbGVtZW50KDEsIiAiLGlsaW5lKSArICIubyIKLSQJZ290byBpbG9vcAotJGlkb25lOiBjbG9zZSBpZmlsZSQKLSQgREVMRVRFIGR1bW15Lmxpc3Q7KgotJCBvbiBlcnJvciB0aGVuIEFCT1JUCi0kCi0kISB0aGlyZCBwYXNzOiBjb21waWxlICJtaXNzaW5nIiBtb2R1bGVzIGNvbGxlY3RlZCBpbiBwYXNzIDIKLSQgcGFzcyA9IDMKLSQgZ29zdWIgZG9fb2ZpbGVzCi0kCi0kISBmaW5pc2ggdXAKLSQgTElCUiAnV09SS19MSUInIC9Db21wcmVzcyAvT3V0cHV0PSdMSUJfTkFNRScJIW5ldy1saWIub2xiIC0+IGxpYmVydHkub2xiCi0kIERFTEVURSAnV09SS19MSUInOyoKLSQKLSQhIGFsbCBkb25lCi0kIEVDSE8gIkNvbXBsZXRlZCBsaWJpYmVydHkgYnVpbGQuIgotJCB0eXBlIHN5cyRpbnB1dDoKLQotICBZb3UgbWFueSB3aXNoIHRvIGRvCi0gICQgQ09QWSBMSUJFUlRZLk9MQiBHTlVfQ0M6WzAwMDAwMF0KLSAgc28gdGhhdCB0aGlzIHJ1bi10aW1lIGxpYnJhcnkgcmVzaWRlcyBpbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyBnY2MncwotICBzdXBwb3J0IGxpYnJhcnkuICBXaGVuIGJ1aWxkaW5nIGdhcywgYmUgc3VyZSB0byBsZWF2ZSB0aGUgb3JpZ2luYWwKLSAgY29weSBvZiBsaWJlcnR5Lm9sYiBoZXJlIHNvIHRoYXQgZ2FzJ3MgYnVpbGQgcHJvY2VkdXJlIGNhbiBmaW5kIGl0LgotCi0kIHNldCBkZWZhdWx0ICdvbGRfZGlyJwotJCBleGl0Ci0kCi0kIQotJCEgY29tcGlsZSBlYWNoIGVsZW1lbnQgb2YgdGhlIHNwYWNlLWRlbGltaXRlZCBsaXN0ICdvZmlsZXMnCi0kIQotJGRvX29maWxlczoKLSQgb2ZpbGVzID0gZiRlZGl0KG9maWxlcywiQ09NUFJFU1MsVFJJTSIpCi0kIGkgPSAwCi0kb2xvb3A6Ci0kIGYgPSBmJGVsZW1lbnQoaSwiICIsb2ZpbGVzKQotJCBpZiBmLmVxcy4iICIgdGhlbiAgZ290byBvZG9uZQotJCBmID0gZiAtICIubyIJIXN0cmlwIGR1bW15IHN1ZmZpeAotJCBFQ0hPICIgICcnZiciCi0kIHNraXBfZiA9IDAKLSQgaWYgcGFzcy5lcS4zIC5hbmQuIGYkc2VhcmNoKCInJ2YnLmMiKS5lcXMuIiIgdGhlbiAgZ29zdWIgY2hrX2RlZmZ1bmMKLSQgaWYgLm5vdC5za2lwX2YKLSQgdGhlbgotJCAgICdDQycgJ2YnLmMKLSQgICBMSUJSICdXT1JLX0xJQicgJ2YnLm9iaiAvSW5zZXJ0Ci0kICAgREVMRVRFICdmJy5vYmo7KgotJCBlbmRpZgotJCBpID0gaSArIDEKLSQgZ290byBvbG9vcAotJG9kb25lOgotJCByZXR1cm4KLSQKLSQhCi0kISBjaGVjayBmdW5jdGlvbnMuZGVmIGZvciBhIERFRkZVTkMoKSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIG1pc3NpbmcgZmlsZSAnZicuYwotJCEKLSRjaGtfZGVmZnVuYzoKLSQgZGVmaW5lL1VzZXIgc3lzJG91dHB1dCBfTkw6Ci0kIGRlZmluZS9Vc2VyIHN5cyRlcnJvciBfTkw6Ci0kIFNFQVJDSCBmdW5jdGlvbnMuZGVmICJERUZGVU5DIiwiJydmJyIgL01hdGNoPUFORAotJCBpZiAoKCRzdGF0dXMuYW5kLiV4N0ZGRkZGRkYpIC5lcS4gMSkKLSQgdGhlbgotJCAgIHNraXBfZiA9IDEKLSQgICBvcGVuL0FwcGVuZCBjb25maWdfaCBjb25maWcuaAotJCAgIHdyaXRlIGNvbmZpZ19oICIjZGVmaW5lIE5FRURfJydmJyIKLSQgICBjbG9zZSBjb25maWdfaAotJCBlbmRpZgotJCByZXR1cm4KLSQKLSQhCi0kcGFzczJfZmFpbHVyZTE6Ci0kISBpZiB3ZSByZWFjaCBoZXJlLCBkdW1teS5jIGZhaWxlZCB0byBjb21waWxlIGFuZCB3ZSdyZSByZWFsbHkgc3R1Y2sKLSQgdHlwZSBzeXMkaW5wdXQ6Ci0KLSAgQ2Fubm90IGNvbXBpbGUgdGhlIGxpYnJhcnkgY29udGVudHMgY2hlY2tlciAoZHVtbXkuYyArIGZ1bmN0aW9ucy5kZWYpLAotICBzbyBjYW5ub3QgY29udGludWUhCi0KLSQhIGF0dGVtcHQgdGhlIGNvbXBpbGUgYWdhaW4sIHdpdGhvdXQgc3VwcHJlc3NpbmcgZGlhZ25vc3RpYyBtZXNzYWdlcyB0aGlzIHRpbWUKLSQgb24gZXJyb3IgdGhlbiBBQk9SVCArMCpmJHZlcmlmeSh2KQotJCB2ID0gZiR2ZXJpZnkoMSkKLSQgJ0NDJyBkdW1teS5jCi0kIEFCT1JUICswKmYkdmVyaWZ5KHYpCSEnZiR2ZXJpZnkoMCknCi0kIQotJHBhc3MyX2ZhaWx1cmUyOgotJCEgc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUuLgotJCB0eXBlIHN5cyRpbnB1dDoKLQotICBDYW5ub3QgbGluayB0aGUgbGlicmFyeSBjb250ZW50cyBjaGVja2VyIChkdW1teS5vYmopLCBzbyBjYW5ub3QgY29udGludWUhCi0KLSQhIGF0dGVtcHQgdGhlIGxpbmsgYWdhaW4sIHdpdGhvdXQgc3VwcHJlc3NpbmcgZGlhZ25vc3RpYyBtZXNzYWdlcyB0aGlzIHRpbWUKLSQgb24gZXJyb3IgdGhlbiBBQk9SVCArMCpmJHZlcmlmeSh2KQotJCB2ID0gZiR2ZXJpZnkoMSkKLSQgTElOSy9NYXA9ZHVtbXkubWFwL25vRXhlIGR1bW15Lm9iaiwnV09SS19MSUInL0xpYnIsLQotCWdudV9jYzpbMDAwMDAwXWdjY2xpYi5vbGIvTGlicixzeXMkbGlicmFyeTp2YXhjcnRsLm9sYi9MaWJyCi0kIEFCT1JUICswKmYkdmVyaWZ5KHYpCSEnZiR2ZXJpZnkoMCknCi0kCi0kISBub3QgcmVhY2hlZAotJCBleGl0CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdnByaW50Zi5jIGIvbGliaWJlcnR5L3ZwcmludGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjViNDI1YS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvdnByaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSN1bmRlZiB2cHJpbnRmCi1pbnQKLXZwcmludGYgKGZvcm1hdCwgYXApCi0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfbGlzdCBhcDsKLXsKLSAgcmV0dXJuIHZmcHJpbnRmIChzdGRvdXQsIGZvcm1hdCwgYXApOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3ZzcHJpbnRmLmMgYi9saWJpYmVydHkvdnNwcmludGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwNzYwYy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvdnNwcmludGYuYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB2c3ByaW50ZiBmb3Igc3lzdGVtcyB3aXRob3V0IGl0LgotICAgSGlnaGx5IHN5c3RlbS1kZXBlbmRlbnQsIGJ1dCBzaG91bGQgd29yayBvbiBtb3N0ICJ0cmFkaXRpb25hbCIKLSAgIGltcGxlbWVudGF0aW9ucyBvZiBzdGRpbzsgbmV3ZXIgb25lcyBzaG91bGQgYWxyZWFkeSBoYXZlIHZzcHJpbnRmLgotICAgV3JpdHRlbiBieSBQZXIgQm90aG5lciBvZiBDeWdudXMgU3VwcG9ydC4KLSAgIEJhc2VkIG9uIGxpYmcrKydzICJmb3JtIiAod3JpdHRlbiBieSBEb3VnIExlYTsgZGxAcm9ja3kub3N3ZWdvLmVkdSkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCi1zb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKLXRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaWYgeW91IGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGggZmlsZXMKLWNvbXBpbGVkIHdpdGggYSBHTlUgY29tcGlsZXIgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCB0aGlzIGRvZXMgbm90IGNhdXNlCi10aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdG8gYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi1UaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBob3dldmVyIGludmFsaWRhdGUgYW55IG90aGVyIHJlYXNvbnMgd2h5Ci10aGUgZXhlY3V0YWJsZSBmaWxlIG1pZ2h0IGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAqLwotCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSN1bmRlZiB2c3ByaW50ZgotCi1pbnQKLXZzcHJpbnRmIChidWYsIGZvcm1hdCwgYXApCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICB2YV9saXN0IGFwOwotewotICBGSUxFIGI7Ci0gIGludCByZXQ7Ci0jaWZkZWYgVk1TCi0gIGItPl9mbGFnID0gX0lPV1JUfF9JT1NUUkc7Ci0gIGItPl9wdHIgPSBidWY7Ci0gIGItPl9jbnQgPSAxMjAwMDsKLSNlbHNlCi0gIGIuX2ZsYWcgPSBfSU9XUlR8X0lPU1RSRzsKLSAgYi5fcHRyID0gYnVmOwotICBiLl9jbnQgPSAxMjAwMDsKLSNlbmRpZgotICByZXQgPSBfZG9wcm50KGZvcm1hdCwgYXAsICZiKTsKLSAgcHV0YygnXDAnLCAmYik7Ci0gIHJldHVybiByZXQ7Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS93YWl0cGlkLmMgYi9saWJpYmVydHkvd2FpdHBpZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2RiMGI5Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS93YWl0cGlkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1pbnQKLXdhaXRwaWQgKHBpZCwgc3RhdF9sb2MsIG9wdGlvbnMpCi0JaW50IHBpZCwgKnN0YXRfbG9jLCBvcHRpb25zOwotewotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGludCB3cGlkID0gd2FpdChzdGF0X2xvYyk7Ci0gICAgICBpZiAod3BpZCA9PSBwaWQgfHwgd3BpZCA9PSAtMSkKLQlyZXR1cm4gd3BpZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkveGF0ZXhpdC5jIGIvbGliaWJlcnR5L3hhdGV4aXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0NzZjMi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkveGF0ZXhpdC5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5MCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqICVzY2NzLmluY2x1ZGUucmVkaXN0LmMlCi0gKi8KLQotLyogQWRhcHRlZCBmcm9tIG5ld2xpYi9saWJjL3N0ZGxpYi97LGF0fWV4aXQuW2NoXS4KLSAgIElmIHlvdSB1c2UgeGF0ZXhpdCwgeW91IG11c3QgY2FsbCB4ZXhpdCBpbnN0ZWFkIG9mIGV4aXQuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi0vKiBGb3Igc3lzdGVtcyB3aXRoIGxhcmdlciBwb2ludGVycyB0aGFuIGludHMsIHRoaXMgbXVzdCBiZSBkZWNsYXJlZC4gICovCi1QVFIgbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotCi1zdGF0aWMgdm9pZCB4YXRleGl0X2NsZWFudXAgUEFSQU1TICgodm9pZCkpOwotCi0vKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHJ1biBieSB4ZXhpdC4gICovCi1leHRlcm4gdm9pZCAoKl94ZXhpdF9jbGVhbnVwKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUJWEFURVhJVF9TSVpFIDMyCi0KLXN0cnVjdCB4YXRleGl0IHsKLQlzdHJ1Y3QJeGF0ZXhpdCAqbmV4dDsJCS8qIG5leHQgaW4gbGlzdCAqLwotCWludAlpbmQ7CQkJLyogbmV4dCBpbmRleCBpbiB0aGlzIHRhYmxlICovCi0Jdm9pZAkoKmZuc1tYQVRFWElUX1NJWkVdKSBQQVJBTVMgKCh2b2lkKSk7CS8qIHRoZSB0YWJsZSBpdHNlbGYgKi8KLX07Ci0KLS8qIEFsbG9jYXRlIG9uZSBzdHJ1Y3Qgc3RhdGljYWxseSB0byBndWFyYW50ZWUgdGhhdCB3ZSBjYW4gcmVnaXN0ZXIKLSAgIGF0IGxlYXN0IGEgZmV3IGhhbmRsZXJzLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgeGF0ZXhpdCB4YXRleGl0X2ZpcnN0OwotCi0vKiBQb2ludHMgdG8gaGVhZCBvZiBMSUZPIHN0YWNrLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgeGF0ZXhpdCAqeGF0ZXhpdF9oZWFkID0gJnhhdGV4aXRfZmlyc3Q7Ci0KLS8qIFJlZ2lzdGVyIGZ1bmN0aW9uIEZOIHRvIGJlIHJ1biBieSB4ZXhpdC4KLSAgIFJldHVybiAwIGlmIHN1Y2Nlc3NmdWwsIC0xIGlmIG5vdC4gICovCi0KLWludAoteGF0ZXhpdCAoZm4pCi0gICAgIHZvaWQgKCpmbikgUEFSQU1TICgodm9pZCkpOwotewotICByZWdpc3RlciBzdHJ1Y3QgeGF0ZXhpdCAqcDsKLQotICAvKiBUZWxsIHhleGl0IHRvIGNhbGwgeGF0ZXhpdF9jbGVhbnVwLiAgKi8KLSAgaWYgKCFfeGV4aXRfY2xlYW51cCkKLSAgICBfeGV4aXRfY2xlYW51cCA9IHhhdGV4aXRfY2xlYW51cDsKLQotICBwID0geGF0ZXhpdF9oZWFkOwotICBpZiAocC0+aW5kID49IFhBVEVYSVRfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoKHAgPSAoc3RydWN0IHhhdGV4aXQgKikgbWFsbG9jIChzaXplb2YgKnApKSA9PSBOVUxMKQotCXJldHVybiAtMTsKLSAgICAgIHAtPmluZCA9IDA7Ci0gICAgICBwLT5uZXh0ID0geGF0ZXhpdF9oZWFkOwotICAgICAgeGF0ZXhpdF9oZWFkID0gcDsKLSAgICB9Ci0gIHAtPmZuc1twLT5pbmQrK10gPSBmbjsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIENhbGwgYW55IGNsZWFudXAgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLXhhdGV4aXRfY2xlYW51cCAoKQotewotICByZWdpc3RlciBzdHJ1Y3QgeGF0ZXhpdCAqcDsKLSAgcmVnaXN0ZXIgaW50IG47Ci0KLSAgZm9yIChwID0geGF0ZXhpdF9oZWFkOyBwOyBwID0gcC0+bmV4dCkKLSAgICBmb3IgKG4gPSBwLT5pbmQ7IC0tbiA+PSAwOykKLSAgICAgICgqcC0+Zm5zW25dKSAoKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS94ZXhpdC5jIGIvbGliaWJlcnR5L3hleGl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMWJiZTAuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3hleGl0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKiB4ZXhpdC5jIC0tIFJ1biBhbnkgZXhpdCBoYW5kbGVycywgdGhlbiBleGl0LgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlCi10byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyogVGhpcyB2YXJpYWJsZSBpcyBzZXQgYnkgeGF0ZXhpdCBpZiBpdCBpcyBjYWxsZWQuICBUaGlzIHdheSwgeG1hbGxvYwotICAgZG9lc24ndCBkcmFnIHhhdGV4aXQgaW50byB0aGUgbGluay4gICovCi12b2lkICgqX3hleGl0X2NsZWFudXApIFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZAoteGV4aXQgKGNvZGUpCi0gICAgIGludCBjb2RlOwotewotICBpZiAoX3hleGl0X2NsZWFudXAgIT0gTlVMTCkKLSAgICAoKl94ZXhpdF9jbGVhbnVwKSAoKTsKLSAgZXhpdCAoY29kZSk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkveG1hbGxvYy5jIGIvbGliaWJlcnR5L3htYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4Mzc5MC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkveG1hbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIHdpdGggZXJyb3IgY2hlY2tpbmcuCi0gICBDb3B5cmlnaHQgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZGVmaW5lIHB0cmRpZmZfdCBsb25nCi0jZW5kaWYKLQotI2lmIFZNUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXhsaWIuaD4KLSNlbHNlCi0vKiBGb3Igc3lzdGVtcyB3aXRoIGxhcmdlciBwb2ludGVycyB0aGFuIGludHMsIHRoZXNlIG11c3QgYmUgZGVjbGFyZWQuICAqLwotUFRSIG1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLVBUUiByZWFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7Ci1QVFIgY2FsbG9jIFBBUkFNUyAoKHNpemVfdCwgc2l6ZV90KSk7Ci1QVFIgc2JyayBQQVJBTVMgKChwdHJkaWZmX3QpKTsKLSNlbmRpZgotCi0vKiBUaGUgcHJvZ3JhbSBuYW1lIGlmIHNldC4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqbmFtZSA9ICIiOwotCi0jaWYgIWRlZmluZWQgKF9fQ1lHV0lOX18pICYmIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLSNkZWZpbmUgX19DWUdXSU5fXyAxCi0jZW5kaWYKLQotI2lmICEgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkIChfX1VXSU5fXykKLS8qIFRoZSBpbml0aWFsIHNicmssIHNldCB3aGVuIHRoZSBwcm9ncmFtIG5hbWUgaXMgc2V0LiBOb3QgdXNlZCBmb3Igd2luMzIKLSAgIHBvcnRzIG90aGVyIHRoYW4gY3lnd2luMzIuICAqLwotc3RhdGljIGNoYXIgKmZpcnN0X2JyZWFrID0gTlVMTDsKLSNlbmRpZiAvKiAhIF9XSU4zMiB8fCBfX0NZR1dJTiBfXyB8fCBfX1VXSU5fXyAqLwotCi12b2lkCi14bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIG5hbWUgPSBzOwotI2lmICEgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkIChfX1VXSU5fXykKLSAgLyogV2luMzIgcG9ydHMgb3RoZXIgdGhhbiBjeWd3aW4zMiBkb24ndCBoYXZlIGJyaygpICovCi0gIGlmIChmaXJzdF9icmVhayA9PSBOVUxMKQotICAgIGZpcnN0X2JyZWFrID0gKGNoYXIgKikgc2JyayAoMCk7Ci0jZW5kaWYgLyogISBfV0lOMzIgfHwgX19DWUdXSU4gX18gfHwgX19VV0lOX18gKi8KLX0KLQotUFRSCi14bWFsbG9jIChzaXplKQotICAgIHNpemVfdCBzaXplOwotewotICBQVFIgbmV3bWVtOwotCi0gIGlmIChzaXplID09IDApCi0gICAgc2l6ZSA9IDE7Ci0gIG5ld21lbSA9IG1hbGxvYyAoc2l6ZSk7Ci0gIGlmICghbmV3bWVtKQotICAgIHsKLSNpZiAhIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19VV0lOX18pCi0gICAgICBleHRlcm4gY2hhciAqKmVudmlyb247Ci0gICAgICBzaXplX3QgYWxsb2NhdGVkOwotCi0gICAgICBpZiAoZmlyc3RfYnJlYWsgIT0gTlVMTCkKLQlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIGZpcnN0X2JyZWFrOwotICAgICAgZWxzZQotCWFsbG9jYXRlZCA9IChjaGFyICopIHNicmsgKDApIC0gKGNoYXIgKikgJmVudmlyb247Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgICJcbiVzJXNDYW4gbm90IGFsbG9jYXRlICVsdSBieXRlcyBhZnRlciBhbGxvY2F0aW5nICVsdSBieXRlc1xuIiwKLQkgICAgICAgbmFtZSwgKm5hbWUgPyAiOiAiIDogIiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBzaXplLCAodW5zaWduZWQgbG9uZykgYWxsb2NhdGVkKTsKLSNlbHNlCi0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0gICAgICAgICAgICAgICJcbiVzJXNDYW4gbm90IGFsbG9jYXRlICVsdSBieXRlc1xuIiwKLSAgICAgICAgICAgICAgbmFtZSwgKm5hbWUgPyAiOiAiIDogIiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBzaXplKTsKLSNlbmRpZiAvKiAhIF9XSU4zMiB8fCBfX0NZR1dJTiBfXyB8fCBfX1VXSU5fXyAqLwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLSAgcmV0dXJuIChuZXdtZW0pOwotfQotCi1QVFIKLXhjYWxsb2MgKG5lbGVtLCBlbHNpemUpCi0gIHNpemVfdCBuZWxlbSwgZWxzaXplOwotewotICBQVFIgbmV3bWVtOwotCi0gIGlmIChuZWxlbSA9PSAwIHx8IGVsc2l6ZSA9PSAwKQotICAgIG5lbGVtID0gZWxzaXplID0gMTsKLQotICBuZXdtZW0gPSBjYWxsb2MgKG5lbGVtLCBlbHNpemUpOwotICBpZiAoIW5ld21lbSkKLSAgICB7Ci0jaWYgISBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pCi0gICAgICBleHRlcm4gY2hhciAqKmVudmlyb247Ci0gICAgICBzaXplX3QgYWxsb2NhdGVkOwotCi0gICAgICBpZiAoZmlyc3RfYnJlYWsgIT0gTlVMTCkKLQlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIGZpcnN0X2JyZWFrOwotICAgICAgZWxzZQotCWFsbG9jYXRlZCA9IChjaGFyICopIHNicmsgKDApIC0gKGNoYXIgKikgJmVudmlyb247Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgICJcbiVzJXNDYW4gbm90IGFsbG9jYXRlICVsdSBieXRlcyBhZnRlciBhbGxvY2F0aW5nICVsdSBieXRlc1xuIiwKLQkgICAgICAgbmFtZSwgKm5hbWUgPyAiOiAiIDogIiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSAobmVsZW0gKiBlbHNpemUpLCAodW5zaWduZWQgbG9uZykgYWxsb2NhdGVkKTsKLSNlbHNlCi0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0gICAgICAgICAgICAgICJcbiVzJXNDYW4gbm90IGFsbG9jYXRlICVsdSBieXRlc1xuIiwKLSAgICAgICAgICAgICAgbmFtZSwgKm5hbWUgPyAiOiAiIDogIiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSAobmVsZW0gKiBlbHNpemUpKTsKLSNlbmRpZiAvKiAhIF9XSU4zMiB8fCBfX0NZR1dJTiBfXyAqLwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLSAgcmV0dXJuIChuZXdtZW0pOwotfQotCi1QVFIKLXhyZWFsbG9jIChvbGRtZW0sIHNpemUpCi0gICAgUFRSIG9sZG1lbTsKLSAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIG5ld21lbTsKLQotICBpZiAoc2l6ZSA9PSAwKQotICAgIHNpemUgPSAxOwotICBpZiAoIW9sZG1lbSkKLSAgICBuZXdtZW0gPSBtYWxsb2MgKHNpemUpOwotICBlbHNlCi0gICAgbmV3bWVtID0gcmVhbGxvYyAob2xkbWVtLCBzaXplKTsKLSAgaWYgKCFuZXdtZW0pCi0gICAgewotI2lmbmRlZiBfX01JTkdXMzJfXwotICAgICAgZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotICAgICAgc2l6ZV90IGFsbG9jYXRlZDsKLQotICAgICAgaWYgKGZpcnN0X2JyZWFrICE9IE5VTEwpCi0JYWxsb2NhdGVkID0gKGNoYXIgKikgc2JyayAoMCkgLSBmaXJzdF9icmVhazsKLSAgICAgIGVsc2UKLQlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIChjaGFyICopICZlbnZpcm9uOwotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICAiXG4lcyVzQ2FuIG5vdCByZWFsbG9jYXRlICVsdSBieXRlcyBhZnRlciBhbGxvY2F0aW5nICVsdSBieXRlc1xuIiwKLQkgICAgICAgbmFtZSwgKm5hbWUgPyAiOiAiIDogIiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBzaXplLCAodW5zaWduZWQgbG9uZykgYWxsb2NhdGVkKTsKLSNlbHNlCi0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0gICAgICAgICAgICAgICJcbiVzJXNDYW4gbm90IHJlYWxsb2NhdGUgJWx1IGJ5dGVzXG4iLAotICAgICAgICAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNpemUpOwotI2VuZGlmIC8qIF9fTUlOR1czMl9fICovCi0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotICByZXR1cm4gKG5ld21lbSk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkveHN0cmR1cC5jIGIvbGliaWJlcnR5L3hzdHJkdXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2YWJhMC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkveHN0cmR1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogeHN0cmR1cC5jIC0tIER1cGxpY2F0ZSBhIHN0cmluZyBpbiBtZW1vcnksIHVzaW5nIHhtYWxsb2MuCi0gICBUaGlzIHRyaXZpYWwgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uCi0gICBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgRGVjZW1iZXIgMTk5NS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi1jaGFyICoKLXhzdHJkdXAgKHMpCi0gIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIHJlZ2lzdGVyIHNpemVfdCBsZW4gPSBzdHJsZW4gKHMpICsgMTsKLSAgcmVnaXN0ZXIgY2hhciAqcmV0ID0geG1hbGxvYyAobGVuKTsKLSAgbWVtY3B5IChyZXQsIHMsIGxlbik7Ci0gIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkveHN0cmVycm9yLmMgYi9saWJpYmVydHkveHN0cmVycm9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MGI2NTMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3hzdHJlcnJvci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyogeHN0cmVycm9yLmMgLS0gamFja2V0IHJvdXRpbmUgZm9yIG1vcmUgcm9idXN0IHN0cmVycm9yKCkgdXNhZ2UuCi0gICBGcmkgSnVuIDE2IDE4OjMwOjAwIDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotICAgVGhpcyBjb2RlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIFZNUwotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWYgIWRlZmluZWQgKF9fU1RSSUNUX0FOU0lfXykgJiYgIWRlZmluZWQgKF9fSElERV9GT1JCSURERU5fTkFNRVMpCi1leHRlcm4gY2hhciAqc3RyZXJyb3IgUEFSQU1TICgoaW50LC4uLikpOwotI2RlZmluZSBET05UX0RFQ0xBUkVfU1RSRVJST1IKLSNlbmRpZgotI2VuZGlmCS8qIFZNUyAqLwotCi0jaWZuZGVmIERPTlRfREVDTEFSRV9TVFJFUlJPUgotZXh0ZXJuIGNoYXIgKnN0cmVycm9yIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0KLS8qIElmIHN0cmVycm9yIHJldHVybnMgTlVMTCwgd2UnbGwgZm9ybWF0IHRoZSBudW1iZXIgaW50byBhIHN0YXRpYyBidWZmZXIuICAqLwotCi0jZGVmaW5lIEVSUlNUUl9GTVQgInVuZG9jdW1lbnRlZCBlcnJvciAjJWQiCi1zdGF0aWMgY2hhciB4c3RyZXJyb3JfYnVmW3NpemVvZiBFUlJTVFJfRk1UICsgMjBdOwotCi0vKiBMaWtlIHN0cmVycm9yLCBidXQgcmVzdWx0IGlzIG5ldmVyIGEgbnVsbCBwb2ludGVyLiAgKi8KLQotY2hhciAqCi14c3RyZXJyb3IgKGVycm51bSkKLSAgICAgaW50IGVycm51bTsKLXsKLSAgY2hhciAqZXJyc3RyOwotI2lmZGVmIFZNUwotICBjaGFyICooKnZtc2xpYl9zdHJlcnJvcikgUEFSQU1TICgoaW50LC4uLikpOwotCi0gIC8qIE92ZXJyaWRlIGFueSBwb3NzaWJseS1jb25mbGljdGluZyBkZWNsYXJhdGlvbiBmcm9tIHN5c3RlbSBoZWFkZXIuICAqLwotICB2bXNsaWJfc3RyZXJyb3IgPSAoY2hhciAqKCopIFBBUkFNUyAoKGludCwuLi4pKSkgc3RyZXJyb3I7Ci0gIC8qIFNlY29uZCBhcmd1bWVudCBtYXR0ZXJzIGlmZiBmaXJzdCBpcyBFVk1TRVJSLCBidXQgaXQncyBzaW1wbGVyIHRvCi0gICAgIHBhc3MgaXQgdW5jb25kaXRpb25hbGx5LiAgYHZheGMkZXJybm8nIGlzIGRlY2xhcmVkIGluIDxlcnJuby5oPgotICAgICBhbmQgbWFpbnRhaW5lZCBieSB0aGUgcnVuLXRpbWUgbGlicmFyeSBpbiBwYXJhbGxlbCB0byBgZXJybm8nLgotICAgICBXZSBhc3N1bWUgdGhhdCBgZXJybnVtJyBjb3JyZXNwb25kcyB0byB0aGUgbGFzdCB2YWx1ZSBhc3NpZ25lZCB0bwotICAgICBlcnJubyBieSB0aGUgcnVuLXRpbWUgbGlicmFyeSwgaGVuY2UgdmF4YyRlcnJubyB3aWxsIGJlIHJlbGV2YW50LiAgKi8KLSAgZXJyc3RyID0gKCp2bXNsaWJfc3RyZXJyb3IpIChlcnJudW0sIHZheGMkZXJybm8pOwotI2Vsc2UKLSAgZXJyc3RyID0gc3RyZXJyb3IgKGVycm51bSk7Ci0jZW5kaWYKLQotICAvKiBJZiBgZXJybnVtJyBpcyBvdXQgb2YgcmFuZ2UsIHJlc3VsdCBtaWdodCBiZSBOVUxMLiAgV2UnbGwgZml4IHRoYXQuICAqLwotICBpZiAoIWVycnN0cikKLSAgICB7Ci0gICAgICBzcHJpbnRmICh4c3RyZXJyb3JfYnVmLCBFUlJTVFJfRk1ULCBlcnJudW0pOwotICAgICAgZXJyc3RyID0geHN0cmVycm9yX2J1ZjsKLSAgICB9Ci0gIHJldHVybiBlcnJzdHI7Ci19CmRpZmYgLS1naXQgYS9sdGNvbmZpZyBiL2x0Y29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYjMwNGZkLi4wMDAwMDAwCi0tLSBhL2x0Y29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMjgyMiArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgbHRjb25maWcgLSBDcmVhdGUgYSBzeXN0ZW0tc3BlY2lmaWMgbGlidG9vbC4KLSMgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgQSBsb3Qgb2YgdGhpcyBzY3JpcHQgaXMgdGFrZW4gZnJvbSBhdXRvY29uZi0yLjEwLgotCi0jIENoZWNrIHRoYXQgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCi1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotZWNobz1lY2hvCi1pZiB0ZXN0ICJYJDEiID0gWC0tbm8tcmVleGVjOyB0aGVuCi0gICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgotICBzaGlmdAotZWxpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobwotICBzaGlmdAotICBjYXQgPDxFT0YKLSQqCi1FT0YKLSAgZXhpdCAwCi1lbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgotICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCi0gIDoKLWVsc2UKLSAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgotICBleGVjICIkU0hFTEwiICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9Ci1maQotCi0jIEZpbmQgdGhlIGNvcnJlY3QgUEFUSCBzZXBhcmF0b3IuICBVc3VhbGx5IHRoaXMgaXMgYDonLCBidXQKLSMgREpHUFAgdXNlcyBgOycgbGlrZSBET1MuCi1pZiB0ZXN0ICJYJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSAiWHNldCI7IHRoZW4KLSAgVU5BTUU9JHtVTkFNRS1gdW5hbWUgMj4vZGV2L251bGxgfQotICBjYXNlIFgkVU5BTUUgaW4KLSAgICAqLURPUykgUEFUSF9TRVBBUkFUT1I9JzsnIDs7Ci0gICAgKikgICAgIFBBVEhfU0VQQVJBVE9SPSc6JyA7OwotICBlc2FjCi1maQotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotaWYgdGVzdCAiJHtDRFBBVEgrc2V0fSIgPSBzZXQ7IHRoZW4gQ0RQQVRIPTsgZXhwb3J0IENEUEFUSDsgZmkKLQotaWYgdGVzdCAiWCR7ZWNob190ZXN0X3N0cmluZytzZXR9IiAhPSAiWHNldCI7IHRoZW4KLSAgIyBmaW5kIGEgc3RyaW5nIGFzIGxhcmdlIGFzIHBvc3NpYmxlLCBhcyBsb25nIGFzIHRoZSBzaGVsbCBjYW4gY29wZSB3aXRoIGl0Ci0gIGZvciBjbWQgaW4gJ3NlZCA1MHEgIiQwIicgJ3NlZCAyMHEgIiQwIicgJ3NlZCAxMHEgIiQwIicgJ3NlZCAycSAiJDAiJyAnZWNobyB0ZXN0JzsgZG8KLSAgICAjIGV4cGVjdGVkIHNpemVzOiBsZXNzIHRoYW4gMktiLCAxS2IsIDUxMiBieXRlcywgMTYgYnl0ZXMsIC4uLgotICAgIGlmIChlY2hvX3Rlc3Rfc3RyaW5nPSJgZXZhbCAkY21kYCIpIDI+L2Rldi9udWxsICYmCi0gICAgICAgZWNob190ZXN0X3N0cmluZz0iYGV2YWwgJGNtZGAiICYmCi0gICAgICAgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGw7IHRoZW4KLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotZmkKLQotaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiAhPSAnWFx0JyB8fAotICAgdGVzdCAiWGAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgIiAhPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAjIFRoZSBTb2xhcmlzLCBBSVgsIGFuZCBEaWdpdGFsIFVuaXggZGVmYXVsdCBlY2hvIHByb2dyYW1zIHVucXVvdGUKLSAgIyBiYWNrc2xhc2hlcy4gIFRoaXMgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBxdW90ZSBiYWNrc2xhc2hlcyB1c2luZwotICAjICAgZWNobyAiJHNvbWV0aGluZyIgfCBzZWQgJ3MvXFwvXFxcXC9nJwotICAjCi0gICMgU28sIGZpcnN0IHdlIGxvb2sgZm9yIGEgd29ya2luZyBlY2hvIGluIHRoZSB1c2VyJ3MgUEFUSC4KLQotICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgZm9yIGRpciBpbiAkUEFUSCAvdXNyL3VjYjsgZG8KLSAgICBpZiB0ZXN0IC1mICRkaXIvZWNobyAmJgotICAgICAgIHRlc3QgIlhgKCRkaXIvZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgICAgICB0ZXN0ICJYYCgkZGlyL2VjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgIiA9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gICAgICBlY2hvPSIkZGlyL2VjaG8iCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgaWYgdGVzdCAiWCRlY2hvIiA9IFhlY2hvOyB0aGVuCi0gICAgIyBXZSBkaWRuJ3QgZmluZCBhIGJldHRlciBlY2hvLCBzbyBsb29rIGZvciBhbHRlcm5hdGl2ZXMuCi0gICAgaWYgdGVzdCAiWGAocHJpbnQgLXIgJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0gICAgICAgdGVzdCAiWGAocHJpbnQgLXIgIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgIiA9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gICAgICAjIFRoaXMgc2hlbGwgaGFzIGEgYnVpbHRpbiBwcmludCAtciB0aGF0IGRvZXMgdGhlIHRyaWNrLgotICAgICAgZWNobz0ncHJpbnQgLXInCi0gICAgZWxpZiB0ZXN0IC1mIC9iaW4va3NoICYmIHRlc3QgIlgkQ09ORklHX1NIRUxMIiAhPSBYL2Jpbi9rc2g7IHRoZW4KLSAgICAgICMgSWYgd2UgaGF2ZSBrc2gsIHRyeSBydW5uaW5nIGx0Y29uZmlnIGFnYWluIHdpdGggaXQuCi0gICAgICBPUklHSU5BTF9DT05GSUdfU0hFTEw9IiR7Q09ORklHX1NIRUxMLS9iaW4vc2h9IgotICAgICAgZXhwb3J0IE9SSUdJTkFMX0NPTkZJR19TSEVMTAotICAgICAgQ09ORklHX1NIRUxMPS9iaW4va3NoCi0gICAgICBleHBvcnQgQ09ORklHX1NIRUxMCi0gICAgICBleGVjICIkQ09ORklHX1NIRUxMIiAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQotICAgIGVsc2UKLSAgICAgICMgVHJ5IHVzaW5nIHByaW50Zi4KLSAgICAgIGVjaG89J3ByaW50ZiAiJXNcbiInCi0gICAgICBpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLQkgdGVzdCAiWGAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgIiA9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JIyBDb29sLCBwcmludGYgd29ya3MKLQk6Ci0gICAgICBlbGlmIHRlc3QgIlhgKCIkT1JJR0lOQUxfQ09ORklHX1NIRUxMIiAiJDAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLQkgICB0ZXN0ICJYYCgiJE9SSUdJTkFMX0NPTkZJR19TSEVMTCIgIiQwIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgIiA9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JQ09ORklHX1NIRUxMPSIkT1JJR0lOQUxfQ09ORklHX1NIRUxMIgotCWV4cG9ydCBDT05GSUdfU0hFTEwKLQlTSEVMTD0iJENPTkZJR19TSEVMTCIKLQlleHBvcnQgU0hFTEwKLQllY2hvPSIkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyIKLSAgICAgIGVsaWYgdGVzdCAiWGAoIiRDT05GSUdfU0hFTEwiICIkMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotCSAgIHRlc3QgIlhgKCIkQ09ORklHX1NIRUxMIiAiJDAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAiID0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQllY2hvPSIkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyIKLSAgICAgIGVsc2UKLQkjIG1heWJlIHdpdGggYSBzbWFsbGVyIHN0cmluZy4uLgotCXByZXY9OgotCi0JZm9yIGNtZCBpbiAnZWNobyB0ZXN0JyAnc2VkIDJxICIkMCInICdzZWQgMTBxICIkMCInICdzZWQgMjBxICIkMCInICdzZWQgNTBxICIkMCInOyBkbwotCSAgaWYgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWGBldmFsICRjbWRgIikgMj4vZGV2L251bGw7IHRoZW4KLQkgICAgYnJlYWsKLQkgIGZpCi0JICBwcmV2PSIkY21kIgotCWRvbmUKLQotCWlmIHRlc3QgIiRwcmV2IiAhPSAnc2VkIDUwcSAiJDAiJzsgdGhlbgotCSAgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkcHJldmAKLQkgIGV4cG9ydCBlY2hvX3Rlc3Rfc3RyaW5nCi0JICBleGVjICIke09SSUdJTkFMX0NPTkZJR19TSEVMTH0iICIkMCIgJHsxKyIkQCJ9Ci0JZWxzZQotCSAgIyBPb3BzLiAgV2UgbG9zdCBjb21wbGV0ZWx5LCBzbyBqdXN0IHN0aWNrIHdpdGggZWNoby4KLQkgIGVjaG89ZWNobwotCWZpCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi1maQotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0nc2VkIC1lIHMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGAkXFxcXF1cKS9cXFwxL2cnCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgotZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYFxcXFxdXCkvXFxcMS9nJwotCi0jIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQotIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgotZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKLQotIyBUaGUgbmFtZSBvZiB0aGlzIHByb2dyYW0uCi1wcm9nbmFtZT1gJGVjaG8gIlgkMCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0jIENvbnN0YW50czoKLVBST0dSQU09bHRjb25maWcKLVBBQ0tBR0U9bGlidG9vbAotVkVSU0lPTj0xLjJmCi1USU1FU1RBTVA9IiAoMS4zODUgMTk5OS8wMy8xNSAxNzoyNDo1NCkiCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC5jIDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC5jICRMSUJTIDE+JjUnCi1ybT0icm0gLWYiCi0KLWhlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLQotIyBHbG9iYWwgdmFyaWFibGVzOgotZGVmYXVsdF9vZmlsZT1saWJ0b29sCi1jYW5fYnVpbGRfc2hhcmVkPXllcwotZW5hYmxlX3NoYXJlZD15ZXMKLSMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcuCi1lbmFibGVfc3RhdGljPXllcwotZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWVuYWJsZV9kbG9wZW49dW5rbm93bgotbHRtYWluPQotc2lsZW50PQotc3JjZGlyPQotYWNfY29uZmlnX2d1ZXNzPQotYWNfY29uZmlnX3N1Yj0KLWhvc3Q9Ci1ub25vcHQ9Ci1vZmlsZT0iJGRlZmF1bHRfb2ZpbGUiCi12ZXJpZnlfaG9zdD15ZXMKLXdpdGhfZ2NjPW5vCi13aXRoX2dudV9sZD1ubwotbmVlZF9sb2Nrcz15ZXMKLWFjX2V4dD1jCi1vYmpleHQ9bwotbGliZXh0PWEKLWNhY2hlX2ZpbGU9Ci0KLW9sZF9BUj0iJEFSIgotb2xkX0NDPSIkQ0MiCi1vbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgotb2xkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi1vbGRfTEQ9IiRMRCIKLW9sZF9MTl9TPSIkTE5fUyIKLW9sZF9OTT0iJE5NIgotb2xkX1JBTkxJQj0iJFJBTkxJQiIKLW9sZF9ETExUT09MPSIkRExMVE9PTCIKLW9sZF9BUz0iJEFTIgotCi0jIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLWFyZ3M9Ci1wcmV2PQotZm9yIG9wdGlvbgotZG8KLSAgY2FzZSAiJG9wdGlvbiIgaW4KLSAgLSo9Kikgb3B0YXJnPWBlY2hvICIkb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIG9wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICBldmFsICIkcHJldj1cJG9wdGlvbiIKLSAgICBwcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJG9wdGlvbiIgaW4KLSAgLS1oZWxwKSBjYXQgPDxFT00KLVVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gW0hPU1QgW0xUTUFJTl1dCi0KLUdlbmVyYXRlIGEgc3lzdGVtLXNwZWNpZmljIGxpYnRvb2wgc2NyaXB0LgotCi0gICAgLS1kZWJ1ZyAgICAgICAgICAgICAgICBlbmFibGUgdmVyYm9zZSBzaGVsbCB0cmFjaW5nCi0gICAgLS1kaXNhYmxlLXNoYXJlZCAgICAgICBkbyBub3QgYnVpbGQgc2hhcmVkIGxpYnJhcmllcwotICAgIC0tZGlzYWJsZS1zdGF0aWMgICAgICAgZG8gbm90IGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMKLSAgICAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIGRvIG5vdCBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24KLSAgICAtLWVuYWJsZS1kbG9wZW4gICAgICAgIGVuYWJsZSBkbG9wZW4gc3VwcG9ydAotICAgIC0tZW5hYmxlLWRsb3Blbi1zZWxmICAgZW5hYmxlIHN1cHBvcnQgZm9yIGRsb3BlbmluZyBwcm9ncmFtcwotICAgIC0taGVscCAgICAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKLSAgICAtLW5vLXZlcmlmeSAgICAgICAgICAgIGRvIG5vdCB2ZXJpZnkgdGhhdCBIT1NUIGlzIGEgdmFsaWQgaG9zdCB0eXBlCi0tbywgLS1vdXRwdXQ9RklMRSAgICAgICAgICBzcGVjaWZ5IHRoZSBvdXRwdXQgZmlsZSBbZGVmYXVsdD0kZGVmYXVsdF9vZmlsZV0KLSAgICAtLXF1aWV0ICAgICAgICAgICAgICAgIHNhbWUgYXMgXGAtLXNpbGVudCcKLSAgICAtLXNpbGVudCAgICAgICAgICAgICAgIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCi0gICAgLS1zcmNkaXI9RElSICAgICAgICAgICBmaW5kIFxgY29uZmlnLmd1ZXNzJyBpbiBESVIKLSAgICAtLXZlcnNpb24gICAgICAgICAgICAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0gICAgLS13aXRoLWdjYyAgICAgICAgICAgICBhc3N1bWUgdGhhdCB0aGUgR05VIEMgY29tcGlsZXIgd2lsbCBiZSB1c2VkCi0gICAgLS13aXRoLWdudS1sZCAgICAgICAgICBhc3N1bWUgdGhhdCB0aGUgQyBjb21waWxlciB1c2VzIHRoZSBHTlUgbGlua2VyCi0gICAgLS1kaXNhYmxlLWxvY2sgICAgICAgICBkaXNhYmxlIGZpbGUgbG9ja2luZwotICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgY29uZmlndXJlIGNhY2hlIGZpbGUKLQotTFRNQUlOIGlzIHRoZSBcYGx0bWFpbi5zaCcgc2hlbGwgc2NyaXB0IGZyYWdtZW50IG9yIFxgbHRtYWluLmMnIHByb2dyYW0KLXRoYXQgcHJvdmlkZXMgYmFzaWMgbGlidG9vbCBmdW5jdGlvbmFsaXR5LgotCi1IT1NUIGlzIHRoZSBjYW5vbmljYWwgaG9zdCBzeXN0ZW0gbmFtZSBbZGVmYXVsdD1ndWVzc2VkXS4KLUVPTQotICBleGl0IDAKLSAgOzsKLQotICAtLWRlYnVnKQotICAgIGVjaG8gIiRwcm9nbmFtZTogZW5hYmxpbmcgc2hlbGwgdHJhY2UgbW9kZSIKLSAgICBzZXQgLXgKLSAgICA7OwotCi0gIC0tZGlzYWJsZS1zaGFyZWQpIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLQotICAtLWRpc2FibGUtc3RhdGljKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0KLSAgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCkgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotCi0gIC0tZW5hYmxlLWRsb3BlbikgZW5hYmxlX2Rsb3Blbj15ZXMgOzsKLQotICAtLXF1aWV0IHwgLS1zaWxlbnQpIHNpbGVudD15ZXMgOzsKLQotICAtLXNyY2RpcikgcHJldj1zcmNkaXIgOzsKLSAgLS1zcmNkaXI9Kikgc3JjZGlyPSIkb3B0YXJnIiA7OwotCi0gIC0tbm8tdmVyaWZ5KSB2ZXJpZnlfaG9zdD1ubyA7OwotCi0gIC0tb3V0cHV0IHwgLW8pIHByZXY9b2ZpbGUgOzsKLSAgLS1vdXRwdXQ9Kikgb2ZpbGU9IiRvcHRhcmciIDs7Ci0KLSAgLS12ZXJzaW9uKSBlY2hvICIkUFJPR1JBTSAoR05VICRQQUNLQUdFKSAkVkVSU0lPTiRUSU1FU1RBTVAiOyBleGl0IDAgOzsKLQotICAtLXdpdGgtZ2NjKSB3aXRoX2djYz15ZXMgOzsKLSAgLS13aXRoLWdudS1sZCkgd2l0aF9nbnVfbGQ9eWVzIDs7Ci0KLSAgLS1kaXNhYmxlLWxvY2spIG5lZWRfbG9ja3M9bm8gOzsKLQotICAtLWNhY2hlLWZpbGU9KikgY2FjaGVfZmlsZT0iJG9wdGFyZyIgOzsKLQotICAtKikKLSAgICBlY2hvICIkcHJvZ25hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAkb3B0aW9uJyIgMT4mMgotICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLXogIiRsdG1haW4iOyB0aGVuCi0gICAgICBsdG1haW49IiRvcHRpb24iCi0gICAgZWxpZiB0ZXN0IC16ICIkaG9zdCI7IHRoZW4KLSMgVGhpcyBnZW5lcmF0ZXMgYW4gdW5uZWNlc3Nhcnkgd2FybmluZyBmb3Igc3BhcmMtc3VuLXNvbGFyaXM0LjEuM19VMQotIyAgICAgIGlmIHRlc3QgLW4gImBlY2hvICRvcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0jICAgICAgICBlY2hvICIkcHJvZ25hbWU6IHdhcm5pbmcgXGAkb3B0aW9uJyBpcyBub3QgYSB2YWxpZCBob3N0IHR5cGUiIDE+JjIKLSMgICAgICBmaQotICAgICAgaG9zdD0iJG9wdGlvbiIKLSAgICBlbHNlCi0gICAgICBlY2hvICIkcHJvZ25hbWU6IHRvbyBtYW55IGFyZ3VtZW50cyIgMT4mMgotICAgICAgZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpIDs7Ci0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAteiAiJGx0bWFpbiI7IHRoZW4KLSAgZWNobyAiJHByb2duYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgTFRNQUlOIGZpbGUiIDE+JjIKLSAgZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCi1maQotCi1pZiB0ZXN0ICEgLWYgIiRsdG1haW4iOyB0aGVuCi0gIGVjaG8gIiRwcm9nbmFtZTogXGAkbHRtYWluJyBkb2VzIG5vdCBleGlzdCIgMT4mMgotICBlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLWZpCi0KLSMgUXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWx0Y29uZmlnX2FyZ3M9Ci1mb3IgYXJnCi1kbwotICBjYXNlICIkYXJnIiBpbgotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBsdGNvbmZpZ19hcmdzPSIkbHRjb25maWdfYXJncyAnJGFyZyciIDs7Ci0gICopIGx0Y29uZmlnX2FyZ3M9IiRsdGNvbmZpZ19hcmdzICRhcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBBIHJlbGV2YW50IHN1YnNldCBvZiBBQ19JTklULgotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IExBTkcgYW5kIExDX0FMTCB0byBDIGlmIGFscmVhZHkgc2V0LgotIyBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5IGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQKLSMgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi0KLWlmIHRlc3QgLW4gIiRjYWNoZV9maWxlIiAmJiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSB3aXRoaW4gbHRjb25maWciCi0gIC4gJGNhY2hlX2ZpbGUKLWZpCi0KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gICMgQXNzdW1lIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGlzIHRoZSBzYW1lIG9uZSBhcyB0aGUgcGF0aCB0byBMVE1BSU4uCi0gIHNyY2Rpcj1gJGVjaG8gIlgkbHRtYWluIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gIHRlc3QgIiRzcmNkaXIiID0gIiRsdG1haW4iICYmIHNyY2Rpcj0uCi1maQotCi10cmFwICIkcm0gY29uZnRlc3QqOyBleGl0IDEiIDEgMiAxNQotaWYgdGVzdCAiJHZlcmlmeV9ob3N0IiA9IHllczsgdGhlbgotICAjIENoZWNrIGZvciBjb25maWcuZ3Vlc3MgYW5kIGNvbmZpZy5zdWIuCi0gIGFjX2F1eF9kaXI9Ci0gIGZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL2NvbmZpZy5ndWVzczsgdGhlbgotICAgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gICAgZWNobyAiJHByb2duYW1lOiBjYW5ub3QgZmluZCBjb25maWcuZ3Vlc3MgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjIKLSAgICBlY2hvICIkaGVscCIgMT4mMgotICAgIGV4aXQgMQotICBmaQotICBhY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi0gIGFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotCi0gICMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLSAgaWYgJFNIRUxMICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMgotICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci0KLSAgaG9zdF9hbGlhcz0kaG9zdAotICBjYXNlICIkaG9zdF9hbGlhcyIgaW4KLSAgIiIpCi0gICAgaWYgaG9zdF9hbGlhcz1gJFNIRUxMICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlCi0gICAgICBlY2hvICIkcHJvZ25hbWU6IGNhbm5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyCi0gICAgICBlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkgOzsKLSAgZXNhYwotICBob3N0PWAkU0hFTEwgJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi0gIGVjaG8gIiRhY190JGhvc3QiIDE+JjYKLQotICAjIE1ha2Ugc3VyZSB0aGUgaG9zdCB2ZXJpZmllZC4KLSAgdGVzdCAteiAiJGhvc3QiICYmIGV4aXQgMQotCi1lbGlmIHRlc3QgLXogIiRob3N0IjsgdGhlbgotICBlY2hvICIkcHJvZ25hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBob3N0IHR5cGUgaWYgeW91IHVzZSBcYC0tbm8tdmVyaWZ5JyIgMT4mMgotICBlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLWVsc2UKLSAgaG9zdF9hbGlhcz0kaG9zdAotZmkKLQotIyBUcmFuc2Zvcm0gbGludXgqIHRvICotKi1saW51eC1nbnUqLCB0byBzdXBwb3J0IG9sZCBjb25maWd1cmUgc2NyaXB0cy4KLWNhc2UgIiRob3N0X29zIiBpbgotbGludXgtZ251KikgOzsKLWxpbnV4KikgaG9zdD1gZWNobyAkaG9zdCB8IHNlZCAncy9eXCguKi0uKi1saW51eFwpXCguKlwpJC9cMS1nbnVcMi8nYAotZXNhYwotCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLQotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgzKikKLSAgIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCi0gICMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcwotICAjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCi0gIGlmIHRlc3QgIiR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgICBDT0xMRUNUX05BTUVTPQotICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLSMgRGV0ZXJtaW5lIGNvbW1hbmRzIHRvIGNyZWF0ZSBvbGQtc3R5bGUgc3RhdGljIGFyY2hpdmVzLgotb2xkX2FyY2hpdmVfY21kcz0nJEFSIGNydSAkb2xkbGliJG9sZG9ianMnCi1vbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPQotCi0jIFNldCBhIHNhbmUgZGVmYXVsdCBmb3IgYEFSJy4KLXRlc3QgLXogIiRBUiIgJiYgQVI9YXIKLQotIyBJZiBSQU5MSUIgaXMgbm90IHNldCwgdGhlbiBydW4gdGhlIHRlc3QuCi1pZiB0ZXN0ICIke1JBTkxJQitzZXR9IiAhPSAic2V0IjsgdGhlbgotICByZXN1bHQ9bm8KLQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcmFubGliLi4uICRhY19jIiAxPiY2Ci0gIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1J9IgotICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgaWYgdGVzdCAtZiAkZGlyL3JhbmxpYjsgdGhlbgotICAgICAgUkFOTElCPSJyYW5saWIiCi0gICAgICByZXN1bHQ9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLQotICBlY2hvICIkYWNfdCRyZXN1bHQiIDE+JjYKLWZpCi0KLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkb2xkbGliIgotICBvbGRfcG9zdGluc3RhbGxfY21kcz0iXCRSQU5MSUIgXCRvbGRsaWJ+JG9sZF9wb3N0aW5zdGFsbF9jbWRzIgotZmkKLQotIyBTZXQgc2FuZSBkZWZhdWx0cyBmb3IgYERMTFRPT0wnIGFuZCBgQVMnLCB1c2VkIG9uIGN5Z3dpbi4KLXRlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKLXRlc3QgLXogIiRBUyIgJiYgQVM9YXMKLQotIyBDaGVjayB0byBzZWUgaWYgd2UgYXJlIHVzaW5nIEdDQy4KLWlmIHRlc3QgIiR3aXRoX2djYyIgIT0geWVzIHx8IHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBJZiBDQyBpcyBub3Qgc2V0LCB0aGVuIHRyeSB0byBmaW5kIEdDQyBvciBhIHVzYWJsZSBDQy4KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnY2MuLi4gJGFjX2MiIDE+JjYKLSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgICAgaWYgdGVzdCAtZiAkZGlyL2djYzsgdGhlbgotCUNDPSJnY2MiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJHNhdmVfaWZzIgotCi0gICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICAgICAgZWNobyAiJGFjX3QkQ0MiIDE+JjYKLSAgICBlbHNlCi0gICAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gICAgZmkKLSAgZmkKLQotICAjIE5vdCAiZ2NjIiwgc28gdHJ5ICJjYyIsIHJlamVjdGluZyAiL3Vzci91Y2IvY2MiLgotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNjLi4uICRhY19jIiAxPiY2Ci0gICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gICAgY2NfcmVqZWN0ZWQ9bm8KLSAgICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGRpci9jYzsgdGhlbgotCWlmIHRlc3QgIiRkaXIvY2MiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotCSAgY2NfcmVqZWN0ZWQ9eWVzCi0JICBjb250aW51ZQotCWZpCi0JQ0M9ImNjIgotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBpZiB0ZXN0ICRjY19yZWplY3RlZCA9IHllczsgdGhlbgotICAgICAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICAgICAgc2V0IGR1bW15ICRDQwotICAgICAgc2hpZnQKLSAgICAgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLQkjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLQkjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLQkjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotCXNoaWZ0Ci0Jc2V0IGR1bW15ICIkZGlyL2NjIiAiJEAiCi0Jc2hpZnQKLQlDQz0iJEAiCi0gICAgICBmaQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gICAgICBlY2hvICIkYWNfdCRDQyIgMT4mNgotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgICBmaQotCi0gICAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgICAgZWNobyAiJHByb2duYW1lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0gIGZpCi0KLSAgIyBOb3cgc2VlIGlmIHRoZSBjb21waWxlciBpcyByZWFsbHkgR0NDLgotICB3aXRoX2djYz1ubwotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQy4uLiAkYWNfYyIgMT4mNgotICBlY2hvICIkcHJvZ25hbWU6NTY0OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci0KLSAgJHJtIGNvbmZ0ZXN0LmMKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi0gIGlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo1NzI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIHdpdGhfZ2NjPXllcwotICBmaQotICAkcm0gY29uZnRlc3QuYwotICBlY2hvICIkYWNfdCR3aXRoX2djYyIgMT4mNgotZmkKLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLXNldCBkdW1teSAkQ0MKLWNvbXBpbGVyPSIkMiIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9iamVjdCBzdWZmaXguLi4gJGFjX2MiIDE+JjYKLSRybSBjb25mdGVzdCoKLWVjaG8gJ2ludCBpID0gMTsnID4gY29uZnRlc3QuYwotZWNobyAiJHByb2duYW1lOjU4NjogY2hlY2tpbmcgZm9yIG9iamVjdCBzdWZmaXgiID4mIDUKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6NTg3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgfTsgdGhlbgotICAjIEFwcGVuZCBhbnkgd2FybmluZ3MgdG8gdGhlIGNvbmZpZy5sb2cuCi0gIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotCi0gIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouYykgOzsKLSAgICAqKSBvYmpleHQ9YGVjaG8gJGFjX2ZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC4vL2AgOzsKLSAgICBlc2FjCi0gIGRvbmUKLWVsc2UKLSAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC5jID4mNQotZmkKLSRybSBjb25mdGVzdCoKLWVjaG8gIiRhY190JG9iamV4dCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAkYWNfYyIgMT4mNgotcGljX2ZsYWc9Ci1zcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3M9Ci13bD0KLWxpbmtfc3RhdGljX2ZsYWc9Ci1ub19idWlsdGluX2ZsYWc9Ci0KLWlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgd2w9Jy1XbCwnCi0gIGxpbmtfc3RhdGljX2ZsYWc9Jy1zdGF0aWMnCi0KLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgb3NmMyogfCBvc2Y0KikKLSAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KLSAgICA7OwotICBhaXgqKQotICAgICMgQmVsb3cgdGhlcmUgaXMgYSBkaXJ0eSBoYWNrIHRvIGZvcmNlIG5vcm1hbCBzdGF0aWMgbGlua2luZyB3aXRoIC1sZGwKLSAgICAjIFRoZSBwcm9ibGVtIGlzIGJlY2F1c2UgbGliZGwgZHluYW1pY2FsbHkgbGlua2VkIHdpdGggYm90aCBsaWJjIGFuZAotICAgICMgbGliQyAoQUlYIEMrKyBsaWJyYXJ5KSwgd2hpY2ggb2J2aW91c2x5IGRvZXNuJ3QgaW5jbHVkZWQgaW4gbGlicmFyaWVzCi0gICAgIyBsaXN0IGJ5IGdjYy4gVGhpcyBjYXVzZSB1bmRlZmluZWQgc3ltYm9scyB3aXRoIC1zdGF0aWMgZmxhZ3MuCi0gICAgIyBUaGlzIGhhY2sgYWxsb3dzIEMgcHJvZ3JhbXMgdG8gYmUgbGlua2VkIHdpdGggIi1zdGF0aWMgLWxkbCIsIGJ1dAotICAgICMgd2Ugbm90IHN1cmUgYWJvdXQgQysrIHByb2dyYW1zLgotICAgIGxpbmtfc3RhdGljX2ZsYWc9IiRsaW5rX3N0YXRpY19mbGFnICR7d2x9LWxDIgotICAgIDs7Ci0gIGN5Z3dpbiogfCBtaW5ndyogfCBvczIqKQotICAgICMgV2UgY2FuIGJ1aWxkIERMTHMgZnJvbSBub24tUElDLgotICAgIDs7Ci0gIGFtaWdhb3MqKQotICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKLSAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKLSAgICAjIGxpa2UgYC1tNjgwNDAnLgotICAgIHBpY19mbGFnPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCi0gICAgOzsKLSAgKikKLSAgICBwaWNfZmxhZz0nLWZQSUMnCi0gICAgOzsKLSAgZXNhYwotZWxzZQotICAjIFBPUlRNRSBDaGVjayBmb3IgUElDIGZsYWdzIGZvciB0aGUgc3lzdGVtIGNvbXBpbGVyLgotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgYWl4MyogfCBhaXg0KikKLSAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJwotICAgIDs7Ci0KLSAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICAgIyBJcyB0aGVyZSBhIGJldHRlciBsaW5rX3N0YXRpY19mbGFnIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KLSAgICB3bD0nLVdsLCcKLSAgICBsaW5rX3N0YXRpY19mbGFnPSIke3dsfS1hICR7d2x9YXJjaGl2ZSIKLSAgICBwaWNfZmxhZz0nK1onCi0gICAgOzsKLQotICBpcml4NSogfCBpcml4NiopCi0gICAgd2w9Jy1XbCwnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLW5vbl9zaGFyZWQnCi0gICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KiB8IG9zMiopCi0gICAgIyBXZSBjYW4gYnVpbGQgRExMcyBmcm9tIG5vbi1QSUMuCi0gICAgOzsKLQotICBvc2YzKiB8IG9zZjQqKQotICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgotICAgIHdsPSctV2wsJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1ub25fc2hhcmVkJwotICAgIDs7Ci0KLSAgc2NvMy4ydjUqKQotICAgIHBpY19mbGFnPSctS3BpYycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctZG4nCi0gICAgc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzPSctYmVsZicKLSAgICA7OwotCi0gIHNvbGFyaXMqKQotICAgIHBpY19mbGFnPSctS1BJQycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICB3bD0nLVdsLCcKLSAgICA7OwotCi0gIHN1bm9zNCopCi0gICAgcGljX2ZsYWc9Jy1QSUMnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLUJzdGF0aWMnCi0gICAgd2w9Jy1Rb3B0aW9uIGxkICcKLSAgICA7OwotCi0gIHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCi0gICAgcGljX2ZsYWc9Jy1LUElDJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJwotICAgIHdsPSctV2wsJwotICAgIDs7Ci0KLSAgdXRzNCopCi0gICAgcGljX2ZsYWc9Jy1waWMnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLUJzdGF0aWMnCi0gICAgOzsKLQotICAqKQotICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICA7OwotICBlc2FjCi1maQotCi1pZiB0ZXN0IC1uICIkcGljX2ZsYWciOyB0aGVuCi0gIGVjaG8gIiRhY190JHBpY19mbGFnIiAxPiY2Ci0KLSAgIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHBpY19mbGFnIGFjdHVhbGx5IHdvcmtzLgotICBlY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJHBpY19mbGFnIHdvcmtzLi4uICRhY19jIiAxPiY2Ci0gICRybSBjb25mdGVzdCoKLSAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC5jCi0gIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgJHBpY19mbGFnIC1EUElDIgotICBlY2hvICIkcHJvZ25hbWU6NzE3OiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJHBpY19mbGFnIHdvcmtzIiA+JjUKLSAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo3MTg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJG9iamV4dDsgdGhlbgotICAgICMgQXBwZW5kIGFueSB3YXJuaW5ncyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICAKLSAgICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgICAgICMgT24gSFAtVVgsIGJvdGggQ0MgYW5kIEdDQyBvbmx5IHdhcm4gdGhhdCBQSUMgaXMgc3VwcG9ydGVkLi4uIHRoZW4gdGhleQotICAgICAgIyBjcmVhdGUgbm9uLVBJQyBvYmplY3RzLiAgU28sIGlmIHRoZXJlIHdlcmUgYW55IHdhcm5pbmdzLCB3ZSBhc3N1bWUgdGhhdAotICAgICAgIyBQSUMgaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0JZWNobyAiJGFjX3Qibm8gMT4mNgotCWNhbl9idWlsZF9zaGFyZWQ9bm8KLQlwaWNfZmxhZz0KLSAgICAgIGVsc2UKLQllY2hvICIkYWNfdCJ5ZXMgMT4mNgotCXBpY19mbGFnPSIgJHBpY19mbGFnIgotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGVjaG8gIiRhY190InllcyAxPiY2Ci0gICAgICBwaWNfZmxhZz0iICRwaWNfZmxhZyIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBlbHNlCi0gICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgcGljX2ZsYWc9Ci0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLSAgJHJtIGNvbmZ0ZXN0KgotZWxzZQotICBlY2hvICIkYWNfdCJub25lIDE+JjYKLWZpCi0KLSMgQ2hlY2sgdG8gc2VlIGlmIG9wdGlvbnMgLW8gYW5kIC1jIGFyZSBzaW11bHRhbmVvdXNseSBzdXBwb3J0ZWQgYnkgY29tcGlsZXIKLWVjaG8gJGFjX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLm8uLi4gJGFjX2MiIDE+JjYKLSRybSBjb25mdGVzdCoKLWVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuYwotc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9IiRDRkxBR1MgLWMgLW8gY29uZnRlc3QyLm8iCi1lY2hvICIkcHJvZ25hbWU6NzYwOiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5vIiA+JjUKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6NzYxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0Mi5vOyB0aGVuCi0KLSAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgICAgIGNvbXBpbGVyX2Nfbz1ubwotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhY190InllcyAxPiY2Ci0gICAgICBjb21waWxlcl9jX289eWVzCi0gICAgZmkKLWVsc2UKLSAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gIGNvbXBpbGVyX2Nfbz1ubwotICBlY2hvICIkYWNfdCJubyAxPiY2Ci1maQotQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi0kcm0gY29uZnRlc3QqCi0KLWlmIHRlc3QgeCIkY29tcGlsZXJfY19vIiA9IHgieWVzIjsgdGhlbgotICAjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gd3JpdGUgdG8gYSAubG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUubG8uLi4gJGFjX2MiIDE+JjYKLSAgJHJtIGNvbmZ0ZXN0KgotICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LmMKLSAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYyAtbyBjb25mdGVzdC5sbyIKLSAgZWNobyAiJHByb2duYW1lOjc4ODogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUubG8iID4mNQotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo3ODk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB9ICYmIHRlc3QgLXMgY29uZnRlc3QubG87IHRoZW4KLQotICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotCWVjaG8gIiRhY190Im5vIDE+JjYKLQljb21waWxlcl9vX2xvPW5vCi0gICAgICBlbHNlCi0JZWNobyAiJGFjX3QieWVzIDE+JjYKLQljb21waWxlcl9vX2xvPXllcwotICAgICAgZmkKLSAgZWxzZQotICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgY29tcGlsZXJfb19sbz1ubwotICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgZmkKLSAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi0gICRybSBjb25mdGVzdCoKLWVsc2UKLSAgY29tcGlsZXJfb19sbz1ubwotZmkKLQotIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIGRvIGhhcmQgbGlua3MgdG8gbG9jayBzb21lIGZpbGVzIGlmIG5lZWRlZAotaGFyZF9saW5rcz0ibm90dGVzdGVkIgotaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KLSAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAkYWNfYyIgMT4mNgotICBoYXJkX2xpbmtzPXllcwotICAkcm0gY29uZnRlc3QqCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIHRvdWNoIGNvbmZ0ZXN0LmEKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubwotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICBlY2hvICIkYWNfdCRoYXJkX2xpbmtzIiAxPiY2Ci0gICRybSBjb25mdGVzdCoKLSAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KLSAgICBlY2hvICIqKiogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiYyCi0gICAgbmVlZF9sb2Nrcz13YXJuCi0gIGZpCi1lbHNlCi0gIG5lZWRfbG9ja3M9bm8KLWZpCi0KLWlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIGFyZSBzdXBwb3J0ZWQgYnkgY29tcGlsZXIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMgLi4uICRhY19jIiAxPiY2Ci0gICRybSBjb25mdGVzdCoKLSAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC5jCi0gIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyAtYyBjb25mdGVzdC5jIgotICBlY2hvICIkcHJvZ25hbWU6ODQwOiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIgPiY1Ci0gIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6ODQxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0Lm87IHRoZW4KLQotICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotCWVjaG8gIiRhY190Im5vIDE+JjYKLQljb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KLSAgICAgIGVsc2UKLQllY2hvICIkYWNfdCJ5ZXMgMT4mNgotCWNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz15ZXMKLSAgICAgIGZpCi0gIGVsc2UKLSAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgIGNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz1ubwotICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgZmkKLSAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi0gICRybSBjb25mdGVzdCoKLQotICBpZiB0ZXN0ICIkY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA9ICJ5ZXMiOyB0aGVuCi0gICAgbm9fYnVpbHRpbl9mbGFnPScgLWZuby1idWlsdGluIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMnCi0gIGVsc2UKLSAgICBub19idWlsdGluX2ZsYWc9JyAtZm5vLWJ1aWx0aW4nCi0gIGZpCi0gIAotZmkKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgc2hhcmVkIGxpYnJhcnkgY29tcGlsYXRpb24gZmxhZ3MuCi1pZiB0ZXN0IC1uICIkc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzIjsgdGhlbgotICBlY2hvICIkcHJvZ25hbWU6IHdhcm5pbmc6IFxgJENDJyByZXF1aXJlcyBcYCRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3MnIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKLSAgaWYgZWNobyAiJG9sZF9DQyAkb2xkX0NGTEFHUyAiIHwgZWdyZXAgLWUgIlsgCV0kc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzWyAJXSIgPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGFkZCBcYCRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3MnIHRvIHRoZSBDQyBvciBDRkxBR1MgZW52IHZhcmlhYmxlIGFuZCByZWNvbmZpZ3VyZSIgMT4mMgotICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgZmkKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbGlua19zdGF0aWNfZmxhZyB3b3Jrcy4uLiAkYWNfYyIgMT4mNgotJHJtIGNvbmZ0ZXN0KgotZWNobyAnbWFpbigpe3JldHVybigwKTt9JyA+IGNvbmZ0ZXN0LmMKLXNhdmVfTERGTEFHUz0iJExERkxBR1MiCi1MREZMQUdTPSIkTERGTEFHUyAkbGlua19zdGF0aWNfZmxhZyIKLWVjaG8gIiRwcm9nbmFtZTo4ODQ6IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbGlua19zdGF0aWNfZmxhZyB3b3JrcyIgPiY1Ci1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjg4NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIGVjaG8gIiRhY190JGxpbmtfc3RhdGljX2ZsYWciIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3Qibm9uZSAxPiY2Ci0gIGxpbmtfc3RhdGljX2ZsYWc9Ci1maQotTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLSRybSBjb25mdGVzdCoKLQotaWYgdGVzdCAteiAiJExOX1MiOyB0aGVuCi0gICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiB1c2UgbG4gLXMsIG9yIHdlIG5lZWQgaGFyZCBsaW5rcy4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3Jrcy4uLiAkYWNfYyIgMT4mNgotICAkcm0gY29uZnRlc3RkYXRhCi0gIGlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgJHJtIGNvbmZ0ZXN0ZGF0YQotICAgIExOX1M9ImxuIC1zIgotICBlbHNlCi0gICAgTE5fUz1sbgotICBmaQotICBpZiB0ZXN0ICIkTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0gICAgZWNobyAiJGFjX3QieWVzIDE+JjYKLSAgZWxzZQotICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgZmkKLWZpCi0KLSMgTWFrZSBzdXJlIExEIGlzIGFuIGFic29sdXRlIHBhdGguCi1pZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIGFjX3Byb2c9bGQKLSAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQy4uLiAkYWNfYyIgMT4mNgotICAgIGVjaG8gIiRwcm9nbmFtZTo5MTc6IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIgPiY1Ci0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICAgIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICAgIiIpCi0gICAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlIG5vdCB1c2luZyBHQ0MuCi0gICAgICBhY19wcm9nPWxkCi0gICAgICA7OwotICAgICopCi0gICAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAkYWNfYyIgMT4mNgotICAgIGVjaG8gIiRwcm9nbmFtZTo5NDE6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotICBlbHNlCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotICAgIGVjaG8gIiRwcm9nbmFtZTo5NDQ6IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKLSAgZmkKLQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gICAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgotCUxEPSIkYWNfZGlyLyRhY19wcm9nIgotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLQkjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0JIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0JaWYgIiRMRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQkgIHRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLQllbHNlCi0JICB0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotCWZpCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgZmkKLQotICBpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gICAgZWNobyAiJGFjX3QkTEQiIDE+JjYKLSAgZWxzZQotICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgZmkKLQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gICAgZWNobyAiJHByb2duYW1lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLWZpCi0KLSMgQ2hlY2sgdG8gc2VlIGlmIGl0IHJlYWxseSBpcyBvciBpcyBub3QgR05VIGxkLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQuLi4gJGFjX2MiIDE+JjYKLSMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLWVjaG8gIiRhY190JHdpdGhfZ251X2xkIiAxPiY2Ci0KLSMgU2VlIGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRhY19jIiAxPiY2Ci0KLWFsbG93X3VuZGVmaW5lZF9mbGFnPQotbm9fdW5kZWZpbmVkX2ZsYWc9Ci1uZWVkX2xpYl9wcmVmaXg9dW5rbm93bgotbmVlZF92ZXJzaW9uPXVua25vd24KLSMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgotIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCi1hcmNoaXZlX2NtZHM9Ci1hcmNoaXZlX2V4cHN5bV9jbWRzPQotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQotdGhyZWFkX3NhZmVfZmxhZ19zcGVjPQotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9Ci1oYXJkY29kZV9kaXJlY3Q9bm8KLWhhcmRjb2RlX21pbnVzX0w9bm8KLWhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKLXJ1bnBhdGhfdmFyPQotYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCi1leHBvcnRfc3ltYm9sc19jbWRzPSckTk0gJGxpYm9ianMgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgc2VkICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgotIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKLWluY2x1ZGVfZXhwc3ltcz0KLSMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBlZ3JlcCByZWd1bGFyIGV4cHJlc3Npb24gb2Ygc3ltYm9scyB0byBleGNsdWRlCi0jIGl0IHdpbGwgYmUgd3JhcHBlZCBieSBgICgnIGFuZCBgKSQnLCBzbyBvbmUgbXVzdCBub3QgbWF0Y2ggYmVnaW5uaW5nIG9yCi0jIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCi0jIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KLWV4Y2x1ZGVfZXhwc3ltcz0KLQotY2FzZSAiJGhvc3Rfb3MiIGluCi1jeWd3aW4qIHwgbWluZ3cqKQotICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCi0gICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCi0gIGlmIHRlc3QgIiR3aXRoX2djYyIgIT0geWVzOyB0aGVuCi0gICAgd2l0aF9nbnVfbGQ9bm8KLSAgZmkKLSAgOzsKLQotZnJlZWJzZDIqIHwgc3Vub3M0KikKLSAgZXhjbHVkZV9leHBzeW1zPSJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0gIDs7Ci0KLWVzYWMKLQotbGRfc2hsaWJzPXllcwotaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQotICB3bGFyYz0nJHt3bH0nCi0KLSAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBhaXgzKiB8IGFpeDQqKQotICAgICMgT24gQUlYLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgotICAgIGxkX3NobGlicz1ubwotICAgIGNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjkuMSwgaXMgcmVwb3J0ZWQKLSoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgotKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91Ci0qKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBtb2RpZnkgeW91ciBQQVRICi0qKiogc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1FT0YKLSAgICA7OwotCi0gIGFtaWdhb3MqKQotICAgIGFyY2hpdmVfY21kcz0nJHJtICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiBjcnUgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICA7OwotCi0gIHN1bm9zNCopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgd2xhcmM9Ci0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgYmVvcyopCi0gICAgaWYgJExEIC0taGVscCAyPiYxIHwgZWdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgbGRfc2hsaWJzPW5vCi0gICAgZmkKLSAgICA7OwotCi0gIGN5Z3dpbiogfCBtaW5ndyopCi0gICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcwotICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcwotCi0gICAgIyBFeHRyYWN0IHRoZSBzeW1ib2wgZXhwb3J0IGxpc3QgZnJvbSBhbiBgLS1leHBvcnQtYWxsJyBkZWYgZmlsZSwKLSAgICAjIHRoZW4gcmVnZW5lcmF0ZSB0aGUgZGVmIGZpbGUgZnJvbSB0aGUgc3ltYm9sIGV4cG9ydCBsaXN0LCBzbyB0aGF0Ci0gICAgIyB0aGUgY29tcGlsZWQgZGxsIG9ubHkgZXhwb3J0cyB0aGUgc3ltYm9sIGV4cG9ydCBsaXN0LgotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHM9J3JtIC1mICRvYmpkaXIvJHNvbmFtZS1sdGRsbC5jfgotICAgICAgc2VkIC1lICIvXiMgXC9cKiBsdGRsbC5jIHN0YXJ0cyBoZXJlIFwqXC8vLC9eIyBcL1wqIGx0ZGxsLmMgZW5kcyBoZXJlIFwqXC8vIHsgcy9eIyAvLzsgcDsgfSIgLWUgZCA8ICQwID4gJG9iamRpci8kc29uYW1lLWx0ZGxsLmN+Ci0gICAgICAoY2QgJG9iamRpciAmJiAkQ0MgLWMgJHNvbmFtZS1sdGRsbC5jKX4KLSAgICAgICRETExUT09MIC0tZXhwb3J0LWFsbCAtLWV4Y2x1ZGUtc3ltYm9scyBEbGxNYWluQDEyLF9jeWd3aW5fZGxsX2VudHJ5QDEyLF9jeWd3aW5fbm9uY3lnd2luX2RsbF9lbnRyeUAxMiAtLW91dHB1dC1kZWYgJG9iamRpci8kc29uYW1lLWRlZiAgJG9iamRpci8kc29uYW1lLWx0ZGxsLiRvYmpleHQgJGxpYm9ianN+Ci0gICAgICBzZWQgLWUgIjEsL0VYUE9SVFMvZCIgLWUgInMvIEAgWzAtOV0qIDsgKi8vIiA8ICRvYmpkaXIvJHNvbmFtZS1kZWYgPiAkZXhwb3J0X3N5bWJvbHMnCi0KLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdlY2hvIEVYUE9SVFMgPiAkb2JqZGlyLyRzb25hbWUtZGVmfgotICAgICAgX2x0X2hpbnQ9MTsKLSAgICAgIGZvciBzeW1ib2wgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbwotICAgICAgICBlY2hvICIJXCRzeW1ib2wgQCBcJF9sdF9oaW50IDsgIiA+PiAkb2JqZGlyLyRzb25hbWUtZGVmOwotCV9sdF9oaW50PWBleHByIDEgKyBcJF9sdF9oaW50YDsKLSAgICAgIGRvbmV+Ci0gICAgICAkQ0MgLVdsLC0tYmFzZS1maWxlLCRvYmpkaXIvJHNvbmFtZS1iYXNlIC1XbCwtLWRsbCAtbm9zdGFydGZpbGVzIC1XbCwtZSxfX2N5Z3dpbl9kbGxfZW50cnlAMTIgLW8gJGxpYiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuJG9iamV4dCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHN+Ci0gICAgICAkRExMVE9PTCAtLWFzPSRBUyAtLWRsbG5hbWUgJHNvbmFtZSAtLWV4Y2x1ZGUtc3ltYm9scyBEbGxNYWluQDEyLF9jeWd3aW5fZGxsX2VudHJ5QDEyLF9jeWd3aW5fbm9uY3lnd2luX2RsbF9lbnRyeUAxMiAtLWRlZiAkb2JqZGlyLyRzb25hbWUtZGVmIC0tYmFzZS1maWxlICRvYmpkaXIvJHNvbmFtZS1iYXNlIC0tb3V0cHV0LWV4cCAkb2JqZGlyLyRzb25hbWUtZXhwfgotICAgICAgJENDIC1XbCwtLWJhc2UtZmlsZSwkb2JqZGlyLyRzb25hbWUtYmFzZSAkb2JqZGlyLyRzb25hbWUtZXhwIC1XbCwtLWRsbCAtbm9zdGFydGZpbGVzIC1XbCwtZSxfX2N5Z3dpbl9kbGxfZW50cnlAMTIgLW8gJGxpYiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuJG9iamV4dCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHN+Ci0gICAgICAkRExMVE9PTCAtLWFzPSRBUyAtLWRsbG5hbWUgJHNvbmFtZSAtLWV4Y2x1ZGUtc3ltYm9scyBEbGxNYWluQDEyLF9jeWd3aW5fZGxsX2VudHJ5QDEyLF9jeWd3aW5fbm9uY3lnd2luX2RsbF9lbnRyeUAxMiAtLWRlZiAkb2JqZGlyLyRzb25hbWUtZGVmIC0tYmFzZS1maWxlICRvYmpkaXIvJHNvbmFtZS1iYXNlIC0tb3V0cHV0LWV4cCAkb2JqZGlyLyRzb25hbWUtZXhwfgotICAgICAgJENDICRvYmpkaXIvJHNvbmFtZS1leHAgLVdsLC0tZGxsIC1ub3N0YXJ0ZmlsZXMgLVdsLC1lLF9fY3lnd2luX2RsbF9lbnRyeUAxMiAtbyAkbGliICRvYmpkaXIvJHNvbmFtZS1sdGRsbC4kb2JqZXh0ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLQotICAgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nJERMTFRPT0wgLS1hcz0kQVMgLS1kbGxuYW1lICRzb25hbWUgLS1kZWYgJG9iamRpci8kc29uYW1lLWRlZiAtLW91dHB1dC1saWIgJG9iamRpci8kbGlibmFtZS5hJwotICAgIDs7Ci0KLSAgKikKLSAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgbGRfc2hsaWJzPW5vCi0gICAgZmkKLSAgICA7OwotICBlc2FjCi0KLSAgaWYgdGVzdCAiJGxkX3NobGlicyIgPSB5ZXM7IHRoZW4KLSAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0gICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCi0gIGZpCi1lbHNlCi0gICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGFpeDMqKQotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcwotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRMRCAtbyAkb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgY3J1ICRsaWIgJG9iamRpci8kc29uYW1lJwotICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCi0gICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLSAgICAgICMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQotICAgICAgIyBicm9rZW4gY29sbGVjdDIuCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKLSAgICBmaQotICAgIDs7Ci0KLSAgYWl4NCopCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Ci0gICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAgICAgaWYgc3RyaW5ncyBgJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAgfCBcCi0JIGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCi0gICAgICB0aGVuCi0JIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCi0JaGFyZGNvZGVfZGlyZWN0PXllcwotICAgICAgZWxzZQotCSMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKLQloYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKLSAgICAgIGZpCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWJub2VudHJ5IC1vICRvYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgZWxzZQotICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1vICRvYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWJNOlNSRSAke3dsfS1ibm9lbnRyeScKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBmaQotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgIyBUaG91Z2ggTElCUEFUSCB2YXJpYWJsZSBoYXJkY29kZXMgc2hsaWJwYXRoIGludG8gZXhlY3V0YWJsZSwKLSAgICAjIGl0IGRvZXNuJ3QgYWZmZWN0IHNlYXJjaGluZyBmb3IgLWwqIGxpYnJhcmllczsgdGhpcyBjb25mdXNlcwotICAgICMgdGVzdHMgaW4gbWRlbW8uCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgIDs7Ci0KLSAgYW1pZ2FvcyopCi0gICAgYXJjaGl2ZV9jbWRzPSckcm0gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSIGNydSAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG9iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KikKLSAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCi0gICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcwotICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nICcKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCi0gICAgbGliZXh0PWxpYgotICAgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KLSAgICBhcmNoaXZlX2NtZHM9JyRDQyAtbyAkbGliICRsaWJvYmpzICRsaW5rb3B0cyBgZWNobyAiJGRlcGxpYnMiIHwgc2VkIC1lICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCi0gICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSd0cnVlJwotICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCi0gICAgb2xkX2FyY2hpdmVfY21kcz0nbGliIC9PVVQ6JG9sZGxpYiRvbGRvYmpzJwotICAgIGZpeF9zcmNmaWxlX3BhdGg9J2BjeWdwYXRoIC13ICRzcmNmaWxlYCcKLSAgICA7OwotCi0gIGZyZWVic2QxKikKLSAgICBsZF9zaGxpYnM9bm8KLSAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgOzsKLQotICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKLSAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCi0gICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQotICAjIGV4dHJhIHNwYWNlKS4KLSAgZnJlZWJzZDIuMiopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgL3Vzci9saWIvYysrcnQwLm8nCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPW5vICMgdmVyaWZpZWQgb24gMi4yLjYKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCi0gIGZyZWVic2QyKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCi0gIGZyZWVic2QqKQotICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPW5vCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgaHB1eDkqKQotICAgIGFyY2hpdmVfY21kcz0nJHJtICRvYmpkaXIvJHNvbmFtZX4kTEQgLWIgK3MgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHN+dGVzdCAkb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvYmpkaXIvJHNvbmFtZSAkbGliJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKLSAgICA7OwotCi0gIGhwdXgxMCogfCBocHV4MTEqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1iICtoICRzb25hbWUgK3MgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKLSAgICA7OwotCi0gIGlyaXg1KiB8IGlyaXg2KikKLSAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC1vICRsaWInCi0gICAgZmkKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgOzsKLQotICBuZXRic2QqKQotICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJyAgIyBhLm91dAotICAgIGVsc2UKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnICAgICAgIyBFTEYKLSAgICBmaQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LVIkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBvcGVuYnNkKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIG9zMiopCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICBhcmNoaXZlX2NtZHM9JyRlY2hvICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG9iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gRVhQT1JUUyA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG9iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICRvYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J2VteGltcCAtbyAkb2JqZGlyLyRsaWJuYW1lLmEgJG9iamRpci8kbGlibmFtZS5kZWYnCi0gICAgOzsKLQotICBvc2YzKiB8IG9zZjQqKQotICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLW8gJGxpYicKLSAgICBmaQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLSAgICA7OwotCi0gIHNjbzMuMnY1KikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgOzsKLQotICBzb2xhcmlzKikKLSAgICBub191bmRlZmluZWRfZmxhZz0nIC16IHRleHQnCi0gICAgIyAkQ0MgLXNoYXJlZCB3aXRob3V0IEdOVSBsZCB3aWxsIG5vdCBjcmVhdGUgYSBsaWJyYXJ5IGZyb20gQysrCi0gICAgIyBvYmplY3QgZmlsZXMgYW5kIGEgc3RhdGljIGxpYnN0ZGMrKywgYmV0dGVyIGF2b2lkIGl0IGJ5IG5vdwotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCQkkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzfiRybSAkbGliLmV4cCcKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgc3Vub3M0KikKLSAgICAjIFdoeSBkbyB3ZSBuZWVkIC1Cc3RhdGljPyAgVG8gYXZvaWQgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMsIG1heWJlLi4uCi0gICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAgICAgIyBVc2UgLWZQSUMgaGVyZSBiZWNhdXNlIGxpYmdjYyBpcyBtdWx0aWxpYmJlZAotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1Cc3RhdGljIC1mUElDIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGVsc2UKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGZpCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIHN5c3Y0LjMqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfZGlyZWN0PW5vCi0gICAgaGFyZGNvZGVfbWludXNfTD1ubwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Jy1CZXhwb3J0JwotICAgIDs7Ci0KLSAgdXRzNCopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PW5vCi0gICAgaGFyZGNvZGVfbWludXNfTD1ubwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIGRndXgqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD1ubwotICAgIGhhcmRjb2RlX21pbnVzX0w9bm8KLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICAqKQotICAgIGxkX3NobGlicz1ubwotICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICA7OwotICBlc2FjCi1maQotZWNobyAiJGFjX3QkbGRfc2hsaWJzIiAxPiY2Ci0KLWlmIHRlc3QgLXogIiROTSI7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tLi4uICRhY19jIiAxPiY2Ci0gIGNhc2UgIiROTSIgaW4KLSAgLyogfCBbQS1aYS16XTpbL1xcXSopIDs7ICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICAqKQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1J9IgotICAgIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci91Y2IgL3Vzci9jY3MvYmluIC9iaW47IGRvCi0gICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0JIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0JIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLQkjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0JaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JICBOTT0iJGFjX2Rpci9ubSAtQiIKLQkgIGJyZWFrCi0JZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQkgIE5NPSIkYWNfZGlyL25tIC1wIgotCSAgYnJlYWsKLQllbHNlCi0JICBOTT0ke05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JICBjb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotCWZpCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgICB0ZXN0IC16ICIkTk0iICYmIE5NPW5tCi0gICAgOzsKLSAgZXNhYwotICBlY2hvICIkYWNfdCROTSIgMT4mNgotZmkKLQotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLWVjaG8gJGFjX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dC4uLiAkYWNfYyIgMT4mNgotCi0jIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCi0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLXN5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBzeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBzeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKSAjIEl0cyBsaW5rZXIgZGlzdGluZ3Vpc2hlcyBkYXRhIGZyb20gY29kZSBzeW1ib2xzCi0gIGdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICA7OwotaXJpeCopCi0gIHN5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgc3ltY29kZT0nW0JEVF0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIHN5bWNvZGU9J1tBQkNER0lTVFddJwotZmkKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCi0gIGdsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsgCV1cKCRzeW1jb2RlXClbIAldWyAJXSpcKCRhY19zeW1wcmZ4XCkkc3ltcGF0JC8kc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgcGlwZV93b3Jrcz1ubwotICAkcm0gY29uZnRlc3QqCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1tYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9Ci1FT0YKLQotICBlY2hvICIkcHJvZ25hbWU6MTQ0NzogY2hlY2tpbmcgaWYgZ2xvYmFsX3N5bWJvbF9waXBlIHdvcmtzIiA+JjUKLSAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToxNDQ4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJG9iamV4dDsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIG5saXN0PWNvbmZ0ZXN0Lm5tCi0gICAgaWYgeyBlY2hvICIkcHJvZ25hbWU6MTQ1MTogZXZhbCBcIiROTSBjb25mdGVzdC4kb2JqZXh0IHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+ICRubGlzdFwiIiA+JjU7IGV2YWwgIiROTSBjb25mdGVzdC4kb2JqZXh0IHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+ICRubGlzdCAyPiY1IjsgfSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCi0KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgotCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgPj4gY29uZnRlc3QuYycKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXsKLUVPRgotCSAgc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJG5saXN0IiA+PiBjb25mdGVzdC5jCi0JICBjYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kb2JqZXh0IGNvbmZ0ZXN0bS4kb2JqZXh0Ci0JICBzYXZlX0xJQlM9IiRMSUJTIgotCSAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJG9iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjE1MDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBwaXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotCSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLQkgIGZpCi0JICBMSUJTPSIkc2F2ZV9MSUJTIgotCWVsc2UKLQkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mNQotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJG5saXN0IiA+JjUKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLSAgZmkKLSAgJHJtIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJHBpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGdsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLWVjaG8gIiRhY190JHBpcGVfd29ya3MiIDE+JjYKLQotaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0KLWZpCi0KLSMgQ2hlY2sgaGFyZGNvZGluZyBhdHRyaWJ1dGVzLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAkYWNfYyIgMT4mNgotaGFyZGNvZGVfYWN0aW9uPQotaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHx8IFwKLSAgIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQotICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCi0gIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IG5vICYmIFwKLSAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vICYmIFwKLSAgICAgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiICE9IG5vOyB0aGVuCi0KLSAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgotICAgIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKLSAgZWxzZQotICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCi0gICAgaGFyZGNvZGVfYWN0aW9uPWltbWVkaWF0ZQotICBmaQotZWxzZQotICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZwotICAjIGRpcmVjdG9yaWVzLgotICBoYXJkY29kZV9hY3Rpb249dW5zdXBwb3J0ZWQKLWZpCi1lY2hvICIkYWNfdCRoYXJkY29kZV9hY3Rpb24iIDE+JjYKLQotCi1yZWxvYWRfZmxhZz0KLXJlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXMuLi4gJGFjX2MiIDE+JjYKLSMgUE9SVE1FIFNvbWUgbGlua2VycyBtYXkgbmVlZCBhIGRpZmZlcmVudCByZWxvYWQgZmxhZy4KLXJlbG9hZF9mbGFnPSctcicKLWVjaG8gIiRhY190JHJlbG9hZF9mbGFnIiAxPiY2Ci10ZXN0IC1uICIkcmVsb2FkX2ZsYWciICYmIHJlbG9hZF9mbGFnPSIgJHJlbG9hZF9mbGFnIgotCi0jIFBPUlRNRSBGaWxsIGluIHlvdXIgbGQuc28gY2hhcmFjdGVyaXN0aWNzCi1saWJyYXJ5X25hbWVzX3NwZWM9Ci1saWJuYW1lX3NwZWM9J2xpYiRuYW1lJwotc29uYW1lX3NwZWM9Ci1wb3N0aW5zdGFsbF9jbWRzPQotcG9zdHVuaW5zdGFsbF9jbWRzPQotZmluaXNoX2NtZHM9Ci1maW5pc2hfZXZhbD0KLXNobGlicGF0aF92YXI9Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgotdmVyc2lvbl90eXBlPW5vbmUKLWR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgotc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotZmlsZV9tYWdpY19jbWQ9Ci1maWxlX21hZ2ljX3Rlc3RfZmlsZT0KLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSd1bmtub3duJwotIyBOZWVkIHRvIHNldCB0aGUgcHJlY2VkaW5nIHZhcmlhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0Ci0jIGludGVybGlicmFyeSBkZXBlbmRlbmNpZXMuCi0jICdub25lJyAtLSBkZXBlbmRlbmNpZXMgbm90IHN1cHBvcnRlZC4KLSMgYHVua25vd24nIC0tIHNhbWUgYXMgbm9uZSwgYnV0IGRvY3VtZW50cyB0aGF0IHdlIHJlYWxseSBkb24ndCBrbm93LgotIyAncGFzc19hbGwnIC0tIGFsbCBkZXBlbmRlbmNpZXMgcGFzc2VkIHdpdGggbm8gY2hlY2tzLgotIyAndGVzdF9jb21waWxlJyAtLSBjaGVjayBieSBtYWtpbmcgdGVzdCBwcm9ncmFtLgotIyAnZmlsZV9tYWdpYyBbcmVnZXhdJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKLSMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZWdyZXAgcmVnZXguCi0jIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKLSMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCi1lY2hvICRhY19uICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gJGFjX2MiIDE+JjYKLWNhc2UgIiRob3N0X29zIiBpbgotYWl4MyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAkbGlibmFtZS5hJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLQotICAjIEFJWCBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIDs7Ci0KLWFpeDQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgIyBBSVggaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAotICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCi0gICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCi0gICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRob3VnaCBBSVg0LjIKLSAgIyBhbmQgbGF0ZXIgbGlua2VyIHN1cHBvcnRzIC5zbwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5hJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotYW1pZ2FvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCi0gICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCi0gIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiKGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEpIjsgKGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEpIHx8IGV4aXQgMTsgZG9uZScKLSAgOzsKLQotYmVvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfS5zbycKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAotICA7OwotCi1ic2RpNCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0uc28kbWFqb3IgJHtsaWJuYW1lfS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0uc28nCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSIkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIDMyLWJpdCBMU0Igc2hhcmVkIG9iamVjdCcKLSAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBmaWxlX21hZ2ljX3Rlc3RfZmlsZT0vc2hsaWIvbGliYy5zbwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAotICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKLSAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCi0gIDs7Ci0KLWN5Z3dpbiogfCBtaW5ndyopCi0gIHZlcnNpb25fdHlwZT13aW5kb3dzCi0gIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgc2VkIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fS5kbGwgJGxpYm5hbWUuYScKLSAgZWxzZQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCBzZWQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9LmRsbCAkbGlibmFtZS5saWInCi0gIGZpCi0gIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlaSotaTM4Ni4qYXJjaGl0ZWN0dXJlOiBpMzg2JwotICBmaWxlX21hZ2ljX2NtZD0nb2JqZHVtcCAtZicKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgotICBzaGxpYnBhdGhfdmFyPVBBVEgKLSAgOzsKLQotZnJlZWJzZDEqKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotICAKLWZyZWVic2QqKQotICBvYmpmb3JtYXQ9YHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0ICYmIC91c3IvYmluL29iamZvcm1hdCB8fCBlY2hvIGFvdXRgCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKLSAgY2FzZSAiJHZlcnNpb25fdHlwZSIgaW4KLSAgICBmcmVlYnNkLWVsZiopCi0gICAgICBkZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiBzaGFyZWQgb2JqZWN0JwotICAgICAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICAgICAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zbypgCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAkbGlibmFtZS5zbycKLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIGZyZWVic2QtKikKLSAgICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICRsaWJuYW1lLnNvJHZlcnN1ZmZpeCcKLSAgICAgIG5lZWRfdmVyc2lvbj15ZXMKLSAgICAgIDs7Ci0gIGVzYWMKLSAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi9zYmluIiBPQkpGT1JNQVQ9IiciJG9iamZvcm1hdCInIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1nbnUqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbycKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KLSAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNsJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbCRtYWpvciAkbGlibmFtZS5zbCcKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNsJG1ham9yJwotICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCi0gIDs7Ci0KLWlyaXg1KikKLSAgdmVyc2lvbl90eXBlPWlyaXgKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAkbGlibmFtZS5zbycKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGIDMyLWJpdCBNU0IgZHluYW1pYyBsaWIgTUlQUyAtIHZlcnNpb24gMSIgIyBvciBzaG91bGQgaXQgYmUgcGFzc19hbGw/Ci0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL2xpYi9saWJjLnNvKmAKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIDs7Ci0KLWlyaXg2KikKLSAgdmVyc2lvbl90eXBlPWlyaXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28nCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICRsaWJuYW1lLnNvJwotICBjYXNlICIkTEQiIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKLSAgKi0zMnwqIi0zMiAiKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7Ci0gICotbjMyfCoiLW4zMiAiKSBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKLSAgKi02NHwqIi02NCAiKSBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OwotICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgIyBldmVuIHRob3VnaCAvdXNyL2xvY2FsL2xpYiBpcyBhbHdheXMgc2VhcmNoZWQsIHRoZSBtYW4tcGFnZSBzYXlzCi0gICMgc2hhcmVkIGxpYnJhcmllcyBzaG91bGQgbm90IGJlIGluc3RhbGxlZCB0aGVyZSBpZiB0aGV5IHVzZSBhbiBBQkkKLSAgIyBkaWZmZXJlbnQgZnJvbSAtMzIsIHNvIHdlJ2QgYmV0dGVyIG5vdCBzZWFyY2ggZm9yIHNoYXJlZCBsaWJyYXJpZXMKLSAgIyB0aGVyZSBlaXRoZXIKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliJHtsaWJzdWZmfSAvdXNyL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiR7bGlic3VmZn0gL3Vzci9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKLSAgZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGICR7bGlibWFnaWN9IE1TQiBtaXBzLVsxMjM0XSBkeW5hbWljIGxpYiBNSVBTIC0gdmVyc2lvbiAxIiAjIG9yIHNob3VsZCBpdCBiZSBwYXNzX2FsbD8KLSAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBmaWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvbGliJHtsaWJzdWZmfS9saWJjLnNvKmAKLSAgOzsKLQotIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgotbGludXgtZ251b2xkbGQqIHwgbGludXgtZ251YW91dCogfCBsaW51eC1nbnVjb2ZmKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgtZ251KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIgKScKLSAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBmaWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvbGliL2xpYmMuc28qIC9saWIvbGliYy0qLnNvYAotCi0gIGlmIHRlc3QgLWYgL2xpYi9sZC5zby4xOyB0aGVuCi0gICAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKLSAgZWxzZQotICAgICMgT25seSB0aGUgR05VIGxkLnNvIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMgb24gTWtMaW51eC4KLSAgICBjYXNlICIkaG9zdF9jcHUiIGluCi0gICAgcG93ZXJwYyopIGR5bmFtaWNfbGlua2VyPW5vIDs7Ci0gICAgKikgZHluYW1pY19saW5rZXI9J0xpbnV4IGxkLnNvJyA7OwotICAgIGVzYWMKLSAgZmkKLSAgOzsKLQotbmV0YnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9LnNvJHZlcnN1ZmZpeCcKLSAgICBmaW5pc2hfY21kcz0nUEFUSD0iJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJwotICBlbHNlCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJHtsaWJuYW1lfS5zbycKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCi0gIGZpCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLW9wZW5ic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgIG5lZWRfdmVyc2lvbj1ubwotICBmaQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9LnNvJHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotb3MyKikKLSAgbGlibmFtZV9zcGVjPSckbmFtZScKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsICRsaWJuYW1lLmEnCi0gIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCopCi0gIHZlcnNpb25fdHlwZT1vc2YKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAkbGlibmFtZS5zbycKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgIyBkZXBsaWJzX2NoZWNrX21ldGhvZD0ncGFzc19hbGwnCi0gICMgQWx0aG91Z2ggcGFzc19hbGwgYXBwZWFycyB0byB3b3JrLCBpdCBjb3BpZXMgc3ltYm9scyBmcm9tIHN0YXRpYyBsaWJyYXJpZXMKLSAgIyBpbnRvIHNoYXJlZCBvbmVzIGFuZCBleHBvcnRzIHRoZW0uICBTbywgd2hlbiBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggdHdvCi0gICMgb3IgbW9yZSBsaWJyYXJpZXMgdGhhdCBoYXZlIGdvdCBjb3BpZXMgb2YgdGhlIHNhbWUgc3ltYm9scywgbGluayBmYWlscwotICAjIFRoaXMgd2FzIG9ubHkgdGVzdGVkIG9uIG9zZjQ6Ci0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIENPRkYgZm9ybWF0IGFscGhhIHNoYXJlZCBsaWJyYXJ5JwotICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgotICA7OwotCi1zY28zLjJ2NSopCi0gIHZlcnNpb25fdHlwZT1vc2YKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotc29sYXJpcyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKLSAgZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0tYml0IFtMTV1TQiBkeW5hbWljIGxpYiIKLSAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBmaWxlX21hZ2ljX3Rlc3RfZmlsZT0vbGliL2xpYmMuc28KLSAgOzsKLQotc3Vub3M0KikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0uc28kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgZmkKLSAgbmVlZF92ZXJzaW9uPXllcwotICA7OwotCi1zeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAiJGhvc3RfdmVuZG9yIiBpbgotICAgIG5jcikKLSAgICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdwYXNzX2FsbCcKLSAgICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotdXRzNCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1kZ3V4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLWVzYWMKLWVjaG8gIiRhY190JGR5bmFtaWNfbGlua2VyIiAxPiY2Ci10ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi0jIFJlcG9ydCB0aGUgZmluYWwgY29uc2VxdWVuY2VzLgotZWNobyAiY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRjYW5fYnVpbGRfc2hhcmVkIiAxPiY2Ci0KLWlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSIgJiYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfY21kIjsgdGhlbgotICBjYXNlICIkZGVwbGlic19jaGVja19tZXRob2QiIGluCi0gICJmaWxlX21hZ2ljICIqKQotICAgIGZpbGVfbWFnaWNfcmVnZXg9ImBleHByIFwiJGRlcGxpYnNfY2hlY2tfbWV0aG9kXCIgOiBcImZpbGVfbWFnaWMgXCguKlwpXCJgIgotICAgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKLSAgICAgICBlZ3JlcCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICA6Ci0gICAgZWxzZQotICAgICAgY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKLSoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KLSoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcwotKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0Ci0qKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKLSoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKLSoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KLSoqKiBidWctbGlidG9vbEBnbnUub3JnCi0KLUVPRgotICAgIGZpIDs7Ci0gIGVzYWMKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4uLiAkYWNfYyIgMT4mNgotdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCi0KLSMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAotIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgzKikKLSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCi0gICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJwotICBmaQotICA7OwotCi1haXg0KikKLSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgOzsKLWVzYWMKLQotZWNobyAiJGFjX3QkZW5hYmxlX3NoYXJlZCIgMT4mNgotCi0jIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcwotCi1lY2hvICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuLi4gJGVuYWJsZV9zdGF0aWMiIDE+JjYKLQotaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KLSAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLWVsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKLSAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KLSAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5Ci0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvYmpkaXIuLi4gJGFjX2MiIDE+JjYKLXJtIC1mIC5saWJzIDI+L2Rldi9udWxsCi1ta2RpciAubGlicyAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAubGliczsgdGhlbgotICBvYmpkaXI9LmxpYnMKLWVsc2UKLSAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KLSAgb2JqZGlyPV9saWJzCi1maQotcm1kaXIgLmxpYnMgMj4vZGV2L251bGwKLWVjaG8gIiRhY190JG9iamRpciIgMT4mNgotCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KLSAgZW5hYmxlX2Rsb3Blbj11bmtub3duCi0gIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCi0gIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgotZWxzZQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2Rsb3Blbicrc2V0fSdgXCIgIT0gc2V0IjsgdGhlbgotICBsdF9jdl9kbG9wZW49bm8gbHRfY3ZfZGxvcGVuX2xpYnM9Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZGxvcGVuIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gIiRwcm9nbmFtZToxOTc3OiBjaGVja2luZyBmb3IgZGxvcGVuIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2Rsb3Blbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE5ODIgImx0Y29uZmlnIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgZGxvcGVuKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgZGxvcGVuKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfZGxvcGVuKSB8fCBkZWZpbmVkIChfX3N0dWJfX19kbG9wZW4pCi1jaG9rZSBtZQotI2Vsc2UKLWRsb3BlbigpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMDA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX2Rsb3Blbj15ZXMiCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfZGxvcGVuPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nZGxvcGVuYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjAyMjogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gZGwnXydkbG9wZW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sZGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjAzMCAibHRjb25maWciCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGRsb3BlbigpOwotCi1pbnQgbWFpbigpIHsKLWRsb3BlbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjA0MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjA1OTogY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gZGxkJ18nZGxkX2xpbmsgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sZGxkICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwNjcgImx0Y29uZmlnIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBkbGRfbGluaygpOwotCi1pbnQgbWFpbigpIHsKLWRsZF9saW5rKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMDc3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBsdF9jdl9kbG9wZW49ImRsZF9saW5rIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNobF9sb2FkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gIiRwcm9nbmFtZToyMDk2OiBjaGVja2luZyBmb3Igc2hsX2xvYWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfc2hsX2xvYWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTAxICJsdGNvbmZpZyIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHNobF9sb2FkKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgc2hsX2xvYWQoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl9zaGxfbG9hZCkgfHwgZGVmaW5lZCAoX19zdHViX19fc2hsX2xvYWQpCi1jaG9rZSBtZQotI2Vsc2UKLXNobF9sb2FkKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIxMjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfc2hsX2xvYWQ9eWVzIgotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX3NobF9sb2FkPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nc2hsX2xvYWRgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3IgTG9hZExpYnJhcnkiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIxNDE6IGNoZWNraW5nIGZvciBMb2FkTGlicmFyeSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19Mb2FkTGlicmFyeScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxNDYgImx0Y29uZmlnIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgTG9hZExpYnJhcnkoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBMb2FkTGlicmFyeSgpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViX0xvYWRMaWJyYXJ5KSB8fCBkZWZpbmVkIChfX3N0dWJfX19Mb2FkTGlicmFyeSkKLWNob2tlIG1lCi0jZWxzZQotTG9hZExpYnJhcnkoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjE2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY19Mb2FkTGlicmFyeT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfTG9hZExpYnJhcnk9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXydMb2FkTGlicmFyeWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBsdF9jdl9kbG9wZW49IkxvYWRMaWJyYXJ5IgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgIAotZmkKLQotICAgIAotZmkKLQotICAKLWZpCi0KLQotZmkKLQotZmkKLQotICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3BlbiIgIT0geG5vOyB0aGVuCi0gICAgZW5hYmxlX2Rsb3Blbj15ZXMKLSAgZmkKLQotICBjYXNlICIkbHRfY3ZfZGxvcGVuIiBpbgotICBkbG9wZW4pCi1mb3IgYWNfaGRyIGluIGRsZmNuLmg7IGRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gIiRwcm9nbmFtZToyMjEwOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIxNSAibHRjb25maWciCi0jaW5jbHVkZSA8JGFjX2hkcj4KLWludCBmbm9yZCA9IDA7Ci1FT0YKLWFjX3RyeT0iJGFjX2NvbXBpbGUgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMjIwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICAgaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzOyB0aGVuCi0gICAgICBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgotICAgIGZpCi0gICAgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgotICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKLQotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjI0ODogY2hlY2tpbmcgd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQotaWYgdGVzdCAiJHtsdF9jdl9kbG9wZW5fc2VsZitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICAgIGx0X2N2X2Rsb3Blbl9zZWxmPWNyb3NzCi0gIGVsc2UKLSAgICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jbGluZSAyMjU2ICJsdGNvbmZpZyIKLQotI2lmIEhBVkVfRExGQ05fSAotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBSVExEX0dMT0JBTAotIyBkZWZpbmUgTFRETF9HTE9CQUwJUlRMRF9HTE9CQUwKLSNlbHNlCi0jIGlmZGVmIERMX0dMT0JBTAotIyAgZGVmaW5lIExURExfR0xPQkFMCURMX0dMT0JBTAotIyBlbHNlCi0jICBkZWZpbmUgTFRETF9HTE9CQUwJMAotIyBlbmRpZgotI2VuZGlmCi0KLS8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVERMX0xBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKLSAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KLSNpZm5kZWYgTFRETF9MQVpZX09SX05PVwotIyBpZmRlZiBSVExEX0xBWlkKLSMgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCVJUTERfTEFaWQotIyBlbHNlCi0jICBpZmRlZiBETF9MQVpZCi0jICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJRExfTEFaWQotIyAgZWxzZQotIyAgIGlmZGVmIFJUTERfTk9XCi0jICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCVJUTERfTk9XCi0jICAgZWxzZQotIyAgICBpZmRlZiBETF9OT1cKLSMgICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCURMX05PVwotIyAgICBlbHNlCi0jICAgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwkwCi0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotZm5vcmQoKSB7IGludCBpPTQyO30KLW1haW4oKSB7IHZvaWQgKnNlbGYsICpwdHIxLCAqcHRyMjsgc2VsZj1kbG9wZW4oMCxMVERMX0dMT0JBTHxMVERMX0xBWllfT1JfTk9XKTsKLSAgICBpZihzZWxmKSB7IHB0cjE9ZGxzeW0oc2VsZiwiZm5vcmQiKTsgcHRyMj1kbHN5bShzZWxmLCJfZm5vcmQiKTsKLQkgICAgICAgaWYocHRyMSB8fCBwdHIyKSBleGl0KDApOyB9IGV4aXQoMSk7IH0gCi0KLUVPRgotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMzAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGx0X2N2X2Rsb3Blbl9zZWxmPXllcwotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBsdF9jdl9kbG9wZW5fc2VsZj1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkbHRfY3ZfZGxvcGVuX3NlbGYiIDE+JjYKLQotICBpZiB0ZXN0ICIkbHRfY3ZfZGxvcGVuX3NlbGYiID0geWVzOyB0aGVuCi0gICAgTERGTEFHUz0iJExERkxBR1MgJGxpbmtfc3RhdGljX2ZsYWciCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gIiRwcm9nbmFtZToyMzIxOiBjaGVja2luZyB3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1Ci1pZiB0ZXN0ICIke2x0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1jcm9zcwotICBlbHNlCi0gICAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2xpbmUgMjMyOSAibHRjb25maWciCi0KLSNpZiBIQVZFX0RMRkNOX0gKLSNpbmNsdWRlIDxkbGZjbi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgUlRMRF9HTE9CQUwKLSMgZGVmaW5lIExURExfR0xPQkFMCVJUTERfR0xPQkFMCi0jZWxzZQotIyBpZmRlZiBETF9HTE9CQUwKLSMgIGRlZmluZSBMVERMX0dMT0JBTAlETF9HTE9CQUwKLSMgZWxzZQotIyAgZGVmaW5lIExURExfR0xPQkFMCTAKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRETF9MQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCi0gICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCi0jaWZuZGVmIExURExfTEFaWV9PUl9OT1cKLSMgaWZkZWYgUlRMRF9MQVpZCi0jICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlSVExEX0xBWlkKLSMgZWxzZQotIyAgaWZkZWYgRExfTEFaWQotIyAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCURMX0xBWlkKLSMgIGVsc2UKLSMgICBpZmRlZiBSVExEX05PVwotIyAgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlSVExEX05PVwotIyAgIGVsc2UKLSMgICAgaWZkZWYgRExfTk9XCi0jICAgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlETF9OT1cKLSMgICAgZWxzZQotIyAgICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJMAotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWZub3JkKCkgeyBpbnQgaT00Mjt9Ci1tYWluKCkgeyB2b2lkICpzZWxmLCAqcHRyMSwgKnB0cjI7IHNlbGY9ZGxvcGVuKDAsTFRETF9HTE9CQUx8TFRETF9MQVpZX09SX05PVyk7Ci0gICAgaWYoc2VsZikgeyBwdHIxPWRsc3ltKHNlbGYsImZub3JkIik7IHB0cjI9ZGxzeW0oc2VsZiwiX2Zub3JkIik7Ci0gICAgaWYocHRyMSB8fCBwdHIyKSBleGl0KDApOyB9IGV4aXQoMSk7IH0gCi0KLUVPRgotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMzc1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMiIDE+JjYKLWZpCi0gICAgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRsdF9jdl9kbG9wZW5fc2VsZiIgaW4KLSAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7Ci0gICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiBpbgotICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9JGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyA7OwotICAqKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24gOzsKLSAgZXNhYwotZmkKLQotIyBDb3B5IGVjaG8gYW5kIHF1b3RlIHRoZSBjb3B5LCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCwgYmVjYXVzZSBpdCBpcwotIyB1c2VkIGxhdGVyLgotbHRlY2hvPSIkZWNobyIKLWlmIHRlc3QgIlgkbHRlY2hvIiA9ICJYJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCi0gICBsdGVjaG89IiRDT05GSUdfU0hFTEwgXCQwIC0tZmFsbGJhY2stZWNobyIKLWZpCi1MVFNIRUxMPSIkU0hFTEwiCi0KLUxUQ09ORklHX1ZFUlNJT049IiRWRVJTSU9OIgotCi0jIE9ubHkgcXVvdGUgdmFyaWFibGVzIGlmIHdlJ3JlIHVzaW5nIGx0bWFpbi5zaC4KLWNhc2UgIiRsdG1haW4iIGluCi0qLnNoKQotICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzLgotICBmb3IgdmFyIGluIGx0ZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBvbGRfQ1BQRkxBR1Mgb2xkX0xEIG9sZF9OTSBvbGRfUkFOTElCIFwKLSAgICBvbGRfTE5fUyBvbGRfRExMVE9PTCBvbGRfQVMgQVIgQ0MgTEQgTE5fUyBOTSBMVFNIRUxMIExUQ09ORklHX1ZFUlNJT04gXAotICAgIHJlbG9hZF9mbGFnIHJlbG9hZF9jbWRzIHdsIFwKLSAgICBwaWNfZmxhZyBsaW5rX3N0YXRpY19mbGFnIG5vX2J1aWx0aW5fZmxhZyBleHBvcnRfZHluYW1pY19mbGFnX3NwZWMgXAotICAgIHRocmVhZF9zYWZlX2ZsYWdfc3BlYyB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyBsaWJuYW1lX3NwZWMgXAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBcCi0gICAgUkFOTElCIG9sZF9hcmNoaXZlX2NtZHMgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyBvbGRfcG9zdGluc3RhbGxfY21kcyBcCi0gICAgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBhcmNoaXZlX2NtZHMgYXJjaGl2ZV9leHBzeW1fY21kcyBwb3N0aW5zdGFsbF9jbWRzIHBvc3R1bmluc3RhbGxfY21kcyBcCi0gICAgZmlsZV9tYWdpY19jbWQgZXhwb3J0X3N5bWJvbHNfY21kcyBkZXBsaWJzX2NoZWNrX21ldGhvZCBhbGxvd191bmRlZmluZWRfZmxhZyBub191bmRlZmluZWRfZmxhZyBcCi0gICAgZmluaXNoX2NtZHMgZmluaXNoX2V2YWwgZ2xvYmFsX3N5bWJvbF9waXBlIGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wgXAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciAgXAotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCi0gICAgY29tcGlsZXJfY19vIGNvbXBpbGVyX29fbG8gbmVlZF9sb2NrcyBleGNsdWRlX2V4cHN5bXMgaW5jbHVkZV9leHBzeW1zOyBkbwotCi0gICAgY2FzZSAiJHZhciIgaW4KLSAgICByZWxvYWRfY21kcyB8IG9sZF9hcmNoaXZlX2NtZHMgfCBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIHwgXAotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBleHBvcnRfc3ltYm9sc19jbWRzIHwgYXJjaGl2ZV9jbWRzIHwgYXJjaGl2ZV9leHBzeW1fY21kcyB8IFwKLSAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIGZpbmlzaF9jbWRzIHwgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMpCi0gICAgICAjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCi0gICAgICBldmFsICIkdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkZG91YmxlX3F1b3RlX3N1YnN0XCIgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiIC1lIFwiXCRkZWxheV92YXJpYWJsZV9zdWJzdFwiXGBcXFwiIgotICAgICAgOzsKLSAgICAqKQotICAgICAgZXZhbCAiJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGBcXFwiIgotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICBjYXNlICIkbHRlY2hvIiBpbgotICAqJ1wkMCAtLWZhbGxiYWNrLWVjaG8iJykKLSAgICBsdGVjaG89YCRlY2hvICJYJGx0ZWNobyIgfCAkWHNlZCAtZSAncy9cXFxcXFxcJDAgLS1mYWxsYmFjay1lY2hvIiQvJDAgLS1mYWxsYmFjay1lY2hvIi8nYAotICAgIDs7Ci0gIGVzYWMKLQotICB0cmFwICIkcm0gXCIkb2ZpbGVcIjsgZXhpdCAxIiAxIDIgMTUKLSAgZWNobyAiY3JlYXRpbmcgJG9maWxlIgotICAkcm0gIiRvZmlsZSIKLSAgY2F0IDw8RU9GID4gIiRvZmlsZSIKLSMhICRTSEVMTAotCi0jIGAkZWNobyAiJG9maWxlIiB8IHNlZCAncyVeLiovJSUnYCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUCkKLSMgTk9URTogQ2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3Q6IGxvb2sgYXQgbHRjb25maWcgb3IgbHRtYWluLnNoLgotIwotIyBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbi4KLVhzZWQ9InNlZCAtZSBzL15YLy8iCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi1pZiB0ZXN0ICJcJHtDRFBBVEgrc2V0fSIgPSBzZXQ7IHRoZW4gQ0RQQVRIPTsgZXhwb3J0IENEUEFUSDsgZmkKLQotIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCi1FT0YKLSAgY2ZnZmlsZT0iJG9maWxlIgotICA7OwotCi0qKQotICAjIERvdWJsZS1xdW90ZSB0aGUgdmFyaWFibGVzIHRoYXQgbmVlZCBpdCAoZm9yIGFlc3RoZXRpY3MpLgotICBmb3IgdmFyIGluIG9sZF9DQyBvbGRfQ0ZMQUdTIG9sZF9DUFBGTEFHUyBvbGRfTEQgb2xkX05NIG9sZF9SQU5MSUIgXAotICAgIG9sZF9MTl9TIG9sZF9ETExUT09MIG9sZF9BUzsgZG8KLSAgICBldmFsICIkdmFyPVxcXCJcJHZhclxcXCIiCi0gIGRvbmUKLQotICAjIEp1c3QgY3JlYXRlIGEgY29uZmlnIGZpbGUuCi0gIGNmZ2ZpbGU9IiRvZmlsZS5jZmciCi0gIHRyYXAgIiRybSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1Ci0gIGVjaG8gImNyZWF0aW5nICRjZmdmaWxlIgotICAkcm0gIiRjZmdmaWxlIgotICBjYXQgPDxFT0YgPiAiJGNmZ2ZpbGUiCi0jIGAkZWNobyAiJGNmZ2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gTGlidG9vbCBjb25maWd1cmF0aW9uIGZpbGUuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QKQotRU9GCi0gIDs7Ci1lc2FjCi0KLWNhdCA8PEVPRiA+PiAiJGNmZ2ZpbGUiCi0jIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jIENDPSRvbGRfQ0MgQ0ZMQUdTPSRvbGRfQ0ZMQUdTIENQUEZMQUdTPSRvbGRfQ1BQRkxBR1MgXFwKLSMgTEQ9JG9sZF9MRCBOTT0kb2xkX05NIFJBTkxJQj0kb2xkX1JBTkxJQiBMTl9TPSRvbGRfTE5fUyBcXAotIyBETExUT09MPSIkb2xkX0RMTFRPT0wiIEFTPSIkb2xkX0FTIiBcXAotIyAgICQwJGx0Y29uZmlnX2FyZ3MKLSMKLSMgQ29tcGlsZXIgYW5kIG90aGVyIHRlc3Qgb3V0cHV0IHByb2R1Y2VkIGJ5ICRwcm9nbmFtZSwgdXNlZnVsIGZvcgotIyBkZWJ1Z2dpbmcgJHByb2duYW1lLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi0jIFRoZSB2ZXJzaW9uIG9mICRwcm9nbmFtZSB0aGF0IGdlbmVyYXRlZCB0aGlzIHNjcmlwdC4KLUxUQ09ORklHX1ZFUlNJT049JExUQ09ORklHX1ZFUlNJT04KLQotIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgotU0hFTEw9JExUU0hFTEwKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KLWJ1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCi0KLSMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgotZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCi0KLSMgVGhlIGhvc3Qgc3lzdGVtLgotaG9zdF9hbGlhcz0kaG9zdF9hbGlhcwotaG9zdD0kaG9zdAotCi0jIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KLWVjaG89JGx0ZWNobwotCi0jIFRoZSBhcmNoaXZlci4KLUFSPSRBUgotCi0jIFRoZSBkZWZhdWx0IEMgY29tcGlsZXIuCi1DQz0kQ0MKLQotIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgotTEQ9JExECi0KLSMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KLUxOX1M9JExOX1MKLQotIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCi1OTT0kTk0KLQotIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCi1ETExUT09MPSIkRExMVE9PTCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgotQVM9IiRBUyIKLQotIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCi1vYmpkaXI9JG9iamRpcgotCi0jIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCi1yZWxvYWRfZmxhZz0kcmVsb2FkX2ZsYWcKLXJlbG9hZF9jbWRzPSRyZWxvYWRfY21kcwotCi0jIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCi13bD0kd2wKLQotIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCi1vYmpleHQ9IiRvYmpleHQiCi0KLSMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgotbGliZXh0PSIkbGliZXh0IgotCi0jIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KLXBpY19mbGFnPSRwaWNfZmxhZwotCi0jIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucwotY29tcGlsZXJfY19vPSRjb21waWxlcl9jX28KLQotIyBDYW4gd2Ugd3JpdGUgZGlyZWN0bHkgdG8gYSAubG8gPwotY29tcGlsZXJfb19sbz0kY29tcGlsZXJfb19sbwotCi0jIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uID8KLW5lZWRfbG9ja3M9JG5lZWRfbG9ja3MKLQotIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPwotbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKLQotIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPwotbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KLQotIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCi1kbG9wZW49JGVuYWJsZV9kbG9wZW4KLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCi0KLSMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KLWxpbmtfc3RhdGljX2ZsYWc9JGxpbmtfc3RhdGljX2ZsYWcKLQotIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgotbm9fYnVpbHRpbl9mbGFnPSRub19idWlsdGluX2ZsYWcKLQotIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRleHBvcnRfZHluYW1pY19mbGFnX3NwZWMKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCi13aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMKLQotIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCi10aHJlYWRfc2FmZV9mbGFnX3NwZWM9JHRocmVhZF9zYWZlX2ZsYWdfc3BlYwotCi0jIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgotdmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKLQotIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KLWxpYm5hbWVfc3BlYz0kbGlibmFtZV9zcGVjCi0KLSMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KLSMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KLWxpYnJhcnlfbmFtZXNfc3BlYz0kbGlicmFyeV9uYW1lc19zcGVjCi0KLSMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCi1zb25hbWVfc3BlYz0kc29uYW1lX3NwZWMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgotUkFOTElCPSRSQU5MSUIKLW9sZF9hcmNoaXZlX2NtZHM9JG9sZF9hcmNoaXZlX2NtZHMKLW9sZF9wb3N0aW5zdGFsbF9jbWRzPSRvbGRfcG9zdGluc3RhbGxfY21kcwotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kb2xkX3Bvc3R1bmluc3RhbGxfY21kcwotCi0jIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCi1vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgotYXJjaGl2ZV9jbWRzPSRhcmNoaXZlX2NtZHMKLWFyY2hpdmVfZXhwc3ltX2NtZHM9JGFyY2hpdmVfZXhwc3ltX2NtZHMKLXBvc3RpbnN0YWxsX2NtZHM9JHBvc3RpbnN0YWxsX2NtZHMKLXBvc3R1bmluc3RhbGxfY21kcz0kcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCi1kZXBsaWJzX2NoZWNrX21ldGhvZD0kZGVwbGlic19jaGVja19tZXRob2QKLQotIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMKLWZpbGVfbWFnaWNfY21kPSRmaWxlX21hZ2ljX2NtZAotCi0jIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgotYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnCi0KLSMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KLW5vX3VuZGVmaW5lZF9mbGFnPSRub191bmRlZmluZWRfZmxhZwotCi0jIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KLWZpbmlzaF9jbWRzPSRmaW5pc2hfY21kcwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCi1maW5pc2hfZXZhbD0kZmluaXNoX2V2YWwKLQotIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgotZ2xvYmFsX3N5bWJvbF9waXBlPSRnbG9iYWxfc3ltYm9sX3BpcGUKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgotcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KLXNobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKLQotIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAotCi0jIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgotaGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb24KLQotIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCi0jIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjCi0KLSMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCi1oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRS5zbyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdAotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfbWludXNfTD0kaGFyZGNvZGVfbWludXNfTAotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCi0jIHRoZSByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3ZhcgotCi0jIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLQotIyBSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCi0KLSMgRml4IHRoZSBzaGVsbCB2YXJpYWJsZSBcJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlci4KLWZpeF9zcmNmaWxlX3BhdGg9IiRmaXhfc3JjZmlsZV9wYXRoIgotCi0jIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQKLWFsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzCi0KLSMgVGhlIGNvbW1hbmQgdG8gZXh0cmFjdCBleHBvcnRlZCBzeW1ib2xzCi1leHBvcnRfc3ltYm9sc19jbWRzPSRleHBvcnRfc3ltYm9sc19jbWRzCi0KLSMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scwotZXhjbHVkZV9leHBzeW1zPSRleGNsdWRlX2V4cHN5bXMKLQotIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQKLWluY2x1ZGVfZXhwc3ltcz0kaW5jbHVkZV9leHBzeW1zCi0KLUVPRgotCi1jYXNlICIkbHRtYWluIiBpbgotKi5zaCkKLSAgZWNobyAnIyMjIEVORCBMSUJUT09MIENPTkZJRycgPj4gIiRvZmlsZSIKLSAgZWNobyA+PiAiJG9maWxlIgotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgYWl4MyopCi0gICAgY2F0IDw8XEVPRiA+PiAiJG9maWxlIgotCi0jIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKLSMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcwotIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotaWYgdGVzdCAiJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IHNldDsgdGhlbgotICBDT0xMRUNUX05BTUVTPQotICBleHBvcnQgQ09MTEVDVF9OQU1FUwotZmkKLUVPRgotICAgIDs7Ci0gIGVzYWMKLQotICAjIEFwcGVuZCB0aGUgbHRtYWluLnNoIHNjcmlwdC4KLSAgY2F0ICIkbHRtYWluIiA+PiAiJG9maWxlIiB8fCAocm0gLWYgIiRvZmlsZSI7IGV4aXQgMSkKLQotICBjaG1vZCAreCAiJG9maWxlIgotICA7OwotCi0qKQotICAjIENvbXBpbGUgdGhlIGxpYnRvb2wgcHJvZ3JhbS4KLSAgZWNobyAiRklYTUU6IHdvdWxkIGNvbXBpbGUgJGx0bWFpbiIKLSAgOzsKLWVzYWMKLQotdGVzdCAtbiAiJGNhY2hlX2ZpbGUiIHx8IGV4aXQgMAotCi0jIEFDX0NBQ0hFX1NBVkUKLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi1leGl0IDAKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6c2hlbGwtc2NyaXB0Ci0jIHNoLWluZGVudGF0aW9uOjIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvbHRtYWluLnNoIGIvbHRtYWluLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzg3ODdhLi4wMDAwMDAwCi0tLSBhL2x0bWFpbi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ODIgKzAsMCBAQAotIyBsdG1haW4uc2ggLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLSMgTk9URTogQ2hhbmdpbmcgdGhpcyBmaWxlIHdpbGwgbm90IGFmZmVjdCBhbnl0aGluZyB1bnRpbCB5b3UgcmVydW4gbHRjb25maWcuCi0jCi0jIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIENoZWNrIHRoYXQgd2UgaGF2ZSBhIHdvcmtpbmcgJGVjaG8uCi1pZiB0ZXN0ICJYJDEiID0gWC0tbm8tcmVleGVjOyB0aGVuCi0gICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgotICBzaGlmdAotZWxpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobwotICBzaGlmdAotICBjYXQgPDxFT0YKLSQqCi1FT0YKLSAgZXhpdCAwCi1lbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgotICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCi0gIDoKLWVsc2UKLSAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSAkZWNobyB3aWxsIHdvcmsuCi0gIGV4ZWMgJFNIRUxMICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9Ci1maQotCi0jIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbS4KLXByb2duYW1lPWAkZWNobyAiJDAiIHwgc2VkICdzJV4uKi8lJSdgCi1tb2RlbmFtZT0iJHByb2duYW1lIgotCi0jIENvbnN0YW50cy4KLVBST0dSQU09bHRtYWluLnNoCi1QQUNLQUdFPWxpYnRvb2wKLVZFUlNJT049MS4yZgotVElNRVNUQU1QPSIgKDEuMzMgMTk5OS8wNC8yNiAxNjoyODo1MykiCi0KLWRlZmF1bHRfbW9kZT0KLWhlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLW1hZ2ljPSIlJSVNQUdJQyB2YXJpYWJsZSUlJSIKLW1rZGlyPSJta2RpciIKLW12PSJtdiAtZiIKLXJtPSJybSAtZiIKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9J3NlZCAtZSAxcy9eWC8vJwotc2VkX3F1b3RlX3N1YnN0PSdzL1woW1xcYFxcIiRcXFxcXVwpL1xcXDEvZycKLVNQMk5MPSd0ciBcMDQwIFwwMTInCi1OTDJTUD0ndHIgXDAxMiBcMDQwJwotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IExBTkcgYW5kIExDX0FMTCB0byBDIGlmIGFscmVhZHkgc2V0LgotIyBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5IGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQKLSMgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgV2Ugc2F2ZSB0aGUgb2xkIHZhbHVlcyB0byByZXN0b3JlIGR1cmluZyBleGVjdXRlIG1vZGUuCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbgotICBzYXZlX0xDX0FMTD0iJExDX0FMTCI7IExDX0FMTD1DOyBleHBvcnQgTENfQUxMCi1maQotaWYgdGVzdCAiJHtMQU5HK3NldH0iID0gc2V0OyB0aGVuCi0gIHNhdmVfTEFORz0iJExBTkciOyBMQU5HPUM7IGV4cG9ydCBMQU5HCi1maQotCi1pZiB0ZXN0ICIkTFRDT05GSUdfVkVSU0lPTiIgIT0gIiRWRVJTSU9OIjsgdGhlbgotICBlY2hvICIkbW9kZW5hbWU6IGx0Y29uZmlnIHZlcnNpb24gXGAkTFRDT05GSUdfVkVSU0lPTicgZG9lcyBub3QgbWF0Y2ggJFBST0dSQU0gdmVyc2lvbiBcYCRWRVJTSU9OJyIgMT4mMgotICBlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgotICBleGl0IDEKLWZpCi0KLWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllcyAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiICE9IHllczsgdGhlbgotICBlY2hvICIkbW9kZW5hbWU6IG5vdCBjb25maWd1cmVkIHRvIGJ1aWxkIGFueSBraW5kIG9mIGxpYnJhcnkiIDE+JjIKLSAgZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLSAgZXhpdCAxCi1maQotCi0jIEdsb2JhbCB2YXJpYWJsZXMuCi1tb2RlPSRkZWZhdWx0X21vZGUKLW5vbm9wdD0KLXByZXY9Ci1wcmV2b3B0PQotcnVuPQotc2hvdz0iJGVjaG8iCi1zaG93X2hlbHA9Ci1leGVjdXRlX2RsZmlsZXM9Ci1sbzJvPSJzL1xcLmxvXCQvLiR7b2JqZXh0fS8iCi0KLSMgUGFyc2Ugb3VyIGNvbW1hbmQgbGluZSBvcHRpb25zIG9uY2UsIHRob3JvdWdobHkuCi13aGlsZSB0ZXN0ICQjIC1ndCAwCi1kbwotICBhcmc9IiQxIgotICBzaGlmdAotCi0gIGNhc2UgIiRhcmciIGluCi0gIC0qPSopIG9wdGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgIGNhc2UgIiRwcmV2IiBpbgotICAgIGV4ZWN1dGVfZGxmaWxlcykKLSAgICAgIGV2YWwgIiRwcmV2PVwiXCQkcHJldiBcJGFyZ1wiIgotICAgICAgOzsKLSAgICAqKQotICAgICAgZXZhbCAiJHByZXY9XCRhcmciCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIHByZXY9Ci0gICAgcHJldm9wdD0KLSAgICBjb250aW51ZQotICBmaQotCi0gICMgSGF2ZSB3ZSBzZWVuIGEgbm9uLW9wdGlvbmFsIGFyZ3VtZW50IHlldD8KLSAgY2FzZSAiJGFyZyIgaW4KLSAgLS1oZWxwKQotICAgIHNob3dfaGVscD15ZXMKLSAgICA7OwotCi0gIC0tdmVyc2lvbikKLSAgICBlY2hvICIkUFJPR1JBTSAoR05VICRQQUNLQUdFKSAkVkVSU0lPTiRUSU1FU1RBTVAiCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAtLWNvbmZpZykKLSAgICBzZWQgLWUgJzEsL14jIyMgQkVHSU4gTElCVE9PTCBDT05GSUcvZCcgLWUgJy9eIyMjIEVORCBMSUJUT09MIENPTkZJRy8sJGQnICQwCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAtLWRlYnVnKQotICAgIGVjaG8gIiRwcm9nbmFtZTogZW5hYmxpbmcgc2hlbGwgdHJhY2UgbW9kZSIKLSAgICBzZXQgLXgKLSAgICA7OwotCi0gIC0tZHJ5LXJ1biB8IC1uKQotICAgIHJ1bj06Ci0gICAgOzsKLQotICAtLWZlYXR1cmVzKQotICAgIGVjaG8gImhvc3Q6ICRob3N0IgotICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICBlY2hvICJlbmFibGUgc2hhcmVkIGxpYnJhcmllcyIKLSAgICBlbHNlCi0gICAgICBlY2hvICJkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMiCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICBlY2hvICJlbmFibGUgc3RhdGljIGxpYnJhcmllcyIKLSAgICBlbHNlCi0gICAgICBlY2hvICJkaXNhYmxlIHN0YXRpYyBsaWJyYXJpZXMiCi0gICAgZmkKLSAgICBleGl0IDAKLSAgICA7OwotCi0gIC0tZmluaXNoKSBtb2RlPSJmaW5pc2giIDs7Ci0KLSAgLS1tb2RlKSBwcmV2b3B0PSItLW1vZGUiIHByZXY9bW9kZSA7OwotICAtLW1vZGU9KikgbW9kZT0iJG9wdGFyZyIgOzsKLQotICAtLXF1aWV0IHwgLS1zaWxlbnQpCi0gICAgc2hvdz06Ci0gICAgOzsKLQotICAtZGxvcGVuKQotICAgIHByZXZvcHQ9Ii1kbG9wZW4iCi0gICAgcHJldj1leGVjdXRlX2RsZmlsZXMKLSAgICA7OwotCi0gIC0qKQotICAgICRlY2hvICIkbW9kZW5hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAkYXJnJyIgMT4mMgotICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgIGV4aXQgMQotICAgIDs7Ci0KLSAgKikKLSAgICBub25vcHQ9IiRhcmciCi0gICAgYnJlYWsKLSAgICA7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRwcmV2b3B0IjsgdGhlbgotICAkZWNobyAiJG1vZGVuYW1lOiBvcHRpb24gXGAkcHJldm9wdCcgcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKLSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotaWYgdGVzdCAteiAiJHNob3dfaGVscCI7IHRoZW4KLQotICAjIEluZmVyIHRoZSBvcGVyYXRpb24gbW9kZS4KLSAgaWYgdGVzdCAteiAiJG1vZGUiOyB0aGVuCi0gICAgY2FzZSAiJG5vbm9wdCIgaW4KLSAgICAqY2MgfCAqKysgfCBnY2MqIHwgKi1nY2MqKQotICAgICAgbW9kZT1saW5rCi0gICAgICBmb3IgYXJnCi0gICAgICBkbwotCWNhc2UgIiRhcmciIGluCi0JLWMpCi0JICAgbW9kZT1jb21waWxlCi0JICAgYnJlYWsKLQkgICA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgKmRiIHwgKmRieCB8ICpzdHJhY2UgfCAqdHJ1c3MpCi0gICAgICBtb2RlPWV4ZWN1dGUKLSAgICAgIDs7Ci0gICAgKmluc3RhbGwqfGNwfG12KQotICAgICAgbW9kZT1pbnN0YWxsCi0gICAgICA7OwotICAgICpybSkKLSAgICAgIG1vZGU9dW5pbnN0YWxsCi0gICAgICA7OwotICAgICopCi0gICAgICAjIElmIHdlIGhhdmUgbm8gbW9kZSwgYnV0IGRsZmlsZXMgd2VyZSBzcGVjaWZpZWQsIHRoZW4gZG8gZXhlY3V0ZSBtb2RlLgotICAgICAgdGVzdCAtbiAiJGV4ZWN1dGVfZGxmaWxlcyIgJiYgbW9kZT1leGVjdXRlCi0KLSAgICAgICMgSnVzdCB1c2UgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIG1vZGUuCi0gICAgICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkbm9ub3B0IjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGluZmVyIG9wZXJhdGlvbiBtb2RlIGZyb20gXGAkbm9ub3B0JyIgMT4mMgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBpbmZlciBvcGVyYXRpb24gbW9kZSB3aXRob3V0IE1PREUtQVJHUyIgMT4mMgotCWZpCi0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0KLSAgIyBPbmx5IGV4ZWN1dGUgbW9kZSBpcyBhbGxvd2VkIHRvIGhhdmUgLWRsb3BlbiBmbGFncy4KLSAgaWYgdGVzdCAtbiAiJGV4ZWN1dGVfZGxmaWxlcyIgJiYgdGVzdCAiJG1vZGUiICE9IGV4ZWN1dGU7IHRoZW4KLSAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgLWRsb3BlbiciIDE+JjIKLSAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLQotICAjIENoYW5nZSB0aGUgaGVscCBtZXNzYWdlIHRvIGEgbW9kZS1zcGVjaWZpYyBvbmUuCi0gIGdlbmVyaWNfaGVscD0iJGhlbHAiCi0gIGhlbHA9IlRyeSBcYCRtb2RlbmFtZSAtLWhlbHAgLS1tb2RlPSRtb2RlJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSAgIyBUaGVzZSBtb2RlcyBhcmUgaW4gb3JkZXIgb2YgZXhlY3V0aW9uIGZyZXF1ZW5jeSBzbyB0aGF0IHRoZXkgcnVuIHF1aWNrbHkuCi0gIGNhc2UgIiRtb2RlIiBpbgotICAjIGxpYnRvb2wgY29tcGlsZSBtb2RlCi0gIGNvbXBpbGUpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogY29tcGlsZSIKLSAgICAjIEdldCB0aGUgY29tcGlsYXRpb24gY29tbWFuZCBhbmQgdGhlIHNvdXJjZSBmaWxlLgotICAgIGJhc2VfY29tcGlsZT0KLSAgICBsYXN0YXJnPQotICAgIHNyY2ZpbGU9IiRub25vcHQiCi0gICAgc3VwcHJlc3Nfb3V0cHV0PQotCi0gICAgdXNlcl90YXJnZXQ9bm8KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgICMgQWNjZXB0IGFueSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KLSAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAtbykKLQlpZiB0ZXN0ICIkdXNlcl90YXJnZXQiICE9ICJubyI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBjYW5ub3Qgc3BlY2lmeSBcYC1vJyBtb3JlIHRoYW4gb25jZSIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQl1c2VyX3RhcmdldD1uZXh0Ci0JOzsKLQotICAgICAgLXN0YXRpYykKLQlidWlsZF9vbGRfbGlicz15ZXMKLQljb250aW51ZQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgIGNhc2UgIiR1c2VyX3RhcmdldCIgaW4KLSAgICAgIG5leHQpCi0JIyBUaGUgbmV4dCBvbmUgaXMgdGhlIC1vIHRhcmdldCBuYW1lCi0JdXNlcl90YXJnZXQ9eWVzCi0JY29udGludWUKLQk7OwotICAgICAgeWVzKQotCSMgV2UgZ290IHRoZSBvdXRwdXQgZmlsZQotCXVzZXJfdGFyZ2V0PXNldAotCWxpYm9iaj0iJGFyZyIKLQljb250aW51ZQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgQWNjZXB0IHRoZSBjdXJyZW50IGFyZ3VtZW50IGFzIHRoZSBzb3VyY2UgZmlsZS4KLSAgICAgIGxhc3Rhcmc9IiRzcmNmaWxlIgotICAgICAgc3JjZmlsZT0iJGFyZyIKLQotICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBwcmV2aW91cyBhcmd1bWVudC4KLQotICAgICAgIyBCYWNrc2xhc2hpZnkgYW55IGJhY2tzbGFzaGVzLCBkb3VibGUgcXVvdGVzLCBhbmQgZG9sbGFyIHNpZ25zLgotICAgICAgIyBUaGVzZSBhcmUgdGhlIG9ubHkgY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBzcGVjaWFsbHkKLSAgICAgICMgaW50ZXJwcmV0ZWQgaW5zaWRlIG9mIGRvdWJsZS1xdW90ZWQgc2NyaW5ncy4KLSAgICAgIGxhc3Rhcmc9YCRlY2hvICJYJGxhc3RhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCi0gICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi0gICAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseSBpbiBzY2FuCi0gICAgICAjIHNldHMsIHNvIHdlIHNwZWNpZnkgaXQgc2VwYXJhdGVseS4KLSAgICAgIGNhc2UgIiRsYXN0YXJnIiBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0JbGFzdGFyZz0iXCIkbGFzdGFyZ1wiIgotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgQWRkIHRoZSBwcmV2aW91cyBhcmd1bWVudCB0byBiYXNlX2NvbXBpbGUuCi0gICAgICBpZiB0ZXN0IC16ICIkYmFzZV9jb21waWxlIjsgdGhlbgotCWJhc2VfY29tcGlsZT0iJGxhc3RhcmciCi0gICAgICBlbHNlCi0JYmFzZV9jb21waWxlPSIkYmFzZV9jb21waWxlICRsYXN0YXJnIgotICAgICAgZmkKLSAgICBkb25lCi0KLSAgICBjYXNlICIkdXNlcl90YXJnZXQiIGluCi0gICAgc2V0KQotICAgICAgOzsKLSAgICBubykKLSAgICAgICMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IG9iamVjdC4KLSAgICAgIGxpYm9iaj1gJGVjaG8gIlgkc3JjZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotICAgICAgOzsKLSAgICAqKQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIHRhcmdldCB3aXRoIFxgLW8nIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBSZWNvZ25pemUgc2V2ZXJhbCBkaWZmZXJlbnQgZmlsZSBzdWZmaXhlcy4KLSAgICAjIElmIHRoZSB1c2VyIHNwZWNpZmllcyAtbyBmaWxlLm8sIGl0IGlzIHJlcGxhY2VkIHdpdGggZmlsZS5sbwotICAgIHhmb3JtPSdbY0NGU2Ztc29dJwotICAgIGNhc2UgIiRsaWJvYmoiIGluCi0gICAgKi5hZGEpIHhmb3JtPWFkYSA7OwotICAgICouYWRiKSB4Zm9ybT1hZGIgOzsKLSAgICAqLmFkcykgeGZvcm09YWRzIDs7Ci0gICAgKi5hc20pIHhmb3JtPWFzbSA7OwotICAgICouYysrKSB4Zm9ybT1jKysgOzsKLSAgICAqLmNjKSB4Zm9ybT1jYyA7OwotICAgICouY3BwKSB4Zm9ybT1jcHAgOzsKLSAgICAqLmN4eCkgeGZvcm09Y3h4IDs7Ci0gICAgKi5mOTApIHhmb3JtPWY5MCA7OwotICAgICouZm9yKSB4Zm9ybT1mb3IgOzsKLSAgICBlc2FjCi0KLSAgICBsaWJvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAicy9cLiR4Zm9ybSQvLmxvLyJgCi0KLSAgICBjYXNlICIkbGlib2JqIiBpbgotICAgICoubG8pIG9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICIkbG8ybyJgIDs7Ci0gICAgKikKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBkZXRlcm1pbmUgbmFtZSBvZiBsaWJyYXJ5IG9iamVjdCBmcm9tIFxgJGxpYm9iaiciIDE+JjIKLSAgICAgIGV4aXQgMQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0IC16ICIkYmFzZV9jb21waWxlIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGNvbXBpbGF0aW9uIGNvbW1hbmQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgICMgRGVsZXRlIGFueSBsZWZ0b3ZlciBsaWJyYXJ5IG9iamVjdHMuCi0gICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgcmVtb3ZlbGlzdD0iJG9iaiAkbGlib2JqIgotICAgIGVsc2UKLSAgICAgIHJlbW92ZWxpc3Q9IiRsaWJvYmoiCi0gICAgZmkKLQotICAgICRydW4gJHJtICRyZW1vdmVsaXN0Ci0gICAgdHJhcCAiJHJ1biAkcm0gJHJlbW92ZWxpc3Q7IGV4aXQgMSIgMSAyIDE1Ci0KLSAgICAjIENhbGN1bGF0ZSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBvYmplY3QgaWYgY29tcGlsZXIgZG9lcwotICAgICMgbm90IHN1cHBvcnQgLW8gd2l0aCAtYwotICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0gbm87IHRoZW4KLSAgICAgIG91dHB1dF9vYmo9YCRlY2hvICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJyAtZSAncyVcLi4qJCUlJ2AuJHtvYmpleHR9Ci0gICAgICBsb2NrZmlsZT0iJG91dHB1dF9vYmoubG9jayIKLSAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRvdXRwdXRfb2JqICRsb2NrZmlsZSIKLSAgICAgIHRyYXAgIiRydW4gJHJtICRyZW1vdmVsaXN0OyBleGl0IDEiIDEgMiAxNQotICAgIGVsc2UKLSAgICAgIG5lZWRfbG9ja3M9bm8KLSAgICAgIGxvY2tmaWxlPQotICAgIGZpCi0KLSAgICAjIExvY2sgdGhpcyBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IGlzIG5lZWRlZAotICAgICMgV2UgdXNlIHRoaXMgc2NyaXB0IGZpbGUgdG8gbWFrZSB0aGUgbGluaywgaXQgYXZvaWRzIGNyZWF0aW5nIGEgbmV3IGZpbGUKLSAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB5ZXM7IHRoZW4KLSAgICAgIHVudGlsIGxuICIkMCIgIiRsb2NrZmlsZSIgMj4vZGV2L251bGw7IGRvCi0JJHNob3cgIldhaXRpbmcgZm9yICRsb2NrZmlsZSB0byBiZSByZW1vdmVkIgotCXNsZWVwIDIKLSAgICAgIGRvbmUKLSAgICBlbGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm47IHRoZW4KLSAgICAgIGlmIHRlc3QgLWYgIiRsb2NrZmlsZSI7IHRoZW4KLQllY2hvICJcCi0qKiogRVJST1IsICRsb2NrZmlsZSBleGlzdHMgYW5kIGNvbnRhaW5zOgotYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCi0KLVRoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKLXlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKLXJlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKLWF2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCi1jb21waWxlci4iCi0KLQkkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgMQotICAgICAgZmkKLSAgICAgIGVjaG8gJHNyY2ZpbGUgPiAiJGxvY2tmaWxlIgotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkZml4X3NyY2ZpbGVfcGF0aCI7IHRoZW4KLSAgICAgIGV2YWwgc3JjZmlsZT1cIiRmaXhfc3JjZmlsZV9wYXRoXCIKLSAgICBmaQotCi0gICAgIyBPbmx5IGJ1aWxkIGEgUElDIG9iamVjdCBpZiB3ZSBhcmUgYnVpbGRpbmcgbGlidG9vbCBsaWJyYXJpZXMuCi0gICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgICMgV2l0aG91dCB0aGlzIGFzc2lnbm1lbnQsIGJhc2VfY29tcGlsZSBnZXRzIGVtcHRpZWQuCi0gICAgICBmYnNkX2hpZGVvdXNfc2hfYnVnPSRiYXNlX2NvbXBpbGUKLQotICAgICAgIyBBbGwgcGxhdGZvcm1zIHVzZSAtRFBJQywgdG8gbm90aWZ5IHByZXByb2Nlc3NlZCBhc3NlbWJsZXIgY29kZS4KLSAgICAgIGNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHBpY19mbGFnIC1EUElDICRzcmNmaWxlIgotICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCWxvX2xpYm9iaj0iJGxpYm9iaiIKLQlkaXI9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCWlmIHRlc3QgIlgkZGlyIiA9ICJYJGxpYm9iaiI7IHRoZW4KLQkgIGRpcj0iJG9iamRpciIKLQllbHNlCi0JICBkaXI9IiRkaXIvJG9iamRpciIKLQlmaQotCWxpYm9iaj0iJGRpci8iYCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0JaWYgdGVzdCAtZCAiJGRpciI7IHRoZW4KLQkgICRzaG93ICIkcm0gJGxpYm9iaiIKLQkgICRydW4gJHJtICRsaWJvYmoKLQllbHNlCi0JICAkc2hvdyAiJG1rZGlyICRkaXIiCi0JICAkcnVuICRta2RpciAkZGlyCi0JICBzdGF0dXM9JD8KLQkgIGlmIHRlc3QgJHN0YXR1cyAtbmUgMCAmJiB0ZXN0ICEgLWQgJGRpcjsgdGhlbgotCSAgICBleGl0ICRzdGF0dXMKLQkgIGZpCi0JZmkKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkY29tcGlsZXJfb19sbyIgPSB5ZXM7IHRoZW4KLQlvdXRwdXRfb2JqPSIkbGlib2JqIgotCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRvdXRwdXRfb2JqIgotICAgICAgZWxpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IHllczsgdGhlbgotCW91dHB1dF9vYmo9IiRvYmoiCi0JY29tbWFuZD0iJGNvbW1hbmQgLW8gJG91dHB1dF9vYmoiCi0gICAgICBmaQotCi0gICAgICAkc2hvdyAiJGNvbW1hbmQiCi0gICAgICBpZiAkcnVuIGV2YWwgIiRjb21tYW5kIjsgdGhlbiA6Ci0gICAgICBlbHNlCi0JdGVzdCAtbiAiJG91dHB1dF9vYmoiICYmICRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuICYmCi0JIHRlc3QgeCJgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAiICE9IHgiJHNyY2ZpbGUiOyB0aGVuCi0JZWNobyAiXAotKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6Ci1gY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKLQotYnV0IGl0IHNob3VsZCBjb250YWluOgotJHNyY2ZpbGUKLQotVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQotdGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoteW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQotcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgotYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKLWNvbXBpbGVyLiIKLQotCSRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0IGlmIG5lZWRlZCwgdGhlbiBnbyBvbiB0byBjb21waWxlIHRoZSBuZXh0IG9uZQotICAgICAgaWYgdGVzdCB4IiRvdXRwdXRfb2JqIiAhPSB4IiRsaWJvYmoiOyB0aGVuCi0JJHNob3cgIiRtdiAkb3V0cHV0X29iaiAkbGlib2JqIgotCWlmICRydW4gJG12ICRvdXRwdXRfb2JqICRsaWJvYmo7IHRoZW4gOgotCWVsc2UKLQkgIGVycm9yPSQ/Ci0JICAkcnVuICRybSAkcmVtb3ZlbGlzdAotCSAgZXhpdCAkZXJyb3IKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBJZiB3ZSBoYXZlIG5vIHBpY19mbGFnLCB0aGVuIGNvcHkgdGhlIG9iamVjdCBpbnRvIHBsYWNlIGFuZCBmaW5pc2guCi0gICAgICBpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQkjIFJlbmFtZSB0aGUgLmxvIGZyb20gd2l0aGluIG9iamRpciB0byBvYmoKLQlpZiB0ZXN0IC1mICRvYmo7IHRoZW4KLQkgICRzaG93ICRybSAkb2JqCi0JICAkcnVuICRybSAkb2JqCi0JZmkKLQotCSRzaG93ICIkbXYgJGxpYm9iaiAkb2JqIgotCWlmICRydW4gJG12ICRsaWJvYmogJG9iajsgdGhlbiA6Ci0JZWxzZQotCSAgZXJyb3I9JD8KLQkgICRydW4gJHJtICRyZW1vdmVsaXN0Ci0JICBleGl0ICRlcnJvcgotCWZpCi0KLQkjIE5vdyBhcnJhbmdlIHRoYXQgb2JqIGFuZCBsb19saWJvYmogYmVjb21lIHRoZSBzYW1lIGZpbGUKLQkkc2hvdyAiJExOX1MgJG9iaiAkbG9fbGlib2JqIgotCWlmICRydW4gJExOX1MgJG9iaiAkbG9fbGlib2JqOyB0aGVuCi0JICBleGl0IDAKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgQWxsb3cgZXJyb3IgbWVzc2FnZXMgb25seSBmcm9tIHRoZSBmaXJzdCBjb21waWxhdGlvbi4KLSAgICAgIHN1cHByZXNzX291dHB1dD0nID4vZGV2L251bGwgMj4mMScKLSAgICBmaQotCi0gICAgIyBPbmx5IGJ1aWxkIGEgcG9zaXRpb24tZGVwZW5kZW50IG9iamVjdCBpZiB3ZSBidWlsZCBvbGQgbGlicmFyaWVzLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIGNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHNyY2ZpbGUiCi0gICAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IHllczsgdGhlbgotCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRvYmoiCi0Jb3V0cHV0X29iaj0iJG9iaiIKLSAgICAgIGZpCi0KLSAgICAgICMgU3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGlmIHdlIGFscmVhZHkgZGlkIGEgUElDIGNvbXBpbGF0aW9uLgotICAgICAgY29tbWFuZD0iJGNvbW1hbmQkc3VwcHJlc3Nfb3V0cHV0IgotICAgICAgJHNob3cgIiRjb21tYW5kIgotICAgICAgaWYgJHJ1biBldmFsICIkY29tbWFuZCI7IHRoZW4gOgotICAgICAgZWxzZQotCSRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuICYmCi0JIHRlc3QgeCJgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAiICE9IHgiJHNyY2ZpbGUiOyB0aGVuCi0JZWNobyAiXAotKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6Ci1gY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKLQotYnV0IGl0IHNob3VsZCBjb250YWluOgotJHNyY2ZpbGUKLQotVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQotdGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoteW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQotcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgotYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKLWNvbXBpbGVyLiIKLQotCSRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0IGlmIG5lZWRlZAotICAgICAgaWYgdGVzdCB4IiRvdXRwdXRfb2JqIiAhPSB4IiRvYmoiOyB0aGVuCi0JJHNob3cgIiRtdiAkb3V0cHV0X29iaiAkb2JqIgotCWlmICRydW4gJG12ICRvdXRwdXRfb2JqICRvYmo7IHRoZW4gOgotCWVsc2UKLQkgIGVycm9yPSQ/Ci0JICAkcnVuICRybSAkcmVtb3ZlbGlzdAotCSAgZXhpdCAkZXJyb3IKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG8gbm90Ci0gICAgICAjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0JJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKLQkkcnVuIGV2YWwgImVjaG8gdGltZXN0YW1wID4gXCRsaWJvYmoiIHx8IGV4aXQgJD8KLSAgICAgIGVsc2UKLQkjIE1vdmUgdGhlIC5sbyBmcm9tIHdpdGhpbiBvYmpkaXIKLQkkc2hvdyAiJG12ICRsaWJvYmogJGxvX2xpYm9iaiIKLQlpZiAkcnVuICRtdiAkbGlib2JqICRsb19saWJvYmo7IHRoZW4gOgotCWVsc2UKLQkgIGVycm9yPSQ/Ci0JICAkcnVuICRybSAkcmVtb3ZlbGlzdAotCSAgZXhpdCAkZXJyb3IKLQlmaQotICAgICAgZmkKLSAgICBmaQotCi0gICAgIyBVbmxvY2sgdGhlIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgd2FzIGxvY2tlZAotICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAgICAgJHJtICIkbG9ja2ZpbGUiCi0gICAgZmkKLQotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGxpbmsgbW9kZQotICBsaW5rKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGxpbmsiCi0gICAgQ19jb21waWxlcj0iJENDIiAjIHNhdmUgaXQsIHRvIGNvbXBpbGUgZ2VuZXJhdGVkIEMgc291cmNlcwotICAgICMgQ1lHTlVTIExPQ0FMOiB0cm9tZXkvamF2YQotICAgICMgQWx3YXlzIHJlc3BlY3QgdGhlIENDIGNvbmZpZ3VyZWQgaW4gYnkgbHRjb25maWcuCi0gICAgIyBDQz0iJG5vbm9wdCIKLSAgICAjIEVORCBDWUdOVVMgTE9DQUwKLSAgICBjYXNlICIkaG9zdCIgaW4KLSAgICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotb3MyKikKLSAgICAgICMgSXQgaXMgaW1wb3NzaWJsZSB0byBsaW5rIGEgZGxsIHdpdGhvdXQgdGhpcyBzZXR0aW5nLCBhbmQKLSAgICAgICMgd2Ugc2hvdWxkbid0IGZvcmNlIHRoZSBtYWtlZmlsZSBtYWludGFpbmVyIHRvIGZpZ3VyZSBvdXQKLSAgICAgICMgd2hpY2ggc3lzdGVtIHdlIGFyZSBjb21waWxpbmcgZm9yIGluIG9yZGVyIHRvIHBhc3MgYW4gZXh0cmEKLSAgICAgICMgZmxhZyBmb3IgZXZlcnkgbGlidG9vbCBpbnZva2F0aW9uLgotICAgICAgIyBhbGxvd191bmRlZmluZWQ9bm8KLQotICAgICAgIyBGSVhNRTogVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlIGFib3ZlIHdoZW4gdHJ5aW5nCi0gICAgICAjIHRvIG1ha2UgYSBkbGwgd2hpY2ggaGFzIHVuZGVmaW5lZCBzeW1ib2xzLCBpbiB3aGljaCBjYXNlIG5vdAotICAgICAgIyBldmVuIGEgc3RhdGljIGxpYnJhcnkgaXMgYnVpbHQuICBGb3Igbm93LCB3ZSBuZWVkIHRvIHNwZWNpZnkKLSAgICAgICMgLW5vLXVuZGVmaW5lZCBvbiB0aGUgbGlidG9vbCBsaW5rIGxpbmUgd2hlbiB3ZSBjYW4gYmUgY2VydGFpbgotICAgICAgIyB0aGF0IGFsbCBzeW1ib2xzIGFyZSBzYXRpc2ZpZWQsIG90aGVyd2lzZSB3ZSBnZXQgYSBzdGF0aWMgbGlicmFyeS4KLSAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKLQotICAgICAgIyBUaGlzIGlzIGEgc291cmNlIHByb2dyYW0gdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBkbGxzIG9uIFdpbmRvd3MKLSAgICAgICMgRG9uJ3QgcmVtb3ZlIG5vciBtb2RpZnkgdGhlIHN0YXJ0aW5nIGFuZCBjbG9zaW5nIGNvbW1lbnRzCi0jIC8qIGx0ZGxsLmMgc3RhcnRzIGhlcmUgKi8KLSMgI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jICNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jICN1bmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCi0jICNpbmNsdWRlIDxzdGRpby5oPgotIwotIyBCT09MIEFQSUVOVFJZIERsbE1haW4gKEhJTlNUQU5DRSBoSW5zdCwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQpOwotIwotIyAjaW5jbHVkZSA8Y3lnd2luL2N5Z3dpbl9kbGwuaD4KLSMgREVDTEFSRV9DWUdXSU5fRExMKCBEbGxNYWluICk7Ci0jIEhJTlNUQU5DRSBfX2hEbGxJbnN0YW5jZV9iYXNlOwotIwotIyBCT09MIEFQSUVOVFJZCi0jIERsbE1haW4gKEhJTlNUQU5DRSBoSW5zdCwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQpCi0jIHsKLSMgICBfX2hEbGxJbnN0YW5jZV9iYXNlID0gaEluc3Q7Ci0jICAgcmV0dXJuIFRSVUU7Ci0jIH0KLSMgLyogbHRkbGwuYyBlbmRzIGhlcmUgKi8KLSAgICAgICMgVGhpcyBpcyBhIHNvdXJjZSBwcm9ncmFtIHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgaW1wb3J0IGxpYnJhcmllcwotICAgICAgIyBvbiBXaW5kb3dzIGZvciBkbGxzIHdoaWNoIGxhY2sgdGhlbS4gRG9uJ3QgcmVtb3ZlIG5vciBtb2RpZnkgdGhlCi0gICAgICAjIHN0YXJ0aW5nIGFuZCBjbG9zaW5nIGNvbW1lbnRzCi0jIC8qIGltcGdlbi5jIHN0YXJ0cyBoZXJlICovCi0jIC8qICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyAKLSMgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBsaWJ0b29sLgotIyAKLSMgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jICAqLwotIyAKLSMgICNpbmNsdWRlIDxzdGRpby5oPgkJLyogZm9yIHByaW50ZigpICovCi0jICAjaW5jbHVkZSA8dW5pc3RkLmg+CQkvKiBmb3Igb3BlbigpLCBsc2VlaygpLCByZWFkKCkgKi8KLSMgICNpbmNsdWRlIDxmY250bC5oPgkJLyogZm9yIE9fUkRPTkxZLCBPX0JJTkFSWSAqLwotIyAgI2luY2x1ZGUgPHN0cmluZy5oPgkJLyogZm9yIHN0cmR1cCgpICovCi0jIAotIyAgc3RhdGljIHVuc2lnbmVkIGludAotIyAgcGVfZ2V0MTYgKGZkLCBvZmZzZXQpCi0jICAgICAgIGludCBmZDsKLSMgICAgICAgaW50IG9mZnNldDsKLSMgIHsKLSMgICAgdW5zaWduZWQgY2hhciBiWzJdOwotIyAgICBsc2VlayAoZmQsIG9mZnNldCwgU0VFS19TRVQpOwotIyAgICByZWFkIChmZCwgYiwgMik7Ci0jICAgIHJldHVybiBiWzBdICsgKGJbMV08PDgpOwotIyAgfQotIyAKLSMgIHN0YXRpYyB1bnNpZ25lZCBpbnQKLSMgIHBlX2dldDMyIChmZCwgb2Zmc2V0KQotIyAgICAgIGludCBmZDsKLSMgICAgICBpbnQgb2Zmc2V0OwotIyAgewotIyAgICB1bnNpZ25lZCBjaGFyIGJbNF07Ci0jICAgIGxzZWVrIChmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7Ci0jICAgIHJlYWQgKGZkLCBiLCA0KTsKLSMgICAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCkgKyAoYlsyXTw8MTYpICsgKGJbM108PDI0KTsKLSMgIH0KLSMgCi0jICBzdGF0aWMgdW5zaWduZWQgaW50Ci0jICBwZV9hczMyIChwdHIpCi0jICAgICAgIHZvaWQgKnB0cjsKLSMgIHsKLSMgICAgdW5zaWduZWQgY2hhciAqYiA9IHB0cjsKLSMgICAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCkgKyAoYlsyXTw8MTYpICsgKGJbM108PDI0KTsKLSMgIH0KLSMgCi0jICBpbnQKLSMgIG1haW4gKGFyZ2MsIGFyZ3YpCi0jICAgICAgaW50IGFyZ2M7Ci0jICAgICAgY2hhciAqYXJndltdOwotIyAgewotIyAgICAgIGludCBkbGw7Ci0jICAgICAgdW5zaWduZWQgbG9uZyBwZV9oZWFkZXJfb2Zmc2V0LCBvcHRoZHJfb2ZzLCBudW1fZW50cmllcywgaTsKLSMgICAgICB1bnNpZ25lZCBsb25nIGV4cG9ydF9ydmEsIGV4cG9ydF9zaXplLCBuc2VjdGlvbnMsIHNlY3B0ciwgZXhwcHRyOwotIyAgICAgIHVuc2lnbmVkIGxvbmcgbmFtZV9ydmFzLCBuZXhwOwotIyAgICAgIHVuc2lnbmVkIGNoYXIgKmV4cGRhdGEsICplcnZhOwotIyAgICAgIGNoYXIgKmZpbGVuYW1lLCAqZGxsX25hbWU7Ci0jIAotIyAgICAgIGZpbGVuYW1lID0gYXJndlsxXTsKLSMgCi0jICAgICAgZGxsID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFl8T19CSU5BUlkpOwotIyAgICAgIGlmICghZGxsKQotIyAgCXJldHVybiAxOwotIyAKLSMgICAgICBkbGxfbmFtZSA9IGZpbGVuYW1lOwotIyAgICAKLSMgICAgICBmb3IgKGk9MDsgZmlsZW5hbWVbaV07IGkrKykKLSMgIAlpZiAoZmlsZW5hbWVbaV0gPT0gJy8nIHx8IGZpbGVuYW1lW2ldID09ICdcXCcgIHx8IGZpbGVuYW1lW2ldID09ICc6JykKLSMgIAkgICAgZGxsX25hbWUgPSBmaWxlbmFtZSArIGkgKzE7Ci0jIAotIyAgICAgIHBlX2hlYWRlcl9vZmZzZXQgPSBwZV9nZXQzMiAoZGxsLCAweDNjKTsKLSMgICAgICBvcHRoZHJfb2ZzID0gcGVfaGVhZGVyX29mZnNldCArIDQgKyAyMDsKLSMgICAgICBudW1fZW50cmllcyA9IHBlX2dldDMyIChkbGwsIG9wdGhkcl9vZnMgKyA5Mik7Ci0jIAotIyAgICAgIGlmIChudW1fZW50cmllcyA8IDEpIC8qIG5vIGV4cG9ydHMgKi8KLSMgIAlyZXR1cm4gMTsKLSMgCi0jICAgICAgZXhwb3J0X3J2YSA9IHBlX2dldDMyIChkbGwsIG9wdGhkcl9vZnMgKyA5Nik7Ci0jICAgICAgZXhwb3J0X3NpemUgPSBwZV9nZXQzMiAoZGxsLCBvcHRoZHJfb2ZzICsgMTAwKTsKLSMgICAgICBuc2VjdGlvbnMgPSBwZV9nZXQxNiAoZGxsLCBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArMik7Ci0jICAgICAgc2VjcHRyID0gKHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsgMjAgKwotIyAgCSAgICAgIHBlX2dldDE2IChkbGwsIHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsgMTYpKTsKLSMgCi0jICAgICAgZXhwcHRyID0gMDsKLSMgICAgICBmb3IgKGkgPSAwOyBpIDwgbnNlY3Rpb25zOyBpKyspCi0jICAgICAgewotIyAgCWNoYXIgc25hbWVbOF07Ci0jICAJdW5zaWduZWQgbG9uZyBzZWNwdHIxID0gc2VjcHRyICsgNDAgKiBpOwotIyAgCXVuc2lnbmVkIGxvbmcgdmFkZHIgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMTIpOwotIyAgCXVuc2lnbmVkIGxvbmcgdnNpemUgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMTYpOwotIyAgCXVuc2lnbmVkIGxvbmcgZnB0ciA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAyMCk7Ci0jICAJbHNlZWsoZGxsLCBzZWNwdHIxLCBTRUVLX1NFVCk7Ci0jICAJcmVhZChkbGwsIHNuYW1lLCA4KTsKLSMgIAlpZiAodmFkZHIgPD0gZXhwb3J0X3J2YSAmJiB2YWRkcit2c2l6ZSA+IGV4cG9ydF9ydmEpCi0jICAJewotIyAgCSAgICBleHBwdHIgPSBmcHRyICsgKGV4cG9ydF9ydmEgLSB2YWRkcik7Ci0jICAJICAgIGlmIChleHBvcnRfcnZhICsgZXhwb3J0X3NpemUgPiB2YWRkciArIHZzaXplKQotIyAgCQlleHBvcnRfc2l6ZSA9IHZzaXplIC0gKGV4cG9ydF9ydmEgLSB2YWRkcik7Ci0jICAJICAgIGJyZWFrOwotIyAgCX0KLSMgICAgICB9Ci0jIAotIyAgICAgIGV4cGRhdGEgPSAodW5zaWduZWQgY2hhciopbWFsbG9jKGV4cG9ydF9zaXplKTsKLSMgICAgICBsc2VlayAoZGxsLCBleHBwdHIsIFNFRUtfU0VUKTsKLSMgICAgICByZWFkIChkbGwsIGV4cGRhdGEsIGV4cG9ydF9zaXplKTsKLSMgICAgICBlcnZhID0gZXhwZGF0YSAtIGV4cG9ydF9ydmE7Ci0jIAotIyAgICAgIG5leHAgPSBwZV9hczMyIChleHBkYXRhKzI0KTsKLSMgICAgICBuYW1lX3J2YXMgPSBwZV9hczMyIChleHBkYXRhKzMyKTsKLSMgCi0jICAgICAgcHJpbnRmICgiRVhQT1JUU1xuIik7Ci0jICAgICAgZm9yIChpID0gMDsgaTxuZXhwOyBpKyspCi0jICAgICAgewotIyAgCXVuc2lnbmVkIGxvbmcgbmFtZV9ydmEgPSBwZV9hczMyIChlcnZhK25hbWVfcnZhcytpKjQpOwotIyAgCXByaW50ZiAoIlx0JXMgQCAlbGQgO1xuIiwgZXJ2YStuYW1lX3J2YSwgMSsgaSk7Ci0jICAgICAgfQotIyAKLSMgICAgICByZXR1cm4gMDsKLSMgIH0KLSMgLyogaW1wZ2VuLmMgZW5kcyBoZXJlICovCi0gICAgICA7OwotICAgICopCi0gICAgICBhbGxvd191bmRlZmluZWQ9eWVzCi0gICAgICA7OwotICAgIGVzYWMKLSAgICBjb21waWxlX2NvbW1hbmQ9IiRDQyIKLSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkQ0MiCi0KLSAgICBjb21waWxlX3JwYXRoPQotICAgIGZpbmFsaXplX3JwYXRoPQotICAgIGNvbXBpbGVfc2hsaWJwYXRoPQotICAgIGZpbmFsaXplX3NobGlicGF0aD0KLSAgICBjb252ZW5pZW5jZT0KLSAgICBvbGRfY29udmVuaWVuY2U9Ci0gICAgZGVwbGlicz0KLSAgICBsaW5rb3B0cz0KLQotICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotICAgICAgIyBnZXQgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiAkc2hsaWJwYXRoX3ZhcgotICAgICAgZXZhbCBsaWJfc2VhcmNoX3BhdGg9XGBcJGVjaG8gXCJYIFwkeyRzaGxpYnBhdGhfdmFyfVwiIFx8IFwkWHNlZCAtZSBcJ3MvOi8gL2dcJ1xgCi0gICAgZWxzZQotICAgICAgbGliX3NlYXJjaF9wYXRoPQotICAgIGZpCi0gICAgIyBub3cgcHJlcGVuZCB0aGUgc3lzdGVtLXNwZWNpZmljIG9uZXMKLSAgICBldmFsIGxpYl9zZWFyY2hfcGF0aD1cIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWNcJGxpYl9zZWFyY2hfcGF0aFwiCi0gICAgZXZhbCBzeXNfbGliX2Rsc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWNcIgotICAgIAotICAgIGF2b2lkX3ZlcnNpb249bm8KLSAgICBkbGZpbGVzPQotICAgIGRscHJlZmlsZXM9Ci0gICAgZGxzZWxmPW5vCi0gICAgZXhwb3J0X2R5bmFtaWM9bm8KLSAgICBleHBvcnRfc3ltYm9scz0KLSAgICBleHBvcnRfc3ltYm9sc19yZWdleD0KLSAgICBnZW5lcmF0ZWQ9Ci0gICAgbGlib2Jqcz0KLSAgICBsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzPQotICAgIGx0bGlicz0KLSAgICBtb2R1bGU9bm8KLSAgICBvYmpzPQotICAgIHByZWxvYWQ9bm8KLSAgICBwcmV2PQotICAgIHByZXZhcmc9Ci0gICAgcmVsZWFzZT0KLSAgICBycGF0aD0KLSAgICB4cnBhdGg9Ci0gICAgcGVybV9ycGF0aD0KLSAgICB0ZW1wX3JwYXRoPQotICAgIHRocmVhZF9zYWZlPW5vCi0gICAgdmluZm89Ci0KLSAgICAjIFdlIG5lZWQgdG8ga25vdyAtc3RhdGljLCB0byBnZXQgdGhlIHJpZ2h0IG91dHB1dCBmaWxlbmFtZXMuCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgLWFsbC1zdGF0aWMgfCAtc3RhdGljKQotCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWFsbC1zdGF0aWMiICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgLXogIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjb21wbGV0ZSBzdGF0aWMgbGlua2luZyBpcyBpbXBvc3NpYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbiIgMT4mMgotCWZpCi0JYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JYnVpbGRfb2xkX2xpYnM9eWVzCi0JYnJlYWsKLQk7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgICMgU2VlIGlmIG91ciBzaGFyZWQgYXJjaGl2ZXMgZGVwZW5kIG9uIHN0YXRpYyBhcmNoaXZlcy4KLSAgICB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgYnVpbGRfb2xkX2xpYnM9eWVzCi0KLSAgICAjIEdvIHRocm91Z2ggdGhlIGFyZ3VtZW50cywgdHJhbnNmb3JtaW5nIHRoZW0gb24gdGhlIHdheS4KLSAgICB3aGlsZSB0ZXN0ICQjIC1ndCAwOyBkbwotICAgICAgYXJnPSIkMSIKLSAgICAgIHNoaWZ0Ci0KLSAgICAgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICAgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0JY2FzZSAiJHByZXYiIGluCi0Jb3V0cHV0KQotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBPVVRQVVRAIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQE9VVFBVVEAiCi0JICA7OwotCWVzYWMKLQotCWNhc2UgIiRwcmV2IiBpbgotCWRsZmlsZXN8ZGxwcmVmaWxlcykKLQkgIGlmIHRlc3QgIiRwcmVsb2FkIiA9IG5vOyB0aGVuCi0JICAgICMgQWRkIHRoZSBzeW1ib2wgb2JqZWN0IGludG8gdGhlIGxpbmtpbmcgY29tbWFuZHMuCi0JICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBAU1lNRklMRUAiCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIEBTWU1GSUxFQCIKLQkgICAgcHJlbG9hZD15ZXMKLQkgIGZpCi0JICBjYXNlICIkYXJnIiBpbgotCSAgKi5sYSB8ICoubG8pIDs7ICAjIFdlIGhhbmRsZSB0aGVzZSBjYXNlcyBiZWxvdy4KLQkgIHNlbGYpCi0JICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkgICAgICBkbHNlbGY9eWVzCi0JICAgIGVsaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlcyAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiICE9IHllczsgdGhlbgotCSAgICAgIGRsc2VsZj15ZXMKLQkgICAgZmkKLQkgICAgcHJldj0KLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgICopCi0JICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCi0JICAgIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXMgJiYgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKLQkgICAgcHJldj0KLQkgICAgOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXhwc3ltcykKLQkgIGV4cG9ydF9zeW1ib2xzPSIkYXJnIgotCSAgaWYgdGVzdCAhIC1mICIkYXJnIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBzeW1ib2wgZmlsZSBcYCRhcmcnIGRvZXMgbm90IGV4aXN0IgotCSAgICBleGl0IDEKLQkgIGZpCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JZXhwc3ltc19yZWdleCkKLQkgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PSIkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXJlbGVhc2UpCi0JICByZWxlYXNlPSItJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlycGF0aCkKLQkgIHJwYXRoPSIkcnBhdGggJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQl4cnBhdGgpCi0JICB4cnBhdGg9IiR4cnBhdGggJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQkqKQotCSAgZXZhbCAiJHByZXY9XCJcJGFyZ1wiIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0KLSAgICAgIHByZXZhcmc9IiRhcmciCi0KLSAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAtYWxsLXN0YXRpYykKLQlpZiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotCSAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYwotCWZpCi0JY29udGludWUKLQk7OwotCi0gICAgICAtYWxsb3ctdW5kZWZpbmVkKQotCSMgRklYTUU6IHJlbW92ZSB0aGlzIGZsYWcgc29tZXRpbWUgaW4gdGhlIGZ1dHVyZS4KLQkkZWNobyAiJG1vZGVuYW1lOiBcYC1hbGxvdy11bmRlZmluZWQnIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBpdCBpcyB0aGUgZGVmYXVsdCIgMT4mMgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWF2b2lkLXZlcnNpb24pCi0JYXZvaWRfdmVyc2lvbj15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1kbG9wZW4pCi0JcHJldj1kbGZpbGVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZGxwcmVvcGVuKQotCXByZXY9ZGxwcmVmaWxlcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWV4cG9ydC1keW5hbWljKQotCWlmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgIT0geWVzOyB0aGVuCi0JICBleHBvcnRfZHluYW1pYz15ZXMKLQkgIGlmIHRlc3QgLW4gIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWMiOyB0aGVuCi0JICAgIGV2YWwgYXJnPVwiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCi0JICBlbHNlCi0JICAgIGFyZz0KLQkgIGZpCi0JZmkKLQk7OwotCi0gICAgICAtZXhwb3J0LXN5bWJvbHMgfCAtZXhwb3J0LXN5bWJvbHMtcmVnZXgpCi0JaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gb25lIC1leHBvcnRlZC1zeW1ib2xzIgotCSAgZXhpdCAxCi0JZmkKLQlpZiB0ZXN0ICIkYXJnIiA9ICItZXhwb3J0LXN5bWJvbHMiOyB0aGVuCi0JICBwcmV2PWV4cHN5bXMKLQllbHNlCi0JICBwcmV2PWV4cHN5bXNfcmVnZXgKLQlmaQotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLUwqKQotCWRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJV4tTFwoLipcKSQlXDElJ2AKLQljYXNlICIkZGlyIiBpbgotCS8qIHwgW0EtWmEtel06Wy9cXF0qKQotCSAgIyBBZGQgdGhlIGNvcnJlc3BvbmRpbmcgaGFyZGNvZGVfbGliZGlyX2ZsYWcsIGlmIGl0IGlzIG5vdCBpZGVudGljYWwuCi0JICA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYC1MJGRpcicgY2Fubm90IHNwZWNpZnkgYSByZWxhdGl2ZSBkaXJlY3RvcnkiIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0JY2FzZSAiICRkZXBsaWJzICIgaW4KLQkqIiAkYXJnICIqKSA7OwotCSopIGRlcGxpYnM9IiRkZXBsaWJzICRhcmciOzsKLQllc2FjCi0JY2FzZSAiICRsaWJfc2VhcmNoX3BhdGggIiBpbgotCSoiICRkaXIgIiopIDs7Ci0JKikgbGliX3NlYXJjaF9wYXRoPSIkbGliX3NlYXJjaF9wYXRoICRkaXIiOzsKLQllc2FjCi0JY2FzZSAiJGhvc3QiIGluCi0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLW9zMiopCi0JICBkbGxzZWFyY2hkaXI9YGNkICIkZGlyIiAmJiBwd2QgfHwgZWNobyAiJGRpciJgCi0JICBjYXNlICI6JGRsbHNlYXJjaHBhdGg6IiBpbgotCSAgOjopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hkaXIiOzsKLQkgICoiOiRkbGxzZWFyY2hkaXI6IiopIDs7Ci0JICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokZGxsc2VhcmNoZGlyIjs7Ci0JICBlc2FjCi0JICA7OwotCWVzYWMKLQk7OwotCi0gICAgICAtbCopCi0JZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKLQk7OwotCi0gICAgICAtbW9kdWxlKQotCWlmIHRlc3QgIiRtb2R1bGUiICE9IHllczsgdGhlbgotCSAgbW9kdWxlPXllcwotCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKLQkgIGVsc2UKLQkgICAgYXJnPQotCSAgZmkKLQlmaQotCTs7Ci0JCi0gICAgICAtbm8tdW5kZWZpbmVkKQotCWFsbG93X3VuZGVmaW5lZD1ubwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW8pIHByZXY9b3V0cHV0IDs7Ci0KLSAgICAgIC1yZWxlYXNlKQotCXByZXY9cmVsZWFzZQotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXJwYXRoKQotCXByZXY9cnBhdGgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1SKQotCXByZXY9eHJwYXRoCi0JY29udGludWUKLQk7OwotCi0gICAgICAtUiopCi0JeHJwYXRoPSIkeHJwYXRoICJgJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL14tUi8vJ2AKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1zdGF0aWMpCi0JIyBJZiB3ZSBoYXZlIG5vIHBpY19mbGFnLCB0aGVuIHRoaXMgaXMgdGhlIHNhbWUgYXMgLWFsbC1zdGF0aWMuCi0JaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotCSAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYwotCWZpCi0JY29udGludWUKLQk7OwotCi0gICAgICAtdGhyZWFkLXNhZmUpCi0JdGhyZWFkX3NhZmU9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtdmVyc2lvbi1pbmZvKQotCXByZXY9dmluZm8KLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBmbGFnLgotICAgICAgLSogfCArKikKLQkjIFVua25vd24gYXJndW1lbnRzIGluIGJvdGggZmluYWxpemVfY29tbWFuZCBhbmQgY29tcGlsZV9jb21tYW5kIG5lZWQKLQkjIHRvIGJlIGFlc3RoZXRpY2FsbHkgcXVvdGVkIGJlY2F1c2UgdGhleSBhcmUgZXZhbGVkIGxhdGVyLgotCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQljYXNlICIkYXJnIiBpbgotCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCSAgYXJnPSJcIiRhcmdcIiIKLQkgIDs7Ci0JZXNhYwotCTs7Ci0KLSAgICAgICoubyB8ICoub2JqIHwgKi5hIHwgKi5saWIpCi0JIyBBIHN0YW5kYXJkIG9iamVjdC4KLQlvYmpzPSIkb2JqcyAkYXJnIgotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBBIGxpYnJhcnkgb2JqZWN0LgotCWlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KLQkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuIiA9IHllczsgdGhlbgotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgZWxzZQotCSAgICAjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgotCSAgICBwcmV2PWRscHJlZmlsZXMKLQkgIGZpCi0JZmkKLQotCWlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KLQkgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICJgJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JICBwcmV2PQotCWZpCi0JbGlib2Jqcz0iJGxpYm9ianMgJGFyZyIKLQk7OwotCi0gICAgICAqLmxhKQotCSMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgbGlicmFyeS4KLQotCWRsbmFtZT0KLQlsaWJkaXI9Ci0JbGlicmFyeV9uYW1lcz0KLQlvbGRfbGlicmFyeT0KLQotCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCi0JaWYgKHNlZCAtZSAnMnEnICRhcmcgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGFyZycgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCi0JIyBJZiB0aGUgbGlicmFyeSB3YXMgaW5zdGFsbGVkIHdpdGggYW4gb2xkIHJlbGVhc2Ugb2YgbGlidG9vbCwKLQkjIGl0IHdpbGwgbm90IHJlZGVmaW5lIHZhcmlhYmxlIGluc3RhbGxlZC4KLQlpbnN0YWxsZWQ9eWVzCi0KLQkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQljYXNlICIkYXJnIiBpbgotCSovKiB8ICpcXCopIC4gJGFyZyA7OwotCSopIC4gLi8kYXJnIDs7Ci0JZXNhYwotCi0JIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgd2UgbGluayBhZ2FpbnN0LgotCWxpbmtsaWI9Ci0JZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbwotCSAgbGlua2xpYj0iJGwiCi0JZG9uZQotCi0JaWYgdGVzdCAteiAiJGxpbmtsaWIiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkYXJnJyIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQotCSMgRmluZCB0aGUgcmVsZXZhbnQgb2JqZWN0IGRpcmVjdG9yeSBhbmQgbGlicmFyeSBuYW1lLgotCW5hbWU9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyVeLiovJSUnIC1lICdzL1wubGEkLy8nIC1lICdzL15saWIvLydgCi0KLQlpZiB0ZXN0ICJYJGluc3RhbGxlZCIgPSBYeWVzOyB0aGVuCi0JICBkaXI9IiRsaWJkaXIiCi0JZWxzZQotCSAgZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQkgIGlmIHRlc3QgIlgkZGlyIiA9ICJYJGFyZyI7IHRoZW4KLQkgICAgZGlyPSIkb2JqZGlyIgotCSAgZWxzZQotCSAgICBkaXI9IiRkaXIvJG9iamRpciIKLQkgIGZpCi0JZmkKLQotCWlmIHRlc3QgLW4gIiRkZXBlbmRlbmN5X2xpYnMiOyB0aGVuCi0JICAjIEV4dHJhY3QgLVIgZnJvbSBkZXBlbmRlbmN5X2xpYnMKLQkgIHRlbXBfZGVwbGlicz0KLQkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgY2FzZSAiJGRlcGxpYiIgaW4KLQkgICAgLVIqKSB0ZW1wX3hycGF0aD1gJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICdzL14tUi8vJ2AKLQkJIGNhc2UgIiAkcnBhdGggJHhycGF0aCAiIGluCi0JCSAqIiAkdGVtcF94cnBhdGggIiopIDs7Ci0JCSAqKSB4cnBhdGg9IiR4cnBhdGggJHRlbXBfeHJwYXRoIjs7Ci0JCSBlc2FjOzsKLQkgICAgLUwqKSBjYXNlICIkY29tcGlsZV9jb21tYW5kICR0ZW1wX2RlcGxpYnMgIiBpbgotCQkgKiIgJGRlcGxpYiAiKikgOzsKLQkJICopIHRlbXBfZGVwbGlicz0iJHRlbXBfZGVwbGlicyAkZGVwbGliIjs7Ci0JCSBlc2FjOzsKLQkgICAgKikgdGVtcF9kZXBsaWJzPSIkdGVtcF9kZXBsaWJzICRkZXBsaWIiOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCSAgZGVwZW5kZW5jeV9saWJzPSIkdGVtcF9kZXBsaWJzIgotCWZpCi0KLQlpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCSAgIyBJdCBpcyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeSwgc28gYWRkIGluIGl0cyBvYmplY3RzLgotCSAgY29udmVuaWVuY2U9IiRjb252ZW5pZW5jZSAkZGlyLyRvbGRfbGlicmFyeSIKLQkgIG9sZF9jb252ZW5pZW5jZT0iJG9sZF9jb252ZW5pZW5jZSAkZGlyLyRvbGRfbGlicmFyeSIKLQkgIGRlcGxpYnM9IiRkZXBsaWJzJGRlcGVuZGVuY3lfbGlicyIKLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZGlyLyRvbGRfbGlicmFyeSRkZXBlbmRlbmN5X2xpYnMiCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkZGlyLyRvbGRfbGlicmFyeSRkZXBlbmRlbmN5X2xpYnMiCi0JICBjb250aW51ZQotCWZpCi0KLQkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KLQlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JICBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgotCSAgaWYgdGVzdCAteiAiJGRsbmFtZSIgfHwgdGVzdCAiJGRsb3BlbiIgIT0geWVzIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KLQkgICAgIyBJZiB0aGVyZSBpcyBubyBkbG5hbWUsIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcgc3RhdGljYWxseSwKLQkgICAgIyB3ZSBuZWVkIHRvIHByZWxvYWQuCi0JICAgIHByZXY9ZGxwcmVmaWxlcwotCSAgZWxzZQotCSAgICAjIFdlIHNob3VsZCBub3QgY3JlYXRlIGEgZGVwZW5kZW5jeSBvbiB0aGlzIGxpYnJhcnksIGJ1dCB3ZQotCSAgICAjIG1heSBuZWVkIGFueSBsaWJyYXJpZXMgaXQgcmVxdWlyZXMuCi0JICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCRkZXBlbmRlbmN5X2xpYnMiCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKLQkgICAgcHJldj0KLQkgICAgY29udGludWUKLQkgIGZpCi0JZmkKLQotCSMgVGhlIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCi0JaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgIyBQcmVmZXIgdXNpbmcgYSBzdGF0aWMgbGlicmFyeSAoc28gdGhhdCBubyBzaWxseSBfRFlOQU1JQyBzeW1ib2xzCi0JICAjIGFyZSByZXF1aXJlZCB0byBsaW5rKS4KLQkgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCi0JICBlbHNlCi0JICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRkaXIvJGxpbmtsaWIiCi0JICBmaQotCSAgcHJldj0KLQlmaQotCi0JaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB0aGVuCi0JICBsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzPSIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyAkYXJnIgotCSAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0JICAgICMgTWFrZSBzdXJlIHRoZSBycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KLQkgICAgY2FzZSAiJHRlbXBfcnBhdGggIiBpbgotCSAgICAqIiAkZGlyICIqKSA7OwotCSAgICAqKSB0ZW1wX3JwYXRoPSIkdGVtcF9ycGF0aCAkZGlyIiA7OwotCSAgICBlc2FjCi0JICBmaQotCi0JICAjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQkgIGNhc2UgIiRkaXIiIGluCi0JICAvKiB8IFtBLVphLXpdOlsvXFxdKikgYWJzZGlyPSIkZGlyIiA7OwotCSAgKikKLQkgICAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAotCSAgICBpZiB0ZXN0IC16ICIkYWJzZGlyIjsgdGhlbgotCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkbGliZGlyJyIgMT4mMgotCSAgICAgIGV4aXQgMQotCSAgICBmaQotCSAgICA7OwotCSAgZXNhYwotCSAgCi0JICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCi0JICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCi0JICAjIHNlYXJjaCBwYXRoLCB1bmxlc3MgdGhleSBoYXZlIGJlZW4gcmVxdWVzdGVkIHdpdGggLVIuCi0JICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0gCSAgKiIgJGFic2RpciAiKikgOzsKLQkgICopCi0JICAgIGNhc2UgIiRjb21waWxlX3JwYXRoICIgaW4KLQkgICAgKiIgJGFic2RpciAiKikgOzsKLQkgICAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGFic2RpciIgCi0JICAgIGVzYWMKLQkgICAgOzsKLSAJICBlc2FjCi0KLQkgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KLSAJICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikKLQkgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgotCSAgICBlc2FjCi0JICAgIDs7Ci0gCSAgZXNhYwotCi0JICBsaWJfbGlua2VkPXllcwotCSAgY2FzZSAiJGhhcmRjb2RlX2FjdGlvbiIgaW4KLQkgIGltbWVkaWF0ZSB8IHVuc3VwcG9ydGVkKQotCSAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IG5vOyB0aGVuCi0JICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRkaXIvJGxpbmtsaWIiCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYnMgJGRpci8kbGlua2xpYiIKLQkgICAgICBjYXNlICIkaG9zdCIgaW4KLQkgICAgICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotb3MyKikKLQkJZGxsc2VhcmNoZGlyPWBjZCAiJGRpciIgJiYgcHdkIHx8IGVjaG8gIiRkaXIiYAotCQlpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KLQkJICBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokZGxsc2VhcmNoZGlyIgotCQllbHNlCi0JCSAgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaGRpciIKLQkJZmkKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0gbm87IHRoZW4KLQkgICAgICBjYXNlICIkaG9zdCIgaW4KLQkgICAgICAqLSotc3Vub3MqKQotCQljb21waWxlX3NobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJGRpcjoiCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICAgIGNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgotCSAgICAgICoiIC1MJGRpciAiKikgOzsKLQkgICAgICAqKSBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLUwkZGlyIjs7Ci0JICAgICAgZXNhYwotCSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtbCRuYW1lIgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1MJGRpciAtbCRuYW1lIgotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IG5vOyB0aGVuCi0JICAgICAgY2FzZSAiOiRjb21waWxlX3NobGlicGF0aDoiIGluCi0JICAgICAgKiI6JGRpcjoiKikgOzsKLQkgICAgICAqKSBjb21waWxlX3NobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJGRpcjoiOzsKLQkgICAgICBlc2FjCi0JICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1sJG5hbWUiCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLWwkbmFtZSIKLQkgICAgZWxzZQotCSAgICAgIGxpYl9saW5rZWQ9bm8KLQkgICAgZmkKLQkgICAgOzsKLQotCSAgcmVsaW5rKQotCSAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllczsgdGhlbgotCSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYWJzZGlyLyRsaW5rbGliIgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWJzICRhYnNkaXIvJGxpbmtsaWIiCi0JICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCi0JICAgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCi0JICAgICAgKiIgLUwkYWJzZGlyICIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtTCRhYnNkaXIiOzsKLQkgICAgICBlc2FjCi0JICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1sJG5hbWUiCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLUwkYWJzZGlyIC1sJG5hbWUiCi0JICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCi0JICAgICAgY2FzZSAiOiRjb21waWxlX3NobGlicGF0aDoiIGluCi0JICAgICAgKiI6JGFic2RpcjoiKikgOzsKLQkgICAgICAqKSBjb21waWxlX3NobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJGFic2RpcjoiOzsKLQkgICAgICBlc2FjCi0JICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1sJG5hbWUiCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLWwkbmFtZSIKLQkgICAgZWxzZQotCSAgICAgIGxpYl9saW5rZWQ9bm8KLQkgICAgZmkKLQkgICAgOzsKLQotCSAgKikKLQkgICAgbGliX2xpbmtlZD1ubwotCSAgICA7OwotCSAgZXNhYwotCi0JICBpZiB0ZXN0ICIkbGliX2xpbmtlZCIgIT0geWVzOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGNvbmZpZ3VyYXRpb24gZXJyb3I6IHVuc3VwcG9ydGVkIGhhcmRjb2RlIHByb3BlcnRpZXMiCi0JICAgIGV4aXQgMQotCSAgZmkKLQotCSAgIyBGaW5hbGl6ZSBjb21tYW5kIGZvciBib3RoIGlzIHNpbXBsZToganVzdCBoYXJkY29kZSBpdC4KLQkgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRsaWJkaXIvJGxpbmtsaWIiCi0JICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgotCSAgICBjYXNlICIkZmluYWxpemVfY29tbWFuZCAiIGluCi0JICAgICoiIC1MJGxpYmRpciAiKikgOzsKLQkgICAgKikgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgLUwkbGliZGlyIjs7Ci0JICAgIGVzYWMKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgLWwkbmFtZSIKLQkgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCi0JICAgIGNhc2UgIjokZmluYWxpemVfc2hsaWJwYXRoOiIgaW4KLQkgICAgKiI6JGxpYmRpcjoiKikgOzsKLQkgICAgKikgZmluYWxpemVfc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoJGxpYmRpcjoiOzsKLQkgICAgZXNhYwotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgotCSAgZWxzZQotCSAgICAjIFdlIGNhbm5vdCBzZWVtIHRvIGhhcmRjb2RlIGl0LCBndWVzcyB3ZSdsbCBmYWtlIGl0LgotCSAgICBjYXNlICIkZmluYWxpemVfY29tbWFuZCAiIGluCi0JICAgICoiIC1MJGRpciAiKikgOzsKLQkgICAgKikgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgLUwkbGliZGlyIjs7Ci0JICAgIGVzYWMKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgLWwkbmFtZSIKLQkgIGZpCi0JZWxzZQotCSAgIyBUcmFuc2Zvcm0gZGlyZWN0bHkgdG8gb2xkIGFyY2hpdmVzIGlmIHdlIGRvbid0IGJ1aWxkIG5ldyBsaWJyYXJpZXMuCi0JICBpZiB0ZXN0IC1uICIkcGljX2ZsYWciICYmIHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgc3RhdGljIGxpYnJhcnkgZm9yIFxgJGFyZyciIDE+JjIKLQkgICAgZXhpdCAxCi0JICBmaQotCi0JICAjIEhlcmUgd2UgYXNzdW1lIHRoYXQgb25lIG9mIGhhcmRjb2RlX2RpcmVjdCBvciBoYXJkY29kZV9taW51c19MCi0JICAjIGlzIG5vdCB1bnN1cHBvcnRlZC4gIFRoaXMgaXMgdmFsaWQgb24gYWxsIGtub3duIHN0YXRpYyBhbmQKLQkgICMgc2hhcmVkIHBsYXRmb3Jtcy4KLQkgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IHVuc3VwcG9ydGVkOyB0aGVuCi0JICAgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgbGlua2xpYj0iJG9sZF9saWJyYXJ5IgotCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGRpci8kbGlua2xpYiIKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGRpci8kbGlua2xpYiIKLQkgIGVsc2UKLQkgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCi0JICAgICoiIC1MJGRpciAiKikgOzsKLQkgICAgKikgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1MJGRpciI7OwotCSAgICBlc2FjCi0JICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtbCRuYW1lIgotCSAgICBjYXNlICIkZmluYWxpemVfY29tbWFuZCAiIGluCi0JICAgICoiIC1MJGRpciAiKikgOzsKLQkgICAgKikgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgLUwkZGlyIjs7Ci0JICAgIGVzYWMKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgLWwkbmFtZSIKLQkgIGZpCi0JZmkKLQotCSMgQWRkIGluIGFueSBsaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCi0JY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKLQlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCRkZXBlbmRlbmN5X2xpYnMiCi0JY29udGludWUKLQk7OwotCi0gICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgYXJndW1lbnQuCi0gICAgICAqKQotCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAotCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCi0JYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCWNhc2UgIiRhcmciIGluCi0JKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0JICBhcmc9IlwiJGFyZ1wiIgotCSAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBOb3cgYWN0dWFsbHkgc3Vic3RpdHV0ZSB0aGUgYXJndW1lbnQgaW50byB0aGUgY29tbWFuZHMuCi0gICAgICBpZiB0ZXN0IC1uICIkYXJnIjsgdGhlbgotCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0gICAgICBmaQotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdGhlIFxgJHByZXZhcmcnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgb2xkbGlicz0KLSAgICAjIGNhbGN1bGF0ZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgd2l0aG91dCBpdHMgZGlyZWN0b3J5Ci0gICAgb3V0cHV0bmFtZT1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0gICAgbGlib2Jqc19zYXZlPSIkbGlib2JqcyIKLQotICAgIGNhc2UgIiRvdXRwdXQiIGluCi0gICAgIiIpCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dCBmaWxlIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgICAgOzsKLQotICAgICouYSB8ICoubGliKQotICAgICAgaWYgdGVzdCAtbiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IGNhbm5vdCBsaW5rIGxpYnRvb2wgbGlicmFyaWVzIGludG8gYXJjaGl2ZXMiIDE+JjIKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkZXBsaWJzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJwYXRoJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1SJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZXhwb3J0LXN5bWJvbHMnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KLSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotICAgICAgb2xkbGlicz0iJG91dHB1dCIKLSAgICAgIDs7Ci0KLSAgICAqLmxhKQotICAgICAgIyBNYWtlIHN1cmUgd2Ugb25seSBnZW5lcmF0ZSBsaWJyYXJpZXMgb2YgdGhlIGZvcm0gYGxpYk5BTUUubGEnLgotICAgICAgY2FzZSAiJG91dHB1dG5hbWUiIGluCi0gICAgICBsaWIqKQotCW5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLycgLWUgJ3MvXmxpYi8vJ2AKLQlldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKLQk7OwotICAgICAgKikKLQlpZiB0ZXN0ICIkbW9kdWxlIiA9IG5vOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBtdXN0IGJlZ2luIHdpdGggXGBsaWInIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0JaWYgdGVzdCAiJG5lZWRfbGliX3ByZWZpeCIgIT0gbm87IHRoZW4KLQkgICMgQWRkIHRoZSAibGliIiBwcmVmaXggZm9yIG1vZHVsZXMgaWYgcmVxdWlyZWQKLQkgIG5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLydgCi0JICBldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKLQllbHNlCi0JICBsaWJuYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nYAotCWZpCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgb3V0cHV0X29iamRpcj1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICJYJG91dHB1dF9vYmpkaXIiID0gIlgkb3V0cHV0IjsgdGhlbgotCW91dHB1dF9vYmpkaXI9IiRvYmpkaXIiCi0gICAgICBlbHNlCi0Jb3V0cHV0X29iamRpcj0iJG91dHB1dF9vYmpkaXIvJG9iamRpciIKLSAgICAgIGZpCi0KLSAgICAgICMgQWxsIHRoZSBsaWJyYXJ5LXNwZWNpZmljIHZhcmlhYmxlcyAoaW5zdGFsbF9saWJkaXIgaXMgc2V0IGFib3ZlKS4KLSAgICAgIGxpYnJhcnlfbmFtZXM9Ci0gICAgICBvbGRfbGlicmFyeT0KLSAgICAgIGRsbmFtZT0KLQotICAgICAgaWYgdGVzdCAtbiAiJG9ianMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGJ1aWxkIGxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0czokb2JqcyIgMj4mMQotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgIyBIb3cgdGhlIGhlY2sgYXJlIHdlIHN1cHBvc2VkIHRvIHdyaXRlIGEgd3JhcHBlciBmb3IgYSBzaGFyZWQgbGlicmFyeT8KLSAgICAgIGlmIHRlc3QgLW4gIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIjsgdGhlbgotCSAkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogY2Fubm90IGxpbmsgc2hhcmVkIGxpYnJhcmllcyBpbnRvIGxpYnRvb2wgbGlicmFyaWVzIiAxPiYyCi0JIGV4aXQgMQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGxpYnRvb2wgbGlicmFyaWVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBzZXQgZHVtbXkgJHJwYXRoCi0gICAgICBpZiB0ZXN0ICQjIC1ndCAyOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogaWdub3JpbmcgbXVsdGlwbGUgXGAtcnBhdGgncyBmb3IgYSBsaWJ0b29sIGxpYnJhcnkiIDE+JjIKLSAgICAgIGZpCi0gICAgICBpbnN0YWxsX2xpYmRpcj0iJDIiCi0KLSAgICAgIG9sZGxpYnM9Ci0gICAgICBpZiB0ZXN0IC16ICIkcnBhdGgiOyB0aGVuCi0JaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQkgICMgQnVpbGRpbmcgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnkuCi0JICBsaWJleHQ9YWwKLQkgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQgJG9sZGxpYnMiCi0JICBidWlsZF9saWJ0b29sX2xpYnM9Y29udmVuaWVuY2UKLQkgIGJ1aWxkX29sZF9saWJzPXllcwotCWZpCi0JZGVwZW5kZW5jeV9saWJzPSIkZGVwbGlicyIKLQotCWlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzIiAxPiYyCi0JZmkKLQotCWlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzIiAxPiYyCi0JZmkKLSAgICAgIGVsc2UKLQotCSMgUGFyc2UgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYXJndW1lbnQuCi0JSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOicKLQlzZXQgZHVtbXkgJHZpbmZvIDAgMCAwCi0JSUZTPSIkc2F2ZV9pZnMiCi0KLQlpZiB0ZXN0IC1uICIkOCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHRvbyBtYW55IHBhcmFtZXRlcnMgdG8gXGAtdmVyc2lvbi1pbmZvJyIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCi0JY3VycmVudD0iJDIiCi0JcmV2aXNpb249IiQzIgotCWFnZT0iJDQiCi0KLQkjIENoZWNrIHRoYXQgZWFjaCBvZiB0aGUgdGhpbmdzIGFyZSB2YWxpZCBudW1iZXJzLgotCWNhc2UgIiRjdXJyZW50IiBpbgotCTAgfCBbMS05XSB8IFsxLTldWzAtOV0qKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBDVVJSRU5UIFxgJGN1cnJlbnQnIGlzIG5vdCBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLQotCWNhc2UgIiRyZXZpc2lvbiIgaW4KLQkwIHwgWzEtOV0gfCBbMS05XVswLTldKikgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogUkVWSVNJT04gXGAkcmV2aXNpb24nIGlzIG5vdCBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLQotCWNhc2UgIiRhZ2UiIGluCi0JMCB8IFsxLTldIHwgWzEtOV1bMC05XSopIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IEFHRSBcYCRhZ2UnIGlzIG5vdCBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLQotCWlmIHRlc3QgJGFnZSAtZ3QgJGN1cnJlbnQ7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IEFHRSBcYCRhZ2UnIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBpbnRlcmZhY2UgbnVtYmVyIFxgJGN1cnJlbnQnIiAxPiYyCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQkjIENhbGN1bGF0ZSB0aGUgdmVyc2lvbiB2YXJpYWJsZXMuCi0JbWFqb3I9Ci0JdmVyc3VmZml4PQotCXZlcnN0cmluZz0KLQljYXNlICIkdmVyc2lvbl90eXBlIiBpbgotCW5vbmUpIDs7Ci0KLQlpcml4KQotCSAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlICsgMWAKLQkgIHZlcnN1ZmZpeD0iJG1ham9yLiRyZXZpc2lvbiIKLQkgIHZlcnN0cmluZz0ic2dpJG1ham9yLiRyZXZpc2lvbiIKLQotCSAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KLQkgIGxvb3A9JHJldmlzaW9uCi0JICB3aGlsZSB0ZXN0ICRsb29wICE9IDA7IGRvCi0JICAgIGlmYWNlPWBleHByICRyZXZpc2lvbiAtICRsb29wYAotCSAgICBsb29wPWBleHByICRsb29wIC0gMWAKLQkgICAgdmVyc3RyaW5nPSJzZ2kkbWFqb3IuJGlmYWNlOiR2ZXJzdHJpbmciCi0JICBkb25lCi0JICA7OwotCi0JbGludXgpCi0JICBtYWpvcj0uYGV4cHIgJGN1cnJlbnQgLSAkYWdlYAotCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCi0JICA7OwotCi0Jb3NmKQotCSAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlYAotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCi0JICB2ZXJzdHJpbmc9IiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgotCi0JICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgotCSAgbG9vcD0kYWdlCi0JICB3aGlsZSB0ZXN0ICRsb29wICE9IDA7IGRvCi0JICAgIGlmYWNlPWBleHByICRjdXJyZW50IC0gJGxvb3BgCi0JICAgIGxvb3A9YGV4cHIgJGxvb3AgLSAxYAotCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtpZmFjZX0uMCIKLQkgIGRvbmUKLQotCSAgIyBNYWtlIGV4ZWN1dGFibGVzIGRlcGVuZCBvbiBvdXIgY3VycmVudCB2ZXJzaW9uLgotCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7Y3VycmVudH0uMCIKLQkgIDs7Ci0KLQlzdW5vcykKLQkgIG1ham9yPSIuJGN1cnJlbnQiCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iCi0JICA7OwotCi0JZnJlZWJzZC1hb3V0KQotCSAgbWFqb3I9Ii4kY3VycmVudCIKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiI7Ci0JICA7OwotCi0JZnJlZWJzZC1lbGYpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQiOwotCSAgOzsKLQotCXdpbmRvd3MpCi0JICAjIExpa2UgTGludXgsIGJ1dCB3aXRoICctJyByYXRoZXIgdGhhbiAnLicsIHNpbmNlIHdlIG9ubHkKLQkgICMgd2FudCBvbmUgZXh0ZW5zaW9uIG9uIFdpbmRvd3MgOTUuCi0JICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9Ii0kbWFqb3ItJGFnZS0kcmV2aXNpb24iCi0JICA7OwotCi0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IHVua25vd24gbGlicmFyeSB2ZXJzaW9uIHR5cGUgXGAkdmVyc2lvbl90eXBlJyIgMT4mMgotCSAgZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0KLQkjIENsZWFyIHRoZSB2ZXJzaW9uIGluZm8gaWYgd2UgZGVmYXVsdGVkLCBhbmQgdGhleSBzcGVjaWZpZWQgYSByZWxlYXNlLgotCWlmIHRlc3QgLXogIiR2aW5mbyIgJiYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JICBtYWpvcj0KLQkgIHZlcnN0cmluZz0iMC4wIgotCSAgaWYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgotCSAgICB2ZXJzdWZmaXg9Ci0JICBlbHNlCi0JICAgIHZlcnN1ZmZpeD0iLjAuMCIKLQkgIGZpCi0JZmkKLQotCSMgUmVtb3ZlIHZlcnNpb24gaW5mbyBmcm9tIG5hbWUgaWYgdmVyc2lvbmluZyBzaG91bGQgYmUgYXZvaWRlZAotCWlmIHRlc3QgIiRhdm9pZF92ZXJzaW9uIiA9IHllcyAmJiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCi0JICBtYWpvcj0KLQkgIHZlcnN1ZmZpeD0KLQkgIHZlcnN0cmluZz0iIgotCWZpCi0JCi0JIyBDaGVjayB0byBzZWUgaWYgdGhlIGFyY2hpdmUgd2lsbCBoYXZlIHVuZGVmaW5lZCBzeW1ib2xzLgotCWlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0geWVzOyB0aGVuCi0JICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciID0gdW5zdXBwb3J0ZWQ7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogdW5kZWZpbmVkIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gJGhvc3Qgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgotCSAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLQkgICAgYnVpbGRfb2xkX2xpYnM9eWVzCi0JICBmaQotCWVsc2UKLQkgICMgRG9uJ3QgYWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMuCi0JICBhbGxvd191bmRlZmluZWRfZmxhZz0iJG5vX3VuZGVmaW5lZF9mbGFnIgotCWZpCi0KLQlkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWJzIgotCWNhc2UgIiRob3N0IiBpbgotCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1vczIqKQotCSAgIyB0aGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBjIGxpYnJhcnkgKGFzIHN1Y2gpIQotCSAgOzsKLQkqKQotCSAgIyBBZGQgbGliYyB0byBkZXBsaWJzIG9uIGFsbCBvdGhlciBzeXN0ZW1zLgotCSAgZGVwbGlicz0iJGRlcGxpYnMgLWxjIgotCSAgOzsKLQllc2FjCi0gICAgICBmaQotCi0gICAgICAjIENyZWF0ZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSwgb3IgcmVtb3ZlIG91ciBvdXRwdXRzIGlmIHdlIG5lZWQgdG8uCi0gICAgICBpZiB0ZXN0IC1kICRvdXRwdXRfb2JqZGlyOyB0aGVuCi0JJHNob3cgIiR7cm19ciAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSAkb3V0cHV0X29iamRpci8kbGlibmFtZS4qICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LioiCi0JJHJ1biAke3JtfXIgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuKiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9JHtyZWxlYXNlfS4qCi0gICAgICBlbHNlCi0JJHNob3cgIiRta2RpciAkb3V0cHV0X29iamRpciIKLQkkcnVuICRta2RpciAkb3V0cHV0X29iamRpcgotCXN0YXR1cz0kPwotCWlmIHRlc3QgJHN0YXR1cyAtbmUgMCAmJiB0ZXN0ICEgLWQgJG91dHB1dF9vYmpkaXI7IHRoZW4KLQkgIGV4aXQgJHN0YXR1cwotCWZpCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0gY29udmVuaWVuY2UgOyB0aGVuCi0Jb2xkbGlicz0iJG9sZGxpYnMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKLQotCSMgVHJhbnNmb3JtIC5sbyBmaWxlcyB0byAubyBmaWxlcy4KLQlvbGRvYmpzPSIkb2JqcyAiYCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0nJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQkjIFRyYW5zZm9ybSBkZXBsaWJzIGludG8gb25seSBkZXBsaWJzIHRoYXQgY2FuIGJlIGxpbmtlZCBpbiBzaGFyZWQuCi0JbmFtZV9zYXZlPSRuYW1lCi0JbGlibmFtZV9zYXZlPSRsaWJuYW1lCi0JcmVsZWFzZV9zYXZlPSRyZWxlYXNlCi0JdmVyc3VmZml4X3NhdmU9JHZlcnN1ZmZpeAotCW1ham9yX3NhdmU9JG1ham9yCi0JIyBJJ20gbm90IHN1cmUgaWYgSSdtIHRyZWF0aW5nIHRoZSByZWxlYXNlIGNvcnJlY3RseS4gIEkgdGhpbmsKLQkjIHJlbGVhc2Ugc2hvdWxkIHNob3cgdXAgaW4gdGhlIC1sIChpZSAtbGdtcDUpIHNvIHdlIGRvbid0IHdhbnQgdG8KLQkjIGFkZCBpdCBpbiB0d2ljZS4gIElzIHRoYXQgY29ycmVjdD8KLQlyZWxlYXNlPSIiCi0JdmVyc3VmZml4PSIiCi0JbWFqb3I9IiIKLQluZXdkZXBsaWJzPQotCWRyb3BwZWRkZXBzPW5vCi0JY2FzZSAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiBpbgotCXBhc3NfYWxsKQotCSAgbmV3ZGVwbGlicz0kZGVwbGlicwotCQkgICAgOzsgIyBEb24ndCBjaGVjayBmb3Igc2hhcmVkL3N0YXRpYy4gIEV2ZXJ5dGhpbmcgd29ya3MuCi0JCSAgICAgICAjIFRoaXMgbWlnaHQgYmUgYSBsaXR0bGUgbmFpdmUuICBXZSBtaWdodCB3YW50IHRvIGNoZWNrCi0JCSAgICAgICAjIHdoZXRoZXIgdGhlIGxpYnJhcnkgZXhpc3RzIG9yIG5vdC4gIEJ1dCB0aGlzIGlzIG9uCi0JCSAgICAgICAjIG9zZjMgJiBvc2Y0IGFuZCBJJ20gbm90IHJlYWxseSBzdXJlLi4uIEp1c3QKLQkJICAgICAgICMgaW1wbGVtZW50aW5nIHdoYXQgd2FzIGFscmVhZHkgdGhlIGJlaGF2aW91ci4KLQl0ZXN0X2NvbXBpbGUpCi0JICAjIFRoaXMgY29kZSBzdHJlc3NlcyB0aGUgImxpYnJhcmllcyBhcmUgcHJvZ3JhbXMiIHBhcmFkaWdtIHRvIGl0cwotCSAgIyBsaW1pdHMuIE1heWJlIGV2ZW4gYnJlYWtzIGl0LiAgV2UgY29tcGlsZSBhIHByb2dyYW0sIGxpbmtpbmcgaXQKLQkgICMgYWdhaW5zdCB0aGUgZGVwbGlicyBhcyBhIHByb3h5IGZvciB0aGUgbGlicmFyeS4gIFRoZW4gd2UgY2FuIGNoZWNrCi0JICAjIHdoZXRoZXIgdGhleSBsaW5rZWQgaW4gc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIGxkZC4KLQkgICRybSBjb25mdGVzdC5jCi0JICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0JICBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KLUVPRgotCSAgJHJtIGNvbmZ0ZXN0Ci0JICAkQ19jb21waWxlciAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRkZXBsaWJzCi0JICBpZiB0ZXN0ICQ/IC1lcSAwIDsgdGhlbgotCSAgICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCi0JICAgIGZvciBpIGluICRkZXBsaWJzOyBkbwotCSAgICAgIG5hbWU9ImBleHByICRpIDogJy1sXCguKlwpJ2AiCi0JICAgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCi0JICAgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiIDsgdGhlbgotCQlsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCi0JCWRlcGxpYl9tYXRjaGVzPWBldmFsIFxcJGVjaG8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCJgCi0JCXNldCBkdW1teSAkZGVwbGliX21hdGNoZXMKLQkJZGVwbGliX21hdGNoPSQyCi0JCWlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KLQkJICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkJZWxzZQotCQkgIGRyb3BwZWRkZXBzPXllcwotCQkgIGVjaG8KLQkJICBlY2hvICIqKiogV2FybmluZzogVGhpcyBsaWJyYXJ5IG5lZWRzIHNvbWUgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSAkaS4iCi0JCSAgZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJICBlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQkgIGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCi0JCWZpCi0JICAgICAgZWxzZQotCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkgICAgICBmaQotCSAgICBkb25lCi0JICBlbHNlCi0JICAgICMgRXJyb3Igb2NjdXJlZCBpbiB0aGUgZmlyc3QgY29tcGlsZS4gIExldCdzIHRyeSB0byBzYWx2YWdlIHRoZSBzaXR1YXRpb246Ci0JICAgICMgQ29tcGlsZSBhIHNlcGVyYXRlIHByb2dyYW0gZm9yIGVhY2ggbGlicmFyeS4KLQkgICAgZm9yIGkgaW4gJGRlcGxpYnM7IGRvCi0JICAgICAgbmFtZT0iYGV4cHIgJGkgOiAnLWxcKC4qXCknYCIKLQkgICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgotCSAgICAgIGlmIHRlc3QgIiRuYW1lIiAhPSAiIiA7IHRoZW4KLQkJJHJtIGNvbmZ0ZXN0Ci0JCSRDX2NvbXBpbGVyIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGkKLQkJIyBEaWQgaXQgd29yaz8KLQkJaWYgdGVzdCAkPyAtZXEgMCA7IHRoZW4KLQkJICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCi0JCSAgICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCi0JCSAgICBkZXBsaWJfbWF0Y2hlcz1gZXZhbCBcXCRlY2hvIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiYAotCQkgICAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlcwotCQkgICAgZGVwbGliX21hdGNoPSQyCi0JCSAgICBpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCi0JCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQkgICAgZWxzZQotCQkgICAgICBkcm9wcGVkZGVwcz15ZXMKLQkJICAgICAgZWNobwotCQkgICAgICBlY2hvICIqKiogV2FybmluZzogVGhpcyBsaWJyYXJ5IG5lZWRzIHNvbWUgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSAkaS4iCi0JCSAgICAgIGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCSAgICAgIGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCSAgICAgIGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCi0JCSAgICBmaQotCQllbHNlCi0JCSAgZHJvcHBlZGRlcHM9eWVzCi0JCSAgZWNobwotCQkgIGVjaG8gIioqKiBXYXJuaW5nISAgTGlicmFyeSAkaSBpcyBuZWVkZWQgYnkgdGhpcyBsaWJyYXJ5IGJ1dCBJIHdhcyBub3QgYWJsZSB0byIKLQkJICBlY2hvICIqKiogIG1ha2UgaXQgbGluayBpbiEgIFlvdSB3aWxsIHByb2JhYmx5IG5lZWQgdG8gaW5zdGFsbCBpdCBvciBzb21lIgotCQkgIGVjaG8gIioqKiBsaWJyYXJ5IHRoYXQgaXQgZGVwZW5kcyBvbiBiZWZvcmUgdGhpcyBsaWJyYXJ5IHdpbGwgYmUgZnVsbHkiCi0JCSAgZWNobyAiKioqIGZ1bmN0aW9uYWwuICBJbnN0YWxsaW5nIGl0IGJlZm9yZSBjb250aW51aW5nIHdvdWxkIGJlIGV2ZW4gYmV0dGVyLiIKLQkJZmkKLQkgICAgICBlbHNlCi0JCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGZpCi0JICBkZXBsaWJzPSRuZXdkZXBsaWJzCi0JICA7OwotCWZpbGVfbWFnaWMqKQotCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZAotCSAgZmlsZV9tYWdpY19yZWdleD0iYGV4cHIgXCIkZGVwbGlic19jaGVja19tZXRob2RcIiA6IFwiJDIgXCguKlwpXCJgIgotCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbwotCSAgICBuYW1lPSJgZXhwciAkYV9kZXBsaWIgOiAnLWxcKC4qXCknYCIKLQkgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCi0JICAgIGlmIHRlc3QgIiRuYW1lIiAhPSAiIiA7IHRoZW4KLQkgICAgICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCi0JICAgICAgZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aDsgZG8KLQkJICAgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZVsuLV0qIDI+L2Rldi9udWxsYAotCQkgICAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbwotCQkgICAgICAjIEZvbGxvdyBzb2Z0IGxpbmtzLgotCQkgICAgICBpZiBscyAtbExkICIkcG90bGliIiAyPi9kZXYvbnVsbCBcCi0JCQkgfCBncmVwICIgLT4gIiA+L2Rldi9udWxsOyB0aGVuCi0JCQljb250aW51ZSAKLQkJICAgICAgZmkKLQkJICAgICAgIyBUaGUgc3RhdGVtZW50IGFib3ZlIHRyaWVzIHRvIGF2b2lkIGVudGVyaW5nIGFuCi0JCSAgICAgICMgZW5kbGVzcyBsb29wIGJlbG93LCBpbiBjYXNlIG9mIGN5Y2xpYyBsaW5rcy4KLQkJICAgICAgIyBXZSBtaWdodCBzdGlsbCBlbnRlciBhbiBlbmRsZXNzIGxvb3AsIHNpbmNlIGEgbGluawotCQkgICAgICAjIGxvb3AgY2FuIGJlIGNsb3NlZCB3aGlsZSB3ZSBmb2xsb3cgbGlua3MsCi0JCSAgICAgICMgYnV0IHNvIHdoYXQ/Ci0JCSAgICAgIHBvdGxpYj0iJHBvdGVudF9saWIiCi0JCSAgICAgIHdoaWxlIHRlc3QgLWggIiRwb3RsaWIiIDI+L2Rldi9udWxsOyBkbwotCQkJcG90bGlibGluaz1gbHMgLWxkICRwb3RsaWIgfCBzZWQgJ3MvLiogLT4gLy8nYAotCQkJY2FzZSAiJHBvdGxpYmxpbmsiIGluCi0JCQkvKikgcG90bGliPSIkcG90bGlibGluayI7OwotCQkJKikgcG90bGliPWAkZWNobyAiWCRwb3RsaWIiIHwgJFhzZWQgLWUgJ3MsW14vXSokLCwnYCIkcG90bGlibGluayI7OwotCQkJZXNhYwotCQkgICAgICBkb25lCi0JCSAgICAgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwiXCRwb3RsaWJcIiBcCi0JCQkgfCBzZWQgMTBxIFwKLQkJCSB8IGVncmVwICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkJCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkJCWFfZGVwbGliPSIiCi0JCQlicmVhayAyCi0JCSAgICAgIGZpCi0JCSAgICBkb25lCi0JICAgICAgZG9uZQotCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCi0JCWRyb3BwZWRkZXBzPXllcwotCQllY2hvCi0JCWVjaG8gIioqKiBXYXJuaW5nOiBUaGlzIGxpYnJhcnkgbmVlZHMgc29tZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5ICRhX2RlcGxpYi4iCi0JCWVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCWVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCWVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCi0JICAgICAgZmkKLQkgICAgZWxzZQotCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCi0JICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCSAgICBmaQotCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KLQkgIDs7Ci0Jbm9uZSB8IHVua25vd24gfCAqKSBuZXdkZXBsaWJzPSIiCi0JICBpZiAkZWNobyAiWCAkZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjJC8vJyBcCi0JICAgICAgIC1lICdzLyAtW0xSXVteIF0qLy9nJyAtZSAncy9bIAldLy9nJyB8Ci0JICAgICBncmVwIC4gPi9kZXYvbnVsbDsgdGhlbgotCSAgICBlY2hvCi0JICAgIGlmIHRlc3QgIlgkZGVwbGlic19jaGVja19tZXRob2QiID0gIlhub25lIjsgdGhlbgotCSAgICAgIGVjaG8gIioqKiBXYXJuaW5nOiBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHBsYXRmb3JtLiIKLQkgICAgZWxzZQotCSAgICAgIGVjaG8gIioqKiBXYXJuaW5nOiBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgbm90IGtub3duIHRvIGJlIHN1cHBvcnRlZC4iCi0JICAgIGZpCi0JICAgIGVjaG8gIioqKiBBbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIGRyb3BwZWQuIgotCSAgICBkcm9wcGVkZGVwcz15ZXMKLQkgIGZpCi0JICA7OwotCWVzYWMKLQl2ZXJzdWZmaXg9JHZlcnN1ZmZpeF9zYXZlCi0JbWFqb3I9JG1ham9yX3NhdmUKLQlyZWxlYXNlPSRyZWxlYXNlX3NhdmUKLQlsaWJuYW1lPSRsaWJuYW1lX3NhdmUKLQluYW1lPSRuYW1lX3NhdmUKLQotCWlmIHRlc3QgIiRkcm9wcGVkZGVwcyIgPSB5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCi0JICAgIGVjaG8KLQkgICAgZWNobyAiKioqIFdhcm5pbmc6IGxpYnRvb2wgY291bGQgbm90IHNhdGlzZnkgYWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkiCi0JICAgIGVjaG8gIioqKiBkZXBlbmRlbmNpZXMgb2YgbW9kdWxlICRsaWJuYW1lLiAgVGhlcmVmb3JlLCBsaWJ0b29sIHdpbGwgY3JlYXRlIgotCSAgICBlY2hvICIqKiogYSBzdGF0aWMgbW9kdWxlLCB0aGF0IHNob3VsZCB3b3JrIGFzIGxvbmcgYXMgdGhlIGRsb3BlbmluZyIKLQkgICAgZWNobyAiKioqIGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcuIgotCSAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotCSAgICAgIGVjaG8KLQkgICAgICBlY2hvICIqKiogSG93ZXZlciwgdGhpcyB3b3VsZCBvbmx5IHdvcmsgaWYgbGlidG9vbCB3YXMgYWJsZSB0byBleHRyYWN0IHN5bWJvbCIKLQkgICAgICBlY2hvICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgotCSAgICAgIGVjaG8gIioqKiBub3QgZmluZCBzdWNoIGEgcHJvZ3JhbS4gIFNvLCB0aGlzIG1vZHVsZSBpcyBwcm9iYWJseSB1c2VsZXNzLiIKLQkgICAgICBlY2hvICIqKiogXGBubScgZnJvbSBHTlUgYmludXRpbHMgYW5kIGEgZnVsbCByZWJ1aWxkIG1heSBoZWxwLiIKLQkgICAgZmkKLQkgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCi0JICAgICAgb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKLQkgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCi0JICAgICAgYnVpbGRfb2xkX2xpYnM9eWVzCi0JICAgIGVsc2UKLQkgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLQkgICAgZmkKLQkgICAgZGxuYW1lPQotCSAgICBsaWJyYXJ5X25hbWVzPQotCSAgZWxzZQotCSAgICBlY2hvICIqKiogVGhlIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIHRoYXQgaGF2ZSBiZWVuIGRyb3BwZWQgaGVyZSB3aWxsIGJlIgotCSAgICBlY2hvICIqKiogYXV0b21hdGljYWxseSBhZGRlZCB3aGVuZXZlciBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggdGhpcyBsaWJyYXJ5IgotCSAgICBlY2hvICIqKiogb3IgaXMgZGVjbGFyZWQgdG8gLWRsb3BlbiBpdC4iCi0JICBmaQotCWZpCi0gICAgICBmaQotCi0gICAgICAjIHRlc3QgYWdhaW4sIHdlIG1heSBoYXZlIGRlY2lkZWQgbm90IHRvIGJ1aWxkIGl0IGFueSBtb3JlCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCWRlcGxpYnM9JG5ld2RlcGxpYnMKLQkjIERvbmUgY2hlY2tpbmcgZGVwbGlicyEKLSAKLQkjIEdldCB0aGUgcmVhbCBhbmQgbGluayBuYW1lcyBvZiB0aGUgbGlicmFyeS4KLQlldmFsIGxpYnJhcnlfbmFtZXM9XCIkbGlicmFyeV9uYW1lc19zcGVjXCIKLQlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKLQlyZWFsbmFtZT0iJDIiCi0Jc2hpZnQ7IHNoaWZ0Ci0KLQlpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCi0JICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCi0JZWxzZQotCSAgc29uYW1lPSIkcmVhbG5hbWUiCi0JZmkKLQotCWxpYj0iJG91dHB1dF9vYmpkaXIvJHJlYWxuYW1lIgotCWZvciBsaW5rCi0JZG8KLQkgIGxpbmtuYW1lcz0iJGxpbmtuYW1lcyAkbGluayIKLQlkb25lCi0KLQkjIEVuc3VyZSB0aGF0IHdlIGhhdmUgLm8gb2JqZWN0cyBmb3IgbGlua2VycyB3aGljaCBkaXNsaWtlIC5sbwotCSMgKGUuZy4gYWl4KSBpbmNhc2Ugd2UgYXJlIHJ1bm5pbmcgLS1kaXNhYmxlLXN0YXRpYwotCWZvciBvYmogaW4gJGxpYm9ianM7IGRvCi0JICBvbGRvYmo9YCRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCSAgdGVzdCAtZiAkb2xkb2JqIHx8ICR7TE5fU30gJG9iaiAkb2xkb2JqCi0JZG9uZQotCi0JIyBVc2Ugc3RhbmRhcmQgb2JqZWN0cyBpZiB0aGV5IGFyZSBwaWMKLQl0ZXN0IC16ICIkcGljX2ZsYWciICYmIGxpYm9ianM9YCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQotCWlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KLQkgICAgZXZhbCBsaWJvYmpzPVwiXCRsaWJvYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCi0JICBmaQotCWVsc2UKLQkgIGZvciB4bGliIGluICRjb252ZW5pZW5jZTsgZG8KLQkgICAgIyBFeHRyYWN0IHRoZSBvYmplY3RzLgotCSAgICB4ZGlyPSIkeGxpYiJ4Ci0JICAgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkeGRpciIKLQkgICAgeGxpYj1gJGVjaG8gIlgkeGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0JICAgICRzaG93ICIke3JtfXIgJHhkaXIiCi0JICAgICRydW4gJHtybX1yICIkeGRpciIKLQkgICAgJHNob3cgIm1rZGlyICR4ZGlyIgotCSAgICAkcnVuIG1rZGlyICIkeGRpciIKLQkgICAgc3RhdHVzPSQ/Ci0JICAgIGlmIHRlc3QgJHN0YXR1cyAtbmUgMCAmJiB0ZXN0ICEgLWQgIiR4ZGlyIjsgdGhlbgotCSAgICAgIGV4aXQgJHN0YXR1cwotCSAgICBmaQotCSAgICAkc2hvdyAiKGNkICR4ZGlyICYmICRBUiB4IC4uLyR4bGliKSIKLQkgICAgJHJ1biBldmFsICIoY2QgXCR4ZGlyICYmICRBUiB4IC4uL1wkeGxpYikiIHx8IGV4aXQgJD8KLQotCSAgICBsaWJvYmpzPSIkbGlib2JqcyAiYGZpbmQgJHhkaXIgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJE5MMlNQYAotCSAgZG9uZQotCWZpCi0KLQlpZiB0ZXN0ICIkdGhyZWFkX3NhZmUiID0geWVzICYmIHRlc3QgLW4gIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWMiOyB0aGVuCi0JICBldmFsIGZsYWc9XCIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjXCIKLQotCSAgbGlua29wdHM9IiRsaW5rb3B0cyAkZmxhZyIKLQlmaQotCi0JIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKLQlpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICBpZiB0ZXN0ICIkYWx3YXlzX2V4cG9ydF9zeW1ib2xzIiA9IHllcyB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKLQkgICAgZXhwb3J0X3N5bWJvbHM9IiRvYmpkaXIvJGxpYm5hbWUuZXhwIgotCSAgICAkcnVuICRybSAkZXhwb3J0X3N5bWJvbHMKLQkgICAgZXZhbCBjbWRzPVwiJGV4cG9ydF9zeW1ib2xzX2NtZHNcIgotCSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICAgICRzaG93ICIkY21kIgotCSAgICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCSAgICBkb25lCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAgICAgJHNob3cgImVncmVwIC1lIFwiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4XCIgXCIkZXhwb3J0X3N5bWJvbHNcIiA+IFwiJHtleHBvcnRfc3ltYm9sc31UXCIiCi0JICAgICAgJHJ1biBldmFsICdlZ3JlcCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJGV4cG9ydF9zeW1ib2xzIiA+ICIke2V4cG9ydF9zeW1ib2xzfVQiJwotCSAgICAgICRzaG93ICIkbXYgXCIke2V4cG9ydF9zeW1ib2xzfVRcIiBcIiRleHBvcnRfc3ltYm9sc1wiIgotCSAgICAgICRydW4gZXZhbCAnJG12ICIke2V4cG9ydF9zeW1ib2xzfVQiICIkZXhwb3J0X3N5bWJvbHMiJwotCSAgICBmaQotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkaW5jbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgJHJ1biBldmFsICckZWNobyAiWCRpbmNsdWRlX2V4cHN5bXMiIHwgJFNQMk5MID4+ICIkZXhwb3J0X3N5bWJvbHMiJwotCWZpCi0KLQkjIERvIGVhY2ggb2YgdGhlIGFyY2hpdmUgY29tbWFuZHMuCi0JaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkYXJjaGl2ZV9leHBzeW1fY21kcyI7IHRoZW4KLQkgIGV2YWwgY21kcz1cIiRhcmNoaXZlX2V4cHN5bV9jbWRzXCIKLQllbHNlCi0JICBldmFsIGNtZHM9XCIkYXJjaGl2ZV9jbWRzXCIKLQlmaQotCUlGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgIElGUz0iJHNhdmVfaWZzIgotCSAgJHNob3cgIiRjbWQiCi0JICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQlkb25lCi0JSUZTPSIkc2F2ZV9pZnMiCi0KLQkjIENyZWF0ZSBsaW5rcyB0byB0aGUgcmVhbCBsaWJyYXJ5LgotCWZvciBsaW5rbmFtZSBpbiAkbGlua25hbWVzOyBkbwotCSAgaWYgdGVzdCAiJHJlYWxuYW1lIiAhPSAiJGxpbmtuYW1lIjsgdGhlbgotCSAgICAkc2hvdyAiKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCi0JICAgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSknIHx8IGV4aXQgJD8KLQkgIGZpCi0JZG9uZQotCi0JIyBJZiAtbW9kdWxlIG9yIC1leHBvcnQtZHluYW1pYyB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGRsbmFtZS4KLQlpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyB8fCB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiID0geWVzOyB0aGVuCi0JICAjIE9uIGFsbCBrbm93biBvcGVyYXRpbmcgc3lzdGVtcywgdGhlc2UgYXJlIGlkZW50aWNhbC4KLQkgIGRsbmFtZT0iJHNvbmFtZSIKLQlmaQotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICAqLmxvIHwgKi5vIHwgKi5vYmopCi0gICAgICBpZiB0ZXN0IC1uICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogY2Fubm90IGxpbmsgbGlidG9vbCBsaWJyYXJpZXMgaW50byBvYmplY3RzIiAxPiYyCi0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGVwbGlicyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1sJyBhbmQgXGAtTCcgYXJlIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtUicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgY2FzZSAiJG91dHB1dCIgaW4KLSAgICAgICoubG8pCi0JaWYgdGVzdCAtbiAiJG9ianMiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlicmFyeSBvYmplY3QgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0JbGlib2JqPSIkb3V0cHV0IgotCW9iaj1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JOzsKLSAgICAgICopCi0JbGlib2JqPQotCW9iaj0iJG91dHB1dCIKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIERlbGV0ZSB0aGUgb2xkIG9iamVjdHMuCi0gICAgICAkcnVuICRybSAkb2JqICRsaWJvYmoKLQotICAgICAgIyBDcmVhdGUgdGhlIG9sZC1zdHlsZSBvYmplY3QuCi0gICAgICByZWxvYWRfb2Jqcz0iJG9ianMgImAkZWNobyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JCcvZCcgLWUgJy9cLmxpYiQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQotICAgICAgb3V0cHV0PSIkb2JqIgotICAgICAgZXZhbCBjbWRzPVwiJHJlbG9hZF9jbWRzXCIKLSAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0gICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCUlGUz0iJHNhdmVfaWZzIgotCSRzaG93ICIkY21kIgotCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgZG9uZQotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgICAgICMgRXhpdCBpZiB3ZSBhcmVuJ3QgZG9pbmcgYSBsaWJyYXJ5IG9iamVjdCBmaWxlLgotICAgICAgdGVzdCAteiAiJGxpYm9iaiIgJiYgZXhpdCAwCi0KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotCSMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvbid0Ci0JIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KLQkkc2hvdyAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIgotCSRydW4gZXZhbCAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIiB8fCBleGl0ICQ/Ci0JZXhpdCAwCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcGljX2ZsYWciOyB0aGVuCi0JIyBPbmx5IGRvIGNvbW1hbmRzIGlmIHdlIHJlYWxseSBoYXZlIGRpZmZlcmVudCBQSUMgb2JqZWN0cy4KLQlyZWxvYWRfb2Jqcz0iJGxpYm9ianMiCi0Jb3V0cHV0PSIkbGlib2JqIgotCWV2YWwgY21kcz1cIiRyZWxvYWRfY21kc1wiCi0JSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQlmb3IgY21kIGluICRjbWRzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICAkc2hvdyAiJGNtZCIKLQkgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLSAgICAgIGVsc2UKLQkjIEp1c3QgY3JlYXRlIGEgc3ltbGluay4KLQkkc2hvdyAkcm0gJGxpYm9iagotCSRydW4gJHJtICRsaWJvYmoKLQkkc2hvdyAiJExOX1MgJG9iaiAkbGlib2JqIgotCSRydW4gJExOX1MgJG9iaiAkbGlib2JqIHx8IGV4aXQgJD8KLSAgICAgIGZpCi0KLSAgICAgIGV4aXQgMAotICAgICAgOzsKLQotICAgICMgQW55dGhpbmcgZWxzZSBzaG91bGQgYmUgYSBwcm9ncmFtLgotICAgICopCi0gICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRwcmVsb2FkIiA9IHllczsgdGhlbgotCWlmIHRlc3QgIiRkbG9wZW4iID0gdW5rbm93biAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiID0gdW5rbm93biAmJgotCSAgIHRlc3QgIiRkbG9wZW5fc2VsZl9zdGF0aWMiID0gdW5rbm93bjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGBBQ19MSUJUT09MX0RMT1BFTicgbm90IHVzZWQuIEFzc3VtaW5nIG5vIGRsb3BlbiBzdXBwb3J0LiIKLQlmaSAKLSAgICAgIGZpCi0gICAgCi0gICAgICBpZiB0ZXN0ICIkZGxzZWxmIiA9IHllcyAmJiB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiID0gbm87IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogXGAtZGxvcGVuIHNlbGYnIHJlcXVpcmVzIFxgLWV4cG9ydC1keW5hbWljJyIgMT4mMgotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoJHhycGF0aCI7IHRoZW4KLQkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCi0JZm9yIGxpYmRpciBpbiAkcnBhdGggJHhycGF0aDsgZG8KLQkgICMgVGhpcyBpcyB0aGUgbWFnaWMgdG8gdXNlIC1ycGF0aC4KLQkgIGNhc2UgIiRjb21waWxlX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZG9uZQotICAgICAgZmkKLQotICAgICAgIyBOb3cgaGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aHMKLSAgICAgIHJwYXRoPQotICAgICAgaGFyZGNvZGVfbGliZGlycz0KLSAgICAgIGZvciBsaWJkaXIgaW4gJGNvbXBpbGVfcnBhdGggJGZpbmFsaXplX3JwYXRoOyBkbwotCWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCi0JICAgIGVsc2UKLQkgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCi0JICAgICAgY2FzZSAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiBpbgotCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKLQkJOzsKLQkgICAgICAqKQotCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQotCSAgICBycGF0aD0iJHJwYXRoICRmbGFnIgotCSAgZmkKLQllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQkgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCWZpCi0gICAgICBkb25lCi0gICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgotICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCi0JIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCi0JZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0gICAgICBmaQotICAgICAgY29tcGlsZV9ycGF0aD0iJHJwYXRoIgotCi0gICAgICBycGF0aD0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9Ci0gICAgICBmb3IgbGliZGlyIGluICRmaW5hbGl6ZV9ycGF0aDsgZG8KLQlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgotCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgotCSAgICBlbHNlCi0JICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgotCSAgICAgIGNhc2UgIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgaW4KLQkgICAgICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCi0JCTs7Ci0JICAgICAgKikKLQkJaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgZWxzZQotCSAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0KLQkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKLQkgIGZpCi0JZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JICBjYXNlICIkZmluYWxpemVfcGVybV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgZmluYWxpemVfcGVybV9ycGF0aD0iJGZpbmFsaXplX3Blcm1fcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotICAgICAgZG9uZQotICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KLSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgotCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotICAgICAgZmkKLSAgICAgIGZpbmFsaXplX3JwYXRoPSIkcnBhdGgiCi0KLSAgICAgIG91dHB1dF9vYmpkaXI9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiWCRvdXRwdXRfb2JqZGlyIiA9ICJYJG91dHB1dCI7IHRoZW4KLQlvdXRwdXRfb2JqZGlyPSIkb2JqZGlyIgotICAgICAgZWxzZQotCW91dHB1dF9vYmpkaXI9IiRvdXRwdXRfb2JqZGlyLyRvYmpkaXIiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkbGlib2JqcyIgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSMgVHJhbnNmb3JtIGFsbCB0aGUgbGlicmFyeSBvYmplY3RzIGludG8gc3RhbmRhcmQgb2JqZWN0cy4KLQljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCWZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLSAgICAgIGZpCi0KLSAgICAgIGRsc3ltcz0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiID0geWVzOyB0aGVuCi0JaWYgdGVzdCAtbiAiJE5NIiAmJiB0ZXN0IC1uICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotCSAgZGxzeW1zPSIke291dHB1dG5hbWV9Uy5jIgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IG5vdCBjb25maWd1cmVkIHRvIGV4dHJhY3QgZ2xvYmFsIHN5bWJvbHMgZnJvbSBkbHByZW9wZW5lZCBmaWxlcyIgMT4mMgotCWZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxzeW1zIjsgdGhlbgotCWNhc2UgIiRkbHN5bXMiIGluCi0JIiIpIDs7Ci0JKi5jKQotCSAgIyBEaXNjb3ZlciB0aGUgbmxpc3Qgb2YgZWFjaCBvZiB0aGUgZGxmaWxlcy4KLQkgIG5saXN0PSIkb2JqZGlyLyR7b3V0cHV0fS5ubSIKLQotCSAgaWYgdGVzdCAtZCAkb2JqZGlyOyB0aGVuCi0JICAgICRzaG93ICIkcm0gJG5saXN0ICR7bmxpc3R9UyAke25saXN0fVQiCi0JICAgICRydW4gJHJtICIkbmxpc3QiICIke25saXN0fVMiICIke25saXN0fVQiCi0JICBlbHNlCi0JICAgICRzaG93ICIkbWtkaXIgJG9iamRpciIKLQkgICAgJHJ1biAkbWtkaXIgJG9iamRpcgotCSAgICBzdGF0dXM9JD8KLQkgICAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAkb2JqZGlyOyB0aGVuCi0JICAgICAgZXhpdCAkc3RhdHVzCi0JICAgIGZpCi0JICBmaQotCi0JICAjIFBhcnNlIHRoZSBuYW1lIGxpc3QgaW50byBhIHNvdXJjZSBmaWxlLgotCSAgJHNob3cgImNyZWF0aW5nICRvYmpkaXIvJGRsc3ltcyIKLQotCSAgJGVjaG8gPiAiJG9iamRpci8kZGxzeW1zIiAiXAotLyogJGRsc3ltcyAtIHN5bWJvbCByZXNvbHV0aW9uIHRhYmxlIGZvciBcYCRvdXRwdXRuYW1lJyBkbHN5bSBlbXVsYXRpb24uICovCi0vKiBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuIFwiQ1wiIHsKLSNlbmRpZgotCi0vKiBQcmV2ZW50IHRoZSBvbmx5IGtpbmQgb2YgZGVjbGFyYXRpb24gY29uZmxpY3RzIHdlIGNhbiBtYWtlLiAqLwotI2RlZmluZSBsdF9wcmVsb2FkZWRfc3ltYm9scyBzb21lX290aGVyX3N5bWJvbAotCi0vKiBFeHRlcm5hbCBzeW1ib2wgZGVjbGFyYXRpb25zIGZvciB0aGUgY29tcGlsZXIuICovXAotIgotCi0JICBpZiB0ZXN0ICIkZGxzZWxmIiA9IHllczsgdGhlbgotCSAgICAkc2hvdyAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkb3V0cHV0JyIKLQotCSAgICBlY2hvICc6IEBQUk9HUkFNQCAnID4gIiRubGlzdCIKLQotCSAgICAjIEFkZCBvdXIgb3duIHByb2dyYW0gb2JqZWN0cyB0byB0aGUgc3ltYm9sIGxpc3QuCi0JICAgIHByb2dmaWxlcz1gJGVjaG8gIlgkb2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCSAgICBmb3IgYXJnIGluICRwcm9nZmlsZXM7IGRvCi0JICAgICAgJHNob3cgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGFyZyciCi0JICAgICAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCi0JICAgIGRvbmUKLQotCSAgICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgICAgICRydW4gZXZhbCAnZWdyZXAgLXYgIiAoJGV4Y2x1ZGVfZXhwc3ltcykkIiAiJG5saXN0IiA+ICIkbmxpc3QiVCcKLQkgICAgICAkcnVuIGV2YWwgJyRtdiAiJG5saXN0IlQgIiRubGlzdCInCi0JICAgIGZpCi0JICAgIAotCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAgICAgJHJ1biBldmFsICdlZ3JlcCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJG5saXN0IiA+ICIkbmxpc3QiVCcKLQkgICAgICAkcnVuIGV2YWwgJyRtdiAiJG5saXN0IlQgIiRubGlzdCInCi0JICAgIGZpCi0KLQkgICAgIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKLQkgICAgaWYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzIjsgdGhlbgotCSAgICAgIGV4cG9ydF9zeW1ib2xzPSIkb2JqZGlyLyRvdXRwdXQuZXhwIgotCSAgICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scwotCSAgICAgICRydW4gZXZhbCAic2VkIC1uIC1lICcvXjogQFBST0dSQU1AJC9kJyAtZSAncy9eLiogXCguKlwpJC9cMS9wJyAiJzwgIiRubGlzdCIgPiAiJGV4cG9ydF9zeW1ib2xzIicKLQkgICAgZWxzZQotCSAgICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scwotCSAgICAgICRydW4gZXZhbCAic2VkIC1lICdzL1woW11bLipeJF1cKS9cXFwxL2cnIC1lICdzL14vIC8nIC1lICdzLyQvJC8nIicgPCAiJGV4cG9ydF9zeW1ib2xzIiA+ICIkb2JqZGlyLyRvdXRwdXQuZXhwIicKLQkgICAgICAkcnVuIGV2YWwgJ2dyZXAgLWYgIiRvYmpkaXIvJG91dHB1dC5leHAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlQnCi0JICAgICAgJHJ1biBldmFsICdtdiAiJG5saXN0IlQgIiRubGlzdCInCi0JICAgIGZpCi0JICBmaQotCi0JICBmb3IgYXJnIGluICRkbHByZWZpbGVzOyBkbwotCSAgICAkc2hvdyAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkYXJnJyIKLQkgICAgbmFtZT1gZWNobyAiJGFyZyIgfCBzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgICAgJHJ1biBldmFsICdlY2hvICI6ICRuYW1lICIgPj4gIiRubGlzdCInCi0JICAgICRydW4gZXZhbCAiJE5NICRhcmcgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgotCSAgZG9uZQotCi0JICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSAgICAjIE1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IGFuIGVtcHR5IGZpbGUuCi0JICAgIHRlc3QgLWYgIiRubGlzdCIgfHwgOiA+ICIkbmxpc3QiCi0KLQkgICAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICAgICBlZ3JlcCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUCi0JICAgICAgJG12ICIkbmxpc3QiVCAiJG5saXN0IgotCSAgICBmaQotCi0JICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0JICAgIGlmIGdyZXAgLXYgIl46ICIgPCAiJG5saXN0IiB8IHNvcnQgKzIgfCB1bmlxID4gIiRubGlzdCJTOyB0aGVuCi0JICAgICAgOgotCSAgICBlbHNlCi0JICAgICAgZ3JlcCAtdiAiXjogIiA8ICIkbmxpc3QiID4gIiRubGlzdCJTCi0JICAgIGZpCi0KLQkgICAgaWYgdGVzdCAtZiAiJG5saXN0IlM7IHRoZW4KLQkgICAgICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCJTID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIicKLQkgICAgZWxzZQotCSAgICAgIGVjaG8gJy8qIE5PTkUgKi8nID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIgotCSAgICBmaQotCi0JICAgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAotCi0jdW5kZWYgbHRfcHJlbG9hZGVkX3N5bWJvbHMKLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQote1wKLSIKLQotCSAgICBzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XCJcMVwiLCAobHRfcHRyX3QpIDB9LC9wJyBcCi0JCS1lICdzL14uIFwoW14gXSpcKSBcKFteIF0qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sL3AnIFwKLQkJICA8ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIgotCi0JICAgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCi0jaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECi1zdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgewotICByZXR1cm4gbHRfcHJlbG9hZGVkX3N5bWJvbHM7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWZcCi0iCi0JICBmaQotCi0JICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9Ci0gICAgICAgICAgY2FzZSAiJGhvc3QiIGluCi0JICAjIGNvbXBpbGluZyB0aGUgc3ltYm9sIHRhYmxlIGZpbGUgd2l0aCBwaWNfZmxhZyB3b3JrcyBhcm91bmQKLQkgICMgYSBGcmVlQlNEIGJ1ZyB0aGF0IGNhdXNlcyBwcm9ncmFtcyB0byBjcmFzaCB3aGVuIC1sbSBpcwotCSAgIyBsaW5rZWQgYmVmb3JlIGFueSBvdGhlciBQSUMgb2JqZWN0LiAgQnV0IHdlIG11c3Qgbm90IHVzZQotCSAgIyBwaWNfZmxhZyB3aGVuIGxpbmtpbmcgd2l0aCAtc3RhdGljLiAgVGhlIHByb2JsZW0gZXhpc3RzIGluCi0JICAjIEZyZWVCU0QgMi4yLjYgYW5kIGlzIGZpeGVkIGluIEZyZWVCU0QgMy4xLgotCSAgKi0qLWZyZWVic2QyKnwqLSotZnJlZWJzZDMuMCopCi0JICAgIGNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgotCSAgICAqIiAtc3RhdGljICIqKSA7OwotCSAgICAqKSBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWcgLURQSUMgLURGUkVFQlNEX1dPUktBUk9VTkQiOzsKLQkgICAgZXNhYwotCSAgZXNhYwotCi0JICAjIE5vdyBjb21waWxlIHRoZSBkeW5hbWljIHN5bWJvbCBmaWxlLgotCSAgJHNob3cgIihjZCAkb2JqZGlyICYmICRDX2NvbXBpbGVyIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgXCIkZGxzeW1zXCIpIgotCSAgJHJ1biBldmFsICcoY2QgJG9iamRpciAmJiAkQ19jb21waWxlciAtYyRub19idWlsdGluX2ZsYWckcGljX2ZsYWdfZm9yX3N5bXRhYmxlICIkZGxzeW1zIiknIHx8IGV4aXQgJD8KLQotCSAgIyBUcmFuc2Zvcm0gdGhlIHN5bWJvbCBmaWxlIGludG8gdGhlIGNvcnJlY3QgbmFtZS4KLQkgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb2JqZGlyLyR7b3V0cHV0fVMuJHtvYmpleHR9JSJgCi0JICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb2JqZGlyLyR7b3V0cHV0fVMuJHtvYmpleHR9JSJgCi0JICA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiB1bmtub3duIHN1ZmZpeCBmb3IgXGAkZGxzeW1zJyIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLSAgICAgIGVsc2UKLQkjIFdlIGtlZXAgZ29pbmcganVzdCBpbiBjYXNlIHRoZSB1c2VyIGRpZG4ndCByZWZlciB0bwotCSMgbHRfcHJlbG9hZGVkX3N5bWJvbHMuICBUaGUgbGlua2VyIHdpbGwgZmFpbCBpZiBnbG9iYWxfc3ltYm9sX3BpcGUKLQkjIHJlYWxseSB3YXMgcmVxdWlyZWQuCi0KLQkjIE51bGxpZnkgdGhlIHN5bWJvbCBmaWxlLgotCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCi0JZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAteiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLQljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKLQlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQotCSMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgotCSRzaG93ICIkbGlua19jb21tYW5kIgotCSRydW4gZXZhbCAiJGxpbmtfY29tbWFuZCIKLQlleGl0ICQ/Ci0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLQkjIFdlIHNob3VsZCBzZXQgdGhlIHNobGlicGF0aF92YXIKLQlycGF0aD0KLQlmb3IgZGlyIGluICR0ZW1wX3JwYXRoOyBkbwotCSAgY2FzZSAiJGRpciIgaW4KLQkgIC8qIHwgW0EtWmEtel06Wy9cXF0qKQotCSAgICAjIEFic29sdXRlIHBhdGguCi0JICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLQkgICAgOzsKLQkgICopCi0JICAgICMgUmVsYXRpdmUgcGF0aDogYWRkIGEgdGhpc2RpciBlbnRyeS4KLQkgICAgcnBhdGg9IiRycGF0aFwkdGhpc2Rpci8kZGlyOiIKLQkgICAgOzsKLQkgIGVzYWMKLQlkb25lCi0JdGVtcF9ycGF0aD0iJHJwYXRoIgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KLQljb21waWxlX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkY29tcGlsZV9jb21tYW5kIgotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCi0JZmluYWxpemVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRmaW5hbGl6ZV9jb21tYW5kIgotICAgICAgZmkKLQotICAgICAgY29tcGlsZV92YXI9Ci0gICAgICBmaW5hbGl6ZV92YXI9Ci0gICAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCi0JICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgotCSAgcnBhdGg9Ci0JICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbwotCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCi0JICBkb25lCi0JICBjb21waWxlX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCi0JZmkKLQlpZiB0ZXN0IC1uICIkZmluYWxpemVfcGVybV9ycGF0aCI7IHRoZW4KLQkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCi0JICBycGF0aD0KLQkgIGZvciBkaXIgaW4gJGZpbmFsaXplX3Blcm1fcnBhdGg7IGRvCi0JICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLQkgIGRvbmUKLQkgIGZpbmFsaXplX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCi0JIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCi0JbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCi0JcmVsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkZmluYWxpemVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKLQkKLQkjIEFHSCEgRmxhbWUgdGhlIEFJWCBhbmQgSFAtVVggcGVvcGxlIGZvciBtZSwgd2lsbCB5YT8KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB0aGlzIHBsYXRmb3JtIGRvZXMgbm90IGxpa2UgdW5pbnN0YWxsZWQgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgotCSRlY2hvICIkbW9kZW5hbWU6IFxgJG91dHB1dCcgd2lsbCBiZSByZWxpbmtlZCBkdXJpbmcgaW5zdGFsbGF0aW9uIiAxPiYyCi0gICAgICBlbHNlCi0JaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgIT0gbm87IHRoZW4KLQkgIGxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRjb21waWxlX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCi0JICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgotCSAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlXCRwcm9nZGlyL1wkZmlsZSVnJ2AKLQkgIGVsc2UKLQkgICAgIyBmYXN0X2luc3RhbGwgaXMgc2V0IHRvIG5lZWRsZXNzCi0JICAgIHJlbGlua19jb21tYW5kPQotCSAgZmkKLQllbHNlCi0JICBsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQkgIHJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLSAgICAgIGxpbmtfY29tbWFuZD1gJGVjaG8gIlgkbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiJyVnJ2AKLSAgICAgIAotICAgICAgIyBDcmVhdGUgdGhlIGJpbmFyeSBpbiB0aGUgb2JqZWN0IGRpcmVjdG9yeSwgdGhlbiB3cmFwIGl0LgotICAgICAgaWYgdGVzdCAhIC1kICRvdXRwdXRfb2JqZGlyOyB0aGVuCi0JJHNob3cgIiRta2RpciAkb3V0cHV0X29iamRpciIKLQkkcnVuICRta2RpciAkb3V0cHV0X29iamRpcgotCXN0YXR1cz0kPwotCWlmIHRlc3QgJHN0YXR1cyAtbmUgMCAmJiB0ZXN0ICEgLWQgJG9iamRpcjsgdGhlbgotCSAgZXhpdCAkc3RhdHVzCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGUuCi0gICAgICAkcnVuICRybSAkb3V0cHV0ICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyL2x0LSRvdXRwdXRuYW1lCi0KLSAgICAgICRzaG93ICIkbGlua19jb21tYW5kIgotICAgICAgJHJ1biBldmFsICIkbGlua19jb21tYW5kIiB8fCBleGl0ICQ/Ci0KLSAgICAgICMgTm93IGNyZWF0ZSB0aGUgd3JhcHBlciBzY3JpcHQuCi0gICAgICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dCIKLQotICAgICAgIyBRdW90ZSB0aGUgcmVsaW5rIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgotICAgICAgaWYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgotCXJlbGlua19jb21tYW5kPWAkZWNobyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBmaQotCi0gICAgICAjIFF1b3RlICRlY2hvIGZvciBzaGlwcGluZy4KLSAgICAgIGlmIHRlc3QgIlgkZWNobyIgPSAiWCRTSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCi0JY2FzZSAiJDAiIGluCi0JLyogfCBbQS1aYS16XTpbL1xcXSopIHFlY2hvPSIkU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIjs7Ci0JKikgcWVjaG89IiRTSEVMTCBgcHdkYC8kMCAtLWZhbGxiYWNrLWVjaG8iOzsKLQllc2FjCi0JcWVjaG89YCRlY2hvICJYJHFlY2hvIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGVsc2UKLQlxZWNobz1gJGVjaG8gIlgkZWNobyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBmaQotCi0gICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG91ciBydW4gY29tbWFuZCBpcyBub24tbnVsbC4KLSAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JIyB3aW4zMiB3aWxsIHRoaW5rIHRoZSBzY3JpcHQgaXMgYSBiaW5hcnkgaWYgaXQgaGFzCi0JIyBhIC5leGUgc3VmZml4LCBzbyB3ZSBzdHJpcCBpdCBvZmYgaGVyZS4KLQljYXNlICRvdXRwdXQgaW4KLQkgICouZXhlKSBvdXRwdXQ9YGVjaG8gJG91dHB1dHxzZWQgJ3MsLmV4ZSQsLCdgIDs7Ci0JZXNhYwotCSRybSAkb3V0cHV0Ci0JdHJhcCAiJHJtICRvdXRwdXQ7IGV4aXQgMSIgMSAyIDE1Ci0KLQkkZWNobyA+ICRvdXRwdXQgIlwKLSMhICRTSEVMTAotCi0jICRvdXRwdXQgLSB0ZW1wb3Jhcnkgd3JhcHBlciBzY3JpcHQgZm9yICRvYmpkaXIvJG91dHB1dG5hbWUKLSMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUAotIwotIyBUaGUgJG91dHB1dCBwcm9ncmFtIGNhbm5vdCBiZSBkaXJlY3RseSBleGVjdXRlZCB1bnRpbCBhbGwgdGhlIGxpYnRvb2wKLSMgbGlicmFyaWVzIHRoYXQgaXQgZGVwZW5kcyBvbiBhcmUgaW5zdGFsbGVkLgotIwotIyBUaGlzIHdyYXBwZXIgc2NyaXB0IHNob3VsZCBuZXZlciBiZSBtb3ZlZCBvdXQgb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KLSMgSWYgaXQgaXMsIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5LgotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0nc2VkIC1lIDFzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9JyRzZWRfcXVvdGVfc3Vic3QnCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi1pZiB0ZXN0IFwiXCR7Q0RQQVRIK3NldH1cIiA9IHNldDsgdGhlbiBDRFBBVEg9OyBleHBvcnQgQ0RQQVRIOyBmaQotCi1yZWxpbmtfY29tbWFuZD1cIiRyZWxpbmtfY29tbWFuZFwiCi0KLSMgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBkZXRlcm1pbmVzIG91ciBvcGVyYXRpb24gbW9kZS4KLWlmIHRlc3QgXCJcJGxpYnRvb2xfaW5zdGFsbF9tYWdpY1wiID0gXCIkbWFnaWNcIjsgdGhlbgotICAjIGluc3RhbGwgbW9kZSBuZWVkcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlOgotICBsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzPSckbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicycKLWVsc2UKLSAgIyBXaGVuIHdlIGFyZSBzb3VyY2VkIGluIGV4ZWN1dGUgbW9kZSwgXCRmaWxlIGFuZCBcJGVjaG8gYXJlIGFscmVhZHkgc2V0LgotICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiAhPSBcIiRtYWdpY1wiOyB0aGVuCi0gICAgZWNobz1cIiRxZWNob1wiCi0gICAgZmlsZT1cIlwkMFwiCi0gICAgIyBNYWtlIHN1cmUgZWNobyB3b3Jrcy4KLSAgICBpZiB0ZXN0IFwiWFwkMVwiID0gWC0tbm8tcmVleGVjOyB0aGVuCi0gICAgICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgICAgIHNoaWZ0Ci0gICAgZWxpZiB0ZXN0IFwiWFxgKFwkZWNobyAnXHQnKSAyPi9kZXYvbnVsbFxgXCIgPSAnWFx0JzsgdGhlbgotICAgICAgIyBZaXBwZWUsIFwkZWNobyB3b3JrcyEKLSAgICAgIDoKLSAgICBlbHNlCi0gICAgICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwsIGFuZCB0aGVuIG1heWJlIFwkZWNobyB3aWxsIHdvcmsuCi0gICAgICBleGVjICRTSEVMTCBcIlwkMFwiIC0tbm8tcmVleGVjIFwkezErXCJcJEBcIn0KLSAgICBmaQotICBmaVwKLSIKLQkkZWNobyA+PiAkb3V0cHV0ICJcCi0KLSAgIyBGaW5kIHRoZSBkaXJlY3RvcnkgdGhhdCB0aGlzIHNjcmlwdCBsaXZlcyBpbi4KLSAgdGhpc2Rpcj1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSokJSUnXGAKLSAgdGVzdCBcInhcJHRoaXNkaXJcIiA9IFwieFwkZmlsZVwiICYmIHRoaXNkaXI9LgotCi0gICMgRm9sbG93IHN5bWJvbGljIGxpbmtzIHVudGlsIHdlIGdldCB0byB0aGUgcmVhbCB0aGlzZGlyLgotICBmaWxlPVxgbHMgLWxkIFwiXCRmaWxlXCIgfCBzZWQgLW4gJ3MvLiotPiAvL3AnXGAKLSAgd2hpbGUgdGVzdCAtbiBcIlwkZmlsZVwiOyBkbwotICAgIGRlc3RkaXI9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qXCQlJSdcYAotCi0gICAgIyBJZiB0aGVyZSB3YXMgYSBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGNoYW5nZSB0aGlzZGlyLgotICAgIGlmIHRlc3QgXCJ4XCRkZXN0ZGlyXCIgIT0gXCJ4XCRmaWxlXCI7IHRoZW4KLSAgICAgIGNhc2UgXCJcJGRlc3RkaXJcIiBpbgotICAgICAgLyogfCBbQS1aYS16XTpbL1xcXSopIHRoaXNkaXI9XCJcJGRlc3RkaXJcIiA7OwotICAgICAgKikgdGhpc2Rpcj1cIlwkdGhpc2Rpci9cJGRlc3RkaXJcIiA7OwotICAgICAgZXNhYwotICAgIGZpCi0KLSAgICBmaWxlPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJV4uKi8lJSdcYAotICAgIGZpbGU9XGBscyAtbGQgXCJcJHRoaXNkaXIvXCRmaWxlXCIgfCBzZWQgLW4gJ3MvLiotPiAvL3AnXGAKLSAgZG9uZQotCi0gICMgVHJ5IHRvIGdldCB0aGUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUuCi0gIGFic2Rpcj1cYGNkIFwiXCR0aGlzZGlyXCIgJiYgcHdkXGAKLSAgdGVzdCAtbiBcIlwkYWJzZGlyXCIgJiYgdGhpc2Rpcj1cIlwkYWJzZGlyXCIKLSIKLQotCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCi0JICBlY2hvID4+ICRvdXRwdXQgIlwKLSAgcHJvZ3JhbT1sdC0nJG91dHB1dG5hbWUnCi0gIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCi0gIAotICBpZiB0ZXN0ICEgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgfHwgXFwKLSAgICAgeyBmaWxlPVxgbHMgLTFkdCBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcIlwkcHJvZ2Rpci8uLi9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8IHNlZCAxcVxgOyBcXAotICAgICAgIHRlc3QgXCJYXCRmaWxlXCIgIT0gXCJYXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9OyB0aGVuCi0KLSAgICBmaWxlPVwiXCRcJC1cJHByb2dyYW1cIgotCi0gICAgaWYgdGVzdCAhIC1kIFwiXCRwcm9nZGlyXCI7IHRoZW4KLSAgICAgICRta2RpciBcIlwkcHJvZ2RpclwiCi0gICAgZWxzZQotICAgICAgJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCi0gICAgZmkiCi0KLQkgIGVjaG8gPj4gJG91dHB1dCAiXAotCi0gICAgIyByZWxpbmsgZXhlY3V0YWJsZSBpZiBuZWNlc3NhcnkKLSAgICBpZiB0ZXN0IC1uIFwiXCRyZWxpbmtfY29tbWFuZFwiOyB0aGVuCi0gICAgICBpZiAoY2QgXCJcJHRoaXNkaXJcIiAmJiBldmFsIFwkcmVsaW5rX2NvbW1hbmQpOyB0aGVuIDoKLSAgICAgIGVsc2UKLQkkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLQlleGl0IDEKLSAgICAgIGZpCi0gICAgZmkKLQotICAgICRtdiBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8fAotICAgIHsgJHJtIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOwotICAgICAgJG12IFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9Ci0gICAgJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCi0gIGZpIgotCWVsc2UKLQkgIGVjaG8gPj4gJG91dHB1dCAiXAotICBwcm9ncmFtPSckb3V0cHV0bmFtZScKLSAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKLSIKLQlmaQotCi0JZWNobyA+PiAkb3V0cHV0ICJcCi0KLSAgaWYgdGVzdCAtZiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgdGhlbiIKLQotCSMgRXhwb3J0IG91ciBzaGxpYnBhdGhfdmFyIGlmIHdlIGhhdmUgb25lLgotCWlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzICYmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkdGVtcF9ycGF0aCI7IHRoZW4KLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAjIEFkZCBvdXIgb3duIGxpYnJhcnkgcGF0aCB0byAkc2hsaWJwYXRoX3ZhcgotICAgICRzaGxpYnBhdGhfdmFyPVwiJHRlbXBfcnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIKLQotICAgICMgU29tZSBzeXN0ZW1zIGNhbm5vdCBjb3BlIHdpdGggY29sb24tdGVybWluYXRlZCAkc2hsaWJwYXRoX3ZhcgotICAgICMgVGhlIHNlY29uZCBjb2xvbiBpcyBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIEJlT1MgUjQgc2VkCi0gICAgJHNobGlicGF0aF92YXI9XGBcJGVjaG8gXCJYXCQkc2hsaWJwYXRoX3ZhclwiIHwgXCRYc2VkIC1lICdzLzo6KlwkLy8nXGAKLQotICAgIGV4cG9ydCAkc2hsaWJwYXRoX3ZhcgotIgotCWZpCi0KLQkjIGZpeHVwIHRoZSBkbGwgc2VhcmNocGF0aCBpZiB3ZSBuZWVkIHRvLgotCWlmIHRlc3QgLW4gIiRkbGxzZWFyY2hwYXRoIjsgdGhlbgotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICMgQWRkIHRoZSBkbGwgc2VhcmNoIHBhdGggY29tcG9uZW50cyB0byB0aGUgZXhlY3V0YWJsZSBQQVRICi0gICAgUEFUSD0kZGxsc2VhcmNocGF0aDpcJFBBVEgKLSIKLQlmaQotCi0JJGVjaG8gPj4gJG91dHB1dCAiXAotICAgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgICAgICMgUnVuIHRoZSBhY3R1YWwgcHJvZ3JhbSB3aXRoIG91ciBhcmd1bWVudHMuCi0iCi0JY2FzZSAkaG9zdCBpbgotCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3IHwgKi0qLW9zMiopCi0JICAjIHdpbjMyIHN5c3RlbXMgbmVlZCB0byB1c2UgdGhlIHByb2cgcGF0aCBmb3IgZGxsCi0JICAjIGxvb2t1cCB0byB3b3JrCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgICBleGVjIFwkcHJvZ2RpclxcXFxcJHByb2dyYW0gXCR7MStcIlwkQFwifQotIgotCSAgOzsKLQkqKQotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICAgIyBFeHBvcnQgdGhlIHBhdGggdG8gdGhlIHByb2dyYW0uCi0gICAgICBQQVRIPVwiXCRwcm9nZGlyOlwkUEFUSFwiCi0gICAgICBleHBvcnQgUEFUSAotCi0gICAgICBleGVjIFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9Ci0iCi0JICA7OwotCWVzYWMKLQkkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgICBcJGVjaG8gXCJcJDA6IGNhbm5vdCBleGVjIFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9XCIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0gIGVsc2UKLSAgICAjIFRoZSBwcm9ncmFtIGRvZXNuJ3QgZXhpc3QuCi0gICAgXCRlY2hvIFwiXCQwOiBlcnJvcjogXCRwcm9nZGlyL1wkcHJvZ3JhbSBkb2VzIG5vdCBleGlzdFwiIDE+JjIKLSAgICBcJGVjaG8gXCJUaGlzIHNjcmlwdCBpcyBqdXN0IGEgd3JhcHBlciBmb3IgXCRwcm9ncmFtLlwiIDE+JjIKLSAgICBlY2hvIFwiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLWZpXAotIgotCWNobW9kICt4ICRvdXRwdXQKLSAgICAgIGZpCi0gICAgICBleGl0IDAKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCi0gICAgZm9yIG9sZGxpYiBpbiAkb2xkbGliczsgZG8KLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBjb252ZW5pZW5jZTsgdGhlbgotCW9sZG9ianM9IiRsaWJvYmpzX3NhdmUiCi0JYWRkbGlicz0iJGNvbnZlbmllbmNlIgotCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotICAgICAgZWxzZQotCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbW9kdWxlOyB0aGVuCi0JICBvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgotCSAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JZWxzZQotCSAgb2xkb2Jqcz0iJG9ianMgImAkZWNobyAiWCRsaWJvYmpzX3NhdmUiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0nJC9kJyAtZSAnL1wubGliJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCWZpCi0JYWRkbGlicz0iJG9sZF9jb252ZW5pZW5jZSIKLSAgICAgIGZpCi0KLSAgICAgICMgQWRkIGluIG1lbWJlcnMgZnJvbSBjb252ZW5pZW5jZSBhcmNoaXZlcy4KLSAgICAgIGZvciB4bGliIGluICRhZGRsaWJzOyBkbwotCSMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KLQl4ZGlyPSIkeGxpYiJ4Ci0JZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICR4ZGlyIgotCXhsaWI9YCRlY2hvICJYJHhsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotCSRzaG93ICIke3JtfXIgJHhkaXIiCi0JJHJ1biAke3JtfXIgIiR4ZGlyIgotCSRzaG93ICJta2RpciAkeGRpciIKLQkkcnVuIG1rZGlyICIkeGRpciIKLQlzdGF0dXM9JD8KLQlpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICIkeGRpciI7IHRoZW4KLQkgIGV4aXQgJHN0YXR1cwotCWZpCi0JJHNob3cgIihjZCAkeGRpciAmJiAkQVIgeCAuLi8keGxpYikiCi0JJHJ1biBldmFsICIoY2QgXCR4ZGlyICYmICRBUiB4IC4uL1wkeGxpYikiIHx8IGV4aXQgJD8KLQotCW9sZG9ianM9IiRvbGRvYmpzICJgZmluZCAkeGRpciAtbmFtZSBcKi5vIC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkTkwyU1BgCi0gICAgICBkb25lCi0KLSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgotICAgICAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNcIgotICAgICAgZWxzZQotCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKLSAgICAgIGZpCi0gICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQlJRlM9IiRzYXZlX2lmcyIKLQkkc2hvdyAiJGNtZCIKLQkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLW4gIiRnZW5lcmF0ZWQiOyB0aGVuCi0gICAgICAkc2hvdyAiJHtybX1yJGdlbmVyYXRlZCIKLSAgICAgICRydW4gJHtybX1yJGdlbmVyYXRlZAotICAgIGZpCi0KLSAgICAjIE5vdyBjcmVhdGUgdGhlIGxpYnRvb2wgYXJjaGl2ZS4KLSAgICBjYXNlICIkb3V0cHV0IiBpbgotICAgICoubGEpCi0gICAgICBvbGRfbGlicmFyeT0KLSAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgb2xkX2xpYnJhcnk9IiRsaWJuYW1lLiRsaWJleHQiCi0gICAgICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dCIKLQotICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KLQl0ZW1wX3hycGF0aD0KLQlmb3IgbGliZGlyIGluICR4cnBhdGg7IGRvCi0JICB0ZW1wX3hycGF0aD0iJHRlbXBfeHJwYXRoIC1SJGxpYmRpciIKLQlkb25lCi0JZGVwZW5kZW5jeV9saWJzPSIkdGVtcF94cnBhdGggJGRlcGVuZGVuY3lfbGlicyIKLSAgICAgIGZpCi0KLSAgICAgICMgT25seSBjcmVhdGUgdGhlIG91dHB1dCBpZiBub3QgYSBkcnkgcnVuLgotICAgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQkkZWNobyA+ICRvdXRwdXQgIlwKLSMgJG91dHB1dCAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKLSMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUAotCi0jIFRoZSBuYW1lIHRoYXQgd2UgY2FuIGRsb3BlbigzKS4KLWRsbmFtZT0nJGRsbmFtZScKLQotIyBOYW1lcyBvZiB0aGlzIGxpYnJhcnkuCi1saWJyYXJ5X25hbWVzPSckbGlicmFyeV9uYW1lcycKLQotIyBUaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFyY2hpdmUuCi1vbGRfbGlicmFyeT0nJG9sZF9saWJyYXJ5JwotCi0jIExpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KLWRlcGVuZGVuY3lfbGlicz0nJGRlcGVuZGVuY3lfbGlicycKLQotIyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciAkbGlibmFtZS4KLWN1cnJlbnQ9JGN1cnJlbnQKLWFnZT0kYWdlCi1yZXZpc2lvbj0kcmV2aXNpb24KLQotIyBJcyB0aGlzIGFuIGFscmVhZHkgaW5zdGFsbGVkIGxpYnJhcnk/Ci1pbnN0YWxsZWQ9bm8KLQotIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgotbGliZGlyPSckaW5zdGFsbF9saWJkaXInXAotIgotCi0JJHJtICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSJpCi0Jc2VkICdzL15pbnN0YWxsZWQ9bm8kL2luc3RhbGxlZD15ZXMvJyBcCi0JICA8ICIkb3V0cHV0IiA+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSJpIHx8IGV4aXQgMQotICAgICAgZmkKLQotICAgICAgIyBEbyBhIHN5bWJvbGljIGxpbmsgc28gdGhhdCB0aGUgbGlidG9vbCBhcmNoaXZlIGNhbiBiZSBmb3VuZCBpbgotICAgICAgIyBMRF9MSUJSQVJZX1BBVEggYmVmb3JlIHRoZSBwcm9ncmFtIGlzIGluc3RhbGxlZC4KLSAgICAgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRvdXRwdXRuYW1lICYmICRMTl9TIC4uLyRvdXRwdXRuYW1lICRvdXRwdXRuYW1lKSIKLSAgICAgICRydW4gZXZhbCAiKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkb3V0cHV0bmFtZSAmJiAkTE5fUyAuLi8kb3V0cHV0bmFtZSAkb3V0cHV0bmFtZSkiIHx8IGV4aXQgJD8KLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGluc3RhbGwgbW9kZQotICBpbnN0YWxsKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGluc3RhbGwiCi0KLSAgICAjIFRoZXJlIG1heSBiZSBhbiBvcHRpb25hbCBzaCgxKSBhcmd1bWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICAgIyBpbnN0YWxsX3Byb2cgKGVzcGVjaWFsbHkgb24gV2luZG93cyBOVCkuCi0gICAgaWYgdGVzdCAiJG5vbm9wdCIgPSAiJFNIRUxMIiB8fCB0ZXN0ICIkbm9ub3B0IiA9IC9iaW4vc2g7IHRoZW4KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KLSAgICAgIGFyZz1gJGVjaG8gIlgkbm9ub3B0IiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLQlhcmc9IlwiJGFyZ1wiIgotCTs7Ci0gICAgICBlc2FjCi0gICAgICBpbnN0YWxsX3Byb2c9IiRhcmcgIgotICAgICAgYXJnPSIkMSIKLSAgICAgIHNoaWZ0Ci0gICAgZWxzZQotICAgICAgaW5zdGFsbF9wcm9nPQotICAgICAgYXJnPSIkbm9ub3B0IgotICAgIGZpCi0KLSAgICAjIFRoZSByZWFsIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgaW5zdGFsbGF0aW9uIHByb2dyYW0uCi0gICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgotICAgIGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICBjYXNlICIkYXJnIiBpbgotICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotICAgICAgYXJnPSJcIiRhcmdcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyRhcmciCi0KLSAgICAjIFdlIG5lZWQgdG8gYWNjZXB0IGF0IGxlYXN0IGFsbCB0aGUgQlNEIGluc3RhbGwgZmxhZ3MuCi0gICAgZGVzdD0KLSAgICBmaWxlcz0KLSAgICBvcHRzPQotICAgIHByZXY9Ci0gICAgaW5zdGFsbF90eXBlPQotICAgIGlzZGlyPW5vCi0gICAgc3RyaXBtZT0KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGlmIHRlc3QgLW4gIiRkZXN0IjsgdGhlbgotCWZpbGVzPSIkZmlsZXMgJGRlc3QiCi0JZGVzdD0iJGFyZyIKLQljb250aW51ZQotICAgICAgZmkKLQotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC1kKSBpc2Rpcj15ZXMgOzsKLSAgICAgIC1mKSBwcmV2PSItZiIgOzsKLSAgICAgIC1nKSBwcmV2PSItZyIgOzsKLSAgICAgIC1tKSBwcmV2PSItbSIgOzsKLSAgICAgIC1vKSBwcmV2PSItbyIgOzsKLSAgICAgIC1zKQotCXN0cmlwbWU9IiAtcyIKLQljb250aW51ZQotCTs7Ci0gICAgICAtKikgOzsKLQotICAgICAgKikKLQkjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZGVkIGFuIGFyZ3VtZW50LCB0aGVuIHNraXAgaXQuCi0JaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0JICBwcmV2PQotCWVsc2UKLQkgIGRlc3Q9IiRhcmciCi0JICBjb250aW51ZQotCWZpCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBhcmd1bWVudC4KLSAgICAgIGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLQlhcmc9IlwiJGFyZ1wiIgotCTs7Ci0gICAgICBlc2FjCi0gICAgICBpbnN0YWxsX3Byb2c9IiRpbnN0YWxsX3Byb2cgJGFyZyIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC16ICIkaW5zdGFsbF9wcm9nIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBpbnN0YWxsIHByb2dyYW0iIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdGhlIFxgJHByZXYnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgaWYgdGVzdCAteiAiJGZpbGVzIjsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiJGRlc3QiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogbm8gZmlsZSBvciBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiIDE+JjIKLSAgICAgIGVsc2UKLQkkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgZGVzdGluYXRpb24iIDE+JjIKLSAgICAgIGZpCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICAjIFN0cmlwIGFueSB0cmFpbGluZyBzbGFzaCBmcm9tIHRoZSBkZXN0aW5hdGlvbi4KLSAgICBkZXN0PWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS8kJSUnYAotCi0gICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnkuCi0gICAgdGVzdCAtZCAiJGRlc3QiICYmIGlzZGlyPXllcwotICAgIGlmIHRlc3QgIiRpc2RpciIgPSB5ZXM7IHRoZW4KLSAgICAgIGRlc3RkaXI9IiRkZXN0IgotICAgICAgZGVzdG5hbWU9Ci0gICAgZWxzZQotICAgICAgZGVzdGRpcj1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgICAgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGRlc3QiICYmIGRlc3RkaXI9LgotICAgICAgZGVzdG5hbWU9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotICAgICAgIyBOb3QgYSBkaXJlY3RvcnksIHNvIGNoZWNrIHRvIHNlZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIGZpbGUgc3BlY2lmaWVkLgotICAgICAgc2V0IGR1bW15ICRmaWxlcwotICAgICAgaWYgdGVzdCAkIyAtZ3QgMjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IFxgJGRlc3QnIGlzIG5vdCBhIGRpcmVjdG9yeSIgMT4mMgotCSRlY2hvICIkaGVscCIgMT4mMgotCWV4aXQgMQotICAgICAgZmkKLSAgICBmaQotICAgIGNhc2UgIiRkZXN0ZGlyIiBpbgotICAgIC8qIHwgW0EtWmEtel06Wy9cXF0qKSA7OwotICAgICopCi0gICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0JY2FzZSAiJGZpbGUiIGluCi0JKi5sbykgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVzdGRpcicgbXVzdCBiZSBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKLSAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KLSAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKLQotICAgIHN0YXRpY2xpYnM9Ci0gICAgZnV0dXJlX2xpYmRpcnM9Ci0gICAgY3VycmVudF9saWJkaXJzPQotICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLQotICAgICAgIyBEbyBlYWNoIGluc3RhbGxhdGlvbi4KLSAgICAgIGNhc2UgIiRmaWxlIiBpbgotICAgICAgKi5hIHwgKi5saWIpCi0JIyBEbyB0aGUgc3RhdGljIGxpYnJhcmllcyBsYXRlci4KLQlzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZmlsZSIKLQk7OwotCi0gICAgICAqLmxhKQotCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCi0JaWYgKHNlZCAtZSAnMnEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRmaWxlJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQotCWxpYnJhcnlfbmFtZXM9Ci0Jb2xkX2xpYnJhcnk9Ci0JIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JY2FzZSAiJGZpbGUiIGluCi0JKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSopIC4gLi8kZmlsZSA7OwotCWVzYWMKLQotCSMgQWRkIHRoZSBsaWJkaXIgdG8gY3VycmVudF9saWJkaXJzIGlmIGl0IGlzIHRoZSBkZXN0aW5hdGlvbi4KLQlpZiB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkbGliZGlyIjsgdGhlbgotCSAgY2FzZSAiJGN1cnJlbnRfbGliZGlycyAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgY3VycmVudF9saWJkaXJzPSIkY3VycmVudF9saWJkaXJzICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZWxzZQotCSAgIyBOb3RlIHRoZSBsaWJkaXIgYXMgYSBmdXR1cmUgbGliZGlyLgotCSAgY2FzZSAiJGZ1dHVyZV9saWJkaXJzICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmdXR1cmVfbGliZGlycz0iJGZ1dHVyZV9saWJkaXJzICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZmkKLQotCWRpcj0iYCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AvIgotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUvIiAmJiBkaXI9Ci0JZGlyPSIkZGlyJG9iamRpciIKLQotCSMgU2VlIHRoZSBuYW1lcyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuCi0Jc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCi0JaWYgdGVzdCAtbiAiJDIiOyB0aGVuCi0JICByZWFsbmFtZT0iJDIiCi0JICBzaGlmdAotCSAgc2hpZnQKLQotCSAgIyBJbnN0YWxsIHRoZSBzaGFyZWQgbGlicmFyeSBhbmQgYnVpbGQgdGhlIHN5bWxpbmtzLgotCSAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGRpci8kcmVhbG5hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIgotCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJHJlYWxuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIgfHwgZXhpdCAkPwotCSAgdGVzdCAiWCRkbG5hbWUiID0gIlgkcmVhbG5hbWUiICYmIGRsbmFtZT0KLQotCSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotCSAgICAjIERlbGV0ZSB0aGUgb2xkIHN5bWxpbmtzLCBhbmQgY3JlYXRlIG5ldyBvbmVzLgotCSAgICBmb3IgbGlua25hbWUKLQkgICAgZG8KLQkgICAgICB0ZXN0ICJYJGRsbmFtZSIgPSAiWCRsaW5rbmFtZSIgJiYgZGxuYW1lPQotCSAgICAgIGlmIHRlc3QgIiRsaW5rbmFtZSIgIT0gIiRyZWFsbmFtZSI7IHRoZW4KLQkJJHNob3cgIihjZCAkZGVzdGRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgotCQkkcnVuIGV2YWwgIihjZCAkZGVzdGRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGZpCi0KLQkgIGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCi0JICAgICMgSW5zdGFsbCB0aGUgZHluYW1pY2FsbHktbG9hZGFibGUgbGlicmFyeS4KLQkgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lICRkZXN0ZGlyLyRkbG5hbWUiCi0JICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgJGRlc3RkaXIvJGRsbmFtZSIgfHwgZXhpdCAkPwotCSAgZmkKLQotCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgotCSAgbGliPSIkZGVzdGRpci8kcmVhbG5hbWUiCi0JICBldmFsIGNtZHM9XCIkcG9zdGluc3RhbGxfY21kc1wiCi0JICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICRzaG93ICIkY21kIgotCSAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQkgIGRvbmUKLQkgIElGUz0iJHNhdmVfaWZzIgotCWZpCi0KLQkjIEluc3RhbGwgdGhlIHBzZXVkby1saWJyYXJ5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3Nlcy4KLQluYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JaW5zdG5hbWU9IiRkaXIvJG5hbWUiaQotCWlmIHRlc3QgISAtZiAiJGluc3RuYW1lIjsgdGhlbgotCSAgIyBKdXN0IGluIGNhc2UgaXQgd2FzIHJlbW92ZWQuLi4KLQkgICRzaG93ICJDcmVhdGluZyAkaW5zdG5hbWUiCi0JICAkcm0gIiRpbnN0bmFtZSIKLQkgIHNlZCAncy9eaW5zdGFsbGVkPW5vJC9pbnN0YWxsZWQ9eWVzLycgIiRmaWxlIiA+ICIkaW5zdG5hbWUiCi0JZmkKLQkkc2hvdyAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiCi0JJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIgfHwgZXhpdCAkPwotCi0JIyBNYXliZSBpbnN0YWxsIHRoZSBzdGF0aWMgbGlicmFyeSwgdG9vLgotCXRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGRpci8kb2xkX2xpYnJhcnkiCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEluc3RhbGwgKGkuZS4gY29weSkgYSBsaWJ0b29sIG9iamVjdC4KLQotCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KLQlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgotCWVsc2UKLQkgIGRlc3RmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgotCWZpCi0KLQkjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gb2xkLXN0eWxlIG9iamVjdCBmaWxlLgotCWNhc2UgIiRkZXN0ZmlsZSIgaW4KLQkqLmxvKQotCSAgc3RhdGljZGVzdD1gJGVjaG8gIlgkZGVzdGZpbGUiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgIDs7Ci0JKi5vIHwgKi5vYmopCi0JICBzdGF0aWNkZXN0PSIkZGVzdGZpbGUiCi0JICBkZXN0ZmlsZT0KLQkgIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBjb3B5IGEgbGlidG9vbCBvYmplY3QgdG8gXGAkZGVzdGZpbGUnIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0KLQkjIEluc3RhbGwgdGhlIGxpYnRvb2wgb2JqZWN0IGlmIHJlcXVlc3RlZC4KLQlpZiB0ZXN0IC1uICIkZGVzdGZpbGUiOyB0aGVuCi0JICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiCi0JICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIiB8fCBleGl0ICQ/Ci0JZmkKLQotCSMgSW5zdGFsbCB0aGUgb2xkIG9iamVjdCBpZiBlbmFibGVkLgotCWlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQkgICMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCi0JICBzdGF0aWNvYmo9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQotCSAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJHN0YXRpY29iaiAkc3RhdGljZGVzdCIKLQkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJHN0YXRpY29iaiBcJHN0YXRpY2Rlc3QiIHx8IGV4aXQgJD8KLQlmaQotCWV4aXQgMAotCTs7Ci0KLSAgICAgICopCi0JIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgotCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCi0JZWxzZQotCSAgZGVzdGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCi0JZmkKLQotCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KLQlpZiAoc2VkIC1lICc0cScgJGZpbGUgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9Ci0JICByZWxpbmtfY29tbWFuZD0KLQotCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICBjYXNlICIkZmlsZSIgaW4KLQkgICovKiB8ICpcXCopIC4gJGZpbGUgOzsKLQkgICopIC4gLi8kZmlsZSA7OwotCSAgZXNhYwotCi0JICAjIENoZWNrIHRoZSB2YXJpYWJsZXMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHNldC4KLQkgIGlmIHRlc3QgLXogIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgXGAkZmlsZSciIDE+JjIKLQkgICAgZXhpdCAxCi0JICBmaQotCi0JICBmaW5hbGl6ZT15ZXMKLQkgIGZvciBsaWIgaW4gJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM7IGRvCi0JICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgZWFjaCBsaWJyYXJ5IGlzIGluc3RhbGxlZC4KLQkgICAgbGliZGlyPQotCSAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgotCSAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCSAgICAgIGNhc2UgIiRsaWIiIGluCi0JICAgICAgKi8qIHwgKlxcKikgLiAkbGliIDs7Ci0JICAgICAgKikgLiAuLyRsaWIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICAgIGxpYmZpbGU9IiRsaWJkaXIvYCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSVnJ2AiCi0JICAgIGlmIHRlc3QgLW4gIiRsaWJkaXIiICYmIHRlc3QgISAtZiAiJGxpYmZpbGUiOyB0aGVuCi0JICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkbGliJyBoYXMgbm90IGJlZW4gaW5zdGFsbGVkIGluIFxgJGxpYmRpciciIDE+JjIKLQkgICAgICBmaW5hbGl6ZT1ubwotCSAgICBmaQotCSAgZG9uZQotCi0JICBvdXRwdXRuYW1lPQotCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSBubyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JICAgIGlmIHRlc3QgIiRmaW5hbGl6ZSIgPSB5ZXM7IHRoZW4KLQkgICAgICBvdXRwdXRuYW1lPSIvdG1wLyQkLSRmaWxlIgotCSAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLQkgICAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0bmFtZSInJWcnYAotCi0JICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogcmVsaW5raW5nIFxgJGZpbGUnIG9uIGJlaGFsZiBvZiB5b3VyIGJ1Z2d5IHN5c3RlbSBsaW5rZXIiIDE+JjIKLQkgICAgICAkc2hvdyAiJHJlbGlua19jb21tYW5kIgotCSAgICAgIGlmICRydW4gZXZhbCAiJHJlbGlua19jb21tYW5kIjsgdGhlbiA6Ci0JICAgICAgZWxzZQotCQkkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogcmVsaW5rIFxgJGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiIDE+JjIKLQkJY29udGludWUKLQkgICAgICBmaQotCSAgICAgIGZpbGU9IiRvdXRwdXRuYW1lIgotCSAgICBlbHNlCi0JICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IHJlbGluayBcYCRmaWxlJyBvbiBiZWhhbGYgb2YgeW91ciBidWdneSBzeXN0ZW0gbGlua2VyIiAxPiYyCi0JICAgIGZpCi0JICBlbHNlCi0JICAgICMgSW5zdGFsbCB0aGUgYmluYXJ5IHRoYXQgd2UgY29tcGlsZWQgZWFybGllci4KLQkgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAicyVcKFteL10qXCkkJSRvYmpkaXIvXDElImAKLQkgIGZpCi0JZmkKLQotCSRzaG93ICIkaW5zdGFsbF9wcm9nJHN0cmlwbWUgJGZpbGUgJGRlc3RmaWxlIgotCSRydW4gZXZhbCAiJGluc3RhbGxfcHJvZ1wkc3RyaXBtZSBcJGZpbGUgXCRkZXN0ZmlsZSIgfHwgZXhpdCAkPwotCXRlc3QgLW4gIiRvdXRwdXRuYW1lIiAmJiAkcm0gJG91dHB1dG5hbWUKLQk7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgIGZvciBmaWxlIGluICRzdGF0aWNsaWJzOyBkbwotICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0gICAgICAjIFNldCB1cCB0aGUgcmFubGliIHBhcmFtZXRlcnMuCi0gICAgICBvbGRsaWI9IiRkZXN0ZGlyLyRuYW1lIgotCi0gICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkb2xkbGliIgotICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkZmlsZSBcJG9sZGxpYiIgfHwgZXhpdCAkPwotCi0gICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCi0gICAgICBldmFsIGNtZHM9XCIkb2xkX3Bvc3RpbnN0YWxsX2NtZHNcIgotICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JSUZTPSIkc2F2ZV9pZnMiCi0JJHNob3cgIiRjbWQiCi0JJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC1uICIkZnV0dXJlX2xpYmRpcnMiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiByZW1lbWJlciB0byBydW4gXGAkcHJvZ25hbWUgLS1maW5pc2gkZnV0dXJlX2xpYmRpcnMnIiAxPiYyCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRjdXJyZW50X2xpYmRpcnMiOyB0aGVuCi0gICAgICAjIE1heWJlIGp1c3QgZG8gYSBkcnkgcnVuLgotICAgICAgdGVzdCAtbiAiJHJ1biIgJiYgY3VycmVudF9saWJkaXJzPSIgLW4kY3VycmVudF9saWJkaXJzIgotICAgICAgZXhlYyAkU0hFTEwgJDAgLS1maW5pc2gkY3VycmVudF9saWJkaXJzCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAjIGxpYnRvb2wgZmluaXNoIG1vZGUKLSAgZmluaXNoKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGZpbmlzaCIKLSAgICBsaWJkaXJzPSIkbm9ub3B0IgotICAgIGFkbWluY21kcz0KLQotICAgIGlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyRmaW5pc2hfZXZhbCIgJiYgdGVzdCAtbiAiJGxpYmRpcnMiOyB0aGVuCi0gICAgICBmb3IgZGlyCi0gICAgICBkbwotCWxpYmRpcnM9IiRsaWJkaXJzICRkaXIiCi0gICAgICBkb25lCi0KLSAgICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCi0JaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzIjsgdGhlbgotCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGZpbmlzaCBjb21tYW5kcy4KLQkgIGV2YWwgY21kcz1cIiRmaW5pc2hfY21kc1wiCi0JICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICRzaG93ICIkY21kIgotCSAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGFkbWluY21kcz0iJGFkbWluY21kcwotICAgICAgICRjbWQiCi0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQlmaQotCWlmIHRlc3QgLW4gIiRmaW5pc2hfZXZhbCI7IHRoZW4KLQkgICMgRG8gdGhlIHNpbmdsZSBmaW5pc2hfZXZhbC4KLQkgIGV2YWwgY21kcz1cIiRmaW5pc2hfZXZhbFwiCi0JICAkcnVuIGV2YWwgIiRjbWRzIiB8fCBhZG1pbmNtZHM9IiRhZG1pbmNtZHMKLSAgICAgICAkY21kcyIKLQlmaQotICAgICAgZG9uZQotICAgIGZpCi0KLSAgICAjIEV4aXQgaGVyZSBpZiB0aGV5IHdhbnRlZCBzaWxlbnQgbW9kZS4KLSAgICB0ZXN0ICIkc2hvdyIgPSA6ICYmIGV4aXQgMAotCi0gICAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLSAgICBlY2hvICJMaWJyYXJpZXMgaGF2ZSBiZWVuIGluc3RhbGxlZCBpbjoiCi0gICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KLSAgICAgIGVjaG8gIiAgICRsaWJkaXIiCi0gICAgZG9uZQotICAgIGVjaG8KLSAgICBlY2hvICJJZiB5b3UgZXZlciBoYXBwZW4gdG8gd2FudCB0byBsaW5rIGFnYWluc3QgaW5zdGFsbGVkIGxpYnJhcmllcyIKLSAgICBlY2hvICJpbiBhIGdpdmVuIGRpcmVjdG9yeSwgTElCRElSLCB5b3UgbXVzdCBlaXRoZXIgdXNlIGxpYnRvb2wsIGFuZCIKLSAgICBlY2hvICJzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBsaWJyYXJ5LCBvciB1c2UgXGAtTExJQkRJUiciCi0gICAgZWNobyAiZmxhZyBkdXJpbmcgbGlua2luZyBhbmQgZG8gYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmc6IgotICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotICAgICAgZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRzaGxpYnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKLSAgICAgIGVjaG8gIiAgICAgZHVyaW5nIGV4ZWN1dGlvbiIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLSAgICAgIGVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkcnVucGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgotICAgICAgZWNobyAiICAgICBkdXJpbmcgbGlua2luZyIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotICAgICAgbGliZGlyPUxJQkRJUgotICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCi0gICAgICBlY2hvICIgICAtIHVzZSB0aGUgXGAkZmxhZycgbGlua2VyIGZsYWciCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkYWRtaW5jbWRzIjsgdGhlbgotICAgICAgZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgcnVuIHRoZXNlIGNvbW1hbmRzOiRhZG1pbmNtZHMiCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgotICAgICAgZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgYWRkIExJQkRJUiB0byBcYC9ldGMvbGQuc28uY29uZiciCi0gICAgZmkKLSAgICBlY2hvCi0gICAgZWNobyAiU2VlIGFueSBvcGVyYXRpbmcgc3lzdGVtIGRvY3VtZW50YXRpb24gYWJvdXQgc2hhcmVkIGxpYnJhcmllcyBmb3IiCi0gICAgZWNobyAibW9yZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgbGQoMSkgYW5kIGxkLnNvKDgpIG1hbnVhbCBwYWdlcy4iCi0gICAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLSAgICBleGl0IDAKLSAgICA7OwotCi0gICMgbGlidG9vbCBleGVjdXRlIG1vZGUKLSAgZXhlY3V0ZSkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBleGVjdXRlIgotCi0gICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGNvbW1hbmQgbmFtZS4KLSAgICBjbWQ9IiRub25vcHQiCi0gICAgaWYgdGVzdCAteiAiJGNtZCI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBDT01NQU5EIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgIyBIYW5kbGUgLWRsb3BlbiBmbGFncyBpbW1lZGlhdGVseS4KLSAgICBmb3IgZmlsZSBpbiAkZXhlY3V0ZV9kbGZpbGVzOyBkbwotICAgICAgaWYgdGVzdCAhIC1mICIkZmlsZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBcYCRmaWxlJyBpcyBub3QgYSBmaWxlIiAxPiYyCi0JJGVjaG8gIiRoZWxwIiAxPiYyCi0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBkaXI9Ci0gICAgICBjYXNlICIkZmlsZSIgaW4KLSAgICAgICoubGEpCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlpZiAoc2VkIC1lICcycScgJGZpbGUgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQkjIFJlYWQgdGhlIGxpYnRvb2wgbGlicmFyeS4KLQlkbG5hbWU9Ci0JbGlicmFyeV9uYW1lcz0KLQotCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCWNhc2UgIiRmaWxlIiBpbgotCSovKiB8ICpcXCopIC4gJGZpbGUgOzsKLQkqKSAuIC4vJGZpbGUgOzsKLQllc2FjCi0KLQkjIFNraXAgdGhpcyBsaWJyYXJ5IGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZC4KLQlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgotCSAgIyBXYXJuIGlmIGl0IHdhcyBhIHNoYXJlZCBsaWJyYXJ5LgotCSAgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGZpbGUnIHdhcyBub3QgbGlua2VkIHdpdGggXGAtZXhwb3J0LWR5bmFtaWMnIgotCSAgY29udGludWUKLQlmaQotCi0JZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KLQotCWlmIHRlc3QgLWYgIiRkaXIvJG9iamRpci8kZGxuYW1lIjsgdGhlbgotCSAgZGlyPSIkZGlyLyRvYmpkaXIiCi0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgXGAkZGxuYW1lJyBpbiBcYCRkaXInIG9yIFxgJGRpci8kb2JqZGlyJyIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQk7OwotCi0gICAgICAqLmxvKQotCSMgSnVzdCBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAubG8gZmlsZS4KLQlkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgotCTs7Ci0KLSAgICAgICopCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZyBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG5vbi1saWJ0b29sIGxpYnJhcmllcyBhbmQgb2JqZWN0cyIgMT4mMgotCWNvbnRpbnVlCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBHZXQgdGhlIGFic29sdXRlIHBhdGhuYW1lLgotICAgICAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAotICAgICAgdGVzdCAtbiAiJGFic2RpciIgJiYgZGlyPSIkYWJzZGlyIgotCi0gICAgICAjIE5vdyBhZGQgdGhlIGRpcmVjdG9yeSB0byBzaGxpYnBhdGhfdmFyLgotICAgICAgaWYgZXZhbCAidGVzdCAteiBcIlwkJHNobGlicGF0aF92YXJcIiI7IHRoZW4KLQlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyXCIiCi0gICAgICBlbHNlCi0JZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpcjpcJCRzaGxpYnBhdGhfdmFyXCIiCi0gICAgICBmaQotICAgIGRvbmUKLQotICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgc2hsaWJwYXRoX3ZhcgotICAgICMgcmF0aGVyIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KLSAgICBsaWJ0b29sX2V4ZWN1dGVfbWFnaWM9IiRtYWdpYyIKLQotICAgICMgQ2hlY2sgaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgaXMgYSB3cmFwcGVyIHNjcmlwdC4KLSAgICBhcmdzPQotICAgIGZvciBmaWxlCi0gICAgZG8KLSAgICAgIGNhc2UgIiRmaWxlIiBpbgotICAgICAgLSopIDs7Ci0gICAgICAqKQotCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KLQlpZiAoc2VkIC1lICc0cScgJGZpbGUgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCSAgY2FzZSAiJGZpbGUiIGluCi0JICAqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0JICAqKSAuIC4vJGZpbGUgOzsKLQkgIGVzYWMKLQotCSAgIyBUcmFuc2Zvcm0gYXJnIHRvIHdyYXBwZWQgbmFtZS4KLQkgIGZpbGU9IiRwcm9nZGlyLyRwcm9ncmFtIgotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgICMgUXVvdGUgYXJndW1lbnRzICh0byBwcmVzZXJ2ZSBzaGVsbCBtZXRhY2hhcmFjdGVycykuCi0gICAgICBmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGFyZ3M9IiRhcmdzIFwiJGZpbGVcIiIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotICAgICAgIyBFeHBvcnQgdGhlIHNobGlicGF0aF92YXIuCi0gICAgICBldmFsICJleHBvcnQgJHNobGlicGF0aF92YXIiCi0KLSAgICAgICMgUmVzdG9yZSBzYXZlZCBlbnZpcm9tZW50IHZhcmlhYmxlcwotICAgICAgaWYgdGVzdCAiJHtzYXZlX0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbgotCUxDX0FMTD0iJHNhdmVfTENfQUxMIjsgZXhwb3J0IExDX0FMTAotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR7c2F2ZV9MQU5HK3NldH0iID0gc2V0OyB0aGVuCi0JTEFORz0iJHNhdmVfTEFORyI7IGV4cG9ydCBMQU5HCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBhY3R1YWxseSBleGVjIHRoZSBjb21tYW5kLgotICAgICAgZXZhbCAiZXhlYyBcJGNtZCRhcmdzIgotCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZXhlYyBcJGNtZCRhcmdzIgotICAgICAgZXhpdCAxCi0gICAgZWxzZQotICAgICAgIyBEaXNwbGF5IHdoYXQgd291bGQgYmUgZG9uZS4KLSAgICAgIGV2YWwgIlwkZWNobyBcIlwkc2hsaWJwYXRoX3Zhcj1cJCRzaGxpYnBhdGhfdmFyXCIiCi0gICAgICAkZWNobyAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgotICAgICAgJGVjaG8gIiRjbWQkYXJncyIKLSAgICAgIGV4aXQgMAotICAgIGZpCi0gICAgOzsKLQotICAjIGxpYnRvb2wgdW5pbnN0YWxsIG1vZGUKLSAgdW5pbnN0YWxsKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IHVuaW5zdGFsbCIKLSAgICBybT0iJG5vbm9wdCIKLSAgICBmaWxlcz0KLQotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC0qKSBybT0iJHJtICRhcmciIDs7Ci0gICAgICAqKSBmaWxlcz0iJGZpbGVzICRhcmciIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAteiAiJHJtIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBSTSBwcm9ncmFtIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0gICAgICBkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICAgIHRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCi0gICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLSAgICAgIHJtZmlsZXM9IiRmaWxlIgotCi0gICAgICBjYXNlICIkbmFtZSIgaW4KLSAgICAgICoubGEpCi0JIyBQb3NzaWJseSBhIGxpYnRvb2wgYXJjaGl2ZSwgc28gdmVyaWZ5IGl0LgotCWlmIChzZWQgLWUgJzJxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgLiAkZGlyLyRuYW1lCi0KLQkgICMgRGVsZXRlIHRoZSBsaWJ0b29sIGxpYnJhcmllcyBhbmQgc3ltbGlua3MuCi0JICBmb3IgbiBpbiAkbGlicmFyeV9uYW1lczsgZG8KLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kbiIKLQkgICAgdGVzdCAiWCRuIiA9ICJYJGRsbmFtZSIgJiYgZGxuYW1lPQotCSAgZG9uZQotCSAgdGVzdCAtbiAiJGRsbmFtZSIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kZGxuYW1lIgotCSAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRvbGRfbGlicmFyeSIKLQotCSAgJHNob3cgIiRybSAkcm1maWxlcyIKLQkgICRydW4gJHJtICRybWZpbGVzCi0KLQkgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgdGhlbgotCSAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KLQkgICAgZXZhbCBjbWRzPVwiJHBvc3R1bmluc3RhbGxfY21kc1wiCi0JICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICAgJHNob3cgIiRjbWQiCi0JICAgICAgJHJ1biBldmFsICIkY21kIgotCSAgICBkb25lCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgZmkKLQotCSAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgb2xkX3Bvc3R1bmluc3RhbGwgY29tbWFuZHMuCi0JICAgIGV2YWwgY21kcz1cIiRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzXCIKLQkgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgICAkc2hvdyAiJGNtZCIKLQkgICAgICAkcnVuIGV2YWwgIiRjbWQiCi0JICAgIGRvbmUKLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICBmaQotCi0JICAjIEZJWE1FOiBzaG91bGQgcmVpbnN0YWxsIHRoZSBiZXN0IHJlbWFpbmluZyBzaGFyZWQgbGlicmFyeS4KLQlmaQotCTs7Ci0KLSAgICAgICoubG8pCi0JaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSAgb2xkb2JqPWAkZWNobyAiWCRuYW1lIiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRvbGRvYmoiCi0JZmkKLQkkc2hvdyAiJHJtICRybWZpbGVzIgotCSRydW4gJHJtICRybWZpbGVzCi0JOzsKLQotICAgICAgKikKLQkkc2hvdyAiJHJtICRybWZpbGVzIgotCSRydW4gJHJtICRybWZpbGVzCi0JOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAiIikKLSAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgTU9ERSIgMT4mMgotICAgICRlY2hvICIkZ2VuZXJpY19oZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gICAgOzsKLSAgZXNhYwotCi0gICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciIDE+JjIKLSAgJGVjaG8gIiRnZW5lcmljX2hlbHAiIDE+JjIKLSAgZXhpdCAxCi1maSAjIHRlc3QgLXogIiRzaG93X2hlbHAiCi0KLSMgV2UgbmVlZCB0byBkaXNwbGF5IGhlbHAgZm9yIGVhY2ggb2YgdGhlIG1vZGVzLgotY2FzZSAiJG1vZGUiIGluCi0iIikgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gW01PREUtQVJHXS4uLgotCi1Qcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLQotICAgIC0tY29uZmlnICAgICAgICAgIHNob3cgYWxsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCi0gICAgLS1kZWJ1ZyAgICAgICAgICAgZW5hYmxlIHZlcmJvc2Ugc2hlbGwgdHJhY2luZwotLW4sIC0tZHJ5LXJ1biAgICAgICAgIGRpc3BsYXkgY29tbWFuZHMgd2l0aG91dCBtb2RpZnlpbmcgYW55IGZpbGVzCi0gICAgLS1mZWF0dXJlcyAgICAgICAgZGlzcGxheSBiYXNpYyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0gICAgLS1maW5pc2ggICAgICAgICAgc2FtZSBhcyBcYC0tbW9kZT1maW5pc2gnCi0gICAgLS1oZWxwICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAotICAgIC0tbW9kZT1NT0RFICAgICAgIHVzZSBvcGVyYXRpb24gbW9kZSBNT0RFIFtkZWZhdWx0PWluZmVycmVkIGZyb20gTU9ERS1BUkdTXQotICAgIC0tcXVpZXQgICAgICAgICAgIHNhbWUgYXMgXGAtLXNpbGVudCcKLSAgICAtLXNpbGVudCAgICAgICAgICBkb24ndCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCi0gICAgLS12ZXJzaW9uICAgICAgICAgcHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbgotCi1NT0RFIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICAgIGNvbXBpbGUgICAgICAgICBjb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgb2JqZWN0Ci0gICAgICBleGVjdXRlICAgICAgICAgYXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0KLSAgICAgIGZpbmlzaCAgICAgICAgICBjb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzCi0gICAgICBpbnN0YWxsICAgICAgICAgaW5zdGFsbCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMKLSAgICAgIGxpbmsgICAgICAgICAgICBjcmVhdGUgYSBsaWJyYXJ5IG9yIGFuIGV4ZWN1dGFibGUKLSAgICAgIHVuaW5zdGFsbCAgICAgICByZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGVkIGRpcmVjdG9yeQotCi1NT0RFLUFSR1MgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE1PREUuICBUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT1NT0RFJyBmb3IKLWEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBNT0RFLiIKLSAgZXhpdCAwCi0gIDs7Ci0KLWNvbXBpbGUpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jb21waWxlIENPTVBJTEUtQ09NTUFORC4uLiBTT1VSQ0VGSUxFCi0KLUNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBsaWJyYXJ5IG9iamVjdC4KLQotVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6Ci0KLSAgLW8gT1VUUFVULUZJTEUgICAgc2V0IHRoZSBvdXRwdXQgZmlsZSBuYW1lIHRvIE9VVFBVVC1GSUxFCi0gIC1zdGF0aWMgICAgICAgICAgIGFsd2F5cyBidWlsZCBhIFxgLm8nIGZpbGUgc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nCi0KLUNPTVBJTEUtQ09NTUFORCBpcyBhIGNvbW1hbmQgdG8gYmUgdXNlZCBpbiBjcmVhdGluZyBhIFxgc3RhbmRhcmQnIG9iamVjdCBmaWxlCi1mcm9tIHRoZSBnaXZlbiBTT1VSQ0VGSUxFLgotCi1UaGUgb3V0cHV0IGZpbGUgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHJlbW92aW5nIHRoZSBkaXJlY3RvcnkgY29tcG9uZW50IGZyb20KLVNPVVJDRUZJTEUsIHRoZW4gc3Vic3RpdHV0aW5nIHRoZSBDIHNvdXJjZSBjb2RlIHN1ZmZpeCBcYC5jJyB3aXRoIHRoZQotbGlicmFyeSBvYmplY3Qgc3VmZml4LCBcYC5sbycuIgotICA7OwotCi1leGVjdXRlKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZXhlY3V0ZSBDT01NQU5EIFtBUkdTXS4uLgotCi1BdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbS4KLQotVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6Ci0KLSAgLWRsb3BlbiBGSUxFICAgICAgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBGSUxFIHRvIHRoZSBsaWJyYXJ5IHBhdGgKLQotVGhpcyBtb2RlIHNldHMgdGhlIGxpYnJhcnkgcGF0aCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhY2NvcmRpbmcgdG8gXGAtZGxvcGVuJwotZmxhZ3MuCi0KLUlmIGFueSBvZiB0aGUgQVJHUyBhcmUgbGlidG9vbCBleGVjdXRhYmxlIHdyYXBwZXJzLCB0aGVuIHRoZXkgYXJlIHRyYW5zbGF0ZWQKLWludG8gdGhlaXIgY29ycmVzcG9uZGluZyB1bmluc3RhbGxlZCBiaW5hcnksIGFuZCBhbnkgb2YgdGhlaXIgcmVxdWlyZWQgbGlicmFyeQotZGlyZWN0b3JpZXMgYXJlIGFkZGVkIHRvIHRoZSBsaWJyYXJ5IHBhdGguCi0KLVRoZW4sIENPTU1BTkQgaXMgZXhlY3V0ZWQsIHdpdGggQVJHUyBhcyBhcmd1bWVudHMuIgotICA7OwotCi1maW5pc2gpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1maW5pc2ggW0xJQkRJUl0uLi4KLQotQ29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcy4KLQotRWFjaCBMSUJESVIgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBsaWJ0b29sIGxpYnJhcmllcy4KLQotVGhlIGNvbW1hbmRzIHRoYXQgdGhpcyBtb2RlIGV4ZWN1dGVzIG1heSByZXF1aXJlIHN1cGVydXNlciBwcml2aWxlZ2VzLiAgVXNlCi10aGUgXGAtLWRyeS1ydW4nIG9wdGlvbiBpZiB5b3UganVzdCB3YW50IHRvIHNlZSB3aGF0IHdvdWxkIGJlIGV4ZWN1dGVkLiIKLSAgOzsKLQotaW5zdGFsbCkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWluc3RhbGwgSU5TVEFMTC1DT01NQU5ELi4uCi0KLUluc3RhbGwgZXhlY3V0YWJsZXMgb3IgbGlicmFyaWVzLgotCi1JTlNUQUxMLUNPTU1BTkQgaXMgdGhlIGluc3RhbGxhdGlvbiBjb21tYW5kLiAgVGhlIGZpcnN0IGNvbXBvbmVudCBzaG91bGQgYmUKLWVpdGhlciB0aGUgXGBpbnN0YWxsJyBvciBcYGNwJyBwcm9ncmFtLgotCi1UaGUgcmVzdCBvZiB0aGUgY29tcG9uZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgYXJndW1lbnRzIHRvIHRoYXQgY29tbWFuZCAob25seQotQlNELWNvbXBhdGlibGUgaW5zdGFsbCBvcHRpb25zIGFyZSByZWNvZ25pemVkKS4iCi0gIDs7Ci0KLWxpbmspCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1saW5rIExJTkstQ09NTUFORC4uLgotCi1MaW5rIG9iamVjdCBmaWxlcyBvciBsaWJyYXJpZXMgdG9nZXRoZXIgdG8gZm9ybSBhbm90aGVyIGxpYnJhcnksIG9yIHRvCi1jcmVhdGUgYW4gZXhlY3V0YWJsZSBwcm9ncmFtLgotCi1MSU5LLUNPTU1BTkQgaXMgYSBjb21tYW5kIHVzaW5nIHRoZSBDIGNvbXBpbGVyIHRoYXQgeW91IHdvdWxkIHVzZSB0byBjcmVhdGUKLWEgcHJvZ3JhbSBmcm9tIHNldmVyYWwgb2JqZWN0IGZpbGVzLgotCi1UaGUgZm9sbG93aW5nIGNvbXBvbmVudHMgb2YgTElOSy1DT01NQU5EIGFyZSB0cmVhdGVkIHNwZWNpYWxseToKLQotICAtYWxsLXN0YXRpYyAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBhdCBhbGwKLSAgLWF2b2lkLXZlcnNpb24gICAgZG8gbm90IGFkZCBhIHZlcnNpb24gc3VmZml4IGlmIHBvc3NpYmxlCi0gIC1kbG9wZW4gRklMRSAgICAgIFxgLWRscHJlb3BlbicgRklMRSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQgYXQgcnVudGltZQotICAtZGxwcmVvcGVuIEZJTEUgICBsaW5rIGluIEZJTEUgYW5kIGFkZCBpdHMgc3ltYm9scyB0byBsdF9wcmVsb2FkZWRfc3ltYm9scwotICAtZXhwb3J0LWR5bmFtaWMgICBhbGxvdyBzeW1ib2xzIGZyb20gT1VUUFVULUZJTEUgdG8gYmUgcmVzb2x2ZWQgd2l0aCBkbHN5bSgzKQotICAtZXhwb3J0LXN5bWJvbHMgU1lNRklMRQotCQkgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIGxpc3RlZCBpbiBTWU1GSUxFCi0gIC1MTElCRElSICAgICAgICAgIHNlYXJjaCBMSUJESVIgZm9yIHJlcXVpcmVkIGluc3RhbGxlZCBsaWJyYXJpZXMKLSAgLWxOQU1FICAgICAgICAgICAgT1VUUFVULUZJTEUgcmVxdWlyZXMgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGxpYk5BTUUKLSAgLW1vZHVsZSAgICAgICAgICAgYnVpbGQgYSBsaWJyYXJ5IHRoYXQgY2FuIGRsb3BlbmVkCi0gIC1uby11bmRlZmluZWQgICAgIGRlY2xhcmUgdGhhdCBhIGxpYnJhcnkgZG9lcyBub3QgcmVmZXIgdG8gZXh0ZXJuYWwgc3ltYm9scwotICAtbyBPVVRQVVQtRklMRSAgICBjcmVhdGUgT1VUUFVULUZJTEUgZnJvbSB0aGUgc3BlY2lmaWVkIG9iamVjdHMKLSAgLXJlbGVhc2UgUkVMRUFTRSAgc3BlY2lmeSBwYWNrYWdlIHJlbGVhc2UgaW5mb3JtYXRpb24KLSAgLXJwYXRoIExJQkRJUiAgICAgdGhlIGNyZWF0ZWQgbGlicmFyeSB3aWxsIGV2ZW50dWFsbHkgYmUgaW5zdGFsbGVkIGluIExJQkRJUgotICAtUlsgXUxJQkRJUiAgICAgICBhZGQgTElCRElSIHRvIHRoZSBydW50aW1lIHBhdGggb2YgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcwotICAtc3RhdGljICAgICAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBvZiBsaWJ0b29sIGxpYnJhcmllcwotICAtdmVyc2lvbi1pbmZvIENVUlJFTlRbOlJFVklTSU9OWzpBR0VdXQotCQkgICAgc3BlY2lmeSBsaWJyYXJ5IHZlcnNpb24gaW5mbyBbZWFjaCB2YXJpYWJsZSBkZWZhdWx0cyB0byAwXQotCi1BbGwgb3RoZXIgb3B0aW9ucyAoYXJndW1lbnRzIGJlZ2lubmluZyB3aXRoIFxgLScpIGFyZSBpZ25vcmVkLgotCi1FdmVyeSBvdGhlciBhcmd1bWVudCBpcyB0cmVhdGVkIGFzIGEgZmlsZW5hbWUuICBGaWxlcyBlbmRpbmcgaW4gXGAubGEnIGFyZQotdHJlYXRlZCBhcyB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcywgb3RoZXIgZmlsZXMgYXJlIHN0YW5kYXJkIG9yIGxpYnJhcnkKLW9iamVjdCBmaWxlcy4KLQotSWYgdGhlIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubGEnLCB0aGVuIGEgbGlidG9vbCBsaWJyYXJ5IGlzIGNyZWF0ZWQsCi1vbmx5IGxpYnJhcnkgb2JqZWN0cyAoXGAubG8nIGZpbGVzKSBtYXkgYmUgc3BlY2lmaWVkLCBhbmQgXGAtcnBhdGgnIGlzCi1yZXF1aXJlZCwgZXhjZXB0IHdoZW4gY3JlYXRpbmcgYSBjb252ZW5pZW5jZSBsaWJyYXJ5LgotCi1JZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmEnIG9yIFxgLmxpYicsIHRoZW4gYSBzdGFuZGFyZCBsaWJyYXJ5IGlzIGNyZWF0ZWQKLXVzaW5nIFxgYXInIGFuZCBcYHJhbmxpYicsIG9yIG9uIFdpbmRvd3MgdXNpbmcgXGBsaWInLgotCi1JZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxvJyBvciBcYC4ke29iamV4dH0nLCB0aGVuIGEgcmVsb2FkYWJsZSBvYmplY3QgZmlsZQotaXMgY3JlYXRlZCwgb3RoZXJ3aXNlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbSBpcyBjcmVhdGVkLiIKLSAgOzsKLQotdW5pbnN0YWxsKQotICAkZWNobwotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPXVuaW5zdGFsbCBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCi0KLVJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotCi1STSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKLSh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKLXRvIFJNLgotCi1JZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcmUgZGVsZXRlZC4KLU90aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKLSAgOzsKLQotKikKLSAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgotICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCi0gIDs7Ci1lc2FjCi0KLWVjaG8KLSRlY2hvICJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciBtb2Rlcy4iCi0KLWV4aXQgMAotCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgbW9kZTpzaGVsbC1zY3JpcHQKLSMgc2gtaW5kZW50YXRpb246MgotIyBFbmQ6CmRpZmYgLS1naXQgYS9tYWtlYWxsLmJhdCBiL21ha2VhbGwuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmQ0MTVmLi4wMDAwMDAwCi0tLSBhL21ha2VhbGwuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotQGVjaG8gb2ZmDQotY2hkaXIgbGliaWJlcnR5DQotbWFrZSAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQ0KLWNoZGlyIC4uXGJmZA0KLW1ha2UgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCi1jaGRpciAuLlxvcGNvZGVzDQotbWFrZSAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQ0KLWNoZGlyIC4uXGdwcm9mDQotbWFrZSAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQ0KLWNoZGlyIC4uXGJpbnV0aWxzDQotbWFrZSAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQ0KLWNoZGlyIC4uXGdhcw0KLW1ha2UgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCi1jaGRpciAuLlxsZA0KLW1ha2UgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCi1jaGRpciAuLg0KZGlmZiAtLWdpdCBhL21ha2VmaWxlLnZtcyBiL21ha2VmaWxlLnZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllMzYzNC4uMDAwMDAwMAotLS0gYS9tYWtlZmlsZS52bXMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jCi0jIG1ha2VmaWxlIGZvciBiZmQsIGJpbnV0aWxzIGFuZCBnYXMKLSMKLSMgQ3JlYXRlZCBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotIwotIyBZb3UgbXVzdCB1c2UgVmVyc2lvbiAzLjc2IG9mIEdOVSBNYWtlCi0jCi0jCi0KLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1DQyA9IGdjYwotR0FTQ0MgPSAkKENDKQotZWxzZQotQ0MgPSBjYwotR0FTQ0MgPSBnY2MKLWVuZGlmCi0KLWlmZXEgKCQoQ0MpLGNjKQotICBDSEVDSy1DT01QSUxFUiA9IGNoZWNrX2NvbXBpbGVyCi1lbHNlCi0gIENIRUNLLUNPTVBJTEVSID0KLWVuZGlmCi0KLWFsbDoJY2hlY2tfY2MgJChDSEVDSy1DT01QSUxFUikgWy5iaW51dGlsc11tYWtlZmlsZS52bXMKLQkkKENEKSBbLmJmZF0KLQlAZ21ha2UgIkNDPSQoQ0MpIgotCSQoQ0QpIFstLm9wY29kZXNdCi0JQGdtYWtlICJDQz0kKENDKSIKLQkkKENEKSBbLS5saWJpYmVydHldCi0JQGdtYWtlICJDQz0kKENDKSIKLQkkKENEKSBbLS5iaW51dGlsc10KLQlAZ21ha2UgIkNDPSQoQ0MpIgotCSQoQ0QpIFstLmdhc10KLQlAZ21ha2UgIkNDPSQoR0FTQ0MpIgotCSQoQ0QpIFstXQotCi1jaGVja19jYzoKLWlmZXEgKCRDQywpCi0JQCQoRUNITykgIlBsZWFzZSBlZGl0IE1BS0VGSUxFLlZNUyBhbmQgc2VsZWN0IGEgQyBDb21waWxlci4iCi0Jc3RvcAotZW5kaWYKLQotY2hlY2tfY29tcGlsZXI6Ci0JQCQoRUNITykgIlBlcmZvcm0gYSAnJCQgQHNldHVwJyBiZWZvcmUgc3RhcnRpbmcgbWFrZSIKLQotWy5iaW51dGlsc11tYWtlZmlsZS52bXM6Ci0JJChDRCkgWy5iaW51dGlsc10KLQkkJCBAY29uZmlndXJlCi0JJChDRCkgWy1dCi0KLWluc3RhbGw6IGFsbAotCSQoQ0QpIFsuYmludXRpbHNdCi0JQGdtYWtlICJDQz0kKENDKSIgaW5zdGFsbAotCSQoQ0QpIFstXQotCSQoQ0QpIFsuZ2FzXQotCUBnbWFrZSAiQ0M9JChHQVNDQykiIGluc3RhbGwKLQkkKENEKSBbLV0KLQotY2xlYW46Ci0JJChDRCkgWy5iZmRdCi0JQGdtYWtlIGNsZWFuCi0JJChDRCkgWy0ub3Bjb2Rlc10KLQlAZ21ha2UgY2xlYW4KLQkkKENEKSBbLS5saWJpYmVydHldCi0JQGdtYWtlIGNsZWFuCi0JJChDRCkgWy0uYmludXRpbHNdCi0JQGdtYWtlIGNsZWFuCi0JJChDRCkgWy0uZ2FzXQotCUBnbWFrZSBjbGVhbgotCSQoQ0QpIFstXQotCmRpZmYgLS1naXQgYS9taXNzaW5nIGIvbWlzc2luZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzc4OTY1Mi4uMDAwMDAwMAotLS0gYS9taXNzaW5nCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29tbW9uIHN0dWIgZm9yIGEgZmV3IG1pc3NpbmcgR05VIHByb2dyYW1zIHdoaWxlIGluc3RhbGxpbmcuCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgRnJhbmMsb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+LCAxOTk2LgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSMgMDIxMTEtMTMwNywgVVNBLgotCi1pZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCi0gIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgZXhpdCAxCi1maQotCi1jYXNlICIkMSIgaW4KLQotICAtaHwtLWh8LS1oZXwtLWhlbHwtLWhlbHApCi0gICAgZWNobyAiXAotJDAgW09QVElPTl0uLi4gUFJPR1JBTSBbQVJHVU1FTlRdLi4uCi0KLUhhbmRsZSBcYFBST0dSQU0gW0FSR1VNRU5UXS4uLicgZm9yIHdoZW4gUFJPR1JBTSBpcyBtaXNzaW5nLCBvciByZXR1cm4gYW4KLWVycm9yIHN0YXR1cyBpZiB0aGVyZSBpcyBubyBrbm93biBoYW5kbGluZyBmb3IgUFJPR1JBTS4KLQotT3B0aW9uczoKLSAgLWgsIC0taGVscCAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gIC12LCAtLXZlcnNpb24gICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotCi1TdXBwb3J0ZWQgUFJPR1JBTSB2YWx1ZXM6Ci0gIGFjbG9jYWwgICAgICB0b3VjaCBmaWxlIFxgYWNsb2NhbC5tNCcKLSAgYXV0b2NvbmYgICAgIHRvdWNoIGZpbGUgXGBjb25maWd1cmUnCi0gIGF1dG9oZWFkZXIgICB0b3VjaCBmaWxlIFxgY29uZmlnLmguaW4nCi0gIGF1dG9tYWtlICAgICB0b3VjaCBhbGwgXGBNYWtlZmlsZS5pbicgZmlsZXMKLSAgYmlzb24gICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXQotICBmbGV4ICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYwotICBsZXggICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYwotICBtYWtlaW5mbyAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCi0gIHlhY2MgICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0iCi0gICAgOzsKLQotICAtdnwtLXZ8LS12ZXwtLXZlcnwtLXZlcnN8LS12ZXJzaXwtLXZlcnNpb3wtLXZlcnNpb24pCi0gICAgZWNobyAibWlzc2luZyAtIEdOVSBsaWJpdCAwLjAiCi0gICAgOzsKLQotICAtKikKLSAgICBlY2hvIDE+JjIgIiQwOiBVbmtub3duIFxgJDEnIG9wdGlvbiIKLSAgICBlY2hvIDE+JjIgIlRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCi0gICAgZXhpdCAxCi0gICAgOzsKLQotICBhY2xvY2FsKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2luY2x1ZGUubTQnIG9yIFxgY29uZmlndXJlLmluJy4gIFlvdSBtaWdodCB3YW50Ci0gICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tCi0gICAgICAgICBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgdG91Y2ggYWNsb2NhbC5tNAotICAgIDs7Ci0KLSAgYXV0b2NvbmYpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYGNvbmZpZ3VyZS5pbicuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZQotICAgICAgICAgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUKLSAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCi0gICAgdG91Y2ggY29uZmlndXJlCi0gICAgOzsKLQotICBhdXRvaGVhZGVyKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2NvbmZpZy5oJyBvciBcYGNvbmZpZ3VyZS5pbicuICBZb3UgbWlnaHQgd2FudAotICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbQotICAgICAgICAgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgZmlsZXM9YHNlZCAtbiAncy9eWyBdKkFbQ01dX0NPTkZJR19IRUFERVIoXChbXildKlwpKS4qL1wxL3AnIGNvbmZpZ3VyZS5pbmAKLSAgICB0ZXN0IC16ICIkZmlsZXMiICYmIGZpbGVzPSJjb25maWcuaCIKLSAgICB0b3VjaF9maWxlcz0KLSAgICBmb3IgZiBpbiAkZmlsZXM7IGRvCi0gICAgICBjYXNlICIkZiIgaW4KLSAgICAgICo6KikgdG91Y2hfZmlsZXM9IiR0b3VjaF9maWxlcyAiYGVjaG8gIiRmIiB8Ci0JCQkJICAgICAgIHNlZCAtZSAncy9eW146XSo6Ly8nIC1lICdzLzouKi8vJ2A7OwotICAgICAgKikgdG91Y2hfZmlsZXM9IiR0b3VjaF9maWxlcyAkZi5pbiI7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgICB0b3VjaCAkdG91Y2hfZmlsZXMKLSAgICA7OwotCi0gIGF1dG9tYWtlKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBNYWtlZmlsZS5hbScsIFxgYWNpbmNsdWRlLm00JyBvciBcYGNvbmZpZ3VyZS5pbicuCi0gICAgICAgICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4KLSAgICAgICAgIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaW5kIC4gLXR5cGUgZiAtbmFtZSBNYWtlZmlsZS5hbSAtcHJpbnQgfAotCSAgIHNlZCAncy9cLmFtJC8uaW4vJyB8Ci0JICAgd2hpbGUgcmVhZCBmOyBkbyB0b3VjaCAiJGYiOyBkb25lCi0gICAgOzsKLQotICBiaXNvbnx5YWNjKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC55JyBmaWxlLiAgWW91IG1heSBuZWVkIHRoZSBcYEJpc29uJyBwYWNrYWdlCi0gICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0Ci0gICAgICAgICBcYEJpc29uJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBybSAtZiB5LnRhYi5jIHkudGFiLmgKLSAgICBpZiBbICQjIC1uZSAxIF07IHRoZW4KLSAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCi0JY2FzZSAiJExBU1RBUkciIGluCi0JKi55KQotCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvYy8nYAotCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuYwotCSAgICBmaQotCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvaC8nYAotCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAotCSAgICBmaQotCSAgOzsKLQllc2FjCi0gICAgZmkKLSAgICBpZiBbICEgLWYgeS50YWIuaCBdOyB0aGVuCi0JZWNobyA+eS50YWIuaAotICAgIGZpCi0gICAgaWYgWyAhIC1mIHkudGFiLmMgXTsgdGhlbgotCWVjaG8gJ21haW4oKSB7IHJldHVybiAwOyB9JyA+eS50YWIuYwotICAgIGZpCi0gICAgOzsKLQotICBsZXh8ZmxleCkKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAubCcgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBGbGV4JyBwYWNrYWdlCi0gICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0Ci0gICAgICAgICBcYEZsZXgnIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIHJtIC1mIGxleC55eS5jCi0gICAgaWYgWyAkIyAtbmUgMSBdOyB0aGVuCi0gICAgICAgIGV2YWwgTEFTVEFSRz0iXCR7JCN9IgotCWNhc2UgIiRMQVNUQVJHIiBpbgotCSoubCkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL2wkL2MvJ2AKLQkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KLQkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIGxleC55eS5jCi0JICAgIGZpCi0JICA7OwotCWVzYWMKLSAgICBmaQotICAgIGlmIFsgISAtZiBsZXgueXkuYyBdOyB0aGVuCi0JZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID5sZXgueXkuYwotICAgIGZpCi0gICAgOzsKLQotICBtYWtlaW5mbykKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAudGV4aScgb3IgXGAudGV4aW5mbycgZmlsZSwgb3IgYW55IG90aGVyIGZpbGUKLSAgICAgICAgIGluZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBhc3BlY3Qgb2YgdGhlIG1hbnVhbC4gIFRoZSBzcHVyaW91cwotICAgICAgICAgY2FsbCBtaWdodCBhbHNvIGJlIHRoZSBjb25zZXF1ZW5jZSBvZiB1c2luZyBhIGJ1Z2d5IFxgbWFrZScgKEFJWCwKLSAgICAgICAgIERVLCBJUklYKS4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgVGV4aW5mbycgcGFja2FnZSBvcgotICAgICAgICAgdGhlIFxgR05VIG1ha2UnIHBhY2thZ2UuICBHcmFiIGVpdGhlciBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotbyBcKFteIF0qXCkuKi9cMS9wJ2AKLSAgICBpZiB0ZXN0IC16ICIkZmlsZSI7IHRoZW4KLSAgICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAncy8uKiBcKFteIF0qXCkgKiQvXDEvJ2AKLSAgICAgIGZpbGU9YHNlZCAtbiAnL15Ac2V0ZmlsZW5hbWUvIHsgcy8uKiBcKFteIF0qXCkgKiQvXDEvOyBwOyBxOyB9JyAkZmlsZWAKLSAgICBmaQotICAgIHRvdWNoICRmaWxlCi0gICAgOzsKLQotICAqKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbmVlZGVkLCBhbmQgeW91IGRvIG5vdCBzZWVtIHRvIGhhdmUgaXQgaGFuZHkgb24geW91cgotICAgICAgICAgc3lzdGVtLiAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKLSAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLiAgQ2hlY2sgdGhlIFxgUkVBRE1FJyBmaWxlLAotICAgICAgICAgaXQgb2Z0ZW4gdGVsbHMgeW91IGFib3V0IHRoZSBuZWVkZWQgcHJlcmVxdWlyZW1lbnRzIGZvciBpbnN0YWxsaW5nCi0gICAgICAgICB0aGlzIHBhY2thZ2UuICBZb3UgbWF5IGFsc28gcGVlayBhdCBhbnkgR05VIGFyY2hpdmUgc2l0ZSwgaW4gY2FzZQotICAgICAgICAgc29tZSBvdGhlciBwYWNrYWdlIHdvdWxkIGNvbnRhaW4gdGhpcyBtaXNzaW5nIFxgJDEnIHByb2dyYW0uIgotICAgIGV4aXQgMQotICAgIDs7Ci1lc2FjCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvbWtpbnN0YWxsZGlycyBiL21raW5zdGFsbGRpcnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjODc4M2UuLjAwMDAwMDAKLS0tIGEvbWtpbnN0YWxsZGlycworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgbWtpbnN0YWxsZGlycyAtLS0gbWFrZSBkaXJlY3RvcnkgaGllcmFyY2h5Ci0jIEF1dGhvcjogTm9haCBGcmllZG1hbiA8ZnJpZWRtYW5AcHJlcC5haS5taXQuZWR1PgotIyBDcmVhdGVkOiAxOTkzLTA1LTE2Ci0jIExhc3QgbW9kaWZpZWQ6IDE5OTQtMDMtMjUKLSMgUHVibGljIGRvbWFpbgotCi1lcnJzdGF0dXM9MAotCi1mb3IgZmlsZSBpbiAkezErIiRAIn0gOyBkbyAKLSAgIHNldCBmbm9yZCBgZWNobyAiOiRmaWxlIiB8IHNlZCAtbmUgJ3MvXjpcLy8jLztzL146Ly87cy9cLy8gL2c7cy9eIy9cLy87cCdgCi0gICBzaGlmdAotCi0gICBwYXRoY29tcD0KLSAgIGZvciBkIGluICR7MSsiJEAifSA7IGRvCi0gICAgIHBhdGhjb21wPSIkcGF0aGNvbXAkZCIKLSAgICAgY2FzZSAiJHBhdGhjb21wIiBpbgotICAgICAgIC0qICkgcGF0aGNvbXA9Li8kcGF0aGNvbXAgOzsKLSAgICAgZXNhYwotCi0gICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgotICAgICAgICBlY2hvICJta2RpciAkcGF0aGNvbXAiIDE+JjIKLSAgICAgICAgbWtkaXIgIiRwYXRoY29tcCIgPiAvZGV2L251bGwgMj4mMSB8fCBsYXN0ZXJyPSQ/Ci0gICAgIGZpCi0KLSAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCi0JZXJyc3RhdHVzPSRsYXN0ZXJyCi0gICAgIGZpCi0KLSAgICAgcGF0aGNvbXA9IiRwYXRoY29tcC8iCi0gICBkb25lCi1kb25lCi0KLWV4aXQgJGVycnN0YXR1cwotCi0jIG1raW5zdGFsbGRpcnMgZW5kcyBoZXJlCmRpZmYgLS1naXQgYS9tb3ZlLWlmLWNoYW5nZSBiL21vdmUtaWYtY2hhbmdlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZTFiMzQ4Li4wMDAwMDAwCi0tLSBhL21vdmUtaWYtY2hhbmdlCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1pZgotdGVzdCAtciAkMgotdGhlbgotaWYKLWNtcCAkMSAkMiA+IC9kZXYvbnVsbAotdGhlbgotZWNobyAkMiBpcyB1bmNoYW5nZWQKLXJtIC1mICQxCi1lbHNlCi1tdiAtZiAkMSAkMgotZmkKLWVsc2UKLW12IC1mICQxICQyCi1maQpkaWZmIC0tZ2l0IGEvbXB3LVJFQURNRSBiL21wdy1SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NzE0MGIuLjAwMDAwMDAKLS0tIGEvbXB3LVJFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi1UaGlzIGlzIGJhc2ljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBNYWNpbnRvc2godG0pIE1QVyh0bSkgcG9ydCBvZiB0aGUKLUdOVSB0b29scy4gIFRoZSBpbmZvcm1hdGlvbiBiZWxvdyBhcHBsaWVzIHRvIGJvdGggbmF0aXZlIGFuZCBjcm9zcwotY29tcGlsZXJzLgotCi0oUGxlYXNlIG5vdGUgdGhhdCB0aGVyZSBhcmUgdHdvIHZlcnNpb25zIG9mIHRoaXMgZmlsZTsgIm1wdy1SRUFETUUiCi1pcyB0aGUgc291cmNlIGZvcm0sIGFuZCAiUmVhZCBNZSBmb3IgTVBXIiBpcyB0aGUgZGlzdHJpYnV0aW9uIGZvcm0uCi0iUmVhZCBNZSBmb3IgTVBXIiBoYXMgOC1iaXQgY2hhcnMgc3VjaCBhcyBcT3B0aW9uLWQgZW1iZWRkZWQgaW4gaXQuKQotCi1JTlNUQUxMSU5HIEdOVSBUT09MUwotCi0qIFN5c3RlbSBSZXF1aXJlbWVudHMKLQotVG8gdXNlIHRoZXNlIHRvb2xzLCB5b3Ugd2lsbCBuZWVkIGEgTWFjIHdpdGggYSA2ODAyMCBvciBiZXR0ZXIgb3IgZWxzZQotYW55IFBvd2VyTWFjLCBTeXN0ZW0gNy4xIG9yIGxhdGVyLCBhbmQgTVBXIDMuMyBvciAzLjQuICBZb3Ugd2lsbCAqbm90KgotbmVlZCBhbnkgb3RoZXIgTVBXIGNvbXBpbGVyIHVubGVzcyB5b3Ugd2FudCB0byByZWJ1aWxkIGZyb20gc291cmNlcywKLW5vciBldmVuIGFueSBpbmNsdWRlIGZpbGVzLCB1bmxlc3MgeW91IGFyZSBidWlsZGluZyBhY3R1YWwgTWFjCi1hcHBsaWNhdGlvbnMuICBGb3IgUG93ZXJNYWMgbmF0aXZlIHlvdSB3aWxsIG5lZWQgUFBDTGluaywgaG93ZXZlcjsKLWFsc28gdGhlIGV4ZWN1dGFibGVzIGFyZSBQb3dlclBDLW9ubHkuCi0KLSogQXV0b21hdGVkIEluc3RhbGxhdGlvbgotCi1UaGUgc2ltcGxlc3Qgd2F5IHRvIGluc3RhbGwgR05VIHRvb2xzIGlzIHRvIHJ1biB0aGUgSW5zdGFsbCBzY3JpcHQuCi1UaGUgc2NyaXB0IHdpbGwgY29weSB0aGluZ3MgdG8gd2hlcmUgeW91IHdhbnQgdG8ga2VlcCB0aGVtLCB3aWxsIGJ1aWxkCi1hIFVzZXJTdGFydHVwIGZpbGUgd2l0aCBzZXR0aW5ncyBjb3JyZXNwb25kaW5nIHRvIHdoZXJlIHRoaW5ncyB3ZXJlCi1jb3BpZWQsIGFuZCBvZmZlciB0byBwdXQgdGhhdCBVc2VyU3RhcnR1cCBmaWxlIGluIHlvdXIgTVBXIGZvbGRlci4KLQotVGhlIEluc3RhbGwgc2NyaXB0IGRvZXMgbm90IGFsdGVyIGFueXRoaW5nIGluIHRoZSBTeXN0ZW0gRm9sZGVyLCBhbmQKLWl0IGRvZXMgbm90IHRha2UgYW55IGFjdGlvbiB3aXRob3V0IGNvbmZpcm1hdGlvbi4KLQotVGhlIEluc3RhbGwgc2NyaXB0IHdpbGwgYmUgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgYmluYXJ5Ci1kaXN0cmlidXRpb24sIG9yIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIG9iamVjdCBkaXJlY3RvcnkgaWYKLXJlYnVpbGRpbmcgZnJvbSBzb3VyY2UuICAoVGhlIHNvdXJjZXMgaW5jbHVkZSBhIGZpbGUgY2FsbGVkCi0ibXB3LWluc3RhbGwiIGF0IHRoZSB0b3AgbGV2ZWwsIGJ1dCBpdCBpcyB0aGUgc291cmNlIHRvIHRoZSBJbnN0YWxsCi1zY3JpcHQgYW5kIGNhbm5vdCBiZSBydW4gZGlyZWN0bHkuKQotCi0qIE1hbnVhbCBJbnN0YWxsYXRpb24KLQotSWYgeW91IGRvbid0IHdhbnQgdG8gcnVuIHRoZSBJbnN0YWxsIHNjcmlwdCwgeW91IGNhbiBkbyBpbnN0YWxsYXRpb24KLW1hbnVhbGx5OyB0aGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBzdGVwcyBpbnZvbHZlZC4KLQotVGhlIEdOVSB0b29scyBjYW4gZ28gaW4gYW55IGRpcmVjdG9yeSB0aGF0IGlzIGluIHlvdXIge0NvbW1hbmRzfSBsaXN0LgotV2UgZ2VuZXJhbGx5IHB1dCBhbGwgdGhlIHRvb2xzIHNvbWV3aGVyZSBsaWtlIHtCb290fUN5Z251czpsYXRlc3Q6YmluLAotYW5kIHRoZW4gYWRkIHRvIGEgVXNlclN0YXJ0dXAgZmlsZToKLQotCXNldCBDb21tYW5kcyAie0Jvb3R9Q3lnbnVzOmxhdGVzdDpiaW46LHtDb21tYW5kc30iCi0KLUhvd2V2ZXIsIHRoZSBjcHAgYW5kIGNjMSBwcm9ncmFtcyBvZiBHQ0MgYXJlIG5vdCBub3JtYWxseSBzdG9yZWQgaGVyZS4KLUluc3RlYWQsIHRoZXkgd2lsbCBiZSBpbiBhICJsaWIiIGRpcmVjdG9yeSB0aGF0IGlzIGFsb25nc2lkZSAiYmluIiwKLWFuZCBvcmdhbml6ZWQgYnkgdGFyZ2V0IGFuZCB2ZXJzaW9uIHVuZGVybmVhdGgsIHdpdGggbmFtZXMgbGlrZQotCi0JOmxpYjpnY2MtbGliOjx0YXJnZXQ+OmN5Z251cy08dmVyc2lvbj46Ci0KLUlmIHlvdSBidWlsZCBhbmQgaW5zdGFsbCBldmVyeXRoaW5nIHlvdXJzZWxmIGFjY29yZGluZyB0byB0aGUgYnVpbGQKLWluc3RydWN0aW9ucyBiZWxvdywgdGhlbiB5b3Ugd2lsbCBub3QgaGF2ZSBhbnkgcHJvYmxlbXMuICBIb3dldmVyLCB5b3UKLW1heSBkaXNjb3ZlciB0aGF0IEdDQyBzZWVtcyB1bmFibGUgdG8gZmluZCB0aGUgcmlnaHQgY3BwIGFuZCBjYzE7Ci11c3VhbGx5IHRoaXMgd2lsbCBiZSBiZWNhdXNlIGRpcmVjdG9yeSBuYW1lcyBoYXZlIGNoYW5nZWQuICAoRXZlbgotcmVuYW1pbmcgeW91ciBoYXJkIGRpc2sgd2lsbCBtYWtlIHRoaXMgaGFwcGVuLikgIEluIHN1Y2ggY2FzZXMsIHlvdQotaGF2ZSBzZXZlcmFsIGNob2ljZXMuICBPbmUgaXMganVzdCB0byBhZGQgdGhpcyBkaXJlY3RvcnkgdG8KLXtDb21tYW5kc30sIGJ1dCB0aGVuIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGdldCBhbnkgb3RoZXIgY3BwIG9yIGNjMSwKLXN1Y2ggYXMgdGhvc2UgdXNlZCBieSBhIGRpZmZlcmVudCB0YXJnZXQgb3IgdmVyc2lvbi4gIEFub3RoZXIgd2F5IGlzCi10byByZW5hbWUgeW91ciBkaXNrIGFuZCBkaXJlY3RvcmllcyB0byBtYXRjaCB0aGUgcHJlZml4IHVzZWQgd2hlbiB0aGUKLXRvb2xzIHdlcmUgY29tcGlsZWQuICBGaW5hbGx5LCB5b3UgY2FuIHNldCB0aGUgdmFyaWFibGUKLUdDQ19FWEVDX1BSRUZJWCB0byBwb2ludCB0byB0aGUgbGlicmFyeSBkaXJlY3Rvcnk6Ci0KLQlzZXQgR0NDX0VYRUNfUFJFRklYIE15RGlzazpTdHVmZjpsaWI6Z2NjLWxpYjoKLQlleHBvcnQgR0NDX0VYRUNfUFJFRklYCi0KLVlvdSBtYXkgYWxzbyB3YW50IHRvIGVkaXQgTVBXJ3MgSEVYQSAxMjggcmVzb3VyY2UuICBXaGVuIEdDQyBpcyBidWlsdAotdXNpbmcgYSBuYXRpdmUgR0NDLCBpdCBpcyBjb21waWxlZCB0byB1c2UgYSBzcGVjaWFsIHN0YWNrIGFsbG9jYXRvcgotZnVuY3Rpb24gYWxsb2NhKCkuICBXaGlsZSB0aGlzIGlzIHZlcnkgZWZmaWNpZW50LCBpdCBtZWFucyB0aGF0IEdDQwotd2lsbCBuZWVkIGNvbnNpZGVyYWJsZSBzdGFjayBzcGFjZSB0byBydW4sIGVzcGVjaWFsbHkgd2hlbiBjb21waWxpbmcKLWxhcmdlIHByb2dyYW1zIHdpdGggb3B0aW1pemF0aW9uIHR1cm5lZCBvbi4gIFlvdSBnaXZlIE1QVyBtb3JlIHN0YWNrCi1ieSBlZGl0aW5nIHRoZSBIRVhBIDEyOCByZXNvdXJjZSBvZiB0aGUgTVBXIFNoZWxsLiAgQSB2YWx1ZSBvZiAiMDAwOAotMDAwMCIgZ2l2ZXMgNTEySyBvZiBzdGFjayBzaXplLCB3aGljaCBpcyB1c3VhbGx5IHN1ZmZpY2llbnQuCi0KLVVTSU5HIEdOVSBUT09MUwotCi0qIFVzaW5nIE5hdGl2ZSBQb3dlck1hYyBHQ0MKLQotVXNpbmcgYSBuYXRpdmUgUG93ZXJNYWMgR0NDIHRvIHByb2R1Y2UgTVBXIHRvb2xzIG9yIE1hY09TIGFwcGxpY2F0aW9ucwotaXMgbW9yZSBjb21wbGljYXRlZCB0aGFuIGp1c3QgImdDIGZvby5jIiwgYWx0aG91Z2ggbm8gbW9yZSBjb21wbGljYXRlZAotdGhhbiB3aXRoIG90aGVyIE1hYyBjb21waWxlcnMuCi0KLVRvIGJ1aWxkIGEgbmF0aXZlIFBvd2VyTWFjIE1QVyB0b29sLCB1c2UgdGhpcyBzZXF1ZW5jZSwgd2hlcmUgaGVsbG8uYwotaXMgdGhlIHVzdWFsICJoZWxsbyB3b3JsZCIgcHJvZ3JhbSwgYW5kIGdlbmVyaWNjZnJnLnIgaXMgdGhlIFJleiBmaWxlCi13aXRoIHRoZSBjb2RlIGZyYWdtZW50IHJlc291cmNlOgotCi1nQyAtSXtDSW5jbHVkZXN9IC1mbm8tYnVpbHRpbiAtRHBhc2NhbD0gLWMgLWcgaGVsbG8uYwotUFBDTGluayBoZWxsby5vIC1vIGhlbGxvIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJTdGRDUnVudGltZS5vIFxPcHRpb24tZAotCSJ7U2hhcmVkTGlicmFyaWVzfSJJbnRlcmZhY2VMaWIgXE9wdGlvbi1kCi0JIntTaGFyZWRMaWJyYXJpZXN9IlN0ZENMaWIgXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlBQQ1Rvb2xMaWJzLm8gXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlBQQ0NSdW50aW1lLm8gXE9wdGlvbi1kCi0JIntHQ0NQUENMaWJyYXJpZXN9ImxpYmdjYy54Y29mZgotcmV6IC1kIEFQUE5BTUU9JyInaGVsbG8nIicgR2VuZXJpY0NGUkcuciAtbyBoZWxsbwotc2V0ZmlsZSAtdCAnTVBTVCcgLWMgJ01QUyAnIGhlbGxvCi0KLVRoZSBzYW1lIHNlcXVlbmNlIHdvcmtzIHRvIGJ1aWxkIGEgTWFjT1MgYXBwbGljYXRpb24sIGJ1dCB5b3Ugc2V0IHRoZSBmaWxlCi10eXBlIHRvICdBUFBMJyBhbmQgZG9uJ3QgbGluayBpbiBQUENUb29sTGlicy5vLiAgRm9yIGZ1cnRoZXIgZGV0YWlscyBvbgotdXNpbmcgTVBXIHRvIGJ1aWxkIE1hYyBhcHBsaWNhdGlvbnMsIHNlZSB0aGUgZ2VuZXJhbCBNUFcgZG9jdW1lbnRhdGlvbi4KLQotUmVjZW50IHZlcnNpb25zIG9mIFBQQ0xpbmsgaGF2ZSBhbiBvcHRpb24gdG8gZ2VuZXJhdGUgdGhlIGNvZGUKLWZyYWdtZW50IHJlc291cmNlIGFuZCBhdXRvbWF0aWNhbGx5IHNldCBjcmVhdG9yIGFuZCBmaWxlIHR5cGU7Ci1oZXJlIGlzIHdoYXQgR2VuZXJpY0NGUkcuciBzaG91bGQgbG9vayBsaWtlIGlmIHlvdSBoYXZlIGFuIG9sZGVyCi1QUENMaW5rIG9yIGFyZSB1c2luZyBHTlUgbGQ6Ci0KLSNpbmNsdWRlICJDb2RlRnJhZ21lbnRUeXBlcy5yIgotCi1yZXNvdXJjZSAnY2ZyZycgKDApIHsKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGtQb3dlclBDLAotICAgICAgICAgICAgICAgIGtGdWxsTGliLAotICAgICAgICAgICAgICAgIGtOb1ZlcnNpb25OdW0sa05vVmVyc2lvbk51bSwKLSAgICAgICAgICAgICAgICAwLDAsCi0gICAgICAgICAgICAgICAga0lzQXBwLGtPbkRpc2tGbGF0LGtaZXJvT2Zmc2V0LGtXaG9sZUZvcmssCi0gICAgICAgICAgICAgICAgQVBQTkFNRSAvLyBtdXN0IGJlIGRlZmluZWQgb24gUmV6IGNvbW1hbmQgbGluZSB3aXRoIC1kIG9wdGlvbgotICAgICAgICB9Ci19OwotCi1JbiBnZW5lcmFsIHRoaXMgcG9ydCBvZiBHQ0Mgc3VwcG9ydHMgdGhlIHNhbWUgb3B0aW9uIHN5bnRheCBhbmQKLWJlaGF2aW9yIGFzIGl0cyBVbml4IGNvdW50ZXJwYXJ0LiAgSXQgYWxzbyBoYXMgc2ltaWxhciBjb21waWxhdGlvbgotcnVsZXMsIHNvIGl0IHdpbGwgcnVuIHRoZSBhc3NlbWJsZXIgb24gLnMgZmlsZXMgYW5kIHNvIGZvcnRoLgotCi1UaGUgR0NDIG1hbnVhbCBpbmNsdWRlcyBmdWxsIGluZm9ybWF0aW9uIG9uIHRoZSBhdmFpbGFibGUgb3B0aW9ucy4KLU9uZSBvcHRpb24gdGhhdCBtYXkgYmUgZXNwZWNpYWxseSB1c2VmdWwgaXMgIi12Iiwgd2hpY2ggc2hvd3MgeW91IHdoYXQKLXRvb2xzIGFuZCBvcHRpb25zIGFyZSBiZWluZyB1c2VkOyB1bmxpa2UgbW9zdCBNYWMgQyBjb21waWxlcnMsIEdDQwotZGlyZWN0cyBhc3NlbWJseSBhbmQgbGlua2luZyBpbiBhZGRpdGlvbiB0byBjb21waWxhdGlvbi4KLQotTVBXIEdDQyBkb2VzIGZlYXR1cmUgdHdvIGV4dGVuc2lvbnMgdG8gdGhlIG9wdGlvbiBzeW50YXg7ICctZCBtYWNybz1uYW1lJwotd29ya3MganVzdCBhcyAnLURtYWNybz1uYW1lJyBkb2VzIGluIFVuaXgsIGFuZCAnLWkgZGlyZWN0b3J5JyB3b3JrcyB0aGUKLXNhbWUgYXMgJy1JZGlyZWN0b3J5Jy4KLQotTVBXIEdDQyBzdXBwb3J0cyB0aGUgdXN1YWwgUGFzY2FsLXN0eWxlIHN0cmluZ3MgYW5kIGFsaWdubWVudCBwcmFnbWFzLgotCi1UbyBmaW5kIHN0YW5kYXJkIGluY2x1ZGUgZmlsZXMgeW91IGNhbiBzZXQgdGhlIHZhcmlhYmxlIEdDQ0luY2x1ZGVzOgotCi0Jc2V0IEdDQ0luY2x1ZGVzIE15RGlzazpNeUluY2x1ZGVzOgotCWV4cG9ydCBHQ0NJbmNsdWRlcwotCi1HQ0NJbmNsdWRlcyBpcyBzaW1pbGFyIHRvIE1QVydzIENJbmNsdWRlcyBvciBDVydzIE1XQ0luY2x1ZGVzLiAgSW4KLW9yZGVyIHRvIHVzZSBNUFcncyB1c3VhbCBpbmNsdWRlIGZpbGVzLCBqdXN0IHNheToKLQotCXNldCBHQ0NJbmNsdWRlcyAie0NJbmNsdWRlc30iCi0JZXhwb3J0IEdDQ0luY2x1ZGVzCi0KLSogVXNpbmcgR0NDIGFzIGEgQ3Jvc3MtQ29tcGlsZXIKLQotSWYgeW91IGhhdmUgYSBjcm9zcy1jb21waWxlciwgYW5kIHlvdSBoYXZlIGFsbCBvZiB0aGUgY29ycmVjdAotdGFyZ2V0LXNpZGUgY3J0MCBhbmQgbGlicmFyaWVzIGF2YWlsYWJsZSwgdGhlbiB0byBjb21waWxlIGFuZCBsaW5rIGEKLWZpbGUgImZvby5jIiwgeW91IGNhbiBzYXkganVzdAotCi0JZ0MgZm9vLmMKLQotVGhlIG91dHB1dCBmaWxlIHdpbGwgYmUgYW4gTVBXIGJpbmFyeSBmaWxlIG5hbWVkICJhLm91dCI7IHRoZSBmb3JtYXQKLW9mIHRoZSBjb250ZW50cyB3aWxsIGRlcGVuZCBvbiB3aGljaCB0YXJnZXQgaXMgaW4gdXNlLCBzbyBmb3IgaW5zdGFuY2UKLWEgTUlQUy10YXJnZXRpbmcgR0NDIHdpbGwgcHJvZHVjZSBFQ09GRiBvciBFTEYgZXhlY3V0YWJsZXMuCi0KLU5vdGUgdGhhdCB1c2luZyBNUFcgaW5jbHVkZSBmaWxlcyB3aXRoIGEgY3Jvc3MtY29tcGlsZXIgaXMgc29tZXdoYXQKLWRhbmdlcm91cy4KLQotKiBVc2luZyB0aGUgQXNzZW1ibGVyIGFuZCBGcmllbmRzCi0KLVRoZSBhc3NlbWJsZXIgKCJhcyIpIGFuZCBsaW5rZXIgKCJsZCIpIGFyZSBmYWl0aGZ1bCBwb3J0cyBvZiB0aGVpcgotVW5peCBjb3VudGVycGFydHMuICBTaW1pbGFybHksIHRoZSBiaW51dGlscyAiYXIiLCAiY3BsdXNmaWx0IiwgIm5tIiwKLSJvYmpjb3B5IiwgIm9iamR1bXAiLCAicmFubGliIiwgInNpemUiLCAic3RyaW5ncyIsIGFuZCAic3RyaXAiIGFyZSBhbGwKLWxpa2UgdGhleSBhcmUgdW5kZXIgVW5peC4gIChOb3RlIHRoYXQgImNwbHVzZmlsdCIgaXMgdXN1YWxseSBjYWxsZWQKLSJjKytmaWx0IiB1bmRlciBVbml4LikKLQotKiBVc2luZyBHREIKLQotVGhlcmUgYXJlIHR3byBmbGF2b3JzIG9mIEdEQi4gICJnZGIiIGlzIGFuIE1QVyB0b29sIHRoYXQgd29ya3MgdmVyeQotbXVjaCBsaWtlIGl0IGRvZXMgaW4gVW5peDsgcHV0IGEgY29tbWFuZCBpbnRvIHRoZSBNUFcgd29ya3NoZWV0IGFuZAotdHlwZSB0aGUgPGVudGVyPiBrZXkgdG8gc2VuZCBpdCB0byBHREIuICBXaGlsZSAiZ2RiIiBpcyBydW5uaW5nLCB5b3UKLWNhbm5vdCBkbyBhbnl0aGluZyBlbHNlIGluIE1QVywgYWx0aG91Z2ggeW91IGNhbiBzd2l0Y2ggdG8gb3RoZXIKLU1hYyBhcHBsaWNhdGlvbnMgYW5kIHVzZSB0aGVtLgotCi0iU2lvd0dEQiIgaXMgYWxzbyBhIE1hYyBhcHBsaWNhdGlvbiwgYnV0IGl0IGlzIEdEQiB1c2luZyB0aGUgU0lPVwotcGFja2FnZSB0byBwcm92aWRlIGNvbnNvbGUgZW11bGF0aW9uLiAgQ29tbWFuZHMgYXJlIGV4YWN0bHkgYXMgZm9yIHRoZQotTVBXIHRvb2wsIGJ1dCBzaW5jZSB0aGlzIGlzIGl0cyBvd24gYXBwbGljYXRpb24sIHlvdSBjYW4gc3dpdGNoCi1iZXR3ZWVuIGl0IGFuZCBNUFcuCi0KLUJVSUxESU5HIEdOVSBUT09MUwotCi1UaGlzIHBvcnQgb2YgdGhlIEdOVSB0b29scyB1c2VzIGEgY29uZmlndXJlIHNjcmlwdCBzaW1pbGFyIHRvCi10aGF0IHVzZWQgZm9yIEdOVSB0b29scyB1bmRlciBVbml4LCBidXQgcmV3cml0dGVuIGZvciBNUFcuICBBcyB3aXRoCi1Vbml4IGNvbmZpZ3VyYXRpb24sIHRoZXJlIGlzIGFuICJvYmplY3QiIGRpcmVjdG9yeSB0aGF0IG1heSBiZQotZGlmZmVyZW50IGZyb20gdGhlICJzb3VyY2UiIGRpcmVjdG9yeS4gIEluIHRoZSBleGFtcGxlIGNvbW1hbmRzIGJlbG93LAotd2Ugd2lsbCBhc3N1bWUgdGhhdCB3ZSBhcmUgY3VycmVudGx5IGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LCBhbmQgdGhhdAotdGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgIntCb290fUN5Z251czpzcmM6Ii4KLQotKiBSZXF1aXJlbWVudHMgZm9yIEJ1aWxkaW5nCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBzb3VyY2VzLCB5b3Ugd2lsbCBuZWVkIGEgc2V0IG9mIHRvb2xzIHRoYXQgdGhlCi1jb25maWd1cmUgYW5kIGJ1aWxkIHNjcmlwdHMgYXNzdW1lIHRvIGJlIGF2YWlsYWJsZS4gIFRoZXNlIHRvb2xzCi0oYW5kIHRoZWlyIHZlcnNpb25zLCBpZiByZWxldmFudCkgYXJlIGFzIGZvbGxvd3M6Ci0KLQlieWFjYyB0b29sCi0JZmxleCAoMi4zLjcpIHRvb2wgKGFuZCBGbGV4LnNrZWwgZmlsZSkKLQlmb3J3YXJkLWluY2x1ZGUgc2NyaXB0Ci0JTW92ZUlmQ2hhbmdlIHNjcmlwdAotCW1wdy10b3VjaCBzY3JpcHQKLQltcHctdHJ1ZSBzY3JpcHQKLQlOZXdGb2xkZXJSZWN1cnNpdmUgc2NyaXB0Ci0JbnVsbC1jb21tYW5kIHNjcmlwdAotCW9wZW4tYnJhY2Ugc2NyaXB0Ci0Jc2VkICgxLjEzKSB0b29sCi0JdHItN3RvOCBzY3JpcHQKLQl0cnVlIHNjcmlwdAotCi1UaGUgc2NyaXB0cyBhcmUgaW4gdGhlIHNvdXJjZXMsIHVuZGVyIHV0aWxzOm1wdzouIFlvdSBtdXN0IGFycmFuZ2UgdG8KLWdldCB0aGUgb3RoZXIgdG9vbHMgeW91cnNlbGYgKHRoZXkgYXJlIHJlYWRpbHkgYXZhaWxhYmxlIGZyb20gdGhlCi0idXN1YWwiIG5ldCBzaXRlcywgYW5kIGFyZSBhbHNvIG9uIG1hbnkgQ0RST01TKS4gIEluIGFkZGl0aW9uLCB0aGVyZQotd2lsbCB1c3VhbGx5IGJlIGEgc2V0IG9mIHRoZXNlIGF2YWlsYWJsZSBhdCBmdHAuY3lnbnVzLmNvbSwgaW4gcHViL21hYy4KLQotWW91IG1heSBwdXQgdGhlIGJ1aWxkIHRvb2xzIGluIHlvdXIgdXN1YWwgVG9vbHMgb3IgU2NyaXB0cwotZGlyZWN0b3JpZXMsIG9yIGtlZXAgdGhlbSBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yaWVzLiAgV2UgcHJlZmVyIHRvCi1tYWtlIGEgZGlyZWN0b3J5IGNhbGxlZCAiYnVpbGR0b29scyIgYW5kIHdlIHB1dCB0aGlzIGluIG9uZSBvZiBvdXIKLVVzZXJTdGFydHVwIGZpbGVzOgotCi0Jc2V0IENvbW1hbmRzICJ7Qm9vdH1DeWdudXM6YnVpbGR0b29sczose0NvbW1hbmRzfSIKLQotRmxleCB1c2VzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIEZMRVhfU0tFTEVUT04gdG8gbG9jYXRlIGl0cyBza2VsZXRvbgotZmlsZSwgc28geW91IG5lZWQgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhpcywgcHJlZmVyYWJseSBpbiBhIFVzZXJTdGFydHVwOgotCi0JU2V0IEZMRVhfU0tFTEVUT04gIntCb290fSJDeWdudXM6YnVpbGR0b29sczpGbGV4LnNrZWwKLQlFeHBvcnQgRkxFWF9TS0VMRVRPTgotCi0qIENvbmZpZ3VyaW5nCi0KLUJlZm9yZSB5b3UgY2FuIGJ1aWxkIGFueXRoaW5nLCB5b3UgbXVzdCBjb25maWd1cmUuICBZb3UgZG8gdGhpcyBieQotY3JlYXRpbmcgYW4gZGlyZWN0b3J5IHdoZXJlIG9iamVjdCBmaWxlcyB3aWxsIGJlIHN0b3JlZCwgc2V0ZGlyZWN0b3J5Ci10byB0aGF0IGRpcmVjdG9yeSBhbmQgZG8gYSBjb25maWd1cmUgY29tbWFuZDoKLQotCXtCb290fUN5Z251czpzcmM6bXB3LWNvbmZpZ3VyZSAtLXRhcmdldCA8bmFtZT4gLS1jYyA8Y29tcGlsZXI+IC0tc3JjZGlyIHtCb290fUN5Z251czpzcmM6IC0tcHJlZml4IDx3aGF0ZXZlcj4KLQotSWYgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgbm90IGluIHlvdXIge0NvbW1hbmRzfSBsaXN0LCB0aGVuIHlvdSBtdXN0Ci1zdXBwbHkgYSBmdWxsIHBhdGhuYW1lIHRvIG1wdy1jb25maWd1cmUsIHNpbmNlIG1wdy1jb25maWd1cmUgaW52b2tlcwotaXRzZWxmIGFmdGVyIHN3aXRjaGluZyBpbnRvIGVhY2ggc3ViZGlyZWN0b3J5LiAgVXNpbmcgYSByZWxhdGl2ZQotcGF0aG5hbWUsIGV2ZW4gc29tZXRoaW5nIGxpa2UgJzptcHctY29uZmlndXJlJywgd2lsbCB0aGVyZWZvcmUgbm90IHdvcmsuCi0KLTxuYW1lPiBtdXN0IGJlIGEga25vd24gdGFyZ2V0LiAgVmFsaWQgb25lcyBpbmNsdWRlICJtNjhrLWFwcGxlLW1hY29zIiwKLSJwb3dlcnBjLWFwcGxlLW1hY29zIiwgImkzODYtdW5rbm93bi1nbzMyIiwgIm1pcHMtaWR0LWVjb2ZmIiwgYW5kCi0ic2gtaGl0YWNoaS1obXMiLiAgTm90IGFsbCB0YXJnZXQgdHlwZXMgYXJlIGFjY2VwdGVkIGZvciBhbGwgb2YgdGhlCi10b29scyB5ZXQuCi0KLTxjb21waWxlcj4gbXVzdCBiZSB0aGUgbmFtZSBvZiB0aGUgY29tcGlsZXIgdG8gdXNlLiAgSXQgZGVmYXVsdHMgdG8gIm1wd2MiLgotCi0JKG02OGspCi0JbXB3YwlNUFcgQwotCXNjNjhrCVN5bWFudGVjIEMKLQltd2M2OGsJTWV0cm93ZXJrcyBDIChDb2Rld2FycmlvcikKLQlnY2M2OGsJR0NDCi0KLQkocG93ZXJwYykKLQlwcGNjCVBQQ0MKLQltcmMJTWFjaW50b3NoIG9uIFJpc0MgKE1pc3RlciBDLCBha2EoPykgRnJhbmtlbnN0ZWluKQotCXNjcHBjCVN5bWFudGVjIEMKLQltd2NwcGMJTWV0cm93ZXJrcyBDIChDb2Rld2FycmlvcikKLQlnY2NwcGMJR0NDCi0KLU5vdCBhbGwgY29tcGlsZXJzIHdpbGwgY29tcGlsZSBhbGwgdG9vbHMgZXF1YWxseSB3ZWxsISAgRm9yIG02OGsgTWFjcywKLU1QVyBDIGhhcyB0aGUgYmVzdCByZWNvcmQgc28gZmFyIChpdCBoYXMgcHJvYmxlbXMsIGJ1dCB0aGV5IGNhbiBiZQotd29ya2VkIGFyb3VuZCksIHdoaWxlIGZvciBQb3dlck1hY3MsIENvZGVXYXJyaW9yIGlzIHRoZSBvbmx5IGNvbXBpbGVyCi10aGF0IGhhcyBzdWNjZXNzZnVsbHkgY29tcGlsZWQgZXZlcnl0aGluZyBpbnRvIHJ1bm5pbmcgY29kZS4KLQotPHByZWZpeD4gaXMgdGhlIHBhdGggdGhhdCAiZ2NjIiB3aWxsIHByZXBlbmQgd2hlbiBsb29raW5nIGZvciB0b29scwotdG8gZXhlY3V0ZS4gIEdDQ19FWEVDX1BSRUZJWCBvdmVycmlkZXMgdGhpcyB2YWx1ZSwgc28geW91IG5lZWQgbm90Ci1pbmNsdWRlIGl0IGlmIHlvdSBwbGFuIHRvIHVzZSBHQ0NfRVhFQ19QUkVGSVguCi0KLUFzIGFuIGV4YW1wbGUsIGhlcmUgaXMgdGhlIGNvbmZpZ3VyZSBsaW5lIHRoYXQgeW91IGNvdWxkIHVzZSB0byBidWlsZAotbmF0aXZlIFBvd2VyTWFjIEdDQzoKLQotIntCb290fSJDeWdudXM6c3JjOm1wdy1jb25maWd1cmUgLS1jYyBtd2NwcGMgLS10YXJnZXQgcG93ZXJwYy1hcHBsZS1tYWNvcyAtLXNyY2RpciAie0Jvb3R9IkN5Z251czpzcmM6IC0tcHJlZml4ICJ7Qm9vdH0iR05VVG9vbHM6Ci0KLSogQnVpbGRpbmcKLQotSWYgeW91IHVzZSBDb2RlV2FycmlvciwgeW91ICptdXN0KiBmaXJzdCBzZXQgTVdDSW5jbHVkZXMgdG8KLXtDSW5jbHVkZXN9LiAgVGhpcyBpcyBiZWNhdXNlIHlvdSB3aWxsIGJlIGJ1aWxkaW5nIE1QVyB0b29scywgYW5kCi10aGVpciBzdGFuZGFyZCBJL08gd29ya3MgYnkgbWFraW5nIHJlZmVyZW5jZXMgdG8gZGF0YSB0aGF0IGlzIHBhcnQgb2YKLXRoZSBNUFcgU2hlbGwsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGNvZGUgbXVzdCBiZSBjb21waWxlZCBhbmQgbGlua2VkCi13aXRoIG1hY3JvcyB0aGF0IHJlZmVyIHRvIHRoYXQgZGF0YSwgYW5kIHRob3NlIG1hY3JvcyBhcmUgaW4KLXtDSW5jbHVkZXN9LCBub3QgdGhlIGRlZmF1bHQge01XQ0luY2x1ZGVzfS4gIFdpdGhvdXQgdGhpcyBjaGFuZ2UsIHlvdQotd2lsbCBlbmNvdW50ZXIgcHJvYmxlbXMgY29tcGlsaW5nIGxpYmliZXJ0eS9tcHcuYywgYnV0IHR3ZWFraW5nIHRoYXQKLWZpbGUgb25seSBtYXNrcyB0aGUgcmVhbCBwcm9ibGVtLCBhbmQgZG9lcyBub3QgZml4IGl0LgotCi1UaGUgY29tbWFuZAotCi0JbXB3LWJ1aWxkCi0KLXdpbGwgYnVpbGQgZXZlcnl0aGluZy4gQnVpbGRpbmcgd2lsbCB0YWtlIG92ZXIgYW4gaG91ciBvbiBhIFF1YWRyYSA4MDAKLW9yIFBvd2VyTWFjIDgxMDAvMTEwLCBsb25nZXIgaWYgdGhlIHNvdXJjZXMgYXJlIG9uIGEgc2hhcmVkIHZvbHVtZS4KLQotWW91IG1heSBzZWUgc29tZSB3YXJuaW5nczsgdGhlc2UgYXJlIG1vc3RseSBsaWtlbHkgYmVuaWduLCB0eXBpY2FsbHkKLWRpc2FncmVlbWVudHMgYWJvdXQgZGVjbGFyYXRpb25zIG9mIGxpYnJhcnkgYW5kIHN5c3RlbSBmdW5jdGlvbnMuCi0KLSogSW5zdGFsbGluZwotCi1UbyBpbnN0YWxsIHRoZSBqdXN0LWJ1aWx0IHRvb2xzLCB1c2UgdGhlIGNvbW1hbmQKLQotCW1wdy1idWlsZCBpbnN0YWxsCi0KLVRoaXMgcGFydCBvZiB0aGUgaW5zdGFsbGF0aW9uIHByb2NlZHVyZSBqdXN0IGNvcGllcyBmaWxlcyB0byB0aGUKLWxvY2F0aW9uIHNwZWNpZmllZCBhdCBjb25maWd1cmUgdGltZSBieSA8cHJlZml4PiwgYW5kLCBpbiBzb21lIGNhc2VzLAotcmVuYW1lcyB0aGVtIGZyb20gdGVtcG9yYXJ5IGludGVybmFsIG5hbWVzIHRvIHRoZWlyIHVzdWFsIG5hbWVzLiBUaGlzCi1pbnN0YWxsIHByb2Nlc3MgaXMgKm5vdCogdGhlIHNhbWUgYXMgd2hhdCB0aGUgSW5zdGFsbCBzY3JpcHQgZG9lczsKLUluc3RhbGwgY2FuIGNvcHkgdG9vbHMgZnJvbSB0aGUgaW5zdGFsbGF0aW9uIGxvY2F0aW9uIGNob3NlbiBhdAotY29uZmlndXJhdGlvbiB0aW1lIHRvIGEgdXNlci1jaG9zZW4gcGxhY2UsIGFuZCBzZXRzIHVwIGEgVXNlclN0YXJ0dXAKLWZpbGUuICBOb3RlIHRoYXQgd2hpbGUgdGhlIEluc3RhbGwgc2NyaXB0IGlzIG9wdGlvbmFsLCB0aGUgaW5zdGFsbAotYnVpbGQgYWN0aW9uIHBlcmZvcm1zIHNvbWUgdGFza3Mgd291bGQgYmUgdmVyeSBoYXJkIHRvIHJlcGxpY2F0ZQotbWFudWFsbHksIHNvIHlvdSBzaG91bGQgYWx3YXlzIGRvIGl0IGJlZm9yZSB1c2luZyB0aGUgdG9vbHMuCi0KLSogS25vd24gUHJvYmxlbXMgV2l0aCBVc2luZyBWYXJpb3VzIENvbXBpbGVycyB0byBCdWlsZAotCi1Nb3N0IHZlcnNpb25zIG9mIE1QVyBDIGhhdmUgcHJvYmxlbXMgd2l0aCBjb21waWxpbmcgR05VIHNvZnR3YXJlLgotCi1NUFcgQyAzLjIueCBoYXMgcHJlcHJvY2Vzc2luZyBidWdzIHRoYXQgcmVuZGVyIGl0IGluY2FwYWJsZSBvZgotY29tcGlsaW5nIHRoZSBCRkQgbGlicmFyeSwgc28gaXQgY2FuJ3QgYmUgdXNlZCBhdCBhbGwgZm9yIGJ1aWxkaW5nIEJGRC4KLQotTVBXIEMgMy4zLCAzLjMuMSwgYW5kIDMuMy4yIHdpbGwgc3BvbnRhbmVvdXNseSBjbGFpbSB0byBoYXZlIGZvdW5kCi1lcnJvcnMgaW4gdGhlIHNvdXJjZSBjb2RlLCBidXQgaW4gZmFjdCB0aGUgY29kZSBpcyBwZXJmZWN0bHkgZmluZS4gIElmCi10aGlzIGhhcHBlbnMsIGp1c3Qgc2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSBiYWNrIHRvIHRoZSB0b3AtbGV2ZWwKLW9iamRpciAod2hlcmUgdGhlIGNvbmZpZ3VyZSBjb21tYW5kIGFib3ZlIHdhcyBwZXJmb3JtZWQpLCBhbmQgdHlwZQotIm1wdy1idWlsZCBhbGwiIGFnYWluLiAgSWYgaXQgZ29lcyBvbiB0aHJvdWdoIHRoZSBzdXBwb3NlZCBlcnJvciwgdGhlbgoteW91IGdvdCBvbmUgb2YgdGhlIHNwdXJpb3VzIGVycm9ycy4gIEEgZnVsbCBidWlsZCBtYXkgcmVxdWlyZSBhIG51bWJlcgotb2YgdGhlc2UgcmVzdGFydHMuCi0KLU1QVyBDIDMuMy4zIHNlZW1zIHRvIHdvcmsgT0ssIGF0IGxlYXN0IHdpdGggdGhlIGFpZCBvZiBhIG51bWJlciBvZgotd29ya2Fyb3VuZHMgdGhhdCBhcmUgaW4gdGhlIHNvdXJjZXMgKGxvb2sgZm9yICNpZmRlZiBNUFdfQykuCi0KLVZlcnNpb25zIG9mIE1QVyBNYWtlIGVhcmxpZXIgdGhhbiA0LjBkMiBoYXZlIGV4aGliaXRlZCBiaXphcnJlIGJlaGF2aW9yLAotZmFpbHVyZSB0byBzdWJzdGl0dXRlIHZhcmlhYmxlcyBhbmQgdGhlIGxpa2UuCi0KLU1ldHJvd2Vya3MgQ1c2IFBQQyBsaW5rZXIgKE1XTGlua1BQQykgc2VlbXMgdG8gZG8gYmFkIHRoaW5ncyB3aXRoIG1lbW9yeQotaWYgdGhlICJNb2Rlcm4gTWVtb3J5IE1hbmFnZXIiIGlzIHR1cm5lZCBvbiAoaW4gdGhlIE1lbW9yeSBjb250cm9sIHBhbmVsKSwKLWJ1dCB3b3JrcyBPSyBpZiBpdCBpcyB0dXJuZWQgb2ZmLgotCi1NZXRyb3dlcmtzIENXNiBsb3NlcyBiaWd0aW1lIGNvbXBpbGluZyBvcGNvZGVzOnBwYy1vcGMuYywgd2hpY2ggaGFzCi1zb21lIGRlZXBseSBuZXN0ZWQgbWFjcm9zLiAgKENXNyBpcyBPSy4pICBUaGVyZSBpcyBhIHdheSB0byBwYXRjaCB0aGUKLWZpbGUsIGJ5IHN1YnN0aXR1dGluZyBjb25zdGFudCB2YWx1ZXMuICBJZiB5b3UgbmVlZCB0byBkbyB0aGlzLAotY29udGFjdCBzaGVic0BjeWdudXMuY29tIGZvciBkZXRhaWxzLgotCi08R2VzdGFsdC5oPiBpcyBtaXNzaW5nIGZyb20ge0NJbmNsdWRlc30gaW4gdGhlIE1QVyB2ZXJzaW9uIHRoYXQgY29tZXMKLXdpdGggQ1c3LiAgWW91IGNhbiBqdXN0IGNvcHkgdGhlIG9uZSBpbiBDVzcncyB7TVdDSW5jbHVkZXN9LgotCi1DVzggYW5kIGxhdGVyIGhhdmUgY2hhbmdlcyB0byBoZWFkZXJzIGFuZCBzdWNoIHRoYXQgd2lsbCByZXF1aXJlIGNoYW5nZXMKLXRvIHRoZSBzb3VyY2UgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byB1c2UgdGhlbSB0byByZWJ1aWxkLgotCi1LTk9XTiBCVUdTCi0KLVRoZSBkZWNsYXJhdGlvbnMgZm9yIG1lbWNweSBhbmQgbWVtY21wIGluIHNvbWUgdmVyc2lvbnMgb2YgaGVhZGVyIGZpbGVzCi1tYXkgY29uZmxpY3Qgd2l0aCBHQ0MncyBidWlsdGluIGRlZmluaXRpb24uICBFaXRoZXIgdXNlIC1mbm8tYnVpbHRpbgotb3IgaWdub3JlIHRoZSB3YXJuaW5ncy4KLQotVGhpcyBpcyBub3QgYSBidWcsIGJ1dCAtIHdhdGNoIG91dCBmb3IgY3IvbmwgdHJhbnNsYXRpb24hICBGb3IgaW5zdGFuY2UsCi1pZiBjb25maWcvbXB3LW1oLW1wdyBpcyBub3QgcHJvcGVybHkgdHJhbnNsYXRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuCi1jb3BpZWQgb3IgdXBkYXRlZCBzZXBhcmF0ZWx5LCB0aGVuIGV2ZXJ5dGhpbmcgd2lsbCBhbG1vc3QgYnVpbGQsIGJ1dAoteW91IHdpbGwgZ2V0IHB1enpsaW5nIGVycm9yIG1lc3NhZ2VzIGZyb20gbWFrZSBvciB0aGUgY29tcGlsZXIuCi0KLScvJyBvciAnICcgZW1iZWRkZWQgaW4gYW55IGRldmljZSwgZGlyZWN0b3J5LCBvciBmaWxlIG5hbWUgbWF5IG9yIG1heQotbm90IHdvcmsuCi0KLW9iamNvcHkgLU8gc3JlYyBmb28ubyBtYWtlcyByYW5kb20gb3V0cHV0IGZpbGVuYW1lcy4KLQotTWFjLXgtbWlwcyByZXF1aXJlcyAtbWdhcyBidXQgVW5peCBob3N0cyBkb24ndC4KLQotR0RCIHdpbGwgZnJlcXVlbnRseSByZXF1aXJlIGEgJy8nIG9uIHRoZSBmcm9udCBvZiBhIGRldmljZSBuYW1lIGluIG9yZGVyCi10byByZWNvZ25pemUgaXQgYXMgYW4gYWJzb2x1dGUgcmF0aGVyIHRoYW4gYSByZWxhdGl2ZSBwYXRobmFtZS4KLQotR0RCIGRvZXNuJ3Qgc2VlbSB0byB1c2UgdGhlIHByaW50ZXIgcG9ydCBjb3JyZWN0bHksIGFsdGhvdWdoIGl0IHRyaWVzLgotCi1UaGUgY3Vyc29yIGRvZXNuJ3QgYWx3YXlzIHNwaW4gYXMgbXVjaCBhcyBpdCBzaG91bGQuICBUbyBnZXQgZWxhYm9yYXRlCi1zdGF0aXN0aWNzIGFuZCB3YXJuaW5ncyBhYm91dCBzcGluIHJhdGVzLCBhZGQgdGhpcyB0byBVc2VyU3RhcnR1cDoKLQotCXNldCBNRUFTVVJFX1NQSU4gYWxsCi0JZXhwb3J0IE1FQVNVUkVfU1BJTgpkaWZmIC0tZ2l0IGEvbXB3LWJ1aWxkLmluIGIvbXB3LWJ1aWxkLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmQ5NTMwLi4wMDAwMDAwCi0tLSBhL21wdy1idWlsZC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0jIFRvcC1sZXZlbCBzY3JpcHQgZnJhZ21lbnQgdG8gYnVpbGQgZXZlcnl0aGluZyBmb3IgTVBXLgotCi1TZXQgc2F2ZWRpciAiYERpcmVjdG9yeWAiCi0KLSNTZXQgRWNobyAxCi0KLVNldCBUaGlzU2NyaXB0ICJ7MH0iCi0KLVNldCBvYmpkaXIgIjoiCi0KLVNldCB2ZXJpZnkgMAotCi1TZXQgQnVpbGRUYXJnZXQgIm5vbmUiCi0KLSMgUGFyc2UgYXJndW1lbnRzLgotCi1Mb29wCi0JQnJlYWsgSWYgeyN9ID09IDAKLQkJSWYgIntCdWlsZFRhcmdldH0iID1+IC9ub25lLwotCQkJU2V0IEJ1aWxkVGFyZ2V0ICJ7MX0iCi0JCUVsc2UKLQkJCUVjaG8gT25seSBvbmUgYnVpbGQgdGFyZ2V0IGFsbG93ZWQsIGlnbm9yaW5nICJ7MX0iCi0JCUVuZCBJZgotCVNoaWZ0IDEKLUVuZCBMb29wCi0KLUlmICJ7QnVpbGRUYXJnZXR9IiA9fiAvbm9uZS8KLQlTZXQgQnVpbGRUYXJnZXQgImFsbCIKLUVuZCBJZgotCi1JZiB7dmVyaWZ5fSA9PSAxCi0JRWNobyAiIyIgRG9pbmcgIntUaGlzU2NyaXB0fSIgIntCdWlsZFRhcmdldH0iIGluICJgRGlyZWN0b3J5YCIgLi4uIAotRW5kIElmCi0KLVNldCByYW5tYWtlIDAKLQotSWYgImBFeGlzdHMgTWFrZWZpbGVgIiAhPSAiIgotCUVjaG8gIlNldCBFY2hvIDEiID57QnVpbGRUYXJnZXR9Lm1ha2VvdXQKLQlNYWtlIC1mIE1ha2VmaWxlIHtCdWlsZFRhcmdldH0gPj57QnVpbGRUYXJnZXR9Lm1ha2VvdXQKLQl7QnVpbGRUYXJnZXR9Lm1ha2VvdXQKLQlEZWxldGUge0J1aWxkVGFyZ2V0fS5tYWtlb3V0Ci0JU2V0IHJhbm1ha2UgMQotRW5kIElmCi0KLUlmICJgRXhpc3RzIE1ha2VmaWxlLlBQQ2AiICE9ICIiCi0JRWNobyAiU2V0IEVjaG8gMSIgPntCdWlsZFRhcmdldH0ubWFrZW91dC5wcGMKLQlNYWtlIC1mIE1ha2VmaWxlLlBQQyB7QnVpbGRUYXJnZXR9ID4+e0J1aWxkVGFyZ2V0fS5tYWtlb3V0LnBwYwotCXtCdWlsZFRhcmdldH0ubWFrZW91dC5wcGMKLQlEZWxldGUge0J1aWxkVGFyZ2V0fS5tYWtlb3V0LnBwYwotCVNldCByYW5tYWtlIDEKLUVuZCBJZgotCi1JZiB7cmFubWFrZX0gPT0gMQotCUV4aXQKLUVuZCBJZgotCi0jIERpc3BhdGNoIG9uIHZhcmlvdXMgcHNldWRvLXRhcmdldHMuCi0KLUlmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLwotCUVjaG8gU3RhcnRlZCBgRGF0ZWAKLQkie1RoaXNTY3JpcHR9IiBhbGwtZ2NjCi0JIntUaGlzU2NyaXB0fSIgYWxsLWdkYgotCUVjaG8gRmluaXNoZWQgYERhdGVgCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWxpYmliZXJ0eS8KLQkie1RoaXNTY3JpcHR9IiBkby1saWJpYmVydHkKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtYmZkLwotCSJ7VGhpc1NjcmlwdH0iIGRvLWJmZAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1vcGNvZGVzLwotCSJ7VGhpc1NjcmlwdH0iIGRvLW9wY29kZXMKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtYnlhY2MvCi0JIntUaGlzU2NyaXB0fSIgZG8tYnlhY2MKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtZmxleC8KLQkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5Ci0JIntUaGlzU2NyaXB0fSIgZG8tZmxleAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1iaW51dGlscy8KLQkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5Ci0JIntUaGlzU2NyaXB0fSIgYWxsLWJmZAotCSJ7VGhpc1NjcmlwdH0iIGFsbC1vcGNvZGVzCi0JIntUaGlzU2NyaXB0fSIgZG8tYmludXRpbHMKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtZ2FzLwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKLQkie1RoaXNTY3JpcHR9IiBhbGwtYmZkCi0JIntUaGlzU2NyaXB0fSIgYWxsLW9wY29kZXMKLQkie1RoaXNTY3JpcHR9IiBkby1nYXMKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtZ2NjLwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKLQkie1RoaXNTY3JpcHR9IiBhbGwtZ2FzCi0JIntUaGlzU2NyaXB0fSIgYWxsLWJpbnV0aWxzCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxkCi0JIntUaGlzU2NyaXB0fSIgZG8tZ2NjCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWdkYi8KLQkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5Ci0JIntUaGlzU2NyaXB0fSIgYWxsLWJmZAotCSJ7VGhpc1NjcmlwdH0iIGFsbC1vcGNvZGVzCi0JIntUaGlzU2NyaXB0fSIgZG8tZ2RiCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWdyZXovCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQotCSJ7VGhpc1NjcmlwdH0iIGFsbC1iZmQKLQkie1RoaXNTY3JpcHR9IiBkby1ncmV6Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWxkLwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKLQkie1RoaXNTY3JpcHR9IiBhbGwtYmZkCi0JIntUaGlzU2NyaXB0fSIgYWxsLW9wY29kZXMKLQkie1RoaXNTY3JpcHR9IiBkby1sZAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWJ5YWNjLwotCVNldERpcmVjdG9yeSA6YnlhY2M6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tZmxleC8KLQlTZXREaXJlY3RvcnkgOmZsZXg6Ci0JOjptcHctYnVpbGQgX2Jvb3RzdHJhcAotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWJmZC8KLQlTZXREaXJlY3RvcnkgOmJmZDoKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1saWJpYmVydHkvCi0JU2V0RGlyZWN0b3J5IDpsaWJpYmVydHk6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tb3Bjb2Rlcy8KLQlTZXREaXJlY3RvcnkgOm9wY29kZXM6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tYmludXRpbHMvCi0JU2V0RGlyZWN0b3J5IDpiaW51dGlsczoKLQk6Om1wdy1idWlsZCBzdGFtcHMKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1nYXMvCi0JU2V0RGlyZWN0b3J5IDpnYXM6Ci0JOjptcHctYnVpbGQgc3RhbXBzCi0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tZ2NjLwotCVNldERpcmVjdG9yeSA6Z2NjOgotCTptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tZ2RiLwotCVNldERpcmVjdG9yeSA6Z2RiOgotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWdyZXovCi0JU2V0RGlyZWN0b3J5IDpncmV6OgotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWxkLwotCVNldERpcmVjdG9yeSA6bGQ6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tbmV3bGliLwotCVNldERpcmVjdG9yeSA6bmV3bGliOgotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwvCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LXRvcAotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtYmludXRpbHMKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLWdhcwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtZ2NjCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1sZAotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtZ2RiCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1iaW51dGlscy8KLQlTZXREaXJlY3RvcnkgOmJpbnV0aWxzOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLWdhcy8KLQlTZXREaXJlY3RvcnkgOmdhczoKLQk6Om1wdy1idWlsZCBpbnN0YWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1nY2MvCi0JU2V0RGlyZWN0b3J5IDpnY2M6Ci0JOm1wdy1idWlsZCBpbnN0YWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1nZGIvCi0JU2V0RGlyZWN0b3J5IDpnZGI6Ci0JOjptcHctYnVpbGQgaW5zdGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtZ3Jlei8KLQlTZXREaXJlY3RvcnkgOmdyZXo6Ci0JOjptcHctYnVpbGQgaW5zdGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtbGQvCi0JU2V0RGlyZWN0b3J5IDpsZDoKLQk6Om1wdy1idWlsZCBpbnN0YWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS10b3AKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktYmludXRpbHMKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktZ2FzCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LWdjYwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS1nZGIKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktbGQKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHktYmludXRpbHMvCi0JU2V0RGlyZWN0b3J5IDpiaW51dGlsczoKLQk6Om1wdy1idWlsZCBpbnN0YWxsLW9ubHkKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHktZ2FzLwotCVNldERpcmVjdG9yeSA6Z2FzOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwtb25seQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS1nY2MvCi0JU2V0RGlyZWN0b3J5IDpnY2M6Ci0JOm1wdy1idWlsZCBpbnN0YWxsLW9ubHkKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHktZ2RiLwotCVNldERpcmVjdG9yeSA6Z2RiOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwtb25seQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS1ncmV6LwotCVNldERpcmVjdG9yeSA6Z3JlejoKLQk6Om1wdy1idWlsZCBpbnN0YWxsLW9ubHkKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHktbGQvCi0JU2V0RGlyZWN0b3J5IDpsZDoKLQk6Om1wdy1idWlsZCBpbnN0YWxsLW9ubHkKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHktdG9wLwotCU5ld0ZvbGRlclJlY3Vyc2l2ZSAie3ByZWZpeH0iCi0JSWYgIntwcmVmaXh9IiAhPSAiYERpcmVjdG9yeWAiCi0JCUR1cGxpY2F0ZSAteSAnUmVhZCBNZSBmb3IgTVBXJyAie3ByZWZpeH0iJ1JlYWQgTWUgZm9yIE1QVycKLQkJRHVwbGljYXRlIC15IEluc3RhbGwgIntwcmVmaXh9Ikluc3RhbGwKLQlFbmQgSWYKLUVsc2UKLQlFY2hvIHtCdWlsZFRhcmdldH0gbm90IHVuZGVyc3Rvb2QsIGlnbm9yaW5nCi1FbmQgSWYKLQotU2V0RGlyZWN0b3J5ICJ7c2F2ZWRpcn0iCmRpZmYgLS1naXQgYS9tcHctY29uZmlnLmluIGIvbXB3LWNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyODczNy4uMDAwMDAwMAotLS0gYS9tcHctY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgQ3lnbnVzIHNvdXJjZSB0cmVlLgotCi0jIENoZWNrIHRoYXQgd2UgY2FuIGZpbmQgYWxsIHRoZSBzcGVjaWFsIHRvb2xzIHRoYXQgd2Ugd2lsbCBuZWVkLgotIyBUaGUgdGVzdCBmb3Igc2VkIGlzIHNlbWktcG9pbnRsZXNzLCBiZWNhdXNlIGl0J3MgYWxyZWFkeSBiZWVuIGludm9rZWQKLSMgYnkgdGhlIGNhbGN1bGF0aW9uIG9mIHRhcmdldF9jcHUgaW4gdGhlIG1haW4gY29uZmlndXJlIHNjcmlwdCwgYnV0Ci0jIHRoZSB0ZXN0IHdpbGwgYWxzbyBzaG93IHdoaWNoIG9uZSBpcyBiZWluZyB1c2VkLgotCi1TZXQgRXhpdCAwCi1FY2hvIGJ5YWNjIGlzIGBXaGljaCBieWFjY2AKLUVjaG8gZmxleCBpcyBgV2hpY2ggZmxleGAKLUVjaG8gZm9yd2FyZC1pbmNsdWRlIGlzIGBXaGljaCBmb3J3YXJkLWluY2x1ZGVgCi1FY2hvIE1vdmVJZkNoYW5nZSBpcyBgV2hpY2ggTW92ZUlmQ2hhbmdlYAotRWNobyBtcHctdG91Y2ggaXMgYFdoaWNoIG1wdy10b3VjaGAKLUVjaG8gbXB3LXRydWUgaXMgYFdoaWNoIG1wdy10cnVlYAotRWNobyBOZXdGb2xkZXJSZWN1cnNpdmUgaXMgYFdoaWNoIE5ld0ZvbGRlclJlY3Vyc2l2ZWAKLUVjaG8gbnVsbC1jb21tYW5kIGlzIGBXaGljaCBudWxsLWNvbW1hbmRgCi1FY2hvIG9wZW4tYnJhY2UgaXMgYFdoaWNoIG9wZW4tYnJhY2VgCi1FY2hvIHNlZCBpcyBgV2hpY2ggc2VkYAotRWNobyAndHItN3RvOCcgaXMgYFdoaWNoIHRyLTd0bzhgCi1FY2hvIHRydWUgaXMgYFdoaWNoIHRydWVgCi1TZXQgRXhpdCAxCi0KLVNldCBob3N0X2xpYnMgIm1tYWxsb2MgbGliaWJlcnR5IG9wY29kZXMgYmZkIHJlYWRsaW5lIGdhc2ggdGNsIHRrIHRjbFgiCi0KLVNldCBob3N0X3Rvb2xzICJ0ZXhpbmZvIGJ5YWNjIGZsZXggYmlzb24gYmludXRpbHMgbGQgZ2FzIGdjYyBnZGIgbWFrZSBwYXRjaCBcT3B0aW9uLWQKLQkgICAgcHJtcyBzZW5kLXByIGdwcm9mIGdkYnRlc3QgdGdhcyBldGMgZXhwZWN0IGRlamFnbnUgc2ltIGJhc2ggXE9wdGlvbi1kCi0JICAgIG00IGF1dG9jb25mIGlzcGVsbCBncmVwIGRpZmYgcmNzIGN2cyBmaWxldXRpbHMgc2hlbGx1dGlscyB0aW1lIFxPcHRpb24tZAotCSAgICB0ZXh0dXRpbHMgd2RpZmYgZmluZCBlbWFjcyBlbWFjczE5IHV1ZGVjb2RlIGhlbGxvIHRhciBnemlwIGluZGVudCBcT3B0aW9uLWQKLQkgICAgcmVjb2RlIHJlbGVhc2Ugc2VkIHV0aWxzIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgZ2F3ayIKLQotU2V0IHRhcmdldF9saWJzICJuZXdsaWIiCi0KLVNldCB0YXJnZXRfdG9vbHMgImV4YW1wbGVzIgotCi0jIENvbmZpZ3VyZSB0aGUgcmVzb3VyY2UgY29tcGlsZXIgaWYgdGFyZ2V0aW5nIE1hY3MuCi1JZiB7dGFyZ2V0X29zfSA9fiAvbWFjb3MvIHx8IHt0YXJnZXRfb3N9ID1+IC9tcHcvCi0JU2V0IGhvc3RfdG9vbHMgIntob3N0X3Rvb2xzfSBncmV6IgotRW5kIElmCi0JCi1TZXQgY29uZmlnZGlycyAie2hvc3RfbGlic30ge2hvc3RfdG9vbHN9IHt0YXJnZXRfbGlic30ge3RhcmdldF90b29sc30iCi1FeHBvcnQgY29uZmlnZGlycwotCi0jIE1ha2UgdXAgYSBzcGVjaWFsIGluY2x1ZGUgZGlyZWN0b3J5IHRoYXQgdG9vbHMgd2lsbCBzaGFyZS4KLQotSWYgImBFeGlzdHMgIntvYmpkaXJ9ImV4dHJhLWluY2x1ZGVgIiA9PSAiIgotCU5ld0ZvbGRlciAie29iamRpcn0iZXh0cmEtaW5jbHVkZQotRW5kIElmCi0KLVNldCBlZGlyICJ7b2JqZGlyfWV4dHJhLWluY2x1ZGU6IgotCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czpmaWxlLmggIntlZGlyfSInc3lzL2ZpbGUuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOmlvY3RsLmggIntlZGlyfSInc3lzL2lvY3RsLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czpwYXJhbS5oICJ7ZWRpcn0iJ3N5cy9wYXJhbS5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6cmVzb3VyY2UuaCAie2VkaXJ9IidzeXMvcmVzb3VyY2UuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOnN0YXQuaCAie2VkaXJ9IidzeXMvc3RhdC5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6dGltZS5oICJ7ZWRpcn0iJ3N5cy90aW1lLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czp0eXBlcy5oICJ7ZWRpcn0iJ3N5cy90eXBlcy5oJwotCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6YW91dDY0LmggIntlZGlyfSInYW91dC9hb3V0NjQuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDphci5oICJ7ZWRpcn0iJ2FvdXQvYXIuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDpyYW5saWIuaCAie2VkaXJ9Iidhb3V0L3JhbmxpYi5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OnJlbG9jLmggIntlZGlyfSInYW91dC9yZWxvYy5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OnN0YWIuZGVmICJ7ZWRpcn0iJ2FvdXQvc3RhYi5kZWYnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6c3RhYl9nbnUuaCAie2VkaXJ9Iidhb3V0L3N0YWJfZ251LmgnCi0KLUlmICJgRXhpc3RzICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OiJ7dGFyZ2V0X2NwdX0iLmhgIiAhPSAiIgotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDoie3RhcmdldF9jcHV9Ii5oICJ7ZWRpcn0iJ2FvdXQvJyJ7dGFyZ2V0X2NwdX0iJy5oJwotRW5kIElmCi0KLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjplY29mZi5oICJ7ZWRpcn0iJ2NvZmYvZWNvZmYuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjppbnRlcm5hbC5oICJ7ZWRpcn0iJ2NvZmYvaW50ZXJuYWwuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjpzeW0uaCAie2VkaXJ9Iidjb2ZmL3N5bS5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOnN5bWNvbnN0LmggIntlZGlyfSInY29mZi9zeW1jb25zdC5oJwotCi1JZiAiYEV4aXN0cyAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjoie3RhcmdldF9jcHV9Ii5oYCIgIT0gIiIKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmNvZmY6Int0YXJnZXRfY3B1fSIuaCAie2VkaXJ9Iidjb2ZmLycie3RhcmdldF9jcHV9IicuaCcKLUVuZCBJZgotSWYgInt0YXJnZXRfY3B1fSIgPX4gL3Bvd2VycGMvCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOnJzNjAwMC5oICJ7ZWRpcn0iJ2NvZmYvcnM2MDAwLmgnCi1FbmQgSWYKLQotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6Y29tbW9uLmggIntlZGlyfSInZWxmL2NvbW1vbi5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6ZHdhcmYuaCAie2VkaXJ9IidlbGYvZHdhcmYuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOmR3YXJmMi5oICJ7ZWRpcn0iJ2VsZi9kd2FyZjIuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOmV4dGVybmFsLmggIntlZGlyfSInZWxmL2V4dGVybmFsLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjppbnRlcm5hbC5oICJ7ZWRpcn0iJ2VsZi9pbnRlcm5hbC5oJwotCi0jIEJlbGlldmUgaXQgb3Igbm90LCBHREIgbmVlZHMgdGhpcyBmb3IgYWxsIHRhcmdldHMuCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjptaXBzLmggIntlZGlyfSInZWxmL21pcHMuaCcKLQotSWYgImBFeGlzdHMgIntzcmNyb290fSJpbmNsdWRlOmVsZjoie3RhcmdldF9jcHV9Ii5oYCIgIT0gIiIKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjoie3RhcmdldF9jcHV9Ii5oICJ7ZWRpcn0iJ2VsZi8nInt0YXJnZXRfY3B1fSInLmgnCi1FbmQgSWYKLUlmICJ7dGFyZ2V0X2NwdX0iID1+IC9wb3dlcnBjLwotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOnBwYy5oICJ7ZWRpcn0iJ2VsZi9wcGMuaCcKLUVuZCBJZgotCi1JZiAiYEV4aXN0cyAie3NyY3Jvb3R9ImluY2x1ZGU6b3Bjb2RlOiJ7dGFyZ2V0X2NwdX0iLmhgIiAhPSAiIgotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6b3Bjb2RlOiJ7dGFyZ2V0X2NwdX0iLmggIntlZGlyfSInb3Bjb2RlLycie3RhcmdldF9jcHV9IicuaCcKLUVuZCBJZgotSWYgInt0YXJnZXRfY3B1fSIgPX4gL3Bvd2VycGMvCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpvcGNvZGU6cHBjLmggIntlZGlyfSInb3Bjb2RlL3BwYy5oJwotRW5kIElmCi0KLSMgQWRkIHNvbWUgYmZkIGluY2x1ZGVzIHRoYXQgZ2V0IG1lbnRpb25lZCBvdXRzaWRlIHRoZSBiZmQgZGlyLgotCQotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iYmZkOmxpYmNvZmYuaCAie2VkaXJ9IidiZmQvbGliY29mZi5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iYmZkOmxpYmVjb2ZmLmggIntlZGlyfSInYmZkL2xpYmVjb2ZmLmgnCi0KLSMgVHJhbnNsYXRlIHJhbmRvbSBmaWxlcyBpbnRvIE1QVy1vbmx5IGNoYXJhY3RlciBzZXQuCi0KLXRyLTd0bzggIntzcmNkaXJ9Im1wdy1SRUFETUUgPiAie29iamRpcn1SZWFkIE1lIGZvciBNUFciCi10ci03dG84ICJ7c3JjZGlyfSJtcHctaW5zdGFsbCA+ICJ7b2JqZGlyfSJJbnN0YWxsCmRpZmYgLS1naXQgYS9tcHctY29uZmlndXJlIGIvbXB3LWNvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0NTE0OC4uMDAwMDAwMAotLS0gYS9tcHctY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBzY3JpcHQKLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyMjIFdBUk5JTkcKLSMjIyBUaGlzIHNjcmlwdCBtdXN0IE5PVCB1c2UgYW55IDgtYml0IGNoYXJzIQotIyMjIFdBUk5JTkcKLQotIyBUaGlzIGlzIGFuIE1QVyBTaGVsbCBzY3JpcHQgdGhhdCBzZXRzIGV2ZXJ5dGhpbmcgdXAgZm9yIGNvbXBpbGF0aW9uLAotIyBtYWlubHkgY3JlYXRpbmcgZGlyZWN0b3JpZXMsIGFuZCBlZGl0aW5nIGNvcGllcyBvZiBmaWxlcy4KLQotU2V0IHNhdmVkaXIgImBEaXJlY3RvcnlgIgotCi0jU2V0IEVjaG8gMQotCi1TZXQgVGhpc1NjcmlwdCAiezB9IgotCi1TZXQgc3Jjcm9vdCAiLS0tLS0tLS0iCi0KLVNldCBzcmNkaXIgIjoiCi0KLVNldCBvYmpkaXIgIjoiCi0KLVNldCBwcmVmaXggIntNUFd9IjpHTlVUb29sczoKLQotU2V0IGV4ZWNfcHJlZml4ICIiCi0KLVNldCBiaW5kaXIgIiIKLQotU2V0IGhvc3RfYWxpYXMgIm02OGstYXBwbGUtbXB3IgotCi1TZXQgdGFyZ2V0X2FsaWFzIHtob3N0X2FsaWFzfQotCi1TZXQgaG9zdF9jYyAibXB3YyIKLQotU2V0IHdpdGhfZ251X2xkIDAKLQotU2V0IGhlbHBvdXRwdXQgMAotCi1TZXQgcmVjdXJzZSAxCi0KLVNldCB2ZXJpZnkgMAotU2V0IHZlcmlmeXN0ciAiIgotCi1TZXQgZW5hYmxlX29wdGlvbnMgIiIKLVNldCBkaXNhYmxlX29wdGlvbnMgIiIKLQotIyBQYXJzZSBhcmd1bWVudHMuCi0KLUxvb3AKLQlCcmVhayBJZiB7I30gPT0gMAotCUlmICJ7MX0iID1+IC8tLWNjLwotCQlTZXQgaG9zdF9jYyAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1iaW5kaXIvCi0JCVNldCBiaW5kaXIgInsyfSIKLQkJU2hpZnQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy0tZGlzYWJsZS0/Ky8KLQkJU2V0IGBFY2hvIHsxfSB8IHNlZCAtZSAncy8tLWRpc2FibGUtL2VuYWJsZV8vJ2Agbm8KLQkJU2V0IGRpc2FibGVfb3B0aW9ucyAie2Rpc2FibGVfb3B0aW9uc30gJ3sxfSciCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1lbmFibGUtPysvCi0JCVNldCBgRWNobyB7MX0gfCBzZWQgLWUgJ3MvLS1lbmFibGUtL2VuYWJsZV8vJ2AgeWVzCi0JCVNldCBlbmFibGVfb3B0aW9ucyAie2VuYWJsZV9vcHRpb25zfSAnezF9JyIKLQlFbHNlIElmICJ7MX0iID1+IC8tLWV4ZWMtcHJlZml4LwotCQlTZXQgZXhlY19wcmVmaXggInsyfSIKLQkJU2hpZnQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy0taGVscC8KLQkJU2V0IGhlbHBvdXRwdXQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy0taG9zdC8KLQkJU2V0IGhvc3RfYWxpYXMgInsyfSIKLQkJU2hpZnQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy0tbm9yZWN1cnNpb24vCi0JCVNldCByZWN1cnNlIDAKLQlFbHNlIElmICJ7MX0iID1+IC8tLXByZWZpeC8KLQkJU2V0IHByZWZpeCAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1zcmNkaXIvCi0JCVNldCBzcmNkaXIgInsyfSIKLQkJU2hpZnQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy0tc3Jjcm9vdC8KLQkJU2V0IHNyY3Jvb3QgInsyfSIKLQkJU2hpZnQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy0tdGFyZ2V0LwotCQlTZXQgdGFyZ2V0X2FsaWFzICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tdi8KLQkJU2V0IHZlcmlmeSAxCi0JCVNldCB2ZXJpZnlzdHIgIi12IgotCUVsc2UgSWYgInsxfSIgPX4gLy0td2l0aC1nbnUtbGQvCi0JCVNldCB3aXRoX2dudV9sZCAxCi0JRWxzZQotCQlFY2hvIC1uICdtcHctY29uZmlndXJlOiBVbnJlY29nbml6ZWQgb3B0aW9uOiAiJwotCQlFY2hvIC1uICJ7MX0iCi0JCUVjaG8gJyI7IHVzZSAtLWhlbHAgZm9yIHVzYWdlLicKLQkJRXhpdCAxCi0JRW5kIElmCi0JU2hpZnQgMQotRW5kIExvb3AKLQotSWYge2hlbHBvdXRwdXR9ID09IDEKLQlFY2hvICJVc2FnZTogbXB3LWNvbmZpZ3VyZSBbT1BUSU9OU10iCi0JRWNobyAiIgotCUVjaG8gIk9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0c10iCi0JRWNobyAiLS1iaW5kaXIgRElSICAgICAgZGlyZWN0b3J5IGZvciBiaW5hcmllcyBbXSIKLQlFY2hvICItLWNjIENDICAgICAgICAgICB1c2UgQyBjb21waWxlciBDQyBbbXB3Y10iCi0JRWNobyAiLS1kaXNhYmxlLUZPTyAgICAgZG8gbm90IGluY2x1ZGUgZmVhdHVyZSBGT08iCi0JRWNobyAiLS1lbmFibGUtRk9PICAgICAgaW5jbHVkZSBmZWF0dXJlIEZPTyIKLQlFY2hvICItLWV4ZWMtcHJlZml4IERJUiBpbnN0YWxsIGhvc3QtZGVwZW5kZW50IGZpbGVzIGludG8gRElSIFtdIgotCUVjaG8gIi0taGVscCAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZSIKLQlFY2hvICItLWhvc3QgSE9TVCAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW202OGstYXBwbGUtbXB3XSIKLQlFY2hvICItLW5vcmVjdXJzaW9uICAgICBjb25maWd1cmUgdGhpcyBkaXJlY3Rvcnkgb25seSBbcmVjdXJzZV0iCi0JRWNobyAiLS1wcmVmaXggRElSICAgICAgaW5zdGFsbCBpbnRvIERJUiBbe01QV306R05VVG9vbHM6XSIKLQlFY2hvICItLXNyY2RpciBESVIgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbOl0iCi0JRWNobyAiLS1zcmNyb290IERJUiAgICAgZmluZCB0aGUgdG9wbGV2ZWwgc291cmNlcyBpbiBESVIgWzpdIgotCUVjaG8gIi0tdGFyZ2V0IFRBUkdFVCAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0iCi0JRWNobyAiLXYgICAgICAgICAgICAgICAgdmVyYm9zZSIKLQlFY2hvICItLXdpdGgtZ251LWxkICAgICBsaW5rIHVzaW5nIEdOVSBsZCBbbm9dIgotCUV4aXQgMAotRW5kIElmCi0KLVNldCBFeGl0IDAKLQotIyBEZWZhdWx0IGV4ZWNfcHJlZml4IGZyb20gcHJlZml4LgotCi1JZiAie2V4ZWNfcHJlZml4fSIgPT0gIiIKLQlTZXQgZXhlY19wcmVmaXggIntwcmVmaXh9IgotRW5kIElmCi0KLUlmICJ7YmluZGlyfSIgPT0gIiIKLQlTZXQgYmluZGlyICJ7cHJlZml4fSJiaW46Ci1FbmQgSWYKLQotIyBQb2ludCB0byB0aGUgY29ycmVjdCBzZXQgb2YgdG9vbHMgdG8gdXNlIHdpdGggdGhlIGNob3NlbiBjb21waWxlci4KLQotSWYgIntob3N0X2NjfSIgPX4gL21wd2MvCi0JU2V0IGhvc3RfYWxpYXMgIm02OGstYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfTVBXX0N9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1zICcKLQlTZXQgYXJfbmFtZSAne0FSX0xJQn0nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfTERfTElOS30nCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF82OEt9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19DfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9OVUxMfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfNjhLfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL3NjNjhrLwotCVNldCBob3N0X2FsaWFzICJtNjhrLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDX1NDfScKLQlTZXQgc2VnbWVudF9mbGFnICctcyAnCi0JU2V0IGFyX25hbWUgJ3tBUl9MSUJ9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX0xJTkt9JwotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfNjhLfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfQ30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfTlVMTH0nCi0JU2V0IHJlel9uYW1lICd7UkVaXzY4S30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9td2M2OGsvCi0JU2V0IGhvc3RfYWxpYXMgIm02OGstYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfTVdDNjhLfScKLQlTZXQgc2VnbWVudF9mbGFnICctcyAnCi0JU2V0IGFyX25hbWUgJ3tBUl9NV0xJTks2OEt9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX01XTElOSzY4S30nCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF82OEt9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19NV0M2OEt9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX05VTEx9JwotCVNldCByZXpfbmFtZSAne1JFWl82OEt9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvZ2NjNjhrLwotCVNldCBob3N0X2FsaWFzICJtNjhrLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDXzY4S19HQ0N9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1zICcKLQlTZXQgYXJfbmFtZSAne0FSXzY4S19BUn0nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX1JBTkxJQn0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ182OEtfR0NDfScKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUXzY4S30nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX0N9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX05VTEx9JwotCVNldCByZXpfbmFtZSAne1JFWl82OEt9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvcHBjYy8KLQlTZXQgaG9zdF9hbGlhcyAicG93ZXJwYy1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19QUENDfScKLQlTZXQgc2VnbWVudF9mbGFnICctZCBfX19zX2VfZ19fXz0nCi0JU2V0IGFyX25hbWUgJ3tBUl9QUENMSU5LfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9QUENMSU5LfScKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUX1hDT0ZGfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfUFBDfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9QUEN9JwotCVNldCByZXpfbmFtZSAne1JFWl9QUEN9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvbXJjLwotCVNldCBob3N0X2FsaWFzICJwb3dlcnBjLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDX01SQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLWQgX19fc19lX2dfX189JwotCVNldCBhcl9uYW1lICd7QVJfUFBDTElOS30nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfTERfUFBDTElOS30nCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF9YQ09GRn0nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX1BQQ30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfUFBDfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfUFBDfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL3NjcHBjLwotCVNldCBob3N0X2FsaWFzICJwb3dlcnBjLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDX1NDfScKLQlTZXQgc2VnbWVudF9mbGFnICctZCBfX19zX2VfZ19fXz0nCi0JU2V0IGFyX25hbWUgJ3tBUl9QUENMSU5LfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9QUENMSU5LfScKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUX1hDT0ZGfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfUFBDfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9QUEN9JwotCVNldCByZXpfbmFtZSAne1JFWl9QUEN9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvbXdjcHBjLwotCVNldCBob3N0X2FsaWFzICJwb3dlcnBjLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDX01XQ1BQQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLWQgX19fc19lX2dfX189JwotCVNldCBhcl9uYW1lICd7QVJfTVdMSU5LUFBDfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9NV0xJTktQUEN9JwotCSMgTWlzbGVhZGluZywgYnV0IHdlIGRvbid0IG5lZWQgYSBQRUYgc3RlcC4KLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUXzY4S30nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX01XQ1BQQ30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfTlVMTH0nCi0JU2V0IHJlel9uYW1lICd7UkVaX1BQQ30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9nY2NwcGMvCi0JU2V0IGhvc3RfYWxpYXMgInBvd2VycGMtYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfUFBDX0dDQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLWQgX19fc19lX2dfX189JwotCVNldCBhcl9uYW1lICd7QVJfUFBDTElOS30nCi0JSWYge3dpdGhfZ251X2xkfSA9PSAxCi0JCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9SQU5MSUJ9JwotCQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX0dMRH0nCi0JRWxzZQotCQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JCVNldCBjY19sZF9uYW1lICd7Q0NfTERfUFBDTElOS30nCi0JRW5kIElmCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF9YQ09GRn0nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX1BQQ30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfUFBDfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfUFBDfScKLUVsc2UKLQlFY2hvICJ7aG9zdF9jY30iIGlzIG5vdCBhIGtub3duIE1QVyBjb21waWxlciB0eXBlCi1FbmQgSWYKLQotU2V0IGRhc2hfY19mbGFnICcnCi1JZiAie2hvc3RfY2N9IiA9fiAvZ2NjNjhrLwotCVNldCBkYXNoX2NfZmxhZyAnLWMnCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9nY2NwcGMvCi0JU2V0IGRhc2hfY19mbGFnICctYycKLUVuZCBJZgotCi0jIChzaG91bGQgaW50ZXJwcmV0IGFsaWFzZXMgaWYgbm90IGluIGNhbm9uaWNhbCBmb3JtKQotCi1TZXQgaG9zdF9jYW5vbmljYWwgIntob3N0X2FsaWFzfSIKLQotU2V0IHRhcmdldF9jYW5vbmljYWwgInt0YXJnZXRfYWxpYXN9IgotCi1TZXQgY29uZmlnZGlycyAiIgotCi1JZiAie3NyY3Jvb3R9IiA9fiAvLS0tLS0tLS0vCi0JU2V0IHNyY3Jvb3QgIntzcmNkaXJ9IgotRW5kIElmCi1JZiAiYEV4aXN0cyAie3NyY2Rpcn0iYCIgPT0gIiIKLQlFY2hvIFNvdXJjZSBkaXJlY3Rvcnkge3NyY2Rpcn0gZG9lcyBub3QgZXhpc3QhCi0JRXhpdCAxCi1FbmQgSWYKLUlmICJgRXhpc3RzICJ7c3Jjcm9vdH0iYCIgPT0gIiIKLQlFY2hvIFRvcC1sZXZlbCBzb3VyY2UgZGlyZWN0b3J5IHtzcmNyb290fSBkb2VzIG5vdCBleGlzdCEKLQlFeGl0IDEKLUVuZCBJZgotCi1TZXQgdGFyZ2V0X2NwdSAiYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkICdzL15cKC4qXCktXCguKlwpLVwoLipcKSQvXDEvJ2AiCi1TZXQgdGFyZ2V0X3ZlbmRvciAiYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkICdzL15cKC4qXCktXCguKlwpLVwoLipcKSQvXDIvJ2AiCi1TZXQgdGFyZ2V0X29zICJgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgJ3MvXlwoLipcKS1cKC4qXCktXCguKlwpJC9cMy8nYCIKLQotIyBDcmVhdGUgYSBmaWxlIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBvbGRlciB0aGFuIGFueSBvdGhlciBoZXJlLgotCi1JZiAiYEV4aXN0cyAie29iamRpcn0iX29sZGVzdGAiID09ICIiCi0JbXB3LXRvdWNoIF9vbGRlc3QKLUVuZCBJZgotCi0jIFJlY29yZCB0aGlzIGJlZm9yZSBjcmVhdGluZyBhbnkgZmlsZXMsIG1ha2VmaWxlcyBzb21ldGltZXMgbWVudGlvbgotIyBkZXBlbmRlbmNpZXMgb24gY29uZmlnLnN0YXR1cy4KLQotRWNobyAiIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzOiIgPmNvbmZpZy5uZXcKLUVjaG8gIntUaGlzU2NyaXB0fSAtLWhvc3Qge2hvc3RfYWxpYXN9IC0tdGFyZ2V0IHt0YXJnZXRfYWxpYXN9IC0tc3JjZGlyIHtzcmNkaXJ9ICAtLXNyY3Jvb3Qge3NyY3Jvb3R9ICAtLXByZWZpeCB7cHJlZml4fSAtLWNjIHtob3N0X2NjfSB7dmVyaWZ5c3RyfSB7ZW5hYmxlX29wdGlvbnN9IHtkaXNhYmxlX29wdGlvbnN9IC0tbm9yZWN1cnNpb24iID4+Y29uZmlnLm5ldwotTW92ZUlmQ2hhbmdlIGNvbmZpZy5uZXcgY29uZmlnLnN0YXR1cwotCi1JZiAiYEV4aXN0cyAie3NyY2Rpcn0ibXB3LWNvbmZpZy5pbmAiICE9ICIiCi0JdHItN3RvOCAie3NyY2Rpcn0ibXB3LWNvbmZpZy5pbiA+IntvYmpkaXJ9Im1wdy1jb25maWcuaW4KLQlFeGVjdXRlICJ7b2JqZGlyfSJtcHctY29uZmlnLmluCi1FbmQgSWYKLQotIyBTdGFydCBNYWtlZmlsZSBjb25zdHJ1Y3Rpb24gYnkgZGVmaW5pbmcgYWxsIHRoZSB2YXJpYWJsZXMgY2hvc2VuIGJ5Ci0jIGNvbmZpZ3VyYXRpb24uCi0KLUVjaG8gIiMgVGhpcyBNYWtlZmlsZSBwcm9kdWNlZCBieSBtcHctY29uZmlndXJlLiAgQ2hhbmdlcyBtYXkgZ2V0IGxvc3QhIiA+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInNyY3Jvb3QgPSAiIHtzcmNyb290fQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInRvcHNyY2RpciA9ICIge3NyY3Jvb3R9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAic3JjZGlyID0gIiB7c3JjZGlyfQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIm1wd19wcmVmaXggPSAiIHtwcmVmaXh9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAibXB3X2V4ZWNfcHJlZml4ID0gIiB7ZXhlY19wcmVmaXh9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJtcHdfYmluZGlyID0gIiB7YmluZGlyfQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gImhvc3RfYWxpYXMgPSAiIHtob3N0X2FsaWFzfQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAidGFyZ2V0X2FsaWFzID0gIiB7dGFyZ2V0X2FsaWFzfQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAidGFyZ2V0X2NwdSA9ICIge3RhcmdldF9jcHV9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJ0YXJnZXRfdmVuZG9yID0gIiB7dGFyZ2V0X3ZlbmRvcn0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInRhcmdldF9vcyA9ICIge3RhcmdldF9vc30JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJ0YXJnZXRfY2Fub25pY2FsID0gIiB7dGFyZ2V0X2Nhbm9uaWNhbH0JPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiaG9zdF9tYWtlZmlsZV9mcmFnID0gIgkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInRhcmdldF9tYWtlZmlsZV9mcmFnID0gIgkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIkNDID0gIiB7Y2NfbmFtZX0JCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiQVIgPSAiIHthcl9uYW1lfQkJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJSQU5MSUIgPSAiIHtyYW5saWJfbmFtZX0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJDQ19MRCA9ICIge2NjX2xkX25hbWV9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiUFJPR19FWFQgPSAiIHtwcm9nX2V4dF9uYW1lfQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiRVhUUkFMSUJTID0gIiB7ZXh0cmFsaWJzX25hbWV9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJNQUtFUEVGID0gIiB7bWFrZXBlZl9uYW1lfQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiUkVaID0gIiB7cmV6X25hbWV9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCi1JZiB7aG9zdF9jY30gPX4gL2djY3BwYy8KLQlFY2hvIC1uICJkcSA9XE9wdGlvbi1kXE9wdGlvbi1kXE9wdGlvbi1kIiA+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0wCi0JRWNobyAnIicgCQkJCSA+PiAie29iamRpcn0iTWFrZWZpbGUudGVtMAotCXRyLTd0bzggICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0wCT4+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWxzZQotCUVjaG8gLW4gImRxID0nIiAJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi0JRWNobyAtbiAnIicgCQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQlFY2hvICAgICInIiAJCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRW5kIElmCi0KLSMgQXBwZW5kIHRoZSBtYXN0ZXIgc2V0IG9mIGRlZmluaXRpb25zIGZvciB0aGUgdmFyaW91cyBjb21waWxlcnMuCi0KLUlmICJgRXhpc3RzICJ7c3JjZGlyfSJjb25maWc6bXB3LW1oLW1wd2AiICE9ICIiCi0JdHItN3RvOCAie3NyY2Rpcn0iY29uZmlnOm1wdy1taC1tcHcgPj4ie29iamRpcn0iTWFrZWZpbGUudGVtCi1FbHNlIElmICJgRXhpc3RzICJ7c3Jjcm9vdH0iY29uZmlnOm1wdy1taC1tcHdgIiAhPSAiIgotCXRyLTd0bzggIntzcmNyb290fSJjb25maWc6bXB3LW1oLW1wdyA+PiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVsc2UKLQlFY2hvICJjYW4ndCBmaW5kIGEgaG9zdCBjb25maWcgZmlsZSEiCi0JRXhpdCAwCi1FbmQgSWYKLQotIyBBcHBlbmQgYW55dGhpbmcgcHJvZHVjZWQgYnkgdGhlIGRpcmVjdG9yeSdzIG1wdy1jb25maWcuaW4uCi0KLUlmICJgRXhpc3RzICJ7b2JqZGlyfSJtay50bXBgIiAhPSAiIgotCUNhdGVuYXRlICJ7b2JqZGlyfSJtay50bXAgPj4ie29iamRpcn0iTWFrZWZpbGUudGVtCi0JIyBBbiBtcHctY29uZmlnLmluIG1pZ2h0IGNoYW5nZSBzbyBhcyBub3QgdG8gY3JlYXRlIHRoaXMKLQkjIGFueW1vcmUsIHNvIGdldCByaWQgb2YgaXQgbm93IHRvIGJlIHNhZmUuCi0JRGVsZXRlIC1pIC15ICJ7b2JqZGlyfSJtay50bXAKLUVuZCBJZgotCi0jIElmIHRoZXJlIGFyZSBzZWQgc2NyaXB0cyB0byBlZGl0IHRoZSBVbml4IE1ha2VmaWxlLmluLCB1c2UgdGhlbTsgb3RoZXJ3aXNlCi0jIHVzZSBhbiBtcHctbWFrZS5pbiBpZiBwcmVzZW50LgotCi1JZiAiYEV4aXN0cyAie3NyY2Rpcn0ibXB3LW1ha2Uuc2VkYCIgIT0gIiIKLQlJZiAiYEV4aXN0cyAie29iamRpcn0iaGFja2VkX01ha2VmaWxlLmluYCIgIT0gIiIKLQkJU2V0IE1ha2VmaWxlSW4gIntvYmpkaXJ9ImhhY2tlZF9NYWtlZmlsZS5pbgotCUVsc2UKLQkJU2V0IE1ha2VmaWxlSW4gIntzcmNkaXJ9Ik1ha2VmaWxlLmluCi0JRW5kIElmCi0JIyBGaW5kIHRoZSBnZW5lcmljIG1ha2VmaWxlIGVkaXRpbmcgc2NyaXB0LgotCUlmICJgRXhpc3RzICJ7c3Jjcm9vdH0iY29uZmlnOm1wdzpnLW1wdy1tYWtlLnNlZGAiICE9ICIiCi0JCXNlZCAtZiAie3NyY3Jvb3R9ImNvbmZpZzptcHc6Zy1tcHctbWFrZS5zZWQgIntNYWtlZmlsZUlufSIgPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xCi0JRWxzZSBJZiAiYEV4aXN0cyAie3NyY3Jvb3R9InV0aWxzOm1wdzpnLW1wdy1tYWtlLnNlZGAiICE9ICIiCi0JCXNlZCAtZiAie3NyY3Jvb3R9InV0aWxzOm1wdzpnLW1wdy1tYWtlLnNlZCAie01ha2VmaWxlSW59IiA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEKLQlFbHNlIElmICJgRXhpc3RzICJ7c3JjZGlyfSJnLW1wdy1tYWtlLnNlZGAiICE9ICIiCi0JCXNlZCAtZiAie3NyY2Rpcn0iZy1tcHctbWFrZS5zZWQgIntNYWtlZmlsZUlufSIgPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xCi0JRWxzZQotCQlFY2hvIFdhcm5pbmc6IGctbXB3LW1ha2Uuc2VkIG5vdCBmb3VuZCwgY29weWluZyAie01ha2VmaWxlSW59IiB2ZXJiYXRpbS4uLgotCQlDYXRlbmF0ZSAie01ha2VmaWxlSW59IiA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEKLQlFbmQgSWYKLQlzZWQgLWYgIntzcmNkaXJ9Im1wdy1tYWtlLnNlZCAie29iamRpcn0iTWFrZWZpbGUudGVtMSA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIKLQlzZWQgLWUgJ3MvXnByZWZpeCA9IC4qJC9wcmVmaXggPSB7bXB3X3ByZWZpeH0vZycgLWUgJ3MvXmV4ZWNfcHJlZml4ID0gLiokL2V4ZWNfcHJlZml4ID0ge21wd19leGVjX3ByZWZpeH0vZycgLWUgJ3MvXmJpbmRpciA9IEBiaW5kaXJAL2JpbmRpciA9IHttcHdfYmluZGlyfS9nJyAie29iamRpcn0iTWFrZWZpbGUudGVtMiA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTMKLQlzZWQgLWUgInMvQERBU0hfQ19GTEFHQC97ZGFzaF9jX2ZsYWd9LyIgLWUgInMvQFNFR01FTlRfRkxBRyhcKFteKV0qXCkpQC97c2VnbWVudF9mbGFnfVwxLyIgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTMgPiJ7b2JqZGlyfSJtcHctbWFrZS5pbgotCXRyLTd0bzggIntvYmpkaXJ9Im1wdy1tYWtlLmluID4+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCUlmICJgRXhpc3RzICJ7b2JqZGlyfSJtay5zZWRgIiAhPSAiIgotCQlzZWQgLWYgIntvYmpkaXJ9Im1rLnNlZCAie29iamRpcn0iTWFrZWZpbGUudGVtID4ie29iamRpcn0iTWFrZWZpbGUudGVtMgotCQlSZW5hbWUgLXkgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCUVuZCBJZgotCU1vdmVJZkNoYW5nZSAie29iamRpcn0iTWFrZWZpbGUudGVtICJ7b2JqZGlyfSJNYWtlZmlsZQotCURlbGV0ZSAtaSAteSAie29iamRpcn0iTWFrZWZpbGUudGVtWzEyXQotCUlmIHt2ZXJpZnl9ID09IDEKLQkJRWNobyBDcmVhdGVkIE1ha2VmaWxlIGluICJgRGlyZWN0b3J5YCIKLQlFbmQgSWYKLUVsc2UgSWYgImBFeGlzdHMgIntzcmNkaXJ9Im1wdy1tYWtlLmluYCIgIT0gIiIKLQlzZWQgLWUgJ3MvXnByZWZpeCA9IC4qJC9wcmVmaXggPSB7bXB3X3ByZWZpeH0vZycgIntzcmNkaXJ9Im1wdy1tYWtlLmluID4ie29iamRpcn0iTWFrZWZpbGUudGVtMQotCXNlZCAtZSAicy9AREFTSF9DX0ZMQUdAL3tkYXNoX2NfZmxhZ30vIiAtZSAicy9AU0VHTUVOVF9GTEFHKFwoW14pXSpcKSlAL3tzZWdtZW50X2ZsYWd9fVwxLyIgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEgPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yCi0JdHItN3RvOCAie29iamRpcn0iTWFrZWZpbGUudGVtMiA+PiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQlJZiAiYEV4aXN0cyAie29iamRpcn0ibWsuc2VkYCIgIT0gIiIKLQkJc2VkIC1mICJ7b2JqZGlyfSJtay5zZWQgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbSA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIKLQkJUmVuYW1lIC15ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQlFbmQgSWYKLQlNb3ZlSWZDaGFuZ2UgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbSAie29iamRpcn0iTWFrZWZpbGUKLQlEZWxldGUgLWkgLXkgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbVsxMl0KLQlJZiB7dmVyaWZ5fSA9PSAxCi0JCUVjaG8gQ3JlYXRlZCBNYWtlZmlsZSBpbiAiYERpcmVjdG9yeWAiCi0JRW5kIElmCi1FbmQgSWYKLQotIyBQcm9kdWNlIGEgYnVpbGQgc2NyaXB0IGlmIHRoZSBzb3VyY2UgaXMgZGVmaW5lZC4KLQotSWYgImBFeGlzdHMgIntzcmNkaXJ9Im1wdy1idWlsZC5pbmAiICE9ICIiCi0JRWNobyAiU2V0IHNyY3Jvb3QgIiB7c3Jjcm9vdH0gPiAie29iamRpcn0ibXB3LWJ1aWxkLnRlbQotCUVjaG8gIlNldCBzcmNkaXIgIiB7c3JjZGlyfSA+PiAie29iamRpcn0ibXB3LWJ1aWxkLnRlbQotCUVjaG8gIlNldCB0YXJnZXRfY2Fub25pY2FsICIge3RhcmdldF9jYW5vbmljYWx9ID4+ICJ7b2JqZGlyfSJtcHctYnVpbGQudGVtCi0JRWNobyAiU2V0IHByZWZpeCAiIHtwcmVmaXh9ID4+ICJ7b2JqZGlyfSJtcHctYnVpbGQudGVtCi0JdHItN3RvOCAie3NyY2Rpcn0ibXB3LWJ1aWxkLmluID4+IntvYmpkaXJ9Im1wdy1idWlsZC50ZW0KLQlNb3ZlSWZDaGFuZ2UgIntvYmpkaXJ9Im1wdy1idWlsZC50ZW0gIntvYmpkaXJ9Im1wdy1idWlsZAotCUlmIHt2ZXJpZnl9ID09IDEKLQkJRWNobyBDcmVhdGVkIG1wdy1idWlsZCBpbiAiYERpcmVjdG9yeWAiCi0JRW5kIElmCi1FbmQgSWYKLQotIyBBcHBseSBvdXJzZWx2ZXMgcmVjdXJzaXZlbHkgdG8gdGhlIGxpc3Qgb2Ygc3ViZGlyZWN0b3JpZXMgdG8gY29uZmlndXJlLgotCi1JZiB7cmVjdXJzZX0gPT0gMQotCUZvciBzdWJkaXIgSW4ge2NvbmZpZ2RpcnN9Ci0JCVNldCBzYXZlZGlyICJgRGlyZWN0b3J5YCIKLQkJSWYgImBFeGlzdHMgIntzcmNkaXJ9e3N1YmRpcn06ImAiID09ICIiCi0JCQlJZiB7dmVyaWZ5fSA9PSAxCi0JCQkJRWNobyBObyAie3NyY2Rpcn17c3ViZGlyfToiIGZvdW5kLCBza2lwcGluZwotCQkJRW5kIElmCi0JCQlDb250aW51ZQotCQlFbmQgSWYKLQkJSWYge3ZlcmlmeX0gPT0gMQotCQkJRWNobyBDb25maWd1cmluZyB7c3ViZGlyfS4uLgotCQlFbmQgSWYKLQkJSWYgImBFeGlzdHMgIntvYmpkaXJ9e3N1YmRpcn06ImAiID09ICIiCi0JCQlOZXdGb2xkZXIgIntvYmpkaXJ9e3N1YmRpcn0iCi0JCUVuZCBJZgotCQlTZXREaXJlY3RvcnkgIntvYmpkaXJ9e3N1YmRpcn06IgotCQkie1RoaXNTY3JpcHR9IiAtLXRhcmdldCAie3RhcmdldF9jYW5vbmljYWx9IiAtLXNyY2RpciAie3NyY2Rpcn17c3ViZGlyfToiIC0tc3Jjcm9vdCAie3NyY3Jvb3R9IiAtLXByZWZpeCAie3ByZWZpeH0iIC0tY2MgIntob3N0X2NjfSIge3ZlcmlmeXN0cn0ge2VuYWJsZV9vcHRpb25zfSB7ZGlzYWJsZV9vcHRpb25zfQotCQlTZXREaXJlY3RvcnkgIntzYXZlZGlyfSIKLQlFbmQgRm9yCi1FbmQgSWYKLQotU2V0RGlyZWN0b3J5ICJ7c2F2ZWRpcn0iCmRpZmYgLS1naXQgYS9tcHctaW5zdGFsbCBiL21wdy1pbnN0YWxsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGM1YWFjLi4wMDAwMDAwCi0tLSBhL21wdy1pbnN0YWxsCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLSMgR05VIEluc3RhbGwgc2NyaXB0IGZvciBNUFcuCi0KLVNldCBPbGRFeGl0ICJ7RXhpdH0iCi1TZXQgRXhpdCAwCi0KLVNldCBUZW1wVXNlclN0YXJ0dXAgIntUZW1wRm9sZGVyfSJfX3RlbXBfX1VzZXJTdGFydHVwCi0KLUVjaG8gJyMgVXNlclN0YXJ0dXAgZ2VuZXJhdGVkIGJ5IEdOVSBJbnN0YWxsIHNjcmlwdCcgPiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICcnCQkJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotCi0jIChzaG91bGQpIENoZWNrIHRoYXQgZGlzayBzcGFjZSBpcyBzdWZmaWNpZW50IGZvciBpbnN0YWxsYXRpb24uCi0KLSMgQXNzdW1lIHRoYXQgdGhlIGluc3RhbGwgc2NyaXB0IGlzIHdoZXJlIGV2ZXJ5dGhpbmcgZWxzZSBpcy4KLQotU2V0IHRoaXNkaXIgImBEaXJlY3RvcnlgIgotCi0jIENvcHkgdGhlIGJpbmFyaWVzIHRvIHRoZSBkZXNpcmVkIHBsYWNlLgotCi1Db25maXJtIC10ICJDb3B5IHRoZSBiaW5hcmllcyB0byBzb21ld2hlcmUgZWxzZT8iCi1TZXQgVG1wU3RhdHVzIHtTdGF0dXN9Ci1JZiB7VG1wU3RhdHVzfSA9PSAwCi0JU2V0IGJpbmRlc3QgImBHZXRGaWxlTmFtZSAtZCAtbSAiV2hlcmUgdG8gaW5zdGFsbCB0aGUgYmluYXJpZXM/ImAiCi0JSWYge1N0YXR1c30gPT0gMAotCQlJZiAiYEV4aXN0cyAie3RoaXNkaXJ9YmluImAiICE9ICIiCi0JCQlGb3IgYWZpbGUgSW4gInt0aGlzZGlyfSJiaW46XE9wdGlvbi14Ci0JCQkJRHVwbGljYXRlIC15ICJ7YWZpbGV9IiAie2JpbmRlc3R9IgotCQkJRW5kIEZvcgotCQlFbHNlCi0JCQlFY2hvICJiaW4gZGlyZWN0b3J5IG5vdCBmb3VuZCwgZXhpdGluZyIKLQkJCUV4aXQgMQotCQlFbmQgSWYKLQlFbHNlCi0JCUVjaG8gIk5vIGRlc3RpbmF0aW9uIHN1cHBsaWVkLCBleGl0aW5nIgotCQlFeGl0IDEKLQlFbmQgSWYKLUVsc2UgSWYge1RtcFN0YXR1c30gPT0gNAotCSMgVXNlIHRoZSBleGlzdGluZyBkaXJlY3RvcnkuCi0JU2V0IGJpbmRlc3QgInt0aGlzZGlyfWJpbjoiCi1FbHNlCi0JIyBDYW5jZWxsZWQgZnJvbSBjb25maXJtYXRpb24sIGVzY2FwZSBhbHRvZ2V0aGVyLgotCUV4aXQgMQotRW5kIElmCi0KLSMgQ29weSB0aGUgbGlicmFyaWVzIHRvIHRoZSBkZXNpcmVkIHBsYWNlLgotCi1Db25maXJtIC10ICJDb3B5IHRoZSBsaWJyYXJpZXMgdG8gc29tZXdoZXJlIGVsc2U/IgotU2V0IFRtcFN0YXR1cyB7U3RhdHVzfQotSWYge1RtcFN0YXR1c30gPT0gMAotCVNldCBsaWJkZXN0ICJgR2V0RmlsZU5hbWUgLWQgLW0gIldoZXJlIHRvIGluc3RhbGwgdGhlIGxpYnJhcmllcz8iYCIKLQlJZiB7U3RhdHVzfSA9PSAwCi0JCUlmICJgRXhpc3RzICJ7dGhpc2Rpcn1saWI6ImAiICE9ICIiCi0JCQlGb3IgYWZpbGUgSW4gInt0aGlzZGlyfSJsaWI6XE9wdGlvbi14Ci0JCQkJRHVwbGljYXRlIC15ICJ7YWZpbGV9IiAie2xpYmRlc3R9IgotCQkJRW5kIEZvcgotCQlFbHNlCi0JCQlFY2hvICJsaWIgZGlyZWN0b3J5IG5vdCBmb3VuZCwgZXhpdGluZyIKLQkJCUV4aXQgMQotCQlFbmQgSWYKLQlFbHNlCi0JCUVjaG8gIk5vIGRlc3RpbmF0aW9uIHN1cHBsaWVkLCBleGl0aW5nIgotCQlFeGl0IDEKLQlFbmQgSWYKLUVsc2UgSWYge1RtcFN0YXR1c30gPT0gNAotCSMgVXNlIHRoZSBleGlzdGluZyBkaXJlY3RvcnkuCi0JU2V0IGxpYmRlc3QgInt0aGlzZGlyfWxpYjoiCi1FbHNlCi0JIyBDYW5jZWxsZWQgZnJvbSBjb25maXJtYXRpb24sIGVzY2FwZSBhbHRvZ2V0aGVyLgotCUV4aXQgMQotRW5kIElmCi0KLQotIyBBZGQgdGhlIGxvY2F0aW9uIG9mIHRoZSBiaW5hcmllcyB0byB0aGUgY29tbWFuZCBwYXRoLgotCi1FY2hvIC1uICdTZXQgQ29tbWFuZHMgIicJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvIC1uICJ7YmluZGVzdH0iCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gICAgJyx7Q29tbWFuZHN9IicJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAnJwkJCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLQotIyBTZXQgdXAgR0NDIGV4ZWMgcHJlZml4LgotCi1TZXQgZ2NjbGliZGlyICJ7bGliZGVzdH0iZ2NjLWxpYjoKLQotRWNobyAtbiAnU2V0IEdDQ19FWEVDX1BSRUZJWCAiJwkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gLW4gIntnY2NsaWJkaXJ9IgkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICAgICciJwkJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAiRXhwb3J0IEdDQ19FWEVDX1BSRUZJWCIJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICcnCQkJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotCi0jIFNldCB1cCBwYXRoIHRvIGxpYmdjYy54Y29mZiBldGMuCi0KLUVjaG8gLW4gJ1NldCBHQ0NQUENMaWJyYXJpZXMgIicJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvIC1uICJ7bGliZGVzdH0iCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gICAgJyInCQkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICJFeHBvcnQgR0NDUFBDTGlicmFyaWVzIgkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gJycJCQkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi0KLSMgRGlzcGxheSBjb250ZW50cyBvZiBVc2VyU3RhcnR1cCwgY29uZmlybSBpbnN0YWxsYXRpb24uCi0KLVNldCBVc2VyU3RhcnR1cE5hbWUgIlVzZXJTdGFydHVwXE9wdGlvbi04R05VIgotCi1FY2hvICJDb250ZW50cyBvZiIge1VzZXJTdGFydHVwTmFtZX0gIndpbGwgYmU6IgotQ2F0ZW5hdGUgIntUZW1wVXNlclN0YXJ0dXB9IgotCi1Db25maXJtICJJbnN0YWxsIHtVc2VyU3RhcnR1cE5hbWV9IGludG8gdGhlIE1QVyBmb2xkZXIge01QV30gPyIKLUlmIHtTdGF0dXN9ID09IDAKLQlEdXBsaWNhdGUgIntUZW1wVXNlclN0YXJ0dXB9IiAie01QV317VXNlclN0YXJ0dXBOYW1lfSIKLQlEZWxldGUgLXkgIntUZW1wVXNlclN0YXJ0dXB9IgotRWxzZQotCUVjaG8gIntVc2VyU3RhcnR1cE5hbWV9IGZpbGUgbm90IGluc3RhbGxlZCIKLUVuZCBJZgotCi0jIChzaG91bGQpIENoZWNrIEhFWEEgcmVzb3VyY2UsIHdhcm4gaWYgbG93LgotCi0jIChzaG91bGQpIENoZWNrIGZvciBzcGFjZXMgaW4gcGF0aG5hbWVzLCB3YXJuIGlmIGZvdW5kLgotCi1FY2hvICJJbnN0YWxsYXRpb24gd2FzIHN1Y2Nlc3NmdWwuIgotRWNobyAiIgotRWNobyAiQmUgc3VyZSB0byByZXZpZXcgdGhlIHVzYWdlIG5vdGVzIGluICdSZWFkIE1lIGZvciBNUFcnIGJlZm9yZSBwcm9jZWVkaW5nISIKLQotIyBSZXN0b3JlIHByZXZpb3VzIHNldHRpbmdzLgotCi1TZXQgRXhpdCAie09sZEV4aXR9IgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9DaGFuZ2VMb2cgYi9vcGNvZGVzL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY5MDg0Mi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDUwOTggKzAsMCBAQAotMTk5OS0wNS0xOCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jIChFZCk6IERlZmluZS4KLQkoZGlzMzg2X3R3b2J5dGVfYXR0LCBkaXMzODZfdHdvYnl0ZV9pbnRlbCk6IFVzZSBFZCBmb3IgbW92ZC4KLQkoUncpOiBSZW1vdmUuCi0JKE9QX3JtKTogUmVuYW1lIHRvIE9QX1JkLgotCShPTkUpOiBSZW1vdmUuCi0JKE9QX09ORSk6IFJlbW92ZS4KLQkocHV0b3ApOiBBZGQgY29uc3QgdG8gdGVtcGxhdGUgYW5kIHAuCi0JKHByaW50X2luc25feDg2KTogRGVsZXRlLgotCShwcmludF9pbnNuX2kzODYpOiBNZXJnZSBvbGQgZnVuY3Rpb24gcHJpbnRfaW5zbl94ODYuICBBZGQgY29uc3QKLQl0byBkcC4KLQkoc3RydWN0IGRpczM4Nik6IEFkZCBjb25zdCB0byBuYW1lLgotCShkaXMzODZfYXR0LCBkaXMzODZfaW50ZWwpOiBBZGQgY29uc3QuCi0JKGRpczM4Nl90d29ieXRlX2F0dCwgZGlzMzg2X3R3b2J5dGVfaW50ZWwpOiBBZGQgY29uc3QuCi0JKG5hbWVzMzIsIG5hbWVzMTYsIG5hbWVzOCwgbmFtZXNfc2VnLCBpbmRleDE2KTogQWRkIGNvbnN0LgotCShncnBzLCBwcmVmaXhfdXNlcl90YWJsZSwgZmxvYXRfcmVnKTogQWRkIGNvbnN0LgotCShmbG9hdF9tZW1fYXR0LCBmbG9hdF9tZW1faW50ZWwpOiBBZGQgY29uc3QuCi0JKG9hcHBlbmQpOiBBZGQgY29uc3QgdG8gcy4KLQkoT1BfUkVHKTogQWRkIGNvbnN0IHRvIHMuCi0JKHB0cl9yZWcpOiBBZGQgY29uc3QgdG8gcy4KLQkoZG9mbG9hdCk6IEFkZCBjb25zdCB0byBkcC4KLQkoT1BfQyk6IERvbid0IHNraXAgbW9kcm0sIGl0J3Mgbm93IGRvbmUgaW4gT1BfUmQuCi0JKE9QX0QpOiBEaXR0by4KLQkoT1BfVCk6IERpdHRvLgotCShPUF9SZCk6IENoZWNrIGZvciB2YWxpZCBtb2QuICBDYWxsIE9wX0UgdG8gcHJpbnQuCi0JKE9QX0UpOiBIYW5kbGUgZF9tb2RlIGFyZy4gIENoZWNrIGZvciBiYWQgc2ZlbmNlLGxlYSxsZHMgZXRjLgotCShPUF9NUyk6IENoZWNrIGZvciB2YWxpZCBtb2QuICBDYWxsIE9wX0VNIHRvIHByaW50LgotCShPUF8zRE5vd1N1ZmZpeCk6IFNldCBvYnVmcCBhbmQgdXNlIG9hcHBlbmQgcmF0aGVyIHRoYW4KLQlzdHJjYXQuICBDYWxsIEJhZE9wKCkgZm9yIGVycm9ycy4KLQkoT1BfU0lNRF9TdWZmaXgpOiBMaWtld2lzZS4KLQkoQmFkT3ApOiBOZXcgZnVuY3Rpb24uCi0KLTE5OTktMDUtMTIgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAoZGlzMzg2X2ludGVsKTogUmVtb3ZlIG1hY3JvIGNoYXJzLCBleGNlcHQgZm9yCi0JakVjeHouICBDaGFuZ2UgY1d0UiBhbmQgY1J0ZCB0byBjVyBhbmQgY1IuCi0JKGRpczM4Nl90d29ieXRlX2ludGVsKTogUmVtb3ZlIG1hY3JvIGNoYXJzIGhlcmUgdG9vLgotCShwdXRvcCk6IEhhbmRsZSBSIGFuZCBXIG1hY3JvcyBmb3IgaW50ZWwgbW9kZS4KLQotCSogaTM4Ni1kaXMuYyAoU0lNRF9GaXh1cCk6IE5ldyBmdW5jdGlvbi4KLQkoZGlzMzg2X3R3b2J5dGVfYXR0KTogVXNlIGl0IG9uIG1vdmxwcyBhbmQgbW92aHBzLCBhbmQgY2hhbmdlCi0JRXYgdG8gRVggb24gdGhlc2UgaW5zbnMuICBDaGFuZ2UgbW92bXNrcHMgRXYsIFhNIHRvIEd2LCBFWC4KLQkoZGlzMzg2X3R3b2J5dGVfaW50ZWwpOiBTYW1lIGhlcmUuCi0KLQkqIGkzODYtZGlzLmMgKEF2KTogUmVtb3ZlLgotCShBcCk6IHJlbW92ZSBscHRyLgotCShscHRyKTogUmVtb3ZlLgotCShPUFNJTUQpOiBEZWZpbmUuCi0JKE9QX1NJTURfU3VmZml4KTogTmV3IGZ1bmN0aW9uLgotCShPUF9ESVIpOiBSZW1vdmUgZGVhZCBjb2RlLgotCShlQVhfcmVnLi5lRElfcmVnKTogUmVudW1iZXIuCi0JKG9uZWJ5dGVfaGFzX21vZHJtKTogVGFibGUgbnVtYmVyaW5nIGNvbW1lbnRzLgotCShJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IpOiBNb3ZlIHRvIGJlZm9yZSBwcmludF9pbnNuX3g4Ni4KLQkocHJpbnRfaW5zbl94ODYpOiBNb3ZlIGFsbCBwcmVmaXggb2FwcGVuZHMgdG8gYWZ0ZXIgdXNlc19mM19wcmVmaXgKLQljaGVja3MuICBQcmludCBlcnJvciBvbiBpbnZhbGlkIGRwLT5ieXRlbW9kZTIuICBSZW1vdmUgc2ltZF9jbXAsCi0JYW5kIGhhbmRsZSBTSU1EIGNtcCBpbnNucyBpbiBPUF9TSU1EX1N1ZmZpeC4KLQkoaW5mby0+Ynl0ZXNfcGVyX2xpbmUpOiBCdW1wIGZyb20gNSB0byA2LgotCShPUF9Ob25lKTogUmVtb3ZlLgotCShPUF9FKTogVXNlIElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUi4gIEhhbmRsZSBzZmVuY2UuCi0JKE9QXzNETm93U3VmZml4KTogRW5zdXJlIG1uZW1vbmljIGluZGV4IHVuc2lnbmVkLgotCi0JUElJSSBTSU1EIHN1cHBvcnQgZnJvbSBEb3VnIExlZGZvcmQgPGRsZWRmb3JkQHJlZGhhdC5jb20+Ci0JKiBpMzg2LWRpcy5jIChYTSwgRVgsIE5vbmUpOiBEZWZpbmUuCi0JKE9QX1hNTSwgT1BfRVgsIE9QX05vbmUpOiBOZXcgZnVuY3Rpb25zLgotCShVU0VfR1JPVVBTLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUpOiBEZWZpbmUuCi0JKEdSUDE0KTogUmVuYW1lIHRvIEdSUEFNRC4KLQkoR1JQKik6IEFkZCBVU0VfR1JPVVBTIGZsYWcuCi0JKFBSRUdSUCopOiBEZWZpbmUuCi0JKGRpczM4Nl90d29ieXRlX2F0dCwgZGlzMzg2X3R3b2J5dGVfaW50ZWwpOiBBZGQgU0lNRCBpbnNucy4KLQkodHdvYnl0ZV9oYXNfbW9kcm0pOiBBZGQgU0lNRCBlbnRyaWVzLgotCSh0d29ieXRlX3VzZXNfZjNfcHJlZml4LCBzaW1kX2NtcF9vcCwgcHJlZml4X3VzZXJfdGFibGUpOiBOZXcuCi0JKGdycHMpOiBBZGQgU0lNRCBpbnNucy4KLQkocHJpbnRfaW5zbl94ODYpOiBOZXcgdmFycyB1c2VzX2YzX3ByZWZpeCBhbmQgc2ltZF9jbXAuICBEb24ndAotCW9hcHBlbmQgcmVweiBpZiB1c2VzX2YzX3ByZWZpeC4gIEFkZCBjb2RlIHRvIGhhbmRsZSBuZXcgZ3JvdXBzIGZvcgotCVNJTUQgaW5zbnMuCi0KLQlGcm9tIE1hY2llaiBXLiBSb3p5Y2tpIDxtYWNyb0BkczIucGcuZ2RhLnBsPgotCSogaTM4Ni1kaXMuYyAoZGlzMzg2X2F0dCwgZGlzMzg2X2ludGVsKTogQ2hhbmdlIDB4RTggY2FsbCBpbnNuCi0Jb3BlcmFuZCBmcm9tIEF2IHRvIEp2LgotCi0xOTk5LTA1LTA3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtY29yZS1kaXMuYyAocHJpbnRfaW5zbl9tY29yZSk6IFVzZSAuc2hvcnQgdG8gZGlzcGxheQotCXVuaWRlbnRpZmllZCBpbnN0cnVjdGlvbnMsIG5vdCAud29yZC4KLQotMTk5OS0wNC0yNiAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFVwZGF0ZWQgZm9yIG5ldyB2ZXJzaW9uIG9mIGxpYnRvb2wuCi0KLTE5OTktMDQtMTQgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZnIzMC1kZXNjLmMsZnIzMC1kZXNjLmgsZnIzMC1kaXMuYyxmcjMwLWlibGQuYyxmcjMwLW9wYy5jOiBSZWJ1aWxkLgotCSogbTMyci1kZXNjLmMsbTMyci1kZXNjLmgsbTMyci1kaXMuYyxtMzJyLWlibGQuYyxtMzJyLW9wYy5jOiBSZWJ1aWxkLgotCi1Nb24gQXByIDEyIDIzOjQ2OjE3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhLCBjYXNlICczJyk6IE5ldyBjYXNlIGZvciBQQTIuMAotCWluc3RydWN0aW9ucy4KLQotMTk5OS0wNC0xMCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBmcjMwLWRlc2MuYyxmcjMwLWRlc2MuaCxmcjMwLWlibGQuYzogUmVidWlsZC4KLQkqIG0zMnItZGVzYy5jLG0zMnItZGVzYy5oLG0zMnItb3BpbnN0LmM6IFJlYnVpbGQuCi0KLTE5OTktMDQtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBvcGludGwuaCAoTENfTUVTU0FHRVMpOiBOZXZlciBkZWZpbmUuCi0KLTE5OTktMDQtMDQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBpMzg2LWRpcy5jIChpbnRlbF9zeW50YXgsIG9wZW5fY2hhciwgY2xvc2VfY2hhcik6IE1ha2Ugc3RhdGljLgotCShzZXBhcmF0b3JfY2hhciwgc2NhbGVfY2hhcik6IExpa2V3aXNlLgotCShwcmludF9pbnNuX3g4Nik6IExpa2V3aXNlLgotCShwcmludF9pbnNuX2kzODYpOiBMaWtld2lzZS4gIEFkZCBkZWNsYXJhdGlvbi4KLQotMTk5OS0wMy0yNiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBmcjMwLWRpcy5jOiBSZWJ1aWxkLgotCSogbTMyci1kaXMuYzogUmVidWlsZC4KLQotMTk5OS0wMy0yMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIG02OGstb3BjLmM6IENoYW5nZSBjb21wYXJlIGluc3RydWN0aW9ucyB0byB1c2UgIkBzIiByYXRoZXIgdGhhbgotCSI7cyIgd2hlbiB1c2VkIHdpdGggYW4gaW1tZWRpYXRlIG9wZXJhbmQuCi0KLTE5OTktMDMtMjIgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1vcGMuYyAoY2dlbl9zZXRfY3B1KTogRGVsZXRlLgotCShjZ2VuX2xvb2t1cF9pbnNuKTogbWF4X2luc25fc2l6ZSByZW5hbWVkIHRvIG1heF9pbnNuX2JpdHNpemUuCi0JKiBmcjMwLWRlc2MuYyxmcjMwLWRlc2MuaCxmcjMwLWRpcy5jLGZyMzAtaWJsZC5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDoKLQlSZWJ1aWxkLgotCSogbTMyci1kZXNjLmMsbTMyci1kZXNjLmgsbTMyci1kaXMuYyxtMzJyLWlibGQuYyxtMzJyLW9wYy5jLG0zMnItb3BjLmg6Ci0JUmVidWlsZC4KLQkqIHBvL29wY29kZXMucG90OiBSZWJ1aWxkLgotCi0xOTk5LTAzLTE2ICBNYXJ0aW4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAobXZ0c3lzKTogUmVtb3ZlIEZMQUdfTEtSLgotCi0xOTk5LTAzLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tb3BjLmMgKGNnZW5fc2V0X2NwdSk6IE5ldyBhcmcgYGlzYScuICBBbGwgY2FsbGVycyB1cGRhdGVkLgotCShjZ2VuX29wZXJhbmRfbG9va3VwX2J5X25hbWUsY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9udW0pOiBOZXcgZm5zLgotCShjZ2VuX2dldF9pbnNuX29wZXJhbmRzKTogUmV3cml0ZSB0ZXN0IGZvciBoYXJkY29kZWQvb3BlcmFuZCBpbmRleC4KLQkqIGZyMzAtYXNtLmMsZnIzMC1kZXNjLmMsZnIzMC1kZXNjLmgsZnIzMC1kaXMuYyxmcjMwLWlibGQuYzogUmVidWlsZC4KLQkqIG0zMnItYXNtLmMsbTMyci1kZXNjLmMsbTMyci1kZXNjLmgsbTMyci1kaXMuYyxtMzJyLWlibGQuYzogUmVidWlsZC4KLQkqIG0zMnItb3BpbnN0LmM6IFJlYnVpbGQuCi0KLTE5OTktMDItMjUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1vcGMuYyAoY2dlbl9od19sb29rdXBfYnlfbmFtZSk6IFJld3JpdGUuCi0JKGNnZW5faHdfbG9va3VwX2J5X251bSk6IFJld3JpdGUuCi0JKiBmcjMwLWRlc2MuYyxmcjMwLWRlc2MuaCxmcjMwLWRpcy5jLGZyMzAtaWJsZC5jLGZyMzAtb3BjLmM6IFJlYnVpbGQuCi0JKiBtMzJyLWRlc2MuYyxtMzJyLWRlc2MuaCxtMzJyLWRpcy5jLG0zMnItaWJsZC5jLG0zMnItb3BjLmM6IFJlYnVpbGQuCi0JKiBtMzJyLW9waW5zdC5jOiBSZWJ1aWxkLgotCi1TYXQgRmViIDEzIDE0OjA2OjE5IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLW9wYy5jOiBBZGQgc3FydCtmbGFncyBwYXR0ZXJucy4gIEFkZCBFVjYgUEFMY29kZSBpbnNucy4KLQkoaW5zZXJ0X2poaW50KTogRml4IGluc2VydGlvbiBtYXNrLgotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBEaXNhc3NlbWJsZSBFVjYgUEFMY29kZSBpbnNucy4KLQotMTk5OS0wMi0xMCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wMi0wOSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBpOTYwYy1hc20uYyxpOTYwYy1kaXMuYyxpOTYwYy1vcGMuYyxpOTYwYy1vcGMuaDogRGVsZXRlLgotCSogaTk2MC1kaXMuYyAocHJpbnRfaW5zbl9pOTYwKTogUmVuYW1lIGZyb20gcHJpbnRfaW5zbl9pOTYwX29yaWcuCi0JKiBNYWtlZmlsZS5hbTogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gdGhlbS4KLQkoSEZJTEVTKTogQWRkIGZyMzAtZGVzYy5oLG0zMnItZGVzYy5oLgotCShDRklMRVMpOiBBZGQgZnIzMC1kZXNjLmMsZnIzMC1pYmxkLmMsbTMyci1kZXNjLmMsbTMyci1pYmxkLmMsCi0JbTMyci1vcGluc3QuYy4KLQkoQUxMX01BQ0hJTkVTKTogVXBkYXRlLgotCSogY29uZmlndXJlLmluOiBSZWRvIGhhbmRsaW5nIG9mIGNnZW5fZmlsZXMuCi0JKGJmZF9pOTYwX2FyY2gpOiBEZWxldGUgaTk2MGMtKi5sbyBmaWxlcy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGNnZW4tYXNtLmMgKCopOiBDR0VOX09QQ09ERV9ERVNDIHJlbmFtZWQgdG8gQ0dFTl9DUFVfREVTQy4KLQkoaGFzaF9pbnNuX2FycmF5KTogUmV3cml0ZS4KLQkqIGNnZW4tZGlzLmMgKCopOiBDR0VOX09QQ09ERV9ERVNDIHJlbmFtZWQgdG8gQ0dFTl9DUFVfREVTQy4KLQkoaGFzaF9pbnNuX2FycmF5KTogUmV3cml0ZS4KLQkqIGNnZW4tb3BjLmMgKCopOiBDR0VOX09QQ09ERV9ERVNDIHJlbmFtZWQgdG8gQ0dFTl9DUFVfREVTQy4KLQkoY2dlbl9sb29rdXBfaW5zbixjZ2VuX2dldF9pbnNuX29wZXJhbmRzKTogRGVmaW5lIGhlcmUuCi0JKGNnZW5fbG9va3VwX2dldF9pbnNuX29wZXJhbmRzKTogRGl0dG8uCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlLgotCSogbTMyci1hc20uYyxtMzJyLWRpcy5jLG0zMnItb3BjLmMsbTMyci1vcGMuaDogUmVnZW5lcmF0ZS4KLQkqIHBvL1BPVEZJTEVTLmluOiBSZWJ1aWxkLgotCSogcG8vb3Bjb2Rlcy5wb3Q6IFJlYnVpbGQuCi0KLUZyaSBGZWIgIDUgMDA6MDQ6MjQgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEhGSUxFUyk6IEFkZCBmcjMwLW9wYy5oLgotCShDRklMRVMpOiBBZGQgZnIzMC1hc20uYywgZnIzMC1kaXMuYywgZnIzMC1vcGMuYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBBQ19QUkVSRVEgdG8gMi4xMy4gIFJlbW92ZSBBTV9DWUdXSU4zMi4KLQlDaGFuZ2UgQU1fRVhFRVhUIHRvIEFDX0VYRUVYVCBhbmQgQU1fUFJPR19JTlNUQUxMIHRvCi0JQUNfUFJPR19JTlNUQUxMLgotCSogYWNjb25maWcuaDogUmVtb3ZlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggY3VycmVudCBhdXRvY29uZi9hdXRvbWFrZS4KLQkqIGFjbG9jYWwubTQ6IExpa2V3aXNlLgotCSogY29uZmlnLmluOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluOiBMaWtld2lzZS4KLQotVGh1IEZlYiAgNCAxMzo0ODo1MiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IENvcnJlY3QgbW92ZSAobm90IG1vdmV3KSB0byBzdGF0dXMgd29yZCBvbiA1MjAwLgotCi1Nb24gRmViICAxIDIwOjU0OjM2IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogIEhhbmRsZSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4LgotICAgICAgICAqIGkzODYtZGlzLmMgKHhfbW9kZSk6ICBEZWZpbmUuCi0gICAgICAgIChkaXMzODYpOiAgUmVtb3ZlLgotICAgICAgICAoZGlzMzg2X2F0dCk6ICBOZXcuCi0gICAgICAgIChkaXMzODZfaW50ZWwpOiAgTmV3LgotICAgICAgICAoZGlzMzg2X3R3b2J5dGUpOiAgUmVtb3ZlLgotICAgICAgICAoZGlzMzg2X3R3b2J5dGVfYXR0KTogIE5ldy4KLSAgICAgICAgKGRpczM4Nl90d29ieXRlX2ludGVsKTogIE5ldy4KLSAgICAgICAgKHByaW50X2luc25feDg2KTogIFVzZSBuZXcgYXJyYXlzLgotICAgICAgICAoZmxvYXRfbWVtKTogIFJlbW92ZS4KLSAgICAgICAgKGZsb2F0X21lbV9pbnRlbCk6ICBOZXcuCi0gICAgICAgIChmbG9hdF9tZW1fYXR0KTogIE5ldy4KLSAgICAgICAgKGRvZmxvYXQpOiAgVXNlIG5ldyBmbG9hdF9tZW0gYXJyYXlzLgotICAgICAgICAocHJpbnRfaW5zbl9pMzg2X2F0dCk6ICBOZXcuCi0gICAgICAgIChwcmludF9pbnNuX2kzODZfaW50ZWwpOiAgTmV3LgotICAgICAgICAocHJpbnRfaW5zbl9pMzg2KTogIEhhbmRsZSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4LgotICAgICAgICAocHV0b3ApOiAgSGFuZGxlIGludGVsIHN5bnRheC4KLSAgICAgICAgKE9QX2luZGlyRSk6ICBIYW5kbGUgaW50ZWwgc3ludGF4LgotICAgICAgICAoT1BfRSk6ICBIYW5kbGUgaW50ZWwgc3ludGF4LgotICAgICAgICAoT1BfSSk6ICBIYW5kbGUgaW50ZWwgc3ludGF4LgotICAgICAgICAoT1Bfc0kpOiAgSGFuZGxlIGludGVsIHN5bnRheC4KLSAgICAgICAgKE9QX09GRik6ICBIYW5kbGUgaW50ZWwgc3ludGF4LgotCi0KLQotMTk5OS0wMS0yNyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5oLGZyMzAtb3BjLmM6IFJlYnVpbGQuCi0JKiBpOTYwYy1vcGMuaCxpOTYwYy1vcGMuYzogUmVidWlsZC4KLQkqIG0zMnItb3BjLmM6IFJlYnVpbGQuCi0KLVR1ZSBKYW4gMTkgMTg6MDE6NTQgMTk5OSAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQkqIGhwcGEtZGlzLmM6IHJldmVydCBIUCBtZXJnZSBjaGFuZ2VzIHVudGlsIEhQIGdpdmVzIHVzCi0JYW4gdXBkYXRlZCBmaWxlLgotCQotMTk5OS0wMS0xOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2FybSk6IERpc3BsYXkgQVJNIHN5bnRheCBmb3IgUEMgcmVsYXRpdmUKLQlvZmZzZXRzIGFzIHdlbGwgYXMgc3ltYmxvaWMgYWRkcmVzcy4KLQotVHVlIEphbiAxOSAxMDo1MTowMSAxOTk5ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KLQotCSogaHBwYS1kaXMuYzogZml4IGNvbW1lbnRzIGFuZCBzb21lIGluZGVudGF0aW9uLgotCi0xOTk5LTAxLTEyICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmMsaTk2MGMtb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDEtMTEgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZS4KLQotMTk5OS0wMS0wNiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAxLTA1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5oLGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGUuCi0JKiBpOTYwYy1hc20uYyxpOTYwYy1kaXMuYyxpOTYwYy1vcGMuaCxpOTYwYy1vcGMuYzogUmVnZW5lcmF0ZS4KLQkqIG0zMnItYXNtLmMsbTMyci1kaXMuYyxtMzJyLW9wYy5oLG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDEtMDQgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZXF1aXJlIGF1dG9jb25mIDIuMTIuMSBvciBoaWdoZXIuCi0KLTE5OTgtMTItMzAgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzMTYtb3BjLmM6IE1hcmsgYnJhbmNoIGluc25zIHdpdGggTUlQUzE2X0lOU05fQlJBTkNILgotCi1XZWQgRGVjIDE2IDE2OjE3OjQ5IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCi0KLTE5OTgtMTItMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChzZXRfbWlwc19pc2FfdHlwZSk6IEhhbmRsZSBiZmRfbWFjaF9taXBzNDExMS4KLQotMTk5OC0xMi0xNSAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi0xOTk4LTEyLTE0ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLVRodSBEZWMgMTAgMTg6Mzk6NDYgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi1UaHUgRGVjIDEwIDEyOjQ5OjI0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLVR1ZSBEZWMgIDggMTM6NTY6MTggMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1idWYuYyAoZ2VuZXJpY19zdHJjYXRfYWRkcmVzcyk6IHJlZm9ybWF0IHRvIEdOVSBjb2RpbmcKLQljb252ZW50aW9ucy4gIGNoYW5nZSBzcHJpbnRmIGNhbGwgdG8gYW4gc3ByaW50Zl92bWEgY2FsbC4KLQotVHVlIERlYyAgOCAxMzoxMjo0NCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi1UdWUgRGVjICA4IDEwOjUwOjQ2IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBieQotCUVsZW5hIFphbm5vbmkgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPiwKLQlEYXZpZCBUYXlsb3IgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPiwgYW5kCi0JRWRpdGggRXBzdGVpbiA8ZWVwc3RlaW5Ac29waGlhLmN5Z251cy5jb20+IGFzIHBhcnQgb2YgYSBwcm9qZWN0IHRvCi0JbWVyZ2UgaW4gY2hhbmdlcyBieSBIUDsgSFAgZGlkIG5vdCBjcmVhdGUgQ2hhbmdlTG9nIGVudHJpZXMuCi0KLQkqIGRpcy1idWYuYyAoZ2VuZXJpY19zdHJjYXRfYWRkcmVzcyk6IG5ldyBmdW5jdGlvbi4KLQotCSogaHBwYS1kaXMuYzogQ2hhbmdlcyB0byBpbXByb3ZlIGhwcGEgZGlzYXNzZW1ibHkuCi0JICBDaGFuZ2VkIGZvcm1hdHRpbmcgaW4gOiByZWdfbmFtZXMsIGZwX3JlZ19uYW1lcyxjb250cm9sX3JlZywgCi0JICBOZXcgdmFyaWFibGVzIDogc2lnbl9leHRlbnNpb25fbmFtZXMsIGRlcG9zaXRfbmFtZXMsIGNvbnZlcnNpb25fbmFtZXMKLQkgICAgZmxvYXRfdGVzdF9uYW1lcywgY29tcGFyZV9jb25kX25hbWVzX2RvdWJsZSwgYWRkX2NvbmRfbmFtZXNfZG91YmxlLAotCSAgICBsb2dpY2FsX2NvbmRfbmFtZXNfZG91YmxlLCB1bml0X2NvbmRfbmFtZXNfZG91YmxlLCAKLQkgICAgYnJhbmNoX3B1c2hfcG9wX25hbWVzLCBzYXR1cmF0aW9uX25hbWVzLCBzaGlmdF9uYW1lcywgbWl4X25hbWVzLAotCSAgTmV3IE1hY3JvcyA6ICAgR0VUX0NPTVBMX08sIEdFVF9QVVNIX1BPUCxNRVJHRURfUkVHIAotCSAgTW92ZSBzb21lIGRlZmluaXRpb25zIHRvIGxpYmhwcGEuaDogR0VUX0ZJRUxELCBHRVRfQklUCi0JICAoZnB1dF9jb25zdCk6IHJlbmFtZWQgYXMgZnB1dF9oZXhfY29uc3QKLQkgIChwcmludF9pbnNuX2hwcGEpOgotCSAgIC0gdXNlIHRoZSBtYWNyb3MgZnB1dHNfZmlsdGVyZWQgYW5kCi0JICAgICBmcHV0X2RlY2ltYWxfY29uc3Qgd2hlbmV2ZXIgcG9zc2libGU7IGNhbGxzIHRvIHNpZ25fZXh0ZW5kIHJlcXVpcmUKLQkgICAgIDIgcGFyYW1zIC0tIGFkZCBhIG1pc3Npbmcgc2Vjb25kIHBhcmFtIG9mIDAuCi0JICAgLSBTb21lIG5ldyBjb2RlIGlmZGVmZWQgZm9yIExPQ0FMX09OTFksIGFsbCByZWxhdGVkIHRvIGZpZ3VyaW5nIG91dAotCSAgICAgYXJjaGl0ZWN0dXJlIHZlcnNpb24gbnVtYmVyIG9mIGN1cnJlbnQgbWFjaGluZS4gSFAgZm9sa3MgYXJlCi0JICAgICB0cnlpbmcgdG8gaGFuZGxlIHNpdHVhdGlvbiB3aGVyZSB0aGUgdGFyZ2V0IHByb2dyYW0gd2FzIGNvbXBpbGVkCi0JICAgICBmb3IgUEEgMS54ICgzMi1iaXQpLCBidXQgaXMgcnVubmluZyBvbiBhIFBBIDIuMCBtYWNoaW5lIGFuZCAKLQkgICAgIHZpc2EgdmVyc2EuCi0JICAgLSBhZGRlZCBuZXcgY2FzZXMgOiAnZycsICdCJywgJ20nCi0JICAgLSBhZGRlZCBjYXNlcyBzcGVjaWZpY2FsbHkgZm9yIFBBIDIuMAotCSAgIC0gY2hhbmdlZCB0aGUgZm9sbG93aW5nIGNhc2VzIDogJyInLCAnbicsICdOJywgJ3AnLCAnWicsIAotCSAgIC0gY2FsbHMgdG8gZnB1dF9jb25zdCBiZWNvbWUgY2FsbHMgdG8gZnB1dF9oZXhfY29uc3QKLQotMTk5OC0xMi0wNyAgSmFtZXMgRSBXaWxzb24gIDx3aWxzb25Ad2lsc29uLXBjLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChDRklMRVMpOiBBZGQgaTk2MGMtYXNtLCBpOTYwYy1kaXMuYywgaTk2MGMtb3BjLmMuCi0JKEFMTF9NQUNISU5FUyk6IEFkZCBpOTYwYy1hc20ubG8sIGk5NjBjLWRpcy5sbywgaTk2MC1vcGMubG8uCi0JKGk5NjAtYXNtLmxvLCBpOTYwYy1kaXMubG8sIGk5NjBjLW9wYy5sbyk6IE5ldyBNYWtlZmlsZSBydWxlcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgotCSogY29uZmlndXJlLmluIChiZmRfaTk2MF9hcmNoKTogQWRkIGk5NjBjLW9wYy5sbywgaTk2MC1hc20ubywKLQlpOTYwLWRpcy5jIHRvIHRhLgotCSogaTk2MC1kaXMuYyAocHJpbnRfaW5zbl9pOTYwKTogUmVuYW1lIHRvIHByaW50X2luc25faTk2MF9vcmlnLgotCSogaTk2MGMtYXNtLmMsIGk5NjBjLWRpcy5jLCBpOTYwYy1vcGMuYywgaTk2MGMtb3BjLmg6IE5ldyBmaWxlcy4KLQkKLU1vbiBEZWMgIDcgMTQ6MzM6NDQgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotU3VuIERlYyAgNiAxNDowNjo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKG1pcHNfYnVpbHRpbl9vcGNvZGVzKTogQWRkIGRtZmMyIGFuZCBkbXRjMi4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiBBZGQgUG93ZXJQQzQwMyBHQ1tYXSBpbnN0cnVjdGlvbnMuCi0JRnJvbSBTYWl0b2ggTWFzYW5vYnUgPG1zYWl0b2hAc3BhLmlzLnVlYy5hYy5qcD4uCi0KLUZyaSBEZWMgIDQgMTc6NDU6NTEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZS4KLQotRnJpIERlYyAgNCAxNzowODowOCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi1UaHUgRGVjICAzIDE0OjI2OjIwIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLVRodSBEZWMgIDMgMDA6MDk6MTcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZS4KLQotMTk5OC0xMS0zMCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWRpcy5jIChoYXNoX2luc25fYXJyYXkpOiBDR0VOX0lOU05fVkFMVUUgLT4KLQlDR0VOX0lOU05fQkFTRV9WQUxVRS4KLQkqIG0zMnItb3BjLmMsbTMyci1vcGMuaCxtMzJyLWFzbS5jLG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0JKiBmcjMwLW9wYy5jLGZyMzAtb3BjLmgsZnIzMC1hc20uYyxmcjMwLWRpcy5jOiBSZWdlbmVyYXRlLgotCi1UaHUgTm92IDI2IDExOjI2OjMyIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgotCi1UdWUgTm92IDI0IDExOjIwOjU0IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jOiBSZWdlbmVyYXRlZC4KLQotTW9uIE5vdiAyMyAxODoyODo0OCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi0xOTk4LTExLTIwICBEb3VnIEV2YW5zICA8ZGV2YW5zQHRvYm9yLnRvLmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgotCi1UaHUgTm92IDE5IDE2OjAyOjQ2IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtZGlzLmM6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1hc20uYzogUmVnZW5lcmF0ZWQuCi0KLVRodSBOb3YgMTkgMDc6NTQ6MTUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKHN5bmMucCxzeW5jLmwpOiBTd2FwIGluc24gdmFsdWVzLgotCi0xOTk4LTExLTE5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHRvYm9yLnRvLmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLVdlZCBOb3YgMTggMjE6MzY6MzcgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi0xOTk4LTExLTE4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIG0zMnItYXNtLmMsbTMyci1kaXMuYyxtMzJyLW9wYy5jOiBSZWJ1aWxkLgotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmM6IFJlYnVpbGQuCi0KLVdlZCBOb3YgMTggMTE6MzA6MDQgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KLQotTW9uIE5vdiAxNiAxOToyMTo0OCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0JCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1kaXMuYzogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLWFzbS5jOiBSZWdlbmVyYXRlZC4KLQotVGh1IE5vdiAxMiAxOToyNDoxOCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL29wY29kZXMucG90OiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLWRpcy5jOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtYXNtLmM6IFJlZ2VuZXJhdGVkLgotCi1UdWUgTm92IDEwIDE1OjI2OjI3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IEFkZCBzdXBwb3J0IGZvciBGUjMwIHRhcmdldC4KLQkKLVR1ZSBOb3YgMTAgMTE6MDA6MDQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1kaXMuYyxtMzJyLW9wYy5jLG0zMnItb3BjLmg6IFJlYnVpbGQuCi0JKiBmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVidWlsZC4KLQotTW9uIE5vdiAgOSAxODoyMjo1NSAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL29wY29kZXMucG90OiBSZWdlbmVyYXRlLgotCSogcG8vUE9URklMRVMuaW46IFJlZ2VuZXJhdGUuCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlLgotCSogZnIzMC1vcGMuaDogUmVnZW5lcmF0ZS4KLQotRnJpIE5vdiAgNiAxNzoyMTozOCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLWFzbS5jOiBSZWdlbmVyYXRlLgotCi1XZWQgTm92ICA0IDE4OjQ2OjQ3IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBjYXNlIGZvciBiZmRfZnIzMF9hcmNoLgotCSogTWFrZWZpbGUuYW0gKENGSUxFUyk6IEFkZGVkIGZyMzAtYXNtLmMsIGZyMzAtZGlzLmMsIGZyMzAtb3BjLmMuCi0JKEFMTF9NQUNISU5FUyk6IEFkZGVkIGZyMzAtYXNtLmxvLCBmcjMwLWRpcy5sbywgZnIzMC1vcGMubG8uCi0JKENMRUFORklMRVMpOiBBZGRlZCBzdGFtcC1mcjMwLgotCShGUjMwX0RFUFMpOiBBZGRlZC4KLQkqIGZyMzAtYXNtLmM6IE5ldyBmaWxlLgotCSogZnIzMC1kaXMuYzogTmV3IGZpbGUuCi0JKiBmcjMwLW9wYy5jOiBOZXcgZmlsZS4KLQkqIGZyMzAtb3BjLmg6IE5ldyBmaWxlLgotCSogcG8vUE9URklMRVMuaW46IFJlZ2VuZXJhdGVkCi0JKiBwby9vcGNvZGVzLnBvdDogUmVnZW5lcmF0ZWQKLQotTW9uIE5vdiAgMiAxNTowNTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKgotICAgICAgICAqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1UdWUgT2N0IDI3IDA4OjU4OjM3IDE5OTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChJU19NKTogQWRkZWQuCi0KLU1vbiBPY3QgMTkgMTM6MDM6MTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmMsbTMyci1vcGMuaCxtMzJyLWFzbS5jLG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLUZyaSBPY3QgIDkgMTQ6MDE6NTYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmgsbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotU3VuIE9jdCAgNCAyMTowMTo0NCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmMgKE9QXzNETm93U3VmZml4KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoT1BTVUYpOiBEZWZpbmUuCi0JKEdSUDE0KTogRGVmaW5lLgotCShkaXMzODZfdHdvYnl0ZSk6IEFkZCBHUlAxNCwgZmVtbXMsIGFuZCAzRE5vdyBlbnRyaWVzLgotCSh0d29ieXRlX2hhc19tb2RybSk6IFNldCBlbnRyaWVzIGNvcnJlc3BvbmRpbmcgdG8gR1JQMTQsIDNETm93LgotCShpbnNuX2NvZGVwKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHJpbnRfaW5zbl94ODYpOiBJbml0IGluc25fY29kZXAgYWZ0ZXIgcHJlZml4ZXMuCi0JKGdycHMpOiBBZGQgR1JQMTQgZW50cmllcyBmb3IgcHJlZmV0Y2gsIHByZWZldGNody4KLQkoT1BfUkVHKTogUmVmb3JtYXQuCi0KLQlGcm9tIEplZmYgQiBFcGxlciA8amVwbGVyQHVzZ3MuZ292PgotCSogaTM4Ni1kaXMuYyAoU3VmZml4M0ROb3cpOiBOZXcgdGFibGUuCi0KLVdlZCBTZXAgMzAgMTA6MTc6NTAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYzogVHJlYXQgVFJBUCBhcyBpZiBpdCB3ZXJlIGEgYnJhbmNoIHR5cGUgaW5zdHJ1Y3Rpb24uCi0KLU1vbiBTZXAgMjggMTQ6MzU6NDMgMTk5OCAgTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGQxMHYtZGlzLmMgKHByaW50X29wZXJhbmQpOiBJZiBudW0gaXMgbm9uemVybywgdGhlbgotCWFkZCBPUEVSQU5EX0FDQzEsIG5vdCBPUEVSQU5EX0FDQzAuCi0KLVRodSBTZXAgMjQgMDk6MjA6MDMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYzogQWRkIEZMQUdfSlNSIGF0dHJpYnV0ZSB0byBEQlQsIFJFSVQsIFJURCwgYW5kIFRSQVAKLQlpbnNucy4gCi0KLVR1ZSBTZXAgMjIgMTc6NTU6MTQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYzogQWRkIHVzZSBvZiBFSVRIRVJfQlVUX1BSRUZFUl9NVSBleGVjdXRpb24gdW5pdAotCWNsYXNzLiAKLQotVHVlIFNlcCAxNSAxNToxNDo0NSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5oLG0zMnItb3BjLmM6IEFkZCBiYnBjLGJicHN3IHN1cHBvcnQuCi0KLTE5OTgtMDktMDkgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IEFkZCBzdXBwb3J0IGZvciBQb3dlclBDIDc1MCBtb3ZlCi0JdG8vZnJvbSBTUFJzLgotCi1GcmkgU2VwICA0IDE5OjQyOjU5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9iaWdfYXJtKTogRGV0ZWN0IFRodW1iIHN5bWJvbHMgaW4gZWxmCi0Jb2JqZWN0IGZpbGVzLgotCShwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBEZXRlY3QgVGh1bWIgc3ltYm9scyBpbiBlbGYgb2JqZWN0Ci0JZmlsZXMuIAotCi1TYXQgQXVnIDI5IDIyOjI0OjA5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogVXNlIHRoZSBtYWNoaW5lIHR5cGUgdG8KLQlkZWNpZGUgd2hpY2ggUEFMY29kZSBzZXQgdG8gaW5jbHVkZS4KLQotU3VuIEF1ZyAyMyAwMjoxNjoxOCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoRkJSWCk6IEZpeCB0eXBvIGluICIsYSxwbiAlZmNjMyIgY2FzZS4KLQotRnJpIEF1ZyAyMSAxNjowNzo1MiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X29wY29kZV90YWJsZSk6IEFkZCBGTEFHX01VTDMyIHRvIE1BQywgTUFDUywKLQlNU1VCIGFuZCBNU1VCUyBpbnN0cnVjdGlvbnMuCi0KLVRodSBBdWcgMTMgMTY6MjM6MDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3BlcmFuZHMpOiBPbWl0IHBhcmVucyBhcm91bmQgYWRkaXRpb25zIGluCi0Jb3BlcmFuZCBuYW1lIG1hY3Jvcy4KLQotV2VkIEF1ZyAxMiAxNDowMDozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFBldGVyIEplcmVteSA8cGV0ZXIuamVyZW15QGF1c3MyLmFsY2F0ZWwuY29tLmF1PjoKLQkqIG02OGstb3BjLmM6IENvcnJlY3QgbXVsc2wgYW5kIG11bHVsIHRvIHVzZSBxIHJhdGhlciB0aGFuIEQsIGEsCi0JKywgLSwgYW5kIGQgZm9yIENvbGRGaXJlLgotCi0JRnJvbSBQZXRlciBUaGllbWFubiA8dGhpZW1hbm5AaW5mb3JtYXRpay51bmktdHVlYmluZ2VuLmRlPjoKLQkqIHBwYy1vcGMuYyAoaW5zZXJ0X21iZSk6IEhhbmRsZSB3cmFwcGluZyBiaXRtYXNrcy4KLQkoZXh0cmFjdF9tYmUpOiBMaWtld2lzZS4KLQotV2VkIEF1ZyAxMiAxMToxMTozNCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG0xMDMwMC1vcGMuYzogRml4IHR5cG8gaW4gdWRmMjAgLi4gdWRmMjUgaW5zdHJ1Y3Rpb24gb3Bjb2Rlcy4KLQotCSogbTEwMzAwLW9wYy5jOiBGaXJzdCBjdXQgYXQgVURGIGluc3RydWN0aW9ucy4KLQotTW9uIEF1ZyAxMCAxNDowODoyMiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jOiBSZWdlbmVyYXRlIChyZW1vdmUgc2VtYW50aWMgZGVzY3JpcHRpb25zKS4KLQotTW9uIEF1ZyAxMCAxMjo1MToxMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9iaWdfYXJtKTogIEZpeCBpbmRlbnRhdGlvbi4KLSAgICAgICAgKHByaW50X2luc25fbGl0dGxlX2FybSk6IExpa2V3aXNlLgotCi1TdW4gQXVnICA5IDIwOjE3OjI4IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLWRpcy5jIChwcmludF9pbnNuX2JpZ19hcm0pOiAgQ2hlY2sgZm9yIHRodW1iIHN5bWJvbAotICAgICAgICBhdHRyaWJ1dGVzLgotICAgICAgICAocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogTGlrZXdpc2UuCi0KLU1vbiBBdWcgIDMgMTI6NDM6MTYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQlNb3ZlIGFsbCBnbG9iYWwgc3RhdGUgZGF0YSBpbnRvIG9wY29kZSB0YWJsZSBzdHJ1Y3QsIGFuZCB0cmVhdAotCW9wY29kZSB0YWJsZSBhcyBzb21ldGhpbmcgdGhhdCBpcyAib3BlbmVkL2Nsb3NlZCIuCi0JKiBjZ2VuLWFzbS5jIChhbGwgZm5zKTogTmV3IGZpcnN0IGFyZyBvZiBvcGNvZGUgdGFibGUgZGVzY3JpcHRvci4KLQkoY2dlbl9hc21faW5pdCk6IERlbGV0ZS4KLQkoY2dlbl9zZXRfcGFyc2Vfb3BlcmFuZF9mbik6IE5ldyBmdW5jdGlvbi4KLQkqIGNnZW4tZGlzLmMgKGFsbCBmbnMpOiBOZXcgZmlyc3QgYXJnIG9mIG9wY29kZSB0YWJsZSBkZXNjcmlwdG9yLgotCShjZ2VuX2Rpc19pbml0KTogRGVsZXRlLgotCSogY2dlbi1vcGMuYyAoYWxsIGZucyk6IE5ldyBmaXJzdCBhcmcgb2Ygb3Bjb2RlIHRhYmxlIGRlc2NyaXB0b3IuCi0JKGNnZW5fY3VycmVudF97b3Bjb2RlX3RhYmxlX21hY2gsZW5kaWFufSk6IERlbGV0ZS4KLQkqIG0zMnItYXNtLmMsbTMyci1kaXMuYyxtMzJyLW9wYy5jLG0zMnItb3BjLmg6IFJlZ2VuZXJhdGUuCi0KLVRodSBKdWwgMzAgMjE6NDE6MTAgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAoZDMwdl9vcGNvZGVfdGFibGUpOiBBZGQgbmV3ICJMS1IiIGZsYWcgdG8gc29tZQotCWluc3RydWN0aW9ucy4KLQotVHVlIEp1bCAyOCAxMTowMDowOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG0xMDMwMC1vcGMuYzogQWRkIGVudHJpZXMgZm9yICJub19tYXRjaF9vcGVyYW5kcyIgZmllbGQgaW4KLQl0aGUgb3Bjb2RlIHRhYmxlLgotCi1GcmkgSnVsIDI0IDExOjQxOjM3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItYXNtLmMsbTMyci1vcGMuYzogUmVnZW5lcmF0ZSAoLVdhbGwgY2xlYW51cHMpLgotCi1UdWUgSnVsIDIxIDEzOjQxOjA3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5oLG0zMnItb3BjLmMsbTMyci1hc20uYyxtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCi1Nb24gSnVsIDEzIDE0OjUzOjU5IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAoY2twcmVmaXgpOiBIYW5kbGUgZndhaXQgc3BlY2lhbGx5IG9ubHkgd2hlbiBpdCBpc24ndAotCXRoZSBmaXJzdCBwcmVmaXguCi0JKGRvZmxvYXQpOiBDb3JyZWN0IHRlc3QgZm9yIGZuc3Rzdy4gIFByaW50IGBmbnN0c3cgJWF4JyByYXRoZXIKLQl0aGFuIGBmbnN0c3cgJWVheCcuCi0JKE9QX0opOiBSZW1vdmUgdW5uZWNlc3Nhcnkgc3VidHJhY3Rpb24gd2hlbiAxNi1iaXQgZGlzcGxhY2VtZW50Ci0Jd2lsbCBiZSBtYXNrZWQgbGF0ZXIuCi0KLVRodSBKdWwgIDIgMTc6MTE6MjcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmggKENHRU5fTUlOX0lOU05fU0laRSk6IE5ldyAjZGVmaW5lLgotCi1XZWQgSnVsICAxIDE2OjExOjE2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLWFzbS5jLG0zMnItZGlzLmMsbTMyci1vcGMuYyxtMzJyLW9wYy5oOiBSZWdlbmVyYXRlLgotCi1GcmkgSnVuIDI2IDExOjA4OjU1IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbTEwMzAwLWRpcy5jOiBPbmx5IHJlY29nbml6ZSBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgY3VycmVudGx5Ci0Jc2VsZWN0ZWQgbWFjaGluZS4KLQkqIG0xMDMwMC1vcGMuYzogQWRkIGZpZWxkIGluZGljYXRpbmcgdGhlIHBhcnRpY3VsYXIgdmFyaWFudCBvZgotCXRoZSBtbjEwMzAwIGVhY2ggaW5zdHJ1Y3Rpb24gaXMgYXZhaWxhYmxlIG9uLgotCi1GcmkgSnVuIDI2IDEyOjA0OjIxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBGb3IgYmZkX3ZheF9hcmNoLCBidWlsZCB2YXgtZGlzLmxvLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQ0ZJTEVTKTogQWRkIHZheC1kaXMuYy4KLQkoQUxMX01BQ0hJTkVTKTogQWRkIHZheC1kaXMubG8uCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggY3VycmVudCBsaWJ0b29sLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEp1biAyNiAxMjowMzoyMCAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogdmF4LWRpcy5jOiBOZXcgZmlsZSwgZnJvbSB3b3JrIGJ5IFBhdWxpbmUgTWlkZGVsaW5rCi0JPG1pZGRlbGluQHBvbHl3YXJlLmlhZi5ubD4uCi0JKiBkaXNhc3NlbWJsZS5jIChBUkNIX3ZheCk6IERlZmluZSBpZiBBUkNIX2FsbC4KLQkoZGlzYXNzZW1ibGVyKTogQWRkIGNhc2UgZm9yIEFSQ0hfdmF4LgotCSogbWFrZWZpbGUudm1zOiBTdXBwb3J0IGNvbXBpbGF0aW9uIG9uIHZtcy92YXguCi0KLVR1ZSBKdW4gMjMgMTk6NDI6MTggMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBtMTAyMDAtZGlzLmMgKHByaW50X2luc25fbW4xMDIwMCk6IEZpeCB2YXJpb3VzIG5vbi1wb3J0YWJpbGl0aWVzCi0JcmVsYXRlZCB0byBzaWduIGV4dGVuc2lvbiBhbmQgdGhlIHNpemUgb2YgaW50cy4KLQotVHVlIEp1biAyMyAxMDo1OToyNiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG0xMDMwMC1vcGMuYzogU3VwcG9ydCBvbmUgb3BlcmFuZCAiYXNyIiwgImxzciIgYW5kICJhc2wiCi0JaW5zdHJ1Y3Rpb25zLiAgU3VwcG9ydCAoc3ApIGFkZHJlc3NpbmcgbW9kZSBieSBleHBhbmRpbmcgaXQgaW50bwotCSgwLHNwKS4KLQotU2F0IEp1biAyMCAxNDo0NjoyMCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogRml4IGFyZ3VtZW50IGludGVyY2hhbmdlIHR5cG8uCi0KLUZyaSBKdW4gMTkgMDk6MTY6NDIgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBtMTAyMDAtZGlzLmMgKHByaW50X2luc25fbW4xMDIwMCk6IFJlY29nbml6ZSAnYnJlYWsnIHBzZXVkby1vcC4KLQotMTk5OC0wNi0xOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmM6IEFkZCBzdXBwb3J0IGZvciBmeHNhdmUsIGZ4cnN0b3IsIHN5c2VudGVyIGFuZAotCXN5c2V4aXQuCi0KLVRodSBKdW4gMTggMTA6MjI6MjQgMTk5OCAgSm9obiBNZXR6bGVyICA8am1ldHpsZXJAY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9saXR0bGVfbWlwcyk6IFByZXZpb3VzbHksIGluc3RydWN0aW9uCi0gCXByaW50aW5nIHJlZmVyZW5jZXMgdGhlIHN5bWJvbCB0YWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUKLSAJaW5zdHJ1Y3Rpb24gcmVzaWRlcyBpbiBhIGJsb2NrIHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zIG9yIG1pcHMxNgotIAlpbnN0cnVjdGlvbnMuIEhvd2V2ZXIsIHdoZW4gdGhlIGRpc2Fzc2VtYmxlciBnZXRzIHVzZWQgaW4gb3RoZXIKLSAJZW52aXJvbm1lbnRzIHdoZXJlIHRoZSBzeW1ib2wgdGFibGUgaXMgbm90IHByZXNlbnQsIHdlIG5vIGxvbmdlcgotIAlyZWx5IGluIHRoZSBzeW1ib2wgdGFibGUsIHJhdGhlciwgdXNlIHRoZSBsb3cgYml0IG9mIHRoZQotIAlpbnN0cnVjdGlvbnMgYWRkcmVzcyB0byBndWVzcy4gVGhlcmUgc2hvdWxkIGJlIG5vIGNoYW5nZSBmb3IgdXNhZ2UKLSAJb2YgdGhlIGRpc2Fzc2VtYmxlciBpbiBob3N0IGJhc2VkIHByb2dyYW1zLCBnZGIsIG9iamR1bXAuCi0JKHByaW50X2luc25fYmlnX21pcHMpOiBkaXR0by4KLQkocHJpbnRfaW5zbl9taXBzKTogZGl0dG8KLQotV2VkIEp1biAxNyAyMToxOTowMSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIG0xMDIwMC1kaXMuYyAocHJpbnRfaW5zbl9tbjEwMjAwKTogRG9uJ3QgYm9tYiBvbiB1bmtub3duIG9wY29kZXMuCi0KLVdlZCBKdW4gMTcgMTc6NDk6MjMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IENoYW5nZSBvcGNvZGUgZm9yICJzeXNjYWxsIi4KLQotVHVlIEp1biAxNiAxMzoxMDo1MSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmMgKGluZGV4MTYpOiBBZGQgJyUnIHRvIHJlZ2lzdGVyIG5hbWVzLiAgVXNlICcsJwotCWluc3RlYWQgb2YgJysnLgotCi1TYXQgSnVuIDEzIDExOjMzOjU1IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYzogRG9uJ3QgcHJpbnQgb3Bjb2RlIHN1ZmZpeCB3aGVuIHdlIGNhbiBmaWd1cmUgb3V0IHRoZQotCXNpemUgKGFuZCBnYXMgY2FuISkgYnkgcmVnaXN0ZXIgb3BlcmFuZHMsIG9yIGZyb20gdGhlIGRlZmF1bHQKLQlzaXplLgotCShwdXRvcCk6IEhhbmRsZSAnQScsICdCJywgJ0wnLCAnUCcsICdRJywgJ1InIG1hY3Jvcy4gIFJlbmFtZSAnQycKLQltYWNybyB0byAnRScuCi0JKGRpczM4NiwgZGlzMzg2X3R3b2J5dGUsIGdycHMpOiBVc2UgbmV3IHN1ZmZpeCBtYWNyb3MuCi0JKGRpczM4Nik6IENvcnJlY3QgaW11bCBJYiB0byBpbXVsIHNJYi4gIENoYW5nZSBqbmwgdG8gamdlIHRvIGJlCi0JY29uc2lzdGVudC4gIEFkZCBzdWZmaXggZm9yIGNhbGwsIGptcCwgbGNhbGwsIGxqbXAsIGlyZXQuICBSZXZlcnNlCi0Jb3JkZXIgb2YgY21wcyBvcGVyYW5kcyB0byBhZ3JlZSB3aXRoIEludGVsIGRvY3MuICBDb3JyZWN0IG9wZXJhbmQKLQlvZiBhYWQgYW5kIGFhbSAoSWIgLT4gc0liKS4gIENoYW5nZSB1ZDJiIGZyb20gMGZiOCB0byAwZmI5IHRvCi0JYWdyZWUgd2l0aCBJbnRlbCBkb2NzLgotCShwcmludF9pbnNuX3g4Nik6IFByaW50IG9ycGhhbiBmd2FpdCBiZWZvcmUgb3RoZXIgcHJlZml4ZXMuCi0JUmV0dXJuIGNvcnJlY3QgYnl0ZSBjb3VudCBmb3Igb3JwaGFuIGZ3YWl0IHdpdGggcHJlZml4ZXMuICBEb24ndAotCXByaW50IGBib3VuZCcgb3BlcmFuZHMgaW4gcmV2ZXJzZSBvcmRlci4KLQkoY2twcmVmaXgpOiBTdG9wIGFjY3VtdWxhdGluZyBwcmVmaXhlcyBpZiB3ZSBnZXQgZndhaXQuCi0JKE9QX0RJUik6IFByaW50IGAkJyBiZWZvcmUgQXAgb3BlcmFuZHMgb2YgbGptcCwgbGNhbGwuCi0KLUZyaSBKdW4gMTIgMTM6NDA6MzggMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChhbGwteWVzKTogSWYgbWFpbnRhaW5lciBtb2RlLCBkZXBlbmQgb24gLnBvdCBmaWxlLgotCSgkKFBBQ0tBR0UpLnBvdCk6IFVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gUE9URklMRVMuCi0KLUZyaSBKdW4gMTIgMTE6MDQ6MDYgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQlGaXggcHJvYmxlbXMgd2hlbiBiZmRfdm1hIGlzIHdpZGVyIHRoYW4gbG9uZy4KLQkqIGkzODYtZGlzLmM6IE1ha2Ugb3BfYWRkcmVzcyBhbmQgc3RhcnRfcGMgdW5zaWduZWQuCi0JKHNldF9vcCk6IE1ha2UgcGFyYW1ldGVyIHVuc2lnbmVkLgotCShwcmludF9pbnNuX3g4Nik6IENhc3QgdG8gYmZkX3ZtYSB3aGVuIHBhc3NpbmcgYSB2YWx1ZSB0bwotCXByaW50X2FkZHJlc3NfZnVuYy4KLQkqIG5zMzJrLWRpcy5jIChDT1JFX0FERFIpOiBEb24ndCBkZWZpbmUuCi0gCShwcmludF9pbnNuX25zMzJrKTogQ2hhbmdlIHR5cGUgb2YgYWRkciB0byBiZmRfdm1hLiAgVXNlCi0JYmZkX3NjYW5fdm1hIHRvIHJlYWQgYmFjayBhZGRyZXNzLgotCShwcmludF9pbnNuX2FyZyk6IENoYW5nZSB0eXBlIG9mIGFkZHIgdG8gYmZkX3ZtYS4gIFVzZSBzcHJpbnRmX3ZtYQotCXRvIGZvcm1hdCBpdC4KLQkqIG02OGstZGlzLmMgKENPRVJDRTMyKTogQ2FzdCB0byBiZmRfc2lnbmVkX3ZtYSB0byBhdm9pZCBvdmVyZmxvdy4KLQkoTkVYVFVMT05HKTogTmV3IGRlZmluaXRpb24uCi0JKHByaW50X2luc25fbTY4ayk6IEF2b2lkIG92ZXJmbG93IHdoZW4gY29tcHV0aW5nIHRoaXJkIGFyZ3VtZW50IG9mCi0JcHJpbnRfaW5zbl9hcmcuCi0JKHByaW50X2luc25fYXJnKTogVXNlIE5FWFRVTE9ORyB0byBmZXRjaCAzMiBiaXQgYWRkcmVzcyB2YWx1ZXMuCi0JVXNlIGRpc3AgaW5zdGVhZCBvZiB2YWwgdG8gc3RvcmUgb2Zmc2V0IHZhbHVlcy4KLQkocHJpbnRfaW5kZXhlZCk6IFVzZSBiYXNlX2Rpc3AgaW5zdGVhZCBvZiB3b3JkIHRvIHN0b3JlIGJhc2UKLQlkaXNwbGFjZW1lbnQsIHRvIGF2b2lkIG92ZXJmbG93LgotCSogbTEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IENhc3QgdmFsdWUgdG8gbG9uZyB3aGVuIGNvbXB1dGluZwotCXBjLXJlbGF0aXZlIGFkZHJlc3MsIHRvIGdldCBjb3JyZWN0IHNpZ24gZXh0ZW5zaW9uLgotCi1XZWQgSnVuIDEwIDE1OjU4OjM3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLVR1ZSBKdW4gIDkgMTQ6Mjc6NTcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLW9wYy5oICh0aHVtYl9vcGNvZGVzKTogRGlzcGxheSAnYWRkIHJ4LCByWSwgIzAnIGluc25zIGFzCi0JJ21vdiByWCwgclknLiAgUGF0Y2ggY291cnRlc3kgb2YgVG9ueSBUaG9tcHNvbiA8VG9ueS5UaG9tcHNvbkBhcm0uY29tPgotCi1Nb24gSnVuICA4IDE4OjE3OjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmM6IFJlbW92ZSBGQUxHX01VTDMyIGF0dHJpYnl0ZSBmcm9tIE1VTFgySCBpbnNuLgotCi1GcmkgSnVuICA1IDIzOjQ3OjU1IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYzogIENvbWJpbmUgYWZsYWcgYW5kIGRmbGFnIGludG8gc2l6ZWZsYWcuICBDaGFuZ2UgT1BfKgotCWZ1bmN0aW9ucyB0byB2b2lkLgotCShPUF9EU3JlZyk6IFJlbmFtZSBmcm9tIE9QX0RTU0kuCi0JKE9QX0VTcmVnKTogUmVuYW1lIGZyb20gT1BfRVNESS4KLQkoWGIsIFh2LCBZYiwgWXYpOiBVc2UgaW5kZXggcmVnIGNvZGUsIG5vdCBiX21vZGUgb3Igdl9tb2RlLgotCShEU0JYKTogRGVmaW5lLgotCShhcHBlbmRfc2VnKTogUmVuYW1lIGZyb20gYXBwZW5kX3ByZWZpeC4KLQkocHRyX3JlZyk6IE5ldyBmdW5jdGlvbi4KLQkoZGlzMzg2KTogQWRkIFMgc3VmZml4IHRvIHB1c2hmLCBwb3BmLCByZXQsIGxyZXQsIGVudGVyLCBsZWF2ZS4KLQlBZGQgRFNCWCBmb3IgeGxhdC4KLQkoUFJFRklYX0FERFIpOiBSZW5hbWUgZnJvbSBQUkVGSVhfQURSLgotCShmbG9hdF9yZWcpOiBBZGQgbm9uLWJyb2tlbiBvcGNvZGVzIGZvciBwZW9wbGUgd2hvIGRvbid0IHdhbnQKLQlVTklYV0FSRV9DT01QQVQuCi0KLUZyaSBKdW4gIDUgMTk6MTU6MDQgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstb3BjLmMgKHRzdGIsIHRzdHcsIHRzdGwpOiBEb24ndCBhbGxvdyBwY3JlbCBvbgotCTY4MDAwLzY4MDA4LzY4MDEwLgotCi1XZWQgSnVuICAzIDE4OjU2OjIyIDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogaTM4Ni1kaXMuYyAoZGlzMzg2KTogQ2hhbmdlIDB4NjAgdG8gInB1c2hhUyIsIDB4NjEgdG8gInBvcGFTIi4KLQotVHVlIEp1biAgMiAxNTowNjo0NiAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfbWFjcm9zKTogU3VwcG9ydCBzaGlmdHMgYW5kIHJvdGF0ZXMgb2Ygc2l6ZQotCTA7IHByb2R1Y2UgZXJyb3IgbWVzc2FnZSBmb3Igc2hpZnRzIG9mIHNpemUgMzIgKG9yIDY0IGZvciA2NC1iaXQKLQlzaGlmdHMpLCBiZWNhdXNlIHRoZSBoYXJkd2FyZSBkb2Vzbid0IHN1cHBvcnQgdGhlbS4KLQotV2VkIE1heSAyNyAxNToyOToxMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jOiBBZGQgbmV3IG9wZXJhbmQ6IFJhMy4gIENoYW5nZSBTSE9SVF9CMywgU0hPUlRfQjNiLAotCUxPTkdfMiwgTE9OR18yYiBmb3JtYXRzIHRvIHVzZSB0aGlzIG5ldyBvcGVyYW5kLgotCi1UdWUgTWF5IDI2IDIwOjQ3OjQ4IDE5OTggIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAoY29tcHV0ZV9hcmNoX21hc2spOiBBZGRlZCBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUuCi0KLVR1ZSBNYXkgMjYgMjA6NDU6MzMgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IGJpZyBlbmRpYW4gaW5zdHJ1Y3Rpb24gLyBsaXR0bGUKLQllbmRpYW4gZGF0YSBzdXBwb3J0LgotCi1UdWUgTWF5IDI2IDE2OjE0OjM5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKGQzMHZfZm9ybWF0X3RhYmxlKTogQ2hhbmdlIGRlZmluaXRpb24gb2YgU0hPUlRfQjMKLQlhbmQgU0hPUlRfQjNiIGZvcm1hdHMgdG8gdXNlIFJiIGluc3RlYWQgb2YgUmEuCi0KLQlBZGQgRkxBR19NVUwxNiB0byBNVUwyWEggb3Bjb2RlLgotCi0JQWRkIEZMQUdfQUREU1VCcHBwIHRvIFNSQyBhbmQgU0FUSHAgb3Bjb2RlcyB0byBpbXBsZW1lbnQgZXh0ZW5zaW9uCi0JdG8gZXhpc3RpbmcgMS4xLjEgcGFyYWxsZWxpc2F0aW9uIHByb2hpYml0aW9uIHByb2NlZHVyZS4KLQotRnJpIE1heSAyMiAxNjowMDowMCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLWFzbS5jLG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLVR1ZSBNYXkgMTkgMTc6MzY6MDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9taXBzMTZfaW5zbl9hcmcpOiBIYW5kbGUgdHlwZSAnXScgY29ycmVjdGx5Ci0Jd2l0aCBhIHNoaWZ0IGNvdW50IG9mIDAuCi0KLUZyaSBNYXkgMTUgMTQ6NTg6MzEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tb3BjLmMgKGNnZW5faHdfbG9va3VwX2J5X25hbWUpOiBSZW5hbWVkIGZyb20gY2dlbl9od19sb29rdXAuCi0JKGNnZW5faHdfbG9va3VwX2J5X251bSk6IE5ldyBmdW5jdGlvbi4KLQotV2VkIE1heSAxMyAxNzowMzo1OSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLWFzbS5jOiBSZWdlbmVyYXRlIChoYW5kbGUgdXBwZXJjYXNlIEhJR0gvU0hJR0gvTE9XL1NEQSkuCi0KLVdlZCBNYXkgMTMgMTQ6MzQ6MzEgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IEFsd2F5cyBmZXRjaCBpbnN0cnVjdGlvbnMKLQlhcyBiaWctZW5kaWFuIG9uIFNQQVJDbGl0ZS4KLQotVHVlIE1heSAxMiAxMTo0NjozMSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChwcmVfZGVmaW5lZF9yZWdpc3Rlcik6IFJlbW92ZSBhbGlhcyBmb3IgcjAuCi0KLVN1biBNYXkgMTAgMjI6Mzc6MjIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBwby9NYWtlLWluIChpbnN0YWxsLWluZm8pOiBOZXcgdGFyZ2V0LgotCi1UaHUgTWF5ICA3IDE3OjE1OjU5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChXSU4zMkxJQkFERCk6IEFkZCAtbGludGwgb24gY3lnd2luMzIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBNYXkgIDcgMTI6NDk6NDYgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAodGVxLHRnZSx0Z2V1LHRsdCx0bHR1LHRuZSk6IEFkZGVkIHRocmVlLW9wZXJhbmQKLSAJdmFyaWV0eSBvZiBJU0EyIGluc3RydWN0aW9ucyB0byBzZXQgYm90dG9tIHRlbiBiaXRzIG9mIHRyYXAgY29kZS4KLQotVGh1IE1heSAgNyAxMTo1NDoyNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjb25maWcuc3RhdHVzKTogQWRkIGV4cGxpY2l0IHRhcmdldCBzbyB0aGF0Ci0JY29uZmlnLnN0YXR1cyBkZXBlbmRzIHVwb24gYmZkL2NvbmZpZ3VyZS5pbi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UaHUgTWF5ICA3IDA5OjMzOjAyIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKGJyZWFrLCBzZGJicCk6IEFkZGVkIHR3by1vcGVyYW5kIHZhcmlldHkgb2YgSVNBMQotCWluc3RydWN0aW9ucyB0byBzZXQgYm90dG9tIHRlbiBiaXRzIG9mIGJyZWFrIGNvZGUuCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEltcGxlbWVudCAncScgb3BlcmFuZCBmb3JtYXQgdXNlZAotCWZvciBhYm92ZSBvcHRpb25hbCBhcmd1bWVudC4KLQotV2VkIE1heSAgNiAxNTozMDowNiAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBSdW4gZGVjIGMgd2l0aCAvbm9kZWJ1Zy4KLQotTW9uIE1heSAgNCAxMDoxOTo1NyAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgotCSogTWFrZWZpbGUuYW06IFJlZ2VuZXJhdGVkIGRlcGVuZGVuY2llcyB3aXRoIG1rZGVwLgotCi0JKiBvcGludGwuaCAoXyk6IERlZmluZSBhcyBkZ2V0dGV4dC4KLQotVHVlIEFwciAyOCAxNDoxMjoxMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjZ2VuLWFzbS5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG0zMnItYXNtLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbTMyci1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBtMzJyLW9wYy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQotCSogYWNsb2NhbC5tNDogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogTWFrZWZpbGUuYW0gKFBPVEZJTEVTKTogUmVtb3ZlIGluY2x1c2lvbiBvZiBCRkRfSC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogcG8vUE9URklMRVMuaW46IFJlYnVpbHQgdXNpbmcgcnVsZSBpbiBNYWtlZmlsZS5pbi4KLQkqIHBvL29wY29kZXMucG90OiBSZWJ1aWx0IGFmdGVyIGNoYW5naW5nIFBPVEZJTEVTLmluLgotCi1UdWUgQXByIDI4IDEzOjEzOjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0lTQ19QT1NJWCBuZWFyIHN0YXJ0LiAgTW92ZSBDWV9HTlVfR0VUVEVYVAotCWFmdGVyIEFDX1BST0dfQ0MuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBjdXJyZW50IHRvb2xzLgotCi1Nb24gQXByIDI3IDE0OjMxOjAwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9waW50bC5oOiBOZXcgZmlsZSAtIGNvbnRhaW5zIGludGVybmF0aW9uYWxpc2F0aW9uIG1hY3JvcyB1c2VkCi0JYnkgc291cmNlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5LgotCSogcG8vOiBOZXcgc3ViZGlyZWN0b3J5IC0gY29udGFpbnMgaW50ZXJuYXRpb25hbGlzYXRpb24gZmlsZXMuCi0JKiBwby9NYWtlLWluOiBOZXcgZmlsZSAtIE1ha2VmaWxlIGNvbnN0cnVjdG9yLgotCSogcG8vUE9URklMRVMuaW46IE5ldyBmaWxlIC0gbGlzdCBvZiBmaWxlcyBpbiBvcGNvZGVzIGRpcmVjdG9yeQotCXRoYXQgc2hvdWxkIGJlIHNjYW4gZm9yIGludGVybmF0aW9uYWxpc2F0aW9uIG1hY3Jvcy4KLQkqIHBvL29wY29kZXMucG90OiBOZXcgZmlsZSAtIGxpc3Qgb2YgaW50ZXJuYXRpb25pc2F0aW9uIHN0cmluZ3MKLQlmb3VuZCBpbiBmaWxlcyBtZW50aW9uZWQgaW4gcG8vUE9URklMRVMuaW4uCi0JKiBNYWtlZmlsZS5hbTogQWRkIHJ1bGUgdG8gYnVpbGQgcG8vUE9URklMRVMuaW4uICBBZGQgU1VCRElSUwotCWVudHJ5LiAgQWRkIGludGwgZGlyZWN0b3J5IHRvIGluY2x1ZGUgcGF0aHMuCi0JKiBhY2NvbmZpZy5oOiBBZGQgRU5BQkxFX05MUywgSEFWRV9DQVRHRVRTLCBIQVZFX0dFVEVYVCwKLQlIQVZFX1NUUkNQWSwgSEFWRV9MQ19NRVNTQUdFUwotCSogY29uZmlndXJlLmluOiBBZGQgcnVsZSB0byBidWlsZCBNYWtlZmlsZSBpbiBwbyBzdWJkaXJlY3RvcnkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbHQuCi0JKiBjb25maWcuaW46IFJlYnVpbHQuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0JKiBhbHBoYS1vcGMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBhcmMtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogYXJjLW9wYy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGFybS1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBjZ2VuLWFzbS5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGQzMHYtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogZGlzLWJ1Zi5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGg4MzAwLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGg4NTAwLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGkzODYtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbTEwMjAwLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG0xMDMwMC1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBtNjhrLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG04OGstZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbWlwcy1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBuczMyay1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBvcGludGwuaDogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBwcGMtb3BjLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogc3BhcmMtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogdjg1MC1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiB2ODUwLW9wYy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQotTW9uIEFwciAyNyAxMDozMzo1NiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1hc20uYyAoY2dlbl9jdXJyZW50X29wY29kZV90YWJsZSk6IFJlbmFtZWQgZnJvbSAuLi5fZGF0YS4KLQkoYXNtX2hhc2hfdGFibGVfZW50cmllcyk6IE5ldyB2YXJpYWJsZS4KLQkoY2dlbl9hc21faW5pdCk6IEZyZWUgYXNtX2hhc2hfdGFibGVfZW50cmllcy4KLQkoaGFzaF9pbnNuX2FycmF5LGhhc2hfaW5zbl9saXN0KTogTmV3IGZ1bmN0aW9ucy4KLQkoYnVpbGRfYXNtX2hhc2hfdGFibGUpOiBVc2UgdGhlbS4gIEhhc2ggbWFjcm8gaW5zbnMgYXMgd2VsbC4KLQkoY2dlbl9hc21fbG9va3VwX2luc24pOiBVcGRhdGUuCi0JKiBjZ2VuX2Rpcy5jIChjZ2VuX2N1cnJlbnRfb3Bjb2RlX3RhYmxlKTogUmVuYW1lZCBmcm9tIC4uLl9kYXRhLgotCShkaXNfaGFzaF90YWJsZV9lbnRyaWVzKTogTmV3IHZhcmlhYmxlLgotCShjZ2VuX2Rpc19pbml0KTogRnJlZSBkaXNfaGFzaF90YWJsZV9lbnRyaWVzLgotCShoYXNoX2luc25fYXJyYXksaGFzaF9pbnNuX2xpc3QpOiBOZXcgZnVuY3Rpb25zLgotCShidWlsZF9kaXNfaGFzaF90YWJsZSk6IFVzZSB0aGVtLiAgSGFzaCBtYWNybyBpbnNucyBhcyB3ZWxsLgotCShjZ2VuX2Rpc19sb29rdXBfaW5zbik6IFVwZGF0ZS4KLQkqIGNnZW4tb3BjLmMgKGNnZW5fY3VycmVudF9vcGNvZGVfdGFibGUpOiBSZW5hbWVkIGZyb20gLi4uX2RhdGEuCi0JKGNnZW5fc2V0X2NwdSxjZ2VuX2h3X2xvb2t1cCxjZ2VuX2luc25fY291bnQpOiBVcGRhdGUuCi0JKGNnZW5fbWFjcm9faW5zbl9jb3VudCk6IE5ldyBmdW5jdGlvbi4KLQkqIG0zMnItb3BjLmgsbTMyci1vcGMuYyxtMzJyLWFzbS5jLG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLUZyaSBBcHIgMjQgMTY6MDc6NTcgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jIChPUF9EU1NJKTogUHJpbnQgc2VnbWVudCBvdmVycmlkZS4KLQotTW9uIEFwciAxMyAxNjo1OTozOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYXJtKTogQWRkICJfYWxsIiBleHRlbnNpb24gdG8gJ0MnCi0Jb3BlcmF0b3IuCi0KLU1vbiBBcHIgMTMgMTY6NTA6MjcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGlib3Bjb2Rlc19sYV9MSUJBREQpOiBBZGQgQFdJTjMyTElCQUREQC4KLQkobGlib3Bjb2Rlc19sYV9MREZMQUdTKTogQWRkIEBXSU4zMkxERkxBR1NALgotCSogY29uZmlndXJlLmluOiBEZWZpbmUgYW5kIHN1YnN0aXR1dGUgV0lOMzJMREZMQUdTIGFuZAotCVdJTjMyTElCQURELgotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEFwciAxMCAxODoxNDozMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1TdW4gQXByICA1IDE2OjA0OjM5IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogTWFrZWZpbGUuYW0gKHN0YW1wLWxpYik6IENoZWNrIHRoYXQgLmxpYnMvbGlib3Bjb2Rlcy5hIGV4aXN0cwotCWJlZm9yZSB0cnlpbmcgdG8gY29weSBpdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UaHUgQXByICAyIDE3OjI1OjQ5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmM6IFVzZSBzaWduZWQgaW1tZWRpYXRlIHZhbHVlcyBmb3IgQ01QVUkgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBBcHIgIDEgMTY6MjA6MjcgMTk5OCAgSWFuIERhbGwgIDxJYW4uRGFsbEBkc3RvLmRlZmVuY2UuZ292LmF1PgotCi0gICAgICAgICogbnMzMmstZGlzLmMgKGJpdF9leHRyYWN0X3NpbXBsZSk6IE5ldyBmdW5jdGlvbiB0byBleHRyYWN0IGJpdHMKLSAgICAgICAgZnJvbSBhbiBhcmJpdHJhcnkgdmFsaWQgYnVmZmVyIGluc3RlYWQgb2YgZmV0Y2hpbmcgdGhlbSBvbiBkZW1hbmQKLSAgICAgICAgdXNpbmcgZmV0Y2hfZGF0YSgpLgotICAgICAgICAoaW52YWxpZF9mbG9hdCk6IHVzZSBiaXRfZXh0cmFjdF9zaW1wbGUoKSBpbnN0ZWFkIG9mIGJpdF9leHRyYWN0KCkuCi0KLVR1ZSBNYXIgMzEgMTE6MDk6MDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBILkouIEx1IDxoamxAZ251Lm9yZz46Ci0JKiBpMzg2LWRpcy5jIChkaXMzODYpOiBDaGFuZ2UgMHg4YyBhbmQgMHg4ZSB0byBtb3ZTLCBhbmQgY2hhbmdlIEV3Ci0JdG8gRXYgZm9yIGJvdGguCi0KLU1vbiBNYXIgMzAgMTc6MzI6MDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjkuCi0KLU1vbiBNYXIgMzAgMTU6MTg6MDAgMTk5OCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtZGlzLmMgKHByaW50X2luc25fZDMwdik6IERvbid0IHVzZSB1bmluaXRpYWxpemVkICJudW0iIHdoZW4KLQlkaXNhc3NlbWJsaW5nIGxhc3QgNCBieXRlcyBvZiBhIHNlY3Rpb24uCi0KLUZyaSBNYXIgMjcgMTg6MDg6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRml4IHNvbWUgZ2NjIC1XYWxsIHdhcm5pbmdzOgotCSogYXJjLWRpcy5jIChwcmludF9pbnNuKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogY2dlbi1vcGMuYyAoY2dlbl9rZXl3b3JkX2xvb2t1cF9uYW1lKTogTGlrZXdpc2UuCi0JKiBkMTB2LWRpcy5jIChkaXNfbG9uZywgZGlzXzJfc2hvcnQpOiBMaWtld2lzZS4KLQkqIG0xMDIwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBMaWtld2lzZS4KLQkqIG0xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBMaWtld2lzZS4KLQkqIG5zMzJrLWRpcy5jIChwcmludF9pbnNuX25zMzJrKTogTGlrZXdpc2UuCi0JKiBwcGMtb3BjLmMgKGluc2VydF9yYWwsIGluc2VydF9yYW0pOiBMaWtld2lzZS4KLQkqIGNnZW4tZGlzLmMgKGJ1aWxkX2Rpc19oYXNoX3RhYmxlKTogUmVtb3ZlIHVzZWQgbG9jYWwgdmFyaWFibGVzLgotCSogY2dlbi1vcGMuYyAoY2dlbl9rZXl3b3JkX3NlYXJjaF9uZXh0KTogTGlrZXdpc2UuCi0JKiBkMTB2LWRpcy5jIChkaXNfbG9uZywgZGlzXzJfc2hvcnQpOiBMaWtld2lzZS4KLQkqIGQzMHYtZGlzLmMgKHByaW50X2luc25fZDMwdiwgbG9va3VwX29wY29kZSk6IExpa2V3aXNlLgotCSogbnMzMmstZGlzLmMgKGJpdF9leHRyYWN0LCBwcmludF9pbnNuX25zMzJrKTogTGlrZXdpc2UuCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfb25lX2luc3RydWN0aW9uKTogTGlrZXdpc2UuCi0JKiB3NjUtZGlzLmMgKHByaW50X29wZXJhbmQpOiBMaWtld2lzZS4KLQkqIHo4ay1kaXMuYyAoZmV0Y2hfZGF0YSk6IExpa2V3aXNlLgotCSogYTI5ay1kaXMuYzogQWRkIHJldHVybiB0eXBlIGZvciBmaW5kX2J5dGVfZnVuY190eXBlLgotCSogYXJjLW9wYy5jOiBJbmNsdWRlIDxzdGRpby5oPi4gIFJlbW92ZSBkZWNsYXJhdGlvbnMgb2YKLQlpbnNlcnRfbXVsdHNoaWZ0IGFuZCBleHRyYWN0X211bHRzaGlmdC4KLQkqIGQzMHYtZGlzLmMgKGxvb2t1cF9vcGNvZGUpOiBQYXJlbnRoZXNpemUgYXNzaWdubWVudHMgaW4KLQljb25kaXRpb25hbHMuCi0JKGV4dHJhY3RfdmFsdWUpOiBGdWxseSBwYXJlbnRoZXNpemUgZXhwcmVzc2lvbi4KLQkqIGg4NTAwLWRpcy5jIChwcmludF9pbnNuX2g4NTAwKTogSW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZXMuCi0JKiBoODUwMC1vcGMuaCAoaDg1MDBfdGFibGUpOiBGdWxseSBicmFja2V0IGluaXRpYWxpemVyLgotCSogdzY1LW9wYy5oIChvcHRhYmxlKTogTGlrZXdpc2UuCi0JKiBpMzg2LWRpcy5jIChwcmludF9pbnNuX3g4Nik6IERlY2xhcmUgYWZsYWcgYW5kIGZsYWcgcGFyYW1ldGVycy4KLQkqIGkzODYtZGlzLmMgKE9QX0UpOiBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlcy4KLQkqIG0xMDIwMC1kaXMuYyAocHJpbnRfaW5zbl9tbjEwMjAwKTogTGlrZXdpc2UuCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX21pcHMxNik6IExpa2V3aXNlLgotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogTGlrZXdpc2UuCi0JKiB2ODUwLWRpcy5jIChwcmludF9pbnNuX3Y4NTApOiBMaWtld2lzZS4KLQkqIG5zMzJrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IERlY2xhcmUuCi0JKGdldF9kaXNwbGFjZW1lbnQsIGludmFsaWRfZmxvYXQpOiBEZWNsYXJlLgotCShsaXN0X3NlYXJjaCwgc2lnbl9leHRlbmQsIGZsaXBfYnl0ZXMpOiBEZWNsYXJlIHJldHVybiB0eXBlLgotCShnZXRfZGlzcGxhY2VtZW50KTogTGlrZXdpc2UuCi0JKHByaW50X2luc25fYXJnKTogTGlrZXdpc2UuICBNYWtlIGQgaW50LiAgRml4IHNwcmludGYgZm9ybWF0Ci0Jc3RyaW5nLgotCShwcmludF9pbnNuX25zMzJrKTogTWFrZSBpIHVuc2lnbmVkLgotCShpbnZhbGlkX2Zsb2F0KTogTWFrZSBzdGF0aWMuICBEZWNsYXJlIHR5cGUgb2YgdmFsLgotCSogdGljMzAtZGlzLmMgKHByaW50X3Bhcl9pbnNuKTogTWFrZSBpIHNpemVfdC4gIERvbid0IGNoZWNrIHN0cmxlbgotCW9uIGVhY2ggZm9yIGl0ZXJhdGlvbi4KLQkqIHRpYzMwLWRpcy5jIChnZXRfaW5kaXJlY3Rfb3BlcmFuZCk6IExpa2V3aXNlLgotCSogejhrLWRpcy5jIChwcmludF9pbnNuX3o4MDAxKTogRGVjbGFyZSByZXR1cm4gdHlwZS4KLQkocHJpbnRfaW5zbl96ODAwMik6IExpa2V3aXNlLgotCSh1bnBhcnNlX2luc3RyKTogRml4IHNwcmludGYgZm9ybWF0IHN0cmluZ3MuCi0KLUZyaSBNYXIgMjcgMDA6MDU6MjMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBBZGQgInN5bmMubCIgYW5kICJzeW5jLnAiLgotCi1XZWQgTWFyIDI1IDE0OjMyOjQ4IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX202OGspOiBVc2UgaW5mby0+bWFjaCB0byBzZWxlY3QgdGhlCi0JZGVmYXVsdCBtNjhrIHZhcmlhbnQgdG8gcmVjb2duaXplLgotCi0JKiBpOTYwLWRpcy5jIChwaW5zbik6IENoYW5nZSB0eXBlIG9mIGZpcnN0IGFyZ3VtZW50IHRvIGJmZF92bWEuCi0JKGN0cmwsIGNvYnIsIG1lbSwgZWEpOiBMaWtld2lzZS4KLQkocHJpbnRfYWRkcik6IExpa2V3aXNlLiAgUmVtb3ZlIGNhc3QuCi0JKGVhKTogQ2FzdCBhcmd1bWVudCBvZiBwcmludF9hZGRyIHRvIGJmZF92bWEuCi0KLQkqIGNnZW4tYXNtLmMgKGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIpOiBGaXggdHlwZSBvZiBsb2NhbAotCXZhcmlhYmxlIHZhbHVlLgotCShjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIpOiBMaWtld2lzZS4KLQkoY2dlbl9wYXJzZV9hZGRyZXNzKTogTGlrZXdpc2UuCi0KLVdlZCBNYXIgMjUgMTQ6MzE6MzEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpOTYwLWRpcy5jIChjdHJsKTogQWRkIGZ1bGwgYnJhY2VzIHRvIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbi4KLQkoY29iciwgbWVtLCByZWcpOiBMaWtld2lzZS4KLQkoZWEpOiBDb3JyZWN0IHBhcmVudGhlc2l6YXRpb24gaW4gZXhwcmVzc2lvbi4KLQotCSogY2dlbi1hc20uYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKGJ1aWxkX2FzbV9oYXNoX3RhYmxlKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBpLgotCShjZ2VuX3BhcnNlX2tleXdvcmQpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9iaWdfYXJtKTogT25seSBjYWxsIGNvZmZzeW1ib2wgZm9yIGEgQ09GRgotCXN5bWJvbC4gIEZpeCBpbmRlbnRhdGlvbi4KLQkocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogTGlrZXdpc2UuCi0KLUZyaSBNYXIgMjAgMTg6NTU6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBBTV9ESVNBQkxFX1NIQVJFRC4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGxpYnRvb2wgMS4yLgotCi1UaHUgTWFyIDE5IDE1OjQ2OjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQlUaGVzZSBwYXRjaGVzIGFyZSBjb3VydGVzeSBvZiBKb25hdGhhbiBXYWx0b24gYW5kIFRvbnkgVGhvbXBzb24KLQkoYXRob21wc29AY2FtYnJpZGdlLmFybS5jb20pLgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fdGh1bWIpOiBJZ25vcmUgYm90dG9tIHR3byBiaXRzIG9mIFBDCi0JcmVsYXRpdmUgYWRkcmVzc2VzLgotCi0JKiBhcm0tb3BjLmggKHRodW1iX29wY29kZXMpOiBBbm5vdGF0ZSBQQyByZWxhdGl2ZSBhZGRyZXNzZXMgd2l0aAotCWJvdGggdGhlIG9mZnNldCBhbmQgdGhlIGxhYmVsIGNsb3Nlc3QgdG8gdGhlIGRlc3RpbmF0aW9uLgotCi1TYXQgTWFyIDE0IDIzOjQ3OjE0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5oOiBSZWdlbmVyYXRlLgotCi1XZWQgTWFyICA0IDEyOjA4OjE0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmgsbTMyci1vcGMuYyxtMzJyLWFzbS5jLG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLVNhdCBGZWIgMjggMTY6MDI6MzQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2JpZ19hcm0sIHByaW50X2luc25fbGl0dGxlX2FybSk6IERvIG5vdAotCWFzc3VtZSB0aGF0IGluZm8tPnN5bWJvbHMgaXMgbm9uLWVtcHR5LgotCi1TYXQgRmViIDI4IDEyOjE5OjA1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLW9wYy5jIChjdnRxcykgVGhlcmUgaXMgbm8gc3VjaCB0aGluZy4KLQkoY3Z0dHEpOiBNaXNzaW5nIG1vc3Qgb2YgdGhlIC8qZCB2YXJpYW50cy4KLQotVGh1IEZlYiAyNiAxNTo1MzowOSAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAoZDMwdl9vcGNvZGVfdGFibGUpOiBJbmRpY2F0ZSB3aGljaCBpbnN0cnVjdGlvbnMgYXJlCi0JZGVsYXllZCBicmFuY2hlcyBvciBqdW1wcy4KLQotVHVlIEZlYiAyNCAxMDo0Njo0NCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fe2JpZyxsaXR0bGV9X2FybSk6IGluZm8tPnN5bWJvbCBjaGFuZ2VkCi0JdG8gKmluZm8tPnN5bWJvbHMuCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX3tiaWcsbGl0dGxlfV9taXBzKTogTGlrZXdpc2UuCi0JKiB0aWMzMC1kaXMuYyAocHJpbnRfYnJhbmNoKTogTGlrZXdpc2UuCi0KLVR1ZSBGZWIgMjQgMTE6MDY6MTggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2JpZ19hcm0sIHByaW50X2luc25fbGl0dGxlX2FybSk6IFJlbW92ZQotCXNhdmVkX3N5bWJvbCBjb2RlIGFzIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCi0KLU1vbiBGZWIgMjMgMTM6MTY6MTcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tYXNtLmM6IEluY2x1ZGUgc3ltY2F0LmguCi0JKiBjZ2VuLWRpcy5jLGNnZW4tb3BjLmM6IERpdHRvLgotCSogbTMyci1hc20uYyxtMzJyLWRpcy5jLG0zMnItb3BjLmgsbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotTW9uIEZlYiAyMyAxMDozNDo1OCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogRG8gbm90IHByZWZpeCAnUCcgYXJndW1lbnRzIHdpdGggJyQnLgotCi1UaHUgRmViIDE5IDE2OjUxOjEzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLltjaF06IFJlZ2VuZXJhdGUuCi0KLVR1ZSBGZWIgMTcgMTc6MTQ6NTAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tYXNtLmMgKGNnZW5fcGFyc2Vfe3NpZ25lZCx1bnNpZ25lZH1faW50ZWdlcik6IERlbGV0ZSBtaW4sbWF4Ci0JYXJndW1lbnRzLiAgRG9uJ3QgcGVyZm9ybSB2YWxpZGF0aW9uIGhlcmUuCi0JKiBtMzJyLWFzbS5jLG0zMnItZGlzLmMsbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotRnJpIEZlYiAxMyAxNDoyNjowNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1GcmkgRmViIDEzIDE0OjUzOjAyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggYXV0b21ha2UgMS4yZS4KLQotRnJpIEZlYiAxMyAxMDoyMTowOSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIG0xMDMwMC1kaXMuYyAocHJpbnRfaW5zbl9tbjEwMzAwKTogUmVjb2duaXplIGJyZWFrIGluc3RydWN0aW9uLgotCi1GcmkgRmViIDEzIDEzOjEyOjE0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBHZXQgdGhlIHZlcnNpb24gbnVtYmVyIGZyb20gQkZELgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JRnJvbSBILkouIEx1IDxoamxAZ251Lm9yZz46Ci0JKiBNYWtlZmlsZS5hbSAobGlib3Bjb2Rlc19sYV9MREZMQUdTKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBGZWIgMTMgMDk6NTA6MzIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQkqIG0zMnItb3BjLmg6IFJlZ2VuZXJhdGUuCi0KLVRodSBGZWIgMTIgMTE6MDE6NDAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotVGh1IEZlYiAxMiAwMzo0MTowMCAxOTk4ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JRml4IHJhYyB0byBhY2NlcHQgb25seSBhMDoKLQkqIGQxMHYtb3BjLmMgKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMsIGQxMHZfb3BlcmFuZHMsIGQxMHZfb3Bjb2Rlcyk6Ci0JU3BsaXQgT1BFUkFORF9BQ0MgaW50byBPUEVSQU5EX0FDQzAgYW5kIE9QRVJBTkRfQUNDMS4KLQlJbnRyb2R1Y2UgT1BFUkFORF9HUFIuCi0JKiBkMTB2LWRpcy5jIChwcmludF9vcGVyYW5kKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgMTEgMTg6NTg6MzQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tb3BjLmMgKGNnZW5fc2V0X2NwdSk6IERlbGV0ZSBpbml0IG9mIGh3IGxpc3QgYG5leHQnIGNoYWluLgotCShjZ2VuX2h3X2xvb2t1cCk6IE1ha2UgcmVzdWx0IGNvbnN0LgotCSogbTMyci1vcGMuaCwgbTMyci1vcGMuYywgbTMyci1hc20uYywgbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQotU2F0IEZlYiAgNyAxNTozMDoyNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1UaHUgRmViICA1IDE3OjU2OjEwIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChyZXBlYXR7LGl9IGluc3RydWN0aW9ucyk6IFJlcGVhdC9yZXBlYXRpCi0JaW5zdHJ1Y3Rpb25zIHVzZSBhIFBDIHJlbGF0aXZlIGJyYW5jaCwgbm90IGFic29sdXRlLgotCi1XZWQgRmViICA0IDE5OjE3OjM3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgbGlidG9vbF9lbmFibGVfc2hhcmVkIHJhdGhlciB0aGFuCi0JbGlidG9vbF9zaGFyZWQuICBSZW1vdmUgZGl2ZXJzaW9uIGhhY2suCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLVR1ZSBGZWIgIDMgMTc6MTk6NDAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tb3BjLmMgKGNnZW5fc2V0X2NwdSk6IEluaXRpYWxpemUgaGFyZHdhcmUgdGFibGUuCi0JKiBtMzJyLW9wYy5oLCBtMzJyLW9wYy5jLCBtMzJyLWFzbS5jLCBtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCi1Nb24gRmViICAyIDE5OjIyOjE1IDE5OTggIFN0ZXZlIEhhd29ydGggIDxzdGV2ZUBwbS5jc2Uucm1pdC5FRFUuQVU+Ci0KLQkqIHRpYzMwLWRpcy5jOiBOZXcgZmlsZS4KLQkqIGRpc2Fzc2VtYmxlLmMJKGRpc2Fzc2VtYmxlcik6IEFkZCBiZmRfYXJjaF90aWMzMCBjYXNlLgotCSogY29uZmlndXJlLmluOiBIYW5kbGUgYmZkX3RpYzMwX2FyY2guCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IEFkZCB0aWMzMC1kaXMuYwotCShBTExfTUFDSElORVMpOiBBZGQgdGljMzAtZGlzLmxvLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IEphbiAyOSAxMzowMjo1NiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5oIChIQVZFX0NQVV9NMzJSKTogRGVmaW5lLgotCi1XZWQgSmFuIDI4IDA5OjU1OjAzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKGluc2VydGlvbiByb3V0aW5lcyk6IElmIGJvdGggYWxpZ25tZW50IGFuZCBzaXplIGlzCi0Jd3JvbmcgdGhlbiByZXBvcnQgdGhpcy4KLQotVHVlIEphbiAyNyAyMTo1Mjo1OSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmMgKF9wcmludF9pbnNuX21pcHMpOiBTZXQgdGFyZ2V0X3Byb2Nlc3NvciBhcyBhcHByb3ByaWF0ZS4KLQlPbmx5IHJlY29nbml6ZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBjdXJyZW50IHRhcmdldF9wcm9jZXNzb3IuCi0KLVRodSBKYW4gMjIgMTY6MjA6MTcgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGQxMHYtZGlzLmMgKFBDX01BU0spOiBDb3JyZWN0IHZhbHVlLgotCShwcmludF9vcGVyYW5kKTogSWYgdGhlcmUncyBhIHJlbG9jLCBkb24ndCBjYWxjdWxhdGUgdGhlCi0gCWFkZHJlc3MgYmVjYXVzZSB0aGV5IGNvdWxkIGJlIGluIGRpZmZlcmVudCBzZWN0aW9ucy4KLQotRnJpIEphbiAxNiAxNToyOToxMSAxOTk4ICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKG1pcHNfYnVpbHRpbl9vcGNvZGVzKTogTW92ZSA0MDEwJ3MgImFkZGNpdSIKLSAJaW5zdHJ1Y3Rpb24gYWZ0ZXIgdGhlIDQ2NTAncyAibXVsIiBpbnN0cnVjdGlvbjsgbm9ib2R5J3MgdXNpbmcgdGhlCi0gCTQwMTAgdGhlc2UgZGF5cy4gIElmIG9iamVjdCBmaWxlcyBzb21lZGF5IGluZGljYXRlIHdoaWNoIHByb2Nlc3NvcgotCXZhcmlhbnQgdGhleSdyZSBpbnRlbmRlZCBmb3IsIHdlIGNhbiBkbyBhIGJldHRlciBqb2IgYXQgdGhpcy4KLQotTW9uIEphbiAxMiAxNDo0Mzo1NCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1hc20uYyAoYnVpbGRfYXNtX2hhc2hfdGFibGUpOiBUcmF2ZXJzZSBjb21waWxlZCBpbiB0YWJsZSB1c2luZwotCXRhYmxlIHByb3ZpZGVkIGVudHJ5IHNpemUuICBVc2UgQ0dFTl9JTlNOX01ORU1PTklDLgotCShjZ2VuX3BhcnNlX2tleXdvcmQpOiBSZXdyaXRlLgotCSogY2dlbi1kaXMuYyAoYnVpbGRfZGlzX2hhc2hfdGFibGUpOiBUcmF2ZXJzZSBjb21waWxlZCBpbiB0YWJsZSB1c2luZwotCXRhYmxlIHByb3ZpZGVkIGVudHJ5IHNpemUuICBVc2UgQ0dFTl9JTlNOX01BU0tfQklUU0laRS4KLQkqIGNnZW4tb3BjLmM6IENsZWFuIHVwIHBhc3Mgb3ZlciBgc3RydWN0IGZvbycgdXNhZ2UuCi0JKGNnZW5fa2V5d29yZF9sb29rdXBfdmFsdWUpOiBIYW5kbGUgIiIgZW50cnkuCi0JKGNnZW5fa2V5d29yZF9hZGQpOiBMaWtld2lzZS4KLQotTW9uIERlYyAyMiAxMjozNzowNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCBGUF9EIHRvIHMuZCBpbnN0cnVjdGlvbiBmbGFncy4KLQotV2VkIERlYyAxNyAxMTozODoyOSAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1vcGMuYyAoaGFsdCwgcHVsc2UpOiBFbmFibGUgdGhlbSBvbiB0aGUgNjgwNjAuCi0KLVR1ZSBEZWMgMTYgMTU6MjI6NTMgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGNvZGVzKTogUmV2ZXJ0IGNoYW5nZSB0aGF0IHB1dCB0aGUgMzIgYml0Ci0JUEMgcmVsYXRpdmUgb2Zmc2V0IGZvcm1zIGJlZm9yZSB0aGUgMTUgYml0IGZvcm1zLiAgQW4gYXNzZW1ibGVyIGNvbW1hbmQKLQlsaW5lIG9wdGlvbiBub3cgY2hvb3NlcyB0aGUgZGVmYXVsdC4KLQotVHVlIERlYyAxNiAxNToyMjo1MSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAoZDMwdl9vcGNvZGVfdGFibGUpOiBTZXQgbmV3IGZsYWdzIGJpdHMKLQlGTEFHX3syV09SRCxNVUx7MTYsMzJ9LEFERFNVQnBwcH0sIGluIGFwcHJvcHJpYXRlIGluc3RydWN0aW9ucy4KLQotMTk5Ny0xMi0xNSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IE9ubHkgYnVpbGQgbGlib3Bjb2RlcyBzaGFyZWQgaWYgLS1lbmFibGUtc2hhcmVkJ3MgdmFsdWUKLQl3YXMgYHllcycsIG9yIHdhcyBzZXQgdG8gYCpvcGNvZGVzKicuCi0JKiBhY2xvY2FsLm00OiBMaWtld2lzZS4KLQkqIE5PVEU6IHRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlIGZpeGVkIGluIGxpYnRvb2wvbGlidG9vbC5tNCwgdGhlCi0Jb3JpZ2luYWwgc291cmNlIG9mIHRoaXMgYml0IG9mIGNvZGUuICBJdCdzIG5vdCBjbGVhciB3aGF0IHRoZSBiZXN0IGZpeAotCXdvdWxkIGJlLCB0aG91Z2guCi0KLUZyaSBEZWMgMTIgMTE6NTc6MDQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jIChPRkZfU0xfUEMsIE9GRl9TTF9CUik6IE1pbm9yIGZvcm1hdHRpbmcgY2hhbmdlLgotCSh0aWM4MF9vcGNvZGVzKTogUmVvcmRlciB0YWJsZSBlbnRyaWVzIHRvIHB1dCB0aGUgMzIgYml0IFBDIHJlbGF0aXZlCi0gCW9mZnNldCBmb3JtcyBiZWZvcmUgdGhlIDE1IGJpdCBmb3JtcywgdG8gZGVmYXVsdCB0byB0aGUgbG9uZyBmb3Jtcy4KLQotRnJpIERlYyAxMiAwMTozMjozMCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbHBoYS1vcGMuYyAoY3Z0dHEvKnUqKTogUmVtb3ZlLCBhcyB0aGF0IHN1ZmZpeCBpcyBpbnZhbGlkLgotCi1XZWQgRGVjIDEwIDE3OjQyOjM1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogUHJldmVudCBleGFtaW5hdGlvbiBvZiBzdG9yZWQKLQlzeW1ib2wgaWYgbm9uZSBpcyBwcmVzZW50LgotCShwcmludF9pbnNuX2JpZ19hcm0pOiAgUHJldmVudCBleGFtaW5hdGlvbiBvZiBzdG9yZWQgc3ltYm9sIGlmCi0Jbm9uZSBpcyBwcmVzZW50LgotCi1UaHUgT2N0IDIzIDIxOjEzOjM3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChkMTB2X29wY29kZXMpOiBDb3JyZWN0IGVudHJ5IGZvciBSVEUuCi0KLU1vbiBEZWMgIDggMTE6MjE6MDcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGlzYXNzZW1ibGUuYzogUmVtb3ZlIGRpc2FzbV9zeW1hZGRyKCkgZnVuY3Rpb24uCi0KLQkqIGFybS1kaXMuYzogVXNlIGluZm8tPnN5bWJvbCBpbnN0ZWFkIG9mIGluZm8tPmZsYWdzIHRvIGRldGVybWluZQotCWlmIGRpc2Fzc21ibHkgc2hvdWxkIGJlIGluIFRodW1iIG9yIEFybSBtb2RlLgotCi1UdWUgRGVjICAyIDA5OjU0OjI3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYzogQWRkIHN1cHBvcnQgZm9yIGRpc2Fzc2VtYmxpbmcgVGh1bWIgb3Bjb2Rlcy4KLQkocHJpbnRfaW5zbl90aHVtYik6IE5ldyBmdW5jdGlvbi4KLQotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNtX3N5bWFkZHIpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGFybS1vcGMuaDogRGlzcGxheSBub3AgcHNldWRvIG9wcyBhbG9uZ3NpZGUgZXF1aXZhbGVudCBkaXNhc3NlbWJseS4KLQkodGh1bWJfb3Bjb2Rlcyk6IFRhYmxlIG9mIFRodW1iIG9wY29kZXMuCi0KLU1vbiBEZWMgIDEgMTI6MjU6NTcgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstb3BjLmMgKGJ0c3QpOiBDaGFuZ2UgRGRAcyB0byBEZDtiLgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IFJlY29nbml6ZSAnbScsICduJywgJ28nLCAncCcsICdxJywKLQlhbmQgJ3YnIGFzIG9wZXJhbmQgdHlwZXMuCi0KLU1vbiBEZWMgIDEgMTE6NTY6NTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBBZGQgYXJndW1lbnQgZm9yIGxwc3RvcC4gIEZyb20gT2xpdmllciBDYXJtb25hCi0JPG9saXZpZXIuY2FybW9uYUBkaS5lcGZsLmNoPi4KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fbTY4ayk6IEhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgbHBzdG9wLAotCXdoaWNoIGhhcyBhIHR3byB3b3JkIG9wY29kZSB3aXRoIGEgb25lIHdvcmQgYXJndW1lbnQuCi0KLVN1biBOb3YgMjMgMjI6MjU6MjEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKGQzMHZfb3Bjb2RlX3RhYmxlLCBjYXNlIGNtcHUpOiBJbW1lZGlhdGUgZmllbGQgaXMKLQl1bnNpZ25lZCwgbm90IHNpZ25lZC4KLQkoZDMwdl9mb3JtYXRfdGFibGUpOiBBZGQgU0hPUlRfQ01QVSBjYXNlcyBmb3IgY21wdS4KLQotVHVlIE5vdiAxOCAyMzoxMDowMyAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBkMTB2LWRpcy5jIChwcmludF9vcGVyYW5kKToKLQlTcGxpdCBPUEVSQU5EX0ZMQUcgaW50byBPUEVSQU5EX0ZGTEFHIGFuZCBPUEVSQU5EX0NGTEFHLgotCi1UdWUgTm92IDE4IDE4OjQ1OjE0IDE5OTcgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGQxMHYtb3BjLmMgKE9QRVJBTkRfRkxBRyk6IFNwbGl0IGludG86Ci0JKE9QRVJBTkRfRkZMQUcsIE9QRVJBTkRfQ0ZMQUcpIC4KLQkoRlNSQyk6IFNwbGl0IGludG86Ci0JKEZGU1JDLCBDRlNSQykuCi0KLVRodSBOb3YgMTMgMTE6MDU6MzMgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IE1vdmUgdGhlIElOU05fTUFDUk8gSVNBIHZhbHVlIHRvIHRoZSBtZW1iZXJzaGlwCi0JZmllbGQgZm9yIGFsbCBJTlNOX01BQ1JPJ3MuCi0JKiBtaXBzMTYtb3BjLmM6IHNhbWUKLQotV2VkIE5vdiAxMiAxMDoxNjo1NyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAoc3luYyxjYWNoZSk6IFRoZXNlIGFyZSAzOTAwIGluc25zLgotCi1UdWUgTm92IDExIDIzOjUzOjQxIDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCXNoLW9wYy5oIChzaF90YWJsZSk6IFJlbW92ZSBmdHN0L25hbi4KLQotVHVlIE9jdCAyOCAxNzo1OTozMiAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAoZmZjLCBmZnMpOiBGaXggbWFzay4KLQotVHVlIE9jdCAyOCAxNjozNDo1NCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQWRkIGVpdF92YiwgaW50X3MsIGFuZCBpbnRfbQotCWNvbnRyb2wgcmVnaXN0ZXJzLgotCi1Nb24gT2N0IDI3IDIyOjM0OjAzIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBGaXggYnVnIGluIG1hc2sgZm9yICJub3QiIHBzZXVkby1pbnN0cnVjdGlvbi4KLQkoV1JfSElMTywgUkRfSElMTywgTU9EX0hJTE8pOiBOZXcgbWFjcm9zLgotCi1Nb24gT2N0IDI3IDIyOjM0OjAzIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBGaXggYnVnIGluIG1hc2sgZm9yICJub3QiIHBzZXVkby1pbnN0cnVjdGlvbi4KLQkoV1JfSElMTywgUkRfSElMTywgTU9EX0hJTE8pOiBOZXcgbWFjcm9zLgotCi1UaHUgT2N0IDIzIDE0OjU3OjU4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogUmVwbGFjZSAvLyB3aXRoIC8qIC4uLiAqLwotCi1XZWQgT2N0IDIyIDE3OjMzOjIxIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jOiBBZGQgd3IgJiByZCBmb3IgdjlhIGFzcidzLgotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBSZWNvZ25pemUgJ18nIGFuZCAnLycgZm9yIHY5YSBhc3Incy4KLQkodjlhX2Fzcl9yZWdfbmFtZXMpOiBOZXcgdmFyaWFibGUuCi0JUGF0Y2ggZnJvbSBEYXZpZCBNaWxsZXIgPGRhdmVtQHZnZXIucnV0Z2Vycy5lZHU+LgotCi1XZWQgT2N0IDIyIDE3OjE4OjAyIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jICh2OW5vdHY5YSk6IE5ldyBpbnNuIHR5cGUuCi0JKElNUERFUCk6IE1vdmUgdG8gdGhlIGVuZCB0byBub3QgY29uZmxpY3Qgd2l0aCBlZGdlOCBldCBhbC4KLQlQYXRjaCBmcm9tIERhdmlkIE1pbGxlciA8ZGF2ZW1Admdlci5ydXRnZXJzLmVkdT4uCi0KLUZyaSBPY3QgMTcgMTM6MTg6NTMgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKGJuZXpsLGJlcXpsKTogTWFyayB0aGVzZSBhcyBhbHNvIHR4MzkuCi0KLVRodSBPY3QgMTYgMTE6NTU6MjAgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IE5vdGUgdGhhdCAnamFseCcgaXMgKHByb2JhYmx5IGluY29ycmVjdGx5KSBtYXJrZWQgSTEuCi0KLVR1ZSBPY3QgMTQgMTY6MTA6MzEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBVc2UgbmV3IHN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMoKSBmaWVsZAotCW9mIGRpc2Fzc2VtYmxlX2luZm8gc3RydWN0dXJlIHRvIGRldGVybWluZSBpZiBhbiBvdmVybGF5IGFkZHJlc3MKLQloYXMgYSBtYXRjaGluZyBzeW1ib2wgaW4gbG93IG1lbW9yeS4KLQotCSogZGlzLWJ1Zi5jIChnZW5lcmljX3N5bWJvbF9hdF9hZGRyZXNzKTogTmV3IChkdW1teSkgZnVuY3Rpb24gZm9yCi0JbmV3IHN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMgZmllbGQgaW4gZGlzYXNzZW1ibGVfaW5mbyBzdHJ1Y3R1cmUuCi0KLUZyaSBPY3QgMTAgMTY6NDQ6NTIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAoZXh0cmFjdF9kMjIpOiBVc2Ugc2lnbmVkIGFyaXRobWF0aWMuCi0KLVR1ZSBPY3QgIDcgMjM6NDA6NDMgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IFRocmVlIG9wIG11bHQgaXMgbm90IGFuIElTQSBpbnNuLgotCi1UdWUgT2N0ICA3IDIzOjM3OjIxIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBGaXggZm9ybWF0dGluZy4KLQotRnJpIE9jdCAgMyAxNzoyNjo1NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKE9QX0UpOiBFeHBsaWNpdGx5IHNpZ24gZXh0ZW5kIDggYml0IHZhbHVlcywgcmF0aGVyCi0gCXRoYW4gYXNzdW1pbmcgdGhhdCBjaGFyIGlzIHNpZ25lZC4gIEV4cGxpY2l0bHkgc2lnbiBleHRlbmQgMTYgYml0Ci0JdmFsdWVzLCByYXRoZXIgdGhhbiBhc3N1bWluZyB0aGF0IHNob3J0IGlzIDE2IGJpdHMuCi0JKE9QX3NJLCBPUF9KLCBPUF9ESVIpOiBMaWtld2lzZS4KLQotVGh1IE9jdCAgMiAxMzozNjo0NSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLWRpcy5jICh2ODUwX3NyZWdfbmFtZXMpOiBVc2Ugc3ltYm9saWMgbmFtZXMgZm9yIGhpZ2hlcgotCXN5c3RlbSByZWdpc3RlcnMuCi0KLVdlZCBPY3QgIDEgMTY6NTg6NTQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYzogRml4IHR5cG8gaW4gY29tbWVudC4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBBZGQgdGVzdCBvZiBwcm9jZXNzb3IgdHlwZSB3aGVuCi0JZGV0ZXJtaW5pbmcgb3Bjb2Rlcy4KLQotV2VkIE9jdCAgMSAxNDoxMDoyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGEgZGl2ZXJzaW9uIHRvIHNldCBlbmFibGVfc2hhcmVkIGJlZm9yZSB0aGUKLQlhcmd1bWVudHMgYXJlIHBhcnNlZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IFNlcCAyNSAxMzowNDo1OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKFRCTDEpOiBVc2UgISByYXRoZXIgdGhhbiBgLgotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBSZW1vdmUgYCBvcGVyYW5kIHNwZWNpZmllci4KLQotV2VkIFNlcCAyNCAxMToyOTozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IENvcnJlY3QgYmNoZywgYmNsciwgYnNldCwgYW5kIGJ0c3Qgb24gQ29sZEZpcmUuCi0KLQkqIG02OGstb3BjLmM6IEFjY2VwdCB0c3R7Yix3LGx9IHdpdGggaW1tZWRpYXRlIG9wZXJhbmRzIG9uIGNwdTMyLgotCi0JKiBtNjhrLW9wYy5jOiBDb3JyZWN0IG1vdmV3IG9mIGFuIGltbWVkaWF0ZSBvcGVyYW5kIHRvICVzciBvciAlY2NyCi0JZm9yIG1jZjUyMDAuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DSEVDS19UT09MIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBTZXAgMTkgMTE6NDU6NDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jICgiY21vdiIpOiBPcmRlciByZWcgcGFyYW0gcjEsIHIyIG5vdCByMiwgcjIuCi0KLVRodSBTZXAgMTggMTE6MjE6NDMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjbGV0X2NwcmVnX3RhYmxlKTogQWRkICVjY3NyMiwgJWNjY3JyLCAlY2Nyc3RyLgotCi1UdWUgU2VwIDE2IDE1OjE4OjIwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEZ1cnRoZXIgcmVhcnJhbmdlbWVudHMuCi0KLVR1ZSBTZXAgMTYgMTY6MTI6MTEgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKHJvdDJoLCBzcmEyaCwgc3JsMmggaW5zbnMpOiBSZXZlcnQgbGFzdCBjaGFuZ2UuCi0KLVR1ZSBTZXAgMTYgMDk6NDg6NTAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRmllbGRzIHJlb3JkZXJlZCB0byBhbGxvdyBhc3NlbWJsZXIKLQlwYXJzZXIgdG8gd29yay4KLQotVHVlIFNlcCAxNiAxMDowMTowMCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkZWQgdHgzOSBpbnNucyBzZGJicCwgcmZlLCBhbmQgZGVyZXQuCi0KLU1vbiBTZXAgMTUgMTg6MzE6NTIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYzogSW5pdGlhbGlzZSBwcm9jZXNzb3JzIGZpZWxkIG9mIHY4NTBfb3Bjb2RlIHN0cnVjdHVyZS4KLQotV2VkIEF1ZyAyNyAyMTo0MjozOSAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1lcmdlIGNoYW5nZXMgZnJvbSBNYXJ0aW4gSHVudDoKLQotCSogZDMwdi1vcGMuYzogQ2hhbmdlIG12ZmFjYyB0byBhY2NlcHQgNi1iaXQgdW5zaWduZWQgdmFsdWVzLgotCi0JKiBkMzB2LW9wYy5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBBZGQgY29udHJvbCByZWdpc3RlcnMgZnJvbSAwLTYzLgotCShkMzB2X29wY29kZV90YWJlbCk6IEFkZCBkYnQsIHJ0ZCwgc3JhaCwgYW5kIHNybGggaW5zdHJ1Y3Rpb25zLiBGaXgKLQlyb3QyaCwgc3JhMmgsIGFuZCBzcmwyaCB0byB1c2UgbmV3IFNIT1JUX0E1UyBmb3JtYXQuCi0KLQkqIGQzMHYtZGlzLmMgKHByaW50X2luc24pOiBGaXggZGlzYXNzZW1ibHkgb2YgU0hPUlRfRDIgb3Bjb2Rlcy4KLQotCSogZDMwdi1kaXMuYyAocHJpbnRfaW5zbik6IEZpcnN0IG9wZXJhbmQgb2YgZCppIChkZWxheWVkCi0JYnJhbmNoKSBpbnN0cnVjdGlvbnMgaXMgcmVsYXRpdmUuCi0KLQkqIGQzMHYtb3BjLmMgKGQzMHZfb3Bjb2RlX3RhYmxlKTogQ2hhbmdlIGZvcm0gZm9yIHJlcGVhdGkuCi0JKGQzMHZfb3BlcmFuZF90YWJsZSk6IEFkZCBJTU02UzMgdHlwZS4KLQkoZDMwdl9mb3JtYXRfdGFibGUpOiBDaGFuZ2UgU0hPUlRfRDIuIEFkZCBMT05HX0RiLgotCi0JKiBkMzB2LWRpcy5jOiBGaXggYnVnIHdpdGggIi5zIiBhbmQgIi5sIiBleHRlbnNpb25zCi0JYW5kIGNtcCBpbnN0cnVjdGlvbnMuCi0KLQkqIGQzMHYtb3BjLmM6IENvcnJlY3QgZW50cmllcyBmb3IgcmVwZWF0KiwgYW5kIHNhdCouCi0JTWFrZSBJTU01IHVuc2lnbmVkLiBDcmVhdGUgSU1NNlUgYW5kIElNTTEyUzNVIG9wZXJhbmQKLQl0eXBlcy4gQ29ycmVjdCBzZXZlcmFsIGZvcm1hdHMuCi0KLQkqIGQzMHYtb3BjLmM6IChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBBZGQgZHBzdyBhbmQgZHBjLgotCi0JKiBkMzB2LW9wYy5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBDaGFuZ2UgY29udHJvbCByZWdpc3RlcnMuCi0KLQkqIGQzMHYtb3BjLmMgKGQzMHZfZm9ybWF0X3RhYmxlKTogQ29ycmVjdCBTSE9SVF9DMSBhbmQKLQlTSE9SVF9DMi4gIE1hbnVhbCB3YXMgaW5jb3JyZWN0LgotCi0JKiBkMzB2LWRpcy5jIChsb29rdXBfb3Bjb2RlKTogIFJldHVybiB2YWx1ZSBub3cgaW5kaWNhdGVzCi0JaWYgYW4gb3Bjb2RlIGhhcyBhIHNob3J0IGFuZCBhIGxvbmcgZm9ybS4gIFVzZWQgZm9yIGRlY2lkaW5nCi0JdG8gYXBwZW5kIGEgIi5zIiBvciAiLmwiLgotCShwcmludF9pbnNuKTogQXBwZW5kIGEgIi5zIiB0byBhbiBpbnN0cnVjdGlvbiBpZiBpdCBpcwotIAl0aGUgc2hvcnQgZm9ybSBhbmQgIi5sIiBpZiBpdCBpcyBhIGxvbmcgZm9ybS4gRG8gbm90IGFwcGVuZAotCWFueXRoaW5nIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMgb25seSBvbmUgcG9zc2libGUgc2l6ZS4KLQotCSogZDMwdi1vcGMuYzogQ2hhbmdlIG11bHgyaCB0byByZXF1aXJlIGFuIGV2ZW4gcmVnaXN0ZXIuCi0JTmV3IGZvcm06IFNIT1JUX0EyOyBhIFNIT1JUX0EgZm9ybSB0aGF0IG5lZWRzIGFuIGV2ZW4KLQlyZWdpc3RlciBhcyB0aGUgZmlyc3Qgb3BlcmFuZC4KLQotCSogZDMwdi1kaXMuYyAocHJpbnRfaW5zbl9kMzB2KTogRml4IHByb2JsZW0gd2hlcmUgdGhlIGxhc3QKLQlpbnN0cnVjdGlvbiB3YXMgbm90IGJlaW5nIGRpc2Fzc2VtYmxlZCBpZiB0aGVyZSB3ZXJlIGFuIG9kZAotCW51bWJlciBvZiBpbnN0cnVjdGlvbnMuCi0KLQkqIGQzMHYtb3BjLmMgKFNIT1JUX00yLCBMT05HX00yKTogIFR3byBuZXcgZm9ybXMuCi0KLUZyaSBTZXAgMTIgMTE6NDM6NTQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBJbXByb3ZlZCBkaXNwbGF5IG9mIHJlZ2lzdGVyIGxpc3RzLgotCi1UaHUgU2VwIDExIDE3OjM1OjEwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogRml4IGFzc2VtYmxlciBhcmdzIHRvCi0JZnplcm9zLCBmb25lcywgZnNyYzEsIGZzcmMxcywgZnNyYzJzLCBmbm90MSwgZm5vdDFzLCBmbm90MnMsCi0JZm9ycywgZm5vcnMsIGZhbmRzLCBmbmFuZHMsIGZ4b3JzLCBmeG5vcnMsIGZvcm5vdDFzLCBmb3Jub3QycywKLQlmYW5kbm90MXMsIGZhbmRub3Qycy4KLQotVHVlIFNlcCAgOSAxMDowMzo0OSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IEZpeCBvcDMgZmllbGQgZm9yIGZjbXBxL2ZjbXBlcS4KLQotTW9uIFNlcCAgOCAxNDowNjo1OSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWFzbS5jIChjZ2VuX3BhcnNlX2FkZHJlc3MpOiBOZXcgYXJndW1lbnQgcmVzdWx0cC4KLQlBbGwgY2FsbGVycyB1cGRhdGVkLgotCSogbTMyci1hc20uYyAocGFyc2VfaF9oaTE2KTogUmlnaHQgc2hpZnQgbnVtYmVycyBieSAxNi4KLQotVHVlIFNlcCAgMiAxODozOTowOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBtbjEwMjAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFBDIHJlbGF0aXZlIGluc3RydWN0aW9ucyBhcmUKLSAgICAgICAgcmVsYXRpdmUgdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIG5vdCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4KLQotVHVlIFNlcCAgMiAxNTo0MTo1NSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IE9ubHkgc2lnbmVkIGV4dGVuZCB2YWx1ZXMgdGhhdCBhcmUgbm90Ci0JcmV0dXJuZWQgYnkgZXh0cmFjdCBmdW5jdGlvbnMuCi0JUmVtb3ZlIHVzZSBvZiBWODUwX09QRVJBTkRfQURKVVNUX1NIT1JUX01FTU9SWSBmbGFnLgotCi1UdWUgU2VwICAyIDE1OjM5OjQwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmM6IFVwZGF0ZSBjb21tZW50cy4gIFJlbW92ZSB1c2Ugb2YKLQlWODUwX09QRVJBTkRfQURKVVNUX1NIT1JUX01FTU9SWS4gIEZpeCBzZXZlcmFsIG9wZXJhbmQgcGF0dGVybnMuCi0KLVR1ZSBBdWcgMjYgMDk6NDI6MjggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAoTU9WSEkpOiBJbW1lZGlhdGUgcGFyYW1ldGVyIGlzIHVuc2lnbmVkLgotCi1Nb24gQXVnIDI1IDE1OjU4OjA3IDE5OTcgIENocmlzdG9waGVyIFByb3Zlbnphbm8gIDxwcm92ZW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWx0IHdpdGggbGF0ZXN0IGRldm8gYXV0b2NvbmYgZm9yIE5UIHN1cHBvcnQuCi0KLUZyaSBBdWcgMjIgMTA6MzU6MTUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBVc2UgY3VybHkgYnJhY2Ugc3ludGF4IGZvciByZWdpc3RlcgotCWxpc3RzLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXNbXSk6IEFkZCBOT1RfUjAgZmxhZyB0byBkZWNlY3QgY2FzZXMKLQl3aGVyZSByMCBpcyBiZWluZyB1c2VkIGFzIGEgZGVzdGluYXRpb24gcmVnaXN0ZXIuCi0KLVRodSBBdWcgMjEgMTE6MDk6MDkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzW10pOiBNb3ZlIGRpdmggb3Bjb2RlcyBuZXh0IHRvIGVhY2ggb3RoZXIuCi0KLVR1ZSBBdWcgMTkgMTA6NTk6NTkgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtb3BjLmMgKGFscGhhX29wY29kZXMpOiBGaXggaHdfcmVpX3N0YWxsIG11bmdhZ2UuCi0KLU1vbiBBdWcgMTggMTE6MTA6MDMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzW10pOiBSZW1vdmUgdXNlIG9mIGZsYWcgZmllbGQuCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXNbXSk6IEFkZCBzdXBwb3J0IGZvciByZXZlcnNlZCBzaG9ydCBsb2FkCi0Jb3Bjb2Rlcy4uCi0KLU1vbiBBdWcgMTggMTE6MDg6MjUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlIChjZ2VuX2ZpbGVzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoY2dlbl9maWxlcyk6ICBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgotCi1Nb24gQXVnIDE4IDExOjA4OjI1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSAoY2dlbl9maWxlcyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChjZ2VuX2ZpbGVzKTogIEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LgotCi1GcmkgQXVnIDE1IDA1OjE3OjQ4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2FyY19hcmNoKTogQWRkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuYW0gKEFMTF9NQUNISU5FUyk6IEFkZCBhcmMtZGlzLmxvLCBhcmMtb3BjLmxvLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBhcmMtZGlzLmMsIGFyYy1vcGMuYzogTmV3IGZpbGVzLgotCSogZGlzYXNzZW1ibGUuYyAoQVJDSF9hbGwpOiBEZWZpbmUgQVJDSF9hcmMuCi0JKGRpc2Fzc2VtYmxlcik6IEFkZCBBUkMgc3VwcG9ydC4KLQotV2VkIEF1ZyAxMyAxODo1MjoxMSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IEFkZCBzdXBwb3J0IGZvciB2ODUwRUEgaW5zdHJ1Y3Rpb25zLgotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRfaTVkaXYsIGV4dHJhY3RfaTVkaXYpOiBOZXcgRnVuY3Rpb25zLgotCSh2ODUwX29wY29kZXMpOiBBZGQgdjg1MEVBIGluc3RydWN0aW9ucy4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MEUgaW5zdHJ1Y3Rpb25zLgotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRfZDVfNCwgZXh0cmFjdF9kNV80LCBpbnNlcnRfZDE2XzE2LAotCWV4dHJhY3RfZDE2XzE2LCBpbnNlcnRfaTksIGV4dHJhY3RfaTksIGluc2VydF91OSwgZXh0cmFjdF91OSwKLQlpbnNlcnRfc3BlLCBleHRyYWN0X3NwZSk6IE5ldyBGdW5jdGlvbnMuCi0JKHY4NTBfb3Bjb2Rlcyk6IEFkZCB2ODUwRSBpbnN0cnVjdGlvbnMuCi0KLQkqIHY4NTAtb3BjLmM6IFJlb3JnYW5pc2VkIGFuZCByZS1sYXllZCBvdXQgdG8gaW1wcm92ZSByZWFkYWJpbGl0eQotCWFuZCBwb3J0YWJpbGl0eS4KLQotVHVlIEF1ZyAgNSAyMzowOTozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuMS4KLQotTW9uIEF1ZyAgNCAxMjowMjoxNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIG5ldyBhdXRvbWFrZSBwYXRjaGVzLgotCi1GcmkgQXVnICAxIDEzOjAyOjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgZW5hYmxlX3NoYXJlZCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLgotCSogYWNpbmNsdWRlLm00OiBKdXN0IGluY2x1ZGUgYWNpbmNsdWRlLm00IGZyb20gQkZELgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgSnVsIDMxIDIxOjQ0OjQyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLCBiYXNlZCBvbiBvbGQgTWFrZWZpbGUuaW4uCi0JKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KLQkqIGFjaW5jbHVkZS5tNDogTmV3IGZpbGUuCi0JKiBzdGFtcC1oLmluOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBTV9JTklUX0FVVE9NQUtFIGFuZCBBTV9QUk9HX0xJQlRPT0wuCi0JUmVtb3ZlZCBzaGFyZWQgbGlicmFyeSBoYW5kbGluZzsgbm93IGhhbmRsZWQgYnkgbGlidG9vbC4gIFJlcGxhY2UKLQlBQ19DT05GSUdfSEVBREVSIHdpdGggQU1fQ09ORklHX0hFQURFUi4gIENhbGwgQU1fTUFJTlRBSU5FUl9NT0RFLAotCUFNX0NZR1dJTjMyLCBhbmQgQU1fRVhFRVhULiAgUmVwbGFjZSBBQ19QUk9HX0lOU1RBTEwgd2l0aAotCUFNX1BST0dfSU5TVEFMTC4gIENoYW5nZSBhbGwgLm8gZmlsZXMgdG8gLmxvLiAgUmVtb3ZlIHN0YW1wLWgKLQloYW5kbGluZyBpbiBBQ19PVVRQVVQuCi0JKiBkZXAtaW4uc2VkOiBDaGFuZ2UgLm8gdG8gLmxvLgotCSogTWFrZWZpbGUuaW46IE5vdyBidWlsdCB3aXRoIGF1dG9tYWtlLgotCSogYWNsb2NhbC5tNDogTm93IGJ1aWx0IHdpdGggYWNsb2NhbC4KLQkqIGNvbmZpZy5pbiwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gSnVsIDI4IDIxOjUyOjI0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogRml4IHR5cG8vdGhpbmtvIGluICJlcmV0IiBpbnN0cnVjdGlvbi4KLQotVGh1IEp1bCAyNCAxMzowMzoyNiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IEZpeCBzcGVsbGluZyBvbiBmcGFkZFgsIGZwc3ViWCBpbnNucy4KLQlNYWtlIGFycmF5IGNvbnN0LgotCSogc3BhcmMtZGlzLmMgKHNvcnRlZF9vcGNvZGVzKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkoc3RydWN0IG9wY29kZV9oYXNoKTogYG9wY29kZScgaXMgcG9pbnRlciB0byBjb25zdCBlbGVtZW50LgotCShidWlsZF9oYXNoKTogRmlyc3QgYXJnIGlzIG5vdyB0YWJsZSBvZiBzb3J0ZWQgcG9pbnRlcnMuCi0JKHByaW50X2luc25fc3BhcmMpOiBTb3J0IG9wY29kZXMgYnkgc29ydGluZyB0YWJsZSBvZiBwb2ludGVycy4KLQkoY29tcGFyZV9vcGNvZGVzKTogVXBkYXRlLgotCi1UdWUgSnVsIDE1IDEyOjA1OjIzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tb3BjLmM6ICNpbmNsdWRlIDxjdHlwZS5oPi4KLQkoaGFzaF9rZXl3b3JkX25hbWUpOiBOZXcgYXJnIGBjYXNlX3NlbnNpdGl2ZV9wJy4gIENhbGxlcnMgdXBkYXRlZC4KLQlIYW5kbGUgY2FzZSBpbnNlbnNpdGl2ZSBoYXNoaW5nLgotCShoYXNoX2tleXdvcmRfdmFsdWUpOiBDaGFuZ2UgdHlwZSBvZiBgdmFsdWUnIHRvIHVuc2lnbmVkIGludC4KLQotVGh1IEp1bCAxMCAxMjo1NjoxMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmMgKG1pcHNfYnVpbHRpbl9vcGNvZGVzKTogSWYgYW4gaW5zbiB1c2VzIHNpbmdsZQotCXByZWNpc2lvbiBGUCwgbWFyayBpdCBhcyBzdWNoLiAgTGlrZXdpc2UgZm9yIGRvdWJsZSBwcmVjaXNpb24KLQlGUC4gIE1hcmsgSVNBMSBpbnNucy4gIENvbnNvbGlkYXRlIGR1cGxpY2F0ZSBvcGNvZGVzIHdoZXJlCi0JcG9zc2libGUuCi0KLVdlZCBKdW4gMjUgMTU6MjU6NTcgMTk5NyAgRmVsaXggTGVlICA8ZmxlZUBjaXJkYW4uY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChleHRyYWN0X25zaSk6IG1ha2UgdW5zaWduZWQgZXhwcmVzc2lvbiBzaWduZWQgYmVmb3JlCi0gCW5lZ2F0aW5nIGl0LgotCShVTlVTRUQpOiByZW1vdmUgb25lIGxldmVsIG9mIHBhcmVucywgc28gTVNWQyBkb2Vzbid0IGNob2tlIG9uCi0gCW5lc3RpbmcgZGVwdGggd2hlbiBhbGwgdGhlIG1hY3JvcyBhcmUgZXhwYW5kZWQuCi0KLVR1ZSBKdW4gMTcgMTc6MDI6MTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYzogVGhlIGZjbXAgdjlhIGluc3RydWN0aW9ucyB0YWtlIGFuIGludGVnZXIgcmVnaXN0ZXIKLQlhcyBhIGRlc3RpbmF0aW9uLCBub3QgYSBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gIEZyb20gQ2hyaXN0aWFuCi0JS3VlaG5rZSA8Q2hyaXN0aWFuLkt1ZWhua2VAYXJiaS5JbmZvcm1hdGlrLlVuaS1PbGRlbmJ1cmcuREU+LgotCi1Nb24gSnVuIDE2IDE0OjEzOjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBQcmludCBjYXNlIDcuMiB1c2luZyAlcGNAKCkKLQlzeW50YXguICBGcm9tIFJvbWFuIEhvZGVrCi0JPHJuaG9kZWtAZmF1aTIyYy5pbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4uCi0KLQkqIGkzODYtZGlzLmMgKHR3b2J5dGVfaGFzX21vZHJtKTogRml4IHBhbmQuCi0KLU1vbiBKdW4gMTYgMTQ6MDg6MzggMTk5NyAgTWljaGFlbCBUYXlsb3IgIDxtYnRAbWl0LmVkdT4KLQotCSogaTM4Ni1kaXMuYyAoZGlzMzg2X3R3b2J5dGUpOiBGaXggcGFuZCBhbmQgcGFuZG4uCi0KLVR1ZSBKdW4gMTAgMTE6MjY6NDcgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogYXJtLWRpcy5jOiBBZGQgcHJvdG90eXBlcyBmb3IgYXJtX2RlY29kZV9zaGlmdCBhbmQKLQlwcmludF9pbnNuX2FybS4KLQotTW9uIEp1biAgMiAxMTozOTowNCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkIHIzOTAwIGluc25zLgotCi1UdWUgTWF5IDI3IDE1OjU1OjQ0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogQ2hhbmdlIHJlbG1hc2sgdG8gYmZkX3ZtYS4gIERvbid0Ci0JcHJpbnQgZGVsYXkgc2xvdCBpbnN0cnVjdGlvbnMgb24gdGhlIHNhbWUgbGluZS4gIFdoZW4gdXNpbmcgYSBQQwotCXJlbGF0aXZlIGxvYWQsIGFkZCBhIGNvbW1lbnQgd2l0aCB0aGUgdmFsdWUgYmVpbmcgbG9hZGVkIGlmIGl0IGNhbgotCWJlIG9idGFpbmVkLgotCi1UdWUgTWF5IDI3IDExOjAyOjA4IDE5OTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAoZGlzMzg2W10sIGRpczM4Nl90d29ieXRlW10pOiBjaGFuZ2UgcHVzaGwvcG9wbAotCXRvIHB1c2hTL3BvcFMgZm9yIHNlZ21lbnQgcmVncyBhbmQgYnl0ZSBjb25zdGFudCBzbyB0aGF0Ci0JcHVzaHcvcG9wdyBwcmludGVkIHdoZW4gaW4gMTYgYml0IGRhdGEgbW9kZS4KLQotCSogaTM4Ni1kaXMuYyAoZGlzMzg2W10pOiBjaGFuZ2UgY3d0bCwgY2x0ZCB0byBjV3RTLCBjU3RkIHRvCi0JcHJpbnQgY2J0dywgY3d0ZCBpbiAxNiBiaXQgZGF0YSBtb2RlLgotCSogaTM4Ni1kaXMuYyAocHV0b3ApOiBleHRyYSBjYXNlIFcgdG8gc3VwcG9ydCBhYm92ZS4KLQotCSogaTM4Ni1kaXMuYyAocHJpbnRfaW5zbl94ODYpOiBwcmludCBhZGRyMzIgcHJlZml4IHdoZW4gZ2l2ZW4KLQlhZGRyZXNzIHNpemUgcHJlZml4IGluIDE2IGJpdCBhZGRyZXNzIG1vZGUuCi0KLUZyaSBNYXkgMjMgMTY6NDc6MjMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzaC1kaXMuYzogUmVpbmRlbnQuICBSZW5hbWUgbG9jYWwgdmFyaWFibGUgZnByaW50ZiB0bwotCWZwcmludGZfZm4uCi0KLVRodSBNYXkgMjIgMTQ6MDY6MDIgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYyAobTMycl9jZ2VuX2luc25fdGFibGUsIGNtcHVpKTogVW5kbyBwYXRjaCBvZiBNYXkgMi4KLQotVHVlIE1heSAyMCAxMToyNjoyNyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAobWlwc19idWlsdGluX29wY29kZXMpOiBNb3ZlZCBJTlNOX0lTQSBmaWVsZCBpbnRvIG5ldwotCSAgZmllbGQgbWVtYmVyc2hpcC4KLQkqIG1pcHMxNi1vcGMuYyAobWlwMTZfb3Bjb2Rlcyk6IHNhbWUuCi0KLU1vbiBNYXkgMTIgMTU6MTA6NTMgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtb3ZlYik6IENoYW5nZSAkZCB0byAlZC4KLQotTW9uIE1heSAgNSAxNDoyODo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmM6IChkaXMzODZfdHdvYnl0ZSk6IEFkZCBNTVggaW5zdHJ1Y3Rpb25zLgotCSh0d29ieXRlX2hhc19tb2RybSk6IExpa2V3aXNlLgotCShncnBzKTogTGlrZXdpc2UuCi0JKE9QX01NWCwgT1BfRU0sIE9QX01TKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0KLQkqIGkzODYtZGlzLmM6IFJldmVydCBwYXRjaCBvZiBBcHJpbCA0LiAgVGhlIG91dHB1dCBub3cgbWF0Y2hlcwotCXdoYXQgZ2NjIGdlbmVyYXRlcy4KLQotRnJpIE1heSAgMiAxMjo0ODozNyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jIChtMzJyX2NnZW5faW5zbl90YWJsZSwgY21wdWkpOiBVc2UgJHVpbW0xNiBpbnN0ZWFkCi0Jb2YgJHNpbW0xNi4KLQotVGh1IE1heSAgMSAxNTozNDoxNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5oIChDR0VOX0FSQ0gpOiBSZW5hbWVkIGZyb20gQ0dFTl9DUFUuCi0KLVR1ZSBBcHIgMTUgMTI6NDA6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERlcGVuZCB1cG9uIGluc3RhbGxkaXJzLgotCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCi0KLU1vbiBBcHIgMTQgMTI6MTM6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBUaG9tYXMgR3JhaWNoZW4gPGdyYWljaGVuQHJ6cGQuZGU+OgotCSogY29uZmlndXJlLmluOiBVc2UgJHtDT05GSUdfU0hFTEx9IHdoZW4gcnVubmluZyAkYWNfY29uZmlnX3N1Yi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotU3VuIEFwciAxMyAxNzo1MDo0MSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLSouYywgbTMyci0qLmM6ICNpbmNsdWRlIHN5c2RlcC5oIGluc3RlYWQgb2YgY29uZmlnLmguCi0JRGVsZXRlIHN0cmluZ3ssc30uaCBzdXBwb3J0LgotCi1UaHUgQXByIDEwIDE0OjQ0OjU2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tYXNtLmMgKGNnZW5fcGFyc2Vfb3BlcmFuZF9mbik6IE5ldyBnbG9iYWwuCi0JKGNnZW5fcGFyc2Vfe3ssdW59c2lnbmVkX2ludGVnZXIsYWRkcmVzc30pOiBVcGRhdGUgY2FsbCB0bwotCWNnZW5fcGFyc2Vfb3BlcmFuZF9mbi4KLQkoY2dlbl9pbml0X3BhcnNlX29wZXJhbmQpOiBOZXcgZnVuY3Rpb24uCi0JKiBtMzJyLWFzbS5jIChwYXJzZV9pbnNuX25vcm1hbCk6IGNnZW5faW5pdF9wYXJzZV9vcGVyYW5kIHJlbmFtZWQKLQlmcm9tIGNnZW5fYXNtX2luaXRfcGFyc2UuCi0JKG0zMnJfY2dlbl9hc3NlbWJsZV9pbnNuKTogTmV3IG9wZXJhbmQgYGVycm1zZycuCi0JRGVsZXRlIGNhbGwgdG8gYXNfYmFkLCByZXR1cm4gZXJyb3IgbWVzc2FnZSB0byBjYWxsZXIuCi0JKG0zMnJfY2dlbl9hc21faGFzaF9rZXl3b3Jkcyk6ICNpZiAwIG91dC4KLQotV2VkIEFwciAgOSAxMjowNToyNSAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpIFtjYXNlICdkJ106IFByaW50IGFzIGFkZHJlc3MgcmVnaXN0ZXIsCi0Jbm90IGRhdGEgcmVnaXN0ZXIuCi0JW2Nhc2UgJ0onXTogRml4IHR5cG8gaW4gcmVnaXN0ZXIgbmFtZS4KLQotTW9uIEFwciAgNyAxNjo0ODoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSBTSExJQl9MSUJTLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKFNITElCX0xJQlMpOiBOZXcgdmFyaWFibGUuCi0JKCQoU0hMSUIpKTogVXNlICQoU0hMSUJfTElCUykuCi0KLU1vbiBBcHIgIDcgMTE6NDU6NDQgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi1kaXMuYyAoYnVpbGRfZGlzX2hhc2hfdGFibGUpOiBGaXggeG1hbGxvYyBzaXplIGNvbXB1dGF0aW9uLgotCi0JKiBjZ2VuLW9wYy5jIChoYXNoX2tleXdvcmRfbmFtZSk6IEltcHJvdmUgYWxnb3JpdGhtLgotCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiBIYW5kbGUgbTMyci4KLQotRnJpIEFwciAgNCAxMjoyOTozOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLWFzbS5jLCBtMzJyLWRpcy5jLCBtMzJyLW9wYy5jLCBtMzJyLW9wYy5oOiBOZXcgZmlsZXMuCi0JKiBjZ2VuLWFzbS5jLCBjZ2VuLWRpcy5jLCBjZ2VuLW9wYy5jOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIHRoZW0uCi0JKEFMTF9NQUNISU5FUyk6IEFkZCB0aGVtLgotCShkZXBlbmRlbmNpZXMpOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlLmluIChjZ2VuX2ZpbGVzKTogTmV3IHZhcmlhYmxlLgotCShiZmRfbTMycl9hcmNoKTogQWRkIGVudHJ5LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1GcmkgQXByICA0IDE0OjA0OjE2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDb3JyZWN0IGZpbGUgbmFtZXMgZm9yIGJmZF9tbjEwWzIzXTAwX2FyY2guCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogZDEwdi1kaXMuYzogSW5jbHVkZSAiYW5zaWRlY2wuaCIgYmVmb3JlICJvcGNvZGUvZDEwdi5oIi4KLQotCSogaTM4Ni1kaXMuYyAoZmxvYXRfcmVnKTogU3dhcCBmc3VicnAgYW5kIGZzdWJwLiAgU3dhcCBmZGl2cnAgYW5kCi0JZmRpdnAuCi0KLVRodSBBcHIgIDMgMTM6MjI6NDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjguCi0KLVdlZCBBcHIgIDIgMTI6MjM6NTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtMTAyMDAtZGlzLmM6IFJlbmFtZSBmcm9tIG1uMTAyMDAtZGlzLmMuCi0JKiBtMTAyMDAtb3BjLmM6IFJlbmFtZSBmcm9tIG1uMTAyMDAtb3BjLmMuCi0JKiBtMTAzMDAtZGlzLmM6IFJlbmFtZSBmcm9tIG1uMTAzMDAtZGlzLmMKLQkqIG0xMDMwMC1vcGMuYzogUmVuYW1lIGZyb20gbW4xMDMwMC1vcGMuYy4KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLQkqIG1pcHMxNi1vcGMuYzogQWRkIG11bCBhbmQgZG11bCBtYWNyb3MuCi0KLVR1ZSBBcHIgIDEgMTY6Mjc6NDUgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogVXBkYXRlIENGTEFHUywgYWRkIGNsZWFuIHRhcmdldC4KLQotRnJpIE1hciAyOCAxMjoxMDowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCAid2FpdCIuICBGcm9tIFJhbGYgQmFlY2hsZQotCTxyYWxmQGdudS5haS5taXQuZWR1Pi4KLQotCSogY29uZmlndXJlLmluOiBBZGQgc3RkbGliLmggdG8gQUNfQ0hFQ0tfSEVBREVSUyBsaXN0LgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBzeXNkZXAuaDogSW5jbHVkZSA8c3RkbGliLmg+IGlmIGl0IGV4aXN0cy4KLQkqIHNwYXJjLWRpcy5jOiBJbmNsdWRlIDxzdGRpby5oPiBhbmQgInN5c2RlcC5oIi4gIERvbid0IGluY2x1ZGUKLQk8c3RyaW5nLmg+LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi1UaHUgTWFyIDI3IDE0OjI0OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jOiBBZGQgUFBDIDQwMyBpbnN0cnVjdGlvbnMgYW5kIGV4dGVuZGVkIG9wY29kZXMuICBGcm9tCi0JQW5kcmV3IEJyYXkgPGFuZHlAbWFkaG91c2UuZGVtb24uY28udWs+LgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgY2FzdCB3aGVuIHNldHRpbmcgbWlwc19vcGNvZGVzLgotCi1UdWUgTWFyIDI1IDIzOjA0OjAwIDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogIEZpeCBzaWduIGV4dGVuc2lvbiBwcm9ibGVtLgotCSogdjg1MC1vcGMuYyAoZXh0cmFjdF9kKik6ICBGaXggc2lnbiBleHRlbnNpb24gcHJvYmxlbXMgdG8gbWFrZQotCWRpc2Fzc2VtYmx5IGNhbGN1bGF0ZSBicmFuY2ggb2Zmc2V0cyBjb3JyZWN0bHkuCi0KLU1vbiBNYXIgMjQgMTM6MjI6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaDogQWRkIGJmL3MgYW5kIGJ0L3MgYXMgc3lub255bXMgZm9yIGJmLnMgYW5kIGJ0LnMuCi0KLQkqIG1pcHMtb3BjLmM6IEFkZCBkY3RyIGFuZCBkY3R3LgotCi1TdW4gTWFyIDIzIDE4OjA4OjEwIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMzB2LWRpcy5jIChwcmludF9pbnNuKTogQ2hhbmdlIHRoZSB3YXkgc2lnbmVkIGNvbnN0YW50cwotCWFyZSBkaXNwbGF5ZWQuCi0KLUZyaSBNYXIgMjEgMTQ6Mzc6NTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0gpOiBOZXcgdmFyaWFibGUuCi0JKEhGSUxFUyk6IE5ldyB2YXJpYWJsZS4KLQkoQ0ZJTEVTKTogQWRkIGFsbCBDIGZpbGVzLgotCSguZGVwLCAuZGVwMSwgZGVwLnNlZCwgZGVwLCBkZXAtaW4pOiBOZXcgdGFyZ2V0cy4KLQlEZWxldGUgb2xkIGRlcGVuZGVuY2llcywgYW5kIGJ1aWxkIG5ldyBvbmVzLgotCSogZGVwLWluLnNlZDogTmV3IGZpbGUuCi0KLVRodSBNYXIgMjAgMTk6MDM6MzAgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVfYWxpYXNlcyk6IEFkZGVkIGJsbyBhbmQgYmxve3MsYix3LGx9LgotCi1UdWUgTWFyIDE4IDE0OjE3OjAzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1vcGMuYzogQ2hhbmdlICJ0cmFwIiB0byAic3lzY2FsbCIuCi0JKiBtbjEwMzAwLW9wYy5jOiBBZGQgbmV3ICJzeXNjYWxsIiBpbnN0cnVjdGlvbi4KLQotTW9uIE1hciAxNyAwODo0ODowMyAxOTk3ICBKLlQuIENvbmtsaW4gIDxqdGNAYmVhdXR5LmN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IFByb3ZpZGUgY29ycmVjdCBlbnRyaWVzIGZvciBtdWxzbCBhbmQKLSAJbXVsdWwgaW5zbnMgb24gdGhlIGNvbGRmaXJlLgotCi1TYXQgTWFyIDE1IDE3OjEzOjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2FybSk6IERvbid0IHByaW50IGluc3RydWN0aW9uIGJ5dGVzLgotCShwcmludF9pbnNuX2JpZ19hcm0pOiBTZXQgYnl0ZXNfcGVyX2NodW5rIGFuZCBkaXNwbGF5X2VuZGlhbi4KLQkocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogTGlrZXdpc2UuCi0KLUZyaSBNYXIgMTQgMTU6MDg6NTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+OgotCSogaTM4Ni1kaXMuYyAoZmV0Y2hfZGF0YSk6IEFkZCBwcm90b3R5cGUuCi0JKiBtNjhrLWRpcy5jIChmZXRjaF9kYXRhKTogQWRkIHByb3RvdHlwZS4KLQkoZHVtbXlfcHJpbnRfYWRkcmVzcyk6IEFkZCBwcm90b3R5cGUuICBNYWtlIHN0YXRpYy4KLQkqIHBwYy1vcGMuYyAodmFsaWRfYm8pOiBBZGQgcHJvdG90eXBlLgotCSogc3BhcmMtZGlzLmMgKGJ1aWxkX2hhc2hfdGFibGUpOiBBZGQgcHJvdG90eXBlLgotCShpc19kZWxheWVkX2JyYW5jaCwgY29tcHV0ZV9hcmNoX21hc2spOiBBZGQgcHJvdG90eXBlcy4KLQkocHJpbnRfaW5zbl9zcGFyYyk6IE1ha2Ugc2V2ZXJhbCBsb2NhbCB2YXJpYWJsZXMgY29uc3QuCi0JKGNvbXBhcmVfb3Bjb2Rlcyk6IENoYW5nZSBhcmd1bWVudHMgdG8gY29uc3QgUFRSLiAgQWRkIHByb3RvdHlwZS4KLQkqIHNwYXJjLW9wYy5jIChhcmcpOiBDaGFuZ2UgbmFtZSBmaWVsZCB0byBiZSBjb25zdC4KLQkobG9va3VwX25hbWUsIGxvb2t1cF92YWx1ZSk6IEFkZCBwcm90b3R5cGVzLiAgQ2hhbmdlIHRhYmxlIGFuZAotCW5hbWUgcGFyYW1ldGVycyB0byBiZSBjb25zdC4KLQkoc3BhcmNfZW5jb2RlX2FzaSk6IENoYW5nZSBuYW1lIHBhcmFtZXRlciB0byBiZSBjb25zdC4KLQkoc3BhcmNfZW5jb2RlX21lbWJhciwgc3BhcmNfZW5jb2RlX3ByZWZldGNoKTogTGlrZXdpc2UuCi0JKHNwYXJjX2VuY29kZV9zcGFyY2xldF9jcHJlZyk6IExpa2V3aXNlLgotCShzcGFyY19kZWNvZGVfYXNpKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJlIGNvbnN0LgotCShzcGFyY19kZWNvZGVfbWVtYmFyLCBzcGFyY19kZWNvZGVfcHJlZmV0Y2gpOiBMaWtld2lzZS4KLQkoc3BhcmNfZGVjb2RlX3NwYXJjbGV0X2NwcmVnKTogTGlrZXdpc2UuCi0KLUZyaSBNYXIgIDcgMTA6NTE6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChTSExJTkspKTogSnVzdCB1c2UgbG4gLXMsIG5vdCBsbiAtc2YsIHNpbmNlCi0JU29sYXJpcyBkb2Vzbid0IGxpa2UgdGhlIGNvbWJpbmVkIG9wdGlvbnMsIGFuZCB0aGUgLWYgaXMKLQl1bm5lY2Vzc2FyeS4KLQkoc3RhbXAtdHNobGluaywgaW5zdGFsbCk6IExpa2V3aXNlLgotCi1UaHUgTWFyICA2IDE2OjUxOjExIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAoSU1NMTZfUENSRUwsIFNEOE5fUENSRUwsIEQxNl9TSElGVCk6IE1hcmsgdGhlc2UKLQlhcyByZWxheGFibGUuCi0KLVR1ZSBNYXIgIDQgMDY6MTA6MzYgMTk5NyAgSi5ULiBDb25rbGluICA8anRjQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEZpeCBsYXN0IGNoYW5nZSBmb3IgdGhlIG1jNjgwMTAuCi0KLU1vbiBNYXIgIDMgMDc6NDU6MjAgMTk5NyAgSi5ULiBDb25rbGluICA8anRjQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEFkZGVkIGVudHJpZXMgZm9yIHRoZSB0c3QgaW5zbnMgb24KLSAJdGhlIG1jNjgwMDAuCi0KLVRodSBGZWIgMjcgMTQ6MDQ6MzIgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQWRkZWQgc3diZWdsIHBzZXVkby1pbnN0cnVjdGlvbi4KLQotVGh1IEZlYiAyNyAxMTozNjo0MSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBTZXQgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgdG8gOC4KLQotV2VkIEZlYiAyNiAxNTozNDo0OCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyk6IERlZmluZSByMjUgcHJvcGVybHkuCi0KLVdlZCBGZWIgMjYgMTM6Mzg6MzAgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstZGlzLmMgKE5FWFRTSU5HTEUsIE5FWFRET1VCTEUsIE5FWFRFWFRFTkQpOiBVc2UKLQlmbG9hdGZvcm1hdF90b19kb3VibGUgdG8gbWFrZSBwb3J0YWJsZS4KLQkocHJpbnRfaW5zbl9hcmcpOiBVc2UgTkVYVEVYVEVORCBtYWNybyB3aGVuIGV4dHJhY3RpbmcgZXh0ZW5kZWQKLQlwcmVjaXNpb24gZmxvYXQuCi0KLU1vbiBGZWIgMjQgMTk6MjY6MTIgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBJbml0aWFsaXplIG1pcHNfb3Bjb2RlcyB0byBtaXBzX2J1aWx0aW5fb3Bjb2RlcywKLQlhbmQgYmZkX21pcHNfbnVtX29wY29kZXMgdG8gYmZkX21pcHNfbnVtX2J1aWx0aW5fb3Bjb2Rlcy4KLQotTW9uIEZlYiAyNCAxNToxOTowMSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1kaXMuYywgZDEwdi1vcGMuYzogQ2hhbmdlIHByZV9kZWZpbmVkX3JlZ2lzdGVycyB0bwotCWQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMgYW5kIHJlZ19uYW1lX2NudCB0byBkMTB2X3JlZ19uYW1lX2NudC4KLQotTW9uIEZlYiAyNCAxNDozMzoyNiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKExTSV9TQ0FMRUQpOiBSZW5hbWVkIGZyb20gdGhpcyAuLi4KLQkoT0ZGX1NMX0JSX1NDQUxFRCk6IC4uLiB0byB0aGlzLCBhbmQgYWRkZWQgdGhlIGZsYWcKLQlUSUM4MF9PUEVSQU5EX0JBU0VSRUwgdG8gdGhlIGZsYWdzIHdvcmQuCi0JKHRpYzgwX29wY29kZXMpOiBSZXBsYWNlIGFsbCBvY2N1cmFuY2VzIG9mIExTSV9TQ0FMRUQgd2l0aAotCU9GRl9TTF9CUl9TQ0FMRUQuCi0KLVNhdCBGZWIgMjIgMjE6MjU6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgbWFjcm9zIGZvciBjb3AwLCBjb3AxIGNvcDIgYW5kIGNvcDMuCi0JQ2hhbmdlIG1pcHNfb3Bjb2RlcyBmcm9tIGNvbnN0IGFycmF5IHRvIGEgcG9pbnRlciwKLQlhbmQgY2hhbmdlIGJmZF9taXBzX251bV9vcGNvZGVzIGZyb20gY29uc3QgaW50IHRvIGludCwKLQlzbyB0aGF0IHdlIGNhbiBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgbWlwcyBvcGNvZGVzIHRhYmxlCi0JZHluYW1pY2FsbHkuCi0KLVNhdCBGZWIgMjIgMjE6MDM6NDcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMpOiBSZXZlcnQgY2hhbmdlIHRvCi0Jc3RvcmUgQklUTlVNIHZhbHVlcyBpbiB0aGUgdGFibGUgaW4gb25lJ3MgY29tcGxlbWVudCBmb3JtCi0JdG8gbWF0Y2ggYmVoYXZpb3Igd2hlbiBhc3NlbWJsZXIgaXMgZ2l2ZW4gYSByYXcgbnVtZXJpYwotCXZhbHVlIGZvciBhIEJJVE5VTSBvcGVyYW5kLgotCSogdGljODAtZGlzLmMgKHByaW50X29wZXJhbmRfYml0bnVtKTogRGl0dG8uCi0KLUZyaSBGZWIgMjEgMTY6MzE6MTggMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmM6IFJlbW92ZWQgcmVmZXJlbmNlcyB0byBGTEFHX1guCi0KLVdlZCBGZWIgMTkgMTQ6NTE6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGRlcGVuZGVuY2llcyBvbiAuLi9iZmQvYmZkLmggYXMgcmVxdWlyZWQuCi0KLVR1ZSBGZWIgMTggMTc6NDM6NDMgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBkMzB2IG9iamVjdCBmaWxlcy4KLQkqIGNvbmZpZ3VyZTogKGJmZF9kMzB2X2FyY2gpIFJlYnVpbHQuCi0JKiBjb25maWd1cmUuaW46IChiZmRfZDMwdl9hcmNoKSBBZGRlZCBuZXcgY2FzZS4KLQkqIGQzMHYtZGlzLmM6IE5ldyBmaWxlLgotCSogZDMwdi1vcGMuYzogTmV3IGZpbGUuCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpIEFkZCBlbnRyeSBmb3IgZDMwdi4KLQotVHVlIEZlYiAxOCAxNjozMjowOCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyk6IEFkZCBzeW1ib2xpYwotCXJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGZsb2F0aW5nIHBvaW50IEJJVE5VTSB2YWx1ZXMuCi0KLUZyaSBGZWIgMTQgMTI6MTQ6MDUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMpOiBTdG9yZSBCSVROVU0gdmFsdWVzCi0JaW4gdGhlIHRhYmxlIGluIG9uZSdzIGNvbXBsZW1lbnQgZm9ybSwgYXMgdGhleSBhcHBlYXIgaW4gdGhlCi0JYWN0dWFsIGluc3RydWN0aW9uLgotCSh0aWM4MF9zeW1ib2xfdG9fdmFsdWUpOiBVc2UgbWFjcm9zIHRvIGFjY2VzcyBwcmVkZWZpbmVkCi0Jc3ltYm9sIGZpZWxkcy4KLQkodGljODBfdmFsdWVfdG9fc3ltYm9sKTogRGl0dG8uCi0JKHRpYzgwX25leHRfcHJlZGVmaW5lZF9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfb3BlcmFuZF9iaXRudW0pOiBSZW1vdmUgY29kZSB0aGF0IGRpZAotCW9uZSdzIGNvbXBsZW1lbnQgZm9yIEJJVE5VTSB2YWx1ZXMuCi0KLVRodSBGZWIgMTMgMjE6NTY6NTEgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogUmVtb3ZlIDggYml0IGNoYXJhY3RlcnMuICBVcGRhdGUgdG8gbGF0ZXN0Ci0JZ2NjIHJlbGVhc2UuCi0KLVRodSBGZWIgMTMgMjA6NDE6MjIgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQWRkIHN3YmVnIHBzZXVkby1pbnN0cnVjdGlvbi4KLQotVGh1IEZlYiAxMyAxNjozMDowMiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtb3BjLmMgKElNTTE2X1BDUkVMKTogVGhpcyBpcyBhIHNpZ25lZCBvcGVyYW5kLgotCShJTU0yNF9QQ1JFTCk6IExpa2V3aXNlLgotCi1UaHUgRmViIDEzIDEzOjI4OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfbWlwczE2X2luc25fYXJnKTogVXNlIG1lbWFkZHIgLSAyIGFzIHRoZSBiYXNlCi0JYWRkcmVzcyBmb3IgYW4gZXh0ZW5kZWQgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24gdGhhdCBpcyBub3QgYQotCWJyYW5jaC4KLQotV2VkIEZlYiAxMiAxMjoyNzo0MCAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9tNjhrKTogU2V0IGJ5dGVzX3Blcl9jaHVuayBhbmQKLQlieXRlc19wZXJfbGluZS4KLQotVHVlIEZlYiAxMSAxNjozNjozMSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX29wZXJhbmRzKTogRml4IHR5cG8gJysnIC0+ICd8Jy4KLQkodGljODBfb3Bjb2Rlcyk6IFNvcnQgZW50cmllcyBzbyB0aGF0IGxvbmcgaW1tZWRpYXRlIGZvcm1zCi0JY29tZSBhZnRlciBzaG9ydCBpbW1lZGlhdGUgZm9ybXMsIG1ha2luZyBpdCBlYXNpZXIgZm9yCi0JYXNzZW1ibGVyIHRvIHNlbGVjdCB0aGUgcmlnaHQgb25lIGZvciBhIGdpdmVuIG9wZXJhbmQuCi0KLVR1ZSBGZWIgMTEgMTU6MjY6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogU2V0IGJ5dGVzX3Blcl9jaHVuayBhbmQKLQlkaXNwbGF5X2VuZGlhbi4KLQkocHJpbnRfaW5zbl9taXBzMTYpOiBMaWtld2lzZS4KLQotTW9uIEZlYiAxMCAxMDoxMjo0MSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX3N5bWJvbF90b192YWx1ZSk6IENoYW5nZWQgdG8gYWNjZXB0Ci0JYSBzeW1ib2wgY2xhc3MgdGhhdCByZXN0cmljdHMgdHJhbnNsYXRpb24gdG8ganVzdCB0aGF0Ci0JY2xhc3MgKGdlbmVyYWwgcmVnaXN0ZXIsIGNvbmRpdGlvbiBjb2RlLCBldGMpLgotCi1UaHUgRmViICA2IDE3OjM0OjA5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3BlcmFuZHMpOiBBZGQgUkVHXzBfRSwgUkVHXzIyX0UsCi0JYW5kIFJFR19ERVNUX0UgZm9yIHJlZ2lzdGVyIG9wZXJhbmRzIHRoYXQgaGF2ZSB0byBiZQotCWFuIGV2ZW4gbnVtYmVyZWQgcmVnaXN0ZXIuICBBZGQgUkVHX0ZQQSBmb3Igb3BlcmFuZHMgdGhhdAotCWFyZSBvbmUgb2YgdGhlIGZsb2F0aW5nIHBvaW50IGFjY3VtdWxhdG9yIHJlZ2lzdGVycy4KLQlBZGQgVElDODBfT1BFUkFORF9NQVNLIHRvIGZsYWdzIGZvciBFTkRNQVNLIG9wZXJhbmQuCi0JKHRpYzgwX29wY29kZXMpOiBDaGFuZ2UgZW50cmllcyB0aGF0IG5lZWQgZXZlbiBudW1iZXJlZAotCXJlZ2lzdGVyIG9wZXJhbmRzIHRvIHVzZSB0aGUgbmV3IG9wZXJhbmQgdGFibGUgZW50cmllcy4KLQlBZGQgIm9yIiBlbnRyaWVzIHRoYXQgYXJlIGlkZW50aWNhbCB0byAib3IudHQiIGVudHJpZXMuCi0KLVdlZCBGZWIgIDUgMTE6MTI6NDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzMTYtb3BjLmM6IEFkZCBuZXcgY2FzZXMgb2YgZXhpdCBpbnN0cnVjdGlvbiBmb3IKLQlkaXNhc3NlbWJsZXIuCi0JKiBtaXBzLWRpcy5jIChwcmludF9taXBzMTZfaW5zbl9hcmcpOiBEaXNwbGF5IGZsb2F0aW5nIHBvaW50Ci0JcmVnaXN0ZXJzIGluIG9wZXJhbmRzIG9mIGV4aXQgaW5zdHJ1Y3Rpb24uICBQcmludCBgJCcgYmVmb3JlCi0JcmVnaXN0ZXIgbmFtZXMgaW4gb3BlcmFuZHMgb2YgZW50cnkgYW5kIGV4aXQgaW5zdHJ1Y3Rpb25zLgotCi1UaHUgSmFuIDMwIDE0OjA5OjAzIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfcHJlZGVmaW5lZF9zeW1ib2xzKTogVGFibGUgb2YgbmFtZS92YWx1ZQotCXBhaXJzIGZvciBhbGwgcHJlZGVmaW5lZCBzeW1ib2xzIHJlY29nbml6ZWQgYnkgdGhlIGFzc2VtYmxlci4KLQlBbHNvIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxpbmcgcm91dGluZXMuCi0JKHRpYzgwX3N5bWJvbF90b192YWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQkodGljODBfdmFsdWVfdG9fc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCSogdGljODAtZGlzLmMgKHByaW50X29wZXJhbmRfY29udHJvbF9yZWdpc3RlciwKLSAJcHJpbnRfb3BlcmFuZF9jb25kaXRpb25fY29kZSwgcHJpbnRfb3BlcmFuZF9iaXRudW0pOgotCVJlbW92ZSBwcml2YXRlIHRhYmxlcyBhbmQgdXNlIHRpYzgwX3ZhbHVlX3RvX3N5bWJvbCBmdW5jdGlvbi4KLQotVGh1IEphbiAzMCAxMTozMDo0NSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1kaXMuYyAocHJpbnRfb3BlcmFuZCk6IENoYW5nZSBhZGRyZXNzIHByaW50aW5nCi0JdG8gY29ycmVjdGx5IGhhbmRsZSBQQyB3cmFwcGluZy4gIEZpeGVzIFBSMTE0OTAuCi0KLVdlZCBKYW4gMjkgMDk6Mzk6MTcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLW9wYy5jIChtbjEwMjAwX29wZXJhbmRzKTogTWFrZSA4IGFuZCAxNiBiaXQgcGMtcmVsYXRpdmUKLQlicmFuY2hlcyByZWxheGFibGUuCi0KLVR1ZSBKYW4gMjggMTU6NTc6MzQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX21pcHMxNik6IFNldCBpbnNuX2luZm8gaW5mb3JtYXRpb24uCi0JKHByaW50X21pcHMxNl9pbnNuX2FyZyk6IExpa2V3aXNlLgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX21pcHMxNik6IEJldHRlciBoYW5kbGluZyBvZiBhbiBleHRlbmQKLSAJb3Bjb2RlIGZvbGxvd2VkIGJ5IGFuIGluc3RydWN0aW9uIHdoaWNoIGNhbiBub3QgYmUgZXh0ZW5kZWQuCi0KLUZyaSBKYW4gMjQgMTI6MDg6MjEgMTk5NyAgSi5ULiBDb25rbGluICA8anRjQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IENoYW5nZWQgb3BlcmFuZCBzcGVjaWZpZXIgZm9yIHRoZQotIAljb2xkZmlyZSBtb3ZlYiBpbnN0cnVjdGlvbiB0byBub3QgYWxsb3cgYW4gYWRkcmVzcyByZWdpc3RlciBhcwotIAlkZXN0aW5hdGlvbi4gIEFsdGhvdWdoIHRoZSBkb2N1bWVudGF0aW9uIGRvZXMgbm90IGluZGljYXRlIHRoYXQKLQl0aGlzIGlzIGludmFsaWQsIGV4cGVyaW1lbnRzIHVuY292ZXJlZCB1bmV4cGVjdGVkIGJlaGF2aW9yLgotCUFkZGVkIGEgY29tbWVudCBleHBsYWluaW5nIHRoZSBzaXR1YXRpb24uICBUaGFua3MgdG8gQW5kcmVhcwotCVNjaHdhYiBmb3IgcG9pbnRpbmcgdGhpcyBvdXQgdG8gbWUuCi0KLVdlZCBKYW4gMjIgMjA6MTM6NTEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGNvZGVzKTogRXhwYW5kIGNvbW1lbnQgdG8gbm90ZSB0aGF0IHRoZQotIAllbnRyaWVzIGFyZSBwcmVzb3J0ZWQgc28gdGhhdCBlbnRyaWVzIHdpdGggdGhlIHNhbWUgbW5lbW9uaWMgYXJlCi0JYWRqYWNlbnQgdG8gZWFjaCBvdGhlciBpbiB0aGUgdGFibGUuICBTb3J0IHRoZSBlbnRyaWVzIGZvciBlYWNoCi0JaW5zdHJ1Y3Rpb24gc28gdGhhdCB0aGlzIGlzIHRydWUuCi0KLU1vbiBKYW4gMjAgMTI6NDg6NTcgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstZGlzLmM6IEluY2x1ZGUgPGxpYmliZXJ0eS5oPi4KLQkocHJpbnRfaW5zbl9tNjhrKTogU29ydCB0aGUgb3Bjb2RlIHRhYmxlIG9uIHRoZSBtb3N0IHNpZ25pZmljYW50Ci0JbmliYmxlIG9mIHRoZSBvcGNvZGUuCi0KLVNhdCBKYW4gMTggMTU6MTU6MDUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLWRpcy5jICh0aWM4MF9vcGNvZGVzKTogQWRkICJ3cmNyIiwgInZtcHkiLCAidnJuZCIsCi0JInZzdWIiLCAidnN0IiwgInhub3IiLCBhbmQgInhvciIgaW5zdHJ1Y3Rpb25zLgotCShWX2ExKTogUmVuYW1lZCBmcm9tIFZfYSwgbXNiIG9mIGFjY3VtdWxhdG9yIHJlZyBudW1iZXIuCi0JKFZfYTApOiBBZGQgbWFjcm8sIGxzYiBvZiBhY2N1bXVsYXRvciByZWcgbnVtYmVyLgotCi1GcmkgSmFuIDE3IDE4OjI0OjMxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfaW5zbl90aWM4MCk6IEJyb2tlIGV4Y2Vzc2l2ZWx5IGxvbmcKLQlmdW5jdGlvbiB1cCBpbnRvIHNldmVyYWwgc21hbGxlciBvbmVzIGFuZCBhcnJhbmdlZCBmb3IKLQl0aGUgaW5zdHJ1Y3Rpb24gcHJpbnRpbmcgZnVuY3Rpb24gdG8gYmUgY2FsbGFibGUgcmVjdXJzaXZlbHkKLQl0byBwcmludCB2ZWN0b3IgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSBib3RoIGEgbG9hZCBhbmQgYQotCW1hdGggaW5zdHJ1Y3Rpb24gcGFja2VkIGludG8gYSBzaW5nbGUgb3Bjb2RlLgotCSogdGljODAtb3BjLmMgKHRpYzgwX29wY29kZXMpOiBFeHBhbmQgY29tbWVudCBmb3IgdmxkIG9wY29kZQotCXRvIGV4cGxhaW4gd2h5IGl0IGNvbWVzIGFmdGVyIHRoZSBvdGhlciB2ZWN0b3Igb3Bjb2Rlcy4KLQotRnJpIEphbiAxNyAxNjoxOToxNSAxOTk3ICBKLlQuIENvbmtsaW4gIDxqdGNAYmVhdXR5LmN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IGFkZCBiLCB3LCBvciBsIHNwZWNpZmllciB0byBjb2xkZmlyZQotCW1vdmUgaW5zbnMgdG8gaGFuZGxlIGltbWVkaWF0ZSBvcGVyYW5kcy4KLQotVGh1IEphbiAxNyAxNjoxOTowMCAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogRGVsZXRlIGR1cGxpY2F0ZSBlbnRyeSBmb3IgImNtcGlsIi4KLQlmaXggb3BlcmFuZCBtYXNrIGluIHRoZSAibW92ZW1sIiBlbnRyaWVzIGZvciB0aGUgY29sZGZpcmUuCi0KLVRodSBKYW4gMTYgMjA6NTQ6NDAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jIChWX2EsIFZfbSwgVl9TLCBWX1osIFZfcCwgT1BfViwgTUFTS19WKToKLQlOZXcgbWFjcm9zIGZvciBidWlsZGluZyB2ZWN0b3IgaW5zdHJ1Y3Rpb24gb3Bjb2Rlcy4KLQkodGljODBfb3Bjb2Rlcyk6IFJlbW92ZSBhbGwgdXNlcyBvZiBGTVRfU0ksIEZNVF9SRUcsIGFuZAotCUZNVF9MSSwgd2hpY2ggd2VyZSB1bnVzZWQuICBUaGUgZmllbGQgaXMgbm93IGEgZmxhZ3MgZmllbGQuCi0JUmVtb3ZlIHNvbWUgb3Bjb2RlcyB0aGF0IGFyZSBwb3NzaWJsZSwgYnV0IGlsbGVnYWwsIHN1Y2gKLQlhcyBsb25nIGltbWVkaWF0ZSBpbnN0cnVjdGlvbnMgd2l0aCBkb3VibGVzIGZvciBpbW1lZGlhdGUKLQl2YWx1ZXMuICBBZGQgInZhZGQiIGFuZCAidmxkIiBpbnN0cnVjdGlvbnMuCi0KLVdlZCBKYW4gMTUgMTg6NTk6NTEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGVyYW5kcyk6IFJlb3JkZXIgc29tZSB0YWJsZSBlbnRyaWVzIHRvIG1ha2UKLQl0aGUgb3JkZXIgbW9yZSBsb2dpY2FsLiAgTW92ZSB0aGUgc2hpZnQgYWxpYXMgaW5zdHJ1Y3Rpb25zICgicm90bCIsCi0JInNobCIsICJpbnMiLCAicm90ciIsICJleHR1IiwgImV4dHMiLCAic3JsIiwgYW5kICJzcmEiIHRvIGJlCi0gCWludGVyc3BlcnNlZCB3aXRoIHRoZSByZWd1bGFyIHNyLnggYW5kIHNsLnggaW5zdHJ1Y3Rpb25zLiAgQWRkCi0JYW5kIHRlc3QgbmV3IGluc3RydWN0aW9uIG9wY29kZXMgZm9yICJzbCIsICJzbGkiLCAic3IiLCAic3JpIiwgInN0IiwKLSAJInN1YiIsICJzdWJ1IiwgInN3Y3IiLCBhbmQgInRyYXAiLgotCi1UdWUgSmFuIDE0IDE5OjQyOjUwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAoT0ZGX1NTX1BDKTogUmVuYW1lZCBmcm9tIE9GRl9TUy4KLQkoT0ZGX1NMX1BDKTogUmVuYW1lZCBmcm9tIE9GRl9TTC4KLQkoT0ZGX1NTX0JSKTogTmV3IG9wZXJhbmQgdHlwZSBmb3IgYmFzZSByZWxhdGl2ZSBvcGVyYW5kLgotCShPRkZfU0xfQlIpOiBOZXcgb3BlcmFuZCB0eXBlIGZvciBiYXNlIHJlbGF0aXZlIG9wZXJhbmQuCi0JKFJFR19CQVNFKTogTmV3IG9wZXJhbmQgdHlwZSBmb3IgYmFzZSByZWdpc3RlciBvcGVyYW5kLgotCSh0aWM4MF9vcGNvZGVzKTogQWRkIGFuZCB0ZXN0ICJmbXB5IiwgImZybmRtIiwgImZybmRuIiwgImZybmRwIiwKLQkiZnJuZHoiLCAiZnNxcnQiLCAiZnN1YiIsICJpbGxvcDAiLCAiaWxsb3BGIiwgImlucyIsICJqc3IiLAotCSJsZCIsICJsZC51IiwgImxtbyIsICJvciIsICJyZGNyIiwgInJtbyIsICJyb3RsIiwgYW5kICJyb3RyIgotCWluc3RydWN0aW9ucy4KLQkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogUHJpbnQgb3Bjb2RlIG5hbWUgd2l0aCBmaXhlZCB3aWR0aAotIAkxMCBjaGFyIGZpZWxkLCBwYWRkZWQgd2l0aCBzcGFjZXMgb24gcmhzLCByYXRoZXIgdGhhbiBhIHN0cmluZwotIAlmb2xsb3dlZCBieSBhIHRhYi4gIFVzZSByZW5hbWVkIFRJQzgwX09QRVJBTkRfUENSRUwgZmxhZyBiaXQgcmF0aGVyCi0gCXRoYW4gb2xkIFRJQzgwX09QRVJBTkRfUkVMQVRJVkUuICBBZGQgc3VwcG9ydCBmb3IgbmV3Ci0JVElDODBfT1BFUkFORF9CQVNFUkVMIGZsYWcgYml0LgotCi1Nb24gSmFuIDEzIDE1OjU4OjU2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfaW5zbl90aWM4MCk6IFByaW50IGZsb2F0aW5nIHBvaW50IG9wZXJhbmRzCi0JYXMgZmxvYXRzLgotCSogdGljODAtb3BjLmMgKFNQRkkpOiBBZGQgc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludAotCWltbWVkaWF0ZSBvcGVyYW5kIHR5cGUuCi0JKFJPVEFURSk6IEFkZCByb3RhdGUgb3BlcmFuZCB0eXBlIGZvciBzaGlmdHMuCi0JKEVORE1BU0spOiBBZGQgZm9yIHNoaWZ0cy4KLQkobik6IE1hY3JvIGZvciB0aGUgJ24nIGJpdC4KLQkoaSk6IE1hY3JvIGZvciB0aGUgJ2knIGJpdC4KLQkoUEQpOiBNYWNybyBmb3IgdGhlICdQRCcgZmllbGQuCi0JKFAyKTogTWFjcm8gZm9yIHRoZSAnUDInIGZpZWxkLgotCShQMSk6IE1hY3JvIGZvciB0aGUgJ1AxJyBmaWVsZC4KLQkodGljODBfb3Bjb2Rlcyk6IEFkZCBlbnRyaWVzIGZvciAiZXh0cyIsICJleHR1IiwgImZhZGQiLAotCSJmY21wIiwgYW5kICJmZGl2Ii4KLQotTW9uIEphbiAgNiAxNTowNjo1NSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogTWFzayBvZmYgdW53YW50ZWQgYml0cyBhZnRlcgotCWFkZGluZyBpbiBjdXJyZW50IGFkZHJlc3MgZm9yIHBjLXJlbGF0aXZlIG9wZXJhbmRzLgotCi1Nb24gSmFuICA2IDEwOjU2OjI1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1kaXMuYyAoUl9TQ0FMRUQpOiBBZGQgbWFjcm8gdG8gdGVzdCBmb3IgIjpzIiBtb2RpZmllciBiaXQuCi0JKHByaW50X2luc25fdGljODApOiBJZiBSX1NDQUxFRCB0aGVuIHByaW50ICI6cyIgbW9kaWZpZXIgZm9yIG9wZXJhbmQuCi0JKiB0aWM4MC1vcGMuYyAoUkVHMCwgUkVHMjIsIFJFRzI3LCBTU09GRiwgTFNPRkYpOiBOYW1lcwotCWNoYW5nZWQgdG8gUkVHXzAsIFJFR18yMiwgUkVHX0RFU1QsIE9GRl9TUywgT0ZGX1NMIHJlc3BlY3RpdmVseS4KLQkoU0lDUiwgTElDUiwgUkVHTV9TSSwgUkVHTV9MSSk6IE5hbWVzIGNoYW5nZWQgdG8gQ1JfU0ksIENSX0xJLAotCVJFR19CQVNFX01fU0ksIFJFR19CQVNFX01fTEkgcmVzcGVjdGl2ZWx5LgotCShSRUdfU0NBTEVELCBMU0lfU0NBTEVEKTogTmV3IG9wZXJhbmQgdHlwZXMuCi0JKEUpOiBOZXcgbWFjcm8gZm9yICdFJyBiaXQgYXQgYml0IDI3LgotCSh0aWM4MF9vcGNvZGVzKTogQWRkIGFuZCB0ZXN0IGRsZCwgZGxkLnUsIGRzdCwgZXN0b3AsIGFuZCBldHJhcAotCW9wY29kZXMsIGluY2x1ZGluZyB0aGUgdmFyaW91cyBzaXplIGZsYXZvcnMgKGIsaCx3LGQpIGZvcgotCXRoZSBkaXJlY3QgbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zLgotCi1TdW4gSmFuICA1IDEyOjE4OjE0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1kaXMuYyAoTV9TSSwgTV9MSSk6IEFkZCBtYWNyb3MgdG8gdGVzdCBmb3IgIjptIiBtb2RpZmllciBiaXQKLSAJaW4gYW4gaW5zdHJ1Y3Rpb24uCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfaW5zbl90aWM4MCk6IENoYW5nZSBjb21tYSBhbmQgcGFyZW4gaGFuZGxpbmcuCi0gIAlVc2UgTV9TSSBhbmQgTV9MSSBtYWNyb3MgdG8gY2hlY2sgZm9yICI6bSIgbW9kaWZpZXIgZm9yIEdQUiBvcGVyYW5kcy4KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGVyYW5kcyk6IEFkZCBSRUdNX1NJIGFuZCBSRUdNX0xJIG9wZXJhbmRzLgotCShGLCBNX1JFRywgTV9MSSwgTV9TSSwgU1pfUkVHLCBTWl9MSSwgU1pfU0ksIEQsIFMpOiBOZXcJYml0LXR3aWRkbGVycy4KLQkoTUFTS19MSV9NLCBNQVNLX1NJX00sIE1BU0tfUkVHX00pOiBSZW1vdmUgYW5kIHJlcGxhY2UgaW4gb3Bjb2RlCi0JbWFza3Mgd2l0aCAiTUFTS18qICYgfk1fKiIgdG8gZ2V0IHRoZSBNIGJpdCByZXNldC4KLQkodGljODBfb3Bjb2Rlcyk6IEFkZCBic3IsIGJzci5hLCBjbW5kLCBjbXAsIGRjYWNoZWMsIGFuZCBkY2FjaGVmLgotCi1TYXQgSmFuICA0IDE5OjA1OjA1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfaW5zbl90aWM4MCk6IFByaW50IFRJQzgwX09QRVJBTkRfUkVMQVRJVkUKLQljb3JyZWN0bHkuICBBZGQgc3VwcG9ydCBmb3IgcHJpbnRpbmcgVElDODBfT1BFUkFORF9CSVROVU0gYW5kCi0JVElDODBfT1BFUkFORF9DQywgYW5kIFRJQzgwX09QRVJBTkRfQ1Igb3BlcmFuZHMgaW4gc3ltYm9saWMKLQlmb3JtLgotCSogdGljODAtb3BjLmMgKHRpYzgwX29wZXJhbmRzKTogQWRkIFNTT0ZGLCBMU09GRiwgQklUTlVNLAotCUNDLCBTSUNSLCBhbmQgTElDUiB0YWJsZSBlbnRyaWVzLgotCSh0aWM4MF9vcGNvZGVzKTogQWRkIGFuZCB0ZXN0ICJub3AiLCAiYnIiLCAiYmJvIiwgImJieiIsCi0JImJjbmQiLCBhbmQgImJyY3IiIG9wY29kZXMuCi0KLUZyaSBKYW4gIDMgMTg6MzI6MTEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGVyYW5kcyk6IE1ha2UgY29tbWVudCBtYXRjaCB0aGUKLQlhY3R1YWwgZmllbGRzIChubyBzaGlmdCBmaWVsZCkuCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IERvY3VtZW50IHdoeSB0aGlzIGNhbm5vdCBiZSAiY29uc3QiLgotCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBSZXBsYWNlIGFib3J0IHN0dWIgd2l0aCBhCi0JcGFydGlhbCBpbXBsZW1lbnRhdGlvbiwgd29yayBpbiBwcm9ncmVzcy4KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGVyYW5kcyk6IEJlZ2luIGNvbnN0cnVjdGlvbiBvcGVyYW5kcyB0YWJsZS4KLQkodGljODBfb3Bjb2Rlcyk6IENvbnRpbnVlIHBvcHVsYXRpbmcgb3Bjb2RlcyB0YWJsZSBhbmQgc3RhcnQKLQlmaWxsaW5nIGluIHRoZSBvcGVyYW5kIGluZGljZXMuCi0JKHRpYzgwX251bV9vcGNvZGVzKTogQWRkIHRoaXMuCi0KLUZyaSBKYW4gIDMgMTI6MTM6NTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBBZGQgI0IgY2FzZSBmb3IgbW92ZXEuCi0KLVRodSBKYW4gIDIgMTI6MTQ6MjkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IE1ha2Ugc3VyZSBhbGwgdmFyaWFibGVzIGFyZSBpbml0aWFsaXplZAotCWJlZm9yZSB0aGV5IGFyZSB1c2VkLgotCi1UdWUgRGVjIDMxIDEyOjIwOjM4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogUHV0IGN1cmx5LWJyYWNlcyBhcm91bmQgb3BlcmFuZHMKLQlmb3IgImJyZWFrcG9pbnQiIGluc3RydWN0aW9uLgotCi1UdWUgRGVjIDMxIDE1OjM4OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9DRkxBR1MpOiBBZGQgLURfR05VX1NPVVJDRS4KLQkoZGVwKTogVXNlIEFMTF9DRkxBR1MgcmF0aGVyIHRoYW4gQ0ZMQUdTLgotCi1UdWUgRGVjIDMxIDE1OjA5OjE2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAoRDhfezYsN30pOiBTZXQgVjg1MF9PUEVSQU5EX0FESlVTVF9TSE9SVF9NRU1PUlkKLQlmbGFnLgotCi1Nb24gRGVjIDMwIDE3OjAyOjExIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobTY4ay1vcGMubywgYWxwaGEtb3BjLm8pOiBSZW1vdmUgZGlzLWFzbS5oIGRlcGVuZGVuY3kuCi0JKHRpYzgwLWRpcy5vLCB0aWM4MC1vcGMubyk6IEFkZCBydWxlcyBwZXIgY29tbWVudCBpbiBNYWtlZmlsZS5pbi4KLQotTW9uIERlYyAzMCAxMTozODowMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMxNi1vcGMuYzogQWRkICJhYnMiLgotCi1TdW4gRGVjIDI5IDEwOjU4OjIyIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIHRpYzgwLWRpcy5vIGFuZCB0aWM4MC1vcGMuby4KLQkqIGRpc2Fzc2VtYmxlLmMgKEFSQ0hfdGljODApOiBEZWZpbmUgaWYgQVJDSF9hbGwgaXMgZGVmaW5lZC4KLQkoZGlzYXNzZW1ibGVyKTogQWRkIGJmZF9hcmNoX3RpYzgwIHN1cHBvcnQgdG8gc2V0IGRpc2Fzc2VtYmxlCi0gCXRvIHByaW50X2luc25fdGljODAuCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfaW5zbl90aWM4MCk6IEFkZCBzdHViLgotCi1GcmkgRGVjIDI3IDIyOjMwOjU3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGFyY2ggaW4gJHNlbGFyY2hzKTogQWRkIGJmZF90aWM4MF9hcmNoIGVudHJ5LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYuCi0JKiB0aWM4MC1kaXMuYzogQWRkIGZpbGUuCi0JKiB0aWM4MC1vcGMuYzogQWRkIGZpbGUuCi0KLUZyaSBEZWMgMjAgMTQ6MzA6MTkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6ICBBZGQgY3JbMC0xNV0sIGRwYywgZHBzdywgbGluay4KLQotTW9uIERlYyAxNiAxMzowMDoxNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtb3BjLmMgKG1uMTAyMDBfb3BlcmFuZHMpOiBBZGQgU0lNTTE2Ti4KLQkobW4xMDIwMF9vcGNvZGVzKTogVXNlIGl0IGZvciBzb21lIGxvZ2ljYWxzIGFuZCBidHN0IGluc25zLgotCUFkZCAiYnJlYWsiIGFuZCAidHJhcCIgaW5zdHJ1Y3Rpb25zLgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBBZGQgImJyZWFrIiBpbnN0cnVjdGlvbi4KLQotCSogbW4xMDIwMC1vcGMuYzogQWRkIHBzZXVkby1vcHMgZm9yICJtb3YgKGFuKSxhbSIgYW5kICJtb3YgYW4sKGFtKSIuCi0KLVNhdCBEZWMgMTQgMjI6MzY6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9taXBzMTZfaW5zbl9hcmcpOiBUaGUgYmFzZSBhZGRyZXNzIG9mIGEgUEMKLQlyZWxhdGl2ZSBsb2FkIG9yIGFkZCBub3cgZGVwZW5kcyB1cG9uIHdoZXRoZXIgdGhlIGluc3RydWN0aW9uIGlzCi0JaW4gYSBkZWxheSBzbG90LgotCi1XZWQgRGVjIDExIDA5OjIzOjQ2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1kaXMuYzogRmluaXNoIHdyaXRpbmcgZGlzYXNzZW1ibGVyLgotCSogbW4xMDIwMC1vcGMuYyAobW4xMDIwMF9vcGNvZGVzKTogRml4IG1hc2sgZm9yICJtb3YgaW1tOCxkbiIuCi0JRml4IG1hc2sgZm9yICJqbXAgKGFuKSIuCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlLCBwcmludF9pbnNuX21uMTAzMDApOiBDb3JyZW50bHkKLQloYW5kbGUgZW5kaWFubmVzcyBpc3N1ZXMgZm9yIG1uMTAzMDAuCi0KLQkqIG1uMTAyMDAtb3BjLmMgKG1uMTAyMDBfb3Bjb2Rlcyk6IEZpeCBvcGVyYW5kcyBmb3IgIm1vdmIgZG0sKGFuKSIuCi0KLVR1ZSBEZWMgMTAgMTI6MDg6MDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLW9wYy5jIChtbjEwMjAwX29wY29kZXMpOiAibW92IGltbTgsZDAiIGlzIGEgZm9ybWF0IDIKLQlpbnN0cnVjdGlvbi4gIEZpeCBvcGNvZGUgZmllbGQgZm9yICJtb3ZiIChpbW0yNCksZG4iLgotCi0JKiBtbjEwMjAwLW9wYy5jIChtbjEwMjAwX29wZXJhbmRzKTogRml4IGluc2VydGlvbiBwb3NpdGlvbgotCWZvciBESSBvcGVyYW5kLgotCi1Nb24gRGVjICA5IDE2OjQyOjQzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1vcGMuYzogQ3JlYXRlIG1uMTAyMDAgb3Bjb2RlIHRhYmxlLgotCSogbW4xMDIwMC1kaXMuYzogRmxlc2ggb3V0IG1uMTAyMDAgZGlzYXNzZW1ibGVyLiAgTm90IHJlYWR5LAotCWJ1dCBtb3ZpbmcgYWxvbmcgbmljZWx5LgotCi1TdW4gRGVjICA4IDA0OjI4OjMxIDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6ICBBZGQgbWlwczE2LW9wYy5vLgotCi1GcmkgRGVjICA2IDE2OjQ3OjQwIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0ByaGluby5jeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBSZXZlcnQgY2hhbmdlIHRvIHVzZSA8IGFuZCA+Ci0Jc3BlY2lmaWVycyBmb3IgZm1vdmVtKiBpbnN0cnVjdGlvbnMuCi0KLUZyaSBEZWMgIDYgMTQ6NDg6MDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFJlbW92ZSAnJCcgcmVnaXN0ZXIgcHJlZml4aW5nLgotCi1GcmkgRGVjICA2IDE3OjM0OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwczE2LW9wYy5jOiBDaGFuZ2Ugb3Bjb2RlIGZvciBlbnRyeS9leGl0IHRvIGF2b2lkIGNvbmZsaWN0aW5nCi0Jd2l0aCBkc3JsLgotCi1GcmkgRGVjICA2IDE0OjQ4OjA5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYzogQWRkIHNvbWUgY29tbWVudHMgZXhwbGFpbmluZyB0aGUgdmFyaW91cwotIAlvcGVyYW5kcyBhbmQgc3VjaC4KLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBGaXggbWlub3IgZ2NjIC1XYWxsIHdhcm5pbmdzLgotCi1UaHUgRGVjICA1IDEyOjA5OjQ4IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgbmV3IDwgYW5kID4gb3BlcmFuZAotCXNwZWNpZmllcnMuCi0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IFNpbXBsaWZ5IHRhYmxlIGJ5IHVzaW5nIDwgYW5kID4KLQlvcGVyYW5kIHNwZWNpZmllcnMgaW4gZm1vdm0qIGluc3RydWN0aW9ucy4KLQotV2VkIERlYyAgNCAxNDo1MjoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAoaW5zZXJ0X2xpKTogR2l2ZSBhbiBlcnJvciBpZiB0aGUgb2Zmc2V0IGhhcyB0aGUgdHdvCi0JbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBzZXQuCi0KLVdlZCBOb3YgMjcgMTM6MDk6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX21pcHMxNik6IFNlcGFyYXRlIHRoZSBpbnN0cnVjdGlvbiBmcm9tCi0JdGhlIGFyZ3VtZW50cyB3aXRoIGEgdGFiLCBub3QgYSBzcGFjZS4KLQotVHVlIE5vdiAyNiAxMzoyNDoxNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2FzZW1ibGUpOiBGaW5pc2ggY29udmVyc2lvbiB0byAnJCcgYXMKLQlyZWdpc3RlciBwcmVmaXguCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEZpeCBtYXNrIGZpZWxkIGZvcgotCW1vdiBhbSwoaW1tMzIsc3ApLgotCi1UdWUgTm92IDI2IDEwOjUzOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMi4KLQotCUFkZCBzdXBwb3J0IGZvciBtaXBzMTYgKDE2IGJpdCBNSVBTIGltcGxlbWVudGF0aW9uKToKLQkqIG1pcHMxNi1vcGMuYzogTmV3IGZpbGUuCi0JKiBtaXBzLWRpcy5jOiBJbmNsdWRlICJlbGYtYmZkLmgiIGFuZCAiZWxmL21pcHMuaCIuCi0JKG1pcHMxNl9yZWdfbmFtZXMpOiBOZXcgc3RhdGljIGFycmF5LgotCShwcmludF9pbnNuX2JpZ19taXBzKTogVXNlIHByaW50X2luc25fbWlwczE2IGluIDE2IGJpdCBtb2RlIG9yCi0JYWZ0ZXIgc2VlaW5nIGEgMTYgYml0IHN5bWJvbC4KLQkocHJpbnRfaW5zbl9saXR0bGVfbWlwcyk6IExpa2V3aXNlLgotCShwcmludF9pbnNuX21pcHMxNik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHByaW50X21pcHMxNl9pbnNuX2FyZyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBtaXBzLW9wYy5jOiBBZGQgamFseCBpbnN0cnVjdGlvbi4KLQkqIE1ha2VmaWxlLmluIChtaXBzMTYtb3BjLm8pOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluOiBVc2UgbWlwczE2LW9wYy5vIGZvciBiZmRfbWlwc19hcmNoLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gTm92IDI1IDE2OjE1OjE3IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBTaW1wbGlmeSB0YWJsZSBieSB1c2luZyA8IGFuZCA+Ci0gCW9wZXJhbmQgc3BlY2lmaWVycyBpbiAqc2F2ZSwgKnJlc3RvcmUgYW5kIG1vdmVtKiBpbnN0cnVjdGlvbnMuCi0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEZpeCBtb3ZlIGFuZCBtb3ZlbSBpbnN0cnVjdGlvbnMgZm9yCi0gCXRoZSBjb2xkZmlyZS4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogVGhlIGNvbGRmaXJlIChtY2Y1MjAwKSBjYW4gb25seSB1c2UKLSAJcmVnaXN0ZXIgb3BlcmFuZHMgZm9yIGltbWVkaWF0ZSBhcml0aG1ldGljLCBub3QsIG5lZywgbmVneCwgYW5kCi0Jc2V0IGFjY29yZGluZyB0byBjb25kaXRpb24gaW5zdHJ1Y3Rpb25zLgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBDb25zaXN0YW50bHkgVXNlICJzIiBhcyB0aGUgc3RvcmFnZQotIAlzcGVjaWZpZXIgb2YgdGhlIGVmZmVjdGl2ZS1hZGRyZXNzIG9wZXJhbmQgaW4gaW1tZWRpYXRlIGZvcm1zIG9mCi0gCWFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zLiAgVGhlIHNwZWNpZmllciBmb3IgdGhlIGltbWVkaWF0ZSBvcGVyYW5kCi0gCW5vdGVzIGhvdyBhbmQgd2hlcmUgdGhlIGNvbnN0YW50IHdpbGwgYmUgc3RvcmVkLgotCi1Nb24gTm92IDI1IDExOjE3OjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogUmVtb3ZlIHJlZHVuZGFudCAibGNjIgotCW9wY29kZS4KLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBVc2UgJyQnIGluc3RlYWQgb2YgJyUnIGZvcgotCXJlZ2lzdGVyIHByZWZpeC4KLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBQcmVmaXggcmVnaXN0ZXJzIHdpdGggJyUnLgotCi1XZWQgTm92IDIwIDEwOjM3OjEzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBIYW5kbGUgcmVnaXN0ZXIgbGlzdHMuCi0KLQkqIG1uMTAzMDAtb3BjLmM6IEZpeCBoYW5kbGluZyBvZiByZWdpc3RlciBsaXN0IG9wZXJhbmQgZm9yCi0JImNhbGwiLCAicmV0IiwgYW5kICJyZXRzIiBpbnN0cnVjdGlvbnMuCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogUHJpbnQgUEMtcmVsYXRpdmUgYW5kIG1lbW9yeQotCWFkZHJlc3NlcyBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuCi0JKiBtbjEwMzAwLW9wYy5jOiBEaXN0aW5ndWlzaCBiZXR3ZWVuIGFic29sdXRlIG1lbW9yeSBhZGRyZXNzZXMsCi0JcGMtcmVsYXRpdmUgb2Zmc2V0cyAmIHJhbmRvbSBpbW1lZGlhdGVzLgotCi0JKiBtbjEwMzAwLWRpcy5jIChwcmludF9pbnNuX21uMTAzMDApOiBGaXggZmV0Y2ggb2YgbGFzdCBieXRlCi0JaW4gNyBieXRlIGluc25zLgotCShkaXNhc3NlbWJsZSk6IEhhbmRsZSBTUExJVCBhbmQgRVhURU5ERUQgb3BlcmFuZHMuCi0KLVR1ZSBOb3YgMTkgMTM6MzM6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLWRpcy5jOiBSb3VnaCBjdXQgYXQgcHJpbnRpbmcgc29tZSBvcGVyYW5kcy4KLQotCSogbW4xMDMwMC1kaXMuYzogU3RhcnQgd29ya2luZyBvbiBkaXNhc3NlbWJsZXIgc3VwcG9ydC4KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEZpeCBtYXNrcyBvbiBzZXZlcmFsIGluc25zLgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogQWRkICJSRUdTIiBmb3IgYSByZWdpc3RlcgotCWxpc3QuCi0JKG1uMTAzMDBfb3Bjb2Rlcyk6IFVzZSBSRUdTIGZvciByZWdpc3RlciBsaXN0IGluICJtb3ZtIiBpbnN0cnVjdGlvbnMuCi0KLU1vbiBOb3YgMTggMTU6MjA6MzUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChkMTB2X29wY29kZXMpOiBBZGQzIHNldHMgdGhlIGNhcnJ5LgotCi1GcmkgTm92IDE1IDEzOjQzOjE5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogRGVtYW5kIHBhcmVucyBhcm91bmQKLQlyZWdpc3RlciBhcmd1bWVudCBpcyBjYWxscyBhbmQgam1wIGluc3RydWN0aW9ucy4KLQotVGh1IE5vdiAgNyAwMDoyNjowNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IFVzZSBETjAxIGZvciBwdXR4IGFuZAotCWdldHggb3BlcmFuZC4gIEZpeCBvcGNvZGUgZm9yIG11bHF1IGltbSxkbi4KLQotV2VkIE5vdiAgNiAxMzo0MjozMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3BlcmFuZHMpOiBIaWphY2sgImJpdHMiIGZpZWxkCi0JaW4gTU4xMDMwMF9PUEVSQU5EX1NQTElUIG9wZXJhbmRzIGZvciBob3cgbWFueSBiaXRzCi0JYXBwZWFyIGluIHRoZSBiYXNpYyBpbnNuIHdvcmQuICBBZGQgSU1NMzJfSElHSDI0LAotCUlNTTMyX0hJR0gyNF9MT1dTSElGVDgsIElNTThFX1NISUZUOC4KLQkobW4xMDMwMF9vcGNvZGVzKTogVXNlIG5ldyBvcGVyYW5kcyBhcyBuZWVkZWQuCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3BlcmFuZHMpOiBBZGQgSU1NMzJfTE9XU0hJRlQ4Ci0JZm9yIGJzZXQsIGJjbHIsIGJ0c3QgaW5zdHJ1Y3Rpb25zLgotCShtbjEwMzAwX29wY29kZXMpOiBVc2UgbmV3IElNTTMyX0xPV1NISUZUOCBhcyBuZWVkZWQuCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3BlcmFuZHMpOiBSZW1vdmUgbWFueSByZWR1bmRhbnQKLQlvcGVyYW5kcy4gIFVwZGF0ZSBvcGNvZGUgdGFibGUgYXMgYXBwcm9wcmlhdGUuCi0JKElNTTMyKTogQWRkIE1OMTAzMDBfT1BFUkFORF9TUExJVCBmbGFnLgotCShtbjEwMzAwX29wY29kZXMpOiBGaXggc2luZ2xlIGJpdCBlcnJvciBpbiBtb3YgaW1tMzIsZG4gaW5zbi4KLQotVHVlIE5vdiAgNSAxMzoyNjo1OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3BlcmFuZHMpOiBBZGQgRE4yLCBETTIsIEFOMiwgQU0yCi0Jb3BlcmFuZHMgKGZvciBpbmRleGVkIGxvYWQvc3RvcmVzKS4gIEZpeCBiaXRwb3MgZm9yIERJCi0Jb3BlcmFuZC4gIEFkZCBTTjhOX1NISUZUOCwgSU1NOF9TSElGVDgsIGFuZCBEMTZfU0hJRlQgZm9yIHRoZQotCWZldyBpbnN0cnVjdGlvbnMgdGhhdCBpbnNlcnQgaW1tZWRpYXRlcy9kaXNwbGFjZW1lbnRzIGluIHRoZQotCW1pZGRsZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBBZGQgSU1NOEUgZm9yIDggYml0IGltbWVkaWF0ZSBpbgotCXRoZSBleHRlbmRlZCBwYXJ0IG9mIGFuIGluc3RydWN0aW9uLgotCShtbjEwMzAwX29wZXJhbmRzKTogVXNlIG5ldyBvcGNvZGVzIGFzIGFwcHJvcHJpYXRlLgotCi1UdWUgTm92ICA1IDEwOjMwOjUxIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChkMTB2X29wY29kZXMpOiBEZWNsYXJlIHRoZSB0cmFwIGluc3RydWN0aW9uCi0gCXNlcXVlbnRpYWwgc28gdGhlIGFzc2VtYmxlciBuZXZlciBwYXJhbGxlbGl6ZXMgaXQgd2l0aAotCW90aGVyIGluc3RydWN0aW9ucy4KLQotTW9uIE5vdiAgNCAxMjo1MDo0MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3BlcmFuZHMpOiBBZGQgRE4wMSBhbmQgQU4wMSBmb3IKLQlhIGRhdGEvYWRkcmVzcyByZWdpc3RlciB0aGF0IGFwcGVhcnMgaW4gcmVnaXN0ZXIgZmllbGQgMAotCWFuZCByZWdpc3RlciBmaWVsZCAxLgotCShtbjEwMzAwX29wY29kZXMpOiBVc2UgRE4wMSBhbmQgQU4wMSBmb3IgbW92L2NtcCBpbW04LEROL0FOCi0KLUZyaSBOb3YgIDEgMTA6Mjk6MTEgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogVXNlIG5ldyBOT1BBTCBtYXNrIGZvcgotCXN0YW5kYXJkIGRpc2Fzc2VtYmx5LgotCi0JKiBhbHBoYS1vcGMuYyAoYWxwaGFfb3BlcmFuZHMpOiBSZWFycmFuZ2UgZmxhZ3Mgc2xvdC4KLQkoYWxwaGFfb3Bjb2Rlcyk6IEFkZCBuZXcgQldYLCBDSVgsIGFuZCBNQVggaW5zdHJ1Y3Rpb25zLgotCVJlY2F0ZWdvcml6ZSBQQUxjb2RlIGluc3RydWN0aW9ucy4KLQotV2VkIE9jdCAzMCAxNjo0Njo1OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEFkZCByZWxheGluZyAiamJyIi4KLQotVHVlIE9jdCAyOSAxNjozMDoyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKF9wcmludF9pbnNuX21pcHMpOiBEb24ndCBwcmludCBhIHRyYWlsaW5nIHRhYiBpZgotCXRoZXJlIGFyZSBubyBvcGVyYW5kIHR5cGVzLgotCi1UdWUgT2N0IDI5IDEyOjIyOjIxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAoRDlfUkVMQVgpOiBSZW5hbWVkIGZyb20gRDksIGFsbCByZWZlcmVuY2VzCi0JY2hhbmdlZC4KLQkodjg1MF9vcGVyYW5kcyk6IE1ha2Ugc3VyZSBEMjIgaW1tZWRpYXRlbHkgZm9sbG93cyBEOV9SRUxBWC4KLQotRnJpIE9jdCAyNSAxMjoxMjo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKHByaW50X2luc25feDg2KTogU2V0IGluZm8tPmJ5dGVzX3Blcl9saW5lIHRvIDUuCi0KLVRodSBPY3QgMjQgMTc6NTM6NTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRfZDhfNik6IEZpeCBvcGVyYW5kIGluc2VydGlvbiBmb3Igc2xkLncKLQlhbmQgc3N0LncgaW5zdHJ1Y3Rpb25zLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBBZGQgImpDQyIgaW5zdHJ1Y3Rpb25zIChhbGlhc2VzIGZvcgotCSJiQ0MiaW5zdHJ1Y3Rpb25zKS4KLQotVGh1IE9jdCAyNCAxNzoyMToyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKF9wcmludF9pbnNuX21pcHMpOiBVc2UgYSB0YWIgYmV0d2VlbiB0aGUgaW5zdHJ1Y3Rpb24KLQlhbmQgdGhlIGFyZ3VtZW50cy4KLQotVHVlIE9jdCAyMiAyMzozMjo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAoUFBDUFdSMik6IERlZmluZS4KLQkocG93ZXJwY19vcGNvZGVzKTogVXNlIFBQQ1BXUjIgZm9yIGZzcXJ0LCByYXRoZXIgdGhhbiBkdXBsaWNhdGluZwotCWl0LgotCi1GcmkgT2N0IDExIDE2OjAzOjQ5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogRml4IHR5cG8gaW4gb3Bjb2RlCi0JZmllbGQgZm9yIG1vdmh1IGluc3RydWN0aW9uLgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IEZvciBWODUwX09QRVJBTkRfU0lHTkVEIG9wZXJhbmRzLAotCWNhc3QgdmFsdWUgdG8gImxvbmciIG5vdCAic2lnbmVkIGxvbmciIHRvIGtlZXAgaHB1eDEwCi0JY29tcGlsZXIgcXVpZXQuCi0KLVRodSBPY3QgMTAgMTA6MjU6NTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBGaXggdHlwbyBpbiBvcGNvZGUgZmllbGQKLQlmb3IgbW92IChhYnMxNiksRE4uCi0KLQkqIG1uMTAzMDAtb3BjLmMgKEZNVCopOiBSZW1vdmUgZGVmaW5pdGlvbnMuCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEZpeCBkZXN0aW5hdGlvbiByZWdpc3RlcgotCWZvciBzaGlmdC1ieS1yZWdpc3RlciBvcGNvZGVzLgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogQnJlYWsgRE4sIERNLCBBTiwgQU0KLQlpbnRvIFtBRF1bTU5dWzAxXSBmb3IgZW5jb2RpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSByZWdpc3RlcgotCWluIHRoZSBvcGNvZGUuCi0KLVdlZCBPY3QgIDkgMTE6MTk6MjYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBBZGQgImV4dGVuZGVkIiBpbnN0cnVjdGlvbnMsCi0JInB1dHgiLCAiZ2V0eCIsICJtdWxxIiwgIm11bHF1IiwgInNhdDE2IiwgInNhdDI0IiwgImJzY2giLgotCi1UdWUgT2N0ICA4IDExOjU1OjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IFJlbW92ZSAiUkVHUyIgb3BlcmFuZC4KLQlGaXggdmFyaW91cyB0eXBvcy4gIEFkZCAiUEFSRU4iIG9wZXJhbmQuCi0JKE1FTSwgTUVNMik6IERlZmluZS4KLQkobW4xMDMwMF9vcGNvZGVzKTogU3Vycm91bmQgYWxsIG1lbW9yeSBhZGRyZXNzZXMgd2l0aCAiUEFSRU4iCi0Jb3BlcmFuZHMuICBGaXggc2V2ZXJhbCB0eXBvcy4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogRml4IHR5cG9zIGluIHllc3RlcmRheSdzCi0JY2hhbmdlcy4KLQotTW9uIE9jdCAgNyAxNjo0ODo0NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKEZNVF9YWCk6IFJlbnVtYmVyIHN0YXJ0aW5nIGF0IG9uZS4KLQkobW4xMDMwMF9vcGVyYW5kcyk6IFJvdWdoIGN1dC4gIEVub3VnaCB0byBwYXJzZSAibW92IiBpbnN0cnVjdGlvbnMKLQlhdCB0aGlzIHRpbWUuCi0JKG1uMTAzMDBfb3Bjb2Rlcyk6IEJyZWFrIG9wY29kZSBmb3JtYXQgb3V0IGludG8gaXRzIG93biBmaWVsZC4KLQlVcGRhdGUgbWFueSBvcGVyYW5kIGZpZWxkcyB0byBkZWFsIHdpdGggc2lnbmVkIHZzIHVuc2lnbmVkCi0JaXNzdWVzLiAgRml4IG9uZSBvciB0d28gdHlwb3MgaW4gdGhlICJtb3YiIGluc3RydWN0aW9uCi0Jb3Bjb2RlLCBtYXNrIGFuZC9vciBvcGVyYW5kIGZpZWxkcy4KLQotTW9uIE9jdCAgNyAxMTozOTo0OSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1vcGMuYyAocGx1c2hhKTogUHJlZmVyIGVuY29kaW5nIGZvciBtNjgwNDB1cCwgaW4gY2FzZQotCW02ODg1MSB3YXNuJ3QgcmVzZXQuCi0KLVRodSBPY3QgIDMgMTc6MTc6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBBZGQgb3Bjb2RlICYgbWFza3MgZm9yCi0JYWxsIG9wY29kZXMuICBWZXJ5IHJvdWdoIGN1dCBhdCBvcGVyYW5kcyBmb3IgYWxsIG9wY29kZXMuCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IFN0YXJ0IGZsZXNoaW5nIG91dCB0aGUKLQlvcGNvZGUgdGFibGUuCi0KLVRodSBPY3QgIDMgMTA6MDY6MDcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLW9wYy5jLCBtbjEwMzAwLW9wYy5jOiBOZXcgZmlsZXMuCi0JKiBtbjEwMjAwLWRpcy5jLCBtbjEwMzAwLWRpcy5jOiBOZXcgZmlsZXMuCi0JKiBtbjEweDAwLW9wYy5jLCBtbjEweDAwLWRpcy5jOiBEZWxldGVkLgotCSogZGlzYXNzZW1ibGUuYzogQnJlYWsgbW4xMHgwMCBzdXBwb3J0IGludG8gMTAyMDAgYW5kIDEwMzAwCi0Jc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLVRodSBPY3QgIDMgMTU6NTk6MTIgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKE1PU1RMWUNMRUFOKTogTW92ZSBjb25maWcubG9nIHRvIGRpc3RjbGVhbi4KLQotV2VkIE9jdCAgMiAyMzoyODo0MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTB4MDAtb3BjLmMsIG1uMTB4MDAtZGlzLmM6IE5ldyBmaWxlcyBmb3IgTWF0c3VzaGl0YQotCU1OMTB4MDAgcHJvY2Vzc29ycy4KLQkqIGRpc2Fzc2VtYmxlIChBUkNIX21uMTB4MDApOiBEZWZpbmUuCi0JKGRpc2Fzc2VtYmxlcik6IEhhbmRsZSBiZmRfYXJjaF9tbjEweDAwLgotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgYmZkX21uMTB4MDBfYXJjaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotVHVlIE9jdCAgMSAxMDo0OToxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKG9wX3J0bik6IENoYW5nZSB0byBiZSBhIHBvaW50ZXIuICBBZGp1c3QgdXNlcwotCWFjY29yZGluZ2x5LiAgRG9uJ3QgZGVjbGFyZSBmdW5jdGlvbnMgdXNpbmcgb3BfcnRuLgotCi1GcmkgU2VwIDI3IDE4OjI4OjU5IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogIEFkZCBtZW1hZGRyIGFyZ3VtZW50LiAgUmUtYXJyYW5nZQotCXBhcmFtcyB0byBiZSBtb3JlIHN0YW5kYXJkLgotCSogKGRpc2Fzc2VtYmxlKTogIFByaW50IGFic29sdXRlIGFkZHJlc3NlcyBhbmQgc3ltYm9saWMgbmFtZXMgZm9yCi0JYnJhbmNoIGFuZCBqdW1wIHRhcmdldHMuCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmQpOiAgQWRkIGRpc3BsYWNlbWVudCBmbGFnIHRvIDkgYW5kIDIyCi0JYml0IG9wZXJhbmRzLgotCSogKHY4NTBfb3Bjb2Rlcyk6ICBBZGQgYnJlYWtwb2ludCBpbnNuLgotCi1Nb24gU2VwIDIzIDEyOjMyOjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogTW92ZSB0aGUgZm1vdmVteCBkYXRhIHJlZ2lzdGVyIGNhc2VzIGJlZm9yZSB0aGUKLSAJb3RoZXIgY2FzZXMsIHNvIHRoYXQgdGhleSBnZXQgcmVjb2duaXplZCBiZWZvcmUgdGhlIGRhdGEgcmVnaXN0ZXIKLSAJZG9lcyBnZXRzIHRyZWF0ZWQgYXMgYSBkZWdlbmVyYXRlIHJlZ2lzdGVyIGxpc3QuCi0KLVR1ZSBTZXAgMTcgMTI6MDY6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgYSBjYXNlIGZvciAiZGl2IiBhbmQgImRpdnUiIHdpdGggdHdvIHJlZ2lzdGVycwotCWFuZCBhIGRlc3RpbmF0aW9uIG9mICQwLgotCi1UdWUgU2VwIDEwIDE2OjEyOjM5IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBydGwuY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBBZGQgcHJvdG90eXBlLgotCShfcHJpbnRfaW5zbl9taXBzKTogRGl0dG8uCi0KLU1vbiBTZXAgIDkgMTQ6MjY6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IFByaW50IGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVycyBhcwotIAkkZmNjTi4KLQotVHVlIFNlcCAgMyAxMjowOTo0NiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IEFkZCBzZXR1dywgc2V0c3csIHNldHguCi0KLVR1ZSBTZXAgIDMgMTI6MDU6MjUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IE1ha2Ugc3RhdGljLiAgUHJvdmlkZSBwcm90b3R5cGUuCi0KLVN1biBTZXAgIDEgMjI6MzA6NDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRfZDksIGluc2VydF9kMjIpOiBGaXggYm91bmRhcnkgY2FzZQotCWluIHJhbmdlIGNoZWNrcy4KLQotU2F0IEF1ZyAzMSAwMToyNzoyNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogSGFuZGxlIGluc2VydGlvbiBvZiAnLCcsICdbJyBhbmQKLQknXScgY2hhcmFjdGVycyBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLgotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzOiBSZW1vdmUgc2l6ZSBmaWVsZCBmcm9tIGFsbCBvcGNvZGVzLgotCUFkZCAibWVtb3AiIGZpZWxkIHRvIGFsbCBvcGNvZGVzIChmb3IgdGhlIGRpc2Fzc2VtYmxlcikuCi0JUmVvcmRlciBvcGNvZGVzIHNvIHRoYXQgIm5vcCIgY29tZXMgYmVmb3JlICJtb3YiIGFuZCAianIiCi0JY29tZXMgYmVmb3JlICJqYXJsIi4KLQotCSogdjg1MC1kaXMuYyAocHJpbnRfaW5zbl92ODUwKTogRml4IHR5cG8gaW4gbGFzdCBjaGFuZ2UuCi0KLQkqIHY4NTAtZGlzLmMgKHByaW50X2luc25fdjg1MCk6IFByb3Blcmx5IGhhbmRsZSBkaXNhc3NlbWJsaW5nCi0JYSB0d28gYnl0ZSBpbnNuIGF0IHRoZSBlbmQgb2YgYSBtZW1vcnkgcmVnaW9uIHdoZW4gdGhlIG1lbW9yeQotCXJlZ2lvbidzIHNpemUgaXMgb25seSB0d28gYnl0ZSBhbGlnbmVkLgotCi0JKiB2ODUwLWRpcy5jICh2ODUwX2NjX25hbWVzKTogRml4IHN0dXBpZCB0aGlua29zLgotCi0JKiB2ODUwLWRpcy5jICh2ODUwX3JlZ19uYW1lcyk6IERlZmluZS4KLQkodjg1MF9zcmVnX25hbWVzLCB2ODUwX2NjX25hbWVzKTogTGlrZXdpc2UuCi0JKGRpc2Fzc2VtYmxlKTogVmVyeSByb3VnaCBjdXQgYXQgcHJpbnRpbmcgb3BlcmFuZHMgKHVuZm9ybWF0dGVkKS4KLQotCSogdjg1MC1vcGMuYyAoQk9QX01BU0spOiBGaXguCi0JKHY4NTBfb3Bjb2Rlcyk6IEZpeCBtYXNrIGZvciBqYXJsIGFuZCBqci4KLQotCSogdjg1MC1kaXMuYzogTmV3IGZpbGUuICBTa2VsZXRvbiBmb3IgZGlzYXNzZW1ibGVyIHN1cHBvcnQuCi0JKiBNYWtlZmlsZS5pbiBSZW1vdmUgdjg1MCByZWZlcmVuY2VzLCB0aGV5J3JlIG5vdCBuZWVkZWQgaGVyZS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHY4NTAtZGlzLm8gd2hlbiBidWlsZGluZyB2ODUwIHRvb2xjaGFpbnMuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiBDYWxsIHY4NTAgZGlzYXNzZW1ibGVyLgotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRfZDhfNywgZXh0cmFjdF9kOF83KTogTmV3IGZ1bmN0aW9ucy4KLQkoaW5zZXJ0X2Q4XzYsIGV4dHJhY3RfZDhfNik6IE5ldyBmdW5jdGlvbnMuCi0JKHY4NTBfb3BlcmFuZHMpOiBSZW5hbWUgRDdTIHRvIEQ3OyBvcGVyYW5kIGZvciBENyBpcyB1bnNpZ25lZC4KLQlSZW5hbWUgRDggdG8gRDhfNywgdXNlIHtpbnNlcnQsZXh0cmFjdH1fZDhfNyByb3V0aW5lcy4KLQlBZGQgRDhfNi4KLQkoSUY0QSwgSUY0Qik6IFVzZSAiRDciIGluc3RlYWQgb2YgIkQ3UyIuCi0JKElGNEMsIElGNEQpOiBVc2UgIkQ4XzciIGluc3RlYWQgb2YgIkQ4Ii4KLQkoSUY0RSwgSUY0Rik6IE5ldy4gIFVzZSAiRDhfNiIuCi0JKHY4NTBfb3Bjb2Rlcyk6IFVzZSBJRjRBL0lGNEIgZm9yIHNsZC5iL3NzdC5iLiAgVXNlIElGNEMvSUY0RCBmb3IKLQlzbGQuaC9zc3QuaC4gIFVzZSBJRjRFL0lGNEYgZm9yIHNsZC53L3NzdC53LgotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRfZDE2XzE1LCBleHRyYWN0X2QxNl8xNSk6IE5ldyBmdW5jdGlvbnMuCi0JKHY4NTBfb3BlcmFuZHMpOiBDaGFuZ2UgRDE2IHRvIEQxNl8xNSwgdXNlIHNwZWNpYWwgaW5zZXJ0L2V4dHJhY3QKLQlyb3V0aW5lcy4gIE5ldyBuZXcgRDE2IHRoYXQgdXNlcyB0aGUgZ2VuZXJpYyBpbnNlcnQvZXh0cmFjdCBjb2RlLgotCShJRjdBLCBJRjdCKTogVXNlIEQxNl8xNS4KLQkoSUY3QywgSUY3RCk6IE5ldy4gIFVzZSBEMTYuCi0JKHY4NTBfb3Bjb2Rlcyk6IFVzZSBJRjdDIGFuZCBJRjdEIGZvciBsZC5iIGFuZCBzdC5iLgotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRfZDksIGluc2VydF9kMjIpOiBTbGlnaHRseSBpbXByb3ZlIGVycm9yCi0JbWVzc2FnZS4gIElzc3VlIGFuIGVycm9yIGlmIHRoZSBicmFuY2ggb2Zmc2V0IGlzIG9kZC4KLQotCSogdjg1MC1vcGMuYzogQWRkIG5vdGVzIGFib3V0IG5lZWRpbmcgc3BlY2lhbCBpbnNlcnQvZXh0cmFjdAotCWZvciBhbGwgdGhlIGxvYWQvc3RvcmUgaW5zbnMsIGV4Y2VwdCAibGQuYiIgYW5kICJzdC5iIi4KLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2QyMiwgZXh0cmFjdF9kMjIpOiBOZXcgZnVuY3Rpb25zLgotCSh2ODUwX29wZXJhbmRzKTogVXNlIGluc2VydF9kMjIgYW5kIGV4dHJhY3RfZDIyIGZvcgotCUQyMiBvcGVyYW5kcy4KLQkoaW5zZXJ0X2Q5KTogRml4IHJhbmdlIGNoZWNrLgotCi1GcmkgQXVnIDMwIDE4OjAxOjAyIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogQWRkIFY4NTBfT1BFUkFORF9TSUdORUQgZmxhZwotCWFuZCBzZXQgYml0cyBmaWVsZCB0byBEOSBhbmQgRDIyIG9wZXJhbmRzLgotCi1UaHUgQXVnIDI5IDExOjEwOjQ2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IERlZmluZSBTUjIgb3BlcmFuZC4KLQkodjg1MF9vcGNvZGVzKTogImxkc3IiIHVzZXMgUjEsU1IyLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBGaXggb3Bjb2RlIHNwZWNzIGZvcgotCXNsZC53LCBzc3QuYiwgc3N0LmgsIHNzdC53LCBhbmQgbm9wLgotCi1XZWQgQXVnIDI4IDE1OjU1OjQzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogQWRkIG51bGwgb3Bjb2RlIHRvIG1hcmsgdGhlCi0JZW5kIG9mIHRoZSBvcGNvZGUgdGFibGUuCi0KLU1vbiBBdWcgMjYgMTM6MzU6NTMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IEFkZGVkIHJlZ2lzdGVyIHBhaXJzLAotCSJyMC1yMSIsICJyMi1yMyIsIGV0Yy4KLQotRnJpIEF1ZyAyMyAwMDoyNzowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBNYWtlIEkxNiBiZSBhIHNpZ25lZCBvcGVyYW5kLgotCUNyZWF0ZSBJMTZVIGZvciBhbiB1bnNpZ25lZCAxNmJpdCBtbWVkaWF0ZSBvcGVyYW5kLgotCSh2ODUwX29wY29kZXMpOiBVc2UgSTE2VSBmb3IgIm9yaSIsICJhbmRpIiBhbmQgInhvcmkiLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogRGVmaW5lIEVQIG9wZXJhbmQuCi0JKElGNEEsIElGNEIsIElGNEMsIElGNEQpOiBVc2UgRVAuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEZpeCBvcGNvZGUgbnVtYmVycyBmb3IgIm1vdiIKLQl3aXRoIGltbWVkaWF0ZSBvcGVyYW5kLCAibW92aGkiLiAgVHdlYWsgImxkc3IiLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBHZXQgbGQuW2Jod10gYW5kIHN0LltiaHddCi0JY29ycmVjdC4gIEdldCBzbGQuW2Jod10gYW5kIHNzdC5bYmh3XSBjbG9zZXIuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiAibm90IiBpcyBhIHR3byBieXRlIGluc24KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogQ29ycmVjdCBiaXQgcGF0dGVybiBmb3Igc2V0Zi4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEQxNiBpbnNlcnRzIGF0IG9mZnNldCAxNiEKLQotCSogdjg1MC1vcGMuYyAodHdvKTogR2V0IG9yZGVyIG9mIHdvcmRzIGNvcnJlY3QuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBJMTYgaW5zZXJ0cyBhdCBvZmZzZXQgMTYhCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBBZGQgIlNSMSIgYW5kICJTUjIiIGZvciBzeXN0ZW0KLQlyZWdpc3RlciBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG9wZXJhbmRzLgotCSh2ODUwX29wY29kZXMpOiBVc2UgU1IxIGFuZCBTUjIgZm9yICJsZHNyIiBhbmQgInN0c3IiLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBGaXggdGhpbmtvIGluICJqbXAiIG9wY29kZS4gIEZpeAotCXNhbWUgdGhpbmtvIGluICJ0cmFwIiBvcGNvZGUuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEFkZCBpbml0aWFsaXplciBmb3Igc2l6ZSBmaWVsZAotCW9uIGFsbCBvcGNvZGVzLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogRDYgLT4gRFM3LiAgUmVmZXJlbmNlcyBjaGFuZ2VkLgotCUFkZCBEOCBmb3IgOC1iaXQgdW5zaWduZWQgZmllbGQgaW4gc2hvcnQgbG9hZC9zdG9yZSBpbnNucy4KLQkoSUY0QSwgSUY0RCk6IFRoZXNlIGJvdGggbmVlZCB0d28gcmVnaXN0ZXJzLgotCShJRjRDLCBJRjREKTogRGVmaW5lLiAgVXNlIDgtYml0IHVuc2lnbmVkIGZpZWxkLgotCSh2ODUwX29wY29kZXMpOiBGb3IgInNsZC5oIiwgInNsZC53IiwgInNzdC5oIiwgInNzdC53IiwgdXNlCi0JSUY0QyAmIElGNEQuICBGb3IgInRyYXAiIHVzZSBJNVUsIG5vdCBJNS4gIEFkZCBJRjEgb3BlcmFuZAotCWZvciAibGRzciIgYW5kICJzdHNyIi4KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiAzLWJpdCBpbW1lZGlhdGUgZm9yIGJpdCBpbnNucwotCWlzIHVuc2lnbmVkLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBDb3JyZWN0IHNob3J0IHN0b3JlIGhhbGYgKHNzdC5oKSBhbmQKLQlzaG9ydCBzdG9yZSB3b3JkIChzc3QudykuCi0KLVRodSBBdWcgMjIgMTY6NTc6MjcgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogQWRkZWQgaW5zZXJ0IGFuZCBleHRyYWN0IGZpZWxkcywKLSAJcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHRoYXQgaGFuZGxlIHVudXN1YWwgb3BlcmFuZCBlbmNvZGluZ3MuCi0KLVRodSBBdWcgMjIgMDE6MDU6MjQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBFbmFibGUgInRyYXAiLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBGaXggb3JkZXIgb2YgZGlzcGxhY2VtZW50Ci0JYW5kIHJlZ2lzdGVyIGZvciAic2V0MSIsICJjbHIxIiwgIm5vdDEiLCBhbmQgInRzdDEiLgotCi1XZWQgQXVnIDIxIDE4OjQ2OjI2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEFkZCAiQjMiIHN1cHBvcnQuCi0JKHY4NTBfb3Bjb2Rlcyk6IEZpeCBhbmQgZW5hYmxlICJzZXQxIiwgImNscjEiLCAibm90MSIKLQlhbmQgInRzdDEiLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiAiam1wIiBoYXMgb25seSBhbiBSMSBvcGVyYW5kLgotCi0JKiB2ODUwLW9wYy5jOiBDbG9zZSB1bnRlcm1pbmF0ZWQgY29tbWVudC4KLQotV2VkIEF1ZyAyMSAxNzozMToyNiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEFkZCBmbGFncyBmaWVsZC4KLSAJKHY4NTBfb3Bjb2Rlcyk6IGFkZCBtb3ZlIG9wY29kZXMuCi0KLVR1ZSBBdWcgMjAgMTQ6NDE6MDMgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgdjg1MC1vcGMuby4KLQkqIGNvbmZpZ3VyZTogKGJmZF92ODUwdl9hcmNoKSBBZGQgbmV3IGNhc2UuCi0JKiBjb25maWd1cmUuaW46IChiZmRfdjg1MF9hcmNoKSBBZGQgbmV3IGNhc2UuCi0JKiB2ODUwLW9wYy5jOiBOZXcgZmlsZS4KLQotTW9uIEF1ZyAxOSAxNToyMTozOCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IEhhbmRsZSBsaXR0bGUgZW5kaWFuIHNwYXJjcy4KLQotVGh1IEF1ZyAxNSAxMzoxNDo0MyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYzogQWRkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gdGhlIG9wY29kZQotCXRhYmxlIHRvIGhlbHAgZGV0ZXJtaW5pbmUgd2hpY2ggaW5zdHJ1Y3Rpb25zIGNhbiBiZSBkb25lCi0JaW4gcGFyYWxsZWwuCi0KLVRodSBBdWcgMTUgMTM6MTE6MTMgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IFVwZGF0ZSBlZGl0aW5nIG9mIGluY2x1ZGUgcGF0aG5hbWVzIHRvIGJlCi0JbW9yZSBnZW5lcmFsLgotCi1UaHUgQXVnIDE1IDE2OjI4OjQxIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogYXJtLW9wYy5oOiBBZGRlZCAiYngiIGluc3RydWN0aW9uIGRlZmluaXRpb24uCi0KLVdlZCBBdWcgMTQgMTc6MDA6MDQgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLW9wYy5jIChFVjRFWFRIV0lOREVYKTogRmllbGQgd2lkdGggc2hvdWxkIGJlIDggbm90IDUuCi0KLU1vbiBBdWcgMTIgMTQ6MzA6MzcgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKGQxMHZfb3Bjb2Rlcyk6IE1pbm9yIGZpeGVzIHRvIGFkZGkgYW5kIGJsLmwuCi0KLUZyaSBBdWcgIDkgMTM6MjE6NTkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKGQxMHZfb3Bjb2Rlcyk6IENvcnJlY3QgJ212JyB1bml0IGVudHJ5IHRvIEVJVEhFUi4KLQotVGh1IEF1ZyAgOCAxMjo0Mzo1MiAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBVcGRhdGUgZm9yIGFscGhhLW9wYyBjaGFuZ2VzLgotCi1XZWQgQXVnICA3IDExOjU1OjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYyAocHJpbnRfaW5zbl9pMzg2KTogQWN0dWFsbHkgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlLgotIAkoT05FLCBPUF9PTkUpOiAjaWZkZWYgb3V0OyBub3QgdXNlZC4KLQotRnJpIEF1ZyAgMiAxNzo0NzowMyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAoZDEwdl9vcGNvZGVzKTogQWRkZWQgMiBhY2N1bXVsYXRvciBzdWIgaW5zdHJ1Y3Rpb25zLgotCUNoYW5nZWQgc3ViaSBvcGVyYW5kIHR5cGUgdG8gdHJlYXQgMCBhcyAxNi4KLQotV2VkIEp1bCAzMSAxNjoyMTo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IEFkZCBjcHVzaGwgZm9yIHRoZSBtY2Y1MjAwLiAgRnJvbSBLZW4gUm9zZQotCTxyb3NlQG5ldGNvbS5jb20+LgotCi1XZWQgSnVsIDMxIDE0OjM5OjI3IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogYXJtLW9wYy5oOiAoYXJtX29wY29kZXMpOiBBZGRlZCBoYWxmd29yZCBhbmQgc2lnbi1leHRlbnNpb24KLSAJbWVtb3J5IHRyYW5zZmVyIGluc3RydWN0aW9ucy4gQWRkIG5ldyBmb3JtYXQgc3RyaW5nIGVudHJpZXMgJWggYW5kICVzLgotCSogYXJtLWRpcy5jOiAocHJpbnRfaW5zbl9hcm0pOiBQcm92aWRlIGRlY29kaW5nIG9mIHRoZSBuZXcKLQlmb3JtYXRzICVoIGFuZCAlcy4KLQotRnJpIEp1bCAyNiAxMTo0NTowNCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAoZDEwdl9vcGVyYW5kcyk6IEFkZGVkIFVOVU00UzsgYSA0LWJpdCBhY2N1bXVsYXRvciBzaGlmdC4KLSAJKGQxMHZfb3Bjb2Rlcyk6IE1vZGlmaWVkIGFjY3VtdWxhdG9yIHNoaWZ0IGluc3RydWN0aW9ucyB0byB1c2UgVU5VTTRTLgotCi1GcmkgSnVsIDI2IDE0OjAxOjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGFfb3NmKTogUmVtb3ZlLgotCShwcmludF9pbnNuX2FscGhhX3Ztcyk6IFJlbW92ZS4KLQkocHJpbnRfaW5zbl9hbHBoYSk6IE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4gIENob3NlIHRoZSByZWdpc3RlcgotCW5hbWVzIGJhc2VkIG9uIGluZm8tPmZsYXZvdXIuCi0JKiBkaXNhc3NlbWJsZS5jOiBBbHdheXMgcmV0dXJuIHByaW50X2luc25fYWxwaGEgZm9yIHRoZSBhbHBoYS4KLQotVGh1IEp1bCAyNSAxNToyNDoxNyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1kaXMuYyAoZGlzX2xvbmcpOiBIYW5kbGUgdW5rbm93biBvcGNvZGVzLgotCi1UaHUgSnVsIDI1IDEyOjA4OjA5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jOiBDaGFuZ2VzIHRvIHN1cHBvcnQgc2lnbmVkIGFuZCB1bnNpZ25lZCBudW1iZXJzLgotCUFsbCBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIHRoYXQgaGF2ZSBsb25nIGFuZCBzaG9ydCBmb3JtcwotCW5vdyBlbmQgaW4gIi5sIiBvciAiLnMiLiAgRGl2cyBhZGRlZC4KLQkqIGQxMHYtZGlzLmM6IENoYW5nZXMgdG8gc3VwcG9ydCBzaWduZWQgYW5kIHVuc2lnbmVkIG51bWJlcnMuCi0KLVR1ZSBKdWwgMjMgMTE6MDI6NTMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtZGlzLmM6IENoYW5nZSBhbGwgZnVuY3Rpb25zIHRvIHVzZSBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMuCi0KLU1vbiBKdWwgMjIgMTU6Mzg6NTMgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IE1ha2Ugb3Bjb2RlIG1hc2tzIGZvciB0aGUgQ29sZEZpcmUKLSAJbW92ZSBjY3Ivc3IgaW5zbnMgbW9yZSBzdHJpY3Qgc28gdGhhdCB0aGUgZGlzYXNzZW1ibGVyIG9ubHkKLSAJc2VsZWN0cyB0aGVtIHdoZW4gdGhlIGFkZHJlc3NpbmcgbW9kZSBpcyBkYXRhIHJlZ2lzdGVyLgotCi1Nb24gSnVsIDIyIDExOjI1OjI0IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotICAgICAgICAqIGQxMHYtb3BjLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6ICBEZWNsYXJlLgotICAgICAgICAqIGQxMHYtZGlzLmMgKHByaW50X29wZXJhbmQpOiBOb3cgdXNlcyBwcmVfZGVmaW5lZF9yZWdpc3RlcnMKLSAgICAgICAgdG8gcGljayBhIGJldHRlciBuYW1lIGZvciB0aGUgcmVnaXN0ZXJzLgotCi1Nb24gSnVsIDIyIDEzOjQ3OjIzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmM6IEZpeCBvcGNvZGUgdmFsdWVzIGZvciBmcGFjazE2LCBhbmQgZnBhY2tmaXguICBGaXgKLQlvcGVyYW5kcyBmb3IgZmV4cGFuZCBhbmQgZnBtZXJnZS4gIEZyb20gQ2hyaXN0aWFuIEt1ZWhua2UKLQk8Q2hyaXN0aWFuLkt1ZWhua2VAYXJiaS5pbmZvcm1hdGlrLnVuaS1vbGRlbmJ1cmcuZGU+LgotCi1Nb24gSnVsIDIyIDEzOjE3OjA2IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IE5vIGxvbmdlciB0aGUgdXNlci12aXNpYmxlCi0JcHJpbnQgcm91dGluZS4gIFRha2UgbmV3IHJlZ25hbWVzIGFuZCBjcHVtYXNrIGFyZ3VtZW50cy4KLQlLaWxsIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBub25zZW5zZS4KLQkocHJpbnRfaW5zbl9hbHBoYV9vc2YpOiBOZXcgZnVuY3Rpb24uICBEbyBPU0YvMSBzdHlsZSByZWduYW1lcy4KLQkocHJpbnRfaW5zbl9hbHBoYV92bXMpOiBOZXcgZnVuY3Rpb24uICBEbyBWTVMgc3R5bGUgcmVnbmFtZXMuCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiBUZXN0IGJmZCBmbGF2b3VyIHRvIHBpY2sKLQliZXR3ZWVuIE9TRiBhbmQgVk1TIHJvdXRpbmVzLiAgRGVmYXVsdCB0byBPU0YuCi0KLVRodSBKdWwgMTggMTc6MTk6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfU1VCU1QgKElOU1RBTExfU0hMSUIpLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBVc2UgQElOU1RBTExfU0hMSUJALgotCi1XZWQgSnVsIDE3IDE0OjM5OjA1IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IChiZmRfZDEwdl9hcmNoKSBBZGQgbmV3IGNhc2UuCi0JKiBjb25maWd1cmUuaW46IChiZmRfZDEwdl9hcmNoKSBBZGQgbmV3IGNhc2UuCi0JKiBkMTB2LWRpcy5jOiBOZXcgZmlsZS4KLQkqIGQxMHYtb3BjLmM6IE5ldyBmaWxlLgotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKSBBZGQgZW50cnkgZm9yIGQxMHYuCi0KLVdlZCBKdWwgMTcgMTA6MTI6MDUgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBGaXggYnVncyBpbiBjb2xkZmlyZSBpbnNucyByZWxhdGluZwotIAl0byBiY2MsIHRyYXBmbCwgc3VieGwsIGFuZCB3ZGRhdGEgZGlzY292ZXJlZCBieSBBbmRyZWFzIFNjaHdhYi4KLQotTW9uIEp1bCAxNSAxNjo1OTo1NSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBpMzg2LWRpcy5jOiAgR2V0IHJpZCBvZiBwcmludF9pbnNuX2k4MDg2LiAgVXNlIGluZm8ubWFjaCB0bwotCWRpc3Rpbmd1aXNoIGJldHdlZW4gdmFyaWFudHMgb2YgdGhlIGluc3RydWN0aW9uIHNldC4KLQkqIHNwYXJjLWRpcy5jOiAgR2V0IHJpZCBvZiBwcmludF9pbnNuX3NwYXJjbGl0ZS4gIFVzZSBpbmZvLm1hY2ggdG8KLQlkaXN0aW5ndWlzaCBiZXR3ZWVuIHZhcmlhbnRzIG9mIHRoZSBpbnN0cnVjdGlvbiBzZXQuCi0KLUZyaSBKdWwgMTIgMTA6MTI6MDEgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni1kaXMuYyAocHJpbnRfaW5zbl9pODA4Nik6ICBOZXcgcm91dGluZSB0byBkaXNhc3NlbWJsZSB1c2luZwotCXRoZSA4MDg2IGluc3RydWN0aW9uIHNldC4KLQkqIGkzODYtZGlzLmM6ICBHZW5lcmFsIGNsZWFudXBzLiAgTWFrZSBtb3N0IHRoaW5ncyBzdGF0aWMuICBBZGQKLQlwcm90b3R5cGVzLiAgR2V0IHJpZCBvZiBzdGF0aWMgdmFyaWFibGVzIGFmbGFncyBhbmQgZGZsYWdzLiAgUGFzcwotCXRoZW0gYXMgYXJncyAodG8gYWxtb3N0IGV2ZXJ5dGhpbmcpLgotCi1UaHUgSnVsIDExIDExOjU4OjQ0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IEhhbmRsZSBtYWNyZWdzIGluIGxkbWFjIGluc25zLgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogSGFuZGxlICJsZG0ubCIgYW5kICJzdG0ubCIuCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiAiYWJzIiBpcyBpbXBsaWNpdGx5IHR3bwotCWlmIHRoZSBuZXh0IGFyZyBpcyBtYXJrZWQgd2l0aCBTUkNfSU5fRFNULiAgR3Jvc3MuCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBQcmludCAiZXhyIiB3aGVuCi0Jd2UncmUgbG9va2luZyBmb3IgYW5kIGZpbmQgRVhSLgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogV2UgZG9uJ3QgaGF2ZSBhIG1hdGNoCi0JaWYgd2UncmUgbG9va2luZyBmb3IgS0JJVCBhbmQgd2UgZG9uJ3QgZmluZCBpdC4KLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IE1hc2sgb2ZmIHVud2FudGVkIGJpdHMKLQlmb3IgTF8zIGFuZCBMXzIuCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBEb24ndCBzZXQgcGxlbiBmb3IKLQkzYml0IGltbWVkaWF0ZSBvcGVyYW5kcy4KLQotVHVlIEp1bCAgOSAxMDo1NToyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIFJlbGVhc2VkIGJpbnV0aWxzIDIuNy4KLQotCSogYWxwaGEtb3BjLmM6IEFkZCBuZXcgY2FzZSBvZiAibW92Ii4gIEZyb20gS2xhdXMgS2FlbXBmCi0JPGtrYWVtcGZAcHJvZ2lzLmFjLW5ldC5kZT4uCi0KLVRodSBKdWwgIDQgMTE6NDI6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhbHBoYS1vcGMuYzogQ29ycmVjdCBzZWNvbmQgY2FzZSBvZiAibW92IiB0byB1c2UgT1BSTC4KLQotV2VkIEp1bCAgMyAxNjowMzo0NyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyY2xpdGUpOiAgTmV3IHJvdXRpbmUgdG8gcHJpbnQKLQlzcGFyY2xpdGUgaW5zdHJ1Y3Rpb25zLgotCi1XZWQgSnVsICAzIDE0OjIxOjE4IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQWRkIGNvbGRmaXJlIHN1cHBvcnQuCi0KLUZyaSBKdW4gMjggMTU6NTM6NTEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKGFzaV90YWJsZSk6IEFkZCAjQVNJX04sICNBU0lfTl9MLCAjQVNJX05VQ0xFVVMsCi0JI0FTSV9OVUNMRVVTX0xJVFRMRS4gIFJlbmFtZSAjQVNJX0FTX0lGX1VTRVJfe1BSSU1BUlksU0VDT05EQVJZfV9MCi0JdG8gI0FTSV9BU19JRl9VU0VSX3tQUklNQVJZLFNFQ09OREFSWX1fTElUVExFLgotCi1UdWUgSnVuIDI1IDIyOjU4OjMxIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyKToKLQlVc2UgYXV0b2NvbmYtc2V0IHZhbHVlcy4KLQkoZG9jZGlyLCBvbGRpbmNsdWRlZGlyKTogUmVtb3ZlZC4KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KLQotRnJpIEp1biAyMSAxMzo1MzozNiAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYWxwaGEtb3BjLmM6IE5ldyBmaWxlLgotCSogYWxwaGEtb3BjLmg6IFJlbW92ZS4KLQkqIGFscGhhLWRpcy5jOiBDb21wbGV0ZSByZXdyaXRlIHRvIHVzZSBuZXcgb3Bjb2RlIHRhYmxlLgotCSogY29uZmlndXJlLmluOiBGb3IgYmZkX2FscGhhX2FyY2gsIHVzZSBhbHBoYS1vcGMuby4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTAuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIGFscGhhLW9wYy5vLgotCShhbHBoYS1kaXMubyk6IERlcGVuZCB1cG9uICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCwgbm90Ci0JYWxwaGEtb3BjLmguCi0JKGFscGhhLW9wYy5vKTogTmV3IHRhcmdldC4KLQotV2VkIEp1biAxOSAxNTo1NToxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBpLgotCVNldCBpbW1fYWRkZWRfdG9fcnMxIGV2ZW4gaWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcmVnaXN0ZXIKLQlhcmUgbm90IHRoZSBzYW1lLgotCi0JKiBzcGFyYy1vcGMuYzogQWRkIHNvbWUgdHdvIG9wZXJhbmQgZm9ybXMgb2YgdGhlIHdyIGluc3RydWN0aW9uLgotCi1UdWUgSnVuIDE4IDE1OjU4OjI3IDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogUmVuYW1lICJobW9kZSIgYXJndW1lbnQKLQl0byBqdXN0ICJtb2RlIi4KLQotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogSGFuZGxlIEg4L1MuCi0JKiBoODMwMC1kaXMuYyAocHJpbnRfaW5zbl9oODMwMHMpOiBOZXcgZnVuY3Rpb24gZm9yIEg4L1MuCi0KLVR1ZSBKdW4gMTggMTg6MDY6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYzogQWRkIGJlcS90ZXEgYXMgYWxpYXNlcyBmb3IgYmUvdGUuCi0KLQkqIHBwYy1vcGMuYzogRml4IGZjbXBvIG9wY29kZS4gIEZyb20gU2VyZ2VpIFN0ZXNoZW5rbwotCTxzZXJnZWlAbXNpbC5zcHMubW90LmNvbT4uCi0KLVR1ZSBKdW4gMTggMTU6MDg6NTQgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogTmV3IGZpbGUuCi0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogUHJpbnQgbGRhIHJhLGxpdChyeikgYXMgbW92LgotCi1Nb24gSnVuIDEwIDE4OjUwOjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IEFsd2F5cyBwcmludCBBQlM4TUVNIHdpdGggOjgsCi0JcmVnYXJkbGVzcyBvZiBwbGVuLgotCi1UdWUgSnVuICA0IDA5OjE1OjUzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKE9QX09GRik6IENhbGwgYXBwZW5kX3ByZWZpeC4KLQotVGh1IE1heSAyMyAxNToxODoyMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAoaW5zdHJ1Y3Rpb24gZW5jb2RpbmcgbWFjcm9zKTogQWRkIGV4cGxpY2l0IGNhc3RzIHRvCi0JdW5zaWduZWQgbG9uZyB0byBzaWxlbmNlIGEgd2FybmluZyBmcm9tIHRoZSBTb2xhcmlzIFBvd2VyUEMKLQljb21waWxlci4KLQotVGh1IEFwciAyNSAxOTozMzozMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IEFkZCB1bHRyYXNwYXJjIHZpcyBleHRlbnNpb25zLgotCi1Nb24gQXByIDIyIDE3OjEyOjM1IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAYmx1ZXMuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKFhfSU1NLFhfU0lNTSk6IE5ldyBtYWNyb3MuCi0JKFhfSU1NMTMpOiBEZWxldGUuCi0JKHByaW50X2luc25fc3BhcmMpOiBNZXJnZSBjYXNlcyBpLEksaiB0b2dldGhlci4gIE5ldyBjYXNlcyBYLFkuCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IFVzZSBYIGZvciA1IGJpdCBzaGlmdCBjb25zdGFudHMsCi0JWSBmb3IgNiBiaXQgc2hpZnQgY29uc3RhbnRzLiAgUmV3cml0ZSBlbnRyaWVzIGZvciBjcmRjeHQsIGN3cmN4dCwKLQljcHVzaCwgY3B1c2hhLCBjcHVsbCBzcGFyY2xldCBpbnNucy4KLQotV2VkIEFwciAxNyAxNDoyMDoyMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAoY29tcHV0ZV9hcmNoX21hc2spOiBSZXBsYWNlIEFOU0kgc3R5bGUgZGVmIHdpdGggSyZSLgotCi1UaHUgQXByIDExIDE3OjMwOjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmM6IFNldCBGX0ZCUiBvbiBmbG9hdGluZyBwb2ludCBicmFuY2ggaW5zdHJ1Y3Rpb25zLgotCVNldCBGX0ZMT0FUIG9uIG90aGVyIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucy4KLQotTW9uIEFwciAgOCAxNzowMjo0OCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAoUFBDODYwKTogTWFjcm8gZm9yIDg2MC84MjEgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGFuZAotCXJlZ2lzdGVycy4KLSAJKHBvd2VycGNfb3Bjb2Rlcyk6IEFkZCA4NjAvODIxIHNwZWNpZmljIFNQUnMuCi0KLU1vbiBBcHIgIDggMTQ6MDA6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFBlcm1pdCAtLWVuYWJsZS1zaGFyZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YKLQlkaXJlY3Rvcmllcy4gIFNldCBhbmQgc3Vic3RpdHV0ZSBCRkRfUElDTElTVC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChCRkRfUElDTElTVCk6IFJlbmFtZSBmcm9tIEJGRF9MSVNULiAgQ2hhbmdlIGFsbAotCXVzZXMuICBTZXQgdG8gQEJGRF9QSUNMSVNUQC4KLQotRnJpIEFwciAgNSAxNzoxMjoyNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBVc2UgImJpdCIgZm9yIExfMyBpbW1lZGlhdGVzLAotCW5vdCAiYWJzIiwgd2hpY2ggbWF5IGJlIG5lZWRlZCBmb3IgdGhlIGFic29sdXRlIGluIHNvbWV0aGluZwotCWxpa2UgYnRzdCAjMCxAMTA6OC4gIFByaW50IExfMyBpbW1lZGlhdGVzIHNlcGFyYXRlbHkgZnJvbSBvdGhlcgotCWltbWVkaWF0ZXMuICBDaGFuZ2UgQUJTTU9WIHJlZmVyZW5jZSB0byBBQlM4TUVNLgotCi1XZWQgQXByICAzIDEwOjQwOjQ1IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChvcGNvZGVzX2luaXRpYWxpemVkKTogTW92ZSBpbnNpZGUgcHJpbnRfaW5zbl9zcGFyYy4KLQkoY3VycmVudF9hcmNoX21hc2spOiBOZXcgc3RhdGljIGdsb2JhbC4KLQkoY29tcHV0ZV9hcmNoX21hc2spOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwcmludF9pbnNuX3NwYXJjKTogRGVsZXRlIHNwYXJjX3Y5X3AuICBOZXcgc3RhdGljIGxvY2FsCi0JY3VycmVudF9tYWNoLiAgUmVzb3J0IG9wY29kZSB0YWJsZSBpZiBjdXJyZW50X21hY2ggY2hhbmdlcy4KLQlHZW5lcmFsaXplICJpbnNuIG5vdCBzdXBwb3J0ZWQiIHRlc3QuCi0JKGNvbXBhcmVfb3Bjb2Rlcyk6IFByZWZlciBzdXBwb3J0ZWQgb3Bjb2RlcyB0byBub25zdXBwb3J0ZWQgb25lcy4KLQlEZWxldGUgdGVzdCBmb3IgdjkvIXY5LgotCSogc3BhcmMtb3BjLmMgKE1BU0tfKik6IFVzZSBTUEFSQ19PUENPREVfQVJDSF9NQVNLLgotCSh2Nm5vdGxldCk6IERlZmluZS4KLQkoYnJmYyk6IFNwbGl0IGludG8gQ0JSIGFuZCBGQlIgZm9yIGNvcHJvY2Vzc29yL2ZwIGJyYW5jaGVzLgotCShicmZjeCk6IFJlbmFtZWQgdG8gRkJSWC4KLQkoY29uZGZjKTogUmVuYW1lZCB0byBDT05ERkMuICBQYXNzIHY2bm90bGV0IHRvIENCUiAoc3RhbmRhcmQKLQljb3Byb2Nlc3NvciBtbmVtb25pY3MgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNwYXJjbGV0KS4KLQkoY29uZGYpOiBSZW5hbWVkIHRvIENPTkRGLgotCShTTENCQ0MyKTogRGVsZXRlIEZfQUxJQVMgZmxhZy4KLQotU2F0IE1hciAzMCAyMTo0NTo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IHJkIG11c3QgYmUgMCBmb3IKLQltb3YgZm9vLHsleSwlcHNyLCV3aW0sJXRicn0uICBTdXBwb3J0IG1vdiBmb28sJWFzclguCi0KLUZyaSBNYXIgMjkgMTM6MDI6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLnN0YXR1cyk6IERlcGVuZCB1cG9uIEJGRCBWRVJTSU9OIGZpbGUsIHNvCi0JdGhhdCB0aGUgc2hhcmVkIGxpYnJhcnkgdmVyc2lvbiBudW1iZXIgaXMgc2V0IGNvcnJlY3RseS4KLQotVHVlIE1hciAyNiAxNTo0NzoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEFDX0NIRUNLX1RPT0wgdG8gZmluZCBhciBhbmQgcmFubGliLiAgRnJvbQotCU1pbGVzIEJhZGVyIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVNhdCBNYXIgMTYgMTM6MDQ6MDcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHo4a2dlbi5jIChpbnRlcm5hbCwgZ2FzKTogQ2FsbCB4bWFsbG9jIHJhdGhlciB0aGFuIHVuY2hlY2tlZAotCW1hbGxvYy4KLQotVHVlIE1hciAxMiAxMjoxNDoxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuOC4KLQotVGh1IE1hciAgNyAxNToxMToxMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBIYW5kbGUgJ08nIG9wZXJhbmQgY2hhciBsaWtlICdyJy4KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogVXNlICdPJyBvcGVyYW5kIGNoYXIgZm9yIGBuZWcgcmVnJy4KLQotVHVlIE1hciAgNSAxNTo1MTo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IFNITElCIG9yIFNITElOSyB0byBhbiBlbXB0eSBzdHJpbmcsCi0Jc2luY2UgdGhleSBhcHBlYXIgYXMgdGFyZ2V0cyBpbiBNYWtlZmlsZS5pbi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIEZlYiAyNiAxMzowMzo0MCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogRWRpdCBvdXQgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBiaXRzLgotCi1UdWUgRmViIDIwIDIwOjQ4OjI4IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAodjgsdjZub3R2OSk6IEFkZCBNQVNLX1NQQVJDTEVULgotCShzcGFyY19vcGNvZGVfYXJjaHMpOiBBZGQgTUFTS19WOCB0byBzcGFyY2xldCBlbnRyeS4KLQkoc3BhcmNfb3Bjb2Rlcyk6IEFkZCBzcGFyY2xldCBpbnNucy4KLQkoc3BhcmNsZXRfY3ByZWdfdGFibGUpOiBOZXcgc3RhdGljIGxvY2FsLgotCShzcGFyY197ZW5jb2RlLGRlY29kZX1fc3BhcmNsZXRfY3ByZWcpOiBOZXcgZnVuY3Rpb25zLgotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBIYW5kbGUgc3BhcmNsZXQgY3ByZWdzLgotCi1UdWUgRmViIDIwIDExOjAyOjQ0IDE5OTYgIEFsYW4gTW9kcmEgIDxhbGFuQG11bGxldC5MZXZlbHMuVW5pU0EuRWR1LkF1PgotCi0JKiBpMzg2LWRpcy5jIChpbmRleDE2KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHV0b3ApOiBQcmludCBqZWN4eiBmb3IgMzIgYml0IGNhc2UsIGpjeHogZm9yIDE2IGJpdCwgbm90IHRoZQotCW90aGVyIHdheSBhcm91bmQuCi0JKE9QX2luZGlyRSk6IFJldHVybiByZXN1bHQgb2YgT1BfRS4KLQkoT1BfRSk6IENoZWNrIGZvciAxNiBiaXQgYWRkcmVzc2luZyBtb2RlLCBhbmQgZGlzYXNzZW1ibGUKLQljb3JyZWN0bHkuICBPcHRpbWlzZWQgMzIgYml0IGNhc2UgYSBsaXR0bGUuICBEb24ndCBwcmludAotCSIoYmFzZSxpbmRleCxzY2FsZSkiIHdoZW4gc2liIHNwZWNpZmllcyBvbmx5IGFuIG9mZnNldC4KLQotTW9uIEZlYiAxOSAxMjozMjoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGFuZCBzdWJzdGl0dXRlIFNITElCX0RFUC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChTSExJQl9ERVApOiBOZXcgdmFyaWFibGUuCi0JKExJQklCRVJUWV9MSVNUUywgQkZEX0xJU1QpOiBOZXcgdmFyaWFibGVzLgotCShzdGFtcC1waWNsaXN0KTogRGVwZW5kIHVwb24gTElCSUJFUlRZX0xJU1RTIGFuZCBCRkRfTElTVC4gIElmCi0JQ09NTU9OX1NITElCLCBhZGQgdGhlbSB0byBwaWNsaXN0IHdpdGggYXBwcm9wcmlhdGUgbW9kaWZpY2F0aW9ucy4KLQkoJChTSExJQikpOiBEZXBlbmQgdXBvbiAkKFNITElCX0RFUCkuICBEb24ndCBjaGVjayBDT01NT05fU0hMSUIKLQloZXJlOiBqdXN0IHVzZSBwaWNsaXN0LgotCi1Nb24gRmViIDE5IDAyOjAzOjUwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAoTUFTS19WOSxWOV9PTkxZX1AsVjlfUCk6IERlZmluZS4KLQkocHJpbnRfaW5zbl9zcGFyYyk6IFJld3JpdGUgdjkvbm90LXY5IHRlc3RzLgotCShjb21wYXJlX29wY29kZXMpOiBMaWtld2lzZS4KLQkqIHNwYXJjLW9wYy5jIChNQVNLXzxBUkNIPik6IERlZmluZS4KLQkodjYsdjcsdjgsc3BhcmNsaXRlLHY5LHY5YSk6IFJlZGVmaW5lLgotCShzcGFyY2xldCx2Nm5vdHY5KTogRGVmaW5lLgotCShzcGFyY19vcGNvZGVfYXJjaHMpOiBEZWxldGUgbWVtYmVyIGBjb25mbGljdHMnLiAgQWRkIGBzdXBwb3J0ZWQnLgotCShzcGFyY19vcGNvZGVzKTogRGVsZXRlIEZfTk9UVjksIHVzZSB2Nm5vdHY5IGluc3RlYWQuCi0KLVRodSBGZWIgMTUgMTQ6NDU6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfUFJPR19DQyBiZWZvcmUgY29uZmlndXJlLmhvc3QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIE1ha2VmaWxlLmluIChTT05BTUUpOiBSZW1vdmUgbGVhZGluZyAuLi9iZmQvIGZyb20gJChTSExJQikuCi0KLVdlZCBGZWIgMTQgMTk6MDE6MjcgMTk5NiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jIChvbmVieXRlX2hhc19tb2RybSk6IE5ldyBzdGF0aWMgYXJyYXkuCi0JKHR3b2J5dGVfaGFzX21vZHJtKTogTmV3IHN0YXRpYyBhcnJheS4KLQkocHJpbnRfaW5zbl9pMzg2KTogT25seSBmZXRjaCB0aGUgbW9kL3JlZy9ybSBieXRlIGlmIGl0IGlzIG5lZWRlZC4KLQotVHVlIEZlYiAxMyAxNToxNTowMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKFNITElOSykpOiBDaGVjayB0cyBhZ2FpbnN0ICQoU0hMSUIpLCBub3QKLQkkKFNITElOSykuCi0KLU1vbiBGZWIgMTIgMTY6MjY6MDYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKFBQQyk6IFVuZGVmLCBzbyBkZWZhdWx0IGRlZmluYXRpb24gb24gV2luZG93cyBOVAotCWRvZXNuJ3QgY29uZmxpY3QuCi0KLVdlZCBGZWIgIDcgMTM6NTk6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBUaGUgYmtwdCBpbnN0cnVjdGlvbiBpcyBzdXBwb3J0ZWQgb24KLQltNjgwMTB1cCwgbm90IGp1c3QgbTY4MDIwdXAgfCBjcHUzMi4KLQotCSogTWFrZWZpbGUuaW4gKFNPTkFNRSk6IE5ldyB2YXJpYWJsZS4KLQkoJChTSExJTkspKTogTWFrZSBhIGxpbmsgdG8gdGhlIHRyYW5zZm9ybWVkIG5hbWUsIGFzIHdlbGwuCi0JKHN0YW1wLXRzaGxpbmspOiBOZXcgdGFyZ2V0LgotCShpbnN0YWxsKTogU2tpcCBzdGFtcC10c2hsaW5rIGR1cmluZyBpbnN0YWxsLgotCi1UdWUgRmViICA2IDEyOjI4OjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0FSR19QUk9HUkFNLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpOiBOZXcgdmFyaWFibGUuCi0JKGluc3RhbGwpOiBUcmFuc2Zvcm0gbGlicmFyeSBuYW1lIGJlZm9yZSBpbnN0YWxsaW5nIGl0LgotCi1Nb24gRmViICA1IDE2OjE0OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTk2MC1kaXMuYyAobWVtKTogQWRkIEhYIGRjaW52YSBpbnN0cnVjdGlvbi4KLQotCVN1cHBvcnQgZm9yIGJ1aWxkaW5nIGFzIGEgc2hhcmVkIGxpYnJhcnksIGJhc2VkIG9uIHBhdGNoZXMgZnJvbQotCUFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PjoKLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0FSR19FTkFCTEUgZm9yIHNoYXJlZCBhbmQgY29tbW9uYmZkbGliLgotCU5ldyBzdWJzdGl0dXRpb25zOiBBTExMSUJTLCBQSUNGTEFHLCBTSExJQiwgU0hMSUJfQ0MsCi0JU0hMSUJfQ0ZMQUdTLCBDT01NT05fU0hMSUIsIFNITElOSy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChBTExMSUJTKTogTmV3IHZhcmlhYmxlLgotCShQSUNGTEFHLCBTSExJQiwgU0hMSUJfQ0MsIFNITElCX0NGTEFHUyk6IE5ldyB2YXJpYWJsZXMuCi0JKENPTU1PTl9TSExJQiwgU0hMSU5LKTogTmV3IHZhcmlhYmxlcy4KLQkoLmMubyk6IElmIFBJQ0ZMQUcgaXMgc2V0LCBjb21waWxlIHR3aWNlLCBvbmNlIFBJQywgb25jZSBub3JtYWwuCi0JKFNUQUdFU1RVRkYpOiBSZW1vdmUgdmFyaWFibGUuCi0JKGFsbCk6IERlcGVuZCB1cG9uICQoQUxMTElCUykgcmF0aGVyIHRoYW4gJChUQVJHRVRMSUIpLgotCShzdGFtcC1waWNsaXN0LCBwaWNsaXN0KTogTmV3IHRhcmdldHMuCi0JKCQoU0hMSUIpLCAkKFNITElOSykpOiBOZXcgdGFyZ2V0cy4KLQkoJChPRklMRVMpKTogRGVwZW5kIHVwb24gc3RhbXAtcGljZGlyLgotCShkaXNhc3NlbWJsZS5vKTogQnVpbGQgdHdpY2UgaWYgUElDRkxBRyBpcyBzZXQuCi0JKE1PU1RMWUNMRUFOKTogQWRkIHBpYy8qLm8uCi0JKGNsZWFuKTogUmVtb3ZlICQoU0hMSUIpLCAkKFNITElOSyksIHBpY2xpc3QsIGFuZCBzdGFtcC1waWNsaXN0LgotCShkaXN0Y2xlYW4pOiBSZW1vdmUgcGljIGFuZCBzdGFtcC1waWNkaXIuCi0JKGluc3RhbGwpOiBJbnN0YWxsIHNoYXJlZCBsaWJyYXJpZXMuCi0JKHN0YW1wLXBpY2Rpcik6IE5ldyB0YXJnZXQuCi0KLUZyaSBGZWIgIDIgMTc6MTU6MjUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogRGVsZXRlIERJU0FTTV9SQVdfSU5TTiBzdXBwb3J0LgotCVByaW50IHVua25vd24gaW5zdHJ1Y3Rpb24gYXMgInVua25vd24iLCByYXRoZXIgdGhhbiBpbiBoZXguCi0KLVR1ZSBKYW4gMzAgMTQ6MDY6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkaXMtYnVmLmM6IEluY2x1ZGUgInN5c2RlcC5oIiBiZWZvcmUgImRpcy1hc20uaCIuCi0KLVRodSBKYW4gMjUgMjA6MjQ6MDcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVfYXJjaHMpOiBNYXJrIHY4L3NwYXJjbGl0ZSBhcyBjb25mbGljdGluZy4KLQotVGh1IEphbiAyNSAxMTo1Njo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKHByaW50X2luc25faTM4Nik6IE9ubHkgZmV0Y2ggdGhlIG1vZC9yZWcvcm0gYnl0ZQotCXdoZW4gbmVjZXNzYXJ5LiAgRnJvbSBVbHJpY2ggRHJlcHBlcgotCTxkcmVwcGVyQG15d2FyZS5yei51bmkta2FybHNydWhlLmRlPi4KLQotVGh1IEphbiAyNSAwMzozOToxMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBOVU1PUENPREVTIHJlcGxhY2VkIHdpdGgKLQlzcGFyY19udW1fb3Bjb2Rlcy4gIFVwZGF0ZSBhcmNoaXRlY3R1cmUgZW51bSB2YWx1ZXMuCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2RlX2FyY2hzKTogUmVwbGFjZXMgYXJjaGl0ZWN0dXJlX3BuYW1lLgotCShzcGFyY19vcGNvZGVfbG9va3VwX2FyY2gpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX251bV9vcGNvZGVzKTogUmVuYW1lZCBmcm9tIGJmZF9zcGFyY19udW1fb3Bjb2Rlcy4KLQkoc3BhcmNfb3Bjb2Rlcyk6IEFkZCB2OWEgc2h1dGRvd24gaW5zbi4KLQotTW9uIEphbiAyMiAwODoyOTo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBSZW5hbWVkIGZyb20gcHJpbnRfaW5zbi4KLQlJZiBESVNBU01fUkFXX0lOU04sIHByaW50IGluc24gaW4gaGV4LiAgSGFuZGxlIHY5YSBhcyBvcGNvZGUKLQlhcmNoaXRlY3R1cmUuCi0JKHByaW50X2luc25fc3BhcmM2NCk6IERlbGV0ZWQuCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIsIGNhc2UgYmZkX2FyY2hfc3BhcmMpOiBBbHdheXMgdXNlCi0JcHJpbnRfaW5zbl9zcGFyYy4KLQotCSogc3BhcmMtb3BjLmMgKGFyY2hpdGVjdHVyZV9wbmFtZSk6IEFkZCB2OWEuCi0KLUZyaSBKYW4gMTIgMTQ6MzU6NTggMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AQVpTdGFyTmV0LmNvbT4KLQotCSogYWxwaGEtb3BjLmggKGFscGhhX2luc25fc2V0KTogVkFYIGZsb2F0aW5nIHBvaW50IG9wY29kZSB3YXMKLSAJaW5jb3JyZWN0bHkgZGVmaW5lZCBhcyAweDE2IHdoZW4gaXQgc2hvdWxkIGJlIDB4MTUuCi0JKEZMT0FUX0ZPUk1BVF9NQVNLKTogZnVuY3Rpb24gY29kZSBpcyAxMSBiaXRzLCBub3QganVzdCA3IGJpdHMhCi0JKGFscGhhX2luc25fc2V0KTogYWRkZWQgY3Z0c3QgYW5kIGN2dHRxIGZsb2F0IG9wcy4gIEFsc28gYWRkZWQKLSAJZXhjYiAoZXhjZXB0aW9uIGJhcnJpZXIpIHdoaWNoIGlzIGRlZmluZWQgaW4gdGhlIEFscGhhCi0gCUFyY2hpdGVjdHVyZSBIYW5kYm9vayB2ZXJzaW9uIDIuCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IEZpeGVkIHNwZWNpYWwtY2FzZSBkZWNvZGluZyBmb3IKLSAJT1BFUkFURV9GT1JNQVRfQ09ERSB0eXBlIGluc3RydWN0aW9ucy4gIFRoZSBidWcgY2F1c2VkIG11bHEgdG8gYmUKLSAJZGlzYXNzZW1ibGVkIGFzIG9yLCBmb3IgZXhhbXBsZS4KLQotV2VkIEphbiAxMCAxMjozNzoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogUHJpbnQgY2FzZXMgJ2knIGFuZCAndScgaW4gaGV4LgotCShfcHJpbnRfaW5zbl9taXBzKTogQ2hhbmdlIGkgZnJvbSBpbnQgdG8gdW5zaWduZWQgaW50LgotCi1UaHUgSmFuICA0IDE3OjIxOjEwIDE5OTYgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IHRsYmkgUE9XRVIgb3Bjb2RlIGZvcm0gZGlmZmVyZW50Ci0JZnJvbSB0bGJpZSBQb3dlclBDIG9wY29kZS4gIEFkZCBQUEM2MDMgdGxibGQgYW5kIHRsYmxpLgotCi1UaHUgRGVjIDI4IDEzOjI5OjE5IDE5OTUgIEpvaG4gSGFzc2V5ICA8aGFzc2V5QHJ0cC5kZy5jb20+Ci0KLQkqIGkzODYtZGlzLmM6IEFkZGVkIFBlbnRpdW0gUHJvIGluc3RydWN0aW9ucy4KLQotVHVlIERlYyAxOSAyMjo1NjozNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAoZnNxcnR7LC59KTogRHVwbGljYXRlIGZvciBQb3dlclBDIGluIGFkZGl0aW9uIHRvCi0JYmVpbmcgZm9yIFBvd2VyMi4KLQotRnJpIERlYyAxNSAxNDoxNDoxNSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oIChzaF9uaWJibGVfdHlwZSk6IEFkZGVkIFJFR19CLgotCShzaF9hcmdfdHlwZSk6IEFkZGVkIEFfUkVHX0IuCi0JKHNoX3RhYmxlKTogQWRkZWQgcHJlZiBhbmQgYmFuayByZWcgdmVyc2lvbnMgb2YgbGRjLCBsZGMubCwgc3RjCi0gCWFuZCBzdGMubCBvcGNvZGVzLgotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogQWRkZWQgY2FzZXMgZm9yIFJFR19CIGFuZCBBX1JFR19CLgotCi1GcmkgRGVjIDE1IDE2OjQ0OjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogVXNlIG5ldyBiZmRfYmlnX2VuZGlhbiBtYWNyby4KLQotVHVlIERlYyAxMiAxMjoyMjoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgc3RhbXAtaC4gIEZyb20gUm9uYWxkCi0JRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+LgotCi1UdWUgRGVjICA1IDEzOjQyOjQ0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCUZyb20gRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT46Ci0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IGZpeGVkIGRlY29kaW5nIG9mIGNweXMKLSAJaW5zdHJ1Y3Rpb24uCi0KLU1vbiBEZWMgIDQgMTI6Mjk6MDUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaCAoc2hfYXJnX3R5cGUpOiBBZGRlZCBBX1NTUiBhbmQgQV9TUEMuCi0JKHNoX3RhYmxlKTogQWRkZWQgbWFueSBTSDMgb3Bjb2Rlcy4KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IEFkZGVkIGNhc2VzIGZvciBBX1NTUiBhbmQgQV9TUEMuCi0KLUZyaSBEZWMgIDEgMDc6NDI6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKHN1YmZjLiwgc3ViZmNvKTogTWFyayB0aGlzIFBQQ0NPTSwgbm90IFBQQy4KLQkoc3ViY28sc3ViY28uKTogTWFyayB0aGlzIFBQQywgbm90IFBQQ0NPTS4KLQotTW9uIE5vdiAyNyAxMzowOTo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNy4KLQotVHVlIE5vdiAyMSAxODoyODowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNi4KLQotV2VkIE5vdiAxNSAxOTowMjo1MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTb3J0IGxpc3Qgb2YgYXJjaGl0ZWN0dXJlcy4gIEFjY2VwdCBidXQgZG8gbm90aGluZwotCWZvciBhbGxpYW50LCBjb252ZXgsIHB5cmFtaWQsIHJvbXAsIGFuZCB0YWhvZS4KLQotV2VkIE5vdiAgOCAyMDoxODo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGEyOWstZGlzLmMgKHByaW50X3NwZWNpYWwpOiBDaGFuZ2UgbnVtIHRvIHVuc2lnbmVkIGludC4KLQotV2VkIE5vdiAgOCAyMDoxMDozNSAxOTk1ICBFcmljIEZyZXVkZW50aGFsIDxmcmV1ZGVudGhhbEBueXUuZWR1PgotCi0JKiBhMjlrLWRpcy5jIChwcmludF9pbnNuKTogQ2FzdCBpbnNuMjQgdG8gdW5zaWduZWQgbG9uZyB3aGVuCi0Jc2hpZnRpbmcgaXQuCi0KLVR1ZSBOb3YgIDcgMTU6MjE6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ0hFQ0tfUFJPRyB0byBmaW5kIGFuZCBjYWNoZSBBUi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotTW9uIE5vdiAgNiAxNzozOTo0NyAxOTk1ICBIYXJyeSBEb2xhbiAgPGRvbGFuQHNzZC5pbnRlbC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGNhc2UgZm9yIGJmZF9pODYwX2FyY2guCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBOb3YgIDMgMTI6NDU6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBDb3JyZWN0IGZtb3ZlbWwgb3BlcmFuZHMuCi0JKiBtNjhrLWRpcy5jIChORVhUU0lOR0xFKTogQ2hhbmdlIGkgdG8gdW5zaWduZWQgaW50LgotCShORVhURE9VQkxFKTogTGlrZXdpc2UuCi0JKHByaW50X2luc25fbTY4ayk6IERvbid0IG1hdGNoIGZtb3ZlbWwgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZQotCXJlZ2lzdGVyIGluIHRoZSBsaXN0LgotCShwcmludF9pbnNuX2FyZyk6IEhhbmRsZSBhIHBsYWNlIG9mICc4JyBmb3IgYSB0eXBlIG9mICdMJy4KLQotVGh1IE5vdiAgMiAyMzowNjozMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IFVzZSAjVyByYXRoZXIgdGhhbiAjdy4KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlIG5ldyAnVycgcGxhY2UuCi0KLVdlZCBOb3YgIDEgMTM6MzA6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZV9hbGlhc2VzKTogQWRkIGRiZncgYXMgYW4gYWxpYXMgZm9yIGRiZiwKLQlhbmQgbGlrZXdpc2UgZm9yIGFsbCB0aGUgZGJ4eCBvcGNvZGVzLgotCi1Nb24gT2N0IDMwIDIwOjUwOjQwIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBhcmMtZGlzLmM6IEluY2x1ZGUgZWxmLWJmZC5oIHJhdGhlciB0aGFuIGxpYmVsZi5oLgotCi1Nb24gT2N0IDIzIDExOjExOjM0IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQHBhc2FuZGEuY3lnbnVzLmNvLnVrPgotCi0JKiBtaXBzLW9wYy5jOiBBZGRlZCBzaG9ydGhhbmQgKFYxKSBmb3IgSU5TTl80MTAwIG1hbmlmZXN0LiBBZGRlZAotIAl0aGUgVlI0MTAwIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byB0aGUgbWlwc19vcGNvZGVzIHN0cnVjdHVyZS4KLQotVGh1IE9jdCAxOSAxMTowNToyMyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW4sIG1wdy1tYWtlLnNlZDogUmVtb3ZlIHVnbHkgd29ya2Fyb3VuZCBmb3IKLQl1Z2x5IE1ldHJvd2Vya3MgYnVnIGluIENXNiwgaXMgZml4ZWQgaW4gQ1c3LgotCi1Nb24gT2N0IDE2IDEyOjU5OjAxIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jICh3aG9sZSBmaWxlKTogQWRkIGZsYWdzIGZvciBjb21tb24vYW55IHN1cHBvcnQuCi0KLVR1ZSBPY3QgMTAgMTE6MDY6MDcgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSVNPTik6IFJlbW92ZSBtYWNyby4KLQkoRkxBR1NfVE9fUEFTUyk6IFJlbW92ZSBCSVNPTi4KLQotRnJpIE9jdCAgNiAxNjoyNjo0NSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fbTY4ayk6IFJlY29nbml6ZSBhbGwgdHdvLXdvcmQKLQlpbnN0cnVjdGlvbnMgdGhhdCB0YWtlIG5vIGFyZ3MgYnkgbG9va2luZyBhdCB0aGUgbWF0Y2ggbWFzay4KLSAgCShwcmludF9pbnNuX2FyZyk6IEFsd2F5cyBwcmludCAiJSIgYmVmb3JlIHJlZ2lzdGVyIG5hbWVzLgotCVtjYXNlICdjJ106IFVzZSAibmMiIGZvciB0aGUgbm8tY2FjaGUgY2FzZSwgYXMgcmVjb2duaXplZCBieSBnYXMuCi0JW2Nhc2UgJ18nXTogRG9uJ3QgcHJpbnQgIkAjIiBiZWZvcmUgYWRkcmVzcy4KLQlbY2FzZSAnSiddOiBVc2UgIiVzIiBhcyBmb3JtYXQgc3RyaW5nLCBub3QgcmVnaXN0ZXIgbmFtZS4KLQlbY2FzZSAnQiddOiBUcmVhdCBwbGFjZSA9PSAnQycgbGlrZSAnbCcgYW5kICdMJy4KLQotVGh1IE9jdCAgNSAyMjoxNjoyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYzogRGVzY3JpYmUgY21weGNoZzhiIG9wZXJhbmQsIGFuZCBzcGVsbCB0aGUgb3Bjb2RlCi0JbmFtZSBjb3JyZWN0bHkuCi0KLVR1ZSBPY3QgIDMgMDg6MzA6MjAgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCUZyb20gRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogYWxwaGEtb3BjLmggKE1FTU9SWV9GVU5DVElPTl9GT1JNQVRfTUFTSyk6IGFkZGVkLgotICAJKGFscGhhX2luc25fc2V0KTogYWRkZWQgZGVmaW5pdGlvbnMgZm9yIFZBWCBmbG9hdGluZyBwb2ludAotIAlpbnN0cnVjdGlvbnMgKFVuaXggY29tcGlsZXJzIGRvbid0IGdlbmVyYXRlIHRoZXNlLCBidXQgaGFuZGNvZGVkCi0gCWFzc2VtYmx5IG1pZ2h0IHN0aWxsIHVzZSB0aGVtKS4KLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBhZGRlZCBzdXBwb3J0IGZvciBkaXNhc3NlbWJsaW5nCi0gCXRoZSBtaXNjZWxsYW5lb3VzIGluc3RydWN0aW9ucyBpbiB0aGUgQWxwaGEgaW5zdHJ1Y3Rpb24gc2V0LgotCi1UdWUgU2VwIDI2IDE4OjQ3OjIwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIG02OGstb3BjLmMubyB0byBCRkRfTUFDSElORVMgZm9yIG02OGssCi0Jbm8gbG9uZ2VyIGNyZWF0ZSBzeXNkZXAuaCwgc2VkIHBwYy1vcGMuYyB0byB3b3JrIGFyb3VuZCBhCi0Jc2VyaW91cyBNZXRyb3dlcmtzIEMgYnVnLgotCSogbXB3LW1ha2UuaW46IFJlbW92ZS4KLQkqIG1wdy1tYWtlLnNlZDogTmV3IGZpbGUsIHVzZWQgYnkgbXB3LWNvbmZpZ3VyZSB0byBlZGl0Ci0JTWFrZWZpbGUuaW4gaW50byBhbiBNUFcgbWFrZWZpbGUuCi0KLVdlZCBTZXAgMjAgMTI6NTU6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyBzeW5vbnltIGZvciByZWFsY2xlYW4uCi0KLVR1ZSBTZXAgMTkgMTU6Mjg6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBTcGxpdCBwbW92ZSBwYXR0ZXJucyB3aGljaCB1c2UgJ1AnIGludG8gcGF0dGVybnMKLQl3aGljaCB1c2UgJzAnLCAnMScsIGFuZCAnMicgaW5zdGVhZC4gIFNwZWNpZnkgdGhlIHByb3BlciBzaXplIGZvcgotCWEgcG1vdmUgaW1tZWRpYXRlIG9wZXJhbmQuICBDb3JyZWN0IHRoZSBwbW92ZWZkIHBhdHRlcm5zIHRvIGJlCi0JbW92ZXMgdG8gYSByZWdpc3Rlciwgbm90IGZyb20gYSByZWdpc3Rlci4KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogUmVwbGFjZSAnUCcgd2l0aCAnMCcsICcxJywgJzInLgotCi1UaHUgU2VwIDE0IDExOjU4OjIyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogTWFyayBhbGwgaW5zbnMgdGhhdCByZWZlcmVuY2UKLQklcHNyLCAld2ltLCAldGJyIGFzIEZfTk9UVjkuCi0KLUZyaSBTZXAgIDggMDE6MDc6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBKdXN0IHJlYnVpbGQgTWFrZWZpbGUgd2hlbiBydW5uaW5nCi0JY29uZmlnLnN0YXR1cy4KLQkoY29uZmlnLmgsIHN0YW1wLWgpOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DT05GSUdfSEVBREVSIGFuZCBBQ19DQU5PTklDQUxfU1lTVEVNCi0JZWFybGllci4gIERvbid0IGJvdGhlciB0byBjYWxsIEFDX0FSR19QUk9HUkFNLiAgVG91Y2ggc3RhbXAtaCB3aGVuCi0JcmVidWlsZGluZyBjb25maWcuaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogbWlwcy1vcGMuYzogQ2hhbmdlIHVuYWxpZ25lZCBsb2FkcyBhbmQgc3RvcmVzIHdpdGggInQsQSIKLQlvcGVyYW5kcyB0byB1c2UgInQsQShiKSIuCi0KLVRodSBTZXAgIDcgMTk6MDI6NDYgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBBZGQgRl9GUjAgc3VwcG9ydC4KLQotVGh1IFNlcCAgNyAxOTowMjo0NiAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IENoYW5nZSBsb29wIG92ZXIgb3AtPmFyZ1tuXSB0byBpdGVyYXRlCi0JdW50aWwgMyBpbnN0ZWFkIG9mIHVudGlsIDIuCi0KLVdlZCBTZXAgIDYgMjE6MjE6MzMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0NGTEFHUyk6IERlZmluZS4KLQkoLmMubywgZGlzYXNzZW1ibGUubyk6IFVzZSAkKEFMTF9DRkxBR1MpLgotCShNT1NUTFlDTEVBTik6IEFkZCBjb25maWcubG9nLgotCShkaXN0Y2xlYW4pOiBEb24ndCByZW1vdmUgY29uZmlnLmxvZy4KLQkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSBIREVGSU5FUy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIFNlcCAgNiAxNTowODowOSAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oIChzaF9hcmdfdHlwZSk6IEFkZCBGX0ZSMC4KLQkoc2hfdGFibGUsIGNhc2UgZm1hYyk6IEFkZCBGX0ZSMCBhcyBmaXJzdCBhcmd1bWVudC4KLQotV2VkIFNlcCAgNiAxNTowODowOSAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oIChzaF9vcGNvZGVfaW5mbyk6IEluY3JlYXNlIGFyZyBhcnJheSBzaXplIHRvIDQuCi0KLVR1ZSBTZXAgIDUgMTg6Mjg6MTAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmM6IFJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byBOT19WOS4KLQotVHVlIFNlcCAgNSAyMDowMzoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQ6IEp1c3QgaW5jbHVkZSAuLi9iZmQvYWNsb2NhbC5tNC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIFNlcCAgNSAxNjowOTo1OSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAoWF9ESVNQMTkpOiBEZWZpbmUuCi0JKHByaW50X2luc24sIGNhc2UgJ0cnKTogVXNlIGl0LgotCShwcmludF9pbnNuLCBjYXNlICdMJyk6IFNpZ24gZXh0ZW5kIGRpc3BsYWNlbWVudC4KLQotTW9uIFNlcCAgNCAxNDoyODo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUnVuIC4uL2JmZC9jb25maWd1cmUuaG9zdCBiZWZvcmUgQUNfUFJPR19DQy4KLQlTdWJzaXR1dGUgQ0ZMQUdTIGFuZCBBUi4gIENhbGwgQUNfUFJPR19JTlNUQUxMLiAgRG9uJ3Qgc3Vic3RpdHV0ZQotCWhvc3RfbWFrZWZpbGVfZnJhZyBvciBmcmFncy4KLQkqIGFjbG9jYWwubTQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBTZXQgdG8gQElOU1RBTExALgotCShJTlNUQUxMX1BST0dSQU0pOiBTZXQgdG8gQElOU1RBTExfUFJPR1JBTUAuCi0JKElOU1RBTExfREFUQSk6IFNldCB0byBASU5TVEFMTF9EQVRBQC4KLQkoQVIpOiBTZXQgdG8gQEFSQC4KLQkoQVJfRkxBR1MpOiBTZXQgdG8gcmMgcmF0aGVyIHRoYW4gcWMuCi0JKENDKTogRGVmaW5lIGFzIEBDQ0AuCi0JKENGTEFHUyk6IFNldCB0byBAQ0ZMQUdTQC4KLQkoQGhvc3RfbWFrZWZpbGVfZnJhZ0ApOiBSZW1vdmUuCi0JKGNvbmZpZy5zdGF0dXMpOiBSZW1vdmUgZGVwZW5kZW5jeSB1cG9uIEBmcmFnc0AuCi0KLQkqIGNvbmZpZ3VyZS5pbjogLi4vYmZkL2NvbmZpZy5iZmQgbm93IGp1c3Qgc2V0cyBzaGVsbCB2YXJpYWJsZXMuCi0JVXNlIHRoZW0gcmF0aGVyIHRoYW4gbG9va2luZyB0aHJvdWdoIHRhcmdldCBNYWtlZmlsZSBmcmFnbWVudHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBBdWcgMzEgMTI6MzU6MzIgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaCAoZnRyYyk6IENoYW5nZSBGUFVMX04gdG8gRlBVTF9NLgotCi1XZWQgQXVnIDMwIDEzOjUyOjI4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogRGVsZXRlIGR1cGxpY2F0ZSB3ciAleSBpbnNuLgotCUFkZCBjbHJ4LCBpcHJlZmV0Y2gsIHNpZ254LCBjbHJ1dywgY2FzLCBjYXNsLCBjYXN4LCBjYXN4bCBzeW50aGV0aWMKLQlzcGFyYzY0IGluc25zLgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IEZpeCBwcmVmZXRjaGEgaW5zbi4KLQkobG9va3VwX3tuYW1lLHZhbHVlfSk6IE5ldyBmdW5jdGlvbnMuCi0JKHByZWZldGNoX3RhYmxlKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkoc3BhcmNfe2VuY29kZSxkZWNvZGV9X3ByZWZldGNoKTogTmV3IGZ1bmN0aW9ucy4KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuKTogSGFuZGxlICcqJyBhcmcgKHByZWZldGNoIGZ1bmN0aW9uKS4KLQotV2VkIEF1ZyAzMCAxMToxMTo1OCAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oOiBBZGQgYmxhbmsgbGluZXMgdG8gaW1wcm92ZSByZWFkYWJpbGlsdHkgb2Ygc2gzZQotCWluc3RydWN0aW9ucy4KLQotV2VkIEF1ZyAzMCAxMTowOTozOCAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHNoLWRpcy5jOiBDb3JyZWN0IGNvbW1lbnQgb24gZmlyc3QgbGluZSBvZiBmaWxlLgotCi1UdWUgQXVnIDI5IDE1OjM3OjE4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IEhhbmRsZSBiZmRfbWFjaF9zcGFyYzY0LgotCi0JKiBzcGFyYy1vcGMuYyAoYXNpLCBtZW1iYXIpOiBOZXcgc3RhdGljIGxvY2Fscy4KLQkoc3BhcmNfe2VuY29kZSxkZWNvZGV9X3thc2ksbWVtYmFyfSk6IE5ldyBmdW5jdGlvbnMuCi0JKHNwYXJjX29wY29kZXMsIG1lbWJhciBpbnNuKTogRml4LgotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc24pOiBDYWxsIHNwYXJjX2RlY29kZV9hc2kuCi0JU3VwcG9ydCBkZWNvZGluZyBvZiBtZW1iYXIgbWFza3MuCi0JKFhfTUVNQkFSKTogRGVmaW5lLgotCi1TYXQgQXVnIDI2IDIxOjIyOjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVfYWxpYXNlcyk6IEFkZCBiciwgYnJzLCBicmIsIGJydywgYnJsLgotCi1Nb24gQXVnIDIxIDE3OjMzOjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVfYWxpYXNlcyk6IEFkZCBiaGliIGFzIGFuIGFsaWFzIGZvciBiaGlzLAotCWFuZCBsaWtld2lzZSBmb3IgdGhlIG90aGVyIGJyYW5jaGVzLiAgQWRkIGJocyBhcyBhbiBhbGlhcyBmb3IgYmNjLAotCWFuZCBsaWtld2lzZSBmb3IgdGhlIHNpemUgdmFyaWFudHMuICBBZGQgZGJocyBhcyBhbiBhbGlhcyBmb3IKLQlkYmNjLgotCi1GcmkgQXVnIDExIDEzOjQwOjI0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzaC1vcGMuaCAoRlAgc3RzIGluc3RydWN0aW9ucyk6IFVwZGF0ZSB0byBtYXRjaCByZWFsaXR5LgotCi1Nb24gQXVnICA3IDE2OjEyOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1kaXMuYzogKGZwY3JfbmFtZXMpOiBBZGQgJSBiZWZvcmUgYWxsIHJlZ2lzdGVyIG5hbWVzLgotCShyZWdfbmFtZXMpOiBMaWtld2lzZS4KLQkocHJpbnRfaW5zbl9hcmcpOiBEb24ndCBleHBsaWNpdGx5IHByaW50ICUgYmVmb3JlIHJlZ2lzdGVyIG5hbWVzLgotCUFkZCAlIGJlZm9yZSByZWdpc3RlciBuYW1lcyBpbiBzdGF0aWMgYXJyYXkgbmFtZXMuICBJbiBjYXNlICdyJywKLQlwcmludCBkYXRhIHJlZ2lzdGVycyBhcyBgQChEbiknLCBub3QgYERuQCcuICBXaGVuIHByaW50aW5nIGEKLQltZW1vcnkgYWRkcmVzcywgZG9uJ3QgcHJpbnQgQCMgYmVmb3JlIGl0LgotCShwcmludF9pbmRleGVkKTogQ2hhbmdlIGJhc2VfZGlzcCBhbmQgb3V0ZXJfZGlzcCBmcm9tIGludCB0bwotCWJmZF92bWEuICBQcmludCB1c2luZyBNSVQgc3ludGF4LCBub3QgbXV0YW50IGludmFsaWQgTW90b3JvbGEKLQlzeW50YXguICBTaWduIGV4dGVuZCA4IGJ5dGUgZGlzcGxhY2VtZW50IGNvcnJlY3RseS4KLQkocHJpbnRfYmFzZSk6IFByaW50IHVzaW5nIE1JVCBzeW50YXguICBQcmludCB6cGMgd2hlbiBhcHByb3ByaWF0ZS4KLQlDaGFuZ2UgcGFyYW1ldGVyIGRpc3AgZnJvbSBpbnQgdG8gYmZkX3ZtYS4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVfYWxpYXNlcyk6IEFkZCBqc3JsIGFuZCBqc3JzIGFzIGFsaWFzZXMKLQlmb3IganNyLgotCi1Nb24gQXVnICA3IDAyOjIxOjQwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBIYW5kbGUgbmV3IG9wZXJhbmQgdHlwZXMgRl9SRUdfTiwKLQlGX1JFR19NLCBGUFNDUl9NLCBGUFNDUl9OLCBGUFVMX00gYW5kIEZQVUxfTi4KLQkqIHNoLW9wYy5oIChzaF9hcmdfdHlwZSk6IEFkZCBuZXcgb3BlcmFuZCB0eXBlcy4KLQkoc2hfdGFibGUpOiBBZGQgbmV3IG9wY29kZXMgZnJvbSBTSDNFIEZsb2F0aW5nIFBvaW50IElTQS4KLQotU2F0IEF1ZyAgNSAxNjo1MDoxNCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBnZW5lcmF0ZWQgZmlsZSBjb25maWcuaC4KLQotU2F0IEF1ZyAgNSAxNjo1MDoxNCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBnZW5lcmF0ZWQgZmlsZSBjb25maWcuaC4KLQotV2VkIEF1ZyAgMiAxODozMzo0MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IE5ldyBmaWxlLCBob2xkaW5nIHRhYmxlcyBmcm9tIGluY2x1ZGUvb3Bjb2RlL202OGsuaC4KLQlDbGVhbiB1cCB0YWJsZXMuCi0JKiBtNjhrLWRpcy5jOiBSZW1vdmUgQlJFQUtfVVBfQklHX0RFQ0wgc3R1ZmYuCi0JKG9wY29kZSk6IFJlbW92ZS4KLQkocHJpbnRfaW5zbl9tNjhrKTogQ2hhbmdlIGQgdG8gYmUgY29uc3QuICBVc2UgbTY4a19udW1vcGNvZGVzCi0JcmF0aGVyIHRoYW4gbnVtb3Bjb2Rlcy4gIFVzZSBtNjhrX29wY29kZXMgcmF0aGVyIHRoYW4gcmVtb3ZlZAotCW9wY29kZSBmdW5jdGlvbi4gIERvbid0IGNoZWNrIEZfQUxJQVMuCi0JKHByaW50X2luc25fYXJnKTogQ2hhbmdlIGZpcnN0IHBhcmFtZXRlciB0byBiZSBjb25zdCBjaGFyICouCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIG02OGstb3BjLm8uCi0JKG02OGstb3BjLm8pOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluOiBCdWlsZCBtNjhrLW9wYy5vIGZvciBiZmRfbTY4a19hcmNoLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgQXVnICAyIDA4OjIzOjM4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChIQVNIX1NJWkUsIEhBU0hfSU5TTik6IERlZmluZS4KLQkob3Bjb2RlX2JpdHMsIG9wY29kZV9oYXNoX3RhYmxlKTogTmV3IHZhcmlhYmxlcy4KLQkob3Bjb2Rlc19pbml0aWFsaXplZCk6IFJlbmFtZWQgZnJvbSBvcGNvZGVzX3NvcnRlZC4KLQkoYnVpbGRfaGFzaF90YWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkoaXNfZGVsYXllZF9icmFuY2gpOiBVc2UgaGFzaCB0YWJsZS4KLQkocHJpbnRfaW5zbik6IFJlbmFtZWQgZnJvbSBwcmludF9pbnNuX3NwYXJjLCBtYWRlIHN0YXRpYy4KLQlCdWlsZCBhbmQgdXNlIGhhc2ggdGFibGUuICBJZiAhc3BhcmM2NCwgaWdub3JlIHNwYXJjNjQgaW5zbnMsCi0JYW5kIHZpY2UtdmVyc2EgaWYgc3BhcmM2NC4KLQkocHJpbnRfaW5zbl9zcGFyYywgcHJpbnRfaW5zbl9zcGFyYzY0KTogTmV3IGZ1bmN0aW9ucy4KLQkoY29tcGFyZV9vcGNvZGVzKTogTW92ZSBzcGFyYzY0IG9wY29kZXMgdG8gZW5kLgotCVByaW50IGNvbW11dGF0aXZlIGluc25zIHdpdGggY29uc3RhbnQgc2Vjb25kLgotCSogc3BhcmMtb3BjLmMgKGFsbCBub24tdjkgaW5zbnMpOiBVc2UgZmxhZyBGX05PVFY5IGluc3RlYWQgb2YgRl9BTElBUy4KLQotVHVlIEF1ZyAgMSAwMDoxMjo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgZHNsb3QuICBVc2UKLQlwcmludF9hZGRyZXNzX2Z1bmMgZm9yIEFfQkRJU1AxMiBhbmQgQV9CRElTUDguICBDb3JyZWN0IHRlc3Qgd2hpY2gKLQlhdm9pZHMgcHJpbnRpbmcgYSBkZWxheSBzbG90IGluIGEgZGVsYXkgc2xvdC4KLQkqIHNoLW9wYy5oIChzaF90YWJsZSk6IEZ1bGx5IGJyYWNrZXQgbGFzdCBlbnRyeS4KLQotTW9uIEp1bCAzMSAxMjowNDo0NyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc2xseCwgc3JheCwgc3JseCk6IEZpeCBkaXNhc3NlbWJseS4KLQotV2VkIEp1bCAxMiAwMDo1OTozNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBHZXQgaG9zdF9tYWtlZmlsZV9mcmFnIGZyb20gJHtzcmNkaXJ9LgotCi0JKiBjb25maWd1cmUuaW46IEF1dG9jb25maXNjYXRlZC4gIENoZWNrIGZvciBzdHJpbmdbc10uaC4gIENyZWF0ZQotCWNvbmZpZy5oIGZyb20gY29uZmlnLmluLiAgRG9uJ3Qgc2V0IHVwIHN5c2RlcC5oIGxpbmsuCi0JKiBzeXNkZXAuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogTmV3IGZpbGVzLCBnZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuaW4uCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlZCB0byBiZSBwcm9jZXNzZWQgYXV0b2NvbmYtc3R5bGUuCi0JKGRpc3RjbGVhbik6IEtlZXAgc3lzZGVwLmguICBSZW1vdmUgY29uZmlnLmxvZyBhbmQgY29uZmlnLmNhY2hlLgotCShNYWtlZmlsZSk6IERlcGVuZCBvbiBjb25maWcuc3RhdHVzLgotCShjb25maWcuc3RhdHVzKTogTmV3IHJ1bGUuCi0JKiBjb25maWd1cmUuYmF0OiBVcGRhdGUgTWFrZWZpbGUgc3Vic3RpdHV0aW9ucy4KLQotVHVlIEp1bCAxMSAxNDoyMzozNyAxOTk1ICBKZWZmIFNwaWVnZWwgIDxqZWZmc0Bsc2lsLmNvbT4KLQotCSogbWlwcy1vcGMuYyAoTDEpOiBEZWZpbmUuCi0JKG1pcHNfb3Bjb2Rlcyk6IEFkZCBSNDAxMCBpbnN0cnVjdGlvbnM6IGZsdXNoaSwgZmx1c2hkLCBmbHVzaGlkLAotCWFkZGNpdSwgbWFkZCwgbWFkZHUsIGZmYywgZmZzLCBtc3ViLCBtc3VidSwgc2Vsc2ksIHNlbHNyLCB3YWl0aSwKLQlhbmQgd2IuCi0KLVR1ZSBKdWwgMTEgMTE6NDk6NDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChtaXBzX29wY29kZXMpOiBGb3IgdGhlIG1vdmUgcHNldWRvLW9wLCBwcmVmZXIgZGFkZHUKLQlpZiBJU0EgMyBhbmQgYWRkdSBvdGhlcndpc2UsIHJlcGxhY2luZyBvciwgc2luY2Ugc29tZSBNSVBTIGNoaXBzCi0JaGF2ZSBtdWx0aXBsZSBhZGQgdW5pdHMgYnV0IG9ubHkgYSBzaW5nbGUgbG9naWNhbCB1bml0LgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3BlcmFuZHMpOiBDaGFuZ2UgQ1IgdG8gdXNlIGEgYml0c2l6ZSBvZiAzLAotCXNoaWZ0ZWQgYnkgMTgsIHdpdGhvdXQgYW55IGluc2VydGlvbiBvciBleHRyYWN0aW9uIGZ1bmN0aW9uLgotCShpbnNlcnRfY3IsIGV4dHJhY3RfY3IpOiBSZW1vdmUuCi0KLVdlZCBKdW4gMjEgMjA6MDU6MzkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcsIHByaW50X2luZGV4ZWQpOiBQcmludCAiJSIgYmVmb3JlCi0JcmVnaXN0ZXIgbmFtZXMuCi0KLVRodSBKdW4gMTUgMTc6MjM6MzEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBBZGQgc2ggYW5kIGkzODYgY29uZmlncywgcmVtb3ZlIHNwYXJjIGNvbmZpZy4KLQkqIHNoLW9wYy5oOiBBZGQgY29weXJpZ2h0LgotCi1Nb24gSnVuICA1IDAzOjMwOjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNydW5jaC1tNjhrKTogRGVsZXRlIGV4dHJhIHRhcmdldCBhY2NpZGVudGFsbHkKLQljaGVja2VkIGluIGEgd2hpbGUgYWdvLgotCi1XZWQgTWF5IDI0IDE2OjIyOjEzIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmggKHNoX3RhYmxlKTogQWRkIFNIMyBzdXBwb3J0LgotCi1XZWQgTWF5IDI0IDE0OjE2OjA4IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oOiBBZGRlZCBic3JmIGFuZCBicmFmLgotCi1XZWQgTWF5IDEwIDE0OjI4OjE2IDE5OTUgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBhcm0tb3BjLmggKGFybV9vcGNvZGVzKTogQWRkIDY0LWJpdCBtdWx0aXBseSBwYXR0ZXJucy4gIERlbGV0ZQotCWJvZ3VzIFtsc11mbXtlYSxmZH0gcGF0dGVybnMuCi0KLQkqIGFybS1vcGMuaCAoYXJtX29wY29kZXMpOiBDb3JyZWN0IHR5cG9zIGluIHN0bSwgbGRtLCBzdGQsIGFuZCBsZGMuCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYXJtKTogTWFrZSBHSVZFTiBhIHBhcmFtZXRlciwgZG9uJ3QgdHJ5IGFuZAotCWluaXRpYWxpemUgaXQgZnJvbSBtZW1vcnkuICBNYWtlIGZ1bmN0aW9uIHN0YXRpYy4KLQkocHJpbnRfaW5zbl97YmlnLGxpdHRsZX1fYXJtKTogTmV3IGZ1bmN0aW9ucy4KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlciwgY2FzZSBiZmRfYXJjaF9hcm0pOiBEaXNhc3NlbWJsZSBmb3IKLQl0aGUgY29ycmVjdCBlbmRpYW5uZXNzLgotCi1Nb24gQXByIDI0IDE0OjE4OjA1IDE5OTUgIEphc29uIE1vbGVuZGEgICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmggKHNoX25pYmJsZV90eXBlLCBzaF9hcmdfdHlwZSk6IHJlbW92ZSB0cmFpbGluZyAsIGZyb20KLQllbnVtIGxpc3QuCi0KLVdlZCBBcHIgMTkgMTQ6MDc6MDMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBtNjhrLWRpcy5jIChvcGNvZGUpOiBGaW5pc2ggY2hhbmdlIG1hZGUgYnkgS3VuZyBIc3Ugb24gQXByaWwKLQkxN3RoLCBzbyB0aGF0IGl0IGJ1aWxkcyBhZ2FpbiB1c2luZyBHQ0MgYXMgdGhlIGNvbXBpbGVyLgotCi1UdWUgQXByIDE4IDEyOjE0OjUxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fbGl0dGxlX21pcHMpOiBDYXN0IHJldHVybiB2YWx1ZSBmcm9tCi0JYmZkX2dldGwzMiBmcm9tIGJmZF92bWEgdG8gdW5zaWduZWQgbG9uZywgYmVjYXVzZSBfcHJpbnRfaW5zbl9taXBzCi0JZXhwZWN0cyBhbiB1bnNpZ25lZCBsb25nLCBhbmQgdGhhdCBtaWdodCBiZSBmZXdlciB3b3JkcyBvZgotCWFyZ3VtZW50IHN0b3JhZ2UgKGUuZy4sIGlmIGJmZF92bWEgaXMgbG9uZyBsb25nIG9uIGEgMzItYml0Ci0JbWFjaGluZSkuCi0JKHByaW50X2luc25fYmlnX21pcHMpOiBMaWtld2lzZSB3aXRoIGJmZF9nZXRiMzIgdmFsdWUuCi0JKF9wcmludF9pbnNuX21pcHMpOiBOb3cgc3RhdGljLgotCi1Nb24gQXByIDE3IDEyOjIzOjI4IDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BydGwuY3lnbnVzLmNvbT4KLQotCSogbTY4ay1kaXMuYzogVGFrZSBvdXQgI2RlZmluZSBCUkVBS19VUF9CSUdfREVDTCBrbHVkZ2UsIGJlY2F1c2UKLQlnY2MgbWVtb3J5IGhvZyBwcm9ibGVtIHdpdGggaW5pdGlhbGl6ZXIgaXMgZml4ZWQuCi0KLU1vbiBBcHIgMTAgMTU6NTU6MDEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JTWVyZ2UgaW4gc3VwcG9ydCBmb3IgTWFjIE1QVyBhcyBhIGhvc3QuCi0JKE9sZCBjaGFuZ2UgZGVzY3JpcHRpb25zIHJldGFpbmVkIGZvciBpbmZvcm1hdGlvbmFsIHZhbHVlLikKLQotCSogbXB3LWNvbmZpZy5pbiAoYXJjaG5hbWUpOiBDb21wdXRlIGZyb20gdGhlIGNvbmZpZy4KLQkoQkZEX01BQ0hJTkVTLCBBUkNIREVGUyk6IFB1dCBpbnRvIG1rLnRtcC4KLQotCSogbXB3LWNvbmZpZy5pbiAodGFyZ2V0X2FyY2gpOiBDb21wdXRlIGZyb20gY2Fub25pY2FsIHRhcmdldC4KLQkobTY4aywgbWlwcywgcG93ZXJwYywgc3BhcmMpOiBBZGQgYXJjaGl0ZWN0dXJlcy4KLQkqIG1wdy1tYWtlLmluIChkaXNhc3NlbWJsZS5jLm8pOiBBZGQuCi0JKEFMTF9DRkxBR1MpOiBSZW1vdmUgc3BlY2lhbCBmbGFncyAoLW1jNjgwMjAgLW1jNjg4ODEgLW1vZGVsIGZhcikuCi0KLQkqIG1wdy1jb25maWcuaW4gKEJGRF9NQUNISU5FUyk6IFNldCB0byBhIGRlZmF1bHQgdmFsdWUuCi0JKiBtcHctbWFrZS5pbiAoQkZEX01BQ0hJTkVTKTogUmVtb3ZlIHdpcmVkLWluIHZhbHVlLgotCi0JKiBtcHctbWFrZS5pbiAoQ1NFQVJDSCk6IEFkZCBleHRyYS1pbmNsdWRlIHRvIHNlYXJjaCBwYXRoLgotCi0JKiBtcHctY29uZmlnLmluICh2YXJhcmdzLmgpOiBEb24ndCBjcmVhdGUuCi0JKHN5c2RlcC5oKTogQ3JlYXRlIHVzaW5nIGZvcndhcmQtaW5jbHVkZS4KLQkqIG1wdy1tYWtlLmluIChDU0VBUkNIKTogQWRkIGluY2x1ZGUvbXB3IHRvIHNlYXJjaCBwYXRoLgotCi0JKiBtcHctY29uZmlnLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgY29uZmlndXJlLmluLgotCSogbXB3LW1ha2UuaW46IE5ldyBmaWxlLCBNUFcgdmVyc2lvbiBvZiBNYWtlZmlsZS5pbi4KLQotRnJpIE1hciAzMSAxNDoyMzozOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IFB1dCBlbXB0eSBzdGF0ZW1lbnQgYWZ0ZXIKLQlkZWZhdWx0IGxhYmVsLgotCi1UdWUgTWFyIDIxIDEwOjUxOjQwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLWRpcy5jIChzaWduX2V4dGVuZCk6IERlbGV0ZSwgcmVkdW5kYW50IHdpdGggbGliaHBwYS5oIHZlcnNpb24uCi0JKGxvd19zaWduX2V4dGVuZCk6IExpa2V3aXNlLgotCShnZXRfZmllbGQpOiBEZWxldGUgdW51c2VkIGZ1bmN0aW9uLgotCShzZXRfZmllbGQsIGRlcG9zaXRfMTQsIGRlcG9zaXRfMjEpOiBMaWtld2lzZS4KLQotRnJpIE1hciAxNyAxNTo1NTo1MyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmM6IFN1cHBvcnQgZm9yIG1vcmUgcGVudGl1bSBvcGNvZGVzLiAgRnJvbSBHdXkgSGFycmlzCi0JICAoZ3V5QG5ldGFwcC5jb20pLgotCi1UdWUgTWFyIDE0IDAwOjUyOjU3IDE5OTUgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JU2F0IEZlYiAxMSAxNzoyMjo0MSAxOTk1ICBLbGF1cyBLYWVtcGYgIChra2FlbXBmQGRpZHltdXMucm1pLmRlKQotCi0JKiBhbHBoYS1vcGMuaCAoT1NGX0FTTUNPREUpOiBkZWZpbmUKLQlwcmludCBwYWwtY29kZSBuYW1lcyBhcyBkZWZpbmVkIGluIEFwcCBDIG9mIHRoZQotCUFscGhhIEFyY2hpdGVjdHVyZSBSZWZlcmVuY2UgTWFudWFsCi0KLQkqIGFscGhhLWRpcy5jOiBjbGVhbmVkIHVwIG91dHB1dAotCXByaW50IHN0eWxpemVkIGNvZGUgZm9ybXMgYXMgZGVmaW5lZCBpbiBBcHAgQS40LjMgb2YgdGhlCi0JQWxwaGEgQXJjaGl0ZWN0dXJlIFJlZmVyZW5jZSBNYW51YWwKLQotV2VkIE1hciAgOCAxNToyMToxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCBuZXcgbWlwczQgaW5zdHJ1Y3Rpb25zLiAgRG9uJ3Qgc2V0IElOU05fUkZFIGZvcgotCWByZmUnLgotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgbmV3IGFyZ3VtZW50IHR5cGVzICdoJywgJ1InLAotCSdOJywgYW5kICdNJy4KLQotV2VkIE1hciAgOCAwMjo1NDowNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtNjhrLWRpcy5jIChvcGNvZGUpOiBOZXcgZnVuY3Rpb24uICBSZXR1cm5zIGFkZHJlc3Mgb2Ygb3Bjb2RlCi0JdGFibGUgZW50cnkgZ2l2ZW4gaW5kZXgsIGV2ZW4gaWYgdGhlIG9wY29kZSB0YWJsZSB3YXMgc3BsaXQgdG8KLQl3b3JrIGFyb3VuZCBnY2MgYnVncy4KLQkocHJpbnRfaW5zbl9tNjhrKTogQ2FsbCBvcGNvZGUgaW5zdGVhZCBvZiByZWZlcmVuY2luZyBtNjhrX29wY29kZXMKLQlkaXJlY3RseS4KLQkoQlJFQUtfVVBfQklHX0RFQ0wpOiBNYWtlIHNlY29uZGFyeSBhcnJheSBzdGF0aWMgYW5kIGNvbnN0LgotCShyZWdfbmFtZXMpOiBOb3cgY29uc3QuCi0JKHByaW50X2luc25fYXJnKTogQXJyYXlzIGNhY2hlRmllbGROYW1lIGFuZCBuYW1lcyBub3cgY29uc3QuCi0JKHByaW50X2luZGV4ZWQpOiBBcnJheSBzY2FsZXMgbm93IGNvbnN0LgotCi1UdWUgTWFyICA3IDE2OjQxOjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jOiBTb3J0IHJlY2VudGx5IGFkZGVkIGluc3RydWN0aW9ucyBieSBtaW5vciBvcGNvZGUKLQludW1iZXIgd2l0aGluIG1ham9yIG9wY29kZSBudW1iZXIuCi0KLU1vbiBNYXIgIDYgMTA6MDQ6MzYgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEtZGlzLmM6IEluY2x1ZGUgbGliaHBwYS5oLgotCi1GcmkgRmViIDI0IDE5OjE1OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQ2hhbmdlIGRsaSB0byB1c2UgTV9ETEksIGFuZCBhZGQgZGxhLgotCi1Nb24gRmViIDIwIDIzOjU0OjM4IDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6ICBBZGQgdzY1LWRpcy5vLgotCi1UaHUgRmViIDE2IDE3OjM0OjQxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkIHI0NjUwIG11bCBpbnN0cnVjdGlvbi4KLQotV2VkIEZlYiAxNSAxNTo0NToyMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCB1bGQgYW5kIHVzZCBtYWNyb3MgZm9yIHVuYWxpZ25lZCBkb3VibGUgbG9hZCBhbmQKLSAgICAgICAgc3RvcmUuCi0KLVR1ZSBGZWIgMTQgMTM6MTc6MzcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IEFkZCA0MDNHQSBvcGNvZGVzIHJmY2ksIGRjY2NpLAotCW1mZGNyLCBtdGRjciwgaWNidCwgaWNjY2kuCi0KLVRodSBGZWIgIDkgMTI6Mjg6MTMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBpOTYwLWRpcy5jIChzdHJ1Y3QgdGFiZW50LCBzdHJ1Y3Qgc3BhcnNlX3RhYmVudCk6IENoYW5nZSB0aGUKLSAgICAgICAgc2lnbmVkIGNoYXIgZmllbGRzIHRvIHNob3J0cywgbW9yZSBwb3J0YWJsZS4KLQotV2VkIEZlYiAgOCAxNzoyOToyOSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGk5NjAtZGlzLmMgKHN0cnVjdCB0YWJlbnQsIHN0cnVjdCBzcGFyc2VfdGFiZW50KTogRGVjbGFyZSB0aGUKLSAgICAgICAgY2hhciBmaWVsZHMgYXMgc2lnbmVkIGNoYXJzLCBzaW5jZSB0aGV5IG1heSBoYXZlIG5lZ2F0aXZlIHZhbHVlcy4KLQotTW9uIEZlYiAgNiAxMDo1MjowNiAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKGRpczM4Nl90d29ieXRlKTogQWRkIGNwdWlkLCBGcm9tIENoYXJsZXMgSGFubnVtCi0JICAobXljcm9mdEBuZXRic2Qub3JnKS4KLQotTW9uIEphbiAzMCAxMjozODowMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tICJMb2dnLCBFZCIgPGVsb2dnQGVhLmNvbT46Ci0JKiBwcGMtb3BjLmMgKGV4dHJhY3RfYmRtKTogQ29ycmVjdCBwYXJlbnRoZXppc2F0aW9uLgotCSogcHBjLWRpcy5jIChwcmludF9pbnNuX3Bvd2VycGMpOiBQcmludCAubG9uZyBiZWZvcmUgdW5yZWNvZ25pemVkCi0JdmFsdWUuCi0KLVRodSBKYW4gMjYgMTg6MzI6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmM6IENoYW5nZXMgYmFzZWQgb24gcGF0Y2ggZnJvbSBEYXZpZCBFZGVsc29obgotCTxlZGVsc29obkBtaHBjYy5lZHU+LgotCShwb3dlcnBjX29wZXJhbmRzKTogQWRkIG9wZXJhbmRzIFNQUkJBVCBhbmQgU1BSRy4gU3BsaXQgVEJSIG91dCBvZgotCVNQUi4KLQkoRlhNX01BU0spOiBEZWZpbmUuCi0JKGluc2VydF90YnIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShleHRyYWN0X3Ricik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKFhGWEZYTV9NQVNLLCBYRlhNKTogRGVmaW5lLgotCShYU1BSQkFUX01BU0ssIFhTUFJHX01BU0spOiBEZWZpbmUuCi0JKHBvd2VycGNfb3Bjb2Rlcyk6IEFkZCBpbnN0cnVjdGlvbnMgdG8gYWNjZXNzIHNwZWNpYWwgcmVnaXN0ZXJzIGJ5Ci0JbmFtZS4gIEFkZCBtdGNyIGFuZCBtZnRidS4KLQotVHVlIEphbiAxNyAxMDo1Njo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKFAzKTogRGVmaW5lLgotCShtaXBzX29wY29kZXMpOiBBZGQgbWFkIGFuZCBtYWR1LgotCi1TdW4gSmFuIDE1IDE2OjMyOjU5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBXNjUgc3VwcG9ydC4KLQkqIGRpc2Fzc2VtYmxlLmM6IExpa2V3aXNlLgotCSogdzY1LW9wYy5oLCB3NjUtZGlzLmM6IE5ldyBmaWxlcy4KLQotV2VkIERlYyAyOCAyMjoxNTozMyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogQWRkIHN1cHBvcnQgZm9yIDIgYml0Ci0JaW1tZWRpYXRlcy4KLQotVHVlIERlYyAyMCAxMToyNToxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCBkbGkgYXMgYSBzeW5vbnltIGZvciBsaS4KLQotVGh1IERlYyAgOCAxODoyMzozMSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IEhhbmRsZSBjYWxsX3BhbCBpbnN0cnVjdGlvbiwgYW5kCi0JcHJpbnQgc29tZXRoaW5nIGZvciByZXNlcnZlZCBvcGNvZGUgdmFsdWVzLCBldmVuIGlmIGl0IHdvbid0Ci0JYXNzZW1ibGUgYWdhaW4uCi0KLQkqIG1pcHMtZGlzLmMgKF9wcmludF9pbnNuX21pcHMpOiBXaGVuIGluaXRpYWxpemluZywgc2hpZnQgcmlnaHQKLQlhbmQgbWFzaywgdG8gYXZvaWQgc2lnbiBleHRlbnNpb24gcHJvYmxlbXMgb24gdGhlIEFscGhhLgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZywgY2FzZSAnSicpOiBIYW5kbGUgYnVzY3IgYW5kIHBjcgotCWNvbnRyb2wgcmVnaXN0ZXJzLgotCi1XZWQgTm92IDIzIDIyOjM0OjUxIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIHNoLW9wYy5oIChtb3YubCBnYnIpOiBHZXQgZGlyZWN0aW9uIHJpZ2h0LgotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogTmV3IGZ1bmN0aW9uLgotCShwcmludF9pbnNuX3NobCwgcHJpbnRfaW5zbl9zaCk6IENhbGwgcHJpbnRfaW5zbl9zaHggdG8KLQlwcmludCBvcGNvZGVzIHdpdGggcmlnaHQgYnl0ZSBvcmRlci4KLQotVGh1IE5vdiAgMyAxOTozMjoyMiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBuczMyay1kaXMuYyAoc3RydWN0IG5zMzJrX29wdGlvbik6IFJlbmFtZWQgZnJvbSBzdHJ1Y3Qgb3B0aW9uLAotCXRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIGdldG9wdC4KLQotTW9uIE9jdCAzMSAxODo0ODoxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IFJlYWQgdGhlIGluc3RydWN0aW9uIHVzaW5nCi0JYmZkX2dldGIzMiwgc28gdGhhdCBpdCB3b3JrcyBvbiBhIGxpdHRsZSBlbmRpYW4gb3IgNjQgYml0IGhvc3QuCi0JUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBvcC4KLQotVHVlIE9jdCAyNSAxNzowNzo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IFVzZSBvciBpbnN0ZWFkIG9mIGFkZHUgZm9yIHBzZXVkby1vcCBtb3ZlLCBzaW5jZQotCWFkZHUgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgaWYgLW1pcHMzLgotCi1XZWQgT2N0IDE5IDEzOjQwOjE2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYTI5ay1kaXMuYyAocHJpbnRfc3BlY2lhbCk6IEFkZCBzcGVjaWFsIHJlZ2lzdGVyIG5hbWVzIGRlZmluZWQKLQlvbiAyOTAzMCwgMjkwNDAgYW5kIDI5MDUwLgotCShwcmludF9pbnNuKTogSGFuZGxlIG5ldyBvcGVyYW5kIHR5cGUgJ0knLgotCi1XZWQgT2N0IDEyIDExOjU5OjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBVc2UgdG9wIGxldmVsIGluc3RhbGwuc2ggc2NyaXB0LgotCi1XZWQgT2N0ICA1IDE5OjE2OjI5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmM6IFJld3JpdGUgdG8gdXNlIGJpdGZpZWxkcywgcmF0aGVyIHRoYW4gYSB1bmlvbiwgc28KLQl0aGF0IGl0IHdvcmtzIG9uIGEgbGl0dGxlIGVuZGlhbiBob3N0LgotCi1UdWUgT2N0ICA0IDEyOjE0OjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgJHtjb25maWdfc2hlbGx9IHdoZW4gcnVubmluZyBjb25maWcuYmZkLgotCi1XZWQgU2VwIDIxIDE4OjQ5OjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYyAobWlwc19vcGNvZGVzKTogImRhYnMiIGlzIG9ubHkgYXZhaWxhYmxlIHdpdGggLW1pcHMzLgotCi1UaHUgU2VwIDE1IDE2OjMwOjIyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYTI5ay1kaXMuYyAocHJpbnRfaW5zbik6IFByaW50IHRoZSBvcGNvZGUuCi0KLVdlZCBTZXAgMTQgMTc6NTI6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jIChtaXBzX29wY29kZXMpOiBTZXQgV1JfdCBmb3Igc2MgYW5kIHNjZC4KLQotU3VuIFNlcCAxMSAyMjozMjoxNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS1kaXMuYyAocmVnX25hbWVzKTogVXNlIHIyNi1yMjMgZm9yIGFyZzAtYXJnMy4KLQotVHVlIFNlcCAgNiAxMTozNzoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IFNldCBJTlNOX1NUT1JFX01FTU9SWSBmbGFnIGZvciBhbGwgaW5zdHJ1Y3Rpb25zCi0Jd2hpY2ggc3RvcmUgYSB2YWx1ZSBpbnRvIG1lbW9yeS4KLQotU3VuIFNlcCAwNCAxNzo1ODoxMCAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluLCBkaXNhc3NlbWJsZS5jOiBBZGQgc3VwcG9ydCBmb3IgdGhlIEFSTS4KLQkqIGFybS1kaXMuYywgYXJtLW9wYy5oOiBOZXcgZmlsZXMuCi0KLUZyaSBBdWcgIDUgMTQ6MDA6MDUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobnMzMmstZGlzLm8pOiBBZGQgZGVwZW5kZW5jeS4KLQkqIG5zMzJrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IERlY2xhcmUgaW5pdGlhbGl6ZWQgbG9jYWwgYXMKLQlzdHJpbmcsIG5vdCBhcyBhcnJheSBvZiBjaGFycy4KLQotVGh1IEp1bCAyOCAxODoxNDoxNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IEhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlICd4Jy4KLQotCSogc3BhcmMtb3BjLmM6IEFkZGVkIHNwYXJjbGl0ZSBleHRlbmRlZCBGUCBvcGVyYXRpb25zLCBhbmQKLQl2ZXJzaW9ucyBvZiB2OSBpbXBkZXAqIGluc3RydWN0aW9ucyBwZXJtaXR0aW5nIHNwZWNpZmljYXRpb24gb2YKLQl0aGUgT1BGIGZpZWxkLgotCi1UdWUgSnVsIDI2IDE2OjM2OjAzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGk5NjAtZGlzLmMgKHJlZ19uYW1lcyk6IE5vdyBjb25zdC4KLQkoc3RydWN0IHNwYXJzZV90YWJlbnQpOiBOZXcgdHlwZSwgY29waWVkIGZyb20gYXJyYXkgdHlwZSBpbiBtZW0KLQlmdW5jdGlvbi4KLQkoY3RybCk6IExvY2FsIHN0YXRpYyBhcnJheSBjdHJsX3RhYiBub3cgY29uc3QuCi0JKGNvYnIpOiBMb2NhbCBzdGF0aWMgYXJyYXkgY29icl90YWIgbm93IGNvbnN0LgotCShtZW0pOiBMb2NhbCB2YXJpYWJsZXMgcmVnMSwgcmVnMiwgcmVnMyBub3cgcG9pbnQgdG8gY29uc3QuICBMb2NhbAotCXN0YXRpYyB2YXJpYWJsZSBtZW1fdGFiIG5vIGxvbmdlciBleHBsaWNpdGx5IGluaXRpYWxpemVkLiAgQ2hhbmdlZAotCW1lbV9pbml0IHRvIGNvbnN0IGFycmF5IG9mIHN0cnVjdCBzcGFyc2VfdGFiZW50LgotCShyZWcpOiBMb2NhbCBzdGF0aWMgdmFyaWFibGUgcmVnX3RhYiBubyBsb25nZXIgZXhwbGljaXRseQotCWluaXRpYWxpemVkLiAgQ2hhbmdlZCByZWdfaW5pdCB0byBjb25zdCBhcnJheSBvZiBzdHJ1Y3QKLQlzcGFyc2VfdGFiZW50LgotCShlYSk6IExvY2FsIHN0YXRpYyBhcnJheSBzY2FsZV90YWIgbm93IGNvbnN0LgotCi0JKiBpOTYwLWRpcy5jIChyZWcpOiBBZGRlZCBpOTYwSlggaW5zdHJ1Y3Rpb25zIHRvIHJlZ19pbml0IHRhYmxlLgotCShSRUdfTUFYKTogVXBkYXRlZC4KLQotVHVlIEp1bCAxOSAyMTowMDowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIGNvbmZpZ3VyZS5iYXQ6IHRoZSBkaXNhc3NlbWJlciBuZWVkcyB0byBiZSBlbmFibGVkIGZvcgotCSJvYmpkdW1wIC1kIiB0byB3b3JrIGluIGRqZ3BwLgotCi1XZWQgSnVsIDEzIDE4OjAxOjU4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIG5zMzJrLWRpcy5jOiBEZWxldGVkIGFsbCBjb2RlIGluICIjaWZkZWYgR0RCIi4KLQkoaW52YWxpZF9mbG9hdCk6IEVuYWJsZWQgZ2VuZXJhbCB2ZXJzaW9uLCBkb2Vzbid0IHJlcXVpcmUgcnVubmluZwotCW9uIG5zMzJrIGhvc3QuICBDaGFuZ2VkIHRvIHRha2UgY2hhciogYXJndW1lbnQsIGFuZCB0ZXN0IGZvcgotCWV4cGxpY2l0bHkgc3BlY2lmaWVkIHNpemVzLCBpbnN0ZWFkIG9mIHVzaW5nIHNpemVvZigpIG9uIGhvc3QgQ1BVCi0JdHlwZXMuCi0JKElOVkFMSURfRkxPQVQpOiBDYXN0IGZpcnN0IGFyZ3VtZW50LgotCShvcHRfdSwgb3B0X1UsIG9wdF9PLCBvcHRfQywgb3B0X1MsIGxpc3RfUDUzMiwgbGlzdF9NNTMyLAotCWxpc3RfUDAzMiwgbGlzdF9NMDMyKTogTm93IGNvbnN0LgotCShvcHRsaXN0LCBsaXN0X3NlYXJjaCk6IE1hZGUgYXBwcm9wcmlhdGUgYXJndW1lbnRzIG5vdyBwb2ludCB0bwotCWNvbnN0LgotCShwcmludF9pbnNuX2FyZyk6IENoYW5nZWQgc3RhdGljIGFycmF5IG9mIG9uZS1jaGFyYWN0ZXItc3RyaW5nCi0JcG9pbnRlcnMgaW50byBhIHN0YXRpYyBjb25zdCBhcnJheSBvZiBjaGFyYWN0ZXJzOyBmaXhlZCBzcHJpbnRmCi0Jc3RhdGVtZW50IGFjY29yZGluZ2x5LgotCi1TdW4gSnVsIDEwIDAwOjI3OjQ3IDE5OTQgIElhbiBEYWxsICAoZGFsbEBoZnJkLmRzdG8uZ292LmF1KQotCi0JKiBvcGNvZGVzL25zMzJrLWRpcy5jOiBTZW1pLW5ldyBmaWxlLiAgSGFkIGFwcGFyZW50bHkgYmVlbiBkcm9wcGVkCi0JZnJvbSBkaXN0cmlidXRpb24uIEEgbnMzMmstZGlzLmMgZnJvbSBhIHByZXZpb3VzIGRpc3RyaWJ1dGlvbiBoYXMKLQliZWVuIGJyb3VnaHQgdXAgdG8gZGF0ZSBhbmQgc3VwcG9ydHMgdGhlIG5ldyBpbnRlcmZhY2UuCi0KLQkqIGRpc2Fzc2VtYmxlLmM6IGRlZmluZSBBUkNIX25zMzJrIGFuZCBhZGQgY2FzZSBiZmRfYXJjaF9uczMyay4KLQotCSogY29uZmlndXJlLmluOiBhZGQgYmZkX25zMzJrX2FyY2ggdGFyZ2V0IHN1cHBvcnQuCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgbnMzMmstZGlzLm8gdG8gQUxMX01BQ0hJTkVTLgotCUFkZCBuczMyay1kaXMuYyB0byBDRklMRVMuIEFkZCBkZXBlbmRlbmNpZXMgZm9yIG5zMzJrLWRpcy5vLgotCi1XZWQgSnVuIDI5IDIyOjEwOjM3IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBHZXQgMTZiaXQgYnJhbmNoCi0JZGlzYXNzZW1ibHkgcmlnaHQuCi0KLVR1ZSBKdW4gMjggMTM6MjI6MDYgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBoODMwMC1kaXMuYywgbWlwcy1kaXMuYzogRG9uJ3QgdXNlIHRydWUgYW5kIGZhbHNlLgotCi1UaHUgSnVuIDIzIDEyOjUzOjE5IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgLS13aXRoLXRhcmdldHMgdG8gLS1lbmFibGUtdGFyZ2V0cy4KLQotV2VkIEp1biAyMiAxMzozODozMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmMgKF9wcmludF9pbnNuX21pcHMpOiBCdWlsZCBhIHN0YXRpYyBoYXNoIHRhYmxlIG1hcHBpbmcKLQlvcGNvZGVzIHRvIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiB3aXRoIHRoYXQgb3Bjb2RlLCB0byBzcGVlZAotCWRpc2Fzc2VtYmx5IG9mIGxhcmdlIGZpbGVzLiAgRnJvbSByYWxwaGNAcHlyYW1pZC5jb20gKFJhbHBoCi0JQ2FtcGJlbGwpLgotCi1UdWUgSnVuICA3IDEyOjQ5OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogRml4IHR5cG8gKHdhcyBtb3N0eWNsZWFuKS4KLQotV2VkIE1heSAxMSAyMjozMjowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIGNvbmZpZ3VyZS5iYXQ6IHVwZGF0ZSB0byBsYXRlc3QgbWFrZWZpbGUuaW4KLQotU2F0IE1heSAgNyAxNzoxMzoyMSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBhMjlrLWRpcy5jIChwcmludF9pbnNuKTogUHJpbnQgJ3gnIHR5cGUgb3BlcmFuZCBpbiBoZXguCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogUHJpbnQgMTZiaXQgcmVscyBjb3JyZWN0bHkuCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaCk6IERvbid0IHJlY3VyIGVuZGxlc3NseSBpZiBkZWxheQotCXNsb3QgaW5zbiBpcyBpbiBhIGRlbGF5IHNsb3QuCi0JKiB6OGstb3BjLmg6IChyZXNmbGcpOiBGaXggcGF0dGVybnMuCi0JKiBoODUwMC1vcGMuaCBGaXggQ1IgaW5zbiBwYXR0ZXJucy4KLQotRnJpIE1heSAgNiAxNDozNDo0NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGNvZGVzKTogUHV0IFBvd2VyUEMgdmVyc2lvbnMgb2YgImNtcCIgYW5kCi0JImNtcGwiIGJlZm9yZSBQT1dFUiB2ZXJzaW9ucywgc28gdGhhdCBnYXMgLW1hbnkgdXNlcyB0aGVtLgotCi1UaHUgQXByIDI4IDE4OjMyOjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGRpc2Fzc2VtYmxlLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKE9GSUxFUyk6IEFkZCBkaXNhc3NlbWJsZS5vLgotCShkaXNhc3NlbWJsZS5vKTogUHJvdmlkZSBkZXBlbmRlbmNpZXM7IGNvbXBpbGUgd2l0aCAkKEFSQ0hERUZTKS4KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIEFSQ0hERUZTIGluIE1ha2VmaWxlLiAgQ29kZSB0YWtlbiBmcm9tCi0JYmludXRpbHMvY29uZmlndXJlLmluLgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX202OGspOiBJZiBGX0FMSUFTIGZsYWcgaXMgc2V0LCBza2lwIHRoZQotCW9wY29kZSBiZWluZyBleGFtaW5lZC4KLQotVGh1IEFwciAyMSAxNzowODo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGVyYW5kcyk6IEFkZGVkIFJBTCwgUkFNIGFuZCBSQVMuCi0JKGluc2VydF9yYWwsIGluc2VydF9yYW0sIGluc2VydF9yYXMpOiBOZXcgZnVuY3Rpb25zLgotCShwb3dlcnBjX29wY29kZXMpOiBVc2UgUkFMIGZvciBsb2FkIHdpdGggdXBkYXRlLCBSQU0gZm9yIGxtdywgYW5kCi0JUkFTIGZvciBzdG9yZSB3aXRoIHVwZGF0ZS4KLQotU2F0IEFwciAxNiAyMzo0MTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGNvZGVzKTogQ29ycmVjdCBmY2lyLiAgRnJvbSBEYXZpZCBFZGVsc29obgotCShlZGVsc29obkBucGFjLnN5ci5lZHUpLgotCi1XZWQgQXByICA2IDE3OjExOjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYyAobWlwc19vcGNvZGVzKTogQ29ycmVjdCBvcGVyYW5kcyBvZiAibm9yIiB3aXRoIGFuCi0JaW1tZWRpYXRlIGFyZ3VtZW50LgotCi1Nb24gQXByICA0IDE2OjMwOjQ2IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogRml4ICJyZCAlZnBycywlbDAiLgotCi1Nb24gQXByICA0IDEzOjIyOjAwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wZXJhbmRzKTogVGhlIHNpZ25lZHAgZmllbGQgaGFzIGJlZW4KLQlyZW1vdmVkLCBzbyBkb24ndCBpbml0aWFsaXplIGl0LiAgU2V0IHRoZSBQUENfT1BFUkFORF9TSUdORUQgZmxhZwotCWluc3RlYWQuICBBZGQgbmV3IG9wZXJhbmQgU0lTSUdOT1BULgotCShwb3dlcnBjX29wY29kZXMpOiBGb3IgbGlzLCBsaXUsIGFkZGlzLCBhbmQgY2F1IHVzZSBTSVNJR05PUFQuCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBEYXZpZCBFZGVsc29obiAoZWRlbHNvaG5AbnBhYy5zeXIuZWR1KS4KLQkqIHBwYy1kaXMuYyAocHJpbnRfaW5zbl9wb3dlcnBjKTogQ2hlY2sgUFBDX09QRVJBTkRfU0lHTkVEIHJhdGhlcgotCXRoYW4gc2lnbmVkcCBmaWVsZC4KLQotV2VkIE1hciAzMCAwMDozMTo0OSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGkzODYtZGlzLmMgKHN0cnVjdCBwcml2YXRlKTogIFJlbmFtZWQgdG8gZGlzX3ByaXZhdGUuIGBwcml2YXRlJwotCWlzIGEgcmVzZXJ2ZWQgd29yZCBmb3IgZHluaXggY2MuCi0KLU1vbiBNYXIgMjggMTM6MDA6MTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBlcnJvciBtZXNzYWdlIHRvIHJlZmVyIHRvIGJmZC9jb25maWcuYmZkCi0JcmF0aGVyIHRoYW4gYmZkL2NvbmZpZ3VyZS5pbi4KLQotTW9uIE1hciAyOCAxMjoyODozMCAxOTk0ICBEYXZpZCBFZGVsc29obiAgKGVkZWxzb2huQG5wYWMuc3lyLmVkdSkKLQotCSogcHBjLW9wYy5jOiBEZWZpbmUgUE9XRVIyIGFzIHNob3J0IGFsaWFzIGZsYWcuCi0JKHBvd2VycGNfb3Bjb2Rlcyk6IEFkZCBQT1dFUi8yIG9wY29kZXMgbGZxKiwgc3RmcSosIGZjaXJbel0sIGFuZAotCWZzcXJ0LgotCi1XZWQgTWFyIDIzIDEyOjIzOjA1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaTk2MC1kaXMuYyAocHJpbnRfaW5zbl9pOTYwKTogRG9uJ3QgcmVhZCBhIHNlY29uZCB3b3JkIGZvcgotCW9wY29kZXMgMCwgMSwgMiBhbmQgMy4KLQotV2VkIE1hciAxNiAxNTozNzo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbTY4ODgxLWV4dC5vIGZvciBiZmRfbTY4a19hcmNoLgotCi1Nb24gTWFyIDE0IDE0OjUzOjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbTY4ODgxLWV4dC5jOiBSZW1vdmVkOyBubyBsb25nZXIgdXNlZC4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2VkIGFjY29yZGluZ2x5LgotCi0JKiBtNjhrLWRpcy5jIChleHRfZm9ybWF0XzY4ODgxKTogRG9uJ3QgZGVjbGFyZS4KLQkocHJpbnRfaW5zbl9tNjhrKTogSWYgYW4gaW5zdHJ1Y3Rpb24gdXNlcyBwbGFjZSAnaScsIGl0IHVzZXMgYXQKLQlsZWFzdCBmb3VyIGZpeGVkIGJ5dGVzLgotCShwcmludF9pbnNuX2FyZyk6IERvbid0IGJ1bXAgcCBieSAyIGZvciBjYXNlICdJJywgcGxhY2UgJ2knLiAgRm9yCi0JZXh0ZW5kZWQgZmxvYXQsIGNvbnZlcnQgdG8gZG91YmxlIHVzaW5nIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSwgbm90Ci0JaWVlZV9leHRlbmRlZF90b19kb3VibGUsIGFuZCBmZXRjaCB0aGUgZGF0YSBiZWZvcmUgY29udmVydGluZyBpdC4KLQotVHVlIE1hciAgOCAxODoxMjoyNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IEl0J3Mgc3FydC5zLCBub3Qgc3FydC53LiAgRnJvbQotCWRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQgSm9obnNvbikuCi0KLVR1ZSBGZWIgIDggMTY6NTU6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IFRoZSBQT1dFUiB1c2VzIGJkbltsXVthXSB3aGVyZSB0aGUKLQlQb3dlclBDIHVzZXMgYmRueltsXVthXS4KLQotVHVlIEZlYiAgOCAwMDozMjoyOCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGRpcy1idWYuYywgaTM4Ni1kaXMuYzogIEluY2x1ZGUgc3lzZGVwLmguCi0KLU1vbiBGZWIgIDcgMTk6MjI6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGJmZF9wb3dlcnBjX2FyY2gpOiBVc2UgcHBjLWRpcy5vIGFuZCBwcGMtb3BjLm8uCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGNvZGVzKTogTWFyayBQT1dFUiBpbnN0cnVjdGlvbnMgc3VwcG9ydGVkCi0JYnkgTW90b3JvbGEgUG93ZXJQQyA2MDEgd2l0aCBQUENfT1BDT0RFXzYwMS4KLQkqIHBwYy1kaXMuYyAocHJpbnRfaW5zbl9iaWdfcG93ZXJwYywgcHJpbnRfaW5zbl9saXR0bGVfcG93ZXJwYyk6Ci0JRGlzYXNzZW1ibGUgTW90b3JvbGEgUG93ZXJQQyA2MDEgaW5zdHJ1Y3Rpb25zIGFzIHdlbGwgYXMgbm9ybWFsCi0JUG93ZXJQQyBpbnN0cnVjdGlvbnMuCi0KLVN1biBGZWIgIDYgMDc6NDU6MTcgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGk5NjAtZGlzLmMgKHJlZywgbWVtKTogSnVzdCB1c2UgYSBzdGF0aWMgYXJyYXkgaW5zdGVhZCBvZgotCWNhbGxpbmcgeG1hbGxvYy4KLQotU2F0IEZlYiAgNSAwMDowNDowMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogRm9yICc/JyBhbmQgJ0AnIG9ubHkgYWRqdXN0IHRoZQotCWNvbmRpdGlvbiBuYW1lIGluZGV4IGlmIHRoaXMgaXMgZm9yIGEgbmVnYXRlZCBjb25kaXRpb24uCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IE5vIHNwYWNlIGJlZm9yZSAnSCcgb3BlcmFuZC4KLQlGbG9hdGluZyBwb2ludCBmb3JtYXQgZm9yICdIJyBvcGVyYW5kIGlzIGJhY2t3YXJkcyBmcm9tIG5vcm1hbAotCWNhc2UgKDAgPT0gZG91YmxlLCAxID09IHNpbmdsZSkuICBGb3IgJzQnLCAnNicsICc3JywgJzknLCBhbmQgJzgnCi0Jb3BlcmFuZHMgKGZtcHlhZGQgYW5kIGZtcHlzdWIpLCBoYW5kbGUgYml6YXJyZSByZWdpc3RlcgotCXRyYW5zbGF0aW9uIGNvcnJlY3RseSBmb3Igc2luZ2xlIHByZWNpc2lvbiBmb3JtYXQuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IERvIG5vdCBlbWl0IGEgc3BhY2UgYWZ0ZXIgJ0YnCi0Jb3IgJ0knIG9wZXJhbmRzIGlmIHRoZSBuZXh0IGZvcm1hdCBzcGVjaWZpZXIgaXMgJ00nIChmY21wCi0JY29uZGl0aW9uIGNvbXBsZXRlcikuCi0KLUZlYiAgNCAyMzozODowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGVyYW5kcyk6IE5ldyBvcGVyYW5kIHR5cGUgTUJFIHRvIGhhbmRsZSBhCi0Jc2luZ2xlIG51bWJlciBnaXZpbmcgYSBiaXRtYXNrIGZvciB0aGUgTUIgYW5kIE1FIGZpZWxkcyBvZiBhbiBNCi0JZm9ybSBpbnN0cnVjdGlvbi4gIENoYW5nZSBOQiB0byBhY2NlcHQgMzIsIGFuZCB0dXJuIGl0IGludG8gMDsKLQlhbHNvIHR1cm4gMCBpbnRvIDMyIHdoZW4gZGlzYXNzZW1ibGluZy4gIFNlcGVyYXRlZCBTSCBmcm9tIE5CLgotCShpbnNlcnRfbWJlLCBleHRyYWN0X21iZSk6IE5ldyBmdW5jdGlvbnMuCi0JKGluc2VydF9uYiwgZXh0cmFjdF9uYik6IE5ldyBmdW5jdGlvbnMuCi0JKFNDX01BU0spOiBNYXNrIG91dCBTQSBhbmQgTEsgYml0cy4KLQkocG93ZXJwY19vcGNvZGVzKTogQ2hhbmdlICJjYWwiIHRvIHVzZSBSVCwgRCwgUkEgcmF0aGVyIHRoYW4gUlQsCi0JUkEsIFNJLiAgQ2hhbmdlICJsaXUiIGFuZCAiY2F1IiB0byB1c2UgVUkgcmF0aGVyIHRoYW4gU0kuICBNYXJrCi0JImJjdHIiIGFuZCAiYmN0cmwiIGFzIGFjY2VwdGVkIGJ5IFBPV0VSLiAgQ2hhbmdlICJybHdpbWkiLAotCSJybGltaSIsICJybHdpbWkuIiwgInJsaW1pLiIsICJybHdpbm0iLCAicmxpbm0iLCAicmx3aW5tLiIsCi0JInJsaW5tLiIsICJybG1pIiwgInJsbWkuIiwgInJsd25tIiwgInJsbm0iLCAicmx3bm0uIiwgInJsbm0uIiB0bwotCXVzZSBNQkUgcmF0aGVyIHRoYW4gTUIuICBBZGQgIm1mbXEiIGFuZCAibXRtcSIgUE9XRVIgaW5zdHJ1Y3Rpb25zLgotCShwb3dlcnBjX21hY3Jvcyk6IERlZmluZSB0YWJsZSBvZiBtYWNybyBkZWZpbml0aW9ucy4KLQkocG93ZXJwY19udW1fbWFjcm9zKTogRGVmaW5lLgotCi0JKiBwcGMtZGlzLmMgKHByaW50X2luc25fcG93ZXJwYyk6IERvbid0IHNraXAgb3B0aW9uYWwgb3BlcmFuZHMKLQlpZiBQUENfT1BFUkFORF9ORVhUIGlzIHNldC4KLQotU2F0IEphbiAyMiAyMzoxMDowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGk5NjAtZGlzLmMgKHByaW50X2luc25faTk2MCk6IE1ha2UgYnVmZmVyIGJmZF9ieXRlIGluc3RlYWQgb2YKLQljaGFyLiAgUmV0cmlldmUgY29udGVudHMgdXNpbmcgYmZkX2dldGwzMiBpbnN0ZWFkIG9mIHNoaWZ0aW5nLgotCi1GcmkgSmFuIDIxIDE5OjAxOjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLW9wYy5jOiBOZXcgZmlsZS4gIE9wY29kZSB0YWJsZSBmb3IgUG93ZXJQQywgaW5jbHVkaW5nCi0Jb3Bjb2RlcyBmb3IgUE9XRVIgKFJTLzYwMDApLgotCSogcHBjLWRpcy5jOiBOZXcgZmlsZS4gIFBvd2VyUEMgYW5kIFBvd2VyIChSUy82MDAwKSBkaXNhc3NlbWJsZXIuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIHBwYy1kaXMubyBhbmQgcHBjLW9wYy5vLgotCShDRklMRVMpOiBBZGQgcHBjLWRpcy5jLgotCShwcGMtZGlzLm8sIHBwYy1vcGMubyk6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluOiBCdWlsZCBwcGMtZGlzLm8gYW5kIHBwYy1vcGMubyBmb3IgYmZkX3JzNjAwMF9hcmNoLgotCi1Nb24gSmFuIDE3IDIwOjA1OjQ5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ04nIGluIGFzc2VtYmxlciB0ZW1wbGF0ZS4KLQlObyBzcGFjZSBiZWZvcmUgJ3UnLCAnZicsIG9yICdOJy4KLQotU3VuIEphbiAxNiAxNDoyMDoxNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni1kaXMuYyAocHJpbnRfaW5zbl9pMzg2KTogQWRkIEZJWE1FIGNvbW1lbnQgcmVnYXJkaW5nIHJlYWRpbmcKLQlmYXJ0aGVyIHRoYW4gd2Ugc2hvdWxkLgotCi0JKiBpMzg2LWRpcy5jIChkaXMzODYpOiBVc2UgWWIgYW5kIFl2IGZvciBzY2FzYiBhbmQgc2Nhc1MuCi0KLVRodSBKYW4gIDYgMTI6Mzg6MDUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1kaXMuYyBtNjhrLWRpcy5jIGFscGhhLWRpcy5jIGEyOWstZGlzLmM6IEZpeCBjb21tZW50cy4KLQotV2VkIEphbiAgNSAxMTo1NjoyMSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGk5NjAtZGlzLmMgKHByaW50X2luc25faTk2MCk6IE9ubHkgcmVhZCB3b3JkMiBpZiB0aGUgaW5zdHJ1Y3Rpb24KLQluZWVkcyBpdCwgdG8gcHJldmVudCByZWFkaW5nIHBhc3QgdGhlIGVuZCBvZiBhIHNlY3Rpb24uCi0KLVdlZCBOb3YgMTcgMTc6MjA6MTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5oOiBVc2UgbWFjcm8gZm9yIGogaW5zdHJ1Y3Rpb24sIHRvIHN1cHBvcnQgU1ZSNCBQSUMuCi0JUmVtb3ZlZCB0LEEgY2FzZSBmb3IgbGE7IGFsd2F5cyB1c2UgdCxBKGIpIGNhc2UuCi0KLU1vbiBOb3YgIDggMTI6Mzc6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JRnJvbSBUZWQgTGVtZW4gPG1lbGxvbkBwZXBwZXIubmNkLmNvbT4KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlICdrJy4KLQkqIG1pcHMtb3BjLmM6IE1ha2UgY2FjaGUgdXNlIGssIG5vdCB0LgotCi1TdW4gTm92ICA3IDIzOjUyOjM0IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogYWxwaGEtb3BjLmgsIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogIEFkZAotCUZMT0FUX01FTU9SWV9GT1JNQVRfQ09ERSwgRkxPQVRfQlJBTkNIX0ZPUk1BVF9DT0RFLCBjb3JyZWN0Ci0JRkxPQVRfRk9STUFUX0NPREUgdG8gcHV0IG91dCBmbG9hdGluZyBwb2ludCByZWdpc3RlciBuYW1lcy4KLQotTW9uIE5vdiAgMSAxODoxNzo1MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IFVzZSBtYWNyb3MgZm9yIGphbCB2YXJpYW50cywgdG8gc3VwcG9ydCBTVlI0IFBJQy4KLQotVGh1IE9jdCAyOCAxNzo0MjoyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGEyOWstZGlzLmMgKHByaW50X2luc24pOiBVc2UgMHglMDh4LCBub3QgMHglOHguCi0KLVdlZCBPY3QgMjcgMTE6NDg6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jIChkc2xsLCBkc3JhLCBkc3JsKTogQWRkZWQgJz4nIGNhc2VzIGZvciBzaGlmdCBjb3VudHMKLQlsYXJnZXIgdGhhbiAzMi4gIE1vdmVkIGRzeHgzMiB2YXJpYW50cyBmaXJzdCBmb3IgZGlzYXNzZW1ibGVyLgotCi1Nb24gT2N0IDI1IDExOjMzOjE0IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIHo4a2dlbi5jLCB6OGstb3BjLmg6IEFkZCBmdWxsIGxkYSBpbmZvcm1hdGlvbi4KLQotVHVlIE9jdCAxOSAxMjozOToyNSAxOTkzICBKZWZmcmV5IEEgTGF3ICAobGF3QGNzLnV0YWguZWR1KQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBEbyBub3QgZW1pdCBhIHNwYWNlIGFmdGVyCi0JbW92YiBpbnN0cnVjdGlvbnMuICBBbnkgbmVjZXNzYXJ5IHNwYWNlIHdpbGwgYmUgZW1pdHRlZCBieQotCXRoZSBjb2RlIHRvIGhhbmRsZSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlcnMuCi0KLVdlZCBPY3QgMTMgMTY6MTk6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBNb3ZlZCBsLmQgZG93biBzbyB0aGF0IGl0IGRpc2Fzc2VtYmxlcyBhcyBsZGMxLgotCi1GcmkgT2N0ICA4IDAyOjM0OjIxIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogYWxwaGEtb3BjLmg6ICBBZGQgbGRsX2wsIGZpeCB0eXBvIGZvciBsZHFfdS4KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogIEFkZCBjb2RlIGZvciBQQUxfRk9STUFUX0NPREUuCi0KLVR1ZSBPY3QgIDUgMTc6NDc6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBDb3JyZWN0IGx3dSBvcGNvZGUgdmFsdWUgKGJvb2sgaGFkIGl0IHdyb25nKS4KLQotVGh1IFNlcCAzMCAxMToyNjoxOCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiB6OGstZGlzLmMgKEZFVENIX0RBVEEpOiBnZXQganVzdCB0aGUgcmlnaHQgYW1vdW50IG9mIGRhdGEuCi0JKHVucGFja19pbnN0cik6IENvcGUgd2l0aCBBUkdfSU1NNE0xIHR5cGUgaW5zdHJ1Y3Rpb25zLgotCi1XZWQgU2VwIDI5IDE2OjI0OjQ5IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogbTg4ay1kaXMuYyAobTg4a2Rpcyk6IGNvbW1lbnQgY2hhbmdlLiAgUmVtb3ZlIHNwYWNlIGFmdGVyCi0JICBwcmludGluZyBtbmVtb25pYy4KLQkgIChwcmludG9wKTogaGFuZGxlIG5ldyBhcmcgdHlwZXMgREVDIGFuZCBYUkVHIGZvciBtODgxMTAuCi0KLVR1ZSBTZXAgMjggMTk6MjA6MTYgMTk5MyAgSmVmZnJleSBBIExhdyAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ3onIG9wZXJhbmQKLQl0eXBlIGZvciBhYnNvbHV0ZSBicmFuY2ggYWRkcmVzc2VzLiAgRGVsZXRlIHNwZWNpYWwKLQkiYmxlIiBhbmQgImJlIiBjb2RlIGluICdXJyBvcGVyYW5kIGNvZGUuCi0KLUZyaSBTZXAgMjQgMTQ6MDg6MzMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBTZXQgaGF6YXJkIGluZm9ybWF0aW9uIGNvcnJlY3RseSBmb3IgYnJhbmNoCi0JbGlrZWx5IGluc3RydWN0aW9ucy4KLQotRnJpIFNlcCAxNyAwNDo0MToxNyAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKSwgYWxwaGEtb3BjLmg6ICBGaXggYnVncywgdXNlCi0JaW5mby0+ZnByaW50Zl9mdW5jIGZvciBwcmludGluZyBhbmQgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIGZvcgotCWFkZHJlc3Mgb3V0cHV0LgotCi1XZWQgU2VwIDE1IDEyOjEyOjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogU2V0IElOU05fVFJBUCBmb3IgdFhYIGluc3RydWN0aW9ucy4KLQotVGh1IFNlcCAgOSAxMDoxMToyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IEZyb20gZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZCBKb2huc29uKToKLQlDb3JyZWN0ZWQgc2Vjb25kIGNhc2Ugb2YgImIiIGZvciBkaXNhc3NlbWJsZXIuCi0KLVR1ZSBTZXAgIDcgMTQ6MjU6MTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jLCBtODhrLWRpcy5jOiBEb24ndCBpbmNsdWRlIGxpYmJmZC5oLiAgQ2hhbmdlZCBjYWxscwotCXRvIEJGRCBzd2FwcGluZyByb3V0aW5lcyB0byBjb3JyZXNwb25kIHRvIEJGRCBuYW1lIGNoYW5nZXMuCi0KLVRodSBTZXAgIDIgMTA6MzU6MjUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBDaGFuZ2UgZGl2IG1hY2hpbmUgaW5zdHJ1Y3Rpb24gdG8gYmUgeixzLHQgcmF0aGVyCi0JdGhhbiBzLHQuICBDaGFuZ2UgZGl2IG1hY3JvIHRvIGJlIGQsdix0IHJhdGhlciB0aGFuIGQscyx0LgotCUxpa2V3aXNlIGZvciBkaXZ1LCBkZGl2LCBkZGl2dS4gIEFkZGVkIHoscyx0IGNhc2UgZm9yIGRyZW0sIGRyZW11LAotCXJlbSBhbmQgcmVtdSB3aGljaCBnZW5lcmF0ZXMgb25seSB0aGUgY29ycmVzcG9uZGluZyBkaXYKLQlpbnN0cnVjdGlvbi4gIFRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgTUlQUyBhc3NlbWJsZXIsCi0Jd2hpY2ggb25seSBnZW5lcmF0ZXMgdGhlIHNpbXBsZSBtYWNoaW5lIGluc3RydWN0aW9uIHdoZW4gYW4KLQlleHBsaWNpdCBkZXN0aW5hdGlvbiBvZiAkMCBpcyB1c2VkLgotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgJ3onIChhbHdheXMgcmVnaXN0ZXIgemVybykuCi0KLVRodSBBdWcgMjYgMTc6NDE6NDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBGcm9tIGRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQgSm9obnNvbik6IFNldAotCVdSXzMxIGhhemFyZCBmb3IgYmFsLCBiZ2V6YWwsIGJsdHphbC4KLQotVGh1IEF1ZyAyNiAxNzoyMDowMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogVXNlIHByaW50IGZ1bmN0aW9uCi0JZnJvbSB3aXRoaW4gdGhlIGRpc2Fzc2VtYmxlX2luZm8sIG5vdCBmcHJpbnRmX2ZpbHRlcmVkLgotCi1XZWQgQXVnIDI1IDEzOjUxOjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICd8JyBsaWtlICc+Jy4gIChGcm9tIEplZmYKLQlMYXcsIGxhd0Bjcy51dGFoLmVkdS4pCi0KLU1vbiBBdWcgMjMgMTI6NDQ6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jICgiYWJzdSIpOiBSZW1vdmVkLgotCSgiZGFicyIpOiBBZGRlZC4KLQotRnJpIEF1ZyAyMCAxMDo1Mjo1MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IEFkZGVkIHI2MDAwIGFuZCByNDAwMCBpbnN0cnVjdGlvbnMgYW5kIG1hY3Jvcy4KLQlDaGFuZ2VkIGhhemFyZCBpbmZvcm1hdGlvbiB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIG1lbW9yeSBsb2FkCi0JZGVsYXlzIGFuZCBjb3Byb2Nlc3NvciBsb2FkIGRlbGF5cy4KLQotV2VkIEF1ZyAxOCAxNTozOToyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IGxpLmQgdXNlcyAiVCxMIiwgbm90ICJTLEYiLiAgQWRkZWQgbGkucy4KLQotVHVlIEF1ZyAxNyAwOTo0NDo0MiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgcGFzcyBjcHUgdG8gY29uZmlnLmJmZC4KLQotVHVlIEF1ZyAxNyAxMjoyMzo1MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG04OGstZGlzLmMgKG04OGtkaXMpOiBNYWtlIGNsYXNzIHVuc2lnbmVkLgotCi1UaHUgQXVnIDEyIDE1OjA4OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBPbmUgYnJhbmNoIGZvcm1hdCBjYXNlIHdhcwotCW1pc3NpbmcgdGhlIGluc3RydWN0aW9uIG5hbWUuCi0KLVdlZCBBdWcgMTEgMTk6Mjk6MzkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogUmVuYW1lZCBmcm9tIERJU19MSUJTLgotCUFkZCB0aGUgYXJjaC1zcGVjaWZpYyBhdXhpbGlhcnkgZmlsZXMuCi0JKE9GSUxFUyk6IFJlbW92ZSB0aGUgYXJjaC1zcGVjaWZpYyBhdXhpbGlhcnkgZmlsZXMKLQlhbmQgdXNlIEJGRF9NQUNISU5FUyBpbnN0ZWFkIG9mIERJU19MSUJTLgotCSogY29uZmlndXJlLmluOiBTZXQgQkZEX01BQ0hJTkVTIGJhc2VkIG9uIC0td2l0aC10YXJnZXRzIG9wdGlvbi4KLQotVGh1IEF1ZyAxMiAxMjowNDo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IEFkZGVkIGx3YzEgRSxBKGIpIHRvIGdvIHdpdGggbHdjMSBULEEoYikuICBTaW1pbGFybHkKLQlmb3Igc3djMS4KLQotU3VuIEF1ZyAgOCAxNTowOTozMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtb3BjLmM6IENoYW5nZSBDT05TVCB0byBjb25zdCB0byBkZWFsIHdpdGggZ2NjCi0JLURjb25zdD1fX2NvbnN0IC10cmFkaXRpb25hbC4KLQotRnJpIEF1ZyAgNiAxMDo1ODo1NSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IEZyb20gZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZCBKb2huc29uKTogVG9vawotCWNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyBvdXQgb2YgI2lmIDAsIGFuZCBtYWRlIHRoZW0gdXNlIG5ldwotCWFyZ3VtZW50IHR5cGUgIkMiLgotCi1UaHUgQXVnICA1IDE3OjExOjA2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1kaXMuYzogSW5jbHVkZSBhbnNpZGVjbC5oIGJlZm9yZSBvcGNvZGVzL3NwYXJjLmguCi0KLUZyaSBKdWwgMzAgMTg6NDg6MTUgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLW9wYy5jOiAgQWRkIEZfSlNSLCBGX1VOQlIsIG9yIEZfQ09OREJSIGZsYWdzIHRvIGVhY2ggYnJhbmNoCi0JaW5zdHJ1Y3Rpb24sIGZvciB1c2UgYnkgdGhlIGRpc2Fzc2VtYmxlci4KLQotCSogc3BhcmMtZGlzLmMgKFNFWCk6ICBBZGQgc2lnbiBleHRlbnNpb24gbWFjcm8uICBSZXBsYWNlIG1hbnkKLQloYW5kLWNvZGVkIHNpZ24gZXh0ZW5zaW9ucyB0aGF0IGRlcGVuZGVkIG9uIDMyLWJpdCBob3N0IGludHMuCi0JRklYTUUsIHdlIHN0aWxsIGRlcGVuZCBvbiBiaWctZW5kaWFuIGhvc3QgYml0ZmllbGQgb3JkZXJpbmcuCi0JKHNwYXJjX3ByaW50X2luc24pOiAgU2V0IHRoZSBpbnNuX2luZm9fdmFsaWQgZmllbGQsIGFuZCB0aGUKLQlvdGhlciBmaWVsZHMgdGhhdCBkZXNjcmliZSB0aGUgaW5zdHJ1Y3Rpb24gYmVpbmcgcHJpbnRlZC4KLQotVHVlIEp1bCAyNyAxNzowNDo1OCAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLW9wYy5jIChjYWxsKTogQWNjZXB0IGFsbCA2IGFkZHJlc3NpbmcgbW9kZXMgdmFsaWQgZm9yCi0JYGptcCcgaW5zdGVhZCBvZiBqdXN0IG9uZSBvZiB0aGVtLgotCi1XZWQgSnVsIDIxIDExOjQzOjMyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jOiBNb3ZlIGZsb2F0aW5nIHJlZ2lzdGVycyBmcm9tIHJlZ19uYW1lcyB0byBmcF9yZWdfbmFtZXMuCi0JKGZwdXRfZnBfcmVnX3IpOiBSZW5hbWVkIGZyb20gZnB1dF9yZWdfci4KLQkoZnB1dF9mcF9yZWcpOiBOZXcgZnVuY3Rpb24uCi0JKHByaW50X2luc25faHBwYSk6IFVzZSBmcHV0X2ZwX3JlZ3ssX3J9IHdoZXJlIGFwcHJvcHJpYXRlLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEsIGNhc2VzICdhJywgJ2QnKTogUHJpbnQgc3BhY2UgYWZ0ZXJ3YXJkcy4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhLCBjYXNlICdkJyk6IFVzZSBHRVRfQ09ORCBub3QgR0VUX0ZJRUxELgotCi1Nb24gSnVsIDE5IDEzOjUyOjIxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBVc2UgZXh0cmFjdF81cl9zdG9yZSBmb3IgJ3InLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEsIGNhc2UgJz4nKTogSWYgbmV4dCBjaGFyYWN0ZXIgaXMgJ24nLAotCWRvbid0IG91dHB1dCBhIHNwYWNlLgotCi0JKiBocHBhLWRpcy5jIChmbG9hdF9mb3JtYXRfbmFtZXMpOiAxMCBpcyB1bmRlZmluZWQsIGFuZCAxMSBpcyBxdWFkLgotCi1TdW4gSnVsIDE4IDE2OjMwOjAyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBydGwuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogTmV3IGZpbGUsIGNvbnRhaW5pbmcgb3Bjb2RlIHRhYmxlIGZyb20KLQkuLi9pbmNsdWRlL29wY29kZS9taXBzLmguCi0JKiBNYWtlZmlsZS5pbjogQWRkIGl0LgotCi1UaHUgSnVsIDE1IDEyOjM3OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbTg4ay1kaXMuYzogTmV3IGZpbGUsIG1vdmVkIGluIGZyb20gZ2RiIGFuZCBjaGFuZ2VkIHRvIHVzZSB0aGUKLQluZXcgZGlzLWFzbS5oIGRpc2Fzc2VtYmxlciBpbnRlcmZhY2UuCi0JKiBNYWtlZmlsZS5pbiAoRElTX0xJQlMpOiBBZGRlZCBtODhrLWRpcy5vLgotCShtODhrLWRpcy5vKTogTmV3IHRhcmdldC4KLQotVHVlIEp1bCAxMyAxMDowNDoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnLCBfcHJpbnRfaW5zbl9taXBzKTogTWFkZSBwb2ludGVyIHRvCi0JYXJndW1lbnQgc3RyaW5nIGNvbnN0IGNoYXIgKiB0byBjb3JyZXNwb25kIHRvIG9wY29kZS9taXBzLmguCi0KLVR1ZSBKdWwgIDYgMTU6MTg6MzcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jOiBVcGRhdGVkIHRvIGFjY291bnQgZm9yIG5hbWUgY2hhbmdlcyBpbiBuZXcgdmVyc2lvbgotCW9mIG9wY29kZS9taXBzLmguCi0JKiBNYWtlZmlsZS5pbjogQWRkZWQgaGVhZGVyIGZpbGUgZGVwZW5kZW5jaWVzLgotCi1TYXQgSnVsICAzIDIzOjQ3OjU2IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBDb3JyZWN0IGZldGNoaW5nIG9mIGluc3RydWN0aW9uLgotCi1UaHUgSnVsICAxIDEyOjIzOjM4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBtNjhrLWRpcy5jIChORVhUV09SRCwgTkVYVExPTkcpOiBVc2UgKCh4KSBeIDB4ODAwMCkgLSAweDgwMDAgdG8gc2lnbgotCWV4dGVuZCwgcmF0aGVyIHRoYW4gc2hpZnRzLgotCi1TdW4gSnVuIDIwIDIwOjU2OjU2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogVW5kbyAxNSBKdW5lIGNoYW5nZS4KLQotRnJpIEp1biAxOCAxNDoxNToxNSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiAgQ2hhbmdlIHJldHVybiB2YWx1ZSB0byBieXRlIGNvdW50Ci0Jb3IgZXJyb3IgY29kZS4KLQkqIG02OGstZGlzLmM6ICBSZS13cml0ZSB0byBkZXRlY3QgaW52YWxpZCBvcGVyYW5kcyBiZWZvcmUKLQlwcmludGluZyBhbnl0aGluZywgc28gd2UgY2FuIGhhbmRsZSB0aGlzIHRoZSBzYW1lIHdheSB3ZQotCWhhbmRsZSBpbnZhbGlkIG9wY29kZXMuCi0KLVRodSBKdW4gMTcgMTU6MDE6MzYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogc2gtZGlzLmMsIHNoLW9wYy5oOiBVbmRlcnN0YW5kIHNvbWUgbW9yZSBvcGNvZGVzLgotCi1XZWQgSnVuIDE2IDEzOjQ4OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYzogSW5jbHVkZSA8YW5zaWRlY2wuaD4gYW5kIHN5c2RlcC5oIGJlZm9yZSBvdGhlcgotCWhlYWRlciBmaWxlcy4KLQotVHVlIEp1biAxNSAyMTo0NToyNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLWRpcy5jOiBEb24ndCBkZWNsYXJlIHFzb3J0LCBzaW5jZSBzeXNkZXAuaCBtaWdodC4KLQotCSogY29uZmlndXJlLmluOiBEbyBtYWtlIHN5c2RlcC5oIGxpbmsuCi0JKiBNYWtlZmlsZS5pbjogU2VhcmNoIC4uL2luY2x1ZGUuICBEb24ndCBzZWFyY2ggLi4vYmZkLgotCi1UdWUgSnVuIDE1IDEzOjM2OjEwIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQlDaGFuZ2VzIGZyb20gSmVmZiBMYXcsIGxhd0Bjcy51dGFoLmVkdToKLQkqIGhwcGEtZGlzLmM6IEZpeCB0eXBvLiAgJ2EnIGFuZCAnZCcgd2VyZSByZXZlcnNlZC4KLQlEbyBub3QgcHJpbnQgYSBzcGFjZSBiZWZvcmUgdGhlIGNvbXBsZXRlcnMgc3BlY2lmaWVkIGJ5Ci0JJ2EnIGFuZCAnZCcuCi0KLUZyaSBKdW4gMTEgMTg6NDA6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmM6IE5vIGxvbmdlciBuZWVkIHRvIGJvbWIgb3V0IGlmIEhPU1RfNjRfQklUIGlzCi0JZGVmaW5lZCwgc2luY2UgZ2RiIGhhcyBiZWVuIGZpeGVkLgotCi0JQ2hhbmdlcyBmcm9tIEplZmYgTGF3LCBsYXdAY3MudXRhaC5lZHU6Ci0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBMYXN0IGFyZ3VtZW50IHRvIGZwdXRfcmVnLAotCWZwdXRfcmVnX3IsIGZwdXRfY3JlZywgZnB1dF9jb25zdCwgYW5kIGZwdXRzX2ZpbHRlcmVkIHNob3VsZAotCWJlIGEgKmRpc2Fzc2VtYmxlX2luZm8sIG5vdCBhICpGSUxFLgotCSogaHBwYS1kaXMuYzogU3VwcG9ydCAnZCcsICchJywgYW5kICdhJy4KLQkqIGhwcGEtZGlzLmM6IFN1cHBvcnQgJ3MnIHRvIGV4dHJhY3QgYSAyIGJpdCBzcGFjZSByZWdpc3Rlci4KLQkqIGhwcGEtZGlzLmM6IERlbGV0ZSBjYXNlcyB3aGljaCBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KLQotRnJpIEp1biAxMSAwNzo1Mzo0OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl97bTY4ayxhcmd9KTogQWRkIE1NVSBjb2Rlcy4KLQotVHVlIEp1biAgOCAxMjoyNTowMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBoODMwMC1kaXMuYzogTmV3IGZpbGUsIHJlbW92ZWQgZnJvbSBiZmQvY3B1LWg4MzAwLmMsIHdpdGgKLQlIOC8zMDAtSCBvcGNvZGVzLgotCi1Nb24gSnVuICA3IDEyOjU4OjQ5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENTRUFSQ0gpOiBBZGQgLUkuLi9iZmQgZm9yIHN5c2RlcC5oIGFuZCBiZmQuaC4KLQkqIGNvbmZpZ3VyZS5pbjogIE5vIGxvbmdlciBuZWVkIHRvIGNvbmZpZ3VyZSB0byBnZXQgc3lzZGVwLmguCi0KLVRodSBKdW4gIDMgMTU6NTY6NDkgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogUGF0Y2hlcyBmcm9tIEplZmZyZXkgTGF3IDxsYXdAY3MudXRhaC5lZHU+LgotCSogaHBwYS1kaXMuYzogU3VwcG9ydCAnSScsICdKJywgYW5kICdLJyBpbiBvdXRwdXQKLQl0ZW1wbGF0ZXMgZm9yIDEuMSBGUCBjb21wdXRhdGlvbmFsIGluc3RydWN0aW9ucy4KLQotVHVlIE1heSAyNSAxMzowNTo0OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGg4NTAwLWRpcy5jIChwcmludF9pbnNuX2g4NTAwKTogQWRkcmVzcyBhcmd1bWVudCBpcyB0eXBlCi0JYmZkX3ZtYS4KLQkqIHo4ay1kaXMuYyAocHJpbnRfaW5zbl96OGssIHByaW50X2luc25fejgwMDEsIHByaW50X2luc25fejgwMDIpOgotCURpdHRvLgotCi0JKiBoODUwMC1vcGMuaCAoYWRkcl9jbGFzc190eXBlKTogTm8gY29tbWEgYXQgZW5kIG9mIGVudW1lcmF0b3IuCi0JKiBzaC1vcGMuaCAoc2hfbmliYmxlX3R5cGUsIHNoX2FyZ190eXBlKTogRGl0dG8uCi0KLQkqIHNwYXJjLWRpcy5jIChjb21wYXJlX29wY29kZXMpOiBNb3ZlIHN0YXRpYyBkZWNsYXJhdGlvbiB0bwotCXRvcC1sZXZlbC4KLQotRnJpIE1heSAyMSAxNDoxNzozNyAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogSW1wbGVtZW50ICduJyBhcmd1bWVudCBmb3IgdW5pbXAKLQlpbnN0cnVjdGlvbiwgcmVtb3ZlIHVuaW1wIGhhY2sgZnJvbSAnbCcgYXJndW1lbnQuCi0KLVdlZCBNYXkgMTkgMTU6MzU6NTQgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jIChmZXRjaF9kYXRhKTogIFVzZSB1bnNpZ25lZCBjaGFyIHRvIG1ha2UgYW5jaWVudCBnY2MncwotCWhhcHB5LgotCi1GcmkgTWF5IDE0IDE1OjIyOjQ2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogQmFzZWQgb24gcGF0Y2hlcyBmcm9tIGRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQgSm9obnNvbik6Ci0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEhhbmRsZSAnQycgZm9yIGdlbmVyYWwgY29wcm9jZXNzb3IKLQlpbnN0cnVjdGlvbnMuCi0KLUZyaSBNYXkgMTQgMDA6MDk6MTQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jOiBJbmNsdWRlIGRpcy1hc20uaCBiZWZvcmUgc3lzZGVwLmguICBDaGFuZ2VkIHNvbWUKLQlhcnJheXMgb2Ygc3RyaW5nIHBvaW50ZXJzIHRvIDItZCBhcnJheXMgb2YgY2hhcnMsIHRvIHNhdmUKLQlzcGFjZS4KLQotVGh1IE1heSAgNiAyMDo1MToxNyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYTI5ay1kaXMuYywgYWxwaGEtZGlzLmMsIGk5NjAtZGlzLmMsIHNwYXJjLWRpcy5jLCB6OGstZGlzLmM6Ci0JQ2FzdCBzZWNvbmQgYXJnIHRvIHJlYWRfbWVtb3J5X2Z1bmMgdG8gImJmZF9ieXRlICoiLCBhcyBuZWNlc3NhcnkuCi0KLVR1ZSBNYXkgIDQgMjA6MzE6MTAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jOiBOZXcgZmlsZSBmcm9tIFV0YWgsIGFkYXB0ZWQgdG8gbmV3IGRpc2Fzc2VtYmxlcgotCWNhbGxpbmcgaW50ZXJmYWNlLgotCSogTWFrZWZpbGUuaW46IEluY2x1ZGUgaXQuCi0KLU1vbiBBcHIgMjYgMTg6MTc6NDIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNoLWRpcy5jLCBzaC1vcGMuaDogTmV3IGZpbGVzLgotCi1GcmkgQXByIDIzIDE4OjUxOjIyIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhbHBoYS1kaXMuYywgYWxwaGEtb3BjLmg6IE5ldyBmaWxlcy4KLQotVHVlIEFwciAgNiAxMjo1NDowOCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIG1pcHMtZGlzLmM6IFNpZ24gZXh0ZW5kICdqJyBhbmQgJ2InIGFyZ3VtZW50cywgZGVsdGEgaXMgYSBzaWduZWQKLQl2YWx1ZS4KLQotTW9uIEFwciAgNSAxNzozNzozNyAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtZGlzLmM6IE1ha2UgInRhIiB0aGUgZGVmYXVsdCB0cmFwIGluc3RydWN0aW9uLCAidCIgdGhlIGFsaWFzLgotCi1GcmkgQXByICAyIDA3OjI0OjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYTI5ay1kaXMuYywgc3BhcmMtZGlzLmMsIHNwYXJjLW9wYy5jOiBVc2UgQ09OU1QgcmF0aGVyIHRoYW4KLQljb25zdC4KLQotVGh1IEFwciAgMSAxMToyMDo0MyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtZGlzLmM6IFVzZSBmcHJpbnRmX2Z1bmMgYSBmZXcgcGxhY2VzIHdoZXJlIEkgZm9yZ290LAotCWFuZCBkb3VibGUgcGVyY2VudCBzaWducyBhIGZldyBwbGFjZXMuCi0KLQkqIGEyOWstZGlzLmMsIGk5NjAtZGlzLmM6IE5ldywgbWVyZ2VkIGZyb20gZ2RiIGFuZCBiaW51dGlscy4KLQotCSogaTM4Ni1kaXMuYywgbTY4ay1kaXMuYywgbWlwcy1kaXMuYywgc3BhcmMtZGlzLmM6Ci0JVXNlIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyBub3QgcHJpbnRfYWRkcmVzcy4KLQotCSogZGlzLWJ1Zi5jIChnZW5lcmljX3ByaW50X2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24uCi0KLVdlZCBNYXIgMzEgMTA6MDc6MDQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgc3BhcmMtZGlzLmMuCi0Jc3BhcmMtZGlzLmM6IE5ldyBmaWxlLCBtZXJnZXMgYmludXRpbHMgYW5kIGdkYiB2ZXJzaW9ucyBhcyBmb2xsb3dzOgotCUZyb20gR0RCOgotCSAgICBBZGQgYGFkZCcgaW5zdHJ1Y3Rpb24gdG8gdGhlIHNldCB0aGF0IGdldCBjaGVja2VkCi0JICAgIGZvciBhIHByZWNlZGluZyBgc2V0aGknIGluIG9yZGVyIHRvIHByaW50IGFuIGFic29sdXRlIGFkZHJlc3MuCi0JICAgICogKHByaW50X2luc24pOiAgRGlzYXNzZW1ibHkgcHJlZmVycyByZWFsIGluc3RydWN0aW9ucy4KLQkgICAgKGlzX2RlbGF5ZWRfYnJhbmNoKTogIFNwZWVkIHVwLgotCSAgICAqIHNwYXJjLW9wY29kZS5oOiBBZGQgQUxJQVMgYml0IHRvIGFsaWFzZXMuICBGaXggdXAgb3Bjb2RlIHRhYmxlcy4KLQkgICAgU3RpbGwgbWlzc2luZyBzb21lIGZsb2F0IG9wcywgYW5kIG5lZWRzIHRlc3RpbmcuCi0JICAgICogc3BhcmMtcGluc24uYyAocHJpbnRfaW5zbik6IEVsaW1pbmF0ZSAnc2V0JyB0ZXN0LCBzdWJzdW1lZCBieQotCSAgICBGX0FMSUFTLiAgVXNlIHByaW50Ziwgbm90IGZwcmludGYsIHdoZW4gbm90IHBhc3NpbmcgYSBmaWxlCi0JICAgIHBvaW50ZXIuLi4KLQkgICAgKGNvbXBhcmVfb3Bjb2Rlcyk6IENoZWNrIHRoYXQgaWRlbnRpY2FsIGluc3RydWN0aW9ucyBoYXZlCi0JICAgIGlkZW50aWNhbCBvcGNvZGVzLCBjb21wbGFpbiBvdGhlcndpc2UuCi0JRnJvbSBiaW51dGlsczoKLQkgICAgKiBOZXcgJ20nIGFyZy4KLQkgICAgKiBJbmNsdWRlIHJlZ19uYW1lcy4KLQlGcm9tIG5laXRoZXI6Ci0JICAgIFVzZSBkaXMtYXNtLmgvcmVhZF9tZW1vcnlfZnVuYyBpbnRlcmZhY2UuCi0KLVdlZCBNYXIgMzEgMjA6NDk6MDYgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBoODUwMC1kaXMuYywgaTM4Ni1kaXMuYywgbTY4ay1kaXMuYywgejhrLWRpcy5jIChmZXRjaF9kYXRhKToKLQkgIGRlbGliZXJhdGVseSByZXR1cm4gbm9uLXplcm8gdG8gc2V0am1wIGZyb20gbG9uZ2ptcC4gIE90aGVyd2lzZQotCSAgdGhpcyBjb2RlIGZhaWxzIHRvIGNvbXBpbGUuCi0KLVdlZCBNYXIgMzEgMTc6MDQ6MzEgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogbTY4ay1kaXMuYzogIEZpeCBwcm90b3R5cGUgZm9yIGZldGNoX2FyZygpLgotCi1XZWQgTWFyIDMxIDEwOjA3OjA0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBkaXMtYnVmLmM6IE5ldyBmaWxlLCBmb3IgbmV3IHJlYWRfbWVtb3J5X2Z1bmMgaW50ZXJmYWNlLgotCU1ha2VmaWxlLmluIChPRklMRVMpOiBJbmNsdWRlIGl0LgotCW02OGstZGlzLmMsIGkzODYtZGlzLmMsIGg4NTAwLWRpcy5jLCBtaXBzLWRpcy5jLCB6OGstZGlzLmM6Ci0JVXNlIG5ldyByZWFkX21lbW9yeV9mdW5jIGludGVyZmFjZS4KLQotTW9uIE1hciAyOSAxNDowMjoxNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaDg1MDAtZGlzLmMgKHByaW50X2luc25faDg1MDApOiBHZXQgc2lnbiBvZiBmcCBvZmZzZXRzIHJpZ2h0LgotCSogaDg1MDAtb3BjLmg6IEZpeCBjb3VwbGUgb2Ygb3Bjb2Rlcy4KLQotV2VkIE1hciAyNCAwMjowMzozNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBkdmkgJiBpbnN0YWxsY2hlY2sgdGFyZ2V0cwotCi1Nb24gTWFyIDIyIDE4OjU1OjA0IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFVwZGF0ZSBmb3IgaDg1MDAtZGlzLmMuCi0KLUZyaSBNYXIgMTkgMTQ6Mjc6MTcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGg4NTAwLWRpcy5jLCBoODUwMC1vcGMuaDogTmV3IGZpbGVzCi0KLVRodSBNYXIgMTggMTQ6MTI6MzcgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jLCB6OGstZGlzLmM6ICBDb252ZXJ0ZWQgdG8gdXNlIGludGVyZmFjZSBkZWZpbmVkIGluCi0JLi4vaW5jbHVkZS9kaXMtYXNtLmguCi0JKiBtNjhrLWRpcy5jOiAgTmV3IGZpbGUgKG1lcmdlIG9mIC4uL2JpbnV0aWxzL202OGstcGluc24uYwotCWFuZCAuLi9nZGIvbTY4ay1waW5zbi5jKS4KLQkqIGkzODYtZGlzLmM6ICBOZXcgZmlsZSAobWVyZ2Ugb2YgLi4vYmludXRpbHMvaTM4Ni1waW5zbi5jCi0JYW5kIC4uL2dkYi9pMzg2LXBpbnNuLmMpLgotCSogbTY4ODgxLWV4dC5jOiAgTmV3IGZpbGUuICBNb3ZlZCBkZWZpbml0aW9uIG9mCi0JZXh0X2Zvcm1hdCBleHRfZm9ybWF0XzY4ODgxIGZyb20gLi4vZ2RiL202OGstdGRlcC5jLgotCSogTWFrZWZpbGUuaW46ICBBZGp1c3QgZm9yIG5ldyBmaWxlcy4KLQkqIGkzODYtZGlzLmM6ICBQYXRjaGVzIGZyb20gSm9obiBIYXNzZXkgKGhhc3NleUBkZy1ydHAuZGcuY29tKS4KLQkqIG02OGstZGlzLmM6ICBSZWNvZ25pemUgJzknIHBsYWNlbWVudCBjb2RlLCBzbyAoc2F5KSBwZmx1c2gKLQljYW4gYmUgZGlzLWFzc2VtYmxlZC4KLQotV2VkIEZlYiAxNyAwOToxOTo0NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogTm93IHJldHVybnMgdm9pZC4KLQotTW9uIEphbiAxMSAxNjowOToxNiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYyAoYW5zaWRlY2wuaCk6ICBJbmNsdWRlIGZvciBiZW5lZml0IG9mIHN5c2RlcC5oCi0JZmlsZXMgdGhhdCB1c2UgdGhlIG1hY3Jvcy4KLQotVGh1IEphbiAgNyAxMzoxNToxNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmM6IE5ldyBmaWxlLCBmcm9tIGdkYi9taXBzLXBpbnNuLmMuCi0JKiBNYWtlZmlsZS5pbiAoRElTX0xJQlMpOiBBZGRlZCBtaXBzLWRpcy5vLgotCShDRklMRVMpOiBBZGRlZCBtaXBzLWRpcy5jLgotCi1UaHUgSmFuICA3IDA3OjM2OjMzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0gICAgCSogejhrLWRpcy5jIChwcmludF9pbnNuX3o4MDAxLCBwcmludF9pbnNuX3o4MDAyKTogbmV3IHJvdXRpbmVzCi0JKiB6OGtnZW4uYywgejhrLW9wYy5oOiBmaXggc2l6ZXMgb2Ygc29tZSBzaGlmdHMuCi0KLVR1ZSBEZWMgMjIgMTU6NDI6NDQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEltcHJvdmUgKmNsZWFuIHJ1bGVzLgotCSogY29uZmlndXJlLmluOiAgQWxsb3cgYSBkZWZhdWx0IGhvc3QuCi0KLVR1ZSBOb3YgMTcgMTk6NTM6NTQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWxzbyB1c2UgLUkkKHNyY2RpcikvLi4vYmZkLCBzaW5jZSBzb21lIHN5c2RlcAotCWZpbGVzIGluY2x1ZGUgb3RoZXIgc3lzZGVwIGZpbGVzCi0KLVRodSBOb3YgMTIgMTY6MTA6MzcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHo4ay1kaXMuYyB6OGstb3BjLmggejhrZ2VuLmM6IGNoZWNrcG9pbnQKLQotRnJpIE9jdCAgOSAwNDo1NjowNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgRm9yIGhvc3Qgc3VwcG9ydCwgdXNlIC4uL2JmZC9jb25maWd1cmUuaG9zdAotCXNvIGl0IHN0YXlzIGluIHN5bmMgd2l0aCB0aGUgLi4vYmZkL2hvc3RzIGRhdGFiYXNlLgotCi1UaHUgT2N0ICAxIDIzOjM4OjU0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgY3B1LXZlbmRvci1vcyB0cmlwbGUgaW5zdGVhZCBvZiBuZXN0ZWQgY2FzZXMKLQotV2VkIFNlcCAzMCAxNjowOToyMCAxOTkyICBNaWNoYWVsIFdlcm5lciAgKG10d0BjeWdudXMuY29tKQotCi0JKiB6OGstZGlzLmMgKHVucGFyc2VfaW5zdHIpOiBmaXggYnVnIHdoZXJlIG9wY29kZSByZXR1cm5lZCB3YXMKLQkqYWx3YXlzKiB0aGUgd3Jvbmcgb25lLgotCi1XZWQgU2VwIDMwIDA3OjQyOjE3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiB6OGtnZW4uYzogYWRkZWQgY29weXJpZ2h0IGluZm8KLQotVHVlIFNlcCAyOSAxMjoyMDoyMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jICh1bnBhcnNlX2luc3RyKTogcHJldHRpZXIgdGFicwotCSogejhrZ2VuLmMgLT4gejhrLW9wYy5oOiBidWcgZml4ZXMgaW4gdGFibGVzCi0KLUZyaSBTZXAgMjUgMTI6NTA6MzIgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQWRkIG5jciogY29uZmlndXJhdGlvbi4KLQkqIHo4ay1kaXMuYyAoc3RydWN0IGluc3RyX2RhdGFfcyk6ICBNYWtlIGluc3RyX2FzbXNyYyBjaGFyIHRvIG1ha2UKLQlwaWNheXVuZSBBTlNJIGNvbXBpbGVycyBoYXBweS4KLQotU2VwIDIwIDA4OjUwOjU1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGkzODYpOiAgTWFrZSBpMzg2IGFuZCBpNDg2IHN5bm9ueW1vdXMgZm9yIG5vdy4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXN5c3Y0KTogIEFkZCBteV9ob3N0IGRlZmluaXRpb24uCi0KLUZyaSBTZXAgMTggMTc6MDE6MjMgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEZpeCB0eXBvLgotCi1GcmkgU2VwIDE4IDAyOjA0OjI0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWFrZSk6ICBSZW1vdmUgb2Jzb2xldGUgY3J1ZC4KLQkoc3BhcmMtb3BjLm8pOiAgQXZvaWQgU3VuIE1ha2UgVlBBVEggYnVnLgotCi1UdWUgU2VwICA4IDE3OjI5OjI3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHNpbmNlIHRoZXJlIGFyZSBubyBTVUJESVJTLCByZW1vdmUgcnVsZSBhbmQKLQlyZWZlcmVuY2VzIG9mIHN1YmRpcl9kby4KLQotVHVlIFNlcCAgOCAxNzowMjo1OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogR2V0IHRoZSBsaWJyYXJ5IG5hbWUgcmlnaHQgaGVyZSB0b28uCi0JRG9uJ3QgaW5zdGFsbCBiZmQuaCwgc2luY2UgaXQncyB1bnJlbGF0ZWQgdG8gdGhpcyBsaWJyYXJ5LiAgTm8KLQlzdWJkaXJzIHRvIHJlY3Vyc2UgaW50bywgZWl0aGVyLgotCShDRklMRVMpOiBUaGUgc291cmNlIGZpbGUgaGFzIGEgLmMgc3VmZml4LCBub3QgLm8uCi0KLQkqIHNwYXJjLW9wYy5jOiBOZXcgZmlsZSwgbW92ZWQgZnJvbSBCRkQuCi0JKiBNYWtlZmlsZS5pbiAoT0ZJTEVTKTogQnVpbGQgaXQuCi0KLVRodSBTZXAgIDMgMTY6NTk6MjAgMTk5MiAgTWljaGFlbCBXZXJuZXIgIChtdHdAY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jOiBmaXhlZCBmb3J3YXJkIHJlZmZlcmVuY2VzIG9mIHNvbWUgZGVjbGFyYXRpb25zLgotCi1Nb24gQXVnIDMxIDE2OjA5OjQ1IDE5OTIgIE1pY2hhZWwgV2VybmVyICAobXR3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBnZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgcmlnaHQKLQotTW9uIEF1ZyAzMSAxMzo0NzozNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jOiBrbm93cyBob3cgdG8gZGlzYXNzZW1ibGUgejhrIHN0dWZmCi0JKiB6OGstb3BjLmg6IG5ldyBmaWxlIGZ1bGwgb2YgejgwMDAgb3Bjb2RlcwotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9vcGNvZGVzL01ha2VmaWxlLmFtIGIvb3Bjb2Rlcy9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5NzI5OC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gZ2VuZXJhdGUgTWFrZWZpbGUuaW4KLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1TVUJESVJTID0gcG8KLQotSU5DRElSID0gJChzcmNkaXIpLy4uL2luY2x1ZGUKLUJGRERJUiA9ICQoc3JjZGlyKS8uLi9iZmQKLURFUCA9IG1rZGVwCi0KLWxpYl9MVExJQlJBUklFUyA9IGxpYm9wY29kZXMubGEKLQotIyBUaGlzIGlzIHdoZXJlIGJmZC5oIGxpdmVzLgotQkZEX0ggPSAuLi9iZmQvYmZkLmgKLQotIyBIZWFkZXIgZmlsZXMuCi1IRklMRVMgPSBcCi0JYXJtLW9wYy5oIFwKLQlmcjMwLWRlc2MuaCBmcjMwLW9wYy5oIFwKLQloODUwMC1vcGMuaCBcCi0JbTMyci1kZXNjLmggbTMyci1vcGMuaCBcCi0JbWNvcmUtb3BjLmggXAotCXNoLW9wYy5oIFwKLQlzeXNkZXAuaCBcCi0JdzY1LW9wYy5oIFwKLQl6OGstb3BjLmgKLQotIyBDIHNvdXJjZSBmaWxlcyB0aGF0IGNvcnJlc3BvbmQgdG8gLm8ncy4KLUNGSUxFUyA9IFwKLQlhMjlrLWRpcy5jIFwKLQlhbHBoYS1kaXMuYyBcCi0JYWxwaGEtb3BjLmMgXAotCWFybS1kaXMuYyBcCi0JY2dlbi1hc20uYyBcCi0JY2dlbi1kaXMuYyBcCi0JY2dlbi1vcGMuYyBcCi0JZDEwdi1kaXMuYyBcCi0JZDEwdi1vcGMuYyBcCi0JZDMwdi1kaXMuYyBcCi0JZDMwdi1vcGMuYyBcCi0JZGlzLWJ1Zi5jIFwKLQlkaXNhc3NlbWJsZS5jIFwKLQlmcjMwLWFzbS5jIFwKLQlmcjMwLWRlc2MuYyBcCi0JZnIzMC1kaXMuYyBcCi0JZnIzMC1pYmxkLmMgXAotCWZyMzAtb3BjLmMgXAotCWg4MzAwLWRpcy5jIFwKLQloODUwMC1kaXMuYyBcCi0JaHBwYS1kaXMuYyBcCi0JaTM4Ni1kaXMuYyBcCi0JaTk2MC1kaXMuYyBcCi0JbTMyci1hc20uYyBcCi0JbTMyci1kZXNjLmMgXAotCW0zMnItZGlzLmMgXAotCW0zMnItaWJsZC5jIFwKLQltMzJyLW9wYy5jIFwKLQltMzJyLW9waW5zdC5jIFwKLQltNjhrLWRpcy5jIFwKLQltNjhrLW9wYy5jIFwKLQltODhrLWRpcy5jIFwKLQltY29yZS1kaXMuYyBcCi0JbWlwcy1kaXMuYyBcCi0JbWlwcy1vcGMuYyBcCi0JbWlwczE2LW9wYy5jIFwKLQltMTAyMDAtZGlzLmMgXAotCW0xMDIwMC1vcGMuYyBcCi0JbTEwMzAwLWRpcy5jIFwKLQltMTAzMDAtb3BjLmMgXAotCW5zMzJrLWRpcy5jIFwKLQlwcGMtZGlzLmMgXAotCXBwYy1vcGMuYyBcCi0Jc2gtZGlzLmMgXAotCXNwYXJjLWRpcy5jIFwKLQlzcGFyYy1vcGMuYyBcCi0JdGljMzAtZGlzLmMgXAotCXRpYzgwLWRpcy5jIFwKLQl0aWM4MC1vcGMuYyBcCi0JdmF4LWRpcy5jIFwKLQl3NjUtZGlzLmMgXAotCXo4ay1kaXMuYyBcCi0JejhrZ2VuLmMKLQotQUxMX01BQ0hJTkVTID0gXAotCWEyOWstZGlzLmxvIFwKLQlhbHBoYS1kaXMubG8gXAotCWFscGhhLW9wYy5sbyBcCi0JYXJjLWRpcy5sbyBcCi0JYXJjLW9wYy5sbyBcCi0JYXJtLWRpcy5sbyBcCi0JY2dlbi1hc20ubG8gXAotCWNnZW4tZGlzLmxvIFwKLQljZ2VuLW9wYy5sbyBcCi0JZDEwdi1kaXMubG8gXAotCWQxMHYtb3BjLmxvIFwKLQlkMzB2LWRpcy5sbyBcCi0JZDMwdi1vcGMubG8gXAotCWZyMzAtYXNtLmxvIFwKLQlmcjMwLWRlc2MubG8gXAotCWZyMzAtZGlzLmxvIFwKLQlmcjMwLWlibGQubG8gXAotCWZyMzAtb3BjLmxvIFwKLQloODMwMC1kaXMubG8gXAotCWg4NTAwLWRpcy5sbyBcCi0JaHBwYS1kaXMubG8gXAotCWkzODYtZGlzLmxvIFwKLQlpOTYwLWRpcy5sbyBcCi0JbTMyci1hc20ubG8gXAotCW0zMnItZGVzYy5sbyBcCi0JbTMyci1kaXMubG8gXAotCW0zMnItaWJsZC5sbyBcCi0JbTMyci1vcGMubG8gXAotCW0zMnItb3BpbnN0LmxvIFwKLQltNjhrLWRpcy5sbyBcCi0JbTY4ay1vcGMubG8gXAotCW04OGstZGlzLmxvIFwKLQltMTAyMDAtZGlzLmxvIFwKLQltMTAyMDAtb3BjLmxvIFwKLQltMTAzMDAtZGlzLmxvIFwKLQltMTAzMDAtb3BjLmxvIFwKLQltY29yZS1kaXMubG8gXAotCW1pcHMtZGlzLmxvIFwKLQltaXBzLW9wYy5sbyBcCi0JbWlwczE2LW9wYy5sbyBcCi0JcHBjLWRpcy5sbyBcCi0JcHBjLW9wYy5sbyBcCi0JbnMzMmstZGlzLmxvIFwKLQlzaC1kaXMubG8gXAotCXNwYXJjLWRpcy5sbyBcCi0Jc3BhcmMtb3BjLmxvIFwKLQl0aWMzMC1kaXMubG8gXAotCXRpYzgwLWRpcy5sbyBcCi0JdGljODAtb3BjLmxvIFwKLQl2ODUwLWRpcy5sbyBcCi0Jdjg1MC1vcGMubG8gXAotCXZheC1kaXMubG8gXAotCXc2NS1kaXMubG8gXAotCXo4ay1kaXMubG8KLQotT0ZJTEVTID0gQEJGRF9NQUNISU5FU0AKLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoSU5DRElSKSAtSSQoQkZERElSKSBASERFRklORVNAIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsCi0KLWRpc2Fzc2VtYmxlLmxvOiBkaXNhc3NlbWJsZS5jICQoSU5DRElSKS9kaXMtYXNtLmgKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgQGFyY2hkZWZzQCAkKHNyY2RpcikvZGlzYXNzZW1ibGUuYwotCi1saWJvcGNvZGVzX2xhX1NPVVJDRVMgPSAgZGlzLWJ1Zi5jIGRpc2Fzc2VtYmxlLmMKLWxpYm9wY29kZXNfbGFfREVQRU5ERU5DSUVTID0gJChPRklMRVMpCi1saWJvcGNvZGVzX2xhX0xJQkFERCA9ICQoT0ZJTEVTKSBAV0lOMzJMSUJBRERACi1saWJvcGNvZGVzX2xhX0xERkxBR1MgPSAtcmVsZWFzZSAkKFZFUlNJT04pIEBXSU4zMkxERkxBR1NACi0KLSMgbGlidG9vbCB3aWxsIGJ1aWxkIC5saWJzL2xpYm9wY29kZXMuYS4gIFdlIGNyZWF0ZSBsaWJvcGNvZGVzLmEgaW4KLSMgdGhlIGJ1aWxkIGRpcmVjdG9yeSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY29udmVydCBhbGwgdGhlCi0jIHByb2dyYW1zIHRoYXQgdXNlIGxpYm9wY29kZXMuYSBzaW11bHRhbmVvdXNseS4gIFRoaXMgaXMgYSBoYWNrIHdoaWNoCi0jIHNob3VsZCBiZSByZW1vdmVkIGlmIGV2ZXJ5dGhpbmcgZWxzZSBzdGFydHMgdXNpbmcgbGlidG9vbC4gIEZJWE1FLgotCi1ub2luc3RfTElCUkFSSUVTID0gbGlib3Bjb2Rlcy5hCi0KLXN0YW1wLWxpYjogbGlib3Bjb2Rlcy5sYQotCWlmIFsgLWYgLmxpYnMvbGlib3Bjb2Rlcy5hIF07IHRoZW4gXAotCSAgY3AgLmxpYnMvbGlib3Bjb2Rlcy5hIGxpYm9wY29kZXMudG1wOyBcCi0JICAkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGlib3Bjb2Rlcy50bXAgbGlib3Bjb2Rlcy5hOyBcCi0JZWxzZSB0cnVlOyBmaQotCXRvdWNoIHN0YW1wLWxpYgotCi1saWJvcGNvZGVzLmE6IHN0YW1wLWxpYiA7IEB0cnVlCi0KLVBPVEZJTEVTID0gJChIRklMRVMpICQoQ0ZJTEVTKQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotIyBXZSBzaG91bGQgcmVjb25maWd1cmUgd2hlbmV2ZXIgYmZkL2NvbmZpZ3VyZS5pbiBjaGFuZ2VzLCBiZWNhdXNlCi0jIHRoYXQncyB3aGVyZSB0aGUgdmVyc2lvbiBudW1iZXIgY29tZXMgZnJvbS4KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpLy4uL2JmZC9jb25maWd1cmUuaW4KLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLUNMRUFORklMRVMgPSBcCi0JbGlib3Bjb2Rlcy5hIHN0YW1wLWxpYiBkZXAuc2VkIC5kZXAgLmRlcDEKLQotCi0KLSMgVGhlIHN0YXJ0IG1hcmtlciBpcyB3cml0dGVuIHRoaXMgd2F5IHRvIHBhc3MgdGhyb3VnaCBhdXRvbWFrZSB1bnNjYXRoZWQuCi0KLQotCi0KLSMgVGhpcyBkZXBlbmRlbmN5IHN0dWZmIGlzIGNvcGllZCBmcm9tIEJGRC4KLQotLmRlcDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpIGNvbmZpZy5oCi0Jcm0gLWYgLmRlcDEKLQkkKE1BS0UpIERFUD0kKERFUCkgLmRlcDEKLQlzZWQgLWYgZGVwLnNlZCA8IC5kZXAxID4gLmRlcAotCi0uZGVwMTogJChDRklMRVMpCi0Jcm0gLWYgLmRlcDIgLmRlcDJhCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiAuZGVwMgotCWVjaG8gPiAuZGVwMmEKLQkkKERFUCkgLWYgLmRlcDJhICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkPwotCXNlZCAtZSAnL0RPIE5PVCBERUxFVEUvZCcgLWUgJy9eJCQvZCcgPCAuZGVwMmEgPj4gLmRlcDIKLQlybSAtZiAuZGVwMmEKLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgLmRlcDIgLmRlcDEKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCi0JCS1lICdzIUBCRkRfSEAhJChCRkRfSCkhJwlcCi0JCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKLQkJLWUgJ3MhQEJGRERJUkAhJChCRkRESVIpIScJXAotCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJwotCi1kZXA6IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmFtCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KLQotLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotYTI5ay1kaXMubG86IGEyOWstZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvYTI5ay5oCi1hbHBoYS1kaXMubG86IGFscGhhLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIFwKLSAgY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmgKLWFscGhhLW9wYy5sbzogYWxwaGEtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9hbHBoYS5oIFwKLSAgJChCRkRfSCkgb3BpbnRsLmgKLWFybS1kaXMubG86IGFybS1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggYXJtLW9wYy5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggb3BpbnRsLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotY2dlbi1hc20ubG86IGNnZW4tYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgb3BpbnRsLmgKLWNnZW4tZGlzLmxvOiBjZ2VuLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaAotY2dlbi1vcGMubG86IGNnZW4tb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oCi1kMTB2LWRpcy5sbzogZDEwdi1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2QxMHYuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLWQxMHYtb3BjLmxvOiBkMTB2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oCi1kMzB2LWRpcy5sbzogZDMwdi1kaXMuYyAkKElOQ0RJUikvb3Bjb2RlL2QzMHYuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggb3BpbnRsLmgKLWQzMHYtb3BjLmxvOiBkMzB2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCi1kaXMtYnVmLmxvOiBkaXMtYnVmLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpIG9waW50bC5oCi1kaXNhc3NlbWJsZS5sbzogZGlzYXNzZW1ibGUuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLWZyMzAtYXNtLmxvOiBmcjMwLWFzbS5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1kZXNjLmxvOiBmcjMwLWRlc2MuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmggb3BpbnRsLmgKLWZyMzAtZGlzLmxvOiBmcjMwLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLWlibGQubG86IGZyMzAtaWJsZC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLW9wYy5sbzogZnIzMC1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmgKLWg4MzAwLWRpcy5sbzogaDgzMDAtZGlzLmMgJChJTkNESVIpL29wY29kZS9oODMwMC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBvcGludGwuaAotaDg1MDAtZGlzLmxvOiBoODUwMC1kaXMuYyBoODUwMC1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggb3BpbnRsLmgKLWhwcGEtZGlzLmxvOiBocHBhLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9vcGNvZGUvaHBwYS5oCi1pMzg2LWRpcy5sbzogaTM4Ni1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggY29uZmlnLmggb3BpbnRsLmgKLWk5NjAtZGlzLmxvOiBpOTYwLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaAotbTMyci1hc20ubG86IG0zMnItYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLWRlc2MubG86IG0zMnItZGVzYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1kaXMubG86IG0zMnItZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItaWJsZC5sbzogbTMyci1pYmxkLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItb3BjLmxvOiBtMzJyLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaAotbTMyci1vcGluc3QubG86IG0zMnItb3BpbnN0LmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oCi1tNjhrLWRpcy5sbzogbTY4ay1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL2Zsb2F0Zm9ybWF0Lmggb3BpbnRsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL202OGsuaAotbTY4ay1vcGMubG86IG02OGstb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tNjhrLmgKLW04OGstZGlzLmxvOiBtODhrLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL204OGsuaCBvcGludGwuaAotbWNvcmUtZGlzLmxvOiBtY29yZS1kaXMuYyBtY29yZS1vcGMuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLW1pcHMtZGlzLmxvOiBtaXBzLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBvcGludGwuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1taXBzLW9wYy5sbzogbWlwcy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaAotbWlwczE2LW9wYy5sbzogbWlwczE2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oCi1tMTAyMDAtZGlzLmxvOiBtMTAyMDAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIG9waW50bC5oCi1tMTAyMDAtb3BjLmxvOiBtMTAyMDAtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmgKLW0xMDMwMC1kaXMubG86IG0xMDMwMC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgb3BpbnRsLmgKLW0xMDMwMC1vcGMubG86IG0xMDMwMC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaAotbnMzMmstZGlzLmxvOiBuczMyay1kaXMuYyAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChJTkNESVIpL29wY29kZS9uczMyay5oIFwKLSAgb3BpbnRsLmgKLXBwYy1kaXMubG86IHBwYy1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9wcGMuaAotcHBjLW9wYy5sbzogcHBjLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvcHBjLmggXAotICBvcGludGwuaAotc2gtZGlzLmxvOiBzaC1kaXMuYyBzaC1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmgKLXNwYXJjLWRpcy5sbzogc3BhcmMtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAotICBjb25maWcuaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9saWJpYmVydHkuaCBvcGludGwuaAotc3BhcmMtb3BjLmxvOiBzcGFyYy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmgKLXRpYzMwLWRpcy5sbzogdGljMzAtZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAotdGljODAtZGlzLmxvOiB0aWM4MC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi10aWM4MC1vcGMubG86IHRpYzgwLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotdmF4LWRpcy5sbzogdmF4LWRpcy5jICQoSU5DRElSKS9vcGNvZGUvdmF4LmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oCi13NjUtZGlzLmxvOiB3NjUtZGlzLmMgdzY1LW9wYy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaAotejhrLWRpcy5sbzogejhrLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSB6OGstb3BjLmgKLXo4a2dlbi5sbzogejhrZ2VuLmMgc3lzZGVwLmggY29uZmlnLmgKLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9NYWtlZmlsZS5pbiBiL29wY29kZXMvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOGY2NGY5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw4NTggKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuCi0KLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi0KLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAotQVIgPSBAQVJACi1BUyA9IEBBU0AKLUJGRF9NQUNISU5FUyA9IEBCRkRfTUFDSElORVNACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1EQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVYRUVYVCA9IEBFWEVFWFRACi1FWEVFWFRfRk9SX0JVSUxEID0gQEVYRUVYVF9GT1JfQlVJTERACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLUdNU0dGTVQgPSBAR01TR0ZNVEAKLUdUX05PID0gQEdUX05PQAotR1RfWUVTID0gQEdUX1lFU0AKLUhERUZJTkVTID0gQEhERUZJTkVTQAotSU5DTFVERV9MT0NBTEVfSCA9IEBJTkNMVURFX0xPQ0FMRV9IQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotSU5UTERFUFMgPSBASU5UTERFUFNACi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLUlOVExPQkpTID0gQElOVExPQkpTQAotTEQgPSBATERACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotTVNHRk1UID0gQE1TR0ZNVEAKLU5NID0gQE5NQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotV0lOMzJMREZMQUdTID0gQFdJTjMyTERGTEFHU0AKLVdJTjMyTElCQUREID0gQFdJTjMyTElCQUREQAotYXJjaGRlZnMgPSBAYXJjaGRlZnNACi1jZ2VuID0gQGNnZW5ACi1jZ2VuZGlyID0gQGNnZW5kaXJACi1sID0gQGxACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotU1VCRElSUyA9IHBvCi0KLUlOQ0RJUiA9ICQoc3JjZGlyKS8uLi9pbmNsdWRlCi1CRkRESVIgPSAkKHNyY2RpcikvLi4vYmZkCi1ERVAgPSBta2RlcAotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJvcGNvZGVzLmxhCi0KLSMgVGhpcyBpcyB3aGVyZSBiZmQuaCBsaXZlcy4KLUJGRF9IID0gLi4vYmZkL2JmZC5oCi0KLSMgSGVhZGVyIGZpbGVzLgotSEZJTEVTID0gXAotCWFybS1vcGMuaCBcCi0JZnIzMC1kZXNjLmggZnIzMC1vcGMuaCBcCi0JaDg1MDAtb3BjLmggXAotCW0zMnItZGVzYy5oIG0zMnItb3BjLmggXAotCW1jb3JlLW9wYy5oIFwKLQlzaC1vcGMuaCBcCi0Jc3lzZGVwLmggXAotCXc2NS1vcGMuaCBcCi0JejhrLW9wYy5oCi0KLQotIyBDIHNvdXJjZSBmaWxlcyB0aGF0IGNvcnJlc3BvbmQgdG8gLm8ncy4KLUNGSUxFUyA9IFwKLQlhMjlrLWRpcy5jIFwKLQlhbHBoYS1kaXMuYyBcCi0JYWxwaGEtb3BjLmMgXAotCWFybS1kaXMuYyBcCi0JY2dlbi1hc20uYyBcCi0JY2dlbi1kaXMuYyBcCi0JY2dlbi1vcGMuYyBcCi0JZDEwdi1kaXMuYyBcCi0JZDEwdi1vcGMuYyBcCi0JZDMwdi1kaXMuYyBcCi0JZDMwdi1vcGMuYyBcCi0JZGlzLWJ1Zi5jIFwKLQlkaXNhc3NlbWJsZS5jIFwKLQlmcjMwLWFzbS5jIFwKLQlmcjMwLWRlc2MuYyBcCi0JZnIzMC1kaXMuYyBcCi0JZnIzMC1pYmxkLmMgXAotCWZyMzAtb3BjLmMgXAotCWg4MzAwLWRpcy5jIFwKLQloODUwMC1kaXMuYyBcCi0JaHBwYS1kaXMuYyBcCi0JaTM4Ni1kaXMuYyBcCi0JaTk2MC1kaXMuYyBcCi0JbTMyci1hc20uYyBcCi0JbTMyci1kZXNjLmMgXAotCW0zMnItZGlzLmMgXAotCW0zMnItaWJsZC5jIFwKLQltMzJyLW9wYy5jIFwKLQltMzJyLW9waW5zdC5jIFwKLQltNjhrLWRpcy5jIFwKLQltNjhrLW9wYy5jIFwKLQltODhrLWRpcy5jIFwKLQltY29yZS1kaXMuYyBcCi0JbWlwcy1kaXMuYyBcCi0JbWlwcy1vcGMuYyBcCi0JbWlwczE2LW9wYy5jIFwKLQltMTAyMDAtZGlzLmMgXAotCW0xMDIwMC1vcGMuYyBcCi0JbTEwMzAwLWRpcy5jIFwKLQltMTAzMDAtb3BjLmMgXAotCW5zMzJrLWRpcy5jIFwKLQlwcGMtZGlzLmMgXAotCXBwYy1vcGMuYyBcCi0Jc2gtZGlzLmMgXAotCXNwYXJjLWRpcy5jIFwKLQlzcGFyYy1vcGMuYyBcCi0JdGljMzAtZGlzLmMgXAotCXRpYzgwLWRpcy5jIFwKLQl0aWM4MC1vcGMuYyBcCi0JdmF4LWRpcy5jIFwKLQl3NjUtZGlzLmMgXAotCXo4ay1kaXMuYyBcCi0JejhrZ2VuLmMKLQotCi1BTExfTUFDSElORVMgPSBcCi0JYTI5ay1kaXMubG8gXAotCWFscGhhLWRpcy5sbyBcCi0JYWxwaGEtb3BjLmxvIFwKLQlhcmMtZGlzLmxvIFwKLQlhcmMtb3BjLmxvIFwKLQlhcm0tZGlzLmxvIFwKLQljZ2VuLWFzbS5sbyBcCi0JY2dlbi1kaXMubG8gXAotCWNnZW4tb3BjLmxvIFwKLQlkMTB2LWRpcy5sbyBcCi0JZDEwdi1vcGMubG8gXAotCWQzMHYtZGlzLmxvIFwKLQlkMzB2LW9wYy5sbyBcCi0JZnIzMC1hc20ubG8gXAotCWZyMzAtZGVzYy5sbyBcCi0JZnIzMC1kaXMubG8gXAotCWZyMzAtaWJsZC5sbyBcCi0JZnIzMC1vcGMubG8gXAotCWg4MzAwLWRpcy5sbyBcCi0JaDg1MDAtZGlzLmxvIFwKLQlocHBhLWRpcy5sbyBcCi0JaTM4Ni1kaXMubG8gXAotCWk5NjAtZGlzLmxvIFwKLQltMzJyLWFzbS5sbyBcCi0JbTMyci1kZXNjLmxvIFwKLQltMzJyLWRpcy5sbyBcCi0JbTMyci1pYmxkLmxvIFwKLQltMzJyLW9wYy5sbyBcCi0JbTMyci1vcGluc3QubG8gXAotCW02OGstZGlzLmxvIFwKLQltNjhrLW9wYy5sbyBcCi0JbTg4ay1kaXMubG8gXAotCW0xMDIwMC1kaXMubG8gXAotCW0xMDIwMC1vcGMubG8gXAotCW0xMDMwMC1kaXMubG8gXAotCW0xMDMwMC1vcGMubG8gXAotCW1jb3JlLWRpcy5sbyBcCi0JbWlwcy1kaXMubG8gXAotCW1pcHMtb3BjLmxvIFwKLQltaXBzMTYtb3BjLmxvIFwKLQlwcGMtZGlzLmxvIFwKLQlwcGMtb3BjLmxvIFwKLQluczMyay1kaXMubG8gXAotCXNoLWRpcy5sbyBcCi0Jc3BhcmMtZGlzLmxvIFwKLQlzcGFyYy1vcGMubG8gXAotCXRpYzMwLWRpcy5sbyBcCi0JdGljODAtZGlzLmxvIFwKLQl0aWM4MC1vcGMubG8gXAotCXY4NTAtZGlzLmxvIFwKLQl2ODUwLW9wYy5sbyBcCi0JdmF4LWRpcy5sbyBcCi0JdzY1LWRpcy5sbyBcCi0JejhrLWRpcy5sbwotCi0KLU9GSUxFUyA9IEBCRkRfTUFDSElORVNACi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKElOQ0RJUikgLUkkKEJGRERJUikgQEhERUZJTkVTQCAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bAotCi1saWJvcGNvZGVzX2xhX1NPVVJDRVMgPSBkaXMtYnVmLmMgZGlzYXNzZW1ibGUuYwotbGlib3Bjb2Rlc19sYV9ERVBFTkRFTkNJRVMgPSAkKE9GSUxFUykKLWxpYm9wY29kZXNfbGFfTElCQUREID0gJChPRklMRVMpIEBXSU4zMkxJQkFEREAKLWxpYm9wY29kZXNfbGFfTERGTEFHUyA9IC1yZWxlYXNlICQoVkVSU0lPTikgQFdJTjMyTERGTEFHU0AKLQotIyBsaWJ0b29sIHdpbGwgYnVpbGQgLmxpYnMvbGlib3Bjb2Rlcy5hLiAgV2UgY3JlYXRlIGxpYm9wY29kZXMuYSBpbgotIyB0aGUgYnVpbGQgZGlyZWN0b3J5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb252ZXJ0IGFsbCB0aGUKLSMgcHJvZ3JhbXMgdGhhdCB1c2UgbGlib3Bjb2Rlcy5hIHNpbXVsdGFuZW91c2x5LiAgVGhpcyBpcyBhIGhhY2sgd2hpY2gKLSMgc2hvdWxkIGJlIHJlbW92ZWQgaWYgZXZlcnl0aGluZyBlbHNlIHN0YXJ0cyB1c2luZyBsaWJ0b29sLiAgRklYTUUuCi0KLW5vaW5zdF9MSUJSQVJJRVMgPSBsaWJvcGNvZGVzLmEKLQotUE9URklMRVMgPSAkKEhGSUxFUykgJChDRklMRVMpCi0KLUNMRUFORklMRVMgPSBcCi0JbGlib3Bjb2Rlcy5hIHN0YW1wLWxpYiBkZXAuc2VkIC5kZXAgLmRlcDEKLQotCi0KLQotIyBUaGUgc3RhcnQgbWFya2VyIGlzIHdyaXR0ZW4gdGhpcyB3YXkgdG8gcGFzcyB0aHJvdWdoIGF1dG9tYWtlIHVuc2NhdGhlZC4KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gCi1MSUJSQVJJRVMgPSAgJChub2luc3RfTElCUkFSSUVTKQotCi0KLURFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJTID0gQExJQlNACi1saWJvcGNvZGVzX2FfTElCQUREID0gCi1saWJvcGNvZGVzX2FfU09VUkNFUyA9IGxpYm9wY29kZXMuYS5jCi1saWJvcGNvZGVzX2FfT0JKRUNUUyA9ICBsaWJvcGNvZGVzLmEubwotTFRMSUJSQVJJRVMgPSAgJChsaWJfTFRMSUJSQVJJRVMpCi0KLWxpYm9wY29kZXNfbGFfT0JKRUNUUyA9ICBkaXMtYnVmLmxvIGRpc2Fzc2VtYmxlLmxvCi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAKLURJU1RfQ09NTU9OID0gIC4vc3RhbXAtaC5pbiBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4gXAotYWNpbmNsdWRlLm00IGFjbG9jYWwubTQgY29uZmlnLmluIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4KLQotCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotCi1UQVIgPSB0YXIKLUdaSVBfRU5WID0gLS1iZXN0Ci1TT1VSQ0VTID0gbGlib3Bjb2Rlcy5hLmMgJChsaWJvcGNvZGVzX2xhX1NPVVJDRVMpCi1PQkpFQ1RTID0gbGlib3Bjb2Rlcy5hLm8gJChsaWJvcGNvZGVzX2xhX09CSkVDVFMpCi0KLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5TIC5jIC5sbyAubyAucwotJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIE1ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWN5Z251cyBNYWtlZmlsZQotCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9JEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0kKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIGNvbmZpZ3VyZS5pbiAgYWNpbmNsdWRlLm00Ci0JY2QgJChzcmNkaXIpICYmICQoQUNMT0NBTCkKLSQoc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKQotCWNkICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQotCi1jb25maWcuaDogc3RhbXAtaAotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCQlybSAtZiBzdGFtcC1oOyBcCi0JCSQoTUFLRSkgc3RhbXAtaDsgXAotCWVsc2UgOjsgZmkKLXN0YW1wLWg6ICQoc3JjZGlyKS9jb25maWcuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSBDT05GSUdfSEVBREVSUz1jb25maWcuaDpjb25maWcuaW4gXAotCSAgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0JQGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaCAyPiAvZGV2L251bGwKLSQoc3JjZGlyKS9jb25maWcuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2Rpcikvc3RhbXAtaC5pbgotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCQlybSAtZiAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCQkkKE1BS0UpICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JZWxzZSA6OyBmaQotJChzcmNkaXIpL3N0YW1wLWguaW46ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9IRUFERVIpCi0JQGVjaG8gdGltZXN0YW1wID4gJChzcmNkaXIpL3N0YW1wLWguaW4gMj4gL2Rldi9udWxsCi0KLW1vc3RseWNsZWFuLWhkcjoKLQotY2xlYW4taGRyOgotCi1kaXN0Y2xlYW4taGRyOgotCS1ybSAtZiBjb25maWcuaAotCi1tYWludGFpbmVyLWNsZWFuLWhkcjoKLQotbW9zdGx5Y2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCi1jbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0JLXRlc3QgLXogIiQobm9pbnN0X0xJQlJBUklFUykiIHx8IHJtIC1mICQobm9pbnN0X0xJQlJBUklFUykKLQotZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQotbWFpbnRhaW5lci1jbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0ucy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLlMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoubyBjb3JlICouY29yZQotCi1jbGVhbi1jb21waWxlOgotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGU6Ci0KLS5jLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0ucy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLlMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbi1saWJ0b29sOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYnRvb2w6Ci0KLW1vc3RseWNsZWFuLWxpYkxUTElCUkFSSUVTOgotCi1jbGVhbi1saWJMVExJQlJBUklFUzoKLQktdGVzdCAteiAiJChsaWJfTFRMSUJSQVJJRVMpIiB8fCBybSAtZiAkKGxpYl9MVExJQlJBUklFUykKLQotZGlzdGNsZWFuLWxpYkxUTElCUkFSSUVTOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYkxUTElCUkFSSUVTOgotCi1pbnN0YWxsLWxpYkxUTElCUkFSSUVTOiAkKGxpYl9MVExJQlJBUklFUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcikKLQlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJCRwICQoREVTVERJUikkKGxpYmRpcikvJCRwIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQkcCAkKERFU1RESVIpJChsaWJkaXIpLyQkcDsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQotdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICAkKExJQlRPT0wpICAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvJCRwOyBcCi0JZG9uZQotCi1saWJvcGNvZGVzLmxhOiAkKGxpYm9wY29kZXNfbGFfT0JKRUNUUykgJChsaWJvcGNvZGVzX2xhX0RFUEVOREVOQ0lFUykKLQkkKExJTkspIC1ycGF0aCAkKGxpYmRpcikgJChsaWJvcGNvZGVzX2xhX0xERkxBR1MpICQobGlib3Bjb2Rlc19sYV9PQkpFQ1RTKSAkKGxpYm9wY29kZXNfbGFfTElCQUREKSAkKExJQlMpCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0KLUBTRVRfTUFLRUAKLQotYWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi1jaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBkb3Rfc2Vlbj15ZXM7IFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZTsgXAotCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAotCWZpOyB0ZXN0IC16ICIkJGZhaWwiCi0KLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JcmV2PScnOyBsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAiLiIgJiYgZG90X3NlZW49eWVzOyBcCi0JZG9uZTsgXAotCXRlc3QgIiQkZG90X3NlZW4iID0gIm5vIiAmJiByZXY9Ii4gJCRyZXYiOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgotdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAotCWRvbmUKLQotdGFnczogVEFHUwotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JaGVyZT1gcHdkYCAmJiBjZCAkKHNyY2RpcikgXAotCSAgJiYgbWtpZCAtZiQkaGVyZS9JRCAkJHVuaXF1ZSAkKExJU1ApCi0KLVRBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotICAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZiAkJHN1YmRpci9UQUdTICYmIHRhZ3M9IiQkdGFncyAtaSAkJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKLSAgIGZpOyBcCi0JZG9uZTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQl0ZXN0IC16ICIkKEVUQUdTX0FSR1MpY29uZmlnLmluJCR1bmlxdWUkKExJU1ApJCR0YWdzIiBcCi0JICB8fCAoY2QgJChzcmNkaXIpICYmIGV0YWdzICQoRVRBR1NfQVJHUykgJCR0YWdzIGNvbmZpZy5pbiAkJHVuaXF1ZSAkKExJU1ApIC1vICQkaGVyZS9UQUdTKQotCi1tb3N0bHljbGVhbi10YWdzOgotCi1jbGVhbi10YWdzOgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRAotCi1tYWludGFpbmVyLWNsZWFuLXRhZ3M6Ci0KLWRpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKLXRvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQotCi0jIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCi0jIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCi0jIHRhcmZpbGUuCi1kaXN0Y2hlY2s6IGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSB6eGYgJChkaXN0ZGlyKS50YXIuZ3oKLQlta2RpciAkKGRpc3RkaXIpLz1idWlsZAotCW1rZGlyICQoZGlzdGRpcikvPWluc3QKLQlkY19pbnN0YWxsX2Jhc2U9YGNkICQoZGlzdGRpcikvPWluc3QgJiYgcHdkYDsgXAotCWNkICQoZGlzdGRpcikvPWJ1aWxkIFwKLQkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0kJGRjX2luc3RhbGxfYmFzZSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUBiYW5uZXI9IiQoZGlzdGRpcikudGFyLmd6IGlzIHJlYWR5IGZvciBkaXN0cmlidXRpb24iOyBcCi0JZGFzaGVzPWBlY2hvICIkJGJhbm5lciIgfCBzZWQgcy8uLz0vZ2A7IFwKLQllY2hvICIkJGRhc2hlcyI7IFwKLQllY2hvICIkJGJhbm5lciI7IFwKLQllY2hvICIkJGRhc2hlcyIKLWRpc3Q6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0LWFsbDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikKLQktY2htb2QgNzc3ICQoZGlzdGRpcikKLQlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBjcCAtcHIgJCQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCi0JICBmaTsgXAotCWRvbmUKLQlmb3Igc3ViZGlyIGluICQoU1VCRElSUyk7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWQgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IG1rZGlyICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgICAgY2htb2QgNzc3ICQoZGlzdGRpcikvJCRzdWJkaXI7IFwKLQkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPS4uLyQoZGlzdGRpcikgZGlzdGRpcj0uLi8kKGRpc3RkaXIpLyQkc3ViZGlyIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotaW5mby1hbToKLWluZm86IGluZm8tcmVjdXJzaXZlCi1kdmktYW06Ci1kdmk6IGR2aS1yZWN1cnNpdmUKLWNoZWNrLWFtOgotY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbGNoZWNrLWFtOgotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsLWluZm8tYW06IAotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCi1hbGwtcmVjdXJzaXZlLWFtOiBjb25maWcuaAotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWxpYkxUTElCUkFSSUVTCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLQotaW5zdGFsbC1kYXRhLWFtOgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMKLXVuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQotYWxsLWFtOiBNYWtlZmlsZSAkKExJQlJBUklFUykgJChMVExJQlJBUklFUykgY29uZmlnLmgKLWFsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci0JJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQobGliZGlyKQotCi0KLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0KLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotbW9zdGx5Y2xlYW4tYW06ICBtb3N0bHljbGVhbi1oZHIgbW9zdGx5Y2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKLQkJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIFwKLQkJbW9zdGx5Y2xlYW4tbGliTFRMSUJSQVJJRVMgbW9zdGx5Y2xlYW4tdGFncyBcCi0JCW1vc3RseWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQotCi1jbGVhbi1hbTogIGNsZWFuLWhkciBjbGVhbi1ub2luc3RMSUJSQVJJRVMgY2xlYW4tY29tcGlsZSBjbGVhbi1saWJ0b29sIFwKLQkJY2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tdGFncyBjbGVhbi1nZW5lcmljIFwKLQkJbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQotCi1kaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVMgZGlzdGNsZWFuLWNvbXBpbGUgXAotCQlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGliTFRMSUJSQVJJRVMgXAotCQlkaXN0Y2xlYW4tdGFncyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1hbQotCS1ybSAtZiBsaWJ0b29sCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLW1haW50YWluZXItY2xlYW4tYW06ICBtYWludGFpbmVyLWNsZWFuLWhkciBcCi0JCW1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBcCi0JCW1haW50YWluZXItY2xlYW4tbGliTFRMSUJSQVJJRVMgbWFpbnRhaW5lci1jbGVhbi10YWdzIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1hbQotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLS5QSE9OWTogbW9zdGx5Y2xlYW4taGRyIGRpc3RjbGVhbi1oZHIgY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4taGRyIFwKLW1vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUyBkaXN0Y2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKLWNsZWFuLW5vaW5zdExJQlJBUklFUyBtYWludGFpbmVyLWNsZWFuLW5vaW5zdExJQlJBUklFUyBcCi1tb3N0bHljbGVhbi1jb21waWxlIGRpc3RjbGVhbi1jb21waWxlIGNsZWFuLWNvbXBpbGUgXAotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYnRvb2wgXAotY2xlYW4tbGlidG9vbCBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tbGliTFRMSUJSQVJJRVMgXAotZGlzdGNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLWxpYkxUTElCUkFSSUVTIFwKLW1haW50YWluZXItY2xlYW4tbGliTFRMSUJSQVJJRVMgdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTIFwKLWluc3RhbGwtbGliTFRMSUJSQVJJRVMgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAotaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZXhlYy1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIFwKLWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUgdGFncyB0YWdzLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbi10YWdzIFwKLWRpc3RjbGVhbi10YWdzIGNsZWFuLXRhZ3MgbWFpbnRhaW5lci1jbGVhbi10YWdzIGRpc3RkaXIgaW5mby1hbSBpbmZvIFwKLWR2aS1hbSBkdmkgY2hlY2sgY2hlY2stYW0gaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxjaGVjayBpbnN0YWxsLWluZm8tYW0gXAotaW5zdGFsbC1pbmZvIGFsbC1yZWN1cnNpdmUtYW0gaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBcCi1pbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsIFwKLWFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIGluc3RhbGxkaXJzLWFtIGluc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gXAotbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotCi1kaXNhc3NlbWJsZS5sbzogZGlzYXNzZW1ibGUuYyAkKElOQ0RJUikvZGlzLWFzbS5oCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jIEBhcmNoZGVmc0AgJChzcmNkaXIpL2Rpc2Fzc2VtYmxlLmMKLQotc3RhbXAtbGliOiBsaWJvcGNvZGVzLmxhCi0JaWYgWyAtZiAubGlicy9saWJvcGNvZGVzLmEgXTsgdGhlbiBcCi0JICBjcCAubGlicy9saWJvcGNvZGVzLmEgbGlib3Bjb2Rlcy50bXA7IFwKLQkgICQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJvcGNvZGVzLnRtcCBsaWJvcGNvZGVzLmE7IFwKLQllbHNlIHRydWU7IGZpCi0JdG91Y2ggc3RhbXAtbGliCi0KLWxpYm9wY29kZXMuYTogc3RhbXAtbGliIDsgQHRydWUKLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLSMgV2Ugc2hvdWxkIHJlY29uZmlndXJlIHdoZW5ldmVyIGJmZC9jb25maWd1cmUuaW4gY2hhbmdlcywgYmVjYXVzZQotIyB0aGF0J3Mgd2hlcmUgdGhlIHZlcnNpb24gbnVtYmVyIGNvbWVzIGZyb20uCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS8uLi9iZmQvY29uZmlndXJlLmluCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi0KLQotCi0jIFRoaXMgZGVwZW5kZW5jeSBzdHVmZiBpcyBjb3BpZWQgZnJvbSBCRkQuCi0KLS5kZXA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSBjb25maWcuaAotCXJtIC1mIC5kZXAxCi0JJChNQUtFKSBERVA9JChERVApIC5kZXAxCi0Jc2VkIC1mIGRlcC5zZWQgPCAuZGVwMSA+IC5kZXAKLQotLmRlcDE6ICQoQ0ZJTEVTKQotCXJtIC1mIC5kZXAyIC5kZXAyYQotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDIKLQllY2hvID4gLmRlcDJhCi0JJChERVApIC1mIC5kZXAyYSAkKElOQ0xVREVTKSAkKENGTEFHUykgJD8KLQlzZWQgLWUgJy9ETyBOT1QgREVMRVRFL2QnIC1lICcvXiQkL2QnIDwgLmRlcDJhID4+IC5kZXAyCi0Jcm0gLWYgLmRlcDJhCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIC5kZXAyIC5kZXAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFAQkZEX0hAISQoQkZEX0gpIScJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBCRkRESVJAISQoQkZERElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKLQotZGVwOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLWEyOWstZGlzLmxvOiBhMjlrLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotYWxwaGEtZGlzLmxvOiBhbHBoYS1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9hbHBoYS5oCi1hbHBoYS1vcGMubG86IGFscGhhLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoQkZEX0gpIG9waW50bC5oCi1hcm0tZGlzLmxvOiBhcm0tZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oIGFybS1vcGMuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIG9waW50bC5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLWNnZW4tYXNtLmxvOiBjZ2VuLWFzbS5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG9waW50bC5oCi1jZ2VuLWRpcy5sbzogY2dlbi1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggJChJTkNESVIpL29wY29kZS9jZ2VuLmgKLWNnZW4tb3BjLmxvOiBjZ2VuLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaAotZDEwdi1kaXMubG86IGQxMHYtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9kMTB2LmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi1kMTB2LW9wYy5sbzogZDEwdi1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2QxMHYuaAotZDMwdi1kaXMubG86IGQzMHYtZGlzLmMgJChJTkNESVIpL29wY29kZS9kMzB2LmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIG9waW50bC5oCi1kMzB2LW9wYy5sbzogZDMwdi1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2QzMHYuaAotZGlzLWJ1Zi5sbzogZGlzLWJ1Zi5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSBvcGludGwuaAotZGlzYXNzZW1ibGUubG86IGRpc2Fzc2VtYmxlLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi1mcjMwLWFzbS5sbzogZnIzMC1hc20uYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmggb3BpbnRsLmgKLWZyMzAtZGVzYy5sbzogZnIzMC1kZXNjLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLWRpcy5sbzogZnIzMC1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1pYmxkLmxvOiBmcjMwLWlibGQuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1vcGMubG86IGZyMzAtb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oCi1oODMwMC1kaXMubG86IGg4MzAwLWRpcy5jICQoSU5DRElSKS9vcGNvZGUvaDgzMDAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggb3BpbnRsLmgKLWg4NTAwLWRpcy5sbzogaDg1MDAtZGlzLmMgaDg1MDAtb3BjLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIG9waW50bC5oCi1ocHBhLWRpcy5sbzogaHBwYS1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaAotaTM4Ni1kaXMubG86IGkzODYtZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIGNvbmZpZy5oIG9waW50bC5oCi1pOTYwLWRpcy5sbzogaTk2MC1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmgKLW0zMnItYXNtLmxvOiBtMzJyLWFzbS5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1kZXNjLmxvOiBtMzJyLWRlc2MuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItZGlzLmxvOiBtMzJyLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLWlibGQubG86IG0zMnItaWJsZC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLW9wYy5sbzogbTMyci1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmgKLW0zMnItb3BpbnN0LmxvOiBtMzJyLW9waW5zdC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaAotbTY4ay1kaXMubG86IG02OGstZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9mbG9hdGZvcm1hdC5oIG9waW50bC5oIFwKLSAgJChJTkNESVIpL29wY29kZS9tNjhrLmgKLW02OGstb3BjLmxvOiBtNjhrLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oCi1tODhrLWRpcy5sbzogbTg4ay1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tODhrLmggb3BpbnRsLmgKLW1jb3JlLWRpcy5sbzogbWNvcmUtZGlzLmMgbWNvcmUtb3BjLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi1taXBzLWRpcy5sbzogbWlwcy1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9taXBzLmggb3BpbnRsLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotbWlwcy1vcGMubG86IG1pcHMtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9taXBzLmgKLW1pcHMxNi1vcGMubG86IG1pcHMxNi1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaAotbTEwMjAwLWRpcy5sbzogbTEwMjAwLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBvcGludGwuaAotbTEwMjAwLW9wYy5sbzogbTEwMjAwLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCi1tMTAzMDAtZGlzLmxvOiBtMTAzMDAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMzAwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIG9waW50bC5oCi1tMTAzMDAtb3BjLmxvOiBtMTAzMDAtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMzAwLmgKLW5zMzJrLWRpcy5sbzogbnMzMmstZGlzLmMgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCBcCi0gIG9waW50bC5oCi1wcGMtZGlzLmxvOiBwcGMtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAotICBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvcHBjLmgKLXBwYy1vcGMubG86IHBwYy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oIFwKLSAgb3BpbnRsLmgKLXNoLWRpcy5sbzogc2gtZGlzLmMgc2gtb3BjLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oCi1zcGFyYy1kaXMubG86IHNwYXJjLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIFwKLSAgY29uZmlnLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvbGliaWJlcnR5Lmggb3BpbnRsLmgKLXNwYXJjLW9wYy5sbzogc3BhcmMtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oCi10aWMzMC1kaXMubG86IHRpYzMwLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzMwLmgKLXRpYzgwLWRpcy5sbzogdGljODAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQotdGljODAtb3BjLmxvOiB0aWM4MC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmgKLXZheC1kaXMubG86IHZheC1kaXMuYyAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaAotdzY1LWRpcy5sbzogdzY1LWRpcy5jIHc2NS1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmgKLXo4ay1kaXMubG86IHo4ay1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgejhrLW9wYy5oCi16OGtnZW4ubG86IHo4a2dlbi5jIHN5c2RlcC5oIGNvbmZpZy5oCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hMjlrLWRpcy5jIGIvb3Bjb2Rlcy9hMjlrLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjk1OWM5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvYTI5ay1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBwcmludGluZyBjb2RlIGZvciB0aGUgQU1EIDI5MDAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkzLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4gIFdyaXR0ZW4gYnkgSmltIEtpbmdkb24uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGNvZGUvYTI5ay5oIgotCi0vKiBQcmludCBhIHN5bWJvbGljIHJlcHJlc2VudGF0aW9uIG9mIGEgZ2VuZXJhbC1wdXJwb3NlCi0gICByZWdpc3RlciBudW1iZXIgTlVNIG9uIFNUUkVBTS4KLSAgIE5VTSBpcyBhIG51bWJlciBhcyBmb3VuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24sIG5vdCBhcyBmb3VuZCBpbgotICAgZGVidWdnaW5nIHN5bWJvbHM7IGl0IG11c3QgYmUgaW4gdGhlIHJhbmdlIDAtMjU1LiAgKi8KLXN0YXRpYyB2b2lkCi1wcmludF9nZW5lcmFsIChudW0sIGluZm8pCi0gICAgIGludCBudW07Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpZiAobnVtIDwgMTI4KQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZ3IlZCIsIG51bSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImxyJWQiLCBudW0gLSAxMjgpOwotfQotCi0vKiBMaWtlIHByaW50X2dlbmVyYWwgYnV0IGEgc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVyLgotICAgCi0gICBUaGUgbW5lbW9uaWNzIHVzZWQgYnkgdGhlIEFNRCBhc3NlbWJsZXIgYXJlIG5vdCBxdWl0ZSB0aGUgc2FtZQotICAgYXMgdGhlIG9uZXMgaW4gdGhlIFVzZXIncyBNYW51YWwuICBXZSB1c2UgdGhlIG9uZXMgdGhhdCB0aGUKLSAgIGFzc2VtYmxlciB1c2VzLiAgKi8KLXN0YXRpYyB2b2lkCi1wcmludF9zcGVjaWFsIChudW0sIGluZm8pCi0gICAgIHVuc2lnbmVkIGludCBudW07Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAvKiBSZWdpc3RlciBuYW1lcyBvZiByZWdpc3RlcnMgMC1TUEVDMF9OVU0tMS4gICovCi0gIHN0YXRpYyBjaGFyICpzcGVjMF9uYW1lc1tdID0gewotICAgICJ2YWIiLCAib3BzIiwgImNwcyIsICJjZmciLCAiY2hhIiwgImNoZCIsICJjaGMiLCAicmJwIiwgInRtYyIsICJ0bXIiLAotICAgICJwYzAiLCAicGMxIiwgInBjMiIsICJtbXUiLCAibHJ1IiwgInJzbiIsICJybWEwIiwgInJtYzAiLCAicm1hMSIsICJybWMxIiwKLSAgICAic3BjMCIsICJzcGMxIiwgInNwYzIiLCAiaWJhMCIsICJpYmMwIiwgImliYTEiLCAiaWJjMSIsICJkYmEiLCAiZGJjIiwKLSAgICAiY2lyIiwgImNkciIKLSAgICB9OwotI2RlZmluZSBTUEVDMF9OVU0gKChzaXplb2Ygc3BlYzBfbmFtZXMpIC8gKHNpemVvZiBzcGVjMF9uYW1lc1swXSkpCi0KLSAgLyogUmVnaXN0ZXIgbmFtZXMgb2YgcmVnaXN0ZXJzIDEyOC0xMjgrU1BFQzEyOF9OVU0tMS4gICovCi0gIHN0YXRpYyBjaGFyICpzcGVjMTI4X25hbWVzW10gPSB7Ci0gICAgImlwYyIsICJpcGEiLCAiaXBiIiwgInEiLCAiYWx1IiwgImJwIiwgImZjIiwgImNyIgotICAgIH07Ci0jZGVmaW5lIFNQRUMxMjhfTlVNICgoc2l6ZW9mIHNwZWMxMjhfbmFtZXMpIC8gKHNpemVvZiBzcGVjMTI4X25hbWVzWzBdKSkKLQotICAvKiBSZWdpc3RlciBuYW1lcyBvZiByZWdpc3RlcnMgMTYwLTE2MCtTUEVDMTYwX05VTS0xLiAgKi8KLSAgc3RhdGljIGNoYXIgKnNwZWMxNjBfbmFtZXNbXSA9IHsKLSAgICAiZnBlIiwgImludGUiLCAiZnBzIiwgInNyMTYzIiwgImV4b3AiCi0gICAgfTsKLSNkZWZpbmUgU1BFQzE2MF9OVU0gKChzaXplb2Ygc3BlYzE2MF9uYW1lcykgLyAoc2l6ZW9mIHNwZWMxNjBfbmFtZXNbMF0pKQotCi0gIGlmIChudW0gPCBTUEVDMF9OVU0pCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIHNwZWMwX25hbWVzW251bV0pOwotICBlbHNlIGlmIChudW0gPj0gMTI4ICYmIG51bSA8IDEyOCArIFNQRUMxMjhfTlVNKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBzcGVjMTI4X25hbWVzW251bS0xMjhdKTsKLSAgZWxzZSBpZiAobnVtID49IDE2MCAmJiBudW0gPCAxNjAgKyBTUEVDMTYwX05VTSkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgc3BlYzE2MF9uYW1lc1tudW0tMTYwXSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInNyJWQiLCBudW0pOwotfQotCi0vKiBJcyBhbiBpbnN0cnVjdGlvbiB3aXRoIE9QQ09ERSBhIGRlbGF5ZWQgYnJhbmNoPyAgKi8KLXN0YXRpYyBpbnQKLWlzX2RlbGF5ZWRfYnJhbmNoIChvcGNvZGUpCi0gICAgIGludCBvcGNvZGU7Ci17Ci0gIHJldHVybiAob3Bjb2RlID09IDB4YTggfHwgb3Bjb2RlID09IDB4YTkgfHwgb3Bjb2RlID09IDB4YTAgfHwgb3Bjb2RlID09IDB4YTEKLQkgIHx8IG9wY29kZSA9PSAweGE0IHx8IG9wY29kZSA9PSAweGE1Ci0JICB8fCBvcGNvZGUgPT0gMHhiNCB8fCBvcGNvZGUgPT0gMHhiNQotCSAgfHwgb3Bjb2RlID09IDB4YzQgfHwgb3Bjb2RlID09IDB4YzAKLQkgIHx8IG9wY29kZSA9PSAweGFjIHx8IG9wY29kZSA9PSAweGFkCi0JICB8fCBvcGNvZGUgPT0gMHhjYyk7Ci19Ci0KLS8qIE5vdyBmaW5kIHRoZSBmb3VyIGJ5dGVzIG9mIElOU04gYW5kIHB1dCB0aGVtIGluICpJTlNOezAsOCwxNiwyNH0uICAqLwotc3RhdGljIHZvaWQKLWZpbmRfYnl0ZXNfYmlnIChpbnNuLCBpbnNuMCwgaW5zbjgsIGluc24xNiwgaW5zbjI0KQotICAgICBjaGFyICppbnNuOwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuMDsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjg7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc24xNjsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjI0OwotewotICAqaW5zbjI0ID0gaW5zblswXTsKLSAgKmluc24xNiA9IGluc25bMV07Ci0gICppbnNuOCAgPSBpbnNuWzJdOwotICAqaW5zbjAgID0gaW5zblszXTsKLX0KLQotc3RhdGljIHZvaWQKLWZpbmRfYnl0ZXNfbGl0dGxlIChpbnNuLCBpbnNuMCwgaW5zbjgsIGluc24xNiwgaW5zbjI0KQotICAgICBjaGFyICppbnNuOwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuMDsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjg7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc24xNjsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjI0OwotewotICAqaW5zbjI0ID0gaW5zblszXTsKLSAgKmluc24xNiA9IGluc25bMl07Ci0gICppbnNuOCA9IGluc25bMV07Ci0gICppbnNuMCA9IGluc25bMF07Ci19Ci0KLXR5cGVkZWYgdm9pZCAoKmZpbmRfYnl0ZV9mdW5jX3R5cGUpCi0gICAgIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosCi0JICAgICAgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICopKTsKLQotLyogUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gTUVNQUREUiBvbiBJTkZPLT5TVFJFQU0uCi0gICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uIChhbHdheXMgNCBvbiBhMjlrKS4gICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc24gKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIC8qIFRoZSByYXcgaW5zdHJ1Y3Rpb24uICAqLwotICBjaGFyIGluc25bNF07Ci0KLSAgLyogVGhlIGZvdXIgYnl0ZXMgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciBpbnNuMjQsIGluc24xNiwgaW5zbjgsIGluc24wOwotCi0gIGZpbmRfYnl0ZV9mdW5jX3R5cGUgZmluZF9ieXRlX2Z1bmMgPSAoZmluZF9ieXRlX2Z1bmNfdHlwZSlpbmZvLT5wcml2YXRlX2RhdGE7Ci0KLSAgc3RydWN0IGEyOWtfb3Bjb2RlIENPTlNUICogb3Bjb2RlOwotCi0gIHsKLSAgICBpbnQgc3RhdHVzID0KLSAgICAgICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIChiZmRfYnl0ZSAqKSAmaW5zblswXSwgNCwgaW5mbyk7Ci0gICAgaWYgKHN0YXR1cyAhPSAwKQotICAgICAgewotCSgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCXJldHVybiAtMTsKLSAgICAgIH0KLSAgfQotCi0gICgqZmluZF9ieXRlX2Z1bmMpIChpbnNuLCAmaW5zbjAsICZpbnNuOCwgJmluc24xNiwgJmluc24yNCk7Ci0KLSAgcHJpbnRmICgiJTAyeCUwMnglMDJ4JTAyeCAiLCBpbnNuMjQsIGluc24xNiwgaW5zbjgsIGluc24wKTsKLQotICAvKiBIYW5kbGUgdGhlIG5vcCAoYXNlcSAweDQwLGdyMSxncjEpIHNwZWNpYWxseSAqLwotICBpZiAoKGluc24yND09MHg3MCkgJiYgKGluc24xNj09MHg0MCkgJiYgKGluc244PT0weDAxKSAmJiAoaW5zbjA9PTB4MDEpKSB7Ci0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIm5vcCIpOwotICAgIHJldHVybiA0OwotICB9Ci0KLSAgLyogVGhlIG9wY29kZSBpcyBhbHdheXMgaW4gaW5zbjI0LiAgKi8KLSAgZm9yIChvcGNvZGUgPSAmYTI5a19vcGNvZGVzWzBdOwotICAgICAgIG9wY29kZSA8ICZhMjlrX29wY29kZXNbbnVtX29wY29kZXNdOwotICAgICAgICsrb3Bjb2RlKQotICAgIHsKLSAgICAgIGlmICgoKHVuc2lnbmVkIGxvbmcpIGluc24yNCA8PCAyNCkgPT0gb3Bjb2RlLT5vcGNvZGUpCi0JewotCSAgY2hhciAqczsKLQkgIAotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLCBvcGNvZGUtPm5hbWUpOwotCSAgZm9yIChzID0gb3Bjb2RlLT5hcmdzOyAqcyAhPSAnXDAnOyArK3MpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKCpzKQotCQl7Ci0JCWNhc2UgJ2EnOgotCQkgIHByaW50X2dlbmVyYWwgKGluc244LCBpbmZvKTsKLQkJICBicmVhazsKLQkJICAKLQkJY2FzZSAnYic6Ci0JCSAgcHJpbnRfZ2VuZXJhbCAoaW5zbjAsIGluZm8pOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2MnOgotCQkgIHByaW50X2dlbmVyYWwgKGluc24xNiwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnaSc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24wKTsKLQkJICBicmVhazsKLQotCQljYXNlICd4JzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCAoaW5zbjE2IDw8IDgpICsgaW5zbjApOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2gnOgotCQkgIC8qIFRoaXMgdXNlZCB0byBiZSAleCBmb3IgYmludXRpbHMuICAqLwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkJICAgIChpbnNuMTYgPDwgMjQpICsgKGluc24wIDw8IDE2KSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnWCc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCi0JCQkJICAgICgoaW5zbjE2IDw8IDgpICsgaW5zbjApIHwgMHhmZmZmMDAwMCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnUCc6Ci0JCSAgLyogVGhpcyBvdXRwdXQgbG9va3MganVzdCBsaWtlIGFic29sdXRlIGFkZHJlc3NpbmcsIGJ1dAotCQkgICAgIG1heWJlIHRoYXQncyBPSyAoaXQncyB3aGF0IHRoZSBHREIgbTY4ayBhbmQgRUJNT04KLQkJICAgICBhMjlrIGRpc2Fzc2VtYmxlcnMgZG8pLiAgKi8KLQkJICAvKiBBbGwgdGhlIHNoaWZ0aW5nIGlzIHRvIHNpZ24tZXh0ZW5kIGl0LiAgcCovCi0JCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCi0JCSAgICAobWVtYWRkciArCi0JCSAgICAgKCgoaW50KSgoaW5zbjE2IDw8IDEwKSArIChpbnNuMCA8PCAyKSkgPDwgMTQpID4+IDE0KSwKLQkJICAgICBpbmZvKTsKLQkJICBicmVhazsKLQotCQljYXNlICdBJzoKLQkJICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkJICAgICgoaW5zbjE2IDw8IDEwKSArIChpbnNuMCA8PCAyKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnZSc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24xNiA+PiA3KTsKLQkJICBicmVhazsKLQotCQljYXNlICduJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBpbnNuMTYgJiAweDdmKTsKLQkJICBicmVhazsKLQotCQljYXNlICd2JzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBpbnNuMTYpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3MnOgotCQkgIHByaW50X3NwZWNpYWwgKGluc244LCBpbmZvKTsKLQkJICBicmVhazsKLQotCQljYXNlICd1JzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgaW5zbjAgPj4gNyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAncic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIChpbnNuMCA+PiA0KSAmIDcpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0knOgotCQkgIGlmICgoaW5zbjE2ICYgMykgIT0gMCkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbnNuMTYgJiAzKTsKLQkJICBicmVhazsKLQotCQljYXNlICdkJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgKGluc24wID4+IDIpICYgMyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnZic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24wICYgMyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnRic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIChpbnNuMTYgPj4gMikgJiAxNSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnQyc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24xNiAmIDMpOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlYyIsICpzKTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIE5vdyB3ZSBsb29rIGZvciBhIGNvbnN0LGNvbnN0aCBwYWlyIG9mIGluc3RydWN0aW9ucywKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgdHJ5IHRvIHByaW50IHRoZSBzeW1ib2xpYyBhZGRyZXNzLiAgKi8KLQkgIGlmIChpbnNuMjQgPT0gMikgIC8qIGNvbnN0aCAqLwotCSAgICB7Ci0JICAgICAgaW50IGVycmNvZGU7Ci0JICAgICAgY2hhciBwcmV2X2luc25bNF07Ci0JICAgICAgdW5zaWduZWQgY2hhciBwcmV2X2luc24wLCBwcmV2X2luc244LCBwcmV2X2luc24xNiwgcHJldl9pbnNuMjQ7Ci0JICAgICAgCi0JICAgICAgZXJyY29kZSA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgLSA0LAotCQkJCQkJICAgKGJmZF9ieXRlICopICZwcmV2X2luc25bMF0sCi0JCQkJCQkgICA0LAotCQkJCQkJICAgaW5mbyk7Ci0JICAgICAgaWYgKGVycmNvZGUgPT0gMCkKLQkJewotCQkgIC8qIElmIGl0IGlzIGEgZGVsYXllZCBicmFuY2gsIHdlIG5lZWQgdG8gbG9vayBhdCB0aGUKLQkJICAgICBpbnN0cnVjdGlvbiBiZWZvcmUgdGhlIGRlbGF5ZWQgYnJhY2ggdG8gaGFuZGxlCi0JCSAgICAgdGhpbmdzIGxpa2UKLQkJICAgICAKLQkJICAgICBjb25zdCBfZm9vCi0JCSAgICAgY2FsbCBfcHJpbnRmCi0JCSAgICAgY29uc3RoIF9mb28KLQkJICAgICAqLwotCQkgICgqZmluZF9ieXRlX2Z1bmMpIChwcmV2X2luc24sICZwcmV2X2luc24wLCAmcHJldl9pbnNuOCwKLQkJCQkgICAgICZwcmV2X2luc24xNiwgJnByZXZfaW5zbjI0KTsKLQkJICBpZiAoaXNfZGVsYXllZF9icmFuY2ggKHByZXZfaW5zbjI0KSkKLQkJICAgIHsKLQkJICAgICAgZXJyY29kZSA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykKLQkJCShtZW1hZGRyIC0gOCwgKGJmZF9ieXRlICopICZwcmV2X2luc25bMF0sIDQsIGluZm8pOwotCQkgICAgICAoKmZpbmRfYnl0ZV9mdW5jKSAocHJldl9pbnNuLCAmcHJldl9pbnNuMCwgJnByZXZfaW5zbjgsCi0JCQkJCSAmcHJldl9pbnNuMTYsICZwcmV2X2luc24yNCk7Ci0JCSAgICB9Ci0JCX0KLQkJICAKLQkgICAgICAvKiBJZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHJlYWRpbmcgbWVtb3J5LCB0aGVuIGFzc3VtZQotCQkgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBub3QgY29uc3QuICAqLwotCSAgICAgIGlmIChlcnJjb2RlID09IDApCi0JCXsKLQkJICAvKiBJcyBpdCBjb25zdCB0byB0aGUgc2FtZSByZWdpc3Rlcj8gICovCi0JCSAgaWYgKHByZXZfaW5zbjI0ID09IDMKLQkJICAgICAgJiYgcHJldl9pbnNuOCA9PSBpbnNuOCkKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdDsgIik7Ci0JCSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCQkJKCgoaW5zbjE2IDw8IDI0KSArIChpbnNuMCA8PCAxNikKLQkJCSAgKyAocHJldl9pbnNuMTYgPDwgOCkgKyAocHJldl9pbnNuMCkpLAotCQkJIGluZm8pOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgcmV0dXJuIDQ7Ci0JfQotICAgIH0KLSAgLyogVGhpcyB1c2VkIHRvIGJlICU4eCBmb3IgYmludXRpbHMuICAqLwotICAoKmluZm8tPmZwcmludGZfZnVuYykKLSAgICAoaW5mby0+c3RyZWFtLCAiLndvcmQgMHglMDh4IiwKLSAgICAgKGluc24yNCA8PCAyNCkgKyAoaW5zbjE2IDw8IDE2KSArIChpbnNuOCA8PCA4KSArIGluc24wKTsKLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIERpc2Fzc2VtYmxlIGFuIGJpZy1lbmRpYW4gYTI5ayBpbnN0cnVjdGlvbi4gICovCi1pbnQKLXByaW50X2luc25fYmlnX2EyOWsgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpIGZpbmRfYnl0ZXNfYmlnOwotICByZXR1cm4gcHJpbnRfaW5zbiAobWVtYWRkciwgaW5mbyk7Ci19Ci0KLS8qIERpc2Fzc2VtYmxlIGEgbGl0dGxlLWVuZGlhbiBhMjlrIGluc3RydWN0aW9uLiAgKi8KLWludAotcHJpbnRfaW5zbl9saXR0bGVfYTI5ayAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgZmluZF9ieXRlc19saXR0bGU7Ci0gIHJldHVybiBwcmludF9pbnNuIChtZW1hZGRyLCBpbmZvKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvYWNpbmNsdWRlLm00IGIvb3Bjb2Rlcy9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjA5YjkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hY2luY2x1ZGUubTQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hY2xvY2FsLm00IGIvb3Bjb2Rlcy9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDg3MTFkLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDExMTEgKzAsMCBAQAotZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjQKLQotZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLWRubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWRubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLWRubCBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLXNpbmNsdWRlKC4uL2JmZC9hY2luY2x1ZGUubTQpCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCAtLQotIyBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuCi0jIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIHNlcmlhbCAxCi0KLWRubCBVc2FnZToKLWRubCBBTV9JTklUX0FVVE9NQUtFKHBhY2thZ2UsdmVyc2lvbiwgW25vLWRlZmluZV0pCi0KLUFDX0RFRlVOKEFNX0lOSVRfQVVUT01BS0UsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKLVBBQ0tBR0U9WyQxXQotQUNfU1VCU1QoUEFDS0FHRSkKLVZFUlNJT049WyQyXQotQUNfU1VCU1QoVkVSU0lPTikKLWRubCB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLWZpCi1pZmVsc2UoWyQzXSwsCi1BQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKSkKLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCi1kbmwgRklYTUUgVGhpcyBpcyB0cnVseSBncm9zcy4KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8sICRtaXNzaW5nX2RpcikKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCi0jCi0KLUFDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIlskXSoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICJbJF0qIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIlskXSoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKLSAgIGZpCi0KLSAgIHRlc3QgIlskXTIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUFDX01TR19SRVNVTFQoeWVzKV0pCi0KLWRubCBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSwgRElSRUNUT1JZKQotZG5sIFRoZSBwcm9ncmFtIG11c3QgcHJvcGVybHkgaW1wbGVtZW50IC0tdmVyc2lvbi4KLUFDX0RFRlVOKEFNX01JU1NJTkdfUFJPRywKLVtBQ19NU0dfQ0hFQ0tJTkcoZm9yIHdvcmtpbmcgJDIpCi0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoJDIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAkMT0kMgotICAgQUNfTVNHX1JFU1VMVChmb3VuZCkKLWVsc2UKLSAgICQxPSIkMy9taXNzaW5nICQyIgotICAgQUNfTVNHX1JFU1VMVChtaXNzaW5nKQotZmkKLUFDX1NVQlNUKCQxKV0pCi0KLQotIyBzZXJpYWwgMzUgQUNfUFJPR19MSUJUT09MCi1BQ19ERUZVTihBQ19QUk9HX0xJQlRPT0wsCi1bQUNfUkVRVUlSRShbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotQUNfQ0FDSEVfU0FWRQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIExOX1M9IiRMTl9TIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRob3N0IFwKLXx8IEFDX01TR19FUlJPUihbbGlidG9vbCBjb25maWd1cmUgZmFpbGVkXSkKLQotIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZwotQUNfQ0FDSEVfTE9BRAotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotQUNfU1VCU1QoTElCVE9PTClkbmwKLQotIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKLSMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotXSkKLQotQUNfREVGVU4oQUNfTElCVE9PTF9TRVRVUCwKLVtBQ19QUkVSRVEoMi4xMylkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TSEFSRURdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NUQVRJQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfTk1fUEFSU0VdKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCi1kbmwKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRsdF9kbG9wZW4iID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZW5hYmxlLWRsb3BlbiIKLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGhvc3QiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ1sjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAotICAgIFtBQ19UUllfTElOSyhbXSxbXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSldKQotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi0qLSotY3lnd2luKikKLSAgQUNfU1lTX0xJQlRPT0xfQ1lHV0lOCi0gIDs7Ci0KLWVzYWMKLQotIyBlbmFibGUgdGhlIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgc3dpdGNoCi0KLUFDX0FSR19FTkFCTEUobGlidG9vbC1sb2NrLAotWyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgZm9yY2UgbGlidG9vbCBub3QgdG8gZG8gZmlsZSBsb2NraW5nXSwKLW5lZWRfbG9ja3M9JGVuYWJsZXZhbCwKLW5lZWRfbG9ja3M9eWVzKQotCi1pZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCi0gIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotZmkKLV0pCi0KLSMgQUNfTElCVE9PTF9ETE9QRU4gLSBjaGVjayBmb3IgZGxvcGVuIHN1cHBvcnQKLUFDX0RFRlVOKEFDX0xJQlRPT0xfRExPUEVOLCBbbHRfZGxvcGVuPXllc10pCi0KLSMgQUNfRU5BQkxFX1NIQVJFRCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc2hhcmVkIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9TSEFSRURbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX1NIQVJFRCwKLVtkZWZpbmUoW0FDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzaGFyZWQsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zaGFyZWQ9QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NIQVJFRCAtIHNldCB0aGUgZGVmYXVsdCBzaGFyZWQgZmxhZyB0byAtLWRpc2FibGUtc2hhcmVkCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NIQVJFRCwKLVtBQ19FTkFCTEVfU0hBUkVEKG5vKV0pCi0KLSMgQUNfRU5BQkxFX1NUQVRJQyAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc3RhdGljIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9TVEFUSUNbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX1NUQVRJQywKLVtkZWZpbmUoW0FDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzdGF0aWMsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc3RhdGljPXllcyA7Owotbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSopCi0gIGVuYWJsZV9zdGF0aWM9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc3RhdGljPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zdGF0aWM9QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NUQVRJQyAtIHNldCB0aGUgZGVmYXVsdCBzdGF0aWMgZmxhZyB0byAtLWRpc2FibGUtc3RhdGljCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NUQVRJQywKLVtBQ19FTkFCTEVfU1RBVElDKG5vKV0pCi0KLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfRkFTVF9JTlNUQUxMLAotW2RlZmluZShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKGZhc3QtaW5zdGFsbCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfZmFzdF9pbnN0YWxsPUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIHNldCB0aGUgZGVmYXVsdCB0byAtLWRpc2FibGUtZmFzdC1pbnN0YWxsCi1BQ19ERUZVTihBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTCwKLVtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMKG5vKV0pCi0KLQotIyBBQ19QUk9HX0xEIC0gZmluZCB0aGUgcGF0aCB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCi1BQ19ERUZVTihBQ19QUk9HX0xELAotW0FDX0FSR19XSVRIKGdudS1sZCwKLVsgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub11dLAotdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzLCB3aXRoX2dudV9sZD1ubykKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgR0NDXSkKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLWNoYW5nZXF1b3RlKCwpZG5sCi0gICAgLyogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKLWVsc2UKLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCi1maQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTEQsCi1baWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpXSkKLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVCgkTEQpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotdGVzdCAteiAiJExEIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIXSkKLUFDX1NVQlNUKExEKQotQUNfUFJPR19MRF9HTlUKLV0pCi0KLUFDX0RFRlVOKEFDX1BST0dfTERfR05VLAotW0FDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGFjX2N2X3Byb2dfZ251X2xkLAotWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmldKQotXSkKLQotIyBBQ19QUk9HX05NIC0gZmluZCB0aGUgcGF0aCB0byBhIEJTRC1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCi1BQ19ERUZVTihBQ19QUk9HX05NLAotW0FDX01TR19DSEVDS0lORyhbZm9yIEJTRC1jb21wYXRpYmxlIG5tXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX05NLAotW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmldKQotTk09IiRhY19jdl9wYXRoX05NIgotQUNfTVNHX1JFU1VMVChbJE5NXSkKLUFDX1NVQlNUKE5NKQotXSkKLQotIyBBQ19TWVNfTk1fUEFSU0UgLSBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQKLSMgYnkgQyBzeW1ib2wgbmFtZSBmcm9tIG5tLgotQUNfREVGVU4oQUNfU1lTX05NX1BBUlNFLAotW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLUFDX01TR19DSEVDS0lORyhbY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0XSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlLAotWyMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyB7VGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KX0KLQotY2hhbmdlcXVvdGUoLClkbmwKLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsgCV1cKCRhY19zeW1jb2RlXClbIAldWyAJXSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBhY19ubGlzdD1jb25mdGVzdC5ubQotICAKLSAgICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotY2hhbmdlcXVvdGUoLClkbmwKLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQotY2hhbmdlcXVvdGUoWyxdKWRubAotewotRU9GCi0Jc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jCi0JY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdG0uJGFjX29iamV4dAotCSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRlc3RtLiRhY19vYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLQkgICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotCSAgZmkKLQkgIExJQlM9IiRhY19zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBQ19GRF9DQwotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLSAgICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRhY19waXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGlmIHRlc3QgeCIkYWNfc3ltcHJmeCIgPSB4Il8iOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi0gICAgZmkKLSAgICBicmVhawotICBlbHNlCi0gICAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLV0pCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotQUNfTVNHX1JFU1VMVCgkYWNfcmVzdWx0KQotXSkKLQotIyBBQ19TWVNfTElCVE9PTF9DWUdXSU4gLSBmaW5kIHRvb2xzIG5lZWRlZCBvbiBjeWd3aW4KLUFDX0RFRlVOKEFDX1NZU19MSUJUT09MX0NZR1dJTiwKLVtBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQotQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQotXSkKLQotIyBBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkUgLSBkb2VzIHRoZSBjb21waWxlciBwcmVmaXggZ2xvYmFsIHN5bWJvbHMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhbiB1bmRlcnNjb3JlPwotQUNfREVGVU4oQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKLUFDX01TR19DSEVDS0lORyhbZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHNdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSwKLVthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBQ19GRF9DQwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLSAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotZmkKLXJtIC1yZiBjb25mdGVzdCoKLV0pCi1BQ19NU0dfUkVTVUxUKCRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUpCi1VU0VfU1lNQk9MX1VOREVSU0NPUkU9JHthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm99Ci1BQ19TVUJTVChVU0VfU1lNQk9MX1VOREVSU0NPUkUpZG5sCi1dKQotCi0jIEFDX0NIRUNLX0xJQk0gLSBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5Ci1BQ19ERUZVTihBQ19DSEVDS19MSUJNLCBbCi1BQ19DSEVDS19MSUIobXcsIF9td3ZhbGlkY2hlY2tsKQotQUNfQ0hFQ0tfTElCKG0sIGNvcykKLV0pCi0KLSMgQUNfTElCTFRETF9DT05WRU5JRU5DRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGNvbnZlbmllbmNlIGxpYnJhcnksIGFkZHMgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSB0bwotIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKLSMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAotIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAotIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90Ci0jIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcwotIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgotQUNfREVGVU4oQUNfTElCTFRETF9DT05WRU5JRU5DRSwgWwotICBjYXNlICIkZW5hYmxlX2x0ZGxfY29udmVuaWVuY2UiIGluCi0gIG5vKSBBQ19NU0dfRVJST1IoW3RoaXMgcGFja2FnZSBuZWVkcyBhIGNvbnZlbmllbmNlIGxpYmx0ZGxdKSA7OwotICAiIikgZW5hYmxlX2x0ZGxfY29udmVuaWVuY2U9eWVzCi0gICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UiIDs7Ci0gIGVzYWMKLSAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGxjLmxhCi1dKQotCi0jIEFDX0xJQkxURExfSU5TVEFMTEFCTEVbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBpbnN0YWxsYWJsZSBsaWJyYXJ5LCBhbmQgYWRkcyAtLWVuYWJsZS1sdGRsLWluc3RhbGwgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLSMgSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYWNybyBtYXkgaGF2ZSB0byBiZSBjYWxsZWQgYWZ0ZXIgQUNfUFJPR19MSUJUT09MLgotQUNfREVGVU4oQUNfTElCTFRETF9JTlNUQUxMQUJMRSwgWwotICBBQ19DSEVDS19MSUIobHRkbCwgbWFpbiwgTElCTFRETD0iLWxsdGRsIiwgWwotICAgIGNhc2UgIiRlbmFibGVfbHRkbF9pbnN0YWxsIiBpbgotICAgIG5vKSBBQ19NU0dfV0FSTihbbGlibHRkbCBub3QgaW5zdGFsbGVkLCBidXQgaW5zdGFsbGF0aW9uIGRpc2FibGVkXSkgOzsKLSAgICAiIikgZW5hYmxlX2x0ZGxfaW5zdGFsbD15ZXMKLSAgICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWluc3RhbGwiIDs7Ci0gICAgZXNhYwotICBdKQotICBpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiICE9IHgibm8iOyB0aGVuCi0gICAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGwubGEKLSAgZmkKLV0pCi0KLWRubCBvbGQgbmFtZXMKLUFDX0RFRlVOKEFNX1BST0dfTElCVE9PTCwgW2luZGlyKFtBQ19QUk9HX0xJQlRPT0xdKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0VOQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NUQVRJQywgW2luZGlyKFtBQ19FTkFCTEVfU1RBVElDXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0RJU0FCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0RJU0FCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0RJU0FCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0RJU0FCTEVfU1RBVElDXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX1BST0dfTEQsIFtpbmRpcihbQUNfUFJPR19MRF0pXSlkbmwKLUFDX0RFRlVOKEFNX1BST0dfTk0sIFtpbmRpcihbQUNfUFJPR19OTV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19OTV9QQVJTRSwgW2luZGlyKFtBQ19TWVNfTk1fUEFSU0VdKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfU1lNQk9MX1VOREVSU0NPUkUsIFtpbmRpcihbQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFXSldKWRubAotQUNfREVGVU4oQU1fU1lTX0xJQlRPT0xfQ1lHV0lOLCBbaW5kaXIoW0FDX1NZU19MSUJUT09MX0NZR1dJTl0pXSlkbmwKLQotIyBMaWtlIEFDX0NPTkZJR19IRUFERVIsIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdGFtcCBmaWxlLgotCi1BQ19ERUZVTihBTV9DT05GSUdfSEVBREVSLAotW0FDX1BSRVJFUShbMi4xMl0pCi1BQ19DT05GSUdfSEVBREVSKFskMV0pCi1kbmwgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KLWRubCBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKLWRubCB0aGF0IGlzIGdlbmVyYXRlZC4gIFdlIG11c3Qgc3RyaXAgZXZlcnl0aGluZyBwYXN0IHRoZSBmaXJzdCAiOiIsCi1kbmwgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgbGFzdCAiLyIuCi1BQ19PVVRQVVRfQ09NTUFORFMoY2hhbmdlcXVvdGUoPDwsPj4pZG5sCi1pZmVsc2UocGF0c3Vic3QoPDwkMT4+LCA8PFteIF0+PiwgPDw+PiksIDw8Pj4sCi08PHRlc3QgLXogIjw8JD4+Q09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gcGF0c3Vic3QoPDwkMT4+LCA8PF5cKFteOl0qL1wpPy4qPj4sIDw8XDE+PilzdGFtcC1oPDw+PmRubD4+LAotPDxhbV9pbmR4PTEKLWZvciBhbV9maWxlIGluIDw8JDE+PjsgZG8KLSAgY2FzZSAiIDw8JD4+Q09ORklHX0hFQURFUlMgIiBpbgotICAqIiA8PCQ+PmFtX2ZpbGUgIio8PCk+PgotICAgIGVjaG8gdGltZXN0YW1wID4gYGVjaG8gPDwkPj5hbV9maWxlIHwgc2VkIC1lICdzJTouKiUlJyAtZSAncyVbXi9dKiQlJSdgc3RhbXAtaCRhbV9pbmR4Ci0gICAgOzsKLSAgZXNhYwotICBhbV9pbmR4PWBleHByICI8PCQ+PmFtX2luZHgiICsgMWAKLWRvbmU8PD4+ZG5sPj4pCi1jaGFuZ2VxdW90ZShbLF0pKV0pCi0KLSMgQWRkIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvcHRpb24gdG8gY29uZmlndXJlLgotIyBGcm9tIEppbSBNZXllcmluZwotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX01BSU5UQUlORVJfTU9ERSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKLSAgZG5sIG1haW50YWluZXItbW9kZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Ci0gIEFDX0FSR19FTkFCTEUobWFpbnRhaW5lci1tb2RlLAotWyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyXSwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbCwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9bm8pCi0gIEFDX01TR19SRVNVTFQoJFVTRV9NQUlOVEFJTkVSX01PREUpCi0gIEFNX0NPTkRJVElPTkFMKE1BSU5UQUlORVJfTU9ERSwgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllcykKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIEFDX1NVQlNUKE1BSU5UKWRubAotXQotKQotCi0jIERlZmluZSBhIGNvbmRpdGlvbmFsLgotCi1BQ19ERUZVTihBTV9DT05ESVRJT05BTCwKLVtBQ19TVUJTVCgkMV9UUlVFKQotQUNfU1VCU1QoJDFfRkFMU0UpCi1pZiAkMjsgdGhlbgotICAkMV9UUlVFPQotICAkMV9GQUxTRT0nIycKLWVsc2UKLSAgJDFfVFJVRT0nIycKLSAgJDFfRkFMU0U9Ci1maV0pCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLUFDX0RFRlVOKENZX1dJVEhfTkxTLAotICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCi0gICAgQUNfQVJHX0VOQUJMRShubHMsCi0gICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCi0gICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKLSAgICBBQ19TVUJTVChVU0VfTkxTKQotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKLSAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMsIDEsIFtEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAotICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCi0gICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0Ci0gICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKLSAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCi0JZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCi0JbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCi0JICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKLQkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAotCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCi0JCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhULCAxLAotCQkJW0RlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0Ll0pCi0JICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKLQkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0JCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLQkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKLQkJICBbQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmVdLAotCQkgIFtDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYl0pCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQldKQotCi0JZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCi0gICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCi0KLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KLQkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KLQkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgotICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCi0gICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLSAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KLSAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQotCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCi0JaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgQUNfTVNHX1JFU1VMVCgKLQkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCi0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCi0gICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncwotICAgIGRubCBpbiBjb25maWd1cmUuaW4uCi0gICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KLSAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKLSAgICBBQ19TVUJTVChDQVRBTE9HUykKLSAgICBBQ19TVUJTVChDQVRPQkpFWFQpCi0gICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCi0gICAgQUNfU1VCU1QoR01PRklMRVMpCi0gICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKLSAgICBBQ19TVUJTVChJTlRMREVQUykKLSAgICBBQ19TVUJTVChJTlRMTElCUykKLSAgICBBQ19TVUJTVChJTlRMT0JKUykKLSAgICBBQ19TVUJTVChQT0ZJTEVTKQotICAgIEFDX1NVQlNUKFBPU1VCKQotICBdKQotCi1BQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKLSAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCi0KLSAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKLSAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb25dKQotICAgZmkKLQotICAgQU1fTENfTUVTU0FHRVMKLSAgIENZX1dJVEhfTkxTCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCi0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQotICAgICBmaQotCi0gICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgotICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQotICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCi0gICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCi0KLSAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKLSAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgotICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKLSAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKLQotCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKLSAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgotCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgotICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCi0gICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0Ci0gICBkbmwgcGFja2FnZXMuCi0gICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgQUNfU1VCU1QoR1RfTk8pCi0gICBBQ19TVUJTVChHVF9ZRVMpCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCi0KLSAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgotICAgbD0KLSAgIEFDX1NVQlNUKGwpCi0KLSAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCi0gICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKLSAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgotICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIF0pCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLWRubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKLWRubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKLUFDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCi1bIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCi1bY2FzZSAiWyRdJDEiIGluCi0gIC8qKQotICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiBbJDNdOyB0aGVuCi0JYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKLWRubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgotaWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKLV0pZG5sCi0gIDs7Ci1lc2FjXSlkbmwKLSQxPSIkYWNfY3ZfcGF0aF8kMSIKLWlmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFskXSQxKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFDX1NVQlNUKCQxKWRubAotXSkKLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hbHBoYS1kaXMuYyBiL29wY29kZXMvYWxwaGEtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTU3OTkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hbHBoYS1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKiBhbHBoYS1kaXMuYyAtLSBEaXNhc3NlbWJsZSBBbHBoYSBBWFAgaW5zdHJ1Y3Rpb25zCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+LAotICAgcGF0dGVybmVkIGFmdGVyIHRoZSBQUEMgb3Bjb2RlIGhhbmRsaW5nIHdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvci4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS9hbHBoYS5oIgotCi0vKiBPU0YgcmVnaXN0ZXIgbmFtZXMuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG9zZl9yZWduYW1lc1s2NF0gPQotewotICAidjAiLCAidDAiLCAidDEiLCAidDIiLCAidDMiLCAidDQiLCAidDUiLCAidDYiLAotICAidDciLCAiczAiLCAiczEiLCAiczIiLCAiczMiLCAiczQiLCAiczUiLCAiZnAiLAotICAiYTAiLCAiYTEiLCAiYTIiLCAiYTMiLCAiYTQiLCAiYTUiLCAidDgiLCAidDkiLAotICAidDEwIiwgInQxMSIsICJyYSIsICJ0MTIiLCAiYXQiLCAiZ3AiLCAic3AiLCAiemVybyIsCi0gICIkZjAiLCAiJGYxIiwgIiRmMiIsICIkZjMiLCAiJGY0IiwgIiRmNSIsICIkZjYiLCAiJGY3IiwKLSAgIiRmOCIsICIkZjkiLCAiJGYxMCIsICIkZjExIiwgIiRmMTIiLCAiJGYxMyIsICIkZjE0IiwgIiRmMTUiLAotICAiJGYxNiIsICIkZjE3IiwgIiRmMTgiLCAiJGYxOSIsICIkZjIwIiwgIiRmMjEiLCAiJGYyMiIsICIkZjIzIiwKLSAgIiRmMjQiLCAiJGYyNSIsICIkZjI2IiwgIiRmMjciLCAiJGYyOCIsICIkZjI5IiwgIiRmMzAiLCAiJGYzMSIKLX07Ci0KLS8qIFZNUyByZWdpc3RlciBuYW1lcy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgdm1zX3JlZ25hbWVzWzY0XSA9Ci17Ci0gICJSMCIsICJSMSIsICJSMiIsICJSMyIsICJSNCIsICJSNSIsICJSNiIsICJSNyIsCi0gICJSOCIsICJSOSIsICJSMTAiLCAiUjExIiwgIlIxMiIsICJSMTMiLCAiUjE0IiwgIlIxNSIsCi0gICJSMTYiLCAiUjE3IiwgIlIxOCIsICJSMTkiLCAiUjIwIiwgIlIyMSIsICJSMjIiLCAiUjIzIiwKLSAgIlIyNCIsICJBSSIsICJSQSIsICJQViIsICJBVCIsICJGUCIsICJTUCIsICJSWiIsCi0gICJGMCIsICJGMSIsICJGMiIsICJGMyIsICJGNCIsICJGNSIsICJGNiIsICJGNyIsCi0gICJGOCIsICJGOSIsICJGMTAiLCAiRjExIiwgIkYxMiIsICJGMTMiLCAiRjE0IiwgIkYxNSIsCi0gICJGMTYiLCAiRjE3IiwgIkYxOCIsICJGMTkiLCAiRjIwIiwgIkYyMSIsICJGMjIiLCAiRjIzIiwKLSAgIkYyNCIsICJGMjUiLCAiRjI2IiwgIkYyNyIsICJGMjgiLCAiRjI5IiwgIkYzMCIsICJGWiIKLX07Ci0KLS8qIERpc2Fzc2VtYmxlIEFscGhhIGluc3RydWN0aW9ucy4gICovCi0KLWludAotcHJpbnRfaW5zbl9hbHBoYSAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKm9wY29kZV9pbmRleFtBWFBfTk9QUysxXTsKLSAgY29uc3QgY2hhciAqIGNvbnN0ICogcmVnbmFtZXM7Ci0gIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKm9wY29kZSwgKm9wY29kZV9lbmQ7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXg7Ci0gIHVuc2lnbmVkIGluc24sIG9wLCBpc2FfbWFzazsKLSAgaW50IG5lZWRfY29tbWE7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgbWFqb3JvcCB0YWJsZSB0aGUgZmlyc3QgdGltZSB0aHJvdWdoICovCi0gIGlmICghb3Bjb2RlX2luZGV4WzBdKQotICAgIHsKLSAgICAgIG9wY29kZSA9IGFscGhhX29wY29kZXM7Ci0gICAgICBvcGNvZGVfZW5kID0gb3Bjb2RlICsgYWxwaGFfbnVtX29wY29kZXM7Ci0KLSAgICAgIGZvciAob3AgPSAwOyBvcCA8IEFYUF9OT1BTOyArK29wKQotICAgICAgICB7Ci0gICAgICAgICAgb3Bjb2RlX2luZGV4W29wXSA9IG9wY29kZTsKLSAgICAgICAgICB3aGlsZSAob3Bjb2RlIDwgb3Bjb2RlX2VuZCAmJiBvcCA9PSBBWFBfT1AgKG9wY29kZS0+b3Bjb2RlKSkKLQkgICAgKytvcGNvZGU7Ci0gICAgICAgIH0KLSAgICAgIG9wY29kZV9pbmRleFtvcF0gPSBvcGNvZGU7Ci0gICAgfQotCi0gIGlmIChpbmZvLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZXZheF9mbGF2b3VyKQotICAgIHJlZ25hbWVzID0gdm1zX3JlZ25hbWVzOwotICBlbHNlCi0gICAgcmVnbmFtZXMgPSBvc2ZfcmVnbmFtZXM7Ci0KLSAgaXNhX21hc2sgPSBBWFBfT1BDT0RFX05PUEFMOwotICBzd2l0Y2ggKGluZm8tPm1hY2gpCi0gICAgewotICAgIGNhc2UgYmZkX21hY2hfYWxwaGFfZXY0OgotICAgICAgaXNhX21hc2sgfD0gQVhQX09QQ09ERV9FVjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX2FscGhhX2V2NToKLSAgICAgIGlzYV9tYXNrIHw9IEFYUF9PUENPREVfRVY1OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9hbHBoYV9ldjY6Ci0gICAgICBpc2FfbWFzayB8PSBBWFBfT1BDT0RFX0VWNjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSBpbnNuIGludG8gYSBob3N0IHdvcmQgKi8KLSAgewotICAgIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgICBpbnQgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgICBpZiAoc3RhdHVzICE9IDApCi0gICAgICB7Ci0gICAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgaW5zbiA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0gIH0KLQotICAvKiBHZXQgdGhlIG1ham9yIG9wY29kZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBvcCA9IEFYUF9PUCAoaW5zbik7Ci0KLSAgLyogRmluZCB0aGUgZmlyc3QgbWF0Y2ggaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0gIG9wY29kZV9lbmQgPSBvcGNvZGVfaW5kZXhbb3ArMV07Ci0gIGZvciAob3Bjb2RlID0gb3Bjb2RlX2luZGV4W29wXTsgb3Bjb2RlIDwgb3Bjb2RlX2VuZDsgKytvcGNvZGUpCi0gICAgewotICAgICAgaWYgKChpbnNuICYgb3Bjb2RlLT5tYXNrKSAhPSBvcGNvZGUtPm9wY29kZSkKLQljb250aW51ZTsKLQotICAgICAgaWYgKCEob3Bjb2RlLT5mbGFncyAmIGlzYV9tYXNrKSkKLQljb250aW51ZTsKLQotICAgICAgLyogTWFrZSB0d28gcGFzc2VzIG92ZXIgdGhlIG9wZXJhbmRzLiAgRmlyc3Qgc2VlIGlmIGFueSBvZiB0aGVtCi0JIGhhdmUgZXh0cmFjdGlvbiBmdW5jdGlvbnMsIGFuZCwgaWYgdGhleSBkbywgbWFrZSBzdXJlIHRoZQotCSBpbnN0cnVjdGlvbiBpcyB2YWxpZC4gICovCi0gICAgICB7Ci0gICAgICAgIGludCBpbnZhbGlkID0gMDsKLSAgICAgICAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQotCSAgewotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQgPSBhbHBoYV9vcGVyYW5kcyArICpvcGluZGV4OwotCSAgICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKLQkgICAgICAoKm9wZXJhbmQtPmV4dHJhY3QpIChpbnNuLCAmaW52YWxpZCk7Ci0JICB9Ci0gICAgICAgIGlmIChpbnZhbGlkKQotCSAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFRoZSBpbnN0cnVjdGlvbiBpcyB2YWxpZC4gICovCi0gICAgICBnb3RvIGZvdW5kOwotICAgIH0KLQotICAvKiBObyBpbnN0cnVjdGlvbiBmb3VuZCAqLwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nICUjMDh4IiwgaW5zbik7Ci0gICAgCi0gIHJldHVybiA0OwotCi1mb3VuZDoKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wY29kZS0+bmFtZSk7Ci0gIGlmIChvcGNvZGUtPm9wZXJhbmRzWzBdICE9IDApCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdCIpOwotCi0gIC8qIE5vdyBleHRyYWN0IGFuZCBwcmludCB0aGUgb3BlcmFuZHMuICAqLwotICBuZWVkX2NvbW1hID0gMDsKLSAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICpvcGVyYW5kID0gYWxwaGFfb3BlcmFuZHMgKyAqb3BpbmRleDsKLSAgICAgIGludCB2YWx1ZTsKLQotICAgICAgLyogT3BlcmFuZHMgdGhhdCBhcmUgbWFya2VkIEZBS0UgYXJlIHNpbXBseSBpZ25vcmVkLiAgV2UKLQkgYWxyZWFkeSBtYWRlIHN1cmUgdGhhdCB0aGUgZXh0cmFjdCBmdW5jdGlvbiBjb25zaWRlcmVkCi0JIHRoZSBpbnN0cnVjdGlvbiB0byBiZSB2YWxpZC4gICovCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfRkFLRSkgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogRXh0cmFjdCB0aGUgdmFsdWUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgaWYgKG9wZXJhbmQtPmV4dHJhY3QpCi0JdmFsdWUgPSAoKm9wZXJhbmQtPmV4dHJhY3QpIChpbnNuLCAoaW50ICopIE5VTEwpOwotICAgICAgZWxzZQotCXsKLQkgIHZhbHVlID0gKGluc24gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9TSUdORUQpCi0JICAgIHsKLQkgICAgICBpbnQgc2lnbmJpdCA9IDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKTsKLQkgICAgICB2YWx1ZSA9ICh2YWx1ZSBeIHNpZ25iaXQpIC0gc2lnbmJpdDsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKG5lZWRfY29tbWEgJiYKLQkgICgob3BlcmFuZC0+ZmxhZ3MgJiAoQVhQX09QRVJBTkRfUEFSRU5TfEFYUF9PUEVSQU5EX0NPTU1BKSkKLQkgICAhPSBBWFBfT1BFUkFORF9QQVJFTlMpKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCX0KLSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1BBUkVOUykKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIigiKTsKLQotICAgICAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGZsYWdzLiAgKi8KLSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX0lSKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCByZWduYW1lc1t2YWx1ZV0pOwotICAgICAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9GUFIpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHJlZ25hbWVzW3ZhbHVlKzMyXSk7Ci0gICAgICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1JFTEFUSVZFKQotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAobWVtYWRkciArIDQgKyB2YWx1ZSwgaW5mbyk7Ci0gICAgICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1NJR05FRCkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgdmFsdWUpOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSN4IiwgdmFsdWUpOwotCi0gICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9QQVJFTlMpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7Ci0gICAgICBuZWVkX2NvbW1hID0gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDQ7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2FscGhhLW9wYy5jIGIvb3Bjb2Rlcy9hbHBoYS1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NlYWY3OS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FscGhhLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU0NiArMCwwIEBACi0vKiBhbHBoYS1vcGMuYyAtLSBBbHBoYSBBWFAgb3Bjb2RlIGxpc3QKLSAgIENvcHlyaWdodCAoYykgMTk5NiwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAY3lnbnVzLmNvbT4sCi0gICBwYXR0ZXJuZWQgYWZ0ZXIgdGhlIFBQQyBvcGNvZGUgaGFuZGxpbmcgd3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLSAgIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLSAgIHRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICAgMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLSAgIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotICAgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvYWxwaGEuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogVGhpcyBmaWxlIGhvbGRzIHRoZSBBbHBoYSBBWFAgb3Bjb2RlIHRhYmxlLiAgVGhlIG9wY29kZSB0YWJsZSBpbmNsdWRlcwotICAgYWxtb3N0IGFsbCBvZiB0aGUgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gbW5lbW9uaWNzLiAgVGhpcyBwZXJtaXRzIHRoZQotICAgZGlzYXNzZW1ibGVyIHRvIHVzZSB0aGVtLCBhbmQgc2ltcGxpZmllcyB0aGUgYXNzZW1ibGVyIGxvZ2ljLCBhdCB0aGUKLSAgIGNvc3Qgb2YgaW5jcmVhc2luZyB0aGUgdGFibGUgc2l6ZS4gIFRoZSB0YWJsZSBpcyBzdHJpY3RseSBjb25zdGFudAotICAgZGF0YSwgc28gdGhlIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIHB1dCBpdCBpbiB0aGUgLnRleHQgc2VjdGlvbi4KLQotICAgVGhpcyBmaWxlIGFsc28gaG9sZHMgdGhlIG9wZXJhbmQgdGFibGUuICBBbGwga25vd2xlZGdlIGFib3V0IGluc2VydGluZwotICAgb3BlcmFuZHMgaW50byBpbnN0cnVjdGlvbnMgYW5kIHZpY2UtdmVyc2EgaXMga2VwdCBpbiB0aGlzIGZpbGUuCi0KLSAgIFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGJhc2UgaW5zdHJ1Y3Rpb24gc2V0IHdhcyBjb21waWxlZCBmcm9tIHRoZQotICAgX0FscGhhIEFyY2hpdGVjdHVyZSBIYW5kYm9va18sIERpZ2l0YWwgT3JkZXIgTnVtYmVyIEVDLVFEMktCLVRFLAotICAgdmVyc2lvbiAyLgotCi0gICBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBwb3N0LWV2NSBhcmNoaXRlY3R1cmUgZXh0ZW5zaW9ucyBCV1gsIENJWCBhbmQKLSAgIE1BWCBjYW1lIGZyb20gdmVyc2lvbiAzIG9mIHRoaXMgc2FtZSBkb2N1bWVudCwgd2hpY2ggaXMgYWxzbyBhdmFpbGFibGUKLSAgIG9uLWxpbmUgYXQgaHR0cDovL2Z0cC5kaWdpdGFsLmNvbS9wdWIvRGlnaXRhbC9pbmZvL3NlbWljb25kdWN0b3IKLSAgIC9saXRlcmF0dXJlL2FscGhhaGIyLnBkZgotCi0gICBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBFVjQgUEFMY29kZSBpbnN0cnVjdGlvbnMgd2FzIGNvbXBpbGVkIGZyb20KLSAgIF9ERUNjaGlwIDIxMDY0IGFuZCBERUNjaGlwIDIxMDY0QSBBbHBoYSBBWFAgTWljcm9wcm9jZXNzb3JzIEhhcmR3YXJlCi0gICBSZWZlcmVuY2UgTWFudWFsXywgRGlnaXRhbCBPcmRlciBOdW1iZXIgRUMtUTlaVUEtVEUsIHByZWxpbWluYXJ5Ci0gICByZXZpc2lvbiBkYXRlZCBKdW5lIDE5OTQuCi0KLSAgIFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIEVWNSBQQUxjb2RlIGluc3RydWN0aW9ucyB3YXMgY29tcGlsZWQgZnJvbQotICAgX0FscGhhIDIxMTY0IE1pY3JvcHJvY2Vzc29yIEhhcmR3YXJlIFJlZmVyZW5jZSBNYW51YWxfLCBEaWdpdGFsCi0gICBPcmRlciBOdW1iZXIgRUMtUUFFUUItVEUsIHByZWxpbWluYXJ5IHJldmlzaW9uIGRhdGVkIEFwcmlsIDE5OTUuICAqLwotDAotLyogTG9jYWwgaW5zZXJ0aW9uIGFuZCBleHRyYWN0aW9uIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X3JiYSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfcmNhIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGluc2VydF96YSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfemIgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X3pjIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGluc2VydF9iZGlzcCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfamhpbnQgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X2V2Nmh3amhpbnQgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci0KLXN0YXRpYyBpbnQgZXh0cmFjdF9yYmEgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF9yY2EgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF96YSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotc3RhdGljIGludCBleHRyYWN0X3piIFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfemMgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF9iZGlzcCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotc3RhdGljIGludCBleHRyYWN0X2poaW50IFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfZXY2aHdqaGludCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgICovCi0KLWNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kIGFscGhhX29wZXJhbmRzW10gPQotewotICAvKiBUaGUgZmllbGRzIGFyZSBiaXRzLCBzaGlmdCwgaW5zZXJ0LCBleHRyYWN0LCBmbGFncyAqLwotICAvKiBUaGUgemVybyBpbmRleCBpcyB1c2VkIHRvIGluZGljYXRlIGVuZC1vZi1saXN0ICovCi0jZGVmaW5lIFVOVVNFRAkJMAotICB7IDAsIDAsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgcGxhaW4gaW50ZWdlciByZWdpc3RlciBmaWVsZHMgKi8KLSNkZWZpbmUgUkEJCShVTlVTRUQgKyAxKQotICB7IDUsIDIxLCAwLCBBWFBfT1BFUkFORF9JUiwgMCwgMCB9LAotI2RlZmluZSBSQgkJKFJBICsgMSkKLSAgeyA1LCAxNiwgMCwgQVhQX09QRVJBTkRfSVIsIDAsIDAgfSwKLSNkZWZpbmUgUkMJCShSQiArIDEpCi0gIHsgNSwgMCwgMCwgQVhQX09QRVJBTkRfSVIsIDAsIDAgfSwKLQotICAvKiBUaGUgcGxhaW4gZnAgcmVnaXN0ZXIgZmllbGRzICovCi0jZGVmaW5lIEZBCQkoUkMgKyAxKQotICB7IDUsIDIxLCAwLCBBWFBfT1BFUkFORF9GUFIsIDAsIDAgfSwKLSNkZWZpbmUgRkIJCShGQSArIDEpCi0gIHsgNSwgMTYsIDAsIEFYUF9PUEVSQU5EX0ZQUiwgMCwgMCB9LAotI2RlZmluZSBGQwkJKEZCICsgMSkKLSAgeyA1LCAwLCAwLCBBWFBfT1BFUkFORF9GUFIsIDAsIDAgfSwKLQotICAvKiBUaGUgaW50ZWdlciByZWdpc3RlcnMgd2hlbiB0aGV5IGFyZSBaRVJPICovCi0jZGVmaW5lIFpBCQkoRkMgKyAxKQotICB7IDUsIDIxLCAwLCBBWFBfT1BFUkFORF9GQUtFLCBpbnNlcnRfemEsIGV4dHJhY3RfemEgfSwKLSNkZWZpbmUgWkIJCShaQSArIDEpCi0gIHsgNSwgMTYsIDAsIEFYUF9PUEVSQU5EX0ZBS0UsIGluc2VydF96YiwgZXh0cmFjdF96YiB9LAotI2RlZmluZSBaQwkJKFpCICsgMSkKLSAgeyA1LCAwLCAwLCBBWFBfT1BFUkFORF9GQUtFLCBpbnNlcnRfemMsIGV4dHJhY3RfemMgfSwKLQotICAvKiBUaGUgUkIgZmllbGQgd2hlbiBpdCBuZWVkcyBwYXJlbnRoZXNlcyAqLwotI2RlZmluZSBQUkIJCShaQyArIDEpCi0gIHsgNSwgMTYsIDAsIEFYUF9PUEVSQU5EX0lSfEFYUF9PUEVSQU5EX1BBUkVOUywgMCwgMCB9LAotCi0gIC8qIFRoZSBSQiBmaWVsZCB3aGVuIGl0IG5lZWRzIHBhcmVudGhlc2VzIF9hbmRfIGEgcHJlY2VkaW5nIGNvbW1hICovCi0jZGVmaW5lIENQUkIJCShQUkIgKyAxKQotICB7IDUsIDE2LCAwLAotICAgIEFYUF9PUEVSQU5EX0lSfEFYUF9PUEVSQU5EX1BBUkVOU3xBWFBfT1BFUkFORF9DT01NQSwgMCwgMCB9LAotCi0gIC8qIFRoZSBSQiBmaWVsZCB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIFJBIGZpZWxkICovCi0jZGVmaW5lIFJCQQkJKENQUkIgKyAxKQotICB7IDUsIDE2LCAwLCBBWFBfT1BFUkFORF9GQUtFLCBpbnNlcnRfcmJhLCBleHRyYWN0X3JiYSB9LAotCi0gIC8qIFRoZSBSQyBmaWVsZCB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIFJCIGZpZWxkICovCi0jZGVmaW5lIFJDQQkJKFJCQSArIDEpCi0gIHsgNSwgMCwgMCwgQVhQX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3JjYSwgZXh0cmFjdF9yY2EgfSwKLQotICAvKiBUaGUgUkMgZmllbGQgd2hlbiBpdCBjYW4gKmRlZmF1bHQqIHRvIFJBICovCi0jZGVmaW5lIERSQzEJCShSQ0EgKyAxKQotICB7IDUsIDAsIDAsCi0gICAgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfREVGQVVMVF9GSVJTVCwgMCwgMCB9LAotCi0gIC8qIFRoZSBSQyBmaWVsZCB3aGVuIGl0IGNhbiAqZGVmYXVsdCogdG8gUkIgKi8KLSNkZWZpbmUgRFJDMgkJKERSQzEgKyAxKQotICB7IDUsIDAsIDAsCi0gICAgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfREVGQVVMVF9TRUNPTkQsIDAsIDAgfSwKLQotICAvKiBUaGUgRkMgZmllbGQgd2hlbiBpdCBjYW4gKmRlZmF1bHQqIHRvIFJBICovCi0jZGVmaW5lIERGQzEJCShEUkMyICsgMSkKLSAgeyA1LCAwLCAwLAotICAgIEFYUF9PUEVSQU5EX0ZQUnxBWFBfT1BFUkFORF9ERUZBVUxUX0ZJUlNULCAwLCAwIH0sCi0KLSAgLyogVGhlIEZDIGZpZWxkIHdoZW4gaXQgY2FuICpkZWZhdWx0KiB0byBSQiAqLwotI2RlZmluZSBERkMyCQkoREZDMSArIDEpCi0gIHsgNSwgMCwgMCwKLSAgICBBWFBfT1BFUkFORF9GUFJ8QVhQX09QRVJBTkRfREVGQVVMVF9TRUNPTkQsIDAsIDAgfSwKLQotICAvKiBUaGUgdW5zaWduZWQgOC1iaXQgbGl0ZXJhbCBvZiBPcGVyYXRlIGZvcm1hdCBpbnNucyAqLwotI2RlZmluZSBMSVQJCShERkMyICsgMSkKLSAgeyA4LCAxMywgLUxJVCwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgc2lnbmVkIDE2LWJpdCBkaXNwbGFjZW1lbnQgb2YgTWVtb3J5IGZvcm1hdCBpbnNucy4gIEZyb20gaGVyZQotICAgICB3ZSBjYW4ndCB0ZWxsIHdoYXQgcmVsb2NhdGlvbiBzaG91bGQgYmUgdXNlZCwgc28gZG9uJ3QgdXNlIGEgZGVmYXVsdC4gKi8KLSNkZWZpbmUgTURJU1AJCShMSVQgKyAxKQotICB7IDE2LCAwLCAtTURJU1AsIEFYUF9PUEVSQU5EX1NJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSBzaWduZWQgIjIzLWJpdCIgYWxpZ25lZCBkaXNwbGFjZW1lbnQgb2YgQnJhbmNoIGZvcm1hdCBpbnNucyAqLwotI2RlZmluZSBCRElTUAkJKE1ESVNQICsgMSkKLSAgeyAyMSwgMCwgQkZEX1JFTE9DXzIzX1BDUkVMX1MyLCAKLSAgICBBWFBfT1BFUkFORF9SRUxBVElWRSwgaW5zZXJ0X2JkaXNwLCBleHRyYWN0X2JkaXNwIH0sCi0KLSAgLyogVGhlIDI2LWJpdCBQQUxjb2RlIGZ1bmN0aW9uICovCi0jZGVmaW5lIFBBTEZOCQkoQkRJU1AgKyAxKQotICB7IDI2LCAwLCAtUEFMRk4sIEFYUF9PUEVSQU5EX1VOU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIG9wdGlvbmFsIHNpZ25lZCAiMTYtYml0IiBhbGlnbmVkIGRpc3BsYWNlbWVudCBvZiB0aGUgSk1QL0pTUiBoaW50ICovCi0jZGVmaW5lIEpNUEhJTlQJCShQQUxGTiArIDEpCi0gIHsgMTQsIDAsIEJGRF9SRUxPQ19BTFBIQV9ISU5ULAotICAgIEFYUF9PUEVSQU5EX1JFTEFUSVZFfEFYUF9PUEVSQU5EX0RFRkFVTFRfWkVST3xBWFBfT1BFUkFORF9OT09WRVJGTE9XLAotICAgIGluc2VydF9qaGludCwgZXh0cmFjdF9qaGludCB9LAotCi0gIC8qIFRoZSBvcHRpb25hbCBoaW50IHRvIFJFVC9KU1JfQ09ST1VUSU5FICovCi0jZGVmaW5lIFJFVEhJTlQJCShKTVBISU5UICsgMSkKLSAgeyAxNCwgMCwgLVJFVEhJTlQsCi0gICAgQVhQX09QRVJBTkRfVU5TSUdORUR8QVhQX09QRVJBTkRfREVGQVVMVF9aRVJPLCAwLCAwIH0sCi0KLSAgLyogVGhlIDEyLWJpdCBkaXNwbGFjZW1lbnQgZm9yIHRoZSBldls0Nl0gaHdfe2xkLHN0fSAocGFsMWIvcGFsMWYpIGluc25zICovCi0jZGVmaW5lIEVWNEhXRElTUAkoUkVUSElOVCArIDEpCi0jZGVmaW5lIEVWNkhXRElTUAkoRVY0SFdESVNQKQotICB7IDEyLCAwLCAtRVY0SFdESVNQLCBBWFBfT1BFUkFORF9TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgNS1iaXQgaW5kZXggZm9yIHRoZSBldjQgaHdfbVtmdF1wciAocGFsMTkvcGFsMWQpIGluc25zICovCi0jZGVmaW5lIEVWNEhXSU5ERVgJKEVWNEhXRElTUCArIDEpCi0gIHsgNSwgMCwgLUVWNEhXSU5ERVgsIEFYUF9PUEVSQU5EX1VOU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIDgtYml0IGluZGV4IGZvciB0aGUgb2RkbHkgdW5xdWFsaWZpZWQgaHdfbVt0Zl1wciBpbnNucwotICAgICB0aGF0IG9jY3VyIGluIERFQyBQQUxjb2RlLiAgKi8KLSNkZWZpbmUgRVY0RVhUSFdJTkRFWAkoRVY0SFdJTkRFWCArIDEpCi0gIHsgOCwgMCwgLUVWNEVYVEhXSU5ERVgsIEFYUF9PUEVSQU5EX1VOU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIDEwLWJpdCBkaXNwbGFjZW1lbnQgZm9yIHRoZSBldjUgaHdfe2xkLHN0fSAocGFsMWIvcGFsMWYpIGluc25zICovCi0jZGVmaW5lIEVWNUhXRElTUAkoRVY0RVhUSFdJTkRFWCArIDEpCi0gIHsgMTAsIDAsIC1FVjVIV0RJU1AsIEFYUF9PUEVSQU5EX1NJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSAxNi1iaXQgaW5kZXggZm9yIHRoZSBldjUgaHdfbVtmdF1wciAocGFsMTkvcGFsMWQpIGluc25zICovCi0jZGVmaW5lIEVWNUhXSU5ERVgJKEVWNUhXRElTUCArIDEpCi0gIHsgMTYsIDAsIC1FVjVIV0lOREVYLCBBWFBfT1BFUkFORF9VTlNJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSAxNi1iaXQgY29tYmluZWQgaW5kZXgvc2NvcmVib2FyZCBtYXNrIGZvciB0aGUgZXY2Ci0gICAgIGh3X21bZnRdcHIgKHBhbDE5L3BhbDFkKSBpbnNucyAqLwotI2RlZmluZSBFVjZIV0lOREVYCShFVjVIV0lOREVYICsgMSkKLSAgeyAxNiwgMCwgLUVWNkhXSU5ERVgsIEFYUF9PUEVSQU5EX1VOU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIDEzLWJpdCBicmFuY2ggaGludCBmb3IgdGhlIGV2NiBod19qbXAvanNyIChwYWwxZSkgaW5zbiAqLwotI2RlZmluZSBFVjZIV0pNUEhJTlQJKEVWNkhXSU5ERVgrIDEpCi0gIHsgOCwgMCwgLUVWNkhXSk1QSElOVCwKLSAgICBBWFBfT1BFUkFORF9SRUxBVElWRXxBWFBfT1BFUkFORF9ERUZBVUxUX1pFUk98QVhQX09QRVJBTkRfTk9PVkVSRkxPVywKLSAgICBpbnNlcnRfZXY2aHdqaGludCwgZXh0cmFjdF9ldjZod2poaW50IH0KLX07Ci0KLWNvbnN0IGludCBhbHBoYV9udW1fb3BlcmFuZHMgPSBzaXplb2YoYWxwaGFfb3BlcmFuZHMpL3NpemVvZigqYWxwaGFfb3BlcmFuZHMpOwotCi0vKiBUaGUgUkIgZmllbGQgd2hlbiBpdCBpcyB0aGUgc2FtZSBhcyB0aGUgUkEgZmllbGQgaW4gdGhlIHNhbWUgaW5zbi4KLSAgIFRoaXMgb3BlcmFuZCBpcyBtYXJrZWQgZmFrZS4gIFRoZSBpbnNlcnRpb24gZnVuY3Rpb24ganVzdCBjb3BpZXMKLSAgIHRoZSBSQSBmaWVsZCBpbnRvIHRoZSBSQiBmaWVsZCwgYW5kIHRoZSBleHRyYWN0aW9uIGZ1bmN0aW9uIGp1c3QKLSAgIGNoZWNrcyB0aGF0IHRoZSBmaWVsZHMgYXJlIHRoZSBzYW1lLiAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X3JiYShpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKCgoaW5zbiA+PiAyMSkgJiAweDFmKSA8PCAxNik7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfcmJhKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gPj4gMjEpICYgMHgxZikgIT0gKChpbnNuID4+IDE2KSAmIDB4MWYpKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogVGhlIHNhbWUgZm9yIHRoZSBSQyBmaWVsZCAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X3JjYShpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKChpbnNuID4+IDIxKSAmIDB4MWYpOwotfQotCi1zdGF0aWMgaW50Ci1leHRyYWN0X3JjYShpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgKChpbnNuID4+IDIxKSAmIDB4MWYpICE9IChpbnNuICYgMHgxZikpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBGYWtlIGFyZ3VtZW50cyBpbiB3aGljaCB0aGUgcmVnaXN0ZXJzIG11c3QgYmUgc2V0IHRvIFpFUk8gKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF96YShpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKDMxIDw8IDIxKTsKLX0KLQotc3RhdGljIGludAotZXh0cmFjdF96YShpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTCAmJiAoKGluc24gPj4gMjEpICYgMHgxZikgIT0gMzEpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF96YihpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKDMxIDw8IDE2KTsKLX0KLQotc3RhdGljIGludAotZXh0cmFjdF96YihpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTCAmJiAoKGluc24gPj4gMTYpICYgMHgxZikgIT0gMzEpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF96YyhpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgMzE7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfemMoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwgJiYgKGluc24gJiAweDFmKSAhPSAzMSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIFRoZSBkaXNwbGFjZW1lbnQgZmllbGQgb2YgYSBCcmFuY2ggZm9ybWF0IGluc24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF9iZGlzcChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopTlVMTCAmJiAodmFsdWUgJiAzKSkKLSAgICAqZXJybXNnID0gXygiYnJhbmNoIG9wZXJhbmQgdW5hbGlnbmVkIik7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAvIDQpICYgMHgxRkZGRkYpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfYmRpc3AoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICByZXR1cm4gNCAqICgoKGluc24gJiAweDFGRkZGRikgXiAweDEwMDAwMCkgLSAweDEwMDAwMCk7Ci19Ci0KLQotLyogVGhlIGhpbnQgZmllbGQgb2YgYSBKTVAvSlNSIGluc24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF9qaGludChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopTlVMTCAmJiAodmFsdWUgJiAzKSkKLSAgICAqZXJybXNnID0gXygianVtcCBoaW50IHVuYWxpZ25lZCIpOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgLyA0KSAmIDB4M0ZGRik7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGludAotZXh0cmFjdF9qaGludChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIHJldHVybiA0ICogKCgoaW5zbiAmIDB4M0ZGRikgXiAweDIwMDApIC0gMHgyMDAwKTsKLX0KLQotLyogVGhlIGhpbnQgZmllbGQgb2YgYW4gRVY2IEhXX0pNUC9KU1IgaW5zbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X2V2Nmh3amhpbnQoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50IHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICoqKU5VTEwgJiYgKHZhbHVlICYgMykpCi0gICAgKmVycm1zZyA9IF8oImp1bXAgaGludCB1bmFsaWduZWQiKTsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlIC8gNCkgJiAweDFGRkYpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfZXY2aHdqaGludChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIHJldHVybiA0ICogKCgoaW5zbiAmIDB4MUZGRikgXiAweDEwMDApIC0gMHgxMDAwKTsKLX0KLQotDAotLyogTWFjcm9zIHVzZWQgdG8gZm9ybSBvcGNvZGVzICovCi0KLS8qIFRoZSBtYWluIG9wY29kZSAqLwotI2RlZmluZSBPUCh4KQkJKCgoeCkgJiAweDNGKSA8PCAyNikKLSNkZWZpbmUgT1BfTUFTSwkJMHhGQzAwMDAwMAotCi0vKiBCcmFuY2ggZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBCUkFfKG9vKQlPUChvbykKLSNkZWZpbmUgQlJBX01BU0sJT1BfTUFTSwotI2RlZmluZSBCUkEob28pCQlCUkFfKG9vKSwgQlJBX01BU0sKLQotLyogRmxvYXRpbmcgcG9pbnQgZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBGUF8ob28sZmZmKQkoT1Aob28pIHwgKCgoZmZmKSAmIDB4N0ZGKSA8PCA1KSkKLSNkZWZpbmUgRlBfTUFTSwkJKE9QX01BU0sgfCAweEZGRTApCi0jZGVmaW5lIEZQKG9vLGZmZikJRlBfKG9vLGZmZiksIEZQX01BU0sKLQotLyogTWVtb3J5IGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgTUVNXyhvbykJT1Aob28pCi0jZGVmaW5lIE1FTV9NQVNLCU9QX01BU0sKLSNkZWZpbmUgTUVNKG9vKQkJTUVNXyhvbyksIE1FTV9NQVNLCi0KLS8qIE1lbW9yeS9GdW5jIENvZGUgZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBNRkNfKG9vLGZmZmYpCShPUChvbykgfCAoKGZmZmYpICYgMHhGRkZGKSkKLSNkZWZpbmUgTUZDX01BU0sJKE9QX01BU0sgfCAweEZGRkYpCi0jZGVmaW5lIE1GQyhvbyxmZmZmKQlNRkNfKG9vLGZmZmYpLCBNRkNfTUFTSwotCi0vKiBNZW1vcnkvQnJhbmNoIGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgTUJSXyhvbyxoKQkoT1Aob28pIHwgKCgoaCkgJiAzKSA8PCAxNCkpCi0jZGVmaW5lIE1CUl9NQVNLCShPUF9NQVNLIHwgMHhDMDAwKQotI2RlZmluZSBNQlIob28saCkJTUJSXyhvbyxoKSwgTUJSX01BU0sKLQotLyogT3BlcmF0ZSBmb3JtYXQgaW5zdHJ1Y3Rpb25zLiAgVGhlIE9QUkwgdmFyaWFudCBzcGVjaWZpZXMgYQotICAgbGl0ZXJhbCBzZWNvbmQgYXJndW1lbnQuICovCi0jZGVmaW5lIE9QUl8ob28sZmYpCShPUChvbykgfCAoKChmZikgJiAweDdGKSA8PCA1KSkKLSNkZWZpbmUgT1BSTF8ob28sZmYpCShPUFJfKChvbyksKGZmKSkgfCAweDEwMDApCi0jZGVmaW5lIE9QUl9NQVNLCShPUF9NQVNLIHwgMHgxRkUwKQotI2RlZmluZSBPUFIob28sZmYpCU9QUl8ob28sZmYpLCBPUFJfTUFTSwotI2RlZmluZSBPUFJMKG9vLGZmKQlPUFJMXyhvbyxmZiksIE9QUl9NQVNLCi0KLS8qIEdlbmVyaWMgUEFMY29kZSBmb3JtYXQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFBDRF8ob28pCU9QKG9vKQotI2RlZmluZSBQQ0RfTUFTSwlPUF9NQVNLCi0jZGVmaW5lIFBDRChvbykJCVBDRF8ob28pLCBQQ0RfTUFTSwotCi0vKiBTcGVjaWZpYyBQQUxjb2RlIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBTUENEXyhvbyxmZmZmKQkoT1Aob28pIHwgKChmZmZmKSAmIDB4M0ZGRkZGRikpCi0jZGVmaW5lIFNQQ0RfTUFTSwkweEZGRkZGRkZGCi0jZGVmaW5lIFNQQ0Qob28sZmZmZikJU1BDRF8ob28sZmZmZiksIFNQQ0RfTUFTSwotCi0vKiBIYXJkd2FyZSBtZW1vcnkgKGh3X3tsZCxzdH0pIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBFVjRIV01FTV8ob28sZikJKE9QKG9vKSB8ICgoKGYpICYgMHhGKSA8PCAxMikpCi0jZGVmaW5lIEVWNEhXTUVNX01BU0sJKE9QX01BU0sgfCAweEYwMDApCi0jZGVmaW5lIEVWNEhXTUVNKG9vLGYpCUVWNEhXTUVNXyhvbyxmKSwgRVY0SFdNRU1fTUFTSwotCi0jZGVmaW5lIEVWNUhXTUVNXyhvbyxmKQkoT1Aob28pIHwgKCgoZikgJiAweDNGKSA8PCAxMCkpCi0jZGVmaW5lIEVWNUhXTUVNX01BU0sJKE9QX01BU0sgfCAweEY4MDApCi0jZGVmaW5lIEVWNUhXTUVNKG9vLGYpCUVWNUhXTUVNXyhvbyxmKSwgRVY1SFdNRU1fTUFTSwotCi0jZGVmaW5lIEVWNkhXTUVNXyhvbyxmKQkoT1Aob28pIHwgKCgoZikgJiAweEYpIDw8IDEyKSkKLSNkZWZpbmUgRVY2SFdNRU1fTUFTSwkoT1BfTUFTSyB8IDB4RjAwMCkKLSNkZWZpbmUgRVY2SFdNRU0ob28sZikJRVY2SFdNRU1fKG9vLGYpLCBFVjZIV01FTV9NQVNLCi0KLSNkZWZpbmUgRVY2SFdNQlJfKG9vLGgpCShPUChvbykgfCAoKChoKSAmIDcpIDw8IDEzKSkKLSNkZWZpbmUgRVY2SFdNQlJfTUFTSwkoT1BfTUFTSyB8IDB4RTAwMCkKLSNkZWZpbmUgRVY2SFdNQlIob28saCkJRVY2SFdNQlJfKG9vLGgpLCBFVjZIV01CUl9NQVNLCi0KLS8qIEFiYnJldmlhdGlvbnMgZm9yIGluc3RydWN0aW9uIHN1YnNldHMuICAqLwotI2RlZmluZSBCQVNFCQkJQVhQX09QQ09ERV9CQVNFCi0jZGVmaW5lIEVWNAkJCUFYUF9PUENPREVfRVY0Ci0jZGVmaW5lIEVWNQkJCUFYUF9PUENPREVfRVY1Ci0jZGVmaW5lIEVWNgkJCUFYUF9PUENPREVfRVY2Ci0jZGVmaW5lIEJXWAkJCUFYUF9PUENPREVfQldYCi0jZGVmaW5lIENJWAkJCUFYUF9PUENPREVfQ0lYCi0jZGVmaW5lIE1BWAkJCUFYUF9PUENPREVfTUFYCi0KLS8qIENvbW1vbiBjb21iaW5hdGlvbnMgb2YgYXJndW1lbnRzICovCi0jZGVmaW5lIEFSR19OT05FCQl7IDAgfQotI2RlZmluZSBBUkdfQlJBCQkJeyBSQSwgQkRJU1AgfQotI2RlZmluZSBBUkdfRkJSQQkJeyBGQSwgQkRJU1AgfQotI2RlZmluZSBBUkdfRlAJCQl7IEZBLCBGQiwgREZDMSB9Ci0jZGVmaW5lIEFSR19GUFoxCQl7IFpBLCBGQiwgREZDMSB9Ci0jZGVmaW5lIEFSR19NRU0JCQl7IFJBLCBNRElTUCwgUFJCIH0KLSNkZWZpbmUgQVJHX0ZNRU0JCXsgRkEsIE1ESVNQLCBQUkIgfQotI2RlZmluZSBBUkdfT1BSCQkJeyBSQSwgUkIsIERSQzEgfQotI2RlZmluZSBBUkdfT1BSTAkJeyBSQSwgTElULCBEUkMxIH0KLSNkZWZpbmUgQVJHX09QUloxCQl7IFpBLCBSQiwgRFJDMSB9Ci0jZGVmaW5lIEFSR19PUFJMWjEJCXsgWkEsIExJVCwgUkMgfQotI2RlZmluZSBBUkdfUENECQkJeyBQQUxGTiB9Ci0jZGVmaW5lIEFSR19FVjRIV01FTQkJeyBSQSwgRVY0SFdESVNQLCBQUkIgfQotI2RlZmluZSBBUkdfRVY0SFdNUFIJCXsgUkEsIFJCQSwgRVY0SFdJTkRFWCB9Ci0jZGVmaW5lIEFSR19FVjVIV01FTQkJeyBSQSwgRVY1SFdESVNQLCBQUkIgfQotI2RlZmluZSBBUkdfRVY2SFdNRU0JCXsgUkEsIEVWNkhXRElTUCwgUFJCIH0KLQwKLS8qIFRoZSBvcGNvZGUgdGFibGUuCi0KLSAgIFRoZSBmb3JtYXQgb2YgdGhlIG9wY29kZSB0YWJsZSBpczoKLQotICAgTkFNRSBPUENPREUgTUFTSyB7IE9QRVJBTkRTIH0KLQotICAgTkFNRQkJaXMgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uLgotCi0gICBPUENPREUJaXMgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KLQotICAgTUFTSwkJaXMgdGhlIG9wY29kZSBtYXNrOyB0aGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgZGlzYXNzZW1ibGVyCi0gICAgICAgICAgICAJd2hpY2ggYml0cyBpbiB0aGUgYWN0dWFsIG9wY29kZSBtdXN0IG1hdGNoIE9QQ09ERS4KLQotICAgT1BFUkFORFMJaXMgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCi0KLSAgIFRoZSBwcmVjZWRpbmcgbWFjcm9zIG1lcmdlIHRoZSB0ZXh0IG9mIHRoZSBPUENPREUgYW5kIE1BU0sgZmllbGRzLgotCi0gICBUaGUgZGlzYXNzZW1ibGVyIHJlYWRzIHRoZSB0YWJsZSBpbiBvcmRlciBhbmQgcHJpbnRzIHRoZSBmaXJzdAotICAgaW5zdHJ1Y3Rpb24gd2hpY2ggbWF0Y2hlcywgc28gdGhpcyB0YWJsZSBpcyBzb3J0ZWQgdG8gcHV0IG1vcmUKLSAgIHNwZWNpZmljIGluc3RydWN0aW9ucyBiZWZvcmUgbW9yZSBnZW5lcmFsIGluc3RydWN0aW9ucy4KLQotICAgT3RoZXJ3aXNlLCBpdCBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIGFuZCBtaW5vciBmdW5jdGlvbiBjb2RlLgotCi0gICBUaGVyZSBhcmUgdGhyZWUgY2xhc3NlcyBvZiBub3QtcmVhbGx5LWluc3RydWN0aW9ucyBpbiB0aGlzIHRhYmxlOgotCi0gICBBTElBUwlpcyBhbm90aGVyIG5hbWUgZm9yIGFub3RoZXIgaW5zdHJ1Y3Rpb24uICBTb21lIG9mCi0JCXRoZXNlIGNvbWUgZnJvbSB0aGUgQXJjaGl0ZWN0dXJlIEhhbmRib29rLCBzb21lCi0JCWNvbWUgZnJvbSB0aGUgb3JpZ2luYWwgZ2FzIG9wY29kZSB0YWJsZXMuICBJbiBhbGwKLQkJY2FzZXMsIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBvcGNvZGUgaXMgdW5jaGFuZ2VkLgotCi0gICBQU0VVRE8JYSBzdHlsaXplZCBjb2RlIGZvcm0gZW5kb3JzZWQgYnkgQ2hhcHRlciBBLjQgb2YgdGhlCi0JCUFyY2hpdGVjdHVyZSBIYW5kYm9vay4KLQotICAgRVhUUkEJYSBzdHlsaXplZCBjb2RlIGZvcm0gZm91bmQgaW4gdGhlIG9yaWdpbmFsIGdhcyB0YWJsZXMuCi0KLSAgIEFuZCB0d28gYW5ub3RhdGlvbnM6Ci0KLSAgIEVWNTYgQlVUCW9wY29kZXMgdGhhdCBhcmUgb2ZmaWNpYWxseSBpbnRyb2R1Y2VkIGFzIG9mIHRoZSBldjU2LAotICAgCQlidXQgd2l0aCBkZWZpbmVkIHJlc3VsdHMgb24gcHJldmlvdXMgaW1wbGVtZW50YXRpb25zLgotCi0gICBFVjU2IFVOQQlvcGNvZGVzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGFzIG9mIHRoZSBldjU2IHdpdGgKLSAgIAkJcHJlc3VtYWJseSB1bmRlZmluZWQgcmVzdWx0cyBvbiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbnMKLQkJdGhhdCB3ZXJlIG5vdCBhc3NpZ25lZCB0byBhIHBhcnRpY3VsYXIgZXh0ZW5zaW9uLgotKi8KLQotY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSBhbHBoYV9vcGNvZGVzW10gPSB7Ci0gIHsgImhhbHQiLAkJU1BDRCgweDAwLDB4MDAwMCksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgImRyYWluYSIsCQlTUENEKDB4MDAsMHgwMDAyKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiYnB0IiwJCVNQQ0QoMHgwMCwweDAwODApLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJjYWxsc3lzIiwJCVNQQ0QoMHgwMCwweDAwODMpLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJjaG1rIiwgCQlTUENEKDB4MDAsMHgwMDgzKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiaW1iIiwJCVNQQ0QoMHgwMCwweDAwODYpLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJjYWxsX3BhbCIsCQlQQ0QoMHgwMCksIEJBU0UsIEFSR19QQ0QgfSwKLSAgeyAicGFsIiwJCVBDRCgweDAwKSwgQkFTRSwgQVJHX1BDRCB9LAkJLyogYWxpYXMgKi8KLQotICB7ICJsZGEiLAkJTUVNKDB4MDgpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgImxkYWgiLAkJTUVNKDB4MDkpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgImxkYnUiLAkJTUVNKDB4MEEpLCBCV1gsIEFSR19NRU0gfSwKLSAgeyAidW5vcCIsCQlNRU0oMHgwQiksIEJBU0UsIHsgWkEgfSB9LAkJLyogcHNldWRvICovCi0gIHsgImxkcV91IiwJCU1FTSgweDBCKSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJsZHd1IiwJCU1FTSgweDBDKSwgQldYLCBBUkdfTUVNIH0sCi0gIHsgInN0dyIsCQlNRU0oMHgwRCksIEJXWCwgQVJHX01FTSB9LAotICB7ICJzdGIiLAkJTUVNKDB4MEUpLCBCV1gsIEFSR19NRU0gfSwKLSAgeyAic3RxX3UiLAkJTUVNKDB4MEYpLCBCQVNFLCBBUkdfTUVNIH0sCi0KLSAgeyAic2V4dGwiLAkJT1BSKDB4MTAsMHgwMCksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic2V4dGwiLAkJT1BSTCgweDEwLDB4MDApLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJhZGRsIiwJCU9QUigweDEwLDB4MDApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImFkZGwiLAkJT1BSTCgweDEwLDB4MDApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzNGFkZGwiLAkJT1BSKDB4MTAsMHgwMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczRhZGRsIiwJCU9QUkwoMHgxMCwweDAyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibmVnbCIsCQlPUFIoMHgxMCwweDA5KSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJuZWdsIiwJCU9QUkwoMHgxMCwweDA5KSwgQkFTRSwgQVJHX09QUkxaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VibCIsCQlPUFIoMHgxMCwweDA5KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzdWJsIiwJCU9QUkwoMHgxMCwweDA5KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiczRzdWJsIiwJCU9QUigweDEwLDB4MEIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInM0c3VibCIsCQlPUFJMKDB4MTAsMHgwQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcGJnZSIsCQlPUFIoMHgxMCwweDBGKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXBiZ2UiLAkJT1BSTCgweDEwLDB4MEYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzOGFkZGwiLAkJT1BSKDB4MTAsMHgxMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczhhZGRsIiwJCU9QUkwoMHgxMCwweDEyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiczhzdWJsIiwJCU9QUigweDEwLDB4MUIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInM4c3VibCIsCQlPUFJMKDB4MTAsMHgxQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcHVsdCIsCQlPUFIoMHgxMCwweDFEKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXB1bHQiLAkJT1BSTCgweDEwLDB4MUQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJhZGRxIiwJCU9QUigweDEwLDB4MjApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImFkZHEiLAkJT1BSTCgweDEwLDB4MjApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzNGFkZHEiLAkJT1BSKDB4MTAsMHgyMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczRhZGRxIiwJCU9QUkwoMHgxMCwweDIyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibmVncSIsIAkJT1BSKDB4MTAsMHgyOSksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAibmVncSIsIAkJT1BSTCgweDEwLDB4MjkpLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJxIiwJCU9QUigweDEwLDB4MjkpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInN1YnEiLAkJT1BSTCgweDEwLDB4MjkpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzNHN1YnEiLAkJT1BSKDB4MTAsMHgyQiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczRzdWJxIiwJCU9QUkwoMHgxMCwweDJCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21wZXEiLAkJT1BSKDB4MTAsMHgyRCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21wZXEiLAkJT1BSTCgweDEwLDB4MkQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzOGFkZHEiLAkJT1BSKDB4MTAsMHgzMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczhhZGRxIiwJCU9QUkwoMHgxMCwweDMyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiczhzdWJxIiwJCU9QUigweDEwLDB4M0IpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInM4c3VicSIsCQlPUFJMKDB4MTAsMHgzQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcHVsZSIsCQlPUFIoMHgxMCwweDNEKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXB1bGUiLAkJT1BSTCgweDEwLDB4M0QpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJhZGRsL3YiLAkJT1BSKDB4MTAsMHg0MCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiYWRkbC92IiwJCU9QUkwoMHgxMCwweDQwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibmVnbC92IiwJCU9QUigweDEwLDB4NDkpLCBCQVNFLCBBUkdfT1BSWjEgfSwJLyogcHNldWRvICovCi0gIHsgIm5lZ2wvdiIsCQlPUFJMKDB4MTAsMHg0OSksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YmwvdiIsCQlPUFIoMHgxMCwweDQ5KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzdWJsL3YiLAkJT1BSTCgweDEwLDB4NDkpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbXBsdCIsCQlPUFIoMHgxMCwweDREKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXBsdCIsCQlPUFJMKDB4MTAsMHg0RCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImFkZHEvdiIsCQlPUFIoMHgxMCwweDYwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJhZGRxL3YiLAkJT1BSTCgweDEwLDB4NjApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJuZWdxL3YiLAkJT1BSKDB4MTAsMHg2OSksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAibmVncS92IiwJCU9QUkwoMHgxMCwweDY5KSwgQkFTRSwgQVJHX09QUkxaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VicS92IiwJCU9QUigweDEwLDB4NjkpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInN1YnEvdiIsCQlPUFJMKDB4MTAsMHg2OSksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcGxlIiwJCU9QUigweDEwLDB4NkQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtcGxlIiwJCU9QUkwoMHgxMCwweDZEKSwgQkFTRSwgQVJHX09QUkwgfSwKLQotICB7ICJhbmQiLAkJT1BSKDB4MTEsMHgwMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiYW5kIiwJCU9QUkwoMHgxMSwweDAwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiYW5kbm90IiwJCU9QUigweDExLDB4MDgpLCBCQVNFLCBBUkdfT1BSIH0sCS8qIGFsaWFzICovCi0gIHsgImFuZG5vdCIsCQlPUFJMKDB4MTEsMHgwOCksIEJBU0UsIEFSR19PUFJMIH0sCS8qIGFsaWFzICovCi0gIHsgImJpYyIsCQlPUFIoMHgxMSwweDA4KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJiaWMiLAkJT1BSTCgweDExLDB4MDgpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92bGJzIiwJCU9QUigweDExLDB4MTQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZsYnMiLAkJT1BSTCgweDExLDB4MTQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92bGJjIiwJCU9QUigweDExLDB4MTYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZsYmMiLAkJT1BSTCgweDExLDB4MTYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJub3AiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIHsgWkEsIFpCLCBaQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJjbHIiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIHsgWkEsIFpCLCBSQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJtb3YiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIHsgWkEsIFJCLCBSQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJtb3YiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIHsgUkEsIFJCQSwgUkMgfSB9LCAvKiBwc2V1ZG8gKi8KLSAgeyAibW92IiwJCU9QUkwoMHgxMSwweDIwKSwgQkFTRSwgeyBaQSwgTElULCBSQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJvciIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgQVJHX09QUiB9LAkvKiBhbGlhcyAqLwotICB7ICJvciIsCQlPUFJMKDB4MTEsMHgyMCksIEJBU0UsIEFSR19PUFJMIH0sCS8qIGFsaWFzICovCi0gIHsgImJpcyIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJiaXMiLAkJT1BSTCgweDExLDB4MjApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92ZXEiLAkJT1BSKDB4MTEsMHgyNCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdmVxIiwJCU9QUkwoMHgxMSwweDI0KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21vdm5lIiwJCU9QUigweDExLDB4MjYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZuZSIsCQlPUFJMKDB4MTEsMHgyNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm5vdCIsCQlPUFIoMHgxMSwweDI4KSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJub3QiLAkJT1BSTCgweDExLDB4MjgpLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJvcm5vdCIsCQlPUFIoMHgxMSwweDI4KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJvcm5vdCIsCQlPUFJMKDB4MTEsMHgyOCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInhvciIsCQlPUFIoMHgxMSwweDQwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJ4b3IiLAkJT1BSTCgweDExLDB4NDApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92bHQiLAkJT1BSKDB4MTEsMHg0NCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdmx0IiwJCU9QUkwoMHgxMSwweDQ0KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21vdmdlIiwJCU9QUigweDExLDB4NDYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZnZSIsCQlPUFJMKDB4MTEsMHg0NiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImVxdiIsCQlPUFIoMHgxMSwweDQ4KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJlcXYiLAkJT1BSTCgweDExLDB4NDgpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJ4b3Jub3QiLAkJT1BSKDB4MTEsMHg0OCksIEJBU0UsIEFSR19PUFIgfSwJLyogYWxpYXMgKi8KLSAgeyAieG9ybm90IiwJCU9QUkwoMHgxMSwweDQ4KSwgQkFTRSwgQVJHX09QUkwgfSwJLyogYWxpYXMgKi8KLSAgeyAiYW1hc2siLAkJT1BSKDB4MTEsMHg2MSksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBldjU2IGJ1dCAqLwotICB7ICJhbWFzayIsCQlPUFJMKDB4MTEsMHg2MSksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogZXY1NiBidXQgKi8KLSAgeyAiY21vdmxlIiwJCU9QUigweDExLDB4NjQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZsZSIsCQlPUFJMKDB4MTEsMHg2NCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtb3ZndCIsCQlPUFIoMHgxMSwweDY2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbW92Z3QiLAkJT1BSTCgweDExLDB4NjYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJpbXBsdmVyIiwJCU9QUkxfKDB4MTEsMHg2Qyl8KDMxPDwyMSl8KDE8PDEzKSwKLSAgICAJCQkweEZGRkZGRkUwLCBCQVNFLCB7IFJDIH0gfSwJCS8qIGV2NTYgYnV0ICovCi0KLSAgeyAibXNrYmwiLAkJT1BSKDB4MTIsMHgwMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXNrYmwiLAkJT1BSTCgweDEyLDB4MDIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHRibCIsCQlPUFIoMHgxMiwweDA2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHRibCIsCQlPUFJMKDB4MTIsMHgwNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc2JsIiwJCU9QUigweDEyLDB4MEIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc2JsIiwJCU9QUkwoMHgxMiwweDBCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXNrd2wiLAkJT1BSKDB4MTIsMHgxMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXNrd2wiLAkJT1BSTCgweDEyLDB4MTIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHR3bCIsCQlPUFIoMHgxMiwweDE2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHR3bCIsCQlPUFJMKDB4MTIsMHgxNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc3dsIiwJCU9QUigweDEyLDB4MUIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc3dsIiwJCU9QUkwoMHgxMiwweDFCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXNrbGwiLAkJT1BSKDB4MTIsMHgyMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXNrbGwiLAkJT1BSTCgweDEyLDB4MjIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHRsbCIsCQlPUFIoMHgxMiwweDI2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHRsbCIsCQlPUFJMKDB4MTIsMHgyNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc2xsIiwJCU9QUigweDEyLDB4MkIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc2xsIiwJCU9QUkwoMHgxMiwweDJCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiemFwIiwJCU9QUigweDEyLDB4MzApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInphcCIsCQlPUFJMKDB4MTIsMHgzMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInphcG5vdCIsCQlPUFIoMHgxMiwweDMxKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJ6YXBub3QiLAkJT1BSTCgweDEyLDB4MzEpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2txbCIsCQlPUFIoMHgxMiwweDMyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2txbCIsCQlPUFJMKDB4MTIsMHgzMiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInNybCIsCQlPUFIoMHgxMiwweDM0KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzcmwiLAkJT1BSTCgweDEyLDB4MzQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHRxbCIsCQlPUFIoMHgxMiwweDM2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHRxbCIsCQlPUFJMKDB4MTIsMHgzNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInNsbCIsCQlPUFIoMHgxMiwweDM5KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzbGwiLAkJT1BSTCgweDEyLDB4MzkpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJpbnNxbCIsCQlPUFIoMHgxMiwweDNCKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJpbnNxbCIsCQlPUFJMKDB4MTIsMHgzQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInNyYSIsCQlPUFIoMHgxMiwweDNDKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzcmEiLAkJT1BSTCgweDEyLDB4M0MpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2t3aCIsCQlPUFIoMHgxMiwweDUyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2t3aCIsCQlPUFJMKDB4MTIsMHg1MiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc3doIiwJCU9QUigweDEyLDB4NTcpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc3doIiwJCU9QUkwoMHgxMiwweDU3KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXh0d2giLAkJT1BSKDB4MTIsMHg1QSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiZXh0d2giLAkJT1BSTCgweDEyLDB4NUEpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2tsaCIsCQlPUFIoMHgxMiwweDYyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2tsaCIsCQlPUFJMKDB4MTIsMHg2MiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc2xoIiwJCU9QUigweDEyLDB4NjcpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc2xoIiwJCU9QUkwoMHgxMiwweDY3KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXh0bGgiLAkJT1BSKDB4MTIsMHg2QSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiZXh0bGgiLAkJT1BSTCgweDEyLDB4NkEpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2txaCIsCQlPUFIoMHgxMiwweDcyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2txaCIsCQlPUFJMKDB4MTIsMHg3MiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc3FoIiwJCU9QUigweDEyLDB4NzcpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc3FoIiwJCU9QUkwoMHgxMiwweDc3KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXh0cWgiLAkJT1BSKDB4MTIsMHg3QSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiZXh0cWgiLAkJT1BSTCgweDEyLDB4N0EpLCBCQVNFLCBBUkdfT1BSTCB9LAotCi0gIHsgIm11bGwiLAkJT1BSKDB4MTMsMHgwMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXVsbCIsCQlPUFJMKDB4MTMsMHgwMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm11bHEiLAkJT1BSKDB4MTMsMHgyMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXVscSIsCQlPUFJMKDB4MTMsMHgyMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInVtdWxoIiwJCU9QUigweDEzLDB4MzApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInVtdWxoIiwJCU9QUkwoMHgxMywweDMwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXVsbC92IiwJCU9QUigweDEzLDB4NDApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm11bGwvdiIsCQlPUFJMKDB4MTMsMHg0MCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm11bHEvdiIsCQlPUFIoMHgxMywweDYwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtdWxxL3YiLAkJT1BSTCgweDEzLDB4NjApLCBCQVNFLCBBUkdfT1BSTCB9LAotCi0gIHsgIml0b2ZzIiwJCUZQKDB4MTQsMHgwMDQpLCBDSVgsIHsgUkEsIFpCLCBGQyB9IH0sCi0gIHsgInNxcnRmL2MiLAkJRlAoMHgxNCwweDAwQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvYyIsCQlGUCgweDE0LDB4MDBCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJpdG9mZiIsCQlGUCgweDE0LDB4MDE0KSwgQ0lYLCB7IFJBLCBaQiwgRkMgfSB9LAotICB7ICJpdG9mdCIsCQlGUCgweDE0LDB4MDI0KSwgQ0lYLCB7IFJBLCBaQiwgRkMgfSB9LAotICB7ICJzcXJ0Zy9jIiwJCUZQKDB4MTQsMHgwMkEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L2MiLAkJRlAoMHgxNCwweDAyQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvbSIsCQlGUCgweDE0LDB4MDRCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9tIiwJCUZQKDB4MTQsMHgwNkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmIiwJCUZQKDB4MTQsMHgwOEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzIiwJCUZQKDB4MTQsMHgwOEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRnIiwJCUZQKDB4MTQsMHgwQUEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0IiwJCUZQKDB4MTQsMHgwQUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL2QiLAkJRlAoMHgxNCwweDBDQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvZCIsCQlGUCgweDE0LDB4MEVCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi91YyIsCQlGUCgweDE0LDB4MTBBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy91YyIsCQlGUCgweDE0LDB4MTBCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zy91YyIsCQlGUCgweDE0LDB4MTJBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC91YyIsCQlGUCgweDE0LDB4MTJCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy91bSIsCQlGUCgweDE0LDB4MTRCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC91bSIsCQlGUCgweDE0LDB4MTZCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi91IiwJCUZQKDB4MTQsMHgxOEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3UiLAkJRlAoMHgxNCwweDE4QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGcvdSIsCQlGUCgweDE0LDB4MUFBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC91IiwJCUZQKDB4MTQsMHgxQUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3VkIiwJCUZQKDB4MTQsMHgxQ0IpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3VkIiwJCUZQKDB4MTQsMHgxRUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmL3NjIiwJCUZQKDB4MTQsMHg0MEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRnL3NjIiwJCUZQKDB4MTQsMHg0MkEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmL3MiLAkJRlAoMHgxNCwweDQ4QSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGcvcyIsCQlGUCgweDE0LDB4NEFBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi9zdWMiLAlGUCgweDE0LDB4NTBBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdWMiLAlGUCgweDE0LDB4NTBCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zy9zdWMiLAlGUCgweDE0LDB4NTJBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdWMiLAlGUCgweDE0LDB4NTJCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdW0iLAlGUCgweDE0LDB4NTRCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdW0iLAlGUCgweDE0LDB4NTZCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi9zdSIsCQlGUCgweDE0LDB4NThBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdSIsCQlGUCgweDE0LDB4NThCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zy9zdSIsCQlGUCgweDE0LDB4NUFBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdSIsCQlGUCgweDE0LDB4NUFCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdWQiLAlGUCgweDE0LDB4NUNCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdWQiLAlGUCgweDE0LDB4NUVCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdWljIiwJRlAoMHgxNCwweDcwQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvc3VpYyIsCUZQKDB4MTQsMHg3MkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3N1aW0iLAlGUCgweDE0LDB4NzRCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdWltIiwJRlAoMHgxNCwweDc2QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvc3VpIiwJRlAoMHgxNCwweDc4QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvc3VpIiwJRlAoMHgxNCwweDdBQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvc3VpZCIsCUZQKDB4MTQsMHg3Q0IpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3N1aWQiLAlGUCgweDE0LDB4N0VCKSwgQ0lYLCBBUkdfRlBaMSB9LAotCi0gIHsgImFkZGYvYyIsCQlGUCgweDE1LDB4MDAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmYvYyIsCQlGUCgweDE1LDB4MDAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvYyIsCQlGUCgweDE1LDB4MDAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvYyIsCQlGUCgweDE1LDB4MDAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGRnL2MiLAkJRlAoMHgxNSwweDAxRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvYyIsCQlGUCgweDE1LDB4MDIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmcvYyIsCQlGUCgweDE1LDB4MDIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGcvYyIsCQlGUCgweDE1LDB4MDIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvYyIsCQlGUCgweDE1LDB4MDIzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL2MiLAkJRlAoMHgxNSwweDAyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkL2MiLAkJRlAoMHgxNSwweDAyRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL2MiLAkJRlAoMHgxNSwweDAyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFmL2MiLAkJRlAoMHgxNSwweDAzQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFnL2MiLAkJRlAoMHgxNSwweDAzRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYiLAkJRlAoMHgxNSwweDA4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdmIiwJCUZQKDB4MTUsMHgwODEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3ViZiIsCQlGUCgweDE1LDB4MDgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYiLAkJRlAoMHgxNSwweDA4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmIiwJCUZQKDB4MTUsMHgwODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGciLAkJRlAoMHgxNSwweDA5RSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGciLAkJRlAoMHgxNSwweDBBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdnIiwJCUZQKDB4MTUsMHgwQTEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3ViZyIsCQlGUCgweDE1LDB4MEExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGciLAkJRlAoMHgxNSwweDBBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnIiwJCUZQKDB4MTUsMHgwQTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2VxIiwJCUZQKDB4MTUsMHgwQTUpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2x0IiwJCUZQKDB4MTUsMHgwQTYpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2xlIiwJCUZQKDB4MTUsMHgwQTcpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0Z2YiLAkJRlAoMHgxNSwweDBBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkIiwJCUZQKDB4MTUsMHgwQUQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncSIsCQlGUCgweDE1LDB4MEFGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWYiLAkJRlAoMHgxNSwweDBCQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFnIiwJCUZQKDB4MTUsMHgwQkUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3VjIiwJCUZQKDB4MTUsMHgxMDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZi91YyIsCQlGUCgweDE1LDB4MTAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvdWMiLAkJRlAoMHgxNSwweDEwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3VjIiwJCUZQKDB4MTUsMHgxMDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGcvdWMiLAkJRlAoMHgxNSwweDExRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvdWMiLAkJRlAoMHgxNSwweDEyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJnL3VjIiwJCUZQKDB4MTUsMHgxMjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZy91YyIsCQlGUCgweDE1LDB4MTIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvdWMiLAkJRlAoMHgxNSwweDEyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi91YyIsCQlGUCgweDE1LDB4MTJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z2QvdWMiLAkJRlAoMHgxNSwweDEyRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL3ZjIiwJCUZQKDB4MTUsMHgxMkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3UiLAkJRlAoMHgxNSwweDE4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJmL3UiLAkJRlAoMHgxNSwweDE4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxmL3UiLAkJRlAoMHgxNSwweDE4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3UiLAkJRlAoMHgxNSwweDE4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy91IiwJCUZQKDB4MTUsMHgxOUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnL3UiLAkJRlAoMHgxNSwweDFBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJnL3UiLAkJRlAoMHgxNSwweDFBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3UiLAkJRlAoMHgxNSwweDFBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnL3UiLAkJRlAoMHgxNSwweDFBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi91IiwJCUZQKDB4MTUsMHgxQUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC91IiwJCUZQKDB4MTUsMHgxQUQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncS92IiwJCUZQKDB4MTUsMHgxQUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3NjIiwJCUZQKDB4MTUsMHg0MDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZi9zYyIsCQlGUCgweDE1LDB4NDAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvc2MiLAkJRlAoMHgxNSwweDQwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3NjIiwJCUZQKDB4MTUsMHg0MDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGcvc2MiLAkJRlAoMHgxNSwweDQxRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvc2MiLAkJRlAoMHgxNSwweDQyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJnL3NjIiwJCUZQKDB4MTUsMHg0MjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZy9zYyIsCQlGUCgweDE1LDB4NDIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvc2MiLAkJRlAoMHgxNSwweDQyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi9zYyIsCQlGUCgweDE1LDB4NDJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z2Qvc2MiLAkJRlAoMHgxNSwweDQyRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL3NjIiwJCUZQKDB4MTUsMHg0MkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3MiLAkJRlAoMHgxNSwweDQ4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdmL3MiLAkJRlAoMHgxNSwweDQ4MSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJmL3MiLAkJRlAoMHgxNSwweDQ4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxmL3MiLAkJRlAoMHgxNSwweDQ4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3MiLAkJRlAoMHgxNSwweDQ4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy9zIiwJCUZQKDB4MTUsMHg0OUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnL3MiLAkJRlAoMHgxNSwweDRBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdnL3MiLAkJRlAoMHgxNSwweDRBMSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJnL3MiLAkJRlAoMHgxNSwweDRBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3MiLAkJRlAoMHgxNSwweDRBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnL3MiLAkJRlAoMHgxNSwweDRBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXBnZXEvcyIsCQlGUCgweDE1LDB4NEE1KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcGdsdC9zIiwJCUZQKDB4MTUsMHg0QTYpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2xlL3MiLAkJRlAoMHgxNSwweDRBNyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi9zIiwJCUZQKDB4MTUsMHg0QUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC9zIiwJCUZQKDB4MTUsMHg0QUQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncS9zIiwJCUZQKDB4MTUsMHg0QUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3N1YyIsCQlGUCgweDE1LDB4NTAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmYvc3VjIiwJCUZQKDB4MTUsMHg1MDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZi9zdWMiLAkJRlAoMHgxNSwweDUwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3N1YyIsCQlGUCgweDE1LDB4NTAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGRnL3N1YyIsCUZQKDB4MTUsMHg1MUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnL3N1YyIsCQlGUCgweDE1LDB4NTIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1Ymcvc3VjIiwJCUZQKDB4MTUsMHg1MjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZy9zdWMiLAkJRlAoMHgxNSwweDUyMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnL3N1YyIsCQlGUCgweDE1LDB4NTIzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL3N1YyIsCUZQKDB4MTUsMHg1MkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC9zdWMiLAlGUCgweDE1LDB4NTJEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z3Evc3ZjIiwJRlAoMHgxNSwweDUyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYvc3UiLAkJRlAoMHgxNSwweDU4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJmL3N1IiwJCUZQKDB4MTUsMHg1ODEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZi9zdSIsCQlGUCgweDE1LDB4NTgyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvc3UiLAkJRlAoMHgxNSwweDU4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy9zdSIsCQlGUCgweDE1LDB4NTlFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZy9zdSIsCQlGUCgweDE1LDB4NUEwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1Ymcvc3UiLAkJRlAoMHgxNSwweDVBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3N1IiwJCUZQKDB4MTUsMHg1QTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zy9zdSIsCQlGUCgweDE1LDB4NUEzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL3N1IiwJCUZQKDB4MTUsMHg1QUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC9zdSIsCQlGUCgweDE1LDB4NUFEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z3Evc3YiLAkJRlAoMHgxNSwweDVBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0KLSAgeyAiYWRkcy9jIiwJCUZQKDB4MTYsMHgwMDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9jIiwJCUZQKDB4MTYsMHgwMDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9jIiwJCUZQKDB4MTYsMHgwMDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9jIiwJCUZQKDB4MTYsMHgwMDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9jIiwJCUZQKDB4MTYsMHgwMjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9jIiwJCUZQKDB4MTYsMHgwMjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9jIiwJCUZQKDB4MTYsMHgwMjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9jIiwJCUZQKDB4MTYsMHgwMjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvYyIsCQlGUCgweDE2LDB4MDJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvYyIsCQlGUCgweDE2LDB4MDJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvYyIsCQlGUCgweDE2LDB4MDNDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQvYyIsCQlGUCgweDE2LDB4MDNFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9tIiwJCUZQKDB4MTYsMHgwNDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9tIiwJCUZQKDB4MTYsMHgwNDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9tIiwJCUZQKDB4MTYsMHgwNDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9tIiwJCUZQKDB4MTYsMHgwNDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9tIiwJCUZQKDB4MTYsMHgwNjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9tIiwJCUZQKDB4MTYsMHgwNjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9tIiwJCUZQKDB4MTYsMHgwNjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9tIiwJCUZQKDB4MTYsMHgwNjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvbSIsCQlGUCgweDE2LDB4MDZDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvbSIsCQlGUCgweDE2LDB4MDZGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvbSIsCQlGUCgweDE2LDB4MDdDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQvbSIsCQlGUCgweDE2LDB4MDdFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcyIsCQlGUCgweDE2LDB4MDgwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ3MiLCAJCUZQKDB4MTYsMHgwODEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VicyIsCQlGUCgweDE2LDB4MDgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMiLAkJRlAoMHgxNiwweDA4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzIiwJCUZQKDB4MTYsMHgwODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdCIsCQlGUCgweDE2LDB4MEEwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ3QiLCAJCUZQKDB4MTYsMHgwQTEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VidCIsCQlGUCgweDE2LDB4MEExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQiLAkJRlAoMHgxNiwweDBBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0IiwJCUZQKDB4MTYsMHgwQTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdHVuIiwJCUZQKDB4MTYsMHgwQTQpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGVxIiwJCUZQKDB4MTYsMHgwQTUpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGx0IiwJCUZQKDB4MTYsMHgwQTYpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGxlIiwJCUZQKDB4MTYsMHgwQTcpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMiLAkJRlAoMHgxNiwweDBBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxIiwJCUZQKDB4MTYsMHgwQUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcyIsCQlGUCgweDE2LDB4MEJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQiLAkJRlAoMHgxNiwweDBCRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvZCIsCQlGUCgweDE2LDB4MEMwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvZCIsCQlGUCgweDE2LDB4MEMxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvZCIsCQlGUCgweDE2LDB4MEMyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvZCIsCQlGUCgweDE2LDB4MEMzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvZCIsCQlGUCgweDE2LDB4MEUwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvZCIsCQlGUCgweDE2LDB4MEUxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvZCIsCQlGUCgweDE2LDB4MEUyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvZCIsCQlGUCgweDE2LDB4MEUzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL2QiLAkJRlAoMHgxNiwweDBFQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL2QiLAkJRlAoMHgxNiwweDBFRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFzL2QiLAkJRlAoMHgxNiwweDBGQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHF0L2QiLAkJRlAoMHgxNiwweDBGRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvdWMiLAkJRlAoMHgxNiwweDEwMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3VjIiwJCUZQKDB4MTYsMHgxMDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy91YyIsCQlGUCgweDE2LDB4MTAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvdWMiLAkJRlAoMHgxNiwweDEwMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3VjIiwJCUZQKDB4MTYsMHgxMjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC91YyIsCQlGUCgweDE2LDB4MTIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvdWMiLAkJRlAoMHgxNiwweDEyMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3VjIiwJCUZQKDB4MTYsMHgxMjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvdWMiLAkJRlAoMHgxNiwweDEyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3ZjIiwJCUZQKDB4MTYsMHgxMkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3VtIiwJCUZQKDB4MTYsMHgxNDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy91bSIsCQlGUCgweDE2LDB4MTQxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvdW0iLAkJRlAoMHgxNiwweDE0MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3VtIiwJCUZQKDB4MTYsMHgxNDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC91bSIsCQlGUCgweDE2LDB4MTYwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvdW0iLAkJRlAoMHgxNiwweDE2MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3VtIiwJCUZQKDB4MTYsMHgxNjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC91bSIsCQlGUCgweDE2LDB4MTYzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3VtIiwJCUZQKDB4MTYsMHgxNkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS92bSIsCQlGUCgweDE2LDB4MTZGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy91IiwJCUZQKDB4MTYsMHgxODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy91IiwJCUZQKDB4MTYsMHgxODEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy91IiwJCUZQKDB4MTYsMHgxODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy91IiwJCUZQKDB4MTYsMHgxODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC91IiwJCUZQKDB4MTYsMHgxQTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC91IiwJCUZQKDB4MTYsMHgxQTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC91IiwJCUZQKDB4MTYsMHgxQTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC91IiwJCUZQKDB4MTYsMHgxQTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvdSIsCQlGUCgweDE2LDB4MUFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvdiIsCQlGUCgweDE2LDB4MUFGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy91ZCIsCQlGUCgweDE2LDB4MUMwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvdWQiLAkJRlAoMHgxNiwweDFDMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3VkIiwJCUZQKDB4MTYsMHgxQzIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy91ZCIsCQlGUCgweDE2LDB4MUMzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvdWQiLAkJRlAoMHgxNiwweDFFMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3VkIiwJCUZQKDB4MTYsMHgxRTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC91ZCIsCQlGUCgweDE2LDB4MUUyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvdWQiLAkJRlAoMHgxNiwweDFFMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy91ZCIsCQlGUCgweDE2LDB4MUVDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvdmQiLAkJRlAoMHgxNiwweDFFRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHN0IiwJCUZQKDB4MTYsMHgyQUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3N1YyIsCQlGUCgweDE2LDB4NTAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvc3VjIiwJCUZQKDB4MTYsMHg1MDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9zdWMiLAkJRlAoMHgxNiwweDUwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3N1YyIsCQlGUCgweDE2LDB4NTAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3VjIiwJCUZQKDB4MTYsMHg1MjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9zdWMiLAkJRlAoMHgxNiwweDUyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3N1YyIsCQlGUCgweDE2LDB4NTIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3VjIiwJCUZQKDB4MTYsMHg1MjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvc3VjIiwJRlAoMHgxNiwweDUyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2YyIsCUZQKDB4MTYsMHg1MkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3N1bSIsCQlGUCgweDE2LDB4NTQwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvc3VtIiwJCUZQKDB4MTYsMHg1NDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9zdW0iLAkJRlAoMHgxNiwweDU0MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3N1bSIsCQlGUCgweDE2LDB4NTQzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3VtIiwJCUZQKDB4MTYsMHg1NjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9zdW0iLAkJRlAoMHgxNiwweDU2MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3N1bSIsCQlGUCgweDE2LDB4NTYyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3VtIiwJCUZQKDB4MTYsMHg1NjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvc3VtIiwJRlAoMHgxNiwweDU2QyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2bSIsCUZQKDB4MTYsMHg1NkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3N1IiwJCUZQKDB4MTYsMHg1ODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVncy9zdSIsCQlGUCgweDE2LDB4NTgxKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YnMvc3UiLAkJRlAoMHgxNiwweDU4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1IiwJCUZQKDB4MTYsMHg1ODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdSIsCQlGUCgweDE2LDB4NTgzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3UiLAkJRlAoMHgxNiwweDVBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWd0L3N1IiwJCUZQKDB4MTYsMHg1QTEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VidC9zdSIsCQlGUCgweDE2LDB4NUExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3UiLAkJRlAoMHgxNiwweDVBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3N1IiwJCUZQKDB4MTYsMHg1QTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdHVuL3N1IiwJRlAoMHgxNiwweDVBNCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXB0ZXEvc3UiLAlGUCgweDE2LDB4NUE1KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcHRsdC9zdSIsCUZQKDB4MTYsMHg1QTYpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGxlL3N1IiwJRlAoMHgxNiwweDVBNyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdSIsCQlGUCgweDE2LDB4NUFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3YiLAkJRlAoMHgxNiwweDVBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VkIiwJCUZQKDB4MTYsMHg1QzApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWQiLAkJRlAoMHgxNiwweDVDMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1ZCIsCQlGUCgweDE2LDB4NUMyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VkIiwJCUZQKDB4MTYsMHg1QzMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWQiLAkJRlAoMHgxNiwweDVFMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1ZCIsCQlGUCgweDE2LDB4NUUxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VkIiwJCUZQKDB4MTYsMHg1RTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWQiLAkJRlAoMHgxNiwweDVFMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWQiLAlGUCgweDE2LDB4NUVDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3ZkIiwJRlAoMHgxNiwweDVFRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHN0L3MiLAkJRlAoMHgxNiwweDZBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VpYyIsCUZQKDB4MTYsMHg3MDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWljIiwJRlAoMHgxNiwweDcwMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1aWMiLAlGUCgweDE2LDB4NzAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VpYyIsCUZQKDB4MTYsMHg3MDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWljIiwJRlAoMHgxNiwweDcyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1aWMiLAlGUCgweDE2LDB4NzIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VpYyIsCUZQKDB4MTYsMHg3MjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWljIiwJRlAoMHgxNiwweDcyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWljIiwJRlAoMHgxNiwweDcyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2aWMiLAlGUCgweDE2LDB4NzJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvc3VpYyIsCUZQKDB4MTYsMHg3M0MpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9zdWljIiwJRlAoMHgxNiwweDczRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VpbSIsCUZQKDB4MTYsMHg3NDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWltIiwJRlAoMHgxNiwweDc0MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1aW0iLAlGUCgweDE2LDB4NzQyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VpbSIsCUZQKDB4MTYsMHg3NDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWltIiwJRlAoMHgxNiwweDc2MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1aW0iLAlGUCgweDE2LDB4NzYxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VpbSIsCUZQKDB4MTYsMHg3NjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWltIiwJRlAoMHgxNiwweDc2MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWltIiwJRlAoMHgxNiwweDc2QyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2aW0iLAlGUCgweDE2LDB4NzZGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvc3VpbSIsCUZQKDB4MTYsMHg3N0MpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9zdWltIiwJRlAoMHgxNiwweDc3RSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VpIiwJCUZQKDB4MTYsMHg3ODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVncy9zdWkiLCAJRlAoMHgxNiwweDc4MSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJzL3N1aSIsCQlGUCgweDE2LDB4NzgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvc3VpIiwJCUZQKDB4MTYsMHg3ODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdWkiLAkJRlAoMHgxNiwweDc4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3N1aSIsCQlGUCgweDE2LDB4N0EwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ3Qvc3VpIiwgCUZQKDB4MTYsMHg3QTEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VidC9zdWkiLAkJRlAoMHgxNiwweDdBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3N1aSIsCQlGUCgweDE2LDB4N0EyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3VpIiwJCUZQKDB4MTYsMHg3QTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvc3VpIiwJRlAoMHgxNiwweDdBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2aSIsCUZQKDB4MTYsMHg3QUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcy9zdWkiLAlGUCgweDE2LDB4N0JDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQvc3VpIiwJRlAoMHgxNiwweDdCRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VpZCIsCUZQKDB4MTYsMHg3QzApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWlkIiwJRlAoMHgxNiwweDdDMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1aWQiLAlGUCgweDE2LDB4N0MyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VpZCIsCUZQKDB4MTYsMHg3QzMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWlkIiwJRlAoMHgxNiwweDdFMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1aWQiLAlGUCgweDE2LDB4N0UxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VpZCIsCUZQKDB4MTYsMHg3RTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWlkIiwJRlAoMHgxNiwweDdFMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWlkIiwJRlAoMHgxNiwweDdFQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2aWQiLAlGUCgweDE2LDB4N0VGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvc3VpZCIsCUZQKDB4MTYsMHg3RkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9zdWlkIiwJRlAoMHgxNiwweDdGRSksIEJBU0UsIEFSR19GUFoxIH0sCi0KLSAgeyAiY3Z0bHEiLAkJRlAoMHgxNywweDAxMCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImZub3AiLAkJRlAoMHgxNywweDAyMCksIEJBU0UsIHsgWkEsIFpCLCBaQyB9IH0sCS8qIHBzZXVkbyAqLwotICB7ICJmY2xyIiwJCUZQKDB4MTcsMHgwMjApLCBCQVNFLCB7IFpBLCBaQiwgRkMgfSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAiZmFicyIsCQlGUCgweDE3LDB4MDIwKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgImZtb3YiLAkJRlAoMHgxNywweDAyMCksIEJBU0UsIHsgRkEsIFJCQSwgRkMgfSB9LCAvKiBwc2V1ZG8gKi8KLSAgeyAiY3B5cyIsCQlGUCgweDE3LDB4MDIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImZuZWciLAkJRlAoMHgxNywweDAyMSksIEJBU0UsIHsgRkEsIFJCQSwgRkMgfSB9LCAvKiBwc2V1ZG8gKi8KLSAgeyAiY3B5c24iLAkJRlAoMHgxNywweDAyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjcHlzZSIsCQlGUCgweDE3LDB4MDIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm10X2ZwY3IiLAkJRlAoMHgxNywweDAyNCksIEJBU0UsIHsgRkEsIFJCQSwgUkNBIH0gfSwKLSAgeyAibWZfZnBjciIsCQlGUCgweDE3LDB4MDI1KSwgQkFTRSwgeyBGQSwgUkJBLCBSQ0EgfSB9LAotICB7ICJmY21vdmVxIiwJCUZQKDB4MTcsMHgwMkEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZmNtb3ZuZSIsCQlGUCgweDE3LDB4MDJCKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImZjbW92bHQiLAkJRlAoMHgxNywweDAyQyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJmY21vdmdlIiwJCUZQKDB4MTcsMHgwMkQpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZmNtb3ZsZSIsCQlGUCgweDE3LDB4MDJFKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImZjbW92Z3QiLAkJRlAoMHgxNywweDAyRiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRxbCIsCQlGUCgweDE3LDB4MDMwKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWwvdiIsCQlGUCgweDE3LDB4MTMwKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWwvc3YiLAkJRlAoMHgxNywweDUzMCksIEJBU0UsIEFSR19GUFoxIH0sCi0KLSAgeyAidHJhcGIiLAkJTUZDKDB4MTgsMHgwMDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiZHJhaW50IiwJCU1GQygweDE4LDB4MDAwMCksIEJBU0UsIEFSR19OT05FIH0sCS8qIGFsaWFzICovCi0gIHsgImV4Y2IiLAkJTUZDKDB4MTgsMHgwNDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAibWIiLAkJTUZDKDB4MTgsMHg0MDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAid21iIiwJCU1GQygweDE4LDB4NDQwMCksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgImZldGNoIiwJCU1GQygweDE4LDB4ODAwMCksIEJBU0UsIHsgUFJCIH0gfSwKLSAgeyAiZmV0Y2hfbSIsCQlNRkMoMHgxOCwweEEwMDApLCBCQVNFLCB7IFBSQiB9IH0sCi0gIHsgInJwY2MiLAkJTUZDKDB4MTgsMHhDMDAwKSwgQkFTRSwgeyBSQSB9IH0sCi0gIHsgInJjIiwJCU1GQygweDE4LDB4RTAwMCksIEJBU0UsIHsgUkEgfSB9LAotICB7ICJlY2IiLAkJTUZDKDB4MTgsMHhFODAwKSwgQkFTRSwgeyBQUkIgfSB9LAkvKiBldjU2IHVuYSAqLwotICB7ICJycyIsCQlNRkMoMHgxOCwweEYwMDApLCBCQVNFLCB7IFJBIH0gfSwKLSAgeyAid2g2NCIsCQlNRkMoMHgxOCwweEY4MDApLCBCQVNFLCB7IFBSQiB9IH0sCS8qIGV2NTYgdW5hICovCi0KLSAgeyAiaHdfbWZwciIsCQlPUFIoMHgxOSwweDAwKSwgRVY0LCB7IFJBLCBSQkEsIEVWNEVYVEhXSU5ERVggfSB9LAotICB7ICJod19tZnByIiwJCU9QKDB4MTkpLCBPUF9NQVNLLCBFVjUsIHsgUkEsIFJCQSwgRVY1SFdJTkRFWCB9IH0sCi0gIHsgImh3X21mcHIiLAkJT1AoMHgxOSksIE9QX01BU0ssIEVWNiwgeyBSQSwgWkIsIEVWNkhXSU5ERVggfSB9LAotICB7ICJod19tZnByL2kiLAlPUFIoMHgxOSwweDAxKSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbWZwci9hIiwJT1BSKDB4MTksMHgwMiksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X21mcHIvYWkiLAlPUFIoMHgxOSwweDAzKSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbWZwci9wIiwJT1BSKDB4MTksMHgwNCksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X21mcHIvcGkiLAlPUFIoMHgxOSwweDA1KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbWZwci9wYSIsCU9QUigweDE5LDB4MDYpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tZnByL3BhaSIsCU9QUigweDE5LDB4MDcpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJwYWwxOSIsCQlQQ0QoMHgxOSksIEJBU0UsIEFSR19QQ0QgfSwKLQotICB7ICJqbXAiLAkJTUJSKDB4MUEsMCksIEJBU0UsIHsgUkEsIENQUkIsIEpNUEhJTlQgfSB9LAotICB7ICJqc3IiLAkJTUJSKDB4MUEsMSksIEJBU0UsIHsgUkEsIENQUkIsIEpNUEhJTlQgfSB9LAotICB7ICJyZXQiLAkJTUJSKDB4MUEsMiksIEJBU0UsIHsgUkEsIENQUkIsIFJFVEhJTlQgfSB9LAotICB7ICJqY3IiLAkJTUJSKDB4MUEsMyksIEJBU0UsIHsgUkEsIENQUkIsIFJFVEhJTlQgfSB9LCAvKiBhbGlhcyAqLwotICB7ICJqc3JfY29yb3V0aW5lIiwJTUJSKDB4MUEsMyksIEJBU0UsIHsgUkEsIENQUkIsIFJFVEhJTlQgfSB9LAotCi0gIHsgImh3X2xkbCIsCQlFVjRIV01FTSgweDFCLDB4MCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbCIsCQlFVjVIV01FTSgweDFCLDB4MDApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwiLAkJRVY2SFdNRU0oMHgxQiwweDgpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGwvYSIsCQlFVjRIV01FTSgweDFCLDB4NCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbC9hIiwJCUVWNUhXTUVNKDB4MUIsMHgxMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9hIiwJCUVWNkhXTUVNKDB4MUIsMHhDKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2FsIiwJRVY1SFdNRU0oMHgxQiwweDExKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2FyIiwJRVY0SFdNRU0oMHgxQiwweDYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwvYXYiLAlFVjVIV01FTSgweDFCLDB4MTIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvYXZsIiwJRVY1SFdNRU0oMHgxQiwweDEzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2F3IiwJRVY1SFdNRU0oMHgxQiwweDE4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2F3bCIsCUVWNUhXTUVNKDB4MUIsMHgxOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9hd3YiLAlFVjVIV01FTSgweDFCLDB4MWEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvYXd2bCIsCUVWNUhXTUVNKDB4MUIsMHgxYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9sIiwJCUVWNUhXTUVNKDB4MUIsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wIiwJCUVWNEhXTUVNKDB4MUIsMHg4KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3AiLAkJRVY1SFdNRU0oMHgxQiwweDIwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3AiLAkJRVY2SFdNRU0oMHgxQiwweDApLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGwvcGEiLAlFVjRIV01FTSgweDFCLDB4QyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYSIsCUVWNUhXTUVNKDB4MUIsMHgzMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYWwiLAlFVjVIV01FTSgweDFCLDB4MzEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGFyIiwJRVY0SFdNRU0oMHgxQiwweEUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwvcGF2IiwJRVY1SFdNRU0oMHgxQiwweDMyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3BhdmwiLAlFVjVIV01FTSgweDFCLDB4MzMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGF3IiwJRVY1SFdNRU0oMHgxQiwweDM4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3Bhd2wiLAlFVjVIV01FTSgweDFCLDB4MzkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGF3diIsCUVWNUhXTUVNKDB4MUIsMHgzYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYXd2bCIsCUVWNUhXTUVNKDB4MUIsMHgzYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wbCIsCUVWNUhXTUVNKDB4MUIsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wciIsCUVWNEhXTUVNKDB4MUIsMHhBKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3B2IiwJRVY1SFdNRU0oMHgxQiwweDIyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3B2bCIsCUVWNUhXTUVNKDB4MUIsMHgyMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wdyIsCUVWNUhXTUVNKDB4MUIsMHgyOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wd2wiLAlFVjVIV01FTSgweDFCLDB4MjkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcHd2IiwJRVY1SFdNRU0oMHgxQiwweDJhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3B3dmwiLAlFVjVIV01FTSgweDFCLDB4MmIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvciIsCQlFVjRIV01FTSgweDFCLDB4MiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbC92IiwJCUVWNUhXTUVNKDB4MUIsMHgwMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC92IiwJCUVWNkhXTUVNKDB4MUIsMHg0KSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3ZsIiwJRVY1SFdNRU0oMHgxQiwweDAzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3ciLAkJRVY1SFdNRU0oMHgxQiwweDA4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3ciLAkJRVY2SFdNRU0oMHgxQiwweEEpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGwvd2EiLAlFVjZIV01FTSgweDFCLDB4RSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkbC93bCIsCUVWNUhXTUVNKDB4MUIsMHgwOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC93diIsCUVWNUhXTUVNKDB4MUIsMHgwYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC93dmwiLAlFVjVIV01FTSgweDFCLDB4MGIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbCIsCQlFVjVIV01FTSgweDFCLDB4MDEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9hIiwJRVY1SFdNRU0oMHgxQiwweDExKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvYXYiLAlFVjVIV01FTSgweDFCLDB4MTMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9hdyIsCUVWNUhXTUVNKDB4MUIsMHgxOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL2F3diIsCUVWNUhXTUVNKDB4MUIsMHgxYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3AiLAlFVjVIV01FTSgweDFCLDB4MjEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wIiwJRVY2SFdNRU0oMHgxQiwweDIpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGxfbC9wYSIsCUVWNUhXTUVNKDB4MUIsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3BhdiIsCUVWNUhXTUVNKDB4MUIsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3BhdyIsCUVWNUhXTUVNKDB4MUIsMHgzOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3Bhd3YiLAlFVjVIV01FTSgweDFCLDB4M2IpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wdiIsCUVWNUhXTUVNKDB4MUIsMHgyMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3B3IiwJRVY1SFdNRU0oMHgxQiwweDI5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcHd2IiwJRVY1SFdNRU0oMHgxQiwweDJiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvdiIsCUVWNUhXTUVNKDB4MUIsMHgwMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3ciLAlFVjVIV01FTSgweDFCLDB4MDkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC93diIsCUVWNUhXTUVNKDB4MUIsMHgwYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcSIsCQlFVjRIV01FTSgweDFCLDB4MSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcSIsCQlFVjVIV01FTSgweDFCLDB4MDQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEiLAkJRVY2SFdNRU0oMHgxQiwweDkpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHEvYSIsCQlFVjRIV01FTSgweDFCLDB4NSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcS9hIiwJCUVWNUhXTUVNKDB4MUIsMHgxNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9hIiwJCUVWNkhXTUVNKDB4MUIsMHhEKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2FsIiwJRVY1SFdNRU0oMHgxQiwweDE1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2FyIiwJRVY0SFdNRU0oMHgxQiwweDcpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEvYXYiLAlFVjVIV01FTSgweDFCLDB4MTYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvYXZsIiwJRVY1SFdNRU0oMHgxQiwweDE3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2F3IiwJRVY1SFdNRU0oMHgxQiwweDFjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2F3bCIsCUVWNUhXTUVNKDB4MUIsMHgxZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9hd3YiLAlFVjVIV01FTSgweDFCLDB4MWUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvYXd2bCIsCUVWNUhXTUVNKDB4MUIsMHgxZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9sIiwJCUVWNUhXTUVNKDB4MUIsMHgwNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wIiwJCUVWNEhXTUVNKDB4MUIsMHg5KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3AiLAkJRVY1SFdNRU0oMHgxQiwweDI0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3AiLAkJRVY2SFdNRU0oMHgxQiwweDEpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHEvcGEiLAlFVjRIV01FTSgweDFCLDB4RCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYSIsCUVWNUhXTUVNKDB4MUIsMHgzNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYWwiLAlFVjVIV01FTSgweDFCLDB4MzUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGFyIiwJRVY0SFdNRU0oMHgxQiwweEYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEvcGF2IiwJRVY1SFdNRU0oMHgxQiwweDM2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3BhdmwiLAlFVjVIV01FTSgweDFCLDB4MzcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGF3IiwJRVY1SFdNRU0oMHgxQiwweDNjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3Bhd2wiLAlFVjVIV01FTSgweDFCLDB4M2QpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGF3diIsCUVWNUhXTUVNKDB4MUIsMHgzZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYXd2bCIsCUVWNUhXTUVNKDB4MUIsMHgzZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wbCIsCUVWNUhXTUVNKDB4MUIsMHgyNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wciIsCUVWNEhXTUVNKDB4MUIsMHhCKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3B2IiwJRVY1SFdNRU0oMHgxQiwweDI2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3B2bCIsCUVWNUhXTUVNKDB4MUIsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wdyIsCUVWNUhXTUVNKDB4MUIsMHgyYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wd2wiLAlFVjVIV01FTSgweDFCLDB4MmQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcHd2IiwJRVY1SFdNRU0oMHgxQiwweDJlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3B3dmwiLAlFVjVIV01FTSgweDFCLDB4MmYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvciIsCQlFVjRIV01FTSgweDFCLDB4MyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcS92IiwJCUVWNUhXTUVNKDB4MUIsMHgwNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS92IiwJCUVWNkhXTUVNKDB4MUIsMHg1KSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3ZsIiwJRVY1SFdNRU0oMHgxQiwweDA3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3ciLAkJRVY1SFdNRU0oMHgxQiwweDBjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3ciLAkJRVY2SFdNRU0oMHgxQiwweEIpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHEvd2EiLAlFVjZIV01FTSgweDFCLDB4RiksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkcS93bCIsCUVWNUhXTUVNKDB4MUIsMHgwZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS93diIsCUVWNUhXTUVNKDB4MUIsMHgwZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS93dmwiLAlFVjVIV01FTSgweDFCLDB4MGYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbCIsCQlFVjVIV01FTSgweDFCLDB4MDUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9hIiwJRVY1SFdNRU0oMHgxQiwweDE1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvYXYiLAlFVjVIV01FTSgweDFCLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9hdyIsCUVWNUhXTUVNKDB4MUIsMHgxZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL2F3diIsCUVWNUhXTUVNKDB4MUIsMHgxZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3AiLAlFVjVIV01FTSgweDFCLDB4MjUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wIiwJRVY2SFdNRU0oMHgxQiwweDMpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHFfbC9wYSIsCUVWNUhXTUVNKDB4MUIsMHgzNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3BhdiIsCUVWNUhXTUVNKDB4MUIsMHgzNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3BhdyIsCUVWNUhXTUVNKDB4MUIsMHgzZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3Bhd3YiLAlFVjVIV01FTSgweDFCLDB4M2YpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wdiIsCUVWNUhXTUVNKDB4MUIsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3B3IiwJRVY1SFdNRU0oMHgxQiwweDJkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcHd2IiwJRVY1SFdNRU0oMHgxQiwweDJmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvdiIsCUVWNUhXTUVNKDB4MUIsMHgwNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3ciLAlFVjVIV01FTSgweDFCLDB4MGQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC93diIsCUVWNUhXTUVNKDB4MUIsMHgwZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkIiwJCUVWNEhXTUVNKDB4MUIsMHgwKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQiLAkJRVY1SFdNRU0oMHgxQiwweDAwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYSIsCQlFVjRIV01FTSgweDFCLDB4NCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL2EiLAkJRVY1SFdNRU0oMHgxQiwweDEwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYWwiLAkJRVY1SFdNRU0oMHgxQiwweDExKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXEiLAkJRVY0SFdNRU0oMHgxQiwweDUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9hcSIsCQlFVjVIV01FTSgweDFCLDB4MTQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hcWwiLAlFVjVIV01FTSgweDFCLDB4MTUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hcXYiLAlFVjVIV01FTSgweDFCLDB4MTYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hcXZsIiwJRVY1SFdNRU0oMHgxQiwweDE3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXIiLAkJRVY0SFdNRU0oMHgxQiwweDYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9hcnEiLAlFVjRIV01FTSgweDFCLDB4NyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL2F2IiwJCUVWNUhXTUVNKDB4MUIsMHgxMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F2bCIsCUVWNUhXTUVNKDB4MUIsMHgxMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3IiwJCUVWNUhXTUVNKDB4MUIsMHgxOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3bCIsCUVWNUhXTUVNKDB4MUIsMHgxOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3cSIsCUVWNUhXTUVNKDB4MUIsMHgxYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3cWwiLAlFVjVIV01FTSgweDFCLDB4MWQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hd3F2IiwJRVY1SFdNRU0oMHgxQiwweDFlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXdxdmwiLAlFVjVIV01FTSgweDFCLDB4MWYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hd3YiLAlFVjVIV01FTSgweDFCLDB4MWEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDFiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvbCIsCQlFVjVIV01FTSgweDFCLDB4MDEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wIiwJCUVWNEhXTUVNKDB4MUIsMHg4KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcCIsCQlFVjVIV01FTSgweDFCLDB4MjApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYSIsCQlFVjRIV01FTSgweDFCLDB4QyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3BhIiwJCUVWNUhXTUVNKDB4MUIsMHgzMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhbCIsCUVWNUhXTUVNKDB4MUIsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhcSIsCUVWNEhXTUVNKDB4MUIsMHhEKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFxIiwJRVY1SFdNRU0oMHgxQiwweDM0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFxbCIsCUVWNUhXTUVNKDB4MUIsMHgzNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhcXYiLAlFVjVIV01FTSgweDFCLDB4MzYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXF2bCIsCUVWNUhXTUVNKDB4MUIsMHgzNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhciIsCUVWNEhXTUVNKDB4MUIsMHhFKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFycSIsCUVWNEhXTUVNKDB4MUIsMHhGKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF2IiwJRVY1SFdNRU0oMHgxQiwweDMyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF2bCIsCUVWNUhXTUVNKDB4MUIsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhdyIsCUVWNUhXTUVNKDB4MUIsMHgzOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3Bhd2wiLAlFVjVIV01FTSgweDFCLDB4MzkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXdxIiwJRVY1SFdNRU0oMHgxQiwweDNjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF3cWwiLAlFVjVIV01FTSgweDFCLDB4M2QpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXdxdiIsCUVWNUhXTUVNKDB4MUIsMHgzZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3Bhd3F2bCIsCUVWNUhXTUVNKDB4MUIsMHgzZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3Bhd3YiLAlFVjVIV01FTSgweDFCLDB4M2EpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXd2bCIsCUVWNUhXTUVNKDB4MUIsMHgzYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BsIiwJCUVWNUhXTUVNKDB4MUIsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BxIiwJCUVWNEhXTUVNKDB4MUIsMHg5KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHEiLAkJRVY1SFdNRU0oMHgxQiwweDI0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHFsIiwJRVY1SFdNRU0oMHgxQiwweDI1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHF2IiwJRVY1SFdNRU0oMHgxQiwweDI2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHF2bCIsCUVWNUhXTUVNKDB4MUIsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3ByIiwJCUVWNEhXTUVNKDB4MUIsMHhBKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHJxIiwJRVY0SFdNRU0oMHgxQiwweEIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9wdiIsCQlFVjVIV01FTSgweDFCLDB4MjIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wdmwiLAlFVjVIV01FTSgweDFCLDB4MjMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wdyIsCQlFVjVIV01FTSgweDFCLDB4MjgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wd2wiLAlFVjVIV01FTSgweDFCLDB4MjkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wd3EiLAlFVjVIV01FTSgweDFCLDB4MmMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wd3FsIiwJRVY1SFdNRU0oMHgxQiwweDJkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHdxdiIsCUVWNUhXTUVNKDB4MUIsMHgyZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B3cXZsIiwJRVY1SFdNRU0oMHgxQiwweDJmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHd2IiwJRVY1SFdNRU0oMHgxQiwweDJhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHd2bCIsCUVWNUhXTUVNKDB4MUIsMHgyYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3EiLAkJRVY0SFdNRU0oMHgxQiwweDEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9xIiwJCUVWNUhXTUVNKDB4MUIsMHgwNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3FsIiwJCUVWNUhXTUVNKDB4MUIsMHgwNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3F2IiwJCUVWNUhXTUVNKDB4MUIsMHgwNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3F2bCIsCUVWNUhXTUVNKDB4MUIsMHgwNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3IiLAkJRVY0SFdNRU0oMHgxQiwweDIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9ycSIsCQlFVjRIV01FTSgweDFCLDB4MyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3YiLAkJRVY1SFdNRU0oMHgxQiwweDAyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvdmwiLAkJRVY1SFdNRU0oMHgxQiwweDAzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvdyIsCQlFVjVIV01FTSgweDFCLDB4MDgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93bCIsCQlFVjVIV01FTSgweDFCLDB4MDkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93cSIsCQlFVjVIV01FTSgweDFCLDB4MGMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93cWwiLAlFVjVIV01FTSgweDFCLDB4MGQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93cXYiLAlFVjVIV01FTSgweDFCLDB4MGUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93cXZsIiwJRVY1SFdNRU0oMHgxQiwweDBmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvd3YiLAkJRVY1SFdNRU0oMHgxQiwweDBhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDBiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAicGFsMWIiLAkJUENEKDB4MUIpLCBCQVNFLCBBUkdfUENEIH0sCi0KLSAgeyAic2V4dGIiLAkJT1BSKDB4MUMsIDB4MDApLCBCV1gsIEFSR19PUFJaMSB9LAotICB7ICJzZXh0dyIsCQlPUFIoMHgxQywgMHgwMSksIEJXWCwgQVJHX09QUloxIH0sCi0gIHsgImN0cG9wIiwJCU9QUigweDFDLCAweDMwKSwgQ0lYLCBBUkdfT1BSWjEgfSwKLSAgeyAicGVyciIsCQlPUFIoMHgxQywgMHgzMSksIE1BWCwgQVJHX09QUiB9LAotICB7ICJjdGx6IiwJCU9QUigweDFDLCAweDMyKSwgQ0lYLCBBUkdfT1BSWjEgfSwKLSAgeyAiY3R0eiIsCQlPUFIoMHgxQywgMHgzMyksIENJWCwgQVJHX09QUloxIH0sCi0gIHsgInVucGtidyIsCQlPUFIoMHgxQywgMHgzNCksIE1BWCwgQVJHX09QUloxIH0sCi0gIHsgInVucGtibCIsCQlPUFIoMHgxQywgMHgzNSksIE1BWCwgQVJHX09QUloxIH0sCi0gIHsgInBrd2IiLAkJT1BSKDB4MUMsIDB4MzYpLCBNQVgsIEFSR19PUFJaMSB9LAotICB7ICJwa2xiIiwJCU9QUigweDFDLCAweDM3KSwgTUFYLCBBUkdfT1BSWjEgfSwKLSAgeyAibWluc2I4IiwgCQlPUFIoMHgxQywgMHgzOCksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtaW5zYjgiLCAJCU9QUkwoMHgxQywgMHgzOCksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWluc3c0IiwgCQlPUFIoMHgxQywgMHgzOSksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtaW5zdzQiLCAJCU9QUkwoMHgxQywgMHgzOSksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWludWI4IiwgCQlPUFIoMHgxQywgMHgzQSksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtaW51YjgiLCAJCU9QUkwoMHgxQywgMHgzQSksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWludXc0IiwgCQlPUFIoMHgxQywgMHgzQiksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtaW51dzQiLCAJCU9QUkwoMHgxQywgMHgzQiksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWF4dWI4IiwJCU9QUigweDFDLCAweDNDKSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1heHViOCIsCQlPUFJMKDB4MUMsIDB4M0MpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgIm1heHV3NCIsCQlPUFIoMHgxQywgMHgzRCksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtYXh1dzQiLAkJT1BSTCgweDFDLCAweDNEKSwgTUFYLCBBUkdfT1BSTCB9LAotICB7ICJtYXhzYjgiLAkJT1BSKDB4MUMsIDB4M0UpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAibWF4c2I4IiwJCU9QUkwoMHgxQywgMHgzRSksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWF4c3c0IiwJCU9QUigweDFDLCAweDNGKSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1heHN3NCIsCQlPUFJMKDB4MUMsIDB4M0YpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgImZ0b2l0IiwJCUZQKDB4MUMsIDB4NzApLCBDSVgsIHsgRkEsIFpCLCBSQyB9IH0sCi0gIHsgImZ0b2lzIiwJCUZQKDB4MUMsIDB4NzgpLCBDSVgsIHsgRkEsIFpCLCBSQyB9IH0sCi0KLSAgeyAiaHdfbXRwciIsCQlPUFIoMHgxRCwweDAwKSwgRVY0LCB7IFJBLCBSQkEsIEVWNEVYVEhXSU5ERVggfSB9LAotICB7ICJod19tdHByIiwJCU9QKDB4MUQpLCBPUF9NQVNLLCBFVjUsIHsgUkEsIFJCQSwgRVY1SFdJTkRFWCB9IH0sCi0gIHsgImh3X210cHIiLAkJT1AoMHgxRCksIE9QX01BU0ssIEVWNiwgeyBaQSwgUkIsIEVWNkhXSU5ERVggfSB9LAotICB7ICJod19tdHByL2kiLCAJT1BSKDB4MUQsMHgwMSksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X210cHIvYSIsIAlPUFIoMHgxRCwweDAyKSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbXRwci9haSIsCU9QUigweDFELDB4MDMpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tdHByL3AiLCAJT1BSKDB4MUQsMHgwNCksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X210cHIvcGkiLAlPUFIoMHgxRCwweDA1KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbXRwci9wYSIsCU9QUigweDFELDB4MDYpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tdHByL3BhaSIsCU9QUigweDFELDB4MDcpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJwYWwxZCIsCQlQQ0QoMHgxRCksIEJBU0UsIEFSR19QQ0QgfSwKLQotICB7ICJod19yZWkiLAkJU1BDRCgweDFFLDB4M0ZGODAwMCksIEVWNHxFVjUsIEFSR19OT05FIH0sCi0gIHsgImh3X3JlaV9zdGFsbCIsCVNQQ0QoMHgxRSwweDNGRkMwMDApLCBFVjUsIEFSR19OT05FIH0sCi0gIHsgImh3X2ptcCIsIAkJRVY2SFdNQlIoMHgxRSwweDApLCBFVjYsIHsgWkEsIFBSQiwgRVY2SFdKTVBISU5UIH0gfSwKLSAgeyAiaHdfanNyIiwgCQlFVjZIV01CUigweDFFLDB4MiksIEVWNiwgeyBaQSwgUFJCLCBFVjZIV0pNUEhJTlQgfSB9LAotICB7ICJod19yZXQiLCAJCUVWNkhXTUJSKDB4MUUsMHg0KSwgRVY2LCB7IFpBLCBQUkIgfSB9LAotICB7ICJod19qY3IiLCAJCUVWNkhXTUJSKDB4MUUsMHg2KSwgRVY2LCB7IFpBLCBQUkIgfSB9LAotICB7ICJod19jb3JvdXRpbmUiLAlFVjZIV01CUigweDFFLDB4NiksIEVWNiwgeyBaQSwgUFJCIH0gfSwgLyogYWxpYXMgKi8KLSAgeyAiaHdfam1wL3N0YWxsIiwJRVY2SFdNQlIoMHgxRSwweDEpLCBFVjYsIHsgWkEsIFBSQiwgRVY2SFdKTVBISU5UIH0gfSwKLSAgeyAiaHdfanNyL3N0YWxsIiwgCUVWNkhXTUJSKDB4MUUsMHgzKSwgRVY2LCB7IFpBLCBQUkIsIEVWNkhXSk1QSElOVCB9IH0sCi0gIHsgImh3X3JldC9zdGFsbCIsCUVWNkhXTUJSKDB4MUUsMHg1KSwgRVY2LCB7IFpBLCBQUkIgfSB9LAotICB7ICJod19qY3Ivc3RhbGwiLCAJRVY2SFdNQlIoMHgxRSwweDcpLCBFVjYsIHsgWkEsIFBSQiB9IH0sCi0gIHsgImh3X2Nvcm91dGluZS9zdGFsbCIsIEVWNkhXTUJSKDB4MUUsMHg3KSwgRVY2LCB7IFpBLCBQUkIgfSB9LCAvKiBhbGlhcyAqLwotICB7ICJwYWwxZSIsCQlQQ0QoMHgxRSksIEJBU0UsIEFSR19QQ0QgfSwKLQotICB7ICJod19zdGwiLAkJRVY0SFdNRU0oMHgxRiwweDApLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdGwiLAkJRVY1SFdNRU0oMHgxRiwweDAwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsIiwJCUVWNkhXTUVNKDB4MUYsMHg0KSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwgLyogPz8/IDggKi8KLSAgeyAiaHdfc3RsL2EiLAkJRVY0SFdNRU0oMHgxRiwweDQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdGwvYSIsCQlFVjVIV01FTSgweDFGLDB4MTApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvYSIsCQlFVjZIV01FTSgweDFGLDB4QyksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X3N0bC9hYyIsCUVWNUhXTUVNKDB4MUYsMHgxMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9hciIsCUVWNEhXTUVNKDB4MUYsMHg2KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RsL2F2IiwJRVY1SFdNRU0oMHgxRiwweDEyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL2F2YyIsCUVWNUhXTUVNKDB4MUYsMHgxMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9jIiwJCUVWNUhXTUVNKDB4MUYsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wIiwJCUVWNEhXTUVNKDB4MUYsMHg4KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3AiLAkJRVY1SFdNRU0oMHgxRiwweDIwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3AiLAkJRVY2SFdNRU0oMHgxRiwweDApLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19zdGwvcGEiLAlFVjRIV01FTSgweDFGLDB4QyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0bC9wYSIsCUVWNUhXTUVNKDB4MUYsMHgzMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wYWMiLAlFVjVIV01FTSgweDFGLDB4MzEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcGF2IiwJRVY1SFdNRU0oMHgxRiwweDMyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3BhdmMiLAlFVjVIV01FTSgweDFGLDB4MzMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcGMiLAlFVjVIV01FTSgweDFGLDB4MjEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcHIiLAlFVjRIV01FTSgweDFGLDB4QSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0bC9wdiIsCUVWNUhXTUVNKDB4MUYsMHgyMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wdmMiLAlFVjVIV01FTSgweDFGLDB4MjMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvciIsCQlFVjRIV01FTSgweDFGLDB4MiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0bC92IiwJCUVWNUhXTUVNKDB4MUYsMHgwMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC92YyIsCUVWNUhXTUVNKDB4MUYsMHgwMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jIiwJCUVWNUhXTUVNKDB4MUYsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL2EiLAlFVjVIV01FTSgweDFGLDB4MTEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYy9hdiIsCUVWNUhXTUVNKDB4MUYsMHgxMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL3AiLAlFVjVIV01FTSgweDFGLDB4MjEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYy9wIiwJRVY2SFdNRU0oMHgxRiwweDIpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19zdGxfYy9wYSIsCUVWNUhXTUVNKDB4MUYsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL3BhdiIsCUVWNUhXTUVNKDB4MUYsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL3B2IiwJRVY1SFdNRU0oMHgxRiwweDIzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MvdiIsCUVWNUhXTUVNKDB4MUYsMHgwMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cSIsCQlFVjRIV01FTSgweDFGLDB4MSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cSIsCQlFVjVIV01FTSgweDFGLDB4MDQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEiLAkJRVY2SFdNRU0oMHgxRiwweDUpLCBFVjYsIEFSR19FVjZIV01FTSB9LCAvKiA/Pz8gOSAqLwotICB7ICJod19zdHEvYSIsCQlFVjRIV01FTSgweDFGLDB4NSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS9hIiwJCUVWNUhXTUVNKDB4MUYsMHgxNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9hIiwJCUVWNkhXTUVNKDB4MUYsMHhEKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfc3RxL2FjIiwJRVY1SFdNRU0oMHgxRiwweDE1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL2FyIiwJRVY0SFdNRU0oMHgxRiwweDcpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvYXYiLAlFVjVIV01FTSgweDFGLDB4MTYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvYXZjIiwJRVY1SFdNRU0oMHgxRiwweDE3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL2MiLAkJRVY1SFdNRU0oMHgxRiwweDA1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3AiLAkJRVY0SFdNRU0oMHgxRiwweDkpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvcCIsCQlFVjVIV01FTSgweDFGLDB4MjQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcCIsCQlFVjZIV01FTSgweDFGLDB4MSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYSIsCUVWNEhXTUVNKDB4MUYsMHhEKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BhIiwJRVY1SFdNRU0oMHgxRiwweDM0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BhYyIsCUVWNUhXTUVNKDB4MUYsMHgzNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYXIiLAlFVjRIV01FTSgweDFGLDB4RSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYXIiLAlFVjRIV01FTSgweDFGLDB4RiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYXYiLAlFVjVIV01FTSgweDFGLDB4MzYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcGF2YyIsCUVWNUhXTUVNKDB4MUYsMHgzNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYyIsCUVWNUhXTUVNKDB4MUYsMHgyNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wciIsCUVWNEhXTUVNKDB4MUYsMHhCKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3B2IiwJRVY1SFdNRU0oMHgxRiwweDI2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3B2YyIsCUVWNUhXTUVNKDB4MUYsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9yIiwJCUVWNEhXTUVNKDB4MUYsMHgzKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3YiLAkJRVY1SFdNRU0oMHgxRiwweDA2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3ZjIiwJRVY1SFdNRU0oMHgxRiwweDA3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MiLAkJRVY1SFdNRU0oMHgxRiwweDA1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvYSIsCUVWNUhXTUVNKDB4MUYsMHgxNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL2F2IiwJRVY1SFdNRU0oMHgxRiwweDE3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvcCIsCUVWNUhXTUVNKDB4MUYsMHgyNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL3AiLAlFVjZIV01FTSgweDFGLDB4MyksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL3BhIiwJRVY1SFdNRU0oMHgxRiwweDM1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvcGF2IiwJRVY1SFdNRU0oMHgxRiwweDM3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvcHYiLAlFVjVIV01FTSgweDFGLDB4MjcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHFfYy92IiwJRVY1SFdNRU0oMHgxRiwweDA3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QiLAkJRVY0SFdNRU0oMHgxRiwweDApLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdCIsCQlFVjVIV01FTSgweDFGLDB4MDApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hIiwJCUVWNEhXTUVNKDB4MUYsMHg0KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvYSIsCQlFVjVIV01FTSgweDFGLDB4MTApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hYyIsCQlFVjVIV01FTSgweDFGLDB4MTEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hcSIsCQlFVjRIV01FTSgweDFGLDB4NSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L2FxIiwJCUVWNUhXTUVNKDB4MUYsMHgxNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2FxYyIsCUVWNUhXTUVNKDB4MUYsMHgxNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2FxdiIsCUVWNUhXTUVNKDB4MUYsMHgxNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2FxdmMiLAlFVjVIV01FTSgweDFGLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hciIsCQlFVjRIV01FTSgweDFGLDB4NiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L2FycSIsCUVWNEhXTUVNKDB4MUYsMHg3KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXYiLAkJRVY1SFdNRU0oMHgxRiwweDEyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXZjIiwJRVY1SFdNRU0oMHgxRiwweDEzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYyIsCQlFVjVIV01FTSgweDFGLDB4MDEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wIiwJCUVWNEhXTUVNKDB4MUYsMHg4KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcCIsCQlFVjVIV01FTSgweDFGLDB4MjApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYSIsCQlFVjRIV01FTSgweDFGLDB4QyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3BhIiwJCUVWNUhXTUVNKDB4MUYsMHgzMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhYyIsCUVWNUhXTUVNKDB4MUYsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhcSIsCUVWNEhXTUVNKDB4MUYsMHhEKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFxIiwJRVY1SFdNRU0oMHgxRiwweDM0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFxYyIsCUVWNUhXTUVNKDB4MUYsMHgzNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhcXYiLAlFVjVIV01FTSgweDFGLDB4MzYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYXF2YyIsCUVWNUhXTUVNKDB4MUYsMHgzNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhciIsCUVWNEhXTUVNKDB4MUYsMHhFKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFycSIsCUVWNEhXTUVNKDB4MUYsMHhGKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGF2IiwJRVY1SFdNRU0oMHgxRiwweDMyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGF2YyIsCUVWNUhXTUVNKDB4MUYsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BjIiwJCUVWNUhXTUVNKDB4MUYsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BxIiwJCUVWNEhXTUVNKDB4MUYsMHg5KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHEiLAkJRVY1SFdNRU0oMHgxRiwweDI0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHFjIiwJRVY1SFdNRU0oMHgxRiwweDI1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHF2IiwJRVY1SFdNRU0oMHgxRiwweDI2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHF2YyIsCUVWNUhXTUVNKDB4MUYsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3ByIiwJCUVWNEhXTUVNKDB4MUYsMHhBKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHJxIiwJRVY0SFdNRU0oMHgxRiwweEIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9wdiIsCQlFVjVIV01FTSgweDFGLDB4MjIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wdmMiLAlFVjVIV01FTSgweDFGLDB4MjMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9xIiwJCUVWNEhXTUVNKDB4MUYsMHgxKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcSIsCQlFVjVIV01FTSgweDFGLDB4MDQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9xYyIsCQlFVjVIV01FTSgweDFGLDB4MDUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9xdiIsCQlFVjVIV01FTSgweDFGLDB4MDYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9xdmMiLAlFVjVIV01FTSgweDFGLDB4MDcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9yIiwJCUVWNEhXTUVNKDB4MUYsMHgyKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvdiIsCQlFVjVIV01FTSgweDFGLDB4MDIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC92YyIsCQlFVjVIV01FTSgweDFGLDB4MDMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJwYWwxZiIsCQlQQ0QoMHgxRiksIEJBU0UsIEFSR19QQ0QgfSwKLQotICB7ICJsZGYiLAkJTUVNKDB4MjApLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJsZGciLAkJTUVNKDB4MjEpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJsZHMiLAkJTUVNKDB4MjIpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJsZHQiLAkJTUVNKDB4MjMpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJzdGYiLAkJTUVNKDB4MjQpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJzdGciLAkJTUVNKDB4MjUpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJzdHMiLAkJTUVNKDB4MjYpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJzdHQiLAkJTUVNKDB4MjcpLCBCQVNFLCBBUkdfRk1FTSB9LAotCi0gIHsgImxkbCIsCQlNRU0oMHgyOCksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAibGRxIiwJCU1FTSgweDI5KSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJsZGxfbCIsCQlNRU0oMHgyQSksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAibGRxX2wiLAkJTUVNKDB4MkIpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgInN0bCIsCQlNRU0oMHgyQyksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAic3RxIiwJCU1FTSgweDJEKSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJzdGxfYyIsCQlNRU0oMHgyRSksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAic3RxX2MiLAkJTUVNKDB4MkYpLCBCQVNFLCBBUkdfTUVNIH0sCi0KLSAgeyAiYnIiLAkJQlJBKDB4MzApLCBCQVNFLCB7IFpBLCBCRElTUCB9IH0sCS8qIHBzZXVkbyAqLwotICB7ICJiciIsCQlCUkEoMHgzMCksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiZmJlcSIsCQlCUkEoMHgzMSksIEJBU0UsIEFSR19GQlJBIH0sCi0gIHsgImZibHQiLAkJQlJBKDB4MzIpLCBCQVNFLCBBUkdfRkJSQSB9LAotICB7ICJmYmxlIiwJCUJSQSgweDMzKSwgQkFTRSwgQVJHX0ZCUkEgfSwKLSAgeyAiYnNyIiwJCUJSQSgweDM0KSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJmYm5lIiwJCUJSQSgweDM1KSwgQkFTRSwgQVJHX0ZCUkEgfSwKLSAgeyAiZmJnZSIsCQlCUkEoMHgzNiksIEJBU0UsIEFSR19GQlJBIH0sCi0gIHsgImZiZ3QiLAkJQlJBKDB4MzcpLCBCQVNFLCBBUkdfRkJSQSB9LAotICB7ICJibGJjIiwJCUJSQSgweDM4KSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJiZXEiLAkJQlJBKDB4MzkpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImJsdCIsCQlCUkEoMHgzQSksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiYmxlIiwJCUJSQSgweDNCKSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJibGJzIiwJCUJSQSgweDNDKSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJibmUiLAkJQlJBKDB4M0QpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImJnZSIsCQlCUkEoMHgzRSksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiYmd0IiwJCUJSQSgweDNGKSwgQkFTRSwgQVJHX0JSQSB9LAotfTsKLQotY29uc3QgaW50IGFscGhhX251bV9vcGNvZGVzID0gc2l6ZW9mKGFscGhhX29wY29kZXMpL3NpemVvZigqYWxwaGFfb3Bjb2Rlcyk7CmRpZmYgLS1naXQgYS9vcGNvZGVzL2FyYy1kaXMuYyBiL29wY29kZXMvYXJjLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDJiMDdiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvYXJjLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qIEluc3RydWN0aW9uIHByaW50aW5nIGNvZGUgZm9yIHRoZSBBUkMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIAotICAgQ29udHJpYnV0ZWQgYnkgRG91ZyBFdmFucyAoZGplQGN5Z251cy5jb20pLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS9hcmMuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL2FyYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi1zdGF0aWMgaW50IHByaW50X2luc25fYXJjX2Jhc2VfbGl0dGxlIFBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotc3RhdGljIGludCBwcmludF9pbnNuX2FyY19iYXNlX2JpZyBQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIGludCBwcmludF9pbnNuIFBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKiwgaW50LCBpbnQpKTsKLQotLyogUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gUEMgb24gSU5GTy0+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+dHlwZQkmJiByZWdubyA9PSByLT52YWx1ZSkKLSAgICAgIHJldHVybiByOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvYXJtLWRpcy5jIGIvb3Bjb2Rlcy9hcm0tZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYWJmNzIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hcm0tZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ODcgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gcHJpbnRpbmcgY29kZSBmb3IgdGhlIEFSTQotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAKLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0gICBNb2RpZmljYXRpb24gYnkgSmFtZXMgRy4gU21pdGggKGpzbWl0aEBjeWdudXMuY28udWspCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpYm9wY29kZXMuIAotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgotdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLiAKLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi1BTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLW1vcmUgZGV0YWlscy4gCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2luY2x1ZGUgImFybS1vcGMuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBGSVhNRTogVGhpcyBzaG91bGRuJ3QgYmUgZG9uZSBoZXJlICovCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImVsZi9hcm0uaCIKLQotc3RhdGljIGNoYXIgKmFybV9jb25kaXRpb25hbFtdID0KLXsiZXEiLCAibmUiLCAiY3MiLCAiY2MiLCAibWkiLCAicGwiLCAidnMiLCAidmMiLAotICJoaSIsICJscyIsICJnZSIsICJsdCIsICJndCIsICJsZSIsICIiLCAibnYifTsKLQotc3RhdGljIGNoYXIgKmFybV9yZWduYW1lc1tdID0KLXsicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLAotICJyOCIsICJyOSIsICJzbCIsICJmcCIsICJpcCIsICJzcCIsICJsciIsICJwYyJ9OwotCi1zdGF0aWMgY2hhciAqYXJtX2ZwX2NvbnN0W10gPQoteyIwLjAiLCAiMS4wIiwgIjIuMCIsICIzLjAiLCAiNC4wIiwgIjUuMCIsICIwLjUiLCAiMTAuMCJ9OwotCi1zdGF0aWMgY2hhciAqYXJtX3NoaWZ0W10gPSAKLXsibHNsIiwgImxzciIsICJhc3IiLCAicm9yIn07Ci0KLXN0YXRpYyBpbnQgcHJpbnRfaW5zbl9hcm0gUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwKLQkJCQkgICBsb25nKSk7Ci0KLXN0YXRpYyB2b2lkCi1hcm1fZGVjb2RlX3NoaWZ0IChnaXZlbiwgZnVuYywgc3RyZWFtKQotICAgICBsb25nIGdpdmVuOwotICAgICBmcHJpbnRmX2Z0eXBlIGZ1bmM7Ci0gICAgIHZvaWQgKnN0cmVhbTsKLXsKLSAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbZ2l2ZW4gJiAweGZdKTsKLSAgaWYgKChnaXZlbiAmIDB4ZmYwKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICgoZ2l2ZW4gJiAweDEwKSA9PSAwKQotCXsKLQkgIGludCBhbW91bnQgPSAoZ2l2ZW4gJiAweGY4MCkgPj4gNzsKLQkgIGludCBzaGlmdCA9IChnaXZlbiAmIDB4NjApID4+IDU7Ci0JICBpZiAoYW1vdW50ID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoc2hpZnQgPT0gMykKLQkJewotCQkgIGZ1bmMgKHN0cmVhbSwgIiwgcnJ4Iik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgYW1vdW50ID0gMzI7Ci0JICAgIH0KLQkgIGZ1bmMgKHN0cmVhbSwgIiwgJXMgIyVkIiwgYXJtX3NoaWZ0W3NoaWZ0XSwgYW1vdW50KTsKLQl9Ci0gICAgICBlbHNlCi0JZnVuYyAoc3RyZWFtLCAiLCAlcyAlcyIsIGFybV9zaGlmdFsoZ2l2ZW4gJiAweDYwKSA+PiA1XSwKLQkgICAgICBhcm1fcmVnbmFtZXNbKGdpdmVuICYgMHhmMDApID4+IDhdKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIFBDIG9uIElORk8tPlNUUkVBTS4KLSAgIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gKGFsd2F5cyA0IG9uIEFSTSkuICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fYXJtIChwYywgaW5mbywgZ2l2ZW4pCi0gICAgIGJmZF92bWEgICAgICAgICBwYzsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGxvbmcgZ2l2ZW47Ci17Ci0gIHN0cnVjdCBhcm1fb3Bjb2RlICogIGluc247Ci0gIHZvaWQgKiAgICAgICAgICAgICAgIHN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgZnByaW50Zl9mdHlwZSAgICAgICAgZnVuYyAgID0gaW5mby0+ZnByaW50Zl9mdW5jOwotCi0gIGZvciAoaW5zbiA9IGFybV9vcGNvZGVzOyBpbnNuLT5hc3NlbWJsZXI7IGluc24rKykKLSAgICB7Ci0gICAgICBpZiAoKGdpdmVuICYgaW5zbi0+bWFzaykgPT0gaW5zbi0+dmFsdWUpCi0JewotCSAgY2hhciAqIGM7Ci0JICAKLQkgIGZvciAoYyA9IGluc24tPmFzc2VtYmxlcjsgKmM7IGMrKykKLQkgICAgewotCSAgICAgIGlmICgqYyA9PSAnJScpCi0JCXsKLQkJICBzd2l0Y2ggKCorK2MpCi0JCSAgICB7Ci0JCSAgICBjYXNlICclJzoKLQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJSUiKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ2EnOgotCQkgICAgICBpZiAoKChnaXZlbiAmIDB4MDAwZjAwMDApID09IDB4MDAwZjAwMDApCi0JCQkgICYmICgoZ2l2ZW4gJiAweDAyMDAwMDAwKSA9PSAwKSkKLQkJCXsKLQkJCSAgaW50IG9mZnNldCA9IGdpdmVuICYgMHhmZmY7Ci0JCQkgIAotCQkJICBmdW5jIChzdHJlYW0sICJbcGMiKTsKLSAKLQkJCSAgaWYgKGdpdmVuICYgMHgwMTAwMDAwMCkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQlvZmZzZXQgPSAtIG9mZnNldDsKLQkJCSAgCi0JCQkgICAgICAvKiBwcmUtaW5kZXhlZCAqLwotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiLCAjJXhdIiwgb2Zmc2V0KTsKLQotCQkJICAgICAgb2Zmc2V0ICs9IHBjICsgODsKLQotCQkJICAgICAgLyogQ29wZSB3aXRoIHRoZSBwb3NzaWJpbGl0eSBvZiB3cml0ZS1iYWNrIGJlaW5nIHVzZWQuCi0JCQkJIFByb2JhYmx5IGEgdmVyeSBkYW5nZXJvdXMgdGhpbmcgZm9yIHRoZSBwcm9ncmFtbWVyCi0JCQkJIHRvIGRvLCBidXQgd2hvIGFyZSB3ZSB0byBhcmd1ZSA/ICAqLwotCQkJICAgICAgaWYgKGdpdmVuICYgMHgwMDIwMDAwMCkKLQkJCQlmdW5jIChzdHJlYW0sICIhIik7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgLyogcG9zdCBpbmRleGVkICovCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICJdLCAjJXgiLCBvZmZzZXQpOwotCi0JCQkgICAgICBvZmZzZXQgPSBwYyArIDg7ICAvKiBpZSBpZ25vcmUgdGhlIG9mZnNldCAqLwotCQkJICAgIH0KLQkJCSAgCi0JCQkgIGZ1bmMgKHN0cmVhbSwgIlx0OyAiKTsKLQkJCSAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIChvZmZzZXQsIGluZm8pOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIlslcyIsIAotCQkJCWFybV9yZWduYW1lc1soZ2l2ZW4gPj4gMTYpICYgMHhmXSk7Ci0JCQkgIGlmICgoZ2l2ZW4gJiAweDAxMDAwMDAwKSAhPSAwKQotCQkJICAgIHsKLQkJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAyMDAwMDAwKSA9PSAwKQotCQkJCXsKLQkJCQkgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmZmOwotCQkJCSAgaWYgKG9mZnNldCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiLCAlcyMlZCIsCi0JCQkJCSAgKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJCQkgICA/ICItIiA6ICIiKSwgb2Zmc2V0KTsKLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotCQkJCSAgZnVuYyAoc3RyZWFtLCAiLCAlcyIsCi0JCQkJCSgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJID8gIi0iIDogIiIpKTsKLQkJCQkgIGFybV9kZWNvZGVfc2hpZnQgKGdpdmVuLCBmdW5jLCBzdHJlYW0pOwotCQkJCX0KLQotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiXSVzIiwgCi0JCQkJICAgICgoZ2l2ZW4gJiAweDAwMjAwMDAwKSAhPSAwKSA/ICIhIiA6ICIiKTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMjAwMDAwMCkgPT0gMCkKLQkJCQl7Ci0JCQkJICBpbnQgb2Zmc2V0ID0gZ2l2ZW4gJiAweGZmZjsKLQkJCQkgIGlmIChvZmZzZXQpCi0JCQkJICAgIGZ1bmMgKHN0cmVhbSwgIl0sICVzIyVkIiwKLQkJCQkJICAoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkJCSAgID8gIi0iIDogIiIpLCBvZmZzZXQpOwotCQkJCSAgZWxzZSAKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXSIpOwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICBmdW5jIChzdHJlYW0sICJdLCAlcyIsCi0JCQkJCSgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkgCi0JCQkJCSA/ICItIiA6ICIiKSk7Ci0JCQkJICBhcm1fZGVjb2RlX3NoaWZ0IChnaXZlbiwgZnVuYywgc3RyZWFtKTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKChnaXZlbiAmIDB4MDA0ZjAwMDApID09IDB4MDA0ZjAwMDApCi0JCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBDIHJlbGF0aXZlIHdpdGggaW1tZWRpYXRlIG9mZnNldCAqLwotCQkJICBpbnQgb2Zmc2V0ID0gKChnaXZlbiAmIDB4ZjAwKSA+PiA0KSB8IChnaXZlbiAmIDB4Zik7Ci0JCQkgIGlmICgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJICAgIG9mZnNldCA9IC1vZmZzZXQ7Ci0JCQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCQkJICAgIChvZmZzZXQgKyBwYyArIDgsIGluZm8pOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIlslcyIsIAotCQkJCWFybV9yZWduYW1lc1soZ2l2ZW4gPj4gMTYpICYgMHhmXSk7Ci0JCQkgIGlmICgoZ2l2ZW4gJiAweDAxMDAwMDAwKSAhPSAwKQotCQkJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZS1pbmRleGVkICovCi0JCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMDQwMDAwMCkgPT0gMHgwMDQwMDAwMCkKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tZWRpYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9ICgoZ2l2ZW4gJiAweGYwMCkgPj4gNCkgfCAoZ2l2ZW4gJiAweGYpOwotCQkJCSAgaWYgKG9mZnNldCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiLCAlcyMlZCIsCi0JCQkJCSAgKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJCQkgICA/ICItIiA6ICIiKSwgb2Zmc2V0KTsKLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyICovCi0JCQkJICBmdW5jIChzdHJlYW0sICIsICVzJXMiLAotCQkJCQkoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkJCSA/ICItIiA6ICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1fcmVnbmFtZXNbZ2l2ZW4gJiAweGZdKTsKLQkJCQl9Ci0KLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIl0lcyIsIAotCQkJCSAgICAoKGdpdmVuICYgMHgwMDIwMDAwMCkgIT0gMCkgPyAiISIgOiAiIik7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdC1pbmRleGVkICovCi0JCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMDQwMDAwMCkgPT0gMHgwMDQwMDAwMCkKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tZWRpYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9ICgoZ2l2ZW4gJiAweGYwMCkgPj4gNCkgfCAoZ2l2ZW4gJiAweGYpOwotCQkJCSAgaWYgKG9mZnNldCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXSwgJXMjJWQiLAotCQkJCQkgICgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJICAgPyAiLSIgOiAiIiksIG9mZnNldCk7Ci0JCQkJICBlbHNlIAotCQkJCSAgICBmdW5jIChzdHJlYW0sICJdIik7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciAqLwotCQkJCSAgZnVuYyAoc3RyZWFtLCAiXSwgJXMlcyIsCi0JCQkJCSgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJID8gIi0iIDogIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybV9yZWduYW1lc1tnaXZlbiAmIDB4Zl0pOwotCQkJCX0KLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkJICAKLQkJICAgIGNhc2UgJ2InOgotCQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkJCShCRElTUCAoZ2l2ZW4pICogNCArIHBjICsgOCwgaW5mbyk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdjJzoKLQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLAotCQkJICAgIGFybV9jb25kaXRpb25hbCBbKGdpdmVuID4+IDI4KSAmIDB4Zl0pOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnbSc6Ci0JCSAgICAgIHsKLQkJCWludCBzdGFydGVkID0gMDsKLQkJCWludCByZWc7Ci0KLQkJCWZ1bmMgKHN0cmVhbSwgInsiKTsKLQkJCWZvciAocmVnID0gMDsgcmVnIDwgMTY7IHJlZysrKQotCQkJICBpZiAoKGdpdmVuICYgKDEgPDwgcmVnKSkgIT0gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoc3RhcnRlZCkKLQkJCQlmdW5jIChzdHJlYW0sICIsICIpOwotCQkJICAgICAgc3RhcnRlZCA9IDE7Ci0JCQkgICAgICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tyZWddKTsKLQkJCSAgICB9Ci0JCQlmdW5jIChzdHJlYW0sICJ9Iik7Ci0JCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ28nOgotCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMjAwMDAwMCkgIT0gMCkKLQkJCXsKLQkJCSAgaW50IHJvdGF0ZSA9IChnaXZlbiAmIDB4ZjAwKSA+PiA3OwotCQkJICBpbnQgaW1tZWQgPSAoZ2l2ZW4gJiAweGZmKTsKLQkJCSAgZnVuYyAoc3RyZWFtLCAiIyVkIiwKLQkJCQkoKGltbWVkIDw8ICgzMiAtIHJvdGF0ZSkpCi0JCQkJIHwgKGltbWVkID4+IHJvdGF0ZSkpICYgMHhmZmZmZmZmZik7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCWFybV9kZWNvZGVfc2hpZnQgKGdpdmVuLCBmdW5jLCBzdHJlYW0pOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAncCc6Ci0JCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAwMDBmMDAwKSA9PSAweDAwMDBmMDAwKQotCQkJZnVuYyAoc3RyZWFtLCAicCIpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAndCc6Ci0JCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAxMjAwMDAwKSA9PSAweDAwMjAwMDAwKQotCQkJZnVuYyAoc3RyZWFtLCAidCIpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnaCc6Ci0JCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAwMDAwMDIwKSA9PSAweDAwMDAwMDIwKQotCQkJZnVuYyAoc3RyZWFtLCAiaCIpOwotICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgImIiKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ0EnOgotCQkgICAgICBmdW5jIChzdHJlYW0sICJbJXMiLCBhcm1fcmVnbmFtZXMgWyhnaXZlbiA+PiAxNikgJiAweGZdKTsKLQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDEwMDAwMDApICE9IDApCi0JCQl7Ci0JCQkgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmY7Ci0JCQkgIGlmIChvZmZzZXQpCi0JCQkgICAgZnVuYyAoc3RyZWFtLCAiLCAlcyMlZF0lcyIsCi0JCQkJICAoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCA/ICItIiA6ICIiKSwKLQkJCQkgIG9mZnNldCAqIDQsCi0JCQkJICAoKGdpdmVuICYgMHgwMDIwMDAwMCkgIT0gMCA/ICIhIiA6ICIiKSk7Ci0JCQkgIGVsc2UKLQkJCSAgICBmdW5jIChzdHJlYW0sICJdIik7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgaW50IG9mZnNldCA9IGdpdmVuICYgMHhmZjsKLQkJCSAgaWYgKG9mZnNldCkKLQkJCSAgICBmdW5jIChzdHJlYW0sICJdLCAlcyMlZCIsCi0JCQkJICAoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCA/ICItIiA6ICIiKSwKLQkJCQkgIG9mZnNldCAqIDQpOwotCQkJICBlbHNlCi0JCQkgICAgZnVuYyAoc3RyZWFtLCAiXSIpOwotCQkJfQotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnQyc6Ci0JCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDAwMDkwMDAwKQotCQkJewotCQkJZGVmYXVsdDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiXz8/PyIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg5MDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiX2FsbCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHgxMDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiX2N0bCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg4MDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiX2ZsZyIpOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ0YnOgotCQkgICAgICBzd2l0Y2ggKGdpdmVuICYgMHgwMDQwODAwMCkKLQkJCXsKLQkJCWNhc2UgMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiNCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg4MDAwOgotCQkJICBmdW5jIChzdHJlYW0sICIxIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDAwNDAwMDAwOgotCQkJICBmdW5jIChzdHJlYW0sICIyIik7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiMyIpOwotCQkJfQotCQkgICAgICBicmVhazsKLQkJCQotCQkgICAgY2FzZSAnUCc6Ci0JCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDAwMDgwMDgwKQotCQkJewotCQkJY2FzZSAwOgotCQkJICBmdW5jIChzdHJlYW0sICJzIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDgwOgotCQkJICBmdW5jIChzdHJlYW0sICJkIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDAwMDgwMDAwOgotCQkJICBmdW5jIChzdHJlYW0sICJlIik7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgZnVuYyAoc3RyZWFtLCBfKCI8aWxsZWdhbCBwcmVjaXNpb24+IikpOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdRJzoKLQkJICAgICAgc3dpdGNoIChnaXZlbiAmIDB4MDA0MDgwMDApCi0JCQl7Ci0JCQljYXNlIDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgInMiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4ODAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiZCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHgwMDQwMDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiZSIpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgInAiKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnUic6Ci0JCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDYwKQotCQkJewotCQkJY2FzZSAwOgotCQkJICBicmVhazsKLQkJCWNhc2UgMHgyMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAicCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg0MDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAibSIpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgInoiKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IAotCQkgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotCQkgICAgICB7Ci0JCQlpbnQgYml0c3RhcnQgPSAqYysrIC0gJzAnOwotCQkJaW50IGJpdGVuZCA9IDA7Ci0JCQl3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLQkJCSAgYml0c3RhcnQgPSAoYml0c3RhcnQgKiAxMCkgKyAqYysrIC0gJzAnOwotCi0JCQlzd2l0Y2ggKCpjKQotCQkJICB7Ci0JCQkgIGNhc2UgJy0nOgotCQkJICAgIGMrKzsKLQkJCSAgICB3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLQkJCSAgICAgIGJpdGVuZCA9IChiaXRlbmQgKiAxMCkgKyAqYysrIC0gJzAnOwotCQkJICAgIGlmICghYml0ZW5kKQotCQkJICAgICAgYWJvcnQgKCk7Ci0JCQkgICAgc3dpdGNoICgqYykKLQkJCSAgICAgIHsKLQkJCSAgICAgIGNhc2UgJ3InOgotCQkJCXsKLQkJCQkgIGxvbmcgcmVnOwotCQkJCSAgcmVnID0gZ2l2ZW4gPj4gYml0c3RhcnQ7Ci0JCQkJICByZWcgJj0gKDIgPDwgKGJpdGVuZCAtIGJpdHN0YXJ0KSkgLSAxOwotCQkJCSAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSAnZCc6Ci0JCQkJewotCQkJCSAgbG9uZyByZWc7Ci0JCQkJICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKLQkJCQkgIHJlZyAmPSAoMiA8PCAoYml0ZW5kIC0gYml0c3RhcnQpKSAtIDE7Ci0JCQkJICBmdW5jIChzdHJlYW0sICIlZCIsIHJlZyk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSAneCc6Ci0JCQkJewotCQkJCSAgbG9uZyByZWc7Ci0JCQkJICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKLQkJCQkgIHJlZyAmPSAoMiA8PCAoYml0ZW5kIC0gYml0c3RhcnQpKSAtIDE7Ci0JCQkJICBmdW5jIChzdHJlYW0sICIweCUwOHgiLCByZWcpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCSAgICAgIGNhc2UgJ2YnOgotCQkJCXsKLQkJCQkgIGxvbmcgcmVnOwotCQkJCSAgcmVnID0gZ2l2ZW4gPj4gYml0c3RhcnQ7Ci0JCQkJICByZWcgJj0gKDIgPDwgKGJpdGVuZCAtIGJpdHN0YXJ0KSkgLSAxOwotCQkJCSAgaWYgKHJlZyA+IDcpCi0JCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiMlcyIsCi0JCQkJCSAgYXJtX2ZwX2NvbnN0W3JlZyAmIDddKTsKLQkJCQkgIGVsc2UKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiZiVkIiwgcmVnKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBkZWZhdWx0OgotCQkJCWFib3J0ICgpOwotCQkJICAgICAgfQotCQkJICAgIGJyZWFrOwotCQkJICBjYXNlICdgJzoKLQkJCSAgICBjKys7Ci0JCQkgICAgaWYgKChnaXZlbiAmICgxIDw8IGJpdHN0YXJ0KSkgPT0gMCkKLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOwotCQkJICAgIGJyZWFrOwotCQkJICBjYXNlICdcJyc6Ci0JCQkgICAgYysrOwotCQkJICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCBiaXRzdGFydCkpICE9IDApCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKTsKLQkJCSAgICBicmVhazsKLQkJCSAgY2FzZSAnPyc6Ci0JCQkgICAgKytjOwotCQkJICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCBiaXRzdGFydCkpICE9IDApCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKyspOwotCQkJICAgIGVsc2UKLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKisrYyk7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGRlZmF1bHQ6Ci0JCQkgICAgYWJvcnQgKCk7Ci0JCQkgIH0KLQkJCWJyZWFrOwotCi0JCSAgICAgIGRlZmF1bHQ6Ci0JCQlhYm9ydCAoKTsKLQkJICAgICAgfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQlmdW5jIChzdHJlYW0sICIlYyIsICpjKTsKLQkgICAgfQotCSAgcmV0dXJuIDQ7Ci0JfQotICAgIH0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIFBDIG9uIElORk8tPlNUUkVBTS4KLSAgIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fdGh1bWIgKHBjLCBpbmZvLCBnaXZlbikKLSAgICAgYmZkX3ZtYSAgICAgICAgIHBjOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgbG9uZyBnaXZlbjsKLXsKLSAgc3RydWN0IHRodW1iX29wY29kZSAqaW5zbjsKLSAgdm9pZCAqc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICBmcHJpbnRmX2Z0eXBlIGZ1bmMgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0KLSAgZm9yIChpbnNuID0gdGh1bWJfb3Bjb2RlczsgaW5zbi0+YXNzZW1ibGVyOyBpbnNuKyspCi0gICAgewotICAgICAgaWYgKChnaXZlbiAmIGluc24tPm1hc2spID09IGluc24tPnZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhciAqYyA9IGluc24tPmFzc2VtYmxlcjsKLQotICAgICAgICAgIC8qIFNwZWNpYWwgcHJvY2Vzc2luZyBmb3IgVGh1bWIgMiBpbnN0cnVjdGlvbiBCTCBzZXF1ZW5jZTogKi8KLSAgICAgICAgICBpZiAoISpjKSAvKiBjaGVjayBmb3IgZW1wdHkgKG5vdCBOVUxMKSBhc3NlbWJsZXIgc3RyaW5nICovCi0gICAgICAgICAgICB7Ci0JICAgICAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gNDsKLQkgICAgICBpbmZvLT5ieXRlc19wZXJfbGluZSAgPSA0OwotCSAgICAgIAotICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlMDR4XHRibFx0IiwgZ2l2ZW4gJiAweGZmZmYpOwotICAgICAgICAgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLSAgICAgICAgICAgICAgICAoQkRJU1AyMyAoZ2l2ZW4pICogMiArIHBjICsgNCwgaW5mbyk7Ci0gICAgICAgICAgICAgIHJldHVybiA0OwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLQkgICAgICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSAyOwotCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9saW5lICA9IDQ7Ci0JICAJICAgICAgCi0gICAgICAgICAgICAgIGdpdmVuICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJTA0eFx0IiwgZ2l2ZW4pOwotICAgICAgICAgICAgICBmb3IgKDsgKmM7IGMrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoKmMgPT0gJyUnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgaW50IGRvbWFza3BjID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9tYXNrbHIgPSAwOwotICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKisrYykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyUnOgotICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlJSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJlZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSAoZ2l2ZW4gPj4gMykgJiAweDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdpdmVuICYgKDEgPDwgNikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgKz0gODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tyZWddKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJlZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBnaXZlbiAmIDB4NzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2l2ZW4gJiAoMSA8PCA3KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnICs9IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1QnOgotICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybV9jb25kaXRpb25hbCBbKGdpdmVuID4+IDgpICYgMHhmXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdOJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdpdmVuICYgKDEgPDwgOCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYXNrbHIgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ08nOgotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmMgPT0gJ08nICYmIChnaXZlbiAmICgxIDw8IDgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21hc2twYyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRlZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICJ7Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBzcG90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VzLCBhbmQgZ2VuZXJhdGUgdGhlIHJTLXJFIGZvcm1hdDogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHJlZyA9IDA7IChyZWcgPCA4KTsgcmVnKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGdpdmVuICYgKDEgPDwgcmVnKSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tyZWddKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbWFza2xyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIsICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAibHIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb21hc2twYykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAicGMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIn0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHN0YXJ0ID0gKmMrKyAtICcwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0ZW5kID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0YXJ0ID0gKGJpdHN0YXJ0ICogMTApICsgKmMrKyAtICcwJzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKmMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICctJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcmVnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdGVuZCA9IChiaXRlbmQgKiAxMCkgKyAqYysrIC0gJzAnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYml0ZW5kKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gZ2l2ZW4gPj4gYml0c3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnICY9ICgyIDw8IChiaXRlbmQgLSBiaXRzdGFydCkpIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCpjKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncic6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0gnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlZCIsIHJlZyA8PCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1cnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlZCIsIHJlZyA8PCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2EnOgotCQkJCSAgICAgIC8qIFBDLXJlbGF0aXZlIGFkZHJlc3MgLS0gdGhlIGJvdHRvbSB0d28KLQkJCQkJIGJpdHMgb2YgdGhlIGFkZHJlc3MgYXJlIGRyb3BwZWQgYmVmb3JlCi0JCQkJCSB0aGUgY2FsY3VsYXRpb24uICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMKLQkJCQkJKCgocGMgKyA0KSAmIH4zKSArIChyZWcgPDwgMiksIGluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIjB4JTA0eCIsIHJlZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdJJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gKChyZWcgXiAoMSA8PCBiaXRlbmQpKSAtICgxIDw8IGJpdGVuZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlZCIsIHJlZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdCJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gKChyZWcgXiAoMSA8PCBiaXRlbmQpKSAtICgxIDw8IGJpdGVuZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVnICogMiArIHBjICsgNCwgaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChnaXZlbiAmICgxIDw8IGJpdHN0YXJ0KSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJz8nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCBiaXRzdGFydCkpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqYysrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKisrYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICB9Ci0gICAgfQotCi0gIC8qIG5vIG1hdGNoICovCi0gIGFib3J0ICgpOwotfQotCi0vKiBOT1RFOiBUaGVyZSBhcmUgbm8gY2hlY2tzIGluIHRoZXNlIHJvdXRpbmVzIHRoYXQgdGhlIHJlbGV2YW50IG51bWJlciBvZiBkYXRhIGJ5dGVzIGV4aXN0ICovCi0KLWludAotcHJpbnRfaW5zbl9iaWdfYXJtIChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHVuc2lnbmVkIGNoYXIgICAgICBiWzRdOwotICBsb25nICAgICAgICAgICAgICAgZ2l2ZW47Ci0gIGludCAgICAgICAgICAgICAgICBzdGF0dXM7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgICAqY3M7Ci0gIGVsZl9zeW1ib2xfdHlwZSAgICAqZXM7Ci0gIGludCAgICAgICAgICAgICAgICBpc190aHVtYjsKLSAgCi0gIGlzX3RodW1iID0gZmFsc2U7Ci0gIGlmIChpbmZvLT5zeW1ib2xzICE9IE5VTEwpCi0gICAgewotICAgIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyICgqaW5mby0+c3ltYm9scykgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0gICAgIHsKLSAgICAgICBjcyA9IGNvZmZzeW1ib2wgKCppbmZvLT5zeW1ib2xzKTsKLSAgICAgICBpc190aHVtYiA9IChjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CRVhUCi0gICAgICAgICAgICAgICAgICAgfHwgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQlNUQVQKLSAgICAgICAgICAgICAgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CTEFCRUwKLSAgICAgICAgICAgICAgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CRVhURlVOQwotICAgICAgICAgICAgICAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJTVEFURlVOQyk7Ci0gIAotICAgICB9Ci0gICAgZWxzZSBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoKmluZm8tPnN5bWJvbHMpID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgIHsKLSAgICAgICBlcyA9ICooZWxmX3N5bWJvbF90eXBlICoqKShpbmZvLT5zeW1ib2xzKTsKLSAgICAgICBpc190aHVtYiA9IEVMRl9TVF9UWVBFIChlcy0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvKSA9PQotCSBTVFRfQVJNX1RGVU5DOwotICAgICAgfQotICAgfQotCi0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDQ7Ci0gIGluZm8tPmRpc3BsYXlfZW5kaWFuID0gQkZEX0VORElBTl9CSUc7Ci0KLSAgLyogQWx3YXlzIGZldGNoIHdvcmQgYWxpZ25lZCB2YWx1ZXMuICAqLwotICAKLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocGMgJiB+IDB4MywgKGJmZF9ieXRlICopICZiWzBdLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHBjLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGlzX3RodW1iKQotICAgIHsKLSAgICAgIGlmIChwYyAmIDB4MikKLQl7Ci0JICBnaXZlbiA9IChiWzJdIDw8IDgpIHwgYlszXTsKLQotCSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAoKHBjICsgNCkgJiB+IDB4MywgKGJmZF9ieXRlICopIGIsIDQsIGluZm8pOwotCSAgaWYgKHN0YXR1cyAhPSAwKQotCSAgICB7Ci0JICAgICAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgcGMgKyA0LCBpbmZvKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQkgIAotCSAgZ2l2ZW4gfD0gKGJbMF0gPDwgMjQpIHwgKGJbMV0gPDwgMTYpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBnaXZlbiA9IChiWzBdIDw8IDgpIHwgYlsxXSB8IChiWzJdIDw8IDI0KSB8IChiWzNdIDw8IDE2KTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZ2l2ZW4gPSAoYlswXSA8PCAyNCkgfCAoYlsxXSA8PCAxNikgfCAoYlsyXSA8PCA4KSB8IChiWzNdKTsKLSAgICB9Ci0KLSAgaWYgKGlzX3RodW1iKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IHByaW50X2luc25fdGh1bWIgKHBjLCBpbmZvLCBnaXZlbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RhdHVzID0gcHJpbnRfaW5zbl9hcm0gKHBjLCBpbmZvLCBnaXZlbik7Ci0gICAgfQotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLWludAotcHJpbnRfaW5zbl9saXR0bGVfYXJtIChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOwotewotICB1bnNpZ25lZCBjaGFyICAgICAgYls0XTsKLSAgbG9uZyAgICAgICAgICAgICAgIGdpdmVuOwotICBpbnQgICAgICAgICAgICAgICAgc3RhdHVzOwotICBjb2ZmX3N5bWJvbF90eXBlICAgKmNzOwotICBlbGZfc3ltYm9sX3R5cGUgICAgKmVzOwotICBpbnQgICAgICAgICAgICAgICAgaXNfdGh1bWI7Ci0KLSAgaXNfdGh1bWIgPSBmYWxzZTsKLSAgaWYgKGluZm8tPnN5bWJvbHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKCppbmZvLT5zeW1ib2xzKSA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLSAgICAgewotICAgICAgIGNzID0gY29mZnN5bWJvbCAoKmluZm8tPnN5bWJvbHMpOwotICAgICAgIGlzX3RodW1iID0gKGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJFWFQKLSAgICAgICAgICAgICAgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CU1RBVAotICAgICAgICAgICAgICAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJMQUJFTAotICAgICAgICAgICAgICAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJFWFRGVU5DCi0gICAgICAgICAgICAgICAgICAgfHwgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQlNUQVRGVU5DKTsKLSAgCi0gICAgIH0KLSAgICBlbHNlIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyICgqaW5mby0+c3ltYm9scykgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICAgewotICAgICAgIGVzID0gKihlbGZfc3ltYm9sX3R5cGUgKiopKGluZm8tPnN5bWJvbHMpOwotICAgICAgIGlzX3RodW1iID0gRUxGX1NUX1RZUEUgKGVzLT5pbnRlcm5hbF9lbGZfc3ltLnN0X2luZm8pID09Ci0JIFNUVF9BUk1fVEZVTkM7Ci0gICAgICB9Ci0gICB9Ci0KLSAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gNDsKLSAgaW5mby0+ZGlzcGxheV9lbmRpYW4gPSBCRkRfRU5ESUFOX0xJVFRMRTsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwYywgKGJmZF9ieXRlICopICZiWzBdLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwICYmIGlzX3RodW1iKQotICAgIHsKLSAgICAgIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDI7Ci0KLSAgICAgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKHBjLCAoYmZkX2J5dGUgKikgYiwgMiwgaW5mbyk7Ci0gICAgICBiWzNdID0gYlsyXSA9IDA7Ci0gICAgfQotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBnaXZlbiA9IChiWzBdKSB8IChiWzFdIDw8IDgpIHwgKGJbMl0gPDwgMTYpIHwgKGJbM10gPDwgMjQpOwotCi0gIGlmIChpc190aHVtYikKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBwcmludF9pbnNuX3RodW1iIChwYywgaW5mbywgZ2l2ZW4pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0YXR1cyA9IHByaW50X2luc25fYXJtIChwYywgaW5mbywgZ2l2ZW4pOwotICAgIH0KLQotICByZXR1cm4gc3RhdHVzOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hcm0tb3BjLmggYi9vcGNvZGVzL2FybS1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ5Mjk4Zi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FybS1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKiBPcGNvZGUgdGFibGUgZm9yIHRoZSBBUk0uCi0KLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLXN0cnVjdCBhcm1fb3Bjb2RlIHsKLSAgICB1bnNpZ25lZCBsb25nIHZhbHVlLCBtYXNrOwkvKiByZWNvZ25pc2UgaW5zdHJ1Y3Rpb24gaWYgKG9wJm1hc2spPT12YWx1ZSAqLwotICAgIGNoYXIgKmFzc2VtYmxlcjsJCS8qIGhvdyB0byBkaXNhc3NlbWJsZSB0aGlzIGluc3RydWN0aW9uICovCi19OwotCi1zdHJ1Y3QgdGh1bWJfb3Bjb2RlCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgdmFsdWUsIG1hc2s7CS8qIHJlY29nbmlzZSBpbnN0cnVjdGlvbiBpZiAob3AmbWFzayk9PXZhbHVlICovCi0gICAgY2hhciAqIGFzc2VtYmxlcjsJCS8qIGhvdyB0byBkaXNhc3NlbWJsZSB0aGlzIGluc3RydWN0aW9uICovCi19OwotCi0vKiBmb3JtYXQgb2YgdGhlIGFzc2VtYmxlciBzdHJpbmcgOgotICAgCi0gICAlJQkJCSUKLSAgICU8Yml0ZmllbGQ+ZAkJcHJpbnQgdGhlIGJpdGZpZWxkIGluIGRlY2ltYWwKLSAgICU8Yml0ZmllbGQ+eAkJcHJpbnQgdGhlIGJpdGZpZWxkIGluIGhleAotICAgJTxiaXRmaWVsZD5yCQlwcmludCBhcyBhbiBBUk0gcmVnaXN0ZXIKLSAgICU8Yml0ZmllbGQ+ZgkJcHJpbnQgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBpZiA+NyBlbHNlIGEKLQkJCWZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyCi0gICAlYwkJCXByaW50IGNvbmRpdGlvbiBjb2RlIChhbHdheXMgYml0cyAyOC0zMSkKLSAgICVQCQkJcHJpbnQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uIGluIGFyaXRobWV0aWMgaW5zbgotICAgJVEJCQlwcmludCBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24gaW4gbGRmL3N0ZiBpbnNuCi0gICAlUgkJCXByaW50IGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIG1vZGUKLSAgICU8Yml0bnVtPidjCQlwcmludCBzcGVjaWZpZWQgY2hhciBpZmYgYml0IGlzIG9uZQotICAgJTxiaXRudW0+YGMJCXByaW50IHNwZWNpZmllZCBjaGFyIGlmZiBiaXQgaXMgemVybwotICAgJTxiaXRudW0+P2FiCQlwcmludCBhIGlmIGJpdCBpcyBvbmUgZWxzZSBwcmludCBiCi0gICAlcAkJCXByaW50ICdwJyBpZmYgYml0cyAxMi0xNSBhcmUgMTUKLSAgICV0CQkJcHJpbnQgJ3QnIGlmZiBiaXQgMjEgc2V0IGFuZCBiaXQgMjQgY2xlYXIKLSAgICVoICAgICAgICAgICAgICAgICAgIHByaW50ICdoJyBpZmYgYml0IDUgc2V0LCBlbHNlIHByaW50ICdiJwotICAgJW8JCQlwcmludCBvcGVyYW5kMiAoaW1tZWRpYXRlIG9yIHJlZ2lzdGVyICsgc2hpZnQpCi0gICAlYQkJCXByaW50IGFkZHJlc3MgZm9yIGxkci9zdHIgaW5zdHJ1Y3Rpb24KLSAgICVzICAgICAgICAgICAgICAgICAgIHByaW50IGFkZHJlc3MgZm9yIGxkci9zdHIgaGFsZndvcmQvc2lnbmV4dGVuZCBpbnN0cnVjdGlvbgotICAgJWIJCQlwcmludCBicmFuY2ggZGVzdGluYXRpb24KLSAgICVBCQkJcHJpbnQgYWRkcmVzcyBmb3IgbGRjL3N0Yy9sZGYvc3RmIGluc3RydWN0aW9uCi0gICAlbQkJCXByaW50IHJlZ2lzdGVyIG1hc2sgZm9yIGxkbS9zdG0gaW5zdHJ1Y3Rpb24KLSAgICVDCQkJcHJpbnQgdGhlIFBTUiBzdWIgdHlwZS4KLSAgICVGCQkJcHJpbnQgdGhlIENPVU5UIGZpZWxkIG9mIGEgTEZNL1NGTSBpbnN0cnVjdGlvbi4KLVRodW1iIHNwZWNpZmljIGZvcm1hdCBvcHRpb25zOgotICAgJUQgICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgKGJpdHMgMC4uMiBhcyBoaWdoIG51bWJlciBpZiBiaXQgNyBzZXQpCi0gICAlUyAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiByZWdpc3RlciAoYml0cyAzLi41IGFzIGhpZ2ggbnVtYmVyIGlmIGJpdCA2IHNldCkKLSAgICU8Yml0ZmllbGQ+SSAgICAgICAgIHByaW50IGJpdGZpZWxkIGFzIGEgc2lnbmVkIGRlY2ltYWwKLSAgIAkJCQkodG9wIGJpdCBvZiByYW5nZSBiZWluZyB0aGUgc2lnbiBiaXQpCi0gICAlTSAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiByZWdpc3RlciBtYXNrCi0gICAlTiAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiByZWdpc3RlciBtYXNrICh3aXRoIExSKQotICAgJU8gICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgbWFzayAod2l0aCBQQykKLSAgICVUICAgICAgICAgICAgICAgICAgIHByaW50IFRodW1iIGNvbmRpdGlvbiBjb2RlIChhbHdheXMgYml0cyA4LTExKQotICAgJTxiaXRmaWVsZD5CICAgICAgICAgcHJpbnQgVGh1bWIgYnJhbmNoIGRlc3RpbmF0aW9uIChzaWduZWQgZGlzcGxhY2VtZW50KQotICAgJTxiaXRmaWVsZD5XICAgICAgICAgcHJpbnQgKGJpdGZpZWxkICogNCkgYXMgYSBkZWNpbWFsCi0gICAlPGJpdGZpZWxkPkggICAgICAgICBwcmludCAoYml0ZmllbGQgKiAyKSBhcyBhIGRlY2ltYWwKLSAgICU8Yml0ZmllbGQ+YSAgICAgICAgIHByaW50IChiaXRmaWVsZCAqIDQpIGFzIGEgcGMtcmVsIG9mZnNldCArIGRlY29kZWQgc3ltYm9sCi0qLwotCi0vKiBOb3RlOiBUaGVyZSBpcyBhIHBhcnRpYWwgb3JkZXJpbmcgaW4gdGhpcyB0YWJsZSAtIGl0IG11c3QgYmUgc2VhcmNoZWQgZnJvbQotICAgdGhlIHRvcCB0byBvYnRhaW4gYSBjb3JyZWN0IG1hdGNoLiAqLwotCi1zdGF0aWMgc3RydWN0IGFybV9vcGNvZGUgYXJtX29wY29kZXNbXSA9IHsKLSAgICAvKiBBUk0gaW5zdHJ1Y3Rpb25zICovCi0gICAgezB4ZTFhMDAwMDAsIDB4ZmZmZmZmZmYsICJub3BcdFx0XHQobW92IHIwLHIwKSJ9LAotICAgIHsweDAxMkZGRjEwLCAweDBmZmZmZmYwLCAiYnglY1x0JTAtM3IifSwKLSAgICB7MHgwMDAwMDA5MCwgMHgwZmUwMDBmMCwgIm11bCVjJTIwJ3NcdCUxNi0xOXIsICUwLTNyLCAlOC0xMXIifSwKLSAgICB7MHgwMDIwMDA5MCwgMHgwZmUwMDBmMCwgIm1sYSVjJTIwJ3NcdCUxNi0xOXIsICUwLTNyLCAlOC0xMXIsICUxMi0xNXIifSwKLSAgICB7MHgwMTAwMDA5MCwgMHgwZmIwMGZmMCwgInN3cCVjJTIyJ2JcdCUxMi0xNXIsICUwLTNyLCBbJTE2LTE5cl0ifSwKLSAgICB7MHgwMDgwMDA5MCwgMHgwZmEwMDBmMCwgIiUyMj9zdW11bGwlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciwgJTgtMTFyIn0sCi0gICAgezB4MDBhMDAwOTAsIDB4MGZhMDAwZjAsICIlMjI/c3VtbGFsJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsICU4LTExciJ9LAotICAgIHsweDAwMDAwMDkwLCAweDBlMTAwMDkwLCAic3RyJWMlNidzJWhcdCUxMi0xNXIsICVzIn0sCi0gICAgezB4MDAxMDAwOTAsIDB4MGUxMDAwOTAsICJsZHIlYyU2J3MlaFx0JTEyLTE1ciwgJXMifSwKLSAgICB7MHgwMDAwMDAwMCwgMHgwZGUwMDAwMCwgImFuZCVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDAyMDAwMDAsIDB4MGRlMDAwMDAsICJlb3IlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAwNDAwMDAwLCAweDBkZTAwMDAwLCAic3ViJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMDYwMDAwMCwgMHgwZGUwMDAwMCwgInJzYiVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDA4MDAwMDAsIDB4MGRlMDAwMDAsICJhZGQlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAwYTAwMDAwLCAweDBkZTAwMDAwLCAiYWRjJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMGMwMDAwMCwgMHgwZGUwMDAwMCwgInNiYyVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDBlMDAwMDAsIDB4MGRlMDAwMDAsICJyc2MlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAxMjBmMDAwLCAweDBkYjZmMDAwLCAibXNyJWNcdCUyMj9zY3BzciVDLCAlbyJ9LAotICAgIHsweDAxMGYwMDAwLCAweDBmYmYwZmZmLCAibXJzJWNcdCUxMi0xNXIsICUyMj9zY3BzciJ9LAotICAgIHsweDAxMDAwMDAwLCAweDBkZTAwMDAwLCAidHN0JWMlcFx0JTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMTIwMDAwMCwgMHgwZGUwMDAwMCwgInRlcSVjJXBcdCUxNi0xOXIsICVvIn0sCi0gICAgezB4MDE0MDAwMDAsIDB4MGRlMDAwMDAsICJjbXAlYyVwXHQlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAxNjAwMDAwLCAweDBkZTAwMDAwLCAiY21uJWMlcFx0JTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMTgwMDAwMCwgMHgwZGUwMDAwMCwgIm9yciVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDFhMDAwMDAsIDB4MGRlMDAwMDAsICJtb3YlYyUyMCdzXHQlMTItMTVyLCAlbyJ9LAotICAgIHsweDAxYzAwMDAwLCAweDBkZTAwMDAwLCAiYmljJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMWUwMDAwMCwgMHgwZGUwMDAwMCwgIm12biVjJTIwJ3NcdCUxMi0xNXIsICVvIn0sCi0gICAgezB4MDQwMDAwMDAsIDB4MGUxMDAwMDAsICJzdHIlYyUyMidiJXRcdCUxMi0xNXIsICVhIn0sCi0gICAgezB4MDYwMDAwMDAsIDB4MGUxMDBmZjAsICJzdHIlYyUyMidiJXRcdCUxMi0xNXIsICVhIn0sCi0gICAgezB4MDQwMDAwMDAsIDB4MGMxMDAwMTAsICJzdHIlYyUyMidiJXRcdCUxMi0xNXIsICVhIn0sCi0gICAgezB4MDYwMDAwMTAsIDB4MGUwMDAwMTAsICJ1bmRlZmluZWQifSwKLSAgICB7MHgwNDEwMDAwMCwgMHgwYzEwMDAwMCwgImxkciVjJTIyJ2IldFx0JTEyLTE1ciwgJWEifSwKLSAgICB7MHgwODAwMDAwMCwgMHgwZTEwMDAwMCwgInN0bSVjJTIzP2lkJTI0P2JhXHQlMTYtMTlyJTIxJyEsICVtJTIyJ14ifSwKLSAgICB7MHgwODEwMDAwMCwgMHgwZTEwMDAwMCwgImxkbSVjJTIzP2lkJTI0P2JhXHQlMTYtMTlyJTIxJyEsICVtJTIyJ14ifSwKLSAgICB7MHgwYTAwMDAwMCwgMHgwZTAwMDAwMCwgImIlMjQnbCVjXHQlYiJ9LAotICAgIHsweDBmMDAwMDAwLCAweDBmMDAwMDAwLCAic3dpJWNcdCUwLTIzeCJ9LAotCi0gICAgLyogRmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zICovCi0gICAgezB4MGUwMDAxMDAsIDB4MGZmMDhmMTAsICJhZGYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGUxMDAxMDAsIDB4MGZmMDhmMTAsICJtdWYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGUyMDAxMDAsIDB4MGZmMDhmMTAsICJzdWYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGUzMDAxMDAsIDB4MGZmMDhmMTAsICJyc2YlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU0MDAxMDAsIDB4MGZmMDhmMTAsICJkdmYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU1MDAxMDAsIDB4MGZmMDhmMTAsICJyZGYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU2MDAxMDAsIDB4MGZmMDhmMTAsICJwb3clYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU3MDAxMDAsIDB4MGZmMDhmMTAsICJycHclYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU4MDAxMDAsIDB4MGZmMDhmMTAsICJybWYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU5MDAxMDAsIDB4MGZmMDhmMTAsICJmbWwlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGVhMDAxMDAsIDB4MGZmMDhmMTAsICJmZHYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGViMDAxMDAsIDB4MGZmMDhmMTAsICJmcmQlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGVjMDAxMDAsIDB4MGZmMDhmMTAsICJwb2wlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGUwMDgxMDAsIDB4MGZmMDhmMTAsICJtdmYlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGUxMDgxMDAsIDB4MGZmMDhmMTAsICJtbmYlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGUyMDgxMDAsIDB4MGZmMDhmMTAsICJhYnMlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGUzMDgxMDAsIDB4MGZmMDhmMTAsICJybmQlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU0MDgxMDAsIDB4MGZmMDhmMTAsICJzcXQlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU1MDgxMDAsIDB4MGZmMDhmMTAsICJsb2clYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU2MDgxMDAsIDB4MGZmMDhmMTAsICJsZ24lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU3MDgxMDAsIDB4MGZmMDhmMTAsICJleHAlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU4MDgxMDAsIDB4MGZmMDhmMTAsICJzaW4lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU5MDgxMDAsIDB4MGZmMDhmMTAsICJjb3MlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGVhMDgxMDAsIDB4MGZmMDhmMTAsICJ0YW4lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGViMDgxMDAsIDB4MGZmMDhmMTAsICJhc24lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGVjMDgxMDAsIDB4MGZmMDhmMTAsICJhY3MlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGVkMDgxMDAsIDB4MGZmMDhmMTAsICJhdG4lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGVlMDgxMDAsIDB4MGZmMDhmMTAsICJ1cmQlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGVmMDgxMDAsIDB4MGZmMDhmMTAsICJucm0lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGUwMDAxMTAsIDB4MGZmMDBmMWYsICJmbHQlYyVQJVJcdCUxNi0xOGYsICUxMi0xNXIifSwKLSAgICB7MHgwZTEwMDExMCwgMHgwZmZmMGY5OCwgImZpeCVjJVJcdCUxMi0xNXIsICUwLTJmIn0sCi0gICAgezB4MGUyMDAxMTAsIDB4MGZmZjBmZmYsICJ3ZnMlY1x0JTEyLTE1ciJ9LAotICAgIHsweDBlMzAwMTEwLCAweDBmZmYwZmZmLCAicmZzJWNcdCUxMi0xNXIifSwKLSAgICB7MHgwZTQwMDExMCwgMHgwZmZmMGZmZiwgIndmYyVjXHQlMTItMTVyIn0sCi0gICAgezB4MGU1MDAxMTAsIDB4MGZmZjBmZmYsICJyZmMlY1x0JTEyLTE1ciJ9LAotICAgIHsweDBlOTBmMTEwLCAweDBmZjhmZmYwLCAiY21mJWNcdCUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGViMGYxMTAsIDB4MGZmOGZmZjAsICJjbmYlY1x0JTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZWQwZjExMCwgMHgwZmY4ZmZmMCwgImNtZmUlY1x0JTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZWYwZjExMCwgMHgwZmY4ZmZmMCwgImNuZmUlY1x0JTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwYzAwMDEwMCwgMHgwZTEwMGYwMCwgInN0ZiVjJVFcdCUxMi0xNGYsICVBIn0sCi0gICAgezB4MGMxMDAxMDAsIDB4MGUxMDBmMDAsICJsZGYlYyVRXHQlMTItMTRmLCAlQSJ9LAotICAgIHsweDBjMDAwMjAwLCAweDBlMTAwZjAwLCAic2ZtJWNcdCUxMi0xNGYsICVGLCAlQSJ9LAotICAgIHsweDBjMTAwMjAwLCAweDBlMTAwZjAwLCAibGZtJWNcdCUxMi0xNGYsICVGLCAlQSJ9LAotCi0gICAgLyogR2VuZXJpYyBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgKi8KLSAgICB7MHgwZTAwMDAwMCwgMHgwZjAwMDAxMCwgImNkcCVjXHQlOC0xMWQsICUyMC0yM2QsIGNyJTEyLTE1ZCwgY3IlMTYtMTlkLCBjciUwLTNkLCB7JTUtN2R9In0sCi0gICAgezB4MGUxMDAwMTAsIDB4MGYxMDAwMTAsICJtcmMlY1x0JTgtMTFkLCAlMjEtMjNkLCAlMTItMTVyLCBjciUxNi0xOWQsIGNyJTAtM2QsIHslNS03ZH0ifSwKLSAgICB7MHgwZTAwMDAxMCwgMHgwZjEwMDAxMCwgIm1jciVjXHQlOC0xMWQsICUyMS0yM2QsICUxMi0xNXIsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSJ9LAotICAgIHsweDBjMDAwMDAwLCAweDBlMTAwMDAwLCAic3RjJWMlMjInbFx0JTgtMTFkLCBjciUxMi0xNWQsICVBIn0sCi0gICAgezB4MGMxMDAwMDAsIDB4MGUxMDAwMDAsICJsZGMlYyUyMidsXHQlOC0xMWQsIGNyJTEyLTE1ZCwgJUEifSwKLSAgICAvKiB0aGUgcmVzdCAqLwotICAgIHsweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAidW5kZWZpbmVkIGluc3RydWN0aW9uICUwLTMxeCJ9LAotICAgIHsweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfQotfTsKLQotI2RlZmluZSBCRElTUCh4KSAoKCgoeCkgJiAweGZmZmZmZikgXiAweDgwMDAwMCkgLSAweDgwMDAwMCkgLyogMjYgYml0ICovCi0KLXN0YXRpYyBzdHJ1Y3QgdGh1bWJfb3Bjb2RlIHRodW1iX29wY29kZXNbXSA9Ci17Ci0gIC8qIFRodW1iIGluc3RydWN0aW9ucyAqLwotICB7MHg0NkMwLCAweEZGRkYsICJub3BcdFx0XHQobW92IHI4LHI4KSJ9LCAvKiBmb3JtYXQgNSBpbnN0cnVjdGlvbnMgZG8gbm90IHVwZGF0ZSB0aGUgUFNSICovCi0gIHsweDFDMDAsIDB4RkZDMCwgIm1vdlx0JTAtMnIsICUzLTVyXHRcdChhZGQgJTAtMnIsICUzLTVyLCAjJTYtOGQpIn0sCi0gIC8qIGZvcm1hdCA0ICovCi0gIHsweDQwMDAsIDB4RkZDMCwgImFuZFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQwNDAsIDB4RkZDMCwgImVvclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQwODAsIDB4RkZDMCwgImxzbFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQwQzAsIDB4RkZDMCwgImxzclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQxMDAsIDB4RkZDMCwgImFzclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQxNDAsIDB4RkZDMCwgImFkY1x0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQxODAsIDB4RkZDMCwgInNiY1x0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQxQzAsIDB4RkZDMCwgInJvclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQyMDAsIDB4RkZDMCwgInRzdFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQyNDAsIDB4RkZDMCwgIm5lZ1x0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQyODAsIDB4RkZDMCwgImNtcFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQyQzAsIDB4RkZDMCwgImNtblx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQzMDAsIDB4RkZDMCwgIm9yclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQzNDAsIDB4RkZDMCwgIm11bFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQzODAsIDB4RkZDMCwgImJpY1x0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQzQzAsIDB4RkZDMCwgIm12blx0JTAtMnIsICUzLTVyIn0sCi0gIC8qIGZvcm1hdCAxMyAqLwotICB7MHhCMDAwLCAweEZGODAsICJhZGRcdHNwLCAjJTAtNlcifSwKLSAgezB4QjA4MCwgMHhGRjgwLCAic3ViXHRzcCwgIyUwLTZXIn0sCi0gIC8qIGZvcm1hdCA1ICovCi0gIHsweDQ3MDAsIDB4RkY4MCwgImJ4XHQlUyJ9LAotICB7MHg0NDAwLCAweEZGMDAsICJhZGRcdCVELCAlUyJ9LAotICB7MHg0NTAwLCAweEZGMDAsICJjbXBcdCVELCAlUyJ9LAotICB7MHg0NjAwLCAweEZGMDAsICJtb3ZcdCVELCAlUyJ9LAotICAvKiBmb3JtYXQgMTQgKi8KLSAgezB4QjQwMCwgMHhGRTAwLCAicHVzaFx0JU4ifSwKLSAgezB4QkMwMCwgMHhGRTAwLCAicG9wXHQlTyJ9LAotICAvKiBmb3JtYXQgMiAqLwotICB7MHgxODAwLCAweEZFMDAsICJhZGRcdCUwLTJyLCAlMy01ciwgJTYtOHIifSwKLSAgezB4MUEwMCwgMHhGRTAwLCAic3ViXHQlMC0yciwgJTMtNXIsICU2LThyIn0sCi0gIHsweDFDMDAsIDB4RkUwMCwgImFkZFx0JTAtMnIsICUzLTVyLCAjJTYtOGQifSwKLSAgezB4MUUwMCwgMHhGRTAwLCAic3ViXHQlMC0yciwgJTMtNXIsICMlNi04ZCJ9LAotICAvKiBmb3JtYXQgOCAqLwotICB7MHg1MjAwLCAweEZFMDAsICJzdHJoXHQlMC0yciwgWyUzLTVyLCAlNi04cl0ifSwKLSAgezB4NUEwMCwgMHhGRTAwLCAibGRyaFx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCi0gIHsweDU2MDAsIDB4RjYwMCwgImxkcyUxMT9oYlx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCi0gIC8qIGZvcm1hdCA3ICovCi0gIHsweDUwMDAsIDB4RkEwMCwgInN0ciUxMCdiXHQlMC0yciwgWyUzLTVyLCAlNi04cl0ifSwKLSAgezB4NTgwMCwgMHhGQTAwLCAibGRyJTEwJ2JcdCUwLTJyLCBbJTMtNXIsICU2LThyXSJ9LAotICAvKiBmb3JtYXQgMSAqLwotICB7MHgwMDAwLCAweEY4MDAsICJsc2xcdCUwLTJyLCAlMy01ciwgIyU2LTEwZCJ9LAotICB7MHgwODAwLCAweEY4MDAsICJsc3JcdCUwLTJyLCAlMy01ciwgIyU2LTEwZCJ9LAotICB7MHgxMDAwLCAweEY4MDAsICJhc3JcdCUwLTJyLCAlMy01ciwgIyU2LTEwZCJ9LAotICAvKiBmb3JtYXQgMyAqLwotICB7MHgyMDAwLCAweEY4MDAsICJtb3ZcdCU4LTEwciwgIyUwLTdkIn0sCi0gIHsweDI4MDAsIDB4RjgwMCwgImNtcFx0JTgtMTByLCAjJTAtN2QifSwKLSAgezB4MzAwMCwgMHhGODAwLCAiYWRkXHQlOC0xMHIsICMlMC03ZCJ9LAotICB7MHgzODAwLCAweEY4MDAsICJzdWJcdCU4LTEwciwgIyUwLTdkIn0sCi0gIC8qIGZvcm1hdCA2ICovCi0gIHsweDQ4MDAsIDB4RjgwMCwgImxkclx0JTgtMTByLCBbcGMsICMlMC03V11cdCglMC03YSkifSwgIC8qIFRPRE86IERpc2Fzc2VtYmxlIFBDIHJlbGF0aXZlICJMRFIgckQsPTxzeW1ib2xpYz4iICovCi0gIC8qIGZvcm1hdCA5ICovCi0gIHsweDYwMDAsIDB4RjgwMCwgInN0clx0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKLSAgezB4NjgwMCwgMHhGODAwLCAibGRyXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBXXSJ9LAotICB7MHg3MDAwLCAweEY4MDAsICJzdHJiXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBkXSJ9LAotICB7MHg3ODAwLCAweEY4MDAsICJsZHJiXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBkXSJ9LAotICAvKiBmb3JtYXQgMTAgKi8KLSAgezB4ODAwMCwgMHhGODAwLCAic3RyaFx0JTAtMnIsIFslMy01ciwgIyU2LTEwSF0ifSwKLSAgezB4ODgwMCwgMHhGODAwLCAibGRyaFx0JTAtMnIsIFslMy01ciwgIyU2LTEwSF0ifSwKLSAgLyogZm9ybWF0IDExICovCi0gIHsweDkwMDAsIDB4RjgwMCwgInN0clx0JTgtMTByLCBbc3AsICMlMC03V10ifSwKLSAgezB4OTgwMCwgMHhGODAwLCAibGRyXHQlOC0xMHIsIFtzcCwgIyUwLTdXXSJ9LAotICAvKiBmb3JtYXQgMTIgKi8KLSAgezB4QTAwMCwgMHhGODAwLCAiYWRkXHQlOC0xMHIsIHBjLCAjJTAtN1dcdChhZHIgJTgtMTByLCUwLTdhKSJ9LAotICB7MHhBODAwLCAweEY4MDAsICJhZGRcdCU4LTEwciwgc3AsICMlMC03VyJ9LAotICAvKiBmb3JtYXQgMTUgKi8KLSAgezB4QzAwMCwgMHhGODAwLCAic3RtaWFcdCU4LTEwciEsJU0ifSwKLSAgezB4QzgwMCwgMHhGODAwLCAibGRtaWFcdCU4LTEwciEsJU0ifSwKLSAgLyogZm9ybWF0IDE4ICovCi0gIHsweEUwMDAsIDB4RjgwMCwgImJcdCUwLTEwQiJ9LAotICB7MHhFODAwLCAweEY4MDAsICJ1bmRlZmluZWQifSwKLSAgLyogZm9ybWF0IDE5ICovCi0gIHsweEYwMDAsIDB4RjgwMCwgIiJ9LCAvKiBzcGVjaWFsIHByb2Nlc3NpbmcgcmVxdWlyZWQgaW4gZGlzYXNzZW1ibGVyICovCi0gIHsweEY4MDAsIDB4RjgwMCwgInNlY29uZCBoYWxmIG9mIEJMIGluc3RydWN0aW9uICUwLTE1eCJ9LAotICAvKiBmb3JtYXQgMTYgKi8KLSAgezB4RDAwMCwgMHhGRjAwLCAiYmVxXHQlMC03QiJ9LAotICB7MHhEMTAwLCAweEZGMDAsICJibmVcdCUwLTdCIn0sCi0gIHsweEQyMDAsIDB4RkYwMCwgImJjc1x0JTAtN0IifSwKLSAgezB4RDMwMCwgMHhGRjAwLCAiYmNjXHQlMC03QiJ9LAotICB7MHhENDAwLCAweEZGMDAsICJibWlcdCUwLTdCIn0sCi0gIHsweEQ1MDAsIDB4RkYwMCwgImJwbFx0JTAtN0IifSwKLSAgezB4RDYwMCwgMHhGRjAwLCAiYnZzXHQlMC03QiJ9LAotICB7MHhENzAwLCAweEZGMDAsICJidmNcdCUwLTdCIn0sCi0gIHsweEQ4MDAsIDB4RkYwMCwgImJoaVx0JTAtN0IifSwKLSAgezB4RDkwMCwgMHhGRjAwLCAiYmxzXHQlMC03QiJ9LAotICB7MHhEQTAwLCAweEZGMDAsICJiZ2VcdCUwLTdCIn0sCi0gIHsweERCMDAsIDB4RkYwMCwgImJsdFx0JTAtN0IifSwKLSAgezB4REMwMCwgMHhGRjAwLCAiYmd0XHQlMC03QiJ9LAotICB7MHhERDAwLCAweEZGMDAsICJibGVcdCUwLTdCIn0sCi0gIC8qIGZvcm1hdCAxNyAqLwotICB7MHhERTAwLCAweEZGMDAsICJ1bmRlZmluZWQifSwKLSAgezB4REYwMCwgMHhGRjAwLCAic3dpXHQlMC03ZCJ9LAotICAvKiBmb3JtYXQgOSAqLwotICB7MHg2MDAwLCAweEY4MDAsICJzdHJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMFddIn0sCi0gIHsweDY4MDAsIDB4RjgwMCwgImxkclx0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKLSAgezB4NzAwMCwgMHhGODAwLCAic3RyYlx0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKLSAgezB4NzgwMCwgMHhGODAwLCAibGRyYlx0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKLSAgLyogdGhlIHJlc3QgKi8KLSAgezB4MDAwMCwgMHgwMDAwLCAidW5kZWZpbmVkIGluc3RydWN0aW9uICUwLTE1eCJ9LAotICB7MHgwMDAwLCAweDAwMDAsIDB9Ci19OwotCi0jZGVmaW5lIEJESVNQMjMoeCkgKCgoKCgoeCkgJiAweDA3ZmYpIDw8IDExKSB8ICgoKHgpICYgMHgwN2ZmMDAwMCkgPj4gMTYpKSBcCi0gICAgICAgICAgICAgICAgICAgICBeIDB4MjAwMDAwKSAtIDB4MjAwMDAwKSAvKiAyM2JpdCAqLwotCmRpZmYgLS1naXQgYS9vcGNvZGVzL2NnZW4tYXNtLmMgYi9vcGNvZGVzL2NnZW4tYXNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZDY5MzYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jZ2VuLWFzbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qIENHRU4gZ2VuZXJpYyBhc3NlbWJsZXIgc3VwcG9ydCBjb2RlLgotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm9wY29kZS9jZ2VuLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIFNldCB0aGUgY2dlbl9wYXJzZV9vcGVyYW5kX2ZuIGNhbGxiYWNrLiAgKi8KLQotdm9pZAotY2dlbl9zZXRfcGFyc2Vfb3BlcmFuZF9mbiAoY2QsIGZuKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjZ2VuX3BhcnNlX29wZXJhbmRfZm4gZm47Ci17Ci0gIGNkLT5wYXJzZV9vcGVyYW5kX2ZuID0gZm47Ci19Ci0KLS8qIENhbGxlZCB3aGVuZXZlciBzdGFydGluZyB0byBwYXJzZSBhbiBpbnNuLiAgKi8KLQotdm9pZAotY2dlbl9pbml0X3BhcnNlX29wZXJhbmQgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICAvKiBUaGlzIHRlbGxzIHRoZSBjYWxsYmFjayB0byByZS1pbml0aWFsaXplLiAgKi8KLSAgKHZvaWQpICgqIGNkLT5wYXJzZV9vcGVyYW5kX2ZuKQotICAgIChjZCwgQ0dFTl9QQVJTRV9PUEVSQU5EX0lOSVQsIE5VTEwsIDAsIDAsIE5VTEwsIE5VTEwpOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGJ1aWxkX2FzbV9oYXNoX3RhYmxlIHRvIGFkZCBJTlNOUyB0byB0aGUgaGFzaCB0YWJsZS4KLQotICAgQ09VTlQgaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBJTlNOUy4KLSAgIEVOVFNJWkUgaXMgc2l6ZW9mIChDR0VOX0lCQVNFKSBmb3IgdGhlIHRhcmdldC4KLSAgID8/PyBObyBsb25nZXIgdXNlZCBidXQgbGVhdmUgaW4gZm9yIG5vdy4KLSAgIEhUQUJMRSBwb2ludHMgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBIRU5UQlVGIGlzIGEgcG9pbnRlciB0byBzdWZmaWNpZW50bHkgbGFyZ2UgYnVmZmVyIG9mIGhhc2ggZW50cmllcy4KLSAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGVudHJ5IHRvIHVzZS4KLQotICAgVGhlIHRhYmxlIGlzIHNjYW5uZWQgYmFja3dhcmRzIGFzIGFkZGl0aW9ucyBhcmUgbWFkZSB0byB0aGUgZnJvbnQgb2YgdGhlCi0gICBsaXN0IGFuZCB3ZSB3YW50IGVhcmxpZXIgb25lcyB0byBiZSBwcmVmZXJlZC4gICovCi0KLXN0YXRpYyBDR0VOX0lOU05fTElTVCAqCi1oYXNoX2luc25fYXJyYXkgKGNkLCBpbnNucywgY291bnQsIGVudHNpemUsIGh0YWJsZSwgaGVudGJ1ZikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuczsKLSAgICAgaW50IGNvdW50OwotICAgICBpbnQgZW50c2l6ZTsKLSAgICAgQ0dFTl9JTlNOX0xJU1QgKipodGFibGU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICpoZW50YnVmOwotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgLS1pLCArK2hlbnRidWYpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhhc2g7Ci0gICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSAmaW5zbnNbaV07Ci0KLSAgICAgIGlmICghICgqIGNkLT5hc21faGFzaF9wKSAoaW5zbikpCi0JY29udGludWU7Ci0gICAgICBoYXNoID0gKCogY2QtPmFzbV9oYXNoKSAoQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSk7Ci0gICAgICBoZW50YnVmLT5uZXh0ID0gaHRhYmxlW2hhc2hdOwotICAgICAgaGVudGJ1Zi0+aW5zbiA9IGluc247Ci0gICAgICBodGFibGVbaGFzaF0gPSBoZW50YnVmOwotICAgIH0KLQotICByZXR1cm4gaGVudGJ1ZjsKLX0KLQotLyogU3Vicm91dGluZSBvZiBidWlsZF9hc21faGFzaF90YWJsZSB0byBhZGQgSU5TTlMgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBoYXNoX2luc25fYXJyYXkgZXhjZXB0IHRoZSBpbnNucyBhcmUKLSAgIGluIGEgbGlzdC4gICovCi0KLXN0YXRpYyBDR0VOX0lOU05fTElTVCAqCi1oYXNoX2luc25fbGlzdCAoY2QsIGluc25zLCBodGFibGUsIGhlbnRidWYpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbnNuczsKLSAgICAgQ0dFTl9JTlNOX0xJU1QgKipodGFibGU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICpoZW50YnVmOwotewotICBjb25zdCBDR0VOX0lOU05fTElTVCAqaWxpc3Q7Ci0KLSAgZm9yIChpbGlzdCA9IGluc25zOyBpbGlzdCAhPSBOVUxMOyBpbGlzdCA9IGlsaXN0LT5uZXh0LCArKyBoZW50YnVmKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBoYXNoOwotCi0gICAgICBpZiAoISAoKiBjZC0+YXNtX2hhc2hfcCkgKGlsaXN0LT5pbnNuKSkKLQljb250aW51ZTsKLSAgICAgIGhhc2ggPSAoKiBjZC0+YXNtX2hhc2gpIChDR0VOX0lOU05fTU5FTU9OSUMgKGlsaXN0LT5pbnNuKSk7Ci0gICAgICBoZW50YnVmLT5uZXh0ID0gaHRhYmxlW2hhc2hdOwotICAgICAgaGVudGJ1Zi0+aW5zbiA9IGlsaXN0LT5pbnNuOwotICAgICAgaHRhYmxlW2hhc2hdID0gaGVudGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIGhlbnRidWY7Ci19Ci0KLS8qIEJ1aWxkIHRoZSBhc3NlbWJsZXIgaW5zdHJ1Y3Rpb24gaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9hc21faGFzaF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBjb3VudCA9IGNnZW5faW5zbl9jb3VudCAoY2QpICsgY2dlbl9tYWNyb19pbnNuX2NvdW50IChjZCk7Ci0gIENHRU5fSU5TTl9UQUJMRSAqaW5zbl90YWJsZSA9ICZjZC0+aW5zbl90YWJsZTsKLSAgQ0dFTl9JTlNOX1RBQkxFICptYWNyb19pbnNuX3RhYmxlID0gJmNkLT5tYWNyb19pbnNuX3RhYmxlOwotICB1bnNpZ25lZCBpbnQgaGFzaF9zaXplID0gY2QtPmFzbV9oYXNoX3NpemU7Ci0gIENHRU5fSU5TTl9MSVNUICpoYXNoX2VudHJ5X2J1ZjsKLSAgQ0dFTl9JTlNOX0xJU1QgKiphc21faGFzaF90YWJsZTsKLSAgQ0dFTl9JTlNOX0xJU1QgKmFzbV9oYXNoX3RhYmxlX2VudHJpZXM7Ci0KLSAgLyogVGhlIHNwYWNlIGFsbG9jYXRlZCBmb3IgdGhlIGhhc2ggdGFibGUgY29uc2lzdHMgb2YgdHdvIHBhcnRzOgotICAgICB0aGUgaGFzaCB0YWJsZSBhbmQgdGhlIGhhc2ggbGlzdHMuICAqLwotCi0gIGFzbV9oYXNoX3RhYmxlID0gKENHRU5fSU5TTl9MSVNUICoqKQotICAgIHhtYWxsb2MgKGhhc2hfc2l6ZSAqIHNpemVvZiAoQ0dFTl9JTlNOX0xJU1QgKikpOwotICBtZW1zZXQgKGFzbV9oYXNoX3RhYmxlLCAwLCBoYXNoX3NpemUgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUICopKTsKLSAgYXNtX2hhc2hfdGFibGVfZW50cmllcyA9IGhhc2hfZW50cnlfYnVmID0gKENHRU5fSU5TTl9MSVNUICopCi0gICAgeG1hbGxvYyAoY291bnQgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUKSk7Ci0KLSAgLyogQWRkIGNvbXBpbGVkIGluIGluc25zLgotICAgICBEb24ndCBpbmNsdWRlIHRoZSBmaXJzdCBvbmUgYXMgaXQgaXMgYSByZXNlcnZlZCBlbnRyeS4gICovCi0gIC8qID8/PyBJdCB3YXMgdGhlIGVuZCBvZiBhbGwgaGFzaCBjaGFpbnMsIGFuZCBhbHNvIHRoZSBzcGVjaWFsCi0gICAgICJpbnZhbGlkIGluc24iIG1hcmtlci4gIE1heSBiZSBhYmxlIHRvIGRvIGl0IGRpZmZlcmVudGx5IG5vdy4gICovCi0KLSAgaGFzaF9lbnRyeV9idWYgPSBoYXNoX2luc25fYXJyYXkgKGNkLAotCQkJCSAgICBpbnNuX3RhYmxlLT5pbml0X2VudHJpZXMgKyAxLAotCQkJCSAgICBpbnNuX3RhYmxlLT5udW1faW5pdF9lbnRyaWVzIC0gMSwKLQkJCQkgICAgaW5zbl90YWJsZS0+ZW50cnlfc2l6ZSwKLQkJCQkgICAgYXNtX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICAvKiBBZGQgY29tcGlsZWQgaW4gbWFjcm8taW5zbnMuICAqLwotCi0gIGhhc2hfZW50cnlfYnVmID0gaGFzaF9pbnNuX2FycmF5IChjZCwgbWFjcm9faW5zbl90YWJsZS0+aW5pdF9lbnRyaWVzLAotCQkJCSAgICBtYWNyb19pbnNuX3RhYmxlLT5udW1faW5pdF9lbnRyaWVzLAotCQkJCSAgICBtYWNyb19pbnNuX3RhYmxlLT5lbnRyeV9zaXplLAotCQkJCSAgICBhc21faGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOwotCi0gIC8qIEFkZCBydW50aW1lIGFkZGVkIGluc25zLgotICAgICBMYXRlciBhZGRlZCBpbnNucyB3aWxsIGJlIHByZWZlcmVkIG92ZXIgZWFybGllciBvbmVzLiAgKi8KLQotICBoYXNoX2VudHJ5X2J1ZiA9IGhhc2hfaW5zbl9saXN0IChjZCwgaW5zbl90YWJsZS0+bmV3X2VudHJpZXMsCi0JCQkJICAgYXNtX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICAvKiBBZGQgcnVudGltZSBhZGRlZCBtYWNyby1pbnNucy4gICovCi0KLSAgaGFzaF9pbnNuX2xpc3QgKGNkLCBtYWNyb19pbnNuX3RhYmxlLT5uZXdfZW50cmllcywKLQkJICBhc21faGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOwotCi0gIGNkLT5hc21faGFzaF90YWJsZSA9IGFzbV9oYXNoX3RhYmxlOwotICBjZC0+YXNtX2hhc2hfdGFibGVfZW50cmllcyA9IGFzbV9oYXNoX3RhYmxlX2VudHJpZXM7Ci19Ci0KLS8qIFJldHVybiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGhhc2ggbGlzdCBmb3IgSU5TTi4gICovCi0KLUNHRU5fSU5TTl9MSVNUICoKLWNnZW5fYXNtX2xvb2t1cF9pbnNuIChjZCwgaW5zbikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqaW5zbjsKLXsKLSAgdW5zaWduZWQgaW50IGhhc2g7Ci0KLSAgaWYgKGNkLT5hc21faGFzaF90YWJsZSA9PSBOVUxMKQotICAgIGJ1aWxkX2FzbV9oYXNoX3RhYmxlIChjZCk7Ci0KLSAgaGFzaCA9ICgqIGNkLT5hc21faGFzaCkgKGluc24pOwotICByZXR1cm4gY2QtPmFzbV9oYXNoX3RhYmxlW2hhc2hdOwotfQotDAotLyogS2V5d29yZCBwYXJzZXIuCi0gICBUaGUgcmVzdWx0IGlzIE5VTEwgdXBvbiBzdWNjZXNzIG9yIGFuIGVycm9yIG1lc3NhZ2UuCi0gICBJZiBzdWNjZXNzZnVsLCAqU1RSUCBpcyB1cGRhdGVkIHRvIHBvaW50IHBhc3NlZCB0aGUga2V5d29yZC4KLQotICAgPz8/IEF0IHByZXNlbnQgd2UgaGF2ZSBhIHN0YXRpYyBub3Rpb24gb2YgaG93IHRvIHBpY2sgb3V0IGEga2V5d29yZC4KLSAgIExhdGVyIHdlIGNhbiBhbGxvdyBhIHRhcmdldCB0byBjdXN0b21pemUgdGhpcyBpZiBuZWNlc3NhcnkgW3NheSBieQotICAgcmVjb3JkaW5nIHNvbWV0aGluZyBpbiB0aGUga2V5d29yZCB0YWJsZV0uICAqLwotCi1jb25zdCBjaGFyICoKLWNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsIGtleXdvcmRfdGFibGUsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIENHRU5fS0VZV09SRCAqa2V5d29yZF90YWJsZTsKLSAgICAgbG9uZyAqdmFsdWVwOwotewotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotICBjaGFyIGJ1ZlsyNTZdOwotICBjb25zdCBjaGFyICpwLCpzdGFydDsKLQotICBwID0gc3RhcnQgPSAqc3RycDsKLQotICAvKiBBbGxvdyBhbnkgZmlyc3QgY2hhcmFjdGVyLgotICAgICBOb3RlIHRoYXQgdGhpcyBhbGxvd3MgcmVjb2duaXppbmcgIixhIiBmb3IgdGhlIGFubnVsIGZsYWcgaW4gc3BhcmMKLSAgICAgZXZlbiB0aG91Z2ggIiwiIGlzIHN1YnNlcXVlbnRseSBub3QgYSB2YWxpZCBrZXl3b3JkIGNoYXIuICAqLwotICBpZiAoKnApCi0gICAgKytwOwotCi0gIC8qIE5vdyBhbGxvdyBsZXR0ZXJzLCBkaWdpdHMsIGFuZCBfLiAgKi8KLSAgd2hpbGUgKCgocCAtIHN0YXJ0KSA8IChpbnQpIHNpemVvZiAoYnVmKSkKLQkgJiYgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcCkgfHwgKnAgPT0gJ18nKSkKLSAgICArK3A7Ci0KLSAgaWYgKHAgLSBzdGFydCA+PSAoaW50KSBzaXplb2YgKGJ1ZikpCi0gICAgcmV0dXJuIF8oInVucmVjb2duaXplZCBrZXl3b3JkL3JlZ2lzdGVyIG5hbWUiKTsKLQotICBtZW1jcHkgKGJ1Ziwgc3RhcnQsIHAgLSBzdGFydCk7Ci0gIGJ1ZltwIC0gc3RhcnRdID0gMDsKLQotICBrZSA9IGNnZW5fa2V5d29yZF9sb29rdXBfbmFtZSAoa2V5d29yZF90YWJsZSwgYnVmKTsKLQotICBpZiAoa2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAqdmFsdWVwID0ga2UtPnZhbHVlOwotICAgICAgLyogRG9uJ3QgYWR2YW5jZSBwb2ludGVyIGlmIHdlIHJlY29nbml6ZWQgdGhlIG51bGwga2V5d29yZC4gICovCi0gICAgICBpZiAoa2UtPm5hbWVbMF0gIT0gMCkKLQkqc3RycCA9IHA7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICJ1bnJlY29nbml6ZWQga2V5d29yZC9yZWdpc3RlciBuYW1lIjsKLX0KLQotLyogUGFyc2UgYSBzbWFsbCBzaWduZWQgaW50ZWdlciBwYXJzZXIuCi0gICA/Pz8gVkFMVUVQIGlzIG5vdCBhIGJmZF92bWEgKiBvbiBwdXJwb3NlLCB0aG91Z2ggdGhpcyBpcyBjb25mdXNpbmcuCi0gICBOb3RlIHRoYXQgaWYgdGhlIGNhbGxlciBleHBlY3RzIGEgYmZkX3ZtYSByZXN1bHQsIGl0IHNob3VsZCBjYWxsCi0gICBjZ2VuX3BhcnNlX2FkZHJlc3MuICAqLwotCi1jb25zdCBjaGFyICoKLWNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgbG9uZyAqdmFsdWVwOwotewotICBiZmRfdm1hIHZhbHVlOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0OwotICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgZXJybXNnID0gKCogY2QtPnBhcnNlX29wZXJhbmRfZm4pCi0gICAgKGNkLCBDR0VOX1BBUlNFX09QRVJBTkRfSU5URUdFUiwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX05PTkUsCi0gICAgICZyZXN1bHQsICZ2YWx1ZSk7Ci0gIC8qIEZJWE1FOiBFeGFtaW5lIGByZXN1bHQnLiAgKi8KLSAgaWYgKCFlcnJtc2cpCi0gICAgKnZhbHVlcCA9IHZhbHVlOwotICByZXR1cm4gZXJybXNnOwotfQotCi0vKiBQYXJzZSBhIHNtYWxsIHVuc2lnbmVkIGludGVnZXIgcGFyc2VyLgotICAgPz8/IFZBTFVFUCBpcyBub3QgYSBiZmRfdm1hICogb24gcHVycG9zZSwgdGhvdWdoIHRoaXMgaXMgY29uZnVzaW5nLgotICAgTm90ZSB0aGF0IGlmIHRoZSBjYWxsZXIgZXhwZWN0cyBhIGJmZF92bWEgcmVzdWx0LCBpdCBzaG91bGQgY2FsbAotICAgY2dlbl9wYXJzZV9hZGRyZXNzLiAgKi8KLQotY29uc3QgY2hhciAqCi1jZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOwotewotICBiZmRfdm1hIHZhbHVlOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0OwotICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgZXJybXNnID0gKCogY2QtPnBhcnNlX29wZXJhbmRfZm4pCi0gICAgKGNkLCBDR0VOX1BBUlNFX09QRVJBTkRfSU5URUdFUiwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX05PTkUsCi0gICAgICZyZXN1bHQsICZ2YWx1ZSk7Ci0gIC8qIEZJWE1FOiBFeGFtaW5lIGByZXN1bHQnLiAgKi8KLSAgaWYgKCFlcnJtc2cpCi0gICAgKnZhbHVlcCA9IHZhbHVlOwotICByZXR1cm4gZXJybXNnOwotfQotCi0vKiBBZGRyZXNzIHBhcnNlci4gICovCi0KLWNvbnN0IGNoYXIgKgotY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgb3BpbmZvLCByZXN1bHRwLCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgaW50IG9waW5mbzsKLSAgICAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0ICpyZXN1bHRwOwotICAgICBiZmRfdm1hICp2YWx1ZXA7Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCByZXN1bHRfdHlwZTsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotCi0gIGVycm1zZyA9ICgqIGNkLT5wYXJzZV9vcGVyYW5kX2ZuKQotICAgIChjZCwgQ0dFTl9QQVJTRV9PUEVSQU5EX0FERFJFU1MsIHN0cnAsIG9waW5kZXgsIG9waW5mbywKLSAgICAgJnJlc3VsdF90eXBlLCAmdmFsdWUpOwotICAvKiBGSVhNRTogRXhhbWluZSBgcmVzdWx0Jy4gICovCi0gIGlmICghZXJybXNnKQotICAgIHsKLSAgICAgIGlmIChyZXN1bHRwICE9IE5VTEwpCi0JKnJlc3VsdHAgPSByZXN1bHRfdHlwZTsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICB9Ci0gIHJldHVybiBlcnJtc2c7Ci19Ci0MCi0vKiBTaWduZWQgaW50ZWdlciB2YWxpZGF0aW9uIHJvdXRpbmUuICAqLwotCi1jb25zdCBjaGFyICoKLWNnZW5fdmFsaWRhdGVfc2lnbmVkX2ludGVnZXIgKHZhbHVlLCBtaW4sIG1heCkKLSAgICAgbG9uZyB2YWx1ZSwgbWluLCBtYXg7Ci17Ci0gIGlmICh2YWx1ZSA8IG1pbiB8fCB2YWx1ZSA+IG1heCkKLSAgICB7Ci0gICAgICBzdGF0aWMgY2hhciBidWZbMTAwXTsKLQotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsZCBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKSwKLQkJICAgICAgdmFsdWUsIG1pbiwgbWF4KTsKLSAgICAgIHJldHVybiBidWY7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVbnNpZ25lZCBpbnRlZ2VyIHZhbGlkYXRpb24gcm91dGluZS4KLSAgIFN1cHBseWluZyBgbWluJyBoZXJlIG1heSBzZWVtIHVubmVjZXNzYXJ5LCBidXQgd2UgYWxzbyB3YW50IHRvIGhhbmRsZQotICAgY2FzZXMgd2hlcmUgbWluICE9IDAgKGFuZCBtYXggPiBMT05HX01BWCkuICAqLwotCi1jb25zdCBjaGFyICoKLWNnZW5fdmFsaWRhdGVfdW5zaWduZWRfaW50ZWdlciAodmFsdWUsIG1pbiwgbWF4KQotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlLCBtaW4sIG1heDsKLXsKLSAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KQotICAgIHsKLSAgICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMDBdOwotCi0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgc3ByaW50ZiAoYnVmLCBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWx1IG5vdCBiZXR3ZWVuICVsdSBhbmQgJWx1KSIpLAotCSAgICAgICB2YWx1ZSwgbWluLCBtYXgpOwotICAgICAgcmV0dXJuIGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2NnZW4tZGlzLmMgYi9vcGNvZGVzL2NnZW4tZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YjFjZDkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jZ2VuLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qIENHRU4gZ2VuZXJpYyBkaXNhc3NlbWJsZXIgc3VwcG9ydCBjb2RlLgotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJvcGNvZGUvY2dlbi5oIgotCi0vKiBTdWJyb3V0aW5lIG9mIGJ1aWxkX2Rpc19oYXNoX3RhYmxlIHRvIGFkZCBJTlNOUyB0byB0aGUgaGFzaCB0YWJsZS4KLQotICAgQ09VTlQgaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBJTlNOUy4KLSAgIEVOVFNJWkUgaXMgc2l6ZW9mIChDR0VOX0lCQVNFKSBmb3IgdGhlIHRhcmdldC4KLSAgID8/PyBObyBsb25nZXIgdXNlZCBidXQgbGVhdmUgaW4gZm9yIG5vdy4KLSAgIEhUQUJMRSBwb2ludHMgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBIRU5UQlVGIGlzIGEgcG9pbnRlciB0byBzdWZmaWNpZW50bHkgbGFyZ2UgYnVmZmVyIG9mIGhhc2ggZW50cmllcy4KLSAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGVudHJ5IHRvIHVzZS4KLQotICAgVGhlIHRhYmxlIGlzIHNjYW5uZWQgYmFja3dhcmRzIGFzIGFkZGl0aW9ucyBhcmUgbWFkZSB0byB0aGUgZnJvbnQgb2YgdGhlCi0gICBsaXN0IGFuZCB3ZSB3YW50IGVhcmxpZXIgb25lcyB0byBiZSBwcmVmZXJlZC4gICovCi0KLXN0YXRpYyBDR0VOX0lOU05fTElTVCAqCi1oYXNoX2luc25fYXJyYXkgKGNkLCBpbnNucywgY291bnQsIGVudHNpemUsIGh0YWJsZSwgaGVudGJ1ZikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogaW5zbnM7Ci0gICAgIGludCBjb3VudDsKLSAgICAgaW50IGVudHNpemU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICoqIGh0YWJsZTsKLSAgICAgQ0dFTl9JTlNOX0xJU1QgKiBoZW50YnVmOwotewotICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9FTkRJQU4gKGNkKSA9PSBDR0VOX0VORElBTl9CSUc7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IGNvdW50IC0gMTsgaSA+PSAwOyAtLWksICsraGVudGJ1ZikKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaGFzaDsKLSAgICAgIGNoYXIgYnVmIFs0XTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSAmaW5zbnNbaV07Ci0KLSAgICAgIGlmICghICgqIGNkLT5kaXNfaGFzaF9wKSAoaW5zbikpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIGRvbid0IGtub3cgd2hldGhlciB0aGUgdGFyZ2V0IHVzZXMgdGhlIGJ1ZmZlciBvciB0aGUgYmFzZSBpbnNuCi0JIHRvIGhhc2ggb24sIHNvIHNldCBib3RoIHVwLiAgKi8KLQotICAgICAgdmFsdWUgPSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbik7Ci0gICAgICBzd2l0Y2ggKENHRU5fSU5TTl9NQVNLX0JJVFNJWkUgKGluc24pKQotCXsKLQljYXNlIDg6Ci0JICBidWZbMF0gPSB2YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMTY6Ci0JICBpZiAoYmlnX3ApCi0JICAgIGJmZF9wdXRiMTYgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGVsc2UKLQkgICAgYmZkX3B1dGwxNiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgYnJlYWs7Ci0JY2FzZSAzMjoKLQkgIGlmIChiaWdfcCkKLQkgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgZWxzZQotCSAgICBiZmRfcHV0bDMyICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBoYXNoID0gKCogY2QtPmRpc19oYXNoKSAoYnVmLCB2YWx1ZSk7Ci0gICAgICBoZW50YnVmLT5uZXh0ID0gaHRhYmxlW2hhc2hdOwotICAgICAgaGVudGJ1Zi0+aW5zbiA9IGluc247Ci0gICAgICBodGFibGVbaGFzaF0gPSBoZW50YnVmOwotICAgIH0KLQotICByZXR1cm4gaGVudGJ1ZjsKLX0KLQotLyogU3Vicm91dGluZSBvZiBidWlsZF9kaXNfaGFzaF90YWJsZSB0byBhZGQgSU5TTlMgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBoYXNoX2luc25fYXJyYXkgZXhjZXB0IHRoZSBpbnNucyBhcmUKLSAgIGluIGEgbGlzdC4gICovCi0KLXN0YXRpYyBDR0VOX0lOU05fTElTVCAqCi1oYXNoX2luc25fbGlzdCAoY2QsIGluc25zLCBodGFibGUsIGhlbnRidWYpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbnNuczsKLSAgICAgQ0dFTl9JTlNOX0xJU1QgKipodGFibGU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICpoZW50YnVmOwotewotICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9FTkRJQU4gKGNkKSA9PSBDR0VOX0VORElBTl9CSUc7Ci0gIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbGlzdDsKLQotICBmb3IgKGlsaXN0ID0gaW5zbnM7IGlsaXN0ICE9IE5VTEw7IGlsaXN0ID0gaWxpc3QtPm5leHQsICsrIGhlbnRidWYpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhhc2g7Ci0gICAgICBjaGFyIGJ1Zls0XTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0KLSAgICAgIGlmICghICgqIGNkLT5kaXNfaGFzaF9wKSAoaWxpc3QtPmluc24pKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIHRhcmdldCB1c2VzIHRoZSBidWZmZXIgb3IgdGhlIGJhc2UgaW5zbgotCSB0byBoYXNoIG9uLCBzbyBzZXQgYm90aCB1cC4gICovCi0KLSAgICAgIHZhbHVlID0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGlsaXN0LT5pbnNuKTsKLSAgICAgIHN3aXRjaCAoQ0dFTl9JTlNOX01BU0tfQklUU0laRSAoaWxpc3QtPmluc24pKQotCXsKLQljYXNlIDg6Ci0JICBidWZbMF0gPSB2YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMTY6Ci0JICBpZiAoYmlnX3ApCi0JICAgIGJmZF9wdXRiMTYgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGVsc2UKLQkgICAgYmZkX3B1dGwxNiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgYnJlYWs7Ci0JY2FzZSAzMjoKLQkgIGlmIChiaWdfcCkKLQkgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgZWxzZQotCSAgICBiZmRfcHV0bDMyICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBoYXNoID0gKCogY2QtPmRpc19oYXNoKSAoYnVmLCB2YWx1ZSk7Ci0gICAgICBoZW50YnVmLT5uZXh0ID0gaHRhYmxlIFtoYXNoXTsKLSAgICAgIGhlbnRidWYtPmluc24gPSBpbGlzdC0+aW5zbjsKLSAgICAgIGh0YWJsZSBbaGFzaF0gPSBoZW50YnVmOwotICAgIH0KLQotICByZXR1cm4gaGVudGJ1ZjsKLX0KLQotLyogQnVpbGQgdGhlIGRpc2Fzc2VtYmxlciBpbnN0cnVjdGlvbiBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2Rpc19oYXNoX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaW50IGNvdW50ID0gY2dlbl9pbnNuX2NvdW50IChjZCkgKyBjZ2VuX21hY3JvX2luc25fY291bnQgKGNkKTsKLSAgQ0dFTl9JTlNOX1RBQkxFICppbnNuX3RhYmxlID0gJiBjZC0+aW5zbl90YWJsZTsKLSAgQ0dFTl9JTlNOX1RBQkxFICptYWNyb19pbnNuX3RhYmxlID0gJiBjZC0+bWFjcm9faW5zbl90YWJsZTsKLSAgdW5zaWduZWQgaW50IGhhc2hfc2l6ZSA9IGNkLT5kaXNfaGFzaF9zaXplOwotICBDR0VOX0lOU05fTElTVCAqaGFzaF9lbnRyeV9idWY7Ci0gIENHRU5fSU5TTl9MSVNUICoqZGlzX2hhc2hfdGFibGU7Ci0gIENHRU5fSU5TTl9MSVNUICpkaXNfaGFzaF90YWJsZV9lbnRyaWVzOwotCi0gIC8qIFRoZSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RzIG9mIHR3byBwYXJ0czoKLSAgICAgdGhlIGhhc2ggdGFibGUgYW5kIHRoZSBoYXNoIGxpc3RzLiAgKi8KLQotICBkaXNfaGFzaF90YWJsZSA9IChDR0VOX0lOU05fTElTVCAqKikKLSAgICB4bWFsbG9jIChoYXNoX3NpemUgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUICopKTsKLSAgbWVtc2V0IChkaXNfaGFzaF90YWJsZSwgMCwgaGFzaF9zaXplICogc2l6ZW9mIChDR0VOX0lOU05fTElTVCAqKSk7Ci0gIGRpc19oYXNoX3RhYmxlX2VudHJpZXMgPSBoYXNoX2VudHJ5X2J1ZiA9IChDR0VOX0lOU05fTElTVCAqKQotICAgIHhtYWxsb2MgKGNvdW50ICogc2l6ZW9mIChDR0VOX0lOU05fTElTVCkpOwotCi0gIC8qIEFkZCBjb21waWxlZCBpbiBpbnNucy4KLSAgICAgRG9uJ3QgaW5jbHVkZSB0aGUgZmlyc3Qgb25lIGFzIGl0IGlzIGEgcmVzZXJ2ZWQgZW50cnkuICAqLwotICAvKiA/Pz8gSXQgd2FzIHRoZSBlbmQgb2YgYWxsIGhhc2ggY2hhaW5zLCBhbmQgYWxzbyB0aGUgc3BlY2lhbAotICAgICAiaW52YWxpZCBpbnNuIiBtYXJrZXIuICBNYXkgYmUgYWJsZSB0byBkbyBpdCBkaWZmZXJlbnRseSBub3cuICAqLwotCi0gIGhhc2hfZW50cnlfYnVmID0gaGFzaF9pbnNuX2FycmF5IChjZCwKLQkJCQkgICAgaW5zbl90YWJsZS0+aW5pdF9lbnRyaWVzICsgMSwKLQkJCQkgICAgaW5zbl90YWJsZS0+bnVtX2luaXRfZW50cmllcyAtIDEsCi0JCQkJICAgIGluc25fdGFibGUtPmVudHJ5X3NpemUsCi0JCQkJICAgIGRpc19oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgLyogQWRkIGNvbXBpbGVkIGluIG1hY3JvLWluc25zLiAgKi8KLQotICBoYXNoX2VudHJ5X2J1ZiA9IGhhc2hfaW5zbl9hcnJheSAoY2QsIG1hY3JvX2luc25fdGFibGUtPmluaXRfZW50cmllcywKLQkJCQkgICAgbWFjcm9faW5zbl90YWJsZS0+bnVtX2luaXRfZW50cmllcywKLQkJCQkgICAgbWFjcm9faW5zbl90YWJsZS0+ZW50cnlfc2l6ZSwKLQkJCQkgICAgZGlzX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICAvKiBBZGQgcnVudGltZSBhZGRlZCBpbnNucy4KLSAgICAgTGF0ZXIgYWRkZWQgaW5zbnMgd2lsbCBiZSBwcmVmZXJlZCBvdmVyIGVhcmxpZXIgb25lcy4gICovCi0KLSAgaGFzaF9lbnRyeV9idWYgPSBoYXNoX2luc25fbGlzdCAoY2QsIGluc25fdGFibGUtPm5ld19lbnRyaWVzLAotCQkJCSAgIGRpc19oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgLyogQWRkIHJ1bnRpbWUgYWRkZWQgbWFjcm8taW5zbnMuICAqLwotCi0gIGhhc2hfaW5zbl9saXN0IChjZCwgbWFjcm9faW5zbl90YWJsZS0+bmV3X2VudHJpZXMsCi0JCSAgZGlzX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICBjZC0+ZGlzX2hhc2hfdGFibGUgPSBkaXNfaGFzaF90YWJsZTsKLSAgY2QtPmRpc19oYXNoX3RhYmxlX2VudHJpZXMgPSBkaXNfaGFzaF90YWJsZV9lbnRyaWVzOwotfQotCi0vKiBSZXR1cm4gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBoYXNoIGxpc3QgZm9yIElOU04uICAqLwotCi1DR0VOX0lOU05fTElTVCAqCi1jZ2VuX2Rpc19sb29rdXBfaW5zbiAoY2QsIGJ1ZiwgdmFsdWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKiBidWY7Ci0gICAgIENHRU5fSU5TTl9JTlQgdmFsdWU7Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoOwotCi0gIGlmIChjZC0+ZGlzX2hhc2hfdGFibGUgPT0gTlVMTCkKLSAgICBidWlsZF9kaXNfaGFzaF90YWJsZSAoY2QpOwotCi0gIGhhc2ggPSAoKiBjZC0+ZGlzX2hhc2gpIChidWYsIHZhbHVlKTsKLQotICByZXR1cm4gY2QtPmRpc19oYXNoX3RhYmxlW2hhc2hdOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9jZ2VuLW9wYy5jIGIvb3Bjb2Rlcy9jZ2VuLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njg0MGE2Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvY2dlbi1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDU5NyArMCwwIEBACi0vKiBDR0VOIGdlbmVyaWMgb3Bjb2RlIHN1cHBvcnQuCi0KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAib3Bjb2RlL2NnZW4uaCIKLQotc3RhdGljIHVuc2lnbmVkIGludCBoYXNoX2tleXdvcmRfbmFtZQotICBQQVJBTVMgKChjb25zdCBDR0VOX0tFWVdPUkQgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaGFzaF9rZXl3b3JkX3ZhbHVlCi0gIFBBUkFNUyAoKGNvbnN0IENHRU5fS0VZV09SRCAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIGJ1aWxkX2tleXdvcmRfaGFzaF90YWJsZXMKLSAgUEFSQU1TICgoQ0dFTl9LRVlXT1JEICopKTsKLQotLyogUmV0dXJuIG51bWJlciBvZiBoYXNoIHRhYmxlIGVudHJpZXMgdG8gdXNlIGZvciBOIGVsZW1lbnRzLiAgKi8KLSNkZWZpbmUgS0VZV09SRF9IQVNIX1NJWkUobikgKChuKSA8PSAzMSA/IDE3IDogMzEpCi0KLS8qIExvb2sgdXAgKk5BTUVQIGluIHRoZSBrZXl3b3JkIHRhYmxlIEtULgotICAgVGhlIHJlc3VsdCBpcyB0aGUga2V5d29yZCBlbnRyeSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCi0KLWNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqCi1jZ2VuX2tleXdvcmRfbG9va3VwX25hbWUgKGt0LCBuYW1lKQotICAgICBDR0VOX0tFWVdPUkQgKmt0OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotICBjb25zdCBjaGFyICpwLCpuOwotCi0gIGlmIChrdC0+bmFtZV9oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcyAoa3QpOwotCi0gIGtlID0ga3QtPm5hbWVfaGFzaF90YWJsZVtoYXNoX2tleXdvcmRfbmFtZSAoa3QsIG5hbWUsIDApXTsKLQotICAvKiBXZSBkbyBjYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmlzb25zLgotICAgICBJZiB0aGF0IGV2ZXIgYmVjb21lcyBhIHByb2JsZW0sIGFkZCBhbiBhdHRyaWJ1dGUgdGhhdCBkZW5vdGVzCi0gICAgICJkbyBjYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29ucyIuICAqLwotCi0gIHdoaWxlIChrZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIG4gPSBuYW1lOwotICAgICAgcCA9IGtlLT5uYW1lOwotCi0gICAgICB3aGlsZSAoKnAKLQkgICAgICYmICgqcCA9PSAqbgotCQkgfHwgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSAqcCkKLQkJICAgICAmJiAodG9sb3dlciAoKHVuc2lnbmVkIGNoYXIpICpwKQotCQkJID09IHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqbikpKSkpCi0JKytuLCArK3A7Ci0KLSAgICAgIGlmICghKnAgJiYgISpuKQotCXJldHVybiBrZTsKLQotICAgICAga2UgPSBrZS0+bmV4dF9uYW1lOwotICAgIH0KLQotICBpZiAoa3QtPm51bGxfZW50cnkpCi0gICAgcmV0dXJuIGt0LT5udWxsX2VudHJ5OwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogTG9vayB1cCBWQUxVRSBpbiB0aGUga2V5d29yZCB0YWJsZSBLVC4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIGtleXdvcmQgZW50cnkgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLwotCi1jb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKgotY2dlbl9rZXl3b3JkX2xvb2t1cF92YWx1ZSAoa3QsIHZhbHVlKQotICAgICBDR0VOX0tFWVdPUkQgKmt0OwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIGNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqa2U7Ci0KLSAgaWYgKGt0LT5uYW1lX2hhc2hfdGFibGUgPT0gTlVMTCkKLSAgICBidWlsZF9rZXl3b3JkX2hhc2hfdGFibGVzIChrdCk7Ci0KLSAga2UgPSBrdC0+dmFsdWVfaGFzaF90YWJsZVtoYXNoX2tleXdvcmRfdmFsdWUgKGt0LCB2YWx1ZSldOwotCi0gIHdoaWxlIChrZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICh2YWx1ZSA9PSBrZS0+dmFsdWUpCi0JcmV0dXJuIGtlOwotICAgICAga2UgPSBrZS0+bmV4dF92YWx1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEFkZCBhbiBlbnRyeSB0byBhIGtleXdvcmQgdGFibGUuICAqLwotCi12b2lkCi1jZ2VuX2tleXdvcmRfYWRkIChrdCwga2UpCi0gICAgIENHRU5fS0VZV09SRCAqa3Q7Ci0gICAgIENHRU5fS0VZV09SRF9FTlRSWSAqa2U7Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoOwotCi0gIGlmIChrdC0+bmFtZV9oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcyAoa3QpOwotCi0gIGhhc2ggPSBoYXNoX2tleXdvcmRfbmFtZSAoa3QsIGtlLT5uYW1lLCAwKTsKLSAga2UtPm5leHRfbmFtZSA9IGt0LT5uYW1lX2hhc2hfdGFibGVbaGFzaF07Ci0gIGt0LT5uYW1lX2hhc2hfdGFibGVbaGFzaF0gPSBrZTsKLQotICBoYXNoID0gaGFzaF9rZXl3b3JkX3ZhbHVlIChrdCwga2UtPnZhbHVlKTsKLSAga2UtPm5leHRfdmFsdWUgPSBrdC0+dmFsdWVfaGFzaF90YWJsZVtoYXNoXTsKLSAga3QtPnZhbHVlX2hhc2hfdGFibGVbaGFzaF0gPSBrZTsKLQotICBpZiAoa2UtPm5hbWVbMF0gPT0gMCkKLSAgICBrdC0+bnVsbF9lbnRyeSA9IGtlOwotfQotCi0vKiBGSVhNRTogTmVlZCBmdW5jdGlvbiB0byByZXR1cm4gY291bnQgb2Yga2V5d29yZHMuICAqLwotCi0vKiBJbml0aWFsaXplIGEga2V5d29yZCB0YWJsZSBzZWFyY2guCi0gICBTUEVDIGlzIGEgc3BlY2lmaWNhdGlvbiBvZiB3aGF0IHRvIHNlYXJjaCBmb3IuCi0gICBBIHZhbHVlIG9mIE5VTEwgbWVhbnMgdG8gZmluZCBldmVyeSBrZXl3b3JkLgotICAgQ3VycmVudGx5IE5VTEwgaXMgdGhlIG9ubHkgYWNjZXB0YWJsZSB2YWx1ZSBbZnVydGhlciBzcGVjaWZpY2F0aW9uCi0gICBkZWZlcnJlZF0uCi0gICBUaGUgcmVzdWx0IGlzIGFuIG9wYXF1ZSBkYXRhIGl0ZW0gdXNlZCB0byByZWNvcmQgdGhlIHNlYXJjaCBzdGF0dXMuCi0gICBJdCBpcyBwYXNzZWQgdG8gZWFjaCBjYWxsIHRvIGNnZW5fa2V5d29yZF9zZWFyY2hfbmV4dC4gICovCi0KLUNHRU5fS0VZV09SRF9TRUFSQ0gKLWNnZW5fa2V5d29yZF9zZWFyY2hfaW5pdCAoa3QsIHNwZWMpCi0gICAgIENHRU5fS0VZV09SRCAqa3Q7Ci0gICAgIGNvbnN0IGNoYXIgKnNwZWM7Ci17Ci0gIENHRU5fS0VZV09SRF9TRUFSQ0ggc2VhcmNoOwotCi0gIC8qIEZJWE1FOiBOZWVkIHRvIHNwZWNpZnkgZm9ybWF0IG9mIFBBUkFNUy4gICovCi0gIGlmIChzcGVjICE9IE5VTEwpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGt0LT5uYW1lX2hhc2hfdGFibGUgPT0gTlVMTCkKLSAgICBidWlsZF9rZXl3b3JkX2hhc2hfdGFibGVzIChrdCk7Ci0KLSAgc2VhcmNoLnRhYmxlID0ga3Q7Ci0gIHNlYXJjaC5zcGVjID0gc3BlYzsKLSAgc2VhcmNoLmN1cnJlbnRfaGFzaCA9IDA7Ci0gIHNlYXJjaC5jdXJyZW50X2VudHJ5ID0gTlVMTDsKLSAgcmV0dXJuIHNlYXJjaDsKLX0KLQotLyogUmV0dXJuIHRoZSBuZXh0IGtleXdvcmQgc3BlY2lmaWVkIGJ5IFNFQVJDSC4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIG5leHQgZW50cnkgb3IgTlVMTCBpZiB0aGVyZSBhcmUgbm8gbW9yZS4gICovCi0KLWNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqCi1jZ2VuX2tleXdvcmRfc2VhcmNoX25leHQgKHNlYXJjaCkKLSAgICAgQ0dFTl9LRVlXT1JEX1NFQVJDSCAqc2VhcmNoOwotewotICAvKiBIYXMgc2VhcmNoIGZpbmlzaGVkPyAgKi8KLSAgaWYgKHNlYXJjaC0+Y3VycmVudF9oYXNoID09IHNlYXJjaC0+dGFibGUtPmhhc2hfdGFibGVfc2l6ZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBTZWFyY2ggaW4gcHJvZ3Jlc3M/ICAqLwotICBpZiAoc2VhcmNoLT5jdXJyZW50X2VudHJ5ICE9IE5VTEwKLSAgICAgIC8qIEFueXRoaW5nIGxlZnQgb24gdGhpcyBoYXNoIGNoYWluPyAgKi8KLSAgICAgICYmIHNlYXJjaC0+Y3VycmVudF9lbnRyeS0+bmV4dF9uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgc2VhcmNoLT5jdXJyZW50X2VudHJ5ID0gc2VhcmNoLT5jdXJyZW50X2VudHJ5LT5uZXh0X25hbWU7Ci0gICAgICByZXR1cm4gc2VhcmNoLT5jdXJyZW50X2VudHJ5OwotICAgIH0KLQotICAvKiBNb3ZlIHRvIG5leHQgaGFzaCBjaGFpbiBbdW5sZXNzIHdlIGhhdmVuJ3Qgc3RhcnRlZCB5ZXRdLiAgKi8KLSAgaWYgKHNlYXJjaC0+Y3VycmVudF9lbnRyeSAhPSBOVUxMKQotICAgICsrc2VhcmNoLT5jdXJyZW50X2hhc2g7Ci0KLSAgd2hpbGUgKHNlYXJjaC0+Y3VycmVudF9oYXNoIDwgc2VhcmNoLT50YWJsZS0+aGFzaF90YWJsZV9zaXplKQotICAgIHsKLSAgICAgIHNlYXJjaC0+Y3VycmVudF9lbnRyeSA9IHNlYXJjaC0+dGFibGUtPm5hbWVfaGFzaF90YWJsZVtzZWFyY2gtPmN1cnJlbnRfaGFzaF07Ci0gICAgICBpZiAoc2VhcmNoLT5jdXJyZW50X2VudHJ5ICE9IE5VTEwpCi0JcmV0dXJuIHNlYXJjaC0+Y3VycmVudF9lbnRyeTsKLSAgICAgICsrc2VhcmNoLT5jdXJyZW50X2hhc2g7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBSZXR1cm4gZmlyc3QgZW50cnkgaW4gaGFzaCBjaGFpbiBmb3IgTkFNRS4KLSAgIElmIENBU0VfU0VOU0lUSVZFX1AgaXMgbm9uLXplcm8sIHJldHVybiBhIGNhc2Ugc2Vuc2l0aXZlIGhhc2guICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1oYXNoX2tleXdvcmRfbmFtZSAoa3QsIG5hbWUsIGNhc2Vfc2Vuc2l0aXZlX3ApCi0gICAgIGNvbnN0IENHRU5fS0VZV09SRCAqa3Q7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBjYXNlX3NlbnNpdGl2ZV9wOwotewotICB1bnNpZ25lZCBpbnQgaGFzaDsKLQotICBpZiAoY2FzZV9zZW5zaXRpdmVfcCkKLSAgICBmb3IgKGhhc2ggPSAwOyAqbmFtZTsgKytuYW1lKQotICAgICAgaGFzaCA9IChoYXNoICogOTcpICsgKHVuc2lnbmVkIGNoYXIpICpuYW1lOwotICBlbHNlCi0gICAgZm9yIChoYXNoID0gMDsgKm5hbWU7ICsrbmFtZSkKLSAgICAgIGhhc2ggPSAoaGFzaCAqIDk3KSArICh1bnNpZ25lZCBjaGFyKSB0b2xvd2VyICgqbmFtZSk7Ci0gIHJldHVybiBoYXNoICUga3QtPmhhc2hfdGFibGVfc2l6ZTsKLX0KLQotLyogUmV0dXJuIGZpcnN0IGVudHJ5IGluIGhhc2ggY2hhaW4gZm9yIFZBTFVFLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotaGFzaF9rZXl3b3JkX3ZhbHVlIChrdCwgdmFsdWUpCi0gICAgIGNvbnN0IENHRU5fS0VZV09SRCAqa3Q7Ci0gICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKLXsKLSAgcmV0dXJuIHZhbHVlICUga3QtPmhhc2hfdGFibGVfc2l6ZTsKLX0KLQotLyogQnVpbGQgYSBrZXl3b3JkIHRhYmxlJ3MgaGFzaCB0YWJsZXMuCi0gICBXZSBwcm9iYWJseSBuZWVkbid0IGJ1aWxkIHRoZSB2YWx1ZSBoYXNoIHRhYmxlIGZvciB0aGUgYXNzZW1ibGVyIHdoZW4KLSAgIHdlJ3JlIHVzaW5nIHRoZSBkaXNhc3NlbWJsZXIsIGJ1dCB3ZSBrZWVwIHRoaW5ncyBzaW1wbGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcyAoa3QpCi0gICAgIENHRU5fS0VZV09SRCAqa3Q7Ci17Ci0gIGludCBpOwotICAvKiBVc2UgdGhlIG51bWJlciBvZiBjb21waWxlZCBpbiBlbnRyaWVzIGFzIGFuIGVzdGltYXRlIGZvciB0aGUKLSAgICAgdHlwaWNhbCBzaXplZCB0YWJsZSBbbm90IHRvbyBtYW55IGFkZGVkIGF0IHJ1bnRpbWVdLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemUgPSBLRVlXT1JEX0hBU0hfU0laRSAoa3QtPm51bV9pbml0X2VudHJpZXMpOwotCi0gIGt0LT5oYXNoX3RhYmxlX3NpemUgPSBzaXplOwotICBrdC0+bmFtZV9oYXNoX3RhYmxlID0gKENHRU5fS0VZV09SRF9FTlRSWSAqKikKLSAgICB4bWFsbG9jIChzaXplICogc2l6ZW9mIChDR0VOX0tFWVdPUkRfRU5UUlkgKikpOwotICBtZW1zZXQgKGt0LT5uYW1lX2hhc2hfdGFibGUsIDAsIHNpemUgKiBzaXplb2YgKENHRU5fS0VZV09SRF9FTlRSWSAqKSk7Ci0gIGt0LT52YWx1ZV9oYXNoX3RhYmxlID0gKENHRU5fS0VZV09SRF9FTlRSWSAqKikKLSAgICB4bWFsbG9jIChzaXplICogc2l6ZW9mIChDR0VOX0tFWVdPUkRfRU5UUlkgKikpOwotICBtZW1zZXQgKGt0LT52YWx1ZV9oYXNoX3RhYmxlLCAwLCBzaXplICogc2l6ZW9mIChDR0VOX0tFWVdPUkRfRU5UUlkgKikpOwotCi0gIC8qIFRoZSB0YWJsZSBpcyBzY2FubmVkIGJhY2t3YXJkcyBhcyB3ZSB3YW50IGtleXdvcmRzIGFwcGVhcmluZyBlYXJsaWVyIHRvCi0gICAgIGJlIHByZWZlcmVkIG92ZXIgbGF0ZXIgb25lcy4gICovCi0gIGZvciAoaSA9IGt0LT5udW1faW5pdF9lbnRyaWVzIC0gMTsgaSA+PSAwOyAtLWkpCi0gICAgY2dlbl9rZXl3b3JkX2FkZCAoa3QsICZrdC0+aW5pdF9lbnRyaWVzW2ldKTsKLX0KLQwKLS8qIEhhcmR3YXJlIHN1cHBvcnQuICAqLwotCi0vKiBMb29rdXAgYSBoYXJkd2FyZSBlbGVtZW50IGJ5IGl0cyBuYW1lLgotICAgUmV0dXJucyBOVUxMIGlmIE5BTUUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0gICBtYWNoL2lzYS4gICovCi0KLWNvbnN0IENHRU5fSFdfRU5UUlkgKgotY2dlbl9od19sb29rdXBfYnlfbmFtZSAoY2QsIG5hbWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBpOwotICBjb25zdCBDR0VOX0hXX0VOVFJZICoqaHcgPSBjZC0+aHdfdGFibGUuZW50cmllczsKLQotICBmb3IgKGkgPSAwOyBpIDwgY2QtPmh3X3RhYmxlLm51bV9lbnRyaWVzOyArK2kpCi0gICAgaWYgKGh3W2ldICYmIHN0cmNtcCAobmFtZSwgaHdbaV0tPm5hbWUpID09IDApCi0gICAgICByZXR1cm4gaHdbaV07Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIExvb2t1cCBhIGhhcmR3YXJlIGVsZW1lbnQgYnkgaXRzIG51bWJlci4KLSAgIEhhcmR3YXJlIGVsZW1lbnRzIGFyZSBlbnVtZXJhdGVkLCBob3dldmVyIGl0IG1heSBiZSBwb3NzaWJsZSB0byBhZGQgc29tZQotICAgYXQgcnVudGltZSwgdGh1cyBIV05VTSBpcyBub3QgYW4gZW51bSB0eXBlIGJ1dCByYXRoZXIgYW4gaW50LgotICAgUmV0dXJucyBOVUxMIGlmIEhXTlVNIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtYWNoLiAgKi8KLQotY29uc3QgQ0dFTl9IV19FTlRSWSAqCi1jZ2VuX2h3X2xvb2t1cF9ieV9udW0gKGNkLCBod251bSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IGh3bnVtOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqKmh3ID0gY2QtPmh3X3RhYmxlLmVudHJpZXM7Ci0KLSAgLyogPz8/IFRoaXMgY2FuIGJlIHNwZWVkZWQgdXAuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgY2QtPmh3X3RhYmxlLm51bV9lbnRyaWVzOyArK2kpCi0gICAgaWYgKGh3W2ldICYmIGh3bnVtID09IGh3W2ldLT50eXBlKQotICAgICAgcmV0dXJuIGh3W2ldOwotCi0gIHJldHVybiBOVUxMOwotfQotDAotLyogT3BlcmFuZCBzdXBwb3J0LiAgKi8KLQotLyogTG9va3VwIGFuIG9wZXJhbmQgYnkgaXRzIG5hbWUuCi0gICBSZXR1cm5zIE5VTEwgaWYgTkFNRSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLSAgIG1hY2gvaXNhLiAgKi8KLQotY29uc3QgQ0dFTl9PUEVSQU5EICoKLWNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbmFtZSAoY2QsIG5hbWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBpOwotICBjb25zdCBDR0VOX09QRVJBTkQgKipvcCA9IGNkLT5vcGVyYW5kX3RhYmxlLmVudHJpZXM7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNkLT5vcGVyYW5kX3RhYmxlLm51bV9lbnRyaWVzOyArK2kpCi0gICAgaWYgKG9wW2ldICYmIHN0cmNtcCAobmFtZSwgb3BbaV0tPm5hbWUpID09IDApCi0gICAgICByZXR1cm4gb3BbaV07Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIExvb2t1cCBhbiBvcGVyYW5kIGJ5IGl0cyBudW1iZXIuCi0gICBPcGVyYW5kcyBhcmUgZW51bWVyYXRlZCwgaG93ZXZlciBpdCBtYXkgYmUgcG9zc2libGUgdG8gYWRkIHNvbWUKLSAgIGF0IHJ1bnRpbWUsIHRodXMgT1BOVU0gaXMgbm90IGFuIGVudW0gdHlwZSBidXQgcmF0aGVyIGFuIGludC4KLSAgIFJldHVybnMgTlVMTCBpZiBPUE5VTSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLSAgIG1hY2gvaXNhLiAgKi8KLQotY29uc3QgQ0dFTl9PUEVSQU5EICoKLWNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtIChjZCwgb3BudW0pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcG51bTsKLXsKLSAgcmV0dXJuIGNkLT5vcGVyYW5kX3RhYmxlLmVudHJpZXNbb3BudW1dOwotfQotDAotLyogSW5zdHJ1Y3Rpb24gc3VwcG9ydC4gICovCi0KLS8qIFJldHVybiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBpbmNsdWRlcyBhbnkgYWRkZWQgYXQgcnVudGltZS4gICovCi0KLWludAotY2dlbl9pbnNuX2NvdW50IChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaW50IGNvdW50ID0gY2QtPmluc25fdGFibGUubnVtX2luaXRfZW50cmllczsKLSAgQ0dFTl9JTlNOX0xJU1QgKnJ0X2luc25zID0gY2QtPmluc25fdGFibGUubmV3X2VudHJpZXM7Ci0KLSAgZm9yICggOyBydF9pbnNucyAhPSBOVUxMOyBydF9pbnNucyA9IHJ0X2luc25zLT5uZXh0KQotICAgICsrY291bnQ7Ci0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKiBSZXR1cm4gbnVtYmVyIG9mIG1hY3JvLWluc3RydWN0aW9ucy4KLSAgIFRoaXMgaW5jbHVkZXMgYW55IGFkZGVkIGF0IHJ1bnRpbWUuICAqLwotCi1pbnQKLWNnZW5fbWFjcm9faW5zbl9jb3VudCAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBjb3VudCA9IGNkLT5tYWNyb19pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXM7Ci0gIENHRU5fSU5TTl9MSVNUICpydF9pbnNucyA9IGNkLT5tYWNyb19pbnNuX3RhYmxlLm5ld19lbnRyaWVzOwotCi0gIGZvciAoIDsgcnRfaW5zbnMgIT0gTlVMTDsgcnRfaW5zbnMgPSBydF9pbnNucy0+bmV4dCkKLSAgICArK2NvdW50OwotCi0gIHJldHVybiBjb3VudDsKLX0KLQotLyogQ292ZXIgZnVuY3Rpb24gdG8gcmVhZCBhbmQgcHJvcGVybHkgYnl0ZXN3YXAgYW4gaW5zbiB2YWx1ZS4gICovCi0KLUNHRU5fSU5TTl9JTlQKLWNnZW5fZ2V0X2luc25fdmFsdWUgKGNkLCBidWYsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmOwotICAgICBpbnQgbGVuZ3RoOwotewotICBDR0VOX0lOU05fSU5UIHZhbHVlOwotCi0gIHN3aXRjaCAobGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICB2YWx1ZSA9ICpidWY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGNkLT5pbnNuX2VuZGlhbiA9PSBDR0VOX0VORElBTl9CSUcpCi0JdmFsdWUgPSBiZmRfZ2V0YjE2IChidWYpOwotICAgICAgZWxzZQotCXZhbHVlID0gYmZkX2dldGwxNiAoYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoY2QtPmluc25fZW5kaWFuID09IENHRU5fRU5ESUFOX0JJRykKLQl2YWx1ZSA9IGJmZF9nZXRiMzIgKGJ1Zik7Ci0gICAgICBlbHNlCi0JdmFsdWUgPSBiZmRfZ2V0bDMyIChidWYpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIENvdmVyIGZ1bmN0aW9uIHRvIHN0b3JlIGFuIGluc24gdmFsdWUgcHJvcGVybHkgYnl0ZXN3YXBwZWQuICAqLwotCi12b2lkCi1jZ2VuX3B1dF9pbnNuX3ZhbHVlIChjZCwgYnVmLCBsZW5ndGgsIHZhbHVlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gICAgIGludCBsZW5ndGg7Ci0gICAgIENHRU5fSU5TTl9JTlQgdmFsdWU7Ci17Ci0gIHN3aXRjaCAobGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICBidWZbMF0gPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoY2QtPmluc25fZW5kaWFuID09IENHRU5fRU5ESUFOX0JJRykKLQliZmRfcHV0YjE2ICh2YWx1ZSwgYnVmKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDE2ICh2YWx1ZSwgYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoY2QtPmluc25fZW5kaWFuID09IENHRU5fRU5ESUFOX0JJRykKLQliZmRfcHV0YjMyICh2YWx1ZSwgYnVmKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDMyICh2YWx1ZSwgYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0MCi0vKiBMb29rIHVwIGluc3RydWN0aW9uIElOU05fKl9WQUxVRSBhbmQgZXh0cmFjdCBpdHMgZmllbGRzLgotICAgSU5TTl9JTlRfVkFMVUUgaXMgdXNlZCBpZiBDR0VOX0lOVF9JTlNOX1AuCi0gICBPdGhlcndpc2UgSU5TTl9CWVRFU19WQUxVRSBpcyB1c2VkLgotICAgSU5TTiwgaWYgbm9uLW51bGwsIGlzIHRoZSBpbnNuIHRhYmxlIGVudHJ5LgotICAgT3RoZXJ3aXNlIElOU05fKl9WQUxVRSBpcyBleGFtaW5lZCB0byBjb21wdXRlIGl0LgotICAgTEVOR1RIIGlzIHRoZSBiaXQgbGVuZ3RoIG9mIElOU05fKl9WQUxVRSBpZiBrbm93biwgb3RoZXJ3aXNlIDAuCi0gICAwIGlzIG9ubHkgdmFsaWQgaWYgYGluc24gPT0gTlVMTCAmJiAhIENHRU5fSU5UX0lOU05fUCcuCi0gICBJZiBJTlNOICE9IE5VTEwsIExFTkdUSCBtdXN0IGJlIHZhbGlkLgotICAgQUxJQVNfUCBpcyBub24temVybyBpZiBhbGlhcyBpbnNucyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHNlYXJjaC4KLQotICAgVGhlIHJlc3VsdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGluc24gdGFibGUgZW50cnksIG9yIE5VTEwgaWYgdGhlIGluc3RydWN0aW9uCi0gICB3YXNuJ3QgcmVjb2duaXplZC4gICovCi0KLS8qID8/PyBXaWxsIG5lZWQgdG8gYmUgcmV2aXNpdGVkIGZvciBWTElXIGFyY2hpdGVjdHVyZXMuICAqLwotCi1jb25zdCBDR0VOX0lOU04gKgotY2dlbl9sb29rdXBfaW5zbiAoY2QsIGluc24sIGluc25faW50X3ZhbHVlLCBpbnNuX2J5dGVzX3ZhbHVlLCBsZW5ndGgsIGZpZWxkcywKLQkJICBhbGlhc19wKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl9pbnRfdmFsdWU7Ci0gICAgIC8qID8/PyBDR0VOX0lOU05fQllURVMgd291bGQgYmUgYSBuaWNlIHR5cGUgbmFtZSB0byB1c2UgaGVyZS4gICovCi0gICAgIHVuc2lnbmVkIGNoYXIgKmluc25fYnl0ZXNfdmFsdWU7Ci0gICAgIGludCBsZW5ndGg7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGludCBhbGlhc19wOwotewotICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gIENHRU5fSU5TTl9JTlQgYmFzZV9pbnNuOwotICBDR0VOX0VYVFJBQ1RfSU5GTyBleF9pbmZvOwotICBDR0VOX0VYVFJBQ1RfSU5GTyAqaW5mbzsKLQotICBpZiAoY2QtPmludF9pbnNuX3ApCi0gICAgewotICAgICAgaW5mbyA9IE5VTEw7Ci0gICAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKSBhbGxvY2EgKGNkLT5tYXhfaW5zbl9iaXRzaXplIC8gOCk7Ci0gICAgICBjZ2VuX3B1dF9pbnNuX3ZhbHVlIChjZCwgYnVmLCBsZW5ndGgsIGluc25faW50X3ZhbHVlKTsKLSAgICAgIGJhc2VfaW5zbiA9IGluc25faW50X3ZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGluZm8gPSAmZXhfaW5mbzsKLSAgICAgIGV4X2luZm8uZGlzX2luZm8gPSBOVUxMOwotICAgICAgZXhfaW5mby5pbnNuX2J5dGVzID0gaW5zbl9ieXRlc192YWx1ZTsKLSAgICAgIGV4X2luZm8udmFsaWQgPSAtMTsKLSAgICAgIGJ1ZiA9IGluc25fYnl0ZXNfdmFsdWU7Ci0gICAgICBiYXNlX2luc24gPSBjZ2VuX2dldF9pbnNuX3ZhbHVlIChjZCwgYnVmLCBsZW5ndGgpOwotICAgIH0KLQotICBpZiAoIWluc24pCi0gICAgewotICAgICAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmluc25fbGlzdDsKLQotICAgICAgLyogVGhlIGluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGluIGhhc2ggbGlzdHMuCi0JIFBpY2sgdGhlIGZpcnN0IG9uZSBhbmQga2VlcCB0cnlpbmcgdW50aWwgd2UgZmluZCB0aGUgcmlnaHQgb25lLiAgKi8KLQotICAgICAgaW5zbl9saXN0ID0gY2dlbl9kaXNfbG9va3VwX2luc24gKGNkLCBidWYsIGJhc2VfaW5zbik7Ci0gICAgICB3aGlsZSAoaW5zbl9saXN0ICE9IE5VTEwpCi0JewotCSAgaW5zbiA9IGluc25fbGlzdC0+aW5zbjsKLQotCSAgaWYgKGFsaWFzX3AKLQkgICAgICAvKiBGSVhNRTogRW5zdXJlIEFMSUFTIGF0dHJpYnV0ZSBhbHdheXMgaGFzIHNhbWUgaW5kZXguICAqLwotCSAgICAgIHx8ICEgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9BTElBUykpCi0JICAgIHsKLQkgICAgICAvKiBCYXNpYyBiaXQgbWFzayBtdXN0IGJlIGNvcnJlY3QuICAqLwotCSAgICAgIC8qID8/PyBNYXkgd2lzaCB0byBhbGxvdyB0YXJnZXQgdG8gZGVmZXIgdGhpcyBjaGVjayB1bnRpbCB0aGUKLQkJIGV4dHJhY3QgaGFuZGxlci4gICovCi0JICAgICAgaWYgKChiYXNlX2luc24gJiBDR0VOX0lOU05fQkFTRV9NQVNLIChpbnNuKSkKLQkJICA9PSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbikpCi0JCXsKLQkJICAvKiA/Pz8gMCBpcyBwYXNzZWQgZm9yIGBwYycgKi8KLQkJICBpbnQgZWxlbmd0aCA9IENHRU5fRVhUUkFDVF9GTiAoY2QsIGluc24pCi0JCSAgICAoY2QsIGluc24sIGluZm8sIGJhc2VfaW5zbiwgZmllbGRzLCAoYmZkX3ZtYSkgMCk7Ci0JCSAgaWYgKGVsZW5ndGggPiAwKQotCQkgICAgewotCQkgICAgICAvKiBzYW5pdHkgY2hlY2sgKi8KLQkJICAgICAgaWYgKGxlbmd0aCAhPSAwICYmIGxlbmd0aCAhPSBlbGVuZ3RoKQotCQkJYWJvcnQgKCk7Ci0JCSAgICAgIHJldHVybiBpbnNuOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaW5zbl9saXN0ID0gaW5zbl9saXN0LT5uZXh0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBTYW5pdHkgY2hlY2s6IGNhbid0IHBhc3MgYW4gYWxpYXMgaW5zbiBpZiAhIGFsaWFzX3AuICAqLwotICAgICAgaWYgKCEgYWxpYXNfcAotCSAgJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9BTElBUykpCi0JYWJvcnQgKCk7Ci0gICAgICAvKiBTYW5pdHkgY2hlY2s6IGxlbmd0aCBtdXN0IGJlIGNvcnJlY3QuICAqLwotICAgICAgaWYgKGxlbmd0aCAhPSBDR0VOX0lOU05fQklUU0laRSAoaW5zbikpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIC8qID8/PyAwIGlzIHBhc3NlZCBmb3IgYHBjJyAqLwotICAgICAgbGVuZ3RoID0gQ0dFTl9FWFRSQUNUX0ZOIChjZCwgaW5zbikKLQkoY2QsIGluc24sIGluZm8sIGJhc2VfaW5zbiwgZmllbGRzLCAoYmZkX3ZtYSkgMCk7Ci0gICAgICAvKiBTYW5pdHkgY2hlY2s6IG11c3Qgc3VjY2VlZC4KLQkgQ291bGQgcmVsYXggdGhpcyBsYXRlciBpZiBpdCBldmVyIHByb3ZlcyB1c2VmdWwuICAqLwotICAgICAgaWYgKGxlbmd0aCA9PSAwKQotCWFib3J0ICgpOwotICAgICAgcmV0dXJuIGluc247Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBGaWxsIGluIHRoZSBvcGVyYW5kIGluc3RhbmNlcyB1c2VkIGJ5IElOU04gd2hvc2Ugb3BlcmFuZHMgYXJlIEZJRUxEUy4KLSAgIElORElDRVMgaXMgYSBwb2ludGVyIHRvIGEgYnVmZmVyIG9mIE1BWF9PUEVSQU5EX0lOU1RBTkNFUyBpbnRzIHRvIGJlIGZpbGxlZAotICAgaW4uICAqLwotCi12b2lkCi1jZ2VuX2dldF9pbnNuX29wZXJhbmRzIChjZCwgaW5zbiwgZmllbGRzLCBpbmRpY2VzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIGNvbnN0IENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGludCAqaW5kaWNlczsKLXsKLSAgY29uc3QgQ0dFTl9PUElOU1QgKm9waW5zdDsKLSAgaW50IGk7Ci0KLSAgaWYgKGluc24tPm9waW5zdCA9PSBOVUxMKQotICAgIGFib3J0ICgpOwotICBmb3IgKGkgPSAwLCBvcGluc3QgPSBpbnNuLT5vcGluc3Q7IG9waW5zdC0+dHlwZSAhPSBDR0VOX09QSU5TVF9FTkQ7ICsraSwgKytvcGluc3QpCi0gICAgewotICAgICAgZW51bSBjZ2VuX29wZXJhbmRfdHlwZSBvcF90eXBlID0gb3BpbnN0LT5vcF90eXBlOwotICAgICAgaWYgKG9wX3R5cGUgPT0gQ0dFTl9PUEVSQU5EX05JTCkKLQlpbmRpY2VzW2ldID0gb3BpbnN0LT5pbmRleDsKLSAgICAgIGVsc2UKLQlpbmRpY2VzW2ldID0gKCpjZC0+Z2V0X2ludF9vcGVyYW5kKSAoY2QsIG9wX3R5cGUsIGZpZWxkcyk7Ci0gICAgfQotfQotCi0vKiBDb3ZlciBmdW5jdGlvbiB0byBjZ2VuX2dldF9pbnNuX29wZXJhbmRzIHdoZW4gZWl0aGVyIElOU04gb3IgRklFTERTCi0gICBpc24ndCBrbm93bi4KLSAgIFRoZSBJTlNOLCBJTlNOXypfVkFMVUUsIGFuZCBMRU5HVEggYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8KLSAgIGNnZW5fbG9va3VwX2luc24gdW5jaGFuZ2VkLgotICAgSU5TTl9JTlRfVkFMVUUgaXMgdXNlZCBpZiBDR0VOX0lOVF9JTlNOX1AuCi0gICBPdGhlcndpc2UgSU5TTl9CWVRFU19WQUxVRSBpcyB1c2VkLgotCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBpbnNuIHRhYmxlIGVudHJ5IG9yIE5VTEwgaWYgdGhlIGluc3RydWN0aW9uIHdhc24ndAotICAgcmVjb2duaXplZC4gICovCi0KLWNvbnN0IENHRU5fSU5TTiAqCi1jZ2VuX2xvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcyAoY2QsIGluc24sIGluc25faW50X3ZhbHVlLCBpbnNuX2J5dGVzX3ZhbHVlLAotCQkJICAgICAgIGxlbmd0aCwgaW5kaWNlcywgZmllbGRzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl9pbnRfdmFsdWU7Ci0gICAgIC8qID8/PyBDR0VOX0lOU05fQllURVMgd291bGQgYmUgYSBuaWNlIHR5cGUgbmFtZSB0byB1c2UgaGVyZS4gICovCi0gICAgIHVuc2lnbmVkIGNoYXIgKmluc25fYnl0ZXNfdmFsdWU7Ci0gICAgIGludCBsZW5ndGg7Ci0gICAgIGludCAqaW5kaWNlczsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLXsKLSAgLyogUGFzcyBub24temVybyBmb3IgQUxJQVNfUCBvbmx5IGlmIElOU04gIT0gTlVMTC4KLSAgICAgSWYgSU5TTiA9PSBOVUxMLCB3ZSB3YW50IGEgcmVhbCBpbnNuLiAgKi8KLSAgaW5zbiA9IGNnZW5fbG9va3VwX2luc24gKGNkLCBpbnNuLCBpbnNuX2ludF92YWx1ZSwgaW5zbl9ieXRlc192YWx1ZSwKLQkJCSAgIGxlbmd0aCwgZmllbGRzLCBpbnNuICE9IE5VTEwpOwotICBpZiAoISBpbnNuKQotICAgIHJldHVybiBOVUxMOwotCi0gIGNnZW5fZ2V0X2luc25fb3BlcmFuZHMgKGNkLCBpbnNuLCBmaWVsZHMsIGluZGljZXMpOwotICByZXR1cm4gaW5zbjsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvY29uZmlnLmluIGIvb3Bjb2Rlcy9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MGEzMjEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvY29uZmlndXJlIGIvb3Bjb2Rlcy9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxY2ZmMTIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw0NzU0ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiAgIGJ1aWxkIHNoYXJlZCBCRkQvb3Bjb2Rlcy9saWJpYmVydHkgbGlicmFyeSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWNnZW4tbWFpbnRbPWRpcl0gICAgYnVpbGQgY2dlbiBnZW5lcmF0ZWQgZmlsZXMiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPXo4ay1kaXMuYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZWxzZQotICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZmkKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1OTY6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjE3OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MzU6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY2MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjkwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzQxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NzM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDc4NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjc4OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MTU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MjA6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjgyOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NDg6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4ODA6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotCi0jIFdlIGN1cnJlbnRseSBvbmx5IHVzZSB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBuYW1lIG9mIGFueSBzaGFyZWQKLSMgbGlicmFyeS4gIEZvciB1c2VyIGNvbnZlbmllbmNlLCB3ZSBhbHdheXMgdXNlIHRoZSBzYW1lIHZlcnNpb24KLSMgbnVtYmVyIHRoYXQgQkZEIGlzIHVzaW5nLgotQkZEX1ZFUlNJT049YGdyZXAgSU5JVF9BVVRPTUFLRSAke3NyY2Rpcn0vLi4vYmZkL2NvbmZpZ3VyZS5pbiB8IHNlZCAtbiAtZSAncy9bIAldLy9nJyAtZSAncy9eLiosXCguKlwpKS4qJC9cMS9wJ2AKLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MTg6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTcxOiBjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiID4mNQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAotICAgZmkKLSAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIiQqIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgMT4mMjsgZXhpdCAxOyB9Ci0gICBmaQotCi0gICB0ZXN0ICIkMiIgPSBjb25mdGVzdGZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siIDE+JjI7IGV4aXQgMTsgfQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZWNobyAiJGFjX3QiInllcyIgMT4mNgotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMjg6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotCi1QQUNLQUdFPW9wY29kZXMKLQotVkVSU0lPTj0ke0JGRF9WRVJTSU9OfQotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0IiAxPiYyOyBleGl0IDE7IH0KLWZpCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLUVPRgotCi0KLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNzQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBQ0xPQ0FMPWFjbG9jYWwKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA4NzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0NPTkY9YXV0b2NvbmYKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTAwOiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b21ha2UgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPTUFLRT1hdXRvbWFrZQotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPTUFLRT0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b21ha2UiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTExMzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTI2OiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBNQUtFSU5GTz1tYWtlaW5mbwotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotCi0KLWlmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFyOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUj0iJHthY190b29sX3ByZWZpeH1hciIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiICYmIGFjX2N2X3Byb2dfQVI9ImFyIgotZmkKLWZpCi1BUj0iJGFjX2N2X3Byb2dfQVIiCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE4MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIxMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgUkFOTElCPSI6IgotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPW5vCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3N0YXRpYz15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMxOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCi0gIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzU4OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzODI6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM4NTogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotdGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0MjE6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2dudV9sZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nbnVfbGQiIDE+JjYKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0Mzc6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9OTScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi0KLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLWVjaG8gIiRhY190IiIkTk0iIDE+JjYKLQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDc1OiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKiAJXCgkYWNfc3ltY29kZVwpIAkgCSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTM4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTQyOiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1OTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotCSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotCi1maQotCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotZWNobyAiJGFjX3QiIiRhY19yZXN1bHQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NDA6IGNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NDk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY1MjogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci1maQotcm0gLXJmIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSIgMT4mNgotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjc4OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdGRhdGEKLWlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsCi10aGVuCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotICBhY19jdl9wcm9nX0xOX1M9ImxuIC1zIgotZWxzZQotICBhY19jdl9wcm9nX0xOX1M9bG4KLWZpCi1maQotTE5fUz0iJGFjX2N2X3Byb2dfTE5fUyIKLWlmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnI2xpbmUgMTcxNCAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTcxNTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzM2OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9jY19uZWVkc19iZWxmJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTc0MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9jY19uZWVkc19iZWxmIiAxPiY2Ci0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3NzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODAzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSJkbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIiAmJiBhY19jdl9wcm9nX0RMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4Mzg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iJHthY190b29sX3ByZWZpeH1hcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg3MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSJhcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiICYmIGFjX2N2X3Byb2dfQVM9ImZhbHNlIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIEFTPSJmYWxzZSIKLWZpCi1maQotCi0KLSAgOzsKLQotZXNhYwotCi0jIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayBvciAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbGlidG9vbF9sb2NrIgotICBuZWVkX2xvY2tzPSRlbmFibGV2YWwKLWVsc2UKLSAgbmVlZF9sb2Nrcz15ZXMKLWZpCi0KLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi0KLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAotfHwgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWQiIDE+JjI7IGV4aXQgMTsgfQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRhcmdldHMgb3IgLS1kaXNhYmxlLXRhcmdldHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfdGFyZ2V0cytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfdGFyZ2V0cyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJyIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjCi1maQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiBvciAtLWRpc2FibGUtY29tbW9uYmZkbGliIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2NvbW1vbmJmZGxpYitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfY29tbW9uYmZkbGliIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgY29tbW9uYmZkbGliPXRydWUgOzsKLSAgbm8pICBjb21tb25iZmRsaWI9ZmFsc2UgOzsKLSAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIG9wY29kZXMgY29tbW9uYmZkbGliIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1maQotCi0KLQotCi0KLWlmIHRlc3QgLXogIiR0YXJnZXQiIDsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA0OTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQotICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKLSAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9bm8KLWZpCi0KLSAgZWNobyAiJGFjX3QiIiRVU0VfTUFJTlRBSU5FUl9NT0RFIiAxPiY2Ci0gIAotCi1pZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPQotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9JyMnCi1lbHNlCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPScjJwotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9Ci1maQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNzI6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwNzcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwODg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMDU6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjExMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEzNjogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE0NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLQotIyBob3N0LXNwZWNpZmljIHN0dWZmOgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNzI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMDI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjUzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjg1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAyMjk2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMwMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzI3OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMzMjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM0MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzYwOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0KLUFMTF9MSU5HVUFTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzOTQ6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQwOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQxNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQyNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQzMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ0MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ0OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ3NDogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ3OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ4NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTA0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MjIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU0MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTU0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1Nzg6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU4MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjMyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2NTM6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjY2MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2Njc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjkzOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjk4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MjY6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjczMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc2MTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3NjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc3MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3OTQ6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjc5OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODI3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg1OTogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4NjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODg5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODk0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5MTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk0NDogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk3MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTk2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAwMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAwNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDM1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDQwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwODg6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwOTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjY0OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI2OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI3NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzMDQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzMDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzM2MTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM2NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RQQ1BZIDEKLUVPRgotCi0gICBmaQotCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MjM6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQyOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiBMQ19NRVNTQUdFUwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotRU9GCi0KLSAgICBmaQotICBmaQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDU2OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCi0gIFVTRV9OTFM9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTkxTPXllcwotZmkKLQotICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgotICAgIAotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEVOQUJMRV9OTFMgMQotRU9GCi0KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NzY6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKLWVsc2UKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubwotZmkKLQotICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2Ci0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ5NTogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzUwMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTA1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzUyMjogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTI3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1NTA6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1saW50bCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTU4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZHRleHRkb21haW4oKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kdGV4dGRvbWFpbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzU4NTogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTkwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU5NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dFVFRFWFQgMQotRU9GCi0KLQkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2MjU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2NTk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2NjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzY4NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzcxNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3NTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzc4MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc5MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmUKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCSAgICAgICAgCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4MjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODU2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg5MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgICAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk4MjogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKLSAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDAxMDogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDAxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDIwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbXNnZm9ybWF0PWxpbnV4Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotbXNnZm9ybWF0PXhvcGVuCi1maQotCi0KLQkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIAotICAgCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIAotCi0gICAgICBsPQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICAKLQotLiAke3NyY2Rpcn0vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDk3OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLWZvciBhY19oZHIgaW4gc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDE1NDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQxNTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQxNjQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLQotdXNpbmdfY2dlbj1ubwotCi0jIEhvcnJpYmxlIGhhY2tzIHRvIGJ1aWxkIERMTHMgb24gV2luZG93cy4KLVdJTjMyTERGTEFHUz0KLVdJTjMyTElCQUREPQotY2FzZSAiJHtob3N0fSIgaW4KLSotKi1jeWd3aW4qKQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSAieWVzIjsgdGhlbgotICAgIFdJTjMyTERGTEFHUz0iLW5vLXVuZGVmaW5lZCIKLSAgICBXSU4zMkxJQkFERD0iLUxgcHdkYC8uLi9iZmQgLWxiZmQgLUxgcHdkYC8uLi9saWJpYmVydHkgLWxpYmVydHkgLUxgcHdkYC8uLi9pbnRsIC1saW50bCAtbGN5Z3dpbiIKLSAgZmkKLSAgOzsKLWVzYWMKLQotCi0KLSMgdGFyZ2V0LXNwZWNpZmljIHN0dWZmOgotCi0jIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyIgOyB0aGVuCi0gICAgZm9yIHRhcmcgaW4gYGVjaG8gJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2AKLSAgICBkbwotCXJlc3VsdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmcgMj4vZGV2L251bGxgCi0JaWYgdGVzdCAtbiAiJHJlc3VsdCIgOyB0aGVuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0JZWxzZQotCSAgICAjIEFsbG93IHRhcmdldHMgdGhhdCBjb25maWcuc3ViIGRvZXNuJ3QgcmVjb2duaXplLCBsaWtlICJhbGwiLgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdGFyZyIKLQlmaQotICAgIGRvbmUKLWZpCi0KLWFsbF90YXJnZXRzPWZhbHNlCi1zZWxhcmNocz0KLWZvciB0YXJnIGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMKLWRvCi0gICAgaWYgdGVzdCAieCR0YXJnIiA9ICJ4YWxsIiA7IHRoZW4KLSAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQotICAgIGVsc2UKLQkuICRzcmNkaXIvLi4vYmZkL2NvbmZpZy5iZmQKLQlzZWxhcmNocz0iJHNlbGFyY2hzICR0YXJnX2FyY2hzIgotICAgIGZpCi1kb25lCQotCi0jIFV0aWxpdHkgdmFyLCBkb2N1bWVudHMgZ2VuZXJpYyBjZ2VuIHN1cHBvcnQgZmlsZXMuCi0KLWNnZW5fZmlsZXM9ImNnZW4tb3BjLmxvIGNnZW4tYXNtLmxvIGNnZW4tZGlzLmxvIgotCi0jIFdlIGRvbid0IGRvIGFueSBsaW5rcyBiYXNlZCBvbiB0aGUgdGFyZ2V0IHN5c3RlbSwganVzdCBtYWtlZmlsZSBjb25maWcuCi0KLWlmIHRlc3QgeCR7YWxsX3RhcmdldHN9ID0geGZhbHNlIDsgdGhlbgotCi0gICAgIyBUYXJnZXQgYXJjaGl0ZWN0dXJlIC5vIGZpbGVzLgotICAgIHRhPQotCi0gICAgZm9yIGFyY2ggaW4gJHNlbGFyY2hzCi0gICAgZG8KLQlhZD1gZWNobyAkYXJjaCB8IHNlZCAtZSBzL2JmZF8vL2cgLWUgcy9fYXJjaC8vZ2AKLQlhcmNoZGVmcz0iJGFyY2hkZWZzIC1EQVJDSF8kYWQiCi0JY2FzZSAiJGFyY2giIGluCi0JYmZkX2EyOWtfYXJjaCkJCXRhPSIkdGEgYTI5ay1kaXMubG8iIDs7Ci0JYmZkX2FsbGlhbnRfYXJjaCkJOzsKLQliZmRfYWxwaGFfYXJjaCkJCXRhPSIkdGEgYWxwaGEtZGlzLmxvIGFscGhhLW9wYy5sbyIgOzsKLQliZmRfYXJjX2FyY2gpCQl0YT0iJHRhIGFyYy1kaXMubG8gYXJjLW9wYy5sbyIgOzsKLQliZmRfYXJtX2FyY2gpCQl0YT0iJHRhIGFybS1kaXMubG8iIDs7Ci0JYmZkX2NvbnZleF9hcmNoKQk7OwotCWJmZF9kMTB2X2FyY2gpCQl0YT0iJHRhIGQxMHYtZGlzLmxvIGQxMHYtb3BjLmxvIiA7OwotCWJmZF9kMzB2X2FyY2gpCQl0YT0iJHRhIGQzMHYtZGlzLmxvIGQzMHYtb3BjLmxvIiA7OwotCWJmZF9mcjMwX2FyY2gpICAgICAgICAgIHRhPSIkdGEgZnIzMC1hc20ubG8gZnIzMC1kZXNjLmxvIGZyMzAtZGlzLmxvIGZyMzAtaWJsZC5sbyBmcjMwLW9wYy5sbyIgdXNpbmdfY2dlbj15ZXMgOzsKLQliZmRfaDgzMDBfYXJjaCkJCXRhPSIkdGEgaDgzMDAtZGlzLmxvIiA7OwotCWJmZF9oODUwMF9hcmNoKQkJdGE9IiR0YSBoODUwMC1kaXMubG8iIDs7Ci0JYmZkX2hwcGFfYXJjaCkJCXRhPSIkdGEgaHBwYS1kaXMubG8iIDs7Ci0JYmZkX2kzODZfYXJjaCkJCXRhPSIkdGEgaTM4Ni1kaXMubG8iIDs7Ci0JYmZkX2k4NjBfYXJjaCkJCTs7Ci0JYmZkX2k5NjBfYXJjaCkJCXRhPSIkdGEgaTk2MC1kaXMubG8iIDs7Ci0JYmZkX20zMnJfYXJjaCkJCXRhPSIkdGEgbTMyci1hc20ubG8gbTMyci1kZXNjLmxvIG0zMnItZGlzLmxvIG0zMnItaWJsZC5sbyBtMzJyLW9wYy5sbyBtMzJyLW9waW5zdC5sbyIgdXNpbmdfY2dlbj15ZXMgOzsKLQliZmRfbTY4a19hcmNoKQkJdGE9IiR0YSBtNjhrLWRpcy5sbyBtNjhrLW9wYy5sbyIgOzsKLQliZmRfbTg4a19hcmNoKQkJdGE9IiR0YSBtODhrLWRpcy5sbyIgOzsKLQliZmRfbWNvcmVfYXJjaCkJCXRhPSIkdGEgbWNvcmUtZGlzLmxvIiA7OwotCWJmZF9taXBzX2FyY2gpCQl0YT0iJHRhIG1pcHMtZGlzLmxvIG1pcHMtb3BjLmxvIG1pcHMxNi1vcGMubG8iIDs7Ci0JYmZkX21uMTAyMDBfYXJjaCkJdGE9IiR0YSBtMTAyMDAtZGlzLmxvIG0xMDIwMC1vcGMubG8iIDs7Ci0JYmZkX21uMTAzMDBfYXJjaCkJdGE9IiR0YSBtMTAzMDAtZGlzLmxvIG0xMDMwMC1vcGMubG8iIDs7Ci0JYmZkX25zMzJrX2FyY2gpCQl0YT0iJHRhIG5zMzJrLWRpcy5sbyIgOzsKLQliZmRfcG93ZXJwY19hcmNoKQl0YT0iJHRhIHBwYy1kaXMubG8gcHBjLW9wYy5sbyIgOzsKLQliZmRfcHlyYW1pZF9hcmNoKQk7OwotCWJmZF9yb21wX2FyY2gpCQk7OwotCWJmZF9yczYwMDBfYXJjaCkJdGE9IiR0YSBwcGMtZGlzLmxvIHBwYy1vcGMubG8iIDs7Ci0JYmZkX3NoX2FyY2gpCQl0YT0iJHRhIHNoLWRpcy5sbyIgOzsKLQliZmRfc3BhcmNfYXJjaCkJCXRhPSIkdGEgc3BhcmMtZGlzLmxvIHNwYXJjLW9wYy5sbyIgOzsKLQliZmRfdGFob2VfYXJjaCkJCTs7Ci0JYmZkX3RpYzMwX2FyY2gpCQl0YT0iJHRhIHRpYzMwLWRpcy5sbyIgOzsKLQliZmRfdGljODBfYXJjaCkJCXRhPSIkdGEgdGljODAtZGlzLmxvIHRpYzgwLW9wYy5sbyIgOzsKLQliZmRfdjg1MF9hcmNoKQkJdGE9IiR0YSB2ODUwLW9wYy5sbyB2ODUwLWRpcy5sbyIgOzsKLQliZmRfdjg1MGVfYXJjaCkJCXRhPSIkdGEgdjg1MC1vcGMubG8gdjg1MC1kaXMubG8iIDs7Ci0JYmZkX3Y4NTBlYV9hcmNoKQl0YT0iJHRhIHY4NTAtb3BjLmxvIHY4NTAtZGlzLmxvIiA7OwotCWJmZF92YXhfYXJjaCkJCXRhPSIkdGEgdmF4LWRpcy5sbyIgOzsKLQliZmRfdzY1X2FyY2gpCQl0YT0iJHRhIHc2NS1kaXMubG8iIDs7Ci0JYmZkX3dlMzJrX2FyY2gpCQk7OwotCWJmZF96OGtfYXJjaCkJCXRhPSIkdGEgejhrLWRpcy5sbyIgOzsKLQotCSIiKQkJCTs7Ci0JKikJCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogKioqIHVua25vd24gdGFyZ2V0IGFyY2hpdGVjdHVyZSAkYXJjaCIgMT4mMjsgZXhpdCAxOyB9IDs7Ci0JZXNhYwotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgJHVzaW5nX2NnZW4gPSB5ZXMgOyB0aGVuCi0JdGE9IiR0YSAkY2dlbl9maWxlcyIKLSAgICBmaQotCi0gICAgIyBXZWVkIG91dCBkdXBsaWNhdGUgLm8gZmlsZXMuCi0gICAgZj0iIgotICAgIGZvciBpIGluICR0YSA7IGRvCi0JY2FzZSAiICRmICIgaW4KLQkqIiAkaSAiKikgOzsKLQkqKSBmPSIkZiAkaSIgOzsKLQllc2FjCi0gICAgZG9uZQotICAgIHRhPSIkZiIKLQotICAgICMgQW5kIGR1cGxpY2F0ZSAtRCBmbGFncy4KLSAgICBmPSIiCi0gICAgZm9yIGkgaW4gJGFyY2hkZWZzIDsgZG8KLQljYXNlICIgJGYgIiBpbgotCSoiICRpICIqKSA7OwotCSopIGY9IiRmICRpIiA7OwotCWVzYWMKLSAgICBkb25lCi0gICAgYXJjaGRlZnM9IiRmIgotCi0gICAgQkZEX01BQ0hJTkVTPSIkdGEiCi0KLWVsc2UJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0gICAgYXJjaGRlZnM9LURBUkNIX2FsbAotICAgIEJGRF9NQUNISU5FUz0nJChBTExfTUFDSElORVMpJwotZmkKLQotCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBDQ0AlJENDJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBQQUNLQUdFQCUkUEFDS0FHRSVnCi1zJUBWRVJTSU9OQCUkVkVSU0lPTiVnCi1zJUBBQ0xPQ0FMQCUkQUNMT0NBTCVnCi1zJUBBVVRPQ09ORkAlJEFVVE9DT05GJWcKLXMlQEFVVE9NQUtFQCUkQVVUT01BS0UlZwotcyVAQVVUT0hFQURFUkAlJEFVVE9IRUFERVIlZwotcyVATUFLRUlORk9AJSRNQUtFSU5GTyVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQEFSQCUkQVIlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQExEQCUkTEQlZwotcyVATk1AJSROTSVnCi1zJUBVU0VfU1lNQk9MX1VOREVSU0NPUkVAJSRVU0VfU1lNQk9MX1VOREVSU0NPUkUlZwotcyVATE5fU0AlJExOX1MlZwotcyVARExMVE9PTEAlJERMTFRPT0wlZwotcyVAQVNAJSRBUyVnCi1zJUBMSUJUT09MQCUkTElCVE9PTCVnCi1zJUBNQUlOVEFJTkVSX01PREVfVFJVRUAlJE1BSU5UQUlORVJfTU9ERV9UUlVFJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9GQUxTRUAlJE1BSU5UQUlORVJfTU9ERV9GQUxTRSVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi1zJUBDUFBAJSRDUFAlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQFVTRV9OTFNAJSRVU0VfTkxTJWcKLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi1zJUBHTVNHRk1UQCUkR01TR0ZNVCVnCi1zJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKLXMlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZwotcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCi1zJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZwotcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCi1zJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKLXMlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKLXMlQElOVExERVBTQCUkSU5UTERFUFMlZwotcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCi1zJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKLXMlQFBPRklMRVNAJSRQT0ZJTEVTJWcKLXMlQFBPU1VCQCUkUE9TVUIlZwotcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZwotcyVAR1RfTk9AJSRHVF9OTyVnCi1zJUBHVF9ZRVNAJSRHVF9ZRVMlZwotcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZwotcyVAbEAlJGwlZwotcyVASERFRklORVNAJSRIREVGSU5FUyVnCi1zJUBDR0VOX01BSU5UX1RSVUVAJSRDR0VOX01BSU5UX1RSVUUlZwotcyVAQ0dFTl9NQUlOVF9GQUxTRUAlJENHRU5fTUFJTlRfRkFMU0UlZwotcyVAY2dlbmRpckAlJGNnZW5kaXIlZwotcyVAY2dlbkAlJGNnZW4lZwotcyVAV0lOMzJMREZMQUdTQCUkV0lOMzJMREZMQUdTJWcKLXMlQFdJTjMyTElCQUREQCUkV0lOMzJMSUJBREQlZwotcyVAYXJjaGRlZnNAJSRhcmNoZGVmcyVnCi1zJUBCRkRfTUFDSElORVNAJSRCRkRfTUFDSElORVMlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi1zZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGUKLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9vcGNvZGVzL2NvbmZpZ3VyZS5iYXQgYi9vcGNvZGVzL2NvbmZpZ3VyZS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMmM2ZDEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jb25maWd1cmUuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotQGVjaG8gb2ZmDQotZWNobyBDb25maWd1cmluZyBvcGNvZGVzIGZvciBnbzMyDQotcmVtIFRoaXMgYmF0Y2ggZmlsZSBhc3N1bWVzIGEgdW5peC10eXBlICJzZWQiIHByb2dyYW0NCi0NCi1lY2hvICMgTWFrZWZpbGUgZ2VuZXJhdGVkIGJ5ICJjb25maWd1cmUuYmF0Ij4gTWFrZWZpbGUNCi0NCi1pZiBleGlzdCBjb25maWcuc2VkIGRlbCBjb25maWcuc2VkDQotDQotZWNobyAiL1wub1sgCV0qOi8gcy9jb25maWcuc3RhdHVzLy8JCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvQ0MgPSBjYy9DQyA9IGdjYy8JCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL0BCRkRfTUFDSElORVNAL2kzODYtZGlzLm8vCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL0BhcmNoZGVmc0AvLURBUkNIX2kzODYvCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9AZnJhZ3NALy8JCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9Ac3JjZGlyQC8vCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMhQHByZWZpeEAhL3Vzci9sb2NhbCEJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzIUBleGVjX3ByZWZpeEAhL3Vzci9sb2NhbCEJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvQFJBTkxJQkAvcmFubGliLwkJCQkiPj4gY29uZmlnLnNlZA0KLQ0KLWVjaG8gInMvXlsgCV0qcm0vCS1ybS8JCQkJIj4+IGNvbmZpZy5zZWQNCi0NCi1zZWQgLWUgInMvXlwiLy8iIC1lICJzL1wiJC8vIiAtZSAicy9bIAldKiQvLyIgY29uZmlnLnNlZCA+IGNvbmZpZzIuc2VkDQotc2VkIC1mIGNvbmZpZzIuc2VkIE1ha2VmaWxlLmluID4+IE1ha2VmaWxlDQotZGVsIGNvbmZpZy5zZWQNCi1kZWwgY29uZmlnMi5zZWQNCmRpZmYgLS1naXQgYS9vcGNvZGVzL2NvbmZpZ3VyZS5pbiBiL29wY29kZXMvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjc4NTgwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sCi0KLUFDX1BSRVJFUSgyLjEzKQotQUNfSU5JVCh6OGstZGlzLmMpCi0KLUFDX0NBTk9OSUNBTF9TWVNURU0KLUFDX0lTQ19QT1NJWAotCi0jIFdlIGN1cnJlbnRseSBvbmx5IHVzZSB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBuYW1lIG9mIGFueSBzaGFyZWQKLSMgbGlicmFyeS4gIEZvciB1c2VyIGNvbnZlbmllbmNlLCB3ZSBhbHdheXMgdXNlIHRoZSBzYW1lIHZlcnNpb24KLSMgbnVtYmVyIHRoYXQgQkZEIGlzIHVzaW5nLgotY2hhbmdlcXVvdGUoLClkbmwKLUJGRF9WRVJTSU9OPWBncmVwIElOSVRfQVVUT01BS0UgJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaW4gfCBzZWQgLW4gLWUgJ3MvWyAJXS8vZycgLWUgJ3MvXi4qLFwoLipcKSkuKiQvXDEvcCdgCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0KLUFNX0lOSVRfQVVUT01BS0Uob3Bjb2RlcywgJHtCRkRfVkVSU0lPTn0pCi0KLWRubCBUaGVzZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLCBiZWNhdXNlIGl0IG1heSB3YW50Ci1kbmwgdG8gY2FsbCBBQ19DSEVDS19QUk9HLgotQUNfQ0hFQ0tfVE9PTChBUiwgYXIpCi1BQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQotCi1kbmwgRGVmYXVsdCB0byBhIG5vbiBzaGFyZWQgbGlicmFyeS4gIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlCi1kbmwgY29uZmlndXJlIG9wdGlvbiAtLWVuYWJsZS1zaGFyZWQuCi1BTV9ESVNBQkxFX1NIQVJFRAotCi1BTV9QUk9HX0xJQlRPT0wKLQotQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAotWyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWNdKWRubAotQUNfQVJHX0VOQUJMRShjb21tb25iZmRsaWIsCi1bICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3Igb3Bjb2RlcyBjb21tb25iZmRsaWIgb3B0aW9uXSkgOzsKLWVzYWNdKWRubAotCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLikKLWZpCi1BQ19BUkdfUFJPR1JBTQotCi1BTV9NQUlOVEFJTkVSX01PREUKLUFDX0VYRUVYVAotCi0jIGhvc3Qtc3BlY2lmaWMgc3R1ZmY6Ci0KLUFDX1BST0dfQ0MKLQotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi0uICR7c3JjZGlyfS8uLi9iZmQvY29uZmlndXJlLmhvc3QKLQotQUNfU1VCU1QoSERFRklORVMpCi1BQ19QUk9HX0lOU1RBTEwKLQotQUNfQ0hFQ0tfSEVBREVSUyhzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmgpCi0KLQotdXNpbmdfY2dlbj1ubwotCi0jIEhvcnJpYmxlIGhhY2tzIHRvIGJ1aWxkIERMTHMgb24gV2luZG93cy4KLVdJTjMyTERGTEFHUz0KLVdJTjMyTElCQUREPQotY2FzZSAiJHtob3N0fSIgaW4KLSotKi1jeWd3aW4qKQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSAieWVzIjsgdGhlbgotICAgIFdJTjMyTERGTEFHUz0iLW5vLXVuZGVmaW5lZCIKLSAgICBXSU4zMkxJQkFERD0iLUxgcHdkYC8uLi9iZmQgLWxiZmQgLUxgcHdkYC8uLi9saWJpYmVydHkgLWxpYmVydHkgLUxgcHdkYC8uLi9pbnRsIC1saW50bCAtbGN5Z3dpbiIKLSAgZmkKLSAgOzsKLWVzYWMKLUFDX1NVQlNUKFdJTjMyTERGTEFHUykKLUFDX1NVQlNUKFdJTjMyTElCQUREKQotCi0jIHRhcmdldC1zcGVjaWZpYyBzdHVmZjoKLQotIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgotICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi0gICAgZG8KLQlyZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAotCWlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotc2VsYXJjaHM9Ci1mb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCi1kbwotICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCIgOyB0aGVuCi0gICAgICAgIGFsbF90YXJnZXRzPXRydWUKLSAgICBlbHNlCi0JLiAkc3JjZGlyLy4uL2JmZC9jb25maWcuYmZkCi0Jc2VsYXJjaHM9IiRzZWxhcmNocyAkdGFyZ19hcmNocyIKLSAgICBmaQotZG9uZQkKLQotIyBVdGlsaXR5IHZhciwgZG9jdW1lbnRzIGdlbmVyaWMgY2dlbiBzdXBwb3J0IGZpbGVzLgotCi1jZ2VuX2ZpbGVzPSJjZ2VuLW9wYy5sbyBjZ2VuLWFzbS5sbyBjZ2VuLWRpcy5sbyIKLQotIyBXZSBkb24ndCBkbyBhbnkgbGlua3MgYmFzZWQgb24gdGhlIHRhcmdldCBzeXN0ZW0sIGp1c3QgbWFrZWZpbGUgY29uZmlnLgotCi1pZiB0ZXN0IHgke2FsbF90YXJnZXRzfSA9IHhmYWxzZSA7IHRoZW4KLQotICAgICMgVGFyZ2V0IGFyY2hpdGVjdHVyZSAubyBmaWxlcy4KLSAgICB0YT0KLQotICAgIGZvciBhcmNoIGluICRzZWxhcmNocwotICAgIGRvCi0JYWQ9YGVjaG8gJGFyY2ggfCBzZWQgLWUgcy9iZmRfLy9nIC1lIHMvX2FyY2gvL2dgCi0JYXJjaGRlZnM9IiRhcmNoZGVmcyAtREFSQ0hfJGFkIgotCWNhc2UgIiRhcmNoIiBpbgotCWJmZF9hMjlrX2FyY2gpCQl0YT0iJHRhIGEyOWstZGlzLmxvIiA7OwotCWJmZF9hbGxpYW50X2FyY2gpCTs7Ci0JYmZkX2FscGhhX2FyY2gpCQl0YT0iJHRhIGFscGhhLWRpcy5sbyBhbHBoYS1vcGMubG8iIDs7Ci0JYmZkX2FyY19hcmNoKQkJdGE9IiR0YSBhcmMtZGlzLmxvIGFyYy1vcGMubG8iIDs7Ci0JYmZkX2FybV9hcmNoKQkJdGE9IiR0YSBhcm0tZGlzLmxvIiA7OwotCWJmZF9jb252ZXhfYXJjaCkJOzsKLQliZmRfZDEwdl9hcmNoKQkJdGE9IiR0YSBkMTB2LWRpcy5sbyBkMTB2LW9wYy5sbyIgOzsKLQliZmRfZDMwdl9hcmNoKQkJdGE9IiR0YSBkMzB2LWRpcy5sbyBkMzB2LW9wYy5sbyIgOzsKLQliZmRfZnIzMF9hcmNoKSAgICAgICAgICB0YT0iJHRhIGZyMzAtYXNtLmxvIGZyMzAtZGVzYy5sbyBmcjMwLWRpcy5sbyBmcjMwLWlibGQubG8gZnIzMC1vcGMubG8iIHVzaW5nX2NnZW49eWVzIDs7Ci0JYmZkX2g4MzAwX2FyY2gpCQl0YT0iJHRhIGg4MzAwLWRpcy5sbyIgOzsKLQliZmRfaDg1MDBfYXJjaCkJCXRhPSIkdGEgaDg1MDAtZGlzLmxvIiA7OwotCWJmZF9ocHBhX2FyY2gpCQl0YT0iJHRhIGhwcGEtZGlzLmxvIiA7OwotCWJmZF9pMzg2X2FyY2gpCQl0YT0iJHRhIGkzODYtZGlzLmxvIiA7OwotCWJmZF9pODYwX2FyY2gpCQk7OwotCWJmZF9pOTYwX2FyY2gpCQl0YT0iJHRhIGk5NjAtZGlzLmxvIiA7OwotCWJmZF9tMzJyX2FyY2gpCQl0YT0iJHRhIG0zMnItYXNtLmxvIG0zMnItZGVzYy5sbyBtMzJyLWRpcy5sbyBtMzJyLWlibGQubG8gbTMyci1vcGMubG8gbTMyci1vcGluc3QubG8iIHVzaW5nX2NnZW49eWVzIDs7Ci0JYmZkX202OGtfYXJjaCkJCXRhPSIkdGEgbTY4ay1kaXMubG8gbTY4ay1vcGMubG8iIDs7Ci0JYmZkX204OGtfYXJjaCkJCXRhPSIkdGEgbTg4ay1kaXMubG8iIDs7Ci0JYmZkX21jb3JlX2FyY2gpCQl0YT0iJHRhIG1jb3JlLWRpcy5sbyIgOzsKLQliZmRfbWlwc19hcmNoKQkJdGE9IiR0YSBtaXBzLWRpcy5sbyBtaXBzLW9wYy5sbyBtaXBzMTYtb3BjLmxvIiA7OwotCWJmZF9tbjEwMjAwX2FyY2gpCXRhPSIkdGEgbTEwMjAwLWRpcy5sbyBtMTAyMDAtb3BjLmxvIiA7OwotCWJmZF9tbjEwMzAwX2FyY2gpCXRhPSIkdGEgbTEwMzAwLWRpcy5sbyBtMTAzMDAtb3BjLmxvIiA7OwotCWJmZF9uczMya19hcmNoKQkJdGE9IiR0YSBuczMyay1kaXMubG8iIDs7Ci0JYmZkX3Bvd2VycGNfYXJjaCkJdGE9IiR0YSBwcGMtZGlzLmxvIHBwYy1vcGMubG8iIDs7Ci0JYmZkX3B5cmFtaWRfYXJjaCkJOzsKLQliZmRfcm9tcF9hcmNoKQkJOzsKLQliZmRfcnM2MDAwX2FyY2gpCXRhPSIkdGEgcHBjLWRpcy5sbyBwcGMtb3BjLmxvIiA7OwotCWJmZF9zaF9hcmNoKQkJdGE9IiR0YSBzaC1kaXMubG8iIDs7Ci0JYmZkX3NwYXJjX2FyY2gpCQl0YT0iJHRhIHNwYXJjLWRpcy5sbyBzcGFyYy1vcGMubG8iIDs7Ci0JYmZkX3RhaG9lX2FyY2gpCQk7OwotCWJmZF90aWMzMF9hcmNoKQkJdGE9IiR0YSB0aWMzMC1kaXMubG8iIDs7Ci0JYmZkX3RpYzgwX2FyY2gpCQl0YT0iJHRhIHRpYzgwLWRpcy5sbyB0aWM4MC1vcGMubG8iIDs7Ci0JYmZkX3Y4NTBfYXJjaCkJCXRhPSIkdGEgdjg1MC1vcGMubG8gdjg1MC1kaXMubG8iIDs7Ci0JYmZkX3Y4NTBlX2FyY2gpCQl0YT0iJHRhIHY4NTAtb3BjLmxvIHY4NTAtZGlzLmxvIiA7OwotCWJmZF92ODUwZWFfYXJjaCkJdGE9IiR0YSB2ODUwLW9wYy5sbyB2ODUwLWRpcy5sbyIgOzsKLQliZmRfdmF4X2FyY2gpCQl0YT0iJHRhIHZheC1kaXMubG8iIDs7Ci0JYmZkX3c2NV9hcmNoKQkJdGE9IiR0YSB3NjUtZGlzLmxvIiA7OwotCWJmZF93ZTMya19hcmNoKQkJOzsKLQliZmRfejhrX2FyY2gpCQl0YT0iJHRhIHo4ay1kaXMubG8iIDs7Ci0KLQkiIikJCQk7OwotCSopCQlBQ19NU0dfRVJST1IoKioqIHVua25vd24gdGFyZ2V0IGFyY2hpdGVjdHVyZSAkYXJjaCkgOzsKLQllc2FjCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAkdXNpbmdfY2dlbiA9IHllcyA7IHRoZW4KLQl0YT0iJHRhICRjZ2VuX2ZpbGVzIgotICAgIGZpCi0KLSAgICAjIFdlZWQgb3V0IGR1cGxpY2F0ZSAubyBmaWxlcy4KLSAgICBmPSIiCi0gICAgZm9yIGkgaW4gJHRhIDsgZG8KLQljYXNlICIgJGYgIiBpbgotCSoiICRpICIqKSA7OwotCSopIGY9IiRmICRpIiA7OwotCWVzYWMKLSAgICBkb25lCi0gICAgdGE9IiRmIgotCi0gICAgIyBBbmQgZHVwbGljYXRlIC1EIGZsYWdzLgotICAgIGY9IiIKLSAgICBmb3IgaSBpbiAkYXJjaGRlZnMgOyBkbwotCWNhc2UgIiAkZiAiIGluCi0JKiIgJGkgIiopIDs7Ci0JKikgZj0iJGYgJGkiIDs7Ci0JZXNhYwotICAgIGRvbmUKLSAgICBhcmNoZGVmcz0iJGYiCi0KLSAgICBCRkRfTUFDSElORVM9IiR0YSIKLQotZWxzZQkjIGFsbF90YXJnZXRzIGlzIHRydWUKLSAgICBhcmNoZGVmcz0tREFSQ0hfYWxsCi0gICAgQkZEX01BQ0hJTkVTPSckKEFMTF9NQUNISU5FUyknCi1maQotCi1BQ19TVUJTVChhcmNoZGVmcykKLUFDX1NVQlNUKEJGRF9NQUNISU5FUykKLQotQUNfT1VUUFVUKE1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCi1bc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlXSkKZGlmZiAtLWdpdCBhL29wY29kZXMvZDEwdi1kaXMuYyBiL29wY29kZXMvZDEwdi1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIxYTdkMy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2QxMHYtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgRDEwViBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9kMTB2LmgiIAotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotLyogdGhlIFBDIHdyYXBzIGF0IDE4IGJpdHMsIGV4Y2VwdCBmb3IgdGhlIHNlZ21lbnQgbnVtYmVyICovCi0vKiBzbyB1c2UgdGhpcyBtYXNrIHRvIGtlZXAgdGhlIHBhcnRzIHdlIHdhbnQgKi8KLSNkZWZpbmUgUENfTUFTSwkweDAzMDNGRkZGCi0KLXN0YXRpYyB2b2lkIGRpc18yX3Nob3J0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zbiwgYmZkX3ZtYSBtZW1hZGRyLCAKLQkJCQkgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8sIGludCBvcmRlcikpOwotc3RhdGljIHZvaWQgZGlzX2xvbmcgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnNuLCBiZmRfdm1hIG1lbWFkZHIsIAotCQkJICAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pKTsKLQotaW50IAotcHJpbnRfaW5zbl9kMTB2IChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgc3RhdHVzOwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLQotICBzdGF0dXMgPSBpbnNuICYgRk0xMTsKLSAgc3dpdGNoIChzdGF0dXMpIHsKLSAgY2FzZSAwOgotICAgIGRpc18yX3Nob3J0IChpbnNuLCBtZW1hZGRyLCBpbmZvLCAyKTsKLSAgICBicmVhazsKLSAgY2FzZSBGTTAxOgotICAgIGRpc18yX3Nob3J0IChpbnNuLCBtZW1hZGRyLCBpbmZvLCAwKTsKLSAgICBicmVhazsKLSAgY2FzZSBGTTEwOgotICAgIGRpc18yX3Nob3J0IChpbnNuLCBtZW1hZGRyLCBpbmZvLCAxKTsKLSAgICBicmVhazsKLSAgY2FzZSBGTTExOgotICAgIGRpc19sb25nIChpbnNuLCBtZW1hZGRyLCBpbmZvKTsKLSAgICBicmVhazsKLSAgfQotICByZXR1cm4gNDsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X29wZXJhbmQgKG9wZXIsIGluc24sIG9wLCBtZW1hZGRyLCBpbmZvKQotICAgICBzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcGVyOwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3A7Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBudW0sIHNoaWZ0OwotCi0gIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUTUlOVVMpCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJALSIpOyAgIAotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfTUlOVVMpCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItIik7ICAgCi0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9QTFVTKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKyIpOyAgIAotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRTSUdOKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCIpOyAgIAotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRQQVIpCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJAKCIpOyAgIAotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzaGlmdCA9IG9wZXItPnNoaWZ0OwotCi0gIC8qIHRoZSBMT05HX0wgZm9ybWF0IHNoaWZ0cyByZWdpc3RlcnMgb3ZlciBieSAxNSAqLwotICBpZiAob3AtPmZvcm1hdCA9PSBMT05HX0wgJiYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9SRUcpKQotICAgIHNoaWZ0ICs9IDE1OwotCi0gIG51bSA9IChpbnNuID4+IHNoaWZ0KSAmICgweDdGRkZGRkZGID4+ICgzMSAtIG9wZXItPmJpdHMpKTsKLQotICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1JFRykKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGludCBtYXRjaD0wOwotICAgICAgbnVtICs9IChvcGVyLT5mbGFncwotCSAgICAgICYgKE9QRVJBTkRfR1BSfE9QRVJBTkRfRkZMQUd8T1BFUkFORF9DRkxBR3xPUEVSQU5EX0NPTlRST0wpKTsKLSAgICAgIGlmIChvcGVyLT5mbGFncyAmIChPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxKSkKLQludW0gKz0gbnVtID8gT1BFUkFORF9BQ0MxIDogT1BFUkFORF9BQ0MwOwotICAgICAgZm9yIChpID0gMDsgaSA8IGQxMHZfcmVnX25hbWVfY250KCk7IGkrKykKLQl7Ci0JICBpZiAobnVtID09IGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbaV0udmFsdWUpCi0JICAgIHsKLQkgICAgICBpZiAoZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1tpXS5wbmFtZSkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1tpXS5wbmFtZSk7Ci0JICAgICAgZWxzZQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIixkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW2ldLm5hbWUpOwotCSAgICAgIG1hdGNoPTE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAobWF0Y2ggPT0gMCkKLQl7Ci0JICAvKiB0aGlzIHdvdWxkIG9ubHkgZ2V0IGV4ZWN1dGVkIGlmIGEgcmVnaXN0ZXIgd2FzIG5vdCBpbiB0aGUgCi0JICAgICByZWdpc3RlciB0YWJsZSAqLwotCSAgaWYgKG9wZXItPmZsYWdzICYgKE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzEpKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImEiKTsKLQkgIGVsc2UgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9DT05UUk9MKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImNyIik7Ci0JICBlbHNlIGlmKG9wZXItPmZsYWdzICYgT1BFUkFORF9SRUcpCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiciIpOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsbnVtKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogYWRkcmVzc2VzIGFyZSByaWdodC1zaGlmdGVkIGJ5IDIgKi8KLSAgICAgIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfQUREUikKLQl7Ci0JICBsb25nIG1heDsKLQkgIGludCBuZWc9MDsKLQkgIG1heCA9ICgxIDw8IChvcGVyLT5iaXRzIC0gMSkpOwotCSAgaWYgKG51bSAmIG1heCkKLQkgICAgewotCSAgICAgIG51bSA9IC1udW0gJiAoKDEgPDwgb3Blci0+Yml0cyktMSk7Ci0JICAgICAgbmVnID0gMTsKLQkgICAgfQotCSAgbnVtID0gbnVtPDwyOwotCSAgaWYgKGluZm8tPmZsYWdzICYgSU5TTl9IQVNfUkVMT0MpCi0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAobnVtICYgUENfTUFTSywgaW5mbyk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAobmVnKQotCQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChtZW1hZGRyIC0gbnVtKSAmIFBDX01BU0ssIGluZm8pOwotCSAgICAgIGVsc2UKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciArIG51bSkgJiBQQ19NQVNLLCBpbmZvKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1NJR05FRCkKLQkgICAgewotCSAgICAgIGludCBtYXggPSAoMSA8PCAob3Blci0+Yml0cyAtIDEpKTsKLQkgICAgICBpZiAobnVtICYgbWF4KQotCQl7Ci0JCSAgbnVtID0gLW51bSAmICgoMSA8PCBvcGVyLT5iaXRzKS0xKTsKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0iKTsKLQkJfQotCSAgICB9Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLG51bSk7Ci0JfQotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotZGlzX2xvbmcgKGluc24sIG1lbWFkZHIsIGluZm8pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IGk7Ci0gIGNoYXIgYnVmWzMyXTsKLSAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcCA9IChzdHJ1Y3QgZDEwdl9vcGNvZGUgKilkMTB2X29wY29kZXM7Ci0gIHN0cnVjdCBkMTB2X29wZXJhbmQgKm9wZXI7Ci0gIGludCBuZWVkX3BhcmVuID0gMDsKLSAgaW50IG1hdGNoID0gMDsKLQotICB3aGlsZSAob3AtPm5hbWUpCi0gICAgewotICAgICAgaWYgKChvcC0+Zm9ybWF0ICYgTE9OR19PUENPREUpICYmICgob3AtPm1hc2sgJiBpbnNuKSA9PSBvcC0+b3Bjb2RlKSkKLQl7Ci0JICBtYXRjaCA9IDE7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzXHQiLCBvcC0+bmFtZSk7ICAgCi0JICBmb3IgKCBpPTA7IG9wLT5vcGVyYW5kc1tpXTsgaSsrKQotCSAgICB7Ci0JICAgICAgb3BlciA9IChzdHJ1Y3QgZDEwdl9vcGVyYW5kICopJmQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2ldXTsKLQkgICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVFBBUikKLQkJbmVlZF9wYXJlbiA9IDE7Ci0JICAgICAgcHJpbnRfb3BlcmFuZCAob3BlciwgaW5zbiwgb3AsIG1lbWFkZHIsIGluZm8pOwotCSAgICAgIGlmIChvcC0+b3BlcmFuZHNbaSsxXSAmJiBvcGVyLT5iaXRzICYmCi0JCSAgZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaSsxXV0uZmxhZ3MgIT0gT1BFUkFORF9QTFVTICYmCi0JCSAgZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaSsxXV0uZmxhZ3MgIT0gT1BFUkFORF9NSU5VUykKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsICIpOyAgIAotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICBpZiAoIW1hdGNoKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JTA4eCIsaW5zbik7ICAgCi0KLSAgaWYgKG5lZWRfcGFyZW4pCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7ICAgCi19Ci0KLXN0YXRpYyB2b2lkCi1kaXNfMl9zaG9ydCAoaW5zbiwgbWVtYWRkciwgaW5mbywgb3JkZXIpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgaW50IG9yZGVyOwotewotICBpbnQgaSxqOwotICBjaGFyIGFzdHJbMl1bMzJdOwotICB1bnNpZ25lZCBpbnQgaW5zWzJdOwotICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wOwotICBjaGFyIGJ1ZlszMl07Ci0gIGludCBtYXRjaCwgbnVtX21hdGNoPTA7Ci0gIHN0cnVjdCBkMTB2X29wZXJhbmQgKm9wZXI7Ci0gIGludCBuZWVkX3BhcmVuID0gMDsKLQotICBpbnNbMF0gPSAoaW5zbiAmIDB4M0ZGRkZGRkYpID4+IDE1OwotICBpbnNbMV0gPSBpbnNuICYgMHgwMDAwN0ZGRjsKLQotICBmb3Ioaj0wO2o8MjtqKyspCi0gICAgewotICAgICAgb3AgPSAoc3RydWN0IGQxMHZfb3Bjb2RlICopZDEwdl9vcGNvZGVzOwotICAgICAgbWF0Y2g9MDsKLSAgICAgIHdoaWxlIChvcC0+bmFtZSkKLQl7Ci0JICBpZiAoKG9wLT5mb3JtYXQgJiBTSE9SVF9PUENPREUpICYmICgob3AtPm1hc2sgJiBpbnNbal0pID09IG9wLT5vcGNvZGUpKQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1x0IixvcC0+bmFtZSk7ICAgCi0JICAgICAgZm9yIChpPTA7IG9wLT5vcGVyYW5kc1tpXTsgaSsrKQotCQl7Ci0JCSAgb3BlciA9IChzdHJ1Y3QgZDEwdl9vcGVyYW5kICopJmQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2ldXTsKLQkJICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVFBBUikKLQkJICAgIG5lZWRfcGFyZW4gPSAxOwotCQkgIHByaW50X29wZXJhbmQgKG9wZXIsIGluc1tqXSwgb3AsIG1lbWFkZHIsIGluZm8pOwotCQkgIGlmIChvcC0+b3BlcmFuZHNbaSsxXSAmJiBvcGVyLT5iaXRzICYmIAotCQkgIGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2krMV1dLmZsYWdzICE9IE9QRVJBTkRfUExVUyAmJgotCQkgIGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2krMV1dLmZsYWdzICE9IE9QRVJBTkRfTUlOVVMpCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwgIik7ICAgCi0JCX0KLQkgICAgICBtYXRjaCA9IDE7Ci0JICAgICAgbnVtX21hdGNoKys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIG9wKys7Ci0JfQotICAgICAgaWYgKCFtYXRjaCkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInVua25vd24iKTsgICAKLQotICAgICAgc3dpdGNoIChvcmRlcikKLQl7Ci0JY2FzZSAwOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdC0+XHQiKTsgICAKLQkgIG9yZGVyID0gLTE7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0PC1cdCIpOyAgIAotCSAgb3JkZXIgPSAtMTsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHR8fFx0Iik7ICAgCi0JICBvcmRlciA9IC0xOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKG51bV9tYXRjaCA9PSAwKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JTA4eCIsaW5zbik7ICAgCi0KLSAgaWYgKG5lZWRfcGFyZW4pCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7ICAgCi19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2QxMHYtb3BjLmMgYi9vcGNvZGVzL2QxMHYtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YTAyZDAuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9kMTB2LW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qIGQxMHYtb3BjLmMgLS0gRDEwViBvcGNvZGUgbGlzdAotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50LCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9kMTB2LmgiCi0KLQotLyogICBUaGUgdGFibGUgaXMgc29ydGVkLiBTdWl0YWJsZSBmb3Igc2VhcmNoaW5nIGJ5IGEgYmluYXJ5IHNlYXJjaC4gKi8KLWNvbnN0IHN0cnVjdCBwZF9yZWcgZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiYTAiLCBOVUxMLCBPUEVSQU5EX0FDQzArMCB9LAotICB7ICJhMSIsIE5VTEwsIE9QRVJBTkRfQUNDMSsxIH0sCi0gIHsgImJwYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszIH0sCi0gIHsgImJwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMSB9LAotICB7ICJjIiwgTlVMTCwgT1BFUkFORF9DRkxBRyszIH0sCi0gIHsgImNyMCIsICJwc3ciLCBPUEVSQU5EX0NPTlRST0wgfSwKLSAgeyAiY3IxIiwgImJwc3ciLCBPUEVSQU5EX0NPTlRST0wrMSB9LAotICB7ICJjcjEwIiwgIm1vZF9zIiwgT1BFUkFORF9DT05UUk9MKzEwIH0sCi0gIHsgImNyMTEiLCAibW9kX2UiLCBPUEVSQU5EX0NPTlRST0wrMTEgfSwKLSAgeyAiY3IxMiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMiB9LAotICB7ICJjcjEzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEzIH0sCi0gIHsgImNyMTQiLCAiaWJhIiwgT1BFUkFORF9DT05UUk9MKzE0IH0sCi0gIHsgImNyMTUiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTUgfSwKLSAgeyAiY3IyIiwgInBjIiwgT1BFUkFORF9DT05UUk9MKzIgfSwKLSAgeyAiY3IzIiwgImJwYyIsIE9QRVJBTkRfQ09OVFJPTCszIH0sCi0gIHsgImNyNCIsICJkcHN3IiwgT1BFUkFORF9DT05UUk9MKzQgfSwKLSAgeyAiY3I1IiwgImRwYyIsIE9QRVJBTkRfQ09OVFJPTCs1IH0sCi0gIHsgImNyNiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs2IH0sCi0gIHsgImNyNyIsICJycHRfYyIsIE9QRVJBTkRfQ09OVFJPTCs3IH0sCi0gIHsgImNyOCIsICJycHRfcyIsIE9QRVJBTkRfQ09OVFJPTCs4IH0sCi0gIHsgImNyOSIsICJycHRfZSIsIE9QRVJBTkRfQ09OVFJPTCs5IH0sCi0gIHsgImRwYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1IH0sCi0gIHsgImRwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNCB9LAotICB7ICJmMCIsIE5VTEwsIE9QRVJBTkRfRkZMQUcrMCB9LAotICB7ICJmMSIsIE5VTEwsIE9QRVJBTkRfRkZMQUcrMSB9LAotICB7ICJpYmEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTQgfSwKLSAgeyAibGluayIsICJyMTMiLCBPUEVSQU5EX0dQUisxMyB9LAotICB7ICJtb2RfZSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMSB9LAotICB7ICJtb2RfcyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMCB9LAotICB7ICJwYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyIH0sCi0gIHsgInBzdyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCswIH0sCi0gIHsgInIwIiwgTlVMTCwgT1BFUkFORF9HUFIrMCB9LAotICB7ICJyMC1yMSIsIE5VTEwsIE9QRVJBTkRfR1BSKzB9LAotICB7ICJyMSIsIE5VTEwsIE9QRVJBTkRfR1BSKzEgfSwKLSAgeyAicjEiLCBOVUxMLCBPUEVSQU5EX0dQUisxIH0sCi0gIHsgInIxMCIsIE5VTEwsIE9QRVJBTkRfR1BSKzEwIH0sCi0gIHsgInIxMC1yMTEiLCBOVUxMLCBPUEVSQU5EX0dQUisxMCB9LAotICB7ICJyMTEiLCBOVUxMLCBPUEVSQU5EX0dQUisxMSB9LAotICB7ICJyMTIiLCBOVUxMLCBPUEVSQU5EX0dQUisxMiB9LAotICB7ICJyMTItcjEzIiwgTlVMTCwgT1BFUkFORF9HUFIrMTIgfSwKLSAgeyAicjEzIiwgTlVMTCwgT1BFUkFORF9HUFIrMTMgfSwKLSAgeyAicjE0IiwgTlVMTCwgT1BFUkFORF9HUFIrMTQgfSwKLSAgeyAicjE0LXIxNSIsIE5VTEwsIE9QRVJBTkRfR1BSKzE0IH0sCi0gIHsgInIxNSIsICJzcCIsIE9QRVJBTkRfR1BSKzE1IH0sCi0gIHsgInIyIiwgTlVMTCwgT1BFUkFORF9HUFIrMiB9LAotICB7ICJyMi1yMyIsIE5VTEwsIE9QRVJBTkRfR1BSKzIgfSwKLSAgeyAicjMiLCBOVUxMLCBPUEVSQU5EX0dQUiszIH0sCi0gIHsgInI0IiwgTlVMTCwgT1BFUkFORF9HUFIrNCB9LAotICB7ICJyNC1yNSIsIE5VTEwsIE9QRVJBTkRfR1BSKzQgfSwKLSAgeyAicjUiLCBOVUxMLCBPUEVSQU5EX0dQUis1IH0sCi0gIHsgInI2IiwgTlVMTCwgT1BFUkFORF9HUFIrNiB9LAotICB7ICJyNi1yNyIsIE5VTEwsIE9QRVJBTkRfR1BSKzYgfSwKLSAgeyAicjciLCBOVUxMLCBPUEVSQU5EX0dQUis3IH0sCi0gIHsgInI4IiwgTlVMTCwgT1BFUkFORF9HUFIrOCB9LAotICB7ICJyOC1yOSIsIE5VTEwsIE9QRVJBTkRfR1BSKzggfSwKLSAgeyAicjkiLCBOVUxMLCBPUEVSQU5EX0dQUis5IH0sCi0gIHsgInJwdF9jIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzcgfSwKLSAgeyAicnB0X2UiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrOSB9LAotICB7ICJycHRfcyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs4IH0sCi0gIHsgInNwIiwgTlVMTCwgT1BFUkFORF9HUFIrMTUgfSwKLX07Ci0KLWludCAKLWQxMHZfcmVnX25hbWVfY250KCkKLXsKLSAgcmV0dXJuIChzaXplb2YoZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHBkX3JlZykpOwotfQotCi1jb25zdCBzdHJ1Y3QgZDEwdl9vcGVyYW5kIGQxMHZfb3BlcmFuZHNbXSA9Ci17Ci0jZGVmaW5lIFVOVVNFRAkoMCkKLSAgeyAwLCAwLCAwIH0sCi0jZGVmaW5lIFJTUkMJKFVOVVNFRCArIDEpCi0gIHsgNCwgMSwgT1BFUkFORF9HUFJ8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgUkRTVAkoUlNSQyArIDEpCi0gIHsgNCwgNSwgT1BFUkFORF9ERVNUfE9QRVJBTkRfR1BSfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIEFTUkMJKFJEU1QgKyAxKQotICB7IDEsIDQsIE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzF8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgQVNSQzBPTkxZIChBU1JDICsgMSkKLSAgeyAxLCA0LCBPUEVSQU5EX0FDQzB8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgQURTVAkoQVNSQzBPTkxZICsgMSkKLSAgeyAxLCA4LCBPUEVSQU5EX0RFU1R8T1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMXxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSU1JDRQkoQURTVCArIDEpCi0gIHsgNCwgMSwgT1BFUkFORF9FVkVOfE9QRVJBTkRfR1BSfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIFJEU1RFCShSU1JDRSArIDEpCi0gIHsgNCwgNSwgT1BFUkFORF9FVkVOfE9QRVJBTkRfREVTVHxPUEVSQU5EX0dQUnxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBOVU0xNgkoUkRTVEUgKyAxKQotICB7IDE2LCAwLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBOVU0zCShOVU0xNiArIDEpCQkJLyogcmFjLCByYWNoaSAqLwotICB7IDMsIDEsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEIH0sCi0jZGVmaW5lIE5VTTQJKE5VTTMgKyAxKQotICB7IDQsIDEsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEIH0sCi0jZGVmaW5lIFVOVU00CShOVU00ICsgMSkKLSAgeyA0LCAxLCBPUEVSQU5EX05VTSB9LAotI2RlZmluZSBVTlVNNFMJKFVOVU00ICsgMSkJCQkvKiBhZGRpLCBzbGxpLCBzcmFpLCBzcmxpLCBzdWJpICovCi0gIHsgNCwgMSwgT1BFUkFORF9OVU18T1BFUkFORF9TSElGVCB9LAotI2RlZmluZSBVTlVNOAkoVU5VTTRTICsgMSkJCQkvKiByZXBpICovCi0gIHsgOCwgMTYsIE9QRVJBTkRfTlVNIH0sCi0jZGVmaW5lIFVOVU0xNgkoVU5VTTggKyAxKQkJCS8qIGNtcHVpICovCi0gIHsgMTYsIDAsIE9QRVJBTkRfTlVNIH0sCi0jZGVmaW5lIEFOVU0xNgkoVU5VTTE2ICsgMSkKLSAgeyAxNiwgMCwgT1BFUkFORF9BRERSfE9QRVJBTkRfU0lHTkVEIH0sCi0jZGVmaW5lIEFOVU04CShBTlVNMTYgKyAxKQotICB7IDgsIDAsIE9QRVJBTkRfQUREUnxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBBU1JDMgkoQU5VTTggKyAxKQotICB7IDEsIDgsIE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzF8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgUlNSQzIJKEFTUkMyICsgMSkKLSAgeyA0LCA1LCBPUEVSQU5EX0dQUnxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSU1JDMkUJKFJTUkMyICsgMSkKLSAgeyA0LCA1LCBPUEVSQU5EX0dQUnxPUEVSQU5EX1JFR3xPUEVSQU5EX0VWRU4gfSwKLSNkZWZpbmUgQVNSQzAJKFJTUkMyRSArIDEpCi0gIHsgMSwgMCwgT1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMXxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBBRFNUMAkoQVNSQzAgKyAxKQotICB7IDEsIDAsIE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzF8T1BFUkFORF9SRUd8T1BFUkFORF9ERVNUIH0sCi0jZGVmaW5lIEZGU1JDCShBRFNUMCArIDEpCi0gIHsgMiwgMSwgT1BFUkFORF9SRUcgfCBPUEVSQU5EX0ZGTEFHIH0sCi0jZGVmaW5lIENGU1JDCShGRlNSQyArIDEpCi0gIHsgMiwgMSwgT1BFUkFORF9SRUcgfCBPUEVSQU5EX0NGTEFHIH0sCi0jZGVmaW5lIEZEU1QJKENGU1JDICsgMSkKLSAgeyAxLCA1LCBPUEVSQU5EX1JFRyB8IE9QRVJBTkRfRkZMQUcgfCBPUEVSQU5EX0RFU1R9LAotI2RlZmluZSBBVFNJR04JKEZEU1QgKyAxKQotICB7IDAsIDAsIE9QRVJBTkRfQVRTSUdOfSwKLSNkZWZpbmUgQVRQQVIJKEFUU0lHTiArIDEpCS8qICJAKCIgKi8KLSAgeyAwLCAwLCBPUEVSQU5EX0FUUEFSfSwKLSNkZWZpbmUgUExVUwkoQVRQQVIgKyAxKQkvKiBwb3N0aW5jcmVtZW50ICovCi0gIHsgMCwgMCwgT1BFUkFORF9QTFVTfSwKLSNkZWZpbmUgTUlOVVMJKFBMVVMgKyAxKQkvKiBwb3N0ZGVjcmVtZW50ICovCi0gIHsgMCwgMCwgT1BFUkFORF9NSU5VU30sCi0jZGVmaW5lIEFUTUlOVVMJKE1JTlVTICsgMSkJLyogcHJlZGVjcmVtZW50ICovCi0gIHsgMCwgMCwgT1BFUkFORF9BVE1JTlVTfSwKLSNkZWZpbmUgQ1NSQwkoQVRNSU5VUyArIDEpCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgeyA0LCAxLCBPUEVSQU5EX1JFR3xPUEVSQU5EX0NPTlRST0x9LAotI2RlZmluZSBDRFNUCShDU1JDICsgMSkJLyogY29udHJvbCByZWdpc3RlciAqLwotICB7IDQsIDUsIE9QRVJBTkRfUkVHfE9QRVJBTkRfQ09OVFJPTHxPUEVSQU5EX0RFU1R9LAotfTsKLQotY29uc3Qgc3RydWN0IGQxMHZfb3Bjb2RlIGQxMHZfb3Bjb2Rlc1tdID0gewotICB7ICJhYnMiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXRjAsIDB4NDYwNywgMHg3ZTFmLCB7IFJEU1QgfSB9LAotICB7ICJhYnMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHg1NjA3LCAweDdlZmYsIHsgQURTVCB9IH0sCi0gIHsgImFkZCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdDQVIsIDB4MDIwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJhZGQiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDEyMDEsIDB4N2VlMywgeyBBRFNULCBSU1JDRSB9IH0sCi0gIHsgImFkZCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MTIwMywgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAotICB7ICJhZGQydyIsIFNIT1JUXzIsIDIsIElVLCBQQVJ8V0NBUiwgMHgxMjAwLCAweDdlMjMsIHsgUkRTVEUsIFJTUkNFIH0gfSwKLSAgeyAiYWRkMyIsIExPTkdfTCwgMSwgTVUsIFNFUXxXQ0FSLCAweDEwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUkRTVCwgUlNSQywgTlVNMTYgfSB9LAotICB7ICJhZGRhYzMiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDAyMDAsIDB4M2ZmZmZlMjIsIHsgUkRTVEUsIFJTUkNFLCBBU1JDMCB9IH0sCi0gIHsgImFkZGFjMyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMDIwMiwgMHgzZmZmZmUyZSwgeyBSRFNURSwgQVNSQywgQVNSQzAgfSB9LAotICB7ICJhZGRhYzNzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAxMjAwLCAweDNmZmZmZTIyLCB7IFJEU1RFLCBSU1JDRSwgQVNSQzAgfSB9LAotICB7ICJhZGRhYzNzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAxMjAyLCAweDNmZmZmZTJlLCB7IFJEU1RFLCBBU1JDLCBBU1JDMCB9IH0sCi0gIHsgImFkZGkiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXQ0FSLCAgMHgyMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNFMgfSB9LAotICB7ICJhbmQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHhjMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAiYW5kMyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHg2MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIFJTUkMsIE5VTTE2IH0gfSwKLSAgeyAiYmNscmkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweGMwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAiYmwiLCBPUENPREVfRkFLRSwgMCwgMCwgMCwgMCwgMCwgeyAwLCA4LCAxNiwgMCB9IH0sCi0gIHsgImJsLnMiLCBTSE9SVF9CLCAzLCBNVSwgQlJBTkNIX0xJTkt8UEFSLCAweDQ5MDAsIDB4N2YwMCwgeyBBTlVNOCB9IH0sCi0gIHsgImJsLmwiLCBMT05HX0IsIDMsIE1VLCBCUkFOQ0hfTElOS3xTRVEsIDB4MjQ4MDAwMDAsIDB4M2ZmZjAwMDAsIHsgQU5VTTE2IH0gfSwKLSAgeyAiYm5vdGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweGEwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAiYnJhIiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMCwgOCwgMTYsIDAgfSB9LAotICB7ICJicmEucyIsIFNIT1JUX0IsIDMsIE1VLCBCUkFOQ0h8UEFSLCAweDQ4MDAsIDB4N2YwMCwgeyBBTlVNOCB9IH0sCi0gIHsgImJyYS5sIiwgTE9OR19CLCAzLCBNVSwgQlJBTkNIfFNFUSwgMHgyNDAwMDAwMCwgMHgzZmZmMDAwMCwgeyBBTlVNMTYgfSB9LAotICB7ICJicmYwZiIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDAsIDgsIDE2LCAwIH0gfSwKLSAgeyAiYnJmMGYucyIsIFNIT1JUX0IsIDMsIE1VLCBCUkFOQ0h8UEFSfFJGMCwgMHg0YTAwLCAweDdmMDAsIHsgQU5VTTggfSB9LAotICB7ICJicmYwZi5sIiwgTE9OR19CLCAzLCBNVSwgU0VRLCAweDI1MDAwMDAwLCAweDNmZmYwMDAwLCB7IEFOVU0xNiB9IH0sCi0gIHsgImJyZjB0IiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMCwgOCwgMTYsIDAgfSB9LAotICB7ICJicmYwdC5zIiwgU0hPUlRfQiwgMywgTVUsIEJSQU5DSHxQQVJ8UkYwLCAweDRiMDAsIDB4N2YwMCwgeyBBTlVNOCB9IH0sCi0gIHsgImJyZjB0LmwiLCBMT05HX0IsIDMsIE1VLCBTRVEsIDB4MjU4MDAwMDAsIDB4M2ZmZjAwMDAsIHsgQU5VTTE2IH0gfSwKLSAgeyAiYnNldGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDgwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAiYnRzdGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHhlMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgImNscmFjIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHg1NjAxLCAweDdlZmYsIHsgQURTVCB9IH0sCi0gIHsgImNtcCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdGMCwgMHg2MDAsIDB4N2UwMSwgeyBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgImNtcCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDE2MDMsIDB4N2VlZiwgeyBBU1JDMiwgQVNSQyB9IH0sCi0gIHsgImNtcGVxIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0YwLCAweDQwMCwgMHg3ZTAxLCB7IFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAiY21wZXEiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgxNDAzLCAweDdlZWYsIHsgQVNSQzIsIEFTUkMgfSB9LAotICB7ICJjbXBlcWkiLCBPUENPREVfRkFLRSwgMCwgMCwgMCwgMCwgMCwgeyAxLCA0LCAxNiwgMCB9IH0sCi0gIHsgImNtcGVxaS5zIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0YwLCAweDQwMSwgMHg3ZTAxLCB7IFJTUkMyLCBOVU00IH0gfSwKLSAgeyAiY21wZXFpLmwiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MjAwMDAwMCwgMHgzZjBmMDAwMCwgeyBSU1JDMiwgTlVNMTYgfSB9LAotICB7ICJjbXBpIiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMSwgNCwgMTYsIDAgfSB9LAotICB7ICJjbXBpLnMiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXRjAsIDB4NjAxLCAweDdlMDEsIHsgUlNSQzIsIE5VTTQgfSB9LAotICB7ICJjbXBpLmwiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzAwMDAwMCwgMHgzZjBmMDAwMCwgeyBSU1JDMiwgTlVNMTYgfSB9LAotICB7ICJjbXB1IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0YwLCAweDQ2MDAsIDB4N2UwMSwgeyBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgImNtcHVpIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDIzMDAwMDAwLCAweDNmMGYwMDAwLCB7IFJTUkMyLCBVTlVNMTYgfSB9LAotICB7ICJjcGZnIiwgU0hPUlRfMiwgMSwgTVUsIFBBUiwgMHg0ZTA5LCAweDdmZDksIHsgRkRTVCwgRkZTUkMgfSB9LAotICB7ICJjcGZnIiwgU0hPUlRfMiwgMSwgTVUsIFBBUiwgMHg0ZTA5LCAweDdmZDksIHsgRkRTVCwgQ0ZTUkMgfSB9LAotICB7ICJkYnQiLCBTSE9SVF8yLCA1LCBNVSwgUEFSLCAweDVmMjAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZGl2cyIsIExPTkdfTCwgMSwgQk9USCwgU0VRLCAweDE0MDAyODAwLCAweDNmMTBmZTIxLCB7IFJEU1RFLCBSU1JDIH0gfSwKLSAgeyAiZXhlZjBmIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMDQsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhlZjB0IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMjQsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhlZjFmIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlNDAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhlZjF0IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlNDIsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhlZmFmIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMDAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhlZmF0IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMDIsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhldGFmIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMjAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhldGF0IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJPTkxZLCAweDRlMjIsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAiZXhwIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE1MDAyYTAwLCAweDNmZmZmZTAzLCB7IFJEU1QsIFJTUkNFIH0gfSwKLSAgeyAiZXhwIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE1MDAyYTAyLCAweDNmZmZmZTBmLCB7IFJEU1QsIEFTUkMgfSB9LAotICB7ICJqbCIsIFNIT1JUXzIsIDMsIE1VLCBCUkFOQ0hfTElOS3xQQVIsIDB4NGQwMCwgMHg3ZmUxLCB7IFJTUkMgfSB9LAotICB7ICJqbXAiLCBTSE9SVF8yLCAzLCBNVSwgQlJBTkNIfFBBUiwgMHg0YzAwLCAweDdmZTEsIHsgUlNSQyB9IH0sCi0gIHsgImxkIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDMwMDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCi0gIHsgImxkIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDY0MDEsIDB4N2UwMSwgeyBSRFNULCBBVFNJR04sIFJTUkMsIE1JTlVTIH0gfSwKLSAgeyAibGQiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NjAwMSwgMHg3ZTAxLCB7IFJEU1QsIEFUU0lHTiwgUlNSQywgUExVUyB9IH0sCi0gIHsgImxkIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDYwMDAsIDB4N2UwMSwgeyBSRFNULCBBVFNJR04sIFJTUkMgfSB9LAotICB7ICJsZDJ3IiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDMxMDAwMDAwLCAweDNmMTAwMDAwLCB7IFJEU1RFLCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJsZDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDY2MDEsIDB4N2UyMSwgeyBSRFNURSwgQVRTSUdOLCBSU1JDLCBNSU5VUyB9IH0sCi0gIHsgImxkMnciLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NjIwMSwgMHg3ZTIxLCB7IFJEU1RFLCBBVFNJR04sIFJTUkMsIFBMVVMgfSB9LAotICB7ICJsZDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDYyMDAsIDB4N2UyMSwgeyBSRFNURSwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAibGRiIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDM4MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCi0gIHsgImxkYiIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg3MDAwLCAweDdlMDEsIHsgUkRTVCwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAibGRpIiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMSwgNCwgMTYsIDAgfSB9LAotICB7ICJsZGkucyIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFJNRU0sIDB4NDAwMSwgMHg3ZTAxICwgeyBSRFNULCBOVU00IH0gfSwKLSAgeyAibGRpLmwiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MjAwMDAwMDAsIDB4M2YwZjAwMDAsIHsgUkRTVCwgTlVNMTYgfSB9LAotICB7ICJsZHViIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDM5MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCi0gIHsgImxkdWIiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NzIwMCwgMHg3ZTAxLCB7IFJEU1QsIEFUU0lHTiwgUlNSQyB9IH0sCi0gIHsgIm1hYyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MmEwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm1hY3N1IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxYTAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibWFjdSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4M2EwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm1heCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDI2MDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibWF4IiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MzYwMCwgMHg3ZWUzLCB7IEFEU1QsIFJTUkNFIH0gfSwKLSAgeyAibWF4IiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MzYwMiwgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAotICB7ICJtaW4iLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgyNjAxLCAweDdlMDEgLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJtaW4iLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgzNjAxLCAweDdlZTMgLCB7IEFEU1QsIFJTUkNFIH0gfSwKLSAgeyAibWluIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MzYwMywgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAotICB7ICJtc2IiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDI4MDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtc2JzdSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MTgwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm1zYnUiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDM4MDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtdWwiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDJlMDAsIDB4N2UwMSAsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm11bHgiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDJjMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtdWx4c3UiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFjMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtdWx4dSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4M2MwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm12IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4NDAwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJtdjJ3IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHg1MDAwLCAweDdlMjMsIHsgUkRTVEUsIFJTUkNFIH0gfSwKLSAgeyAibXYyd2ZhYyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4M2UwMCwgMHg3ZTJmLCB7IFJEU1RFLCBBU1JDIH0gfSwKLSAgeyAibXYyd3RhYyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4M2UwMSwgMHg3ZWUzLCB7IFJTUkNFLCBBRFNUIH0gfSwKLSAgeyAibXZhYyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4M2UwMywgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAotICB7ICJtdmIiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDU0MDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibXZmMGYiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxSRjAsIDB4NDQwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJtdmYwdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFJGMCwgMHg0NDAxLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm12ZmFjZyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWUwNCwgMHg3ZTBmLCB7IFJEU1QsIEFTUkMgfSB9LAotICB7ICJtdmZhY2hpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxZTAwLCAweDdlMGYsIHsgUkRTVCwgQVNSQyB9IH0sCi0gIHsgIm12ZmFjbG8iLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFlMDIsIDB4N2UwZiwgeyBSRFNULCBBU1JDIH0gfSwKLSAgeyAibXZmYyIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NTIwMCwgMHg3ZTAxLCB7IFJEU1QsIENTUkMgfSB9LAotICB7ICJtdnRhY2ciLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFlNDEsIDB4N2VlMSwgeyBSU1JDLCBBRFNUIH0gfSwKLSAgeyAibXZ0YWNoaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWUwMSwgMHg3ZWUxLCB7IFJTUkMsIEFEU1QgfSB9LAotICB7ICJtdnRhY2xvIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxZTIxLCAweDdlZTEsIHsgUlNSQywgQURTVCB9IH0sCi0gIHsgIm12dGMiLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDU2MDAsIDB4N2UwMSwgeyBSU1JDLCBDRFNUIH0gfSwKLSAgeyAibXZ1YiIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4NTQwMSwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJuZWciLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHg0NjA1LCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgIm5lZyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4NTYwNSwgMHg3ZWZmLCB7IEFEU1QgfSB9LAotICB7ICJub3AiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHg1ZTAwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgIm5vdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweDQ2MDMsIDB4N2UxZiwgeyBSRFNUIH0gfSwKLSAgeyAib3IiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHg4MDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAib3IzIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDQwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUkRTVCwgUlNSQywgTlVNMTYgfSB9LAotICB7ICJyYWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHg1MjAxLCAweDdlMjEsIHsgUkRTVEUsIEFTUkMwT05MWSwgTlVNMyB9IH0sCi0gIHsgInJhY2hpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4NDIwMSwgMHg3ZTAxLCB7IFJEU1QsIEFTUkMsIE5VTTMgfSB9LAotICB7ICJyZXAiLCBMT05HX0wsIDIsIE1VLCBTRVEsIDB4MjcwMDAwMDAsIDB4M2ZmMDAwMDAsIHsgUlNSQywgQU5VTTE2IH0gfSwKLSAgeyAicmVwaSIsIExPTkdfTCwgMiwgTVUsIFNFUSwgMHgyZjAwMDAwMCwgMHgzZjAwMDAwMCwgeyBVTlVNOCwgQU5VTTE2IH0gfSwKLSAgeyAicnRkIiwgU0hPUlRfMiwgMywgTVUsIFBBUiwgMHg1ZjYwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgInJ0ZSIsIFNIT1JUXzIsIDMsIE1VLCBQQVIsIDB4NWY0MCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJzYWRkIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxMjIzLCAweDdlZWYsIHsgQURTVCwgQVNSQyB9IH0sCi0gIHsgInNldGYwZiIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8UkYwLCAweDQ2MTEsIDB4N2UxZiwgeyBSRFNUIH0gfSwKLSAgeyAic2V0ZjB0IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSRjAsIDB4NDYxMywgMHg3ZTFmLCB7IFJEU1QgfSB9LAotICB7ICJzbGVlcCIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NWZjMCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJzbGwiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDIyMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAic2xsIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzMjAwLCAweDdlZTEsIHsgQURTVCwgUlNSQyB9IH0sCi0gIHsgInNsbGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDIyMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgInNsbGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDMyMDEsIDB4N2VlMSwgeyBBRFNULCBVTlVNNFMgfSB9LAotICB7ICJzbHgiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFJGMCwgMHg0NjBiLCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgInNyYSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MjQwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJzcmEiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDM0MDAsIDB4N2VlMSwgeyBBRFNULCBSU1JDIH0gfSwKLSAgeyAic3JhaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MjQwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAic3JhaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MzQwMSwgMHg3ZWUxLCB7IEFEU1QsIFVOVU00UyB9IH0sCi0gIHsgInNybCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MjAwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJzcmwiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDMwMDAsIDB4N2VlMSwgeyBBRFNULCBSU1JDIH0gfSwKLSAgeyAic3JsaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MjAwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAic3JsaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MzAwMSwgMHg3ZWUxLCB7IEFEU1QsIFVOVU00UyB9IH0sCi0gIHsgInNyeCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8UkYwLCAweDQ2MDksIDB4N2UxZiwgeyBSRFNUIH0gfSwKLSAgeyAic3QiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzQwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUlNSQzIsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCi0gIHsgInN0IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDY4MDAsIDB4N2UwMSwgeyBSU1JDMiwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAic3QiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NmMxZiwgMHg3ZTFmLCB7IFJTUkMyLCBBVE1JTlVTLCBSU1JDIH0gfSwKLSAgeyAic3QiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NjgwMSwgMHg3ZTAxLCB7IFJTUkMyLCBBVFNJR04sIFJTUkMsIFBMVVMgfSB9LAotICB7ICJzdCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2YzAxLCAweDdlMDEsIHsgUlNSQzIsIEFUU0lHTiwgUlNSQywgTUlOVVMgfSB9LAotICB7ICJzdDJ3IiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDM1MDAwMDAwLCAweDNmMTAwMDAwLCB7IFJTUkMyRSwgQVRQQVIsIE5VTTE2LCBSU1JDIH0gfSwKLSAgeyAic3QydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2YTAwLCAweDdlMjEsIHsgUlNSQzJFLCBBVFNJR04sIFJTUkMgfSB9LAotICB7ICJzdDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDZlMWYsIDB4N2UzZiwgeyBSU1JDMkUsIEFUTUlOVVMsIFJTUkMgfSB9LAotICB7ICJzdDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDZhMDEsIDB4N2UyMSwgeyBSU1JDMkUsIEFUU0lHTiwgUlNSQywgUExVUyB9IH0sCi0gIHsgInN0MnciLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NmUwMSwgMHg3ZTIxLCB7IFJTUkMyRSwgQVRTSUdOLCBSU1JDLCBNSU5VUyB9IH0sCi0gIHsgInN0YiIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzYzAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSU1JDMiwgQVRQQVIsIE5VTTE2LCBSU1JDIH0gfSwKLSAgeyAic3RiIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDc4MDAsIDB4N2UwMSwgeyBSU1JDMiwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAic3RvcCIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NWZlMCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJzdWIiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXQ0FSLCAweDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAic3ViIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxMDAxLCAweDdlZTMsIHsgQURTVCwgUlNSQyB9IH0sCi0gIHsgInN1YiIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MTAwMywgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAotICB7ICJzdWIydyIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0NBUiwgMHgxMDAwLCAweDdlMjMsIHsgUkRTVEUsIFJTUkNFIH0gfSwKLSAgeyAic3ViYWMzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAwMDAwLCAweDNmZmZmZTIyLCB7IFJEU1RFLCBSU1JDRSwgQVNSQzAgfSB9LAotICB7ICJzdWJhYzMiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDAwMDIsIDB4M2ZmZmZlMmUsIHsgUkRTVEUsIEFTUkMsIEFTUkMwIH0gfSwKLSAgeyAic3ViYWMzcyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMTAwMCwgMHgzZmZmZmUyMiwgeyBSRFNURSwgUlNSQ0UsIEFTUkMwIH0gfSwKLSAgeyAic3ViYWMzcyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMTAwMiwgMHgzZmZmZmUyZSwgeyBSRFNURSwgQVNSQywgQVNSQzAgfSB9LAotICB7ICJzdWJpIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4MSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00UyB9IH0sCi0gIHsgInRyYXAiLCBTSE9SVF8yLCA1LCBNVSwgQlJBTkNIX0xJTkt8UEFSLCAweDVmMDAsIDB4N2ZlMSwgeyBVTlVNNCB9IH0sCi0gIHsgInRzdDBpIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDcwMDAwMDAsIDB4M2YwZjAwMDAsIHsgUlNSQzIsIE5VTTE2IH0gfSwKLSAgeyAidHN0MWkiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4ZjAwMDAwMCwgMHgzZjBmMDAwMCwgeyBSU1JDMiwgTlVNMTYgfSB9LAotICB7ICJ3YWl0IiwgU0hPUlRfMiwgMSwgTVUsIFBBUiwgMHg1ZjgwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgInhvciIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweGEwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJ4b3IzIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDUwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUkRTVCwgUlNSQywgTlVNMTYgfSB9LAotICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIHsgMCB9IH0sCi19OwotCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvZDMwdi1kaXMuYyBiL29wY29kZXMvZDMwdi1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1OGI3NS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2QzMHYtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgRDMwViBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgIm9wY29kZS9kMzB2LmgiIAotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotI2RlZmluZSBQQ19NQVNLIDB4RkZGRkZGRkYKLQotc3RhdGljIGludCBsb29rdXBfb3Bjb2RlIFBBUkFNUyAoKCBzdHJ1Y3QgZDMwdl9pbnNuICppbnNuLCBsb25nIG51bSwgaW50IGlzX2xvbmcgKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9pbnNuIFBBUkFNUyAoKCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbywgYmZkX3ZtYSBtZW1hZGRyLCBsb25nIGxvbmcgbnVtLCAKLQkJCQkgc3RydWN0IGQzMHZfaW5zbiAqaW5zbiwgaW50IGlzX2xvbmcsIGludCBzaG93X2V4dCApKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF92YWx1ZSBQQVJBTVMgKCggbG9uZyBsb25nIG51bSwgc3RydWN0IGQzMHZfb3BlcmFuZCAqb3BlciwgaW50IGlzX2xvbmcgKSk7Ci0KLWludCAKLXByaW50X2luc25fZDMwdiAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IHN0YXR1cywgcmVzdWx0OwotICBiZmRfYnl0ZSBidWZmZXJbMTJdOwotICB1bnNpZ25lZCBsb25nIGluMSxpbjI7Ci0gIHN0cnVjdCBkMzB2X2luc24gaW5zbjsKLSAgbG9uZyBsb25nIG51bTsKLQotICBpbnNuLmZvcm0gPSAoc3RydWN0IGQzMHZfZm9ybWF0ICopTlVMTDsKLQotICBpbmZvLT5ieXRlc19wZXJfbGluZSA9IDg7Ci0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDQ7Ci0gIGluZm8tPmRpc3BsYXlfZW5kaWFuID0gQkZEX0VORElBTl9CSUc7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaW4xID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyKzQsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICBpbmZvLT5ieXRlc19wZXJfbGluZSA9IDg7Ci0gICAgICBpZiAoIShyZXN1bHQgPSBsb29rdXBfb3Bjb2RlKCZpbnNuLCBpbjEsIDApKSkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCV4IixpbjEpOwotICAgICAgZWxzZQotCXByaW50X2luc24oaW5mbywgbWVtYWRkciwgKGxvbmcgbG9uZykgaW4xLCAmaW5zbiwgMCwgcmVzdWx0KTsKLSAgICAgIHJldHVybiA0OyAgICAgIAotICAgIH0KLSAgaW4yID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgCi0gIGlmIChpbjEgJiBpbjIgJiBGTTAxKQotICAgIHsKLSAgICAgIC8qIExPTkcgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGlmICghKHJlc3VsdCA9IGxvb2t1cF9vcGNvZGUoJmluc24sIGluMSwgMSkpKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JXgsMHgleCIsaW4xLGluMik7Ci0JICByZXR1cm4gODsKLQl9Ci0gICAgICBudW0gPSAobG9uZyBsb25nKWluMSA8PCAzMiB8IGluMjsKLSAgICAgIHByaW50X2luc24oaW5mbywgbWVtYWRkciwgbnVtLCAmaW5zbiwgMSwgcmVzdWx0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBudW0gPSBpbjE7Ci0gICAgICBpZiAoIShyZXN1bHQgPSBsb29rdXBfb3Bjb2RlKCZpbnNuLCBpbjEsIDApKSkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCV4IixpbjEpOwotICAgICAgZWxzZQotCXByaW50X2luc24oaW5mbywgbWVtYWRkciwgbnVtLCAmaW5zbiwgMCwgcmVzdWx0KTsKLSAgICAgIAotICAgICAgc3dpdGNoICggKChpbjE+PjMxKTw8MSkgfCAoaW4yPj4zMSkgKQotCXsKLQljYXNlIDA6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0fHxcdCIpOyAgIAotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdC0+XHQiKTsgICAKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQ8LVx0Iik7ICAgCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICAgIAotICAgICAgaW5zbi5mb3JtID0gKHN0cnVjdCBkMzB2X2Zvcm1hdCAqKU5VTEw7Ci0gICAgICBudW0gPSBpbjI7Ci0gICAgICBpZiAoIShyZXN1bHQgPSBsb29rdXBfb3Bjb2RlKCZpbnNuLCBpbjIsIDApKSkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCV4IixpbjIpOwotICAgICAgZWxzZQotCXByaW50X2luc24oaW5mbywgbWVtYWRkciwgbnVtLCAmaW5zbiwgMCwgcmVzdWx0KTsKLQotICAgIH0KLSAgcmV0dXJuIDg7Ci19Ci0KLQotLyogcmV0dXJucyAwIGlmIGxvb2t1cCBmYWlscyAqLwotLyogMSBpZiBmb3VuZCBhbmQgb25seSBvbmUgZm9ybSAqLwotLyogMiBpZiBmb3VuZCBhbmQgdGhlcmUgYXJlIHNob3J0IGFuZCBsb25nIGZvcm1zICovCi1zdGF0aWMgaW50Ci1sb29rdXBfb3Bjb2RlIChpbnNuLCBudW0sIGlzX2xvbmcpCi0gICAgIHN0cnVjdCBkMzB2X2luc24gKmluc247Ci0gICAgIGxvbmcgbnVtOwotICAgICBpbnQgaXNfbG9uZzsKLXsKLSAgaW50IGk9MCwgaW5kZXg7Ci0gIHN0cnVjdCBkMzB2X2Zvcm1hdCAqZjsKLSAgc3RydWN0IGQzMHZfb3Bjb2RlICpvcCA9IChzdHJ1Y3QgZDMwdl9vcGNvZGUgKilkMzB2X29wY29kZV90YWJsZTsKLSAgaW50IG9wMSA9IChudW0gPj4gMjUpICYgMHg3OwotICBpbnQgb3AyID0gKG51bSA+PiAyMCkgJiAweDFmOwotICBpbnQgbW9kID0gKG51bSA+PiAxOCkgJiAweDM7Ci0KLSAgLyogZmluZCB0aGUgb3Bjb2RlICovCi0gIGRvIHsKLSAgICBpZiAoKG9wLT5vcDEgPT0gb3AxKSAmJiAob3AtPm9wMiA9PSBvcDIpKQotICAgICAgYnJlYWs7Ci0gICAgb3ArKzsKLSAgfSB3aGlsZSAob3AtPm5hbWUpOwotCi0gIGlmICghb3AgfHwgIW9wLT5uYW1lKQotICAgIHJldHVybiAwOwotCi0gIHdoaWxlIChvcC0+b3AxID09IG9wMSAmJiBvcC0+b3AyID09IG9wMikKLSAgICB7Ci0gICAgICAvKiBzY2FuIHRocm91Z2ggYWxsIHRoZSBmb3JtYXRzIGZvciB0aGUgb3Bjb2RlICAqLwotICAgICAgaW5kZXggPSBvcC0+Zm9ybWF0W2krK107Ci0gICAgICBkbyAKLQl7Ci0JICBmID0gKHN0cnVjdCBkMzB2X2Zvcm1hdCAqKSZkMzB2X2Zvcm1hdF90YWJsZVtpbmRleF07Ci0JICB3aGlsZSAoZi0+Zm9ybSA9PSBpbmRleCkKLQkgICAgewotCSAgICAgIGlmICgoIWlzX2xvbmcgfHwgZi0+Zm9ybSA+PSBMT05HKSAmJiAoZi0+bW9kaWZpZXIgPT0gbW9kKSkKLQkJewotCQkgIGluc24tPmZvcm0gPSBmOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgZisrOwotCSAgICB9Ci0JICBpZiAoaW5zbi0+Zm9ybSkKLQkgICAgYnJlYWs7Ci0JfSB3aGlsZSAoKGluZGV4ID0gb3AtPmZvcm1hdFtpKytdKSAhPSAwKTsKLSAgICAgIGlmIChpbnNuLT5mb3JtKQotCWJyZWFrOwotICAgICAgb3ArKzsKLSAgICAgIGk9MDsKLSAgICB9Ci0gIGlmIChpbnNuLT5mb3JtID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaW5zbi0+b3AgPSBvcDsKLSAgaW5zbi0+ZWNjID0gKG51bSA+PiAyOCkgJiAweDc7Ci0gIGlmIChvcC0+Zm9ybWF0WzFdKQotICAgIHJldHVybiAyOwotICBlbHNlCi0gICAgcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIHZvaWQgCi1wcmludF9pbnNuICggaW5mbywgbWVtYWRkciwgbnVtLCBpbnNuLCBpc19sb25nLCBzaG93X2V4dCApCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGxvbmcgbG9uZyBudW07Ci0gICAgIHN0cnVjdCBkMzB2X2luc24gKmluc247Ci0gICAgIGludCBpc19sb25nOwotICAgICBpbnQgc2hvd19leHQ7Ci17Ci0gIGludCB2YWwsIG9wbnVtLCBuZWVkX2NvbW1hPTA7Ci0gIHN0cnVjdCBkMzB2X29wZXJhbmQgKm9wZXI7Ci0gIGludCBpLCBtYXRjaCwgb3BpbmQ9MCwgbmVlZF9wYXJlbj0wLCBmb3VuZF9jb250cm9sPTA7Ci0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsaW5zbi0+b3AtPm5hbWUpOwotCi0gIC8qIGNoZWNrIGZvciBDTVAgb3IgQ01QVSAqLwotICBpZiAoZDMwdl9vcGVyYW5kX3RhYmxlW2luc24tPmZvcm0tPm9wZXJhbmRzWzBdXS5mbGFncyAmIE9QRVJBTkRfTkFNRSkKLSAgICB7Ci0gICAgICBvcGluZCsrOwotICAgICAgdmFsID0gZXh0cmFjdF92YWx1ZShudW0sKHN0cnVjdCBkMzB2X29wZXJhbmQgKikmZDMwdl9vcGVyYW5kX3RhYmxlW2luc24tPmZvcm0tPm9wZXJhbmRzWzBdXSxpc19sb25nKTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLGQzMHZfY2NfbmFtZXNbdmFsXSk7Ci0gICAgfQotCi0gIC8qIGFkZCBpbiAiLnMiIG9yICIubCIgKi8KLSAgaWYgKHNob3dfZXh0ID09IDIpCi0gICAgewotICAgICAgaWYgKGlzX2xvbmcpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIubCIpOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLnMiKTsKLSAgICB9Ci0KLSAgaWYgKGluc24tPmVjYykKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi8lcyIsZDMwdl9lY2NfbmFtZXNbaW5zbi0+ZWNjXSk7Ci0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdCIpOwotCi0gIHdoaWxlICgob3BudW0gPSBpbnNuLT5mb3JtLT5vcGVyYW5kc1tvcGluZCsrXSkgIT0gMCkKLSAgICB7Ci0gICAgICBpbnQgYml0czsKLSAgICAgIG9wZXIgPSAoc3RydWN0IGQzMHZfb3BlcmFuZCAqKSZkMzB2X29wZXJhbmRfdGFibGVbb3BudW1dOwotICAgICAgYml0cyA9IG9wZXItPmJpdHM7Ci0gICAgICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotCWJpdHMgKz0gMzsKLQotICAgICAgaWYgKG5lZWRfY29tbWEgJiYgb3Blci0+ZmxhZ3MgIT0gT1BFUkFORF9QTFVTICYmIG9wZXItPmZsYWdzICE9IE9QRVJBTkRfTUlOVVMpCi0JewotCSAgbmVlZF9jb21tYT0wOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsICIpOwotCX0KLQotICAgICAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRNSU5VUykKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAtIik7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9NSU5VUykKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0iKTsgICAKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX1BMVVMpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIrIik7ICAgCi0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVFNJR04pCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJAIik7ICAgCi0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVFBBUikKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAoIik7ICAgCi0JICBuZWVkX3BhcmVuID0gMTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfU1BFQ0lBTCkKLQljb250aW51ZTsKLQotICAgICAgdmFsID0gZXh0cmFjdF92YWx1ZShudW0sIG9wZXIsIGlzX2xvbmcpOwotICAgICAgCi0gICAgICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1JFRykKLQl7Ci0JICBtYXRjaCA9IDA7Ci0JICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZDMwdl9vcGVyYW5kICpvcGVyMyA9IAotCQkoc3RydWN0IGQzMHZfb3BlcmFuZCAqKSZkMzB2X29wZXJhbmRfdGFibGVbaW5zbi0+Zm9ybS0+b3BlcmFuZHNbMl1dOwkgICAgICAKLQkgICAgICBpbnQgaWQgPSBleHRyYWN0X3ZhbHVlIChudW0sIG9wZXIzLCBpc19sb25nICk7Ci0JICAgICAgZm91bmRfY29udHJvbCA9IDE7Ci0JICAgICAgc3dpdGNoICggaWQgKQotCQl7Ci0JCWNhc2UgMDoKLQkJICB2YWwgfD0gT1BFUkFORF9DT05UUk9MOwotCQkgIGJyZWFrOwotCQljYXNlIDE6Ci0JCWNhc2UgMjoKLQkJICB2YWwgPSBPUEVSQU5EX0NPTlRST0wgKyBNQVhfQ09OVFJPTF9SRUcgKyBpZDsKLQkJICBicmVhazsKLQkJY2FzZSAzOgotCQkgIHZhbCB8PSBPUEVSQU5EX0ZMQUc7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgZnByaW50ZihzdGRlcnIsImlsbGVnYWwgaWQgKCVkKVxuIixpZCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX0FDQykKLQkgICAgdmFsIHw9IE9QRVJBTkRfQUNDOwotCSAgZWxzZSBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX0ZMQUcpCi0JICAgIHZhbCB8PSBPUEVSQU5EX0ZMQUc7Ci0JICBmb3IgKGk9MDtpPHJlZ19uYW1lX2NudCgpO2krKykKLQkgICAgewotCSAgICAgIGlmICh2YWwgPT0gcHJlX2RlZmluZWRfcmVnaXN0ZXJzW2ldLnZhbHVlKQotCQl7Ci0JCSAgaWYgKHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tpXS5wbmFtZSkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkgICAgICAoaW5mby0+c3RyZWFtLCAiJXMiLHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tpXS5wbmFtZSk7Ci0JCSAgZWxzZQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCSAgICAgIChpbmZvLT5zdHJlYW0sICIlcyIscHJlX2RlZmluZWRfcmVnaXN0ZXJzW2ldLm5hbWUpOwotCQkgIG1hdGNoPTE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgaWYgKG1hdGNoPT0wKQotCSAgICB7Ci0JICAgICAgLyogdGhpcyB3b3VsZCBvbmx5IGdldCBleGVjdXRlZCBpZiBhIHJlZ2lzdGVyIHdhcyBub3QgaW4gdGhlIAotCQkgcmVnaXN0ZXIgdGFibGUgKi8KLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkJKGluZm8tPnN0cmVhbSwgXygiPHVua25vd24gcmVnaXN0ZXIgJWQ+IiksIHZhbCAmIDB4M0YpOwkgICAgICAKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluc24tPm9wLT5yZWxvY19mbGFnID09IFJFTE9DX1BDUkVMIHx8IAotCSAgICAgICAob3BpbmQgPT0gMSAmJiAoaW5zbi0+Zm9ybS0+Zm9ybSA9PSBTSE9SVF9EMiB8fCBpbnNuLT5mb3JtLT5mb3JtID09IExPTkdfRCkpKQotCXsKLQkgIGxvbmcgbWF4OwotCSAgaW50IG5lZz0wOwotCSAgbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSk7Ci0JICBpZiAodmFsICYgbWF4KQotCSAgICB7Ci0JICAgICAgaWYgKGJpdHMgPT0gMzIpCi0JCXZhbCA9IC12YWw7Ci0JICAgICAgZWxzZQotCQl2YWwgPSAtdmFsICYgKCgxIDw8IGJpdHMpLTEpOwotCSAgICAgIG5lZyA9IDE7Ci0JICAgIH0KLQkgIGlmIChvcGluZCA9PSAxICYmIChpbnNuLT5mb3JtLT5mb3JtID09IFNIT1JUX0QyIHx8IGluc24tPmZvcm0tPmZvcm0gPT0gTE9OR19EKSkKLQkgICAgewotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXgiLHZhbCk7Ci0JICAgIH0KLQkgIGVsc2UgewotCSAgICBpZiAobmVnKQotCSAgICAgIHsKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItJXhcdCgiLHZhbCk7Ci0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgLSB2YWwpICYgUENfTUFTSywgaW5mbyk7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIleFx0KCIsdmFsKTsKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciArIHZhbCkgJiBQQ19NQVNLLCBpbmZvKTsKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7Ci0JICAgICAgfQotCSAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluc24tPm9wLT5yZWxvY19mbGFnID09IFJFTE9DX0FCUykKLQl7Ci0JICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbCwgaW5mbyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfU0lHTkVEKQotCSAgICB7Ci0JICAgICAgaW50IG1heCA9ICgxIDw8IChiaXRzIC0gMSkpOwotCSAgICAgIGlmICh2YWwgJiBtYXgpCi0JCXsKLQkJICB2YWwgPSAtdmFsOwotCQkgIGlmIChiaXRzIDwgMzIpCi0JCSAgICB2YWwgJj0gKCgxIDw8IGJpdHMpIC0gMSk7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItIik7Ci0JCX0KLQkgICAgfQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4Iix2YWwpOwotCX0KLSAgICAgIC8qIGlmIHRoZXJlIGlzIGFub3RoZXIgb3BlcmFuZCwgdGhlbiB3cml0ZSBhIGNvbW1hIGFuZCBzcGFjZSAqLwotICAgICAgaWYgKGluc24tPmZvcm0tPm9wZXJhbmRzW29waW5kXSAmJiAhKGZvdW5kX2NvbnRyb2wgJiYgb3BpbmQgPT0gMikpCi0JbmVlZF9jb21tYSA9IDE7Ci0gICAgfQotICBpZiAobmVlZF9wYXJlbikKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLX0KLQotCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfdmFsdWUgKG51bSwgb3BlciwgaXNfbG9uZykKLSAgICAgbG9uZyBsb25nIG51bTsKLSAgICAgc3RydWN0IGQzMHZfb3BlcmFuZCAqb3BlcjsKLSAgICAgaW50IGlzX2xvbmc7Ci17Ci0gIGludCB2YWw7Ci0gIGludCBzaGlmdCA9IDEyIC0gb3Blci0+cG9zaXRpb247Ci0gIGludCBtYXNrID0gKDB4RkZGRkZGRkYgPj4gKDMyIC0gb3Blci0+Yml0cykpOwotCi0gIGlmIChpc19sb25nKQotICAgIHsKLSAgICAgIGlmIChvcGVyLT5iaXRzID09IDMyKSAKLQl7Ci0JICAvKiBwaWVjZSB0b2dldGhlciAzMi1iaXQgY29uc3RhbnQgKi8KLQkgIHZhbCA9ICgobnVtICYgMHgzRkZGRikKLQkJIHwgKChudW0gJiAweEZGMDAwMDApID4+IDIpCi0JCSB8ICgobnVtICYgMHgzRjAwMDAwMDAwTEwpID4+IDYpKTsKLQl9Ci0gICAgICBlbHNlCQotCXZhbCA9IChudW0gPj4gKDMyICsgc2hpZnQpKSAmIG1hc2s7CQotICAgIH0KLSAgZWxzZQotICAgIHZhbCA9IChudW0gPj4gc2hpZnQpICYgbWFzazsKLQotICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotICAgIHZhbCA8PD0gMzsKLQotICByZXR1cm4gdmFsOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kMzB2LW9wYy5jIGIvb3Bjb2Rlcy9kMzB2LW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjY1ZTdjLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZDMwdi1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDUwMCArMCwwIEBACi0vKiBkMzB2LW9wYy5jIC0tIEQzMFYgb3Bjb2RlIGxpc3QKLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvZDMwdi5oIgotCi0KLS8qIFRoaXMgdGFibGUgaXMgc29ydGVkLiAqLwotLyogSWYgeW91IGFkZCBhbnl0aGluZywgaXQgTVVTVCBiZSBpbiBhbHBoYWJldGljYWwgb3JkZXIgKi8KLS8qIFRoZSBmaXJzdCBmaWVsZCBpcyB0aGUgbmFtZSB0aGUgYXNzZW1ibGVyIHVzZXMgd2hlbiBsb29raW5nICovCi0vKiB1cCBvcmNvZGVzLiAgVGhlIHNlY29uZCBmaWVsZCBpcyB0aGUgbmFtZSB0aGUgZGlzYXNzZW1ibGVyIHdpbGwgdXNlLiAqLwotLyogVGhpcyBhbGxvd3MgdGhlIGFzc2VtYmxlciB0byBhc3NlbWJsZSByZWZlcmVuY2VzIHRvIHI2MyAoZm9yIGV4YW1wbGUpICovCi0vKiBvciAic3AiLiAgVGhlIGRpc2Fzc2VtYmxlciB3aWxsIGFsd2F5cyB1c2UgdGhlIHByZWZlcnJlZCBmb3JtIChzcCkgKi8KLWNvbnN0IHN0cnVjdCBwZF9yZWcgcHJlX2RlZmluZWRfcmVnaXN0ZXJzW10gPQotewotICB7ICJhMCIsIE5VTEwsIE9QRVJBTkRfQUNDKzAgfSwKLSAgeyAiYTEiLCBOVUxMLCBPUEVSQU5EX0FDQysxIH0sCi0gIHsgImJwYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszIH0sCi0gIHsgImJwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMSB9LAotICB7ICJjIiwgImMiLCBPUEVSQU5EX0ZMQUcrNyB9LAotICB7ICJjcjAiLCAicHN3IiwgT1BFUkFORF9DT05UUk9MIH0sCi0gIHsgImNyMSIsICJicHN3IiwgT1BFUkFORF9DT05UUk9MKzEgfSwKLSAgeyAiY3IxMCIsICJtb2RfcyIsIE9QRVJBTkRfQ09OVFJPTCsxMCB9LAotICB7ICJjcjExIiwgIm1vZF9lIiwgT1BFUkFORF9DT05UUk9MKzExIH0sCi0gIHsgImNyMTIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTIgfSwKLSAgeyAiY3IxMyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMyB9LAotICB7ICJjcjE0IiwgImliYSIsIE9QRVJBTkRfQ09OVFJPTCsxNCB9LAotICB7ICJjcjE1IiwgImVpdF92YiIsIE9QRVJBTkRfQ09OVFJPTCsxNSB9LAotICB7ICJjcjE2IiwgImludF9zIiwgT1BFUkFORF9DT05UUk9MKzE2IH0sCi0gIHsgImNyMTciLCAiaW50X20iLCBPUEVSQU5EX0NPTlRST0wrMTcgfSwKLSAgeyAiY3IxOCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxOCB9LAotICB7ICJjcjE5IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE5IH0sCi0gIHsgImNyMiIsICJwYyIsIE9QRVJBTkRfQ09OVFJPTCsyIH0sCi0gIHsgImNyMjAiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjAgfSwKLSAgeyAiY3IyMSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyMSB9LAotICB7ICJjcjIyIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzIyIH0sCi0gIHsgImNyMjMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjMgfSwKLSAgeyAiY3IyNCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyNCB9LAotICB7ICJjcjI1IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzI1IH0sCi0gIHsgImNyMjYiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjYgfSwKLSAgeyAiY3IyNyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyNyB9LAotICB7ICJjcjI4IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzI4IH0sCi0gIHsgImNyMjkiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjkgfSwKLSAgeyAiY3IzIiwgImJwYyIsIE9QRVJBTkRfQ09OVFJPTCszIH0sCi0gIHsgImNyMzAiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzAgfSwKLSAgeyAiY3IzMSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszMSB9LAotICB7ICJjcjMyIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzMyIH0sCi0gIHsgImNyMzMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzMgfSwKLSAgeyAiY3IzNCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszNCB9LAotICB7ICJjcjM1IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzM1IH0sCi0gIHsgImNyMzYiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzYgfSwKLSAgeyAiY3IzNyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszNyB9LAotICB7ICJjcjM4IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzM4IH0sCi0gIHsgImNyMzkiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzkgfSwKLSAgeyAiY3I0IiwgImRwc3ciLCBPUEVSQU5EX0NPTlRST0wrNCB9LAotICB7ICJjcjQwIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQwIH0sCi0gIHsgImNyNDEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDEgfSwKLSAgeyAiY3I0MiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0MiB9LAotICB7ICJjcjQzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQzIH0sCi0gIHsgImNyNDQiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDQgfSwKLSAgeyAiY3I0NSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0NSB9LAotICB7ICJjcjQ2IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQ2IH0sCi0gIHsgImNyNDciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDcgfSwKLSAgeyAiY3I0OCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0OCB9LAotICB7ICJjcjQ5IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQ5IH0sCi0gIHsgImNyNSIsImRwYyIsIE9QRVJBTkRfQ09OVFJPTCs1IH0sCi0gIHsgImNyNTAiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTAgfSwKLSAgeyAiY3I1MSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1MSB9LAotICB7ICJjcjUyIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzUyIH0sCi0gIHsgImNyNTMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTMgfSwKLSAgeyAiY3I1NCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1NCB9LAotICB7ICJjcjU1IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzU1IH0sCi0gIHsgImNyNTYiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTYgfSwKLSAgeyAiY3I1NyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1NyB9LAotICB7ICJjcjU4IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzU4IH0sCi0gIHsgImNyNTkiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTkgfSwKLSAgeyAiY3I2IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzYgfSwKLSAgeyAiY3I2MCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs2MCB9LAotICB7ICJjcjYxIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzYxIH0sCi0gIHsgImNyNjIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNjIgfSwKLSAgeyAiY3I2MyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs2MyB9LAotICB7ICJjcjciLCAicnB0X2MiLCBPUEVSQU5EX0NPTlRST0wrNyB9LAotICB7ICJjcjgiLCAicnB0X3MiLCBPUEVSQU5EX0NPTlRST0wrOCB9LAotICB7ICJjcjkiLCAicnB0X2UiLCBPUEVSQU5EX0NPTlRST0wrOSB9LAotICB7ICJkcGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNSB9LAotICB7ICJkcHN3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQgfSwKLSAgeyAiZWl0X3ZiIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE1IH0sCi0gIHsgImYwIiwgTlVMTCwgT1BFUkFORF9GTEFHKzAgfSwKLSAgeyAiZjEiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrMSB9LAotICB7ICJmMiIsIE5VTEwsIE9QRVJBTkRfRkxBRysyIH0sCi0gIHsgImYzIiwgTlVMTCwgT1BFUkFORF9GTEFHKzMgfSwKLSAgeyAiZjQiLCAicyIsIE9QRVJBTkRfRkxBRys0IH0sCi0gIHsgImY1IiwgInYiLCBPUEVSQU5EX0ZMQUcrNSB9LAotICB7ICJmNiIsICJ2YSIsIE9QRVJBTkRfRkxBRys2IH0sCi0gIHsgImY3IiwgImMiLCBPUEVSQU5EX0ZMQUcrNyB9LAotICB7ICJpYmEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTQgfSwKLSAgeyAiaW50X20iLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTcgfSwKLSAgeyAiaW50X3MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTYgfSwKLSAgeyAibGluayIsICJyNjIiLCA2MiB9LAotICB7ICJtb2RfZSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMSB9LAotICB7ICJtb2RfcyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMCB9LAotICB7ICJwYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyIH0sCi0gIHsgInBzdyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCB9LAotICB7ICJwc3doIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MK01BWF9DT05UUk9MX1JFRysyIH0sCi0gIHsgInBzd2wiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrTUFYX0NPTlRST0xfUkVHKzEgfSwKLSAgeyAicjAiLCBOVUxMLCAwIH0sCi0gIHsgInIxIiwgTlVMTCwgMSB9LAotICB7ICJyMTAiLCBOVUxMLCAxMCB9LAotICB7ICJyMTEiLCBOVUxMLCAxMSB9LAotICB7ICJyMTIiLCBOVUxMLCAxMiB9LAotICB7ICJyMTMiLCBOVUxMLCAxMyB9LAotICB7ICJyMTQiLCBOVUxMLCAxNCB9LAotICB7ICJyMTUiLCBOVUxMLCAxNSB9LAotICB7ICJyMTYiLCBOVUxMLCAxNiB9LAotICB7ICJyMTciLCBOVUxMLCAxNyB9LAotICB7ICJyMTgiLCBOVUxMLCAxOCB9LAotICB7ICJyMTkiLCBOVUxMLCAxOSB9LAotICB7ICJyMiIsIE5VTEwsIDIgfSwKLSAgeyAicjIwIiwgTlVMTCwgMjAgfSwKLSAgeyAicjIxIiwgTlVMTCwgMjEgfSwKLSAgeyAicjIyIiwgTlVMTCwgMjIgfSwKLSAgeyAicjIzIiwgTlVMTCwgMjMgfSwKLSAgeyAicjI0IiwgTlVMTCwgMjQgfSwKLSAgeyAicjI1IiwgTlVMTCwgMjUgfSwKLSAgeyAicjI2IiwgTlVMTCwgMjYgfSwKLSAgeyAicjI3IiwgTlVMTCwgMjcgfSwKLSAgeyAicjI4IiwgTlVMTCwgMjggfSwKLSAgeyAicjI5IiwgTlVMTCwgMjkgfSwKLSAgeyAicjMiLCBOVUxMLCAzIH0sCi0gIHsgInIzMCIsIE5VTEwsIDMwIH0sCi0gIHsgInIzMSIsIE5VTEwsIDMxIH0sCi0gIHsgInIzMiIsIE5VTEwsIDMyIH0sCi0gIHsgInIzMyIsIE5VTEwsIDMzIH0sCi0gIHsgInIzNCIsIE5VTEwsIDM0IH0sCi0gIHsgInIzNSIsIE5VTEwsIDM1IH0sCi0gIHsgInIzNiIsIE5VTEwsIDM2IH0sCi0gIHsgInIzNyIsIE5VTEwsIDM3IH0sCi0gIHsgInIzOCIsIE5VTEwsIDM4IH0sCi0gIHsgInIzOSIsIE5VTEwsIDM5IH0sCi0gIHsgInI0IiwgTlVMTCwgNCB9LAotICB7ICJyNDAiLCBOVUxMLCA0MCB9LAotICB7ICJyNDEiLCBOVUxMLCA0MSB9LAotICB7ICJyNDIiLCBOVUxMLCA0MiB9LAotICB7ICJyNDMiLCBOVUxMLCA0MyB9LAotICB7ICJyNDQiLCBOVUxMLCA0NCB9LAotICB7ICJyNDUiLCBOVUxMLCA0NSB9LAotICB7ICJyNDYiLCBOVUxMLCA0NiB9LAotICB7ICJyNDciLCBOVUxMLCA0NyB9LAotICB7ICJyNDgiLCBOVUxMLCA0OCB9LAotICB7ICJyNDkiLCBOVUxMLCA0OSB9LAotICB7ICJyNSIsIE5VTEwsIDUgfSwKLSAgeyAicjUwIiwgTlVMTCwgNTAgfSwKLSAgeyAicjUxIiwgTlVMTCwgNTEgfSwKLSAgeyAicjUyIiwgTlVMTCwgNTIgfSwKLSAgeyAicjUzIiwgTlVMTCwgNTMgfSwKLSAgeyAicjU0IiwgTlVMTCwgNTQgfSwKLSAgeyAicjU1IiwgTlVMTCwgNTUgfSwKLSAgeyAicjU2IiwgTlVMTCwgNTYgfSwKLSAgeyAicjU3IiwgTlVMTCwgNTcgfSwKLSAgeyAicjU4IiwgTlVMTCwgNTggfSwKLSAgeyAicjU5IiwgTlVMTCwgNTkgfSwKLSAgeyAicjYiLCBOVUxMLCA2IH0sCi0gIHsgInI2MCIsIE5VTEwsIDYwIH0sCi0gIHsgInI2MSIsIE5VTEwsIDYxIH0sCi0gIHsgInI2MiIsICJsaW5rIiwgNjIgfSwKLSAgeyAicjYzIiwgInNwIiwgNjMgfSwKLSAgeyAicjciLCBOVUxMLCA3IH0sCi0gIHsgInI4IiwgTlVMTCwgOCB9LAotICB7ICJyOSIsIE5VTEwsIDkgfSwKLSAgeyAicnB0X2MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNyB9LAotICB7ICJycHRfZSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs5IH0sCi0gIHsgInJwdF9zIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzggfSwKLSAgeyAicyIsIE5VTEwsIE9QRVJBTkRfRkxBRys0IH0sCi0gIHsgInNwIiwgTlVMTCwgNjMgfSwKLSAgeyAidiIsIE5VTEwsIE9QRVJBTkRfRkxBRys1IH0sCi0gIHsgInZhIiwgTlVMTCwgT1BFUkFORF9GTEFHKzYgfSwKLX07Ci0KLWludCAKLXJlZ19uYW1lX2NudCgpCi17Ci0gIHJldHVybiAoc2l6ZW9mKHByZV9kZWZpbmVkX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHBkX3JlZykpOwotfQotCi0vKiBPUENPREUgVEFCTEUgKi8KLS8qIFRoZSBmb3JtYXQgb2YgdGhpcyB0YWJsZSBpcyBkZWZpbmVkIGluIG9wY29kZS9kMzB2LmggKi8KLWNvbnN0IHN0cnVjdCBkMzB2X29wY29kZSBkMzB2X29wY29kZV90YWJsZVtdID0gewotICB7ICJhYnMiLCBJQUxVMSwgMHg4LCB7IFNIT1JUX1UgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImFkZCIsIElBTFUxLCAweDAsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgMCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZDJoIiwgSUFMVTEsIDB4MSwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImFkZGMiLCBJQUxVMSwgMHg0LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0MsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRobGxsIiwgSUFMVTEsIDB4MTAsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGxsaCIsIElBTFUxLCAweDExLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhsaGwiLCBJQUxVMSwgMHgxMiwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRobGhoIiwgSUFMVTEsIDB4MTMsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGhsbCIsIElBTFUxLCAweDE0LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhobGgiLCBJQUxVMSwgMHgxNSwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRoaGhsIiwgSUFMVTEsIDB4MTYsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGhoaCIsIElBTFUxLCAweDE3LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZHMiLCBJQUxVMSwgMHg2LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkczJoIiwgSUFMVTEsIDB4NywgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJhbmQiLCBMT0dJQywgMHgxOCwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJhbmRmZyIsIExPR0lDLCAweDgsIHsgU0hPUlRfRiB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiYXZnIiwgSUFMVTEsIDB4YSwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImF2ZzJoIiwgSUFMVTEsIDB4YiwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImJjbHIiLCBMT0dJQywgMHgzLCB7IFNIT1JUX0EgfSwgRUlUSEVSX0JVVF9QUkVGRVJfTVUsIDAsIDAsIDAgfSwKLSAgeyAiYm5vdCIsIExPR0lDLCAweDEsIHsgU0hPUlRfQSB9LCBFSVRIRVJfQlVUX1BSRUZFUl9NVSwgMCwgMCwgMCB9LAotICB7ICJicmEiLCBCUkEsIDAsIHsgU0hPUlRfQjEsIFNIT1JUX0IyLCBMT05HX1UgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJicmF0bnoiLCBCUkEsIDB4NCwgeyBTSE9SVF9CM2IsIExPTkdfMmIgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJicmF0enIiLCBCUkEsIDB4NCwgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pNUCwgMCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiYnNldCIsIExPR0lDLCAweDIsIHsgU0hPUlRfQSB9LCBFSVRIRVJfQlVUX1BSRUZFUl9NVSwgMCwgMCwgMCB9LAotICB7ICJic3IiLCBCUkEsIDB4MiwgeyBTSE9SVF9CMSwgU0hPUlRfQjIsIExPTkdfVSB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImJzcnRueiIsIEJSQSwgMHg2LCB7IFNIT1JUX0IzYiwgTE9OR18yYiB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImJzcnR6ciIsIEJSQSwgMHg2LCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSlNSLCAwLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJidHN0IiwgTE9HSUMsIDAsIHsgU0hPUlRfQUYgfSwgRUlUSEVSX0JVVF9QUkVGRVJfTVUsIDAsIDAsIDAgfSwKLSAgeyAiY21wIiwgTE9HSUMsIDB4QywgeyBTSE9SVF9DTVAsIExPTkdfQ01QIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJjbXB1IiwgTE9HSUMsIDB4RCwgeyBTSE9SVF9DTVBVLCBMT05HX0NNUCB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiZGJyYSIsIEJSQSwgMHgxMCwgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pNUCB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImRicmFpIiwgQlJBLCAweDE0LCB7IFNIT1JUX0QyLCBMT05HX0QgfSwgTVUsIEZMQUdfSk1QIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiZGJzciIsIEJSQSwgMHgxMiwgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pTUiB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImRic3JpIiwgQlJBLCAweDE2LCB7IFNIT1JUX0QyLCBMT05HX0QgfSwgTVUsIEZMQUdfSlNSIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiZGJ0IiwgQlJBLCAweGIsIHsgU0hPUlRfTk9ORSB9LCBNVSwgRkxBR19KU1IsIEZMQUdfTEtSLCAwIH0sCi0gIHsgImRqbXAiLCBCUkEsIDB4MTEsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KTVAgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19BQlMgfSwKLSAgeyAiZGptcGkiLCBCUkEsIDB4MTUsIHsgU0hPUlRfRDIsIExPTkdfRCB9LCBNVSwgRkxBR19KTVAgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19BQlMgfSwKLSAgeyAiZGpzciIsIEJSQSwgMHgxMywgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pTUiB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX0FCUyB9LAotICB7ICJkanNyaSIsIEJSQSwgMHgxNywgeyBTSE9SVF9EMiwgTE9OR19EIH0sIE1VLCBGTEFHX0pTUiB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX0FCUyB9LAotICB7ICJqbXAiLCBCUkEsIDB4MSwgeyBTSE9SVF9CMSwgU0hPUlRfQjIsIExPTkdfVSB9LCBNVSwgRkxBR19KTVAsIDAsIFJFTE9DX0FCUyB9LAotICB7ICJqbXB0bnoiLCBCUkEsIDB4NSwgeyBTSE9SVF9CM2IsIExPTkdfMmIgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19BQlMgfSwKLSAgeyAiam1wdHpyIiwgQlJBLCAweDUsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KTVAsIDAsIFJFTE9DX0FCUyB9LAotICB7ICJqb2lubGwiLCBJQUxVMSwgMHhDLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImpvaW5saCIsIElBTFUxLCAweEQsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiam9pbmhsIiwgSUFMVTEsIDB4RSwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJqb2luaGgiLCBJQUxVMSwgMHhGLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImpzciIsIEJSQSwgMHgzLCB7IFNIT1JUX0IxLCBTSE9SVF9CMiwgTE9OR19VIH0sIE1VLCBGTEFHX0pTUiwgMCwgUkVMT0NfQUJTIH0sCi0gIHsgImpzcnRueiIsIEJSQSwgMHg3LCB7IFNIT1JUX0IzYiwgTE9OR18yYiB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX0FCUyB9LAotICB7ICJqc3J0enIiLCBCUkEsIDB4NywgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pTUiwgMCwgUkVMT0NfQUJTIH0sCi0gIHsgImxkMmgiLCBJTUVNLCAweDMsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgImxkMnciLCBJTUVNLCAweDYsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIEZMQUdfTUVNIHwgRkxBR18yV09SRCwgMCwgMCB9LAotICB7ICJsZDRiaCIsIElNRU0sIDB4NSwgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgRkxBR19NRU0gfCBGTEFHXzJXT1JELCAwLCAwIH0sCi0gIHsgImxkNGJodSIsIElNRU0sIDB4ZCwgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKLSAgeyAibGRiIiwgSU1FTSwgMCwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgImxkYnUiLCBJTUVNLCAweDksIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJsZGgiLCBJTUVNLCAweDIsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJsZGhoIiwgSU1FTSwgMHgxLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKLSAgeyAibGRodSIsIElNRU0sIDB4YSwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgImxkdyIsIElNRU0sIDB4NCwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgIm1hYzAiLCBJQUxVMiwgMHgxNCwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm1hYzEiLCBJQUxVMiwgMHgxNCwgeyBTSE9SVF9BMSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtYWNzMCIsIElBTFUyLCAweDE1LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibWFjczEiLCBJQUxVMiwgMHgxNSwgeyBTSE9SVF9BMSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtb2RkZWMiLCBJTUVNLCAweDcsIHsgU0hPUlRfTU9EREVDIH0sIE1VLCAwLCAwLCAwIH0sCi0gIHsgIm1vZGluYyIsIElNRU0sIDB4NywgeyBTSE9SVF9NT0RJTkMgfSwgTVUsIDAsIDAsIDAgfSwKLSAgeyAibXN1YjAiLCBJQUxVMiwgMHgxNiwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm1zdWIxIiwgSUFMVTIsIDB4MTYsIHsgU0hPUlRfQTEgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibXN1YnMwIiwgSUFMVTIsIDB4MTcsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtc3ViczEiLCBJQUxVMiwgMHgxNywgeyBTSE9SVF9BMSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtdWwiLCBJQUxVMiwgMHgxMCwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm11bDJoIiwgSUFMVTIsIDAsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwxNiwgMCwgMCB9LAotICB7ICJtdWxoeGxsIiwgSUFMVTIsIDB4NCwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDE2LCAwLCAwIH0sCi0gIHsgIm11bGh4bGgiLCBJQUxVMiwgMHg1LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMTYsIDAsIDAgfSwKLSAgeyAibXVsaHhobCIsIElBTFUyLCAweDYsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwxNiwgMCwgMCB9LAotICB7ICJtdWxoeGhoIiwgSUFMVTIsIDB4NywgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDE2LCAwLCAwIH0sCi0gIHsgIm11bHgiLCBJQUxVMiwgMHgxOCwgeyBTSE9SVF9BQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtdWx4MmgiLCBJQUxVMiwgMHgxLCB7IFNIT1JUX0EyIH0sIElVLCBGTEFHX01VTDE2LCAwLCAwIH0sCi0gIHsgIm11bHhzIiwgSUFMVTIsIDB4MTksIHsgU0hPUlRfQUEgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibXZmYWNjIiwgSUFMVTIsIDB4MWYsIHsgU0hPUlRfUkEgfSwgSVUsIDAsIDAsIDAgfSwKLSAgeyAibXZmc3lzIiwgQlJBLCAweDFlLCB7IFNIT1JUX0MxIH0sIE1VLCBGTEFHX0FMTCwgRkxBR19BTEwsIDAgfSwKLSAgeyAibXZ0YWNjIiwgSUFMVTIsIDB4ZiwgeyBTSE9SVF9BQSB9LCBJVSwgMCwgMCwgMCB9LAotICB7ICJtdnRzeXMiLCBCUkEsIDB4ZSwgeyBTSE9SVF9DMiB9LCBNVSwgRkxBR19BTEwsIEZMQUdfQUxMLCAwIH0sCi0gIHsgIm5vcCIsIEJSQSwgMHhGLCB7IFNIT1JUX05PTkUgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgIm5vdCIsIExPR0lDLCAweDE5LCB7IFNIT1JUX1UgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgIm5vdGZnIiwgTE9HSUMsIDB4OSwgeyBTSE9SVF9VRiB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAib3IiLCBMT0dJQywgMHgxYSwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJvcmZnIiwgTE9HSUMsIDB4YSwgeyBTSE9SVF9GIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJyZWl0IiwgQlJBLCAweDgsIHsgU0hPUlRfTk9ORSB9LCBNVSwgRkxBR19TTSB8IEZMQUdfSk1QLCBGTEFHX1NNIHwgRkxBR19MS1IsIDAgfSwKLSAgeyAicmVwZWF0IiwgQlJBLCAweDE4LCB7IFNIT1JUX0QxLCBMT05HXzIgfSwgTVUsIEZMQUdfUlAsIEZMQUdfUlAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgInJlcGVhdGkiLCBCUkEsIDB4MWEsIHsgU0hPUlRfRDJCLCBMT05HX0RiIH0sIE1VLCBGTEFHX1JQLCBGTEFHX1JQLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJyb3QiLCBMT0dJQywgMHgxNCwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJyb3QyaCIsIExPR0lDLCAweDE1LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInJ0ZCIsIEJSQSwgMHhhLCB7IFNIT1JUX05PTkUgfSwgTVUsIEZMQUdfSk1QLCBGTEFHX0xLUiwgMCB9LAotICB7ICJzYXQiLCBJQUxVMiwgMHg4LCB7IFNIT1JUX0E1IH0sIElVLCAwLCAwLCAwIH0sCi0gIHsgInNhdDJoIiwgSUFMVTIsIDB4OSwgeyBTSE9SVF9BNSB9LCBJVSwgMCwgMCwgMCB9LAotICB7ICJzYXRobCIsIElBTFUyLCAweDFjLCB7IFNIT1JUX0E1IH0sIElVLCBGTEFHX0FERFNVQnBwcCwgMCwgMCB9LAotICB7ICJzYXRoaCIsIElBTFUyLCAweDFkLCB7IFNIT1JUX0E1IH0sIElVLCBGTEFHX0FERFNVQnBwcCwgMCwgMCB9LAotICB7ICJzYXR6IiwgSUFMVTIsIDB4YSwgeyBTSE9SVF9BNSB9LCBJVSwgMCwgMCwgMCB9LAotICB7ICJzYXR6MmgiLCBJQUxVMiwgMHhiLCB7IFNIT1JUX0E1IH0sIElVLCAwLCAwLCAwIH0sCi0gIHsgInNyYSIsIExPR0lDLCAweDEwLCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInNyYTJoIiwgTE9HSUMsIDB4MTEsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3JhaGgiLCBMT0dJQywgMHg1LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInNyYWhsIiwgTE9HSUMsIDB4NCwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzcmMiLCBMT0dJQywgMHgxNiwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIDAsIDAgfSwKLSAgeyAic3JsIiwgTE9HSUMsIDB4MTIsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3JsMmgiLCBMT0dJQywgMHgxMywgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzcmxoaCIsIExPR0lDLCAweDcsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3JsaGwiLCBMT0dJQywgMHg2LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInN0MmgiLCBJTUVNLCAweDEzLCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCAwLCBGTEFHX01FTSwgMCB9LAotICB7ICJzdDJ3IiwgSU1FTSwgMHgxNiwgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgMCwgRkxBR19NRU0gfCBGTEFHXzJXT1JELCAwIH0sCi0gIHsgInN0NGhiIiwgSU1FTSwgMHgxNSwgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgMCwgRkxBR19NRU0gfCBGTEFHXzJXT1JELCAwIH0sCi0gIHsgInN0YiIsIElNRU0sIDB4MTAsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCAwLCBGTEFHX01FTSwgMCB9LAotICB7ICJzdGgiLCBJTUVNLCAweDEyLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgMCwgRkxBR19NRU0sIDAgfSwKLSAgeyAic3RoaCIsIElNRU0sIDB4MTEsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCAwLCBGTEFHX01FTSwgMCB9LAotICB7ICJzdHciLCBJTUVNLCAweDE0LCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgMCwgRkxBR19NRU0sIDAgfSwKLSAgeyAic3ViIiwgSUFMVTEsIDB4MiwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCAwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViMmgiLCBJQUxVMSwgMHgzLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3ViYiIsIElBTFUxLCAweDUsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19DLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGxsbCIsIElBTFUxLCAweDE4LCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGxsaCIsIElBTFUxLCAweDE5LCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGxobCIsIElBTFUxLCAweDFhLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGxoaCIsIElBTFUxLCAweDFiLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGhsbCIsIElBTFUxLCAweDFjLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGhsaCIsIElBTFUxLCAweDFkLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGhobCIsIElBTFUxLCAweDFlLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAic3ViaGhoaCIsIElBTFUxLCAweDFmLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAidHJhcCIsIEJSQSwgMHg5LCB7IFNIT1JUX0IxLCBTSE9SVF9UfSwgTVUsIEZMQUdfSlNSLCBGTEFHX1NNIHwgRkxBR19MS1IsIDAgfSwKLSAgeyAieG9yIiwgTE9HSUMsIDB4MWIsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAieG9yZmciLCBMT0dJQywgMHhiLCB7IFNIT1JUX0YgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgTlVMTCwgMCwgMCwgeyAwIH0sIDAsIDAsIDAsIDAgfSwKLX07Ci0KLQotLyogbm93IGRlZmluZSB0aGUgb3BlcmFuZCB0eXBlcyAqLwotLyogZm9ybWF0IGlzIGxlbmd0aCwgYml0cywgcG9zaXRpb24sIGZsYWdzICovCi1jb25zdCBzdHJ1Y3QgZDMwdl9vcGVyYW5kIGQzMHZfb3BlcmFuZF90YWJsZVtdID0KLXsKLSNkZWZpbmUgVU5VU0VECSgwKQotICB7IDAsIDAsIDAsIDAgfSwKLSNkZWZpbmUgUmEJKFVOVVNFRCArIDEpCi0gIHsgNiwgNiwgMCwgT1BFUkFORF9SRUd8T1BFUkFORF9ERVNUIH0sCi0jZGVmaW5lIFJhMgkoUmEgKyAxKQotICB7IDYsIDYsIDAsIE9QRVJBTkRfUkVHfE9QRVJBTkRfREVTVHxPUEVSQU5EXzJSRUcgfSwKLSNkZWZpbmUgUmEzCShSYTIgKyAxKQotICB7IDYsIDYsIDAsIE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIFJiCShSYTMgKyAxKQotICB7IDYsIDYsIDYsIE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIFJjCShSYiArIDEpCi0gIHsgNiwgNiwgMTIsIE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIEFhCShSYyArIDEpCi0gIHsgNiwgMSwgMCwgT1BFUkFORF9BQ0N8T1BFUkFORF9SRUd8T1BFUkFORF9ERVNUIH0sCi0jZGVmaW5lIEFiCShBYSArIDEpCi0gIHsgNiwgMSwgNiwgT1BFUkFORF9BQ0N8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgSU1NNQkoQWIgKyAxKQotICB7IDYsIDUsIDEyLCBPUEVSQU5EX05VTSB9LAotI2RlZmluZSBJTU01VQkoSU1NNSArIDEpCi0gIHsgNiwgNSwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEIH0sCi0jZGVmaW5lIElNTTVTMwkoSU1NNVUgKyAxKQotICB7IDYsIDUsIDEyLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBJTU02CShJTU01UzMgKyAxKQotICB7IDYsIDYsIDEyLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBJTU02VQkoSU1NNiArIDEpCi0gIHsgNiwgNiwgMCwgT1BFUkFORF9OVU0gfSwKLSNkZWZpbmUgSU1NNlUyCShJTU02VSArIDEpCi0gIHsgNiwgNiwgMTIsIE9QRVJBTkRfTlVNIH0sCi0jZGVmaW5lIElNTTZTMwkoSU1NNlUyICsgMSkKLSAgeyA2LCA2LCAwLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NISUZUIH0sCi0jZGVmaW5lIElNTTEyUzMJKElNTTZTMyArIDEpCi0gIHsgMTIsIDEyLCAxMiwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUR8T1BFUkFORF9TSElGVCB9LAotI2RlZmluZSBJTU0xMlMzVSAoSU1NMTJTMyArIDEpCi0gIHsgMTIsIDEyLCAxMiwgT1BFUkFORF9OVU18T1BFUkFORF9TSElGVCB9LAotI2RlZmluZSBJTU0xOFMzCShJTU0xMlMzVSArIDEpCi0gIHsgMTgsIDE4LCAxMiwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUR8T1BFUkFORF9TSElGVCB9LAotI2RlZmluZSBJTU0zMgkoSU1NMThTMyArIDEpCi0gIHsgMzIsIDMyLCAwLCBPUEVSQU5EX05VTSB9LAotI2RlZmluZSBGYQkoSU1NMzIgKyAxKQotICB7IDYsIDMsIDAsIE9QRVJBTkRfUkVHIHwgT1BFUkFORF9GTEFHIHwgT1BFUkFORF9ERVNUIH0sCi0jZGVmaW5lIEZiCShGYSArIDEpCi0gIHsgNiwgMywgNiwgT1BFUkFORF9SRUcgfCBPUEVSQU5EX0ZMQUcgfSwKLSNkZWZpbmUgRmMJKEZiICsgMSkKLSAgeyA2LCAzLCAxMiwgT1BFUkFORF9SRUcgfCBPUEVSQU5EX0ZMQUcgfSwKLSNkZWZpbmUgQVRTSUdOCShGYyArIDEpCi0gIHsgMCwgMCwgMCwgT1BFUkFORF9BVFNJR059LAotI2RlZmluZSBBVFBBUgkoQVRTSUdOICsgMSkJLyogIkAoIiAqLwotICB7IDAsIDAsIDAsIE9QRVJBTkRfQVRQQVJ9LAotI2RlZmluZSBQTFVTCShBVFBBUiArIDEpCS8qIHBvc3RpbmNyZW1lbnQgKi8KLSAgeyAwLCAwLCAwLCBPUEVSQU5EX1BMVVN9LAotI2RlZmluZSBNSU5VUwkoUExVUyArIDEpCS8qIHBvc3RkZWNyZW1lbnQgKi8KLSAgeyAwLCAwLCAwLCBPUEVSQU5EX01JTlVTfSwKLSNkZWZpbmUgQVRNSU5VUwkoTUlOVVMgKyAxKQkvKiBwcmVkZWNyZW1lbnQgKi8KLSAgeyAwLCAwLCAwLCBPUEVSQU5EX0FUTUlOVVN9LAotI2RlZmluZSBDYQkoQVRNSU5VUyArIDEpCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgeyA2LCA2LCAwLCBPUEVSQU5EX1JFR3xPUEVSQU5EX0NPTlRST0x8T1BFUkFORF9ERVNUfSwKLSNkZWZpbmUgQ2IJKENhICsgMSkJLyogY29udHJvbCByZWdpc3RlciAqLwotICB7IDYsIDYsIDYsIE9QRVJBTkRfUkVHfE9QRVJBTkRfQ09OVFJPTH0sCi0jZGVmaW5lIENDCShDYiArIDEpCS8qIGNvbmRpdGlvbiBjb2RlIChDTVBjYyBhbmQgQ01QVWNjKSAqLwotICB7IDMsIDMsIC0zLCBPUEVSQU5EX05BTUV9LAotI2RlZmluZSBGYTIJKENDICsgMSkJLyogZmxhZyByZWdpc3RlciAoQ01QY2MgYW5kIENNUFVjYykgKi8KLSAgeyAzLCAzLCAwLCBPUEVSQU5EX1JFR3xPUEVSQU5EX0ZMQUd8T1BFUkFORF9ERVNUfSwKLSNkZWZpbmUgRmFrZQkoRmEyICsgMSkJLyogcGxhY2UgaG9sZGVyIGZvciAiaWQiIGZpZWxkIGluIG12ZnN5cyBhbmQgbXZ0c3lzICovCi0gIHsgNiwgMiwgMTIsIE9QRVJBTkRfU1BFQ0lBTH0sCi19OwotCi0vKiBub3cgd2UgbmVlZCB0byBkZWZpbmUgdGhlIGluc3RydWN0aW9uIGZvcm1hdHMgKi8KLWNvbnN0IHN0cnVjdCBkMzB2X2Zvcm1hdCBkMzB2X2Zvcm1hdF90YWJsZVtdID0KLXsKLSAgeyAwLCAwLCB7IDAgfSB9LAotICB7IFNIT1JUX00sIDAsIHsgUmEsIEFUUEFSLCBSYiwgUmMgfSB9LAkvKiBSYSxAKFJiLFJjKSAqLwotICB7IFNIT1JUX00sIDEsIHsgUmEsIEFUUEFSLCBSYiwgUExVUywgUmMgfSB9LAkvKiBSYSxAKFJiKyxSYykgKi8KLSAgeyBTSE9SVF9NLCAyLCB7IFJhLCBBVFBBUiwgUmIsIElNTTYgfSB9LAkvKiBSYSxAKFJiLGltbTYpICovCi0gIHsgU0hPUlRfTSwgMywgeyBSYSwgQVRQQVIsIFJiLCBNSU5VUywgUmMgfSB9LAkvKiBSYSxAKFJiLSxSYykgKi8KLSAgeyBTSE9SVF9NMiwgMCwgeyBSYTIsIEFUUEFSLCBSYiwgUmMgfSB9LAkvKiBSYSxAKFJiLFJjKSAqLwotICB7IFNIT1JUX00yLCAxLCB7IFJhMiwgQVRQQVIsIFJiLCBQTFVTLCBSYyB9IH0sCS8qIFJhLEAoUmIrLFJjKSAqLwotICB7IFNIT1JUX00yLCAyLCB7IFJhMiwgQVRQQVIsIFJiLCBJTU02IH0gfSwJLyogUmEsQChSYixpbW02KSAqLwotICB7IFNIT1JUX00yLCAzLCB7IFJhMiwgQVRQQVIsIFJiLCBNSU5VUywgUmMgfSB9LAkvKiBSYSxAKFJiLSxSYykgKi8KLSAgeyBTSE9SVF9BLCAwLCB7IFJhLCBSYiwgUmMgfSB9LAkJLyogUmEsUmIsUmMgKi8KLSAgeyBTSE9SVF9BLCAyLCB7IFJhLCBSYiwgSU1NNiB9IH0sCQkvKiBSYSxSYixpbW02ICovCi0gIHsgU0hPUlRfQjEsIDAsIHsgUmMgfSB9LAkJCS8qIFJjICovCi0gIHsgU0hPUlRfQjIsIDIsIHsgSU1NMThTMyB9IH0sCQkJLyogaW1tMTggKi8KLSAgeyBTSE9SVF9CMywgMCwgeyBSYTMsIFJjIH0gfSwJCQkvKiBSYSxSYyAqLwotICB7IFNIT1JUX0IzLCAyLCB7IFJhMywgSU1NMTJTMyB9IH0sCQkvKiBSYSxpbW0xMiAqLwotICB7IFNIT1JUX0IzYiwgMSwgeyBSYTMsIFJjIH0gfSwJCS8qIFJhLFJjICovCi0gIHsgU0hPUlRfQjNiLCAzLCB7IFJhMywgSU1NMTJTMyB9IH0sCQkvKiBSYSxpbW0xMiAqLwotICB7IFNIT1JUX0QxLCAwLCB7IFJhLCBSYyB9IH0sCQkJLyogUmEsUmMgKi8KLSAgeyBTSE9SVF9EMSwgMiwgeyBSYSwgSU1NMTJTMyB9IH0sCQkvKiBSYSxpbW0xMnMzICovCi0gIHsgU0hPUlRfRDIsIDAsIHsgSU1NNlMzLCBSYyB9IH0sCQkvKiBpbW02czMsUmMgKi8KLSAgeyBTSE9SVF9EMiwgMiwgeyBJTU02UzMsIElNTTEyUzMgfSB9LAkJLyogaW1tNnMzLGltbTEyczMgKi8KLSAgeyBTSE9SVF9EMkIsIDAsIHsgSU1NNlUsIFJjIH0gfSwJCS8qIGltbTZ1LFJjICovCi0gIHsgU0hPUlRfRDJCLCAyLCB7IElNTTZVLCBJTU0xMlMzVSB9IH0sCS8qIGltbTZ1LGltbTEyczN1ICovCi0gIHsgU0hPUlRfVSwgMCwgeyBSYSwgUmIgfSB9LAkJCS8qIFJhLFJiICovCi0gIHsgU0hPUlRfVSwgMiwgeyBSYSwgSU1NMTJTMyB9IH0sCQkvKiBSYSxpbW0xMiAocmVwZWF0KSAqLwotICB7IFNIT1JUX0YsIDAsIHsgRmEsIEZiLCBGYyB9IH0sCQkvKiBGYSxGYixGYyAgKG9yZmcsIHhvcmZnKSAqLwotICB7IFNIT1JUX0YsIDIsIHsgRmEsIEZiLCBJTU02IH0gfSwJCS8qIEZhLEZiLGltbTYgKi8KLSAgeyBTSE9SVF9BRiwgMCwgeyBGYSwgUmIsIFJjIH0gfSwJCS8qIEZhLFJiLFJjICovCi0gIHsgU0hPUlRfQUYsIDIsIHsgRmEsIFJiLCBJTU02IH0gfSwJCS8qIEZhLFJiLGltbTYgKi8KLSAgeyBTSE9SVF9ULCAyLCB7IElNTTUgfSB9LAkJCS8qIGltbTVzMyAgICh0cmFwKSAqLwotICB7IFNIT1JUX0E1LCAwLCB7IFJhLCBSYiwgUmMgfSB9LAkJLyogUmEsUmIsUmMgKi8KLSAgeyBTSE9SVF9BNSwgMiwgeyBSYSwgUmIsIElNTTUgfSB9LAkJLyogUmEsUmIsaW1tNSAgICAoc2F0KikgKi8KLSAgeyBTSE9SVF9DTVAsIDAsIHsgQ0MsIEZhMiwgUmIsIFJjfSB9LAkJLyogQ0MgIEZhMixSYixSYyAqLwotICB7IFNIT1JUX0NNUCwgMiwgeyBDQywgRmEyLCBSYiwgSU1NNn0gfSwJLyogQ0MgIEZhMixSYixpbW02ICovCi0gIHsgU0hPUlRfQ01QVSwgMCwgeyBDQywgRmEyLCBSYiwgUmN9IH0sCS8qIENDICBGYTIsUmIsUmMgKi8KLSAgeyBTSE9SVF9DTVBVLCAyLCB7IENDLCBGYTIsIFJiLCBJTU02VTJ9IH0sCS8qIENDICBGYTIsUmIsaW1tNiAqLwotICB7IFNIT1JUX0ExLCAxLCB7IFJhLCBSYiwgUmMgfSB9LAkJLyogUmEsUmIsUmMgZm9yIE1BQyB3aGVyZSBhPTEgKi8KLSAgeyBTSE9SVF9BMSwgMywgeyBSYSwgUmIsIElNTTYgfSB9LAkJLyogUmEsUmIsaW1tNiBmb3IgTUFDIHdoZXJlIGE9MSAqLwotICB7IFNIT1JUX0FBLCAwLCB7IEFhLCBSYiwgUmMgfSB9LAkJLyogQWEsUmIsUmMgKi8KLSAgeyBTSE9SVF9BQSwgMiwgeyBBYSwgUmIsIElNTTYgfSB9LAkJLyogQWEsUmIsaW1tNiAqLwotICB7IFNIT1JUX1JBLCAwLCB7IFJhLCBBYiwgUmMgfSB9LAkJLyogUmEsQWIsUmMgKi8KLSAgeyBTSE9SVF9SQSwgMiwgeyBSYSwgQWIsIElNTTZVMiB9IH0sCQkvKiBSYSxBYixpbW02dSAqLwotICB7IFNIT1JUX01PRElOQywgMSwgeyBSYiwgSU1NNSB9IH0sCQkvKiBSYixpbW01IChtb2RpbmMpICovCi0gIHsgU0hPUlRfTU9EREVDLCAzLCB7IFJiLCBJTU01IH0gfSwJCS8qIFJiLGltbTUgKG1vZGRlYykgKi8KLSAgeyBTSE9SVF9DMSwgMCwgeyBSYSwgQ2IsIEZha2UgfSB9LAkJLyogUmEsQ2IgKG12ZnN5cykgKi8KLSAgeyBTSE9SVF9DMiwgMCwgeyBDYSwgUmIsIEZha2UgfSB9LAkJLyogQ2EsUmIgKG12dHN5cykgKi8KLSAgeyBTSE9SVF9VRiwgMCwgeyBGYSwgRmIgfSB9LAkJCS8qIEZhLEZiICAobm90ZmcpICovCi0gIHsgU0hPUlRfQTIsIDAsIHsgUmEyLCBSYiwgUmMgfSB9LAkJLyogUmEyLFJiLFJjICovCi0gIHsgU0hPUlRfQTIsIDIsIHsgUmEyLCBSYiwgSU1NNiB9IH0sCQkvKiBSYTIsUmIsaW1tNiAqLwotICB7IFNIT1JUX0E1UywgMCwgeyBSYSwgUmIsIFJjIH0gfSwJCS8qIFJhLFJiLFJjICovCi0gIHsgU0hPUlRfQTVTLCAyLCB7IFJhLCBSYiwgSU1NNVUgfSB9LAkJLyogUmEsUmIsaW1tNXUgICAoc2hpZnRzKSAqLwotICB7IFNIT1JUX05PTkUsIDAsIHsgMCB9IH0sCQkJLyogbm8gb3BlcmFuZHMgKG5vcCwgcmVpdCkgKi8KLSAgeyBMT05HLCAyLCB7IFJhLCBSYiwgSU1NMzIgfSB9LAkJLyogUmEsUmIsaW1tMzIgKi8KLSAgeyBMT05HX1UsIDIsIHsgSU1NMzIgfSB9LAkJCS8qIGltbTMyICovCi0gIHsgTE9OR19BRiwgMiwgeyBGYSwgUmIsIElNTTMyIH0gfSwJCS8qIEZhLFJiLGltbTMyICovCi0gIHsgTE9OR19DTVAsIDIsIHsgQ0MsIEZhMiwgUmIsIElNTTMyfSB9LAkvKiBDQyAgRmEyLFJiLGltbTMyICovCi0gIHsgTE9OR19NLCAyLCB7IFJhLCBBVFBBUiwgUmIsIElNTTMyIH0gfSwJLyogUmEsQChSYixpbW0zMikgKi8KLSAgeyBMT05HX00yLCAyLCB7IFJhMiwgQVRQQVIsIFJiLCBJTU0zMiB9IH0sCS8qIFJhLEAoUmIsaW1tMzIpICovCi0gIHsgTE9OR18yLCAyLCB7IFJhMywgSU1NMzIgfSB9LAkJLyogUmEsaW1tMzIgKi8KLSAgeyBMT05HXzJiLCAzLCB7IFJhMywgSU1NMzIgfSB9LAkJLyogUmEsaW1tMzIgKi8KLSAgeyBMT05HX0QsIDIsIHsgSU1NNlMzLCBJTU0zMiB9IH0sCQkvKiBpbW02czMsaW1tMzIgKi8KLSAgeyBMT05HX0RiLCAyLCB7IElNTTZVLCBJTU0zMiB9IH0sCQkvKiBpbW02LGltbTMyICovCi0gIHsgMCwgMCwgeyAwIH0gfSwKLX07Ci0KLWNvbnN0IGNoYXIgKmQzMHZfZWNjX25hbWVzW10gPQotewotICAiYWwiLAotICAidHgiLAotICAiZngiLAotICAieHQiLAotICAieGYiLAotICAidHQiLAotICAidGYiLAotICAicmVzIgotfTsKLQotY29uc3QgY2hhciAqZDMwdl9jY19uYW1lc1tdID0KLXsKLSAgImVxIiwKLSAgIm5lIiwKLSAgImd0IiwKLSAgImdlIiwKLSAgImx0IiwKLSAgImxlIiwKLSAgInBzIiwKLSAgIm5nIiwKLSAgTlVMTAotfTsKZGlmZiAtLWdpdCBhL29wY29kZXMvZGVwLWluLnNlZCBiL29wY29kZXMvZGVwLWluLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMwZGVlNTYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9kZXAtaW4uc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotOmxvb3AKLS9cXCQvTgotcy9cXFxuICovIC9nCi10IGxvb3AKLQotcyFcLm86IS5sbzohCi1zISBAQkZEX0hAISAkKEJGRF9IKSFnCi1zIUBJTkNESVJAISQoSU5DRElSKSFnCi1zIUBCRkRESVJAISQoQkZERElSKSFnCi1zIUBTUkNESVJALyEhZwotCi1zL1xcXG4gKi8gL2cKLQotcy8gKiQvLwotcy8gICovIC9nCi1zLyAqOi86L2cKLS86JC9kCi0KLXMvXCguXHs1MFx9W14gXSpcKSAvXDEgXFxcCi0gIC9nCmRpZmYgLS1naXQgYS9vcGNvZGVzL2Rpcy1idWYuYyBiL29wY29kZXMvZGlzLWJ1Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzZiZTJlLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZGlzLWJ1Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIGZyb20gYSBidWZmZXIsIGZvciBHTlUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogR2V0IExFTkdUSCBieXRlcyBmcm9tIGluZm8ncyBidWZmZXIsIGF0IHRhcmdldCBhZGRyZXNzIG1lbWFkZHIuCi0gICBUcmFuc2ZlciB0aGVtIHRvIG15YWRkci4gICovCi1pbnQKLWJ1ZmZlcl9yZWFkX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW5ndGgsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgYmZkX2J5dGUgKm15YWRkcjsKLSAgICAgaW50IGxlbmd0aDsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGlmIChtZW1hZGRyIDwgaW5mby0+YnVmZmVyX3ZtYQotICAgICAgfHwgbWVtYWRkciArIGxlbmd0aCA+IGluZm8tPmJ1ZmZlcl92bWEgKyBpbmZvLT5idWZmZXJfbGVuZ3RoKQotICAgIC8qIE91dCBvZiBib3VuZHMuICBVc2UgRUlPIGJlY2F1c2UgR0RCIHVzZXMgaXQuICAqLwotICAgIHJldHVybiBFSU87Ci0gIG1lbWNweSAobXlhZGRyLCBpbmZvLT5idWZmZXIgKyAobWVtYWRkciAtIGluZm8tPmJ1ZmZlcl92bWEpLCBsZW5ndGgpOwotICByZXR1cm4gMDsKLX0KLQotLyogUHJpbnQgYW4gZXJyb3IgbWVzc2FnZS4gIFdlIGNhbiBhc3N1bWUgdGhhdCB0aGlzIGlzIGluIHJlc3BvbnNlIHRvCi0gICBhbiBlcnJvciByZXR1cm4gZnJvbSBidWZmZXJfcmVhZF9tZW1vcnkuICAqLwotdm9pZAotcGVycm9yX21lbW9yeSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKQotICAgICBpbnQgc3RhdHVzOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpZiAoc3RhdHVzICE9IEVJTykKLSAgICAvKiBDYW4ndCBoYXBwZW4uICAqLwotICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCBfKCJVbmtub3duIGVycm9yICVkXG4iKSwgc3RhdHVzKTsKLSAgZWxzZQotICAgIC8qIEFjdHVhbGx5LCBhZGRyZXNzIGJldHdlZW4gbWVtYWRkciBhbmQgbWVtYWRkciArIGxlbiB3YXMKLSAgICAgICBvdXQgb2YgYm91bmRzLiAgKi8KLSAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwKLQkJCV8oIkFkZHJlc3MgMHgleCBpcyBvdXQgb2YgYm91bmRzLlxuIiksIG1lbWFkZHIpOwotfQotCi0vKiBUaGlzIGNvdWxkIGJlIGluIGEgc2VwYXJhdGUgZmlsZSwgdG8gc2F2ZSBtaW5pc2N1bGUgYW1vdW50cyBvZiBzcGFjZQotICAgaW4gc3RhdGljYWxseSBsaW5rZWQgZXhlY3V0YWJsZXMuICAqLwotCi0vKiBKdXN0IHByaW50IHRoZSBhZGRyZXNzIGlzIGhleC4gIFRoaXMgaXMgaW5jbHVkZWQgZm9yIGNvbXBsZXRlbmVzcyBldmVuCi0gICB0aG91Z2ggYm90aCBHREIgYW5kIG9iamR1bXAgcHJvdmlkZSB0aGVpciBvd24gKHRvIHByaW50IHN5bWJvbGljCi0gICBhZGRyZXNzZXMpLiAgKi8KLQotdm9pZAotZ2VuZXJpY19wcmludF9hZGRyZXNzIChhZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBhZGRyKTsKLX0KLQotLyogSnVzdCBjb25jYXRlbmF0ZSB0aGUgYWRkcmVzcyBhcyBoZXguICBUaGlzIGlzIGluY2x1ZGVkIGZvcgotICAgY29tcGxldGVuZXNzIGV2ZW4gdGhvdWdoIGJvdGggR0RCIGFuZCBvYmpkdW1wIHByb3ZpZGUgdGhlaXIgb3duICh0bwotICAgcHJpbnQgc3ltYm9saWMgYWRkcmVzc2VzKS4gICovCi0KLXZvaWQKLWdlbmVyaWNfc3RyY2F0X2FkZHJlc3MgKGFkZHIsIGJ1ZiwgbGVuKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgaW50IGxlbjsKLXsKLSAgaWYgKGJ1ZiAhPSAoY2hhciAqKU5VTEwgJiYgbGVuID4gMCkKLSAgICB7Ci0gICAgICBjaGFyIHRtcEJ1ZlszMF07Ci0KLSAgICAgIHNwcmludGZfdm1hICh0bXBCdWYsIGFkZHIpOwotICAgICAgaWYgKChzdHJsZW4gKGJ1ZikgKyBzdHJsZW4gKHRtcEJ1ZikpIDw9IGxlbikKLQlzdHJjYXQgKGJ1ZiwgdG1wQnVmKTsKLSAgICAgIGVsc2UKLQlzdHJuY2F0IChidWYsIHRtcEJ1ZiwgKGxlbiAtIHN0cmxlbihidWYpKSk7Ci0gICAgfQotICByZXR1cm47Ci19Ci0KLS8qIEp1c3QgcmV0dXJuIHRoZSBnaXZlbiBhZGRyZXNzLiAgKi8KLQotaW50Ci1nZW5lcmljX3N5bWJvbF9hdF9hZGRyZXNzIChhZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLXsKLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2Rpc2Fzc2VtYmxlLmMgYi9vcGNvZGVzL2Rpc2Fzc2VtYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OThiNDIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9kaXNhc3NlbWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qIFNlbGVjdCBkaXNhc3NlbWJseSByb3V0aW5lIGZvciBzcGVjaWZpZWQgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLSNpZmRlZiBBUkNIX2FsbAotI2RlZmluZSBBUkNIX2EyOWsKLSNkZWZpbmUgQVJDSF9hbHBoYQotI2RlZmluZSBBUkNIX2FyYwotI2RlZmluZSBBUkNIX2FybQotI2RlZmluZSBBUkNIX2QxMHYKLSNkZWZpbmUgQVJDSF9kMzB2Ci0jZGVmaW5lIEFSQ0hfaDgzMDAKLSNkZWZpbmUgQVJDSF9oODUwMAotI2RlZmluZSBBUkNIX2hwcGEKLSNkZWZpbmUgQVJDSF9pMzg2Ci0jZGVmaW5lIEFSQ0hfaTk2MAotI2RlZmluZSBBUkNIX2ZyMzAKLSNkZWZpbmUgQVJDSF9tMzJyCi0jZGVmaW5lIEFSQ0hfbTY4awotI2RlZmluZSBBUkNIX204OGsKLSNkZWZpbmUgQVJDSF9tY29yZQotI2RlZmluZSBBUkNIX21pcHMKLSNkZWZpbmUgQVJDSF9tbjEwMjAwCi0jZGVmaW5lIEFSQ0hfbW4xMDMwMAotI2RlZmluZSBBUkNIX25zMzJrCi0jZGVmaW5lIEFSQ0hfcG93ZXJwYwotI2RlZmluZSBBUkNIX3JzNjAwMAotI2RlZmluZSBBUkNIX3NoCi0jZGVmaW5lIEFSQ0hfc3BhcmMKLSNkZWZpbmUgQVJDSF90aWMzMAotI2RlZmluZSBBUkNIX3RpYzgwCi0jZGVmaW5lIEFSQ0hfdjg1MAotI2RlZmluZSBBUkNIX3ZheAotI2RlZmluZSBBUkNIX3c2NQotI2RlZmluZSBBUkNIX3o4awotI2VuZGlmCi0KLQotZGlzYXNzZW1ibGVyX2Z0eXBlCi1kaXNhc3NlbWJsZXIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGEgPSBiZmRfZ2V0X2FyY2ggKGFiZmQpOwotICBkaXNhc3NlbWJsZXJfZnR5cGUgZGlzYXNzZW1ibGU7Ci0KLSAgc3dpdGNoIChhKQotICAgIHsKLSAgICAgIC8qIElmIHlvdSBhZGQgYSBjYXNlIHRvIHRoaXMgdGFibGUsIGFsc28gYWRkIGl0IHRvIHRoZQotCSBBUkNIX2FsbCBkZWZpbml0aW9uIHJpZ2h0IGFib3ZlIHRoaXMgZnVuY3Rpb24uICAqLwotI2lmZGVmIEFSQ0hfYTI5awotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIC8qIEFzIGZhciBhcyBJIGtub3cgd2Ugb25seSBoYW5kbGUgYmlnLWVuZGlhbiAyOWsgb2JqZWN0cy4gICovCi0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fYmlnX2EyOWs7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfYWxwaGEKLSAgICBjYXNlIGJmZF9hcmNoX2FscGhhOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2FscGhhOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2FyYwotICAgIGNhc2UgYmZkX2FyY2hfYXJjOgotICAgICAgewotCWRpc2Fzc2VtYmxlID0gYXJjX2dldF9kaXNhc3NlbWJsZXIgKGJmZF9nZXRfbWFjaCAoYWJmZCksCi0JCQkJCSAgICBiZmRfYmlnX2VuZGlhbiAoYWJmZCkpOwotCWJyZWFrOwotICAgICAgfQotI2VuZGlmCi0jaWZkZWYgQVJDSF9hcm0KLSAgICBjYXNlIGJmZF9hcmNoX2FybToKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2JpZ19hcm07Ci0gICAgICBlbHNlCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2xpdHRsZV9hcm07Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfZDEwdgotICAgIGNhc2UgYmZkX2FyY2hfZDEwdjoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9kMTB2OwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2QzMHYKLSAgICBjYXNlIGJmZF9hcmNoX2QzMHY6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fZDMwdjsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9oODMwMAotICAgIGNhc2UgYmZkX2FyY2hfaDgzMDA6Ci0gICAgICBpZiAoYmZkX2dldF9tYWNoKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwaCkKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25faDgzMDBoOwotICAgICAgZWxzZSBpZiAoYmZkX2dldF9tYWNoKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwcykKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25faDgzMDBzOwotICAgICAgZWxzZSAKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25faDgzMDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfaDg1MDAKLSAgICBjYXNlIGJmZF9hcmNoX2g4NTAwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2g4NTAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2hwcGEKLSAgICBjYXNlIGJmZF9hcmNoX2hwcGE6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25faHBwYTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9pMzg2Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCkKLSAgICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2kzODZfaW50ZWw7Ci0gICAgICBlbHNlCi0gICAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9pMzg2X2F0dDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9pOTYwCi0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2k5NjA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfZnIzMAotICAgIGNhc2UgYmZkX2FyY2hfZnIzMDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9mcjMwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX20zMnIKLSAgICBjYXNlIGJmZF9hcmNoX20zMnI6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbTMycjsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9tNjhrCi0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX202OGs7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbTg4awotICAgIGNhc2UgYmZkX2FyY2hfbTg4azoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9tODhrOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX25zMzJrCi0gICAgY2FzZSBiZmRfYXJjaF9uczMyazoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9uczMyazsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9tY29yZQotICAgIGNhc2UgYmZkX2FyY2hfbWNvcmU6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbWNvcmU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbWlwcwotICAgIGNhc2UgYmZkX2FyY2hfbWlwczoKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2JpZ19taXBzOwotICAgICAgZWxzZQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9saXR0bGVfbWlwczsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9tbjEwMjAwCi0gICAgY2FzZSBiZmRfYXJjaF9tbjEwMjAwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX21uMTAyMDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbW4xMDMwMAotICAgIGNhc2UgYmZkX2FyY2hfbW4xMDMwMDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9tbjEwMzAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3Bvd2VycGMKLSAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6Ci0gICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9iaWdfcG93ZXJwYzsKLSAgICAgIGVsc2UKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbGl0dGxlX3Bvd2VycGM7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfcnM2MDAwCi0gICAgY2FzZSBiZmRfYXJjaF9yczYwMDA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fcnM2MDAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3NoCi0gICAgY2FzZSBiZmRfYXJjaF9zaDoKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3NoOwotICAgICAgZWxzZQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9zaGw7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfc3BhcmMKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3NwYXJjOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3RpYzMwCi0gICAgY2FzZSBiZmRfYXJjaF90aWMzMDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl90aWMzMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF90aWM4MAotICAgIGNhc2UgYmZkX2FyY2hfdGljODA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fdGljODA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfdjg1MAotICAgIGNhc2UgYmZkX2FyY2hfdjg1MDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl92ODUwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3c2NQotICAgIGNhc2UgYmZkX2FyY2hfdzY1OgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3c2NTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF96OGsKLSAgICBjYXNlIGJmZF9hcmNoX3o4azoKLSAgICAgIGlmIChiZmRfZ2V0X21hY2goYWJmZCkgPT0gYmZkX21hY2hfejgwMDEpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3o4MDAxOwotICAgICAgZWxzZSAKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fejgwMDI7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfdmF4Ci0gICAgY2FzZSBiZmRfYXJjaF92YXg6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fdmF4OwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gZGlzYXNzZW1ibGU7Ci19Ci0KZGlmZiAtLWdpdCBhL29wY29kZXMvZnIzMC1hc20uYyBiL29wY29kZXMvZnIzMC1hc20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1Y2NkYy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2ZyMzAtYXNtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjAgKzAsMCBAQAotLyogQXNzZW1ibGVyIGludGVyZmFjZSBmb3IgdGFyZ2V0cyB1c2luZyBDR0VOLiAtKi0gQyAtKi0KLSAgIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IKLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLS0gdGhlIHJlc3VsdGFudCBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkLCBjZ2VuLWFzbS5pbiBpc24ndAotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogPz8/IEV2ZW50dWFsbHkgbW9yZSBhbmQgbW9yZSBvZiB0aGlzIHN0dWZmIGNhbiBnbyB0byBjcHUtaW5kZXBlbmRlbnQgZmlsZXMuCi0gICBLZWVwIHRoYXQgaW4gbWluZC4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJmcjMwLWRlc2MuaCIKLSNpbmNsdWRlICJmcjMwLW9wYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0jdW5kZWYgbWluCi0jZGVmaW5lIG1pbihhLGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0jdW5kZWYgbWF4Ci0jZGVmaW5lIG1heChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCi0KLXN0YXRpYyBjb25zdCBjaGFyICogcGFyc2VfaW5zbl9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICosIGNvbnN0IGNoYXIgKiosIENHRU5fRklFTERTICopKTsKLQwKLS8qIC0tIGFzc2VtYmxlciByb3V0aW5lcyBpbnNlcnRlZCBoZXJlICovCi0KLS8qIC0tIGFzbS5jICovCi0vKiBIYW5kbGUgcmVnaXN0ZXIgbGlzdHMgZm9yIExETXggYW5kIFNUTXggICovCi0KLXN0YXRpYyBpbnQKLXBhcnNlX3JlZ2lzdGVyX251bWJlciAoc3RycCkKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci17Ci0gIGludCByZWdubzsKLSAgaWYgKCoqc3RycCA8ICcwJyB8fCAqKnN0cnAgPiAnOScpCi0gICAgcmV0dXJuIC0xOyAvKiBlcnJvciAqLwotICByZWdubyA9ICoqc3RycCAtICcwJzsKLSAgKysqc3RycDsKLQotICBpZiAoKipzdHJwID49ICcwJyAmJiAqKnN0cnAgPD0gJzknKQotICAgIHsKLSAgICAgIHJlZ25vID0gcmVnbm8gKiAxMCArICgqKnN0cnAgLSAnMCcpOwotICAgICAgKysqc3RycDsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlZ25vOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9yZWdpc3Rlcl9saXN0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCBoaWdoX2xvdywgbG9hZF9zdG9yZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci0gICAgIGludCBoaWdoX2xvdzsgICAvKiAwID09IGhpZ2gsIDEgPT0gbG93ICovCi0gICAgIGludCBsb2FkX3N0b3JlOyAvKiAwID09IGxvYWQsIDEgPT0gc3RvcmUgKi8KLXsKLSAgaW50IHJlZ25vOwotICAqdmFsdWVwID0gMDsKLSAgd2hpbGUgKCoqc3RycCAmJiAqKnN0cnAgIT0gJyknKQotICAgIHsKLSAgICAgIGlmICgqKnN0cnAgIT0gJ1InICYmICoqc3RycCAhPSAncicpCi0JYnJlYWs7Ci0gICAgICArKypzdHJwOwotCi0gICAgICByZWdubyA9IHBhcnNlX3JlZ2lzdGVyX251bWJlciAoc3RycCk7Ci0gICAgICBpZiAocmVnbm8gPT0gLTEpCi0JcmV0dXJuICJSZWdpc3RlciBudW1iZXIgaXMgbm90IHZhbGlkIjsKLSAgICAgIGlmIChyZWdubyA+IDcgJiYgIWhpZ2hfbG93KQotCXJldHVybiAiUmVnaXN0ZXIgbXVzdCBiZSBiZXR3ZWVuIHIwIGFuZCByNyI7Ci0gICAgICBpZiAocmVnbm8gPCA4ICYmIGhpZ2hfbG93KQotCXJldHVybiAiUmVnaXN0ZXIgbXVzdCBiZSBiZXR3ZWVuIHI4IGFuZCByMTUiOwotCi0gICAgICBpZiAoaGlnaF9sb3cpCi0JcmVnbm8gLT0gODsKLQotICAgICAgaWYgKGxvYWRfc3RvcmUpIC8qIG1hc2sgaXMgcmV2ZXJzZWQgZm9yIHN0b3JlICovCi0JKnZhbHVlcCB8PSAweDgwID4+IHJlZ25vOwotICAgICAgZWxzZQotCSp2YWx1ZXAgfD0gMSA8PCByZWdubzsKLQotICAgICAgaWYgKCoqc3RycCA9PSAnLCcpCi0JewotCSAgaWYgKCooKnN0cnAgKyAxKSA9PSAnKScpCi0JICAgIGJyZWFrOwotCSAgKysqc3RycDsKLQl9Ci0gICAgfQotCi0gIGlmICghKnN0cnAgfHwgKipzdHJwICE9ICcpJykKLSAgICByZXR1cm4gIlJlZ2lzdGVyIGxpc3QgaXMgbm90IHZhbGlkIjsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfbG93X3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOwotewotICByZXR1cm4gcGFyc2VfcmVnaXN0ZXJfbGlzdCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgMC8qbG93Ki8sIDAvKmxvYWQqLyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX2hpX3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOwotewotICByZXR1cm4gcGFyc2VfcmVnaXN0ZXJfbGlzdCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgMS8qaGlnaCovLCAwLypsb2FkKi8pOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9sb3dfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIHJldHVybiBwYXJzZV9yZWdpc3Rlcl9saXN0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAwLypsb3cqLywgMS8qc3RvcmUqLyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX2hpX3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOwotewotICByZXR1cm4gcGFyc2VfcmVnaXN0ZXJfbGlzdCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgMS8qaGlnaCovLCAxLypzdG9yZSovKTsKLX0KLQotLyogLS0gKi8KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3Igb3BlcmFuZCBwYXJzaW5nLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHBhcnNlX2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcGFyc2VfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuCi0qLwotCi1jb25zdCBjaGFyICoKLWZyMzBfY2dlbl9wYXJzZV9vcGVyYW5kIChjZCwgb3BpbmRleCwgc3RycCwgZmllbGRzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgY29uc3QgY2hhciAqKiBzdHJwOwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLXsKLSAgY29uc3QgY2hhciAqIGVycm1zZzsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lcywgJiBmaWVsZHMtPmZfQ1JpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lcywgJiBmaWVsZHMtPmZfQ1JqKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxMywgJiBmaWVsZHMtPmZfbmlsKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNCwgJiBmaWVsZHMtPmZfbmlsKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNSwgJiBmaWVsZHMtPmZfbmlsKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9SaSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsICYgZmllbGRzLT5mX1JpYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfUmopOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9SamMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzLCAmIGZpZWxkcy0+Zl9SczEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzLCAmIGZpZWxkcy0+Zl9SczIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0NDLCAmZmllbGRzLT5mX2NjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfQ0NDLCAmZmllbGRzLT5mX2NjYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElSMTAsICZmaWVsZHMtPmZfZGlyMTApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElSOCwgJmZpZWxkcy0+Zl9kaXI4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0RJUjksICZmaWVsZHMtPmZfZGlyOSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9ESVNQMTAsICZmaWVsZHMtPmZfZGlzcDEwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElTUDgsICZmaWVsZHMtPmZfZGlzcDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9ESVNQOSwgJmZpZWxkcy0+Zl9kaXNwOSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0kyMCwgJmZpZWxkcy0+Zl9pMjApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9JMzIsICZmaWVsZHMtPmZfaTMyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9JOCwgJmZpZWxkcy0+Zl9pOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIHsKLSAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0xBQkVMMTIsIDAsIE5VTEwsICAmIHZhbHVlKTsKLSAgICAgICAgZmllbGRzLT5mX3JlbDEyID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgewotICAgICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfTEFCRUw5LCAwLCBOVUxMLCAgJiB2YWx1ZSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9yZWw5ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX000LCAmZmllbGRzLT5mX200KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2hfcHMsICYgZmllbGRzLT5mX25pbCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX2hpX3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCwgJmZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgZXJybXNnID0gcGFyc2VfaGlfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NULCAmZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3QpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgZXJybXNnID0gcGFyc2VfbG93X3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQsICZmaWVsZHMtPmZfcmVnbGlzdF9sb3dfbGQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgotICAgICAgZXJybXNnID0gcGFyc2VfbG93X3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QsICZmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3QpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUzEwLCAmZmllbGRzLT5mX3MxMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1UxMCwgJmZpZWxkcy0+Zl91MTApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1U0LCAmZmllbGRzLT5mX3U0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfVTRDLCAmZmllbGRzLT5mX3U0Yyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfVTgsICZmaWVsZHMtPmZfdTgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9VRElTUDYsICZmaWVsZHMtPmZfdWRpc3A2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcGFyc2luZy5cbiIpLCBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgcmV0dXJuIGVycm1zZzsKLX0KLQotY2dlbl9wYXJzZV9mbiAqIGNvbnN0IGZyMzBfY2dlbl9wYXJzZV9oYW5kbGVyc1tdID0gCi17Ci0gIHBhcnNlX2luc25fbm9ybWFsLAotfTsKLQotdm9pZAotZnIzMF9jZ2VuX2luaXRfYXNtIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgZnIzMF9jZ2VuX2luaXRfb3Bjb2RlX3RhYmxlIChjZCk7Ci0gIGZyMzBfY2dlbl9pbml0X2libGRfdGFibGUgKGNkKTsKLSAgY2QtPnBhcnNlX2hhbmRsZXJzID0gJiBmcjMwX2NnZW5fcGFyc2VfaGFuZGxlcnNbMF07Ci0gIGNkLT5wYXJzZV9vcGVyYW5kID0gZnIzMF9jZ2VuX3BhcnNlX29wZXJhbmQ7Ci19Ci0KLQwKLS8qIERlZmF1bHQgaW5zbiBwYXJzZXIuCi0KLSAgIFRoZSBzeW50YXggc3RyaW5nIGlzIHNjYW5uZWQgYW5kIG9wZXJhbmRzIGFyZSBwYXJzZWQgYW5kIHN0b3JlZCBpbiBGSUVMRFMuCi0gICBSZWxvY3MgYXJlIHF1ZXVlZCBhcyB3ZSBnbyB2aWEgb3RoZXIgY2FsbGJhY2tzLgotCi0gICA/Pz8gTm90ZSB0aGF0IHRoaXMgaXMgY3VycmVudGx5IGFuIGFsbC1vci1ub3RoaW5nIHBhcnNlci4gIElmIHdlIGZhaWwgdG8KLSAgIHBhcnNlIHRoZSBpbnN0cnVjdGlvbiwgd2UgcmV0dXJuIDAgYW5kIHRoZSBjYWxsZXIgd2lsbCBzdGFydCBvdmVyIGZyb20KLSAgIHRoZSBiZWdpbm5pbmcuICBCYWNrdHJhY2tpbmcgd2lsbCBiZSBuZWNlc3NhcnkgaW4gcGFyc2luZyBzdWJleHByZXNzaW9ucywKLSAgIGJ1dCB0aGF0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLiAgTm90IGhhbmRsaW5nIGJhY2t0cmFja2luZyBoZXJlIG1heSBnZXQKLSAgIGV4cGVuc2l2ZSBpbiB0aGUgY2FzZSBvZiB0aGUgbTY4ay4gIERlYWwgd2l0aCBsYXRlci4KLQotICAgUmV0dXJucyBOVUxMIGZvciBzdWNjZXNzLCBhbiBlcnJvciBtZXNzYWdlIGZvciBmYWlsdXJlLgotKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaW5zbl9ub3JtYWwgKGNkLCBpbnNuLCBzdHJwLCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci17Ci0gIC8qID8/PyBSdW50aW1lIGFkZGVkIGluc25zIG5vdCBoYW5kbGVkIHlldC4gICovCi0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgY29uc3QgY2hhciAqc3RyID0gKnN0cnA7Ci0gIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgY29uc3QgY2hhciAqcDsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqIHN5bjsKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0gIC8qIEZJWE1FOiB3aXAgKi8KLSAgaW50IHBhc3Rfb3Bjb2RlX3A7Ci0jZW5kaWYKLQotICAvKiBGb3Igbm93IHdlIGFzc3VtZSB0aGUgbW5lbW9uaWMgaXMgZmlyc3QgKHRoZXJlIGFyZSBubyBsZWFkaW5nIG9wZXJhbmRzKS4KLSAgICAgV2UgY2FuIHBhcnNlIGl0IHdpdGhvdXQgbmVlZGluZyB0byBzZXQgdXAgb3BlcmFuZCBwYXJzaW5nLgotICAgICBHQVMncyBpbnB1dCBzY3J1YmJlciB3aWxsIGVuc3VyZSBtbmVtb25pY3MgYXJlIGxvd2VyY2FzZSwgYnV0IHdlIG1heQotICAgICBub3QgYmUgY2FsbGVkIGZyb20gR0FTLiAgKi8KLSAgcCA9IENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbik7Ci0gIHdoaWxlICgqcCAmJiB0b2xvd2VyICgqcCkgPT0gdG9sb3dlciAoKnN0cikpCi0gICAgKytwLCArK3N0cjsKLSAgCi0gIGlmICgqIHAgfHwgKCogc3RyICYmICFpc3NwYWNlICgqIHN0cikpKQotICAgIHJldHVybiBfKCJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iKTsKLQotICBDR0VOX0lOSVRfUEFSU0UgKGNkKTsKLSAgY2dlbl9pbml0X3BhcnNlX29wZXJhbmQgKGNkKTsKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0gIHBhc3Rfb3Bjb2RlX3AgPSAwOwotI2VuZGlmCi0KLSAgLyogV2UgZG9uJ3QgY2hlY2sgZm9yICgqc3RyICE9ICdcMCcpIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRvIHBhcnNlCi0gICAgIGFueSB0cmFpbGluZyBmYWtlIGFyZ3VtZW50cyBpbiB0aGUgc3ludGF4IHN0cmluZy4gICovCi0gIHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsKLQotICAvKiBNbmVtb25pY3MgY29tZSBmaXJzdCBmb3Igbm93LCBlbnN1cmUgdmFsaWQgc3RyaW5nLiAgKi8KLSAgaWYgKCEgQ0dFTl9TWU5UQVhfTU5FTU9OSUNfUCAoKiBzeW4pKQotICAgIGFib3J0ICgpOwotCi0gICsrc3luOwotCi0gIHdoaWxlICgqIHN5biAhPSAwKQotICAgIHsKLSAgICAgIC8qIE5vbiBvcGVyYW5kIGNoYXJzIG11c3QgbWF0Y2ggZXhhY3RseS4gICovCi0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqIHN5bikpCi0JewotCSAgaWYgKCpzdHIgPT0gQ0dFTl9TWU5UQVhfQ0hBUiAoKiBzeW4pKQotCSAgICB7Ci0jaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotCSAgICAgIGlmICgqIHN5biA9PSAnICcpCi0JCXBhc3Rfb3Bjb2RlX3AgPSAxOwotI2VuZGlmCi0JICAgICAgKysgc3luOwotCSAgICAgICsrIHN0cjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogU3ludGF4IGNoYXIgZGlkbid0IG1hdGNoLiAgQ2FuJ3QgYmUgdGhpcyBpbnNuLiAgKi8KLQkgICAgICAvKiBGSVhNRTogd291bGQgbGlrZSB0byByZXR1cm4gc29tZXRoaW5nIGxpa2UKLQkJICJleHBlY3RlZCBjaGFyIGBjJyIgKi8KLQkgICAgICByZXR1cm4gXygic3ludGF4IGVycm9yIik7Ci0JICAgIH0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBhbiBvcGVyYW5kIG9mIHNvbWUgc29ydC4gICovCi0gICAgICBlcnJtc2cgPSBmcjMwX2NnZW5fcGFyc2Vfb3BlcmFuZCAoY2QsIENHRU5fU1lOVEFYX0ZJRUxEICgqc3luKSwKLQkJCQkJICAmc3RyLCBmaWVsZHMpOwotICAgICAgaWYgKGVycm1zZykKLQlyZXR1cm4gZXJybXNnOwotCi0gICAgICAvKiBEb25lIHdpdGggdGhpcyBvcGVyYW5kLCBjb250aW51ZSB3aXRoIG5leHQgb25lLiAgKi8KLSAgICAgICsrIHN5bjsKLSAgICB9Ci0KLSAgLyogSWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgc3ludGF4IHN0cmluZywgd2UncmUgZG9uZS4gICovCi0gIGlmICgqIHN5biA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBGb3IgdGhlIG1vbWVudCB3ZSBhc3N1bWUgYSB2YWxpZCBgc3RyJyBjYW4gb25seSBjb250YWluCi0JIGJsYW5rcyBub3cuICBJRTogV2UgbmVlZG4ndCB0cnkgYWdhaW4gd2l0aCBhIGxvbmdlciB2ZXJzaW9uIG9mCi0JIHRoZSBpbnNuIGFuZCBpdCBpcyBhc3N1bWVkIHRoYXQgbG9uZ2VyIHZlcnNpb25zIG9mIGluc25zIGFwcGVhcgotCSBiZWZvcmUgc2hvcnRlciBvbmVzIChlZzogbHNyIHIyLHIzLDEgdnMgbHNyIHIyLHIzKS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBzdHIpKQotCSsrIHN0cjsKLQotICAgICAgaWYgKCogc3RyICE9ICdcMCcpCi0JcmV0dXJuIF8oImp1bmsgYXQgZW5kIG9mIGxpbmUiKTsgLyogRklYTUU6IHdvdWxkIGxpa2UgdG8gaW5jbHVkZSBgc3RyJyAqLwotCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogV2UgY291bGRuJ3QgcGFyc2UgaXQuICAqLwotICByZXR1cm4gXygidW5yZWNvZ25pemVkIGluc3RydWN0aW9uIik7Ci19Ci0MCi0vKiBNYWluIGVudHJ5IHBvaW50LgotICAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmb3IgZWFjaCBpbnN0cnVjdGlvbiB0byBiZSBhc3NlbWJsZWQuCi0gICBTVFIgcG9pbnRzIHRvIHRoZSBpbnNuIHRvIGJlIGFzc2VtYmxlZC4KLSAgIFdlIGFzc3VtZSBhbGwgbmVjZXNzYXJ5IHRhYmxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICBUaGUgYXNzZW1ibGVkIGluc3RydWN0aW9uLCBsZXNzIGFueSBmaXh1cHMsIGlzIHN0b3JlZCBpbiBCVUYuCi0gICBSZW1lbWJlciB0aGF0IGlmIENHRU5fSU5UX0lOU05fUCB0aGVuIEJVRiBpcyBhbiBpbnQgYW5kIHRodXMgdGhlIHZhbHVlCi0gICBzdGlsbCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gdGFyZ2V0IGJ5dGUgb3JkZXIsIG90aGVyd2lzZSBCVUYgaXMgYW4gYXJyYXkKLSAgIG9mIGJ5dGVzIGluIHRhcmdldCBieXRlIG9yZGVyLgotICAgVGhlIHJlc3VsdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGluc24ncyBlbnRyeSBpbiB0aGUgb3Bjb2RlIHRhYmxlLAotICAgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cmVkIChhbiBlcnJvciBtZXNzYWdlIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4KLSAgIHByaW50ZWQpLgotCi0gICBOb3RlIHRoYXQgd2hlbiBwcm9jZXNzaW5nIChub24tYWxpYXMpIG1hY3JvLWluc25zLAotICAgdGhpcyBmdW5jdGlvbiByZWN1cnNlcy4KLQotICAgPz8/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/IFRoaXMgY2FuIGxpdmUgaW4gYSBtYWNoaW5lIGluZGVwZW5kZW50IGZpbGUsIGJ1dCB0aGVyZSdzIGN1cnJlbnRseQotICAgbm8gcGxhY2UgdG8gcHV0IHRoaXMgZmlsZSAodGhlcmUncyBubyBsaWJjZ2VuKS4gIGxpYm9wY29kZXMgaXMgdGhlIHdyb25nCi0gICBwbGFjZSBhcyBzb21lIHNpbXVsYXRvciBwb3J0cyB1c2UgdGhpcyBidXQgdGhleSBkb24ndCB1c2UgbGlib3Bjb2Rlcy4gICovCi0KLXZvaWQKLWZyMzBfY2dlbl9jcHVfY2xvc2UgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpZiAoY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzKQotICAgIGZyZWUgKChDR0VOX0lOU04gKikgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzKTsKLSAgaWYgKGNkLT5od190YWJsZS5lbnRyaWVzKQotICAgIGZyZWUgKChDR0VOX0hXX0VOVFJZICopIGNkLT5od190YWJsZS5lbnRyaWVzKTsKLSAgZnJlZSAoY2QpOwotfQotCmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtZGVzYy5oIGIvb3Bjb2Rlcy9mcjMwLWRlc2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI4OTE1Ni4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2ZyMzAtZGVzYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qIENQVSBkYXRhIGhlYWRlciBmb3IgZnIzMC4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2lmbmRlZiBGUjMwX0NQVV9ICi0jZGVmaW5lIEZSMzBfQ1BVX0gKLQotI2RlZmluZSBDR0VOX0FSQ0ggZnIzMAotCi0vKiBHaXZlbiBzeW1ib2wgUywgcmV0dXJuIGZyMzBfY2dlbl88Uz4uICAqLwotI2RlZmluZSBDR0VOX1NZTShzKSBDT05DQVQzIChmcjMwLF9jZ2VuXyxzKQotCi0vKiBTZWxlY3RlZCBjcHUgZmFtaWxpZXMuICAqLwotI2RlZmluZSBIQVZFX0NQVV9GUjMwQkYKLQotI2RlZmluZSBDR0VOX0lOU05fTFNCMF9QIDAKLQotLyogTWF4aW11bSBzaXplIG9mIGFueSBpbnNuIChpbiBieXRlcykuICAqLwotI2RlZmluZSBDR0VOX01BWF9JTlNOX1NJWkUgNgotCi0jZGVmaW5lIENHRU5fSU5UX0lOU05fUCAwCi0KLS8qIEZJWE1FOiBOZWVkIHRvIGNvbXB1dGUgQ0dFTl9NQVhfU1lOVEFYX0JZVEVTLiAgKi8KLQotLyogQ0dFTl9NTkVNT05JQ19PUEVSQU5EUyBpcyBkZWZpbmVkIGlmIG1uZW1vbmljcyBoYXZlIG9wZXJhbmRzLgotICAgZS5nLiBJbiAiYixhIGZvbyIgdGhlICIsYSIgaXMgYW4gb3BlcmFuZC4gIElmIG1uZW1vbmljcyBoYXZlIG9wZXJhbmRzCi0gICB3ZSBjYW4ndCBoYXNoIG9uIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIHNwYWNlLiAgKi8KLSNkZWZpbmUgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotLyogTWF4aW11bSBudW1iZXIgb2Ygb3BlcmFuZHMgYW55IGluc24gb3IgbWFjcm8taW5zbiBoYXMuICAqLwotI2RlZmluZSBDR0VOX01BWF9JTlNOX09QRVJBTkRTIDE2Ci0KLS8qIE1heGltdW0gbnVtYmVyIG9mIGZpZWxkcyBpbiBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIENHRU5fTUFYX0lGTVRfT1BFUkFORFMgNwotCi0vKiBFbnVtcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gb3AxIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX29wMSB7Ci0gIE9QMV8wLCBPUDFfMSwgT1AxXzIsIE9QMV8zCi0gLCBPUDFfNCwgT1AxXzUsIE9QMV82LCBPUDFfNwotICwgT1AxXzgsIE9QMV85LCBPUDFfQSwgT1AxX0IKLSAsIE9QMV9DLCBPUDFfRCwgT1AxX0UsIE9QMV9GCi19IElOU05fT1AxOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG9wMiBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDIgewotICBPUDJfMCwgT1AyXzEsIE9QMl8yLCBPUDJfMwotICwgT1AyXzQsIE9QMl81LCBPUDJfNiwgT1AyXzcKLSAsIE9QMl84LCBPUDJfOSwgT1AyX0EsIE9QMl9CCi0gLCBPUDJfQywgT1AyX0QsIE9QMl9FLCBPUDJfRgotfSBJTlNOX09QMjsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBvcDMgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fb3AzIHsKLSAgT1AzXzAsIE9QM18xLCBPUDNfMiwgT1AzXzMKLSAsIE9QM180LCBPUDNfNSwgT1AzXzYsIE9QM183Ci0gLCBPUDNfOCwgT1AzXzksIE9QM19BLCBPUDNfQgotICwgT1AzX0MsIE9QM19ELCBPUDNfRSwgT1AzX0YKLX0gSU5TTl9PUDM7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gb3A0IGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX29wNCB7Ci0gIE9QNF8wCi19IElOU05fT1A0OwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG9wNSBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDUgewotICBPUDVfMCwgT1A1XzEKLX0gSU5TTl9PUDU7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gY2MgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fY2MgewotICBDQ19SQSwgQ0NfTk8sIENDX0VRLCBDQ19ORQotICwgQ0NfQywgQ0NfTkMsIENDX04sIENDX1AKLSAsIENDX1YsIENDX05WLCBDQ19MVCwgQ0NfR0UKLSAsIENDX0xFLCBDQ19HVCwgQ0NfTFMsIENDX0hJCi19IElOU05fQ0M7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIC4gICovCi10eXBlZGVmIGVudW0gZ3JfbmFtZXMgewotICBIX0dSX1IwID0gMCwgSF9HUl9SMSA9IDEsIEhfR1JfUjIgPSAyLCBIX0dSX1IzID0gMwotICwgSF9HUl9SNCA9IDQsIEhfR1JfUjUgPSA1LCBIX0dSX1I2ID0gNiwgSF9HUl9SNyA9IDcKLSAsIEhfR1JfUjggPSA4LCBIX0dSX1I5ID0gOSwgSF9HUl9SMTAgPSAxMCwgSF9HUl9SMTEgPSAxMQotICwgSF9HUl9SMTIgPSAxMiwgSF9HUl9SMTMgPSAxMywgSF9HUl9SMTQgPSAxNCwgSF9HUl9SMTUgPSAxNQotICwgSF9HUl9BQyA9IDEzLCBIX0dSX0ZQID0gMTQsIEhfR1JfU1AgPSAxNQotfSBHUl9OQU1FUzsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgLiAgKi8KLXR5cGVkZWYgZW51bSBjcl9uYW1lcyB7Ci0gIEhfQ1JfQ1IwLCBIX0NSX0NSMSwgSF9DUl9DUjIsIEhfQ1JfQ1IzCi0gLCBIX0NSX0NSNCwgSF9DUl9DUjUsIEhfQ1JfQ1I2LCBIX0NSX0NSNwotICwgSF9DUl9DUjgsIEhfQ1JfQ1I5LCBIX0NSX0NSMTAsIEhfQ1JfQ1IxMQotICwgSF9DUl9DUjEyLCBIX0NSX0NSMTMsIEhfQ1JfQ1IxNCwgSF9DUl9DUjE1Ci19IENSX05BTUVTOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciAuICAqLwotdHlwZWRlZiBlbnVtIGRyX25hbWVzIHsKLSAgSF9EUl9UQlIsIEhfRFJfUlAsIEhfRFJfU1NQLCBIX0RSX1VTUAotICwgSF9EUl9NREgsIEhfRFJfTURMCi19IERSX05BTUVTOwotCi0vKiBBdHRyaWJ1dGVzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgbWFjaGluZSB0eXBlIHNlbGVjdGlvbi4gICovCi10eXBlZGVmIGVudW0gbWFjaF9hdHRyIHsKLSAgTUFDSF9CQVNFLCBNQUNIX0ZSMzAsIE1BQ0hfTUFYCi19IE1BQ0hfQVRUUjsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zdHJ1Y3Rpb24gc2V0IHNlbGVjdGlvbi4gICovCi10eXBlZGVmIGVudW0gaXNhX2F0dHIgewotICBJU0FfRlIzMCwgSVNBX01BWAotfSBJU0FfQVRUUjsKLQotLyogTnVtYmVyIG9mIGFyY2hpdGVjdHVyZSB2YXJpYW50cy4gICovCi0jZGVmaW5lIE1BWF9JU0FTICAxCi0jZGVmaW5lIE1BWF9NQUNIUyAoKGludCkgTUFDSF9NQVgpCi0KLS8qIElmaWVsZCBzdXBwb3J0LiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBjZ2VuX2lmbGQgZnIzMF9jZ2VuX2lmbGRfdGFibGVbXTsKLQotLyogSWZpZWxkIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9pZmxkIGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2lmbGRfYXR0ciB7Ci0gIENHRU5fSUZMRF9WSVJUVUFMLCBDR0VOX0lGTERfUENSRUxfQUREUiwgQ0dFTl9JRkxEX0FCU19BRERSLCBDR0VOX0lGTERfUkVTRVJWRUQKLSAsIENHRU5fSUZMRF9TSUdOX09QVCwgQ0dFTl9JRkxEX1NJR05FRCwgQ0dFTl9JRkxEX0VORF9CT09MUywgQ0dFTl9JRkxEX1NUQVJUX05CT09MUyA9IDMxCi0gLCBDR0VOX0lGTERfTUFDSCwgQ0dFTl9JRkxEX0VORF9OQk9PTFMKLX0gQ0dFTl9JRkxEX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2lmbGRfYXR0ci4gICovCi0jZGVmaW5lIENHRU5fSUZMRF9OQk9PTF9BVFRSUyAoQ0dFTl9JRkxEX0VORF9OQk9PTFMgLSBDR0VOX0lGTERfU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgZnIzMCBpZmllbGQgdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGlmaWVsZF90eXBlIHsKLSAgRlIzMF9GX05JTCwgRlIzMF9GX09QMSwgRlIzMF9GX09QMiwgRlIzMF9GX09QMwotICwgRlIzMF9GX09QNCwgRlIzMF9GX09QNSwgRlIzMF9GX0NDLCBGUjMwX0ZfQ0NDCi0gLCBGUjMwX0ZfUkosIEZSMzBfRl9SSSwgRlIzMF9GX1JTMSwgRlIzMF9GX1JTMgotICwgRlIzMF9GX1JKQywgRlIzMF9GX1JJQywgRlIzMF9GX0NSSiwgRlIzMF9GX0NSSQotICwgRlIzMF9GX1U0LCBGUjMwX0ZfVTRDLCBGUjMwX0ZfSTQsIEZSMzBfRl9NNAotICwgRlIzMF9GX1U4LCBGUjMwX0ZfSTgsIEZSMzBfRl9JMjBfNCwgRlIzMF9GX0kyMF8xNgotICwgRlIzMF9GX0kyMCwgRlIzMF9GX0kzMiwgRlIzMF9GX1VESVNQNiwgRlIzMF9GX0RJU1A4Ci0gLCBGUjMwX0ZfRElTUDksIEZSMzBfRl9ESVNQMTAsIEZSMzBfRl9TMTAsIEZSMzBfRl9VMTAKLSAsIEZSMzBfRl9SRUw5LCBGUjMwX0ZfRElSOCwgRlIzMF9GX0RJUjksIEZSMzBfRl9ESVIxMAotICwgRlIzMF9GX1JFTDEyLCBGUjMwX0ZfUkVHTElTVF9ISV9TVCwgRlIzMF9GX1JFR0xJU1RfTE9XX1NULCBGUjMwX0ZfUkVHTElTVF9ISV9MRAotICwgRlIzMF9GX1JFR0xJU1RfTE9XX0xELCBGUjMwX0ZfTUFYCi19IElGSUVMRF9UWVBFOwotCi0jZGVmaW5lIE1BWF9JRkxEICgoaW50KSBGUjMwX0ZfTUFYKQotCi0vKiBIYXJkd2FyZSBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faHcgYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faHdfYXR0ciB7Ci0gIENHRU5fSFdfVklSVFVBTCwgQ0dFTl9IV19DQUNIRV9BRERSLCBDR0VOX0hXX1BDLCBDR0VOX0hXX1BST0ZJTEUKLSAsIENHRU5fSFdfRU5EX0JPT0xTLCBDR0VOX0hXX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX0hXX01BQ0gsIENHRU5fSFdfRU5EX05CT09MUwotfSBDR0VOX0hXX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2h3X2F0dHIuICAqLwotI2RlZmluZSBDR0VOX0hXX05CT09MX0FUVFJTIChDR0VOX0hXX0VORF9OQk9PTFMgLSBDR0VOX0hXX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGZyMzAgaGFyZHdhcmUgdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faHdfdHlwZSB7Ci0gIEhXX0hfTUVNT1JZLCBIV19IX1NJTlQsIEhXX0hfVUlOVCwgSFdfSF9BRERSCi0gLCBIV19IX0lBRERSLCBIV19IX1BDLCBIV19IX0dSLCBIV19IX0NSCi0gLCBIV19IX0RSLCBIV19IX1BTLCBIV19IX1IxMywgSFdfSF9SMTQKLSAsIEhXX0hfUjE1LCBIV19IX05CSVQsIEhXX0hfWkJJVCwgSFdfSF9WQklUCi0gLCBIV19IX0NCSVQsIEhXX0hfSUJJVCwgSFdfSF9TQklULCBIV19IX1RCSVQKLSAsIEhXX0hfRDBCSVQsIEhXX0hfRDFCSVQsIEhXX0hfQ0NSLCBIV19IX1NDUgotICwgSFdfSF9JTE0sIEhXX01BWAotfSBDR0VOX0hXX1RZUEU7Ci0KLSNkZWZpbmUgTUFYX0hXICgoaW50KSBIV19NQVgpCi0KLS8qIE9wZXJhbmQgYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX29wZXJhbmQgYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5fb3BlcmFuZF9hdHRyIHsKLSAgQ0dFTl9PUEVSQU5EX1ZJUlRVQUwsIENHRU5fT1BFUkFORF9QQ1JFTF9BRERSLCBDR0VOX09QRVJBTkRfQUJTX0FERFIsIENHRU5fT1BFUkFORF9TSUdOX09QVAotICwgQ0dFTl9PUEVSQU5EX1NJR05FRCwgQ0dFTl9PUEVSQU5EX05FR0FUSVZFLCBDR0VOX09QRVJBTkRfUkVMQVgsIENHRU5fT1BFUkFORF9TRU1fT05MWQotICwgQ0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYLCBDR0VOX09QRVJBTkRfRU5EX0JPT0xTLCBDR0VOX09QRVJBTkRfU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fT1BFUkFORF9NQUNICi0gLCBDR0VOX09QRVJBTkRfRU5EX05CT09MUwotfSBDR0VOX09QRVJBTkRfQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5fb3BlcmFuZF9hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9PUEVSQU5EX05CT09MX0FUVFJTIChDR0VOX09QRVJBTkRfRU5EX05CT09MUyAtIENHRU5fT1BFUkFORF9TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBmcjMwIG9wZXJhbmQgdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5fb3BlcmFuZF90eXBlIHsKLSAgRlIzMF9PUEVSQU5EX1BDLCBGUjMwX09QRVJBTkRfUkksIEZSMzBfT1BFUkFORF9SSiwgRlIzMF9PUEVSQU5EX1JJQwotICwgRlIzMF9PUEVSQU5EX1JKQywgRlIzMF9PUEVSQU5EX0NSSSwgRlIzMF9PUEVSQU5EX0NSSiwgRlIzMF9PUEVSQU5EX1JTMQotICwgRlIzMF9PUEVSQU5EX1JTMiwgRlIzMF9PUEVSQU5EX1IxMywgRlIzMF9PUEVSQU5EX1IxNCwgRlIzMF9PUEVSQU5EX1IxNQotICwgRlIzMF9PUEVSQU5EX1BTLCBGUjMwX09QRVJBTkRfVTQsIEZSMzBfT1BFUkFORF9VNEMsIEZSMzBfT1BFUkFORF9VOAotICwgRlIzMF9PUEVSQU5EX0k4LCBGUjMwX09QRVJBTkRfVURJU1A2LCBGUjMwX09QRVJBTkRfRElTUDgsIEZSMzBfT1BFUkFORF9ESVNQOQotICwgRlIzMF9PUEVSQU5EX0RJU1AxMCwgRlIzMF9PUEVSQU5EX1MxMCwgRlIzMF9PUEVSQU5EX1UxMCwgRlIzMF9PUEVSQU5EX0kzMgotICwgRlIzMF9PUEVSQU5EX000LCBGUjMwX09QRVJBTkRfSTIwLCBGUjMwX09QRVJBTkRfRElSOCwgRlIzMF9PUEVSQU5EX0RJUjkKLSAsIEZSMzBfT1BFUkFORF9ESVIxMCwgRlIzMF9PUEVSQU5EX0xBQkVMOSwgRlIzMF9PUEVSQU5EX0xBQkVMMTIsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRAotICwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QsIEZSMzBfT1BFUkFORF9DQwotICwgRlIzMF9PUEVSQU5EX0NDQywgRlIzMF9PUEVSQU5EX05CSVQsIEZSMzBfT1BFUkFORF9WQklULCBGUjMwX09QRVJBTkRfWkJJVAotICwgRlIzMF9PUEVSQU5EX0NCSVQsIEZSMzBfT1BFUkFORF9JQklULCBGUjMwX09QRVJBTkRfU0JJVCwgRlIzMF9PUEVSQU5EX1RCSVQKLSAsIEZSMzBfT1BFUkFORF9EMEJJVCwgRlIzMF9PUEVSQU5EX0QxQklULCBGUjMwX09QRVJBTkRfQ0NSLCBGUjMwX09QRVJBTkRfU0NSCi0gLCBGUjMwX09QRVJBTkRfSUxNLCBGUjMwX09QRVJBTkRfTUFYCi19IENHRU5fT1BFUkFORF9UWVBFOwotCi0vKiBOdW1iZXIgb2Ygb3BlcmFuZHMgdHlwZXMuICAqLwotI2RlZmluZSBNQVhfT1BFUkFORFMgKChpbnQpIEZSMzBfT1BFUkFORF9NQVgpCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIG9wZXJhbmRzIHJlZmVyZW5jZWQgYnkgYW55IGluc24uICAqLwotI2RlZmluZSBNQVhfT1BFUkFORF9JTlNUQU5DRVMgOAotCi0vKiBJbnNuIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9pbnNuIGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2luc25fYXR0ciB7Ci0gIENHRU5fSU5TTl9BTElBUywgQ0dFTl9JTlNOX1ZJUlRVQUwsIENHRU5fSU5TTl9VTkNPTkRfQ1RJLCBDR0VOX0lOU05fQ09ORF9DVEkKLSAsIENHRU5fSU5TTl9TS0lQX0NUSSwgQ0dFTl9JTlNOX0RFTEFZX1NMT1QsIENHRU5fSU5TTl9SRUxBWEFCTEUsIENHRU5fSU5TTl9SRUxBWAotICwgQ0dFTl9JTlNOX05PX0RJUywgQ0dFTl9JTlNOX1BCQiwgQ0dFTl9JTlNOX05PVF9JTl9ERUxBWV9TTE9ULCBDR0VOX0lOU05fRU5EX0JPT0xTCi0gLCBDR0VOX0lOU05fU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fSU5TTl9NQUNILCBDR0VOX0lOU05fRU5EX05CT09MUwotfSBDR0VOX0lOU05fQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faW5zbl9hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX05CT09MX0FUVFJTIChDR0VOX0lOU05fRU5EX05CT09MUyAtIENHRU5fSU5TTl9TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBjZ2VuLmggdXNlcyB0aGluZ3Mgd2UganVzdCBkZWZpbmVkLiAgKi8KLSNpbmNsdWRlICJvcGNvZGUvY2dlbi5oIgotCi0vKiBBdHRyaWJ1dGVzLiAgKi8KLWV4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX2hhcmR3YXJlX2F0dHJfdGFibGVbXTsKLWV4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX2lmaWVsZF9hdHRyX3RhYmxlW107Ci1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9vcGVyYW5kX2F0dHJfdGFibGVbXTsKLWV4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX2luc25fYXR0cl90YWJsZVtdOwotCi0vKiBIYXJkd2FyZSBkZWNscy4gICovCi0KLWV4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzOwotZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXM7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lczsKLWV4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2hfcHM7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3IxMzsKLWV4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2hfcjE0OwotZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTU7Ci0KLQotCi0KLSNlbmRpZiAvKiBGUjMwX0NQVV9IICovCmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtZGlzLmMgYi9vcGNvZGVzL2ZyMzAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkN2MxOGMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9mcjMwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMwICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlciBpbnRlcmZhY2UgZm9yIHRhcmdldHMgdXNpbmcgQ0dFTi4gLSotIEMgLSotCi0gICBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0tIHRoZSByZXN1bHRhbnQgZmlsZSBpcyBtYWNoaW5lIGdlbmVyYXRlZCwgY2dlbi1kaXMuaW4gaXNuJ3QKLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qID8/PyBFdmVudHVhbGx5IG1vcmUgYW5kIG1vcmUgb2YgdGhpcyBzdHVmZiBjYW4gZ28gdG8gY3B1LWluZGVwZW5kZW50IGZpbGVzLgotICAgS2VlcCB0aGF0IGluIG1pbmQuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJmcjMwLWRlc2MuaCIKLSNpbmNsdWRlICJmcjMwLW9wYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBEZWZhdWx0IHRleHQgdG8gcHJpbnQgaWYgYW4gaW5zdHJ1Y3Rpb24gaXNuJ3QgcmVjb2duaXplZC4gICovCi0jZGVmaW5lIFVOS05PV05fSU5TTl9NU0cgXygiKnVua25vd24qIikKLQotc3RhdGljIHZvaWQgcHJpbnRfbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgbG9uZywgdW5zaWduZWQgaW50LCBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByaW50X2FkZHJlc3MKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBiZmRfdm1hLCB1bnNpZ25lZCBpbnQsIGJmZF92bWEsIGludCkpOwotc3RhdGljIHZvaWQgcHJpbnRfa2V5d29yZAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIENHRU5fS0VZV09SRCAqLCBsb25nLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByaW50X2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgY29uc3QgQ0dFTl9JTlNOICosIENHRU5fRklFTERTICosCi0JICAgICAgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgaW50IHByaW50X2luc24gUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgYmZkX3ZtYSwKLQkJCSAgICAgICBkaXNhc3NlbWJsZV9pbmZvICosIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgaW50IGRlZmF1bHRfcHJpbnRfaW5zbgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQwKLS8qIC0tIGRpc2Fzc2VtYmxlciByb3V0aW5lcyBpbnNlcnRlZCBoZXJlICovCi0KLS8qIC0tIGRpcy5jICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9yZWdpc3Rlcl9saXN0IChkaXNfaW5mbywgdmFsdWUsIG9mZnNldCwgbG9hZF9zdG9yZSkKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgaW50IGxvYWRfc3RvcmU7IC8qIDAgPT0gbG9hZCwgMSA9PSBzdG9yZSAqLwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gZGlzX2luZm87Ci0gIGludCBtYXNrOwotICBpbnQgaW5kZXggPSAwOwotICBjaGFyKiBjb21tYSA9ICIiOwotCi0gIGlmIChsb2FkX3N0b3JlKQotICAgIG1hc2sgPSAweDgwOwotICBlbHNlCi0gICAgbWFzayA9IDE7Ci0KLSAgaWYgKHZhbHVlICYgbWFzaykKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInIlaSIsIGluZGV4ICsgb2Zmc2V0KTsKLSAgICAgIGNvbW1hID0gIiwiOwotICAgIH0KLSAgICAKLSAgZm9yIChpbmRleCA9IDE7IGluZGV4IDw9IDc7ICsraW5kZXgpCi0gICAgewotICAgICAgaWYgKGxvYWRfc3RvcmUpCi0JbWFzayA+Pj0gMTsKLSAgICAgIGVsc2UKLQltYXNrIDw8PSAxOwotCi0gICAgICBpZiAodmFsdWUgJiBtYXNrKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNyJWkiLCBjb21tYSwgaW5kZXggKyBvZmZzZXQpOwotCSAgY29tbWEgPSAiLCI7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2hpX3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcHJpbnRfcmVnaXN0ZXJfbGlzdCAoZGlzX2luZm8sIHZhbHVlLCA4LCAwLypsb2FkKi8pOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfbG93X3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcHJpbnRfcmVnaXN0ZXJfbGlzdCAoZGlzX2luZm8sIHZhbHVlLCAwLCAwLypsb2FkKi8pOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfaGlfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBwcmludF9yZWdpc3Rlcl9saXN0IChkaXNfaW5mbywgdmFsdWUsIDgsIDEvKnN0b3JlKi8pOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfbG93X3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcHJpbnRfcmVnaXN0ZXJfbGlzdCAoZGlzX2luZm8sIHZhbHVlLCAwLCAxLypzdG9yZSovKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X200IChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci19Ci0vKiAtLSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBwcmludGluZyBvcGVyYW5kcy4KLSAgIFhJTkZPIGlzIGEgYHZvaWQgKicgYW5kIG5vdCBhIGBkaXNhc3NlbWJsZV9pbmZvIConIHRvIG5vdCBwdXQgYSByZXF1aXJlbWVudAotICAgb2YgZGlzLWFzbS5oIG9uIGNnZW4uaC4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucwotICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKLSAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KLSAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCi0gICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKLSAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwcmludF9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0Ci0gICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHByaW50X2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgotICAgdGhlIGhhbmRsZXJzLgotKi8KLQotdm9pZAotZnIzMF9jZ2VuX3ByaW50X29wZXJhbmQgKGNkLCBvcGluZGV4LCB4aW5mbywgZmllbGRzLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIFBUUiB4aW5mbzsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgdm9pZCBjb25zdCAqYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIHhpbmZvOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lcywgZmllbGRzLT5mX0NSaSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzLCBmaWVsZHMtPmZfQ1JqLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTMsIGZpZWxkcy0+Zl9uaWwsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNCwgZmllbGRzLT5mX25pbCwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2hfcjE1LCBmaWVsZHMtPmZfbmlsLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX1JpLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9SaWMsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfUmosIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX1JqYywgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzLCBmaWVsZHMtPmZfUnMxLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXMsIGZpZWxkcy0+Zl9SczIsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2NjLCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfY2NjLCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXIxMCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXI4LCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2RpcjksIDAsIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwMTAsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwOCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCl8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2Rpc3A5LCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2kyMCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKXwoMTw8Q0dFTl9PUEVSQU5EX1ZJUlRVQUwpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfaTMyLCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpfCgxPDxDR0VOX09QRVJBTkRfU0lHTl9PUFQpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9pOCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfcmVsMTIsIDB8KDE8PENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWw5LCAwfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgcHJpbnRfbTQgKGNkLCBpbmZvLCBmaWVsZHMtPmZfbTQsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3BzLCBmaWVsZHMtPmZfbmlsLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgotICAgICAgcHJpbnRfaGlfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkLCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgcHJpbnRfaGlfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0LCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKLSAgICAgIHByaW50X2xvd19yZWdpc3Rlcl9saXN0X2xkIChjZCwgaW5mbywgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkLCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIHByaW50X2xvd19yZWdpc3Rlcl9saXN0X3N0IChjZCwgaW5mbywgZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0LCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfczEwLCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3UxMCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdTQsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91NGMsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3U4LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdWRpc3A2LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcHJpbnRpbmcgaW5zbi5cbiIpLAotCSAgICAgICBvcGluZGV4KTsKLSAgICBhYm9ydCAoKTsKLSAgfQotfQotCi1jZ2VuX3ByaW50X2ZuICogY29uc3QgZnIzMF9jZ2VuX3ByaW50X2hhbmRsZXJzW10gPSAKLXsKLSAgcHJpbnRfaW5zbl9ub3JtYWwsCi19OwotCi0KLXZvaWQKLWZyMzBfY2dlbl9pbml0X2RpcyAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGZyMzBfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpOwotICBmcjMwX2NnZW5faW5pdF9pYmxkX3RhYmxlIChjZCk7Ci0gIGNkLT5wcmludF9oYW5kbGVycyA9ICYgZnIzMF9jZ2VuX3ByaW50X2hhbmRsZXJzWzBdOwotICBjZC0+cHJpbnRfb3BlcmFuZCA9IGZyMzBfY2dlbl9wcmludF9vcGVyYW5kOwotfQotCi0MCi0vKiBEZWZhdWx0IHByaW50IGhhbmRsZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfbm9ybWFsIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLQotI2lmZGVmIENHRU5fUFJJTlRfTk9STUFMCi0gIENHRU5fUFJJTlRfTk9STUFMIChjZCwgaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKTsKLSNlbmRpZgotCi0gIC8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBhdHRyaWJ1dGVzLiAgKi8KLSAgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NFTV9PTkxZKSkKLSAgICA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0lHTkVEKSkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLCB2YWx1ZSk7Ci19Ci0KLS8qIERlZmF1bHQgYWRkcmVzcyBoYW5kbGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FkZHJlc3MgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotCi0jaWZkZWYgQ0dFTl9QUklOVF9BRERSRVNTCi0gIENHRU5fUFJJTlRfQUREUkVTUyAoY2QsIGluZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgYXR0cmlidXRlcy4gICovCi0gIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TRU1fT05MWSkpCi0gICAgOyAvKiBub3RoaW5nIHRvIGRvICovCi0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpKQotICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9BQlNfQUREUikpCi0gICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NJR05FRCkpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCAobG9uZykgdmFsdWUpOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCVseCIsIChsb25nKSB2YWx1ZSk7Ci19Ci0KLS8qIEtleXdvcmQgcHJpbnQgaGFuZGxlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9rZXl3b3JkIChjZCwgZGlzX2luZm8sIGtleXdvcmRfdGFibGUsIHZhbHVlLCBhdHRycykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBDR0VOX0tFWVdPUkQgKmtleXdvcmRfdGFibGU7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotCi0gIGtlID0gY2dlbl9rZXl3b3JkX2xvb2t1cF92YWx1ZSAoa2V5d29yZF90YWJsZSwgdmFsdWUpOwotICBpZiAoa2UgIT0gTlVMTCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwga2UtPm5hbWUpOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI/Pz8iKTsKLX0KLQwKLS8qIERlZmF1bHQgaW5zbiBwcmludGVyLgotCi0gICBESVNfSU5GTyBpcyBkZWZpbmVkIGFzIGBQVFInIHNvIHRoZSBkaXNhc3NlbWJsZXIgbmVlZG4ndCBrbm93IGFueXRoaW5nCi0gICBhYm91dCBkaXNhc3NlbWJsZV9pbmZvLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2luc25fbm9ybWFsIChjZCwgZGlzX2luZm8sIGluc24sIGZpZWxkcywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzeW47Ci0KLSAgQ0dFTl9JTklUX1BSSU5UIChjZCk7Ci0KLSAgZm9yIChzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7ICpzeW47ICsrc3luKQotICAgIHsKLSAgICAgIGlmIChDR0VOX1NZTlRBWF9NTkVNT05JQ19QICgqc3luKSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqc3luKSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgQ0dFTl9TWU5UQVhfQ0hBUiAoKnN5bikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIGFuIG9wZXJhbmQuICAqLwotICAgICAgZnIzMF9jZ2VuX3ByaW50X29wZXJhbmQgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksIGluZm8sCi0JCQkJIGZpZWxkcywgQ0dFTl9JTlNOX0FUVFJTIChpbnNuKSwgcGMsIGxlbmd0aCk7Ci0gICAgfQotfQotDAotLyogVXRpbGl0eSB0byBwcmludCBhbiBpbnNuLgotICAgQlVGIGlzIHRoZSBiYXNlIHBhcnQgb2YgdGhlIGluc24sIHRhcmdldCBieXRlIG9yZGVyLCBCVUZMRU4gYnl0ZXMgbG9uZy4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIHNpemUgb2YgdGhlIGluc24gaW4gYnl0ZXMgb3IgemVybyBmb3IgYW4gdW5rbm93biBpbnNuCi0gICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnMgZmV0Y2hpbmcgZGF0YSAobWVtb3J5X2Vycm9yX2Z1bmMgd2lsbCBoYXZlCi0gICBiZWVuIGNhbGxlZCkuICAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgYnVmbGVuKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBjaGFyICpidWY7Ci0gICAgIGludCBidWZsZW47Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbl92YWx1ZTsKLSAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmluc25fbGlzdDsKLSAgQ0dFTl9FWFRSQUNUX0lORk8gZXhfaW5mbzsKLQotICBleF9pbmZvLmRpc19pbmZvID0gaW5mbzsKLSAgZXhfaW5mby52YWxpZCA9ICgxIDw8IChjZC0+YmFzZV9pbnNuX2JpdHNpemUgLyA4KSkgLSAxOwotICBleF9pbmZvLmluc25fYnl0ZXMgPSBidWY7Ci0KLSAgc3dpdGNoIChidWZsZW4pCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGluc25fdmFsdWUgPSBidWZbMF07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpbnNuX3ZhbHVlID0gaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHID8gYmZkX2dldGIxNiAoYnVmKSA6IGJmZF9nZXRsMTYgKGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBpbnNuX3ZhbHVlID0gaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHID8gYmZkX2dldGIzMiAoYnVmKSA6IGJmZF9nZXRsMzIgKGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBoYXNoIGxpc3RzLgotICAgICBQaWNrIHRoZSBmaXJzdCBvbmUgYW5kIGtlZXAgdHJ5aW5nIHVudGlsIHdlIGZpbmQgdGhlIHJpZ2h0IG9uZS4gICovCi0KLSAgaW5zbl9saXN0ID0gQ0dFTl9ESVNfTE9PS1VQX0lOU04gKGNkLCBidWYsIGluc25fdmFsdWUpOwotICB3aGlsZSAoaW5zbl9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gaW5zbl9saXN0LT5pbnNuOwotICAgICAgQ0dFTl9GSUVMRFMgZmllbGRzOwotICAgICAgaW50IGxlbmd0aDsKLQotI2lmIDAgLyogbm90IG5lZWRlZCBhcyBpbnNuIHNob3VsZG4ndCBiZSBpbiBoYXNoIGxpc3RzIGlmIG5vdCBzdXBwb3J0ZWQgKi8KLSAgICAgIC8qIFN1cHBvcnRlZCBieSB0aGlzIGNwdT8gICovCi0gICAgICBpZiAoISBmcjMwX2NnZW5faW5zbl9zdXBwb3J0ZWQgKGNkLCBpbnNuKSkKLQljb250aW51ZTsKLSNlbmRpZgotCi0gICAgICAvKiBCYXNpYyBiaXQgbWFzayBtdXN0IGJlIGNvcnJlY3QuICAqLwotICAgICAgLyogPz8/IE1heSB3aXNoIHRvIGFsbG93IHRhcmdldCB0byBkZWZlciB0aGlzIGNoZWNrIHVudGlsIHRoZSBleHRyYWN0Ci0JIGhhbmRsZXIuICAqLwotICAgICAgaWYgKChpbnNuX3ZhbHVlICYgQ0dFTl9JTlNOX0JBU0VfTUFTSyAoaW5zbikpCi0JICA9PSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbikpCi0JewotCSAgLyogUHJpbnRpbmcgaXMgaGFuZGxlZCBpbiB0d28gcGFzc2VzLiAgVGhlIGZpcnN0IHBhc3MgcGFyc2VzIHRoZQotCSAgICAgbWFjaGluZSBpbnNuIGFuZCBleHRyYWN0cyB0aGUgZmllbGRzLiAgVGhlIHNlY29uZCBwYXNzIHByaW50cwotCSAgICAgdGhlbS4gICovCi0KLQkgIGxlbmd0aCA9IENHRU5fRVhUUkFDVF9GTiAoY2QsIGluc24pCi0JICAgIChjZCwgaW5zbiwgJmV4X2luZm8sIGluc25fdmFsdWUsICZmaWVsZHMsIHBjKTsKLQkgIC8qIGxlbmd0aCA8IDAgLT4gZXJyb3IgKi8KLQkgIGlmIChsZW5ndGggPCAwKQotCSAgICByZXR1cm4gbGVuZ3RoOwotCSAgaWYgKGxlbmd0aCA+IDApCi0JICAgIHsKLQkgICAgICBDR0VOX1BSSU5UX0ZOIChjZCwgaW5zbikgKGNkLCBpbmZvLCBpbnNuLCAmZmllbGRzLCBwYywgbGVuZ3RoKTsKLQkgICAgICAvKiBsZW5ndGggaXMgaW4gYml0cywgcmVzdWx0IGlzIGluIGJ5dGVzICovCi0JICAgICAgcmV0dXJuIGxlbmd0aCAvIDg7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluc25fbGlzdCA9IENHRU5fRElTX05FWFRfSU5TTiAoaW5zbl9saXN0KTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIERlZmF1bHQgdmFsdWUgZm9yIENHRU5fUFJJTlRfSU5TTi4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIHNpemUgb2YgdGhlIGluc24gaW4gYnl0ZXMgb3IgemVybyBmb3IgYW4gdW5rbm93biBpbnNuCi0gICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cmVkIGZldGNoaW5nIGJ5dGVzLiAgKi8KLQotI2lmbmRlZiBDR0VOX1BSSU5UX0lOU04KLSNkZWZpbmUgQ0dFTl9QUklOVF9JTlNOIGRlZmF1bHRfcHJpbnRfaW5zbgotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLWRlZmF1bHRfcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBjaGFyIGJ1ZltDR0VOX01BWF9JTlNOX1NJWkVdOwotICBpbnQgc3RhdHVzOwotCi0gIC8qIFJlYWQgdGhlIGJhc2UgcGFydCBvZiB0aGUgaW5zbi4gICovCi0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocGMsIGJ1ZiwgY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiBwcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCk7Ci19Ci0KLS8qIE1haW4gZW50cnkgcG9pbnQuCi0gICBQcmludCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBQQyBvbiBJTkZPLT5TVFJFQU0uCi0gICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uIChpbiBieXRlcykuICAqLwotCi1pbnQKLXByaW50X2luc25fZnIzMCAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHN0YXRpYyBDR0VOX0NQVV9ERVNDIGNkID0gMDsKLSAgc3RhdGljIHByZXZfaXNhLHByZXZfbWFjaCxwcmV2X2VuZGlhbjsKLSAgaW50IGxlbmd0aDsKLSAgaW50IGlzYSxtYWNoOwotICBpbnQgZW5kaWFuID0gKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRwotCQk/IENHRU5fRU5ESUFOX0JJRwotCQk6IENHRU5fRU5ESUFOX0xJVFRMRSk7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotCi0gIC8qID8/PyBnZGIgd2lsbCBzZXQgbWFjaCBidXQgbGVhdmUgdGhlIGFyY2hpdGVjdHVyZSBhcyAidW5rbm93biIgKi8KLSNpZm5kZWYgQ0dFTl9CRkRfQVJDSAotI2RlZmluZSBDR0VOX0JGRF9BUkNIIGJmZF9hcmNoX2ZyMzAKLSNlbmRpZgotICBhcmNoID0gaW5mby0+YXJjaDsKLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICBhcmNoID0gQ0dFTl9CRkRfQVJDSDsKLSAgICAgIAotICAvKiBUaGVyZSdzIG5vIHN0YW5kYXJkIHdheSB0byBjb21wdXRlIHRoZSBpc2EgbnVtYmVyIChlLmcuIGZvciBhcm0gdGh1bWIpCi0gICAgIHNvIHdlIGxlYXZlIGl0IHRvIHRoZSB0YXJnZXQuICAqLwotI2lmZGVmIENHRU5fQ09NUFVURV9JU0EKLSAgaXNhID0gQ0dFTl9DT01QVVRFX0lTQSAoaW5mbyk7Ci0jZWxzZQotICBpc2EgPSAwOwotI2VuZGlmCi0KLSAgbWFjaCA9IGluZm8tPm1hY2g7Ci0KLSAgLyogSWYgd2UndmUgc3dpdGNoZWQgY3B1J3MsIGNsb3NlIHRoZSBjdXJyZW50IHRhYmxlIGFuZCBvcGVuIGEgbmV3IG9uZS4gICovCi0gIGlmIChjZAotICAgICAgJiYgKGlzYSAhPSBwcmV2X2lzYQotCSAgfHwgbWFjaCAhPSBwcmV2X21hY2gKLQkgIHx8IGVuZGlhbiAhPSBwcmV2X2VuZGlhbikpCi0gICAgewotICAgICAgZnIzMF9jZ2VuX2NwdV9jbG9zZSAoY2QpOwotICAgICAgY2QgPSAwOwotICAgIH0KLQotICAvKiBJZiB3ZSBoYXZlbid0IGluaXRpYWxpemVkIHlldCwgaW5pdGlhbGl6ZSB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSAgaWYgKCEgY2QpCi0gICAgewotICAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmNoX3R5cGUgPSBiZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2gpOwotICAgICAgY29uc3QgY2hhciAqbWFjaF9uYW1lOwotCi0gICAgICBpZiAoIWFyY2hfdHlwZSkKLQlhYm9ydCAoKTsKLSAgICAgIG1hY2hfbmFtZSA9IGFyY2hfdHlwZS0+cHJpbnRhYmxlX25hbWU7Ci0KLSAgICAgIHByZXZfaXNhID0gaXNhOwotICAgICAgcHJldl9tYWNoID0gbWFjaDsKLSAgICAgIHByZXZfZW5kaWFuID0gZW5kaWFuOwotICAgICAgY2QgPSBmcjMwX2NnZW5fY3B1X29wZW4gKENHRU5fQ1BVX09QRU5fSVNBUywgcHJldl9pc2EsCi0JCQkJIENHRU5fQ1BVX09QRU5fQkZETUFDSCwgbWFjaF9uYW1lLAotCQkJCSBDR0VOX0NQVV9PUEVOX0VORElBTiwgcHJldl9lbmRpYW4sCi0JCQkJIENHRU5fQ1BVX09QRU5fRU5EKTsKLSAgICAgIGlmICghY2QpCi0JYWJvcnQgKCk7Ci0gICAgICBmcjMwX2NnZW5faW5pdF9kaXMgKGNkKTsKLSAgICB9Ci0KLSAgLyogV2UgdHJ5IHRvIGhhdmUgYXMgbXVjaCBjb21tb24gY29kZSBhcyBwb3NzaWJsZS4KLSAgICAgQnV0IGF0IHRoaXMgcG9pbnQgc29tZSB0YXJnZXRzIG5lZWQgdG8gdGFrZSBvdmVyLiAgKi8KLSAgLyogPz8/IFNvbWUgdGFyZ2V0cyBtYXkgbmVlZCBhIGhvb2sgZWxzZXdoZXJlLiAgVHJ5IHRvIGF2b2lkIHRoaXMsCi0gICAgIGJ1dCBpZiBub3QgcG9zc2libGUgdHJ5IHRvIG1vdmUgdGhpcyBob29rIGVsc2V3aGVyZSByYXRoZXIgdGhhbgotICAgICBoYXZlIHR3byBob29rcy4gICovCi0gIGxlbmd0aCA9IENHRU5fUFJJTlRfSU5TTiAoY2QsIHBjLCBpbmZvKTsKLSAgaWYgKGxlbmd0aCA+IDApCi0gICAgcmV0dXJuIGxlbmd0aDsKLSAgaWYgKGxlbmd0aCA8IDApCi0gICAgcmV0dXJuIC0xOwotCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBVTktOT1dOX0lOU05fTVNHKTsKLSAgcmV0dXJuIGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSAvIDg7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtaWJsZC5jIGIvb3Bjb2Rlcy9mcjMwLWlibGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg2NjEzZC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2ZyMzAtaWJsZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUwNiArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBidWlsZGluZy9leHRyYWN0aW9uIHN1cHBvcnQgZm9yIGZyMzAuIC0qLSBDIC0qLQotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4taWJsZC5pbiBpc24ndAotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogPz8/IEV2ZW50dWFsbHkgbW9yZSBhbmQgbW9yZSBvZiB0aGlzIHN0dWZmIGNhbiBnbyB0byBjcHUtaW5kZXBlbmRlbnQgZmlsZXMuCi0gICBLZWVwIHRoYXQgaW4gbWluZC4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAiZnIzMC1kZXNjLmgiCi0jaW5jbHVkZSAiZnIzMC1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotI3VuZGVmIG1pbgotI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotI3VuZGVmIG1heAotI2RlZmluZSBtYXgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQotCi0vKiBVc2VkIGJ5IHRoZSBpZmllbGQgcnR4IGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgRkxEKGYpIChmaWVsZHMtPmYpCi0KLXN0YXRpYyBjb25zdCBjaGFyICogaW5zZXJ0X25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBsb25nLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIENHRU5fSU5TTl9CWVRFU19QVFIpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogaW5zZXJ0X2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqLAotCSAgICAgIENHRU5fRklFTERTICosIENHRU5fSU5TTl9CWVRFU19QVFIsIGJmZF92bWEpKTsKLQotc3RhdGljIGludCBleHRyYWN0X25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBDR0VOX0VYVFJBQ1RfSU5GTyAqLCBDR0VOX0lOU05fSU5ULAotCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKLQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgbG9uZyAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfaW5zbl9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICosIENHRU5fRVhUUkFDVF9JTkZPICosCi0JICAgICAgQ0dFTl9JTlNOX0lOVCwgQ0dFTl9GSUVMRFMgKiwgYmZkX3ZtYSkpOwotDAotLyogT3BlcmFuZCBpbnNlcnRpb24uICAqLwotCi0jaWYgISBDR0VOX0lOVF9JTlNOX1AKLQotLyogU3Vicm91dGluZSBvZiBpbnNlcnRfbm9ybWFsLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIHZvaWQKLWluc2VydF8xIChjZCwgdmFsdWUsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICBpbnQgc3RhcnQsbGVuZ3RoLHdvcmRfbGVuZ3RoOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZwOwotewotICB1bnNpZ25lZCBsb25nIHgsbWFzazsKLSAgaW50IHNoaWZ0OwotICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9JTlNOX0VORElBTiAoY2QpID09IENHRU5fRU5ESUFOX0JJRzsKLQotICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICB4ID0gKmJ1ZnA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjE2IChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgLyogPz8/IFRoaXMgbWF5IG5lZWQgcmV3b3JraW5nIGFzIHRoZXNlIGNhc2VzIGRvbid0IG5lY2Vzc2FyaWx5Ci0JIHdhbnQgdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBsYXN0IHR3byBieXRlcyBoYW5kbGVkIGxpa2UgdGhpcy4gICovCi0gICAgICBpZiAoYmlnX3ApCi0JeCA9IChidWZwWzBdIDw8IDE2KSB8IGJmZF9nZXRiMTYgKGJ1ZnAgKyAxKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCkgfCAoYnVmcFsyXSA8PCAxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjMyIChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwzMiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLwotICBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLSAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0gICAgc2hpZnQgPSAoc3RhcnQgKyAxKSAtIGxlbmd0aDsKLSAgZWxzZQotICAgIHNoaWZ0ID0gKHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKSk7Ci0gIHggPSAoeCAmIH4obWFzayA8PCBzaGlmdCkpIHwgKCh2YWx1ZSAmIG1hc2spIDw8IHNoaWZ0KTsKLQotICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICAqYnVmcCA9IHg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGJpZ19wKQotCWJmZF9wdXRiMTYgKHgsIGJ1ZnApOwotICAgICAgZWxzZQotCWJmZF9wdXRsMTYgKHgsIGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIC8qID8/PyBUaGlzIG1heSBuZWVkIHJld29ya2luZyBhcyB0aGVzZSBjYXNlcyBkb24ndCBuZWNlc3NhcmlseQotCSB3YW50IHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgbGFzdCB0d28gYnl0ZXMgaGFuZGxlZCBsaWtlIHRoaXMuICAqLwotICAgICAgaWYgKGJpZ19wKQotCXsKLQkgIGJ1ZnBbMF0gPSB4ID4+IDE2OwotCSAgYmZkX3B1dGIxNiAoeCwgYnVmcCArIDEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0bDE2ICh4LCBidWZwKTsKLQkgIGJ1ZnBbMl0gPSB4ID4+IDE2OwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoYmlnX3ApCi0JYmZkX3B1dGIzMiAoeCwgYnVmcCk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwzMiAoeCwgYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLS8qIERlZmF1bHQgaW5zZXJ0aW9uIHJvdXRpbmUuCi0KLSAgIEFUVFJTIGlzIGEgbWFzayBvZiB0aGUgYm9vbGVhbiBhdHRyaWJ1dGVzLgotICAgV09SRF9PRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBiaXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KLSAgIFdPUkRfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIHdvcmQgaW4gYml0cyBpbiB3aGljaCB0aGUgdmFsdWUgcmVzaWRlcy4KLSAgIFNUQVJUIGlzIHRoZSBzdGFydGluZyBiaXQgbnVtYmVyIGluIHRoZSB3b3JkLCBhcmNoaXRlY3R1cmUgb3JpZ2luLgotICAgTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgVkFMVUUgaW4gYml0cy4KLSAgIFRPVEFMX0xFTkdUSCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMuCi0KLSAgIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIHN1Y2Nlc3MuICAqLwotCi0vKiA/Pz8gVGhpcyBkdXBsaWNhdGVzIGZ1bmN0aW9uYWxpdHkgd2l0aCBiZmQncyBob3d0byB0YWJsZSBhbmQKLSAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICAqLwotLyogPz8/IFRoaXMgZG9lc24ndCBoYW5kbGUgYmZkX3ZtYSdzLiAgQ3JlYXRlIGFub3RoZXIgZnVuY3Rpb24gd2hlbgotICAgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCBhdHRycywgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLAotCSAgICAgICB0b3RhbF9sZW5ndGgsIGJ1ZmZlcikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICB1bnNpZ25lZCBpbnQgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCB0b3RhbF9sZW5ndGg7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotewotICBzdGF0aWMgY2hhciBlcnJidWZbMTAwXTsKLSAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotICAvKiBJZiBMRU5HVEggaXMgemVybywgdGhpcyBvcGVyYW5kIGRvZXNuJ3QgY29udHJpYnV0ZSB0byB0aGUgdmFsdWUuICAqLwotICBpZiAobGVuZ3RoID09IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKENHRU5fSU5UX0lOU05fUAotICAgICAgJiYgd29yZF9vZmZzZXQgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAod29yZF9sZW5ndGggPiAzMikKLSAgICBhYm9ydCAoKTsKLQotICAvKiBGb3IgYXJjaGl0ZWN0dXJlcyB3aXRoIGluc25zIHNtYWxsZXIgdGhhbiB0aGUgYmFzZS1pbnNuLWJpdHNpemUsCi0gICAgIHdvcmRfbGVuZ3RoIG1heSBiZSB0b28gYmlnLiAgKi8KLSAgaWYgKGNkLT5taW5faW5zbl9iaXRzaXplIDwgY2QtPmJhc2VfaW5zbl9iaXRzaXplKQotICAgIHsKLSAgICAgIGlmICh3b3JkX29mZnNldCA9PSAwCi0JICAmJiB3b3JkX2xlbmd0aCA+IHRvdGFsX2xlbmd0aCkKLQl3b3JkX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKLSAgICB9Ci0KLSAgLyogRW5zdXJlIFZBTFVFIHdpbGwgZml0LiAgKi8KLSAgaWYgKCEgQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX0lGTERfU0lHTkVEKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIG1heHZhbCA9IG1hc2s7Ci0gICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIHZhbHVlID4gbWF4dmFsKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBzcHJpbnRmIChlcnJidWYsCi0JCSAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbHUgbm90IGJldHdlZW4gMCBhbmQgJWx1KSIpLAotCQkgICB2YWx1ZSwgbWF4dmFsKTsKLQkgIHJldHVybiBlcnJidWY7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgbWludmFsID0gLSAoMUwgPDwgKGxlbmd0aCAtIDEpKTsKLSAgICAgIGxvbmcgbWF4dmFsID0gKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxOwotICAgICAgaWYgKHZhbHVlIDwgbWludmFsIHx8IHZhbHVlID4gbWF4dmFsKQotCXsKLQkgIHNwcmludGYKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgKGVycmJ1ZiwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsZCBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKSwKLQkgICAgIHZhbHVlLCBtaW52YWwsIG1heHZhbCk7Ci0JICByZXR1cm4gZXJyYnVmOwotCX0KLSAgICB9Ci0KLSNpZiBDR0VOX0lOVF9JTlNOX1AKLQotICB7Ci0gICAgaW50IHNoaWZ0OwotCi0gICAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0gICAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOwotICAgIGVsc2UKLSAgICAgIHNoaWZ0ID0gd29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpOwotICAgICpidWZmZXIgPSAoKmJ1ZmZlciAmIH4obWFzayA8PCBzaGlmdCkpIHwgKCh2YWx1ZSAmIG1hc2spIDw8IHNoaWZ0KTsKLSAgfQotCi0jZWxzZSAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyICpidWZwID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyICsgd29yZF9vZmZzZXQgLyA4OwotCi0gICAgaW5zZXJ0XzEgKGNkLCB2YWx1ZSwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnApOwotICB9Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBEZWZhdWx0IGluc24gYnVpbGRlciAoaW5zZXJ0IGhhbmRsZXIpLgotICAgVGhlIGluc3RydWN0aW9uIGlzIHJlY29yZGVkIGluIENHRU5fSU5UX0lOU05fUCBieXRlIG9yZGVyCi0gICAobWVhbmluZyB0aGF0IGlmIENHRU5fSU5UX0lOU05fUCBCVUZGRVIgaXMgYW4gaW50ICogYW5kIHRodXMgdGhlIHZhbHVlIGlzCi0gICByZWNvcmRlZCBpbiBob3N0IGJ5dGUgb3JkZXIsIG90aGVyd2lzZSBCVUZGRVIgaXMgYW4gYXJyYXkgb2YgYnl0ZXMgYW5kIHRoZQotICAgdmFsdWUgaXMgcmVjb3JkZWQgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIpLgotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgc3VjY2Vzcy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWluc2VydF9pbnNuX25vcm1hbCAoY2QsIGluc24sIGZpZWxkcywgYnVmZmVyLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotICAgICBiZmRfdm1hIHBjOwotewotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzeW47Ci0KLSAgQ0dFTl9JTklUX0lOU0VSVCAoY2QpOwotICB2YWx1ZSA9IENHRU5fSU5TTl9CQVNFX1ZBTFVFIChpbnNuKTsKLQotICAvKiBJZiB3ZSdyZSByZWNvcmRpbmcgaW5zbnMgYXMgbnVtYmVycyAocmF0aGVyIHRoYW4gYSBzdHJpbmcgb2YgYnl0ZXMpLAotICAgICB0YXJnZXQgYnl0ZSBvcmRlciBoYW5kbGluZyBpcyBkZWZlcnJlZCB1bnRpbCBsYXRlci4gICovCi0KLSNpZiBDR0VOX0lOVF9JTlNOX1AKLQotICAqYnVmZmVyID0gdmFsdWU7Ci0KLSNlbHNlCi0KLSAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZmZlciwgbWluIChjZC0+YmFzZV9pbnNuX2JpdHNpemUsCi0JCQkJCUNHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykpLAotCQkgICAgICAgdmFsdWUpOwotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICAvKiA/Pz8gSXQgd291bGQgYmUgYmV0dGVyIHRvIHNjYW4gdGhlIGZvcm1hdCdzIGZpZWxkcy4KLSAgICAgU3RpbGwgbmVlZCB0byBiZSBhYmxlIHRvIGluc2VydCBhIHZhbHVlIGJhc2VkIG9uIHRoZSBvcGVyYW5kIHRob3VnaDsKLSAgICAgZS5nLiBzdG9yaW5nIGEgYnJhbmNoIGRpc3BsYWNlbWVudCB0aGF0IGdvdCByZXNvbHZlZCBsYXRlci4KLSAgICAgTmVlZHMgbW9yZSB0aG91Z2h0IGZpcnN0LiAgKi8KLQotICBmb3IgKHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsgKiBzeW4gIT0gJ1wwJzsgKysgc3luKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLQotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKiBzeW4pKQotCWNvbnRpbnVlOwotCi0gICAgICBlcnJtc2cgPSAoKiBjZC0+aW5zZXJ0X29wZXJhbmQpIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAotCQkJCSAgICAgICBmaWVsZHMsIGJ1ZmZlciwgcGMpOwotICAgICAgaWYgKGVycm1zZykKLQlyZXR1cm4gZXJybXNnOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQwKLS8qIE9wZXJhbmQgZXh0cmFjdGlvbi4gICovCi0KLSNpZiAhIENHRU5fSU5UX0lOU05fUAotCi0vKiBTdWJyb3V0aW5lIG9mIGV4dHJhY3Rfbm9ybWFsLgotICAgRW5zdXJlIHN1ZmZpY2llbnQgYnl0ZXMgYXJlIGNhY2hlZCBpbiBFWF9JTkZPLgotICAgT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGluc24gb2YgdGhlIHZhbHVlLgotICAgQllURVMgaXMgdGhlIGxlbmd0aCBvZiB0aGUgbmVlZGVkIHZhbHVlLgotICAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIGludAotZmlsbF9jYWNoZSAoY2QsIGV4X2luZm8sIG9mZnNldCwgYnl0ZXMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgaW50IG9mZnNldCwgYnl0ZXM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIC8qIEl0J3MgZG91YnRmdWwgdGhhdCB0aGUgbWlkZGxlIHBhcnQgaGFzIGFscmVhZHkgYmVlbiBmZXRjaGVkIHNvCi0gICAgIHdlIGRvbid0IG9wdGltaXplIHRoYXQgY2FzZS4gIGtpc3MuICAqLwotICBpbnQgbWFzazsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGV4X2luZm8tPmRpc19pbmZvOwotCi0gIC8qIEZpcnN0IGRvIGEgcXVpY2sgY2hlY2suICAqLwotICBtYXNrID0gKDEgPDwgYnl0ZXMpIC0gMTsKLSAgaWYgKCgoZXhfaW5mby0+dmFsaWQgPj4gb2Zmc2V0KSAmIG1hc2spID09IG1hc2spCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgYnl0ZSB3ZSBuZWVkIHRvIHJlYWQuICAqLwotICBmb3IgKG1hc2sgPSAxIDw8IG9mZnNldDsgYnl0ZXMgPiAwOyAtLWJ5dGVzLCArK29mZnNldCwgbWFzayA8PD0gMSkKLSAgICBpZiAoISAobWFzayAmIGV4X2luZm8tPnZhbGlkKSkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChieXRlcykKLSAgICB7Ci0gICAgICBpbnQgc3RhdHVzOwotCi0gICAgICBwYyArPSBvZmZzZXQ7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCi0JKHBjLCBleF9pbmZvLT5pbnNuX2J5dGVzICsgb2Zmc2V0LCBieXRlcywgaW5mbyk7Ci0KLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGV4X2luZm8tPnZhbGlkIHw9ICgoMSA8PCBieXRlcykgLSAxKSA8PCBvZmZzZXQ7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGV4dHJhY3Rfbm9ybWFsLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIGxvbmcKLWV4dHJhY3RfMSAoY2QsIGV4X2luZm8sIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIGludCBzdGFydCxsZW5ndGgsd29yZF9sZW5ndGg7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnA7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgeCxtYXNrOwotICBpbnQgc2hpZnQ7Ci0gIGludCBiaWdfcCA9IENHRU5fQ1BVX0lOU05fRU5ESUFOIChjZCkgPT0gQ0dFTl9FTkRJQU5fQklHOwotCi0gIHN3aXRjaCAod29yZF9sZW5ndGgpCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgIHggPSAqYnVmcDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMTYgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6Ci0gICAgICAvKiA/Pz8gVGhpcyBtYXkgbmVlZCByZXdvcmtpbmcgYXMgdGhlc2UgY2FzZXMgZG9uJ3QgbmVjZXNzYXJpbHkKLQkgd2FudCB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIGxhc3QgdHdvIGJ5dGVzIGhhbmRsZWQgbGlrZSB0aGlzLiAgKi8KLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gKGJ1ZnBbMF0gPDwgMTYpIHwgYmZkX2dldGIxNiAoYnVmcCArIDEpOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKSB8IChidWZwWzJdIDw8IDE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMzIgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDMyIChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKLSAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOwotICBlbHNlCi0gICAgc2hpZnQgPSAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKLSAgcmV0dXJuICh4ID4+IHNoaWZ0KSAmIG1hc2s7Ci19Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0vKiBEZWZhdWx0IGV4dHJhY3Rpb24gcm91dGluZS4KLQotICAgSU5TTl9WQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBvZiB0aGUgaW5zbiBpbiBob3N0IG9yZGVyLAotICAgb3Igc29tZXRpbWVzIGxlc3MgZm9yIGNhc2VzIGxpa2UgdGhlIG0zMnIgd2hlcmUgdGhlIGJhc2UgaW5zbiBzaXplIGlzIDMyCi0gICBidXQgc29tZSBpbnNucyBhcmUgMTYgYml0cy4KLSAgIEFUVFJTIGlzIGEgbWFzayBvZiB0aGUgYm9vbGVhbiBhdHRyaWJ1dGVzLiAgV2Ugb25seSBuZWVkIGBTSUdORUQnLAotICAgYnV0IGZvciBnZW5lcmFsaXR5IHdlIHRha2UgYSBiaXRtYXNrIG9mIGFsbCBvZiB0aGVtLgotICAgV09SRF9PRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBiaXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KLSAgIFdPUkRfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIHdvcmQgaW4gYml0cyBpbiB3aGljaCB0aGUgdmFsdWUgcmVzaWRlcy4KLSAgIFNUQVJUIGlzIHRoZSBzdGFydGluZyBiaXQgbnVtYmVyIGluIHRoZSB3b3JkLCBhcmNoaXRlY3R1cmUgb3JpZ2luLgotICAgTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgVkFMVUUgaW4gYml0cy4KLSAgIFRPVEFMX0xFTkdUSCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMuCi0KLSAgIFJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4gICovCi0KLS8qID8/PyBUaGUgcmV0dXJuIGNvZGUgaXNuJ3QgcHJvcGVybHkgdXNlZC4gIHdpcC4gICovCi0KLS8qID8/PyBUaGlzIGRvZXNuJ3QgaGFuZGxlIGJmZF92bWEncy4gIENyZWF0ZSBhbm90aGVyIGZ1bmN0aW9uIHdoZW4KLSAgIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgYXR0cnMsIHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLAotCQl3b3JkX2xlbmd0aCwgdG90YWxfbGVuZ3RoLCBwYywgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIHVuc2lnbmVkIGludCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIHRvdGFsX2xlbmd0aDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgbG9uZyAqdmFsdWVwOwotewotICBDR0VOX0lOU05fSU5UIHZhbHVlOwotCi0gIC8qIElmIExFTkdUSCBpcyB6ZXJvLCB0aGlzIG9wZXJhbmQgZG9lc24ndCBjb250cmlidXRlIHRvIHRoZSB2YWx1ZQotICAgICBzbyBnaXZlIGl0IGEgc3RhbmRhcmQgdmFsdWUgb2YgemVyby4gICovCi0gIGlmIChsZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICAqdmFsdWVwID0gMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAoQ0dFTl9JTlRfSU5TTl9QCi0gICAgICAmJiB3b3JkX29mZnNldCAhPSAwKQotICAgIGFib3J0ICgpOwotCi0gIGlmICh3b3JkX2xlbmd0aCA+IDMyKQotICAgIGFib3J0ICgpOwotCi0gIC8qIEZvciBhcmNoaXRlY3R1cmVzIHdpdGggaW5zbnMgc21hbGxlciB0aGFuIHRoZSBpbnNuLWJhc2UtYml0c2l6ZSwKLSAgICAgd29yZF9sZW5ndGggbWF5IGJlIHRvbyBiaWcuICAqLwotICBpZiAoY2QtPm1pbl9pbnNuX2JpdHNpemUgPCBjZC0+YmFzZV9pbnNuX2JpdHNpemUpCi0gICAgewotICAgICAgaWYgKHdvcmRfb2Zmc2V0ID09IDAKLQkgICYmIHdvcmRfbGVuZ3RoID4gdG90YWxfbGVuZ3RoKQotCXdvcmRfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOwotICAgIH0KLQotICAvKiBEb2VzIHRoZSB2YWx1ZSByZXNpZGUgaW4gSU5TTl9WQUxVRT8gICovCi0KLSAgaWYgKHdvcmRfb2Zmc2V0ID09IDApCi0gICAgewotICAgICAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgICAgIENHRU5fSU5TTl9JTlQgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0KLSAgICAgIGlmIChDR0VOX0lOU05fTFNCMF9QKQotCXZhbHVlID0gaW5zbl92YWx1ZSA+PiAoKHN0YXJ0ICsgMSkgLSBsZW5ndGgpOwotICAgICAgZWxzZQotCXZhbHVlID0gaW5zbl92YWx1ZSA+PiAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKLSAgICAgIHZhbHVlICY9IG1hc2s7Ci0gICAgICAvKiBzaWduIGV4dGVuZD8gKi8KLSAgICAgIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fSUZMRF9TSUdORUQpCi0JICAmJiAodmFsdWUgJiAoMUwgPDwgKGxlbmd0aCAtIDEpKSkpCi0JdmFsdWUgfD0gfm1hc2s7Ci0gICAgfQotCi0jaWYgISBDR0VOX0lOVF9JTlNOX1AKLQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqYnVmcCA9IGV4X2luZm8tPmluc25fYnl0ZXMgKyB3b3JkX29mZnNldCAvIDg7Ci0KLSAgICAgIGlmICh3b3JkX2xlbmd0aCA+IDMyKQotCWFib3J0ICgpOwotCi0gICAgICBpZiAoZmlsbF9jYWNoZSAoY2QsIGV4X2luZm8sIHdvcmRfb2Zmc2V0IC8gOCwgd29yZF9sZW5ndGggLyA4LCBwYykgPT0gMCkKLQlyZXR1cm4gMDsKLQotICAgICAgdmFsdWUgPSBleHRyYWN0XzEgKGNkLCBleF9pbmZvLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCwgcGMpOwotICAgIH0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLSAgKnZhbHVlcCA9IHZhbHVlOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBEZWZhdWx0IGluc24gZXh0cmFjdG9yLgotCi0gICBJTlNOX1ZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzLCB0cmFuc2xhdGVkIHRvIGhvc3Qgb3JkZXIuCi0gICBUaGUgZXh0cmFjdGVkIGZpZWxkcyBhcmUgc3RvcmVkIGluIEZJRUxEUy4KLSAgIEVYX0lORk8gaXMgdXNlZCB0byBoYW5kbGUgcmVhZGluZyB2YXJpYWJsZSBsZW5ndGggaW5zbnMuCi0gICBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzLCBvciAwIGlmIG5vIG1hdGNoLAotICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJzIGZldGNoaW5nIGRhdGEgKG1lbW9yeV9lcnJvcl9mdW5jIHdpbGwgaGF2ZQotICAgYmVlbiBjYWxsZWQpLiAgKi8KLQotc3RhdGljIGludAotZXh0cmFjdF9pbnNuX25vcm1hbCAoY2QsIGluc24sIGV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzeW47Ci0KLSAgQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSA9IENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKLQotICBDR0VOX0lOSVRfRVhUUkFDVCAoY2QpOwotCi0gIGZvciAoc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOyAqc3luOyArK3N5bikKLSAgICB7Ci0gICAgICBpbnQgbGVuZ3RoOwotCi0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqc3luKSkKLQljb250aW51ZTsKLQotICAgICAgbGVuZ3RoID0gKCogY2QtPmV4dHJhY3Rfb3BlcmFuZCkgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksCi0JCQkJCWV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpOwotICAgICAgaWYgKGxlbmd0aCA8PSAwKQotCXJldHVybiBsZW5ndGg7Ci0gICAgfQotCi0gIC8qIFdlIHJlY29nbml6ZWQgYW5kIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQgdGhpcyBpbnNuLiAgKi8KLSAgcmV0dXJuIENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKLX0KLQwKLS8qIG1hY2hpbmUgZ2VuZXJhdGVkIGNvZGUgYWRkZWQgaGVyZSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIGluc2VydGlvbi4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucwotICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKLSAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KLSAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCi0gICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKLSAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwYXJzZV9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0Ci0gICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHBhcnNlX2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgotICAgdGhlIGhhbmRsZXJzLiAgSXQncyBhbHNvIG5lZWRlZCBieSBHQVMgdG8gaW5zZXJ0IG9wZXJhbmRzIHRoYXQgY291bGRuJ3QgYmUKLSAgIHJlc29sdmVkIGR1cmluZyBwYXJzaW5nLgotKi8KLQotY29uc3QgY2hhciAqCi1mcjMwX2NnZW5faW5zZXJ0X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIGJ1ZmZlciwgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWZmZXI7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIGNvbnN0IGNoYXIgKiBlcnJtc2c7Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9sZW5ndGggPSBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfQ1JpLCAwLCAxNiwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9DUmosIDAsIDE2LCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfbmlsLCAwLCAwLCAwLCAwLCAwLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTQgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9uaWwsIDAsIDAsIDAsIDAsIDAsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX25pbCwgMCwgMCwgMCwgMCwgMCwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9SaSwgMCwgMCwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9SaWMsIDAsIDE2LCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfUmosIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9SamMsIDAsIDE2LCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfUnMxLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfUnMyLCAwLCAwLCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfY2MsIDAsIDAsIDQsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9jY2MsIDAsIDE2LCAwLCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2RpcjEwOwotICAgICAgICB2YWx1ZSA9ICgodW5zaWduZWQgaW50KSAodmFsdWUpID4+ICgyKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9kaXI4LCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlyOTsKLSAgICAgICAgdmFsdWUgPSAoKHVuc2lnbmVkIGludCkgKHZhbHVlKSA+PiAoMSkpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AxMDsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKHZhbHVlKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDggOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9kaXNwOCwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOSA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDk7Ci0gICAgICAgIHZhbHVlID0gKChpbnQpICh2YWx1ZSkgPj4gKDEpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kyMCA6Ci0gICAgICB7Ci17Ci0gIEZMRCAoZl9pMjBfNCkgPSAoKHVuc2lnbmVkIGludCkgKEZMRCAoZl9pMjApKSA+PiAoMTYpKTsKLSAgRkxEIChmX2kyMF8xNikgPSAoKEZMRCAoZl9pMjApKSAmICg2NTUzNSkpOwotfQotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2kyMF80LCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgICBpZiAoZXJybXNnKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2kyMF8xNiwgMCwgMTYsIDAsIDE2LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgICBpZiAoZXJybXNnKQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfaTMyLCAwfCgxPDxDR0VOX0lGTERfU0lHTl9PUFQpLCAxNiwgMCwgMzIsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2k4LCAwLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfcmVsMTI7Ci0gICAgICAgIHZhbHVlID0gKChpbnQpICgoKHZhbHVlKSAtICgoKHBjKSArICgyKSkpKSkgPj4gKDEpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCA1LCAxMSwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfcmVsOTsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKCgodmFsdWUpIC0gKCgocGMpICsgKDIpKSkpKSA+PiAoMSkpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfbTQ7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgJiAoMTUpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9uaWwsIDAsIDAsIDAsIDAsIDAsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3QsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfczEwOwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAodmFsdWUpID4+ICgyKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX3UxMDsKLSAgICAgICAgdmFsdWUgPSAoKHVuc2lnbmVkIGludCkgKHZhbHVlKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3U0LCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdTRjLCAwLCAwLCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdTgsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX3VkaXNwNjsKLSAgICAgICAgdmFsdWUgPSAoKHVuc2lnbmVkIGludCkgKHZhbHVlKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGJ1aWxkaW5nIGluc24uXG4iKSwKLQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHJldHVybiBlcnJtc2c7Ci19Ci0KLS8qIE1haW4gZW50cnkgcG9pbnQgZm9yIG9wZXJhbmQgZXh0cmFjdGlvbi4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucwotICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKLSAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KLSAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCi0gICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKLSAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwcmludF9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0Ci0gICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHByaW50X2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgotICAgdGhlIGhhbmRsZXJzLgotKi8KLQotaW50Ci1mcjMwX2NnZW5fZXh0cmFjdF9vcGVyYW5kIChjZCwgb3BpbmRleCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgZmllbGRzLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBDR0VOX0lOU05fSU5UIGluc25fdmFsdWU7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBiZmRfdm1hIHBjOwotewotICBpbnQgbGVuZ3RoOwotICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuZ3RoID0gQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKTsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX0NSaSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAxNiwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX0NSaik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAwLCAwLCAwLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9uaWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMCwgMCwgMCwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfbmlsKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDAsIDAsIDAsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX25pbCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUmkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMTYsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUmljKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX1JqKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUmpjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9SczEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9SczIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfY2MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMTYsIDAsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9jY2MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOwotICAgICAgICBmaWVsZHMtPmZfZGlyMTAgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfZGlyOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDEpKTsKLSAgICAgICAgZmllbGRzLT5mX2RpcjkgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDEwID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfZGlzcDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDEpKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3A5ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgewotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9pMjBfNCk7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMTYsIDAsIDE2LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfaTIwXzE2KTsKLXsKLSAgRkxEIChmX2kyMCkgPSAoKCgoRkxEIChmX2kyMF80KSkgPDwgKDE2KSkpIHwgKEZMRCAoZl9pMjBfMTYpKSk7Ci19Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTl9PUFQpLCAxNiwgMCwgMzIsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9pMzIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfaTgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgNSwgMTEsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKCgodmFsdWUpIDw8ICgxKSkpICsgKCgocGMpICsgKDIpKSkpOwotICAgICAgICBmaWVsZHMtPmZfcmVsMTIgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgoKCh2YWx1ZSkgPDwgKDEpKSkgKyAoKChwYykgKyAoMikpKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9yZWw5ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpIHwgKCgoLTEpIDw8ICg0KSkpKTsKLSAgICAgICAgZmllbGRzLT5mX200ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDAsIDAsIDAsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX25pbCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOwotICAgICAgICBmaWVsZHMtPmZfczEwID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOwotICAgICAgICBmaWVsZHMtPmZfdTEwID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91NCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3U0Yyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91OCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOwotICAgICAgICBmaWVsZHMtPmZfdWRpc3A2ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGRlY29kaW5nIGluc24uXG4iKSwKLQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotY2dlbl9pbnNlcnRfZm4gKiBjb25zdCBmcjMwX2NnZW5faW5zZXJ0X2hhbmRsZXJzW10gPSAKLXsKLSAgaW5zZXJ0X2luc25fbm9ybWFsLAotfTsKLQotY2dlbl9leHRyYWN0X2ZuICogY29uc3QgZnIzMF9jZ2VuX2V4dHJhY3RfaGFuZGxlcnNbXSA9IAotewotICBleHRyYWN0X2luc25fbm9ybWFsLAotfTsKLQotLyogR2V0dGluZyB2YWx1ZXMgZnJvbSBjZ2VuX2ZpZWxkcyBpcyBoYW5kbGVkIGJ5IGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMuCi0gICBUaGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSB0eXBlIG9mIHRoZSBWQUxVRSBhcmd1bWVudCB0aGV5IHJldHVybi4KLSAgIFRPRE86IGZsb2F0aW5nIHBvaW50LCBpbmxpbmluZyBzdXBwb3J0LCByZW1vdmUgY2FzZXMgd2hlcmUgcmVzdWx0IHR5cGUKLSAgIG5vdCBhcHByb3ByaWF0ZS4gICovCi0KLWludAotZnIzMF9jZ2VuX2dldF9pbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGNvbnN0IENHRU5fRklFTERTICogZmllbGRzOwotewotICBpbnQgdmFsdWU7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfQ1JpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX0NSajsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9uaWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbmlsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX25pbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JpYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JqOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JqYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SczE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUnMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfY2M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfY2NjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlyMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpcjg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpcjk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kyMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9pMjA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaTMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaTg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlbDEyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlbDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9tNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX25pbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfczEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3UxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3U0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3U0YzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3U4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VkaXNwNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZ2V0dGluZyBpbnQgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotYmZkX3ZtYQotZnIzMF9jZ2VuX2dldF92bWFfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGNvbnN0IENHRU5fRklFTERTICogZmllbGRzOwotewotICBiZmRfdm1hIHZhbHVlOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX0NSaTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9DUmo7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbmlsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX25pbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9uaWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SaTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SaWM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SajsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SamM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUnMxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2NjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2NjYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2RpcjEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXI4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXI5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaTIwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2kzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2k4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWwxMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWw5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9uaWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3MxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1UxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91MTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91NDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91NGM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91ODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91ZGlzcDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgdm1hIG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIFN0dWZmaW5nIHZhbHVlcyBpbiBjZ2VuX2ZpZWxkcyBpcyBoYW5kbGVkIGJ5IGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMuCi0gICBUaGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSB0eXBlIG9mIHRoZSBWQUxVRSBhcmd1bWVudCB0aGV5IGFjY2VwdC4KLSAgIFRPRE86IGZsb2F0aW5nIHBvaW50LCBpbmxpbmluZyBzdXBwb3J0LCByZW1vdmUgY2FzZXMgd2hlcmUgYXJndW1lbnQgdHlwZQotICAgbm90IGFwcHJvcHJpYXRlLiAgKi8KLQotdm9pZAotZnIzMF9jZ2VuX3NldF9pbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcywgdmFsdWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgaW50IHZhbHVlOwotewotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBmaWVsZHMtPmZfQ1JpID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgZmllbGRzLT5mX0NSaiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKLSAgICAgIGZpZWxkcy0+Zl9uaWwgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICBmaWVsZHMtPmZfbmlsID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgZmllbGRzLT5mX25pbCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgotICAgICAgZmllbGRzLT5mX1JpID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgZmllbGRzLT5mX1JpYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgZmllbGRzLT5mX1JqID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgotICAgICAgZmllbGRzLT5mX1JqYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIGZpZWxkcy0+Zl9SczEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICBmaWVsZHMtPmZfUnMyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6Ci0gICAgICBmaWVsZHMtPmZfY2MgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBmaWVsZHMtPmZfY2NjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICBmaWVsZHMtPmZfZGlyMTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgotICAgICAgZmllbGRzLT5mX2RpcjggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgZmllbGRzLT5mX2RpcjkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwOSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIGZpZWxkcy0+Zl9pMjAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICBmaWVsZHMtPmZfaTMyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6Ci0gICAgICBmaWVsZHMtPmZfaTggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgZmllbGRzLT5mX3JlbDEyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgZmllbGRzLT5mX3JlbDkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIGZpZWxkcy0+Zl9tNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgotICAgICAgZmllbGRzLT5mX25pbCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3QgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICBmaWVsZHMtPmZfczEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgZmllbGRzLT5mX3UxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgZmllbGRzLT5mX3U0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgotICAgICAgZmllbGRzLT5mX3U0YyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgZmllbGRzLT5mX3U4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgZmllbGRzLT5mX3VkaXNwNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBzZXR0aW5nIGludCBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci19Ci0KLXZvaWQKLWZyMzBfY2dlbl9zZXRfdm1hX29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIHZhbHVlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKLSAgICAgIGZpZWxkcy0+Zl9DUmkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICBmaWVsZHMtPmZfQ1JqID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgZmllbGRzLT5mX25pbCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIGZpZWxkcy0+Zl9uaWwgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICBmaWVsZHMtPmZfbmlsID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICBmaWVsZHMtPmZfUmkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICBmaWVsZHMtPmZfUmljID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICBmaWVsZHMtPmZfUmogPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICBmaWVsZHMtPmZfUmpjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgZmllbGRzLT5mX1JzMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIGZpZWxkcy0+Zl9SczIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIGZpZWxkcy0+Zl9jYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIGZpZWxkcy0+Zl9jY2MgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIGZpZWxkcy0+Zl9kaXIxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICBmaWVsZHMtPmZfZGlyOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6Ci0gICAgICBmaWVsZHMtPmZfZGlyOSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwMTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgZmllbGRzLT5mX2Rpc3A5ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgZmllbGRzLT5mX2kyMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIGZpZWxkcy0+Zl9pMzIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIGZpZWxkcy0+Zl9pOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICBmaWVsZHMtPmZfcmVsMTIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6Ci0gICAgICBmaWVsZHMtPmZfcmVsOSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgZmllbGRzLT5mX200ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICBmaWVsZHMtPmZfbmlsID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfbGQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKLSAgICAgIGZpZWxkcy0+Zl9zMTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1UxMCA6Ci0gICAgICBmaWVsZHMtPmZfdTEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICBmaWVsZHMtPmZfdTQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICBmaWVsZHMtPmZfdTRjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICBmaWVsZHMtPmZfdTggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6Ci0gICAgICBmaWVsZHMtPmZfdWRpc3A2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHNldHRpbmcgdm1hIG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLX0KLQotLyogRnVuY3Rpb24gdG8gY2FsbCBiZWZvcmUgdXNpbmcgdGhlIGluc3RydWN0aW9uIGJ1aWxkZXIgdGFibGVzLiAgKi8KLQotdm9pZAotZnIzMF9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGNkLT5pbnNlcnRfaGFuZGxlcnMgPSAmIGZyMzBfY2dlbl9pbnNlcnRfaGFuZGxlcnNbMF07Ci0gIGNkLT5leHRyYWN0X2hhbmRsZXJzID0gJiBmcjMwX2NnZW5fZXh0cmFjdF9oYW5kbGVyc1swXTsKLQotICBjZC0+aW5zZXJ0X29wZXJhbmQgPSBmcjMwX2NnZW5faW5zZXJ0X29wZXJhbmQ7Ci0gIGNkLT5leHRyYWN0X29wZXJhbmQgPSBmcjMwX2NnZW5fZXh0cmFjdF9vcGVyYW5kOwotCi0gIGNkLT5nZXRfaW50X29wZXJhbmQgPSBmcjMwX2NnZW5fZ2V0X2ludF9vcGVyYW5kOwotICBjZC0+c2V0X2ludF9vcGVyYW5kID0gZnIzMF9jZ2VuX3NldF9pbnRfb3BlcmFuZDsKLSAgY2QtPmdldF92bWFfb3BlcmFuZCA9IGZyMzBfY2dlbl9nZXRfdm1hX29wZXJhbmQ7Ci0gIGNkLT5zZXRfdm1hX29wZXJhbmQgPSBmcjMwX2NnZW5fc2V0X3ZtYV9vcGVyYW5kOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLW9wYy5jIGIvb3Bjb2Rlcy9mcjMwLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDIxMDBkLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNjggKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIHRhYmxlIGZvciBmcjMwLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJmcjMwLWRlc2MuaCIKLSNpbmNsdWRlICJmcjMwLW9wYy5oIgotCi0vKiBUaGUgaGFzaCBmdW5jdGlvbnMgYXJlIHJlY29yZGVkIGhlcmUgdG8gaGVscCBrZWVwIGFzc2VtYmxlciBjb2RlIG91dCBvZgotICAgdGhlIGRpc2Fzc2VtYmxlciBhbmQgdmljZSB2ZXJzYS4gICovCi0KLXN0YXRpYyBpbnQgYXNtX2hhc2hfaW5zbl9wIFBBUkFNUyAoKGNvbnN0IENHRU5fSU5TTiAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGFzbV9oYXNoX2luc24gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IGRpc19oYXNoX2luc25fcCBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBkaXNfaGFzaF9pbnNuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgQ0dFTl9JTlNOX0lOVCkpOwotCi0vKiBJbnN0cnVjdGlvbiBmb3JtYXRzLiAgKi8KLQotI2RlZmluZSBGKGYpICYgZnIzMF9jZ2VuX2lmbGRfdGFibGVbQ09OQ0FUMiAoRlIzMF8sZildCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9lbXB0eSA9IHsKLSAgMCwgMCwgMHgwLCB7IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUkopLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkaSA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfVTQpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkMiA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfTTQpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZGl2MHMgPSB7Ci0gIDE2LCAxNiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9kaXYzID0gewotICAxNiwgMTYsIDB4ZmZmZiwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX09QNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTggPSB7Ci0gIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9JOCksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGkyMCA9IHsKLSAgMTYsIDMyLCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX0kyMCksIEYgKEZfT1AyKSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTMyID0gewotICAxNiwgNDgsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfSTMyKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHIxNCA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX0RJU1AxMCksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHIxNHVoID0gewotICAxNiwgMTYsIDB4ZjAwMCwgeyBGIChGX09QMSksIEYgKEZfRElTUDkpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRyMTR1YiA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX0RJU1A4KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkcjE1ID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9VRElTUDYpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRyMTVkciA9IHsKLSAgMTYsIDE2LCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9SUzIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tb3ZkciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUlMxKSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NhbGwgPSB7Ci0gIDE2LCAxNiwgMHhmODAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDUpLCBGIChGX1JFTDEyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfaW50ID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9VOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JyYWQgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9DQyksIEYgKEZfUkVMOSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2Rtb3ZyMTMgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX0RJUjEwKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZG1vdnIxM2ggPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX0RJUjkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9kbW92cjEzYiA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfRElSOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NvcG9wID0gewotICAxNiwgMzIsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfQ0NDKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfQ1JKKSwgRiAoRl9VNEMpLCBGIChGX0NSSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NvcGxkID0gewotICAxNiwgMzIsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfQ0NDKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfUkpDKSwgRiAoRl9VNEMpLCBGIChGX0NSSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NvcHN0ID0gewotICAxNiwgMzIsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfQ0NDKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfQ1JKKSwgRiAoRl9VNEMpLCBGIChGX1JJQyksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZHNwID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9TMTApLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZG0wID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SRUdMSVNUX0xPV19MRCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkbTEgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JFR0xJU1RfSElfTEQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdG0wID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SRUdMSVNUX0xPV19TVCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0bTEgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JFR0xJU1RfSElfU1QpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9lbnRlciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfVTEwKSwgMCB9Ci19OwotCi0jdW5kZWYgRgotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JTlNOXyxhKSkKLSNkZWZpbmUgTU5FTSBDR0VOX1NZTlRBWF9NTkVNT05JQyAvKiBzeW50YXggdmFsdWUgZm9yIG1uZW1vbmljICovCi0jZGVmaW5lIE9QRVJBTkQob3ApIENPTkNBVDIgKEZSMzBfT1BFUkFORF8sb3ApCi0jZGVmaW5lIE9QKGZpZWxkKSBDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEIChPUEVSQU5EIChmaWVsZCkpCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX09QQ09ERSBmcjMwX2NnZW5faW5zbl9vcGNvZGVfdGFibGVbTUFYX0lOU05TXSA9Ci17Ci0gIC8qIFNwZWNpYWwgbnVsbCBmaXJzdCBlbnRyeS4KLSAgICAgQSBgbnVtJyB2YWx1ZSBvZiB6ZXJvIGlzIHRodXMgaW52YWxpZC4KLSAgICAgQWxzbywgdGhlIHNwZWNpYWwgYGludmFsaWQnIGluc24gcmVzaWRlcyBoZXJlLiAgKi8KLSAgeyB7IDAgfSB9LAotLyogYWRkICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGE2MDAgfQotICB9LAotLyogYWRkICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhhNDAwIH0KLSAgfSwKLS8qIGFkZDIgJG00LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKE00KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMiwgeyAweGE1MDAgfQotICB9LAotLyogYWRkYyAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhNzAwIH0KLSAgfSwKLS8qIGFkZG4gJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YTIwMCB9Ci0gIH0sCi0vKiBhZGRuICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhhMDAwIH0KLSAgfSwKLS8qIGFkZG4yICRtNCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChNNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZDIsIHsgMHhhMTAwIH0KLSAgfSwKLS8qIHN1YiAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhYzAwIH0KLSAgfSwKLS8qIHN1YmMgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YWQwMCB9Ci0gIH0sCi0vKiBzdWJuICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGFlMDAgfQotICB9LAotLyogY21wICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGFhMDAgfQotICB9LAotLyogY21wICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhhODAwIH0KLSAgfSwKLS8qIGNtcDIgJG00LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKE00KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMiwgeyAweGE5MDAgfQotICB9LAotLyogYW5kICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDgyMDAgfQotICB9LAotLyogb3IgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OTIwMCB9Ci0gIH0sCi0vKiBlb3IgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OWEwMCB9Ci0gIH0sCi0vKiBhbmQgJFJqLEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4ODQwMCB9Ci0gIH0sCi0vKiBhbmRoICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDg1MDAgfQotICB9LAotLyogYW5kYiAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg4NjAwIH0KLSAgfSwKLS8qIG9yICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDk0MDAgfQotICB9LAotLyogb3JoICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDk1MDAgfQotICB9LAotLyogb3JiICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDk2MDAgfQotICB9LAotLyogZW9yICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDljMDAgfQotICB9LAotLyogZW9yaCAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5ZDAwIH0KLSAgfSwKLS8qIGVvcmIgJFJqLEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OWUwMCB9Ci0gIH0sCi0vKiBiYW5kbCAkdTQsQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4ODAwMCB9Ci0gIH0sCi0vKiBib3JsICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg5MDAwIH0KLSAgfSwKLS8qIGJlb3JsICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg5ODAwIH0KLSAgfSwKLS8qIGJhbmRoICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg4MTAwIH0KLSAgfSwKLS8qIGJvcmggJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDkxMDAgfQotICB9LAotLyogYmVvcmggJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDk5MDAgfQotICB9LAotLyogYnRzdGwgJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDg4MDAgfQotICB9LAotLyogYnRzdGggJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDg5MDAgfQotICB9LAotLyogbXVsICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGFmMDAgfQotICB9LAotLyogbXVsdSAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhYjAwIH0KLSAgfSwKLS8qIG11bGggJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YmYwMCB9Ci0gIH0sCi0vKiBtdWx1aCAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhiYjAwIH0KLSAgfSwKLS8qIGRpdjBzICRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTc0MCB9Ci0gIH0sCi0vKiBkaXYwdSAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3NTAgfQotICB9LAotLyogZGl2MSAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3NjAgfQotICB9LAotLyogZGl2MiAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3NzAgfQotICB9LAotLyogZGl2MyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OWY2MCB9Ci0gIH0sCi0vKiBkaXY0cyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OWY3MCB9Ci0gIH0sCi0vKiBsc2wgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YjYwMCB9Ci0gIH0sCi0vKiBsc2wgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGI0MDAgfQotICB9LAotLyogbHNsMiAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YjUwMCB9Ci0gIH0sCi0vKiBsc3IgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YjIwMCB9Ci0gIH0sCi0vKiBsc3IgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGIwMDAgfQotICB9LAotLyogbHNyMiAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YjEwMCB9Ci0gIH0sCi0vKiBhc3IgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YmEwMCB9Ci0gIH0sCi0vKiBhc3IgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGI4MDAgfQotICB9LAotLyogYXNyMiAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YjkwMCB9Ci0gIH0sCi0vKiBsZGk6OCAkaTgsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoSTgpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZGk4LCB7IDB4YzAwMCB9Ci0gIH0sCi0vKiBsZGk6MjAgJGkyMCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChJMjApLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZGkyMCwgeyAweDliMDAgfQotICB9LAotLyogbGRpOjMyICRpMzIsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoSTMyKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpMzIsIHsgMHg5ZjgwIH0KLSAgfSwKLS8qIGxkIEAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDQwMCB9Ci0gIH0sCi0vKiBsZHVoIEAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDUwMCB9Ci0gIH0sCi0vKiBsZHViIEAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDYwMCB9Ci0gIH0sCi0vKiBsZCBAKCRSMTMsJFJqKSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjEzKSwgJywnLCBPUCAoUkopLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDAgfQotICB9LAotLyogbGR1aCBAKCRSMTMsJFJqKSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjEzKSwgJywnLCBPUCAoUkopLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwMCB9Ci0gIH0sCi0vKiBsZHViIEAoJFIxMywkUmopLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCAnKCcsIE9QIChSMTMpLCAnLCcsIE9QIChSSiksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjAwIH0KLSAgfSwKLS8qIGxkIEAoJFIxNCwkZGlzcDEwKSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjE0KSwgJywnLCBPUCAoRElTUDEwKSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNCwgeyAweDIwMDAgfQotICB9LAotLyogbGR1aCBAKCRSMTQsJGRpc3A5KSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjE0KSwgJywnLCBPUCAoRElTUDkpLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE0dWgsIHsgMHg0MDAwIH0KLSAgfSwKLS8qIGxkdWIgQCgkUjE0LCRkaXNwOCksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxNCksICcsJywgT1AgKERJU1A4KSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNHViLCB7IDB4NjAwMCB9Ci0gIH0sCi0vKiBsZCBAKCRSMTUsJHVkaXNwNiksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxNSksICcsJywgT1AgKFVESVNQNiksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTUsIHsgMHgzMDAgfQotICB9LAotLyogbGQgQCRSMTUrLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjE1KSwgJysnLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDcwMCB9Ci0gIH0sCi0vKiBsZCBAJFIxNSssJFJzMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjE1KSwgJysnLCAnLCcsIE9QIChSUzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTVkciwgeyAweDc4MCB9Ci0gIH0sCi0vKiBsZCBAJFIxNSssJHBzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTUpLCAnKycsICcsJywgT1AgKFBTKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg3OTAgfQotICB9LAotLyogc3QgJFJpLEAkUmogKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCBPUCAoUkopLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTQwMCB9Ci0gIH0sCi0vKiBzdGggJFJpLEAkUmogKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCBPUCAoUkopLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTUwMCB9Ci0gIH0sCi0vKiBzdGIgJFJpLEAkUmogKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCBPUCAoUkopLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTYwMCB9Ci0gIH0sCi0vKiBzdCAkUmksQCgkUjEzLCRSaikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTMpLCAnLCcsIE9QIChSSiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwMDAgfQotICB9LAotLyogc3RoICRSaSxAKCRSMTMsJFJqKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxMyksICcsJywgT1AgKFJKKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTEwMCB9Ci0gIH0sCi0vKiBzdGIgJFJpLEAoJFIxMywkUmopICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJygnLCBPUCAoUjEzKSwgJywnLCBPUCAoUkopLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMjAwIH0KLSAgfSwKLS8qIHN0ICRSaSxAKCRSMTQsJGRpc3AxMCkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTQpLCAnLCcsIE9QIChESVNQMTApLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNCwgeyAweDMwMDAgfQotICB9LAotLyogc3RoICRSaSxAKCRSMTQsJGRpc3A5KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxNCksICcsJywgT1AgKERJU1A5KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTR1aCwgeyAweDUwMDAgfQotICB9LAotLyogc3RiICRSaSxAKCRSMTQsJGRpc3A4KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxNCksICcsJywgT1AgKERJU1A4KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTR1YiwgeyAweDcwMDAgfQotICB9LAotLyogc3QgJFJpLEAoJFIxNSwkdWRpc3A2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxNSksICcsJywgT1AgKFVESVNQNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE1LCB7IDB4MTMwMCB9Ci0gIH0sCi0vKiBzdCAkUmksQC0kUjE1ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJy0nLCBPUCAoUjE1KSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4MTcwMCB9Ci0gIH0sCi0vKiBzdCAkUnMyLEAtJFIxNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJTMiksICcsJywgJ0AnLCAnLScsIE9QIChSMTUpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTVkciwgeyAweDE3ODAgfQotICB9LAotLyogc3QgJHBzLEAtJFIxNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFBTKSwgJywnLCAnQCcsICctJywgT1AgKFIxNSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4MTc5MCB9Ci0gIH0sCi0vKiBtb3YgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OGIwMCB9Ci0gIH0sCi0vKiBtb3YgJFJzMSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSUzEpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9tb3ZkciwgeyAweGI3MDAgfQotICB9LAotLyogbW92ICRwcywkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChQUyksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4MTcxMCB9Ci0gIH0sCi0vKiBtb3YgJFJpLCRSczEgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgT1AgKFJTMSksIDAgfSB9LAotICAgICYgaWZtdF9tb3ZkciwgeyAweGIzMDAgfQotICB9LAotLyogbW92ICRSaSwkcHMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgT1AgKFBTKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4NzEwIH0KLSAgfSwKLS8qIGptcCBAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3MDAgfQotICB9LAotLyogam1wOmQgQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5ZjAwIH0KLSAgfSwKLS8qIGNhbGwgQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzEwIH0KLSAgfSwKLS8qIGNhbGw6ZCBAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDlmMTAgfQotICB9LAotLyogY2FsbCAkbGFiZWwxMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMMTIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY2FsbCwgeyAweGQwMDAgfQotICB9LAotLyogY2FsbDpkICRsYWJlbDEyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUwxMiksIDAgfSB9LAotICAgICYgaWZtdF9jYWxsLCB7IDB4ZDgwMCB9Ci0gIH0sCi0vKiByZXQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDk3MjAgfQotICB9LAotLyogcmV0OmQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmMjAgfQotICB9LAotLyogaW50ICR1OCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU4KSwgMCB9IH0sCi0gICAgJiBpZm10X2ludCwgeyAweDFmMDAgfQotICB9LAotLyogaW50ZSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OWYzMCB9Ci0gIH0sCi0vKiByZXRpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg5NzMwIH0KLSAgfSwKLS8qIGJyYTpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGYwMDAgfQotICB9LAotLyogYnJhICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGUwMDAgfQotICB9LAotLyogYm5vOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjEwMCB9Ci0gIH0sCi0vKiBibm8gJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTEwMCB9Ci0gIH0sCi0vKiBiZXE6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmMjAwIH0KLSAgfSwKLS8qIGJlcSAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlMjAwIH0KLSAgfSwKLS8qIGJuZTpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGYzMDAgfQotICB9LAotLyogYm5lICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGUzMDAgfQotICB9LAotLyogYmM6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmNDAwIH0KLSAgfSwKLS8qIGJjICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGU0MDAgfQotICB9LAotLyogYm5jOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjUwMCB9Ci0gIH0sCi0vKiBibmMgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTUwMCB9Ci0gIH0sCi0vKiBibjpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGY2MDAgfQotICB9LAotLyogYm4gJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTYwMCB9Ci0gIH0sCi0vKiBicDpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGY3MDAgfQotICB9LAotLyogYnAgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTcwMCB9Ci0gIH0sCi0vKiBidjpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGY4MDAgfQotICB9LAotLyogYnYgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTgwMCB9Ci0gIH0sCi0vKiBibnY6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmOTAwIH0KLSAgfSwKLS8qIGJudiAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlOTAwIH0KLSAgfSwKLS8qIGJsdDpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGZhMDAgfQotICB9LAotLyogYmx0ICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGVhMDAgfQotICB9LAotLyogYmdlOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZmIwMCB9Ci0gIH0sCi0vKiBiZ2UgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZWIwMCB9Ci0gIH0sCi0vKiBibGU6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmYzAwIH0KLSAgfSwKLS8qIGJsZSAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlYzAwIH0KLSAgfSwKLS8qIGJndDpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGZkMDAgfQotICB9LAotLyogYmd0ICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGVkMDAgfQotICB9LAotLyogYmxzOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZmUwMCB9Ci0gIH0sCi0vKiBibHMgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZWUwMCB9Ci0gIH0sCi0vKiBiaGk6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmZjAwIH0KLSAgfSwKLS8qIGJoaSAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlZjAwIH0KLSAgfSwKLS8qIGRtb3YgJFIxMyxAJGRpcjEwICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUjEzKSwgJywnLCAnQCcsIE9QIChESVIxMCksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzLCB7IDB4MTgwMCB9Ci0gIH0sCi0vKiBkbW92aCAkUjEzLEAkZGlyOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFIxMyksICcsJywgJ0AnLCBPUCAoRElSOSksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzaCwgeyAweDE5MDAgfQotICB9LAotLyogZG1vdmIgJFIxMyxAJGRpcjggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSMTMpLCAnLCcsICdAJywgT1AgKERJUjgpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2IsIHsgMHgxYTAwIH0KLSAgfSwKLS8qIGRtb3YgQCRSMTMrLEAkZGlyMTAgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxMyksICcrJywgJywnLCAnQCcsIE9QIChESVIxMCksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzLCB7IDB4MWMwMCB9Ci0gIH0sCi0vKiBkbW92aCBAJFIxMyssQCRkaXI5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTMpLCAnKycsICcsJywgJ0AnLCBPUCAoRElSOSksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzaCwgeyAweDFkMDAgfQotICB9LAotLyogZG1vdmIgQCRSMTMrLEAkZGlyOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjEzKSwgJysnLCAnLCcsICdAJywgT1AgKERJUjgpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2IsIHsgMHgxZTAwIH0KLSAgfSwKLS8qIGRtb3YgQCRSMTUrLEAkZGlyMTAgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxNSksICcrJywgJywnLCAnQCcsIE9QIChESVIxMCksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzLCB7IDB4MWIwMCB9Ci0gIH0sCi0vKiBkbW92IEAkZGlyMTAsJFIxMyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSMTApLCAnLCcsIE9QIChSMTMpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweDgwMCB9Ci0gIH0sCi0vKiBkbW92aCBAJGRpcjksJFIxMyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSOSksICcsJywgT1AgKFIxMyksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzaCwgeyAweDkwMCB9Ci0gIH0sCi0vKiBkbW92YiBAJGRpcjgsJFIxMyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSOCksICcsJywgT1AgKFIxMyksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzYiwgeyAweGEwMCB9Ci0gIH0sCi0vKiBkbW92IEAkZGlyMTAsQCRSMTMrICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVIxMCksICcsJywgJ0AnLCBPUCAoUjEzKSwgJysnLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweGMwMCB9Ci0gIH0sCi0vKiBkbW92aCBAJGRpcjksQCRSMTMrICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVI5KSwgJywnLCAnQCcsIE9QIChSMTMpLCAnKycsIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzaCwgeyAweGQwMCB9Ci0gIH0sCi0vKiBkbW92YiBAJGRpcjgsQCRSMTMrICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVI4KSwgJywnLCAnQCcsIE9QIChSMTMpLCAnKycsIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzYiwgeyAweGUwMCB9Ci0gIH0sCi0vKiBkbW92IEAkZGlyMTAsQC0kUjE1ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVIxMCksICcsJywgJ0AnLCAnLScsIE9QIChSMTUpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweGIwMCB9Ci0gIH0sCi0vKiBsZHJlcyBAJFJpKywkdTQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJJKSwgJysnLCAnLCcsIE9QIChVNCksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YmMwMCB9Ci0gIH0sCi0vKiBzdHJlcyAkdTQsQCRSaSsgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAnKycsIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YmQwMCB9Ci0gIH0sCi0vKiBjb3BvcCAkdTRjLCRjY2MsJENSaiwkQ1JpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTRDKSwgJywnLCBPUCAoQ0NDKSwgJywnLCBPUCAoQ1JKKSwgJywnLCBPUCAoQ1JJKSwgMCB9IH0sCi0gICAgJiBpZm10X2NvcG9wLCB7IDB4OWZjMCB9Ci0gIH0sCi0vKiBjb3BsZCAkdTRjLCRjY2MsJFJqYywkQ1JpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTRDKSwgJywnLCBPUCAoQ0NDKSwgJywnLCBPUCAoUkpDKSwgJywnLCBPUCAoQ1JJKSwgMCB9IH0sCi0gICAgJiBpZm10X2NvcGxkLCB7IDB4OWZkMCB9Ci0gIH0sCi0vKiBjb3BzdCAkdTRjLCRjY2MsJENSaiwkUmljICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTRDKSwgJywnLCBPUCAoQ0NDKSwgJywnLCBPUCAoQ1JKKSwgJywnLCBPUCAoUklDKSwgMCB9IH0sCi0gICAgJiBpZm10X2NvcHN0LCB7IDB4OWZlMCB9Ci0gIH0sCi0vKiBjb3BzdiAkdTRjLCRjY2MsJENSaiwkUmljICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTRDKSwgJywnLCBPUCAoQ0NDKSwgJywnLCBPUCAoQ1JKKSwgJywnLCBPUCAoUklDKSwgMCB9IH0sCi0gICAgJiBpZm10X2NvcHN0LCB7IDB4OWZmMCB9Ci0gIH0sCi0vKiBub3AgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmYTAgfQotICB9LAotLyogYW5kY2NyICR1OCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU4KSwgMCB9IH0sCi0gICAgJiBpZm10X2ludCwgeyAweDgzMDAgfQotICB9LAotLyogb3JjY3IgJHU4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTgpLCAwIH0gfSwKLSAgICAmIGlmbXRfaW50LCB7IDB4OTMwMCB9Ci0gIH0sCi0vKiBzdGlsbSAkdTggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVOCksIDAgfSB9LAotICAgICYgaWZtdF9pbnQsIHsgMHg4NzAwIH0KLSAgfSwKLS8qIGFkZHNwICRzMTAgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTMTApLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkc3AsIHsgMHhhMzAwIH0KLSAgfSwKLS8qIGV4dHNiICRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTc4MCB9Ci0gIH0sCi0vKiBleHR1YiAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3OTAgfQotICB9LAotLyogZXh0c2ggJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5N2EwIH0KLSAgfSwKLS8qIGV4dHVoICRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTdiMCB9Ci0gIH0sCi0vKiBsZG0wICgkcmVnbGlzdF9sb3dfbGQpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnKCcsIE9QIChSRUdMSVNUX0xPV19MRCksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkbTAsIHsgMHg4YzAwIH0KLSAgfSwKLS8qIGxkbTEgKCRyZWdsaXN0X2hpX2xkKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJygnLCBPUCAoUkVHTElTVF9ISV9MRCksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkbTEsIHsgMHg4ZDAwIH0KLSAgfSwKLS8qIHN0bTAgKCRyZWdsaXN0X2xvd19zdCkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICcoJywgT1AgKFJFR0xJU1RfTE9XX1NUKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RtMCwgeyAweDhlMDAgfQotICB9LAotLyogc3RtMSAoJHJlZ2xpc3RfaGlfc3QpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnKCcsIE9QIChSRUdMSVNUX0hJX1NUKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RtMSwgeyAweDhmMDAgfQotICB9LAotLyogZW50ZXIgJHUxMCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFUxMCksIDAgfSB9LAotICAgICYgaWZtdF9lbnRlciwgeyAweGYwMCB9Ci0gIH0sCi0vKiBsZWF2ZSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OWY5MCB9Ci0gIH0sCi0vKiB4Y2hiIEAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDhhMDAgfQotICB9LAotfTsKLQotI3VuZGVmIEEKLSN1bmRlZiBNTkVNCi0jdW5kZWYgT1BFUkFORAotI3VuZGVmIE9QCi0KLS8qIEZvcm1hdHMgZm9yIEFMSUFTIG1hY3JvLWluc25zLiAgKi8KLQotI2RlZmluZSBGKGYpICYgZnIzMF9jZ2VuX2lmbGRfdGFibGVbQ09OQ0FUMiAoRlIzMF8sZildCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGk4bSA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX0k4KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTIwbSA9IHsKLSAgMTYsIDMyLCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX0kyMCksIEYgKEZfT1AyKSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTMybSA9IHsKLSAgMTYsIDQ4LCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX0kzMiksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX1JJKSwgMCB9Ci19OwotCi0jdW5kZWYgRgotCi0vKiBFYWNoIG5vbi1zaW1wbGUgbWFjcm8gZW50cnkgcG9pbnRzIHRvIGFuIGFycmF5IG9mIGV4cGFuc2lvbiBwb3NzaWJpbGl0aWVzLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSU5TTl8sYSkpCi0jZGVmaW5lIE1ORU0gQ0dFTl9TWU5UQVhfTU5FTU9OSUMgLyogc3ludGF4IHZhbHVlIGZvciBtbmVtb25pYyAqLwotI2RlZmluZSBPUEVSQU5EKG9wKSBDT05DQVQyIChGUjMwX09QRVJBTkRfLG9wKQotI2RlZmluZSBPUChmaWVsZCkgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCAoT1BFUkFORCAoZmllbGQpKQotCi0vKiBUaGUgbWFjcm8gaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JQkFTRSBmcjMwX2NnZW5fbWFjcm9faW5zbl90YWJsZVtdID0KLXsKLS8qIGxkaTggJGk4LCRSaSAqLwotICB7Ci0gICAgLTEsICJsZGk4bSIsICJsZGk4IiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaTIwICRpMjAsJFJpICovCi0gIHsKLSAgICAtMSwgImxkaTIwbSIsICJsZGkyMCIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGkzMiAkaTMyLCRSaSAqLwotICB7Ci0gICAgLTEsICJsZGkzMm0iLCAibGRpMzIiLCA0OCwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotfTsKLQotLyogVGhlIG1hY3JvIGluc3RydWN0aW9uIG9wY29kZSB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX09QQ09ERSBmcjMwX2NnZW5fbWFjcm9faW5zbl9vcGNvZGVfdGFibGVbXSA9Ci17Ci0vKiBsZGk4ICRpOCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChJOCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkaThtLCB7IDB4YzAwMCB9Ci0gIH0sCi0vKiBsZGkyMCAkaTIwLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEkyMCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkaTIwbSwgeyAweDliMDAgfQotICB9LAotLyogbGRpMzIgJGkzMiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChJMzIpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZGkzMm0sIHsgMHg5ZjgwIH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QRVJBTkQKLSN1bmRlZiBPUAotCi0jaWZuZGVmIENHRU5fQVNNX0hBU0hfUAotI2RlZmluZSBDR0VOX0FTTV9IQVNIX1AoaW5zbikgMQotI2VuZGlmCi0KLSNpZm5kZWYgQ0dFTl9ESVNfSEFTSF9QCi0jZGVmaW5lIENHRU5fRElTX0hBU0hfUChpbnNuKSAxCi0jZW5kaWYKLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIElOU04gaXMgdG8gYmUgYWRkZWQgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBUYXJnZXRzIGFyZSBmcmVlIHRvIG92ZXJyaWRlIENHRU5fe0FTTSxESVN9X0hBU0hfUCBpbiB0aGUgLm9wYyBmaWxlLiAgKi8KLQotc3RhdGljIGludAotYXNtX2hhc2hfaW5zbl9wIChpbnNuKQotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci17Ci0gIHJldHVybiBDR0VOX0FTTV9IQVNIX1AgKGluc24pOwotfQotCi1zdGF0aWMgaW50Ci1kaXNfaGFzaF9pbnNuX3AgKGluc24pCi0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLXsKLSAgLyogSWYgYnVpbGRpbmcgdGhlIGhhc2ggdGFibGUgYW5kIHRoZSBOTy1ESVMgYXR0cmlidXRlIGlzIHByZXNlbnQsCi0gICAgIGlnbm9yZS4gICovCi0gIGlmIChDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX05PX0RJUykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBDR0VOX0RJU19IQVNIX1AgKGluc24pOwotfQotCi0jaWZuZGVmIENHRU5fQVNNX0hBU0gKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSF9TSVpFIDEyNwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSChtbmVtKSAoKih1bnNpZ25lZCBjaGFyICopIChtbmVtKSAlIENHRU5fQVNNX0hBU0hfU0laRSkKLSNlbHNlCi0jZGVmaW5lIENHRU5fQVNNX0hBU0gobW5lbSkgKCoodW5zaWduZWQgY2hhciAqKSAobW5lbSkgJSBDR0VOX0FTTV9IQVNIX1NJWkUpIC8qRklYTUUqLwotI2VuZGlmCi0jZW5kaWYKLQotLyogSXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UgdG8gcHJvdmlkZSBhIGRlZmF1bHQgaGVyZSwKLSAgIGJ1dCB3aGlsZSB0aGlzIGlzIHVuZGVyIGRldmVsb3BtZW50IHdlIGRvLgotICAgQlVGRkVSIGlzIGEgcG9pbnRlciB0byB0aGUgYnl0ZXMgb2YgdGhlIGluc24sIHRhcmdldCBvcmRlci4KLSAgIFZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzIGFzIGFuIGludCBpbiBob3N0IG9yZGVyLiAgKi8KLQotI2lmbmRlZiBDR0VOX0RJU19IQVNICi0jZGVmaW5lIENHRU5fRElTX0hBU0hfU0laRSAyNTYKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSChidWYsIHZhbHVlKSAoKih1bnNpZ25lZCBjaGFyICopIChidWYpKQotI2VuZGlmCi0KLS8qIFRoZSByZXN1bHQgaXMgdGhlIGhhc2ggdmFsdWUgb2YgdGhlIGluc24uCi0gICBUYXJnZXRzIGFyZSBmcmVlIHRvIG92ZXJyaWRlIENHRU5fe0FTTSxESVN9X0hBU0ggaW4gdGhlIC5vcGMgZmlsZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWFzbV9oYXNoX2luc24gKG1uZW0pCi0gICAgIGNvbnN0IGNoYXIgKiBtbmVtOwotewotICByZXR1cm4gQ0dFTl9BU01fSEFTSCAobW5lbSk7Ci19Ci0KLS8qIEJVRiBpcyBhIHBvaW50ZXIgdG8gdGhlIGJ5dGVzIG9mIHRoZSBpbnNuLCB0YXJnZXQgb3JkZXIuCi0gICBWQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBhcyBhbiBpbnQgaW4gaG9zdCBvcmRlci4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWRpc19oYXNoX2luc24gKGJ1ZiwgdmFsdWUpCi0gICAgIGNvbnN0IGNoYXIgKiBidWY7Ci0gICAgIENHRU5fSU5TTl9JTlQgdmFsdWU7Ci17Ci0gIHJldHVybiBDR0VOX0RJU19IQVNIIChidWYsIHZhbHVlKTsKLX0KLQotLyogU2V0IHRoZSByZWNvcmRlZCBsZW5ndGggb2YgdGhlIGluc24gaW4gdGhlIENHRU5fRklFTERTIHN0cnVjdC4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfZmllbGRzX2JpdHNpemUgKGZpZWxkcywgc2l6ZSkKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgaW50IHNpemU7Ci17Ci0gIENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykgPSBzaXplOwotfQotCi0vKiBGdW5jdGlvbiB0byBjYWxsIGJlZm9yZSB1c2luZyB0aGUgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZS4KLSAgIFRoaXMgcGx1Z3MgdGhlIG9wY29kZSBlbnRyaWVzIGFuZCBtYWNybyBpbnN0cnVjdGlvbnMgaW50byB0aGUgY3B1IHRhYmxlLiAgKi8KLQotdm9pZAotZnIzMF9jZ2VuX2luaXRfb3Bjb2RlX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaW50IGk7Ci0gIGludCBudW1fbWFjcm9zID0gKHNpemVvZiAoZnIzMF9jZ2VuX21hY3JvX2luc25fdGFibGUpIC8KLQkJICAgIHNpemVvZiAoZnIzMF9jZ2VuX21hY3JvX2luc25fdGFibGVbMF0pKTsKLSAgY29uc3QgQ0dFTl9JQkFTRSAqaWIgPSAmIGZyMzBfY2dlbl9tYWNyb19pbnNuX3RhYmxlWzBdOwotICBjb25zdCBDR0VOX09QQ09ERSAqb2MgPSAmIGZyMzBfY2dlbl9tYWNyb19pbnNuX29wY29kZV90YWJsZVswXTsKLSAgQ0dFTl9JTlNOICppbnNucyA9IChDR0VOX0lOU04gKikgeG1hbGxvYyAobnVtX21hY3JvcyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0gIG1lbXNldCAoaW5zbnMsIDAsIG51bV9tYWNyb3MgKiBzaXplb2YgKENHRU5fSU5TTikpOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX21hY3JvczsgKytpKQotICAgIHsKLSAgICAgIGluc25zW2ldLmJhc2UgPSAmaWJbaV07Ci0gICAgICBpbnNuc1tpXS5vcGNvZGUgPSAmb2NbaV07Ci0gICAgfQotICBjZC0+bWFjcm9faW5zbl90YWJsZS5pbml0X2VudHJpZXMgPSBpbnNuczsKLSAgY2QtPm1hY3JvX2luc25fdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9JQkFTRSk7Ci0gIGNkLT5tYWNyb19pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXMgPSBudW1fbWFjcm9zOwotCi0gIG9jID0gJiBmcjMwX2NnZW5faW5zbl9vcGNvZGVfdGFibGVbMF07Ci0gIGluc25zID0gKENHRU5fSU5TTiAqKSBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXM7Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5TTlM7ICsraSkKLSAgICBpbnNuc1tpXS5vcGNvZGUgPSAmb2NbaV07Ci0KLSAgY2QtPnNpemVvZl9maWVsZHMgPSBzaXplb2YgKENHRU5fRklFTERTKTsKLSAgY2QtPnNldF9maWVsZHNfYml0c2l6ZSA9IHNldF9maWVsZHNfYml0c2l6ZTsKLQotICBjZC0+YXNtX2hhc2hfcCA9IGFzbV9oYXNoX2luc25fcDsKLSAgY2QtPmFzbV9oYXNoID0gYXNtX2hhc2hfaW5zbjsKLSAgY2QtPmFzbV9oYXNoX3NpemUgPSBDR0VOX0FTTV9IQVNIX1NJWkU7Ci0KLSAgY2QtPmRpc19oYXNoX3AgPSBkaXNfaGFzaF9pbnNuX3A7Ci0gIGNkLT5kaXNfaGFzaCA9IGRpc19oYXNoX2luc247Ci0gIGNkLT5kaXNfaGFzaF9zaXplID0gQ0dFTl9ESVNfSEFTSF9TSVpFOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLW9wYy5oIGIvb3Bjb2Rlcy9mcjMwLW9wYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzg3ZWQ1Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBvcGNvZGUgaGVhZGVyIGZvciBmcjMwLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIEZSMzBfT1BDX0gKLSNkZWZpbmUgRlIzMF9PUENfSAotCi0vKiAtLSBvcGMuaCAqLwotCi0vKiA/Pz8gVGhpcyBjYW4gYmUgaW1wcm92ZWQgdXBvbi4gICovCi0jdW5kZWYgQ0dFTl9ESVNfSEFTSF9TSVpFCi0jZGVmaW5lIENHRU5fRElTX0hBU0hfU0laRSAxNgotI3VuZGVmIENHRU5fRElTX0hBU0gKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSChidWZmZXIsIHZhbHVlKSAoKCh1bnNpZ25lZCBjaGFyICopIChidWZmZXIpKVswXSA+PiA0KQotCi0vKiAtLSAqLwotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgZnIzMCBpbnN0cnVjdGlvbiB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9pbnNuX3R5cGUgewotICBGUjMwX0lOU05fSU5WQUxJRCwgRlIzMF9JTlNOX0FERCwgRlIzMF9JTlNOX0FEREksIEZSMzBfSU5TTl9BREQyCi0gLCBGUjMwX0lOU05fQUREQywgRlIzMF9JTlNOX0FERE4sIEZSMzBfSU5TTl9BREROSSwgRlIzMF9JTlNOX0FERE4yCi0gLCBGUjMwX0lOU05fU1VCLCBGUjMwX0lOU05fU1VCQywgRlIzMF9JTlNOX1NVQk4sIEZSMzBfSU5TTl9DTVAKLSAsIEZSMzBfSU5TTl9DTVBJLCBGUjMwX0lOU05fQ01QMiwgRlIzMF9JTlNOX0FORCwgRlIzMF9JTlNOX09SCi0gLCBGUjMwX0lOU05fRU9SLCBGUjMwX0lOU05fQU5ETSwgRlIzMF9JTlNOX0FOREgsIEZSMzBfSU5TTl9BTkRCCi0gLCBGUjMwX0lOU05fT1JNLCBGUjMwX0lOU05fT1JILCBGUjMwX0lOU05fT1JCLCBGUjMwX0lOU05fRU9STQotICwgRlIzMF9JTlNOX0VPUkgsIEZSMzBfSU5TTl9FT1JCLCBGUjMwX0lOU05fQkFOREwsIEZSMzBfSU5TTl9CT1JMCi0gLCBGUjMwX0lOU05fQkVPUkwsIEZSMzBfSU5TTl9CQU5ESCwgRlIzMF9JTlNOX0JPUkgsIEZSMzBfSU5TTl9CRU9SSAotICwgRlIzMF9JTlNOX0JUU1RMLCBGUjMwX0lOU05fQlRTVEgsIEZSMzBfSU5TTl9NVUwsIEZSMzBfSU5TTl9NVUxVCi0gLCBGUjMwX0lOU05fTVVMSCwgRlIzMF9JTlNOX01VTFVILCBGUjMwX0lOU05fRElWMFMsIEZSMzBfSU5TTl9ESVYwVQotICwgRlIzMF9JTlNOX0RJVjEsIEZSMzBfSU5TTl9ESVYyLCBGUjMwX0lOU05fRElWMywgRlIzMF9JTlNOX0RJVjRTCi0gLCBGUjMwX0lOU05fTFNMLCBGUjMwX0lOU05fTFNMSSwgRlIzMF9JTlNOX0xTTDIsIEZSMzBfSU5TTl9MU1IKLSAsIEZSMzBfSU5TTl9MU1JJLCBGUjMwX0lOU05fTFNSMiwgRlIzMF9JTlNOX0FTUiwgRlIzMF9JTlNOX0FTUkkKLSAsIEZSMzBfSU5TTl9BU1IyLCBGUjMwX0lOU05fTERJOCwgRlIzMF9JTlNOX0xESTIwLCBGUjMwX0lOU05fTERJMzIKLSAsIEZSMzBfSU5TTl9MRCwgRlIzMF9JTlNOX0xEVUgsIEZSMzBfSU5TTl9MRFVCLCBGUjMwX0lOU05fTERSMTMKLSAsIEZSMzBfSU5TTl9MRFIxM1VILCBGUjMwX0lOU05fTERSMTNVQiwgRlIzMF9JTlNOX0xEUjE0LCBGUjMwX0lOU05fTERSMTRVSAotICwgRlIzMF9JTlNOX0xEUjE0VUIsIEZSMzBfSU5TTl9MRFIxNSwgRlIzMF9JTlNOX0xEUjE1R1IsIEZSMzBfSU5TTl9MRFIxNURSCi0gLCBGUjMwX0lOU05fTERSMTVQUywgRlIzMF9JTlNOX1NULCBGUjMwX0lOU05fU1RILCBGUjMwX0lOU05fU1RCCi0gLCBGUjMwX0lOU05fU1RSMTMsIEZSMzBfSU5TTl9TVFIxM0gsIEZSMzBfSU5TTl9TVFIxM0IsIEZSMzBfSU5TTl9TVFIxNAotICwgRlIzMF9JTlNOX1NUUjE0SCwgRlIzMF9JTlNOX1NUUjE0QiwgRlIzMF9JTlNOX1NUUjE1LCBGUjMwX0lOU05fU1RSMTVHUgotICwgRlIzMF9JTlNOX1NUUjE1RFIsIEZSMzBfSU5TTl9TVFIxNVBTLCBGUjMwX0lOU05fTU9WLCBGUjMwX0lOU05fTU9WRFIKLSAsIEZSMzBfSU5TTl9NT1ZQUywgRlIzMF9JTlNOX01PVjJEUiwgRlIzMF9JTlNOX01PVjJQUywgRlIzMF9JTlNOX0pNUAotICwgRlIzMF9JTlNOX0pNUEQsIEZSMzBfSU5TTl9DQUxMUiwgRlIzMF9JTlNOX0NBTExSRCwgRlIzMF9JTlNOX0NBTEwKLSAsIEZSMzBfSU5TTl9DQUxMRCwgRlIzMF9JTlNOX1JFVCwgRlIzMF9JTlNOX1JFVF9ELCBGUjMwX0lOU05fSU5UCi0gLCBGUjMwX0lOU05fSU5URSwgRlIzMF9JTlNOX1JFVEksIEZSMzBfSU5TTl9CUkFELCBGUjMwX0lOU05fQlJBCi0gLCBGUjMwX0lOU05fQk5PRCwgRlIzMF9JTlNOX0JOTywgRlIzMF9JTlNOX0JFUUQsIEZSMzBfSU5TTl9CRVEKLSAsIEZSMzBfSU5TTl9CTkVELCBGUjMwX0lOU05fQk5FLCBGUjMwX0lOU05fQkNELCBGUjMwX0lOU05fQkMKLSAsIEZSMzBfSU5TTl9CTkNELCBGUjMwX0lOU05fQk5DLCBGUjMwX0lOU05fQk5ELCBGUjMwX0lOU05fQk4KLSAsIEZSMzBfSU5TTl9CUEQsIEZSMzBfSU5TTl9CUCwgRlIzMF9JTlNOX0JWRCwgRlIzMF9JTlNOX0JWCi0gLCBGUjMwX0lOU05fQk5WRCwgRlIzMF9JTlNOX0JOViwgRlIzMF9JTlNOX0JMVEQsIEZSMzBfSU5TTl9CTFQKLSAsIEZSMzBfSU5TTl9CR0VELCBGUjMwX0lOU05fQkdFLCBGUjMwX0lOU05fQkxFRCwgRlIzMF9JTlNOX0JMRQotICwgRlIzMF9JTlNOX0JHVEQsIEZSMzBfSU5TTl9CR1QsIEZSMzBfSU5TTl9CTFNELCBGUjMwX0lOU05fQkxTCi0gLCBGUjMwX0lOU05fQkhJRCwgRlIzMF9JTlNOX0JISSwgRlIzMF9JTlNOX0RNT1ZSMTMsIEZSMzBfSU5TTl9ETU9WUjEzSAotICwgRlIzMF9JTlNOX0RNT1ZSMTNCLCBGUjMwX0lOU05fRE1PVlIxM1BJLCBGUjMwX0lOU05fRE1PVlIxM1BJSCwgRlIzMF9JTlNOX0RNT1ZSMTNQSUIKLSAsIEZSMzBfSU5TTl9ETU9WUjE1UEksIEZSMzBfSU5TTl9ETU9WMlIxMywgRlIzMF9JTlNOX0RNT1YyUjEzSCwgRlIzMF9JTlNOX0RNT1YyUjEzQgotICwgRlIzMF9JTlNOX0RNT1YyUjEzUEksIEZSMzBfSU5TTl9ETU9WMlIxM1BJSCwgRlIzMF9JTlNOX0RNT1YyUjEzUElCLCBGUjMwX0lOU05fRE1PVjJSMTVQRAotICwgRlIzMF9JTlNOX0xEUkVTLCBGUjMwX0lOU05fU1RSRVMsIEZSMzBfSU5TTl9DT1BPUCwgRlIzMF9JTlNOX0NPUExECi0gLCBGUjMwX0lOU05fQ09QU1QsIEZSMzBfSU5TTl9DT1BTViwgRlIzMF9JTlNOX05PUCwgRlIzMF9JTlNOX0FORENDUgotICwgRlIzMF9JTlNOX09SQ0NSLCBGUjMwX0lOU05fU1RJTE0sIEZSMzBfSU5TTl9BRERTUCwgRlIzMF9JTlNOX0VYVFNCCi0gLCBGUjMwX0lOU05fRVhUVUIsIEZSMzBfSU5TTl9FWFRTSCwgRlIzMF9JTlNOX0VYVFVILCBGUjMwX0lOU05fTERNMAotICwgRlIzMF9JTlNOX0xETTEsIEZSMzBfSU5TTl9TVE0wLCBGUjMwX0lOU05fU1RNMSwgRlIzMF9JTlNOX0VOVEVSCi0gLCBGUjMwX0lOU05fTEVBVkUsIEZSMzBfSU5TTl9YQ0hCLCBGUjMwX0lOU05fTUFYCi19IENHRU5fSU5TTl9UWVBFOwotCi0vKiBJbmRleCBvZiBgaW52YWxpZCcgaW5zbiBwbGFjZSBob2xkZXIuICAqLwotI2RlZmluZSBDR0VOX0lOU05fSU5WQUxJRCBGUjMwX0lOU05fSU5WQUxJRAotCi0vKiBUb3RhbCBudW1iZXIgb2YgaW5zbnMgaW4gdGFibGUuICAqLwotI2RlZmluZSBNQVhfSU5TTlMgKChpbnQpIEZSMzBfSU5TTl9NQVgpCi0KLS8qIFRoaXMgc3RydWN0IHJlY29yZHMgZGF0YSBwcmlvciB0byBpbnNlcnRpb24gb3IgYWZ0ZXIgZXh0cmFjdGlvbi4gICovCi1zdHJ1Y3QgY2dlbl9maWVsZHMKLXsKLSAgaW50IGxlbmd0aDsKLSAgbG9uZyBmX25pbDsKLSAgbG9uZyBmX29wMTsKLSAgbG9uZyBmX29wMjsKLSAgbG9uZyBmX29wMzsKLSAgbG9uZyBmX29wNDsKLSAgbG9uZyBmX29wNTsKLSAgbG9uZyBmX2NjOwotICBsb25nIGZfY2NjOwotICBsb25nIGZfUmo7Ci0gIGxvbmcgZl9SaTsKLSAgbG9uZyBmX1JzMTsKLSAgbG9uZyBmX1JzMjsKLSAgbG9uZyBmX1JqYzsKLSAgbG9uZyBmX1JpYzsKLSAgbG9uZyBmX0NSajsKLSAgbG9uZyBmX0NSaTsKLSAgbG9uZyBmX3U0OwotICBsb25nIGZfdTRjOwotICBsb25nIGZfaTQ7Ci0gIGxvbmcgZl9tNDsKLSAgbG9uZyBmX3U4OwotICBsb25nIGZfaTg7Ci0gIGxvbmcgZl9pMjBfNDsKLSAgbG9uZyBmX2kyMF8xNjsKLSAgbG9uZyBmX2kyMDsKLSAgbG9uZyBmX2kzMjsKLSAgbG9uZyBmX3VkaXNwNjsKLSAgbG9uZyBmX2Rpc3A4OwotICBsb25nIGZfZGlzcDk7Ci0gIGxvbmcgZl9kaXNwMTA7Ci0gIGxvbmcgZl9zMTA7Ci0gIGxvbmcgZl91MTA7Ci0gIGxvbmcgZl9yZWw5OwotICBsb25nIGZfZGlyODsKLSAgbG9uZyBmX2Rpcjk7Ci0gIGxvbmcgZl9kaXIxMDsKLSAgbG9uZyBmX3JlbDEyOwotICBsb25nIGZfcmVnbGlzdF9oaV9zdDsKLSAgbG9uZyBmX3JlZ2xpc3RfbG93X3N0OwotICBsb25nIGZfcmVnbGlzdF9oaV9sZDsKLSAgbG9uZyBmX3JlZ2xpc3RfbG93X2xkOwotfTsKLQotI2RlZmluZSBDR0VOX0lOSVRfUEFSU0Uob2QpIFwKLXtcCi19Ci0jZGVmaW5lIENHRU5fSU5JVF9JTlNFUlQob2QpIFwKLXtcCi19Ci0jZGVmaW5lIENHRU5fSU5JVF9FWFRSQUNUKG9kKSBcCi17XAotfQotI2RlZmluZSBDR0VOX0lOSVRfUFJJTlQob2QpIFwKLXtcCi19Ci0KLQotI2VuZGlmIC8qIEZSMzBfT1BDX0ggKi8KZGlmZiAtLWdpdCBhL29wY29kZXMvaDgzMDAtZGlzLmMgYi9vcGNvZGVzL2g4MzAwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc1M2E5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvaDgzMDAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTcgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgaDgzMDAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIERFRklORV9UQUJMRQotCi0jZGVmaW5lIGg4X29wY29kZXMgaDhvcHMKLSNpbmNsdWRlICJvcGNvZGUvaDgzMDAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLQotLyogUnVuIHRocm91Z2ggdGhlIG9wY29kZXMgYW5kIHNvcnQgdGhlbSBpbnRvIG9yZGVyIHRvIG1ha2UgdGhlbSBlYXN5Ci0gICB0byBkaXNhc3NlbWJsZQotICovCi1zdGF0aWMgdm9pZAotYmZkX2g4X2Rpc2Fzc2VtYmxlX2luaXQgKCkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLQotICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOwotCi0gIGZvciAocCA9IGg4X29wY29kZXM7IHAtPm5hbWU7IHArKykKLSAgICB7Ci0gICAgICBpbnQgbjEgPSAwOwotICAgICAgaW50IG4yID0gMDsKLQotICAgICAgaWYgKChpbnQpIHAtPmRhdGEubmliWzBdIDwgMTYpCi0JewotCSAgbjEgPSAoaW50KSBwLT5kYXRhLm5pYlswXTsKLQl9Ci0gICAgICBlbHNlCi0JbjEgPSAwOwotICAgICAgaWYgKChpbnQpIHAtPmRhdGEubmliWzFdIDwgMTYpCi0JewotCSAgbjIgPSAoaW50KSBwLT5kYXRhLm5pYlsxXTsKLQl9Ci0gICAgICBlbHNlCi0JbjIgPSAwOwotCi0gICAgICAvKiBKdXN0IG1ha2Ugc3VyZSB0aGVyZSBhcmUgYW4gZXZlbiBudW1iZXIgb2YgbmliYmxlcyBpbiBpdCwgYW5kCi0JIHRoYXQgdGhlIGNvdW50IGlzIHRoZSBzYW1lIHMgdGhlIGxlbmd0aCAqLwotICAgICAgZm9yIChpID0gMDsgcC0+ZGF0YS5uaWJbaV0gIT0gRTsgaSsrKQotCS8qRU1QVFkqLyA7Ci0gICAgICBpZiAoaSAmIDEpCi0JYWJvcnQgKCk7Ci0gICAgICBwLT5sZW5ndGggPSBpIC8gMjsKLSAgICB9Ci0KLX0KLQotCi11bnNpZ25lZCBpbnQKLWJmZF9oOF9kaXNhc3NlbWJsZSAoYWRkciwgaW5mbywgbW9kZSkKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBpbnQgbW9kZTsKLXsKLSAgLyogRmluZCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHRhYmxlIGZvciB0aGlzIG9wY29kZSAqLwotICBzdGF0aWMgQ09OU1QgY2hhciAqcmVnbmFtZXNbXSA9Ci0gICAgewotICAgICAgInIwaCIsICJyMWgiLCAicjJoIiwgInIzaCIsICJyNGgiLCAicjVoIiwgInI2aCIsICJyN2giLAotICAgICAgInIwbCIsICJyMWwiLCAicjJsIiwgInIzbCIsICJyNGwiLCAicjVsIiwgInI2bCIsICJyN2wifTsKLSAgCi0gIHN0YXRpYyBDT05TVCBjaGFyICp3cmVnbmFtZXNbXSA9Ci0gICAgewotICAgICAgInIwIiwgInIxIiwgInIyIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwKLSAgICAgICJlMCIsICJlMSIsICJlMiIsICJlMyIsICJlNCIsICJlNSIsICJlNiIsICJlNyIKLSAgICAgIH07Ci0gIAotICBzdGF0aWMgQ09OU1QgY2hhciAqbHJlZ25hbWVzW10gPQotICAgIHsKLSAgICAgICJlcjAiLCAiZXIxIiwgImVyMiIsICJlcjMiLCAiZXI0IiwgImVyNSIsICJlcjYiLCAiZXI3IiwKLSAgICAgICJlcjAiLCAiZXIxIiwgImVyMiIsICJlcjMiLCAiZXI0IiwgImVyNSIsICJlcjYiLCAiZXI3IgotICAgICAgfQotICA7Ci0KLSAgaW50IHJzID0gMDsKLSAgaW50IHJkID0gMDsKLSAgaW50IHJkaXNwID0gMDsKLSAgaW50IGFicyA9IDA7Ci0gIGludCBiaXQgPSAwOwotICBpbnQgcGxlbiA9IDA7Ci0gIHN0YXRpYyBib29sZWFuIGluaXQgPSAwOwotICBzdHJ1Y3QgaDhfb3Bjb2RlICpxID0gaDhfb3Bjb2RlczsKLSAgY2hhciBDT05TVCAqKnByZWduYW1lcyA9IG1vZGUgIT0gMCA/IGxyZWduYW1lcyA6IHdyZWduYW1lczsKLSAgaW50IHN0YXR1czsKLSAgaW50IGw7Ci0gIAotICB1bnNpZ25lZCBjaGFyIGRhdGFbMjBdOyAgCi0gIHZvaWQgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgZnByaW50Zl9mdHlwZSBmcHJpbnRmID0gaW5mby0+ZnByaW50Zl9mdW5jOwotCi0gIGlmICghaW5pdCkKLSAgICB7Ci0gICAgICBiZmRfaDhfZGlzYXNzZW1ibGVfaW5pdCAoKTsKLSAgICAgIGluaXQgPSAxOwotICAgIH0KLQotICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jKGFkZHIsIGRhdGEsIDIsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApIAotICAgIHsKLSAgICAgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKHN0YXR1cywgYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBmb3IgKGwgPSAyOyBzdGF0dXMgPT0gMCAmJiBsIDwgMTA7IGwrPTIpCi0gICAgewotICAgICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyhhZGRyK2wsIGRhdGErbCwgMiwgaW5mbyk7Ci0gICAgfQotICAKLSAgCi0KLSAgLyogRmluZCB0aGUgZXhhY3Qgb3Bjb2RlL2FyZyBjb21ibyAqLwotICB3aGlsZSAocS0+bmFtZSkKLSAgICB7Ci0gICAgICBvcF90eXBlICpuaWI7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuID0gMDsKLQotICAgICAgbmliID0gcS0+ZGF0YS5uaWI7Ci0gICAgICAKLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIG9wX3R5cGUgbG9va2luZ19mb3IgPSAqbmliOwotCSAgaW50IHRoaXNuaWIgPSBkYXRhW2xlbiA+PiAxXTsKLQkgIAotCSAgdGhpc25pYiA9IChsZW4gJiAxKSA/ICh0aGlzbmliICYgMHhmKSA6ICgodGhpc25pYiA+PiA0KSAmIDB4Zik7Ci0JICAKLQkgIGlmIChsb29raW5nX2ZvciA8IDE2ICYmIGxvb2tpbmdfZm9yID49MCkgCi0JICAgIHsKLQkgICAgICAKLQkgICAgICBpZiAobG9va2luZ19mb3IgIT0gdGhpc25pYikgCi0JCWdvdG8gZmFpbDsKLQkgICAgfQotCSAgCi0JICBlbHNlIAotCSAgICB7Ci0JICAgICAgCi0JICAgICAgaWYgKChpbnQpIGxvb2tpbmdfZm9yICYgKGludCkgQjMxKQotCQl7Ci0JCSAgaWYgKCEgKCgoaW50KSB0aGlzbmliICYgMHg4KSAhPSAwKSkgCi0JCSAgICBnb3RvIGZhaWw7Ci0JCSAgbG9va2luZ19mb3IgPSAob3BfdHlwZSkgKChpbnQpIGxvb2tpbmdfZm9yICYgfihpbnQpIEIzMSk7Ci0JCX0KLQkgICAgICBpZiAoKGludCkgbG9va2luZ19mb3IgJiAoaW50KSBCMzApCi0JCXsKLQkJICBpZiAoISgoKGludCkgdGhpc25pYiAmIDB4OCkgPT0gMCkpIAotCQkgICAgZ290byBmYWlsOwotCQkgIGxvb2tpbmdfZm9yID0gKG9wX3R5cGUpICgoaW50KSBsb29raW5nX2ZvciAmIH4oaW50KSBCMzApOwotCQl9Ci0KLQkgICAgICBpZiAobG9va2luZ19mb3IgJiBEQklUKQotCQl7Ci0JCSAgaWYgKChsb29raW5nX2ZvciAmIDUpICE9ICh0aGlzbmliICY1KSkgZ290byBmYWlsOwotCQkgIGFicyA9ICh0aGlzbmliICYgMHg4KSA/IDIgOiAxOwotCQl9CQkgIAotCSAgICAgIAotCSAgICAgIGVsc2UgIGlmIChsb29raW5nX2ZvciAmIChSRUcgfCBJTkR8SU5DfERFQykpCi0JCXsKLQkJICBpZiAobG9va2luZ19mb3IgJiBTUkMpCi0JCSAgICB7Ci0JCSAgICAgIHJzID0gdGhpc25pYjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHJkID0gdGhpc25pYjsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF8xNikKLQkJewotCQkgIGFicyA9IChkYXRhW2xlbiA+PiAxXSkgKiAyNTYgKyBkYXRhWyhsZW4gKyAyKSA+PiAxXTsKLQkJICBwbGVuID0gMTY7Ci0JICAgICAgCi0JCX0KLQkgICAgICBlbHNlIGlmKGxvb2tpbmdfZm9yICYgQUJTSk1QKQotCQl7Ci0JCSAgYWJzID0KLQkJICAgIChkYXRhWzFdIDw8IDE2KQotCQkgICAgICB8IChkYXRhWzJdIDw8IDgpCi0JCQl8IChkYXRhWzNdKTsKLQkJfQotCSAgICAgIGVsc2UgaWYobG9va2luZ19mb3IgJiBNRU1JTkQpCi0JCXsKLQkJICBhYnMgPSBkYXRhWzFdOwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzMyKQotCQl7Ci0JCSAgaW50IGkgPSBsZW4gPj4gMTsKLQkJICBhYnMgPSAoZGF0YVtpXSA8PCAyNCkKLQkJICAgIHwgKGRhdGFbaSArIDFdIDw8IDE2KQotCQkgICAgICB8IChkYXRhW2kgKyAyXSA8PCA4KQotCQkJfCAoZGF0YVtpKyAzXSk7Ci0KLQkJICBwbGVuID0zMjsKLQkgICAgICAKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF8yNCkKLQkJewotCQkgIGludCBpID0gbGVuID4+IDE7Ci0JCSAgYWJzID0gKGRhdGFbaV0gPDwgMTYpIHwgKGRhdGFbaSArIDFdIDw8IDgpfCAgKGRhdGFbaSsyXSk7Ci0JCSAgcGxlbiA9MjQ7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIElHTk9SRSkKLQkJewotCQkgIAotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBESVNQUkVHKQotCQl7Ci0JCSAgcmRpc3AgPSB0aGlzbmliOwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBLQklUKQotCQl7Ci0JCSAgc3dpdGNoICh0aGlzbmliKSAKLQkJICAgIHsKLQkJICAgIGNhc2UgOToKLQkJICAgICAgYWJzID0gNDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDg6Ci0JCSAgICAgIGFicyA9IDI7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAwOgotCQkgICAgICBhYnMgPSAxOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGdvdG8gZmFpbDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF84KQotCQl7Ci0JCSAgcGxlbiA9IDg7CQkgIAotCQkgIGFicyA9IGRhdGFbbGVuID4+IDFdOwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzMpCi0JCXsKLQkJICBiaXQgPSB0aGlzbmliICYgMHg3OwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzIpCi0JCXsKLQkJICBwbGVuID0gMjsKLQkJICBhYnMgPSB0aGlzbmliICYgMHgzOwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBNQUNSRUcpCi0JCXsKLQkJICBhYnMgPSAodGhpc25pYiA9PSAzKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yID09IEUpCi0JCXsKLQotCQkgIHsKLQkJICAgIGludCBpOwotCi0JCSAgICBmb3IgKGkgPSAwOyBpIDwgcS0+bGVuZ3RoOyBpKyspCi0JCSAgICAgIHsKLQkJCWZwcmludGYgKHN0cmVhbSwgIiUwMnggIiwgZGF0YVtpXSk7Ci0JCSAgICAgIH0KLQkJICAgIGZvciAoOyBpIDwgNjsgaSsrKQotCQkgICAgICB7Ci0JCQlmcHJpbnRmIChzdHJlYW0sICIgICAiKTsKLQkJICAgICAgfQotCQkgIH0KLQkJICBmcHJpbnRmIChzdHJlYW0sICIlc1x0IiwgcS0+bmFtZSk7Ci0KLQkJICAvKiBHcm9zcy4gIERpc2d1c3RpbmcuICAqLwotCQkgIGlmIChzdHJjbXAgKHEtPm5hbWUsICJsZG0ubCIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGludCBjb3VudCwgaGlnaDsKLQotCQkgICAgICBjb3VudCA9IChkYXRhWzFdID4+IDQpICYgMHgzOwotCQkgICAgICBoaWdoID0gZGF0YVszXSAmIDB4NzsKLQotCQkgICAgICBmcHJpbnRmIChzdHJlYW0sICJAc3ArLGVyJWQtZXIlZCIsIGhpZ2ggLSBjb3VudCwgaGlnaCk7Ci0JCSAgICAgIHJldHVybiBxLT5sZW5ndGg7Ci0JCSAgICB9Ci0KLQkJICBpZiAoc3RyY21wIChxLT5uYW1lLCAic3RtLmwiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBpbnQgY291bnQsIGxvdzsKLQotCQkgICAgICBjb3VudCA9IChkYXRhWzFdID4+IDQpICYgMHgzOwotCQkgICAgICBsb3cgPSBkYXRhWzNdICYgMHg3OwotCi0JCSAgICAgIGZwcmludGYgKHN0cmVhbSwgImVyJWQtZXIlZCxALXNwIiwgbG93LCBsb3cgKyBjb3VudCk7Ci0JCSAgICAgIHJldHVybiBxLT5sZW5ndGg7Ci0JCSAgICB9Ci0KLQkJICAvKiBGaWxsIGluIHRoZSBhcmdzICovCi0JCSAgewotCQkgICAgb3BfdHlwZSAqYXJncyA9IHEtPmFyZ3MubmliOwotCQkgICAgaW50IGhhZG9uZSA9IDA7Ci0KLQotCQkgICAgd2hpbGUgKCphcmdzICE9IEUpCi0JCSAgICAgIHsKLQkJCWludCB4ID0gKmFyZ3M7Ci0JCQlpZiAoaGFkb25lKQotCQkJICBmcHJpbnRmIChzdHJlYW0sICIsIik7Ci0KLQotCQkJaWYgKHggJiBMXzMpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICIjMHgleCIsICh1bnNpZ25lZCkgYml0KTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIChJTU18S0JJVHxEQklUKSkKLQkJCSAgewotCQkJICAgIC8qIEJsZXRjaC4gIEZvciBzaGFsICMyLGVyMCBhbmQgZnJpZW5kcy4gICovCi0JCQkgICAgaWYgKCooYXJncysxKSAmIFNSQ19JTl9EU1QpCi0JCQkgICAgICBhYnMgPSAyOwotCi0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiIzB4JXgiLCAodW5zaWduZWQpIGFicyk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBSRUcpCi0JCQkgIHsKLQkJCSAgICBpbnQgcm4gPSAoeCAmIERTVCkgPyByZCA6IHJzOwotCQkJICAgIHN3aXRjaCAoeCAmIFNJWkUpCi0JCQkgICAgICB7Ci0JCQkgICAgICBjYXNlIExfODoKLQkJCQlmcHJpbnRmIChzdHJlYW0sICIlcyIsIHJlZ25hbWVzW3JuXSk7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBjYXNlIExfMTY6Ci0JCQkJZnByaW50ZiAoc3RyZWFtLCAiJXMiLCB3cmVnbmFtZXNbcm5dKTsKLQkJCQlicmVhazsKLQkJCSAgICAgIGNhc2UgTF9QOgotCQkJICAgICAgY2FzZSBMXzMyOgotCQkJCWZwcmludGYgKHN0cmVhbSwgIiVzIiwgbHJlZ25hbWVzW3JuXSk7Ci0JCQkJYnJlYWs7Ci0JCSAgICAKLQkJCSAgICAgIH0KLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIE1BQ1JFRykKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIm1hYyVjIiwgYWJzID8gJ2wnIDogJ2gnKTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIElOQykKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAlcysiLCBwcmVnbmFtZXNbcnNdKTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIERFQykKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAtJXMiLCBwcmVnbmFtZXNbcmRdKTsKLQkJCSAgfQotCi0JCQllbHNlIGlmICh4ICYgSU5EKQotCQkJICB7Ci0JCQkgICAgaW50IHJuID0gKHggJiBEU1QpID8gcmQgOiByczsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAJXMiLCBwcmVnbmFtZXNbcm5dKTsKLQkJCSAgfQotCi0JCQllbHNlIGlmICh4ICYgQUJTOE1FTSkKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAweCV4OjgiLCAodW5zaWduZWQpIGFicyk7Ci0JCQkgIH0KLQotCQkJZWxzZSBpZiAoeCAmIChBQlN8QUJTSk1QKSkKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAweCV4OiVkIiwgKHVuc2lnbmVkKSBhYnMsIHBsZW4pOwotCQkJICB9Ci0KLQkJCWVsc2UgaWYgKHggJiBNRU1JTkQpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAQCVkICgleCkiLCBhYnMsIGFicyk7Ci0JCQkgIH0KLQotCQkJZWxzZSBpZiAoeCAmIFBDUkVMKQotCQkJICB7Ci0JCQkgICAgaWYgKHggJiBMXzE2KSAKLQkJCSAgICAgIHsKLQkJCQlhYnMgICs9MjsKLQkJCQlmcHJpbnRmIChzdHJlYW0sICIuJXMlZCAoJXgpIiwgKHNob3J0KSBhYnMgPiAwID8gIisiIDogIiIsIChzaG9ydCkgYWJzLAotCQkJCQkgYWRkciArIChzaG9ydCkgYWJzICsgMik7Ci0JCQkgICAgICB9Ci0JCQkgICAgZWxzZSB7Ci0JCQkgICAgICBmcHJpbnRmIChzdHJlYW0sICIuJXMlZCAoJXgpIiwgKGNoYXIpIGFicyA+IDAgPyAiKyIgOiAiIiwgKGNoYXIpIGFicywKLQkJCQkgICAgICAgYWRkciArIChjaGFyKSBhYnMgKyAyKTsKLQkJCSAgICB9Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBESVNQKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiQCgweCV4OiVkLCVzKSIsIGFicyxwbGVuLCBwcmVnbmFtZXNbcmRpc3BdKTsKLQkJCSAgfQotCi0JCQllbHNlIGlmICh4ICYgQ0NSKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiY2NyIik7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBFWFIpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJleHIiKTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJICBmcHJpbnRmIChzdHJlYW0sIF8oIkhtbW1tICV4IiksIHgpOwotCQkJaGFkb25lID0gMTsKLQkJCWFyZ3MrKzsKLQkJICAgICAgfQotCQkgIH0KLQkJICByZXR1cm4gcS0+bGVuZ3RoOwotCQl9Ci0KLSAgICAgIAotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCSAgZnByaW50ZiAoc3RyZWFtLCBfKCJEb24ndCB1bmRlcnN0YW5kICV4IFxuIiksIGxvb2tpbmdfZm9yKTsKLQkJfQotCSAgICB9Ci0JICAKLQkgIGxlbisrOwotCSAgbmliKys7Ci0JfQotICAgICAgCi0gICAgZmFpbDoKLSAgICAgIHErKzsKLSAgICB9Ci0KLSAgLyogRmVsbCBvZiB0aGUgZW5kICovCi0gIGZwcmludGYgKHN0cmVhbSwgIiUwMnggJTAyeCAgICAgICAgLndvcmRcdEgnJXgsSCcleCIsCi0JICAgZGF0YVswXSwgZGF0YVsxXSwKLQkgICBkYXRhWzBdLCBkYXRhWzFdKTsKLSAgcmV0dXJuIDI7Ci19Ci0KLWludCAKLXByaW50X2luc25faDgzMDAgKGFkZHIsIGluZm8pCi1iZmRfdm1hIGFkZHI7IAotZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIGJmZF9oOF9kaXNhc3NlbWJsZSAoYWRkciwgaW5mbyAsIDApOwotfQotCi1pbnQgCi1wcmludF9pbnNuX2g4MzAwaCAoYWRkciwgaW5mbykKLWJmZF92bWEgYWRkcjsKLWRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBiZmRfaDhfZGlzYXNzZW1ibGUgKGFkZHIsIGluZm8gLCAxKTsKLX0KLQotaW50IAotcHJpbnRfaW5zbl9oODMwMHMgKGFkZHIsIGluZm8pCi1iZmRfdm1hIGFkZHI7Ci1kaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gYmZkX2g4X2Rpc2Fzc2VtYmxlIChhZGRyLCBpbmZvICwgMik7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2g4NTAwLWRpcy5jIGIvb3Bjb2Rlcy9oODUwMC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY4NThjOS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2g4NTAwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIGg4NTAwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBESVNBU1NFTUJMRVJfVEFCTEUKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0KLSNpbmNsdWRlICJoODUwMC1vcGMuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIE1heGltdW0gbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUFYTEVOIDgKLQotI2luY2x1ZGUgPHNldGptcC5oPgotCi1zdHJ1Y3QgcHJpdmF0ZQotewotICAvKiBQb2ludHMgdG8gZmlyc3QgYnl0ZSBub3QgZmV0Y2hlZC4gICovCi0gIGJmZF9ieXRlICptYXhfZmV0Y2hlZDsKLSAgYmZkX2J5dGUgdGhlX2J1ZmZlcltNQVhMRU5dOwotICBiZmRfdm1hIGluc25fc3RhcnQ7Ci0gIGptcF9idWYgYmFpbG91dDsKLX07Ci0KLS8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKLSAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcwotICAgb24gZXJyb3IuICAqLwotI2RlZmluZSBGRVRDSF9EQVRBKGluZm8sIGFkZHIpIFwKLSAgKChhZGRyKSA8PSAoKHN0cnVjdCBwcml2YXRlICopKGluZm8tPnByaXZhdGVfZGF0YSkpLT5tYXhfZmV0Y2hlZCBcCi0gICA/IDEgOiBmZXRjaF9kYXRhICgoaW5mbyksIChhZGRyKSkpCi0KLXN0YXRpYyBpbnQKLWZldGNoX2RhdGEgKGluZm8sIGFkZHIpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgaW50IHN0YXR1czsKLSAgc3RydWN0IHByaXZhdGUgKnByaXYgPSAoc3RydWN0IHByaXZhdGUgKikgaW5mby0+cHJpdmF0ZV9kYXRhOwotICBiZmRfdm1hIHN0YXJ0ID0gcHJpdi0+aW5zbl9zdGFydCArIChwcml2LT5tYXhfZmV0Y2hlZCAtIHByaXYtPnRoZV9idWZmZXIpOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHN0YXJ0LAotCQkJCSAgICAgIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGFkZHIgLSBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHN0YXJ0LCBpbmZvKTsKLSAgICAgIGxvbmdqbXAgKHByaXYtPmJhaWxvdXQsIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHByaXYtPm1heF9mZXRjaGVkID0gYWRkcjsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjaGFyICpjcm5hbWVbXSA9Ci17InNyIiwgImNjciIsICIqIiwgImJyIiwgImVwIiwgImRwIiwgIioiLCAidHAifTsKLQotaW50Ci1wcmludF9pbnNuX2g4NTAwIChhZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGg4NTAwX29wY29kZV9pbmZvICpvcGNvZGU7Ci0gIHZvaWQgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgZnByaW50Zl9mdHlwZSBmdW5jID0gaW5mby0+ZnByaW50Zl9mdW5jOwotCi0gIHN0cnVjdCBwcml2YXRlIHByaXY7Ci0gIGJmZF9ieXRlICpidWZmZXIgPSBwcml2LnRoZV9idWZmZXI7Ci0KLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgJiBwcml2OwotICBwcml2Lm1heF9mZXRjaGVkID0gcHJpdi50aGVfYnVmZmVyOwotICBwcml2Lmluc25fc3RhcnQgPSBhZGRyOwotICBpZiAoc2V0am1wIChwcml2LmJhaWxvdXQpICE9IDApCi0gICAgLyogRXJyb3IgcmV0dXJuLiAgKi8KLSAgICByZXR1cm4gLTE7Ci0KLWlmICgwKSAgewotICAgIHN0YXRpYyAgICBpbnQgb25lOwotICAgIGlmICghb25lICkgCi0gICAgICB7Ci0Jb25lID0gMTsKLQlmb3IgKG9wY29kZSA9IGg4NTAwX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotCSAgewotCSAgICBpZiAoKG9wY29kZS0+Ynl0ZXNbMF0uY29udGVudHMgJiAweDgpID09IDApCi0JICAgICAgcHJpbnRmKCIlc1xuIiwgb3Bjb2RlLT5uYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0KLSAgLyogUnVuIGRvd24gdGhlIHRhYmxlIHRvIGZpbmQgdGhlIG9uZSB3aGljaCBtYXRjaGVzICovCi0gIGZvciAob3Bjb2RlID0gaDg1MDBfdGFibGU7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCi0gICAgewotICAgICAgaW50IGJ5dGU7Ci0gICAgICBpbnQgcm4gPSAwOwotICAgICAgaW50IHJkID0gMDsKLSAgICAgIGludCBycyA9IDA7Ci0gICAgICBpbnQgZGlzcCA9IDA7Ci0gICAgICBpbnQgYWJzID0gMDsKLSAgICAgIGludCBpbW0gPSAwOwotICAgICAgaW50IHBjcmVsID0gMDsKLSAgICAgIGludCBxaW0gPSAwOwotICAgICAgaW50IGk7Ci0gICAgICBpbnQgY3IgPSAwOwotICAgICAgZm9yIChieXRlID0gMDsgYnl0ZSA8IG9wY29kZS0+bGVuZ3RoOyBieXRlKyspCi0JewotCSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgYnl0ZSArIDEpOwotCSAgaWYgKChidWZmZXJbYnl0ZV0gJiBvcGNvZGUtPmJ5dGVzW2J5dGVdLm1hc2spCi0JICAgICAgIT0gKG9wY29kZS0+Ynl0ZXNbYnl0ZV0uY29udGVudHMpKQotCSAgICB7Ci0JICAgICAgZ290byBuZXh0OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBleHRyYWN0IGFueSBpbmZvIHBhcnRzICovCi0JICAgICAgc3dpdGNoIChvcGNvZGUtPmJ5dGVzW2J5dGVdLmluc2VydCkKLQkJewotCQljYXNlIDA6Ci0JCWNhc2UgRlA6Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJICBmdW5jIChzdHJlYW0sIF8oImNhbid0IGNvcGUgd2l0aCBpbnNlcnQgJWRcbiIpLAotCQkJb3Bjb2RlLT5ieXRlc1tieXRlXS5pbnNlcnQpOwotCQkgIGJyZWFrOwotCQljYXNlIFJOOgotCQkgIHJuID0gYnVmZmVyW2J5dGVdICYgMHg3OwotCQkgIGJyZWFrOwotCQljYXNlIFJTOgotCQkgIHJzID0gYnVmZmVyW2J5dGVdICYgMHg3OwotCQkgIGJyZWFrOwotCQljYXNlIENSQjoKLQkJICBjciA9IGJ1ZmZlcltieXRlXSAmIDB4NzsKLQkJICBpZiAoY3IgPT0gMCkKLQkJICAgIGdvdG8gbmV4dDsKLQkJICBicmVhazsKLQkJY2FzZSBDUlc6Ci0JCSAgY3IgPSBidWZmZXJbYnl0ZV0gJiAweDc7Ci0JCSAgaWYgKGNyICE9IDApCi0JCSAgICBnb3RvIG5leHQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgRElTUDE2OgotCQkgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIGJ5dGUgKyAyKTsKLQkJICBkaXNwID0gKGJ1ZmZlcltieXRlXSA8PCA4KSB8IChidWZmZXJbYnl0ZSArIDFdKTsKLQkJICBicmVhazsKLQkJY2FzZSBGUElORF9EODoKLQkJY2FzZSBESVNQODoKLQkJICBkaXNwID0gKChjaGFyKSAoYnVmZmVyW2J5dGVdKSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUkQ6Ci0JCWNhc2UgUkRJTkQ6Ci0JCSAgcmQgPSBidWZmZXJbYnl0ZV0gJiAweDc7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTMjQ6Ci0JCSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgYnl0ZSArIDMpOwotCQkgIGFicyA9Ci0JCSAgICAoYnVmZmVyW2J5dGVdIDw8IDE2KQotCQkgICAgfCAoYnVmZmVyW2J5dGUgKyAxXSA8PCA4KQotCQkgICAgfCAoYnVmZmVyW2J5dGUgKyAyXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTMTY6Ci0JCSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgYnl0ZSArIDIpOwotCQkgIGFicyA9IChidWZmZXJbYnl0ZV0gPDwgOCkgfCAoYnVmZmVyW2J5dGUgKyAxXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTODoKLQkJICBhYnMgPSAoYnVmZmVyW2J5dGVdKTsKLQkJICBicmVhazsKLQkJY2FzZSBJTU0xNjoKLQkJICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyBieXRlICsgMik7Ci0JCSAgaW1tID0gKGJ1ZmZlcltieXRlXSA8PCA4KSB8IChidWZmZXJbYnl0ZSArIDFdKTsKLQkJICBicmVhazsKLQkJY2FzZSBJTU00OgotCQkgIGltbSA9IChidWZmZXJbYnl0ZV0pICYgMHhmOwotCQkgIGJyZWFrOwotCQljYXNlIElNTTg6Ci0JCWNhc2UgUkxJU1Q6Ci0JCSAgaW1tID0gKGJ1ZmZlcltieXRlXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUENSRUwxNjoKLQkJICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyBieXRlICsgMik7Ci0JCSAgcGNyZWwgPSAoYnVmZmVyW2J5dGVdIDw8IDgpIHwgKGJ1ZmZlcltieXRlICsgMV0pOwotCQkgIGJyZWFrOwotCQljYXNlIFBDUkVMODoKLQkJICBwY3JlbCA9IChidWZmZXJbYnl0ZV0pOwotCQkgIGJyZWFrOwotCQljYXNlIFFJTToKLQkJICBzd2l0Y2ggKGJ1ZmZlcltieXRlXSAmIDB4NykKLQkJICAgIHsKLQkJICAgIGNhc2UgMDoKLQkJICAgICAgcWltID0gMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDE6Ci0JCSAgICAgIHFpbSA9IDI7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSA0OgotCQkgICAgICBxaW0gPSAtMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDU6Ci0JCSAgICAgIHFpbSA9IC0yOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICAvKiBXZSBnZXQgaGVyZSB3aGVuIGFsbCB0aGUgbWFza3MgaGF2ZSBwYXNzZWQgc28gd2UgY2FuIG91dHB1dCB0aGUKLQkgb3BlcmFuZHMqLwotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgb3Bjb2RlLT5sZW5ndGgpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG9wY29kZS0+bGVuZ3RoOyBpKyspCi0JewotCSAgKGZ1bmMpIChzdHJlYW0sICIlMDJ4ICIsIGJ1ZmZlcltpXSk7Ci0JfQotICAgICAgZm9yICg7IGkgPCA2OyBpKyspCi0JewotCSAgKGZ1bmMpIChzdHJlYW0sICIgICAiKTsKLQl9Ci0gICAgICAoZnVuYykgKHN0cmVhbSwgIiVzXHQiLCBvcGNvZGUtPm5hbWUpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG9wY29kZS0+bmFyZ3M7IGkrKykKLQl7Ci0JICBpZiAoaSkKLQkgICAgKGZ1bmMpIChzdHJlYW0sICIsIik7Ci0JICBzd2l0Y2ggKG9wY29kZS0+YXJnX3R5cGVbaV0pCi0JICAgIHsKLQkgICAgY2FzZSBGUDoKLQkgICAgICBmdW5jIChzdHJlYW0sICJmcCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJOSU5EX0QxNjoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAKDB4JXg6MTYsciVkKSIsIGRpc3AsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTklORF9EODoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAKDB4JXg6OCAoJWQpLHIlZCkiLCBkaXNwICYgMHhmZiwgZGlzcCwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJESU5EX0QxNjoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAKDB4JXg6MTYsciVkKSIsIGRpc3AsIHJkKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRElORF9EODoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAKDB4JXg6OCAoJWQpLCByJWQpIiwgZGlzcCAmIDB4ZmYsIGRpc3AsIHJkKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBGUElORF9EODoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAKDB4JXg6OCAoJWQpLCBmcCkiLCBkaXNwICYgMHhmZiwgZGlzcCwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENSQjoKLQkgICAgY2FzZSBDUlc6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBjcm5hbWVbY3JdKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTjoKLQkgICAgICBmdW5jIChzdHJlYW0sICJyJWQiLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkQ6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiciVkIiwgcmQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJTOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgInIlZCIsIHJzKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTkRFQzoKLQkgICAgICBmdW5jIChzdHJlYW0sICJALXIlZCIsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTklOQzoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAciVkKyIsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTklORDoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAciVkIiwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJESU5EOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkByJWQiLCByZCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1BJTkM6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQHNwKyIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNQREVDOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAtc3AiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQlMyNDoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAMHglMHg6MjQiLCBhYnMpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzE2OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAweCUweDoxNiIsIGFicyAmIDB4ZmZmZik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUJTODoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAMHglMHg6OCIsIGFicyAmIDB4ZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTTE2OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiMweCUweDoxNiIsIGltbSAmIDB4ZmZmZik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkxJU1Q6Ci0JICAgICAgewotCQlpbnQgaTsKLQkJaW50IG5jID0gMDsKLQkJZnVuYyAoc3RyZWFtLCAiKCIpOwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkgIHsKLQkJICAgIGlmIChpbW0gJiAoMSA8PCBpKSkKLQkJICAgICAgewotCQkJZnVuYyAoc3RyZWFtLCAiciVkIiwgaSk7Ci0JCQlpZiAobmMpCi0JCQkgIGZ1bmMgKHN0cmVhbSwgIiwiKTsKLQkJCW5jID0gMTsKLQkJICAgICAgfQotCQkgIH0KLQkJZnVuYyAoc3RyZWFtLCAiKSIpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU04OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiMweCUweDo4IiwgaW1tICYgMHhmZik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSRUwxNjoKLQkgICAgICBmdW5jIChzdHJlYW0sICIweCUweDoxNiIsIChwY3JlbCArIGFkZHIgKyBvcGNvZGUtPmxlbmd0aCkgJiAweGZmZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBDUkVMODoKLQkgICAgICBmdW5jIChzdHJlYW0sICIjMHglMHg6OCIsCi0JCSAgICAoKGNoYXIpIHBjcmVsICsgYWRkciArIG9wY29kZS0+bGVuZ3RoKSAmIDB4ZmZmZik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUUlNOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiMlZDpxIiwgcWltKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU00OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiMlZDo0IiwgaW1tKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIHJldHVybiBvcGNvZGUtPmxlbmd0aDsKLSAgICBuZXh0OjsKLSAgICB9Ci0KLSAgLyogQ291bGRuJ3QgdW5kZXJzdGFuZCBhbnl0aGluZyAqLwotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBmdW5jIChzdHJlYW0sIF8oIiUwMnhcdFx0KnVua25vd24qIiksIGJ1ZmZlclswXSk7Ci0gIHJldHVybiAxOwotCi19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2g4NTAwLW9wYy5oIGIvb3Bjb2Rlcy9oODUwMC1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5NDlhZi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2g4NTAwLW9wYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzgzNiArMCwwIEBACi10eXBlZGVmIGVudW0KLXsKLSAgR1IwLEdSMSxHUjIsR1IzLEdSNCxHUjUsR1I2LEdSNywKLSAgR1BSMCwgR1BSMSwgR1BSMiwgR1BSMywgR1BSNCwgR1BSNSwgR1BSNiwgR1BSNywKLSAgR0NDUiwgR1BDLCAKLSAgR1NFR0MsIEdTRUdELCBHU0VHRSwgR1NFR1QsR0xBU1QKLX0gZ2RicmVnX3R5cGU7Ci0jZGVmaW5lIE9fWE9SQyAxCi0jZGVmaW5lIE9fWE9SIDIKLSNkZWZpbmUgT19YQ0ggMwotI2RlZmluZSBPX1VOTEsgNAotI2RlZmluZSBPX1RTVCA1Ci0jZGVmaW5lIE9fVFJBUEEgNgotI2RlZmluZSBPX1RSQVBfVlMgNwotI2RlZmluZSBPX1RBUyA4Ci0jZGVmaW5lIE9fU1dBUCA5Ci0jZGVmaW5lIE9fU1VCWCAxMAotI2RlZmluZSBPX1NVQlMgMTEKLSNkZWZpbmUgT19TVUIgMTIKLSNkZWZpbmUgT19TVE0gMTMKLSNkZWZpbmUgT19TVEMgMTQKLSNkZWZpbmUgT19TTEVFUCAxNQotI2RlZmluZSBPX1NITFIgMTYKLSNkZWZpbmUgT19TSExMIDE3Ci0jZGVmaW5lIE9fU0hBUiAxOAotI2RlZmluZSBPX1NIQUwgMTkKLSNkZWZpbmUgT19TQ0JfTkUgMjAKLSNkZWZpbmUgT19TQ0JfRiAyMQotI2RlZmluZSBPX1NDQl9FUSAyMgotI2RlZmluZSBPX1JUUyAyMwotI2RlZmluZSBPX1JURCAyNAotI2RlZmluZSBPX1JPVFhSIDI1Ci0jZGVmaW5lIE9fUk9UWEwgMjYKLSNkZWZpbmUgT19ST1RSIDI3Ci0jZGVmaW5lIE9fUk9UTCAyOAotI2RlZmluZSBPX1BSVFMgMjkKLSNkZWZpbmUgT19QUlREIDMwCi0jZGVmaW5lIE9fUEpTUiAzMQotI2RlZmluZSBPX1BKTVAgMzIKLSNkZWZpbmUgT19PUkMgMzMKLSNkZWZpbmUgT19PUiAzNAotI2RlZmluZSBPX05PVCAzNQotI2RlZmluZSBPX05PUCAzNgotI2RlZmluZSBPX05FRyAzNwotI2RlZmluZSBPX01VTFhVIDM4Ci0jZGVmaW5lIE9fTU9WVFBFIDM5Ci0jZGVmaW5lIE9fTU9WRlBFIDQwCi0jZGVmaW5lIE9fTU9WIDQxCi0jZGVmaW5lIE9fTElOSyA0MgotI2RlZmluZSBPX0xETSA0MwotI2RlZmluZSBPX0xEQyA0NAotI2RlZmluZSBPX0pTUiA0NQotI2RlZmluZSBPX0pNUCA0NgotI2RlZmluZSBPX0VYVFUgNDcKLSNkZWZpbmUgT19FWFRTIDQ4Ci0jZGVmaW5lIE9fRFNVQiA0OQotI2RlZmluZSBPX0RJVlhVIDUwCi0jZGVmaW5lIE9fREFERCA1MQotI2RlZmluZSBPX0NNUCA1MgotI2RlZmluZSBPX0NMUiA1MwotI2RlZmluZSBPX0JWUyA1NAotI2RlZmluZSBPX0JWQyA1NQotI2RlZmluZSBPX0JUU1QgNTYKLSNkZWZpbmUgT19CVCA1NwotI2RlZmluZSBPX0JTUiA1OAotI2RlZmluZSBPX0JTRVQgNTkKLSNkZWZpbmUgT19CUk4gNjAKLSNkZWZpbmUgT19CUkEgNjEKLSNkZWZpbmUgT19CUFQgNjIKLSNkZWZpbmUgT19CUEwgNjMKLSNkZWZpbmUgT19CTk9UIDY0Ci0jZGVmaW5lIE9fQk5FIDY1Ci0jZGVmaW5lIE9fQk1JIDY2Ci0jZGVmaW5lIE9fQkxUIDY3Ci0jZGVmaW5lIE9fQkxTIDY4Ci0jZGVmaW5lIE9fQkxPIDY5Ci0jZGVmaW5lIE9fQkxFIDcwCi0jZGVmaW5lIE9fQkhTIDcxCi0jZGVmaW5lIE9fQkhJIDcyCi0jZGVmaW5lIE9fQkdUIDczCi0jZGVmaW5lIE9fQkdFIDc0Ci0jZGVmaW5lIE9fQkYgNzUKLSNkZWZpbmUgT19CRVEgNzYKLSNkZWZpbmUgT19CQ1MgNzcKLSNkZWZpbmUgT19CQ0xSIDc4Ci0jZGVmaW5lIE9fQkNDIDc5Ci0jZGVmaW5lIE9fQU5EQyA4MAotI2RlZmluZSBPX0FORCA4MQotI2RlZmluZSBPX0FERFggODIKLSNkZWZpbmUgT19BRERTIDgzCi0jZGVmaW5lIE9fQUREIDg0Ci0jZGVmaW5lIE9fQllURSAxMjgKLSNkZWZpbmUgT19XT1JEIDB4MDAwCi0jZGVmaW5lIE9fVU5TWiAweDAwMAotI2RlZmluZSBGUElORF9EOAkxMAotI2RlZmluZSBSRElORF9EMTYJMTEKLSNkZWZpbmUgUkRJTkRfRDgJMTIKLSNkZWZpbmUgU1BERUMJMTMKLSNkZWZpbmUgUkRJTkQJMTQKLSNkZWZpbmUgUk4JMTUKLSNkZWZpbmUgUk5JTkRfRDgJMTYKLSNkZWZpbmUgUk5JTkRfRDE2CTE3Ci0jZGVmaW5lIFJOREVDCTE4Ci0jZGVmaW5lIFJOSU5DCTE5Ci0jZGVmaW5lIFJOSU5ECTIwCi0jZGVmaW5lIFNQSU5DCTIxCi0jZGVmaW5lIEFCUzE2CTIyCi0jZGVmaW5lIEFCUzI0CTIzCi0jZGVmaW5lIFBDUkVMMTYJMjQKLSNkZWZpbmUgUENSRUw4CTI1Ci0jZGVmaW5lIEFCUzgJMjYKLSNkZWZpbmUgQ1JCCTI3Ci0jZGVmaW5lIENSCTI4Ci0jZGVmaW5lIENSVwkyOQotI2RlZmluZSBESVNQMTYJMzAKLSNkZWZpbmUgRElTUDgJMzEKLSNkZWZpbmUgRlAJMzIKLSNkZWZpbmUgSU1NMTYJMzMKLSNkZWZpbmUgSU1NNAkzNAotI2RlZmluZSBJTU04CTM1Ci0jZGVmaW5lIFJMSVNUCTM2Ci0jZGVmaW5lIFFJTQkzNwotI2RlZmluZSBSRAkzOAotI2RlZmluZSBSUwkzOQotI2RlZmluZSBTUAk0MAotdHlwZWRlZiBlbnVtIHsgQUNfQkFELCBBQ19FSSwgQUNfUkksIEFDX0QsIEFDXyxBQ19FUlIsIEFDX1gsQUNfQiwgQUNfRUUsQUNfUlIsQUNfSUUsCi0gQUNfUkUsQUNfRSwgQUNfSSwgQUNfRVIsQUNfSVJSLCBBQ19JUiwgQUNfUkVSLCBBQ19FUkUsQUNfRUlFIH0gYWRkcl9jbGFzc190eXBlOyAKLXR5cGVkZWYgc3RydWN0IHsKLQlzaG9ydCBpbnQgaWR4OwotCWNoYXIgZmxhZ3Msc3JjMSxzcmMyLGRzdDsKLQl1bnNpZ25lZCBjaGFyIGZsYXZvcjsKLQljaGFyICpuYW1lOwotCWludCBuYXJnczsKLQlpbnQgYXJnX3R5cGVbMl07Ci0JaW50IGxlbmd0aDsKLQlzdHJ1Y3QgeyB1bnNpZ25lZCBjaGFyIGNvbnRlbnRzO3Vuc2lnbmVkIGNoYXIgbWFzazsgY2hhciBpbnNlcnQ7IH0gYnl0ZXNbNl07Ci19IGg4NTAwX29wY29kZV9pbmZvOwotaDg1MDBfb3Bjb2RlX2luZm8gaDg1MDBfdGFibGVbXQotI2lmZGVmIEFTU0VNQkxFUl9UQUJMRQotI2lmZGVmIERFRklORV9UQUJMRQotPXsKLS8qCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sCi0JCQkJCQkJCSAgIHsweDAwLDB4MDAsQUJTMTYgfSwKLQkJCQkJCQkJICAgezB4MDAsMHgwMCwgfSwKLQkJCQkJCQkJICAgezB4MDcsMHhmZiwgfSwKLQkJCQkJCQkJICAgezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwqLwotCi17MSwncycsJ0UnLCdDJywnQycsT19YT1JDfE9fV09SRCwieG9yYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsQ1JXIH19fSwKLXsyLCdzJywnRScsJ0MnLCdDJyxPX1hPUkN8T19CWVRFLCJ4b3JjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg2OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXs2LCctJywnWCcsJyEnLCchJyxPX1hDSHxPX1dPUkQsInhjaC53IiwyLHtSUyxSRH0sMiwJe3sweGE4LDB4ZjgsUlMgfSx7MHg5MCwweGY4LFJEIH19fSwKLXs3LCctJywnWCcsJyEnLCchJyxPX1hDSHxPX1VOU1osInhjaCIsMix7UlMsUkR9LDIsCXt7MHhhOCwweGY4LFJTIH0sezB4OTAsMHhmOCxSRCB9fX0sCi17OCwnLScsJ0InLCchJywnIScsT19VTkxLfE9fVU5TWiwidW5sayIsMSx7RlAsMH0sMSwJe3sweDBmLDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezEyLCctJywnSScsJyEnLCchJyxPX1RSQVBBfE9fVU5TWiwidHJhcGEiLDEse0lNTTQsMH0sMiwJe3sweDA4LDB4ZmYsIH0sezB4MTAsMHhmMCxJTU00IH19fSwKLXsxMywnLScsJ0InLCchJywnIScsT19UUkFQX1ZTfE9fVU5TWiwidHJhcC92cyIsMCx7MCwwfSwxLAl7ezB4MDksMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MTYsJ20nLCdEJywnIScsJ0QnLE9fU1dBUHxPX0JZVEUsInN3YXAuYiIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMCwweGZmLCB9fX0sCi17MTcsJ20nLCdEJywnIScsJ0QnLE9fU1dBUHxPX1VOU1osInN3YXAiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTAsMHhmZiwgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI3LCctJywnSScsJyEnLCdFJyxPX1NUTXxPX1VOU1osInN0bSIsMix7UkxJU1QsU1BERUN9LDIsCXt7MHgxMiwweGZmLCB9LHsweDAwLDB4MDAsUkxJU1QgfX19LAotezI4LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1dPUkQsInN0Yy53IiwyLHtDUlcsUk59LDIsCQl7ezB4YTgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezI4LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1dPUkQsInN0Yy53IiwyLHtDUlcsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTn0sMiwJCXt7MHhhMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMSwnLScsJyEnLCchJywnIScsT19TTEVFUHxPX1VOU1osInNsZWVwIiwwLHswLDB9LDEsCXt7MHgxYSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0NCwnLScsJ0InLCdTJywnUycsT19TQ0JfTkV8T19VTlNaLCJzY2IvbmUiLDIse1JTLFBDUkVMOH0sMywJe3sweDA2LDB4ZmYsIH0sezB4YjgsMHhmOCxSUyB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXs0NSwnLScsJ0InLCdTJywnUycsT19TQ0JfRnxPX1VOU1osInNjYi9mIiwyLHtSUyxQQ1JFTDh9LDMsCXt7MHgwMSwweGZmLCB9LHsweGI4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17NDYsJy0nLCdCJywnUycsJ1MnLE9fU0NCX0VRfE9fVU5TWiwic2NiL2VxIiwyLHtSUyxQQ1JFTDh9LDMsCXt7MHgwNywweGZmLCB9LHsweGI4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17NDcsJy0nLCdCJywnIScsJyEnLE9fUlRTfE9fVU5TWiwicnRzIiwwLHswLDB9LDEsCXt7MHgxOSwweGZmLCB9fX0sCi17NDgsJy0nLCdCJywnIScsJyEnLE9fUlREfE9fVU5TWiwicnRkIiwxLHtJTU04LDB9LDIsCXt7MHgxNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17NDgsJy0nLCdCJywnIScsJyEnLE9fUlREfE9fVU5TWiwicnRkIiwxLHtJTU0xNiwwfSwzLAl7ezB4MTQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NTEsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19VTlNaLCJyb3R4ciIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1NCwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1VOU1osInJvdHhsIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NjEsJy0nLCdCJywnIScsJyEnLE9fUFJUU3xPX1VOU1osInBydHMiLDAsezAsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4MTksMHhmZiwgfX19LAotezYyLCctJywnQicsJyEnLCchJyxPX1BSVER8T19VTlNaLCJwcnRkIiwxLHtJTU04LDB9LDMsCXt7MHgxMSwweGZmLCB9LHsweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs2MiwnLScsJ0InLCchJywnIScsT19QUlREfE9fVU5TWiwicHJ0ZCIsMSx7SU1NMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4MWMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezYzLCctJywnSicsJyEnLCchJyxPX1BKU1J8T19VTlNaLCJwanNyIiwxLHtSRElORCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHhjOCwweGY4LFJESU5EIH19fSwKLXs2MywnLScsJ0onLCchJywnIScsT19QSlNSfE9fVU5TWiwicGpzciIsMSx7QUJTMjQsMH0sNCwJe3sweDAzLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMyNCB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezY0LCctJywnSicsJyEnLCchJyxPX1BKTVB8T19VTlNaLCJwam1wIiwxLHtSRElORCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHhjMCwweGY4LFJESU5EIH19fSwKLXs2NCwnLScsJ0onLCchJywnIScsT19QSk1QfE9fVU5TWiwicGptcCIsMSx7QUJTMjQsMH0sNCwJe3sweDEzLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMyNCB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezY1LCdzJywnSScsJ0MnLCdDJyxPX09SQ3xPX1dPUkQsIm9yYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsQ1JXIH19fSwKLXs2NiwncycsJ0knLCdDJywnQycsT19PUkN8T19CWVRFLCJvcmMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDQ4LDB4ZjgsQ1JCIH19fSwKLXs2NywncycsJ0knLCdDJywnQycsT19PUkN8T19VTlNaLCJvcmMiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg0OCwweGY4LENSQiB9fX0sCi17NjcsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fVU5TWiwib3JjIiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsQ1JXIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcwLCdtJywnRScsJ0QnLCdEJyxPX09SfE9fVU5TWiwib3IiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzQsJy0nLCchJywnIScsJyEnLE9fTk9QfE9fVU5TWiwibm9wIiwwLHswLDB9LDEsCXt7MHgwMCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgwLCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fVU5TWiwibXVseHUiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxBQlMxNn0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk4sUkR9LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkMsUkR9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkQsUkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5ERUMsUkR9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7SU1NOCxSRH0sNCwJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7QUJTOCxSRH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkRfRDgsUkR9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0FCUzE2LFJEfSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklORF9EMTYsUkR9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtSTixSRH0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk5JTkMsUkR9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse1JOSU5ELFJEfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtSTkRFQyxSRH0sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7SU1NOCxSRH0sNCwJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse0FCUzgsUkR9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtSTklORF9EOCxSRH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse0FCUzE2LFJEfSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk5JTkRfRDE2LFJEfSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpzLnciLDIse1JTLEFCUzh9LDIsCXt7MHg3OCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4NiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6cy5iIiwyLHtSUyxBQlM4fSwyLAl7ezB4NzAsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODcsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OnMiLDIse1JTLEFCUzh9LDIsCXt7MHg3OCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4OCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6bC53IiwyLHtBQlM4LFJEfSwyLAl7ezB4NjgsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODksJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmwuYiIsMix7QUJTOCxSRH0sMiwJe3sweDYwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezkwLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpsIiwyLHtBQlM4LFJEfSwyLAl7ezB4NjgsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17OTEsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmkudyIsMix7SU1NMTYsUkR9LDMsCXt7MHg1OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MiwnbScsJ0knLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6aSIsICAyLHtJTU0xNixSRH0sMywJe3sweDU4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOLFJEfSwyLAkJe3sweGE4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORF9EOH0sNSx7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5EX0QxNn0sNix7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NOCxSTkRFQ30sMywJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsUk5JTkN9LDMsCXt7MHhjOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsQUJTOH0sNCwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTYsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmYudyIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5OCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTYsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmYudyIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4OCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTcsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmYuYiIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5MCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTcsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmYuYiIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4MCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTgsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmYiLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTgsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk4LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpmIiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDg4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5OSwnbScsJ0knLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6ZS5iIiwyLHtJTU04LFJEfSwyLAl7ezB4NTAsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAwLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjplIiwyLHtJTU04LFJEfSwyLAl7ezB4NTAsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDk4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLEFCUzh9LDIsCXt7MHg3OCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0FCUzgsUkR9LDIsCXt7MHg2OCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4OCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMSwnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLQotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4MCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxBQlM4fSwyLAl7ezB4NzAsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5MCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7QUJTOCxSRH0sMiwJe3sweDYwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezEwMiwnbScsJ0knLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSRH0sMiwJe3sweDUwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMiwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMiwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7QUJTOCxSRH0sMiwJe3sweDY4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLEFCUzh9LDIsCXt7MHg3OCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDk4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDg4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLS8qezEwMywnbScsJ0knLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTgsUkR9LDIsCXt7MHg1OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwqLwotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUkR9LDMsCXt7MHg1OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA0LCctJywnUycsJ0knLCchJyxPX0xJTkt8T19VTlNaLCJsaW5rIiwyLHtGUCxJTU04fSwyLAl7ezB4MTcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwNCwnLScsJ1MnLCdJJywnIScsT19MSU5LfE9fVU5TWiwibGluayIsMix7RlAsSU1NMTZ9LDMsCXt7MHgxZiwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA1LCctJywnRScsJyEnLCdDJyxPX0xETXxPX1VOU1osImxkbSIsMix7U1BJTkMsUkxJU1R9LDIsCXt7MHgwMiwweGZmLCB9LHsweDAwLDB4MDAsUkxJU1QgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7Uk4sQ1JXfSwyLAkJe3sweGE4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtSTklORCxDUld9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7Uk5JTkMsQ1JXfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOREVDLENSV30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtBQlM4LENSV30sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7Uk5JTkRfRDgsQ1JXfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse0FCUzE2LENSV30sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7Uk5JTkRfRDE2LENSV30sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk4sQ1JCfSwyLAkJe3sweGEwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTkRFQyxDUkJ9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkMsQ1JCfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5ELENSQn0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7QUJTOCxDUkJ9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5EX0Q4LENSQn0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7QUJTMTYsQ1JCfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORF9EMTYsQ1JCfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk4sQ1JXfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTixDUkJ9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5DLENSV30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5JTkQsQ1JCfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTkRFQyxDUld9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5ELENSV30sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5ERUMsQ1JCfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklOQyxDUkJ9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0FCUzgsQ1JXfSwzLAkJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0FCUzgsQ1JCfSwzLAkJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0lNTTgsQ1JCfSwzLAkJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5EX0Q4LENSV30sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5EX0Q4LENSQn0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0FCUzE2LENSQn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0FCUzE2LENSV30sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5EX0QxNixDUld9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORF9EMTYsQ1JCfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4ZDgsMHhmOCxSRCB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7QUJTMTYsMH0sMywJe3sweDE4LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtSRElORF9EOCwwfSwzLAl7ezB4MTEsMHhmZiwgfSx7MHhlOCwweGY4LFJESU5EX0Q4IH0sezB4MDAsMHgwMCwgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse1JESU5EX0QxNiwwfSw0LAl7ezB4MTEsMHhmZiwgfSx7MHhmOCwweGY4LFJESU5EX0QxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGQwLDB4ZjgsUkQgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse0FCUzE2LDB9LDMsCXt7MHgxMCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTEwLCctJywnQicsJyEnLCchJyxPX0pNUHxPX1VOU1osImptcCIsMSx7UkRJTkRfRDgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4ZTAsMHhmOCxSRElORF9EOCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtSRElORF9EMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4ZjAsMHhmOCxSRElORF9EMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMTEsJ3MnLCdEJywnIScsJ0QnLE9fRVhUVXxPX0JZVEUsImV4dHUuYiIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMiwweGZmLCB9fX0sCi17MTEyLCdzJywnRCcsJyEnLCdEJyxPX0VYVFV8T19VTlNaLCJleHR1IiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDEyLDB4ZmYsIH19fSwKLXsxMTMsJ3MnLCdEJywnIScsJ0QnLE9fRVhUU3xPX0JZVEUsImV4dHMuYiIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMSwweGZmLCB9fX0sCi17MTE0LCdzJywnRCcsJyEnLCdEJyxPX0VYVFN8T19VTlNaLCJleHRzIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDExLDB4ZmYsIH19fSwKLXsxMTUsJ3MnLCdEJywnIScsJyEnLE9fRFNVQnxPX1VOU1osImRzdWIiLDIse1JTLFJEfSwzLAl7ezB4YTAsMHhmOCxSUyB9LHsweDAwLDB4ZmYsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTksJ3MnLCdEJywnIScsJyEnLE9fREFERHxPX1VOU1osImRhZGQiLDIse1JTLFJEfSwzLAl7ezB4YTAsMHhmOCxSUyB9LHsweDAwLDB4ZmYsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTIwLCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDppLnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NDgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIxLCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDppIiwyLHtJTU0xNixSRH0sMywJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOfSw0LAl7ezB4YTgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkRfRDh9LDUse3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOLFJEfSwyLAkJe3sweGE4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUk59LDQsCXt7MHhhOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI0LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI0LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtJTU0xNixSTklORF9EMTZ9LDYse3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjUsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmUuYiIsMix7SU1NOCxSRH0sMiwJe3sweDQwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyNiwnYScsJ0QnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZSIsMix7SU1NOCxSRH0sMiwJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7Uk4sUkR9LDIsCQl7ezB4YTgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNywnYScsJ0QnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUkR9LDMsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOfSw0LAl7ezB4YTgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYse3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse1JOLFJEfSwyLAkJe3sweGEwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJEfSwyLAl7ezB4NDAsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk59LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI5LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI5LCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NOCxSRH0sMiwJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJEfSwzLAl7ezB4NDgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0FCUzgsUkR9LDMsCQl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTn0sNCwJCXt7MHhhOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMyLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1VOU1osImNsciIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMzLCctJywnQicsJyEnLCchJyxPX0JWU3xPX1dPUkQsImJ2cy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzQsJy0nLCdCJywnIScsJyEnLE9fQlZTfE9fQllURSwiYnZzLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTM1LCctJywnQicsJyEnLCchJyxPX0JWU3xPX1VOU1osImJ2cyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyOSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxMzUsJy0nLCdCJywnIScsJyEnLE9fQlZTfE9fVU5TWiwiYnZzIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzYsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fV09SRCwiYnZjLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM4LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezEzNywnLScsJ0InLCchJywnIScsT19CVkN8T19CWVRFLCJidmMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxMzgsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fVU5TWiwiYnZjIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI4LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezEzOCwnLScsJ0InLCchJywnIScsT19CVkN8T19VTlNaLCJidmMiLDEse1BDUkVMMTYsMH0sMywJe3sweDM4LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDIsJy0nLCdCJywnIScsJyEnLE9fQlR8T19XT1JELCJidC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNDMsJy0nLCdCJywnIScsJyEnLE9fQlR8T19CWVRFLCJidC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE0NCwnLScsJ0InLCchJywnIScsT19CVHxPX1VOU1osImJ0IiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE0NCwnLScsJ0InLCchJywnIScsT19CVHxPX1VOU1osImJ0IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNDUsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fV09SRCwiYnNyLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDFlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE0NiwnLScsJ0InLCchJywnIScsT19CU1J8T19CWVRFLCJic3IuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgwZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNDcsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fVU5TWiwiYnNyIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDBlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE0NywnLScsJ0InLCchJywnIScsT19CU1J8T19VTlNaLCJic3IiLDEse1BDUkVMMTYsMH0sMywJe3sweDFlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTUwLCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTEsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fV09SRCwiYnJuLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1MiwnLScsJ0InLCchJywnIScsT19CUk58T19CWVRFLCJicm4uYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNTMsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fVU5TWiwiYnJuIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE1MywnLScsJ0InLCchJywnIScsT19CUk58T19VTlNaLCJicm4iLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1NCwnLScsJ0InLCchJywnIScsT19CUkF8T19XT1JELCJicmEudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTU1LCctJywnQicsJyEnLCchJyxPX0JSQXxPX0JZVEUsImJyYS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE1NiwnLScsJ0InLCchJywnIScsT19CUkF8T19VTlNaLCJicmEiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTU2LCctJywnQicsJyEnLCchJyxPX0JSQXxPX1VOU1osImJyYSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTU3LCctJywnIScsJyEnLCchJyxPX0JQVHxPX1VOU1osImJwdCIsMCx7MCwwfSwxLAl7ezB4MGIsMHhmZiwgfX19LAotezE1OCwnLScsJ0InLCchJywnIScsT19CUEx8T19XT1JELCJicGwudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2EsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTU5LCctJywnQicsJyEnLCchJyxPX0JQTHxPX0JZVEUsImJwbC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2MCwnLScsJ0InLCchJywnIScsT19CUEx8T19VTlNaLCJicGwiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTYwLCctJywnQicsJyEnLCchJyxPX0JQTHxPX1VOU1osImJwbCIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2EsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MywnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2NCwnLScsJ0InLCchJywnIScsT19CTkV8T19XT1JELCJibmUudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTY1LCctJywnQicsJyEnLCchJyxPX0JORXxPX0JZVEUsImJuZS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2NiwnLScsJ0InLCchJywnIScsT19CTkV8T19VTlNaLCJibmUiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTY2LCctJywnQicsJyEnLCchJyxPX0JORXxPX1VOU1osImJuZSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTY3LCctJywnQicsJyEnLCchJyxPX0JNSXxPX1dPUkQsImJtaS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNjgsJy0nLCdCJywnIScsJyEnLE9fQk1JfE9fQllURSwiYm1pLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTY5LCctJywnQicsJyEnLCchJyxPX0JNSXxPX1VOU1osImJtaSIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNjksJy0nLCdCJywnIScsJyEnLE9fQk1JfE9fVU5TWiwiYm1pIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzAsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fV09SRCwiYmx0LnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNkLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3MSwnLScsJ0InLCchJywnIScsT19CTFR8T19CWVRFLCJibHQuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzIsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fVU5TWiwiYmx0IiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJkLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3MiwnLScsJ0InLCchJywnIScsT19CTFR8T19VTlNaLCJibHQiLDEse1BDUkVMMTYsMH0sMywJe3sweDNkLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3MywnLScsJ0InLCchJywnIScsT19CTFN8T19XT1JELCJibHMudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTc0LCctJywnQicsJyEnLCchJyxPX0JMU3xPX0JZVEUsImJscy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3NSwnLScsJ0InLCchJywnIScsT19CTFN8T19VTlNaLCJibHMiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTc1LCctJywnQicsJyEnLCchJyxPX0JMU3xPX1VOU1osImJscyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTc2LCctJywnQicsJyEnLCchJyxPX0JMT3xPX1dPUkQsImJsby53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzcsJy0nLCdCJywnIScsJyEnLE9fQkxPfE9fQllURSwiYmxvLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTc4LCctJywnQicsJyEnLCchJyxPX0JMT3xPX1VOU1osImJsbyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzgsJy0nLCdCJywnIScsJyEnLE9fQkxPfE9fVU5TWiwiYmxvIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzksJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fV09SRCwiYmxlLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNmLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4MCwnLScsJ0InLCchJywnIScsT19CTEV8T19CWVRFLCJibGUuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODEsJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fVU5TWiwiYmxlIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJmLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4MSwnLScsJ0InLCchJywnIScsT19CTEV8T19VTlNaLCJibGUiLDEse1BDUkVMMTYsMH0sMywJe3sweDNmLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4MiwnLScsJ0InLCchJywnIScsT19CSFN8T19XT1JELCJiaHMudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTgzLCctJywnQicsJyEnLCchJyxPX0JIU3xPX0JZVEUsImJocy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4NCwnLScsJ0InLCchJywnIScsT19CSFN8T19VTlNaLCJiaHMiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTg0LCctJywnQicsJyEnLCchJyxPX0JIU3xPX1VOU1osImJocyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTg1LCctJywnQicsJyEnLCchJyxPX0JISXxPX1dPUkQsImJoaS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODYsJy0nLCdCJywnIScsJyEnLE9fQkhJfE9fQllURSwiYmhpLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTg3LCctJywnQicsJyEnLCchJyxPX0JISXxPX1VOU1osImJoaSIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODcsJy0nLCdCJywnIScsJyEnLE9fQkhJfE9fVU5TWiwiYmhpIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODgsJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fV09SRCwiYmd0LnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4OSwnLScsJ0InLCchJywnIScsT19CR1R8T19CWVRFLCJiZ3QuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTAsJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fVU5TWiwiYmd0IiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5MCwnLScsJ0InLCchJywnIScsT19CR1R8T19VTlNaLCJiZ3QiLDEse1BDUkVMMTYsMH0sMywJe3sweDNlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5MSwnLScsJ0InLCchJywnIScsT19CR0V8T19XT1JELCJiZ2UudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2MsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTkyLCctJywnQicsJyEnLCchJyxPX0JHRXxPX0JZVEUsImJnZS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5MywnLScsJ0InLCchJywnIScsT19CR0V8T19VTlNaLCJiZ2UiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTkzLCctJywnQicsJyEnLCchJyxPX0JHRXxPX1VOU1osImJnZSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2MsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTk0LCctJywnQicsJyEnLCchJyxPX0JGfE9fV09SRCwiYmYudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTk1LCctJywnQicsJyEnLCchJyxPX0JGfE9fQllURSwiYmYuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTYsJy0nLCdCJywnIScsJyEnLE9fQkZ8T19VTlNaLCJiZiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTYsJy0nLCdCJywnIScsJyEnLE9fQkZ8T19VTlNaLCJiZiIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTk3LCctJywnQicsJyEnLCchJyxPX0JFUXxPX1dPUkQsImJlcS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNywweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxOTgsJy0nLCdCJywnIScsJyEnLE9fQkVRfE9fQllURSwiYmVxLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTk5LCctJywnQicsJyEnLCchJyxPX0JFUXxPX1VOU1osImJlcSIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTksJy0nLCdCJywnIScsJyEnLE9fQkVRfE9fVU5TWiwiYmVxIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNywweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDAsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fV09SRCwiYmNzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwMSwnLScsJ0InLCchJywnIScsT19CQ1N8T19CWVRFLCJiY3MuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDIsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fVU5TWiwiYmNzIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezIwMiwnLScsJ0InLCchJywnIScsT19CQ1N8T19VTlNaLCJiY3MiLDEse1BDUkVMMTYsMH0sMywJe3sweDM1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDYsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fV09SRCwiYmNjLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwNywnLScsJ0InLCchJywnIScsT19CQ0N8T19CWVRFLCJiY2MuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDgsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fVU5TWiwiYmNjIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezIwOCwnLScsJ0InLCchJywnIScsT19CQ0N8T19VTlNaLCJiY2MiLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwOSwncycsJ0knLCdTJywnUycsT19BTkRDfE9fV09SRCwiYW5kYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsQ1JXIH19fSwKLXsyMTAsJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX0JZVEUsImFuZGMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDU4LDB4ZjgsQ1JCIH19fSwKLXsyMTEsJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX1VOU1osImFuZGMiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg1OCwweGY4LENSQiB9fX0sCi17MjExLCdzJywnSScsJ1MnLCdTJyxPX0FOREN8T19VTlNaLCJhbmRjIiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsQ1JXIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxNCwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19VTlNaLCJhbmQiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotMCwwLDB9Ci0jZW5kaWYKLTsKLSNlbmRpZgotI2lmZGVmIERJU0FTU0VNQkxFUl9UQUJMRQotI2lmZGVmIERFRklORV9UQUJMRQotPXsKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17NiwnLScsJ1gnLCchJywnIScsT19YQ0h8T19XT1JELCJ4Y2gudyIsMix7UlMsUkR9LDIsCXt7MHhhOCwweGY4LFJTIH0sezB4OTAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezE2LCdtJywnRCcsJyEnLCdEJyxPX1NXQVB8T19XT1JELCJzd2FwLmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTAsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNywweGZmLCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MiwncycsJ0UnLCdDJywnQycsT19YT1JDfE9fQllURSwieG9yYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NjgsMHhmOCxDUkIgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNywweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTgsMHhmOCxDUkIgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNywweGZmLCB9fX0sCi17MTIsJy0nLCdJJywnIScsJyEnLE9fVFJBUEF8T19VTlNaLCJ0cmFwYSIsMSx7SU1NNCwwfSwyLAl7ezB4MDgsMHhmZiwgfSx7MHgxMCwweGYwLElNTTQgfX19LAotezEzLCctJywnQicsJyEnLCchJyxPX1RSQVBfVlN8T19VTlNaLCJ0cmFwL3ZzIiwwLHswLDB9LDEsCXt7MHgwOSwweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezEsJ3MnLCdFJywnQycsJ0MnLE9fWE9SQ3xPX1dPUkQsInhvcmMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LENSVyB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNiwweGZmLCB9fX0sCi17OCwnLScsJ0InLCchJywnIScsT19VTkxLfE9fVU5TWiwidW5sayIsMSx7RlAsMH0sMSwJe3sweDBmLDB4ZmYsIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI3LCctJywnSScsJyEnLCdFJyxPX1NUTXxPX1VOU1osInN0bSIsMix7UkxJU1QsU1BERUN9LDIsCXt7MHgxMiwweGZmLCB9LHsweDAwLDB4MDAsUkxJU1QgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYiwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWIsMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTksMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWIsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYiwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezMxLCctJywnIScsJyEnLCchJyxPX1NMRUVQfE9fVU5TWiwic2xlZXAiLDAsezAsMH0sMSwJe3sweDFhLDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTgsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWUsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezQ1LCctJywnQicsJ1MnLCdTJyxPX1NDQl9GfE9fVU5TWiwic2NiL2YiLDIse1JTLFBDUkVMOH0sMywJe3sweDAxLDB4ZmYsIH0sezB4YjgsMHhmOCxSUyB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWUsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWUsMHhmZiwgfX19LAotezQ0LCctJywnQicsJ1MnLCdTJyxPX1NDQl9ORXxPX1VOU1osInNjYi9uZSIsMix7UlMsUENSRUw4fSwzLAl7ezB4MDYsMHhmZiwgfSx7MHhiOCwweGY4LFJTIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezQ2LCctJywnQicsJ1MnLCdTJyxPX1NDQl9FUXxPX1VOU1osInNjYi9lcSIsMix7UlMsUENSRUw4fSwzLAl7ezB4MDcsMHhmZiwgfSx7MHhiOCwweGY4LFJTIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWUsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZiwweGZmLCB9fX0sCi17NDgsJy0nLCdCJywnIScsJyEnLE9fUlREfE9fVU5TWiwicnRkIiwxLHtJTU0xNiwwfSwzLAl7ezB4MTQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezQ4LCctJywnQicsJyEnLCchJyxPX1JURHxPX1VOU1osInJ0ZCIsMSx7SU1NOCwwfSwyLAl7ezB4MTQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0NywnLScsJ0InLCchJywnIScsT19SVFN8T19VTlNaLCJydHMiLDAsezAsMH0sMSwJe3sweDE5LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17OTksJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmUuYiIsMix7SU1NOCxSRH0sMiwJe3sweDUwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk3LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpmLmIiLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODAsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk2LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpmLnciLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODgsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk3LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpmLmIiLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTAsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk2LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpmLnciLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTgsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkxLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjppLnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17ODksJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmwuYiIsMix7QUJTOCxSRH0sMiwJe3sweDYwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezg4LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpsLnciLDIse0FCUzgsUkR9LDIsCXt7MHg2OCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4NiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6cy5iIiwyLHtSUyxBQlM4fSwyLAl7ezB4NzAsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OnMudyIsMix7UlMsQUJTOH0sMiwJe3sweDc4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTixSRH0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTkRFQyxSRH0sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTUsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTQsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNSwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWQsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MywnLScsJ0onLCchJywnIScsT19QSlNSfE9fVU5TWiwicGpzciIsMSx7QUJTMjQsMH0sNCwJe3sweDAzLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMyNCB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjYsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fQllURSwib3JjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg0OCwweGY4LENSQiB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTQsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWMsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTUsMHhmZiwgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17NzQsJy0nLCchJywnIScsJyEnLE9fTk9QfE9fVU5TWiwibm9wIiwwLHswLDB9LDEsCXt7MHgwMCwweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYywweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjUsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fV09SRCwib3JjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxDUlcgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTUsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWQsMHhmZiwgfX19LAotezY0LCctJywnSicsJyEnLCchJyxPX1BKTVB8T19VTlNaLCJwam1wIiwxLHtSRElORCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHhjMCwweGY4LFJESU5EIH19fSwKLXs2MywnLScsJ0onLCchJywnIScsT19QSlNSfE9fVU5TWiwicGpzciIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4YzgsMHhmOCxSRElORCB9fX0sCi17NjIsJy0nLCdCJywnIScsJyEnLE9fUFJURHxPX1VOU1osInBydGQiLDEse0lNTTgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4MTQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezYxLCctJywnQicsJyEnLCchJyxPX1BSVFN8T19VTlNaLCJwcnRzIiwwLHswLDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweDE5LDB4ZmYsIH19fSwKLXs2MiwnLScsJ0InLCchJywnIScsT19QUlREfE9fVU5TWiwicHJ0ZCIsMSx7SU1NMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4MWMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezY0LCctJywnSicsJyEnLCchJyxPX1BKTVB8T19VTlNaLCJwam1wIiwxLHtBQlMyNCwwfSw0LAl7ezB4MTMsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzI0IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweDAwLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWMsMHhmZiwgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkN9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklORCxSRH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklOQyxSRH0sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklORF9EOCxSRH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5EX0QxNixSRH0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7SU1NOCxSRH0sNCwJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7QUJTOCxSRH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZCwweGZmLCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHgwMCwgfX19LAotCi0KLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi0KLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtBQlMxNixSRH0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTgsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHgwMCwgfX19LAotCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXsxMjUsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmUuYiIsMix7SU1NOCxSRH0sMiwJe3sweDQwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTn0sNCwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTixDUkJ9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEyMCwnYScsJ0QnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6aS53IiwyLHtJTU0xNixSRH0sMywJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOSwncycsJ0QnLCchJywnIScsT19EQUREfE9fVU5TWiwiZGFkZCIsMix7UlMsUkR9LDMsCXt7MHhhMCwweGY4LFJTIH0sezB4MDAsMHhmZiwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsxMTUsJ3MnLCdEJywnIScsJyEnLE9fRFNVQnxPX1VOU1osImRzdWIiLDIse1JTLFJEfSwzLAl7ezB4YTAsMHhmOCxSUyB9LHsweDAwLDB4ZmYsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTEzLCdzJywnRCcsJyEnLCdEJyxPX0VYVFN8T19CWVRFLCJleHRzLmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTEsMHhmZiwgfX19LAotezExMSwncycsJ0QnLCchJywnRCcsT19FWFRVfE9fQllURSwiZXh0dS5iIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDEyLDB4ZmYsIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5EX0Q4LENSQn0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkRfRDE2LENSQn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse0FCUzE2LDB9LDMsCXt7MHgxMCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTEwLCctJywnQicsJyEnLCchJyxPX0pNUHxPX1VOU1osImptcCIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4ZDAsMHhmOCxSRCB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4ZDgsMHhmOCxSRCB9fX0sCi17MTEwLCctJywnQicsJyEnLCchJyxPX0pNUHxPX1VOU1osImptcCIsMSx7UkRJTkRfRDgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4ZTAsMHhmOCxSRElORF9EOCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtSRElORF9EOCwwfSwzLAl7ezB4MTEsMHhmZiwgfSx7MHhlOCwweGY4LFJESU5EX0Q4IH0sezB4MDAsMHgwMCwgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5EX0QxNiwwfSw0LAl7ezB4MTEsMHhmZiwgfSx7MHhmMCwweGY4LFJESU5EX0QxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse1JESU5EX0QxNiwwfSw0LAl7ezB4MTEsMHhmZiwgfSx7MHhmOCwweGY4LFJESU5EX0QxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse0FCUzE2LDB9LDMsCXt7MHgxOCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtBQlMxNixDUkJ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5DLENSQn0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORCxDUkJ9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse0FCUzgsQ1JCfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5ERUMsQ1JCfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMDUsJy0nLCdFJywnIScsJ0MnLE9fTERNfE9fVU5TWiwibGRtIiwyLHtTUElOQyxSTElTVH0sMiwJe3sweDAyLDB4ZmYsIH0sezB4MDAsMHgwMCxSTElTVCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEwNCwnLScsJ1MnLCdJJywnIScsT19MSU5LfE9fVU5TWiwibGluayIsMix7RlAsSU1NMTZ9LDMsCXt7MHgxZiwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA0LCctJywnUycsJ0knLCchJyxPX0xJTkt8T19VTlNaLCJsaW5rIiwyLHtGUCxJTU04fSwyLAl7ezB4MTcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxMywweGZmLCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxMywweGZmLCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzNywnLScsJ0InLCchJywnIScsT19CVkN8T19CWVRFLCJidmMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxMzQsJy0nLCdCJywnIScsJyEnLE9fQlZTfE9fQllURSwiYnZzLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTM2LCctJywnQicsJyEnLCchJyxPX0JWQ3xPX1dPUkQsImJ2Yy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzMsJy0nLCdCJywnIScsJyEnLE9fQlZTfE9fV09SRCwiYnZzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM5LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDYsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fQllURSwiYnNyLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MGUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0NSwnLScsJ0InLCchJywnIScsT19CU1J8T19XT1JELCJic3IudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MWUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMCwncycsJ0knLCdTJywnUycsT19BTkRDfE9fQllURSwiYW5kYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NTgsMHhmOCxDUkIgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDksJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX1dPUkQsImFuZGMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LENSVyB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MTU3LCctJywnIScsJyEnLCchJyxPX0JQVHxPX1VOU1osImJwdCIsMCx7MCwwfSwxLAl7ezB4MGIsMHhmZiwgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezE1NSwnLScsJ0InLCchJywnIScsT19CUkF8T19CWVRFLCJicmEuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE1MiwnLScsJ0InLCchJywnIScsT19CUk58T19CWVRFLCJicm4uYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODYsJy0nLCdCJywnIScsJyEnLE9fQkhJfE9fQllURSwiYmhpLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTc0LCctJywnQicsJyEnLCchJyxPX0JMU3xPX0JZVEUsImJscy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezIwNywnLScsJ0InLCchJywnIScsT19CQ0N8T19CWVRFLCJiY2MuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDEsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fQllURSwiYmNzLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTY1LCctJywnQicsJyEnLCchJyxPX0JORXxPX0JZVEUsImJuZS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5OCwnLScsJ0InLCchJywnIScsT19CRVF8T19CWVRFLCJiZXEuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNTksJy0nLCdCJywnIScsJyEnLE9fQlBMfE9fQllURSwiYnBsLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTY4LCctJywnQicsJyEnLCchJyxPX0JNSXxPX0JZVEUsImJtaS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJiLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5MiwnLScsJ0InLCchJywnIScsT19CR0V8T19CWVRFLCJiZ2UuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzEsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fQllURSwiYmx0LmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTg5LCctJywnQicsJyEnLCchJyxPX0JHVHxPX0JZVEUsImJndC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4MCwnLScsJ0InLCchJywnIScsT19CTEV8T19CWVRFLCJibGUuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNTQsJy0nLCdCJywnIScsJyEnLE9fQlJBfE9fV09SRCwiYnJhLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1MSwnLScsJ0InLCchJywnIScsT19CUk58T19XT1JELCJicm4udyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTg1LCctJywnQicsJyEnLCchJyxPX0JISXxPX1dPUkQsImJoaS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzMsJy0nLCdCJywnIScsJyEnLE9fQkxTfE9fV09SRCwiYmxzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwNiwnLScsJ0InLCchJywnIScsT19CQ0N8T19XT1JELCJiY2MudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MjAwLCctJywnQicsJyEnLCchJyxPX0JDU3xPX1dPUkQsImJjcy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNjQsJy0nLCdCJywnIScsJyEnLE9fQk5FfE9fV09SRCwiYm5lLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5NywnLScsJ0InLCchJywnIScsT19CRVF8T19XT1JELCJiZXEudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTU4LCctJywnQicsJyEnLCchJyxPX0JQTHxPX1dPUkQsImJwbC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNjcsJy0nLCdCJywnIScsJyEnLE9fQk1JfE9fV09SRCwiYm1pLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNiLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5MSwnLScsJ0InLCchJywnIScsT19CR0V8T19XT1JELCJiZ2UudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2MsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTcwLCctJywnQicsJyEnLCchJyxPX0JMVHxPX1dPUkQsImJsdC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODgsJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fV09SRCwiYmd0LnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3OSwnLScsJ0InLCchJywnIScsT19CTEV8T19XT1JELCJibGUudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2YsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0vKiAKLVJOLFJEICAnbScsJ0UnLCdEJywnRCcKLUNSQixSTiAgJ3MnLCdDJywnIScsJ0UnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsUk5ERUMgICdzJywnQycsJyEnLCdFJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLFJOSU5DICAncycsJ0MnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLUNSQixSTklORCAgJ3MnLCdDJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsUk5JTkRfRDggICdzJywnQycsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsUk5JTkRfRDE2ICAncycsJ0MnLCchJywnRScKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1SUyxSRCAgJy0nLCdYJywnIScsJyEnCi1STiwwICAnYScsJ0UnLCchJywnIScKLVJTLFJEICAnLScsJ1gnLCchJywnIScKLVJOLDAgICdhJywnRScsJyEnLCchJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJyEnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQywwICAnYScsJ0UnLCchJywnIScKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLDAgICdhJywnRScsJyEnLCchJwotUk5JTkMsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCwwICAnYScsJ0UnLCchJywnIScKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELDAgICdhJywnRScsJyEnLCchJwotUk5JTkRfRDgsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCwwICAnYScsJ0UnLCchJywnIScKLVJOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STiwwICAnYScsJ0UnLCchJywnIScKLVJOSU5ELDAgICdhJywnRScsJyEnLCchJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJyEnCi1STklOQywwICAnYScsJ0UnLCchJywnIScKLUFCUzgsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORF9EOCwwICAnYScsJ0UnLCchJywnIScKLVJELDAgICdtJywnRCcsJyEnLCdEJwotQUJTMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORF9EMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1STiwwICAncycsJ0UnLCchJywnRScKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLDAgICdzJywnRScsJyEnLCdFJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORCwwICAncycsJ0UnLCchJywnRScKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LDAgICdzJywnRScsJyEnLCdFJwotUk4sMCAgJ3MnLCdFJywnIScsJ0UnCi1STklORCwwICAncycsJ0UnLCchJywnRScKLVJOSU5DLDAgICdzJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ3MnLCdFJywnIScsJ0UnCi1JTU04LDAgICdzJywnRScsJyEnLCdFJwotQUJTOCwwICAncycsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdzJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklORF9EOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1SRCwwICAnbScsJ0QnLCchJywnRCcKLVJOSU5EX0QxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsMCAgJ3MnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnYScsJ0UnLCchJywnIScKLVJOLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICctJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnIScKLUlNTTgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU04LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTgsQ1JCICAncycsJ0UnLCdDJywnQycKLUlNTTgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NOCwwICAnYScsJ0UnLCchJywnIScKLUlNTTgsMCAgJ3MnLCdFJywnIScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsQUJTOCAgJ3MnLCdDJywnIScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsMCAgJ2EnLCdFJywnIScsJyEnCi1BQlM4LDAgICdzJywnRScsJyEnLCdFJwotUk4sUkQgICctJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICctJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICctJywnRScsJ0QnLCdEJwotSU1NNCwwICAnLScsJ0knLCchJywnIScKLTAsMCAgJy0nLCdCJywnIScsJyEnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixDUlcgICdzJywnRScsJ0MnLCdDJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsMCAgJ2EnLCdFJywnIScsJyEnCi1GUCwwICAnLScsJ0InLCchJywnIScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUNSQixBQlMxNiAgJ3MnLCdDJywnIScsJ0UnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STElTVCxTUERFQyAgJy0nLCdJJywnIScsJ0UnCi1DUlcsUk4gICdzJywnQycsJyEnLCdFJwotQ1JXLFJOREVDICAncycsJ0MnLCchJywnRScKLUNSVyxSTklOQyAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkQgICdzJywnQycsJyEnLCdFJwotQ1JXLEFCUzggICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5EX0Q4ICAncycsJ0MnLCchJywnRScKLUNSVyxBQlMxNiAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkRfRDE2ICAncycsJ0MnLCchJywnRScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LDAgICdhJywnRScsJyEnLCchJwotQUJTMTYsMCAgJ3MnLCdFJywnIScsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNiwwICAnYScsJ0UnLCchJywnIScKLUNSVyxSTiAgJ3MnLCdDJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLUNSQixSTkRFQyAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkQgICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5DICAncycsJ0MnLCchJywnRScKLUNSVyxSTkRFQyAgJ3MnLCdDJywnIScsJ0UnCi1DUkIsUk5JTkQgICdzJywnQycsJyEnLCdFJwotQ1JCLFJOSU5DICAncycsJ0MnLCchJywnRScKLUNSVyxSTklORF9EOCAgJ3MnLCdDJywnIScsJ0UnCi1DUkIsQUJTOCAgJ3MnLCdDJywnIScsJ0UnCi1DUkIsUk5JTkRfRDggICdzJywnQycsJyEnLCdFJwotQ1JXLEFCUzggICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5EX0QxNiAgJ3MnLCdDJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLUNSQixBQlMxNiAgJ3MnLCdDJywnIScsJ0UnCi1DUkIsUk5JTkRfRDE2ICAncycsJ0MnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1DUlcsQUJTMTYgICdzJywnQycsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLUNSQixSTiAgJ3MnLCdDJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLTAsMCAgJy0nLCchJywnIScsJyEnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJTLFBDUkVMOCAgJy0nLCdCJywnUycsJ1MnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUlMsUENSRUw4ICAnLScsJ0InLCdTJywnUycKLVJTLFBDUkVMOCAgJy0nLCdCJywnUycsJ1MnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJy0nLCdCJywnIScsJyEnCi1JTU04LDAgICctJywnQicsJyEnLCchJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotMCwwICAnLScsJ0InLCchJywnIScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsUkQgICdtJywnSScsJyEnLCdEJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUZQSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLUZQSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUlMsUk5ERUMgICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNixSRCAgJ20nLCdJJywnIScsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJOLFJEICAnLScsJ0UnLCchJywnRCcKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJyEnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJwotUk5ERUMsUkQgICctJywnRScsJyEnLCdEJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJTLFJOICAnLScsJ1MnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STiwwICAnYScsJ0UnLCchJywnRScKLVJOLDAgICdtJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STiwwICAnYScsJ0UnLCchJywnRScKLVJOLDAgICdtJywnRScsJyEnLCdFJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5ERUMgICctJywnUycsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnYScsJ0UnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJ0UnCi1STkRFQywwICAnbScsJ0UnLCchJywnRScKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOREVDLDAgICdtJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnYScsJ0UnLCchJywnRScKLVJOSU5DLDAgICdtJywnRScsJyEnLCdFJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkMsMCAgJ2EnLCdFJywnIScsJ0UnCi1JTU04LENSQiAgJ3MnLCdJJywnQycsJ0MnCi1JTU0xNixDUlcgICdzJywnSScsJ0MnLCdDJwotUk5JTkMsMCAgJ20nLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5ELDAgICdhJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ20nLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5ELDAgICdhJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ20nLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ20nLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ20nLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMjQsMCAgJy0nLCdKJywnIScsJyEnCi1JTU04LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTgsQ1JCICAncycsJ0knLCdDJywnQycKLUlNTTgsMCAgJ2EnLCdFJywnIScsJ0UnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJyEnLCdEJwotUk5JTkRfRDE2LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCwwICAnbScsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2EnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdtJywnRScsJyEnLCdFJwotUk4sMCAgJ20nLCdFJywnIScsJ0UnCi1STklORCwwICAnbScsJ0UnLCchJywnRScKLVJOREVDLDAgICdtJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ20nLCdFJywnIScsJ0UnCi1BQlM4LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ20nLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnbScsJ0UnLCchJywnRScKLUlNTTE2LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdtJywnRScsJyEnLCdFJwotSU1NOCxSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotMCwwICAnLScsJyEnLCchJywnIScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixDUlcgICdzJywnSScsJ0MnLCdDJwotSU1NMTYsMCAgJ2EnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnbScsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlM4LDAgICdhJywnRScsJyEnLCdFJwotQUJTOCwwICAnbScsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1SRElORCwwICAnLScsJ0onLCchJywnIScKLVJESU5ELDAgICctJywnSicsJyEnLCchJwotSU1NOCwwICAnLScsJ0InLCchJywnIScKLTAsMCAgJy0nLCdCJywnIScsJyEnCi1JTU0xNiwwICAnLScsJ0InLCchJywnIScKLUFCUzI0LDAgICctJywnSicsJyEnLCchJwotQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk4sMCAgJ2EnLCdFJywnIScsJ0UnCi1STkRFQywwICAnYScsJ0UnLCchJywnRScKLVJOSU5DLDAgICdhJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2EnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2EnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnYScsJ0UnLCchJywnRScKLUlNTTE2LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdhJywnRScsJyEnLCdFJwotUk5ERUMsUkQgICdwJywnRScsJ0QnLCdEJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdwJywnRScsJ0QnLCdEJwotSU1NOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAncCcsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAncCcsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdwJywnRScsJ0QnLCdEJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJTLEFCUzE2ICAnbScsJ1MnLCchJywnRScKLUFCUzE2LFJEICAncCcsJ0UnLCdEJywnRCcKLVJOLFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAncCcsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAncCcsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdwJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdwJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAncCcsJ0UnLCdEJywnRCcKLVJTLFJOSU5DICAnLScsJ1MnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUlMsUk5JTkQgICctJywnUycsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxSTklORF9EOCAgJy0nLCdTJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJwotUlMsUk5JTkRfRDE2ICAnLScsJ1MnLCchJywnRScKLVJTLEFCUzggICctJywnUycsJyEnLCdFJwotUlMsUk4gICctJywnUycsJyEnLCdFJwotUlMsUk5ERUMgICctJywnUycsJyEnLCdFJwotUlMsUk5JTkQgICctJywnUycsJyEnLCdFJwotUlMsUk5JTkMgICctJywnUycsJyEnLCdFJwotUlMsQUJTOCAgJy0nLCdTJywnIScsJ0UnCi1STklORCxSRCAgJy0nLCdFJywnIScsJ0QnCi1SUyxBQlMxNiAgJy0nLCdTJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICctJywnUycsJyEnLCdFJwotUk5JTkMsUkQgICctJywnRScsJyEnLCdEJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDggICctJywnUycsJyEnLCdFJwotUk5JTkRfRDgsUkQgICctJywnRScsJyEnLCdEJwotSU1NOCxSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EMTYsUkQgICctJywnRScsJyEnLCdEJwotSU1NOCxSRCAgJy0nLCdFJywnIScsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCchJywnRCcKLVJOLFJEICAnLScsJ0UnLCchJywnRCcKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsUkQgICctJywnRScsJyEnLCdEJwotUk5ERUMsUkQgICctJywnRScsJyEnLCdEJwotSU1NOCxSRCAgJy0nLCdFJywnIScsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCchJywnRCcKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCchJywnRCcKLUFCUzE2LFJEICAnLScsJ0UnLCchJywnRCcKLVJOSU5EX0QxNixSRCAgJy0nLCdFJywnIScsJ0QnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1STkRFQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1STklOQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnSScsJyEnLCdEJwotUlMsUk5ERUMgICdtJywnUycsJyEnLCdFJwotUlMsUk5JTkMgICdtJywnUycsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkQgICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDggICdtJywnUycsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJOSU5DLFJEICAnLScsJ0UnLCchJywnRCcKLUlNTTgsUk5ERUMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5ERUMgICdtJywnSScsJyEnLCdFJwotUk5JTkMsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkMgICdtJywnUycsJyEnLCdFJwotSU1NOCxSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORCAgJ20nLCdTJywnIScsJ0UnCi1JTU04LFJOSU5EICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5EICAnbScsJ0knLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLUlNTTE2LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDE2ICAnbScsJ1MnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsUkQgICdtJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLUlNTTgsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlM4ICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnIScsJ0QnCi1SUyxBQlMxNiAgJy0nLCdTJywnIScsJ0UnCi1JTU04LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUFCUzE2LDAgICdhJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCi1BQlMxNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1BQlMxNiwwICAnYScsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUlMsUk5JTkMgICdtJywnUycsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkQgICdtJywnUycsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5ERUMgICdtJywnUycsJyEnLCdFJwotUk5JTkMsUkQgICdtJywnRScsJyEnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDggICdtJywnUycsJyEnLCdFJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU04LFJOSU5EICAnbScsJ0knLCchJywnRScKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5DICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotSU1NOCxBQlM4ICAnbScsJ0knLCchJywnRScKLVJTLFJOSU5EX0QxNiAgJ20nLCdTJywnIScsJ0UnCi1JTU0xNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNixSTklORCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1SUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJyEnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotSU1NOCxBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlM4ICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1BQlMxNiwwICAnbScsJ0UnLCchJywnRScKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzE2LDAgICdtJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxGUElORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1GUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsUkQgICdtJywnSScsJyEnLCdEJwotUlMsRlBJTkRfRDggICdtJywnUycsJyEnLCdFJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKLUZQSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDggICdtJywnUycsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnSScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNixSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklORCAgJ20nLCdJJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJwotUlMsQUJTMTYgICdtJywnUycsJyEnLCdFJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUkQgICdtJywnRScsJyEnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzggICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUZQSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUk5JTkMsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkQgICdtJywnUycsJyEnLCdFJwotUlMsUk5JTkMgICdtJywnUycsJyEnLCdFJwotUlMsUk5ERUMgICdtJywnUycsJyEnLCdFJwotUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJwotUlMsRlBJTkRfRDggICdtJywnUycsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJyEnLCdEJwotUk4sUkQgICdtJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU04LFJEICAnbScsJ0knLCchJywnRCcKLUlNTTgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1JTU04LFJOSU5EICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NOCxSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLUlNTTgsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxBQlM4ICAnbScsJ0knLCchJywnRScKLVJTLEFCUzE2ICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5EX0QxNiAgJ20nLCdTJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkQgICdtJywnUycsJyEnLCdFJwotUlMsUk5JTkMgICdtJywnUycsJyEnLCdFJwotUlMsUk5ERUMgICdtJywnUycsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJyEnLCdEJwotUlMsRlBJTkRfRDggICdtJywnUycsJyEnLCdFJwotUk5JTkMsUkQgICdtJywnRScsJyEnLCdEJwotRlBJTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxSRCAgJ20nLCdJJywnIScsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1JTU04LFJOSU5EICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NOCxSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUkQgICdtJywnSScsJyEnLCdEJwotSU1NOCxBQlM4ICAnbScsJ0knLCchJywnRScKLVJTLFJOSU5EX0QxNiAgJ20nLCdTJywnIScsJ0UnCi1JTU0xNixSTklORCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1SUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCi1JTU0xNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU04LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNixSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1JTU04LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzggICdtJywnSScsJyEnLCdFJwotSU1NOCxSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotSU1NMTYsQUJTMTYgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLUlNTTgsUkQgICdhJywnRCcsJ0knLCchJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTiAgJ2EnLCdFJywnSScsJyEnCi1STixDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkQsQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5DLENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STkRFQyxDUlcgICdzJywnRScsJyEnLCdDJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkRfRDgsQ1JXICAncycsJ0UnLCchJywnQycKLUlNTTE2LFJOICAnYScsJ0UnLCdJJywnIScKLUFCUzE2LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STklORF9EMTYsQ1JXICAncycsJ0UnLCchJywnQycKLVJOLENSQiAgJ3MnLCdFJywnIScsJ0MnCi1BQlM4LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1JTU0xNixSRCAgJ2EnLCdEJywnSScsJyEnCi1STixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1SUyxSRCAgJ3MnLCdEJywnIScsJyEnCi1SUyxSRCAgJ3MnLCdEJywnIScsJyEnCi1SRCwwICAncycsJ0QnLCchJywnRCcKLVJELDAgICdzJywnRCcsJyEnLCdEJwotUk4sUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsQ1JCICAncycsJ0UnLCchJywnQycKLVJOLENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STklOQyxDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkQsQ1JCICAncycsJ0UnLCchJywnQycKLVJOREVDLENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STklORCxDUlcgICdzJywnRScsJyEnLCdDJwotUk5ERUMsQ1JCICAncycsJ0UnLCchJywnQycKLVJOSU5DLENSQiAgJ3MnLCdFJywnIScsJ0MnCi1BQlM4LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1BQlM4LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1JTU04LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STklORF9EOCxDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkRfRDgsQ1JCICAncycsJ0UnLCchJywnQycKLUFCUzE2LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1BQlMxNixDUlcgICdzJywnRScsJyEnLCdDJwotSU1NMTYsQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5EX0QxNixDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkRfRDE2LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STklORF9EMTYsQ1JCICAncycsJ0UnLCchJywnQycKLUFCUzE2LDAgICctJywnQicsJyEnLCchJwotUkRJTkQsMCAgJy0nLCdCJywnIScsJyEnCi1SRElORCwwICAnLScsJ0InLCchJywnIScKLVJESU5EX0Q4LDAgICctJywnQicsJyEnLCchJwotUkRJTkRfRDgsMCAgJy0nLCdCJywnIScsJyEnCi1SRElORF9EMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SRElORF9EMTYsMCAgJy0nLCdCJywnIScsJyEnCi1BQlMxNiwwICAnLScsJ0InLCchJywnIScKLVJELDAgICdzJywnRCcsJyEnLCdEJwotQUJTMTYsQ1JCICAncycsJ0UnLCchJywnQycKLVJELDAgICdzJywnRCcsJyEnLCdEJwotUk4sQ1JXICAncycsJ0UnLCchJywnQycKLVJOREVDLFJEICAncycsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5DLENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STklOQyxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORCxDUkIgICdzJywnRScsJyEnLCdDJwotUk5JTkQsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1JTU04LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1JTU04LFJEICAncycsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdzJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdzJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdzJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdzJywnRScsJ0QnLCdEJwotUk4sUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdzJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdzJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdzJywnRScsJ0QnLCdEJwotQUJTOCxDUkIgICdzJywnRScsJyEnLCdDJwotQUJTOCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdEJywnSScsJyEnCi1STkRFQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STkRFQyxDUkIgICdzJywnRScsJyEnLCdDJwotSU1NOCxSTkRFQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTkRFQyAgJ2EnLCdFJywnSScsJyEnCi1STkRFQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklOQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJOSU5DICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5DICAnYScsJ0UnLCdJJywnIScKLVJOSU5DLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5ELFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUk5JTkQgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkQgICdhJywnRScsJ0knLCchJwotUk5JTkQsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTklORF9EOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORF9EOCAgJ2EnLCdFJywnSScsJyEnCi1STklORF9EOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTklORF9EMTYgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDE2ICAnYScsJ0UnLCdJJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1TUElOQyxSTElTVCAgJy0nLCdFJywnIScsJ0MnCi1JTU04LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxBQlM4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LEFCUzggICdhJywnRScsJ0knLCchJwotSU1NMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsQ1JXICAncycsJ0UnLCchJywnQycKLUFCUzgsUkQgICdhJywnRCcsJ0UnLCchJwotQUJTMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxBQlMxNiAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixBQlMxNiAgJ2EnLCdFJywnSScsJyEnCi1BQlMxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1GUCxJTU0xNiAgJy0nLCdTJywnSScsJyEnCi1STixSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORCxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklOQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STkRFQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORF9EOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1BQlM4LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJOSU5DICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOREVDICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSTklORF9EOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixBQlM4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EX0QxNiAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixBQlMxNiAgJ2EnLCdFJywnSScsJyEnCi1GUCxJTU04ICAnLScsJ1MnLCdJJywnIScKLUlNTTgsUkQgICdhJywnRCcsJ0knLCchJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkQsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUkQgICdhJywnRCcsJ0knLCchJwotUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJwotQUJTOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTkRFQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORCAgJ2EnLCdFJywnSScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJwotQUJTMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUk4gICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORF9EMTYgICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTMTYgICdhJywnRScsJ0knLCchJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkMsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSRCAgJ2EnLCdEJywnSScsJyEnCi1STklORCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJOICAnYScsJ0UnLCdJJywnIScKLUlNTTgsUk5JTkQgICdhJywnRScsJ0knLCchJwotSU1NOCxSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1JTU04LFJOREVDICAnYScsJ0UnLCdJJywnIScKLUFCUzgsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LEFCUzggICdhJywnRScsJ0knLCchJwotQUJTMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTklORF9EOCAgJ2EnLCdFJywnSScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxBQlMxNiAgJ2EnLCdFJywnSScsJyEnCi1JTU04LFJOSU5EX0QxNiAgJ2EnLCdFJywnSScsJyEnCi1STixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJEICAnYScsJ0QnLCdJJywnIScKLVJOSU5DLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5ELFJEICAnYScsJ0QnLCdFJywnIScKLVJOREVDLFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdJJywnIScKLVJOSU5EX0Q4LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUk4gICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5ERUMgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkQgICdhJywnRScsJ0knLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJOSU5DICAnYScsJ0UnLCdJJywnIScKLUFCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LEFCUzggICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTMTYgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDE2ICAnYScsJ0UnLCdJJywnIScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1STiwwICAnYycsJyEnLCchJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1STkRFQywwICAnYycsJyEnLCchJywnRScKLVJOSU5DLDAgICdjJywnIScsJyEnLCdFJwotUk5JTkQsMCAgJ2MnLCchJywnIScsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1STklORF9EOCwwICAnYycsJyEnLCchJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1STklORF9EMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU04LDAgICdjJywnIScsJyEnLCdFJwotQUJTOCwwICAnYycsJyEnLCchJywnRScKLVJOLDAgICdjJywnIScsJyEnLCdFJwotUk5JTkQsMCAgJ2MnLCchJywnIScsJ0UnCi1STklOQywwICAnYycsJyEnLCchJywnRScKLVJOREVDLDAgICdjJywnIScsJyEnLCdFJwotQUJTOCwwICAnYycsJyEnLCchJywnRScKLVJOSU5EX0Q4LDAgICdjJywnIScsJyEnLCdFJwotSU1NMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1BQlMxNiwwICAnYycsJyEnLCchJywnRScKLVJOSU5EX0QxNiwwICAnYycsJyEnLCchJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLVJOREVDLDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotUk5JTkRfRDgsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotSU1NMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1BQlM4LDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1BQlMxNiwwICAnYycsJyEnLCchJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotQUJTMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVJOLDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUk5JTkMsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUk5JTkQsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVFJTSxSTiAgJ2EnLCdJJywnRScsJ0UnCi1STixSRCAgJy0nLCdFJywnRCcsJ0QnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICctJywnRScsJ0QnLCdEJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotUUlNLFJOREVDICAnYScsJ0knLCdFJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkMsUkQgICctJywnRScsJ0QnLCdEJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVFJTSxSTklOQyAgJ2EnLCdJJywnRScsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1RSU0sUk5JTkMgICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5EICAnYScsJ0knLCdFJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1RSU0sUk5JTkRfRDggICdhJywnSScsJ0UnLCdFJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUUlNLFJOSU5EX0QxNiAgJ2EnLCdJJywnRScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU04LENSQiAgJ3MnLCdJJywnUycsJ1MnCi1JTU0xNixDUlcgICdzJywnSScsJ1MnLCdTJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUUlNLFJOSU5EX0QxNiAgJ2EnLCdJJywnRScsJ0UnCi1STklORF9EMTYsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU04LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTgsQ1JCICAncycsJ0knLCdTJywnUycKLUlNTTgsUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1RSU0sQUJTOCAgJ2EnLCdJJywnRScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixDUlcgICdzJywnSScsJ1MnLCdTJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVFJTSxBQlM4ICAnYScsJ0knLCdFJywnRScKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi0wLDAgICctJywnIScsJyEnLCchJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLUFCUzE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVJOLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICctJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICctJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVFJTSxSTiAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5ERUMgICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sQUJTOCAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkRfRDggICdhJywnSScsJ0UnLCdFJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5EICAnYScsJ0knLCdFJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkMgICdhJywnSScsJ0UnLCdFJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOSU5EX0QxNiAgJ2EnLCdJJywnRScsJ0UnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sQUJTMTYgICdhJywnSScsJ0UnLCdFJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTiAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkMgICdhJywnSScsJ0UnLCdFJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOSU5EICAnYScsJ0knLCdFJywnRScKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5JTkRfRDggICdhJywnSScsJ0UnLCdFJwotSU1NOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sQUJTOCAgJ2EnLCdJJywnRScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUUlNLFJOREVDICAnYScsJ0knLCdFJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkMgICdhJywnSScsJ0UnLCdFJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOSU5EX0QxNiAgJ2EnLCdJJywnRScsJ0UnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sQUJTMTYgICdhJywnSScsJ0UnLCdFJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLSovIAotezAsMCwwfX0KLSNlbmRpZgotOwotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGNvZGVzL2hwcGEtZGlzLmMgYi9vcGNvZGVzL2hwcGEtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNDVkNWUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9ocHBhLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMxICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlciBmb3IgdGhlIFBBLVJJU0MuIFNvbWV3aGF0IGRlcml2ZWQgZnJvbSBzcGFyYy1waW5zbi5jLgotICAgQ29weXJpZ2h0IDE5ODksIDE5OTAsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlCi0gICBVbml2ZXJzaXR5IG9mIFV0YWggKHBhLWdkYi1idWdzQGNzLnV0YWguZWR1KS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImxpYmhwcGEuaCIKLSNpbmNsdWRlICJvcGNvZGUvaHBwYS5oIgotCi0vKiBJbnRlZ2VyIHJlZ2lzdGVyIG5hbWVzLCBpbmRleGVkIGJ5IHRoZSBudW1iZXJzIHdoaWNoIGFwcGVhciBpbiB0aGUKLSAgIG9wY29kZXMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHJlZ19uYW1lc1tdID0gCi0geyJmbGFncyIsICJyMSIsICJycCIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsICJyOCIsICJyOSIsCi0gICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIsICJyMTYiLCAicjE3IiwgInIxOCIsICJyMTkiLAotICAicjIwIiwgInIyMSIsICJyMjIiLCAicjIzIiwgInIyNCIsICJyMjUiLCAicjI2IiwgImRwIiwgInJldDAiLCAicmV0MSIsCi0gICJzcCIsICJyMzEifTsKLQotLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgbmFtZXMsIGluZGV4ZWQgYnkgdGhlIG51bWJlcnMgd2hpY2ggYXBwZWFyIGluIHRoZQotICAgb3Bjb2Rlcy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZnBfcmVnX25hbWVzW10gPSAKLSB7ImZwc3IiLCAiZnBlMiIsICJmcGU0IiwgImZwZTYiLCAKLSAgImZyNCIsICJmcjUiLCAiZnI2IiwgImZyNyIsICJmcjgiLCAKLSAgImZyOSIsICJmcjEwIiwgImZyMTEiLCAiZnIxMiIsICJmcjEzIiwgImZyMTQiLCAiZnIxNSIsIAotICAiZnIxNiIsICJmcjE3IiwgImZyMTgiLCAiZnIxOSIsICJmcjIwIiwgImZyMjEiLCAiZnIyMiIsICJmcjIzIiwKLSAgImZyMjQiLCAiZnIyNSIsICJmcjI2IiwgImZyMjciLCAiZnIyOCIsICJmcjI5IiwgImZyMzAiLCAiZnIzMSJ9OwotCi10eXBlZGVmIHVuc2lnbmVkIGludCBDT1JFX0FERFI7Ci0KLS8qIEdldCBhdCB2YXJpb3VzIHJlbGV2ZW50IGZpZWxkcyBvZiBhbiBpbnN0cnVjdGlvbiB3b3JkLiAqLwotCi0jZGVmaW5lIE1BU0tfNSAweDFmCi0jZGVmaW5lIE1BU0tfMTEgMHg3ZmYKLSNkZWZpbmUgTUFTS18xNCAweDNmZmYKLSNkZWZpbmUgTUFTS18yMSAweDFmZmZmZgotCi0vKiBUaGlzIG1hY3JvIGdldHMgYml0IGZpZWxkcyB1c2luZyBIUCdzIG51bWJlcmluZyAoTVNCID0gMCkgKi8KLQotI2RlZmluZSBHRVRfRklFTEQoWCwgRlJPTSwgVE8pIFwKLSAgKChYKSA+PiAoMzEgLSAoVE8pKSAmICgoMSA8PCAoKFRPKSAtIChGUk9NKSArIDEpKSAtIDEpKQotCi0vKiBTb21lIG9mIHRoZXNlIGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8gMi1kIGFycmF5cyBiZWNhdXNlIHRoZXkKLSAgIGNvbnN1bWUgbGVzcyBzdG9yYWdlIHRoaXMgd2F5LiAgSWYgdGhlIG1haW50ZW5hbmNlIGJlY29tZXMgYQotICAgcHJvYmxlbSwgY29udmVydCB0aGVtIGJhY2sgdG8gY29uc3QgMS1kIHBvaW50ZXIgYXJyYXlzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyIGNvbnRyb2xfcmVnW11bNl0gPSB7Ci0gICJyY3RyIiwgImNyMSIsICJjcjIiLCAiY3IzIiwgImNyNCIsICJjcjUiLCAiY3I2IiwgImNyNyIsCi0gICJwaWRyMSIsICJwaWRyMiIsICJjY3IiLCAic2FyIiwgInBpZHIzIiwgInBpZHI0IiwKLSAgIml2YSIsICJlaWVtIiwgIml0bXIiLCAicGNzcSIsICJwY29xIiwgImlpciIsICJpc3IiLAotICAiaW9yIiwgImlwc3ciLCAiZWlyciIsICJ0cjAiLCAidHIxIiwgInRyMiIsICJ0cjMiLAotICAidHI0IiwgInRyNSIsICJ0cjYiLCAidHI3IgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgY29tcGFyZV9jb25kX25hbWVzW11bNV0gPSB7Ci0gICIiLCAiLD0iLCAiLDwiLCAiLDw9IiwgIiw8PCIsICIsPDw9IiwgIixzdiIsCi0gICIsb2QiLCAiLHRyIiwgIiw8PiIsICIsPj0iLCAiLD4iLCAiLD4+PSIsCi0gICIsPj4iLCAiLG5zdiIsICIsZXYiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgYWRkX2NvbmRfbmFtZXNbXVs1XSA9IHsKLSAgIiIsICIsPSIsICIsPCIsICIsPD0iLCAiLG51diIsICIsem52IiwgIixzdiIsCi0gICIsb2QiLCAiLHRyIiwgIiw8PiIsICIsPj0iLCAiLD4iLCAiLHV2IiwKLSAgIix2bnoiLCAiLG5zdiIsICIsZXYiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGxvZ2ljYWxfY29uZF9uYW1lc1tdID0gewotICAiIiwgIiw9IiwgIiw8IiwgIiw8PSIsIDAsIDAsIDAsICIsb2QiLAotICAiLHRyIiwgIiw8PiIsICIsPj0iLCAiLD4iLCAwLCAwLCAwLCAiLGV2In07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdW5pdF9jb25kX25hbWVzW10gPSB7Ci0gICIiLCAwLCAiLHNieiIsICIsc2h6IiwgIixzZGMiLCAwLCAiLHNiYyIsICIsc2hjIiwKLSAgIix0ciIsIDAsICIsbmJ6IiwgIixuaHoiLCAiLG5kYyIsIDAsICIsbmJjIiwgIixuaGMiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgc2hpZnRfY29uZF9uYW1lc1tdWzRdID0gewotICAiIiwgIiw9IiwgIiw8IiwgIixvZCIsICIsdHIiLCAiLDw+IiwgIiw+PSIsICIsZXYiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgaW5kZXhfY29tcGxfbmFtZXNbXVs0XSA9IHsiIiwgIixtIiwgIixzIiwgIixzbSJ9Owotc3RhdGljIGNvbnN0IGNoYXIgc2hvcnRfbGRzdF9jb21wbF9uYW1lc1tdWzRdID0geyIiLCAiLG1hIiwgIiIsICIsbWIifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzaG9ydF9ieXRlc19jb21wbF9uYW1lc1tdID0gewotICAiIiwgIixiLG0iLCAiLGUiLCAiLGUsbSIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZmxvYXRfZm9ybWF0X25hbWVzW10gPSB7IixzZ2wiLCAiLGRibCIsICIiLCAiLHF1YWQifTsKLXN0YXRpYyBjb25zdCBjaGFyIGZsb2F0X2NvbXBfbmFtZXNbXVs4XSA9Ci17Ci0gICIsZmFsc2U/IiwgIixmYWxzZSIsICIsPyIsICIsITw9PiIsICIsPSIsICIsPXQiLCAiLD89IiwgIiwhPD4iLAotICAiLCE/Pj0iLCAiLDwiLCAiLD88IiwgIiwhPj0iLCAiLCE/PiIsICIsPD0iLCAiLD88PSIsICIsIT4iLAotICAiLCE/PD0iLCAiLD4iLCAiLD8+IiwgIiwhPD0iLCAiLCE/PCIsICIsPj0iLCAiLD8+PSIsICIsITwiLAotICAiLCE/PSIsICIsPD4iLCAiLCE9IiwgIiwhPXQiLCAiLCE/IiwgIiw8PT4iLCAiLHRydWU/IiwgIix0cnVlIgotfTsKLQotLyogRm9yIGEgYnVuY2ggb2YgZGlmZmVyZW50IGluc3RydWN0aW9ucyBmb3JtIGFuIGluZGV4IGludG8gYSAKLSAgIGNvbXBsZXRlciBuYW1lIHRhYmxlLiAqLwotI2RlZmluZSBHRVRfQ09NUEwoaW5zbikgKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSB8IFwKLQkJCSBHRVRfRklFTEQgKGluc24sIDE4LCAxOCkgPDwgMSkKLQotI2RlZmluZSBHRVRfQ09ORChpbnNuKSAoR0VUX0ZJRUxEICgoaW5zbiksIDE2LCAxOCkgKyBcCi0JCQkoR0VUX0ZJRUxEICgoaW5zbiksIDE5LCAxOSkgPyA4IDogMCkpCi0KLS8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gcHJpbnQgcmVnaXN0ZXJzLiAgUHV0IHRoZXNlIGZpcnN0LCBzbyBnY2MncyBmdW5jdGlvbgotICAgaW5saW5pbmcgY2FuIGRvIGl0cyBzdHVmZi4gICovCi0KLSNkZWZpbmUgZnB1dHNfZmlsdGVyZWQoU1RSLEYpCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBTVFIpCi0KLXN0YXRpYyB2b2lkCi1mcHV0X3JlZyAocmVnLCBpbmZvKQotICAgICB1bnNpZ25lZCByZWc7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCByZWcgPyByZWdfbmFtZXNbcmVnXSA6ICJyMCIpOwotfQotCi1zdGF0aWMgdm9pZAotZnB1dF9mcF9yZWcgKHJlZywgaW5mbykKLSAgICAgdW5zaWduZWQgcmVnOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgcmVnID8gZnBfcmVnX25hbWVzW3JlZ10gOiAiZnIwIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1mcHV0X2ZwX3JlZ19yIChyZWcsIGluZm8pCi0gICAgIHVuc2lnbmVkIHJlZzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgLyogU3BlY2lhbCBjYXNlIGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiByZWdpc3RlcnMuICAqLwotICBpZiAocmVnIDwgNCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImZwZSVkIiwgcmVnICogMiArIDEpOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1IiLCByZWcgPyBmcF9yZWdfbmFtZXNbcmVnXSAKLQkJCQkJCSAgICA6ICJmcjAiKTsKLX0KLQotc3RhdGljIHZvaWQKLWZwdXRfY3JlZyAocmVnLCBpbmZvKQotICAgICB1bnNpZ25lZCByZWc7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBjb250cm9sX3JlZ1tyZWddKTsKLX0KLQotLyogcHJpbnQgY29uc3RhbnRzIHdpdGggc2lnbiAqLwotCi1zdGF0aWMgdm9pZAotZnB1dF9jb25zdCAobnVtLCBpbmZvKQotICAgICB1bnNpZ25lZCBudW07Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGlmICgoaW50KW51bSA8IDApCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItJXgiLCAtKGludCludW0pOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIleCIsIG51bSk7Ci19Ci0KLS8qIFJvdXRpbmVzIHRvIGV4dHJhY3QgdmFyaW91cyBzaXplZCBjb25zdGFudHMgb3V0IG9mIGhwcGEKLSAgIGluc3RydWN0aW9ucy4gKi8KLQotLyogZXh0cmFjdCBhIDMtYml0IHNwYWNlIHJlZ2lzdGVyIG51bWJlciBmcm9tIGEgYmUsIGJsZSwgbXRzcCBvciBtZnNwICovCi1zdGF0aWMgaW50Ci1leHRyYWN0XzMgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBHRVRfRklFTEQgKHdvcmQsIDE4LCAxOCkgPDwgMiB8IEdFVF9GSUVMRCAod29yZCwgMTYsIDE3KTsKLX0KLQotc3RhdGljIGludAotZXh0cmFjdF81X2xvYWQgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBsb3dfc2lnbl9leHRlbmQgKHdvcmQgPj4gMTYgJiBNQVNLXzUsIDUpOwotfQotCi0vKiBleHRyYWN0IHRoZSBpbW1lZGlhdGUgZmllbGQgZnJvbSBhIHN0e2Jod31zIGluc3RydWN0aW9uICovCi1zdGF0aWMgaW50Ci1leHRyYWN0XzVfc3RvcmUgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBsb3dfc2lnbl9leHRlbmQgKHdvcmQgJiBNQVNLXzUsIDUpOwotfQotCi0vKiBleHRyYWN0IHRoZSBpbW1lZGlhdGUgZmllbGQgZnJvbSBhIGJyZWFrIGluc3RydWN0aW9uICovCi1zdGF0aWMgdW5zaWduZWQKLWV4dHJhY3RfNXJfc3RvcmUgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiAod29yZCAmIE1BU0tfNSk7Ci19Ci0KLS8qIGV4dHJhY3QgdGhlIGltbWVkaWF0ZSBmaWVsZCBmcm9tIGEge3NyfXNtIGluc3RydWN0aW9uICovCi1zdGF0aWMgdW5zaWduZWQKLWV4dHJhY3RfNVJfc3RvcmUgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiAod29yZCA+PiAxNiAmIE1BU0tfNSk7Ci19Ci0KLS8qIGV4dHJhY3QgdGhlIGltbWVkaWF0ZSBmaWVsZCBmcm9tIGEgYmIgaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyB1bnNpZ25lZAotZXh0cmFjdF81UV9zdG9yZSAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuICh3b3JkID4+IDIxICYgTUFTS181KTsKLX0KLQotLyogZXh0cmFjdCBhbiAxMSBiaXQgaW1tZWRpYXRlIGZpZWxkICovCi1zdGF0aWMgaW50Ci1leHRyYWN0XzExICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gbG93X3NpZ25fZXh0ZW5kICh3b3JkICYgTUFTS18xMSwgMTEpOwotfQotCi0vKiBleHRyYWN0IGEgMTQgYml0IGltbWVkaWF0ZSBmaWVsZCAqLwotc3RhdGljIGludAotZXh0cmFjdF8xNCAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIGxvd19zaWduX2V4dGVuZCAod29yZCAmIE1BU0tfMTQsIDE0KTsKLX0KLQotLyogZXh0cmFjdCBhIDIxIGJpdCBjb25zdGFudCAqLwotCi1zdGF0aWMgaW50Ci1leHRyYWN0XzIxICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICBpbnQgdmFsOwotCi0gIHdvcmQgJj0gTUFTS18yMTsKLSAgd29yZCA8PD0gMTE7Ci0gIHZhbCA9IEdFVF9GSUVMRCAod29yZCwgMjAsIDIwKTsKLSAgdmFsIDw8PSAxMTsKLSAgdmFsIHw9IEdFVF9GSUVMRCAod29yZCwgOSwgMTkpOwotICB2YWwgPDw9IDI7Ci0gIHZhbCB8PSBHRVRfRklFTEQgKHdvcmQsIDUsIDYpOwotICB2YWwgPDw9IDU7Ci0gIHZhbCB8PSBHRVRfRklFTEQgKHdvcmQsIDAsIDQpOwotICB2YWwgPDw9IDI7Ci0gIHZhbCB8PSBHRVRfRklFTEQgKHdvcmQsIDcsIDgpOwotICByZXR1cm4gc2lnbl9leHRlbmQgKHZhbCwgMjEpIDw8IDExOwotfQotCi0vKiBleHRyYWN0IGEgMTIgYml0IGNvbnN0YW50IGZyb20gYnJhbmNoIGluc3RydWN0aW9ucyAqLwotCi1zdGF0aWMgaW50Ci1leHRyYWN0XzEyICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gc2lnbl9leHRlbmQgKEdFVF9GSUVMRCAod29yZCwgMTksIDI4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEICh3b3JkLCAyOSwgMjkpIDw8IDEwIHwKLSAgICAgICAgICAgICAgICAgICAgICAod29yZCAmIDB4MSkgPDwgMTEsIDEyKSA8PCAyOwotfQotCi0vKiBleHRyYWN0IGEgMTcgYml0IGNvbnN0YW50IGZyb20gYnJhbmNoIGluc3RydWN0aW9ucywgcmV0dXJuaW5nIHRoZQotICAgMTkgYml0IHNpZ25lZCB2YWx1ZS4gKi8KLQotc3RhdGljIGludAotZXh0cmFjdF8xNyAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIHNpZ25fZXh0ZW5kIChHRVRfRklFTEQgKHdvcmQsIDE5LCAyOCkgfAotICAgICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRCAod29yZCwgMjksIDI5KSA8PCAxMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEICh3b3JkLCAxMSwgMTUpIDw8IDExIHwKLSAgICAgICAgICAgICAgICAgICAgICAod29yZCAmIDB4MSkgPDwgMTYsIDE3KSA8PCAyOwotfQotCi0vKiBQcmludCBvbmUgaW5zdHJ1Y3Rpb24uICAqLwotaW50Ci1wcmludF9pbnNuX2hwcGEgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICB1bnNpZ25lZCBpbnQgaW5zbiwgaTsKLQotICB7Ci0gICAgaW50IHN0YXR1cyA9Ci0gICAgICAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwgaW5mbyk7Ci0gICAgaWYgKHN0YXR1cyAhPSAwKQotICAgICAgewotCSgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCXJldHVybiAtMTsKLSAgICAgIH0KLSAgfQotCi0gIGluc24gPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1PUENPREVTOyArK2kpCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IHBhX29wY29kZSAqb3Bjb2RlID0gJnBhX29wY29kZXNbaV07Ci0gICAgICBpZiAoKGluc24gJiBvcGNvZGUtPm1hc2spID09IG9wY29kZS0+bWF0Y2gpCi0JewotCSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKLQkgIAotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wY29kZS0+bmFtZSk7Ci0KLQkgIGlmICghc3RyY2hyICgiY2ZDWTw/IUAtKyZVPn5uSE5aRklNYWR1fCIsIG9wY29kZS0+YXJnc1swXSkpCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOwotCSAgZm9yIChzID0gb3Bjb2RlLT5hcmdzOyAqcyAhPSAnXDAnOyArK3MpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKCpzKQotCQl7Ci0JCWNhc2UgJ3gnOgotCQkgIGZwdXRfcmVnIChHRVRfRklFTEQgKGluc24sIDExLCAxNSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdYJzoKLSAgICAgICAgICAgICAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDI1LCAyNSkpCi0JCSAgICAgIGZwdXRfZnBfcmVnX3IgKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KSwgaW5mbyk7Ci0JCSAgZWxzZQotCQkgICAgICBmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnYic6Ci0JCSAgZnB1dF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnXic6Ci0JCSAgZnB1dF9jcmVnIChHRVRfRklFTEQgKGluc24sIDYsIDEwKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0UnOgotICAgICAgICAgICAgICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjUsIDI1KSkKLQkJICAgICAgZnB1dF9mcF9yZWdfciAoR0VUX0ZJRUxEIChpbnNuLCA2LCAxMCksIGluZm8pOwotCQkgIGVsc2UKLQkJICAgICAgZnB1dF9mcF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAndCc6Ci0JCSAgZnB1dF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3YnOgotICAgICAgICAgICAgICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjUsIDI1KSkKLQkJICAgICAgZnB1dF9mcF9yZWdfciAoR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpLCBpbmZvKTsKLQkJICBlbHNlCi0JCSAgICAgIGZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDI3LCAzMSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICd5JzoKLQkJICBmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnNCc6Ci0JCSAgewotCQkgICAgaW50IHJlZyA9IEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApOwotCi0JCSAgICByZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKLQkJICAgIGZwdXRfZnBfcmVnIChyZWcsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQljYXNlICc2JzoKLQkJICB7Ci0JCSAgICBpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpOwotCi0JCSAgICByZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKLQkJICAgIGZwdXRfZnBfcmVnIChyZWcsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQljYXNlICc3JzoKLQkJICB7Ci0JCSAgICBpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpOwotCi0JCSAgICByZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKLQkJICAgIGZwdXRfZnBfcmVnIChyZWcsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQljYXNlICc4JzoKLQkJICB7Ci0JCSAgICBpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAxNiwgMjApOwotCi0JCSAgICByZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKLQkJICAgIGZwdXRfZnBfcmVnIChyZWcsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQljYXNlICc5JzoKLQkJICB7Ci0JCSAgICBpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAyMSwgMjUpOwotCi0JCSAgICByZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKLQkJICAgIGZwdXRfZnBfcmVnIChyZWcsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQljYXNlICc1JzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzVfbG9hZCAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdzJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwKLQkJCQkJICJzciVkIiwgR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTcpKTsKLQkJICBicmVhazsKLQkJY2FzZSAnUyc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJzciVkIiwgZXh0cmFjdF8zIChpbnNuKSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2MnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkgICAgaW5kZXhfY29tcGxfbmFtZXNbR0VUX0NPTVBMIChpbnNuKV0pOwotCQkgIGJyZWFrOwotCQljYXNlICdDJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJICAgIHNob3J0X2xkc3RfY29tcGxfbmFtZXNbR0VUX0NPTVBMIChpbnNuKV0pOwotCQkgIGJyZWFrOwotCQljYXNlICdZJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJICAgIHNob3J0X2J5dGVzX2NvbXBsX25hbWVzW0dFVF9DT01QTCAoaW5zbildKTsKLQkJICBicmVhazsKLQkJLyogdGhlc2UgZm91ciBjb25kaXRpb25zIGFyZSBmb3IgdGhlIHNldCBvZiBpbnN0cnVjdGlvbnMKLQkJICAgd2hpY2ggZGlzdGluZ3Vpc2ggdHJ1ZS9mYWxzZSBjb25kaXRpb25zIGJ5IG9wY29kZSByYXRoZXIKLQkJICAgdGhhbiBieSB0aGUgJ2YnIGJpdCAoc2lnaCk6IGNvbWIsIGNvbWliLCBhZGRiLCBhZGRpYiAqLwotCQljYXNlICc8JzoKLQkJICBmcHV0c19maWx0ZXJlZCAoY29tcGFyZV9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KV0sCi0JCQkJICBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnPyc6Ci0JCSAgZnB1dHNfZmlsdGVyZWQgKGNvbXBhcmVfY29uZF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE2LCAxOCkKLQkJCQkgICsgR0VUX0ZJRUxEIChpbnNuLCA0LCA0KSAqIDhdLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnQCc6Ci0JCSAgZnB1dHNfZmlsdGVyZWQgKGFkZF9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KQotCQkJCSAgKyBHRVRfRklFTEQgKGluc24sIDQsIDQpICogOF0sIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdhJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSBjb21wYXJlX2NvbmRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2QnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJIGFkZF9jb25kX25hbWVzW0dFVF9DT05EIChpbnNuKV0pOwotCQkgIGJyZWFrOwotCQljYXNlICchJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKLQkJCQkgICAgYWRkX2NvbmRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpXSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnJic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCSAgICBsb2dpY2FsX2NvbmRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1UnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkgICAgdW5pdF9jb25kX25hbWVzW0dFVF9DT05EIChpbnNuKV0pOwotCQkgIGJyZWFrOwotCQljYXNlICd8JzoKLQkJY2FzZSAnPic6Ci0JCWNhc2UgJ34nOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkgICAgKGluZm8tPnN0cmVhbSwgIiVzIiwKLQkJICAgICBzaGlmdF9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KV0pOwotCi0JCSAgLyogSWYgdGhlIG5leHQgY2hhcmFjdGVyIGluIGFyZ3MgaXMgJ24nLCBpdCB3aWxsIGhhbmRsZQotCQkgICAgIHB1dHRpbmcgb3V0IHRoZSBzcGFjZS4gICovCi0JCSAgaWYgKHNbMV0gIT0gJ24nKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1YnOgotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfNV9zdG9yZSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdyJzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzVyX3N0b3JlIChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1InOgotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfNVJfc3RvcmUgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnUSc6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81UV9zdG9yZSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdpJzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzExIChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2onOgotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfMTQgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnayc6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF8yMSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICduJzoKLQkJICBpZiAoaW5zbiAmIDB4MikKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLG4gIik7Ci0JCSAgZWxzZQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ04nOgotCQkgIGlmICgoaW5zbiAmIDB4MjApICYmIHNbMV0pCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixuICIpOwotCQkgIGVsc2UgaWYgKGluc24gJiAweDIwKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsbiIpOwotCQkgIGVsc2UgaWYgKHNbMV0pCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkJICBicmVhazsKLQkJY2FzZSAndyc6Ci0JCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChtZW1hZGRyICsgOCArIGV4dHJhY3RfMTIgKGluc24pLAotCQkJCQkgICAgICAgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1cnOgotCQkgIC8qIDE3IGJpdCBQQy1yZWxhdGl2ZSBicmFuY2guICAqLwotCQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgKyA4IAotCQkJCQkJKyBleHRyYWN0XzE3IChpbnNuKSksCi0JCQkJCSAgICAgICBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAneic6Ci0JCSAgLyogMTcgYml0IGRpc3BsYWNlbWVudC4gIFRoaXMgaXMgYW4gb2Zmc2V0IGZyb20gYSByZWdpc3RlcgotCQkgICAgIHNvIGl0IGdldHMgZGlzYXNzc2VtYmxlZCBhcyBqdXN0IGEgbnVtYmVyLCBub3QgYW55IHNvcnQKLQkJICAgICBvZiBhZGRyZXNzLiAgKi8KLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzE3IChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3AnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAotCQkJCSAgICAzMSAtIEdFVF9GSUVMRCAoaW5zbiwgMjIsIDI2KSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1AnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAotCQkJCSAgICBHRVRfRklFTEQgKGluc24sIDIyLCAyNikpOwotCQkgIGJyZWFrOwotCQljYXNlICdUJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKLQkJCQkgICAgMzIgLSBHRVRfRklFTEQgKGluc24sIDI3LCAzMSkpOwotCQkgIGJyZWFrOwotCQljYXNlICdBJzoKLQkJICBmcHV0X2NvbnN0IChHRVRfRklFTEQgKGluc24sIDYsIDE4KSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1onOgotCQkgIGlmIChHRVRfRklFTEQgKGluc24sIDI2LCAyNikpCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixtICIpOwotCQkgIGVsc2UKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOwotCQkgIGJyZWFrOwotCQljYXNlICdEJzoKLQkJICBmcHV0X2NvbnN0IChHRVRfRklFTEQgKGluc24sIDYsIDMxKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2YnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVkIiwgR0VUX0ZJRUxEIChpbnNuLCAyMywgMjUpKTsKLQkJICBicmVhazsKLQkJY2FzZSAnTyc6Ci0JCSAgZnB1dF9jb25zdCAoKEdFVF9GSUVMRCAoaW5zbiwgNiwyMCkgPDwgNSB8Ci0JCQkgICAgICAgR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ28nOgotCQkgIGZwdXRfY29uc3QgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMjApLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnMyc6Ci0JCSAgewotCQkgICAgaW50IHJlZyA9IEdFVF9GSUVMRCAoaW5zbiwgMjEsIDIyKTsKLQkJICAgIHJlZyB8PSBHRVRfRklFTEQgKGluc24sIDE2LCAxOCkgPDwgMjsKLQkJICAgIGlmIChHRVRfRklFTEQgKGluc24sIDIzLCAyMykgIT0gMCkKLQkJICAgICAgZnB1dF9mcF9yZWdfciAocmVnLCBpbmZvKTsKLQkJICAgIGVsc2UKLQkJICAgICAgZnB1dF9mcF9yZWcgKHJlZywgaW5mbyk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0KLQkJY2FzZSAnMic6Ci0JCSAgZnB1dF9jb25zdCAoKEdFVF9GSUVMRCAoaW5zbiwgNiwgMjIpIDw8IDUgfAotCQkJICAgICAgIEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICcxJzoKLQkJICBmcHV0X2NvbnN0ICgoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMjApIDw8IDUgfAotCQkJICAgICAgIEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICcwJzoKLQkJICBmcHV0X2NvbnN0ICgoR0VUX0ZJRUxEIChpbnNuLCAxNiwgMjApIDw8IDUgfAotCQkJICAgICAgIEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICd1JzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlZCIsIEdFVF9GSUVMRCAoaW5zbiwgMjMsIDI1KSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0YnOgotCQkgIC8qIGlmIG5vIGRlc3RpbmF0aW9uIGNvbXBsZXRlciBhbmQgbm90IGJlZm9yZSBhIGNvbXBsZXRlcgotCQkgICAgIGZvciBmY21wLCBuZWVkIGEgc3BhY2UgaGVyZSAqLwotCQkgIGlmIChHRVRfRklFTEQgKGluc24sIDIxLCAyMikgPT0gMSB8fCBzWzFdID09ICdNJykKLQkJICAgIGZwdXRzX2ZpbHRlcmVkIChmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxOSwgMjApXSwKLQkJCQkgICAgaW5mbyk7Ci0JCSAgZWxzZQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICBmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxECi0JCQkJCQkJICAgICAgKGluc24sIDE5LCAyMCldKTsKLQkJICBicmVhazsKLQkJY2FzZSAnRyc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCSAgICBmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLAotCQkJCQkJCQkgIDE3LCAxOCldKTsKLQkJICBicmVhazsKLQkJY2FzZSAnSCc6Ci0JCSAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA9PSAxKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCSAgICBmbG9hdF9mb3JtYXRfbmFtZXNbMF0pOwotCQkgIGVsc2UKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkgICAgZmxvYXRfZm9ybWF0X25hbWVzWzFdKTsKLQkJICBicmVhazsKLQkJY2FzZSAnSSc6Ci0JCSAgLyogaWYgbm8gZGVzdGluYXRpb24gY29tcGxldGVyIGFuZCBub3QgYmVmb3JlIGEgY29tcGxldGVyCi0JCSAgICAgZm9yIGZjbXAsIG5lZWQgYSBzcGFjZSBoZXJlICovCi0JCSAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjEsIDIyKSA9PSAxIHx8IHNbMV0gPT0gJ00nKQotCQkgICAgZnB1dHNfZmlsdGVyZWQgKGZsb2F0X2Zvcm1hdF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDIwLCAyMCldLAotCQkJCSAgICBpbmZvKTsKLQkJICBlbHNlCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgIGZsb2F0X2Zvcm1hdF9uYW1lc1tHRVRfRklFTEQKLQkJCQkJCQkgICAgICAoaW5zbiwgMjAsIDIwKV0pOwotCQkgIGJyZWFrOwotCQljYXNlICdKJzoKLSAgICAgICAgICAgICAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDI0LCAyNCkpCi0JCSAgICAgIGZwdXRfZnBfcmVnX3IgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApLCBpbmZvKTsKLQkJICBlbHNlCi0JCSAgICAgIGZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDYsIDEwKSwgaW5mbyk7Ci0JCSAgICAgIAotCQkgIGJyZWFrOwotCQljYXNlICdLJzoKLSAgICAgICAgICAgICAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDE5LCAxOSkpCi0JCSAgICAgIGZwdXRfZnBfcmVnX3IgKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KSwgaW5mbyk7Ci0JCSAgZWxzZQotCQkgICAgICBmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnTSc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgIGZsb2F0X2NvbXBfbmFtZXNbR0VUX0ZJRUxECi0JCQkJCQkJICAgICAgKGluc24sIDI3LCAzMSldKTsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgKnMpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIHJldHVybiBzaXplb2YoaW5zbik7Ci0JfQotICAgIH0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjJTh4IiwgaW5zbik7Ci0gIHJldHVybiBzaXplb2YoaW5zbik7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2kzODYtZGlzLmMgYi9vcGNvZGVzL2kzODYtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZGExNGUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9pMzg2LWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU0NiArMCwwIEBACi0vKiBQcmludCBpMzg2IGluc3RydWN0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTg4LCA4OSwgOTEsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiA4MDM4NiBpbnN0cnVjdGlvbiBwcmludGVyIGJ5IFBhY2UgV2lsbGlzc29uIChwYWNlQHByZXAuYWkubWl0LmVkdSkKLSAqIEp1bHkgMTk4OAotICogIG1vZGlmaWVkIGJ5IEpvaG4gSGFzc2V5IChoYXNzZXlAZGctcnRwLmRnLmNvbSkKLSAqLwotCi0vKgotICogVGhlIG1haW4gdGFibGVzIGRlc2NyaWJpbmcgdGhlIGluc3RydWN0aW9ucyBpcyBlc3NlbnRpYWxseSBhIGNvcHkKLSAqIG9mIHRoZSAiT3Bjb2RlIE1hcCIgY2hhcHRlciAoQXBwZW5kaXggQSkgb2YgdGhlIEludGVsIDgwMzg2Ci0gKiBQcm9ncmFtbWVycyBNYW51YWwuICBVc3VhbGx5LCB0aGVyZSBpcyBhIGNhcGl0YWwgbGV0dGVyLCBmb2xsb3dlZAotICogYnkgYSBzbWFsbCBsZXR0ZXIuICBUaGUgY2FwaXRhbCBsZXR0ZXIgdGVsbCB0aGUgYWRkcmVzc2luZyBtb2RlLAotICogYW5kIHRoZSBzbWFsbCBsZXR0ZXIgdGVsbHMgYWJvdXQgdGhlIG9wZXJhbmQgc2l6ZS4gIFJlZmVyIHRvCi0gKiB0aGUgSW50ZWwgbWFudWFsIGZvciBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSNkZWZpbmUgTUFYTEVOIDIwCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotI2lmbmRlZiBVTklYV0FSRV9DT01QQVQKLS8qIFNldCBub24temVybyBmb3IgYnJva2VuLCBjb21wYXRpYmxlIGluc3RydWN0aW9ucy4gIFNldCB0byB6ZXJvIGZvcgotICAgbm9uLWJyb2tlbiBvcGNvZGVzLiAgKi8KLSNkZWZpbmUgVU5JWFdBUkVfQ09NUEFUIDEKLSNlbmRpZgotCi0KLXN0YXRpYyBpbnQgZmV0Y2hfZGF0YSBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBiZmRfYnl0ZSAqKSk7Ci0KLXN0cnVjdCBkaXNfcHJpdmF0ZQotewotICAvKiBQb2ludHMgdG8gZmlyc3QgYnl0ZSBub3QgZmV0Y2hlZC4gICovCi0gIGJmZF9ieXRlICptYXhfZmV0Y2hlZDsKLSAgYmZkX2J5dGUgdGhlX2J1ZmZlcltNQVhMRU5dOwotICBiZmRfdm1hIGluc25fc3RhcnQ7Ci0gIGptcF9idWYgYmFpbG91dDsKLX07Ci0KLS8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKLSAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcwotICAgb24gZXJyb3IuICAqLwotI2RlZmluZSBGRVRDSF9EQVRBKGluZm8sIGFkZHIpIFwKLSAgKChhZGRyKSA8PSAoKHN0cnVjdCBkaXNfcHJpdmF0ZSAqKShpbmZvLT5wcml2YXRlX2RhdGEpKS0+bWF4X2ZldGNoZWQgXAotICAgPyAxIDogZmV0Y2hfZGF0YSAoKGluZm8pLCAoYWRkcikpKQotCi1zdGF0aWMgaW50Ci1mZXRjaF9kYXRhIChpbmZvLCBhZGRyKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGludCBzdGF0dXM7Ci0gIHN0cnVjdCBkaXNfcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgZGlzX3ByaXZhdGUgKilpbmZvLT5wcml2YXRlX2RhdGE7Ci0gIGJmZF92bWEgc3RhcnQgPSBwcml2LT5pbnNuX3N0YXJ0ICsgKHByaXYtPm1heF9mZXRjaGVkIC0gcHJpdi0+dGhlX2J1ZmZlcik7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAoc3RhcnQsCi0JCQkJICAgICAgcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgYWRkciAtIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgc3RhcnQsIGluZm8pOwotICAgICAgbG9uZ2ptcCAocHJpdi0+YmFpbG91dCwgMSk7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpdi0+bWF4X2ZldGNoZWQgPSBhZGRyOwotICByZXR1cm4gMTsKLX0KLQotI2RlZmluZSBFYiBPUF9FLCBiX21vZGUKLSNkZWZpbmUgaW5kaXJFYiBPUF9pbmRpckUsIGJfbW9kZQotI2RlZmluZSBHYiBPUF9HLCBiX21vZGUKLSNkZWZpbmUgRXYgT1BfRSwgdl9tb2RlCi0jZGVmaW5lIEVkIE9QX0UsIGRfbW9kZQotI2RlZmluZSBpbmRpckV2IE9QX2luZGlyRSwgdl9tb2RlCi0jZGVmaW5lIEV3IE9QX0UsIHdfbW9kZQotI2RlZmluZSBNYSBPUF9FLCB2X21vZGUKLSNkZWZpbmUgTSBPUF9FLCAwCQkvKiBsZWEgKi8KLSNkZWZpbmUgTXAgT1BfRSwgMAkJLyogMzIgb3IgNDggYml0IG1lbW9yeSBvcGVyYW5kIGZvciBMRFMsIExFUyBldGMgKi8KLSNkZWZpbmUgR3YgT1BfRywgdl9tb2RlCi0jZGVmaW5lIEd3IE9QX0csIHdfbW9kZQotI2RlZmluZSBSZCBPUF9SZCwgZF9tb2RlCi0jZGVmaW5lIEliIE9QX0ksIGJfbW9kZQotI2RlZmluZSBzSWIgT1Bfc0ksIGJfbW9kZQkvKiBzaWduIGV4dGVuZWQgYnl0ZSAqLwotI2RlZmluZSBJdiBPUF9JLCB2X21vZGUKLSNkZWZpbmUgSXcgT1BfSSwgd19tb2RlCi0jZGVmaW5lIEpiIE9QX0osIGJfbW9kZQotI2RlZmluZSBKdiBPUF9KLCB2X21vZGUKLSNkZWZpbmUgQ2QgT1BfQywgZF9tb2RlCi0jZGVmaW5lIERkIE9QX0QsIGRfbW9kZQotI2RlZmluZSBUZCBPUF9ULCBkX21vZGUKLQotI2RlZmluZSBlQVggT1BfUkVHLCBlQVhfcmVnCi0jZGVmaW5lIGVCWCBPUF9SRUcsIGVCWF9yZWcKLSNkZWZpbmUgZUNYIE9QX1JFRywgZUNYX3JlZwotI2RlZmluZSBlRFggT1BfUkVHLCBlRFhfcmVnCi0jZGVmaW5lIGVTUCBPUF9SRUcsIGVTUF9yZWcKLSNkZWZpbmUgZUJQIE9QX1JFRywgZUJQX3JlZwotI2RlZmluZSBlU0kgT1BfUkVHLCBlU0lfcmVnCi0jZGVmaW5lIGVESSBPUF9SRUcsIGVESV9yZWcKLSNkZWZpbmUgQUwgT1BfUkVHLCBhbF9yZWcKLSNkZWZpbmUgQ0wgT1BfUkVHLCBjbF9yZWcKLSNkZWZpbmUgREwgT1BfUkVHLCBkbF9yZWcKLSNkZWZpbmUgQkwgT1BfUkVHLCBibF9yZWcKLSNkZWZpbmUgQUggT1BfUkVHLCBhaF9yZWcKLSNkZWZpbmUgQ0ggT1BfUkVHLCBjaF9yZWcKLSNkZWZpbmUgREggT1BfUkVHLCBkaF9yZWcKLSNkZWZpbmUgQkggT1BfUkVHLCBiaF9yZWcKLSNkZWZpbmUgQVggT1BfUkVHLCBheF9yZWcKLSNkZWZpbmUgRFggT1BfUkVHLCBkeF9yZWcKLSNkZWZpbmUgaW5kaXJEWCBPUF9SRUcsIGluZGlyX2R4X3JlZwotCi0jZGVmaW5lIFN3IE9QX1NFRywgd19tb2RlCi0jZGVmaW5lIEFwIE9QX0RJUiwgMAotI2RlZmluZSBPYiBPUF9PRkYsIGJfbW9kZQotI2RlZmluZSBPdiBPUF9PRkYsIHZfbW9kZQotI2RlZmluZSBYYiBPUF9EU3JlZywgZVNJX3JlZwotI2RlZmluZSBYdiBPUF9EU3JlZywgZVNJX3JlZwotI2RlZmluZSBZYiBPUF9FU3JlZywgZURJX3JlZwotI2RlZmluZSBZdiBPUF9FU3JlZywgZURJX3JlZwotI2RlZmluZSBEU0JYIE9QX0RTcmVnLCBlQlhfcmVnCi0KLSNkZWZpbmUgZXMgT1BfUkVHLCBlc19yZWcKLSNkZWZpbmUgc3MgT1BfUkVHLCBzc19yZWcKLSNkZWZpbmUgY3MgT1BfUkVHLCBjc19yZWcKLSNkZWZpbmUgZHMgT1BfUkVHLCBkc19yZWcKLSNkZWZpbmUgZnMgT1BfUkVHLCBmc19yZWcKLSNkZWZpbmUgZ3MgT1BfUkVHLCBnc19yZWcKLQotI2RlZmluZSBNWCBPUF9NTVgsIDAKLSNkZWZpbmUgWE0gT1BfWE1NLCAwCi0jZGVmaW5lIEVNIE9QX0VNLCB2X21vZGUKLSNkZWZpbmUgRVggT1BfRVgsIHZfbW9kZQotI2RlZmluZSBNUyBPUF9NUywgdl9tb2RlCi0jZGVmaW5lIE5vbmUgT1BfRSwgMAotI2RlZmluZSBPUFNVRiBPUF8zRE5vd1N1ZmZpeCwgMAotI2RlZmluZSBPUFNJTUQgT1BfU0lNRF9TdWZmaXgsIDAKLQotLyogYml0cyBpbiBzaXplZmxhZyAqLwotI2lmIDAgLyogbGVhdmUgdW5kZWZpbmVkIHVudGlsIHNvbWVvbmUgYWRkcyB0aGUgZXh0cmEgZmxhZyB0byBvYmpkdW1wICovCi0jZGVmaW5lIFNVRkZJWF9BTFdBWVMgNAotI2VuZGlmCi0jZGVmaW5lIEFGTEFHIDIKLSNkZWZpbmUgREZMQUcgMQotCi10eXBlZGVmIHZvaWQgKCpvcF9ydG4pIFBBUkFNUyAoKGludCBieXRlbW9kZSwgaW50IHNpemVmbGFnKSk7Ci0KLXN0YXRpYyB2b2lkIE9QX0UgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0cgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0kgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX2luZGlyRSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1Bfc0kgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX1JFRyBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfSiBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfRElSIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9PRkYgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0VTcmVnIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9EU3JlZyBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfU0VHIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9DIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9EIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9UIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9SZCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfU1QgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX1NUaSAgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX01NWCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfWE1NIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9FTSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfRVggUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX01TIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF8zRE5vd1N1ZmZpeCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfU0lNRF9TdWZmaXggUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIFNJTURfRml4dXAgUEFSQU1TICgoaW50LCBpbnQpKTsKLQotc3RhdGljIHZvaWQgYXBwZW5kX3NlZyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBzZXRfb3AgUEFSQU1TICgodW5zaWduZWQgaW50IG9wKSk7Ci1zdGF0aWMgdm9pZCBwdXRvcCBQQVJBTVMgKChjb25zdCBjaGFyICp0ZW1wbGF0ZSwgaW50IHNpemVmbGFnKSk7Ci1zdGF0aWMgdm9pZCBkb2Zsb2F0IFBBUkFNUyAoKGludCBzaXplZmxhZykpOwotc3RhdGljIGludCBnZXQxNiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGdldDMyIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGNrcHJlZml4IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHB0cl9yZWcgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIEJhZE9wIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSBiX21vZGUgMQotI2RlZmluZSB2X21vZGUgMgotI2RlZmluZSB3X21vZGUgMwotI2RlZmluZSBkX21vZGUgNAotI2RlZmluZSB4X21vZGUgNQotCi0jZGVmaW5lIGVzX3JlZyAxMDAKLSNkZWZpbmUgY3NfcmVnIDEwMQotI2RlZmluZSBzc19yZWcgMTAyCi0jZGVmaW5lIGRzX3JlZyAxMDMKLSNkZWZpbmUgZnNfcmVnIDEwNAotI2RlZmluZSBnc19yZWcgMTA1Ci0KLSNkZWZpbmUgZUFYX3JlZyAxMDgKLSNkZWZpbmUgZUNYX3JlZyAxMDkKLSNkZWZpbmUgZURYX3JlZyAxMTAKLSNkZWZpbmUgZUJYX3JlZyAxMTEKLSNkZWZpbmUgZVNQX3JlZyAxMTIKLSNkZWZpbmUgZUJQX3JlZyAxMTMKLSNkZWZpbmUgZVNJX3JlZyAxMTQKLSNkZWZpbmUgZURJX3JlZyAxMTUKLQotI2RlZmluZSBhbF9yZWcgMTE2Ci0jZGVmaW5lIGNsX3JlZyAxMTcKLSNkZWZpbmUgZGxfcmVnIDExOAotI2RlZmluZSBibF9yZWcgMTE5Ci0jZGVmaW5lIGFoX3JlZyAxMjAKLSNkZWZpbmUgY2hfcmVnIDEyMQotI2RlZmluZSBkaF9yZWcgMTIyCi0jZGVmaW5lIGJoX3JlZyAxMjMKLQotI2RlZmluZSBheF9yZWcgMTI0Ci0jZGVmaW5lIGN4X3JlZyAxMjUKLSNkZWZpbmUgZHhfcmVnIDEyNgotI2RlZmluZSBieF9yZWcgMTI3Ci0jZGVmaW5lIHNwX3JlZyAxMjgKLSNkZWZpbmUgYnBfcmVnIDEyOQotI2RlZmluZSBzaV9yZWcgMTMwCi0jZGVmaW5lIGRpX3JlZyAxMzEKLQotI2RlZmluZSBpbmRpcl9keF9yZWcgMTUwCi0KLSNkZWZpbmUgVVNFX0dST1VQUyAxCi0jZGVmaW5lIFVTRV9QUkVGSVhfVVNFUl9UQUJMRSAyCi0KLSNkZWZpbmUgR1JQMWIgTlVMTCwgTlVMTCwgMCwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlAxUyBOVUxMLCBOVUxMLCAxLCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDFTcyBOVUxMLCBOVUxMLCAyLCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDJiIE5VTEwsIE5VTEwsIDMsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQMlMgTlVMTCwgTlVMTCwgNCwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlAyYl9vbmUgTlVMTCwgTlVMTCwgNSwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlAyU19vbmUgTlVMTCwgTlVMTCwgNiwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlAyYl9jbCBOVUxMLCBOVUxMLCA3LCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDJTX2NsIE5VTEwsIE5VTEwsIDgsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQM2IgTlVMTCwgTlVMTCwgOSwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlAzUyBOVUxMLCBOVUxMLCAxMCwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlA0ICBOVUxMLCBOVUxMLCAxMSwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlA1ICBOVUxMLCBOVUxMLCAxMiwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlA2ICBOVUxMLCBOVUxMLCAxMywgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlA3IE5VTEwsIE5VTEwsIDE0LCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDggTlVMTCwgTlVMTCwgMTUsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQOSBOVUxMLCBOVUxMLCAxNiwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlAxMCBOVUxMLCBOVUxMLCAxNywgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlAxMSBOVUxMLCBOVUxMLCAxOCwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlAxMiBOVUxMLCBOVUxMLCAxOSwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlAxMyBOVUxMLCBOVUxMLCAyMCwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlAxNCBOVUxMLCBOVUxMLCAyMSwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlBBTUQgTlVMTCwgTlVMTCwgMjIsIE5VTEwsIFVTRV9HUk9VUFMKLQotI2RlZmluZSBQUkVHUlAwIE5VTEwsIE5VTEwsIDAsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRQotI2RlZmluZSBQUkVHUlAxIE5VTEwsIE5VTEwsIDEsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRQotI2RlZmluZSBQUkVHUlAyIE5VTEwsIE5VTEwsIDIsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRQotI2RlZmluZSBQUkVHUlAzIE5VTEwsIE5VTEwsIDMsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRQotI2RlZmluZSBQUkVHUlA0IE5VTEwsIE5VTEwsIDQsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRQotI2RlZmluZSBQUkVHUlA1IE5VTEwsIE5VTEwsIDUsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRQotI2RlZmluZSBQUkVHUlA2IE5VTEwsIE5VTEwsIDYsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRQotI2RlZmluZSBQUkVHUlA3IE5VTEwsIE5VTEwsIDcsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRQotI2RlZmluZSBQUkVHUlA4IE5VTEwsIE5VTEwsIDgsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRQotI2RlZmluZSBQUkVHUlA5IE5VTEwsIE5VTEwsIDksIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRQotI2RlZmluZSBQUkVHUlAxMCBOVUxMLCBOVUxMLCAxMCwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFCi0jZGVmaW5lIFBSRUdSUDExIE5VTEwsIE5VTEwsIDExLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUKLSNkZWZpbmUgUFJFR1JQMTIgTlVMTCwgTlVMTCwgMTIsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRQotI2RlZmluZSBQUkVHUlAxMyBOVUxMLCBOVUxMLCAxMywgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFCi0jZGVmaW5lIFBSRUdSUDE0IE5VTEwsIE5VTEwsIDE0LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUKLQotI2RlZmluZSBGTE9BVENPREUgNTAKLSNkZWZpbmUgRkxPQVQgTlVMTCwgTlVMTCwgRkxPQVRDT0RFCi0KLXN0cnVjdCBkaXMzODYgewotICBjb25zdCBjaGFyICpuYW1lOwotICBvcF9ydG4gb3AxOwotICBpbnQgYnl0ZW1vZGUxOwotICBvcF9ydG4gb3AyOwotICBpbnQgYnl0ZW1vZGUyOwotICBvcF9ydG4gb3AzOwotICBpbnQgYnl0ZW1vZGUzOwotfTsKLQotLyogVXBwZXIgY2FzZSBsZXR0ZXJzIGluIHRoZSBpbnN0cnVjdGlvbiBuYW1lcyBoZXJlIGFyZSBtYWNyb3MuCi0gICAnQScgPT4gcHJpbnQgJ2InIGlmIG5vIHJlZ2lzdGVyIG9wZXJhbmRzIG9yIHN1ZmZpeF9hbHdheXMgaXMgdHJ1ZQotICAgJ0InID0+IHByaW50ICdiJyBpZiBzdWZmaXhfYWx3YXlzIGlzIHRydWUKLSAgICdFJyA9PiBwcmludCAnZScgaWYgMzItYml0IGZvcm0gb2YgamN4egotICAgJ0wnID0+IHByaW50ICdsJyBpZiBzdWZmaXhfYWx3YXlzIGlzIHRydWUKLSAgICdOJyA9PiBwcmludCAnbicgaWYgaW5zdHJ1Y3Rpb24gaGFzIG5vIHdhaXQgInByZWZpeCIKLSAgICdQJyA9PiBwcmludCAndycgb3IgJ2wnIGlmIGluc3RydWN0aW9uIGhhcyBhbiBvcGVyYW5kIHNpemUgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igc3VmZml4X2Fsd2F5cyBpcyB0cnVlCi0gICAnUScgPT4gcHJpbnQgJ3cnIG9yICdsJyBpZiBubyByZWdpc3RlciBvcGVyYW5kcyBvciBzdWZmaXhfYWx3YXlzIGlzIHRydWUKLSAgICdSJyA9PiBwcmludCAndycgb3IgJ2wnCi0gICAnUycgPT4gcHJpbnQgJ3cnIG9yICdsJyBpZiBzdWZmaXhfYWx3YXlzIGlzIHRydWUKLSAgICdXJyA9PiBwcmludCAnYicgb3IgJ3cnCi0qLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRpczM4NiBkaXMzODZfYXR0W10gPSB7Ci0gIC8qIDAwICovCi0gIHsgImFkZEIiLAlFYiwgR2IgfSwKLSAgeyAiYWRkUyIsCUV2LCBHdiB9LAotICB7ICJhZGRCIiwJR2IsIEViIH0sCi0gIHsgImFkZFMiLAlHdiwgRXYgfSwKLSAgeyAiYWRkQiIsCUFMLCBJYiB9LAotICB7ICJhZGRTIiwJZUFYLCBJdiB9LAotICB7ICJwdXNoUCIsCWVzIH0sCi0gIHsgInBvcFAiLAllcyB9LAotICAvKiAwOCAqLwotICB7ICJvckIiLAlFYiwgR2IgfSwKLSAgeyAib3JTIiwJRXYsIEd2IH0sCi0gIHsgIm9yQiIsCUdiLCBFYiB9LAotICB7ICJvclMiLAlHdiwgRXYgfSwKLSAgeyAib3JCIiwJQUwsIEliIH0sCi0gIHsgIm9yUyIsCWVBWCwgSXYgfSwKLSAgeyAicHVzaFAiLAljcyB9LAotICB7ICIoYmFkKSIgfSwJLyogMHgwZiBleHRlbmRlZCBvcGNvZGUgZXNjYXBlICovCi0gIC8qIDEwICovCi0gIHsgImFkY0IiLAlFYiwgR2IgfSwKLSAgeyAiYWRjUyIsCUV2LCBHdiB9LAotICB7ICJhZGNCIiwJR2IsIEViIH0sCi0gIHsgImFkY1MiLAlHdiwgRXYgfSwKLSAgeyAiYWRjQiIsCUFMLCBJYiB9LAotICB7ICJhZGNTIiwJZUFYLCBJdiB9LAotICB7ICJwdXNoUCIsCXNzIH0sCi0gIHsgInBvcFAiLAlzcyB9LAotICAvKiAxOCAqLwotICB7ICJzYmJCIiwJRWIsIEdiIH0sCi0gIHsgInNiYlMiLAlFdiwgR3YgfSwKLSAgeyAic2JiQiIsCUdiLCBFYiB9LAotICB7ICJzYmJTIiwJR3YsIEV2IH0sCi0gIHsgInNiYkIiLAlBTCwgSWIgfSwKLSAgeyAic2JiUyIsCWVBWCwgSXYgfSwKLSAgeyAicHVzaFAiLAlkcyB9LAotICB7ICJwb3BQIiwJZHMgfSwKLSAgLyogMjAgKi8KLSAgeyAiYW5kQiIsCUViLCBHYiB9LAotICB7ICJhbmRTIiwJRXYsIEd2IH0sCi0gIHsgImFuZEIiLAlHYiwgRWIgfSwKLSAgeyAiYW5kUyIsCUd2LCBFdiB9LAotICB7ICJhbmRCIiwJQUwsIEliIH0sCi0gIHsgImFuZFMiLAllQVgsIEl2IH0sCi0gIHsgIihiYWQpIiB9LAkJCS8qIFNFRyBFUyBwcmVmaXggKi8KLSAgeyAiZGFhIiB9LAotICAvKiAyOCAqLwotICB7ICJzdWJCIiwJRWIsIEdiIH0sCi0gIHsgInN1YlMiLAlFdiwgR3YgfSwKLSAgeyAic3ViQiIsCUdiLCBFYiB9LAotICB7ICJzdWJTIiwJR3YsIEV2IH0sCi0gIHsgInN1YkIiLAlBTCwgSWIgfSwKLSAgeyAic3ViUyIsCWVBWCwgSXYgfSwKLSAgeyAiKGJhZCkiIH0sCQkJLyogU0VHIENTIHByZWZpeCAqLwotICB7ICJkYXMiIH0sCi0gIC8qIDMwICovCi0gIHsgInhvckIiLAlFYiwgR2IgfSwKLSAgeyAieG9yUyIsCUV2LCBHdiB9LAotICB7ICJ4b3JCIiwJR2IsIEViIH0sCi0gIHsgInhvclMiLAlHdiwgRXYgfSwKLSAgeyAieG9yQiIsCUFMLCBJYiB9LAotICB7ICJ4b3JTIiwJZUFYLCBJdiB9LAotICB7ICIoYmFkKSIgfSwJCQkvKiBTRUcgU1MgcHJlZml4ICovCi0gIHsgImFhYSIgfSwKLSAgLyogMzggKi8KLSAgeyAiY21wQiIsCUViLCBHYiB9LAotICB7ICJjbXBTIiwJRXYsIEd2IH0sCi0gIHsgImNtcEIiLAlHYiwgRWIgfSwKLSAgeyAiY21wUyIsCUd2LCBFdiB9LAotICB7ICJjbXBCIiwJQUwsIEliIH0sCi0gIHsgImNtcFMiLAllQVgsIEl2IH0sCi0gIHsgIihiYWQpIiB9LAkJCS8qIFNFRyBEUyBwcmVmaXggKi8KLSAgeyAiYWFzIiB9LAotICAvKiA0MCAqLwotICB7ICJpbmNTIiwJZUFYIH0sCi0gIHsgImluY1MiLAllQ1ggfSwKLSAgeyAiaW5jUyIsCWVEWCB9LAotICB7ICJpbmNTIiwJZUJYIH0sCi0gIHsgImluY1MiLAllU1AgfSwKLSAgeyAiaW5jUyIsCWVCUCB9LAotICB7ICJpbmNTIiwJZVNJIH0sCi0gIHsgImluY1MiLAllREkgfSwKLSAgLyogNDggKi8KLSAgeyAiZGVjUyIsCWVBWCB9LAotICB7ICJkZWNTIiwJZUNYIH0sCi0gIHsgImRlY1MiLAllRFggfSwKLSAgeyAiZGVjUyIsCWVCWCB9LAotICB7ICJkZWNTIiwJZVNQIH0sCi0gIHsgImRlY1MiLAllQlAgfSwKLSAgeyAiZGVjUyIsCWVTSSB9LAotICB7ICJkZWNTIiwJZURJIH0sCi0gIC8qIDUwICovCi0gIHsgInB1c2hTIiwJZUFYIH0sCi0gIHsgInB1c2hTIiwJZUNYIH0sCi0gIHsgInB1c2hTIiwJZURYIH0sCi0gIHsgInB1c2hTIiwJZUJYIH0sCi0gIHsgInB1c2hTIiwJZVNQIH0sCi0gIHsgInB1c2hTIiwJZUJQIH0sCi0gIHsgInB1c2hTIiwJZVNJIH0sCi0gIHsgInB1c2hTIiwJZURJIH0sCi0gIC8qIDU4ICovCi0gIHsgInBvcFMiLAllQVggfSwKLSAgeyAicG9wUyIsCWVDWCB9LAotICB7ICJwb3BTIiwJZURYIH0sCi0gIHsgInBvcFMiLAllQlggfSwKLSAgeyAicG9wUyIsCWVTUCB9LAotICB7ICJwb3BTIiwJZUJQIH0sCi0gIHsgInBvcFMiLAllU0kgfSwKLSAgeyAicG9wUyIsCWVESSB9LAotICAvKiA2MCAqLwotICB7ICJwdXNoYVAiIH0sCi0gIHsgInBvcGFQIiB9LAotICB7ICJib3VuZFMiLAlHdiwgTWEgfSwKLSAgeyAiYXJwbCIsCUV3LCBHdyB9LAotICB7ICIoYmFkKSIgfSwJCQkvKiBzZWcgZnMgKi8KLSAgeyAiKGJhZCkiIH0sCQkJLyogc2VnIGdzICovCi0gIHsgIihiYWQpIiB9LAkJCS8qIG9wIHNpemUgcHJlZml4ICovCi0gIHsgIihiYWQpIiB9LAkJCS8qIGFkciBzaXplIHByZWZpeCAqLwotICAvKiA2OCAqLwotICB7ICJwdXNoUCIsCUl2IH0sCQkvKiAzODYgYm9vayB3cm9uZyAqLwotICB7ICJpbXVsUyIsCUd2LCBFdiwgSXYgfSwKLSAgeyAicHVzaFAiLAlzSWIgfSwJCS8qIHB1c2ggb2YgYnl0ZSByZWFsbHkgcHVzaGVzIDIgb3IgNCBieXRlcyAqLwotICB7ICJpbXVsUyIsCUd2LCBFdiwgc0liIH0sCi0gIHsgImluc2IiLAlZYiwgaW5kaXJEWCB9LAotICB7ICJpbnNSIiwJWXYsIGluZGlyRFggfSwKLSAgeyAib3V0c2IiLAlpbmRpckRYLCBYYiB9LAotICB7ICJvdXRzUiIsCWluZGlyRFgsIFh2IH0sCi0gIC8qIDcwICovCi0gIHsgImpvIiwJSmIgfSwKLSAgeyAiam5vIiwJSmIgfSwKLSAgeyAiamIiLAlKYiB9LAotICB7ICJqYWUiLAlKYiB9LAotICB7ICJqZSIsCUpiIH0sCi0gIHsgImpuZSIsCUpiIH0sCi0gIHsgImpiZSIsCUpiIH0sCi0gIHsgImphIiwJSmIgfSwKLSAgLyogNzggKi8KLSAgeyAianMiLAlKYiB9LAotICB7ICJqbnMiLAlKYiB9LAotICB7ICJqcCIsCUpiIH0sCi0gIHsgImpucCIsCUpiIH0sCi0gIHsgImpsIiwJSmIgfSwKLSAgeyAiamdlIiwJSmIgfSwKLSAgeyAiamxlIiwJSmIgfSwKLSAgeyAiamciLAlKYiB9LAotICAvKiA4MCAqLwotICB7IEdSUDFiIH0sCi0gIHsgR1JQMVMgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgR1JQMVNzIH0sCi0gIHsgInRlc3RCIiwJRWIsIEdiIH0sCi0gIHsgInRlc3RTIiwJRXYsIEd2IH0sCi0gIHsgInhjaGdCIiwJRWIsIEdiIH0sCi0gIHsgInhjaGdTIiwJRXYsIEd2IH0sCi0gIC8qIDg4ICovCi0gIHsgIm1vdkIiLAlFYiwgR2IgfSwKLSAgeyAibW92UyIsCUV2LCBHdiB9LAotICB7ICJtb3ZCIiwJR2IsIEViIH0sCi0gIHsgIm1vdlMiLAlHdiwgRXYgfSwKLSAgeyAibW92USIsCUV2LCBTdyB9LAotICB7ICJsZWFTIiwJR3YsIE0gfSwKLSAgeyAibW92USIsCVN3LCBFdiB9LAotICB7ICJwb3BRIiwJRXYgfSwKLSAgLyogOTAgKi8KLSAgeyAibm9wIiB9LAotICB7ICJ4Y2hnUyIsCWVDWCwgZUFYIH0sCi0gIHsgInhjaGdTIiwJZURYLCBlQVggfSwKLSAgeyAieGNoZ1MiLAllQlgsIGVBWCB9LAotICB7ICJ4Y2hnUyIsCWVTUCwgZUFYIH0sCi0gIHsgInhjaGdTIiwJZUJQLCBlQVggfSwKLSAgeyAieGNoZ1MiLAllU0ksIGVBWCB9LAotICB7ICJ4Y2hnUyIsCWVESSwgZUFYIH0sCi0gIC8qIDk4ICovCi0gIHsgImNXdFIiIH0sCi0gIHsgImNSdGQiIH0sCi0gIHsgImxjYWxsUCIsCUFwIH0sCi0gIHsgIihiYWQpIiB9LAkJLyogZndhaXQgKi8KLSAgeyAicHVzaGZQIiB9LAotICB7ICJwb3BmUCIgfSwKLSAgeyAic2FoZiIgfSwKLSAgeyAibGFoZiIgfSwKLSAgLyogYTAgKi8KLSAgeyAibW92QiIsCUFMLCBPYiB9LAotICB7ICJtb3ZTIiwJZUFYLCBPdiB9LAotICB7ICJtb3ZCIiwJT2IsIEFMIH0sCi0gIHsgIm1vdlMiLAlPdiwgZUFYIH0sCi0gIHsgIm1vdnNiIiwJWWIsIFhiIH0sCi0gIHsgIm1vdnNSIiwJWXYsIFh2IH0sCi0gIHsgImNtcHNiIiwJWGIsIFliIH0sCi0gIHsgImNtcHNSIiwJWHYsIFl2IH0sCi0gIC8qIGE4ICovCi0gIHsgInRlc3RCIiwJQUwsIEliIH0sCi0gIHsgInRlc3RTIiwJZUFYLCBJdiB9LAotICB7ICJzdG9zQiIsCVliLCBBTCB9LAotICB7ICJzdG9zUyIsCVl2LCBlQVggfSwKLSAgeyAibG9kc0IiLAlBTCwgWGIgfSwKLSAgeyAibG9kc1MiLAllQVgsIFh2IH0sCi0gIHsgInNjYXNCIiwJQUwsIFliIH0sCi0gIHsgInNjYXNTIiwJZUFYLCBZdiB9LAotICAvKiBiMCAqLwotICB7ICJtb3ZCIiwJQUwsIEliIH0sCi0gIHsgIm1vdkIiLAlDTCwgSWIgfSwKLSAgeyAibW92QiIsCURMLCBJYiB9LAotICB7ICJtb3ZCIiwJQkwsIEliIH0sCi0gIHsgIm1vdkIiLAlBSCwgSWIgfSwKLSAgeyAibW92QiIsCUNILCBJYiB9LAotICB7ICJtb3ZCIiwJREgsIEliIH0sCi0gIHsgIm1vdkIiLAlCSCwgSWIgfSwKLSAgLyogYjggKi8KLSAgeyAibW92UyIsCWVBWCwgSXYgfSwKLSAgeyAibW92UyIsCWVDWCwgSXYgfSwKLSAgeyAibW92UyIsCWVEWCwgSXYgfSwKLSAgeyAibW92UyIsCWVCWCwgSXYgfSwKLSAgeyAibW92UyIsCWVTUCwgSXYgfSwKLSAgeyAibW92UyIsCWVCUCwgSXYgfSwKLSAgeyAibW92UyIsCWVTSSwgSXYgfSwKLSAgeyAibW92UyIsCWVESSwgSXYgfSwKLSAgLyogYzAgKi8KLSAgeyBHUlAyYiB9LAotICB7IEdSUDJTIH0sCi0gIHsgInJldFAiLAlJdyB9LAotICB7ICJyZXRQIiB9LAotICB7ICJsZXNTIiwJR3YsIE1wIH0sCi0gIHsgImxkc1MiLAlHdiwgTXAgfSwKLSAgeyAibW92QSIsCUViLCBJYiB9LAotICB7ICJtb3ZRIiwJRXYsIEl2IH0sCi0gIC8qIGM4ICovCi0gIHsgImVudGVyUCIsCUl3LCBJYiB9LAotICB7ICJsZWF2ZVAiIH0sCi0gIHsgImxyZXRQIiwJSXcgfSwKLSAgeyAibHJldFAiIH0sCi0gIHsgImludDMiIH0sCi0gIHsgImludCIsCUliIH0sCi0gIHsgImludG8iIH0sCi0gIHsgImlyZXRQIiB9LAotICAvKiBkMCAqLwotICB7IEdSUDJiX29uZSB9LAotICB7IEdSUDJTX29uZSB9LAotICB7IEdSUDJiX2NsIH0sCi0gIHsgR1JQMlNfY2wgfSwKLSAgeyAiYWFtIiwJc0liIH0sCi0gIHsgImFhZCIsCXNJYiB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAieGxhdCIsCURTQlggfSwKLSAgLyogZDggKi8KLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIC8qIGUwICovCi0gIHsgImxvb3BuZSIsCUpiIH0sCi0gIHsgImxvb3BlIiwJSmIgfSwKLSAgeyAibG9vcCIsCUpiIH0sCi0gIHsgImpFY3h6IiwJSmIgfSwKLSAgeyAiaW5CIiwJQUwsIEliIH0sCi0gIHsgImluUyIsCWVBWCwgSWIgfSwKLSAgeyAib3V0QiIsCUliLCBBTCB9LAotICB7ICJvdXRTIiwJSWIsIGVBWCB9LAotICAvKiBlOCAqLwotICB7ICJjYWxsUCIsCUp2IH0sCi0gIHsgImptcFAiLAlKdiB9LAotICB7ICJsam1wUCIsCUFwIH0sCi0gIHsgImptcCIsCUpiIH0sCi0gIHsgImluQiIsCUFMLCBpbmRpckRYIH0sCi0gIHsgImluUyIsCWVBWCwgaW5kaXJEWCB9LAotICB7ICJvdXRCIiwJaW5kaXJEWCwgQUwgfSwKLSAgeyAib3V0UyIsCWluZGlyRFgsIGVBWCB9LAotICAvKiBmMCAqLwotICB7ICIoYmFkKSIgfSwJCQkvKiBsb2NrIHByZWZpeCAqLwotICB7ICIoYmFkKSIgfSwKLSAgeyAiKGJhZCkiIH0sCQkJLyogcmVwbmUgKi8KLSAgeyAiKGJhZCkiIH0sCQkJLyogcmVweiAqLwotICB7ICJobHQiIH0sCi0gIHsgImNtYyIgfSwKLSAgeyBHUlAzYiB9LAotICB7IEdSUDNTIH0sCi0gIC8qIGY4ICovCi0gIHsgImNsYyIgfSwKLSAgeyAic3RjIiB9LAotICB7ICJjbGkiIH0sCi0gIHsgInN0aSIgfSwKLSAgeyAiY2xkIiB9LAotICB7ICJzdGQiIH0sCi0gIHsgR1JQNCB9LAotICB7IEdSUDUgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IGRpczM4Nl9pbnRlbFtdID0gewotICAvKiAwMCAqLwotICB7ICJhZGQiLAlFYiwgR2IgfSwKLSAgeyAiYWRkIiwJRXYsIEd2IH0sCi0gIHsgImFkZCIsCUdiLCBFYiB9LAotICB7ICJhZGQiLAlHdiwgRXYgfSwKLSAgeyAiYWRkIiwJQUwsIEliIH0sCi0gIHsgImFkZCIsCWVBWCwgSXYgfSwKLSAgeyAicHVzaCIsCWVzIH0sCi0gIHsgInBvcCIsCWVzIH0sCi0gIC8qIDA4ICovCi0gIHsgIm9yIiwJRWIsIEdiIH0sCi0gIHsgIm9yIiwJRXYsIEd2IH0sCi0gIHsgIm9yIiwJR2IsIEViIH0sCi0gIHsgIm9yIiwJR3YsIEV2IH0sCi0gIHsgIm9yIiwJQUwsIEliIH0sCi0gIHsgIm9yIiwJZUFYLCBJdiB9LAotICB7ICJwdXNoIiwJY3MgfSwKLSAgeyAiKGJhZCkiIH0sCS8qIDB4MGYgZXh0ZW5kZWQgb3Bjb2RlIGVzY2FwZSAqLwotICAvKiAxMCAqLwotICB7ICJhZGMiLAlFYiwgR2IgfSwKLSAgeyAiYWRjIiwJRXYsIEd2IH0sCi0gIHsgImFkYyIsCUdiLCBFYiB9LAotICB7ICJhZGMiLAlHdiwgRXYgfSwKLSAgeyAiYWRjIiwJQUwsIEliIH0sCi0gIHsgImFkYyIsCWVBWCwgSXYgfSwKLSAgeyAicHVzaCIsCXNzIH0sCi0gIHsgInBvcCIsCXNzIH0sCi0gIC8qIDE4ICovCi0gIHsgInNiYiIsCUViLCBHYiB9LAotICB7ICJzYmIiLAlFdiwgR3YgfSwKLSAgeyAic2JiIiwJR2IsIEViIH0sCi0gIHsgInNiYiIsCUd2LCBFdiB9LAotICB7ICJzYmIiLAlBTCwgSWIgfSwKLSAgeyAic2JiIiwJZUFYLCBJdiB9LAotICB7ICJwdXNoIiwJZHMgfSwKLSAgeyAicG9wIiwJZHMgfSwKLSAgLyogMjAgKi8KLSAgeyAiYW5kIiwJRWIsIEdiIH0sCi0gIHsgImFuZCIsCUV2LCBHdiB9LAotICB7ICJhbmQiLAlHYiwgRWIgfSwKLSAgeyAiYW5kIiwJR3YsIEV2IH0sCi0gIHsgImFuZCIsCUFMLCBJYiB9LAotICB7ICJhbmQiLAllQVgsIEl2IH0sCi0gIHsgIihiYWQpIiB9LAkJCS8qIFNFRyBFUyBwcmVmaXggKi8KLSAgeyAiZGFhIiB9LAotICAvKiAyOCAqLwotICB7ICJzdWIiLAlFYiwgR2IgfSwKLSAgeyAic3ViIiwJRXYsIEd2IH0sCi0gIHsgInN1YiIsCUdiLCBFYiB9LAotICB7ICJzdWIiLAlHdiwgRXYgfSwKLSAgeyAic3ViIiwJQUwsIEliIH0sCi0gIHsgInN1YiIsCWVBWCwgSXYgfSwKLSAgeyAiKGJhZCkiIH0sCQkJLyogU0VHIENTIHByZWZpeCAqLwotICB7ICJkYXMiIH0sCi0gIC8qIDMwICovCi0gIHsgInhvciIsCUViLCBHYiB9LAotICB7ICJ4b3IiLAlFdiwgR3YgfSwKLSAgeyAieG9yIiwJR2IsIEViIH0sCi0gIHsgInhvciIsCUd2LCBFdiB9LAotICB7ICJ4b3IiLAlBTCwgSWIgfSwKLSAgeyAieG9yIiwJZUFYLCBJdiB9LAotICB7ICIoYmFkKSIgfSwJCQkvKiBTRUcgU1MgcHJlZml4ICovCi0gIHsgImFhYSIgfSwKLSAgLyogMzggKi8KLSAgeyAiY21wIiwJRWIsIEdiIH0sCi0gIHsgImNtcCIsCUV2LCBHdiB9LAotICB7ICJjbXAiLAlHYiwgRWIgfSwKLSAgeyAiY21wIiwJR3YsIEV2IH0sCi0gIHsgImNtcCIsCUFMLCBJYiB9LAotICB7ICJjbXAiLAllQVgsIEl2IH0sCi0gIHsgIihiYWQpIiB9LAkJCS8qIFNFRyBEUyBwcmVmaXggKi8KLSAgeyAiYWFzIiB9LAotICAvKiA0MCAqLwotICB7ICJpbmMiLAllQVggfSwKLSAgeyAiaW5jIiwJZUNYIH0sCi0gIHsgImluYyIsCWVEWCB9LAotICB7ICJpbmMiLAllQlggfSwKLSAgeyAiaW5jIiwJZVNQIH0sCi0gIHsgImluYyIsCWVCUCB9LAotICB7ICJpbmMiLAllU0kgfSwKLSAgeyAiaW5jIiwJZURJIH0sCi0gIC8qIDQ4ICovCi0gIHsgImRlYyIsCWVBWCB9LAotICB7ICJkZWMiLAllQ1ggfSwKLSAgeyAiZGVjIiwJZURYIH0sCi0gIHsgImRlYyIsCWVCWCB9LAotICB7ICJkZWMiLAllU1AgfSwKLSAgeyAiZGVjIiwJZUJQIH0sCi0gIHsgImRlYyIsCWVTSSB9LAotICB7ICJkZWMiLAllREkgfSwKLSAgLyogNTAgKi8KLSAgeyAicHVzaCIsCWVBWCB9LAotICB7ICJwdXNoIiwJZUNYIH0sCi0gIHsgInB1c2giLAllRFggfSwKLSAgeyAicHVzaCIsCWVCWCB9LAotICB7ICJwdXNoIiwJZVNQIH0sCi0gIHsgInB1c2giLAllQlAgfSwKLSAgeyAicHVzaCIsCWVTSSB9LAotICB7ICJwdXNoIiwJZURJIH0sCi0gIC8qIDU4ICovCi0gIHsgInBvcCIsCWVBWCB9LAotICB7ICJwb3AiLAllQ1ggfSwKLSAgeyAicG9wIiwJZURYIH0sCi0gIHsgInBvcCIsCWVCWCB9LAotICB7ICJwb3AiLAllU1AgfSwKLSAgeyAicG9wIiwJZUJQIH0sCi0gIHsgInBvcCIsCWVTSSB9LAotICB7ICJwb3AiLAllREkgfSwKLSAgLyogNjAgKi8KLSAgeyAicHVzaGEiIH0sCi0gIHsgInBvcGEiIH0sCi0gIHsgImJvdW5kIiwJR3YsIE1hIH0sCi0gIHsgImFycGwiLAlFdywgR3cgfSwKLSAgeyAiKGJhZCkiIH0sCQkJLyogc2VnIGZzICovCi0gIHsgIihiYWQpIiB9LAkJCS8qIHNlZyBncyAqLwotICB7ICIoYmFkKSIgfSwJCQkvKiBvcCBzaXplIHByZWZpeCAqLwotICB7ICIoYmFkKSIgfSwJCQkvKiBhZHIgc2l6ZSBwcmVmaXggKi8KLSAgLyogNjggKi8KLSAgeyAicHVzaCIsCUl2IH0sCQkvKiAzODYgYm9vayB3cm9uZyAqLwotICB7ICJpbXVsIiwJR3YsIEV2LCBJdiB9LAotICB7ICJwdXNoIiwJc0liIH0sCQkvKiBwdXNoIG9mIGJ5dGUgcmVhbGx5IHB1c2hlcyAyIG9yIDQgYnl0ZXMgKi8KLSAgeyAiaW11bCIsCUd2LCBFdiwgc0liIH0sCi0gIHsgImlucyIsCVliLCBpbmRpckRYIH0sCi0gIHsgImlucyIsCVl2LCBpbmRpckRYIH0sCi0gIHsgIm91dHMiLAlpbmRpckRYLCBYYiB9LAotICB7ICJvdXRzIiwJaW5kaXJEWCwgWHYgfSwKLSAgLyogNzAgKi8KLSAgeyAiam8iLAlKYiB9LAotICB7ICJqbm8iLAlKYiB9LAotICB7ICJqYiIsCUpiIH0sCi0gIHsgImphZSIsCUpiIH0sCi0gIHsgImplIiwJSmIgfSwKLSAgeyAiam5lIiwJSmIgfSwKLSAgeyAiamJlIiwJSmIgfSwKLSAgeyAiamEiLAlKYiB9LAotICAvKiA3OCAqLwotICB7ICJqcyIsCUpiIH0sCi0gIHsgImpucyIsCUpiIH0sCi0gIHsgImpwIiwJSmIgfSwKLSAgeyAiam5wIiwJSmIgfSwKLSAgeyAiamwiLAlKYiB9LAotICB7ICJqZ2UiLAlKYiB9LAotICB7ICJqbGUiLAlKYiB9LAotICB7ICJqZyIsCUpiIH0sCi0gIC8qIDgwICovCi0gIHsgR1JQMWIgfSwKLSAgeyBHUlAxUyB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyBHUlAxU3MgfSwKLSAgeyAidGVzdCIsCUViLCBHYiB9LAotICB7ICJ0ZXN0IiwJRXYsIEd2IH0sCi0gIHsgInhjaGciLAlFYiwgR2IgfSwKLSAgeyAieGNoZyIsCUV2LCBHdiB9LAotICAvKiA4OCAqLwotICB7ICJtb3YiLAlFYiwgR2IgfSwKLSAgeyAibW92IiwJRXYsIEd2IH0sCi0gIHsgIm1vdiIsCUdiLCBFYiB9LAotICB7ICJtb3YiLAlHdiwgRXYgfSwKLSAgeyAibW92IiwJRXYsIFN3IH0sCi0gIHsgImxlYSIsCUd2LCBNIH0sCi0gIHsgIm1vdiIsCVN3LCBFdiB9LAotICB7ICJwb3AiLAlFdiB9LAotICAvKiA5MCAqLwotICB7ICJub3AiIH0sCi0gIHsgInhjaGciLAllQ1gsIGVBWCB9LAotICB7ICJ4Y2hnIiwJZURYLCBlQVggfSwKLSAgeyAieGNoZyIsCWVCWCwgZUFYIH0sCi0gIHsgInhjaGciLAllU1AsIGVBWCB9LAotICB7ICJ4Y2hnIiwJZUJQLCBlQVggfSwKLSAgeyAieGNoZyIsCWVTSSwgZUFYIH0sCi0gIHsgInhjaGciLAllREksIGVBWCB9LAotICAvKiA5OCAqLwotICB7ICJjVyIgfSwJCS8qIGN3ZGUgYW5kIGNidyAqLwotICB7ICJjUiIgfSwJCS8qIGNkcSBhbmQgY3dkICovCi0gIHsgImxjYWxsIiwJQXAgfSwKLSAgeyAiKGJhZCkiIH0sCQkvKiBmd2FpdCAqLwotICB7ICJwdXNoZiIgfSwKLSAgeyAicG9wZiIgfSwKLSAgeyAic2FoZiIgfSwKLSAgeyAibGFoZiIgfSwKLSAgLyogYTAgKi8KLSAgeyAibW92IiwJQUwsIE9iIH0sCi0gIHsgIm1vdiIsCWVBWCwgT3YgfSwKLSAgeyAibW92IiwJT2IsIEFMIH0sCi0gIHsgIm1vdiIsCU92LCBlQVggfSwKLSAgeyAibW92cyIsCVliLCBYYiB9LAotICB7ICJtb3ZzIiwJWXYsIFh2IH0sCi0gIHsgImNtcHMiLAlYYiwgWWIgfSwKLSAgeyAiY21wcyIsCVh2LCBZdiB9LAotICAvKiBhOCAqLwotICB7ICJ0ZXN0IiwJQUwsIEliIH0sCi0gIHsgInRlc3QiLAllQVgsIEl2IH0sCi0gIHsgInN0b3MiLAlZYiwgQUwgfSwKLSAgeyAic3RvcyIsCVl2LCBlQVggfSwKLSAgeyAibG9kcyIsCUFMLCBYYiB9LAotICB7ICJsb2RzIiwJZUFYLCBYdiB9LAotICB7ICJzY2FzIiwJQUwsIFliIH0sCi0gIHsgInNjYXMiLAllQVgsIFl2IH0sCi0gIC8qIGIwICovCi0gIHsgIm1vdiIsCUFMLCBJYiB9LAotICB7ICJtb3YiLAlDTCwgSWIgfSwKLSAgeyAibW92IiwJREwsIEliIH0sCi0gIHsgIm1vdiIsCUJMLCBJYiB9LAotICB7ICJtb3YiLAlBSCwgSWIgfSwKLSAgeyAibW92IiwJQ0gsIEliIH0sCi0gIHsgIm1vdiIsCURILCBJYiB9LAotICB7ICJtb3YiLAlCSCwgSWIgfSwKLSAgLyogYjggKi8KLSAgeyAibW92IiwJZUFYLCBJdiB9LAotICB7ICJtb3YiLAllQ1gsIEl2IH0sCi0gIHsgIm1vdiIsCWVEWCwgSXYgfSwKLSAgeyAibW92IiwJZUJYLCBJdiB9LAotICB7ICJtb3YiLAllU1AsIEl2IH0sCi0gIHsgIm1vdiIsCWVCUCwgSXYgfSwKLSAgeyAibW92IiwJZVNJLCBJdiB9LAotICB7ICJtb3YiLAllREksIEl2IH0sCi0gIC8qIGMwICovCi0gIHsgR1JQMmIgfSwKLSAgeyBHUlAyUyB9LAotICB7ICJyZXQiLAlJdyB9LAotICB7ICJyZXQiIH0sCi0gIHsgImxlcyIsCUd2LCBNcCB9LAotICB7ICJsZHMiLAlHdiwgTXAgfSwKLSAgeyAibW92IiwJRWIsIEliIH0sCi0gIHsgIm1vdiIsCUV2LCBJdiB9LAotICAvKiBjOCAqLwotICB7ICJlbnRlciIsCUl3LCBJYiB9LAotICB7ICJsZWF2ZSIgfSwKLSAgeyAibHJldCIsCUl3IH0sCi0gIHsgImxyZXQiIH0sCi0gIHsgImludDMiIH0sCi0gIHsgImludCIsCUliIH0sCi0gIHsgImludG8iIH0sCi0gIHsgImlyZXQiIH0sCi0gIC8qIGQwICovCi0gIHsgR1JQMmJfb25lIH0sCi0gIHsgR1JQMlNfb25lIH0sCi0gIHsgR1JQMmJfY2wgfSwKLSAgeyBHUlAyU19jbCB9LAotICB7ICJhYW0iLAlzSWIgfSwKLSAgeyAiYWFkIiwJc0liIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJ4bGF0IiwJRFNCWCB9LAotICAvKiBkOCAqLwotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgLyogZTAgKi8KLSAgeyAibG9vcG5lIiwJSmIgfSwKLSAgeyAibG9vcGUiLAlKYiB9LAotICB7ICJsb29wIiwJSmIgfSwKLSAgeyAiakVjeHoiLAlKYiB9LAotICB7ICJpbiIsCUFMLCBJYiB9LAotICB7ICJpbiIsCWVBWCwgSWIgfSwKLSAgeyAib3V0IiwJSWIsIEFMIH0sCi0gIHsgIm91dCIsCUliLCBlQVggfSwKLSAgLyogZTggKi8KLSAgeyAiY2FsbCIsCUp2IH0sCi0gIHsgImptcCIsCUp2IH0sCi0gIHsgImxqbXAiLAlBcCB9LAotICB7ICJqbXAiLAlKYiB9LAotICB7ICJpbiIsCUFMLCBpbmRpckRYIH0sCi0gIHsgImluIiwJZUFYLCBpbmRpckRYIH0sCi0gIHsgIm91dCIsCWluZGlyRFgsIEFMIH0sCi0gIHsgIm91dCIsCWluZGlyRFgsIGVBWCB9LAotICAvKiBmMCAqLwotICB7ICIoYmFkKSIgfSwJCQkvKiBsb2NrIHByZWZpeCAqLwotICB7ICIoYmFkKSIgfSwKLSAgeyAiKGJhZCkiIH0sCQkJLyogcmVwbmUgKi8KLSAgeyAiKGJhZCkiIH0sCQkJLyogcmVweiAqLwotICB7ICJobHQiIH0sCi0gIHsgImNtYyIgfSwKLSAgeyBHUlAzYiB9LAotICB7IEdSUDNTIH0sCi0gIC8qIGY4ICovCi0gIHsgImNsYyIgfSwKLSAgeyAic3RjIiB9LAotICB7ICJjbGkiIH0sCi0gIHsgInN0aSIgfSwKLSAgeyAiY2xkIiB9LAotICB7ICJzdGQiIH0sCi0gIHsgR1JQNCB9LAotICB7IEdSUDUgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IGRpczM4Nl90d29ieXRlX2F0dFtdID0gewotICAvKiAwMCAqLwotICB7IEdSUDYgfSwKLSAgeyBHUlA3IH0sCi0gIHsgImxhclMiLCBHdiwgRXcgfSwKLSAgeyAibHNsUyIsIEd2LCBFdyB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgImNsdHMiIH0sCi0gIHsgIihiYWQpIiB9LAotICAvKiAwOCAqLwotICB7ICJpbnZkIiB9LAotICB7ICJ3YmludmQiIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJ1ZDJhIiB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyBHUlBBTUQgfSwKLSAgeyAiZmVtbXMiIH0sCi0gIHsgIiIsIE1YLCBFTSwgT1BTVUYgfSwgLyogU2VlIE9QXzNETm93U3VmZml4ICovCi0gIC8qIDEwICovCi0gIHsgUFJFR1JQOCB9LAotICB7IFBSRUdSUDkgfSwKLSAgeyAibW92bHBzIiwgWE0sIEVYLCBTSU1EX0ZpeHVwLCAnaCcgfSwgIC8qIHJlYWxseSBvbmx5IDIgb3BlcmFuZHMgKi8KLSAgeyAibW92bHBzIiwgRVgsIFhNLCBTSU1EX0ZpeHVwLCAnaCcgfSwKLSAgeyAidW5wY2tscHMiLCBYTSwgRVggfSwKLSAgeyAidW5wY2tocHMiLCBYTSwgRVggfSwKLSAgeyAibW92aHBzIiwgWE0sIEVYLCBTSU1EX0ZpeHVwLCAnbCcgfSwKLSAgeyAibW92aHBzIiwgRVgsIFhNLCBTSU1EX0ZpeHVwLCAnbCcgfSwKLSAgLyogMTggKi8KLSAgeyBHUlAxNCB9LAotICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCi0gIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAotICAvKiAyMCAqLwotICAvKiB0aGVzZSBhcmUgYWxsIGJhY2t3YXJkIGluIGFwcGVuZGl4IEEgb2YgdGhlIGludGVsIGJvb2sgKi8KLSAgeyAibW92TCIsIFJkLCBDZCB9LAotICB7ICJtb3ZMIiwgUmQsIERkIH0sCi0gIHsgIm1vdkwiLCBDZCwgUmQgfSwKLSAgeyAibW92TCIsIERkLCBSZCB9LAotICB7ICJtb3ZMIiwgUmQsIFRkIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJtb3ZMIiwgVGQsIFJkIH0sCi0gIHsgIihiYWQpIiB9LAotICAvKiAyOCAqLwotICB7ICJtb3ZhcHMiLCBYTSwgRVggfSwKLSAgeyAibW92YXBzIiwgRVgsIFhNIH0sCi0gIHsgUFJFR1JQMiB9LAotICB7ICJtb3ZudHBzIiwgRXYsIFhNIH0sCi0gIHsgUFJFR1JQNCB9LAotICB7IFBSRUdSUDMgfSwKLSAgeyAidWNvbWlzcyIsIFhNLCBFWCB9LAotICB7ICJjb21pc3MiLCBYTSwgRVggfSwKLSAgLyogMzAgKi8KLSAgeyAid3Jtc3IiIH0sICB7ICJyZHRzYyIgfSwgIHsgInJkbXNyIiB9LCAgeyAicmRwbWMiIH0sCi0gIHsgInN5c2VudGVyIiB9LCAgeyAic3lzZXhpdCIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCi0gIC8qIDM4ICovCi0gIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAotICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKLSAgLyogNDAgKi8KLSAgeyAiY21vdm8iLCBHdixFdiB9LCB7ICJjbW92bm8iLCBHdixFdiB9LCB7ICJjbW92YiIsIEd2LEV2IH0sIHsgImNtb3ZhZSIsIEd2LEV2IH0sCi0gIHsgImNtb3ZlIiwgR3YsRXYgfSwgeyAiY21vdm5lIiwgR3YsRXYgfSwgeyAiY21vdmJlIiwgR3YsRXYgfSwgeyAiY21vdmEiLCBHdixFdiB9LAotICAvKiA0OCAqLwotICB7ICJjbW92cyIsIEd2LEV2IH0sIHsgImNtb3ZucyIsIEd2LEV2IH0sIHsgImNtb3ZwIiwgR3YsRXYgfSwgeyAiY21vdm5wIiwgR3YsRXYgfSwKLSAgeyAiY21vdmwiLCBHdixFdiB9LCB7ICJjbW92Z2UiLCBHdixFdiB9LCB7ICJjbW92bGUiLCBHdixFdiB9LCB7ICJjbW92ZyIsIEd2LEV2IH0sCi0gIC8qIDUwICovCi0gIHsgIm1vdm1za3BzIiwgR3YsIEVYIH0sCi0gIHsgUFJFR1JQMTMgfSwKLSAgeyBQUkVHUlAxMiB9LAotICB7IFBSRUdSUDExIH0sCi0gIHsgImFuZHBzIiwgWE0sIEVYIH0sCi0gIHsgImFuZG5wcyIsIFhNLCBFWCB9LAotICB7ICJvcnBzIiwgWE0sIEVYIH0sCi0gIHsgInhvcnBzIiwgWE0sIEVYIH0sCi0gIC8qIDU4ICovCi0gIHsgUFJFR1JQMCB9LAotICB7IFBSRUdSUDEwIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyBQUkVHUlAxNCB9LAotICB7IFBSRUdSUDcgfSwKLSAgeyBQUkVHUlA1IH0sCi0gIHsgUFJFR1JQNiB9LAotICAvKiA2MCAqLwotICB7ICJwdW5wY2tsYnciLCBNWCwgRU0gfSwKLSAgeyAicHVucGNrbHdkIiwgTVgsIEVNIH0sCi0gIHsgInB1bnBja2xkcSIsIE1YLCBFTSB9LAotICB7ICJwYWNrc3N3YiIsIE1YLCBFTSB9LAotICB7ICJwY21wZ3RiIiwgTVgsIEVNIH0sCi0gIHsgInBjbXBndHciLCBNWCwgRU0gfSwKLSAgeyAicGNtcGd0ZCIsIE1YLCBFTSB9LAotICB7ICJwYWNrdXN3YiIsIE1YLCBFTSB9LAotICAvKiA2OCAqLwotICB7ICJwdW5wY2toYnciLCBNWCwgRU0gfSwKLSAgeyAicHVucGNraHdkIiwgTVgsIEVNIH0sCi0gIHsgInB1bnBja2hkcSIsIE1YLCBFTSB9LAotICB7ICJwYWNrc3NkdyIsIE1YLCBFTSB9LAotICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAotICB7ICJtb3ZkIiwgTVgsIEVkIH0sCi0gIHsgIm1vdnEiLCBNWCwgRU0gfSwKLSAgLyogNzAgKi8KLSAgeyAicHNodWZ3IiwgTVgsIEVNLCBJYiB9LAotICB7IEdSUDEwIH0sCi0gIHsgR1JQMTEgfSwKLSAgeyBHUlAxMiB9LAotICB7ICJwY21wZXFiIiwgTVgsIEVNIH0sCi0gIHsgInBjbXBlcXciLCBNWCwgRU0gfSwKLSAgeyAicGNtcGVxZCIsIE1YLCBFTSB9LAotICB7ICJlbW1zIiB9LAotICAvKiA3OCAqLwotICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKLSAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKLSAgeyAibW92ZCIsIEVkLCBNWCB9LAotICB7ICJtb3ZxIiwgRU0sIE1YIH0sCi0gIC8qIDgwICovCi0gIHsgImpvIiwgSnYgfSwKLSAgeyAiam5vIiwgSnYgfSwKLSAgeyAiamIiLCBKdiB9LAotICB7ICJqYWUiLCBKdiB9LAotICB7ICJqZSIsIEp2IH0sCi0gIHsgImpuZSIsIEp2IH0sCi0gIHsgImpiZSIsIEp2IH0sCi0gIHsgImphIiwgSnYgfSwKLSAgLyogODggKi8KLSAgeyAianMiLCBKdiB9LAotICB7ICJqbnMiLCBKdiB9LAotICB7ICJqcCIsIEp2IH0sCi0gIHsgImpucCIsIEp2IH0sCi0gIHsgImpsIiwgSnYgfSwKLSAgeyAiamdlIiwgSnYgfSwKLSAgeyAiamxlIiwgSnYgfSwKLSAgeyAiamciLCBKdiB9LAotICAvKiA5MCAqLwotICB7ICJzZXRvIiwgRWIgfSwKLSAgeyAic2V0bm8iLCBFYiB9LAotICB7ICJzZXRiIiwgRWIgfSwKLSAgeyAic2V0YWUiLCBFYiB9LAotICB7ICJzZXRlIiwgRWIgfSwKLSAgeyAic2V0bmUiLCBFYiB9LAotICB7ICJzZXRiZSIsIEViIH0sCi0gIHsgInNldGEiLCBFYiB9LAotICAvKiA5OCAqLwotICB7ICJzZXRzIiwgRWIgfSwKLSAgeyAic2V0bnMiLCBFYiB9LAotICB7ICJzZXRwIiwgRWIgfSwKLSAgeyAic2V0bnAiLCBFYiB9LAotICB7ICJzZXRsIiwgRWIgfSwKLSAgeyAic2V0Z2UiLCBFYiB9LAotICB7ICJzZXRsZSIsIEViIH0sCi0gIHsgInNldGciLCBFYiB9LAotICAvKiBhMCAqLwotICB7ICJwdXNoUCIsIGZzIH0sCi0gIHsgInBvcFAiLCBmcyB9LAotICB7ICJjcHVpZCIgfSwKLSAgeyAiYnRTIiwgRXYsIEd2IH0sCi0gIHsgInNobGRTIiwgRXYsIEd2LCBJYiB9LAotICB7ICJzaGxkUyIsIEV2LCBHdiwgQ0wgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgIihiYWQpIiB9LAotICAvKiBhOCAqLwotICB7ICJwdXNoUCIsIGdzIH0sCi0gIHsgInBvcFAiLCBncyB9LAotICB7ICJyc20iIH0sCi0gIHsgImJ0c1MiLCBFdiwgR3YgfSwKLSAgeyAic2hyZFMiLCBFdiwgR3YsIEliIH0sCi0gIHsgInNocmRTIiwgRXYsIEd2LCBDTCB9LAotICB7IEdSUDEzIH0sCi0gIHsgImltdWxTIiwgR3YsIEV2IH0sCi0gIC8qIGIwICovCi0gIHsgImNtcHhjaGdCIiwgRWIsIEdiIH0sCi0gIHsgImNtcHhjaGdTIiwgRXYsIEd2IH0sCi0gIHsgImxzc1MiLCBHdiwgTXAgfSwKLSAgeyAiYnRyUyIsIEV2LCBHdiB9LAotICB7ICJsZnNTIiwgR3YsIE1wIH0sCi0gIHsgImxnc1MiLCBHdiwgTXAgfSwKLSAgeyAibW92emJSIiwgR3YsIEViIH0sCi0gIHsgIm1vdnp3UiIsIEd2LCBFdyB9LCAvKiB5ZXMsIHRoZXJlIHJlYWxseSBpcyBtb3Z6d3cgISAqLwotICAvKiBiOCAqLwotICB7ICIoYmFkKSIgfSwKLSAgeyAidWQyYiIgfSwKLSAgeyBHUlA4IH0sCi0gIHsgImJ0Y1MiLCBFdiwgR3YgfSwKLSAgeyAiYnNmUyIsIEd2LCBFdiB9LAotICB7ICJic3JTIiwgR3YsIEV2IH0sCi0gIHsgIm1vdnNiUiIsIEd2LCBFYiB9LAotICB7ICJtb3Zzd1IiLCBHdiwgRXcgfSwgLyogeWVzLCB0aGVyZSByZWFsbHkgaXMgbW92c3d3ICEgKi8KLSAgLyogYzAgKi8KLSAgeyAieGFkZEIiLCBFYiwgR2IgfSwKLSAgeyAieGFkZFMiLCBFdiwgR3YgfSwKLSAgeyBQUkVHUlAxIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJwaW5zcnciLCBNWCwgRXYsIEliIH0sCi0gIHsgInBleHRydyIsIEV2LCBNWCwgSWIgfSwKLSAgeyAic2h1ZnBzIiwgWE0sIEVYLCBJYiB9LAotICB7IEdSUDkgfSwKLSAgLyogYzggKi8KLSAgeyAiYnN3YXAiLCBlQVggfSwJLyogYnN3YXAgZG9lc24ndCBzdXBwb3J0IDE2IGJpdCByZWdzICovCi0gIHsgImJzd2FwIiwgZUNYIH0sCi0gIHsgImJzd2FwIiwgZURYIH0sCi0gIHsgImJzd2FwIiwgZUJYIH0sCi0gIHsgImJzd2FwIiwgZVNQIH0sCi0gIHsgImJzd2FwIiwgZUJQIH0sCi0gIHsgImJzd2FwIiwgZVNJIH0sCi0gIHsgImJzd2FwIiwgZURJIH0sCi0gIC8qIGQwICovCi0gIHsgIihiYWQpIiB9LAotICB7ICJwc3JsdyIsIE1YLCBFTSB9LAotICB7ICJwc3JsZCIsIE1YLCBFTSB9LAotICB7ICJwc3JscSIsIE1YLCBFTSB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAicG11bGx3IiwgTVgsIEVNIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJwbW92bXNrYiIsIEV2LCBNWCB9LAotICAvKiBkOCAqLwotICB7ICJwc3VidXNiIiwgTVgsIEVNIH0sCi0gIHsgInBzdWJ1c3ciLCBNWCwgRU0gfSwKLSAgeyAicG1pbnViIiwgTVgsIEVNIH0sCi0gIHsgInBhbmQiLCBNWCwgRU0gfSwKLSAgeyAicGFkZHVzYiIsIE1YLCBFTSB9LAotICB7ICJwYWRkdXN3IiwgTVgsIEVNIH0sCi0gIHsgInBtYXh1YiIsIE1YLCBFTSB9LAotICB7ICJwYW5kbiIsIE1YLCBFTSB9LAotICAvKiBlMCAqLwotICB7ICJwYXZnYiIsIE1YLCBFTSB9LAotICB7ICJwc3JhdyIsIE1YLCBFTSB9LAotICB7ICJwc3JhZCIsIE1YLCBFTSB9LAotICB7ICJwYXZndyIsIE1YLCBFTSB9LAotICB7ICJwbXVsaHV3IiwgTVgsIEVNIH0sCi0gIHsgInBtdWxodyIsIE1YLCBFTSB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAibW92bnRxIiwgRXYsIE1YIH0sCi0gIC8qIGU4ICovCi0gIHsgInBzdWJzYiIsIE1YLCBFTSB9LAotICB7ICJwc3Vic3ciLCBNWCwgRU0gfSwKLSAgeyAicG1pbnN3IiwgTVgsIEVNIH0sCi0gIHsgInBvciIsIE1YLCBFTSB9LAotICB7ICJwYWRkc2IiLCBNWCwgRU0gfSwKLSAgeyAicGFkZHN3IiwgTVgsIEVNIH0sCi0gIHsgInBtYXhzdyIsIE1YLCBFTSB9LAotICB7ICJweG9yIiwgTVgsIEVNIH0sCi0gIC8qIGYwICovCi0gIHsgIihiYWQpIiB9LAotICB7ICJwc2xsdyIsIE1YLCBFTSB9LAotICB7ICJwc2xsZCIsIE1YLCBFTSB9LAotICB7ICJwc2xscSIsIE1YLCBFTSB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAicG1hZGR3ZCIsIE1YLCBFTSB9LAotICB7ICJwc2FkYnciLCBNWCwgRU0gfSwKLSAgeyAibWFza21vdnEiLCBNWCwgRU0gfSwKLSAgLyogZjggKi8KLSAgeyAicHN1YmIiLCBNWCwgRU0gfSwKLSAgeyAicHN1YnciLCBNWCwgRU0gfSwKLSAgeyAicHN1YmQiLCBNWCwgRU0gfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgInBhZGRiIiwgTVgsIEVNIH0sCi0gIHsgInBhZGR3IiwgTVgsIEVNIH0sCi0gIHsgInBhZGRkIiwgTVgsIEVNIH0sCi0gIHsgIihiYWQpIiB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRpczM4NiBkaXMzODZfdHdvYnl0ZV9pbnRlbFtdID0gewotICAvKiAwMCAqLwotICB7IEdSUDYgfSwKLSAgeyBHUlA3IH0sCi0gIHsgImxhciIsIEd2LCBFdyB9LAotICB7ICJsc2wiLCBHdiwgRXcgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJjbHRzIiB9LAotICB7ICIoYmFkKSIgfSwKLSAgLyogMDggKi8KLSAgeyAiaW52ZCIgfSwKLSAgeyAid2JpbnZkIiB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAidWQyYSIgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgR1JQQU1EIH0sCi0gIHsgImZlbW1zIiB9LAotICB7ICIiLCBNWCwgRU0sIE9QU1VGIH0sIC8qIFNlZSBPUF8zRE5vd1N1ZmZpeCAqLwotICAvKiAxMCAqLwotICB7IFBSRUdSUDggfSwKLSAgeyBQUkVHUlA5IH0sCi0gIHsgIm1vdmxwcyIsIFhNLCBFWCwgU0lNRF9GaXh1cCwgJ2gnIH0sICAvKiByZWFsbHkgb25seSAyIG9wZXJhbmRzICovCi0gIHsgIm1vdmxwcyIsIEVYLCBYTSwgU0lNRF9GaXh1cCwgJ2gnIH0sCi0gIHsgInVucGNrbHBzIiwgWE0sIEVYIH0sCi0gIHsgInVucGNraHBzIiwgWE0sIEVYIH0sCi0gIHsgIm1vdmhwcyIsIFhNLCBFWCwgU0lNRF9GaXh1cCwgJ2wnIH0sCi0gIHsgIm1vdmhwcyIsIEVYLCBYTSwgU0lNRF9GaXh1cCwgJ2wnIH0sCi0gIC8qIDE4ICovCi0gIHsgR1JQMTQgfSwKLSAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAotICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKLSAgLyogMjAgKi8KLSAgLyogdGhlc2UgYXJlIGFsbCBiYWNrd2FyZCBpbiBhcHBlbmRpeCBBIG9mIHRoZSBpbnRlbCBib29rICovCi0gIHsgIm1vdiIsIFJkLCBDZCB9LAotICB7ICJtb3YiLCBSZCwgRGQgfSwKLSAgeyAibW92IiwgQ2QsIFJkIH0sCi0gIHsgIm1vdiIsIERkLCBSZCB9LAotICB7ICJtb3YiLCBSZCwgVGQgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgIm1vdiIsIFRkLCBSZCB9LAotICB7ICIoYmFkKSIgfSwKLSAgLyogMjggKi8KLSAgeyAibW92YXBzIiwgWE0sIEVYIH0sCi0gIHsgIm1vdmFwcyIsIEVYLCBYTSB9LAotICB7IFBSRUdSUDIgfSwKLSAgeyAibW92bnRwcyIsIEV2LCBYTSB9LAotICB7IFBSRUdSUDQgfSwKLSAgeyBQUkVHUlAzIH0sCi0gIHsgInVjb21pc3MiLCBYTSwgRVggfSwKLSAgeyAiY29taXNzIiwgWE0sIEVYIH0sCi0gIC8qIDMwICovCi0gIHsgIndybXNyIiB9LCAgeyAicmR0c2MiIH0sICB7ICJyZG1zciIgfSwgIHsgInJkcG1jIiB9LAotICB7ICJzeXNlbnRlciIgfSwgIHsgInN5c2V4aXQiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAotICAvKiAzOCAqLwotICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKLSAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCi0gIC8qIDQwICovCi0gIHsgImNtb3ZvIiwgR3YsRXYgfSwgeyAiY21vdm5vIiwgR3YsRXYgfSwgeyAiY21vdmIiLCBHdixFdiB9LCB7ICJjbW92YWUiLCBHdixFdiB9LAotICB7ICJjbW92ZSIsIEd2LEV2IH0sIHsgImNtb3ZuZSIsIEd2LEV2IH0sIHsgImNtb3ZiZSIsIEd2LEV2IH0sIHsgImNtb3ZhIiwgR3YsRXYgfSwKLSAgLyogNDggKi8KLSAgeyAiY21vdnMiLCBHdixFdiB9LCB7ICJjbW92bnMiLCBHdixFdiB9LCB7ICJjbW92cCIsIEd2LEV2IH0sIHsgImNtb3ZucCIsIEd2LEV2IH0sCi0gIHsgImNtb3ZsIiwgR3YsRXYgfSwgeyAiY21vdmdlIiwgR3YsRXYgfSwgeyAiY21vdmxlIiwgR3YsRXYgfSwgeyAiY21vdmciLCBHdixFdiB9LAotICAvKiA1MCAqLwotICB7ICJtb3Ztc2twcyIsIEd2LCBFWCB9LAotICB7IFBSRUdSUDEzIH0sCi0gIHsgUFJFR1JQMTIgfSwKLSAgeyBQUkVHUlAxMSB9LAotICB7ICJhbmRwcyIsIFhNLCBFWCB9LAotICB7ICJhbmRucHMiLCBYTSwgRVggfSwKLSAgeyAib3JwcyIsIFhNLCBFWCB9LAotICB7ICJ4b3JwcyIsIFhNLCBFWCB9LAotICAvKiA1OCAqLwotICB7IFBSRUdSUDAgfSwKLSAgeyBQUkVHUlAxMCB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgUFJFR1JQMTQgfSwKLSAgeyBQUkVHUlA3IH0sCi0gIHsgUFJFR1JQNSB9LAotICB7IFBSRUdSUDYgfSwKLSAgLyogNjAgKi8KLSAgeyAicHVucGNrbGJ3IiwgTVgsIEVNIH0sCi0gIHsgInB1bnBja2x3ZCIsIE1YLCBFTSB9LAotICB7ICJwdW5wY2tsZHEiLCBNWCwgRU0gfSwKLSAgeyAicGFja3Nzd2IiLCBNWCwgRU0gfSwKLSAgeyAicGNtcGd0YiIsIE1YLCBFTSB9LAotICB7ICJwY21wZ3R3IiwgTVgsIEVNIH0sCi0gIHsgInBjbXBndGQiLCBNWCwgRU0gfSwKLSAgeyAicGFja3Vzd2IiLCBNWCwgRU0gfSwKLSAgLyogNjggKi8KLSAgeyAicHVucGNraGJ3IiwgTVgsIEVNIH0sCi0gIHsgInB1bnBja2h3ZCIsIE1YLCBFTSB9LAotICB7ICJwdW5wY2toZHEiLCBNWCwgRU0gfSwKLSAgeyAicGFja3NzZHciLCBNWCwgRU0gfSwKLSAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKLSAgeyAibW92ZCIsIE1YLCBFZCB9LAotICB7ICJtb3ZxIiwgTVgsIEVNIH0sCi0gIC8qIDcwICovCi0gIHsgInBzaHVmdyIsIE1YLCBFTSwgSWIgfSwKLSAgeyBHUlAxMCB9LAotICB7IEdSUDExIH0sCi0gIHsgR1JQMTIgfSwKLSAgeyAicGNtcGVxYiIsIE1YLCBFTSB9LAotICB7ICJwY21wZXF3IiwgTVgsIEVNIH0sCi0gIHsgInBjbXBlcWQiLCBNWCwgRU0gfSwKLSAgeyAiZW1tcyIgfSwKLSAgLyogNzggKi8KLSAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCi0gIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCi0gIHsgIm1vdmQiLCBFZCwgTVggfSwKLSAgeyAibW92cSIsIEVNLCBNWCB9LAotICAvKiA4MCAqLwotICB7ICJqbyIsIEp2IH0sCi0gIHsgImpubyIsIEp2IH0sCi0gIHsgImpiIiwgSnYgfSwKLSAgeyAiamFlIiwgSnYgfSwKLSAgeyAiamUiLCBKdiB9LAotICB7ICJqbmUiLCBKdiB9LAotICB7ICJqYmUiLCBKdiB9LAotICB7ICJqYSIsIEp2IH0sCi0gIC8qIDg4ICovCi0gIHsgImpzIiwgSnYgfSwKLSAgeyAiam5zIiwgSnYgfSwKLSAgeyAianAiLCBKdiB9LAotICB7ICJqbnAiLCBKdiB9LAotICB7ICJqbCIsIEp2IH0sCi0gIHsgImpnZSIsIEp2IH0sCi0gIHsgImpsZSIsIEp2IH0sCi0gIHsgImpnIiwgSnYgfSwKLSAgLyogOTAgKi8KLSAgeyAic2V0byIsIEViIH0sCi0gIHsgInNldG5vIiwgRWIgfSwKLSAgeyAic2V0YiIsIEViIH0sCi0gIHsgInNldGFlIiwgRWIgfSwKLSAgeyAic2V0ZSIsIEViIH0sCi0gIHsgInNldG5lIiwgRWIgfSwKLSAgeyAic2V0YmUiLCBFYiB9LAotICB7ICJzZXRhIiwgRWIgfSwKLSAgLyogOTggKi8KLSAgeyAic2V0cyIsIEViIH0sCi0gIHsgInNldG5zIiwgRWIgfSwKLSAgeyAic2V0cCIsIEViIH0sCi0gIHsgInNldG5wIiwgRWIgfSwKLSAgeyAic2V0bCIsIEViIH0sCi0gIHsgInNldGdlIiwgRWIgfSwKLSAgeyAic2V0bGUiLCBFYiB9LAotICB7ICJzZXRnIiwgRWIgfSwKLSAgLyogYTAgKi8KLSAgeyAicHVzaCIsIGZzIH0sCi0gIHsgInBvcCIsIGZzIH0sCi0gIHsgImNwdWlkIiB9LAotICB7ICJidCIsIEV2LCBHdiB9LAotICB7ICJzaGxkIiwgRXYsIEd2LCBJYiB9LAotICB7ICJzaGxkIiwgRXYsIEd2LCBDTCB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIC8qIGE4ICovCi0gIHsgInB1c2giLCBncyB9LAotICB7ICJwb3AiLCBncyB9LAotICB7ICJyc20iIH0sCi0gIHsgImJ0cyIsIEV2LCBHdiB9LAotICB7ICJzaHJkIiwgRXYsIEd2LCBJYiB9LAotICB7ICJzaHJkIiwgRXYsIEd2LCBDTCB9LAotICB7IEdSUDEzIH0sCi0gIHsgImltdWwiLCBHdiwgRXYgfSwKLSAgLyogYjAgKi8KLSAgeyAiY21weGNoZyIsIEViLCBHYiB9LAotICB7ICJjbXB4Y2hnIiwgRXYsIEd2IH0sCi0gIHsgImxzcyIsIEd2LCBNcCB9LAotICB7ICJidHIiLCBFdiwgR3YgfSwKLSAgeyAibGZzIiwgR3YsIE1wIH0sCi0gIHsgImxncyIsIEd2LCBNcCB9LAotICB7ICJtb3Z6eCIsIEd2LCBFYiB9LAotICB7ICJtb3Z6eCIsIEd2LCBFdyB9LAotICAvKiBiOCAqLwotICB7ICIoYmFkKSIgfSwKLSAgeyAidWQyYiIgfSwKLSAgeyBHUlA4IH0sCi0gIHsgImJ0YyIsIEV2LCBHdiB9LAotICB7ICJic2YiLCBHdiwgRXYgfSwKLSAgeyAiYnNyIiwgR3YsIEV2IH0sCi0gIHsgIm1vdnN4IiwgR3YsIEViIH0sCi0gIHsgIm1vdnN4IiwgR3YsIEV3IH0sCi0gIC8qIGMwICovCi0gIHsgInhhZGQiLCBFYiwgR2IgfSwKLSAgeyAieGFkZCIsIEV2LCBHdiB9LAotICB7IFBSRUdSUDEgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgInBpbnNydyIsIE1YLCBFdiwgSWIgfSwKLSAgeyAicGV4dHJ3IiwgRXYsIE1YLCBJYiB9LAotICB7ICJzaHVmcHMiLCBYTSwgRVgsIEliIH0sCi0gIHsgR1JQOSB9LAotICAvKiBjOCAqLwotICB7ICJic3dhcCIsIGVBWCB9LAkvKiBic3dhcCBkb2Vzbid0IHN1cHBvcnQgMTYgYml0IHJlZ3MgKi8KLSAgeyAiYnN3YXAiLCBlQ1ggfSwKLSAgeyAiYnN3YXAiLCBlRFggfSwKLSAgeyAiYnN3YXAiLCBlQlggfSwKLSAgeyAiYnN3YXAiLCBlU1AgfSwKLSAgeyAiYnN3YXAiLCBlQlAgfSwKLSAgeyAiYnN3YXAiLCBlU0kgfSwKLSAgeyAiYnN3YXAiLCBlREkgfSwKLSAgLyogZDAgKi8KLSAgeyAiKGJhZCkiIH0sCi0gIHsgInBzcmx3IiwgTVgsIEVNIH0sCi0gIHsgInBzcmxkIiwgTVgsIEVNIH0sCi0gIHsgInBzcmxxIiwgTVgsIEVNIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJwbXVsbHciLCBNWCwgRU0gfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgInBtb3Ztc2tiIiwgRXYsIE1YIH0sCi0gIC8qIGQ4ICovCi0gIHsgInBzdWJ1c2IiLCBNWCwgRU0gfSwKLSAgeyAicHN1YnVzdyIsIE1YLCBFTSB9LAotICB7ICJwbWludWIiLCBNWCwgRU0gfSwKLSAgeyAicGFuZCIsIE1YLCBFTSB9LAotICB7ICJwYWRkdXNiIiwgTVgsIEVNIH0sCi0gIHsgInBhZGR1c3ciLCBNWCwgRU0gfSwKLSAgeyAicG1heHViIiwgTVgsIEVNIH0sCi0gIHsgInBhbmRuIiwgTVgsIEVNIH0sCi0gIC8qIGUwICovCi0gIHsgInBhdmdiIiwgTVgsIEVNIH0sCi0gIHsgInBzcmF3IiwgTVgsIEVNIH0sCi0gIHsgInBzcmFkIiwgTVgsIEVNIH0sCi0gIHsgInBhdmd3IiwgTVgsIEVNIH0sCi0gIHsgInBtdWxodXciLCBNWCwgRU0gfSwKLSAgeyAicG11bGh3IiwgTVgsIEVNIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJtb3ZudHEiLCBFdiwgTVggfSwKLSAgLyogZTggKi8KLSAgeyAicHN1YnNiIiwgTVgsIEVNIH0sCi0gIHsgInBzdWJzdyIsIE1YLCBFTSB9LAotICB7ICJwbWluc3ciLCBNWCwgRU0gfSwKLSAgeyAicG9yIiwgTVgsIEVNIH0sCi0gIHsgInBhZGRzYiIsIE1YLCBFTSB9LAotICB7ICJwYWRkc3ciLCBNWCwgRU0gfSwKLSAgeyAicG1heHN3IiwgTVgsIEVNIH0sCi0gIHsgInB4b3IiLCBNWCwgRU0gfSwKLSAgLyogZjAgKi8KLSAgeyAiKGJhZCkiIH0sCi0gIHsgInBzbGx3IiwgTVgsIEVNIH0sCi0gIHsgInBzbGxkIiwgTVgsIEVNIH0sCi0gIHsgInBzbGxxIiwgTVgsIEVNIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJwbWFkZHdkIiwgTVgsIEVNIH0sCi0gIHsgInBzYWRidyIsIE1YLCBFTSB9LAotICB7ICJtYXNrbW92cSIsIE1YLCBFTSB9LAotICAvKiBmOCAqLwotICB7ICJwc3ViYiIsIE1YLCBFTSB9LAotICB7ICJwc3VidyIsIE1YLCBFTSB9LAotICB7ICJwc3ViZCIsIE1YLCBFTSB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAicGFkZGIiLCBNWCwgRU0gfSwKLSAgeyAicGFkZHciLCBNWCwgRU0gfSwKLSAgeyAicGFkZGQiLCBNWCwgRU0gfSwKLSAgeyAiKGJhZCkiIH0KLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG9uZWJ5dGVfaGFzX21vZHJtWzI1Nl0gPSB7Ci0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qIDAwICovIDEsMSwxLDEsMCwwLDAsMCwxLDEsMSwxLDAsMCwwLDAsIC8qIDAwICovCi0gIC8qIDEwICovIDEsMSwxLDEsMCwwLDAsMCwxLDEsMSwxLDAsMCwwLDAsIC8qIDEwICovCi0gIC8qIDIwICovIDEsMSwxLDEsMCwwLDAsMCwxLDEsMSwxLDAsMCwwLDAsIC8qIDIwICovCi0gIC8qIDMwICovIDEsMSwxLDEsMCwwLDAsMCwxLDEsMSwxLDAsMCwwLDAsIC8qIDMwICovCi0gIC8qIDQwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDQwICovCi0gIC8qIDUwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDUwICovCi0gIC8qIDYwICovIDAsMCwxLDEsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsIC8qIDYwICovCi0gIC8qIDcwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDcwICovCi0gIC8qIDgwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDgwICovCi0gIC8qIDkwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDkwICovCi0gIC8qIGEwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGEwICovCi0gIC8qIGIwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGIwICovCi0gIC8qIGMwICovIDEsMSwwLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsIC8qIGMwICovCi0gIC8qIGQwICovIDEsMSwxLDEsMCwwLDAsMCwxLDEsMSwxLDEsMSwxLDEsIC8qIGQwICovCi0gIC8qIGUwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGUwICovCi0gIC8qIGYwICovIDAsMCwwLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwxLDEgIC8qIGYwICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0d29ieXRlX2hhc19tb2RybVsyNTZdID0gewotICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLwotICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLwotICAvKiAwMCAqLyAxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLCAvKiAwZiAqLwotICAvKiAxMCAqLyAxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLCAvKiAxZiAqLwotICAvKiAyMCAqLyAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLCAvKiAyZiAqLwotICAvKiAzMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAzZiAqLwotICAvKiA0MCAqLyAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLCAvKiA0ZiAqLwotICAvKiA1MCAqLyAxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwxLDEsMSwxLCAvKiA1ZiAqLwotICAvKiA2MCAqLyAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMSwxLCAvKiA2ZiAqLwotICAvKiA3MCAqLyAxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMSwxLCAvKiA3ZiAqLwotICAvKiA4MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA4ZiAqLwotICAvKiA5MCAqLyAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLCAvKiA5ZiAqLwotICAvKiBhMCAqLyAwLDAsMCwxLDEsMSwxLDEsMCwwLDAsMSwxLDEsMSwxLCAvKiBhZiAqLwotICAvKiBiMCAqLyAxLDEsMSwxLDEsMSwxLDEsMCwwLDEsMSwxLDEsMSwxLCAvKiBiZiAqLwotICAvKiBjMCAqLyAxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLCAvKiBjZiAqLwotICAvKiBkMCAqLyAwLDEsMSwxLDAsMSwwLDEsMSwxLDEsMSwxLDEsMSwxLCAvKiBkZiAqLwotICAvKiBlMCAqLyAxLDEsMSwxLDEsMSwwLDEsMSwxLDEsMSwxLDEsMSwxLCAvKiBlZiAqLwotICAvKiBmMCAqLyAwLDEsMSwxLDAsMSwxLDEsMSwxLDEsMCwxLDEsMSwwICAvKiBmZiAqLwotICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLwotICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLwotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdHdvYnl0ZV91c2VzX2YzX3ByZWZpeFsyNTZdID0gewotICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLwotICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLwotICAvKiAwMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAwZiAqLwotICAvKiAxMCAqLyAxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAxZiAqLwotICAvKiAyMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDEsMCwwLCAvKiAyZiAqLwotICAvKiAzMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAzZiAqLwotICAvKiA0MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA0ZiAqLwotICAvKiA1MCAqLyAwLDEsMSwxLDAsMCwwLDAsMSwxLDAsMCwxLDEsMSwxLCAvKiA1ZiAqLwotICAvKiA2MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA2ZiAqLwotICAvKiA3MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA3ZiAqLwotICAvKiA4MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA4ZiAqLwotICAvKiA5MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA5ZiAqLwotICAvKiBhMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBhZiAqLwotICAvKiBiMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBiZiAqLwotICAvKiBjMCAqLyAwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBjZiAqLwotICAvKiBkMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBkZiAqLwotICAvKiBlMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBlZiAqLwotICAvKiBmMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwICAvKiBmZiAqLwotICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLwotICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLwotfTsKLQotc3RhdGljIGNoYXIgb2J1ZlsxMDBdOwotc3RhdGljIGNoYXIgKm9idWZwOwotc3RhdGljIGNoYXIgc2NyYXRjaGJ1ZlsxMDBdOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKnN0YXJ0X2NvZGVwOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKmluc25fY29kZXA7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqY29kZXA7Ci1zdGF0aWMgZGlzYXNzZW1ibGVfaW5mbyAqdGhlX2luZm87Ci1zdGF0aWMgaW50IG1vZDsKLXN0YXRpYyBpbnQgcm07Ci1zdGF0aWMgaW50IHJlZzsKLXN0YXRpYyB2b2lkIG9hcHBlbmQgUEFSQU1TICgoY29uc3QgY2hhciAqcykpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqbmFtZXMzMltdPXsKLSAgIiVlYXgiLCIlZWN4IiwiJWVkeCIsIiVlYngiLCAiJWVzcCIsIiVlYnAiLCIlZXNpIiwiJWVkaSIsCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVzMTZbXSA9IHsKLSAgIiVheCIsIiVjeCIsIiVkeCIsIiVieCIsIiVzcCIsIiVicCIsIiVzaSIsIiVkaSIsCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVzOFtdID0gewotICAiJWFsIiwiJWNsIiwiJWRsIiwiJWJsIiwiJWFoIiwiJWNoIiwiJWRoIiwiJWJoIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqbmFtZXNfc2VnW10gPSB7Ci0gICIlZXMiLCIlY3MiLCIlc3MiLCIlZHMiLCIlZnMiLCIlZ3MiLCIlPyIsIiU/IiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqaW5kZXgxNltdID0gewotICAiJWJ4LCVzaSIsIiVieCwlZGkiLCIlYnAsJXNpIiwiJWJwLCVkaSIsIiVzaSIsIiVkaSIsIiVicCIsIiVieCIKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IGdycHNbXVs4XSA9IHsKLSAgLyogR1JQMWIgKi8KLSAgewotICAgIHsgImFkZEEiLAlFYiwgSWIgfSwKLSAgICB7ICJvckEiLAlFYiwgSWIgfSwKLSAgICB7ICJhZGNBIiwJRWIsIEliIH0sCi0gICAgeyAic2JiQSIsCUViLCBJYiB9LAotICAgIHsgImFuZEEiLAlFYiwgSWIgfSwKLSAgICB7ICJzdWJBIiwJRWIsIEliIH0sCi0gICAgeyAieG9yQSIsCUViLCBJYiB9LAotICAgIHsgImNtcEEiLAlFYiwgSWIgfQotICB9LAotICAvKiBHUlAxUyAqLwotICB7Ci0gICAgeyAiYWRkUSIsCUV2LCBJdiB9LAotICAgIHsgIm9yUSIsCUV2LCBJdiB9LAotICAgIHsgImFkY1EiLAlFdiwgSXYgfSwKLSAgICB7ICJzYmJRIiwJRXYsIEl2IH0sCi0gICAgeyAiYW5kUSIsCUV2LCBJdiB9LAotICAgIHsgInN1YlEiLAlFdiwgSXYgfSwKLSAgICB7ICJ4b3JRIiwJRXYsIEl2IH0sCi0gICAgeyAiY21wUSIsCUV2LCBJdiB9Ci0gIH0sCi0gIC8qIEdSUDFTcyAqLwotICB7Ci0gICAgeyAiYWRkUSIsCUV2LCBzSWIgfSwKLSAgICB7ICJvclEiLAlFdiwgc0liIH0sCi0gICAgeyAiYWRjUSIsCUV2LCBzSWIgfSwKLSAgICB7ICJzYmJRIiwJRXYsIHNJYiB9LAotICAgIHsgImFuZFEiLAlFdiwgc0liIH0sCi0gICAgeyAic3ViUSIsCUV2LCBzSWIgfSwKLSAgICB7ICJ4b3JRIiwJRXYsIHNJYiB9LAotICAgIHsgImNtcFEiLAlFdiwgc0liIH0KLSAgfSwKLSAgLyogR1JQMmIgKi8KLSAgewotICAgIHsgInJvbEEiLAlFYiwgSWIgfSwKLSAgICB7ICJyb3JBIiwJRWIsIEliIH0sCi0gICAgeyAicmNsQSIsCUViLCBJYiB9LAotICAgIHsgInJjckEiLAlFYiwgSWIgfSwKLSAgICB7ICJzaGxBIiwJRWIsIEliIH0sCi0gICAgeyAic2hyQSIsCUViLCBJYiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgInNhckEiLAlFYiwgSWIgfSwKLSAgfSwKLSAgLyogR1JQMlMgKi8KLSAgewotICAgIHsgInJvbFEiLAlFdiwgSWIgfSwKLSAgICB7ICJyb3JRIiwJRXYsIEliIH0sCi0gICAgeyAicmNsUSIsCUV2LCBJYiB9LAotICAgIHsgInJjclEiLAlFdiwgSWIgfSwKLSAgICB7ICJzaGxRIiwJRXYsIEliIH0sCi0gICAgeyAic2hyUSIsCUV2LCBJYiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgInNhclEiLAlFdiwgSWIgfSwKLSAgfSwKLSAgLyogR1JQMmJfb25lICovCi0gIHsKLSAgICB7ICJyb2xBIiwJRWIgfSwKLSAgICB7ICJyb3JBIiwJRWIgfSwKLSAgICB7ICJyY2xBIiwJRWIgfSwKLSAgICB7ICJyY3JBIiwJRWIgfSwKLSAgICB7ICJzaGxBIiwJRWIgfSwKLSAgICB7ICJzaHJBIiwJRWIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJzYXJBIiwJRWIgfSwKLSAgfSwKLSAgLyogR1JQMlNfb25lICovCi0gIHsKLSAgICB7ICJyb2xRIiwJRXYgfSwKLSAgICB7ICJyb3JRIiwJRXYgfSwKLSAgICB7ICJyY2xRIiwJRXYgfSwKLSAgICB7ICJyY3JRIiwJRXYgfSwKLSAgICB7ICJzaGxRIiwJRXYgfSwKLSAgICB7ICJzaHJRIiwJRXYgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJzYXJRIiwJRXYgfSwKLSAgfSwKLSAgLyogR1JQMmJfY2wgKi8KLSAgewotICAgIHsgInJvbEEiLAlFYiwgQ0wgfSwKLSAgICB7ICJyb3JBIiwJRWIsIENMIH0sCi0gICAgeyAicmNsQSIsCUViLCBDTCB9LAotICAgIHsgInJjckEiLAlFYiwgQ0wgfSwKLSAgICB7ICJzaGxBIiwJRWIsIENMIH0sCi0gICAgeyAic2hyQSIsCUViLCBDTCB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgInNhckEiLAlFYiwgQ0wgfSwKLSAgfSwKLSAgLyogR1JQMlNfY2wgKi8KLSAgewotICAgIHsgInJvbFEiLAlFdiwgQ0wgfSwKLSAgICB7ICJyb3JRIiwJRXYsIENMIH0sCi0gICAgeyAicmNsUSIsCUV2LCBDTCB9LAotICAgIHsgInJjclEiLAlFdiwgQ0wgfSwKLSAgICB7ICJzaGxRIiwJRXYsIENMIH0sCi0gICAgeyAic2hyUSIsCUV2LCBDTCB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgInNhclEiLAlFdiwgQ0wgfQotICB9LAotICAvKiBHUlAzYiAqLwotICB7Ci0gICAgeyAidGVzdEEiLAlFYiwgSWIgfSwKLSAgICB7ICIoYmFkKSIsCUViIH0sCi0gICAgeyAibm90QSIsCUViIH0sCi0gICAgeyAibmVnQSIsCUViIH0sCi0gICAgeyAibXVsQiIsCUFMLCBFYiB9LAotICAgIHsgImltdWxCIiwJQUwsIEViIH0sCi0gICAgeyAiZGl2QiIsCUFMLCBFYiB9LAotICAgIHsgImlkaXZCIiwJQUwsIEViIH0KLSAgfSwKLSAgLyogR1JQM1MgKi8KLSAgewotICAgIHsgInRlc3RRIiwJRXYsIEl2IH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAibm90USIsCUV2IH0sCi0gICAgeyAibmVnUSIsCUV2IH0sCi0gICAgeyAibXVsUyIsCWVBWCwgRXYgfSwKLSAgICB7ICJpbXVsUyIsCWVBWCwgRXYgfSwKLSAgICB7ICJkaXZTIiwJZUFYLCBFdiB9LAotICAgIHsgImlkaXZTIiwJZUFYLCBFdiB9LAotICB9LAotICAvKiBHUlA0ICovCi0gIHsKLSAgICB7ICJpbmNBIiwgRWIgfSwKLSAgICB7ICJkZWNBIiwgRWIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgfSwKLSAgLyogR1JQNSAqLwotICB7Ci0gICAgeyAiaW5jUSIsCUV2IH0sCi0gICAgeyAiZGVjUSIsCUV2IH0sCi0gICAgeyAiY2FsbFAiLAlpbmRpckV2IH0sCi0gICAgeyAiY2FsbFAiLAlpbmRpckV2IH0sCi0gICAgeyAiam1wUCIsCWluZGlyRXYgfSwKLSAgICB7ICJsam1wUCIsCWluZGlyRXYgfSwKLSAgICB7ICJwdXNoUSIsCUV2IH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gIH0sCi0gIC8qIEdSUDYgKi8KLSAgewotICAgIHsgInNsZHQiLAlFdyB9LAotICAgIHsgInN0ciIsCUV3IH0sCi0gICAgeyAibGxkdCIsCUV3IH0sCi0gICAgeyAibHRyIiwJRXcgfSwKLSAgICB7ICJ2ZXJyIiwJRXcgfSwKLSAgICB7ICJ2ZXJ3IiwJRXcgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfQotICB9LAotICAvKiBHUlA3ICovCi0gIHsKLSAgICB7ICJzZ2R0IiwgRXcgfSwKLSAgICB7ICJzaWR0IiwgRXcgfSwKLSAgICB7ICJsZ2R0IiwgRXcgfSwKLSAgICB7ICJsaWR0IiwgRXcgfSwKLSAgICB7ICJzbXN3IiwgRXcgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJsbXN3IiwgRXcgfSwKLSAgICB7ICJpbnZscGciLCBFdyB9LAotICB9LAotICAvKiBHUlA4ICovCi0gIHsKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJidFEiLAlFdiwgSWIgfSwKLSAgICB7ICJidHNRIiwJRXYsIEliIH0sCi0gICAgeyAiYnRyUSIsCUV2LCBJYiB9LAotICAgIHsgImJ0Y1EiLAlFdiwgSWIgfSwKLSAgfSwKLSAgLyogR1JQOSAqLwotICB7Ci0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiY21weGNoZzhiIiwgRXYgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgfSwKLSAgLyogR1JQMTAgKi8KLSAgewotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgInBzcmx3IiwgTVMsIEliIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAicHNyYXciLCBNUywgSWIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJwc2xsdyIsIE1TLCBJYiB9LAotICAgIHsgIihiYWQpIiB9LAotICB9LAotICAvKiBHUlAxMSAqLwotICB7Ci0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAicHNybGQiLCBNUywgSWIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJwc3JhZCIsIE1TLCBJYiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgInBzbGxkIiwgTVMsIEliIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gIH0sCi0gIC8qIEdSUDEyICovCi0gIHsKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJwc3JscSIsIE1TLCBJYiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgInBzbGxxIiwgTVMsIEliIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gIH0sCi0gIC8qIEdSUDEzICovCi0gIHsKLSAgICB7ICJmeHNhdmUiLCBFdiB9LAotICAgIHsgImZ4cnN0b3IiLCBFdiB9LAotICAgIHsgImxkbXhjc3IiLCBFdiB9LAotICAgIHsgInN0bXhjc3IiLCBFdiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgInNmZW5jZSIsIE5vbmUgfSwKLSAgfSwKLSAgLyogR1JQMTQgKi8KLSAgewotICAgIHsgInByZWZldGNobnRhIiwgRXYgfSwKLSAgICB7ICJwcmVmZXRjaHQwIiwgRXYgfSwKLSAgICB7ICJwcmVmZXRjaHQxIiwgRXYgfSwKLSAgICB7ICJwcmVmZXRjaHQyIiwgRXYgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgfSwKLSAgLyogR1JQQU1EICovCi0gIHsKLSAgICB7ICJwcmVmZXRjaCIsIEViIH0sCi0gICAgeyAicHJlZmV0Y2h3IiwgRWIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgfQotCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRpczM4NiBwcmVmaXhfdXNlcl90YWJsZVtdWzJdID0gewotICAvKiBQUkVHUlAwICovCi0gIHsKLSAgICB7ICJhZGRwcyIsIFhNLCBFWCB9LAotICAgIHsgImFkZHNzIiwgWE0sIEVYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDEgKi8KLSAgewotICAgIHsgIiIsIFhNLCBFWCwgT1BTSU1EIH0sCS8qIFNlZSBPUF9TSU1EX1NVRkZJWCAqLwotICAgIHsgIiIsIFhNLCBFWCwgT1BTSU1EIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDIgKi8KLSAgewotICAgIHsgImN2dHBpMnBzIiwgWE0sIEVNIH0sCi0gICAgeyAiY3Z0c2kyc3MiLCBYTSwgRXYgfSwKLSAgfSwKLSAgLyogUFJFR1JQMyAqLwotICB7Ci0gICAgeyAiY3Z0cHMycGkiLCBNWCwgRVggfSwKLSAgICB7ICJjdnRzczJzaSIsIEd2LCBFWCB9LAotICB9LAotICAvKiBQUkVHUlA0ICovCi0gIHsKLSAgICB7ICJjdnR0cHMycGkiLCBNWCwgRVggfSwKLSAgICB7ICJjdnR0c3Myc2kiLCBHdiwgRVggfSwKLSAgfSwKLSAgLyogUFJFR1JQNSAqLwotICB7Ci0gICAgeyAiZGl2cHMiLCBYTSwgRVggfSwKLSAgICB7ICJkaXZzcyIsIFhNLCBFWCB9LAotICB9LAotICAvKiBQUkVHUlA2ICovCi0gIHsKLSAgICB7ICJtYXhwcyIsIFhNLCBFWCB9LAotICAgIHsgIm1heHNzIiwgWE0sIEVYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDcgKi8KLSAgewotICAgIHsgIm1pbnBzIiwgWE0sIEVYIH0sCi0gICAgeyAibWluc3MiLCBYTSwgRVggfSwKLSAgfSwKLSAgLyogUFJFR1JQOCAqLwotICB7Ci0gICAgeyAibW92dXBzIiwgWE0sIEVYIH0sCi0gICAgeyAibW92c3MiLCBYTSwgRVggfSwKLSAgfSwKLSAgLyogUFJFR1JQOSAqLwotICB7Ci0gICAgeyAibW92dXBzIiwgRVgsIFhNIH0sCi0gICAgeyAibW92c3MiLCBFWCwgWE0gfSwKLSAgfSwKLSAgLyogUFJFR1JQMTAgKi8KLSAgewotICAgIHsgIm11bHBzIiwgWE0sIEVYIH0sCi0gICAgeyAibXVsc3MiLCBYTSwgRVggfSwKLSAgfSwKLSAgLyogUFJFR1JQMTEgKi8KLSAgewotICAgIHsgInJjcHBzIiwgWE0sIEVYIH0sCi0gICAgeyAicmNwc3MiLCBYTSwgRVggfSwKLSAgfSwKLSAgLyogUFJFR1JQMTIgKi8KLSAgewotICAgIHsgInJzcXJ0cHMiLCBYTSwgRVggfSwKLSAgICB7ICJyc3FydHNzIiwgWE0sIEVYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDEzICovCi0gIHsKLSAgICB7ICJzcXJ0cHMiLCBYTSwgRVggfSwKLSAgICB7ICJzcXJ0c3MiLCBYTSwgRVggfSwKLSAgfSwKLSAgLyogUFJFR1JQMTQgKi8KLSAgewotICAgIHsgInN1YnBzIiwgWE0sIEVYIH0sCi0gICAgeyAic3Vic3MiLCBYTSwgRVggfSwKLSAgfQotfTsKLQotI2RlZmluZSBJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IgXygiPGludGVybmFsIGRpc2Fzc2VtYmxlciBlcnJvcj4iKQotCi0jZGVmaW5lIFBSRUZJWF9SRVBaIDEKLSNkZWZpbmUgUFJFRklYX1JFUE5aIDIKLSNkZWZpbmUgUFJFRklYX0xPQ0sgNAotI2RlZmluZSBQUkVGSVhfQ1MgOAotI2RlZmluZSBQUkVGSVhfU1MgMHgxMAotI2RlZmluZSBQUkVGSVhfRFMgMHgyMAotI2RlZmluZSBQUkVGSVhfRVMgMHg0MAotI2RlZmluZSBQUkVGSVhfRlMgMHg4MAotI2RlZmluZSBQUkVGSVhfR1MgMHgxMDAKLSNkZWZpbmUgUFJFRklYX0RBVEEgMHgyMDAKLSNkZWZpbmUgUFJFRklYX0FERFIgMHg0MDAKLSNkZWZpbmUgUFJFRklYX0ZXQUlUIDB4ODAwCi0KLXN0YXRpYyBpbnQgcHJlZml4ZXM7Ci0KLXN0YXRpYyB2b2lkCi1ja3ByZWZpeCAoKQotewotICBwcmVmaXhlcyA9IDA7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAgICAgc3dpdGNoICgqY29kZXApCi0JewotCWNhc2UgMHhmMzoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9SRVBaOwotCSAgYnJlYWs7Ci0JY2FzZSAweGYyOgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX1JFUE5aOwotCSAgYnJlYWs7Ci0JY2FzZSAweGYwOgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX0xPQ0s7Ci0JICBicmVhazsKLQljYXNlIDB4MmU6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfQ1M7Ci0JICBicmVhazsKLQljYXNlIDB4MzY6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfU1M7Ci0JICBicmVhazsKLQljYXNlIDB4M2U6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfRFM7Ci0JICBicmVhazsKLQljYXNlIDB4MjY6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfRVM7Ci0JICBicmVhazsKLQljYXNlIDB4NjQ6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfRlM7Ci0JICBicmVhazsKLQljYXNlIDB4NjU6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfR1M7Ci0JICBicmVhazsKLQljYXNlIDB4NjY6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfREFUQTsKLQkgIGJyZWFrOwotCWNhc2UgMHg2NzoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9BRERSOwotCSAgYnJlYWs7Ci0JY2FzZSAweDliOgotCSAgLyogZndhaXQgaXMgcmVhbGx5IGFuIGluc3RydWN0aW9uLiAgSWYgdGhlcmUgYXJlIHByZWZpeGVzCi0JICAgICBiZWZvcmUgdGhlIGZ3YWl0LCB0aGV5IGJlbG9uZyB0byB0aGUgZndhaXQsICpub3QqIHRvIHRoZQotCSAgICAgZm9sbG93aW5nIGluc3RydWN0aW9uLiAgKi8KLQkgIGlmIChwcmVmaXhlcykKLQkgICAgewotCSAgICAgIHByZWZpeGVzIHw9IFBSRUZJWF9GV0FJVDsKLQkgICAgICBjb2RlcCsrOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgcHJlZml4ZXMgPSBQUkVGSVhfRldBSVQ7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcmV0dXJuOwotCX0KLSAgICAgIGNvZGVwKys7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciBvcDFvdXRbMTAwXSwgb3Ayb3V0WzEwMF0sIG9wM291dFsxMDBdOwotc3RhdGljIGludCBvcF9hZCwgb3BfaW5kZXhbM107Ci1zdGF0aWMgdW5zaWduZWQgaW50IG9wX2FkZHJlc3NbM107Ci1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0X3BjOwotCi0MCi0vKgotICogICBPbiB0aGUgMzg2J3Mgb2YgMTk4OCwgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uIGlzIDE1IGJ5dGVzLgotICogICAoc2VlIHRvcGljICJSZWR1bmRhbnQgcHJlZml4ZXMiIGluIHRoZSAiRGlmZmVyZW5jZXMgZnJvbSA4MDg2IgotICogICBzZWN0aW9uIG9mIHRoZSAiVmlydHVhbCA4MDg2IE1vZGUiIGNoYXB0ZXIuKQotICogJ3BjJyBzaG91bGQgYmUgdGhlIGFkZHJlc3Mgb2YgdGhpcyBpbnN0cnVjdGlvbiwgaXQgd2lsbAotICogICBiZSB1c2VkIHRvIHByaW50IHRoZSB0YXJnZXQgYWRkcmVzcyBpZiB0aGlzIGlzIGEgcmVsYXRpdmUganVtcCBvciBjYWxsCi0gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoaXMgaW5zdHJ1Y3Rpb24gaW4gYnl0ZXMuCi0gKi8KLQotc3RhdGljIGludCBwcmludF9pbnNuX2kzODYKLSAgUEFSQU1TICgoYmZkX3ZtYSBwYywgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykpOwotCi1zdGF0aWMgY2hhciBpbnRlbF9zeW50YXg7Ci1zdGF0aWMgY2hhciBvcGVuX2NoYXI7Ci1zdGF0aWMgY2hhciBjbG9zZV9jaGFyOwotc3RhdGljIGNoYXIgc2VwYXJhdG9yX2NoYXI7Ci1zdGF0aWMgY2hhciBzY2FsZV9jaGFyOwotCi1pbnQKLXByaW50X2luc25faTM4Nl9hdHQgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnRlbF9zeW50YXggPSAwOwotICBvcGVuX2NoYXIgPSAnKCc7Ci0gIGNsb3NlX2NoYXIgPSAgJyknOwotICBzZXBhcmF0b3JfY2hhciA9ICcsJzsKLSAgc2NhbGVfY2hhciA9ICcsJzsKLQotICByZXR1cm4gcHJpbnRfaW5zbl9pMzg2IChwYywgaW5mbyk7Ci19Ci0KLWludAotcHJpbnRfaW5zbl9pMzg2X2ludGVsIChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50ZWxfc3ludGF4ID0gMTsKLSAgb3Blbl9jaGFyID0gJ1snOwotICBjbG9zZV9jaGFyID0gJ10nOwotICBzZXBhcmF0b3JfY2hhciA9ICcrJzsKLSAgc2NhbGVfY2hhciA9ICcqJzsKLQotICByZXR1cm4gcHJpbnRfaW5zbl9pMzg2IChwYywgaW5mbyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaW50X2luc25faTM4NiAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGNvbnN0IHN0cnVjdCBkaXMzODYgKmRwOwotICBpbnQgaTsKLSAgaW50IHR3b19zb3VyY2Vfb3BzOwotICBjaGFyICpmaXJzdCwgKnNlY29uZCwgKnRoaXJkOwotICBpbnQgbmVlZGNvbW1hOwotICB1bnNpZ25lZCBjaGFyIG5lZWRfbW9kcm07Ci0gIHVuc2lnbmVkIGNoYXIgdXNlc19mM19wcmVmaXg7Ci0gIGludCBzaXplZmxhZzsKLQotICBzdHJ1Y3QgZGlzX3ByaXZhdGUgcHJpdjsKLSAgYmZkX2J5dGUgKmluYnVmID0gcHJpdi50aGVfYnVmZmVyOwotCi0gIGlmIChpbmZvLT5tYWNoID09IGJmZF9tYWNoX2kzODZfaTM4NgotICAgICAgfHwgaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4KQotICAgIHNpemVmbGFnID0gQUZMQUd8REZMQUc7Ci0gIGVsc2UgaWYgKGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaTM4Nl9pODA4NikKLSAgICBzaXplZmxhZyA9IDA7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLQotICAvKiBUaGUgb3V0cHV0IGxvb2tzIGJldHRlciBpZiB3ZSBwdXQgNiBieXRlcyBvbiBhIGxpbmUsIHNpbmNlIHRoYXQKLSAgICAgcHV0cyBtb3N0IGxvbmcgd29yZCBpbnN0cnVjdGlvbnMgb24gYSBzaW5nbGUgbGluZS4gICovCi0gIGluZm8tPmJ5dGVzX3Blcl9saW5lID0gNjsKLQotICBpbmZvLT5wcml2YXRlX2RhdGEgPSAoUFRSKSAmcHJpdjsKLSAgcHJpdi5tYXhfZmV0Y2hlZCA9IHByaXYudGhlX2J1ZmZlcjsKLSAgcHJpdi5pbnNuX3N0YXJ0ID0gcGM7Ci0gIGlmIChzZXRqbXAgKHByaXYuYmFpbG91dCkgIT0gMCkKLSAgICAvKiBFcnJvciByZXR1cm4uICAqLwotICAgIHJldHVybiAtMTsKLQotICBvYnVmWzBdID0gMDsKLSAgb3Axb3V0WzBdID0gMDsKLSAgb3Ayb3V0WzBdID0gMDsKLSAgb3Azb3V0WzBdID0gMDsKLQotICBvcF9pbmRleFswXSA9IG9wX2luZGV4WzFdID0gb3BfaW5kZXhbMl0gPSAtMTsKLQotICB0aGVfaW5mbyA9IGluZm87Ci0gIHN0YXJ0X3BjID0gcGM7Ci0gIHN0YXJ0X2NvZGVwID0gaW5idWY7Ci0gIGNvZGVwID0gaW5idWY7Ci0KLSAgY2twcmVmaXggKCk7Ci0KLSAgaW5zbl9jb2RlcCA9IGNvZGVwOwotCi0gIEZFVENIX0RBVEEgKGluZm8sIGNvZGVwICsgMSk7Ci0gIHR3b19zb3VyY2Vfb3BzID0gKCpjb2RlcCA9PSAweDYyKSB8fCAoKmNvZGVwID09IDB4YzgpOwotCi0gIG9idWZwID0gb2J1ZjsKLQotICBpZiAoKHByZWZpeGVzICYgUFJFRklYX0ZXQUlUKQotICAgICAgJiYgKCgqY29kZXAgPCAweGQ4KSB8fCAoKmNvZGVwID4gMHhkZikpKQotICAgIHsKLSAgICAgIC8qIGZ3YWl0IG5vdCBmb2xsb3dlZCBieSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbi4gICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImZ3YWl0Iik7Ci0gICAgICAvKiBUaGVyZSBtYXkgYmUgb3RoZXIgcHJlZml4ZXMuICBTa2lwIGFueSBiZWZvcmUgdGhlIGZ3YWl0LiAgKi8KLSAgICAgIHJldHVybiBjb2RlcCAtIGluYnVmOwotICAgIH0KLQotICBpZiAoKmNvZGVwID09IDB4MGYpCi0gICAgewotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgY29kZXAgKyAyKTsKLSAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgIGRwID0gJmRpczM4Nl90d29ieXRlX2ludGVsWyorK2NvZGVwXTsKLSAgICAgIGVsc2UKLSAgICAgICAgZHAgPSAmZGlzMzg2X3R3b2J5dGVfYXR0WyorK2NvZGVwXTsKLSAgICAgIG5lZWRfbW9kcm0gPSB0d29ieXRlX2hhc19tb2RybVsqY29kZXBdOwotICAgICAgdXNlc19mM19wcmVmaXggPSB0d29ieXRlX3VzZXNfZjNfcHJlZml4Wypjb2RlcF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgZHAgPSAmZGlzMzg2X2ludGVsWypjb2RlcF07Ci0gICAgICBlbHNlCi0gICAgICAgIGRwID0gJmRpczM4Nl9hdHRbKmNvZGVwXTsKLSAgICAgIG5lZWRfbW9kcm0gPSBvbmVieXRlX2hhc19tb2RybVsqY29kZXBdOwotICAgICAgdXNlc19mM19wcmVmaXggPSAwOwotICAgIH0KLSAgY29kZXArKzsKLQotICBpZiAoIXVzZXNfZjNfcHJlZml4ICYmIChwcmVmaXhlcyAmIFBSRUZJWF9SRVBaKSkKLSAgICBvYXBwZW5kICgicmVweiAiKTsKLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX1JFUE5aKQotICAgIG9hcHBlbmQgKCJyZXBueiAiKTsKLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0xPQ0spCi0gICAgb2FwcGVuZCAoImxvY2sgIik7Ci0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0RBVEEpCi0gICAgc2l6ZWZsYWcgXj0gREZMQUc7Ci0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0FERFIpCi0gICAgewotICAgICAgc2l6ZWZsYWcgXj0gQUZMQUc7Ci0gICAgICBpZiAoc2l6ZWZsYWcgJiBBRkxBRykKLSAgICAgICAgb2FwcGVuZCAoImFkZHIzMiAiKTsKLSAgICAgIGVsc2UKLQlvYXBwZW5kICgiYWRkcjE2ICIpOwotICAgIH0KLQotICBpZiAobmVlZF9tb2RybSkKLSAgICB7Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBjb2RlcCArIDEpOwotICAgICAgbW9kID0gKCpjb2RlcCA+PiA2KSAmIDM7Ci0gICAgICByZWcgPSAoKmNvZGVwID4+IDMpICYgNzsKLSAgICAgIHJtID0gKmNvZGVwICYgNzsKLSAgICB9Ci0KLSAgaWYgKGRwLT5uYW1lID09IE5VTEwgJiYgZHAtPmJ5dGVtb2RlMSA9PSBGTE9BVENPREUpCi0gICAgewotICAgICAgZG9mbG9hdCAoc2l6ZWZsYWcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChkcC0+bmFtZSA9PSBOVUxMKQotCXsKLQkgIHN3aXRjaChkcC0+Ynl0ZW1vZGUyKQotCSAgICB7Ci0JICAgICAgY2FzZSBVU0VfR1JPVVBTOgotCSAgICAgICAgZHAgPSAmZ3Jwc1tkcC0+Ynl0ZW1vZGUxXVtyZWddOwotCQlicmVhazsKLQkgICAgICBjYXNlIFVTRV9QUkVGSVhfVVNFUl9UQUJMRToKLQkJZHAgPSAmcHJlZml4X3VzZXJfdGFibGVbZHAtPmJ5dGVtb2RlMV1bcHJlZml4ZXMgJiBQUkVGSVhfUkVQWiA/IDEgOiAwXTsKLQkJYnJlYWs7Ci0JICAgICAgZGVmYXVsdDoKLQkJb2FwcGVuZCAoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHB1dG9wIChkcC0+bmFtZSwgc2l6ZWZsYWcpOwotCi0gICAgICBvYnVmcCA9IG9wMW91dDsKLSAgICAgIG9wX2FkID0gMjsKLSAgICAgIGlmIChkcC0+b3AxKQotCSgqZHAtPm9wMSkoZHAtPmJ5dGVtb2RlMSwgc2l6ZWZsYWcpOwotCi0gICAgICBvYnVmcCA9IG9wMm91dDsKLSAgICAgIG9wX2FkID0gMTsKLSAgICAgIGlmIChkcC0+b3AyKQotCSgqZHAtPm9wMikoZHAtPmJ5dGVtb2RlMiwgc2l6ZWZsYWcpOwotCi0gICAgICBvYnVmcCA9IG9wM291dDsKLSAgICAgIG9wX2FkID0gMDsKLSAgICAgIGlmIChkcC0+b3AzKQotCSgqZHAtPm9wMykoZHAtPmJ5dGVtb2RlMywgc2l6ZWZsYWcpOwotICAgIH0KLQotICBvYnVmcCA9IG9idWYgKyBzdHJsZW4gKG9idWYpOwotICBmb3IgKGkgPSBzdHJsZW4gKG9idWYpOyBpIDwgNjsgaSsrKQotICAgIG9hcHBlbmQgKCIgIik7Ci0gIG9hcHBlbmQgKCIgIik7Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBvYnVmKTsKLQotICAvKiBUaGUgZW50ZXIgYW5kIGJvdW5kIGluc3RydWN0aW9ucyBhcmUgcHJpbnRlZCB3aXRoIG9wZXJhbmRzIGluIHRoZSBzYW1lCi0gICAgIG9yZGVyIGFzIHRoZSBpbnRlbCBib29rOyBldmVyeXRoaW5nIGVsc2UgaXMgcHJpbnRlZCBpbiByZXZlcnNlIG9yZGVyLiAgKi8KLSAgaWYgKGludGVsX3N5bnRheCB8fCB0d29fc291cmNlX29wcykKLSAgICB7Ci0gICAgICBmaXJzdCA9IG9wMW91dDsKLSAgICAgIHNlY29uZCA9IG9wMm91dDsKLSAgICAgIHRoaXJkID0gb3Azb3V0OwotICAgICAgb3BfYWQgPSBvcF9pbmRleFswXTsKLSAgICAgIG9wX2luZGV4WzBdID0gb3BfaW5kZXhbMl07Ci0gICAgICBvcF9pbmRleFsyXSA9IG9wX2FkOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZpcnN0ID0gb3Azb3V0OwotICAgICAgc2Vjb25kID0gb3Ayb3V0OwotICAgICAgdGhpcmQgPSBvcDFvdXQ7Ci0gICAgfQotICBuZWVkY29tbWEgPSAwOwotICBpZiAoKmZpcnN0KQotICAgIHsKLSAgICAgIGlmIChvcF9pbmRleFswXSAhPSAtMSkKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChiZmRfdm1hKSBvcF9hZGRyZXNzW29wX2luZGV4WzBdXSwgaW5mbyk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGZpcnN0KTsKLSAgICAgIG5lZWRjb21tYSA9IDE7Ci0gICAgfQotICBpZiAoKnNlY29uZCkKLSAgICB7Ci0gICAgICBpZiAobmVlZGNvbW1hKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotICAgICAgaWYgKG9wX2luZGV4WzFdICE9IC0xKQotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGJmZF92bWEpIG9wX2FkZHJlc3Nbb3BfaW5kZXhbMV1dLCBpbmZvKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgc2Vjb25kKTsKLSAgICAgIG5lZWRjb21tYSA9IDE7Ci0gICAgfQotICBpZiAoKnRoaXJkKQotICAgIHsKLSAgICAgIGlmIChuZWVkY29tbWEpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0gICAgICBpZiAob3BfaW5kZXhbMl0gIT0gLTEpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgoYmZkX3ZtYSkgb3BfYWRkcmVzc1tvcF9pbmRleFsyXV0sIGluZm8pOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCB0aGlyZCk7Ci0gICAgfQotICByZXR1cm4gY29kZXAgLSBpbmJ1ZjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmZsb2F0X21lbV9hdHRbXSA9IHsKLSAgLyogZDggKi8KLSAgImZhZGRzIiwKLSAgImZtdWxzIiwKLSAgImZjb21zIiwKLSAgImZjb21wcyIsCi0gICJmc3VicyIsCi0gICJmc3VicnMiLAotICAiZmRpdnMiLAotICAiZmRpdnJzIiwKLSAgLyogIGQ5ICovCi0gICJmbGRzIiwKLSAgIihiYWQpIiwKLSAgImZzdHMiLAotICAiZnN0cHMiLAotICAiZmxkZW52IiwKLSAgImZsZGN3IiwKLSAgImZOc3RlbnYiLAotICAiZk5zdGN3IiwKLSAgLyogZGEgKi8KLSAgImZpYWRkbCIsCi0gICJmaW11bGwiLAotICAiZmljb21sIiwKLSAgImZpY29tcGwiLAotICAiZmlzdWJsIiwKLSAgImZpc3VicmwiLAotICAiZmlkaXZsIiwKLSAgImZpZGl2cmwiLAotICAvKiBkYiAqLwotICAiZmlsZGwiLAotICAiKGJhZCkiLAotICAiZmlzdGwiLAotICAiZmlzdHBsIiwKLSAgIihiYWQpIiwKLSAgImZsZHQiLAotICAiKGJhZCkiLAotICAiZnN0cHQiLAotICAvKiBkYyAqLwotICAiZmFkZGwiLAotICAiZm11bGwiLAotICAiZmNvbWwiLAotICAiZmNvbXBsIiwKLSAgImZzdWJsIiwKLSAgImZzdWJybCIsCi0gICJmZGl2bCIsCi0gICJmZGl2cmwiLAotICAvKiBkZCAqLwotICAiZmxkbCIsCi0gICIoYmFkKSIsCi0gICJmc3RsIiwKLSAgImZzdHBsIiwKLSAgImZyc3RvciIsCi0gICIoYmFkKSIsCi0gICJmTnNhdmUiLAotICAiZk5zdHN3IiwKLSAgLyogZGUgKi8KLSAgImZpYWRkIiwKLSAgImZpbXVsIiwKLSAgImZpY29tIiwKLSAgImZpY29tcCIsCi0gICJmaXN1YiIsCi0gICJmaXN1YnIiLAotICAiZmlkaXYiLAotICAiZmlkaXZyIiwKLSAgLyogZGYgKi8KLSAgImZpbGQiLAotICAiKGJhZCkiLAotICAiZmlzdCIsCi0gICJmaXN0cCIsCi0gICJmYmxkIiwKLSAgImZpbGRsbCIsCi0gICJmYnN0cCIsCi0gICJmaXN0cGxsIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpmbG9hdF9tZW1faW50ZWxbXSA9IHsKLSAgLyogZDggKi8KLSAgImZhZGQiLAotICAiZm11bCIsCi0gICJmY29tIiwKLSAgImZjb21wIiwKLSAgImZzdWIiLAotICAiZnN1YnIiLAotICAiZmRpdiIsCi0gICJmZGl2ciIsCi0gIC8qICBkOSAqLwotICAiZmxkIiwKLSAgIihiYWQpIiwKLSAgImZzdCIsCi0gICJmc3RwIiwKLSAgImZsZGVudiIsCi0gICJmbGRjdyIsCi0gICJmTnN0ZW52IiwKLSAgImZOc3RjdyIsCi0gIC8qIGRhICovCi0gICJmaWFkZCIsCi0gICJmaW11bCIsCi0gICJmaWNvbSIsCi0gICJmaWNvbXAiLAotICAiZmlzdWIiLAotICAiZmlzdWJyIiwKLSAgImZpZGl2IiwKLSAgImZpZGl2ciIsCi0gIC8qIGRiICovCi0gICJmaWxkIiwKLSAgIihiYWQpIiwKLSAgImZpc3QiLAotICAiZmlzdHAiLAotICAiKGJhZCkiLAotICAiZmxkIiwKLSAgIihiYWQpIiwKLSAgImZzdHAiLAotICAvKiBkYyAqLwotICAiZmFkZCIsCi0gICJmbXVsIiwKLSAgImZjb20iLAotICAiZmNvbXAiLAotICAiZnN1YiIsCi0gICJmc3ViciIsCi0gICJmZGl2IiwKLSAgImZkaXZyIiwKLSAgLyogZGQgKi8KLSAgImZsZCIsCi0gICIoYmFkKSIsCi0gICJmc3QiLAotICAiZnN0cCIsCi0gICJmcnN0b3IiLAotICAiKGJhZCkiLAotICAiZk5zYXZlIiwKLSAgImZOc3RzdyIsCi0gIC8qIGRlICovCi0gICJmaWFkZCIsCi0gICJmaW11bCIsCi0gICJmaWNvbSIsCi0gICJmaWNvbXAiLAotICAiZmlzdWIiLAotICAiZmlzdWJyIiwKLSAgImZpZGl2IiwKLSAgImZpZGl2ciIsCi0gIC8qIGRmICovCi0gICJmaWxkIiwKLSAgIihiYWQpIiwKLSAgImZpc3QiLAotICAiZmlzdHAiLAotICAiZmJsZCIsCi0gICJmaWxkIiwKLSAgImZic3RwIiwKLSAgImZpc3RwbGwiLAotfTsKLQotI2RlZmluZSBTVCBPUF9TVCwgMAotI2RlZmluZSBTVGkgT1BfU1RpLCAwCi0KLSNkZWZpbmUgRkdSUGQ5XzIgTlVMTCwgTlVMTCwgMAotI2RlZmluZSBGR1JQZDlfNCBOVUxMLCBOVUxMLCAxCi0jZGVmaW5lIEZHUlBkOV81IE5VTEwsIE5VTEwsIDIKLSNkZWZpbmUgRkdSUGQ5XzYgTlVMTCwgTlVMTCwgMwotI2RlZmluZSBGR1JQZDlfNyBOVUxMLCBOVUxMLCA0Ci0jZGVmaW5lIEZHUlBkYV81IE5VTEwsIE5VTEwsIDUKLSNkZWZpbmUgRkdSUGRiXzQgTlVMTCwgTlVMTCwgNgotI2RlZmluZSBGR1JQZGVfMyBOVUxMLCBOVUxMLCA3Ci0jZGVmaW5lIEZHUlBkZl80IE5VTEwsIE5VTEwsIDgKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZmxvYXRfcmVnW11bOF0gPSB7Ci0gIC8qIGQ4ICovCi0gIHsKLSAgICB7ICJmYWRkIiwJU1QsIFNUaSB9LAotICAgIHsgImZtdWwiLAlTVCwgU1RpIH0sCi0gICAgeyAiZmNvbSIsCVNUaSB9LAotICAgIHsgImZjb21wIiwJU1RpIH0sCi0gICAgeyAiZnN1YiIsCVNULCBTVGkgfSwKLSAgICB7ICJmc3ViciIsCVNULCBTVGkgfSwKLSAgICB7ICJmZGl2IiwJU1QsIFNUaSB9LAotICAgIHsgImZkaXZyIiwJU1QsIFNUaSB9LAotICB9LAotICAvKiBkOSAqLwotICB7Ci0gICAgeyAiZmxkIiwJU1RpIH0sCi0gICAgeyAiZnhjaCIsCVNUaSB9LAotICAgIHsgRkdSUGQ5XzIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7IEZHUlBkOV80IH0sCi0gICAgeyBGR1JQZDlfNSB9LAotICAgIHsgRkdSUGQ5XzYgfSwKLSAgICB7IEZHUlBkOV83IH0sCi0gIH0sCi0gIC8qIGRhICovCi0gIHsKLSAgICB7ICJmY21vdmIiLAlTVCwgU1RpIH0sCi0gICAgeyAiZmNtb3ZlIiwJU1QsIFNUaSB9LAotICAgIHsgImZjbW92YmUiLFNULCBTVGkgfSwKLSAgICB7ICJmY21vdnUiLAlTVCwgU1RpIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyBGR1JQZGFfNSB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICB9LAotICAvKiBkYiAqLwotICB7Ci0gICAgeyAiZmNtb3ZuYiIsU1QsIFNUaSB9LAotICAgIHsgImZjbW92bmUiLFNULCBTVGkgfSwKLSAgICB7ICJmY21vdm5iZSIsU1QsIFNUaSB9LAotICAgIHsgImZjbW92bnUiLFNULCBTVGkgfSwKLSAgICB7IEZHUlBkYl80IH0sCi0gICAgeyAiZnVjb21pIiwJU1QsIFNUaSB9LAotICAgIHsgImZjb21pIiwJU1QsIFNUaSB9LAotICAgIHsgIihiYWQpIiB9LAotICB9LAotICAvKiBkYyAqLwotICB7Ci0gICAgeyAiZmFkZCIsCVNUaSwgU1QgfSwKLSAgICB7ICJmbXVsIiwJU1RpLCBTVCB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotI2lmIFVOSVhXQVJFX0NPTVBBVAotICAgIHsgImZzdWIiLAlTVGksIFNUIH0sCi0gICAgeyAiZnN1YnIiLAlTVGksIFNUIH0sCi0gICAgeyAiZmRpdiIsCVNUaSwgU1QgfSwKLSAgICB7ICJmZGl2ciIsCVNUaSwgU1QgfSwKLSNlbHNlCi0gICAgeyAiZnN1YnIiLAlTVGksIFNUIH0sCi0gICAgeyAiZnN1YiIsCVNUaSwgU1QgfSwKLSAgICB7ICJmZGl2ciIsCVNUaSwgU1QgfSwKLSAgICB7ICJmZGl2IiwJU1RpLCBTVCB9LAotI2VuZGlmCi0gIH0sCi0gIC8qIGRkICovCi0gIHsKLSAgICB7ICJmZnJlZSIsCVNUaSB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgImZzdCIsCVNUaSB9LAotICAgIHsgImZzdHAiLAlTVGkgfSwKLSAgICB7ICJmdWNvbSIsCVNUaSB9LAotICAgIHsgImZ1Y29tcCIsCVNUaSB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICB9LAotICAvKiBkZSAqLwotICB7Ci0gICAgeyAiZmFkZHAiLAlTVGksIFNUIH0sCi0gICAgeyAiZm11bHAiLAlTVGksIFNUIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyBGR1JQZGVfMyB9LAotI2lmIFVOSVhXQVJFX0NPTVBBVAotICAgIHsgImZzdWJwIiwJU1RpLCBTVCB9LAotICAgIHsgImZzdWJycCIsCVNUaSwgU1QgfSwKLSAgICB7ICJmZGl2cCIsCVNUaSwgU1QgfSwKLSAgICB7ICJmZGl2cnAiLAlTVGksIFNUIH0sCi0jZWxzZQotICAgIHsgImZzdWJycCIsCVNUaSwgU1QgfSwKLSAgICB7ICJmc3VicCIsCVNUaSwgU1QgfSwKLSAgICB7ICJmZGl2cnAiLAlTVGksIFNUIH0sCi0gICAgeyAiZmRpdnAiLAlTVGksIFNUIH0sCi0jZW5kaWYKLSAgfSwKLSAgLyogZGYgKi8KLSAgewotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgRkdSUGRmXzQgfSwKLSAgICB7ICJmdWNvbWlwIixTVCwgU1RpIH0sCi0gICAgeyAiZmNvbWlwIiwgU1QsIFNUaSB9LAotICAgIHsgIihiYWQpIiB9LAotICB9LAotfTsKLQotCi1zdGF0aWMgY2hhciAqZmdycHNbXVs4XSA9IHsKLSAgLyogZDlfMiAgMCAqLwotICB7Ci0gICAgImZub3AiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsCi0gIH0sCi0KLSAgLyogZDlfNCAgMSAqLwotICB7Ci0gICAgImZjaHMiLCJmYWJzIiwiKGJhZCkiLCIoYmFkKSIsImZ0c3QiLCJmeGFtIiwiKGJhZCkiLCIoYmFkKSIsCi0gIH0sCi0KLSAgLyogZDlfNSAgMiAqLwotICB7Ci0gICAgImZsZDEiLCJmbGRsMnQiLCJmbGRsMmUiLCJmbGRwaSIsImZsZGxnMiIsImZsZGxuMiIsImZsZHoiLCIoYmFkKSIsCi0gIH0sCi0KLSAgLyogZDlfNiAgMyAqLwotICB7Ci0gICAgImYyeG0xIiwiZnlsMngiLCJmcHRhbiIsImZwYXRhbiIsImZ4dHJhY3QiLCJmcHJlbTEiLCJmZGVjc3RwIiwiZmluY3N0cCIsCi0gIH0sCi0KLSAgLyogZDlfNyAgNCAqLwotICB7Ci0gICAgImZwcmVtIiwiZnlsMnhwMSIsImZzcXJ0IiwiZnNpbmNvcyIsImZybmRpbnQiLCJmc2NhbGUiLCJmc2luIiwiZmNvcyIsCi0gIH0sCi0KLSAgLyogZGFfNSAgNSAqLwotICB7Ci0gICAgIihiYWQpIiwiZnVjb21wcCIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsCi0gIH0sCi0KLSAgLyogZGJfNCAgNiAqLwotICB7Ci0gICAgImZlbmkoMjg3IG9ubHkpIiwiZmRpc2koMjg3IG9ubHkpIiwiZk5jbGV4IiwiZk5pbml0IiwKLSAgICAiZk5zZXRwbSgyODcgb25seSkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLAotICB9LAotCi0gIC8qIGRlXzMgIDcgKi8KLSAgewotICAgICIoYmFkKSIsImZjb21wcCIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsCi0gIH0sCi0KLSAgLyogZGZfNCAgOCAqLwotICB7Ci0gICAgImZOc3RzdyIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKLSAgfSwKLX07Ci0KLXN0YXRpYyB2b2lkCi1kb2Zsb2F0IChzaXplZmxhZykKLSAgICAgaW50IHNpemVmbGFnOwotewotICBjb25zdCBzdHJ1Y3QgZGlzMzg2ICpkcDsKLSAgdW5zaWduZWQgY2hhciBmbG9hdG9wOwotCi0gIGZsb2F0b3AgPSBjb2RlcFstMV07Ci0KLSAgaWYgKG1vZCAhPSAzKQotICAgIHsKLSAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgIHB1dG9wIChmbG9hdF9tZW1faW50ZWxbKGZsb2F0b3AgLSAweGQ4ICkgKiA4ICsgcmVnXSwgc2l6ZWZsYWcpOwotICAgICAgZWxzZQotICAgICAgICBwdXRvcCAoZmxvYXRfbWVtX2F0dFsoZmxvYXRvcCAtIDB4ZDggKSAqIDggKyByZWddLCBzaXplZmxhZyk7Ci0gICAgICBvYnVmcCA9IG9wMW91dDsKLSAgICAgIGlmIChmbG9hdG9wID09IDB4ZGIpCi0gICAgICAgIE9QX0UgKHhfbW9kZSwgc2l6ZWZsYWcpOwotICAgICAgZWxzZSBpZiAoZmxvYXRvcCA9PSAweGRkKQotICAgICAgICBPUF9FIChkX21vZGUsIHNpemVmbGFnKTsKLSAgICAgIGVsc2UKLSAgICAgICAgT1BfRSAodl9tb2RlLCBzaXplZmxhZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBjb2RlcCsrOwotCi0gIGRwID0gJmZsb2F0X3JlZ1tmbG9hdG9wIC0gMHhkOF1bcmVnXTsKLSAgaWYgKGRwLT5uYW1lID09IE5VTEwpCi0gICAgewotICAgICAgcHV0b3AgKGZncnBzW2RwLT5ieXRlbW9kZTFdW3JtXSwgc2l6ZWZsYWcpOwotCi0gICAgICAvKiBpbnN0cnVjdGlvbiBmbnN0c3cgaXMgb25seSBvbmUgd2l0aCBzdHJhbmdlIGFyZyAqLwotICAgICAgaWYgKGZsb2F0b3AgPT0gMHhkZiAmJiBjb2RlcFstMV0gPT0gMHhlMCkKLQlzdHJjcHkgKG9wMW91dCwgbmFtZXMxNlswXSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHV0b3AgKGRwLT5uYW1lLCBzaXplZmxhZyk7Ci0KLSAgICAgIG9idWZwID0gb3Axb3V0OwotICAgICAgaWYgKGRwLT5vcDEpCi0JKCpkcC0+b3AxKShkcC0+Ynl0ZW1vZGUxLCBzaXplZmxhZyk7Ci0gICAgICBvYnVmcCA9IG9wMm91dDsKLSAgICAgIGlmIChkcC0+b3AyKQotCSgqZHAtPm9wMikoZHAtPmJ5dGVtb2RlMiwgc2l6ZWZsYWcpOwotICAgIH0KLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1PUF9TVCAoaWdub3JlLCBzaXplZmxhZykKLSAgICAgaW50IGlnbm9yZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBvYXBwZW5kICgiJXN0Iik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfU1RpIChpZ25vcmUsIHNpemVmbGFnKQotICAgICBpbnQgaWdub3JlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJXN0KCVkKSIsIHJtKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLQotLyogY2FwaXRhbCBsZXR0ZXJzIGluIHRlbXBsYXRlIGFyZSBtYWNyb3MgKi8KLXN0YXRpYyB2b2lkCi1wdXRvcCAodGVtcGxhdGUsIHNpemVmbGFnKQotICAgICBjb25zdCBjaGFyICp0ZW1wbGF0ZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBjb25zdCBjaGFyICpwOwotCi0gIGZvciAocCA9IHRlbXBsYXRlOyAqcDsgcCsrKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKnApCi0JewotCWRlZmF1bHQ6Ci0JICAqb2J1ZnArKyA9ICpwOwotCSAgYnJlYWs7Ci0JY2FzZSAnQSc6Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIGJyZWFrOwotCSAgaWYgKG1vZCAhPSAzCi0jaWZkZWYgU1VGRklYX0FMV0FZUwotCSAgICAgIHx8IChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCi0jZW5kaWYKLQkgICAgICApCi0JICAgICpvYnVmcCsrID0gJ2InOwotCSAgYnJlYWs7Ci0JY2FzZSAnQic6Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgIGlmIChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCi0JICAgICpvYnVmcCsrID0gJ2InOwotI2VuZGlmCi0JICBicmVhazsKLQljYXNlICdFJzoJCS8qIEZvciBqY3h6L2plY3h6ICovCi0JICBpZiAoc2l6ZWZsYWcgJiBBRkxBRykKLQkgICAgKm9idWZwKysgPSAnZSc7Ci0JICBicmVhazsKLQljYXNlICdMJzoKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgU1VGRklYX0FMV0FZUwotCSAgaWYgKHNpemVmbGFnICYgU1VGRklYX0FMV0FZUykKLQkgICAgKm9idWZwKysgPSAnbCc7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCWNhc2UgJ04nOgotCSAgaWYgKChwcmVmaXhlcyAmIFBSRUZJWF9GV0FJVCkgPT0gMCkKLQkgICAgKm9idWZwKysgPSAnbic7Ci0JICBicmVhazsKLQljYXNlICdQJzoKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgYnJlYWs7Ci0JICBpZiAoKHByZWZpeGVzICYgUFJFRklYX0RBVEEpCi0jaWZkZWYgU1VGRklYX0FMV0FZUwotCSAgICAgIHx8IChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCi0jZW5kaWYKLQkgICAgICApCi0JICAgIHsKLQkgICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQkJKm9idWZwKysgPSAnbCc7Ci0JICAgICAgZWxzZQotCQkqb2J1ZnArKyA9ICd3JzsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAnUSc6Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIGJyZWFrOwotCSAgaWYgKG1vZCAhPSAzCi0jaWZkZWYgU1VGRklYX0FMV0FZUwotCSAgICAgIHx8IChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCi0jZW5kaWYKLQkgICAgICApCi0JICAgIHsKLQkgICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQkJKm9idWZwKysgPSAnbCc7Ci0JICAgICAgZWxzZQotCQkqb2J1ZnArKyA9ICd3JzsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAnUic6Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLQkgICAgewotCSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCQl7Ci0JCSAgKm9idWZwKysgPSAnZCc7Ci0JCSAgKm9idWZwKysgPSAncSc7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAqb2J1ZnArKyA9ICd3JzsKLQkJICAqb2J1ZnArKyA9ICdkJzsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQkJKm9idWZwKysgPSAnbCc7Ci0JICAgICAgZWxzZQotCQkqb2J1ZnArKyA9ICd3JzsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAnUyc6Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgIGlmIChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCi0JICAgIHsKLQkgICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQkJKm9idWZwKysgPSAnbCc7Ci0JICAgICAgZWxzZQotCQkqb2J1ZnArKyA9ICd3JzsKLQkgICAgfQotI2VuZGlmCi0JICBicmVhazsKLQljYXNlICdXJzoKLQkgIC8qIG9wZXJhbmQgc2l6ZSBmbGFnIGZvciBjd3RsLCBjYnR3ICovCi0JICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQkgICAgKm9idWZwKysgPSAndyc7Ci0JICBlbHNlCi0JICAgICpvYnVmcCsrID0gJ2InOwotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0JICAgIHsKLQkgICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQkJewotCQkgICpvYnVmcCsrID0gJ2QnOwotCQkgICpvYnVmcCsrID0gJ2UnOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgKm9idWZwKysgPSAndyc7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgKm9idWZwID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLW9hcHBlbmQgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIHN0cmNweSAob2J1ZnAsIHMpOwotICBvYnVmcCArPSBzdHJsZW4gKHMpOwotfQotCi1zdGF0aWMgdm9pZAotYXBwZW5kX3NlZyAoKQotewotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfQ1MpCi0gICAgb2FwcGVuZCAoIiVjczoiKTsKLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0RTKQotICAgIG9hcHBlbmQgKCIlZHM6Iik7Ci0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9TUykKLSAgICBvYXBwZW5kICgiJXNzOiIpOwotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfRVMpCi0gICAgb2FwcGVuZCAoIiVlczoiKTsKLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0ZTKQotICAgIG9hcHBlbmQgKCIlZnM6Iik7Ci0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9HUykKLSAgICBvYXBwZW5kICgiJWdzOiIpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfaW5kaXJFIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpZiAoIWludGVsX3N5bnRheCkKLSAgICBvYXBwZW5kICgiKiIpOwotICBPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfRSAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaW50IGRpc3A7Ci0KLSAgLyogc2tpcCBtb2Qvcm0gYnl0ZSAqLwotICBjb2RlcCsrOwotCi0gIGlmIChtb2QgPT0gMykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGJ5dGVtb2RlKQotCXsKLQljYXNlIGJfbW9kZToKLQkgIG9hcHBlbmQgKG5hbWVzOFtybV0pOwotCSAgYnJlYWs7Ci0JY2FzZSB3X21vZGU6Ci0JICBvYXBwZW5kIChuYW1lczE2W3JtXSk7Ci0JICBicmVhazsKLQljYXNlIGRfbW9kZToKLQkgIG9hcHBlbmQgKG5hbWVzMzJbcm1dKTsKLQkgIGJyZWFrOwotCWNhc2Ugdl9tb2RlOgotCSAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JICAgIG9hcHBlbmQgKG5hbWVzMzJbcm1dKTsKLQkgIGVsc2UKLQkgICAgb2FwcGVuZCAobmFtZXMxNltybV0pOwotCSAgYnJlYWs7Ci0JY2FzZSAwOgotCSAgaWYgKCAhKGNvZGVwWy0yXSA9PSAweEFFICYmIGNvZGVwWy0xXSA9PSAweEY4IC8qIHNmZW5jZSAqLykpCi0JICAgIEJhZE9wKCk7CS8qIGJhZCBzZmVuY2UsbGVhLGxkcyxsZXMsbGZzLGxncyxsc3MgbW9kcm0gKi8KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBvYXBwZW5kIChJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkaXNwID0gMDsKLSAgYXBwZW5kX3NlZyAoKTsKLQotICBpZiAoc2l6ZWZsYWcgJiBBRkxBRykgLyogMzIgYml0IGFkZHJlc3MgbW9kZSAqLwotICAgIHsKLSAgICAgIGludCBoYXZlc2liOwotICAgICAgaW50IGhhdmViYXNlOwotICAgICAgaW50IGJhc2U7Ci0gICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgaW50IHNjYWxlID0gMDsKLQotICAgICAgaGF2ZXNpYiA9IDA7Ci0gICAgICBoYXZlYmFzZSA9IDE7Ci0gICAgICBiYXNlID0gcm07Ci0KLSAgICAgIGlmIChiYXNlID09IDQpCi0JewotCSAgaGF2ZXNpYiA9IDE7Ci0JICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAxKTsKLQkgIHNjYWxlID0gKCpjb2RlcCA+PiA2KSAmIDM7Ci0JICBpbmRleCA9ICgqY29kZXAgPj4gMykgJiA3OwotCSAgYmFzZSA9ICpjb2RlcCAmIDc7Ci0JICBjb2RlcCsrOwotCX0KLQotICAgICAgc3dpdGNoIChtb2QpCi0JewotCWNhc2UgMDoKLQkgIGlmIChiYXNlID09IDUpCi0JICAgIHsKLQkgICAgICBoYXZlYmFzZSA9IDA7Ci0JICAgICAgZGlzcCA9IGdldDMyICgpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAxKTsKLQkgIGRpc3AgPSAqY29kZXArKzsKLQkgIGlmICgoZGlzcCAmIDB4ODApICE9IDApCi0JICAgIGRpc3AgLT0gMHgxMDA7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBkaXNwID0gZ2V0MzIgKCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICghaW50ZWxfc3ludGF4KQotICAgICAgICBpZiAobW9kICE9IDAgfHwgYmFzZSA9PSA1KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIweCV4IiwgZGlzcCk7Ci0gICAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgICAgICAgICB9Ci0KLSAgICAgIGlmIChoYXZlYmFzZSB8fCAoaGF2ZXNpYiAmJiAoaW5kZXggIT0gNCB8fCBzY2FsZSAhPSAwKSkpCi0JewotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHN3aXRjaCAoYnl0ZW1vZGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgYl9tb2RlOgotICAgICAgICAgICAgICAgICAgb2FwcGVuZCgiQllURSBQVFIgIik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIHdfbW9kZToKLSAgICAgICAgICAgICAgICAgIG9hcHBlbmQoIldPUkQgUFRSICIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSB2X21vZGU6Ci0gICAgICAgICAgICAgICAgICBvYXBwZW5kKCJEV09SRCBQVFIgIik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGRfbW9kZToKLSAgICAgICAgICAgICAgICAgIG9hcHBlbmQoIlFXT1JEIFBUUiAiKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgeF9tb2RlOgotICAgICAgICAgICAgICAgICAgb2FwcGVuZCgiWFdPUkQgUFRSICIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0JICAqb2J1ZnArKyA9IG9wZW5fY2hhcjsKLSAgICAgICAgICAqb2J1ZnAgPSAnXDAnOwotCSAgaWYgKGhhdmViYXNlKQotCSAgICBvYXBwZW5kIChuYW1lczMyW2Jhc2VdKTsKLQkgIGlmIChoYXZlc2liKQotCSAgICB7Ci0JICAgICAgaWYgKGluZGV4ICE9IDQpCi0JCXsKLSAgICAgICAgICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZWJhc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICpvYnVmcCsrID0gc2VwYXJhdG9yX2NoYXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiVzIiwgbmFtZXMzMltpbmRleF0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0JCSAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiLCVzIiwgbmFtZXMzMltpbmRleF0pOwotCQkgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotCQl9Ci0gICAgICAgICAgICAgIGlmICghaW50ZWxfc3ludGF4Ci0gICAgICAgICAgICAgICAgICB8fCAoaW50ZWxfc3ludGF4Ci0gICAgICAgICAgICAgICAgICAgICAgJiYgYnl0ZW1vZGUgIT0gYl9tb2RlCi0gICAgICAgICAgICAgICAgICAgICAgJiYgYnl0ZW1vZGUgIT0gd19tb2RlCi0gICAgICAgICAgICAgICAgICAgICAgJiYgYnl0ZW1vZGUgIT0gdl9tb2RlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAqb2J1ZnArKyA9IHNjYWxlX2NoYXI7Ci0gICAgICAgICAgICAgICAgICAqb2J1ZnAgPSAnXDAnOwotCSAgICAgICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJWQiLCAxIDw8IHNjYWxlKTsKLQkgICAgICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0gICAgICAgICAgICAgICAgfQotCSAgICB9Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIGlmIChtb2QgIT0gMCB8fCBiYXNlID09IDUpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBEb24ndCBwcmludCB6ZXJvIGRpc3BsYWNlbWVudHMgKi8KLSAgICAgICAgICAgICAgICBpZiAoZGlzcCA+IDApCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIrJWQiLCBkaXNwKTsKLSAgICAgICAgICAgICAgICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoZGlzcCA8IDApCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlZCIsIGRpc3ApOwotICAgICAgICAgICAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotCi0JICAqb2J1ZnArKyA9IGNsb3NlX2NoYXI7Ci0gICAgICAgICAgKm9idWZwID0gJ1wwJzsKLQl9Ci0gICAgICBlbHNlIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobW9kICE9IDAgfHwgYmFzZSA9PSA1KQotICAgICAgICAgICAgewotCSAgICAgIGlmIChwcmVmaXhlcyAmIChQUkVGSVhfQ1MgfCBQUkVGSVhfU1MgfCBQUkVGSVhfRFMKLQkJCSAgICAgIHwgUFJFRklYX0VTIHwgUFJFRklYX0ZTIHwgUFJFRklYX0dTKSkKLQkJOwotCSAgICAgIGVsc2UKLQkJewotCQkgIG9hcHBlbmQgKG5hbWVzX3NlZ1szXSk7Ci0JCSAgb2FwcGVuZCAoIjoiKTsKLQkJfQotICAgICAgICAgICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiMHgleCIsIGRpc3ApOwotICAgICAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgZWxzZQotICAgIHsgLyogMTYgYml0IGFkZHJlc3MgbW9kZSAqLwotICAgICAgc3dpdGNoIChtb2QpCi0JewotCWNhc2UgMDoKLQkgIGlmIChybSA9PSA2KQotCSAgICB7Ci0JICAgICAgZGlzcCA9IGdldDE2ICgpOwotCSAgICAgIGlmICgoZGlzcCAmIDB4ODAwMCkgIT0gMCkKLQkJZGlzcCAtPSAweDEwMDAwOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAxKTsKLQkgIGRpc3AgPSAqY29kZXArKzsKLQkgIGlmICgoZGlzcCAmIDB4ODApICE9IDApCi0JICAgIGRpc3AgLT0gMHgxMDA7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBkaXNwID0gZ2V0MTYgKCk7Ci0JICBpZiAoKGRpc3AgJiAweDgwMDApICE9IDApCi0JICAgIGRpc3AgLT0gMHgxMDAwMDsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKCFpbnRlbF9zeW50YXgpCi0gICAgICAgIGlmIChtb2QgIT0gMCB8fCBybSA9PSA2KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlZCIsIGRpc3ApOwotICAgICAgICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0gICAgICAgICAgfQotCi0gICAgICBpZiAobW9kICE9IDAgfHwgcm0gIT0gNikKLQl7Ci0JICAqb2J1ZnArKyA9IG9wZW5fY2hhcjsKLSAgICAgICAgICAqb2J1ZnAgPSAnXDAnOwotCSAgb2FwcGVuZCAoaW5kZXgxNltybV0pOwotICAgICAgICAgICpvYnVmcCsrID0gY2xvc2VfY2hhcjsKLSAgICAgICAgICAqb2J1ZnAgPSAnXDAnOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9HIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBzd2l0Y2ggKGJ5dGVtb2RlKQotICAgIHsKLSAgICBjYXNlIGJfbW9kZToKLSAgICAgIG9hcHBlbmQgKG5hbWVzOFtyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugd19tb2RlOgotICAgICAgb2FwcGVuZCAobmFtZXMxNltyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgZF9tb2RlOgotICAgICAgb2FwcGVuZCAobmFtZXMzMltyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugdl9tb2RlOgotICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0Jb2FwcGVuZCAobmFtZXMzMltyZWddKTsKLSAgICAgIGVsc2UKLQlvYXBwZW5kIChuYW1lczE2W3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWdldDMyICgpCi17Ci0gIGludCB4ID0gMDsKLQotICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyA0KTsKLSAgeCA9ICpjb2RlcCsrICYgMHhmZjsKLSAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCA4OwotICB4IHw9ICgqY29kZXArKyAmIDB4ZmYpIDw8IDE2OwotICB4IHw9ICgqY29kZXArKyAmIDB4ZmYpIDw8IDI0OwotICByZXR1cm4geDsKLX0KLQotc3RhdGljIGludAotZ2V0MTYgKCkKLXsKLSAgaW50IHggPSAwOwotCi0gIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDIpOwotICB4ID0gKmNvZGVwKysgJiAweGZmOwotICB4IHw9ICgqY29kZXArKyAmIDB4ZmYpIDw8IDg7Ci0gIHJldHVybiB4OwotfQotCi1zdGF0aWMgdm9pZAotc2V0X29wIChvcCkKLSAgICAgdW5zaWduZWQgaW50IG9wOwotewotICBvcF9pbmRleFtvcF9hZF0gPSBvcF9hZDsKLSAgb3BfYWRkcmVzc1tvcF9hZF0gPSBvcDsKLX0KLQotc3RhdGljIHZvaWQKLU9QX1JFRyAoY29kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBjb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIGluZGlyX2R4X3JlZzoKLSAgICAgIHMgPSAiKCVkeCkiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBheF9yZWc6IGNhc2UgY3hfcmVnOiBjYXNlIGR4X3JlZzogY2FzZSBieF9yZWc6Ci0gICAgY2FzZSBzcF9yZWc6IGNhc2UgYnBfcmVnOiBjYXNlIHNpX3JlZzogY2FzZSBkaV9yZWc6Ci0gICAgICBzID0gbmFtZXMxNltjb2RlIC0gYXhfcmVnXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgZXNfcmVnOiBjYXNlIHNzX3JlZzogY2FzZSBjc19yZWc6Ci0gICAgY2FzZSBkc19yZWc6IGNhc2UgZnNfcmVnOiBjYXNlIGdzX3JlZzoKLSAgICAgIHMgPSBuYW1lc19zZWdbY29kZSAtIGVzX3JlZ107Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGFsX3JlZzogY2FzZSBhaF9yZWc6IGNhc2UgY2xfcmVnOiBjYXNlIGNoX3JlZzoKLSAgICBjYXNlIGRsX3JlZzogY2FzZSBkaF9yZWc6IGNhc2UgYmxfcmVnOiBjYXNlIGJoX3JlZzoKLSAgICAgIHMgPSBuYW1lczhbY29kZSAtIGFsX3JlZ107Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGVBWF9yZWc6IGNhc2UgZUNYX3JlZzogY2FzZSBlRFhfcmVnOiBjYXNlIGVCWF9yZWc6Ci0gICAgY2FzZSBlU1BfcmVnOiBjYXNlIGVCUF9yZWc6IGNhc2UgZVNJX3JlZzogY2FzZSBlRElfcmVnOgotICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JcyA9IG5hbWVzMzJbY29kZSAtIGVBWF9yZWddOwotICAgICAgZWxzZQotCXMgPSBuYW1lczE2W2NvZGUgLSBlQVhfcmVnXTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzID0gSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBvYXBwZW5kIChzKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0kgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGludCBvcDsKLQotICBzd2l0Y2ggKGJ5dGVtb2RlKQotICAgIHsKLSAgICBjYXNlIGJfbW9kZToKLSAgICAgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAgICAgb3AgPSAqY29kZXArKyAmIDB4ZmY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHZfbW9kZToKLSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCW9wID0gZ2V0MzIgKCk7Ci0gICAgICBlbHNlCi0Jb3AgPSBnZXQxNiAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugd19tb2RlOgotICAgICAgb3AgPSBnZXQxNiAoKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBvYXBwZW5kIChJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaW50ZWxfc3ludGF4KQotICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIweCV4Iiwgb3ApOwotICBlbHNlCi0gICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiQweCV4Iiwgb3ApOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgc2NyYXRjaGJ1ZlswXSA9ICdcMCc7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9zSSAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaW50IG9wOwotCi0gIHN3aXRjaCAoYnl0ZW1vZGUpCi0gICAgewotICAgIGNhc2UgYl9tb2RlOgotICAgICAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0gICAgICBvcCA9ICpjb2RlcCsrOwotICAgICAgaWYgKChvcCAmIDB4ODApICE9IDApCi0Jb3AgLT0gMHgxMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHZfbW9kZToKLSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCW9wID0gZ2V0MzIgKCk7Ci0gICAgICBlbHNlCi0JewotCSAgb3AgPSBnZXQxNigpOwotCSAgaWYgKChvcCAmIDB4ODAwMCkgIT0gMCkKLQkgICAgb3AgLT0gMHgxMDAwMDsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHdfbW9kZToKLSAgICAgIG9wID0gZ2V0MTYgKCk7Ci0gICAgICBpZiAoKG9wICYgMHg4MDAwKSAhPSAwKQotCW9wIC09IDB4MTAwMDA7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgb2FwcGVuZCAoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChpbnRlbF9zeW50YXgpCi0gICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiVkIiwgb3ApOwotICBlbHNlCi0gICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiQweCV4Iiwgb3ApOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0ogKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGludCBkaXNwOwotICBpbnQgbWFzayA9IC0xOwotCi0gIHN3aXRjaCAoYnl0ZW1vZGUpCi0gICAgewotICAgIGNhc2UgYl9tb2RlOgotICAgICAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0gICAgICBkaXNwID0gKmNvZGVwKys7Ci0gICAgICBpZiAoKGRpc3AgJiAweDgwKSAhPSAwKQotCWRpc3AgLT0gMHgxMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHZfbW9kZToKLSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCWRpc3AgPSBnZXQzMiAoKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBkaXNwID0gZ2V0MTYgKCk7Ci0JICAvKiBmb3Igc29tZSByZWFzb24sIGEgZGF0YTE2IHByZWZpeCBvbiBhIGp1bXAgaW5zdHJ1Y3Rpb24KLQkgICAgIG1lYW5zIHRoYXQgdGhlIHBjIGlzIG1hc2tlZCB0byAxNiBiaXRzIGFmdGVyIHRoZQotCSAgICAgZGlzcGxhY2VtZW50IGlzIGFkZGVkISAgKi8KLQkgIG1hc2sgPSAweGZmZmY7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBkaXNwID0gKHN0YXJ0X3BjICsgY29kZXAgLSBzdGFydF9jb2RlcCArIGRpc3ApICYgbWFzazsKLSAgc2V0X29wIChkaXNwKTsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgiLCBkaXNwKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfU0VHIChkdW1teSwgc2l6ZWZsYWcpCi0gICAgIGludCBkdW1teTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBzdGF0aWMgY2hhciAqc3JlZ1tdID0gewotICAgICIlZXMiLCIlY3MiLCIlc3MiLCIlZHMiLCIlZnMiLCIlZ3MiLCIlPyIsIiU/IiwKLSAgfTsKLQotICBvYXBwZW5kIChzcmVnW3JlZ10pOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX0RJUiAoZHVtbXksIHNpemVmbGFnKQotICAgICBpbnQgZHVtbXk7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaW50IHNlZywgb2Zmc2V0OwotCi0gIGlmIChzaXplZmxhZyAmIERGTEFHKQotICAgIHsKLSAgICAgIG9mZnNldCA9IGdldDMyICgpOwotICAgICAgc2VnID0gZ2V0MTYgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb2Zmc2V0ID0gZ2V0MTYgKCk7Ci0gICAgICBzZWcgPSBnZXQxNiAoKTsKLSAgICB9Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIkMHgleCwkMHgleCIsIHNlZywgb2Zmc2V0KTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfT0ZGIChpZ25vcmUsIHNpemVmbGFnKQotICAgICBpbnQgaWdub3JlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGludCBvZmY7Ci0KLSAgYXBwZW5kX3NlZyAoKTsKLQotICBpZiAoc2l6ZWZsYWcgJiBBRkxBRykKLSAgICBvZmYgPSBnZXQzMiAoKTsKLSAgZWxzZQotICAgIG9mZiA9IGdldDE2ICgpOwotCi0gIGlmIChpbnRlbF9zeW50YXgpCi0gICAgewotICAgICAgaWYgKCEocHJlZml4ZXMgJiAoUFJFRklYX0NTIHwgUFJFRklYX1NTIHwgUFJFRklYX0RTCi0JCSAgICAgICAgfCBQUkVGSVhfRVMgfCBQUkVGSVhfRlMgfCBQUkVGSVhfR1MpKSkKLQl7Ci0JICBvYXBwZW5kIChuYW1lc19zZWdbM10pOwotCSAgb2FwcGVuZCAoIjoiKTsKLQl9Ci0gICAgfQotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiMHgleCIsIG9mZik7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotcHRyX3JlZyAoY29kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBjb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIG9hcHBlbmQgKCIoIik7Ci0gIGlmIChzaXplZmxhZyAmIEFGTEFHKQotICAgIHMgPSBuYW1lczMyW2NvZGUgLSBlQVhfcmVnXTsKLSAgZWxzZQotICAgIHMgPSBuYW1lczE2W2NvZGUgLSBlQVhfcmVnXTsKLSAgb2FwcGVuZCAocyk7Ci0gIG9hcHBlbmQgKCIpIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9FU3JlZyAoY29kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBjb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIG9hcHBlbmQgKCIlZXM6Iik7Ci0gIHB0cl9yZWcgKGNvZGUsIHNpemVmbGFnKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0RTcmVnIChjb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGNvZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaWYgKChwcmVmaXhlcwotICAgICAgICYgKFBSRUZJWF9DUwotCSAgfCBQUkVGSVhfRFMKLQkgIHwgUFJFRklYX1NTCi0JICB8IFBSRUZJWF9FUwotCSAgfCBQUkVGSVhfRlMKLQkgIHwgUFJFRklYX0dTKSkgPT0gMCkKLSAgICBwcmVmaXhlcyB8PSBQUkVGSVhfRFM7Ci0gIGFwcGVuZF9zZWcoKTsKLSAgcHRyX3JlZyAoY29kZSwgc2l6ZWZsYWcpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX0MgKGR1bW15LCBzaXplZmxhZykKLSAgICAgaW50IGR1bW15OwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJWNyJWQiLCByZWcpOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1PUF9EIChkdW1teSwgc2l6ZWZsYWcpCi0gICAgIGludCBkdW1teTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVkYiVkIiwgcmVnKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfVCAoZHVtbXksIHNpemVmbGFnKQotICAgICBpbnQgZHVtbXk7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUldHIlZCIsIHJlZyk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfUmQgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGlmIChtb2QgPT0gMykKLSAgICBPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpOwotICBlbHNlCi0gICAgQmFkT3AoKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX01NWCAoaWdub3JlLCBzaXplZmxhZykKLSAgICAgaW50IGlnbm9yZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVtbSVkIiwgcmVnKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9YTU0gKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJXhtbSVkIiwgcmVnKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9FTSAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaWYgKG1vZCAhPSAzKQotICAgIHsKLSAgICAgIE9QX0UgKGJ5dGVtb2RlLCBzaXplZmxhZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGNvZGVwKys7Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJW1tJWQiLCBybSk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfRVggKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGlmIChtb2QgIT0gMykKLSAgICB7Ci0gICAgICBPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjb2RlcCsrOwotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSV4bW0lZCIsIHJtKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9NUyAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaWYgKG1vZCA9PSAzKQotICAgIE9QX0VNIChieXRlbW9kZSwgc2l6ZWZsYWcpOwotICBlbHNlCi0gICAgQmFkT3AoKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKlN1ZmZpeDNETm93W10gPSB7Ci0vKiAwMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMDQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDA4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAwQyAqLwlOVUxMLAkJInBpMmZkIiwJTlVMTCwJCU5VTEwsCi0vKiAxMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMTQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDE4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAxQyAqLwlOVUxMLAkJInBmMmlkIiwJTlVMTCwJCU5VTEwsCi0vKiAyMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMjQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDI4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAyQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMzAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDM0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAzOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogM0MgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDQwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA0NCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNDggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDRDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA1MCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNTQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDU4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA1QyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNjAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDY0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA2OCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNkMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDcwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA3NCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNzggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDdDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA4MCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogODQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDg4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA4QyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogOTAgKi8JInBmY21wZ2UiLAlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA5NCAqLwkicGZtaW4iLAlOVUxMLAkJInBmcmNwIiwJInBmcnNxcnQiLAotLyogOTggKi8JTlVMTCwJCU5VTEwsCQkicGZzdWIiLAlOVUxMLAotLyogOUMgKi8JTlVMTCwJCU5VTEwsCQkicGZhZGQiLAlOVUxMLAotLyogQTAgKi8JInBmY21wZ3QiLAlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBBNCAqLwkicGZtYXgiLAlOVUxMLAkJInBmcmNwaXQxIiwJInBmcnNxaXQxIiwKLS8qIEE4ICovCU5VTEwsCQlOVUxMLAkJInBmc3ViciIsCU5VTEwsCi0vKiBBQyAqLwlOVUxMLAkJTlVMTCwJCSJwZmFjYyIsCU5VTEwsCi0vKiBCMCAqLwkicGZjbXBlcSIsCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEI0ICovCSJwZm11bCIsCU5VTEwsCQkicGZyY3BpdDIiLAkicGZtdWxocnciLAotLyogQjggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEJDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCSJwYXZndXNiIiwKLS8qIEMwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBDNCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogQzggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIENDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBEMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRDQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEQ4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBEQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRTAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEU0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBFOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRUMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEYwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBGNCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRjggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEZDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi19OwotCi1zdGF0aWMgdm9pZAotT1BfM0ROb3dTdWZmaXggKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGNvbnN0IGNoYXIgKm1uZW1vbmljOwotCi0gIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAvKiBBTUQgM0ROb3chIGluc3RydWN0aW9ucyBhcmUgc3BlY2lmaWVkIGJ5IGFuIG9wY29kZSBzdWZmaXggaW4gdGhlCi0gICAgIHBsYWNlIHdoZXJlIGFuIDgtYml0IGltbWVkaWF0ZSB3b3VsZCBub3JtYWxseSBnby4gIGllLiB0aGUgbGFzdAotICAgICBieXRlIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIG9idWZwID0gb2J1ZiArIHN0cmxlbihvYnVmKTsKLSAgbW5lbW9uaWMgPSBTdWZmaXgzRE5vd1sqY29kZXArKyAmIDB4ZmZdOwotICBpZiAobW5lbW9uaWMpCi0gICAgb2FwcGVuZCAobW5lbW9uaWMpOwotICBlbHNlCi0gICAgewotICAgICAgLyogU2luY2UgYSB2YXJpYWJsZSBzaXplZCBtb2RybS9zaWIgY2h1bmsgaXMgYmV0d2VlbiB0aGUgc3RhcnQKLQkgb2YgdGhlIG9wY29kZSAoMHgwZjBmKSBhbmQgdGhlIG9wY29kZSBzdWZmaXgsIHdlIG5lZWQgdG8gZG8KLQkgYWxsIHRoZSBtb2RybSBwcm9jZXNzaW5nIGZpcnN0LCBhbmQgZG9uJ3Qga25vdyB1bnRpbCBub3cgdGhhdAotCSB3ZSBoYXZlIGEgYmFkIG9wY29kZS4gIFRoaXMgbmVjZXNzaXRhdGVzIHNvbWUgY2xlYW5pbmcgdXAuICAqLwotICAgICAgb3Axb3V0WzBdID0gJ1wwJzsKLSAgICAgIG9wMm91dFswXSA9ICdcMCc7Ci0gICAgICBCYWRPcCgpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2ltZF9jbXBfb3AgW10gPSB7Ci0gICJlcSIsCi0gICJsdCIsCi0gICJsZSIsCi0gICJ1bm9yZCIsCi0gICJuZXEiLAotICAibmx0IiwKLSAgIm5sZSIsCi0gICJvcmQiCi19OwotCi1zdGF0aWMgdm9pZAotT1BfU0lNRF9TdWZmaXggKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIHVuc2lnbmVkIGludCBjbXBfdHlwZTsKLQotICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAxKTsKLSAgb2J1ZnAgPSBvYnVmICsgc3RybGVuKG9idWYpOwotICBjbXBfdHlwZSA9ICpjb2RlcCsrICYgMHhmZjsKLSAgaWYgKGNtcF90eXBlIDwgOCkKLSAgICB7Ci0gICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiY21wJXMlY3MiLAotCSAgICAgICBzaW1kX2NtcF9vcFtjbXBfdHlwZV0sCi0JICAgICAgIHByZWZpeGVzICYgUFJFRklYX1JFUFogPyAncycgOiAncCcpOwotICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhIGJhZCBleHRlbnNpb24gYnl0ZS4gIENsZWFuIHVwLiAgKi8KLSAgICAgIG9wMW91dFswXSA9ICdcMCc7Ci0gICAgICBvcDJvdXRbMF0gPSAnXDAnOwotICAgICAgQmFkT3AoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1TSU1EX0ZpeHVwIChleHRyYWNoYXIsIHNpemVmbGFnKQotICAgICBpbnQgZXh0cmFjaGFyOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIC8qIENoYW5nZSBtb3ZscHMvbW92aHBzIHRvIG1vdmhscHMvbW92bGhwcyBmb3IgMiByZWdpc3RlciBvcGVyYW5kCi0gICAgIGZvcm1zIG9mIHRoZXNlIGluc3RydWN0aW9ucy4gICovCi0gIGlmIChtb2QgPT0gMykKLSAgICB7Ci0gICAgICBjaGFyICpwID0gb2J1ZiArIHN0cmxlbihvYnVmKTsKLSAgICAgICoocCsxKSA9ICdcMCc7Ci0gICAgICAqcCAgICAgPSAqKHAtMSk7Ci0gICAgICAqKHAtMSkgPSAqKHAtMik7Ci0gICAgICAqKHAtMikgPSAqKHAtMyk7Ci0gICAgICAqKHAtMykgPSBleHRyYWNoYXI7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBCYWRPcCAodm9pZCkKLXsKLSAgY29kZXAgPSBpbnNuX2NvZGVwICsgMTsJLyogdGhyb3cgYXdheSBwcmVmaXhlcyBhbmQgMXN0LiBvcGNvZGUgYnl0ZSAqLwotICBvYXBwZW5kICgiKGJhZCkiKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvaTk2MC1kaXMuYyBiL29wY29kZXMvaTk2MC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBiZDg0OC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2k5NjAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MTQgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgaTgwOTYwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkzLCA5NCwgOTUsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcmVnX25hbWVzW10gPSB7Ci0vKiAgMCAqLwkicGZwIiwgInNwIiwgICJyaXAiLCAicjMiLCAgInI0IiwgICJyNSIsICAicjYiLCAgInI3IiwgCi0vKiAgOCAqLwkicjgiLCAgInI5IiwgICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIsCi0vKiAxNiAqLwkiZzAiLCAgImcxIiwgICJnMiIsICAiZzMiLCAgImc0IiwgICJnNSIsICAiZzYiLCAgImc3IiwgCi0vKiAyNCAqLwkiZzgiLCAgImc5IiwgICJnMTAiLCAiZzExIiwgImcxMiIsICJnMTMiLCAiZzE0IiwgImZwIiwgCi0vKiAzMiAqLwkicGMiLCAgImFjIiwgICJpcCIsICAidGMiLCAgImZwMCIsICJmcDEiLCAiZnAyIiwgImZwMyIgCi19OwotCi0KLXN0YXRpYyBGSUxFICpzdHJlYW07CQkvKiBPdXRwdXQgZ29lcyBoZXJlICovCi1zdGF0aWMgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci1zdGF0aWMgdm9pZCBwcmludF9hZGRyKCk7Ci1zdGF0aWMgdm9pZCBjdHJsKCk7Ci1zdGF0aWMgdm9pZCBjb2JyKCk7Ci1zdGF0aWMgdm9pZCByZWcoKTsKLXN0YXRpYyBpbnQgbWVtKCk7Ci1zdGF0aWMgdm9pZCBlYSgpOwotc3RhdGljIHZvaWQgZHN0b3AoKTsKLXN0YXRpYyB2b2lkIHJlZ29wKCk7Ci1zdGF0aWMgdm9pZCBpbnZhbGlkKCk7Ci1zdGF0aWMgaW50IHBpbnNuKCk7Ci1zdGF0aWMgdm9pZCBwdXRfYWJzKCk7Ci0KLQotLyogUHJpbnQgdGhlIGk5NjAgaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyAnbWVtYWRkcicgaW4gZGVidWdnZWQgbWVtb3J5LAotICAgb24gSU5GTy0+U1RSRUFNLiAgUmV0dXJucyBsZW5ndGggb2YgdGhlIGluc3RydWN0aW9uLCBpbiBieXRlcy4gICovCi0KLWludAotcHJpbnRfaW5zbl9pOTYwIChtZW1hZGRyLCBpbmZvX2FyZykKLSAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm9fYXJnOwotewotICB1bnNpZ25lZCBpbnQgd29yZDEsIHdvcmQyID0gMHhkZWFkYmVlZjsKLSAgYmZkX2J5dGUgYnVmZmVyWzhdOwotICBpbnQgc3RhdHVzOwotCi0gIGluZm8gPSBpbmZvX2FyZzsKLSAgc3RyZWFtID0gaW5mby0+c3RyZWFtOwotCi0gIC8qIFJlYWQgd29yZDEuICBPbmx5IHJlYWQgd29yZDIgaWYgdGhlIGluc3RydWN0aW9uCi0gICAgIG5lZWRzIGl0LCB0byBwcmV2ZW50IHJlYWRpbmcgcGFzdCB0aGUgZW5kIG9mIGEgc2VjdGlvbi4gICovCi0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgKGJmZF9ieXRlICopIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgd29yZDEgPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0gIC8qIERpdmlkZSBpbnN0cnVjdGlvbiBzZXQgaW50byBjbGFzc2VzIGJhc2VkIG9uIGhpZ2ggNCBiaXRzIG9mIG9wY29kZS4gICovCi0gIHN3aXRjaCAoICh3b3JkMSA+PiAyOCkgJiAweGYgKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDg6Ci0gICAgY2FzZSAweDk6Ci0gICAgY2FzZSAweGE6Ci0gICAgY2FzZSAweGI6Ci0gICAgY2FzZSAweGM6Ci0gICAgICAvKiBSZWFkIHdvcmQyLiAgKi8KLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykKLQkobWVtYWRkciArIDQsIChiZmRfYnl0ZSAqKSAoYnVmZmVyICsgNCksIDQsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIHdvcmQyID0gYmZkX2dldGwzMiAoYnVmZmVyICsgNCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHBpbnNuKCBtZW1hZGRyLCB3b3JkMSwgd29yZDIgKTsKLX0KLQwKLSNkZWZpbmUgSU5fR0RCCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJQWxsIGNvZGUgYmVsb3cgdGhpcyBwb2ludCBzaG91bGQgYmUgaWRlbnRpY2FsIHdpdGggdGhhdCBvZgotICoJdGhlIGRpc2Fzc2VtYmxlciBpbiBnZG1wOTYwLgotCi0gQSBub2JsZSBzZW50aW1lbnQsIGJ1dCBhdCBsZWFzdCBpbiBjb3NtZXRpYyB3YXlzIChpbmZvLT5mcHJpbnRmX2Z1bmMpLCBpdAotIGp1c3QgYWluJ3Qgc28uIC1raW5nZG9uLCAzMSBNYXIgOTMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IHRhYmVudCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIHNob3J0IG51bW9wczsKLX07Ci0KLXN0cnVjdCBzcGFyc2VfdGFiZW50IHsKLSAgaW50IG9wY29kZTsKLSAgY2hhciAqbmFtZTsKLSAgc2hvcnQgbnVtb3BzOwotfTsKLQotc3RhdGljIGludAotcGluc24oIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiApCi0gICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOwotewotCWludCBpbnN0cl9sZW47Ci0KLQlpbnN0cl9sZW4gPSA0OwotCXB1dF9hYnMoIHdvcmQxLCB3b3JkMiApOwotCi0JLyogRGl2aWRlIGluc3RydWN0aW9uIHNldCBpbnRvIGNsYXNzZXMgYmFzZWQgb24gaGlnaCA0IGJpdHMgb2Ygb3Bjb2RlKi8KLQlzd2l0Y2ggKCAod29yZDEgPj4gMjgpICYgMHhmICl7Ci0JY2FzZSAweDA6Ci0JY2FzZSAweDE6Ci0JCWN0cmwoIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiApOwotCQlicmVhazsKLQljYXNlIDB4MjoKLQljYXNlIDB4MzoKLQkJY29iciggbWVtYWRkciwgd29yZDEsIHdvcmQyICk7Ci0JCWJyZWFrOwotCWNhc2UgMHg1OgotCWNhc2UgMHg2OgotCWNhc2UgMHg3OgotCQlyZWcoIHdvcmQxICk7Ci0JCWJyZWFrOwotCWNhc2UgMHg4OgotCWNhc2UgMHg5OgotCWNhc2UgMHhhOgotCWNhc2UgMHhiOgotCWNhc2UgMHhjOgotCQlpbnN0cl9sZW4gPSBtZW0oIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiwgMCApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBpbnZhbGlkIGluc3RydWN0aW9uLCBwcmludCBhcyBkYXRhIHdvcmQgKi8gCi0JCWludmFsaWQoIHdvcmQxICk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gaW5zdHJfbGVuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIENUUkwgZm9ybWF0CQkJCSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1jdHJsKCBtZW1hZGRyLCB3b3JkMSwgd29yZDIgKQotICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICB1bnNpZ25lZCBsb25nIHdvcmQxLCB3b3JkMjsKLXsKLQlpbnQgaTsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHRhYmVudCBjdHJsX3RhYltdID0gewotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwMCAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwMSAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwMiAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwMyAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwNCAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwNSAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwNiAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwNyAqLwotCSAgeyAiYiIsCQkxLCB9LAkvKiAweDA4ICovCi0JICB7ICJjYWxsIiwJCTEsIH0sCS8qIDB4MDkgKi8KLQkgIHsgInJldCIsCQkwLCB9LAkvKiAweDBhICovCi0JICB7ICJiYWwiLAkJMSwgfSwJLyogMHgwYiAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwYyAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwZCAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwZSAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwZiAqLwotCSAgeyAiYm5vIiwJCTEsIH0sCS8qIDB4MTAgKi8KLQkgIHsgImJnIiwJCTEsIH0sCS8qIDB4MTEgKi8KLQkgIHsgImJlIiwJCTEsIH0sCS8qIDB4MTIgKi8KLQkgIHsgImJnZSIsCQkxLCB9LAkvKiAweDEzICovCi0JICB7ICJibCIsCQkxLCB9LAkvKiAweDE0ICovCi0JICB7ICJibmUiLAkJMSwgfSwJLyogMHgxNSAqLwotCSAgeyAiYmxlIiwJCTEsIH0sCS8qIDB4MTYgKi8KLQkgIHsgImJvIiwJCTEsIH0sCS8qIDB4MTcgKi8KLQkgIHsgImZhdWx0bm8iLAkJMCwgfSwJLyogMHgxOCAqLwotCSAgeyAiZmF1bHRnIiwJCTAsIH0sCS8qIDB4MTkgKi8KLQkgIHsgImZhdWx0ZSIsCQkwLCB9LAkvKiAweDFhICovCi0JICB7ICJmYXVsdGdlIiwJCTAsIH0sCS8qIDB4MWIgKi8KLQkgIHsgImZhdWx0bCIsCQkwLCB9LAkvKiAweDFjICovCi0JICB7ICJmYXVsdG5lIiwJCTAsIH0sCS8qIDB4MWQgKi8KLQkgIHsgImZhdWx0bGUiLAkJMCwgfSwJLyogMHgxZSAqLwotCSAgeyAiZmF1bHRvIiwJCTAsIH0sCS8qIDB4MWYgKi8KLQl9OwotCi0JaSA9ICh3b3JkMSA+PiAyNCkgJiAweGZmOwotCWlmICggKGN0cmxfdGFiW2ldLm5hbWUgPT0gTlVMTCkgfHwgKCh3b3JkMSAmIDEpICE9IDApICl7Ci0JCWludmFsaWQoIHdvcmQxICk7Ci0JCXJldHVybjsKLQl9Ci0KLQkoKmluZm8tPmZwcmludGZfZnVuYykgKCBzdHJlYW0sIGN0cmxfdGFiW2ldLm5hbWUgKTsKLQlpZiAoIHdvcmQxICYgMiApewkJLyogUHJlZGljdHMgYnJhbmNoIG5vdCB0YWtlbiAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKCBzdHJlYW0sICIuZiIgKTsKLQl9Ci0KLQlpZiAoIGN0cmxfdGFiW2ldLm51bW9wcyA9PSAxICl7Ci0JCS8qIEVYVFJBQ1QgRElTUExBQ0VNRU5UIEFORCBDT05WRVJUIFRPIEFERFJFU1MgKi8KLQkJd29yZDEgJj0gMHgwMGZmZmZmZjsKLQkJaWYgKCB3b3JkMSAmIDB4MDA4MDAwMDAgKXsJCS8qIFNpZ24gYml0IGlzIHNldCAqLwotCQkJd29yZDEgfD0gKC0xICYgfjB4ZmZmZmZmKTsJLyogU2lnbiBleHRlbmQgKi8KLQkJfQotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIlx0IiApOwotCQlwcmludF9hZGRyKCB3b3JkMSArIG1lbWFkZHIgKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQ09CUiBmb3JtYXQJCQkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWNvYnIoIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiApCi0gICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOwotewotCWludCBzcmMxOwotCWludCBzcmMyOwotCWludCBpOwotCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCB0YWJlbnQgY29icl90YWJbXSA9IHsKLQkgIHsgInRlc3RubyIsCTEsIH0sCS8qIDB4MjAgKi8KLQkgIHsgInRlc3RnIiwJMSwgfSwJLyogMHgyMSAqLwotCSAgeyAidGVzdGUiLAkxLCB9LAkvKiAweDIyICovCi0JICB7ICJ0ZXN0Z2UiLAkxLCB9LAkvKiAweDIzICovCi0JICB7ICJ0ZXN0bCIsCTEsIH0sCS8qIDB4MjQgKi8KLQkgIHsgInRlc3RuZSIsCTEsIH0sCS8qIDB4MjUgKi8KLQkgIHsgInRlc3RsZSIsCTEsIH0sCS8qIDB4MjYgKi8KLQkgIHsgInRlc3RvIiwJMSwgfSwJLyogMHgyNyAqLwotCSAgeyBOVUxMLAkwLCB9LAkvKiAweDI4ICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MjkgKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyYSAqLwotCSAgeyBOVUxMLAkwLCB9LAkvKiAweDJiICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MmMgKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyZCAqLwotCSAgeyBOVUxMLAkwLCB9LAkvKiAweDJlICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MmYgKi8KLQkgIHsgImJiYyIsCTMsIH0sCS8qIDB4MzAgKi8KLQkgIHsgImNtcG9iZyIsCTMsIH0sCS8qIDB4MzEgKi8KLQkgIHsgImNtcG9iZSIsCTMsIH0sCS8qIDB4MzIgKi8KLQkgIHsgImNtcG9iZ2UiLAkzLCB9LAkvKiAweDMzICovCi0JICB7ICJjbXBvYmwiLAkzLCB9LAkvKiAweDM0ICovCi0JICB7ICJjbXBvYm5lIiwJMywgfSwJLyogMHgzNSAqLwotCSAgeyAiY21wb2JsZSIsCTMsIH0sCS8qIDB4MzYgKi8KLQkgIHsgImJicyIsCTMsIH0sCS8qIDB4MzcgKi8KLQkgIHsgImNtcGlibm8iLAkzLCB9LAkvKiAweDM4ICovCi0JICB7ICJjbXBpYmciLAkzLCB9LAkvKiAweDM5ICovCi0JICB7ICJjbXBpYmUiLAkzLCB9LAkvKiAweDNhICovCi0JICB7ICJjbXBpYmdlIiwJMywgfSwJLyogMHgzYiAqLwotCSAgeyAiY21waWJsIiwJMywgfSwJLyogMHgzYyAqLwotCSAgeyAiY21waWJuZSIsCTMsIH0sCS8qIDB4M2QgKi8KLQkgIHsgImNtcGlibGUiLAkzLCB9LAkvKiAweDNlICovCi0JICB7ICJjbXBpYm8iLAkzLCB9LAkvKiAweDNmICovCi0JfTsKLQotCWkgPSAoKHdvcmQxID4+IDI0KSAmIDB4ZmYpIC0gMHgyMDsKLQlpZiAoIGNvYnJfdGFiW2ldLm5hbWUgPT0gTlVMTCApewotCQlpbnZhbGlkKCB3b3JkMSApOwotCQlyZXR1cm47Ci0JfQotCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpICggc3RyZWFtLCBjb2JyX3RhYltpXS5uYW1lICk7Ci0JaWYgKCB3b3JkMSAmIDIgKXsJCS8qIFByZWRpY3RzIGJyYW5jaCBub3QgdGFrZW4gKi8KLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpICggc3RyZWFtLCAiLmYiICk7Ci0JfQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiXHQiICk7Ci0KLQlzcmMxID0gKHdvcmQxID4+IDE5KSAmIDB4MWY7Ci0Jc3JjMiA9ICh3b3JkMSA+PiAxNCkgJiAweDFmOwotCi0JaWYgKCB3b3JkMSAmIDB4MDIwMDAgKXsJCS8qIE0xIGlzIDEgKi8KLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIlZCIsIHNyYzEgKTsKLQl9IGVsc2UgewkJCS8qIE0xIGlzIDAgKi8KLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sIHJlZ19uYW1lc1tzcmMxXSApOwotCX0KLQotCWlmICggY29icl90YWJbaV0ubnVtb3BzID4gMSApewotCQlpZiAoIHdvcmQxICYgMSApewkJLyogUzIgaXMgMSAqLwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsc2YlZCwiLCBzcmMyICk7Ci0JCX0gZWxzZSB7CQkJLyogUzEgaXMgMCAqLwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsJXMsIiwgcmVnX25hbWVzW3NyYzJdICk7Ci0JCX0KLQotCQkvKiBFeHRyYWN0IGRpc3BsYWNlbWVudCBhbmQgY29udmVydCB0byBhZGRyZXNzCi0JCSAqLwotCQl3b3JkMSAmPSAweDAwMDAxZmZjOwotCQlpZiAoIHdvcmQxICYgMHgwMDAwMTAwMCApewkvKiBOZWdhdGl2ZSBkaXNwbGFjZW1lbnQgKi8KLQkJCXdvcmQxIHw9ICgtMSAmIH4weDFmZmYpOwkvKiBTaWduIGV4dGVuZCAqLwotCQl9Ci0JCXByaW50X2FkZHIoIG1lbWFkZHIgKyB3b3JkMSApOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBNRU0gZm9ybWF0CQkJCSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQJCQkJLyogcmV0dXJucyBpbnN0cnVjdGlvbiBsZW5ndGg6IDQgb3IgOCAqLwotbWVtKCBtZW1hZGRyLCB3b3JkMSwgd29yZDIsIG5vcHJpbnQgKQotICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICB1bnNpZ25lZCBsb25nIHdvcmQxLCB3b3JkMjsKLSAgICBpbnQgbm9wcmludDsJCS8qIElmIFRSVUUsIHJldHVybiBpbnN0cnVjdGlvbiBsZW5ndGgsIGJ1dAotCQkJCSAqIGRvbid0IG91dHB1dCBhbnkgdGV4dC4KLQkJCQkgKi8KLXsKLQlpbnQgaSwgajsKLQlpbnQgbGVuOwotCWludCBtb2RlOwotCWludCBvZmZzZXQ7Ci0JY29uc3QgY2hhciAqcmVnMSwgKnJlZzIsICpyZWczOwotCi0JLyogVGhpcyBsb29rdXAgdGFibGUgaXMgdG9vIHNwYXJzZSB0byBtYWtlIGl0IHdvcnRoIHR5cGluZyBpbiwgYnV0IG5vdAotCSAgIHNvIGxhcmdlIGFzIHRvIG1ha2UgYSBzcGFyc2UgYXJyYXkgbmVjZXNzYXJ5LiAgV2UgY3JlYXRlIHRoZSB0YWJsZQotCSAgIGF0IHJ1bnRpbWUuICAqLwotCi0JLyoKLQkgKiBOT1RFOiBJbiB0aGlzIHRhYmxlLCB0aGUgbWVhbmluZyBvZiAnbnVtb3BzJyBpczoKLQkgKgkgMTogc2luZ2xlIG9wZXJhbmQKLQkgKgkgMjogMiBvcGVyYW5kcywgbG9hZCBpbnN0cnVjdGlvbgotCSAqCS0yOiAyIG9wZXJhbmRzLCBzdG9yZSBpbnN0cnVjdGlvbgotCSAqLwotCXN0YXRpYyBzdHJ1Y3QgdGFiZW50ICptZW1fdGFiOwotLyogT3Bjb2RlcyBvZiAweDhYLCA5WCwgYVgsIGJYLCBhbmQgY1ggbXVzdCBiZSBpbiB0aGUgdGFibGUuICAqLwotI2RlZmluZSBNRU1fTUlOCTB4ODAKLSNkZWZpbmUgTUVNX01BWAkweGNmCi0jZGVmaW5lIE1FTV9TSVoJKCAqIHNpemVvZihzdHJ1Y3QgdGFiZW50KSkKLQotCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BhcnNlX3RhYmVudCBtZW1faW5pdFtdID0gewotCSAgeyAweDgwLAkibGRvYiIsCSAyIH0sCi0JICB7IDB4ODIsCSJzdG9iIiwJLTIgfSwKLQkgIHsgMHg4NCwJImJ4IiwJIDEgfSwKLQkgIHsgMHg4NSwJImJhbHgiLAkgMiB9LAotCSAgeyAweDg2LAkiY2FsbHgiLCAxIH0sCi0JICB7IDB4ODgsCSJsZG9zIiwJIDIgfSwKLQkgIHsgMHg4YSwJInN0b3MiLAktMiB9LAotCSAgeyAweDhjLAkibGRhIiwJIDIgfSwKLQkgIHsgMHg5MCwJImxkIiwJIDIgfSwKLQkgIHsgMHg5MiwJInN0IiwJLTIgfSwKLQkgIHsgMHg5OCwJImxkbCIsCSAyIH0sCi0JICB7IDB4OWEsCSJzdGwiLAktMiB9LAotCSAgeyAweGEwLAkibGR0IiwJIDIgfSwKLQkgIHsgMHhhMiwJInN0dCIsCS0yIH0sCi0JICB7IDB4YWMsCSJkY2ludmEiLCAxIH0sCi0JICB7IDB4YjAsCSJsZHEiLAkgMiB9LAotCSAgeyAweGIyLAkic3RxIiwJLTIgfSwKLQkgIHsgMHhjMCwJImxkaWIiLAkgMiB9LAotCSAgeyAweGMyLAkic3RpYiIsCS0yIH0sCi0JICB7IDB4YzgsCSJsZGlzIiwJIDIgfSwKLQkgIHsgMHhjYSwJInN0aXMiLAktMiB9LAotCSAgeyAwLAkJTlVMTCwJMCB9Ci0JfTsKLQlzdGF0aWMgc3RydWN0IHRhYmVudCBtZW1fdGFiX2J1ZltNRU1fTUFYIC0gTUVNX01JTiArIDFdOwotCi0JaWYgKCBtZW1fdGFiID09IE5VTEwgKXsKLQkJbWVtX3RhYiA9IG1lbV90YWJfYnVmOwotCQlmb3IgKCBpID0gMDsgbWVtX2luaXRbaV0ub3Bjb2RlICE9IDA7IGkrKyApewotCQkJaiA9IG1lbV9pbml0W2ldLm9wY29kZSAtIE1FTV9NSU47Ci0JCQltZW1fdGFiW2pdLm5hbWUgPSBtZW1faW5pdFtpXS5uYW1lOwotCQkJbWVtX3RhYltqXS5udW1vcHMgPSBtZW1faW5pdFtpXS5udW1vcHM7Ci0JCX0KLQl9Ci0KLQlpID0gKCh3b3JkMSA+PiAyNCkgJiAweGZmKSAtIE1FTV9NSU47Ci0JbW9kZSA9ICh3b3JkMSA+PiAxMCkgJiAweGY7Ci0KLQlpZiAoIChtZW1fdGFiW2ldLm5hbWUgIT0gTlVMTCkJCS8qIFZhbGlkIGluc3RydWN0aW9uICovCi0JJiYgICAoKG1vZGUgPT0gNSkgfHwgKG1vZGUgPj0xMikpICl7CS8qIFdpdGggMzItYml0IGRpc3BsYWNlbWVudCAqLwotCQlsZW4gPSA4OwotCX0gZWxzZSB7Ci0JCWxlbiA9IDQ7Ci0JfQotCi0JaWYgKCBub3ByaW50ICl7Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JaWYgKCAobWVtX3RhYltpXS5uYW1lID09IE5VTEwpIHx8IChtb2RlID09IDYpICl7Ci0JCWludmFsaWQoIHdvcmQxICk7Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIlc1x0IiwgbWVtX3RhYltpXS5uYW1lICk7Ci0KLQlyZWcxID0gcmVnX25hbWVzWyAod29yZDEgPj4gMTkpICYgMHgxZiBdOwkvKiBNRU1CIG9ubHkgKi8KLQlyZWcyID0gcmVnX25hbWVzWyAod29yZDEgPj4gMTQpICYgMHgxZiBdOwotCXJlZzMgPSByZWdfbmFtZXNbIHdvcmQxICYgMHgxZiBdOwkJLyogTUVNQiBvbmx5ICovCi0Jb2Zmc2V0ID0gd29yZDEgJiAweGZmZjsJCQkJLyogTUVNQSBvbmx5ICAqLwotCi0Jc3dpdGNoICggbWVtX3RhYltpXS5udW1vcHMgKXsKLQotCWNhc2UgMjogLyogTE9BRCBJTlNUUlVDVElPTiAqLwotCQlpZiAoIG1vZGUgJiA0ICl7CQkJLyogTUVNQiBGT1JNQVQgKi8KLQkJCWVhKCBtZW1hZGRyLCBtb2RlLCByZWcyLCByZWczLCB3b3JkMSwgd29yZDIgKTsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiLCVzIiwgcmVnMSApOwotCQl9IGVsc2UgewkJCQkvKiBNRU1BIEZPUk1BVCAqLwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIweCV4IiwgKHVuc2lnbmVkKSBvZmZzZXQgKTsKLQkJCWlmIChtb2RlICYgOCkgewotCQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKSIsIHJlZzIgKTsKLQkJCX0KLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiLCVzIiwgcmVnMSApOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSAtMjogLyogU1RPUkUgSU5TVFJVQ1RJT04gKi8KLQkJaWYgKCBtb2RlICYgNCApewkJCS8qIE1FTUIgRk9STUFUICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiVzLCIsIHJlZzEgKTsKLQkJCWVhKCBtZW1hZGRyLCBtb2RlLCByZWcyLCByZWczLCB3b3JkMSwgd29yZDIgKTsKLQkJfSBlbHNlIHsJCQkJLyogTUVNQSBGT1JNQVQgKi8KLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJXMsMHgleCIsIHJlZzEsICh1bnNpZ25lZCkgb2Zmc2V0ICk7Ci0JCQlpZiAobW9kZSAmIDgpIHsKLQkJCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcykiLCByZWcyICk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIDE6IC8qIEJYL0NBTExYIElOU1RSVUNUSU9OICovCi0JCWlmICggbW9kZSAmIDQgKXsJCQkvKiBNRU1CIEZPUk1BVCAqLwotCQkJZWEoIG1lbWFkZHIsIG1vZGUsIHJlZzIsIHJlZzMsIHdvcmQxLCB3b3JkMiApOwotCQl9IGVsc2UgewkJCQkvKiBNRU1BIEZPUk1BVCAqLwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIweCV4IiwgKHVuc2lnbmVkKSBvZmZzZXQgKTsKLQkJCWlmIChtb2RlICYgOCkgewotCQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKSIsIHJlZzIgKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gbGVuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFJFRyBmb3JtYXQJCQkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLXJlZyggd29yZDEgKQotICAgIHVuc2lnbmVkIGxvbmcgd29yZDE7Ci17Ci0JaW50IGksIGo7Ci0JaW50IG9wY29kZTsKLQlpbnQgZnA7Ci0JaW50IG0xLCBtMiwgbTM7Ci0JaW50IHMxLCBzMjsKLQlpbnQgc3JjLCBzcmMyLCBkc3Q7Ci0JY2hhciAqbW5lbXA7Ci0KLQkvKiBUaGlzIGxvb2t1cCB0YWJsZSBpcyB0b28gc3BhcnNlIHRvIG1ha2UgaXQgd29ydGggdHlwaW5nIGluLCBidXQgbm90Ci0JICAgc28gbGFyZ2UgYXMgdG8gbWFrZSBhIHNwYXJzZSBhcnJheSBuZWNlc3NhcnkuICBXZSBjcmVhdGUgdGhlIHRhYmxlCi0JICAgYXQgcnVudGltZS4gICovCi0KLQkvKgotCSAqIE5PVEU6IEluIHRoaXMgdGFibGUsIHRoZSBtZWFuaW5nIG9mICdudW1vcHMnIGlzOgotCSAqCSAxOiBzaW5nbGUgb3BlcmFuZCwgd2hpY2ggaXMgTk9UIGEgZGVzdGluYXRpb24uCi0JICoJLTE6IHNpbmdsZSBvcGVyYW5kLCB3aGljaCBJUyBhIGRlc3RpbmF0aW9uLgotCSAqCSAyOiAyIG9wZXJhbmRzLCB0aGUgMm5kIG9mIHdoaWNoIGlzIE5PVCBhIGRlc3RpbmF0aW9uLgotCSAqCS0yOiAyIG9wZXJhbmRzLCB0aGUgMm5kIG9mIHdoaWNoIElTIGEgZGVzdGluYXRpb24uCi0JICoJIDM6IDMgb3BlcmFuZHMKLQkgKgotCSAqCUlmIGFuIG9wY29kZSBtbmVtb25pYyBiZWdpbnMgd2l0aCAiRiIsIGl0IGlzIGEgZmxvYXRpbmctcG9pbnQKLQkgKglvcGNvZGUgKHRoZSAiRiIgaXMgbm90IHByaW50ZWQpLgotCSAqLwotCi0Jc3RhdGljIHN0cnVjdCB0YWJlbnQgKnJlZ190YWI7Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBzcGFyc2VfdGFiZW50IHJlZ19pbml0W10gPSB7Ci0jZGVmaW5lIFJFR19NSU4JMHg1ODAKLQkgIHsgMHg1ODAsCSJub3RiaXQiLAkzIH0sCi0JICB7IDB4NTgxLAkiYW5kIiwJCTMgfSwKLQkgIHsgMHg1ODIsCSJhbmRub3QiLAkzIH0sCi0JICB7IDB4NTgzLAkic2V0Yml0IiwJMyB9LAotCSAgeyAweDU4NCwJIm5vdGFuZCIsCTMgfSwKLQkgIHsgMHg1ODYsCSJ4b3IiLAkJMyB9LAotCSAgeyAweDU4NywJIm9yIiwJCTMgfSwKLQkgIHsgMHg1ODgsCSJub3IiLAkJMyB9LAotCSAgeyAweDU4OSwJInhub3IiLAkJMyB9LAotCSAgeyAweDU4YSwJIm5vdCIsCQktMiB9LAotCSAgeyAweDU4YiwJIm9ybm90IiwJMyB9LAotCSAgeyAweDU4YywJImNscmJpdCIsCTMgfSwKLQkgIHsgMHg1OGQsCSJub3RvciIsCTMgfSwKLQkgIHsgMHg1OGUsCSJuYW5kIiwJCTMgfSwKLQkgIHsgMHg1OGYsCSJhbHRlcmJpdCIsCTMgfSwKLQkgIHsgMHg1OTAsIAkiYWRkbyIsCQkzIH0sCi0JICB7IDB4NTkxLCAJImFkZGkiLAkJMyB9LAotCSAgeyAweDU5MiwgCSJzdWJvIiwJCTMgfSwKLQkgIHsgMHg1OTMsIAkic3ViaSIsCQkzIH0sCi0JICB7IDB4NTk0LAkiY21wb2IiLAkyIH0sCi0JICB7IDB4NTk1LAkiY21waWIiLAkyIH0sCi0JICB7IDB4NTk2LAkiY21wb3MiLAkyIH0sCi0JICB7IDB4NTk3LAkiY21waXMiLAkyIH0sCi0JICB7IDB4NTk4LCAJInNocm8iLAkJMyB9LAotCSAgeyAweDU5YSwgCSJzaHJkaSIsCTMgfSwKLQkgIHsgMHg1OWIsIAkic2hyaSIsCQkzIH0sCi0JICB7IDB4NTljLCAJInNobG8iLAkJMyB9LAotCSAgeyAweDU5ZCwgCSJyb3RhdGUiLAkzIH0sCi0JICB7IDB4NTllLCAJInNobGkiLAkJMyB9LAotCSAgeyAweDVhMCwgCSJjbXBvIiwJCTIgfSwKLQkgIHsgMHg1YTEsIAkiY21waSIsCQkyIH0sCi0JICB7IDB4NWEyLCAJImNvbmNtcG8iLAkyIH0sCi0JICB7IDB4NWEzLCAJImNvbmNtcGkiLAkyIH0sCi0JICB7IDB4NWE0LCAJImNtcGluY28iLAkzIH0sCi0JICB7IDB4NWE1LCAJImNtcGluY2kiLAkzIH0sCi0JICB7IDB4NWE2LCAJImNtcGRlY28iLAkzIH0sCi0JICB7IDB4NWE3LCAJImNtcGRlY2kiLAkzIH0sCi0JICB7IDB4NWFjLCAJInNjYW5ieXRlIiwJMiB9LAotCSAgeyAweDVhZCwJImJzd2FwIiwJLTIgfSwKLQkgIHsgMHg1YWUsIAkiY2hrYml0IiwJMiB9LAotCSAgeyAweDViMCwgCSJhZGRjIiwJCTMgfSwKLQkgIHsgMHg1YjIsIAkic3ViYyIsCQkzIH0sCi0JICB7IDB4NWI0LAkiaW50ZGlzIiwJMCB9LAotCSAgeyAweDViNSwJImludGVuIiwJMCB9LAotCSAgeyAweDVjYywJIm1vdiIsCQktMiB9LAotCSAgeyAweDVkOCwJImVzaHJvIiwJMyB9LAotCSAgeyAweDVkYywJIm1vdmwiLAkJLTIgfSwKLQkgIHsgMHg1ZWMsCSJtb3Z0IiwJCS0yIH0sCi0JICB7IDB4NWZjLAkibW92cSIsCQktMiB9LAotCSAgeyAweDYwMCwJInN5bm1vdiIsCTIgfSwKLQkgIHsgMHg2MDEsCSJzeW5tb3ZsIiwJMiB9LAotCSAgeyAweDYwMiwJInN5bm1vdnEiLAkyIH0sCi0JICB7IDB4NjAzLAkiY21wc3RyIiwJMyB9LAotCSAgeyAweDYwNCwJIm1vdnFzdHIiLAkzIH0sCi0JICB7IDB4NjA1LAkibW92c3RyIiwJMyB9LAotCSAgeyAweDYxMCwJImF0bW9kIiwJMyB9LAotCSAgeyAweDYxMiwJImF0YWRkIiwJMyB9LAotCSAgeyAweDYxMywJImluc3BhY2MiLAktMiB9LAotCSAgeyAweDYxNCwJImxkcGh5IiwJLTIgfSwKLQkgIHsgMHg2MTUsCSJzeW5sZCIsCS0yIH0sCi0JICB7IDB4NjE3LAkiZmlsbCIsCQkzIH0sCi0JICB7IDB4NjMwLAkic2RtYSIsCQkzIH0sCi0JICB7IDB4NjMxLAkidWRtYSIsCQkwIH0sCi0JICB7IDB4NjQwLAkic3BhbmJpdCIsCS0yIH0sCi0JICB7IDB4NjQxLAkic2NhbmJpdCIsCS0yIH0sCi0JICB7IDB4NjQyLAkiZGFkZGMiLAkzIH0sCi0JICB7IDB4NjQzLAkiZHN1YmMiLAkzIH0sCi0JICB7IDB4NjQ0LAkiZG1vdnQiLAktMiB9LAotCSAgeyAweDY0NSwJIm1vZGFjIiwJMyB9LAotCSAgeyAweDY0NiwJImNvbmRyZWMiLAktMiB9LAotCSAgeyAweDY1MCwJIm1vZGlmeSIsCTMgfSwKLQkgIHsgMHg2NTEsCSJleHRyYWN0IiwJMyB9LAotCSAgeyAweDY1NCwJIm1vZHRjIiwJMyB9LAotCSAgeyAweDY1NSwJIm1vZHBjIiwJMyB9LAotCSAgeyAweDY1NiwJInJlY2VpdmUiLAktMiB9LAotCSAgeyAweDY1OCwJImludGN0bCIsCS0yIH0sCi0JICB7IDB4NjU5LAkic3lzY3RsIiwJMyB9LAotCSAgeyAweDY1YiwJImljY3RsIiwJMyB9LAotCSAgeyAweDY1YywJImRjY3RsIiwJMyB9LAotCSAgeyAweDY1ZCwJImhhbHQiLAkJMCB9LAotCSAgeyAweDY2MCwJImNhbGxzIiwJMSB9LAotCSAgeyAweDY2MiwJInNlbmQiLAkJMyB9LAotCSAgeyAweDY2MywJInNlbmRzZXJ2IiwJMSB9LAotCSAgeyAweDY2NCwJInJlc3VtcHJjcyIsCTEgfSwKLQkgIHsgMHg2NjUsCSJzY2hlZHByY3MiLAkxIH0sCi0JICB7IDB4NjY2LAkic2F2ZXByY3MiLAkwIH0sCi0JICB7IDB4NjY4LAkiY29uZHdhaXQiLAkxIH0sCi0JICB7IDB4NjY5LAkid2FpdCIsCQkxIH0sCi0JICB7IDB4NjZhLAkic2lnbmFsIiwJMSB9LAotCSAgeyAweDY2YiwJIm1hcmsiLAkJMCB9LAotCSAgeyAweDY2YywJImZtYXJrIiwJMCB9LAotCSAgeyAweDY2ZCwJImZsdXNocmVnIiwJMCB9LAotCSAgeyAweDY2ZiwJInN5bmNmIiwJMCB9LAotCSAgeyAweDY3MCwJImVtdWwiLAkJMyB9LAotCSAgeyAweDY3MSwJImVkaXYiLAkJMyB9LAotCSAgeyAweDY3MywgCSJsZHRpbWUiLAktMSB9LAotCSAgeyAweDY3NCwJIkZjdnRpciIsCS0yIH0sCi0JICB7IDB4Njc1LAkiRmN2dGlsciIsCS0yIH0sCi0JICB7IDB4Njc2LAkiRnNjYWxlcmwiLAkzIH0sCi0JICB7IDB4Njc3LAkiRnNjYWxlciIsCTMgfSwKLQkgIHsgMHg2ODAsCSJGYXRhbnIiLAkzIH0sCi0JICB7IDB4NjgxLAkiRmxvZ2VwciIsCTMgfSwKLQkgIHsgMHg2ODIsCSJGbG9nciIsCTMgfSwKLQkgIHsgMHg2ODMsCSJGcmVtciIsCTMgfSwKLQkgIHsgMHg2ODQsCSJGY21wb3IiLAkyIH0sCi0JICB7IDB4Njg1LAkiRmNtcHIiLAkyIH0sCi0JICB7IDB4Njg4LAkiRnNxcnRyIiwJLTIgfSwKLQkgIHsgMHg2ODksCSJGZXhwciIsCS0yIH0sCi0JICB7IDB4NjhhLAkiRmxvZ2JuciIsCS0yIH0sCi0JICB7IDB4NjhiLAkiRnJvdW5kciIsCS0yIH0sCi0JICB7IDB4NjhjLAkiRnNpbnIiLAktMiB9LAotCSAgeyAweDY4ZCwJIkZjb3NyIiwJLTIgfSwKLQkgIHsgMHg2OGUsCSJGdGFuciIsCS0yIH0sCi0JICB7IDB4NjhmLAkiRmNsYXNzciIsCTEgfSwKLQkgIHsgMHg2OTAsCSJGYXRhbnJsIiwJMyB9LAotCSAgeyAweDY5MSwJIkZsb2dlcHJsIiwJMyB9LAotCSAgeyAweDY5MiwJIkZsb2dybCIsCTMgfSwKLQkgIHsgMHg2OTMsCSJGcmVtcmwiLAkzIH0sCi0JICB7IDB4Njk0LAkiRmNtcG9ybCIsCTIgfSwKLQkgIHsgMHg2OTUsCSJGY21wcmwiLAkyIH0sCi0JICB7IDB4Njk4LAkiRnNxcnRybCIsCS0yIH0sCi0JICB7IDB4Njk5LAkiRmV4cHJsIiwJLTIgfSwKLQkgIHsgMHg2OWEsCSJGbG9nYm5ybCIsCS0yIH0sCi0JICB7IDB4NjliLAkiRnJvdW5kcmwiLAktMiB9LAotCSAgeyAweDY5YywJIkZzaW5ybCIsCS0yIH0sCi0JICB7IDB4NjlkLAkiRmNvc3JsIiwJLTIgfSwKLQkgIHsgMHg2OWUsCSJGdGFucmwiLAktMiB9LAotCSAgeyAweDY5ZiwJIkZjbGFzc3JsIiwJMSB9LAotCSAgeyAweDZjMCwJIkZjdnRyaSIsCS0yIH0sCi0JICB7IDB4NmMxLAkiRmN2dHJpbCIsCS0yIH0sCi0JICB7IDB4NmMyLAkiRmN2dHpyaSIsCS0yIH0sCi0JICB7IDB4NmMzLAkiRmN2dHpyaWwiLAktMiB9LAotCSAgeyAweDZjOSwJIkZtb3ZyIiwJLTIgfSwKLQkgIHsgMHg2ZDksCSJGbW92cmwiLAktMiB9LAotCSAgeyAweDZlMSwgCSJGbW92cmUiLAktMiB9LAotCSAgeyAweDZlMiwgCSJGY3B5c3JlIiwJMyB9LAotCSAgeyAweDZlMywgCSJGY3B5cnNyZSIsCTMgfSwKLQkgIHsgMHg3MDEsCSJtdWxvIiwJCTMgfSwKLQkgIHsgMHg3MDgsCSJyZW1vIiwJCTMgfSwKLQkgIHsgMHg3MGIsCSJkaXZvIiwJCTMgfSwKLQkgIHsgMHg3NDEsCSJtdWxpIiwJCTMgfSwKLQkgIHsgMHg3NDgsCSJyZW1pIiwJCTMgfSwKLQkgIHsgMHg3NDksCSJtb2RpIiwJCTMgfSwKLQkgIHsgMHg3NGIsCSJkaXZpIiwJCTMgfSwKLQkgIHsgMHg3ODAsCSJhZGRvbm8iLAkzIH0sCi0JICB7IDB4NzgxLAkiYWRkaW5vIiwJMyB9LAotCSAgeyAweDc4MiwJInN1Ym9ubyIsCTMgfSwKLQkgIHsgMHg3ODMsCSJzdWJpbm8iLAkzIH0sCi0JICB7IDB4Nzg0LAkic2Vsbm8iLAkzIH0sCi0JICB7IDB4NzhiLAkiRmRpdnIiLAkzIH0sCi0JICB7IDB4NzhjLAkiRm11bHIiLAkzIH0sCi0JICB7IDB4NzhkLAkiRnN1YnIiLAkzIH0sCi0JICB7IDB4NzhmLAkiRmFkZHIiLAkzIH0sCi0JICB7IDB4NzkwLAkiYWRkb2ciLAkzIH0sCi0JICB7IDB4NzkxLAkiYWRkaWciLCAgICAgICAgMyB9LAotCSAgeyAweDc5MiwJInN1Ym9nIiwJMyB9LAotCSAgeyAweDc5MywJInN1YmlnIiwJMyB9LAotCSAgeyAweDc5NCwJInNlbGciLAkJMyB9LAotCSAgeyAweDc5YiwJIkZkaXZybCIsCTMgfSwKLQkgIHsgMHg3OWMsCSJGbXVscmwiLAkzIH0sCi0JICB7IDB4NzlkLAkiRnN1YnJsIiwJMyB9LAotCSAgeyAweDc5ZiwJIkZhZGRybCIsCTMgfSwKLQkgIHsgMHg3YTAsCSJhZGRvZSIsCTMgfSwKLQkgIHsgMHg3YTEsCSJhZGRpZSIsICAgICAgICAzIH0sCi0JICB7IDB4N2EyLAkic3Vib2UiLAkzIH0sCi0JICB7IDB4N2EzLAkic3ViaWUiLAkzIH0sCi0JICB7IDB4N2E0LAkic2VsZSIsCQkzIH0sCi0JICB7IDB4N2IwLAkiYWRkb2dlIiwJMyB9LAotCSAgeyAweDdiMSwJImFkZGlnZSIsCTMgfSwKLQkgIHsgMHg3YjIsCSJzdWJvZ2UiLAkzIH0sCi0JICB7IDB4N2IzLAkic3ViaWdlIiwJMyB9LAotCSAgeyAweDdiNCwJInNlbGdlIiwJMyB9LAotCSAgeyAweDdjMCwJImFkZG9sIiwJMyB9LAotCSAgeyAweDdjMSwJImFkZGlsIiwJMyB9LAotCSAgeyAweDdjMiwJInN1Ym9sIiwJMyB9LAotCSAgeyAweDdjMywJInN1YmlsIiwJMyB9LAotCSAgeyAweDdjNCwJInNlbGwiLAkJMyB9LAotCSAgeyAweDdkMCwJImFkZG9uZSIsCTMgfSwKLQkgIHsgMHg3ZDEsCSJhZGRpbmUiLAkzIH0sCi0JICB7IDB4N2QyLAkic3Vib25lIiwJMyB9LAotCSAgeyAweDdkMywJInN1YmluZSIsCTMgfSwKLQkgIHsgMHg3ZDQsCSJzZWxuZSIsCTMgfSwKLQkgIHsgMHg3ZTAsCSJhZGRvbGUiLAkzIH0sCi0JICB7IDB4N2UxLAkiYWRkaWxlIiwJMyB9LAotCSAgeyAweDdlMiwJInN1Ym9sZSIsCTMgfSwKLQkgIHsgMHg3ZTMsCSJzdWJpbGUiLAkzIH0sCi0JICB7IDB4N2U0LAkic2VsbGUiLAkzIH0sCi0JICB7IDB4N2YwLAkiYWRkb28iLAkzIH0sCi0JICB7IDB4N2YxLAkiYWRkaW8iLAkzIH0sCi0JICB7IDB4N2YyLAkic3Vib28iLAkzIH0sCi0JICB7IDB4N2YzLAkic3ViaW8iLAkzIH0sCi0JICB7IDB4N2Y0LAkic2VsbyIsCQkzIH0sCi0jZGVmaW5lIFJFR19NQVggMHg3ZjQKLQkgIHsgMCwJCU5VTEwsCQkwIH0KLQl9OwotCXN0YXRpYyBzdHJ1Y3QgdGFiZW50IHJlZ190YWJfYnVmW1JFR19NQVggLSBSRUdfTUlOICsgMV07Ci0KLQlpZiAoIHJlZ190YWIgPT0gTlVMTCApewotCQlyZWdfdGFiID0gcmVnX3RhYl9idWY7Ci0JCWZvciAoIGkgPSAwOyByZWdfaW5pdFtpXS5vcGNvZGUgIT0gMDsgaSsrICl7Ci0JCQlqID0gcmVnX2luaXRbaV0ub3Bjb2RlIC0gUkVHX01JTjsKLQkJCXJlZ190YWJbal0ubmFtZSA9IHJlZ19pbml0W2ldLm5hbWU7Ci0JCQlyZWdfdGFiW2pdLm51bW9wcyA9IHJlZ19pbml0W2ldLm51bW9wczsKLQkJfQotCX0KLQotCW9wY29kZSA9ICgod29yZDEgPj4gMjApICYgMHhmZjApIHwgKCh3b3JkMSA+PiA3KSAmIDB4Zik7Ci0JaSA9IG9wY29kZSAtIFJFR19NSU47Ci0KLQlpZiAoIChvcGNvZGU8UkVHX01JTikgfHwgKG9wY29kZT5SRUdfTUFYKSB8fCAocmVnX3RhYltpXS5uYW1lPT1OVUxMKSApewotCQlpbnZhbGlkKCB3b3JkMSApOwotCQlyZXR1cm47Ci0JfQotCi0JbW5lbXAgPSByZWdfdGFiW2ldLm5hbWU7Ci0JaWYgKCAqbW5lbXAgPT0gJ0YnICl7Ci0JCWZwID0gMTsKLQkJbW5lbXArKzsKLQl9IGVsc2UgewotCQlmcCA9IDA7Ci0JfQotCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sIG1uZW1wICk7Ci0KLQlzMSAgID0gKHdvcmQxID4+IDUpICAmIDE7Ci0JczIgICA9ICh3b3JkMSA+PiA2KSAgJiAxOwotCW0xICAgPSAod29yZDEgPj4gMTEpICYgMTsKLQltMiAgID0gKHdvcmQxID4+IDEyKSAmIDE7Ci0JbTMgICA9ICh3b3JkMSA+PiAxMykgJiAxOwotCXNyYyAgPSAgd29yZDEgICAgICAgICYgMHgxZjsKLQlzcmMyID0gKHdvcmQxID4+IDE0KSAmIDB4MWY7Ci0JZHN0ICA9ICh3b3JkMSA+PiAxOSkgJiAweDFmOwotCi0JaWYgICggcmVnX3RhYltpXS5udW1vcHMgIT0gMCApewotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIlx0IiApOwotCi0JCXN3aXRjaCAoIHJlZ190YWJbaV0ubnVtb3BzICl7Ci0JCWNhc2UgMToKLQkJCXJlZ29wKCBtMSwgczEsIHNyYywgZnAgKTsKLQkJCWJyZWFrOwotCQljYXNlIC0xOgotCQkJZHN0b3AoIG0zLCBkc3QsIGZwICk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJcmVnb3AoIG0xLCBzMSwgc3JjLCBmcCApOwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsIiApOwotCQkJcmVnb3AoIG0yLCBzMiwgc3JjMiwgZnAgKTsKLQkJCWJyZWFrOwotCQljYXNlIC0yOgotCQkJcmVnb3AoIG0xLCBzMSwgc3JjLCBmcCApOwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsIiApOwotCQkJZHN0b3AoIG0zLCBkc3QsIGZwICk7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJcmVnb3AoIG0xLCBzMSwgc3JjLCBmcCApOwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsIiApOwotCQkJcmVnb3AoIG0yLCBzMiwgc3JjMiwgZnAgKTsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiLCIgKTsKLQkJCWRzdG9wKCBtMywgZHN0LCBmcCApOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLQotLyoKLSAqIFByaW50IG91dCBlZmZlY3RpdmUgYWRkcmVzcyBmb3IgbWVtYiBpbnN0cnVjdGlvbnMuCi0gKi8KLXN0YXRpYyB2b2lkCi1lYSggbWVtYWRkciwgbW9kZSwgcmVnMiwgcmVnMywgd29yZDEsIHdvcmQyICkKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBpbnQgbW9kZTsKLSAgICAgY2hhciAqcmVnMiwgKnJlZzM7Ci0gICAgIGludCB3b3JkMTsKLSAgICAgdW5zaWduZWQgaW50IHdvcmQyOwotewotCWludCBzY2FsZTsKLQlzdGF0aWMgY29uc3QgaW50IHNjYWxlX3RhYltdID0geyAxLCAyLCA0LCA4LCAxNiB9OwotCi0Jc2NhbGUgPSAod29yZDEgPj4gNykgJiAweDA3OwotCWlmICggKHNjYWxlID4gNCkgfHwgKCgod29yZDEgPj4gNSkgJiAweDAzKSAhPSAwKSApewotCQlpbnZhbGlkKCB3b3JkMSApOwotCQlyZXR1cm47Ci0JfQotCXNjYWxlID0gc2NhbGVfdGFiW3NjYWxlXTsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgNDoJIAkJCQkJLyogKHJlZykgKi8KLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpIiwgcmVnMiApOwotCQlicmVhazsKLQljYXNlIDU6CQkJCQkJLyogZGlzcGwrOChpcCkgKi8KLQkJcHJpbnRfYWRkciggd29yZDIrOCttZW1hZGRyICk7Ci0JCWJyZWFrOwotCWNhc2UgNzoJCQkJCQkvKiAocmVnKVtpbmRleCpzY2FsZV0gKi8KLQkJaWYgKHNjYWxlID09IDEpIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKVslc10iLCByZWcyLCByZWczICk7Ci0JCX0gZWxzZSB7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcylbJXMqJWRdIixyZWcyLHJlZzMsc2NhbGUpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgMTI6CQkJCQkvKiBkaXNwbGFjZW1lbnQgKi8KLQkJcHJpbnRfYWRkciggKGJmZF92bWEpd29yZDIgKTsKLQkJYnJlYWs7Ci0JY2FzZSAxMzoJCQkJCS8qIGRpc3BsKHJlZykgKi8KLQkJcHJpbnRfYWRkciggKGJmZF92bWEpd29yZDIgKTsKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpIiwgcmVnMiApOwotCQlicmVhazsKLQljYXNlIDE0OgkJCQkJLyogZGlzcGxbaW5kZXgqc2NhbGVdICovCi0JCXByaW50X2FkZHIoIChiZmRfdm1hKXdvcmQyICk7Ci0JCWlmIChzY2FsZSA9PSAxKSB7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIlslc10iLCByZWczICk7Ci0JCX0gZWxzZSB7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIlslcyolZF0iLCByZWczLCBzY2FsZSApOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgMTU6CQkJCS8qIGRpc3BsKHJlZylbaW5kZXgqc2NhbGVdICovCi0JCXByaW50X2FkZHIoIChiZmRfdm1hKXdvcmQyICk7Ci0JCWlmIChzY2FsZSA9PSAxKSB7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcylbJXNdIiwgcmVnMiwgcmVnMyApOwotCQl9IGVsc2UgewotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpWyVzKiVkXSIscmVnMixyZWczLHNjYWxlICk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJaW52YWxpZCggd29yZDEgKTsKLQkJcmV0dXJuOwotCX0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUmVnaXN0ZXIgSW5zdHJ1Y3Rpb24gT3BlcmFuZCAgCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1yZWdvcCggbW9kZSwgc3BlYywgcmVnLCBmcCApCi0gICAgaW50IG1vZGUsIHNwZWMsIHJlZywgZnA7Ci17Ci0JaWYgKCBmcCApewkJCQkvKiBGTE9BVElORyBQT0lOVCBJTlNUUlVDVElPTiAqLwotCQlpZiAoIG1vZGUgPT0gMSApewkJCS8qIEZQIG9wZXJhbmQgKi8KLQkJCXN3aXRjaCAoIHJlZyApewotCQkJY2FzZSAwOiAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJmcDAiICk7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAxOiAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJmcDEiICk7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAyOiAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJmcDIiICk7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAzOiAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJmcDMiICk7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAxNjogKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIwZjAuMCIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDIyOiAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIjBmMS4wIiApOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6ICgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiPyIgKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7CQkJCS8qIE5vbi1GUCByZWdpc3RlciAqLwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sIHJlZ19uYW1lc1tyZWddICk7Ci0JCX0KLQl9IGVsc2UgewkJCQkvKiBOT1QgRkxPQVRJTkcgUE9JTlQgKi8KLQkJaWYgKCBtb2RlID09IDEgKXsJCQkvKiBMaXRlcmFsICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiVkIiwgcmVnICk7Ci0JCX0gZWxzZSB7CQkJCS8qIFJlZ2lzdGVyICovCi0JCQlpZiAoIHNwZWMgPT0gMCApewotCQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCByZWdfbmFtZXNbcmVnXSApOwotCQkJfSBlbHNlIHsKLQkJCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgInNmJWQiLCByZWcgKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFJlZ2lzdGVyIEluc3RydWN0aW9uIERlc3RpbmF0aW9uIE9wZXJhbmQJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotZHN0b3AoIG1vZGUsIHJlZywgZnAgKQotICAgIGludCBtb2RlLCByZWcsIGZwOwotewotCS8qICdkc3QnIG9wZXJhbmQgY2FuJ3QgYmUgYSBsaXRlcmFsLiBPbiBub24tRlAgaW5zdHJ1Y3Rpb25zLCAgcmVnaXN0ZXIKLQkgKiBtb2RlIGlzIGFzc3VtZWQgYW5kICJtMyIgYWN0cyBhcyBpZiB3ZXJlICJzMyI7ICBvbiBGUC1pbnN0cnVjdGlvbnMsCi0JICogc2YgcmVnaXN0ZXJzIGFyZSBub3QgYWxsb3dlZCBzbyBtMyBhY3RzIG5vcm1hbGx5LgotCSAqLwotCSBpZiAoIGZwICl7Ci0JCXJlZ29wKCBtb2RlLCAwLCByZWcsIGZwICk7Ci0JIH0gZWxzZSB7Ci0JCXJlZ29wKCAwLCBtb2RlLCByZWcsIGZwICk7Ci0JIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotaW52YWxpZCggd29yZDEgKQotICAgIGludCB3b3JkMTsKLXsKLQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIi53b3JkXHQweCUwOHgiLCAodW5zaWduZWQpIHdvcmQxICk7Ci19CQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYWRkcihhKQotYmZkX3ZtYSBhOwotewotICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGEsIGluZm8pOwotfQotCi1zdGF0aWMgdm9pZAotcHV0X2Ficyggd29yZDEsIHdvcmQyICkKLSAgICB1bnNpZ25lZCBsb25nIHdvcmQxLCB3b3JkMjsKLXsKLSNpZmRlZiBJTl9HREIKLQlyZXR1cm47Ci0jZWxzZQotCWludCBsZW47Ci0KLQlzd2l0Y2ggKCAod29yZDEgPj4gMjgpICYgMHhmICl7Ci0JY2FzZSAweDg6Ci0JY2FzZSAweDk6Ci0JY2FzZSAweGE6Ci0JY2FzZSAweGI6Ci0JY2FzZSAweGM6Ci0JCS8qIE1FTSBmb3JtYXQgaW5zdHJ1Y3Rpb24gKi8KLQkJbGVuID0gbWVtKCAwLCB3b3JkMSwgd29yZDIsIDEgKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJbGVuID0gNDsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCBsZW4gPT0gOCApewotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiUwOHggJTA4eFx0Iiwgd29yZDEsIHdvcmQyICk7Ci0JfSBlbHNlIHsKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIlMDh4ICAgICAgICAgXHQiLCB3b3JkMSApOwotCX0KLTsKLQotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9vcGNvZGVzL20xMDIwMC1kaXMuYyBiL29wY29kZXMvbTEwMjAwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJjN2UzLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTEwMjAwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIE1OMTAyMDAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvbW4xMDIwMC5oIiAKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLXN0YXRpYyB2b2lkIGRpc2Fzc2VtYmxlIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosCi0JCQkJIHVuc2lnbmVkIGxvbmcgaW5zbiwgdW5zaWduZWQgbG9uZywKLQkJCQkgdW5zaWduZWQgaW50KSk7Ci0KLWludCAKLXByaW50X2luc25fbW4xMDIwMCAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IHN0YXR1czsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgZXh0ZW5zaW9uID0gMDsKLSAgdW5zaWduZWQgaW50IGNvbnN1bWU7Ci0KLSAgLyogRmlyc3QgZmlndXJlIG91dCBob3cgYmlnIHRoZSBvcGNvZGUgaXMuICAqLwotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDEsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGluc24gPSAqKHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyOwotCi0gIC8qIFRoZXNlIGFyZSBvbmUgYnl0ZSBpbnNucy4gICovCi0gIGlmICgoaW5zbiAmIDB4ZjApID09IDB4MDAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHgxMAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweDIwCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4MzAKLSAgICAgIHx8ICgoaW5zbiAmIDB4ZjApID09IDB4ODAKLQkgICYmIChpbnNuICYgMHgwYykgPj4gMiAhPSAoaW5zbiAmIDB4MDMpKQotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweDkwCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4YTAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHhiMAotICAgICAgfHwgKGluc24gJiAweGZmKSA9PSAweGViCi0gICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjYKLSAgICAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmZQotICAgICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZmKQotICAgIHsKLSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0gICAgICBjb25zdW1lID0gMTsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIHR3byBieXRlIGluc25zLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGYwKSA9PSAweDQwCi0JICAgfHwgKGluc24gJiAweGYwKSA9PSAweDUwCi0JICAgfHwgKGluc24gJiAweGYwKSA9PSAweDYwCi0JICAgfHwgKGluc24gJiAweGYwKSA9PSAweDcwCi0JICAgfHwgKGluc24gJiAweGYwKSA9PSAweDgwCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGQwCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGQ0Ci0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGQ4Ci0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGUwCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGU0Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGU4Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGU5Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGVhCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGYwCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGYxCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGYyCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGYzKQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotICAgICAgY29uc3VtZSA9IDI7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSB0aHJlZSBieXRlIGluc25zIHdpdGggYSAxNmJpdCBvcGVyYW5kIGluIGxpdHRsZQotICAgICBlbmRpYW4gZm9ybS4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmMCkgPT0gMHhjMAotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhkYwotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhlYwotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmOAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmOQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmYQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmYgotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmYwotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmZCkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMSwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIDw8PSAxNjsKLSAgICAgIGluc24gfD0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0gICAgICBjb25zdW1lID0gMzsKLSAgICB9Ci0gIC8qIFRoZXNlIGFyZSB0aHJlZSBieXRlIGluc25zIHRvbywgYnV0IHdlIGRvbid0IGhhdmUgdG8gbWVzcyB3aXRoCi0gICAgIGVuZGlhbm5lc3Mgc3R1ZmYuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZmYpID09IDB4ZjUpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA8PD0gMTY7Ci0gICAgICBpbnNuIHw9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0gICAgICBleHRlbnNpb24gPSAwOwotICAgICAgY29uc3VtZSA9IDM7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSBmb3VyIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZmYpID09IDB4ZjcpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGluc24gPDw9IDE2OwotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiB8PSBiZmRfZ2V0bDE2IChidWZmZXIpOwotICAgICAgZXh0ZW5zaW9uID0gMDsKLSAgICAgIGNvbnN1bWUgPSA0OwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgZml2ZSBieXRlIGluc25zLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGZmKSA9PSAweGY0KQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0gICAgICBpbnNuIDw8PSAxNjsKLQotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDQsIGJ1ZmZlciwgMSwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiB8PSAoKih1bnNpZ25lZCBjaGFyICopYnVmZmVyIDw8IDgpICYgMHhmZjAwOwotCi0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMywgYnVmZmVyLCAxLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIHw9ICgqKHVuc2lnbmVkIGNoYXIgKilidWZmZXIpICYgMHhmZjsKLQotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDIsIGJ1ZmZlciwgMSwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgZXh0ZW5zaW9uID0gKCoodW5zaWduZWQgY2hhciAqKWJ1ZmZlcikgJiAweGZmOwotICAgICAgY29uc3VtZSA9IDU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIF8oInVua25vd25cdDB4JTAyeCIpLCBpbnNuKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBkaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbiwgZXh0ZW5zaW9uLCBjb25zdW1lKTsKLQotICByZXR1cm4gY29uc3VtZTsKLX0KLQotc3RhdGljIHZvaWQKLWRpc2Fzc2VtYmxlIChtZW1hZGRyLCBpbmZvLCBpbnNuLCBleHRlbnNpb24sIHNpemUpCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgdW5zaWduZWQgbG9uZyBleHRlbnNpb247Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgKm9wID0gKHN0cnVjdCBtbjEwMjAwX29wY29kZSAqKW1uMTAyMDBfb3Bjb2RlczsKLSAgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCAqb3BlcmFuZDsKLSAgaW50IG1hdGNoID0gMDsKLQotICAvKiBGaW5kIHRoZSBvcGNvZGUuICAqLwotICB3aGlsZSAob3AtPm5hbWUpCi0gICAgewotICAgICAgaW50IG15c2l6ZSwgZXh0cmFfc2hpZnQ7Ci0KLSAgICAgIGlmIChvcC0+Zm9ybWF0ID09IEZNVF8xKQotCW15c2l6ZSA9IDE7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF8yCi0JICAgICAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UXzQpCi0JbXlzaXplID0gMjsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzMKLQkgICAgICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfNSkKLQlteXNpemUgPSAzOwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfNikKLQlteXNpemUgPSA0OwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfNykKLQlteXNpemUgPSA1OwotICAgICAgZWxzZQotCWFib3J0ICgpOwotCQotICAgICAgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzIgfHwgb3AtPmZvcm1hdCA9PSBGTVRfNSkKLQlleHRyYV9zaGlmdCA9IDg7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF8zCi0JICAgICAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UXzYKLQkgICAgICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfNykKLQlleHRyYV9zaGlmdCA9IDE2OwotICAgICAgZWxzZQotCWV4dHJhX3NoaWZ0ID0gMDsKLQotICAgICAgaWYgKChvcC0+bWFzayAmIGluc24pID09IG9wLT5vcGNvZGUKLQkgICYmIHNpemUgPT0gKHVuc2lnbmVkIGludCkgbXlzaXplKQotCXsKLQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXhfcHRyOwotCSAgdW5zaWduZWQgaW50IG5vY29tbWE7Ci0JICBpbnQgcGFyZW4gPSAwOwotCSAgCi0JICBtYXRjaCA9IDE7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzXHQiLCBvcC0+bmFtZSk7Ci0KLQkgIC8qIE5vdyBwcmludCB0aGUgb3BlcmFuZHMuICAqLwotCSAgZm9yIChvcGluZGV4X3B0ciA9IG9wLT5vcGVyYW5kcywgbm9jb21tYSA9IDE7Ci0JICAgICAgICpvcGluZGV4X3B0ciAhPSAwOwotCSAgICAgICBvcGluZGV4X3B0cisrKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQotCSAgICAgIG9wZXJhbmQgPSAmbW4xMDIwMF9vcGVyYW5kc1sqb3BpbmRleF9wdHJdOwotCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRCkgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKGluc24gJiAweGZmZmYpIDw8IDg7Ci0JCSAgdmFsdWUgfD0gZXh0ZW5zaW9uOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdmFsdWUgPSAoKGluc24gPj4gKG9wZXJhbmQtPnNoaWZ0KSkKLQkJCSAgICYgKCgxTCA8PCBvcGVyYW5kLT5iaXRzKSAtIDFMKSk7Ci0JCX0KLQotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCQl2YWx1ZSA9ICgobG9uZykodmFsdWUgPDwgKDMyIC0gb3BlcmFuZC0+Yml0cykpCi0JCQkgID4+ICgzMiAtIG9wZXJhbmQtPmJpdHMpKTsKLQotCSAgICAgIGlmICghbm9jb21tYQotCQkgICYmICghcGFyZW4KLQkJICAgICAgfHwgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QQVJFTikgPT0gMCkpKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQotCSAgICAgIG5vY29tbWEgPSAwOwotCQkKLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX0RSRUcpICE9IDApCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQgKyBleHRyYV9zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImQlZCIsIHZhbHVlKTsKLQkJfQotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX0FSRUcpICE9IDApCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQgKyBleHRyYV9zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImElZCIsIHZhbHVlKTsKLQkJfQotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BTVykgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJwc3ciKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9NRFIpICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAibWRyIik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUEFSRU4pICE9IDApCi0JCXsKLQkJICBpZiAocGFyZW4pCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCIpOwotCQkgICAgICBub2NvbW1hID0gMTsKLQkJICAgIH0KLQkJICBwYXJlbiA9ICFwYXJlbjsKLQkJfQotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BDUkVMKSAhPSAwKQotCQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKCh2YWx1ZSArIG1lbWFkZHIgKyBteXNpemUpICYgMHhmZmZmZmYsIGluZm8pOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX01FTUFERFIpICE9IDApCi0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotCi0JICAgICAgZWxzZSAKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci0JICAgIH0KLQkgIC8qIEFsbCBkb25lLiAqLwotCSAgYnJlYWs7Ci0JfQotICAgICAgb3ArKzsKLSAgICB9Ci0KLSAgaWYgKCFtYXRjaCkKLSAgICB7Ci0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIF8oInVua25vd25cdDB4JTA0bHgiKSwgaW5zbik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMTAyMDAtb3BjLmMgYi9vcGNvZGVzL20xMDIwMC1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3MGI5MC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20xMDIwMC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKiBBc3NlbWJsZSBNYXRzdXNoaXRhIE1OMTAyMDAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvbW4xMDIwMC5oIgotCi0MCi1jb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kIG1uMTAyMDBfb3BlcmFuZHNbXSA9IHsKLSNkZWZpbmUgVU5VU0VECTAKLSAgezAsIDAsIDB9LCAKLQotLyogZG4gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETjAgICAgICAoVU5VU0VEKzEpCi0gIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGRuIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEROMSAgICAgIChETjArMSkKLSAgezIsIDIsIE1OMTAyMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG0gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETTAgICAgICAoRE4xKzEpCi0gIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGRtIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIERNMSAgICAgIChETTArMSkKLSAgezIsIDIsIE1OMTAyMDBfT1BFUkFORF9EUkVHfSwKLQotLyogYW4gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTjAgICAgICAoRE0xKzEpCi0gIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFuIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFOMSAgICAgIChBTjArMSkKLSAgezIsIDIsIE1OMTAyMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW0gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTTAgICAgICAoQU4xKzEpCi0gIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFtIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFNMSAgICAgIChBTTArMSkKLSAgezIsIDIsIE1OMTAyMDBfT1BFUkFORF9BUkVHfSwKLQotLyogOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMTZiaXQKLSAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTggICAgKEFNMSsxKQotICB7OCwgMCwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQKLSAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTE2ICAgIChJTU04KzEpCi0gIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgcGMtcmVsYXRpdmUgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMTZiaXQKLSAgIHBjLXJlbGF0aXZlIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTE2X1BDUkVMICAgIChJTU0xNisxKQotICB7MTYsIDAsIE1OMTAyMDBfT1BFUkFORF9QQ1JFTCB8IE1OMTAyMDBfT1BFUkFORF9SRUxBWCB8IE1OMTAyMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiAxNmJpdCB1bnNpZ25lZCBkaXNwYWNlbWVudCBpbiBhIG1lbW9yeSBvcGVyYXRpb24gd2hpY2gKLSAgIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgSU1NMTZfTUVNICAgIChJTU0xNl9QQ1JFTCsxKQotICB7MTYsIDAsIE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFIHwgTU4xMDIwMF9PUEVSQU5EX01FTUFERFJ9LAotCi0vKiAyNCBpbW1lZGlhdGUsIGxvdyAxNiBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uCi0gICB3b3JkLCA4IGluIHRoZSBleHRlbnNpb24gd29yZC4gICovCi0KLSNkZWZpbmUgSU1NMjQgICAgKElNTTE2X01FTSsxKQotICB7MjQsIDAsIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRH0sCi0KLS8qIDMyYml0IHBjLXJlbGF0aXZlIG9mZnNldC4gICovCi0jZGVmaW5lIElNTTI0X1BDUkVMICAgIChJTU0yNCsxKQotICB7MjQsIDAsIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRCB8IE1OMTAyMDBfT1BFUkFORF9QQ1JFTCB8IE1OMTAyMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiAzMmJpdCBtZW1vcnkgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgSU1NMjRfTUVNICAgIChJTU0yNF9QQ1JFTCsxKQotICB7MjQsIDAsIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRCB8IE1OMTAyMDBfT1BFUkFORF9NRU1BRERSfSwKLQotLyogUHJvY2Vzc29yIHN0YXR1cyB3b3JkLiAgKi8KLSNkZWZpbmUgUFNXICAgIChJTU0yNF9NRU0rMSkKLSAgezAsIDAsIE1OMTAyMDBfT1BFUkFORF9QU1d9LAotCi0vKiBNRFIgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBNRFIgICAgKFBTVysxKQotICB7MCwgMCwgTU4xMDIwMF9PUEVSQU5EX01EUn0sCi0KLS8qIEluZGV4IHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgREkgKE1EUisxKQotICB7MiwgNCwgTU4xMDIwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiA4IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50LCBtYXkgcHJvbW90ZSB0byAxNmJpdCBzaWduZWQgZGlzcGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDggICAgKERJKzEpCi0gIHs4LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCwgbWF5IHByb21vdGUgdG8gMzJiaXQgZGlzcGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDE2ICAgIChTRDgrMSkKLSAgezE2LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiA4IGJpdCBwYy1yZWxhdGl2ZSBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDhOX1BDUkVMICAgIChTRDE2KzEpCi0gIHs4LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDIwMF9PUEVSQU5EX1JFTEFYfSwKLQotLyogOCBiaXQgc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byAxNmJpdCBzaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgU0lNTTggICAgKFNEOE5fUENSRUwrMSkKLSAgezgsIDAsIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIDMyYml0ICBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBTSU1NMTYgICAgKFNJTU04KzEpCi0gIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IG5vdCBwcm9tb3RlLiAgKi8KLSNkZWZpbmUgU0lNTTE2TiAgICAoU0lNTTE2KzEpCi0gIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAyMDBfT1BFUkFORF9OT0NIRUNLfSwKLQotLyogRWl0aGVyIGFuIG9wZW4gcGFyZW4gb3IgY2xvc2UgcGFyZW4uICAqLwotI2RlZmluZSBQQVJFTgkoU0lNTTE2TisxKQotICB7MCwgMCwgTU4xMDIwMF9PUEVSQU5EX1BBUkVOfSwgCi0KLS8qIGRuIHJlZ2lzdGVyIHRoYXQgYXBwZWFycyBpbiB0aGUgZmlyc3QgYW5kIHNlY29uZCByZWdpc3RlciBwb3NpdGlvbnMuICAqLwotI2RlZmluZSBETjAxICAgICAoUEFSRU4rMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9EUkVHIHwgTU4xMDIwMF9PUEVSQU5EX1JFUEVBVEVEfSwKLQotLyogYW4gcmVnaXN0ZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHJlZ2lzdGVyIHBvc2l0aW9ucy4gICovCi0jZGVmaW5lIEFOMDEgICAgIChETjAxKzEpCi0gIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfQVJFRyB8IE1OMTAyMDBfT1BFUkFORF9SRVBFQVRFRH0sCi19IDsgCi0KLSNkZWZpbmUgTUVNKEFERFIpIFBBUkVOLCBBRERSLCBQQVJFTiAKLSNkZWZpbmUgTUVNMihBRERSMSxBRERSMikgUEFSRU4sIEFERFIxLCBBRERSMiwgUEFSRU4gCi0MCi0vKiBUaGUgb3Bjb2RlIHRhYmxlLgotCi0gICBUaGUgZm9ybWF0IG9mIHRoZSBvcGNvZGUgdGFibGUgaXM6Ci0KLSAgIE5BTUUJCU9QQ09ERQkJTUFTSwkJeyBPUEVSQU5EUyB9Ci0KLSAgIE5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uLgotICAgT1BDT0RFIGlzIHRoZSBpbnN0cnVjdGlvbiBvcGNvZGUuCi0gICBNQVNLIGlzIHRoZSBvcGNvZGUgbWFzazsgdGhpcyBpcyB1c2VkIHRvIHRlbGwgdGhlIGRpc2Fzc2VtYmxlcgotICAgICB3aGljaCBiaXRzIGluIHRoZSBhY3R1YWwgb3Bjb2RlIG11c3QgbWF0Y2ggT1BDT0RFLgotICAgT1BFUkFORFMgaXMgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCi0KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcmVhZHMgdGhlIHRhYmxlIGluIG9yZGVyIGFuZCBwcmludHMgdGhlIGZpcnN0Ci0gICBpbnN0cnVjdGlvbiB3aGljaCBtYXRjaGVzLCBzbyB0aGlzIHRhYmxlIGlzIHNvcnRlZCB0byBwdXQgbW9yZQotICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBtb3JlIGdlbmVyYWwgaW5zdHJ1Y3Rpb25zLiAgSXQgaXMgYWxzbwotICAgc29ydGVkIGJ5IG1ham9yIG9wY29kZS4gICovCi0KLWNvbnN0IHN0cnVjdCBtbjEwMjAwX29wY29kZSBtbjEwMjAwX29wY29kZXNbXSA9IHsKLXsgIm1vdiIsCTB4ODAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7U0lNTTgsIEROMDF9fSwKLXsgIm1vdiIsCTB4ODAsCQkweGYwLAkJRk1UXzEsIHtETjEsIERNMH19LAoteyAibW92IiwJMHhmMjMwLAkJMHhmZmYwLAkJRk1UXzQsIHtETTEsIEFOMH19LAoteyAibW92IiwJMHhmMmYwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIERNMH19LAoteyAibW92IiwJMHhmMjcwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIEFNMH19LAoteyAibW92IiwJMHhmM2YwLAkJMHhmZmZjLAkJRk1UXzQsIHtQU1csIEROMH19LAoteyAibW92IiwJMHhmM2QwLAkJMHhmZmYzLAkJRk1UXzQsIHtETjEsIFBTV319LAoteyAibW92IiwJMHhmM2UwLAkJMHhmZmZjLAkJRk1UXzQsIHtNRFIsIEROMH19LAoteyAibW92IiwJMHhmM2MwLAkJMHhmZmYzLAkJRk1UXzQsIHtETjEsIE1EUn19LAoteyAibW92IiwJMHgyMCwJCTB4ZjAsCQlGTVRfMSwge01FTShBTjEpLCBETTB9fSwKLXsgIm1vdiIsCTB4NjAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7TUVNMihTRDgsIEFOMSksIERNMH19LAoteyAibW92IiwJMHhmN2MwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtNRU0yKFNEMTYsIEFOMSksIERNMH19LAoteyAibW92IiwJMHhmNDgwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtNRU0yKElNTTI0LEFOMSksIERNMH19LAoteyAibW92IiwJMHhmMTQwLAkJMHhmZmMwLAkJRk1UXzQsIHtNRU0yKERJLCBBTjEpLCBETTB9fSwKLXsgIm1vdiIsCTB4YzgwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtNRU0oSU1NMTZfTUVNKSwgRE4wfX0sCi17ICJtb3YiLAkweGY0YzAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge01FTShJTU0yNF9NRU0pLCBETjB9fSwKLXsgIm1vdiIsCTB4NzAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7TUVNMihTRDgsQU4xKSwgQU0wfX0sCi17ICJtb3YiLAkweDcwMDAsCQkweGYwMDAsCQlGTVRfMiwge01FTShBTjEpLCBBTTB9fSwKLXsgIm1vdiIsCTB4ZjdiMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7TUVNMihTRDE2LCBBTjEpLCBBTTB9fSwKLXsgIm1vdiIsCTB4ZjRmMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7TUVNMihJTU0yNCxBTjEpLCBBTTB9fSwKLXsgIm1vdiIsCTB4ZjEwMCwJCTB4ZmZjMCwJCUZNVF80LCB7TUVNMihESSwgQU4xKSwgQU0wfX0sCi17ICJtb3YiLAkweGY3MzAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge01FTShJTU0xNl9NRU0pLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjRkMDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7TUVNKElNTTI0X01FTSksIEFOMH19LAoteyAibW92IiwJMHgwMCwJCTB4ZjAsCQlGTVRfMSwge0RNMCwgTUVNKEFOMSl9fSwKLXsgIm1vdiIsCTB4NDAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7RE0wLCBNRU0yKFNEOCwgQU4xKX19LAoteyAibW92IiwJMHhmNzgwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtETTAsIE1FTTIoU0QxNiwgQU4xKX19LAoteyAibW92IiwJMHhmNDAwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtETTAsIE1FTTIoSU1NMjQsIEFOMSl9fSwKLXsgIm1vdiIsCTB4ZjFjMCwJCTB4ZmZjMCwJCUZNVF80LCB7RE0wLCBNRU0yKERJLCBBTjEpfX0sCi17ICJtb3YiLAkweGMwMDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7RE4wLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92IiwJMHhmNDQwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtETjAsIE1FTShJTU0yNF9NRU0pfX0sCi17ICJtb3YiLAkweDUwMDAsCQkweGYwMDAsCQlGTVRfMiwge0FNMCwgTUVNMihTRDgsIEFOMSl9fSwKLXsgIm1vdiIsCTB4NTAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7QU0wLCBNRU0oQU4xKX19LAoteyAibW92IiwJMHhmN2EwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtBTTAsIE1FTTIoU0QxNiwgQU4xKX19LAoteyAibW92IiwJMHhmNDEwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtBTTAsIE1FTTIoSU1NMjQsQU4xKX19LAoteyAibW92IiwJMHhmMTgwLAkJMHhmZmMwLAkJRk1UXzQsIHtBTTAsIE1FTTIoREksIEFOMSl9fSwKLXsgIm1vdiIsCTB4ZjcyMDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7QU4wLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92IiwJMHhmNDUwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtBTjAsIE1FTShJTU0yNF9NRU0pfX0sCi17ICJtb3YiLAkweGY4MDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7U0lNTTE2LCBETjB9fSwKLXsgIm1vdiIsCTB4ZjQ3MDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEROMH19LAoteyAibW92IiwJMHhkYzAwMDAsCTB4ZmMwMDAwLAlGTVRfMywge0lNTTE2LCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjQ3NDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEFOMH19LAotCi17ICJtb3Z4IiwJMHhmNTcwMDAsCTB4ZmZmMDAwLAlGTVRfNSwge01FTTIoU0Q4LCBBTjEpLCBETTB9fSwKLXsgIm1vdngiLAkweGY3NzAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge01FTTIoU0QxNiwgQU4xKSwgRE0wfX0sCi17ICJtb3Z4IiwJMHhmNGIwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtNRU0yKElNTTI0LEFOMSksIERNMH19LAoteyAibW92eCIsCTB4ZjU1MDAwLAkweGZmZjAwMCwJRk1UXzUsIHtETTAsIE1FTTIoU0Q4LCBBTjEpfX0sCi17ICJtb3Z4IiwJMHhmNzYwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtETTAsIE1FTTIoU0QxNiwgQU4xKX19LAoteyAibW92eCIsCTB4ZjQzMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7RE0wLCBNRU0yKElNTTI0LCBBTjEpfX0sCi0KLXsgIm1vdmIiLAkweGY1MjAwMCwJMHhmZmYwMDAsCUZNVF81LCB7TUVNMihTRDgsIEFOMSksIERNMH19LAoteyAibW92YiIsCTB4ZjdkMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7TUVNMihTRDE2LCBBTjEpLCBETTB9fSwKLXsgIm1vdmIiLAkweGY0YTAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge01FTTIoSU1NMjQsQU4xKSwgRE0wfX0sCi17ICJtb3ZiIiwJMHhmMDQwLAkJMHhmZmMwLAkJRk1UXzQsIHtNRU0yKERJLCBBTjEpLCBETTB9fSwKLXsgIm1vdmIiLAkweGY0YzQwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge01FTShJTU0yNF9NRU0pLCBETjB9fSwKLXsgIm1vdmIiLAkweDEwLAkJMHhmMCwJCUZNVF8xLCB7RE0wLCBNRU0oQU4xKX19LAoteyAibW92YiIsCTB4ZjUxMDAwLAkweGZmZjAwMCwJRk1UXzUsIHtETTAsIE1FTTIoU0Q4LCBBTjEpfX0sCi17ICJtb3ZiIiwJMHhmNzkwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtETTAsIE1FTTIoU0QxNiwgQU4xKX19LAoteyAibW92YiIsCTB4ZjQyMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7RE0wLCBNRU0yKElNTTI0LCBBTjEpfX0sCi17ICJtb3ZiIiwJMHhmMGMwLAkJMHhmZmMwLAkJRk1UXzQsIHtETTAsIE1FTTIoREksIEFOMSl9fSwKLXsgIm1vdmIiLAkweGM0MDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7RE4wLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92YiIsCTB4ZjQ0NDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7RE4wLCBNRU0oSU1NMjRfTUVNKX19LAotCi17ICJtb3ZidSIsCTB4MzAsCQkweGYwLAkJRk1UXzEsIHtNRU0oQU4xKSwgRE0wfX0sCi17ICJtb3ZidSIsCTB4ZjUzMDAwLAkweGZmZjAwMCwJRk1UXzUsIHtNRU0yKFNEOCwgQU4xKSwgRE0wfX0sCi17ICJtb3ZidSIsCTB4Zjc1MDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7TUVNMihTRDE2LCBBTjEpLCBETTB9fSwKLXsgIm1vdmJ1IiwJMHhmNDkwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtNRU0yKElNTTI0LEFOMSksIERNMH19LAoteyAibW92YnUiLAkweGYwODAsCQkweGZmYzAsCQlGTVRfNCwge01FTTIoREksIEFOMSksIERNMH19LAoteyAibW92YnUiLAkweGNjMDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7TUVNKElNTTE2X01FTSksIEROMH19LAoteyAibW92YnUiLAkweGY0YzgwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge01FTShJTU0yNF9NRU0pLCBETjB9fSwKLQoteyAiZXh0IiwJMHhmM2MxLAkJMHhmZmYzLAkJRk1UXzQsIHtETjF9fSwKLXsgImV4dHgiLAkweGIwLCAJCTB4ZmMsCQlGTVRfMSwge0ROMH19LAoteyAiZXh0eHUiLAkweGI0LAkJMHhmYywJCUZNVF8xLCB7RE4wfX0sCi17ICJleHR4YiIsCTB4YjgsCQkweGZjLAkJRk1UXzEsIHtETjB9fSwKLXsgImV4dHhidSIsCTB4YmMsCQkweGZjLAkJRk1UXzEsIHtETjB9fSwKLQoteyAiYWRkIiwJMHg5MCwJCTB4ZjAsCQlGTVRfMSwge0ROMSwgRE0wfX0sCi17ICJhZGQiLAkweGYyMDAsCQkweGZmZjAsCQlGTVRfNCwge0RNMSwgQU4wfX0sCi17ICJhZGQiLAkweGYyYzAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgRE0wfX0sCi17ICJhZGQiLAkweGYyNDAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgQU0wfX0sCi17ICJhZGQiLAkweGQ0MDAsCQkweGZjMDAsCQlGTVRfMiwge1NJTU04LCBETjB9fSwKLXsgImFkZCIsCTB4ZjcxODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2LCBETjB9fSwKLXsgImFkZCIsCTB4ZjQ2MDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEROMH19LAoteyAiYWRkIiwJMHhkMDAwLAkJMHhmYzAwLAkJRk1UXzIsIHtTSU1NOCwgQU4wfX0sCi17ICJhZGQiLAkweGY3MDgwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge1NJTU0xNiwgQU4wfX0sCi17ICJhZGQiLAkweGY0NjQwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0lNTTI0LCBBTjB9fSwKLXsgImFkZGMiLAkweGYyODAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi17ICJhZGRuZiIsCTB4ZjUwYzAwLAkweGZmZmMwMCwJRk1UXzUsIHtTSU1NOCwgQU4wfX0sCi0KLXsgInN1YiIsCTB4YTAsCQkweGYwLAkJRk1UXzEsIHtETjEsIERNMH19LAoteyAic3ViIiwJMHhmMjEwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIEFOMH19LAoteyAic3ViIiwJMHhmMmQwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIERNMH19LAoteyAic3ViIiwJMHhmMjUwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIEFNMH19LAoteyAic3ViIiwJMHhmNzFjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtJTU0xNiwgRE4wfX0sCi17ICJzdWIiLAkweGY0NjgwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0lNTTI0LCBETjB9fSwKLXsgInN1YiIsCTB4ZjcwYzAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7SU1NMTYsIEFOMH19LAoteyAic3ViIiwJMHhmNDZjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgQU4wfX0sCi17ICJzdWJjIiwJMHhmMjkwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAotCi17ICJtdWwiLAkweGYzNDAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi17ICJtdWx1IiwJMHhmMzUwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAotCi17ICJkaXZ1IiwJMHhmMzYwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAotCi17ICJjbXAiLAkweGYzOTAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi17ICJjbXAiLAkweGYyMjAsCQkweGZmZjAsCQlGTVRfNCwge0RNMSwgQU4wfX0sCi17ICJjbXAiLAkweGYyZTAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgRE0wfX0sCi17ICJjbXAiLAkweGYyNjAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgQU0wfX0sCi17ICJjbXAiLAkweGQ4MDAsCQkweGZjMDAsCQlGTVRfMiwge1NJTU04LCBETjB9fSwKLXsgImNtcCIsCTB4Zjc0ODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2LCBETjB9fSwKLXsgImNtcCIsCTB4ZjQ3ODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEROMH19LAoteyAiY21wIiwJMHhlYzAwMDAsCTB4ZmMwMDAwLAlGTVRfMywge0lNTTE2LCBBTjB9fSwKLXsgImNtcCIsCTB4ZjQ3YzAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEFOMH19LAotCi17ICJhbmQiLAkweGYzMDAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi17ICJhbmQiLAkweGY1MDAwMCwJMHhmZmZjMDAsCUZNVF81LCB7SU1NOCwgRE4wfX0sCi17ICJhbmQiLAkweGY3MDAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge1NJTU0xNk4sIEROMH19LAoteyAiYW5kIiwJMHhmNzEwMDAwMCwJMHhmZmZmMDAwMCwJRk1UXzYsIHtTSU1NMTZOLCBQU1d9fSwKLXsgIm9yIiwJCTB4ZjMxMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLXsgIm9yIiwJCTB4ZjUwODAwLAkweGZmZmMwMCwJRk1UXzUsIHtJTU04LCBETjB9fSwKLXsgIm9yIiwJCTB4Zjc0MDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2TiwgRE4wfX0sCi17ICJvciIsCQkweGY3MTQwMDAwLAkweGZmZmYwMDAwLAlGTVRfNiwge1NJTU0xNk4sIFBTV319LAoteyAieG9yIiwJMHhmMzIwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAoteyAieG9yIiwJMHhmNzRjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTZOLCBETjB9fSwKLXsgIm5vdCIsCTB4ZjNlNCwJCTB4ZmZmYywJCUZNVF80LCB7RE4wfX0sCi0KLXsgImFzciIsCTB4ZjMzOCwJCTB4ZmZmYywJCUZNVF80LCB7RE4wfX0sCi17ICJsc3IiLAkweGYzM2MsCQkweGZmZmMsCQlGTVRfNCwge0ROMH19LAoteyAicm9yIiwJMHhmMzM0LAkJMHhmZmZjLAkJRk1UXzQsIHtETjB9fSwKLXsgInJvbCIsCTB4ZjMzMCwJCTB4ZmZmYywJCUZNVF80LCB7RE4wfX0sCi0KLXsgImJ0c3QiLAkweGY1MDQwMCwJMHhmZmZjMDAsCUZNVF81LCB7SU1NOCwgRE4wfX0sCi17ICJidHN0IiwJMHhmNzA0MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTZOLCBETjB9fSwKLXsgImJzZXQiLAkweGYwMjAsCQkweGZmZjAsCQlGTVRfNCwge0RNMCwgTUVNKEFOMSl9fSwKLXsgImJjbHIiLAkweGYwMzAsCQkweGZmZjAsCQlGTVRfNCwge0RNMCwgTUVNKEFOMSl9fSwKLQoteyAiYmVxIiwJMHhlODAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJibmUiLAkweGU5MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJsdCIsCTB4ZTAwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmxlIiwJMHhlMzAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJiZ2UiLAkweGUyMDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJndCIsCTB4ZTEwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmNzIiwJMHhlNDAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJibHMiLAkweGU3MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJjYyIsCTB4ZTYwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmhpIiwJMHhlNTAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJidmMiLAkweGY1ZmMwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYnZzIiwJMHhmNWZkMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJuYyIsCTB4ZjVmZTAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibnMiLAkweGY1ZmYwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYnJhIiwJMHhlYTAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi0KLXsgImJlcXgiLAkweGY1ZTgwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYm5leCIsCTB4ZjVlOTAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibHR4IiwJMHhmNWUwMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJsZXgiLAkweGY1ZTMwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmdleCIsCTB4ZjVlMjAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJiZ3R4IiwJMHhmNWUxMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJjc3giLAkweGY1ZTQwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmxzeCIsCTB4ZjVlNzAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJiY2N4IiwJMHhmNWU2MDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJoaXgiLAkweGY1ZTUwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYnZjeCIsCTB4ZjVlYzAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJidnN4IiwJMHhmNWVkMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJuY3giLAkweGY1ZWUwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYm5zeCIsCTB4ZjVlZjAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi0KLXsgImptcCIsCTB4ZmMwMDAwLAkweGZmMDAwMCwJRk1UXzMsIHtJTU0xNl9QQ1JFTH19LAoteyAiam1wIiwJMHhmNGUwMDAwMCwJMHhmZmZmMDAwMCwJRk1UXzcsIHtJTU0yNF9QQ1JFTH19LAoteyAiam1wIiwJMHhmMDAwLAkJMHhmZmYzLAkJRk1UXzQsIHtQQVJFTixBTjEsUEFSRU59fSwKLXsgImpzciIsCTB4ZmQwMDAwLAkweGZmMDAwMCwJRk1UXzMsIHtJTU0xNl9QQ1JFTH19LAoteyAianNyIiwJMHhmNGUxMDAwMCwJMHhmZmZmMDAwMCwJRk1UXzcsIHtJTU0yNF9QQ1JFTH19LAoteyAianNyIiwJMHhmMDAxLAkJMHhmZmYzLAkJRk1UXzQsIHtQQVJFTixBTjEsUEFSRU59fSwKLQoteyAibm9wIiwJMHhmNiwJCTB4ZmYsCQlGTVRfMSwge1VOVVNFRH19LAotCi17ICJydHMiLAkweGZlLAkJMHhmZiwJCUZNVF8xLCB7VU5VU0VEfX0sCi17ICJydGkiLAkweGViLAkJMHhmZiwJCUZNVF8xLCB7VU5VU0VEfX0sCi0KLS8qIEV4dGVuc2lvbi4gIFdlIG5lZWQgc29tZSBpbnN0cnVjdGlvbiB0byB0cmlnZ2VyICJlbXVsYXRlZCBzeXNjYWxscyIKLSAgIGZvciBvdXIgc2ltdWxhdG9yLiAgKi8KLXsgInN5c2NhbGwiLAkweGYwMTAsCQkweGZmZmYsCQlGTVRfNCwge1VOVVNFRH19LAotCi0vKiBFeHRlbnNpb24uICBXaGVuIHRhbGtpbmcgdG8gdGhlIHNpbXVsYXRvciwgZ2RiIHJlcXVpcmVzIHNvbWUgaW5zdHJ1Y3Rpb24KLSAgIHRoYXQgd2lsbCB0cmlnZ2VyIGEgImJyZWFrcG9pbnQiIChyZWFsbHkganVzdCBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzbid0Ci0gICBvdGhlcndpc2UgdXNlZCBieSB0aGUgdG9vbHMuICBUaGlzIGluc3RydWN0aW9uIG11c3QgYmUgdGhlIHNhbWUgc2l6ZQotICAgYXMgdGhlIHNtYWxsZXN0IGluc3RydWN0aW9uIG9uIHRoZSB0YXJnZXQgbWFjaGluZS4gIEluIHRoZSBjYXNlIG9mIHRoZQotICAgbW4xMHgwMCB0aGUgImJyZWFrIiBpbnN0cnVjdGlvbiBtdXN0IGJlIG9uZSBieXRlLiAgMHhmZiBpcyBhdmFpbGFibGUgb24KLSAgIGJvdGggbW4xMHgwMCBhcmNoaXRlY3R1cmVzLiAgKi8KLXsgImJyZWFrIiwgICAgICAweGZmLCAgICAgICAgICAgMHhmZiwgICAgICAgICAgIEZNVF8xLCB7VU5VU0VEfX0sCi0KLXsgMCwgMCwgMCwgMCwgezB9fSwKLQotfSA7Ci0KLWNvbnN0IGludCBtbjEwMjAwX251bV9vcGNvZGVzID0KLSAgc2l6ZW9mIChtbjEwMjAwX29wY29kZXMpIC8gc2l6ZW9mIChtbjEwMjAwX29wY29kZXNbMF0pOwotCi0MCmRpZmYgLS1naXQgYS9vcGNvZGVzL20xMDMwMC1kaXMuYyBiL29wY29kZXMvbTEwMzAwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTViZmZjLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTEwMzAwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ4ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIE1OMTAzMDAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvbW4xMDMwMC5oIiAKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLXN0YXRpYyB2b2lkIGRpc2Fzc2VtYmxlIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosCi0JCQkJIHVuc2lnbmVkIGxvbmcgaW5zbiwgdW5zaWduZWQgaW50KSk7Ci0KLWludCAKLXByaW50X2luc25fbW4xMDMwMCAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IHN0YXR1czsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHVuc2lnbmVkIGludCBjb25zdW1lOwotCi0gIC8qIEZpcnN0IGZpZ3VyZSBvdXQgaG93IGJpZyB0aGUgb3Bjb2RlIGlzLiAgKi8KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAxLCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaW5zbiA9ICoodW5zaWduZWQgY2hhciAqKSBidWZmZXI7Ci0KLSAgLyogVGhlc2UgYXJlIG9uZSBieXRlIGluc25zLiAgKi8KLSAgaWYgKChpbnNuICYgMHhmMykgPT0gMHgwMAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweDEwCi0gICAgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4M2MKLSAgICAgIHx8IChpbnNuICYgMHhmMykgPT0gMHg0MQotICAgICAgfHwgKGluc24gJiAweGYzKSA9PSAweDQwCi0gICAgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4NTAKLSAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHg1NAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweDYwCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NzAKLSAgICAgIHx8ICgoaW5zbiAmIDB4ZjApID09IDB4ODAKLQkgICYmIChpbnNuICYgMHgwYykgPj4gMiAhPSAoaW5zbiAmIDB4MDMpKQotICAgICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHg5MAotCSAgJiYgKGluc24gJiAweDBjKSA+PiAyICE9IChpbnNuICYgMHgwMykpCi0gICAgICB8fCAoKGluc24gJiAweGYwKSA9PSAweGEwCi0JICAmJiAoaW5zbiAmIDB4MGMpID4+IDIgIT0gKGluc24gJiAweDAzKSkKLSAgICAgIHx8ICgoaW5zbiAmIDB4ZjApID09IDB4YjAKLQkgICYmIChpbnNuICYgMHgwYykgPj4gMiAhPSAoaW5zbiAmIDB4MDMpKQotICAgICAgfHwgKGluc24gJiAweGZmKSA9PSAweGNiCi0gICAgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDAKLSAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhkNAotICAgICAgfHwgKGluc24gJiAweGZjKSA9PSAweGQ4Ci0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4ZTAKLSAgICAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmZikKLSAgICB7Ci0gICAgICBjb25zdW1lID0gMTsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIHR3byBieXRlIGluc25zLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGYwKSA9PSAweDgwCi0JICAgfHwgKGluc24gJiAweGYwKSA9PSAweDkwCi0JICAgfHwgKGluc24gJiAweGYwKSA9PSAweGEwCi0JICAgfHwgKGluc24gJiAweGYwKSA9PSAweGIwCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDIwCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDI4Ci0JICAgfHwgKGluc24gJiAweGYzKSA9PSAweDQzCi0JICAgfHwgKGluc24gJiAweGYzKSA9PSAweDQyCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDU4Ci0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDVjCi0JICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHhjMAotCSAgICAgICAmJiAoaW5zbiAmIDB4ZmYpICE9IDB4Y2IKLQkgICAgICAgJiYgKGluc24gJiAweGZmKSAhPSAweGNjCi0JICAgICAgICYmIChpbnNuICYgMHhmZikgIT0gMHhjZCkKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjAKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjEKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjIKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjMKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjQKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjUKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjYpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0gICAgICBjb25zdW1lID0gMjsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIHRocmVlIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZmYpID09IDB4ZjgKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4Y2MgCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY5Ci0JICAgfHwgKGluc24gJiAweGYzKSA9PSAweDAxCi0JICAgfHwgKGluc24gJiAweGYzKSA9PSAweDAyCi0JICAgfHwgKGluc24gJiAweGYzKSA9PSAweDAzCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDI0Ci0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDJjCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDMwCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDM0Ci0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDM4Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGRlCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGRmCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGNjKQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0gICAgICBpbnNuIDw8PSA4OwotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDIsIGJ1ZmZlciwgMSwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiB8PSAqKHVuc2lnbmVkIGNoYXIgKilidWZmZXI7Ci0gICAgICBjb25zdW1lID0gMzsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIGZvdXIgYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmYQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmYikKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotICAgICAgY29uc3VtZSA9IDQ7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSBmaXZlIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZmYpID09IDB4Y2QKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZGMpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgICAgIGNvbnN1bWUgPSA1OwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgc2l4IGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZmYpID09IDB4ZmQKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmMpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotICAgICAgY29uc3VtZSA9IDY7Ci0gICAgfQotCi0gIC8qIEVsc2UgaXRzIGEgc2V2ZW4gYnl0ZSBpbnNucyAoaW4gdGhlb3J5KS4gICovCi0gIGVsc2UKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gICAgICBjb25zdW1lID0gNzsKLSAgICB9Ci0KLSAgZGlzYXNzZW1ibGUgKG1lbWFkZHIsIGluZm8sIGluc24sIGNvbnN1bWUpOwotCi0gIHJldHVybiBjb25zdW1lOwotfQotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGUgKG1lbWFkZHIsIGluZm8sIGluc24sIHNpemUpCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBtbjEwMzAwX29wY29kZSAqb3AgPSAoc3RydWN0IG1uMTAzMDBfb3Bjb2RlICopbW4xMDMwMF9vcGNvZGVzOwotICBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kICpvcGVyYW5kOwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHVuc2lnbmVkIGxvbmcgZXh0ZW5zaW9uID0gMDsKLSAgaW50IHN0YXR1cywgbWF0Y2ggPSAwOwotCi0gIC8qIEZpbmQgdGhlIG9wY29kZS4gICovCi0gIHdoaWxlIChvcC0+bmFtZSkKLSAgICB7Ci0gICAgICBpbnQgbXlzaXplLCBleHRyYV9zaGlmdDsKLQotICAgICAgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX1MwKQotCW15c2l6ZSA9IDE7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9TMQotCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF9EMCkKLQlteXNpemUgPSAyOwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfUzIKLQkgICAgICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfRDEpCi0JbXlzaXplID0gMzsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX1M0KQotCW15c2l6ZSA9IDU7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9EMikKLQlteXNpemUgPSA0OwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDQpCi0JbXlzaXplID0gNjsKLSAgICAgIGVsc2UKLQlteXNpemUgPSA3OwotCQotICAgICAgaWYgKChvcC0+bWFzayAmIGluc24pID09IG9wLT5vcGNvZGUKLQkgICYmIHNpemUgPT0gKHVuc2lnbmVkIGludCkgbXlzaXplCi0JICAmJiAob3AtPm1hY2hpbmUgPT0gMAotCSAgICAgIHx8IG9wLT5tYWNoaW5lID09IGluZm8tPm1hY2gpKQotCXsKLQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXhfcHRyOwotCSAgdW5zaWduZWQgaW50IG5vY29tbWE7Ci0JICBpbnQgcGFyZW4gPSAwOwotCSAgCi0JICBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDEgfHwgb3AtPmZvcm1hdCA9PSBGTVRfUzEpCi0JICAgIGV4dHJhX3NoaWZ0ID0gODsKLQkgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0QyIHx8IG9wLT5mb3JtYXQgPT0gRk1UX0Q0Ci0JCSAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX1MyIHx8IG9wLT5mb3JtYXQgPT0gRk1UX1M0Ci0JCSAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX1M2IHx8IG9wLT5mb3JtYXQgPT0gRk1UX0Q1KQotCSAgICBleHRyYV9zaGlmdCA9IDE2OwotCSAgZWxzZQotCSAgICBleHRyYV9zaGlmdCA9IDA7Ci0KLQkgIGlmIChzaXplID09IDEgfHwgc2l6ZSA9PSAyKQotCSAgICB7Ci0JICAgICAgZXh0ZW5zaW9uID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSAzCi0JCSAgICYmIChvcC0+Zm9ybWF0ID09IEZNVF9EMQotCQkgICAgICAgfHwgb3AtPm9wY29kZSA9PSAweGRmMDAwMAotCQkgICAgICAgfHwgb3AtPm9wY29kZSA9PSAweGRlMDAwMCkpCi0JICAgIHsKLQkgICAgICBleHRlbnNpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDMpCi0JICAgIHsKLQkgICAgICBpbnNuICY9IDB4ZmYwMDAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAxLCBidWZmZXIsIDIsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCi0JICAgICAgaW5zbiB8PSBiZmRfZ2V0bDE2IChidWZmZXIpOwotCSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gNAotCQkgICAmJiAob3AtPm9wY29kZSA9PSAweGZhZjgwMDAwCi0JCSAgICAgICB8fCBvcC0+b3Bjb2RlID09IDB4ZmFmMDAwMDAKLQkJICAgICAgIHx8IG9wLT5vcGNvZGUgPT0gMHhmYWY0MDAwMCkpCi0JICAgIHsKLQkgICAgICBleHRlbnNpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDQpCi0JICAgIHsKLQkgICAgICBpbnNuICY9IDB4ZmZmZjAwMDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0KLQkgICAgICBpbnNuIHw9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0JICAgICAgZXh0ZW5zaW9uID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA1ICYmIG9wLT5vcGNvZGUgPT0gMHhkYzAwMDAwMCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgdGVtcCB8PSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0JICAgICAgaW5zbiAmPSAweGZmMDAwMDAwOwotCSAgICAgIGluc24gfD0gKHRlbXAgJiAweGZmZmZmZjAwKSA+PiA4OwotCSAgICAgIGV4dGVuc2lvbiA9IHRlbXAgJiAweGZmOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDUpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAxLCBidWZmZXIsIDIsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIHRlbXAgfD0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLQotCSAgICAgIGluc24gJj0gMHhmZjAwMDBmZjsKLQkgICAgICBpbnNuIHw9IHRlbXAgPDwgODsKLQotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyA0LCBidWZmZXIsIDEsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGV4dGVuc2lvbiA9ICoodW5zaWduZWQgY2hhciAqKWJ1ZmZlcjsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA2KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB0ZW1wID0gMDsKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCA0LCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICB0ZW1wIHw9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0KLQkgICAgICBpbnNuICY9IDB4ZmZmZjAwMDA7Ci0JICAgICAgaW5zbiB8PSAodGVtcCA+PiAxNikgJiAweGZmZmY7Ci0JICAgICAgZXh0ZW5zaW9uID0gdGVtcCAmIDB4ZmZmZjsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA3ICYmIG9wLT5vcGNvZGUgPT0gMHhkZDAwMDAwMCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgdGVtcCB8PSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0JICAgICAgaW5zbiAmPSAweGZmMDAwMDAwOwotCSAgICAgIGluc24gfD0gKHRlbXAgPj4gOCkgJiAweGZmZmZmZjsKLQkgICAgICBleHRlbnNpb24gPSAodGVtcCAmIDB4ZmYpIDw8IDE2OwotCSAgICAgIAotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyA1LCBidWZmZXIsIDIsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGV4dGVuc2lvbiB8PSBiZmRfZ2V0YjE2IChidWZmZXIpOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDcpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAyLCBidWZmZXIsIDQsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIHRlbXAgfD0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLQotCSAgICAgIGluc24gJj0gMHhmZmZmMDAwMDsKLQkgICAgICBpbnNuIHw9ICh0ZW1wID4+IDE2KSAmIDB4ZmZmZjsKLQkgICAgICBleHRlbnNpb24gPSAodGVtcCAmIDB4ZmZmZikgPDwgODsKLQkgICAgICAKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgNiwgYnVmZmVyLCAxLCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBleHRlbnNpb24gfD0gKih1bnNpZ25lZCBjaGFyICopYnVmZmVyOwotCSAgICB9Ci0KLQkgIG1hdGNoID0gMTsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNcdCIsIG9wLT5uYW1lKTsKLQotCSAgLyogTm93IHByaW50IHRoZSBvcGVyYW5kcy4gICovCi0JICBmb3IgKG9waW5kZXhfcHRyID0gb3AtPm9wZXJhbmRzLCBub2NvbW1hID0gMTsKLQkgICAgICAgKm9waW5kZXhfcHRyICE9IDA7Ci0JICAgICAgIG9waW5kZXhfcHRyKyspCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotCi0JICAgICAgb3BlcmFuZCA9ICZtbjEwMzAwX29wZXJhbmRzWypvcGluZGV4X3B0cl07Ci0KLQotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpICE9IDApCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0JCSAgdmFsdWUgPSBpbnNuICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0JCSAgdmFsdWUgPDw9ICgzMiAtIG9wZXJhbmQtPmJpdHMpOwotCQkgIHRlbXAgPSBleHRlbnNpb24gPj4gb3BlcmFuZC0+c2hpZnQ7Ci0JCSAgdGVtcCAmPSAoKDEgPDwgKDMyIC0gb3BlcmFuZC0+Yml0cykpIC0gMSk7Ci0JCSAgdmFsdWUgfD0gdGVtcDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9FWFRFTkRFRCkgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKChleHRlbnNpb24gPj4gKG9wZXJhbmQtPnNoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdmFsdWUgPSAoKGluc24gPj4gKG9wZXJhbmQtPnNoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQl9Ci0KLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCkgIT0gMAotCQkgICkKLQkJdmFsdWUgPSAoKGxvbmcpKHZhbHVlIDw8ICgzMiAtIG9wZXJhbmQtPmJpdHMpKQotCQkJICA+PiAoMzIgLSBvcGVyYW5kLT5iaXRzKSk7Ci0KLQkgICAgICBpZiAoIW5vY29tbWEKLQkJICAmJiAoIXBhcmVuCi0JCSAgICAgIHx8ICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUEFSRU4pID09IDApKSkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0KLQkgICAgICBub2NvbW1hID0gMDsKLQkJCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9EUkVHKSAhPSAwKQotCQl7Ci0JCSAgdmFsdWUgPSAoKGluc24gPj4gKG9wZXJhbmQtPnNoaWZ0ICsgZXh0cmFfc2hpZnQpKQotCQkJICAgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSk7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJkJWQiLCB2YWx1ZSk7Ci0JCX0KLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9BUkVHKSAhPSAwKQotCQl7Ci0JCSAgdmFsdWUgPSAoKGluc24gPj4gKG9wZXJhbmQtPnNoaWZ0ICsgZXh0cmFfc2hpZnQpKQotCQkJICAgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSk7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhJWQiLCB2YWx1ZSk7Ci0JCX0KLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TUCkgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJzcCIpOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BTVykgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJwc3ciKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9NRFIpICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAibWRyIik7Ci0KLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QQVJFTikgIT0gMCkKLQkJewotCQkgIGlmIChwYXJlbikKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoIik7Ci0JCSAgICAgIG5vY29tbWEgPSAxOwotCQkgICAgfQotCQkgIHBhcmVuID0gIXBhcmVuOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUENSRUwpICE9IDApCi0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGxvbmcpIHZhbHVlICsgbWVtYWRkciwgaW5mbyk7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfTUVNQUREUikgIT0gMCkKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1QpICE9IDApCi0JCXsKLQkJICBpbnQgY29tbWEgPSAwOwotCi0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJbIik7Ci0JCSAgaWYgKHZhbHVlICYgMHg4MCkKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJkMiIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDQwKQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJkMyIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDIwKQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhMiIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDEwKQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhMyIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDA4KQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJvdGhlciIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIl0iKTsKLQkJfQotCi0JICAgICAgZWxzZSAKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIHZhbHVlKTsKLQkgICAgfQotCSAgLyogQWxsIGRvbmUuICovCi0JICBicmVhazsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICBpZiAoIW1hdGNoKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgXygidW5rbm93blx0MHglMDR4IiksIGluc24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTEwMzAwLW9wYy5jIGIvb3Bjb2Rlcy9tMTAzMDAtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMGMwZjMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMTAzMDAtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ODMgKzAsMCBAQAotLyogQXNzZW1ibGUgTWF0c3VzaGl0YSBNTjEwMzAwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGZvcm1hdHRlZCBhdCA+IDgwIGNvbHVtbnMuICBBdHRlbXB0aW5nIHRvIHJlYWQgaXQgb24gYQotICAgc2NyZWVlbiB3aXRoIGxlc3MgdGhhbiA4MCBjb2x1bW5zIHdpbGwgYmUgZGlmZmljdWx0LiAgKi8KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9tbjEwMzAwLmgiCi0KLQwKLWNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgbW4xMDMwMF9vcGVyYW5kc1tdID0gewotI2RlZmluZSBVTlVTRUQJMAotICB7MCwgMCwgMH0sIAotCi0vKiBkbiByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEROMCAgICAgIChVTlVTRUQrMSkKLSAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG4gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE4xICAgICAgKEROMCsxKQotICB7MiwgMiwgTU4xMDMwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBkbiByZWdpc3RlciBpbiB0aGUgdGhpcmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEROMiAgICAgIChETjErMSkKLSAgezIsIDQsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG0gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETTAgICAgICAoRE4yKzEpCi0gIHsyLCAwLCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGRtIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIERNMSAgICAgIChETTArMSkKLSAgezIsIDIsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG0gcmVnaXN0ZXIgaW4gdGhlIHRoaXJkIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETTIgICAgICAoRE0xKzEpCi0gIHsyLCA0LCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGFuIHJlZ2lzdGVyIGluIHRoZSBmaXJzdCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU4wICAgICAgKERNMisxKQotICB7MiwgMCwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbiByZWdpc3RlciBpbiB0aGUgc2Vjb25kIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTjEgICAgICAoQU4wKzEpCi0gIHsyLCAyLCBNTjEwMzAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFuIHJlZ2lzdGVyIGluIHRoZSB0aGlyZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU4yICAgICAgKEFOMSsxKQotICB7MiwgNCwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbSByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFNMCAgICAgIChBTjIrMSkKLSAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW0gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU0xICAgICAgKEFNMCsxKQotICB7MiwgMiwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbSByZWdpc3RlciBpbiB0aGUgdGhpcmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFNMiAgICAgIChBTTErMSkKLSAgezIsIDQsIE1OMTAzMDBfT1BFUkFORF9BUkVHfSwKLQotLyogOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMTZiaXQKLSAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTggICAgKEFNMisxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQKLSAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTE2ICAgIChJTU04KzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgcGMtcmVsYXRpdmUgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMTZiaXQKLSAgIHBjLXJlbGF0aXZlIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTE2X1BDUkVMICAgIChJTU0xNisxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9QQ1JFTCB8IE1OMTAzMDBfT1BFUkFORF9SRUxBWCB8IE1OMTAzMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiAxNmJpdCB1bnNpZ25lZCBkaXNwYWNlbWVudCBpbiBhIG1lbW9yeSBvcGVyYXRpb24gd2hpY2gKLSAgIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgSU1NMTZfTUVNICAgIChJTU0xNl9QQ1JFTCsxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFIHwgTU4xMDMwMF9PUEVSQU5EX01FTUFERFJ9LAotCi0vKiAzMmJpdCBpbW1lZGlhdGUsIGhpZ2ggMTYgYml0cyBpbiB0aGUgbWFpbiBpbnN0cnVjdGlvbgotICAgd29yZCwgMTZiaXRzIGluIHRoZSBleHRlbnNpb24gd29yZC4gCi0KLSAgIFRoZSAiYml0cyIgZmllbGQgaW5kaWNhdGVzIGhvdyBtYW55IGJpdHMgYXJlIGluIHRoZQotICAgbWFpbiBpbnN0cnVjdGlvbiB3b3JkIGZvciBNTjEwMzAwX09QRVJBTkRfU1BMSVQhICAqLwotI2RlZmluZSBJTU0zMiAgICAoSU1NMTZfTUVNKzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1NQTElUfSwKLQotLyogMzJiaXQgcGMtcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgSU1NMzJfUENSRUwgICAgKElNTTMyKzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1NQTElUIHwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMfSwKLQotLyogMzJiaXQgbWVtb3J5IG9mZnNldC4gICovCi0jZGVmaW5lIElNTTMyX01FTSAgICAoSU1NMzJfUENSRUwrMSkKLSAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgfCBNTjEwMzAwX09QRVJBTkRfTUVNQUREUn0sCi0KLS8qIDMyYml0IGltbWVkaWF0ZSwgaGlnaCAxNiBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uCi0gICB3b3JkLCAxNmJpdHMgaW4gdGhlIGV4dGVuc2lvbiB3b3JkLCBsb3cgMTZiaXRzIGFyZSBsZWZ0Ci0gICBzaGlmdGVkIDggcGxhY2VzLiAKLQotICAgVGhlICJiaXRzIiBmaWVsZCBpbmRpY2F0ZXMgaG93IG1hbnkgYml0cyBhcmUgaW4gdGhlCi0gICBtYWluIGluc3RydWN0aW9uIHdvcmQgZm9yIE1OMTAzMDBfT1BFUkFORF9TUExJVCEgICovCi0jZGVmaW5lIElNTTMyX0xPV1NISUZUOCAgICAoSU1NMzJfTUVNKzEpCi0gIHsxNiwgOCwgTU4xMDMwMF9PUEVSQU5EX1NQTElUIHwgTU4xMDMwMF9PUEVSQU5EX01FTUFERFJ9LAotCi0vKiAzMmJpdCBpbW1lZGlhdGUsIGhpZ2ggMjQgYml0cyBpbiB0aGUgbWFpbiBpbnN0cnVjdGlvbgotICAgd29yZCwgOCBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQuCi0KLSAgIFRoZSAiYml0cyIgZmllbGQgaW5kaWNhdGVzIGhvdyBtYW55IGJpdHMgYXJlIGluIHRoZQotICAgbWFpbiBpbnN0cnVjdGlvbiB3b3JkIGZvciBNTjEwMzAwX09QRVJBTkRfU1BMSVQhICAqLwotI2RlZmluZSBJTU0zMl9ISUdIMjQgICAgKElNTTMyX0xPV1NISUZUOCsxKQotICB7MjQsIDAsIE1OMTAzMDBfT1BFUkFORF9TUExJVCB8IE1OMTAzMDBfT1BFUkFORF9QQ1JFTH0sCi0KLS8qIDMyYml0IGltbWVkaWF0ZSwgaGlnaCAyNCBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uCi0gICB3b3JkLCA4IGluIHRoZSBleHRlbnNpb24gd29yZCwgbG93IDggYml0cyBhcmUgbGVmdAotICAgc2hpZnRlZCAxNiBwbGFjZXMuIAotCi0gICBUaGUgImJpdHMiIGZpZWxkIGluZGljYXRlcyBob3cgbWFueSBiaXRzIGFyZSBpbiB0aGUKLSAgIG1haW4gaW5zdHJ1Y3Rpb24gd29yZCBmb3IgTU4xMDMwMF9PUEVSQU5EX1NQTElUISAgKi8KLSNkZWZpbmUgSU1NMzJfSElHSDI0X0xPV1NISUZUMTYgICAgKElNTTMyX0hJR0gyNCsxKQotICB7MjQsIDE2LCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgfCBNTjEwMzAwX09QRVJBTkRfUENSRUx9LAotCi0vKiBTdGFjayBwb2ludGVyLiAgKi8KLSNkZWZpbmUgU1AgICAgKElNTTMyX0hJR0gyNF9MT1dTSElGVDE2KzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU1B9LAotCi0vKiBQcm9jZXNzb3Igc3RhdHVzIHdvcmQuICAqLwotI2RlZmluZSBQU1cgICAgKFNQKzEpCi0gIHswLCAwLCBNTjEwMzAwX09QRVJBTkRfUFNXfSwKLQotLyogTURSIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTURSICAgIChQU1crMSkKLSAgezAsIDAsIE1OMTAzMDBfT1BFUkFORF9NRFJ9LAotCi0vKiBJbmRleCByZWdpc3Rlci4gICovCi0jZGVmaW5lIERJIChNRFIrMSkKLSAgezIsIDIsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogOCBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCwgbWF5IHByb21vdGUgdG8gMTZiaXQgc2lnbmVkIGRpc3BhY2VtZW50LiAgKi8KLSNkZWZpbmUgU0Q4ICAgIChESSsxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMTYgYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQsIG1heSBwcm9tb3RlIHRvIDMyYml0IGRpc3BhY2VtZW50LiAgKi8KLSNkZWZpbmUgU0QxNiAgICAoU0Q4KzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogOCBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCB0aGF0IGNhbiBub3QgcHJvbW90ZS4gICovCi0jZGVmaW5lIFNEOE4gICAgKFNEMTYrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiA4IGJpdCBwYy1yZWxhdGl2ZSBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDhOX1BDUkVMICAgIChTRDhOKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDMwMF9PUEVSQU5EX1JFTEFYfSwKLQotLyogOCBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCBzaGlmdGVkIGxlZnQgOCBiaXRzIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNEOE5fU0hJRlQ4ICAgIChTRDhOX1BDUkVMKzEpCi0gIHs4LCA4LCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEfSwKLQotLyogOCBiaXQgc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byAxNmJpdCBzaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgU0lNTTggICAgKFNEOE5fU0hJRlQ4KzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byAzMmJpdCAgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgU0lNTTE2ICAgIChTSU1NOCsxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIEVpdGhlciBhbiBvcGVuIHBhcmVuIG9yIGNsb3NlIHBhcmVuLiAgKi8KLSNkZWZpbmUgUEFSRU4JKFNJTU0xNisxKQotICB7MCwgMCwgTU4xMDMwMF9PUEVSQU5EX1BBUkVOfSwgCi0KLS8qIGRuIHJlZ2lzdGVyIHRoYXQgYXBwZWFycyBpbiB0aGUgZmlyc3QgYW5kIHNlY29uZCByZWdpc3RlciBwb3NpdGlvbnMuICAqLwotI2RlZmluZSBETjAxICAgICAoUEFSRU4rMSkKLSAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9EUkVHIHwgTU4xMDMwMF9PUEVSQU5EX1JFUEVBVEVEfSwKLQotLyogYW4gcmVnaXN0ZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHJlZ2lzdGVyIHBvc2l0aW9ucy4gICovCi0jZGVmaW5lIEFOMDEgICAgIChETjAxKzEpCi0gIHsyLCAwLCBNTjEwMzAwX09QRVJBTkRfQVJFRyB8IE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRH0sCi0KLS8qIDE2Yml0IHBjLXJlbGF0aXZlIGRpc3BsYWNlbWVudCB3aGljaCBtYXkgcHJvbW90ZSB0byAzMmJpdCBwYy1yZWxhdGl2ZQotICAgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgRDE2X1NISUZUIChBTjAxKzEpCi0gIHsxNiwgOCwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDMwMF9PUEVSQU5EX1JFTEFYIHwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDggYml0IGltbWVkaWF0ZSBmb3VuZCBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQuICAqLwotI2RlZmluZSBJTU04RSAgICAoRDE2X1NISUZUKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfRVhURU5ERUR9LAotCi0vKiBSZWdpc3RlciBsaXN0IGZvdW5kIGluIHRoZSBleHRlbnNpb24gd29yZCBzaGlmdGVkIDggYml0cyBsZWZ0LiAgKi8KLSNkZWZpbmUgUkVHU0VfU0hJRlQ4ICAgIChJTU04RSsxKQotICB7OCwgOCwgTU4xMDMwMF9PUEVSQU5EX0VYVEVOREVEIHwgTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNUfSwKLQotLyogUmVnaXN0ZXIgbGlzdCBzaGlmdGVkIDggYml0cyBsZWZ0LiAgKi8KLSNkZWZpbmUgUkVHU19TSElGVDggKFJFR1NFX1NISUZUOCArIDEpCi0gIHs4LCA4LCBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1R9LAotCi0vKiBSZWlnc3RlciBsaXN0LiAgKi8KLSNkZWZpbmUgUkVHUyAgICAoUkVHU19TSElGVDgrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVH0sCi0KLQotfSA7IAotCi0jZGVmaW5lIE1FTShBRERSKSBQQVJFTiwgQUREUiwgUEFSRU4gCi0jZGVmaW5lIE1FTUlOQyhBRERSKSBQQVJFTiwgQUREUiwgUExVUywgUEFSRU4gCi0jZGVmaW5lIE1FTUlOQzIoQUREUixJTkMpIFBBUkVOLCBBRERSLCBQTFVTLCBJTkMsIFBBUkVOIAotI2RlZmluZSBNRU0yKEFERFIxLEFERFIyKSBQQVJFTiwgQUREUjEsIEFERFIyLCBQQVJFTiAKLQwKLS8qIFRoZSBvcGNvZGUgdGFibGUuCi0KLSAgIFRoZSBmb3JtYXQgb2YgdGhlIG9wY29kZSB0YWJsZSBpczoKLQotICAgTkFNRQkJT1BDT0RFCQlNQVNLCU1BVENIX01BU0ssIEZPUk1BVCwgUFJPQ0VTU09SCXsgT1BFUkFORFMgfQotCi0gICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgIE9QQ09ERSBpcyB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgotICAgTUFTSyBpcyB0aGUgb3Bjb2RlIG1hc2s7IHRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSBkaXNhc3NlbWJsZXIKLSAgICAgd2hpY2ggYml0cyBpbiB0aGUgYWN0dWFsIG9wY29kZSBtdXN0IG1hdGNoIE9QQ09ERS4KLSAgIE9QRVJBTkRTIGlzIHRoZSBsaXN0IG9mIG9wZXJhbmRzLgotCi0gICBUaGUgZGlzYXNzZW1ibGVyIHJlYWRzIHRoZSB0YWJsZSBpbiBvcmRlciBhbmQgcHJpbnRzIHRoZSBmaXJzdAotICAgaW5zdHJ1Y3Rpb24gd2hpY2ggbWF0Y2hlcywgc28gdGhpcyB0YWJsZSBpcyBzb3J0ZWQgdG8gcHV0IG1vcmUKLSAgIHNwZWNpZmljIGluc3RydWN0aW9ucyBiZWZvcmUgbW9yZSBnZW5lcmFsIGluc3RydWN0aW9ucy4gIEl0IGlzIGFsc28KLSAgIHNvcnRlZCBieSBtYWpvciBvcGNvZGUuICAqLwotCi1jb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgbW4xMDMwMF9vcGNvZGVzW10gPSB7Ci17ICJtb3YiLAkweDgwMDAsCSAgICAgMHhmMDAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NJTU04LCBETjAxfX0sCi17ICJtb3YiLAkweDgwLAkgICAgIDB4ZjAsCSAgMHgzLCAgRk1UX1MwLCAwLAl7RE0xLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjFlMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjFkMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBETjB9fSwKLXsgIm1vdiIsCTB4OTAwMCwJICAgICAweGYwMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7SU1NOCwgQU4wMX19LAoteyAibW92IiwJMHg5MCwJICAgICAweGYwLAkgIDB4MywgIEZNVF9TMCwgMCwJe0FNMSwgQU4wfX0sCi17ICJtb3YiLAkweDNjLAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7U1AsIEFOMH19LAoteyAibW92IiwJMHhmMmYwLAkgICAgIDB4ZmZmMywJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIFNQfX0sCi17ICJtb3YiLAkweGYyZTQsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe1BTVywgRE4wfX0sCi17ICJtb3YiLAkweGYyZjMsCSAgICAgMHhmZmYzLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgUFNXfX0sCi17ICJtb3YiLAkweGYyZTAsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe01EUiwgRE4wfX0sCi17ICJtb3YiLAkweGYyZjIsCSAgICAgMHhmZmYzLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgTURSfX0sCi17ICJtb3YiLAkweDcwLAkgICAgIDB4ZjAsCSAgMCwgICAgRk1UX1MwLCAwLAl7TUVNKEFNMCksIEROMX19LAoteyAibW92IiwJMHg1ODAwLAkgICAgIDB4ZmNmZiwJICAwLCAgICBGTVRfUzEsIDAsCXtNRU0oU1ApLCBETjB9fSwKLXsgIm1vdiIsCTB4MzAwMDAwLCAgICAweGZjMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7TUVNKElNTTE2X01FTSksIEROMH19LAoteyAibW92IiwJMHhmMDAwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0oQU0wKSwgQU4xfX0sCi17ICJtb3YiLAkweDVjMDAsCSAgICAgMHhmY2ZmLAkgIDAsICAgIEZNVF9TMSwgMCwJe01FTShTUCksIEFOMH19LAoteyAibW92IiwJMHhmYWEwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0oSU1NMTZfTUVNKSwgQU4wfX0sCi17ICJtb3YiLAkweDYwLAkgICAgIDB4ZjAsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE0xLCBNRU0oQU4wKX19LAoteyAibW92IiwJMHg0MjAwLAkgICAgIDB4ZjNmZiwJICAwLCAgICBGTVRfUzEsIDAsCXtETTEsIE1FTShTUCl9fSwKLXsgIm1vdiIsCTB4MDEwMDAwLCAgICAweGYzMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7RE0xLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92IiwJMHhmMDEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIE1FTShBTjApfX0sCi17ICJtb3YiLAkweDQzMDAsCSAgICAgMHhmM2ZmLAkgIDAsICAgIEZNVF9TMSwgMCwJe0FNMSwgTUVNKFNQKX19LAoteyAibW92IiwJMHhmYTgwMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtBTTEsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3YiLAkweDVjMDAsCSAgICAgMHhmYzAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe01FTTIoSU1NOCwgU1ApLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjgwMDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNMihTRDgsIEFNMCksIEROMX19LAoteyAibW92IiwJMHhmYTAwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKFNEMTYsIEFNMCksIEROMX19LAoteyAibW92IiwJMHg1ODAwLAkgICAgIDB4ZmMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtNRU0yKElNTTgsIFNQKSwgRE4wfX0sCi17ICJtb3YiLAkweGZhYjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoSU1NMTYsIFNQKSwgRE4wfX0sCi17ICJtb3YiLAkweGYzMDAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTTIoREksIEFNMCksIEROMn19LAoteyAibW92IiwJMHhmODIwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0yKFNEOCxBTTApLCBBTjF9fSwKLXsgIm1vdiIsCTB4ZmEyMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihTRDE2LCBBTTApLCBBTjF9fSwKLXsgIm1vdiIsCTB4ZmFiMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihJTU0xNiwgU1ApLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjM4MCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNMihESSwgQU0wKSwgQU4yfX0sCi17ICJtb3YiLAkweDQzMDAsCSAgICAgMHhmMzAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe0FNMSwgTUVNMihJTU04LCBTUCl9fSwKLXsgIm1vdiIsCTB4ZjgxMDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKFNEOCwgQU4wKX19LAoteyAibW92IiwJMHhmYTEwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtETTEsIE1FTTIoU0QxNiwgQU4wKX19LAoteyAibW92IiwJMHg0MjAwLAkgICAgIDB4ZjMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtETTEsIE1FTTIoSU1NOCwgU1ApfX0sCi17ICJtb3YiLAkweGZhOTEwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihJTU0xNiwgU1ApfX0sCi17ICJtb3YiLAkweGYzNDAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMiwgTUVNMihESSwgQU4wKX19LAoteyAibW92IiwJMHhmODMwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtBTTEsIE1FTTIoU0Q4LCBBTjApfX0sCi17ICJtb3YiLAkweGZhMzAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0FNMSwgTUVNMihTRDE2LCBBTjApfX0sCi17ICJtb3YiLAkweGZhOTAwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0FNMSwgTUVNMihJTU0xNiwgU1ApfX0sCi17ICJtb3YiLAkweGYzYzAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMiwgTUVNMihESSwgQU4wKX19LAotCi0vKiBUaGVzZSBtdXN0IGNvbWUgYWZ0ZXIgbW9zdCBvZiB0aGUgb3RoZXIgbW92ZSBpbnN0cnVjdGlvbnMgdG8gYXZvaWQgbWF0Y2hpbmcKLSAgIGEgc3ltYm9saWMgbmFtZSB3aXRoIElNTXh4IG9wZXJhbmRzLiAgVWdoLiAgKi8KLXsgIm1vdiIsCTB4MmMwMDAwLCAgICAweGZjMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7U0lNTTE2LCBETjB9fSwKLXsgIm1vdiIsCTB4ZmNjYzAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAibW92IiwJMHgyNDAwMDAsICAgIDB4ZmMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtJTU0xNiwgQU4wfX0sCi17ICJtb3YiLAkweGZjZGMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZmNhNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNKElNTTMyX01FTSksIEROMH19LAoteyAibW92IiwJMHhmY2EwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0oSU1NMzJfTUVNKSwgQU4wfX0sCi17ICJtb3YiLAkweGZjODEwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNKElNTTMyX01FTSl9fSwKLXsgIm1vdiIsCTB4ZmM4MDAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7QU0xLCBNRU0oSU1NMzJfTUVNKX19LAoteyAibW92IiwJMHhmYzAwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLEFNMCksIEROMX19LAoteyAibW92IiwJMHhmY2I0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLCBTUCksIEROMH19LAoteyAibW92IiwJMHhmYzIwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLEFNMCksIEFOMX19LAoteyAibW92IiwJMHhmY2IwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLCBTUCksIEFOMH19LAoteyAibW92IiwJMHhmYzEwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTTIoSU1NMzIsQU4wKX19LAoteyAibW92IiwJMHhmYzkxMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTTIoSU1NMzIsIFNQKX19LAoteyAibW92IiwJMHhmYzMwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtBTTEsIE1FTTIoSU1NMzIsQU4wKX19LAoteyAibW92IiwJMHhmYzkwMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtBTTEsIE1FTTIoSU1NMzIsIFNQKX19LAotLyogVGhlc2Ugbm9uLXByb21vdGluZyB2YXJpYW50cyBuZWVkIHRvIGNvbWUgYWZ0ZXIgYWxsIHRoZSBvdGhlciBtZW1vcnkKLSAgIG1vdmVzLiAgKi8KLXsgIm1vdiIsCTB4ZjhmMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMwLAl7TUVNMihTRDhOLCBBTTApLCBTUH19LAoteyAibW92IiwJMHhmOGY0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzAsCXtTUCwgTUVNMihTRDhOLCBBTjApfX0sCi0KLQotCi17ICJtb3ZidSIsCTB4ZjA0MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNKEFNMCksIEROMX19LAoteyAibW92YnUiLAkweGY4NDAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoU0Q4LCBBTTApLCBETjF9fSwKLXsgIm1vdmJ1IiwJMHhmYTQwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKFNEMTYsIEFNMCksIEROMX19LAoteyAibW92YnUiLAkweGY4YjgwMCwgICAgMHhmZmZjZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTShTUCksIEROMH19LAoteyAibW92YnUiLAkweGY4YjgwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoSU1NOCwgU1ApLCBETjB9fSwKLXsgIm1vdmJ1IiwJMHhmYWI4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKElNTTE2LCBTUCksIEROMH19LAoteyAibW92YnUiLAkweGY0MDAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTTIoREksIEFNMCksIEROMn19LAoteyAibW92YnUiLAkweDM0MDAwMCwgICAgMHhmYzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe01FTShJTU0xNl9NRU0pLCBETjB9fSwKLXsgIm1vdmJ1IiwJMHhmMDUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIE1FTShBTjApfX0sCi17ICJtb3ZidSIsCTB4Zjg1MDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKFNEOCwgQU4wKX19LAoteyAibW92YnUiLAkweGZhNTAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihTRDE2LCBBTjApfX0sCi17ICJtb3ZidSIsCTB4Zjg5MjAwLCAgICAweGZmZjNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0oU1ApfX0sCi17ICJtb3ZidSIsCTB4Zjg5MjAwLCAgICAweGZmZjMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKElNTTgsIFNQKX19LAoteyAibW92YnUiLAkweGZhOTIwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihJTU0xNiwgU1ApfX0sCi17ICJtb3ZidSIsCTB4ZjQ0MCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0yLCBNRU0yKERJLCBBTjApfX0sCi17ICJtb3ZidSIsCTB4MDIwMDAwLCAgICAweGYzMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7RE0xLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92YnUiLAkweGZjNDAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsQU0wKSwgRE4xfX0sCi17ICJtb3ZidSIsCTB4ZmNiODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMiwgU1ApLCBETjB9fSwKLXsgIm1vdmJ1IiwJMHhmY2E4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0oSU1NMzJfTUVNKSwgRE4wfX0sCi17ICJtb3ZidSIsCTB4ZmM1MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLEFOMCl9fSwKLXsgIm1vdmJ1IiwJMHhmYzkyMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTTIoSU1NMzIsIFNQKX19LAoteyAibW92YnUiLAkweGZjODIwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNKElNTTMyX01FTSl9fSwKLQoteyAibW92aHUiLAkweGYwNjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTShBTTApLCBETjF9fSwKLXsgIm1vdmh1IiwJMHhmODYwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0yKFNEOCwgQU0wKSwgRE4xfX0sCi17ICJtb3ZodSIsCTB4ZmE2MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihTRDE2LCBBTTApLCBETjF9fSwKLXsgIm1vdmh1IiwJMHhmOGJjMDAsICAgIDB4ZmZmY2ZmLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0oU1ApLCBETjB9fSwKLXsgIm1vdmh1IiwJMHhmOGJjMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0yKElNTTgsIFNQKSwgRE4wfX0sCi17ICJtb3ZodSIsCTB4ZmFiYzAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihJTU0xNiwgU1ApLCBETjB9fSwKLXsgIm1vdmh1IiwJMHhmNDgwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0yKERJLCBBTTApLCBETjJ9fSwKLXsgIm1vdmh1IiwJMHgzODAwMDAsICAgIDB4ZmMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtNRU0oSU1NMTZfTUVNKSwgRE4wfX0sCi17ICJtb3ZodSIsCTB4ZjA3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBNRU0oQU4wKX19LAoteyAibW92aHUiLAkweGY4NzAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0RNMSwgTUVNMihTRDgsIEFOMCl9fSwKLXsgIm1vdmh1IiwJMHhmYTcwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtETTEsIE1FTTIoU0QxNiwgQU4wKX19LAoteyAibW92aHUiLAkweGY4OTMwMCwgICAgMHhmZmYzZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe0RNMSwgTUVNKFNQKX19LAoteyAibW92aHUiLAkweGY4OTMwMCwgICAgMHhmZmYzMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0RNMSwgTUVNMihJTU04LCBTUCl9fSwKLXsgIm1vdmh1IiwJMHhmYTkzMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtETTEsIE1FTTIoSU1NMTYsIFNQKX19LAoteyAibW92aHUiLAkweGY0YzAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMiwgTUVNMihESSwgQU4wKX19LAoteyAibW92aHUiLAkweDAzMDAwMCwgICAgMHhmMzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe0RNMSwgTUVNKElNTTE2X01FTSl9fSwKLXsgIm1vdmh1IiwJMHhmYzYwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLEFNMCksIEROMX19LAoteyAibW92aHUiLAkweGZjYmMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsIFNQKSwgRE4wfX0sCi17ICJtb3ZodSIsCTB4ZmNhYzAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNKElNTTMyX01FTSksIEROMH19LAoteyAibW92aHUiLAkweGZjNzAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNMihJTU0zMixBTjApfX0sCi17ICJtb3ZodSIsCTB4ZmM5MzAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLCBTUCl9fSwKLXsgIm1vdmh1IiwJMHhmYzgzMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTShJTU0zMl9NRU0pfX0sCi0KLXsgImV4dCIsCTB4ZjJkMCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE4wfX0sCi0KLXsgImV4dGIiLAkweDEwLCAJICAgICAweGZjLAkgIDAsICAgIEZNVF9TMCwgMCwJe0ROMH19LAotCi17ICJleHRidSIsCTB4MTQsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtETjB9fSwKLQoteyAiZXh0aCIsCTB4MTgsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtETjB9fSwKLQoteyAiZXh0aHUiLAkweDFjLAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4wfX0sCi0KLXsgIm1vdm0iLAkweGNlMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe01FTShTUCksIFJFR1N9fSwKLXsgIm1vdm0iLAkweGNmMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1JFR1MsIE1FTShTUCl9fSwKLQoteyAiY2xyIiwJMHgwMCwJICAgICAweGYzLAkgIDAsICAgIEZNVF9TMCwgMCwJe0ROMX19LAotCi17ICJhZGQiLAkweGUwLAkgICAgIDB4ZjAsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE0xLCBETjB9fSwKLXsgImFkZCIsCTB4ZjE2MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBBTjB9fSwKLXsgImFkZCIsCTB4ZjE1MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBETjB9fSwKLXsgImFkZCIsCTB4ZjE3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBBTjB9fSwKLXsgImFkZCIsCTB4MjgwMCwJICAgICAweGZjMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0lNTTgsIEROMH19LAoteyAiYWRkIiwJMHhmYWMwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtTSU1NMTYsIEROMH19LAoteyAiYWRkIiwJMHgyMDAwLAkgICAgIDB4ZmMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTSU1NOCwgQU4wfX0sCi17ICJhZGQiLAkweGZhZDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe1NJTU0xNiwgQU4wfX0sCi17ICJhZGQiLAkweGY4ZmUwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBTUH19LAoteyAiYWRkIiwJMHhmYWZlMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtTSU1NMTYsIFNQfX0sCi17ICJhZGQiLAkweGZjYzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgImFkZCIsCTB4ZmNkMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEFOMH19LAoteyAiYWRkIiwJMHhmY2ZlMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgU1B9fSwKLQoteyAiYWRkYyIsCTB4ZjE0MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLQoteyAic3ViIiwJMHhmMTAwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAic3ViIiwJMHhmMTIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEFOMH19LAoteyAic3ViIiwJMHhmMTEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIEROMH19LAoteyAic3ViIiwJMHhmMTMwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIEFOMH19LAoteyAic3ViIiwJMHhmY2M0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJzdWIiLAkweGZjZDQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBBTjB9fSwKLQoteyAic3ViYyIsCTB4ZjE4MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLQoteyAibXVsIiwJMHhmMjQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAotCi17ICJtdWx1IiwJMHhmMjUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAotCi17ICJkaXYiLAkweGYyNjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi0KLXsgImRpdnUiLAkweGYyNzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi0KLXsgImluYyIsCTB4NDAsCSAgICAgMHhmMywJICAwLCAgICBGTVRfUzAsIDAsCXtETjF9fSwKLXsgImluYyIsCTB4NDEsCSAgICAgMHhmMywJICAwLCAgICBGTVRfUzAsIDAsCXtBTjF9fSwKLQoteyAiaW5jNCIsCTB4NTAsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtBTjB9fSwKLQoteyAiY21wIiwJMHhhMDAwLAkgICAgIDB4ZjAwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTSU1NOCwgRE4wMX19LAoteyAiY21wIiwJMHhhMCwJICAgICAweGYwLAkgIDB4MywgIEZNVF9TMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJjbXAiLAkweGYxYTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgQU4wfX0sCi17ICJjbXAiLAkweGYxOTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgRE4wfX0sCi17ICJjbXAiLAkweGIwMDAsCSAgICAgMHhmMDAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe0lNTTgsIEFOMDF9fSwKLXsgImNtcCIsCTB4YjAsCSAgICAgMHhmMCwJICAweDMsICBGTVRfUzAsIDAsCXtBTTEsIEFOMH19LAoteyAiY21wIiwJMHhmYWM4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtTSU1NMTYsIEROMH19LAoteyAiY21wIiwJMHhmYWQ4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgQU4wfX0sCi17ICJjbXAiLAkweGZjYzgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgImNtcCIsCTB4ZmNkODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEFOMH19LAotCi17ICJhbmQiLAkweGYyMDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJhbmQiLAkweGY4ZTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAiYW5kIiwJMHhmYWUwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgRE4wfX0sCi17ICJhbmQiLAkweGZhZmMwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBQU1d9fSwKLXsgImFuZCIsCTB4ZmNlMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAotCi17ICJvciIsCQkweGYyMTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJvciIsCQkweGY4ZTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAib3IiLAkJMHhmYWU0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgRE4wfX0sCi17ICJvciIsCQkweGZhZmQwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBQU1d9fSwKLXsgIm9yIiwJCTB4ZmNlNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAotCi17ICJ4b3IiLAkweGYyMjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ4b3IiLAkweGZhZTgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBETjB9fSwKLXsgInhvciIsCTB4ZmNlODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAotCi17ICJub3QiLAkweGYyMzAsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe0ROMH19LAotCi17ICJidHN0IiwJMHhmOGVjMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgImJ0c3QiLAkweGZhZWMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBETjB9fSwKLXsgImJ0c3QiLAkweGZjZWMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgImJ0c3QiLAkweGZlMDIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENSwgMCwJe0lNTThFLCBNRU0oSU1NMzJfTE9XU0hJRlQ4KX19LAoteyAiYnRzdCIsCTB4ZmFmODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAJe0lNTTgsIE1FTTIoU0Q4Tl9TSElGVDgsIEFOMCl9fSwKLQoteyAiYnNldCIsCTB4ZjA4MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBNRU0oQU4wKX19LAoteyAiYnNldCIsCTB4ZmUwMDAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q1LCAwLAl7SU1NOEUsIE1FTShJTU0zMl9MT1dTSElGVDgpfX0sCi17ICJic2V0IiwJMHhmYWYwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU04LCBNRU0yKFNEOE5fU0hJRlQ4LCBBTjApfX0sCi0KLXsgImJjbHIiLAkweGYwOTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgTUVNKEFOMCl9fSwKLXsgImJjbHIiLAkweGZlMDEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENSwgMCwJe0lNTThFLCBNRU0oSU1NMzJfTE9XU0hJRlQ4KX19LAoteyAiYmNsciIsCTB4ZmFmNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NOCwgTUVNMihTRDhOX1NISUZUOCxBTjApfX0sCi0KLXsgImFzciIsCTB4ZjJiMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgImFzciIsCTB4ZjhjODAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJhc3IiLAkweGY4YzgwMSwgICAgMHhmZmZjZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe0ROMH19LAotCi17ICJsc3IiLAkweGYyYTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJsc3IiLAkweGY4YzQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAibHNyIiwJMHhmOGM0MDEsICAgIDB4ZmZmY2ZmLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETjB9fSwKLQoteyAiYXNsIiwJMHhmMjkwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAiYXNsIiwJMHhmOGMwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgImFzbCIsCTB4ZjhjMDAxLCAgICAweGZmZmNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE4wfX0sCi0KLXsgImFzbDIiLAkweDU0LAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4wfX0sCi0KLXsgInJvciIsCTB4ZjI4NCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE4wfX0sCi0KLXsgInJvbCIsCTB4ZjI4MCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE4wfX0sCi0KLXsgImJlcSIsCTB4YzgwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYm5lIiwJMHhjOTAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJiZ3QiLAkweGMxMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJnZSIsCTB4YzIwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYmxlIiwJMHhjMzAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJibHQiLAkweGMwMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJoaSIsCTB4YzUwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYmNjIiwJMHhjNjAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJibHMiLAkweGM3MDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJjcyIsCTB4YzQwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYnZjIiwJMHhmOGU4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJidnMiLAkweGY4ZTkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJuYyIsCTB4ZjhlYTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYm5zIiwJMHhmOGViMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJicmEiLAkweGNhMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLQoteyAibGVxIiwJMHhkOCwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibG5lIiwJMHhkOSwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGd0IiwJMHhkMSwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGdlIiwJMHhkMiwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGxlIiwJMHhkMywJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGx0IiwJMHhkMCwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGhpIiwJMHhkNSwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGNjIiwJMHhkNiwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGxzIiwJMHhkNywJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGNzIiwJMHhkNCwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibHJhIiwJMHhkYSwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAic2V0bGIiLAkweGRiLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi0KLXsgImptcCIsCTB4ZjBmNCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7UEFSRU4sQU4wLFBBUkVOfX0sCi17ICJqbXAiLAkweGNjMDAwMCwgICAgMHhmZjAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe0lNTTE2X1BDUkVMfX0sCi17ICJqbXAiLAkweGRjMDAwMDAwLCAgMHhmZjAwMDAwMCwgIDAsICAgIEZNVF9TNCwgMCwJe0lNTTMyX0hJR0gyNH19LAoteyAiY2FsbCIsCTB4Y2QwMDAwMDAsICAweGZmMDAwMDAwLCAgMCwgICAgRk1UX1M0LCAwLAl7RDE2X1NISUZULFJFR1MsSU1NOEV9fSwKLXsgImNhbGwiLAkweGRkMDAwMDAwLCAgMHhmZjAwMDAwMCwgIDAsICAgIEZNVF9TNiwgMCwJe0lNTTMyX0hJR0gyNF9MT1dTSElGVDE2LCBSRUdTRV9TSElGVDgsSU1NOEV9fSwKLXsgImNhbGxzIiwJMHhmMGYwLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtQQVJFTixBTjAsUEFSRU59fSwKLXsgImNhbGxzIiwJMHhmYWZmMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNl9QQ1JFTH19LAoteyAiY2FsbHMiLAkweGZjZmYwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyX1BDUkVMfX0sCi0KLXsgInJldCIsCTB4ZGYwMDAwLCAgICAweGZmMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7UkVHU19TSElGVDgsIElNTTh9fSwKLXsgInJldGYiLAkweGRlMDAwMCwgICAgMHhmZjAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe1JFR1NfU0hJRlQ4LCBJTU04fX0sCi17ICJyZXRzIiwJMHhmMGZjLAkgICAgIDB4ZmZmZiwJICAwLCAgICBGTVRfRDAsIDAsCXtVTlVTRUR9fSwKLXsgInJ0aSIsCTB4ZjBmZCwJICAgICAweGZmZmYsCSAgMCwgICAgRk1UX0QwLCAwLAl7VU5VU0VEfX0sCi17ICJ0cmFwIiwJMHhmMGZlLAkgICAgIDB4ZmZmZiwJICAwLCAgICBGTVRfRDAsIDAsCXtVTlVTRUR9fSwKLXsgInJ0bSIsCTB4ZjBmZiwJICAgICAweGZmZmYsCSAgMCwgICAgRk1UX0QwLCAwLAl7VU5VU0VEfX0sCi17ICJub3AiLAkweGNiLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi0KLS8qIFVERiBpbnN0cnVjdGlvbnMuICAqLwoteyAidWRmMDAiLAkweGY2MDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwMCIsCTB4ZjkwMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDAiLAkweGZiMDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjAwIiwJMHhmZDAwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwMSIsCTB4ZjYxMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjAxIiwJMHhmOTEwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwMSIsCTB4ZmIxMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDEiLAkweGZkMTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjAyIiwJMHhmNjIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDIiLAkweGY5MjAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjAyIiwJMHhmYjIwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwMiIsCTB4ZmQyMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDMiLAkweGY2MzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwMyIsCTB4ZjkzMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDMiLAkweGZiMzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjAzIiwJMHhmZDMwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwNCIsCTB4ZjY0MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjA0IiwJMHhmOTQwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwNCIsCTB4ZmI0MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDQiLAkweGZkNDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjA1IiwJMHhmNjUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDUiLAkweGY5NTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjA1IiwJMHhmYjUwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwNSIsCTB4ZmQ1MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDYiLAkweGY2NjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwNiIsCTB4Zjk2MDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDYiLAkweGZiNjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjA2IiwJMHhmZDYwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwNyIsCTB4ZjY3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjA3IiwJMHhmOTcwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwNyIsCTB4ZmI3MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDciLAkweGZkNzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjA4IiwJMHhmNjgwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDgiLAkweGY5ODAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjA4IiwJMHhmYjgwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwOCIsCTB4ZmQ4MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDkiLAkweGY2OTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwOSIsCTB4Zjk5MDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDkiLAkweGZiOTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjA5IiwJMHhmZDkwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYxMCIsCTB4ZjZhMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjEwIiwJMHhmOWEwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYxMCIsCTB4ZmJhMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMTAiLAkweGZkYTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjExIiwJMHhmNmIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMTEiLAkweGY5YjAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjExIiwJMHhmYmIwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYxMSIsCTB4ZmRiMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMTIiLAkweGY2YzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYxMiIsCTB4ZjljMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMTIiLAkweGZiYzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjEyIiwJMHhmZGMwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYxMyIsCTB4ZjZkMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjEzIiwJMHhmOWQwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYxMyIsCTB4ZmJkMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMTMiLAkweGZkZDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjE0IiwJMHhmNmUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMTQiLAkweGY5ZTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjE0IiwJMHhmYmUwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYxNCIsCTB4ZmRlMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMTUiLAkweGY2ZjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYxNSIsCTB4ZjlmMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMTUiLAkweGZiZjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjE1IiwJMHhmZGYwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYyMCIsCTB4ZjUwMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjIxIiwJMHhmNTEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjIiLAkweGY1MjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyMyIsCTB4ZjUzMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjI0IiwJMHhmNTQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjUiLAkweGY1NTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyNiIsCTB4ZjU2MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjI3IiwJMHhmNTcwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjgiLAkweGY1ODAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyOSIsCTB4ZjU5MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjMwIiwJMHhmNWEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMzEiLAkweGY1YjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYzMiIsCTB4ZjVjMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjMzIiwJMHhmNWQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMzQiLAkweGY1ZTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYzNSIsCTB4ZjVmMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZnUwMCIsCTB4ZjkwNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDAiLAkweGZiMDQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTAwIiwJMHhmZDA0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDEiLAkweGY5MTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTAxIiwJMHhmYjE0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwMSIsCTB4ZmQxNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTAyIiwJMHhmOTI0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwMiIsCTB4ZmIyNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDIiLAkweGZkMjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwMyIsCTB4ZjkzNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDMiLAkweGZiMzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTAzIiwJMHhmZDM0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDQiLAkweGY5NDQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTA0IiwJMHhmYjQ0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwNCIsCTB4ZmQ0NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTA1IiwJMHhmOTU0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwNSIsCTB4ZmI1NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDUiLAkweGZkNTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwNiIsCTB4Zjk2NDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDYiLAkweGZiNjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTA2IiwJMHhmZDY0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDciLAkweGY5NzQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTA3IiwJMHhmYjc0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwNyIsCTB4ZmQ3NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTA4IiwJMHhmOTg0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwOCIsCTB4ZmI4NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDgiLAkweGZkODQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwOSIsCTB4Zjk5NDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDkiLAkweGZiOTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTA5IiwJMHhmZDk0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MTAiLAkweGY5YTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTEwIiwJMHhmYmE0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUxMCIsCTB4ZmRhNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTExIiwJMHhmOWI0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUxMSIsCTB4ZmJiNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MTEiLAkweGZkYjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUxMiIsCTB4ZjljNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MTIiLAkweGZiYzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTEyIiwJMHhmZGM0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MTMiLAkweGY5ZDQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTEzIiwJMHhmYmQ0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUxMyIsCTB4ZmRkNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTE0IiwJMHhmOWU0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUxNCIsCTB4ZmJlNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MTQiLAkweGZkZTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUxNSIsCTB4ZjlmNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MTUiLAkweGZiZjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTE1IiwJMHhmZGY0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi0KLXsgInB1dHgiLAkweGY1MDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0ROMDF9fSwKLXsgImdldHgiLAkweGY2ZjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0ROMDF9fSwKLXsgIm11bHEiLAkweGY2MDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0RNMSwgRE4wfX0sCi17ICJtdWxxIiwJMHhmOTAwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzAsCXtTSU1NOCwgRE4wfX0sCi17ICJtdWxxIiwJMHhmYjAwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIEFNMzAsCXtTSU1NMTYsIEROMH19LAoteyAibXVscSIsCTB4ZmQwMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCBBTTMwLAl7SU1NMzIsIEROMH19LAoteyAibXVscXUiLAkweGY2MTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0RNMSwgRE4wfX0sCi17ICJtdWxxdSIsCTB4ZjkxNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMwLAl7U0lNTTgsIEROMH19LAoteyAibXVscXUiLAkweGZiMTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgQU0zMCwJe1NJTU0xNiwgRE4wfX0sCi17ICJtdWxxdSIsCTB4ZmQxNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCBBTTMwLAl7SU1NMzIsIEROMH19LAoteyAic2F0MTYiLAkweGY2NDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0RNMSwgRE4wfX0sCi0KLXsgInNhdDI0IiwJMHhmNjUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzAsCXtETTEsIEROMH19LAotCi17ICJic2NoIiwJMHhmNjcwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzAsCXtETTEsIEROMH19LAotCi0vKiBFeHRlbnNpb24uICBXZSBuZWVkIHNvbWUgaW5zdHJ1Y3Rpb24gdG8gdHJpZ2dlciAiZW11bGF0ZWQgc3lzY2FsbHMiCi0gICBmb3Igb3VyIHNpbXVsYXRvci4gICovCi17ICJzeXNjYWxsIiwgICAgMHhmMGMwLCAgICAgIDB4ZmZmZiwgICAgICAwLCAgICBGTVRfRDAsIDAsCXtVTlVTRUR9fSwKLQotLyogRXh0ZW5zaW9uLiAgV2hlbiB0YWxraW5nIHRvIHRoZSBzaW11bGF0b3IsIGdkYiByZXF1aXJlcyBzb21lIGluc3RydWN0aW9uCi0gICB0aGF0IHdpbGwgdHJpZ2dlciBhICJicmVha3BvaW50IiAocmVhbGx5IGp1c3QgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpc24ndAotICAgb3RoZXJ3aXNlIHVzZWQgYnkgdGhlIHRvb2xzLiAgVGhpcyBpbnN0cnVjdGlvbiBtdXN0IGJlIHRoZSBzYW1lIHNpemUKLSAgIGFzIHRoZSBzbWFsbGVzdCBpbnN0cnVjdGlvbiBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUuICBJbiB0aGUgY2FzZSBvZiB0aGUKLSAgIG1uMTB4MDAgdGhlICJicmVhayIgaW5zdHJ1Y3Rpb24gbXVzdCBiZSBvbmUgYnl0ZS4gIDB4ZmYgaXMgYXZhaWxhYmxlIG9uCi0gICBib3RoIG1uMTB4MDAgYXJjaGl0ZWN0dXJlcy4gICovCi17ICJicmVhayIsCTB4ZmYsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLQotIAoteyAwLCAwLCAwLCAwLCAwLCAwLCB7MH19LAotCi19IDsKLQotY29uc3QgaW50IG1uMTAzMDBfbnVtX29wY29kZXMgPQotICBzaXplb2YgKG1uMTAzMDBfb3Bjb2RlcykgLyBzaXplb2YgKG1uMTAzMDBfb3Bjb2Rlc1swXSk7Ci0KLQwKZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1hc20uYyBiL29wY29kZXMvbTMyci1hc20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4Y2Q3My4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItYXNtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTYgKzAsMCBAQAotLyogQXNzZW1ibGVyIGludGVyZmFjZSBmb3IgdGFyZ2V0cyB1c2luZyBDR0VOLiAtKi0gQyAtKi0KLSAgIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IKLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLS0gdGhlIHJlc3VsdGFudCBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkLCBjZ2VuLWFzbS5pbiBpc24ndAotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogPz8/IEV2ZW50dWFsbHkgbW9yZSBhbmQgbW9yZSBvZiB0aGlzIHN0dWZmIGNhbiBnbyB0byBjcHUtaW5kZXBlbmRlbnQgZmlsZXMuCi0gICBLZWVwIHRoYXQgaW4gbWluZC4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJtMzJyLWRlc2MuaCIKLSNpbmNsdWRlICJtMzJyLW9wYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0jdW5kZWYgbWluCi0jZGVmaW5lIG1pbihhLGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0jdW5kZWYgbWF4Ci0jZGVmaW5lIG1heChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCi0KLXN0YXRpYyBjb25zdCBjaGFyICogcGFyc2VfaW5zbl9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICosIGNvbnN0IGNoYXIgKiosIENHRU5fRklFTERTICopKTsKLQwKLS8qIC0tIGFzc2VtYmxlciByb3V0aW5lcyBpbnNlcnRlZCBoZXJlICovCi0KLS8qIC0tIGFzbS5jICovCi0KLS8qIEhhbmRsZSAnIycgcHJlZml4ZXMgKGkuZS4gc2tpcCBvdmVyIHRoZW0pLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaGFzaCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIGlmICgqKnN0cnAgPT0gJyMnKQotICAgICsrKnN0cnA7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBIYW5kbGUgc2hpZ2goKSwgaGlnaCgpLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaGkxNiAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHJlc3VsdF90eXBlOwotICBiZmRfdm1hIHZhbHVlOwotCi0gIGlmICgqKnN0cnAgPT0gJyMnKQotICAgICsrKnN0cnA7Ci0KLSAgaWYgKHN0cm5jYXNlY21wICgqc3RycCwgImhpZ2goIiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICAqc3RycCArPSA1OwotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8sCi0JCQkJICAgJnJlc3VsdF90eXBlLCAmdmFsdWUpOwotICAgICAgaWYgKCoqc3RycCAhPSAnKScpCi0JcmV0dXJuICJtaXNzaW5nIGApJyI7Ci0gICAgICArKypzdHJwOwotICAgICAgaWYgKGVycm1zZyA9PSBOVUxMCi0gIAkgICYmIHJlc3VsdF90eXBlID09IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSKQotCXZhbHVlID4+PSAxNjsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICAgIHJldHVybiBlcnJtc2c7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnN0cnAsICJzaGlnaCgiLCA2KSA9PSAwKQotICAgIHsKLSAgICAgICpzdHJwICs9IDY7Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBvcGluZGV4LCBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTywKLSAJCQkJICAgJnJlc3VsdF90eXBlLCAmdmFsdWUpOwotICAgICAgaWYgKCoqc3RycCAhPSAnKScpCi0JcmV0dXJuICJtaXNzaW5nIGApJyI7Ci0gICAgICArKypzdHJwOwotICAgICAgaWYgKGVycm1zZyA9PSBOVUxMCi0JICAmJiByZXN1bHRfdHlwZSA9PSBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX05VTUJFUikKLQl2YWx1ZSA9ICh2YWx1ZSA+PiAxNikgKyAodmFsdWUgJiAweDgwMDAgPyAxIDogMCk7Ci0gICAgICAqdmFsdWVwID0gdmFsdWU7Ci0gICAgICByZXR1cm4gZXJybXNnOwotICAgIH0KLQotICByZXR1cm4gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKTsKLX0KLQotLyogSGFuZGxlIGxvdygpIGluIGEgc2lnbmVkIGNvbnRleHQuICBBbHNvIGhhbmRsZSBzZGEoKS4KLSAgIFRoZSBzaWduZWRuZXNzIG9mIHRoZSB2YWx1ZSBkb2Vzbid0IG1hdHRlciB0byBsb3coKSwgYnV0IHRoaXMgYWxzbwotICAgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBsb3coKSBpc24ndCBwcmVzZW50LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2Vfc2xvMTYgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgbG9uZyAqdmFsdWVwOwotewotICBjb25zdCBjaGFyICplcnJtc2c7Ci0gIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCByZXN1bHRfdHlwZTsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICBpZiAoKipzdHJwID09ICcjJykKLSAgICArKypzdHJwOwotCi0gIGlmIChzdHJuY2FzZWNtcCAoKnN0cnAsICJsb3coIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICAqc3RycCArPSA0OwotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX00zMlJfTE8xNiwKLQkJCQkgICAmcmVzdWx0X3R5cGUsICZ2YWx1ZSk7Ci0gICAgICBpZiAoKipzdHJwICE9ICcpJykKLQlyZXR1cm4gIm1pc3NpbmcgYCknIjsKLSAgICAgICsrKnN0cnA7Ci0gICAgICBpZiAoZXJybXNnID09IE5VTEwKLQkgICYmIHJlc3VsdF90eXBlID09IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSKQotCXZhbHVlICY9IDB4ZmZmZjsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICAgIHJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gIGlmIChzdHJuY2FzZWNtcCAoKnN0cnAsICJzZGEoIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICAqc3RycCArPSA0OwotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX00zMlJfU0RBMTYsCi0JCQkJICAgTlVMTCwgJnZhbHVlKTsKLSAgICAgIGlmICgqKnN0cnAgIT0gJyknKQotCXJldHVybiAibWlzc2luZyBgKSciOwotICAgICAgKysqc3RycDsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICAgIHJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gIHJldHVybiBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKTsKLX0KLQotLyogSGFuZGxlIGxvdygpIGluIGFuIHVuc2lnbmVkIGNvbnRleHQuCi0gICBUaGUgc2lnbmVkbmVzcyBvZiB0aGUgdmFsdWUgZG9lc24ndCBtYXR0ZXIgdG8gbG93KCksIGJ1dCB0aGlzIGFsc28KLSAgIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgbG93KCkgaXNuJ3QgcHJlc2VudC4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX3VsbzE2IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0X3R5cGU7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgaWYgKCoqc3RycCA9PSAnIycpCi0gICAgKysqc3RycDsKLQotICBpZiAoc3RybmNhc2VjbXAgKCpzdHJwLCAibG93KCIsIDQpID09IDApCi0gICAgewotICAgICAgKnN0cnAgKz0gNDsKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIG9waW5kZXgsIEJGRF9SRUxPQ19NMzJSX0xPMTYsCi0JCQkJICAgJnJlc3VsdF90eXBlLCAmdmFsdWUpOwotICAgICAgaWYgKCoqc3RycCAhPSAnKScpCi0JcmV0dXJuICJtaXNzaW5nIGApJyI7Ci0gICAgICArKypzdHJwOwotICAgICAgaWYgKGVycm1zZyA9PSBOVUxMCi0JICAmJiByZXN1bHRfdHlwZSA9PSBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX05VTUJFUikKLQl2YWx1ZSAmPSAweGZmZmY7Ci0gICAgICAqdmFsdWVwID0gdmFsdWU7Ci0gICAgICByZXR1cm4gZXJybXNnOwotICAgIH0KLQotICByZXR1cm4gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKTsKLX0KLQotLyogLS0gKi8KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3Igb3BlcmFuZCBwYXJzaW5nLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHBhcnNlX2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcGFyc2VfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuCi0qLwotCi1jb25zdCBjaGFyICoKLW0zMnJfY2dlbl9wYXJzZV9vcGVyYW5kIChjZCwgb3BpbmRleCwgc3RycCwgZmllbGRzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgY29uc3QgY2hhciAqKiBzdHJwOwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLXsKLSAgY29uc3QgY2hhciAqIGVycm1zZzsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcywgJiBmaWVsZHMtPmZfcjEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIHsKLSAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX0RJU1AxNiwgMCwgTlVMTCwgICYgdmFsdWUpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDE2ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgewotICAgICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfRElTUDI0LCAwLCBOVUxMLCAgJiB2YWx1ZSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwMjQgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHsKLSAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX0RJU1A4LCAwLCBOVUxMLCAgJiB2YWx1ZSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwOCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsICYgZmllbGRzLT5mX3IxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgZXJybXNnID0gcGFyc2VfaGFzaCAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9IQVNILCAmZmllbGRzLT5mX25pbCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX2hpMTYgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfSEkxNiwgJmZpZWxkcy0+Zl9oaTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcywgJiBmaWVsZHMtPmZfcjIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfU0lNTTE2LCAmZmllbGRzLT5mX3NpbW0xNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1NJTU04LCAmZmllbGRzLT5mX3NpbW04KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX3NsbzE2IChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1NMTzE2LCAmZmllbGRzLT5mX3NpbW0xNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfcjIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfcjEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfcjIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9VSU1NMTYsICZmaWVsZHMtPmZfdWltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICB7Ci0gICAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9VSU1NMjQsIDAsIE5VTEwsICAmIHZhbHVlKTsKLSAgICAgICAgZmllbGRzLT5mX3VpbW0yNCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1VJTU00LCAmZmllbGRzLT5mX3VpbW00KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9VSU1NNSwgJmZpZWxkcy0+Zl91aW1tNSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICBlcnJtc2cgPSBwYXJzZV91bG8xNiAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9VTE8xNiwgJmZpZWxkcy0+Zl91aW1tMTYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBwYXJzaW5nLlxuIiksIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gZXJybXNnOwotfQotCi1jZ2VuX3BhcnNlX2ZuICogY29uc3QgbTMycl9jZ2VuX3BhcnNlX2hhbmRsZXJzW10gPSAKLXsKLSAgcGFyc2VfaW5zbl9ub3JtYWwsCi19OwotCi12b2lkCi1tMzJyX2NnZW5faW5pdF9hc20gKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBtMzJyX2NnZW5faW5pdF9vcGNvZGVfdGFibGUgKGNkKTsKLSAgbTMycl9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpOwotICBjZC0+cGFyc2VfaGFuZGxlcnMgPSAmIG0zMnJfY2dlbl9wYXJzZV9oYW5kbGVyc1swXTsKLSAgY2QtPnBhcnNlX29wZXJhbmQgPSBtMzJyX2NnZW5fcGFyc2Vfb3BlcmFuZDsKLX0KLQotDAotLyogRGVmYXVsdCBpbnNuIHBhcnNlci4KLQotICAgVGhlIHN5bnRheCBzdHJpbmcgaXMgc2Nhbm5lZCBhbmQgb3BlcmFuZHMgYXJlIHBhcnNlZCBhbmQgc3RvcmVkIGluIEZJRUxEUy4KLSAgIFJlbG9jcyBhcmUgcXVldWVkIGFzIHdlIGdvIHZpYSBvdGhlciBjYWxsYmFja3MuCi0KLSAgID8/PyBOb3RlIHRoYXQgdGhpcyBpcyBjdXJyZW50bHkgYW4gYWxsLW9yLW5vdGhpbmcgcGFyc2VyLiAgSWYgd2UgZmFpbCB0bwotICAgcGFyc2UgdGhlIGluc3RydWN0aW9uLCB3ZSByZXR1cm4gMCBhbmQgdGhlIGNhbGxlciB3aWxsIHN0YXJ0IG92ZXIgZnJvbQotICAgdGhlIGJlZ2lubmluZy4gIEJhY2t0cmFja2luZyB3aWxsIGJlIG5lY2Vzc2FyeSBpbiBwYXJzaW5nIHN1YmV4cHJlc3Npb25zLAotICAgYnV0IHRoYXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuICBOb3QgaGFuZGxpbmcgYmFja3RyYWNraW5nIGhlcmUgbWF5IGdldAotICAgZXhwZW5zaXZlIGluIHRoZSBjYXNlIG9mIHRoZSBtNjhrLiAgRGVhbCB3aXRoIGxhdGVyLgotCi0gICBSZXR1cm5zIE5VTEwgZm9yIHN1Y2Nlc3MsIGFuIGVycm9yIG1lc3NhZ2UgZm9yIGZhaWx1cmUuCi0qLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9pbnNuX25vcm1hbCAoY2QsIGluc24sIHN0cnAsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLXsKLSAgLyogPz8/IFJ1bnRpbWUgYWRkZWQgaW5zbnMgbm90IGhhbmRsZWQgeWV0LiAgKi8KLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICBjb25zdCBjaGFyICpzdHIgPSAqc3RycDsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotICBjb25zdCBjaGFyICpwOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICogc3luOwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSAgLyogRklYTUU6IHdpcCAqLwotICBpbnQgcGFzdF9vcGNvZGVfcDsKLSNlbmRpZgotCi0gIC8qIEZvciBub3cgd2UgYXNzdW1lIHRoZSBtbmVtb25pYyBpcyBmaXJzdCAodGhlcmUgYXJlIG5vIGxlYWRpbmcgb3BlcmFuZHMpLgotICAgICBXZSBjYW4gcGFyc2UgaXQgd2l0aG91dCBuZWVkaW5nIHRvIHNldCB1cCBvcGVyYW5kIHBhcnNpbmcuCi0gICAgIEdBUydzIGlucHV0IHNjcnViYmVyIHdpbGwgZW5zdXJlIG1uZW1vbmljcyBhcmUgbG93ZXJjYXNlLCBidXQgd2UgbWF5Ci0gICAgIG5vdCBiZSBjYWxsZWQgZnJvbSBHQVMuICAqLwotICBwID0gQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKTsKLSAgd2hpbGUgKCpwICYmIHRvbG93ZXIgKCpwKSA9PSB0b2xvd2VyICgqc3RyKSkKLSAgICArK3AsICsrc3RyOwotICAKLSAgaWYgKCogcCB8fCAoKiBzdHIgJiYgIWlzc3BhY2UgKCogc3RyKSkpCi0gICAgcmV0dXJuIF8oInVucmVjb2duaXplZCBpbnN0cnVjdGlvbiIpOwotCi0gIENHRU5fSU5JVF9QQVJTRSAoY2QpOwotICBjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCAoY2QpOwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSAgcGFzdF9vcGNvZGVfcCA9IDA7Ci0jZW5kaWYKLQotICAvKiBXZSBkb24ndCBjaGVjayBmb3IgKCpzdHIgIT0gJ1wwJykgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8gcGFyc2UKLSAgICAgYW55IHRyYWlsaW5nIGZha2UgYXJndW1lbnRzIGluIHRoZSBzeW50YXggc3RyaW5nLiAgKi8KLSAgc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOwotCi0gIC8qIE1uZW1vbmljcyBjb21lIGZpcnN0IGZvciBub3csIGVuc3VyZSB2YWxpZCBzdHJpbmcuICAqLwotICBpZiAoISBDR0VOX1NZTlRBWF9NTkVNT05JQ19QICgqIHN5bikpCi0gICAgYWJvcnQgKCk7Ci0KLSAgKytzeW47Ci0KLSAgd2hpbGUgKCogc3luICE9IDApCi0gICAgewotICAgICAgLyogTm9uIG9wZXJhbmQgY2hhcnMgbXVzdCBtYXRjaCBleGFjdGx5LiAgKi8KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCogc3luKSkKLQl7Ci0JICBpZiAoKnN0ciA9PSBDR0VOX1NZTlRBWF9DSEFSICgqIHN5bikpCi0JICAgIHsKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0JICAgICAgaWYgKCogc3luID09ICcgJykKLQkJcGFzdF9vcGNvZGVfcCA9IDE7Ci0jZW5kaWYKLQkgICAgICArKyBzeW47Ci0JICAgICAgKysgc3RyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBTeW50YXggY2hhciBkaWRuJ3QgbWF0Y2guICBDYW4ndCBiZSB0aGlzIGluc24uICAqLwotCSAgICAgIC8qIEZJWE1FOiB3b3VsZCBsaWtlIHRvIHJldHVybiBzb21ldGhpbmcgbGlrZQotCQkgImV4cGVjdGVkIGNoYXIgYGMnIiAqLwotCSAgICAgIHJldHVybiBfKCJzeW50YXggZXJyb3IiKTsKLQkgICAgfQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIGFuIG9wZXJhbmQgb2Ygc29tZSBzb3J0LiAgKi8KLSAgICAgIGVycm1zZyA9IG0zMnJfY2dlbl9wYXJzZV9vcGVyYW5kIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAotCQkJCQkgICZzdHIsIGZpZWxkcyk7Ci0gICAgICBpZiAoZXJybXNnKQotCXJldHVybiBlcnJtc2c7Ci0KLSAgICAgIC8qIERvbmUgd2l0aCB0aGlzIG9wZXJhbmQsIGNvbnRpbnVlIHdpdGggbmV4dCBvbmUuICAqLwotICAgICAgKysgc3luOwotICAgIH0KLQotICAvKiBJZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBzeW50YXggc3RyaW5nLCB3ZSdyZSBkb25lLiAgKi8KLSAgaWYgKCogc3luID09ICdcMCcpCi0gICAgewotICAgICAgLyogRklYTUU6IEZvciB0aGUgbW9tZW50IHdlIGFzc3VtZSBhIHZhbGlkIGBzdHInIGNhbiBvbmx5IGNvbnRhaW4KLQkgYmxhbmtzIG5vdy4gIElFOiBXZSBuZWVkbid0IHRyeSBhZ2FpbiB3aXRoIGEgbG9uZ2VyIHZlcnNpb24gb2YKLQkgdGhlIGluc24gYW5kIGl0IGlzIGFzc3VtZWQgdGhhdCBsb25nZXIgdmVyc2lvbnMgb2YgaW5zbnMgYXBwZWFyCi0JIGJlZm9yZSBzaG9ydGVyIG9uZXMgKGVnOiBsc3IgcjIscjMsMSB2cyBsc3IgcjIscjMpLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIHN0cikpCi0JKysgc3RyOwotCi0gICAgICBpZiAoKiBzdHIgIT0gJ1wwJykKLQlyZXR1cm4gXygianVuayBhdCBlbmQgb2YgbGluZSIpOyAvKiBGSVhNRTogd291bGQgbGlrZSB0byBpbmNsdWRlIGBzdHInICovCi0KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBXZSBjb3VsZG4ndCBwYXJzZSBpdC4gICovCi0gIHJldHVybiBfKCJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iKTsKLX0KLQwKLS8qIE1haW4gZW50cnkgcG9pbnQuCi0gICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBlYWNoIGluc3RydWN0aW9uIHRvIGJlIGFzc2VtYmxlZC4KLSAgIFNUUiBwb2ludHMgdG8gdGhlIGluc24gdG8gYmUgYXNzZW1ibGVkLgotICAgV2UgYXNzdW1lIGFsbCBuZWNlc3NhcnkgdGFibGVzIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KLSAgIFRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24sIGxlc3MgYW55IGZpeHVwcywgaXMgc3RvcmVkIGluIEJVRi4KLSAgIFJlbWVtYmVyIHRoYXQgaWYgQ0dFTl9JTlRfSU5TTl9QIHRoZW4gQlVGIGlzIGFuIGludCBhbmQgdGh1cyB0aGUgdmFsdWUKLSAgIHN0aWxsIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byB0YXJnZXQgYnl0ZSBvcmRlciwgb3RoZXJ3aXNlIEJVRiBpcyBhbiBhcnJheQotICAgb2YgYnl0ZXMgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuCi0gICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgaW5zbidzIGVudHJ5IGluIHRoZSBvcGNvZGUgdGFibGUsCi0gICBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VyZWQgKGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBoYXZlIGFscmVhZHkgYmVlbgotICAgcHJpbnRlZCkuCi0KLSAgIE5vdGUgdGhhdCB3aGVuIHByb2Nlc3NpbmcgKG5vbi1hbGlhcykgbWFjcm8taW5zbnMsCi0gICB0aGlzIGZ1bmN0aW9uIHJlY3Vyc2VzLgotCi0gICA/Pz8gSXQncyBwb3NzaWJsZSB0byBtYWtlIHRoaXMgY3B1LWluZGVwZW5kZW50LgotICAgT25lIHdvdWxkIGhhdmUgdG8gZGVhbCB3aXRoIGEgZmV3IG1pbm9yIHRoaW5ncy4KLSAgIEF0IHRoaXMgcG9pbnQgaW4gdGltZSBkb2luZyBzbyB3b3VsZCBiZSBtb3JlIG9mIGEgY3VyaW9zaXR5IHRoYW4gdXNlZnVsCi0gICBbZm9yIGV4YW1wbGUgdGhpcyBmaWxlIGlzbid0IF90aGF0XyBiaWddLCBidXQga2VlcGluZyB0aGUgcG9zc2liaWxpdHkgaW4KLSAgIG1pbmQgaGVscHMga2VlcCB0aGUgZGVzaWduIGNsZWFuLiAgKi8KLQotY29uc3QgQ0dFTl9JTlNOICoKLW0zMnJfY2dlbl9hc3NlbWJsZV9pbnNuIChjZCwgc3RyLCBmaWVsZHMsIGJ1ZiwgZXJybXNnKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICpzdHI7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmOwotICAgICBjaGFyICoqZXJybXNnOwotewotICBjb25zdCBjaGFyICpzdGFydDsKLSAgQ0dFTl9JTlNOX0xJU1QgKmlsaXN0OwotCi0gIC8qIFNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZS4gICovCi0gIHdoaWxlIChpc3NwYWNlICgqIHN0cikpCi0gICAgKysgc3RyOwotCi0gIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBoYXNoZWQgbGlzdHMuCi0gICAgIEdldCB0aGUgZmlyc3QgaW4gdGhlIGxpc3QuICAqLwotICBpbGlzdCA9IENHRU5fQVNNX0xPT0tVUF9JTlNOIChjZCwgc3RyKTsKLQotICAvKiBLZWVwIGxvb2tpbmcgdW50aWwgd2UgZmluZCBhIG1hdGNoLiAgKi8KLQotICBzdGFydCA9IHN0cjsKLSAgZm9yICggOyBpbGlzdCAhPSBOVUxMIDsgaWxpc3QgPSBDR0VOX0FTTV9ORVhUX0lOU04gKGlsaXN0KSkKLSAgICB7Ci0gICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSBpbGlzdC0+aW5zbjsKLQotI2lmIDAgLyogbm90IG5lZWRlZCBhcyB1bnN1cHBvcnRlZCBvcGNvZGVzIHNob3VsZG4ndCBiZSBpbiB0aGUgaGFzaCBsaXN0cyAqLwotICAgICAgLyogSXMgdGhpcyBpbnNuIHN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQgY3B1PyAgKi8KLSAgICAgIGlmICghIG0zMnJfY2dlbl9pbnNuX3N1cHBvcnRlZCAoY2QsIGluc24pKQotCWNvbnRpbnVlOwotI2VuZGlmCi0KLSAgICAgIC8qIElmIHRoZSBSRUxBWCBhdHRyaWJ1dGUgaXMgc2V0LCB0aGlzIGlzIGFuIGluc24gdGhhdCBzaG91bGRuJ3QgYmUKLQkgY2hvc2VuIGltbWVkaWF0ZWx5LiAgSW5zdGVhZCwgaXQgaXMgdXNlZCBkdXJpbmcgYXNzZW1ibGVyL2xpbmtlcgotCSByZWxheGF0aW9uIGlmIHBvc3NpYmxlLiAgKi8KLSAgICAgIGlmIChDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBzdHIgPSBzdGFydDsKLQotICAgICAgLyogQWxsb3cgcGFyc2UvaW5zZXJ0IGhhbmRsZXJzIHRvIG9idGFpbiBsZW5ndGggb2YgaW5zbi4gICovCi0gICAgICBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpID0gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pOwotCi0gICAgICBpZiAoISBDR0VOX1BBUlNFX0ZOIChjZCwgaW5zbikgKGNkLCBpbnNuLCAmIHN0ciwgZmllbGRzKSkKLQl7Ci0JICAvKiA/Pz8gMCBpcyBwYXNzZWQgZm9yIGBwYycgKi8KLQkgIGlmIChDR0VOX0lOU0VSVF9GTiAoY2QsIGluc24pIChjZCwgaW5zbiwgZmllbGRzLCBidWYsIChiZmRfdm1hKSAwKQotCSAgICAgICE9IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCSAgLyogSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBhY3R1YWxseSBvdXRwdXQgdGhlIGluc24gYW5kIGFueQotCSAgICAgcXVldWVkIHJlbG9jcy4gICovCi0JICByZXR1cm4gaW5zbjsKLQl9Ci0KLSAgICAgIC8qIFRyeSB0aGUgbmV4dCBlbnRyeS4gICovCi0gICAgfQotCi0gIC8qIEZJWE1FOiBXZSBjYW4gcmV0dXJuIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgdGhhbiB0aGlzLgotICAgICBOZWVkIHRvIHRyYWNrIHdoeSBpdCBmYWlsZWQgYW5kIHBpY2sgdGhlIHJpZ2h0IG9uZS4gICovCi0gIHsKLSAgICBzdGF0aWMgY2hhciBlcnJidWZbMTAwXTsKLSAgICBpZiAoc3RybGVuIChzdGFydCkgPiA1MCkKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBzcHJpbnRmIChlcnJidWYsIF8oImJhZCBpbnN0cnVjdGlvbiBgJS41MHMuLi4nIiksIHN0YXJ0KTsKLSAgICBlbHNlIAotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHNwcmludGYgKGVycmJ1ZiwgXygiYmFkIGluc3RydWN0aW9uIGAlLjUwcyciKSwgc3RhcnQpOwotICAgICAgCi0gICAgKmVycm1zZyA9IGVycmJ1ZjsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotDAotI2lmIDAgLyogVGhpcyBjYWxscyBiYWNrIHRvIEdBUyB3aGljaCB3ZSBjYW4ndCBkbyB3aXRob3V0IGNhcmUuICAqLwotCi0vKiBSZWNvcmQgZWFjaCBtZW1iZXIgb2YgT1BWQUxTIGluIHRoZSBhc3NlbWJsZXIncyBzeW1ib2wgdGFibGUuCi0gICBUaGlzIGxldHMgR0FTIHBhcnNlIHJlZ2lzdGVycyBmb3IgdXMuCi0gICA/Pz8gSW50ZXJlc3RpbmcgaWRlYSBidXQgbm90IGN1cnJlbnRseSB1c2VkLiAgKi8KLQotLyogUmVjb3JkIGVhY2ggbWVtYmVyIG9mIE9QVkFMUyBpbiB0aGUgYXNzZW1ibGVyJ3Mgc3ltYm9sIHRhYmxlLgotICAgRklYTUU6IE5vdCBjdXJyZW50bHkgdXNlZC4gICovCi0KLXZvaWQKLW0zMnJfY2dlbl9hc21faGFzaF9rZXl3b3JkcyAoY2QsIG9wdmFscykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9LRVlXT1JEICpvcHZhbHM7Ci17Ci0gIENHRU5fS0VZV09SRF9TRUFSQ0ggc2VhcmNoID0gY2dlbl9rZXl3b3JkX3NlYXJjaF9pbml0IChvcHZhbHMsIE5VTEwpOwotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKiBrZTsKLQotICB3aGlsZSAoKGtlID0gY2dlbl9rZXl3b3JkX3NlYXJjaF9uZXh0ICgmIHNlYXJjaCkpICE9IE5VTEwpCi0gICAgewotI2lmIDAgLyogVW5uZWNlc3NhcnksIHNob3VsZCBiZSBkb25lIGluIHRoZSBzZWFyY2ggcm91dGluZS4gICovCi0gICAgICBpZiAoISBtMzJyX2NnZW5fb3B2YWxfc3VwcG9ydGVkIChrZSkpCi0JY29udGludWU7Ci0jZW5kaWYKLSAgICAgIGNnZW5fYXNtX3JlY29yZF9yZWdpc3RlciAoY2QsIGtlLT5uYW1lLCBrZS0+dmFsdWUpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qIDAgKi8KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1kZXNjLmMgYi9vcGNvZGVzL20zMnItZGVzYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2I1NDYyLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1kZXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUwICswLDAgQEAKLS8qIENQVSBkYXRhIGZvciBtMzJyLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAibTMyci1kZXNjLmgiCi0jaW5jbHVkZSAibTMyci1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogQXR0cmlidXRlcy4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX0FUVFJfRU5UUlkgYm9vbF9hdHRyW10gPQotewotICB7ICIjZiIsIDAgfSwKLSAgeyAiI3QiLCAxIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9BVFRSX0VOVFJZIE1BQ0hfYXR0cltdID0KLXsKLSAgeyAiYmFzZSIsIE1BQ0hfQkFTRSB9LAotICB7ICJtMzJyIiwgTUFDSF9NMzJSIH0sCi0gIHsgIm1heCIsIE1BQ0hfTUFYIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9BVFRSX0VOVFJZIElTQV9hdHRyW10gPQotewotICB7ICJtMzJyIiwgSVNBX00zMlIgfSwKLSAgeyAibWF4IiwgSVNBX01BWCB9LAotICB7IDAsIDAgfQotfTsKLQotY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9pZmllbGRfYXR0cl90YWJsZVtdID0KLXsKLSAgeyAiTUFDSCIsICYgTUFDSF9hdHRyWzBdIH0sCi0gIHsgIlZJUlRVQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBDUkVMLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkFCUy1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRVNFUlZFRCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0lHTi1PUFQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR05FRCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVMT0MiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi1jb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX2hhcmR3YXJlX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJDQUNIRS1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUFJPRklMRSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5fb3BlcmFuZF9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUENSRUwtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQUJTLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR04tT1BUIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdORUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIk5FR0FUSVZFIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxBWCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0VNLU9OTFkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFTE9DIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJIQVNILVBSRUZJWCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5faW5zbl9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiQUxJQVMiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlZJUlRVQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlVOQ09ORC1DVEkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkNPTkQtQ1RJIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTS0lQLUNUSSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiREVMQVktU0xPVCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVMQVhBQkxFIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxBWCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiTk8tRElTIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQkIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkZJTEwtU0xPVCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLS8qIEluc3RydWN0aW9uIHNldCB2YXJpYW50cy4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lTQSBtMzJyX2NnZW5faXNhX3RhYmxlW10gPSB7Ci0gIHsgIm0zMnIiLCAzMiwgMzIsIDE2LCAzMiwgIH0sCi0gIHsgMCB9Ci19OwotCi0vKiBNYWNoaW5lIHZhcmlhbnRzLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fTUFDSCBtMzJyX2NnZW5fbWFjaF90YWJsZVtdID0gewotICB7ICJtMzJyIiwgIm0zMnIiLCBNQUNIX00zMlIgfSwKLSAgeyAwIH0KLX07Ci0KLXN0YXRpYyBDR0VOX0tFWVdPUkRfRU5UUlkgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzX2VudHJpZXNbXSA9Ci17Ci0gIHsgImZwIiwgMTMgfSwKLSAgeyAibHIiLCAxNCB9LAotICB7ICJzcCIsIDE1IH0sCi0gIHsgInIwIiwgMCB9LAotICB7ICJyMSIsIDEgfSwKLSAgeyAicjIiLCAyIH0sCi0gIHsgInIzIiwgMyB9LAotICB7ICJyNCIsIDQgfSwKLSAgeyAicjUiLCA1IH0sCi0gIHsgInI2IiwgNiB9LAotICB7ICJyNyIsIDcgfSwKLSAgeyAicjgiLCA4IH0sCi0gIHsgInI5IiwgOSB9LAotICB7ICJyMTAiLCAxMCB9LAotICB7ICJyMTEiLCAxMSB9LAotICB7ICJyMTIiLCAxMiB9LAotICB7ICJyMTMiLCAxMyB9LAotICB7ICJyMTQiLCAxNCB9LAotICB7ICJyMTUiLCAxNSB9Ci19OwotCi1DR0VOX0tFWVdPUkQgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzID0KLXsKLSAgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXNfZW50cmllc1swXSwKLSAgMTkKLX07Ci0KLXN0YXRpYyBDR0VOX0tFWVdPUkRfRU5UUlkgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzX2VudHJpZXNbXSA9Ci17Ci0gIHsgInBzdyIsIDAgfSwKLSAgeyAiY2JyIiwgMSB9LAotICB7ICJzcGkiLCAyIH0sCi0gIHsgInNwdSIsIDMgfSwKLSAgeyAiYnBjIiwgNiB9LAotICB7ICJiYnBzdyIsIDggfSwKLSAgeyAiYmJwYyIsIDE0IH0sCi0gIHsgImNyMCIsIDAgfSwKLSAgeyAiY3IxIiwgMSB9LAotICB7ICJjcjIiLCAyIH0sCi0gIHsgImNyMyIsIDMgfSwKLSAgeyAiY3I0IiwgNCB9LAotICB7ICJjcjUiLCA1IH0sCi0gIHsgImNyNiIsIDYgfSwKLSAgeyAiY3I3IiwgNyB9LAotICB7ICJjcjgiLCA4IH0sCi0gIHsgImNyOSIsIDkgfSwKLSAgeyAiY3IxMCIsIDEwIH0sCi0gIHsgImNyMTEiLCAxMSB9LAotICB7ICJjcjEyIiwgMTIgfSwKLSAgeyAiY3IxMyIsIDEzIH0sCi0gIHsgImNyMTQiLCAxNCB9LAotICB7ICJjcjE1IiwgMTUgfQotfTsKLQotQ0dFTl9LRVlXT1JEIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcyA9Ci17Ci0gICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzX2VudHJpZXNbMF0sCi0gIDIzCi19OwotCi0KLQotLyogVGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSFdfLGEpKQotCi1jb25zdCBDR0VOX0hXX0VOVFJZIG0zMnJfY2dlbl9od190YWJsZVtdID0KLXsKLSAgeyAiaC1tZW1vcnkiLCBIV19IX01FTU9SWSwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXNpbnQiLCBIV19IX1NJTlQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC11aW50IiwgSFdfSF9VSU5ULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtYWRkciIsIEhXX0hfQUREUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWlhZGRyIiwgSFdfSF9JQUREUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXBjIiwgSFdfSF9QQywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwfEEoUFJPRklMRSl8QShQQyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtaGkxNiIsIEhXX0hfSEkxNiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXVsbzE2IiwgSFdfSF9VTE8xNiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWdyIiwgSFdfSF9HUiwgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIHsgMHxBKENBQ0hFX0FERFIpfEEoUFJPRklMRSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtY3IiLCBIV19IX0NSLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWNvbmQiLCBIV19IX0NPTkQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1wc3ciLCBIV19IX1BTVywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWJwc3ciLCBIV19IX0JQU1csIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1iYnBzdyIsIEhXX0hfQkJQU1csIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1sb2NrIiwgSFdfSF9MT0NLLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgMCB9Ci19OwotCi0jdW5kZWYgQQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gZmllbGQgdGFibGUuICAqLwotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JRkxEXyxhKSkKLQotY29uc3QgQ0dFTl9JRkxEIG0zMnJfY2dlbl9pZmxkX3RhYmxlW10gPQotewotICB7IE0zMlJfRl9OSUwsICJmLW5pbCIsIDAsIDAsIDAsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX09QMSwgImYtb3AxIiwgMCwgMzIsIDAsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX09QMiwgImYtb3AyIiwgMCwgMzIsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0NPTkQsICJmLWNvbmQiLCAwLCAzMiwgNCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfUjEsICJmLXIxIiwgMCwgMzIsIDQsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1IyLCAiZi1yMiIsIDAsIDMyLCAxMiwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfU0lNTTgsICJmLXNpbW04IiwgMCwgMzIsIDgsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1NJTU0xNiwgImYtc2ltbTE2IiwgMCwgMzIsIDE2LCAxNiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfU0hJRlRfT1AyLCAiZi1zaGlmdC1vcDIiLCAwLCAzMiwgOCwgMywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfVUlNTTQsICJmLXVpbW00IiwgMCwgMzIsIDEyLCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9VSU1NNSwgImYtdWltbTUiLCAwLCAzMiwgMTEsIDUsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1VJTU0xNiwgImYtdWltbTE2IiwgMCwgMzIsIDE2LCAxNiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfVUlNTTI0LCAiZi11aW1tMjQiLCAwLCAzMiwgOCwgMjQsIHsgMHxBKFJFTE9DKXxBKEFCU19BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0hJMTYsICJmLWhpMTYiLCAwLCAzMiwgMTYsIDE2LCB7IDB8QShTSUdOX09QVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9ESVNQOCwgImYtZGlzcDgiLCAwLCAzMiwgOCwgOCwgeyAwfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9ESVNQMTYsICJmLWRpc3AxNiIsIDAsIDMyLCAxNiwgMTYsIHsgMHxBKFJFTE9DKXxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfRElTUDI0LCAiZi1kaXNwMjQiLCAwLCAzMiwgOCwgMjQsIHsgMHxBKFJFTE9DKXxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyAwIH0KLX07Ci0KLSN1bmRlZiBBCi0KLS8qIFRoZSBvcGVyYW5kIHRhYmxlLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fT1BFUkFORF8sYSkpCi0jZGVmaW5lIE9QRVJBTkQob3ApIENPTkNBVDIgKE0zMlJfT1BFUkFORF8sb3ApCi0KLWNvbnN0IENHRU5fT1BFUkFORCBtMzJyX2NnZW5fb3BlcmFuZF90YWJsZVtdID0KLXsKLS8qIHBjOiBwcm9ncmFtIGNvdW50ZXIgKi8KLSAgeyAicGMiLCBNMzJSX09QRVJBTkRfUEMsIEhXX0hfUEMsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNyOiBzb3VyY2UgcmVnaXN0ZXIgKi8KLSAgeyAic3IiLCBNMzJSX09QRVJBTkRfU1IsIEhXX0hfR1IsIDEyLCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkcjogZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KLSAgeyAiZHIiLCBNMzJSX09QRVJBTkRfRFIsIEhXX0hfR1IsIDQsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNyYzE6IHNvdXJjZSByZWdpc3RlciAxICovCi0gIHsgInNyYzEiLCBNMzJSX09QRVJBTkRfU1JDMSwgSFdfSF9HUiwgNCwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc3JjMjogc291cmNlIHJlZ2lzdGVyIDIgKi8KLSAgeyAic3JjMiIsIE0zMlJfT1BFUkFORF9TUkMyLCBIV19IX0dSLCAxMiwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc2NyOiBzb3VyY2UgY29udHJvbCByZWdpc3RlciAqLwotICB7ICJzY3IiLCBNMzJSX09QRVJBTkRfU0NSLCBIV19IX0NSLCAxMiwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGNyOiBkZXN0aW5hdGlvbiBjb250cm9sIHJlZ2lzdGVyICovCi0gIHsgImRjciIsIE0zMlJfT1BFUkFORF9EQ1IsIEhXX0hfQ1IsIDQsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNpbW04OiA4IGJpdCBzaWduZWQgaW1tZWRpYXRlICovCi0gIHsgInNpbW04IiwgTTMyUl9PUEVSQU5EX1NJTU04LCBIV19IX1NJTlQsIDgsIDgsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNpbW0xNjogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAic2ltbTE2IiwgTTMyUl9PUEVSQU5EX1NJTU0xNiwgSFdfSF9TSU5ULCAxNiwgMTYsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHVpbW00OiA0IGJpdCB0cmFwIG51bWJlciAqLwotICB7ICJ1aW1tNCIsIE0zMlJfT1BFUkFORF9VSU1NNCwgSFdfSF9VSU5ULCAxMiwgNCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdWltbTU6IDUgYml0IHNoaWZ0IGNvdW50ICovCi0gIHsgInVpbW01IiwgTTMyUl9PUEVSQU5EX1VJTU01LCBIV19IX1VJTlQsIDExLCA1LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1aW1tMTY6IDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAidWltbTE2IiwgTTMyUl9PUEVSQU5EX1VJTU0xNiwgSFdfSF9VSU5ULCAxNiwgMTYsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGhhc2g6ICMgcHJlZml4ICovCi0gIHsgImhhc2giLCBNMzJSX09QRVJBTkRfSEFTSCwgSFdfSF9TSU5ULCAwLCAwLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBoaTE2OiBoaWdoIDE2IGJpdCBpbW1lZGlhdGUsIHNpZ24gb3B0aW9uYWwgKi8KLSAgeyAiaGkxNiIsIE0zMlJfT1BFUkFORF9ISTE2LCBIV19IX0hJMTYsIDE2LCAxNiwKLSAgICB7IDB8QShTSUdOX09QVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc2xvMTY6IDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlLCBmb3IgbG93KCkgKi8KLSAgeyAic2xvMTYiLCBNMzJSX09QRVJBTkRfU0xPMTYsIEhXX0hfU0xPMTYsIDE2LCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdWxvMTY6IDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUsIGZvciBsb3coKSAqLwotICB7ICJ1bG8xNiIsIE0zMlJfT1BFUkFORF9VTE8xNiwgSFdfSF9VTE8xNiwgMTYsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1aW1tMjQ6IDI0IGJpdCBhZGRyZXNzICovCi0gIHsgInVpbW0yNCIsIE0zMlJfT1BFUkFORF9VSU1NMjQsIEhXX0hfQUREUiwgOCwgMjQsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpfEEoUkVMT0MpfEEoQUJTX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRpc3A4OiA4IGJpdCBkaXNwbGFjZW1lbnQgKi8KLSAgeyAiZGlzcDgiLCBNMzJSX09QRVJBTkRfRElTUDgsIEhXX0hfSUFERFIsIDgsIDgsCi0gICAgeyAwfEEoUkVMQVgpfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGlzcDE2OiAxNiBiaXQgZGlzcGxhY2VtZW50ICovCi0gIHsgImRpc3AxNiIsIE0zMlJfT1BFUkFORF9ESVNQMTYsIEhXX0hfSUFERFIsIDE2LCAxNiwKLSAgICB7IDB8QShSRUxPQyl8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXNwMjQ6IDI0IGJpdCBkaXNwbGFjZW1lbnQgKi8KLSAgeyAiZGlzcDI0IiwgTTMyUl9PUEVSQU5EX0RJU1AyNCwgSFdfSF9JQUREUiwgOCwgMjQsCi0gICAgeyAwfEEoUkVMQVgpfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogY29uZGJpdDogY29uZGl0aW9uIGJpdCAqLwotICB7ICJjb25kYml0IiwgTTMyUl9PUEVSQU5EX0NPTkRCSVQsIEhXX0hfQ09ORCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogYWNjdW06IGFjY3VtdWxhdG9yICovCi0gIHsgImFjY3VtIiwgTTMyUl9PUEVSQU5EX0FDQ1VNLCBIV19IX0FDQ1VNLCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgMCB9Ci19OwotCi0jdW5kZWYgQQotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JTlNOXyxhKSkKLSNkZWZpbmUgT1AoZmllbGQpIENHRU5fU1lOVEFYX01BS0VfRklFTEQgKE9QRVJBTkQgKGZpZWxkKSkKLQotLyogVGhlIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fSUJBU0UgbTMycl9jZ2VuX2luc25fdGFibGVbTUFYX0lOU05TXSA9Ci17Ci0gIC8qIFNwZWNpYWwgbnVsbCBmaXJzdCBlbnRyeS4KLSAgICAgQSBgbnVtJyB2YWx1ZSBvZiB6ZXJvIGlzIHRodXMgaW52YWxpZC4KLSAgICAgQWxzbywgdGhlIHNwZWNpYWwgYGludmFsaWQnIGluc24gcmVzaWRlcyBoZXJlLiAgKi8KLSAgeyAwLCAwLCAwIH0sCi0vKiBhZGQgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FERCwgImFkZCIsICJhZGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGQzICRkciwkc3IsJGhhc2gkc2xvMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BREQzLCAiYWRkMyIsICJhZGQzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYW5kICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BTkQsICJhbmQiLCAiYW5kIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYW5kMyAkZHIsJHNyLCR1aW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BTkQzLCAiYW5kMyIsICJhbmQzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogb3IgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX09SLCAib3IiLCAib3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBvcjMgJGRyLCRzciwkaGFzaCR1bG8xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX09SMywgIm9yMyIsICJvcjMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiB4b3IgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1hPUiwgInhvciIsICJ4b3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiB4b3IzICRkciwkc3IsJHVpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1hPUjMsICJ4b3IzIiwgInhvcjMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGRpICRkciwkc2ltbTggKi8KLSAgewotICAgIE0zMlJfSU5TTl9BRERJLCAiYWRkaSIsICJhZGRpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYWRkdiAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fQUREViwgImFkZHYiLCAiYWRkdiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFkZHYzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FERFYzLCAiYWRkdjMiLCAiYWRkdjMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGR4ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BRERYLCAiYWRkeCIsICJhZGR4IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmMucyAkZGlzcDggKi8KLSAgewotICAgIE0zMlJfSU5TTl9CQzgsICJiYzgiLCAiYmMucyIsIDE2LAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJjLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JDMjQsICJiYzI0IiwgImJjLmwiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZXEgJHNyYzEsJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JFUSwgImJlcSIsICJiZXEiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZXF6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CRVFaLCAiYmVxeiIsICJiZXF6IiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmdleiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkdFWiwgImJnZXoiLCAiYmdleiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJndHogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JHVFosICJiZ3R6IiwgImJndHoiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibGV6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTEVaLCAiYmxleiIsICJibGV6IiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmx0eiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkxUWiwgImJsdHoiLCAiYmx0eiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJuZXogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JORVosICJibmV6IiwgImJuZXoiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibC5zICRkaXNwOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JMOCwgImJsOCIsICJibC5zIiwgMTYsCi0gICAgeyAwfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmwubCAkZGlzcDI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkwyNCwgImJsMjQiLCAiYmwubCIsIDMyLAotICAgIHsgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5jLnMgJGRpc3A4ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQk5DOCwgImJuYzgiLCAiYm5jLnMiLCAxNiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibmMubCAkZGlzcDI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQk5DMjQsICJibmMyNCIsICJibmMubCIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJuZSAkc3JjMSwkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQk5FLCAiYm5lIiwgImJuZSIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJyYS5zICRkaXNwOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JSQTgsICJicmE4IiwgImJyYS5zIiwgMTYsCi0gICAgeyAwfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnJhLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JSQTI0LCAiYnJhMjQiLCAiYnJhLmwiLCAzMiwKLSAgICB7IDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcCAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0NNUCwgImNtcCIsICJjbXAiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXBpICRzcmMyLCRzaW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9DTVBJLCAiY21waSIsICJjbXBpIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21wdSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0NNUFUsICJjbXB1IiwgImNtcHUiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXB1aSAkc3JjMiwkc2ltbTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQ01QVUksICJjbXB1aSIsICJjbXB1aSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRpdiAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fRElWLCAiZGl2IiwgImRpdiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRpdnUgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0RJVlUsICJkaXZ1IiwgImRpdnUiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiByZW0gJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1JFTSwgInJlbSIsICJyZW0iLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiByZW11ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9SRU1VLCAicmVtdSIsICJyZW11IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogamwgJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fSkwsICJqbCIsICJqbCIsIDE2LAotICAgIHsgMHxBKEZJTExfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGptcCAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9KTVAsICJqbXAiLCAiam1wIiwgMTYsCi0gICAgeyAwfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCAkZHIsQCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xELCAibGQiLCAibGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEX0QsICJsZC1kIiwgImxkIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRiICRkcixAJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERCLCAibGRiIiwgImxkYiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkYiAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEQl9ELCAibGRiLWQiLCAibGRiIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRoICRkcixAJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERILCAibGRoIiwgImxkaCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xESF9ELCAibGRoLWQiLCAibGRoIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGR1YiAkZHIsQCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEVUIsICJsZHViIiwgImxkdWIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHViICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERVQl9ELCAibGR1Yi1kIiwgImxkdWIiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHVoICRkcixAJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERVSCwgImxkdWgiLCAibGR1aCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWggJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MRFVIX0QsICJsZHVoLWQiLCAibGR1aCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkICRkcixAJHNyKyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEX1BMVVMsICJsZC1wbHVzIiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQyNCAkZHIsJHVpbW0yNCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEMjQsICJsZDI0IiwgImxkMjQiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGk4ICRkciwkc2ltbTggKi8KLSAgewotICAgIE0zMlJfSU5TTl9MREk4LCAibGRpOCIsICJsZGk4IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpMTYgJGRyLCRoYXNoJHNsbzE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERJMTYsICJsZGkxNiIsICJsZGkxNiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxvY2sgJGRyLEAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MT0NLLCAibG9jayIsICJsb2NrIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbWFjaGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNISSwgIm1hY2hpIiwgIm1hY2hpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogbWFjbG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNMTywgIm1hY2xvIiwgIm1hY2xvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogbWFjd2hpICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTUFDV0hJLCAibWFjd2hpIiwgIm1hY3doaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSB9IH0KLSAgfSwKLS8qIG1hY3dsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ1dMTywgIm1hY3dsbyIsICJtYWN3bG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9Ci0gIH0sCi0vKiBtdWwgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTCwgIm11bCIsICJtdWwiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtdWxoaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTEhJLCAibXVsaGkiLCAibXVsaGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9Ci0gIH0sCi0vKiBtdWxsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTExPLCAibXVsbG8iLCAibXVsbG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9Ci0gIH0sCi0vKiBtdWx3aGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUxXSEksICJtdWx3aGkiLCAibXVsd2hpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogbXVsd2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMV0xPLCAibXVsd2xvIiwgIm11bHdsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSB9IH0KLSAgfSwKLS8qIG12ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NViwgIm12IiwgIm12IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbXZmYWNoaSAkZHIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVkZBQ0hJLCAibXZmYWNoaSIsICJtdmZhY2hpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogbXZmYWNsbyAkZHIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVkZBQ0xPLCAibXZmYWNsbyIsICJtdmZhY2xvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogbXZmYWNtaSAkZHIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVkZBQ01JLCAibXZmYWNtaSIsICJtdmZhY21pIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogbXZmYyAkZHIsJHNjciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WRkMsICJtdmZjIiwgIm12ZmMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtdnRhY2hpICRzcmMxICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZUQUNISSwgIm12dGFjaGkiLCAibXZ0YWNoaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSB9IH0KLSAgfSwKLS8qIG12dGFjbG8gJHNyYzEgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVlRBQ0xPLCAibXZ0YWNsbyIsICJtdnRhY2xvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogbXZ0YyAkc3IsJGRjciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WVEMsICJtdnRjIiwgIm12dGMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBuZWcgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX05FRywgIm5lZyIsICJuZWciLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBub3AgKi8KLSAgewotICAgIE0zMlJfSU5TTl9OT1AsICJub3AiLCAibm9wIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbm90ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9OT1QsICJub3QiLCAibm90IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogcmFjICovCi0gIHsKLSAgICBNMzJSX0lOU05fUkFDLCAicmFjIiwgInJhYyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSB9IH0KLSAgfSwKLS8qIHJhY2ggKi8KLSAgewotICAgIE0zMlJfSU5TTl9SQUNILCAicmFjaCIsICJyYWNoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogcnRlICovCi0gIHsKLSAgICBNMzJSX0lOU05fUlRFLCAicnRlIiwgInJ0ZSIsIDE2LAotICAgIHsgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc2V0aCAkZHIsJGhhc2gkaGkxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NFVEgsICJzZXRoIiwgInNldGgiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzbGwgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NMTCwgInNsbCIsICJzbGwiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzbGwzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NMTDMsICJzbGwzIiwgInNsbDMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzbGxpICRkciwkdWltbTUgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TTExJLCAic2xsaSIsICJzbGxpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3JhICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TUkEsICJzcmEiLCAic3JhIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3JhMyAkZHIsJHNyLCRzaW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TUkEzLCAic3JhMyIsICJzcmEzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3JhaSAkZHIsJHVpbW01ICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1JBSSwgInNyYWkiLCAic3JhaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHNybCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1JMLCAic3JsIiwgInNybCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHNybDMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1JMMywgInNybDMiLCAic3JsMyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHNybGkgJGRyLCR1aW1tNSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NSTEksICJzcmxpIiwgInNybGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVCwgInN0IiwgInN0IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1RfRCwgInN0LWQiLCAic3QiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1RCLCAic3RiIiwgInN0YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVEJfRCwgInN0Yi1kIiwgInN0YiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVEgsICJzdGgiLCAic3RoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RoICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NUSF9ELCAic3RoLWQiLCAic3RoIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJHNyYzEsQCskc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NUX1BMVVMsICJzdC1wbHVzIiwgInN0IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJHNyYzEsQC0kc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NUX01JTlVTLCAic3QtbWludXMiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdWIgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NVQiwgInN1YiIsICJzdWIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdWJ2ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVUJWLCAic3VidiIsICJzdWJ2IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3VieCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1VCWCwgInN1YngiLCAic3VieCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHRyYXAgJHVpbW00ICovCi0gIHsKLSAgICBNMzJSX0lOU05fVFJBUCwgInRyYXAiLCAidHJhcCIsIDE2LAotICAgIHsgMHxBKEZJTExfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHVubG9jayAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9VTkxPQ0ssICJ1bmxvY2siLCAidW5sb2NrIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotfTsKLQotI3VuZGVmIEEKLSN1bmRlZiBNTkVNCi0jdW5kZWYgT1AKLQotLyogSW5pdGlhbGl6ZSBhbnl0aGluZyBuZWVkZWQgdG8gYmUgZG9uZSBvbmNlLCBiZWZvcmUgYW55IGNwdV9vcGVuIGNhbGwuICAqLwotCi1zdGF0aWMgdm9pZAotaW5pdF90YWJsZXMgKCkKLXsKLX0KLQotLyogU3Vicm91dGluZSBvZiBtMzJyX2NnZW5fY3B1X29wZW4gdG8gbG9vayB1cCBhIG1hY2ggdmlhIGl0cyBiZmQgbmFtZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX01BQ0ggKgotbG9va3VwX21hY2hfdmlhX2JmZF9uYW1lICh0YWJsZSwgbmFtZSkKLSAgICAgY29uc3QgQ0dFTl9NQUNIICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgd2hpbGUgKHRhYmxlLT5uYW1lKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHRhYmxlLT5iZmRfbmFtZSkgPT0gMCkKLQlyZXR1cm4gdGFibGU7Ci0gICAgICArK3RhYmxlOwotICAgIH0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbTMycl9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9od190YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgaW50IGk7Ci0gIGludCBtYWNocyA9IGNkLT5tYWNoczsKLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqaW5pdCA9ICYgbTMycl9jZ2VuX2h3X3RhYmxlWzBdOwotICAvKiBNQVhfSFcgaXMgb25seSBhbiB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGVudHJpZXMuCi0gICAgIEhvd2V2ZXIgZWFjaCBlbnRyeSBpcyBpbmRleGVkIGJ5IGl0J3MgZW51bSBzbyB0aGVyZSBjYW4gYmUgaG9sZXMgaW4KLSAgICAgdGhlIHRhYmxlLiAgKi8KLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqKnNlbGVjdGVkID0KLSAgICAoY29uc3QgQ0dFTl9IV19FTlRSWSAqKikgeG1hbGxvYyAoTUFYX0hXICogc2l6ZW9mIChDR0VOX0hXX0VOVFJZICopKTsKLQotICBjZC0+aHdfdGFibGUuaW5pdF9lbnRyaWVzID0gaW5pdDsKLSAgY2QtPmh3X3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fSFdfRU5UUlkpOwotICBtZW1zZXQgKHNlbGVjdGVkLCAwLCBNQVhfSFcgKiBzaXplb2YgKENHRU5fSFdfRU5UUlkgKikpOwotICAvKiA/Pz8gRm9yIG5vdyB3ZSBqdXN0IHVzZSBtYWNocyB0byBkZXRlcm1pbmUgd2hpY2ggb25lcyB3ZSB3YW50LiAgKi8KLSAgZm9yIChpID0gMDsgaW5pdFtpXS5uYW1lICE9IE5VTEw7ICsraSkKLSAgICBpZiAoQ0dFTl9IV19BVFRSX1ZBTFVFICgmaW5pdFtpXSwgQ0dFTl9IV19NQUNIKQotCSYgbWFjaHMpCi0gICAgICBzZWxlY3RlZFtpbml0W2ldLnR5cGVdID0gJmluaXRbaV07Ci0gIGNkLT5od190YWJsZS5lbnRyaWVzID0gc2VsZWN0ZWQ7Ci0gIGNkLT5od190YWJsZS5udW1fZW50cmllcyA9IE1BWF9IVzsKLX0KLQotLyogU3Vicm91dGluZSBvZiBtMzJyX2NnZW5fY3B1X29wZW4gdG8gYnVpbGQgdGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2lmaWVsZF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgY2QtPmlmbGRfdGFibGUgPSAmIG0zMnJfY2dlbl9pZmxkX3RhYmxlWzBdOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIG0zMnJfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfb3BlcmFuZF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgaW50IGk7Ci0gIGludCBtYWNocyA9IGNkLT5tYWNoczsKLSAgY29uc3QgQ0dFTl9PUEVSQU5EICppbml0ID0gJiBtMzJyX2NnZW5fb3BlcmFuZF90YWJsZVswXTsKLSAgLyogTUFYX09QRVJBTkRTIGlzIG9ubHkgYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbnRyaWVzLgotICAgICBIb3dldmVyIGVhY2ggZW50cnkgaXMgaW5kZXhlZCBieSBpdCdzIGVudW0gc28gdGhlcmUgY2FuIGJlIGhvbGVzIGluCi0gICAgIHRoZSB0YWJsZS4gICovCi0gIGNvbnN0IENHRU5fT1BFUkFORCAqKnNlbGVjdGVkID0KLSAgICAoY29uc3QgQ0dFTl9PUEVSQU5EICoqKSB4bWFsbG9jIChNQVhfT1BFUkFORFMgKiBzaXplb2YgKENHRU5fT1BFUkFORCAqKSk7Ci0KLSAgY2QtPm9wZXJhbmRfdGFibGUuaW5pdF9lbnRyaWVzID0gaW5pdDsKLSAgY2QtPm9wZXJhbmRfdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9PUEVSQU5EKTsKLSAgbWVtc2V0IChzZWxlY3RlZCwgMCwgTUFYX09QRVJBTkRTICogc2l6ZW9mIChDR0VOX09QRVJBTkQgKikpOwotICAvKiA/Pz8gRm9yIG5vdyB3ZSBqdXN0IHVzZSBtYWNoIHRvIGRldGVybWluZSB3aGljaCBvbmVzIHdlIHdhbnQuICAqLwotICBmb3IgKGkgPSAwOyBpbml0W2ldLm5hbWUgIT0gTlVMTDsgKytpKQotICAgIGlmIChDR0VOX09QRVJBTkRfQVRUUl9WQUxVRSAoJmluaXRbaV0sIENHRU5fT1BFUkFORF9NQUNIKQotCSYgbWFjaHMpCi0gICAgICBzZWxlY3RlZFtpbml0W2ldLnR5cGVdID0gJmluaXRbaV07Ci0gIGNkLT5vcGVyYW5kX3RhYmxlLmVudHJpZXMgPSBzZWxlY3RlZDsKLSAgY2QtPm9wZXJhbmRfdGFibGUubnVtX2VudHJpZXMgPSBNQVhfT1BFUkFORFM7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbTMycl9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4KLSAgID8/PyBUaGlzIGNvdWxkIGxlYXZlIG91dCBpbnNucyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzcGVjaWZpZWQgbWFjaC9pc2EsCi0gICBidXQgdGhhdCB3b3VsZCBjYXVzZSBlcnJvcnMgbGlrZSAiZm9vIG9ubHkgc3VwcG9ydGVkIGJ5IGJhciIgdG8gYmVjb21lCi0gICAidW5rbm93biBpbnNuIiwgc28gZm9yIG5vdyB3ZSBpbmNsdWRlIGFsbCBpbnNucyBhbmQgcmVxdWlyZSB0aGUgYXBwIHRvCi0gICBkbyB0aGUgY2hlY2tpbmcgbGF0ZXIuCi0gICA/Pz8gT24gdGhlIG90aGVyIGhhbmQsIHBhcnNpbmcgb2Ygc3VjaCBpbnNucyBtYXkgcmVxdWlyZSB0aGVpciBoYXJkd2FyZSBvcgotICAgb3BlcmFuZCBlbGVtZW50cyB0byBiZSBpbiB0aGUgdGFibGUgW3doaWNoIHRoZXkgbWlnaHRuJ3QgYmVdLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2luc25fdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpOwotICBjb25zdCBDR0VOX0lCQVNFICppYiA9ICYgbTMycl9jZ2VuX2luc25fdGFibGVbMF07Ci0gIENHRU5fSU5TTiAqaW5zbnMgPSAoQ0dFTl9JTlNOICopIHhtYWxsb2MgKE1BWF9JTlNOUyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0KLSAgbWVtc2V0IChpbnNucywgMCwgTUFYX0lOU05TICogc2l6ZW9mIChDR0VOX0lOU04pKTsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9JTlNOUzsgKytpKQotICAgIGluc25zW2ldLmJhc2UgPSAmaWJbaV07Ci0gIGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllcyA9IGluc25zOwotICBjZC0+aW5zbl90YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX0lCQVNFKTsKLSAgY2QtPmluc25fdGFibGUubnVtX2luaXRfZW50cmllcyA9IE1BWF9JTlNOUzsKLX0KLQotLyogU3Vicm91dGluZSBvZiBtMzJyX2NnZW5fY3B1X29wZW4gdG8gcmVidWlsZCB0aGUgdGFibGVzLiAgKi8KLQotc3RhdGljIHZvaWQKLW0zMnJfY2dlbl9yZWJ1aWxkX3RhYmxlcyAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgaW50IGksbl9pc2FzLG5fbWFjaHM7Ci0gIHVuc2lnbmVkIGludCBpc2FzID0gY2QtPmlzYXM7Ci0gIHVuc2lnbmVkIGludCBtYWNocyA9IGNkLT5tYWNoczsKLQotICBjZC0+aW50X2luc25fcCA9IENHRU5fSU5UX0lOU05fUDsKLQotICAvKiBEYXRhIGRlcml2ZWQgZnJvbSB0aGUgaXNhIHNwZWMuICAqLwotI2RlZmluZSBVTlNFVCAoQ0dFTl9TSVpFX1VOS05PV04gKyAxKQotICBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPSBVTlNFVDsKLSAgY2QtPmJhc2VfaW5zbl9iaXRzaXplID0gVU5TRVQ7Ci0gIGNkLT5taW5faW5zbl9iaXRzaXplID0gNjU1MzU7IC8qIHNvbWUgcmlkaWN1bG91c2x5IGJpZyBudW1iZXIgKi8KLSAgY2QtPm1heF9pbnNuX2JpdHNpemUgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lTQVM7ICsraSkKLSAgICBpZiAoKCgxIDw8IGkpICYgaXNhcykgIT0gMCkKLSAgICAgIHsKLQljb25zdCBDR0VOX0lTQSAqaXNhID0gJiBtMzJyX2NnZW5faXNhX3RhYmxlW2ldOwotCi0JLyogRGVmYXVsdCBpbnNuIHNpemVzIG9mIGFsbCBzZWxlY3RlZCBpc2FzIG11c3QgYmUgZXF1YWwgb3Igd2Ugc2V0Ci0JICAgdGhlIHJlc3VsdCB0byAwLCBtZWFuaW5nICJ1bmtub3duIi4gICovCi0JaWYgKGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9PSBVTlNFVCkKLQkgIGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9IGlzYS0+ZGVmYXVsdF9pbnNuX2JpdHNpemU7Ci0JZWxzZSBpZiAoaXNhLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9PSBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUpCi0JICA7IC8qIHRoaXMgaXMgb2sgKi8KLQllbHNlCi0JICBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPSBDR0VOX1NJWkVfVU5LTk9XTjsKLQotCS8qIEJhc2UgaW5zbiBzaXplcyBvZiBhbGwgc2VsZWN0ZWQgaXNhcyBtdXN0IGJlIGVxdWFsIG9yIHdlIHNldAotCSAgIHRoZSByZXN1bHQgdG8gMCwgbWVhbmluZyAidW5rbm93biIuICAqLwotCWlmIChjZC0+YmFzZV9pbnNuX2JpdHNpemUgPT0gVU5TRVQpCi0JICBjZC0+YmFzZV9pbnNuX2JpdHNpemUgPSBpc2EtPmJhc2VfaW5zbl9iaXRzaXplOwotCWVsc2UgaWYgKGlzYS0+YmFzZV9pbnNuX2JpdHNpemUgPT0gY2QtPmJhc2VfaW5zbl9iaXRzaXplKQotCSAgOyAvKiB0aGlzIGlzIG9rICovCi0JZWxzZQotCSAgY2QtPmJhc2VfaW5zbl9iaXRzaXplID0gQ0dFTl9TSVpFX1VOS05PV047Ci0KLQkvKiBTZXQgbWluLG1heCBpbnNuIHNpemVzLiAgKi8KLQlpZiAoaXNhLT5taW5faW5zbl9iaXRzaXplIDwgY2QtPm1pbl9pbnNuX2JpdHNpemUpCi0JICBjZC0+bWluX2luc25fYml0c2l6ZSA9IGlzYS0+bWluX2luc25fYml0c2l6ZTsKLQlpZiAoaXNhLT5tYXhfaW5zbl9iaXRzaXplID4gY2QtPm1heF9pbnNuX2JpdHNpemUpCi0JICBjZC0+bWF4X2luc25fYml0c2l6ZSA9IGlzYS0+bWF4X2luc25fYml0c2l6ZTsKLQotCSsrbl9pc2FzOwotICAgICAgfQotCi0gIC8qIERhdGEgZGVyaXZlZCBmcm9tIHRoZSBtYWNoIHNwZWMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX01BQ0hTOyArK2kpCi0gICAgaWYgKCgoMSA8PCBpKSAmIG1hY2hzKSAhPSAwKQotICAgICAgewotCWNvbnN0IENHRU5fTUFDSCAqbWFjaCA9ICYgbTMycl9jZ2VuX21hY2hfdGFibGVbaV07Ci0KLQkrK25fbWFjaHM7Ci0gICAgICB9Ci0KLSAgLyogRGV0ZXJtaW5lIHdoaWNoIGh3IGVsZW1lbnRzIGFyZSB1c2VkIGJ5IE1BQ0guICAqLwotICBidWlsZF9od190YWJsZSAoY2QpOwotCi0gIC8qIEJ1aWxkIHRoZSBpZmllbGQgdGFibGUuICAqLwotICBidWlsZF9pZmllbGRfdGFibGUgKGNkKTsKLQotICAvKiBEZXRlcm1pbmUgd2hpY2ggb3BlcmFuZHMgYXJlIHVzZWQgYnkgTUFDSC9JU0EuICAqLwotICBidWlsZF9vcGVyYW5kX3RhYmxlIChjZCk7Ci0KLSAgLyogQnVpbGQgdGhlIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLSAgYnVpbGRfaW5zbl90YWJsZSAoY2QpOwotfQotCi0vKiBJbml0aWFsaXplIGEgY3B1IHRhYmxlIGFuZCByZXR1cm4gYSBkZXNjcmlwdG9yLgotICAgSXQncyBtdWNoIGxpa2Ugb3BlbmluZyBhIGZpbGUsIGFuZCBtdXN0IGJlIHRoZSBmaXJzdCBmdW5jdGlvbiBjYWxsZWQuCi0gICBUaGUgYXJndW1lbnRzIGFyZSBhIHNldCBvZiAodHlwZS92YWx1ZSkgcGFpcnMsIHRlcm1pbmF0ZWQgd2l0aAotICAgQ0dFTl9DUFVfT1BFTl9FTkQuCi0KLSAgIEN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzOgotICAgQ0dFTl9DUFVfT1BFTl9JU0FTOiAgICBiaXRtYXAgb2YgdmFsdWVzIGluIGVudW0gaXNhX2F0dHIKLSAgIENHRU5fQ1BVX09QRU5fTUFDSFM6ICAgYml0bWFwIG9mIHZhbHVlcyBpbiBlbnVtIG1hY2hfYXR0cgotICAgQ0dFTl9DUFVfT1BFTl9CRkRNQUNIOiBzcGVjaWZ5IDEgbWFjaCB1c2luZyBiZmQgbmFtZQotICAgQ0dFTl9DUFVfT1BFTl9FTkRJQU46ICBzcGVjaWZ5IGVuZGlhbiBjaG9pY2UKLSAgIENHRU5fQ1BVX09QRU5fRU5EOiAgICAgdGVybWluYXRlcyBhcmd1bWVudHMKLQotICAgPz8/IFNpbXVsdGFuZW91cyBtdWx0aXBsZSBpc2FzIG1pZ2h0IG5vdCBtYWtlIHNlbnNlLCBidXQgaXQncyBub3QgKHlldCkKLSAgIHByZWNsdWRlZC4KLQotICAgPz8/IFdlIG9ubHkgc3VwcG9ydCBJU08gQyBzdGRhcmdzIGhlcmUsIG5vdCBLJlIuCi0gICBMYXppbmVzcywgcGx1cyBleHBlcmltZW50IHRvIHNlZSBpZiBhbnl0aGluZyByZXF1aXJlcyBLJlIgLSBldmVudHVhbGx5Ci0gICBLJlIgd2lsbCBubyBsb25nZXIgYmUgc3VwcG9ydGVkIC0gZS5nLiBHREIgaXMgY3VycmVudGx5IHRyeWluZyB0aGlzLiAgKi8KLQotQ0dFTl9DUFVfREVTQwotbTMycl9jZ2VuX2NwdV9vcGVuIChlbnVtIGNnZW5fY3B1X29wZW5fYXJnIGFyZ190eXBlLCAuLi4pCi17Ci0gIENHRU5fQ1BVX1RBQkxFICpjZCA9IChDR0VOX0NQVV9UQUJMRSAqKSB4bWFsbG9jIChzaXplb2YgKENHRU5fQ1BVX1RBQkxFKSk7Ci0gIHN0YXRpYyBpbnQgaW5pdF9wOwotICB1bnNpZ25lZCBpbnQgaXNhcyA9IDA7ICAvKiAwID0gInVuc3BlY2lmaWVkIiAqLwotICB1bnNpZ25lZCBpbnQgbWFjaHMgPSAwOyAvKiAwID0gInVuc3BlY2lmaWVkIiAqLwotICBlbnVtIGNnZW5fZW5kaWFuIGVuZGlhbiA9IENHRU5fRU5ESUFOX1VOS05PV047Ci0gIHZhX2xpc3QgYXA7Ci0KLSAgaWYgKCEgaW5pdF9wKQotICAgIHsKLSAgICAgIGluaXRfdGFibGVzICgpOwotICAgICAgaW5pdF9wID0gMTsKLSAgICB9Ci0KLSAgbWVtc2V0IChjZCwgMCwgc2l6ZW9mICgqY2QpKTsKLQotICB2YV9zdGFydCAoYXAsIGFyZ190eXBlKTsKLSAgd2hpbGUgKGFyZ190eXBlICE9IENHRU5fQ1BVX09QRU5fRU5EKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYXJnX3R5cGUpCi0JewotCWNhc2UgQ0dFTl9DUFVfT1BFTl9JU0FTIDoKLQkgIGlzYXMgPSB2YV9hcmcgKGFwLCB1bnNpZ25lZCBpbnQpOwotCSAgYnJlYWs7Ci0JY2FzZSBDR0VOX0NQVV9PUEVOX01BQ0hTIDoKLQkgIG1hY2hzID0gdmFfYXJnIChhcCwgdW5zaWduZWQgaW50KTsKLQkgIGJyZWFrOwotCWNhc2UgQ0dFTl9DUFVfT1BFTl9CRkRNQUNIIDoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZSA9IHZhX2FyZyAoYXAsIGNvbnN0IGNoYXIgKik7Ci0JICAgIGNvbnN0IENHRU5fTUFDSCAqbWFjaCA9Ci0JICAgICAgbG9va3VwX21hY2hfdmlhX2JmZF9uYW1lIChtMzJyX2NnZW5fbWFjaF90YWJsZSwgbmFtZSk7Ci0KLQkgICAgbWFjaHMgfD0gbWFjaC0+bnVtIDw8IDE7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgQ0dFTl9DUFVfT1BFTl9FTkRJQU4gOgotCSAgZW5kaWFuID0gdmFfYXJnIChhcCwgZW51bSBjZ2VuX2VuZGlhbik7Ci0JICBicmVhazsKLQlkZWZhdWx0IDoKLQkgIGZwcmludGYgKHN0ZGVyciwgIm0zMnJfY2dlbl9jcHVfb3BlbjogdW5zdXBwb3J0ZWQgYXJndW1lbnQgYCVkJ1xuIiwKLQkJICAgYXJnX3R5cGUpOwotCSAgYWJvcnQgKCk7IC8qID8/PyByZXR1cm4gTlVMTD8gKi8KLQl9Ci0gICAgICBhcmdfdHlwZSA9IHZhX2FyZyAoYXAsIGVudW0gY2dlbl9jcHVfb3Blbl9hcmcpOwotICAgIH0KLSAgdmFfZW5kIChhcCk7Ci0KLSAgLyogbWFjaCB1bnNwZWNpZmllZCBtZWFucyAiYWxsIiAqLwotICBpZiAobWFjaHMgPT0gMCkKLSAgICBtYWNocyA9ICgxIDw8IE1BWF9NQUNIUykgLSAxOwotICAvKiBiYXNlIG1hY2ggaXMgYWx3YXlzIHNlbGVjdGVkICovCi0gIG1hY2hzIHw9IDE7Ci0gIC8qIGlzYSB1bnNwZWNpZmllZCBtZWFucyAiYWxsIiAqLwotICBpZiAoaXNhcyA9PSAwKQotICAgIGlzYXMgPSAoMSA8PCBNQVhfSVNBUykgLSAxOwotICBpZiAoZW5kaWFuID09IENHRU5fRU5ESUFOX1VOS05PV04pCi0gICAgewotICAgICAgLyogPz8/IElmIHRhcmdldCBoYXMgb25seSBvbmUsIGNvdWxkIGhhdmUgYSBkZWZhdWx0LiAgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIm0zMnJfY2dlbl9jcHVfb3Blbjogbm8gZW5kaWFubmVzcyBzcGVjaWZpZWRcbiIpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGNkLT5pc2FzID0gaXNhczsKLSAgY2QtPm1hY2hzID0gbWFjaHM7Ci0gIGNkLT5lbmRpYW4gPSBlbmRpYW47Ci0gIC8qIEZJWE1FOiBmb3IgdGhlIHNwYXJjIGNhc2Ugd2UgY2FuIGRldGVybWluZSBpbnNuLWVuZGlhbm5lc3Mgc3RhdGljYWxseS4KLSAgICAgVGhlIHdvcnJ5IGhlcmUgaXMgd2hlcmUgYm90aCBkYXRhIGFuZCBpbnNuIGVuZGlhbiBjYW4gYmUgaW5kZXBlbmRlbnRseQotICAgICBjaG9zZW4sIGluIHdoaWNoIGNhc2UgdGhpcyBmdW5jdGlvbiB3aWxsIG5lZWQgYW5vdGhlciBhcmd1bWVudC4KLSAgICAgQWN0dWFsbHksIHdpbGwgd2FudCB0byBhbGxvdyBmb3IgbW9yZSBhcmd1bWVudHMgaW4gdGhlIGZ1dHVyZSBhbnl3YXkuICAqLwotICBjZC0+aW5zbl9lbmRpYW4gPSBlbmRpYW47Ci0KLSAgLyogVGFibGUgKHJlKWJ1aWxkZXIuICAqLwotICBjZC0+cmVidWlsZF90YWJsZXMgPSBtMzJyX2NnZW5fcmVidWlsZF90YWJsZXM7Ci0gIG0zMnJfY2dlbl9yZWJ1aWxkX3RhYmxlcyAoY2QpOwotCi0gIHJldHVybiAoQ0dFTl9DUFVfREVTQykgY2Q7Ci19Ci0KLS8qIENvdmVyIGZuIHRvIG0zMnJfY2dlbl9jcHVfb3BlbiB0byBoYW5kbGUgdGhlIHNpbXBsZSBjYXNlIG9mIDEgaXNhLCAxIG1hY2guCi0gICBNQUNIX05BTUUgaXMgdGhlIGJmZCBuYW1lIG9mIHRoZSBtYWNoLiAgKi8KLQotQ0dFTl9DUFVfREVTQwotbTMycl9jZ2VuX2NwdV9vcGVuXzEgKG1hY2hfbmFtZSwgZW5kaWFuKQotICAgICBjb25zdCBjaGFyICptYWNoX25hbWU7Ci0gICAgIGVudW0gY2dlbl9lbmRpYW4gZW5kaWFuOwotewotICByZXR1cm4gbTMycl9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX0JGRE1BQ0gsIG1hY2hfbmFtZSwKLQkJCSAgICAgICBDR0VOX0NQVV9PUEVOX0VORElBTiwgZW5kaWFuLAotCQkJICAgICAgIENHRU5fQ1BVX09QRU5fRU5EKTsKLX0KLQotLyogQ2xvc2UgYSBjcHUgdGFibGUuCi0gICA/Pz8gVGhpcyBjYW4gbGl2ZSBpbiBhIG1hY2hpbmUgaW5kZXBlbmRlbnQgZmlsZSwgYnV0IHRoZXJlJ3MgY3VycmVudGx5Ci0gICBubyBwbGFjZSB0byBwdXQgdGhpcyBmaWxlICh0aGVyZSdzIG5vIGxpYmNnZW4pLiAgbGlib3Bjb2RlcyBpcyB0aGUgd3JvbmcKLSAgIHBsYWNlIGFzIHNvbWUgc2ltdWxhdG9yIHBvcnRzIHVzZSB0aGlzIGJ1dCB0aGV5IGRvbid0IHVzZSBsaWJvcGNvZGVzLiAgKi8KLQotdm9pZAotbTMycl9jZ2VuX2NwdV9jbG9zZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGlmIChjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXMpCi0gICAgZnJlZSAoKENHRU5fSU5TTiAqKSBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXMpOwotICBpZiAoY2QtPmh3X3RhYmxlLmVudHJpZXMpCi0gICAgZnJlZSAoKENHRU5fSFdfRU5UUlkgKikgY2QtPmh3X3RhYmxlLmVudHJpZXMpOwotICBmcmVlIChjZCk7Ci19Ci0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1kZXNjLmggYi9vcGNvZGVzL20zMnItZGVzYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTM2MzZjLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1kZXNjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyogQ1BVIGRhdGEgaGVhZGVyIGZvciBtMzJyLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIE0zMlJfQ1BVX0gKLSNkZWZpbmUgTTMyUl9DUFVfSAotCi0jZGVmaW5lIENHRU5fQVJDSCBtMzJyCi0KLS8qIEdpdmVuIHN5bWJvbCBTLCByZXR1cm4gbTMycl9jZ2VuXzxTPi4gICovCi0jZGVmaW5lIENHRU5fU1lNKHMpIENPTkNBVDMgKG0zMnIsX2NnZW5fLHMpCi0KLS8qIFNlbGVjdGVkIGNwdSBmYW1pbGllcy4gICovCi0jZGVmaW5lIEhBVkVfQ1BVX00zMlJCRgotCi0jZGVmaW5lIENHRU5fSU5TTl9MU0IwX1AgMAotCi0vKiBNYXhpbXVtIHNpemUgb2YgYW55IGluc24gKGluIGJ5dGVzKS4gICovCi0jZGVmaW5lIENHRU5fTUFYX0lOU05fU0laRSA0Ci0KLSNkZWZpbmUgQ0dFTl9JTlRfSU5TTl9QIDEKLQotLyogRklYTUU6IE5lZWQgdG8gY29tcHV0ZSBDR0VOX01BWF9TWU5UQVhfQllURVMuICAqLwotCi0vKiBDR0VOX01ORU1PTklDX09QRVJBTkRTIGlzIGRlZmluZWQgaWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMuCi0gICBlLmcuIEluICJiLGEgZm9vIiB0aGUgIixhIiBpcyBhbiBvcGVyYW5kLiAgSWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMKLSAgIHdlIGNhbid0IGhhc2ggb24gZXZlcnl0aGluZyB1cCB0byB0aGUgc3BhY2UuICAqLwotI2RlZmluZSBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0vKiBNYXhpbXVtIG51bWJlciBvZiBvcGVyYW5kcyBhbnkgaW5zbiBvciBtYWNyby1pbnNuIGhhcy4gICovCi0jZGVmaW5lIENHRU5fTUFYX0lOU05fT1BFUkFORFMgMTYKLQotLyogTWF4aW11bSBudW1iZXIgb2YgZmllbGRzIGluIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQ0dFTl9NQVhfSUZNVF9PUEVSQU5EUyA3Ci0KLS8qIEVudW1zLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBmb3JtYXQgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fb3AxIHsKLSAgT1AxXzAsIE9QMV8xLCBPUDFfMiwgT1AxXzMKLSAsIE9QMV80LCBPUDFfNSwgT1AxXzYsIE9QMV83Ci0gLCBPUDFfOCwgT1AxXzksIE9QMV8xMCwgT1AxXzExCi0gLCBPUDFfMTIsIE9QMV8xMywgT1AxXzE0LCBPUDFfMTUKLX0gSU5TTl9PUDE7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG9wMiBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDIgewotICBPUDJfMCwgT1AyXzEsIE9QMl8yLCBPUDJfMwotICwgT1AyXzQsIE9QMl81LCBPUDJfNiwgT1AyXzcKLSAsIE9QMl84LCBPUDJfOSwgT1AyXzEwLCBPUDJfMTEKLSAsIE9QMl8xMiwgT1AyXzEzLCBPUDJfMTQsIE9QMl8xNQotfSBJTlNOX09QMjsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgLiAgKi8KLXR5cGVkZWYgZW51bSBncl9uYW1lcyB7Ci0gIEhfR1JfRlAgPSAxMywgSF9HUl9MUiA9IDE0LCBIX0dSX1NQID0gMTUsIEhfR1JfUjAgPSAwCi0gLCBIX0dSX1IxID0gMSwgSF9HUl9SMiA9IDIsIEhfR1JfUjMgPSAzLCBIX0dSX1I0ID0gNAotICwgSF9HUl9SNSA9IDUsIEhfR1JfUjYgPSA2LCBIX0dSX1I3ID0gNywgSF9HUl9SOCA9IDgKLSAsIEhfR1JfUjkgPSA5LCBIX0dSX1IxMCA9IDEwLCBIX0dSX1IxMSA9IDExLCBIX0dSX1IxMiA9IDEyCi0gLCBIX0dSX1IxMyA9IDEzLCBIX0dSX1IxNCA9IDE0LCBIX0dSX1IxNSA9IDE1Ci19IEdSX05BTUVTOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciAuICAqLwotdHlwZWRlZiBlbnVtIGNyX25hbWVzIHsKLSAgSF9DUl9QU1cgPSAwLCBIX0NSX0NCUiA9IDEsIEhfQ1JfU1BJID0gMiwgSF9DUl9TUFUgPSAzCi0gLCBIX0NSX0JQQyA9IDYsIEhfQ1JfQkJQU1cgPSA4LCBIX0NSX0JCUEMgPSAxNCwgSF9DUl9DUjAgPSAwCi0gLCBIX0NSX0NSMSA9IDEsIEhfQ1JfQ1IyID0gMiwgSF9DUl9DUjMgPSAzLCBIX0NSX0NSNCA9IDQKLSAsIEhfQ1JfQ1I1ID0gNSwgSF9DUl9DUjYgPSA2LCBIX0NSX0NSNyA9IDcsIEhfQ1JfQ1I4ID0gOAotICwgSF9DUl9DUjkgPSA5LCBIX0NSX0NSMTAgPSAxMCwgSF9DUl9DUjExID0gMTEsIEhfQ1JfQ1IxMiA9IDEyCi0gLCBIX0NSX0NSMTMgPSAxMywgSF9DUl9DUjE0ID0gMTQsIEhfQ1JfQ1IxNSA9IDE1Ci19IENSX05BTUVTOwotCi0vKiBBdHRyaWJ1dGVzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgbWFjaGluZSB0eXBlIHNlbGVjdGlvbi4gICovCi10eXBlZGVmIGVudW0gbWFjaF9hdHRyIHsKLSAgTUFDSF9CQVNFLCBNQUNIX00zMlIKLSAsIE1BQ0hfTUFYCi19IE1BQ0hfQVRUUjsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zdHJ1Y3Rpb24gc2V0IHNlbGVjdGlvbi4gICovCi10eXBlZGVmIGVudW0gaXNhX2F0dHIgewotICBJU0FfTTMyUiwgSVNBX01BWAotfSBJU0FfQVRUUjsKLQotLyogTnVtYmVyIG9mIGFyY2hpdGVjdHVyZSB2YXJpYW50cy4gICovCi0jZGVmaW5lIE1BWF9JU0FTICAxCi0jZGVmaW5lIE1BWF9NQUNIUyAoKGludCkgTUFDSF9NQVgpCi0KLS8qIElmaWVsZCBzdXBwb3J0LiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBjZ2VuX2lmbGQgbTMycl9jZ2VuX2lmbGRfdGFibGVbXTsKLQotLyogSWZpZWxkIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9pZmxkIGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2lmbGRfYXR0ciB7Ci0gIENHRU5fSUZMRF9WSVJUVUFMLCBDR0VOX0lGTERfUENSRUxfQUREUiwgQ0dFTl9JRkxEX0FCU19BRERSLCBDR0VOX0lGTERfUkVTRVJWRUQKLSAsIENHRU5fSUZMRF9TSUdOX09QVCwgQ0dFTl9JRkxEX1NJR05FRCwgQ0dFTl9JRkxEX1JFTE9DLCBDR0VOX0lGTERfRU5EX0JPT0xTCi0gLCBDR0VOX0lGTERfU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fSUZMRF9NQUNILCBDR0VOX0lGTERfRU5EX05CT09MUwotfSBDR0VOX0lGTERfQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faWZsZF9hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9JRkxEX05CT09MX0FUVFJTIChDR0VOX0lGTERfRU5EX05CT09MUyAtIENHRU5fSUZMRF9TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtMzJyIGlmaWVsZCB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gaWZpZWxkX3R5cGUgewotICBNMzJSX0ZfTklMLCBNMzJSX0ZfT1AxLCBNMzJSX0ZfT1AyLCBNMzJSX0ZfQ09ORAotICwgTTMyUl9GX1IxLCBNMzJSX0ZfUjIsIE0zMlJfRl9TSU1NOCwgTTMyUl9GX1NJTU0xNgotICwgTTMyUl9GX1NISUZUX09QMiwgTTMyUl9GX1VJTU00LCBNMzJSX0ZfVUlNTTUsIE0zMlJfRl9VSU1NMTYKLSAsIE0zMlJfRl9VSU1NMjQsIE0zMlJfRl9ISTE2LCBNMzJSX0ZfRElTUDgsIE0zMlJfRl9ESVNQMTYKLSAsIE0zMlJfRl9ESVNQMjQKLSAsIE0zMlJfRl9NQVgKLX0gSUZJRUxEX1RZUEU7Ci0KLSNkZWZpbmUgTUFYX0lGTEQgKChpbnQpIE0zMlJfRl9NQVgpCi0KLS8qIEhhcmR3YXJlIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9odyBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9od19hdHRyIHsKLSAgQ0dFTl9IV19WSVJUVUFMLCBDR0VOX0hXX0NBQ0hFX0FERFIsIENHRU5fSFdfUEMsIENHRU5fSFdfUFJPRklMRQotICwgQ0dFTl9IV19FTkRfQk9PTFMsIENHRU5fSFdfU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fSFdfTUFDSCwgQ0dFTl9IV19FTkRfTkJPT0xTCi19IENHRU5fSFdfQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faHdfYXR0ci4gICovCi0jZGVmaW5lIENHRU5fSFdfTkJPT0xfQVRUUlMgKENHRU5fSFdfRU5EX05CT09MUyAtIENHRU5fSFdfU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgbTMyciBoYXJkd2FyZSB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9od190eXBlIHsKLSAgSFdfSF9NRU1PUlksIEhXX0hfU0lOVCwgSFdfSF9VSU5ULCBIV19IX0FERFIKLSAsIEhXX0hfSUFERFIsIEhXX0hfUEMsIEhXX0hfSEkxNiwgSFdfSF9TTE8xNgotICwgSFdfSF9VTE8xNiwgSFdfSF9HUiwgSFdfSF9DUiwgSFdfSF9BQ0NVTQotICwgSFdfSF9DT05ELCBIV19IX1BTVywgSFdfSF9CUFNXLCBIV19IX0JCUFNXCi0gLCBIV19IX0xPQ0ssIEhXX01BWAotfSBDR0VOX0hXX1RZUEU7Ci0KLSNkZWZpbmUgTUFYX0hXICgoaW50KSBIV19NQVgpCi0KLS8qIE9wZXJhbmQgYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX29wZXJhbmQgYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5fb3BlcmFuZF9hdHRyIHsKLSAgQ0dFTl9PUEVSQU5EX1ZJUlRVQUwsIENHRU5fT1BFUkFORF9QQ1JFTF9BRERSLCBDR0VOX09QRVJBTkRfQUJTX0FERFIsIENHRU5fT1BFUkFORF9TSUdOX09QVAotICwgQ0dFTl9PUEVSQU5EX1NJR05FRCwgQ0dFTl9PUEVSQU5EX05FR0FUSVZFLCBDR0VOX09QRVJBTkRfUkVMQVgsIENHRU5fT1BFUkFORF9TRU1fT05MWQotICwgQ0dFTl9PUEVSQU5EX1JFTE9DLCBDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgsIENHRU5fT1BFUkFORF9FTkRfQk9PTFMsIENHRU5fT1BFUkFORF9TVEFSVF9OQk9PTFMgPSAzMQotICwgQ0dFTl9PUEVSQU5EX01BQ0gsIENHRU5fT1BFUkFORF9FTkRfTkJPT0xTCi19IENHRU5fT1BFUkFORF9BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9vcGVyYW5kX2F0dHIuICAqLwotI2RlZmluZSBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMgKENHRU5fT1BFUkFORF9FTkRfTkJPT0xTIC0gQ0dFTl9PUEVSQU5EX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG0zMnIgb3BlcmFuZCB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9vcGVyYW5kX3R5cGUgewotICBNMzJSX09QRVJBTkRfUEMsIE0zMlJfT1BFUkFORF9TUiwgTTMyUl9PUEVSQU5EX0RSLCBNMzJSX09QRVJBTkRfU1JDMQotICwgTTMyUl9PUEVSQU5EX1NSQzIsIE0zMlJfT1BFUkFORF9TQ1IsIE0zMlJfT1BFUkFORF9EQ1IsIE0zMlJfT1BFUkFORF9TSU1NOAotICwgTTMyUl9PUEVSQU5EX1NJTU0xNiwgTTMyUl9PUEVSQU5EX1VJTU00LCBNMzJSX09QRVJBTkRfVUlNTTUsIE0zMlJfT1BFUkFORF9VSU1NMTYKLSAsIE0zMlJfT1BFUkFORF9IQVNILCBNMzJSX09QRVJBTkRfSEkxNiwgTTMyUl9PUEVSQU5EX1NMTzE2LCBNMzJSX09QRVJBTkRfVUxPMTYKLSAsIE0zMlJfT1BFUkFORF9VSU1NMjQsIE0zMlJfT1BFUkFORF9ESVNQOCwgTTMyUl9PUEVSQU5EX0RJU1AxNiwgTTMyUl9PUEVSQU5EX0RJU1AyNAotICwgTTMyUl9PUEVSQU5EX0NPTkRCSVQsIE0zMlJfT1BFUkFORF9BQ0NVTSwgTTMyUl9PUEVSQU5EX01BWAotfSBDR0VOX09QRVJBTkRfVFlQRTsKLQotLyogTnVtYmVyIG9mIG9wZXJhbmRzIHR5cGVzLiAgKi8KLSNkZWZpbmUgTUFYX09QRVJBTkRTICgoaW50KSBNMzJSX09QRVJBTkRfTUFYKQotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBvcGVyYW5kcyByZWZlcmVuY2VkIGJ5IGFueSBpbnNuLiAgKi8KLSNkZWZpbmUgTUFYX09QRVJBTkRfSU5TVEFOQ0VTIDExCi0KLS8qIEluc24gYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX2luc24gYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faW5zbl9hdHRyIHsKLSAgQ0dFTl9JTlNOX0FMSUFTLCBDR0VOX0lOU05fVklSVFVBTCwgQ0dFTl9JTlNOX1VOQ09ORF9DVEksIENHRU5fSU5TTl9DT05EX0NUSQotICwgQ0dFTl9JTlNOX1NLSVBfQ1RJLCBDR0VOX0lOU05fREVMQVlfU0xPVCwgQ0dFTl9JTlNOX1JFTEFYQUJMRSwgQ0dFTl9JTlNOX1JFTEFYCi0gLCBDR0VOX0lOU05fTk9fRElTLCBDR0VOX0lOU05fUEJCLCBDR0VOX0lOU05fRklMTF9TTE9ULCBDR0VOX0lOU05fU1BFQ0lBTAotICwgQ0dFTl9JTlNOX0VORF9CT09MUywgQ0dFTl9JTlNOX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX0lOU05fTUFDSCwgQ0dFTl9JTlNOX1BJUEUKLSAsIENHRU5fSU5TTl9FTkRfTkJPT0xTCi19IENHRU5fSU5TTl9BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9pbnNuX2F0dHIuICAqLwotI2RlZmluZSBDR0VOX0lOU05fTkJPT0xfQVRUUlMgKENHRU5fSU5TTl9FTkRfTkJPT0xTIC0gQ0dFTl9JTlNOX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIGNnZW4uaCB1c2VzIHRoaW5ncyB3ZSBqdXN0IGRlZmluZWQuICAqLwotI2luY2x1ZGUgIm9wY29kZS9jZ2VuLmgiCi0KLS8qIEF0dHJpYnV0ZXMuICAqLwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5faGFyZHdhcmVfYXR0cl90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5faWZpZWxkX2F0dHJfdGFibGVbXTsKLWV4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX29wZXJhbmRfYXR0cl90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5faW5zbl9hdHRyX3RhYmxlW107Ci0KLS8qIEhhcmR3YXJlIGRlY2xzLiAgKi8KLQotZXh0ZXJuIENHRU5fS0VZV09SRCBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXM7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lczsKLQotCi0KLQotI2VuZGlmIC8qIE0zMlJfQ1BVX0ggKi8KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1kaXMuYyBiL29wY29kZXMvbTMyci1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhjNTkxYS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTcgKzAsMCBAQAotLyogRGlzYXNzZW1ibGVyIGludGVyZmFjZSBmb3IgdGFyZ2V0cyB1c2luZyBDR0VOLiAtKi0gQyAtKi0KLSAgIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IKLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLS0gdGhlIHJlc3VsdGFudCBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkLCBjZ2VuLWRpcy5pbiBpc24ndAotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogPz8/IEV2ZW50dWFsbHkgbW9yZSBhbmQgbW9yZSBvZiB0aGlzIHN0dWZmIGNhbiBnbyB0byBjcHUtaW5kZXBlbmRlbnQgZmlsZXMuCi0gICBLZWVwIHRoYXQgaW4gbWluZC4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm0zMnItZGVzYy5oIgotI2luY2x1ZGUgIm0zMnItb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIERlZmF1bHQgdGV4dCB0byBwcmludCBpZiBhbiBpbnN0cnVjdGlvbiBpc24ndCByZWNvZ25pemVkLiAgKi8KLSNkZWZpbmUgVU5LTk9XTl9JTlNOX01TRyBfKCIqdW5rbm93bioiKQotCi1zdGF0aWMgdm9pZCBwcmludF9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBsb25nLCB1bnNpZ25lZCBpbnQsIGJmZF92bWEsIGludCkpOwotc3RhdGljIHZvaWQgcHJpbnRfYWRkcmVzcwotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIGJmZF92bWEsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9rZXl3b3JkCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgQ0dFTl9LRVlXT1JEICosIGxvbmcsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgcHJpbnRfaW5zbl9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBjb25zdCBDR0VOX0lOU04gKiwgQ0dFTl9GSUVMRFMgKiwKLQkgICAgICBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBpbnQgcHJpbnRfaW5zbiBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBiZmRfdm1hLAotCQkJICAgICAgIGRpc2Fzc2VtYmxlX2luZm8gKiwgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgZGVmYXVsdF9wcmludF9pbnNuCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotDAotLyogLS0gZGlzYXNzZW1ibGVyIHJvdXRpbmVzIGluc2VydGVkIGhlcmUgKi8KLQotLyogLS0gZGlzLmMgKi8KLQotLyogSW1tZWRpYXRlIHZhbHVlcyBhcmUgcHJlZml4ZWQgd2l0aCAnIycuICAqLwotCi0jZGVmaW5lIENHRU5fUFJJTlRfTk9STUFMKGNkLCBpbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpIFwKLWRvIHsgXAotICBpZiAoQ0dFTl9CT09MX0FUVFIgKChhdHRycyksIENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCkpIFwKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMiKTsgXAotfSB3aGlsZSAoMCkKLQotLyogSGFuZGxlICcjJyBwcmVmaXhlcyBhcyBvcGVyYW5kcy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9oYXNoIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjIik7Ci19Ci0KLSN1bmRlZiBDR0VOX1BSSU5UX0lOU04KLSNkZWZpbmUgQ0dFTl9QUklOVF9JTlNOIG15X3ByaW50X2luc24KLQotc3RhdGljIGludAotbXlfcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBjaGFyIGJ1ZmZlcltDR0VOX01BWF9JTlNOX1NJWkVdOwotICBjaGFyICpidWYgPSBidWZmZXI7Ci0gIGludCBzdGF0dXM7Ci0gIGludCBidWZsZW4gPSAocGMgJiAzKSA9PSAwID8gNCA6IDI7Ci0KLSAgLyogUmVhZCB0aGUgYmFzZSBwYXJ0IG9mIHRoZSBpbnNuLiAgKi8KLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwYywgYnVmLCBidWZsZW4sIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiAzMiBiaXQgaW5zbj8gICovCi0gIGlmICgocGMgJiAzKSA9PSAwICYmIChidWZbMF0gJiAweDgwKSAhPSAwKQotICAgIHJldHVybiBwcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgYnVmbGVuKTsKLQotICAvKiBQcmludCB0aGUgZmlyc3QgaW5zbi4gICovCi0gIGlmICgocGMgJiAzKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChwcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgMikgPT0gMCkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgVU5LTk9XTl9JTlNOX01TRyk7Ci0gICAgICBidWYgKz0gMjsKLSAgICB9Ci0KLSAgaWYgKGJ1ZlswXSAmIDB4ODApCi0gICAgewotICAgICAgLyogUGFyYWxsZWwuICAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgfHwgIik7Ci0gICAgICBidWZbMF0gJj0gMHg3ZjsKLSAgICB9Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAtPiAiKTsKLQotICAvKiBUaGUgIiYgMyIgaXMgdG8gcGFzcyBhIGNvbnNpc3RlbnQgYWRkcmVzcy4KLSAgICAgUGFyYWxsZWwgaW5zbnMgYXJndWFibHkgYm90aCBiZWdpbiBvbiB0aGUgd29yZCBib3VuZGFyeS4KLSAgICAgQWxzbywgYnJhbmNoIGluc25zIGFyZSBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIHRoZSB3b3JkIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKHByaW50X2luc24gKGNkLCBwYyAmIH4gKGJmZF92bWEpIDMsIGluZm8sIGJ1ZiwgMikgPT0gMCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgVU5LTk9XTl9JTlNOX01TRyk7Ci0KLSAgcmV0dXJuIChwYyAmIDMpID8gMiA6IDQ7Ci19Ci0KLS8qIC0tICovCi0KLS8qIE1haW4gZW50cnkgcG9pbnQgZm9yIHByaW50aW5nIG9wZXJhbmRzLgotICAgWElORk8gaXMgYSBgdm9pZCAqJyBhbmQgbm90IGEgYGRpc2Fzc2VtYmxlX2luZm8gKicgdG8gbm90IHB1dCBhIHJlcXVpcmVtZW50Ci0gICBvZiBkaXMtYXNtLmggb24gY2dlbi5oLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHByaW50X2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcHJpbnRfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuCi0qLwotCi12b2lkCi1tMzJyX2NnZW5fcHJpbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIHhpbmZvLCBmaWVsZHMsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgUFRSIHhpbmZvOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICB2b2lkIGNvbnN0ICphdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgeGluZm87Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzLCBmaWVsZHMtPmZfcjEsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDE2LCAwfCgxPDxDR0VOX09QRVJBTkRfUkVMT0MpfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDI0LCAwfCgxPDxDR0VOX09QRVJBTkRfUkVMQVgpfCgxPDxDR0VOX09QRVJBTkRfUkVMT0MpfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwOCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1JFTEFYKXwoMTw8Q0dFTl9PUEVSQU5EX1JFTE9DKXwoMTw8Q0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX3IxLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgcHJpbnRfaGFzaCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9uaWwsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2hpMTYsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdOX09QVCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcywgZmllbGRzLT5mX3IyLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfc2ltbTE2LCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfc2ltbTgsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9zaW1tMTYsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX3IyLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfcjEsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9yMiwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3VpbW0xNiwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl91aW1tMjQsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCl8KDE8PENHRU5fT1BFUkFORF9SRUxPQyl8KDE8PENHRU5fT1BFUkFORF9BQlNfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3VpbW00LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91aW1tNSwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdWltbTE2LCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcHJpbnRpbmcgaW5zbi5cbiIpLAotCSAgICAgICBvcGluZGV4KTsKLSAgICBhYm9ydCAoKTsKLSAgfQotfQotCi1jZ2VuX3ByaW50X2ZuICogY29uc3QgbTMycl9jZ2VuX3ByaW50X2hhbmRsZXJzW10gPSAKLXsKLSAgcHJpbnRfaW5zbl9ub3JtYWwsCi19OwotCi0KLXZvaWQKLW0zMnJfY2dlbl9pbml0X2RpcyAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIG0zMnJfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpOwotICBtMzJyX2NnZW5faW5pdF9pYmxkX3RhYmxlIChjZCk7Ci0gIGNkLT5wcmludF9oYW5kbGVycyA9ICYgbTMycl9jZ2VuX3ByaW50X2hhbmRsZXJzWzBdOwotICBjZC0+cHJpbnRfb3BlcmFuZCA9IG0zMnJfY2dlbl9wcmludF9vcGVyYW5kOwotfQotCi0MCi0vKiBEZWZhdWx0IHByaW50IGhhbmRsZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfbm9ybWFsIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLQotI2lmZGVmIENHRU5fUFJJTlRfTk9STUFMCi0gIENHRU5fUFJJTlRfTk9STUFMIChjZCwgaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKTsKLSNlbmRpZgotCi0gIC8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBhdHRyaWJ1dGVzLiAgKi8KLSAgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NFTV9PTkxZKSkKLSAgICA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0lHTkVEKSkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLCB2YWx1ZSk7Ci19Ci0KLS8qIERlZmF1bHQgYWRkcmVzcyBoYW5kbGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FkZHJlc3MgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotCi0jaWZkZWYgQ0dFTl9QUklOVF9BRERSRVNTCi0gIENHRU5fUFJJTlRfQUREUkVTUyAoY2QsIGluZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgYXR0cmlidXRlcy4gICovCi0gIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TRU1fT05MWSkpCi0gICAgOyAvKiBub3RoaW5nIHRvIGRvICovCi0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpKQotICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9BQlNfQUREUikpCi0gICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NJR05FRCkpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCAobG9uZykgdmFsdWUpOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCVseCIsIChsb25nKSB2YWx1ZSk7Ci19Ci0KLS8qIEtleXdvcmQgcHJpbnQgaGFuZGxlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9rZXl3b3JkIChjZCwgZGlzX2luZm8sIGtleXdvcmRfdGFibGUsIHZhbHVlLCBhdHRycykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBDR0VOX0tFWVdPUkQgKmtleXdvcmRfdGFibGU7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotCi0gIGtlID0gY2dlbl9rZXl3b3JkX2xvb2t1cF92YWx1ZSAoa2V5d29yZF90YWJsZSwgdmFsdWUpOwotICBpZiAoa2UgIT0gTlVMTCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwga2UtPm5hbWUpOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI/Pz8iKTsKLX0KLQwKLS8qIERlZmF1bHQgaW5zbiBwcmludGVyLgotCi0gICBESVNfSU5GTyBpcyBkZWZpbmVkIGFzIGBQVFInIHNvIHRoZSBkaXNhc3NlbWJsZXIgbmVlZG4ndCBrbm93IGFueXRoaW5nCi0gICBhYm91dCBkaXNhc3NlbWJsZV9pbmZvLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2luc25fbm9ybWFsIChjZCwgZGlzX2luZm8sIGluc24sIGZpZWxkcywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzeW47Ci0KLSAgQ0dFTl9JTklUX1BSSU5UIChjZCk7Ci0KLSAgZm9yIChzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7ICpzeW47ICsrc3luKQotICAgIHsKLSAgICAgIGlmIChDR0VOX1NZTlRBWF9NTkVNT05JQ19QICgqc3luKSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqc3luKSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgQ0dFTl9TWU5UQVhfQ0hBUiAoKnN5bikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIGFuIG9wZXJhbmQuICAqLwotICAgICAgbTMycl9jZ2VuX3ByaW50X29wZXJhbmQgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksIGluZm8sCi0JCQkJIGZpZWxkcywgQ0dFTl9JTlNOX0FUVFJTIChpbnNuKSwgcGMsIGxlbmd0aCk7Ci0gICAgfQotfQotDAotLyogVXRpbGl0eSB0byBwcmludCBhbiBpbnNuLgotICAgQlVGIGlzIHRoZSBiYXNlIHBhcnQgb2YgdGhlIGluc24sIHRhcmdldCBieXRlIG9yZGVyLCBCVUZMRU4gYnl0ZXMgbG9uZy4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIHNpemUgb2YgdGhlIGluc24gaW4gYnl0ZXMgb3IgemVybyBmb3IgYW4gdW5rbm93biBpbnNuCi0gICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnMgZmV0Y2hpbmcgZGF0YSAobWVtb3J5X2Vycm9yX2Z1bmMgd2lsbCBoYXZlCi0gICBiZWVuIGNhbGxlZCkuICAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgYnVmbGVuKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBjaGFyICpidWY7Ci0gICAgIGludCBidWZsZW47Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbl92YWx1ZTsKLSAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmluc25fbGlzdDsKLSAgQ0dFTl9FWFRSQUNUX0lORk8gZXhfaW5mbzsKLQotICBleF9pbmZvLmRpc19pbmZvID0gaW5mbzsKLSAgZXhfaW5mby52YWxpZCA9ICgxIDw8IChjZC0+YmFzZV9pbnNuX2JpdHNpemUgLyA4KSkgLSAxOwotICBleF9pbmZvLmluc25fYnl0ZXMgPSBidWY7Ci0KLSAgc3dpdGNoIChidWZsZW4pCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGluc25fdmFsdWUgPSBidWZbMF07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpbnNuX3ZhbHVlID0gaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHID8gYmZkX2dldGIxNiAoYnVmKSA6IGJmZF9nZXRsMTYgKGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBpbnNuX3ZhbHVlID0gaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHID8gYmZkX2dldGIzMiAoYnVmKSA6IGJmZF9nZXRsMzIgKGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBoYXNoIGxpc3RzLgotICAgICBQaWNrIHRoZSBmaXJzdCBvbmUgYW5kIGtlZXAgdHJ5aW5nIHVudGlsIHdlIGZpbmQgdGhlIHJpZ2h0IG9uZS4gICovCi0KLSAgaW5zbl9saXN0ID0gQ0dFTl9ESVNfTE9PS1VQX0lOU04gKGNkLCBidWYsIGluc25fdmFsdWUpOwotICB3aGlsZSAoaW5zbl9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gaW5zbl9saXN0LT5pbnNuOwotICAgICAgQ0dFTl9GSUVMRFMgZmllbGRzOwotICAgICAgaW50IGxlbmd0aDsKLQotI2lmIDAgLyogbm90IG5lZWRlZCBhcyBpbnNuIHNob3VsZG4ndCBiZSBpbiBoYXNoIGxpc3RzIGlmIG5vdCBzdXBwb3J0ZWQgKi8KLSAgICAgIC8qIFN1cHBvcnRlZCBieSB0aGlzIGNwdT8gICovCi0gICAgICBpZiAoISBtMzJyX2NnZW5faW5zbl9zdXBwb3J0ZWQgKGNkLCBpbnNuKSkKLQljb250aW51ZTsKLSNlbmRpZgotCi0gICAgICAvKiBCYXNpYyBiaXQgbWFzayBtdXN0IGJlIGNvcnJlY3QuICAqLwotICAgICAgLyogPz8/IE1heSB3aXNoIHRvIGFsbG93IHRhcmdldCB0byBkZWZlciB0aGlzIGNoZWNrIHVudGlsIHRoZSBleHRyYWN0Ci0JIGhhbmRsZXIuICAqLwotICAgICAgaWYgKChpbnNuX3ZhbHVlICYgQ0dFTl9JTlNOX0JBU0VfTUFTSyAoaW5zbikpCi0JICA9PSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbikpCi0JewotCSAgLyogUHJpbnRpbmcgaXMgaGFuZGxlZCBpbiB0d28gcGFzc2VzLiAgVGhlIGZpcnN0IHBhc3MgcGFyc2VzIHRoZQotCSAgICAgbWFjaGluZSBpbnNuIGFuZCBleHRyYWN0cyB0aGUgZmllbGRzLiAgVGhlIHNlY29uZCBwYXNzIHByaW50cwotCSAgICAgdGhlbS4gICovCi0KLQkgIGxlbmd0aCA9IENHRU5fRVhUUkFDVF9GTiAoY2QsIGluc24pCi0JICAgIChjZCwgaW5zbiwgJmV4X2luZm8sIGluc25fdmFsdWUsICZmaWVsZHMsIHBjKTsKLQkgIC8qIGxlbmd0aCA8IDAgLT4gZXJyb3IgKi8KLQkgIGlmIChsZW5ndGggPCAwKQotCSAgICByZXR1cm4gbGVuZ3RoOwotCSAgaWYgKGxlbmd0aCA+IDApCi0JICAgIHsKLQkgICAgICBDR0VOX1BSSU5UX0ZOIChjZCwgaW5zbikgKGNkLCBpbmZvLCBpbnNuLCAmZmllbGRzLCBwYywgbGVuZ3RoKTsKLQkgICAgICAvKiBsZW5ndGggaXMgaW4gYml0cywgcmVzdWx0IGlzIGluIGJ5dGVzICovCi0JICAgICAgcmV0dXJuIGxlbmd0aCAvIDg7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluc25fbGlzdCA9IENHRU5fRElTX05FWFRfSU5TTiAoaW5zbl9saXN0KTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIERlZmF1bHQgdmFsdWUgZm9yIENHRU5fUFJJTlRfSU5TTi4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIHNpemUgb2YgdGhlIGluc24gaW4gYnl0ZXMgb3IgemVybyBmb3IgYW4gdW5rbm93biBpbnNuCi0gICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cmVkIGZldGNoaW5nIGJ5dGVzLiAgKi8KLQotI2lmbmRlZiBDR0VOX1BSSU5UX0lOU04KLSNkZWZpbmUgQ0dFTl9QUklOVF9JTlNOIGRlZmF1bHRfcHJpbnRfaW5zbgotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLWRlZmF1bHRfcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBjaGFyIGJ1ZltDR0VOX01BWF9JTlNOX1NJWkVdOwotICBpbnQgc3RhdHVzOwotCi0gIC8qIFJlYWQgdGhlIGJhc2UgcGFydCBvZiB0aGUgaW5zbi4gICovCi0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocGMsIGJ1ZiwgY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiBwcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCk7Ci19Ci0KLS8qIE1haW4gZW50cnkgcG9pbnQuCi0gICBQcmludCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBQQyBvbiBJTkZPLT5TVFJFQU0uCi0gICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uIChpbiBieXRlcykuICAqLwotCi1pbnQKLXByaW50X2luc25fbTMyciAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHN0YXRpYyBDR0VOX0NQVV9ERVNDIGNkID0gMDsKLSAgc3RhdGljIHByZXZfaXNhLHByZXZfbWFjaCxwcmV2X2VuZGlhbjsKLSAgaW50IGxlbmd0aDsKLSAgaW50IGlzYSxtYWNoOwotICBpbnQgZW5kaWFuID0gKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRwotCQk/IENHRU5fRU5ESUFOX0JJRwotCQk6IENHRU5fRU5ESUFOX0xJVFRMRSk7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotCi0gIC8qID8/PyBnZGIgd2lsbCBzZXQgbWFjaCBidXQgbGVhdmUgdGhlIGFyY2hpdGVjdHVyZSBhcyAidW5rbm93biIgKi8KLSNpZm5kZWYgQ0dFTl9CRkRfQVJDSAotI2RlZmluZSBDR0VOX0JGRF9BUkNIIGJmZF9hcmNoX20zMnIKLSNlbmRpZgotICBhcmNoID0gaW5mby0+YXJjaDsKLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICBhcmNoID0gQ0dFTl9CRkRfQVJDSDsKLSAgICAgIAotICAvKiBUaGVyZSdzIG5vIHN0YW5kYXJkIHdheSB0byBjb21wdXRlIHRoZSBpc2EgbnVtYmVyIChlLmcuIGZvciBhcm0gdGh1bWIpCi0gICAgIHNvIHdlIGxlYXZlIGl0IHRvIHRoZSB0YXJnZXQuICAqLwotI2lmZGVmIENHRU5fQ09NUFVURV9JU0EKLSAgaXNhID0gQ0dFTl9DT01QVVRFX0lTQSAoaW5mbyk7Ci0jZWxzZQotICBpc2EgPSAwOwotI2VuZGlmCi0KLSAgbWFjaCA9IGluZm8tPm1hY2g7Ci0KLSAgLyogSWYgd2UndmUgc3dpdGNoZWQgY3B1J3MsIGNsb3NlIHRoZSBjdXJyZW50IHRhYmxlIGFuZCBvcGVuIGEgbmV3IG9uZS4gICovCi0gIGlmIChjZAotICAgICAgJiYgKGlzYSAhPSBwcmV2X2lzYQotCSAgfHwgbWFjaCAhPSBwcmV2X21hY2gKLQkgIHx8IGVuZGlhbiAhPSBwcmV2X2VuZGlhbikpCi0gICAgewotICAgICAgbTMycl9jZ2VuX2NwdV9jbG9zZSAoY2QpOwotICAgICAgY2QgPSAwOwotICAgIH0KLQotICAvKiBJZiB3ZSBoYXZlbid0IGluaXRpYWxpemVkIHlldCwgaW5pdGlhbGl6ZSB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSAgaWYgKCEgY2QpCi0gICAgewotICAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmNoX3R5cGUgPSBiZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2gpOwotICAgICAgY29uc3QgY2hhciAqbWFjaF9uYW1lOwotCi0gICAgICBpZiAoIWFyY2hfdHlwZSkKLQlhYm9ydCAoKTsKLSAgICAgIG1hY2hfbmFtZSA9IGFyY2hfdHlwZS0+cHJpbnRhYmxlX25hbWU7Ci0KLSAgICAgIHByZXZfaXNhID0gaXNhOwotICAgICAgcHJldl9tYWNoID0gbWFjaDsKLSAgICAgIHByZXZfZW5kaWFuID0gZW5kaWFuOwotICAgICAgY2QgPSBtMzJyX2NnZW5fY3B1X29wZW4gKENHRU5fQ1BVX09QRU5fSVNBUywgcHJldl9pc2EsCi0JCQkJIENHRU5fQ1BVX09QRU5fQkZETUFDSCwgbWFjaF9uYW1lLAotCQkJCSBDR0VOX0NQVV9PUEVOX0VORElBTiwgcHJldl9lbmRpYW4sCi0JCQkJIENHRU5fQ1BVX09QRU5fRU5EKTsKLSAgICAgIGlmICghY2QpCi0JYWJvcnQgKCk7Ci0gICAgICBtMzJyX2NnZW5faW5pdF9kaXMgKGNkKTsKLSAgICB9Ci0KLSAgLyogV2UgdHJ5IHRvIGhhdmUgYXMgbXVjaCBjb21tb24gY29kZSBhcyBwb3NzaWJsZS4KLSAgICAgQnV0IGF0IHRoaXMgcG9pbnQgc29tZSB0YXJnZXRzIG5lZWQgdG8gdGFrZSBvdmVyLiAgKi8KLSAgLyogPz8/IFNvbWUgdGFyZ2V0cyBtYXkgbmVlZCBhIGhvb2sgZWxzZXdoZXJlLiAgVHJ5IHRvIGF2b2lkIHRoaXMsCi0gICAgIGJ1dCBpZiBub3QgcG9zc2libGUgdHJ5IHRvIG1vdmUgdGhpcyBob29rIGVsc2V3aGVyZSByYXRoZXIgdGhhbgotICAgICBoYXZlIHR3byBob29rcy4gICovCi0gIGxlbmd0aCA9IENHRU5fUFJJTlRfSU5TTiAoY2QsIHBjLCBpbmZvKTsKLSAgaWYgKGxlbmd0aCA+IDApCi0gICAgcmV0dXJuIGxlbmd0aDsKLSAgaWYgKGxlbmd0aCA8IDApCi0gICAgcmV0dXJuIC0xOwotCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBVTktOT1dOX0lOU05fTVNHKTsKLSAgcmV0dXJuIGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSAvIDg7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItaWJsZC5jIGIvb3Bjb2Rlcy9tMzJyLWlibGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmExNWQ3ZS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItaWJsZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyMCArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBidWlsZGluZy9leHRyYWN0aW9uIHN1cHBvcnQgZm9yIG0zMnIuIC0qLSBDIC0qLQotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4taWJsZC5pbiBpc24ndAotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogPz8/IEV2ZW50dWFsbHkgbW9yZSBhbmQgbW9yZSBvZiB0aGlzIHN0dWZmIGNhbiBnbyB0byBjcHUtaW5kZXBlbmRlbnQgZmlsZXMuCi0gICBLZWVwIHRoYXQgaW4gbWluZC4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAibTMyci1kZXNjLmgiCi0jaW5jbHVkZSAibTMyci1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotI3VuZGVmIG1pbgotI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotI3VuZGVmIG1heAotI2RlZmluZSBtYXgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQotCi0vKiBVc2VkIGJ5IHRoZSBpZmllbGQgcnR4IGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgRkxEKGYpIChmaWVsZHMtPmYpCi0KLXN0YXRpYyBjb25zdCBjaGFyICogaW5zZXJ0X25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBsb25nLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIENHRU5fSU5TTl9CWVRFU19QVFIpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogaW5zZXJ0X2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqLAotCSAgICAgIENHRU5fRklFTERTICosIENHRU5fSU5TTl9CWVRFU19QVFIsIGJmZF92bWEpKTsKLQotc3RhdGljIGludCBleHRyYWN0X25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBDR0VOX0VYVFJBQ1RfSU5GTyAqLCBDR0VOX0lOU05fSU5ULAotCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKLQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgbG9uZyAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfaW5zbl9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICosIENHRU5fRVhUUkFDVF9JTkZPICosCi0JICAgICAgQ0dFTl9JTlNOX0lOVCwgQ0dFTl9GSUVMRFMgKiwgYmZkX3ZtYSkpOwotDAotLyogT3BlcmFuZCBpbnNlcnRpb24uICAqLwotCi0jaWYgISBDR0VOX0lOVF9JTlNOX1AKLQotLyogU3Vicm91dGluZSBvZiBpbnNlcnRfbm9ybWFsLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIHZvaWQKLWluc2VydF8xIChjZCwgdmFsdWUsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICBpbnQgc3RhcnQsbGVuZ3RoLHdvcmRfbGVuZ3RoOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZwOwotewotICB1bnNpZ25lZCBsb25nIHgsbWFzazsKLSAgaW50IHNoaWZ0OwotICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9JTlNOX0VORElBTiAoY2QpID09IENHRU5fRU5ESUFOX0JJRzsKLQotICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICB4ID0gKmJ1ZnA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjE2IChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgLyogPz8/IFRoaXMgbWF5IG5lZWQgcmV3b3JraW5nIGFzIHRoZXNlIGNhc2VzIGRvbid0IG5lY2Vzc2FyaWx5Ci0JIHdhbnQgdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBsYXN0IHR3byBieXRlcyBoYW5kbGVkIGxpa2UgdGhpcy4gICovCi0gICAgICBpZiAoYmlnX3ApCi0JeCA9IChidWZwWzBdIDw8IDE2KSB8IGJmZF9nZXRiMTYgKGJ1ZnAgKyAxKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCkgfCAoYnVmcFsyXSA8PCAxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjMyIChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwzMiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLwotICBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLSAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0gICAgc2hpZnQgPSAoc3RhcnQgKyAxKSAtIGxlbmd0aDsKLSAgZWxzZQotICAgIHNoaWZ0ID0gKHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKSk7Ci0gIHggPSAoeCAmIH4obWFzayA8PCBzaGlmdCkpIHwgKCh2YWx1ZSAmIG1hc2spIDw8IHNoaWZ0KTsKLQotICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICAqYnVmcCA9IHg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGJpZ19wKQotCWJmZF9wdXRiMTYgKHgsIGJ1ZnApOwotICAgICAgZWxzZQotCWJmZF9wdXRsMTYgKHgsIGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIC8qID8/PyBUaGlzIG1heSBuZWVkIHJld29ya2luZyBhcyB0aGVzZSBjYXNlcyBkb24ndCBuZWNlc3NhcmlseQotCSB3YW50IHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgbGFzdCB0d28gYnl0ZXMgaGFuZGxlZCBsaWtlIHRoaXMuICAqLwotICAgICAgaWYgKGJpZ19wKQotCXsKLQkgIGJ1ZnBbMF0gPSB4ID4+IDE2OwotCSAgYmZkX3B1dGIxNiAoeCwgYnVmcCArIDEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0bDE2ICh4LCBidWZwKTsKLQkgIGJ1ZnBbMl0gPSB4ID4+IDE2OwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoYmlnX3ApCi0JYmZkX3B1dGIzMiAoeCwgYnVmcCk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwzMiAoeCwgYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLS8qIERlZmF1bHQgaW5zZXJ0aW9uIHJvdXRpbmUuCi0KLSAgIEFUVFJTIGlzIGEgbWFzayBvZiB0aGUgYm9vbGVhbiBhdHRyaWJ1dGVzLgotICAgV09SRF9PRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBiaXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KLSAgIFdPUkRfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIHdvcmQgaW4gYml0cyBpbiB3aGljaCB0aGUgdmFsdWUgcmVzaWRlcy4KLSAgIFNUQVJUIGlzIHRoZSBzdGFydGluZyBiaXQgbnVtYmVyIGluIHRoZSB3b3JkLCBhcmNoaXRlY3R1cmUgb3JpZ2luLgotICAgTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgVkFMVUUgaW4gYml0cy4KLSAgIFRPVEFMX0xFTkdUSCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMuCi0KLSAgIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIHN1Y2Nlc3MuICAqLwotCi0vKiA/Pz8gVGhpcyBkdXBsaWNhdGVzIGZ1bmN0aW9uYWxpdHkgd2l0aCBiZmQncyBob3d0byB0YWJsZSBhbmQKLSAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICAqLwotLyogPz8/IFRoaXMgZG9lc24ndCBoYW5kbGUgYmZkX3ZtYSdzLiAgQ3JlYXRlIGFub3RoZXIgZnVuY3Rpb24gd2hlbgotICAgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCBhdHRycywgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLAotCSAgICAgICB0b3RhbF9sZW5ndGgsIGJ1ZmZlcikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICB1bnNpZ25lZCBpbnQgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCB0b3RhbF9sZW5ndGg7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotewotICBzdGF0aWMgY2hhciBlcnJidWZbMTAwXTsKLSAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotICAvKiBJZiBMRU5HVEggaXMgemVybywgdGhpcyBvcGVyYW5kIGRvZXNuJ3QgY29udHJpYnV0ZSB0byB0aGUgdmFsdWUuICAqLwotICBpZiAobGVuZ3RoID09IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKENHRU5fSU5UX0lOU05fUAotICAgICAgJiYgd29yZF9vZmZzZXQgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAod29yZF9sZW5ndGggPiAzMikKLSAgICBhYm9ydCAoKTsKLQotICAvKiBGb3IgYXJjaGl0ZWN0dXJlcyB3aXRoIGluc25zIHNtYWxsZXIgdGhhbiB0aGUgYmFzZS1pbnNuLWJpdHNpemUsCi0gICAgIHdvcmRfbGVuZ3RoIG1heSBiZSB0b28gYmlnLiAgKi8KLSAgaWYgKGNkLT5taW5faW5zbl9iaXRzaXplIDwgY2QtPmJhc2VfaW5zbl9iaXRzaXplKQotICAgIHsKLSAgICAgIGlmICh3b3JkX29mZnNldCA9PSAwCi0JICAmJiB3b3JkX2xlbmd0aCA+IHRvdGFsX2xlbmd0aCkKLQl3b3JkX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKLSAgICB9Ci0KLSAgLyogRW5zdXJlIFZBTFVFIHdpbGwgZml0LiAgKi8KLSAgaWYgKCEgQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX0lGTERfU0lHTkVEKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIG1heHZhbCA9IG1hc2s7Ci0gICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIHZhbHVlID4gbWF4dmFsKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBzcHJpbnRmIChlcnJidWYsCi0JCSAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbHUgbm90IGJldHdlZW4gMCBhbmQgJWx1KSIpLAotCQkgICB2YWx1ZSwgbWF4dmFsKTsKLQkgIHJldHVybiBlcnJidWY7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgbWludmFsID0gLSAoMUwgPDwgKGxlbmd0aCAtIDEpKTsKLSAgICAgIGxvbmcgbWF4dmFsID0gKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxOwotICAgICAgaWYgKHZhbHVlIDwgbWludmFsIHx8IHZhbHVlID4gbWF4dmFsKQotCXsKLQkgIHNwcmludGYKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgKGVycmJ1ZiwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsZCBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKSwKLQkgICAgIHZhbHVlLCBtaW52YWwsIG1heHZhbCk7Ci0JICByZXR1cm4gZXJyYnVmOwotCX0KLSAgICB9Ci0KLSNpZiBDR0VOX0lOVF9JTlNOX1AKLQotICB7Ci0gICAgaW50IHNoaWZ0OwotCi0gICAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0gICAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOwotICAgIGVsc2UKLSAgICAgIHNoaWZ0ID0gd29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpOwotICAgICpidWZmZXIgPSAoKmJ1ZmZlciAmIH4obWFzayA8PCBzaGlmdCkpIHwgKCh2YWx1ZSAmIG1hc2spIDw8IHNoaWZ0KTsKLSAgfQotCi0jZWxzZSAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyICpidWZwID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyICsgd29yZF9vZmZzZXQgLyA4OwotCi0gICAgaW5zZXJ0XzEgKGNkLCB2YWx1ZSwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnApOwotICB9Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBEZWZhdWx0IGluc24gYnVpbGRlciAoaW5zZXJ0IGhhbmRsZXIpLgotICAgVGhlIGluc3RydWN0aW9uIGlzIHJlY29yZGVkIGluIENHRU5fSU5UX0lOU05fUCBieXRlIG9yZGVyCi0gICAobWVhbmluZyB0aGF0IGlmIENHRU5fSU5UX0lOU05fUCBCVUZGRVIgaXMgYW4gaW50ICogYW5kIHRodXMgdGhlIHZhbHVlIGlzCi0gICByZWNvcmRlZCBpbiBob3N0IGJ5dGUgb3JkZXIsIG90aGVyd2lzZSBCVUZGRVIgaXMgYW4gYXJyYXkgb2YgYnl0ZXMgYW5kIHRoZQotICAgdmFsdWUgaXMgcmVjb3JkZWQgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIpLgotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgc3VjY2Vzcy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWluc2VydF9pbnNuX25vcm1hbCAoY2QsIGluc24sIGZpZWxkcywgYnVmZmVyLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotICAgICBiZmRfdm1hIHBjOwotewotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzeW47Ci0KLSAgQ0dFTl9JTklUX0lOU0VSVCAoY2QpOwotICB2YWx1ZSA9IENHRU5fSU5TTl9CQVNFX1ZBTFVFIChpbnNuKTsKLQotICAvKiBJZiB3ZSdyZSByZWNvcmRpbmcgaW5zbnMgYXMgbnVtYmVycyAocmF0aGVyIHRoYW4gYSBzdHJpbmcgb2YgYnl0ZXMpLAotICAgICB0YXJnZXQgYnl0ZSBvcmRlciBoYW5kbGluZyBpcyBkZWZlcnJlZCB1bnRpbCBsYXRlci4gICovCi0KLSNpZiBDR0VOX0lOVF9JTlNOX1AKLQotICAqYnVmZmVyID0gdmFsdWU7Ci0KLSNlbHNlCi0KLSAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZmZlciwgbWluIChjZC0+YmFzZV9pbnNuX2JpdHNpemUsCi0JCQkJCUNHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykpLAotCQkgICAgICAgdmFsdWUpOwotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICAvKiA/Pz8gSXQgd291bGQgYmUgYmV0dGVyIHRvIHNjYW4gdGhlIGZvcm1hdCdzIGZpZWxkcy4KLSAgICAgU3RpbGwgbmVlZCB0byBiZSBhYmxlIHRvIGluc2VydCBhIHZhbHVlIGJhc2VkIG9uIHRoZSBvcGVyYW5kIHRob3VnaDsKLSAgICAgZS5nLiBzdG9yaW5nIGEgYnJhbmNoIGRpc3BsYWNlbWVudCB0aGF0IGdvdCByZXNvbHZlZCBsYXRlci4KLSAgICAgTmVlZHMgbW9yZSB0aG91Z2h0IGZpcnN0LiAgKi8KLQotICBmb3IgKHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsgKiBzeW4gIT0gJ1wwJzsgKysgc3luKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLQotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKiBzeW4pKQotCWNvbnRpbnVlOwotCi0gICAgICBlcnJtc2cgPSAoKiBjZC0+aW5zZXJ0X29wZXJhbmQpIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAotCQkJCSAgICAgICBmaWVsZHMsIGJ1ZmZlciwgcGMpOwotICAgICAgaWYgKGVycm1zZykKLQlyZXR1cm4gZXJybXNnOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQwKLS8qIE9wZXJhbmQgZXh0cmFjdGlvbi4gICovCi0KLSNpZiAhIENHRU5fSU5UX0lOU05fUAotCi0vKiBTdWJyb3V0aW5lIG9mIGV4dHJhY3Rfbm9ybWFsLgotICAgRW5zdXJlIHN1ZmZpY2llbnQgYnl0ZXMgYXJlIGNhY2hlZCBpbiBFWF9JTkZPLgotICAgT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGluc24gb2YgdGhlIHZhbHVlLgotICAgQllURVMgaXMgdGhlIGxlbmd0aCBvZiB0aGUgbmVlZGVkIHZhbHVlLgotICAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIGludAotZmlsbF9jYWNoZSAoY2QsIGV4X2luZm8sIG9mZnNldCwgYnl0ZXMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgaW50IG9mZnNldCwgYnl0ZXM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIC8qIEl0J3MgZG91YnRmdWwgdGhhdCB0aGUgbWlkZGxlIHBhcnQgaGFzIGFscmVhZHkgYmVlbiBmZXRjaGVkIHNvCi0gICAgIHdlIGRvbid0IG9wdGltaXplIHRoYXQgY2FzZS4gIGtpc3MuICAqLwotICBpbnQgbWFzazsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGV4X2luZm8tPmRpc19pbmZvOwotCi0gIC8qIEZpcnN0IGRvIGEgcXVpY2sgY2hlY2suICAqLwotICBtYXNrID0gKDEgPDwgYnl0ZXMpIC0gMTsKLSAgaWYgKCgoZXhfaW5mby0+dmFsaWQgPj4gb2Zmc2V0KSAmIG1hc2spID09IG1hc2spCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgYnl0ZSB3ZSBuZWVkIHRvIHJlYWQuICAqLwotICBmb3IgKG1hc2sgPSAxIDw8IG9mZnNldDsgYnl0ZXMgPiAwOyAtLWJ5dGVzLCArK29mZnNldCwgbWFzayA8PD0gMSkKLSAgICBpZiAoISAobWFzayAmIGV4X2luZm8tPnZhbGlkKSkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChieXRlcykKLSAgICB7Ci0gICAgICBpbnQgc3RhdHVzOwotCi0gICAgICBwYyArPSBvZmZzZXQ7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCi0JKHBjLCBleF9pbmZvLT5pbnNuX2J5dGVzICsgb2Zmc2V0LCBieXRlcywgaW5mbyk7Ci0KLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGV4X2luZm8tPnZhbGlkIHw9ICgoMSA8PCBieXRlcykgLSAxKSA8PCBvZmZzZXQ7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGV4dHJhY3Rfbm9ybWFsLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIGxvbmcKLWV4dHJhY3RfMSAoY2QsIGV4X2luZm8sIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIGludCBzdGFydCxsZW5ndGgsd29yZF9sZW5ndGg7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnA7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgeCxtYXNrOwotICBpbnQgc2hpZnQ7Ci0gIGludCBiaWdfcCA9IENHRU5fQ1BVX0lOU05fRU5ESUFOIChjZCkgPT0gQ0dFTl9FTkRJQU5fQklHOwotCi0gIHN3aXRjaCAod29yZF9sZW5ndGgpCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgIHggPSAqYnVmcDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMTYgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6Ci0gICAgICAvKiA/Pz8gVGhpcyBtYXkgbmVlZCByZXdvcmtpbmcgYXMgdGhlc2UgY2FzZXMgZG9uJ3QgbmVjZXNzYXJpbHkKLQkgd2FudCB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIGxhc3QgdHdvIGJ5dGVzIGhhbmRsZWQgbGlrZSB0aGlzLiAgKi8KLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gKGJ1ZnBbMF0gPDwgMTYpIHwgYmZkX2dldGIxNiAoYnVmcCArIDEpOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKSB8IChidWZwWzJdIDw8IDE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMzIgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDMyIChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKLSAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOwotICBlbHNlCi0gICAgc2hpZnQgPSAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKLSAgcmV0dXJuICh4ID4+IHNoaWZ0KSAmIG1hc2s7Ci19Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0vKiBEZWZhdWx0IGV4dHJhY3Rpb24gcm91dGluZS4KLQotICAgSU5TTl9WQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBvZiB0aGUgaW5zbiBpbiBob3N0IG9yZGVyLAotICAgb3Igc29tZXRpbWVzIGxlc3MgZm9yIGNhc2VzIGxpa2UgdGhlIG0zMnIgd2hlcmUgdGhlIGJhc2UgaW5zbiBzaXplIGlzIDMyCi0gICBidXQgc29tZSBpbnNucyBhcmUgMTYgYml0cy4KLSAgIEFUVFJTIGlzIGEgbWFzayBvZiB0aGUgYm9vbGVhbiBhdHRyaWJ1dGVzLiAgV2Ugb25seSBuZWVkIGBTSUdORUQnLAotICAgYnV0IGZvciBnZW5lcmFsaXR5IHdlIHRha2UgYSBiaXRtYXNrIG9mIGFsbCBvZiB0aGVtLgotICAgV09SRF9PRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBiaXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KLSAgIFdPUkRfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIHdvcmQgaW4gYml0cyBpbiB3aGljaCB0aGUgdmFsdWUgcmVzaWRlcy4KLSAgIFNUQVJUIGlzIHRoZSBzdGFydGluZyBiaXQgbnVtYmVyIGluIHRoZSB3b3JkLCBhcmNoaXRlY3R1cmUgb3JpZ2luLgotICAgTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgVkFMVUUgaW4gYml0cy4KLSAgIFRPVEFMX0xFTkdUSCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMuCi0KLSAgIFJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4gICovCi0KLS8qID8/PyBUaGUgcmV0dXJuIGNvZGUgaXNuJ3QgcHJvcGVybHkgdXNlZC4gIHdpcC4gICovCi0KLS8qID8/PyBUaGlzIGRvZXNuJ3QgaGFuZGxlIGJmZF92bWEncy4gIENyZWF0ZSBhbm90aGVyIGZ1bmN0aW9uIHdoZW4KLSAgIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgYXR0cnMsIHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLAotCQl3b3JkX2xlbmd0aCwgdG90YWxfbGVuZ3RoLCBwYywgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIHVuc2lnbmVkIGludCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIHRvdGFsX2xlbmd0aDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgbG9uZyAqdmFsdWVwOwotewotICBDR0VOX0lOU05fSU5UIHZhbHVlOwotCi0gIC8qIElmIExFTkdUSCBpcyB6ZXJvLCB0aGlzIG9wZXJhbmQgZG9lc24ndCBjb250cmlidXRlIHRvIHRoZSB2YWx1ZQotICAgICBzbyBnaXZlIGl0IGEgc3RhbmRhcmQgdmFsdWUgb2YgemVyby4gICovCi0gIGlmIChsZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICAqdmFsdWVwID0gMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAoQ0dFTl9JTlRfSU5TTl9QCi0gICAgICAmJiB3b3JkX29mZnNldCAhPSAwKQotICAgIGFib3J0ICgpOwotCi0gIGlmICh3b3JkX2xlbmd0aCA+IDMyKQotICAgIGFib3J0ICgpOwotCi0gIC8qIEZvciBhcmNoaXRlY3R1cmVzIHdpdGggaW5zbnMgc21hbGxlciB0aGFuIHRoZSBpbnNuLWJhc2UtYml0c2l6ZSwKLSAgICAgd29yZF9sZW5ndGggbWF5IGJlIHRvbyBiaWcuICAqLwotICBpZiAoY2QtPm1pbl9pbnNuX2JpdHNpemUgPCBjZC0+YmFzZV9pbnNuX2JpdHNpemUpCi0gICAgewotICAgICAgaWYgKHdvcmRfb2Zmc2V0ID09IDAKLQkgICYmIHdvcmRfbGVuZ3RoID4gdG90YWxfbGVuZ3RoKQotCXdvcmRfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOwotICAgIH0KLQotICAvKiBEb2VzIHRoZSB2YWx1ZSByZXNpZGUgaW4gSU5TTl9WQUxVRT8gICovCi0KLSAgaWYgKHdvcmRfb2Zmc2V0ID09IDApCi0gICAgewotICAgICAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgICAgIENHRU5fSU5TTl9JTlQgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0KLSAgICAgIGlmIChDR0VOX0lOU05fTFNCMF9QKQotCXZhbHVlID0gaW5zbl92YWx1ZSA+PiAoKHN0YXJ0ICsgMSkgLSBsZW5ndGgpOwotICAgICAgZWxzZQotCXZhbHVlID0gaW5zbl92YWx1ZSA+PiAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKLSAgICAgIHZhbHVlICY9IG1hc2s7Ci0gICAgICAvKiBzaWduIGV4dGVuZD8gKi8KLSAgICAgIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fSUZMRF9TSUdORUQpCi0JICAmJiAodmFsdWUgJiAoMUwgPDwgKGxlbmd0aCAtIDEpKSkpCi0JdmFsdWUgfD0gfm1hc2s7Ci0gICAgfQotCi0jaWYgISBDR0VOX0lOVF9JTlNOX1AKLQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqYnVmcCA9IGV4X2luZm8tPmluc25fYnl0ZXMgKyB3b3JkX29mZnNldCAvIDg7Ci0KLSAgICAgIGlmICh3b3JkX2xlbmd0aCA+IDMyKQotCWFib3J0ICgpOwotCi0gICAgICBpZiAoZmlsbF9jYWNoZSAoY2QsIGV4X2luZm8sIHdvcmRfb2Zmc2V0IC8gOCwgd29yZF9sZW5ndGggLyA4LCBwYykgPT0gMCkKLQlyZXR1cm4gMDsKLQotICAgICAgdmFsdWUgPSBleHRyYWN0XzEgKGNkLCBleF9pbmZvLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCwgcGMpOwotICAgIH0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLSAgKnZhbHVlcCA9IHZhbHVlOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBEZWZhdWx0IGluc24gZXh0cmFjdG9yLgotCi0gICBJTlNOX1ZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzLCB0cmFuc2xhdGVkIHRvIGhvc3Qgb3JkZXIuCi0gICBUaGUgZXh0cmFjdGVkIGZpZWxkcyBhcmUgc3RvcmVkIGluIEZJRUxEUy4KLSAgIEVYX0lORk8gaXMgdXNlZCB0byBoYW5kbGUgcmVhZGluZyB2YXJpYWJsZSBsZW5ndGggaW5zbnMuCi0gICBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzLCBvciAwIGlmIG5vIG1hdGNoLAotICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJzIGZldGNoaW5nIGRhdGEgKG1lbW9yeV9lcnJvcl9mdW5jIHdpbGwgaGF2ZQotICAgYmVlbiBjYWxsZWQpLiAgKi8KLQotc3RhdGljIGludAotZXh0cmFjdF9pbnNuX25vcm1hbCAoY2QsIGluc24sIGV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzeW47Ci0KLSAgQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSA9IENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKLQotICBDR0VOX0lOSVRfRVhUUkFDVCAoY2QpOwotCi0gIGZvciAoc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOyAqc3luOyArK3N5bikKLSAgICB7Ci0gICAgICBpbnQgbGVuZ3RoOwotCi0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqc3luKSkKLQljb250aW51ZTsKLQotICAgICAgbGVuZ3RoID0gKCogY2QtPmV4dHJhY3Rfb3BlcmFuZCkgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksCi0JCQkJCWV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpOwotICAgICAgaWYgKGxlbmd0aCA8PSAwKQotCXJldHVybiBsZW5ndGg7Ci0gICAgfQotCi0gIC8qIFdlIHJlY29nbml6ZWQgYW5kIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQgdGhpcyBpbnNuLiAgKi8KLSAgcmV0dXJuIENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKLX0KLQwKLS8qIG1hY2hpbmUgZ2VuZXJhdGVkIGNvZGUgYWRkZWQgaGVyZSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIGluc2VydGlvbi4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucwotICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKLSAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KLSAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCi0gICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKLSAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwYXJzZV9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0Ci0gICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHBhcnNlX2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgotICAgdGhlIGhhbmRsZXJzLiAgSXQncyBhbHNvIG5lZWRlZCBieSBHQVMgdG8gaW5zZXJ0IG9wZXJhbmRzIHRoYXQgY291bGRuJ3QgYmUKLSAgIHJlc29sdmVkIGR1cmluZyBwYXJzaW5nLgotKi8KLQotY29uc3QgY2hhciAqCi1tMzJyX2NnZW5faW5zZXJ0X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIGJ1ZmZlciwgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWZmZXI7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIGNvbnN0IGNoYXIgKiBlcnJtc2c7Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9sZW5ndGggPSBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcjEsIDAsIDAsIDQsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AxNjsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKCgodmFsdWUpIC0gKHBjKSkpID4+ICgyKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMjQ7Ci0gICAgICAgIHZhbHVlID0gKChpbnQpICgoKHZhbHVlKSAtIChwYykpKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDgsIDI0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A4OwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAoKCh2YWx1ZSkgLSAoKChwYykgJiAoLTQpKSkpKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDgsIDgsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IxLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX25pbCwgMCwgMCwgMCwgMCwgMCwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2hpMTYsIDB8KDE8PENHRU5fSUZMRF9TSUdOX09QVCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IyLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3NpbW0xNiwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfc2ltbTgsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA4LCA4LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9zaW1tMTYsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IyLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yMSwgMCwgMCwgNCwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzIgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yMiwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl91aW1tMTYsIDAsIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3VpbW0yNCwgMHwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX0FCU19BRERSKSwgMCwgOCwgMjQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3VpbW00LCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdWltbTUsIDAsIDAsIDExLCA1LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl91aW1tMTYsIDAsIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgYnVpbGRpbmcgaW5zbi5cbiIpLAotCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgcmV0dXJuIGVycm1zZzsKLX0KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3Igb3BlcmFuZCBleHRyYWN0aW9uLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHByaW50X2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcHJpbnRfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuCi0qLwotCi1pbnQKLW0zMnJfY2dlbl9leHRyYWN0X29wZXJhbmQgKGNkLCBvcGluZGV4LCBleF9pbmZvLCBpbnNuX3ZhbHVlLCBmaWVsZHMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIGludCBsZW5ndGg7Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9sZW5ndGggPSBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgNCwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3IxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCgoKHZhbHVlKSA8PCAoMikpKSArIChwYykpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDE2ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDgsIDI0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCgoKHZhbHVlKSA8PCAoMikpKSArIChwYykpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDI0ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgOCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgoKCh2YWx1ZSkgPDwgKDIpKSkgKyAoKChwYykgJiAoLTQpKSkpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgNCwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3IxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAwLCAwLCAwLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9uaWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdOX09QVCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2hpMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfc2ltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDgsIDgsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9zaW1tOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9zaW1tMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3IyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdWltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9BQlNfQUREUiksIDAsIDgsIDI0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdWltbTI0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91aW1tNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDExLCA1LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdWltbTUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91aW1tMTYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBkZWNvZGluZyBpbnNuLlxuIiksCi0JICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHVybiBsZW5ndGg7Ci19Ci0KLWNnZW5faW5zZXJ0X2ZuICogY29uc3QgbTMycl9jZ2VuX2luc2VydF9oYW5kbGVyc1tdID0gCi17Ci0gIGluc2VydF9pbnNuX25vcm1hbCwKLX07Ci0KLWNnZW5fZXh0cmFjdF9mbiAqIGNvbnN0IG0zMnJfY2dlbl9leHRyYWN0X2hhbmRsZXJzW10gPSAKLXsKLSAgZXh0cmFjdF9pbnNuX25vcm1hbCwKLX07Ci0KLS8qIEdldHRpbmcgdmFsdWVzIGZyb20gY2dlbl9maWVsZHMgaXMgaGFuZGxlZCBieSBhIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zLgotICAgVGhleSBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgdHlwZSBvZiB0aGUgVkFMVUUgYXJndW1lbnQgdGhleSByZXR1cm4uCi0gICBUT0RPOiBmbG9hdGluZyBwb2ludCwgaW5saW5pbmcgc3VwcG9ydCwgcmVtb3ZlIGNhc2VzIHdoZXJlIHJlc3VsdCB0eXBlCi0gICBub3QgYXBwcm9wcmlhdGUuICAqLwotCi1pbnQKLW0zMnJfY2dlbl9nZXRfaW50X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLXsKLSAgaW50IHZhbHVlOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9uaWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2hpMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TQ1IgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfc2ltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfc2ltbTg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zaW1tMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW0xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tMjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW01OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTE2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBnZXR0aW5nIGludCBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1iZmRfdm1hCi1tMzJyX2NnZW5fZ2V0X3ZtYV9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgY29uc3QgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AyNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9IQVNIIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX25pbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaGkxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zaW1tMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zaW1tODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW0xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW0yNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW00OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tMTY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgdm1hIG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIFN0dWZmaW5nIHZhbHVlcyBpbiBjZ2VuX2ZpZWxkcyBpcyBoYW5kbGVkIGJ5IGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMuCi0gICBUaGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSB0eXBlIG9mIHRoZSBWQUxVRSBhcmd1bWVudCB0aGV5IGFjY2VwdC4KLSAgIFRPRE86IGZsb2F0aW5nIHBvaW50LCBpbmxpbmluZyBzdXBwb3J0LCByZW1vdmUgY2FzZXMgd2hlcmUgYXJndW1lbnQgdHlwZQotICAgbm90IGFwcHJvcHJpYXRlLiAgKi8KLQotdm9pZAotbTMycl9jZ2VuX3NldF9pbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcywgdmFsdWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgaW50IHZhbHVlOwotewotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICBmaWVsZHMtPmZfcjEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgZmllbGRzLT5mX2Rpc3AyNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgZmllbGRzLT5mX2Rpc3A4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICBmaWVsZHMtPmZfcjEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgZmllbGRzLT5mX25pbCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBmaWVsZHMtPmZfaGkxNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIGZpZWxkcy0+Zl9zaW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIGZpZWxkcy0+Zl9zaW1tOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgZmllbGRzLT5mX3NpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgZmllbGRzLT5mX3IyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBmaWVsZHMtPmZfcjIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgZmllbGRzLT5mX3VpbW0yNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgZmllbGRzLT5mX3VpbW00ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTUgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyBpbnQgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotfQotCi12b2lkCi1tMzJyX2NnZW5fc2V0X3ZtYV9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzLCB2YWx1ZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICBmaWVsZHMtPmZfcjEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgZmllbGRzLT5mX2Rpc3AyNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgZmllbGRzLT5mX2Rpc3A4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICBmaWVsZHMtPmZfcjEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgZmllbGRzLT5mX25pbCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBmaWVsZHMtPmZfaGkxNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIGZpZWxkcy0+Zl9zaW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIGZpZWxkcy0+Zl9zaW1tOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgZmllbGRzLT5mX3NpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgZmllbGRzLT5mX3IyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBmaWVsZHMtPmZfcjIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgZmllbGRzLT5mX3VpbW0yNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgZmllbGRzLT5mX3VpbW00ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTUgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyB2bWEgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotfQotCi0vKiBGdW5jdGlvbiB0byBjYWxsIGJlZm9yZSB1c2luZyB0aGUgaW5zdHJ1Y3Rpb24gYnVpbGRlciB0YWJsZXMuICAqLwotCi12b2lkCi1tMzJyX2NnZW5faW5pdF9pYmxkX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgY2QtPmluc2VydF9oYW5kbGVycyA9ICYgbTMycl9jZ2VuX2luc2VydF9oYW5kbGVyc1swXTsKLSAgY2QtPmV4dHJhY3RfaGFuZGxlcnMgPSAmIG0zMnJfY2dlbl9leHRyYWN0X2hhbmRsZXJzWzBdOwotCi0gIGNkLT5pbnNlcnRfb3BlcmFuZCA9IG0zMnJfY2dlbl9pbnNlcnRfb3BlcmFuZDsKLSAgY2QtPmV4dHJhY3Rfb3BlcmFuZCA9IG0zMnJfY2dlbl9leHRyYWN0X29wZXJhbmQ7Ci0KLSAgY2QtPmdldF9pbnRfb3BlcmFuZCA9IG0zMnJfY2dlbl9nZXRfaW50X29wZXJhbmQ7Ci0gIGNkLT5zZXRfaW50X29wZXJhbmQgPSBtMzJyX2NnZW5fc2V0X2ludF9vcGVyYW5kOwotICBjZC0+Z2V0X3ZtYV9vcGVyYW5kID0gbTMycl9jZ2VuX2dldF92bWFfb3BlcmFuZDsKLSAgY2QtPnNldF92bWFfb3BlcmFuZCA9IG0zMnJfY2dlbl9zZXRfdm1hX29wZXJhbmQ7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItb3BjLmMgYi9vcGNvZGVzL20zMnItb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZWRmOWEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMzJyLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMzMSArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBvcGNvZGUgdGFibGUgZm9yIG0zMnIuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm0zMnItZGVzYy5oIgotI2luY2x1ZGUgIm0zMnItb3BjLmgiCi0KLS8qIFRoZSBoYXNoIGZ1bmN0aW9ucyBhcmUgcmVjb3JkZWQgaGVyZSB0byBoZWxwIGtlZXAgYXNzZW1ibGVyIGNvZGUgb3V0IG9mCi0gICB0aGUgZGlzYXNzZW1ibGVyIGFuZCB2aWNlIHZlcnNhLiAgKi8KLQotc3RhdGljIGludCBhc21faGFzaF9pbnNuX3AgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXNtX2hhc2hfaW5zbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBpbnQgZGlzX2hhc2hfaW5zbl9wIFBBUkFNUyAoKGNvbnN0IENHRU5fSU5TTiAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGRpc19oYXNoX2luc24gUEFSQU1TICgoY29uc3QgY2hhciAqLCBDR0VOX0lOU05fSU5UKSk7Ci0KLS8qIEluc3RydWN0aW9uIGZvcm1hdHMuICAqLwotCi0jZGVmaW5lIEYoZikgJiBtMzJyX2NnZW5faWZsZF90YWJsZVtDT05DQVQyIChNMzJSXyxmKV0KLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2VtcHR5ID0gewotICAwLCAwLCAweDAsIHsgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGQzID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hbmQzID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9VSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9vcjMgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1VJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZGkgPSB7Ci0gIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfU0lNTTgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGR2MyA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmM4ID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1A4KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmMyNCA9IHsKLSAgMzIsIDMyLCAweGZmMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDI0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmVxID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9ESVNQMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9iZXF6ID0gewotICAzMiwgMzIsIDB4ZmZmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9ESVNQMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jbXAgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NtcGkgPSB7Ci0gIDMyLCAzMiwgMHhmZmYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2RpdiA9IHsKLSAgMzIsIDMyLCAweGYwZjBmZmZmLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfamwgPSB7Ci0gIDE2LCAxNiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkMjQgPSB7Ci0gIDMyLCAzMiwgMHhmMDAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX1VJTU0yNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTE2ID0gewotICAzMiwgMzIsIDB4ZjBmZjAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tdmZhY2hpID0gewotICAxNiwgMTYsIDB4ZjBmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tdmZjID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tdnRhY2hpID0gewotICAxNiwgMTYsIDB4ZjBmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tdnRjID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9ub3AgPSB7Ci0gIDE2LCAxNiwgMHhmZmZmLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3NldGggPSB7Ci0gIDMyLCAzMiwgMHhmMGZmMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX0hJMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zbGxpID0gewotICAxNiwgMTYsIDB4ZjBlMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX1NISUZUX09QMiksIEYgKEZfVUlNTTUpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdF9kID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF90cmFwID0gewotICAxNiwgMTYsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfVUlNTTQpLCAwIH0KLX07Ci0KLSN1bmRlZiBGCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lOU05fLGEpKQotI2RlZmluZSBNTkVNIENHRU5fU1lOVEFYX01ORU1PTklDIC8qIHN5bnRheCB2YWx1ZSBmb3IgbW5lbW9uaWMgKi8KLSNkZWZpbmUgT1BFUkFORChvcCkgQ09OQ0FUMiAoTTMyUl9PUEVSQU5EXyxvcCkKLSNkZWZpbmUgT1AoZmllbGQpIENHRU5fU1lOVEFYX01BS0VfRklFTEQgKE9QRVJBTkQgKGZpZWxkKSkKLQotLyogVGhlIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fT1BDT0RFIG0zMnJfY2dlbl9pbnNuX29wY29kZV90YWJsZVtNQVhfSU5TTlNdID0KLXsKLSAgLyogU3BlY2lhbCBudWxsIGZpcnN0IGVudHJ5LgotICAgICBBIGBudW0nIHZhbHVlIG9mIHplcm8gaXMgdGh1cyBpbnZhbGlkLgotICAgICBBbHNvLCB0aGUgc3BlY2lhbCBgaW52YWxpZCcgaW5zbiByZXNpZGVzIGhlcmUuICAqLwotICB7IHsgMCB9IH0sCi0vKiBhZGQgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YTAgfQotICB9LAotLyogYWRkMyAkZHIsJHNyLCRoYXNoJHNsbzE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKEhBU0gpLCBPUCAoU0xPMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMywgeyAweDgwYTAwMDAwIH0KLSAgfSwKLS8qIGFuZCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhjMCB9Ci0gIH0sCi0vKiBhbmQzICRkciwkc3IsJHVpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChVSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYW5kMywgeyAweDgwYzAwMDAwIH0KLSAgfSwKLS8qIG9yICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGUwIH0KLSAgfSwKLS8qIG9yMyAkZHIsJHNyLCRoYXNoJHVsbzE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKEhBU0gpLCBPUCAoVUxPMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfb3IzLCB7IDB4ODBlMDAwMDAgfQotICB9LAotLyogeG9yICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGQwIH0KLSAgfSwKLS8qIHhvcjMgJGRyLCRzciwkdWltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKFVJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9hbmQzLCB7IDB4ODBkMDAwMDAgfQotICB9LAotLyogYWRkaSAkZHIsJHNpbW04ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTSU1NOCksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4NDAwMCB9Ci0gIH0sCi0vKiBhZGR2ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDgwIH0KLSAgfSwKLS8qIGFkZHYzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChTSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkdjMsIHsgMHg4MDgwMDAwMCB9Ci0gIH0sCi0vKiBhZGR4ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDkwIH0KLSAgfSwKLS8qIGJjLnMgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmM4LCB7IDB4N2MwMCB9Ci0gIH0sCi0vKiBiYy5sICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmMyNCwgeyAweGZjMDAwMDAwIH0KLSAgfSwKLS8qIGJlcSAkc3JjMSwkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAnLCcsIE9QIChESVNQMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmVxLCB7IDB4YjAwMDAwMDAgfQotICB9LAotLyogYmVxeiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjA4MDAwMDAgfQotICB9LAotLyogYmdleiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjBiMDAwMDAgfQotICB9LAotLyogYmd0eiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjBkMDAwMDAgfQotICB9LAotLyogYmxleiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjBjMDAwMDAgfQotICB9LAotLyogYmx0eiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjBhMDAwMDAgfQotICB9LAotLyogYm5leiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjA5MDAwMDAgfQotICB9LAotLyogYmwucyAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iYzgsIHsgMHg3ZTAwIH0KLSAgfSwKLS8qIGJsLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9iYzI0LCB7IDB4ZmUwMDAwMDAgfQotICB9LAotLyogYm5jLnMgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmM4LCB7IDB4N2QwMCB9Ci0gIH0sCi0vKiBibmMubCAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjMjQsIHsgMHhmZDAwMDAwMCB9Ci0gIH0sCi0vKiBibmUgJHNyYzEsJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcSwgeyAweGIwMTAwMDAwIH0KLSAgfSwKLS8qIGJyYS5zICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjOCwgeyAweDdmMDAgfQotICB9LAotLyogYnJhLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9iYzI0LCB7IDB4ZmYwMDAwMDAgfQotICB9LAotLyogY21wICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4NDAgfQotICB9LAotLyogY21waSAkc3JjMiwkc2ltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKFNJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9jbXBpLCB7IDB4ODA0MDAwMDAgfQotICB9LAotLyogY21wdSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDUwIH0KLSAgfSwKLS8qIGNtcHVpICRzcmMyLCRzaW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoU0lNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcGksIHsgMHg4MDUwMDAwMCB9Ci0gIH0sCi0vKiBkaXYgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2LCB7IDB4OTAwMDAwMDAgfQotICB9LAotLyogZGl2dSAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9kaXYsIHsgMHg5MDEwMDAwMCB9Ci0gIH0sCi0vKiByZW0gJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2LCB7IDB4OTAyMDAwMDAgfQotICB9LAotLyogcmVtdSAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9kaXYsIHsgMHg5MDMwMDAwMCB9Ci0gIH0sCi0vKiBqbCAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9qbCwgeyAweDFlYzAgfQotICB9LAotLyogam1wICRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2psLCB7IDB4MWZjMCB9Ci0gIH0sCi0vKiBsZCAkZHIsQCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMGMwIH0KLSAgfSwKLS8qIGxkICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZDMsIHsgMHhhMGMwMDAwMCB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjA4MCB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMywgeyAweGEwODAwMDAwIH0KLSAgfSwKLS8qIGxkaCAkZHIsQCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMGEwIH0KLSAgfSwKLS8qIGxkaCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQzLCB7IDB4YTBhMDAwMDAgfQotICB9LAotLyogbGR1YiAkZHIsQCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMDkwIH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMywgeyAweGEwOTAwMDAwIH0KLSAgfSwKLS8qIGxkdWggJGRyLEAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjBiMCB9Ci0gIH0sCi0vKiBsZHVoICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZDMsIHsgMHhhMGIwMDAwMCB9Ci0gIH0sCi0vKiBsZCAkZHIsQCRzcisgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAnKycsIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMGUwIH0KLSAgfSwKLS8qIGxkMjQgJGRyLCR1aW1tMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFVJTU0yNCksIDAgfSB9LAotICAgICYgaWZtdF9sZDI0LCB7IDB4ZTAwMDAwMDAgfQotICB9LAotLyogbGRpOCAkZHIsJHNpbW04ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTSU1NOCksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4NjAwMCB9Ci0gIH0sCi0vKiBsZGkxNiAkZHIsJGhhc2gkc2xvMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKEhBU0gpLCBPUCAoU0xPMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpMTYsIHsgMHg5MGYwMDAwMCB9Ci0gIH0sCi0vKiBsb2NrICRkcixAJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwZDAgfQotICB9LAotLyogbWFjaGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDQwIH0KLSAgfSwKLS8qIG1hY2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzA1MCB9Ci0gIH0sCi0vKiBtYWN3aGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDYwIH0KLSAgfSwKLS8qIG1hY3dsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDMwNzAgfQotICB9LAotLyogbXVsICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwNjAgfQotICB9LAotLyogbXVsaGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDAwIH0KLSAgfSwKLS8qIG11bGxvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzAxMCB9Ci0gIH0sCi0vKiBtdWx3aGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDIwIH0KLSAgfSwKLS8qIG11bHdsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDMwMzAgfQotICB9LAotLyogbXYgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTA4MCB9Ci0gIH0sCi0vKiBtdmZhY2hpICRkciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgMCB9IH0sCi0gICAgJiBpZm10X212ZmFjaGksIHsgMHg1MGYwIH0KLSAgfSwKLS8qIG12ZmFjbG8gJGRyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZmYWNoaSwgeyAweDUwZjEgfQotICB9LAotLyogbXZmYWNtaSAkZHIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksIDAgfSB9LAotICAgICYgaWZtdF9tdmZhY2hpLCB7IDB4NTBmMiB9Ci0gIH0sCi0vKiBtdmZjICRkciwkc2NyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTQ1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZmYywgeyAweDEwOTAgfQotICB9LAotLyogbXZ0YWNoaSAkc3JjMSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZ0YWNoaSwgeyAweDUwNzAgfQotICB9LAotLyogbXZ0YWNsbyAkc3JjMSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZ0YWNoaSwgeyAweDUwNzEgfQotICB9LAotLyogbXZ0YyAkc3IsJGRjciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSKSwgJywnLCBPUCAoRENSKSwgMCB9IH0sCi0gICAgJiBpZm10X212dGMsIHsgMHgxMGEwIH0KLSAgfSwKLS8qIG5lZyAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgzMCB9Ci0gIH0sCi0vKiBub3AgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfbm9wLCB7IDB4NzAwMCB9Ci0gIH0sCi0vKiBub3QgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YjAgfQotICB9LAotLyogcmFjICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X25vcCwgeyAweDUwOTAgfQotICB9LAotLyogcmFjaCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9ub3AsIHsgMHg1MDgwIH0KLSAgfSwKLS8qIHJ0ZSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9ub3AsIHsgMHgxMGQ2IH0KLSAgfSwKLS8qIHNldGggJGRyLCRoYXNoJGhpMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKEhBU0gpLCBPUCAoSEkxNiksIDAgfSB9LAotICAgICYgaWZtdF9zZXRoLCB7IDB4ZDBjMDAwMDAgfQotICB9LAotLyogc2xsICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwNDAgfQotICB9LAotLyogc2xsMyAkZHIsJHNyLCRzaW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoU0lNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZHYzLCB7IDB4OTBjMDAwMDAgfQotICB9LAotLyogc2xsaSAkZHIsJHVpbW01ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChVSU1NNSksIDAgfSB9LAotICAgICYgaWZtdF9zbGxpLCB7IDB4NTA0MCB9Ci0gIH0sCi0vKiBzcmEgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTAyMCB9Ci0gIH0sCi0vKiBzcmEzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChTSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkdjMsIHsgMHg5MGEwMDAwMCB9Ci0gIH0sCi0vKiBzcmFpICRkciwkdWltbTUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFVJTU01KSwgMCB9IH0sCi0gICAgJiBpZm10X3NsbGksIHsgMHg1MDIwIH0KLSAgfSwKLS8qIHNybCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMDAwIH0KLSAgfSwKLS8qIHNybDMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKFNJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9hZGR2MywgeyAweDkwODAwMDAwIH0KLSAgfSwKLS8qIHNybGkgJGRyLCR1aW1tNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoVUlNTTUpLCAwIH0gfSwKLSAgICAmIGlmbXRfc2xsaSwgeyAweDUwMDAgfQotICB9LAotLyogc3QgJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgyMDQwIH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUkMyKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RfZCwgeyAweGEwNDAwMDAwIH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDIwMDAgfQotICB9LAotLyogc3RiICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUkMyKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RfZCwgeyAweGEwMDAwMDAwIH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDIwMjAgfQotICB9LAotLyogc3RoICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUkMyKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RfZCwgeyAweGEwMjAwMDAwIH0KLSAgfSwKLS8qIHN0ICRzcmMxLEArJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcrJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MjA2MCB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxALSRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnLScsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDIwNzAgfQotICB9LAotLyogc3ViICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwIH0KLSAgfSwKLS8qIHN1YnYgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MCB9Ci0gIH0sCi0vKiBzdWJ4ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwIH0KLSAgfSwKLS8qIHRyYXAgJHVpbW00ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVUlNTTQpLCAwIH0gfSwKLSAgICAmIGlmbXRfdHJhcCwgeyAweDEwZjAgfQotICB9LAotLyogdW5sb2NrICRzcmMxLEAkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MjA1MCB9Ci0gIH0sCi19OwotCi0jdW5kZWYgQQotI3VuZGVmIE1ORU0KLSN1bmRlZiBPUEVSQU5ECi0jdW5kZWYgT1AKLQotLyogRm9ybWF0cyBmb3IgQUxJQVMgbWFjcm8taW5zbnMuICAqLwotCi0jZGVmaW5lIEYoZikgJiBtMzJyX2NnZW5faWZsZF90YWJsZVtDT05DQVQyIChNMzJSXyxmKV0KLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JjOHIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9iYzI0ciA9IHsKLSAgMzIsIDMyLCAweGZmMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDI0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmw4ciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JsMjRyID0gewotICAzMiwgMzIsIDB4ZmYwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQMjQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9ibmM4ciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JuYzI0ciA9IHsKLSAgMzIsIDMyLCAweGZmMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDI0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYnJhOHIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9icmEyNHIgPSB7Ci0gIDMyLCAzMiwgMHhmZjAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1AyNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkXzIgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkX2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGJfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRiX2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGhfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRoX2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHViXzIgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkdWJfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkdWhfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGR1aF9kMiA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfcG9wID0gewotICAxNiwgMTYsIDB4ZjBmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGk4YSA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9TSU1NOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTE2YSA9IHsKLSAgMzIsIDMyLCAweGYwZmYwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0Yl8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdGJfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0aF8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdGhfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3B1c2ggPSB7Ci0gIDE2LCAxNiwgMHhmMGZmLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotI3VuZGVmIEYKLQotLyogRWFjaCBub24tc2ltcGxlIG1hY3JvIGVudHJ5IHBvaW50cyB0byBhbiBhcnJheSBvZiBleHBhbnNpb24gcG9zc2liaWxpdGllcy4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lOU05fLGEpKQotI2RlZmluZSBNTkVNIENHRU5fU1lOVEFYX01ORU1PTklDIC8qIHN5bnRheCB2YWx1ZSBmb3IgbW5lbW9uaWMgKi8KLSNkZWZpbmUgT1BFUkFORChvcCkgQ09OQ0FUMiAoTTMyUl9PUEVSQU5EXyxvcCkKLSNkZWZpbmUgT1AoZmllbGQpIENHRU5fU1lOVEFYX01BS0VfRklFTEQgKE9QRVJBTkQgKGZpZWxkKSkKLQotLyogVGhlIG1hY3JvIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fSUJBU0UgbTMycl9jZ2VuX21hY3JvX2luc25fdGFibGVbXSA9Ci17Ci0vKiBiYyAkZGlzcDggKi8KLSAgewotICAgIC0xLCAiYmM4ciIsICJiYyIsIDE2LAotICAgIHsgMHxBKFJFTEFYQUJMRSl8QShDT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiYyAkZGlzcDI0ICovCi0gIHsKLSAgICAtMSwgImJjMjRyIiwgImJjIiwgMzIsCi0gICAgeyAwfEEoUkVMQVgpfEEoQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmwgJGRpc3A4ICovCi0gIHsKLSAgICAtMSwgImJsOHIiLCAiYmwiLCAxNiwKLSAgICB7IDB8QShSRUxBWEFCTEUpfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmwgJGRpc3AyNCAqLwotICB7Ci0gICAgLTEsICJibDI0ciIsICJibCIsIDMyLAotICAgIHsgMHxBKFJFTEFYKXxBKFVOQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5jICRkaXNwOCAqLwotICB7Ci0gICAgLTEsICJibmM4ciIsICJibmMiLCAxNiwKLSAgICB7IDB8QShSRUxBWEFCTEUpfEEoQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5jICRkaXNwMjQgKi8KLSAgewotICAgIC0xLCAiYm5jMjRyIiwgImJuYyIsIDMyLAotICAgIHsgMHxBKFJFTEFYKXxBKENPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJyYSAkZGlzcDggKi8KLSAgewotICAgIC0xLCAiYnJhOHIiLCAiYnJhIiwgMTYsCi0gICAgeyAwfEEoUkVMQVhBQkxFKXxBKEZJTExfU0xPVCl8QShVTkNPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJyYSAkZGlzcDI0ICovCi0gIHsKLSAgICAtMSwgImJyYTI0ciIsICJicmEiLCAzMiwKLSAgICB7IDB8QShSRUxBWCl8QShVTkNPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkICRkcixAKCRzcikgKi8KLSAgewotICAgIC0xLCAibGQtMiIsICJsZCIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgLTEsICJsZC1kMiIsICJsZCIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgLTEsICJsZGItMiIsICJsZGIiLCAxNiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRiICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgImxkYi1kMiIsICJsZGIiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRoICRkcixAKCRzcikgKi8KLSAgewotICAgIC0xLCAibGRoLTIiLCAibGRoIiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaCAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgLTEsICJsZGgtZDIiLCAibGRoIiwgMzIsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgLTEsICJsZHViLTIiLCAibGR1YiIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHViICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgImxkdWItZDIiLCAibGR1YiIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHVoICRkcixAKCRzcikgKi8KLSAgewotICAgIC0xLCAibGR1aC0yIiwgImxkdWgiLCAxNiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGR1aCAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgLTEsICJsZHVoLWQyIiwgImxkdWgiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogcG9wICRkciAqLwotICB7Ci0gICAgLTEsICJwb3AiLCAicG9wIiwgMTYsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpICRkciwkc2ltbTggKi8KLSAgewotICAgIC0xLCAibGRpOGEiLCAibGRpIiwgMTYsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpICRkciwkaGFzaCRzbG8xNiAqLwotICB7Ci0gICAgLTEsICJsZGkxNmEiLCAibGRpIiwgMzIsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJHNyYzEsQCgkc3JjMikgKi8KLSAgewotICAgIC0xLCAic3QtMiIsICJzdCIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKCRzcmMyLCRzbG8xNikgKi8KLSAgewotICAgIC0xLCAic3QtZDIiLCAic3QiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RiICRzcmMxLEAoJHNyYzIpICovCi0gIHsKLSAgICAtMSwgInN0Yi0yIiwgInN0YiIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCgkc3JjMiwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgInN0Yi1kMiIsICJzdGIiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RoICRzcmMxLEAoJHNyYzIpICovCi0gIHsKLSAgICAtMSwgInN0aC0yIiwgInN0aCIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCgkc3JjMiwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgInN0aC1kMiIsICJzdGgiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogcHVzaCAkc3JjMSAqLwotICB7Ci0gICAgLTEsICJwdXNoIiwgInB1c2giLCAxNiwKLSAgICB7IDB8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi19OwotCi0vKiBUaGUgbWFjcm8gaW5zdHJ1Y3Rpb24gb3Bjb2RlIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fT1BDT0RFIG0zMnJfY2dlbl9tYWNyb19pbnNuX29wY29kZV90YWJsZVtdID0KLXsKLS8qIGJjICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjOHIsIHsgMHg3YzAwIH0KLSAgfSwKLS8qIGJjICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmMyNHIsIHsgMHhmYzAwMDAwMCB9Ci0gIH0sCi0vKiBibCAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9ibDhyLCB7IDB4N2UwMCB9Ci0gIH0sCi0vKiBibCAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JsMjRyLCB7IDB4ZmUwMDAwMDAgfQotICB9LAotLyogYm5jICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JuYzhyLCB7IDB4N2QwMCB9Ci0gIH0sCi0vKiBibmMgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9ibmMyNHIsIHsgMHhmZDAwMDAwMCB9Ci0gIH0sCi0vKiBicmEgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhOHIsIHsgMHg3ZjAwIH0KLSAgfSwKLS8qIGJyYSAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYTI0ciwgeyAweGZmMDAwMDAwIH0KLSAgfSwKLS8qIGxkICRkcixAKCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkXzIsIHsgMHgyMGMwIH0KLSAgfSwKLS8qIGxkICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkX2QyLCB7IDB4YTBjMDAwMDAgfQotICB9LAotLyogbGRiICRkcixAKCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkYl8yLCB7IDB4MjA4MCB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRiX2QyLCB7IDB4YTA4MDAwMDAgfQotICB9LAotLyogbGRoICRkcixAKCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkaF8yLCB7IDB4MjBhMCB9Ci0gIH0sCi0vKiBsZGggJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRoX2QyLCB7IDB4YTBhMDAwMDAgfQotICB9LAotLyogbGR1YiAkZHIsQCgkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZHViXzIsIHsgMHgyMDkwIH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGR1Yl9kMiwgeyAweGEwOTAwMDAwIH0KLSAgfSwKLS8qIGxkdWggJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGR1aF8yLCB7IDB4MjBiMCB9Ci0gIH0sCi0vKiBsZHVoICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkdWhfZDIsIHsgMHhhMGIwMDAwMCB9Ci0gIH0sCi0vKiBwb3AgJGRyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAwIH0gfSwKLSAgICAmIGlmbXRfcG9wLCB7IDB4MjBlZiB9Ci0gIH0sCi0vKiBsZGkgJGRyLCRzaW1tOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU0lNTTgpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpOGEsIHsgMHg2MDAwIH0KLSAgfSwKLS8qIGxkaSAkZHIsJGhhc2gkc2xvMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKEhBU0gpLCBPUCAoU0xPMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpMTZhLCB7IDB4OTBmMDAwMDAgfQotICB9LAotLyogc3QgJHNyYzEsQCgkc3JjMikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNSQzIpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdF8yLCB7IDB4MjA0MCB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKCRzcmMyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNSQzIpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0X2QyLCB7IDB4YTA0MDAwMDAgfQotICB9LAotLyogc3RiICRzcmMxLEAoJHNyYzIpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTUkMyKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RiXzIsIHsgMHgyMDAwIH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAKCRzcmMyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNSQzIpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0Yl9kMiwgeyAweGEwMDAwMDAwIH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAKCRzcmMyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU1JDMiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0aF8yLCB7IDB4MjAyMCB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCgkc3JjMiwkc2xvMTYpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTUkMyKSwgJywnLCBPUCAoU0xPMTYpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdGhfZDIsIHsgMHhhMDIwMDAwMCB9Ci0gIH0sCi0vKiBwdXNoICRzcmMxICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksIDAgfSB9LAotICAgICYgaWZtdF9wdXNoLCB7IDB4MjA3ZiB9Ci0gIH0sCi19OwotCi0jdW5kZWYgQQotI3VuZGVmIE1ORU0KLSN1bmRlZiBPUEVSQU5ECi0jdW5kZWYgT1AKLQotI2lmbmRlZiBDR0VOX0FTTV9IQVNIX1AKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSF9QKGluc24pIDEKLSNlbmRpZgotCi0jaWZuZGVmIENHRU5fRElTX0hBU0hfUAotI2RlZmluZSBDR0VOX0RJU19IQVNIX1AoaW5zbikgMQotI2VuZGlmCi0KLS8qIFJldHVybiBub24temVybyBpZiBJTlNOIGlzIHRvIGJlIGFkZGVkIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgVGFyZ2V0cyBhcmUgZnJlZSB0byBvdmVycmlkZSBDR0VOX3tBU00sRElTfV9IQVNIX1AgaW4gdGhlIC5vcGMgZmlsZS4gICovCi0KLXN0YXRpYyBpbnQKLWFzbV9oYXNoX2luc25fcCAoaW5zbikKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotewotICByZXR1cm4gQ0dFTl9BU01fSEFTSF9QIChpbnNuKTsKLX0KLQotc3RhdGljIGludAotZGlzX2hhc2hfaW5zbl9wIChpbnNuKQotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci17Ci0gIC8qIElmIGJ1aWxkaW5nIHRoZSBoYXNoIHRhYmxlIGFuZCB0aGUgTk8tRElTIGF0dHJpYnV0ZSBpcyBwcmVzZW50LAotICAgICBpZ25vcmUuICAqLwotICBpZiAoQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9OT19ESVMpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gQ0dFTl9ESVNfSEFTSF9QIChpbnNuKTsKLX0KLQotI2lmbmRlZiBDR0VOX0FTTV9IQVNICi0jZGVmaW5lIENHRU5fQVNNX0hBU0hfU0laRSAxMjcKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0jZGVmaW5lIENHRU5fQVNNX0hBU0gobW5lbSkgKCoodW5zaWduZWQgY2hhciAqKSAobW5lbSkgJSBDR0VOX0FTTV9IQVNIX1NJWkUpCi0jZWxzZQotI2RlZmluZSBDR0VOX0FTTV9IQVNIKG1uZW0pICgqKHVuc2lnbmVkIGNoYXIgKikgKG1uZW0pICUgQ0dFTl9BU01fSEFTSF9TSVpFKSAvKkZJWE1FKi8KLSNlbmRpZgotI2VuZGlmCi0KLS8qIEl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIHRvIHByb3ZpZGUgYSBkZWZhdWx0IGhlcmUsCi0gICBidXQgd2hpbGUgdGhpcyBpcyB1bmRlciBkZXZlbG9wbWVudCB3ZSBkby4KLSAgIEJVRkZFUiBpcyBhIHBvaW50ZXIgdG8gdGhlIGJ5dGVzIG9mIHRoZSBpbnNuLCB0YXJnZXQgb3JkZXIuCi0gICBWQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBhcyBhbiBpbnQgaW4gaG9zdCBvcmRlci4gICovCi0KLSNpZm5kZWYgQ0dFTl9ESVNfSEFTSAotI2RlZmluZSBDR0VOX0RJU19IQVNIX1NJWkUgMjU2Ci0jZGVmaW5lIENHRU5fRElTX0hBU0goYnVmLCB2YWx1ZSkgKCoodW5zaWduZWQgY2hhciAqKSAoYnVmKSkKLSNlbmRpZgotCi0vKiBUaGUgcmVzdWx0IGlzIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBpbnNuLgotICAgVGFyZ2V0cyBhcmUgZnJlZSB0byBvdmVycmlkZSBDR0VOX3tBU00sRElTfV9IQVNIIGluIHRoZSAub3BjIGZpbGUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1hc21faGFzaF9pbnNuIChtbmVtKQotICAgICBjb25zdCBjaGFyICogbW5lbTsKLXsKLSAgcmV0dXJuIENHRU5fQVNNX0hBU0ggKG1uZW0pOwotfQotCi0vKiBCVUYgaXMgYSBwb2ludGVyIHRvIHRoZSBieXRlcyBvZiB0aGUgaW5zbiwgdGFyZ2V0IG9yZGVyLgotICAgVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMgYXMgYW4gaW50IGluIGhvc3Qgb3JkZXIuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1kaXNfaGFzaF9pbnNuIChidWYsIHZhbHVlKQotICAgICBjb25zdCBjaGFyICogYnVmOwotICAgICBDR0VOX0lOU05fSU5UIHZhbHVlOwotewotICByZXR1cm4gQ0dFTl9ESVNfSEFTSCAoYnVmLCB2YWx1ZSk7Ci19Ci0KLS8qIFNldCB0aGUgcmVjb3JkZWQgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIHRoZSBDR0VOX0ZJRUxEUyBzdHJ1Y3QuICAqLwotCi1zdGF0aWMgdm9pZAotc2V0X2ZpZWxkc19iaXRzaXplIChmaWVsZHMsIHNpemUpCi0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGludCBzaXplOwotewotICBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpID0gc2l6ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8gY2FsbCBiZWZvcmUgdXNpbmcgdGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUuCi0gICBUaGlzIHBsdWdzIHRoZSBvcGNvZGUgZW50cmllcyBhbmQgbWFjcm8gaW5zdHJ1Y3Rpb25zIGludG8gdGhlIGNwdSB0YWJsZS4gICovCi0KLXZvaWQKLW0zMnJfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbnVtX21hY3JvcyA9IChzaXplb2YgKG0zMnJfY2dlbl9tYWNyb19pbnNuX3RhYmxlKSAvCi0JCSAgICBzaXplb2YgKG0zMnJfY2dlbl9tYWNyb19pbnNuX3RhYmxlWzBdKSk7Ci0gIGNvbnN0IENHRU5fSUJBU0UgKmliID0gJiBtMzJyX2NnZW5fbWFjcm9faW5zbl90YWJsZVswXTsKLSAgY29uc3QgQ0dFTl9PUENPREUgKm9jID0gJiBtMzJyX2NnZW5fbWFjcm9faW5zbl9vcGNvZGVfdGFibGVbMF07Ci0gIENHRU5fSU5TTiAqaW5zbnMgPSAoQ0dFTl9JTlNOICopIHhtYWxsb2MgKG51bV9tYWNyb3MgKiBzaXplb2YgKENHRU5fSU5TTikpOwotICBtZW1zZXQgKGluc25zLCAwLCBudW1fbWFjcm9zICogc2l6ZW9mIChDR0VOX0lOU04pKTsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9tYWNyb3M7ICsraSkKLSAgICB7Ci0gICAgICBpbnNuc1tpXS5iYXNlID0gJmliW2ldOwotICAgICAgaW5zbnNbaV0ub3Bjb2RlID0gJm9jW2ldOwotICAgIH0KLSAgY2QtPm1hY3JvX2luc25fdGFibGUuaW5pdF9lbnRyaWVzID0gaW5zbnM7Ci0gIGNkLT5tYWNyb19pbnNuX3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fSUJBU0UpOwotICBjZC0+bWFjcm9faW5zbl90YWJsZS5udW1faW5pdF9lbnRyaWVzID0gbnVtX21hY3JvczsKLQotICBvYyA9ICYgbTMycl9jZ2VuX2luc25fb3Bjb2RlX3RhYmxlWzBdOwotICBpbnNucyA9IChDR0VOX0lOU04gKikgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lOU05TOyArK2kpCi0gICAgaW5zbnNbaV0ub3Bjb2RlID0gJm9jW2ldOwotCi0gIGNkLT5zaXplb2ZfZmllbGRzID0gc2l6ZW9mIChDR0VOX0ZJRUxEUyk7Ci0gIGNkLT5zZXRfZmllbGRzX2JpdHNpemUgPSBzZXRfZmllbGRzX2JpdHNpemU7Ci0KLSAgY2QtPmFzbV9oYXNoX3AgPSBhc21faGFzaF9pbnNuX3A7Ci0gIGNkLT5hc21faGFzaCA9IGFzbV9oYXNoX2luc247Ci0gIGNkLT5hc21faGFzaF9zaXplID0gQ0dFTl9BU01fSEFTSF9TSVpFOwotCi0gIGNkLT5kaXNfaGFzaF9wID0gZGlzX2hhc2hfaW5zbl9wOwotICBjZC0+ZGlzX2hhc2ggPSBkaXNfaGFzaF9pbnNuOwotICBjZC0+ZGlzX2hhc2hfc2l6ZSA9IENHRU5fRElTX0hBU0hfU0laRTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1vcGMuaCBiL29wY29kZXMvbTMyci1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1N2RhYS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIGhlYWRlciBmb3IgbTMyci4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2lmbmRlZiBNMzJSX09QQ19ICi0jZGVmaW5lIE0zMlJfT1BDX0gKLQotLyogLS0gb3BjLmggKi8KLQotI3VuZGVmIENHRU5fRElTX0hBU0hfU0laRQotI2RlZmluZSBDR0VOX0RJU19IQVNIX1NJWkUgMjU2Ci0jdW5kZWYgQ0dFTl9ESVNfSEFTSAotI2RlZmluZSBYKGIpICgoKHVuc2lnbmVkIGNoYXIgKikgKGIpKVswXSAmIDB4ZjApCi0jZGVmaW5lIENHRU5fRElTX0hBU0goYnVmZmVyLCB2YWx1ZSkgXAotKFggKGJ1ZmZlcikgfCBcCi0gKFggKGJ1ZmZlcikgPT0gMHg0MCB8fCBYIChidWZmZXIpID09IDB4ZTAgfHwgWCAoYnVmZmVyKSA9PSAweDYwIHx8IFggKGJ1ZmZlcikgPT0gMHg1MCA/IDAgXAotICA6IFggKGJ1ZmZlcikgPT0gMHg3MCB8fCBYIChidWZmZXIpID09IDB4ZjAgPyAoKCh1bnNpZ25lZCBjaGFyICopIChidWZmZXIpKVswXSAmIDB4ZikgXAotICA6IFggKGJ1ZmZlcikgPT0gMHgzMCA/ICgoKCh1bnNpZ25lZCBjaGFyICopIChidWZmZXIpKVsxXSAmIDB4NzApID4+IDQpIFwKLSAgOiAoKCgodW5zaWduZWQgY2hhciAqKSAoYnVmZmVyKSlbMV0gJiAweGYwKSA+PiA0KSkpCi0KLS8qIC0tICovCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtMzJyIGluc3RydWN0aW9uIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2luc25fdHlwZSB7Ci0gIE0zMlJfSU5TTl9JTlZBTElELCBNMzJSX0lOU05fQURELCBNMzJSX0lOU05fQUREMywgTTMyUl9JTlNOX0FORAotICwgTTMyUl9JTlNOX0FORDMsIE0zMlJfSU5TTl9PUiwgTTMyUl9JTlNOX09SMywgTTMyUl9JTlNOX1hPUgotICwgTTMyUl9JTlNOX1hPUjMsIE0zMlJfSU5TTl9BRERJLCBNMzJSX0lOU05fQUREViwgTTMyUl9JTlNOX0FERFYzCi0gLCBNMzJSX0lOU05fQUREWCwgTTMyUl9JTlNOX0JDOCwgTTMyUl9JTlNOX0JDMjQsIE0zMlJfSU5TTl9CRVEKLSAsIE0zMlJfSU5TTl9CRVFaLCBNMzJSX0lOU05fQkdFWiwgTTMyUl9JTlNOX0JHVFosIE0zMlJfSU5TTl9CTEVaCi0gLCBNMzJSX0lOU05fQkxUWiwgTTMyUl9JTlNOX0JORVosIE0zMlJfSU5TTl9CTDgsIE0zMlJfSU5TTl9CTDI0Ci0gLCBNMzJSX0lOU05fQk5DOCwgTTMyUl9JTlNOX0JOQzI0LCBNMzJSX0lOU05fQk5FLCBNMzJSX0lOU05fQlJBOAotICwgTTMyUl9JTlNOX0JSQTI0Ci0gLCBNMzJSX0lOU05fQ01QLCBNMzJSX0lOU05fQ01QSSwgTTMyUl9JTlNOX0NNUFUsIE0zMlJfSU5TTl9DTVBVSQotICwgTTMyUl9JTlNOX0RJViwgTTMyUl9JTlNOX0RJVlUsIE0zMlJfSU5TTl9SRU0sIE0zMlJfSU5TTl9SRU1VCi0gLCBNMzJSX0lOU05fSkwsIE0zMlJfSU5TTl9KTVAsIE0zMlJfSU5TTl9MRCwgTTMyUl9JTlNOX0xEX0QKLSAsIE0zMlJfSU5TTl9MREIsIE0zMlJfSU5TTl9MREJfRCwgTTMyUl9JTlNOX0xESCwgTTMyUl9JTlNOX0xESF9ECi0gLCBNMzJSX0lOU05fTERVQiwgTTMyUl9JTlNOX0xEVUJfRCwgTTMyUl9JTlNOX0xEVUgsIE0zMlJfSU5TTl9MRFVIX0QKLSAsIE0zMlJfSU5TTl9MRF9QTFVTLCBNMzJSX0lOU05fTEQyNCwgTTMyUl9JTlNOX0xESTgsIE0zMlJfSU5TTl9MREkxNgotICwgTTMyUl9JTlNOX0xPQ0ssIE0zMlJfSU5TTl9NQUNISQotICwgTTMyUl9JTlNOX01BQ0xPCi0gLCBNMzJSX0lOU05fTUFDV0hJCi0gLCBNMzJSX0lOU05fTUFDV0xPCi0gLCBNMzJSX0lOU05fTVVMLCBNMzJSX0lOU05fTVVMSEkKLSAsIE0zMlJfSU5TTl9NVUxMTwotICwgTTMyUl9JTlNOX01VTFdISQotICwgTTMyUl9JTlNOX01VTFdMTwotICwgTTMyUl9JTlNOX01WLCBNMzJSX0lOU05fTVZGQUNISQotICwgTTMyUl9JTlNOX01WRkFDTE8KLSAsIE0zMlJfSU5TTl9NVkZBQ01JCi0gLCBNMzJSX0lOU05fTVZGQywgTTMyUl9JTlNOX01WVEFDSEkKLSAsIE0zMlJfSU5TTl9NVlRBQ0xPCi0gLCBNMzJSX0lOU05fTVZUQywgTTMyUl9JTlNOX05FRywgTTMyUl9JTlNOX05PUCwgTTMyUl9JTlNOX05PVAotICwgTTMyUl9JTlNOX1JBQwotICwgTTMyUl9JTlNOX1JBQ0gKLSAsIE0zMlJfSU5TTl9SVEUsIE0zMlJfSU5TTl9TRVRILCBNMzJSX0lOU05fU0xMLCBNMzJSX0lOU05fU0xMMwotICwgTTMyUl9JTlNOX1NMTEksIE0zMlJfSU5TTl9TUkEsIE0zMlJfSU5TTl9TUkEzLCBNMzJSX0lOU05fU1JBSQotICwgTTMyUl9JTlNOX1NSTCwgTTMyUl9JTlNOX1NSTDMsIE0zMlJfSU5TTl9TUkxJLCBNMzJSX0lOU05fU1QKLSAsIE0zMlJfSU5TTl9TVF9ELCBNMzJSX0lOU05fU1RCLCBNMzJSX0lOU05fU1RCX0QsIE0zMlJfSU5TTl9TVEgKLSAsIE0zMlJfSU5TTl9TVEhfRCwgTTMyUl9JTlNOX1NUX1BMVVMsIE0zMlJfSU5TTl9TVF9NSU5VUywgTTMyUl9JTlNOX1NVQgotICwgTTMyUl9JTlNOX1NVQlYsIE0zMlJfSU5TTl9TVUJYLCBNMzJSX0lOU05fVFJBUCwgTTMyUl9JTlNOX1VOTE9DSwotICwgTTMyUl9JTlNOX01BWAotfSBDR0VOX0lOU05fVFlQRTsKLQotLyogSW5kZXggb2YgYGludmFsaWQnIGluc24gcGxhY2UgaG9sZGVyLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX0lOVkFMSUQgTTMyUl9JTlNOX0lOVkFMSUQKLQotLyogVG90YWwgbnVtYmVyIG9mIGluc25zIGluIHRhYmxlLiAgKi8KLSNkZWZpbmUgTUFYX0lOU05TICgoaW50KSBNMzJSX0lOU05fTUFYKQotCi0vKiBUaGlzIHN0cnVjdCByZWNvcmRzIGRhdGEgcHJpb3IgdG8gaW5zZXJ0aW9uIG9yIGFmdGVyIGV4dHJhY3Rpb24uICAqLwotc3RydWN0IGNnZW5fZmllbGRzCi17Ci0gIGludCBsZW5ndGg7Ci0gIGxvbmcgZl9uaWw7Ci0gIGxvbmcgZl9vcDE7Ci0gIGxvbmcgZl9vcDI7Ci0gIGxvbmcgZl9jb25kOwotICBsb25nIGZfcjE7Ci0gIGxvbmcgZl9yMjsKLSAgbG9uZyBmX3NpbW04OwotICBsb25nIGZfc2ltbTE2OwotICBsb25nIGZfc2hpZnRfb3AyOwotICBsb25nIGZfdWltbTQ7Ci0gIGxvbmcgZl91aW1tNTsKLSAgbG9uZyBmX3VpbW0xNjsKLSAgbG9uZyBmX3VpbW0yNDsKLSAgbG9uZyBmX2hpMTY7Ci0gIGxvbmcgZl9kaXNwODsKLSAgbG9uZyBmX2Rpc3AxNjsKLSAgbG9uZyBmX2Rpc3AyNDsKLX07Ci0KLSNkZWZpbmUgQ0dFTl9JTklUX1BBUlNFKG9kKSBcCi17XAotfQotI2RlZmluZSBDR0VOX0lOSVRfSU5TRVJUKG9kKSBcCi17XAotfQotI2RlZmluZSBDR0VOX0lOSVRfRVhUUkFDVChvZCkgXAote1wKLX0KLSNkZWZpbmUgQ0dFTl9JTklUX1BSSU5UKG9kKSBcCi17XAotfQotCi0KLSNlbmRpZiAvKiBNMzJSX09QQ19IICovCmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItb3BpbnN0LmMgYi9vcGNvZGVzL20zMnItb3BpbnN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmM2E0OWYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMzJyLW9waW5zdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYyICswLDAgQEAKLS8qIFNlbWFudGljIG9wZXJhbmQgaW5zdGFuY2VzIGZvciBtMzJyLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJtMzJyLWRlc2MuaCIKLSNpbmNsdWRlICJtMzJyLW9wYy5oIgotCi0vKiBPcGVyYW5kIHJlZmVyZW5jZXMuICAqLwotCi0jZGVmaW5lIElOUFVUIENHRU5fT1BJTlNUX0lOUFVUCi0jZGVmaW5lIE9VVFBVVCBDR0VOX09QSU5TVF9PVVRQVVQKLSNkZWZpbmUgRU5EIENHRU5fT1BJTlNUX0VORAotI2RlZmluZSBDT05EX1JFRiBDR0VOX09QSU5TVF9DT05EX1JFRgotI2RlZmluZSBPUF9FTlQob3ApIENPTkNBVDIgKE0zMlJfT1BFUkFORF8sb3ApCi0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfZW1wdHlfb3BzW10gPSB7Ci0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYWRkX29wc1tdID0gewotICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9hZGQzX29wc1tdID0gewotICB7IElOUFVULCAic2xvMTYiLCBIV19IX1NMTzE2LCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNMTzE2KSwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYW5kM19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IElOUFVULCAidWltbTE2IiwgSFdfSF9VSU5ULCBDR0VOX01PREVfVUlOVCwgT1BfRU5UIChVSU1NMTYpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfb3IzX29wc1tdID0gewotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJ1bG8xNiIsIEhXX0hfVUxPMTYsIENHRU5fTU9ERV9VSU5ULCBPUF9FTlQgKFVMTzE2KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2FkZGlfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNpbW04IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNJTU04KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2FkZHZfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2FkZHYzX29wc1tdID0gewotICB7IElOUFVULCAic2ltbTE2IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNJTU0xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2FkZHhfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYmM4X29wc1tdID0gewotICB7IElOUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJkaXNwOCIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDgpLCAwLCBDT05EX1JFRiB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9iYzI0X29wc1tdID0gewotICB7IElOUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJkaXNwMjQiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1AyNCksIDAsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2JlcV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRpc3AxNiIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDE2KSwgMCwgQ09ORF9SRUYgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIENPTkRfUkVGIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYmVxel9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRpc3AxNiIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDE2KSwgMCwgQ09ORF9SRUYgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIENPTkRfUkVGIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYmw4X29wc1tdID0gewotICB7IElOUFVULCAiZGlzcDgiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1A4KSwgMCwgMCB9LAotICB7IElOUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9ncl8xNCIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgMCwgMTQsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9ibDI0X29wc1tdID0gewotICB7IElOUFVULCAiZGlzcDI0IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQMjQpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2dyXzE0IiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCAwLCAxNCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2JyYThfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkaXNwOCIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDgpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYnJhMjRfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkaXNwMjQiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1AyNCksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9jbXBfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfY21waV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNpbW0xNiIsIEhXX0hfU0lOVCwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTSU1NMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfZGl2X29wc1tdID0gewotICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCBDT05EX1JFRiB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2psX29wc1tdID0gewotICB7IElOUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2dyXzE0IiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCAwLCAxNCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2ptcF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2xkX29wc1tdID0gewotICB7IElOUFVULCAiaF9tZW1vcnlfc3IiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbGRfZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfbWVtb3J5X2FkZF9fVk1fc3Jfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9sZGJfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX21lbW9yeV9zciIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfUUksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9sZGJfZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfbWVtb3J5X2FkZF9fVk1fc3Jfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1FJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9sZGhfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX21lbW9yeV9zciIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfSEksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9sZGhfZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfbWVtb3J5X2FkZF9fVk1fc3Jfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX0hJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9sZF9wbHVzX29wc1tdID0gewotICB7IElOUFVULCAiaF9tZW1vcnlfc3IiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbGQyNF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInVpbW0yNCIsIEhXX0hfQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChVSU1NMjQpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbGRpOF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNpbW04IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNJTU04KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2xkaTE2X29wc1tdID0gewotICB7IElOUFVULCAic2xvMTYiLCBIV19IX1NMTzE2LCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNMTzE2KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2xvY2tfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX21lbW9yeV9zciIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2xvY2siLCBIV19IX0xPQ0ssIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X21hY2hpX29wc1tdID0gewotICB7IElOUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X211bGhpX29wc1tdID0gewotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbXZfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9tdmZhY2hpX29wc1tdID0gewotICB7IElOUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9tdmZjX29wc1tdID0gewotICB7IElOUFVULCAic2NyIiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTQ1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbXZ0YWNoaV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9tdnRjX29wc1tdID0gewotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZGNyIiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChEQ1IpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbm9wX29wc1tdID0gewotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3JhY19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9ydGVfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX2JicHN3IiwgSFdfSF9CQlBTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAiaF9icHN3IiwgSFdfSF9CUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJoX2NyXzE0IiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgMCwgMTQsIDAgfSwKLSAgeyBJTlBVVCwgImhfY3JfNiIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDYsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2Jwc3ciLCBIV19IX0JQU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2NyXzYiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCAwLCA2LCAwIH0sCi0gIHsgT1VUUFVULCAiaF9wc3ciLCBIV19IX1BTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3NldGhfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoaTE2IiwgSFdfSF9ISTE2LCBDR0VOX01PREVfU0ksIE9QX0VOVCAoSEkxNiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9zbGwzX29wc1tdID0gewotICB7IElOUFVULCAic2ltbTE2IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU0lNTTE2KSwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfc2xsaV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IElOUFVULCAidWltbTUiLCBIV19IX1VJTlQsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoVUlNTTUpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfc3Rfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfbWVtb3J5X3NyYzIiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfc3RfZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9hZGRfX1ZNX3NyYzJfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfc3RiX29wc1tdID0gewotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9RSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9zcmMyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9RSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3N0Yl9kX29wc1tdID0gewotICB7IElOUFVULCAic2xvMTYiLCBIV19IX1NMTzE2LCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNMTzE2KSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9RSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfbWVtb3J5X2FkZF9fVk1fc3JjMl9zbG8xNiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfUUksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9zdGhfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX0hJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfbWVtb3J5X3NyYzIiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX0hJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfc3RoX2Rfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX0hJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfYWRkX19WTV9zcmMyX3NsbzE2IiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9ISSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3N0X3BsdXNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfbmV3X3NyYzIiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3RyYXBfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX2Jwc3ciLCBIV19IX0JQU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImhfY3JfNiIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDYsIDAgfSwKLSAgeyBJTlBVVCwgImhfcHN3IiwgSFdfSF9QU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAidWltbTQiLCBIV19IX1VJTlQsIENHRU5fTU9ERV9VSU5ULCBPUF9FTlQgKFVJTU00KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfYmJwc3ciLCBIV19IX0JCUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9icHN3IiwgSFdfSF9CUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9jcl8xNCIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDE0LCAwIH0sCi0gIHsgT1VUUFVULCAiaF9jcl82IiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgMCwgNiwgMCB9LAotICB7IE9VVFBVVCwgImhfcHN3IiwgSFdfSF9QU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9TSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3VubG9ja19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfbG9jayIsIEhXX0hfTE9DSywgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCBDT05EX1JFRiB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoU1JDMiksIDAsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAiaF9sb2NrIiwgSFdfSF9MT0NLLCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9zcmMyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9TSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotI3VuZGVmIElOUFVUCi0jdW5kZWYgT1VUUFVUCi0jdW5kZWYgRU5ECi0jdW5kZWYgQ09ORF9SRUYKLSN1bmRlZiBPUF9FTlQKLQotLyogT3BlcmFuZCBpbnN0YW5jZSBsb29rdXAgdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgKm0zMnJfY2dlbl9vcGluc3RfdGFibGVbTUFYX0lOU05TXSA9IHsKLSAgMCwKLSAgJiBmbXRfYWRkX29wc1swXSwKLSAgJiBmbXRfYWRkM19vcHNbMF0sCi0gICYgZm10X2FkZF9vcHNbMF0sCi0gICYgZm10X2FuZDNfb3BzWzBdLAotICAmIGZtdF9hZGRfb3BzWzBdLAotICAmIGZtdF9vcjNfb3BzWzBdLAotICAmIGZtdF9hZGRfb3BzWzBdLAotICAmIGZtdF9hbmQzX29wc1swXSwKLSAgJiBmbXRfYWRkaV9vcHNbMF0sCi0gICYgZm10X2FkZHZfb3BzWzBdLAotICAmIGZtdF9hZGR2M19vcHNbMF0sCi0gICYgZm10X2FkZHhfb3BzWzBdLAotICAmIGZtdF9iYzhfb3BzWzBdLAotICAmIGZtdF9iYzI0X29wc1swXSwKLSAgJiBmbXRfYmVxX29wc1swXSwKLSAgJiBmbXRfYmVxel9vcHNbMF0sCi0gICYgZm10X2JlcXpfb3BzWzBdLAotICAmIGZtdF9iZXF6X29wc1swXSwKLSAgJiBmbXRfYmVxel9vcHNbMF0sCi0gICYgZm10X2JlcXpfb3BzWzBdLAotICAmIGZtdF9iZXF6X29wc1swXSwKLSAgJiBmbXRfYmw4X29wc1swXSwKLSAgJiBmbXRfYmwyNF9vcHNbMF0sCi0gICYgZm10X2JjOF9vcHNbMF0sCi0gICYgZm10X2JjMjRfb3BzWzBdLAotICAmIGZtdF9iZXFfb3BzWzBdLAotICAmIGZtdF9icmE4X29wc1swXSwKLSAgJiBmbXRfYnJhMjRfb3BzWzBdLAotICAmIGZtdF9jbXBfb3BzWzBdLAotICAmIGZtdF9jbXBpX29wc1swXSwKLSAgJiBmbXRfY21wX29wc1swXSwKLSAgJiBmbXRfY21waV9vcHNbMF0sCi0gICYgZm10X2Rpdl9vcHNbMF0sCi0gICYgZm10X2Rpdl9vcHNbMF0sCi0gICYgZm10X2Rpdl9vcHNbMF0sCi0gICYgZm10X2Rpdl9vcHNbMF0sCi0gICYgZm10X2psX29wc1swXSwKLSAgJiBmbXRfam1wX29wc1swXSwKLSAgJiBmbXRfbGRfb3BzWzBdLAotICAmIGZtdF9sZF9kX29wc1swXSwKLSAgJiBmbXRfbGRiX29wc1swXSwKLSAgJiBmbXRfbGRiX2Rfb3BzWzBdLAotICAmIGZtdF9sZGhfb3BzWzBdLAotICAmIGZtdF9sZGhfZF9vcHNbMF0sCi0gICYgZm10X2xkYl9vcHNbMF0sCi0gICYgZm10X2xkYl9kX29wc1swXSwKLSAgJiBmbXRfbGRoX29wc1swXSwKLSAgJiBmbXRfbGRoX2Rfb3BzWzBdLAotICAmIGZtdF9sZF9wbHVzX29wc1swXSwKLSAgJiBmbXRfbGQyNF9vcHNbMF0sCi0gICYgZm10X2xkaThfb3BzWzBdLAotICAmIGZtdF9sZGkxNl9vcHNbMF0sCi0gICYgZm10X2xvY2tfb3BzWzBdLAotICAmIGZtdF9tYWNoaV9vcHNbMF0sCi0gICYgZm10X21hY2hpX29wc1swXSwKLSAgJiBmbXRfbWFjaGlfb3BzWzBdLAotICAmIGZtdF9tYWNoaV9vcHNbMF0sCi0gICYgZm10X2FkZF9vcHNbMF0sCi0gICYgZm10X211bGhpX29wc1swXSwKLSAgJiBmbXRfbXVsaGlfb3BzWzBdLAotICAmIGZtdF9tdWxoaV9vcHNbMF0sCi0gICYgZm10X211bGhpX29wc1swXSwKLSAgJiBmbXRfbXZfb3BzWzBdLAotICAmIGZtdF9tdmZhY2hpX29wc1swXSwKLSAgJiBmbXRfbXZmYWNoaV9vcHNbMF0sCi0gICYgZm10X212ZmFjaGlfb3BzWzBdLAotICAmIGZtdF9tdmZjX29wc1swXSwKLSAgJiBmbXRfbXZ0YWNoaV9vcHNbMF0sCi0gICYgZm10X212dGFjaGlfb3BzWzBdLAotICAmIGZtdF9tdnRjX29wc1swXSwKLSAgJiBmbXRfbXZfb3BzWzBdLAotICAmIGZtdF9ub3Bfb3BzWzBdLAotICAmIGZtdF9tdl9vcHNbMF0sCi0gICYgZm10X3JhY19vcHNbMF0sCi0gICYgZm10X3JhY19vcHNbMF0sCi0gICYgZm10X3J0ZV9vcHNbMF0sCi0gICYgZm10X3NldGhfb3BzWzBdLAotICAmIGZtdF9hZGRfb3BzWzBdLAotICAmIGZtdF9zbGwzX29wc1swXSwKLSAgJiBmbXRfc2xsaV9vcHNbMF0sCi0gICYgZm10X2FkZF9vcHNbMF0sCi0gICYgZm10X3NsbDNfb3BzWzBdLAotICAmIGZtdF9zbGxpX29wc1swXSwKLSAgJiBmbXRfYWRkX29wc1swXSwKLSAgJiBmbXRfc2xsM19vcHNbMF0sCi0gICYgZm10X3NsbGlfb3BzWzBdLAotICAmIGZtdF9zdF9vcHNbMF0sCi0gICYgZm10X3N0X2Rfb3BzWzBdLAotICAmIGZtdF9zdGJfb3BzWzBdLAotICAmIGZtdF9zdGJfZF9vcHNbMF0sCi0gICYgZm10X3N0aF9vcHNbMF0sCi0gICYgZm10X3N0aF9kX29wc1swXSwKLSAgJiBmbXRfc3RfcGx1c19vcHNbMF0sCi0gICYgZm10X3N0X3BsdXNfb3BzWzBdLAotICAmIGZtdF9hZGRfb3BzWzBdLAotICAmIGZtdF9hZGR2X29wc1swXSwKLSAgJiBmbXRfYWRkeF9vcHNbMF0sCi0gICYgZm10X3RyYXBfb3BzWzBdLAotICAmIGZtdF91bmxvY2tfb3BzWzBdLAotfTsKLQotLyogRnVuY3Rpb24gdG8gY2FsbCBiZWZvcmUgdXNpbmcgdGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUuICAqLwotCi12b2lkCi1tMzJyX2NnZW5faW5pdF9vcGluc3RfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9PUElOU1QgKipvaSA9ICYgbTMycl9jZ2VuX29waW5zdF90YWJsZVswXTsKLSAgQ0dFTl9JTlNOICppbnNucyA9IChDR0VOX0lOU04gKikgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lOU05TOyArK2kpCi0gICAgaW5zbnNbaV0ub3BpbnN0ID0gb2lbaV07Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL202OGstZGlzLmMgYi9vcGNvZGVzL202OGstZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMTZjMjEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tNjhrLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0MyArMCwwIEBACi0vKiBQcmludCBNb3Rvcm9sYSA2OGsgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IDE5ODYsIDg3LCA4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImZsb2F0Zm9ybWF0LmgiCi0jaW5jbHVkZSA8bGliaWJlcnR5Lmg+Ci0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvbTY4ay5oIgotCi0vKiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCi0KLXN0YXRpYyBpbnQKLWZldGNoX2RhdGEgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYmZkX2J5dGUgKikpOwotCi1zdGF0aWMgdm9pZAotZHVtbXlfcHJpbnRfYWRkcmVzcyBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWZldGNoX2FyZyBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCwgaW50LCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIHZvaWQKLXByaW50X2Jhc2UgUEFSQU1TICgoaW50LCBiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1wcmludF9pbmRleGVkIFBBUkFNUyAoKGludCwgdW5zaWduZWQgY2hhciAqLCBiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmcgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwKLQkJCWJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1DT05TVCBjaGFyICogQ09OU1QgZnBjcl9uYW1lc1tdID0gewotICAiIiwgIiVmcGlhciIsICIlZnBzciIsICIlZnBpYXIvJWZwc3IiLCAiJWZwY3IiLAotICAiJWZwaWFyLyVmcGNyIiwgIiVmcHNyLyVmcGNyIiwgIiVmcGlhci8lZnBzci8lZnBjciJ9OwotCi1zdGF0aWMgY2hhciAqY29uc3QgcmVnX25hbWVzW10gPSB7Ci0gICIlZDAiLCAiJWQxIiwgIiVkMiIsICIlZDMiLCAiJWQ0IiwgIiVkNSIsICIlZDYiLCAiJWQ3IiwKLSAgIiVhMCIsICIlYTEiLCAiJWEyIiwgIiVhMyIsICIlYTQiLCAiJWE1IiwgIiVmcCIsICIlc3AiLAotICAiJXBzIiwgIiVwYyJ9OwotCi0vKiBTaWduLWV4dGVuZCBhbiAodW5zaWduZWQgY2hhcikuICovCi0jaWYgX19TVERDX18gPT0gMQotI2RlZmluZSBDT0VSQ0VfU0lHTkVEX0NIQVIoY2gpICgoc2lnbmVkIGNoYXIpKGNoKSkKLSNlbHNlCi0jZGVmaW5lIENPRVJDRV9TSUdORURfQ0hBUihjaCkgKChpbnQpKCgoY2gpIF4gMHg4MCkgJiAweEZGKSAtIDEyOCkKLSNlbmRpZgotCi0vKiBHZXQgYSAxIGJ5dGUgc2lnbmVkIGludGVnZXIuICAqLwotI2RlZmluZSBORVhUQllURShwKSAgKHAgKz0gMiwgRkVUQ0hfREFUQSAoaW5mbywgcCksIENPRVJDRV9TSUdORURfQ0hBUihwWy0xXSkpCi0KLS8qIEdldCBhIDIgYnl0ZSBzaWduZWQgaW50ZWdlci4gICovCi0jZGVmaW5lIENPRVJDRTE2KHgpICgoaW50KSAoKCh4KSBeIDB4ODAwMCkgLSAweDgwMDApKQotI2RlZmluZSBORVhUV09SRChwKSAgXAotICAocCArPSAyLCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAotICAgQ09FUkNFMTYgKChwWy0yXSA8PCA4KSArIHBbLTFdKSkKLQotLyogR2V0IGEgNCBieXRlIHNpZ25lZCBpbnRlZ2VyLiAgKi8KLSNkZWZpbmUgQ09FUkNFMzIoeCkgKChiZmRfc2lnbmVkX3ZtYSkgKCh4KSBeIDB4ODAwMDAwMDApIC0gMHg4MDAwMDAwMCkKLSNkZWZpbmUgTkVYVExPTkcocCkgIFwKLSAgKHAgKz0gNCwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgIChDT0VSQ0UzMiAoKCgoKChwWy00XSA8PCA4KSArIHBbLTNdKSA8PCA4KSArIHBbLTJdKSA8PCA4KSArIHBbLTFdKSkpCi0KLS8qIEdldCBhIDQgYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyLiAgKi8KLSNkZWZpbmUgTkVYVFVMT05HKHApICBcCi0gIChwICs9IDQsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gICAodW5zaWduZWQgaW50KSAoKCgoKChwWy00XSA8PCA4KSArIHBbLTNdKSA8PCA4KSArIHBbLTJdKSA8PCA4KSArIHBbLTFdKSkKLQotLyogR2V0IGEgc2luZ2xlIHByZWNpc2lvbiBmbG9hdC4gICovCi0jZGVmaW5lIE5FWFRTSU5HTEUodmFsLCBwKSBcCi0gIChwICs9IDQsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gICBmbG9hdGZvcm1hdF90b19kb3VibGUgKCZmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9iaWcsIChjaGFyICopIHAgLSA0LCAmdmFsKSkKLQotLyogR2V0IGEgZG91YmxlIHByZWNpc2lvbiBmbG9hdC4gICovCi0jZGVmaW5lIE5FWFRET1VCTEUodmFsLCBwKSBcCi0gIChwICs9IDgsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gICBmbG9hdGZvcm1hdF90b19kb3VibGUgKCZmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9iaWcsIChjaGFyICopIHAgLSA4LCAmdmFsKSkKLQotLyogR2V0IGFuIGV4dGVuZGVkIHByZWNpc2lvbiBmbG9hdC4gICovCi0jZGVmaW5lIE5FWFRFWFRFTkQodmFsLCBwKSBcCi0gIChwICs9IDEyLCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAotICAgZmxvYXRmb3JtYXRfdG9fZG91YmxlICgmZmxvYXRmb3JtYXRfbTY4ODgxX2V4dCwgKGNoYXIgKikgcCAtIDEyLCAmdmFsKSkKLQotLyogTmVlZCBhIGZ1bmN0aW9uIHRvIGNvbnZlcnQgZnJvbSBwYWNrZWQgdG8gZG91YmxlCi0gICBwcmVjaXNpb24uICAgQWN0dWFsbHksIGl0J3MgZWFzaWVyIHRvIHByaW50IGEKLSAgIHBhY2tlZCBudW1iZXIgdGhhbiBhIGRvdWJsZSBhbnl3YXksIHNvIG1heWJlCi0gICB0aGVyZSBzaG91bGQgYmUgYSBzcGVjaWFsIGNhc2UgdG8gaGFuZGxlIHRoaXMuLi4gKi8KLSNkZWZpbmUgTkVYVFBBQ0tFRChwKSBcCi0gIChwICs9IDEyLCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgMC4wKQotCi0MCi0vKiBNYXhpbXVtIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1BWExFTiAyMgotCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0KLXN0cnVjdCBwcml2YXRlCi17Ci0gIC8qIFBvaW50cyB0byBmaXJzdCBieXRlIG5vdCBmZXRjaGVkLiAgKi8KLSAgYmZkX2J5dGUgKm1heF9mZXRjaGVkOwotICBiZmRfYnl0ZSB0aGVfYnVmZmVyW01BWExFTl07Ci0gIGJmZF92bWEgaW5zbl9zdGFydDsKLSAgam1wX2J1ZiBiYWlsb3V0OwotfTsKLQotLyogTWFrZSBzdXJlIHRoYXQgYnl0ZXMgZnJvbSBJTkZPLT5QUklWQVRFX0RBVEEtPkJVRkZFUiAoaW5jbHVzaXZlKQotICAgdG8gQUREUiAoZXhjbHVzaXZlKSBhcmUgdmFsaWQuICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIGxvbmdqbXBzCi0gICBvbiBlcnJvci4gICovCi0jZGVmaW5lIEZFVENIX0RBVEEoaW5mbywgYWRkcikgXAotICAoKGFkZHIpIDw9ICgoc3RydWN0IHByaXZhdGUgKikoaW5mby0+cHJpdmF0ZV9kYXRhKSktPm1heF9mZXRjaGVkIFwKLSAgID8gMSA6IGZldGNoX2RhdGEgKChpbmZvKSwgKGFkZHIpKSkKLQotc3RhdGljIGludAotZmV0Y2hfZGF0YSAoaW5mbywgYWRkcikKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF9ieXRlICphZGRyOwotewotICBpbnQgc3RhdHVzOwotICBzdHJ1Y3QgcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgcHJpdmF0ZSAqKWluZm8tPnByaXZhdGVfZGF0YTsKLSAgYmZkX3ZtYSBzdGFydCA9IHByaXYtPmluc25fc3RhcnQgKyAocHJpdi0+bWF4X2ZldGNoZWQgLSBwcml2LT50aGVfYnVmZmVyKTsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChzdGFydCwKLQkJCQkgICAgICBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBhZGRyIC0gcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBzdGFydCwgaW5mbyk7Ci0gICAgICBsb25nam1wIChwcml2LT5iYWlsb3V0LCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBwcml2LT5tYXhfZmV0Y2hlZCA9IGFkZHI7Ci0gIHJldHVybiAxOwotfQotDAotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHByaW50IHRvIHRoZSBiaXQtYnVja2V0LiAqLwotc3RhdGljIGludAotI2lmZGVmIF9fU1REQ19fCi1kdW1teV9wcmludGVyIChGSUxFICogZmlsZSwgY29uc3QgY2hhciAqIGZvcm1hdCwgLi4uKQotI2Vsc2UKLWR1bW15X3ByaW50ZXIgKGZpbGUpIEZJTEUgKmZpbGU7Ci0jZW5kaWYKLSB7IHJldHVybiAwOyB9Ci0KLXN0YXRpYyB2b2lkCi1kdW1teV9wcmludF9hZGRyZXNzICh2bWEsIGluZm8pCi0gICAgIGJmZF92bWEgdm1hOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLX0KLQotLyogUHJpbnQgdGhlIG02OGsgaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyBNRU1BRERSIGluIGRlYnVnZ2VkIG1lbW9yeSwKLSAgIG9uIElORk8tPlNUUkVBTS4gIFJldHVybnMgbGVuZ3RoIG9mIHRoZSBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMuICAqLwotCi1pbnQKLXByaW50X2luc25fbTY4ayAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZWdpc3RlciBpbnQgaTsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcDsKLSAgdW5zaWduZWQgY2hhciAqc2F2ZV9wOwotICByZWdpc3RlciBjb25zdCBjaGFyICpkOwotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGJlc3RtYXNrOwotICBjb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgKmJlc3QgPSAwOwotICB1bnNpZ25lZCBpbnQgYXJjaF9tYXNrOwotICBzdHJ1Y3QgcHJpdmF0ZSBwcml2OwotICBiZmRfYnl0ZSAqYnVmZmVyID0gcHJpdi50aGVfYnVmZmVyOwotICBmcHJpbnRmX2Z0eXBlIHNhdmVfcHJpbnRlciA9IGluZm8tPmZwcmludGZfZnVuYzsKLSAgdm9pZCAoKnNhdmVfcHJpbnRfYWRkcmVzcykgUEFSQU1TKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyopKQotICAgID0gaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jOwotICBpbnQgbWFqb3Jfb3Bjb2RlOwotICBzdGF0aWMgaW50IG51bW9wY29kZXNbMTZdOwotICBzdGF0aWMgY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlICoqb3Bjb2Rlc1sxNl07Ci0KLSAgaWYgKCFvcGNvZGVzWzBdKQotICAgIHsKLSAgICAgIC8qIFNwZWVkIHVwIHRoZSBtYXRjaGluZyBieSBzb3J0aW5nIHRoZSBvcGNvZGUgdGFibGUgb24gdGhlIHVwcGVyCi0JIGZvdXIgYml0cyBvZiB0aGUgb3Bjb2RlLiAgKi8KLSAgICAgIGNvbnN0IHN0cnVjdCBtNjhrX29wY29kZSAqKm9wY19wb2ludGVyWzE2XTsKLQotICAgICAgLyogRmlyc3QgY291bnQgaG93IG1hbnkgb3Bjb2RlcyBhcmUgaW4gZWFjaCBvZiB0aGUgc2l4dGVlbiBidWNrZXRzLiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBtNjhrX251bW9wY29kZXM7IGkrKykKLQludW1vcGNvZGVzWyhtNjhrX29wY29kZXNbaV0ub3Bjb2RlID4+IDI4KSAmIDE1XSsrOwotCi0gICAgICAvKiBUaGVuIGNyZWF0ZSBhIHNvcnRlZCB0YWJsZSBvZiBwb2ludGVycyB0aGF0IHBvaW50IGludG8gdGhlCi0JIHVuc29ydGVkIHRhYmxlLiAgKi8KLSAgICAgIG9wY19wb2ludGVyWzBdID0gKChjb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgKiopCi0JCQl4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBtNjhrX29wY29kZSAqKQotCQkJCSAqIG02OGtfbnVtb3Bjb2RlcykpOwotICAgICAgb3Bjb2Rlc1swXSA9IG9wY19wb2ludGVyWzBdOwotICAgICAgZm9yIChpID0gMTsgaSA8IDE2OyBpKyspCi0JewotCSAgb3BjX3BvaW50ZXJbaV0gPSBvcGNfcG9pbnRlcltpIC0gMV0gKyBudW1vcGNvZGVzW2kgLSAxXTsKLQkgIG9wY29kZXNbaV0gPSBvcGNfcG9pbnRlcltpXTsKLQl9Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBtNjhrX251bW9wY29kZXM7IGkrKykKLQkqb3BjX3BvaW50ZXJbKG02OGtfb3Bjb2Rlc1tpXS5vcGNvZGUgPj4gMjgpICYgMTVdKysgPSAmbTY4a19vcGNvZGVzW2ldOwotCi0gICAgfQotCi0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpICZwcml2OwotICAvKiBUZWxsIG9iamR1bXAgdG8gdXNlIHR3byBieXRlcyBwZXIgY2h1bmsgYW5kIHNpeCBieXRlcyBwZXIgbGluZSBmb3IKLSAgICAgZGlzcGxheWluZyByYXcgZGF0YS4gICovCi0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDI7Ci0gIGluZm8tPmJ5dGVzX3Blcl9saW5lID0gNjsKLSAgaW5mby0+ZGlzcGxheV9lbmRpYW4gPSBCRkRfRU5ESUFOX0JJRzsKLSAgcHJpdi5tYXhfZmV0Y2hlZCA9IHByaXYudGhlX2J1ZmZlcjsKLSAgcHJpdi5pbnNuX3N0YXJ0ID0gbWVtYWRkcjsKLSAgaWYgKHNldGptcCAocHJpdi5iYWlsb3V0KSAhPSAwKQotICAgIC8qIEVycm9yIHJldHVybi4gICovCi0gICAgcmV0dXJuIC0xOwotCi0gIHN3aXRjaCAoaW5mby0+bWFjaCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICBhcmNoX21hc2sgPSAodW5zaWduZWQgaW50KSAtMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDAwOgotICAgICAgYXJjaF9tYXNrID0gbTY4MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwMDg6Ci0gICAgICBhcmNoX21hc2sgPSBtNjgwMDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAxMDoKLSAgICAgIGFyY2hfbWFzayA9IG02ODAxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDIwOgotICAgICAgYXJjaF9tYXNrID0gbTY4MDIwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwMzA6Ci0gICAgICBhcmNoX21hc2sgPSBtNjgwMzA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODA0MDoKLSAgICAgIGFyY2hfbWFzayA9IG02ODA0MDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDYwOgotICAgICAgYXJjaF9tYXNrID0gbTY4MDYwOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGFyY2hfbWFzayB8PSBtNjg4ODEgfCBtNjg4NTE7Ci0KLSAgYmVzdG1hc2sgPSAwOwotICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAyKTsKLSAgbWFqb3Jfb3Bjb2RlID0gKGJ1ZmZlclswXSA+PiA0KSAmIDE1OwotICBmb3IgKGkgPSAwOyBpIDwgbnVtb3Bjb2Rlc1ttYWpvcl9vcGNvZGVdOyBpKyspCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlICpvcGMgPSBvcGNvZGVzW21ham9yX29wY29kZV1baV07Ci0gICAgICB1bnNpZ25lZCBsb25nIG9wY29kZSA9IG9wYy0+b3Bjb2RlOwotICAgICAgdW5zaWduZWQgbG9uZyBtYXRjaCA9IG9wYy0+bWF0Y2g7Ci0KLSAgICAgIGlmICgoKDB4ZmYgJiBidWZmZXJbMF0gJiAobWF0Y2ggPj4gMjQpKSA9PSAoMHhmZiAmIChvcGNvZGUgPj4gMjQpKSkKLQkgICYmICgoMHhmZiAmIGJ1ZmZlclsxXSAmIChtYXRjaCA+PiAxNikpID09ICgweGZmICYgKG9wY29kZSA+PiAxNikpKQotCSAgLyogT25seSBmZXRjaCB0aGUgbmV4dCB0d28gYnl0ZXMgaWYgd2UgbmVlZCB0by4gICovCi0JICAmJiAoKCgweGZmZmYgJiBtYXRjaCkgPT0gMCkKLQkgICAgICB8fAotCSAgICAgIChGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyA0KQotCSAgICAgICAmJiAoKDB4ZmYgJiBidWZmZXJbMl0gJiAobWF0Y2ggPj4gOCkpID09ICgweGZmICYgKG9wY29kZSA+PiA4KSkpCi0JICAgICAgICYmICgoMHhmZiAmIGJ1ZmZlclszXSAmIG1hdGNoKSA9PSAoMHhmZiAmIG9wY29kZSkpKQotCSAgICAgICkKLQkgICYmIChvcGMtPmFyY2ggJiBhcmNoX21hc2spICE9IDApCi0JewotCSAgLyogRG9uJ3QgdXNlIGZvciBwcmludG91dCB0aGUgdmFyaWFudHMgb2YgZGl2dWwgYW5kIGRpdnNsCi0JICAgICB0aGF0IGhhdmUgdGhlIHNhbWUgcmVnaXN0ZXIgbnVtYmVyIGluIHR3byBwbGFjZXMuCi0JICAgICBUaGUgbW9yZSBnZW5lcmFsIHZhcmlhbnRzIHdpbGwgbWF0Y2ggaW5zdGVhZC4gICovCi0JICBmb3IgKGQgPSBvcGMtPmFyZ3M7ICpkOyBkICs9IDIpCi0JICAgIGlmIChkWzFdID09ICdEJykKLQkgICAgICBicmVhazsKLQotCSAgLyogRG9uJ3QgdXNlIGZvciBwcmludG91dCB0aGUgdmFyaWFudHMgb2YgbW9zdCBmbG9hdGluZwotCSAgICAgcG9pbnQgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIHdoaWNoIHVzZSB0aGUgc2FtZQotCSAgICAgcmVnaXN0ZXIgbnVtYmVyIGluIHR3byBwbGFjZXMsIGFzIGFib3ZlLiAqLwotCSAgaWYgKCpkID09ICdcMCcpCi0JICAgIGZvciAoZCA9IG9wYy0+YXJnczsgKmQ7IGQgKz0gMikKLQkgICAgICBpZiAoZFsxXSA9PSAndCcpCi0JCWJyZWFrOwotCi0JICAvKiBEb24ndCBtYXRjaCBmbW92ZWwgd2l0aCBtb3JlIHRoYW4gb25lIHJlZ2lzdGVyOyB3YWl0IGZvcgotICAgICAgICAgICAgIGZtb3ZlbWwuICAqLwotCSAgaWYgKCpkID09ICdcMCcpCi0JICAgIHsKLQkgICAgICBmb3IgKGQgPSBvcGMtPmFyZ3M7ICpkOyBkICs9IDIpCi0JCXsKLQkJICBpZiAoZFswXSA9PSAncycgJiYgZFsxXSA9PSAnOCcpCi0JCSAgICB7Ci0JCSAgICAgIGludCB2YWw7Ci0KLQkJICAgICAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIGRbMV0sIDMsIGluZm8pOwotCQkgICAgICBpZiAoKHZhbCAmICh2YWwgLSAxKSkgIT0gMCkKLQkJCWJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCpkID09ICdcMCcgJiYgbWF0Y2ggPiBiZXN0bWFzaykKLQkgICAgewotCSAgICAgIGJlc3QgPSBvcGM7Ci0JICAgICAgYmVzdG1hc2sgPSBtYXRjaDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGJlc3QgPT0gMCkKLSAgICBnb3RvIGludmFsaWQ7Ci0KLSAgLyogUG9pbnQgYXQgZmlyc3Qgd29yZCBvZiBhcmd1bWVudCBkYXRhLAotICAgICBhbmQgYXQgZGVzY3JpcHRvciBmb3IgZmlyc3QgYXJndW1lbnQuICAqLwotICBwID0gYnVmZmVyICsgMjsKLSAgCi0gIC8qIEZpZ3VyZSBvdXQgaG93IGxvbmcgdGhlIGZpeGVkLXNpemUgcG9ydGlvbiBvZiB0aGUgaW5zdHJ1Y3Rpb24gaXMuCi0gICAgIFRoZSBvbmx5IHBsYWNlIHRoaXMgaXMgc3RvcmVkIGluIHRoZSBvcGNvZGUgdGFibGUgaXMKLSAgICAgaW4gdGhlIGFyZ3VtZW50cy0tbG9vayBmb3IgYXJndW1lbnRzIHdoaWNoIHNwZWNpZnkgZmllbGRzIGluIHRoZSAybmQKLSAgICAgb3IgM3JkIHdvcmRzIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGZvciAoZCA9IGJlc3QtPmFyZ3M7ICpkOyBkICs9IDIpCi0gICAgewotICAgICAgLyogSSBkb24ndCB0aGluayBpdCBpcyBuZWNlc3NhcnkgdG8gYmUgY2hlY2tpbmcgZFswXSBoZXJlOyBJIHN1c3BlY3QKLQkgYWxsIHRoaXMgY291bGQgYmUgbW92ZWQgdG8gdGhlIGNhc2Ugc3RhdGVtZW50IGJlbG93LiAgKi8KLSAgICAgIGlmIChkWzBdID09ICcjJykKLQl7Ci0JICBpZiAoZFsxXSA9PSAnbCcgJiYgcCAtIGJ1ZmZlciA8IDYpCi0JICAgIHAgPSBidWZmZXIgKyA2OwotCSAgZWxzZSBpZiAocCAtIGJ1ZmZlciA8IDQgJiYgZFsxXSAhPSAnQycgJiYgZFsxXSAhPSAnOCcgKQotCSAgICBwID0gYnVmZmVyICsgNDsKLQl9Ci0gICAgICBpZiAoKGRbMF0gPT0gJ0wnIHx8IGRbMF0gPT0gJ2wnKSAmJiBkWzFdID09ICd3JyAmJiBwIC0gYnVmZmVyIDwgNCkKLQlwID0gYnVmZmVyICsgNDsKLSAgICAgIHN3aXRjaCAoZFsxXSkKLQl7Ci0JY2FzZSAnMSc6Ci0JY2FzZSAnMic6Ci0JY2FzZSAnMyc6Ci0JY2FzZSAnNyc6Ci0JY2FzZSAnOCc6Ci0JY2FzZSAnOSc6Ci0JY2FzZSAnaSc6Ci0JICBpZiAocCAtIGJ1ZmZlciA8IDQpCi0JICAgIHAgPSBidWZmZXIgKyA0OwotCSAgYnJlYWs7Ci0JY2FzZSAnNCc6Ci0JY2FzZSAnNSc6Ci0JY2FzZSAnNic6Ci0JICBpZiAocCAtIGJ1ZmZlciA8IDYpCi0JICAgIHAgPSBidWZmZXIgKyA2OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogcGZsdXNoYSBpcyBhbiBleGNlcHRpb25zLiAgSXQgdGFrZXMgbm8gYXJndW1lbnRzIGJ1dCBpcyB0d28gd29yZHMKLSAgICAgbG9uZy4gIFJlY29nbml6ZSBpdCBieSBsb29raW5nIGF0IHRoZSBsb3dlciAxNiBiaXRzIG9mIHRoZSBtYXNrLiAgKi8KLSAgaWYgKHAgLSBidWZmZXIgPCA0ICYmIChiZXN0LT5tYXRjaCAmIDB4RkZGRikgIT0gMCkKLSAgICBwID0gYnVmZmVyICsgNDsKLQotICAvKiBscHN0b3AgaXMgYW5vdGhlciBleGNlcHRpb24uICBJdCB0YWtlcyBhIG9uZSB3b3JkIGFyZ3VtZW50IGJ1dCBpcwotICAgICB0aHJlZSB3b3JkcyBsb25nLiAgKi8KLSAgaWYgKHAgLSBidWZmZXIgPCA2Ci0gICAgICAmJiAoYmVzdC0+bWF0Y2ggJiAweGZmZmYpID09IDB4ZmZmZgotICAgICAgJiYgYmVzdC0+YXJnc1swXSA9PSAnIycKLSAgICAgICYmIGJlc3QtPmFyZ3NbMV0gPT0gJ3cnKQotICAgIHsKLSAgICAgIC8qIENvcHkgdGhlIG9uZSB3b3JkIGFyZ3VtZW50IGludG8gdGhlIHVzdWFsIGxvY2F0aW9uIGZvciBhIG9uZQotCSB3b3JkIGFyZ3VtZW50LCB0byBzaW1wbGlmeSBwcmludGluZyBpdC4gIFdlIGNhbiBnZXQgYXdheSB3aXRoCi0JIHRoaXMgYmVjYXVzZSB3ZSBrbm93IGV4YWN0bHkgd2hhdCB0aGUgc2Vjb25kIHdvcmQgaXMsIGFuZCB3ZQotCSBhcmVuJ3QgZ29pbmcgdG8gcHJpbnQgYW55dGhpbmcgYmFzZWQgb24gaXQuICAqLwotICAgICAgcCA9IGJ1ZmZlciArIDY7Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBwKTsKLSAgICAgIGJ1ZmZlclsyXSA9IGJ1ZmZlcls0XTsKLSAgICAgIGJ1ZmZlclszXSA9IGJ1ZmZlcls1XTsKLSAgICB9Ci0KLSAgRkVUQ0hfREFUQSAoaW5mbywgcCk7Ci0gIAotICBkID0gYmVzdC0+YXJnczsKLQotICAvKiBXZSBjYW4gdGhlIG9wZXJhbmRzIHR3aWNlLiAgVGhlIGZpcnN0IHRpbWUgd2UgZG9uJ3QgcHJpbnQgYW55dGhpbmcsCi0gICAgIGJ1dCBsb29rIGZvciBlcnJvcnMuICovCi0KLSAgc2F2ZV9wID0gcDsKLSAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jID0gZHVtbXlfcHJpbnRfYWRkcmVzczsKLSAgaW5mby0+ZnByaW50Zl9mdW5jID0gKGZwcmludGZfZnR5cGUpZHVtbXlfcHJpbnRlcjsKLSAgZm9yICggOyAqZDsgZCArPSAyKQotICAgIHsKLSAgICAgIGludCBlYXRlbiA9IHByaW50X2luc25fYXJnIChkLCBidWZmZXIsIHAsIG1lbWFkZHIgKyAocCAtIGJ1ZmZlciksIGluZm8pOwotICAgICAgaWYgKGVhdGVuID49IDApCi0JcCArPSBlYXRlbjsKLSAgICAgIGVsc2UgaWYgKGVhdGVuID09IC0xKQotCWdvdG8gaW52YWxpZDsKLSAgICAgIGVsc2UKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykoaW5mby0+c3RyZWFtLAotCQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQkJXygiPGludGVybmFsIGVycm9yIGluIG9wY29kZSB0YWJsZTogJXMgJXM+XG4iKSwKLQkJCQliZXN0LT5uYW1lLAotCQkJCWJlc3QtPmFyZ3MpOwotCSAgZ290byBpbnZhbGlkOwotCX0KLQotICAgIH0KLSAgcCA9IHNhdmVfcDsKLSAgaW5mby0+ZnByaW50Zl9mdW5jID0gc2F2ZV9wcmludGVyOwotICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgPSBzYXZlX3ByaW50X2FkZHJlc3M7Ci0KLSAgZCA9IGJlc3QtPmFyZ3M7Ci0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGJlc3QtPm5hbWUpOwotCi0gIGlmICgqZCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQotICB3aGlsZSAoKmQpCi0gICAgewotICAgICAgcCArPSBwcmludF9pbnNuX2FyZyAoZCwgYnVmZmVyLCBwLCBtZW1hZGRyICsgKHAgLSBidWZmZXIpLCBpbmZvKTsKLSAgICAgIGQgKz0gMjsKLSAgICAgIGlmICgqZCAmJiAqKGQgLSAyKSAhPSAnSScgJiYgKmQgIT0gJ2snKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotICAgIH0KLSAgcmV0dXJuIHAgLSBidWZmZXI7Ci0KLSBpbnZhbGlkOgotICAvKiBIYW5kbGUgdW5kZWZpbmVkIGluc3RydWN0aW9ucy4gICovCi0gIGluZm8tPmZwcmludGZfZnVuYyA9IHNhdmVfcHJpbnRlcjsKLSAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jID0gc2F2ZV9wcmludF9hZGRyZXNzOwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjAlbyIsCi0JCQkgKGJ1ZmZlclswXSA8PCA4KSArIGJ1ZmZlclsxXSk7Ci0gIHJldHVybiAyOwotfQotCi0vKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyAiZWF0ZW4iIGJ5IHRoZSBvcGVyYW5kLCBvcgotICAgcmV0dXJuIC0xIGlmIGFuIGludmFsaWQgb3BlcmFuZCB3YXMgZm91bmQsIG9yIC0yIGlmCi0gICBhbiBvcGNvZGUgdGFiZSBlcnJvciB3YXMgZm91bmQuICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fYXJnIChkLCBidWZmZXIsIHAwLCBhZGRyLCBpbmZvKQotICAgICBjb25zdCBjaGFyICpkOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnAwOwotICAgICBiZmRfdm1hIGFkZHI7CQkvKiBQQyBmb3IgdGhpcyBhcmcgdG8gYmUgcmVsYXRpdmUgdG8gKi8KLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmVnaXN0ZXIgaW50IHZhbCA9IDA7Ci0gIHJlZ2lzdGVyIGludCBwbGFjZSA9IGRbMV07Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnAgPSBwMDsKLSAgaW50IHJlZ25vOwotICByZWdpc3RlciBDT05TVCBjaGFyICpyZWduYW1lOwotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwMTsKLSAgZG91YmxlIGZsdmFsOwotICBpbnQgZmx0X3A7Ci0gIGJmZF9zaWduZWRfdm1hIGRpc3A7Ci0gIHVuc2lnbmVkIGludCB1dmFsOwotCi0gIHN3aXRjaCAoKmQpCi0gICAgewotICAgIGNhc2UgJ2MnOgkJLyogY2FjaGUgaWRlbnRpZmllciAqLwotICAgICAgewotICAgICAgICBzdGF0aWMgY2hhciAqY29uc3QgY2FjaGVGaWVsZE5hbWVbXSA9IHsgIm5jIiwgImRjIiwgImljIiwgImJjIiB9OwotICAgICAgICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDIsIGluZm8pOwotICAgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgY2FjaGVGaWVsZE5hbWVbdmFsXSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSAnYSc6CQkvKiBhZGRyZXNzIHJlZ2lzdGVyIGluZGlyZWN0IG9ubHkuIENmLiBjYXNlICcrJy4gKi8KLSAgICAgIHsKLSAgICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JICAoaW5mby0+c3RyZWFtLAotCSAgICIlc0AiLAotCSAgIHJlZ19uYW1lcyBbZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKSArIDhdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlICdfJzoJCS8qIDMyLWJpdCBhYnNvbHV0ZSBhZGRyZXNzIGZvciBtb3ZlMTYuICovCi0gICAgICB7Ci0gICAgICAgIHV2YWwgPSBORVhUVUxPTkcgKHApOwotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodXZhbCwgaW5mbyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSAnQyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlY2NyIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1MnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXNyIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1UnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXVzcCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdKJzoKLSAgICAgIHsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHsgY2hhciAqbmFtZTsgaW50IHZhbHVlOyB9IG5hbWVzW10KLQkgID0ge3siJXNmYyIsIDB4MDAwfSwgeyIlZGZjIiwgMHgwMDF9LCB7IiVjYWNyIiwgMHgwMDJ9LAotCSAgICAgeyIldGMiLCAgMHgwMDN9LCB7IiVpdHQwIiwweDAwNH0sIHsiJWl0dDEiLCAweDAwNX0sCi0gICAgICAgICAgICAgeyIlZHR0MCIsMHgwMDZ9LCB7IiVkdHQxIiwweDAwN30sIHsiJWJ1c2NyIiwweDAwOH0sCi0JICAgICB7IiV1c3AiLCAweDgwMH0sIHsiJXZiciIsIDB4ODAxfSwgeyIlY2FhciIsIDB4ODAyfSwKLQkgICAgIHsiJW1zcCIsIDB4ODAzfSwgeyIlaXNwIiwgMHg4MDR9LAotCi0JICAgICAvKiBTaG91bGQgd2UgYmUgY2FsbGluZyB0aGlzIHBzciBsaWtlIHdlIGRvIGluIGNhc2UgJ1knPyAgKi8KLQkgICAgIHsiJW1tdXNyIiwweDgwNX0sCi0KLSAgICAgICAgICAgICB7IiV1cnAiLCAweDgwNn0sIHsiJXNycCIsIDB4ODA3fSwgeyIlcGNyIiwgMHg4MDh9fTsKLQotCXZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMTIsIGluZm8pOwotCWZvciAocmVnbm8gPSBzaXplb2YgbmFtZXMgLyBzaXplb2YgbmFtZXNbMF0gLSAxOyByZWdubyA+PSAwOyByZWduby0tKQotCSAgaWYgKG5hbWVzW3JlZ25vXS52YWx1ZSA9PSB2YWwpCi0JICAgIHsKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgbmFtZXNbcmVnbm9dLm5hbWUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JaWYgKHJlZ25vIDwgMCkKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCB2YWwpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdRJzoKLSAgICAgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbyk7Ci0gICAgICAvKiAwIG1lYW5zIDgsIGV4Y2VwdCBmb3IgdGhlIGJrcHQgaW5zdHJ1Y3Rpb24uLi4gKi8KLSAgICAgIGlmICh2YWwgPT0gMCAmJiBkWzFdICE9ICdzJykKLQl2YWwgPSA4OwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjJWQiLCB2YWwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdNJzoKLSAgICAgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgOCwgaW5mbyk7Ci0gICAgICBpZiAodmFsICYgMHg4MCkKLQl2YWwgPSB2YWwgLSAweDEwMDsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyVkIiwgdmFsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDQsIGluZm8pOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjJWQiLCB2YWwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdEJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLAotCQkJICAgICByZWdfbmFtZXNbZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdBJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCShpbmZvLT5zdHJlYW0sICIlcyIsCi0JIHJlZ19uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pICsgMDEwXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1InOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JKGluZm8tPnN0cmVhbSwgIiVzIiwKLQkgcmVnX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNCwgaW5mbyldKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncic6Ci0gICAgICByZWdubyA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNCwgaW5mbyk7Ci0gICAgICBpZiAocmVnbm8gPiA3KQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNAIiwgcmVnX25hbWVzW3JlZ25vXSk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJAKCVzKSIsIHJlZ19uYW1lc1tyZWdub10pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdGJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCShpbmZvLT5zdHJlYW0sICIlJWZwJWQiLAotCSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTyc6Ci0gICAgICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDYsIGluZm8pOwotICAgICAgaWYgKHZhbCAmIDB4MjApCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHJlZ19uYW1lcyBbdmFsICYgN10pOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCB2YWwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcrJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCShpbmZvLT5zdHJlYW0sICIlc0ArIiwKLQkgcmVnX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbykgKyA4XSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJy0nOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JKGluZm8tPnN0cmVhbSwgIiVzQC0iLAotCSByZWdfbmFtZXNbZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKSArIDhdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnayc6Ci0gICAgICBpZiAocGxhY2UgPT0gJ2snKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKQotCSAgKGluZm8tPnN0cmVhbSwgInslc30iLAotCSAgIHJlZ19uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pXSk7Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAnQycpCi0JewotCSAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA3LCBpbmZvKTsKLQkgIGlmICggdmFsID4gNjMgKQkJLyogVGhpcyBpcyBhIHNpZ25lZCBjb25zdGFudC4gKi8KLQkgICAgdmFsIC09IDEyODsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAieyMlZH0iLCB2YWwpOwotCX0KLSAgICAgIGVsc2UKLQlyZXR1cm4gLTI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyMnOgotICAgIGNhc2UgJ14nOgotICAgICAgcDEgPSBidWZmZXIgKyAoKmQgPT0gJyMnID8gMiA6IDQpOwotICAgICAgaWYgKHBsYWNlID09ICdzJykKLQl2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDQsIGluZm8pOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ0MnKQotCXZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNywgaW5mbyk7Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAnOCcpCi0JdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICczJykKLQl2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDgsIGluZm8pOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ2InKQotCXZhbCA9IE5FWFRCWVRFIChwMSk7Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAndycgfHwgcGxhY2UgPT0gJ1cnKQotCXZhbCA9IE5FWFRXT1JEIChwMSk7Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAnbCcpCi0JdmFsID0gTkVYVExPTkcgKHAxKTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gLTI7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMlZCIsIHZhbCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0InOgotICAgICAgaWYgKHBsYWNlID09ICdiJykKLQlkaXNwID0gTkVYVEJZVEUgKHApOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ0InKQotCWRpc3AgPSBDT0VSQ0VfU0lHTkVEX0NIQVIoYnVmZmVyWzFdKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICd3JyB8fCBwbGFjZSA9PSAnVycpCi0JZGlzcCA9IE5FWFRXT1JEIChwKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdsJyB8fCBwbGFjZSA9PSAnTCcgfHwgcGxhY2UgPT0gJ0MnKQotCWRpc3AgPSBORVhUTE9ORyAocCk7Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAnZycpCi0JewotCSAgZGlzcCA9IE5FWFRCWVRFIChidWZmZXIpOwotCSAgaWYgKGRpc3AgPT0gMCkKLQkgICAgZGlzcCA9IE5FWFRXT1JEIChwKTsKLQkgIGVsc2UgaWYgKGRpc3AgPT0gLTEpCi0JICAgIGRpc3AgPSBORVhUTE9ORyAocCk7Ci0JfQotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ2MnKQotCXsKLQkgIGlmIChidWZmZXJbMV0gJiAweDQwKQkJLyogSWYgYml0IHNpeCBpcyBvbmUsIGxvbmcgb2Zmc2V0ICovCi0JICAgIGRpc3AgPSBORVhUTE9ORyAocCk7Ci0JICBlbHNlCi0JICAgIGRpc3AgPSBORVhUV09SRCAocCk7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiAtMjsKLQotICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhZGRyICsgZGlzcCwgaW5mbyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgdmFsID0gTkVYVFdPUkQgKHApOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JKGluZm8tPnN0cmVhbSwgIiVzQCglZCkiLAotCSByZWdfbmFtZXNbZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKSArIDhdLCB2YWwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLAotCQkJICAgICBmcGNyX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbyldKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSSc6Ci0gICAgICAvKiBHZXQgY29wcm9jZXNzb3IgSUQuLi4gKi8KLSAgICAgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCAnZCcsIDMsIGluZm8pOwotICAgICAgCi0gICAgICBpZiAodmFsICE9IDEpCQkJCS8qIFVudXN1YWwgY29wcm9jZXNzb3IgSUQ/ICovCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoY3BpZD0lZCkgIiwgdmFsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnKic6Ci0gICAgY2FzZSAnfic6Ci0gICAgY2FzZSAnJSc6Ci0gICAgY2FzZSAnOyc6Ci0gICAgY2FzZSAnQCc6Ci0gICAgY2FzZSAnISc6Ci0gICAgY2FzZSAnJCc6Ci0gICAgY2FzZSAnPyc6Ci0gICAgY2FzZSAnLyc6Ci0gICAgY2FzZSAnJic6Ci0gICAgY2FzZSAnfCc6Ci0gICAgY2FzZSAnPCc6Ci0gICAgY2FzZSAnPic6Ci0gICAgY2FzZSAnbSc6Ci0gICAgY2FzZSAnbic6Ci0gICAgY2FzZSAnbyc6Ci0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAncSc6Ci0gICAgY2FzZSAndic6Ci0KLSAgICAgIGlmIChwbGFjZSA9PSAnZCcpCi0JewotCSAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsICd4JywgNiwgaW5mbyk7Ci0JICB2YWwgPSAoKHZhbCAmIDcpIDw8IDMpICsgKCh2YWwgPj4gMykgJiA3KTsKLQl9Ci0gICAgICBlbHNlCi0JdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsICdzJywgNiwgaW5mbyk7Ci0KLSAgICAgIC8qIEdldCByZWdpc3RlciBudW1iZXIgYXNzdW1pbmcgYWRkcmVzcyByZWdpc3Rlci4gICovCi0gICAgICByZWdubyA9ICh2YWwgJiA3KSArIDg7Ci0gICAgICByZWduYW1lID0gcmVnX25hbWVzW3JlZ25vXTsKLSAgICAgIHN3aXRjaCAodmFsID4+IDMpCi0JewotCWNhc2UgMDoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCByZWdfbmFtZXNbdmFsXSk7Ci0JICBicmVhazsKLQotCWNhc2UgMToKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCByZWduYW1lKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAyOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc0AiLCByZWduYW1lKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAzOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc0ArIiwgcmVnbmFtZSk7Ci0JICBicmVhazsKLQotCWNhc2UgNDoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNALSIsIHJlZ25hbWUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIDU6Ci0JICB2YWwgPSBORVhUV09SRCAocCk7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzQCglZCkiLCByZWduYW1lLCB2YWwpOwotCSAgYnJlYWs7Ci0KLQljYXNlIDY6Ci0JICBwID0gcHJpbnRfaW5kZXhlZCAocmVnbm8sIHAsIGFkZHIsIGluZm8pOwotCSAgYnJlYWs7Ci0KLQljYXNlIDc6Ci0JICBzd2l0Y2ggKHZhbCAmIDcpCi0JICAgIHsKLQkgICAgY2FzZSAwOgotCSAgICAgIHZhbCA9IE5FWFRXT1JEIChwKTsKLQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbCwgaW5mbyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAxOgotCSAgICAgIHV2YWwgPSBORVhUVUxPTkcgKHApOwotCSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodXZhbCwgaW5mbyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAyOgotCSAgICAgIHZhbCA9IE5FWFRXT1JEIChwKTsKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlcGNAKCIpOwotCSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYWRkciArIHZhbCwgaW5mbyk7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAzOgotCSAgICAgIHAgPSBwcmludF9pbmRleGVkICgtMSwgcCwgYWRkciwgaW5mbyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSA0OgotCSAgICAgIGZsdF9wID0gMTsJLyogQXNzdW1lIGl0J3MgYSBmbG9hdC4uLiAqLwotCSAgICAgIHN3aXRjaCggcGxhY2UgKQotCSAgICAgIHsKLQkJY2FzZSAnYic6Ci0JCSAgdmFsID0gTkVYVEJZVEUgKHApOwotCQkgIGZsdF9wID0gMDsKLQkJICBicmVhazsKLQotCQljYXNlICd3JzoKLQkJICB2YWwgPSBORVhUV09SRCAocCk7Ci0JCSAgZmx0X3AgPSAwOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2wnOgotCQkgIHZhbCA9IE5FWFRMT05HIChwKTsKLQkJICBmbHRfcCA9IDA7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnZic6Ci0JCSAgTkVYVFNJTkdMRShmbHZhbCwgcCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnRic6Ci0JCSAgTkVYVERPVUJMRShmbHZhbCwgcCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAneCc6Ci0JCSAgTkVYVEVYVEVORChmbHZhbCwgcCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAncCc6Ci0JCSAgZmx2YWwgPSBORVhUUEFDS0VEKHApOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgcmV0dXJuIC0xOwotCSAgICAgIH0KLQkgICAgICBpZiAoIGZsdF9wICkJLyogUHJpbnQgYSBmbG9hdD8gKi8KLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjJWciLCBmbHZhbCk7Ci0JICAgICAgZWxzZQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMlZCIsIHZhbCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0wnOgotICAgIGNhc2UgJ2wnOgotCWlmIChwbGFjZSA9PSAndycpCi0JICB7Ci0JICAgIGNoYXIgZG9uZWFueTsKLQkgICAgcDEgPSBidWZmZXIgKyAyOwotCSAgICB2YWwgPSBORVhUV09SRCAocDEpOwotCSAgICAvKiBNb3ZlIHRoZSBwb2ludGVyIGFoZWFkIGlmIHRoaXMgcG9pbnQgaXMgZmFydGhlciBhaGVhZAotCSAgICAgICB0aGFuIHRoZSBsYXN0LiAgKi8KLQkgICAgcCA9IHAxID4gcCA/IHAxIDogcDsKLQkgICAgaWYgKHZhbCA9PSAwKQotCSAgICAgIHsKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjMCIpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGlmICgqZCA9PSAnbCcpCi0JICAgICAgewotCQlyZWdpc3RlciBpbnQgbmV3dmFsID0gMDsKLQkJZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgMTY7ICsrcmVnbm8pCi0JCSAgaWYgKHZhbCAmICgweDgwMDAgPj4gcmVnbm8pKQotCQkgICAgbmV3dmFsIHw9IDEgPDwgcmVnbm87Ci0JCXZhbCA9IG5ld3ZhbDsKLQkgICAgICB9Ci0JICAgIHZhbCAmPSAweGZmZmY7Ci0JICAgIGRvbmVhbnkgPSAwOwotCSAgICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCAxNjsgKytyZWdubykKLQkgICAgICBpZiAodmFsICYgKDEgPDwgcmVnbm8pKQotCQl7Ci0JCSAgaW50IGZpcnN0X3JlZ25vOwotCQkgIGlmIChkb25lYW55KQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIvIik7Ci0JCSAgZG9uZWFueSA9IDE7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHJlZ19uYW1lc1tyZWdub10pOwotCQkgIGZpcnN0X3JlZ25vID0gcmVnbm87Ci0JCSAgd2hpbGUgKHZhbCAmICgxIDw8IChyZWdubyArIDEpKSkKLQkJICAgICsrcmVnbm87Ci0JCSAgaWYgKHJlZ25vID4gZmlyc3RfcmVnbm8pCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0lcyIsCi0JCQkJCSAgIHJlZ19uYW1lc1tyZWdub10pOwotCQl9Ci0JICB9Ci0JZWxzZSBpZiAocGxhY2UgPT0gJzMnKQotCSAgewotCSAgICAvKiBgZm1vdmVtJyBpbnNuLiAgKi8KLQkgICAgY2hhciBkb25lYW55OwotCSAgICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDgsIGluZm8pOwotCSAgICBpZiAodmFsID09IDApCi0JICAgICAgewotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMwIik7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgaWYgKCpkID09ICdsJykKLQkgICAgICB7Ci0JCXJlZ2lzdGVyIGludCBuZXd2YWwgPSAwOwotCQlmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCA4OyArK3JlZ25vKQotCQkgIGlmICh2YWwgJiAoMHg4MCA+PiByZWdubykpCi0JCSAgICBuZXd2YWwgfD0gMSA8PCByZWdubzsKLQkJdmFsID0gbmV3dmFsOwotCSAgICAgIH0KLQkgICAgdmFsICY9IDB4ZmY7Ci0JICAgIGRvbmVhbnkgPSAwOwotCSAgICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCA4OyArK3JlZ25vKQotCSAgICAgIGlmICh2YWwgJiAoMSA8PCByZWdubykpCi0JCXsKLQkJICBpbnQgZmlyc3RfcmVnbm87Ci0JCSAgaWYgKGRvbmVhbnkpCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi8iKTsKLQkJICBkb25lYW55ID0gMTsKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlZnAlZCIsIHJlZ25vKTsKLQkJICBmaXJzdF9yZWdubyA9IHJlZ25vOwotCQkgIHdoaWxlICh2YWwgJiAoMSA8PCAocmVnbm8gKyAxKSkpCi0JCSAgICArK3JlZ25vOwotCQkgIGlmIChyZWdubyA+IGZpcnN0X3JlZ25vKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItJSVmcCVkIiwgcmVnbm8pOwotCQl9Ci0JICB9Ci0JZWxzZSBpZiAocGxhY2UgPT0gJzgnKQotCSAgewotCSAgICAvKiBmbW92ZW1sIGZvciBGUCBzdGF0dXMgcmVnaXN0ZXJzICovCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLAotCQkJCSAgIGZwY3JfbmFtZXNbZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLAotCQkJCQkJCSBpbmZvKV0pOwotCSAgfQotCWVsc2UKLQkgIHJldHVybiAtMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnWCc6Ci0gICAgICBwbGFjZSA9ICc4JzsKLSAgICBjYXNlICdZJzoKLSAgICBjYXNlICdaJzoKLSAgICBjYXNlICdXJzoKLSAgICBjYXNlICcwJzoKLSAgICBjYXNlICcxJzoKLSAgICBjYXNlICcyJzoKLSAgICBjYXNlICczJzoKLSAgICAgIHsKLQlpbnQgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA1LCBpbmZvKTsKLQljaGFyICpuYW1lID0gMDsKLQlzd2l0Y2ggKHZhbCkKLQkgIHsKLQkgIGNhc2UgMjogbmFtZSA9ICIldHQwIjsgYnJlYWs7Ci0JICBjYXNlIDM6IG5hbWUgPSAiJXR0MSI7IGJyZWFrOwotCSAgY2FzZSAweDEwOiBuYW1lID0gIiV0YyI7IGJyZWFrOwotCSAgY2FzZSAweDExOiBuYW1lID0gIiVkcnAiOyBicmVhazsKLQkgIGNhc2UgMHgxMjogbmFtZSA9ICIlc3JwIjsgYnJlYWs7Ci0JICBjYXNlIDB4MTM6IG5hbWUgPSAiJWNycCI7IGJyZWFrOwotCSAgY2FzZSAweDE0OiBuYW1lID0gIiVjYWwiOyBicmVhazsKLQkgIGNhc2UgMHgxNTogbmFtZSA9ICIldmFsIjsgYnJlYWs7Ci0JICBjYXNlIDB4MTY6IG5hbWUgPSAiJXNjYyI7IGJyZWFrOwotCSAgY2FzZSAweDE3OiBuYW1lID0gIiVhYyI7IGJyZWFrOwotIAkgIGNhc2UgMHgxODogbmFtZSA9ICIlcHNyIjsgYnJlYWs7Ci0JICBjYXNlIDB4MTk6IG5hbWUgPSAiJXBjc3IiOyBicmVhazsKLQkgIGNhc2UgMHgxYzoKLQkgIGNhc2UgMHgxZDoKLQkgICAgewotCSAgICAgIGludCBicmVha19yZWcgPSAoKGJ1ZmZlclszXSA+PiAyKSAmIDcpOwotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkoaW5mby0+c3RyZWFtLCB2YWwgPT0gMHgxYyA/ICIlJWJhZCVkIiA6ICIlJWJhYyVkIiwKLQkJIGJyZWFrX3JlZyk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjxtbXUgcmVnaXN0ZXIgJWQ+IiwgdmFsKTsKLQkgIH0KLQlpZiAobmFtZSkKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBuYW1lKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZic6Ci0gICAgICB7Ci0JaW50IGZjID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA1LCBpbmZvKTsKLQlpZiAoZmMgPT0gMSkKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVkZmMiKTsKLQllbHNlIGlmIChmYyA9PSAwKQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXNmYyIpOwotCWVsc2UKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgXygiPGZ1bmN0aW9uIGNvZGUgJWQ+IiksIGZjKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUldmFsIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3QnOgotICAgICAgewotCWludCBsZXZlbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbyk7Ci0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGxldmVsKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAtMjsKLSAgICB9Ci0KLSAgcmV0dXJuIHAgLSBwMDsKLX0KLQotLyogRmV0Y2ggQklUUyBiaXRzIGZyb20gYSBwb3NpdGlvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVkIGJ5IENPREUuCi0gICBDT0RFIGlzIGEgInBsYWNlIHRvIHB1dCBhbiBhcmd1bWVudCIsIG9yICd4JyBmb3IgYSBkZXN0aW5hdGlvbgotICAgdGhhdCBpcyBhIGdlbmVyYWwgYWRkcmVzcyAobW9kZSBhbmQgcmVnaXN0ZXIpLgotICAgQlVGRkVSIGNvbnRhaW5zIHRoZSBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLWZldGNoX2FyZyAoYnVmZmVyLCBjb2RlLCBiaXRzLCBpbmZvKQotICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0gICAgIGludCBjb2RlOwotICAgICBpbnQgYml0czsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmVnaXN0ZXIgaW50IHZhbCA9IDA7Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSAncyc6Ci0gICAgICB2YWwgPSBidWZmZXJbMV07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgkJCS8qIERlc3RpbmF0aW9uLCBmb3IgcmVnaXN0ZXIgb3IgcXVpY2suICAqLwotICAgICAgdmFsID0gKGJ1ZmZlclswXSA8PCA4KSArIGJ1ZmZlclsxXTsKLSAgICAgIHZhbCA+Pj0gOTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6CQkJLyogRGVzdGluYXRpb24sIGZvciBnZW5lcmFsIGFyZyAqLwotICAgICAgdmFsID0gKGJ1ZmZlclswXSA8PCA4KSArIGJ1ZmZlclsxXTsKLSAgICAgIHZhbCA+Pj0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnayc6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAzKTsKLSAgICAgIHZhbCA9IChidWZmZXJbM10gPj4gNCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0MnOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSBidWZmZXJbM107Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzEnOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOwotICAgICAgdmFsID4+PSAxMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMic6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAzKTsKLSAgICAgIHZhbCA9IChidWZmZXJbMl0gPDwgOCkgKyBidWZmZXJbM107Ci0gICAgICB2YWwgPj49IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzMnOgotICAgIGNhc2UgJ2onOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc0JzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDUpOwotICAgICAgdmFsID0gKGJ1ZmZlcls0XSA8PCA4KSArIGJ1ZmZlcls1XTsKLSAgICAgIHZhbCA+Pj0gMTI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzUnOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgNSk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzRdIDw8IDgpICsgYnVmZmVyWzVdOwotICAgICAgdmFsID4+PSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc2JzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDUpOwotICAgICAgdmFsID0gKGJ1ZmZlcls0XSA8PCA4KSArIGJ1ZmZlcls1XTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnNyc6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAzKTsKLSAgICAgIHZhbCA9IChidWZmZXJbMl0gPDwgOCkgKyBidWZmZXJbM107Ci0gICAgICB2YWwgPj49IDc7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgJzgnOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOwotICAgICAgdmFsID4+PSAxMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnOSc6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAzKTsKLSAgICAgIHZhbCA9IChidWZmZXJbMl0gPDwgOCkgKyBidWZmZXJbM107Ci0gICAgICB2YWwgPj49IDU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2UnOgotICAgICAgdmFsID0gKGJ1ZmZlclsxXSA+PiA2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBzd2l0Y2ggKGJpdHMpCi0gICAgewotICAgIGNhc2UgMjoKLSAgICAgIHJldHVybiB2YWwgJiAzOwotICAgIGNhc2UgMzoKLSAgICAgIHJldHVybiB2YWwgJiA3OwotICAgIGNhc2UgNDoKLSAgICAgIHJldHVybiB2YWwgJiAwMTc7Ci0gICAgY2FzZSA1OgotICAgICAgcmV0dXJuIHZhbCAmIDAzNzsKLSAgICBjYXNlIDY6Ci0gICAgICByZXR1cm4gdmFsICYgMDc3OwotICAgIGNhc2UgNzoKLSAgICAgIHJldHVybiB2YWwgJiAwMTc3OwotICAgIGNhc2UgODoKLSAgICAgIHJldHVybiB2YWwgJiAwMzc3OwotICAgIGNhc2UgMTI6Ci0gICAgICByZXR1cm4gdmFsICYgMDc3Nzc7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotLyogUHJpbnQgYW4gaW5kZXhlZCBhcmd1bWVudC4gIFRoZSBiYXNlIHJlZ2lzdGVyIGlzIEJBU0VSRUcgKC0xIGZvciBwYykuCi0gICBQIHBvaW50cyB0byBleHRlbnNpb24gd29yZCwgaW4gYnVmZmVyLgotICAgQUREUiBpcyB0aGUgbm9taW5hbCBjb3JlIGFkZHJlc3Mgb2YgdGhhdCBleHRlbnNpb24gd29yZC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXByaW50X2luZGV4ZWQgKGJhc2VyZWcsIHAsIGFkZHIsIGluZm8pCi0gICAgIGludCBiYXNlcmVnOwotICAgICB1bnNpZ25lZCBjaGFyICpwOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJlZ2lzdGVyIGludCB3b3JkOwotICBzdGF0aWMgY2hhciAqY29uc3Qgc2NhbGVzW10gPSB7IiIsICI6MiIsICI6NCIsICI6OCJ9OwotICBiZmRfdm1hIGJhc2VfZGlzcDsKLSAgYmZkX3ZtYSBvdXRlcl9kaXNwOwotICBjaGFyIGJ1Zls0MF07Ci0gIGNoYXIgdm1hYnVmWzUwXTsKLQotICB3b3JkID0gTkVYVFdPUkQgKHApOwotCi0gIC8qIEdlbmVyYXRlIHRoZSB0ZXh0IGZvciB0aGUgaW5kZXggcmVnaXN0ZXIuCi0gICAgIFdoZXJlIHRoaXMgd2lsbCBiZSBvdXRwdXQgaXMgbm90IHlldCBkZXRlcm1pbmVkLiAgKi8KLSAgc3ByaW50ZiAoYnVmLCAiJXM6JWMlcyIsCi0JICAgcmVnX25hbWVzWyh3b3JkID4+IDEyKSAmIDB4Zl0sCi0JICAgKHdvcmQgJiAweDgwMCkgPyAnbCcgOiAndycsCi0JICAgc2NhbGVzWyh3b3JkID4+IDkpICYgM10pOwotCi0gIC8qIEhhbmRsZSB0aGUgNjgwMDAgc3R5bGUgb2YgaW5kZXhpbmcuICAqLwotCi0gIGlmICgod29yZCAmIDB4MTAwKSA9PSAwKQotICAgIHsKLSAgICAgIGJhc2VfZGlzcCA9IHdvcmQgJiAweGZmOwotICAgICAgaWYgKChiYXNlX2Rpc3AgJiAweDgwKSAhPSAwKQotCWJhc2VfZGlzcCAtPSAweDEwMDsKLSAgICAgIGlmIChiYXNlcmVnID09IC0xKQotCWJhc2VfZGlzcCArPSBhZGRyOwotICAgICAgcHJpbnRfYmFzZSAoYmFzZXJlZywgYmFzZV9kaXNwLCBpbmZvKTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVzKSIsIGJ1Zik7Ci0gICAgICByZXR1cm4gcDsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBnZW5lcmFsaXplZCBraW5kLiAgKi8KLSAgLyogRmlyc3QsIGNvbXB1dGUgdGhlIGRpc3BsYWNlbWVudCB0byBhZGQgdG8gdGhlIGJhc2UgcmVnaXN0ZXIuICAqLwotCi0gIGlmICh3b3JkICYgMDIwMCkKLSAgICB7Ci0gICAgICBpZiAoYmFzZXJlZyA9PSAtMSkKLQliYXNlcmVnID0gLTM7Ci0gICAgICBlbHNlCi0JYmFzZXJlZyA9IC0yOwotICAgIH0KLSAgaWYgKHdvcmQgJiAwMTAwKQotICAgIGJ1ZlswXSA9ICdcMCc7Ci0gIGJhc2VfZGlzcCA9IDA7Ci0gIHN3aXRjaCAoKHdvcmQgPj4gNCkgJiAzKQotICAgIHsKLSAgICBjYXNlIDI6Ci0gICAgICBiYXNlX2Rpc3AgPSBORVhUV09SRCAocCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBiYXNlX2Rpc3AgPSBORVhUTE9ORyAocCk7Ci0gICAgfQotICBpZiAoYmFzZXJlZyA9PSAtMSkKLSAgICBiYXNlX2Rpc3AgKz0gYWRkcjsKLQotICAvKiBIYW5kbGUgc2luZ2xlLWxldmVsIGNhc2UgKG5vdCBpbmRpcmVjdCkgKi8KLQotICBpZiAoKHdvcmQgJiA3KSA9PSAwKQotICAgIHsKLSAgICAgIHByaW50X2Jhc2UgKGJhc2VyZWcsIGJhc2VfZGlzcCwgaW5mbyk7Ci0gICAgICBpZiAoYnVmWzBdICE9ICdcMCcpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsJXMiLCBidWYpOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7Ci0gICAgICByZXR1cm4gcDsKLSAgICB9Ci0KLSAgLyogVHdvIGxldmVsLiAgQ29tcHV0ZSBkaXNwbGFjZW1lbnQgdG8gYWRkIGFmdGVyIGluZGlyZWN0aW9uLiAgKi8KLQotICBvdXRlcl9kaXNwID0gMDsKLSAgc3dpdGNoICh3b3JkICYgMykKLSAgICB7Ci0gICAgY2FzZSAyOgotICAgICAgb3V0ZXJfZGlzcCA9IE5FWFRXT1JEIChwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIG91dGVyX2Rpc3AgPSBORVhUTE9ORyAocCk7Ci0gICAgfQotCi0gIHByaW50X2Jhc2UgKGJhc2VyZWcsIGJhc2VfZGlzcCwgaW5mbyk7Ci0gIGlmICgod29yZCAmIDQpID09IDAgJiYgYnVmWzBdICE9ICdcMCcpCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsJXMiLCBidWYpOwotICAgICAgYnVmWzBdID0gJ1wwJzsKLSAgICB9Ci0gIHNwcmludGZfdm1hICh2bWFidWYsIG91dGVyX2Rpc3ApOwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIilAKCVzIiwgdm1hYnVmKTsKLSAgaWYgKGJ1ZlswXSAhPSAnXDAnKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVzIiwgYnVmKTsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7Ci0KLSAgcmV0dXJuIHA7Ci19Ci0KLS8qIFByaW50IGEgYmFzZSByZWdpc3RlciBSRUdOTyBhbmQgZGlzcGxhY2VtZW50IERJU1AsIG9uIElORk8tPlNUUkVBTS4KLSAgIFJFR05PID0gLTEgZm9yIHBjLCAtMiBmb3Igbm9uZSAoc3VwcHJlc3NlZCkuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfYmFzZSAocmVnbm8sIGRpc3AsIGluZm8pCi0gICAgIGludCByZWdubzsKLSAgICAgYmZkX3ZtYSBkaXNwOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpZiAocmVnbm8gPT0gLTEpCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXBjQCgiKTsKLSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoZGlzcCwgaW5mbyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciBidWZbNTBdOwotCi0gICAgICBpZiAocmVnbm8gPT0gLTIpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJAKCIpOwotICAgICAgZWxzZSBpZiAocmVnbm8gPT0gLTMpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXpwY0AoIik7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc0AoIiwgcmVnX25hbWVzW3JlZ25vXSk7Ci0KLSAgICAgIHNwcmludGZfdm1hIChidWYsIGRpc3ApOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGJ1Zik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tNjhrLW9wYy5jIGIvb3Bjb2Rlcy9tNjhrLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWUxYjhkLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTY4ay1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDIwOTAgKzAsMCBAQAotLyogT3Bjb2RlIHRhYmxlIGZvciBtNjgwWzAxMjM0Nl0wL202ODg4WzEyXS9tNjg4NTEvbWNmNTIwMC4KLSAgIENvcHlyaWdodCAxOTg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9tNjhrLmgiCi0KLSNkZWZpbmUgb25lKHgpICgodW5zaWduZWQgaW50KSAoeCkgPDwgMTYpCi0jZGVmaW5lIHR3byh4LCB5KSAoKCh1bnNpZ25lZCBpbnQpICh4KSA8PCAxNikgKyAoeSkpCi0KLS8qIFRoZSBhc3NlbWJsZXIgcmVxdWlyZXMgdGhhdCBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QKLSAgIGJlIGNvbnNlY3V0aXZlLiAgSWYgdGhleSBhcmVuJ3QsIHRoZSBhc3NlbWJsZXIgd2lsbCBib21iIGF0Ci0gICBydW50aW1lLiAgKi8KLQotY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlIG02OGtfb3Bjb2Rlc1tdID0KLXsKLXsiYWJjZCIsCW9uZSgwMTQwNDAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIH0sCi17ImFiY2QiLAlvbmUoMDE0MDQxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAotCi17ImFkZGF3IiwJb25lKDAxNTAzMDApLAlvbmUoMDE3MDcwMCksICIqd0FkIiwgbTY4MDAwdXAgfSwKLXsiYWRkYWwiLAlvbmUoMDE1MDcwMCksCW9uZSgwMTcwNzAwKSwgIipsQWQiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLQoteyJhZGRpYiIsCW9uZSgwMDAzMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17ImFkZGl3IiwJb25lKDAwMDMxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsiYWRkaWwiLAlvbmUoMDAwMzIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJhZGRpbCIsCW9uZSgwMDAzMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZjUyMDAgfSwKLQoteyJhZGRxYiIsCW9uZSgwMDUwMDAwKSwJb25lKDAxNzA3MDApLCAiUWQkYiIsIG02ODAwMHVwIH0sCi17ImFkZHF3IiwJb25lKDAwNTAxMDApLAlvbmUoMDE3MDcwMCksICJRZCV3IiwgbTY4MDAwdXAgfSwKLXsiYWRkcWwiLAlvbmUoMDA1MDIwMCksCW9uZSgwMTcwNzAwKSwgIlFkJWwiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLQotLyogVGhlIGFkZCBvcGNvZGUgY2FuIGdlbmVyYXRlIHRoZSBhZGRhLCBhZGRpLCBhbmQgYWRkcSBpbnN0cnVjdGlvbnMuICAqLwoteyJhZGRiIiwJb25lKDAwNTAwMDApLAlvbmUoMDE3MDcwMCksICJRZCRiIiwgbTY4MDAwdXAgfSwKLXsiYWRkYiIsCW9uZSgwMDAzMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17ImFkZGIiLAlvbmUoMDE1MDAwMCksCW9uZSgwMTcwNzAwKSwgIjtiRGQiLCBtNjgwMDB1cCB9LAoteyJhZGRiIiwJb25lKDAxNTA0MDApLAlvbmUoMDE3MDcwMCksICJEZH5iIiwgbTY4MDAwdXAgfSwKLXsiYWRkdyIsCW9uZSgwMDUwMTAwKSwJb25lKDAxNzA3MDApLCAiUWQldyIsIG02ODAwMHVwIH0sCi17ImFkZHciLAlvbmUoMDE1MDMwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB9LAoteyJhZGR3IiwJb25lKDAwMDMxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsiYWRkdyIsCW9uZSgwMTUwMTAwKSwJb25lKDAxNzA3MDApLCAiKndEZCIsIG02ODAwMHVwIH0sCi17ImFkZHciLAlvbmUoMDE1MDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnciLCBtNjgwMDB1cCB9LAoteyJhZGRsIiwJb25lKDAwNTAyMDApLAlvbmUoMDE3MDcwMCksICJRZCVsIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi17ImFkZGwiLAlvbmUoMDAwMzIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJhZGRsIiwJb25lKDAwMDMyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmNTIwMCB9LAoteyJhZGRsIiwJb25lKDAxNTA3MDApLAlvbmUoMDE3MDcwMCksICIqbEFkIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi17ImFkZGwiLAlvbmUoMDE1MDIwMCksCW9uZSgwMTcwNzAwKSwgIipsRGQiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYWRkbCIsCW9uZSgwMTUwNjAwKSwJb25lKDAxNzA3MDApLCAiRGR+bCIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAotCi17ImFkZHhiIiwJb25lKDAxNTA0MDApLAlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfSwKLXsiYWRkeGIiLAlvbmUoMDE1MDQxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAoteyJhZGR4dyIsCW9uZSgwMTUwNTAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIH0sCi17ImFkZHh3IiwJb25lKDAxNTA1MTApLAlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKLXsiYWRkeGwiLAlvbmUoMDE1MDYwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYWRkeGwiLAlvbmUoMDE1MDYxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAotCi17ImFuZGliIiwJb25lKDAwMDEwMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsiYW5kaWIiLAlvbmUoMDAwMTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJhbmRpdyIsCW9uZSgwMDAxMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17ImFuZGl3IiwJb25lKDAwMDExNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsiYW5kaWwiLAlvbmUoMDAwMTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJhbmRpbCIsCW9uZSgwMDAxMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZjUyMDAgfSwKLXsiYW5kaSIsCW9uZSgwMDAxMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17ImFuZGkiLAlvbmUoMDAwMTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJhbmRpIiwJb25lKDAwMDExNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLQotLyogVGhlIGFuZCBvcGNvZGUgY2FuIGdlbmVyYXRlIHRoZSBhbmRpIGluc3RydWN0aW9uLiAgKi8KLXsiYW5kYiIsCW9uZSgwMDAxMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17ImFuZGIiLAlvbmUoMDAwMTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJhbmRiIiwJb25lKDAxNDAwMDApLAlvbmUoMDE3MDcwMCksICI7YkRkIiwgbTY4MDAwdXAgfSwKLXsiYW5kYiIsCW9uZSgwMTQwNDAwKSwJb25lKDAxNzA3MDApLCAiRGR+YiIsIG02ODAwMHVwIH0sCi17ImFuZHciLAlvbmUoMDAwMTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJhbmR3IiwJb25lKDAwMDExNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsiYW5kdyIsCW9uZSgwMTQwMTAwKSwJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwIH0sCi17ImFuZHciLAlvbmUoMDE0MDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnciLCBtNjgwMDB1cCB9LAoteyJhbmRsIiwJb25lKDAwMDEyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsiYW5kbCIsCW9uZSgwMDAxMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZjUyMDAgfSwKLXsiYW5kbCIsCW9uZSgwMTQwMjAwKSwJb25lKDAxNzA3MDApLCAiO2xEZCIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJhbmRsIiwJb25lKDAxNDA2MDApLAlvbmUoMDE3MDcwMCksICJEZH5sIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi17ImFuZCIsCQlvbmUoMDAwMTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHciLCBtNjgwMDB1cCB9LAoteyJhbmQiLAkJb25lKDAwMDEwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiYW5kIiwJCW9uZSgwMDAxMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17ImFuZCIsCQlvbmUoMDE0MDEwMCksCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAoteyJhbmQiLAkJb25lKDAxNDA1MDApLAlvbmUoMDE3MDcwMCksICJEZH53IiwgbTY4MDAwdXAgfSwKLQoteyJhc2xiIiwJb25lKDAxNjA0MDApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsiYXNsYiIsCW9uZSgwMTYwNDQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImFzbHciLAlvbmUoMDE2MDUwMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJhc2x3IiwJb25lKDAxNjA1NDApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsiYXNsdyIsCW9uZSgwMTYwNzAwKSwJb25lKDAxNzc3MDApLCAifnMiLCAgIG02ODAwMHVwIH0sCi17ImFzbGwiLAlvbmUoMDE2MDYwMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYXNsbCIsCW9uZSgwMTYwNjQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAotCi17ImFzcmIiLAlvbmUoMDE2MDAwMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJhc3JiIiwJb25lKDAxNjAwNDApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsiYXNydyIsCW9uZSgwMTYwMTAwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImFzcnciLAlvbmUoMDE2MDE0MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJhc3J3IiwJb25lKDAxNjAzMDApLAlvbmUoMDE3NzcwMCksICJ+cyIsICAgbTY4MDAwdXAgfSwKLXsiYXNybCIsCW9uZSgwMTYwMjAwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJhc3JsIiwJb25lKDAxNjAyNDApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi0KLXsiYmhpdyIsCW9uZSgwMDYxMDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYmxzdyIsCW9uZSgwMDYxNDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYmNjdyIsCW9uZSgwMDYyMDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYmNzdyIsCW9uZSgwMDYyNDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYm5ldyIsCW9uZSgwMDYzMDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYmVxdyIsCW9uZSgwMDYzNDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYnZjdyIsCW9uZSgwMDY0MDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYnZzdyIsCW9uZSgwMDY0NDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYnBsdyIsCW9uZSgwMDY1MDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYm1pdyIsCW9uZSgwMDY1NDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYmdldyIsCW9uZSgwMDY2MDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYmx0dyIsCW9uZSgwMDY2NDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYmd0dyIsCW9uZSgwMDY3MDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYmxldyIsCW9uZSgwMDY3NDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLQoteyJiaGlsIiwJb25lKDAwNjEzNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYmxzbCIsCW9uZSgwMDYxNzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJjY2wiLAlvbmUoMDA2MjM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJiY3NsIiwJb25lKDAwNjI3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYm5lbCIsCW9uZSgwMDYzMzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJlcWwiLAlvbmUoMDA2Mzc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJidmNsIiwJb25lKDAwNjQzNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYnZzbCIsCW9uZSgwMDY0Nzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJwbGwiLAlvbmUoMDA2NTM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJibWlsIiwJb25lKDAwNjU3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYmdlbCIsCW9uZSgwMDY2Mzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJsdGwiLAlvbmUoMDA2Njc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJiZ3RsIiwJb25lKDAwNjczNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYmxlbCIsCW9uZSgwMDY3Nzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi0KLXsiYmhpcyIsCW9uZSgwMDYxMDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYmxzcyIsCW9uZSgwMDYxNDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYmNjcyIsCW9uZSgwMDYyMDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYmNzcyIsCW9uZSgwMDYyNDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYm5lcyIsCW9uZSgwMDYzMDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYmVxcyIsCW9uZSgwMDYzNDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYnZjcyIsCW9uZSgwMDY0MDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYnZzcyIsCW9uZSgwMDY0NDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYnBscyIsCW9uZSgwMDY1MDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYm1pcyIsCW9uZSgwMDY1NDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYmdlcyIsCW9uZSgwMDY2MDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYmx0cyIsCW9uZSgwMDY2NDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYmd0cyIsCW9uZSgwMDY3MDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYmxlcyIsCW9uZSgwMDY3NDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLQoteyJqaGkiLAkJb25lKDAwNjEwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJqbHMiLAkJb25lKDAwNjE0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJqY2MiLAkJb25lKDAwNjIwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJqY3MiLAkJb25lKDAwNjI0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJqbmUiLAkJb25lKDAwNjMwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJqZXEiLAkJb25lKDAwNjM0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJqdmMiLAkJb25lKDAwNjQwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJqdnMiLAkJb25lKDAwNjQ0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJqcGwiLAkJb25lKDAwNjUwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJqbWkiLAkJb25lKDAwNjU0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJqZ2UiLAkJb25lKDAwNjYwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJqbHQiLAkJb25lKDAwNjY0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJqZ3QiLAkJb25lKDAwNjcwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJqbGUiLAkJb25lKDAwNjc0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAotCi17ImJjaGciLAlvbmUoMDAwMDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsiYmNoZyIsCW9uZSgwMDA0MTAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17ImJjaGciLAlvbmUoMDAwNDEwMCksCW9uZSgwMTc3NzAwKSwgIiNicXMiLCBtY2Y1MjAwIH0sCi0KLXsiYmNsciIsCW9uZSgwMDAwNjAwKSwJb25lKDAxNzA3MDApLCAiRGQkcyIsIG02ODAwMHVwIH0sCi17ImJjbHIiLAlvbmUoMDAwMDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkdnMiLCBtY2Y1MjAwIH0sCi17ImJjbHIiLAlvbmUoMDAwNDIwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJiY2xyIiwJb25lKDAwMDQyMDApLAlvbmUoMDE3NzcwMCksICIjYnFzIiwgbWNmNTIwMCB9LAotCi17ImJmY2hnIiwJdHdvKDAxNjUzMDAsIDApLCB0d28oMDE3NzcwMCwgMDE3MDAwMCksCSI/c08yTzMiLCAgIG02ODAyMHVwIH0sCi17ImJmY2xyIiwJdHdvKDAxNjYzMDAsIDApLCB0d28oMDE3NzcwMCwgMDE3MDAwMCksCSI/c08yTzMiLCAgIG02ODAyMHVwIH0sCi17ImJmZXh0cyIsCXR3bygwMTY1NzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxMDAwMDApLAkiL3NPMk8zRDEiLCBtNjgwMjB1cCB9LAoteyJiZmV4dHUiLAl0d28oMDE2NDcwMCwgMCksIHR3bygwMTc3NzAwLCAwMTAwMDAwKSwJIi9zTzJPM0QxIiwgbTY4MDIwdXAgfSwKLXsiYmZmZm8iLAl0d28oMDE2NjcwMCwgMCksIHR3bygwMTc3NzAwLCAwMTAwMDAwKSwJIi9zTzJPM0QxIiwgbTY4MDIwdXAgfSwKLXsiYmZpbnMiLAl0d28oMDE2NzcwMCwgMCksIHR3bygwMTc3NzAwLCAwMTAwMDAwKSwJIkQxP3NPMk8zIiwgbTY4MDIwdXAgfSwKLXsiYmZzZXQiLAl0d28oMDE2NzMwMCwgMCksIHR3bygwMTc3NzAwLCAwMTcwMDAwKSwJIj9zTzJPMyIsICAgbTY4MDIwdXAgfSwKLXsiYmZ0c3QiLAl0d28oMDE2NDMwMCwgMCksIHR3bygwMTc3NzAwLCAwMTcwMDAwKSwJIi9zTzJPMyIsICAgbTY4MDIwdXAgfSwKLQoteyJiZ25kIiwJb25lKDAwNDUzNzIpLAkJb25lKDAxNzc3NzcpLCAiIiwgY3B1MzIgfSwKLQoteyJia3B0IiwJb25lKDAwNDQxMTApLAkJb25lKDAxNzc3NzApLCAidHMiLCBtNjgwMTB1cCB9LAotCi17ImJyYXciLAlvbmUoMDA2MDAwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi17ImJyYWwiLAlvbmUoMDA2MDM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJicmFzIiwJb25lKDAwNjAwMDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAotCi17ImJzZXQiLAlvbmUoMDAwMDcwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB9LAoteyJic2V0IiwJb25lKDAwMDA3MDApLAlvbmUoMDE3MDcwMCksICJEZHZzIiwgbWNmNTIwMCB9LAoteyJic2V0IiwJb25lKDAwMDQzMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsiYnNldCIsCW9uZSgwMDA0MzAwKSwJb25lKDAxNzc3MDApLCAiI2JxcyIsIG1jZjUyMDAgfSwKLQoteyJic3J3IiwJb25lKDAwNjA0MDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJic3JsIiwJb25lKDAwNjA3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYnNycyIsCW9uZSgwMDYwNDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLQoteyJidHN0IiwJb25lKDAwMDA0MDApLAlvbmUoMDE3MDcwMCksICJEZDtiIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi17ImJ0c3QiLAlvbmUoMDAwNDAwMCksCW9uZSgwMTc3NzAwKSwgIiNiQHMiLCBtNjgwMDB1cCB9LAoteyJidHN0IiwJb25lKDAwMDQwMDApLAlvbmUoMDE3NzcwMCksICIjYnFzIiwgbWNmNTIwMCB9LAotCi17ImNhbGxtIiwJb25lKDAwMDMzMDApLAkJb25lKDAxNzc3MDApLCAiI2IhcyIsIG02ODAyMCB9LAotCi17ImNhczJ3IiwgICAgIHR3bygwMDA2Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1cjFyNCIsIG02ODAyMHVwIH0sCi17ImNhczJ3IiwgICAgIHR3bygwMDA2Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1UjFSNCIsIG02ODAyMHVwIH0sCi17ImNhczJsIiwgICAgIHR3bygwMDA3Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1cjFyNCIsIG02ODAyMHVwIH0sCi17ImNhczJsIiwgICAgIHR3bygwMDA3Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1UjFSNCIsIG02ODAyMHVwIH0sCi0KLXsiY2FzYiIsCXR3bygwMDA1MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzcwNzApLAkiRDNEMn5zIiwgbTY4MDIwdXAgfSwKLXsiY2FzdyIsCXR3bygwMDA2MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzcwNzApLAkiRDNEMn5zIiwgbTY4MDIwdXAgfSwKLXsiY2FzbCIsCXR3bygwMDA3MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzcwNzApLAkiRDNEMn5zIiwgbTY4MDIwdXAgfSwKLQoteyJjaGsyYiIsIHR3bygwMDAwMzAwLDAwMDQwMDApLCB0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJjaGsydyIsIHR3bygwMDAxMzAwLDAwMDQwMDApLAl0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJjaGsybCIsIHR3bygwMDAyMzAwLDAwMDQwMDApLAl0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAotCi17ImNoa2wiLAlvbmUoMDA0MDQwMCksCQlvbmUoMDE3MDcwMCksICI7bERkIiwgbTY4MDAwdXAgfSwKLXsiY2hrdyIsCW9uZSgwMDQwNjAwKSwJCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAotCi0jZGVmaW5lIFNDT1BFX0xJTkUgKDB4MSA8PCAzKQotI2RlZmluZSBTQ09QRV9QQUdFICgweDIgPDwgMykKLSNkZWZpbmUgU0NPUEVfQUxMICAoMHgzIDw8IDMpCi0KLXsiY2ludmEiLAlvbmUoMHhmNDAwfFNDT1BFX0FMTCksICBvbmUoMHhmZjM4KSwgImNlIiwgICBtNjgwNDB1cCB9LAoteyJjaW52bCIsCW9uZSgweGY0MDB8U0NPUEVfTElORSksIG9uZSgweGZmMzgpLCAiY2VhcyIsIG02ODA0MHVwIH0sCi17ImNpbnZwIiwJb25lKDB4ZjQwMHxTQ09QRV9QQUdFKSwgb25lKDB4ZmYzOCksICJjZWFzIiwgbTY4MDQwdXAgfSwKLQoteyJjcHVzaGEiLAlvbmUoMHhmNDIwfFNDT1BFX0FMTCksICBvbmUoMHhmZjM4KSwgImNlIiwgICBtNjgwNDB1cCB9LAoteyJjcHVzaGwiLAlvbmUoMHhmNDIwfFNDT1BFX0xJTkUpLCBvbmUoMHhmZjM4KSwgImNlYXMiLCBtNjgwNDB1cCB9LAoteyJjcHVzaGwiLAlvbmUoMHgwNGU4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCAgIG1jZjUyMDAgIH0sCi17ImNwdXNocCIsCW9uZSgweGY0MjB8U0NPUEVfUEFHRSksIG9uZSgweGZmMzgpLCAiY2VhcyIsIG02ODA0MHVwIH0sCi0KLSN1bmRlZiBTQ09QRV9MSU5FCi0jdW5kZWYgU0NPUEVfUEFHRQotI3VuZGVmIFNDT1BFX0FMTAotCi17ImNscmIiLAlvbmUoMDA0MTAwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi17ImNscnciLAlvbmUoMDA0MTEwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi17ImNscmwiLAlvbmUoMDA0MTIwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi0KLXsiY21wMmIiLAl0d28oMDAwMDMwMCwwKSwgdHdvKDAxNzc3MDAsMDc3NzcpLCAiIXNSMSIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiY21wMnciLAl0d28oMDAwMTMwMCwwKSwJdHdvKDAxNzc3MDAsMDc3NzcpLCAiIXNSMSIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiY21wMmwiLAl0d28oMDAwMjMwMCwwKSwJdHdvKDAxNzc3MDAsMDc3NzcpLCAiIXNSMSIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLQoteyJjbXBhdyIsCW9uZSgwMTMwMzAwKSwJb25lKDAxNzA3MDApLCAiKndBZCIsIG02ODAwMHVwIH0sCi17ImNtcGFsIiwJb25lKDAxMzA3MDApLAlvbmUoMDE3MDcwMCksICIqbEFkIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi0KLXsiY21waWIiLAlvbmUoMDAwNjAwMCksCW9uZSgwMTc3NzAwKSwgIiNiQHMiLCBtNjgwMDB1cCB9LAoteyJjbXBpdyIsCW9uZSgwMDA2MTAwKSwJb25lKDAxNzc3MDApLCAiI3dAcyIsIG02ODAwMHVwIH0sCi17ImNtcGlsIiwJb25lKDAwMDYyMDApLAlvbmUoMDE3NzcwMCksICIjbEBzIiwgbTY4MDAwdXAgfSwKLXsiY21waWwiLAlvbmUoMDAwNjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2Y1MjAwIH0sCi0KLXsiY21wbWIiLAlvbmUoMDEzMDQxMCksCW9uZSgwMTcwNzcwKSwgIitzK2QiLCBtNjgwMDB1cCB9LAoteyJjbXBtdyIsCW9uZSgwMTMwNTEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCi17ImNtcG1sIiwJb25lKDAxMzA2MTApLAlvbmUoMDE3MDc3MCksICIrcytkIiwgbTY4MDAwdXAgfSwKLQotLyogVGhlIGNtcCBvcGNvZGUgY2FuIGdlbmVyYXRlIHRoZSBjbXBhLCBjbXBtLCBhbmQgY21waSBpbnN0cnVjdGlvbnMuICAqLwoteyJjbXBiIiwJb25lKDAwMDYwMDApLAlvbmUoMDE3NzcwMCksICIjYkBzIiwgbTY4MDAwdXAgfSwKLXsiY21wYiIsCW9uZSgwMTMwNDEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCi17ImNtcGIiLAlvbmUoMDEzMDAwMCksCW9uZSgwMTcwNzAwKSwgIjtiRGQiLCBtNjgwMDB1cCB9LAoteyJjbXB3IiwJb25lKDAxMzAzMDApLAlvbmUoMDE3MDcwMCksICIqd0FkIiwgbTY4MDAwdXAgfSwKLXsiY21wdyIsCW9uZSgwMDA2MTAwKSwJb25lKDAxNzc3MDApLCAiI3dAcyIsIG02ODAwMHVwIH0sCi17ImNtcHciLAlvbmUoMDEzMDUxMCksCW9uZSgwMTcwNzcwKSwgIitzK2QiLCBtNjgwMDB1cCB9LAoteyJjbXB3IiwJb25lKDAxMzAxMDApLAlvbmUoMDE3MDcwMCksICIqd0RkIiwgbTY4MDAwdXAgfSwKLXsiY21wbCIsCW9uZSgwMTMwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJjbXBsIiwJb25lKDAwMDYyMDApLAlvbmUoMDE3NzcwMCksICIjbEBzIiwgbTY4MDAwdXAgfSwKLXsiY21wbCIsCW9uZSgwMDA2MjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZjUyMDAgfSwKLXsiY21wbCIsCW9uZSgwMTMwNjEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCi17ImNtcGwiLAlvbmUoMDEzMDIwMCksCW9uZSgwMTcwNzAwKSwgIipsRGQiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLQoteyJkYmNjIiwJb25lKDAwNTIzMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJjcyIsCW9uZSgwMDUyNzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRiZXEiLAlvbmUoMDA1MzcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmYiLAkJb25lKDAwNTA3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJnZSIsCW9uZSgwMDU2MzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRiZ3QiLAlvbmUoMDA1NzMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmhpIiwJb25lKDAwNTEzMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJsZSIsCW9uZSgwMDU3NzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRibHMiLAlvbmUoMDA1MTcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmx0IiwJb25lKDAwNTY3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJtaSIsCW9uZSgwMDU1NzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRibmUiLAlvbmUoMDA1MzMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYnBsIiwJb25lKDAwNTUzMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJ0IiwJCW9uZSgwMDUwMzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRidmMiLAlvbmUoMDA1NDMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYnZzIiwJb25lKDAwNTQ3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLQoteyJkaXZzdyIsCW9uZSgwMTAwNzAwKSwJCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAotCi17ImRpdnNsIiwgdHdvKDAwNDYxMDAsMDAwNjAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsRDNEMSIsIG02ODAyMHVwfGNwdTMyIH0sCi17ImRpdnNsIiwgdHdvKDAwNDYxMDAsMDAwNDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsREQiLCAgIG02ODAyMHVwfGNwdTMyIH0sCi0KLXsiZGl2c2xsIiwgdHdvKDAwNDYxMDAsMDAwNDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsRDNEMSIsbTY4MDIwdXB8Y3B1MzIgfSwKLXsiZGl2c2xsIiwgdHdvKDAwNDYxMDAsMDAwNDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsREQiLCAgbTY4MDIwdXB8Y3B1MzIgfSwKLQoteyJkaXZ1dyIsCW9uZSgwMTAwMzAwKSwJCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAotCi17ImRpdnVsIiwgdHdvKDAwNDYxMDAsMDAwMjAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsRDNEMSIsIG02ODAyMHVwfGNwdTMyIH0sCi17ImRpdnVsIiwgdHdvKDAwNDYxMDAsMDAwMDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsREQiLCAgIG02ODAyMHVwfGNwdTMyIH0sCi0KLXsiZGl2dWxsIiwgdHdvKDAwNDYxMDAsMDAwMDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsRDNEMSIsbTY4MDIwdXB8Y3B1MzIgfSwKLXsiZGl2dWxsIiwgdHdvKDAwNDYxMDAsMDAwMDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsREQiLCAgbTY4MDIwdXB8Y3B1MzIgfSwKLQoteyJlb3JpYiIsCW9uZSgwMDA1MDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17ImVvcmliIiwJb25lKDAwMDUwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiZW9yaXciLAlvbmUoMDAwNTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJlb3JpdyIsCW9uZSgwMDA1MTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17ImVvcmlsIiwJb25lKDAwMDUyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsiZW9yaWwiLAlvbmUoMDAwNTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2Y1MjAwIH0sCi17ImVvcmkiLAlvbmUoMDAwNTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJlb3JpIiwJb25lKDAwMDUxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsiZW9yaSIsCW9uZSgwMDA1MTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi0KLS8qIFRoZSBlb3Igb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgZW9yaSBpbnN0cnVjdGlvbi4gICovCi17ImVvcmIiLAlvbmUoMDAwNTAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJlb3JiIiwJb25lKDAwMDUwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiZW9yYiIsCW9uZSgwMTMwNDAwKSwJb25lKDAxNzA3MDApLCAiRGQkcyIsIG02ODAwMHVwIH0sCi17ImVvcnciLAlvbmUoMDAwNTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJlb3J3IiwJb25lKDAwMDUxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsiZW9ydyIsCW9uZSgwMTMwNTAwKSwJb25lKDAxNzA3MDApLCAiRGQkcyIsIG02ODAwMHVwIH0sCi17ImVvcmwiLAlvbmUoMDAwNTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJlb3JsIiwJb25lKDAwMDUyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmNTIwMCB9LAoteyJlb3JsIiwJb25lKDAxMzA2MDApLAlvbmUoMDE3MDcwMCksICJEZCRzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi17ImVvciIsCQlvbmUoMDAwNTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJlb3IiLAkJb25lKDAwMDUxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsiZW9yIiwJCW9uZSgwMDA1MTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17ImVvciIsCQlvbmUoMDEzMDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB9LAotCi17ImV4ZyIsCQlvbmUoMDE0MDUwMCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJleGciLAkJb25lKDAxNDA1MTApLAlvbmUoMDE3MDc3MCksICJBZEFzIiwgbTY4MDAwdXAgfSwKLXsiZXhnIiwJCW9uZSgwMTQwNjEwKSwJb25lKDAxNzA3NzApLCAiRGRBcyIsIG02ODAwMHVwIH0sCi17ImV4ZyIsCQlvbmUoMDE0MDYxMCksCW9uZSgwMTcwNzcwKSwgIkFzRGQiLCBtNjgwMDB1cCB9LAotCi17ImV4dHciLAlvbmUoMDA0NDIwMCksCW9uZSgwMTc3NzcwKSwgIkRzIiwgbTY4MDAwdXB8bWNmNTIwMCB9LAoteyJleHRsIiwJb25lKDAwNDQzMDApLAlvbmUoMDE3Nzc3MCksICJEcyIsIG02ODAwMHVwfG1jZjUyMDAgfSwKLXsiZXh0YmwiLAlvbmUoMDA0NDcwMCksCW9uZSgwMTc3NzcwKSwgIkRzIiwgbTY4MDIwdXB8Y3B1MzJ8bWNmNTIwMCB9LAotCi0vKiBmbG9hdCBzdHVmZiBzdGFydHMgaGVyZSAqLwotCi17ImZhYnNiIiwJdHdvKDB4RjAwMCwgMHg1ODE4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmYWJzZCIsCXR3bygweEYwMDAsIDB4NTQxOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmFic2wiLAl0d28oMHhGMDAwLCAweDQwMTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZhYnNwIiwJdHdvKDB4RjAwMCwgMHg0QzE4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmYWJzcyIsCXR3bygweEYwMDAsIDB4NDQxOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmFic3ciLAl0d28oMHhGMDAwLCAweDUwMTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDE4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmYWJzeCIsCXR3bygweEYwMDAsIDB4NDgxOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmFic3giLAl0d28oMHhGMDAwLCAweDAwMTgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnNhYnNiIiwJdHdvKDB4RjAwMCwgMHg1ODU4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZzYWJzZCIsCXR3bygweEYwMDAsIDB4NTQ1OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmc2Fic2wiLAl0d28oMHhGMDAwLCAweDQwNTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhYnNwIiwJdHdvKDB4RjAwMCwgMHg0QzU4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZzYWJzcyIsCXR3bygweEYwMDAsIDB4NDQ1OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmc2Fic3ciLAl0d28oMHhGMDAwLCAweDUwNTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZnNhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDU4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZzYWJzeCIsCXR3bygweEYwMDAsIDB4NDg1OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmc2Fic3giLAl0d28oMHhGMDAwLCAweDAwNTgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKLQoteyJmZGFic2IiLAl0d28oMHhGMDAwLCAweDU4NWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXB9LAoteyJmZGFic2QiLAl0d28oMHhGMDAwLCAweDU0NWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXB9LAoteyJmZGFic2wiLAl0d28oMHhGMDAwLCAweDQwNWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXB9LAoteyJmZGFic3AiLAl0d28oMHhGMDAwLCAweDRDNWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXB9LAoteyJmZGFic3MiLAl0d28oMHhGMDAwLCAweDQ0NWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXB9LAoteyJmZGFic3ciLAl0d28oMHhGMDAwLCAweDUwNWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXB9LAoteyJmZGFic3giLAl0d28oMHhGMDAwLCAweDAwNWMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXB9LAoteyJmZGFic3giLAl0d28oMHhGMDAwLCAweDQ4NWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXB9LAoteyJmZGFic3giLAl0d28oMHhGMDAwLCAweDAwNWMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXB9LAotCi17ImZhY29zYiIsCXR3bygweEYwMDAsIDB4NTgxQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmFjb3NkIiwJdHdvKDB4RjAwMCwgMHg1NDFDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmYWNvc2wiLAl0d28oMHhGMDAwLCAweDQwMUMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZhY29zcCIsCXR3bygweEYwMDAsIDB4NEMxQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmFjb3NzIiwJdHdvKDB4RjAwMCwgMHg0NDFDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmYWNvc3ciLAl0d28oMHhGMDAwLCAweDUwMUMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZhY29zeCIsCXR3bygweEYwMDAsIDB4MDAxQyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmFjb3N4IiwJdHdvKDB4RjAwMCwgMHg0ODFDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmYWNvc3giLAl0d28oMHhGMDAwLCAweDAwMUMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmFkZGIiLAl0d28oMHhGMDAwLCAweDU4MjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZhZGRkIiwJdHdvKDB4RjAwMCwgMHg1NDIyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmYWRkbCIsCXR3bygweEYwMDAsIDB4NDAyMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmFkZHAiLAl0d28oMHhGMDAwLCAweDRDMjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZhZGRzIiwJdHdvKDB4RjAwMCwgMHg0NDIyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmYWRkdyIsCXR3bygweEYwMDAsIDB4NTAyMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmFkZHgiLAl0d28oMHhGMDAwLCAweDAwMjIpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZhZGR4IiwJdHdvKDB4RjAwMCwgMHg0ODIyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAotCi17ImZzYWRkYiIsCXR3bygweEYwMDAsIDB4NTg2MiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc2FkZGQiLAl0d28oMHhGMDAwLCAweDU0NjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhZGRsIiwJdHdvKDB4RjAwMCwgMHg0MDYyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzYWRkcCIsCXR3bygweEYwMDAsIDB4NEM2MiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmc2FkZHMiLAl0d28oMHhGMDAwLCAweDQ0NjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhZGR3IiwJdHdvKDB4RjAwMCwgMHg1MDYyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzYWRkeCIsCXR3bygweEYwMDAsIDB4MDA2MiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc2FkZHgiLAl0d28oMHhGMDAwLCAweDQ4NjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLQoteyJmZGFkZGIiLAl0d28oMHhGMDAwLCAweDU4NjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRhZGRkIiwJdHdvKDB4RjAwMCwgMHg1NDY2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZkYWRkbCIsCXR3bygweEYwMDAsIDB4NDA2NiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmZGFkZHAiLAl0d28oMHhGMDAwLCAweDRDNjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRhZGRzIiwJdHdvKDB4RjAwMCwgMHg0NDY2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZkYWRkdyIsCXR3bygweEYwMDAsIDB4NTA2NiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmZGFkZHgiLAl0d28oMHhGMDAwLCAweDAwNjYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRhZGR4IiwJdHdvKDB4RjAwMCwgMHg0ODY2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi0KLXsiZmFzaW5iIiwJdHdvKDB4RjAwMCwgMHg1ODBDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmYXNpbmQiLAl0d28oMHhGMDAwLCAweDU0MEMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZhc2lubCIsCXR3bygweEYwMDAsIDB4NDAwQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmFzaW5wIiwJdHdvKDB4RjAwMCwgMHg0QzBDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmYXNpbnMiLAl0d28oMHhGMDAwLCAweDQ0MEMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZhc2ludyIsCXR3bygweEYwMDAsIDB4NTAwQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmFzaW54IiwJdHdvKDB4RjAwMCwgMHgwMDBDKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmYXNpbngiLAl0d28oMHhGMDAwLCAweDQ4MEMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZhc2lueCIsCXR3bygweEYwMDAsIDB4MDAwQyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmYXRhbmIiLAl0d28oMHhGMDAwLCAweDU4MEEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZhdGFuZCIsCXR3bygweEYwMDAsIDB4NTQwQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmF0YW5sIiwJdHdvKDB4RjAwMCwgMHg0MDBBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmYXRhbnAiLAl0d28oMHhGMDAwLCAweDRDMEEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZhdGFucyIsCXR3bygweEYwMDAsIDB4NDQwQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmF0YW53IiwJdHdvKDB4RjAwMCwgMHg1MDBBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmYXRhbngiLAl0d28oMHhGMDAwLCAweDAwMEEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZhdGFueCIsCXR3bygweEYwMDAsIDB4NDgwQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmF0YW54IiwJdHdvKDB4RjAwMCwgMHgwMDBBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZhdGFuaGIiLAl0d28oMHhGMDAwLCAweDU4MEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZhdGFuaGQiLAl0d28oMHhGMDAwLCAweDU0MEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZhdGFuaGwiLAl0d28oMHhGMDAwLCAweDQwMEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZhdGFuaHAiLAl0d28oMHhGMDAwLCAweDRDMEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZhdGFuaHMiLAl0d28oMHhGMDAwLCAweDQ0MEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZhdGFuaHciLAl0d28oMHhGMDAwLCAweDUwMEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZhdGFuaHgiLAl0d28oMHhGMDAwLCAweDAwMEQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZhdGFuaHgiLAl0d28oMHhGMDAwLCAweDQ4MEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZhdGFuaHgiLAl0d28oMHhGMDAwLCAweDAwMEQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmJlcSIsCW9uZSgweEYwODEpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZiZiIsCQlvbmUoMHhGMDgwKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYmdlIiwJb25lKDB4RjA5MyksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJnbCIsCW9uZSgweEYwOTYpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZiZ2xlIiwJb25lKDB4RjA5NyksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJndCIsCW9uZSgweEYwOTIpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibGUiLAlvbmUoMHhGMDk1KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYmx0IiwJb25lKDB4RjA5NCksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJuZSIsCW9uZSgweEYwOEUpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibmdlIiwJb25lKDB4RjA5QyksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJuZ2wiLAlvbmUoMHhGMDk5KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm5nbGUiLAlvbmUoMHhGMDk4KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm5ndCIsCW9uZSgweEYwOUQpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibmxlIiwJb25lKDB4RjA5QSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJubHQiLAlvbmUoMHhGMDlCKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm9nZSIsCW9uZSgweEYwODMpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZib2dsIiwJb25lKDB4RjA4NiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJvZ3QiLAlvbmUoMHhGMDgyKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm9sZSIsCW9uZSgweEYwODUpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZib2x0IiwJb25lKDB4RjA4NCksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJvciIsCW9uZSgweEYwODcpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZic2VxIiwJb25lKDB4RjA5MSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJzZiIsCW9uZSgweEYwOTApLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZic25lIiwJb25lKDB4RjA5RSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJzdCIsCW9uZSgweEYwOUYpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZidCIsCQlvbmUoMHhGMDhGKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnVlcSIsCW9uZSgweEYwODkpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZidWdlIiwJb25lKDB4RjA4QiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJ1Z3QiLAlvbmUoMHhGMDhBKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnVsZSIsCW9uZSgweEYwOEQpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZidWx0IiwJb25lKDB4RjA4QyksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJ1biIsCW9uZSgweEYwODgpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi0KLXsiZmJlcWwiLAlvbmUoMHhGMEMxKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYmZsIiwJb25lKDB4RjBDMCksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJnZWwiLAlvbmUoMHhGMEQzKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYmdsbCIsCW9uZSgweEYwRDYpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZiZ2xlbCIsCW9uZSgweEYwRDcpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZiZ3RsIiwJb25lKDB4RjBEMiksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJsZWwiLAlvbmUoMHhGMEQ1KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYmx0bCIsCW9uZSgweEYwRDQpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibmVsIiwJb25lKDB4RjBDRSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJuZ2VsIiwJb25lKDB4RjBEQyksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJuZ2xsIiwJb25lKDB4RjBEOSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJuZ2xlbCIsCW9uZSgweEYwRDgpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibmd0bCIsCW9uZSgweEYwREQpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibmxlbCIsCW9uZSgweEYwREEpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibmx0bCIsCW9uZSgweEYwREIpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZib2dlbCIsCW9uZSgweEYwQzMpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZib2dsbCIsCW9uZSgweEYwQzYpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZib2d0bCIsCW9uZSgweEYwQzIpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZib2xlbCIsCW9uZSgweEYwQzUpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZib2x0bCIsCW9uZSgweEYwQzQpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZib3JsIiwJb25lKDB4RjBDNyksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJzZXFsIiwJb25lKDB4RjBEMSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJzZmwiLAlvbmUoMHhGMEQwKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnNuZWwiLAlvbmUoMHhGMERFKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnN0bCIsCW9uZSgweEYwREYpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZidGwiLAlvbmUoMHhGMENGKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnVlcWwiLAlvbmUoMHhGMEM5KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnVnZWwiLAlvbmUoMHhGMENCKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnVndGwiLAlvbmUoMHhGMENBKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnVsZWwiLAlvbmUoMHhGMENEKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnVsdGwiLAlvbmUoMHhGMENDKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnVubCIsCW9uZSgweEYwQzgpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi0KLXsiZmplcSIsCW9uZSgweEYwODEpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqZiIsCQlvbmUoMHhGMDgwKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmamdlIiwJb25lKDB4RjA5MyksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpnbCIsCW9uZSgweEYwOTYpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqZ2xlIiwJb25lKDB4RjA5NyksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpndCIsCW9uZSgweEYwOTIpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbGUiLAlvbmUoMHhGMDk1KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmamx0IiwJb25lKDB4RjA5NCksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpuZSIsCW9uZSgweEYwOEUpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbmdlIiwJb25lKDB4RjA5QyksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpuZ2wiLAlvbmUoMHhGMDk5KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam5nbGUiLAlvbmUoMHhGMDk4KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam5ndCIsCW9uZSgweEYwOUQpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbmxlIiwJb25lKDB4RjA5QSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpubHQiLAlvbmUoMHhGMDlCKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam9nZSIsCW9uZSgweEYwODMpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqb2dsIiwJb25lKDB4RjA4NiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpvZ3QiLAlvbmUoMHhGMDgyKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam9sZSIsCW9uZSgweEYwODUpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqb2x0IiwJb25lKDB4RjA4NCksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpvciIsCW9uZSgweEYwODcpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqc2VxIiwJb25lKDB4RjA5MSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpzZiIsCW9uZSgweEYwOTApLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqc25lIiwJb25lKDB4RjA5RSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpzdCIsCW9uZSgweEYwOUYpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqdCIsCQlvbmUoMHhGMDhGKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanVlcSIsCW9uZSgweEYwODkpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqdWdlIiwJb25lKDB4RjA4QiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmp1Z3QiLAlvbmUoMHhGMDhBKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanVsZSIsCW9uZSgweEYwOEQpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqdWx0IiwJb25lKDB4RjA4QyksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmp1biIsCW9uZSgweEYwODgpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi0KLXsiZmNtcGIiLAl0d28oMHhGMDAwLCAweDU4MzgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZjbXBkIiwJdHdvKDB4RjAwMCwgMHg1NDM4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmY21wbCIsCXR3bygweEYwMDAsIDB4NDAzOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmNtcHAiLAl0d28oMHhGMDAwLCAweDRDMzgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZjbXBzIiwJdHdvKDB4RjAwMCwgMHg0NDM4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmY21wdyIsCXR3bygweEYwMDAsIDB4NTAzOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmNtcHgiLAl0d28oMHhGMDAwLCAweDAwMzgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZjbXB4IiwJdHdvKDB4RjAwMCwgMHg0ODM4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAotCi17ImZjb3NiIiwJdHdvKDB4RjAwMCwgMHg1ODFEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmY29zZCIsCXR3bygweEYwMDAsIDB4NTQxRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmNvc2wiLAl0d28oMHhGMDAwLCAweDQwMUQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZjb3NwIiwJdHdvKDB4RjAwMCwgMHg0QzFEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmY29zcyIsCXR3bygweEYwMDAsIDB4NDQxRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmNvc3ciLAl0d28oMHhGMDAwLCAweDUwMUQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZjb3N4IiwJdHdvKDB4RjAwMCwgMHgwMDFEKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmY29zeCIsCXR3bygweEYwMDAsIDB4NDgxRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmNvc3giLAl0d28oMHhGMDAwLCAweDAwMUQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmNvc2hiIiwJdHdvKDB4RjAwMCwgMHg1ODE5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmY29zaGQiLAl0d28oMHhGMDAwLCAweDU0MTkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZjb3NobCIsCXR3bygweEYwMDAsIDB4NDAxOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmNvc2hwIiwJdHdvKDB4RjAwMCwgMHg0QzE5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmY29zaHMiLAl0d28oMHhGMDAwLCAweDQ0MTkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZjb3NodyIsCXR3bygweEYwMDAsIDB4NTAxOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmNvc2h4IiwJdHdvKDB4RjAwMCwgMHgwMDE5KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmY29zaHgiLAl0d28oMHhGMDAwLCAweDQ4MTkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZjb3NoeCIsCXR3bygweEYwMDAsIDB4MDAxOSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmZGJlcSIsCXR3bygweEYwNDgsIDB4MDAwMSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRiZiIsCXR3bygweEYwNDgsIDB4MDAwMCksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRiZ2UiLAl0d28oMHhGMDQ4LCAweDAwMTMpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYmdsIiwJdHdvKDB4RjA0OCwgMHgwMDE2KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJnbGUiLAl0d28oMHhGMDQ4LCAweDAwMTcpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYmd0IiwJdHdvKDB4RjA0OCwgMHgwMDEyKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJsZSIsCXR3bygweEYwNDgsIDB4MDAxNSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibHQiLAl0d28oMHhGMDQ4LCAweDAwMTQpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm5lIiwJdHdvKDB4RjA0OCwgMHgwMDBFKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJuZ2UiLAl0d28oMHhGMDQ4LCAweDAwMUMpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm5nbCIsCXR3bygweEYwNDgsIDB4MDAxOSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibmdsZSIsCXR3bygweEYwNDgsIDB4MDAxOCksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibmd0IiwJdHdvKDB4RjA0OCwgMHgwMDFEKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJubGUiLAl0d28oMHhGMDQ4LCAweDAwMUEpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm5sdCIsCXR3bygweEYwNDgsIDB4MDAxQiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRib2dlIiwJdHdvKDB4RjA0OCwgMHgwMDAzKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJvZ2wiLAl0d28oMHhGMDQ4LCAweDAwMDYpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm9ndCIsCXR3bygweEYwNDgsIDB4MDAwMiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRib2xlIiwJdHdvKDB4RjA0OCwgMHgwMDA1KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJvbHQiLAl0d28oMHhGMDQ4LCAweDAwMDQpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm9yIiwJdHdvKDB4RjA0OCwgMHgwMDA3KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJzZXEiLAl0d28oMHhGMDQ4LCAweDAwMTEpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnNmIiwJdHdvKDB4RjA0OCwgMHgwMDEwKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJzbmUiLAl0d28oMHhGMDQ4LCAweDAwMUUpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnN0IiwJdHdvKDB4RjA0OCwgMHgwMDFGKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJ0IiwJdHdvKDB4RjA0OCwgMHgwMDBGKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJ1ZXEiLAl0d28oMHhGMDQ4LCAweDAwMDkpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnVnZSIsCXR3bygweEYwNDgsIDB4MDAwQiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRidWd0IiwJdHdvKDB4RjA0OCwgMHgwMDBBKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJ1bGUiLAl0d28oMHhGMDQ4LCAweDAwMEQpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnVsdCIsCXR3bygweEYwNDgsIDB4MDAwQyksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRidW4iLAl0d28oMHhGMDQ4LCAweDAwMDgpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi0KLXsiZmRpdmIiLAl0d28oMHhGMDAwLCAweDU4MjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZkaXZkIiwJdHdvKDB4RjAwMCwgMHg1NDIwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmZGl2bCIsCXR3bygweEYwMDAsIDB4NDAyMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmRpdnAiLAl0d28oMHhGMDAwLCAweDRDMjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZkaXZzIiwJdHdvKDB4RjAwMCwgMHg0NDIwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmZGl2dyIsCXR3bygweEYwMDAsIDB4NTAyMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmRpdngiLAl0d28oMHhGMDAwLCAweDAwMjApLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZkaXZ4IiwJdHdvKDB4RjAwMCwgMHg0ODIwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAotCi17ImZzZGl2YiIsCXR3bygweEYwMDAsIDB4NTg2MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc2RpdmQiLAl0d28oMHhGMDAwLCAweDU0NjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNkaXZsIiwJdHdvKDB4RjAwMCwgMHg0MDYwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzZGl2cCIsCXR3bygweEYwMDAsIDB4NEM2MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmc2RpdnMiLAl0d28oMHhGMDAwLCAweDQ0NjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNkaXZ3IiwJdHdvKDB4RjAwMCwgMHg1MDYwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzZGl2eCIsCXR3bygweEYwMDAsIDB4MDA2MCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc2RpdngiLAl0d28oMHhGMDAwLCAweDQ4NjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLQoteyJmZGRpdmIiLAl0d28oMHhGMDAwLCAweDU4NjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRkaXZkIiwJdHdvKDB4RjAwMCwgMHg1NDY0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZkZGl2bCIsCXR3bygweEYwMDAsIDB4NDA2NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmZGRpdnAiLAl0d28oMHhGMDAwLCAweDRDNjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRkaXZzIiwJdHdvKDB4RjAwMCwgMHg0NDY0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZkZGl2dyIsCXR3bygweEYwMDAsIDB4NTA2NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmZGRpdngiLAl0d28oMHhGMDAwLCAweDAwNjQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRkaXZ4IiwJdHdvKDB4RjAwMCwgMHg0ODY0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi0KLXsiZmV0b3hiIiwJdHdvKDB4RjAwMCwgMHg1ODEwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmZXRveGQiLAl0d28oMHhGMDAwLCAweDU0MTApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZldG94bCIsCXR3bygweEYwMDAsIDB4NDAxMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmV0b3hwIiwJdHdvKDB4RjAwMCwgMHg0QzEwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmZXRveHMiLAl0d28oMHhGMDAwLCAweDQ0MTApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZldG94dyIsCXR3bygweEYwMDAsIDB4NTAxMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmV0b3h4IiwJdHdvKDB4RjAwMCwgMHgwMDEwKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmZXRveHgiLAl0d28oMHhGMDAwLCAweDQ4MTApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZldG94eCIsCXR3bygweEYwMDAsIDB4MDAxMCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmZXRveG0xYiIsCXR3bygweEYwMDAsIDB4NTgwOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmV0b3htMWQiLAl0d28oMHhGMDAwLCAweDU0MDgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZldG94bTFsIiwJdHdvKDB4RjAwMCwgMHg0MDA4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmZXRveG0xcCIsCXR3bygweEYwMDAsIDB4NEMwOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmV0b3htMXMiLAl0d28oMHhGMDAwLCAweDQ0MDgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZldG94bTF3IiwJdHdvKDB4RjAwMCwgMHg1MDA4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmZXRveG0xeCIsCXR3bygweEYwMDAsIDB4MDAwOCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmV0b3htMXgiLAl0d28oMHhGMDAwLCAweDQ4MDgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZldG94bTF4IiwJdHdvKDB4RjAwMCwgMHgwMDA4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZnZXRleHBiIiwJdHdvKDB4RjAwMCwgMHg1ODFFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmZ2V0ZXhwZCIsCXR3bygweEYwMDAsIDB4NTQxRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmdldGV4cGwiLAl0d28oMHhGMDAwLCAweDQwMUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZnZXRleHBwIiwJdHdvKDB4RjAwMCwgMHg0QzFFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmZ2V0ZXhwcyIsCXR3bygweEYwMDAsIDB4NDQxRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmdldGV4cHciLAl0d28oMHhGMDAwLCAweDUwMUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZnZXRleHB4IiwJdHdvKDB4RjAwMCwgMHgwMDFFKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmZ2V0ZXhweCIsCXR3bygweEYwMDAsIDB4NDgxRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmdldGV4cHgiLAl0d28oMHhGMDAwLCAweDAwMUUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmdldG1hbmIiLAl0d28oMHhGMDAwLCAweDU4MUYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZnZXRtYW5kIiwJdHdvKDB4RjAwMCwgMHg1NDFGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmZ2V0bWFubCIsCXR3bygweEYwMDAsIDB4NDAxRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmdldG1hbnAiLAl0d28oMHhGMDAwLCAweDRDMUYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZnZXRtYW5zIiwJdHdvKDB4RjAwMCwgMHg0NDFGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmZ2V0bWFudyIsCXR3bygweEYwMDAsIDB4NTAxRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmdldG1hbngiLAl0d28oMHhGMDAwLCAweDAwMUYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZnZXRtYW54IiwJdHdvKDB4RjAwMCwgMHg0ODFGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmZ2V0bWFueCIsCXR3bygweEYwMDAsIDB4MDAxRiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmaW50YiIsCXR3bygweEYwMDAsIDB4NTgwMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmludGQiLAl0d28oMHhGMDAwLCAweDU0MDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZpbnRsIiwJdHdvKDB4RjAwMCwgMHg0MDAxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmaW50cCIsCXR3bygweEYwMDAsIDB4NEMwMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmludHMiLAl0d28oMHhGMDAwLCAweDQ0MDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZpbnR3IiwJdHdvKDB4RjAwMCwgMHg1MDAxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmaW50eCIsCXR3bygweEYwMDAsIDB4MDAwMSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmludHgiLAl0d28oMHhGMDAwLCAweDQ4MDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZpbnR4IiwJdHdvKDB4RjAwMCwgMHgwMDAxKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZpbnRyemIiLAl0d28oMHhGMDAwLCAweDU4MDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZpbnRyemQiLAl0d28oMHhGMDAwLCAweDU0MDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZpbnRyemwiLAl0d28oMHhGMDAwLCAweDQwMDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZpbnRyenAiLAl0d28oMHhGMDAwLCAweDRDMDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZpbnRyenMiLAl0d28oMHhGMDAwLCAweDQ0MDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZpbnRyenciLAl0d28oMHhGMDAwLCAweDUwMDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZpbnRyengiLAl0d28oMHhGMDAwLCAweDAwMDMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZpbnRyengiLAl0d28oMHhGMDAwLCAweDQ4MDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZpbnRyengiLAl0d28oMHhGMDAwLCAweDAwMDMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmxvZzEwYiIsCXR3bygweEYwMDAsIDB4NTgxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmxvZzEwZCIsCXR3bygweEYwMDAsIDB4NTQxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmxvZzEwbCIsCXR3bygweEYwMDAsIDB4NDAxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmxvZzEwcCIsCXR3bygweEYwMDAsIDB4NEMxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmxvZzEwcyIsCXR3bygweEYwMDAsIDB4NDQxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmxvZzEwdyIsCXR3bygweEYwMDAsIDB4NTAxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmxvZzEweCIsCXR3bygweEYwMDAsIDB4MDAxNSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmxvZzEweCIsCXR3bygweEYwMDAsIDB4NDgxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmxvZzEweCIsCXR3bygweEYwMDAsIDB4MDAxNSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmbG9nMmIiLAl0d28oMHhGMDAwLCAweDU4MTYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZsb2cyZCIsCXR3bygweEYwMDAsIDB4NTQxNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmxvZzJsIiwJdHdvKDB4RjAwMCwgMHg0MDE2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbG9nMnAiLAl0d28oMHhGMDAwLCAweDRDMTYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZsb2cycyIsCXR3bygweEYwMDAsIDB4NDQxNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmxvZzJ3IiwJdHdvKDB4RjAwMCwgMHg1MDE2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbG9nMngiLAl0d28oMHhGMDAwLCAweDAwMTYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZsb2cyeCIsCXR3bygweEYwMDAsIDB4NDgxNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmxvZzJ4IiwJdHdvKDB4RjAwMCwgMHgwMDE2KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZsb2duYiIsCXR3bygweEYwMDAsIDB4NTgxNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25kIiwJdHdvKDB4RjAwMCwgMHg1NDE0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmbG9nbmwiLAl0d28oMHhGMDAwLCAweDQwMTQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZsb2ducCIsCXR3bygweEYwMDAsIDB4NEMxNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25zIiwJdHdvKDB4RjAwMCwgMHg0NDE0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnciLAl0d28oMHhGMDAwLCAweDUwMTQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZsb2dueCIsCXR3bygweEYwMDAsIDB4MDAxNCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmxvZ254IiwJdHdvKDB4RjAwMCwgMHg0ODE0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmbG9nbngiLAl0d28oMHhGMDAwLCAweDAwMTQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmxvZ25wMWIiLAl0d28oMHhGMDAwLCAweDU4MDYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZsb2ducDFkIiwJdHdvKDB4RjAwMCwgMHg1NDA2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAxbCIsCXR3bygweEYwMDAsIDB4NDAwNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25wMXAiLAl0d28oMHhGMDAwLCAweDRDMDYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZsb2ducDFzIiwJdHdvKDB4RjAwMCwgMHg0NDA2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAxdyIsCXR3bygweEYwMDAsIDB4NTAwNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmxvZ25wMXgiLAl0d28oMHhGMDAwLCAweDAwMDYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZsb2ducDF4IiwJdHdvKDB4RjAwMCwgMHg0ODA2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAxeCIsCXR3bygweEYwMDAsIDB4MDAwNiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmbW9kYiIsCXR3bygweEYwMDAsIDB4NTgyMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZm1vZGQiLAl0d28oMHhGMDAwLCAweDU0MjEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZtb2RsIiwJdHdvKDB4RjAwMCwgMHg0MDIxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbW9kcCIsCXR3bygweEYwMDAsIDB4NEMyMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZm1vZHMiLAl0d28oMHhGMDAwLCAweDQ0MjEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZtb2R3IiwJdHdvKDB4RjAwMCwgMHg1MDIxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbW9keCIsCXR3bygweEYwMDAsIDB4MDAyMSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZm1vZHgiLAl0d28oMHhGMDAwLCAweDQ4MjEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi0KLXsiZm1vdmViIiwJdHdvKDB4RjAwMCwgMHg1ODAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmbW92ZWIiLAl0d28oMHhGMDAwLCAweDc4MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWlGNyRiIiwgbWZsb2F0IH0sCi17ImZtb3ZlZCIsCXR3bygweEYwMDAsIDB4NTQwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZm1vdmVkIiwJdHdvKDB4RjAwMCwgMHg3NDAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpRjd+RiIsIG1mbG9hdCB9LAoteyJmbW92ZWwiLAl0d28oMHhGMDAwLCAweDQwMDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZtb3ZlbCIsCXR3bygweEYwMDAsIDB4NjAwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaUY3JGwiLCBtZmxvYXQgfSwKLS8qIEZJWE1FOiB0aGUgbmV4dCB0d28gdmFyaWFudHMgc2hvdWxkIG5vdCBwZXJtaXQgbW92aW5nIGFuIGFkZHJlc3MKLSAgIHJlZ2lzdGVyIHRvIGFueXRoaW5nIGJ1dCB0aGUgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24gcmVnaXN0ZXIuICAqLwoteyJmbW92ZWwiLAl0d28oMHhGMDAwLCAweEEwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWlzOCVzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbCIsCXR3bygweEYwMDAsIDB4ODAwMCksIHR3bygweEYxQzAsIDB4RTNGRiksICJJaSpsczgiLCBtZmxvYXQgfSwKLXsiZm1vdmVwIiwJdHdvKDB4RjAwMCwgMHg0QzAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmbW92ZXAiLAl0d28oMHhGMDAwLCAweDZDMDApLCB0d28oMHhGMUMwLCAweEZDMDApLCAiSWlGN35wa0MiLCBtZmxvYXQgfSwKLXsiZm1vdmVwIiwJdHdvKDB4RjAwMCwgMHg3QzAwKSwgdHdvKDB4RjFDMCwgMHhGQzBGKSwgIklpRjd+cERrIiwgbWZsb2F0IH0sCi17ImZtb3ZlcyIsCXR3bygweEYwMDAsIDB4NDQwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZm1vdmVzIiwJdHdvKDB4RjAwMCwgMHg2NDAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpRjckZiIsIG1mbG9hdCB9LAoteyJmbW92ZXciLAl0d28oMHhGMDAwLCAweDUwMDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZtb3ZldyIsCXR3bygweEYwMDAsIDB4NzAwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaUY3JHciLCBtZmxvYXQgfSwKLXsiZm1vdmV4IiwJdHdvKDB4RjAwMCwgMHgwMDAwKSwgdHdvKDB4RjFGRiwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmbW92ZXgiLAl0d28oMHhGMDAwLCAweDQ4MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZtb3ZleCIsCXR3bygweEYwMDAsIDB4NjgwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaUY3fngiLCBtZmxvYXQgfSwKLQoteyJmc21vdmViIiwJdHdvKDB4RjAwMCwgMHg1ODQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZzbW92ZWQiLAl0d28oMHhGMDAwLCAweDU0NDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtb3ZlbCIsCXR3bygweEYwMDAsIDB4NDA0MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmc21vdmVzIiwJdHdvKDB4RjAwMCwgMHg0NDQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZzbW92ZXciLAl0d28oMHhGMDAwLCAweDUwNDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZnNtb3ZleCIsCXR3bygweEYwMDAsIDB4MDA0MCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc21vdmV4IiwJdHdvKDB4RjAwMCwgMHg0ODQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi17ImZzbW92ZXAiLAl0d28oMHhGMDAwLCAweDRDNDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLQoteyJmZG1vdmViIiwJdHdvKDB4RjAwMCwgMHg1ODQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkbW92ZWQiLAl0d28oMHhGMDAwLCAweDU0NDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtb3ZlbCIsCXR3bygweEYwMDAsIDB4NDA0NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmZG1vdmVzIiwJdHdvKDB4RjAwMCwgMHg0NDQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZkbW92ZXciLAl0d28oMHhGMDAwLCAweDUwNDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRtb3ZleCIsCXR3bygweEYwMDAsIDB4MDA0NCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmZG1vdmV4IiwJdHdvKDB4RjAwMCwgMHg0ODQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi17ImZkbW92ZXAiLAl0d28oMHhGMDAwLCAweDRDNDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLQoteyJmbW92ZWNyeCIsCXR3bygweEYwMDAsIDB4NUMwMCksIHR3bygweEYxRkYsIDB4RkMwMCksICJJaSNDRjciLCBtZmxvYXQgfSwKLQoteyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhGODAwKSwgdHdvKDB4RjFDMCwgMHhGRjhGKSwgIklpRGsmcyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAyMCwgMHhFODAwKSwgdHdvKDB4RjFGOCwgMHhGRjhGKSwgIklpRGstcyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhEODAwKSwgdHdvKDB4RjFDMCwgMHhGRjhGKSwgIklpJnNEayIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAxOCwgMHhEODAwKSwgdHdvKDB4RjFGOCwgMHhGRjhGKSwgIklpK3NEayIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhGMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkbDMmcyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhGMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkIzMmcyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhEMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkJnNsMyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhEMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkJnMjMyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAyMCwgMHhFMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkTDMtcyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAyMCwgMHhFMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkIzMtcyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAxOCwgMHhEMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkK3NsMyIsIG1mbG9hdCB9LAoteyJmbW92ZW14IiwJdHdvKDB4RjAxOCwgMHhEMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkK3MjMyIsIG1mbG9hdCB9LAotCi17ImZtb3ZlbWwiLAl0d28oMHhGMDAwLCAweEEwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWlzOCVzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbWwiLAl0d28oMHhGMDAwLCAweEEwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWlMOH5zIiwgbWZsb2F0IH0sCi0vKiBGSVhNRTogSW4gdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIHdlIHNob3VsZCBvbmx5IHBlcm1pdCAlZG4gaWYgdGhlCi0gICB0YXJnZXQgaXMgYSBzaW5nbGUgcmVnaXN0ZXIuICBXZSBzaG91bGQgb25seSBwZXJtaXQgJWFuIGlmIHRoZQotICAgdGFyZ2V0IGlzIGEgc2luZ2xlICVmcGlhci4gICovCi17ImZtb3ZlbWwiLAl0d28oMHhGMDAwLCAweDgwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWkqbEw4IiwgbWZsb2F0IH0sCi0KLXsiZm1vdmVtIiwJdHdvKDB4RjAyMCwgMHhFMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkTDMtcyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEYwMDApLCB0d28oMHhGMUMwLCAweEZGMDApLCAiSWRsMyZzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMTgsIDB4RDAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZCtzbDMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhEMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkJnNsMyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDIwLCAweEUwMDApLCB0d28oMHhGMUY4LCAweEZGMDApLCAiSWQjMy1zIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMjAsIDB4RTgwMCksIHR3bygweEYxRjgsIDB4RkY4RiksICJJaURrLXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhGMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkIzMmcyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEY4MDApLCB0d28oMHhGMUMwLCAweEZGOEYpLCAiSWlEayZzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMTgsIDB4RDAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZCtzIzMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAxOCwgMHhEODAwKSwgdHdvKDB4RjFGOCwgMHhGRjhGKSwgIklpK3NEayIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEQwMDApLCB0d28oMHhGMUMwLCAweEZGMDApLCAiSWQmcyMzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4RDgwMCksIHR3bygweEYxQzAsIDB4RkY4RiksICJJaSZzRGsiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhBMDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpczglcyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweDgwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWkqc3M4IiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4QTAwMCksIHR3bygweEYxQzAsIDB4RTNGRiksICJJaUw4fnMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHg4MDAwKSwgdHdvKDB4RjJDMCwgMHhFM0ZGKSwgIklpKnNMOCIsIG1mbG9hdCB9LAotCi17ImZtdWxiIiwJdHdvKDB4RjAwMCwgMHg1ODIzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmbXVsZCIsCXR3bygweEYwMDAsIDB4NTQyMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZm11bGwiLAl0d28oMHhGMDAwLCAweDQwMjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZtdWxwIiwJdHdvKDB4RjAwMCwgMHg0QzIzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmbXVscyIsCXR3bygweEYwMDAsIDB4NDQyMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZm11bHciLAl0d28oMHhGMDAwLCAweDUwMjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZtdWx4IiwJdHdvKDB4RjAwMCwgMHgwMDIzKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmbXVseCIsCXR3bygweEYwMDAsIDB4NDgyMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLQoteyJmc211bGIiLAl0d28oMHhGMDAwLCAweDU4NjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtdWxkIiwJdHdvKDB4RjAwMCwgMHg1NDYzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZzbXVsbCIsCXR3bygweEYwMDAsIDB4NDA2MyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmc211bHAiLAl0d28oMHhGMDAwLCAweDRDNjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtdWxzIiwJdHdvKDB4RjAwMCwgMHg0NDYzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZzbXVsdyIsCXR3bygweEYwMDAsIDB4NTA2MyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmc211bHgiLAl0d28oMHhGMDAwLCAweDAwNjMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtdWx4IiwJdHdvKDB4RjAwMCwgMHg0ODYzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi0KLXsiZmRtdWxiIiwJdHdvKDB4RjAwMCwgMHg1ODY3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkbXVsZCIsCXR3bygweEYwMDAsIDB4NTQ2NyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmZG11bGwiLAl0d28oMHhGMDAwLCAweDQwNjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtdWxwIiwJdHdvKDB4RjAwMCwgMHg0QzY3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZkbXVscyIsCXR3bygweEYwMDAsIDB4NDQ2NyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZG11bHciLAl0d28oMHhGMDAwLCAweDUwNjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRtdWx4IiwJdHdvKDB4RjAwMCwgMHgwMDY3KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZkbXVseCIsCXR3bygweEYwMDAsIDB4NDg2NyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAotCi17ImZuZWdiIiwJdHdvKDB4RjAwMCwgMHg1ODFBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmbmVnZCIsCXR3bygweEYwMDAsIDB4NTQxQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZm5lZ2wiLAl0d28oMHhGMDAwLCAweDQwMUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZuZWdwIiwJdHdvKDB4RjAwMCwgMHg0QzFBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmbmVncyIsCXR3bygweEYwMDAsIDB4NDQxQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZm5lZ3ciLAl0d28oMHhGMDAwLCAweDUwMUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZuZWd4IiwJdHdvKDB4RjAwMCwgMHgwMDFBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmbmVneCIsCXR3bygweEYwMDAsIDB4NDgxQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZm5lZ3giLAl0d28oMHhGMDAwLCAweDAwMUEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnNuZWdiIiwJdHdvKDB4RjAwMCwgMHg1ODVBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZzbmVnZCIsCXR3bygweEYwMDAsIDB4NTQ1QSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmc25lZ2wiLAl0d28oMHhGMDAwLCAweDQwNUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNuZWdwIiwJdHdvKDB4RjAwMCwgMHg0QzVBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZzbmVncyIsCXR3bygweEYwMDAsIDB4NDQ1QSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmc25lZ3ciLAl0d28oMHhGMDAwLCAweDUwNUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZnNuZWd4IiwJdHdvKDB4RjAwMCwgMHgwMDVBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZzbmVneCIsCXR3bygweEYwMDAsIDB4NDg1QSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmc25lZ3giLAl0d28oMHhGMDAwLCAweDAwNUEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKLQoteyJmZG5lZ2IiLAl0d28oMHhGMDAwLCAweDU4NUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRuZWdkIiwJdHdvKDB4RjAwMCwgMHg1NDVFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZkbmVnbCIsCXR3bygweEYwMDAsIDB4NDA1RSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmZG5lZ3AiLAl0d28oMHhGMDAwLCAweDRDNUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRuZWdzIiwJdHdvKDB4RjAwMCwgMHg0NDVFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZkbmVndyIsCXR3bygweEYwMDAsIDB4NTA1RSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmZG5lZ3giLAl0d28oMHhGMDAwLCAweDAwNUUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRuZWd4IiwJdHdvKDB4RjAwMCwgMHg0ODVFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi17ImZkbmVneCIsCXR3bygweEYwMDAsIDB4MDA1RSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtNjgwNDB1cCB9LAotCi17ImZub3AiLAl0d28oMHhGMjgwLCAweDAwMDApLCB0d28oMHhGRkZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLQoteyJmcmVtYiIsCXR3bygweEYwMDAsIDB4NTgyNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnJlbWQiLAl0d28oMHhGMDAwLCAweDU0MjUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZyZW1sIiwJdHdvKDB4RjAwMCwgMHg0MDI1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmcmVtcCIsCXR3bygweEYwMDAsIDB4NEMyNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnJlbXMiLAl0d28oMHhGMDAwLCAweDQ0MjUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZyZW13IiwJdHdvKDB4RjAwMCwgMHg1MDI1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmcmVteCIsCXR3bygweEYwMDAsIDB4MDAyNSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnJlbXgiLAl0d28oMHhGMDAwLCAweDQ4MjUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi0KLXsiZnJlc3RvcmUiLAlvbmUoMHhGMTQwKSwJCW9uZSgweEYxQzApLCAiSWQ8cyIsIG1mbG9hdCB9LAotCi17ImZzYXZlIiwJb25lKDB4RjEwMCksCQlvbmUoMHhGMUMwKSwgIklkPnMiLCBtZmxvYXQgfSwKLQoteyJmc2NhbGViIiwJdHdvKDB4RjAwMCwgMHg1ODI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmc2NhbGVkIiwJdHdvKDB4RjAwMCwgMHg1NDI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmc2NhbGVsIiwJdHdvKDB4RjAwMCwgMHg0MDI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmc2NhbGVwIiwJdHdvKDB4RjAwMCwgMHg0QzI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmc2NhbGVzIiwJdHdvKDB4RjAwMCwgMHg0NDI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmc2NhbGV3IiwJdHdvKDB4RjAwMCwgMHg1MDI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmc2NhbGV4IiwJdHdvKDB4RjAwMCwgMHgwMDI2KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmc2NhbGV4IiwJdHdvKDB4RjAwMCwgMHg0ODI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAotCi0vKiAkIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IHRoZSBhc3NlbWJsZXIgZnJvbSB1c2luZyBQQy1yZWxhdGl2ZS4KLSAgIElmIEAgd2VyZSB1c2VkLCAibGFiZWw6IGZzZXEgbGFiZWwiIGNvdWxkIHByb2R1Y2UgImZ0cmFwZXEiLAotICAgYmVjYXVzZSAibGFiZWwiIGJlY2FtZSAicGNAbGFiZWwiLiAgKi8KLXsiZnNlcSIsCXR3bygweEYwNDAsIDB4MDAwMSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzZiIsCQl0d28oMHhGMDQwLCAweDAwMDApLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc2dlIiwJdHdvKDB4RjA0MCwgMHgwMDEzKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNnbCIsCXR3bygweEYwNDAsIDB4MDAxNiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzZ2xlIiwJdHdvKDB4RjA0MCwgMHgwMDE3KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNndCIsCXR3bygweEYwNDAsIDB4MDAxMiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbGUiLAl0d28oMHhGMDQwLCAweDAwMTUpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc2x0IiwJdHdvKDB4RjA0MCwgMHgwMDE0KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNuZSIsCXR3bygweEYwNDAsIDB4MDAwRSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbmdlIiwJdHdvKDB4RjA0MCwgMHgwMDFDKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNuZ2wiLAl0d28oMHhGMDQwLCAweDAwMTkpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc25nbGUiLAl0d28oMHhGMDQwLCAweDAwMTgpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc25ndCIsCXR3bygweEYwNDAsIDB4MDAxRCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbmxlIiwJdHdvKDB4RjA0MCwgMHgwMDFBKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNubHQiLAl0d28oMHhGMDQwLCAweDAwMUIpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc29nZSIsCXR3bygweEYwNDAsIDB4MDAwMyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzb2dsIiwJdHdvKDB4RjA0MCwgMHgwMDA2KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNvZ3QiLAl0d28oMHhGMDQwLCAweDAwMDIpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc29sZSIsCXR3bygweEYwNDAsIDB4MDAwNSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzb2x0IiwJdHdvKDB4RjA0MCwgMHgwMDA0KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNvciIsCXR3bygweEYwNDAsIDB4MDAwNyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzc2VxIiwJdHdvKDB4RjA0MCwgMHgwMDExKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNzZiIsCXR3bygweEYwNDAsIDB4MDAxMCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzc25lIiwJdHdvKDB4RjA0MCwgMHgwMDFFKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNzdCIsCXR3bygweEYwNDAsIDB4MDAxRiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzdCIsCQl0d28oMHhGMDQwLCAweDAwMEYpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3VlcSIsCXR3bygweEYwNDAsIDB4MDAwOSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzdWdlIiwJdHdvKDB4RjA0MCwgMHgwMDBCKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnN1Z3QiLAl0d28oMHhGMDQwLCAweDAwMEEpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3VsZSIsCXR3bygweEYwNDAsIDB4MDAwRCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzdWx0IiwJdHdvKDB4RjA0MCwgMHgwMDBDKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnN1biIsCXR3bygweEYwNDAsIDB4MDAwOCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi0KLXsiZnNnbGRpdmIiLAl0d28oMHhGMDAwLCAweDU4MjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZzZ2xkaXZkIiwJdHdvKDB4RjAwMCwgMHg1NDI0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmc2dsZGl2bCIsCXR3bygweEYwMDAsIDB4NDAyNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnNnbGRpdnAiLAl0d28oMHhGMDAwLCAweDRDMjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZzZ2xkaXZzIiwJdHdvKDB4RjAwMCwgMHg0NDI0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmc2dsZGl2dyIsCXR3bygweEYwMDAsIDB4NTAyNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnNnbGRpdngiLAl0d28oMHhGMDAwLCAweDAwMjQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZzZ2xkaXZ4IiwJdHdvKDB4RjAwMCwgMHg0ODI0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmc2dsZGl2eCIsCXR3bygweEYwMDAsIDB4MDAyNCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmc2dsbXVsYiIsCXR3bygweEYwMDAsIDB4NTgyNyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnNnbG11bGQiLAl0d28oMHhGMDAwLCAweDU0MjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZzZ2xtdWxsIiwJdHdvKDB4RjAwMCwgMHg0MDI3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmc2dsbXVscCIsCXR3bygweEYwMDAsIDB4NEMyNyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnNnbG11bHMiLAl0d28oMHhGMDAwLCAweDQ0MjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZzZ2xtdWx3IiwJdHdvKDB4RjAwMCwgMHg1MDI3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmc2dsbXVseCIsCXR3bygweEYwMDAsIDB4MDAyNyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnNnbG11bHgiLAl0d28oMHhGMDAwLCAweDQ4MjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZzZ2xtdWx4IiwJdHdvKDB4RjAwMCwgMHgwMDI3KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzaW5iIiwJdHdvKDB4RjAwMCwgMHg1ODBFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmc2luZCIsCXR3bygweEYwMDAsIDB4NTQwRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnNpbmwiLAl0d28oMHhGMDAwLCAweDQwMEUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZzaW5wIiwJdHdvKDB4RjAwMCwgMHg0QzBFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmc2lucyIsCXR3bygweEYwMDAsIDB4NDQwRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnNpbnciLAl0d28oMHhGMDAwLCAweDUwMEUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZzaW54IiwJdHdvKDB4RjAwMCwgMHgwMDBFKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmc2lueCIsCXR3bygweEYwMDAsIDB4NDgwRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnNpbngiLAl0d28oMHhGMDAwLCAweDAwMEUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnNpbmNvc2IiLAl0d28oMHhGMDAwLCAweDU4MzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7YkYzRjciLCBtZmxvYXQgfSwKLXsiZnNpbmNvc2QiLAl0d28oMHhGMDAwLCAweDU0MzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7RkYzRjciLCBtZmxvYXQgfSwKLXsiZnNpbmNvc2wiLAl0d28oMHhGMDAwLCAweDQwMzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7bEYzRjciLCBtZmxvYXQgfSwKLXsiZnNpbmNvc3AiLAl0d28oMHhGMDAwLCAweDRDMzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7cEYzRjciLCBtZmxvYXQgfSwKLXsiZnNpbmNvc3MiLAl0d28oMHhGMDAwLCAweDQ0MzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7ZkYzRjciLCBtZmxvYXQgfSwKLXsiZnNpbmNvc3ciLAl0d28oMHhGMDAwLCAweDUwMzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7d0YzRjciLCBtZmxvYXQgfSwKLXsiZnNpbmNvc3giLAl0d28oMHhGMDAwLCAweDAwMzApLCB0d28oMHhGMUMwLCAweEUwNzgpLCAiSWlGOEYzRjciLCBtZmxvYXQgfSwKLXsiZnNpbmNvc3giLAl0d28oMHhGMDAwLCAweDQ4MzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7eEYzRjciLCBtZmxvYXQgfSwKLQoteyJmc2luaGIiLAl0d28oMHhGMDAwLCAweDU4MDIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZzaW5oZCIsCXR3bygweEYwMDAsIDB4NTQwMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnNpbmhsIiwJdHdvKDB4RjAwMCwgMHg0MDAyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmc2luaHAiLAl0d28oMHhGMDAwLCAweDRDMDIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZzaW5ocyIsCXR3bygweEYwMDAsIDB4NDQwMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnNpbmh3IiwJdHdvKDB4RjAwMCwgMHg1MDAyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmc2luaHgiLAl0d28oMHhGMDAwLCAweDAwMDIpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZzaW5oeCIsCXR3bygweEYwMDAsIDB4NDgwMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnNpbmh4IiwJdHdvKDB4RjAwMCwgMHgwMDAyKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzcXJ0YiIsCXR3bygweEYwMDAsIDB4NTgwNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnNxcnRkIiwJdHdvKDB4RjAwMCwgMHg1NDA0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmc3FydGwiLAl0d28oMHhGMDAwLCAweDQwMDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZzcXJ0cCIsCXR3bygweEYwMDAsIDB4NEMwNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnNxcnRzIiwJdHdvKDB4RjAwMCwgMHg0NDA0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmc3FydHciLAl0d28oMHhGMDAwLCAweDUwMDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZzcXJ0eCIsCXR3bygweEYwMDAsIDB4MDAwNCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnNxcnR4IiwJdHdvKDB4RjAwMCwgMHg0ODA0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmc3FydHgiLAl0d28oMHhGMDAwLCAweDAwMDQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnNzcXJ0YiIsCXR3bygweEYwMDAsIDB4NTg0MSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc3NxcnRkIiwJdHdvKDB4RjAwMCwgMHg1NDQxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZzc3FydGwiLAl0d28oMHhGMDAwLCAweDQwNDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzcXJ0cCIsCXR3bygweEYwMDAsIDB4NEM0MSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmc3NxcnRzIiwJdHdvKDB4RjAwMCwgMHg0NDQxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZzc3FydHciLAl0d28oMHhGMDAwLCAweDUwNDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZnNzcXJ0eCIsCXR3bygweEYwMDAsIDB4MDA0MSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc3NxcnR4IiwJdHdvKDB4RjAwMCwgMHg0ODQxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi17ImZzc3FydHgiLAl0d28oMHhGMDAwLCAweDAwNDEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKLQoteyJmZHNxcnRiIiwJdHdvKDB4RjAwMCwgMHg1ODQ1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkc3FydGQiLAl0d28oMHhGMDAwLCAweDU0NDUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzcXJ0bCIsCXR3bygweEYwMDAsIDB4NDA0NSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmZHNxcnRwIiwJdHdvKDB4RjAwMCwgMHg0QzQ1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZkc3FydHMiLAl0d28oMHhGMDAwLCAweDQ0NDUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzcXJ0dyIsCXR3bygweEYwMDAsIDB4NTA0NSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmZHNxcnR4IiwJdHdvKDB4RjAwMCwgMHgwMDQ1KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZkc3FydHgiLAl0d28oMHhGMDAwLCAweDQ4NDUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzcXJ0eCIsCXR3bygweEYwMDAsIDB4MDA0NSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtNjgwNDB1cCB9LAotCi17ImZzdWJiIiwJdHdvKDB4RjAwMCwgMHg1ODI4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmc3ViZCIsCXR3bygweEYwMDAsIDB4NTQyOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnN1YmwiLAl0d28oMHhGMDAwLCAweDQwMjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZzdWJwIiwJdHdvKDB4RjAwMCwgMHg0QzI4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmc3VicyIsCXR3bygweEYwMDAsIDB4NDQyOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnN1YnciLAl0d28oMHhGMDAwLCAweDUwMjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZzdWJ4IiwJdHdvKDB4RjAwMCwgMHgwMDI4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmc3VieCIsCXR3bygweEYwMDAsIDB4NDgyOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnN1YngiLAl0d28oMHhGMDAwLCAweDAwMjgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnNzdWJiIiwJdHdvKDB4RjAwMCwgMHg1ODY4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZzc3ViZCIsCXR3bygweEYwMDAsIDB4NTQ2OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmc3N1YmwiLAl0d28oMHhGMDAwLCAweDQwNjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzdWJwIiwJdHdvKDB4RjAwMCwgMHg0QzY4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZzc3VicyIsCXR3bygweEYwMDAsIDB4NDQ2OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmc3N1YnciLAl0d28oMHhGMDAwLCAweDUwNjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZnNzdWJ4IiwJdHdvKDB4RjAwMCwgMHgwMDY4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZzc3VieCIsCXR3bygweEYwMDAsIDB4NDg2OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmc3N1YngiLAl0d28oMHhGMDAwLCAweDAwNjgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKLQoteyJmZHN1YmIiLAl0d28oMHhGMDAwLCAweDU4NmMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzdWJkIiwJdHdvKDB4RjAwMCwgMHg1NDZjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZkc3VibCIsCXR3bygweEYwMDAsIDB4NDA2YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmZHN1YnAiLAl0d28oMHhGMDAwLCAweDRDNmMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzdWJzIiwJdHdvKDB4RjAwMCwgMHg0NDZjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZkc3VidyIsCXR3bygweEYwMDAsIDB4NTA2YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmZHN1YngiLAl0d28oMHhGMDAwLCAweDAwNmMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzdWJ4IiwJdHdvKDB4RjAwMCwgMHg0ODZjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi17ImZkc3VieCIsCXR3bygweEYwMDAsIDB4MDA2YyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtNjgwNDB1cCB9LAotCi17ImZ0YW5iIiwJdHdvKDB4RjAwMCwgMHg1ODBGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmdGFuZCIsCXR3bygweEYwMDAsIDB4NTQwRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnRhbmwiLAl0d28oMHhGMDAwLCAweDQwMEYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZ0YW5wIiwJdHdvKDB4RjAwMCwgMHg0QzBGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmdGFucyIsCXR3bygweEYwMDAsIDB4NDQwRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnRhbnciLAl0d28oMHhGMDAwLCAweDUwMEYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZ0YW54IiwJdHdvKDB4RjAwMCwgMHgwMDBGKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmdGFueCIsCXR3bygweEYwMDAsIDB4NDgwRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnRhbngiLAl0d28oMHhGMDAwLCAweDAwMEYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnRhbmhiIiwJdHdvKDB4RjAwMCwgMHg1ODA5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmdGFuaGQiLAl0d28oMHhGMDAwLCAweDU0MDkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZ0YW5obCIsCXR3bygweEYwMDAsIDB4NDAwOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnRhbmhwIiwJdHdvKDB4RjAwMCwgMHg0QzA5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmdGFuaHMiLAl0d28oMHhGMDAwLCAweDQ0MDkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZ0YW5odyIsCXR3bygweEYwMDAsIDB4NTAwOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnRhbmh4IiwJdHdvKDB4RjAwMCwgMHgwMDA5KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmdGFuaHgiLAl0d28oMHhGMDAwLCAweDQ4MDkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZ0YW5oeCIsCXR3bygweEYwMDAsIDB4MDAwOSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmdGVudG94YiIsCXR3bygweEYwMDAsIDB4NTgxMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnRlbnRveGQiLAl0d28oMHhGMDAwLCAweDU0MTIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZ0ZW50b3hsIiwJdHdvKDB4RjAwMCwgMHg0MDEyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmdGVudG94cCIsCXR3bygweEYwMDAsIDB4NEMxMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnRlbnRveHMiLAl0d28oMHhGMDAwLCAweDQ0MTIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZ0ZW50b3h3IiwJdHdvKDB4RjAwMCwgMHg1MDEyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmdGVudG94eCIsCXR3bygweEYwMDAsIDB4MDAxMiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnRlbnRveHgiLAl0d28oMHhGMDAwLCAweDQ4MTIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZ0ZW50b3h4IiwJdHdvKDB4RjAwMCwgMHgwMDEyKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZ0cmFwZXEiLAl0d28oMHhGMDdDLCAweDAwMDEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBmIiwJdHdvKDB4RjA3QywgMHgwMDAwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2UiLAl0d28oMHhGMDdDLCAweDAwMTMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBnbCIsCXR3bygweEYwN0MsIDB4MDAxNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcGdsZSIsCXR3bygweEYwN0MsIDB4MDAxNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcGd0IiwJdHdvKDB4RjA3QywgMHgwMDEyKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwbGUiLAl0d28oMHhGMDdDLCAweDAwMTUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBsdCIsCXR3bygweEYwN0MsIDB4MDAxNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG5lIiwJdHdvKDB4RjA3QywgMHgwMDBFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdlIiwJdHdvKDB4RjA3QywgMHgwMDFDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdsIiwJdHdvKDB4RjA3QywgMHgwMDE5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdsZSIsCXR3bygweEYwN0MsIDB4MDAxOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG5ndCIsCXR3bygweEYwN0MsIDB4MDAxRCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG5sZSIsCXR3bygweEYwN0MsIDB4MDAxQSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG5sdCIsCXR3bygweEYwN0MsIDB4MDAxQiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG9nZSIsCXR3bygweEYwN0MsIDB4MDAwMyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG9nbCIsCXR3bygweEYwN0MsIDB4MDAwNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG9ndCIsCXR3bygweEYwN0MsIDB4MDAwMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG9sZSIsCXR3bygweEYwN0MsIDB4MDAwNSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG9sdCIsCXR3bygweEYwN0MsIDB4MDAwNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG9yIiwJdHdvKDB4RjA3QywgMHgwMDA3KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwc2VxIiwJdHdvKDB4RjA3QywgMHgwMDExKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwc2YiLAl0d28oMHhGMDdDLCAweDAwMTApLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBzbmUiLAl0d28oMHhGMDdDLCAweDAwMUUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBzdCIsCXR3bygweEYwN0MsIDB4MDAxRiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcHQiLAl0d28oMHhGMDdDLCAweDAwMEYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXB1ZXEiLAl0d28oMHhGMDdDLCAweDAwMDkpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXB1Z2UiLAl0d28oMHhGMDdDLCAweDAwMEIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXB1Z3QiLAl0d28oMHhGMDdDLCAweDAwMEEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXB1bGUiLAl0d28oMHhGMDdDLCAweDAwMEQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXB1bHQiLAl0d28oMHhGMDdDLCAweDAwMEMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXB1biIsCXR3bygweEYwN0MsIDB4MDAwOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAotICAgICAgICAKLXsiZnRyYXBlcXciLAl0d28oMHhGMDdBLCAweDAwMDEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcGZ3IiwJdHdvKDB4RjA3QSwgMHgwMDAwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBnZXciLAl0d28oMHhGMDdBLCAweDAwMTMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcGdsdyIsCXR3bygweEYwN0EsIDB4MDAxNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2xldyIsCXR3bygweEYwN0EsIDB4MDAxNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwZ3R3IiwJdHdvKDB4RjA3QSwgMHgwMDEyKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBsZXciLAl0d28oMHhGMDdBLCAweDAwMTUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcGx0dyIsCXR3bygweEYwN0EsIDB4MDAxNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbmV3IiwJdHdvKDB4RjA3QSwgMHgwMDBFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ2V3IiwJdHdvKDB4RjA3QSwgMHgwMDFDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ2x3IiwJdHdvKDB4RjA3QSwgMHgwMDE5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ2xldyIsCXR3bygweEYwN0EsIDB4MDAxOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbmd0dyIsCXR3bygweEYwN0EsIDB4MDAxRCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbmxldyIsCXR3bygweEYwN0EsIDB4MDAxQSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbmx0dyIsCXR3bygweEYwN0EsIDB4MDAxQiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwb2dldyIsCXR3bygweEYwN0EsIDB4MDAwMyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwb2dsdyIsCXR3bygweEYwN0EsIDB4MDAwNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwb2d0dyIsCXR3bygweEYwN0EsIDB4MDAwMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwb2xldyIsCXR3bygweEYwN0EsIDB4MDAwNSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwb2x0dyIsCXR3bygweEYwN0EsIDB4MDAwNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwb3J3IiwJdHdvKDB4RjA3QSwgMHgwMDA3KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBzZXF3IiwJdHdvKDB4RjA3QSwgMHgwMDExKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBzZnciLAl0d28oMHhGMDdBLCAweDAwMTApLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHNuZXciLAl0d28oMHhGMDdBLCAweDAwMUUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHN0dyIsCXR3bygweEYwN0EsIDB4MDAxRiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwdHciLAl0d28oMHhGMDdBLCAweDAwMEYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHVlcXciLAl0d28oMHhGMDdBLCAweDAwMDkpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHVnZXciLAl0d28oMHhGMDdBLCAweDAwMEIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHVndHciLAl0d28oMHhGMDdBLCAweDAwMEEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHVsZXciLAl0d28oMHhGMDdBLCAweDAwMEQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHVsdHciLAl0d28oMHhGMDdBLCAweDAwMEMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHVudyIsCXR3bygweEYwN0EsIDB4MDAwOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi0KLXsiZnRyYXBlcWwiLAl0d28oMHhGMDdCLCAweDAwMDEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcGZsIiwJdHdvKDB4RjA3QiwgMHgwMDAwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBnZWwiLAl0d28oMHhGMDdCLCAweDAwMTMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcGdsbCIsCXR3bygweEYwN0IsIDB4MDAxNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2xlbCIsCXR3bygweEYwN0IsIDB4MDAxNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwZ3RsIiwJdHdvKDB4RjA3QiwgMHgwMDEyKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBsZWwiLAl0d28oMHhGMDdCLCAweDAwMTUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcGx0bCIsCXR3bygweEYwN0IsIDB4MDAxNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmVsIiwJdHdvKDB4RjA3QiwgMHgwMDBFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ2VsIiwJdHdvKDB4RjA3QiwgMHgwMDFDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ2xsIiwJdHdvKDB4RjA3QiwgMHgwMDE5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ2xlbCIsCXR3bygweEYwN0IsIDB4MDAxOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmd0bCIsCXR3bygweEYwN0IsIDB4MDAxRCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmxlbCIsCXR3bygweEYwN0IsIDB4MDAxQSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmx0bCIsCXR3bygweEYwN0IsIDB4MDAxQiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwb2dlbCIsCXR3bygweEYwN0IsIDB4MDAwMyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwb2dsbCIsCXR3bygweEYwN0IsIDB4MDAwNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwb2d0bCIsCXR3bygweEYwN0IsIDB4MDAwMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwb2xlbCIsCXR3bygweEYwN0IsIDB4MDAwNSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwb2x0bCIsCXR3bygweEYwN0IsIDB4MDAwNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwb3JsIiwJdHdvKDB4RjA3QiwgMHgwMDA3KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBzZXFsIiwJdHdvKDB4RjA3QiwgMHgwMDExKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBzZmwiLAl0d28oMHhGMDdCLCAweDAwMTApLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHNuZWwiLAl0d28oMHhGMDdCLCAweDAwMUUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHN0bCIsCXR3bygweEYwN0IsIDB4MDAxRiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwdGwiLAl0d28oMHhGMDdCLCAweDAwMEYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHVlcWwiLAl0d28oMHhGMDdCLCAweDAwMDkpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHVnZWwiLAl0d28oMHhGMDdCLCAweDAwMEIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHVndGwiLAl0d28oMHhGMDdCLCAweDAwMEEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHVsZWwiLAl0d28oMHhGMDdCLCAweDAwMEQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHVsdGwiLAl0d28oMHhGMDdCLCAweDAwMEMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHVubCIsCXR3bygweEYwN0IsIDB4MDAwOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi0KLXsiZnRzdGIiLAl0d28oMHhGMDAwLCAweDU4M0EpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YiIsIG1mbG9hdCB9LAoteyJmdHN0ZCIsCXR3bygweEYwMDAsIDB4NTQzQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGIiwgbWZsb2F0IH0sCi17ImZ0c3RsIiwJdHdvKDB4RjAwMCwgMHg0MDNBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2wiLCBtZmxvYXQgfSwKLXsiZnRzdHAiLAl0d28oMHhGMDAwLCAweDRDM0EpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cCIsIG1mbG9hdCB9LAoteyJmdHN0cyIsCXR3bygweEYwMDAsIDB4NDQzQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmIiwgbWZsb2F0IH0sCi17ImZ0c3R3IiwJdHdvKDB4RjAwMCwgMHg1MDNBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3ciLCBtZmxvYXQgfSwKLXsiZnRzdHgiLAl0d28oMHhGMDAwLCAweDAwM0EpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOCIsIG1mbG9hdCB9LAoteyJmdHN0eCIsCXR3bygweEYwMDAsIDB4NDgzQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4IiwgbWZsb2F0IH0sCi0KLXsiZnR3b3RveGIiLAl0d28oMHhGMDAwLCAweDU4MTEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZ0d290b3hkIiwJdHdvKDB4RjAwMCwgMHg1NDExKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmdHdvdG94bCIsCXR3bygweEYwMDAsIDB4NDAxMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnR3b3RveHAiLAl0d28oMHhGMDAwLCAweDRDMTEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZ0d290b3hzIiwJdHdvKDB4RjAwMCwgMHg0NDExKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmdHdvdG94dyIsCXR3bygweEYwMDAsIDB4NTAxMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnR3b3RveHgiLAl0d28oMHhGMDAwLCAweDAwMTEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZ0d290b3h4IiwJdHdvKDB4RjAwMCwgMHg0ODExKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmdHdvdG94eCIsCXR3bygweEYwMDAsIDB4MDAxMSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJoYWx0IiwJb25lKDAwNDUzMTApLAlvbmUoMDE3Nzc3NyksICIiLCAgICAgbTY4MDYwIHwgbWNmNTIwMCB9LAotCi17ImlsbGVnYWwiLAlvbmUoMDA0NTM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsICAgICBtNjgwMDB1cCB9LAotCi17ImptcCIsCQlvbmUoMDA0NzMwMCksCW9uZSgwMTc3NzAwKSwgIiFzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi0KLXsianJhIiwJCW9uZSgwMDYwMDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsianJhIiwJCW9uZSgwMDQ3MzAwKSwJb25lKDAxNzc3MDApLCAiIXMiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLQoteyJqc3IiLAkJb25lKDAwNDcyMDApLAlvbmUoMDE3NzcwMCksICIhcyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAotCi17Impic3IiLAlvbmUoMDA2MDQwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi17Impic3IiLAlvbmUoMDA0NzIwMCksCW9uZSgwMTc3NzAwKSwgIiFzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi0KLXsibGVhIiwJCW9uZSgwMDQwNzAwKSwJb25lKDAxNzA3MDApLCAiIXNBZCIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAotCi17Imxwc3RvcCIsCXR3bygwMTc0MDAwLDAwMDA3MDApLHR3bygwMTc3Nzc3LDAxNzc3NzcpLCIjdyIsIGNwdTMyfG02ODA2MCB9LAotCi17Imxpbmt3IiwJb25lKDAwNDcxMjApLAlvbmUoMDE3Nzc3MCksICJBcyN3IiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi17ImxpbmtsIiwJb25lKDAwNDQwMTApLAlvbmUoMDE3Nzc3MCksICJBcyNsIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJsaW5rIiwJb25lKDAwNDcxMjApLAlvbmUoMDE3Nzc3MCksICJBcyNXIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi17ImxpbmsiLAlvbmUoMDA0NDAxMCksCW9uZSgwMTc3NzcwKSwgIkFzI2wiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi0KLXsibHNsYiIsCW9uZSgwMTYwNDEwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImxzbGIiLAlvbmUoMDE2MDQ1MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJsc2x3IiwJb25lKDAxNjA1MTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsibHNsdyIsCW9uZSgwMTYwNTUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImxzbHciLAlvbmUoMDE2MTcwMCksCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJsc2xsIiwJb25lKDAxNjA2MTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi17ImxzbGwiLAlvbmUoMDE2MDY1MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLQoteyJsc3JiIiwJb25lKDAxNjAwMTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsibHNyYiIsCW9uZSgwMTYwMDUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImxzcnciLAlvbmUoMDE2MDExMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJsc3J3IiwJb25lKDAxNjAxNTApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsibHNydyIsCW9uZSgwMTYxMzAwKSwJb25lKDAxNzc3MDApLCAifnMiLCAgIG02ODAwMHVwIH0sCi17ImxzcmwiLAlvbmUoMDE2MDIxMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsibHNybCIsCW9uZSgwMTYwMjUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAotCi0vKiBOT1RFOiBUaGUgbWNmNTIwMCBmYW1pbHkgcHJvZ3JhbW1lcidzIHJlZmVyZW5jZSBtYW51YWwgZG9lcyBub3QgCi0gICBpbmRpY2F0ZSB0aGUgYnl0ZSBmb3JtIG9mIHRoZSBtb3ZlYSBpbnN0cnVjdGlvbiBpcyBpbnZhbGlkIChhcyBpdAotICAgaXMgb24gNjgwMDAgZmFtaWx5IGNwdXMpLiAgSG93ZXZlciwgZXhwZXJpbWVudHMgb24gdGhlIDUyMDIgeWVpbGQKLSAgIHVuZXhwZWN0ZWQgcmVzdWx0cy4gIFRoZSB2YWx1ZSBpcyBjb3BpZWQsIGJ1dCBpdCBpcyBub3Qgc2lnbiBleHRlbmRlZAotICAgKGFzIGlzIGRvbmUgd2l0aCBtb3ZlYS53KSBhbmQgdGhlIHRvcCB0aHJlZSBieXRlcyBpbiB0aGUgYWRkcmVzcyAKLSAgIHJlZ2lzdGVyIGFyZSBub3QgZGlzdHVyYmVkLiAgSSBkb24ndCBrbm93IGlmIHRoaXMgaXMgdGhlIGludGVuZGVkCi0gICBiZWhhdmlvciAtLS0gaXQgY291bGQgYmUgYSBob2xlIGluIGluc3RydWN0aW9uIGRlY29kaW5nIChNb3Rvcm9sYQotICAgZGVjaWRlZCBub3QgdG8gdHJhcCBhbGwgaW52YWxpZCBpbnN0cnVjdGlvbnMgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMpCi0gICAtLS0gYnV0IEkgc3VzcGVjdCB0aGF0IGl0IGlzIG5vdC4gICAKLQotICAgSSByZXBvcnRlZCB0aGlzIHRvIE1vdG9yb2xhIElTRCBUZWNobmljYWwgQ29tbXVuaWNhdGlvbnMgU3VwcG9ydCwgCi0gICB3aGljaCByZXBsaWVkIHRoYXQgb3RoZXIgY29sZGZpcmUgYXNzZW1ibGVycyByZWplY3QgbW92ZWEuYi4gIEZvciAKLSAgIHRoaXMgcmVhc29uIEkndmUgZGVjaWRlZCB0byBub3QgYWxsb3cgbW92ZWFiLiAKLQotCWp0Y0BjeWdudXMuY29tIC0gOTcvMDEvMjQKLSAqLwotCi17Im1vdmVhbCIsCW9uZSgwMDIwMTAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJtb3ZlYXciLAlvbmUoMDAzMDEwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLQoteyJtb3ZlYyIsCW9uZSgwMDQ3MTczKSwJb25lKDAxNzc3NzcpLCAiUjFKaiIsIG02ODAxMHVwIHwgbWNmNTIwMCB9LAoteyJtb3ZlYyIsCW9uZSgwMDQ3MTczKSwJb25lKDAxNzc3NzcpLCAiUjEjaiIsIG02ODAxMHVwIHwgbWNmNTIwMCB9LAoteyJtb3ZlYyIsCW9uZSgwMDQ3MTcyKSwJb25lKDAxNzc3NzcpLCAiSmpSMSIsIG02ODAxMHVwIH0sCi17Im1vdmVjIiwJb25lKDAwNDcxNzIpLAlvbmUoMDE3Nzc3NyksICIjalIxIiwgbTY4MDEwdXAgfSwKLQoteyJtb3ZlbXciLAlvbmUoMDA0NDIwMCksCW9uZSgwMTc3NzAwKSwgIkx3JnMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbXciLAlvbmUoMDA0NDI0MCksCW9uZSgwMTc3NzcwKSwgImx3LXMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbXciLAlvbmUoMDA0NDIwMCksCW9uZSgwMTc3NzAwKSwgIiN3PnMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbXciLAlvbmUoMDA0NjIwMCksCW9uZSgwMTc3NzAwKSwgIjxzTHciLCBtNjgwMDB1cCB9LAoteyJtb3ZlbXciLAlvbmUoMDA0NjIwMCksCW9uZSgwMTc3NzAwKSwgIjxzI3ciLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDMwMCksCW9uZSgwMTc3NzAwKSwgIkx3JnMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDM0MCksCW9uZSgwMTc3NzcwKSwgImx3LXMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDMwMCksCW9uZSgwMTc3NzAwKSwgIiN3PnMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NjMwMCksCW9uZSgwMTc3NzAwKSwgIjxzTHciLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NjMwMCksCW9uZSgwMTc3NzAwKSwgIjxzI3ciLCBtNjgwMDB1cCB9LAotLyogRklYTUU6IG5lZWQgc3BlY2lmaWVyIGZvciBtb2RlIDIgYW5kIDUgdG8gc2ltcGxpZnkgYmVsb3cgaW5zbiBwYXR0ZXJucyAqLwoteyJtb3ZlbWwiLAlvbmUoMDA0NDMyMCksCW9uZSgwMTc3NzcwKSwgIkx3YXMiLCBtY2Y1MjAwIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ0MzIwKSwJb25lKDAxNzc3NzApLCAiI3dhcyIsIG1jZjUyMDAgfSwKLXsibW92ZW1sIiwJb25lKDAwNDQzNTApLAlvbmUoMDE3Nzc3MCksICJMd2RzIiwgbWNmNTIwMCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDM1MCksCW9uZSgwMTc3NzcwKSwgIiN3ZHMiLCBtY2Y1MjAwIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ2MzIwKSwJb25lKDAxNzc3NzApLCAiYXNMdyIsIG1jZjUyMDAgfSwKLXsibW92ZW1sIiwJb25lKDAwNDYzMjApLAlvbmUoMDE3Nzc3MCksICJhcyN3IiwgbWNmNTIwMCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NjM1MCksCW9uZSgwMTc3NzcwKSwgImRzTHciLCBtY2Y1MjAwIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ2MzUwKSwJb25lKDAxNzc3NzApLCAiZHMjdyIsIG1jZjUyMDAgfSwKLQoteyJtb3ZlcHciLAlvbmUoMDAwMDQxMCksCW9uZSgwMTcwNzcwKSwgImRzRGQiLCBtNjgwMDB1cCB9LAoteyJtb3ZlcHciLAlvbmUoMDAwMDYxMCksCW9uZSgwMTcwNzcwKSwgIkRkZHMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlcGwiLAlvbmUoMDAwMDUxMCksCW9uZSgwMTcwNzcwKSwgImRzRGQiLCBtNjgwMDB1cCB9LAoteyJtb3ZlcGwiLAlvbmUoMDAwMDcxMCksCW9uZSgwMTcwNzcwKSwgIkRkZHMiLCBtNjgwMDB1cCB9LAotCi17Im1vdmVxIiwJb25lKDAwNzAwMDApLAlvbmUoMDE3MDQwMCksICJNc0RkIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi17Im1vdmVxIiwJb25lKDAwNzAwMDApLAlvbmUoMDE3MDQwMCksICIjQkRkIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi0KLS8qIFRoZSBtb3ZlIG9wY29kZSBjYW4gZ2VuZXJhdGUgdGhlIG1vdmVhIGFuZCBtb3ZlcSBpbnN0cnVjdGlvbnMuICAqLwoteyJtb3ZlYiIsCW9uZSgwMDEwMDAwKSwJb25lKDAxNzAwMDApLCAiO2IkZCIsIG02ODAwMHVwIH0sCi17Im1vdmViIiwJb25lKDAwMTAwMDApLAlvbmUoMDE3MDAwMCksICJtcyVkIiwgbWNmNTIwMCB9LAoteyJtb3ZlYiIsCW9uZSgwMDEwMDAwKSwJb25lKDAxNzAwMDApLCAibnNwZCIsIG1jZjUyMDAgfSwKLXsibW92ZWIiLAlvbmUoMDAxMDAwMCksCW9uZSgwMTcwMDAwKSwgIm9ibWQiLCBtY2Y1MjAwIH0sCi0KLXsibW92ZXciLAlvbmUoMDAzMDAwMCksCW9uZSgwMTcwMDAwKSwgIip3JWQiLCBtNjgwMDB1cCB9LAoteyJtb3ZldyIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAibXMlZCIsIG1jZjUyMDAgfSwKLXsibW92ZXciLAlvbmUoMDAzMDAwMCksCW9uZSgwMTcwMDAwKSwgIm5zcGQiLCBtY2Y1MjAwIH0sCi17Im1vdmV3IiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICJvd21kIiwgbWNmNTIwMCB9LAoteyJtb3ZldyIsCW9uZSgwMDQwMzAwKSwJb25lKDAxNzc3MDApLCAiU3MkcyIsIG02ODAwMHVwIH0sCi17Im1vdmV3IiwJb25lKDAwNDAzMDApLAlvbmUoMDE3Nzc3MCksICJTc0RzIiwgbWNmNTIwMCB9LAoteyJtb3ZldyIsCW9uZSgwMDQxMzAwKSwJb25lKDAxNzc3MDApLCAiQ3MkcyIsIG02ODAxMHVwIH0sCi17Im1vdmV3IiwJb25lKDAwNDEzMDApLAlvbmUoMDE3Nzc3MCksICJDc0RzIiwgbWNmNTIwMCB9LAoteyJtb3ZldyIsCW9uZSgwMDQyMzAwKSwJb25lKDAxNzc3MDApLCAiO3dDZCIsIG02ODAwMHVwIH0sCi17Im1vdmV3IiwJb25lKDAwNDIzMDApLAlvbmUoMDE3NzcwMCksICJEc0NkIiwgbWNmNTIwMCB9LAoteyJtb3ZldyIsCW9uZSgwMDQyMzc0KSwJb25lKDAxNzc3NzcpLCAiI3dDZCIsIG1jZjUyMDAgfSwKLXsibW92ZXciLAlvbmUoMDA0MzMwMCksCW9uZSgwMTc3NzAwKSwgIjt3U2QiLCBtNjgwMDB1cCB9LAoteyJtb3ZldyIsCW9uZSgwMDQzMzAwKSwJb25lKDAxNzc3MDApLCAiRHNTZCIsIG1jZjUyMDAgfSwKLXsibW92ZXciLAlvbmUoMDA0MzM3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U2QiLCBtY2Y1MjAwIH0sCi0KLXsibW92ZWwiLAlvbmUoMDA3MDAwMCksCW9uZSgwMTcwNDAwKSwgIk1zRGQiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLXsibW92ZWwiLAlvbmUoMDAyMDAwMCksCW9uZSgwMTcwMDAwKSwgIipsJWQiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbCIsCW9uZSgwMDIwMDAwKSwJb25lKDAxNzAwMDApLCAibXMlZCIsIG1jZjUyMDAgfSwKLXsibW92ZWwiLAlvbmUoMDAyMDAwMCksCW9uZSgwMTcwMDAwKSwgIm5zcGQiLCBtY2Y1MjAwIH0sCi17Im1vdmVsIiwJb25lKDAwMjAwMDApLAlvbmUoMDE3MDAwMCksICJvbG1kIiwgbWNmNTIwMCB9LAoteyJtb3ZlbCIsCW9uZSgwMDQ3MTQwKSwJb25lKDAxNzc3NzApLCAiQXNVZCIsIG02ODAwMHVwIH0sCi17Im1vdmVsIiwJb25lKDAwNDcxNTApLAlvbmUoMDE3Nzc3MCksICJVZEFzIiwgbTY4MDAwdXAgfSwKLQoteyJtb3ZlIiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICIqdyVkIiwgbTY4MDAwdXAgfSwKLXsibW92ZSIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAibXMlZCIsIG1jZjUyMDAgfSwKLXsibW92ZSIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAibnNwZCIsIG1jZjUyMDAgfSwKLXsibW92ZSIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAib3dtZCIsIG1jZjUyMDAgfSwKLXsibW92ZSIsCW9uZSgwMDQwMzAwKSwJb25lKDAxNzc3MDApLCAiU3MkcyIsIG02ODAwMHVwIH0sCi17Im1vdmUiLAlvbmUoMDA0MDMwMCksCW9uZSgwMTc3NzcwKSwgIlNzRHMiLCBtY2Y1MjAwIH0sCi17Im1vdmUiLAlvbmUoMDA0MTMwMCksCW9uZSgwMTc3NzAwKSwgIkNzJHMiLCBtNjgwMTB1cCB9LAoteyJtb3ZlIiwJb25lKDAwNDEzMDApLAlvbmUoMDE3Nzc3MCksICJDc0RzIiwgbWNmNTIwMCB9LAoteyJtb3ZlIiwJb25lKDAwNDIzMDApLAlvbmUoMDE3NzcwMCksICI7d0NkIiwgbTY4MDAwdXAgfSwKLXsibW92ZSIsCW9uZSgwMDQyMzAwKSwJb25lKDAxNzc3MDApLCAiRHNDZCIsIG1jZjUyMDAgfSwKLXsibW92ZSIsCW9uZSgwMDQyMzc0KSwJb25lKDAxNzc3NzcpLCAiI3dDZCIsIG1jZjUyMDAgfSwKLXsibW92ZSIsCW9uZSgwMDQzMzAwKSwJb25lKDAxNzc3MDApLCAiO3dTZCIsIG02ODAwMHVwIH0sCi17Im1vdmUiLAlvbmUoMDA0MzMwMCksCW9uZSgwMTc3NzAwKSwgIkRzU2QiLCBtY2Y1MjAwIH0sCi17Im1vdmUiLAlvbmUoMDA0MzM3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U2QiLCBtY2Y1MjAwIH0sCi0KLXsibW92ZSIsCW9uZSgwMDQ3MTQwKSwJb25lKDAxNzc3NzApLCAiQXNVZCIsIG02ODAwMHVwIH0sCi17Im1vdmUiLAlvbmUoMDA0NzE1MCksCW9uZSgwMTc3NzcwKSwgIlVkQXMiLCBtNjgwMDB1cCB9LAotCi17Im1vdmVzYiIsCXR3bygwMDA3MDAwLCAwKSwgICAgIHR3bygwMTc3NzAwLCAwNzc3NyksICJ+c1IxIiwgbTY4MDEwdXAgfSwKLXsibW92ZXNiIiwJdHdvKDAwMDcwMDAsIDA0MDAwKSwgdHdvKDAxNzc3MDAsIDA3Nzc3KSwgIlIxfnMiLCBtNjgwMTB1cCB9LAoteyJtb3Zlc3ciLAl0d28oMDAwNzEwMCwgMCksICAgICB0d28oMDE3NzcwMCwgMDc3NzcpLCAifnNSMSIsIG02ODAxMHVwIH0sCi17Im1vdmVzdyIsCXR3bygwMDA3MTAwLCAwNDAwMCksIHR3bygwMTc3NzAwLCAwNzc3NyksICJSMX5zIiwgbTY4MDEwdXAgfSwKLXsibW92ZXNsIiwJdHdvKDAwMDcyMDAsIDApLCAgICAgdHdvKDAxNzc3MDAsIDA3Nzc3KSwgIn5zUjEiLCBtNjgwMTB1cCB9LAoteyJtb3Zlc2wiLAl0d28oMDAwNzIwMCwgMDQwMDApLCB0d28oMDE3NzcwMCwgMDc3NzcpLCAiUjF+cyIsIG02ODAxMHVwIH0sCi0KLXsibW92ZTE2IiwJdHdvKDB4ZjYyMCwgMHg4MDAwKSwgdHdvKDB4ZmZmOCwgMHg4ZmZmKSwgIitzKzEiLCBtNjgwNDB1cCB9LAoteyJtb3ZlMTYiLAlvbmUoMHhmNjAwKSwJCW9uZSgweGZmZjgpLCAiK3NfTCIsIG02ODA0MHVwIH0sCi17Im1vdmUxNiIsCW9uZSgweGY2MDgpLAkJb25lKDB4ZmZmOCksICJfTCtzIiwgbTY4MDQwdXAgfSwKLXsibW92ZTE2IiwJb25lKDB4ZjYxMCksCQlvbmUoMHhmZmY4KSwgImFzX0wiLCBtNjgwNDB1cCB9LAoteyJtb3ZlMTYiLAlvbmUoMHhmNjE4KSwJCW9uZSgweGZmZjgpLCAiX0xhcyIsIG02ODA0MHVwIH0sCi0KLXsibXVsc3ciLAlvbmUoMDE0MDcwMCksCQlvbmUoMDE3MDcwMCksICI7d0RkIiwgbTY4MDAwdXB8bWNmNTIwMCB9LAoteyJtdWxzbCIsCXR3bygwMDQ2MDAwLDAwNDAwMCksIHR3bygwMTc3NzAwLDAxMDc3NzApLCAiO2xEMSIsIG02ODAyMHVwfGNwdTMyIH0sCi17Im11bHNsIiwJdHdvKDAwNDYwMDAsMDA0MDAwKSwgdHdvKDAxNzc3MDAsMDEwNzc3MCksICJxc0QxIiwgbWNmNTIwMCB9LAoteyJtdWxzbCIsCXR3bygwMDQ2MDAwLDAwNjAwMCksIHR3bygwMTc3NzAwLDAxMDc3NzApLCAiO2xEM0QxIixtNjgwMjB1cHxjcHUzMiB9LAotCi17Im11bHV3IiwJb25lKDAxNDAzMDApLAkJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwfG1jZjUyMDAgfSwKLXsibXVsdWwiLAl0d28oMDA0NjAwMCwwMDAwMDApLCB0d28oMDE3NzcwMCwwMTA3NzcwKSwgIjtsRDEiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJtdWx1bCIsCXR3bygwMDQ2MDAwLDAwMDAwMCksIHR3bygwMTc3NzAwLDAxMDc3NzApLCAicXNEMSIsIG1jZjUyMDAgfSwKLXsibXVsdWwiLAl0d28oMDA0NjAwMCwwMDIwMDApLCB0d28oMDE3NzcwMCwwMTA3NzcwKSwgIjtsRDNEMSIsbTY4MDIwdXB8Y3B1MzIgfSwKLQoteyJuYmNkIiwJb25lKDAwNDQwMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi0KLXsibmVnYiIsCW9uZSgwMDQyMDAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJuZWd3IiwJb25lKDAwNDIxMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5lZ2wiLAlvbmUoMDA0MjIwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsibmVnbCIsCW9uZSgwMDQyMjAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2Y1MjAwfSwKLQoteyJuZWd4YiIsCW9uZSgwMDQwMDAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJuZWd4dyIsCW9uZSgwMDQwMTAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJuZWd4bCIsCW9uZSgwMDQwMjAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJuZWd4bCIsCW9uZSgwMDQwMjAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2Y1MjAwfSwKLQoteyJub3AiLAkJb25lKDAwNDcxNjEpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMDB1cCB8IG1jZjUyMDB9LAotCi17Im5vdGIiLAlvbmUoMDA0MzAwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsibm90dyIsCW9uZSgwMDQzMTAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJub3RsIiwJb25lKDAwNDMyMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5vdGwiLAlvbmUoMDA0MzIwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmNTIwMH0sCi0KLXsib3JpYiIsCW9uZSgwMDAwMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17Im9yaWIiLAlvbmUoMDAwMDA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJvcml3IiwJb25lKDAwMDAxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsib3JpdyIsCW9uZSgwMDAwMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17Im9yaWwiLAlvbmUoMDAwMDIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJvcmlsIiwJb25lKDAwMDAyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmNTIwMCB9LAoteyJvcmkiLAkJb25lKDAwMDAwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsib3JpIiwJCW9uZSgwMDAwMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17Im9yaSIsCQlvbmUoMDAwMDE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAotCi0vKiBUaGUgb3Igb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgb3JpIGluc3RydWN0aW9uLiAgKi8KLXsib3JiIiwJCW9uZSgwMDAwMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17Im9yYiIsCQlvbmUoMDAwMDA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJvcmIiLAkJb25lKDAxMDAwMDApLAlvbmUoMDE3MDcwMCksICI7YkRkIiwgbTY4MDAwdXAgfSwKLXsib3JiIiwJCW9uZSgwMTAwNDAwKSwJb25lKDAxNzA3MDApLCAiRGR+cyIsIG02ODAwMHVwIH0sCi17Im9ydyIsCQlvbmUoMDAwMDEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJvcnciLAkJb25lKDAwMDAxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsib3J3IiwJCW9uZSgwMTAwMTAwKSwJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwIH0sCi17Im9ydyIsCQlvbmUoMDEwMDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnMiLCBtNjgwMDB1cCB9LAoteyJvcmwiLAkJb25lKDAwMDAyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsib3JsIiwJCW9uZSgwMDAwMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZjUyMDAgfSwKLXsib3JsIiwJCW9uZSgwMTAwMjAwKSwJb25lKDAxNzA3MDApLCAiO2xEZCIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJvcmwiLAkJb25lKDAxMDA2MDApLAlvbmUoMDE3MDcwMCksICJEZH5zIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi17Im9yIiwJCW9uZSgwMDAwMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17Im9yIiwJCW9uZSgwMDAwMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17Im9yIiwJCW9uZSgwMDAwMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17Im9yIiwJCW9uZSgwMTAwMTAwKSwJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwIH0sCi17Im9yIiwJCW9uZSgwMTAwNTAwKSwJb25lKDAxNzA3MDApLCAiRGR+cyIsIG02ODAwMHVwIH0sCi0KLXsicGFjayIsCW9uZSgwMTAwNTAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCN3IiwgbTY4MDIwdXAgfSwKLXsicGFjayIsCW9uZSgwMTAwNTEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCN3IiwgbTY4MDIwdXAgfSwKLQoteyJwYmFjIiwJb25lKDB4ZjA4NyksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiYWN3IiwJb25lKDB4ZjA4NyksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiYXMiLAlvbmUoMHhmMDg2KSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJhc3ciLAlvbmUoMHhmMDg2KSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJiYyIsCW9uZSgweGYwODEpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmJjdyIsCW9uZSgweGYwODEpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmJzIiwJb25lKDB4ZjA4MCksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiYnN3IiwJb25lKDB4ZjA4MCksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiY2MiLAlvbmUoMHhmMDhmKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJjY3ciLAlvbmUoMHhmMDhmKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJjcyIsCW9uZSgweGYwOGUpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmNzdyIsCW9uZSgweGYwOGUpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmdjIiwJb25lKDB4ZjA4ZCksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiZ2N3IiwJb25lKDB4ZjA4ZCksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiZ3MiLAlvbmUoMHhmMDhjKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJnc3ciLAlvbmUoMHhmMDhjKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJpYyIsCW9uZSgweGYwOGIpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmljdyIsCW9uZSgweGYwOGIpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmlzIiwJb25lKDB4ZjA4YSksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiaXN3IiwJb25lKDB4ZjA4YSksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBibGMiLAlvbmUoMHhmMDgzKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJsY3ciLAlvbmUoMHhmMDgzKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJscyIsCW9uZSgweGYwODIpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmxzdyIsCW9uZSgweGYwODIpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYnNjIiwJb25lKDB4ZjA4NSksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBic2N3IiwJb25lKDB4ZjA4NSksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBic3MiLAlvbmUoMHhmMDg0KSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJzc3ciLAlvbmUoMHhmMDg0KSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJ3YyIsCW9uZSgweGYwODkpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYndjdyIsCW9uZSgweGYwODkpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYndzIiwJb25lKDB4ZjA4OCksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBid3N3IiwJb25lKDB4ZjA4OCksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi0KLXsicGRiYWMiLAl0d28oMHhmMDQ4LCAweDAwMDcpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJhcyIsCXR3bygweGYwNDgsIDB4MDAwNiksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmJjIiwJdHdvKDB4ZjA0OCwgMHgwMDAxKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiYnMiLAl0d28oMHhmMDQ4LCAweDAwMDApLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJjYyIsCXR3bygweGYwNDgsIDB4MDAwZiksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmNzIiwJdHdvKDB4ZjA0OCwgMHgwMDBlKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiZ2MiLAl0d28oMHhmMDQ4LCAweDAwMGQpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJncyIsCXR3bygweGYwNDgsIDB4MDAwYyksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmljIiwJdHdvKDB4ZjA0OCwgMHgwMDBiKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiaXMiLAl0d28oMHhmMDQ4LCAweDAwMGEpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJsYyIsCXR3bygweGYwNDgsIDB4MDAwMyksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmxzIiwJdHdvKDB4ZjA0OCwgMHgwMDAyKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRic2MiLAl0d28oMHhmMDQ4LCAweDAwMDUpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJzcyIsCXR3bygweGYwNDgsIDB4MDAwNCksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYndjIiwJdHdvKDB4ZjA0OCwgMHgwMDA5KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRid3MiLAl0d28oMHhmMDQ4LCAweDAwMDgpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAotCi17InBlYSIsCQlvbmUoMDA0NDEwMCksCQlvbmUoMDE3NzcwMCksICIhcyIsIG02ODAwMHVwfG1jZjUyMDAgfSwKLQoteyJwZmx1c2hhIiwJb25lKDB4ZjUxOCksCQlvbmUoMHhmZmY4KSwgIiIsIG02ODA0MHVwIH0sCi17InBmbHVzaGEiLAl0d28oMHhmMDAwLDB4MjQwMCksIHR3bygweGZmZmYsMHhmZmZmKSwgIiIsIG02ODAzMCB8IG02ODg1MSB9LAotCi17InBmbHVzaCIsICAgdHdvKDB4ZjAwMCwweDMwMTApLCB0d28oMHhmZmMwLDB4ZmUxMCksICJUM1Q5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwZmx1c2giLCAgIHR3bygweGYwMDAsMHgzODEwKSwgdHdvKDB4ZmZjMCwweGZlMTApLCAiVDNUOSZzIiwgbTY4MDMwfG02ODg1MSB9LAoteyJwZmx1c2giLCAgIHR3bygweGYwMDAsMHgzMDA4KSwgdHdvKDB4ZmZjMCwweGZlMTgpLCAiRDNUOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicGZsdXNoIiwgICB0d28oMHhmMDAwLDB4MzgwOCksIHR3bygweGZmYzAsMHhmZTE4KSwgIkQzVDkmcyIsIG02ODAzMHxtNjg4NTEgfSwKLXsicGZsdXNoIiwgICB0d28oMHhmMDAwLDB4MzAwMCksIHR3bygweGZmYzAsMHhmZTFlKSwgImYzVDkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBmbHVzaCIsICAgdHdvKDB4ZjAwMCwweDM4MDApLCB0d28oMHhmZmMwLDB4ZmUxZSksICJmM1Q5JnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBmbHVzaCIsCW9uZSgweGY1MDgpLAkJb25lKDB4ZmZmOCksICJhcyIsIG02ODA0MHVwIH0sCi17InBmbHVzaCIsCW9uZSgweGY1MDgpLAkJb25lKDB4ZmZmOCksICJBcyIsIG02ODA0MHVwIH0sCi0KLXsicGZsdXNoYW4iLAlvbmUoMHhmNTEwKSwJCW9uZSgweGZmZjgpLCAiIiwgbTY4MDQwdXAgfSwKLXsicGZsdXNobiIsCW9uZSgweGY1MDApLAkJb25lKDB4ZmZmOCksICJhcyIsIG02ODA0MHVwIH0sCi17InBmbHVzaG4iLAlvbmUoMHhmNTAwKSwJCW9uZSgweGZmZjgpLCAiQXMiLCBtNjgwNDB1cCB9LAotCi17InBmbHVzaHIiLAl0d28oMHhmMDAwLCAweGEwMDApLCB0d28oMHhmZmMwLCAweGZmZmYpLCAifHMiLCBtNjg4NTEgfSwKLQoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzNDEwKSwgdHdvKDB4ZmZmOCwgMHhmZTEwKSwgIlQzVDkiLCBtNjg4NTEgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4M2MxMCksIHR3bygweGZmZjgsIDB4ZmUxMCksICJUM1Q5JnMiLCBtNjg4NTEgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQwOCksIHR3bygweGZmZjgsIDB4ZmUxOCksICJEM1Q5IiwgbTY4ODUxIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDNjMDgpLCB0d28oMHhmZmY4LCAweGZlMTgpLCAiRDNUOSZzIiwgbTY4ODUxIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDM0MDApLCB0d28oMHhmZmY4LCAweGZlMWUpLCAiZjNUOSIsIG02ODg1MSB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzAwKSwgdHdvKDB4ZmZmOCwgMHhmZTFlKSwgImYzVDkmcyIsIG02ODg1MSB9LAotCi17InBsb2FkciIsICAgICB0d28oMHhmMDAwLDB4MjIxMCksIHR3bygweGZmYzAsMHhmZmYwKSwgIlQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkciIsICAgICB0d28oMHhmMDAwLDB4MjIwOCksIHR3bygweGZmYzAsMHhmZmY4KSwgIkQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkciIsICAgICB0d28oMHhmMDAwLDB4MjIwMCksIHR3bygweGZmYzAsMHhmZmZlKSwgImYzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkdyIsICAgICB0d28oMHhmMDAwLDB4MjAxMCksIHR3bygweGZmYzAsMHhmZmYwKSwgIlQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkdyIsICAgICB0d28oMHhmMDAwLDB4MjAwOCksIHR3bygweGZmYzAsMHhmZmY4KSwgIkQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkdyIsICAgICB0d28oMHhmMDAwLDB4MjAwMCksIHR3bygweGZmYzAsMHhmZmZlKSwgImYzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi0KLXsicGxwYXIiLAlvbmUoMHhmNWM4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCBtNjgwNjAgfSwKLXsicGxwYXciLAlvbmUoMHhmNTg4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCBtNjgwNjAgfSwKLQoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDQwMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICIqbDA4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDVjMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICIqdzE4IiwgbTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDAwMCksIHR3bygweGZmYzAsMHhlM2ZmKSwgIipiMjgiLCBtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg0MjAwKSwgdHdvKDB4ZmZjMCwweGZmZmYpLCAiMDglcyIsIG02ODAzMHxtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg1ZTAwKSwgdHdvKDB4ZmZjMCwweGZmZmYpLCAiMTglcyIsIG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDQyMDApLCB0d28oMHhmZmMwLDB4ZTNmZiksICIyOCVzIiwgbTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDAwMCksIHR3bygweGZmYzAsMHhlM2ZmKSwgInxzVzgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDIwMCksIHR3bygweGZmYzAsMHhlM2ZmKSwgIlc4fnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NjIwMCksIHR3bygweGZmYzAsMHhlM2UzKSwgIip3WDMiLCBtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg2MDAwKSwgdHdvKDB4ZmZjMCwweGUzZTMpLCAiWDMlcyIsIG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDYwMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICIqd1k4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDYyMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICJZOCVzIiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDY2MDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICJaOCVzIiwgbTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4MDgwMCksIHR3bygweGZmYzAsMHhmYmZmKSwgIipsMzgiLCBtNjgwMzAgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHgwYTAwKSwgdHdvKDB4ZmZjMCwweGZiZmYpLCAiMzglcyIsIG02ODAzMCB9LAotCi17InBtb3ZlZmQiLAl0d28oMHhmMDAwLCAweDQxMDApLAl0d28oMHhmZmMwLCAweGUzZmYpLCAiKmwwOCIsIG02ODAzMCB9LAoteyJwbW92ZWZkIiwJdHdvKDB4ZjAwMCwgMHg0MTAwKSwJdHdvKDB4ZmZjMCwgMHhlM2ZmKSwgInxzVzgiLCBtNjgwMzAgfSwKLXsicG1vdmVmZCIsCXR3bygweGYwMDAsIDB4MDkwMCksCXR3bygweGZmYzAsIDB4ZmJmZiksICIqbDM4IiwgbTY4MDMwIH0sCi0KLXsicHJlc3RvcmUiLAlvbmUoMHhmMTQwKSwJCW9uZSgweGZmYzApLCAiPHMiLCBtNjg4NTEgfSwKLQoteyJwc2F2ZSIsCW9uZSgweGYxMDApLAkJb25lKDB4ZmZjMCksICI+cyIsIG02ODg1MSB9LAotCi17InBzYWMiLAl0d28oMHhmMDQwLCAweDAwMDcpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNhcyIsCXR3bygweGYwNDAsIDB4MDAwNiksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2JjIiwJdHdvKDB4ZjA0MCwgMHgwMDAxKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzYnMiLAl0d28oMHhmMDQwLCAweDAwMDApLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNjYyIsCXR3bygweGYwNDAsIDB4MDAwZiksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2NzIiwJdHdvKDB4ZjA0MCwgMHgwMDBlKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzZ2MiLAl0d28oMHhmMDQwLCAweDAwMGQpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNncyIsCXR3bygweGYwNDAsIDB4MDAwYyksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2ljIiwJdHdvKDB4ZjA0MCwgMHgwMDBiKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzaXMiLAl0d28oMHhmMDQwLCAweDAwMGEpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNsYyIsCXR3bygweGYwNDAsIDB4MDAwMyksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2xzIiwJdHdvKDB4ZjA0MCwgMHgwMDAyKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzc2MiLAl0d28oMHhmMDQwLCAweDAwMDUpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNzcyIsCXR3bygweGYwNDAsIDB4MDAwNCksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc3djIiwJdHdvKDB4ZjA0MCwgMHgwMDA5KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzd3MiLAl0d28oMHhmMDQwLCAweDAwMDgpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLQoteyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODIxMCksIHR3bygweGZmYzAsIDB4ZTNmMCksICJUMyZzdDgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0ciIsIHR3bygweGYwMDAsMHg4MzEwKSwgdHdvKDB4ZmZjMCwweGUzMTApLCAiVDMmc3Q4QTkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0ciIsIHR3bygweGYwMDAsMHg4MjA4KSwgdHdvKDB4ZmZjMCwweGUzZjgpLCAiRDMmc3Q4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODMwOCksIHR3bygweGZmYzAsMHhlMzE4KSwgIkQzJnN0OEE5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODIwMCksIHR3bygweGZmYzAsMHhlM2ZlKSwgImYzJnN0OCIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3RyIiwgdHdvKDB4ZjAwMCwweDgzMDApLCB0d28oMHhmZmMwLDB4ZTMxZSksICJmMyZzdDhBOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3RyIiwJb25lKDB4ZjU2OCksCQlvbmUoMHhmZmY4KSwgImFzIiwgbTY4MDQwIH0sCi0KLXsicHRlc3R3IiwgdHdvKDB4ZjAwMCwweDgwMTApLCB0d28oMHhmZmMwLDB4ZTNmMCksICJUMyZzdDgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0dyIsIHR3bygweGYwMDAsMHg4MTEwKSwgdHdvKDB4ZmZjMCwweGUzMTApLCAiVDMmc3Q4QTkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0dyIsIHR3bygweGYwMDAsMHg4MDA4KSwgdHdvKDB4ZmZjMCwweGUzZjgpLCAiRDMmc3Q4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHciLCB0d28oMHhmMDAwLDB4ODEwOCksIHR3bygweGZmYzAsMHhlMzE4KSwgIkQzJnN0OEE5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHciLCB0d28oMHhmMDAwLDB4ODAwMCksIHR3bygweGZmYzAsMHhlM2ZlKSwgImYzJnN0OCIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3R3IiwgdHdvKDB4ZjAwMCwweDgxMDApLCB0d28oMHhmZmMwLDB4ZTMxZSksICJmMyZzdDhBOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3R3IiwJb25lKDB4ZjU0OCksCQlvbmUoMHhmZmY4KSwgImFzIiwgbTY4MDQwIH0sCi0KLXsicHRyYXBhY3ciLAl0d28oMHhmMDdhLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBhY2wiLAl0d28oMHhmMDdiLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBhYyIsCXR3bygweGYwN2MsIDB4MDAwNyksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwYXN3IiwJdHdvKDB4ZjA3YSwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwYXNsIiwJdHdvKDB4ZjA3YiwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwYXMiLAl0d28oMHhmMDdjLCAweDAwMDYpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGJjdyIsCXR3bygweGYwN2EsIDB4MDAwMSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGJjbCIsCXR3bygweGYwN2IsIDB4MDAwMSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGJjIiwJdHdvKDB4ZjA3YywgMHgwMDAxKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBic3ciLAl0d28oMHhmMDdhLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBic2wiLAl0d28oMHhmMDdiLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBicyIsCXR3bygweGYwN2MsIDB4MDAwMCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwY2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwY2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwY2MiLAl0d28oMHhmMDdjLCAweDAwMGYpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGNzdyIsCXR3bygweGYwN2EsIDB4MDAwZSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGNzbCIsCXR3bygweGYwN2IsIDB4MDAwZSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGNzIiwJdHdvKDB4ZjA3YywgMHgwMDBlKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBnY3ciLAl0d28oMHhmMDdhLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBnY2wiLAl0d28oMHhmMDdiLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBnYyIsCXR3bygweGYwN2MsIDB4MDAwZCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwZ3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwZ3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwZ3MiLAl0d28oMHhmMDdjLCAweDAwMGMpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGljdyIsCXR3bygweGYwN2EsIDB4MDAwYiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGljbCIsCXR3bygweGYwN2IsIDB4MDAwYiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGljIiwJdHdvKDB4ZjA3YywgMHgwMDBiKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBpc3ciLAl0d28oMHhmMDdhLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBpc2wiLAl0d28oMHhmMDdiLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBpcyIsCXR3bygweGYwN2MsIDB4MDAwYSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwbGN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwbGNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwbGMiLAl0d28oMHhmMDdjLCAweDAwMDMpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGxzdyIsCXR3bygweGYwN2EsIDB4MDAwMiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGxzbCIsCXR3bygweGYwN2IsIDB4MDAwMiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGxzIiwJdHdvKDB4ZjA3YywgMHgwMDAyKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBzY3ciLAl0d28oMHhmMDdhLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBzY2wiLAl0d28oMHhmMDdiLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBzYyIsCXR3bygweGYwN2MsIDB4MDAwNSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwc3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwc3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwc3MiLAl0d28oMHhmMDdjLCAweDAwMDQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcHdjdyIsCXR3bygweGYwN2EsIDB4MDAwOSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcHdjbCIsCXR3bygweGYwN2IsIDB4MDAwOSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcHdjIiwJdHdvKDB4ZjA3YywgMHgwMDA5KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXB3c3ciLAl0d28oMHhmMDdhLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXB3c2wiLAl0d28oMHhmMDdiLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXB3cyIsCXR3bygweGYwN2MsIDB4MDAwOCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB1bHNlIiwJb25lKDAwNDUzMTQpLAkJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDYwIHwgbWNmNTIwMCB9LAotCi17InB2YWxpZCIsCXR3bygweGYwMDAsIDB4MjgwMCksCXR3bygweGZmYzAsIDB4ZmZmZiksICJWcyZzIiwgbTY4ODUxIH0sCi17InB2YWxpZCIsCXR3bygweGYwMDAsIDB4MmMwMCksCXR3bygweGZmYzAsIDB4ZmZmOCksICJBMyZzIiwgbTY4ODUxIH0sCi0KLQoteyJyZXNldCIsCW9uZSgwMDQ3MTYwKSwJCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAwMHVwIH0sCi0KLXsicm9sYiIsCW9uZSgwMTYwNDMwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb2xiIiwJb25lKDAxNjA0NzApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17InJvbHciLAlvbmUoMDE2MDUzMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm9sdyIsCW9uZSgwMTYwNTcwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb2x3IiwJb25lKDAxNjM3MDApLAkJb25lKDAxNzc3MDApLCAifnMiLCAgIG02ODAwMHVwIH0sCi17InJvbGwiLAlvbmUoMDE2MDYzMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm9sbCIsCW9uZSgwMTYwNjcwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAotCi17InJvcmIiLAlvbmUoMDE2MDAzMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm9yYiIsCW9uZSgwMTYwMDcwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3J3IiwJb25lKDAxNjAxMzApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJvcnciLAlvbmUoMDE2MDE3MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsicm9ydyIsCW9uZSgwMTYzMzAwKSwJCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJyb3JsIiwJb25lKDAxNjAyMzApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJvcmwiLAlvbmUoMDE2MDI3MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLQoteyJyb3hsYiIsCW9uZSgwMTYwNDIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hsYiIsCW9uZSgwMTYwNDYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hsdyIsCW9uZSgwMTYwNTIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hsdyIsCW9uZSgwMTYwNTYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hsdyIsCW9uZSgwMTYyNzAwKSwJCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJyb3hsbCIsCW9uZSgwMTYwNjIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hsbCIsCW9uZSgwMTYwNjYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAotCi17InJveHJiIiwJb25lKDAxNjAwMjApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJveHJiIiwJb25lKDAxNjAwNjApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17InJveHJ3IiwJb25lKDAxNjAxMjApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJveHJ3IiwJb25lKDAxNjAxNjApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17InJveHJ3IiwJb25lKDAxNjIzMDApLAkJb25lKDAxNzc3MDApLCAifnMiLCAgIG02ODAwMHVwIH0sCi17InJveHJsIiwJb25lKDAxNjAyMjApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJveHJsIiwJb25lKDAxNjAyNjApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi0KLXsicnRkIiwJCW9uZSgwMDQ3MTY0KSwJCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDEwdXAgfSwKLQoteyJydGUiLAkJb25lKDAwNDcxNjMpLAkJb25lKDAxNzc3NzcpLCAiIiwgICBtNjgwMDB1cHxtY2Y1MjAwIH0sCi0KLXsicnRtIiwJCW9uZSgwMDAzMzAwKSwJCW9uZSgwMTc3NzYwKSwgIlJzIiwgbTY4MDIwIH0sCi0KLXsicnRyIiwJCW9uZSgwMDQ3MTY3KSwJCW9uZSgwMTc3Nzc3KSwgIiIsICAgbTY4MDAwdXAgfSwKLQoteyJydHMiLAkJb25lKDAwNDcxNjUpLAkJb25lKDAxNzc3NzcpLCAiIiwgICBtNjgwMDB1cHxtY2Y1MjAwIH0sCi0KLXsic2JjZCIsCW9uZSgwMTAwNDAwKSwJCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB9LAoteyJzYmNkIiwJb25lKDAxMDA0MTApLAkJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCi0KLQoteyJzY2MiLAkJb25lKDAwNTIzMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNjYyIsCQlvbmUoMDA1MjMwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmNTIwMCB9LAoteyJzY3MiLAkJb25lKDAwNTI3MDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNjcyIsCQlvbmUoMDA1MjcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmNTIwMCB9LAoteyJzZXEiLAkJb25lKDAwNTM3MDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNlcSIsCQlvbmUoMDA1MzcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmNTIwMCB9LAoteyJzZiIsCQlvbmUoMDA1MDcwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic2YiLAkJb25lKDAwNTA3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKLXsic2dlIiwJCW9uZSgwMDU2MzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzZ2UiLAkJb25lKDAwNTYzMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKLXsic2d0IiwJCW9uZSgwMDU3MzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzZ3QiLAkJb25lKDAwNTczMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKLXsic2hpIiwJCW9uZSgwMDUxMzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzaGkiLAkJb25lKDAwNTEzMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKLXsic2xlIiwJCW9uZSgwMDU3NzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzbGUiLAkJb25lKDAwNTc3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKLXsic2xzIiwJCW9uZSgwMDUxNzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzbHMiLAkJb25lKDAwNTE3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKLXsic2x0IiwJCW9uZSgwMDU2NzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzbHQiLAkJb25lKDAwNTY3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKLXsic21pIiwJCW9uZSgwMDU1NzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzbWkiLAkJb25lKDAwNTU3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKLXsic25lIiwJCW9uZSgwMDUzMzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzbmUiLAkJb25lKDAwNTMzMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKLXsic3BsIiwJCW9uZSgwMDU1MzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzcGwiLAkJb25lKDAwNTUzMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKLXsic3QiLAkJb25lKDAwNTAzMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InN0IiwJCW9uZSgwMDUwMzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2Y1MjAwIH0sCi17InN2YyIsCQlvbmUoMDA1NDMwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic3ZjIiwJCW9uZSgwMDU0MzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2Y1MjAwIH0sCi17InN2cyIsCQlvbmUoMDA1NDcwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic3ZzIiwJCW9uZSgwMDU0NzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2Y1MjAwIH0sCi0KLXsic3RvcCIsCW9uZSgwMDQ3MTYyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLQoteyJzdWJhbCIsCW9uZSgwMTEwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJzdWJhdyIsCW9uZSgwMTEwMzAwKSwJb25lKDAxNzA3MDApLCAiKndBZCIsIG02ODAwMHVwIH0sCi0KLXsic3ViaWIiLAlvbmUoMDAwMjAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJzdWJpdyIsCW9uZSgwMDAyMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17InN1YmlsIiwJb25lKDAwMDIyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsic3ViaWwiLAlvbmUoMDAwMjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2Y1MjAwIH0sCi0KLXsic3VicWIiLAlvbmUoMDA1MDQwMCksCW9uZSgwMTcwNzAwKSwgIlFkJXMiLCBtNjgwMDB1cCB9LAoteyJzdWJxdyIsCW9uZSgwMDUwNTAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIH0sCi17InN1YnFsIiwJb25lKDAwNTA2MDApLAlvbmUoMDE3MDcwMCksICJRZCVzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi0KLS8qIFRoZSBzdWIgb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgc3ViYSwgc3ViaSwgYW5kIHN1YnEgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsic3ViYiIsCW9uZSgwMDUwNDAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIH0sCi17InN1YmIiLAlvbmUoMDAwMjAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJzdWJiIiwJb25lKDAxMTAwMDApLAlvbmUoMDE3MDcwMCksICI7YkRkIiwgbTY4MDAwdXAgfSwKLXsic3ViYiIsCW9uZSgwMTEwNDAwKSwJb25lKDAxNzA3MDApLCAiRGR+cyIsIG02ODAwMHVwIH0sCi17InN1YnciLAlvbmUoMDA1MDUwMCksCW9uZSgwMTcwNzAwKSwgIlFkJXMiLCBtNjgwMDB1cCB9LAoteyJzdWJ3IiwJb25lKDAwMDIxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsic3VidyIsCW9uZSgwMTEwMzAwKSwJb25lKDAxNzA3MDApLCAiKndBZCIsIG02ODAwMHVwIH0sCi17InN1YnciLAlvbmUoMDExMDEwMCksCW9uZSgwMTcwNzAwKSwgIip3RGQiLCBtNjgwMDB1cCB9LAoteyJzdWJ3IiwJb25lKDAxMTA1MDApLAlvbmUoMDE3MDcwMCksICJEZH5zIiwgbTY4MDAwdXAgfSwKLXsic3VibCIsCW9uZSgwMDUwNjAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJzdWJsIiwJb25lKDAwMDIyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsic3VibCIsCW9uZSgwMDAyMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZjUyMDAgfSwKLXsic3VibCIsCW9uZSgwMTEwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoteyJzdWJsIiwJb25lKDAxMTAyMDApLAlvbmUoMDE3MDcwMCksICIqbERkIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi17InN1YmwiLAlvbmUoMDExMDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnMiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLQoteyJzdWJ4YiIsCW9uZSgwMTEwNDAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIH0sCi17InN1YnhiIiwJb25lKDAxMTA0MTApLAlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKLXsic3VieHciLAlvbmUoMDExMDUwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB9LAoteyJzdWJ4dyIsCW9uZSgwMTEwNTEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCi17InN1YnhsIiwJb25lKDAxMTA2MDApLAlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi17InN1YnhsIiwJb25lKDAxMTA2MTApLAlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKLQoteyJzd2FwIiwJb25lKDAwNDQxMDApLAlvbmUoMDE3Nzc3MCksICJEcyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAotCi0vKiBzd2JlZyBhbmQgc3diZWdsIGFyZSBtYWdpYyBjb25zdGFudHMgdXNlZCBvbiBzeXNWNjguICBUaGUgY29tcGlsZXIKLSAgIGdlbmVyYXRlcyB0aGVtIGJlZm9yZSBhIHN3aXRjaCB0YWJsZS4gIFRoZXkgdGVsbCB0aGUgZGVidWdnZXIgYW5kCi0gICBkaXNhc3NlbWJsZXIgdGhhdCBhIHN3aXRjaCB0YWJsZSBmb2xsb3dzLiAgVGhlIHBhcmFtZXRlciBpcyB0aGUKLSAgIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdGFibGUuICBzd2JlZyBtZWFucyB0aGF0IHRoZSBlbnRyaWVzIGluCi0gICB0aGUgdGFibGUgYXJlIHdvcmQgKDIgYnl0ZSkgc2l6ZWQsIGFuZCBzd2JlZ2wgbWVhbnMgdGhhdCB0aGUKLSAgIGVudHJpZXMgaW4gdGhlIHRhYmxlIGFyZSBsb25nd29yZCAoNCBieXRlKSBzaXplZC4gICovCi17InN3YmVnIiwJb25lKDAwNDUzNzQpLAlvbmUoMDE3Nzc3NyksICIjdyIsICAgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCi17InN3YmVnbCIsCW9uZSgwMDQ1Mzc1KSwJb25lKDAxNzc3NzcpLCAiI2wiLCAgIG02ODAwMHVwIHwgbWNmNTIwMCB9LAotCi17InRhcyIsCQlvbmUoMDA0NTMwMCksCQlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi0KLSNkZWZpbmUgVEJMMShuYW1lLHNpZ25lZCxyb3VuZCxzaXplKQkJCQkJXAotICB7bmFtZSwgdHdvKDAxNzQwMDAsIChzaWduZWQ8PDExKXwoIXJvdW5kPDwxMCl8KHNpemU8PDYpfDAwMDA0MDApLAlcCi0gICAgIHR3bygwMTc3NzAwLDAxMDc3NzcpLCAiIXNEMSIsIGNwdTMyIH0sCQkJCVwKLSAge25hbWUsIHR3bygwMTc0MDAwLCAoc2lnbmVkPDwxMSl8KCFyb3VuZDw8MTApfChzaXplPDw2KSksCQlcCi0gICAgIHR3bygwMTc3NzcwLDAxMDc3NzApLCAiRHNEM0QxIiwgY3B1MzIgfQotI2RlZmluZSBUQkwobmFtZTEsIG5hbWUyLCBuYW1lMywgcywgcikgXAotICBUQkwxKG5hbWUxLCBzLCByLCAwKSwgVEJMMShuYW1lMiwgcywgciwgMSksIFRCTDEobmFtZTMsIHMsIHIsIDIpCi1UQkwoInRibHNiIiwgInRibHN3IiwgInRibHNsIiwgMSwgMSksCi1UQkwoInRibHNuYiIsICJ0YmxzbnciLCAidGJsc25sIiwgMSwgMCksCi1UQkwoInRibHViIiwgInRibHV3IiwgInRibHVsIiwgMCwgMSksCi1UQkwoInRibHVuYiIsICJ0Ymx1bnciLCAidGJsdW5sIiwgMCwgMCksCi0KLXsidHJhcCIsCW9uZSgwMDQ3MTAwKSwJb25lKDAxNzc3NjApLCAiVHMiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLQoteyJ0cmFwY2MiLAlvbmUoMDA1MjM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcGNzIiwJb25lKDAwNTI3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBlcSIsCW9uZSgwMDUzNzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwZiIsCW9uZSgwMDUwNzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB8IG1jZjUyMDAgfSwKLXsidHJhcGdlIiwJb25lKDAwNTYzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBndCIsCW9uZSgwMDU3Mzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwaGkiLAlvbmUoMDA1MTM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcGxlIiwJb25lKDAwNTc3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBscyIsCW9uZSgwMDUxNzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwbHQiLAlvbmUoMDA1Njc3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcG1pIiwJb25lKDAwNTU3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBuZSIsCW9uZSgwMDUzMzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwcGwiLAlvbmUoMDA1NTM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcHQiLAlvbmUoMDA1MDM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcHZjIiwJb25lKDAwNTQzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXB2cyIsCW9uZSgwMDU0Nzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAotCi17InRyYXBjY3ciLAlvbmUoMDA1MjM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGNzdyIsCW9uZSgwMDUyNzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwZXF3IiwJb25lKDAwNTM3NzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBmdyIsCW9uZSgwMDUwNzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMnxtY2Y1MjAwfSwKLXsidHJhcGdldyIsCW9uZSgwMDU2MzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwZ3R3IiwJb25lKDAwNTczNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBoaXciLAlvbmUoMDA1MTM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGxldyIsCW9uZSgwMDU3NzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbHN3IiwJb25lKDAwNTE3NzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBsdHciLAlvbmUoMDA1Njc3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcG1pdyIsCW9uZSgwMDU1NzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbmV3IiwJb25lKDAwNTMzNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBwbHciLAlvbmUoMDA1NTM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHR3IiwJb25lKDAwNTAzNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXB2Y3ciLAlvbmUoMDA1NDM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHZzdyIsCW9uZSgwMDU0NzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAotCi17InRyYXBjY2wiLAlvbmUoMDA1MjM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGNzbCIsCW9uZSgwMDUyNzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwZXFsIiwJb25lKDAwNTM3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBmbCIsCW9uZSgwMDUwNzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMnxtY2Y1MjAwfSwKLXsidHJhcGdlbCIsCW9uZSgwMDU2MzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwZ3RsIiwJb25lKDAwNTczNzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBoaWwiLAlvbmUoMDA1MTM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGxlbCIsCW9uZSgwMDU3NzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbHNsIiwJb25lKDAwNTE3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBsdGwiLAlvbmUoMDA1Njc3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcG1pbCIsCW9uZSgwMDU1NzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbmVsIiwJb25lKDAwNTMzNzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBwbGwiLAlvbmUoMDA1NTM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHRsIiwJb25lKDAwNTAzNzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXB2Y2wiLAlvbmUoMDA1NDM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHZzbCIsCW9uZSgwMDU0NzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAotCi17InRyYXB2IiwJb25lKDAwNDcxNjYpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMDB1cCB9LAotCi17InRzdGIiLAlvbmUoMDA0NTAwMCksCW9uZSgwMTc3NzAwKSwgIjtiIiwgbTY4MDIwdXB8Y3B1MzJ8bWNmNTIwMCB9LAoteyJ0c3RiIiwJb25lKDAwNDUwMDApLAlvbmUoMDE3NzcwMCksICIkYiIsIG02ODAwMHVwIH0sCi17InRzdHciLAlvbmUoMDA0NTEwMCksCW9uZSgwMTc3NzAwKSwgIip3IiwgbTY4MDIwdXB8Y3B1MzJ8bWNmNTIwMCB9LAoteyJ0c3R3IiwJb25lKDAwNDUxMDApLAlvbmUoMDE3NzcwMCksICIkdyIsIG02ODAwMHVwIH0sCi17InRzdGwiLAlvbmUoMDA0NTIwMCksCW9uZSgwMTc3NzAwKSwgIipsIiwgbTY4MDIwdXB8Y3B1MzJ8bWNmNTIwMCB9LAoteyJ0c3RsIiwJb25lKDAwNDUyMDApLAlvbmUoMDE3NzcwMCksICIkbCIsIG02ODAwMHVwIH0sCi0KLXsidW5sayIsCW9uZSgwMDQ3MTMwKSwJb25lKDAxNzc3NzApLCAiQXMiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKLQoteyJ1bnBrIiwJb25lKDAxMDA2MDApLAlvbmUoMDE3MDc3MCksICJEc0RkI3ciLCBtNjgwMjB1cCB9LAoteyJ1bnBrIiwJb25lKDAxMDA2MTApLAlvbmUoMDE3MDc3MCksICItcy1kI3ciLCBtNjgwMjB1cCB9LAotCi17IndkZGF0YWIiLAlvbmUoMDE3MjAwMCksICAgb25lKDAxNzc3MDApLCAifnMiLCBtY2Y1MjAwIH0sCi17IndkZGF0YXciLAlvbmUoMDE3MjEwMCksICAgb25lKDAxNzc3MDApLCAifnMiLCBtY2Y1MjAwIH0sCi17IndkZGF0YWwiLAlvbmUoMDE3MjIwMCksICAgb25lKDAxNzc3MDApLCAifnMiLCBtY2Y1MjAwIH0sCi0KLX07Ci0KLWNvbnN0IGludCBtNjhrX251bW9wY29kZXMgPSBzaXplb2YgbTY4a19vcGNvZGVzIC8gc2l6ZW9mIG02OGtfb3Bjb2Rlc1swXTsKLQotLyogVGhlc2UgYWxpYXNlcyB1c2VkIHRvIGJlIGluIHRoZSBhYm92ZSB0YWJsZSwgZWFjaCBvbmUgZHVwbGljYXRpbmcKLSAgIGFsbCBvZiB0aGUgZW50cmllcyBmb3IgaXRzIHByaW1hcnkgZXhhY3RseS4gIFRoaXMgdGFibGUgd2FzCi0gICBjb25zdHJ1Y3RlZCBieSBtZWNoYW5pY2FsIHByb2Nlc3Npbmcgb2YgdGhlIG9wY29kZSB0YWJsZSwgd2l0aCBhCi0gICBzbWFsbCBudW1iZXIgb2YgdHdlYWtzIGRvbmUgYnkgaGFuZC4gIFRoZXJlIGFyZSBwcm9iYWJseSBhIGxvdCBtb3JlCi0gICBhbGlhc2VzIGFib3ZlIHRoYXQgY291bGQgYmUgbW92ZWQgZG93biBoZXJlLCBleGNlcHQgZm9yIHZlcnkgbWlub3IKLSAgIGRpZmZlcmVuY2VzLiAgKi8KLQotY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlX2FsaWFzIG02OGtfb3Bjb2RlX2FsaWFzZXNbXSA9Ci17Ci0gIHsgImFkZCIsCSJhZGR3IiwgfSwKLSAgeyAiYWRkYSIsCSJhZGRhdyIsIH0sCi0gIHsgImFkZGkiLAkiYWRkaXciLCB9LAotICB7ICJhZGRxIiwJImFkZHF3IiwgfSwKLSAgeyAiYWRkeCIsCSJhZGR4dyIsIH0sCi0gIHsgImFzbCIsCSJhc2x3IiwgfSwKLSAgeyAiYXNyIiwJImFzcnciLCB9LAotICB7ICJiaGkiLAkiYmhpdyIsIH0sCi0gIHsgImJscyIsCSJibHN3IiwgfSwKLSAgeyAiYmNjIiwJImJjY3ciLCB9LAotICB7ICJiY3MiLAkiYmNzdyIsIH0sCi0gIHsgImJuZSIsCSJibmV3IiwgfSwKLSAgeyAiYmVxIiwJImJlcXciLCB9LAotICB7ICJidmMiLAkiYnZjdyIsIH0sCi0gIHsgImJ2cyIsCSJidnN3IiwgfSwKLSAgeyAiYnBsIiwJImJwbHciLCB9LAotICB7ICJibWkiLAkiYm1pdyIsIH0sCi0gIHsgImJnZSIsCSJiZ2V3IiwgfSwKLSAgeyAiYmx0IiwJImJsdHciLCB9LAotICB7ICJiZ3QiLAkiYmd0dyIsIH0sCi0gIHsgImJsZSIsCSJibGV3IiwgfSwKLSAgeyAiYnJhIiwJImJyYXciLCB9LAotICB7ICJic3IiLAkiYnNydyIsIH0sCi0gIHsgImJoaWIiLAkiYmhpcyIsIH0sCi0gIHsgImJsc2IiLAkiYmxzcyIsIH0sCi0gIHsgImJjY2IiLAkiYmNjcyIsIH0sCi0gIHsgImJjc2IiLAkiYmNzcyIsIH0sCi0gIHsgImJuZWIiLAkiYm5lcyIsIH0sCi0gIHsgImJlcWIiLAkiYmVxcyIsIH0sCi0gIHsgImJ2Y2IiLAkiYnZjcyIsIH0sCi0gIHsgImJ2c2IiLAkiYnZzcyIsIH0sCi0gIHsgImJwbGIiLAkiYnBscyIsIH0sCi0gIHsgImJtaWIiLAkiYm1pcyIsIH0sCi0gIHsgImJnZWIiLAkiYmdlcyIsIH0sCi0gIHsgImJsdGIiLAkiYmx0cyIsIH0sCi0gIHsgImJndGIiLAkiYmd0cyIsIH0sCi0gIHsgImJsZWIiLAkiYmxlcyIsIH0sCi0gIHsgImJyYWIiLAkiYnJhcyIsIH0sCi0gIHsgImJzcmIiLAkiYnNycyIsIH0sCi0gIHsgImJocyIsCSJiY2N3IiB9LAotICB7ICJiaHNzIiwJImJjY3MiIH0sCi0gIHsgImJoc2IiLAkiYmNjcyIgfSwKLSAgeyAiYmhzdyIsCSJiY2N3IiB9LAotICB7ICJiaHNsIiwJImJjY2wiIH0sCi0gIHsgImJsbyIsCSJiY3N3IiB9LAotICB7ICJibG9zIiwJImJjc3MiIH0sCi0gIHsgImJsb2IiLAkiYmNzcyIgfSwKLSAgeyAiYmxvdyIsCSJiY3N3IiB9LAotICB7ICJibG9sIiwJImJjc2wiIH0sCi0gIHsgImJyIiwJImJyYXciLCB9LAotICB7ICJicnMiLAkiYnJhcyIsIH0sCi0gIHsgImJyYiIsCSJicmFzIiwgfSwKLSAgeyAiYnJ3IiwJImJyYXciLCB9LAotICB7ICJicmwiLAkiYnJhbCIsIH0sCi0gIHsgImpmbmx0IiwJImJjYyIsIH0sCS8qIGFwcGFyZW50bHkgYSBzdW4gYWxpYXMgKi8KLSAgeyAiamZuZ3QiLAkiYmxlIiwgfSwJLyogYXBwYXJlbnRseSBhIHN1biBhbGlhcyAqLwotICB7ICJqZmVxIiwJImJlcXMiLCB9LAkvKiBhcHBhcmVudGx5IGEgc3VuIGFsaWFzICovCi0gIHsgImJjaGdiIiwJImJjaGciLCB9LAotICB7ICJiY2hnbCIsCSJiY2hnIiwgfSwKLSAgeyAiYmNscmIiLAkiYmNsciIsIH0sCi0gIHsgImJjbHJsIiwJImJjbHIiLCB9LAotICB7ICJic2V0YiIsCSJic2V0IiwgfSwKLSAgeyAiYnNldGwiLAkiYnNldCIsIH0sCi0gIHsgImJ0c3RiIiwJImJ0c3QiLCB9LAotICB7ICJidHN0bCIsCSJidHN0IiwgfSwKLSAgeyAiY2FzMiIsCSJjYXMydyIsIH0sCi0gIHsgImNhcyIsCSJjYXN3IiwgfSwKLSAgeyAiY2hrMiIsCSJjaGsydyIsIH0sCi0gIHsgImNoayIsCSJjaGt3IiwgfSwKLSAgeyAiY2xyIiwJImNscnciLCB9LAotICB7ICJjbXAyIiwJImNtcDJ3IiwgfSwKLSAgeyAiY21wYSIsCSJjbXBhdyIsIH0sCi0gIHsgImNtcGkiLAkiY21waXciLCB9LAotICB7ICJjbXBtIiwJImNtcG13IiwgfSwKLSAgeyAiY21wIiwJImNtcHciLCB9LAotICB7ICJkYmNjdyIsCSJkYmNjIiwgfSwKLSAgeyAiZGJjc3ciLAkiZGJjcyIsIH0sCi0gIHsgImRiZXF3IiwJImRiZXEiLCB9LAotICB7ICJkYmZ3IiwJImRiZiIsIH0sCi0gIHsgImRiZ2V3IiwJImRiZ2UiLCB9LAotICB7ICJkYmd0dyIsCSJkYmd0IiwgfSwKLSAgeyAiZGJoaXciLAkiZGJoaSIsIH0sCi0gIHsgImRibGV3IiwJImRibGUiLCB9LAotICB7ICJkYmxzdyIsCSJkYmxzIiwgfSwKLSAgeyAiZGJsdHciLAkiZGJsdCIsIH0sCi0gIHsgImRibWl3IiwJImRibWkiLCB9LAotICB7ICJkYm5ldyIsCSJkYm5lIiwgfSwKLSAgeyAiZGJwbHciLAkiZGJwbCIsIH0sCi0gIHsgImRidHciLAkiZGJ0IiwgfSwKLSAgeyAiZGJ2Y3ciLAkiZGJ2YyIsIH0sCi0gIHsgImRidnN3IiwJImRidnMiLCB9LAotICB7ICJkYmhzIiwJImRiY2MiLCB9LAotICB7ICJkYmhzdyIsCSJkYmNjIiwgfSwKLSAgeyAiZGJyYSIsCSJkYmYiLCB9LAotICB7ICJkYnJhdyIsCSJkYmYiLCB9LAotICB7ICJ0ZGl2c2wiLAkiZGl2c2wiLCB9LAotICB7ICJkaXZzIiwJImRpdnN3IiwgfSwKLSAgeyAiZGl2dSIsCSJkaXZ1dyIsIH0sCi0gIHsgImV4dCIsCSJleHR3IiwgfSwKLSAgeyAiZXh0YnciLAkiZXh0dyIsIH0sCi0gIHsgImV4dHdsIiwJImV4dGwiLCB9LAotICB7ICJmYm5lcSIsCSJmYm5lIiwgfSwKLSAgeyAiZmJzbmVxIiwJImZic25lIiwgfSwKLSAgeyAiZmRibmVxIiwJImZkYm5lIiwgfSwKLSAgeyAiZmRic25lcSIsCSJmZGJzbmUiLCB9LAotICB7ICJmbW92ZWNyIiwJImZtb3ZlY3J4IiwgfSwKLSAgeyAiZm1vdm0iLAkiZm1vdmVtIiwgfSwKLSAgeyAiZnNuZXEiLAkiZnNuZSIsIH0sCi0gIHsgImZzc25lcSIsCSJmc3NuZSIsIH0sCi0gIHsgImZ0cmFwbmVxIiwJImZ0cmFwbmUiLCB9LAotICB7ICJmdHJhcHNuZXEiLCAiZnRyYXBzbmUiLCB9LAotICB7ICJmam5lcSIsCSJmam5lIiwgfSwKLSAgeyAiZmpzbmVxIiwJImZqc25lIiwgfSwKLSAgeyAiam1wbCIsCSJqbXAiLCB9LAotICB7ICJqbXBzIiwJImptcCIsIH0sCi0gIHsgImpzcmwiLAkianNyIiwgfSwKLSAgeyAianNycyIsCSJqc3IiLCB9LAotICB7ICJsZWFsIiwJImxlYSIsIH0sCi0gIHsgImxzbCIsCSJsc2x3IiwgfSwKLSAgeyAibHNyIiwJImxzcnciLCB9LAotICB7ICJtb3ZlYSIsCSJtb3ZlYXciLCB9LAotICB7ICJtb3ZlbSIsCSJtb3ZlbXciLCB9LAotICB7ICJtb3ZtbCIsCSJtb3ZlbWwiLCB9LAotICB7ICJtb3ZtdyIsCSJtb3ZlbXciLCB9LAotICB7ICJtb3ZtIiwJIm1vdmVtdyIsIH0sCi0gIHsgIm1vdmVwIiwJIm1vdmVwdyIsIH0sCi0gIHsgIm1vdnB3IiwJIm1vdmVwdyIsIH0sCi0gIHsgIm1vdmVzIiwJIm1vdmVzdyIgfSwKLSAgeyAibXVscyIsCSJtdWxzdyIsIH0sCi0gIHsgIm11bHUiLAkibXVsdXciLCB9LAotICB7ICJuYmNkYiIsCSJuYmNkIiB9LAotICB7ICJuZWciLAkibmVndyIsIH0sCi0gIHsgIm5lZ3giLAkibmVneHciLCB9LAotICB7ICJub3QiLAkibm90dyIsIH0sCi0gIHsgInBlYWwiLAkicGVhIiwgfSwKLSAgeyAicm9sIiwJInJvbHciLCB9LAotICB7ICJyb3IiLAkicm9ydyIsIH0sCi0gIHsgInJveGwiLAkicm94bHciLCB9LAotICB7ICJyb3hyIiwJInJveHJ3IiwgfSwKLSAgeyAic2JjZGIiLAkic2JjZCIsIH0sCi0gIHsgInNjY2IiLAkic2NjIiwgfSwKLSAgeyAic2NzYiIsCSJzY3MiLCB9LAotICB7ICJzZXFiIiwJInNlcSIsIH0sCi0gIHsgInNmYiIsCSJzZiIsIH0sCi0gIHsgInNnZWIiLAkic2dlIiwgfSwKLSAgeyAic2d0YiIsCSJzZ3QiLCB9LAotICB7ICJzaGliIiwJInNoaSIsIH0sCi0gIHsgInNsZWIiLAkic2xlIiwgfSwKLSAgeyAic2xzYiIsCSJzbHMiLCB9LAotICB7ICJzbHRiIiwJInNsdCIsIH0sCi0gIHsgInNtaWIiLAkic21pIiwgfSwKLSAgeyAic25lYiIsCSJzbmUiLCB9LAotICB7ICJzcGxiIiwJInNwbCIsIH0sCi0gIHsgInN0YiIsCSJzdCIsIH0sCi0gIHsgInN2Y2IiLAkic3ZjIiwgfSwKLSAgeyAic3ZzYiIsCSJzdnMiLCB9LAotICB7ICJzZmdlIiwJInNnZSIsIH0sCi0gIHsgInNmZ3QiLAkic2d0IiwgfSwKLSAgeyAic2ZsZSIsCSJzbGUiLCB9LAotICB7ICJzZmx0IiwJInNsdCIsIH0sCi0gIHsgInNmbmVxIiwJInNuZSIsIH0sCi0gIHsgInN1YmEiLAkic3ViYXciLCB9LAotICB7ICJzdWJpIiwJInN1Yml3IiwgfSwKLSAgeyAic3VicSIsCSJzdWJxdyIsIH0sCi0gIHsgInN1YiIsCSJzdWJ3IiwgfSwKLSAgeyAic3VieCIsCSJzdWJ4dyIsIH0sCi0gIHsgInN3YXB3IiwJInN3YXAiLCB9LAotICB7ICJ0YXNiIiwJInRhcyIsIH0sCi0gIHsgInRwY2MiLAkidHJhcGNjIiwgfSwKLSAgeyAidGNjIiwJInRyYXBjYyIsIH0sCi0gIHsgInRzdCIsCSJ0c3R3IiwgfSwKLSAgeyAiamJyYSIsCSJqcmEiLCB9LAotICB7ICJqYmhpIiwJImpoaSIsIH0sCi0gIHsgImpibHMiLAkiamxzIiwgfSwKLSAgeyAiamJjYyIsCSJqY2MiLCB9LAotICB7ICJqYmNzIiwJImpjcyIsIH0sCi0gIHsgImpibmUiLAkiam5lIiwgfSwKLSAgeyAiamJlcSIsCSJqZXEiLCB9LAotICB7ICJqYnZjIiwJImp2YyIsIH0sCi0gIHsgImpidnMiLAkianZzIiwgfSwKLSAgeyAiamJwbCIsCSJqcGwiLCB9LAotICB7ICJqYm1pIiwJImptaSIsIH0sCi0gIHsgImpiZ2UiLAkiamdlIiwgfSwKLSAgeyAiamJsdCIsCSJqbHQiLCB9LAotICB7ICJqYmd0IiwJImpndCIsIH0sCi0gIHsgImpibGUiLAkiamxlIiwgfSwKLSAgeyAibW92cWwiLAkibW92ZXEiLCB9LAotICB7ICJtb3ZlcWwiLAkibW92ZXEiLCB9LAotICB7ICJtb3ZsIiwJIm1vdmVsIiwgfSwKLSAgeyAibW92cSIsCSJtb3ZlcSIsIH0sCi0gIHsgIm1vdmFsIiwJIm1vdmVhbCIsIH0sCi0gIHsgIm1vdmF3IiwJIm1vdmVhdyIsIH0sCi0gIHsgIm1vdmIiLAkibW92ZWIiLCB9LAotICB7ICJtb3ZjIiwJIm1vdmVjIiwgfSwKLSAgeyAibW92ZWNsIiwJIm1vdmVjIiwgfSwKLSAgeyAibW92cGwiLAkibW92ZXBsIiwgfSwKLSAgeyAibW92dyIsCSJtb3ZldyIsIH0sCi0gIHsgIm1vdnNiIiwJIm1vdmVzYiIsIH0sCi0gIHsgIm1vdnNsIiwJIm1vdmVzbCIsIH0sCi0gIHsgIm1vdnN3IiwJIm1vdmVzdyIsIH0sCi0KLSAgeyAidGRpdnVsIiwJImRpdnVsIiwgfSwJLyogZm9yIG02OGstc3ZyNCAqLwotICB7ICJmbW92YiIsCSJmbW92ZWIiLCB9LAotICB7ICJmc21vdmIiLAkiZnNtb3ZlYiIsIH0sCi0gIHsgImZkbW92YiIsCSJmZG1vdmViIiwgfSwKLSAgeyAiZm1vdmQiLAkiZm1vdmVkIiwgfSwKLSAgeyAiZnNtb3ZkIiwJImZzbW92ZWQiLCB9LAotICB7ICJmbW92bCIsCSJmbW92ZWwiLCB9LAotICB7ICJmc21vdmwiLAkiZnNtb3ZlbCIsIH0sCi0gIHsgImZkbW92bCIsCSJmZG1vdmVsIiwgfSwKLSAgeyAiZm1vdnAiLAkiZm1vdmVwIiwgfSwKLSAgeyAiZnNtb3ZwIiwJImZzbW92ZXAiLCB9LAotICB7ICJmZG1vdnAiLAkiZmRtb3ZlcCIsIH0sCi0gIHsgImZtb3ZzIiwJImZtb3ZlcyIsIH0sCi0gIHsgImZzbW92cyIsCSJmc21vdmVzIiwgfSwKLSAgeyAiZmRtb3ZzIiwJImZkbW92ZXMiLCB9LAotICB7ICJmbW92dyIsCSJmbW92ZXciLCB9LAotICB7ICJmc21vdnciLAkiZnNtb3ZldyIsIH0sCi0gIHsgImZkbW92dyIsCSJmZG1vdmV3IiwgfSwKLSAgeyAiZm1vdngiLAkiZm1vdmV4IiwgfSwKLSAgeyAiZnNtb3Z4IiwJImZzbW92ZXgiLCB9LAotICB7ICJmZG1vdngiLAkiZmRtb3ZleCIsIH0sCi0gIHsgImZtb3ZjciIsCSJmbW92ZWNyIiwgfSwKLSAgeyAiZm1vdmNyeCIsCSJmbW92ZWNyeCIsIH0sCi0gIHsgImZ0ZXN0YiIsCSJmdHN0YiIsIH0sCi0gIHsgImZ0ZXN0ZCIsCSJmdHN0ZCIsIH0sCi0gIHsgImZ0ZXN0bCIsCSJmdHN0bCIsIH0sCi0gIHsgImZ0ZXN0cCIsCSJmdHN0cCIsIH0sCi0gIHsgImZ0ZXN0cyIsCSJmdHN0cyIsIH0sCi0gIHsgImZ0ZXN0dyIsCSJmdHN0dyIsIH0sCi0gIHsgImZ0ZXN0eCIsCSJmdHN0eCIsIH0sCi19OwotCi1jb25zdCBpbnQgbTY4a19udW1hbGlhc2VzID0KLSAgc2l6ZW9mIG02OGtfb3Bjb2RlX2FsaWFzZXMgLyBzaXplb2YgbTY4a19vcGNvZGVfYWxpYXNlc1swXTsKZGlmZiAtLWdpdCBhL29wY29kZXMvbTg4ay1kaXMuYyBiL29wY29kZXMvbTg4ay1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFmNmI4Ny4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL204OGstZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyogUHJpbnQgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgTW90b3JvbGEgODgwMDAsIGZvciBHREIgYW5kIEdOVSBCaW51dGlscy4KLSAgIENvcHlyaWdodCAoYykgMTk4NiwgMTk4NywgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEYXRhIEdlbmVyYWwgQ29ycG9yYXRpb24sIE5vdmVtYmVyIDE5ODkuCi0gICBQYXJ0aWFsbHkgZGVyaXZlZCBmcm9tIGFuIGVhcmxpZXIgcHJpbnRjbWQuYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCIGFuZCB0aGUgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS9tODhrLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLUlOU1RBQiAgKmhhc2h0YWJsZVtIQVNIVkFMXSA9IHswfTsKLQotc3RhdGljIGludAotbTg4a2RpcyBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludG9wIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIE9QU1BFQyAqLAotCQkgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1pbml0X2Rpc2FzbSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyB2b2lkCi1pbnN0YWxsIFBBUkFNUyAoKElOU1RBQiAqaW5zdHB0cikpOwotCi0vKgotKgkJRGlzYXNzZW1ibGUgYW4gTTg4MDAwIEluc3RydWN0aW9uCi0qCi0qCi0qICAgICAgIFRoaXMgbW9kdWxlIGRlY29kZXMgdGhlIGluc3RydWN0aW9uIGF0IG1lbWFkZHIuCi0qCi0qCQkJUmV2aXNpb24gSGlzdG9yeQotKgotKiAgICAgICBSZXZpc2lvbiAxLjAgICAgMTEvMDgvODUgICAgICAgIENyZWF0aW9uIGRhdGUgYnkgTW90b3JvbGEKLSoJCQkwNS8xMS84OQlSLiBUcmF3aWNrIGFkYXB0ZWQgdG8gR0RCIGludGVyZmFjZS4KLSoJCQkwNy8xMi85MwlJYW4gTGFuY2UgVGF5bG9yIHVwZGF0ZWQgdG8KLSoJCQkJCWJpbnV0aWxzIGludGVyZmFjZS4KLSovCi0KLWludAotcHJpbnRfaW5zbl9tODhrIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIGludCBzdGF0dXM7Ci0KLSAgLyogSW5zdHJ1Y3Rpb24gYWRkcmVzc2VzIG1heSBoYXZlIGxvdyB0d28gYml0cyBzZXQuIENsZWFyIHRoZW0uCSovCi0gIG1lbWFkZHIgJj1+IChiZmRfdm1hKSAzOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIG04OGtkaXMgKG1lbWFkZHIsIGJmZF9nZXRiMzIgKGJ1ZmZlciksIGluZm8pOwotfQotCi0vKgotICogZGlzYXNzZW1ibGUgdGhlIGluc3RydWN0aW9uIGluICdpbnN0cnVjdGlvbicuCi0gKiAncGMnIHNob3VsZCBiZSB0aGUgYWRkcmVzcyBvZiB0aGlzIGluc3RydWN0aW9uLCBpdCB3aWxsCi0gKiAgIGJlIHVzZWQgdG8gcHJpbnQgdGhlIHRhcmdldCBhZGRyZXNzIGlmIHRoaXMgaXMgYSByZWxhdGl2ZSBqdW1wIG9yIGNhbGwKLSAqIHRoZSBkaXNhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gaXMgd3JpdHRlbiB0byAnaW5mbycuCi0gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoaXMgaW5zdHJ1Y3Rpb24gaW4gYnl0ZXMuCi0gKi8KLQotc3RhdGljIGludAotbTg4a2RpcyAocGMsIGluc3RydWN0aW9uLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICB1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgc3RhdGljIGludCBpaGFzaHRhYl9pbml0aWFsaXplZCA9IDA7Ci0gIHVuc2lnbmVkIGludCBvcGNvZGU7Ci0gIElOU1RBQiAqZW50cnlfcHRyOwotICBpbnQgb3BtYXNrOwotICB1bnNpZ25lZCBpbnQgY2xhc3M7Ci0KLSAgaWYgKCEgaWhhc2h0YWJfaW5pdGlhbGl6ZWQpCi0gICAgaW5pdF9kaXNhc20gKCk7Ci0KLSAgLyogY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBtYXNrIHRvIGlzb2xhdGUgdGhlIG9wY29kZSAqLwotICBvcG1hc2sgPSBERUZNQVNLOwotICBjbGFzcyA9IGluc3RydWN0aW9uICYgREVGTUFTSzsKLSAgaWYgKChjbGFzcyA+PSBTRlUwKSAmJiAoY2xhc3MgPD0gU0ZVNykpCi0gICAgewotICAgICAgaWYgKGluc3RydWN0aW9uIDwgU0ZVMSkKLQlvcG1hc2sgPSBDVFJMTUFTSzsKLSAgICAgIGVsc2UKLQlvcG1hc2sgPSBTRlVNQVNLOwotICAgIH0KLSAgZWxzZSBpZiAoY2xhc3MgPT0gUlJSKQotICAgIG9wbWFzayA9IFJSUk1BU0s7Ci0gIGVsc2UgaWYgKGNsYXNzID09IFJSSTEwKQotICAgIG9wbWFzayA9IFJSSTEwTUFTSzsKLQotICAvKiBpc29sYXRlIHRoZSBvcGNvZGUgKi8KLSAgb3Bjb2RlID0gaW5zdHJ1Y3Rpb24gJiBvcG1hc2s7Ci0KLSAgLyogc2VhcmNoIHRoZSBoYXNoIHRhYmxlIHdpdGggdGhlIGlzb2xhdGVkIG9wY29kZSAqLwotICBmb3IgKGVudHJ5X3B0ciA9IGhhc2h0YWJsZVtvcGNvZGUgJSBIQVNIVkFMXTsKLSAgICAgICAoZW50cnlfcHRyICE9IE5VTEwpICYmIChlbnRyeV9wdHItPm9wY29kZSAhPSBvcGNvZGUpOwotICAgICAgIGVudHJ5X3B0ciA9IGVudHJ5X3B0ci0+bmV4dCkKLSAgICA7Ci0KLSAgaWYgKGVudHJ5X3B0ciA9PSBOVUxMKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAid29yZFx0JTA4eCIsIGluc3RydWN0aW9uKTsKLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBlbnRyeV9wdHItPm1uZW1vbmljKTsKLSAgICAgIHByaW50b3AgKGluZm8sICYoZW50cnlfcHRyLT5vcDEpLCBpbnN0cnVjdGlvbiwgcGMsIDEpOwotICAgICAgcHJpbnRvcCAoaW5mbywgJihlbnRyeV9wdHItPm9wMiksIGluc3RydWN0aW9uLCBwYywgMCk7Ci0gICAgICBwcmludG9wIChpbmZvLCAmKGVudHJ5X3B0ci0+b3AzKSwgaW5zdHJ1Y3Rpb24sIHBjLCAwKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDQ7Ci19Ci0MCi0vKgotKiAgICAgICAgICAgICAgICAgICAgICBEZWNvZGUgYW4gT3BlcmFuZCBvZiBhbiBJbnN0cnVjdGlvbgotKgotKgkJCUZ1bmN0aW9uYWwgRGVzY3JpcHRpb24KLSoKLSogICAgICAgVGhpcyBtb2R1bGUgZm9ybWF0cyBhbmQgd3JpdGVzIGFuIG9wZXJhbmQgb2YgYW4gaW5zdHJ1Y3Rpb24gdG8gaW5mbwotKiAgICAgICBiYXNlZCBvbiB0aGUgb3BlcmFuZCBzcGVjaWZpY2F0aW9uLiAgV2hlbiB0aGUgZmlyc3QgZmxhZyBpcyBzZXQgdGhpcwotKiAgICAgICBpcyB0aGUgZmlyc3Qgb3BlcmFuZCBvZiBhbiBpbnN0cnVjdGlvbi4gIFVuZGVmaW5lZCBvcGVyYW5kIHR5cGVzCi0qICAgICAgIGNhdXNlIGEgPGRpcyBlcnJvcj4gbWVzc2FnZS4KLSoKLSoJCQlQYXJhbWV0ZXJzCi0qCWRpc2Fzc2VtYmxlX2luZm8Jd2hlcmUgdGhlIG9wZXJhbmQgbWF5IGJlIHByaW50ZWQKLSogICAgICAgT1BTUEVDICAqb3BwdHIgICAgICAgICAgUG9pbnRlciB0byBhbiBvcGVyYW5kIHNwZWNpZmljYXRpb24KLSogICAgICAgVUlOVCAgICBpbnN0ICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gZnJvbSB3aGljaCBvcGVyYW5kIGlzIGV4dHJhY3RlZAotKglVSU5UICAgIHBjCQlQQyBvZiBpbnN0cnVjdGlvbjsgdXNlZCBmb3IgcGMtcmVsYXRpdmUgZGlzcC4KLSogICAgICAgaW50ICAgICBmaXJzdCAgICAgICAgICAgRmxhZyB3aGljaCBpZiBub256ZXJvIGluZGljYXRlcyB0aGUgZmlyc3QKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmFuZCBvZiBhbiBpbnN0cnVjdGlvbgotKgotKgkJCU91dHB1dAotKgotKiAgICAgICBUaGUgb3BlcmFuZCBzcGVjaWZpZWQgaXMgZXh0cmFjdGVkIGZyb20gdGhlIGluc3RydWN0aW9uIGFuZCBpcwotKiAgICAgICB3cml0dGVuIHRvIGJ1ZiBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZC4gVGhlIG9wZXJhbmQgaXMgcHJlY2VkZWQKLSogICAgICAgYnkgYSBjb21tYSBpZiBpdCBpcyBub3QgdGhlIGZpcnN0IG9wZXJhbmQgb2YgYW4gaW5zdHJ1Y3Rpb24gYW5kIGl0Ci0qICAgICAgIGlzIG5vdCBhIHJlZ2lzdGVyIGluZGlyZWN0IGZvcm0uICBSZWdpc3RlcnMgYXJlIHByZWNlZGVkIGJ5ICdyJyBhbmQKLSogICAgICAgaGV4IHZhbHVlcyBieSAnMHgnLgotKgotKgkJCVJldmlzaW9uIEhpc3RvcnkKLSoKLSogICAgICAgUmV2aXNpb24gMS4wICAgIDExLzA4Lzg1ICAgICAgICBDcmVhdGlvbiBkYXRlCi0qLwotCi1zdGF0aWMgdm9pZAotcHJpbnRvcCAoaW5mbywgb3BwdHIsIGluc3QsIHBjLCBmaXJzdCkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIE9QU1BFQyAqb3BwdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zdDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGZpcnN0OwotewotICBpbnQgZXh0cmFjdGVkX2ZpZWxkOwotICBjaGFyICpjb25kX21hc2tfc3ltOwotCi0gIGlmIChvcHB0ci0+d2lkdGggPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCEgZmlyc3QpCi0gICAgewotICAgICAgc3dpdGNoIChvcHB0ci0+dHlwZSkKLQl7Ci0JY2FzZSBSRUdTQzoKLQljYXNlIENPTlQ6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHN3aXRjaCAob3BwdHItPnR5cGUpCi0gICAgewotICAgIGNhc2UgQ1JSRUc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImNyJWQiLAotCQkJICAgICBVRVhUIChpbnN0LCBvcHB0ci0+b2Zmc2V0LCBvcHB0ci0+d2lkdGgpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGQ1JSRUc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImZjciVkIiwKLQkJCSAgICAgVUVYVCAoaW5zdCwgb3BwdHItPm9mZnNldCwgb3BwdHItPndpZHRoKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVHU0M6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIltyJWRdIiwKLQkJCSAgICAgVUVYVCAoaW5zdCwgb3BwdHItPm9mZnNldCwgb3BwdHItPndpZHRoKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVHOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJyJWQiLAotCQkJICAgICBVRVhUIChpbnN0LCBvcHB0ci0+b2Zmc2V0LCBvcHB0ci0+d2lkdGgpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBYUkVHOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJ4JWQiLAotCQkJICAgICBVRVhUIChpbnN0LCBvcHB0ci0+b2Zmc2V0LCBvcHB0ci0+d2lkdGgpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBIRVg6Ci0gICAgICBleHRyYWN0ZWRfZmllbGQgPSBVRVhUIChpbnN0LCBvcHB0ci0+b2Zmc2V0LCBvcHB0ci0+d2lkdGgpOwotICAgICAgaWYgKGV4dHJhY3RlZF9maWVsZCA9PSAwKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMCIpOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglMDJ4IiwgZXh0cmFjdGVkX2ZpZWxkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUM6Ci0gICAgICBleHRyYWN0ZWRfZmllbGQgPSBVRVhUIChpbnN0LCBvcHB0ci0+b2Zmc2V0LCBvcHB0ci0+d2lkdGgpOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGV4dHJhY3RlZF9maWVsZCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ09ORE1BU0s6Ci0gICAgICBleHRyYWN0ZWRfZmllbGQgPSBVRVhUIChpbnN0LCBvcHB0ci0+b2Zmc2V0LCBvcHB0ci0+d2lkdGgpOwotICAgICAgc3dpdGNoIChleHRyYWN0ZWRfZmllbGQgJiAweDBmKQotCXsKLQljYXNlIDB4MTogY29uZF9tYXNrX3N5bSA9ICJndDAiOyBicmVhazsKLQljYXNlIDB4MjogY29uZF9tYXNrX3N5bSA9ICJlcTAiOyBicmVhazsKLQljYXNlIDB4MzogY29uZF9tYXNrX3N5bSA9ICJnZTAiOyBicmVhazsKLQljYXNlIDB4YzogY29uZF9tYXNrX3N5bSA9ICJsdDAiOyBicmVhazsKLQljYXNlIDB4ZDogY29uZF9tYXNrX3N5bSA9ICJuZTAiOyBicmVhazsKLQljYXNlIDB4ZTogY29uZF9tYXNrX3N5bSA9ICJsZTAiOyBicmVhazsKLQlkZWZhdWx0OiBjb25kX21hc2tfc3ltID0gTlVMTDsgYnJlYWs7Ci0JfQotICAgICAgaWYgKGNvbmRfbWFza19zeW0gIT0gTlVMTCkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgY29uZF9tYXNrX3N5bSk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIleCIsIGV4dHJhY3RlZF9maWVsZCk7Ci0gICAgICBicmVhazsKLQkJCQotICAgIGNhc2UgUENSRUw6Ci0gICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkocGMgKyAoNCAqIChTRVhUIChpbnN0LCBvcHB0ci0+b2Zmc2V0LCBvcHB0ci0+d2lkdGgpKSksCi0JIGluZm8pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPTlQ6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkLHIlZCIsCi0JCQkgICAgIFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIDUpLAotCQkJICAgICBVRVhUIChpbnN0LCAob3BwdHItPm9mZnNldCkgKyA1LCA1KSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkY6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkPCVkPiIsCi0JCQkgICAgICBVRVhUIChpbnN0LCAob3BwdHItPm9mZnNldCkgKyA1LCA1KSwKLQkJCSAgICAgIFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIDUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgXygiIyA8ZGlzIGVycm9yOiAlMDh4PiIpLCBpbnN0KTsKLSAgICB9Ci19Ci0KLS8qCi0qICAgICAgICAgICAgICAgICBJbml0aWFsaXplIHRoZSBEaXNhc3NlbWJsZXIgSW5zdHJ1Y3Rpb24gVGFibGUKLSoKLSogICAgICAgSW5pdGlhbGl6ZSB0aGUgaGFzaCB0YWJsZSBhbmQgaW5zdHJ1Y3Rpb24gdGFibGUgZm9yIHRoZSBkaXNhc3NlbWJsZXIuCi0qICAgICAgIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCB0byBkaXNhc20oKS4KLSoKLSoJCQlQYXJhbWV0ZXJzCi0qCi0qCQkJT3V0cHV0Ci0qCi0qICAgICAgIElmIHRoZSBkZWJ1ZyBvcHRpb24gaXMgc2VsZWN0ZWQsIGNlcnRhaW4gc3RhdGlzdGljcyBhYm91dCB0aGUgaGFzaGluZwotKiAgICAgICBkaXN0cmlidXRpb24gYXJlIHdyaXR0ZW4gdG8gc3Rkb3V0LgotKgotKgkJCVJldmlzaW9uIEhpc3RvcnkKLSoKLSogICAgICAgUmV2aXNpb24gMS4wICAgIDExLzA4Lzg1ICAgICAgICBDcmVhdGlvbiBkYXRlCi0qLwotCi1zdGF0aWMgdm9pZAotaW5pdF9kaXNhc20gKCkKLXsKLSAgIGludCBpLCBzaXplOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgSEFTSFZBTDsgaSsrKQotICAgICBoYXNodGFibGVbaV0gPSBOVUxMOwotCi0gICBzaXplID0gc2l6ZW9mIChpbnN0cnVjdGlvbnMpIC8gc2l6ZW9mIChJTlNUQUIpOwotICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgaW5zdGFsbCAoJmluc3RydWN0aW9uc1tpXSk7Ci19Ci0KLS8qCi0qICAgICAgIEluc2VydCBhbiBpbnN0cnVjdGlvbiBpbnRvIHRoZSBkaXNhc3NlbWJsZXIgdGFibGUgYnkgaGFzaGluZyB0aGUKLSogICAgICAgb3Bjb2RlIGFuZCBpbnNlcnRpbmcgaXQgaW50byB0aGUgbGlua2VkIGxpc3QgZm9yIHRoYXQgaGFzaCB2YWx1ZS4KLSoKLSoJCQlQYXJhbWV0ZXJzCi0qCi0qICAgICAgIElOU1RBQiAqaW5zdHB0ciAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGVudHJ5IGluIHRoZSBpbnN0cnVjdGlvbiB0YWJsZQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBpbnN0YWxsZWQKLSoKLSogICAgICAgUmV2aXNpb24gMS4wICAgIDExLzA4Lzg1ICAgICAgICBDcmVhdGlvbiBkYXRlCi0qCQkJMDUvMTEvODkJUi4gVFJBV0lDSyBBREFQVEVEIEZST00gTU9UT1JPTEEKLSovCi0KLXN0YXRpYyB2b2lkCi1pbnN0YWxsIChpbnN0cHRyKQotICAgICBJTlNUQUIgKmluc3RwdHI7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGkgPSAoaW5zdHB0ci0+b3Bjb2RlKSAlIEhBU0hWQUw7Ci0gIGluc3RwdHItPm5leHQgPSBoYXNodGFibGVbaV07Ci0gIGhhc2h0YWJsZVtpXSA9IGluc3RwdHI7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL21ha2VmaWxlLnZtcyBiL29wY29kZXMvbWFrZWZpbGUudm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzg3MDQ4Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvbWFrZWZpbGUudm1zCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgbGlib3Bjb2RlcyB1bmRlciBvcGVuVk1TIFZBWCBhbmQgQWxwaGEKLSMKLSMgRm9yIHVzZSB3aXRoIGdudS1tYWtlIGZvciB2bXMKLSMKLSMgQ3JlYXRlZCBieSBLbGF1cyBLImFtcGYsIGtrYWVtcGZAcHJvZ2lzLmRlCi0jCi0jCi1pZmVxICgkKEFSQ0gpLGFscGhhKQotT0JKUz1hbHBoYS1kaXMub2JqLGFscGhhLW9wYy5vYmosZGlzLWJ1Zi5vYmosZGlzYXNzZW1ibGUub2JqCi1GT1JNQVQ9T0JKX0VWQVgKLUFSQ0hERUY9IkFSQ0hfYWxwaGEiCi1lbHNlCi1PQkpTPXZheC1kaXMub2JqLGRpcy1idWYub2JqLGRpc2Fzc2VtYmxlLm9iagotRk9STUFUPU9CSl9WQVgKLUFSQ0hERUY9IkFSQ0hfdmF4IgotZW5kaWYKLQotaWZlcSAoJChDQyksZ2NjKQotREVGUz0vZGVmaW5lPSgkKEZPUk1BVCkpCi1DRkxBR1M9L2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdLFstLmJmZF0pJChERUZTKQotZWxzZQotREVGUz0vZGVmaW5lPSgkKEZPUk1BVCksImNvbnN0PSIpCi1DRkxBR1M9L25vb3B0L2RlYnVnL2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdLFstLmJmZF0pJChERUZTKVwKLS93YXJuaW5ncz1kaXNhYmxlPShtaXNzaW5ncmV0dXJuLGltcGxpY2l0ZnVuYyxsb25nZXh0ZXJuKQotZW5kaWYKLQotbGlib3Bjb2Rlcy5vbGI6IHN5c2RlcC5oICQoT0JKUykKLQlwdXJnZQotCWxpYi9jcmVhdGUgbGlib3Bjb2RlcyAqLm9iagotCi1kaXNhc3NlbWJsZS5vYmo6IGRpc2Fzc2VtYmxlLmMKLQkkKENDKSQoQ0ZMQUdTKS9kZWZpbmU9KCQoQVJDSERFRikpICQ8Ci0KLXN5c2RlcC5oOiBbLS5iZmQuaG9zdHNdJChBUkNIKXZtcy5oCi0JJChDUCkgJDwgJEAKLQotY2xlYW46Ci0JJCQgcHVyZ2UKLQkkKFJNKSAqLm9iajsKLQkkKFJNKSBzeXNkZXAuaDsKLQkkKFJNKSBsaWJvcGNvZGVzLm9sYjsKZGlmZiAtLWdpdCBhL29wY29kZXMvbWNvcmUtZGlzLmMgYi9vcGNvZGVzL21jb3JlLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjYxMmEyLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbWNvcmUtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgTW90b3JvbGxhIE0qQ29yZSBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNkZWZpbmUgU1RBVElDX1RBQkxFCi0jZGVmaW5lIERFRklORV9UQUJMRQotCi0jaW5jbHVkZSAibWNvcmUtb3BjLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi0vKiBNYXNrIGZvciBlYWNoIG1jb3JlX29wY2xhc3M6ICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgaW1za1tdID0KLXsKLSAgICAvKiBPMCAgKi8gMHhGRkZGLAotICAgIC8qIE9UICAqLyAweEZGRkMsCi0gICAgLyogTzEgICovIDB4RkZGMCwKLSAgICAvKiBPQyAgKi8gMHhGRkUwLAotICAgIC8qIE8yICAqLyAweEZGMDAsCi0gICAgLyogWDEgICovIDB4RkZGMCwKLSAgICAvKiBPSSAgKi8gMHhGRTAwLAotICAgIC8qIE9CICAqLyAweEZFMDAsCi0JICAgICAgCi0gICAgLyogT01hICovIDB4RkZGMCwKLSAgICAvKiBTSSAgKi8gMHhGRTAwLAotICAgIC8qIEk3ICAqLyAweEY4MDAsCi0gICAgLyogTFMgICovIDB4RjAwMCwKLSAgICAvKiBCUiAgKi8gMHhGODAwLAotICAgIC8qIEJMICAqLyAweEZGMDAsCi0gICAgLyogTFIgICovIDB4RjAwMCwKLSAgICAvKiBMSiAgKi8gMHhGRjAwLAotCSAgICAgIAotICAgIC8qIFJNICAqLyAweEZGRjAsCi0gICAgLyogUlEgICovIDB4RkZGMCwKLSAgICAvKiBKU1IgKi8gMHhGRkYwLAotICAgIC8qIEpNUCAqLyAweEZGRjAsCi0gICAgLyogT0JSYSovIDB4RkZGMCwKLSAgICAvKiBPQlJiKi8gMHhGRjgwLAotICAgIC8qIE9CUmMqLyAweEZGMDAsCi0gICAgLyogT0JSMiovIDB4RkUwMCwKLQkgICAgICAKLSAgICAvKiBPMVIxKi8gMHhGRkYwLAotICAgIC8qIE9NYiAqLyAweEZGODAsCi0gICAgLyogT01jICovIDB4RkYwMCwKLSAgICAvKiBTSWEgKi8gMHhGRTAwLAotCi0vKiBzdGFydC1zYW5pdGl6ZS1tMzQwICovCi0gIC8qIE1VTFNIICovIDB4RkYwMCwKLS8qIGVuZC1zYW5pdGl6ZS1tMzQwICovCi0JCSAKLSAgICAvKiBKQyAgKi8gMCwJCS8qIEpDLEpVLEpMIGRvbid0IGFwcGVhciBpbiBvYmplY3QgKi8KLSAgICAvKiBKVSAgKi8gMCwKLSAgICAvKiBKTCAgKi8gMCwKLSAgICAvKiBSU0kgKi8gMCwKLSAgICAvKiBETzIxKi8gMCwKLSAgICAvKiBPQjIgKi8gMCAJCS8qIE9CMiB3b24ndCBhcHBlYXIgaW4gb2JqZWN0LiAqLwotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBncm5hbWVbXSA9Ci17Ci0gInIwIiwgICJyMSIsICAicjIiLCAgInIzIiwgICJyNCIsICAicjUiLCAgInI2IiwgICJyNyIsCi0gInI4IiwgICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyIFhbXSA9ICI/PyI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY3JuYW1lW10gPQotewotICAicHNyIiwgICJ2YnIiLCAiZXBzciIsICJmcHNyIiwgImVwYyIsICAiZnBjIiwgICJzczAiLCAgInNzMSIsCi0gICJzczIiLCAgInNzMyIsICJzczQiLCAgImdjciIsICAiZ3NyIiwgICAgIFgsICAgICAgWCwgICAgICBYLAotICAgICBYLCAgICAgIFgsICAgICAgWCwgICAgICBYLCAgICAgIFgsICAgICBYLCAgICAgIFgsICAgICAgWCwKLSAgICAgWCwgICAgICBYLCAgICAgIFgsICAgICAgWCwgICAgICBYLCAgICAgWCwgICAgICBYLCAgICAgIFgKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpc2l6W10gPSB7IDIsIDAsIDEsIDAgfTsKLQotaW50IAotcHJpbnRfaW5zbl9tY29yZSAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Ci17Ci0gIHVuc2lnbmVkIGNoYXIgICAgICAgaWJ5dGVzWzRdOwotICBmcHJpbnRmX2Z0eXBlICAgICAgIGZwcmludGYgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0gIHZvaWQgKiAgICAgICAgICAgICAgc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICB1bnNpZ25lZCBzaG9ydCAgICAgIGluc3Q7Ci0gIG1jb3JlX29wY29kZV9pbmZvICogb3A7Ci0gIGludCAgICAgICAgICAgICAgICAgc3RhdHVzOwotCi0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDI7Ci0KLSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAobWVtYWRkciwgaWJ5dGVzLCAyLCBpbmZvKTsKLQotICBpZiAoc3RhdHVzICE9IDApIAotICAgIHsKLSAgICAgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotLyogc3RhcnQtc2FuaXRpemUtbTM0MCAqLwotICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQotLyogZW5kLXNhbml0aXplLW0zNDAgKi8KLSAgICBpbnN0ID0gKGlieXRlc1swXSA8PCA4KSB8IGlieXRlc1sxXTsKLS8qIHN0YXJ0LXNhbml0aXplLW0zNDAgKi8KLSAgZWxzZSBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fTElUVExFKQotICAgIGluc3QgPSAoaWJ5dGVzWzFdIDw8IDgpIHwgaWJ5dGVzWzBdOwotICBlbHNlCi0gICAgYWJvcnQgKCk7Ci0vKiBlbmQtc2FuaXRpemUtbTM0MCAqLwotCi0gIC8qIEp1c3QgYSBsaW5lYXIgc2VhcmNoIG9mIHRoZSB0YWJsZS4gICovCi0gIGZvciAob3AgPSBtY29yZV90YWJsZTsgb3AtPm5hbWUgIT0gMDsgb3AgKyspCi0gICAgaWYgKG9wLT5pbnN0ID09IChpbnN0ICYgaW1za1tvcC0+b3BjbGFzc10pKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKG9wLT5uYW1lID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCAiLnNob3J0IDB4JTA0eCIsIGluc3QpOwotICBlbHNlCi0gICAgewotICAgICAgY29uc3QgY2hhciAqIG5hbWUgPSBncm5hbWVbaW5zdCAmIDB4MEZdOwotICAgICAgCi0gICAgICBmcHJpbnRmIChzdHJlYW0sICIlcyIsIG9wLT5uYW1lKTsKLSAgICAgIAotICAgICAgc3dpdGNoIChvcC0+b3BjbGFzcykKLQl7Ci0JY2FzZSBPMDogYnJlYWs7Ci0JY2FzZSBPVDogZnByaW50ZiAoc3RyZWFtLCAiXHQlZCIsIGluc3QgJiAweDMpOyBicmVhazsKLQljYXNlIE8xOgotCWNhc2UgSk1QOgotCWNhc2UgSlNSOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzIiwgbmFtZSk7IGJyZWFrOwotCWNhc2UgT0M6ICBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAlcyIsIG5hbWUsIGNybmFtZVsoaW5zdCA+PiA0KSAmIDB4MUZdKTsgYnJlYWs7Ci0JY2FzZSBPMVIxOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCByMSIsIG5hbWUpOyBicmVhazsKLS8qIHN0YXJ0LXNhbml0aXplLW0zNDAgKi8KLQljYXNlIE1VTFNIOgotLyogZW5kLXNhbml0aXplLW0zNDAgKi8KLQljYXNlIE8yOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAlcyIsIG5hbWUsIGdybmFtZVsoaW5zdCA+PiA0KSAmIDB4Rl0pOyBicmVhazsKLQljYXNlIFgxOiBmcHJpbnRmIChzdHJlYW0sICJcdHIxLCAlcyIsIG5hbWUpOyBicmVhazsKLQljYXNlIE9JOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAlZCIsIG5hbWUsICgoaW5zdCA+PiA0KSAmIDB4MUYpICsgMSk7IGJyZWFrOwotCWNhc2UgUk06IGZwcmludGYgKHN0cmVhbSwgIlx0JXMtcjE1LCAocjApIiwgbmFtZSk7IGJyZWFrOwotCWNhc2UgUlE6IGZwcmludGYgKHN0cmVhbSwgIlx0cjQtcjcsICglcykiLCBuYW1lKTsgYnJlYWs7Ci0JY2FzZSBPQjoKLQljYXNlIE9CUmE6Ci0JY2FzZSBPQlJiOgotCWNhc2UgT0JSYzoKLQljYXNlIFNJOgotCWNhc2UgU0lhOgotCWNhc2UgT01hOgotCWNhc2UgT01iOgotCWNhc2UgT01jOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAlZCIsIG5hbWUsIChpbnN0ID4+IDQpICYgMHgxRik7IGJyZWFrOwotCWNhc2UgSTc6IGZwcmludGYgKHN0cmVhbSwgIlx0JXMsICVkIiwgbmFtZSwgKGluc3QgPj4gNCkgJiAweDdGKTsgYnJlYWs7Ci0JY2FzZSBMUzogZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgKCVzLCAlZCkiLCBncm5hbWVbKGluc3QgPj4gOCkgJiAweEZdLAotCQkJICBuYW1lLCAoKGluc3QgPj4gNCkgJiAweEYpIDw8IGlzaXpbKGluc3QgPj4gMTMpICYgM10pOwotCSAgYnJlYWs7Ci0JICAKLQljYXNlIEJSOgotCSAgewotCSAgICBsb25nIHZhbCA9IGluc3QgJiAweDNGRjsKLQkgICAgCi0JICAgIGlmIChpbnN0ICYgMHg0MDApCi0JICAgICAgdmFsIHw9IDB4RkZGRkZDMDA7Ci0JICAgIAotCSAgICBmcHJpbnRmIChzdHJlYW0sICJcdDB4JXgiLCBtZW1hZGRyICsgMiArICh2YWw8PDEpKTsKLQkgICAgCi0JICAgIGlmIChzdHJjbXAgKG9wLT5uYW1lLCAiYnNyIikgPT0gMCkKLQkgICAgICB7Ci0JCS8qIGZvciBic3IsIHdlJ2xsIHRyeSB0byBnZXQgYSBzeW1ib2wgZm9yIHRoZSB0YXJnZXQgKi8KLQkJdmFsID0gbWVtYWRkciArIDIgKyAodmFsIDw8IDEpOwotCQkKLQkJaWYgKGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyAmJiB2YWwgIT0gMCkKLQkJICB7Ci0JCSAgICBmcHJpbnRmIChzdHJlYW0sICJcdC8vICIpOwotCQkgICAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jICh2YWwsIGluZm8pOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQkgIAotCWNhc2UgQkw6Ci0JICB7Ci0JICAgIGxvbmcgdmFsOwotCSAgICB2YWwgPSAoaW5zdCAmIDB4MDAwRik7Ci0JICAgIGZwcmludGYgKHN0cmVhbSwgIlx0JXMsIDB4JXgiLAotCQkgICAgZ3JuYW1lWyhpbnN0ID4+IDQpICYgMHhGXSwgbWVtYWRkciAtICh2YWwgPDwgMSkpOwotCSAgfQotCSAgYnJlYWs7Ci0JICAKLQljYXNlIExSOgotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIHZhbDsKLQkgICAgCi0JICAgIHZhbCA9IChtZW1hZGRyICsgMiArICgoaW5zdCAmIDB4RkYpIDw8IDIpKSAmIDB4RkZGRkZGRkM7Ci0JICAgIAotCSAgICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jICh2YWwsIGlieXRlcywgNCwgaW5mbyk7Ci0JICAgIGlmIChzdGF0dXMgIT0gMCkgCi0JICAgICAgewotCQlpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICAKLS8qIHN0YXJ0LXNhbml0aXplLW0zNDAgKi8KLQkgICAgaWYgKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLQkgICAgICB2YWwgPSAoaWJ5dGVzWzNdIDw8IDI0KSB8IChpYnl0ZXNbMl0gPDwgMTYpCi0JCXwgKGlieXRlc1sxXSA8PCA4KSB8IChpYnl0ZXNbMF0pOwotCSAgICBlbHNlCi0vKiBlbmQtc2FuaXRpemUtbTM0MCAqLwotCSAgICAgIHZhbCA9IChpYnl0ZXNbMF0gPDwgMjQpIHwgKGlieXRlc1sxXSA8PCAxNikKLQkJfCAoaWJ5dGVzWzJdIDw8IDgpIHwgKGlieXRlc1szXSk7Ci0JICAgIAotCSAgICAvKiBSZW1vdmVkIFtdIGFyb3VuZCBsaXRlcmFsIHZhbHVlIHRvIG1hdGNoIEFCSSBzeW50YXggMTIvOTUuICAqLwotCSAgICBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAweCVYIiwgZ3JuYW1lWyhpbnN0ID4+IDgpICYgMHhGXSwgdmFsKTsKLQotCSAgICBpZiAodmFsID09IDApCi0JICAgICAgZnByaW50ZiAoc3RyZWFtLCAiXHQvLyBmcm9tIGFkZHJlc3MgcG9vbCBhdCAweCV4IiwKLQkJICAgICAgIChtZW1hZGRyICsgMiArICgoaW5zdCAmIDB4RkYpIDw8IDIpKSAmIDB4RkZGRkZGRkMpOwotCSAgfQotCSAgYnJlYWs7Ci0JICAKLQljYXNlIExKOgotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIHZhbDsKLQkgICAgCi0JICAgIHZhbCA9IChtZW1hZGRyICsgMiArICgoaW5zdCAmIDB4RkYpIDw8IDIpKSAmIDB4RkZGRkZGRkM7Ci0JICAgIAotCSAgICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jICh2YWwsIGlieXRlcywgNCwgaW5mbyk7Ci0JICAgIGlmIChzdGF0dXMgIT0gMCkgCi0JICAgICAgewotCQlpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0vKiBzdGFydC1zYW5pdGl6ZS1tMzQwICovCi0JICAgIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9MSVRUTEUpCi0JICAgICAgdmFsID0gKGlieXRlc1szXSA8PCAyNCkgfCAoaWJ5dGVzWzJdIDw8IDE2KQotCQl8IChpYnl0ZXNbMV0gPDwgOCkgfCAoaWJ5dGVzWzBdKTsKLQkgICAgZWxzZQotLyogZW5kLXNhbml0aXplLW0zNDAgKi8KLQkgICAgICB2YWwgPSAoaWJ5dGVzWzBdIDw8IDI0KSB8IChpYnl0ZXNbMV0gPDwgMTYpCi0JCXwgKGlieXRlc1syXSA8PCA4KSB8IChpYnl0ZXNbM10pOwotCSAgICAKLQkgICAgLyogUmVtb3ZlZCBbXSBhcm91bmQgbGl0ZXJhbCB2YWx1ZSB0byBtYXRjaCBBQkkgc3ludGF4IDEyLzk1LiAgKi8KLQkgICAgZnByaW50ZiAoc3RyZWFtLCAiXHQweCVYIiwgdmFsKTsKLQkgICAgLyogRm9yIGptcGkvanNyaSwgd2UnbGwgdHJ5IHRvIGdldCBhIHN5bWJvbCBmb3IgdGhlIHRhcmdldC4gICovCi0JICAgIGlmIChpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgJiYgdmFsICE9IDApCi0JICAgICAgewotCQlmcHJpbnRmIChzdHJlYW0sICJcdC8vICIpOwotCQlpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgKHZhbCwgaW5mbyk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlmcHJpbnRmIChzdHJlYW0sICJcdC8vIGZyb20gYWRkcmVzcyBwb29sIGF0IDB4JXgiLAotCQkJIChtZW1hZGRyICsgMiArICgoaW5zdCAmIDB4RkYpIDw8IDIpKSAmIDB4RkZGRkZGRkMpOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCSAgCi0JZGVmYXVsdDoKLQkgIC8qIGlmIHRoZSBkaXNhc3NlbWJsZXIgbGFncyB0aGUgaW5zdHJ1Y3Rpb24gc2V0ICovCi0JICBmcHJpbnRmIChzdHJlYW0sICJcdHVuZGVjb2RlZCBvcGVyYW5kcywgaW5zdCBpcyAweCUwNHgiLCBpbnN0KTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIAotICAvKiBTYXkgaG93IG1hbnkgYnl0ZXMgd2UgY29uc3VtZWQ/ICovCi0gIHJldHVybiAyOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tY29yZS1vcGMuaCBiL29wY29kZXMvbWNvcmUtb3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NmY3OGIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tY29yZS1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKiBBc3NlbWJsZXIgaW5zdHJ1Y3Rpb25zIGZvciBNb3Rvcm9sbGEncyBNY29yZSBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotdHlwZWRlZiBlbnVtCi17Ci0gIE8wLCAgICBPVCwgICBPMSwgICBPQywgICBPMiwgICAgWDEsICAgIE9JLCAgICBPQiwKLSAgT01hLCAgIFNJLCAgIEk3LCAgIExTLCAgIEJSLCAgICBCTCwgICAgTFIsICAgIExKLAotICBSTSwgICAgUlEsICAgSlNSLCAgSk1QLCAgT0JSYSwgIE9CUmIsICBPQlJjLCAgT0JSMiwKLSAgTzFSMSwgIE9NYiwgIE9NYywgIFNJYSwKLSAgLyogc3RhcnQtc2FuaXRpemUtbTM0MCAqLyAgCi0gIE1VTFNILAotICAvKiBlbmQtc2FuaXRpemUtbTM0MCAqLyAgCi0gIEpDLCAgICBKVSwgICBKTCwgICBSU0ksICBETzIxLCAgT0IyCi19Ci1tY29yZV9vcGNsYXNzOwotCi10eXBlZGVmIHN0cnVjdCBpbnN0Ci17Ci0gIGNoYXIgKiAgICAgICAgIG5hbWU7Ci0gIG1jb3JlX29wY2xhc3MgIG9wY2xhc3M7Ci0gIHVuc2lnbmVkIGNoYXIgIHRyYW5zZmVyOwotICB1bnNpZ25lZCBzaG9ydCBpbnN0OwotfQotbWNvcmVfb3Bjb2RlX2luZm87Ci0KLSNpZmRlZiBERUZJTkVfVEFCTEUKLW1jb3JlX29wY29kZV9pbmZvIG1jb3JlX3RhYmxlW10gPQotewotICB7ICJia3B0IiwJTzAsCTAsCTB4MDAwMCB9LAotICB7ICJzeW5jIiwJTzAsCTAsCTB4MDAwMSB9LAotICB7ICJydGUiLAlPMCwJMSwJMHgwMDAyIH0sCi0gIHsgInJmZSIsCU8wLAkxLAkweDAwMDIgfSwKLSAgeyAicmZpIiwJTzAsCTEsCTB4MDAwMyB9LAotICB7ICJzdG9wIiwJTzAsCTAsCTB4MDAwNCB9LAotICB7ICJ3YWl0IiwJTzAsCTAsCTB4MDAwNSB9LAotICB7ICJkb3plIiwJTzAsCTAsCTB4MDAwNiB9LAotICAvKiBzdGFydC1zYW5pdGl6ZS1tMzQwICovCi0gIHsgImlkbHk0IiwgICAgTzAsICAgICAwLCAgICAgIDB4MDAwNyB9LAotICAvKiBlbmQtc2FuaXRpemUtbTM0MCAqLwotICB7ICJ0cmFwIiwJT1QsCTAsCTB4MDAwOCB9LAotLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDAwMEMgLSAweDAwMEYgKi8KLS8qIFNQQUNFOiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwIC0gMHgwMDFGICovCi0gIHsgIm12YyIsCU8xLAkwLAkweDAwMjAgfSwKLSAgeyAibXZjdiIsCU8xLAkwLAkweDAwMzAgfSwKLSAgeyAibGRxIiwJUlEsCTAsCTB4MDA0MCB9LAotICB7ICJzdHEiLAlSUSwJMCwJMHgwMDUwIH0sCi0gIHsgImxkbSIsCVJNLAkwLAkweDAwNjAgfSwKLSAgeyAic3RtIiwJUk0sCTAsCTB4MDA3MCB9LAotICB7ICJkZWN0IiwJTzEsCTAsCTB4MDA4MCB9LAotICB7ICJkZWNmIiwJTzEsCTAsCTB4MDA5MCB9LAotICB7ICJpbmN0IiwJTzEsCTAsCTB4MDBBMCB9LAotICB7ICJpbmNmIiwJTzEsCTAsCTB4MDBCMCB9LAotICB7ICJqbXAiLAlKTVAsCTIsCTB4MDBDMCB9LAotI2RlZmluZQlNQ09SRV9JTlNUX0pNUAkweDAwQzAKLSAgeyAianNyIiwJSlNSLAkwLAkweDAwRDAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9KU1IJMHgwMEUwCi0gIHsgImZmMSIsCU8xLAkwLAkweDAwRTAgfSwKLSAgeyAiYnJldiIsCU8xLAkwLAkweDAwRjAgfSwKLSAgeyAieHRyYjMiLAlYMSwJMCwJMHgwMTAwIH0sCi0gIHsgInh0cmIyIiwJWDEsCTAsCTB4MDExMCB9LAotICB7ICJ4dHJiMSIsCVgxLAkwLAkweDAxMjAgfSwKLSAgeyAieHRyYjAiLAlYMSwJMCwJMHgwMTMwIH0sCi0gIHsgInpleHRiIiwJTzEsCTAsCTB4MDE0MCB9LAotICB7ICJzZXh0YiIsCU8xLAkwLAkweDAxNTAgfSwKLSAgeyAiemV4dGgiLAlPMSwJMCwJMHgwMTYwIH0sCi0gIHsgInNleHRoIiwJTzEsCTAsCTB4MDE3MCB9LAotICB7ICJkZWNsdCIsCU8xLAkwLAkweDAxODAgfSwKLSAgeyAidHN0bmJ6IiwJTzEsCTAsCTB4MDE5MCB9LAotICB7ICJkZWNndCIsCU8xLAkwLAkweDAxQTAgfSwKLSAgeyAiZGVjbmUiLAlPMSwJMCwJMHgwMUIwIH0sCi0gIHsgImNscnQiLAlPMSwJMCwJMHgwMUMwIH0sCi0gIHsgImNscmYiLAlPMSwJMCwJMHgwMUQwIH0sCi0gIHsgImFicyIsCU8xLAkwLAkweDAxRTAgfSwKLSAgeyAibm90IiwJTzEsCTAsCTB4MDFGMCB9LAotICB7ICJtb3Z0IiwJTzIsCTAsCTB4MDIwMCB9LAotICB7ICJtdWx0IiwJTzIsCTAsCTB4MDMwMCB9LAotICB7ICJsb29wdCIsCUJMLAkwLAkweDA0MDAgfSwKLSAgeyAic3VidSIsCU8yLAkwLAkweDA1MDAgfSwKLSAgeyAic3ViIiwJTzIsCTAsCTB4MDUwMCB9LCAvKiBPZmZpY2lhbCBhbGlhcy4gICovCi0gIHsgImFkZGMiLAlPMiwJMCwJMHgwNjAwIH0sCi0gIHsgInN1YmMiLAlPMiwJMCwJMHgwNzAwIH0sCi0vKiBTUEFDRTogMHgwODAwLTB4MDhmZiBmb3IgYSBkaWFkaWMgb3BlcmF0aW9uICovCi0vKiBTUEFDRTogMHgwOTAwLTB4MDlmZiBmb3IgYSBkaWFkaWMgb3BlcmF0aW9uICovCi0gIHsgIm1vdmYiLAlPMiwJMCwJMHgwQTAwIH0sCi0gIHsgImxzciIsCU8yLAkwLAkweDBCMDAgfSwKLSAgeyAiY21waHMiLAlPMiwJMCwJMHgwQzAwIH0sCi0gIHsgImNtcGx0IiwJTzIsCTAsCTB4MEQwMCB9LAotICB7ICJ0c3QiLAlPMiwJMCwJMHgwRTAwIH0sCi0gIHsgImNtcG5lIiwJTzIsCTAsCTB4MEYwMCB9LAotICB7ICJtZmNyIiwJT0MsCTAsCTB4MTAwMCB9LAotICB7ICJtb3YiLAlPMiwJMCwJMHgxMjAwIH0sCi0gIHsgImJnZW5yIiwJTzIsCTAsCTB4MTMwMCB9LAotICB7ICJyc3ViIiwJTzIsCTAsCTB4MTQwMCB9LAotICB7ICJpeHciLAlPMiwJMCwJMHgxNTAwIH0sCi0gIHsgImFuZCIsCU8yLAkwLAkweDE2MDAgfSwKLSAgeyAieG9yIiwJTzIsCTAsCTB4MTcwMCB9LAotICB7ICJtdGNyIiwJT0MsCTAsCTB4MTgwMCB9LAotICB7ICJhc3IiLAlPMiwJMCwJMHgxQTAwIH0sCi0gIHsgImxzbCIsCU8yLAkwLAkweDFCMDAgfSwKLSAgeyAiYWRkdSIsCU8yLAkwLAkweDFDMDAgfSwKLSAgeyAiaXhoIiwJTzIsCTAsCTB4MUQwMCB9LAotICB7ICJvciIsCU8yLAkwLAkweDFFMDAgfSwKLSAgeyAiYW5kbiIsCU8yLAkwLAkweDFGMDAgfSwKLSAgeyAiYWRkaSIsCU9JLAkwLAkweDIwMDAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9BRERJCTB4MjAwMAotICB7ICJjbXBsdGkiLAlPSSwJMCwJMHgyMjAwIH0sCi0gIHsgInN1YmkiLAlPSSwJMCwJMHgyNDAwIH0sCi0vKiBTUEFDRTogMHgyNjAwLTB4MjdmZiBvcGVuIGZvciBhIHJlZ2lzdGVyK2ltbWVkaWF0ZSAgb3BlcmF0aW9uICovCi0gIHsgInJzdWJpIiwJT0IsCTAsCTB4MjgwMCB9LAotICB7ICJjbXBuZWkiLAlPQiwJMCwJMHgyQTAwIH0sCi0gIHsgImJtYXNraSIsCU9NYSwJMCwJMHgyQzAwIH0sCi0gIHsgImRpdnUiLAlPMVIxLAkwLAkweDJDMTAgfSwKLS8qIFNQQUNFOiAgICAgICAgICAgICAgICAgICAgICAgMHgyYzIwIC0gMHgyYzdmICovICAKLSAgeyAiYm1hc2tpIiwJT01iLAkwLAkweDJDODAgfSwKLSAgeyAiYm1hc2tpIiwJT01jLAkwLAkweDJEMDAgfSwKLSAgeyAiYW5kaSIsCU9CLAkwLAkweDJFMDAgfSwKLSAgeyAiYmNscmkiLAlPQiwJMCwJMHgzMDAwIH0sCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4MzIwMCAtIDB4MzIwZiAqLwotICB7ICJkaXZzIiwJTzFSMSwJMCwJMHgzMjEwIH0sCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4MzIyMCAtIDB4MzI2ZiAqLyAgCi0gIHsgImJnZW5pIiwJT0JSYSwJMCwJMHgzMjcwIH0sCi0gIHsgImJnZW5pIiwJT0JSYiwJMCwJMHgzMjgwIH0sCi0gIHsgImJnZW5pIiwJT0JSYywJMCwJMHgzMzAwIH0sCi0gIHsgImJzZXRpIiwJT0IsCTAsCTB4MzQwMCB9LAotICB7ICJidHN0aSIsCU9CLAkwLAkweDM2MDAgfSwKLSAgeyAieHNyIiwJTzEsCTAsCTB4MzgwMCB9LAotICB7ICJyb3RsaSIsCVNJYSwJMCwJMHgzODAwIH0sCi0gIHsgImFzcmMiLAlPMSwJMCwJMHgzQTAwIH0sCi0gIHsgImFzcmkiLAlTSWEsCTAsCTB4M0EwMCB9LAotICB7ICJsc2xjIiwJTzEsCTAsCTB4M0MwMCB9LAotICB7ICJsc2xpIiwJU0lhLAkwLAkweDNDMDAgfSwKLSAgeyAibHNyYyIsCU8xLAkwLAkweDNFMDAgfSwKLSAgeyAibHNyaSIsCVNJYSwJMCwJMHgzRTAwIH0sCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAtIDB4NWZmZiAqLwotICB7ICJtb3ZpIiwJSTcsCTAsCTB4NjAwMCB9LAotI2RlZmluZSBNQ09SRV9JTlNUX0JNQVNLSV9BTFQJMHg2MDAwCi0jZGVmaW5lIE1DT1JFX0lOU1RfQkdFTklfQUxUCTB4NjAwMAotLyogc3RhcnQtc2FuaXRpemUtbTM0MCAqLwotICB7ICJtdWxzaCIsICAgIE1VTFNILCAgMCwgICAgICAweDY4MDAgfSwKLSAgeyAibXVscy5oIiwgICBNVUxTSCwgIDAsICAgICAgMHg2ODAwIH0sCi0vKiBlbmQtc2FuaXRpemUtbTM0MCAqLwotLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDY5MDAgLSAweDZGRkYgKi8KLSAgeyAiam1waSIsCUxKLAkxLAkweDcwMDAgfSwKLSAgeyAianNyaSIsCUxKLAkwLAkweDdGMDAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9KTVBJCTB4NzAwMAotICB7ICJscnciLAlMUiwJMCwJMHg3MDAwIH0sCi0jZGVmaW5lCU1DT1JFX0lOU1RfSlNSSQkweDdGMDAKLSAgeyAibGQiLAlMUywJMCwJMHg4MDAwIH0sCi0gIHsgImxkdyIsCUxTLAkwLAkweDgwMDAgfSwKLSAgeyAibGQudyIsCUxTLAkwLAkweDgwMDAgfSwKLSAgeyAic3QiLAlMUywJMCwJMHg5MDAwIH0sCi0gIHsgInN0dyIsCUxTLAkwLAkweDkwMDAgfSwKLSAgeyAic3QudyIsCUxTLAkwLAkweDkwMDAgfSwKLSAgeyAibGRiIiwJTFMsCTAsCTB4QTAwMCB9LAotICB7ICJsZC5iIiwJTFMsCTAsCTB4QTAwMCB9LAotICB7ICJzdGIiLAlMUywJMCwJMHhCMDAwIH0sCi0gIHsgInN0LmIiLAlMUywJMCwJMHhCMDAwIH0sCi0gIHsgImxkaCIsCUxTLAkwLAkweEMwMDAgfSwKLSAgeyAibGQuaCIsCUxTLAkwLAkweEMwMDAgfSwKLSAgeyAic3RoIiwJTFMsCTAsCTB4RDAwMCB9LAotICB7ICJzdC5oIiwJTFMsCTAsCTB4RDAwMCB9LAotICB7ICJidCIsCUJSLAkwLAkweEUwMDAgfSwKLSAgeyAiYmYiLAlCUiwJMCwJMHhFODAwIH0sCi0gIHsgImJyIiwJQlIsCTEsCTB4RjAwMCB9LAotI2RlZmluZQlNQ09SRV9JTlNUX0JSCTB4RjAwMAotICB7ICJic3IiLAlCUiwJMCwJMHhGODAwIH0sCi0jZGVmaW5lCU1DT1JFX0lOU1RfQlNSCTB4RjgwMAotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSByZWxheGFibGUgYnJhbmNoZXMgKi8KLSAgeyAiamJ0IiwJSkMsCTAsCTB4RTAwMCB9LAotICB7ICJqYmYiLAlKQywJMCwJMHhFODAwIH0sCi0gIHsgImpiciIsCUpVLAkxLAkweEYwMDAgfSwKLSAgeyAiamJzciIsCUpMLAkwLAkweEY4MDAgfSwKLQotLyogVGhlIGZvbGxvd2luZyBhcmUgYWxpYXNlcyBmb3Igb3RoZXIgaW5zdHJ1Y3Rpb25zICovCi0gIHsgInJ0cyIsCU8wLAkyLAkweDAwQ0YgfSwgIC8qIGptcCByMTUgKi8KLSAgeyAicm9sYyIsCURPMjEsCTAsCTB4MDYwMCB9LCAgLyogYWRkYyByZCxyZCAqLwotICB7ICJyb3RsYyIsCURPMjEsICAgMCwJMHgwNjAwIH0sICAvKiBhZGRjIHJkLHJkICovCi0gIHsgInNldGMiLAlPMCwJMCwJMHgwQzAwIH0sICAvKiBjbXBocyByMCxyMCAqLwotICB7ICJjbHJjIiwJTzAsCTAsCTB4MEYwMCB9LCAgLyogY21wbmUgcjAscjAgKi8KLSAgeyAidHN0bGUiLAlPMSwJMCwJMHgyMjAwIH0sICAvKiBjbXBsdGkgcmQsMSAqLwotICB7ICJjbXBsZWkiLAlPQiwJMCwJMHgyMjAwIH0sICAvKiBjbXBsZWkgcmQsWCAtPiBjbXBsdGkgcmQsWCsxICovCi0gIHsgIm5lZyIsCU8xLAkwLAkweDI4MDAgfSwgIC8qIHJzdWJpIHJkLDAgKi8KLSAgeyAidHN0bmUiLAlPMSwJMCwJMHgyQTAwIH0sICAvKiBjbXBuZWkgcmQsMCAqLwotICB7ICJ0c3RsdCIsCU8xLAkwLAkweDM3RjAgfSwgIC8qIGJ0c3RpIHJ4LDMxICovCi0gIHsgIm1jbHJpIiwJT0IyLAkwLAkweDMwMDAgfSwgIC8qIGJjbHJpIHJ4LGxvZzIoaW1tKSAqLwotICB7ICJtZ2VuaSIsCU9CUjIsCTAsCTB4MzIwMCB9LCAgLyogYmdlbmkgcngsbG9nMihpbW0pICovCi0gIHsgIm1zZXRpIiwJT0IyLAkwLAkweDM0MDAgfSwgIC8qIGJzZXRpIHJ4LGxvZzIoaW1tKSAqLwotICB7ICJtdHN0aSIsCU9CMiwJMCwJMHgzNjAwIH0sICAvKiBidHN0aSByeCxsb2cyKGltbSkgKi8KLSAgeyAicm9yaSIsCVJTSSwJMCwJMHgzODAwIH0sCi0gIHsgInJvdHJpIiwJUlNJLCAgICAwLAkweDM4MDAgfSwKLSAgeyAibm9wIiwJTzAsICAgICAwLAkweDEyMDAgfSwgIC8qIG1vdiByMCwgcjAgKi8KLSAgeyAwLAkJMCwJMCwgICAgICAwIH0KLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvbWlwcy1kaXMuYyBiL29wY29kZXMvbWlwcy1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUzNTc3Yy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL21pcHMtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDY4ICswLDAgQEAKLS8qIFByaW50IG1pcHMgaW5zdHJ1Y3Rpb25zIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIsIG9yIGZvciBvYmpkdW1wLgotICAgQ29weXJpZ2h0IChjKSAxOTg5LCA5MS05NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE5vYnV5dWtpIEhpa2ljaGkoaGlraWNoaUBzcmEuY28uanApLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGNvZGUvbWlwcy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBGSVhNRTogVGhlc2UgYXJlIG5lZWRlZCB0byBmaWd1cmUgb3V0IGlmIHRoZSBjb2RlIGlzIG1pcHMxNiBvcgotICAgbm90LiBUaGUgbG93IGJpdCBvZiB0aGUgYWRkcmVzcyBpcyBvZnRlbiBhIGdvb2QgaW5kaWNhdG9yLiAgTm8KLSAgIHN5bWJvbCB0YWJsZSBpcyBhdmFpbGFibGUgd2hlbiB0aGlzIGNvZGUgcnVucyBvdXQgaW4gYW4gZW1iZWRkZWQKLSAgIHN5c3RlbSBhcyB3aGVuIGl0IGlzIHVzZWQgZm9yIGRpc2Fzc2VtYmxlciBzdXBwb3J0IGluIGEgbW9uaXRvci4gKi8KLQotI2lmICFkZWZpbmVkKEVNQkVEREVEX0VOVikKLSNkZWZpbmUgU1lNVEFCX0FWQUlMQUJMRSAxCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0jZW5kaWYKLQotc3RhdGljIGludCBwcmludF9pbnNuX21pcHMxNiBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9taXBzMTZfaW5zbl9hcmcKLSAgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKiwgaW50LCBib29sZWFuLCBpbnQsIGJmZF92bWEsCi0JICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0vKiBNaXBzIGluc3RydWN0aW9ucyBhcmUgbmV2ZXIgbG9uZ2VyIHRoYW4gdGhpcyBtYW55IGJ5dGVzLiAgKi8KLSNkZWZpbmUgTUFYTEVOIDQKLQotc3RhdGljIHZvaWQgcHJpbnRfaW5zbl9hcmcgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBiZmRfdm1hLAotCQkJCSAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci1zdGF0aWMgaW50IF9wcmludF9pbnNuX21pcHMgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgbG9uZyBpbnQsCi0JCQkJICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLQwKLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBnZGIgc29tZWhvdy4gICovCi0jZGVmaW5lIFJFR0lTVEVSX05BTUVTIAlcCi0gICAgewkiemVybyIsCSJhdCIsCSJ2MCIsCSJ2MSIsCSJhMCIsCSJhMSIsCSJhMiIsCSJhMyIsIFwKLQkidDAiLAkidDEiLAkidDIiLAkidDMiLAkidDQiLAkidDUiLAkidDYiLAkidDciLCBcCi0JInMwIiwJInMxIiwJInMyIiwJInMzIiwJInM0IiwJInM1IiwJInM2IiwJInM3IiwgXAotCSJ0OCIsCSJ0OSIsCSJrMCIsCSJrMSIsCSJncCIsCSJzcCIsCSJzOCIsCSJyYSIsIFwKLQkic3IiLAkibG8iLAkiaGkiLAkiYmFkIiwJImNhdXNlIiwicGMiLCAgICBcCi0JImYwIiwgICAiZjEiLCAgICJmMiIsICAgImYzIiwgICAiZjQiLCAgICJmNSIsICAgImY2IiwgICAiZjciLCBcCi0JImY4IiwgICAiZjkiLCAgICJmMTAiLCAgImYxMSIsICAiZjEyIiwgICJmMTMiLCAgImYxNCIsICAiZjE1IiwgXAotCSJmMTYiLCAgImYxNyIsICAiZjE4IiwgICJmMTkiLCAgImYyMCIsICAiZjIxIiwgICJmMjIiLCAgImYyMyIsXAotCSJmMjQiLCAgImYyNSIsICAiZjI2IiwgICJmMjciLCAgImYyOCIsICAiZjI5IiwgICJmMzAiLCAgImYzMSIsXAotCSJmc3IiLCAgImZpciIsICAiZnAiLCAgICJpbngiLCAgInJhbmQiLCAidGxibG8iLCJjdHh0IiwgInRsYmhpIixcCi0JImVwYyIsICAicHJpZCJcCi0gICAgfQotCi1zdGF0aWMgQ09OU1QgY2hhciAqIENPTlNUIHJlZ19uYW1lc1tdID0gUkVHSVNURVJfTkFNRVM7Ci0KLS8qIFRoZSBtaXBzMTYgcmVnaXN0ZXIgbmFtZXMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtaXBzMTZfcmVnX25hbWVzW10gPQotewotICAiczAiLCAiczEiLCAidjAiLCAidjEiLCAiYTAiLCAiYTEiLCAiYTIiLCAiYTMiCi19OwotDAotLyogc3Vicm91dGluZSAqLwotc3RhdGljIHZvaWQKLXByaW50X2luc25fYXJnIChkLCBsLCBwYywgaW5mbykKLSAgICAgY29uc3QgY2hhciAqZDsKLSAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgbDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBkZWx0YTsKLQotICBzd2l0Y2ggKCpkKQotICAgIHsKLSAgICBjYXNlICcsJzoKLSAgICBjYXNlICcoJzoKLSAgICBjYXNlICcpJzoKLSAgICAgICgqaW5mby0+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+bWFzaykgPT0gb3AtPm1hdGNoKQotCSAgICB7Ci0JICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqZDsKLQkgICAgICBpbnQgaW5zbl9pc2E7Ci0KLQkgICAgICBpZiAoKG9wLT5tZW1iZXJzaGlwICYgSU5TTl9JU0EpID09IElOU05fSVNBMSkKLQkJaW5zbl9pc2EgPSAxOwotCSAgICAgIGVsc2UgaWYgKChvcC0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTIpCi0JCWluc25faXNhID0gMjsKLQkgICAgICBlbHNlIGlmICgob3AtPm1lbWJlcnNoaXAgJiBJTlNOX0lTQSkgPT0gSU5TTl9JU0EzKQotCQlpbnNuX2lzYSA9IDM7Ci0JICAgICAgZWxzZSBpZiAoKG9wLT5tZW1iZXJzaGlwICYgSU5TTl9JU0EpID09IElOU05fSVNBNCkKLQkJaW5zbl9pc2EgPSA0OwotCSAgICAgIGVsc2UKLQkJaW5zbl9pc2EgPSAxNTsKLQotCSAgICAgIGlmIChpbnNuX2lzYSA+IG1pcHNfaXNhCi0JCSAgJiYgKHRhcmdldF9wcm9jZXNzb3IgPT0gNDY1MAotCQkgICAgICAmJiBvcC0+bWVtYmVyc2hpcCAmIElOU05fNDY1MCkgPT0gMAotCQkgICYmICh0YXJnZXRfcHJvY2Vzc29yID09IDQwMTAKLQkJICAgICAgJiYgb3AtPm1lbWJlcnNoaXAgJiBJTlNOXzQwMTApID09IDAKLQkJICAmJiAodGFyZ2V0X3Byb2Nlc3NvciA9PSA0MTAwCi0JCSAgICAgICYmIG9wLT5tZW1iZXJzaGlwICYgSU5TTl80MTAwKSA9PSAwCi0JCSAgJiYgKHRhcmdldF9wcm9jZXNzb3IgPT0gMzkwMAotCQkgICAgICAmJiBvcC0+bWVtYmVyc2hpcCAmIElOU05fMzkwMCkgPT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3AtPm5hbWUpOwotCi0JICAgICAgZCA9IG9wLT5hcmdzOwotCSAgICAgIGlmIChkICE9IE5VTEwgJiYgKmQgIT0gJ1wwJykKLQkJewotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdCIpOwotCQkgIGZvciAoOyAqZCAhPSAnXDAnOyBkKyspCi0JCSAgICAgIHByaW50X2luc25fYXJnIChkLCB3b3JkLCBtZW1hZGRyLCBpbmZvKTsKLQkJfQotCi0JICAgICAgcmV0dXJuIDQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEhhbmRsZSB1bmRlZmluZWQgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4Iiwgd29yZCk7Ci0gIHJldHVybiA0OwotfQotCi0KLS8qIEluIGFuIGVudmlyb25tZW50IHdoZXJlIHdlIGRvIG5vdCBrbm93IHRoZSBzeW1ib2wgdHlwZSBvZiB0aGUKLSAgIGluc3RydWN0aW9uIHdlIGFyZSBmb3JjZWQgdG8gYXNzdW1lIHRoYXQgdGhlIGxvdyBvcmRlciBiaXQgb2YgdGhlCi0gICBpbnN0cnVjdGlvbnMnIGFkZHJlc3MgbWF5IG1hcmsgaXQgYXMgYSBtaXBzMTYgaW5zdHJ1Y3Rpb24uICBJZiB3ZQotICAgYXJlIHNpbmdsZSBzdGVwcGluZywgb3IgdGhlIHBjIGlzIHdpdGhpbiB0aGUgZGlzYXNzZW1ibGVkIGZ1bmN0aW9uLAotICAgdGhpcyB3b3Jrcy4gIE90aGVyd2lzZSwgd2UgbmVlZCBhIGNsdWUuICBTb21ldGltZXMuICAqLwotCi1pbnQKLXByaW50X2luc25fYmlnX21pcHMgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgaW50IHN0YXR1czsKLQotI2lmIDEKLSAgLyogRklYTUU6IElmIG9kZCBhZGRyZXNzLCB0aGlzIGlzIENMRUFSTFkgYSBtaXBzIDE2IGluc3RydWN0aW9uLiAgKi8KLSAgLyogT25seSBhIGZldyB0b29scyB3aWxsIHdvcmsgdGhpcyB3YXkuICAqLwotICBpZiAobWVtYWRkciAmIDB4MDEpCi0gICAgcmV0dXJuIHByaW50X2luc25fbWlwczE2IChtZW1hZGRyLCBpbmZvKTsKLSNlbmRpZiAgCi0KLSNpZiBTWU1UQUJfQVZBSUxBQkxFCi0gIGlmIChpbmZvLT5tYWNoID09IDE2Ci0gICAgICB8fCAoaW5mby0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0JICAmJiBpbmZvLT5zeW1ib2xzICE9IE5VTEwKLQkgICYmICgoKihlbGZfc3ltYm9sX3R5cGUgKiopIGluZm8tPnN5bWJvbHMpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyCi0JICAgICAgPT0gU1RPX01JUFMxNikpKQotICAgIHJldHVybiBwcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbyk7Ci0jZW5kaWYgIAotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgPT0gMCkKLSAgICByZXR1cm4gX3ByaW50X2luc25fbWlwcyAobWVtYWRkciwgKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRiMzIgKGJ1ZmZlciksCi0JCQkgICAgIGluZm8pOwotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi1pbnQKLXByaW50X2luc25fbGl0dGxlX21pcHMgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgaW50IHN0YXR1czsKLQotCi0jaWYgMQotICBpZiAobWVtYWRkciAmIDB4MDEpCi0gICAgcmV0dXJuIHByaW50X2luc25fbWlwczE2IChtZW1hZGRyLCBpbmZvKTsKLSNlbmRpZiAgCi0KLSNpZiBTWU1UQUJfQVZBSUxBQkxFCi0gIGlmIChpbmZvLT5tYWNoID09IDE2Ci0gICAgICB8fCAoaW5mby0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0JICAmJiBpbmZvLT5zeW1ib2xzICE9IE5VTEwKLQkgICYmICgoKihlbGZfc3ltYm9sX3R5cGUgKiopIGluZm8tPnN5bWJvbHMpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyCi0JICAgICAgPT0gU1RPX01JUFMxNikpKQotICAgIHJldHVybiBwcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbyk7Ci0jZW5kaWYgIAotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgPT0gMCkKLSAgICByZXR1cm4gX3ByaW50X2luc25fbWlwcyAobWVtYWRkciwgKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRsMzIgKGJ1ZmZlciksCi0JCQkgICAgIGluZm8pOwotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotDAotLyogRGlzYXNzZW1ibGUgbWlwczE2IGluc3RydWN0aW9ucy4gICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fbWlwczE2IChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgc3RhdHVzOwotICBiZmRfYnl0ZSBidWZmZXJbMl07Ci0gIGludCBsZW5ndGg7Ci0gIGludCBpbnNuOwotICBib29sZWFuIHVzZV9leHRlbmQ7Ci0gIGludCBleHRlbmQgPSAwOwotICBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKm9wLCAqb3BlbmQ7Ci0KLSAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gMjsKLSAgaW5mby0+ZGlzcGxheV9lbmRpYW4gPSBpbmZvLT5lbmRpYW47Ci0KLSAgaW5mby0+aW5zbl9pbmZvX3ZhbGlkID0gMTsKLSAgaW5mby0+YnJhbmNoX2RlbGF5X2luc25zID0gMDsKLSAgaW5mby0+ZGF0YV9zaXplID0gMDsKLSAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmJyYW5jaDsKLSAgaW5mby0+dGFyZ2V0ID0gMDsKLSAgaW5mby0+dGFyZ2V0MiA9IDA7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBsZW5ndGggPSAyOwotCi0gIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcpCi0gICAgaW5zbiA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0gIGVsc2UKLSAgICBpbnNuID0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLQotICAvKiBIYW5kbGUgdGhlIGV4dGVuZCBvcGNvZGUgc3BlY2lhbGx5LiAgKi8KLSAgdXNlX2V4dGVuZCA9IGZhbHNlOwotICBpZiAoKGluc24gJiAweGY4MDApID09IDB4ZjAwMCkKLSAgICB7Ci0gICAgICB1c2VfZXh0ZW5kID0gdHJ1ZTsKLSAgICAgIGV4dGVuZCA9IGluc24gJiAweDdmZjsKLQotICAgICAgbWVtYWRkciArPSAyOwotCi0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZXh0ZW5kIDB4JXgiLAotCQkJCSAodW5zaWduZWQgaW50KSBleHRlbmQpOwotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQotCWluc24gPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotICAgICAgZWxzZQotCWluc24gPSBiZmRfZ2V0bDE2IChidWZmZXIpOwotCi0gICAgICAvKiBDaGVjayBmb3IgYW4gZXh0ZW5kIG9wY29kZSBmb2xsb3dlZCBieSBhbiBleHRlbmQgb3Bjb2RlLiAgKi8KLSAgICAgIGlmICgoaW5zbiAmIDB4ZjgwMCkgPT0gMHhmMDAwKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZXh0ZW5kIDB4JXgiLAotCQkJCSAodW5zaWduZWQgaW50KSBleHRlbmQpOwotCSAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmluc247Ci0JICByZXR1cm4gbGVuZ3RoOwotCX0KLQotICAgICAgbGVuZ3RoICs9IDI7Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBTaG91bGQgcHJvYmFibHkgdXNlIGEgaGFzaCB0YWJsZSBvbiB0aGUgbWFqb3Igb3Bjb2RlIGhlcmUuICAqLwotCi0gIG9wZW5kID0gbWlwczE2X29wY29kZXMgKyBiZmRfbWlwczE2X251bV9vcGNvZGVzOwotICBmb3IgKG9wID0gbWlwczE2X29wY29kZXM7IG9wIDwgb3BlbmQ7IG9wKyspCi0gICAgewotICAgICAgaWYgKG9wLT5waW5mbyAhPSBJTlNOX01BQ1JPICYmIChpbnNuICYgb3AtPm1hc2spID09IG9wLT5tYXRjaCkKLQl7Ci0JICBjb25zdCBjaGFyICpzOwotCi0JICBpZiAoc3RyY2hyIChvcC0+YXJncywgJ2EnKSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHVzZV9leHRlbmQpCi0JCXsKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImV4dGVuZCAweCV4IiwKLQkJCQkJICh1bnNpZ25lZCBpbnQpIGV4dGVuZCk7Ci0JCSAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmluc247Ci0JCSAgcmV0dXJuIGxlbmd0aCAtIDI7Ci0JCX0KLQotCSAgICAgIHVzZV9leHRlbmQgPSBmYWxzZTsKLQotCSAgICAgIG1lbWFkZHIgKz0gMjsKLQotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMiwKLQkJCQkJCSAgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyA9PSAwKQotCQl7Ci0JCSAgdXNlX2V4dGVuZCA9IHRydWU7Ci0JCSAgaWYgKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRykKLQkJICAgIGV4dGVuZCA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0JCSAgZWxzZQotCQkgICAgZXh0ZW5kID0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLQkJICBsZW5ndGggKz0gMjsKLQkJfQotCSAgICB9Ci0KLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBvcC0+bmFtZSk7Ci0JICBpZiAob3AtPmFyZ3NbMF0gIT0gJ1wwJykKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdCIpOwotCi0JICBmb3IgKHMgPSBvcC0+YXJnczsgKnMgIT0gJ1wwJzsgcysrKQotCSAgICB7Ci0JICAgICAgaWYgKCpzID09ICcsJwotCQkgICYmIHNbMV0gPT0gJ3cnCi0JCSAgJiYgKCgoaW5zbiA+PiBNSVBTMTZPUF9TSF9SWCkgJiBNSVBTMTZPUF9NQVNLX1JYKQotCQkgICAgICA9PSAoKGluc24gPj4gTUlQUzE2T1BfU0hfUlkpICYgTUlQUzE2T1BfTUFTS19SWSkpKQotCQl7Ci0JCSAgLyogU2tpcCB0aGUgcmVnaXN0ZXIgYW5kIHRoZSBjb21tYS4gICovCi0JCSAgKytzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKCpzID09ICcsJwotCQkgICYmIHNbMV0gPT0gJ3YnCi0JCSAgJiYgKCgoaW5zbiA+PiBNSVBTMTZPUF9TSF9SWikgJiBNSVBTMTZPUF9NQVNLX1JaKQotCQkgICAgICA9PSAoKGluc24gPj4gTUlQUzE2T1BfU0hfUlgpICYgTUlQUzE2T1BfTUFTS19SWCkpKQotCQl7Ci0JCSAgLyogU2tpcCB0aGUgcmVnaXN0ZXIgYW5kIHRoZSBjb21tYS4gICovCi0JCSAgKytzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgcHJpbnRfbWlwczE2X2luc25fYXJnICgqcywgb3AsIGluc24sIHVzZV9leHRlbmQsIGV4dGVuZCwgbWVtYWRkciwKLQkJCQkgICAgIGluZm8pOwotCSAgICB9Ci0KLQkgIGlmICgob3AtPnBpbmZvICYgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZKSAhPSAwKQotCSAgICB7Ci0JICAgICAgaW5mby0+YnJhbmNoX2RlbGF5X2luc25zID0gMTsKLQkgICAgICBpZiAoaW5mby0+aW5zbl90eXBlICE9IGRpc19qc3IpCi0JCWluZm8tPmluc25fdHlwZSA9IGRpc19icmFuY2g7Ci0JICAgIH0KLQotCSAgcmV0dXJuIGxlbmd0aDsKLQl9Ci0gICAgfQotCi0gIGlmICh1c2VfZXh0ZW5kKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsIGV4dGVuZCB8IDB4ZjAwMCk7Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsIGluc24pOwotICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfbm9uaW5zbjsKLQotICByZXR1cm4gbGVuZ3RoOwotfQotCi0vKiBEaXNhc3NlbWJsZSBhbiBvcGVyYW5kIGZvciBhIG1pcHMxNiBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9taXBzMTZfaW5zbl9hcmcgKHR5cGUsIG9wLCBsLCB1c2VfZXh0ZW5kLCBleHRlbmQsIG1lbWFkZHIsIGluZm8pCi0gICAgIGludCB0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKm9wOwotICAgICBpbnQgbDsKLSAgICAgYm9vbGVhbiB1c2VfZXh0ZW5kOwotICAgICBpbnQgZXh0ZW5kOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJywnOgotICAgIGNhc2UgJygnOgotICAgIGNhc2UgJyknOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlYyIsIHR5cGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd5JzoKLSAgICBjYXNlICd3JzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgbWlwczE2X3JlZ19uYW1lc1soKGwgPj4gTUlQUzE2T1BfU0hfUlkpCi0JCQkJCSAgICAgICAmIE1JUFMxNk9QX01BU0tfUlkpXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ3YnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICBtaXBzMTZfcmVnX25hbWVzWygobCA+PiBNSVBTMTZPUF9TSF9SWCkKLQkJCQkJICAgICAgICYgTUlQUzE2T1BfTUFTS19SWCldKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIG1pcHMxNl9yZWdfbmFtZXNbKChsID4+IE1JUFMxNk9QX1NIX1JaKQotCQkJCQkgICAgICAgJiBNSVBTMTZPUF9NQVNLX1JaKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdaJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgbWlwczE2X3JlZ19uYW1lc1soKGwgPj4gTUlQUzE2T1BfU0hfTU9WRTMyWikKLQkJCQkJICAgICAgICYgTUlQUzE2T1BfTUFTS19NT1ZFMzJaKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcwJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwgcmVnX25hbWVzWzBdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsIHJlZ19uYW1lc1syOV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdQJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJHBjIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1InOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLCByZWdfbmFtZXNbMzFdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnWCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIHJlZ19uYW1lc1soKGwgPj4gTUlQUzE2T1BfU0hfUkVHUjMyKQotCQkJCQkmIE1JUFMxNk9QX01BU0tfUkVHUjMyKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdZJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgcmVnX25hbWVzW01JUFMxNk9QX0VYVFJBQ1RfUkVHMzJSIChsKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc8JzoKLSAgICBjYXNlICc+JzoKLSAgICBjYXNlICdbJzoKLSAgICBjYXNlICddJzoKLSAgICBjYXNlICc0JzoKLSAgICBjYXNlICc1JzoKLSAgICBjYXNlICdIJzoKLSAgICBjYXNlICdXJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdqJzoKLSAgICBjYXNlICc2JzoKLSAgICBjYXNlICc4JzoKLSAgICBjYXNlICdWJzoKLSAgICBjYXNlICdDJzoKLSAgICBjYXNlICdVJzoKLSAgICBjYXNlICdrJzoKLSAgICBjYXNlICdLJzoKLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdxJzoKLSAgICBjYXNlICdBJzoKLSAgICBjYXNlICdCJzoKLSAgICBjYXNlICdFJzoKLSAgICAgIHsKLQlpbnQgaW1tZWQsIG5iaXRzLCBzaGlmdCwgc2lnbmVkcCwgZXh0Yml0cywgcGNyZWwsIGV4dHUsIGJyYW5jaDsKLQotCXNoaWZ0ID0gMDsKLQlzaWduZWRwID0gMDsKLQlleHRiaXRzID0gMTY7Ci0JcGNyZWwgPSAwOwotCWV4dHUgPSAwOwotCWJyYW5jaCA9IDA7Ci0Jc3dpdGNoICh0eXBlKQotCSAgewotCSAgY2FzZSAnPCc6Ci0JICAgIG5iaXRzID0gMzsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9SWikgJiBNSVBTMTZPUF9NQVNLX1JaOwotCSAgICBleHRiaXRzID0gNTsKLQkgICAgZXh0dSA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnPic6Ci0JICAgIG5iaXRzID0gMzsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9SWCkgJiBNSVBTMTZPUF9NQVNLX1JYOwotCSAgICBleHRiaXRzID0gNTsKLQkgICAgZXh0dSA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnWyc6Ci0JICAgIG5iaXRzID0gMzsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9SWikgJiBNSVBTMTZPUF9NQVNLX1JaOwotCSAgICBleHRiaXRzID0gNjsKLQkgICAgZXh0dSA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnXSc6Ci0JICAgIG5iaXRzID0gMzsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9SWCkgJiBNSVBTMTZPUF9NQVNLX1JYOwotCSAgICBleHRiaXRzID0gNjsKLQkgICAgZXh0dSA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnNCc6Ci0JICAgIG5iaXRzID0gNDsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU00KSAmIE1JUFMxNk9QX01BU0tfSU1NNDsKLQkgICAgc2lnbmVkcCA9IDE7Ci0JICAgIGV4dGJpdHMgPSAxNTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICc1JzoKLQkgICAgbmJpdHMgPSA1OwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkgICAgaW5mby0+ZGF0YV9zaXplID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdIJzoKLQkgICAgbmJpdHMgPSA1OwotCSAgICBzaGlmdCA9IDE7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7Ci0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCSAgICBpbmZvLT5kYXRhX3NpemUgPSAyOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ1cnOgotCSAgICBuYml0cyA9IDU7Ci0JICAgIHNoaWZ0ID0gMjsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKLQkgICAgaWYgKChvcC0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX1BDKSA9PSAwCi0JCSYmIChvcC0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX1NQKSA9PSAwKQotCSAgICAgIHsKLQkJaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JCWluZm8tPmRhdGFfc2l6ZSA9IDQ7Ci0JICAgICAgfQotCSAgICBicmVhazsKLQkgIGNhc2UgJ0QnOgotCSAgICBuYml0cyA9IDU7Ci0JICAgIHNoaWZ0ID0gMzsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JICAgIGluZm8tPmRhdGFfc2l6ZSA9IDg7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnaic6Ci0JICAgIG5iaXRzID0gNTsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKLQkgICAgc2lnbmVkcCA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnNic6Ci0JICAgIG5iaXRzID0gNjsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU02KSAmIE1JUFMxNk9QX01BU0tfSU1NNjsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICc4JzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OwotCSAgICBicmVhazsKLQkgIGNhc2UgJ1YnOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIHNoaWZ0ID0gMjsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgLyogRklYTUU6IFRoaXMgbWlnaHQgYmUgbHcsIG9yIGl0IG1pZ2h0IGJlIGFkZGl1IHRvICRzcCBvcgotICAgICAgICAgICAgICAgJHBjLiAgV2UgYXNzdW1lIGl0J3MgbG9hZC4gICovCi0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCSAgICBpbmZvLT5kYXRhX3NpemUgPSA0OwotCSAgICBicmVhazsKLQkgIGNhc2UgJ0MnOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIHNoaWZ0ID0gMzsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JICAgIGluZm8tPmRhdGFfc2l6ZSA9IDg7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnVSc6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgZXh0dSA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnayc6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgc2lnbmVkcCA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnSyc6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgc2hpZnQgPSAzOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OwotCSAgICBzaWduZWRwID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdwJzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OwotCSAgICBzaWduZWRwID0gMTsKLQkgICAgcGNyZWwgPSAxOwotCSAgICBicmFuY2ggPSAxOwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfY29uZGJyYW5jaDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdxJzoKLQkgICAgbmJpdHMgPSAxMTsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU0xMSkgJiBNSVBTMTZPUF9NQVNLX0lNTTExOwotCSAgICBzaWduZWRwID0gMTsKLQkgICAgcGNyZWwgPSAxOwotCSAgICBicmFuY2ggPSAxOwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfYnJhbmNoOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ0EnOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIHNoaWZ0ID0gMjsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgcGNyZWwgPSAxOwotCSAgICAvKiBGSVhNRTogVGhpcyBjYW4gYmUgbHcgb3IgbGEuICBXZSBhc3N1bWUgaXQgaXMgbHcuICAqLwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkgICAgaW5mby0+ZGF0YV9zaXplID0gNDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdCJzoKLQkgICAgbmJpdHMgPSA1OwotCSAgICBzaGlmdCA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7Ci0JICAgIHBjcmVsID0gMTsKLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JICAgIGluZm8tPmRhdGFfc2l6ZSA9IDg7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnRSc6Ci0JICAgIG5iaXRzID0gNTsKLQkgICAgc2hpZnQgPSAyOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OwotCSAgICBwY3JlbCA9IDE7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgYWJvcnQgKCk7Ci0JICB9Ci0KLQlpZiAoISB1c2VfZXh0ZW5kKQotCSAgewotCSAgICBpZiAoc2lnbmVkcCAmJiBpbW1lZCA+PSAoMSA8PCAobmJpdHMgLSAxKSkpCi0JICAgICAgaW1tZWQgLT0gMSA8PCBuYml0czsKLQkgICAgaW1tZWQgPDw9IHNoaWZ0OwotCSAgICBpZiAoKHR5cGUgPT0gJzwnIHx8IHR5cGUgPT0gJz4nIHx8IHR5cGUgPT0gJ1snIHx8IHR5cGUgPT0gJ10nKQotCQkmJiBpbW1lZCA9PSAwKQotCSAgICAgIGltbWVkID0gODsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGlmIChleHRiaXRzID09IDE2KQotCSAgICAgIGltbWVkIHw9ICgoZXh0ZW5kICYgMHgxZikgPDwgMTEpIHwgKGV4dGVuZCAmIDB4N2UwKTsKLQkgICAgZWxzZSBpZiAoZXh0Yml0cyA9PSAxNSkKLQkgICAgICBpbW1lZCB8PSAoKGV4dGVuZCAmIDB4ZikgPDwgMTEpIHwgKGV4dGVuZCAmIDB4N2YwKTsKLQkgICAgZWxzZQotCSAgICAgIGltbWVkID0gKChleHRlbmQgPj4gNikgJiAweDFmKSB8IChleHRlbmQgJiAweDIwKTsKLQkgICAgaW1tZWQgJj0gKDEgPDwgZXh0Yml0cykgLSAxOwotCSAgICBpZiAoISBleHR1ICYmIGltbWVkID49ICgxIDw8IChleHRiaXRzIC0gMSkpKQotCSAgICAgIGltbWVkIC09IDEgPDwgZXh0Yml0czsKLQkgIH0KLQotCWlmICghIHBjcmVsKQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGltbWVkKTsKLQllbHNlCi0JICB7Ci0JICAgIGJmZF92bWEgYmFzZWFkZHI7Ci0JICAgIGJmZF92bWEgdmFsOwotCi0JICAgIGlmIChicmFuY2gpCi0JICAgICAgewotCQlpbW1lZCAqPSAyOwotCQliYXNlYWRkciA9IG1lbWFkZHIgKyAyOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAodXNlX2V4dGVuZCkKLQkgICAgICBiYXNlYWRkciA9IG1lbWFkZHIgLSAyOwotCSAgICBlbHNlCi0JICAgICAgewotCQlpbnQgc3RhdHVzOwotCQliZmRfYnl0ZSBidWZmZXJbMl07Ci0KLQkJYmFzZWFkZHIgPSBtZW1hZGRyOwotCi0JCS8qIElmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgaW4gdGhlIGRlbGF5IHNsb3Qgb2YgYSBqcgotICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLCB0aGUgYmFzZSBhZGRyZXNzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgICAgICAgICAgICAgICAgIGpyIGluc3RydWN0aW9uLiAgSWYgaXQgaXMgaW4gdGhlIGRlbGF5IHNsb3Qgb2YgamFscgotICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLCB0aGUgYmFzZSBhZGRyZXNzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgICAgICAgICAgICAgICAgIGphbHIgaW5zdHJ1Y3Rpb24uICBUaGlzIHRlc3QgaXMgdW5yZWxpYWJsZTogd2UgaGF2ZQotICAgICAgICAgICAgICAgICAgIG5vIHdheSBvZiBrbm93aW5nIHdoZXRoZXIgdGhlIHByZXZpb3VzIHdvcmQgaXMKLSAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiBvciBkYXRhLiAgKi8KLQkJc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciAtIDQsIGJ1ZmZlciwgMiwKLQkJCQkJCSAgICBpbmZvKTsKLQkJaWYgKHN0YXR1cyA9PSAwCi0JCSAgICAmJiAoKChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcKLQkJCSAgPyBiZmRfZ2V0YjE2IChidWZmZXIpCi0JCQkgIDogYmZkX2dldGwxNiAoYnVmZmVyKSkKLQkJCSAmIDB4ZjgwMCkgPT0gMHgxODAwKSkKLQkJICBiYXNlYWRkciA9IG1lbWFkZHIgLSA0OwotCQllbHNlCi0JCSAgewotCQkgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciAtIDIsIGJ1ZmZlciwKLQkJCQkJCQkyLCBpbmZvKTsKLQkJICAgIGlmIChzdGF0dXMgPT0gMAotCQkJJiYgKCgoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHCi0JCQkgICAgICA/IGJmZF9nZXRiMTYgKGJ1ZmZlcikKLQkJCSAgICAgIDogYmZkX2dldGwxNiAoYnVmZmVyKSkKLQkJCSAgICAgJiAweGY4MWYpID09IDB4ZTgwMCkpCi0JCSAgICAgIGJhc2VhZGRyID0gbWVtYWRkciAtIDI7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgdmFsID0gKGJhc2VhZGRyICYgfiAoKDEgPDwgc2hpZnQpIC0gMSkpICsgaW1tZWQ7Ci0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsLCBpbmZvKTsKLQkgICAgaW5mby0+dGFyZ2V0ID0gdmFsOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdhJzoKLSAgICAgIGlmICghIHVzZV9leHRlbmQpCi0JZXh0ZW5kID0gMDsKLSAgICAgIGwgPSAoKGwgJiAweDFmKSA8PCAyMykgfCAoKGwgJiAweDNlMCkgPDwgMTMpIHwgKGV4dGVuZCA8PCAyKTsKLSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgJiAweGYwMDAwMDAwKSB8IGwsIGluZm8pOwotICAgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2pzcjsKLSAgICAgIGluZm8tPnRhcmdldCA9IChtZW1hZGRyICYgMHhmMDAwMDAwMCkgfCBsOwotICAgICAgaW5mby0+YnJhbmNoX2RlbGF5X2luc25zID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbCc6Ci0gICAgY2FzZSAnTCc6Ci0gICAgICB7Ci0JaW50IG5lZWRfY29tbWEsIGFtYXNrLCBzbWFzazsKLQotCW5lZWRfY29tbWEgPSAwOwotCi0JbCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTYpICYgTUlQUzE2T1BfTUFTS19JTU02OwotCi0JYW1hc2sgPSAobCA+PiAzKSAmIDc7Ci0KLQlpZiAoYW1hc2sgPiAwICYmIGFtYXNrIDwgNSkKLQkgIHsKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLCByZWdfbmFtZXNbNF0pOwotCSAgICBpZiAoYW1hc2sgPiAxKQotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSQlcyIsCi0JCQkJICAgICByZWdfbmFtZXNbYW1hc2sgKyAzXSk7Ci0JICAgIG5lZWRfY29tbWEgPSAxOwotCSAgfQotCi0Jc21hc2sgPSAobCA+PiAxKSAmIDM7Ci0JaWYgKHNtYXNrID09IDMpCi0JICB7Ci0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXM/PyIsCi0JCQkJICAgbmVlZF9jb21tYSA/ICIsIiA6ICIiKTsKLQkgICAgbmVlZF9jb21tYSA9IDE7Ci0JICB9Ci0JZWxzZSBpZiAoc21hc2sgPiAwKQotCSAgewotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzJCVzIiwKLQkJCQkgICBuZWVkX2NvbW1hID8gIiwiIDogIiIsCi0JCQkJICAgcmVnX25hbWVzWzE2XSk7Ci0JICAgIGlmIChzbWFzayA+IDEpCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItJCVzIiwKLQkJCQkgICAgIHJlZ19uYW1lc1tzbWFzayArIDE1XSk7Ci0JICAgIG5lZWRfY29tbWEgPSAxOwotCSAgfQotCi0JaWYgKGwgJiAxKQotCSAgewotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzJCVzIiwKLQkJCQkgICBuZWVkX2NvbW1hID8gIiwiIDogIiIsCi0JCQkJICAgcmVnX25hbWVzWzMxXSk7Ci0JICAgIG5lZWRfY29tbWEgPSAxOwotCSAgfQotCi0JaWYgKGFtYXNrID09IDUgfHwgYW1hc2sgPT0gNikKLQkgIHsKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyRmMCIsCi0JCQkJICAgbmVlZF9jb21tYSA/ICIsIiA6ICIiKTsKLQkgICAgaWYgKGFtYXNrID09IDYpCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItJGYxIik7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL21pcHMtb3BjLmMgYi9vcGNvZGVzL21pcHMtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NjQ2MTkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9taXBzLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzcyICswLDAgQEAKLS8qIG1pcHMuaC4gIE1pcHMgb3Bjb2RlIGxpc3QgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLSAgIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmFscGggQ2FtcGJlbGwgYW5kIE9TRgotICAgQ29tbWVudGVkIGFuZCBtb2RpZmllZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9taXBzLmgiCi0KLS8qIFNob3J0IGhhbmQgc28gdGhlIGxpbmVzIGFyZW4ndCB0b28gbG9uZy4gICovCi0KLSNkZWZpbmUgTEREICAgICBJTlNOX0xPQURfTUVNT1JZX0RFTEFZCi0jZGVmaW5lIExDRAlJTlNOX0xPQURfQ09QUk9DX0RFTEFZCi0jZGVmaW5lIFVCRCAgICAgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZCi0jZGVmaW5lIENCRAlJTlNOX0NPTkRfQlJBTkNIX0RFTEFZCi0jZGVmaW5lIENPRCAgICAgSU5TTl9DT1BST0NfTU9WRV9ERUxBWQotI2RlZmluZSBDTEQJSU5TTl9DT1BST0NfTUVNT1JZX0RFTEFZCi0jZGVmaW5lIENCTAlJTlNOX0NPTkRfQlJBTkNIX0xJS0VMWQotI2RlZmluZSBUUkFQCUlOU05fVFJBUAotI2RlZmluZSBTTQlJTlNOX1NUT1JFX01FTU9SWQotCi0jZGVmaW5lIFdSX2QgICAgSU5TTl9XUklURV9HUFJfRAotI2RlZmluZSBXUl90ICAgIElOU05fV1JJVEVfR1BSX1QKLSNkZWZpbmUgV1JfMzEgICBJTlNOX1dSSVRFX0dQUl8zMSAgICAgICAKLSNkZWZpbmUgV1JfRCAgICBJTlNOX1dSSVRFX0ZQUl9EICAgICAgICAKLSNkZWZpbmUgV1JfVAlJTlNOX1dSSVRFX0ZQUl9UCi0jZGVmaW5lIFdSX1MJSU5TTl9XUklURV9GUFJfUwotI2RlZmluZSBSRF9zICAgIElOU05fUkVBRF9HUFJfUyAgICAgICAgIAotI2RlZmluZSBSRF9iICAgIElOU05fUkVBRF9HUFJfUyAgICAgICAgIAotI2RlZmluZSBSRF90ICAgIElOU05fUkVBRF9HUFJfVCAgICAgICAgIAotI2RlZmluZSBSRF9TICAgIElOU05fUkVBRF9GUFJfUyAgICAgICAgIAotI2RlZmluZSBSRF9UICAgIElOU05fUkVBRF9GUFJfVCAgICAgICAgIAotI2RlZmluZSBSRF9SCUlOU05fUkVBRF9GUFJfUgotI2RlZmluZSBXUl9DQwlJTlNOX1dSSVRFX0NPTkRfQ09ERQotI2RlZmluZSBSRF9DQwlJTlNOX1JFQURfQ09ORF9DT0RFCi0jZGVmaW5lIFJEX0MwICAgSU5TTl9DT1AKLSNkZWZpbmUgUkRfQzEJSU5TTl9DT1AKLSNkZWZpbmUgUkRfQzIgICBJTlNOX0NPUAotI2RlZmluZSBSRF9DMyAgIElOU05fQ09QCi0jZGVmaW5lIFdSX0MwICAgSU5TTl9DT1AKLSNkZWZpbmUgV1JfQzEJSU5TTl9DT1AKLSNkZWZpbmUgV1JfQzIgICBJTlNOX0NPUAotI2RlZmluZSBXUl9DMyAgIElOU05fQ09QCi0KLSNkZWZpbmUgV1JfSEkJSU5TTl9XUklURV9ISQotI2RlZmluZSBSRF9ISQlJTlNOX1JFQURfSEkKLSNkZWZpbmUgTU9EX0hJICBXUl9ISXxSRF9ISQotCi0jZGVmaW5lIFdSX0xPCUlOU05fV1JJVEVfTE8KLSNkZWZpbmUgUkRfTE8JSU5TTl9SRUFEX0xPCi0jZGVmaW5lIE1PRF9MTyAgV1JfTE98UkRfTE8KLQotI2RlZmluZSBXUl9ISUxPIFdSX0hJfFdSX0xPCi0jZGVmaW5lIFJEX0hJTE8gUkRfSEl8UkRfTE8KLSNkZWZpbmUgTU9EX0hJTE8gV1JfSElMT3xSRF9ISUxPCi0KLSNkZWZpbmUgSVNfTSAgICBJTlNOX01VTFQKLQotI2RlZmluZSBJMQlJTlNOX0lTQTEKLSNkZWZpbmUgSTIJSU5TTl9JU0EyCi0jZGVmaW5lIEkzCUlOU05fSVNBMwotI2RlZmluZSBJNAlJTlNOX0lTQTQKLSNkZWZpbmUgUDMJSU5TTl80NjUwCi0jZGVmaW5lIEwxCUlOU05fNDAxMAotI2RlZmluZSBWMSAgICAgIElOU05fNDEwMAotI2RlZmluZSBUMyAgICAgIElOU05fMzkwMAotCi0jZGVmaW5lIEcxICAgICAgKFQzICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgKQotCi0jZGVmaW5lIEcyICAgICAgKFQzICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgKQotCi0jZGVmaW5lIEczIChJNCAgICAgICAgICAgICBcCi0gICAgICAgICAgICApCi0KLS8qIFRoZSBvcmRlciBvZiBvdmVybG9hZGVkIGluc3RydWN0aW9ucyBtYXR0ZXJzLiAgTGFiZWwgYXJndW1lbnRzIGFuZAotICAgcmVnaXN0ZXIgYXJndW1lbnRzIGxvb2sgdGhlIHNhbWUuIEluc3RydWN0aW9ucyB0aGF0IGNhbiBoYXZlIGVpdGhlcgotICAgZm9yIGFyZ3VtZW50cyBtdXN0IGFwZWFyIGluIHRoZSBjb3JyZWN0IG9yZGVyIGluIHRoaXMgdGFibGUgZm9yIHRoZQotICAgYXNzZW1ibGVyIHRvIHBpY2sgdGhlIHJpZ2h0IG9uZS4gSW4gb3RoZXIgd29yZHMsIGVudHJpZXMgd2l0aAotICAgaW1tZWRpYXRlIG9wZXJhbmRzIG11c3QgYXBlYXIgYWZ0ZXIgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gd2l0aAotICAgcmVnaXN0ZXJzLgotCi0gICBNYW55IGluc3RydWN0aW9ucyBhcmUgc2hvcnQgaGFuZCBmb3Igb3RoZXIgaW5zdHJ1Y3Rpb25zIChpLmUuLCBUaGUKLSAgIGphbCA8cmVnaXN0ZXI+IGluc3RydWN0aW9uIGlzIHNob3J0IGZvciBqYWxyIDxyZWdpc3Rlcj4pLiAgKi8KLQotY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlIG1pcHNfYnVpbHRpbl9vcGNvZGVzW10gPSB7Ci0vKiBUaGVzZSBpbnN0cnVjdGlvbnMgYXBwZWFyIGZpcnN0IHNvIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIGZpbmQKLSAgIHRoZW0gZmlyc3QuICBUaGUgYXNzZW1ibGVycyB1c2VzIGEgaGFzaCB0YWJsZSBiYXNlZCBvbiB0aGUKLSAgIGluc3RydWN0aW9uIG5hbWUgYW55aG93LiAgKi8KLS8qIG5hbWUsCWFyZ3MsCW1hc2ssCQltYXRjaCwJcGluZm8gKi8KLXsibm9wIiwgICAgICIiLAkJMHgwMDAwMDAwMCwgMHhmZmZmZmZmZiwJMCwJCUkxCX0sCi17ImxpIiwgICAgICAidCxqIiwgICAgICAweDI0MDAwMDAwLCAweGZmZTAwMDAwLCBXUl90LAkJSTEJfSwgLyogYWRkaXUgKi8KLXsibGkiLAkgICAgInQsaSIsCTB4MzQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QsCQlJMQl9LCAvKiBvcmkgKi8KLXsibGkiLCAgICAgICJ0LEkiLAkwLCAgICAoaW50KSBNX0xJLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJtb3ZlIiwgICAgImQscyIsCTB4MDAwMDAwMmQsIDB4ZmMxZjA3ZmYsIFdSX2R8UkRfcywJSTMJfSwvKiBkYWRkdSAqLwoteyJtb3ZlIiwgICAgImQscyIsCTB4MDAwMDAwMjEsIDB4ZmMxZjA3ZmYsIFdSX2R8UkRfcywJSTEJfSwvKiBhZGR1ICovCi17Im1vdmUiLCAgICAiZCxzIiwJMHgwMDAwMDAyNSwgMHhmYzFmMDdmZiwJV1JfZHxSRF9zLAlJMQl9LC8qIG9yICovCi17ImIiLCAgICAgICAicCIsCTB4MTAwMDAwMDAsIDB4ZmZmZjAwMDAsCVVCRCwJCUkxCX0sLyogYmVxIDAsMCAqLwoteyJiIiwgICAgICAgInAiLAkweDA0MDEwMDAwLCAweGZmZmYwMDAwLAlVQkQsCQlJMQl9LC8qIGJnZXogMCAqLwoteyJiYWwiLCAgICAgInAiLAkweDA0MTEwMDAwLCAweGZmZmYwMDAwLAlVQkR8V1JfMzEsCUkxCX0sLyogYmdlemFsIDAqLwotCi17ImFicyIsICAgICAiZCx2IiwJMCwgICAgKGludCkgTV9BQlMsCUlOU05fTUFDUk8sCUkxCX0sCi17ImFicy5zIiwgICAiRCxWIiwJMHg0NjAwMDAwNSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkxCX0sCi17ImFicy5kIiwgICAiRCxWIiwJMHg0NjIwMDAwNSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkxCX0sCi17ImFkZCIsICAgICAiZCx2LHQiLAkweDAwMDAwMDIwLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsiYWRkIiwgICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fQUREX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImFkZC5zIiwgICAiRCxWLFQiLAkweDQ2MDAwMDAwLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9TLAlJMX0sCi17ImFkZC5kIiwgICAiRCxWLFQiLAkweDQ2MjAwMDAwLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJMX0sCi17ImFkZGkiLCAgICAidCxyLGoiLAkweDIwMDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCi17ImFkZGl1IiwgICAidCxyLGoiLAkweDI0MDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCi17ImFkZHUiLCAgICAiZCx2LHQiLAkweDAwMDAwMDIxLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsiYWRkdSIsICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fQUREVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJhbmQiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyNCwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17ImFuZCIsICAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX0FORF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJhbmRpIiwgICAgInQscixpIiwJMHgzMDAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LAotLyogYiBpcyBhdCB0aGUgdG9wIG9mIHRoZSB0YWJsZS4gICovCi0vKiBiYWwgaXMgYXQgdGhlIHRvcCBvZiB0aGUgdGFibGUuICAqLwoteyJiYzBmIiwgICAgInAiLAkweDQxMDAwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCUkxCX0sCi17ImJjMGZsIiwgICAicCIsCTB4NDEwMjAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJSTJ8VDMJfSwKLXsiYmMxZiIsICAgICJwIiwJMHg0NTAwMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDfEZQX1MsCUkxCX0sCi17ImJjMWYiLCAgICAiTixwIiwJMHg0NTAwMDAwMCwgMHhmZmUzMDAwMCwJQ0JEfFJEX0NDfEZQX1MsCUk0CX0sCi17ImJjMWZsIiwgICAicCIsCTB4NDUwMjAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQ3xGUF9TLAlJMnxUMwl9LAoteyJiYzFmbCIsICAgIk4scCIsCTB4NDUwMjAwMDAsIDB4ZmZlMzAwMDAsCUNCTHxSRF9DQ3xGUF9TLAlJNAl9LAoteyJiYzJmIiwgICAgInAiLAkweDQ5MDAwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCUkxCX0sCi17ImJjMmZsIiwgICAicCIsCTB4NDkwMjAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJSTJ8VDMJfSwKLXsiYmMzZiIsICAgICJwIiwJMHg0ZDAwMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDLAlJMQl9LAoteyJiYzNmbCIsICAgInAiLAkweDRkMDIwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCUkyfFQzCX0sCi17ImJjMHQiLCAgICAicCIsCTB4NDEwMTAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJSTEJfSwKLXsiYmMwdGwiLCAgICJwIiwJMHg0MTAzMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDLAlJMnxUMwl9LAoteyJiYzF0IiwgICAgInAiLAkweDQ1MDEwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0N8RlBfUywJSTEJfSwKLXsiYmMxdCIsICAgICJOLHAiLAkweDQ1MDEwMDAwLCAweGZmZTMwMDAwLAlDQkR8UkRfQ0N8RlBfUywJSTQJfSwKLXsiYmMxdGwiLCAgICJwIiwJMHg0NTAzMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDfEZQX1MsCUkyfFQzCX0sCi17ImJjMXRsIiwgICAiTixwIiwJMHg0NTAzMDAwMCwgMHhmZmUzMDAwMCwJQ0JMfFJEX0NDfEZQX1MsCUk0CX0sCi17ImJjMnQiLCAgICAicCIsCTB4NDkwMTAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJSTEJfSwKLXsiYmMydGwiLCAgICJwIiwJMHg0OTAzMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDLAlJMnxUMwl9LAoteyJiYzN0IiwgICAgInAiLAkweDRkMDEwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCUkxCX0sCi17ImJjM3RsIiwgICAicCIsCTB4NGQwMzAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJSTJ8VDMJfSwKLXsiYmVxeiIsICAgICJzLHAiLAkweDEwMDAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJSTEJfSwKLXsiYmVxemwiLCAgICJzLHAiLAkweDUwMDAwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYmVxIiwgICAgICJzLHQscCIsCTB4MTAwMDAwMDAsIDB4ZmMwMDAwMDAsCUNCRHxSRF9zfFJEX3QsCUkxCX0sCi17ImJlcSIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JFUV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZXFsIiwgICAgInMsdCxwIiwJMHg1MDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0JMfFJEX3N8UkRfdCwJSTJ8VDMJfSwKLXsiYmVxbCIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkVRTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ2UiLCAgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR0UsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJnZSIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHRV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ2VsIiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR0VMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ2VsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR0VMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJnZXUiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHRVUsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJnZXUiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHRVVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmdldWwiLCAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdFVUwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJnZXVsIiwgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHRVVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJnZXoiLCAgICAicyxwIiwJMHgwNDAxMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCi17ImJnZXpsIiwgICAicyxwIiwJMHgwNDAzMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJnZXphbCIsICAicyxwIiwJMHgwNDExMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3N8V1JfMzEsCUkxCX0sCi17ImJnZXphbGwiLCAicyxwIiwJMHgwNDEzMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJndCIsICAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHVCwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmd0IiwgICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdUX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJndGwiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHVEwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJndGwiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHVExfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmd0dSIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdUVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmd0dSIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdUVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ3R1bCIsICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR1RVTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmd0dWwiLCAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdUVUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmd0eiIsICAgICJzLHAiLAkweDFjMDAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJSTEJfSwKLXsiYmd0emwiLCAgICJzLHAiLAkweDVjMDAwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYmxlIiwgICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxFLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibGUiLCAgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTEVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmxlbCIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxFTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmxlbCIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxFTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibGV1IiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTEVVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibGV1IiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTEVVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsZXVsIiwgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMRVVMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibGV1bCIsICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTEVVTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibGV6IiwgICAgInMscCIsCTB4MTgwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zLAlJMQl9LAoteyJibGV6bCIsICAgInMscCIsCTB4NTgwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoteyJibHQiLCAgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTFQsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsdCIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMVF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibHRsIiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTFRMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibHRsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTFRMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsdHUiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMVFUsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsdHUiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMVFVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmx0dWwiLCAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxUVUwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsdHVsIiwgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMVFVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsdHoiLCAgICAicyxwIiwJMHgwNDAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCi17ImJsdHpsIiwgICAicyxwIiwJMHgwNDAyMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJsdHphbCIsICAicyxwIiwJMHgwNDEwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3N8V1JfMzEsCUkxCX0sCi17ImJsdHphbGwiLCAicyxwIiwJMHgwNDEyMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJuZXoiLCAgICAicyxwIiwJMHgxNDAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCi17ImJuZXpsIiwgICAicyxwIiwJMHg1NDAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJuZSIsICAgICAicyx0LHAiLAkweDE0MDAwMDAwLCAweGZjMDAwMDAwLAlDQkR8UkRfc3xSRF90LAlJMQl9LAoteyJibmUiLCAgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTkVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYm5lbCIsICAgICJzLHQscCIsCTB4NTQwMDAwMDAsIDB4ZmMwMDAwMDAsCUNCTHxSRF9zfFJEX3QsIAlJMnxUMwl9LAoteyJibmVsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTkVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJyZWFrIiwgICAiIiwJCTB4MDAwMDAwMGQsIDB4ZmZmZmZmZmYsCVRSQVAsCQlJMQl9LAoteyJicmVhayIsICAgImMiLAkweDAwMDAwMDBkLCAweGZjMDBmZmZmLAlUUkFQLAkJSTEJfSwKLXsiYnJlYWsiLCAgICJjLHEiLAkweDAwMDAwMDBkLCAweGZjMDAwMDNmLAlUUkFQLAkJSTEJfSwKLXsiYy5mLmQiLCAgICJTLFQiLAkweDQ2MjAwMDMwLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5mLmQiLCAgICJNLFMsVCIsCTB4NDYyMDAwMzAsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLmYucyIsICAgIlMsVCIsCTB4NDYwMDAwMzAsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLmYucyIsICAgIk0sUyxUIiwJMHg0NjAwMDAzMCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMudW4uZCIsICAiUyxUIiwJMHg0NjIwMDAzMSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMudW4uZCIsICAiTSxTLFQiLAkweDQ2MjAwMDMxLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy51bi5zIiwgICJTLFQiLAkweDQ2MDAwMDMxLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy51bi5zIiwgICJNLFMsVCIsCTB4NDYwMDAwMzEsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLmVxLmQiLCAgIlMsVCIsCTB4NDYyMDAwMzIsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLmVxLmQiLCAgIk0sUyxUIiwJMHg0NjIwMDAzMiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMuZXEucyIsICAiUyxUIiwJMHg0NjAwMDAzMiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMuZXEucyIsICAiTSxTLFQiLAkweDQ2MDAwMDMyLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy51ZXEuZCIsICJTLFQiLAkweDQ2MjAwMDMzLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy51ZXEuZCIsICJNLFMsVCIsCTB4NDYyMDAwMzMsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLnVlcS5zIiwgIlMsVCIsCTB4NDYwMDAwMzMsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLnVlcS5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzMywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMub2x0LmQiLCAiUyxUIiwJMHg0NjIwMDAzNCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMub2x0LmQiLCAiTSxTLFQiLAkweDQ2MjAwMDM0LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5vbHQucyIsICJTLFQiLAkweDQ2MDAwMDM0LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5vbHQucyIsICJNLFMsVCIsCTB4NDYwMDAwMzQsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLnVsdC5kIiwgIlMsVCIsCTB4NDYyMDAwMzUsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLnVsdC5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzNSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMudWx0LnMiLCAiUyxUIiwJMHg0NjAwMDAzNSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMudWx0LnMiLCAiTSxTLFQiLAkweDQ2MDAwMDM1LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5vbGUuZCIsICJTLFQiLAkweDQ2MjAwMDM2LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5vbGUuZCIsICJNLFMsVCIsCTB4NDYyMDAwMzYsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLm9sZS5zIiwgIlMsVCIsCTB4NDYwMDAwMzYsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLm9sZS5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzNiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMudWxlLmQiLCAiUyxUIiwJMHg0NjIwMDAzNywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMudWxlLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDM3LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy51bGUucyIsICJTLFQiLAkweDQ2MDAwMDM3LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy51bGUucyIsICJNLFMsVCIsCTB4NDYwMDAwMzcsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLnNmLmQiLCAgIlMsVCIsCTB4NDYyMDAwMzgsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLnNmLmQiLCAgIk0sUyxUIiwJMHg0NjIwMDAzOCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMuc2YucyIsICAiUyxUIiwJMHg0NjAwMDAzOCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMuc2YucyIsICAiTSxTLFQiLAkweDQ2MDAwMDM4LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5uZ2xlLmQiLCJTLFQiLAkweDQ2MjAwMDM5LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5uZ2xlLmQiLCJNLFMsVCIsCTB4NDYyMDAwMzksIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLm5nbGUucyIsIlMsVCIsCTB4NDYwMDAwMzksIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLm5nbGUucyIsIk0sUyxUIiwJMHg0NjAwMDAzOSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMuc2VxLmQiLCAiUyxUIiwJMHg0NjIwMDAzYSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMuc2VxLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDNhLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5zZXEucyIsICJTLFQiLAkweDQ2MDAwMDNhLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5zZXEucyIsICJNLFMsVCIsCTB4NDYwMDAwM2EsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLm5nbC5kIiwgIlMsVCIsCTB4NDYyMDAwM2IsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLm5nbC5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzYiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMubmdsLnMiLCAiUyxUIiwJMHg0NjAwMDAzYiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMubmdsLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDNiLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5sdC5kIiwgICJTLFQiLAkweDQ2MjAwMDNjLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5sdC5kIiwgICJNLFMsVCIsCTB4NDYyMDAwM2MsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLmx0LnMiLCAgIlMsVCIsCTB4NDYwMDAwM2MsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLmx0LnMiLCAgIk0sUyxUIiwJMHg0NjAwMDAzYywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMubmdlLmQiLCAiUyxUIiwJMHg0NjIwMDAzZCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMubmdlLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDNkLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5uZ2UucyIsICJTLFQiLAkweDQ2MDAwMDNkLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5uZ2UucyIsICJNLFMsVCIsCTB4NDYwMDAwM2QsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLmxlLmQiLCAgIlMsVCIsCTB4NDYyMDAwM2UsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLmxlLmQiLCAgIk0sUyxUIiwJMHg0NjIwMDAzZSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMubGUucyIsICAiUyxUIiwJMHg0NjAwMDAzZSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMubGUucyIsICAiTSxTLFQiLAkweDQ2MDAwMDNlLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5uZ3QuZCIsICJTLFQiLAkweDQ2MjAwMDNmLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5uZ3QuZCIsICJNLFMsVCIsCTB4NDYyMDAwM2YsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLm5ndC5zIiwgIlMsVCIsCTB4NDYwMDAwM2YsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLm5ndC5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzZiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImNhY2hlIiwgICAiayxvKGIpIiwJMHhiYzAwMDAwMCwgMHhmYzAwMDAwMCwgUkRfYiwJCUkzfFQzCX0sCi17ImNlaWwubC5kIiwgIkQsUyIsCTB4NDYyMDAwMGEsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMwl9LAoteyJjZWlsLmwucyIsICJELFMiLAkweDQ2MDAwMDBhLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTMJfSwKLXsiY2VpbC53LmQiLCAiRCxTIiwJMHg0NjIwMDAwZSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkyCX0sCi17ImNlaWwudy5zIiwgIkQsUyIsCTB4NDYwMDAwMGUsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMgl9LAoteyJjZmMwIiwgICAgInQsRyIsCTB4NDA0MDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MwLAlJMQl9LAoteyJjZmMxIiwgICAgInQsRyIsCTB4NDQ0MDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MxfEZQX1MsCUkxCX0sCi17ImNmYzEiLCAgICAidCxTIiwJMHg0NDQwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzF8RlBfUywJSTEJfSwKLXsiY2ZjMiIsICAgICJ0LEciLAkweDQ4NDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMiwJSTEJfSwKLXsiY2ZjMyIsICAgICJ0LEciLAkweDRjNDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMywJSTEJfSwKLXsiY3RjMCIsICAgICJ0LEciLAkweDQwYzAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DQywJSTEJfSwKLXsiY3RjMSIsICAgICJ0LEciLAkweDQ0YzAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjdGMxIiwgICAgInQsUyIsCTB4NDRjMDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0NDfEZQX1MsCUkxCX0sCi17ImN0YzIiLCAgICAidCxHIiwJMHg0OGMwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQ0MsCUkxCX0sCi17ImN0YzMiLCAgICAidCxHIiwJMHg0Y2MwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQ0MsCUkxCX0sCi17ImN2dC5kLmwiLCAiRCxTIiwJMHg0NmEwMDAyMSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkzCX0sCi17ImN2dC5kLnMiLCAiRCxTIiwJMHg0NjAwMDAyMSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0R8RlBfUywJSTEJfSwKLXsiY3Z0LmQudyIsICJELFMiLAkweDQ2ODAwMDIxLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTEJfSwKLXsiY3Z0LmwuZCIsICJELFMiLAkweDQ2MjAwMDI1LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTMJfSwKLXsiY3Z0LmwucyIsICJELFMiLAkweDQ2MDAwMDI1LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTMJfSwKLXsiY3Z0LnMubCIsICJELFMiLAkweDQ2YTAwMDIwLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTMJfSwKLXsiY3Z0LnMuZCIsICJELFMiLAkweDQ2MjAwMDIwLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfU3xGUF9ELAlJMQl9LAoteyJjdnQucy53IiwgIkQsUyIsCTB4NDY4MDAwMjAsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMQl9LAoteyJjdnQudy5kIiwgIkQsUyIsCTB4NDYyMDAwMjQsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMQl9LAoteyJjdnQudy5zIiwgIkQsUyIsCTB4NDYwMDAwMjQsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMQl9LAoteyJkYWJzIiwgICAgImQsdiIsCTAsICAgIChpbnQpIE1fREFCUywJSU5TTl9NQUNSTywJSTMJfSwKLXsiZGFkZCIsICAgICJkLHYsdCIsCTB4MDAwMDAwMmMsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAlJMwl9LAoteyJkYWRkIiwgICAgInQscixJIiwJMCwgICAgKGludCkgTV9EQUREX0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImRhZGRpIiwgICAidCxyLGoiLAkweDYwMDAwMDAwLCAweGZjMDAwMDAwLCBXUl90fFJEX3MsCUkzCX0sCi17ImRhZGRpdSIsICAidCxyLGoiLAkweDY0MDAwMDAwLCAweGZjMDAwMDAwLCBXUl90fFJEX3MsCUkzCX0sCi17ImRhZGR1IiwgICAiZCx2LHQiLAkweDAwMDAwMDJkLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJSTMJfSwKLXsiZGFkZHUiLCAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fREFERFVfSSwJSU5TTl9NQUNSTywJSTMJfSwKLS8qIGRjdHIgYW5kIGRjdHcgYXJlIHVzZWQgb24gdGhlIHI1MDAwLiAgKi8KLXsiZGN0ciIsICAgICJvKGIpIiwJMHhiYzA1MDAwMCwgMHhmYzFmMDAwMCwgUkRfYiwJSTMJfSwKLXsiZGN0dyIsICAgICJvKGIpIiwJMHhiYzA5MDAwMCwgMHhmYzFmMDAwMCwgUkRfYiwJSTMJfSwKLXsiZGVyZXQiLCAgICIiLCAgICAgICAgIDB4NDIwMDAwMWYsIDB4ZmZmZmZmZmYsICAgIDAsCUcyCX0sCi0vKiBGb3IgZGRpdiwgc2VlIHRoZSBjb21tZW50cyBhYm91dCBkaXYuICAqLwoteyJkZGl2IiwgICAgInoscyx0IiwJMHgwMDAwMDAxZSwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMwl9LAoteyJkZGl2IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ERElWXzMsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRkaXYiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RESVZfM0ksCUlOU05fTUFDUk8sCUkzCX0sCi0vKiBGb3IgZGRpdnUsIHNlZSB0aGUgY29tbWVudHMgYWJvdXQgZGl2LiAgKi8KLXsiZGRpdnUiLCAgICJ6LHMsdCIsCTB4MDAwMDAwMWYsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTMJfSwKLXsiZGRpdnUiLCAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRERJVlVfMywJSU5TTl9NQUNSTywJSTMJfSwKLXsiZGRpdnUiLCAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRERJVlVfM0ksCUlOU05fTUFDUk8sCUkzCX0sCi0vKiBUaGUgTUlQUyBhc3NlbWJsZXIgdHJlYXRzIHRoZSBkaXYgb3Bjb2RlIHdpdGggdHdvIG9wZXJhbmRzIGFzCi0gICB0aG91Z2ggdGhlIGZpcnN0IG9wZXJhbmQgYXBwZWFyZWQgdHdpY2UgKHRoZSBmaXJzdCBvcGVyYW5kIGlzIGJvdGgKLSAgIGEgc291cmNlIGFuZCBhIGRlc3RpbmF0aW9uKS4gIFRvIGdldCB0aGUgZGl2IG1hY2hpbmUgaW5zdHJ1Y3Rpb24sCi0gICB5b3UgbXVzdCB1c2UgYW4gZXhwbGljaXQgZGVzdGluYXRpb24gb2YgJDAuICAqLwoteyJkaXYiLCAgICAgInoscyx0IiwJMHgwMDAwMDAxYSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMQl9LAoteyJkaXYiLCAgICAgInosdCIsCTB4MDAwMDAwMWEsIDB4ZmZlMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTEJfSwKLXsiZGl2IiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRElWXzMsCUlOU05fTUFDUk8sCUkxCX0sCi17ImRpdiIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RJVl8zSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiZGl2LmQiLCAgICJELFYsVCIsCTB4NDYyMDAwMDMsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUkxCX0sCi17ImRpdi5zIiwgICAiRCxWLFQiLAkweDQ2MDAwMDAzLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9TLAlJMQl9LAotLyogRm9yIGRpdnUsIHNlZSB0aGUgY29tbWVudHMgYWJvdXQgZGl2LiAgKi8KLXsiZGl2dSIsICAgICJ6LHMsdCIsCTB4MDAwMDAwMWIsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTEJfSwKLXsiZGl2dSIsICAgICJ6LHQiLAkweDAwMDAwMDFiLCAweGZmZTBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkxCX0sCi17ImRpdnUiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RJVlVfMywJSU5TTl9NQUNSTywJSTEJfSwKLXsiZGl2dSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRElWVV8zSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiZGxhIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0RMQV9BQiwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZGxpIiwgICAgICJ0LGoiLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QsCUkzCX0sIC8qIGFkZGl1ICovCi17ImRsaSIsCSAgICAidCxpIiwJMHgzNDAwMDAwMCwgMHhmZmUwMDAwMCwgV1JfdCwJSTMJfSwgLyogb3JpICovCi17ImRsaSIsICAgICAidCxJIiwJMCwgICAgKGludCkgTV9ETEksCUlOU05fTUFDUk8sCUkzCX0sCi0KLXsiZG1hZGQxNiIsICJzLHQiLCAgICAgIDB4MDAwMDAwMjksIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9MT3xSRF9MTywJVjEJfSwKLXsiZG1mYzAiLCAgICJ0LEciLAkweDQwMjAwMDAwLCAweGZmZTAwN2ZmLCBMQ0R8V1JfdHxSRF9DMCwJSTMJfSwKLXsiZG10YzAiLCAgICJ0LEciLAkweDQwYTAwMDAwLCAweGZmZTAwN2ZmLCBDT0R8UkRfdHxXUl9DMHxXUl9DQywJSTMJfSwKLXsiZG1mYzEiLCAgICJ0LFMiLAkweDQ0MjAwMDAwLCAweGZmZTAwN2ZmLCBMQ0R8V1JfdHxSRF9TfEZQX1MsCUkzCX0sCi17ImRtdGMxIiwgICAidCxTIiwJMHg0NGEwMDAwMCwgMHhmZmUwMDdmZiwgQ09EfFJEX3R8V1JfU3xGUF9TLAlJMwl9LAoteyJkbWZjMiIsICAgInQsUyIsCTB4NDgyMDAwMDAsIDB4ZmZlMDA3ZmYsIExDRHxXUl90fFJEX1N8RlBfUywJSTMJfSwKLXsiZG10YzIiLCAgICJ0LFMiLAkweDQ4YTAwMDAwLCAweGZmZTAwN2ZmLCBDT0R8UkRfdHxXUl9TfEZQX1MsCUkzCX0sCi17ImRtdWwiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RNVUwsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRtdWwiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RNVUxfSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZG11bG8iLCAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRE1VTE8sCUlOU05fTUFDUk8sCUkzCX0sCi17ImRtdWxvIiwgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RNVUxPX0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImRtdWxvdSIsICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RNVUxPVSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZG11bG91IiwgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRE1VTE9VX0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImRtdWx0IiwgICAicyx0IiwJMHgwMDAwMDAxYywgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAkgICAgSTN9LAoteyJkbXVsdHUiLCAgInMsdCIsCTB4MDAwMDAwMWQsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywgICAgICBJM30sCi17ImRuZWciLCAgICAiZCx3IiwJMHgwMDAwMDAyZSwgMHhmZmUwMDdmZiwJV1JfZHxSRF90LAlJMwl9LCAvKiBkc3ViIDAgKi8KLXsiZG5lZ3UiLCAgICJkLHciLAkweDAwMDAwMDJmLCAweGZmZTAwN2ZmLAlXUl9kfFJEX3QsCUkzCX0sIC8qIGRzdWJ1IDAqLwoteyJkcmVtIiwgICAgInoscyx0IiwJMHgwMDAwMDAxZSwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMwl9LAoteyJkcmVtIiwgICAgImQsdix0IiwJMywgICAgKGludCkgTV9EUkVNXzMsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRyZW0iLCAgICAiZCx2LEkiLAkzLCAgICAoaW50KSBNX0RSRU1fM0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImRyZW11IiwgICAieixzLHQiLAkweDAwMDAwMDFmLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkzCX0sCi17ImRyZW11IiwgICAiZCx2LHQiLAkzLCAgICAoaW50KSBNX0RSRU1VXzMsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRyZW11IiwgICAiZCx2LEkiLAkzLCAgICAoaW50KSBNX0RSRU1VXzNJLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkc2xsdiIsICAgImQsdCxzIiwJMHgwMDAwMDAxNCwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkzCX0sCi17ImRzbGwzMiIsICAiZCx3LDwiLAkweDAwMDAwMDNjLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCUkzCX0sCi17ImRzbGwiLCAgICAiZCx3LHMiLAkweDAwMDAwMDE0LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTMJfSwgLyogZHNsbHYgKi8KLXsiZHNsbCIsICAgICJkLHcsPiIsCTB4MDAwMDAwM2MsIDB4ZmZlMDAwM2YsIFdSX2R8UkRfdCwJSTMJfSwgLyogZHNsbDMyICovCi17ImRzbGwiLCAgICAiZCx3LDwiLAkweDAwMDAwMDM4LCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCUkzCX0sCi17ImRzcmF2IiwgICAiZCx0LHMiLAkweDAwMDAwMDE3LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTMJfSwKLXsiZHNyYTMyIiwgICJkLHcsPCIsCTB4MDAwMDAwM2YsIDB4ZmZlMDAwM2YsIFdSX2R8UkRfdCwJSTMJfSwKLXsiZHNyYSIsICAgICJkLHcscyIsCTB4MDAwMDAwMTcsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMwl9LCAvKiBkc3JhdiAqLwoteyJkc3JhIiwgICAgImQsdyw+IiwJMHgwMDAwMDAzZiwgMHhmZmUwMDAzZiwgV1JfZHxSRF90LAlJMwl9LCAvKiBkc3JhMzIgKi8KLXsiZHNyYSIsICAgICJkLHcsPCIsCTB4MDAwMDAwM2IsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJSTMJfSwKLXsiZHNybHYiLCAgICJkLHQscyIsCTB4MDAwMDAwMTYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMwl9LAoteyJkc3JsMzIiLCAgImQsdyw8IiwJMHgwMDAwMDAzZSwgMHhmZmUwMDAzZiwgV1JfZHxSRF90LAlJMwl9LAoteyJkc3JsIiwgICAgImQsdyxzIiwJMHgwMDAwMDAxNiwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkzCX0sIC8qIGRzcmx2ICovCi17ImRzcmwiLCAgICAiZCx3LD4iLAkweDAwMDAwMDNlLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCUkzCX0sIC8qIGRzcmwzMiAqLwoteyJkc3JsIiwgICAgImQsdyw8IiwJMHgwMDAwMDAzYSwgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAlJMwl9LAoteyJkc3ViIiwgICAgImQsdix0IiwJMHgwMDAwMDAyZSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkzCX0sCi17ImRzdWIiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RTVUJfSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZHN1YnUiLCAgICJkLHYsdCIsCTB4MDAwMDAwMmYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMwl9LAoteyJkc3VidSIsICAgImQsdixJIiwJMCwgICAgKGludCkgTV9EU1VCVV9JLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJlcmV0IiwgICAgIiIsCQkweDQyMDAwMDE4LCAweGZmZmZmZmZmLAkwLAlJMwl9LAoteyJmbG9vci5sLmQiLCAiRCxTIiwJMHg0NjIwMDAwYiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkzCX0sCi17ImZsb29yLmwucyIsICJELFMiLAkweDQ2MDAwMDBiLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTMJfSwKLXsiZmxvb3Iudy5kIiwgIkQsUyIsCTB4NDYyMDAwMGYsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoteyJmbG9vci53LnMiLCAiRCxTIiwJMHg0NjAwMDAwZiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkyCX0sCi17ImZsdXNoaSIsICAiIiwJCTB4YmMwMTAwMDAsIDB4ZmZmZmZmZmYsIDAsCQlMMQl9LAoteyJmbHVzaGQiLCAgIiIsCQkweGJjMDIwMDAwLCAweGZmZmZmZmZmLCAwLCBMMQkJfSwKLXsiZmx1c2hpZCIsICIiLAkJMHhiYzAzMDAwMCwgMHhmZmZmZmZmZiwgMCwgTDEJCX0sCi17ImhpYmVybmF0ZSIsIiIsICAgICAgICAweDQyMDAwMDIzLCAweGZmZmZmZmZmLAkwLCBWMQl9LAoteyJqciIsICAgICAgInMiLAkweDAwMDAwMDA4LCAweGZjMWZmZmZmLAlVQkR8UkRfcywJSTEJfSwKLXsiaiIsICAgICAgICJzIiwJMHgwMDAwMDAwOCwgMHhmYzFmZmZmZiwJVUJEfFJEX3MsCUkxCX0sIC8qIGpyICovCi0vKiBTVlI0IFBJQyBjb2RlIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGosIHNvIGl0IG11c3QgYmUgYQotICAgbWFjcm8uICAqLwoteyJqIiwJICAgICJhIiwJMCwgICAgIChpbnQpIE1fSl9BLAlJTlNOX01BQ1JPLAlJMQl9LAotLyogVGhpcyBmb3JtIG9mIGogaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyIGFuZCBpbnRlcm5hbGx5IGJ5IHRoZQotICAgYXNzZW1ibGVyLCBidXQgd2lsbCBuZXZlciBtYXRjaCB1c2VyIGlucHV0IChiZWNhdXNlIHRoZSBsaW5lIGFib3ZlCi0gICB3aWxsIG1hdGNoIGZpcnN0KS4gICovCi17ImoiLCAgICAgICAiYSIsCTB4MDgwMDAwMDAsIDB4ZmMwMDAwMDAsCVVCRCwJCUkxCX0sCi17ImphbHIiLCAgICAicyIsCTB4MDAwMGY4MDksIDB4ZmMxZmZmZmYsCVVCRHxSRF9zfFdSX2QsCUkxCX0sCi17ImphbHIiLCAgICAiZCxzIiwJMHgwMDAwMDAwOSwgMHhmYzFmMDdmZiwJVUJEfFJEX3N8V1JfZCwJSTEJfSwKLS8qIFNWUjQgUElDIGNvZGUgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZyBmb3IgamFsLCBzbyBpdCBtdXN0IGJlIGEKLSAgIG1hY3JvLiAgKi8KLXsiamFsIiwgICAgICJkLHMiLAkwLCAgICAgKGludCkgTV9KQUxfMiwJSU5TTl9NQUNSTywJSTEJfSwKLXsiamFsIiwgICAgICJzIiwJMCwgICAgIChpbnQpIE1fSkFMXzEsCUlOU05fTUFDUk8sCUkxCX0sCi17ImphbCIsICAgICAiYSIsCTAsICAgICAoaW50KSBNX0pBTF9BLAlJTlNOX01BQ1JPLAlJMQl9LAotLyogVGhpcyBmb3JtIG9mIGphbCBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIgYW5kIGludGVybmFsbHkgYnkgdGhlCi0gICBhc3NlbWJsZXIsIGJ1dCB3aWxsIG5ldmVyIG1hdGNoIHVzZXIgaW5wdXQgKGJlY2F1c2UgdGhlIGxpbmUgYWJvdmUKLSAgIHdpbGwgbWF0Y2ggZmlyc3QpLiAgKi8KLXsiamFsIiwgICAgICJhIiwJMHgwYzAwMDAwMCwgMHhmYzAwMDAwMCwJVUJEfFdSXzMxLAlJMQl9LAotICAvKiBqYWx4IHJlYWxseSBzaG91bGQgb25seSBiZSBhdmFsaWFibGUgaWYgbWlwczE2IGlzIGF2YWlsYWJsZSwKLSAgICAgYnV0IGZvciBub3cgbWFrZSBpdCBJMS4gKi8KLXsiamFseCIsICAgICJhIiwJMHg3NDAwMDAwMCwgMHhmYzAwMDAwMCwgVUJEfFdSXzMxLAlJMSAgICAgIH0sCi17ImxhIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MQV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGIiLCAgICAgICJ0LG8oYikiLAkweDgwMDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsYiIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTEJfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxidSIsICAgICAidCxvKGIpIiwJMHg5MDAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKLXsibGJ1IiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xCVV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGQiLAkgICAgInQsbyhiKSIsICAgMHhkYzAwMDAwMCwgMHhmYzAwMDAwMCwgV1JfdHxSRF9iLAlJMwl9LAoteyJsZCIsICAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fTERfT0IsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxkIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MRF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGRjMSIsICAgICJULG8oYikiLAkweGQ0MDAwMDAwLCAweGZjMDAwMDAwLCBDTER8UkRfYnxXUl9UfEZQX0QsCUkyCX0sCi17ImxkYzEiLCAgICAiRSxvKGIpIiwJMHhkNDAwMDAwMCwgMHhmYzAwMDAwMCwgQ0xEfFJEX2J8V1JfVHxGUF9ELAlJMgl9LAoteyJsZGMxIiwgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fTERDMV9BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsibGRjMSIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xEQzFfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17ImwuZCIsICAgICAiVCxvKGIpIiwJMHhkNDAwMDAwMCwgMHhmYzAwMDAwMCwgQ0xEfFJEX2J8V1JfVHxGUF9ELAlJMgl9LCAvKiBsZGMxICovCi17ImwuZCIsICAgICAiVCxvKGIpIiwJMCwgICAgKGludCkgTV9MX0RPQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibC5kIiwgICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX0xfREFCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsZGMyIiwgICAgIkUsbyhiKSIsCTB4ZDgwMDAwMDAsIDB4ZmMwMDAwMDAsIENMRHxSRF9ifFdSX0NDLAlJMgl9LAoteyJsZGMyIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTERDMl9BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsibGRjMyIsICAgICJFLG8oYikiLAkweGRjMDAwMDAwLCAweGZjMDAwMDAwLCBDTER8UkRfYnxXUl9DQywJSTIJfSwKLXsibGRjMyIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xEQzNfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17ImxkbCIsCSAgICAidCxvKGIpIiwJMHg2ODAwMDAwMCwgMHhmYzAwMDAwMCwgTEREfFdSX3R8UkRfYiwJSTMJfSwKLXsibGRsIiwJICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xETF9BQiwJSU5TTl9NQUNSTywJSTMJfSwKLXsibGRyIiwJICAgICJ0LG8oYikiLAkweDZjMDAwMDAwLCAweGZjMDAwMDAwLCBMRER8V1JfdHxSRF9iLAlJMwl9LAoteyJsZHIiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTERSX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJsZHhjMSIsICAgIkQsdChiKSIsCTB4NGMwMDAwMDEsIDB4ZmMwMGY4M2YsIExERHxXUl9EfFJEX3R8UkRfYiwJSTQJfSwKLXsibGgiLCAgICAgICJ0LG8oYikiLAkweDg0MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsaCIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTEhfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxodSIsICAgICAidCxvKGIpIiwJMHg5NDAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKLXsibGh1IiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xIVV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLS8qIGxpIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgdGFibGUuICAqLwoteyJsaS5kIiwgICAgInQsRiIsCTAsICAgIChpbnQpIE1fTElfRCwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGkuZCIsICAgICJULEwiLAkwLCAgICAoaW50KSBNX0xJX0RELAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsaS5zIiwgICAgInQsZiIsCTAsICAgIChpbnQpIE1fTElfUywJSU5TTl9NQUNSTywJSTEJfSwKLXsibGkucyIsICAgICJULGwiLAkwLCAgICAoaW50KSBNX0xJX1NTLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsbCIsCSAgICAidCxvKGIpIiwJMHhjMDAwMDAwMCwgMHhmYzAwMDAwMCwgTEREfFJEX2J8V1JfdCwJSTIJfSwKLXsibGwiLAkgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTExfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17ImxsZCIsCSAgICAidCxvKGIpIiwJMHhkMDAwMDAwMCwgMHhmYzAwMDAwMCwgTEREfFJEX2J8V1JfdCwJSTMJfSwKLXsibGxkIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xMRF9BQiwJSU5TTl9NQUNSTywJSTMJfSwKLXsibHVpIiwgICAgICJ0LHUiLAkweDNjMDAwMDAwLCAweGZmZTAwMDAwLAlXUl90LAkJSTEJfSwKLXsibHciLCAgICAgICJ0LG8oYikiLAkweDhjMDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsdyIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17Imx3YzAiLCAgICAiRSxvKGIpIiwJMHhjMDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfQ0MsCUkxCX0sCi17Imx3YzAiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MwX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsd2MxIiwgICAgIlQsbyhiKSIsCTB4YzQwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX1R8RlBfUywJSTEJfSwKLXsibHdjMSIsICAgICJFLG8oYikiLAkweGM0MDAwMDAwLCAweGZjMDAwMDAwLAlDTER8UkRfYnxXUl9UfEZQX1MsCUkxCX0sCi17Imx3YzEiLCAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MxX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsd2MxIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTFdDMV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibC5zIiwgICAgICJULG8oYikiLAkweGM0MDAwMDAwLCAweGZjMDAwMDAwLAlDTER8UkRfYnxXUl9UfEZQX1MsCUkxCX0sIC8qIGx3YzEgKi8KLXsibC5zIiwgICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX0xXQzFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17Imx3YzIiLCAgICAiRSxvKGIpIiwJMHhjODAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfQ0MsCUkxCX0sCi17Imx3YzIiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MyX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsd2MzIiwgICAgIkUsbyhiKSIsCTB4Y2MwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX0NDLAlJMQl9LAoteyJsd2MzIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTFdDM19BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibHdsIiwgICAgICJ0LG8oYikiLAkweDg4MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsd2wiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdMX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsY2FjaGUiLCAgInQsbyhiKSIsCTB4ODgwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkyCX0sIC8qIHNhbWUgKi8KLXsibGNhY2hlIiwgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXTF9BQiwJSU5TTl9NQUNSTywJSTIJfSwgLyogYXMgbHdsICovCi17Imx3ciIsICAgICAidCxvKGIpIiwJMHg5ODAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKLXsibHdyIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXUl9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsiZmx1c2giLCAgICJ0LG8oYikiLAkweDk4MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMgl9LCAvKiBzYW1lICovCi17ImZsdXNoIiwgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV1JfQUIsCUlOU05fTUFDUk8sCUkyCX0sIC8qIGFzIGx3ciAqLwoteyJsd3UiLCAgICAgInQsbyhiKSIsCTB4OWMwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkzCX0sCi17Imx3dSIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV1VfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17Imx3eGMxIiwgICAiRCx0KGIpIiwJMHg0YzAwMDAwMCwgMHhmYzAwZjgzZiwgTEREfFdSX0R8UkRfdHxSRF9iLAlJNAl9LAotCi0KLXsibWFkIiwJICAgICJzLHQiLAkweDcwMDAwMDAwLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98UkRfSEl8UkRfTE8sCVAzCX0sCi17Im1hZHUiLCAgICAicyx0IiwJMHg3MDAwMDAwMSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfFJEX0hJfFJEX0xPLAlQMwl9LAoteyJtYWRkLmQiLCAgIkQsUixTLFQiLAkweDRjMDAwMDIxLCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsCUk0CX0sCi17Im1hZGQucyIsICAiRCxSLFMsVCIsCTB4NGMwMDAwMjAsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfUywJSTQJfSwKLXsibWFkZCIsICAgICJzLHQiLAkweDAwMDAwMDFjLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCQlMMQl9LAoteyJtYWRkIiwgICAgInMsdCIsCTB4NzAwMDAwMDAsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xJU19NLAkgICAgICAgIEcxCX0sCi17Im1hZGQiLCAgICAiZCxzLHQiLAkweDcwMDAwMDAwLCAweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98V1JfZHxJU19NLAlHMQl9LAoteyJtYWRkdSIsICAgInMsdCIsCTB4MDAwMDAwMWQsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJCUwxCX0sCi17Im1hZGR1IiwgICAicyx0IiwJMHg3MDAwMDAwMSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfElTX00sCUcxfSwKLXsibWFkZHUiLCAgICJkLHMsdCIsCTB4NzAwMDAwMDEsIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xXUl9kfElTX00sCUcxfSwKLXsibWFkZDE2IiwgICJzLHQiLCAgICAgIDB4MDAwMDAwMjgsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISXxXUl9MT3xSRF9ISXxSRF9MTywJVjEJfSwKLXsibWZjMCIsICAgICJ0LEciLAkweDQwMDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMCwJSTEJfSwKLXsibWZjMSIsICAgICJ0LFMiLAkweDQ0MDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9TfEZQX1MsCUkxCX0sCi17Im1mYzEiLCAgICAidCxHIiwJMHg0NDAwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfU3xGUF9TLAlJMQl9LAoteyJtZmMyIiwgICAgInQsRyIsCTB4NDgwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MyLAlJMQl9LAoteyJtZmMzIiwgICAgInQsRyIsCTB4NGMwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MzLAlJMQl9LAoteyJtZmhpIiwgICAgImQiLAkweDAwMDAwMDEwLCAweGZmZmYwN2ZmLAlXUl9kfFJEX0hJLAlJMQl9LAoteyJtZmxvIiwgICAgImQiLAkweDAwMDAwMDEyLCAweGZmZmYwN2ZmLAlXUl9kfFJEX0xPLAlJMQl9LAoteyJtb3YuZCIsICAgIkQsUyIsCTB4NDYyMDAwMDYsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMQl9LAoteyJtb3YucyIsICAgIkQsUyIsCTB4NDYwMDAwMDYsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMQl9LAoteyJtb3ZmIiwgICAgImQscyxOIiwJMHgwMDAwMDAwMSwgMHhmYzAzMDdmZiwgV1JfZHxSRF9zfFJEX0NDfEZQX0R8RlBfUywJSTQJfSwKLXsibW92Zi5kIiwgICJELFMsTiIsCTB4NDYyMDAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9ELAlJNAl9LAoteyJtb3ZmLnMiLCAgIkQsUyxOIiwJMHg0NjAwMDAxMSwgMHhmZmUzMDAzZiwgV1JfRHxSRF9TfFJEX0NDfEZQX1MsCUk0CX0sCi17Im1vdm4iLCAgICAiZCx2LHQiLAkweDAwMDAwMDBiLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTQJfSwKLXsiZmZjIiwgICAgICJkLHYiLAkweDAwMDAwMDBiLCAweGZjMWYwN2ZmLAlXUl9kfFJEX3MsTDEJfSwKLXsibW92bi5kIiwgICJELFMsdCIsCTB4NDYyMDAwMTMsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX0QsCUk0CX0sCi17Im1vdm4ucyIsICAiRCxTLHQiLAkweDQ2MDAwMDEzLCAweGZmZTAwMDNmLCBXUl9EfFJEX1N8UkRfdHxGUF9TLAlJNAl9LAoteyJtb3Z0IiwgICAgImQscyxOIiwJMHgwMDAxMDAwMSwgMHhmYzAzMDdmZiwgV1JfZHxSRF9zfFJEX0NDLAlJNAl9LAoteyJtb3Z0LmQiLCAgIkQsUyxOIiwJMHg0NjIxMDAxMSwgMHhmZmUzMDAzZiwgV1JfRHxSRF9TfFJEX0NDfEZQX0QsCUk0CX0sCi17Im1vdnQucyIsICAiRCxTLE4iLAkweDQ2MDEwMDExLCAweGZmZTMwMDNmLCBXUl9EfFJEX1N8UkRfQ0N8RlBfUywJSTQJfSwKLXsibW92eiIsICAgICJkLHYsdCIsCTB4MDAwMDAwMGEsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJNAl9LAoteyJmZnMiLCAgICAgImQsdiIsCTB4MDAwMDAwMGEsIDB4ZmMxZjA3ZmYsCVdSX2R8UkRfcyxMMQl9LAoteyJtb3Z6LmQiLCAgIkQsUyx0IiwJMHg0NjIwMDAxMiwgMHhmZmUwMDAzZiwgV1JfRHxSRF9TfFJEX3R8RlBfRCwJSTQJfSwKLXsibW92ei5zIiwgICJELFMsdCIsCTB4NDYwMDAwMTIsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX1MsCUk0CX0sCi0vKiBtb3ZlIGlzIGF0IHRoZSB0b3Agb2YgdGhlIHRhYmxlLiAgKi8KLXsibXN1Yi5kIiwgICJELFIsUyxUIiwJMHg0YzAwMDAyOSwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9ELAlJNAl9LAoteyJtc3ViLnMiLCAgIkQsUixTLFQiLAkweDRjMDAwMDI4LCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX1MsCUk0CX0sCi17Im1zdWIiLCAgICAicyx0IiwJMHgwMDAwMDAxZSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLEwxCX0sCi17Im1zdWJ1IiwgICAicyx0IiwJMHgwMDAwMDAxZiwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLEwxCX0sCi17Im10YzAiLCAgICAidCxHIiwJMHg0MDgwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQzB8V1JfQ0MsCUkxCX0sCi17Im10YzEiLCAgICAidCxTIiwJMHg0NDgwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfU3xGUF9TLAlJMQl9LAoteyJtdGMxIiwgICAgInQsRyIsCTB4NDQ4MDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX1N8RlBfUywJSTEJfSwKLXsibXRjMiIsICAgICJ0LEciLAkweDQ4ODAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DMnxXUl9DQywJSTEJfSwKLXsibXRjMyIsICAgICJ0LEciLAkweDRjODAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DM3xXUl9DQywJSTEJfSwKLXsibXRoaSIsICAgICJzIiwJMHgwMDAwMDAxMSwgMHhmYzFmZmZmZiwJUkRfc3xXUl9ISSwJSTEJfSwKLXsibXRsbyIsICAgICJzIiwJMHgwMDAwMDAxMywgMHhmYzFmZmZmZiwJUkRfc3xXUl9MTywJSTEJfSwKLXsibXVsLmQiLCAgICJELFYsVCIsCTB4NDYyMDAwMDIsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUkxCX0sCi17Im11bC5zIiwgICAiRCxWLFQiLAkweDQ2MDAwMDAyLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9TLAlJMQl9LAoteyJtdWwiLCAgICAgImQsdix0IiwJMHg3MDAwMDAwMiwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3R8V1JfSEl8V1JfTE8sUDN9LAoteyJtdWwiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9NVUwsCUlOU05fTUFDUk8sCUkxCX0sCi17Im11bCIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX01VTF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJtdWxvIiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9NVUxPLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJtdWxvIiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9NVUxPX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17Im11bG91IiwgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX01VTE9VLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJtdWxvdSIsICAgImQsdixJIiwJMCwgICAgKGludCkgTV9NVUxPVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJtdWx0IiwgICAgInMsdCIsCTB4MDAwMDAwMTgsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xJU19NLAlJMX0sCi17Im11bHQiLCAgICAiZCxzLHQiLAkweDAwMDAwMDE4LCAweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98V1JfZHxJU19NLCBHMX0sCi17Im11bHR1IiwgICAicyx0IiwJMHgwMDAwMDAxOSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfElTX00sCUkxfSwKLXsibXVsdHUiLCAgICJkLHMsdCIsCTB4MDAwMDAwMTksIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xXUl9kfElTX00sIEcxfSwKLXsibmVnIiwgICAgICJkLHciLAkweDAwMDAwMDIyLCAweGZmZTAwN2ZmLAlXUl9kfFJEX3QsCUkxCX0sIC8qIHN1YiAwICovCi17Im5lZ3UiLCAgICAiZCx3IiwJMHgwMDAwMDAyMywgMHhmZmUwMDdmZiwJV1JfZHxSRF90LAlJMQl9LCAvKiBzdWJ1IDAgKi8KLXsibmVnLmQiLCAgICJELFYiLAkweDQ2MjAwMDA3LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTEJfSwKLXsibmVnLnMiLCAgICJELFYiLAkweDQ2MDAwMDA3LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTEJfSwKLXsibm1hZGQuZCIsICJELFIsUyxUIiwJMHg0YzAwMDAzMSwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9ELAlJNAl9LAoteyJubWFkZC5zIiwgIkQsUixTLFQiLAkweDRjMDAwMDMwLCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX1MsCUk0CX0sCi17Im5tc3ViLmQiLCAiRCxSLFMsVCIsCTB4NGMwMDAwMzksIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwJSTQJfSwKLXsibm1zdWIucyIsICJELFIsUyxUIiwJMHg0YzAwMDAzOCwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9TLAlJNAl9LAotLyogbm9wIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgdGFibGUuICAqLwoteyJub3IiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyNywgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17Im5vciIsICAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX05PUl9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJub3QiLCAgICAgImQsdiIsCTB4MDAwMDAwMjcsIDB4ZmMxZjA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LC8qbm9yIGQscywwKi8KLXsib3IiLCAgICAgICJkLHYsdCIsCTB4MDAwMDAwMjUsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJvciIsICAgICAgInQscixJIiwJMCwgICAgKGludCkgTV9PUl9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJvcmkiLCAgICAgInQscixpIiwJMHgzNDAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LAotCi0KLXsicHJlZiIsICAgICJrLG8oYikiLAkweGNjMDAwMDAwLCAweGZjMDAwMDAwLCBSRF9iLAkJRzMJfSwKLXsicHJlZngiLCAgICJoLHQoYikiLAkweDRjMDAwMDBmLCAweGZjMDAwN2ZmLCBSRF9ifFJEX3QsCUk0CX0sCi0KLQoteyJyZWNpcC5kIiwgIkQsUyIsCTB4NDYyMDAwMTUsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJNAl9LAoteyJyZWNpcC5zIiwgIkQsUyIsCTB4NDYwMDAwMTUsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJNAl9LAoteyJyZW0iLCAgICAgInoscyx0IiwJMHgwMDAwMDAxYSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMSB9LAoteyJyZW0iLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9SRU1fMywJSU5TTl9NQUNSTywJSTEJfSwKLXsicmVtIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fUkVNXzNJLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJyZW11IiwgICAgInoscyx0IiwJMHgwMDAwMDAxYiwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMSB9LAoteyJyZW11IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9SRU1VXzMsCUlOU05fTUFDUk8sCUkxCX0sCi17InJlbXUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1JFTVVfM0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InJmZSIsICAgICAiIiwJCTB4NDIwMDAwMTAsIDB4ZmZmZmZmZmYsCTAsCUkxfFQzCQl9LAoteyJyb2wiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ST0wsCUlOU05fTUFDUk8sCUkxCX0sCi17InJvbCIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1JPTF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJyb3IiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ST1IsCUlOU05fTUFDUk8sCUkxCX0sCi17InJvciIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1JPUl9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJyb3VuZC5sLmQiLCAiRCxTIiwJMHg0NjIwMDAwOCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkzCX0sCi17InJvdW5kLmwucyIsICJELFMiLAkweDQ2MDAwMDA4LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTMJfSwKLXsicm91bmQudy5kIiwgIkQsUyIsCTB4NDYyMDAwMGMsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoteyJyb3VuZC53LnMiLCAiRCxTIiwJMHg0NjAwMDAwYywgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkyCX0sCi17InJzcXJ0LmQiLCAiRCxTIiwJMHg0NjIwMDAxNiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUk0CX0sCi17InJzcXJ0LnMiLCAiRCxTIiwJMHg0NjAwMDAxNiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUk0CX0sCi17InNiIiwgICAgICAidCxvKGIpIiwJMHhhMDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMQl9LAoteyJzYiIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0JfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InNjIiwJICAgICJ0LG8oYikiLAkweGUwMDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF90fFdSX3R8UkRfYiwJSTIJfSwKLXsic2MiLAkgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0NfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17InNjZCIsCSAgICAidCxvKGIpIiwJMHhmMDAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfdHxXUl90fFJEX2IsCUkzCX0sCi17InNjZCIsCSAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TQ0RfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17InNkIiwJICAgICJ0LG8oYikiLAkweGZjMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkzCX0sCi17InNkIiwgICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9TRF9PQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2QiLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NEX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZGJicCIsICAgIiIsCQkweDAwMDAwMDBlLCAweGZmZmZmZmZmLAlUUkFQLCAgICAgICAgICAgRzIJfSwKLXsic2RiYnAiLCAgICJjIiwJMHgwMDAwMDAwZSwgMHhmYzAwZmZmZiwJVFJBUCwJCUcyCX0sCi17InNkYmJwIiwgICAiYyxxIiwJMHgwMDAwMDAwZSwgMHhmYzAwMDAzZiwJVFJBUCwJCUcyCX0sCi17InNkYzEiLCAgICAiVCxvKGIpIiwJMHhmNDAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfVHxSRF9ifEZQX0QsCUkyCX0sCi17InNkYzEiLCAgICAiRSxvKGIpIiwJMHhmNDAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfVHxSRF9ifEZQX0QsCUkyCX0sCi17InNkYzEiLCAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9TREMxX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJzZGMxIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU0RDMV9BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsic2RjMiIsICAgICJFLG8oYikiLAkweGY4MDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF9DMnxSRF9iLAlJMgl9LAoteyJzZGMyIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU0RDMl9BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsic2RjMyIsICAgICJFLG8oYikiLAkweGZjMDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF9DM3xSRF9iLAlJMgl9LAoteyJzZGMzIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU0RDM19BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsicy5kIiwgICAgICJULG8oYikiLAkweGY0MDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF9UfFJEX2J8RlBfRCwJSTIJfSwKLXsicy5kIiwgICAgICJULG8oYikiLAkwLCAgICAoaW50KSBNX1NfRE9CLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzLmQiLCAgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fU19EQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InNkbCIsICAgICAidCxvKGIpIiwJMHhiMDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMwl9LAoteyJzZGwiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0RMX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJzZHIiLCAgICAgInQsbyhiKSIsCTB4YjQwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTMJfSwKLXsic2RyIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NEUl9BQiwJSU5TTl9NQUNSTywJSTMJfSwKLXsic2R4YzEiLCAgICJTLHQoYikiLCAgIDB4NGMwMDAwMDksIDB4ZmMwMDA3ZmYsIFNNfFJEX1N8UkRfdHxSRF9iLAlJNAl9LAoteyJzZWxzbCIsICAgImQsdix0IiwJMHgwMDAwMDAwNSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsTDEJfSwKLXsic2Vsc3IiLCAgICJkLHYsdCIsCTB4MDAwMDAwMDEsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LEwxCX0sCi17InNlcSIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NFUSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2VxIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0VRX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNnZSIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NHRSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2dlIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0dFX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNnZXUiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NHRVUsCUlOU05fTUFDUk8sCUkxCX0sCi17InNnZXUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NHRVVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2d0IiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0dULAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ3QiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TR1RfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2d0dSIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0dUVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2d0dSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0dUVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzaCIsICAgICAgInQsbyhiKSIsCTB4YTQwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTEJfSwKLXsic2giLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NIX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzbGUiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TTEUsCUlOU05fTUFDUk8sCUkxCX0sCi17InNsZSIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NMRV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzbGV1IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TTEVVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzbGV1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TTEVVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNsbHYiLCAgICAiZCx0LHMiLAkweDAwMDAwMDA0LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTEJfSwKLXsic2xsIiwgICAgICJkLHcscyIsCTB4MDAwMDAwMDQsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMQl9LCAvKiBzbGx2ICovCi17InNsbCIsICAgICAiZCx3LDwiLAkweDAwMDAwMDAwLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCUkxCX0sCi17InNsdCIsICAgICAiZCx2LHQiLAkweDAwMDAwMDJhLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsic2x0IiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0xUX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNsdGkiLCAgICAidCxyLGoiLAkweDI4MDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCi17InNsdGl1IiwgICAidCxyLGoiLAkweDJjMDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCi17InNsdHUiLCAgICAiZCx2LHQiLAkweDAwMDAwMDJiLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsic2x0dSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0xUVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzbmUiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TTkUsCUlOU05fTUFDUk8sCUkxCX0sCi17InNuZSIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NORV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzcXJ0LmQiLCAgIkQsUyIsCTB4NDYyMDAwMDQsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoteyJzcXJ0LnMiLCAgIkQsUyIsCTB4NDYwMDAwMDQsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMgl9LAoteyJzcmF2IiwgICAgImQsdCxzIiwJMHgwMDAwMDAwNywgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkxCX0sCi17InNyYSIsICAgICAiZCx3LHMiLAkweDAwMDAwMDA3LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTEJfSwgLyogc3JhdiAqLwoteyJzcmEiLCAgICAgImQsdyw8IiwJMHgwMDAwMDAwMywgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAlJMQl9LAoteyJzcmx2IiwgICAgImQsdCxzIiwJMHgwMDAwMDAwNiwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkxCX0sCi17InNybCIsICAgICAiZCx3LHMiLAkweDAwMDAwMDA2LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTEJfSwgLyogc3JsdiAqLwoteyJzcmwiLCAgICAgImQsdyw8IiwJMHgwMDAwMDAwMiwgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAlJMQl9LAoteyJzdGFuZGJ5IiwgIiIsICAgICAgICAgMHg0MjAwMDAyMSwgMHhmZmZmZmZmZiwJMCwJCVYxCX0sCi17InN1YiIsICAgICAiZCx2LHQiLAkweDAwMDAwMDIyLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsic3ViIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU1VCX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InN1Yi5kIiwgICAiRCxWLFQiLAkweDQ2MjAwMDAxLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJMQl9LCAgICAgCi17InN1Yi5zIiwgICAiRCxWLFQiLAkweDQ2MDAwMDAxLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9TLAlJMQl9LAoteyJzdWJ1IiwgICAgImQsdix0IiwJMHgwMDAwMDAyMywgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17InN1YnUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NVQlVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3VzcGVuZCIsICIiLCAgICAgICAgIDB4NDIwMDAwMjIsIDB4ZmZmZmZmZmYsCTAsCQlWMQl9LAoteyJzdyIsICAgICAgInQsbyhiKSIsCTB4YWMwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTEJfSwKLXsic3ciLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NXX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzd2MwIiwgICAgIkUsbyhiKSIsCTB4ZTAwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX0MwfFJEX2IsCUkxCX0sCi17InN3YzAiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MwX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzd2MxIiwgICAgIlQsbyhiKSIsCTB4ZTQwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX1R8UkRfYnxGUF9TLAlJMQl9LAoteyJzd2MxIiwgICAgIkUsbyhiKSIsCTB4ZTQwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX1R8UkRfYnxGUF9TLAlJMQl9LAoteyJzd2MxIiwgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fU1dDMV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3djMSIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InMucyIsICAgICAiVCxvKGIpIiwJMHhlNDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfVHxSRF9ifEZQX1MsCUkxCX0sIC8qIHN3YzEgKi8KLXsicy5zIiwgICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InN3YzIiLCAgICAiRSxvKGIpIiwJMHhlODAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfQzJ8UkRfYiwJSTEJfSwKLXsic3djMiIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzJfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InN3YzMiLCAgICAiRSxvKGIpIiwJMHhlYzAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfQzN8UkRfYiwJSTEJfSwKLXsic3djMyIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzNfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InN3bCIsICAgICAidCxvKGIpIiwJMHhhODAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMQl9LAoteyJzd2wiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU1dMX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzY2FjaGUiLCAgInQsbyhiKSIsCTB4YTgwMDAwMDAsIDB4ZmMwMDAwMDAsCVJEX3R8UkRfYiwJSTIJfSwgLyogc2FtZSAqLwoteyJzY2FjaGUiLCAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU1dMX0FCLAlJTlNOX01BQ1JPLAlJMgl9LCAvKiBhcyBzd2wgKi8KLXsic3dyIiwgICAgICJ0LG8oYikiLAkweGI4MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkxCX0sCi17InN3ciIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TV1JfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImludmFsaWRhdGUiLCAidCxvKGIpIiwweGI4MDAwMDAwLCAweGZjMDAwMDAwLAlSRF90fFJEX2IsCUkyCX0sIC8qIHNhbWUgKi8KLXsiaW52YWxpZGF0ZSIsICJ0LEEoYikiLDAsICAgIChpbnQpIE1fU1dSX0FCLAlJTlNOX01BQ1JPLAlJMgl9LCAvKiBhcyBzd3IgKi8KLXsic3d4YzEiLCAgICJTLHQoYikiLCAgIDB4NGMwMDAwMDgsIDB4ZmMwMDA3ZmYsIFNNfFJEX1N8UkRfdHxSRF9iLAlJNAl9LAoteyJzeW5jIiwgICAgIiIsCQkweDAwMDAwMDBmLCAweGZmZmZmZmZmLAlJTlNOX1NZTkMsCUkyfEcxCX0sCi17InN5bmMucCIsICAiIiwJCTB4MDAwMDA0MGYsIDB4ZmZmZmZmZmYsCUlOU05fU1lOQywJSTIJfSwKLXsic3luYy5sIiwgICIiLAkJMHgwMDAwMDAwZiwgMHhmZmZmZmZmZiwJSU5TTl9TWU5DLAlJMgl9LAoteyJzeXNjYWxsIiwgIiIsCQkweDAwMDAwMDBjLCAweGZmZmZmZmZmLAlUUkFQLAlJMQkJfSwKLXsic3lzY2FsbCIsICJCIiwJMHgwMDAwMDAwYywgMHhmYzAwMDAzZiwJVFJBUCwJSTEJCX0sCi17InRlcWkiLCAgICAicyxqIiwJMHgwNDBjMDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgl9LAoteyJ0ZXEiLAkgICAgInMsdCIsCTB4MDAwMDAwMzQsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxUUkFQLAlJMgl9LAoteyJ0ZXEiLAkgICAgInMsdCxxIiwJMHgwMDAwMDAzNCwgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCUkyCX0sCi17InRlcSIsICAgICAicyxqIiwJMHgwNDBjMDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgl9LCAvKiB0ZXFpICovCi17InRlcSIsICAgICAicyxJIiwJMCwgICAgKGludCkgTV9URVFfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsidGdlaSIsICAgICJzLGoiLAkweDA0MDgwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCX0sCi17InRnZSIsCSAgICAicyx0IiwJMHgwMDAwMDAzMCwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFRSQVAsCUkyCX0sCi17InRnZSIsCSAgICAicyx0LHEiLAkweDAwMDAwMDMwLCAweGZjMDAwMDNmLAlSRF9zfFJEX3R8VFJBUCwJSTIJfSwKLXsidGdlIiwgICAgICJzLGoiLAkweDA0MDgwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCX0sIC8qIHRnZWkgKi8KLXsidGdlIiwJICAgICJzLEkiLAkwLCAgICAoaW50KSBNX1RHRV9JLCAgICBJTlNOX01BQ1JPLAlJMgl9LAoteyJ0Z2VpdSIsICAgInMsaiIsCTB4MDQwOTAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sCi17InRnZXUiLCAgICAicyx0IiwJMHgwMDAwMDAzMSwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0Z2V1IiwgICAgInMsdCxxIiwJMHgwMDAwMDAzMSwgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0Z2V1IiwgICAgInMsaiIsCTB4MDQwOTAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sIC8qIHRnZWl1ICovCi17InRnZXUiLCAgICAicyxJIiwJMCwgICAgKGludCkgTV9UR0VVX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17InRsYnAiLCAgICAiIiwJCTB4NDIwMDAwMDgsIDB4ZmZmZmZmZmYsCUlOU05fVExCLAlJMQl9LAoteyJ0bGJyIiwgICAgIiIsCQkweDQyMDAwMDAxLCAweGZmZmZmZmZmLAlJTlNOX1RMQiwJSTEJfSwKLXsidGxid2kiLCAgICIiLAkJMHg0MjAwMDAwMiwgMHhmZmZmZmZmZiwJSU5TTl9UTEIsCUkxCX0sCi17InRsYndyIiwgICAiIiwJCTB4NDIwMDAwMDYsIDB4ZmZmZmZmZmYsCUlOU05fVExCLAlJMQl9LAoteyJ0bHRpIiwgICAgInMsaiIsCTB4MDQwYTAwMDAsIDB4ZmMxZjAwMDAsCVJEX3N8VFJBUCwJSTIJCX0sCi17InRsdCIsICAgICAicyx0IiwJMHgwMDAwMDAzMiwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0bHQiLCAgICAgInMsdCxxIiwJMHgwMDAwMDAzMiwgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0bHQiLCAgICAgInMsaiIsCTB4MDQwYTAwMDAsIDB4ZmMxZjAwMDAsCVJEX3N8VFJBUCwJSTIJCX0sIC8qIHRsdGkgKi8KLXsidGx0IiwgICAgICJzLEkiLAkwLCAgICAoaW50KSBNX1RMVF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJ0bHRpdSIsICAgInMsaiIsCTB4MDQwYjAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sCi17InRsdHUiLCAgICAicyx0IiwJMHgwMDAwMDAzMywgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0bHR1IiwgICAgInMsdCxxIiwJMHgwMDAwMDAzMywgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0bHR1IiwgICAgInMsaiIsCTB4MDQwYjAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sIC8qIHRsdGl1ICovCi17InRsdHUiLCAgICAicyxJIiwJMCwgICAgKGludCkgTV9UTFRVX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17InRuZWkiLCAgICAicyxqIiwJMHgwNDBlMDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgkJfSwKLXsidG5lIiwgICAgICJzLHQiLAkweDAwMDAwMDM2LCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCi17InRuZSIsICAgICAicyx0LHEiLAkweDAwMDAwMDM2LCAweGZjMDAwMDNmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCi17InRuZSIsICAgICAicyxqIiwJMHgwNDBlMDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgkJfSwgLyogdG5laSAqLwoteyJ0bmUiLCAgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVE5FX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17InRydW5jLmwuZCIsICJELFMiLAkweDQ2MjAwMDA5LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTMJfSwKLXsidHJ1bmMubC5zIiwgIkQsUyIsCTB4NDYwMDAwMDksIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMwl9LAoteyJ0cnVuYy53LmQiLCAiRCxTIiwJMHg0NjIwMDAwZCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkyCX0sCi17InRydW5jLncuZCIsICJELFMseCIsCTB4NDYyMDAwMGQsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoteyJ0cnVuYy53LmQiLCAiRCxTLHQiLAkwLCAgICAoaW50KSBNX1RSVU5DV0QsCUlOU05fTUFDUk8sCUkxCX0sCi17InRydW5jLncucyIsICJELFMiLAkweDQ2MDAwMDBkLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTIJfSwKLXsidHJ1bmMudy5zIiwgIkQsUyx4IiwJMHg0NjAwMDAwZCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkyCX0sCi17InRydW5jLncucyIsICJELFMsdCIsCTAsICAgIChpbnQpIE1fVFJVTkNXUywJSU5TTl9NQUNSTywJSTEJfSwKLXsidWxkIiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VMRCwJSU5TTl9NQUNSTywJSTMJfSwKLXsidWxkIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VMRF9BLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJ1bGgiLCAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVUxILAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1bGgiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVUxIX0EsCUlOU05fTUFDUk8sCUkxCX0sCi17InVsaHUiLCAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VTEhVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1bGh1IiwgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVUxIVV9BLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1bHciLCAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVUxXLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1bHciLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVUxXX0EsCUlOU05fTUFDUk8sCUkxCX0sCi17InVzZCIsICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VU0QsCUlOU05fTUFDUk8sCUkzCX0sCi17InVzZCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VU0RfQSwJSU5TTl9NQUNSTywJSTMJfSwKLXsidXNoIiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VTSCwJSU5TTl9NQUNSTywJSTEJfSwKLXsidXNoIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VTSF9BLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1c3ciLCAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVVNXLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1c3ciLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVVNXX0EsCUlOU05fTUFDUk8sCUkxCX0sCi17InhvciIsICAgICAiZCx2LHQiLAkweDAwMDAwMDI2LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsieG9yIiwgICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fWE9SX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InhvcmkiLCAgICAidCxyLGkiLAkweDM4MDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCi17IndhaXQiLCAgICAiIiwJCTB4NDIwMDAwMjAsIDB4ZmZmZmZmZmYsCVRSQVAsCUkzCX0sCi17IndhaXRpIiwgICAiIiwJCTB4NDIwMDAwMjAsIDB4ZmZmZmZmZmYsCVRSQVAsCUwxCX0sCi17IndiIiwgCSAgICAibyhiKSIsCTB4YmMwNDAwMDAsIDB4ZmMxZjAwMDAsIFNNfFJEX2IsCUwxCX0sCi0vKiBObyBoYXphcmQgcHJvdGVjdGlvbiBvbiBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMtLXRoZXkgc2hvdWxkbid0Ci0gICBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBwcm9jZXNzb3IgYW5kIGlmIHRoZXkgZG8gaXQncyB1cCB0byB0aGUKLSAgIHVzZXIgdG8gcHV0IGluIG5vcHMgYXMgbmVjZXNzYXJ5LiAgVGhlc2UgYXJlIGF0IHRoZSBlbmQgc28gdGhhdCB0aGUKLSAgIGRpc2FzZW1ibGVyIHJlY29nbml6ZXMgbW9yZSBzcGVjaWZpYyB2ZXJzaW9ucyBmaXJzdC4gICovCi17ImMwIiwgICAgICAiQyIsCTB4NDIwMDAwMDAsIDB4ZmUwMDAwMDAsCTAsCUkxCQl9LAoteyJjMSIsICAgICAgIkMiLAkweDQ2MDAwMDAwLCAweGZlMDAwMDAwLAkwLAlJMQkJfSwKLXsiYzIiLCAgICAgICJDIiwJMHg0YTAwMDAwMCwgMHhmZTAwMDAwMCwJMCwJSTEJCX0sCi17ImMzIiwgICAgICAiQyIsCTB4NGUwMDAwMDAsIDB4ZmUwMDAwMDAsCTAsCUkxCQl9LAoteyJjb3AwIiwgICAgICJDIiwJMCwgICAgKGludCkgTV9DT1AwLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJjb3AxIiwgICAgICJDIiwJMCwgICAgKGludCkgTV9DT1AxLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJjb3AyIiwgICAgICJDIiwJMCwgICAgKGludCkgTV9DT1AyLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJjb3AzIiwgICAgICJDIiwJMCwgICAgKGludCkgTV9DT1AzLAlJTlNOX01BQ1JPLAlJMQl9LAotCi0gIC8qIENvbmZsaWN0cyB3aXRoIHRoZSA0NjUwJ3MgIm11bCIgaW5zdHJ1Y3Rpb24uICBOb2JvZHkncyB1c2luZyB0aGUKLSAgICAgNDAxMCBhbnkgbW9yZSwgc28gbW92ZSB0aGlzIGluc24gb3V0IG9mIHRoZSB3YXkuICBJZiB0aGUgb2JqZWN0Ci0gICAgIGZvcm1hdCBnYXZlIHVzIG1vcmUgaW5mbywgd2UgY291bGQgZG8gdGhpcyByaWdodC4gICovCi17ImFkZGNpdSIsICAidCxyLGoiLAkweDcwMDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsTDEJfSwKLX07Ci0KLSNkZWZpbmUgTUlQU19OVU1fT1BDT0RFUyBcCi0JKChzaXplb2YgbWlwc19idWlsdGluX29wY29kZXMpIC8gKHNpemVvZiAobWlwc19idWlsdGluX29wY29kZXNbMF0pKSkKLWNvbnN0IGludCBiZmRfbWlwc19udW1fYnVpbHRpbl9vcGNvZGVzID0gTUlQU19OVU1fT1BDT0RFUzsKLQotLyogY29uc3QgcmVtb3ZlZCBmcm9tIHRoZSBmb2xsb3dpbmcgdG8gYWxsb3cgZm9yIGR5bmFtaWMgZXh0ZW5zaW9ucyB0byB0aGUgCi0gKiBidWlsdC1pbiBpbnN0cnVjdGlvbiBzZXQuICovCi1zdHJ1Y3QgbWlwc19vcGNvZGUgKm1pcHNfb3Bjb2RlcyA9Ci0gIChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgbWlwc19idWlsdGluX29wY29kZXM7Ci1pbnQgYmZkX21pcHNfbnVtX29wY29kZXMgPSBNSVBTX05VTV9PUENPREVTOwotI3VuZGVmIE1JUFNfTlVNX09QQ09ERVMKLQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9taXBzMTYtb3BjLmMgYi9vcGNvZGVzL21pcHMxNi1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkMmRiYi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL21pcHMxNi1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKiBtaXBzMTYtb3BjLmMuICBNaXBzMTYgb3Bjb2RlIHRhYmxlLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+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+Ci0jIGRlZmluZSBfKFN0cmluZykgZGdldHRleHQgKFBBQ0tBR0UsIFN0cmluZykKLSMgaWZkZWYgZ2V0dGV4dF9ub29wCi0jICBkZWZpbmUgTl8oU3RyaW5nKSBnZXR0ZXh0X25vb3AgKFN0cmluZykKLSMgZWxzZQotIyAgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSMgZW5kaWYKLSNlbHNlCi0vKiBTdHVicyB0aGF0IGRvIHNvbWV0aGluZyBjbG9zZSBlbm91Z2guICAqLwotIyBkZWZpbmUgdGV4dGRvbWFpbihTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBnZXR0ZXh0KFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbixNZXNzYWdlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGRjZ2V0dGV4dChEb21haW4sTWVzc2FnZSxUeXBlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbixEaXJlY3RvcnkpIChEb21haW4pCi0jIGRlZmluZSBfKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9wby9NYWtlLWluIGIvb3Bjb2Rlcy9wby9NYWtlLWluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTUyZGIxLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvcG8vTWFrZS1pbgorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBwcm9ncmFtIHNvdXJjZSBkaXJlY3RvcnkgaW4gR05VIE5MUyB1dGlsaXRpZXMgcGFja2FnZS4KLSMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi1QQUNLQUdFID0gQFBBQ0tBR0VACi1WRVJTSU9OID0gQFZFUlNJT05ACi0KLVNIRUxMID0gL2Jpbi9zaAotQFNFVF9NQUtFQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1kYXRhZGlyID0gJChwcmVmaXgpL0BEQVRBRElSTkFNRUAKLWxvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCi1nbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCi1nZXR0ZXh0c3JjZGlyID0gJChwcmVmaXgpL3NoYXJlL2dldHRleHQvcG8KLXN1YmRpciA9IHBvCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi0KLUNDID0gQENDQAotR0VOQ0FUID0gQEdFTkNBVEAKLUdNU0dGTVQgPSBQQVRIPS4uL3NyYzokJFBBVEggQEdNU0dGTVRACi1NU0dGTVQgPSBATVNHRk1UQAotWEdFVFRFWFQgPSBQQVRIPS4uL3NyYzokJFBBVEggQFhHRVRURVhUQAotTVNHTUVSR0UgPSBQQVRIPS4uL3NyYzokJFBBVEggbXNnbWVyZ2UKLQotREVGUyA9IEBERUZTQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotCi1JTkNMVURFUyA9IC1JLi4gLUkkKHRvcF9zcmNkaXIpL2ludGwKLQotQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKLQotU09VUkNFUyA9IGNhdC1pZC10YmwuYwotUE9GSUxFUyA9IEBQT0ZJTEVTQAotR01PRklMRVMgPSBAR01PRklMRVNACi1ESVNURklMRVMgPSBDaGFuZ2VMb2cgTWFrZWZpbGUuaW4uaW4gUE9URklMRVMuaW4gJChQQUNLQUdFKS5wb3QgXAotc3RhbXAtY2F0LWlkICQoUE9GSUxFUykgJChHTU9GSUxFUykgJChTT1VSQ0VTKQotCi1QT1RGSUxFUyA9IFwKLQotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5wbyAucG94IC5nbW8gLm1vIC5tc2cgLmNhdAotCi0uYy5vOgotCSQoQ09NUElMRSkgJDwKLQotLnBvLnBveDoKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JJChNU0dNRVJHRSkgJDwgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IC1vICQqLnBveAotCi0ucG8ubW86Ci0JJChNU0dGTVQpIC1vICRAICQ8Ci0KLS5wby5nbW86Ci0JZmlsZT0kKHNyY2RpcikvYGVjaG8gJCogfCBzZWQgJ3MsLiovLCwnYC5nbW8gXAotCSAgJiYgcm0gLWYgJCRmaWxlICYmICQoR01TR0ZNVCkgLW8gJCRmaWxlICQ8Ci0KLS5wby5jYXQ6Ci0Jc2VkIC1mIC4uL2ludGwvcG8ybXNnLnNlZCA8ICQ8ID4gJCoubXNnIFwKLQkgICYmIHJtIC1mICRAICYmICQoR0VOQ0FUKSAkQCAkKi5tc2cKLQotCi1hbGw6IGFsbC1AVVNFX05MU0AKLQotYWxsLXllczogJChDQVRBTE9HUykgQE1BSU5UQCAkKFBBQ0tBR0UpLnBvdAotYWxsLW5vOgotCi0kKHNyY2RpcikvJChQQUNLQUdFKS5wb3Q6ICQoUE9URklMRVMpCi0JJChYR0VUVEVYVCkgLS1kZWZhdWx0LWRvbWFpbj0kKFBBQ0tBR0UpIC0tZGlyZWN0b3J5PSQodG9wX3NyY2RpcikgXAotCSAgLS1hZGQtY29tbWVudHMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKLQkgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4KLQlybSAtZiAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQltdiAkKFBBQ0tBR0UpLnBvICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCi0kKHNyY2RpcikvY2F0LWlkLXRibC5jOiBzdGFtcC1jYXQtaWQ7IEA6Ci0kKHNyY2Rpcikvc3RhbXAtY2F0LWlkOiAkKFBBQ0tBR0UpLnBvdAotCXJtIC1mIGNhdC1pZC10YmwudG1wCi0Jc2VkIC1mIC4uL2ludGwvcG8ydGJsLnNlZCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgXAotCQl8IHNlZCAtZSAicy9AUEFDS0FHRSBOQU1FQC8kKFBBQ0tBR0UpLyIgPiBjYXQtaWQtdGJsLnRtcAotCWlmIGNtcCAtcyBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyB0aGVuIFwKLQkgIHJtIGNhdC1pZC10YmwudG1wOyBcCi0JZWxzZSBcCi0JICBlY2hvIGNhdC1pZC10YmwuYyBjaGFuZ2VkOyBcCi0JICBybSAtZiAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JICBtdiBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JZmkKLQljZCAkKHNyY2RpcikgJiYgcm0gLWYgc3RhbXAtY2F0LWlkICYmIGVjaG8gdGltZXN0YW1wID4gc3RhbXAtY2F0LWlkCi0KLQotaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQotaW5zdGFsbC1leGVjOgotaW5zdGFsbC1pbmZvOgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtQFVTRV9OTFNACi1pbnN0YWxsLWRhdGEtbm86IGFsbAotaW5zdGFsbC1kYXRhLXllczogYWxsCi0JaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICQoTUtJTlNUQUxMRElSUykgJChkYXRhZGlyKTsgXAotCWVsc2UgXAotCSAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZGF0YWRpcik7IFwKLQlmaQotCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgY2FzZSAiJCRjYXQiIGluIFwKLQkgICAgKi5nbW8pIGRlc3RkaXI9JChnbnVsb2NhbGVkaXIpOzsgXAotCSAgICAqKSAgICAgZGVzdGRpcj0kKGxvY2FsZWRpcik7OyBcCi0JICBlc2FjOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIGRpcj0kJGRlc3RkaXIvJCRsYW5nL0xDX01FU1NBR0VTOyBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQkZGlyOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQkZGlyOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0IGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZWxzZSBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0Lm07IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQubSAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQubSBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgZWxzZSBcCi0JICAgIGlmIHRlc3QgLXIgJChzcmNkaXIpLyQkY2F0Lm0gOyB0aGVuIFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0Lm0gXAotCQkkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICAgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5pbiBcCi0JCQkgICQoZ2V0dGV4dHNyY2RpcikvTWFrZWZpbGUuaW4uaW47IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQotIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgotaW5zdGFsbGNoZWNrOgotCi11bmluc3RhbGw6Ci0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQlkb25lCi0Jcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS9wby1NYWtlZmlsZS5pbi5pbgotCi1jaGVjazogYWxsCi0KLWNhdC1pZC10YmwubzogLi4vaW50bC9saWJnZXR0ZXh0LmgKLQotZHZpIGluZm8gdGFncyBUQUdTIElEOgotCi1tb3N0bHljbGVhbjoKLQlybSAtZiBjb3JlIGNvcmUuKiAqLnBveCAkKFBBQ0tBR0UpLnBvICoub2xkLnBvIGNhdC1pZC10YmwudG1wCi0Jcm0gLWZyICoubwotCi1jbGVhbjogbW9zdGx5Y2xlYW4KLQotZGlzdGNsZWFuOiBjbGVhbgotCXJtIC1mIE1ha2VmaWxlIE1ha2VmaWxlLmluIFBPVEZJTEVTICoubW8gKi5tc2cgKi5jYXQgKi5jYXQubQotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQlybSAtZiAkKEdNT0ZJTEVTKQotCi1kaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotZGlzdCBkaXN0ZGlyOiB1cGRhdGUtcG8gJChESVNURklMRVMpCi0JZGlzdHM9IiQoRElTVEZJTEVTKSI7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCi0JZG9uZQotCi11cGRhdGUtcG86IE1ha2VmaWxlCi0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCVBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgXAotCWNkICQoc3JjZGlyKTsgXAotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIG12ICQkbGFuZy5wbyAkJGxhbmcub2xkLnBvOyBcCi0JICBlY2hvICIkJGxhbmc6IjsgXAotCSAgaWYgJChNU0dNRVJHRSkgJCRsYW5nLm9sZC5wbyAkKFBBQ0tBR0UpLnBvdCAtbyAkJGxhbmcucG87IHRoZW4gXAotCSAgICBybSAtZiAkJGxhbmcub2xkLnBvOyBcCi0JICBlbHNlIFwKLQkgICAgZWNobyAibXNnbWVyZ2UgZm9yICQkY2F0IGZhaWxlZCEiOyBcCi0JICAgIHJtIC1mICQkbGFuZy5wbzsgXAotCSAgICBtdiAkJGxhbmcub2xkLnBvICQkbGFuZy5wbzsgXAotCSAgZmk7IFwKLQlkb25lCi0KLVBPVEZJTEVTOiBQT1RGSUxFUy5pbgotCSggaWYgdGVzdCAneCQoc3JjZGlyKScgIT0gJ3guJzsgdGhlbiBcCi0JICAgIHBvc3JjcHJlZml4PSckKHRvcF9zcmNkaXIpLyc7IFwKLQkgIGVsc2UgXAotCSAgICBwb3NyY3ByZWZpeD0iLi4vIjsgXAotCSAgZmk7IFwKLQkgIHJtIC1mICRALXQgJEAgXAotCSAgICAmJiAoc2VkIC1lICcvXiMvZCcgLWUgJy9eWyAJXSokJC9kJyBcCi0JCSAgICAtZSAic0AuKkAJJCRwb3NyY3ByZWZpeCYgXFxcXEAiIDwgJChzcmNkaXIpLyRALmluIFwKLQkJfCBzZWQgLWUgJyQkcy9cXCQkLy8nKSA+ICRALXQgXAotCSAgICAmJiBjaG1vZCBhLXcgJEAtdCBcCi0JICAgICYmIG12ICRALXQgJEAgKQotCi1QT1RGSUxFUy5pbjogQE1BSU5UQCAuLi9NYWtlZmlsZQotCWNkIC4uICYmICQoTUFLRSkgcG8vUE9URklMRVMuaW4KLQotTWFrZWZpbGU6IE1ha2UtaW4gLi4vY29uZmlnLnN0YXR1cyBQT1RGSUxFUwotCWNkIC4uIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvTWFrZWZpbGUuaW46JChzdWJkaXIpL01ha2UtaW4gXAotCSAgICAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9vcGNvZGVzL3BvL1BPVEZJTEVTLmluIGIvb3Bjb2Rlcy9wby9QT1RGSUxFUy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA3MmNjYS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3BvL1BPVEZJTEVTLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotYTI5ay1kaXMuYwotYWxwaGEtZGlzLmMKLWFscGhhLW9wYy5jCi1hcmMtZGlzLmMKLWFyYy1vcGMuYwotYXJtLWRpcy5jCi1hcm0tb3BjLmgKLWNnZW4tYXNtLmMKLWNnZW4tZGlzLmMKLWNnZW4tb3BjLmMKLWQxMHYtZGlzLmMKLWQxMHYtb3BjLmMKLWQzMHYtZGlzLmMKLWQzMHYtb3BjLmMKLWRpcy1idWYuYwotZGlzYXNzZW1ibGUuYwotZnIzMC1hc20uYwotZnIzMC1kZXNjLmMKLWZyMzAtZGVzYy5oCi1mcjMwLWRpcy5jCi1mcjMwLWlibGQuYwotZnIzMC1vcGMuYwotZnIzMC1vcGMuaAotaDgzMDAtZGlzLmMKLWg4NTAwLWRpcy5jCi1oODUwMC1vcGMuaAotaHBwYS1kaXMuYwotaTM4Ni1kaXMuYwotaTk2MC1kaXMuYwotbTEwMjAwLWRpcy5jCi1tMTAyMDAtb3BjLmMKLW0xMDMwMC1kaXMuYwotbTEwMzAwLW9wYy5jCi1tMzJyLWFzbS5jCi1tMzJyLWRlc2MuYwotbTMyci1kZXNjLmgKLW0zMnItZGlzLmMKLW0zMnItaWJsZC5jCi1tMzJyLW9wYy5jCi1tMzJyLW9wYy5oCi1tMzJyLW9waW5zdC5jCi1tNjhrLWRpcy5jCi1tNjhrLW9wYy5jCi1tODhrLWRpcy5jCi1tY29yZS1kaXMuYwotbWNvcmUtb3BjLmgKLW1pcHMtZGlzLmMKLW1pcHMtb3BjLmMKLW1pcHMxNi1vcGMuYwotbnMzMmstZGlzLmMKLW9waW50bC5oCi1wcGMtZGlzLmMKLXBwYy1vcGMuYwotc2gtZGlzLmMKLXNoLW9wYy5oCi1zcGFyYy1kaXMuYwotc3BhcmMtb3BjLmMKLXN5c2RlcC5oCi10aWMzMC1kaXMuYwotdGljODAtZGlzLmMKLXRpYzgwLW9wYy5jCi12ODUwLWRpcy5jCi12ODUwLW9wYy5jCi12YXgtZGlzLmMKLXc2NS1kaXMuYwotdzY1LW9wYy5oCi16OGstZGlzLmMKLXo4ay1vcGMuaAotejhrZ2VuLmMKZGlmZiAtLWdpdCBhL29wY29kZXMvcG8vb3Bjb2Rlcy5wb3QgYi9vcGNvZGVzL3BvL29wY29kZXMucG90CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2UzZjBmLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvcG8vb3Bjb2Rlcy5wb3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotIyBTT01FIERFU0NSSVBUSVZFIFRJVExFLgotIyBDb3B5cmlnaHQgKEMpIFlFQVIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEZJUlNUIEFVVEhPUiA8RU1BSUxAQUREUkVTUz4sIFlFQVIuCi0jCi0jLCBmdXp6eQotbXNnaWQgIiIKLW1zZ3N0ciAiIgotIlByb2plY3QtSWQtVmVyc2lvbjogUEFDS0FHRSBWRVJTSU9OXG4iCi0iUE9ULUNyZWF0aW9uLURhdGU6IDE5OTktMDQtMTggMTk6MDEtMDQwMFxuIgotIlBPLVJldmlzaW9uLURhdGU6IFlFQVItTU8tREEgSE86TUkrWk9ORVxuIgotIkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPlxuIgotIkxhbmd1YWdlLVRlYW06IExBTkdVQUdFIDxMTEBsaS5vcmc+XG4iCi0iTUlNRS1WZXJzaW9uOiAxLjBcbiIKLSJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Q0hBUlNFVFxuIgotIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IEVOQ09ESU5HXG4iCi0KLSM6IGFscGhhLW9wYy5jOjMzNQotbXNnaWQgImJyYW5jaCBvcGVyYW5kIHVuYWxpZ25lZCIKLW1zZ3N0ciAiIgotCi0jOiBhbHBoYS1vcGMuYzozNTggYWxwaGEtb3BjLmM6MzgwCi1tc2dpZCAianVtcCBoaW50IHVuYWxpZ25lZCIKLW1zZ3N0ciAiIgotCi0jOiBhcm0tZGlzLmM6Mzg4Ci1tc2dpZCAiPGlsbGVnYWwgcHJlY2lzaW9uPiIKLW1zZ3N0ciAiIgotCi0jOiBjZ2VuLWFzbS5jOjIyNAotbXNnaWQgInVucmVjb2duaXplZCBrZXl3b3JkL3JlZ2lzdGVyIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY2dlbi1hc20uYzozMzIgZnIzMC1pYmxkLmM6MjIzIG0zMnItaWJsZC5jOjIyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWxkIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjZ2VuLWFzbS5jOjM1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWx1IG5vdCBiZXR3ZWVuICVsdSBhbmQgJWx1KSIKLW1zZ3N0ciAiIgotCi0jOiBkMzB2LWRpcy5jOjMwNQotIywgYy1mb3JtYXQKLW1zZ2lkICI8dW5rbm93biByZWdpc3RlciAlZD4iCi1tc2dzdHIgIiIKLQotIy4gQ2FuJ3QgaGFwcGVuLgotIzogZGlzLWJ1Zi5jOjUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gZXJyb3IgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBkaXMtYnVmLmM6NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQWRkcmVzcyAweCV4IGlzIG91dCBvZiBib3VuZHMuXG4iCi1tc2dzdHIgIiIKLQotIzogZnIzMC1hc20uYzozMDMgbTMyci1hc20uYzozMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHBhcnNpbmcuXG4iCi1tc2dzdHIgIiIKLQotIy4gV2UgY291bGRuJ3QgcGFyc2UgaXQuCi0jOiBmcjMwLWFzbS5jOjM2NyBmcjMwLWFzbS5jOjQzNiBtMzJyLWFzbS5jOjM4MyBtMzJyLWFzbS5jOjQ1MgotbXNnaWQgInVucmVjb2duaXplZCBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jLiBTeW50YXggY2hhciBkaWRuJ3QgbWF0Y2guICBDYW4ndCBiZSB0aGlzIGluc24uCi0jLiBGSVhNRTogd291bGQgbGlrZSB0byByZXR1cm4gc29tZXRoaW5nIGxpa2UKLSMuICJleHBlY3RlZCBjaGFyIGBjJyIKLSM6IGZyMzAtYXNtLmM6NDA0IG0zMnItYXNtLmM6NDIwCi1tc2dpZCAic3ludGF4IGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtYXNtLmM6NDMwIG0zMnItYXNtLmM6NDQ2Ci1tc2dpZCAianVuayBhdCBlbmQgb2YgbGluZSIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWFzbS5jOjUyMyBtMzJyLWFzbS5jOjUzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgaW5zdHJ1Y3Rpb24gYCUuNTBzLi4uJyIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWFzbS5jOjUyNiBtMzJyLWFzbS5jOjU0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgaW5zdHJ1Y3Rpb24gYCUuNTBzJyIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWRpcy5jOjMwMCBtMzJyLWRpcy5jOjI0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcHJpbnRpbmcgaW5zbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzoyMTAgbTMyci1pYmxkLmM6MjEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbHUgbm90IGJldHdlZW4gMCBhbmQgJWx1KSIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzo3NDkgbTMyci1pYmxkLmM6NjgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBidWlsZGluZyBpbnNuLlxuIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtaWJsZC5jOjk1MiBtMzJyLWlibGQuYzo4MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGRlY29kaW5nIGluc24uXG4iCi1tc2dzdHIgIiIKLQotIzogZnIzMC1pYmxkLmM6MTA5NiBtMzJyLWlibGQuYzo5MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgaW50IG9wZXJhbmQuXG4iCi1tc2dzdHIgIiIKLQotIzogZnIzMC1pYmxkLmM6MTIyNSBtMzJyLWlibGQuYzoxMDMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBnZXR0aW5nIHZtYSBvcGVyYW5kLlxuIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtaWJsZC5jOjEzNTggbTMyci1pYmxkLmM6MTEzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyBpbnQgb3BlcmFuZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzoxNDg0IG0zMnItaWJsZC5jOjEyMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHNldHRpbmcgdm1hIG9wZXJhbmQuXG4iCi1tc2dzdHIgIiIKLQotIzogaDgzMDAtZGlzLmM6NDA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkhtbW1tICV4IgotbXNnc3RyICIiCi0KLSM6IGg4MzAwLWRpcy5jOjQxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJEb24ndCB1bmRlcnN0YW5kICV4IFxuIgotbXNnc3RyICIiCi0KLSM6IGg4NTAwLWRpcy5jOjEzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBjb3BlIHdpdGggaW5zZXJ0ICVkXG4iCi1tc2dzdHIgIiIKLQotIy4gQ291bGRuJ3QgdW5kZXJzdGFuZCBhbnl0aGluZwotIzogaDg1MDAtZGlzLmM6MzQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUwMnhcdFx0KnVua25vd24qIgotbXNnc3RyICIiCi0KLSM6IG0xMDIwMC1kaXMuYzoxOTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93blx0MHglMDJ4IgotbXNnc3RyICIiCi0KLSM6IG0xMDIwMC1kaXMuYzozMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93blx0MHglMDRseCIKLW1zZ3N0ciAiIgotCi0jOiBtMTAzMDAtZGlzLmM6NzA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd25cdDB4JTA0eCIKLW1zZ3N0ciAiIgotCi0jOiBtNjhrLWRpcy5jOjQxMAotIywgYy1mb3JtYXQKLW1zZ2lkICI8aW50ZXJuYWwgZXJyb3IgaW4gb3Bjb2RlIHRhYmxlOiAlcyAlcz5cbiIKLW1zZ3N0ciAiIgotCi0jOiBtNjhrLWRpcy5jOjk2NwotIywgYy1mb3JtYXQKLW1zZ2lkICI8ZnVuY3Rpb24gY29kZSAlZD4iCi1tc2dzdHIgIiIKLQotIzogbTg4ay1kaXMuYzoyNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIyA8ZGlzIGVycm9yOiAlMDh4PiIKLW1zZ3N0ciAiIgotCi0jOiBtaXBzLWRpcy5jOjM3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIjIGludGVybmFsIGVycm9yLCB1bmRlZmluZWQgbW9kaWZpZXIoJWMpIgotbXNnc3RyICIiCi0KLSMuIEkgYW5kIFogYXJlIG91dHB1dCBvcGVyYW5kcyBhbmQgY2FuYHQgYmUgaW1tZWRpYXRlCi0jLiAqIEEgaXMgYW4gYWRkcmVzcyBhbmQgd2UgY2FuYHQgaGF2ZSB0aGUgYWRkcmVzcyBvZgotIy4gKiBhbiBpbW1lZGlhdGUgZWl0aGVyLiBXZSBkb24ndCBrbm93IGhvdyBtdWNoIHRvIGluY3JlYXNlCi0jLiAqIGFvZmZzZXRwIGJ5IHNpbmNlIHdoYXRldmVyIGdlbmVyYXRlZCB0aGlzIGlzIGJyb2tlbgotIy4gKiBhbnl3YXkhCi0jLgotIzogbnMzMmstZGlzLmM6NjE4Ci1tc2dpZCAiJDx1bmRlZmluZWQ+IgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo1ODYgcHBjLW9wYy5jOjYxNwotbXNnaWQgImludmFsaWQgY29uZGl0aW9uYWwgb3B0aW9uIgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo2MTkKLW1zZ2lkICJhdHRlbXB0IHRvIHNldCB5IGJpdCB3aGVuIHVzaW5nICsgb3IgLSBtb2RpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6Njc0Ci1tc2dpZCAiaWdub3JpbmcgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBpbiBicmFuY2ggb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo3MDkgcHBjLW9wYy5jOjc0NgotbXNnaWQgImlsbGVnYWwgYml0bWFzayIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6ODE1Ci1tc2dpZCAidmFsdWUgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo4ODkKLW1zZ2lkICJpbmRleCByZWdpc3RlciBpbiBsb2FkIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo5MDQKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIG9wZXJhbmQgd2hlbiB1cGRhdGluZyIKLW1zZ3N0ciAiIgotCi0jLiBNYXJrIGFzIG5vbi12YWxpZCBpbnN0cnVjdGlvbgotIzogc3BhcmMtZGlzLmM6NzM5Ci1tc2dpZCAidW5rbm93biIKLW1zZ3N0ciAiIgotCi0jOiBzcGFyYy1kaXMuYzo4MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3I6ICBiYWQgc3BhcmMtb3Bjb2RlLmg6IFwiJXNcIiwgJSMuOGx4LCAlIy44bHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcGFyYy1kaXMuYzo4MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3I6IGJhZCBzcGFyYy1vcGNvZGUuaDogXCIlc1wiLCAlIy44bHgsICUjLjhseFxuIgotbXNnc3RyICIiCi0KLSM6IHNwYXJjLWRpcy5jOjg3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvcjogYmFkIHNwYXJjLW9wY29kZS5oOiBcIiVzXCIgPT0gXCIlc1wiXG4iCi1tc2dzdHIgIiIKZGlmZiAtLWdpdCBhL29wY29kZXMvcHBjLWRpcy5jIGIvb3Bjb2Rlcy9wcGMtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzE2ZWEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wcGMtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyogcHBjLWRpcy5jIC0tIERpc2Fzc2VtYmxlIFBvd2VyUEMgaW5zdHJ1Y3Rpb25zCi0gICBDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3BwYy5oIgotCi0vKiBUaGlzIGZpbGUgcHJvdmlkZXMgc2V2ZXJhbCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zLCBhbGwgb2Ygd2hpY2ggdXNlCi0gICB0aGUgZGlzYXNzZW1ibGVyIGludGVyZmFjZSBkZWZpbmVkIGluIGRpcy1hc20uaC4gIFNldmVyYWwgZnVuY3Rpb25zCi0gICBhcmUgcHJvdmlkZWQgYmVjYXVzZSB0aGlzIGZpbGUgaGFuZGxlcyBkaXNhc3NlbWJseSBmb3IgdGhlIFBvd2VyUEMKLSAgIGluIGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuIG1vZGUgYW5kIGFsc28gZm9yIHRoZSBQT1dFUiAoUlMvNjAwMCkKLSAgIGNoaXAuICAqLwotCi1zdGF0aWMgaW50IHByaW50X2luc25fcG93ZXJwYyBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLAotCQkJCSAgICAgICBpbnQgYmlnZW5kaWFuLCBpbnQgZGlhbGVjdCkpOwotCi0vKiBQcmludCBhIGJpZyBlbmRpYW4gUG93ZXJQQyBpbnN0cnVjdGlvbi4gIEZvciBjb252ZW5pZW5jZSwgYWxzbwotICAgZGlzYXNzZW1ibGUgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZCBieSB0aGUgTW90b3JvbGEgUG93ZXJQQyA2MDEuICAqLwotCi1pbnQKLXByaW50X2luc25fYmlnX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIDEsCi0JCQkgICAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82MDEpOwotfQotCi0vKiBQcmludCBhIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBpbnN0cnVjdGlvbi4gIEZvciBjb252ZW5pZW5jZSwgYWxzbwotICAgZGlzYXNzZW1ibGUgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZCBieSB0aGUgTW90b3JvbGEgUG93ZXJQQyA2MDEuICAqLwotCi1pbnQKLXByaW50X2luc25fbGl0dGxlX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIDAsCi0JCQkgICAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82MDEpOwotfQotCi0vKiBQcmludCBhIFBPV0VSIChSUy82MDAwKSBpbnN0cnVjdGlvbi4gICovCi0KLWludAotcHJpbnRfaW5zbl9yczYwMDAgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIDEsIFBQQ19PUENPREVfUE9XRVIpOwotfQotCi0vKiBQcmludCBhIFBvd2VyUEMgb3IgUE9XRVIgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIGJpZ2VuZGlhbiwgZGlhbGVjdCkKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgaW50IGJpZ2VuZGlhbjsKLSAgICAgaW50IGRpYWxlY3Q7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgaW50IHN0YXR1czsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wY29kZTsKLSAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICpvcGNvZGVfZW5kOwotICB1bnNpZ25lZCBsb25nIG9wOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGJpZ2VuZGlhbikKLSAgICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgZWxzZQotICAgIGluc24gPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0gIC8qIEdldCB0aGUgbWFqb3Igb3Bjb2RlIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIG9wID0gUFBDX09QIChpbnNuKTsKLQotICAvKiBGaW5kIHRoZSBmaXJzdCBtYXRjaCBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgV2UgY291bGQgc3BlZWQgdGhpcyB1cAotICAgICBhIGJpdCBieSBkb2luZyBhIGJpbmFyeSBzZWFyY2ggb24gdGhlIG1ham9yIG9wY29kZS4gICovCi0gIG9wY29kZV9lbmQgPSBwb3dlcnBjX29wY29kZXMgKyBwb3dlcnBjX251bV9vcGNvZGVzOwotICBmb3IgKG9wY29kZSA9IHBvd2VycGNfb3Bjb2Rlczsgb3Bjb2RlIDwgb3Bjb2RlX2VuZDsgb3Bjb2RlKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyB0YWJsZV9vcDsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXg7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOwotICAgICAgaW50IGludmFsaWQ7Ci0gICAgICBpbnQgbmVlZF9jb21tYTsKLSAgICAgIGludCBuZWVkX3BhcmVuOwotCi0gICAgICB0YWJsZV9vcCA9IFBQQ19PUCAob3Bjb2RlLT5vcGNvZGUpOwotICAgICAgaWYgKG9wIDwgdGFibGVfb3ApCi0JYnJlYWs7Ci0gICAgICBpZiAob3AgPiB0YWJsZV9vcCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKChpbnNuICYgb3Bjb2RlLT5tYXNrKSAhPSBvcGNvZGUtPm9wY29kZQotCSAgfHwgKG9wY29kZS0+ZmxhZ3MgJiBkaWFsZWN0KSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBNYWtlIHR3byBwYXNzZXMgb3ZlciB0aGUgb3BlcmFuZHMuICBGaXJzdCBzZWUgaWYgYW55IG9mIHRoZW0KLQkgaGF2ZSBleHRyYWN0aW9uIGZ1bmN0aW9ucywgYW5kLCBpZiB0aGV5IGRvLCBtYWtlIHN1cmUgdGhlCi0JIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLSAgICAgIGludmFsaWQgPSAwOwotICAgICAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQotCXsKLQkgIG9wZXJhbmQgPSBwb3dlcnBjX29wZXJhbmRzICsgKm9waW5kZXg7Ci0JICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKLQkgICAgKCpvcGVyYW5kLT5leHRyYWN0KSAoaW5zbiwgJmludmFsaWQpOwotCX0KLSAgICAgIGlmIChpbnZhbGlkKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBUaGUgaW5zdHJ1Y3Rpb24gaXMgdmFsaWQuICAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wY29kZS0+bmFtZSk7Ci0gICAgICBpZiAob3Bjb2RlLT5vcGVyYW5kc1swXSAhPSAwKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQiKTsKLQotICAgICAgLyogTm93IGV4dHJhY3QgYW5kIHByaW50IHRoZSBvcGVyYW5kcy4gICovCi0gICAgICBuZWVkX2NvbW1hID0gMDsKLSAgICAgIG5lZWRfcGFyZW4gPSAwOwotICAgICAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQotCXsKLQkgIGxvbmcgdmFsdWU7Ci0KLQkgIG9wZXJhbmQgPSBwb3dlcnBjX29wZXJhbmRzICsgKm9waW5kZXg7Ci0KLQkgIC8qIE9wZXJhbmRzIHRoYXQgYXJlIG1hcmtlZCBGQUtFIGFyZSBzaW1wbHkgaWdub3JlZC4gIFdlCi0JICAgICBhbHJlYWR5IG1hZGUgc3VyZSB0aGF0IHRoZSBleHRyYWN0IGZ1bmN0aW9uIGNvbnNpZGVyZWQKLQkgICAgIHRoZSBpbnN0cnVjdGlvbiB0byBiZSB2YWxpZC4gICovCi0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfRkFLRSkgIT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotCSAgICB2YWx1ZSA9ICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIChpbnQgKikgTlVMTCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9IChpbnNuID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9TSUdORUQpICE9IDAKLQkJICAmJiAodmFsdWUgJiAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSkgIT0gMCkKLQkJdmFsdWUgLT0gMSA8PCBvcGVyYW5kLT5iaXRzOwotCSAgICB9Ci0KLQkgIC8qIElmIHRoZSBvcGVyYW5kIGlzIG9wdGlvbmFsLCBhbmQgdGhlIHZhbHVlIGlzIHplcm8sIGRvbid0Ci0JICAgICBwcmludCBhbnl0aGluZy4gICovCi0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfT1BUSU9OQUwpICE9IDAKLQkgICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9ORVhUKSA9PSAwCi0JICAgICAgJiYgdmFsdWUgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChuZWVkX2NvbW1hKQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JICAgICAgbmVlZF9jb21tYSA9IDA7Ci0JICAgIH0KLQotCSAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGZsYWdzLiAgKi8KLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9HUFIpICE9IDApCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiciVsZCIsIHZhbHVlKTsKLQkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0ZQUikgIT0gMCkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJmJWxkIiwgdmFsdWUpOwotCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUkVMQVRJVkUpICE9IDApCi0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAobWVtYWRkciArIHZhbHVlLCBpbmZvKTsKLQkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0FCU09MVVRFKSAhPSAwKQotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChiZmRfdm1hKSB2YWx1ZSAmIDB4ZmZmZmZmZmYsIGluZm8pOwotCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfQ1IpID09IDAKLQkJICAgfHwgKGRpYWxlY3QgJiBQUENfT1BDT0RFX1BQQykgPT0gMCkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAob3BlcmFuZC0+Yml0cyA9PSAzKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImNyJWQiLCB2YWx1ZSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3RhdGljIGNvbnN0IGNoYXIgKmNibmFtZXNbNF0gPSB7ICJsdCIsICJndCIsICJlcSIsICJzbyIgfTsKLQkJICBpbnQgY3I7Ci0JCSAgaW50IGNjOwotCi0JCSAgY3IgPSB2YWx1ZSA+PiAyOwotCQkgIGlmIChjciAhPSAwKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI0KmNyJWQiLCBjcik7Ci0JCSAgY2MgPSB2YWx1ZSAmIDM7Ci0JCSAgaWYgKGNjICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjciAhPSAwKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIrIik7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBjYm5hbWVzW2NjXSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAobmVlZF9wYXJlbikKLQkgICAgewotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCSAgICAgIG5lZWRfcGFyZW4gPSAwOwotCSAgICB9Ci0KLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9QQVJFTlMpID09IDApCi0JICAgIG5lZWRfY29tbWEgPSAxOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoIik7Ci0JICAgICAgbmVlZF9wYXJlbiA9IDE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdlIGhhdmUgZm91bmQgYW5kIHByaW50ZWQgYW4gaW5zdHJ1Y3Rpb247IHJldHVybi4gICovCi0gICAgICByZXR1cm4gNDsKLSAgICB9Ci0KLSAgLyogV2UgY291bGQgbm90IGZpbmQgYSBtYXRjaC4gICovCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmcgMHglbHgiLCBpbnNuKTsKLQotICByZXR1cm4gNDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvcHBjLW9wYy5jIGIvb3Bjb2Rlcy9wcGMtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MjE4ODAuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wcGMtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTI0ICswLDAgQEAKLS8qIHBwYy1vcGMuYyAtLSBQb3dlclBDIG9wY29kZSBsaXN0Ci0gICBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0yLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9wcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogVGhpcyBmaWxlIGhvbGRzIHRoZSBQb3dlclBDIG9wY29kZSB0YWJsZS4gIFRoZSBvcGNvZGUgdGFibGUKLSAgIGluY2x1ZGVzIGFsbW9zdCBhbGwgb2YgdGhlIGV4dGVuZGVkIGluc3RydWN0aW9uIG1uZW1vbmljcy4gIFRoaXMKLSAgIHBlcm1pdHMgdGhlIGRpc2Fzc2VtYmxlciB0byB1c2UgdGhlbSwgYW5kIHNpbXBsaWZpZXMgdGhlIGFzc2VtYmxlcgotICAgbG9naWMsIGF0IHRoZSBjb3N0IG9mIGluY3JlYXNpbmcgdGhlIHRhYmxlIHNpemUuICBUaGUgdGFibGUgaXMKLSAgIHN0cmljdGx5IGNvbnN0YW50IGRhdGEsIHNvIHRoZSBjb21waWxlciBzaG91bGQgYmUgYWJsZSB0byBwdXQgaXQgaW4KLSAgIHRoZSAudGV4dCBzZWN0aW9uLgotCi0gICBUaGlzIGZpbGUgYWxzbyBob2xkcyB0aGUgb3BlcmFuZCB0YWJsZS4gIEFsbCBrbm93bGVkZ2UgYWJvdXQKLSAgIGluc2VydGluZyBvcGVyYW5kcyBpbnRvIGluc3RydWN0aW9ucyBhbmQgdmljZS12ZXJzYSBpcyBrZXB0IGluIHRoaXMKLSAgIGZpbGUuICAqLwotDAotLyogTG9jYWwgaW5zZXJ0aW9uIGFuZCBleHRyYWN0aW9uIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9iYXQgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9iYXQgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9iYmEgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9iYmEgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9iZCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2JkIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfYmRtIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfYmRtIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfYmRwIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfYmRwIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgaW50IHZhbGlkX2JvIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9ibyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2JvIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfYm9lIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfYm9lIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfZHMgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9kcyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2xpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfbGkgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9tYmUgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9tYmUgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9tYjYgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9tYjYgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9uYiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X25iIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfbnNpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfbnNpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfcmFsIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9yYW0gUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3JhcyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfcmJzIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfcmJzIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfc2g2IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3Rfc2g2IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfc3ByIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3Rfc3ByIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfdGJyIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfdGJyIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUuCi0KLSAgIFRoZSBmaWVsZHMgYXJlIGJpdHMsIHNoaWZ0LCBpbnNlcnQsIGV4dHJhY3QsIGZsYWdzLgotCi0gICBXZSB1c2VkIHRvIHB1dCBwYXJlbnMgYXJvdW5kIHRoZSB2YXJpb3VzIGFkZGl0aW9ucywgbGlrZSB0aGUgb25lCi0gICBmb3IgQkEganVzdCBiZWxvdy4gIEhvd2V2ZXIsIHRoYXQgY2F1c2VkIHRyb3VibGUgd2l0aCBmZWVibGUKLSAgIGNvbXBpbGVycyB3aXRoIGEgbGltaXQgb24gZGVwdGggb2YgYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24sIGxpa2UKLSAgIChyZXBvcnRlZGx5KSB0aGUgY29tcGlsZXIgaW4gTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gNS4gIFNvIHdlCi0gICBvbWl0IHRoZSBwYXJlbnMsIHNpbmNlIHRoZSBtYWNyb3MgYXJlIG5ldmVyIHVzZWQgaW4gYSBjb250ZXh0IHdoZXJlCi0gICB0aGUgYWRkaXRpb24gd2lsbCBiZSBhbWJpZ3VvdXMuICAqLwotCi1jb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kIHBvd2VycGNfb3BlcmFuZHNbXSA9Ci17Ci0gIC8qIFRoZSB6ZXJvIGluZGV4IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZgotICAgICBvcGVyYW5kcy4gICovCi0jZGVmaW5lIFVOVVNFRCAwCi0gIHsgMCwgMCwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBCQSBmaWVsZCBpbiBhbiBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQkEgVU5VU0VEICsgMQotI2RlZmluZSBCQV9NQVNLICgweDFmIDw8IDE2KQotICB7IDUsIDE2LCAwLCAwLCBQUENfT1BFUkFORF9DUiB9LAotCi0gIC8qIFRoZSBCQSBmaWVsZCBpbiBhbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZQotICAgICBhcyB0aGUgQlQgZmllbGQgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBCQVQgQkEgKyAxCi0gIHsgNSwgMTYsIGluc2VydF9iYXQsIGV4dHJhY3RfYmF0LCBQUENfT1BFUkFORF9GQUtFIH0sCi0KLSAgLyogVGhlIEJCIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBCQiBCQVQgKyAxCi0jZGVmaW5lIEJCX01BU0sgKDB4MWYgPDwgMTEpCi0gIHsgNSwgMTEsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIH0sCi0KLSAgLyogVGhlIEJCIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lCi0gICAgIGFzIHRoZSBCQSBmaWVsZCBpbiB0aGUgc2FtZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEJCQSBCQiArIDEKLSAgeyA1LCAxMSwgaW5zZXJ0X2JiYSwgZXh0cmFjdF9iYmEsIFBQQ19PUEVSQU5EX0ZBS0UgfSwKLQotICAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgbG93ZXIgdHdvIGJpdHMgYXJlCi0gICAgIGZvcmNlZCB0byB6ZXJvLiAgKi8KLSNkZWZpbmUgQkQgQkJBICsgMQotICB7IDE2LCAwLCBpbnNlcnRfYmQsIGV4dHJhY3RfYmQsIFBQQ19PUEVSQU5EX1JFTEFUSVZFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gYWJzb2x1dGUgYWRkcmVzc2luZyBpcwotICAgICB1c2VkLiAgKi8KLSNkZWZpbmUgQkRBIEJEICsgMQotICB7IDE2LCAwLCBpbnNlcnRfYmQsIGV4dHJhY3RfYmQsIFBQQ19PUEVSQU5EX0FCU09MVVRFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlIC0gbW9kaWZpZXIgaXMgdXNlZC4KLSAgICAgVGhpcyBzZXRzIHRoZSB5IGJpdCBvZiB0aGUgQk8gZmllbGQgYXBwcm9wcmlhdGVseS4gICovCi0jZGVmaW5lIEJETSBCREEgKyAxCi0gIHsgMTYsIDAsIGluc2VydF9iZG0sIGV4dHJhY3RfYmRtLAotICAgICAgUFBDX09QRVJBTkRfUkVMQVRJVkUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgLSBtb2RpZmllciBpcyB1c2VkCi0gICAgIGFuZCBhYnNvbHV0ZSBhZGRyZXNzIGlzIHVzZWQuICAqLwotI2RlZmluZSBCRE1BIEJETSArIDEKLSAgeyAxNiwgMCwgaW5zZXJ0X2JkbSwgZXh0cmFjdF9iZG0sCi0gICAgICBQUENfT1BFUkFORF9BQlNPTFVURSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSArIG1vZGlmaWVyIGlzIHVzZWQuCi0gICAgIFRoaXMgc2V0cyB0aGUgeSBiaXQgb2YgdGhlIEJPIGZpZWxkIGFwcHJvcHJpYXRlbHkuICAqLwotI2RlZmluZSBCRFAgQkRNQSArIDEKLSAgeyAxNiwgMCwgaW5zZXJ0X2JkcCwgZXh0cmFjdF9iZHAsCi0gICAgICBQUENfT1BFUkFORF9SRUxBVElWRSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSArIG1vZGlmaWVyIGlzIHVzZWQKLSAgICAgYW5kIGFic29sdXRlIGFkZHJlc3NpbmcgaXMgdXNlZC4gICovCi0jZGVmaW5lIEJEUEEgQkRQICsgMQotICB7IDE2LCAwLCBpbnNlcnRfYmRwLCBleHRyYWN0X2JkcCwKLSAgICAgIFBQQ19PUEVSQU5EX0FCU09MVVRFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIEJGIGZpZWxkIGluIGFuIFggb3IgWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEJGIEJEUEEgKyAxCi0gIHsgMywgMjMsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIH0sCi0KLSAgLyogQW4gb3B0aW9uYWwgQkYgZmllbGQuICBUaGlzIGlzIHVzZWQgZm9yIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb25zLAotICAgICBpbiB3aGljaCBhbiBvbWl0dGVkIEJGIGZpZWxkIGlzIHRha2VuIGFzIHplcm8uICAqLwotI2RlZmluZSBPQkYgQkYgKyAxCi0gIHsgMywgMjMsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIHwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKLQotICAvKiBUaGUgQkZBIGZpZWxkIGluIGFuIFggb3IgWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEJGQSBPQkYgKyAxCi0gIHsgMywgMTgsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIH0sCi0KLSAgLyogVGhlIEJJIGZpZWxkIGluIGEgQiBmb3JtIG9yIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBCSSBCRkEgKyAxCi0jZGVmaW5lIEJJX01BU0sgKDB4MWYgPDwgMTYpCi0gIHsgNSwgMTYsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIH0sCi0KLSAgLyogVGhlIEJPIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uLiAgQ2VydGFpbiB2YWx1ZXMgYXJlCi0gICAgIGlsbGVnYWwuICAqLwotI2RlZmluZSBCTyBCSSArIDEKLSNkZWZpbmUgQk9fTUFTSyAoMHgxZiA8PCAyMSkKLSAgeyA1LCAyMSwgaW5zZXJ0X2JvLCBleHRyYWN0X2JvLCAwIH0sCi0KLSAgLyogVGhlIEJPIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlICsgb3IgLSBtb2RpZmllciBpcwotICAgICB1c2VkLiAgVGhpcyBpcyBsaWtlIHRoZSBCTyBmaWVsZCwgYnV0IGl0IG11c3QgYmUgZXZlbi4gICovCi0jZGVmaW5lIEJPRSBCTyArIDEKLSAgeyA1LCAyMSwgaW5zZXJ0X2JvZSwgZXh0cmFjdF9ib2UsIDAgfSwKLQotICAvKiBUaGUgQlQgZmllbGQgaW4gYW4gWCBvciBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQlQgQk9FICsgMQotICB7IDUsIDIxLCAwLCAwLCBQUENfT1BFUkFORF9DUiB9LAotCi0gIC8qIFRoZSBjb25kaXRpb24gcmVnaXN0ZXIgbnVtYmVyIHBvcnRpb24gb2YgdGhlIEJJIGZpZWxkIGluIGEgQiBmb3JtCi0gICAgIG9yIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHVzZWQgZm9yIHRoZSBleHRlbmRlZAotICAgICBjb25kaXRpb25hbCBicmFuY2ggbW5lbW9uaWNzLCB3aGljaCBzZXQgdGhlIGxvd2VyIHR3byBiaXRzIG9mIHRoZQotICAgICBCSSBmaWVsZC4gIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwuICAqLwotI2RlZmluZSBDUiBCVCArIDEKLSAgeyAzLCAxOCwgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAotCi0gIC8qIFRoZSBEIGZpZWxkIGluIGEgRCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBhIGRpc3BsYWNlbWVudCBvZmYKLSAgICAgYSByZWdpc3RlciwgYW5kIGltcGxpZXMgdGhhdCB0aGUgbmV4dCBvcGVyYW5kIGlzIGEgcmVnaXN0ZXIgaW4KLSAgICAgcGFyZW50aGVzZXMuICAqLwotI2RlZmluZSBEIENSICsgMQotICB7IDE2LCAwLCAwLCAwLCBQUENfT1BFUkFORF9QQVJFTlMgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgRFMgZmllbGQgaW4gYSBEUyBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBsaWtlIEQsIGJ1dCB0aGUKLSAgICAgbG93ZXIgdHdvIGJpdHMgYXJlIGZvcmNlZCB0byB6ZXJvLiAgKi8KLSNkZWZpbmUgRFMgRCArIDEKLSAgeyAxNiwgMCwgaW5zZXJ0X2RzLCBleHRyYWN0X2RzLCBQUENfT1BFUkFORF9QQVJFTlMgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgRSBmaWVsZCBpbiBhIHdydGVlaSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEUgRFMgKyAxCi0gIHsgMSwgMTUsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgRkwxIGZpZWxkIGluIGEgUE9XRVIgU0MgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEZMMSBFICsgMQotICB7IDQsIDEyLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIEZMMiBmaWVsZCBpbiBhIFBPV0VSIFNDIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBGTDIgRkwxICsgMQotICB7IDMsIDIsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgRkxNIGZpZWxkIGluIGFuIFhGTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRkxNIEZMMiArIDEKLSAgeyA4LCAxNywgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBGUkEgZmllbGQgaW4gYW4gWCBvciBBIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBGUkEgRkxNICsgMQotI2RlZmluZSBGUkFfTUFTSyAoMHgxZiA8PCAxNikKLSAgeyA1LCAxNiwgMCwgMCwgUFBDX09QRVJBTkRfRlBSIH0sCi0KLSAgLyogVGhlIEZSQiBmaWVsZCBpbiBhbiBYIG9yIEEgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEZSQiBGUkEgKyAxCi0jZGVmaW5lIEZSQl9NQVNLICgweDFmIDw8IDExKQotICB7IDUsIDExLCAwLCAwLCBQUENfT1BFUkFORF9GUFIgfSwKLQotICAvKiBUaGUgRlJDIGZpZWxkIGluIGFuIEEgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEZSQyBGUkIgKyAxCi0jZGVmaW5lIEZSQ19NQVNLICgweDFmIDw8IDYpCi0gIHsgNSwgNiwgMCwgMCwgUFBDX09QRVJBTkRfRlBSIH0sCi0KLSAgLyogVGhlIEZSUyBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gb3IgdGhlIEZSVCBmaWVsZCBpbiBhIEQsIFgKLSAgICAgb3IgQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRlJTIEZSQyArIDEKLSNkZWZpbmUgRlJUIEZSUwotICB7IDUsIDIxLCAwLCAwLCBQUENfT1BFUkFORF9GUFIgfSwKLQotICAvKiBUaGUgRlhNIGZpZWxkIGluIGFuIFhGWCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEZYTSBGUlMgKyAxCi0jZGVmaW5lIEZYTV9NQVNLICgweGZmIDw8IDEyKQotICB7IDgsIDEyLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIEwgZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEwgRlhNICsgMQotICB7IDEsIDIxLCAwLCAwLCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAotCi0gIC8qIFRoZSBMRVYgZmllbGQgaW4gYSBQT1dFUiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTEVWIEwgKyAxCi0gIHsgNywgNSwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBMSSBmaWVsZCBpbiBhbiBJIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgbG93ZXIgdHdvIGJpdHMgYXJlCi0gICAgIGZvcmNlZCB0byB6ZXJvLiAgKi8KLSNkZWZpbmUgTEkgTEVWICsgMQotICB7IDI2LCAwLCBpbnNlcnRfbGksIGV4dHJhY3RfbGksIFBQQ19PUEVSQU5EX1JFTEFUSVZFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIExJIGZpZWxkIGluIGFuIEkgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHVzZWQgYXMgYW4gYWJzb2x1dGUKLSAgICAgYWRkcmVzcy4gICovCi0jZGVmaW5lIExJQSBMSSArIDEKLSAgeyAyNiwgMCwgaW5zZXJ0X2xpLCBleHRyYWN0X2xpLCBQUENfT1BFUkFORF9BQlNPTFVURSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBNQiBmaWVsZCBpbiBhbiBNIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBNQiBMSUEgKyAxCi0jZGVmaW5lIE1CX01BU0sgKDB4MWYgPDwgNikKLSAgeyA1LCA2LCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIE1FIGZpZWxkIGluIGFuIE0gZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1FIE1CICsgMQotI2RlZmluZSBNRV9NQVNLICgweDFmIDw8IDEpCi0gIHsgNSwgMSwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBNQiBhbmQgTUUgZmllbGRzIGluIGFuIE0gZm9ybSBpbnN0cnVjdGlvbiBleHByZXNzZWQgYSBzaW5nbGUKLSAgICAgb3BlcmFuZCB3aGljaCBpcyBhIGJpdG1hc2sgaW5kaWNhdGluZyB3aGljaCBiaXRzIHRvIHNlbGVjdC4gIFRoaXMKLSAgICAgaXMgYSB0d28gb3BlcmFuZCBmb3JtIHVzaW5nIFBQQ19PUEVSQU5EX05FWFQuICBTZWUgdGhlCi0gICAgIGRlc2NyaXB0aW9uIGluIG9wY29kZS9wcGMuaCBmb3Igd2hhdCB0aGlzIG1lYW5zLiAgKi8KLSNkZWZpbmUgTUJFIE1FICsgMQotICB7IDUsIDYsIDAsIDAsIFBQQ19PUEVSQU5EX09QVElPTkFMIHwgUFBDX09QRVJBTkRfTkVYVCB9LAotICB7IDMyLCAwLCBpbnNlcnRfbWJlLCBleHRyYWN0X21iZSwgMCB9LAotCi0gIC8qIFRoZSBNQiBvciBNRSBmaWVsZCBpbiBhbiBNRCBvciBNRFMgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBoaWdoCi0gICAgIGJpdCBpcyB3cmFwcGVkIHRvIHRoZSBsb3cgZW5kLiAgKi8KLSNkZWZpbmUgTUI2IE1CRSArIDIKLSNkZWZpbmUgTUU2IE1CNgotI2RlZmluZSBNQjZfTUFTSyAoMHgzZiA8PCA1KQotICB7IDYsIDUsIGluc2VydF9tYjYsIGV4dHJhY3RfbWI2LCAwIH0sCi0KLSAgLyogVGhlIE5CIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSB2YWx1ZSAzMiBpcyBzdG9yZWQgYXMKLSAgICAgMC4gICovCi0jZGVmaW5lIE5CIE1CNiArIDEKLSAgeyA2LCAxMSwgaW5zZXJ0X25iLCBleHRyYWN0X25iLCAwIH0sCi0KLSAgLyogVGhlIE5TSSBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlCi0gICAgIFNJIGZpZWxkLCBvbmx5IG5lZ2F0ZWQuICAqLwotI2RlZmluZSBOU0kgTkIgKyAxCi0gIHsgMTYsIDAsIGluc2VydF9uc2ksIGV4dHJhY3RfbnNpLAotICAgICAgUFBDX09QRVJBTkRfTkVHQVRJVkUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgUkEgZmllbGQgaW4gYW4gRCwgRFMsIFgsIFhPLCBNLCBvciBNRFMgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJBIE5TSSArIDEKLSNkZWZpbmUgUkFfTUFTSyAoMHgxZiA8PCAxNikKLSAgeyA1LCAxNiwgMCwgMCwgUFBDX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogVGhlIFJBIGZpZWxkIGluIGEgRCBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgYW4gdXBkYXRpbmcKLSAgICAgbG9hZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgUkEgZmllbGQgbWF5IG5vdCBiZSB6ZXJvIGFuZCBtYXkgbm90Ci0gICAgIGVxdWFsIHRoZSBSVCBmaWVsZC4gICovCi0jZGVmaW5lIFJBTCBSQSArIDEKLSAgeyA1LCAxNiwgaW5zZXJ0X3JhbCwgMCwgUFBDX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogVGhlIFJBIGZpZWxkIGluIGFuIGxtdyBpbnN0cnVjdGlvbiwgd2hpY2ggaGFzIHNwZWNpYWwgdmFsdWUKLSAgICAgcmVzdHJpY3Rpb25zLiAgKi8KLSNkZWZpbmUgUkFNIFJBTCArIDEKLSAgeyA1LCAxNiwgaW5zZXJ0X3JhbSwgMCwgUFBDX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogVGhlIFJBIGZpZWxkIGluIGEgRCBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgYW4gdXBkYXRpbmcKLSAgICAgc3RvcmUgb3IgYW4gdXBkYXRpbmcgZmxvYXRpbmcgcG9pbnQgbG9hZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgUkEKLSAgICAgZmllbGQgbWF5IG5vdCBiZSB6ZXJvLiAgKi8KLSNkZWZpbmUgUkFTIFJBTSArIDEKLSAgeyA1LCAxNiwgaW5zZXJ0X3JhcywgMCwgUFBDX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogVGhlIFJCIGZpZWxkIGluIGFuIFgsIFhPLCBNLCBvciBNRFMgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJCIFJBUyArIDEKLSNkZWZpbmUgUkJfTUFTSyAoMHgxZiA8PCAxMSkKLSAgeyA1LCAxMSwgMCwgMCwgUFBDX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogVGhlIFJCIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbiB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMKLSAgICAgdGhlIFJTIGZpZWxkIGluIHRoZSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgdXNlZCBmb3IgZXh0ZW5kZWQKLSAgICAgbW5lbW9uaWNzIGxpa2UgbXIuICAqLwotI2RlZmluZSBSQlMgUkIgKyAxCi0gIHsgNSwgMSwgaW5zZXJ0X3JicywgZXh0cmFjdF9yYnMsIFBQQ19PUEVSQU5EX0ZBS0UgfSwKLQotICAvKiBUaGUgUlMgZmllbGQgaW4gYSBELCBEUywgWCwgWEZYLCBYUywgTSwgTUQgb3IgTURTIGZvcm0KLSAgICAgaW5zdHJ1Y3Rpb24gb3IgdGhlIFJUIGZpZWxkIGluIGEgRCwgRFMsIFgsIFhGWCBvciBYTyBmb3JtCi0gICAgIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUlMgUkJTICsgMQotI2RlZmluZSBSVCBSUwotI2RlZmluZSBSVF9NQVNLICgweDFmIDw8IDIxKQotICB7IDUsIDIxLCAwLCAwLCBQUENfT1BFUkFORF9HUFIgfSwKLQotICAvKiBUaGUgU0ggZmllbGQgaW4gYW4gWCBvciBNIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTSCBSUyArIDEKLSNkZWZpbmUgU0hfTUFTSyAoMHgxZiA8PCAxMSkKLSAgeyA1LCAxMSwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBTSCBmaWVsZCBpbiBhbiBNRCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBzcGxpdC4gICovCi0jZGVmaW5lIFNINiBTSCArIDEKLSNkZWZpbmUgU0g2X01BU0sgKCgweDFmIDw8IDExKSB8ICgxIDw8IDEpKQotICB7IDYsIDEsIGluc2VydF9zaDYsIGV4dHJhY3Rfc2g2LCAwIH0sCi0KLSAgLyogVGhlIFNJIGZpZWxkIGluIGEgRCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0kgU0g2ICsgMQotICB7IDE2LCAwLCAwLCAwLCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgU0kgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB3ZSBhY2NlcHQgYSB3aWRlIHJhbmdlCi0gICAgIG9mIHBvc2l0aXZlIHZhbHVlcy4gICovCi0jZGVmaW5lIFNJU0lHTk9QVCBTSSArIDEKLSAgeyAxNiwgMCwgMCwgMCwgUFBDX09QRVJBTkRfU0lHTkVEIHwgUFBDX09QRVJBTkRfU0lHTk9QVCB9LAotCi0gIC8qIFRoZSBTUFIgZmllbGQgaW4gYW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGZsaXBwZWQtLXRoZQotICAgICBsb3dlciA1IGJpdHMgYXJlIHN0b3JlZCBpbiB0aGUgdXBwZXIgNSBhbmQgdmljZS0gdmVyc2EuICAqLwotI2RlZmluZSBTUFIgU0lTSUdOT1BUICsgMQotI2RlZmluZSBTUFJfTUFTSyAoMHgzZmYgPDwgMTEpCi0gIHsgMTAsIDExLCBpbnNlcnRfc3ByLCBleHRyYWN0X3NwciwgMCB9LAotCi0gIC8qIFRoZSBCQVQgaW5kZXggbnVtYmVyIGluIGFuIFhGWCBmb3JtIG1bZnRdaWJhdFtsdV0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTUFJCQVQgU1BSICsgMQotI2RlZmluZSBTUFJCQVRfTUFTSyAoMHgzIDw8IDE3KQotICB7IDIsIDE3LCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIFNQUkcgcmVnaXN0ZXIgbnVtYmVyIGluIGFuIFhGWCBmb3JtIG1bZnRdc3ByZyBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNQUkcgU1BSQkFUICsgMQotI2RlZmluZSBTUFJHX01BU0sgKDB4MyA8PCAxNikKLSAgeyAyLCAxNiwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBTUiBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTUiBTUFJHICsgMQotICB7IDQsIDE2LCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIFNWIGZpZWxkIGluIGEgUE9XRVIgU0MgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNWIFNSICsgMQotICB7IDE0LCAyLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIFRCUiBmaWVsZCBpbiBhbiBYRlggZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgbGlrZSB0aGUgU1BSCi0gICAgIGZpZWxkLCBidXQgaXQgaXMgb3B0aW9uYWwuICAqLwotI2RlZmluZSBUQlIgU1YgKyAxCi0gIHsgMTAsIDExLCBpbnNlcnRfdGJyLCBleHRyYWN0X3RiciwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKLQotICAvKiBUaGUgVE8gZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFRPIFRCUiArIDEKLSNkZWZpbmUgVE9fTUFTSyAoMHgxZiA8PCAyMSkKLSAgeyA1LCAyMSwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBVIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFUgVE8gKyAxCi0gIHsgNCwgMTIsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgVUkgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBVSSBVICsgMQotICB7IDE2LCAwLCAwLCAwLCAwIH0sCi19OwotCi0vKiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gaW5zZXJ0IGFuZCBleHRyYWN0IGNvbXBsaWNhdGVkIG9wZXJhbmRzLiAgKi8KLQotLyogVGhlIEJBIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lIGFzCi0gICB0aGUgQlQgZmllbGQgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICBUaGlzIG9wZXJhbmQgaXMgbWFya2VkIEZBS0UuCi0gICBUaGUgaW5zZXJ0aW9uIGZ1bmN0aW9uIGp1c3QgY29waWVzIHRoZSBCVCBmaWVsZCBpbnRvIHRoZSBCQSBmaWVsZCwKLSAgIGFuZCB0aGUgZXh0cmFjdGlvbiBmdW5jdGlvbiBqdXN0IGNoZWNrcyB0aGF0IHRoZSBmaWVsZHMgYXJlIHRoZQotICAgc2FtZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9iYXQgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAoKChpbnNuID4+IDIxKSAmIDB4MWYpIDw8IDE2KTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfYmF0IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gPj4gMjEpICYgMHgxZikgIT0gKChpbnNuID4+IDE2KSAmIDB4MWYpKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoZSBCQiBmaWVsZCBpbiBhbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcwotICAgdGhlIEJBIGZpZWxkIGluIHRoZSBzYW1lIGluc3RydWN0aW9uLiAgVGhpcyBvcGVyYW5kIGlzIG1hcmtlZCBGQUtFLgotICAgVGhlIGluc2VydGlvbiBmdW5jdGlvbiBqdXN0IGNvcGllcyB0aGUgQkEgZmllbGQgaW50byB0aGUgQkIgZmllbGQsCi0gICBhbmQgdGhlIGV4dHJhY3Rpb24gZnVuY3Rpb24ganVzdCBjaGVja3MgdGhhdCB0aGUgZmllbGRzIGFyZSB0aGUKLSAgIHNhbWUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfYmJhIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKCgoaW5zbiA+PiAxNikgJiAweDFmKSA8PCAxMSk7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X2JiYSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgKChpbnNuID4+IDE2KSAmIDB4MWYpICE9ICgoaW5zbiA+PiAxMSkgJiAweDFmKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgbG93ZXIgdHdvIGJpdHMgYXJlCi0gICBmb3JjZWQgdG8gemVyby4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9iZCAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICByZXR1cm4gaW5zbiB8ICh2YWx1ZSAmIDB4ZmZmYyk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGxvbmcKLWV4dHJhY3RfYmQgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoKGluc24gJiAweDgwMDApICE9IDApCi0gICAgcmV0dXJuIChpbnNuICYgMHhmZmZjKSAtIDB4MTAwMDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gaW5zbiAmIDB4ZmZmYzsKLX0KLQotLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlIC0gbW9kaWZpZXIgaXMgdXNlZC4KLSAgIFRoaXMgbW9kaWZpZXIgbWVhbnMgdGhhdCB0aGUgYnJhbmNoIGlzIG5vdCBleHBlY3RlZCB0byBiZSB0YWtlbi4KLSAgIFdlIG11c3Qgc2V0IHRoZSB5IGJpdCBvZiB0aGUgQk8gZmllbGQgdG8gMSBpZiB0aGUgb2Zmc2V0IGlzCi0gICBuZWdhdGl2ZS4gIFdoZW4gZXh0cmFjdGluZywgd2UgcmVxdWlyZSB0aGF0IHRoZSB5IGJpdCBiZSAxIGFuZCB0aGF0Ci0gICB0aGUgb2Zmc2V0IGJlIHBvc2l0aXZlLCBzaW5jZSBpZiB0aGUgeSBiaXQgaXMgMCB3ZSBqdXN0IHdhbnQgdG8KLSAgIHByaW50IHRoZSBub3JtYWwgZm9ybSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfYmRtIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmICgodmFsdWUgJiAweDgwMDApICE9IDApCi0gICAgaW5zbiB8PSAxIDw8IDIxOwotICByZXR1cm4gaW5zbiB8ICh2YWx1ZSAmIDB4ZmZmYyk7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X2JkbSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgKChpbnNuICYgKDEgPDwgMjEpKSA9PSAwCi0JICB8fCAoaW5zbiAmICgxIDw8IDE1KSkgPT0gMCkpCi0gICAgKmludmFsaWQgPSAxOwotICBpZiAoKGluc24gJiAweDgwMDApICE9IDApCi0gICAgcmV0dXJuIChpbnNuICYgMHhmZmZjKSAtIDB4MTAwMDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gaW5zbiAmIDB4ZmZmYzsKLX0KLQotLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlICsgbW9kaWZpZXIgaXMgdXNlZC4KLSAgIFRoaXMgaXMgbGlrZSBCRE0sIGFib3ZlLCBleGNlcHQgdGhhdCB0aGUgYnJhbmNoIGlzIGV4cGVjdGVkIHRvIGJlCi0gICB0YWtlbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9iZHAgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKCh2YWx1ZSAmIDB4ODAwMCkgPT0gMCkKLSAgICBpbnNuIHw9IDEgPDwgMjE7Ci0gIHJldHVybiBpbnNuIHwgKHZhbHVlICYgMHhmZmZjKTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfYmRwIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gJiAoMSA8PCAyMSkpID09IDAKLQkgIHx8IChpbnNuICYgKDEgPDwgMTUpKSAhPSAwKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZXR1cm4gKGluc24gJiAweGZmZmMpIC0gMHgxMDAwMDsKLSAgZWxzZQotICAgIHJldHVybiBpbnNuICYgMHhmZmZjOwotfQotCi0vKiBDaGVjayBmb3IgbGVnYWwgdmFsdWVzIG9mIGEgQk8gZmllbGQuICAqLwotCi1zdGF0aWMgaW50Ci12YWxpZF9ibyAodmFsdWUpCi0gICAgIGxvbmcgdmFsdWU7Ci17Ci0gIC8qIENlcnRhaW4gZW5jb2RpbmdzIGhhdmUgYml0cyB0aGF0IGFyZSByZXF1aXJlZCB0byBiZSB6ZXJvLiAgVGhlc2UKLSAgICAgYXJlICh6IG11c3QgYmUgemVybywgeSBtYXkgYmUgYW55dGhpbmcpOgotICAgICAgICAgMDAxenkKLQkgMDExenkKLQkgMXowMHkKLQkgMXowMXkKLQkgMXoxenoKLSAgICAgKi8KLSAgc3dpdGNoICh2YWx1ZSAmIDB4MTQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSAweDQ6Ci0gICAgICByZXR1cm4gKHZhbHVlICYgMHgyKSA9PSAwOwotICAgIGNhc2UgMHgxMDoKLSAgICAgIHJldHVybiAodmFsdWUgJiAweDgpID09IDA7Ci0gICAgY2FzZSAweDE0OgotICAgICAgcmV0dXJuIHZhbHVlID09IDB4MTQ7Ci0gICAgfQotfQotCi0vKiBUaGUgQk8gZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24uICBXYXJuIGFib3V0IGF0dGVtcHRzIHRvIHNldAotICAgdGhlIGZpZWxkIHRvIGFuIGlsbGVnYWwgdmFsdWUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2JvIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopIE5VTEwKLSAgICAgICYmICEgdmFsaWRfYm8gKHZhbHVlKSkKLSAgICAqZXJybXNnID0gXygiaW52YWxpZCBjb25kaXRpb25hbCBvcHRpb24iKTsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMjEpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9ibyAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGxvbmcgdmFsdWU7Ci0KLSAgdmFsdWUgPSAoaW5zbiA+PiAyMSkgJiAweDFmOwotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKLSAgICAgICYmICEgdmFsaWRfYm8gKHZhbHVlKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyogVGhlIEJPIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlICsgb3IgLSBtb2RpZmllciBpcwotICAgdXNlZC4gIFRoaXMgaXMgbGlrZSB0aGUgQk8gZmllbGQsIGJ1dCBpdCBtdXN0IGJlIGV2ZW4uICBXaGVuCi0gICBleHRyYWN0aW5nIGl0LCB3ZSBmb3JjZSBpdCB0byBiZSBldmVuLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9ib2UgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISB2YWxpZF9ibyAodmFsdWUpKQotCSplcnJtc2cgPSBfKCJpbnZhbGlkIGNvbmRpdGlvbmFsIG9wdGlvbiIpOwotICAgICAgZWxzZSBpZiAoKHZhbHVlICYgMSkgIT0gMCkKLQkqZXJybXNnID0gXygiYXR0ZW1wdCB0byBzZXQgeSBiaXQgd2hlbiB1c2luZyArIG9yIC0gbW9kaWZpZXIiKTsKLSAgICB9Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDIxKTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfYm9lIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgbG9uZyB2YWx1ZTsKLQotICB2YWx1ZSA9IChpbnNuID4+IDIxKSAmIDB4MWY7Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgISB2YWxpZF9ibyAodmFsdWUpKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIHZhbHVlICYgMHgxZTsKLX0KLQotLyogVGhlIERTIGZpZWxkIGluIGEgRFMgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgbGlrZSBELCBidXQgdGhlCi0gICBsb3dlciB0d28gYml0cyBhcmUgZm9yY2VkIHRvIHplcm8uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfZHMgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAodmFsdWUgJiAweGZmZmMpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBsb25nCi1leHRyYWN0X2RzIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKChpbnNuICYgMHg4MDAwKSAhPSAwKQotICAgIHJldHVybiAoaW5zbiAmIDB4ZmZmYykgLSAweDEwMDAwOwotICBlbHNlCi0gICAgcmV0dXJuIGluc24gJiAweGZmZmM7Ci19Ci0KLS8qIFRoZSBMSSBmaWVsZCBpbiBhbiBJIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgbG93ZXIgdHdvIGJpdHMgYXJlCi0gICBmb3JjZWQgdG8gemVyby4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9saSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoKHZhbHVlICYgMykgIT0gMCAmJiBlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopIE5VTEwpCi0gICAgKmVycm1zZyA9IF8oImlnbm9yaW5nIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgaW4gYnJhbmNoIG9mZnNldCIpOwotICByZXR1cm4gaW5zbiB8ICh2YWx1ZSAmIDB4M2ZmZmZmYyk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGxvbmcKLWV4dHJhY3RfbGkgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoKGluc24gJiAweDIwMDAwMDApICE9IDApCi0gICAgcmV0dXJuIChpbnNuICYgMHgzZmZmZmZjKSAtIDB4NDAwMDAwMDsKLSAgZWxzZQotICAgIHJldHVybiBpbnNuICYgMHgzZmZmZmZjOwotfQotCi0vKiBUaGUgTUIgYW5kIE1FIGZpZWxkcyBpbiBhbiBNIGZvcm0gaW5zdHJ1Y3Rpb24gZXhwcmVzc2VkIGFzIGEgc2luZ2xlCi0gICBvcGVyYW5kIHdoaWNoIGlzIGl0c2VsZiBhIGJpdG1hc2suICBUaGUgZXh0cmFjdGlvbiBmdW5jdGlvbiBhbHdheXMKLSAgIG1hcmtzIGl0IGFzIGludmFsaWQsIHNpbmNlIHdlIG5ldmVyIHdhbnQgdG8gcmVjb2duaXplIGFuCi0gICBpbnN0cnVjdGlvbiB3aGljaCB1c2VzIGEgZmllbGQgb2YgdGhpcyB0eXBlLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9tYmUgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgdW5zaWduZWQgbG9uZyB1dmFsLCBtYXNrOwotICBpbnQgbWIsIG1lLCBteCwgY291bnQsIGxhc3Q7Ci0KLSAgdXZhbCA9IHZhbHVlOwotCi0gIGlmICh1dmFsID09IDApCi0gICAgewotICAgICAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKikgTlVMTCkKLQkqZXJybXNnID0gXygiaWxsZWdhbCBiaXRtYXNrIik7Ci0gICAgICByZXR1cm4gaW5zbjsKLSAgICB9Ci0KLSAgbWIgPSAwOwotICBtZSA9IDMyOwotICBpZiAoKHV2YWwgJiAxKSAhPSAwKQotICAgIGxhc3QgPSAxOwotICBlbHNlCi0gICAgbGFzdCA9IDA7Ci0gIGNvdW50ID0gMDsKLQotICAvKiBtYjogbG9jYXRpb24gb2YgbGFzdCAwLT4xIHRyYW5zaXRpb24gKi8KLSAgLyogbWU6IGxvY2F0aW9uIG9mIGxhc3QgMS0+MCB0cmFuc2l0aW9uICovCi0gIC8qIGNvdW50OiAjIHRyYW5zaXRpb25zICovCi0KLSAgZm9yIChteCA9IDAsIG1hc2sgPSAxIDw8IDMxOyBteCA8IDMyOyArK214LCBtYXNrID4+PSAxKQotICAgIHsKLSAgICAgIGlmICgodXZhbCAmIG1hc2spICYmICFsYXN0KQotCXsKLQkgICsrY291bnQ7Ci0JICBtYiA9IG14OwotCSAgbGFzdCA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoISh1dmFsICYgbWFzaykgJiYgbGFzdCkKLQl7Ci0JICArK2NvdW50OwotCSAgbWUgPSBteDsKLQkgIGxhc3QgPSAwOwotCX0KLSAgICB9Ci0gIGlmIChtZSA9PSAwKQotICAgIG1lID0gMzI7Ci0KLSAgaWYgKGNvdW50ICE9IDIgJiYgKGNvdW50ICE9IDAgfHwgISBsYXN0KSkKLSAgICB7Ci0gICAgICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICoqKSBOVUxMKQotCSplcnJtc2cgPSBfKCJpbGxlZ2FsIGJpdG1hc2siKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGluc24gfCAobWIgPDwgNikgfCAoKG1lIC0gMSkgPDwgMSk7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X21iZSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGxvbmcgcmV0OwotICBpbnQgbWIsIG1lOwotICBpbnQgaTsKLQotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwpCi0gICAgKmludmFsaWQgPSAxOwotCi0gIG1iID0gKGluc24gPj4gNikgJiAweDFmOwotICBtZSA9IChpbnNuID4+IDEpICYgMHgxZjsKLSAgaWYgKG1iIDwgbWUgKyAxKQotICAgIHsKLSAgICAgIHJldCA9IDA7Ci0gICAgICBmb3IgKGkgPSBtYjsgaSA8PSBtZTsgaSsrKQotCXJldCB8PSAobG9uZykgMSA8PCAoMzEgLSBpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG1iID09IG1lICsgMSkKLSAgICByZXQgPSB+MDsKLSAgZWxzZSAvKiAobWIgPiBtZSArIDEpICovCi0gICAgewotICAgICAgcmV0ID0gfiAobG9uZykgMDsKLSAgICAgIGZvciAoaSA9IG1lICsgMTsgaSA8IG1iOyBpKyspCi0JcmV0ICY9IH4gKChsb25nKSAxIDw8ICgzMSAtIGkpKTsKLSAgICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoZSBNQiBvciBNRSBmaWVsZCBpbiBhbiBNRCBvciBNRFMgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBoaWdoIGJpdAotICAgaXMgd3JhcHBlZCB0byB0aGUgbG93IGVuZC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9tYjYgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgNikgfCAodmFsdWUgJiAweDIwKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9tYjYgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICByZXR1cm4gKChpbnNuID4+IDYpICYgMHgxZikgfCAoaW5zbiAmIDB4MjApOwotfQotCi0vKiBUaGUgTkIgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uLiAgVGhlIHZhbHVlIDMyIGlzIHN0b3JlZCBhcwotICAgMC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfbmIgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDMyKQotICAgICplcnJtc2cgPSBfKCJ2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLSAgaWYgKHZhbHVlID09IDMyKQotICAgIHZhbHVlID0gMDsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTEpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBsb25nCi1leHRyYWN0X25iIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgbG9uZyByZXQ7Ci0KLSAgcmV0ID0gKGluc24gPj4gMTEpICYgMHgxZjsKLSAgaWYgKHJldCA9PSAwKQotICAgIHJldCA9IDMyOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGUgTlNJIGZpZWxkIGluIGEgRCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgU0kKLSAgIGZpZWxkLCBvbmx5IG5lZ2F0ZWQuICBUaGUgZXh0cmFjdGlvbiBmdW5jdGlvbiBhbHdheXMgbWFya3MgaXQgYXMKLSAgIGludmFsaWQsIHNpbmNlIHdlIG5ldmVyIHdhbnQgdG8gcmVjb2duaXplIGFuIGluc3RydWN0aW9uIHdoaWNoIHVzZXMKLSAgIGEgZmllbGQgb2YgdGhpcyB0eXBlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X25zaSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICByZXR1cm4gaW5zbiB8ICgoLSB2YWx1ZSkgJiAweGZmZmYpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9uc2kgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwpCi0gICAgKmludmFsaWQgPSAxOwotICBpZiAoKGluc24gJiAweDgwMDApICE9IDApCi0gICAgcmV0dXJuIC0gKChsb25nKShpbnNuICYgMHhmZmZmKSAtIDB4MTAwMDApOwotICBlbHNlCi0gICAgcmV0dXJuIC0gKGxvbmcpKGluc24gJiAweGZmZmYpOwotfQotCi0vKiBUaGUgUkEgZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBpcyBhbiB1cGRhdGluZwotICAgbG9hZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgUkEgZmllbGQgbWF5IG5vdCBiZSB6ZXJvIGFuZCBtYXkgbm90Ci0gICBlcXVhbCB0aGUgUlQgZmllbGQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3JhbCAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAodmFsdWUgPT0gMAotICAgICAgfHwgKHVuc2lnbmVkIGxvbmcpIHZhbHVlID09ICgoaW5zbiA+PiAyMSkgJiAweDFmKSkKLSAgICAqZXJybXNnID0gImludmFsaWQgcmVnaXN0ZXIgb3BlcmFuZCB3aGVuIHVwZGF0aW5nIjsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTYpOwotfQotCi0vKiBUaGUgUkEgZmllbGQgaW4gYW4gbG13IGluc3RydWN0aW9uLCB3aGljaCBoYXMgc3BlY2lhbCB2YWx1ZQotICAgcmVzdHJpY3Rpb25zLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9yYW0gKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKCh1bnNpZ25lZCBsb25nKSB2YWx1ZSA+PSAoKGluc24gPj4gMjEpICYgMHgxZikpCi0gICAgKmVycm1zZyA9IF8oImluZGV4IHJlZ2lzdGVyIGluIGxvYWQgcmFuZ2UiKTsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTYpOwotfQotCi0vKiBUaGUgUkEgZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBpcyBhbiB1cGRhdGluZwotICAgc3RvcmUgb3IgYW4gdXBkYXRpbmcgZmxvYXRpbmcgcG9pbnQgbG9hZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgUkEKLSAgIGZpZWxkIG1heSBub3QgYmUgemVyby4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfcmFzIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA9PSAwKQotICAgICplcnJtc2cgPSBfKCJpbnZhbGlkIHJlZ2lzdGVyIG9wZXJhbmQgd2hlbiB1cGRhdGluZyIpOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxNik7Ci19Ci0KLS8qIFRoZSBSQiBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lIGFzCi0gICB0aGUgUlMgZmllbGQgaW4gdGhlIGluc3RydWN0aW9uLiAgVGhpcyBpcyB1c2VkIGZvciBleHRlbmRlZAotICAgbW5lbW9uaWNzIGxpa2UgbXIuICBUaGlzIG9wZXJhbmQgaXMgbWFya2VkIEZBS0UuICBUaGUgaW5zZXJ0aW9uCi0gICBmdW5jdGlvbiBqdXN0IGNvcGllcyB0aGUgQlQgZmllbGQgaW50byB0aGUgQkEgZmllbGQsIGFuZCB0aGUKLSAgIGV4dHJhY3Rpb24gZnVuY3Rpb24ganVzdCBjaGVja3MgdGhhdCB0aGUgZmllbGRzIGFyZSB0aGUgc2FtZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9yYnMgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAoKChpbnNuID4+IDIxKSAmIDB4MWYpIDw8IDExKTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfcmJzIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gPj4gMjEpICYgMHgxZikgIT0gKChpbnNuID4+IDExKSAmIDB4MWYpKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoZSBTSCBmaWVsZCBpbiBhbiBNRCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBzcGxpdC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9zaDYgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTEpIHwgKCh2YWx1ZSAmIDB4MjApID4+IDQpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBsb25nCi1leHRyYWN0X3NoNiAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIHJldHVybiAoKGluc24gPj4gMTEpICYgMHgxZikgfCAoKGluc24gPDwgNCkgJiAweDIwKTsKLX0KLQotLyogVGhlIFNQUiBmaWVsZCBpbiBhbiBYRlggZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgZmxpcHBlZC0tdGhlCi0gICBsb3dlciA1IGJpdHMgYXJlIHN0b3JlZCBpbiB0aGUgdXBwZXIgNSBhbmQgdmljZS0gdmVyc2EuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3NwciAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxNikgfCAoKHZhbHVlICYgMHgzZTApIDw8IDYpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9zcHIgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICByZXR1cm4gKChpbnNuID4+IDE2KSAmIDB4MWYpIHwgKChpbnNuID4+IDYpICYgMHgzZTApOwotfQotCi0vKiBUaGUgVEJSIGZpZWxkIGluIGFuIFhGWCBpbnN0cnVjdGlvbi4gIFRoaXMgaXMganVzdCBsaWtlIFNQUiwgYnV0IGl0Ci0gICBpcyBvcHRpb25hbC4gIFdoZW4gVEJSIGlzIG9taXR0ZWQsIGl0IG11c3QgYmUgaW5zZXJ0ZWQgYXMgMjY4ICh0aGUKLSAgIG1hZ2ljIG51bWJlciBvZiB0aGUgVEIgcmVnaXN0ZXIpLiAgVGhlc2UgZnVuY3Rpb25zIHRyZWF0IDAKLSAgIChpbmRpY2F0aW5nIGFuIG9taXR0ZWQgb3B0aW9uYWwgb3BlcmFuZCkgYXMgMjY4LiAgVGhpcyBtZWFucyB0aGF0Ci0gICBgYG1mdGIgNCwwJycgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LiAgVGhpcyBkb2VzIG5vdCBtYXR0ZXIgdmVyeQotICAgbXVjaCwgc2luY2UgdGhlIGFyY2hpdGVjdHVyZSBtYW51YWwgZG9lcyBub3QgZGVmaW5lIG1mdGIgYXMKLSAgIGFjY2VwdGluZyBhbnkgdmFsdWVzIG90aGVyIHRoYW4gMjY4IG9yIDI2OS4gICovCi0KLSNkZWZpbmUgVEIgKDI2OCkKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF90YnIgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID09IDApCi0gICAgdmFsdWUgPSBUQjsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTYpIHwgKCh2YWx1ZSAmIDB4M2UwKSA8PCA2KTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfdGJyIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgbG9uZyByZXQ7Ci0KLSAgcmV0ID0gKChpbnNuID4+IDE2KSAmIDB4MWYpIHwgKChpbnNuID4+IDYpICYgMHgzZTApOwotICBpZiAocmV0ID09IFRCKQotICAgIHJldCA9IDA7Ci0gIHJldHVybiByZXQ7Ci19Ci0MCi0vKiBNYWNyb3MgdXNlZCB0byBmb3JtIG9wY29kZXMuICAqLwotCi0vKiBUaGUgbWFpbiBvcGNvZGUuICAqLwotI2RlZmluZSBPUCh4KSAoKCgodW5zaWduZWQgbG9uZykoeCkpICYgMHgzZikgPDwgMjYpCi0jZGVmaW5lIE9QX01BU0sgT1AgKDB4M2YpCi0KLS8qIFRoZSBtYWluIG9wY29kZSBjb21iaW5lZCB3aXRoIGEgdHJhcCBjb2RlIGluIHRoZSBUTyBmaWVsZCBvZiBhIEQKLSAgIGZvcm0gaW5zdHJ1Y3Rpb24uICBVc2VkIGZvciBleHRlbmRlZCBtbmVtb25pY3MgZm9yIHRoZSB0cmFwCi0gICBpbnN0cnVjdGlvbnMuICAqLwotI2RlZmluZSBPUFRPKHgsdG8pIChPUCAoeCkgfCAoKCgodW5zaWduZWQgbG9uZykodG8pKSAmIDB4MWYpIDw8IDIxKSkKLSNkZWZpbmUgT1BUT19NQVNLIChPUF9NQVNLIHwgVE9fTUFTSykKLQotLyogVGhlIG1haW4gb3Bjb2RlIGNvbWJpbmVkIHdpdGggYSBjb21wYXJpc29uIHNpemUgYml0IGluIHRoZSBMIGZpZWxkCi0gICBvZiBhIEQgZm9ybSBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24uICBVc2VkIGZvciBleHRlbmRlZCBtbmVtb25pY3MgZm9yCi0gICB0aGUgY29tcGFyaXNvbiBpbnN0cnVjdGlvbnMuICAqLwotI2RlZmluZSBPUEwoeCxsKSAoT1AgKHgpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGwpKSAmIDEpIDw8IDIxKSkKLSNkZWZpbmUgT1BMX01BU0sgT1BMICgweDNmLDEpCi0KLS8qIEFuIEEgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEEob3AsIHhvcCwgcmMpIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgxZikgPDwgMSkgfCAoKCh1bnNpZ25lZCBsb25nKShyYykpICYgMSkpCi0jZGVmaW5lIEFfTUFTSyBBICgweDNmLCAweDFmLCAxKQotCi0vKiBBbiBBX01BU0sgd2l0aCB0aGUgRlJCIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgQUZSQl9NQVNLIChBX01BU0sgfCBGUkJfTUFTSykKLQotLyogQW4gQV9NQVNLIHdpdGggdGhlIEZSQyBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIEFGUkNfTUFTSyAoQV9NQVNLIHwgRlJDX01BU0spCi0KLS8qIEFuIEFfTUFTSyB3aXRoIHRoZSBGUkEgYW5kIEZSQyBmaWVsZHMgZml4ZWQuICAqLwotI2RlZmluZSBBRlJBRlJDX01BU0sgKEFfTUFTSyB8IEZSQV9NQVNLIHwgRlJDX01BU0spCi0KLS8qIEEgQiBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQihvcCwgYWEsIGxrKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKShhYSkpICYgMSkgPDwgMSkgfCAoKGxrKSAmIDEpKQotI2RlZmluZSBCX01BU0sgQiAoMHgzZiwgMSwgMSkKLQotLyogQSBCIGZvcm0gaW5zdHJ1Y3Rpb24gc2V0dGluZyB0aGUgQk8gZmllbGQuICAqLwotI2RlZmluZSBCQk8ob3AsIGJvLCBhYSwgbGspIChCICgob3ApLCAoYWEpLCAobGspKSB8ICgoKCh1bnNpZ25lZCBsb25nKShibykpICYgMHgxZikgPDwgMjEpKQotI2RlZmluZSBCQk9fTUFTSyBCQk8gKDB4M2YsIDB4MWYsIDEsIDEpCi0KLS8qIEEgQkJPX01BU0sgd2l0aCB0aGUgeSBiaXQgb2YgdGhlIEJPIGZpZWxkIHJlbW92ZWQuICBUaGlzIHBlcm1pdHMKLSAgIG1hdGNoaW5nIGEgY29uZGl0aW9uYWwgYnJhbmNoIHJlZ2FyZGxlc3Mgb2YgdGhlIHNldHRpbmcgb2YgdGhlIHkKLSAgIGJpdC4gICovCi0jZGVmaW5lIFlfTUFTSyAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDIxKQotI2RlZmluZSBCQk9ZX01BU0sgKEJCT19NQVNLICZ+IFlfTUFTSykKLQotLyogQSBCIGZvcm0gaW5zdHJ1Y3Rpb24gc2V0dGluZyB0aGUgQk8gZmllbGQgYW5kIHRoZSBjb25kaXRpb24gYml0cyBvZgotICAgdGhlIEJJIGZpZWxkLiAgKi8KLSNkZWZpbmUgQkJPQ0Iob3AsIGJvLCBjYiwgYWEsIGxrKSBcCi0gIChCQk8gKChvcCksIChibyksIChhYSksIChsaykpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGNiKSkgJiAweDMpIDw8IDE2KSkKLSNkZWZpbmUgQkJPQ0JfTUFTSyBCQk9DQiAoMHgzZiwgMHgxZiwgMHgzLCAxLCAxKQotCi0vKiBBIEJCT0NCX01BU0sgd2l0aCB0aGUgeSBiaXQgb2YgdGhlIEJPIGZpZWxkIHJlbW92ZWQuICAqLwotI2RlZmluZSBCQk9ZQ0JfTUFTSyAoQkJPQ0JfTUFTSyAmfiBZX01BU0spCi0KLS8qIEEgQkJPWUNCX01BU0sgaW4gd2hpY2ggdGhlIEJJIGZpZWxkIGlzIGZpeGVkLiAgKi8KLSNkZWZpbmUgQkJPWUJJX01BU0sgKEJCT1lDQl9NQVNLIHwgQklfTUFTSykKLQotLyogVGhlIG1haW4gb3Bjb2RlIG1hc2sgd2l0aCB0aGUgUkEgZmllbGQgY2xlYXIuICAqLwotI2RlZmluZSBEUkFfTUFTSyAoT1BfTUFTSyB8IFJBX01BU0spCi0KLS8qIEEgRFMgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIERTTyhvcCwgeG9wKSAoT1AgKG9wKSB8ICgoeG9wKSAmIDB4MykpCi0jZGVmaW5lIERTX01BU0sgRFNPICgweDNmLCAzKQotCi0vKiBBbiBNIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBNKG9wLCByYykgKE9QIChvcCkgfCAoKHJjKSAmIDEpKQotI2RlZmluZSBNX01BU0sgTSAoMHgzZiwgMSkKLQotLyogQW4gTSBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIE1FIGZpZWxkIHNwZWNpZmllZC4gICovCi0jZGVmaW5lIE1NRShvcCwgbWUsIHJjKSAoTSAoKG9wKSwgKHJjKSkgfCAoKCgodW5zaWduZWQgbG9uZykobWUpKSAmIDB4MWYpIDw8IDEpKQotCi0vKiBBbiBNX01BU0sgd2l0aCB0aGUgTUIgYW5kIE1FIGZpZWxkcyBmaXhlZC4gICovCi0jZGVmaW5lIE1NQk1FX01BU0sgKE1fTUFTSyB8IE1CX01BU0sgfCBNRV9NQVNLKQotCi0vKiBBbiBNX01BU0sgd2l0aCB0aGUgU0ggYW5kIE1FIGZpZWxkcyBmaXhlZC4gICovCi0jZGVmaW5lIE1TSE1FX01BU0sgKE1fTUFTSyB8IFNIX01BU0sgfCBNRV9NQVNLKQotCi0vKiBBbiBNRCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUQob3AsIHhvcCwgcmMpIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHg3KSA8PCAyKSB8ICgocmMpICYgMSkpCi0jZGVmaW5lIE1EX01BU0sgTUQgKDB4M2YsIDB4NywgMSkKLQotLyogQW4gTURfTUFTSyB3aXRoIHRoZSBNQiBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIE1ETUJfTUFTSyAoTURfTUFTSyB8IE1CNl9NQVNLKQotCi0vKiBBbiBNRF9NQVNLIHdpdGggdGhlIFNIIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgTURTSF9NQVNLIChNRF9NQVNLIHwgU0g2X01BU0spCi0KLS8qIEFuIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTURTKG9wLCB4b3AsIHJjKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4ZikgPDwgMSkgfCAoKHJjKSAmIDEpKQotI2RlZmluZSBNRFNfTUFTSyBNRFMgKDB4M2YsIDB4ZiwgMSkKLQotLyogQW4gTURTX01BU0sgd2l0aCB0aGUgTUIgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBNRFNNQl9NQVNLIChNRFNfTUFTSyB8IE1CNl9NQVNLKQotCi0vKiBBbiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0Mob3AsIHNhLCBsaykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoc2EpKSAmIDEpIDw8IDEpIHwgKChsaykgJiAxKSkKLSNkZWZpbmUgU0NfTUFTSyAoT1BfTUFTSyB8ICgoKHVuc2lnbmVkIGxvbmcpMHgzZmYpIDw8IDE2KSB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMSkgfCAxKQotCi0vKiBBbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYKG9wLCB4b3ApIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgzZmYpIDw8IDEpKQotCi0vKiBBbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgUkMgYml0IHNwZWNpZmllZC4gICovCi0jZGVmaW5lIFhSQyhvcCwgeG9wLCByYykgKFggKChvcCksICh4b3ApKSB8ICgocmMpICYgMSkpCi0KLS8qIFRoZSBtYXNrIGZvciBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYX01BU0sgWFJDICgweDNmLCAweDNmZiwgMSkKLQotLyogQW4gWF9NQVNLIHdpdGggdGhlIFJBIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgWFJBX01BU0sgKFhfTUFTSyB8IFJBX01BU0spCi0KLS8qIEFuIFhfTUFTSyB3aXRoIHRoZSBSQiBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIFhSQl9NQVNLIChYX01BU0sgfCBSQl9NQVNLKQotCi0vKiBBbiBYX01BU0sgd2l0aCB0aGUgUlQgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBYUlRfTUFTSyAoWF9NQVNLIHwgUlRfTUFTSykKLQotLyogQW4gWF9NQVNLIHdpdGggdGhlIFJBIGFuZCBSQiBmaWVsZHMgZml4ZWQuICAqLwotI2RlZmluZSBYUkFSQl9NQVNLIChYX01BU0sgfCBSQV9NQVNLIHwgUkJfTUFTSykKLQotLyogQW4gWF9NQVNLIHdpdGggdGhlIFJUIGFuZCBSQSBmaWVsZHMgZml4ZWQuICAqLwotI2RlZmluZSBYUlRSQV9NQVNLIChYX01BU0sgfCBSVF9NQVNLIHwgUkFfTUFTSykKLQotLyogQW4gWCBmb3JtIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYQ01QTChvcCwgeG9wLCBsKSAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGwpKSAmIDEpIDw8IDIxKSkKLQotLyogVGhlIG1hc2sgZm9yIGFuIFggZm9ybSBjb21wYXJpc29uIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWENNUF9NQVNLIChYX01BU0sgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDIyKSkKLQotLyogVGhlIG1hc2sgZm9yIGFuIFggZm9ybSBjb21wYXJpc29uIGluc3RydWN0aW9uIHdpdGggdGhlIEwgZmllbGQKLSAgIGZpeGVkLiAgKi8KLSNkZWZpbmUgWENNUExfTUFTSyAoWENNUF9NQVNLIHwgKCgodW5zaWduZWQgbG9uZykxKSA8PCAyMSkpCi0KLS8qIEFuIFggZm9ybSB0cmFwIGluc3RydWN0aW9uIHdpdGggdGhlIFRPIGZpZWxkIHNwZWNpZmllZC4gICovCi0jZGVmaW5lIFhUTyhvcCwgeG9wLCB0bykgKFggKChvcCksICh4b3ApKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh0bykpICYgMHgxZikgPDwgMjEpKQotI2RlZmluZSBYVE9fTUFTSyAoWF9NQVNLIHwgVE9fTUFTSykKLQotLyogQW4gWEZMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYRkwob3AsIHhvcCwgcmMpIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgzZmYpIDw8IDEpIHwgKCgodW5zaWduZWQgbG9uZykocmMpKSAmIDEpKQotI2RlZmluZSBYRkxfTUFTSyAoWEZMICgweDNmLCAweDNmZiwgMSkgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDI1KSB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMTYpKQotCi0vKiBBbiBYTCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIExLIGZpZWxkIHNldCB0byAwLiAgKi8KLSNkZWZpbmUgWEwob3AsIHhvcCkgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDNmZikgPDwgMSkpCi0KLS8qIEFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggdXNlcyB0aGUgTEsgZmllbGQuICAqLwotI2RlZmluZSBYTExLKG9wLCB4b3AsIGxrKSAoWEwgKChvcCksICh4b3ApKSB8ICgobGspICYgMSkpCi0KLS8qIFRoZSBtYXNrIGZvciBhbiBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWExfTUFTSyBYTExLICgweDNmLCAweDNmZiwgMSkKLQotLyogQW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBleHBsaWNpdGx5IHNldHMgdGhlIEJPIGZpZWxkLiAgKi8KLSNkZWZpbmUgWExPKG9wLCBibywgeG9wLCBsaykgXAotICAoWExMSyAoKG9wKSwgKHhvcCksIChsaykpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGJvKSkgJiAweDFmKSA8PCAyMSkpCi0jZGVmaW5lIFhMT19NQVNLIChYTF9NQVNLIHwgQk9fTUFTSykKLQotLyogQW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBleHBsaWNpdGx5IHNldHMgdGhlIHkgYml0IG9mIHRoZSBCTwotICAgZmllbGQuICAqLwotI2RlZmluZSBYTFlMSyhvcCwgeG9wLCB5LCBsaykgKFhMTEsgKChvcCksICh4b3ApLCAobGspKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh5KSkgJiAxKSA8PCAyMSkpCi0jZGVmaW5lIFhMWUxLX01BU0sgKFhMX01BU0sgfCBZX01BU0spCi0KLS8qIEFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggc2V0cyB0aGUgQk8gZmllbGQgYW5kIHRoZSBjb25kaXRpb24KLSAgIGJpdHMgb2YgdGhlIEJJIGZpZWxkLiAgKi8KLSNkZWZpbmUgWExPQ0Iob3AsIGJvLCBjYiwgeG9wLCBsaykgXAotICAoWExPICgob3ApLCAoYm8pLCAoeG9wKSwgKGxrKSkgfCAoKCgodW5zaWduZWQgbG9uZykoY2IpKSAmIDMpIDw8IDE2KSkKLSNkZWZpbmUgWExPQ0JfTUFTSyBYTE9DQiAoMHgzZiwgMHgxZiwgMHgzLCAweDNmZiwgMSkKLQotLyogQW4gWExfTUFTSyBvciBYTFlMS19NQVNLIG9yIFhMT0NCX01BU0sgd2l0aCB0aGUgQkIgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBYTEJCX01BU0sgKFhMX01BU0sgfCBCQl9NQVNLKQotI2RlZmluZSBYTFlCQl9NQVNLIChYTFlMS19NQVNLIHwgQkJfTUFTSykKLSNkZWZpbmUgWExCT0NCQkJfTUFTSyAoWExPQ0JfTUFTSyB8IEJCX01BU0spCi0KLS8qIEFuIFhMX01BU0sgd2l0aCB0aGUgQk8gYW5kIEJCIGZpZWxkcyBmaXhlZC4gICovCi0jZGVmaW5lIFhMQk9CQl9NQVNLIChYTF9NQVNLIHwgQk9fTUFTSyB8IEJCX01BU0spCi0KLS8qIEFuIFhMX01BU0sgd2l0aCB0aGUgQk8sIEJJIGFuZCBCQiBmaWVsZHMgZml4ZWQuICAqLwotI2RlZmluZSBYTEJPQklCQl9NQVNLIChYTF9NQVNLIHwgQk9fTUFTSyB8IEJJX01BU0sgfCBCQl9NQVNLKQotCi0vKiBBbiBYTyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWE8ob3AsIHhvcCwgb2UsIHJjKSBcCi0gIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgxZmYpIDw8IDEpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKG9lKSkgJiAxKSA8PCAxMCkgfCAoKCh1bnNpZ25lZCBsb25nKShyYykpICYgMSkpCi0jZGVmaW5lIFhPX01BU0sgWE8gKDB4M2YsIDB4MWZmLCAxLCAxKQotCi0vKiBBbiBYT19NQVNLIHdpdGggdGhlIFJCIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgWE9SQl9NQVNLIChYT19NQVNLIHwgUkJfTUFTSykKLQotLyogQW4gWFMgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFhTKG9wLCB4b3AsIHJjKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4MWZmKSA8PCAyKSB8ICgoKHVuc2lnbmVkIGxvbmcpKHJjKSkgJiAxKSkKLSNkZWZpbmUgWFNfTUFTSyBYUyAoMHgzZiwgMHgxZmYsIDEpCi0KLS8qIEEgbWFzayBmb3IgdGhlIEZYTSB2ZXJzaW9uIG9mIGFuIFhGWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWEZYRlhNX01BU0sgKFhfTUFTSyB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMjApIHwgKCgodW5zaWduZWQgbG9uZykxKSA8PCAxMSkpCi0KLS8qIEFuIFhGWCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIEZYTSBmaWVsZCBmaWxsZWQgaW4uICAqLwotI2RlZmluZSBYRlhNKG9wLCB4b3AsIGZ4bSkgXAotICAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGZ4bSkpICYgMHhmZikgPDwgMTIpKQotCi0vKiBBbiBYRlggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBTUFIgZmllbGQgZmlsbGVkIGluLiAgKi8KLSNkZWZpbmUgWFNQUihvcCwgeG9wLCBzcHIpIFwKLSAgKFggKChvcCksICh4b3ApKSB8ICgoKCh1bnNpZ25lZCBsb25nKShzcHIpKSAmIDB4MWYpIDw8IDE2KSB8ICgoKCh1bnNpZ25lZCBsb25nKShzcHIpKSAmIDB4M2UwKSA8PCA2KSkKLSNkZWZpbmUgWFNQUl9NQVNLIChYX01BU0sgfCBTUFJfTUFTSykKLQotLyogQW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgU1BSIGZpZWxkIGZpbGxlZCBpbiBleGNlcHQgZm9yIHRoZQotICAgU1BSQkFUIGZpZWxkLiAgKi8KLSNkZWZpbmUgWFNQUkJBVF9NQVNLIChYU1BSX01BU0sgJn4gU1BSQkFUX01BU0spCi0KLS8qIEFuIFhGWCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIFNQUiBmaWVsZCBmaWxsZWQgaW4gZXhjZXB0IGZvciB0aGUKLSAgIFNQUkcgZmllbGQuICAqLwotI2RlZmluZSBYU1BSR19NQVNLIChYU1BSX01BU0sgJn4gU1BSR19NQVNLKQotCi0vKiBBbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCBldmVyeXRoaW5nIGZpbGxlZCBpbiBleGNlcHQgdGhlIEUgZmllbGQuICAqLwotI2RlZmluZSBYRV9NQVNLICgweGZmZmY3ZmZmKQotCi0vKiBUaGUgQk8gZW5jb2RpbmdzIHVzZWQgaW4gZXh0ZW5kZWQgY29uZGl0aW9uYWwgYnJhbmNoIG1uZW1vbmljcy4gICovCi0jZGVmaW5lIEJPRE5aRgkoMHgwKQotI2RlZmluZSBCT0ROWkZQCSgweDEpCi0jZGVmaW5lIEJPRFpGCSgweDIpCi0jZGVmaW5lIEJPRFpGUAkoMHgzKQotI2RlZmluZSBCT0YJKDB4NCkKLSNkZWZpbmUgQk9GUAkoMHg1KQotI2RlZmluZSBCT0ROWlQJKDB4OCkKLSNkZWZpbmUgQk9ETlpUUAkoMHg5KQotI2RlZmluZSBCT0RaVAkoMHhhKQotI2RlZmluZSBCT0RaVFAJKDB4YikKLSNkZWZpbmUgQk9UCSgweGMpCi0jZGVmaW5lIEJPVFAJKDB4ZCkKLSNkZWZpbmUgQk9ETloJKDB4MTApCi0jZGVmaW5lIEJPRE5aUAkoMHgxMSkKLSNkZWZpbmUgQk9EWgkoMHgxMikKLSNkZWZpbmUgQk9EWlAJKDB4MTMpCi0jZGVmaW5lIEJPVQkoMHgxNCkKLQotLyogVGhlIEJJIGNvbmRpdGlvbiBiaXQgZW5jb2RpbmdzIHVzZWQgaW4gZXh0ZW5kZWQgY29uZGl0aW9uYWwgYnJhbmNoCi0gICBtbmVtb25pY3MuICAqLwotI2RlZmluZSBDQkxUCSgwKQotI2RlZmluZSBDQkdUCSgxKQotI2RlZmluZSBDQkVRCSgyKQotI2RlZmluZSBDQlNPCSgzKQotCi0vKiBUaGUgVE8gZW5jb2RpbmdzIHVzZWQgaW4gZXh0ZW5kZWQgdHJhcCBtbmVtb25pY3MuICAqLwotI2RlZmluZSBUT0xHVAkoMHgxKQotI2RlZmluZSBUT0xMVAkoMHgyKQotI2RlZmluZSBUT0VRCSgweDQpCi0jZGVmaW5lIFRPTEdFCSgweDUpCi0jZGVmaW5lIFRPTE5MCSgweDUpCi0jZGVmaW5lIFRPTExFCSgweDYpCi0jZGVmaW5lIFRPTE5HCSgweDYpCi0jZGVmaW5lIFRPR1QJKDB4OCkKLSNkZWZpbmUgVE9HRQkoMHhjKQotI2RlZmluZSBUT05MCSgweGMpCi0jZGVmaW5lIFRPTFQJKDB4MTApCi0jZGVmaW5lIFRPTEUJKDB4MTQpCi0jZGVmaW5lIFRPTkcJKDB4MTQpCi0jZGVmaW5lIFRPTkUJKDB4MTgpCi0jZGVmaW5lIFRPVQkoMHgxZikKLQwKLS8qIFNtYWxsZXIgbmFtZXMgZm9yIHRoZSBmbGFncyBzbyBlYWNoIGVudHJ5IGluIHRoZSBvcGNvZGVzIHRhYmxlIHdpbGwKLSAgIGZpdCBvbiBhIHNpbmdsZSBsaW5lLiAgKi8KLSN1bmRlZglQUEMKLSNkZWZpbmUgUFBDICAgICBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lIFBQQ0NPTQlQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfQ09NTU9OIHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUgUFBDMzIgICBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfMzIgfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZSBQUEM2NCAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82NCB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lIFBQQ09OTFkJUFBDX09QQ09ERV9QUEMKLSNkZWZpbmUgUFBDNDAzCVBQQwotI2RlZmluZSBQUEM3NTAJUFBDCi0jZGVmaW5lIFBQQzg2MAlQUEMKLSNkZWZpbmUJUE9XRVIgICBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUJUE9XRVIyCVBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX1BPV0VSMiB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lIFBQQ1BXUjIJUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QT1dFUjIgfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZQlQT1dFUjMyCVBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX0FOWSB8IFBQQ19PUENPREVfMzIKLSNkZWZpbmUJQ09NICAgICBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFX0NPTU1PTiB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lCUNPTTMyICAgUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV9DT01NT04gfCBQUENfT1BDT0RFX0FOWSB8IFBQQ19PUENPREVfMzIKLSNkZWZpbmUJTTYwMSAgICBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV82MDEgfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZSBQV1JDT00JUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfNjAxIHwgUFBDX09QQ09ERV9DT01NT04gfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZQlNRkRFQzEJUFBDX09QQ09ERV9QT1dFUgotI2RlZmluZQlNRkRFQzIJUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFXzYwMQotDAotLyogVGhlIG9wY29kZSB0YWJsZS4KLQotICAgVGhlIGZvcm1hdCBvZiB0aGUgb3Bjb2RlIHRhYmxlIGlzOgotCi0gICBOQU1FCSAgICAgT1BDT0RFCU1BU0sJCUZMQUdTCQl7IE9QRVJBTkRTIH0KLQotICAgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICBPUENPREUgaXMgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KLSAgIE1BU0sgaXMgdGhlIG9wY29kZSBtYXNrOyB0aGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgZGlzYXNzZW1ibGVyCi0gICAgIHdoaWNoIGJpdHMgaW4gdGhlIGFjdHVhbCBvcGNvZGUgbXVzdCBtYXRjaCBPUENPREUuCi0gICBGTEFHUyBhcmUgZmxhZ3MgaW5kaWNhdGVkIHdoYXQgcHJvY2Vzc29ycyBzdXBwb3J0IHRoZSBpbnN0cnVjdGlvbi4KLSAgIE9QRVJBTkRTIGlzIHRoZSBsaXN0IG9mIG9wZXJhbmRzLgotCi0gICBUaGUgZGlzYXNzZW1ibGVyIHJlYWRzIHRoZSB0YWJsZSBpbiBvcmRlciBhbmQgcHJpbnRzIHRoZSBmaXJzdAotICAgaW5zdHJ1Y3Rpb24gd2hpY2ggbWF0Y2hlcywgc28gdGhpcyB0YWJsZSBpcyBzb3J0ZWQgdG8gcHV0IG1vcmUKLSAgIHNwZWNpZmljIGluc3RydWN0aW9ucyBiZWZvcmUgbW9yZSBnZW5lcmFsIGluc3RydWN0aW9ucy4gIEl0IGlzIGFsc28KLSAgIHNvcnRlZCBieSBtYWpvciBvcGNvZGUuICAqLwotCi1jb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgcG93ZXJwY19vcGNvZGVzW10gPSB7Ci17ICJ0ZGxndGkiLCAgT1BUTygyLFRPTEdUKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbGx0aSIsICBPUFRPKDIsVE9MTFQpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRlcWkiLCAgIE9QVE8oMixUT0VRKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbGdlaSIsICBPUFRPKDIsVE9MR0UpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRsbmxpIiwgIE9QVE8oMixUT0xOTCksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZGxsZWkiLCAgT1BUTygyLFRPTExFKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbG5naSIsICBPUFRPKDIsVE9MTkcpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRndGkiLCAgIE9QVE8oMixUT0dUKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkZ2VpIiwgICBPUFRPKDIsVE9HRSksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZG5saSIsICAgT1BUTygyLFRPTkwpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRsdGkiLCAgIE9QVE8oMixUT0xUKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbGVpIiwgICBPUFRPKDIsVE9MRSksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZG5naSIsICAgT1BUTygyLFRPTkcpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRuZWkiLCAgIE9QVE8oMixUT05FKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkaSIsICAgICBPUCgyKSwJT1BfTUFTSywJUFBDNjQsCQl7IFRPLCBSQSwgU0kgfSB9LAotCi17ICJ0d2xndGkiLCAgT1BUTygzLFRPTEdUKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bGd0aSIsICAgT1BUTygzLFRPTEdUKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d2xsdGkiLCAgT1BUTygzLFRPTExUKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bGx0aSIsICAgT1BUTygzLFRPTExUKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d2VxaSIsICAgT1BUTygzLFRPRVEpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRlcWkiLCAgICBPUFRPKDMsVE9FUSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsZ2VpIiwgIE9QVE8oMyxUT0xHRSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxnZWkiLCAgIE9QVE8oMyxUT0xHRSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsbmxpIiwgIE9QVE8oMyxUT0xOTCksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxubGkiLCAgIE9QVE8oMyxUT0xOTCksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsbGVpIiwgIE9QVE8oMyxUT0xMRSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxsZWkiLCAgIE9QVE8oMyxUT0xMRSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsbmdpIiwgIE9QVE8oMyxUT0xORyksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxuZ2kiLCAgIE9QVE8oMyxUT0xORyksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdndGkiLCAgIE9QVE8oMyxUT0dUKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0Z3RpIiwgICAgT1BUTygzLFRPR1QpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3Z2VpIiwgICBPUFRPKDMsVE9HRSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGdlaSIsICAgIE9QVE8oMyxUT0dFKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d25saSIsICAgT1BUTygzLFRPTkwpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRubGkiLCAgICBPUFRPKDMsVE9OTCksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsdGkiLCAgIE9QVE8oMyxUT0xUKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bHRpIiwgICAgT1BUTygzLFRPTFQpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3bGVpIiwgICBPUFRPKDMsVE9MRSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxlaSIsICAgIE9QVE8oMyxUT0xFKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d25naSIsICAgT1BUTygzLFRPTkcpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRuZ2kiLCAgICBPUFRPKDMsVE9ORyksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHduZWkiLCAgIE9QVE8oMyxUT05FKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bmVpIiwgICAgT1BUTygzLFRPTkUpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3aSIsICAgICBPUCgzKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBUTywgUkEsIFNJIH0gfSwKLXsgInRpIiwgICAgICBPUCgzKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBUTywgUkEsIFNJIH0gfSwKLQoteyAibXVsbGkiLCAgIE9QKDcpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoteyAibXVsaSIsICAgIE9QKDcpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgU0kgfSB9LAotCi17ICJzdWJmaWMiLCAgT1AoOCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi17ICJzZmkiLCAgICAgT1AoOCksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi0KLXsgImRvemkiLCAgICBPUCg5KSwJT1BfTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBTSSB9IH0sCi0KLXsgImNtcGx3aSIsICBPUEwoMTAsMCksCU9QTF9NQVNLLAlQUENDT00sCQl7IE9CRiwgUkEsIFVJIH0gfSwKLXsgImNtcGxkaSIsICBPUEwoMTAsMSksIE9QTF9NQVNLLAlQUEM2NCwJCXsgT0JGLCBSQSwgVUkgfSB9LAoteyAiY21wbGkiLCAgIE9QKDEwKSwJT1BfTUFTSywJUFBDT05MWSwJeyBCRiwgTCwgUkEsIFVJIH0gfSwKLXsgImNtcGxpIiwgICBPUCgxMCksCU9QX01BU0ssCVBXUkNPTSwJCXsgQkYsIFJBLCBVSSB9IH0sCi0KLXsgImNtcHdpIiwgICBPUEwoMTEsMCksCU9QTF9NQVNLLAlQUENDT00sCQl7IE9CRiwgUkEsIFNJIH0gfSwKLXsgImNtcGRpIiwgICBPUEwoMTEsMSksCU9QTF9NQVNLLAlQUEM2NCwJCXsgT0JGLCBSQSwgU0kgfSB9LAoteyAiY21waSIsICAgIE9QKDExKSwJT1BfTUFTSywJUFBDT05MWSwJeyBCRiwgTCwgUkEsIFNJIH0gfSwKLXsgImNtcGkiLCAgICBPUCgxMSksCU9QX01BU0ssCVBXUkNPTSwJCXsgQkYsIFJBLCBTSSB9IH0sCi0KLXsgImFkZGljIiwgICBPUCgxMiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi17ICJhaSIsCSAgICAgT1AoMTIpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoteyAic3ViaWMiLCAgIE9QKDEyKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIE5TSSB9IH0sCi0KLXsgImFkZGljLiIsICBPUCgxMyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi17ICJhaS4iLCAgICAgT1AoMTMpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoteyAic3ViaWMuIiwgIE9QKDEzKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIE5TSSB9IH0sCi0KLXsgImxpIiwJICAgICBPUCgxNCksCURSQV9NQVNLLAlQUENDT00sCQl7IFJULCBTSSB9IH0sCi17ICJsaWwiLCAgICAgT1AoMTQpLAlEUkFfTUFTSywJUFdSQ09NLAkJeyBSVCwgU0kgfSB9LAoteyAiYWRkaSIsICAgIE9QKDE0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKLXsgImNhbCIsICAgICBPUCgxNCksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLXsgInN1YmkiLCAgICBPUCgxNCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBOU0kgfSB9LAoteyAibGEiLAkgICAgIE9QKDE0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAotCi17ICJsaXMiLCAgICAgT1AoMTUpLAlEUkFfTUFTSywJUFBDQ09NLAkJeyBSVCwgU0lTSUdOT1BUIH0gfSwKLXsgImxpdSIsICAgICBPUCgxNSksCURSQV9NQVNLLAlQV1JDT00sCQl7IFJULCBTSVNJR05PUFQgfSB9LAoteyAiYWRkaXMiLCAgIE9QKDE1KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCxSQSxTSVNJR05PUFQgfSB9LAoteyAiY2F1IiwgICAgIE9QKDE1KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCxSQSxTSVNJR05PUFQgfSB9LAoteyAic3ViaXMiLCAgIE9QKDE1KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIE5TSSB9IH0sCi0KLXsgImJkbnotIiwgICBCQk8oMTYsQk9ETlosMCwwKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRE0gfSB9LAoteyAiYmRueisiLCAgIEJCTygxNixCT0ROWiwwLDApLCBCQk9ZQklfTUFTSywgUFBDLAl7IEJEUCB9IH0sCi17ICJiZG56IiwgICAgQkJPKDE2LEJPRE5aLDAsMCksIEJCT1lCSV9NQVNLLCBQUENDT00sCXsgQkQgfSB9LAoteyAiYmRuIiwgICAgIEJCTygxNixCT0ROWiwwLDApLCBCQk9ZQklfTUFTSywgUFdSQ09NLAl7IEJEIH0gfSwKLXsgImJkbnpsLSIsICBCQk8oMTYsQk9ETlosMCwxKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRE0gfSB9LAoteyAiYmRuemwrIiwgIEJCTygxNixCT0ROWiwwLDEpLCBCQk9ZQklfTUFTSywgUFBDLAl7IEJEUCB9IH0sCi17ICJiZG56bCIsICAgQkJPKDE2LEJPRE5aLDAsMSksIEJCT1lCSV9NQVNLLCBQUENDT00sCXsgQkQgfSB9LAoteyAiYmRubCIsICAgIEJCTygxNixCT0ROWiwwLDEpLCBCQk9ZQklfTUFTSywgUFdSQ09NLAl7IEJEIH0gfSwKLXsgImJkbnphLSIsICBCQk8oMTYsQk9ETlosMSwwKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRE1BIH0gfSwKLXsgImJkbnphKyIsICBCQk8oMTYsQk9ETlosMSwwKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRFBBIH0gfSwKLXsgImJkbnphIiwgICBCQk8oMTYsQk9ETlosMSwwKSwgQkJPWUJJX01BU0ssIFBQQ0NPTSwJeyBCREEgfSB9LAoteyAiYmRuYSIsICAgIEJCTygxNixCT0ROWiwxLDApLCBCQk9ZQklfTUFTSywgUFdSQ09NLAl7IEJEQSB9IH0sCi17ICJiZG56bGEtIiwgQkJPKDE2LEJPRE5aLDEsMSksIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRNQSB9IH0sCi17ICJiZG56bGErIiwgQkJPKDE2LEJPRE5aLDEsMSksIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRQQSB9IH0sCi17ICJiZG56bGEiLCAgQkJPKDE2LEJPRE5aLDEsMSksIEJCT1lCSV9NQVNLLCBQUENDT00sCXsgQkRBIH0gfSwKLXsgImJkbmxhIiwgICBCQk8oMTYsQk9ETlosMSwxKSwgQkJPWUJJX01BU0ssIFBXUkNPTSwJeyBCREEgfSB9LAoteyAiYmR6LSIsICAgIEJCTygxNixCT0RaLDAsMCksICBCQk9ZQklfTUFTSywgUFBDLAl7IEJETSB9IH0sCi17ICJiZHorIiwgICAgQkJPKDE2LEJPRFosMCwwKSwgIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRQIH0gfSwKLXsgImJkeiIsICAgICBCQk8oMTYsQk9EWiwwLDApLCAgQkJPWUJJX01BU0ssIENPTSwJeyBCRCB9IH0sCi17ICJiZHpsLSIsICAgQkJPKDE2LEJPRFosMCwxKSwgIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRNIH0gfSwKLXsgImJkemwrIiwgICBCQk8oMTYsQk9EWiwwLDEpLCAgQkJPWUJJX01BU0ssIFBQQywJeyBCRFAgfSB9LAoteyAiYmR6bCIsICAgIEJCTygxNixCT0RaLDAsMSksICBCQk9ZQklfTUFTSywgQ09NLAl7IEJEIH0gfSwKLXsgImJkemEtIiwgICBCQk8oMTYsQk9EWiwxLDApLCAgQkJPWUJJX01BU0ssIFBQQywJeyBCRE1BIH0gfSwKLXsgImJkemErIiwgICBCQk8oMTYsQk9EWiwxLDApLCAgQkJPWUJJX01BU0ssIFBQQywJeyBCRFBBIH0gfSwKLXsgImJkemEiLCAgICBCQk8oMTYsQk9EWiwxLDApLCAgQkJPWUJJX01BU0ssIENPTSwJeyBCREEgfSB9LAoteyAiYmR6bGEtIiwgIEJCTygxNixCT0RaLDEsMSksICBCQk9ZQklfTUFTSywgUFBDLAl7IEJETUEgfSB9LAoteyAiYmR6bGErIiwgIEJCTygxNixCT0RaLDEsMSksICBCQk9ZQklfTUFTSywgUFBDLAl7IEJEUEEgfSB9LAoteyAiYmR6bGEiLCAgIEJCTygxNixCT0RaLDEsMSksICBCQk9ZQklfTUFTSywgQ09NLAl7IEJEQSB9IH0sCi17ICJibHQtIiwgICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJsdCsiLCAgICBCQk9DQigxNixCT1QsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYmx0IiwgICAgIEJCT0NCKDE2LEJPVCxDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJsdGwtIiwgICBCQk9DQigxNixCT1QsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYmx0bCsiLCAgIEJCT0NCKDE2LEJPVCxDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibHRsIiwgICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYmx0YS0iLCAgIEJCT0NCKDE2LEJPVCxDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYmx0YSsiLCAgIEJCT0NCKDE2LEJPVCxDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmx0YSIsICAgIEJCT0NCKDE2LEJPVCxDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibHRsYS0iLCAgQkJPQ0IoMTYsQk9ULENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibHRsYSsiLCAgQkJPQ0IoMTYsQk9ULENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibHRsYSIsICAgQkJPQ0IoMTYsQk9ULENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJndC0iLCAgICBCQk9DQigxNixCT1QsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYmd0KyIsICAgIEJCT0NCKDE2LEJPVCxDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJiZ3QiLCAgICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYmd0bC0iLCAgIEJCT0NCKDE2LEJPVCxDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJiZ3RsKyIsICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJndGwiLCAgICBCQk9DQigxNixCT1QsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJiZ3RhLSIsICAgQkJPQ0IoMTYsQk9ULENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJiZ3RhKyIsICAgQkJPQ0IoMTYsQk9ULENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJiZ3RhIiwgICAgQkJPQ0IoMTYsQk9ULENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJndGxhLSIsICBCQk9DQigxNixCT1QsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJndGxhKyIsICBCQk9DQigxNixCT1QsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJndGxhIiwgICBCQk9DQigxNixCT1QsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYmVxLSIsICAgIEJCT0NCKDE2LEJPVCxDQkVRLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJiZXErIiwgICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJlcSIsICAgICBCQk9DQigxNixCT1QsQ0JFUSwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJiZXFsLSIsICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJlcWwrIiwgICBCQk9DQigxNixCT1QsQ0JFUSwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYmVxbCIsICAgIEJCT0NCKDE2LEJPVCxDQkVRLDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJlcWEtIiwgICBCQk9DQigxNixCT1QsQ0JFUSwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJlcWErIiwgICBCQk9DQigxNixCT1QsQ0JFUSwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJlcWEiLCAgICBCQk9DQigxNixCT1QsQ0JFUSwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYmVxbGEtIiwgIEJCT0NCKDE2LEJPVCxDQkVRLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYmVxbGErIiwgIEJCT0NCKDE2LEJPVCxDQkVRLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmVxbGEiLCAgIEJCT0NCKDE2LEJPVCxDQkVRLDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJic28tIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJzbysiLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYnNvIiwgICAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJzb2wtIiwgICBCQk9DQigxNixCT1QsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYnNvbCsiLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJic29sIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYnNvYS0iLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYnNvYSsiLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYnNvYSIsICAgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJic29sYS0iLCAgQkJPQ0IoMTYsQk9ULENCU08sMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJic29sYSsiLCAgQkJPQ0IoMTYsQk9ULENCU08sMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJic29sYSIsICAgQkJPQ0IoMTYsQk9ULENCU08sMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJ1bi0iLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYnVuKyIsICAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJidW4iLCAgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwgeyBDUiwgQkQgfSB9LAoteyAiYnVubC0iLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJidW5sKyIsICAgQkJPQ0IoMTYsQk9ULENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJ1bmwiLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCRCB9IH0sCi17ICJidW5hLSIsICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJidW5hKyIsICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJidW5hIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwgeyBDUiwgQkRBIH0gfSwKLXsgImJ1bmxhLSIsICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJ1bmxhKyIsICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJ1bmxhIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCREEgfSB9LAoteyAiYmdlLSIsICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJiZ2UrIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJnZSIsICAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJiZ2VsLSIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJnZWwrIiwgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYmdlbCIsICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJnZWEtIiwgICBCQk9DQigxNixCT0YsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJnZWErIiwgICBCQk9DQigxNixCT0YsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJnZWEiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYmdlbGEtIiwgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYmdlbGErIiwgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmdlbGEiLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibmwtIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJubCsiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm5sIiwgICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJubGwtIiwgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYm5sbCsiLCAgIEJCT0NCKDE2LEJPRixDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibmxsIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYm5sYS0iLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5sYSsiLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5sYSIsICAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibmxsYS0iLCAgQkJPQ0IoMTYsQk9GLENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibmxsYSsiLCAgQkJPQ0IoMTYsQk9GLENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibmxsYSIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJsZS0iLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYmxlKyIsICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibGUiLCAgICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYmxlbC0iLCAgIEJCT0NCKDE2LEJPRixDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibGVsKyIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJsZWwiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibGVhLSIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibGVhKyIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibGVhIiwgICAgQkJPQ0IoMTYsQk9GLENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJsZWxhLSIsICBCQk9DQigxNixCT0YsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJsZWxhKyIsICBCQk9DQigxNixCT0YsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJsZWxhIiwgICBCQk9DQigxNixCT0YsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYm5nLSIsICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibmcrIiwgICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJuZyIsICAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibmdsLSIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJuZ2wrIiwgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm5nbCIsICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJuZ2EtIiwgICBCQk9DQigxNixCT0YsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJuZ2ErIiwgICBCQk9DQigxNixCT0YsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJuZ2EiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYm5nbGEtIiwgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5nbGErIiwgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5nbGEiLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibmUtIiwgICAgQkJPQ0IoMTYsQk9GLENCRVEsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJuZSsiLCAgICBCQk9DQigxNixCT0YsQ0JFUSwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm5lIiwgICAgIEJCT0NCKDE2LEJPRixDQkVRLDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJuZWwtIiwgICBCQk9DQigxNixCT0YsQ0JFUSwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYm5lbCsiLCAgIEJCT0NCKDE2LEJPRixDQkVRLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibmVsIiwgICAgQkJPQ0IoMTYsQk9GLENCRVEsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYm5lYS0iLCAgIEJCT0NCKDE2LEJPRixDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5lYSsiLCAgIEJCT0NCKDE2LEJPRixDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5lYSIsICAgIEJCT0NCKDE2LEJPRixDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibmVsYS0iLCAgQkJPQ0IoMTYsQk9GLENCRVEsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibmVsYSsiLCAgQkJPQ0IoMTYsQk9GLENCRVEsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibmVsYSIsICAgQkJPQ0IoMTYsQk9GLENCRVEsMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJucy0iLCAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYm5zKyIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibnMiLCAgICAgQkJPQ0IoMTYsQk9GLENCU08sMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYm5zbC0iLCAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibnNsKyIsICAgQkJPQ0IoMTYsQk9GLENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJuc2wiLCAgICBCQk9DQigxNixCT0YsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibnNhLSIsICAgQkJPQ0IoMTYsQk9GLENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibnNhKyIsICAgQkJPQ0IoMTYsQk9GLENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibnNhIiwgICAgQkJPQ0IoMTYsQk9GLENCU08sMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJuc2xhLSIsICBCQk9DQigxNixCT0YsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJuc2xhKyIsICBCQk9DQigxNixCT0YsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJuc2xhIiwgICBCQk9DQigxNixCT0YsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYm51LSIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibnUrIiwgICAgQkJPQ0IoMTYsQk9GLENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJudSIsICAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCRCB9IH0sCi17ICJibnVsLSIsICAgQkJPQ0IoMTYsQk9GLENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJudWwrIiwgICBCQk9DQigxNixCT0YsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm51bCIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sIHsgQ1IsIEJEIH0gfSwKLXsgImJudWEtIiwgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJudWErIiwgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJudWEiLCAgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCREEgfSB9LAoteyAiYm51bGEtIiwgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm51bGErIiwgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm51bGEiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sIHsgQ1IsIEJEQSB9IH0sCi17ICJiZG56dC0iLCAgQkJPKDE2LEJPRE5aVCwwLDApLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRNIH0gfSwKLXsgImJkbnp0KyIsICBCQk8oMTYsQk9ETlpULDAsMCksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRFAgfSB9LAoteyAiYmRuenQiLCAgIEJCTygxNixCT0ROWlQsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJkbnp0bC0iLCBCQk8oMTYsQk9ETlpULDAsMSksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRE0gfSB9LAoteyAiYmRuenRsKyIsIEJCTygxNixCT0ROWlQsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJEUCB9IH0sCi17ICJiZG56dGwiLCAgQkJPKDE2LEJPRE5aVCwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmRuenRhLSIsIEJCTygxNixCT0ROWlQsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJETUEgfSB9LAoteyAiYmRuenRhKyIsIEJCTygxNixCT0ROWlQsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJEUEEgfSB9LAoteyAiYmRuenRhIiwgIEJCTygxNixCT0ROWlQsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZG56dGxhLSIsQkJPKDE2LEJPRE5aVCwxLDEpLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRNQSB9IH0sCi17ICJiZG56dGxhKyIsQkJPKDE2LEJPRE5aVCwxLDEpLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRQQSB9IH0sCi17ICJiZG56dGxhIiwgQkJPKDE2LEJPRE5aVCwxLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJkbnpmLSIsICBCQk8oMTYsQk9ETlpGLDAsMCksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRE0gfSB9LAoteyAiYmRuemYrIiwgIEJCTygxNixCT0ROWkYsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJEUCB9IH0sCi17ICJiZG56ZiIsICAgQkJPKDE2LEJPRE5aRiwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmRuemZsLSIsIEJCTygxNixCT0ROWkYsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJETSB9IH0sCi17ICJiZG56ZmwrIiwgQkJPKDE2LEJPRE5aRiwwLDEpLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRQIH0gfSwKLXsgImJkbnpmbCIsICBCQk8oMTYsQk9ETlpGLDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZG56ZmEtIiwgQkJPKDE2LEJPRE5aRiwxLDApLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRNQSB9IH0sCi17ICJiZG56ZmErIiwgQkJPKDE2LEJPRE5aRiwxLDApLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRQQSB9IH0sCi17ICJiZG56ZmEiLCAgQkJPKDE2LEJPRE5aRiwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJkbnpmbGEtIixCQk8oMTYsQk9ETlpGLDEsMSksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRE1BIH0gfSwKLXsgImJkbnpmbGErIixCQk8oMTYsQk9ETlpGLDEsMSksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRFBBIH0gfSwKLXsgImJkbnpmbGEiLCBCQk8oMTYsQk9ETlpGLDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYnQtIiwgICAgIEJCTygxNixCT1QsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE0gfSB9LAoteyAiYnQrIiwgICAgIEJCTygxNixCT1QsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFAgfSB9LAoteyAiYnQiLAkgICAgIEJCTygxNixCT1QsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJidCIsICAgICBCQk8oMTYsQk9ULDAsMCksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJidGwtIiwgICAgQkJPKDE2LEJPVCwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETSB9IH0sCi17ICJidGwrIiwgICAgQkJPKDE2LEJPVCwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUCB9IH0sCi17ICJidGwiLCAgICAgQkJPKDE2LEJPVCwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmJ0bCIsICAgIEJCTygxNixCT1QsMCwxKSwgQkJPWV9NQVNLLCBQV1JDT00sCXsgQkksIEJEIH0gfSwKLXsgImJ0YS0iLCAgICBCQk8oMTYsQk9ULDEsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCi17ICJidGErIiwgICAgQkJPKDE2LEJPVCwxLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUEEgfSB9LAoteyAiYnRhIiwgICAgIEJCTygxNixCT1QsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiYnRhIiwgICAgQkJPKDE2LEJPVCwxLDApLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJ0bGEtIiwgICBCQk8oMTYsQk9ULDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCi17ICJidGxhKyIsICAgQkJPKDE2LEJPVCwxLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUEEgfSB9LAoteyAiYnRsYSIsICAgIEJCTygxNixCT1QsMSwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiYnRsYSIsICAgQkJPKDE2LEJPVCwxLDEpLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJmLSIsICAgICBCQk8oMTYsQk9GLDAsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNIH0gfSwKLXsgImJmKyIsICAgICBCQk8oMTYsQk9GLDAsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQIH0gfSwKLXsgImJmIiwJICAgICBCQk8oMTYsQk9GLDAsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiYmYiLCAgICAgQkJPKDE2LEJPRiwwLDApLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmZsLSIsICAgIEJCTygxNixCT0YsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE0gfSB9LAoteyAiYmZsKyIsICAgIEJCTygxNixCT0YsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFAgfSB9LAoteyAiYmZsIiwgICAgIEJCTygxNixCT0YsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJiZmwiLCAgICBCQk8oMTYsQk9GLDAsMSksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZmEtIiwgICAgQkJPKDE2LEJPRiwxLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETUEgfSB9LAoteyAiYmZhKyIsICAgIEJCTygxNixCT0YsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFBBIH0gfSwKLXsgImJmYSIsICAgICBCQk8oMTYsQk9GLDEsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmJmYSIsICAgIEJCTygxNixCT0YsMSwwKSwgQkJPWV9NQVNLLCBQV1JDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZmxhLSIsICAgQkJPKDE2LEJPRiwxLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETUEgfSB9LAoteyAiYmZsYSsiLCAgIEJCTygxNixCT0YsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFBBIH0gfSwKLXsgImJmbGEiLCAgICBCQk8oMTYsQk9GLDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmJmbGEiLCAgIEJCTygxNixCT0YsMSwxKSwgQkJPWV9NQVNLLCBQV1JDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZHp0LSIsICAgQkJPKDE2LEJPRFpULDAsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNIH0gfSwKLXsgImJkenQrIiwgICBCQk8oMTYsQk9EWlQsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFAgfSB9LAoteyAiYmR6dCIsICAgIEJCTygxNixCT0RaVCwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmR6dGwtIiwgIEJCTygxNixCT0RaVCwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETSB9IH0sCi17ICJiZHp0bCsiLCAgQkJPKDE2LEJPRFpULDAsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQIH0gfSwKLXsgImJkenRsIiwgICBCQk8oMTYsQk9EWlQsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJkenRhLSIsICBCQk8oMTYsQk9EWlQsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE1BIH0gfSwKLXsgImJkenRhKyIsICBCQk8oMTYsQk9EWlQsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFBBIH0gfSwKLXsgImJkenRhIiwgICBCQk8oMTYsQk9EWlQsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZHp0bGEtIiwgQkJPKDE2LEJPRFpULDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCi17ICJiZHp0bGErIiwgQkJPKDE2LEJPRFpULDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQQSB9IH0sCi17ICJiZHp0bGEiLCAgQkJPKDE2LEJPRFpULDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmR6Zi0iLCAgIEJCTygxNixCT0RaRiwwLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETSB9IH0sCi17ICJiZHpmKyIsICAgQkJPKDE2LEJPRFpGLDAsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQIH0gfSwKLXsgImJkemYiLCAgICBCQk8oMTYsQk9EWkYsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJkemZsLSIsICBCQk8oMTYsQk9EWkYsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE0gfSB9LAoteyAiYmR6ZmwrIiwgIEJCTygxNixCT0RaRiwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUCB9IH0sCi17ICJiZHpmbCIsICAgQkJPKDE2LEJPRFpGLDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZHpmYS0iLCAgQkJPKDE2LEJPRFpGLDEsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCi17ICJiZHpmYSsiLCAgQkJPKDE2LEJPRFpGLDEsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQQSB9IH0sCi17ICJiZHpmYSIsICAgQkJPKDE2LEJPRFpGLDEsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmR6ZmxhLSIsIEJCTygxNixCT0RaRiwxLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETUEgfSB9LAoteyAiYmR6ZmxhKyIsIEJCTygxNixCT0RaRiwxLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUEEgfSB9LAoteyAiYmR6ZmxhIiwgIEJCTygxNixCT0RaRiwxLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJjLSIsICAgICBCKDE2LDAsMCksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRNIH0gfSwKLXsgImJjKyIsICAgICBCKDE2LDAsMCksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRQIH0gfSwKLXsgImJjIiwJICAgICBCKDE2LDAsMCksCUJfTUFTSywJCUNPTSwJCXsgQk8sIEJJLCBCRCB9IH0sCi17ICJiY2wtIiwgICAgQigxNiwwLDEpLAlCX01BU0ssCQlQUEMsCQl7IEJPRSwgQkksIEJETSB9IH0sCi17ICJiY2wrIiwgICAgQigxNiwwLDEpLAlCX01BU0ssCQlQUEMsCQl7IEJPRSwgQkksIEJEUCB9IH0sCi17ICJiY2wiLCAgICAgQigxNiwwLDEpLAlCX01BU0ssCQlDT00sCQl7IEJPLCBCSSwgQkQgfSB9LAoteyAiYmNhLSIsICAgIEIoMTYsMSwwKSwJQl9NQVNLLAkJUFBDLAkJeyBCT0UsIEJJLCBCRE1BIH0gfSwKLXsgImJjYSsiLCAgICBCKDE2LDEsMCksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRQQSB9IH0sCi17ICJiY2EiLCAgICAgQigxNiwxLDApLAlCX01BU0ssCQlDT00sCQl7IEJPLCBCSSwgQkRBIH0gfSwKLXsgImJjbGEtIiwgICBCKDE2LDEsMSksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRNQSB9IH0sCi17ICJiY2xhKyIsICAgQigxNiwxLDEpLAlCX01BU0ssCQlQUEMsCQl7IEJPRSwgQkksIEJEUEEgfSB9LAoteyAiYmNsYSIsICAgIEIoMTYsMSwxKSwJQl9NQVNLLAkJQ09NLAkJeyBCTywgQkksIEJEQSB9IH0sCi0KLXsgInNjIiwgICAgICBTQygxNywxLDApLCAweGZmZmZmZmZmLAlQUEMsCQl7IDAgfSB9LAoteyAic3ZjIiwgICAgIFNDKDE3LDAsMCksIFNDX01BU0ssCVBPV0VSLAkJeyBMRVYsIEZMMSwgRkwyIH0gfSwKLXsgInN2Y2wiLCAgICBTQygxNywwLDEpLCBTQ19NQVNLLAlQT1dFUiwJCXsgTEVWLCBGTDEsIEZMMiB9IH0sCi17ICJzdmNhIiwgICAgU0MoMTcsMSwwKSwgU0NfTUFTSywJUFdSQ09NLAkJeyBTViB9IH0sCi17ICJzdmNsYSIsICAgU0MoMTcsMSwxKSwgU0NfTUFTSywJUE9XRVIsCQl7IFNWIH0gfSwKLQoteyAiYiIsCSAgICAgQigxOCwwLDApLAlCX01BU0ssCQlDT00sCXsgTEkgfSB9LAoteyAiYmwiLCAgICAgIEIoMTgsMCwxKSwJQl9NQVNLLAkJQ09NLAl7IExJIH0gfSwKLXsgImJhIiwgICAgICBCKDE4LDEsMCksCUJfTUFTSywJCUNPTSwJeyBMSUEgfSB9LAoteyAiYmxhIiwgICAgIEIoMTgsMSwxKSwJQl9NQVNLLAkJQ09NLAl7IExJQSB9IH0sCi0KLXsgIm1jcmYiLCAgICBYTCgxOSwwKSwJWExCQl9NQVNLfCgzPDwyMSl8KDM8PDE2KSwgQ09NLAl7IEJGLCBCRkEgfSB9LAotCi17ICJibHIiLCAgICAgWExPKDE5LEJPVSwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDQ09NLAl7IDAgfSB9LAoteyAiYnIiLCAgICAgIFhMTygxOSxCT1UsMTYsMCksIFhMQk9CSUJCX01BU0ssIFBXUkNPTSwJeyAwIH0gfSwKLXsgImJscmwiLCAgICBYTE8oMTksQk9VLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCi17ICJicmwiLCAgICAgWExPKDE5LEJPVSwxNiwxKSwgWExCT0JJQkJfTUFTSywgUFdSQ09NLAl7IDAgfSB9LAoteyAiYmRuemxyIiwgIFhMTygxOSxCT0ROWiwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDQ09NLAl7IDAgfSB9LAoteyAiYmRuemxyLSIsIFhMTygxOSxCT0ROWiwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoteyAiYmRuemxyKyIsIFhMTygxOSxCT0ROWlAsMTYsMCksIFhMQk9CSUJCX01BU0ssIFBQQywJeyAwIH0gfSwKLXsgImJkbnpscmwiLCBYTE8oMTksQk9ETlosMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKLXsgImJkbnpscmwtIixYTE8oMTksQk9ETlosMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQywJeyAwIH0gfSwKLXsgImJkbnpscmwrIixYTE8oMTksQk9ETlpQLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUEMsCXsgMCB9IH0sCi17ICJiZHpsciIsICAgWExPKDE5LEJPRFosMTYsMCksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKLXsgImJkemxyLSIsICBYTE8oMTksQk9EWiwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoteyAiYmR6bHIrIiwgIFhMTygxOSxCT0RaUCwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoteyAiYmR6bHJsIiwgIFhMTygxOSxCT0RaLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCi17ICJiZHpscmwtIiwgWExPKDE5LEJPRFosMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQywJeyAwIH0gfSwKLXsgImJkemxybCsiLCBYTE8oMTksQk9EWlAsMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQywJeyAwIH0gfSwKLXsgImJsdGxyIiwgICBYTE9DQigxOSxCT1QsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJsdGxyLSIsICBYTE9DQigxOSxCT1QsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJsdGxyKyIsICBYTE9DQigxOSxCT1RQLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibHRyIiwgICAgWExPQ0IoMTksQk9ULENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibHRscmwiLCAgWExPQ0IoMTksQk9ULENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibHRscmwtIiwgWExPQ0IoMTksQk9ULENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibHRscmwrIiwgWExPQ0IoMTksQk9UUCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmx0cmwiLCAgIFhMT0NCKDE5LEJPVCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmd0bHIiLCAgIFhMT0NCKDE5LEJPVCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmd0bHItIiwgIFhMT0NCKDE5LEJPVCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmd0bHIrIiwgIFhMT0NCKDE5LEJPVFAsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJndHIiLCAgICBYTE9DQigxOSxCT1QsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJndGxybCIsICBYTE9DQigxOSxCT1QsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJndGxybC0iLCBYTE9DQigxOSxCT1QsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJndGxybCsiLCBYTE9DQigxOSxCT1RQLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZ3RybCIsICAgWExPQ0IoMTksQk9ULENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJiZXFsciIsICAgWExPQ0IoMTksQk9ULENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJiZXFsci0iLCAgWExPQ0IoMTksQk9ULENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZXFscisiLCAgWExPQ0IoMTksQk9UUCxDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmVxciIsICAgIFhMT0NCKDE5LEJPVCxDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmVxbHJsIiwgIFhMT0NCKDE5LEJPVCxDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmVxbHJsLSIsIFhMT0NCKDE5LEJPVCxDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmVxbHJsKyIsIFhMT0NCKDE5LEJPVFAsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJlcXJsIiwgICBYTE9DQigxOSxCT1QsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJzb2xyIiwgICBYTE9DQigxOSxCT1QsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJzb2xyLSIsICBYTE9DQigxOSxCT1QsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJzb2xyKyIsICBYTE9DQigxOSxCT1RQLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJic29yIiwgICAgWExPQ0IoMTksQk9ULENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJic29scmwiLCAgWExPQ0IoMTksQk9ULENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJic29scmwtIiwgWExPQ0IoMTksQk9ULENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJic29scmwrIiwgWExPQ0IoMTksQk9UUCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYnNvcmwiLCAgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYnVubHIiLCAgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYnVubHItIiwgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYnVubHIrIiwgIFhMT0NCKDE5LEJPVFAsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJ1bmxybCIsICBYTE9DQigxOSxCT1QsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJ1bmxybC0iLCBYTE9DQigxOSxCT1QsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJ1bmxybCsiLCBYTE9DQigxOSxCT1RQLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZ2VsciIsICAgWExPQ0IoMTksQk9GLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJiZ2Vsci0iLCAgWExPQ0IoMTksQk9GLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZ2VscisiLCAgWExPQ0IoMTksQk9GUCxDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmdlciIsICAgIFhMT0NCKDE5LEJPRixDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmdlbHJsIiwgIFhMT0NCKDE5LEJPRixDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmdlbHJsLSIsIFhMT0NCKDE5LEJPRixDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmdlbHJsKyIsIFhMT0NCKDE5LEJPRlAsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJnZXJsIiwgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJubGxyIiwgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJubGxyLSIsICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJubGxyKyIsICBYTE9DQigxOSxCT0ZQLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmxyIiwgICAgWExPQ0IoMTksQk9GLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibmxscmwiLCAgWExPQ0IoMTksQk9GLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibmxscmwtIiwgWExPQ0IoMTksQk9GLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmxscmwrIiwgWExPQ0IoMTksQk9GUCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5scmwiLCAgIFhMT0NCKDE5LEJPRixDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmxlbHIiLCAgIFhMT0NCKDE5LEJPRixDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmxlbHItIiwgIFhMT0NCKDE5LEJPRixDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmxlbHIrIiwgIFhMT0NCKDE5LEJPRlAsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJsZXIiLCAgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJsZWxybCIsICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJsZWxybC0iLCBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJsZWxybCsiLCBYTE9DQigxOSxCT0ZQLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibGVybCIsICAgWExPQ0IoMTksQk9GLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibmdsciIsICAgWExPQ0IoMTksQk9GLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibmdsci0iLCAgWExPQ0IoMTksQk9GLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmdscisiLCAgWExPQ0IoMTksQk9GUCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5nciIsICAgIFhMT0NCKDE5LEJPRixDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYm5nbHJsIiwgIFhMT0NCKDE5LEJPRixDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5nbHJsLSIsIFhMT0NCKDE5LEJPRixDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5nbHJsKyIsIFhMT0NCKDE5LEJPRlAsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuZ3JsIiwgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJuZWxyIiwgICBYTE9DQigxOSxCT0YsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJuZWxyLSIsICBYTE9DQigxOSxCT0YsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuZWxyKyIsICBYTE9DQigxOSxCT0ZQLENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmVyIiwgICAgWExPQ0IoMTksQk9GLENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibmVscmwiLCAgWExPQ0IoMTksQk9GLENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibmVscmwtIiwgWExPQ0IoMTksQk9GLENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmVscmwrIiwgWExPQ0IoMTksQk9GUCxDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5lcmwiLCAgIFhMT0NCKDE5LEJPRixDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYm5zbHIiLCAgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5zbHItIiwgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5zbHIrIiwgIFhMT0NCKDE5LEJPRlAsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuc3IiLCAgICBYTE9DQigxOSxCT0YsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJuc2xybCIsICBYTE9DQigxOSxCT0YsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJuc2xybC0iLCBYTE9DQigxOSxCT0YsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuc2xybCsiLCBYTE9DQigxOSxCT0ZQLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibnNybCIsICAgWExPQ0IoMTksQk9GLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibnVsciIsICAgWExPQ0IoMTksQk9GLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibnVsci0iLCAgWExPQ0IoMTksQk9GLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibnVscisiLCAgWExPQ0IoMTksQk9GUCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm51bHJsIiwgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm51bHJsLSIsIFhMT0NCKDE5LEJPRixDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm51bHJsKyIsIFhMT0NCKDE5LEJPRlAsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJ0bHIiLCAgICBYTE8oMTksQk9ULDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJ0bHItIiwgICBYTE8oMTksQk9ULDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJ0bHIrIiwgICBYTE8oMTksQk9UUCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiYnRyIiwgICAgWExPKDE5LEJPVCwxNiwwKSwgWExCT0JCX01BU0ssIFBXUkNPTSwJeyBCSSB9IH0sCi17ICJidGxybCIsICAgWExPKDE5LEJPVCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJidGxybC0iLCAgWExPKDE5LEJPVCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJidGxybCsiLCAgWExPKDE5LEJPVFAsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmJ0cmwiLCAgIFhMTygxOSxCT1QsMTYsMSksIFhMQk9CQl9NQVNLLCBQV1JDT00sCXsgQkkgfSB9LAoteyAiYmZsciIsICAgIFhMTygxOSxCT0YsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmZsci0iLCAgIFhMTygxOSxCT0YsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmZscisiLCAgIFhMTygxOSxCT0ZQLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJiZnIiLCAgICBYTE8oMTksQk9GLDE2LDApLCBYTEJPQkJfTUFTSywgUFdSQ09NLAl7IEJJIH0gfSwKLXsgImJmbHJsIiwgICBYTE8oMTksQk9GLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJmbHJsLSIsICBYTE8oMTksQk9GLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJmbHJsKyIsICBYTE8oMTksQk9GUCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiYmZybCIsICAgWExPKDE5LEJPRiwxNiwxKSwgWExCT0JCX01BU0ssIFBXUkNPTSwJeyBCSSB9IH0sCi17ICJiZG56dGxyIiwgWExPKDE5LEJPRE5aVCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZG56dGxyLSIsWExPKDE5LEJPRE5aVCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZG56dGxyKyIsWExPKDE5LEJPRE5aVFAsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmRuenRscmwiLFhMTygxOSxCT0ROWlQsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmRuenRscmwtIixYTE8oMTksQk9ETlpULDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkbnp0bHJsKyIsWExPKDE5LEJPRE5aVFAsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmRuemZsciIsIFhMTygxOSxCT0ROWkYsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmRuemZsci0iLFhMTygxOSxCT0ROWkYsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmRuemZscisiLFhMTygxOSxCT0ROWkZQLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkbnpmbHJsIixYTE8oMTksQk9ETlpGLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkbnpmbHJsLSIsWExPKDE5LEJPRE5aRiwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZG56ZmxybCsiLFhMTygxOSxCT0ROWkZQLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkenRsciIsICBYTE8oMTksQk9EWlQsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmR6dGxyLSIsIFhMTygxOSxCT0RaVCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZHp0bHIrIiwgWExPKDE5LEJPRFpUUCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZHp0bHJsIiwgWExPKDE5LEJPRFpULDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkenRscmwtIixYTE8oMTksQk9EWlQsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmR6dGxybCsiLFhMTygxOSxCT0RaVFAsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmR6ZmxyIiwgIFhMTygxOSxCT0RaRiwxNiwwKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZHpmbHItIiwgWExPKDE5LEJPRFpGLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkemZscisiLCBYTE8oMTksQk9EWkZQLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkemZscmwiLCBYTE8oMTksQk9EWkYsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmR6ZmxybC0iLFhMTygxOSxCT0RaRiwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZHpmbHJsKyIsWExPKDE5LEJPRFpGUCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiY2xyIiwgICAgWExMSygxOSwxNiwwKSwgWExZQkJfTUFTSywJUFBDQ09NLAkJeyBCTywgQkkgfSB9LAoteyAiYmNscmwiLCAgIFhMTEsoMTksMTYsMSksIFhMWUJCX01BU0ssCVBQQ0NPTSwJCXsgQk8sIEJJIH0gfSwKLXsgImJjbHIrIiwgICBYTFlMSygxOSwxNiwxLDApLCBYTFlCQl9NQVNLLCBQUEMsCQl7IEJPRSwgQkkgfSB9LAoteyAiYmNscmwrIiwgIFhMWUxLKDE5LDE2LDEsMSksIFhMWUJCX01BU0ssIFBQQywJCXsgQk9FLCBCSSB9IH0sCi17ICJiY2xyLSIsICAgWExZTEsoMTksMTYsMCwwKSwgWExZQkJfTUFTSywgUFBDLAkJeyBCT0UsIEJJIH0gfSwKLXsgImJjbHJsLSIsICBYTFlMSygxOSwxNiwwLDEpLCBYTFlCQl9NQVNLLCBQUEMsCQl7IEJPRSwgQkkgfSB9LAoteyAiYmNyIiwgICAgIFhMTEsoMTksMTYsMCksIFhMQkJfTUFTSywJUFdSQ09NLAkJeyBCTywgQkkgfSB9LAoteyAiYmNybCIsICAgIFhMTEsoMTksMTYsMSksIFhMQkJfTUFTSywJUFdSQ09NLAkJeyBCTywgQkkgfSB9LAotCi17ICJjcm5vdCIsICAgWEwoMTksMzMpLCBYTF9NQVNLLAlQUENDT00sCQl7IEJULCBCQSwgQkJBIH0gfSwKLXsgImNybm9yIiwgICBYTCgxOSwzMyksCVhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCi0KLXsgInJmaSIsICAgICBYTCgxOSw1MCksCTB4ZmZmZmZmZmYsCUNPTSwJCXsgMCB9IH0sCi17ICJyZmNpIiwgICAgWEwoMTksNTEpLAkweGZmZmZmZmZmLAlQUEMsCQl7IDAgfSB9LAotCi17ICJyZnN2YyIsICAgWEwoMTksODIpLAkweGZmZmZmZmZmLAlQT1dFUiwJCXsgMCB9IH0sCi0KLXsgImNyYW5kYyIsICBYTCgxOSwxMjkpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAotCi17ICJpc3luYyIsICAgWEwoMTksMTUwKSwgMHhmZmZmZmZmZiwJUFBDQ09NLAkJeyAwIH0gfSwKLXsgImljcyIsICAgICBYTCgxOSwxNTApLCAweGZmZmZmZmZmLAlQV1JDT00sCQl7IDAgfSB9LAotCi17ICJjcmNsciIsICAgWEwoMTksMTkzKSwgWExfTUFTSywJUFBDQ09NLAkJeyBCVCwgQkFULCBCQkEgfSB9LAoteyAiY3J4b3IiLCAgIFhMKDE5LDE5MyksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCi0KLXsgImNybmFuZCIsICBYTCgxOSwyMjUpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAotCi17ICJjcmFuZCIsICAgWEwoMTksMjU3KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKLQoteyAiY3JzZXQiLCAgIFhMKDE5LDI4OSksIFhMX01BU0ssCVBQQ0NPTSwJCXsgQlQsIEJBVCwgQkJBIH0gfSwKLXsgImNyZXF2IiwgICBYTCgxOSwyODkpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAotCi17ICJjcm9yYyIsICAgWEwoMTksNDE3KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKLQoteyAiY3Jtb3ZlIiwgIFhMKDE5LDQ0OSksIFhMX01BU0ssCVBQQ0NPTSwJCXsgQlQsIEJBLCBCQkEgfSB9LAoteyAiY3JvciIsICAgIFhMKDE5LDQ0OSksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCi0KLXsgImJjdHIiLCAgICBYTE8oMTksQk9VLDUyOCwwKSwgWExCT0JJQkJfTUFTSywgQ09NLAl7IDAgfSB9LAoteyAiYmN0cmwiLCAgIFhMTygxOSxCT1UsNTI4LDEpLCBYTEJPQklCQl9NQVNLLCBDT00sCXsgMCB9IH0sCi17ICJibHRjdHIiLCAgWExPQ0IoMTksQk9ULENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJsdGN0ci0iLCBYTE9DQigxOSxCT1QsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmx0Y3RyKyIsIFhMT0NCKDE5LEJPVFAsQ0JMVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibHRjdHJsIiwgWExPQ0IoMTksQk9ULENCTFQsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJsdGN0cmwtIixYTE9DQigxOSxCT1QsQ0JMVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmx0Y3RybCsiLFhMT0NCKDE5LEJPVFAsQ0JMVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZ3RjdHIiLCAgWExPQ0IoMTksQk9ULENCR1QsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJndGN0ci0iLCBYTE9DQigxOSxCT1QsQ0JHVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmd0Y3RyKyIsIFhMT0NCKDE5LEJPVFAsQ0JHVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZ3RjdHJsIiwgWExPQ0IoMTksQk9ULENCR1QsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJndGN0cmwtIixYTE9DQigxOSxCT1QsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmd0Y3RybCsiLFhMT0NCKDE5LEJPVFAsQ0JHVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZXFjdHIiLCAgWExPQ0IoMTksQk9ULENCRVEsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJlcWN0ci0iLCBYTE9DQigxOSxCT1QsQ0JFUSw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmVxY3RyKyIsIFhMT0NCKDE5LEJPVFAsQ0JFUSw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZXFjdHJsIiwgWExPQ0IoMTksQk9ULENCRVEsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJlcWN0cmwtIixYTE9DQigxOSxCT1QsQ0JFUSw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmVxY3RybCsiLFhMT0NCKDE5LEJPVFAsQ0JFUSw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJic29jdHIiLCAgWExPQ0IoMTksQk9ULENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJzb2N0ci0iLCBYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYnNvY3RyKyIsIFhMT0NCKDE5LEJPVFAsQ0JTTyw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJic29jdHJsIiwgWExPQ0IoMTksQk9ULENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJzb2N0cmwtIixYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYnNvY3RybCsiLFhMT0NCKDE5LEJPVFAsQ0JTTyw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJidW5jdHIiLCAgWExPQ0IoMTksQk9ULENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJ1bmN0ci0iLCBYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYnVuY3RyKyIsIFhMT0NCKDE5LEJPVFAsQ0JTTyw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJidW5jdHJsIiwgWExPQ0IoMTksQk9ULENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJ1bmN0cmwtIixYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYnVuY3RybCsiLFhMT0NCKDE5LEJPVFAsQ0JTTyw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZ2VjdHIiLCAgWExPQ0IoMTksQk9GLENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJnZWN0ci0iLCBYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmdlY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JMVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZ2VjdHJsIiwgWExPQ0IoMTksQk9GLENCTFQsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJnZWN0cmwtIixYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmdlY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JMVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmxjdHIiLCAgWExPQ0IoMTksQk9GLENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJubGN0ci0iLCBYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5sY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JMVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmxjdHJsIiwgWExPQ0IoMTksQk9GLENCTFQsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJubGN0cmwtIixYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5sY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JMVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibGVjdHIiLCAgWExPQ0IoMTksQk9GLENCR1QsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJsZWN0ci0iLCBYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmxlY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JHVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibGVjdHJsIiwgWExPQ0IoMTksQk9GLENCR1QsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJsZWN0cmwtIixYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmxlY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JHVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmdjdHIiLCAgWExPQ0IoMTksQk9GLENCR1QsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuZ2N0ci0iLCBYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5nY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JHVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmdjdHJsIiwgWExPQ0IoMTksQk9GLENCR1QsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuZ2N0cmwtIixYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5nY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JHVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmVjdHIiLCAgWExPQ0IoMTksQk9GLENCRVEsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuZWN0ci0iLCBYTE9DQigxOSxCT0YsQ0JFUSw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5lY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JFUSw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmVjdHJsIiwgWExPQ0IoMTksQk9GLENCRVEsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuZWN0cmwtIixYTE9DQigxOSxCT0YsQ0JFUSw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5lY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JFUSw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibnNjdHIiLCAgWExPQ0IoMTksQk9GLENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuc2N0ci0iLCBYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5zY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JTTyw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibnNjdHJsIiwgWExPQ0IoMTksQk9GLENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuc2N0cmwtIixYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5zY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JTTyw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibnVjdHIiLCAgWExPQ0IoMTksQk9GLENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJudWN0ci0iLCBYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm51Y3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JTTyw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibnVjdHJsIiwgWExPQ0IoMTksQk9GLENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJudWN0cmwtIixYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm51Y3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JTTyw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJidGN0ciIsICAgWExPKDE5LEJPVCw1MjgsMCksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJ0Y3RyLSIsICBYTE8oMTksQk9ULDUyOCwwKSwgIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYnRjdHIrIiwgIFhMTygxOSxCT1RQLDUyOCwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJidGN0cmwiLCAgWExPKDE5LEJPVCw1MjgsMSksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJ0Y3RybC0iLCBYTE8oMTksQk9ULDUyOCwxKSwgIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYnRjdHJsKyIsIFhMTygxOSxCT1RQLDUyOCwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZmN0ciIsICAgWExPKDE5LEJPRiw1MjgsMCksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJmY3RyLSIsICBYTE8oMTksQk9GLDUyOCwwKSwgIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmZjdHIrIiwgIFhMTygxOSxCT0ZQLDUyOCwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZmN0cmwiLCAgWExPKDE5LEJPRiw1MjgsMSksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJmY3RybC0iLCBYTE8oMTksQk9GLDUyOCwxKSwgIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmZjdHJsKyIsIFhMTygxOSxCT0ZQLDUyOCwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiY2N0ciIsICAgWExMSygxOSw1MjgsMCksICAgICBYTFlCQl9NQVNLLCAgUFBDQ09NLAl7IEJPLCBCSSB9IH0sCi17ICJiY2N0ci0iLCAgWExZTEsoMTksNTI4LDAsMCksICBYTFlCQl9NQVNLLCAgUFBDLAl7IEJPRSwgQkkgfSB9LAoteyAiYmNjdHIrIiwgIFhMWUxLKDE5LDUyOCwxLDApLCAgWExZQkJfTUFTSywgIFBQQywJeyBCT0UsIEJJIH0gfSwKLXsgImJjY3RybCIsICBYTExLKDE5LDUyOCwxKSwgICAgIFhMWUJCX01BU0ssICBQUENDT00sCXsgQk8sIEJJIH0gfSwKLXsgImJjY3RybC0iLCBYTFlMSygxOSw1MjgsMCwxKSwgIFhMWUJCX01BU0ssICBQUEMsCXsgQk9FLCBCSSB9IH0sCi17ICJiY2N0cmwrIiwgWExZTEsoMTksNTI4LDEsMSksICBYTFlCQl9NQVNLLCAgUFBDLAl7IEJPRSwgQkkgfSB9LAoteyAiYmNjIiwgICAgIFhMTEsoMTksNTI4LDApLCAgICAgWExCQl9NQVNLLCAgIFBXUkNPTSwJeyBCTywgQkkgfSB9LAoteyAiYmNjbCIsICAgIFhMTEsoMTksNTI4LDEpLCAgICAgWExCQl9NQVNLLCAgIFBXUkNPTSwJeyBCTywgQkkgfSB9LAotCi17ICJybHdpbWkiLCAgTSgyMCwwKSwJTV9NQVNLLAkJUFBDQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAoteyAicmxpbWkiLCAgIE0oMjAsMCksCU1fTUFTSywJCVBXUkNPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLQoteyAicmx3aW1pLiIsIE0oMjAsMSksCU1fTUFTSywJCVBQQ0NPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLXsgInJsaW1pLiIsICBNKDIwLDEpLAlNX01BU0ssCQlQV1JDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCi0KLXsgInJvdGx3aSIsICBNTUUoMjEsMzEsMCksIE1NQk1FX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBTSCB9IH0sCi17ICJjbHJsd2kiLCAgTU1FKDIxLDMxLDApLCBNU0hNRV9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgTUIgfSB9LAoteyAicmx3aW5tIiwgIE0oMjEsMCksCU1fTUFTSywJCVBQQ0NPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLXsgInJsaW5tIiwgICBNKDIxLDApLAlNX01BU0ssCQlQV1JDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCi17ICJyb3Rsd2kuIiwgTU1FKDIxLDMxLDEpLCBNTUJNRV9NQVNLLAlQUENDT00sCQl7IFJBLFJTLFNIIH0gfSwKLXsgImNscmx3aS4iLCBNTUUoMjEsMzEsMSksIE1TSE1FX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBNQiB9IH0sCi17ICJybHdpbm0uIiwgTSgyMSwxKSwJTV9NQVNLLAkJUFBDQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAoteyAicmxpbm0uIiwgIE0oMjEsMSksCU1fTUFTSywJCVBXUkNPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLQoteyAicmxtaSIsICAgIE0oMjIsMCksCU1fTUFTSywJCU02MDEsCQl7IFJBLFJTLFJCLE1CRSxNRSB9IH0sCi17ICJybG1pLiIsICAgTSgyMiwxKSwJTV9NQVNLLAkJTTYwMSwJCXsgUkEsUlMsUkIsTUJFLE1FIH0gfSwKLQoteyAicm90bHciLCAgIE1NRSgyMywzMSwwKSwgTU1CTUVfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInJsd25tIiwgICBNKDIzLDApLAlNX01BU0ssCQlQUENDT00sCQl7IFJBLFJTLFJCLE1CRSxNRSB9IH0sCi17ICJybG5tIiwgICAgTSgyMywwKSwJTV9NQVNLLAkJUFdSQ09NLAkJeyBSQSxSUyxSQixNQkUsTUUgfSB9LAoteyAicm90bHcuIiwgIE1NRSgyMywzMSwxKSwgTU1CTUVfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInJsd25tLiIsICBNKDIzLDEpLAlNX01BU0ssCQlQUENDT00sCQl7IFJBLFJTLFJCLE1CRSxNRSB9IH0sCi17ICJybG5tLiIsICAgTSgyMywxKSwJTV9NQVNLLAkJUFdSQ09NLAkJeyBSQSxSUyxSQixNQkUsTUUgfSB9LAotCi17ICJub3AiLCAgICAgT1AoMjQpLAkweGZmZmZmZmZmLAlQUENDT00sCQl7IDAgfSB9LAoteyAib3JpIiwgICAgIE9QKDI0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLXsgIm9yaWwiLCAgICBPUCgyNCksCU9QX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi0KLXsgIm9yaXMiLCAgICBPUCgyNSksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi17ICJvcml1IiwgICAgT1AoMjUpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgVUkgfSB9LAotCi17ICJ4b3JpIiwgICAgT1AoMjYpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgVUkgfSB9LAoteyAieG9yaWwiLCAgIE9QKDI2KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLQoteyAieG9yaXMiLCAgIE9QKDI3KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLXsgInhvcml1IiwgICBPUCgyNyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi0KLXsgImFuZGkuIiwgICBPUCgyOCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi17ICJhbmRpbC4iLCAgT1AoMjgpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgVUkgfSB9LAotCi17ICJhbmRpcy4iLCAgT1AoMjkpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgVUkgfSB9LAoteyAiYW5kaXUuIiwgIE9QKDI5KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLQoteyAicm90bGRpIiwgIE1EKDMwLDAsMCksIE1ETUJfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2IH0gfSwKLXsgImNscmxkaSIsICBNRCgzMCwwLDApLCBNRFNIX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIE1CNiB9IH0sCi17ICJybGRpY2wiLCAgTUQoMzAsMCwwKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNQjYgfSB9LAoteyAicm90bGRpLiIsIE1EKDMwLDAsMSksIE1ETUJfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2IH0gfSwKLXsgImNscmxkaS4iLCBNRCgzMCwwLDEpLCBNRFNIX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIE1CNiB9IH0sCi17ICJybGRpY2wuIiwgTUQoMzAsMCwxKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNQjYgfSB9LAotCi17ICJybGRpY3IiLCAgTUQoMzAsMSwwKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNRTYgfSB9LAoteyAicmxkaWNyLiIsIE1EKDMwLDEsMSksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUU2IH0gfSwKLQoteyAicmxkaWMiLCAgIE1EKDMwLDIsMCksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUI2IH0gfSwKLXsgInJsZGljLiIsICBNRCgzMCwyLDEpLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1CNiB9IH0sCi0KLXsgInJsZGltaSIsICBNRCgzMCwzLDApLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1CNiB9IH0sCi17ICJybGRpbWkuIiwgTUQoMzAsMywxKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNQjYgfSB9LAotCi17ICJyb3RsZCIsICAgTURTKDMwLDgsMCksIE1EU01CX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInJsZGNsIiwgICBNRFMoMzAsOCwwKSwgTURTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCLCBNQjYgfSB9LAoteyAicm90bGQuIiwgIE1EUygzMCw4LDEpLCBNRFNNQl9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJybGRjbC4iLCAgTURTKDMwLDgsMSksIE1EU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiwgTUI2IH0gfSwKLQoteyAicmxkY3IiLCAgIE1EUygzMCw5LDApLCBNRFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIsIE1FNiB9IH0sCi17ICJybGRjci4iLCAgTURTKDMwLDksMSksIE1EU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiwgTUU2IH0gfSwKLQoteyAiY21wdyIsICAgIFhDTVBMKDMxLDAsMCksIFhDTVBMX01BU0ssIFBQQ0NPTSwJCXsgT0JGLCBSQSwgUkIgfSB9LAoteyAiY21wZCIsICAgIFhDTVBMKDMxLDAsMSksIFhDTVBMX01BU0ssIFBQQzY0LAkJeyBPQkYsIFJBLCBSQiB9IH0sCi17ICJjbXAiLCAgICAgWCgzMSwwKSwJWENNUF9NQVNLLAlQUENPTkxZLAl7IEJGLCBMLCBSQSwgUkIgfSB9LAoteyAiY21wIiwgICAgIFgoMzEsMCksCVhDTVBMX01BU0ssCVBXUkNPTSwJCXsgQkYsIFJBLCBSQiB9IH0sCi0KLXsgInR3bGd0IiwgICBYVE8oMzEsNCxUT0xHVCksIFhUT19NQVNLLCBQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bGd0IiwgICAgWFRPKDMxLDQsVE9MR1QpLCBYVE9fTUFTSywgUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdsbHQiLCAgIFhUTygzMSw0LFRPTExUKSwgWFRPX01BU0ssIFBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsbHQiLCAgICBYVE8oMzEsNCxUT0xMVCksIFhUT19NQVNLLCBQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2VxIiwgICAgWFRPKDMxLDQsVE9FUSksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZXEiLCAgICAgWFRPKDMxLDQsVE9FUSksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2xnZSIsICAgWFRPKDMxLDQsVE9MR0UpLCBYVE9fTUFTSywgUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGxnZSIsICAgIFhUTygzMSw0LFRPTEdFKSwgWFRPX01BU0ssIFBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bG5sIiwgICBYVE8oMzEsNCxUT0xOTCksIFhUT19NQVNLLCBQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bG5sIiwgICAgWFRPKDMxLDQsVE9MTkwpLCBYVE9fTUFTSywgUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdsbGUiLCAgIFhUTygzMSw0LFRPTExFKSwgWFRPX01BU0ssIFBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsbGUiLCAgICBYVE8oMzEsNCxUT0xMRSksIFhUT19NQVNLLCBQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2xuZyIsICAgWFRPKDMxLDQsVE9MTkcpLCBYVE9fTUFTSywgUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGxuZyIsICAgIFhUTygzMSw0LFRPTE5HKSwgWFRPX01BU0ssIFBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3Z3QiLCAgICBYVE8oMzEsNCxUT0dUKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRndCIsICAgICBYVE8oMzEsNCxUT0dUKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3Z2UiLCAgICBYVE8oMzEsNCxUT0dFKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRnZSIsICAgICBYVE8oMzEsNCxUT0dFKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bmwiLCAgICBYVE8oMzEsNCxUT05MKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRubCIsICAgICBYVE8oMzEsNCxUT05MKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bHQiLCAgICBYVE8oMzEsNCxUT0xUKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsdCIsICAgICBYVE8oMzEsNCxUT0xUKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bGUiLCAgICBYVE8oMzEsNCxUT0xFKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsZSIsICAgICBYVE8oMzEsNCxUT0xFKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bmciLCAgICBYVE8oMzEsNCxUT05HKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRuZyIsICAgICBYVE8oMzEsNCxUT05HKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bmUiLCAgICBYVE8oMzEsNCxUT05FKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRuZSIsICAgICBYVE8oMzEsNCxUT05FKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRyYXAiLCAgICBYVE8oMzEsNCxUT1UpLCAweGZmZmZmZmZmLAlQUENDT00sCQl7IDAgfSB9LAoteyAidHciLCAgICAgIFgoMzEsNCksCVhfTUFTSywJCVBQQ0NPTSwJCXsgVE8sIFJBLCBSQiB9IH0sCi17ICJ0IiwgICAgICAgWCgzMSw0KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBUTywgUkEsIFJCIH0gfSwKLQoteyAic3ViZmMiLCAgIFhPKDMxLDgsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInNmIiwgICAgICBYTygzMSw4LDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJjIiwgICAgWE8oMzEsOCwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAoteyAic3ViZmMuIiwgIFhPKDMxLDgsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInNmLiIsICAgICBYTygzMSw4LDAsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJjLiIsICAgWE8oMzEsOCwwLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQiwgUkEgfSB9LAoteyAic3ViZmNvIiwgIFhPKDMxLDgsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInNmbyIsICAgICBYTygzMSw4LDEsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJjbyIsICAgWE8oMzEsOCwxLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAoteyAic3ViZmNvLiIsIFhPKDMxLDgsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInNmby4iLCAgICBYTygzMSw4LDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJjby4iLCAgWE8oMzEsOCwxLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAotCi17ICJtdWxoZHUiLCAgWE8oMzEsOSwwLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxoZHUuIiwgWE8oMzEsOSwwLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImFkZGMiLCAgICBYTygzMSwxMCwwLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYSIsICAgICAgIFhPKDMxLDEwLDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGRjLiIsICAgWE8oMzEsMTAsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImEuIiwgICAgICBYTygzMSwxMCwwLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYWRkY28iLCAgIFhPKDMxLDEwLDEsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhbyIsICAgICAgWE8oMzEsMTAsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZGNvLiIsICBYTygzMSwxMCwxLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYW8uIiwgICAgIFhPKDMxLDEwLDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm11bGh3dSIsICBYTygzMSwxMSwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsaHd1LiIsIFhPKDMxLDExLDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm1mY3IiLCAgICBYKDMxLDE5KSwJWFJBUkJfTUFTSywJQ09NLAkJeyBSVCB9IH0sCi0KLXsgImx3YXJ4IiwgICBYKDMxLDIwKSwJWF9NQVNLLAkJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibGR4IiwgICAgIFgoMzEsMjEpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImx3engiLCAgICBYKDMxLDIzKSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImx4IiwgICAgICBYKDMxLDIzKSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAic2x3IiwgICAgIFhSQygzMSwyNCwwKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2wiLCAgICAgIFhSQygzMSwyNCwwKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2x3LiIsICAgIFhSQygzMSwyNCwxKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2wuIiwgICAgIFhSQygzMSwyNCwxKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJjbnRsenciLCAgWFJDKDMxLDI2LDApLCBYUkJfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMgfSB9LAoteyAiY250bHoiLCAgIFhSQygzMSwyNiwwKSwgWFJCX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTIH0gfSwKLXsgImNudGx6dy4iLCBYUkMoMzEsMjYsMSksIFhSQl9NQVNLLAlQUENDT00sCQl7IFJBLCBSUyB9IH0sCi17ICJjbnRsei4iLCAgWFJDKDMxLDI2LDEpLCBYUkJfTUFTSywgCVBXUkNPTSwJCXsgUkEsIFJTIH0gfSwKLQoteyAic2xkIiwgICAgIFhSQygzMSwyNywwKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzbGQuIiwgICAgWFJDKDMxLDI3LDEpLCBYX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAiYW5kIiwgICAgIFhSQygzMSwyOCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAiYW5kLiIsICAgIFhSQygzMSwyOCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJtYXNrZyIsICAgWFJDKDMxLDI5LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAibWFza2cuIiwgIFhSQygzMSwyOSwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAiY21wbHciLCAgIFhDTVBMKDMxLDMyLDApLCBYQ01QTF9NQVNLLCBQUENDT00sCXsgT0JGLCBSQSwgUkIgfSB9LAoteyAiY21wbGQiLCAgIFhDTVBMKDMxLDMyLDEpLCBYQ01QTF9NQVNLLCBQUEM2NCwJCXsgT0JGLCBSQSwgUkIgfSB9LAoteyAiY21wbCIsICAgIFgoMzEsMzIpLAlYQ01QX01BU0ssCSBQUENPTkxZLAl7IEJGLCBMLCBSQSwgUkIgfSB9LAoteyAiY21wbCIsICAgIFgoMzEsMzIpLAlYQ01QTF9NQVNLLAkgUFdSQ09NLAl7IEJGLCBSQSwgUkIgfSB9LAotCi17ICJzdWJmIiwgICAgWE8oMzEsNDAsMCwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInN1YiIsICAgICBYTygzMSw0MCwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAoteyAic3ViZi4iLCAgIFhPKDMxLDQwLDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWIuIiwgICAgWE8oMzEsNDAsMCwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkIsIFJBIH0gfSwKLXsgInN1YmZvIiwgICBYTygzMSw0MCwxLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3VibyIsICAgIFhPKDMxLDQwLDEsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJCLCBSQSB9IH0sCi17ICJzdWJmby4iLCAgWE8oMzEsNDAsMSwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInN1Ym8uIiwgICBYTygzMSw0MCwxLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAotCi17ICJsZHV4IiwgICAgWCgzMSw1MyksCVhfTUFTSywJCVBQQzY0LAkJeyBSVCwgUkFMLCBSQiB9IH0sCi0KLXsgImRjYnN0IiwgICBYKDMxLDU0KSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAibHd6dXgiLCAgIFgoMzEsNTUpLAlYX01BU0ssCQlQUENDT00sCQl7IFJULCBSQUwsIFJCIH0gfSwKLXsgImx1eCIsICAgICBYKDMxLDU1KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiY250bHpkIiwgIFhSQygzMSw1OCwwKSwgWFJCX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMgfSB9LAoteyAiY250bHpkLiIsIFhSQygzMSw1OCwxKSwgWFJCX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMgfSB9LAotCi17ICJhbmRjIiwgICAgWFJDKDMxLDYwLDApLCBYX01BU0ssCUNPTSwJeyBSQSwgUlMsIFJCIH0gfSwKLXsgImFuZGMuIiwgICBYUkMoMzEsNjAsMSksIFhfTUFTSywJQ09NLAl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJ0ZGxndCIsICAgWFRPKDMxLDY4LFRPTEdUKSwgWFRPX01BU0ssIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRsbHQiLCAgIFhUTygzMSw2OCxUT0xMVCksIFhUT19NQVNLLCBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkZXEiLCAgICBYVE8oMzEsNjgsVE9FUSksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGxnZSIsICAgWFRPKDMxLDY4LFRPTEdFKSwgWFRPX01BU0ssIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRsbmwiLCAgIFhUTygzMSw2OCxUT0xOTCksIFhUT19NQVNLLCBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbGxlIiwgICBYVE8oMzEsNjgsVE9MTEUpLCBYVE9fTUFTSywgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGxuZyIsICAgWFRPKDMxLDY4LFRPTE5HKSwgWFRPX01BU0ssIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRndCIsICAgIFhUTygzMSw2OCxUT0dUKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkZ2UiLCAgICBYVE8oMzEsNjgsVE9HRSksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZG5sIiwgICAgWFRPKDMxLDY4LFRPTkwpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRsdCIsICAgIFhUTygzMSw2OCxUT0xUKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbGUiLCAgICBYVE8oMzEsNjgsVE9MRSksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZG5nIiwgICAgWFRPKDMxLDY4LFRPTkcpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRuZSIsICAgIFhUTygzMSw2OCxUT05FKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkIiwJICAgICBYKDMxLDY4KSwJWF9NQVNLLAkJIFBQQzY0LAkJeyBUTywgUkEsIFJCIH0gfSwKLQoteyAibXVsaGQiLCAgIFhPKDMxLDczLDAsMCksIFhPX01BU0ssCSBQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxoZC4iLCAgWE8oMzEsNzMsMCwxKSwgWE9fTUFTSywJIFBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibXVsaHciLCAgIFhPKDMxLDc1LDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxody4iLCAgWE8oMzEsNzUsMCwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibWZtc3IiLCAgIFgoMzEsODMpLAlYUkFSQl9NQVNLLAlDT00sCQl7IFJUIH0gfSwKLQoteyAibGRhcngiLCAgIFgoMzEsODQpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImRjYmYiLCAgICBYKDMxLDg2KSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAibGJ6eCIsICAgIFgoMzEsODcpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJuZWciLCAgICAgWE8oMzEsMTA0LDAsMCksIFhPUkJfTUFTSywJQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAibmVnLiIsICAgIFhPKDMxLDEwNCwwLDEpLCBYT1JCX01BU0ssCUNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgIm5lZ28iLCAgICBYTygzMSwxMDQsMSwwKSwgWE9SQl9NQVNLLAlDT00sCQl7IFJULCBSQSB9IH0sCi17ICJuZWdvLiIsICAgWE8oMzEsMTA0LDEsMSksIFhPUkJfTUFTSywJQ09NLAkJeyBSVCwgUkEgfSB9LAotCi17ICJtdWwiLCAgICAgWE8oMzEsMTA3LDAsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsLiIsICAgIFhPKDMxLDEwNywwLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bG8iLCAgICBYTygzMSwxMDcsMSwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxvLiIsICAgWE8oMzEsMTA3LDEsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJjbGYiLCAgICAgWCgzMSwxMTgpLCBYUkJfTUFTSywJUE9XRVIsCQl7IFJULCBSQSB9IH0sCi0KLXsgImxienV4IiwgICBYKDMxLDExOSksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBTCwgUkIgfSB9LAotCi17ICJub3QiLCAgICAgWFJDKDMxLDEyNCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkJTIH0gfSwKLXsgIm5vciIsICAgICBYUkMoMzEsMTI0LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJub3QuIiwgICAgWFJDKDMxLDEyNCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkJTIH0gfSwKLXsgIm5vci4iLCAgICBYUkMoMzEsMTI0LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgIndydGVlIiwgICBYKDMxLDEzMSksCVhSQVJCX01BU0ssCVBQQzQwMywJCXsgUlMgfSB9LAotCi17ICJzdWJmZSIsICAgWE8oMzEsMTM2LDAsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZmUiLCAgICAgWE8oMzEsMTM2LDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJmZS4iLCAgWE8oMzEsMTM2LDAsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZmUuIiwgICAgWE8oMzEsMTM2LDAsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJmZW8iLCAgWE8oMzEsMTM2LDEsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZmVvIiwgICAgWE8oMzEsMTM2LDEsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJmZW8uIiwgWE8oMzEsMTM2LDEsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZmVvLiIsICAgWE8oMzEsMTM2LDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImFkZGUiLCAgICBYTygzMSwxMzgsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFlIiwgICAgICBYTygzMSwxMzgsMCwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZGUuIiwgICBYTygzMSwxMzgsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFlLiIsICAgICBYTygzMSwxMzgsMCwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZGVvIiwgICBYTygzMSwxMzgsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFlbyIsICAgICBYTygzMSwxMzgsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZGVvLiIsICBYTygzMSwxMzgsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFlby4iLCAgICBYTygzMSwxMzgsMSwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibXRjciIsICAgIFhGWE0oMzEsMTQ0LDB4ZmYpLCBYRlhGWE1fTUFTS3xGWE1fTUFTSywgQ09NLAl7IFJTIH19LAoteyAibXRjcmYiLCAgIFgoMzEsMTQ0KSwJWEZYRlhNX01BU0ssCUNPTSwJCXsgRlhNLCBSUyB9IH0sCi0KLXsgIm10bXNyIiwgICBYKDMxLDE0NiksCVhSQVJCX01BU0ssCUNPTSwJCXsgUlMgfSB9LAotCi17ICJzdGR4IiwgICAgWCgzMSwxNDkpLCBYX01BU0ssCQlQUEM2NCwJCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInN0d2N4LiIsICBYUkMoMzEsMTUwLDEpLCBYX01BU0ssCVBQQywJCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInN0d3giLCAgICBYKDMxLDE1MSksIFhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi17ICJzdHgiLCAgICAgWCgzMSwxNTEpLCBYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzbHEiLCAgICAgWFJDKDMxLDE1MiwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNscS4iLCAgICBYUkMoMzEsMTUyLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzbGUiLCAgICAgWFJDKDMxLDE1MywwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNsZS4iLCAgICBYUkMoMzEsMTUzLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJ3cnRlZWkiLCAgWCgzMSwxNjMpLAlYRV9NQVNLLAlQUEM0MDMsCQl7IEUgfSB9LAotCi17ICJzdGR1eCIsICAgWCgzMSwxODEpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlMsIFJBUywgUkIgfSB9LAotCi17ICJzdHd1eCIsICAgWCgzMSwxODMpLAlYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQVMsIFJCIH0gfSwKLXsgInN0dXgiLCAgICBYKDMxLDE4MyksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInNsaXEiLCAgICBYUkMoMzEsMTg0LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic2xpcS4iLCAgIFhSQygzMSwxODQsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi0KLXsgInN1YmZ6ZSIsICBYTygzMSwyMDAsMCwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZnplIiwgICAgWE8oMzEsMjAwLDAsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic3ViZnplLiIsIFhPKDMxLDIwMCwwLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInNmemUuIiwgICBYTygzMSwyMDAsMCwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzdWJmemVvIiwgWE8oMzEsMjAwLDEsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic2Z6ZW8iLCAgIFhPKDMxLDIwMCwxLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInN1YmZ6ZW8uIixYTygzMSwyMDAsMSwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZnplby4iLCAgWE8oMzEsMjAwLDEsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAotCi17ICJhZGR6ZSIsICAgWE8oMzEsMjAyLDAsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYXplIiwgICAgIFhPKDMxLDIwMiwwLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFkZHplLiIsICBYTygzMSwyMDIsMCwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhemUuIiwgICAgWE8oMzEsMjAyLDAsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYWRkemVvIiwgIFhPKDMxLDIwMiwxLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImF6ZW8iLCAgICBYTygzMSwyMDIsMSwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhZGR6ZW8uIiwgWE8oMzEsMjAyLDEsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYXplby4iLCAgIFhPKDMxLDIwMiwxLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLQoteyAibXRzciIsICAgIFgoMzEsMjEwKSwJWFJCX01BU0t8KDE8PDIwKSwgQ09NMzIsCXsgU1IsIFJTIH0gfSwKLQoteyAic3RkY3guIiwgIFhSQygzMSwyMTQsMSksIFhfTUFTSywJUFBDNjQsCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzdGJ4IiwgICAgWCgzMSwyMTUpLAlYX01BU0ssCQlDT00sCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInNsbHEiLCAgICBYUkMoMzEsMjE2LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2xscS4iLCAgIFhSQygzMSwyMTYsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInNsZXEiLCAgICBYUkMoMzEsMjE3LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2xlcS4iLCAgIFhSQygzMSwyMTcsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInN1YmZtZSIsICBYTygzMSwyMzIsMCwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZm1lIiwgICAgWE8oMzEsMjMyLDAsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic3ViZm1lLiIsIFhPKDMxLDIzMiwwLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInNmbWUuIiwgICBYTygzMSwyMzIsMCwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzdWJmbWVvIiwgWE8oMzEsMjMyLDEsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic2ZtZW8iLCAgIFhPKDMxLDIzMiwxLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInN1YmZtZW8uIixYTygzMSwyMzIsMSwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZm1lby4iLCAgWE8oMzEsMjMyLDEsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAotCi17ICJtdWxsZCIsICAgWE8oMzEsMjMzLDAsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGxkLiIsICBYTygzMSwyMzMsMCwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsbGRvIiwgIFhPKDMxLDIzMywxLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxsZG8uIiwgWE8oMzEsMjMzLDEsMSksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiYWRkbWUiLCAgIFhPKDMxLDIzNCwwLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFtZSIsICAgICBYTygzMSwyMzQsMCwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhZGRtZS4iLCAgWE8oMzEsMjM0LDAsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYW1lLiIsICAgIFhPKDMxLDIzNCwwLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFkZG1lbyIsICBYTygzMSwyMzQsMSwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhbWVvIiwgICAgWE8oMzEsMjM0LDEsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYWRkbWVvLiIsIFhPKDMxLDIzNCwxLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFtZW8uIiwgICBYTygzMSwyMzQsMSwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi0KLXsgIm11bGx3IiwgICBYTygzMSwyMzUsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bHMiLCAgICBYTygzMSwyMzUsMCwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGx3LiIsICBYTygzMSwyMzUsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bHMuIiwgICBYTygzMSwyMzUsMCwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGx3byIsICBYTygzMSwyMzUsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bHNvIiwgICBYTygzMSwyMzUsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGx3by4iLCBYTygzMSwyMzUsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bHNvLiIsICBYTygzMSwyMzUsMSwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibXRzcmluIiwgIFgoMzEsMjQyKSwJWFJBX01BU0ssCVBQQzMyLAkJeyBSUywgUkIgfSB9LAoteyAibXRzcmkiLCAgIFgoMzEsMjQyKSwJWFJBX01BU0ssCVBPV0VSMzIsCXsgUlMsIFJCIH0gfSwKLQoteyAiZGNidHN0IiwgIFgoMzEsMjQ2KSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAic3RidXgiLCAgIFgoMzEsMjQ3KSwJWF9NQVNLLAkJQ09NLAkJeyBSUywgUkFTLCBSQiB9IH0sCi0KLXsgInNsbGlxIiwgICBYUkMoMzEsMjQ4LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic2xsaXEuIiwgIFhSQygzMSwyNDgsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi0KLXsgImRveiIsICAgICBYTygzMSwyNjQsMCwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkb3ouIiwgICAgWE8oMzEsMjY0LDAsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZG96byIsICAgIFhPKDMxLDI2NCwxLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRvem8uIiwgICBYTygzMSwyNjQsMSwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImFkZCIsICAgICBYTygzMSwyNjYsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImNheCIsICAgICBYTygzMSwyNjYsMCwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZC4iLCAgICBYTygzMSwyNjYsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImNheC4iLCAgICBYTygzMSwyNjYsMCwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZG8iLCAgICBYTygzMSwyNjYsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImNheG8iLCAgICBYTygzMSwyNjYsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZG8uIiwgICBYTygzMSwyNjYsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImNheG8uIiwgICBYTygzMSwyNjYsMSwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibHNjYngiLCAgIFhSQygzMSwyNzcsMCksIFhfTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJsc2NieC4iLCAgWFJDKDMxLDI3NywxKSwgWF9NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiZGNidCIsICAgIFgoMzEsMjc4KSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAibGh6eCIsICAgIFgoMzEsMjc5KSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiaWNidCIsICAgIFgoMzEsMjYyKSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAiZXF2IiwgICAgIFhSQygzMSwyODQsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgImVxdi4iLCAgICBYUkMoMzEsMjg0LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInRsYmllIiwgICBYKDMxLDMwNiksCVhSVFJBX01BU0ssCVBQQywJCXsgUkIgfSB9LAoteyAidGxiaSIsICAgIFgoMzEsMzA2KSwJWFJUX01BU0ssCVBPV0VSLAkJeyBSQSwgUkIgfSB9LAotCi17ICJlY2l3eCIsICAgWCgzMSwzMTApLCBYX01BU0ssCQlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJsaHp1eCIsICAgWCgzMSwzMTEpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQUwsIFJCIH0gfSwKLQoteyAieG9yIiwgICAgIFhSQygzMSwzMTYsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInhvci4iLCAgICBYUkMoMzEsMzE2LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgIm1mZXhpc3IiLCBYU1BSKDMxLDMyMyw2NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZXhpZXIiLCBYU1BSKDMxLDMyMyw2NiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYnIwIiwgICBYU1BSKDMxLDMyMywxMjgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJyMSIsICAgWFNQUigzMSwzMjMsMTI5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZicjIiLCAgIFhTUFIoMzEsMzIzLDEzMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYnIzIiwgICBYU1BSKDMxLDMyMywxMzEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJyNCIsICAgWFNQUigzMSwzMjMsMTMyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZicjUiLCAgIFhTUFIoMzEsMzIzLDEzMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYnI2IiwgICBYU1BSKDMxLDMyMywxMzQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJyNyIsICAgWFNQUigzMSwzMjMsMTM1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZiZWFyIiwgIFhTUFIoMzEsMzIzLDE0NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYmVzciIsICBYU1BSKDMxLDMyMywxNDUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmlvY3IiLCAgWFNQUigzMSwzMjMsMTYwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjcjAiLCBYU1BSKDMxLDMyMywxOTIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWN0MCIsIFhTUFIoMzEsMzIzLDE5MyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hZGEwIiwgWFNQUigzMSwzMjMsMTk0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFzYTAiLCBYU1BSKDMxLDMyMywxOTUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWNjMCIsIFhTUFIoMzEsMzIzLDE5NiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY3IxIiwgWFNQUigzMSwzMjMsMjAwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjdDEiLCBYU1BSKDMxLDMyMywyMDEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWRhMSIsIFhTUFIoMzEsMzIzLDIwMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hc2ExIiwgWFNQUigzMSwzMjMsMjAzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjYzEiLCBYU1BSKDMxLDMyMywyMDQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWNyMiIsIFhTUFIoMzEsMzIzLDIwOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY3QyIiwgWFNQUigzMSwzMjMsMjA5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFkYTIiLCBYU1BSKDMxLDMyMywyMTApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYXNhMiIsIFhTUFIoMzEsMzIzLDIxMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY2MyIiwgWFNQUigzMSwzMjMsMjEyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjcjMiLCBYU1BSKDMxLDMyMywyMTYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWN0MyIsIFhTUFIoMzEsMzIzLDIxNyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hZGEzIiwgWFNQUigzMSwzMjMsMjE4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFzYTMiLCBYU1BSKDMxLDMyMywyMTkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWNjMyIsIFhTUFIoMzEsMzIzLDIyMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hc3IiLCBYU1BSKDMxLDMyMywyMjQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRjciIsICAgWCgzMSwzMjMpLAlYX01BU0ssCQlQUEMsCQl7IFJULCBTUFIgfSB9LAotCi17ICJkaXYiLCAgICAgWE8oMzEsMzMxLDAsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2LiIsICAgIFhPKDMxLDMzMSwwLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdm8iLCAgICBYTygzMSwzMzEsMSwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZvLiIsICAgWE8oMzEsMzMxLDEsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJtZm1xIiwgICAgIFhTUFIoMzEsMzM5LDApLCAgIFhTUFJfTUFTSywgTTYwMSwJeyBSVCB9IH0sCi17ICJtZnhlciIsICAgIFhTUFIoMzEsMzM5LDEpLCAgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZnJ0Y3UiLCAgIFhTUFIoMzEsMzM5LDQpLCAgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZnJ0Y2wiLCAgIFhTUFIoMzEsMzM5LDUpLCAgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZmRlYyIsICAgIFhTUFIoMzEsMzM5LDYpLCAgIFhTUFJfTUFTSywgTUZERUMxLAl7IFJUIH0gfSwKLXsgIm1mbHIiLCAgICAgWFNQUigzMSwzMzksOCksICAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKLXsgIm1mY3RyIiwgICAgWFNQUigzMSwzMzksOSksICAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKLXsgIm1mdGlkIiwgICAgWFNQUigzMSwzMzksMTcpLCAgWFNQUl9NQVNLLCBQT1dFUiwJeyBSVCB9IH0sCi17ICJtZmRzaXNyIiwgIFhTUFIoMzEsMzM5LDE4KSwgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZmRhciIsICAgIFhTUFIoMzEsMzM5LDE5KSwgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZmRlYyIsICAgIFhTUFIoMzEsMzM5LDIyKSwgIFhTUFJfTUFTSywgTUZERUMyLAl7IFJUIH0gfSwKLXsgIm1mc2RyMCIsICAgWFNQUigzMSwzMzksMjQpLCAgWFNQUl9NQVNLLCBQT1dFUiwJeyBSVCB9IH0sCi17ICJtZnNkcjEiLCAgIFhTUFIoMzEsMzM5LDI1KSwgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZnNycjAiLCAgIFhTUFIoMzEsMzM5LDI2KSwgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZnNycjEiLCAgIFhTUFIoMzEsMzM5LDI3KSwgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZmNtcGEiLCAgIFhTUFIoMzEsMzM5LDE0NCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY21wYiIsICAgWFNQUigzMSwzMzksMTQ1KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjbXBjIiwgICBYU1BSKDMxLDMzOSwxNDYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNtcGQiLCAgIFhTUFIoMzEsMzM5LDE0NyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1maWNyIiwgICAgWFNQUigzMSwzMzksMTQ4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZkZXIiLCAgICBYU1BSKDMxLDMzOSwxNDkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNvdW50YSIsIFhTUFIoMzEsMzM5LDE1MCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY291bnRiIiwgWFNQUigzMSwzMzksMTUxKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjbXBlIiwgICBYU1BSKDMxLDMzOSwxNTIpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNtcGYiLCAgIFhTUFIoMzEsMzM5LDE1MyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY21wZyIsICAgWFNQUigzMSwzMzksMTU0KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjbXBoIiwgICBYU1BSKDMxLDMzOSwxNTUpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmxjdHJsMSIsIFhTUFIoMzEsMzM5LDE1NiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbGN0cmwyIiwgWFNQUigzMSwzMzksMTU3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZpY3RybCIsICBYU1BSKDMxLDMzOSwxNTgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmJhciIsICAgIFhTUFIoMzEsMzM5LDE1OSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mc3ByZyIsICAgWFNQUigzMSwzMzksMjcyKSwgWFNQUkdfTUFTSywgUFBDLAl7IFJULCBTUFJHIH0gfSwKLXsgIm1mc3ByZzAiLCAgWFNQUigzMSwzMzksMjcyKSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKLXsgIm1mc3ByZzEiLCAgWFNQUigzMSwzMzksMjczKSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKLXsgIm1mc3ByZzIiLCAgWFNQUigzMSwzMzksMjc0KSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKLXsgIm1mc3ByZzMiLCAgWFNQUigzMSwzMzksMjc1KSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKLXsgIm1mYXNyIiwgICAgWFNQUigzMSwzMzksMjgwKSwgWFNQUl9NQVNLLCBQUEM2NCwJeyBSVCB9IH0sCi17ICJtZmVhciIsICAgIFhTUFIoMzEsMzM5LDI4MiksIFhTUFJfTUFTSywgUFBDLAkJeyBSVCB9IH0sCi17ICJtZnB2ciIsICAgIFhTUFIoMzEsMzM5LDI4NyksIFhTUFJfTUFTSywgUFBDLAkJeyBSVCB9IH0sCi17ICJtZmliYXR1IiwgIFhTUFIoMzEsMzM5LDUyOCksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFJULCBTUFJCQVQgfSB9LAoteyAibWZpYmF0bCIsICBYU1BSKDMxLDMzOSw1MjkpLCBYU1BSQkFUX01BU0ssIFBQQywJeyBSVCwgU1BSQkFUIH0gfSwKLXsgIm1mZGJhdHUiLCAgWFNQUigzMSwzMzksNTM2KSwgWFNQUkJBVF9NQVNLLCBQUEMsCXsgUlQsIFNQUkJBVCB9IH0sCi17ICJtZmRiYXRsIiwgIFhTUFIoMzEsMzM5LDUzNyksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFJULCBTUFJCQVQgfSB9LAoteyAibWZpY19jc3QiLCBYU1BSKDMxLDMzOSw1NjApLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmljX2FkciIsIFhTUFIoMzEsMzM5LDU2MSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1maWNfZGF0IiwgWFNQUigzMSwzMzksNTYyKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZkY19jc3QiLCBYU1BSKDMxLDMzOSw1NjgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmRjX2FkciIsIFhTUFIoMzEsMzM5LDU2OSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mZGNfZGF0IiwgWFNQUigzMSwzMzksNTcwKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZkcGRyIiwgICBYU1BSKDMxLDMzOSw2MzApLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmRwaXIiLCAgIFhTUFIoMzEsMzM5LDYzMSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1maW1tciIsICAgWFNQUigzMSwzMzksNjM4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV9jdHIiLCBYU1BSKDMxLDMzOSw3ODQpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1pX2FwIiwgIFhTUFIoMzEsMzM5LDc4NiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWlfZXBuIiwgWFNQUigzMSwzMzksNzg3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV90d2MiLCBYU1BSKDMxLDMzOSw3ODkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1pX3JwbiIsIFhTUFIoMzEsMzM5LDc5MCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfY3RyIiwgWFNQUigzMSwzMzksNzkyKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtX2Nhc2lkIixYU1BSKDMxLDMzOSw3OTMpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX2FwIiwgIFhTUFIoMzEsMzM5LDc5NCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfZXBuIiwgWFNQUigzMSwzMzksNzk1KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtZF90d2IiLCBYU1BSKDMxLDMzOSw3OTYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX3R3YyIsIFhTUFIoMzEsMzM5LDc5NyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfcnBuIiwgWFNQUigzMSwzMzksNzk4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtX3R3IiwgICBYU1BSKDMxLDMzOSw3OTkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1pX2RiY2FtIixYU1BSKDMxLDMzOSw4MTYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1pX2RicmFtMCIsWFNQUigzMSwzMzksODE3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV9kYnJhbTEiLFhTUFIoMzEsMzM5LDgxOCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfZGJjYW0iLCBYU1BSKDMxLDMzOSw4MjQpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX2RicmFtMCIsWFNQUigzMSwzMzksODI1KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtZF9kYnJhbTEiLFhTUFIoMzEsMzM5LDgyNiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1menByIiwgICBYU1BSKDMxLDMzOSw5NDQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnBpZCIsICAgWFNQUigzMSwzMzksOTQ1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZpY2RiZHIiLFhTUFIoMzEsMzM5LDk3OSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mdW1tY3IwIiwJWFNQUigzMSwzMzksOTM2KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mdXBtYzEiLAlYU1BSKDMxLDMzOSw5MzcpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ1cG1jMiIsCVhTUFIoMzEsMzM5LDkzOCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnVzaWEiLAlYU1BSKDMxLDMzOSw5MzkpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ1bW1jcjEiLAlYU1BSKDMxLDMzOSw5NDApLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ1cG1jMyIsCVhTUFIoMzEsMzM5LDk0MSksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnVwbWM0IiwJWFNQUigzMSwzMzksOTQyKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mbW1jcjAiLAlYU1BSKDMxLDMzOSw5NTIpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZwbWMxIiwJWFNQUigzMSwzMzksOTUzKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mcG1jMiIsCVhTUFIoMzEsMzM5LDk1NCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnNpYSIsCVhTUFIoMzEsMzM5LDk1NSksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZm1tY3IxIiwJWFNQUigzMSwzMzksOTU2KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mcG1jMyIsCVhTUFIoMzEsMzM5LDk1NyksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnBtYzQiLAlYU1BSKDMxLDMzOSw5NTgpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZlc3IiLCAgIFhTUFIoMzEsMzM5LDk4MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZGVhciIsICBYU1BSKDMxLDMzOSw5ODEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmV2cHIiLCAgWFNQUigzMSwzMzksOTgyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZjZGJjciIsIFhTUFIoMzEsMzM5LDk4MyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mdHNyIiwgICBYU1BSKDMxLDMzOSw5ODQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnRjciIsICAgWFNQUigzMSwzMzksOTg2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZwaXQiLCAgIFhTUFIoMzEsMzM5LDk4NyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mdGJoaSIsICBYU1BSKDMxLDMzOSw5ODgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnRibG8iLCAgWFNQUigzMSwzMzksOTg5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZzcnIyIiwgIFhTUFIoMzEsMzM5LDk5MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mc3JyMyIsICBYU1BSKDMxLDMzOSw5OTEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRic3IiLCAgWFNQUigzMSwzMzksMTAwOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1maWFjMSIsICBYU1BSKDMxLDMzOSwxMDEyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZpYWMyIiwgIFhTUFIoMzEsMzM5LDEwMTMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRhYzEiLCAgWFNQUigzMSwzMzksMTAxNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZGFjMiIsICBYU1BSKDMxLDMzOSwxMDE1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkY2NyIiwgIFhTUFIoMzEsMzM5LDEwMTgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmljY3IiLCAgWFNQUigzMSwzMzksMTAxOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mcGJsMSIsICBYU1BSKDMxLDMzOSwxMDIwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZwYnUxIiwgIFhTUFIoMzEsMzM5LDEwMjEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnBibDIiLCAgWFNQUigzMSwzMzksMTAyMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mcGJ1MiIsICBYU1BSKDMxLDMzOSwxMDIzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZsMmNyIiwJWFNQUigzMSwzMzksMTAxNyksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1maWN0YyIsCVhTUFIoMzEsMzM5LDEwMTkpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnRocm0xIiwJWFNQUigzMSwzMzksMTAyMCksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mdGhybTIiLAlYU1BSKDMxLDMzOSwxMDIxKSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ0aHJtMyIsCVhTUFIoMzEsMzM5LDEwMjIpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnNwciIsICAgWCgzMSwzMzkpLAlYX01BU0ssCQlDT00sCQl7IFJULCBTUFIgfSB9LAotCi17ICJsd2F4IiwgICAgWCgzMSwzNDEpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImxoYXgiLCAgICBYKDMxLDM0MyksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImRjY2NpIiwgICBYKDMxLDQ1NCksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgImFicyIsICAgICBYTygzMSwzNjAsMCwwKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAoteyAiYWJzLiIsICAgIFhPKDMxLDM2MCwwLDEpLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCi17ICJhYnNvIiwgICAgWE8oMzEsMzYwLDEsMCksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKLXsgImFic28uIiwgICBYTygzMSwzNjAsMSwxKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAotCi17ICJkaXZzIiwgICAgWE8oMzEsMzYzLDAsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2cy4iLCAgIFhPKDMxLDM2MywwLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdnNvIiwgICBYTygzMSwzNjMsMSwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZzby4iLCAgWE8oMzEsMzYzLDEsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJ0bGJpYSIsICAgWCgzMSwzNzApLAkweGZmZmZmZmZmLAlQUEMsCQl7IDAgfSB9LAotCi17ICJtZnRidSIsICAgWFNQUigzMSwzNzEsMjY5KSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKLXsgIm1mdGIiLCAgICBYKDMxLDM3MSksCVhfTUFTSywJCVBQQywJCXsgUlQsIFRCUiB9IH0sCi0KLXsgImx3YXV4IiwgICBYKDMxLDM3MyksCVhfTUFTSywJCVBQQzY0LAkJeyBSVCwgUkFMLCBSQiB9IH0sCi0KLXsgImxoYXV4IiwgICBYKDMxLDM3NSksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBTCwgUkIgfSB9LAotCi17ICJzdGh4IiwgICAgWCgzMSw0MDcpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJsZnF4IiwgICAgWCgzMSw3OTEpLAlYX01BU0ssCQlQT1dFUjIsCQl7IEZSVCwgUkEsIFJCIH0gfSwKLQoteyAibGZxdXgiLCAgIFgoMzEsODIzKSwJWF9NQVNLLAkJUE9XRVIyLAkJeyBGUlQsIFJBLCBSQiB9IH0sCi0KLXsgInN0ZnF4IiwgICBYKDMxLDkxOSksCVhfTUFTSywJCVBPV0VSMiwJCXsgRlJTLCBSQSwgUkIgfSB9LAotCi17ICJzdGZxdXgiLCAgWCgzMSw5NTEpLAlYX01BU0ssCQlQT1dFUjIsCQl7IEZSUywgUkEsIFJCIH0gfSwKLQoteyAib3JjIiwgICAgIFhSQygzMSw0MTIsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgIm9yYy4iLCAgICBYUkMoMzEsNDEyLDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInNyYWRpIiwgICBYUygzMSw0MTMsMCksIFhTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiB9IH0sCi17ICJzcmFkaS4iLCAgWFMoMzEsNDEzLDEpLCBYU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYgfSB9LAotCi17ICJzbGJpZSIsICAgWCgzMSw0MzQpLAlYUlRSQV9NQVNLLAlQUEM2NCwJCXsgUkIgfSB9LAotCi17ICJlY293eCIsICAgWCgzMSw0MzgpLAlYX01BU0ssCQlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJzdGh1eCIsICAgWCgzMSw0MzkpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQVMsIFJCIH0gfSwKLQoteyAibXIiLAkgICAgIFhSQygzMSw0NDQsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCUyB9IH0sCi17ICJvciIsICAgICAgWFJDKDMxLDQ0NCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAibXIuIiwgICAgIFhSQygzMSw0NDQsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCUyB9IH0sCi17ICJvci4iLCAgICAgWFJDKDMxLDQ0NCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJtdGV4aXNyIiwgWFNQUigzMSw0NTEsNjQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGV4aWVyIiwgWFNQUigzMSw0NTEsNjYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJyMCIsICAgWFNQUigzMSw0NTEsMTI4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRicjEiLCAgIFhTUFIoMzEsNDUxLDEyOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YnIyIiwgICBYU1BSKDMxLDQ1MSwxMzApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJyMyIsICAgWFNQUigzMSw0NTEsMTMxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRicjQiLCAgIFhTUFIoMzEsNDUxLDEzMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YnI1IiwgICBYU1BSKDMxLDQ1MSwxMzMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJyNiIsICAgWFNQUigzMSw0NTEsMTM0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRicjciLCAgIFhTUFIoMzEsNDUxLDEzNSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YmVhciIsICBYU1BSKDMxLDQ1MSwxNDQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJlc3IiLCAgWFNQUigzMSw0NTEsMTQ1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRpb2NyIiwgIFhTUFIoMzEsNDUxLDE2MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY3IwIiwgWFNQUigzMSw0NTEsMTkyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjdDAiLCBYU1BSKDMxLDQ1MSwxOTMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWRhMCIsIFhTUFIoMzEsNDUxLDE5NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hc2EwIiwgWFNQUigzMSw0NTEsMTk1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjYzAiLCBYU1BSKDMxLDQ1MSwxOTYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWNyMSIsIFhTUFIoMzEsNDUxLDIwMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY3QxIiwgWFNQUigzMSw0NTEsMjAxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFkYTEiLCBYU1BSKDMxLDQ1MSwyMDIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYXNhMSIsIFhTUFIoMzEsNDUxLDIwMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY2MxIiwgWFNQUigzMSw0NTEsMjA0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjcjIiLCBYU1BSKDMxLDQ1MSwyMDgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWN0MiIsIFhTUFIoMzEsNDUxLDIwOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hZGEyIiwgWFNQUigzMSw0NTEsMjEwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFzYTIiLCBYU1BSKDMxLDQ1MSwyMTEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWNjMiIsIFhTUFIoMzEsNDUxLDIxMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY3IzIiwgWFNQUigzMSw0NTEsMjE2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjdDMiLCBYU1BSKDMxLDQ1MSwyMTcpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWRhMyIsIFhTUFIoMzEsNDUxLDIxOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hc2EzIiwgWFNQUigzMSw0NTEsMjE5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjYzMiLCBYU1BSKDMxLDQ1MSwyMjApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYXNyIiwgWFNQUigzMSw0NTEsMjI0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXR1bW1jcjAiLAlYU1BSKDMxLDQ1MSw5MzYpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXR1cG1jMSIsCVhTUFIoMzEsNDUxLDkzNyksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHVwbWMyIiwJWFNQUigzMSw0NTEsOTM4KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10dXNpYSIsCVhTUFIoMzEsNDUxLDkzOSksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHVtbWNyMSIsCVhTUFIoMzEsNDUxLDk0MCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHVwbWMzIiwJWFNQUigzMSw0NTEsOTQxKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10dXBtYzQiLAlYU1BSKDMxLDQ1MSw5NDIpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRtbWNyMCIsCVhTUFIoMzEsNDUxLDk1MiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHBtYzEiLAlYU1BSKDMxLDQ1MSw5NTMpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRwbWMyIiwJWFNQUigzMSw0NTEsOTU0KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10c2lhIiwJWFNQUigzMSw0NTEsOTU1KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10bW1jcjEiLAlYU1BSKDMxLDQ1MSw5NTYpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRwbWMzIiwJWFNQUigzMSw0NTEsOTU3KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10cG1jNCIsCVhTUFIoMzEsNDUxLDk1OCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdGwyY3IiLAlYU1BSKDMxLDQ1MSwxMDE3KSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRpY3RjIiwJWFNQUigzMSw0NTEsMTAxOSksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10dGhybTEiLAlYU1BSKDMxLDQ1MSwxMDIwKSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXR0aHJtMiIsCVhTUFIoMzEsNDUxLDEwMjEpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHRocm0zIiwJWFNQUigzMSw0NTEsMTAyMiksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10ZGNyIiwgICBYKDMxLDQ1MSksCVhfTUFTSywJCVBQQywJCXsgU1BSLCBSUyB9IH0sCi0KLXsgImRpdmR1IiwgICBYTygzMSw0NTcsMCwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2ZHUuIiwgIFhPKDMxLDQ1NywwLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZkdW8iLCAgWE8oMzEsNDU3LDEsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdmR1by4iLCBYTygzMSw0NTcsMSwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJkaXZ3dSIsICAgWE8oMzEsNDU5LDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZ3dS4iLCAgWE8oMzEsNDU5LDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZ3dW8iLCAgWE8oMzEsNDU5LDEsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZ3dW8uIiwgWE8oMzEsNDU5LDEsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm10bXEiLCAgICBYU1BSKDMxLDQ2NywwKSwgICBYU1BSX01BU0ssICAgIE02MDEsCXsgUlMgfSB9LAoteyAibXR4ZXIiLCAgIFhTUFIoMzEsNDY3LDEpLCAgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10bHIiLCAgICBYU1BSKDMxLDQ2Nyw4KSwgICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdGN0ciIsICAgWFNQUigzMSw0NjcsOSksICAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXR0aWQiLCAgIFhTUFIoMzEsNDY3LDE3KSwgIFhTUFJfTUFTSywgICAgUE9XRVIsCXsgUlMgfSB9LAoteyAibXRkc2lzciIsIFhTUFIoMzEsNDY3LDE4KSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10ZGFyIiwgICBYU1BSKDMxLDQ2NywxOSksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdHJ0Y3UiLCAgWFNQUigzMSw0NjcsMjApLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRydGNsIiwgIFhTUFIoMzEsNDY3LDIxKSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10ZGVjIiwgICBYU1BSKDMxLDQ2NywyMiksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdHNkcjAiLCAgWFNQUigzMSw0NjcsMjQpLCAgWFNQUl9NQVNLLCAgICBQT1dFUiwJeyBSUyB9IH0sCi17ICJtdHNkcjEiLCAgWFNQUigzMSw0NjcsMjUpLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRzcnIwIiwgIFhTUFIoMzEsNDY3LDI2KSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10c3JyMSIsICBYU1BSKDMxLDQ2NywyNyksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdGNtcGEiLCAgIFhTUFIoMzEsNDY3LDE0NCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y21wYiIsICAgWFNQUigzMSw0NjcsMTQ1KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjbXBjIiwgICBYU1BSKDMxLDQ2NywxNDYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNtcGQiLCAgIFhTUFIoMzEsNDY3LDE0NyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10aWNyIiwgICAgWFNQUigzMSw0NjcsMTQ4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRkZXIiLCAgICBYU1BSKDMxLDQ2NywxNDkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNvdW50YSIsIFhTUFIoMzEsNDY3LDE1MCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y291bnRiIiwgWFNQUigzMSw0NjcsMTUxKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjbXBlIiwgICBYU1BSKDMxLDQ2NywxNTIpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNtcGYiLCAgIFhTUFIoMzEsNDY3LDE1MyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y21wZyIsICAgWFNQUigzMSw0NjcsMTU0KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjbXBoIiwgICBYU1BSKDMxLDQ2NywxNTUpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGxjdHJsMSIsIFhTUFIoMzEsNDY3LDE1NiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10bGN0cmwyIiwgWFNQUigzMSw0NjcsMTU3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRpY3RybCIsICBYU1BSKDMxLDQ2NywxNTgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGJhciIsICAgIFhTUFIoMzEsNDY3LDE1OSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10c3ByZyIsICBYU1BSKDMxLDQ2NywyNzIpLCBYU1BSR19NQVNLLCAgIFBQQywJeyBTUFJHLCBSUyB9IH0sCi17ICJtdHNwcmcwIiwgWFNQUigzMSw0NjcsMjcyKSwgWFNQUl9NQVNLLCAgICBQUEMsCXsgUlQgfSB9LAoteyAibXRzcHJnMSIsIFhTUFIoMzEsNDY3LDI3MyksIFhTUFJfTUFTSywgICAgUFBDLAl7IFJUIH0gfSwKLXsgIm10c3ByZzIiLCBYU1BSKDMxLDQ2NywyNzQpLCBYU1BSX01BU0ssICAgIFBQQywJeyBSVCB9IH0sCi17ICJtdHNwcmczIiwgWFNQUigzMSw0NjcsMjc1KSwgWFNQUl9NQVNLLCAgICBQUEMsCXsgUlQgfSB9LAoteyAibXRhc3IiLCAgIFhTUFIoMzEsNDY3LDI4MCksIFhTUFJfTUFTSywgICAgUFBDNjQsCXsgUlMgfSB9LAoteyAibXRlYXIiLCAgIFhTUFIoMzEsNDY3LDI4MiksIFhTUFJfTUFTSywgICAgUFBDLAl7IFJTIH0gfSwKLXsgIm10dGJsIiwgICBYU1BSKDMxLDQ2NywyODQpLCBYU1BSX01BU0ssICAgIFBQQywJeyBSUyB9IH0sCi17ICJtdHRidSIsICAgWFNQUigzMSw0NjcsMjg1KSwgWFNQUl9NQVNLLCAgICBQUEMsCXsgUlMgfSB9LAoteyAibXRpYmF0dSIsIFhTUFIoMzEsNDY3LDUyOCksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFNQUkJBVCwgUlMgfSB9LAoteyAibXRpYmF0bCIsIFhTUFIoMzEsNDY3LDUyOSksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFNQUkJBVCwgUlMgfSB9LAoteyAibXRkYmF0dSIsIFhTUFIoMzEsNDY3LDUzNiksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFNQUkJBVCwgUlMgfSB9LAoteyAibXRkYmF0bCIsIFhTUFIoMzEsNDY3LDUzNyksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFNQUkJBVCwgUlMgfSB9LAoteyAibXR6cHIiLCAgIFhTUFIoMzEsNDY3LDk0NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10cGlkIiwgICBYU1BSKDMxLDQ2Nyw5NDUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGljZGJkciIsWFNQUigzMSw0NjcsOTc5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRlc3IiLCAgIFhTUFIoMzEsNDY3LDk4MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZXZwciIsICBYU1BSKDMxLDQ2Nyw5ODIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGNkYmNyIiwgWFNQUigzMSw0NjcsOTgzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXR0c3IiLCAgIFhTUFIoMzEsNDY3LDk4NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10dGNyIiwgICBYU1BSKDMxLDQ2Nyw5ODYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHBpdCIsICAgWFNQUigzMSw0NjcsOTg3KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXR0YmhpIiwgIFhTUFIoMzEsNDY3LDk4OCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10dGJsbyIsICBYU1BSKDMxLDQ2Nyw5ODkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHNycjIiLCAgWFNQUigzMSw0NjcsOTkwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRzcnIzIiwgIFhTUFIoMzEsNDY3LDk5MSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZGJzciIsICBYU1BSKDMxLDQ2NywxMDA4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRpYWMxIiwgIFhTUFIoMzEsNDY3LDEwMTIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGlhYzIiLCAgWFNQUigzMSw0NjcsMTAxMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZGFjMSIsICBYU1BSKDMxLDQ2NywxMDE0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkYWMyIiwgIFhTUFIoMzEsNDY3LDEwMTUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRjY3IiLCAgWFNQUigzMSw0NjcsMTAxOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10aWNjciIsICBYU1BSKDMxLDQ2NywxMDE5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRwYmwxIiwgIFhTUFIoMzEsNDY3LDEwMjApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHBidTEiLCAgWFNQUigzMSw0NjcsMTAyMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10cGJsMiIsICBYU1BSKDMxLDQ2NywxMDIyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRwYnUyIiwgIFhTUFIoMzEsNDY3LDEwMjMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHNwciIsICAgWCgzMSw0NjcpLAkgICAgICAgWF9NQVNLLAkgICAgIENPTSwJeyBTUFIsIFJTIH0gfSwKLQoteyAiZGNiaSIsICAgIFgoMzEsNDcwKSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAibmFuZCIsICAgIFhSQygzMSw0NzYsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgIm5hbmQuIiwgICBYUkMoMzEsNDc2LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgImRjcmVhZCIsICBYKDMxLDQ4NiksCVhSVF9NQVNLLAlQUEM0MDMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgIm5hYnMiLCAgICBYTygzMSw0ODgsMCwwKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAoteyAibmFicy4iLCAgIFhPKDMxLDQ4OCwwLDEpLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCi17ICJuYWJzbyIsICAgWE8oMzEsNDg4LDEsMCksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKLXsgIm5hYnNvLiIsICBYTygzMSw0ODgsMSwxKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAotCi17ICJkaXZkIiwgICAgWE8oMzEsNDg5LDAsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdmQuIiwgICBYTygzMSw0ODksMCwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2ZG8iLCAgIFhPKDMxLDQ4OSwxLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZkby4iLCAgWE8oMzEsNDg5LDEsMSksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiZGl2dyIsICAgIFhPKDMxLDQ5MSwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2dy4iLCAgIFhPKDMxLDQ5MSwwLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2d28iLCAgIFhPKDMxLDQ5MSwxLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2d28uIiwgIFhPKDMxLDQ5MSwxLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJzbGJpYSIsICAgWCgzMSw0OTgpLAkweGZmZmZmZmZmLAlQUEM2NCwJCXsgMCB9IH0sCi0KLXsgImNsaSIsICAgICBYKDMxLDUwMiksIFhSQl9NQVNLLAlQT1dFUiwJCXsgUlQsIFJBIH0gfSwKLQoteyAibWNyeHIiLCAgIFgoMzEsNTEyKSwJWFJBUkJfTUFTS3woMzw8MjEpLCBDT00sCXsgQkYgfSB9LAotCi17ICJjbGNzIiwgICAgWCgzMSw1MzEpLCBYUkJfTUFTSywJTTYwMSwJCXsgUlQsIFJBIH0gfSwKLQoteyAibHN3eCIsICAgIFgoMzEsNTMzKSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImxzeCIsICAgICBYKDMxLDUzMyksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImx3YnJ4IiwgICBYKDMxLDUzNCksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJsYnJ4IiwgICAgWCgzMSw1MzQpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJsZnN4IiwgICAgWCgzMSw1MzUpLAlYX01BU0ssCQlDT00sCQl7IEZSVCwgUkEsIFJCIH0gfSwKLQoteyAic3J3IiwgICAgIFhSQygzMSw1MzYsMCksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyIiwgICAgICBYUkMoMzEsNTM2LDApLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcncuIiwgICAgWFJDKDMxLDUzNiwxKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3IuIiwgICAgIFhSQygzMSw1MzYsMSksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAicnJpYiIsICAgIFhSQygzMSw1MzcsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJycmliLiIsICAgWFJDKDMxLDUzNywxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic3JkIiwgICAgIFhSQygzMSw1MzksMCksIFhfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3JkLiIsICAgIFhSQygzMSw1MzksMSksIFhfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJtYXNraXIiLCAgWFJDKDMxLDU0MSwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgIm1hc2tpci4iLCBYUkMoMzEsNTQxLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJ0bGJzeW5jIiwgWCgzMSw1NjYpLAkweGZmZmZmZmZmLAlQUEMsCQl7IDAgfSB9LAotCi17ICJsZnN1eCIsICAgWCgzMSw1NjcpLAlYX01BU0ssCQlDT00sCQl7IEZSVCwgUkFTLCBSQiB9IH0sCi0KLXsgIm1mc3IiLCAgICBYKDMxLDU5NSksCVhSQl9NQVNLfCgxPDwyMCksIENPTTMyLAl7IFJULCBTUiB9IH0sCi0KLXsgImxzd2kiLCAgICBYKDMxLDU5NyksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBLCBOQiB9IH0sCi17ICJsc2kiLCAgICAgWCgzMSw1OTcpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgTkIgfSB9LAotCi17ICJzeW5jIiwgICAgWCgzMSw1OTgpLCAweGZmZmZmZmZmLAlQUENDT00sCQl7IDAgfSB9LAoteyAiZGNzIiwgICAgIFgoMzEsNTk4KSwgMHhmZmZmZmZmZiwJUFdSQ09NLAkJeyAwIH0gfSwKLQoteyAibGZkeCIsICAgIFgoMzEsNTk5KSwgWF9NQVNLLAkJQ09NLAkJeyBGUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm1mc3JpIiwgICBYKDMxLDYyNyksIFhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImRjbHN0IiwgICBYKDMxLDYzMCksIFhSQl9NQVNLLAlQV1JDT00sCQl7IFJTLCBSQSB9IH0sCi0KLXsgImxmZHV4IiwgICBYKDMxLDYzMSksIFhfTUFTSywJCUNPTSwJCXsgRlJULCBSQVMsIFJCIH0gfSwKLQoteyAibWZzcmluIiwgIFgoMzEsNjU5KSwgWFJBX01BU0ssCVBQQzMyLAkJeyBSVCwgUkIgfSB9LAotCi17ICJzdHN3eCIsICAgWCgzMSw2NjEpLCBYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAoteyAic3RzeCIsICAgIFgoMzEsNjYxKSwgWF9NQVNLLAkJUFdSQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAic3R3YnJ4IiwgIFgoMzEsNjYyKSwgWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLXsgInN0YnJ4IiwgICBYKDMxLDY2MiksIFhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInN0ZnN4IiwgICBYKDMxLDY2MyksIFhfTUFTSywJCUNPTSwJCXsgRlJTLCBSQSwgUkIgfSB9LAotCi17ICJzcnEiLCAgICAgWFJDKDMxLDY2NCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNycS4iLCAgICBYUkMoMzEsNjY0LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzcmUiLCAgICAgWFJDKDMxLDY2NSwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyZS4iLCAgICBYUkMoMzEsNjY1LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzdGZzdXgiLCAgWCgzMSw2OTUpLAlYX01BU0ssCQlDT00sCQl7IEZSUywgUkFTLCBSQiB9IH0sCi0KLXsgInNyaXEiLCAgICBYUkMoMzEsNjk2LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic3JpcS4iLCAgIFhSQygzMSw2OTYsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi0KLXsgInN0c3dpIiwgICBYKDMxLDcyNSksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBLCBOQiB9IH0sCi17ICJzdHNpIiwgICAgWCgzMSw3MjUpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQSwgTkIgfSB9LAotCi17ICJzdGZkeCIsICAgWCgzMSw3MjcpLAlYX01BU0ssCQlDT00sCQl7IEZSUywgUkEsIFJCIH0gfSwKLQoteyAic3JscSIsICAgIFhSQygzMSw3MjgsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmxxLiIsICAgWFJDKDMxLDcyOCwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic3JlcSIsICAgIFhSQygzMSw3MjksMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmVxLiIsICAgWFJDKDMxLDcyOSwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic3RmZHV4IiwgIFgoMzEsNzU5KSwJWF9NQVNLLAkJQ09NLAkJeyBGUlMsIFJBUywgUkIgfSB9LAotCi17ICJzcmxpcSIsICAgWFJDKDMxLDc2MCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKLXsgInNybGlxLiIsICBYUkMoMzEsNzYwLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAotCi17ICJsaGJyeCIsICAgWCgzMSw3OTApLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJzcmF3IiwgICAgWFJDKDMxLDc5MiwwKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3JhIiwgICAgIFhSQygzMSw3OTIsMCksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyYXcuIiwgICBYUkMoMzEsNzkyLDEpLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmEuIiwgICAgWFJDKDMxLDc5MiwxKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzcmFkIiwgICAgWFJDKDMxLDc5NCwwKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmFkLiIsICAgWFJDKDMxLDc5NCwxKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInJhYyIsICAgICBYKDMxLDgxOCksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgInNyYXdpIiwgICBYUkMoMzEsODI0LDApLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBTSCB9IH0sCi17ICJzcmFpIiwgICAgWFJDKDMxLDgyNCwwKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic3Jhd2kuIiwgIFhSQygzMSw4MjQsMSksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFNIIH0gfSwKLXsgInNyYWkuIiwgICBYUkMoMzEsODI0LDEpLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBTSCB9IH0sCi0KLXsgImVpZWlvIiwgICBYKDMxLDg1NCksCTB4ZmZmZmZmZmYsCVBQQywJCXsgMCB9IH0sCi0KLXsgInRsYnN4IiwgICBYUkMoMzEsOTE0LDApLCBYX01BU0ssIFBQQzQwMywJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInRsYnN4LiIsICBYUkMoMzEsOTE0LDEpLCBYX01BU0ssIFBQQzQwMywJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAic3RoYnJ4IiwgIFgoMzEsOTE4KSwJWF9NQVNLLAkJQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAic3JhcSIsICAgIFhSQygzMSw5MjAsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmFxLiIsICAgWFJDKDMxLDkyMCwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic3JlYSIsICAgIFhSQygzMSw5MjEsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmVhLiIsICAgWFJDKDMxLDkyMSwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAiZXh0c2giLCAgIFhSQygzMSw5MjIsMCksIFhSQl9NQVNLLAlQUENDT00sCQl7IFJBLCBSUyB9IH0sCi17ICJleHRzIiwgICAgWFJDKDMxLDkyMiwwKSwgWFJCX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTIH0gfSwKLXsgImV4dHNoLiIsICBYUkMoMzEsOTIyLDEpLCBYUkJfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMgfSB9LAoteyAiZXh0cy4iLCAgIFhSQygzMSw5MjIsMSksIFhSQl9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUyB9IH0sCi0KLXsgInRsYnJlIiwgICBYKDMxLDk0NiksCVhfTUFTSywJCVBQQzQwMywJCXsgUlQsIFJBLCBTSCB9IH0sCi0KLXsgInNyYWlxIiwgICBYUkMoMzEsOTUyLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic3JhaXEuIiwgIFhSQygzMSw5NTIsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi0KLXsgImV4dHNiIiwgICBYUkMoMzEsOTU0LDApLCBYUkJfTUFTSywJUFBDLAkJeyBSQSwgUlN9IH0sCi17ICJleHRzYi4iLCAgWFJDKDMxLDk1NCwxKSwgWFJCX01BU0ssCVBQQywJCXsgUkEsIFJTfSB9LAotCi17ICJpY2NjaSIsICAgWCgzMSw5NjYpLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAotCi17ICJ0bGJsZCIsICAgWCgzMSw5NzgpLAlYUlRSQV9NQVNLLAlQUEMsCQl7IFJCIH0gfSwKLXsgInRsYndlIiwgICBYKDMxLDk3OCksCVhfTUFTSywJCVBQQzQwMywJCXsgUlMsIFJBLCBTSCB9IH0sCi0KLXsgImljYmkiLCAgICBYKDMxLDk4MiksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgInN0Zml3eCIsICBYKDMxLDk4MyksCVhfTUFTSywJCVBQQywJCXsgRlJTLCBSQSwgUkIgfSB9LAotCi17ICJleHRzdyIsICAgWFJDKDMxLDk4NiwwKSwgWFJCX01BU0ssCVBQQywJCXsgUkEsIFJTIH0gfSwKLXsgImV4dHN3LiIsICBYUkMoMzEsOTg2LDEpLCBYUkJfTUFTSywJUFBDLAkJeyBSQSwgUlMgfSB9LAotCi17ICJpY3JlYWQiLCAgWCgzMSw5OTgpLAlYUlRfTUFTSywJUFBDNDAzLAkJeyBSQSwgUkIgfSB9LAotCi17ICJ0bGJsaSIsICAgWCgzMSwxMDEwKSwgWFJUUkFfTUFTSywJUFBDLAkJeyBSQiB9IH0sCi0KLXsgImRjYnoiLCAgICBYKDMxLDEwMTQpLCBYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAoteyAiZGNseiIsICAgIFgoMzEsMTAxNCksIFhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgImx3eiIsICAgICBPUCgzMiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLXsgImwiLAkgICAgIE9QKDMyKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAotCi17ICJsd3p1IiwgICAgT1AoMzMpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBELCBSQUwgfSB9LAoteyAibHUiLCAgICAgIE9QKDMzKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAotCi17ICJsYnoiLCAgICAgT1AoMzQpLAlPUF9NQVNLLAlDT00sCQl7IFJULCBELCBSQSB9IH0sCi0KLXsgImxienUiLCAgICBPUCgzNSksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBTCB9IH0sCi0KLXsgInN0dyIsICAgICBPUCgzNiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlMsIEQsIFJBIH0gfSwKLXsgInN0IiwgICAgICBPUCgzNiksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlMsIEQsIFJBIH0gfSwKLQoteyAic3R3dSIsICAgIE9QKDM3KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSUywgRCwgUkFTIH0gfSwKLXsgInN0dSIsICAgICBPUCgzNyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlMsIEQsIFJBIH0gfSwKLQoteyAic3RiIiwgICAgIE9QKDM4KSwJT1BfTUFTSywJQ09NLAkJeyBSUywgRCwgUkEgfSB9LAotCi17ICJzdGJ1IiwgICAgT1AoMzkpLAlPUF9NQVNLLAlDT00sCQl7IFJTLCBELCBSQVMgfSB9LAotCi17ICJsaHoiLCAgICAgT1AoNDApLAlPUF9NQVNLLAlDT00sCQl7IFJULCBELCBSQSB9IH0sCi0KLXsgImxoenUiLCAgICBPUCg0MSksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBTCB9IH0sCi0KLXsgImxoYSIsICAgICBPUCg0MiksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLQoteyAibGhhdSIsICAgIE9QKDQzKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkFMIH0gfSwKLQoteyAic3RoIiwgICAgIE9QKDQ0KSwJT1BfTUFTSywJQ09NLAkJeyBSUywgRCwgUkEgfSB9LAotCi17ICJzdGh1IiwgICAgT1AoNDUpLAlPUF9NQVNLLAlDT00sCQl7IFJTLCBELCBSQVMgfSB9LAotCi17ICJsbXciLCAgICAgT1AoNDYpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBELCBSQU0gfSB9LAoteyAibG0iLCAgICAgIE9QKDQ2KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAotCi17ICJzdG13IiwgICAgT1AoNDcpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJTLCBELCBSQSB9IH0sCi17ICJzdG0iLCAgICAgT1AoNDcpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJTLCBELCBSQSB9IH0sCi0KLXsgImxmcyIsICAgICBPUCg0OCksCU9QX01BU0ssCUNPTSwJCXsgRlJULCBELCBSQSB9IH0sCi0KLXsgImxmc3UiLCAgICBPUCg0OSksCU9QX01BU0ssCUNPTSwJCXsgRlJULCBELCBSQVMgfSB9LAotCi17ICJsZmQiLCAgICAgT1AoNTApLAlPUF9NQVNLLAlDT00sCQl7IEZSVCwgRCwgUkEgfSB9LAotCi17ICJsZmR1IiwgICAgT1AoNTEpLAlPUF9NQVNLLAlDT00sCQl7IEZSVCwgRCwgUkFTIH0gfSwKLQoteyAic3RmcyIsICAgIE9QKDUyKSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBIH0gfSwKLQoteyAic3Rmc3UiLCAgIE9QKDUzKSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBUyB9IH0sCi0KLXsgInN0ZmQiLCAgICBPUCg1NCksCU9QX01BU0ssCUNPTSwJCXsgRlJTLCBELCBSQSB9IH0sCi0KLXsgInN0ZmR1IiwgICBPUCg1NSksCU9QX01BU0ssCUNPTSwJCXsgRlJTLCBELCBSQVMgfSB9LAotCi17ICJsZnEiLCAgICAgT1AoNTYpLAlPUF9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRCwgUkEgfSB9LAotCi17ICJsZnF1IiwgICAgT1AoNTcpLAlPUF9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRCwgUkEgfSB9LAotCi17ICJsZCIsICAgICAgRFNPKDU4LDApLAlEU19NQVNLLAlQUEM2NCwJCXsgUlQsIERTLCBSQSB9IH0sCi0KLXsgImxkdSIsICAgICBEU08oNTgsMSksIERTX01BU0ssCVBQQzY0LAkJeyBSVCwgRFMsIFJBTCB9IH0sCi0KLXsgImx3YSIsICAgICBEU08oNTgsMiksIERTX01BU0ssCVBQQzY0LAkJeyBSVCwgRFMsIFJBIH0gfSwKLQoteyAiZmRpdnMiLCAgIEEoNTksMTgsMCksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZkaXZzLiIsICBBKDU5LDE4LDEpLCBBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi0KLXsgImZzdWJzIiwgICBBKDU5LDIwLDApLCBBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmc3Vicy4iLCAgQSg1OSwyMCwxKSwgQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAotCi17ICJmYWRkcyIsICAgQSg1OSwyMSwwKSwgQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZmFkZHMuIiwgIEEoNTksMjEsMSksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLQoteyAiZnNxcnRzIiwgIEEoNTksMjIsMCksIEFGUkFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmc3FydHMuIiwgQSg1OSwyMiwxKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZnJlcyIsICAgIEEoNTksMjQsMCksIEFGUkFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmcmVzLiIsICAgQSg1OSwyNCwxKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZm11bHMiLCAgIEEoNTksMjUsMCksIEFGUkJfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKLXsgImZtdWxzLiIsICBBKDU5LDI1LDEpLCBBRlJCX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQyB9IH0sCi0KLXsgImZtc3VicyIsICBBKDU5LDI4LDApLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtc3Vicy4iLCBBKDU5LDI4LDEpLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAiZm1hZGRzIiwgIEEoNTksMjksMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm1hZGRzLiIsIEEoNTksMjksMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJmbm1zdWJzIiwgQSg1OSwzMCwwKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1zdWJzLiIsQSg1OSwzMCwxKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgImZubWFkZHMiLCBBKDU5LDMxLDApLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZubWFkZHMuIixBKDU5LDMxLDEpLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAic3RmcSIsICAgIE9QKDYwKSwJT1BfTUFTSywJUE9XRVIyLAkJeyBGUlMsIEQsIFJBIH0gfSwKLQoteyAic3RmcXUiLCAgIE9QKDYxKSwJT1BfTUFTSywJUE9XRVIyLAkJeyBGUlMsIEQsIFJBIH0gfSwKLQoteyAic3RkIiwgICAgIERTTyg2MiwwKSwJRFNfTUFTSywJUFBDNjQsCQl7IFJTLCBEUywgUkEgfSB9LAotCi17ICJzdGR1IiwgICAgRFNPKDYyLDEpLAlEU19NQVNLLAlQUEM2NCwJCXsgUlMsIERTLCBSQVMgfSB9LAotCi17ICJmY21wdSIsICAgWCg2MywwKSwJWF9NQVNLfCgzPDwyMSksCUNPTSwJCXsgQkYsIEZSQSwgRlJCIH0gfSwKLQoteyAiZnJzcCIsICAgIFhSQyg2MywxMiwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZnJzcC4iLCAgIFhSQyg2MywxMiwxKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmY3RpdyIsICAgWFJDKDYzLDE0LDApLCBYUkFfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmY2lyIiwgICAgWFJDKDYzLDE0LDApLCBYUkFfTUFTSywJUE9XRVIyLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmY3Rpdy4iLCAgWFJDKDYzLDE0LDEpLCBYUkFfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmY2lyLiIsICAgWFJDKDYzLDE0LDEpLCBYUkFfTUFTSywJUE9XRVIyLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZjdGl3eiIsICBYUkMoNjMsMTUsMCksIFhSQV9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjaXJ6IiwgICBYUkMoNjMsMTUsMCksIFhSQV9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjdGl3ei4iLCBYUkMoNjMsMTUsMSksIFhSQV9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjaXJ6LiIsICBYUkMoNjMsMTUsMSksIFhSQV9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZmRpdiIsICAgIEEoNjMsMTgsMCksIEFGUkNfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZkIiwgICAgICBBKDYzLDE4LDApLCBBRlJDX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmZGl2LiIsICAgQSg2MywxOCwxKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZmQuIiwgICAgIEEoNjMsMTgsMSksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLQoteyAiZnN1YiIsICAgIEEoNjMsMjAsMCksIEFGUkNfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZzIiwgICAgICBBKDYzLDIwLDApLCBBRlJDX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmc3ViLiIsICAgQSg2MywyMCwxKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZnMuIiwgICAgIEEoNjMsMjAsMSksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLQoteyAiZmFkZCIsICAgIEEoNjMsMjEsMCksIEFGUkNfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZhIiwgICAgICBBKDYzLDIxLDApLCBBRlJDX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmYWRkLiIsICAgQSg2MywyMSwxKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZmEuIiwgICAgIEEoNjMsMjEsMSksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLQoteyAiZnNxcnQiLCAgIEEoNjMsMjIsMCksIEFGUkFGUkNfTUFTSywJUFBDUFdSMiwJeyBGUlQsIEZSQiB9IH0sCi17ICJmc3FydC4iLCAgQSg2MywyMiwxKSwgQUZSQUZSQ19NQVNLLAlQUENQV1IyLAl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZnNlbCIsICAgIEEoNjMsMjMsMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZnNlbC4iLCAgIEEoNjMsMjMsMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJmbXVsIiwgICAgQSg2MywyNSwwKSwgQUZSQl9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAoteyAiZm0iLCAgICAgIEEoNjMsMjUsMCksIEFGUkJfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKLXsgImZtdWwuIiwgICBBKDYzLDI1LDEpLCBBRlJCX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQyB9IH0sCi17ICJmbS4iLCAgICAgQSg2MywyNSwxKSwgQUZSQl9NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAotCi17ICJmcnNxcnRlIiwgQSg2MywyNiwwKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZyc3FydGUuIixBKDYzLDI2LDEpLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmbXN1YiIsICAgQSg2MywyOCwwKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbXMiLCAgICAgQSg2MywyOCwwKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbXN1Yi4iLCAgQSg2MywyOCwxKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbXMuIiwgICAgQSg2MywyOCwxKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgImZtYWRkIiwgICBBKDYzLDI5LDApLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtYSIsICAgICBBKDYzLDI5LDApLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtYWRkLiIsICBBKDYzLDI5LDEpLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtYS4iLCAgICBBKDYzLDI5LDEpLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAiZm5tc3ViIiwgIEEoNjMsMzAsMCksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm5tcyIsICAgIEEoNjMsMzAsMCksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm5tc3ViLiIsIEEoNjMsMzAsMSksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm5tcy4iLCAgIEEoNjMsMzAsMSksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJmbm1hZGQiLCAgQSg2MywzMSwwKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1hIiwgICAgQSg2MywzMSwwKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1hZGQuIiwgQSg2MywzMSwxKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1hLiIsICAgQSg2MywzMSwxKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgImZjbXBvIiwgICBYKDYzLDMyKSwJWF9NQVNLfCgzPDwyMSksCUNPTSwJCXsgQkYsIEZSQSwgRlJCIH0gfSwKLQoteyAibXRmc2IxIiwgIFhSQyg2MywzOCwwKSwgWFJBUkJfTUFTSywJQ09NLAkJeyBCVCB9IH0sCi17ICJtdGZzYjEuIiwgWFJDKDYzLDM4LDEpLCBYUkFSQl9NQVNLLAlDT00sCQl7IEJUIH0gfSwKLQoteyAiZm5lZyIsICAgIFhSQyg2Myw0MCwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZm5lZy4iLCAgIFhSQyg2Myw0MCwxKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAotCi17ICJtY3JmcyIsICAgWCg2Myw2NCksCVhSQl9NQVNLfCgzPDwyMSl8KDM8PDE2KSwgQ09NLAl7IEJGLCBCRkEgfSB9LAotCi17ICJtdGZzYjAiLCAgWFJDKDYzLDcwLDApLCBYUkFSQl9NQVNLLAlDT00sCQl7IEJUIH0gfSwKLXsgIm10ZnNiMC4iLCBYUkMoNjMsNzAsMSksIFhSQVJCX01BU0ssCUNPTSwJCXsgQlQgfSB9LAotCi17ICJmbXIiLCAgICAgWFJDKDYzLDcyLDApLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmbXIuIiwgICAgWFJDKDYzLDcyLDEpLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgIm10ZnNmaSIsICBYUkMoNjMsMTM0LDApLCBYUkFfTUFTS3woMzw8MjEpfCgxPDwxMSksIENPTSwgeyBCRiwgVSB9IH0sCi17ICJtdGZzZmkuIiwgWFJDKDYzLDEzNCwxKSwgWFJBX01BU0t8KDM8PDIxKXwoMTw8MTEpLCBDT00sIHsgQkYsIFUgfSB9LAotCi17ICJmbmFicyIsICAgWFJDKDYzLDEzNiwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZm5hYnMuIiwgIFhSQyg2MywxMzYsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZmFicyIsICAgIFhSQyg2MywyNjQsMCksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZhYnMuIiwgICBYUkMoNjMsMjY0LDEpLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgIm1mZnMiLCAgICBYUkMoNjMsNTgzLDApLCBYUkFSQl9NQVNLLAlDT00sCQl7IEZSVCB9IH0sCi17ICJtZmZzLiIsICAgWFJDKDYzLDU4MywxKSwgWFJBUkJfTUFTSywJQ09NLAkJeyBGUlQgfSB9LAotCi17ICJtdGZzZiIsICAgWEZMKDYzLDcxMSwwKSwgWEZMX01BU0ssCUNPTSwJCXsgRkxNLCBGUkIgfSB9LAoteyAibXRmc2YuIiwgIFhGTCg2Myw3MTEsMSksIFhGTF9NQVNLLAlDT00sCQl7IEZMTSwgRlJCIH0gfSwKLQoteyAiZmN0aWQiLCAgIFhSQyg2Myw4MTQsMCksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmN0aWQuIiwgIFhSQyg2Myw4MTQsMSksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmY3RpZHoiLCAgWFJDKDYzLDgxNSwwKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmY3RpZHouIiwgWFJDKDYzLDgxNSwxKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZjZmlkIiwgICBYUkMoNjMsODQ2LDApLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjZmlkLiIsICBYUkMoNjMsODQ2LDEpLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKLQotfTsKLQotY29uc3QgaW50IHBvd2VycGNfbnVtX29wY29kZXMgPQotICBzaXplb2YgKHBvd2VycGNfb3Bjb2RlcykgLyBzaXplb2YgKHBvd2VycGNfb3Bjb2Rlc1swXSk7Ci0MCi0vKiBUaGUgbWFjcm8gdGFibGUuICBUaGlzIGlzIG9ubHkgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgKi8KLQotLyogVGhlIGV4cHJlc3Npb25zIG9mIHRoZSBmb3JtICgteCAhIDMxKSAmICh4IHwgMzEpIGhhdmUgdGhlIHZhbHVlIDAKLSAgIHdoZW4geD0wOyAzMi14IHdoZW4geCBpcyBiZXR3ZWVuIDEgYW5kIDMxOyBhcmUgbmVnYXRpdmUgaWYgeCBpcwotICAgbmVnYXRpdmU7IGFuZCBhcmUgMzIgb3IgbW9yZSBvdGhlcndpc2UuICBUaGlzIGlzIHdoYXQgeW91IHdhbnQKLSAgIHdoZW4sIGZvciBpbnN0YW5jZSwgeW91IGFyZSBlbXVsYXRpbmcgYSByaWdodCBzaGlmdCBieSBhCi0gICByb3RhdGUtbGVmdC1hbmQtbWFzaywgYmVjYXVzZSB0aGUgdW5kZXJseWluZyBpbnN0cnVjdGlvbnMgc3VwcG9ydAotICAgc2hpZnRzIG9mIHNpemUgMCBidXQgbm90IHNoaWZ0cyBvZiBzaXplIDMyLiAgQnkgY29tcGFyaXNvbiwgd2hlbgotICAgZXh0cmFjdGluZyB4IGJpdHMgZnJvbSBzb21lIHdvcmQgeW91IHdhbnQgdG8gdXNlIGp1c3QgMzIteCwgYmVjYXVzZQotICAgdGhlIHVuZGVybHlpbmcgaW5zdHJ1Y3Rpb25zIGRvbid0IHN1cHBvcnQgZXh0cmFjdGluZyAwIGJpdHMgYnV0IGRvCi0gICBzdXBwb3J0IGV4dHJhY3RpbmcgdGhlIHdob2xlIHdvcmQgKDMyIGJpdHMgaW4gdGhpcyBjYXNlKS4gICovCi0KLWNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvIHBvd2VycGNfbWFjcm9zW10gPSB7Ci17ICJleHRsZGkiLCAgNCwgICBQUEM2NCwJInJsZGljciAlMCwlMSwlMywoJTIpLTEiIH0sCi17ICJleHRsZGkuIiwgNCwgICBQUEM2NCwJInJsZGljci4gJTAsJTEsJTMsKCUyKS0xIiB9LAoteyAiZXh0cmRpIiwgIDQsICAgUFBDNjQsCSJybGRpY2wgJTAsJTEsKCUyKSsoJTMpLDY0LSglMikiIH0sCi17ICJleHRyZGkuIiwgNCwgICBQUEM2NCwJInJsZGljbC4gJTAsJTEsKCUyKSsoJTMpLDY0LSglMikiIH0sCi17ICJpbnNyZGkiLCAgNCwgICBQUEM2NCwJInJsZGltaSAlMCwlMSw2NC0oKCUyKSsoJTMpKSwlMyIgfSwKLXsgImluc3JkaS4iLCA0LCAgIFBQQzY0LAkicmxkaW1pLiAlMCwlMSw2NC0oKCUyKSsoJTMpKSwlMyIgfSwKLXsgInJvdHJkaSIsICAzLCAgIFBQQzY0LAkicmxkaWNsICUwLCUxLCgtKCUyKSE2MykmKCglMil8NjMpLDAiIH0sCi17ICJyb3RyZGkuIiwgMywgICBQUEM2NCwJInJsZGljbC4gJTAsJTEsKC0oJTIpITYzKSYoKCUyKXw2MyksMCIgfSwKLXsgInNsZGkiLCAgICAzLCAgIFBQQzY0LAkicmxkaWNyICUwLCUxLCUyLDYzLSglMikiIH0sCi17ICJzbGRpLiIsICAgMywgICBQUEM2NCwJInJsZGljci4gJTAsJTEsJTIsNjMtKCUyKSIgfSwKLXsgInNyZGkiLCAgICAzLCAgIFBQQzY0LAkicmxkaWNsICUwLCUxLCgtKCUyKSE2MykmKCglMil8NjMpLCUyIiB9LAoteyAic3JkaS4iLCAgIDMsICAgUFBDNjQsCSJybGRpY2wuICUwLCUxLCgtKCUyKSE2MykmKCglMil8NjMpLCUyIiB9LAoteyAiY2xycmRpIiwgIDMsICAgUFBDNjQsCSJybGRpY3IgJTAsJTEsMCw2My0oJTIpIiB9LAoteyAiY2xycmRpLiIsIDMsICAgUFBDNjQsCSJybGRpY3IuICUwLCUxLDAsNjMtKCUyKSIgfSwKLXsgImNscmxzbGRpIiw0LCAgIFBQQzY0LAkicmxkaWMgJTAsJTEsJTMsKCUyKS0oJTMpIiB9LAoteyAiY2xybHNsZGkuIiw0LCAgUFBDNjQsCSJybGRpYy4gJTAsJTEsJTMsKCUyKS0oJTMpIiB9LAotCi17ICJleHRsd2kiLCAgNCwgICBQUENDT00sCSJybHdpbm0gJTAsJTEsJTMsMCwoJTIpLTEiIH0sCi17ICJleHRsd2kuIiwgNCwgICBQUENDT00sCSJybHdpbm0uICUwLCUxLCUzLDAsKCUyKS0xIiB9LAoteyAiZXh0cndpIiwgIDQsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLCglMikrKCUzKSwzMi0oJTIpLDMxIiB9LAoteyAiZXh0cndpLiIsIDQsICAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwoJTIpKyglMyksMzItKCUyKSwzMSIgfSwKLXsgImluc2x3aSIsICA0LCAgIFBQQ0NPTSwJInJsd2ltaSAlMCwlMSwoLSglMykhMzEpJigoJTMpfDMxKSwlMywoJTIpKyglMyktMSIgfSwKLXsgImluc2x3aS4iLCA0LCAgIFBQQ0NPTSwJInJsd2ltaS4gJTAsJTEsKC0oJTMpITMxKSYoKCUzKXwzMSksJTMsKCUyKSsoJTMpLTEifSwKLXsgImluc3J3aSIsICA0LCAgIFBQQ0NPTSwJInJsd2ltaSAlMCwlMSwzMi0oKCUyKSsoJTMpKSwlMywoJTIpKyglMyktMSIgfSwKLXsgImluc3J3aS4iLCA0LCAgIFBQQ0NPTSwJInJsd2ltaS4gJTAsJTEsMzItKCglMikrKCUzKSksJTMsKCUyKSsoJTMpLTEifSwKLXsgInJvdHJ3aSIsICAzLCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwoLSglMikhMzEpJigoJTIpfDMxKSwwLDMxIiB9LAoteyAicm90cndpLiIsIDMsICAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwoLSglMikhMzEpJigoJTIpfDMxKSwwLDMxIiB9LAoteyAic2x3aSIsICAgIDMsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLCUyLDAsMzEtKCUyKSIgfSwKLXsgInNsaSIsICAgICAzLCAgIFBXUkNPTSwJInJsaW5tICUwLCUxLCUyLDAsMzEtKCUyKSIgfSwKLXsgInNsd2kuIiwgICAzLCAgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsJTIsMCwzMS0oJTIpIiB9LAoteyAic2xpLiIsICAgIDMsICAgUFdSQ09NLAkicmxpbm0uICUwLCUxLCUyLDAsMzEtKCUyKSIgfSwKLXsgInNyd2kiLCAgICAzLCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwoLSglMikhMzEpJigoJTIpfDMxKSwlMiwzMSIgfSwKLXsgInNyaSIsICAgICAzLCAgIFBXUkNPTSwJInJsaW5tICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLCUyLDMxIiB9LAoteyAic3J3aS4iLCAgIDMsICAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwoLSglMikhMzEpJigoJTIpfDMxKSwlMiwzMSIgfSwKLXsgInNyaS4iLCAgICAzLCAgIFBXUkNPTSwJInJsaW5tLiAlMCwlMSwoLSglMikhMzEpJigoJTIpfDMxKSwlMiwzMSIgfSwKLXsgImNscnJ3aSIsICAzLCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwwLDAsMzEtKCUyKSIgfSwKLXsgImNscnJ3aS4iLCAzLCAgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsMCwwLDMxLSglMikiIH0sCi17ICJjbHJsc2x3aSIsNCwgICBQUENDT00sCSJybHdpbm0gJTAsJTEsJTMsKCUyKS0oJTMpLDMxLSglMykiIH0sCi17ICJjbHJsc2x3aS4iLDQsICBQUENDT00sCSJybHdpbm0uICUwLCUxLCUzLCglMiktKCUzKSwzMS0oJTMpIiB9LAotCi19OwotCi1jb25zdCBpbnQgcG93ZXJwY19udW1fbWFjcm9zID0KLSAgc2l6ZW9mIChwb3dlcnBjX21hY3JvcykgLyBzaXplb2YgKHBvd2VycGNfbWFjcm9zWzBdKTsKZGlmZiAtLWdpdCBhL29wY29kZXMvc2gtZGlzLmMgYi9vcGNvZGVzL3NoLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWJmZGI2Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvc2gtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgU0ggaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZGVmaW5lIFNUQVRJQ19UQUJMRQotI2RlZmluZSBERUZJTkVfVEFCTEUKLQotI2luY2x1ZGUgInNoLW9wYy5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotI2RlZmluZSBMSVRUTEVfQklUIDIKLQotc3RhdGljIGludCAKLXByaW50X2luc25fc2h4IChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBmcHJpbnRmX2Z0eXBlIGZwcmludGZfZm4gPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0gIHZvaWQgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgdW5zaWduZWQgY2hhciBpbnNuWzJdOwotICB1bnNpZ25lZCBjaGFyIG5pYnNbNF07Ci0gIGludCBzdGF0dXM7Ci0gIGJmZF92bWEgcmVsbWFzayA9IH4gKGJmZF92bWEpIDA7Ci0gIHNoX29wY29kZV9pbmZvICpvcDsKLQotICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyLCBpbnNuLCAyLCBpbmZvKTsKLQotICBpZiAoc3RhdHVzICE9IDApIAotICAgIHsKLSAgICAgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoaW5mby0+ZmxhZ3MgJiBMSVRUTEVfQklUKSAKLSAgICB7Ci0gICAgICBuaWJzWzBdID0gKGluc25bMV0gPj4gNCkgJiAweGY7Ci0gICAgICBuaWJzWzFdID0gaW5zblsxXSAmIDB4ZjsKLQotICAgICAgbmlic1syXSA9IChpbnNuWzBdID4+IDQpICYgMHhmOwotICAgICAgbmlic1szXSA9IGluc25bMF0gJiAweGY7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIG5pYnNbMF0gPSAoaW5zblswXSA+PiA0KSAmIDB4ZjsKLSAgICAgIG5pYnNbMV0gPSBpbnNuWzBdICYgMHhmOwotCi0gICAgICBuaWJzWzJdID0gKGluc25bMV0gPj4gNCkgJiAweGY7Ci0gICAgICBuaWJzWzNdID0gaW5zblsxXSAmIDB4ZjsKLSAgICB9Ci0KLSAgZm9yIChvcCA9IHNoX3RhYmxlOyBvcC0+bmFtZTsgb3ArKykgCi0gICAgewotICAgICAgaW50IG47Ci0gICAgICBpbnQgaW1tID0gMDsKLSAgICAgIGludCBybiA9IDA7Ci0gICAgICBpbnQgcm0gPSAwOwotICAgICAgaW50IHJiID0gMDsKLSAgICAgIGludCBkaXNwX3BjOwotICAgICAgYmZkX3ZtYSBkaXNwX3BjX2FkZHIgPSAwOwotCi0gICAgICBmb3IgKG4gPSAwOyBuIDwgNDsgbisrKQotCXsKLQkgIGludCBpID0gb3AtPm5pYmJsZXNbbl07Ci0KLQkgIGlmIChpIDwgMTYpIAotCSAgICB7Ci0JICAgICAgaWYgKG5pYnNbbl0gPT0gaSkKLQkJY29udGludWU7Ci0JICAgICAgZ290byBmYWlsOwotCSAgICB9Ci0JICBzd2l0Y2ggKGkpCi0JICAgIHsKLQkgICAgY2FzZSBCUkFOQ0hfODoKLQkgICAgICBpbW0gPSAobmlic1syXSA8PCA0KSB8IChuaWJzWzNdKTsJICAKLQkgICAgICBpZiAoaW1tICYgMHg4MCkKLQkJaW1tIHw9IH4weGZmOwotCSAgICAgIGltbSA9ICgoY2hhcilpbW0pICogMiArIDQgOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgQlJBTkNIXzEyOgotCSAgICAgIGltbSA9ICgobmlic1sxXSkgPDwgOCkgfCAobmlic1syXSA8PCA0KSB8IChuaWJzWzNdKTsKLQkgICAgICBpZiAoaW1tICYgMHg4MDApCi0JCWltbSB8PSB+MHhmZmY7Ci0JICAgICAgaW1tID0gaW1tICogMiArIDQ7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBJTU1fNDoKLQkgICAgICBpbW0gPSBuaWJzWzNdOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgSU1NXzRCWTI6Ci0JICAgICAgaW1tID0gbmlic1szXSA8PDE7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBJTU1fNEJZNDoKLQkgICAgICBpbW0gPSBuaWJzWzNdIDw8MjsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIElNTV84OgotCSAgICAgIGltbSA9IChuaWJzWzJdIDw8IDQpIHwgbmlic1szXTsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIFBDUkVMSU1NXzhCWTI6Ci0JICAgICAgaW1tID0gKChuaWJzWzJdIDw8IDQpIHwgbmlic1szXSkgPDwxOwotCSAgICAgIHJlbG1hc2sgPSB+IChiZmRfdm1hKSAxOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgUENSRUxJTU1fOEJZNDoKLQkgICAgICBpbW0gPSAoKG5pYnNbMl0gPDwgNCkgfCBuaWJzWzNdKSA8PDI7Ci0JICAgICAgcmVsbWFzayA9IH4gKGJmZF92bWEpIDM7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBJTU1fOEJZMjoKLQkgICAgICBpbW0gPSAoKG5pYnNbMl0gPDwgNCkgfCBuaWJzWzNdKSA8PDE7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBJTU1fOEJZNDoKLQkgICAgICBpbW0gPSAoKG5pYnNbMl0gPDwgNCkgfCBuaWJzWzNdKSA8PDI7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBESVNQXzg6Ci0JICAgICAgaW1tID0gKG5pYnNbMl0gPDwgNCkgfCAobmlic1szXSk7CSAgCi0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBESVNQXzQ6Ci0JICAgICAgaW1tID0gbmlic1szXTsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIFJFR19OOgotCSAgICAgIHJuID0gbmlic1tuXTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRUdfTToKLQkgICAgICBybSA9IG5pYnNbbl07Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkVHX05NOgotCSAgICAgIHJuID0gKG5pYnNbbl0gJiAweGMpID4+IDI7Ci0JICAgICAgcm0gPSAobmlic1tuXSAmIDB4Myk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkVHX0I6Ci0JICAgICAgcmIgPSBuaWJzW25dICYgMHgwNzsKLQkgICAgICBicmVhazsJCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCX0KLQotICAgIG9rOgotICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCIlc1x0Iiwgb3AtPm5hbWUpOwotICAgICAgZGlzcF9wYyA9IDA7Ci0gICAgICBmb3IgKG4gPSAwOyBuIDwgMyAmJiBvcC0+YXJnW25dICE9IEFfRU5EOyBuKyspIAotCXsKLQkgIGlmIChuICYmIG9wLT5hcmdbMV0gIT0gQV9FTkQpCi0JICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIiwiKTsKLQkgIHN3aXRjaCAob3AtPmFyZ1tuXSkgCi0JICAgIHsKLQkgICAgY2FzZSBBX0lNTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICIjJWQiLCAoY2hhcikoaW1tKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9SMDoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJyMCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfUkVHX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiciVkIiwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfSU5DX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQHIlZCsiLCBybik7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfREVDX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQC1yJWQiLCBybik7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfSU5EX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQHIlZCIsIHJuKTsJCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9ESVNQX1JFR19OOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAoJWQsciVkKSIsIGltbSwgcm4pOwkKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1JFR19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInIlZCIsIHJtKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0lOQ19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkByJWQrIiwgcm0pOwkKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0RFQ19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAtciVkIiwgcm0pOwkKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0lORF9NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkByJWQiLCBybSk7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfRElTUF9SRUdfTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAKCVkLHIlZCkiLCBpbW0sIHJtKTsJCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9SRUdfQjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJyJWRfYmFuayIsIHJiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0RJU1BfUEM6Ci0JICAgICAgZGlzcF9wYyA9IDE7Ci0JICAgICAgZGlzcF9wY19hZGRyID0gaW1tICsgNCArIChtZW1hZGRyICYgcmVsbWFzayk7Ci0JICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChkaXNwX3BjX2FkZHIsIGluZm8pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfSU5EX1IwX1JFR19OOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAocjAsciVkKSIsIHJuKTsKLQkgICAgICBicmVhazsgCi0JICAgIGNhc2UgQV9JTkRfUjBfUkVHX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQChyMCxyJWQpIiwgcm0pOwotCSAgICAgIGJyZWFrOyAKLQkgICAgY2FzZSBBX0RJU1BfR0JSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAoJWQsZ2JyKSIsaW1tKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1IwX0dCUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAKHIwLGdicikiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0JESVNQMTI6Ci0JICAgIGNhc2UgQV9CRElTUDg6Ci0JICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChpbW0gKyBtZW1hZGRyLCBpbmZvKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1NSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInNyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9HQlI6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZ2JyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9WQlI6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAidmJyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9TU1I6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAic3NyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9TUEM6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAic3BjIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9NQUNIOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIm1hY2giKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX01BQ0w6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtICwibWFjbCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfUFI6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAicHIiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1NHUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJzZ3IiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0RCUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJkYnIiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBGRF9SRUdfTjoKLQkgICAgICBpZiAoMCkKLQkJZ290byBkX3JlZ19uOwotCSAgICBjYXNlIEZfUkVHX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnIlZCIsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBGX1JFR19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImZyJWQiLCBybSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFhfUkVHX046Ci0JICAgICAgaWYgKHJuICYgMSkKLQkJewotCQkgIGZwcmludGZfZm4gKHN0cmVhbSwgInhkJWQiLCBybiAmIH4xKTsKLQkJICBicmVhazsKLQkJfQotCSAgICBkX3JlZ19uOgotCSAgICBjYXNlIERfUkVHX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZHIlZCIsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEWF9SRUdfTToKLQkgICAgICBpZiAocm0gJiAxKQotCQl7Ci0JCSAgZnByaW50Zl9mbiAoc3RyZWFtLCAieGQlZCIsIHJtICYgfjEpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIGNhc2UgRF9SRUdfTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJkciVkIiwgcm0pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZQU0NSX006Ci0JICAgIGNhc2UgRlBTQ1JfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJmcHNjciIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZQVUxfTToKLQkgICAgY2FzZSBGUFVMX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnB1bCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZfRlIwOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImZyMCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFZfUkVHX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnYlZCIsIHJuKjQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFZfUkVHX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnYlZCIsIHJtKjQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFhNVFJYX000OgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInhtdHJ4Iik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCX0KLQotI2lmIDAKLSAgICAgIC8qIFRoaXMgY29kZSBwcmludHMgaW5zdHJ1Y3Rpb25zIGluIGRlbGF5IHNsb3RzIG9uIHRoZSBzYW1lIGxpbmUKLSAgICAgICAgIGFzIHRoZSBpbnN0cnVjdGlvbiB3aGljaCBuZWVkcyB0aGUgZGVsYXkgc2xvdHMuICBUaGlzIGNhbiBiZQotICAgICAgICAgY29uZnVzaW5nLCBzaW5jZSBvdGhlciBkaXNhc3NlbWJsZXIgZG9uJ3Qgd29yayB0aGlzIHdheSwgYW5kCi0gICAgICAgICBpdCBtZWFucyB0aGF0IHRoZSBpbnN0cnVjdGlvbnMgYXJlIG5vdCBhbGwgaW4gYSBsaW5lLiAgU28gSQotICAgICAgICAgZGlzYWJsZWQgaXQuICBJYW4uICAqLwotICAgICAgaWYgKCEoaW5mby0+ZmxhZ3MgJiAxKQotCSAgJiYgKG9wLT5uYW1lWzBdID09ICdqJwotCSAgICAgIHx8IChvcC0+bmFtZVswXSA9PSAnYicKLQkJICAmJiAob3AtPm5hbWVbMV0gPT0gJ3InIAotCQkgICAgICB8fCBvcC0+bmFtZVsxXSA9PSAncycpKQotCSAgICAgIHx8IChvcC0+bmFtZVswXSA9PSAncicgJiYgb3AtPm5hbWVbMV0gPT0gJ3QnKQotCSAgICAgIHx8IChvcC0+bmFtZVswXSA9PSAnYicgJiYgb3AtPm5hbWVbMl0gPT0gJy4nKSkpCi0JewotCSAgaW5mby0+ZmxhZ3MgfD0gMTsKLQkgIGZwcmludGZfZm4gKHN0cmVhbSwgIlx0KHNsb3QgIik7Ci0JICBwcmludF9pbnNuX3NoeCAobWVtYWRkciArIDIsIGluZm8pOwotCSAgaW5mby0+ZmxhZ3MgJj0gfjE7Ci0JICBmcHJpbnRmX2ZuIChzdHJlYW0sICIpIik7Ci0JICByZXR1cm4gNDsKLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKGRpc3BfcGMgJiYgc3RyY21wIChvcC0+bmFtZSwgIm1vdmEiKSAhPSAwKQotCXsKLQkgIGludCBzaXplOwotCSAgYmZkX2J5dGUgYnl0ZXNbNF07Ci0KLQkgIGlmIChyZWxtYXNrID09IH4gKGJmZF92bWEpIDEpCi0JICAgIHNpemUgPSAyOwotCSAgZWxzZQotCSAgICBzaXplID0gNDsKLQkgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKGRpc3BfcGNfYWRkciwgYnl0ZXMsIHNpemUsIGluZm8pOwotCSAgaWYgKHN0YXR1cyA9PSAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IHZhbDsKLQotCSAgICAgIGlmIChzaXplID09IDIpCi0JCXsKLQkJICBpZiAoKGluZm8tPmZsYWdzICYgTElUVExFX0JJVCkgIT0gMCkKLQkJICAgIHZhbCA9IGJmZF9nZXRsMTYgKGJ5dGVzKTsKLQkJICBlbHNlCi0JCSAgICB2YWwgPSBiZmRfZ2V0YjE2IChieXRlcyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoKGluZm8tPmZsYWdzICYgTElUVExFX0JJVCkgIT0gMCkKLQkJICAgIHZhbCA9IGJmZF9nZXRsMzIgKGJ5dGVzKTsKLQkJICBlbHNlCi0JCSAgICB2YWwgPSBiZmRfZ2V0YjMyIChieXRlcyk7Ci0JCX0KLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJcdCEgMHgleCIsIHZhbCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHJldHVybiAyOwotICAgIGZhaWw6Ci0gICAgICA7Ci0KLSAgICB9Ci0gIGZwcmludGZfZm4gKHN0cmVhbSwgIi53b3JkIDB4JXgleCV4JXgiLCBuaWJzWzBdLCBuaWJzWzFdLCBuaWJzWzJdLCBuaWJzWzNdKTsKLSAgcmV0dXJuIDI7Ci19Ci0KLWludCAKLXByaW50X2luc25fc2hsIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgcjsKLQotICBpbmZvLT5mbGFncyA9IExJVFRMRV9CSVQ7Ci0gIHIgPSBwcmludF9pbnNuX3NoeCAobWVtYWRkciwgaW5mbyk7Ci0gIHJldHVybiByOwotfQotCi1pbnQgCi1wcmludF9pbnNuX3NoIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgcjsKLQotICBpbmZvLT5mbGFncyA9IDA7Ci0gIHIgPSBwcmludF9pbnNuX3NoeCAobWVtYWRkciwgaW5mbyk7Ci0gIHJldHVybiByOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zaC1vcGMuaCBiL29wY29kZXMvc2gtb3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMWFhZTUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9zaC1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3MyArMCwwIEBACi0vKiBEZWZpbml0aW9ucyBmb3IgU0ggb3Bjb2Rlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLQlIRVhfMCwKLQlIRVhfMSwKLQlIRVhfMiwKLQlIRVhfMywKLQlIRVhfNCwKLQlIRVhfNSwKLQlIRVhfNiwKLQlIRVhfNywKLQlIRVhfOCwKLQlIRVhfOSwKLQlIRVhfQSwKLQlIRVhfQiwKLQlIRVhfQywKLQlIRVhfRCwKLQlIRVhfRSwKLQlIRVhfRiwKLQlSRUdfTiwKLQlSRUdfTSwKLQlSRUdfTk0sCi0gICAgICAgIFJFR19CLAotCUJSQU5DSF8xMiwKLQlCUkFOQ0hfOCwKLQlESVNQXzgsCi0JRElTUF80LAotCUlNTV80LAotCUlNTV80QlkyLAotCUlNTV80Qlk0LAotCVBDUkVMSU1NXzhCWTIsCi0JUENSRUxJTU1fOEJZNCwKLQlJTU1fOCwKLQlJTU1fOEJZMiwKLQlJTU1fOEJZNAotfSBzaF9uaWJibGVfdHlwZTsKLQotdHlwZWRlZiBlbnVtIHsKLQlBX0VORCwKLQlBX0JESVNQMTIsCi0JQV9CRElTUDgsCi0JQV9ERUNfTSwKLQlBX0RFQ19OLAotCUFfRElTUF9HQlIsCi0JQV9ESVNQX1BDLAotCUFfRElTUF9SRUdfTSwKLQlBX0RJU1BfUkVHX04sCi0JQV9HQlIsCi0JQV9JTU0sCi0JQV9JTkNfTSwKLQlBX0lOQ19OLAotCUFfSU5EX00sCi0JQV9JTkRfTiwKLQlBX0lORF9SMF9SRUdfTSwKLQlBX0lORF9SMF9SRUdfTiwKLQlBX01BQ0gsCi0JQV9NQUNMLAotCUFfUFIsCi0JQV9SMCwKLQlBX1IwX0dCUiwKLQlBX1JFR19NLAotCUFfUkVHX04sCi0JQV9SRUdfQiwKLQlBX1NSLAotCUFfVkJSLAotCUFfU1NSLAotCUFfU1BDLAotCUFfU0dSLAotCUFfREJSLAotCUZfUkVHX04sCi0JRl9SRUdfTSwKLQlEX1JFR19OLAotCURfUkVHX00sCi0JWF9SRUdfTiwgLyogT25seSB1c2VkIGZvciBhcmd1bWVudCBwYXJzaW5nICovCi0JWF9SRUdfTSwgLyogT25seSB1c2VkIGZvciBhcmd1bWVudCBwYXJzaW5nICovCi0JRFhfUkVHX04sCi0JRFhfUkVHX00sCi0JVl9SRUdfTiwKLQlWX1JFR19NLAotCUZEX1JFR19OLAotCVhNVFJYX000LAotCUZfRlIwLAotCUZQVUxfTiwKLQlGUFVMX00sCi0JRlBTQ1JfTiwKLQlGUFNDUl9NCi19IHNoX2FyZ190eXBlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIHNoX2FyZ190eXBlIGFyZ1s0XTsKLSAgc2hfbmliYmxlX3R5cGUgbmliYmxlc1s0XTsKLX0gc2hfb3Bjb2RlX2luZm87Ci0KLSNpZmRlZiBERUZJTkVfVEFCTEUKLQotc2hfb3Bjb2RlX2luZm8gc2hfdGFibGVbXSA9IHsKLQotLyogMDExMW5ubm5pOCoxLi4uLiBhZGQgIzxpbW0+LDxSRUdfTj4gICoveyJhZGQiLHtBX0lNTSxBX1JFR19OfSx7SEVYXzcsUkVHX04sSU1NXzh9fSwKLQotLyogMDAxMW5ubm5tbW1tMTEwMCBhZGQgPFJFR19NPiw8UkVHX04+ICoveyJhZGQiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYX0N9fSwKLQotLyogMDAxMW5ubm5tbW1tMTExMCBhZGRjIDxSRUdfTT4sPFJFR19OPioveyJhZGRjIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF9FfX0sCi0KLS8qIDAwMTFubm5ubW1tbTExMTEgYWRkdiA8UkVHX00+LDxSRUdfTj4qL3siYWRkdiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfRn19LAotCi0vKiAxMTAwMTAwMWk4KjEuLi4uIGFuZCAjPGltbT4sUjAgICAgICAgKi97ImFuZCIse0FfSU1NLEFfUjB9LHtIRVhfQyxIRVhfOSxJTU1fOH19LAotCi0vKiAwMDEwbm5ubm1tbW0xMDAxIGFuZCA8UkVHX00+LDxSRUdfTj4gKi97ImFuZCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfOX19LAotCi0vKiAxMTAwMTEwMWk4KjEuLi4uIGFuZC5iICM8aW1tPixAKFIwLEdCUikqL3siYW5kLmIiLHtBX0lNTSxBX1IwX0dCUn0se0hFWF9DLEhFWF9ELElNTV84fX0sCi0KLS8qIDEwMTBpMTIuLi4uLi4uLi4gYnJhIDxiZGlzcDEyPiAgICAgICAqL3siYnJhIix7QV9CRElTUDEyfSx7SEVYX0EsQlJBTkNIXzEyfX0sCi0KLS8qIDEwMTFpMTIuLi4uLi4uLi4gYnNyIDxiZGlzcDEyPiAgICAgICAqL3siYnNyIix7QV9CRElTUDEyfSx7SEVYX0IsQlJBTkNIXzEyfX0sCi0KLS8qIDEwMDAxMDAxaThwMS4uLi4gYnQgPGJkaXNwOD4gICAgICAgICAqL3siYnQiLHtBX0JESVNQOH0se0hFWF84LEhFWF85LEJSQU5DSF84fX0sCi0KLS8qIDEwMDAxMDExaThwMS4uLi4gYmYgPGJkaXNwOD4gICAgICAgICAqL3siYmYiLHtBX0JESVNQOH0se0hFWF84LEhFWF9CLEJSQU5DSF84fX0sCi0KLS8qIDEwMDAxMTAxaThwMS4uLi4gYnQucyA8YmRpc3A4PiAgICAgICAqL3siYnQucyIse0FfQkRJU1A4fSx7SEVYXzgsSEVYX0QsQlJBTkNIXzh9fSwKLQotLyogMTAwMDExMDFpOHAxLi4uLiBidC9zIDxiZGlzcDg+ICAgICAgICoveyJidC9zIix7QV9CRElTUDh9LHtIRVhfOCxIRVhfRCxCUkFOQ0hfOH19LAotCi0vKiAxMDAwMTExMWk4cDEuLi4uIGJmLnMgPGJkaXNwOD4gICAgICAgKi97ImJmLnMiLHtBX0JESVNQOH0se0hFWF84LEhFWF9GLEJSQU5DSF84fX0sCi0KLS8qIDEwMDAxMTExaThwMS4uLi4gYmYvcyA8YmRpc3A4PiAgICAgICAqL3siYmYvcyIse0FfQkRJU1A4fSx7SEVYXzgsSEVYX0YsQlJBTkNIXzh9fSwKLQotLyogMDAwMDAwMDAwMDEwMTAwMCBjbHJtYWMgICAgICAgICAgICAgICoveyJjbHJtYWMiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzIsSEVYXzh9fSwKLQotLyogMDAwMDAwMDAwMTAwMTAwMCBjbHJzICAgICAgICAgICAgICAgICoveyJjbHJzIix7MH0se0hFWF8wLEhFWF8wLEhFWF80LEhFWF84fX0sCi0KLS8qIDAwMDAwMDAwMDAwMDEwMDAgY2xydCAgICAgICAgICAgICAgICAqL3siY2xydCIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMCxIRVhfOH19LAotCi0vKiAxMDAwMTAwMGk4KjEuLi4uIGNtcC9lcSAjPGltbT4sUjAgICAgKi97ImNtcC9lcSIse0FfSU1NLEFfUjB9LHtIRVhfOCxIRVhfOCxJTU1fOH19LAotCi0vKiAwMDExbm5ubm1tbW0wMDAwIGNtcC9lcSA8UkVHX00+LDxSRUdfTj4qL3siY21wL2VxIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF8wfX0sCi0KLS8qIDAwMTFubm5ubW1tbTAwMTEgY21wL2dlIDxSRUdfTT4sPFJFR19OPioveyJjbXAvZ2UiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzN9fSwKLQotLyogMDAxMW5ubm5tbW1tMDExMSBjbXAvZ3QgPFJFR19NPiw8UkVHX04+Ki97ImNtcC9ndCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfN319LAotCi0vKiAwMDExbm5ubm1tbW0wMTEwIGNtcC9oaSA8UkVHX00+LDxSRUdfTj4qL3siY21wL2hpIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF82fX0sCi0KLS8qIDAwMTFubm5ubW1tbTAwMTAgY21wL2hzIDxSRUdfTT4sPFJFR19OPioveyJjbXAvaHMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzJ9fSwKLQotLyogMDEwMG5ubm4wMDAxMDEwMSBjbXAvcGwgPFJFR19OPiAgICAgICoveyJjbXAvcGwiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzV9fSwKLQotLyogMDEwMG5ubm4wMDAxMDAwMSBjbXAvcHogPFJFR19OPiAgICAgICoveyJjbXAvcHoiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzF9fSwKLQotLyogMDAxMG5ubm5tbW1tMTEwMCBjbXAvc3RyIDxSRUdfTT4sPFJFR19OPioveyJjbXAvc3RyIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9DfX0sCi0KLS8qIDAwMTBubm5ubW1tbTAxMTEgZGl2MHMgPFJFR19NPiw8UkVHX04+Ki97ImRpdjBzIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF83fX0sCi0KLS8qIDAwMDAwMDAwMDAwMTEwMDEgZGl2MHUgICAgICAgICAgICAgICAqL3siZGl2MHUiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzEsSEVYXzl9fSwKLQotLyogMDAxMW5ubm5tbW1tMDEwMCBkaXYxIDxSRUdfTT4sPFJFR19OPioveyJkaXYxIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF80fX0sCi0KLS8qIDAxMTBubm5ubW1tbTExMTAgZXh0cy5iIDxSRUdfTT4sPFJFR19OPioveyJleHRzLmIiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYX0V9fSwKLQotLyogMDExMG5ubm5tbW1tMTExMSBleHRzLncgPFJFR19NPiw8UkVHX04+Ki97ImV4dHMudyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfRn19LAotCi0vKiAwMTEwbm5ubm1tbW0xMTAwIGV4dHUuYiA8UkVHX00+LDxSRUdfTj4qL3siZXh0dS5iIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF9DfX0sCi0KLS8qIDAxMTBubm5ubW1tbTExMDEgZXh0dS53IDxSRUdfTT4sPFJFR19OPioveyJleHR1LnciLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYX0R9fSwKLQotLyogMDEwMG5ubm4wMDEwMTAxMSBqbXAgQDxSRUdfTj4gICAgICAgICoveyJqbXAiLHtBX0lORF9OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYX0J9fSwKLQotLyogMDEwMG5ubm4wMDAwMTAxMSBqc3IgQDxSRUdfTj4gICAgICAgICoveyJqc3IiLHtBX0lORF9OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYX0J9fSwKLQotLyogMDEwMG5ubm4wMDAwMTExMCBsZGMgPFJFR19OPixTUiAgICAgICoveyJsZGMiLHtBX1JFR19OLEFfU1J9LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfRX19LAotCi0vKiAwMTAwbm5ubjAwMDExMTEwIGxkYyA8UkVHX04+LEdCUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9HQlJ9LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfRX19LAotCi0vKiAwMTAwbm5ubjAwMTAxMTEwIGxkYyA8UkVHX04+LFZCUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9WQlJ9LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfRX19LAotCi0vKiAwMTAwbm5ubjAwMTExMTEwIGxkYyA8UkVHX04+LFNTUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9TU1J9LHtIRVhfNCxSRUdfTixIRVhfMyxIRVhfRX19LAotCi0vKiAwMTAwbm5ubjAxMDAxMTEwIGxkYyA8UkVHX04+LFNQQyAgICAgKi97ImxkYyIse0FfUkVHX04sQV9TUEN9LHtIRVhfNCxSRUdfTixIRVhfNCxIRVhfRX19LAotCi0vKiAwMTAwbm5ubjAxMTExMTEwIGxkYyA8UkVHX04+LERCUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9EQlJ9LHtIRVhfNCxSRUdfTixIRVhfNyxIRVhfRX19LAotCi0vKiAwMTAwbm5ubjF4eHgxMTEwIGxkYyA8UkVHX04+LFJuX0JBTksgKi97ImxkYyIse0FfUkVHX04sQV9SRUdfQn0se0hFWF80LFJFR19OLFJFR19CLEhFWF9FfX0sCi0KLS8qIDAxMDBubm5uMDAwMDAxMTEgbGRjLmwgQDxSRUdfTj4rLFNSICAqL3sibGRjLmwiLHtBX0lOQ19OLEFfU1J9LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfN319LAotCi0vKiAwMTAwbm5ubjAwMDEwMTExIGxkYy5sIEA8UkVHX04+KyxHQlIgKi97ImxkYy5sIix7QV9JTkNfTixBX0dCUn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF83fX0sCi0KLS8qIDAxMDBubm5uMDAxMDAxMTEgbGRjLmwgQDxSRUdfTj4rLFZCUiAqL3sibGRjLmwiLHtBX0lOQ19OLEFfVkJSfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzd9fSwKLQotLyogMDEwMG5ubm4wMDExMDExMSBsZGMubCBAPFJFR19OPissU1NSICoveyJsZGMubCIse0FfSU5DX04sQV9TU1J9LHtIRVhfNCxSRUdfTixIRVhfMyxIRVhfN319LAotCi0vKiAwMTAwbm5ubjAxMDAwMTExIGxkYy5sIEA8UkVHX04+KyxTUEMgKi97ImxkYy5sIix7QV9JTkNfTixBX1NQQ30se0hFWF80LFJFR19OLEhFWF80LEhFWF83fX0sCi0KLS8qIDAxMDBubm5uMDExMTAxMTEgbGRjLmwgQDxSRUdfTj4rLERCUiAqL3sibGRjLmwiLHtBX0lOQ19OLEFfREJSfSx7SEVYXzQsUkVHX04sSEVYXzcsSEVYXzd9fSwKLQotLyogMDEwMG5ubm4xeHh4MDExMSBsZGMubCA8UkVHX04+LFJuX0JBTksgKi97ImxkYy5sIix7QV9JTkNfTixBX1JFR19CfSx7SEVYXzQsUkVHX04sUkVHX0IsSEVYXzd9fSwKLQotLyogMDEwMG5ubm4wMDAwMTAxMCBsZHMgPFJFR19OPixNQUNIICAgICoveyJsZHMiLHtBX1JFR19OLEFfTUFDSH0se0hFWF80LFJFR19OLEhFWF8wLEhFWF9BfX0sCi0KLS8qIDAxMDBubm5uMDAwMTEwMTAgbGRzIDxSRUdfTj4sTUFDTCAgICAqL3sibGRzIix7QV9SRUdfTixBX01BQ0x9LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfQX19LAotCi0vKiAwMTAwbm5ubjAwMTAxMDEwIGxkcyA8UkVHX04+LFBSICAgICAgKi97ImxkcyIse0FfUkVHX04sQV9QUn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF9BfX0sCi0KLS8qIDAxMDBubm5uMDEwMTEwMTAgbGRzIDxSRUdfTj4sRlBVTCAgICAqL3sibGRzIix7QV9SRUdfTSxGUFVMX059LHtIRVhfNCxSRUdfTSxIRVhfNSxIRVhfQX19LAotCi0vKiAwMTAwbm5ubjAxMTAxMDEwIGxkcyA8UkVHX00+LEZQU0NSICAgKi97ImxkcyIse0FfUkVHX00sRlBTQ1JfTn0se0hFWF80LFJFR19NLEhFWF82LEhFWF9BfX0sCi0KLS8qIDAxMDBubm5uMDAwMDAxMTAgbGRzLmwgQDxSRUdfTj4rLE1BQ0gqL3sibGRzLmwiLHtBX0lOQ19OLEFfTUFDSH0se0hFWF80LFJFR19OLEhFWF8wLEhFWF82fX0sCi0KLS8qIDAxMDBubm5uMDAwMTAxMTAgbGRzLmwgQDxSRUdfTj4rLE1BQ0wqL3sibGRzLmwiLHtBX0lOQ19OLEFfTUFDTH0se0hFWF80LFJFR19OLEhFWF8xLEhFWF82fX0sCi0KLS8qIDAxMDBubm5uMDAxMDAxMTAgbGRzLmwgQDxSRUdfTj4rLFBSICAqL3sibGRzLmwiLHtBX0lOQ19OLEFfUFJ9LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfNn19LAotCi0vKiAwMTAwbm5ubjAxMDEwMTEwIGxkcy5sIEA8UkVHX00+KyxGUFVMKi97Imxkcy5sIix7QV9JTkNfTSxGUFVMX059LHtIRVhfNCxSRUdfTSxIRVhfNSxIRVhfNn19LAotCi0vKiAwMTAwbm5ubjAxMTAwMTEwIGxkcy5sIEA8UkVHX00+KyxGUFNDUioveyJsZHMubCIse0FfSU5DX00sRlBTQ1JfTn0se0hFWF80LFJFR19NLEhFWF82LEhFWF82fX0sCi0KLS8qIDAwMDAwMDAwMDAxMTEwMDAgbGR0bGIgICAgICAgICAgICAgICAqL3sibGR0bGIiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzMsSEVYXzh9fSwKLQotLyogMDEwMG5ubm5tbW1tMTExMSBtYWMudyBAPFJFR19NPissQDxSRUdfTj4rKi97Im1hYy53Iix7QV9JTkNfTSxBX0lOQ19OfSx7SEVYXzQsUkVHX04sUkVHX00sSEVYX0Z9fSwKLQotLyogMTExMG5ubm5pOCoxLi4uLiBtb3YgIzxpbW0+LDxSRUdfTj4gICoveyJtb3YiLHtBX0lNTSxBX1JFR19OfSx7SEVYX0UsUkVHX04sSU1NXzh9fSwKLQotLyogMDExMG5ubm5tbW1tMDAxMSBtb3YgPFJFR19NPiw8UkVHX04+ICoveyJtb3YiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzN9fSwKLQotLyogMDAwMG5ubm5tbW1tMDEwMCBtb3YuYiA8UkVHX00+LEAoUjAsPFJFR19OPikqL3sibW92LmIiLHsgQV9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF80fX0sCi0KLS8qIDAwMTBubm5ubW1tbTAxMDAgbW92LmIgPFJFR19NPixALTxSRUdfTj4qL3sibW92LmIiLHsgQV9SRUdfTSxBX0RFQ19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzR9fSwKLQotLyogMDAxMG5ubm5tbW1tMDAwMCBtb3YuYiA8UkVHX00+LEA8UkVHX04+Ki97Im1vdi5iIix7IEFfUkVHX00sQV9JTkRfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF8wfX0sCi0KLS8qIDEwMDAwMTAwbW1tbWk0KjEgbW92LmIgQCg8ZGlzcD4sPFJFR19NPiksUjAqL3sibW92LmIiLHtBX0RJU1BfUkVHX00sQV9SMH0se0hFWF84LEhFWF80LFJFR19NLElNTV80fX0sCi0KLS8qIDExMDAwMTAwaTgqMS4uLi4gbW92LmIgQCg8ZGlzcD4sR0JSKSxSMCoveyJtb3YuYiIse0FfRElTUF9HQlIsQV9SMH0se0hFWF9DLEhFWF80LElNTV84fX0sCi0KLS8qIDAwMDBubm5ubW1tbTExMDAgbW92LmIgQChSMCw8UkVHX00+KSw8UkVHX04+Ki97Im1vdi5iIix7QV9JTkRfUjBfUkVHX00sQV9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF9DfX0sCi0KLS8qIDAxMTBubm5ubW1tbTAxMDAgbW92LmIgQDxSRUdfTT4rLDxSRUdfTj4qL3sibW92LmIiLHtBX0lOQ19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfNH19LAotCi0vKiAwMTEwbm5ubm1tbW0wMDAwIG1vdi5iIEA8UkVHX00+LDxSRUdfTj4qL3sibW92LmIiLHtBX0lORF9NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfMH19LAotCi0vKiAxMDAwMDAwMG1tbW1pNCoxIG1vdi5iIFIwLEAoPGRpc3A+LDxSRUdfTT4pKi97Im1vdi5iIix7QV9SMCxBX0RJU1BfUkVHX019LHtIRVhfOCxIRVhfMCxSRUdfTSxJTU1fNH19LAotCi0vKiAxMTAwMDAwMGk4KjEuLi4uIG1vdi5iIFIwLEAoPGRpc3A+LEdCUikqL3sibW92LmIiLHtBX1IwLEFfRElTUF9HQlJ9LHtIRVhfQyxIRVhfMCxJTU1fOH19LAotCi0vKiAwMDAxbm5ubm1tbW1pNCo0IG1vdi5sIDxSRUdfTT4sQCg8ZGlzcD4sPFJFR19OPikqL3sibW92LmwiLHsgQV9SRUdfTSxBX0RJU1BfUkVHX059LHtIRVhfMSxSRUdfTixSRUdfTSxJTU1fNEJZNH19LAotCi0vKiAwMDAwbm5ubm1tbW0wMTEwIG1vdi5sIDxSRUdfTT4sQChSMCw8UkVHX04+KSoveyJtb3YubCIseyBBX1JFR19NLEFfSU5EX1IwX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYXzZ9fSwKLQotLyogMDAxMG5ubm5tbW1tMDExMCBtb3YubCA8UkVHX00+LEAtPFJFR19OPioveyJtb3YubCIseyBBX1JFR19NLEFfREVDX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfNn19LAotCi0vKiAwMDEwbm5ubm1tbW0wMDEwIG1vdi5sIDxSRUdfTT4sQDxSRUdfTj4qL3sibW92LmwiLHsgQV9SRUdfTSxBX0lORF9OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzJ9fSwKLQotLyogMDEwMW5ubm5tbW1taTQqNCBtb3YubCBAKDxkaXNwPiw8UkVHX00+KSw8UkVHX04+Ki97Im1vdi5sIix7QV9ESVNQX1JFR19NLEFfUkVHX059LHtIRVhfNSxSRUdfTixSRUdfTSxJTU1fNEJZNH19LAotCi0vKiAxMTAwMDExMGk4KjQuLi4uIG1vdi5sIEAoPGRpc3A+LEdCUiksUjAqL3sibW92LmwiLHtBX0RJU1BfR0JSLEFfUjB9LHtIRVhfQyxIRVhfNixJTU1fOEJZNH19LAotCi0vKiAxMTAxbm5ubmk4cDQuLi4uIG1vdi5sIEAoPGRpc3A+LFBDKSw8UkVHX04+Ki97Im1vdi5sIix7QV9ESVNQX1BDLEFfUkVHX059LHtIRVhfRCxSRUdfTixQQ1JFTElNTV84Qlk0fX0sCi0KLS8qIDAwMDBubm5ubW1tbTExMTAgbW92LmwgQChSMCw8UkVHX00+KSw8UkVHX04+Ki97Im1vdi5sIix7QV9JTkRfUjBfUkVHX00sQV9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF9FfX0sCi0KLS8qIDAxMTBubm5ubW1tbTAxMTAgbW92LmwgQDxSRUdfTT4rLDxSRUdfTj4qL3sibW92LmwiLHtBX0lOQ19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfNn19LAotCi0vKiAwMTEwbm5ubm1tbW0wMDEwIG1vdi5sIEA8UkVHX00+LDxSRUdfTj4qL3sibW92LmwiLHtBX0lORF9NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfMn19LAotCi0vKiAxMTAwMDAxMGk4KjQuLi4uIG1vdi5sIFIwLEAoPGRpc3A+LEdCUikqL3sibW92LmwiLHtBX1IwLEFfRElTUF9HQlJ9LHtIRVhfQyxIRVhfMixJTU1fOEJZNH19LAotCi0vKiAwMDAwbm5ubm1tbW0wMTAxIG1vdi53IDxSRUdfTT4sQChSMCw8UkVHX04+KSoveyJtb3YudyIseyBBX1JFR19NLEFfSU5EX1IwX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYXzV9fSwKLQotLyogMDAxMG5ubm5tbW1tMDEwMSBtb3YudyA8UkVHX00+LEAtPFJFR19OPioveyJtb3YudyIseyBBX1JFR19NLEFfREVDX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfNX19LAotCi0vKiAwMDEwbm5ubm1tbW0wMDAxIG1vdi53IDxSRUdfTT4sQDxSRUdfTj4qL3sibW92LnciLHsgQV9SRUdfTSxBX0lORF9OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzF9fSwKLQotLyogMTAwMDAxMDFtbW1taTQqMiBtb3YudyBAKDxkaXNwPiw8UkVHX00+KSxSMCoveyJtb3YudyIse0FfRElTUF9SRUdfTSxBX1IwfSx7SEVYXzgsSEVYXzUsUkVHX00sSU1NXzRCWTJ9fSwKLQotLyogMTEwMDAxMDFpOCoyLi4uLiBtb3YudyBAKDxkaXNwPixHQlIpLFIwKi97Im1vdi53Iix7QV9ESVNQX0dCUixBX1IwfSx7SEVYX0MsSEVYXzUsSU1NXzhCWTJ9fSwKLQotLyogMTAwMW5ubm5pOHAyLi4uLiBtb3YudyBAKDxkaXNwPixQQyksPFJFR19OPioveyJtb3YudyIse0FfRElTUF9QQyxBX1JFR19OfSx7SEVYXzksUkVHX04sUENSRUxJTU1fOEJZMn19LAotCi0vKiAwMDAwbm5ubm1tbW0xMTAxIG1vdi53IEAoUjAsPFJFR19NPiksPFJFR19OPioveyJtb3YudyIse0FfSU5EX1IwX1JFR19NLEFfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfRH19LAotCi0vKiAwMTEwbm5ubm1tbW0wMTAxIG1vdi53IEA8UkVHX00+Kyw8UkVHX04+Ki97Im1vdi53Iix7QV9JTkNfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzV9fSwKLQotLyogMDExMG5ubm5tbW1tMDAwMSBtb3YudyBAPFJFR19NPiw8UkVHX04+Ki97Im1vdi53Iix7QV9JTkRfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzF9fSwKLQotLyogMTAwMDAwMDFtbW1taTQqMiBtb3YudyBSMCxAKDxkaXNwPiw8UkVHX00+KSoveyJtb3YudyIse0FfUjAsQV9ESVNQX1JFR19NfSx7SEVYXzgsSEVYXzEsUkVHX00sSU1NXzRCWTJ9fSwKLQotLyogMTEwMDAwMDFpOCoyLi4uLiBtb3YudyBSMCxAKDxkaXNwPixHQlIpKi97Im1vdi53Iix7QV9SMCxBX0RJU1BfR0JSfSx7SEVYX0MsSEVYXzEsSU1NXzhCWTJ9fSwKLQotLyogMTEwMDAxMTFpOHA0Li4uLiBtb3ZhIEAoPGRpc3A+LFBDKSxSMCoveyJtb3ZhIix7QV9ESVNQX1BDLEFfUjB9LHtIRVhfQyxIRVhfNyxQQ1JFTElNTV84Qlk0fX0sCi0vKiAwMDAwbm5ubjExMDAwMDExIG1vdmNhLmwgUjAsQDxSRUdfTj4gKi97Im1vdmNhLmwiLHtBX1IwLEFfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfQyxIRVhfM319LAotCi0KLS8qIDAwMDBubm5uMDAxMDEwMDEgbW92dCA8UkVHX04+ICAgICAgICAqL3sibW92dCIse0FfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMixIRVhfOX19LAotCi0vKiAwMDEwbm5ubm1tbW0xMTExIG11bHMgPFJFR19NPiw8UkVHX04+Ki97Im11bHMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYX0Z9fSwKLQotLyogMDAwMG5ubm5tbW1tMDExMSBtdWwubCA8UkVHX00+LDxSRUdfTj4qL3sibXVsLmwiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYXzd9fSwKLQotLyogMDAxMG5ubm5tbW1tMTExMCBtdWx1IDxSRUdfTT4sPFJFR19OPioveyJtdWx1Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9FfX0sCi0KLS8qIDAxMTBubm5ubW1tbTEwMTEgbmVnIDxSRUdfTT4sPFJFR19OPiAqL3sibmVnIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF9CfX0sCi0KLS8qIDAxMTBubm5ubW1tbTEwMTAgbmVnYyA8UkVHX00+LDxSRUdfTj4qL3sibmVnYyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfQX19LAotCi0vKiAwMDAwMDAwMDAwMDAxMDAxIG5vcCAgICAgICAgICAgICAgICAgKi97Im5vcCIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMCxIRVhfOX19LAotCi0vKiAwMTEwbm5ubm1tbW0wMTExIG5vdCA8UkVHX00+LDxSRUdfTj4gKi97Im5vdCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfN319LAotLyogMDAwMG5ubm4xMDAxMDAxMSBvY2JpIEA8UkVHX04+ICAgICAgICoveyJvY2JpIix7QV9JTkRfTn0se0hFWF8wLFJFR19OLEhFWF85LEhFWF8zfX0sCi0KLS8qIDAwMDBubm5uMTAxMDAwMTEgb2NicCBAPFJFR19OPiAgICAgICAqL3sib2NicCIse0FfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfQSxIRVhfM319LAotCi0vKiAwMDAwbm5ubjEwMTEwMDExIG9jYndiIEA8UkVHX04+ICAgICAgKi97Im9jYndiIix7QV9JTkRfTn0se0hFWF8wLFJFR19OLEhFWF9CLEhFWF8zfX0sCi0KLQotLyogMTEwMDEwMTFpOCoxLi4uLiBvciAjPGltbT4sUjAgICAgICAgICoveyJvciIse0FfSU1NLEFfUjB9LHtIRVhfQyxIRVhfQixJTU1fOH19LAotCi0vKiAwMDEwbm5ubm1tbW0xMDExIG9yIDxSRUdfTT4sPFJFR19OPiAgKi97Im9yIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9CfX0sCi0KLS8qIDExMDAxMTExaTgqMS4uLi4gb3IuYiAjPGltbT4sQChSMCxHQlIpKi97Im9yLmIiLHtBX0lNTSxBX1IwX0dCUn0se0hFWF9DLEhFWF9GLElNTV84fX0sCi0KLS8qIDAwMDBubm5uMTAwMDAwMTEgcHJlZiBAPFJFR19OPiAgICAgICAqL3sicHJlZiIse0FfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfOCxIRVhfM319LAotCi0vKiAwMTAwbm5ubjAwMTAwMTAwIHJvdGNsIDxSRUdfTj4gICAgICAgKi97InJvdGNsIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF80fX0sCi0KLS8qIDAxMDBubm5uMDAxMDAxMDEgcm90Y3IgPFJFR19OPiAgICAgICAqL3sicm90Y3IiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzV9fSwKLQotLyogMDEwMG5ubm4wMDAwMDEwMCByb3RsIDxSRUdfTj4gICAgICAgICoveyJyb3RsIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF80fX0sCi0KLS8qIDAxMDBubm5uMDAwMDAxMDEgcm90ciA8UkVHX04+ICAgICAgICAqL3sicm90ciIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfNX19LAotCi0vKiAwMDAwMDAwMDAwMTAxMDExIHJ0ZSAgICAgICAgICAgICAgICAgKi97InJ0ZSIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMixIRVhfQn19LAotCi0vKiAwMDAwMDAwMDAwMDAxMDExIHJ0cyAgICAgICAgICAgICAgICAgKi97InJ0cyIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMCxIRVhfQn19LAotCi0vKiAwMDAwMDAwMDAxMDExMDAwIHNldHMgICAgICAgICAgICAgICAgKi97InNldHMiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzUsSEVYXzh9fSwKLS8qIDAwMDAwMDAwMDAwMTEwMDAgc2V0dCAgICAgICAgICAgICAgICAqL3sic2V0dCIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMSxIRVhfOH19LAotCi0vKiAwMTAwbm5ubm1tbW0xMTAwIHNoYWQgPFJFR19NPiw8UkVHX04+Ki97InNoYWQiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzQsUkVHX04sUkVHX00sSEVYX0N9fSwKLQotLyogMDEwMG5ubm5tbW1tMTEwMSBzaGxkIDxSRUdfTT4sPFJFR19OPioveyJzaGxkIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF80LFJFR19OLFJFR19NLEhFWF9EfX0sCi0KLS8qIDAxMDBubm5uMDAxMDAwMDAgc2hhbCA8UkVHX04+ICAgICAgICAqL3sic2hhbCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfMH19LAotCi0vKiAwMTAwbm5ubjAwMTAwMDAxIHNoYXIgPFJFR19OPiAgICAgICAgKi97InNoYXIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzF9fSwKLQotLyogMDEwMG5ubm4wMDAwMDAwMCBzaGxsIDxSRUdfTj4gICAgICAgICoveyJzaGxsIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF8wfX0sCi0KLS8qIDAxMDBubm5uMDAxMDEwMDAgc2hsbDE2IDxSRUdfTj4gICAgICAqL3sic2hsbDE2Iix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF84fX0sCi0KLS8qIDAxMDBubm5uMDAwMDEwMDAgc2hsbDIgPFJFR19OPiAgICAgICAqL3sic2hsbDIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzh9fSwKLQotLyogMDEwMG5ubm4wMDAxMTAwMCBzaGxsOCA8UkVHX04+ICAgICAgICoveyJzaGxsOCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfOH19LAotCi0vKiAwMTAwbm5ubjAwMDAwMDAxIHNobHIgPFJFR19OPiAgICAgICAgKi97InNobHIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzF9fSwKLQotLyogMDEwMG5ubm4wMDEwMTAwMSBzaGxyMTYgPFJFR19OPiAgICAgICoveyJzaGxyMTYiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzl9fSwKLQotLyogMDEwMG5ubm4wMDAwMTAwMSBzaGxyMiA8UkVHX04+ICAgICAgICoveyJzaGxyMiIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfOX19LAotCi0vKiAwMTAwbm5ubjAwMDExMDAxIHNobHI4IDxSRUdfTj4gICAgICAgKi97InNobHI4Iix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF85fX0sCi0KLS8qIDAwMDAwMDAwMDAwMTEwMTEgc2xlZXAgICAgICAgICAgICAgICAqL3sic2xlZXAiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzEsSEVYX0J9fSwKLQotLyogMDAwMG5ubm4wMDAwMDAxMCBzdGMgU1IsPFJFR19OPiAgICAgICoveyJzdGMiLHtBX1NSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMCxIRVhfMn19LAotCi0vKiAwMDAwbm5ubjAwMDEwMDEwIHN0YyBHQlIsPFJFR19OPiAgICAgKi97InN0YyIse0FfR0JSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMSxIRVhfMn19LAotCi0vKiAwMDAwbm5ubjAwMTAwMDEwIHN0YyBWQlIsPFJFR19OPiAgICAgKi97InN0YyIse0FfVkJSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMixIRVhfMn19LAotCi0vKiAwMDAwbm5ubjAwMTEwMDEwIHN0YyBTU1IsPFJFR19OPiAgICAgKi97InN0YyIse0FfU1NSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMyxIRVhfMn19LAotCi0vKiAwMDAwbm5ubjAxMDAwMDEwIHN0YyBTUEMsPFJFR19OPiAgICAgKi97InN0YyIse0FfU1BDLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNCxIRVhfMn19LAotCi0vKiAwMDAwbm5ubjAxMTAwMDEwIHN0YyBTR1IsPFJFR19OPiAgICAgKi97InN0YyIse0FfU0dSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNixIRVhfMn19LAotCi0vKiAwMDAwbm5ubjAxMTEwMDEwIHN0YyBEQlIsPFJFR19OPiAgICAgKi97InN0YyIse0FfREJSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNyxIRVhfMn19LAotCi0vKiAwMDAwbm5ubjF4eHgwMDEyIHN0YyBSbl9CQU5LLDxSRUdfTj4gKi97InN0YyIse0FfUkVHX0IsQV9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19CLEhFWF8yfX0sCi0KLS8qIDAxMDBubm5uMDAwMDAwMTEgc3RjLmwgU1IsQC08UkVHX04+ICAqL3sic3RjLmwiLHtBX1NSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfM319LAotCi0vKiAwMTAwbm5ubjAwMDEwMDExIHN0Yy5sIEdCUixALTxSRUdfTj4gKi97InN0Yy5sIix7QV9HQlIsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF8zfX0sCi0KLS8qIDAxMDBubm5uMDAxMDAwMTEgc3RjLmwgVkJSLEAtPFJFR19OPiAqL3sic3RjLmwiLHtBX1ZCUixBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzN9fSwKLQotLyogMDEwMG5ubm4wMDExMDAxMSBzdGMubCBTU1IsQC08UkVHX04+ICoveyJzdGMubCIse0FfU1NSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMyxIRVhfM319LAotCi0vKiAwMTAwbm5ubjAxMDAwMDExIHN0Yy5sIFNQQyxALTxSRUdfTj4gKi97InN0Yy5sIix7QV9TUEMsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF80LEhFWF8zfX0sCi0KLS8qIDAxMDBubm5uMDExMDAwMTEgc3RjLmwgU0dSLEAtPFJFR19OPiAqL3sic3RjLmwiLHtBX1NHUixBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzYsSEVYXzN9fSwKLQotLyogMDEwMG5ubm4wMTExMDAxMSBzdGMubCBEQlIsQC08UkVHX04+ICoveyJzdGMubCIse0FfREJSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfNyxIRVhfM319LAotCi0vKiAwMTAwbm5ubjF4eHgwMDEyIHN0Yy5sIFJuX0JBTkssQC08UkVHX04+ICoveyJzdGMubCIse0FfUkVHX0IsQV9ERUNfTn0se0hFWF80LFJFR19OLFJFR19CLEhFWF8zfX0sCi0KLS8qIDAwMDBubm5uMDAwMDEwMTAgc3RzIE1BQ0gsPFJFR19OPiAgICAqL3sic3RzIix7QV9NQUNILEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMCxIRVhfQX19LAotCi0vKiAwMDAwbm5ubjAwMDExMDEwIHN0cyBNQUNMLDxSRUdfTj4gICAgKi97InN0cyIse0FfTUFDTCxBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzEsSEVYX0F9fSwKLQotLyogMDAwMG5ubm4wMDEwMTAxMCBzdHMgUFIsPFJFR19OPiAgICAgICoveyJzdHMiLHtBX1BSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMixIRVhfQX19LAotCi0vKiAwMDAwbm5ubjAxMDExMDEwIHN0cyBGUFVMLDxSRUdfTj4gICAgKi97InN0cyIse0ZQVUxfTSxBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzUsSEVYX0F9fSwKLQotLyogMDAwMG5ubm4wMTEwMTAxMCBzdHMgRlBTQ1IsPFJFR19OPiAgICoveyJzdHMiLHtGUFNDUl9NLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNixIRVhfQX19LAotCi0vKiAwMTAwbm5ubjAwMDAwMDEwIHN0cy5sIE1BQ0gsQC08UkVHX04+Ki97InN0cy5sIix7QV9NQUNILEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfMn19LAotCi0vKiAwMTAwbm5ubjAwMDEwMDEwIHN0cy5sIE1BQ0wsQC08UkVHX04+Ki97InN0cy5sIix7QV9NQUNMLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfMn19LAotCi0vKiAwMTAwbm5ubjAwMTAwMDEwIHN0cy5sIFBSLEAtPFJFR19OPiAgKi97InN0cy5sIix7QV9QUixBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzJ9fSwKLQotLyogMDEwMG5ubm4wMTAxMDAxMCBzdHMubCBGUFVMLEAtPFJFR19OPioveyJzdHMubCIse0ZQVUxfTSxBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzUsSEVYXzJ9fSwKLQotLyogMDEwMG5ubm4wMTEwMDAxMCBzdHMubCBGUFNDUixALTxSRUdfTj4qL3sic3RzLmwiLHtGUFNDUl9NLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfNixIRVhfMn19LAotCi0vKiAwMDExbm5ubm1tbW0xMDAwIHN1YiA8UkVHX00+LDxSRUdfTj4gKi97InN1YiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfOH19LAotCi0vKiAwMDExbm5ubm1tbW0xMDEwIHN1YmMgPFJFR19NPiw8UkVHX04+Ki97InN1YmMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYX0F9fSwKLQotLyogMDAxMW5ubm5tbW1tMTAxMSBzdWJ2IDxSRUdfTT4sPFJFR19OPioveyJzdWJ2Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF9CfX0sCi0KLS8qIDAxMTBubm5ubW1tbTEwMDAgc3dhcC5iIDxSRUdfTT4sPFJFR19OPioveyJzd2FwLmIiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzh9fSwKLQotLyogMDExMG5ubm5tbW1tMTAwMSBzd2FwLncgPFJFR19NPiw8UkVHX04+Ki97InN3YXAudyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfOX19LAotCi0vKiAwMTAwbm5ubjAwMDExMDExIHRhcy5iIEA8UkVHX04+ICAgICAgKi97InRhcy5iIix7QV9JTkRfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF9CfX0sCi0KLS8qIDExMDAwMDExaTgqMS4uLi4gdHJhcGEgIzxpbW0+ICAgICAgICAqL3sidHJhcGEiLHtBX0lNTX0se0hFWF9DLEhFWF8zLElNTV84fX0sCi0KLS8qIDExMDAxMDAwaTgqMS4uLi4gdHN0ICM8aW1tPixSMCAgICAgICAqL3sidHN0Iix7QV9JTU0sQV9SMH0se0hFWF9DLEhFWF84LElNTV84fX0sCi0KLS8qIDAwMTBubm5ubW1tbTEwMDAgdHN0IDxSRUdfTT4sPFJFR19OPiAqL3sidHN0Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF84fX0sCi0KLS8qIDExMDAxMTAwaTgqMS4uLi4gdHN0LmIgIzxpbW0+LEAoUjAsR0JSKSoveyJ0c3QuYiIse0FfSU1NLEFfUjBfR0JSfSx7SEVYX0MsSEVYX0MsSU1NXzh9fSwKLQotLyogMTEwMDEwMTBpOCoxLi4uLiB4b3IgIzxpbW0+LFIwICAgICAgICoveyJ4b3IiLHtBX0lNTSxBX1IwfSx7SEVYX0MsSEVYX0EsSU1NXzh9fSwKLQotLyogMDAxMG5ubm5tbW1tMTAxMCB4b3IgPFJFR19NPiw8UkVHX04+ICoveyJ4b3IiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYX0F9fSwKLQotLyogMTEwMDExMTBpOCoxLi4uLiB4b3IuYiAjPGltbT4sQChSMCxHQlIpKi97Inhvci5iIix7QV9JTU0sQV9SMF9HQlJ9LHtIRVhfQyxIRVhfRSxJTU1fOH19LAotCi0vKiAwMDEwbm5ubm1tbW0xMTAxIHh0cmN0IDxSRUdfTT4sPFJFR19OPioveyJ4dHJjdCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfRH19LAotCi0vKiAwMDAwbm5ubm1tbW0wMTExIG11bC5sIDxSRUdfTT4sPFJFR19OPioveyJtdWwubCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfN319LAotCi0vKiAwMTAwbm5ubjAwMDEwMDAwIGR0IDxSRUdfTj4gICAgICAgICAgKi97ImR0Iix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF8wfX0sCi0KLS8qIDAwMTFubm5ubW1tbTExMDEgZG11bHMubCA8UkVHX00+LDxSRUdfTj4qL3siZG11bHMubCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfRH19LAotCi0vKiAwMDExbm5ubm1tbW0wMTAxIGRtdWx1LmwgPFJFR19NPiw8UkVHX04+Ki97ImRtdWx1LmwiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzV9fSwKLQotLyogMDAwMG5ubm5tbW1tMTExMSBtYWMubCBAPFJFR19NPissQDxSRUdfTj4rKi97Im1hYy5sIix7QV9JTkNfTSxBX0lOQ19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYX0Z9fSwKLQotLyogMDAwMG5ubm4wMDEwMDAxMSBicmFmIDxSRUdfTj4gICAgICAgKi97ImJyYWYiLHtBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzIsSEVYXzN9fSwKLQotLyogMDAwMG5ubm4wMDAwMDAxMSBic3JmIDxSRUdfTj4gICAgICAgKi97ImJzcmYiLHtBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzAsSEVYXzN9fSwKLQotLyogMTExMW5ubm4wMTAxMTEwMSBmYWJzIDxGX1JFR19OPiAgICAgKi97ImZhYnMiLHtGRF9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF81LEhFWF9EfX0sCi0KLS8qIDExMTFubm5ubW1tbTAwMDAgZmFkZCA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZhZGQiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfMH19LAotLyogMTExMW5ubjBtbW0wMDAwMCBmYWRkIDxEX1JFR19NPiw8RF9SRUdfTj4qL3siZmFkZCIse0RfUkVHX00sRF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF8wfX0sCi0KLS8qIDExMTFubm5ubW1tbTAxMDAgZmNtcC9lcSA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZjbXAvZXEiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNH19LAotLyogMTExMW5ubjBtbW0wMDEwMCBmY21wL2VxIDxEX1JFR19NPiw8RF9SRUdfTj4qL3siZmNtcC9lcSIse0RfUkVHX00sRF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF80fX0sCi0KLS8qIDExMTFubm5ubW1tbTAxMDEgZmNtcC9ndCA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZjbXAvZ3QiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNX19LAotLyogMTExMW5ubjBtbW0wMDEwMSBmY21wL2d0IDxEX1JFR19NPiw8RF9SRUdfTj4qL3siZmNtcC9ndCIse0RfUkVHX00sRF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF81fX0sCi0KLS8qIDExMTFubm4wMTAxMTExMDEgZmNudmRzIDxEX1JFR19OPixGUFVMKi97ImZjbnZkcyIse0RfUkVHX04sRlBVTF9NfSx7SEVYX0YsUkVHX04sSEVYX0IsSEVYX0R9fSwKLQotLyogMTExMW5ubjAxMDEwMTEwMSBmY252c2QgRlBVTCw8RF9SRUdfTj4qL3siZmNudnNkIix7RlBVTF9NLERfUkVHX059LHtIRVhfRixSRUdfTixIRVhfQSxIRVhfRH19LAotCi0vKiAxMTExbm5ubm1tbW0wMDExIGZkaXYgPEZfUkVHX00+LDxGX1JFR19OPioveyJmZGl2Iix7Rl9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzN9fSwKLS8qIDExMTFubm4wbW1tMDAwMTEgZmRpdiA8RF9SRUdfTT4sPERfUkVHX04+Ki97ImZkaXYiLHtEX1JFR19NLERfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfM319LAotCi0vKiAxMTExbm5tbTExMTAxMTAxIGZpcHIgPFZfUkVHX00+LDxWX1JFR19OPioveyJmaXByIix7Vl9SRUdfTSxWX1JFR19OfSx7SEVYX0YsUkVHX05NLEhFWF9FLEhFWF9EfX0sCi0KLS8qIDExMTFubm5uMTAwMDExMDEgZmxkaTAgPEZfUkVHX04+ICAgICoveyJmbGRpMCIse0ZfUkVHX059LHtIRVhfRixSRUdfTixIRVhfOCxIRVhfRH19LAotCi0vKiAxMTExbm5ubjEwMDExMTAxIGZsZGkxIDxGX1JFR19OPiAgICAqL3siZmxkaTEiLHtGX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzksSEVYX0R9fSwKLQotLyogMTExMW5ubm4wMDAxMTEwMSBmbGRzIDxGX1JFR19OPixGUFVMKi97ImZsZHMiLHtGX1JFR19OLEZQVUxfTX0se0hFWF9GLFJFR19OLEhFWF8xLEhFWF9EfX0sCi0KLS8qIDExMTFubm5uMDAxMDExMDEgZmxvYXQgRlBVTCw8RkRfUkVHX04+Ki97ImZsb2F0Iix7RlBVTF9NLEZEX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzIsSEVYX0R9fSwKLQotLyogMTExMW5ubm5tbW1tMTExMCBmbWFjIEZSMCw8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZtYWMiLHtGX0ZSMCxGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfRX19LAotCi0vKiAxMTExbm5ubm1tbW0xMTAwIGZtb3YgPEZfUkVHX00+LDxGX1JFR19OPioveyJmbW92Iix7Rl9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0N9fSwKLS8qIDExMTFubm5ubW1tbTExMDAgZm1vdiA8RFhfUkVHX00+LDxEWF9SRUdfTj4qL3siZm1vdiIse0RYX1JFR19NLERYX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0N9fSwKLQotLyogMTExMW5ubm5tbW1tMTAwMCBmbW92IEA8UkVHX00+LDxGX1JFR19OPioveyJmbW92Iix7QV9JTkRfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzh9fSwKLS8qIDExMTFubm5ubW1tbTEwMDAgZm1vdiBAPFJFR19NPiw8RFhfUkVHX04+Ki97ImZtb3YiLHtBX0lORF9NLERYX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzh9fSwKLQotLyogMTExMW5ubm5tbW1tMTAxMCBmbW92IDxGX1JFR19NPixAPFJFR19OPioveyJmbW92Iix7Rl9SRUdfTSxBX0lORF9OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0F9fSwKLS8qIDExMTFubm5ubW1tbTEwMTAgZm1vdiA8RFhfUkVHX00+LEA8UkVHX04+Ki97ImZtb3YiLHtEWF9SRUdfTSxBX0lORF9OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0F9fSwKLQotLyogMTExMW5ubm5tbW1tMTAwMSBmbW92IEA8UkVHX00+Kyw8Rl9SRUdfTj4qL3siZm1vdiIse0FfSU5DX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF85fX0sCi0vKiAxMTExbm5ubm1tbW0xMDAxIGZtb3YgQDxSRUdfTT4rLDxEWF9SRUdfTj4qL3siZm1vdiIse0FfSU5DX00sRFhfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOX19LAotCi0vKiAxMTExbm5ubm1tbW0xMDExIGZtb3YgPEZfUkVHX00+LEAtPFJFR19OPioveyJmbW92Iix7Rl9SRUdfTSxBX0RFQ19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0J9fSwKLS8qIDExMTFubm5ubW1tbTEwMTEgZm1vdiA8RFhfUkVHX00+LEAtPFJFR19OPioveyJmbW92Iix7RFhfUkVHX00sQV9ERUNfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9CfX0sCi0KLS8qIDExMTFubm5ubW1tbTAxMTAgZm1vdiBAKFIwLDxSRUdfTT4pLDxGX1JFR19OPioveyJmbW92Iix7QV9JTkRfUjBfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF82fX0sCi0vKiAxMTExbm5ubm1tbW0wMTEwIGZtb3YgQChSMCw8UkVHX00+KSw8RFhfUkVHX04+Ki97ImZtb3YiLHtBX0lORF9SMF9SRUdfTSxEWF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF82fX0sCi0KLS8qIDExMTFubm5ubW1tbTAxMTEgZm1vdiA8Rl9SRUdfTT4sQChSMCw8UkVHX04+KSoveyJmbW92Iix7Rl9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF83fX0sCi0vKiAxMTExbm5ubm1tbW0wMTExIGZtb3YgPERYX1JFR19NPixAKFIwLDxSRUdfTj4pKi97ImZtb3YiLHtEWF9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF83fX0sCi0KLS8qIDExMTFubm5ubW1tbTEwMDAgZm1vdi5kIEA8UkVHX00+LDxEWF9SRUdfTj4qL3siZm1vdi5kIix7QV9JTkRfTSxEWF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF84fX0sCi0KLS8qIDExMTFubm5ubW1tbTEwMTAgZm1vdi5kIDxEWF9SRUdfTT4sQDxSRUdfTj4qL3siZm1vdi5kIix7RFhfUkVHX00sQV9JTkRfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9BfX0sCi0KLS8qIDExMTFubm5ubW1tbTEwMDEgZm1vdi5kIEA8UkVHX00+Kyw8RFhfUkVHX04+Ki97ImZtb3YuZCIse0FfSU5DX00sRFhfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOX19LAotCi0vKiAxMTExbm5ubm1tbW0xMDExIGZtb3YuZCA8RFhfUkVHX00+LEAtPFJFR19OPioveyJmbW92LmQiLHtEWF9SRUdfTSxBX0RFQ19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0J9fSwKLQotLyogMTExMW5ubm5tbW1tMDExMCBmbW92LmQgQChSMCw8UkVHX00+KSw8RFhfUkVHX04+Ki97ImZtb3YuZCIse0FfSU5EX1IwX1JFR19NLERYX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzZ9fSwKLQotLyogMTExMW5ubm5tbW1tMDExMSBmbW92LmQgPERYX1JFR19NPixAKFIwLDxSRUdfTj4pKi97ImZtb3YuZCIse0RYX1JFR19NLEFfSU5EX1IwX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzd9fSwKLQotLyogMTExMW5ubm5tbW1tMTAwMCBmbW92LnMgQDxSRUdfTT4sPEZfUkVHX04+Ki97ImZtb3YucyIse0FfSU5EX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF84fX0sCi0KLS8qIDExMTFubm5ubW1tbTEwMTAgZm1vdi5zIDxGX1JFR19NPixAPFJFR19OPioveyJmbW92LnMiLHtGX1JFR19NLEFfSU5EX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfQX19LAotCi0vKiAxMTExbm5ubm1tbW0xMDAxIGZtb3YucyBAPFJFR19NPissPEZfUkVHX04+Ki97ImZtb3YucyIse0FfSU5DX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF85fX0sCi0KLS8qIDExMTFubm5ubW1tbTEwMTEgZm1vdi5zIDxGX1JFR19NPixALTxSRUdfTj4qL3siZm1vdi5zIix7Rl9SRUdfTSxBX0RFQ19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0J9fSwKLQotLyogMTExMW5ubm5tbW1tMDExMCBmbW92LnMgQChSMCw8UkVHX00+KSw8Rl9SRUdfTj4qL3siZm1vdi5zIix7QV9JTkRfUjBfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF82fX0sCi0KLS8qIDExMTFubm5ubW1tbTAxMTEgZm1vdi5zIDxGX1JFR19NPixAKFIwLDxSRUdfTj4pKi97ImZtb3YucyIse0ZfUkVHX00sQV9JTkRfUjBfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfN319LAotCi0vKiAxMTExbm5ubm1tbW0wMDEwIGZtdWwgPEZfUkVHX00+LDxGX1JFR19OPioveyJmbXVsIix7Rl9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzJ9fSwKLS8qIDExMTFubm4wbW1tMDAwMTAgZm11bCA8RF9SRUdfTT4sPERfUkVHX04+Ki97ImZtdWwiLHtEX1JFR19NLERfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfMn19LAotCi0vKiAxMTExbm5ubjAxMDAxMTAxIGZuZWcgPEZEX1JFR19OPiAgICAgKi97ImZuZWciLHtGRF9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF80LEhFWF9EfX0sCi0KLS8qIDExMTExMDExMTExMTExMDEgZnJjaGcgICAgICAgICAgICAgICAqL3siZnJjaGciLHswfSx7SEVYX0YsSEVYX0IsSEVYX0YsSEVYX0R9fSwKLQotLyogMTExMTAwMTExMTExMTEwMSBmc2NoZyAgICAgICAgICAgICAgICoveyJmc2NoZyIsezB9LHtIRVhfRixIRVhfMyxIRVhfRixIRVhfRH19LAotCi0vKiAxMTExbm5ubjAxMTAxMTAxIGZzcXJ0IDxGRF9SRUdfTj4gICAgKi97ImZzcXJ0Iix7RkRfUkVHX059LHtIRVhfRixSRUdfTixIRVhfNixIRVhfRH19LAotCi0vKiAxMTExbm5ubjAwMDAxMTAxIGZzdHMgRlBVTCw8Rl9SRUdfTj4qL3siZnN0cyIse0ZQVUxfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzAsSEVYX0R9fSwKLQotLyogMTExMW5ubm5tbW1tMDAwMSBmc3ViIDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZnN1YiIse0ZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF8xfX0sCi0vKiAxMTExbm5uMG1tbTAwMDAxIGZzdWIgPERfUkVHX00+LDxEX1JFR19OPioveyJmc3ViIix7RF9SRUdfTSxEX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzF9fSwKLQotLyogMTExMW5ubm4wMDExMTEwMSBmdHJjIDxGRF9SRUdfTj4sRlBVTCoveyJmdHJjIix7RkRfUkVHX04sRlBVTF9NfSx7SEVYX0YsUkVHX04sSEVYXzMsSEVYX0R9fSwKLQotLyogMTExMW5uMDExMTExMTEwMSBmdHJ2IFhNVFJYX000LDxWX1JFR19uPioveyJmdHJ2Iix7WE1UUlhfTTQsVl9SRUdfTn0se0hFWF9GLFJFR19OTSxIRVhfRixIRVhfRH19LAotCi17IDAgfSAKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zcGFyYy1kaXMuYyBiL29wY29kZXMvc3BhcmMtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NzViMjguLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9zcGFyYy1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDk2OSArMCwwIEBACi0vKiBQcmludCBTUEFSQyBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkxLTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3NwYXJjLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBCaXRtYXNrIG9mIHY5IGFyY2hpdGVjdHVyZXMuICAqLwotI2RlZmluZSBNQVNLX1Y5ICgoMSA8PCBTUEFSQ19PUENPREVfQVJDSF9WOSkgXAotCQkgfCAoMSA8PCBTUEFSQ19PUENPREVfQVJDSF9WOUEpKQotLyogMSBpZiBJTlNOIGlzIGZvciB2OSBvbmx5LiAgKi8KLSNkZWZpbmUgVjlfT05MWV9QKGluc24pICghICgoaW5zbiktPmFyY2hpdGVjdHVyZSAmIH5NQVNLX1Y5KSkKLS8qIDEgaWYgSU5TTiBpcyBmb3IgdjkuICAqLwotI2RlZmluZSBWOV9QKGluc24pICgoKGluc24pLT5hcmNoaXRlY3R1cmUgJiBNQVNLX1Y5KSAhPSAwKQotCi0vKiBUaGUgc29ydGVkIG9wY29kZSB0YWJsZS4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqKnNvcnRlZF9vcGNvZGVzOwotCi0vKiBGb3IgZmFzdGVyIGxvb2t1cCwgYWZ0ZXIgaW5zbnMgYXJlIHNvcnRlZCB0aGV5IGFyZSBoYXNoZWQuICAqLwotLyogPz8/IEkgdGhpbmsgdGhlcmUgaXMgcm9vbSBmb3IgZXZlbiBtb3JlIGltcHJvdmVtZW50LiAgKi8KLQotI2RlZmluZSBIQVNIX1NJWkUgMjU2Ci0vKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB3ZSBvbmx5IGxvb2sgYXQgaW5zbiBjb2RlIGJpdHMgYXMgdGhhdCBpcyBob3cgdGhlCi0gICBvcGNvZGUgdGFibGUgaXMgaGFzaGVkLiAgT1BDT0RFX0JJVFMgaXMgYSB0YWJsZSBvZiB2YWxpZCBiaXRzIGZvciBlYWNoCi0gICBvZiB0aGUgbWFpbiB0eXBlcyAoMCwxLDIsMykuICAqLwotc3RhdGljIGludCBvcGNvZGVfYml0c1s0XSA9IHsgMHgwMWMwMDAwMCwgMHgwLCAweDAxZjgwMDAwLCAweDAxZjgwMDAwIH07Ci0jZGVmaW5lIEhBU0hfSU5TTihJTlNOKSBcCi0gICgoKChJTlNOKSA+PiAyNCkgJiAweGMwKSB8ICgoKElOU04pICYgb3Bjb2RlX2JpdHNbKChJTlNOKSA+PiAzMCkgJiAzXSkgPj4gMTkpKQotc3RydWN0IG9wY29kZV9oYXNoIHsKLSAgc3RydWN0IG9wY29kZV9oYXNoICpuZXh0OwotICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICpvcGNvZGU7Ci19Owotc3RhdGljIHN0cnVjdCBvcGNvZGVfaGFzaCAqb3Bjb2RlX2hhc2hfdGFibGVbSEFTSF9TSVpFXTsKLQotc3RhdGljIHZvaWQgYnVpbGRfaGFzaF90YWJsZQotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICoqLCBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKiosIGludCkpOwotc3RhdGljIGludCBpc19kZWxheWVkX2JyYW5jaCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgaW50IGNvbXBhcmVfb3Bjb2RlcyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotc3RhdGljIGludCBjb21wdXRlX2FyY2hfbWFzayBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci0KLS8qIFNpZ24tZXh0ZW5kIGEgdmFsdWUgd2hpY2ggaXMgTiBiaXRzIGxvbmcuICAqLwotI2RlZmluZQlTRVgodmFsdWUsIGJpdHMpIFwKLQkoKCgoaW50KSh2YWx1ZSkpIDw8ICgoOCAqIHNpemVvZiAoaW50KSkgLSBiaXRzKSkJXAotCQkJID4+ICgoOCAqIHNpemVvZiAoaW50KSkgLSBiaXRzKSApCi0KLXN0YXRpYyAgY2hhciAqcmVnX25hbWVzW10gPQoteyAiZzAiLCAiZzEiLCAiZzIiLCAiZzMiLCAiZzQiLCAiZzUiLCAiZzYiLCAiZzciLAkKLSAgIm8wIiwgIm8xIiwgIm8yIiwgIm8zIiwgIm80IiwgIm81IiwgInNwIiwgIm83IiwJCi0gICJsMCIsICJsMSIsICJsMiIsICJsMyIsICJsNCIsICJsNSIsICJsNiIsICJsNyIsCQotICAiaTAiLCAiaTEiLCAiaTIiLCAiaTMiLCAiaTQiLCAiaTUiLCAiZnAiLCAiaTciLAkKLSAgImYwIiwgImYxIiwgImYyIiwgImYzIiwgImY0IiwgImY1IiwgImY2IiwgImY3IiwJCi0gICJmOCIsICJmOSIsICJmMTAiLCAiZjExIiwgImYxMiIsICJmMTMiLCAiZjE0IiwgImYxNSIsCQotICAiZjE2IiwgImYxNyIsICJmMTgiLCAiZjE5IiwgImYyMCIsICJmMjEiLCAiZjIyIiwgImYyMyIsCi0gICJmMjQiLCAiZjI1IiwgImYyNiIsICJmMjciLCAiZjI4IiwgImYyOSIsICJmMzAiLCAiZjMxIiwKLSAgImYzMiIsICJmMzMiLCAiZjM0IiwgImYzNSIsICJmMzYiLCAiZjM3IiwgImYzOCIsICJmMzkiLAkKLSAgImY0MCIsICJmNDEiLCAiZjQyIiwgImY0MyIsICJmNDQiLCAiZjQ1IiwgImY0NiIsICJmNDciLAkKLSAgImY0OCIsICJmNDkiLCAiZjUwIiwgImY1MSIsICJmNTIiLCAiZjUzIiwgImY1NCIsICJmNTUiLAotICAiZjU2IiwgImY1NyIsICJmNTgiLCAiZjU5IiwgImY2MCIsICJmNjEiLCAiZjYyIiwgImY2MyIsCi0vKiBwc3IsIHdpbSwgdGJyLCBmcHNyLCBjcHNyIGFyZSB2OCBvbmx5LiAgKi8KLSAgInkiLCAicHNyIiwgIndpbSIsICJ0YnIiLCAicGMiLCAibnBjIiwgImZwc3IiLCAiY3BzciIKLX07Ci0KLSNkZWZpbmUJZnJlZ19uYW1lcwkoJnJlZ19uYW1lc1s0ICogOF0pCi0KLS8qIFRoZXNlIGFyZSBvcmRlcmVkIGFjY29yZGluZyB0byB0aGVyZSByZWdpc3RlciBudW1iZXIgaW4KLSAgIHJkcHIgYW5kIHdycHIgaW5zbnMuICAqLwotc3RhdGljIGNoYXIgKnY5X3ByaXZfcmVnX25hbWVzW10gPQotewotICAidHBjIiwgInRucGMiLCAidHN0YXRlIiwgInR0IiwgInRpY2siLCAidGJhIiwgInBzdGF0ZSIsICJ0bCIsCi0gICJwaWwiLCAiY3dwIiwgImNhbnNhdmUiLCAiY2FucmVzdG9yZSIsICJjbGVhbndpbiIsICJvdGhlcndpbiIsCi0gICJ3c3RhdGUiLCAiZnEiCi0gIC8qICJ2ZXIiIC0gc3BlY2lhbCBjYXNlZCAqLwotfTsKLQotLyogVGhlc2UgYXJlIG9yZGVyZWQgYWNjb3JkaW5nIHRvIHRoZXJlIHJlZ2lzdGVyIG51bWJlciBpbgotICAgcmQgYW5kIHdyIGluc25zICgtMTYpLiAgKi8KLXN0YXRpYyBjaGFyICp2OWFfYXNyX3JlZ19uYW1lc1tdID0KLXsKLSAgInBjciIsICJwaWMiLCAiZGNyIiwgImdzciIsICJzZXRfc29mdGludCIsICJjbGVhcl9zb2Z0aW50IiwKLSAgInNvZnRpbnQiLCAidGlja19jbXByIgotfTsKLQotLyogTWFjcm9zIHVzZWQgdG8gZXh0cmFjdCBpbnN0cnVjdGlvbiBmaWVsZHMuICBOb3QgYWxsIGZpZWxkcyBoYXZlCi0gICBtYWNyb3MgZGVmaW5lZCBoZXJlLCBvbmx5IHRob3NlIHdoaWNoIGFyZSBhY3R1YWxseSB1c2VkLiAgKi8KLQotI2RlZmluZSBYX1JEKGkpICgoKGkpID4+IDI1KSAmIDB4MWYpCi0jZGVmaW5lIFhfUlMxKGkpICgoKGkpID4+IDE0KSAmIDB4MWYpCi0jZGVmaW5lIFhfTERTVF9JKGkpICgoKGkpID4+IDEzKSAmIDEpCi0jZGVmaW5lIFhfQVNJKGkpICgoKGkpID4+IDUpICYgMHhmZikKLSNkZWZpbmUgWF9SUzIoaSkgKCgoaSkgPj4gMCkgJiAweDFmKQotI2RlZmluZSBYX0lNTShpLG4pICgoKGkpID4+IDApICYgKCgxIDw8IChuKSkgLSAxKSkKLSNkZWZpbmUgWF9TSU1NKGksbikgU0VYIChYX0lNTSAoKGkpLCAobikpLCAobikpCi0jZGVmaW5lIFhfRElTUDIyKGkpICgoKGkpID4+IDApICYgMHgzZmZmZmYpCi0jZGVmaW5lIFhfSU1NMjIoaSkgWF9ESVNQMjIgKGkpCi0jZGVmaW5lIFhfRElTUDMwKGkpICgoKGkpID4+IDApICYgMHgzZmZmZmZmZikKLQotLyogVGhlc2UgYXJlIGZvciB2OS4gICovCi0jZGVmaW5lIFhfRElTUDE2KGkpICgoKCgoaSkgPj4gMjApICYgMykgPDwgMTQpIHwgKCgoaSkgPj4gMCkgJiAweDNmZmYpKQotI2RlZmluZSBYX0RJU1AxOShpKSAoKChpKSA+PiAwKSAmIDB4N2ZmZmYpCi0jZGVmaW5lIFhfTUVNQkFSKGkpICgoaSkgJiAweDdmKQotCi0vKiBIZXJlIGlzIHRoZSB1bmlvbiB3aGljaCB3YXMgdXNlZCB0byBleHRyYWN0IGluc3RydWN0aW9uIGZpZWxkcwotICAgYmVmb3JlIHRoZSBzaGlmdCBhbmQgbWFzayBtYWNyb3Mgd2VyZSB3cml0dGVuLgotCi0gICB1bmlvbiBzcGFyY19pbnNuCi0gICAgIHsKLSAgICAgICB1bnNpZ25lZCBsb25nIGludCBjb2RlOwotICAgICAgIHN0cnVjdAotCSB7Ci0JICAgdW5zaWduZWQgaW50IGFub3A6MjsKLQkgICAjZGVmaW5lCW9wCWxkc3QuYW5vcAotCSAgIHVuc2lnbmVkIGludCBhbnJkOjU7Ci0JICAgI2RlZmluZQlyZAlsZHN0LmFucmQKLQkgICB1bnNpZ25lZCBpbnQgb3AzOjY7Ci0JICAgdW5zaWduZWQgaW50IGFucnMxOjU7Ci0JICAgI2RlZmluZQlyczEJbGRzdC5hbnJzMQotCSAgIHVuc2lnbmVkIGludCBpOjE7Ci0JICAgdW5zaWduZWQgaW50IGFuYXNpOjg7Ci0JICAgI2RlZmluZQlhc2kJbGRzdC5hbmFzaQotCSAgIHVuc2lnbmVkIGludCBhbnJzMjo1OwotCSAgICNkZWZpbmUJcnMyCWxkc3QuYW5yczIKLQkgICAjZGVmaW5lCXNoY250CXJzMgotCSB9IGxkc3Q7Ci0gICAgICAgc3RydWN0Ci0JIHsKLQkgICB1bnNpZ25lZCBpbnQgYW5vcDoyLCBhbnJkOjUsIG9wMzo2LCBhbnJzMTo1LCBpOjE7Ci0JICAgdW5zaWduZWQgaW50IElNTTEzOjEzOwotCSAgICNkZWZpbmUJaW1tMTMJSU1NMTMuSU1NMTMKLQkgfSBJTU0xMzsKLSAgICAgICBzdHJ1Y3QKLQkgewotCSAgIHVuc2lnbmVkIGludCBhbm9wOjI7Ci0JICAgdW5zaWduZWQgaW50IGE6MTsKLQkgICB1bnNpZ25lZCBpbnQgY29uZDo0OwotCSAgIHVuc2lnbmVkIGludCBvcDI6MzsKLQkgICB1bnNpZ25lZCBpbnQgRElTUDIyOjIyOwotCSAgICNkZWZpbmUJZGlzcDIyCWJyYW5jaC5ESVNQMjIKLQkgICAjZGVmaW5lCWltbTIyCWRpc3AyMgotCSB9IGJyYW5jaDsKLSAgICAgICBzdHJ1Y3QKLQkgewotCSAgIHVuc2lnbmVkIGludCBhbm9wOjI7Ci0JICAgdW5zaWduZWQgaW50IGE6MTsKLQkgICB1bnNpZ25lZCBpbnQgejoxOwotCSAgIHVuc2lnbmVkIGludCByY29uZDozOwotCSAgIHVuc2lnbmVkIGludCBvcDI6MzsKLQkgICB1bnNpZ25lZCBpbnQgRElTUDE2SEk6MjsKLQkgICB1bnNpZ25lZCBpbnQgcDoxOwotCSAgIHVuc2lnbmVkIGludCBfcnMxOjU7Ci0JICAgdW5zaWduZWQgaW50IERJU1AxNkxPOjE0OwotCSB9IGJyYW5jaDE2OwotICAgICAgIHN0cnVjdAotCSB7Ci0JICAgdW5zaWduZWQgaW50IGFub3A6MjsKLQkgICB1bnNpZ25lZCBpbnQgYWRpc3AzMDozMDsKLQkgICAjZGVmaW5lCWRpc3AzMAljYWxsLmFkaXNwMzAKLQkgfSBjYWxsOwotICAgICB9OwotCi0gICAqLwotCi0vKiBOb256ZXJvIGlmIElOU04gaXMgdGhlIG9wY29kZSBmb3IgYSBkZWxheWVkIGJyYW5jaC4gICovCi1zdGF0aWMgaW50Ci1pc19kZWxheWVkX2JyYW5jaCAoaW5zbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotewotICBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKm9wOwotCi0gIGZvciAob3AgPSBvcGNvZGVfaGFzaF90YWJsZVtIQVNIX0lOU04gKGluc24pXTsgb3A7IG9wID0gb3AtPm5leHQpCi0gICAgewotICAgICAgQ09OU1Qgc3RydWN0IHNwYXJjX29wY29kZSAqb3Bjb2RlID0gb3AtPm9wY29kZTsKLSAgICAgIGlmICgob3Bjb2RlLT5tYXRjaCAmIGluc24pID09IG9wY29kZS0+bWF0Y2gKLQkgICYmIChvcGNvZGUtPmxvc2UgJiBpbnNuKSA9PSAwKQotCXJldHVybiAob3Bjb2RlLT5mbGFncyAmIEZfREVMQVlFRCk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogZXh0ZXJuIHZvaWQgcXNvcnQgKCk7ICovCi0KLS8qIFJlY29yZHMgY3VycmVudCBtYXNrIG9mIFNQQVJDX09QQ09ERV9BUkNIX0ZPTyB2YWx1ZXMsIHVzZWQgdG8gcGFzcyB2YWx1ZQotICAgdG8gY29tcGFyZV9vcGNvZGVzLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3VycmVudF9hcmNoX21hc2s7Ci0KLS8qIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIE1FTUFERFIgb24gSU5GTy0+U1RSRUFNLgotCi0gICBXZSBzdWZmaXggdGhlIGluc3RydWN0aW9uIHdpdGggYSBjb21tZW50IHRoYXQgZ2l2ZXMgdGhlIGFic29sdXRlCi0gICBhZGRyZXNzIGludm9sdmVkLCBhcyB3ZWxsIGFzIGl0cyBzeW1ib2xpYyBmb3JtLCBpZiB0aGUgaW5zdHJ1Y3Rpb24KLSAgIGlzIHByZWNlZGVkIGJ5IGEgZmluZGFibGUgYHNldGhpJyBhbmQgaXQgZWl0aGVyIGFkZHMgYW4gaW1tZWRpYXRlCi0gICBkaXNwbGFjZW1lbnQgdG8gdGhhdCByZWdpc3Rlciwgb3IgaXQgaXMgYW4gYGFkZCcgb3IgYG9yJyBpbnN0cnVjdGlvbgotICAgb24gdGhhdCByZWdpc3Rlci4gICovCi0KLWludAotcHJpbnRfaW5zbl9zcGFyYyAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBGSUxFICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICByZWdpc3RlciBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKm9wOwotICAvKiBOb256ZXJvIG9mIG9wY29kZSB0YWJsZSBoYXMgYmVlbiBpbml0aWFsaXplZC4gICovCi0gIHN0YXRpYyBpbnQgb3Bjb2Rlc19pbml0aWFsaXplZCA9IDA7Ci0gIC8qIGJmZCBtYWNoIG51bWJlciBvZiBsYXN0IGNhbGwuICAqLwotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBjdXJyZW50X21hY2ggPSAwOwotICBiZmRfdm1hICgqZ2V0d29yZCkgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci0KLSAgaWYgKCFvcGNvZGVzX2luaXRpYWxpemVkCi0gICAgICB8fCBpbmZvLT5tYWNoICE9IGN1cnJlbnRfbWFjaCkKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgY3VycmVudF9hcmNoX21hc2sgPSBjb21wdXRlX2FyY2hfbWFzayAoaW5mby0+bWFjaCk7Ci0KLSAgICAgIGlmICghb3Bjb2Rlc19pbml0aWFsaXplZCkKLQlzb3J0ZWRfb3Bjb2RlcyA9IChjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICoqKQotCSAgeG1hbGxvYyAoc3BhcmNfbnVtX29wY29kZXMgKiBzaXplb2YgKHN0cnVjdCBzcGFyY19vcGNvZGUgKikpOwotICAgICAgLyogUmVzZXQgdGhlIHNvcnRlZCB0YWJsZSBzbyB3ZSBjYW4gcmVzb3J0IGl0LiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzcGFyY19udW1fb3Bjb2RlczsgKytpKQotCXNvcnRlZF9vcGNvZGVzW2ldID0gJnNwYXJjX29wY29kZXNbaV07Ci0gICAgICBxc29ydCAoKGNoYXIgKikgc29ydGVkX29wY29kZXMsIHNwYXJjX251bV9vcGNvZGVzLAotCSAgICAgc2l6ZW9mIChzb3J0ZWRfb3Bjb2Rlc1swXSksIGNvbXBhcmVfb3Bjb2Rlcyk7Ci0KLSAgICAgIGJ1aWxkX2hhc2hfdGFibGUgKHNvcnRlZF9vcGNvZGVzLCBvcGNvZGVfaGFzaF90YWJsZSwgc3BhcmNfbnVtX29wY29kZXMpOwotICAgICAgY3VycmVudF9tYWNoID0gaW5mby0+bWFjaDsKLSAgICAgIG9wY29kZXNfaW5pdGlhbGl6ZWQgPSAxOwotICAgIH0KLQotICB7Ci0gICAgaW50IHN0YXR1cyA9Ci0gICAgICAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwgaW5mbyk7Ci0gICAgaWYgKHN0YXR1cyAhPSAwKQotICAgICAgewotCSgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCXJldHVybiAtMTsKLSAgICAgIH0KLSAgfQotCi0gIC8qIE9uIFNQQVJDbGl0ZSB2YXJpYW50cyBzdWNoIGFzIERBTmxpdGUgKHNwYXJjODZ4KSwgaW5zdHJ1Y3Rpb25zCi0gICAgIGFyZSBhbHdheXMgYmlnLWVuZGlhbiBldmVuIHdoZW4gdGhlIG1hY2hpbmUgaXMgaW4gbGl0dGxlLWVuZGlhbiBtb2RlLiAqLwotICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHIHx8IGluZm8tPm1hY2ggPT0gYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlKQotICAgIGdldHdvcmQgPSBiZmRfZ2V0YjMyOwotICBlbHNlCi0gICAgZ2V0d29yZCA9IGJmZF9nZXRsMzI7Ci0KLSAgaW5zbiA9IGdldHdvcmQgKGJ1ZmZlcik7Ci0KLSAgaW5mby0+aW5zbl9pbmZvX3ZhbGlkID0gMTsJCQkvKiBXZSBkbyByZXR1cm4gdGhpcyBpbmZvICovCi0gIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25icmFuY2g7CQkvKiBBc3N1bWUgbm9uIGJyYW5jaCBpbnNuICovCi0gIGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDA7CQkJLyogQXNzdW1lIG5vIGRlbGF5ICovCi0gIGluZm8tPnRhcmdldCA9IDA7CQkJCS8qIEFzc3VtZSBubyB0YXJnZXQga25vd24gKi8KLQotICBmb3IgKG9wID0gb3Bjb2RlX2hhc2hfdGFibGVbSEFTSF9JTlNOIChpbnNuKV07IG9wOyBvcCA9IG9wLT5uZXh0KQotICAgIHsKLSAgICAgIENPTlNUIHN0cnVjdCBzcGFyY19vcGNvZGUgKm9wY29kZSA9IG9wLT5vcGNvZGU7Ci0KLSAgICAgIC8qIElmIHRoZSBpbnNuIGlzbid0IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUsIHNraXAgaXQuICAqLwotICAgICAgaWYgKCEgKG9wY29kZS0+YXJjaGl0ZWN0dXJlICYgY3VycmVudF9hcmNoX21hc2spKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoKG9wY29kZS0+bWF0Y2ggJiBpbnNuKSA9PSBvcGNvZGUtPm1hdGNoCi0JICAmJiAob3Bjb2RlLT5sb3NlICYgaW5zbikgPT0gMCkKLQl7Ci0JICAvKiBOb256ZXJvIG1lYW5zIHRoYXQgd2UgaGF2ZSBmb3VuZCBhbiBpbnN0cnVjdGlvbiB3aGljaCBoYXMKLQkgICAgIHRoZSBlZmZlY3Qgb2YgYWRkaW5nIG9yIG9yJ2luZyB0aGUgaW1tMTMgZmllbGQgdG8gcnMxLiAgKi8KLQkgIGludCBpbW1fYWRkZWRfdG9fcnMxID0gMDsKLQotCSAgLyogTm9uemVybyBtZWFucyB0aGF0IHdlIGhhdmUgZm91bmQgYSBwbHVzIHNpZ24gaW4gdGhlIGFyZ3MKLQkgICAgIGZpZWxkIG9mIHRoZSBvcGNvZGUgdGFibGUuICAqLwotCSAgaW50IGZvdW5kX3BsdXMgPSAwOwotCSAgCi0JICAvKiBOb256ZXJvIG1lYW5zIHdlIGhhdmUgYW4gYW5udWxsZWQgYnJhbmNoLiAgKi8KLQkgIGludCBpc19hbm51bGxlZCA9IDA7Ci0KLQkgIC8qIERvIHdlIGhhdmUgYW4gYGFkZCcgb3IgYG9yJyBpbnN0cnVjdGlvbiBjb21iaW5pbmcgYW4KLSAgICAgICAgICAgICBpbW1lZGlhdGUgd2l0aCByczE/ICAqLwotCSAgaWYgKG9wY29kZS0+bWF0Y2ggPT0gMHg4MDEwMjAwMCB8fCBvcGNvZGUtPm1hdGNoID09IDB4ODAwMDIwMDApCi0JICAvKgkJCSAgKG9yKQkJCQkgKGFkZCkgICovCi0JICAgIGltbV9hZGRlZF90b19yczEgPSAxOwotCi0JICBpZiAoWF9SUzEgKGluc24pICE9IFhfUkQgKGluc24pCi0JICAgICAgJiYgc3RyY2hyIChvcGNvZGUtPmFyZ3MsICdyJykgIT0gMCkKLQkgICAgICAvKiBDYW4ndCBkbyBzaW1wbGUgZm9ybWF0IGlmIHNvdXJjZSBhbmQgZGVzdCBhcmUgZGlmZmVyZW50LiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgIGlmIChYX1JTMiAoaW5zbikgIT0gWF9SRCAoaW5zbikKLQkgICAgICAmJiBzdHJjaHIgKG9wY29kZS0+YXJncywgJ08nKSAhPSAwKQotCSAgICAgIC8qIENhbid0IGRvIHNpbXBsZSBmb3JtYXQgaWYgc291cmNlIGFuZCBkZXN0IGFyZSBkaWZmZXJlbnQuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgb3Bjb2RlLT5uYW1lKTsKLQotCSAgewotCSAgICByZWdpc3RlciBDT05TVCBjaGFyICpzOwotCi0JICAgIGlmIChvcGNvZGUtPmFyZ3NbMF0gIT0gJywnKQotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiICIpOwotCSAgICBmb3IgKHMgPSBvcGNvZGUtPmFyZ3M7ICpzICE9ICdcMCc7ICsrcykKLQkgICAgICB7Ci0JCXdoaWxlICgqcyA9PSAnLCcpCi0JCSAgewotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIsIik7Ci0JCSAgICArK3M7Ci0JCSAgICBzd2l0Y2ggKCpzKSB7Ci0JCSAgICBjYXNlICdhJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICJhIik7Ci0JCSAgICAgIGlzX2FubnVsbGVkID0gMTsKLQkJICAgICAgKytzOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIGNhc2UgJ04nOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgInBuIik7Ci0JCSAgICAgICsrczsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ1QnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgInB0Iik7Ci0JCSAgICAgICsrczsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQkJLyogc3dpdGNoIG9uIGFyZyAqLwotCQkgIH0JCS8qIHdoaWxlIHRoZXJlIGFyZSBjb21tYSBzdGFydGVkIGFyZ3MgKi8KLQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiAiKTsKLQkJCQotCQlzd2l0Y2ggKCpzKQotCQkgIHsKLQkJICBjYXNlICcrJzoKLQkJICAgIGZvdW5kX3BsdXMgPSAxOwotCi0JCSAgICAvKiBub3RlIGZhbGwtdGhyb3VnaCAqLwotCQkgIGRlZmF1bHQ6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVjIiwgKnMpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICcjJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiMCIpOwotCQkgICAgYnJlYWs7Ci0KLSNkZWZpbmUJcmVnKG4pCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSUlcyIsIHJlZ19uYW1lc1tuXSkKLQkJICBjYXNlICcxJzoKLQkJICBjYXNlICdyJzoKLQkJICAgIHJlZyAoWF9SUzEgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnMic6Ci0JCSAgY2FzZSAnTyc6Ci0JCSAgICByZWcgKFhfUlMyIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ2QnOgotCQkgICAgcmVnIChYX1JEIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLSN1bmRlZglyZWcKLQotI2RlZmluZQlmcmVnKG4pCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlJXMiLCBmcmVnX25hbWVzW25dKQotI2RlZmluZQlmcmVneChuKQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlJXMiLCBmcmVnX25hbWVzWygobikgJiB+MSkgfCAoKChuKSAmIDEpIDw8IDUpXSkKLQkJICBjYXNlICdlJzoKLQkJICAgIGZyZWcgKFhfUlMxIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICd2JzoJLyogZG91YmxlL2V2ZW4gKi8KLQkJICBjYXNlICdWJzoJLyogcXVhZC9tdWx0aXBsZSBvZiA0ICovCi0JCSAgICBmcmVneCAoWF9SUzEgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnZic6Ci0JCSAgICBmcmVnIChYX1JTMiAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSAnQic6CS8qIGRvdWJsZS9ldmVuICovCi0JCSAgY2FzZSAnUic6CS8qIHF1YWQvbXVsdGlwbGUgb2YgNCAqLwotCQkgICAgZnJlZ3ggKFhfUlMyIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ2cnOgotCQkgICAgZnJlZyAoWF9SRCAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSAnSCc6CS8qIGRvdWJsZS9ldmVuICovCi0JCSAgY2FzZSAnSic6CS8qIHF1YWQvbXVsdGlwbGUgb2YgNCAqLwotCQkgICAgZnJlZ3ggKFhfUkQgKGluc24pKTsKLQkJICAgIGJyZWFrOwotI3VuZGVmCWZyZWcKLSN1bmRlZglmcmVneAotCi0jZGVmaW5lCWNyZWcobikJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWMldSIsICh1bnNpZ25lZCBpbnQpIChuKSkKLQkJICBjYXNlICdiJzoKLQkJICAgIGNyZWcgKFhfUlMxIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ2MnOgotCQkgICAgY3JlZyAoWF9SUzIgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnRCc6Ci0JCSAgICBjcmVnIChYX1JEIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLSN1bmRlZgljcmVnCi0KLQkJICBjYXNlICdoJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVoaSglI3gpIiwKLQkJCQkJICAgKDB4RkZGRkZGRkYKLQkJCQkJICAgICYgKChpbnQpIFhfSU1NMjIgKGluc24pIDw8IDEwKSkpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdpJzoJLyogMTMgYml0IGltbWVkaWF0ZSAqLwotCQkgIGNhc2UgJ0knOgkvKiAxMSBiaXQgaW1tZWRpYXRlICovCi0JCSAgY2FzZSAnaic6CS8qIDEwIGJpdCBpbW1lZGlhdGUgKi8KLQkJICAgIHsKLQkJICAgICAgaW50IGltbTsKLQotCQkgICAgICBpZiAoKnMgPT0gJ2knKQotCQkgICAgICAgIGltbSA9IFhfU0lNTSAoaW5zbiwgMTMpOwotCQkgICAgICBlbHNlIGlmICgqcyA9PSAnSScpCi0JCQlpbW0gPSBYX1NJTU0gKGluc24sIDExKTsKLQkJICAgICAgZWxzZQotCQkJaW1tID0gWF9TSU1NIChpbnNuLCAxMCk7Ci0KLQkJICAgICAgLyogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgd2UgaGF2ZSBhIDEraSwgYW5kIHRha2UKLQkJCSBub3RlIG9mIHRoYXQgZmFjdC4KLQotCQkJIE5vdGU6IGJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBzb3J0IHRoZSB0YWJsZSwKLQkJCSB3ZSB3aWxsIGJlIG1hdGNoaW5nIDEraSByYXRoZXIgdGhhbiBpKzEsCi0JCQkgc28gaXQgaXMgT0sgdG8gYXNzdW1lIHRoYXQgaSBpcyBhZnRlciArLAotCQkJIG5vdCBiZWZvcmUgaXQuICAqLwotCQkgICAgICBpZiAoZm91bmRfcGx1cykKLQkJCWltbV9hZGRlZF90b19yczEgPSAxOwotCQkgICAgICAKLQkJICAgICAgaWYgKGltbSA8PSA5KQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlZCIsIGltbSk7Ci0JCSAgICAgIGVsc2UKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSN4IiwgaW1tKTsKLQkJICAgIH0KLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnWCc6CS8qIDUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotCQkgIGNhc2UgJ1knOgkvKiA2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLQkJICAgIHsKLQkJICAgICAgaW50IGltbSA9IFhfSU1NIChpbnNuLCAqcyA9PSAnWCcgPyA1IDogNik7Ci0KLQkJICAgICAgaWYgKGltbSA8PSA5KQotCQkJKGluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVkIiwgaW1tKTsKLQkJICAgICAgZWxzZQotCQkJKGluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUjeCIsICh1bnNpZ25lZCkgaW1tKTsKLQkJICAgIH0KLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnSyc6Ci0JCSAgICB7Ci0JCSAgICAgIGludCBtYXNrID0gWF9NRU1CQVIgKGluc24pOwotCQkgICAgICBpbnQgYml0ID0gMHg0MCwgcHJpbnRlZF9vbmUgPSAwOwotCQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgICAgIGlmIChtYXNrID09IDApCi0JCQkoaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiMCIpOwotCQkgICAgICBlbHNlCi0JCQl3aGlsZSAoYml0KQotCQkJICB7Ci0JCQkgICAgaWYgKG1hc2sgJiBiaXQpCi0JCQkgICAgICB7Ci0JCQkJaWYgKHByaW50ZWRfb25lKQotCQkJCSAgKGluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgInwiKTsKLQkJCQluYW1lID0gc3BhcmNfZGVjb2RlX21lbWJhciAoYml0KTsKLQkJCQkoaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJXMiLCBuYW1lKTsKLQkJCQlwcmludGVkX29uZSA9IDE7Ci0JCQkgICAgICB9Ci0JCQkgICAgYml0ID4+PSAxOwotCQkJICB9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCi0JCSAgY2FzZSAnayc6Ci0JCSAgICBpbmZvLT50YXJnZXQgPSBtZW1hZGRyICsgU0VYIChYX0RJU1AxNiAoaW5zbiksIDE2KSAqIDQ7Ci0JCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ0cnOgotCQkgICAgaW5mby0+dGFyZ2V0ID0gbWVtYWRkciArIFNFWCAoWF9ESVNQMTkgKGluc24pLCAxOSkgKiA0OwotCQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChpbmZvLT50YXJnZXQsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICc2JzoKLQkJICBjYXNlICc3JzoKLQkJICBjYXNlICc4JzoKLQkJICBjYXNlICc5JzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVmY2MlYyIsICpzIC0gJzYnICsgJzAnKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAneic6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlaWNjIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ1onOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXhjYyIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdFJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVjY3IiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAncyc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlZnBycyIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdvJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVhc2kiKTsKLQkJICAgIGJyZWFrOwotCQkgICAgCi0JCSAgY2FzZSAnVyc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUldGljayIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdQJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVwYyIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICc/JzoKLQkJICAgIGlmIChYX1JTMSAoaW5zbikgPT0gMzEpCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSV2ZXIiKTsKLQkJICAgIGVsc2UgaWYgKCh1bnNpZ25lZCkgWF9SUzEgKGluc24pIDwgMTYpCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSUlcyIsCi0JCQkJCSAgICAgdjlfcHJpdl9yZWdfbmFtZXNbWF9SUzEgKGluc24pXSk7Ci0JCSAgICBlbHNlCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVyZXNlcnZlZCIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICchJzoKLQkJICAgIGlmICgodW5zaWduZWQpIFhfUkQgKGluc24pIDwgMTUpCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSUlcyIsCi0JCQkJCSAgICAgdjlfcHJpdl9yZWdfbmFtZXNbWF9SRCAoaW5zbildKTsKLQkJICAgIGVsc2UKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXJlc2VydmVkIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJy8nOgotCQkgICAgaWYgKFhfUlMxIChpbnNuKSA8IDE2IHx8IFhfUlMxIChpbnNuKSA+IDIzKQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlcmVzZXJ2ZWQiKTsKLQkJICAgIGVsc2UKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwKLQkJCQkJICAgICB2OWFfYXNyX3JlZ19uYW1lc1tYX1JTMSAoaW5zbiktMTZdKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnXyc6Ci0JCSAgICBpZiAoWF9SRCAoaW5zbikgPCAxNiB8fCBYX1JEIChpbnNuKSA+IDIzKQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlcmVzZXJ2ZWQiKTsKLQkJICAgIGVsc2UKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwKLQkJCQkJICAgICB2OWFfYXNyX3JlZ19uYW1lc1tYX1JEIChpbnNuKS0xNl0pOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICcqJzoKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciAqbmFtZSA9IHNwYXJjX2RlY29kZV9wcmVmZXRjaCAoWF9SRCAoaW5zbikpOwotCi0JCSAgICAgIGlmIChuYW1lKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlcyIsIG5hbWUpOwotCQkgICAgICBlbHNlCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVkIiwgWF9SRCAoaW5zbikpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICAgIAotCQkgIGNhc2UgJ00nOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWFzciVkIiwgWF9SUzEgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCQkgICAgCi0JCSAgY2FzZSAnbSc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlYXNyJWQiLCBYX1JEIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQkJICAgIAotCQkgIGNhc2UgJ0wnOgotCQkgICAgaW5mby0+dGFyZ2V0ID0gbWVtYWRkciArIFNFWCAoWF9ESVNQMzAgKGluc24pLCAzMCkgKiA0OwotCQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChpbmZvLT50YXJnZXQsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICduJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkgICAgICAoc3RyZWFtLCAiJSN4IiwgU0VYIChYX0RJU1AyMiAoaW5zbiksIDIyKSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ2wnOgotCQkgICAgaW5mby0+dGFyZ2V0ID0gbWVtYWRkciArIFNFWCAoWF9ESVNQMjIgKGluc24pLCAyMikgKiA0OwotCQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChpbmZvLT50YXJnZXQsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdBJzoKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciAqbmFtZSA9IHNwYXJjX2RlY29kZV9hc2kgKFhfQVNJIChpbnNuKSk7Ci0KLQkJICAgICAgaWYgKG5hbWUpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0JCSAgICAgIGVsc2UKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiKCVkKSIsIFhfQVNJIChpbnNuKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCi0JCSAgY2FzZSAnQyc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlY3NyIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ0YnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWZzciIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdwJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVwc3IiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAncSc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlZnEiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnUSc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlY3EiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAndCc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUldGJyIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ3cnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXdpbSIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICd4JzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJWQiLAotCQkJCQkgICAoKFhfTERTVF9JIChpbnNuKSA8PCA4KQotCQkJCQkgICAgKyBYX0FTSSAoaW5zbikpKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAneSc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUleSIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICd1JzoKLQkJICBjYXNlICdVJzoKLQkJICAgIHsKLQkJICAgICAgaW50IHZhbCA9ICpzID09ICdVJyA/IFhfUlMxIChpbnNuKSA6IFhfUkQgKGluc24pOwotCQkgICAgICBjb25zdCBjaGFyICpuYW1lID0gc3BhcmNfZGVjb2RlX3NwYXJjbGV0X2NwcmVnICh2YWwpOwotCi0JCSAgICAgIGlmIChuYW1lKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlcyIsIG5hbWUpOwotCQkgICAgICBlbHNlCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlY3ByZWcoJWQpIiwgdmFsKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQotCSAgLyogSWYgd2UgYXJlIGFkZGluZyBvciBvcidpbmcgc29tZXRoaW5nIHRvIHJzMSwgdGhlbgotCSAgICAgY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcwotCSAgICAgYSBzZXRoaSB0byB0aGUgc2FtZSByZWdpc3RlciBhcyBpbiB0aGUgc2V0aGkuCi0JICAgICBJZiBzbywgYXR0ZW1wdCB0byBwcmludCB0aGUgcmVzdWx0IG9mIHRoZSBhZGQgb3IKLQkgICAgIG9yIChpbiB0aGlzIGNvbnRleHQgYWRkIGFuZCBvciBkbyB0aGUgc2FtZSB0aGluZykKLQkgICAgIGFuZCBpdHMgc3ltYm9saWMgdmFsdWUuICAqLwotCSAgaWYgKGltbV9hZGRlZF90b19yczEpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHByZXZfaW5zbjsKLQkgICAgICBpbnQgZXJyY29kZTsKLQotCSAgICAgIGVycmNvZGUgPQotCQkoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCi0JCSAgKG1lbWFkZHIgLSA0LCBidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwgaW5mbyk7Ci0JICAgICAgcHJldl9pbnNuID0gZ2V0d29yZCAoYnVmZmVyKTsKLQotCSAgICAgIGlmIChlcnJjb2RlID09IDApCi0JCXsKLQkJICAvKiBJZiBpdCBpcyBhIGRlbGF5ZWQgYnJhbmNoLCB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlCi0JCSAgICAgaW5zdHJ1Y3Rpb24gYmVmb3JlIHRoZSBkZWxheWVkIGJyYW5jaC4gIFRoaXMgaGFuZGxlcwotCQkgICAgIHNlcXVlbmNlcyBzdWNoIGFzCi0KLQkJICAgICBzZXRoaSAlbzEsICVoaShfZm9vKSwgJW8xCi0JCSAgICAgY2FsbCBfcHJpbnRmCi0JCSAgICAgb3IgJW8xLCAlbG8oX2ZvbyksICVvMQotCQkgICAgICovCi0KLQkJICBpZiAoaXNfZGVsYXllZF9icmFuY2ggKHByZXZfaW5zbikpCi0JCSAgICB7Ci0JCSAgICAgIGVycmNvZGUgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCi0JCQkobWVtYWRkciAtIDgsIGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCBpbmZvKTsKLQkJICAgICAgcHJldl9pbnNuID0gZ2V0d29yZCAoYnVmZmVyKTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogSWYgdGhlcmUgd2FzIGEgcHJvYmxlbSByZWFkaW5nIG1lbW9yeSwgdGhlbiBhc3N1bWUKLQkJIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgbm90IHNldGhpLiAgKi8KLQkgICAgICBpZiAoZXJyY29kZSA9PSAwKQotCQl7Ci0JCSAgLyogSXMgaXQgc2V0aGkgdG8gdGhlIHNhbWUgcmVnaXN0ZXI/ICAqLwotCQkgIGlmICgocHJldl9pbnNuICYgMHhjMWMwMDAwMCkgPT0gMHgwMTAwMDAwMAotCQkgICAgICAmJiBYX1JEIChwcmV2X2luc24pID09IFhfUlMxIChpbnNuKSkKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICJcdCEgIik7Ci0JCSAgICAgIGluZm8tPnRhcmdldCA9IAotCQkJKDB4RkZGRkZGRkYgJiAoaW50KSBYX0lNTTIyIChwcmV2X2luc24pIDw8IDEwKQotCQkJfCBYX1NJTU0gKGluc24sIDEzKTsKLQkJICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChpbmZvLT50YXJnZXQsIGluZm8pOwotCQkgICAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkJICAgICAgaW5mby0+ZGF0YV9zaXplID0gNDsgIC8qIEZJWE1FISEhICovCi0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAob3Bjb2RlLT5mbGFncyAmIChGX1VOQlJ8Rl9DT05EQlJ8Rl9KU1IpKQotCSAgICB7Ci0JCS8qIEZJWE1FIC0tIGNoZWNrIGlzX2FubnVsbGVkIGZsYWcgKi8KLQkgICAgICBpZiAob3Bjb2RlLT5mbGFncyAmIEZfVU5CUikKLQkJaW5mby0+aW5zbl90eXBlID0gZGlzX2JyYW5jaDsKLQkgICAgICBpZiAob3Bjb2RlLT5mbGFncyAmIEZfQ09OREJSKQotCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfY29uZGJyYW5jaDsKLQkgICAgICBpZiAob3Bjb2RlLT5mbGFncyAmIEZfSlNSKQotCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfanNyOwotCSAgICAgIGlmIChvcGNvZGUtPmZsYWdzICYgRl9ERUxBWUVEKQotCQlpbmZvLT5icmFuY2hfZGVsYXlfaW5zbnMgPSAxOwotCSAgICB9Ci0KLQkgIHJldHVybiBzaXplb2YgKGJ1ZmZlcik7Ci0JfQotICAgIH0KLQotICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfbm9uaW5zbjsJLyogTWFyayBhcyBub24tdmFsaWQgaW5zdHJ1Y3Rpb24gKi8KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sIF8oInVua25vd24iKSk7Ci0gIHJldHVybiBzaXplb2YgKGJ1ZmZlcik7Ci19Ci0KLS8qIEdpdmVuIEJGRCBtYWNoIG51bWJlciwgcmV0dXJuIGEgbWFzayBvZiBTUEFSQ19PUENPREVfQVJDSF9GT08gdmFsdWVzLiAgKi8KLQotc3RhdGljIGludAotY29tcHV0ZV9hcmNoX21hc2sgKG1hY2gpCi0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaDsKLXsKLSAgc3dpdGNoIChtYWNoKQotICAgIHsKLSAgICBjYXNlIDAgOgotICAgIGNhc2UgYmZkX21hY2hfc3BhcmMgOgotICAgICAgcmV0dXJuIFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y4KTsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0IDoKLSAgICAgIHJldHVybiBTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9TUEFSQ0xFVCk7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGUgOgotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlIDoKLSAgICAgIC8qIHNwYXJjbGl0ZXMgaW5zbnMgYXJlIHJlY29nbml6ZWQgYnkgZGVmYXVsdCAoYmVjYXVzZSB0aGF0J3MgaG93Ci0JIHRoZXkndmUgYWx3YXlzIGJlZW4gdHJlYXRlZCwgZm9yIGJldHRlciBvciB3b3JzZSkuICBLbHVkZ2UgdGhpcyBieQotCSBpbmRpY2F0aW5nIGdlbmVyaWMgdjggaXMgYWxzbyBzZWxlY3RlZC4gICovCi0gICAgICByZXR1cm4gKFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTElURSkKLQkgICAgICB8IFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y4KSk7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OHBsdXMgOgotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjkgOgotICAgICAgcmV0dXJuIFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y5KTsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EgOgotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjlhIDoKLSAgICAgIHJldHVybiBTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WOUEpOwotICAgIH0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIENvbXBhcmUgb3Bjb2RlcyBBIGFuZCBCLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9vcGNvZGVzIChhLCBiKQotICAgICBjb25zdCBQVFIgYTsKLSAgICAgY29uc3QgUFRSIGI7Ci17Ci0gIHN0cnVjdCBzcGFyY19vcGNvZGUgKm9wMCA9ICogKHN0cnVjdCBzcGFyY19vcGNvZGUgKiopIGE7Ci0gIHN0cnVjdCBzcGFyY19vcGNvZGUgKm9wMSA9ICogKHN0cnVjdCBzcGFyY19vcGNvZGUgKiopIGI7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IG1hdGNoMCA9IG9wMC0+bWF0Y2gsIG1hdGNoMSA9IG9wMS0+bWF0Y2g7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IGxvc2UwID0gb3AwLT5sb3NlLCBsb3NlMSA9IG9wMS0+bG9zZTsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogSWYgb25lIChhbmQgb25seSBvbmUpIGluc24gaXNuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSwKLSAgICAgcHJlZmVyIHRoZSBvbmUgdGhhdCBpcy4gIElmIG5laXRoZXIgYXJlIHN1cHBvcnRlZCwgYnV0IHRoZXkncmUgYm90aCBmb3IKLSAgICAgdGhlIHNhbWUgYXJjaGl0ZWN0dXJlLCBjb250aW51ZSBwcm9jZXNzaW5nLiAgT3RoZXJ3aXNlIChib3RoIHVuc3VwcG9ydGVkCi0gICAgIGFuZCBmb3IgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMpLCBwcmVmZXIgbG93ZXIgbnVtYmVyZWQgYXJjaCdzIChmdWRnZWQKLSAgICAgYnkgY29tcGFyaW5nIHRoZSBiaXRtYXNrcykuICAqLwotICBpZiAob3AwLT5hcmNoaXRlY3R1cmUgJiBjdXJyZW50X2FyY2hfbWFzaykKLSAgICB7Ci0gICAgICBpZiAoISAob3AxLT5hcmNoaXRlY3R1cmUgJiBjdXJyZW50X2FyY2hfbWFzaykpCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChvcDEtPmFyY2hpdGVjdHVyZSAmIGN1cnJlbnRfYXJjaF9tYXNrKQotCXJldHVybiAxOwotICAgICAgZWxzZSBpZiAob3AwLT5hcmNoaXRlY3R1cmUgIT0gb3AxLT5hcmNoaXRlY3R1cmUpCi0JcmV0dXJuIG9wMC0+YXJjaGl0ZWN0dXJlIC0gb3AxLT5hcmNoaXRlY3R1cmU7Ci0gICAgfQotCi0gIC8qIElmIGEgYml0IGlzIHNldCBpbiBib3RoIG1hdGNoIGFuZCBsb3NlLCB0aGVyZSBpcyBzb21ldGhpbmcKLSAgICAgd3Jvbmcgd2l0aCB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSAgaWYgKG1hdGNoMCAmIGxvc2UwKQotICAgIHsKLSAgICAgIGZwcmludGYKLQkoc3RkZXJyLAotCSAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSBfKCJJbnRlcm5hbCBlcnJvcjogIGJhZCBzcGFyYy1vcGNvZGUuaDogXCIlc1wiLCAlIy44bHgsICUjLjhseFxuIiksCi0JIG9wMC0+bmFtZSwgbWF0Y2gwLCBsb3NlMCk7Ci0gICAgICBvcDAtPmxvc2UgJj0gfm9wMC0+bWF0Y2g7Ci0gICAgICBsb3NlMCA9IG9wMC0+bG9zZTsKLSAgICB9Ci0KLSAgaWYgKG1hdGNoMSAmIGxvc2UxKQotICAgIHsKLSAgICAgIGZwcmludGYKLQkoc3RkZXJyLAotCSAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSBfKCJJbnRlcm5hbCBlcnJvcjogYmFkIHNwYXJjLW9wY29kZS5oOiBcIiVzXCIsICUjLjhseCwgJSMuOGx4XG4iKSwKLQkgb3AxLT5uYW1lLCBtYXRjaDEsIGxvc2UxKTsKLSAgICAgIG9wMS0+bG9zZSAmPSB+b3AxLT5tYXRjaDsKLSAgICAgIGxvc2UxID0gb3AxLT5sb3NlOwotICAgIH0KLQotICAvKiBCZWNhdXNlIHRoZSBiaXRzIHRoYXQgYXJlIHZhcmlhYmxlIGluIG9uZSBvcGNvZGUgYXJlIGNvbnN0YW50IGluCi0gICAgIGFub3RoZXIsIGl0IGlzIGltcG9ydGFudCB0byBvcmRlciB0aGUgb3Bjb2RlcyBpbiB0aGUgcmlnaHQgb3JkZXIuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGludCB4ID0gMSA8PCBpOwotICAgICAgaW50IHgwID0gKG1hdGNoMCAmIHgpICE9IDA7Ci0gICAgICBpbnQgeDEgPSAobWF0Y2gxICYgeCkgIT0gMDsKLQotICAgICAgaWYgKHgwICE9IHgxKQotCXJldHVybiB4MSAtIHgwOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGludCB4ID0gMSA8PCBpOwotICAgICAgaW50IHgwID0gKGxvc2UwICYgeCkgIT0gMDsKLSAgICAgIGludCB4MSA9IChsb3NlMSAmIHgpICE9IDA7Ci0KLSAgICAgIGlmICh4MCAhPSB4MSkKLQlyZXR1cm4geDEgLSB4MDsKLSAgICB9Ci0KLSAgLyogVGhleSBhcmUgZnVuY3Rpb25hbGx5IGVxdWFsLiAgU28gYXMgbG9uZyBhcyB0aGUgb3Bjb2RlIHRhYmxlIGlzCi0gICAgIHZhbGlkLCB3ZSBjYW4gcHV0IHdoaWNoZXZlciBvbmUgZmlyc3Qgd2Ugd2FudCwgb24gYWVzdGhldGljIGdyb3VuZHMuICAqLwotCi0gIC8qIE91ciBmaXJzdCBhZXN0aGV0aWMgZ3JvdW5kIGlzIHRoYXQgYWxpYXNlcyBkZWZlciB0byByZWFsIGluc25zLiAgKi8KLSAgewotICAgIGludCBhbGlhc19kaWZmID0gKG9wMC0+ZmxhZ3MgJiBGX0FMSUFTKSAtIChvcDEtPmZsYWdzICYgRl9BTElBUyk7Ci0gICAgaWYgKGFsaWFzX2RpZmYgIT0gMCkKLSAgICAgIC8qIFB1dCB0aGUgb25lIHRoYXQgaXNuJ3QgYW4gYWxpYXMgZmlyc3QuICAqLwotICAgICAgcmV0dXJuIGFsaWFzX2RpZmY7Ci0gIH0KLQotICAvKiBFeGNlcHQgZm9yIGFsaWFzZXMsIHR3byAiaWRlbnRpY2FsIiBpbnN0cnVjdGlvbnMgaGFkCi0gICAgIGJldHRlciBoYXZlIHRoZSBzYW1lIG9wY29kZS4gIFRoaXMgaXMgYSBzYW5pdHkgY2hlY2sgb24gdGhlIHRhYmxlLiAgKi8KLSAgaSA9IHN0cmNtcCAob3AwLT5uYW1lLCBvcDEtPm5hbWUpOwotICBpZiAoaSkKLSAgICB7Ci0gICAgICBpZiAob3AwLT5mbGFncyAmIEZfQUxJQVMpIC8qIElmIHRoZXkncmUgYm90aCBhbGlhc2VzLCBiZSBhcmJpdHJhcnkuICovCi0JcmV0dXJuIGk7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoc3RkZXJyLAotCQkgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJIF8oIkludGVybmFsIGVycm9yOiBiYWQgc3BhcmMtb3Bjb2RlLmg6IFwiJXNcIiA9PSBcIiVzXCJcbiIpLAotCQkgb3AwLT5uYW1lLCBvcDEtPm5hbWUpOwotICAgIH0KLQotICAvKiBGZXdlciBhcmd1bWVudHMgYXJlIHByZWZlcnJlZC4gICovCi0gIHsKLSAgICBpbnQgbGVuZ3RoX2RpZmYgPSBzdHJsZW4gKG9wMC0+YXJncykgLSBzdHJsZW4gKG9wMS0+YXJncyk7Ci0gICAgaWYgKGxlbmd0aF9kaWZmICE9IDApCi0gICAgICAvKiBQdXQgdGhlIG9uZSB3aXRoIGZld2VyIGFyZ3VtZW50cyBmaXJzdC4gICovCi0gICAgICByZXR1cm4gbGVuZ3RoX2RpZmY7Ci0gIH0KLQotICAvKiBQdXQgMStpIGJlZm9yZSBpKzEuICAqLwotICB7Ci0gICAgY2hhciAqcDAgPSAoY2hhciAqKSBzdHJjaHIgKG9wMC0+YXJncywgJysnKTsKLSAgICBjaGFyICpwMSA9IChjaGFyICopIHN0cmNociAob3AxLT5hcmdzLCAnKycpOwotCi0gICAgaWYgKHAwICYmIHAxKQotICAgICAgewotCS8qIFRoZXJlIGlzIGEgcGx1cyBpbiBib3RoIG9wZXJhbmRzLiAgTm90ZSB0aGF0IGEgcGx1cwotCSAgIHNpZ24gY2Fubm90IGJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gYXJncywKLQkgICBzbyB0aGUgZm9sbG93aW5nIFstMV0ncyBhcmUgdmFsaWQuICAqLwotCWlmIChwMFstMV0gPT0gJ2knICYmIHAxWzFdID09ICdpJykKLQkgIC8qIG9wMCBpcyBpKzEgYW5kIG9wMSBpcyAxK2ksIHNvIG9wMSBnb2VzIGZpcnN0LiAgKi8KLQkgIHJldHVybiAxOwotCWlmIChwMFsxXSA9PSAnaScgJiYgcDFbLTFdID09ICdpJykKLQkgIC8qIG9wMCBpcyAxK2kgYW5kIG9wMSBpcyBpKzEsIHNvIG9wMCBnb2VzIGZpcnN0LiAgKi8KLQkgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgfQotCi0gIC8qIFB1dCAxLGkgYmVmb3JlIGksMS4gICovCi0gIHsKLSAgICBpbnQgaTAgPSBzdHJuY21wIChvcDAtPmFyZ3MsICJpLDEiLCAzKSA9PSAwOwotICAgIGludCBpMSA9IHN0cm5jbXAgKG9wMS0+YXJncywgImksMSIsIDMpID09IDA7Ci0KLSAgICBpZiAoaTAgXiBpMSkKLSAgICAgIHJldHVybiBpMCAtIGkxOwotICB9Ci0KLSAgLyogVGhleSBhcmUsIGFzIGZhciBhcyB3ZSBjYW4gdGVsbCwgaWRlbnRpY2FsLgotICAgICBTaW5jZSBxc29ydCBtYXkgaGF2ZSByZWFycmFuZ2VkIHRoZSB0YWJsZSBwYXJ0aWFsbHksIHRoZXJlIGlzCi0gICAgIG5vIHdheSB0byB0ZWxsIHdoaWNoIG9uZSB3YXMgZmlyc3QgaW4gdGhlIG9wY29kZSB0YWJsZSBhcwotICAgICB3cml0dGVuLCBzbyBqdXN0IHNheSB0aGVyZSBhcmUgZXF1YWwuICAqLwotICAvKiA/Pz8gVGhpcyBpcyBubyBsb25nZXIgdHJ1ZSBub3cgdGhhdCB3ZSBzb3J0IGEgdmVjdG9yIG9mIHBvaW50ZXJzLAotICAgICBub3QgdGhlIHRhYmxlIGl0c2VsZi4gICovCi0gIHJldHVybiAwOwotfQotCi0vKiBCdWlsZCBhIGhhc2ggdGFibGUgZnJvbSB0aGUgb3Bjb2RlIHRhYmxlLgotICAgT1BDT0RFX1RBQkxFIGlzIGEgc29ydGVkIGxpc3Qgb2YgcG9pbnRlcnMgaW50byB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2hhc2hfdGFibGUgKG9wY29kZV90YWJsZSwgaGFzaF90YWJsZSwgbnVtX29wY29kZXMpCi0gICAgIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKipvcGNvZGVfdGFibGU7Ci0gICAgIHN0cnVjdCBvcGNvZGVfaGFzaCAqKmhhc2hfdGFibGU7Ci0gICAgIGludCBudW1fb3Bjb2RlczsKLXsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIGludCBoYXNoX2NvdW50W0hBU0hfU0laRV07Ci0gIHN0YXRpYyBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKmhhc2hfYnVmID0gTlVMTDsKLQotICAvKiBTdGFydCBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSBhbmQgd29yayBiYWNrd2FyZHMgc28gdGhhdCBlYWNoCi0gICAgIGNoYWluIGlzIHNvcnRlZC4gICovCi0KLSAgbWVtc2V0IChoYXNoX3RhYmxlLCAwLCBIQVNIX1NJWkUgKiBzaXplb2YgKGhhc2hfdGFibGVbMF0pKTsKLSAgbWVtc2V0IChoYXNoX2NvdW50LCAwLCBIQVNIX1NJWkUgKiBzaXplb2YgKGhhc2hfY291bnRbMF0pKTsKLSAgaWYgKGhhc2hfYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF9idWYpOwotICBoYXNoX2J1ZiA9IChzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgb3Bjb2RlX2hhc2gpICogbnVtX29wY29kZXMpOwotICBmb3IgKGkgPSBudW1fb3Bjb2RlcyAtIDE7IGkgPj0gMDsgLS1pKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCBoYXNoID0gSEFTSF9JTlNOIChvcGNvZGVfdGFibGVbaV0tPm1hdGNoKTsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCBvcGNvZGVfaGFzaCAqaCA9ICZoYXNoX2J1ZltpXTsKLSAgICAgIGgtPm5leHQgPSBoYXNoX3RhYmxlW2hhc2hdOwotICAgICAgaC0+b3Bjb2RlID0gb3Bjb2RlX3RhYmxlW2ldOwotICAgICAgaGFzaF90YWJsZVtoYXNoXSA9IGg7Ci0gICAgICArK2hhc2hfY291bnRbaGFzaF07Ci0gICAgfQotCi0jaWYgMCAvKiBmb3IgZGVidWdnaW5nICovCi0gIHsKLSAgICBpbnQgbWluX2NvdW50ID0gbnVtX29wY29kZXMsIG1heF9jb3VudCA9IDA7Ci0gICAgaW50IHRvdGFsOwotCi0gICAgZm9yIChpID0gMDsgaSA8IEhBU0hfU0laRTsgKytpKQotICAgICAgewotICAgICAgICBpZiAoaGFzaF9jb3VudFtpXSA8IG1pbl9jb3VudCkKLQkgIG1pbl9jb3VudCA9IGhhc2hfY291bnRbaV07Ci0JaWYgKGhhc2hfY291bnRbaV0gPiBtYXhfY291bnQpCi0JICBtYXhfY291bnQgPSBoYXNoX2NvdW50W2ldOwotCXRvdGFsICs9IGhhc2hfY291bnRbaV07Ci0gICAgICB9Ci0KLSAgICBwcmludGYgKCJPcGNvZGUgaGFzaCB0YWJsZSBzdGF0czogbWluICVkLCBtYXggJWQsIGF2ZSAlZlxuIiwKLQkgICAgbWluX2NvdW50LCBtYXhfY291bnQsIChkb3VibGUpIHRvdGFsIC8gSEFTSF9TSVpFKTsKLSAgfQotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3NwYXJjLW9wYy5jIGIvb3Bjb2Rlcy9zcGFyYy1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwYjM5Yi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3NwYXJjLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkyMCArMCwwIEBACi0vKiBUYWJsZSBvZiBvcGNvZGVzIGZvciB0aGUgc3BhcmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEJGRCBsaWJyYXJ5LgotCi1CRkQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgotdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCi12ZXJzaW9uLgotCi1CRkQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCi1XQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCSovCi0KLS8qIEZJWE1FLXNvbWVkYXk6IHBlcmhhcHMgdGhlICxhJ3MgYW5kIHN1Y2ggc2hvdWxkIGJlIGVtYmVkZGVkIGluIHRoZQotICAgaW5zdHJ1Y3Rpb24ncyBuYW1lIHJhdGhlciB0aGFuIHRoZSBhcmdzLiAgVGhpcyB3b3VsZCBtYWtlIGdhcyBmYXN0ZXIsIHBpbnNuCi0gICBzbG93ZXIsIGJ1dCB3b3VsZCBtZXNzIHVwIHNvbWUgbWFjcm9zIGEgYml0LiAgeG94b3JpY2guICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3NwYXJjLmgiCi0KLS8qIFNvbWUgZGVmaW5lcyB0byBtYWtlIGxpZmUgZWFzeS4gICovCi0jZGVmaW5lIE1BU0tfVjYJCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y2KQotI2RlZmluZSBNQVNLX1Y3CQlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WNykKLSNkZWZpbmUgTUFTS19WOAkJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjgpCi0jZGVmaW5lIE1BU0tfU1BBUkNMRVQJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMRVQpCi0jZGVmaW5lIE1BU0tfU1BBUkNMSVRFCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTElURSkKLSNkZWZpbmUgTUFTS19WOQkJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjkpCi0jZGVmaW5lIE1BU0tfVjlBCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y5QSkKLQotLyogQml0IG1hc2tzIG9mIGFyY2hpdGVjdHVyZXMgc3VwcG9ydGluZyB0aGUgaW5zbi4gICovCi0KLSNkZWZpbmUgdjYJCShNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggfCBNQVNLX1NQQVJDTEVUIFwKLQkJCSB8IE1BU0tfU1BBUkNMSVRFIHwgTUFTS19WOSB8IE1BU0tfVjlBKQotLyogdjYgaW5zbnMgbm90IHN1cHBvcnRlZCBvbiB0aGUgc3BhcmNsZXQgKi8KLSNkZWZpbmUgdjZub3RsZXQJKE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCBcCi0JCQkgfCBNQVNLX1NQQVJDTElURSB8IE1BU0tfVjkgfCBNQVNLX1Y5QSkKLSNkZWZpbmUgdjcJCShNQVNLX1Y3IHwgTUFTS19WOCB8IE1BU0tfU1BBUkNMRVQgXAotCQkJIHwgTUFTS19TUEFSQ0xJVEUgfCBNQVNLX1Y5IHwgTUFTS19WOUEpCi0vKiBBbHRob3VnaCBub3QgYWxsIGluc25zIGFyZSBpbXBsZW1lbnRlZCBpbiBoYXJkd2FyZSwgc3BhcmNsaXRlIGlzIGRlZmluZWQKLSAgIHRvIGJlIGEgc3VwZXJzZXQgb2YgdjguICBVbmltcGxlbWVudGVkIGluc25zIHRyYXAgYW5kIGFyZSB0aGVuIHRoZW9yZXRpY2FsbHkKLSAgIGltcGxlbWVudGVkIGluIHNvZnR3YXJlLgotICAgSXQncyBub3QgY2xlYXIgdGhhdCB0aGUgc2FtZSBpcyB0cnVlIGZvciBzcGFyY2xldCwgYWx0aG91Z2ggdGhlIGRvY3MKLSAgIHN1Z2dlc3QgaXQgaXMuICBSYXRoZXIgdGhhbiBjb21wbGljYXRpbmcgdGhpbmdzLCB0aGUgc3BhcmNsZXQgYXNzZW1ibGVyCi0gICByZWNvZ25pemVzIGFsbCB2OCBpbnNucy4gICovCi0jZGVmaW5lIHY4CQkoTUFTS19WOCB8IE1BU0tfU1BBUkNMRVQgfCBNQVNLX1NQQVJDTElURSB8IE1BU0tfVjkgfCBNQVNLX1Y5QSkKLSNkZWZpbmUgc3BhcmNsZXQJKE1BU0tfU1BBUkNMRVQpCi0jZGVmaW5lIHNwYXJjbGl0ZQkoTUFTS19TUEFSQ0xJVEUpCi0jZGVmaW5lIHY5CQkoTUFTS19WOSB8IE1BU0tfVjlBKQotI2RlZmluZSB2OWEJCShNQVNLX1Y5QSkKLS8qIHY2IGluc25zIG5vdCBzdXBwb3J0ZWQgYnkgdjkgKi8KLSNkZWZpbmUgdjZub3R2OQkJKE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCBcCi0JCQkgfCBNQVNLX1NQQVJDTEVUIHwgTUFTS19TUEFSQ0xJVEUpCi0vKiB2OWEgaW5zdHJ1Y3Rpb25zIHdoaWNoIHdvdWxkIGFwcGVhciB0byBiZSBhbGlhc2VzIHRvIHY5J3MgaW1wZGVwJ3MKLSAgIG90aGVyd2lzZSAqLwotI2RlZmluZSB2OW5vdHY5YQkoTUFTS19WOSkKLQotLyogVGFibGUgb2Ygb3Bjb2RlIGFyY2hpdGVjdHVyZXMuCi0gICBUaGUgb3JkZXIgaXMgZGVmaW5lZCBpbiBvcGNvZGUvc3BhcmMuaC4gICovCi0KLWNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGVfYXJjaCBzcGFyY19vcGNvZGVfYXJjaHNbXSA9IHsKLSAgeyAidjYiLCBNQVNLX1Y2IH0sCi0gIHsgInY3IiwgTUFTS19WNiB8IE1BU0tfVjcgfSwKLSAgeyAidjgiLCBNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggfSwKLSAgeyAic3BhcmNsZXQiLCBNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggfCBNQVNLX1NQQVJDTEVUIH0sCi0gIHsgInNwYXJjbGl0ZSIsIE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCB8IE1BU0tfU1BBUkNMSVRFIH0sCi0gIC8qID8/PyBEb24ndCBzb21lIHY4IHByaXZpbGVkZ2VkIGluc25zIGNvbmZsaWN0IHdpdGggdjk/ICAqLwotICB7ICJ2OSIsIE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCB8IE1BU0tfVjkgfSwKLSAgLyogdjkgd2l0aCB1bHRyYXNwYXJjIGFkZGl0aW9ucyAqLwotICB7ICJ2OWEiLCBNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggfCBNQVNLX1Y5IHwgTUFTS19WOUEgfSwKLSAgeyBOVUxMLCAwIH0KLX07Ci0KLS8qIEdpdmVuIE5BTUUsIHJldHVybiBpdCdzIGFyY2hpdGVjdHVyZSBlbnRyeS4gICovCi0KLWVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsCi1zcGFyY19vcGNvZGVfbG9va3VwX2FyY2ggKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGVfYXJjaCAqcDsKLQotICBmb3IgKHAgPSAmc3BhcmNfb3Bjb2RlX2FyY2hzWzBdOyBwLT5uYW1lOyArK3ApCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgcC0+bmFtZSkgPT0gMCkKLQlyZXR1cm4gKGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsKSAocCAtICZzcGFyY19vcGNvZGVfYXJjaHNbMF0pOwotICAgIH0KLQotICByZXR1cm4gU1BBUkNfT1BDT0RFX0FSQ0hfQkFEOwotfQotDAotLyogQnJhbmNoIGNvbmRpdGlvbiBmaWVsZC4gICovCi0jZGVmaW5lIENPTkQoeCkJCSgoKHgpJjB4Zik8PDI1KQotCi0vKiB2OTogTW92ZSAoTU9WY2MgYW5kIEZNT1ZjYykgY29uZGl0aW9uIGZpZWxkLiAgKi8KLSNkZWZpbmUgTUNPTkQoeCxpX29yX2YpCSgoKChpX29yX2YpJjEpPDwxOCl8KCgoeCk+PjExKSYoMHhmPDwxNCkpKSAvKiB2OSAqLwotCi0vKiB2OTogTW92ZSByZWdpc3RlciAoTU9WUmNjIGFuZCBGTU9WUmNjKSBjb25kaXRpb24gZmllbGQuICAqLwotI2RlZmluZSBSQ09ORCh4KQkoKCh4KSYweDcpPDwxMCkJLyogdjkgKi8KLQotI2RlZmluZSBDT05EQQkoQ09ORCgweDgpKQotI2RlZmluZSBDT05EQ0MJKENPTkQoMHhkKSkKLSNkZWZpbmUgQ09ORENTCShDT05EKDB4NSkpCi0jZGVmaW5lIENPTkRFCShDT05EKDB4MSkpCi0jZGVmaW5lIENPTkRHCShDT05EKDB4YSkpCi0jZGVmaW5lIENPTkRHRQkoQ09ORCgweGIpKQotI2RlZmluZSBDT05ER1UJKENPTkQoMHhjKSkKLSNkZWZpbmUgQ09OREwJKENPTkQoMHgzKSkKLSNkZWZpbmUgQ09ORExFCShDT05EKDB4MikpCi0jZGVmaW5lIENPTkRMRVUJKENPTkQoMHg0KSkKLSNkZWZpbmUgQ09ORE4JKENPTkQoMHgwKSkKLSNkZWZpbmUgQ09ORE5FCShDT05EKDB4OSkpCi0jZGVmaW5lIENPTkRORUcJKENPTkQoMHg2KSkKLSNkZWZpbmUgQ09ORFBPUwkoQ09ORCgweGUpKQotI2RlZmluZSBDT05EVkMJKENPTkQoMHhmKSkKLSNkZWZpbmUgQ09ORFZTCShDT05EKDB4NykpCi0KLSNkZWZpbmUgQ09ORE5aCUNPTkRORQotI2RlZmluZSBDT05EWglDT05ERQotI2RlZmluZSBDT05ER0VVCUNPTkRDQwotI2RlZmluZSBDT05ETFUJQ09ORENTCi0KLSNkZWZpbmUgRkNPTkRBCQkoQ09ORCgweDgpKQotI2RlZmluZSBGQ09OREUJCShDT05EKDB4OSkpCi0jZGVmaW5lIEZDT05ERwkJKENPTkQoMHg2KSkKLSNkZWZpbmUgRkNPTkRHRQkJKENPTkQoMHhiKSkKLSNkZWZpbmUgRkNPTkRMCQkoQ09ORCgweDQpKQotI2RlZmluZSBGQ09ORExFCQkoQ09ORCgweGQpKQotI2RlZmluZSBGQ09ORExHCQkoQ09ORCgweDIpKQotI2RlZmluZSBGQ09ORE4JCShDT05EKDB4MCkpCi0jZGVmaW5lIEZDT05ETkUJCShDT05EKDB4MSkpCi0jZGVmaW5lIEZDT05ETwkJKENPTkQoMHhmKSkKLSNkZWZpbmUgRkNPTkRVCQkoQ09ORCgweDcpKQotI2RlZmluZSBGQ09ORFVFCQkoQ09ORCgweGEpKQotI2RlZmluZSBGQ09ORFVHCQkoQ09ORCgweDUpKQotI2RlZmluZSBGQ09ORFVHRQkoQ09ORCgweGMpKQotI2RlZmluZSBGQ09ORFVMCQkoQ09ORCgweDMpKQotI2RlZmluZSBGQ09ORFVMRQkoQ09ORCgweGUpKQotCi0jZGVmaW5lIEZDT05ETloJRkNPTkRORQotI2RlZmluZSBGQ09ORFoJRkNPTkRFCi0KLSNkZWZpbmUgSUNDICgwKQkvKiB2OSAqLwotI2RlZmluZSBYQ0MgKDE8PDEyKSAvKiB2OSAqLwotI2RlZmluZSBGQ0MoeCkJKCgoeCkmMHgzKTw8MTEpIC8qIHY5ICovCi0jZGVmaW5lIEZCRkNDKHgpCSgoKHgpJjB4Myk8PDIwKQkvKiB2OSAqLwotDAotLyogVGhlIG9yZGVyIG9mIHRoZSBvcGNvZGVzIGluIHRoZSB0YWJsZSBpcyBzaWduaWZpY2FudDoKLQkKLQkqIFRoZSBhc3NlbWJsZXIgcmVxdWlyZXMgdGhhdCBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QKLQliZSBjb25zZWN1dGl2ZS4JSWYgdGhleSBhcmVuJ3QsIHRoZSBhc3NlbWJsZXIgd2lsbCBib21iIGF0IHJ1bnRpbWUuCi0KLQkqIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIG5vdCBjYXJlIGFib3V0IHRoZSBvcmRlciBvZiB0aGUgb3Bjb2Rlcy4KLQotKi8KLQotLyogRW50cmllcyBmb3IgY29tbXV0YXRpdmUgYXJpdGhtZXRpYyBvcGVyYXRpb25zLiAgKi8KLS8qID8/PyBNb3JlIGVudHJpZXMgY2FuIG1ha2UgdXNlIG9mIHRoaXMuICAqLwotI2RlZmluZSBDT01NVVRFT1Aob3Bjb2RlLCBvcDMsIGFyY2hfbWFzaykgXAoteyBvcGNvZGUsCUYzKDIsIG9wMywgMCksIEYzKH4yLCB+b3AzLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgYXJjaF9tYXNrIH0sIFwKLXsgb3Bjb2RlLAlGMygyLCBvcDMsIDEpLCBGMyh+Miwgfm9wMywgfjEpLAkJIjEsaSxkIiwgMCwgYXJjaF9tYXNrIH0sIFwKLXsgb3Bjb2RlLAlGMygyLCBvcDMsIDEpLCBGMyh+Miwgfm9wMywgfjEpLAkJImksMSxkIiwgMCwgYXJjaF9tYXNrIH0KLQotY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSBzcGFyY19vcGNvZGVzW10gPSB7Ci0KLXsgImxkIiwJRjMoMywgMHgwMCwgMCksIEYzKH4zLCB+MHgwMCwgfjApLAkJIlsxKzJdLGQiLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDAwLCAwKSwgRjMofjMsIH4weDAwLCB+MCl8UlMyX0cwLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZCBbcnMxKyVnMF0sZCAqLwoteyAibGQiLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSksCQkiWzEraV0sZCIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkIFtyczErMF0sZCAqLwoteyAibGQiLAlGMygzLCAweDIwLCAwKSwgRjMofjMsIH4weDIwLCB+MCksCQkiWzErMl0sZyIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MjAsIDApLCBGMyh+MywgfjB4MjAsIH4wKXxSUzJfRzAsCSJbMV0sZyIsIDAsIHY2IH0sIC8qIGxkIFtyczErJWcwXSxkICovCi17ICJsZCIsCUYzKDMsIDB4MjAsIDEpLCBGMyh+MywgfjB4MjAsIH4xKSwJCSJbMStpXSxnIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgyMCwgMSksIEYzKH4zLCB+MHgyMCwgfjEpLAkJIltpKzFdLGciLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDIwLCAxKSwgRjMofjMsIH4weDIwLCB+MSl8UlMxX0cwLAkiW2ldLGciLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDIwLCAxKSwgRjMofjMsIH4weDIwLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxnIiwgMCwgdjYgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkIiwJRjMoMywgMHgyMSwgMCksIEYzKH4zLCB+MHgyMSwgfjApfFJEKH4wKSwJIlsxKzJdLEYiLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDIxLCAwKSwgRjMofjMsIH4weDIxLCB+MCl8UlMyX0cwfFJEKH4wKSwiWzFdLEYiLCAwLCB2NiB9LCAvKiBsZCBbcnMxKyVnMF0sZCAqLwoteyAibGQiLAlGMygzLCAweDIxLCAxKSwgRjMofjMsIH4weDIxLCB+MSl8UkQofjApLAkiWzEraV0sRiIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MjEsIDEpLCBGMyh+MywgfjB4MjEsIH4xKXxSRCh+MCksCSJbaSsxXSxGIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgyMSwgMSksIEYzKH4zLCB+MHgyMSwgfjEpfFJTMV9HMHxSRCh+MCksIltpXSxGIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgyMSwgMSksIEYzKH4zLCB+MHgyMSwgfjEpfFNJTU0xMyh+MCl8UkQofjApLCJbMV0sRiIsIDAsIHY2IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZCIsCUYzKDMsIDB4MzAsIDApLCBGMyh+MywgfjB4MzAsIH4wKSwJCSJbMSsyXSxEIiwgMCwgdjZub3R2OSB9LAoteyAibGQiLAlGMygzLCAweDMwLCAwKSwgRjMofjMsIH4weDMwLCB+MCl8UlMyX0cwLAkiWzFdLEQiLCAwLCB2Nm5vdHY5IH0sIC8qIGxkIFtyczErJWcwXSxkICovCi17ICJsZCIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKSwJCSJbMStpXSxEIiwgMCwgdjZub3R2OSB9LAoteyAibGQiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSksCQkiW2krMV0sRCIsIDAsIHY2bm90djkgfSwKLXsgImxkIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpfFJTMV9HMCwJIltpXSxEIiwgMCwgdjZub3R2OSB9LAoteyAibGQiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxEIiwgMCwgdjZub3R2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLXsgImxkIiwJRjMoMywgMHgzMSwgMCksIEYzKH4zLCB+MHgzMSwgfjApLAkJIlsxKzJdLEMiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZCIsCUYzKDMsIDB4MzEsIDApLCBGMyh+MywgfjB4MzEsIH4wKXxSUzJfRzAsCSJbMV0sQyIsIDAsIHY2bm90djkgfSwgLyogbGQgW3JzMSslZzBdLGQgKi8KLXsgImxkIiwJRjMoMywgMHgzMSwgMSksIEYzKH4zLCB+MHgzMSwgfjEpLAkJIlsxK2ldLEMiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZCIsCUYzKDMsIDB4MzEsIDEpLCBGMyh+MywgfjB4MzEsIH4xKSwJCSJbaSsxXSxDIiwgMCwgdjZub3R2OSB9LAoteyAibGQiLAlGMygzLCAweDMxLCAxKSwgRjMofjMsIH4weDMxLCB+MSl8UlMxX0cwLAkiW2ldLEMiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZCIsCUYzKDMsIDB4MzEsIDEpLCBGMyh+MywgfjB4MzEsIH4xKXxTSU1NMTMofjApLAkiWzFdLEMiLCAwLCB2Nm5vdHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi0vKiBUaGUgdjkgTERVVyBpcyB0aGUgc2FtZSBhcyB0aGUgb2xkICdsZCcgb3Bjb2RlLCBpdCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlCi0gICAnbGQnIHBzZXVkby1vcCBpbiB2OS4gICovCi17ICJsZHV3IiwJRjMoMywgMHgwMCwgMCksIEYzKH4zLCB+MHgwMCwgfjApLAkJIlsxKzJdLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAibGR1dyIsCUYzKDMsIDB4MDAsIDApLCBGMyh+MywgfjB4MDAsIH4wKXxSUzJfRzAsCSJbMV0sZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGxkIFtyczErJWcwXSxkICovCi17ICJsZHV3IiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpLAkJIlsxK2ldLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAibGR1dyIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKSwJCSJbaSsxXSxkIiwgRl9BTElBUywgdjkgfSwKLXsgImxkdXciLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAibGR1dyIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGRkIiwJRjMoMywgMHgwMywgMCksIEYzKH4zLCB+MHgwMywgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjYgfSwKLXsgImxkZCIsCUYzKDMsIDB4MDMsIDApLCBGMyh+MywgfjB4MDMsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRkIFtyczErJWcwXSxkICovCi17ICJsZGQiLAlGMygzLCAweDAzLCAxKSwgRjMofjMsIH4weDAzLCB+MSksCQkiWzEraV0sZCIsIDAsIHY2IH0sCi17ICJsZGQiLAlGMygzLCAweDAzLCAxKSwgRjMofjMsIH4weDAzLCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCi17ICJsZGQiLAlGMygzLCAweDAzLCAxKSwgRjMofjMsIH4weDAzLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2NiB9LAoteyAibGRkIiwJRjMoMywgMHgwMywgMSksIEYzKH4zLCB+MHgwMywgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkZCBbcnMxKzBdLGQgKi8KLXsgImxkZCIsCUYzKDMsIDB4MjMsIDApLCBGMyh+MywgfjB4MjMsIH4wKXxBU0kofjApLAkiWzErMl0sSCIsIDAsIHY2IH0sCi17ICJsZGQiLAlGMygzLCAweDIzLCAwKSwgRjMofjMsIH4weDIzLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sSCIsIDAsIHY2IH0sIC8qIGxkZCBbcnMxKyVnMF0sZCAqLwoteyAibGRkIiwJRjMoMywgMHgyMywgMSksIEYzKH4zLCB+MHgyMywgfjEpLAkJIlsxK2ldLEgiLCAwLCB2NiB9LAoteyAibGRkIiwJRjMoMywgMHgyMywgMSksIEYzKH4zLCB+MHgyMywgfjEpLAkJIltpKzFdLEgiLCAwLCB2NiB9LAoteyAibGRkIiwJRjMoMywgMHgyMywgMSksIEYzKH4zLCB+MHgyMywgfjEpfFJTMV9HMCwJIltpXSxIIiwgMCwgdjYgfSwKLXsgImxkZCIsCUYzKDMsIDB4MjMsIDEpLCBGMyh+MywgfjB4MjMsIH4xKXxTSU1NMTMofjApLAkiWzFdLEgiLCAwLCB2NiB9LCAvKiBsZGQgW3JzMSswXSxkICovCi0KLXsgImxkZCIsCUYzKDMsIDB4MzMsIDApLCBGMyh+MywgfjB4MzMsIH4wKXxBU0kofjApLAkiWzErMl0sRCIsIDAsIHY2bm90djkgfSwKLXsgImxkZCIsCUYzKDMsIDB4MzMsIDApLCBGMyh+MywgfjB4MzMsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxEIiwgMCwgdjZub3R2OSB9LCAvKiBsZGQgW3JzMSslZzBdLGQgKi8KLXsgImxkZCIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKSwJCSJbMStpXSxEIiwgMCwgdjZub3R2OSB9LAoteyAibGRkIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpLAkJIltpKzFdLEQiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZGQiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSl8UlMxX0cwLAkiW2ldLEQiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZGQiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxEIiwgMCwgdjZub3R2OSB9LCAvKiBsZGQgW3JzMSswXSxkICovCi0KLXsgImxkcSIsCUYzKDMsIDB4MjIsIDApLCBGMyh+MywgfjB4MjIsIH4wKXxBU0kofjApLAkiWzErMl0sSiIsIDAsIHY5IH0sCi17ICJsZHEiLAlGMygzLCAweDIyLCAwKSwgRjMofjMsIH4weDIyLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sSiIsIDAsIHY5IH0sIC8qIGxkZCBbcnMxKyVnMF0sZCAqLwoteyAibGRxIiwJRjMoMywgMHgyMiwgMSksIEYzKH4zLCB+MHgyMiwgfjEpLAkJIlsxK2ldLEoiLCAwLCB2OSB9LAoteyAibGRxIiwJRjMoMywgMHgyMiwgMSksIEYzKH4zLCB+MHgyMiwgfjEpLAkJIltpKzFdLEoiLCAwLCB2OSB9LAoteyAibGRxIiwJRjMoMywgMHgyMiwgMSksIEYzKH4zLCB+MHgyMiwgfjEpfFJTMV9HMCwJIltpXSxKIiwgMCwgdjkgfSwKLXsgImxkcSIsCUYzKDMsIDB4MjIsIDEpLCBGMyh+MywgfjB4MjIsIH4xKXxTSU1NMTMofjApLAkiWzFdLEoiLCAwLCB2OSB9LCAvKiBsZGQgW3JzMSswXSxkICovCi0KLXsgImxkc2IiLAlGMygzLCAweDA5LCAwKSwgRjMofjMsIH4weDA5LCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2NiB9LAoteyAibGRzYiIsCUYzKDMsIDB4MDksIDApLCBGMyh+MywgfjB4MDksIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRzYiBbcnMxKyVnMF0sZCAqLwoteyAibGRzYiIsCUYzKDMsIDB4MDksIDEpLCBGMyh+MywgfjB4MDksIH4xKSwJCSJbMStpXSxkIiwgMCwgdjYgfSwKLXsgImxkc2IiLAlGMygzLCAweDA5LCAxKSwgRjMofjMsIH4weDA5LCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCi17ICJsZHNiIiwJRjMoMywgMHgwOSwgMSksIEYzKH4zLCB+MHgwOSwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjYgfSwKLXsgImxkc2IiLAlGMygzLCAweDA5LCAxKSwgRjMofjMsIH4weDA5LCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRzYiBbcnMxKzBdLGQgKi8KLQoteyAibGRzaCIsCUYzKDMsIDB4MGEsIDApLCBGMyh+MywgfjB4MGEsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRzaCBbcnMxKyVnMF0sZCAqLwoteyAibGRzaCIsCUYzKDMsIDB4MGEsIDApLCBGMyh+MywgfjB4MGEsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY2IH0sCi17ICJsZHNoIiwJRjMoMywgMHgwYSwgMSksIEYzKH4zLCB+MHgwYSwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NiB9LAoteyAibGRzaCIsCUYzKDMsIDB4MGEsIDEpLCBGMyh+MywgfjB4MGEsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjYgfSwKLXsgImxkc2giLAlGMygzLCAweDBhLCAxKSwgRjMofjMsIH4weDBhLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2NiB9LAoteyAibGRzaCIsCUYzKDMsIDB4MGEsIDEpLCBGMyh+MywgfjB4MGEsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHNoIFtyczErMF0sZCAqLwotCi17ICJsZHN0dWIiLAlGMygzLCAweDBkLCAwKSwgRjMofjMsIH4weDBkLCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2NiB9LAoteyAibGRzdHViIiwJRjMoMywgMHgwZCwgMCksIEYzKH4zLCB+MHgwZCwgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHN0dWIgW3JzMSslZzBdLGQgKi8KLXsgImxkc3R1YiIsCUYzKDMsIDB4MGQsIDEpLCBGMyh+MywgfjB4MGQsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjYgfSwKLXsgImxkc3R1YiIsCUYzKDMsIDB4MGQsIDEpLCBGMyh+MywgfjB4MGQsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjYgfSwKLXsgImxkc3R1YiIsCUYzKDMsIDB4MGQsIDEpLCBGMyh+MywgfjB4MGQsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY2IH0sCi17ICJsZHN0dWIiLAlGMygzLCAweDBkLCAxKSwgRjMofjMsIH4weDBkLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRzdHViIFtyczErMF0sZCAqLwotCi17ICJsZHN3IiwJRjMoMywgMHgwOCwgMCksIEYzKH4zLCB+MHgwOCwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjkgfSwKLXsgImxkc3ciLAlGMygzLCAweDA4LCAwKSwgRjMofjMsIH4weDA4LCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY5IH0sIC8qIGxkc3cgW3JzMSslZzBdLGQgKi8KLXsgImxkc3ciLAlGMygzLCAweDA4LCAxKSwgRjMofjMsIH4weDA4LCB+MSksCQkiWzEraV0sZCIsIDAsIHY5IH0sCi17ICJsZHN3IiwJRjMoMywgMHgwOCwgMSksIEYzKH4zLCB+MHgwOCwgfjEpLAkJIltpKzFdLGQiLCAwLCB2OSB9LAoteyAibGRzdyIsCUYzKDMsIDB4MDgsIDEpLCBGMyh+MywgfjB4MDgsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY5IH0sCi17ICJsZHN3IiwJRjMoMywgMHgwOCwgMSksIEYzKH4zLCB+MHgwOCwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY5IH0sIC8qIGxkc3cgW3JzMSswXSxkICovCi0KLXsgImxkdWIiLAlGMygzLCAweDAxLCAwKSwgRjMofjMsIH4weDAxLCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2NiB9LAoteyAibGR1YiIsCUYzKDMsIDB4MDEsIDApLCBGMyh+MywgfjB4MDEsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGR1YiBbcnMxKyVnMF0sZCAqLwoteyAibGR1YiIsCUYzKDMsIDB4MDEsIDEpLCBGMyh+MywgfjB4MDEsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjYgfSwKLXsgImxkdWIiLAlGMygzLCAweDAxLCAxKSwgRjMofjMsIH4weDAxLCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCi17ICJsZHViIiwJRjMoMywgMHgwMSwgMSksIEYzKH4zLCB+MHgwMSwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjYgfSwKLXsgImxkdWIiLAlGMygzLCAweDAxLCAxKSwgRjMofjMsIH4weDAxLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGR1YiBbcnMxKzBdLGQgKi8KLQoteyAibGR1aCIsCUYzKDMsIDB4MDIsIDApLCBGMyh+MywgfjB4MDIsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY2IH0sCi17ICJsZHVoIiwJRjMoMywgMHgwMiwgMCksIEYzKH4zLCB+MHgwMiwgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHVoIFtyczErJWcwXSxkICovCi17ICJsZHVoIiwJRjMoMywgMHgwMiwgMSksIEYzKH4zLCB+MHgwMiwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NiB9LAoteyAibGR1aCIsCUYzKDMsIDB4MDIsIDEpLCBGMyh+MywgfjB4MDIsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjYgfSwKLXsgImxkdWgiLAlGMygzLCAweDAyLCAxKSwgRjMofjMsIH4weDAyLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2NiB9LAoteyAibGR1aCIsCUYzKDMsIDB4MDIsIDEpLCBGMyh+MywgfjB4MDIsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHVoIFtyczErMF0sZCAqLwotCi17ICJsZHgiLAlGMygzLCAweDBiLCAwKSwgRjMofjMsIH4weDBiLCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2OSB9LAoteyAibGR4IiwJRjMoMywgMHgwYiwgMCksIEYzKH4zLCB+MHgwYiwgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2OSB9LCAvKiBsZHggW3JzMSslZzBdLGQgKi8KLXsgImxkeCIsCUYzKDMsIDB4MGIsIDEpLCBGMyh+MywgfjB4MGIsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjkgfSwKLXsgImxkeCIsCUYzKDMsIDB4MGIsIDEpLCBGMyh+MywgfjB4MGIsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjkgfSwKLXsgImxkeCIsCUYzKDMsIDB4MGIsIDEpLCBGMyh+MywgfjB4MGIsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY5IH0sCi17ICJsZHgiLAlGMygzLCAweDBiLCAxKSwgRjMofjMsIH4weDBiLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjkgfSwgLyogbGR4IFtyczErMF0sZCAqLwotCi17ICJsZHgiLAlGMygzLCAweDIxLCAwKXxSRCgxKSwgRjMofjMsIH4weDIxLCB+MCl8UkQofjEpLAkiWzErMl0sRiIsIDAsIHY5IH0sCi17ICJsZHgiLAlGMygzLCAweDIxLCAwKXxSRCgxKSwgRjMofjMsIH4weDIxLCB+MCl8UlMyX0cwfFJEKH4xKSwJIlsxXSxGIiwgMCwgdjkgfSwgLyogbGQgW3JzMSslZzBdLGQgKi8KLXsgImxkeCIsCUYzKDMsIDB4MjEsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjEsIH4xKXxSRCh+MSksCSJbMStpXSxGIiwgMCwgdjkgfSwKLXsgImxkeCIsCUYzKDMsIDB4MjEsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjEsIH4xKXxSRCh+MSksCSJbaSsxXSxGIiwgMCwgdjkgfSwKLXsgImxkeCIsCUYzKDMsIDB4MjEsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjEsIH4xKXxSUzFfRzB8UkQofjEpLAkiW2ldLEYiLCAwLCB2OSB9LAoteyAibGR4IiwJRjMoMywgMHgyMSwgMSl8UkQoMSksIEYzKH4zLCB+MHgyMSwgfjEpfFNJTU0xMyh+MCl8UkQofjEpLCJbMV0sRiIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZGEiLAlGMygzLCAweDEwLCAwKSwgRjMofjMsIH4weDEwLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NiB9LAoteyAibGRhIiwJRjMoMywgMHgxMCwgMCksIEYzKH4zLCB+MHgxMCwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY2IH0sIC8qIGxkYSBbcnMxKyVnMF0sZCAqLwoteyAibGRhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkYSIsCUYzKDMsIDB4MTAsIDEpLCBGMyh+MywgfjB4MTAsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZGEiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkYSIsCUYzKDMsIDB4MTAsIDEpLCBGMyh+MywgfjB4MTAsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi17ICJsZGEiLAlGMygzLCAweDMwLCAwKSwgRjMofjMsIH4weDMwLCB+MCksCQkiWzErMl1BLGciLCAwLCB2OSB9LAoteyAibGRhIiwJRjMoMywgMHgzMCwgMCksIEYzKH4zLCB+MHgzMCwgfjApfFJTMl9HMCwJIlsxXUEsZyIsIDAsIHY5IH0sIC8qIGxkYSBbcnMxKyVnMF0sZCAqLwoteyAibGRhIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpLAkJIlsxK2ldbyxnIiwgMCwgdjkgfSwKLXsgImxkYSIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKSwJCSJbaSsxXW8sZyIsIDAsIHY5IH0sCi17ICJsZGEiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSl8UlMxX0cwLAkiW2ldbyxnIiwgMCwgdjkgfSwKLXsgImxkYSIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxnIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkZGEiLAlGMygzLCAweDEzLCAwKSwgRjMofjMsIH4weDEzLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NiB9LAoteyAibGRkYSIsCUYzKDMsIDB4MTMsIDApLCBGMyh+MywgfjB4MTMsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2NiB9LCAvKiBsZGRhIFtyczErJWcwXSxkICovCi17ICJsZGRhIiwJRjMoMywgMHgxMywgMSksIEYzKH4zLCB+MHgxMywgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkZGEiLAlGMygzLCAweDEzLCAxKSwgRjMofjMsIH4weDEzLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGRkYSIsCUYzKDMsIDB4MTMsIDEpLCBGMyh+MywgfjB4MTMsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGRkYSIsCUYzKDMsIDB4MTMsIDEpLCBGMyh+MywgfjB4MTMsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkZGEiLAlGMygzLCAweDMzLCAwKSwgRjMofjMsIH4weDMzLCB+MCksCQkiWzErMl1BLEgiLCAwLCB2OSB9LAoteyAibGRkYSIsCUYzKDMsIDB4MzMsIDApLCBGMyh+MywgfjB4MzMsIH4wKXxSUzJfRzAsCSJbMV1BLEgiLCAwLCB2OSB9LCAvKiBsZGRhIFtyczErJWcwXSxkICovCi17ICJsZGRhIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpLAkJIlsxK2ldbyxIIiwgMCwgdjkgfSwKLXsgImxkZGEiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSksCQkiW2krMV1vLEgiLCAwLCB2OSB9LAoteyAibGRkYSIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKXxSUzFfRzAsCSJbaV1vLEgiLCAwLCB2OSB9LAoteyAibGRkYSIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxIIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkcWEiLAlGMygzLCAweDMyLCAwKSwgRjMofjMsIH4weDMyLCB+MCksCQkiWzErMl1BLEoiLCAwLCB2OSB9LAoteyAibGRxYSIsCUYzKDMsIDB4MzIsIDApLCBGMyh+MywgfjB4MzIsIH4wKXxSUzJfRzAsCSJbMV1BLEoiLCAwLCB2OSB9LCAvKiBsZGQgW3JzMSslZzBdLGQgKi8KLXsgImxkcWEiLAlGMygzLCAweDMyLCAxKSwgRjMofjMsIH4weDMyLCB+MSksCQkiWzEraV1vLEoiLCAwLCB2OSB9LAoteyAibGRxYSIsCUYzKDMsIDB4MzIsIDEpLCBGMyh+MywgfjB4MzIsIH4xKSwJCSJbaSsxXW8sSiIsIDAsIHY5IH0sCi17ICJsZHFhIiwJRjMoMywgMHgzMiwgMSksIEYzKH4zLCB+MHgzMiwgfjEpfFJTMV9HMCwJIltpXW8sSiIsIDAsIHY5IH0sCi17ICJsZHFhIiwJRjMoMywgMHgzMiwgMSksIEYzKH4zLCB+MHgzMiwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLEoiLCAwLCB2OSB9LCAvKiBsZGQgW3JzMSswXSxkICovCi0KLXsgImxkc2JhIiwJRjMoMywgMHgxOSwgMCksIEYzKH4zLCB+MHgxOSwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjYgfSwKLXsgImxkc2JhIiwJRjMoMywgMHgxOSwgMCksIEYzKH4zLCB+MHgxOSwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY2IH0sIC8qIGxkc2JhIFtyczErJWcwXSxkICovCi17ICJsZHNiYSIsCUYzKDMsIDB4MTksIDEpLCBGMyh+MywgfjB4MTksIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHNiYSIsCUYzKDMsIDB4MTksIDEpLCBGMyh+MywgfjB4MTksIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZHNiYSIsCUYzKDMsIDB4MTksIDEpLCBGMyh+MywgfjB4MTksIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGRzYmEiLAlGMygzLCAweDE5LCAxKSwgRjMofjMsIH4weDE5LCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZHNoYSIsCUYzKDMsIDB4MWEsIDApLCBGMyh+MywgfjB4MWEsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY2IH0sCi17ICJsZHNoYSIsCUYzKDMsIDB4MWEsIDApLCBGMyh+MywgfjB4MWEsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2NiB9LCAvKiBsZHNoYSBbcnMxKyVnMF0sZCAqLwoteyAibGRzaGEiLAlGMygzLCAweDFhLCAxKSwgRjMofjMsIH4weDFhLCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGRzaGEiLAlGMygzLCAweDFhLCAxKSwgRjMofjMsIH4weDFhLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGRzaGEiLAlGMygzLCAweDFhLCAxKSwgRjMofjMsIH4weDFhLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkc2hhIiwJRjMoMywgMHgxYSwgMSksIEYzKH4zLCB+MHgxYSwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGRzdHViYSIsCUYzKDMsIDB4MWQsIDApLCBGMyh+MywgfjB4MWQsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY2IH0sCi17ICJsZHN0dWJhIiwJRjMoMywgMHgxZCwgMCksIEYzKH4zLCB+MHgxZCwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY2IH0sIC8qIGxkc3R1YmEgW3JzMSslZzBdLGQgKi8KLXsgImxkc3R1YmEiLAlGMygzLCAweDFkLCAxKSwgRjMofjMsIH4weDFkLCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGRzdHViYSIsCUYzKDMsIDB4MWQsIDEpLCBGMyh+MywgfjB4MWQsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZHN0dWJhIiwJRjMoMywgMHgxZCwgMSksIEYzKH4zLCB+MHgxZCwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHN0dWJhIiwJRjMoMywgMHgxZCwgMSksIEYzKH4zLCB+MHgxZCwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGRzd2EiLAlGMygzLCAweDE4LCAwKSwgRjMofjMsIH4weDE4LCB+MCksCQkiWzErMl1BLGQiLCAwLCB2OSB9LAoteyAibGRzd2EiLAlGMygzLCAweDE4LCAwKSwgRjMofjMsIH4weDE4LCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjkgfSwgLyogbGRhIFtyczErJWcwXSxkICovCi17ICJsZHN3YSIsCUYzKDMsIDB4MTgsIDEpLCBGMyh+MywgfjB4MTgsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHN3YSIsCUYzKDMsIDB4MTgsIDEpLCBGMyh+MywgfjB4MTgsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZHN3YSIsCUYzKDMsIDB4MTgsIDEpLCBGMyh+MywgfjB4MTgsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGRzd2EiLAlGMygzLCAweDE4LCAxKSwgRjMofjMsIH4weDE4LCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZHViYSIsCUYzKDMsIDB4MTEsIDApLCBGMyh+MywgfjB4MTEsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY2IH0sCi17ICJsZHViYSIsCUYzKDMsIDB4MTEsIDApLCBGMyh+MywgfjB4MTEsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2NiB9LCAvKiBsZHViYSBbcnMxKyVnMF0sZCAqLwoteyAibGR1YmEiLAlGMygzLCAweDExLCAxKSwgRjMofjMsIH4weDExLCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGR1YmEiLAlGMygzLCAweDExLCAxKSwgRjMofjMsIH4weDExLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGR1YmEiLAlGMygzLCAweDExLCAxKSwgRjMofjMsIH4weDExLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkdWJhIiwJRjMoMywgMHgxMSwgMSksIEYzKH4zLCB+MHgxMSwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGR1aGEiLAlGMygzLCAweDEyLCAwKSwgRjMofjMsIH4weDEyLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NiB9LAoteyAibGR1aGEiLAlGMygzLCAweDEyLCAwKSwgRjMofjMsIH4weDEyLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjYgfSwgLyogbGR1aGEgW3JzMSslZzBdLGQgKi8KLXsgImxkdWhhIiwJRjMoMywgMHgxMiwgMSksIEYzKH4zLCB+MHgxMiwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkdWhhIiwJRjMoMywgMHgxMiwgMSksIEYzKH4zLCB+MHgxMiwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkdWhhIiwJRjMoMywgMHgxMiwgMSksIEYzKH4zLCB+MHgxMiwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHVoYSIsCUYzKDMsIDB4MTIsIDEpLCBGMyh+MywgfjB4MTIsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkdXdhIiwJRjMoMywgMHgxMCwgMCksIEYzKH4zLCB+MHgxMCwgfjApLAkJIlsxKzJdQSxkIiwgRl9BTElBUywgdjkgfSwgLyogbGR1d2EgPT09IGxkYSAqLwoteyAibGR1d2EiLAlGMygzLCAweDEwLCAwKSwgRjMofjMsIH4weDEwLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgRl9BTElBUywgdjkgfSwgLyogbGRhIFtyczErJWcwXSxkICovCi17ICJsZHV3YSIsCUYzKDMsIDB4MTAsIDEpLCBGMyh+MywgfjB4MTAsIH4xKSwJCSJbMStpXW8sZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJsZHV3YSIsCUYzKDMsIDB4MTAsIDEpLCBGMyh+MywgfjB4MTAsIH4xKSwJCSJbaSsxXW8sZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJsZHV3YSIsCUYzKDMsIDB4MTAsIDEpLCBGMyh+MywgfjB4MTAsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAibGR1d2EiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZHhhIiwJRjMoMywgMHgxYiwgMCksIEYzKH4zLCB+MHgxYiwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjkgfSwgLyogbGR1d2EgPT09IGxkYSAqLwoteyAibGR4YSIsCUYzKDMsIDB4MWIsIDApLCBGMyh+MywgfjB4MWIsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2OSB9LCAvKiBsZGEgW3JzMSslZzBdLGQgKi8KLXsgImxkeGEiLAlGMygzLCAweDFiLCAxKSwgRjMofjMsIH4weDFiLCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGR4YSIsCUYzKDMsIDB4MWIsIDEpLCBGMyh+MywgfjB4MWIsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZHhhIiwJRjMoMywgMHgxYiwgMSksIEYzKH4zLCB+MHgxYiwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHhhIiwJRjMoMywgMHgxYiwgMSksIEYzKH4zLCB+MHgxYiwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAic3QiLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJKH4wKSwJCSJkLFsxKzJdIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSV9SUzIofjApLAkJImQsWzFdIiwgMCwgdjYgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInN0IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJCSJkLFsxK2ldIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJCSJkLFtpKzFdIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJTMV9HMCwJCSJkLFtpXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxTSU1NMTMofjApLAkJImQsWzFdIiwgMCwgdjYgfSwgLyogc3QgZCxbcnMxKzBdICovCi17ICJzdCIsCUYzKDMsIDB4MjQsIDApLCBGMyh+MywgfjB4MjQsIH4wKXxBU0kofjApLAkJImcsWzErMl0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI0LCAwKSwgRjMofjMsIH4weDI0LCB+MCl8QVNJX1JTMih+MCksCQkiZyxbMV0iLCAwLCB2NiB9LCAvKiBzdCBkW3JzMSslZzBdICovCi17ICJzdCIsCUYzKDMsIDB4MjQsIDEpLCBGMyh+MywgfjB4MjQsIH4xKSwJCQkiZyxbMStpXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjQsIDEpLCBGMyh+MywgfjB4MjQsIH4xKSwJCQkiZyxbaSsxXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjQsIDEpLCBGMyh+MywgfjB4MjQsIH4xKXxSUzFfRzAsCQkiZyxbaV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI0LCAxKSwgRjMofjMsIH4weDI0LCB+MSl8U0lNTTEzKH4wKSwJCSJnLFsxXSIsIDAsIHY2IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdCIsCUYzKDMsIDB4MzQsIDApLCBGMyh+MywgfjB4MzQsIH4wKXxBU0kofjApLAkJIkQsWzErMl0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzQsIDApLCBGMyh+MywgfjB4MzQsIH4wKXxBU0lfUlMyKH4wKSwJCSJELFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInN0IiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpLAkJCSJELFsxK2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3QiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSksCQkJIkQsW2krMV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKXxSUzFfRzAsCQkiRCxbaV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKXxTSU1NMTMofjApLAkJIkQsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLXsgInN0IiwJRjMoMywgMHgzNSwgMCksIEYzKH4zLCB+MHgzNSwgfjApfEFTSSh+MCksCQkiQyxbMSsyXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNSwgMCksIEYzKH4zLCB+MHgzNSwgfjApfEFTSV9SUzIofjApLAkJIkMsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdCBkLFtyczErJWcwXSAqLwoteyAic3QiLAlGMygzLCAweDM1LCAxKSwgRjMofjMsIH4weDM1LCB+MSksCQkJIkMsWzEraV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzUsIDEpLCBGMyh+MywgfjB4MzUsIH4xKSwJCQkiQyxbaSsxXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNSwgMSksIEYzKH4zLCB+MHgzNSwgfjEpfFJTMV9HMCwJCSJDLFtpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNSwgMSksIEYzKH4zLCB+MHgzNSwgfjEpfFNJTU0xMyh+MCksCQkiQyxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdCIsCUYzKDMsIDB4MjUsIDApLCBGMyh+MywgfjB4MjUsIH4wKXxSRF9HMHxBU0kofjApLAkiRixbMSsyXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjUsIDApLCBGMyh+MywgfjB4MjUsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIkYsWzFdIiwgMCwgdjYgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInN0IiwJRjMoMywgMHgyNSwgMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJEX0cwLAkJIkYsWzEraV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI1LCAxKSwgRjMofjMsIH4weDI1LCB+MSl8UkRfRzAsCQkiRixbaSsxXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjUsIDEpLCBGMyh+MywgfjB4MjUsIH4xKXxSRF9HMHxSUzFfRzAsCQkiRixbaV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI1LCAxKSwgRjMofjMsIH4weDI1LCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIkYsWzFdIiwgMCwgdjYgfSwgLyogc3QgZCxbcnMxKzBdICovCi0KLXsgInN0dyIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHciLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCi17ICJzdHciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdGEiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCksCQkiZCxbMSsyXUEiLCAwLCB2NiB9LAoteyAic3RhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApfFJTMih+MCksCSJkLFsxXUEiLCAwLCB2NiB9LCAvKiBzdGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIDAsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdGEiLAlGMygzLCAweDM0LCAwKSwgRjMofjMsIH4weDM0LCB+MCksCQkiZyxbMSsyXUEiLCAwLCB2OSB9LAoteyAic3RhIiwJRjMoMywgMHgzNCwgMCksIEYzKH4zLCB+MHgzNCwgfjApfFJTMih+MCksCSJnLFsxXUEiLCAwLCB2OSB9LCAvKiBzdGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0YSIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKSwJCSJnLFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSksCQkiZyxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RhIiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpfFJTMV9HMCwJImcsW2ldbyIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSl8U0lNTTEzKH4wKSwJImcsWzFdbyIsIDAsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdHdhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApLAkJImQsWzErMl1BIiwgRl9BTElBUywgdjkgfSwKLXsgInN0d2EiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0YSBkLFtyczErJWcwXSAqLwoteyAic3R3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFsxK2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsW2krMV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdGIiLAlGMygzLCAweDA1LCAwKSwgRjMofjMsIH4weDA1LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCAwLCB2NiB9LAoteyAic3RiIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdGIgZCxbcnMxKyVnMF0gKi8KLXsgInN0YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKSwJCSJkLFsxK2ldIiwgMCwgdjYgfSwKLXsgInN0YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKSwJCSJkLFtpKzFdIiwgMCwgdjYgfSwKLXsgInN0YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIDAsIHY2IH0sCi17ICJzdGIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgMCwgdjYgfSwgLyogc3RiIGQsW3JzMSswXSAqLwotCi17ICJzdGJhIiwJRjMoMywgMHgxNSwgMCksIEYzKH4zLCB+MHgxNSwgfjApLAkJImQsWzErMl1BIiwgMCwgdjYgfSwKLXsgInN0YmEiLAlGMygzLCAweDE1LCAwKSwgRjMofjMsIH4weDE1LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIDAsIHY2IH0sIC8qIHN0YmEgZCxbcnMxKyVnMF0gKi8KLXsgInN0YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSksCQkiZCxbMStpXW8iLCAwLCB2OSB9LAoteyAic3RiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKSwJCSJkLFtpKzFdbyIsIDAsIHY5IH0sCi17ICJzdGJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIDAsIHY5IH0sCi17ICJzdGJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCAwLCB2OSB9LCAvKiBzdGIgZCxbcnMxKzBdICovCi0KLXsgInN0ZCIsCUYzKDMsIDB4MDcsIDApLCBGMyh+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+MywgfjB4MzcsIH4xKXxTSU1NMTMofjApLAkiRCxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KLQoteyAic3RkYSIsCUYzKDMsIDB4MTcsIDApLCBGMyh+MywgfjB4MTcsIH4wKSwJCSJkLFsxKzJdQSIsIDAsIHY2IH0sCi17ICJzdGRhIiwJRjMoMywgMHgxNywgMCksIEYzKH4zLCB+MHgxNywgfjApfFJTMih+MCksCSJkLFsxXUEiLCAwLCB2NiB9LCAvKiBzdGRhIGQsW3JzMSslZzBdICovCi17ICJzdGRhIiwJRjMoMywgMHgxNywgMSksIEYzKH4zLCB+MHgxNywgfjEpLAkJImQsWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0ZGEiLAlGMygzLCAweDE3LCAxKSwgRjMofjMsIH4weDE3LCB+MSksCQkiZCxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MTcsIDEpLCBGMyh+MywgfjB4MTcsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MTcsIDEpLCBGMyh+MywgfjB4MTcsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgMCwgdjkgfSwgLyogc3RkIGQsW3JzMSswXSAqLwoteyAic3RkYSIsCUYzKDMsIDB4MzcsIDApLCBGMyh+MywgfjB4MzcsIH4wKSwJCSJILFsxKzJdQSIsIDAsIHY5IH0sCi17ICJzdGRhIiwJRjMoMywgMHgzNywgMCksIEYzKH4zLCB+MHgzNywgfjApfFJTMih+MCksCSJILFsxXUEiLCAwLCB2OSB9LCAvKiBzdGRhIGQsW3JzMSslZzBdICovCi17ICJzdGRhIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpLAkJIkgsWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0ZGEiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSksCQkiSCxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKXxSUzFfRzAsCSJILFtpXW8iLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKXxTSU1NMTMofjApLAkiSCxbMV1vIiwgMCwgdjkgfSwgLyogc3RkIGQsW3JzMSswXSAqLwotCi17ICJzdGgiLAlGMygzLCAweDA2LCAwKSwgRjMofjMsIH4weDA2LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCAwLCB2NiB9LAoteyAic3RoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdGggZCxbcnMxKyVnMF0gKi8KLXsgInN0aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKSwJCSJkLFsxK2ldIiwgMCwgdjYgfSwKLXsgInN0aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKSwJCSJkLFtpKzFdIiwgMCwgdjYgfSwKLXsgInN0aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIDAsIHY2IH0sCi17ICJzdGgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgMCwgdjYgfSwgLyogc3RoIGQsW3JzMSswXSAqLwotCi17ICJzdGhhIiwJRjMoMywgMHgxNiwgMCksIEYzKH4zLCB+MHgxNiwgfjApLAkJImQsWzErMl1BIiwgMCwgdjYgfSwKLXsgInN0aGEiLAlGMygzLCAweDE2LCAwKSwgRjMofjMsIH4weDE2LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIDAsIHY2IH0sIC8qIHN0aGEgLFtyczErJWcwXSAqLwoteyAic3RoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKSwJCSJkLFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdGhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpLAkJImQsW2krMV1vIiwgMCwgdjkgfSwKLXsgInN0aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgMCwgdjkgfSwKLXsgInN0aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIDAsIHY5IH0sIC8qIHN0aCBkLFtyczErMF0gKi8KLQoteyAic3R4IiwJRjMoMywgMHgwZSwgMCksIEYzKH4zLCB+MHgwZSwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgMCwgdjkgfSwKLXsgInN0eCIsCUYzKDMsIDB4MGUsIDApLCBGMyh+MywgfjB4MGUsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgMCwgdjkgfSwgLyogc3R4IGQsW3JzMSslZzBdICovCi17ICJzdHgiLAlGMygzLCAweDBlLCAxKSwgRjMofjMsIH4weDBlLCB+MSksCQkiZCxbMStpXSIsIDAsIHY5IH0sCi17ICJzdHgiLAlGMygzLCAweDBlLCAxKSwgRjMofjMsIH4weDBlLCB+MSksCQkiZCxbaSsxXSIsIDAsIHY5IH0sCi17ICJzdHgiLAlGMygzLCAweDBlLCAxKSwgRjMofjMsIH4weDBlLCB+MSl8UlMxX0cwLAkiZCxbaV0iLCAwLCB2OSB9LAoteyAic3R4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIDAsIHY5IH0sIC8qIHN0eCBkLFtyczErMF0gKi8KLQoteyAic3R4IiwJRjMoMywgMHgyNSwgMCl8UkQoMSksIEYzKH4zLCB+MHgyNSwgfjApfEFTSSh+MCl8UkQofjEpLAkiRixbMSsyXSIsIDAsIHY5IH0sCi17ICJzdHgiLAlGMygzLCAweDI1LCAwKXxSRCgxKSwgRjMofjMsIH4weDI1LCB+MCl8QVNJX1JTMih+MCl8UkQofjEpLCJGLFsxXSIsIDAsIHY5IH0sIC8qIHN0eCBkLFtyczErJWcwXSAqLwoteyAic3R4IiwJRjMoMywgMHgyNSwgMSl8UkQoMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJEKH4xKSwJCSJGLFsxK2ldIiwgMCwgdjkgfSwKLXsgInN0eCIsCUYzKDMsIDB4MjUsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjUsIH4xKXxSRCh+MSksCQkiRixbaSsxXSIsIDAsIHY5IH0sCi17ICJzdHgiLAlGMygzLCAweDI1LCAxKXxSRCgxKSwgRjMofjMsIH4weDI1LCB+MSl8UlMxX0cwfFJEKH4xKSwJIkYsW2ldIiwgMCwgdjkgfSwKLXsgInN0eCIsCUYzKDMsIDB4MjUsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjUsIH4xKXxTSU1NMTMofjApfFJEKH4xKSwiRixbMV0iLCAwLCB2OSB9LCAvKiBzdHggZCxbcnMxKzBdICovCi0KLXsgInN0eGEiLAlGMygzLCAweDFlLCAwKSwgRjMofjMsIH4weDFlLCB+MCksCQkiZCxbMSsyXUEiLCAwLCB2OSB9LAoteyAic3R4YSIsCUYzKDMsIDB4MWUsIDApLCBGMyh+MywgfjB4MWUsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgMCwgdjkgfSwgLyogc3R4YSBkLFtyczErJWcwXSAqLwoteyAic3R4YSIsCUYzKDMsIDB4MWUsIDEpLCBGMyh+MywgfjB4MWUsIH4xKSwJCSJkLFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdHhhIiwJRjMoMywgMHgxZSwgMSksIEYzKH4zLCB+MHgxZSwgfjEpLAkJImQsW2krMV1vIiwgMCwgdjkgfSwKLXsgInN0eGEiLAlGMygzLCAweDFlLCAxKSwgRjMofjMsIH4weDFlLCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgMCwgdjkgfSwKLXsgInN0eGEiLAlGMygzLCAweDFlLCAxKSwgRjMofjMsIH4weDFlLCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIDAsIHY5IH0sIC8qIHN0eCBkLFtyczErMF0gKi8KLQoteyAic3RxIiwJRjMoMywgMHgyNiwgMCksIEYzKH4zLCB+MHgyNiwgfjApfEFTSSh+MCksCSJKLFsxKzJdIiwgMCwgdjkgfSwKLXsgInN0cSIsCUYzKDMsIDB4MjYsIDApLCBGMyh+MywgfjB4MjYsIH4wKXxBU0lfUlMyKH4wKSwJIkosWzFdIiwgMCwgdjkgfSwgLyogc3RxIFtyczErJWcwXSAqLwoteyAic3RxIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpLAkJIkosWzEraV0iLCAwLCB2OSB9LAoteyAic3RxIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpLAkJIkosW2krMV0iLCAwLCB2OSB9LAoteyAic3RxIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpfFJTMV9HMCwJIkosW2ldIiwgMCwgdjkgfSwKLXsgInN0cSIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKXxTSU1NMTMofjApLAkiSixbMV0iLCAwLCB2OSB9LCAvKiBzdHEgW3JzMSswXSAqLwotCi17ICJzdHFhIiwJRjMoMywgMHgzNiwgMCksIEYzKH4zLCB+MHgzNiwgfjApfEFTSSh+MCksCSJKLFsxKzJdQSIsIDAsIHY5IH0sCi17ICJzdHFhIiwJRjMoMywgMHgzNiwgMCksIEYzKH4zLCB+MHgzNiwgfjApfEFTSV9SUzIofjApLAkiSixbMV1BIiwgMCwgdjkgfSwgLyogc3RxYSBbcnMxKyVnMF0gKi8KLXsgInN0cWEiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSksCQkiSixbMStpXW8iLCAwLCB2OSB9LAoteyAic3RxYSIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKSwJCSJKLFtpKzFdbyIsIDAsIHY5IH0sCi17ICJzdHFhIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpfFJTMV9HMCwJIkosW2ldbyIsIDAsIHY5IH0sCi17ICJzdHFhIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpfFNJTU0xMyh+MCksCSJKLFsxXW8iLCAwLCB2OSB9LCAvKiBzdHFhIFtyczErMF0gKi8KLQoteyAic3dhcCIsCUYzKDMsIDB4MGYsIDApLCBGMyh+MywgfjB4MGYsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY3IH0sCi17ICJzd2FwIiwJRjMoMywgMHgwZiwgMCksIEYzKH4zLCB+MHgwZiwgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2NyB9LCAvKiBzd2FwIFtyczErJWcwXSxkICovCi17ICJzd2FwIiwJRjMoMywgMHgwZiwgMSksIEYzKH4zLCB+MHgwZiwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NyB9LAoteyAic3dhcCIsCUYzKDMsIDB4MGYsIDEpLCBGMyh+MywgfjB4MGYsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjcgfSwKLXsgInN3YXAiLAlGMygzLCAweDBmLCAxKSwgRjMofjMsIH4weDBmLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2NyB9LAoteyAic3dhcCIsCUYzKDMsIDB4MGYsIDEpLCBGMyh+MywgfjB4MGYsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NyB9LCAvKiBzd2FwIFtyczErMF0sZCAqLwotCi17ICJzd2FwYSIsCUYzKDMsIDB4MWYsIDApLCBGMyh+MywgfjB4MWYsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY3IH0sCi17ICJzd2FwYSIsCUYzKDMsIDB4MWYsIDApLCBGMyh+MywgfjB4MWYsIH4wKXxSUzIofjApLAkiWzFdQSxkIiwgMCwgdjcgfSwgLyogc3dhcGEgW3JzMSslZzBdLGQgKi8KLXsgInN3YXBhIiwJRjMoMywgMHgxZiwgMSksIEYzKH4zLCB+MHgxZiwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgInN3YXBhIiwJRjMoMywgMHgxZiwgMSksIEYzKH4zLCB+MHgxZiwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgInN3YXBhIiwJRjMoMywgMHgxZiwgMSksIEYzKH4zLCB+MHgxZiwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJzd2FwYSIsCUYzKDMsIDB4MWYsIDEpLCBGMyh+MywgfjB4MWYsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogc3dhcCBbcnMxKzBdLGQgKi8KLQoteyAicmVzdG9yZSIsCUYzKDIsIDB4M2QsIDApLCBGMyh+MiwgfjB4M2QsIH4wKXxBU0kofjApLAkJCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJyZXN0b3JlIiwJRjMoMiwgMHgzZCwgMCksIEYzKH4yLCB+MHgzZCwgfjApfFJEX0cwfFJTMV9HMHxBU0lfUlMyKH4wKSwJIiIsIDAsIHY2IH0sIC8qIHJlc3RvcmUgJWcwLCVnMCwlZzAgKi8KLXsgInJlc3RvcmUiLAlGMygyLCAweDNkLCAxKSwgRjMofjIsIH4weDNkLCB+MSksCQkJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJyZXN0b3JlIiwJRjMoMiwgMHgzZCwgMSksIEYzKH4yLCB+MHgzZCwgfjEpfFJEX0cwfFJTMV9HMHxTSU1NMTMofjApLAkiIiwgMCwgdjYgfSwgLyogcmVzdG9yZSAlZzAsMCwlZzAgKi8KLQoteyAicmV0dCIsCUYzKDIsIDB4MzksIDApLCBGMyh+MiwgfjB4MzksIH4wKXxSRF9HMHxBU0kofjApLAkiMSsyIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogcmV0dCByczErcnMyICovCi17ICJyZXR0IiwJRjMoMiwgMHgzOSwgMCksIEYzKH4yLCB+MHgzOSwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sCS8qIHJldHQgcnMxLCVnMCAqLwoteyAicmV0dCIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxSRF9HMCwJCSIxK2kiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiByZXR0IHJzMStYICovCi17ICJyZXR0IiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpfFJEX0cwLAkJImkrMSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIHJldHQgWCtyczEgKi8KLXsgInJldHQiLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSl8UkRfRzB8UlMxX0cwLAkJImkiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiByZXR0IFgrcnMxICovCi17ICJyZXR0IiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpfFJEX0cwfFJTMV9HMCwJCSJpIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwJLyogcmV0dCBYICovCi17ICJyZXR0IiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSIxIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwJLyogcmV0dCByczErMCAqLwotCi17ICJzYXZlIiwJRjMoMiwgMHgzYywgMCksIEYzKH4yLCB+MHgzYywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJzYXZlIiwJRjMoMiwgMHgzYywgMSksIEYzKH4yLCB+MHgzYywgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInNhdmUiLAkweDgxZTAwMDAwLAl+MHg4MWUwMDAwMCwJCQkiIiwgRl9BTElBUywgdjYgfSwKLQoteyAicmV0IiwgIEYzKDIsIDB4MzgsIDEpfFJTMSgweDFmKXxTSU1NMTMoOCksIEYzKH4yLCB+MHgzOCwgfjEpfFNJTU0xMyh+OCksCSAgICAgICAiIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCAlaTcrOCwlZzAgKi8KLXsgInJldGwiLCBGMygyLCAweDM4LCAxKXxSUzEoMHgwZil8U0lNTTEzKDgpLCBGMyh+MiwgfjB4MzgsIH4xKXxSUzEofjB4MGYpfFNJTU0xMyh+OCksICIiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsICVvNys4LCVnMCAqLwotCi17ICJqbXBsIiwJRjMoMiwgMHgzOCwgMCksIEYzKH4yLCB+MHgzOCwgfjApfEFTSSh+MCksCSIxKzIsZCIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLXsgImptcGwiLAlGMygyLCAweDM4LCAwKSwgRjMofjIsIH4weDM4LCB+MCl8QVNJX1JTMih+MCksCSIxLGQiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxKyVnMCxkICovCi17ICJqbXBsIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpfFNJTU0xMyh+MCksCSIxLGQiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxKzAsZCAqLwoteyAiam1wbCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKXxSUzFfRzAsCSJpLGQiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgJWcwK2ksZCAqLwoteyAiam1wbCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKSwJCSIxK2ksZCIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLXsgImptcGwiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSksCQkiaSsxLGQiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi0KLXsgImRvbmUiLAlGMygyLCAweDNlLCAwKXxSRCgwKSwgRjMofjIsIH4weDNlLCB+MCl8UkQofjApfFJTMV9HMHxTSU1NMTMofjApLAkiIiwgMCwgdjkgfSwKLXsgInJldHJ5IiwJRjMoMiwgMHgzZSwgMCl8UkQoMSksIEYzKH4yLCB+MHgzZSwgfjApfFJEKH4xKXxSUzFfRzB8U0lNTTEzKH4wKSwJIiIsIDAsIHY5IH0sCi17ICJzYXZlZCIsCUYzKDIsIDB4MzEsIDApfFJEKDApLCBGMyh+MiwgfjB4MzEsIH4wKXxSRCh+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSIiLCAwLCB2OSB9LAoteyAicmVzdG9yZWQiLAlGMygyLCAweDMxLCAwKXxSRCgxKSwgRjMofjIsIH4weDMxLCB+MCl8UkQofjEpfFJTMV9HMHxTSU1NMTMofjApLAkiIiwgMCwgdjkgfSwKLXsgInNpciIsCUYzKDIsIDB4MzAsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzMCwgfjEpfFJEKH4weGYpfFJTMV9HMCwJCSJpIiwgMCwgdjkgfSwKLQoteyAiZmx1c2giLAlGMygyLCAweDNiLCAwKSwgRjMofjIsIH4weDNiLCB+MCl8QVNJKH4wKSwJIjErMiIsIDAsIHY4IH0sCi17ICJmbHVzaCIsCUYzKDIsIDB4M2IsIDApLCBGMyh+MiwgfjB4M2IsIH4wKXxBU0lfUlMyKH4wKSwJIjEiLCAwLCB2OCB9LCAvKiBmbHVzaCByczErJWcwICovCi17ICJmbHVzaCIsCUYzKDIsIDB4M2IsIDEpLCBGMyh+MiwgfjB4M2IsIH4xKXxTSU1NMTMofjApLAkiMSIsIDAsIHY4IH0sIC8qIGZsdXNoIHJzMSswICovCi17ICJmbHVzaCIsCUYzKDIsIDB4M2IsIDEpLCBGMyh+MiwgfjB4M2IsIH4xKXxSUzFfRzAsCSJpIiwgMCwgdjggfSwgLyogZmx1c2ggJWcwK2kgKi8KLXsgImZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpLAkJIjEraSIsIDAsIHY4IH0sCi17ICJmbHVzaCIsCUYzKDIsIDB4M2IsIDEpLCBGMyh+MiwgfjB4M2IsIH4xKSwJCSJpKzEiLCAwLCB2OCB9LAotCi0vKiBJRkxVU0ggd2FzIHJlbmFtZWQgdG8gRkxVU0ggaW4gdjguICAqLwoteyAiaWZsdXNoIiwJRjMoMiwgMHgzYiwgMCksIEYzKH4yLCB+MHgzYiwgfjApfEFTSSh+MCksCSIxKzIiLCBGX0FMSUFTLCB2NiB9LAoteyAiaWZsdXNoIiwJRjMoMiwgMHgzYiwgMCksIEYzKH4yLCB+MHgzYiwgfjApfEFTSV9SUzIofjApLAkiMSIsIEZfQUxJQVMsIHY2IH0sIC8qIGZsdXNoIHJzMSslZzAgKi8KLXsgImlmbHVzaCIsCUYzKDIsIDB4M2IsIDEpLCBGMyh+MiwgfjB4M2IsIH4xKXxTSU1NMTMofjApLAkiMSIsIEZfQUxJQVMsIHY2IH0sIC8qIGZsdXNoIHJzMSswICovCi17ICJpZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSl8UlMxX0cwLAkiaSIsIEZfQUxJQVMsIHY2IH0sCi17ICJpZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSksCQkiMStpIiwgRl9BTElBUywgdjYgfSwKLXsgImlmbHVzaCIsCUYzKDIsIDB4M2IsIDEpLCBGMyh+MiwgfjB4M2IsIH4xKSwJCSJpKzEiLCBGX0FMSUFTLCB2NiB9LAotCi17ICJyZXR1cm4iLAlGMygyLCAweDM5LCAwKSwgRjMofjIsIH4weDM5LCB+MCl8QVNJKH4wKSwJIjErMiIsIDAsIHY5IH0sCi17ICJyZXR1cm4iLAlGMygyLCAweDM5LCAwKSwgRjMofjIsIH4weDM5LCB+MCl8QVNJX1JTMih+MCksCSIxIiwgMCwgdjkgfSwgLyogcmV0dXJuIHJzMSslZzAgKi8KLXsgInJldHVybiIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxTSU1NMTMofjApLAkiMSIsIDAsIHY5IH0sIC8qIHJldHVybiByczErMCAqLwoteyAicmV0dXJuIiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpfFJTMV9HMCwJImkiLCAwLCB2OSB9LCAvKiByZXR1cm4gJWcwK2kgKi8KLXsgInJldHVybiIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKSwJCSIxK2kiLCAwLCB2OSB9LAoteyAicmV0dXJuIiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpLAkJImkrMSIsIDAsIHY5IH0sCi0KLXsgImZsdXNodyIsCUYzKDIsIDB4MmIsIDApLCBGMyh+MiwgfjB4MmIsIH4wKXxSRF9HMHxSUzFfRzB8QVNJX1JTMih+MCksCSIiLCAwLCB2OSB9LAotCi17ICJtZW1iYXIiLAlGMygyLCAweDI4LCAxKXxSUzEoMHhmKSwgRjMofjIsIH4weDI4LCB+MSl8UkRfRzB8UlMxKH4weGYpfFNJTU0xMyh+MTI3KSwgIksiLCAwLCB2OSB9LAoteyAic3RiYXIiLAlGMygyLCAweDI4LCAwKXxSUzEoMHhmKSwgRjMofjIsIH4weDI4LCB+MCl8UkRfRzB8UlMxKH4weGYpfFNJTU0xMyh+MCksICIiLCAwLCB2OCB9LAotCi17ICJwcmVmZXRjaCIsCUYzKDMsIDB4MmQsIDApLCBGMyh+MywgfjB4MmQsIH4wKSwJCSJbMSsyXSwqIiwgMCwgdjkgfSwKLXsgInByZWZldGNoIiwJRjMoMywgMHgyZCwgMCksIEYzKH4zLCB+MHgyZCwgfjApfFJTMl9HMCwJIlsxXSwqIiwgMCwgdjkgfSwgLyogcHJlZmV0Y2ggW3JzMSslZzBdLHByZWZldGNoX2ZjbiAqLwoteyAicHJlZmV0Y2giLAlGMygzLCAweDJkLCAxKSwgRjMofjMsIH4weDJkLCB+MSksCQkiWzEraV0sKiIsIDAsIHY5IH0sCi17ICJwcmVmZXRjaCIsCUYzKDMsIDB4MmQsIDEpLCBGMyh+MywgfjB4MmQsIH4xKSwJCSJbaSsxXSwqIiwgMCwgdjkgfSwKLXsgInByZWZldGNoIiwJRjMoMywgMHgyZCwgMSksIEYzKH4zLCB+MHgyZCwgfjEpfFJTMV9HMCwJIltpXSwqIiwgMCwgdjkgfSwKLXsgInByZWZldGNoIiwJRjMoMywgMHgyZCwgMSksIEYzKH4zLCB+MHgyZCwgfjEpfFNJTU0xMyh+MCksCSJbMV0sKiIsIDAsIHY5IH0sIC8qIHByZWZldGNoIFtyczErMF0scHJlZmV0Y2hfZmNuICovCi17ICJwcmVmZXRjaGEiLAlGMygzLCAweDNkLCAwKSwgRjMofjMsIH4weDNkLCB+MCksCQkiWzErMl1BLCoiLCAwLCB2OSB9LAoteyAicHJlZmV0Y2hhIiwJRjMoMywgMHgzZCwgMCksIEYzKH4zLCB+MHgzZCwgfjApfFJTMl9HMCwJIlsxXUEsKiIsIDAsIHY5IH0sIC8qIHByZWZldGNoYSBbcnMxKyVnMF0scHJlZmV0Y2hfZmNuICovCi17ICJwcmVmZXRjaGEiLAlGMygzLCAweDNkLCAxKSwgRjMofjMsIH4weDNkLCB+MSksCQkiWzEraV1vLCoiLCAwLCB2OSB9LAoteyAicHJlZmV0Y2hhIiwJRjMoMywgMHgzZCwgMSksIEYzKH4zLCB+MHgzZCwgfjEpLAkJIltpKzFdbywqIiwgMCwgdjkgfSwKLXsgInByZWZldGNoYSIsCUYzKDMsIDB4M2QsIDEpLCBGMyh+MywgfjB4M2QsIH4xKXxSUzFfRzAsCSJbaV1vLCoiLCAwLCB2OSB9LAoteyAicHJlZmV0Y2hhIiwJRjMoMywgMHgzZCwgMSksIEYzKH4zLCB+MHgzZCwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLCoiLCAwLCB2OSB9LCAvKiBwcmVmZXRjaGEgW3JzMSswXSxkICovCi0KLXsgInNsbCIsCUYzKDIsIDB4MjUsIDApLCBGMyh+MiwgfjB4MjUsIH4wKXwoMTw8MTIpfCgweDdmPDw1KSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInNsbCIsCUYzKDIsIDB4MjUsIDEpLCBGMyh+MiwgfjB4MjUsIH4xKXwoMTw8MTIpfCgweDdmPDw1KSwJIjEsWCxkIiwgMCwgdjYgfSwKLXsgInNyYSIsCUYzKDIsIDB4MjcsIDApLCBGMyh+MiwgfjB4MjcsIH4wKXwoMTw8MTIpfCgweDdmPDw1KSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInNyYSIsCUYzKDIsIDB4MjcsIDEpLCBGMyh+MiwgfjB4MjcsIH4xKXwoMTw8MTIpfCgweDdmPDw1KSwJIjEsWCxkIiwgMCwgdjYgfSwKLXsgInNybCIsCUYzKDIsIDB4MjYsIDApLCBGMyh+MiwgfjB4MjYsIH4wKXwoMTw8MTIpfCgweDdmPDw1KSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInNybCIsCUYzKDIsIDB4MjYsIDEpLCBGMyh+MiwgfjB4MjYsIH4xKXwoMTw8MTIpfCgweDdmPDw1KSwJIjEsWCxkIiwgMCwgdjYgfSwKLQoteyAic2xseCIsCUYzKDIsIDB4MjUsIDApfCgxPDwxMiksIEYzKH4yLCB+MHgyNSwgfjApfCgweDdmPDw1KSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgInNsbHgiLAlGMygyLCAweDI1LCAxKXwoMTw8MTIpLCBGMyh+MiwgfjB4MjUsIH4xKXwoMHgzZjw8NiksCSIxLFksZCIsIDAsIHY5IH0sCi17ICJzcmF4IiwJRjMoMiwgMHgyNywgMCl8KDE8PDEyKSwgRjMofjIsIH4weDI3LCB+MCl8KDB4N2Y8PDUpLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAic3JheCIsCUYzKDIsIDB4MjcsIDEpfCgxPDwxMiksIEYzKH4yLCB+MHgyNywgfjEpfCgweDNmPDw2KSwJIjEsWSxkIiwgMCwgdjkgfSwKLXsgInNybHgiLAlGMygyLCAweDI2LCAwKXwoMTw8MTIpLCBGMyh+MiwgfjB4MjYsIH4wKXwoMHg3Zjw8NSksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJzcmx4IiwJRjMoMiwgMHgyNiwgMSl8KDE8PDEyKSwgRjMofjIsIH4weDI2LCB+MSl8KDB4M2Y8PDYpLAkiMSxZLGQiLCAwLCB2OSB9LAotCi17ICJtdWxzY2MiLAlGMygyLCAweDI0LCAwKSwgRjMofjIsIH4weDI0LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgIm11bHNjYyIsCUYzKDIsIDB4MjQsIDEpLCBGMyh+MiwgfjB4MjQsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi0KLXsgImRpdnNjYyIsCUYzKDIsIDB4MWQsIDApLCBGMyh+MiwgfjB4MWQsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCBzcGFyY2xpdGUgfSwKLXsgImRpdnNjYyIsCUYzKDIsIDB4MWQsIDEpLCBGMyh+MiwgfjB4MWQsIH4xKSwJCSIxLGksZCIsIDAsIHNwYXJjbGl0ZSB9LAotCi17ICJzY2FuIiwJRjMoMiwgMHgyYywgMCksIEYzKH4yLCB+MHgyYywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHNwYXJjbGV0fHNwYXJjbGl0ZSB9LAoteyAic2NhbiIsCUYzKDIsIDB4MmMsIDEpLCBGMyh+MiwgfjB4MmMsIH4xKSwJCSIxLGksZCIsIDAsIHNwYXJjbGV0fHNwYXJjbGl0ZSB9LAotCi17ICJwb3BjIiwJRjMoMiwgMHgyZSwgMCksIEYzKH4yLCB+MHgyZSwgfjApfFJTMl9HMHxBU0kofjApLCIyLGQiLCAwLCB2OSB9LAoteyAicG9wYyIsCUYzKDIsIDB4MmUsIDEpLCBGMyh+MiwgfjB4MmUsIH4xKXxSUzJfRzAsCSJpLGQiLCAwLCB2OSB9LAotCi17ICJjbHIiLAlGMygyLCAweDAyLCAwKSwgRjMofjIsIH4weDAyLCB+MCl8UkRfRzB8UlMxX0cwfEFTSV9SUzIofjApLAkiZCIsIEZfQUxJQVMsIHY2IH0sIC8qIG9yICVnMCwlZzAsZCAqLwoteyAiY2xyIiwJRjMoMiwgMHgwMiwgMSksIEYzKH4yLCB+MHgwMiwgfjEpfFJTMV9HMHxTSU1NMTMofjApLAkJImQiLCBGX0FMSUFTLCB2NiB9LCAvKiBvciAlZzAsMCxkCSovCi17ICJjbHIiLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8UkRfRzB8QVNJKH4wKSwJCSJbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHIiLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCQkiWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3QgJWcwLFtyczErJWcwXSAqLwoteyAiY2xyIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJEX0cwLAkJCSJbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHIiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UkRfRzAsCQkJIltpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgImNsciIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSRF9HMHxSUzFfRzAsCQkJIltpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHIiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJCSJbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdCAlZzAsW3JzMSswXSAqLwotCi17ICJjbHJiIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfFJEX0cwfEFTSSh+MCksCSJbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHJiIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RiICVnMCxbcnMxKyVnMF0gKi8KLXsgImNscmIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8UkRfRzAsCQkiWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyYiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxSRF9HMCwJCSJbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHJiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFJEX0cwfFJTMV9HMCwJCSJbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyYiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RiICVnMCxbcnMxKzBdICovCi0KLXsgImNscmgiLAlGMygzLCAweDA2LCAwKSwgRjMofjMsIH4weDA2LCB+MCl8UkRfRzB8QVNJKH4wKSwJIlsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgImNscmgiLAlGMygzLCAweDA2LCAwKSwgRjMofjMsIH4weDA2LCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSJbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGggJWcwLFtyczErJWcwXSAqLwoteyAiY2xyaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxSRF9HMCwJCSJbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHJoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFJEX0cwLAkJIltpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgImNscmgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8UkRfRzB8UlMxX0cwLAkJIltpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHJoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSJbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGggJWcwLFtyczErMF0gKi8KLQoteyAiY2xyeCIsCUYzKDMsIDB4MGUsIDApLCBGMyh+MywgfjB4MGUsIH4wKXxSRF9HMHxBU0kofjApLAkiWzErMl0iLCBGX0FMSUFTLCB2OSB9LAoteyAiY2xyeCIsCUYzKDMsIDB4MGUsIDApLCBGMyh+MywgfjB4MGUsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIlsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0eCAlZzAsW3JzMSslZzBdICovCi17ICJjbHJ4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpfFJEX0cwLAkJIlsxK2ldIiwgRl9BTElBUywgdjkgfSwKLXsgImNscngiLAlGMygzLCAweDBlLCAxKSwgRjMofjMsIH4weDBlLCB+MSl8UkRfRzAsCQkiW2krMV0iLCBGX0FMSUFTLCB2OSB9LAoteyAiY2xyeCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKXxSRF9HMHxSUzFfRzAsCQkiW2ldIiwgRl9BTElBUywgdjkgfSwKLXsgImNscngiLAlGMygzLCAweDBlLCAxKSwgRjMofjMsIH4weDBlLCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIlsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0eCAlZzAsW3JzMSswXSAqLwotCi17ICJvcmNjIiwJRjMoMiwgMHgxMiwgMCksIEYzKH4yLCB+MHgxMiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJvcmNjIiwJRjMoMiwgMHgxMiwgMSksIEYzKH4yLCB+MHgxMiwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgIm9yY2MiLAlGMygyLCAweDEyLCAxKSwgRjMofjIsIH4weDEyLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAotCi0vKiBUaGlzIGlzIG5vdCBhIGNvbW11dGF0aXZlIGluc3RydWN0aW9uLiAgKi8KLXsgIm9ybmNjIiwJRjMoMiwgMHgxNiwgMCksIEYzKH4yLCB+MHgxNiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJvcm5jYyIsCUYzKDIsIDB4MTYsIDEpLCBGMyh+MiwgfjB4MTYsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi0KLS8qIFRoaXMgaXMgbm90IGEgY29tbXV0YXRpdmUgaW5zdHJ1Y3Rpb24uICAqLwoteyAib3JuIiwJRjMoMiwgMHgwNiwgMCksIEYzKH4yLCB+MHgwNiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJvcm4iLAlGMygyLCAweDA2LCAxKSwgRjMofjIsIH4weDA2LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAotCi17ICJ0c3QiLAlGMygyLCAweDEyLCAwKSwgRjMofjIsIH4weDEyLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxIiwgMCwgdjYgfSwgLyogb3JjYyByczEsICVnMCwgJWcwICovCi17ICJ0c3QiLAlGMygyLCAweDEyLCAwKSwgRjMofjIsIH4weDEyLCB+MCl8UkRfRzB8UlMxX0cwfEFTSSh+MCksCSIyIiwgMCwgdjYgfSwgLyogb3JjYyAlZzAsIHJzMiwgJWcwICovCi17ICJ0c3QiLAlGMygyLCAweDEyLCAxKSwgRjMofjIsIH4weDEyLCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIjEiLCAwLCB2NiB9LCAvKiBvcmNjIHJzMSwgMCwgJWcwICovCi0KLXsgIndyIiwJRjMoMiwgMHgzMCwgMCksCQlGMyh+MiwgfjB4MzAsIH4wKXxBU0kofjApLAkJIjEsMixtIiwgMCwgdjggfSwgLyogd3IgcixyLCVhc3JYICovCi17ICJ3ciIsCUYzKDIsIDB4MzAsIDEpLAkJRjMofjIsIH4weDMwLCB+MSksCQkJIjEsaSxtIiwgMCwgdjggfSwgLyogd3IgcixpLCVhc3JYICovCi17ICJ3ciIsCUYzKDIsIDB4MzAsIDApLAkJRjMofjIsIH4weDMwLCB+MCl8QVNJX1JTMih+MCksCQkiMSxtIiwgRl9BTElBUywgdjggfSwgLyogd3IgcnMxLCVnMCwlYXNyWCAqLwoteyAid3IiLAlGMygyLCAweDMwLCAwKSwJCUYzKH4yLCB+MHgzMCwgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIseSIsIDAsIHY2IH0sIC8qIHdyIHIsciwleSAqLwoteyAid3IiLAlGMygyLCAweDMwLCAxKSwJCUYzKH4yLCB+MHgzMCwgfjEpfFJEX0cwLAkJIjEsaSx5IiwgMCwgdjYgfSwgLyogd3IgcixpLCV5ICovCi17ICJ3ciIsCUYzKDIsIDB4MzAsIDApLAkJRjMofjIsIH4weDMwLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHkiLCBGX0FMSUFTLCB2NiB9LCAvKiB3ciByczEsJWcwLCV5ICovCi17ICJ3ciIsCUYzKDIsIDB4MzEsIDApLAkJRjMofjIsIH4weDMxLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMixwIiwgMCwgdjZub3R2OSB9LCAvKiB3ciByLHIsJXBzciAqLwoteyAid3IiLAlGMygyLCAweDMxLCAxKSwJCUYzKH4yLCB+MHgzMSwgfjEpfFJEX0cwLAkJIjEsaSxwIiwgMCwgdjZub3R2OSB9LCAvKiB3ciByLGksJXBzciAqLwoteyAid3IiLAlGMygyLCAweDMxLCAwKSwJCUYzKH4yLCB+MHgzMSwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSxwIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsJWcwLCVwc3IgKi8KLXsgIndyIiwJRjMoMiwgMHgzMiwgMCksCQlGMyh+MiwgfjB4MzIsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHciLCAwLCB2Nm5vdHY5IH0sIC8qIHdyIHIsciwld2ltICovCi17ICJ3ciIsCUYzKDIsIDB4MzIsIDEpLAkJRjMofjIsIH4weDMyLCB+MSl8UkRfRzAsCQkiMSxpLHciLCAwLCB2Nm5vdHY5IH0sIC8qIHdyIHIsaSwld2ltICovCi17ICJ3ciIsCUYzKDIsIDB4MzIsIDApLAkJRjMofjIsIH4weDMyLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHciLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwlZzAsJXdpbSAqLwoteyAid3IiLAlGMygyLCAweDMzLCAwKSwJCUYzKH4yLCB+MHgzMywgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIsdCIsIDAsIHY2bm90djkgfSwgLyogd3IgcixyLCV0YnIgKi8KLXsgIndyIiwJRjMoMiwgMHgzMywgMSksCQlGMyh+MiwgfjB4MzMsIH4xKXxSRF9HMCwJCSIxLGksdCIsIDAsIHY2bm90djkgfSwgLyogd3IgcixpLCV0YnIgKi8KLXsgIndyIiwJRjMoMiwgMHgzMywgMCksCQlGMyh+MiwgfjB4MzMsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEsdCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLCVnMCwldGJyICovCi0KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMiksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4yKXxBU0kofjApLAkiMSwyLEUiLCAwLCB2OSB9LCAvKiB3ciByLHIsJWNjciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgyKSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjIpLAkJIjEsaSxFIiwgMCwgdjkgfSwgLyogd3IgcixpLCVjY3IgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMyksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4zKXxBU0kofjApLAkiMSwyLG8iLCAwLCB2OSB9LCAvKiB3ciByLHIsJWFzaSAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgzKSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjMpLAkJIjEsaSxvIiwgMCwgdjkgfSwgLyogd3IgcixpLCVhc2kgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoNiksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH42KXxBU0kofjApLAkiMSwyLHMiLCAwLCB2OSB9LCAvKiB3ciByLHIsJWZwcnMgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoNiksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH42KSwJCSIxLGkscyIsIDAsIHY5IH0sIC8qIHdyIHIsaSwlZnBycyAqLwotCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDE2KSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjE2KXxBU0kofjApLAkiMSwyLF8iLCAwLCB2OWEgfSwgLyogd3IgcixyLCVwY3IgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMTYpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MTYpLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwlcGNyICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDE3KSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjE3KXxBU0kofjApLAkiMSwyLF8iLCAwLCB2OWEgfSwgLyogd3IgcixyLCVwaWMgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMTcpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MTcpLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwlcGljICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDE4KSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjE4KXxBU0kofjApLAkiMSwyLF8iLCAwLCB2OWEgfSwgLyogd3IgcixyLCVkY3IgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMTgpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MTgpLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwlZGNyICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDE5KSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjE5KXxBU0kofjApLAkiMSwyLF8iLCAwLCB2OWEgfSwgLyogd3IgcixyLCVnc3IgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMTkpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MTkpLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwlZ3NyICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDIwKSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjIwKXxBU0kofjApLAkiMSwyLF8iLCAwLCB2OWEgfSwgLyogd3IgcixyLCVzZXRfc29mdGludCAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgyMCksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4yMCksCQkiMSxpLF8iLCAwLCB2OWEgfSwgLyogd3IgcixpLCVzZXRfc29mdGludCAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgyMSksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4yMSl8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlY2xlYXJfc29mdGludCAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgyMSksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4yMSksCQkiMSxpLF8iLCAwLCB2OWEgfSwgLyogd3IgcixpLCVjbGVhcl9zb2Z0aW50ICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDIyKSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjIyKXxBU0kofjApLAkiMSwyLF8iLCAwLCB2OWEgfSwgLyogd3IgcixyLCVzb2Z0aW50ICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDIyKSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjIyKSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJXNvZnRpbnQgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMjMpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+MjMpfEFTSSh+MCksCSIxLDIsXyIsIDAsIHY5YSB9LCAvKiB3ciByLHIsJXRpY2tfY21wciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgyMyksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4yMyksCQkiMSxpLF8iLCAwLCB2OWEgfSwgLyogd3IgcixpLCV0aWNrX2NtcHIgKi8KLQoteyAicmQiLAlGMygyLCAweDI4LCAwKSwJCQlGMyh+MiwgfjB4MjgsIH4wKXxTSU1NMTMofjApLAkJIk0sZCIsIDAsIHY4IH0sIC8qIHJkICVhc3JYLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCksCQkJRjMofjIsIH4weDI4LCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJ5LGQiLCAwLCB2NiB9LCAvKiByZCAleSxyICovCi17ICJyZCIsCUYzKDIsIDB4MjksIDApLAkJCUYzKH4yLCB+MHgyOSwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkicCxkIiwgMCwgdjZub3R2OSB9LCAvKiByZCAlcHNyLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyYSwgMCksCQkJRjMofjIsIH4weDJhLCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJ3LGQiLCAwLCB2Nm5vdHY5IH0sIC8qIHJkICV3aW0sciAqLwoteyAicmQiLAlGMygyLCAweDJiLCAwKSwJCQlGMyh+MiwgfjB4MmIsIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJInQsZCIsIDAsIHY2bm90djkgfSwgLyogcmQgJXRicixyICovCi0KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDIpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH4yKXxTSU1NMTMofjApLAkiRSxkIiwgMCwgdjkgfSwgLyogcmQgJWNjcixyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgzKSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+Myl8U0lNTTEzKH4wKSwJIm8sZCIsIDAsIHY5IH0sIC8qIHJkICVhc2ksciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoNCksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjQpfFNJTU0xMyh+MCksCSJXLGQiLCAwLCB2OSB9LCAvKiByZCAldGljayxyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSg1KSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+NSl8U0lNTTEzKH4wKSwJIlAsZCIsIDAsIHY5IH0sIC8qIHJkICVwYyxyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSg2KSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+Nil8U0lNTTEzKH4wKSwJInMsZCIsIDAsIHY5IH0sIC8qIHJkICVmcHJzLHIgKi8KLQoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMTYpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH4xNil8U0lNTTEzKH4wKSwJIi8sZCIsIDAsIHY5YSB9LCAvKiByZCAlcGNyLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDE3KSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+MTcpfFNJTU0xMyh+MCksCSIvLGQiLCAwLCB2OWEgfSwgLyogcmQgJXBpYyxyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgxOCksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjE4KXxTSU1NMTMofjApLAkiLyxkIiwgMCwgdjlhIH0sIC8qIHJkICVkY3IsciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMTkpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH4xOSl8U0lNTTEzKH4wKSwJIi8sZCIsIDAsIHY5YSB9LCAvKiByZCAlZ3NyLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDIyKSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+MjIpfFNJTU0xMyh+MCksCSIvLGQiLCAwLCB2OWEgfSwgLyogcmQgJXNvZnRpbnQsciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMjMpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH4yMyl8U0lNTTEzKH4wKSwJIi8sZCIsIDAsIHY5YSB9LCAvKiByZCAldGlja19jbXByLHIgKi8KLQoteyAicmRwciIsCUYzKDIsIDB4MmEsIDApLAkJRjMofjIsIH4weDJhLCB+MCl8U0lNTTEzKH4wKSwJIj8sZCIsIDAsIHY5IH0sICAgLyogcmRwciAlcHJpdixyICovCi17ICJ3cnByIiwJRjMoMiwgMHgzMiwgMCksCQlGMyh+MiwgfjB4MzIsIH4wKSwJCSIxLDIsISIsIDAsIHY5IH0sIC8qIHdycHIgcjEscjIsJXByaXYgKi8KLXsgIndycHIiLAlGMygyLCAweDMyLCAwKSwJCUYzKH4yLCB+MHgzMiwgfjApfFNJTU0xMyh+MCksCSIxLCEiLCAwLCB2OSB9LCAgIC8qIHdycHIgcjEsJXByaXYgKi8KLXsgIndycHIiLAlGMygyLCAweDMyLCAxKSwJCUYzKH4yLCB+MHgzMiwgfjEpLAkJIjEsaSwhIiwgMCwgdjkgfSwgLyogd3JwciByMSxpLCVwcml2ICovCi17ICJ3cnByIiwJRjMoMiwgMHgzMiwgMSksCQlGMyh+MiwgfjB4MzIsIH4xKSwJCSJpLDEsISIsIEZfQUxJQVMsIHY5IH0sIC8qIHdycHIgaSxyMSwlcHJpdiAqLwoteyAid3JwciIsCUYzKDIsIDB4MzIsIDEpLAkJRjMofjIsIH4weDMyLCB+MSl8UlMxKH4wKSwJImksISIsIDAsIHY5IH0sICAgLyogd3JwciBpLCVwcml2ICovCi0KLS8qID8/PyBUaGlzIGdyb3VwIHNlZW1zIHdyb25nLiAgQSB0aHJlZSBvcGVyYW5kIG1vdmU/ICAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMCksIEYzKH4yLCB+MHgzMCwgfjApfEFTSSh+MCksCQkiMSwyLG0iLCBGX0FMSUFTLCB2OCB9LCAvKiB3ciByLHIsJWFzclggKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDEpLCBGMyh+MiwgfjB4MzAsIH4xKSwJCQkiMSxpLG0iLCBGX0FMSUFTLCB2OCB9LCAvKiB3ciByLGksJWFzclggKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDApLCBGMyh+MiwgfjB4MzAsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHkiLCBGX0FMSUFTLCB2NiB9LCAvKiB3ciByLHIsJXkgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDEpLCBGMyh+MiwgfjB4MzAsIH4xKXxSRF9HMCwJCSIxLGkseSIsIEZfQUxJQVMsIHY2IH0sIC8qIHdyIHIsaSwleSAqLwoteyAibW92IiwJRjMoMiwgMHgzMSwgMCksIEYzKH4yLCB+MHgzMSwgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIscCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcixyLCVwc3IgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzEsIDEpLCBGMyh+MiwgfjB4MzEsIH4xKXxSRF9HMCwJCSIxLGkscCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcixpLCVwc3IgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzIsIDApLCBGMyh+MiwgfjB4MzIsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHciLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHIsciwld2ltICovCi17ICJtb3YiLAlGMygyLCAweDMyLCAxKSwgRjMofjIsIH4weDMyLCB+MSl8UkRfRzAsCQkiMSxpLHciLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHIsaSwld2ltICovCi17ICJtb3YiLAlGMygyLCAweDMzLCAwKSwgRjMofjIsIH4weDMzLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMix0IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByLHIsJXRiciAqLwoteyAibW92IiwJRjMoMiwgMHgzMywgMSksIEYzKH4yLCB+MHgzMywgfjEpfFJEX0cwLAkJIjEsaSx0IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByLGksJXRiciAqLwotCi17ICJtb3YiLAlGMygyLCAweDI4LCAwKSwgRjMofjIsIH4weDI4LCB+MCl8U0lNTTEzKH4wKSwJCSJNLGQiLCBGX0FMSUFTLCB2OCB9LCAvKiByZCAlYXNyMSxyICovCi17ICJtb3YiLAlGMygyLCAweDI4LCAwKSwgRjMofjIsIH4weDI4LCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJ5LGQiLCBGX0FMSUFTLCB2NiB9LCAvKiByZCAleSxyICovCi17ICJtb3YiLAlGMygyLCAweDI5LCAwKSwgRjMofjIsIH4weDI5LCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJwLGQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHJkICVwc3IsciAqLwoteyAibW92IiwJRjMoMiwgMHgyYSwgMCksIEYzKH4yLCB+MHgyYSwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkidyxkIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiByZCAld2ltLHIgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MmIsIDApLCBGMyh+MiwgfjB4MmIsIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJInQsZCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogcmQgJXRicixyICovCi0KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDApLCBGMyh+MiwgfjB4MzAsIH4wKXxBU0lfUlMyKH4wKSwJCSIxLG0iLCBGX0FMSUFTLCB2OCB9LCAvKiB3ciByczEsJWcwLCVhc3JYICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAxKSwgRjMofjIsIH4weDMwLCB+MSksCQkJImksbSIsIEZfQUxJQVMsIHY4IH0sIC8qIHdyICVnMCxpLCVhc3JYICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAxKSwgRjMofjIsIH4weDMwLCB+MSl8U0lNTTEzKH4wKSwJCSIxLG0iLCBGX0FMSUFTLCB2OCB9LCAvKiB3ciByczEsMCwlYXNyWCAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMCksIEYzKH4yLCB+MHgzMCwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSx5IiwgRl9BTElBUywgdjYgfSwgLyogd3IgcnMxLCVnMCwleSAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMSksIEYzKH4yLCB+MHgzMCwgfjEpfFJEX0cwLAkJImkseSIsIEZfQUxJQVMsIHY2IH0sIC8qIHdyICVnMCxpLCV5ICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAxKSwgRjMofjIsIH4weDMwLCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIjEseSIsIEZfQUxJQVMsIHY2IH0sIC8qIHdyIHJzMSwwLCV5ICovCi17ICJtb3YiLAlGMygyLCAweDMxLCAwKSwgRjMofjIsIH4weDMxLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHAiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwlZzAsJXBzciAqLwoteyAibW92IiwJRjMoMiwgMHgzMSwgMSksIEYzKH4yLCB+MHgzMSwgfjEpfFJEX0cwLAkJImkscCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgJWcwLGksJXBzciAqLwoteyAibW92IiwJRjMoMiwgMHgzMSwgMSksIEYzKH4yLCB+MHgzMSwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSIxLHAiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwwLCVwc3IgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzIsIDApLCBGMyh+MiwgfjB4MzIsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEsdyIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLCVnMCwld2ltICovCi17ICJtb3YiLAlGMygyLCAweDMyLCAxKSwgRjMofjIsIH4weDMyLCB+MSl8UkRfRzAsCQkiaSx3IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciAlZzAsaSwld2ltICovCi17ICJtb3YiLAlGMygyLCAweDMyLCAxKSwgRjMofjIsIH4weDMyLCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIjEsdyIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLDAsJXdpbSAqLwoteyAibW92IiwJRjMoMiwgMHgzMywgMCksIEYzKH4yLCB+MHgzMywgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSx0IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsJWcwLCV0YnIgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzMsIDEpLCBGMyh+MiwgfjB4MzMsIH4xKXxSRF9HMCwJCSJpLHQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyICVnMCxpLCV0YnIgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzMsIDEpLCBGMyh+MiwgfjB4MzMsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiMSx0IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsMCwldGJyICovCi0KLXsgIm1vdiIsCUYzKDIsIDB4MDIsIDApLCBGMyh+MiwgfjB4MDIsIH4wKXxSUzFfRzB8QVNJKH4wKSwJIjIsZCIsIDAsIHY2IH0sIC8qIG9yICVnMCxyczIsZCAqLwoteyAibW92IiwJRjMoMiwgMHgwMiwgMSksIEYzKH4yLCB+MHgwMiwgfjEpfFJTMV9HMCwJCSJpLGQiLCAwLCB2NiB9LCAvKiBvciAlZzAsaSxkCSovCi17ICJtb3YiLCAgICAgICAgRjMoMiwgMHgwMiwgMCksIEYzKH4yLCB+MHgwMiwgfjApfEFTSV9SUzIofjApLAkJIjEsZCIsIDAsIHY2IH0sIC8qIG9yIHJzMSwlZzAsZCAgICovCi17ICJtb3YiLCAgICAgICAgRjMoMiwgMHgwMiwgMSksIEYzKH4yLCB+MHgwMiwgfjEpfFNJTU0xMyh+MCksCQkiMSxkIiwgMCwgdjYgfSwgLyogb3IgcnMxLDAsZCAqLwotCi17ICJvciIsCUYzKDIsIDB4MDIsIDApLCBGMyh+MiwgfjB4MDIsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAib3IiLAlGMygyLCAweDAyLCAxKSwgRjMofjIsIH4weDAyLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAib3IiLAlGMygyLCAweDAyLCAxKSwgRjMofjIsIH4weDAyLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAotCi17ICJic2V0IiwJRjMoMiwgMHgwMiwgMCksIEYzKH4yLCB+MHgwMiwgfjApfEFTSSh+MCksCSIyLHIiLCBGX0FMSUFTLCB2NiB9LAkvKiBvciByZCxyczIscmQgKi8KLXsgImJzZXQiLAlGMygyLCAweDAyLCAxKSwgRjMofjIsIH4weDAyLCB+MSksCQkiaSxyIiwgRl9BTElBUywgdjYgfSwJLyogb3IgcmQsaSxyZCAqLwotCi0vKiBUaGlzIGlzIG5vdCBhIGNvbW11dGF0aXZlIGluc3RydWN0aW9uLiAgKi8KLXsgImFuZG4iLAlGMygyLCAweDA1LCAwKSwgRjMofjIsIH4weDA1LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgImFuZG4iLAlGMygyLCAweDA1LCAxKSwgRjMofjIsIH4weDA1LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAotCi0vKiBUaGlzIGlzIG5vdCBhIGNvbW11dGF0aXZlIGluc3RydWN0aW9uLiAgKi8KLXsgImFuZG5jYyIsCUYzKDIsIDB4MTUsIDApLCBGMyh+MiwgfjB4MTUsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAiYW5kbmNjIiwJRjMoMiwgMHgxNSwgMSksIEYzKH4yLCB+MHgxNSwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLQoteyAiYmNsciIsCUYzKDIsIDB4MDUsIDApLCBGMyh+MiwgfjB4MDUsIH4wKXxBU0kofjApLAkiMixyIiwgRl9BTElBUywgdjYgfSwJLyogYW5kbiByZCxyczIscmQgKi8KLXsgImJjbHIiLAlGMygyLCAweDA1LCAxKSwgRjMofjIsIH4weDA1LCB+MSksCQkiaSxyIiwgRl9BTElBUywgdjYgfSwJLyogYW5kbiByZCxpLHJkICovCi0KLXsgImNtcCIsCUYzKDIsIDB4MTQsIDApLCBGMyh+MiwgfjB4MTQsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyIiwgMCwgdjYgfSwJLyogc3ViY2MgcnMxLHJzMiwlZzAgKi8KLXsgImNtcCIsCUYzKDIsIDB4MTQsIDEpLCBGMyh+MiwgfjB4MTQsIH4xKXxSRF9HMCwJCSIxLGkiLCAwLCB2NiB9LAkvKiBzdWJjYyByczEsaSwlZzAgKi8KLQoteyAic3ViIiwJRjMoMiwgMHgwNCwgMCksIEYzKH4yLCB+MHgwNCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJzdWIiLAlGMygyLCAweDA0LCAxKSwgRjMofjIsIH4weDA0LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAotCi17ICJzdWJjYyIsCUYzKDIsIDB4MTQsIDApLCBGMyh+MiwgfjB4MTQsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAic3ViY2MiLAlGMygyLCAweDE0LCAxKSwgRjMofjIsIH4weDE0LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAotCi17ICJzdWJ4IiwJRjMoMiwgMHgwYywgMCksIEYzKH4yLCB+MHgwYywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2bm90djkgfSwKLXsgInN1YngiLAlGMygyLCAweDBjLCAxKSwgRjMofjIsIH4weDBjLCB+MSksCQkiMSxpLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJzdWJjIiwJRjMoMiwgMHgwYywgMCksIEYzKH4yLCB+MHgwYywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJzdWJjIiwJRjMoMiwgMHgwYywgMSksIEYzKH4yLCB+MHgwYywgfjEpLAkJIjEsaSxkIiwgMCwgdjkgfSwKLQoteyAic3VieGNjIiwJRjMoMiwgMHgxYywgMCksIEYzKH4yLCB+MHgxYywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2bm90djkgfSwKLXsgInN1YnhjYyIsCUYzKDIsIDB4MWMsIDEpLCBGMyh+MiwgfjB4MWMsIH4xKSwJCSIxLGksZCIsIDAsIHY2bm90djkgfSwKLXsgInN1YmNjYyIsCUYzKDIsIDB4MWMsIDApLCBGMyh+MiwgfjB4MWMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAic3ViY2NjIiwJRjMoMiwgMHgxYywgMSksIEYzKH4yLCB+MHgxYywgfjEpLAkJIjEsaSxkIiwgMCwgdjkgfSwKLQoteyAiYW5kIiwJRjMoMiwgMHgwMSwgMCksIEYzKH4yLCB+MHgwMSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJhbmQiLAlGMygyLCAweDAxLCAxKSwgRjMofjIsIH4weDAxLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAiYW5kIiwJRjMoMiwgMHgwMSwgMSksIEYzKH4yLCB+MHgwMSwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLQoteyAiYW5kY2MiLAlGMygyLCAweDExLCAwKSwgRjMofjIsIH4weDExLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgImFuZGNjIiwJRjMoMiwgMHgxMSwgMSksIEYzKH4yLCB+MHgxMSwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgImFuZGNjIiwJRjMoMiwgMHgxMSwgMSksIEYzKH4yLCB+MHgxMSwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLQoteyAiZGVjIiwJRjMoMiwgMHgwNCwgMSl8U0lNTTEzKDB4MSksIEYzKH4yLCB+MHgwNCwgfjEpfFNJTU0xMyh+MHgwMDAxKSwgInIiLCBGX0FMSUFTLCB2NiB9LAkvKiBzdWIgcmQsMSxyZCAqLwoteyAiZGVjIiwJRjMoMiwgMHgwNCwgMSksCQkgICAgRjMofjIsIH4weDA0LCB+MSksCQkgICAgICAgImksciIsIEZfQUxJQVMsIHY4IH0sCS8qIHN1YiByZCxpbW0scmQgKi8KLXsgImRlY2NjIiwJRjMoMiwgMHgxNCwgMSl8U0lNTTEzKDB4MSksIEYzKH4yLCB+MHgxNCwgfjEpfFNJTU0xMyh+MHgwMDAxKSwgInIiLCBGX0FMSUFTLCB2NiB9LAkvKiBzdWJjYyByZCwxLHJkICovCi17ICJkZWNjYyIsCUYzKDIsIDB4MTQsIDEpLAkJICAgIEYzKH4yLCB+MHgxNCwgfjEpLAkJICAgICAgICJpLHIiLCBGX0FMSUFTLCB2OCB9LAkvKiBzdWJjYyByZCxpbW0scmQgKi8KLXsgImluYyIsCUYzKDIsIDB4MDAsIDEpfFNJTU0xMygweDEpLCBGMyh+MiwgfjB4MDAsIH4xKXxTSU1NMTMofjB4MDAwMSksICJyIiwgRl9BTElBUywgdjYgfSwJLyogYWRkIHJkLDEscmQgKi8KLXsgImluYyIsCUYzKDIsIDB4MDAsIDEpLAkJICAgIEYzKH4yLCB+MHgwMCwgfjEpLAkJICAgICAgICJpLHIiLCBGX0FMSUFTLCB2OCB9LAkvKiBhZGQgcmQsaW1tLHJkICovCi17ICJpbmNjYyIsCUYzKDIsIDB4MTAsIDEpfFNJTU0xMygweDEpLCBGMyh+MiwgfjB4MTAsIH4xKXxTSU1NMTMofjB4MDAwMSksICJyIiwgRl9BTElBUywgdjYgfSwJLyogYWRkY2MgcmQsMSxyZCAqLwoteyAiaW5jY2MiLAlGMygyLCAweDEwLCAxKSwJCSAgICBGMyh+MiwgfjB4MTAsIH4xKSwJCSAgICAgICAiaSxyIiwgRl9BTElBUywgdjggfSwJLyogYWRkY2MgcmQsaW1tLHJkICovCi0KLXsgImJ0c3QiLAlGMygyLCAweDExLCAwKSwgRjMofjIsIH4weDExLCB+MCl8UkRfRzB8QVNJKH4wKSwgIjEsMiIsIEZfQUxJQVMsIHY2IH0sCS8qIGFuZGNjIHJzMSxyczIsJWcwICovCi17ICJidHN0IiwJRjMoMiwgMHgxMSwgMSksIEYzKH4yLCB+MHgxMSwgfjEpfFJEX0cwLCAiaSwxIiwgRl9BTElBUywgdjYgfSwJLyogYW5kY2MgcnMxLGksJWcwICovCi0KLXsgIm5lZyIsCUYzKDIsIDB4MDQsIDApLCBGMyh+MiwgfjB4MDQsIH4wKXxSUzFfRzB8QVNJKH4wKSwgIjIsZCIsIEZfQUxJQVMsIHY2IH0sIC8qIHN1YiAlZzAscnMyLHJkICovCi17ICJuZWciLAlGMygyLCAweDA0LCAwKSwgRjMofjIsIH4weDA0LCB+MCl8UlMxX0cwfEFTSSh+MCksICJPIiwgRl9BTElBUywgdjYgfSwgLyogc3ViICVnMCxyZCxyZCAqLwotCi17ICJhZGQiLAlGMygyLCAweDAwLCAwKSwgRjMofjIsIH4weDAwLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgImFkZCIsCUYzKDIsIDB4MDAsIDEpLCBGMyh+MiwgfjB4MDAsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJhZGQiLAlGMygyLCAweDAwLCAxKSwgRjMofjIsIH4weDAwLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAoteyAiYWRkY2MiLAlGMygyLCAweDEwLCAwKSwgRjMofjIsIH4weDEwLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgImFkZGNjIiwJRjMoMiwgMHgxMCwgMSksIEYzKH4yLCB+MHgxMCwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgImFkZGNjIiwJRjMoMiwgMHgxMCwgMSksIEYzKH4yLCB+MHgxMCwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLQoteyAiYWRkeCIsCUYzKDIsIDB4MDgsIDApLCBGMyh+MiwgfjB4MDgsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJhZGR4IiwJRjMoMiwgMHgwOCwgMSksIEYzKH4yLCB+MHgwOCwgfjEpLAkJIjEsaSxkIiwgMCwgdjZub3R2OSB9LAoteyAiYWRkeCIsCUYzKDIsIDB4MDgsIDEpLCBGMyh+MiwgfjB4MDgsIH4xKSwJCSJpLDEsZCIsIDAsIHY2bm90djkgfSwKLXsgImFkZGMiLAlGMygyLCAweDA4LCAwKSwgRjMofjIsIH4weDA4LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgImFkZGMiLAlGMygyLCAweDA4LCAxKSwgRjMofjIsIH4weDA4LCB+MSksCQkiMSxpLGQiLCAwLCB2OSB9LAoteyAiYWRkYyIsCUYzKDIsIDB4MDgsIDEpLCBGMyh+MiwgfjB4MDgsIH4xKSwJCSJpLDEsZCIsIDAsIHY5IH0sCi0KLXsgImFkZHhjYyIsCUYzKDIsIDB4MTgsIDApLCBGMyh+MiwgfjB4MTgsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJhZGR4Y2MiLAlGMygyLCAweDE4LCAxKSwgRjMofjIsIH4weDE4LCB+MSksCQkiMSxpLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJhZGR4Y2MiLAlGMygyLCAweDE4LCAxKSwgRjMofjIsIH4weDE4LCB+MSksCQkiaSwxLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJhZGRjY2MiLAlGMygyLCAweDE4LCAwKSwgRjMofjIsIH4weDE4LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgImFkZGNjYyIsCUYzKDIsIDB4MTgsIDEpLCBGMyh+MiwgfjB4MTgsIH4xKSwJCSIxLGksZCIsIDAsIHY5IH0sCi17ICJhZGRjY2MiLAlGMygyLCAweDE4LCAxKSwgRjMofjIsIH4weDE4LCB+MSksCQkiaSwxLGQiLCAwLCB2OSB9LAotCi17ICJzbXVsIiwJRjMoMiwgMHgwYiwgMCksIEYzKH4yLCB+MHgwYiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCi17ICJzbXVsIiwJRjMoMiwgMHgwYiwgMSksIEYzKH4yLCB+MHgwYiwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKLXsgInNtdWwiLAlGMygyLCAweDBiLCAxKSwgRjMofjIsIH4weDBiLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAoteyAic211bGNjIiwJRjMoMiwgMHgxYiwgMCksIEYzKH4yLCB+MHgxYiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCi17ICJzbXVsY2MiLAlGMygyLCAweDFiLCAxKSwgRjMofjIsIH4weDFiLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoteyAic211bGNjIiwJRjMoMiwgMHgxYiwgMSksIEYzKH4yLCB+MHgxYiwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKLXsgInVtdWwiLAlGMygyLCAweDBhLCAwKSwgRjMofjIsIH4weDBhLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKLXsgInVtdWwiLAlGMygyLCAweDBhLCAxKSwgRjMofjIsIH4weDBhLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoteyAidW11bCIsCUYzKDIsIDB4MGEsIDEpLCBGMyh+MiwgfjB4MGEsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCi17ICJ1bXVsY2MiLAlGMygyLCAweDFhLCAwKSwgRjMofjIsIH4weDFhLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKLXsgInVtdWxjYyIsCUYzKDIsIDB4MWEsIDEpLCBGMyh+MiwgfjB4MWEsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCi17ICJ1bXVsY2MiLAlGMygyLCAweDFhLCAxKSwgRjMofjIsIH4weDFhLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAoteyAic2RpdiIsCUYzKDIsIDB4MGYsIDApLCBGMyh+MiwgfjB4MGYsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoteyAic2RpdiIsCUYzKDIsIDB4MGYsIDEpLCBGMyh+MiwgfjB4MGYsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCi17ICJzZGl2IiwJRjMoMiwgMHgwZiwgMSksIEYzKH4yLCB+MHgwZiwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKLXsgInNkaXZjYyIsCUYzKDIsIDB4MWYsIDApLCBGMyh+MiwgfjB4MWYsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoteyAic2RpdmNjIiwJRjMoMiwgMHgxZiwgMSksIEYzKH4yLCB+MHgxZiwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKLXsgInNkaXZjYyIsCUYzKDIsIDB4MWYsIDEpLCBGMyh+MiwgfjB4MWYsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCi17ICJ1ZGl2IiwJRjMoMiwgMHgwZSwgMCksIEYzKH4yLCB+MHgwZSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCi17ICJ1ZGl2IiwJRjMoMiwgMHgwZSwgMSksIEYzKH4yLCB+MHgwZSwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKLXsgInVkaXYiLAlGMygyLCAweDBlLCAxKSwgRjMofjIsIH4weDBlLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAoteyAidWRpdmNjIiwJRjMoMiwgMHgxZSwgMCksIEYzKH4yLCB+MHgxZSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCi17ICJ1ZGl2Y2MiLAlGMygyLCAweDFlLCAxKSwgRjMofjIsIH4weDFlLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoteyAidWRpdmNjIiwJRjMoMiwgMHgxZSwgMSksIEYzKH4yLCB+MHgxZSwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKLQoteyAibXVseCIsCUYzKDIsIDB4MDksIDApLCBGMyh+MiwgfjB4MDksIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAibXVseCIsCUYzKDIsIDB4MDksIDEpLCBGMyh+MiwgfjB4MDksIH4xKSwJCSIxLGksZCIsIDAsIHY5IH0sCi17ICJzZGl2eCIsCUYzKDIsIDB4MmQsIDApLCBGMyh+MiwgfjB4MmQsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAic2RpdngiLAlGMygyLCAweDJkLCAxKSwgRjMofjIsIH4weDJkLCB+MSksCQkiMSxpLGQiLCAwLCB2OSB9LAoteyAidWRpdngiLAlGMygyLCAweDBkLCAwKSwgRjMofjIsIH4weDBkLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgInVkaXZ4IiwJRjMoMiwgMHgwZCwgMSksIEYzKH4yLCB+MHgwZCwgfjEpLAkJIjEsaSxkIiwgMCwgdjkgfSwKLQoteyAiY2FsbCIsCUYxKDB4MSksIEYxKH4weDEpLCAiTCIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLXsgImNhbGwiLAlGMSgweDEpLCBGMSh+MHgxKSwgIkwsIyIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLQoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDApfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjApfFJEKH4weGYpfEFTSSh+MCksCSIxKzIiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxK3JzMiwlbzcgKi8KLXsgImNhbGwiLAlGMygyLCAweDM4LCAwKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4wKXxSRCh+MHhmKXxBU0kofjApLAkiMSsyLCMiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMCl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MCl8UkQofjB4Zil8QVNJX1JTMih+MCksCSIxIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMSslZzAsJW83ICovCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMCl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MCl8UkQofjB4Zil8QVNJX1JTMih+MCksCSIxLCMiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4ZiksCQkiMStpIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMStpLCVvNyAqLwoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjEpfFJEKH4weGYpLAkJIjEraSwjIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjEpfFJEKH4weGYpLAkJImkrMSIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCBpK3JzMSwlbzcgKi8KLXsgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKSwJCSJpKzEsIyIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLXsgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKXxSUzFfRzAsCSJpIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsICVnMCtpLCVvNyAqLwoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjEpfFJEKH4weGYpfFJTMV9HMCwJImksIyIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLXsgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKXxTSU1NMTMofjApLAkiMSIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErMCwlbzcgKi8KLXsgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKXxTSU1NMTMofjApLAkiMSwjIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAotCi0KLS8qIENvbmRpdGlvbmFsIGluc3RydWN0aW9ucy4KLQotICAgQmVjYXVzZSB0aGlzIHBhcnQgb2YgdGhlIHRhYmxlIHdhcyBzdWNoIGEgbWVzcyBlYXJsaWVyLCBJIGhhdmUKLSAgIG1hY3JvZmllZCBpdCBzbyB0aGF0IGFsbCB0aGUgYnJhbmNoZXMgYW5kIHRyYXBzIGFyZSBnZW5lcmF0ZWQgZnJvbQotICAgYSBzaW5nbGUtbGluZSBkZXNjcmlwdGlvbiBvZiBlYWNoIGNvbmRpdGlvbiB2YWx1ZS4gIEpvaG4gR2lsbW9yZS4gKi8KLQotLyogRGVmaW5lIGJyYW5jaGVzIC0tIG9uZSBhbm51bGxlZCwgb25lIHdpdGhvdXQsIGV0Yy4gKi8KLSNkZWZpbmUgYnIob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgXAotIHsgb3Bjb2RlLCAobWFzayl8QU5OVUwsIChsb3NlKSwgICAgICAgIixhIGwiLCAgIChmbGFncyksIHY2IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spICAgICAgLCAobG9zZSl8QU5OVUwsICJsIiwgICAgIChmbGFncyksIHY2IH0KLQotI2RlZmluZSBicngob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgLyogdjkgKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDIwKXxCUFJFRCwgQU5OVUx8KGxvc2UpLCAiWixHIiwgICAgICAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MjApfEJQUkVELCBBTk5VTHwobG9zZSksICIsVCBaLEciLCAgIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwyMCl8QlBSRUR8QU5OVUwsIChsb3NlKSwgIixhIFosRyIsICAgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDIwKXxCUFJFRHxBTk5VTCwgKGxvc2UpLCAiLGEsVCBaLEciLCAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MjApLCBBTk5VTHxCUFJFRHwobG9zZSksICIsTiBaLEciLCAgIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwyMCl8QU5OVUwsIEJQUkVEfChsb3NlKSwgIixhLE4gWixHIiwgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QlBSRUQsIEFOTlVMfChsb3NlKXwoMjw8MjApLCAieixHIiwgICAgICAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxCUFJFRCwgQU5OVUx8KGxvc2UpfCgyPDwyMCksICIsVCB6LEciLCAgIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEJQUkVEfEFOTlVMLCAobG9zZSl8KDI8PDIwKSwgIixhIHosRyIsICAgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QlBSRUR8QU5OVUwsIChsb3NlKXwoMjw8MjApLCAiLGEsVCB6LEciLCAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKSwgQU5OVUx8QlBSRUR8KGxvc2UpfCgyPDwyMCksICIsTiB6LEciLCAgIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEFOTlVMLCBCUFJFRHwobG9zZSl8KDI8PDIwKSwgIixhLE4geixHIiwgKGZsYWdzKSwgdjkgfQotCi0vKiBEZWZpbmUgZm91ciB0cmFwczogcmVnK3JlZywgcmVnICsgaW1tZWRpYXRlLCBpbW1lZGlhdGUgYWxvbmUsIHJlZyBhbG9uZS4gKi8KLSNkZWZpbmUgdHIob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDExKXxJTU1FRCwgKGxvc2UpfFJTMV9HMCwJIlosaSIsICAgKGZsYWdzKSwgdjkgfSwgLyogJWcwICsgaW1tICovIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwxMSl8SU1NRUQsIChsb3NlKSwJIlosMStpIiwgKGZsYWdzKSwgdjkgfSwgLyogcnMxICsgaW1tICovIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwxMSksIElNTUVEfChsb3NlKSwJIlosMSsyIiwgKGZsYWdzKSwgdjkgfSwgLyogcnMxICsgcnMyICovIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwxMSksIElNTUVEfChsb3NlKXxSUzJfRzAsCSJaLDEiLCAgIChmbGFncyksIHY5IH0sIC8qIHJzMSArICVnMCAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXxJTU1FRCwgKGxvc2UpfFJTMV9HMCwJInosaSIsICAgKGZsYWdzKXxGX0FMSUFTLCB2OSB9LCAvKiAlZzAgKyBpbW0gKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8SU1NRUQsIChsb3NlKSwJInosMStpIiwgKGZsYWdzKXxGX0FMSUFTLCB2OSB9LCAvKiByczEgKyBpbW0gKi8gXAotIHsgb3Bjb2RlLCAobWFzayksIElNTUVEfChsb3NlKSwJInosMSsyIiwgKGZsYWdzKXxGX0FMSUFTLCB2OSB9LCAvKiByczEgKyByczIgKi8gXAotIHsgb3Bjb2RlLCAobWFzayksIElNTUVEfChsb3NlKXxSUzJfRzAsCSJ6LDEiLCAgIChmbGFncyl8Rl9BTElBUywgdjkgfSwgLyogcnMxICsgJWcwICovIFwKLSB7IG9wY29kZSwgKG1hc2spfElNTUVELCAobG9zZSl8UlMxX0cwLAkJImkiLCAgICAgKGZsYWdzKSwgdjYgfSwgLyogJWcwICsgaW1tICovIFwKLSB7IG9wY29kZSwgKG1hc2spfElNTUVELCAobG9zZSksCQkiMStpIiwgICAoZmxhZ3MpLCB2NiB9LCAvKiByczEgKyBpbW0gKi8gXAotIHsgb3Bjb2RlLCAobWFzayksIElNTUVEfChsb3NlKSwJCSIxKzIiLCAgIChmbGFncyksIHY2IH0sIC8qIHJzMSArIHJzMiAqLyBcCi0geyBvcGNvZGUsIChtYXNrKSwgSU1NRUR8KGxvc2UpfFJTMl9HMCwJCSIxIiwgICAgIChmbGFncyksIHY2IH0gLyogcnMxICsgJWcwICovCi0KLS8qIHY5OiBXZSBtdXN0IHB1dCBgYnJ4JyBiZWZvcmUgYGJyJywgdG8gZW5zdXJlIHRoYXQgd2UgbmV2ZXIgbWF0Y2ggc29tZXRoaW5nCi0gICB2OTogYWdhaW5zdCBhbiBleHByZXNzaW9uIHVubGVzcyBpdCBpcyBhbiBleHByZXNzaW9uLiAgT3RoZXJ3aXNlLCB3ZSBlbmQKLSAgIHY5OiB1cCB3aXRoIHVuZGVmaW5lZCBzeW1ib2wgdGFibGVzIGVudHJpZXMsIGJlY2F1c2UgdGhleSBnZXQgYWRkZWQsIGJ1dAotICAgdjk6IGFyZSBub3QgZGVsZXRlZCBpZiB0aGUgcGF0dGVybiBmYWlscyB0byBtYXRjaC4gICovCi0KLS8qIERlZmluZSBib3RoIGJyYW5jaGVzIGFuZCB0cmFwcyBiYXNlZCBvbiBjb25kaXRpb24gbWFzayAqLwotI2RlZmluZSBjb25kKGJvcCwgdG9wLCBtYXNrLCBmbGFncykgXAotICBicngoYm9wLCBGMigwLCAxKXwobWFzayksIEYyKH4wLCB+MSl8KCh+bWFzaykmQ09ORCh+MCkpLCBGX0RFTEFZRUR8KGZsYWdzKSksIC8qIHY5ICovIFwKLSAgYnIoYm9wLCAgRjIoMCwgMil8KG1hc2spLCBGMih+MCwgfjIpfCgofm1hc2spJkNPTkQofjApKSwgRl9ERUxBWUVEfChmbGFncykpLCBcCi0gIHRyKHRvcCwgIEYzKDIsIDB4M2EsIDApfChtYXNrKSwgRjMofjIsIH4weDNhLCAwKXwoKH5tYXNrKSZDT05EKH4wKSksICgoZmxhZ3MpICYgfihGX1VOQlJ8Rl9DT05EQlIpKSkKLQotLyogRGVmaW5lIGFsbCB0aGUgY29uZGl0aW9ucywgYWxsIHRoZSBicmFuY2hlcywgYWxsIHRoZSB0cmFwcy4gICovCi0KLS8qIFN0YW5kYXJkIGJyYW5jaCwgdHJhcCBtbmVtb25pY3MgKi8KLWNvbmQgKCJiIiwJInRhIiwgICBDT05EQSwgRl9VTkJSKSwKLS8qIEFsdGVybmF0aXZlIGZvcm0gKGp1c3QgZm9yIGFzc2VtYmx5LCBub3QgZm9yIGRpc2Fzc2VtYmx5KSAqLwotY29uZCAoImJhIiwJInQiLCAgICBDT05EQSwgRl9VTkJSfEZfQUxJQVMpLAotCi1jb25kICgiYmNjIiwJInRjYyIsICBDT05EQ0MsIEZfQ09OREJSKSwKLWNvbmQgKCJiY3MiLAkidGNzIiwgIENPTkRDUywgRl9DT05EQlIpLAotY29uZCAoImJlIiwJInRlIiwgICBDT05ERSwgRl9DT05EQlIpLAotY29uZCAoImJlcSIsCSJ0ZXEiLCAgQ09OREUsIEZfQ09OREJSfEZfQUxJQVMpLAotY29uZCAoImJnIiwJInRnIiwgICBDT05ERywgRl9DT05EQlIpLAotY29uZCAoImJndCIsCSJ0Z3QiLCAgQ09OREcsIEZfQ09OREJSfEZfQUxJQVMpLAotY29uZCAoImJnZSIsCSJ0Z2UiLCAgQ09OREdFLCBGX0NPTkRCUiksCi1jb25kICgiYmdldSIsCSJ0Z2V1IiwgQ09OREdFVSwgRl9DT05EQlJ8Rl9BTElBUyksIC8qIGZvciBjYyAqLwotY29uZCAoImJndSIsCSJ0Z3UiLCAgQ09OREdVLCBGX0NPTkRCUiksCi1jb25kICgiYmwiLAkidGwiLCAgIENPTkRMLCBGX0NPTkRCUiksCi1jb25kICgiYmx0IiwJInRsdCIsICBDT05ETCwgRl9DT05EQlJ8Rl9BTElBUyksCi1jb25kICgiYmxlIiwJInRsZSIsICBDT05ETEUsIEZfQ09OREJSKSwKLWNvbmQgKCJibGV1IiwJInRsZXUiLCBDT05ETEVVLCBGX0NPTkRCUiksCi1jb25kICgiYmx1IiwJInRsdSIsICBDT05ETFUsIEZfQ09OREJSfEZfQUxJQVMpLCAvKiBmb3IgY3MgKi8KLWNvbmQgKCJibiIsCSJ0biIsICAgQ09ORE4sIEZfQ09OREJSKSwKLWNvbmQgKCJibmUiLAkidG5lIiwgIENPTkRORSwgRl9DT05EQlIpLAotY29uZCAoImJuZWciLAkidG5lZyIsIENPTkRORUcsIEZfQ09OREJSKSwKLWNvbmQgKCJibnoiLAkidG56IiwgIENPTkROWiwgRl9DT05EQlJ8Rl9BTElBUyksIC8qIGZvciBuZSAqLwotY29uZCAoImJwb3MiLAkidHBvcyIsIENPTkRQT1MsIEZfQ09OREJSKSwKLWNvbmQgKCJidmMiLAkidHZjIiwgIENPTkRWQywgRl9DT05EQlIpLAotY29uZCAoImJ2cyIsCSJ0dnMiLCAgQ09ORFZTLCBGX0NPTkRCUiksCi1jb25kICgiYnoiLAkidHoiLCAgIENPTkRaLCBGX0NPTkRCUnxGX0FMSUFTKSwgLyogZm9yIGUgKi8KLQotI3VuZGVmIGNvbmQKLSN1bmRlZiBicgotI3VuZGVmIGJyciAvKiB2OSAqLwotI3VuZGVmIHRyCi0KLSNkZWZpbmUgYnJyKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIC8qIHY5ICovIFwKLSB7IG9wY29kZSwgKG1hc2spfEJQUkVELCBBTk5VTHwobG9zZSksICIxLGsiLCAgICAgIEZfREVMQVlFRHwoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxCUFJFRCwgQU5OVUx8KGxvc2UpLCAiLFQgMSxrIiwgICBGX0RFTEFZRUR8KGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QlBSRUR8QU5OVUwsIChsb3NlKSwgIixhIDEsayIsICAgRl9ERUxBWUVEfChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEJQUkVEfEFOTlVMLCAobG9zZSksICIsYSxUIDEsayIsIEZfREVMQVlFRHwoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKSwgQU5OVUx8QlBSRUR8KGxvc2UpLCAiLE4gMSxrIiwgICBGX0RFTEFZRUR8KGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QU5OVUwsIEJQUkVEfChsb3NlKSwgIixhLE4gMSxrIiwgRl9ERUxBWUVEfChmbGFncyksIHY5IH0KLQotI2RlZmluZSBjb25kcihib3AsIG1hc2ssIGZsYWdzKSAvKiB2OSAqLyBcCi0gIGJycihib3AsIEYyKDAsIDMpfENPTkQobWFzayksIEYyKH4wLCB+Myl8Q09ORCh+KG1hc2spKSwgKGZsYWdzKSkgLyogdjkgKi8KLQotLyogdjkgKi8gY29uZHIoImJybnoiLCAweDUsIEZfQ09OREJSKSwKLS8qIHY5ICovIGNvbmRyKCJicnoiLCAweDEsIEZfQ09OREJSKSwKLS8qIHY5ICovIGNvbmRyKCJicmdleiIsIDB4NywgRl9DT05EQlIpLAotLyogdjkgKi8gY29uZHIoImJybHoiLCAweDMsIEZfQ09OREJSKSwKLS8qIHY5ICovIGNvbmRyKCJicmxleiIsIDB4MiwgRl9DT05EQlIpLAotLyogdjkgKi8gY29uZHIoImJyZ3oiLCAweDYsIEZfQ09OREJSKSwKLQotI3VuZGVmIGNvbmRyIC8qIHY5ICovCi0jdW5kZWYgYnJyIC8qIHY5ICovCi0KLSNkZWZpbmUgbW92cihvcGNvZGUsIG1hc2ssIGZsYWdzKSAvKiB2OSAqLyBcCi0geyBvcGNvZGUsIEYzKDIsIDB4MmYsIDApfFJDT05EKG1hc2spLCBGMyh+MiwgfjB4MmYsIH4wKXxSQ09ORCh+KG1hc2spKSwgIjEsMixkIiwgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGMygyLCAweDJmLCAxKXxSQ09ORChtYXNrKSwgRjMofjIsIH4weDJmLCB+MSl8UkNPTkQofihtYXNrKSksICIxLGosZCIsIChmbGFncyksIHY5IH0KLQotI2RlZmluZSBmbXJycyhvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSAvKiB2OSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKSwgKGxvc2UpLCAiMSxmLGciLCAoZmxhZ3MpIHwgRl9GTE9BVCwgdjkgfQotI2RlZmluZSBmbXJyZChvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSAvKiB2OSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKSwgKGxvc2UpLCAiMSxCLEgiLCAoZmxhZ3MpIHwgRl9GTE9BVCwgdjkgfQotI2RlZmluZSBmbXJycShvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSAvKiB2OSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKSwgKGxvc2UpLCAiMSxSLEoiLCAoZmxhZ3MpIHwgRl9GTE9BVCwgdjkgfQotCi0jZGVmaW5lIGZtb3Zycyhtb3AsIG1hc2ssIGZsYWdzKSAvKiB2OSAqLyBcCi0gIGZtcnJzKG1vcCwgRjMoMiwgMHgzNSwgMCl8T1BGX0xPVzUoNSl8UkNPTkQobWFzayksIEYzKH4yLCB+MHgzNSwgMCl8T1BGX0xPVzUofjUpfFJDT05EKH4obWFzaykpLCAoZmxhZ3MpKSAvKiB2OSAqLwotI2RlZmluZSBmbW92cmQobW9wLCBtYXNrLCBmbGFncykgLyogdjkgKi8gXAotICBmbXJyZChtb3AsIEYzKDIsIDB4MzUsIDApfE9QRl9MT1c1KDYpfFJDT05EKG1hc2spLCBGMyh+MiwgfjB4MzUsIDApfE9QRl9MT1c1KH42KXxSQ09ORCh+KG1hc2spKSwgKGZsYWdzKSkgLyogdjkgKi8KLSNkZWZpbmUgZm1vdnJxKG1vcCwgbWFzaywgZmxhZ3MpIC8qIHY5ICovIFwKLSAgZm1ycnEobW9wLCBGMygyLCAweDM1LCAwKXxPUEZfTE9XNSg3KXxSQ09ORChtYXNrKSwgRjMofjIsIH4weDM1LCAwKXxPUEZfTE9XNSh+Nyl8UkNPTkQofihtYXNrKSksIChmbGFncykpIC8qIHY5ICovCi0KLS8qIHY5ICovIG1vdnIoIm1vdnJuZSIsIDB4NSwgMCksCi0vKiB2OSAqLyBtb3ZyKCJtb3ZyZSIsIDB4MSwgMCksCi0vKiB2OSAqLyBtb3ZyKCJtb3ZyZ2V6IiwgMHg3LCAwKSwKLS8qIHY5ICovIG1vdnIoIm1vdnJseiIsIDB4MywgMCksCi0vKiB2OSAqLyBtb3ZyKCJtb3ZybGV6IiwgMHgyLCAwKSwKLS8qIHY5ICovIG1vdnIoIm1vdnJneiIsIDB4NiwgMCksCi0vKiB2OSAqLyBtb3ZyKCJtb3ZybnoiLCAweDUsIEZfQUxJQVMpLAotLyogdjkgKi8gbW92cigibW92cnoiLCAweDEsIEZfQUxJQVMpLAotCi0vKiB2OSAqLyBmbW92cnMoImZtb3Zyc25lIiwgMHg1LCAwKSwKLS8qIHY5ICovIGZtb3ZycygiZm1vdnJzZSIsIDB4MSwgMCksCi0vKiB2OSAqLyBmbW92cnMoImZtb3Zyc2dleiIsIDB4NywgMCksCi0vKiB2OSAqLyBmbW92cnMoImZtb3Zyc2x6IiwgMHgzLCAwKSwKLS8qIHY5ICovIGZtb3ZycygiZm1vdnJzbGV6IiwgMHgyLCAwKSwKLS8qIHY5ICovIGZtb3ZycygiZm1vdnJzZ3oiLCAweDYsIDApLAotLyogdjkgKi8gZm1vdnJzKCJmbW92cnNueiIsIDB4NSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92cnMoImZtb3Zyc3oiLCAweDEsIEZfQUxJQVMpLAotCi0vKiB2OSAqLyBmbW92cmQoImZtb3ZyZG5lIiwgMHg1LCAwKSwKLS8qIHY5ICovIGZtb3ZyZCgiZm1vdnJkZSIsIDB4MSwgMCksCi0vKiB2OSAqLyBmbW92cmQoImZtb3ZyZGdleiIsIDB4NywgMCksCi0vKiB2OSAqLyBmbW92cmQoImZtb3ZyZGx6IiwgMHgzLCAwKSwKLS8qIHY5ICovIGZtb3ZyZCgiZm1vdnJkbGV6IiwgMHgyLCAwKSwKLS8qIHY5ICovIGZtb3ZyZCgiZm1vdnJkZ3oiLCAweDYsIDApLAotLyogdjkgKi8gZm1vdnJkKCJmbW92cmRueiIsIDB4NSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92cmQoImZtb3ZyZHoiLCAweDEsIEZfQUxJQVMpLAotCi0vKiB2OSAqLyBmbW92cnEoImZtb3ZycW5lIiwgMHg1LCAwKSwKLS8qIHY5ICovIGZtb3ZycSgiZm1vdnJxZSIsIDB4MSwgMCksCi0vKiB2OSAqLyBmbW92cnEoImZtb3ZycWdleiIsIDB4NywgMCksCi0vKiB2OSAqLyBmbW92cnEoImZtb3ZycWx6IiwgMHgzLCAwKSwKLS8qIHY5ICovIGZtb3ZycSgiZm1vdnJxbGV6IiwgMHgyLCAwKSwKLS8qIHY5ICovIGZtb3ZycSgiZm1vdnJxZ3oiLCAweDYsIDApLAotLyogdjkgKi8gZm1vdnJxKCJmbW92cnFueiIsIDB4NSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92cnEoImZtb3ZycXoiLCAweDEsIEZfQUxJQVMpLAotCi0jdW5kZWYgbW92ciAvKiB2OSAqLwotI3VuZGVmIGZtb3ZyIC8qIHY5ICovCi0jdW5kZWYgZm1yciAvKiB2OSAqLwotCi0jZGVmaW5lIG1vdmljYyhvcGNvZGUsIGNvbmQsIGZsYWdzKSAvKiB2OSAqLyBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAwKXxNQ09ORChjb25kLDEpfElDQywgRjMofjIsIH4weDJjLCB+MCl8TUNPTkQofmNvbmQsfjEpfFhDQ3woMTw8MTEpLCAieiwyLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMSl8TUNPTkQoY29uZCwxKXxJQ0MsIEYzKH4yLCB+MHgyYywgfjEpfE1DT05EKH5jb25kLH4xKXxYQ0N8KDE8PDExKSwgInosSSxkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDApfE1DT05EKGNvbmQsMSl8WENDLCBGMyh+MiwgfjB4MmMsIH4wKXxNQ09ORCh+Y29uZCx+MSl8KDE8PDExKSwgICAgICJaLDIsZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAxKXxNQ09ORChjb25kLDEpfFhDQywgRjMofjIsIH4weDJjLCB+MSl8TUNPTkQofmNvbmQsfjEpfCgxPDwxMSksICAgICAiWixJLGQiLCBmbGFncywgdjkgfQotCi0jZGVmaW5lIG1vdmZjYyhvcGNvZGUsIGZjb25kLCBmbGFncykgLyogdjkgKi8gXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMCl8RkNDKDApfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+MCl8RjMofjIsIH4weDJjLCB+MCksICI2LDIsZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAxKXxGQ0MoMCl8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4wKXxGMyh+MiwgfjB4MmMsIH4xKSwgIjYsSSxkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDApfEZDQygxKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjEpfEYzKH4yLCB+MHgyYywgfjApLCAiNywyLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMSl8RkNDKDEpfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+MSl8RjMofjIsIH4weDJjLCB+MSksICI3LEksZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAwKXxGQ0MoMil8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4yKXxGMyh+MiwgfjB4MmMsIH4wKSwgIjgsMixkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDEpfEZDQygyKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjIpfEYzKH4yLCB+MHgyYywgfjEpLCAiOCxJLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMCl8RkNDKDMpfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+Myl8RjMofjIsIH4weDJjLCB+MCksICI5LDIsZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAxKXxGQ0MoMyl8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4zKXxGMyh+MiwgfjB4MmMsIH4xKSwgIjksSSxkIiwgZmxhZ3MsIHY5IH0KLQotI2RlZmluZSBtb3ZjYyhvcGNvZGUsIGNvbmQsIGZjb25kLCBmbGFncykgLyogdjkgKi8gXAotICBtb3ZmY2MgKG9wY29kZSwgZmNvbmQsIGZsYWdzKSwgLyogdjkgKi8gXAotICBtb3ZpY2MgKG9wY29kZSwgY29uZCwgZmxhZ3MpIC8qIHY5ICovCi0KLS8qIHY5ICovIG1vdmNjICAoIm1vdmEiLAlDT05EQSwgRkNPTkRBLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdmNjIiwJQ09ORENDLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdmdldSIsCUNPTkRHRVUsIEZfQUxJQVMpLAotLyogdjkgKi8gbW92aWNjICgibW92Y3MiLAlDT05EQ1MsIDApLAotLyogdjkgKi8gbW92aWNjICgibW92bHUiLAlDT05ETFUsIEZfQUxJQVMpLAotLyogdjkgKi8gbW92Y2MgICgibW92ZSIsCUNPTkRFLCBGQ09OREUsIDApLAotLyogdjkgKi8gbW92Y2MgICgibW92ZyIsCUNPTkRHLCBGQ09OREcsIDApLAotLyogdjkgKi8gbW92Y2MgICgibW92Z2UiLAlDT05ER0UsIEZDT05ER0UsIDApLAotLyogdjkgKi8gbW92aWNjICgibW92Z3UiLAlDT05ER1UsIDApLAotLyogdjkgKi8gbW92Y2MgICgibW92bCIsCUNPTkRMLCBGQ09OREwsIDApLAotLyogdjkgKi8gbW92Y2MgICgibW92bGUiLAlDT05ETEUsIEZDT05ETEUsIDApLAotLyogdjkgKi8gbW92aWNjICgibW92bGV1IiwJQ09ORExFVSwgMCksCi0vKiB2OSAqLyBtb3ZmY2MgKCJtb3ZsZyIsCUZDT05ETEcsIDApLAotLyogdjkgKi8gbW92Y2MgICgibW92biIsCUNPTkROLCBGQ09ORE4sIDApLAotLyogdjkgKi8gbW92Y2MgICgibW92bmUiLAlDT05ETkUsIEZDT05ETkUsIDApLAotLyogdjkgKi8gbW92aWNjICgibW92bmVnIiwJQ09ORE5FRywgMCksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZueiIsCUNPTkROWiwgRkNPTkROWiwgRl9BTElBUyksCi0vKiB2OSAqLyBtb3ZmY2MgKCJtb3ZvIiwJRkNPTkRPLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdnBvcyIsCUNPTkRQT1MsIDApLAotLyogdjkgKi8gbW92ZmNjICgibW92dSIsCUZDT05EVSwgMCksCi0vKiB2OSAqLyBtb3ZmY2MgKCJtb3Z1ZSIsCUZDT05EVUUsIDApLAotLyogdjkgKi8gbW92ZmNjICgibW92dWciLAlGQ09ORFVHLCAwKSwKLS8qIHY5ICovIG1vdmZjYyAoIm1vdnVnZSIsCUZDT05EVUdFLCAwKSwKLS8qIHY5ICovIG1vdmZjYyAoIm1vdnVsIiwJRkNPTkRVTCwgMCksCi0vKiB2OSAqLyBtb3ZmY2MgKCJtb3Z1bGUiLAlGQ09ORFVMRSwgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3Z2YyIsCUNPTkRWQywgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3Z2cyIsCUNPTkRWUywgMCksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3Z6IiwJQ09ORFosIEZDT05EWiwgRl9BTElBUyksCi0KLSN1bmRlZiBtb3ZpY2MgLyogdjkgKi8KLSN1bmRlZiBtb3ZmY2MgLyogdjkgKi8KLSN1bmRlZiBtb3ZjYyAvKiB2OSAqLwotCi0jZGVmaW5lIEZNX1NGIDEJCS8qIHY5IC0gdmFsdWVzIGZvciBmcHNpemUgKi8KLSNkZWZpbmUgRk1fREYgMgkJLyogdjkgKi8KLSNkZWZpbmUgRk1fUUYgMwkJLyogdjkgKi8KLQotI2RlZmluZSBmbW92aWNjKG9wY29kZSwgZnBzaXplLCBjb25kLCBmbGFncykgLyogdjkgKi8gXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDEwMCtmcHNpemUpfE1DT05EKGNvbmQsMCksICBGM0YofjIsIH4weDM1LCB+KDB4MTAwK2Zwc2l6ZSkpfE1DT05EKH5jb25kLH4wKSwgICJ6LGYsZyIsIGZsYWdzLCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MTgwK2Zwc2l6ZSl8TUNPTkQoY29uZCwwKSwgIEYzRih+MiwgfjB4MzUsIH4oMHgxODArZnBzaXplKSl8TUNPTkQofmNvbmQsfjApLCAgIlosZixnIiwgZmxhZ3MsIHY5IH0KLQotI2RlZmluZSBmbW92ZmNjKG9wY29kZSwgZnBzaXplLCBmY29uZCwgZmxhZ3MpIC8qIHY5ICovIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgwMDArZnBzaXplKXxNQ09ORChmY29uZCwwKSwgRjNGKH4yLCB+MHgzNSwgfigweDAwMCtmcHNpemUpKXxNQ09ORCh+ZmNvbmQsfjApLCAiNixmLGciLCBmbGFncywgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDA0MCtmcHNpemUpfE1DT05EKGZjb25kLDApLCBGM0YofjIsIH4weDM1LCB+KDB4MDQwK2Zwc2l6ZSkpfE1DT05EKH5mY29uZCx+MCksICI3LGYsZyIsIGZsYWdzLCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MDgwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwODArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjgsZixnIiwgZmxhZ3MsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgwYzArZnBzaXplKXxNQ09ORChmY29uZCwwKSwgRjNGKH4yLCB+MHgzNSwgfigweDBjMCtmcHNpemUpKXxNQ09ORCh+ZmNvbmQsfjApLCAiOSxmLGciLCBmbGFncywgdjkgfQotCi0vKiBGSVhNRTogdXNlIGZtb3ZpY2MvZm1vdmZjYz8gKi8gLyogdjkgKi8KLSNkZWZpbmUgZm1vdmNjKG9wY29kZSwgZnBzaXplLCBjb25kLCBmY29uZCwgZmxhZ3MpIC8qIHY5ICovIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgxMDArZnBzaXplKXxNQ09ORChjb25kLDApLCAgRjNGKH4yLCB+MHgzNSwgfigweDEwMCtmcHNpemUpKXxNQ09ORCh+Y29uZCx+MCksICAieixmLGciLCBmbGFncyB8IEZfRkxPQVQsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgwMDArZnBzaXplKXxNQ09ORChmY29uZCwwKSwgRjNGKH4yLCB+MHgzNSwgfigweDAwMCtmcHNpemUpKXxNQ09ORCh+ZmNvbmQsfjApLCAiNixmLGciLCBmbGFncyB8IEZfRkxPQVQsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgxODArZnBzaXplKXxNQ09ORChjb25kLDApLCAgRjNGKH4yLCB+MHgzNSwgfigweDE4MCtmcHNpemUpKXxNQ09ORCh+Y29uZCx+MCksICAiWixmLGciLCBmbGFncyB8IEZfRkxPQVQsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgwNDArZnBzaXplKXxNQ09ORChmY29uZCwwKSwgRjNGKH4yLCB+MHgzNSwgfigweDA0MCtmcHNpemUpKXxNQ09ORCh+ZmNvbmQsfjApLCAiNyxmLGciLCBmbGFncyB8IEZfRkxPQVQsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgwODArZnBzaXplKXxNQ09ORChmY29uZCwwKSwgRjNGKH4yLCB+MHgzNSwgfigweDA4MCtmcHNpemUpKXxNQ09ORCh+ZmNvbmQsfjApLCAiOCxmLGciLCBmbGFncyB8IEZfRkxPQVQsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgwYzArZnBzaXplKXxNQ09ORChmY29uZCwwKSwgRjNGKH4yLCB+MHgzNSwgfigweDBjMCtmcHNpemUpKXxNQ09ORCh+ZmNvbmQsfjApLCAiOSxmLGciLCBmbGFncyB8IEZfRkxPQVQsIHY5IH0KLQotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkYSIsCUZNX0RGLCBDT05EQSwgRkNPTkRBLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cWEiLAlGTV9RRiwgQ09OREEsIEZDT05EQSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNhIiwJRk1fU0YsIENPTkRBLCBGQ09OREEsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkY2MiLAlGTV9ERiwgQ09ORENDLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cWNjIiwJRk1fUUYsIENPTkRDQywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnNjYyIsCUZNX1NGLCBDT05EQ0MsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkY3MiLAlGTV9ERiwgQ09ORENTLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cWNzIiwJRk1fUUYsIENPTkRDUywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnNjcyIsCUZNX1NGLCBDT05EQ1MsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkZSIsCUZNX0RGLCBDT05ERSwgRkNPTkRFLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cWUiLAlGTV9RRiwgQ09OREUsIEZDT05ERSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNlIiwJRk1fU0YsIENPTkRFLCBGQ09OREUsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkZyIsCUZNX0RGLCBDT05ERywgRkNPTkRHLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cWciLAlGTV9RRiwgQ09OREcsIEZDT05ERywgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNnIiwJRk1fU0YsIENPTkRHLCBGQ09OREcsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkZ2UiLAlGTV9ERiwgQ09OREdFLCBGQ09OREdFLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cWdlIiwJRk1fUUYsIENPTkRHRSwgRkNPTkRHRSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNnZSIsCUZNX1NGLCBDT05ER0UsIEZDT05ER0UsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkZ2V1IiwJRk1fREYsIENPTkRHRVUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxZ2V1IiwJRk1fUUYsIENPTkRHRVUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzZ2V1IiwJRk1fU0YsIENPTkRHRVUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkZ3UiLAlGTV9ERiwgQ09OREdVLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cWd1IiwJRk1fUUYsIENPTkRHVSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnNndSIsCUZNX1NGLCBDT05ER1UsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkbCIsCUZNX0RGLCBDT05ETCwgRkNPTkRMLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cWwiLAlGTV9RRiwgQ09OREwsIEZDT05ETCwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNsIiwJRk1fU0YsIENPTkRMLCBGQ09OREwsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkbGUiLAlGTV9ERiwgQ09ORExFLCBGQ09ORExFLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cWxlIiwJRk1fUUYsIENPTkRMRSwgRkNPTkRMRSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNsZSIsCUZNX1NGLCBDT05ETEUsIEZDT05ETEUsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkbGV1IiwJRk1fREYsIENPTkRMRVUsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxbGV1IiwJRk1fUUYsIENPTkRMRVUsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzbGV1IiwJRk1fU0YsIENPTkRMRVUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZkbGciLAlGTV9ERiwgRkNPTkRMRywgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnFsZyIsCUZNX1FGLCBGQ09ORExHLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c2xnIiwJRk1fU0YsIEZDT05ETEcsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkbHUiLAlGTV9ERiwgQ09ORExVLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cWx1IiwJRk1fUUYsIENPTkRMVSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnNsdSIsCUZNX1NGLCBDT05ETFUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkbiIsCUZNX0RGLCBDT05ETiwgRkNPTkROLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cW4iLAlGTV9RRiwgQ09ORE4sIEZDT05ETiwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNuIiwJRk1fU0YsIENPTkROLCBGQ09ORE4sIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkbmUiLAlGTV9ERiwgQ09ORE5FLCBGQ09ORE5FLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cW5lIiwJRk1fUUYsIENPTkRORSwgRkNPTkRORSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNuZSIsCUZNX1NGLCBDT05ETkUsIEZDT05ETkUsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkbmVnIiwJRk1fREYsIENPTkRORUcsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxbmVnIiwJRk1fUUYsIENPTkRORUcsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzbmVnIiwJRk1fU0YsIENPTkRORUcsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkbnoiLAlGTV9ERiwgQ09ORE5aLCBGQ09ORE5aLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cW56IiwJRk1fUUYsIENPTkROWiwgRkNPTkROWiwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnNueiIsCUZNX1NGLCBDT05ETlosIEZDT05ETlosIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZkbyIsCUZNX0RGLCBGQ09ORE8sIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxbyIsCUZNX1FGLCBGQ09ORE8sIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzbyIsCUZNX1NGLCBGQ09ORE8sIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkcG9zIiwJRk1fREYsIENPTkRQT1MsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxcG9zIiwJRk1fUUYsIENPTkRQT1MsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzcG9zIiwJRk1fU0YsIENPTkRQT1MsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZkdSIsCUZNX0RGLCBGQ09ORFUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxdSIsCUZNX1FGLCBGQ09ORFUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzdSIsCUZNX1NGLCBGQ09ORFUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZkdWUiLAlGTV9ERiwgRkNPTkRVRSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnF1ZSIsCUZNX1FGLCBGQ09ORFVFLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c3VlIiwJRk1fU0YsIEZDT05EVUUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZkdWciLAlGTV9ERiwgRkNPTkRVRywgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnF1ZyIsCUZNX1FGLCBGQ09ORFVHLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c3VnIiwJRk1fU0YsIEZDT05EVUcsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZkdWdlIiwJRk1fREYsIEZDT05EVUdFLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cXVnZSIsCUZNX1FGLCBGQ09ORFVHRSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnN1Z2UiLAlGTV9TRiwgRkNPTkRVR0UsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZkdWwiLAlGTV9ERiwgRkNPTkRVTCwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnF1bCIsCUZNX1FGLCBGQ09ORFVMLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c3VsIiwJRk1fU0YsIEZDT05EVUwsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZkdWxlIiwJRk1fREYsIEZDT05EVUxFLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cXVsZSIsCUZNX1FGLCBGQ09ORFVMRSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnN1bGUiLAlGTV9TRiwgRkNPTkRVTEUsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkdmMiLAlGTV9ERiwgQ09ORFZDLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cXZjIiwJRk1fUUYsIENPTkRWQywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnN2YyIsCUZNX1NGLCBDT05EVkMsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZkdnMiLAlGTV9ERiwgQ09ORFZTLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cXZzIiwJRk1fUUYsIENPTkRWUywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnN2cyIsCUZNX1NGLCBDT05EVlMsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZkeiIsCUZNX0RGLCBDT05EWiwgRkNPTkRaLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92cXoiLAlGTV9RRiwgQ09ORFosIEZDT05EWiwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnN6IiwJRk1fU0YsIENPTkRaLCBGQ09ORFosIEZfQUxJQVMpLAotCi0jdW5kZWYgZm1vdmljYyAvKiB2OSAqLwotI3VuZGVmIGZtb3ZmY2MgLyogdjkgKi8KLSN1bmRlZiBmbW92Y2MgLyogdjkgKi8KLSN1bmRlZiBGTV9ERiAvKiB2OSAqLwotI3VuZGVmIEZNX1FGIC8qIHY5ICovCi0jdW5kZWYgRk1fU0YgLyogdjkgKi8KLQotLyogQ29wcm9jZXNzb3IgYnJhbmNoZXMuICAqLwotI2RlZmluZSBDQlIob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncywgYXJjaCkgXAotIHsgb3Bjb2RlLCAobWFzayksIEFOTlVMfChsb3NlKSwgImwiLCAgICBmbGFnc3xGX0RFTEFZRUQsIGFyY2ggfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QU5OVUwsIChsb3NlKSwgIixhIGwiLCBmbGFnc3xGX0RFTEFZRUQsIGFyY2ggfQotCi0vKiBGbG9hdGluZyBwb2ludCBicmFuY2hlcy4gICovCi0jZGVmaW5lIEZCUihvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSBcCi0geyBvcGNvZGUsIChtYXNrKSwgQU5OVUx8KGxvc2UpLCAibCIsICAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjYgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QU5OVUwsIChsb3NlKSwgIixhIGwiLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY2IH0KLQotLyogVjkgZXh0ZW5kZWQgZmxvYXRpbmcgcG9pbnQgYnJhbmNoZXMuICAqLwotI2RlZmluZSBGQlJYKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIC8qIHY5ICovIFwKLSB7IG9wY29kZSwgRkJGQ0MoMCl8KG1hc2spfEJQUkVELCBBTk5VTHxGQkZDQyh+MCl8KGxvc2UpLCAiNixHIiwgICAgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMCl8KG1hc2spfEJQUkVELCBBTk5VTHxGQkZDQyh+MCl8KGxvc2UpLCAiLFQgNixHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMCl8KG1hc2spfEJQUkVEfEFOTlVMLCBGQkZDQyh+MCl8KGxvc2UpLCAiLGEgNixHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMCl8KG1hc2spfEJQUkVEfEFOTlVMLCBGQkZDQyh+MCl8KGxvc2UpLCAiLGEsVCA2LEciLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMCl8KG1hc2spLCBBTk5VTHxCUFJFRHxGQkZDQyh+MCl8KGxvc2UpLCAiLE4gNixHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMCl8KG1hc2spfEFOTlVMLCBCUFJFRHxGQkZDQyh+MCl8KGxvc2UpLCAiLGEsTiA2LEciLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMSl8KG1hc2spfEJQUkVELCBBTk5VTHxGQkZDQyh+MSl8KGxvc2UpLCAiNyxHIiwgICAgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMSl8KG1hc2spfEJQUkVELCBBTk5VTHxGQkZDQyh+MSl8KGxvc2UpLCAiLFQgNyxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMSl8KG1hc2spfEJQUkVEfEFOTlVMLCBGQkZDQyh+MSl8KGxvc2UpLCAiLGEgNyxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMSl8KG1hc2spfEJQUkVEfEFOTlVMLCBGQkZDQyh+MSl8KGxvc2UpLCAiLGEsVCA3LEciLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMSl8KG1hc2spLCBBTk5VTHxCUFJFRHxGQkZDQyh+MSl8KGxvc2UpLCAiLE4gNyxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMSl8KG1hc2spfEFOTlVMLCBCUFJFRHxGQkZDQyh+MSl8KGxvc2UpLCAiLGEsTiA3LEciLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMil8KG1hc2spfEJQUkVELCBBTk5VTHxGQkZDQyh+Mil8KGxvc2UpLCAiOCxHIiwgICAgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMil8KG1hc2spfEJQUkVELCBBTk5VTHxGQkZDQyh+Mil8KGxvc2UpLCAiLFQgOCxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMil8KG1hc2spfEJQUkVEfEFOTlVMLCBGQkZDQyh+Mil8KGxvc2UpLCAiLGEgOCxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMil8KG1hc2spfEJQUkVEfEFOTlVMLCBGQkZDQyh+Mil8KGxvc2UpLCAiLGEsVCA4LEciLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMil8KG1hc2spLCBBTk5VTHxCUFJFRHxGQkZDQyh+Mil8KGxvc2UpLCAiLE4gOCxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMil8KG1hc2spfEFOTlVMLCBCUFJFRHxGQkZDQyh+Mil8KGxvc2UpLCAiLGEsTiA4LEciLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMyl8KG1hc2spfEJQUkVELCBBTk5VTHxGQkZDQyh+Myl8KGxvc2UpLCAiOSxHIiwgICAgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMyl8KG1hc2spfEJQUkVELCBBTk5VTHxGQkZDQyh+Myl8KGxvc2UpLCAiLFQgOSxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMyl8KG1hc2spfEJQUkVEfEFOTlVMLCBGQkZDQyh+Myl8KGxvc2UpLCAiLGEgOSxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMyl8KG1hc2spfEJQUkVEfEFOTlVMLCBGQkZDQyh+Myl8KGxvc2UpLCAiLGEsVCA5LEciLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMyl8KG1hc2spLCBBTk5VTHxCUFJFRHxGQkZDQyh+Myl8KGxvc2UpLCAiLE4gOSxHIiwgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0sIFwKLSB7IG9wY29kZSwgRkJGQ0MoMyl8KG1hc2spfEFOTlVMLCBCUFJFRHxGQkZDQyh+Myl8KGxvc2UpLCAiLGEsTiA5LEciLCBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY5IH0KLQotLyogdjk6IFdlIG11c3QgcHV0IGBGQlJYJyBiZWZvcmUgYEZCUicsIHRvIGVuc3VyZSB0aGF0IHdlIG5ldmVyIG1hdGNoCi0gICB2OTogc29tZXRoaW5nIGFnYWluc3QgYW4gZXhwcmVzc2lvbiB1bmxlc3MgaXQgaXMgYW4gZXhwcmVzc2lvbi4gIE90aGVyd2lzZSwKLSAgIHY5OiB3ZSBlbmQgdXAgd2l0aCB1bmRlZmluZWQgc3ltYm9sIHRhYmxlcyBlbnRyaWVzLCBiZWNhdXNlIHRoZXkgZ2V0IGFkZGVkLAotICAgdjk6IGJ1dCBhcmUgbm90IGRlbGV0ZWQgaWYgdGhlIHBhdHRlcm4gZmFpbHMgdG8gbWF0Y2guICAqLwotCi0jZGVmaW5lIENPTkRGQyhmb3AsIGNvcCwgbWFzaywgZmxhZ3MpIFwKLSAgRkJSWChmb3AsIEYyKDAsIDUpfENPTkQobWFzayksIEYyKH4wLCB+NSl8Q09ORCh+KG1hc2spKSwgZmxhZ3MpLCAvKiB2OSAqLyBcCi0gIEZCUihmb3AsIEYyKDAsIDYpfENPTkQobWFzayksIEYyKH4wLCB+Nil8Q09ORCh+KG1hc2spKSwgZmxhZ3MpLCBcCi0gIENCUihjb3AsIEYyKDAsIDcpfENPTkQobWFzayksIEYyKH4wLCB+Nyl8Q09ORCh+KG1hc2spKSwgZmxhZ3MsIHY2bm90bGV0KQotCi0jZGVmaW5lIENPTkRGQ0woZm9wLCBjb3AsIG1hc2ssIGZsYWdzKSBcCi0gIEZCUlgoZm9wLCBGMigwLCA1KXxDT05EKG1hc2spLCBGMih+MCwgfjUpfENPTkQofihtYXNrKSksIGZsYWdzKSwgLyogdjkgKi8gXAotICBGQlIoZm9wLCBGMigwLCA2KXxDT05EKG1hc2spLCBGMih+MCwgfjYpfENPTkQofihtYXNrKSksIGZsYWdzKSwgXAotICBDQlIoY29wLCBGMigwLCA3KXxDT05EKG1hc2spLCBGMih+MCwgfjcpfENPTkQofihtYXNrKSksIGZsYWdzLCB2NikKLQotI2RlZmluZSBDT05ERihmb3AsIG1hc2ssIGZsYWdzKSBcCi0gIEZCUlgoZm9wLCBGMigwLCA1KXxDT05EKG1hc2spLCBGMih+MCwgfjUpfENPTkQofihtYXNrKSksIGZsYWdzKSwgLyogdjkgKi8gXAotICBGQlIoZm9wLCBGMigwLCA2KXxDT05EKG1hc2spLCBGMih+MCwgfjYpfENPTkQofihtYXNrKSksIGZsYWdzKQotCi1DT05ERkMgICgiZmIiLCAgICAiY2IiLCAgICAweDgsIDApLAotQ09OREZDTCAoImZiYSIsCSAgImNiYSIsICAgMHg4LCBGX0FMSUFTKSwKLUNPTkRGQyAgKCJmYmUiLAkgICJjYjAiLCAgIDB4OSwgMCksCi1DT05ERiAgICgiZmJ6IiwgICAgICAgICAgICAweDksIEZfQUxJQVMpLAotQ09OREZDICAoImZiZyIsCSAgImNiMiIsICAgMHg2LCAwKSwKLUNPTkRGQyAgKCJmYmdlIiwgICJjYjAyIiwgIDB4YiwgMCksCi1DT05ERkMgICgiZmJsIiwJICAiY2IxIiwgICAweDQsIDApLAotQ09OREZDICAoImZibGUiLCAgImNiMDEiLCAgMHhkLCAwKSwKLUNPTkRGQyAgKCJmYmxnIiwgICJjYjEyIiwgIDB4MiwgMCksCi1DT05ERkNMICgiZmJuIiwJICAiY2JuIiwgICAweDAsIDApLAotQ09OREZDICAoImZibmUiLCAgImNiMTIzIiwgMHgxLCAwKSwKLUNPTkRGICAgKCJmYm56IiwgICAgICAgICAgIDB4MSwgRl9BTElBUyksCi1DT05ERkMgICgiZmJvIiwJICAiY2IwMTIiLCAweGYsIDApLAotQ09OREZDICAoImZidSIsCSAgImNiMyIsICAgMHg3LCAwKSwKLUNPTkRGQyAgKCJmYnVlIiwgICJjYjAzIiwgIDB4YSwgMCksCi1DT05ERkMgICgiZmJ1ZyIsICAiY2IyMyIsICAweDUsIDApLAotQ09OREZDICAoImZidWdlIiwgImNiMDIzIiwgMHhjLCAwKSwKLUNPTkRGQyAgKCJmYnVsIiwgICJjYjEzIiwgIDB4MywgMCksCi1DT05ERkMgICgiZmJ1bGUiLCAiY2IwMTMiLCAweGUsIDApLAotCi0jdW5kZWYgQ09OREZDCi0jdW5kZWYgQ09OREZDTAotI3VuZGVmIENPTkRGCi0jdW5kZWYgQ0JSCi0jdW5kZWYgRkJSCi0jdW5kZWYgRkJSWAkvKiB2OSAqLwotCi17ICJqbXAiLAlGMygyLCAweDM4LCAwKSwgRjMofjIsIH4weDM4LCB+MCl8UkRfRzB8QVNJKH4wKSwJIjErMiIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxK3JzMiwlZzAgKi8KLXsgImptcCIsCUYzKDIsIDB4MzgsIDApLCBGMyh+MiwgfjB4MzgsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMSslZzAsJWcwICovCi17ICJqbXAiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSl8UkRfRzAsCQkiMStpIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczEraSwlZzAgKi8KLXsgImptcCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRF9HMCwJCSJpKzEiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIGkrcnMxLCVnMCAqLwoteyAiam1wIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpfFJEX0cwfFJTMV9HMCwJCSJpIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCAlZzAraSwlZzAgKi8KLXsgImptcCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiMSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxKzAsJWcwICovCi0KLXsgIm5vcCIsCUYyKDAsIDQpLCAweGZlZmZmZmZmLCAiIiwgMCwgdjYgfSwgLyogc2V0aGkgMCwgJWcwICovCi0KLXsgInNldCIsCUYyKDB4MCwgMHg0KSwgRjIofjB4MCwgfjB4NCksICJTaCxkIiwgRl9BTElBUywgdjYgfSwKLXsgInNldHV3IiwJRjIoMHgwLCAweDQpLCBGMih+MHgwLCB+MHg0KSwgIlNoLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAic2V0c3ciLAlGMigweDAsIDB4NCksIEYyKH4weDAsIH4weDQpLCAiU2gsZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJzZXR4IiwJRjIoMHgwLCAweDQpLCBGMih+MHgwLCB+MHg0KSwgIlMwLDEsZCIsIEZfQUxJQVMsIHY5IH0sCi0KLXsgInNldGhpIiwJRjIoMHgwLCAweDQpLCBGMih+MHgwLCB+MHg0KSwgImgsZCIsIDAsIHY2IH0sCi0KLXsgInRhZGRjYyIsCUYzKDIsIDB4MjAsIDApLCBGMyh+MiwgfjB4MjAsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAidGFkZGNjIiwJRjMoMiwgMHgyMCwgMSksIEYzKH4yLCB+MHgyMCwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInRhZGRjYyIsCUYzKDIsIDB4MjAsIDEpLCBGMyh+MiwgfjB4MjAsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi17ICJ0YWRkY2N0diIsCUYzKDIsIDB4MjIsIDApLCBGMyh+MiwgfjB4MjIsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAidGFkZGNjdHYiLAlGMygyLCAweDIyLCAxKSwgRjMofjIsIH4weDIyLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAidGFkZGNjdHYiLAlGMygyLCAweDIyLCAxKSwgRjMofjIsIH4weDIyLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAotCi17ICJ0c3ViY2MiLAlGMygyLCAweDIxLCAwKSwgRjMofjIsIH4weDIxLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInRzdWJjYyIsCUYzKDIsIDB4MjEsIDEpLCBGMyh+MiwgfjB4MjEsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJ0c3ViY2N0diIsCUYzKDIsIDB4MjMsIDApLCBGMyh+MiwgfjB4MjMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAidHN1YmNjdHYiLAlGMygyLCAweDIzLCAxKSwgRjMofjIsIH4weDIzLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAotCi17ICJ1bmltcCIsCUYyKDB4MCwgMHgwKSwgMHhmZmMwMDAwMCwgIm4iLCAwLCB2Nm5vdHY5IH0sCi17ICJpbGx0cmFwIiwJRjIoMCwgMCksIEYyKH4wLCB+MCl8UkRfRzAsICJuIiwgMCwgdjkgfSwKLQotLyogVGhpcyAqaXMqIGEgY29tbXV0YXRpdmUgaW5zdHJ1Y3Rpb24uICAqLwoteyAieG5vciIsCUYzKDIsIDB4MDcsIDApLCBGMyh+MiwgfjB4MDcsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAieG5vciIsCUYzKDIsIDB4MDcsIDEpLCBGMyh+MiwgfjB4MDcsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJ4bm9yIiwJRjMoMiwgMHgwNywgMSksIEYzKH4yLCB+MHgwNywgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLS8qIFRoaXMgKmlzKiBhIGNvbW11dGF0aXZlIGluc3RydWN0aW9uLiAgKi8KLXsgInhub3JjYyIsCUYzKDIsIDB4MTcsIDApLCBGMyh+MiwgfjB4MTcsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAieG5vcmNjIiwJRjMoMiwgMHgxNywgMSksIEYzKH4yLCB+MHgxNywgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInhub3JjYyIsCUYzKDIsIDB4MTcsIDEpLCBGMyh+MiwgfjB4MTcsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi17ICJ4b3IiLAlGMygyLCAweDAzLCAwKSwgRjMofjIsIH4weDAzLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInhvciIsCUYzKDIsIDB4MDMsIDEpLCBGMyh+MiwgfjB4MDMsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJ4b3IiLAlGMygyLCAweDAzLCAxKSwgRjMofjIsIH4weDAzLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAoteyAieG9yY2MiLAlGMygyLCAweDEzLCAwKSwgRjMofjIsIH4weDEzLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInhvcmNjIiwJRjMoMiwgMHgxMywgMSksIEYzKH4yLCB+MHgxMywgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInhvcmNjIiwJRjMoMiwgMHgxMywgMSksIEYzKH4yLCB+MHgxMywgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLQoteyAibm90IiwJRjMoMiwgMHgwNywgMCksIEYzKH4yLCB+MHgwNywgfjApfEFTSSh+MCksICIxLGQiLCBGX0FMSUFTLCB2NiB9LCAvKiB4bm9yIHJzMSwlMCxyZCAqLwoteyAibm90IiwJRjMoMiwgMHgwNywgMCksIEYzKH4yLCB+MHgwNywgfjApfEFTSSh+MCksICJyIiwgRl9BTElBUywgdjYgfSwgLyogeG5vciByZCwlMCxyZCAqLwotCi17ICJidG9nIiwJRjMoMiwgMHgwMywgMCksIEYzKH4yLCB+MHgwMywgfjApfEFTSSh+MCksCSIyLHIiLCBGX0FMSUFTLCB2NiB9LCAvKiB4b3IgcmQscnMyLHJkICovCi17ICJidG9nIiwJRjMoMiwgMHgwMywgMSksIEYzKH4yLCB+MHgwMywgfjEpLAkJImksciIsIEZfQUxJQVMsIHY2IH0sIC8qIHhvciByZCxpLHJkICovCi0KLS8qIEZQb3AxIGFuZCBGUG9wMiBhcmUgbm90IGluc3RydWN0aW9ucy4gIERvbid0IGFjY2VwdCB0aGVtLiAgKi8KLQoteyAiZmR0b2kiLAlGM0YoMiwgMHgzNCwgMHgwZDIpLCBGM0YofjIsIH4weDM0LCB+MHgwZDIpfFJTMV9HMCwgIkIsZyIsIEZfRkxPQVQsIHY2IH0sCi17ICJmc3RvaSIsCUYzRigyLCAweDM0LCAweDBkMSksIEYzRih+MiwgfjB4MzQsIH4weDBkMSl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZxdG9pIiwJRjNGKDIsIDB4MzQsIDB4MGQzKSwgRjNGKH4yLCB+MHgzNCwgfjB4MGQzKXxSUzFfRzAsICJSLGciLCBGX0ZMT0FULCB2OCB9LAotCi17ICJmZHRveCIsCUYzRigyLCAweDM0LCAweDA4MiksIEYzRih+MiwgfjB4MzQsIH4weDA4Mil8UlMxX0cwLCAiQixnIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZzdG94IiwJRjNGKDIsIDB4MzQsIDB4MDgxKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDgxKXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2OSB9LAoteyAiZnF0b3giLAlGM0YoMiwgMHgzNCwgMHgwODMpLCBGM0YofjIsIH4weDM0LCB+MHgwODMpfFJTMV9HMCwgIlIsZyIsIEZfRkxPQVQsIHY5IH0sCi0KLXsgImZpdG9kIiwJRjNGKDIsIDB4MzQsIDB4MGM4KSwgRjNGKH4yLCB+MHgzNCwgfjB4MGM4KXxSUzFfRzAsICJmLEgiLCBGX0ZMT0FULCB2NiB9LAoteyAiZml0b3MiLAlGM0YoMiwgMHgzNCwgMHgwYzQpLCBGM0YofjIsIH4weDM0LCB+MHgwYzQpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY2IH0sCi17ICJmaXRvcSIsCUYzRigyLCAweDM0LCAweDBjYyksIEYzRih+MiwgfjB4MzQsIH4weDBjYyl8UlMxX0cwLCAiZixKIiwgRl9GTE9BVCwgdjggfSwKLQoteyAiZnh0b2QiLAlGM0YoMiwgMHgzNCwgMHgwODgpLCBGM0YofjIsIH4weDM0LCB+MHgwODgpfFJTMV9HMCwgImYsSCIsIEZfRkxPQVQsIHY5IH0sCi17ICJmeHRvcyIsCUYzRigyLCAweDM0LCAweDA4NCksIEYzRih+MiwgfjB4MzQsIH4weDA4NCl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZ4dG9xIiwJRjNGKDIsIDB4MzQsIDB4MDhjKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDhjKXxSUzFfRzAsICJmLEoiLCBGX0ZMT0FULCB2OSB9LAotCi17ICJmZHRvcSIsCUYzRigyLCAweDM0LCAweDBjZSksIEYzRih+MiwgfjB4MzQsIH4weDBjZSl8UlMxX0cwLCAiQixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZkdG9zIiwJRjNGKDIsIDB4MzQsIDB4MGM2KSwgRjNGKH4yLCB+MHgzNCwgfjB4MGM2KXxSUzFfRzAsICJCLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZnF0b2QiLAlGM0YoMiwgMHgzNCwgMHgwY2IpLCBGM0YofjIsIH4weDM0LCB+MHgwY2IpfFJTMV9HMCwgIlIsSCIsIEZfRkxPQVQsIHY4IH0sCi17ICJmcXRvcyIsCUYzRigyLCAweDM0LCAweDBjNyksIEYzRih+MiwgfjB4MzQsIH4weDBjNyl8UlMxX0cwLCAiUixnIiwgRl9GTE9BVCwgdjggfSwKLXsgImZzdG9kIiwJRjNGKDIsIDB4MzQsIDB4MGM5KSwgRjNGKH4yLCB+MHgzNCwgfjB4MGM5KXxSUzFfRzAsICJmLEgiLCBGX0ZMT0FULCB2NiB9LAoteyAiZnN0b3EiLAlGM0YoMiwgMHgzNCwgMHgwY2QpLCBGM0YofjIsIH4weDM0LCB+MHgwY2QpfFJTMV9HMCwgImYsSiIsIEZfRkxPQVQsIHY4IH0sCi0KLXsgImZkaXZkIiwJRjNGKDIsIDB4MzQsIDB4MDRlKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDRlKSwgInYsQixIIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZkaXZxIiwJRjNGKDIsIDB4MzQsIDB4MDRmKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDRmKSwgIlYsUixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZkaXZzIiwJRjNGKDIsIDB4MzQsIDB4MDRkKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDRkKSwgImUsZixnIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZtdWxkIiwJRjNGKDIsIDB4MzQsIDB4MDRhKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDRhKSwgInYsQixIIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZtdWxxIiwJRjNGKDIsIDB4MzQsIDB4MDRiKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDRiKSwgIlYsUixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZtdWxzIiwJRjNGKDIsIDB4MzQsIDB4MDQ5KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQ5KSwgImUsZixnIiwgRl9GTE9BVCwgdjYgfSwKLQoteyAiZmRtdWxxIiwJRjNGKDIsIDB4MzQsIDB4MDZlKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDZlKSwgInYsQixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZzbXVsZCIsCUYzRigyLCAweDM0LCAweDA2OSksIEYzRih+MiwgfjB4MzQsIH4weDA2OSksICJlLGYsSCIsIEZfRkxPQVQsIHY4IH0sCi0KLXsgImZzcXJ0ZCIsCUYzRigyLCAweDM0LCAweDAyYSksIEYzRih+MiwgfjB4MzQsIH4weDAyYSl8UlMxX0cwLCAiQixIIiwgRl9GTE9BVCwgdjcgfSwKLXsgImZzcXJ0cSIsCUYzRigyLCAweDM0LCAweDAyYiksIEYzRih+MiwgfjB4MzQsIH4weDAyYil8UlMxX0cwLCAiUixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZzcXJ0cyIsCUYzRigyLCAweDM0LCAweDAyOSksIEYzRih+MiwgfjB4MzQsIH4weDAyOSl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjcgfSwKLQoteyAiZmFic2QiLAlGM0YoMiwgMHgzNCwgMHgwMGEpLCBGM0YofjIsIH4weDM0LCB+MHgwMGEpfFJTMV9HMCwgIkIsSCIsIEZfRkxPQVQsIHY5IH0sCi17ICJmYWJzcSIsCUYzRigyLCAweDM0LCAweDAwYiksIEYzRih+MiwgfjB4MzQsIH4weDAwYil8UlMxX0cwLCAiUixKIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZhYnNzIiwJRjNGKDIsIDB4MzQsIDB4MDA5KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDA5KXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZm1vdmQiLAlGM0YoMiwgMHgzNCwgMHgwMDIpLCBGM0YofjIsIH4weDM0LCB+MHgwMDIpfFJTMV9HMCwgIkIsSCIsIEZfRkxPQVQsIHY5IH0sCi17ICJmbW92cSIsCUYzRigyLCAweDM0LCAweDAwMyksIEYzRih+MiwgfjB4MzQsIH4weDAwMyl8UlMxX0cwLCAiUixKIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZtb3ZzIiwJRjNGKDIsIDB4MzQsIDB4MDAxKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDAxKXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZm5lZ2QiLAlGM0YoMiwgMHgzNCwgMHgwMDYpLCBGM0YofjIsIH4weDM0LCB+MHgwMDYpfFJTMV9HMCwgIkIsSCIsIEZfRkxPQVQsIHY5IH0sCi17ICJmbmVncSIsCUYzRigyLCAweDM0LCAweDAwNyksIEYzRih+MiwgfjB4MzQsIH4weDAwNyl8UlMxX0cwLCAiUixKIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZuZWdzIiwJRjNGKDIsIDB4MzQsIDB4MDA1KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDA1KXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2NiB9LAotCi17ICJmYWRkZCIsCUYzRigyLCAweDM0LCAweDA0MiksIEYzRih+MiwgfjB4MzQsIH4weDA0MiksICJ2LEIsSCIsIEZfRkxPQVQsIHY2IH0sCi17ICJmYWRkcSIsCUYzRigyLCAweDM0LCAweDA0MyksIEYzRih+MiwgfjB4MzQsIH4weDA0MyksICJWLFIsSiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmYWRkcyIsCUYzRigyLCAweDM0LCAweDA0MSksIEYzRih+MiwgfjB4MzQsIH4weDA0MSksICJlLGYsZyIsIEZfRkxPQVQsIHY2IH0sCi17ICJmc3ViZCIsCUYzRigyLCAweDM0LCAweDA0NiksIEYzRih+MiwgfjB4MzQsIH4weDA0NiksICJ2LEIsSCIsIEZfRkxPQVQsIHY2IH0sCi17ICJmc3VicSIsCUYzRigyLCAweDM0LCAweDA0NyksIEYzRih+MiwgfjB4MzQsIH4weDA0NyksICJWLFIsSiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmc3VicyIsCUYzRigyLCAweDM0LCAweDA0NSksIEYzRih+MiwgfjB4MzQsIH4weDA0NSksICJlLGYsZyIsIEZfRkxPQVQsIHY2IH0sCi0KLSNkZWZpbmUgQ01QRkNDKHgpCSgoKHgpJjB4Myk8PDI1KQotCi17ICJmY21wZCIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTIpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1Mil8UkRfRzAsICAidixCIiwgICBGX0ZMT0FULCB2NiB9LAoteyAiZmNtcGQiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDUyKSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTIpLAkgIjYsdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBkIiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1MiksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDUyKSwJICI3LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZCIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTIpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1MiksCSAiOCx2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGQiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDUyKSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTIpLAkgIjksdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlZCIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTYpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1Nil8UkRfRzAsICAidixCIiwgICBGX0ZMT0FULCB2NiB9LAoteyAiZmNtcGVkIiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1NiksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDU2KSwJICI2LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZWQiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDU2KSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTYpLAkgIjcsdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlZCIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTYpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1NiksCSAiOCx2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVkIiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1NiksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDU2KSwJICI5LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wcSIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTMpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1Myl8UkRfRzAsCSAiVixSIiwgRl9GTE9BVCwgdjggfSwKLXsgImZjbXBxIiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI2LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wcSIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiNyxWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcHEiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjgsVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBxIiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI5LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXEiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDU3KSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTcpfFJEX0cwLAkgIlYsUiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmY21wZXEiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjYsVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlcSIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiNyxWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVxIiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI4LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXEiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjksVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBzIiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1MSksICAgICAgICAgICAgRjNGKH4yLCB+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+MywgfjB4M2UsIH4xKSwgIlsxXW8sMixkIiwgMCwgdjkgfSwKLQotLyogdjkgc3ludGhldGljIGluc25zICovCi0vKiBGSVhNRTogc3RpbGwgbWlzc2luZyAic2lnbnggZCIsIGFuZCAiY2xydXcgZCIuICBDYW4ndCBiZSBkb25lIGhlcmUuICAqLwoteyAiaXByZWZldGNoIiwJRjIoMCwgMSl8KDI8PDIwKXxCUFJFRCwgRjIofjAsIH4xKXwoMTw8MjApfEFOTlVMfENPTkQofjApLCAiRyIsIDAsIHY5IH0sIC8qIGJuLGEscHQgJXhjYyxsYWJlbCAqLwoteyAic2lnbngiLAlGMygyLCAweDI3LCAwKSwgRjMofjIsIH4weDI3LCB+MCl8KDE8PDEyKXxBU0kofjApfFJTMl9HMCwgIjEsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIHNyYSByczEsJWcwLHJkICovCi17ICJjbHJ1dyIsCUYzKDIsIDB4MjYsIDApLCBGMyh+MiwgfjB4MjYsIH4wKXwoMTw8MTIpfEFTSSh+MCl8UlMyX0cwLCAiMSxkIiwgRl9BTElBUywgdjkgfSwgLyogc3JsIHJzMSwlZzAscmQgKi8KLXsgImNhcyIsCUYzKDMsIDB4M2MsIDApfEFTSSgweDgwKSwgRjMofjMsIH4weDNjLCB+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+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvdGljMzAtZGlzLmMgYi9vcGNvZGVzL3RpYzMwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDUxNDU3Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvdGljMzAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTEgKzAsMCBAQAotLyogRGlzYXNzZW1ibHkgcm91dGluZXMgZm9yIFRNUzMyMEMzMCBhcmNoaXRlY3R1cmUKLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS90aWMzMC5oIgotCi0jZGVmaW5lIE5PUk1BTF9JTlNOICAgMQotI2RlZmluZSBQQVJBTExFTF9JTlNOIDIKLQotLyogR2V0cyB0aGUgdHlwZSBvZiBpbnN0cnVjdGlvbiBiYXNlZCBvbiB0aGUgdG9wIDIgb3IgMyBiaXRzIG9mIHRoZQotICAgaW5zdHJ1Y3Rpb24gd29yZC4gKi8KLSNkZWZpbmUgR0VUX1RZUEUoaW5zbikgKGluc24gJiAweDgwMDAwMDAwID8gaW5zbiAmIDB4QzAwMDAwMDAgOiBpbnNuICYgMHhFMDAwMDAwMCkKLQotLyogSW5zdHJ1Y3Rpb24gdHlwZXMuICovCi0jZGVmaW5lIFRXT19PUEVSQU5EXzEgMHgwMDAwMDAwMAotI2RlZmluZSBUV09fT1BFUkFORF8yIDB4NDAwMDAwMDAKLSNkZWZpbmUgVEhSRUVfT1BFUkFORCAweDIwMDAwMDAwCi0jZGVmaW5lIFBBUl9TVE9SRSAgICAgMHhDMDAwMDAwMAotI2RlZmluZSBNVUxfQUREUyAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgQlJBTkNIRVMgICAgICAweDYwMDAwMDAwCi0KLS8qIFNwZWNpZmljIGluc3RydWN0aW9uIGlkIGJpdHMuICovCi0jZGVmaW5lIE5PUk1BTF9JREVOICAgIDB4MUY4MDAwMDAKLSNkZWZpbmUgUEFSX1NUT1JFX0lERU4gMHgzRTAwMDAwMAotI2RlZmluZSBNVUxfQUREX0lERU4gICAweDJDMDAwMDAwCi0jZGVmaW5lIEJSX0lNTV9JREVOICAgIDB4MUYwMDAwMDAKLSNkZWZpbmUgQlJfQ09ORF9JREVOICAgMHgxQzNGMDAwMAotCi0vKiBBZGRyZXNzaW5nIG1vZGVzLiAqLwotI2RlZmluZSBBTV9SRUdJU1RFUiAweDAwMDAwMDAwCi0jZGVmaW5lIEFNX0RJUkVDVCAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgQU1fSU5ESVJFQ1QgMHgwMDQwMDAwMAotI2RlZmluZSBBTV9JTU0gICAgICAweDAwNjAwMDAwCi0KLSNkZWZpbmUgUF9GSUVMRCAweDAzMDAwMDAwCi0KLSNkZWZpbmUgUkVHX0FSMCAweDA4Ci0jZGVmaW5lIExEUF9JTlNOIDB4MDg3MDAwMDAKLQotLyogVE1TMzIwQzMwIHByb2dyYW0gY291bnRlciBmb3IgY3VycmVudCBpbnN0cnVjdGlvbi4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX3BjOwotCi1zdHJ1Y3QgaW5zdHJ1Y3Rpb24KLSAgewotICAgIGludCB0eXBlOwotICAgIHRlbXBsYXRlICp0bTsKLSAgICBwYXJ0ZW1wbGF0ZSAqcHRtOwotICB9OwotCi1pbnQgZ2V0X3RpYzMwX2luc3RydWN0aW9uIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBpbnN0cnVjdGlvbiAqKSk7Ci1pbnQgcHJpbnRfdHdvX29wZXJhbmQKLSAgUEFSQU1TICgoZGlzYXNzZW1ibGVfaW5mbyAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKikpOwotaW50IHByaW50X3RocmVlX29wZXJhbmQKLSAgUEFSQU1TICgoZGlzYXNzZW1ibGVfaW5mbyAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKikpOwotaW50IHByaW50X3Bhcl9pbnNuCi0gIFBBUkFNUyAoKGRpc2Fzc2VtYmxlX2luZm8gKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGluc3RydWN0aW9uICopKTsKLWludCBwcmludF9icmFuY2gKLSAgUEFSQU1TICgoZGlzYXNzZW1ibGVfaW5mbyAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKikpOwotaW50IGdldF9pbmRpcmVjdF9vcGVyYW5kIFBBUkFNUyAoKHVuc2lnbmVkIHNob3J0LCBpbnQsIGNoYXIgKikpOwotaW50IGdldF9yZWdpc3Rlcl9vcGVyYW5kIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIsIGNoYXIgKikpOwotaW50IGNudnRfdG1zZmxvYXRfaWVlZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQsIGZsb2F0ICopKTsKLQotaW50Ci1wcmludF9pbnNuX3RpYzMwIChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuX3dvcmQ7Ci0gIHN0cnVjdCBpbnN0cnVjdGlvbiBpbnNuID0KLSAgezAsIE5VTEwsIE5VTEx9OwotICBiZmRfdm1hIGJ1ZmFkZHIgPSBwYyAtIGluZm8tPmJ1ZmZlcl92bWE7Ci0gIC8qIE9idGFpbiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiB3b3JkIGZyb20gdGhlIGJ1ZmZlci4gKi8KLSAgaW5zbl93b3JkID0gKCooaW5mby0+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+bmFtZTsKLSAgICAgIHByaW50ZiAoIn0sXG4iKTsKLSAgICAgIG5ldysrOwotICAgIH0KLSAgcHJpbnRmICgiMCwwfTtcbiIpOwotICBwcmludGYgKCIjZW5kaWZcbiIpOwotfQotCi0KLWludAotbWFpbiAoYWMsIGF2KQotICAgICBpbnQgYWM7Ci0gICAgIGNoYXIgKiphdjsKLXsKLSAgc3RydWN0IG9wICpwID0gb3B0OwotCi0gIGlmIChhYyA9PSAyICYmIHN0cmNtcCAoYXZbMV0sICItdCIpID09IDApCi0gICAgewotICAgICAgaW50ZXJuYWwgKCk7Ci0gICAgfQotICBlbHNlIGlmIChhYyA9PSAyICYmIHN0cmNtcCAoYXZbMV0sICItaCIpID09IDApCi0gICAgewotICAgICAgd2hpbGUgKHAtPm5hbWUpCi0JewotCSAgcHJpbnRmICgiJS0yNXNcdCVzXG4iLCBwLT5uYW1lLCBwLT5iaXRzKTsKLQkgIHArKzsKLQl9Ci0gICAgfQotCi0gIGVsc2UgaWYgKGFjID09IDIgJiYgc3RyY21wIChhdlsxXSwgIi1hIikgPT0gMCkKLSAgICB7Ci0gICAgICBnYXMgKCk7Ci0gICAgfQotICBlbHNlIGlmIChhYyA9PSAyICYmIHN0cmNtcCAoYXZbMV0sICItZCIpID09IDApCi0gICAgewotICAgICAgLypkaXMoKTsqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIlVzYWdlOiAlcyAtdFxuIiwgYXZbMF0pOwotICAgICAgcHJpbnRmICgiLXQgOiBnZW5lcmF0ZSBuZXcgejguYyBpbnRlcm5hbCB0YWJsZVxuIik7Ci0gICAgICBwcmludGYgKCItYSA6IGdlbmVyYXRlIG5ldyB0YWJsZSBmb3IgZ2FzXG4iKTsKLSAgICAgIHByaW50ZiAoIi1kIDogZ2VuZXJhdGUgbmV3IHRhYmxlIGZvciBkaXNhc3NlbWJsZVxuIik7Ci0gICAgICBwcmludGYgKCItaCA6IGdlbmVyYXRlIG5ldyB0YWJsZSBmb3IgaHVtYW5zXG4iKTsKLSAgICB9Ci1yZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL0NoYW5nZUxvZyBiL3JlYWRsaW5lL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM4ZmNmMy4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw5ODIgKzAsMCBAQAotMTk5OS0wNC0yMiAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IE1ha2UgY29tbWVudCBhYm91dCB0aGlzIGNoYW5nZSBtb3JlIGV4cGxpY2l0LgotCi0xOTk5LTA0LTIyICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgdGhlIGZpbmFsIGxpYnJlYWRsaW5lLmEKLSAgICAgICAgb3IgLmggZmlsZXMuCi0KLVR1ZSBNYXIgMjMgMTA6NTY6MDggMTk5OSAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgotCi0JUGF0Y2hlcyBmcm9tIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVAZ214Lm5ldD46Ci0gCQotCSogZGlzcGxheS5jOiBDaGFuZ2Ugc29tZSB0ZXJtaW5hbCBjYWxscyB0byB3b3JrIG9uIERKR1BQLgotCSogdGVybWluYWwuYzogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIC4gZnJvbSB0aGUgVlBBVEggZGlyZWN0aXZlLgotCQotVHVlIE1hciAgOSAxNDo1ODoxMyAxOTk5ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBzdXBwb3J0L2NvbmZpZy5zdWI6IFJlY29nbml6ZSBjeWd3aW4qLCBub3QganVzdCBjeWd3aW4zMi4KLQotVHVlIEZlYiAgOSAxMDozODo1NyAxOTk5ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gbm90IHVzZSB0aGUgLi9zdXBwb3J0IGRpcmVjdG9yeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotV2VkIEphbiAgNiAxMjoyNDoxOSAxOTk5ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBMT0NBTF9DRkxBR1MgcmF0aGVyIHRoYW4gQ0ZMQUdTIGZvcgotCXNlYXJjaGluZyBsaWJ0ZXJtY2FwIGRpcmVjdG9yeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVGh1IERlYyAzMSAxMjowNzowMSAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNlYXJjaCBkZXZvIGxpYnRlcm1jYXAgZGlyZWN0b3J5IGZvciB0ZXJtY2FwLmgKLQl3aGVuIGNvbXBpbGluZyBmb3IgY3lnd2luLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotMTk5OC0xMi0zMCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogT25seSB0cnkgdG8gY29weSBsaWJyZWFkbGluZS5hIGFuZAotCWxpYmhpc3RvcnkuYSBpZiB0aGV5IGV4aXN0LgotCi1UdWUgRGVjIDI5IDIzOjQ5OjIwIDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIGNyb3NzLWJ1aWxkL2N5Z3dpbi5jYWNoZTogQWRkIGEgY291cGxlIG1vcmUga25vd24gc2V0dGluZ3MuCi0JKiBjb25maWd1cmUuaW46IEZpeCB0eXBvLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotVHVlIERlYyAyOSAxODoxMToyOCAxOTk4ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+Ci0KLQkqIGNyb3NzLWJ1aWxkOiBuZXcgZGlyZWN0b3J5LgotCQotCSogY3Jvc3MtYnVpbGQvY3lnd2luLmNhY2hlOiBuZXcgZmlsZS4gVXNlZCBmb3IgQ3lnd2luIGNyb3NzIGJ1aWxkcy4KLQotCSogY29uZmlndXJlLmluOiBhZGRlZCB0ZXN0cyBmb3IgY3Jvc3MtYnVpbGQgZm9yIEN5Z3dpbi4KLQotMTk5OC0xMi0yNCAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIENZR05VUyBMT0NBTCBjb21tZW50LgotCSogYWNjb25maWcuaDogQWRkIG1pc3NpbmcgZGVmaW5lcy4KLQkqIGNvbmZpZy5oLmJvdDogQWRkIG1pc3NpbmcgY29udGVudC4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmguaW46IFJlZ2VuZXJhdGVkLgotCi1XZWQgRGVjIDIzIDE2OjIxOjQxIDE5OTggIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IGNvbW1lbnQgb3V0IHRoZSBydWxlIHRvIHJlYnVpbGQgY29uZmlndXJlIGJ5IAotCXJ1bm5pbmcgYXV0b2NvbmYuIAotCi1UdWUgRGVjIDIyIDEwOjAwOjMwIDE5OTggIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KLQotCSogc2hlbGwuYyAoc2F2ZXN0cmluZyk6IGlmZGVmJ2QgaXQgb3V0LiAKLQotCSogSW1wb3J0ZWQgbmV3IHZlcnNpb24gb2YgUmVhZGxpbmUgMi4yLjEuIFJlbW92ZWQgYWxsIHRoZSBDeWdudXMKLQlsb2NhbCBjaGFuZ2VzLgotCi0JTmV3IGZpbGVzOiBhY2NvbmZpZy5oLCBhY2xvY2FsLm00LCBhbnNpX3N0ZGxpYi5oLCBjYWxsYmFjay5jLAotIAljb25maWcuaC5pbiwgY29uZmlndXJlLCBoaXN0ZXhwYW5kLmMsIGhpc3RmaWxlLmMsIGhpc3RsaWIuaCwKLSAJaGlzdHNlYXJjaC5jLCBpbnB1dC5jLCBraWxsLmMsIG1hY3JvLmMsIG5scy5jLCBwb3NpeGRpci5oLAotIAlwb3NpeGptcC5oLCBwb3NpeHN0YXQuaCwgcmxjb25mLmgsIHJsdHR5LmgsIHJsd2luc2l6ZS5oLCBzaGVsbC5jLAotIAl0Y2FwLmgsIHRlcm1pbmFsLmMsIHVuZG8uYywgdXRpbC5jLCBzdXBwb3J0IGRpcmVjdG9yeS4KLQotCVJlbW92ZWQgZmlsZXM6IHN5c2RlcCosIGNvbmZpZyBkaXJlY3RvcnkuCi0JCi0KLUZyaSBEZWMgIDQgMTU6MjU6NDEgMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQlUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGJ5IEppbSBCbGFuZHkKLSAJPGppbWJAendpbmdsaS5jeWdudXMuY29tPiBhbmQgRGF2aWQgVGF5bG9yCi0gCTx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4gYXMgcGFydCBvZiBhIHByb2plY3QgdG8gbWVyZ2UgaW4gY2hhbmdlcwotIAltYWRlIGJ5IEhQOyBIUCBkaWQgbm90IGNyZWF0ZSBDaGFuZ2VMb2cgZW50cmllcy4KLQotCSogY29uZmlnL21wLWVuYWJsZS10dWk6IE5ldyBmaWxlLgotCShUVUlfQ0ZMQUdTKTogU2VhcmNoIGRldm8ncyBpbmNsdWRlIGRpcmVjdG9yeSwgYXMgbG9uZyBhcyB3ZSdyZQotIAl0b3RhbGx5IHJ1aW5pbmcgbW9kdWxhcml0eS4KLQkoSU5DTFVERV9TUkNESVIpOiBOZXcgdmFyLgotCShHREJfVFVJX1NSQ0RJUik6IEZpeCBzeW50YXggZXJyb3IuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgdGhlIC0tZW5hYmxlLXR1aSBmbGFnOyBpZiBpdCdzIHNldCwgaW5jbHVkZQotIAlhIG1ha2VmaWxlIGZyYWdtZW50IHRoYXQgI2RlZmluZXMgVFVJIGFuZCBhZGRzIHRoZSBuZWVkZWQgI2luY2x1ZGUKLSAJZGlyZWN0b3JpZXMuCi0JKCotKi1ocHV4Kik6IE5ldyBob3N0OyB1c2Ugc3lzZGVwLWhwdXguaC4KLQotCSogTWFrZWZpbGUuaW4gKC5jLm8pOiBDaGVjayB0aGUgdmFyaWFibGUgc2V0IGluIHRoZSBtYWtlZmlsZQotCWZyYWdtZW50IGFib3ZlLgotCi0JKiBkaXNwbGF5LmMgKHRlcm1fZ290byk6IGRlY2xhcmUgaXQuCi0JKGluc2VydF9zb21lX2NoYXJzKTogc2V0IGl0LgotCShkZWxldGVfY2hhcnMpOiBzZXQgaXQuCi0KLQkqIHJlYWRsaW5lLmM6IGFkZCB0dWkgaW5jbHVkZSBmaWxlcyBzdXJyb3VuZGVkIGJ5IFRVSS4KLQkocmxfcmVzZXQpOiBuZXcgZnVuY3Rpb24sIG1vdmUgc29tZSBvZiBybF9hYm9ydCBmdW5jdGlvbmFsaXR5IHRvCi0gCWhlcmUuCi0JKHJsX2Fib3J0KTogY2FsbCBybF9yZXNldC4KLQkocmxfZ2V0Yyk6IHR1aSBjaGFuZ2VzLgotCShpbml0X3Rlcm1pbmFsX2lvKTogdHVpIGNoYW5nZXMuCi0KLQkqIHJlYWRsaW5lLmggKHR1aV92ZXJzaW9uLCBmcHV0Y191bmZpbHRlcmVkLCBmcHV0c191bmZpbHRlcmVkLAotCXR1aV90cHV0cyk6IGRlY2xhcmUgaWYgVFVJIGlzIGRlZmluZWQuCi0KLQkqIHJsdHR5LmMgKHByZXBhcmVfdGVybWluYWxfc2V0dGluZ3MpOiBhZGRpdGlvbmFsIGNvbW1lbnQuCi0KLQkqIHNpZ25hbHMuYzogYWRkIHR1aSBpbmNsdWRlIGZpbGVzIHN1cnJvdW5kZWQgYnkgVFVJLiAgbW92ZSAjaWYKLSAJYW5kICNlbmRpZiB0byBjb2x1bW4gMSBzbyBIUCdzIGNvbXBpbGVyIHdpbGwgYWNjZXB0IHRoZW0uICBSZW1vdmUKLSAJZGVjbGFyYXRpb24gb2YgdHVpRG9BbmRSZXR1cm5Ub1RvcCBzaW5jZSBpdCdzIGRlY2xhcmVkIGluIHR1aS5oLgotCShybF9oYW5kbGVfc2lnd2luY2gpOiBjYWxsIHR1aURvQW5kUmV0dXJuVG9Ub3AgaWYgVFVJIGRlZmluZWQuCi0gIAkocmxfaGFuZGxlX3NpZ3dpbmNoX29uX2NsZWFyKTogZGVmaW5lIGlmIFRVSSBkZWZpbmVkLgotCShybF9zZXRfc2lnbmFscyk6IGlmIFRVSSwgYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uLgotCShybF9jbGVhcl9zaWduYWxzKTogaW5zdGFsbCBybF9oYW5kbGVfc2lnd2luY2hfb25fY2xlYXIuCi0KLQkqIHN5c2RlcC1ocHV4Lmg6IE5ldyBmaWxlLgotCi1Nb24gTm92ICAyIDE1OjI2OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IENoZWNrIGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMiouCi0KLVR1ZSBKdWwgMjggMDk6NDM6MjcgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzeXNkZXAtaHB1eDExLmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluICgqLSotKi1ocHV4MTEqKTogVXNlIHN5c2RlcC1ocHV4MTEuaC4KLQotVGh1IEp1bCAyMyAxNzo0ODoyMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5iYXQ6IFJlbW92ZSBvYnNvbGV0ZSBmaWxlLgotCSogZXhhbXBsZXMvY29uZmlndXJlLmJhdDogUmVtb3ZlIG9ic29sZXRlIGZpbGUuCi0KLVdlZCBNYXkgMTMgMTM6NDE6NTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeXNkZXAtNmlyaXguaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKCotKi1pcml4NiopOiBOZXcgaG9zdDsgdXNlIHN5c2RlcC02aXJpeC5oLgotCi0JKiBNYWtlZmlsZS5pbiAoaXNlYXJjaC5vLCBzZWFyY2gubyk6IERlcGVuZCB1cG9uIHN5c2RlcC5oLgotCShNYWtlZmlsZSk6IERlcGVuZCB1cG9uICQoc3JjZGlyKS9jb25maWd1cmUuaW4uCi0KLVRodSBBcHIgIDkgMTE6NTk6MzggMTk5OCAgSWFuIERhbGwgKDxJYW4uRGFsbEBkc3RvLmRlZmVuY2UuZ292LmF1PgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3Q9PW5ldGJzZCk6IEluY2x1ZGUgY29uZmlnL21oLWJzZDQ0LgotCSogY29uZmlnL21oLWJzZDQ0OiBOZXcgZmlsZS4KLQotV2VkIERlYyAgMyAxNjo0ODoyMCAxOTk3ICBNaWNoYWVsIFNueWRlciAgKG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tKQotCi0JKiBybHR0eS5jOiBmaXggdHlwb3MuCi0KLVR1ZSBPY3QgIDggMDg6NTk6MjQgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogdGlsZGUuYyAodGlsZGVfd29yZF9leHBhbmQpOiAgX19NU0RPU19fXyAtPiBfX01TRE9TX18KLQotU2F0IE9jdCAwNSAxMToyNDozNCAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIHJsZGVmcy5oOiBPbiBMaW51eCwgaW5jbHVkZSA8dGVybWlvcy5oPiB0byBmaXggY29tcGlsZSBlcnJvcgotCWluIDx0ZXJtY2FwLmg+LgotCi1XZWQgU2VwICA0IDE4OjA2OjUxIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHJsZGVmcy5oOiAgRW5hYmxlIEhBTkRMRV9TSUdOQUxTIGZvciBjeWd3aW4zMi4KLQotVGh1IEF1ZyAyOSAxNjo1OTo0NSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi0qKTogUmVjb2duaXplIGk2ODYgZm9yIHBlbnRpdW0gcHJvLgotCi1GcmkgQXVnIDE2IDE3OjQ5OjU3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbXBsZXRlLmM6ICBJbmNsdWRlIDxwd2QuaD4gaWYgbm90IERPUywgYW5kIGlmIGN5Z3dpbjMyIG9yIG5vdAotCXdpbjMyLgotCSogY29uZmlndXJlLmluOiAgQWRkIHRlc3QgZm9yICotKi1jeWd3aW4zMiogdG8gdXNlIGNvbmZpZy9taC1wb3NpeC4KLQkqIHJlYWRsaW5lLmM6ICBNb3ZlIGRlY2wgb2YgdGdldHN0ciB0byBybGRlZnMuaC4KLQkqIChfcmxfc2V0X3NjcmVlbl9zaXplKTogIFJlbW92ZSByZWR1bmRhbnQgaWZkZWYgTUlOSU1BTHMuCi0JKiBybGRlZnMuaDogIERvbid0IGRvIE1JTklNQUwgZm9yIGN5Z3dpbjMyLiAgQ3lnd2luMzIgbm93IHVzZXMKLQlmdWxsLWJsb3duIHJlYWRsaW5lLCBleGNlcHQgZm9yIHRlcm1jYXAuCi0KLVN1biBBdWcgMTEgMjE6MDY6MjYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogcmxkZWZzLmM6ICBHZXQgcmlkIG9mIGRlZmluZSBvZiBTSUdBTFJNIGlmIF9XSU4zMiBvciBfX01TRE9TX18uCi0JKiBEb24ndCBkZWZpbmUgU2NyZWVuQ29scy9TY3JlZW5Sb3dzLy4uLiBpZiBjeWd3aW4zMi4KLQkqIHN5c2RlcC1ub3JtLmg6ICBEb24ndCBpbmNsdWRlIDxtYWxsb2MuaD4gaWYgY3lnd2luMzIuCi0KLVN1biBBdWcgMTEgMTQ6NTk6MDkgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHJsZGVmcy5oOiAgSWYgX19vc2ZfX2lzIGRlZmluZWQsIGluY2x1ZGUgPHRlcm1pby5oPiBpbnN0ZWFkIG9mCi0JPHNndHR5Lmg+LgotCi1GcmkgQXVnICA5IDA4OjU0OjI2IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGJpbmQuYyBjb21wbGV0ZS5jIGhpc3RvcnkuYyByZWFkbGluZS5jOiAgRG9uJ3QgaW5jbHVkZSBzeXMvZmlsZS5oLgotCSogY29tcGxldGUuYyBkaXNwbGF5LmMgcGFyZW5zLmMgcmVhZGxpbmUuYyBybGRlZnMuaCBybHR0eS5jCi0Jc2lnbmFscy5jIHRpbGRlLmM6ICBDaGFuZ2UgcmVmcyB0byBfTVNDX1ZFUiBhbmQgX19XSU4zMl9fIHRvIF9XSU4zMi4KLQkqIHNpZ25hbHMuYyAocmxfc2lnbmFsX2hhbmRsZXIpOiAgSWZkZWYgb3V0IGtpbGwgaWYgX1dJTjMyLgotCSogc3lzZGVwLW5vcm0uaDogIElmZGVmIG91dCBpbmNsdWRlIG9mIGRpcmVudC5oIGlmIF9XSU4zMi4KLQlJbmNsdWRlIG1hbGxvYy5oIGlmIF9XSU4zMi4KLQotVGh1IEp1bCAxOCAxNTo1OTozNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHJsZGVmcy5oIChzeXMvdWlvLmgpIEJlZm9yZSBzeXMvc3RyZWFtLmggaXMgaW5jbHVkZWQgdW5kZXIgQUlYLAotCWluY2x1ZGUgc3lzL3Vpby5oLCB3aGljaCBwcmV2ZW50cyBhbiB1bmRlZmluZWQgc3RydWN0dXJlIHVzZWQgaW4gYQotCXByb3RvdHlwZSBtZXNzYWdlIGZyb20gYmVpbmcgZ2VuZXJhdGVkLgotCi1UdWUgSnVuIDI1IDIzOjA1OjU1IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLSAgICAgICAgKiBNYWtlZmlsZS5pbiAoZGF0YWRpcik6IFNldCB0byAkKHByZWZpeCkvc2hhcmUuCi0JKGRvY2Rpcik6IFJlbW92ZWQuCi0KLVN1biBNYXkgMjYgMTU6MTQ6NDIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQlGcm9tOiBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBzeXNkZXAtbGludXguaDogTmV3IGZpbGUuCi0JKiBkaXNwbGF5LmM6IEFkZCBpbmNsdWRlIG9mICJzeXNkZXAuaCIgdG8gZ2V0IEhBVkVfVkFSQVJHU19ILgotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgcGF0dGVybiBpWzM0NV04Ni0qLWxpbnV4KiBpbnRvICotKi1saW51eCogdG8KLQlzdXBwb3J0IG5vbi14ODYgYmFzZWQgTGludXggcGxhdGZvcm1zLgotCi1TdW4gQXByICA3IDIyOjA2OjExIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JRnJvbTogTWlsZXMgQmFkZXIgIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KLQkqIGNvbmZpZy9taC1nbnU6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluICgqLSotZ251Kik6IE5ldyBob3N0LgotCi1TdW4gQXByICA3IDEzOjIxOjUxIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JRnJvbTogUm9iZXJ0IExpcGUgPHJvYmVydGxAZGdpaS5jb20+Ci0JKiBjb25maWd1cmUuaW46IFNDTyBPcGVuU2VydmVyIDUgKGEuay5hIDMuMnY1KikgaXMgbW9yZSBsaWtlCi0JU0NPIDMuMnY0IHRoYW4gMy4ydjIuCi0KLVdlZCBKYW4gIDMgMTg6MjI6MTAgMTk5NiAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcmVhZGxpbmUuYywgZGlzcGxheS5jLCBjb21wbGV0ZS5jOiBBZGQgX01TQ19WRVIgdG8gbGlzdCBvZgotCXRoaW5ncyB3aGljaCBjYW4ndCBkbyBtb3N0IHRoaW5ncy4KLQotVGh1IE5vdiAxNiAxNTozOTowNSAxOTk1ICBHZW9mZnJleSBOb2VyIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbXBsZXRlLmM6IENoYW5nZSBXSU4zMiB0byBfX1dJTjMyX18sIGFkZGVkICNlbHNlIHJldHVybiBOVUxMCi0JdG8gZW5kIG9mIHRoYXQgZGVmaW5lLgotCi1UdWUgT2N0IDMxIDEwOjM4OjU4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRpc3BsYXkuYywgcGFyZW5zLmMsIHJlYWRsaW5lLmMsIHJsZGVmcy5oOiBDaGFuZ2UgdXNlIG9mCi0JV0lOMzIgdG8gX19XSU4zMl9fLgotCi1UdWUgT2N0IDEwIDExOjA3OjIzIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQklTT04pOiBSZW1vdmUgbWFjcm8uCi0KLVR1ZSBPY3QgMTAgMDg6NDk6MDAgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29tcGxldGUuYyAoZmlsZW5hbWVfY29tcGxldGlvbl9mdW5jdGlvbik6IEVuYWJsZSBmb3IKLQl3aW4zMiB3aGVuIG5vdCBNU0MuCi0KLVN1biBPY3QgIDggMDQ6MTc6MTkgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaW46ICBIYW5kbGUgcG93ZXJwYy1pYm0tYWl4KiBsaWtlIHJzNjAwMC1pYm0tYWl4Ki4KLQotU2F0IE9jdCAgNyAyMDozNjoxNiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogcmx0dHkuYyAob3V0Y2hhcik6IFJldHVybiBhbiBpbnQsIGxpa2UgdHB1dHMgZXhwZWN0cy4KLQkqIHNpZ25hbHMuYyAoX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24pOiBEaXR0by4KLQotRnJpIFNlcCAyOSAxNToxOToyMyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JRml4ZXMgZm9yIHdoZW4gdGhlIGhvc3QgV0lOMzIsIGJ1dCBub3QgTVNDLgotCSogY29tcGxldGUuYzogU29tZXRpbWVzIGhhdmUgcHdkLmgKLQkqIHBhcmVucy5jOiBXSU4zMiBoYXMgc2ltaWxhciByZXN0cmljdGlvbnMgdG8gX19HTzMyX18uCi0JKiByZWFkbGluZS5jIChfX0dPMzJfXyk6IFNvbWUgb2YgdGhpcyBtb3ZlZCBpbnRvIHJsZGVmcy5oCi0JKiBzaWduYWxzLmMgKF9fR08zMl9fKTogTGlrZXdpc2UuCi0JKiBybGRlZnMuaCAoTVNET1N8fFdJTjMyKSBiZWNvbWVzIE1TRE9TfHxNU0MuCi0JKFdJTjMyJiYhV0lOMzIpOiBOZXcgZGVmaW5pdGlvbnMuCi0KLVdlZCBTZXAgMjAgMTI6NTc6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyBzeW5vbnltIGZvciByZWFsY2xlYW4uCi0KLVdlZCBNYXIgIDEgMTM6MzM6NDMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBybHR0eS5jIChvdXRjaGFyKTogUHJvdmlkZSBwcm90b3R5cGUgZm9yIG91dGNoYXIsIHRvIHNpbGVuY2UKLQl0eXBlIHdhcm5pbmdzIGluIHBhc3Npbmcgb3V0Y2hhciB0byB0cHV0cyBvbiBzeXN0ZW1zIGxpa2UgTGludXgKLQl0aGF0IGhhdmUgZnVsbCBwcm90b3R5cGVzLgotCi0JKiBzaWduYWxzLmMgKF9ybF9vdXRwdXRfY2hhcmFjdGVyX2Z1bmN0aW9uKTogUHJvdmlkZSBwcm90b3R5cGUgdG8KLQlzaWxlbmNlIHR5cGUgd2FybmluZ3MuCi0KLVN1biBKYW4gMTUgMTQ6MTA6MzcgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+Ci0KLQkqIHJsZGVmcy5oOiBEZWZpbmUgTUlOSU1BTCBmb3IgX19HTzMyX18gYW5kIFdJTjMyLgotCSogY29tcGxldGUuYywgZGlzcGxheS5jLCByZWFkbGluZS5jLCBybHR0eS5jOiBUZXN0IE1JTklNQUwKLQlpbnN0ZWFkIG9mIF9fR08zMl9fLgotCi1XZWQgQXVnIDI0IDEzOjA0OjQ3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgaVszNF04NiB0byBpWzM0NV04Ni4KLQotU2F0IEp1bCAxNiAxMzoyNjozMSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobTg4Ki1oYXJyaXMtY3h1eDcqKTogUmVjb2duaXplLgotCSogc3lzZGVwLWN4dXg3Lmg6IE5ldyBmaWxlLgotCi1GcmkgSnVsICA4IDEzOjE4OjMzIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIHJ0dHR5LmMgKGNvbnRyb2xfbWV0YV9rZXlfb24pOiBSZW1vdmUgc3VwZXJmbHVvdXMgdGVzdGluZyBvZgotCV9fR08zMl9fLgotCi1UaHUgSnVuIDMwIDE1OjIxOjU0IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIHJsdHR5LmMgKGNvbnRyb2xfbWV0YV9rZXlfb24pOiBEb24ndCBjb21waWxlIGlmIF9fR08zMl9fIGlzCi0JZGVmaW5lZC4KLQkocmx0dHlfc2V0X2RlZmF1bHRfYmluZGluZ3MpOiBMaWtld2lzZS4KLQkqIGRpc3BsYXkuYyAoaW5zZXJ0X3NvbWVfY2hhcnMsIGRlbGV0ZV9jaGFycyk6IHJvd19zdGFydCBzaG91bGQgYmUKLQlhIHNob3J0LgotCSogcGFyZW5zLmMgKHJsX2luc2VydF9jbG9zZSk6IE5vIEZEX1NFVCBpZiB1c2luZyBfX0dPMzJfXy4KLQkqIHJlYWRsaW5lLmMgKHJsX2dhdGhlcl90eWkpOiBTdHJpcCBvZmYgc3B1cmlvdXMgaGlnaCBiaXRzLgotCi1TdW4gSnVuIDEyIDAzOjUxOjUyIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogaGlzdG9yeS5jOiAgU3dhcCBpbmNsdXNpb24gb2YgcmxkZWZzLmggYW5kIGNoYXJkZWZzLmggdG8gYXZvaWQKLQlDVFJMIG1hY3JvIHJlZGVmaW5pdGlvbi4KLQotTW9uIE1heSAgOSAxODoyOTo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKHJlYWRsaW5lX2RlZmF1bHRfYmluZGluZ3MpOiBEb24ndCBjb21waWxlIGlmCi0JX19HTzMyX18gaXMgZGVmaW5lZC4KLQkoX3JsX3NldF9zY3JlZW5fc2l6ZSk6IExpa2V3aXNlLgotCSogcmx0dHkuYyAocmx0dHlfc2V0X2RlZmF1bHRfYmluZGluZ3MpOiBMaWtld2lzZS4KLQkoY29udHJvbF9tZXRhX2tleSk6IExpa2V3aXNlLgotCSogZGlzcGxheS5jOiBJZiBfX0dPMzJfXyBpcyBkZWZpbmVkLCBpbmNsdWRlIDxzeXMvcGMuaD4uCi0JKiBwYXJlbnMuYzogSWYgX19HTzMyX18gaXMgZGVmaW5lZCwgdW5kZWZpbmUgRkRfU0VULgotCSogc2lnbmFscy5jOiBJbmNsdWRlIFNJR1dJTkNIIGhhbmRsaW5nIGluIHRoZSBzZXQgb2YgdGhpbmdzIHdoaWNoCi0JaXMgbm90IGRvbmUgaWYgSEFORExFX1NJR05BTFMgaXMgbm90IHNldC4KLQotRnJpIE1heSAgNiAxMzozODozOSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0gICAgICAgICogY29uZmlnL21oLWdvMzI6IE5ldyBmcmFnbWVudC4KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdD09Z28zMik6IFVzZSBnbzMyIGZyYWdtZW50LgotCi1XZWQgTWF5ICA0IDE0OjM2OjUzIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNoYXJkZWZzLmgsIHJsZGVmcy5oOiAgTW92ZSBkZWNscyBvZiBzdHJpbmcgZnVuY3MgZnJvbSBjaGFyZGVmcy5oCi0JdG8gcmxkZWZzLmggc28gdGhhdCB0aGV5IGRvbid0IHBvbGx1dGUgYXBwcyB0aGF0IGluY2x1ZGUKLQlyZWFkbGluZS5oLgotCSogaGlzdG9yeS5jOiAgaW5jbHVkZSBybGRlZnMuaCB0byBnZXQgZGVjbHMgb2Ygc3RyaW5nIGZ1bmNzLgotCi1XZWQgTWF5ICA0IDEyOjE1OjExIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChyczYwMDAtYnVsbC1ib3N4Kik6IE5ldyBjb25maWd1cmF0aW9uLCBSUy82MDAwCi0JdmFyaWFudC4KLQotV2VkIEFwciAyMCAxMDo0Mzo1MiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBVc2UgbWgtcG9zaXggZm9yIHN1bm9zNC4xKi4KLQotV2VkIEFwciAxMyAyMToyODo0NCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogcmx0dHkuYyAoc2V0X3R0eV9zZXR0aW5ncyk6IERvbid0IHNldCByZWFkbGluZV9lY2hvaW5nX3AuCi0JKHJsX2RlcHJlcF90ZXJtaW5hbCkgW05FV19UVFlfRFJJVkVSXTogU2V0IHJlYWRsaW5lX2VjaG9pbmdfcC4KLQotU3VuIE1hciAxMyAwOToxMzoxMiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBUQUdTIHRhcmdldC4KLQotV2VkIE1hciAgOSAxODowMTozMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaXNlYXJjaC5jLCBzZWFyY2guYzogSW5jbHVkZSBzeXNkZXAuaC4KLQotVGh1IE1hciAgMyAxNzo0MDowMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBGb3IgSVNDLCB1c2UgbWgtc3lzdiwgbm90IG1oLWlzYy4KLQotVGh1IEZlYiAyNCAwNDoxMzo1MyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIE1lcmdlIGluIGNoYW5nZXMgZnJvbSBiYXNoLTEuMTMuNS4gTWVyZ2UgY2hhbmdlcyBmcm9tIGdsb2IvdGlsZGUuYwotCWludG8gdGlsZGUuYyBhbmQgdXNlIGl0LiBBZGQgc3lzdGVtIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyB3aGVyZQotCW5lY2Vzc2FyeS4gQ2hlY2sgZm9yIF9fR08zMl9fLCBub3QgX0dPMzJfIGNvbnNpc3RlbnRseS4KLQkqIE1ha2VmaWxlLmluOiAgVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIHJsdHR5LmM6ICBJbmNsdWRlIDxzeXMvZmlsZS5oPiB0byBtYXRjaCBpbmNsdWRlIGZpbGUgc2V0dXAKLQlpbiByZWFkbGluZS5jIGZvciBybGRlZnMuaC4gT3RoZXJ3aXNlIHdlIGdldCBpbmNvbnNpc3RlbnQKLQlUVFlfRFJJVkVSIGRlZmluaXRpb25zIGluIHJlYWRsaW5lLmMgYW5kIHJsdHR5LmMuCi0JKiBiaW5kLmMsIGNvbXBsZXRlLmM6ICBEbyBub3QgaW5jbHVkZSA8c3lzL3R5cGVzLmg+LCBpdCBpcyBhbHJlYWR5Ci0JaW5jbHVkZWQgdmlhIHN5c2RlcC5oLCB3aGljaCBjYXVzZXMgcHJvYmxlbXMgaWYgPHN5cy90eXBlcy5oPiBoYXMKLQlubyBtdWx0aXBsZSBpbmNsdXNpb24gcHJvdGVjdGlvbi4KLQkqIHJlYWRsaW5lLmMgKF9ybF9zZXRfc2NyZWVuX3NpemUpOiAgUmVlc3RhYmxpc2ggdGVzdCBmb3IKLQlUSU9DR1dJTlNaX0JST0tFTi4KLQkqIHJsZGVmcy5oOiAgRGVmaW5lIFNfSVNSRUcgaWYgbmVjZXNzYXJ5LgotCi1GcmkgRmViIDE4IDA4OjU2OjM1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHNlYXJjaC5vIHJ1bGUgZm9yIFN1biBtYWtlLgotCi1XZWQgRmViIDE2IDE2OjM1OjQ5IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBybHR0eS5jOiAgI2lmIG91dCBzb21lIGNvZGUgaWYgX19HTzMyX18uCi0KLVR1ZSBGZWIgMTUgMTQ6MDc6MDggMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKF9ybF9vdXRwdXRfY2hhcmFjdGVyX2Z1bmN0aW9uKSwgZGlzcGxheS5jOgotCVJldHVybiBpbnQsIG5vdCB2b2lkLCB0byBjb25mb3JtIHdpdGggdGhlIGV4cGVjdGVkIGFyZyBvZiB0cHV0cy4KLQkqIHJlYWRsaW5lLmMgKGluaXRfdGVybWluYWxfaW8pOiAgdGdldGZsYWcgb25seSB0YWtlcyAxIGFyZy4KLQkqIHJlYWRsaW5lLmMgKF9ybF9zYXZlc3RyaW5nKTogIE5ldyBmdW5jdGlvbi4KLQkqIGNoYXJkZWZzLmg6ICBUbyBhdm9pZCBjb25mbGljdHMgYW5kL29yIHdhcm5pbmdzLCBkZWZpbmUKLQlzYXZlc3RyaW5nIGFzIGEgbWFjcm8gd3JhcHBlciBmb3IgX3JsX3NhdmVzdHJpbmcuCi0JKiBkaXNwbGF5LmMgKGV4dGVybiB0ZXJtX3huKTogIEl0J3MgYW4gaW50IGZsYWcsIG5vdCBhIHN0cmluZy4KLQkqIGNoYXJzZGVmcy5oLCBybGRlZnMuaDogIFJlbW92ZSBIQVZFX1NUUklOR19ILXJlbGF0ZWQganVuay4KLQotU2F0IEZlYiAgNSAwODozMjozMCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBvYnNvbGV0ZSBydWxlcyBmb3IgaGlzdG9yeS5pbmZvIGFuZAotCXJlYWRsaW5lLmluZm8uCi0KLVRodSBKYW4gMjcgMTc6MDQ6MDEgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNoYXJkZWZzLmg6IE9ubHkgZGVjbGFyZSBzdHJyY2hyIGlmIGl0IGlzIG5vdCAjZGVmaW5lJ2QuCi0KLVR1ZSBKYW4gMjUgMTE6MzA6MDYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHJsZGVmcy5oOiBBY2NlcHQgX19ocHV4IGFzIHdlbGwgYXMgaHB1eCBmb3IgSFAgY29tcGlsZXIgaW4gQU5TSSBtb2RlLgotCi1GcmkgSmFuIDIxIDE3OjMxOjI2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGNoYXJkZWZzLmgsIHRpbGRlLmM6IEp1c3QgZGVjbGFyZSBzdHJyY2hyIHJhdGhlciB0aGFuIHRyeWluZyB0bwotCWluY2x1ZGUgYSBzeXN0ZW0gaGVhZGVyLgotCi1GcmkgSmFuIDIxIDE0OjQwOjQzIDE5OTQgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuLCByZWFsY2xlYW4pOiAgRXhwYW5kIGxvY2FsLWRpc3RjbGVhbgotCWlubGluZSBhZnRlciBkb2luZyByZWN1cnNpb24uICBZb3UgY2FuJ3QgcmVjdXJzZSBhZnRlciByZW1vdmluZwotCU1ha2VmaWxlLiAgTWFrZSB0aGVtIGRlcGVuZCBvbiBsb2NhbC1jbGVhbi4KLQkqIE1ha2VmaWxlLmluIChsb2NhbC1kaXN0Y2xlYW4pOiAgUmVtb3ZlIG5vdyBzdXBlcmZsdW91cyB0YXJnZXQuCi0KLU1vbiBKYW4gMTcgMTI6NDI6MDcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAoZG9pbmdfYW5fdW5kbyk6IERlbGV0ZSBzZWNvbmQgZGVjbGFyYXRpb24sIHNpbmNlIGl0Ci0JY29uZnVzZXMgdGhlIGFscGhhLW9zZjEgbmF0aXZlIGNvbXBpbGVyLgotCi1TdW4gSmFuIDE2IDEyOjMzOjExIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb21wbGV0ZS5jLCBiaW5kLmM6IEluY2x1ZGUgPHN5cy9zdGF0Lmg+LgotCSogY29tcGxldGUuYzogRGVmaW5lIFhfT0sgaWYgbm90IGRlZmluZWQgYnkgYSBzeXN0ZW0gaGVhZGVyLgotCi0JKiBjaGFyZGVmcy5oOiBEb24ndCBkZWNsYXJlIHhtYWxsb2MuCi0KLQkqIGtleW1hcHMuaDogSW5jbHVkZSAiY2hhcmRlZnMuaCIgbm90IDxyZWFkbGluZS9jaGFyZGVmcy5oPi4KLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuIG1vc3RseWNsZWFuIGRpc3RjbGVhbiByZWFsY2xlYW4pOiBSZWN1cnNlCi0JaW50byBzdWJkaXJlY3RvcmllcyBhcyB3ZWxsIGFzIGRvaW5nIHRoaXMgZGlyZWN0b3J5LiAgQWRkIGNsZWFuLWR2aQotCXRhcmdldC4KLQotU2F0IEphbiAxNSAxOTozNjoxMiAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYywgZGlzcGxheS5jOiAgUGF0Y2hlcyB0byBhbGxvdyB1c2Ugb2YgYWxsIDgwCi0JY29sdW1ucyBvbiBtb3N0IHRlcm1pbmFscyAodGhvc2Ugd2l0aCBhbSBhbmQgeG4pLgotCi0JTWVyZ2UgaW4gY2hhbmdlcyBmcm9tIGJhc2gtMS4xMy4gIFRoZSBtb3N0IG9idmlvdXMgb25lIGlzCi0JdGhhdCB0aGUgZmlsZSByZWFkbGluZS5jIGhhcyBiZWVuIHNwbGl0IGludG8gbXVsdGlwbGUgZmlsZXMuCi0JKiBiaW5kLmMsIGNvbXBsZXRlLmMsIGRpc3BheS5jLCBpc2VhcmNoLmMsIHBhcmVucy5jLCBybGRlZnMuaCwKLQlybHR0eS5jLCBzZWFyY2guYyBzaWduYWxzLmMsIHRpbGRlLmMsIHRpbGRlLmgsIHhtYWxsb2MuYzogIE5ldyBmaWxlcy4KLQotU2F0IERlYyAxMSAxNjoyOToxNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAocmxfZ2V0Yyk6IElmIEdPMzIsIHRyaW0gaGlnaCBiaXQgZnJvbSBnZXRrZXksCi0Jb3RoZXJ3aXNlIGZhbmN5IFBDIGtleXMgY2F1c2UgZ3JpZWYuCi0KLUZyaSBOb3YgIDUgMTE6NDk6NDcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGRvYyB0byBjb25maWdkaXJzLgotCSogTWFrZWZpbGUuaW4gKGluZm8gZHZpIGluc3RhbGwtaW5mbyBjbGVhbi1pbmZvKTogUmVjdXJzZSBpbnRvIGRvYy4KLQotRnJpIE9jdCAyMiAwNzo1NTowOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgKiB0byBlbmQgb2YgYWxsIE9TIG5hbWVzLgotCi1UdWUgT2N0ICA1IDEyOjMzOjUxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jOiBBZGQgc3R1ZmYgZm9yIEhJVVggdG8gcGxhY2Ugd2hlcmUgd2UgZGV0ZWN0IHRlcm1pbwotCXZzLiBzZ3R0eSAodWdoLCBidXQgSSBkb24ndCBzZWUgYSBzaW1wbGUgYmV0dGVyIHdheSkuCi0KLVdlZCBTZXAgMjkgMTE6MDI6NTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKHBhcnNlcl9pZik6IEZyZWUgdG5hbWUgd2hlbiBkb25lIHdpdGggaXQgKGNoYW5nZQotCWltcG9ydGVkIGZyb20gZnJvbSBiYXNoCTEuMTIgcmVhZGxpbmUpLgotCi1UdWUgU2VwICA3IDE3OjE1OjM3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG04OGstKi1zeXN2cjQqKTogQ29tbWVudCBvdXQgcHJldmlvdXMgY2hhbmdlLgotCi1GcmkgSnVsICAyIDExOjA1OjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICgqLSotcmlzY29zKik6IE5ldyBlbnRyeTsgdXNlIG1oLXN5c3YuCi0KLVdlZCBKdW4gMjMgMTM6MDA6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGNvbW1lbnQuCi0KLU1vbiBKdW4gMTQgMTQ6Mjg6NTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGVyaWMpCi0KLQkqIGNvbmZpZ3VyZS5pbiAobTg4ay0qLXN5c3ZyNCopOiBVc2Ugc3lzZGVwLW5vcm0uaC4KLQotU3VuIEp1biAxMyAxMzowNDowOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHtyZWFsLGRpc3R9Y2xlYW4pOiBSZW1vdmUgc3lzZGVwLmguCi0KLVRodSBKdW4gMTAgMTE6MjI6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgbW9zdGx5Y2xlYW4sIGRpc3RjbGVhbiwgYW5kIHJlYWxjbGVhbiB0YXJnZXRzLgotCi1GcmkgTWF5IDIxIDE3OjA5OjI4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtaXNjOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGl0LgotCi1TYXQgQXByIDE3IDAwOjQwOjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBjYWx2aW4pCi0KLQkqIHJlYWRsaW5lLmMsIGhpc3RvcnkuYzogRG9uJ3QgaW5jbHVkZSBzeXMvdHlwZXMuaDsgc3lzZGVwLmggZG9lcy4KLQotCSogY29uZmlnL21oLXN5c3Y6IERlZmluZSBUSU9DR1dJTlNaX0JST0tFTi4KLQlyZWFkbGluZS5jOiBDaGVjayBpdC4KLQotV2VkIE1hciAyNCAwMjowNjoxNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsY2hlY2sgJiBkdmkgdGFyZ2V0cwotCi1GcmkgTWFyIDEyIDE4OjM2OjUzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgKi0qLXNvbGFyaXMyKiBpbnN0ZWFkIG9mICotKi1zb2xhcmlzKiAoYQotCW51bWJlciBvZiBwZW9wbGUgd2FudCB0byBjYWxsIFN1bk9TIDQuMS4yICJzb2xhcmlzMS4wIgotCWFuZCBnZXQgaXQgcmlnaHQpCi0KLVR1ZSBNYXIgIDIgMjE6MjU6MzYgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHN5c2RlcC1zeXN2NC5oOiAgTmV3IGZpbGUgZm9yIFNWUjQuCi0JKiBjb25maWd1cmUuaW4gKCotKi1zeXN2NCopOiAgVXNlIHN5c2RlcC1zeXN2NC5oLgotCi0JKiBjb25maWd1cmUuaW4gKCotKi11bHRyaXgyKTogIEFkZCB0cmlwbGV0IGZyb20gTWljaGFlbCBSZW5kZWxsCi0JKG1pY2hhZWxAbWVyY3VyeS5jcy5tdW4uY2EpCi0KLVR1ZSBEZWMgMTUgMTI6Mzg6MTYgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1zY28zLjJ2NCopOiB1c2UgbWgtc2NvNC4KLQkqIGNvbmZpZy9taC1zY280OiBOZXcgZmlsZSwgbGlrZSBtaC1zY28gYnV0IHdpdGhvdXQgZGVmaW5pbmcKLQlfUE9TSVhfU09VUkNFLgotCi1XZWQgTm92IDExIDIxOjIwOjE0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZWZvcm1hdCB0byBvbmUtY2FzZS1wZXItbGluZS4KLQlIYW5kbGUgU3VuT1MgMy41LCBhcyBwZXIgS2FybCBCZXJyeSwgPGthcmxAY2xhdWRlLmNzLnVtYi5lZHU+LgotCi1XZWQgTm92ICA0IDE1OjMyOjMxIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHN5c2RlcC1ub3JtLmg6ICBSZW1vdmUgc29tZSBjcnVkLCBpbnN0YWxsIGRpcmUgd2FybmluZy4KLQotVGh1IE9jdCAyMiAwMTowODoxMyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBNYWtlIFNDTyB3b3JrIGFnYWluLi4uCi0KLU1vbiBPY3QgMTIgMTU6MDQ6MDcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChpbml0X3Rlcm1pbmFsX2lvKTogaWYgdGdldGVudCByZXR1cm5zIDAsIHRoZQotCXRlcm1pbmFsIHR5cGUgaXMgdW5rbm93bi4KLQotVGh1IE9jdCAgMSAyMzo0NDoxNCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdXNlIGNwdS12ZW5kb3Itb3MgdHJpcGxlIGluc3RlYWQgb2YgbmVzdGVkIGNhc2VzCi0KLVdlZCBTZXAgMzAgMTI6NTg6NTcgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAocmxfY29tcGxldGVfaW50ZXJuYWwpOiAgQ2FzdCBhbGxvY2EgdG8gKGNoYXIgKikgdG8KLQlhdm9pZCB3YXJuaW5nLgotCi1GcmkgU2VwIDI1IDEyOjQ1OjA1IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKGNsZWFyX3RvX2VvbCwgcmxfZ2VuZXJpY19iaW5kKTogIE1ha2Ugc3RhdGljLgotCShybF9kaWdpdF9sb29wKTogIEFkZCBhcmcgdG8gY2FsbCB0byBybF9tZXNzYWdlKCkuCi0JKiB2aV9tb2RlLmMgKHJsX3ZpX2ZpcnN0X3ByaW50KTogIEFkZCBhcmcgdG8gY2FsbCB0bwotCXJsX2JhY2tfdG9faW5kZW50KCkuCi0KLVdlZCBBdWcgMTkgMTQ6NTk6MDcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMsIHVzZSBmdWxsCi0JZmlsZSBuYW1lIGZvciBpbnN0YWxsIHRhcmdldC4KLQotV2VkIEF1ZyAxMiAxNTo1MDo1NyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAobGFzdF9yZWFkbGluZV9pbml0X2ZpbGUpOiAgRml4IHR5cG8gbWFkZSBieSBTdGV2ZQotCUNoYW1iZXJsYWluL0RKIERlbG9yaWUuICBQcm9wZXIgY29udHJvbCBmaWxlIG5hbWUgaXMgfi8uaW5wdXRyYywKLQlub3Qgfi9pbnB1dHJjLgotCi1UaHUgSnVuIDI1IDE2OjE1OjI3IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIE1ha2UgYnNkIGJhc2VkIHN5c3RlbXMgdXNlIHN5c2RlcC1vYnNkLmguCi0KLVR1ZSBKdW4gMjMgMjM6MjI6NTMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1wb3NpeDogIE5ldyBmaWxlLCBmb3IgUG9zaXgtY29tcGxpYW50IHN5c3RlbXMuCi0JKiBjb25maWd1cmUuaW46ICBVc2UgbWgtcG9zaXggZm9yIExpbnV4IChmcmVlIFVuaXggY2xvbmUpLgotCi1UdWUgSnVuIDIzIDIxOjU5OjIwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBzeXNkZXAtbm9ybS5oIChhbGxvY2EpOiAgUHJvdGVjdCBhZ2FpbnN0IHByZXZpb3VzIGRlZmluaXRpb24gYXMKLQlhIG1hY3JvIHdpdGggYXJndW1lbnRzLgotCi1GcmkgSnVuIDE5IDE1OjQ4OjU0IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHN5c2RlcC1vYnNkLmg6ICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IHRvIG1ha2UgdGhpcyBtb3JlIEtvc2hlci4KLQotRnJpIEp1biAxOSAxMjo1MzoyOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWFwb2xsbzY4diwgbWgtc2NvLCBtaC1zeXN2LCBtaC1zeXN2NH06IFJBTkxJQj10cnVlLgotCi1Nb24gSnVuIDE1IDEzOjUwOjM0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgbWgtc3lzdjQgb24gc29sYXJpczIKLQotTW9uIEp1biAxNSAxMjoyODoyNCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLW5jcjMwMDAgKElOU1RBTEwpOiAgRG9uJ3QgdXNlIC91c3IvdWNiL2luc3RhbGwsCi0JaXQgaXMgYnJva2VuIG9uIG5jciAzMDAwJ3MuCi0JKiBjb25maWcvbWgtbmNyMzAwMCAoUkFOTElCKTogIFVzZSBSQU5MSUI9dHJ1ZS4KLQotTW9uIEp1biAxNSAwMTozNTo1NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYzogTWFrZSBuZXcgU0lHTkFMU18qIG1hY3JvcyB0byBwYXJhbWV0ZXJpemUgdGhlIAotCXVnbHkgY2hhbmdlcyBpbiBzaWduYWwgYmxvY2tpbmcuICBVc2UgdGhlbSB0aHJvdWdob3V0LAotCXJlZHVjaW5nICNpZmRlZiBIQVZFX1BPU0lYX1NJR05BTFMgYW5kIEhBVkVfQlNEX1NJR05BTFMgY2x1dHRlcgotCXNpZ25pZmljYW50bHkuICBNYWtlIGFsbCBzdWNoIHBsYWNlcyB1c2UgUE9TSVggaWYgYXZhaWxhYmxlLAotCXRvIGF2b2lkIGxvc2luZyB3aXRoIHBvb3IgYHNpZ3NldG1hc2snIGVtdWxhdGlvbiBmcm9tIGxpYmliZXJ0eS4KLQotU3VuIEp1biAxNCAxNToxOTo1MSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChpbnNlcnRfc29tZV9jaGFycyk6ICBSZXR1cm4gdm9pZC4KLQotVGh1IEp1biAxMSAwMToyNzo0NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYzogICN1bmRlZiBQQywgd2hpY2ggU29sYXJpczIgZGVmaW5lcyBpbiBzeXMvdHlwZXMuaCwKLQljbG9iYmVyaW5nIHRoZSB0ZXJtY2FwIGdsb2JhbCB2YXJpYWJsZSBQQy4KLQotVHVlIEp1biAgOSAxNzozMDoyMyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3ttaC1uY3IzMDAwLCBtaC1zeXN2NH06ICBDaGFuZ2UgSU5TVEFMTCB0byB1c2UKLQkvdXNyL3VjYi9pbnN0YWxsLgotCi1Nb24gSnVuICA4IDIzOjEwOjA3IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5oIChybF9jb21wbGV0ZXJfcXVvdGVfY2hhcmFjdGVycyk6ICBBZGQgZGVjbGFyYXRpb24uCi0JKiByZWFkbGluZS5jIChybF9jb21wbGV0ZXJfcXVvdGVfY2hhcmFjdGVycyk6ICBBZGQgZ2xvYmFsIHZhci4KLQkqIHJlYWRsaW5lLmMgKHN0cnBicmspOiAgQWRkIHByb3RvdHlwZSBhbmQgZnVuY3Rpb24uCi0JKiByZWFkbGluZS5jIChybF9jb21wbGV0ZV9pbnRlcm5hbCk6ICBBZGQgY29kZSB0byBoYW5kbGUKLQlleHBhbnNpb24gb2YgcXVvdGVkIHN0cmluZ3MuCi0KLU1vbiBNYXkgMTEgMTI6Mzk6MzAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmM6ICBDYW4ndCBpbml0aWFsaXplIEZJTEUgKidzIHdpdGggc3RkaW4gYW5kIHN0ZG91dCwKLQliZWNhdXNlIHRoZXkgbWlnaHQgbm90IGJlIGNvbnN0YW50LiAgUGF0Y2ggZnJvbSBUb20gUXVpbm4sCi0JdHJxQGRpbm95c29zLnRocGh5cy5veC5hYy51ay4KLQotVHVlIEFwciAyOCAyMTo1MjozNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuaDogIERlY2xhcmUgcmxfZXZlbnRfaG9vayAod2hpY2ggYWxyZWFkeSBleGlzdGVkKS4KLQlTdWdnZXN0ZWQgYnkgQ2hyaXN0b3BoIFRpZXR6IDx0aWV0ekB6aS5nbWQuZGJwLmRlPi4KLQotV2VkIEFwciAyMiAxODowODowMSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIHN1YmRpcnMgZGVjbGFyYXRpb24uICBUaGUgb2Jzb2xldGUgc2VtYW50aWMKLQkgIGZvciBzdWJkaXJzIGhhcyBiZWVuIHVzdXJwZWQgYnkgcGVyJ3MgbmV3IG1lYW5pbmcuCi0KLVR1ZSBBcHIgMjEgMTE6NTQ6MjMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZXdvcmsgQ0ZMQUdTIHNvIHRoYXQgdGhleSBjYW4gYmUgc2V0IG9uIHRoZQotCSAgY29tbWFuZCBsaW5lIHRvIG1ha2UuICBSZW1vdmUgTUlOVVNfRy4gIERlZmF1bHQgQ0ZMQUdTIHRvIC1nLgotCi1GcmkgQXByIDEwIDIzOjAyOjI3IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZWNvZ25pemUgbmV3IG5jcjMwMDAgY29uZmlnLgotCSogY29uZmlnL21oLW5jcjMwMDA6ICBOZXcgTkNSIDMwMDAgY29uZmlnIGZpbGUuCi0KLVdlZCBNYXIgMjUgMTA6NDY6MzAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGhpc3RvcnkuYyAoc3RpZmxlX2hpc3RvcnkpOiAgTmVnYXRpdmUgYXJnIHRyZWF0ZWQgYXMgemVyby4KLQotVHVlIE1hciAyNCAyMzo0NjoyMCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXN5c3Y6IElOU1RBTExfUFJPRyAtPiBJTlNUQUxMLgotCi1Nb24gRmViIDEwIDAxOjQxOjM1IDE5OTIgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiBoaXN0b3J5LmMgKGhpc3RvcnlfZG9fd3JpdGUpIEJ1aWxkIGEgYnVmZmVyIG9mIGFsbCBvZiB0aGUgbGluZXMKLQl0byB3cml0ZSBhbmQgd3JpdGUgdGhlbSBpbiBvbmUgZmVsbCBzd29vcCAobG93ZXIgb3ZlcmhlYWQgdGhhbgotCWNhbGxpbmcgd3JpdGUgKCkgZm9yIGVhY2ggbGluZSkuICBTdWdnZXN0ZWQgYnkgUGV0ZXIgSG8uCi0KLQkqIHZpX21vZGUuYyAocmxfdmlfc3Vic3QpIERvbid0IGZvcmdldCB0byBlbmQgdGhlIHVuZG8gZ3JvdXAuCi0KLVNhdCBNYXIgIDcgMDA6MTU6MzYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIEZJWE1FJ3Mgb24gaW5mbyBhbmQgaW5zdGFsbC1pbmZvIHRhcmdldHMuCi0KLUZyaSBNYXIgIDYgMjI6MDI6MDQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjaGVjayB0YXJnZXQuCi0KLVdlZCBGZWIgMjYgMTg6MDQ6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi1GcmkgRmViIDIxIDE0OjM3OjMyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jLCBleGFtcGxlcy9maWxlbWFuLmM6IHBhdGNoZXMgZnJvbSBESiB0byBzdXBwb3J0IERPUwotCi1UaHUgRmViIDIwIDIzOjIzOjE2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKHJsX3JlYWRfaW5pdF9maWxlKTogIE1ha2Ugc3VyZSB0aGF0IG51bGwgZmlsZW5hbWUgaXMKLQlub3QgcGFzc2VkIHRvIG9wZW4oKSBvciBlbHNlIHdlIGVuZCB1cCBvcGVuaW5nIHRoZSBkaXJlY3RvcnksIGFuZAotCXJlYWQgYSBidW5jaCBvZiBnYXJiYWdlIGludG8ga2V5bWFwW10uCi0KLU1vbiBGZWIgMTcgMTc6MTU6MDkgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKHJlYWRsaW5lX2RlZmF1bHRfYmluZGluZ3MpOiAgT25seSBtYWtlIHVzZSBvZiBWTE5FWFQKLQl3aGVuIGJvdGggVkxORVhUIGFuZCBURVJNSU9TX1RUWV9EUklWRVIgaXMgZGVmaW5lZC4gIE9uIFNWUjQKLQk8dGVybWlvLmg+IGluY2x1ZGVzIDx0ZXJtaW9zLmg+LCBzbyBWTE5FWFQgaXMgYWx3YXlzIGRlZmluZWQuCi0KLQkqIHN5c2RlcC1ub3JtLmggKF9QT1NJWF9WRVJTSU9OKTogIERlZmluZSB0aGlzIGZvciBhbGwgU1ZSNAotCXN5c3RlbXMgc28gdGhhdCA8dGVybWlvcy5oPiBnZXRzIHVzZWQsIGluc3RlYWQgb2YgPHRlcm1pby5oPi4KLQotRnJpIERlYyAyMCAxMjowNDozMSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQ2hhbmdlIHN2cjQgcmVmZXJlbmNlcyB0byBzeXN2NC4KLQotVHVlIERlYyAxMCAwNDowNzoyMCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbmZvZGlyIGJlbG9uZ3MgaW4gZGF0YWRpci4KLQotRnJpIERlYyAgNiAyMzoyMzoxNCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgc3BhY2VzIGZvbGxvd2luZyBoeXBoZW5zLCBic2QgbWFrZSBjYW4ndAotCSAgY29wZS4gYWRkZWQgY2xlYW4taW5mby4gIGFkZGVkIHN0YW5kYXJkcy50ZXh0IHN1cHBvcnQuICBEb24ndAotCSAga25vdyBob3cgdG8gbWFrZSBpbmZvIGFueW1vcmUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogY29tbW9udGFyZ2V0cyBpcyBubyBsb25nZXIgYSByZWNvZ25pemVkIGhvb2ssIHNvCi0JICByZW1vdmUgaXQuICBuZXcgc3ViZGlyIGNhbGxlZCBkb2MuCi0KLVRodSBEZWMgIDUgMjI6NDY6MTAgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaWRlc3RkaXIgYW5kIGRkZXN0ZGlyIGdvIGF3YXkuICBBZGRlZCBjb3B5cmlnaHRzCi0JICBhbmQgc2hpZnQgZ3BsIHRvIHYyLiAgQWRkZWQgQ2hhbmdlTG9nIGlmIGl0IGRpZG4ndCBleGlzdC4gZG9jZGlyCi0JICBhbmQgbWFuZGlyIG5vdyBrZXllZCBvZmYgZGF0YWRpciBieSBkZWZhdWx0LgotCi1GcmkgTm92IDIyIDA5OjAyOjMyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzeXNkZXAtb2JzZC5oOiAgUmVuYW1lIGZyb20gc3lzZGVwLW5ld3Nvcy5oLgotCSogY29uZmlndXJlLmluOiAgVXNlIHN5c2RlcC1vYnNkIGZvciBNYWNoIGFzIHdlbGwgYXMgTkVXcy4KLQotCSogc3lzZGVwLW5vcm0uaCwgc3lzZGVwLWFpeC5oOiAgQWRkIDxzeXMvdHlwZXMuaD4sIHdoaWNoIFBPU0lYCi0JcmVxdWlyZXMgdG8gbWFrZSA8ZGlyZW50Lmg+IHdvcmsuICBJbXByb3ZlIFN1biBhbGxvY2EgZGVjbC4KLQotVGh1IE5vdiAyMSAxODo0ODowOCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBDbGVhbiB1cCAuLi9nbG9iL3RpbGRlLmMgLT4gdGlsZGUubyBwYXRoLgotCUNsZWFuIHVwIG1ha2VmaWxlIGEgYml0IGluIGdlbmVyYWwuCi0KLVRodSBOb3YgMjEgMTQ6NDA6MjkgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWcvbWgtc3ZyNDogIE1ha2UgU1ZSNCB3b3JrLgotCi0JKiByZWFkbGluZS5jOiAgTW92ZSBjb25maWcgc3R1ZmYgdG8gc3lzZGVwLmgsIHVzZSB0eXBlZGVmIGRpcmVudAotCWNvbnNpc3RlbnRseSwgcmVtb3ZlIHJlZnMgdG8gZF9uYW1sZW4gKCYgRF9OQU1MRU4pIHRvIGltcHJvdmUKLQlwb3J0YWJpbGl0eS4gIEFsc28sIHVwZGF0ZSBjb3B5cmlnaHQgbm90aWNlLgotCXJlYWRsaW5lLmg6ICByZW1vdmUgY29uZmlnIHN0dWZmIHRoYXQgSSBhZGRlZCBlcnJvbmVvdXNseSBpbiB0aGUKLQlmaXJzdCBwbGFjZS4KLQotCSogZW1hY3Nfa2V5bWFwLmMsIGZ1bm1hcC5jLCBoaXN0b3J5LmMsIGtleW1hcHMuYywgdmlfa2V5bWFwLmMsCi0JdmlfbW9kZS5jOiAgbW92ZSBjb25maWcgc3R1ZmYgdG8gc3lzZGVwLmgsIHVwZGF0ZSBjb3B5cmlnaHQgbm90aWNlcy4KLQotVHVlIE5vdiAxOSAxNTowMjoxMyAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBoaXN0b3J5LmM6ICAjaW5jbHVkZSAic3lzZGVwLmgiLgotCi1UdWUgTm92IDE5IDEwOjQ5OjE3IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnL2htLXN5c3YsIGNvbmZpZy9obS1zY286ICBDaGFuZ2UgU1lTViB0bwotCVVTRyB0byBtYXRjaCBjdXJyZW50IHVzYWdlLgotCi0JKiByZWFkbGluZS5jOiAgQWRkIFVTR3I0IHRvIGxpc3Qgb2YgZGVmaW5lZCB0aGluZ3MgdG8gY2hlY2sgZm9yCi0JdG8gdXNlIDxkaXJlbnQuaD4gc3R5bGUgZGlyZWN0b3J5IGFjY2Vzcy4KLQotCSogY29uZmlnL2htLXN2cjQ6ICBOZXcgZmlsZSBmb3IgU3lzdGVtIFYgUmVsZWFzZSA0IChVU0dyNCkuCi0KLU1vbiBOb3YgMTggMjM6NTk6NTIgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAoZmlsZW5hbWVfY29tcGxldGlvbl9mdW5jdGlvbik6ICB1c2Ugc3RydWN0IGRpcmVudAotCWluc3RlYWQJb2Ygc3RydWN0IGRpcmVjdC4KLQotRnJpIE5vdiAgMSAwNzowMjoxMyAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYyAocmxfdHJhbnNsYXRlX2tleXNlcSkgTWFrZSBDLT8gdHJhbnNsYXRlIHRvIFJVQk9VVAotCXVuY29uZGl0aW9uYWxseS4KLQotTW9uIE9jdCAyOCAxMTozNDo1MiAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzsgVXNlIFBvc2l4IGRpcmVjdG9yeSByb3V0aW5lcyBhbmQgbWFjcm9zLgotCi0JKiBmdW5tYXAuYzsgQWRkIGVudHJ5IGZvciBjYWxsLWxhc3Qta2JkLW1hY3JvLgotCi0JKiByZWFkbGluZS5jIChybF9wcmVwX3Rlcm0pOyBVc2Ugc3lzdGVtIEVPRiBjaGFyYWN0ZXIgb24gUE9TSVgKLQlzeXN0ZW1zIGFsc28uCi0KLVRodSBPY3QgIDMgMTY6MTk6NTMgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM7IE1ha2UgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGhhdmluZyBhIFRFUk1JT1MgdHR5Ci0JZHJpdmVyLCBhbmQgaGF2aW5nIFBPU0lYIHNpZ25hbCBoYW5kbGluZy4gIFlvdSBtaWdodCBvbmUgd2l0aG91dAotCXRoZSBvdGhlci4gIE5ldyBkZWZpbmVzIHVzZWQgSEFWRV9QT1NJWF9TSUdOQUxTLCBhbmQKLQlURVJNSU9TX1RUWV9EUklWRVIuCi0KLVR1ZSBKdWwgMzAgMjI6Mzc6MjYgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM6IHJsX2dldGMgKCkgSWYgYSBjYWxsIHRvIHJlYWQgKCkgcmV0dXJucyB3aXRob3V0IGFuCi0JZXJyb3IsIGJ1dCB3aXRoIHplcm8gY2hhcmFjdGVycywgdGhlIGZpbGUgaXMgZW1wdHksIHNvIHJldHVybiBFT0YuCi0KLVRodSBKdWwgMTEgMjA6NTg6MzggMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM6IChybF9nZXRfbmV4dF9oaXN0b3J5LCBybF9nZXRfcHJldmlvdXNfaGlzdG9yeSkKLQlSZWFsbG9jYXRlIHRoZSBidWZmZXIgc3BhY2UgaWYgdGhlIGxpbmUgYmVpbmcgbW92ZWQgdG8gaXMgbG9uZ2VyCi0JdGhlIHRoZSBjdXJyZW50IHNwYWNlIGFsbG9jYXRlZC4gIEFtYXppbmcgdGhhdCBubyBvbmUgaGFzIGZvdW5kCi0JdGhpcyBidWcgdW50aWwgbm93LgotCi1TdW4gSnVsICA3IDAyOjM3OjA1IDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOihybF9wYXJzZV9hbmRfYmluZCkgQWxsb3cgbGVhZGluZyB3aGl0ZXNwYWNlLgotCSAgTWFrZSBzdXJlIFRFUk1JTyBhbmQgVEVSTUlPUyBzeXN0ZW1zIHRyZWF0IENSIGFuZCBOTAotCSAgZGlzY3RpbmN0bHkuCi0JCi1UdWUgSnVuIDI1IDA0OjA5OjI3IDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOiBSZXdvcmsgcGFyc2luZyBjb25kaXRpb25hbHMgdG8gcGF5IGF0dGVudGlvbiB0byB0aGUKLQlwcmlvciBzdGF0ZXMgb2YgdGhlIGNvbmRpdGlvbmFsIHN0YWNrLiAgVGhpcyBtYWtlcyAkaWYgc3RhdGVtZW50cwotCXdvcmsgY29ycmVjdGx5LgotCi1Nb24gSnVuIDI0IDIwOjQ1OjU5IDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOiBzdXBwb3J0IGZvciBkaXNwbGF5aW5nIGtleSBiaW5kaW5nIGluZm9ybWF0aW9uCi0JaW5jbHVkZXMgdGhlIGZ1bmN0aW9ucyBybF9saXN0X2Z1bm1hcF9uYW1lcyAoKSwKLQlpbnZva2luZ19rZXlzZXFzX2luX21hcCAoKSwgcmxfaW52b2tpbmdfa2V5c2VxcyAoKSwKLQlybF9kdW1wX2Z1bmN0aW9ucyAoKSwgYW5kIHJsX2Z1bmN0aW9uX2R1bXBlciAoKS4KLQotCWZ1bm1hcC5jOiBzdXBwb3J0IGZvciBzYW1lIGluY2x1ZGVzIHJsX2Z1bm1hcF9uYW1lcyAoKS4KLQotCXJlYWRsaW5lLmMsIGZ1bm1hcC5jOiBubyBsb25nZXIgZGVmaW5lIFNUQVRJQ19NQUxMT0MuICBIb3dldmVyLAotCXVwZGF0ZSBib3RoIHZlcnNpb24gb2YgeHJlYWxsb2MgKCkgdG8gaGFuZGxlIGEgbnVsbCBwb2ludGVyLgotCi1UaHUgQXByIDI1IDEyOjAzOjQ5IDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiB2aV9tb2RlLmMgKHJsX3ZpX2Z3b3JkLCBmV29yZCwgZXRjLiAgQWxsIGZ1bmN0aW9ucyB1c2UKLQl0aGUgbWFjcm8gYGlzaWRlbnQoKScuICBGaXhlZCBtb3ZlbWVudCBidWcgd2hpY2ggcHJldmVudHMKLQljb250aW5pb3VzIG1vdmVtZW50IHRocm91Z2ggdGhlIHRleHQuCi0KLUZyaSBKdWwgMjcgMTY6NDc6MDEgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmMgKHBhcnNlcl9pZikgQWxsb3cgIiRpZiB0ZXJtPWZvbyIgY29uc3RydWN0LgotCi1XZWQgTWF5IDIzIDE2OjEwOjMzIDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jIChybF9kaXNwYXRjaCkgQ29ycmVjdGx5IHJlbWVtYmVyIHRoZSBsYXN0IGNvbW1hbmQKLQlleGVjdXRlZC4gIEZpeGVkIHR5cG8gaW4gdXNlcm5hbWVfY29tcGxldGlvbl9mdW5jdGlvbiAoKS4KLQotTW9uIEFwciAgOSAxOTo1NTo0OCAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzogdXNlcm5hbWVfY29tcGxldGlvbl9mdW5jdGlvbiAoKTsgRm9yIHRleHQgcGFzc2VkIGluCi0Jd2l0aCBhIGxlYWRpbmcgYH4nLCByZW1lbWJlciB0aGF0IHRoaXMgY291bGQgYmUgYSBmaWxlbmFtZSAoYWZ0ZXIKLQlpdCBpcyBjb21wbGV0ZWQpLgotCi1UaHUgQXByICA1IDEzOjQ0OjI0IDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOiBybF9zZWFyY2hfaGlzdG9yeSAoKTogQ29ycmVjdGx5IGhhbmRsZSBjYXNlIG9mIGFuCi0JdW5mb3VuZCBzZWFyY2ggc3RyaW5nLCBidXQgYSBncmFjZWZ1bCBleGl0IChhcyB3aXRoIEVTQykuCi0KLQkqIHJlYWRsaW5lLmM6IHJsX3Jlc3RhcnRfb3V0cHV0ICgpOyAgVGhlIEFwb2xsbyBwYXNzZXMgdGhlIGFkZHJlc3MKLQlvZiB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIFRJT0NTVEFSVCwgbm90IHRoZSBkZXNjcmlwdG9yIGl0c2VsZi4KLQotVHVlIE1hciAyMCAwNTozODo1NSAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzogcmxfY29tcGxldGUgKCk7IHNlY29uZCBjYWxsIGluIGEgcm93IGNhdXNlcyBwb3NzaWJsZQotCWNvbXBsZXRpb25zIHRvIGJlIGxpc3RlZC4KLQotCSogcmVhZGxpbmUuYzogcmxfcmVkaXNwbGF5ICgpLCBhZGRlZCBwcm9tcHRfdGhpc19saW5lIHZhcmlhYmxlCi0Jd2hpY2ggaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBjaGFyYWN0ZXIgZm9sbG93aW5nIFxuIGluIHByb21wdC4KLQotU3VuIE1hciAxMSAwNDozMjowMyAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogU2lnbmFscyBhcmUgbm93IHN1cHBvc2VkbHkgaGFuZGxlZCBpbnNpZGUgb2YgU1lTViBjb21waWxhdGlvbi4KLQotV2VkIEphbiAxNyAxOToyNDowOSAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IHNicGh5LnVjc2IuZWR1KQotCi0JKiBoaXN0b3J5LmM6IGhpc3RvcnlfZXhwYW5kICgpOyBmaXhlZCBvdmVyd3JpdGluZyBtZW1vcnkgZXJyb3IsCi0JYWRkZWQgbmVlZGVkIGFyZ3VtZW50IHRvIGNhbGwgdG8gZ2V0X2hpc3RvcnlfZXZlbnQgKCkuCi0KLVRodSBKYW4gMTEgMTA6NTQ6MDQgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBzYnBoeS51Y3NiLmVkdSkKLQotCSogcmVhZGxpbmUuYzogYWRkZWQgbWFya19tb2RpZmllZF9saW5lcyB0byBjb250cm9sIHRoZQotCWRpc3BsYXkgb2YgYW4gYXN0ZXJpc2sgb24gbW9kaWZpZWQgaGlzdG9yeSBsaW5lcy4gIEFsc28KLQlhZGRlZCBhIHVzZXIgdmFyaWFibGUgY2FsbGVkIG1hcmstbW9kaWZpZWQtbGluZXMgdG8gdGhlCi0JYHNldCcgY29tbWFuZC4KLQotVGh1IEphbiAgNCAxMDozODowNSAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IHNicGh5LnVjc2IuZWR1KQotCi0JKiByZWFkbGluZS5jOiBzdGFydF9pbnNlcnQgKCkuICBPbmx5IHVzZSBJQyBpZiB3ZSBkb24ndCBoYXZlIGFuIGltCi0JY2FwYWJpbGl0eS4KLQotRnJpIFNlcCAgOCAwOTowMDo0NSAxOTg5ICBCcmlhbiBGb3ggIChiZm94IGF0IGF1cmVsKQotCi0JKiByZWFkbGluZS5jOiBybF9wcmVwX3Rlcm1pbmFsICgpLiAgT25seSB0dXJuIG9uIDh0aCBiaXQKLQkgIGFzIG1ldGEtYml0IGlmZiB0aGUgdGVybWluYWwgaXMgbm90IHVzaW5nIHBhcml0eS4KLQotU3VuIFNlcCAgMyAwODo1Nzo0MCAxOTg5ICBCcmlhbiBGb3ggIChiZm94IGF0IGF1cmVsKQotCi0JKiByZWFkbGluZS5jOiBzdGFydF9pbnNlcnQgKCkuICBVc2VzIG11bHRpcGxlCi0JICBpbnNlcnRpb24gY2FsbCBpbiBjYXNlcyB3aGVyZSB0aGF0IG1ha2VzIHNlbnNlLgotCi0JICBybF9pbnNlcnQgKCkuICBSZWFkIHR5cGUtYWhlYWQgYnVmZmVyIGZvciBhZGRpdGlvbmFsCi0JICBrZXlzIHRoYXQgYXJlIGJvdW5kIHRvIHJsX2luc2VydCwgYW5kIGluc2VydCB0aGVtCi0JICBhbGwgYXQgb25jZS4gIE1ha2UgaW5zZXJ0aW9uIG9mIHNpbmdsZSBrZXlzIGdpdmVuCi0JICB3aXRoIGFuIGFyZ3VtZW50IG11Y2ggbW9yZSBlZmZpY2llbnQuCi0KLVR1ZSBBdWcgIDggMTg6MTM6NTcgMTk4OSAgQnJpYW4gRm94ICAoYmZveCBhdCBhdXJlbCkKLQotCSogcmVhZGxpbmUuYzogQ2hhbmdlZCBoYW5kbGluZyBvZiBFT0YuICByZWFkbGluZSAoKSByZXR1cm5zCi0JIChjaGFyICopRU9GIG9yIGNvbnNlZCBzdHJpbmcuICBUaGUgRU9GIGNoYXJhY3RlciBpcyByZWFkIGZyb20gdGhlCi0JIHR0eSwgb3IgaWYgdGhlIHR0eSBkb2Vzbid0IGhhdmUgb25lLCBkZWZhdWx0cyB0byBDLWQuCi0KLQkqIHJlYWRsaW5lLmM6IEFkZGVkIHN1cHBvcnQgZm9yIGV2ZW50IGRyaXZlbiBwcm9ncmFtcy4KLQkgIHJsX2V2ZW50X2hvb2sgaXMgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiB5b3Ugd2FudCBjYWxsZWQKLQkgIHdoaWxlIFJlYWRsaW5lIGlzIHdhaXRpbmcgZm9yIGlucHV0LgotCi0JKiByZWFkbGluZS5jOiBDbGVhbnVwIHRpbWUuICBGdW5jdGlvbnMgd2l0aG91dCB0eXBlIGRlY2xhcmF0aW9ucwotCSAgZG8gbm90IHVzZSByZXR1cm4gd2l0aCBhIHZhbHVlLgotCi0JKiBoaXN0b3J5LmM6IGhpc3RvcnlfZXhwYW5kICgpIGhhcyBuZXcgdmFyaWFibGUgd2hpY2ggaXMgdGhlCi0JICBjaGFyYWN0ZXJzIHRvIGlnbm9yZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgaGlzdG9yeV9leHBhbnNpb25fY2hhci4KLQotU3VuIEp1bCAxNiAwODoxNDowMCAxOTg5ICBCcmlhbiBGb3ggIChiZm94IGF0IGF1cmVsKQotCi0JKiBybF9wcmVwX3Rlcm1pbmFsICgpCi0JICBCU0QgdmVyc2lvbiB0dXJucyBvZmYgQy1zLCBDLXEsIEMteSwgQy12LgotCi0JKiByZWFkbGluZS5jIC0tIHJsX3ByZXBfdGVybWluYWwgKCkKLQkgIFNZU1YgdmVyc2lvbiBoYWNrcyByZWFkbGluZV9lY2hvaW5nX3AuCi0JICBCU0QgdmVyc2lvbiB0dXJucyBvbiBwYXNzaW5nIG9mIHRoZSA4dGggYml0IGZvciB0aGUgZHVyYXRpb24KLQkgIG9mIHJlYWRpbmcgdGhlIGxpbmUuCi0KLVR1ZSBKdWwgMTEgMDY6MjU6MDEgMTk4OSAgQnJpYW4gRm94ICAoYmZveCBhdCBhdXJlbCkKLQotCSogcmVhZGxpbmUuYzogbmV3IHZhcmlhYmxlIHJsX3RpbGRlX2V4cGFuZGVyLgotCSAgSWYgbm9uLW51bGwsIHRoaXMgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiB0byBjYWxsIGlmCi0JICB0aGUgc3RhbmRhcmQgbWVhbmluZyBmb3IgZXhwYW5kaW5nIGEgdGlsZGUgZmFpbHMuICBUaGUgZnVuY3Rpb24gaXMKLQkgIGNhbGxlZCB3aXRoIHRoZSB0ZXh0IHNhbnMgdGlsZGUgKGFzIGluICJmb28iKSwgYW5kIHJldHVybnMgYQotCSAgbWFsbG9jKCknZWQgc3RyaW5nIHdoaWNoIGlzIHRoZSBleHBhbnNpb24sIG9yIGEgTlVMTCBwb2ludGVyIGlmCi0JICB0aGVyZSBpcyBubyBleHBhbnNpb24uIAotCi0JKiByZWFkbGluZS5oIC0gbmV3IGZpbGUgY2hhcmRlZnMuaAotCSAgU2VwYXJhdGVzIHRoaW5ncyB0aGF0IG9ubHkgcmVhZGxpbmUuYyBuZWVkcyBmcm9tIHRoZSBzdGFuZGFyZAotCSAgaGVhZGVyIGZpbGUgcHVibGlzaGluZyBpbnRlcmVzdGluZyB0aGluZ3MgYWJvdXQgcmVhZGxpbmUuCi0KLQkqIHJlYWRsaW5lLmM6Ci0JICByZWFkbGluZV9kZWZhdWx0X2JpbmRpbmdzICgpIG5vdyBsb29rcyBhdCB0ZXJtaW5hbCBjaGFyYXJhY3RlcnMKLQkgIGFuZCBiaW5kcyB0aG9zZSBhcyB3ZWxsLgotCi1XZWQgSnVuIDI4IDIwOjIwOjUxIDE5ODkgIEJyaWFuIEZveCAgKGJmb3ggYXQgYXVyZWwpCi0KLQkqIE1hZGUgcmVhZGxpbmUgYW5kIGhpc3RvcnkgaW50byBpbmRlcGVuZGVudCBsaWJyYXJpZXMuCi0KZGlmZiAtLWdpdCBhL3NldHVwLmNvbSBiL3NldHVwLmNvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUzYWZkNS4uMDAwMDAwMAotLS0gYS9zZXR1cC5jb20KKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSQhIHNldHVwIGZpbGVzIGZvciBvcGVuVk1TL0FscGhhCi0kIQotJCBkZWZpbmUgYW91dCBbLS5JTkNMVURFLkFPVVRdCi0kIGRlZmluZSBjb2ZmIFstLklOQ0xVREUuQ09GRl0KLSQgZGVmaW5lIGVsZiBbLS5JTkNMVURFLkVMRl0KLSQgZGVmaW5lIG1wdyBbLS5JTkNMVURFLk1QV10KLSQgZGVmaW5lIG5sbSBbLS5JTkNMVURFLk5MTV0KLSQgZGVmaW5lIG9wY29kZSBbLS5JTkNMVURFLk9QQ09ERV0KZGlmZiAtLWdpdCBhL3N5bWxpbmstdHJlZSBiL3N5bWxpbmstdHJlZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDk2NTgyZC4uMDAwMDAwMAotLS0gYS9zeW1saW5rLXRyZWUKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIS9iaW4vc2gKLSMgQ3JlYXRlIGEgc3ltbGluayB0cmVlLgotIwotIyBTeW50YXg6IHN5bWxpbmstdHJlZSBzcmNkaXIgImlnbm9yZTEgaWdub3JlMiAuLi4iCi0jCi0jIHdoZXJlIHNyY2RpciBpcyB0aGUgZGlyZWN0b3J5IHRvIGNyZWF0ZSBhIHN5bWxpbmsgdHJlZSB0bywKLSMgYW5kICJpZ25vcmVOIiBpcyBhIGxpc3Qgb2YgZmlsZXMvZGlyZWN0b3JpZXMgdG8gaWdub3JlLgotCi1wcm9nPSQwCi1zcmNkaXI9JDEKLWlnbm9yZT0iJDIiCi0KLWlnbm9yZV9hZGRpdGlvbmFsPSIuIC4uIENWUyIKLQotIyBJZiB3ZSB3ZXJlIGludm9rZWQgd2l0aCBhIHJlbGF0aXZlIHBhdGggbmFtZSwgYWRqdXN0ICR7cHJvZ30gdG8gd29yawotIyBpbiBzdWJkaXJzLgotY2FzZSAke3Byb2d9IGluCi0vKikgOzsKLSopIHByb2c9Li4vJHtwcm9nfSA7OwotZXNhYwotCi0jIFNldCBuZXdzcmNkaXIgdG8gc29tZXRoaW5nIHN1YmRpcmVjdG9yaWVzIGNhbiB1c2UuCi1jYXNlICR7c3JjZGlyfSBpbgotLyopIG5ld3NyY2Rpcj0ke3NyY2Rpcn0gOzsKLSopIG5ld3NyY2Rpcj0uLi8ke3NyY2Rpcn0gOzsKLWVzYWMKLQotZm9yIGYgaW4gYGxzIC1hICR7c3JjZGlyfWA7IGRvCi0gIGlmIFsgLWQgJHtzcmNkaXJ9LyRmIF07IHRoZW4KLSAgICBmb3VuZD0KLSAgICBmb3IgaSBpbiAke2lnbm9yZX0gJHtpZ25vcmVfYWRkaXRpb25hbH07IGRvCi0gICAgICBpZiBbICIkZiIgPSAiJGkiIF07IHRoZW4KLQlmb3VuZD15ZXMKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIGlmIFsgLXogIiR7Zm91bmR9IiBdOyB0aGVuCi0gICAgICBlY2hvICIkZgkJLi53b3JraW5nIGluIgotICAgICAgaWYgWyAtZCAkZiBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgJGY7IGZpCi0gICAgICAoY2QgJGY7ICR7cHJvZ30gJHtuZXdzcmNkaXJ9LyRmICIke2lnbm9yZX0iKQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkZgkJLi5saW5rZWQiCi0gICAgcm0gLWYgJGYKLSAgICBsbiAtcyAke3NyY2Rpcn0vJGYgLgotICBmaQotZG9uZQotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3lsd3JhcCBiL3lsd3JhcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjI4OGNjZC4uMDAwMDAwMAotLS0gYS95bHdyYXAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyB5bHdyYXAgLSB3cmFwcGVyIGZvciBsZXgveWFjYyBpbnZvY2F0aW9ucy4KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBXcml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBVc2FnZToKLSMgICAgIHlsd3JhcCBQUk9HUkFNIElOUFVUIFtPVVRQVVQgREVTSVJFRF0uLi4gLS0gW0FSR1NdLi4uCi0jICogUFJPR1JBTSBpcyBwcm9ncmFtIHRvIHJ1bi4KLSMgKiBJTlBVVCBpcyB0aGUgaW5wdXQgZmlsZQotIyAqIE9VVFBVVCBpcyBmaWxlIFBST0cgZ2VuZXJhdGVzCi0jICogREVTSVJFRCBpcyBmaWxlIHdlIGFjdHVhbGx5IHdhbnQKLSMgKiBBUkdTIGFyZSBwYXNzZWQgdG8gUFJPRwotIyBBbnkgbnVtYmVyIG9mIE9VVFBVVCxERVNJUkVEIHBhaXJzIG1heSBiZSB1c2VkLgotCi0jIFRoZSBwcm9ncmFtIHRvIHJ1bi4KLXByb2c9IiQxIgotc2hpZnQKLSMgTWFrZSBhbnkgcmVsYXRpdmUgcGF0aCBpbiAkcHJvZyBhYnNvbHV0ZS4KLWNhc2UgIiRwcm9nIiBpbgotIC8qIHwgW0EtWmEtel06XFwqKSA7OwotICovKikgcHJvZz0iYHB3ZGAvJHByb2ciIDs7Ci1lc2FjCi0KLSMgVGhlIGlucHV0LgotaW5wdXQ9IiQxIgotc2hpZnQKLWNhc2UgIiRpbnB1dCIgaW4KLSAvKiB8IFtBLVphLXpdOlxcKikKLSAgICAjIEFic29sdXRlIHBhdGg7IGRvIG5vdGhpbmcuCi0gICAgOzsKLSAqKQotICAgICMgUmVsYXRpdmUgcGF0aC4gIE1ha2UgaXQgYWJzb2x1dGUuICBXaHk/ICBCZWNhdXNlIG90aGVyd2lzZSBhbnkKLSAgICAjIGRlYnVnZ2luZyBpbmZvIGluIHRoZSBnZW5lcmF0ZWQgZmlsZSB3aWxsIHBvaW50IHRvIHRoZSB3cm9uZwotICAgICMgcGxhY2UuICBUaGlzIGlzIHJlYWxseSBncm9zcy4KLSAgICBpbnB1dD0iYHB3ZGAvJGlucHV0IgotICAgIDs7Ci1lc2FjCi0KLSMgV2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIGFic29sdXRlIHBhdGggaWYgdGhlIGlucHV0IGluIHRoZSBjdXJyZW50Ci0jIGRpcmVjdG9yeSBsaWtlIHdoZW4gbWFraW5nIGEgdGFyIGJhbGwuCi1pbnB1dF9iYXNlPWBlY2hvICRpbnB1dCB8IHNlZCAtZSAnc3wuKi98fCdgCi1pZiB0ZXN0IC1mICRpbnB1dF9iYXNlICYmIGNtcCAkaW5wdXRfYmFzZSAkaW5wdXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGlucHV0PSRpbnB1dF9iYXNlCi1maQotCi1wYWlybGlzdD0KLXdoaWxlIHRlc3QgIiQjIiAtbmUgMDsgZG8KLSAgIGlmIHRlc3QgIiQxIiA9ICItLSI7IHRoZW4KLSAgICAgIHNoaWZ0Ci0gICAgICBicmVhawotICAgZmkKLSAgIHBhaXJsaXN0PSIkcGFpcmxpc3QgJDEiCi0gICBzaGlmdAotZG9uZQotCi0jIEZJWE1FOiBhZGQgaG9zdG5hbWUgaGVyZSBmb3IgcGFyYWxsZWwgbWFrZXMgdGhhdCBydW4gY29tbWFuZHMgb24KLSMgb3RoZXIgbWFjaGluZXMuICBCdXQgdGhhdCBtaWdodCB0YWtlIHVzIG92ZXIgdGhlIDE0LWNoYXIgbGltaXQuCi1kaXJuYW1lPXlsd3JhcCQkCi10cmFwICJjZCBgcHdkYDsgcm0gLXJmICRkaXJuYW1lID4gL2Rldi9udWxsIDI+JjEiIDEgMiAzIDE1Ci1ta2RpciAkZGlybmFtZSB8fCBleGl0IDEKLQotY2QgJGRpcm5hbWUKLWNhc2UgIiRpbnB1dCIgaW4KLSAvKiB8IFtBLVphLXpdOlxcKikKLSAgICAjIEFic29sdXRlIHBhdGg7IGRvIG5vdGhpbmcuCi0gICAgOzsKLSAqKQotICAgICMgTWFrZSBhIHN5bWJvbGljIGxpbmssIGhhcmQgbGluayBvciBoYXJkY29weS4KLSAgICBsbiAtcyAuLi8iJGlucHV0IiAuID4gL2Rldi9udWxsIDI+JjEgfHwgbG4gLi4vIiRpbnB1dCIgLiA+IC9kZXYvbnVsbCAyPiYxIHx8IGNwIC4uLyIkaW5wdXQiIC4KLSAgICA7OwotZXNhYwotJHByb2cgJHsxKyIkQCJ9ICIkaW5wdXQiCi1zdGF0dXM9JD8KLQotaWYgdGVzdCAkc3RhdHVzIC1lcSAwOyB0aGVuCi0gICBzZXQgWCAkcGFpcmxpc3QKLSAgIHNoaWZ0Ci0gICBmaXJzdD15ZXMKLSAgIHdoaWxlIHRlc3QgIiQjIiAtbmUgMDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiQxIjsgdGhlbgotICAgICAgICAgIyBJZiAkMiBpcyBhbiBhYnNvbHV0ZSBwYXRoIG5hbWUsIHRoZW4ganVzdCB1c2UgdGhhdCwKLSAgICAgICAgICMgb3RoZXJ3aXNlIHByZXBlbmQgYC4uLycuCi0gICAgICAgICBjYXNlICIkMiIgaW4KLQkgICAvKiB8IFtBLVphLXpdOlxcKikgdGFyZ2V0PSIkMiI7OwotCSAgICopIHRhcmdldD0iLi4vJDIiOzsKLQkgZXNhYwotCSBtdiAiJDEiICIkdGFyZ2V0IiB8fCBzdGF0dXM9JD8KLSAgICAgIGVsc2UKLQkgIyBBIG1pc3NpbmcgZmlsZSBpcyBvbmx5IGFuIGVycm9yIGZvciB0aGUgZmlyc3QgZmlsZS4gIFRoaXMKLQkgIyBpcyBhIGJsYXRhbnQgaGFjayB0byBsZXQgdXMgc3VwcG9ydCB1c2luZyAieWFjYyAtZCIuICBJZiAtZAotCSAjIGlzIG5vdCBzcGVjaWZpZWQsIHdlIGRvbid0IHdhbnQgYW4gZXJyb3Igd2hlbiB0aGUgaGVhZGVyCi0JICMgZmlsZSBpcyAibWlzc2luZyIuCi0JIGlmIHRlc3QgJGZpcnN0ID0geWVzOyB0aGVuCi0JICAgIHN0YXR1cz0xCi0JIGZpCi0gICAgICBmaQotICAgICAgc2hpZnQKLSAgICAgIHNoaWZ0Ci0gICAgICBmaXJzdD1ubwotICAgZG9uZQotZWxzZQotICAgc3RhdHVzPSQ/Ci1maQotCi0jIFJlbW92ZSB0aGUgZGlyZWN0b3J5LgotY2QgLi4KLXJtIC1yZiAkZGlybmFtZQotCi1leGl0ICRzdGF0dXMK